diff --git a/.env b/.env index 0524ea640..7aaf0ddfb 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ API_ID=1025907 API_HASH=452b0359b988148995f22ff0f4229750 VERSION=1.7.0 -VERSION_FULL=1.7.0 (288) -BUILD=288 +VERSION_FULL=1.7.0 (289) +BUILD=289 diff --git a/public/104.91dd6279f1f693880508.chunk.js.map b/public/104.91dd6279f1f693880508.chunk.js.map deleted file mode 100644 index 88deaa0be..000000000 --- a/public/104.91dd6279f1f693880508.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"104.91dd6279f1f693880508.chunk.js","mappings":"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","sources":["webpack://tweb/./src/lang.ts"],"sourcesContent":["const lang = {\n 'Animations': 'Animations',\n 'AttachAlbum': 'Album',\n 'Appearance.Color.Hex': 'HEX',\n 'Appearance.Color.RGB': 'RGB',\n 'BlockModal.Search.Placeholder': 'Block user...',\n 'DarkMode': 'Dark Mode',\n 'FilterIncludeExcludeInfo': 'Choose chats and types of chats that will\\nappear and never appear in this folder.',\n 'FilterMenuDelete': 'Delete Folder',\n 'FilterHeaderEdit': 'Edit Folder',\n 'FilterAllGroups': 'All Groups',\n 'FilterAllContacts': 'All Contacts',\n 'FilterAllNonContacts': 'All Non-Contacts',\n 'FilterAllChannels': 'All Channels',\n 'FilterAllBots': 'All Bots',\n 'EditContact.OriginalName': 'original name',\n 'EditProfile.FirstNameLabel': 'Name',\n 'EditProfile.BioLabel': 'Bio (optional)',\n 'EditProfile.Username.Label': 'Username (optional)',\n 'EditProfile.Username.Available': 'Username is available',\n 'EditProfile.Username.Taken': 'Username is already taken',\n 'EditProfile.Username.Invalid': 'Username is invalid',\n 'ExceptionModal.Search.Placeholder': 'Add exception...',\n 'Chat.Menu.SelectMessages': 'Select Messages',\n 'Chat.Menu.ClearSelection': 'Clear Selection',\n 'Chat.Menu.Hint': 'To **edit** or **reply**, close this menu.\\nThen tap next to a message.',\n 'Chat.Input.UnpinAll': 'Unpin All Messages',\n 'Chat.Input.Attach.PhotoOrVideo': 'Photo or Video',\n 'Chat.Input.Attach.Document': 'Document',\n 'Chat.Subscribe': 'SUBSCRIBE',\n 'Chat.Selection.LimitToast': 'Max selection count reached.',\n 'Chat.Search.MessagesFound': {\n 'one_value': '%d message found',\n 'other_value': '%d messages found'\n },\n 'Chat.Search.NoMessagesFound': 'No messages found',\n 'Chat.Search.PrivateSearch': 'Private Search',\n 'Chat.Service.TopicEdited.Mixed': '%1$@ changed the topic name and icon to %2$@',\n 'Chat.Service.TopicEdited.You.Mixed': 'You changed the topic name and icon to %2$@',\n 'Chat.Service.TopicEdited.Mixed.IconRemoved': '%1$@ changed the topic name to \"%1$@\" and removed icon',\n 'Chat.Service.TopicEdited.You.Mixed.IconRemoved': 'You changed the topic name to \"%1$@\" and removed icon',\n 'ChatList.Main.EmptyPlaceholder.Title': 'Your chats will appear here',\n 'ChatList.Main.EmptyPlaceholder.Subtitle': 'You have %s on Telegram',\n 'ChatList.Main.EmptyPlaceholder.SubtitleNoContacts': 'Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts',\n // \"ChatList.Menu.Archived\": \"Archived\",\n 'ChatList.Menu.SwitchTo.Webogram': 'Switch to Old Version',\n 'ChatList.Menu.SwitchTo.Z': 'Switch to Z version',\n 'ChatMigration.From': 'Migrated from %s',\n 'ChatMigration.To': 'Migrated to %s',\n 'ConnectionStatus.ForceReconnect': 'force reconnect',\n 'ConnectionStatus.ReconnectIn': 'Reconnect in %ds, %s',\n 'ConnectionStatus.Reconnect': 'reconnect',\n 'ConnectionStatus.Reconnecting': 'Reconnecting...',\n 'ConnectionStatus.TimedOut': 'Request timed out, %s',\n 'ConnectionStatus.Waiting': 'Waiting for network...',\n 'Contacts.Count': {\n 'one_value': '%d contact',\n 'other_value': '%d contacts'\n },\n 'Deactivated.Title': 'Too many tabs...',\n 'Deactivated.Subtitle': 'Telegram supports only one active tab with the app.\\nClick anywhere to continue using this tab.',\n 'Deactivated.Version.Title': 'WebK has updated...',\n 'Deactivated.Version.Subtitle': 'Another tab is running a newer version of Telegram.\\nClick anywhere to reload this tab.',\n // \"Drafts\": {\n // \"one_value\": \"%d draft\",\n // \"other_value\": \"%d drafts\",\n // },\n 'General.Keyboard': 'Keyboard',\n 'General.SendShortcut.Enter': 'Send by Enter',\n 'General.SendShortcut.CtrlEnter': 'Send by %s + Enter',\n 'General.SendShortcut.NewLine.ShiftEnter': 'New line by Shift + Enter',\n 'General.SendShortcut.NewLine.Enter': 'New line by Enter',\n 'General.TimeFormat': 'Time Format',\n 'General.TimeFormat.h12': '12-hour',\n 'General.TimeFormat.h23': '24-hour',\n 'ChatBackground.UploadWallpaper': 'Upload Wallpaper',\n 'ChatBackground.Blur': 'Blur Wallpaper Image',\n 'Notifications.Sound': 'Notification Sound',\n 'NewPrivateChat': 'New Private Chat',\n 'NewPoll.OptionLabel': 'Option %d',\n 'Message.Context.Selection.Copy': 'Copy selected',\n 'Message.Context.Selection.Clear': 'Clear selection',\n 'Message.Context.Selection.Delete': 'Delete selected',\n 'Message.Context.Selection.Forward': 'Forward selected',\n 'Message.Context.Selection.SendNow': 'Send Now selected',\n 'Message.Unsupported.Desktop': '__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__',\n 'Message.Unsupported.Mobile': '__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__',\n 'Checkbox.Enabled': 'Enabled',\n 'Checkbox.Disabled': 'Disabled',\n 'Error.PreviewSender.CaptionTooLong': 'Caption is too long.',\n 'PreviewSender.GroupItems': 'Group items',\n 'PreviewSender.SendAlbum': {\n 'one_value': 'Send Album',\n 'other_value': 'Send %d Albums'\n },\n 'Presence.YourChat': 'chat with yourself',\n 'Privacy.Devices': {\n 'one_value': '%1$d device',\n 'other_value': '%1$d devices'\n },\n 'Privacy.Websites': {\n 'one_value': '%1$d website',\n 'other_value': '%1$d websites'\n },\n 'Privacy.SensitiveContent': 'Sensitive Content',\n 'PrivacyModal.Search.Placeholder': 'Add Users or Groups...',\n 'Permissions.NoExceptions': 'No exceptions',\n 'Permissions.ExceptionsCount': {\n 'one_value': '%d exception',\n 'other_value': '%d exceptions'\n },\n 'Link.Available': 'Link is available',\n 'Link.Taken': 'Link is already taken',\n 'Link.Invalid': 'Link is invalid',\n 'StickersTab.SearchPlaceholder': 'Search Stickers',\n 'ForwardedFrom': 'Forwarded from %s',\n 'Popup.Avatar.Title': 'Drag to Reposition',\n 'Popup.Unpin.AllTitle': 'Unpin all messages',\n 'Popup.Unpin.HideTitle': 'Hide pinned messages',\n 'Popup.Unpin.HideDescription': 'Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.',\n 'Popup.Unpin.Hide': 'Hide',\n 'TwoStepAuth.EmailCodeChangeEmail': 'Change Email',\n 'MarkupTooltip.LinkPlaceholder': 'Enter URL...',\n 'MediaViewer.Context.Download': 'Download',\n 'Profile': 'Profile',\n 'Saved': 'Saved',\n 'Deleted': 'Deleted',\n 'ReportBug': 'Report Bug',\n 'Notifications.Count': {\n 'one_value': '%d notification',\n 'other_value': '%d notifications'\n },\n 'Notifications.Forwarded': {\n 'one_value': 'Forwarded %d message',\n 'other_value': 'Forwarded %d messages'\n },\n 'Notifications.New': 'New notification',\n 'PushNotification.Action.Mute1d': 'Mute background alerts for 1 day',\n 'PushNotification.Action.Settings': 'Background alerts settings',\n 'PushNotification.Action.Mute1d.Mobile': 'Mute for 24H',\n 'PushNotification.Action.Settings.Mobile': 'Alerts settings',\n 'PushNotification.Message.NoPreview': 'You have a new message',\n 'LogOut.Description': 'Are you sure you want to log out?\\n\\nNote that you can seamlessly use Telegram on all your devices at once.',\n // \"PushNotification.Action.Mute1d.Success\": \"Notification settings were successfully saved.\",\n // it is from iOS\n 'VoiceChat.DiscussionGroup': 'discussion group',\n 'PaymentInfo.CVV': 'CVV Code',\n 'PaymentInfo.Card.Title': 'Enter your card information',\n 'PaymentInfo.Billing.Title': 'Enter your billing address',\n 'PaymentInfo.Done': 'PROCEED TO CHECKOUT',\n 'PaymentCard.Error.Invalid': 'Invalid card number',\n 'PaymentCard.Error.Incomplete': 'Incomplete card number',\n 'LimitReached.Ok': 'OK, GOT IT',\n 'Username.Purchase': '**This username is already taken.** However, it is currently available for purchase. [Learn more…]()',\n 'Video.Unsupported.Desktop': '__Unfortunately, this video can\\'t be played on Telegram Web. Try opening it with our [desktop app](https://getdesktop.telegram.org/) instead.__',\n 'Video.Unsupported.Mobile': '__Unfortunately, this video can\\'t be played on Telegram Web. Try opening it with our [mobile app](https://telegram.org/dl/) instead.__',\n\n // * android\n 'AccDescrEditing': 'Editing',\n 'ActionCreateChannel': 'Channel created',\n 'ActionCreateGroup': 'un1 created the group',\n 'ActionChangedTitle': 'un1 changed the group name to un2',\n 'ActionRemovedPhoto': 'un1 removed the group photo',\n 'ActionChangedPhoto': 'un1 changed the group photo',\n 'ActionChangedVideo': 'un1 changed the group video',\n 'ActionAddUser': 'un1 added un2',\n 'ActionAddUserSelf': 'un1 returned to the group',\n 'ActionAddUserSelfYou': 'You returned to the group',\n 'ActionAddUserSelfMega': 'un1 joined the group',\n 'ActionLeftUser': 'un1 left the group',\n 'ActionKickUser': 'un1 removed un2',\n 'ActionInviteUser': 'un1 joined the group via invite link',\n 'ActionPinnedNoText': 'un1 pinned a message',\n 'ActionMigrateFromGroup': 'This group was upgraded to a supergroup',\n 'ActionYouScored': 'You scored %1$s',\n 'ActionUserScored': 'un1 scored %1$s',\n 'ActionYouScoredInGame': 'You scored %1$s in un2',\n 'ActionUserScoredInGame': 'un1 scored %1$s in un2',\n 'AndOther': {\n 'one_value': 'and %1$d other',\n 'other_value': 'and %1$d others'\n },\n 'AttachPhoto': 'Photo',\n 'AttachVideo': 'Video',\n 'AttachGif': 'GIF',\n 'AttachLocation': 'Location',\n 'AttachLiveLocation': 'Live Location',\n 'AttachContact': 'Contact',\n // \"AttachDocument\": \"File\",\n 'AttachSticker': 'Sticker',\n 'AttachAudio': 'Voice message',\n 'AttachRound': 'Video message',\n 'AttachGame': 'Game',\n 'Bot': 'bot',\n // \"ChannelJoined\": \"You joined this channel\",\n 'ChannelMegaJoined': 'You joined this group',\n 'EnterChannelName': 'Channel name',\n 'DescriptionOptionalPlaceholder': 'Description (optional)',\n 'DescriptionPlaceholder': 'Description',\n 'DiscussionStarted': 'Discussion started',\n 'Draft': 'Draft',\n 'FilterAlwaysShow': 'Include Chats',\n 'FilterNeverShow': 'Exclude Chats',\n 'FilterInclude': 'Included Chats',\n 'FilterExclude': 'Excluded Chats',\n 'FilterChatTypes': 'Chat types',\n 'FilterChats': 'Chats',\n 'FilterNew': 'New Folder',\n 'Filters': 'Folders',\n 'FilterRecommended': 'Recommended Folders',\n 'FilterShowMoreChats': {\n 'one_value': 'Show %1$d More Chat',\n 'other_value': 'Show %1$d More Chats'\n },\n 'ForwardedMessageCount': {\n 'one_value': 'Forwarded message',\n 'other_value': '%1$d forwarded messages'\n },\n 'FromYou': 'You',\n 'Add': 'Add',\n 'Chats': {\n 'one_value': '%1$d chat',\n 'other_value': '%1$d chats'\n },\n 'Channels': {\n 'one_value': '%1$d channel',\n 'other_value': '%1$d channels'\n },\n 'Comments': {\n 'one_value': '%1$d Comment',\n 'other_value': '%1$d Comments'\n },\n 'Groups': {\n 'one_value': '%1$d group',\n 'other_value': '%1$d groups'\n },\n 'Users': {\n 'one_value': '%1$d user',\n 'other_value': '%1$d users'\n },\n 'Members': {\n 'one_value': '%1$d member',\n 'other_value': '%1$d members'\n },\n 'messages': {\n 'one_value': '%1$d message',\n 'other_value': '%1$d messages'\n },\n 'UsernameHelpLink': 'This link opens a chat with you:\\n%1$s',\n 'NewChannel': 'New Channel',\n 'NewGroup': 'New Group',\n 'Contacts': 'Contacts',\n 'SavedMessages': 'Saved Messages',\n 'Settings': 'Settings',\n 'SettingsHelp': 'Help',\n 'General': 'General',\n 'TextSize': 'Message Text Size',\n 'ChatBackground': 'Chat Background',\n 'EnableAnimations': 'Enable Animations',\n 'AutoDownloadMedia': 'Auto-Download Media',\n 'AutodownloadContacts': 'Contacts',\n 'AutodownloadPrivateChats': 'Private Chats',\n 'AutodownloadGroupChats': 'Group Chats',\n 'AutodownloadChannels': 'Channels',\n 'AutoplayGIF': 'GIFs',\n 'AutoplayVideo': 'Videos',\n 'NotificationsForGroups': 'Notifications for groups',\n 'NotificationsForPrivateChats': 'Notifications for private chats',\n 'NotificationsForChannels': 'Notifications for channels',\n 'NotificationsPrivateChats': 'Private Chats',\n 'NotificationsGroups': 'Groups',\n 'NotificationsChannels': 'Channels',\n 'NotificationsOther': 'Other',\n 'MarkAsUnread': 'Mark as unread',\n 'MarkAsRead': 'Mark as read',\n 'ContactJoined': 'Contact joined Telegram',\n 'Loading': 'Loading...',\n 'Unblock': 'Unblock',\n 'BlockedUsers': 'Blocked Users',\n 'BlockedUsersInfo': 'Blocked users will not be able to contact you and will not see your Last Seen time.',\n 'BlockedEmpty': 'None',\n 'TwoStepVerification': 'Two-Step Verification',\n 'TwoStepVerificationTitle': 'Two-Step Verification',\n 'PinnedMessage': 'Pinned Message',\n 'PinnedMessagesCount': {\n 'one_value': 'Pinned Message',\n 'other_value': '%1$d Pinned Messages'\n },\n // \"PreviousPinnedMessage\": \"Previous Message\",\n 'PrivacyExceptions': 'Exceptions',\n 'PrivacyLastSeen': 'Last Seen & Online',\n 'PrivacySettings': 'Privacy and Security',\n 'PrivacyTitle': 'Privacy',\n 'PrivacyPhone': 'Phone Number',\n 'PrivacyPhoneTitle': 'Who can see my phone number?',\n 'PrivacyPhoneTitle2': 'Who can find me by my number?',\n 'PrivacyPhoneInfo': 'Users who have your number saved in their contacts will also see it on Telegram.',\n 'PrivacyPhoneInfo3': 'Users who add your number to their contacts will see it on Telegram only if they are your contacts.',\n 'PrivacyProfilePhoto': 'Profile Photos',\n 'PrivacyProfilePhotoTitle': 'Who can see my profile photos & videos?',\n 'PrivacyP2PHeader': 'Peer-to-Peer',\n 'PrivacyForwardsTitle': 'Who can add a link to my account when forwarding my messages?',\n 'Reminders': 'Reminders',\n 'ScheduledMessages': 'Scheduled Messages',\n 'LastSeenTitle': 'Who can see your Last Seen time?',\n 'SessionsTitle': 'Active Sessions',\n 'CurrentSession': 'This device',\n 'TerminateAllSessions': 'Terminate All Other Sessions',\n 'TerminateSessionText': 'Are you sure you want to terminate this session?',\n 'OtherSessions': 'Active sessions',\n 'AreYouSureDeleteSingleMessage': 'Are you sure you want to delete this message?',\n 'AreYouSureDeleteFewMessages': 'Are you sure you want to delete these messages?',\n 'AreYouSureDeleteSingleMessageMega': 'Are you sure you want to delete this message for everyone?',\n 'AreYouSureDeleteFewMessagesMega': 'Are you sure you want to delete these messages for everyone?',\n 'AreYouSureDeleteAndExitName': 'Are you sure you want to delete and leave the group **%1$s**?',\n 'AreYouSureDeleteThisChatSavedMessages': 'Are you sure you want to delete **Saved Messages**?',\n 'AreYouSureDeleteThisChatWithUser': 'Are you sure you want to delete the chat with **%1$s**?',\n 'AreYouSureSessionTitle': 'Terminate session',\n 'AreYouSureSessionsTitle': 'Terminate sessions',\n 'AreYouSureSessions': 'Are you sure you want to terminate all other sessions?',\n 'Terminate': 'Terminate',\n 'WhoCanCallMe': 'Who can call me?',\n 'WhoCanAddMe': 'Who can add me to group chats?',\n 'ArchivedChats': 'Archived Chats',\n 'Cancel': 'Cancel',\n 'HistoryCleared': 'History was cleared',\n 'Archive': 'Archive',\n 'Unarchive': 'Unarchive',\n 'Delete': 'Delete',\n 'Reply': 'Reply',\n 'Edit': 'Edit',\n 'Forward': 'Forward',\n 'CopyLink': 'Copy Link',\n 'Copy': 'Copy',\n 'Search': 'Search',\n 'LinkCopied': 'Link copied to clipboard',\n 'LinkCopiedPrivateInfo': 'This link will only work for members of this chat.',\n 'GroupAddMembers': 'Add Members',\n 'SendMessageTo': 'Add people...',\n // \"SelectChat\": \"Select Chat\",\n 'JumpToDate': 'Jump to Date',\n 'Caption': 'Caption',\n 'Message': 'Message',\n 'Poll': 'Poll',\n 'SharedFilesTab2': 'Files',\n 'SharedMediaTab2': 'Media',\n // \"SharedMediaTabFull2\": \"Shared Media\",\n // \"SharedGroupsTab2\": \"Groups\",\n 'SharedLinksTab2': 'Links',\n 'SharedMusicTab2': 'Music',\n 'SharedVoiceTab2': 'Voice',\n // \"SharedGIFsTab2\": \"GIFs\",\n 'NewPoll': 'New Poll',\n 'PollOptions': 'Poll options',\n 'AskAQuestion': 'Ask a Question',\n 'AddAnExplanationInfo': 'Users will see this text after choosing the wrong answer, good for educational purposes.',\n 'AccDescrQuizExplanation': 'Explanation',\n 'PhoneCopied': 'Phone copied to clipboard',\n 'UsernameCopied': 'Username copied to clipboard.',\n // \"HashtagCopied\": \"Hashtag copied to clipboard.\",\n 'BioCopied': 'Bio copied to clipboard.',\n 'UserBio': 'Bio',\n 'Username': 'Username',\n 'UsernameAlso': 'also %1$s',\n 'UsernameHelp': 'You can choose a username on **Telegram**. If you do, people will be able to find you by this username and contact you without needing your phone number.\\n\\nYou can use **a–z**, **0–9** and underscores. Minimum length is **5** characters.',\n 'Phone': 'Phone',\n 'Notifications': 'Notifications',\n 'AreYouSureDeleteContact': 'Are you sure you want to delete this contact?',\n 'AreYouSureDeleteAndExit': 'Are you sure you want to delete and leave the group?',\n 'AreYouSureDeleteAndExitChannel': 'Do you want to delete and leave the channel?',\n 'DeleteContact': 'Delete contact',\n 'GroupType': 'Group Type',\n 'ChannelType': 'Channel Type',\n 'TypePrivate': 'Private',\n 'TypePublic': 'Public',\n 'TypePrivateGroup': 'Private',\n 'TypePublicGroup': 'Public',\n 'GroupMembers': 'Members',\n 'DeleteMega': 'Delete Group',\n 'DeleteMegaMenu': 'Delete group',\n 'DeleteAndExitButton': 'Delete and Leave Group',\n 'ChannelDelete': 'Delete Channel',\n 'ChannelDeleteMenu': 'Delete channel',\n 'ChannelPermissions': 'Permissions',\n 'ChannelPermissionsHeader': 'What can members of this group do?',\n 'ChannelAddException': 'Add Exception',\n 'ChannelBlockedUsers': 'Removed users',\n 'NoBlockedUsers': 'No removed users',\n 'UserRestrictions': 'User Permissions',\n 'UserRestrictionsDisabled': 'This option is disabled for all members in Group Permissions',\n 'UserRestrictionsCanDo': 'What can this user do?',\n 'UserRestrictionsRead': 'Read Messages',\n 'UserRestrictionsSend': 'Send Messages',\n 'UserRestrictionsSendMedia': 'Send Media',\n 'UserRestrictionsSendPolls': 'Send Polls',\n 'UserRestrictionsSendStickers': 'Send Stickers and GIFs',\n 'UserRestrictionsEmbedLinks': 'Embed Links',\n 'UserRestrictionsChangeInfo': 'Change Chat Info',\n 'UserRestrictionsPinMessages': 'Pin Messages',\n 'UserRestrictionsInviteUsers': 'Add Users',\n // \"UserRestrictionsNoRead\": \"can't read\",\n 'UserRestrictionsNoSend': 'can\\'t send messages',\n 'UserRestrictionsNoSendMedia': 'no media',\n 'UserRestrictionsNoSendPolls': 'no polls',\n 'UserRestrictionsNoSendStickers': 'no stickers & GIFs',\n 'UserRestrictionsNoEmbedLinks': 'no embed links',\n 'UserRestrictionsNoChangeInfo': 'can\\'t change Info',\n 'UserRestrictionsNoPinMessages': 'no pins',\n 'UserRestrictionsNoInviteUsers': 'can\\'t add users',\n 'UserRestrictionsBlock': 'Ban and remove from group',\n 'ChannelPublic': 'Public Channel',\n 'MegaPublic': 'Public Group',\n // \"MegaLocation\": \"Location-based Group\",\n 'ChannelPublicInfo': 'Public channels can be found in search, anyone can join them.',\n 'MegaPublicInfo': 'Public groups can be found in search, chat history is available to everyone and anyone can join.',\n 'ChannelPrivate': 'Private Channel',\n 'MegaPrivate': 'Private Group',\n 'ChannelPrivateInfo': 'Private channels can only be joined via an invite link.',\n 'MegaPrivateInfo': 'Private groups can only be joined if you were invited or have an invite link.',\n 'ChannelPrivateLinkHelp': 'People can join your channel by following this link. You can revoke the link any time.',\n 'MegaPrivateLinkHelp': 'People can join your group by following this link. You can revoke the link any time.',\n 'RevokeButton': 'Revoke',\n 'RevokeLink': 'Revoke Link',\n 'RevokeAlert': 'Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it.',\n 'SetUrlPlaceholder': 'Link',\n 'Subscribers': {\n 'one_value': '%1$d subscriber',\n 'other_value': '%1$d subscribers'\n },\n 'SearchGifsTitle': 'Search GIFs',\n 'PinMessageAlert': 'Pin this message in the group?',\n 'PinMessageAlertTitle': 'Pin message',\n 'PinMessageAlertChannel': 'Do you want to pin this message in this channel?',\n 'PinMessageAlertChat': 'Do you want to pin this message at the top of the chat?',\n 'UnpinMessageAlertTitle': 'Unpin message',\n 'UnpinMessageAlert': 'Do you want to unpin this message?',\n 'PinNotify': 'Notify all members',\n 'PinMessage': 'Pin',\n 'UnpinMessage': 'Unpin',\n 'PinAlsoFor': 'Also pin for %1$s',\n 'DeleteMessagesTitle': 'Delete %1$s',\n 'DeleteSingleMessagesTitle': 'Delete message',\n 'DeleteMessagesOption': 'Unsend My Messages',\n 'DeleteMessagesOptionAlso': 'Also delete for %1$s',\n 'DeleteForAll': 'Delete for all members',\n 'DeleteMessagesTextGroup': 'You can also delete the %1$s you sent from the inboxes of other group members by checking \"Unsend my messages\".',\n 'LeaveChannel': 'Leave Channel',\n 'LeaveChannelMenu': 'Leave channel',\n 'ChannelLeaveAlertWithName': 'Are you sure you want to leave **%1$s**?',\n 'LeaveMegaMenu': 'Leave group',\n 'DeleteChatUser': 'Delete chat',\n 'PleaseEnterCurrentPassword': 'Enter your password',\n 'PleaseEnterFirstPassword': 'Enter a password',\n 'PleaseReEnterPassword': 'Re-enter your password',\n 'Continue': 'Continue',\n 'YourEmailSkip': 'Skip',\n 'YourEmailSkipWarning': 'Warning',\n 'YourEmailSkipWarningText': 'No, seriously.\\n\\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it.',\n 'TurnPasswordOffQuestionTitle': 'Disable password',\n 'TurnPasswordOffQuestion': 'Are you sure you want to disable your password?',\n 'Disable': 'Disable',\n 'TwoStepVerificationSetPassword': 'Set Password',\n 'TwoStepVerificationPasswordSet': 'Password Set!',\n 'TwoStepVerificationPasswordSetInfo': 'This password will be required when you log in on a new device in addition to the code you get in the SMS.',\n 'TwoStepVerificationPasswordReturnSettings': 'Return to Settings',\n 'RecoveryEmail': 'Recovery email',\n 'RecoveryEmailTitle': 'Recovery Email',\n 'ResendCode': 'Resend code',\n 'PasswordAsHintError': 'Hint must be different from your password',\n 'AddStickersCount': 'ADD %1$s',\n 'RemoveStickersCount': 'REMOVE %1$s',\n 'Stickers': {\n 'one_value': '%1$d sticker',\n 'other_value': '%1$d stickers'\n },\n 'HidAccount': 'The account was hidden by the user',\n 'TelegramFeatures': 'Telegram Features',\n 'SetColor': 'Set a color',\n 'Open': 'Open',\n 'OpenUrlTitle': 'Open Link',\n 'OpenUrlAlert2': 'Do you want to open %1$s?',\n 'FilterNoChatsToDisplay': 'Folder is empty',\n 'FilterNoChatsToDisplayInfo': 'No chats currently belong to this folder.',\n 'SupportStatus': 'support',\n 'Lately': 'last seen recently',\n 'WithinAWeek': 'last seen within a week',\n 'WithinAMonth': 'last seen within a month',\n 'ALongTimeAgo': 'last seen a long time ago',\n 'Online': 'online',\n 'MessageScheduleSend': 'Send Now',\n 'MessageScheduleEditTime': 'Reschedule',\n 'YouLeft': 'You left this group',\n 'Recent': 'Recent',\n 'Of': '%1$d of %2$d',\n 'NoResult': 'No results',\n 'Updating': 'Updating...',\n 'Emoji': 'Emoji',\n 'AddContactTitle': 'Add Contact',\n 'HiddenName': 'Deleted Account',\n 'Seconds': {\n 'one_value': '%1$d second',\n 'other_value': '%1$d seconds'\n },\n 'Minutes': {\n 'one_value': '%1$d minute',\n 'other_value': '%1$d minutes'\n },\n 'Hours': {\n 'one_value': '%1$d hour',\n 'other_value': '%1$d hours'\n },\n 'Days': {\n 'one_value': '%1$d day',\n 'other_value': '%1$d days'\n },\n 'Weeks': {\n 'one_value': '%1$d week',\n 'other_value': '%1$d weeks'\n },\n 'Months': {\n 'one_value': '%1$d month',\n 'other_value': '%1$d months'\n },\n 'Years': {\n 'one_value': '%1$d year',\n 'other_value': '%1$d years'\n },\n 'TodayAtFormattedWithToday': 'today at %1$s',\n 'formatDateAtTime': '%1$s at %2$s',\n 'JoinByPeekChannelTitle': 'Join Channel',\n 'JoinByPeekGroupTitle': 'Join Group',\n 'YouWereKicked': 'you were removed',\n 'ViaBot': 'via',\n 'InviteExpired': 'This invite link has expired.',\n 'NoUsernameFound': 'There is no Telegram account with this username.',\n 'PrivacyDeleteCloudDrafts': 'Delete All Cloud Drafts',\n 'AreYouSureClearDraftsTitle': 'Delete cloud drafts',\n 'AreYouSureClearDrafts': 'Are you sure you want to delete all cloud drafts?',\n 'BotInfoTitle': 'What can this bot do?',\n 'ChatYourSelf': 'forward here to save',\n 'GroupEmptyTitle1': 'You have created a **group**.',\n 'GroupEmptyTitle2': 'Groups can have:',\n 'GroupDescription1': 'Up to 200,000 members',\n 'GroupDescription2': 'Persistent chat history',\n 'GroupDescription3': 'Public links such as t.me/title',\n 'GroupDescription4': 'Admins with different rights',\n 'ChatYourSelfDescription1': 'Forward messages here to save them',\n 'ChatYourSelfDescription2': 'Send media and files to store them',\n 'ChatYourSelfDescription3': 'Access this chat from any device',\n 'ChatYourSelfDescription4': 'Use search to quickly find things',\n 'ChatYourSelfTitle': 'Your cloud storage',\n 'ActionYouCreateGroup': 'You created the group',\n 'NoMessages': 'No messages here yet...',\n 'NoScheduledMessages': 'No scheduled messages here yet...',\n 'NoMessagesGreetingsDescription': 'Send a message or tap the greeting below.',\n 'InviteToGroupError': 'Sorry, you can\\'t add this user to groups because of user\\'s privacy settings.',\n 'InviteToChannelError': 'Sorry, you can\\'t add this user to channels because of user\\'s privacy settings.',\n 'AddMembersAlertTitle': 'Add %1$s',\n 'AddOneMemberAlertTitle': 'Add member',\n 'AddMembersAlertNamesText': 'Are you sure you want to add %1$s to **%2$s**?',\n 'AddMembersAlertCountText': 'Are you sure you want to add %1$s to **%2$s**?',\n 'AddMembersForwardMessages': 'Show the last 100 messages to the new members',\n 'AddOneMemberForwardMessages': 'Show the last 100 messages to **%1$s**',\n 'PinToTopLimitReached2': 'Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.',\n 'FiltersSetupPinAlert': 'Set Up Folders',\n 'AppName': 'Telegram',\n 'OK': 'OK',\n 'PinFolderLimitReached': 'Sorry, you can\\'t pin any more chats to the top.',\n 'Send': 'Send',\n 'ChannelJoin': 'JOIN',\n 'Yesterday': 'yesterday',\n 'LeaveAComment': 'Leave a comment',\n 'ViewInChat': 'View in chat',\n 'LinkNotFound': 'Unfortunately, you can\\'t access this message. You are not a member of the chat where it was posted.',\n 'Create': 'Create',\n 'ViewDiscussion': 'View discussion',\n 'MessageScheduledUntilOnline': 'Scheduled until online',\n 'ReportChat': 'Report',\n 'ReportChatSpam': 'Spam',\n // \"ReportChatFakeAccount\": \"Fake Account\",\n 'ReportChatViolence': 'Violence',\n 'ReportChatPornography': 'Pornography',\n 'ReportChatChild': 'Child Abuse',\n 'ReportChatOther': 'Other',\n 'ReportChatDescription': 'Description',\n 'ReportInfo': 'Please enter any additional details relevant to your report.',\n 'ReportSentInfo': 'Telegram moderators will review your report.\\nThank you for your cooperation!',\n 'ReportHint': 'Additional details...',\n 'ChatHistory': 'Chat history for new members',\n 'ShareContact': 'Share contact',\n 'SendMessageTitle': 'Send message',\n 'SendContactToGroupText': 'Do you want to send this contact to **%1$s**?',\n 'ChannelBroadcast': 'Broadcast',\n 'ChannelSilentBroadcast': 'Silent Broadcast',\n 'Comment': 'Comment',\n 'SendAnonymously': 'Send anonymously',\n 'DiscardVoiceMessageTitle': 'Discard Voice Message',\n 'DiscardVoiceMessageDescription': 'Are you sure you want to stop recording and discard your voice message?',\n 'DiscardVoiceMessageAction': 'Discard',\n 'AddContact': 'Add to contacts',\n 'BlockUser': 'Block user',\n 'MobileHidden': 'Mobile hidden',\n 'MobileHiddenExceptionInfo': 'Phone number will be visible once %1$s adds you as a contact.',\n 'FirstName': 'First name (required)',\n 'LastName': 'Last name (optional)',\n 'AreYouSureBlockContact2': 'Are you sure you want to block **%1$s**?',\n 'UserBlocked': 'User blocked',\n 'UserUnblocked': 'User unblocked',\n 'AudioUnknownArtist': 'Unknown artist',\n 'AudioUnknownTitle': 'Unknown title',\n 'LogOut': 'Log out',\n 'OnlineCount': {\n 'one_value': '%1$d online',\n 'other_value': '%1$d online'\n },\n 'EditedMessage': 'edited',\n 'GlobalSearch': 'Global search',\n 'SearchMessages': 'Messages',\n 'SearchAllChatsShort': 'Chats',\n 'ClearButton': 'Clear',\n 'FilterAllChats': 'All Chats',\n 'FilterAllChatsShort': 'All',\n 'Call': 'Call',\n 'VideoCall': 'Video Call',\n 'CallMessageOutgoing': 'Outgoing Call',\n 'CallMessageIncoming': 'Incoming Call',\n 'CallMessageVideoOutgoing': 'Outgoing Video Call',\n 'CallMessageVideoIncoming': 'Incoming Video Call',\n 'VoipExchangingKeys': 'Exchanging encryption keys',\n 'VoipUnmute': 'Unmute',\n 'SavingContentTitle': 'Saving content',\n 'RestrictSavingContent': 'Restrict saving content',\n 'RestrictSavingContentInfoGroup': 'Members won\\'t be able to copy, save and forward content from this group.',\n 'RestrictSavingContentInfoChannel': 'Subscribers won\\'t be able to copy, save and forward content from this channel.',\n 'ClearOtherSessionsHelp': 'Logs out all devices except for this one.',\n 'SessionsListInfo': 'The official Telegram app is available for Android, iPhone, iPad, Windows, macOS and Linux.',\n 'SponsoredMessage': 'sponsored',\n 'OpenChannelPost': 'VIEW POST',\n 'FilterNameHint': 'Folder name',\n 'BotStart': 'START',\n 'BotUnblock': 'RESTART',\n 'BotStop': 'Stop bot',\n 'BotRestart': 'Restart bot',\n 'ShareYouPhoneNumberTitle': 'Share your phone number?',\n 'AreYouSureShareMyContactInfoBot': 'The bot will know your phone number. This can be useful for integration with other services.',\n 'DistanceUnitsTitle': 'Distance units',\n 'DistanceUnitsKilometers': 'Kilometers',\n 'DistanceUnitsMiles': 'Miles',\n 'PeopleNearby': 'People Nearby',\n 'MakeMyselfVisible': 'Make Myself Visible',\n 'MakeMyselfVisibleTitle': 'Show Your Profile?',\n 'MakeMyselfVisibleInfo': 'Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\\n\\nYour phone number will remain hidden.',\n 'StopShowingMe': 'Stop Showing Me',\n 'PeopleNearbyInfo2': 'Exchange contact info with people nearby and find new friends.',\n 'NearbyCreateGroup': 'Create a Local group',\n 'AwayTo': '%1$s away',\n 'MessagePreview': 'Message Preview',\n 'KMetersAway2': '%1$s km away',\n 'MetersAway2': '%1$s m away',\n 'MilesAway': '%1$s mi away',\n 'FootsAway': '%1$s ft away',\n 'PeopleNearbyHeader': 'People nearby',\n 'ChatsNearbyHeader': 'Groups nearby',\n 'ChatLocation': 'Location',\n 'RequestToJoinGroupDescription': 'This group accepts new members only after they are approved by its admins.',\n 'RequestToJoinChannelDescription': 'This channel accepts new subscribers only after they are approved by its admins.',\n 'RequestToJoinSent': 'Join request sent',\n 'RequestToJoinGroupApproved': 'Your request to join the group was approved',\n 'RequestToJoinChannelApproved': 'Your request to join the channel was approved',\n 'Update': 'UPDATE',\n 'Reactions': 'Reactions',\n 'DoubleTapSetting': 'Quick Reaction',\n 'EnableReactions': 'Enable Reactions',\n 'EnableReactionsChannelInfo': 'Allow subscribers to react to channel posts.',\n 'EnableReactionsGroupInfo': 'Allow members to react to group messages.',\n 'AvailableReactions': 'Available reactions',\n 'NobodyViewed': 'Nobody viewed',\n 'MessageSeen': {\n 'one_value': 'Seen',\n 'other_value': '%1$d Seen'\n },\n // \"Close\": \"Close\",\n 'DataSettings': 'Data and Storage',\n 'GroupsAndChannelsHelp': 'Change who can add you to groups and channels.',\n 'SessionsInfo': 'Control your sessions on other devices.',\n 'StickersBotInfo': 'Artists are welcome to add their own sticker sets using our @stickers bot.',\n 'AutomaticMediaDownload': 'Automatic media download',\n 'AutoDownloadPhotos': 'Photos',\n 'AutoDownloadVideos': 'Videos',\n 'AutoDownloadFiles': 'Files',\n 'AutoDownloadOnAllChats': 'On in all chats',\n 'AutoDownloadUpToOnAllChats': 'Up to %1$s in all chats',\n 'AutoDownloadOff': 'Off',\n 'AutoDownloadOnUpToFor': 'Up to %1$s for %2$s',\n 'AutoDownloadOnFor': 'On for %1$s',\n 'AutoDownloadContacts': 'Contacts',\n 'AutoDownloadPm': 'PM',\n 'AutoDownloadGroups': 'Groups',\n 'AutoDownloadChannels': 'Channels',\n 'AutoDownloadAudioInfo': 'Voice messages are tiny, so they\\'re always downloaded automatically.',\n 'AutoplayMedia': 'Auto-play media',\n 'AutoDownloadPhotosTitle': 'Auto-download photos',\n 'AutoDownloadVideosTitle': 'Auto-download videos and GIFs',\n 'AutoDownloadFilesTitle': 'Auto-download files and music',\n 'AutoDownloadMaxFileSize': 'Maximum file size',\n 'AutodownloadSizeLimitUpTo': 'up to %1$s',\n 'ResetAutomaticMediaDownload': 'Reset Auto-Download Settings',\n 'ResetAutomaticMediaDownloadAlertTitle': 'Reset settings',\n 'ResetAutomaticMediaDownloadAlert': 'Are you sure you want to reset auto-download settings?',\n 'Reset': 'Reset',\n 'SendMessageAsTitle': 'Send message as...',\n 'Devices': 'Devices',\n 'LanguageName': 'English',\n 'EditCantEditPermissionsPublic': 'This permission is not available in public groups.',\n 'VoipUserMicrophoneIsOff': '%s\\'s microphone is off',\n 'VoipUserCameraIsOff': '%s\\'s camera is off',\n 'PrivacyPhoneInfo4': 'This public link opens a chat with you:',\n 'ReportChatIllegalDrugs': 'Illegal Drugs',\n 'ReportChatPersonalDetails': 'Personal Details',\n 'VoipPeerIncompatible': '**%1$s**\\'s app is using an incompatible protocol. They need to update their app before you can call them.',\n 'TelegramFeaturesUrl': 'https://t.me/TelegramTips',\n 'ScamMessage': 'SCAM',\n 'FakeMessage': 'FAKE',\n 'TextCopied': 'Text copied to clipboard',\n 'PaymentInvoice': 'INVOICE',\n 'PaymentTestInvoice': 'TEST INVOICE',\n 'PaymentReceipt': 'Receipt',\n 'PaymentCheckout': 'Checkout',\n 'PaymentTransactionTotal': 'Total',\n 'PaymentTip': 'Tip',\n 'PaymentTipOptional': 'Tip (Optional)',\n 'PaymentCheckoutPay': 'PAY %1$s',\n 'PaymentCheckoutMethod': 'Payment method',\n 'PaymentCheckoutProvider': 'Payment provider',\n 'PaymentCardNumber': 'Card Number',\n 'PaymentCardSavePaymentInformation': 'Save Payment Information',\n 'PaymentCardInfo': 'Payment info',\n 'PaymentCardSavePaymentInformationInfoLine1': 'You can save your payment info for future use. It will be stored directly with the payment provider. Telegram has no access to your credit card data.',\n 'Done': 'Done',\n 'PaymentShippingMethod': 'Shipping methods',\n 'PaymentNoShippingMethod': 'Sorry, it is not possible to deliver to your address.',\n 'PaymentShippingInfo': 'Shipping Information',\n 'PaymentShippingAddress': 'Shipping address',\n 'PaymentShippingAddress1Placeholder': 'Address 1 (Street)',\n 'PaymentShippingAddress2Placeholder': 'Address 2 (Street)',\n 'PaymentShippingCityPlaceholder': 'City',\n 'PaymentShippingStatePlaceholder': 'State',\n 'PaymentShippingCountry': 'Country',\n 'PaymentShippingZipPlaceholder': 'Postcode',\n 'PaymentShippingReceiver': 'Receiver',\n 'PaymentShippingName': 'Full Name',\n 'PaymentShippingEmailPlaceholder': 'Email',\n 'PaymentCheckoutPhoneNumber': 'Phone number',\n 'PaymentCheckoutShippingMethod': 'Shipping method',\n 'PaymentShippingSave': 'Save Shipping Information',\n 'PaymentShippingSaveInfo': 'You can save your shipping info for future use.',\n 'PaymentInfoHint': 'You paid **%1$s** for **%2$s**.',\n 'PrivacyPayments': 'Payments',\n 'PrivacyPaymentsClearInfo': 'You can delete your shipping info and instruct all payment providers to remove your saved credit cards. Note that Telegram never stores your credit card data.',\n 'PrivacyPaymentsClear': 'Clear Payment and Shipping Info',\n 'PrivacyPaymentsClearAlertTitle': 'Clear payment info',\n 'PrivacyPaymentsClearAlertText': 'Are you sure you want to clear your payment and shipping info?',\n 'PrivacyPaymentsPaymentInfoCleared': 'Payment info cleared.',\n 'PrivacyPaymentsShippingInfoCleared': 'Shipping info cleared.',\n 'PrivacyPaymentsPaymentShippingCleared': 'Payment and shipping info cleared.',\n 'PrivacyClearShipping': 'Shipping info',\n 'PrivacyClearPayment': 'Payment info',\n 'Clear': 'Clear',\n 'Save': 'Save',\n 'PaymentCheckoutName': 'Name',\n 'ClearRecentStickersAlertTitle': 'Clear recent stickers',\n 'ClearRecentStickersAlertMessage': 'Do you want to clear all your recent stickers?',\n 'PremiumStickersShort': 'Premium',\n 'FavoriteStickers': 'Favorites',\n 'AddToFavorites': 'Add to Favorites',\n 'AddedToFavorites': 'Sticker added to Favorites.',\n 'RemovedFromFavorites': 'Sticker was removed from Favorites',\n 'RemovedFromRecent': 'Sticker was removed from Recent',\n 'DeleteFromFavorites': 'Delete from Favorites',\n 'DeleteFromRecent': 'Remove from Recent',\n 'NewChatsFromNonContacts': 'New chats from unknown users',\n 'ArchiveAndMute': 'Archive and Mute',\n 'ArchiveAndMuteInfo': 'Automatically archive and mute new chats, groups and channels from non-contacts.',\n 'PrivacyVoiceMessages': 'Voice Messages',\n 'PrivacyVoiceMessagesTitle': 'Who can send me voice or video messages?',\n 'PrivacyVoiceMessagesInfo': 'You can restrict who can send you voice or video messages with granular precision.',\n 'PrivacyVoiceMessagesPremiumOnly': 'Only subscribers of *Telegram Premium* can restrict receiving voice messages.',\n 'EmojiCount': {\n 'other_value': '%1$d emoji'\n },\n 'AddEmojiNotFound': 'Emoji pack not found.',\n 'MessageContainsEmojiPack': 'This message contains emoji from %s pack.',\n 'MessageContainsEmojiPacks': {\n 'other_value': 'This message contains emoji from **%d Packs**.'\n },\n 'EmojiPackCount': {\n 'one_value': '%1$d Emoji Pack',\n 'other_value': '%1$d Emoji Packs'\n },\n 'ReactionsAll': 'All',\n 'EnableSomeReactionsInfo': 'Members of the group can use only certain approved emoji as reactions to messages.',\n 'EnableAllReactionsInfo': 'Members of the group can use any emoji as reactions to messages.',\n 'DisableReactionsInfo': 'Members of the group can’t add any reactions to messages.',\n 'OnlyAllowThisReactions': 'Only allow these reactions',\n 'AllReactions': 'All reactions',\n 'SomeReactions': 'Some reactions',\n 'NoReactions': 'No reactions',\n 'LimitReached': 'Limit Reached',\n 'LimitReachedPinDialogs': 'You can\\'t pin more than %1$d chats to the top. Unpin some that are currently pinned – or subscribe to **Telegram Premium** to double the limit to **%2$d** chats.',\n 'LimitReachedPinDialogsPremium': 'Sorry, you can\\'t pin more than %1$d chats to the top. Unpin some that are currently pinned.',\n 'LimitReachedPinDialogsLocked': 'Sorry, you can\\'t pin more than %1$d chats to the top. Unpin some that are currently pinned. We are working to let you increase this limit in the future.',\n 'IncreaseLimit': 'Increase Limit',\n 'LimitFree': 'Free',\n 'LimitPremium': 'Premium',\n 'ActionTTLChanged': 'un1 set messages to auto-delete in %1$s',\n 'ActionTTLYouChanged': 'You set messages to auto-delete in %1$s',\n 'ActionTTLChannelChanged': 'Messages in this channel will be automatically deleted after %1$s',\n 'ActionTTLChannelDisabled': 'Messages in this channel will no longer be automatically deleted',\n 'ActionTTLDisabled': 'un1 disabled the auto-delete timer',\n 'ActionTTLYouDisabled': 'You disabled the auto-delete timer',\n 'UsernamesProfileHeader': 'Username order',\n 'UsernamesProfileHelp': 'Drag and drop links to change the order in which they will be displayed on your info page.',\n 'UsernamesChannelHelp': 'Drag and drop links to change the order in which they will be displayed on the channel info page.',\n 'UsernameLinkEditable': 'tap to edit',\n 'UsernameLinkActive': 'active',\n 'UsernameLinkInactive': 'not active',\n 'UsernameActivateLink': 'Activate link',\n 'UsernameDeactivateLink': 'Deactivate link',\n 'UsernameActivateLinkProfileMessage': 'Do you want to show this link on your info page?',\n 'UsernameDeactivateLinkProfileMessage': 'Do you want to hide this link from your info page?',\n 'UsernameActivateLinkChannelMessage': 'Do you want to show this link on the channel info page?',\n 'UsernameDeactivateLinkChannelMessage': 'Do you want to hide this link from the channel info page?',\n 'Hide': 'Hide',\n 'Show': 'Show',\n 'UsernameActivateErrorTitle': 'Too many active links',\n 'UsernameActivateErrorMessage': 'Sorry, you have too many active public links already. Please hide one of your active public links first.',\n 'ChannelSignMessages': 'Sign Messages',\n // 'ChannelSignMessagesInfo': 'Add names of admins to the messages they post',\n 'TopicWasCreatedAction': '%s was created',\n 'Topics': 'Topics',\n 'ForumToggleDescription': 'The group chat will be divided into topics created by admins or users.',\n 'AnonymousNumber': 'Anonymous Number',\n 'Info': 'Info',\n 'BotSettings': 'Settings',\n 'OpenMessage': 'VIEW MESSAGE',\n 'OpenGroup': 'VIEW GROUP',\n 'CloseTopic': 'Close topic',\n 'RestartTopic': 'Reopen topic',\n 'LimitReachedPinnedTopics': 'Sorry, you can\\'t pin more than %d topics to the top.',\n 'TopicProfileStatus': 'In %s',\n 'AccDescrTopic': 'Topic',\n 'DeleteTopics': {\n 'one_value': 'Delete topic',\n 'other_value': 'Delete topics'\n },\n 'DeleteSelectedTopic': 'Are you sure you want delete %s?',\n 'NewTopic': 'New Topic',\n 'CreateTopicTitle': 'Choose a topic name and icon',\n 'CreateGeneralTopicTitle': 'Choose topic name',\n 'EditTopicHide': 'Show in Topics',\n 'EditTopicHideInfo': 'If the \\'General\\' topic is hidden, group members can pull down in the topic list to view it.',\n 'OpenUrlOption1': 'Log in to %1$s as **%2$s**',\n 'OpenUrlOption2': 'Allow **%1$s** to send me messages',\n 'OtherWebSessions': 'Connected websites',\n 'WebSessionsTitle': 'Logged In with Telegram',\n 'TerminateWebSessionText': 'Are you sure you want to disconnect %1$s?',\n 'Disconnect': 'Disconnect',\n 'TerminateAllWebSessions': 'Disconnect All Websites',\n 'AreYouSureWebSessions': 'Are you sure you want to disconnect all websites where you logged in with Telegram?',\n 'ClearOtherWebSessionsHelp': 'You can log in on websites that support signing in with Telegram.',\n 'TerminateWebSessionInfo': 'Tap to disconnect from your Telegram account.',\n 'EnablePhotoSpoiler': 'Hide with spoiler',\n 'DisablePhotoSpoiler': 'Remove spoiler',\n 'LimitReachedFolders': 'You have reached the limit of **%1$d** folders. You can double the limit to **%2$d** folders by subscribing to **Telegram Premium**.',\n 'LimitReachedFoldersPremium': 'You have reached the limit of **%1$d** folders for this account.',\n 'LimitReachedFoldersLocked': 'You have reached the limit of **%1$d** folders for this account. We are working to let you increase this limit in the future.',\n\n // * macos\n 'AccountSettings.Filters': 'Chat Folders',\n 'AccountSettings.Notifications': 'Notifications and Sounds',\n 'AccountSettings.PrivacyAndSecurity': 'Privacy and Security',\n 'AccountSettings.Language': 'Language',\n 'Alert.UserDoesntExists': 'Sorry, this user doesn\\'t seem to exist.',\n 'Alert.Confirm.Discard': 'Discard',\n 'Appearance.Reset': 'Reset to Defaults',\n 'AutoDownloadSettings.Delimeter': ', ',\n 'AutoDownloadSettings.LastDelimeter': ' and ',\n 'Bio.Description': 'Any details such as age, occupation or city.\\nExample: 23 y.o. designer from San Francisco',\n 'Call.Accept': 'Accept',\n 'Call.Decline': 'Decline',\n 'Call.End': 'End',\n 'Call.Camera': 'Camera',\n 'Call.Mute': 'Mute',\n 'Call.Recall': 'Recall',\n 'Call.Close': 'Close',\n 'Call.Screen': 'Screen',\n 'Call.Confirm.Discard.Voice.Header': 'Video Chat in Progress',\n 'Call.Confirm.Discard.Voice.ToVoice.Text': 'Leave video chat in \"%1$@\" and start a new one in \"%2$@\"?',\n 'Call.Confirm.Discard.Voice.ToCall.Text': 'Leave video chat in \"%1$@\" and start a call with \"%2$@\"?',\n 'Call.Confirm.Discard.Call.Header': 'Call in Progress',\n 'Call.Confirm.Discard.Call.ToVoice.Text': 'End call with \"%1$@\" and start a video chat in \"%2$@\"?',\n 'Call.Confirm.Discard.Call.ToCall.Text': 'End call with \"%1$@\" and start a video chat in \"%2$@\"?',\n 'Call.PrivacyErrorMessage': 'Sorry, you cannot call %@ because of their privacy settings.',\n 'Call.StatusRequesting': 'Contacting...',\n 'Call.StatusRinging': 'Ringing...',\n 'Call.StatusConnecting': 'Connecting...',\n 'Call.StatusEnded': 'Call Ended',\n 'Call.StatusFailed': 'Call Failed',\n 'Call.StatusBusy': 'Busy',\n 'Call.StatusCalling': 'is calling you...',\n 'Contacts.PhoneNumber.NotRegistred': 'The person with this phone number is not registered on Telegram yet.',\n 'Channel.UsernameAboutChannel': 'People can share this link with others and can find your channel using Telegram search.',\n 'Channel.UsernameAboutGroup': 'People can share this link with others and find your group using Telegram search.',\n 'Chat.Accessory.Forward': {\n 'one_value': 'Forward Message',\n 'other_value': 'Forward %d Messages'\n },\n 'Chat.Accessory.Forward.You': 'You',\n 'Chat.Accessory.Forward.From': 'From',\n 'Chat.Accessory.Hidden': {\n 'one_value': 'Forward Message (sender\\'s name hidden)',\n 'other_value': 'Forward %d Messages (senders\\' names hidden)'\n },\n 'Chat.Alert.Forward.Action.Another': 'Forward to Another Chat',\n 'Chat.Alert.Forward.Action.Hide1': {\n 'one_value': 'Hide Sender\\'s Name',\n 'other_value': 'Hide Senders\\' Names'\n },\n 'Chat.Alert.Forward.Action.Show1': {\n 'one_value': 'Show Sender\\'s Name',\n 'other_value': 'Show Senders\\' Names'\n },\n 'Chat.Alert.Forward.Action.ShowCaption': {\n 'one_value': 'Show Caption',\n 'other_value': 'Show Captions'\n },\n 'Chat.Alert.Forward.Action.HideCaption': {\n 'one_value': 'Hide Caption',\n 'other_value': 'Hide Captions'\n },\n 'Chat.CopySelectedText': 'Copy Selected Text',\n 'Chat.Confirm.Unpin': 'Would you like to unpin this message?',\n 'Chat.Context.Reacted': '%1$@/%2$@ Reacted',\n 'Chat.Context.ReactedFast': {\n 'other_value': '%d Reacted'\n },\n 'Chat.Date.ScheduledFor': 'Scheduled for %@',\n 'Chat.Date.ScheduledForToday': 'Scheduled for today',\n 'Chat.DropTitle': 'Drop files here to send them',\n 'Chat.DropQuickDesc': 'in a quick way',\n 'Chat.DropAsFilesDesc': 'without compression',\n 'Chat.Edit.Cancel.Text': 'Are you sure you want to discard all changes?',\n 'Chat.Input.ReplyToAnswer': 'Reply to message in topics',\n 'Chat.SendVoice.PrivacyError': '%@ doesn\\'t accept voice and video messages',\n 'Chat.Service.Call.Cancelled': 'Cancelled',\n 'Chat.Service.Call.Missed': 'Missed',\n 'Chat.Service.PeerJoinedTelegram': '%@ joined Telegram',\n 'Chat.Service.Channel.UpdatedTitle': 'Channel renamed to \"%@\"',\n 'Chat.Service.Channel.UpdatedPhoto': 'Channel photo updated',\n 'Chat.Service.Channel.RemovedPhoto': 'Channel photo removed',\n 'Chat.Service.Channel.UpdatedVideo': 'Channel video updated',\n 'Chat.Service.BotPermissionAllowed': 'You allowed this bot to message you when you logged in on %@',\n 'Chat.Service.Group.UpdatedPinnedMessage': '%@ pinned \"%@\"',\n 'Chat.Service.Group.TopicEdited.Icon': '%1$@ changed topic icon to %2$@',\n 'Chat.Service.Group.TopicEdited.Icon.Removed': '%1$@ removed icon',\n 'Chat.Service.Group.TopicEdited.Title': '%1$@ changed topic name to \"%2$@\"',\n 'Chat.Service.Group.TopicEdited.Paused': '%1$@ closed topic',\n 'Chat.Service.Group.TopicEdited.Resumed': '%1$@ restarted topic',\n 'Chat.Service.Group.TopicEdited.You.Icon': 'You changed topic icon to %1$@',\n 'Chat.Service.Group.TopicEdited.You.Icon.Removed': 'You removed icon',\n 'Chat.Service.Group.TopicEdited.You.Title': 'You changed topic name to \"%1$@\"',\n 'Chat.Service.Group.TopicEdited.You.Paused': 'You closed topic',\n 'Chat.Service.Group.TopicEdited.You.Resumed': 'You restarted topic',\n 'Chat.Service.Group.TopicEdited.You.Hided': 'You hid the general topic',\n 'Chat.Service.Group.TopicEdited.You.Unhided': 'You unhid the general topic',\n 'Chat.Service.Group.TopicEdited.Hided': '%1$@ hid the general topic',\n 'Chat.Service.Group.TopicEdited.Unhided': '%1$@ unhid the general topic',\n 'Chat.Service.PaymentSent1': 'You have successfully transferred **%1$@** to **%2$@** for **%3$@**',\n 'Chat.Service.PaymentSent1NoTitle': 'You have successfully transferred **%1$@** to **%2$@**',\n 'Chat.Service.PaymentSentRecurringInit': 'You successfully transferred **%1$@** to **%2$@** for **%3$@** and allowed future recurring payments',\n 'Chat.Service.PaymentSentRecurringInitNoTitle': 'You successfully transferred **%1$@** to **%2$@** and allowed future recurring payments',\n 'Chat.Service.PaymentSentRecurringUsed': 'You have just successfully transferred **%1$@** to **%2$@** for **%3$@** via recurrent payments',\n 'Chat.Service.PaymentSentRecurringUsedNoTitle': 'You have just successfully transferred **%1$@** to **%2$@** via recurrent payments',\n 'Chat.Service.VoiceChatStarted': '%1$@ started a [video chat](open)',\n 'Chat.Service.VoiceChatStartedYou': 'You started a [video chat](open)',\n 'Chat.Service.VoiceChatStarted.Channel': '[Live Stream](open) started',\n 'Chat.Service.VoiceChatFinished': '%1$@ ended the video chat (%2$@)',\n 'Chat.Service.VoiceChatFinishedYou': 'You ended the video chat (%@)',\n 'Chat.Service.VoiceChatFinished.Channel': 'Live Stream ended (%1$@)',\n 'Chat.Service.VoiceChatInvitation': '%1$@ invited %2$@ to the [video chat](open)',\n 'Chat.Service.VoiceChatInvitationByYou': 'You invited %1$@ to the [video chat](open)',\n 'Chat.Service.VoiceChatInvitationForYou': '%1$@ invited you to the [video chat](open)',\n 'ChatService.UserJoinedGroupByRequest': '%@ was accepted to the group',\n 'ChatService.UserJoinedChannelByRequest': '%@ joined the channel by request',\n 'ChatList.Service.VoiceChatScheduled': '%1$@ scheduled a video chat for %2$@',\n 'ChatList.Service.VoiceChatScheduledYou': 'You scheduled a video chat for %2$@',\n 'Chat.Poll.Unvote': 'Retract Vote',\n 'Chat.Poll.Stop': 'Stop Poll',\n 'Chat.Poll.ViewResults': 'View Results',\n 'Chat.Poll.SubmitVote': 'Vote',\n 'Chat.Poll.Type.Anonymous': 'Anonymous Poll',\n 'Chat.Poll.Type.Public': 'Poll',\n 'Chat.Poll.Type.AnonymousQuiz': 'Anonymous Quiz',\n 'Chat.Poll.Type.Quiz': 'Quiz',\n 'Chat.Poll.Type.Closed': 'Final Results',\n 'Chat.Poll.TotalVotes1': {\n 'one_value': '%d vote',\n 'other_value': '%d votes'\n },\n 'Chat.Quiz.TotalVotes': {\n 'one_value': '%d answer',\n 'other_value': '%d answers'\n },\n 'Chat.Poll.TotalVotesEmpty': 'No votes yet',\n 'Chat.Poll.TotalVotesResultEmpty': 'No votes',\n 'Chat.Quiz.TotalVotesEmpty': 'No answers yet',\n 'Chat.Quiz.TotalVotesResultEmpty': 'No answers',\n // \"Chat.Poll.Stop.Confirm.Header\": \"Stop Poll?\",\n // \"Chat.Poll.Stop.Confirm.Text\": \"If you stop this poll now, nobody will be able to vote in it anymore. This action cannot be undone.\",\n // \"Chat.Pinned.UnpinAll\": {\n // \"one_value\": \"Unpin %d Message\",\n // \"other_value\": \"Unpin All %d Messages\"\n // },\n 'Chat.Pinned.DontShow': 'Don\\'t Show Pinned Messages',\n 'Chat.Title.Comments': {\n 'one_value': '%d Comment',\n 'other_value': '%d Comments'\n },\n 'ChatTitle.ReportMessages': 'Report Messages',\n 'Chat.Send.WithoutSound': 'Send Without Sound',\n 'Chat.Send.SetReminder': 'Set a Reminder',\n 'Chat.Send.ScheduledMessage': 'Schedule Message',\n 'Chat.SendAs.PersonalAccount': 'personal account',\n 'Chat.UnpinAllMessagesConfirmation': {\n 'one_value': 'Do you want to unpin %d message in this chat?',\n 'other_value': 'Do you want to unpin all %d messages in this chat?'\n },\n 'Chat.Message.Ad.Text': 'Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\\n\\nUnlike other apps, Telegram doesn\\'t track whether you tapped on a sponsored message and doesn\\'t profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\\n\\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:\\n\\n%@\\n\\nSponsored Messages are currently in test mode. Once they are fully launched and allow Telegram to cover its basic costs, we will start sharing ad revenue with the owners of public channels in which sponsored messages are displayed.\\n\\nOnline ads should no longer be synonymous with abuse of user privacy. Let us redefine how a tech company should operate – together.',\n 'Chat.Message.Ad.ReadMore': 'Read More',\n 'Chat.Message.ViewChannel': 'VIEW CHANNEL',\n 'Chat.Message.ViewBot': 'VIEW BOT',\n 'Chat.Message.ViewGroup': 'VIEW GROUP',\n 'Chat.Message.Sponsored.What': 'What are sponsored messages?',\n 'Chat.Message.Sponsored.Link': 'https://promote.telegram.org',\n 'Checkout.2FA.Text': 'Saving payment details is only available with 2-Step Verification.',\n 'Checkout.NewCard.CardholderNamePlaceholder': 'Cardholder Name',\n 'Checkout.PasswordEntry.Title': 'Payment Confirmation',\n 'Checkout.PasswordEntry.Pay': 'Pay',\n 'Checkout.PasswordEntry.Text': 'Your card %@ is on file. To pay with this card, please enter your 2-Step-Verification password.',\n 'Checkout.PayPrice': 'Pay %@',\n 'Checkout.WebConfirmation.Title': 'Complete Payment',\n 'ChatList.Context.Mute': 'Mute',\n 'ChatList.Context.Unmute': 'Unmute',\n 'ChatList.Context.Pin': 'Pin',\n 'ChatList.Context.Unpin': 'Unpin',\n 'ChatList.Context.DeleteChat': 'Delete Chat',\n 'ChatList.Context.DeleteAndExit': 'Delete and Leave',\n 'ChatList.Context.LeaveChannel': 'Leave Channel',\n 'ChatList.Context.LeaveGroup': 'Leave Group',\n 'ChatList.Service.Call.incoming': 'Incoming Call (%@)',\n 'ChatList.Service.Call.outgoing': 'Outgoing Call (%@)',\n 'ChatList.Service.VideoCall.incoming': 'Incoming Video Call (%@)',\n 'ChatList.Service.VideoCall.outgoing': 'Outgoing Video Call (%@)',\n 'ChatList.Service.Call.Cancelled': 'Cancelled Call',\n 'ChatList.Service.Call.Missed': 'Missed Call',\n 'ChatList.Service.VideoCall.Cancelled': 'Cancelled Video Call',\n 'ChatList.Service.VideoCall.Missed': 'Missed Video Call',\n 'ChatList.Service.VoiceChatScheduled.Channel': 'Voice chat scheduled for %@',\n 'ChatList.Filter.Header': 'Create folders for different groups of chats and quickly switch between them.',\n 'ChatList.Filter.NewTitle': 'Create Folder',\n 'ChatList.Filter.List.Title': 'Chat Folders',\n 'ChatList.Filter.Include.AddChat': 'Add Chats',\n 'ChatList.Filter.Exclude.AddChat': 'Add Chats',\n // \"ChatList.Filter.All\": \"All\",\n 'ChatList.Filter.Contacts': 'Contacts',\n 'ChatList.Filter.NonContacts': 'Non-Contacts',\n 'ChatList.Filter.Groups': 'Groups',\n 'ChatList.Filter.Channels': 'Channels',\n 'ChatList.Filter.Bots': 'Bots',\n 'ChatList.Filter.MutedChats': 'Muted',\n 'ChatList.Filter.ReadChats': 'Read',\n 'ChatList.Filter.Archive': 'Archived',\n 'ChatList.Filter.Include.LimitReached': 'Sorry, you can only add up to 100 individual chats. Try using chat types.',\n 'ChatList.Filter.Exclude.LimitReached': 'Sorry, you can only add up to 100 individual chats. Try using chat types.',\n 'ChatList.Filter.Confirm.Remove.Header': 'Remove Folder',\n 'ChatList.Filter.Confirm.Remove.Text': 'Are you sure you want to remove this folder? Your chats will not be deleted.',\n 'ChatList.Mute.1Hour': 'For 1 Hour',\n 'ChatList.Mute.4Hours': 'For 4 Hours',\n 'ChatList.Mute.8Hours': 'For 8 Hours',\n 'ChatList.Mute.1Day': 'For 1 Day',\n 'ChatList.Mute.3Days': 'For 3 Days',\n 'ChatList.Mute.Forever': 'Forever',\n 'Channel.DescriptionHolderDescrpiton': 'You can provide an optional description for your channel.',\n 'ChannelVisibility.Confirm.MakePrivate.Channel': 'If you make this channel private, the name @%@ will be removed. Anyone else will be able to take it for their public groups or channels.',\n 'ChannelVisibility.Confirm.MakePrivate.Group': 'If you make this group private, the name @%@ will be removed. Anyone else will be able to take it for their public groups or channels.',\n 'Context.ViewStickerSet': 'View Sticker Set',\n 'CreateGroup.NameHolder': 'Group Name',\n 'CustomEmoji.PremiumAlert': 'Subscribe to Telegram Premium to unlock this emoji. [Read More]()',\n 'Date.Today': 'Today',\n 'DeleteChat.DeleteGroupForAll': 'Delete for all members',\n 'DeleteChannelForAll': 'Delete for all subscribers',\n 'ForumTopic.Context.Info': 'Group Info',\n 'ForumTopic.Context.AddMember': 'Add Members',\n 'ForumTopic.Context.ShowAsMessages': 'View as Messages',\n 'ForumTopic.Context.New': 'Create Topic',\n 'ForumTopic.Name.Placeholder': 'Topic Name',\n 'ForumTopic.Title.Edit': 'Edit Topic',\n 'EditAccount.Username': 'Username',\n 'EditAccount.Title': 'Edit Profile',\n 'EditAccount.Logout': 'Log Out',\n 'Emoji.Recent': 'Frequently Used',\n 'Emoji.SmilesAndPeople': 'Smileys & People',\n 'Emoji.AnimalsAndNature': 'Animals & Nature',\n 'Emoji.FoodAndDrink': 'Food & Drink',\n 'Emoji.ActivityAndSport': 'Activity & Sport',\n 'Emoji.TravelAndPlaces': 'Travel & Places',\n 'Emoji.Objects': 'Objects',\n // \"Emoji.Symbols\": \"Symbols\",\n 'Emoji.Flags': 'Flags',\n 'Error.AnError': 'An error occurred. Please try again later.',\n 'FileSize.B': '%@ B',\n 'FileSize.KB': '%@ KB',\n 'FileSize.MB': '%@ MB',\n 'FileSize.GB': '%@ GB',\n 'InstalledStickers.LoopAnimated': 'Loop Animated Stickers',\n 'LastSeen.HoursAgo': {\n 'one_value': 'last seen %d hour ago',\n 'other_value': 'last seen %d hours ago'\n },\n 'Login.Register.LastName.Placeholder': 'Last Name',\n 'Message.Context.Select': 'Select',\n 'Message.Context.Pin': 'Pin',\n 'Message.Context.Unpin': 'Unpin',\n 'Message.Context.Goto': 'Show Message',\n 'Message.ReplyActionButtonShowReceipt': 'Show Receipt',\n 'MessageContext.CopyMessageLink1': 'Copy Message Link',\n 'Modal.Send': 'Send',\n 'NewContact.Exception.ShareMyPhoneNumber': 'Share My Phone Number',\n 'NewContact.Exception.ShareMyPhoneNumber.Desc': 'You can make your phone visible to %@.',\n 'NewPoll.Anonymous': 'Anonymous Voting',\n 'NewPoll.Explanation.Placeholder': 'Add a Comment (Optional)',\n 'NewPoll.OptionsAddOption': 'Add an Option',\n 'NewPoll.MultipleChoice': 'Multiple Answers',\n 'NewPoll.Quiz': 'Quiz Mode',\n 'Notification.Contact.Reacted': '%1$@ to your \"%2$@\"',\n // \"Notification.Group.Reacted\": \"%1$@: %2$@ to your \"%3$@\"\",\n 'Payments.Recurrent.Accept': 'I accept [Terms of Service]() of **%@**.',\n 'Peer.Activity.User.PlayingGame': 'playing a game',\n 'Peer.Activity.User.TypingText': 'typing',\n 'Peer.Activity.User.SendingPhoto': 'sending a photo',\n 'Peer.Activity.User.RecordingVideo': 'recording video',\n 'Peer.Activity.User.SendingVideo': 'sending a video',\n 'Peer.Activity.User.RecordingAudio': 'recording voice',\n 'Peer.Activity.User.SendingFile': 'sending file',\n 'Peer.Activity.User.ChoosingSticker': 'choosing a sticker',\n 'Peer.Activity.User.EnjoyingAnimations': 'watching %@',\n 'Peer.Activity.Chat.PlayingGame': '%@ is playing a game',\n 'Peer.Activity.Chat.TypingText': '%@ is typing',\n 'Peer.Activity.Chat.SendingPhoto': '%@ is sending a photo',\n 'Peer.Activity.Chat.RecordingVideo': '%@ is recording video',\n 'Peer.Activity.Chat.SendingVideo': '%@ is sending a video',\n 'Peer.Activity.Chat.RecordingAudio': '%@ is recording voice',\n 'Peer.Activity.Chat.SendingFile': '%@ is sending a file',\n 'Peer.Activity.Chat.ChoosingSticker': '%@ is choosing a sticker',\n 'Peer.Activity.Chat.EnjoyingAnimations': '%@ is watching %@',\n 'Peer.Activity.Chat.Multi.PlayingGame1': '%@ and %d others are playing a game',\n 'Peer.Activity.Chat.Multi.TypingText1': '%@ and %d others are typing',\n 'Peer.Activity.Chat.Multi.SendingPhoto1': '%@ and %d others are sending photos',\n 'Peer.Activity.Chat.Multi.RecordingVideo1': '%@ and %d others are recording video',\n 'Peer.Activity.Chat.Multi.SendingVideo1': '%@ and %d others are sending videos',\n 'Peer.Activity.Chat.Multi.RecordingAudio1': '%@ and %d others are recording voice',\n // \"Peer.Activity.Chat.Multi.SendingAudio1\": \"%@ and %d others are sending audio\",\n 'Peer.Activity.Chat.Multi.SendingFile1': '%@ and %d others are sending files',\n 'Peer.Activity.Chat.Multi.ChoosingSticker1': '%@ and %d others are choosing stickers',\n 'Peer.ServiceNotifications': 'service notifications',\n 'Peer.RepliesNotifications': 'Reply Notifications',\n 'Peer.Status.justNow': 'last seen just now',\n 'Peer.Status.Today': 'today',\n 'Peer.Status.Yesterday': 'yesterday',\n 'Peer.Status.LastSeenAt': 'last seen %@ at %@',\n 'Peer.Status.minAgo': {\n 'one_value': 'last seen %d minute ago',\n 'other_value': 'last seen %d minutes ago'\n },\n 'Peer.Status.Member': {\n 'one_value': '%d member',\n 'other_value': '%d members'\n },\n 'Peer.Status.Subscribers': {\n 'one_value': '%d subscriber',\n 'other_value': '%d subscribers'\n },\n 'PeerInfo.Administrators': 'Administrators',\n 'PeerInfo.DeleteChannel': 'Delete Channel',\n 'PeerInfo.Discussion': 'Discussion',\n 'PeerInfo.Discussion.Add': 'Add',\n 'PeerInfo.SharedMedia': 'Shared Media',\n 'PeerInfo.Subscribers': 'Subscribers',\n 'PeerInfo.DeleteContact': 'Delete Contact',\n // \"PeerInfo.Confirm.RemovePeer\": \"Remove %@ from the group?\",\n 'PeerInfo.Action.VoiceChat': 'Video Chat',\n 'PeerInfo.Action.LiveStream': 'Live Stream',\n 'PeerInfo.Phone.AnonymousInfo': 'This number is not tied to a SIM card and was acquired on [Fragment]().',\n 'PeerMedia.Members': 'Members',\n 'PollResults.Title.Poll': 'Poll Results',\n 'PollResults.Title.Quiz': 'Quiz Results',\n 'PollResults.LoadMore': {\n 'other_value': 'Show More (%d)'\n },\n // \"PeerInfo.Confirm.DeleteGroupConfirmation\": \"Wait! Deleting this group will remove all members and all messages will be lost. Delete the group anyway?\",\n 'Preview.Dragging.AddItems': {\n 'one_value': 'Add Item',\n 'other_value': 'Add Items'\n },\n 'PreviewSender.CaptionPlaceholder': 'Add a caption...',\n 'PreviewSender.CompressFile': 'Send compressed',\n 'PreviewSender.SendFile': {\n 'one_value': 'Send File',\n 'other_value': 'Send %d Files'\n },\n 'PreviewSender.SendPhoto': {\n 'one_value': 'Send Photo',\n 'other_value': 'Send %d Photos'\n },\n 'PreviewSender.SendVideo': {\n 'one_value': 'Send Video',\n 'other_value': 'Send %d Videos'\n },\n 'PrivacyAndSecurity.Item.On': 'On',\n 'PrivacyAndSecurity.Item.Off': 'Off',\n 'PrivacyAndSecurity.SensitiveText': 'Disable filtering',\n 'PrivacyAndSecurity.SensitiveDesc': 'Display sensitive media in public channels on all your Telegram devices.',\n 'PrivacySettings.VoiceCalls': 'Calls',\n 'PrivacySettings.Forwards': 'Forwarded Messages',\n 'PrivacySettings.Groups': 'Groups and Channels',\n 'PrivacySettingsController.AddUsers': 'Add Users',\n 'PrivacySettingsController.GroupDescription': 'You can restrict who can add you to groups and channels with granular precision.',\n 'PrivacySettingsController.Forwards.CustomHelp': 'You can restrict who can add a link to your account when forwarding your messages.',\n 'PrivacySettingsController.P2p.Desc': 'Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio and video quality.',\n 'PrivacySettingsController.PhoneCallDescription': 'You can restrict who can call you with granular precision.',\n 'PrivacySettingsController.ProfilePhoto.CustomHelp': 'You can restrict who can see your profile photo with granular precision.',\n 'PrivacySettingsController.LastSeenDescription': 'You won\\'t see Last Seen and Online statuses for people with whom you don\\'t share yours. Approximate last seen will be shown instead (recently, within a week, within a month).',\n 'PrivacySettingsController.PeerInfo': 'You can add users or entire groups as exceptions that will override the settings above.',\n 'PrivacySettingsController.Everbody': 'Everybody',\n 'PrivacySettingsController.MyContacts': 'My Contacts',\n 'PrivacySettingsController.Nobody': 'Nobody',\n 'PrivacySettingsController.NeverShare': 'Never Share With',\n 'PrivacySettingsController.AlwaysShare': 'Always Share With',\n 'PrivacySettingsController.NeverAllow': 'Never Allow',\n 'PrivacySettingsController.AlwaysAllow': 'Always Allow',\n 'PrivacySettingsController.UserCount': {\n 'one_value': '%d user',\n 'other_value': '%d users'\n },\n 'RecentSessions.Error.FreshReset': 'For security reasons, you can\\'t terminate older sessions from a device that you\\'ve just connected. Please use an earlier connection or wait for a few hours.',\n 'RequestJoin.Button': 'Request to Join',\n 'Stickers.SearchAdd': 'Add',\n 'Stickers.SearchAdded': 'Added',\n 'Stickers.SuggestStickers': 'Suggest Stickers by Emoji',\n 'ShareModal.Search.Placeholder': 'Share to...',\n 'ShareModal.Search.ForwardPlaceholder': 'Forward to...',\n 'Telegram.GeneralSettingsViewController': 'General Settings',\n 'Telegram.InstalledStickerPacksController': 'Stickers',\n 'Telegram.NotificationSettingsViewController': 'Notifications',\n 'Telegram.LanguageViewController': 'Language',\n 'Text.CopyLabel_About': 'Copy About',\n 'Text.CopyLabel_Bio': 'Copy Bio',\n 'Text.CopyLabel_PhoneNumber': 'Copy Phone Number',\n 'Text.CopyLabel_Username': 'Copy Username',\n 'Text.CopyLabel_ShareLink': 'Copy Share Link',\n 'GeneralSettings.BigEmoji': 'Large Emoji',\n 'GeneralSettings.EmojiPrediction': 'Suggest Emoji',\n 'GroupPermission.Delete': 'Delete Exception',\n 'Search.Confirm.ClearHistory': 'Are you sure you want to clear your search history?',\n 'SecureId.Identity.Placeholder.ExpiryDate': 'Expiry Date',\n 'Separator.ShowMore': 'show more',\n 'Separator.ShowLess': 'show less',\n 'ScheduleController.at': 'at',\n 'Schedule.SendToday': 'Send today at %@',\n 'Schedule.SendDate': 'Send on %@ at %@',\n 'Schedule.SendWhenOnline': 'Send When Online',\n 'Sticker.Premium.Click.Info': 'This pack contains premium stickers like this one. [View Pack]()',\n 'Stickers.Recent': 'Recent',\n // \"Stickers.Favorite\": \"Favorite\",\n 'StickerSet.DontExist': 'Sorry, this sticker set doesn\\'t seem to exist.',\n 'Text.Context.Copy.Username': 'Copy Username',\n 'Text.Context.Copy.Hashtag': 'Copy Hashtag',\n 'Time.TomorrowAt': 'tomorrow at %@',\n 'TwoStepAuth.SetPasswordHelp': 'You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.',\n 'TwoStepAuth.GenericHelp': 'You have enabled Two-Step verification.\\nYou\\'ll need the password you set up here to log in to your Telegram account.',\n 'TwoStepAuth.ChangePassword': 'Change Password',\n 'TwoStepAuth.RemovePassword': 'Turn Password Off',\n 'TwoStepAuth.SetupEmail': 'Set Recovery Email',\n 'TwoStepAuth.ChangeEmail': 'Change Recovery Email',\n 'TwoStepAuth.ConfirmEmailCodeDesc': 'Please enter the code we\\'ve just emailed to %@.',\n 'TwoStepAuth.RecoveryTitle': 'Email Code',\n 'TwoStepAuth.RecoveryCode': 'Code',\n 'TwoStepAuth.RecoveryCodeInvalid': 'Invalid code. Please try again.',\n 'TwoStepAuth.RecoveryCodeExpired': 'Code Expired',\n 'TwoStepAuth.SetupHintTitle': 'Password Hint',\n 'TwoStepAuth.SetupHintPlaceholder': 'Hint',\n 'VoiceChat.Chat.StartNew': 'Video chat ended. Start a new one?',\n 'VoiceChat.Chat.StartNew.OK': 'Start',\n 'VoiceChat.Chat.Ended': 'Video chat ended.',\n 'VoiceChat.Invite.InviteMembers': 'Invite members',\n 'VoiceChat.Status.Connecting': 'Connecting...',\n 'VoiceChat.Status.Members': {\n 'one_value': '%d participant',\n 'other_value': '%d participants'\n },\n 'VoiceChat.Status.MutedForYou': 'muted for you',\n 'VoiceChat.Status.Speaking': 'speaking',\n 'VoiceChat.Status.Listening': 'listening',\n 'VoiceChat.Status.WantsSpeak': 'wants to speak',\n 'VoiceChat.Status.Muted': 'muted',\n 'VoiceChat.Status.You': 'This is you',\n 'VoiceChat.Video.Stream.Video': 'video',\n 'VoiceChat.Video.Stream.Screencast': 'screen',\n 'VoiceChat.Video.Stream.More': 'more',\n 'VoiceChat.Leave': 'Leave',\n 'VoiceChat.End.Title': 'Leave video chat',\n 'VoiceChat.End.Text': 'Are you sure you want to leave this video chat?',\n 'VoiceChat.End.Third': 'End Video Chat',\n 'VoiceChat.End.OK': 'Leave',\n 'VoiceChat.MutePeer': 'Mute',\n 'VoiceChat.UnmutePeer': 'Allow To Speak',\n 'VoiceChat.RemovePeer': 'Remove',\n 'VoiceChat.OpenProfile': 'Open Profile',\n 'VoiceChat.MuteForMe': 'Mute For Me',\n 'VoiceChat.UnmuteForMe': 'Unmute For Me',\n 'VoiceChat.RemovePeer.Confirm.Channel': 'Do you want to remove %1$@ from the channel?',\n 'VoiceChat.RemovePeer.Confirm': 'Are you sure you want to remove %1$@ from the group?',\n 'VoiceChat.RemovePeer.Confirm.OK': 'Remove'\n};\n\nexport default lang;\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/104.91dd6279f1f693880508.chunk.js b/public/104.c914ddc183166c9696a7.chunk.js similarity index 61% rename from public/104.91dd6279f1f693880508.chunk.js rename to public/104.c914ddc183166c9696a7.chunk.js index fc5e9c95e..557b6f0ef 100644 --- a/public/104.91dd6279f1f693880508.chunk.js +++ b/public/104.c914ddc183166c9696a7.chunk.js @@ -1,2 +1,2 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[104],{9104:(e,t,o)=>{o.r(t),o.d(t,{default:()=>a});const a={Animations:"Animations",AttachAlbum:"Album","Appearance.Color.Hex":"HEX","Appearance.Color.RGB":"RGB","BlockModal.Search.Placeholder":"Block user...",DarkMode:"Dark Mode",FilterIncludeExcludeInfo:"Choose chats and types of chats that will\nappear and never appear in this folder.",FilterMenuDelete:"Delete Folder",FilterHeaderEdit:"Edit Folder",FilterAllGroups:"All Groups",FilterAllContacts:"All Contacts",FilterAllNonContacts:"All Non-Contacts",FilterAllChannels:"All Channels",FilterAllBots:"All Bots","EditContact.OriginalName":"original name","EditProfile.FirstNameLabel":"Name","EditProfile.BioLabel":"Bio (optional)","EditProfile.Username.Label":"Username (optional)","EditProfile.Username.Available":"Username is available","EditProfile.Username.Taken":"Username is already taken","EditProfile.Username.Invalid":"Username is invalid","ExceptionModal.Search.Placeholder":"Add exception...","Chat.Menu.SelectMessages":"Select Messages","Chat.Menu.ClearSelection":"Clear Selection","Chat.Menu.Hint":"To **edit** or **reply**, close this menu.\nThen tap next to a message.","Chat.Input.UnpinAll":"Unpin All Messages","Chat.Input.Attach.PhotoOrVideo":"Photo or Video","Chat.Input.Attach.Document":"Document","Chat.Subscribe":"SUBSCRIBE","Chat.Selection.LimitToast":"Max selection count reached.","Chat.Search.MessagesFound":{one_value:"%d message found",other_value:"%d messages found"},"Chat.Search.NoMessagesFound":"No messages found","Chat.Search.PrivateSearch":"Private Search","Chat.Service.TopicEdited.Mixed":"%1$@ changed the topic name and icon to %2$@","Chat.Service.TopicEdited.You.Mixed":"You changed the topic name and icon to %2$@","Chat.Service.TopicEdited.Mixed.IconRemoved":'%1$@ changed the topic name to "%1$@" and removed icon',"Chat.Service.TopicEdited.You.Mixed.IconRemoved":'You changed the topic name to "%1$@" and removed icon',"ChatList.Main.EmptyPlaceholder.Title":"Your chats will appear here","ChatList.Main.EmptyPlaceholder.Subtitle":"You have %s on Telegram","ChatList.Main.EmptyPlaceholder.SubtitleNoContacts":"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts","ChatList.Menu.SwitchTo.Webogram":"Switch to Old Version","ChatList.Menu.SwitchTo.Z":"Switch to Z version","ChatMigration.From":"Migrated from %s","ChatMigration.To":"Migrated to %s","ConnectionStatus.ForceReconnect":"force reconnect","ConnectionStatus.ReconnectIn":"Reconnect in %ds, %s","ConnectionStatus.Reconnect":"reconnect","ConnectionStatus.Reconnecting":"Reconnecting...","ConnectionStatus.TimedOut":"Request timed out, %s","ConnectionStatus.Waiting":"Waiting for network...","Contacts.Count":{one_value:"%d contact",other_value:"%d contacts"},"Deactivated.Title":"Too many tabs...","Deactivated.Subtitle":"Telegram supports only one active tab with the app.\nClick anywhere to continue using this tab.","Deactivated.Version.Title":"WebK has updated...","Deactivated.Version.Subtitle":"Another tab is running a newer version of Telegram.\nClick anywhere to reload this tab.","General.Keyboard":"Keyboard","General.SendShortcut.Enter":"Send by Enter","General.SendShortcut.CtrlEnter":"Send by %s + Enter","General.SendShortcut.NewLine.ShiftEnter":"New line by Shift + Enter","General.SendShortcut.NewLine.Enter":"New line by Enter","General.TimeFormat":"Time Format","General.TimeFormat.h12":"12-hour","General.TimeFormat.h23":"24-hour","ChatBackground.UploadWallpaper":"Upload Wallpaper","ChatBackground.Blur":"Blur Wallpaper Image","Notifications.Sound":"Notification Sound",NewPrivateChat:"New Private Chat","NewPoll.OptionLabel":"Option %d","Message.Context.Selection.Copy":"Copy selected","Message.Context.Selection.Clear":"Clear selection","Message.Context.Selection.Delete":"Delete selected","Message.Context.Selection.Forward":"Forward selected","Message.Context.Selection.SendNow":"Send Now selected","Message.Unsupported.Desktop":"__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__","Message.Unsupported.Mobile":"__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__","Checkbox.Enabled":"Enabled","Checkbox.Disabled":"Disabled","Error.PreviewSender.CaptionTooLong":"Caption is too long.","PreviewSender.GroupItems":"Group items","PreviewSender.SendAlbum":{one_value:"Send Album",other_value:"Send %d Albums"},"Presence.YourChat":"chat with yourself","Privacy.Devices":{one_value:"%1$d device",other_value:"%1$d devices"},"Privacy.Websites":{one_value:"%1$d website",other_value:"%1$d websites"},"Privacy.SensitiveContent":"Sensitive Content","PrivacyModal.Search.Placeholder":"Add Users or Groups...","Permissions.NoExceptions":"No exceptions","Permissions.ExceptionsCount":{one_value:"%d exception",other_value:"%d exceptions"},"Link.Available":"Link is available","Link.Taken":"Link is already taken","Link.Invalid":"Link is invalid","StickersTab.SearchPlaceholder":"Search Stickers",ForwardedFrom:"Forwarded from %s","Popup.Avatar.Title":"Drag to Reposition","Popup.Unpin.AllTitle":"Unpin all messages","Popup.Unpin.HideTitle":"Hide pinned messages","Popup.Unpin.HideDescription":"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.","Popup.Unpin.Hide":"Hide","TwoStepAuth.EmailCodeChangeEmail":"Change Email","MarkupTooltip.LinkPlaceholder":"Enter URL...","MediaViewer.Context.Download":"Download",Profile:"Profile",Saved:"Saved",Deleted:"Deleted",ReportBug:"Report Bug","Notifications.Count":{one_value:"%d notification",other_value:"%d notifications"},"Notifications.Forwarded":{one_value:"Forwarded %d message",other_value:"Forwarded %d messages"},"Notifications.New":"New notification","PushNotification.Action.Mute1d":"Mute background alerts for 1 day","PushNotification.Action.Settings":"Background alerts settings","PushNotification.Action.Mute1d.Mobile":"Mute for 24H","PushNotification.Action.Settings.Mobile":"Alerts settings","PushNotification.Message.NoPreview":"You have a new message","LogOut.Description":"Are you sure you want to log out?\n\nNote that you can seamlessly use Telegram on all your devices at once.","VoiceChat.DiscussionGroup":"discussion group","PaymentInfo.CVV":"CVV Code","PaymentInfo.Card.Title":"Enter your card information","PaymentInfo.Billing.Title":"Enter your billing address","PaymentInfo.Done":"PROCEED TO CHECKOUT","PaymentCard.Error.Invalid":"Invalid card number","PaymentCard.Error.Incomplete":"Incomplete card number","LimitReached.Ok":"OK, GOT IT","Username.Purchase":"**This username is already taken.** However, it is currently available for purchase. [Learn more…]()","Video.Unsupported.Desktop":"__Unfortunately, this video can't be played on Telegram Web. Try opening it with our [desktop app](https://getdesktop.telegram.org/) instead.__","Video.Unsupported.Mobile":"__Unfortunately, this video can't be played on Telegram Web. Try opening it with our [mobile app](https://telegram.org/dl/) instead.__",AccDescrEditing:"Editing",ActionCreateChannel:"Channel created",ActionCreateGroup:"un1 created the group",ActionChangedTitle:"un1 changed the group name to un2",ActionRemovedPhoto:"un1 removed the group photo",ActionChangedPhoto:"un1 changed the group photo",ActionChangedVideo:"un1 changed the group video",ActionAddUser:"un1 added un2",ActionAddUserSelf:"un1 returned to the group",ActionAddUserSelfYou:"You returned to the group",ActionAddUserSelfMega:"un1 joined the group",ActionLeftUser:"un1 left the group",ActionKickUser:"un1 removed un2",ActionInviteUser:"un1 joined the group via invite link",ActionPinnedNoText:"un1 pinned a message",ActionMigrateFromGroup:"This group was upgraded to a supergroup",ActionYouScored:"You scored %1$s",ActionUserScored:"un1 scored %1$s",ActionYouScoredInGame:"You scored %1$s in un2",ActionUserScoredInGame:"un1 scored %1$s in un2",AndOther:{one_value:"and %1$d other",other_value:"and %1$d others"},AttachPhoto:"Photo",AttachVideo:"Video",AttachGif:"GIF",AttachLocation:"Location",AttachLiveLocation:"Live Location",AttachContact:"Contact",AttachSticker:"Sticker",AttachAudio:"Voice message",AttachRound:"Video message",AttachGame:"Game",Bot:"bot",ChannelMegaJoined:"You joined this group",EnterChannelName:"Channel name",DescriptionOptionalPlaceholder:"Description (optional)",DescriptionPlaceholder:"Description",DiscussionStarted:"Discussion started",Draft:"Draft",FilterAlwaysShow:"Include Chats",FilterNeverShow:"Exclude Chats",FilterInclude:"Included Chats",FilterExclude:"Excluded Chats",FilterChatTypes:"Chat types",FilterChats:"Chats",FilterNew:"New Folder",Filters:"Folders",FilterRecommended:"Recommended Folders",FilterShowMoreChats:{one_value:"Show %1$d More Chat",other_value:"Show %1$d More Chats"},ForwardedMessageCount:{one_value:"Forwarded message",other_value:"%1$d forwarded messages"},FromYou:"You",Add:"Add",Chats:{one_value:"%1$d chat",other_value:"%1$d chats"},Channels:{one_value:"%1$d channel",other_value:"%1$d channels"},Comments:{one_value:"%1$d Comment",other_value:"%1$d Comments"},Groups:{one_value:"%1$d group",other_value:"%1$d groups"},Users:{one_value:"%1$d user",other_value:"%1$d users"},Members:{one_value:"%1$d member",other_value:"%1$d members"},messages:{one_value:"%1$d message",other_value:"%1$d messages"},UsernameHelpLink:"This link opens a chat with you:\n%1$s",NewChannel:"New Channel",NewGroup:"New Group",Contacts:"Contacts",SavedMessages:"Saved Messages",Settings:"Settings",SettingsHelp:"Help",General:"General",TextSize:"Message Text Size",ChatBackground:"Chat Background",EnableAnimations:"Enable Animations",AutoDownloadMedia:"Auto-Download Media",AutodownloadContacts:"Contacts",AutodownloadPrivateChats:"Private Chats",AutodownloadGroupChats:"Group Chats",AutodownloadChannels:"Channels",AutoplayGIF:"GIFs",AutoplayVideo:"Videos",NotificationsForGroups:"Notifications for groups",NotificationsForPrivateChats:"Notifications for private chats",NotificationsForChannels:"Notifications for channels",NotificationsPrivateChats:"Private Chats",NotificationsGroups:"Groups",NotificationsChannels:"Channels",NotificationsOther:"Other",MarkAsUnread:"Mark as unread",MarkAsRead:"Mark as read",ContactJoined:"Contact joined Telegram",Loading:"Loading...",Unblock:"Unblock",BlockedUsers:"Blocked Users",BlockedUsersInfo:"Blocked users will not be able to contact you and will not see your Last Seen time.",BlockedEmpty:"None",TwoStepVerification:"Two-Step Verification",TwoStepVerificationTitle:"Two-Step Verification",PinnedMessage:"Pinned Message",PinnedMessagesCount:{one_value:"Pinned Message",other_value:"%1$d Pinned Messages"},PrivacyExceptions:"Exceptions",PrivacyLastSeen:"Last Seen & Online",PrivacySettings:"Privacy and Security",PrivacyTitle:"Privacy",PrivacyPhone:"Phone Number",PrivacyPhoneTitle:"Who can see my phone number?",PrivacyPhoneTitle2:"Who can find me by my number?",PrivacyPhoneInfo:"Users who have your number saved in their contacts will also see it on Telegram.",PrivacyPhoneInfo3:"Users who add your number to their contacts will see it on Telegram only if they are your contacts.",PrivacyProfilePhoto:"Profile Photos",PrivacyProfilePhotoTitle:"Who can see my profile photos & videos?",PrivacyP2PHeader:"Peer-to-Peer",PrivacyForwardsTitle:"Who can add a link to my account when forwarding my messages?",Reminders:"Reminders",ScheduledMessages:"Scheduled Messages",LastSeenTitle:"Who can see your Last Seen time?",SessionsTitle:"Active Sessions",CurrentSession:"This device",TerminateAllSessions:"Terminate All Other Sessions",TerminateSessionText:"Are you sure you want to terminate this session?",OtherSessions:"Active sessions",AreYouSureDeleteSingleMessage:"Are you sure you want to delete this message?",AreYouSureDeleteFewMessages:"Are you sure you want to delete these messages?",AreYouSureDeleteSingleMessageMega:"Are you sure you want to delete this message for everyone?",AreYouSureDeleteFewMessagesMega:"Are you sure you want to delete these messages for everyone?",AreYouSureDeleteAndExitName:"Are you sure you want to delete and leave the group **%1$s**?",AreYouSureDeleteThisChatSavedMessages:"Are you sure you want to delete **Saved Messages**?",AreYouSureDeleteThisChatWithUser:"Are you sure you want to delete the chat with **%1$s**?",AreYouSureSessionTitle:"Terminate session",AreYouSureSessionsTitle:"Terminate sessions",AreYouSureSessions:"Are you sure you want to terminate all other sessions?",Terminate:"Terminate",WhoCanCallMe:"Who can call me?",WhoCanAddMe:"Who can add me to group chats?",ArchivedChats:"Archived Chats",Cancel:"Cancel",HistoryCleared:"History was cleared",Archive:"Archive",Unarchive:"Unarchive",Delete:"Delete",Reply:"Reply",Edit:"Edit",Forward:"Forward",CopyLink:"Copy Link",Copy:"Copy",Search:"Search",LinkCopied:"Link copied to clipboard",LinkCopiedPrivateInfo:"This link will only work for members of this chat.",GroupAddMembers:"Add Members",SendMessageTo:"Add people...",JumpToDate:"Jump to Date",Caption:"Caption",Message:"Message",Poll:"Poll",SharedFilesTab2:"Files",SharedMediaTab2:"Media",SharedLinksTab2:"Links",SharedMusicTab2:"Music",SharedVoiceTab2:"Voice",NewPoll:"New Poll",PollOptions:"Poll options",AskAQuestion:"Ask a Question",AddAnExplanationInfo:"Users will see this text after choosing the wrong answer, good for educational purposes.",AccDescrQuizExplanation:"Explanation",PhoneCopied:"Phone copied to clipboard",UsernameCopied:"Username copied to clipboard.",BioCopied:"Bio copied to clipboard.",UserBio:"Bio",Username:"Username",UsernameAlso:"also %1$s",UsernameHelp:"You can choose a username on **Telegram**. If you do, people will be able to find you by this username and contact you without needing your phone number.\n\nYou can use **a–z**, **0–9** and underscores. Minimum length is **5** characters.",Phone:"Phone",Notifications:"Notifications",AreYouSureDeleteContact:"Are you sure you want to delete this contact?",AreYouSureDeleteAndExit:"Are you sure you want to delete and leave the group?",AreYouSureDeleteAndExitChannel:"Do you want to delete and leave the channel?",DeleteContact:"Delete contact",GroupType:"Group Type",ChannelType:"Channel Type",TypePrivate:"Private",TypePublic:"Public",TypePrivateGroup:"Private",TypePublicGroup:"Public",GroupMembers:"Members",DeleteMega:"Delete Group",DeleteMegaMenu:"Delete group",DeleteAndExitButton:"Delete and Leave Group",ChannelDelete:"Delete Channel",ChannelDeleteMenu:"Delete channel",ChannelPermissions:"Permissions",ChannelPermissionsHeader:"What can members of this group do?",ChannelAddException:"Add Exception",ChannelBlockedUsers:"Removed users",NoBlockedUsers:"No removed users",UserRestrictions:"User Permissions",UserRestrictionsDisabled:"This option is disabled for all members in Group Permissions",UserRestrictionsCanDo:"What can this user do?",UserRestrictionsRead:"Read Messages",UserRestrictionsSend:"Send Messages",UserRestrictionsSendMedia:"Send Media",UserRestrictionsSendPolls:"Send Polls",UserRestrictionsSendStickers:"Send Stickers and GIFs",UserRestrictionsEmbedLinks:"Embed Links",UserRestrictionsChangeInfo:"Change Chat Info",UserRestrictionsPinMessages:"Pin Messages",UserRestrictionsInviteUsers:"Add Users",UserRestrictionsNoSend:"can't send messages",UserRestrictionsNoSendMedia:"no media",UserRestrictionsNoSendPolls:"no polls",UserRestrictionsNoSendStickers:"no stickers & GIFs",UserRestrictionsNoEmbedLinks:"no embed links",UserRestrictionsNoChangeInfo:"can't change Info",UserRestrictionsNoPinMessages:"no pins",UserRestrictionsNoInviteUsers:"can't add users",UserRestrictionsBlock:"Ban and remove from group",ChannelPublic:"Public Channel",MegaPublic:"Public Group",ChannelPublicInfo:"Public channels can be found in search, anyone can join them.",MegaPublicInfo:"Public groups can be found in search, chat history is available to everyone and anyone can join.",ChannelPrivate:"Private Channel",MegaPrivate:"Private Group",ChannelPrivateInfo:"Private channels can only be joined via an invite link.",MegaPrivateInfo:"Private groups can only be joined if you were invited or have an invite link.",ChannelPrivateLinkHelp:"People can join your channel by following this link. You can revoke the link any time.",MegaPrivateLinkHelp:"People can join your group by following this link. You can revoke the link any time.",RevokeButton:"Revoke",RevokeLink:"Revoke Link",RevokeAlert:"Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it.",SetUrlPlaceholder:"Link",Subscribers:{one_value:"%1$d subscriber",other_value:"%1$d subscribers"},SearchGifsTitle:"Search GIFs",PinMessageAlert:"Pin this message in the group?",PinMessageAlertTitle:"Pin message",PinMessageAlertChannel:"Do you want to pin this message in this channel?",PinMessageAlertChat:"Do you want to pin this message at the top of the chat?",UnpinMessageAlertTitle:"Unpin message",UnpinMessageAlert:"Do you want to unpin this message?",PinNotify:"Notify all members",PinMessage:"Pin",UnpinMessage:"Unpin",PinAlsoFor:"Also pin for %1$s",DeleteMessagesTitle:"Delete %1$s",DeleteSingleMessagesTitle:"Delete message",DeleteMessagesOption:"Unsend My Messages",DeleteMessagesOptionAlso:"Also delete for %1$s",DeleteForAll:"Delete for all members",DeleteMessagesTextGroup:'You can also delete the %1$s you sent from the inboxes of other group members by checking "Unsend my messages".',LeaveChannel:"Leave Channel",LeaveChannelMenu:"Leave channel",ChannelLeaveAlertWithName:"Are you sure you want to leave **%1$s**?",LeaveMegaMenu:"Leave group",DeleteChatUser:"Delete chat",PleaseEnterCurrentPassword:"Enter your password",PleaseEnterFirstPassword:"Enter a password",PleaseReEnterPassword:"Re-enter your password",Continue:"Continue",YourEmailSkip:"Skip",YourEmailSkipWarning:"Warning",YourEmailSkipWarningText:"No, seriously.\n\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it.",TurnPasswordOffQuestionTitle:"Disable password",TurnPasswordOffQuestion:"Are you sure you want to disable your password?",Disable:"Disable",TwoStepVerificationSetPassword:"Set Password",TwoStepVerificationPasswordSet:"Password Set!",TwoStepVerificationPasswordSetInfo:"This password will be required when you log in on a new device in addition to the code you get in the SMS.",TwoStepVerificationPasswordReturnSettings:"Return to Settings",RecoveryEmail:"Recovery email",RecoveryEmailTitle:"Recovery Email",ResendCode:"Resend code",PasswordAsHintError:"Hint must be different from your password",AddStickersCount:"ADD %1$s",RemoveStickersCount:"REMOVE %1$s",Stickers:{one_value:"%1$d sticker",other_value:"%1$d stickers"},HidAccount:"The account was hidden by the user",TelegramFeatures:"Telegram Features",SetColor:"Set a color",Open:"Open",OpenUrlTitle:"Open Link",OpenUrlAlert2:"Do you want to open %1$s?",FilterNoChatsToDisplay:"Folder is empty",FilterNoChatsToDisplayInfo:"No chats currently belong to this folder.",SupportStatus:"support",Lately:"last seen recently",WithinAWeek:"last seen within a week",WithinAMonth:"last seen within a month",ALongTimeAgo:"last seen a long time ago",Online:"online",MessageScheduleSend:"Send Now",MessageScheduleEditTime:"Reschedule",YouLeft:"You left this group",Recent:"Recent",Of:"%1$d of %2$d",NoResult:"No results",Updating:"Updating...",Emoji:"Emoji",AddContactTitle:"Add Contact",HiddenName:"Deleted Account",Seconds:{one_value:"%1$d second",other_value:"%1$d seconds"},Minutes:{one_value:"%1$d minute",other_value:"%1$d minutes"},Hours:{one_value:"%1$d hour",other_value:"%1$d hours"},Days:{one_value:"%1$d day",other_value:"%1$d days"},Weeks:{one_value:"%1$d week",other_value:"%1$d weeks"},Months:{one_value:"%1$d month",other_value:"%1$d months"},Years:{one_value:"%1$d year",other_value:"%1$d years"},TodayAtFormattedWithToday:"today at %1$s",formatDateAtTime:"%1$s at %2$s",JoinByPeekChannelTitle:"Join Channel",JoinByPeekGroupTitle:"Join Group",YouWereKicked:"you were removed",ViaBot:"via",InviteExpired:"This invite link has expired.",NoUsernameFound:"There is no Telegram account with this username.",PrivacyDeleteCloudDrafts:"Delete All Cloud Drafts",AreYouSureClearDraftsTitle:"Delete cloud drafts",AreYouSureClearDrafts:"Are you sure you want to delete all cloud drafts?",BotInfoTitle:"What can this bot do?",ChatYourSelf:"forward here to save",GroupEmptyTitle1:"You have created a **group**.",GroupEmptyTitle2:"Groups can have:",GroupDescription1:"Up to 200,000 members",GroupDescription2:"Persistent chat history",GroupDescription3:"Public links such as t.me/title",GroupDescription4:"Admins with different rights",ChatYourSelfDescription1:"Forward messages here to save them",ChatYourSelfDescription2:"Send media and files to store them",ChatYourSelfDescription3:"Access this chat from any device",ChatYourSelfDescription4:"Use search to quickly find things",ChatYourSelfTitle:"Your cloud storage",ActionYouCreateGroup:"You created the group",NoMessages:"No messages here yet...",NoScheduledMessages:"No scheduled messages here yet...",NoMessagesGreetingsDescription:"Send a message or tap the greeting below.",InviteToGroupError:"Sorry, you can't add this user to groups because of user's privacy settings.",InviteToChannelError:"Sorry, you can't add this user to channels because of user's privacy settings.",AddMembersAlertTitle:"Add %1$s",AddOneMemberAlertTitle:"Add member",AddMembersAlertNamesText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersAlertCountText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersForwardMessages:"Show the last 100 messages to the new members",AddOneMemberForwardMessages:"Show the last 100 messages to **%1$s**",PinToTopLimitReached2:"Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.",FiltersSetupPinAlert:"Set Up Folders",AppName:"Telegram",OK:"OK",PinFolderLimitReached:"Sorry, you can't pin any more chats to the top.",Send:"Send",ChannelJoin:"JOIN",Yesterday:"yesterday",LeaveAComment:"Leave a comment",ViewInChat:"View in chat",LinkNotFound:"Unfortunately, you can't access this message. You are not a member of the chat where it was posted.",Create:"Create",ViewDiscussion:"View discussion",MessageScheduledUntilOnline:"Scheduled until online",ReportChat:"Report",ReportChatSpam:"Spam",ReportChatViolence:"Violence",ReportChatPornography:"Pornography",ReportChatChild:"Child Abuse",ReportChatOther:"Other",ReportChatDescription:"Description",ReportInfo:"Please enter any additional details relevant to your report.",ReportSentInfo:"Telegram moderators will review your report.\nThank you for your cooperation!",ReportHint:"Additional details...",ChatHistory:"Chat history for new members",ShareContact:"Share contact",SendMessageTitle:"Send message",SendContactToGroupText:"Do you want to send this contact to **%1$s**?",ChannelBroadcast:"Broadcast",ChannelSilentBroadcast:"Silent Broadcast",Comment:"Comment",SendAnonymously:"Send anonymously",DiscardVoiceMessageTitle:"Discard Voice Message",DiscardVoiceMessageDescription:"Are you sure you want to stop recording and discard your voice message?",DiscardVoiceMessageAction:"Discard",AddContact:"Add to contacts",BlockUser:"Block user",MobileHidden:"Mobile hidden",MobileHiddenExceptionInfo:"Phone number will be visible once %1$s adds you as a contact.",FirstName:"First name (required)",LastName:"Last name (optional)",AreYouSureBlockContact2:"Are you sure you want to block **%1$s**?",UserBlocked:"User blocked",UserUnblocked:"User unblocked",AudioUnknownArtist:"Unknown artist",AudioUnknownTitle:"Unknown title",LogOut:"Log out",OnlineCount:{one_value:"%1$d online",other_value:"%1$d online"},EditedMessage:"edited",GlobalSearch:"Global search",SearchMessages:"Messages",SearchAllChatsShort:"Chats",ClearButton:"Clear",FilterAllChats:"All Chats",FilterAllChatsShort:"All",Call:"Call",VideoCall:"Video Call",CallMessageOutgoing:"Outgoing Call",CallMessageIncoming:"Incoming Call",CallMessageVideoOutgoing:"Outgoing Video Call",CallMessageVideoIncoming:"Incoming Video Call",VoipExchangingKeys:"Exchanging encryption keys",VoipUnmute:"Unmute",SavingContentTitle:"Saving content",RestrictSavingContent:"Restrict saving content",RestrictSavingContentInfoGroup:"Members won't be able to copy, save and forward content from this group.",RestrictSavingContentInfoChannel:"Subscribers won't be able to copy, save and forward content from this channel.",ClearOtherSessionsHelp:"Logs out all devices except for this one.",SessionsListInfo:"The official Telegram app is available for Android, iPhone, iPad, Windows, macOS and Linux.",SponsoredMessage:"sponsored",OpenChannelPost:"VIEW POST",FilterNameHint:"Folder name",BotStart:"START",BotUnblock:"RESTART",BotStop:"Stop bot",BotRestart:"Restart bot",ShareYouPhoneNumberTitle:"Share your phone number?",AreYouSureShareMyContactInfoBot:"The bot will know your phone number. This can be useful for integration with other services.",DistanceUnitsTitle:"Distance units",DistanceUnitsKilometers:"Kilometers",DistanceUnitsMiles:"Miles",PeopleNearby:"People Nearby",MakeMyselfVisible:"Make Myself Visible",MakeMyselfVisibleTitle:"Show Your Profile?",MakeMyselfVisibleInfo:"Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\n\nYour phone number will remain hidden.",StopShowingMe:"Stop Showing Me",PeopleNearbyInfo2:"Exchange contact info with people nearby and find new friends.",NearbyCreateGroup:"Create a Local group",AwayTo:"%1$s away",MessagePreview:"Message Preview",KMetersAway2:"%1$s km away",MetersAway2:"%1$s m away",MilesAway:"%1$s mi away",FootsAway:"%1$s ft away",PeopleNearbyHeader:"People nearby",ChatsNearbyHeader:"Groups nearby",ChatLocation:"Location",RequestToJoinGroupDescription:"This group accepts new members only after they are approved by its admins.",RequestToJoinChannelDescription:"This channel accepts new subscribers only after they are approved by its admins.",RequestToJoinSent:"Join request sent",RequestToJoinGroupApproved:"Your request to join the group was approved",RequestToJoinChannelApproved:"Your request to join the channel was approved",Update:"UPDATE",Reactions:"Reactions",DoubleTapSetting:"Quick Reaction",EnableReactions:"Enable Reactions",EnableReactionsChannelInfo:"Allow subscribers to react to channel posts.",EnableReactionsGroupInfo:"Allow members to react to group messages.",AvailableReactions:"Available reactions",NobodyViewed:"Nobody viewed",MessageSeen:{one_value:"Seen",other_value:"%1$d Seen"},DataSettings:"Data and Storage",GroupsAndChannelsHelp:"Change who can add you to groups and channels.",SessionsInfo:"Control your sessions on other devices.",StickersBotInfo:"Artists are welcome to add their own sticker sets using our @stickers bot.",AutomaticMediaDownload:"Automatic media download",AutoDownloadPhotos:"Photos",AutoDownloadVideos:"Videos",AutoDownloadFiles:"Files",AutoDownloadOnAllChats:"On in all chats",AutoDownloadUpToOnAllChats:"Up to %1$s in all chats",AutoDownloadOff:"Off",AutoDownloadOnUpToFor:"Up to %1$s for %2$s",AutoDownloadOnFor:"On for %1$s",AutoDownloadContacts:"Contacts",AutoDownloadPm:"PM",AutoDownloadGroups:"Groups",AutoDownloadChannels:"Channels",AutoDownloadAudioInfo:"Voice messages are tiny, so they're always downloaded automatically.",AutoplayMedia:"Auto-play media",AutoDownloadPhotosTitle:"Auto-download photos",AutoDownloadVideosTitle:"Auto-download videos and GIFs",AutoDownloadFilesTitle:"Auto-download files and music",AutoDownloadMaxFileSize:"Maximum file size",AutodownloadSizeLimitUpTo:"up to %1$s",ResetAutomaticMediaDownload:"Reset Auto-Download Settings",ResetAutomaticMediaDownloadAlertTitle:"Reset settings",ResetAutomaticMediaDownloadAlert:"Are you sure you want to reset auto-download settings?",Reset:"Reset",SendMessageAsTitle:"Send message as...",Devices:"Devices",LanguageName:"English",EditCantEditPermissionsPublic:"This permission is not available in public groups.",VoipUserMicrophoneIsOff:"%s's microphone is off",VoipUserCameraIsOff:"%s's camera is off",PrivacyPhoneInfo4:"This public link opens a chat with you:",ReportChatIllegalDrugs:"Illegal Drugs",ReportChatPersonalDetails:"Personal Details",VoipPeerIncompatible:"**%1$s**'s app is using an incompatible protocol. They need to update their app before you can call them.",TelegramFeaturesUrl:"https://t.me/TelegramTips",ScamMessage:"SCAM",FakeMessage:"FAKE",TextCopied:"Text copied to clipboard",PaymentInvoice:"INVOICE",PaymentTestInvoice:"TEST INVOICE",PaymentReceipt:"Receipt",PaymentCheckout:"Checkout",PaymentTransactionTotal:"Total",PaymentTip:"Tip",PaymentTipOptional:"Tip (Optional)",PaymentCheckoutPay:"PAY %1$s",PaymentCheckoutMethod:"Payment method",PaymentCheckoutProvider:"Payment provider",PaymentCardNumber:"Card Number",PaymentCardSavePaymentInformation:"Save Payment Information",PaymentCardInfo:"Payment info",PaymentCardSavePaymentInformationInfoLine1:"You can save your payment info for future use. It will be stored directly with the payment provider. Telegram has no access to your credit card data.",Done:"Done",PaymentShippingMethod:"Shipping methods",PaymentNoShippingMethod:"Sorry, it is not possible to deliver to your address.",PaymentShippingInfo:"Shipping Information",PaymentShippingAddress:"Shipping address",PaymentShippingAddress1Placeholder:"Address 1 (Street)",PaymentShippingAddress2Placeholder:"Address 2 (Street)",PaymentShippingCityPlaceholder:"City",PaymentShippingStatePlaceholder:"State",PaymentShippingCountry:"Country",PaymentShippingZipPlaceholder:"Postcode",PaymentShippingReceiver:"Receiver",PaymentShippingName:"Full Name",PaymentShippingEmailPlaceholder:"Email",PaymentCheckoutPhoneNumber:"Phone number",PaymentCheckoutShippingMethod:"Shipping method",PaymentShippingSave:"Save Shipping Information",PaymentShippingSaveInfo:"You can save your shipping info for future use.",PaymentInfoHint:"You paid **%1$s** for **%2$s**.",PrivacyPayments:"Payments",PrivacyPaymentsClearInfo:"You can delete your shipping info and instruct all payment providers to remove your saved credit cards. Note that Telegram never stores your credit card data.",PrivacyPaymentsClear:"Clear Payment and Shipping Info",PrivacyPaymentsClearAlertTitle:"Clear payment info",PrivacyPaymentsClearAlertText:"Are you sure you want to clear your payment and shipping info?",PrivacyPaymentsPaymentInfoCleared:"Payment info cleared.",PrivacyPaymentsShippingInfoCleared:"Shipping info cleared.",PrivacyPaymentsPaymentShippingCleared:"Payment and shipping info cleared.",PrivacyClearShipping:"Shipping info",PrivacyClearPayment:"Payment info",Clear:"Clear",Save:"Save",PaymentCheckoutName:"Name",ClearRecentStickersAlertTitle:"Clear recent stickers",ClearRecentStickersAlertMessage:"Do you want to clear all your recent stickers?",PremiumStickersShort:"Premium",FavoriteStickers:"Favorites",AddToFavorites:"Add to Favorites",AddedToFavorites:"Sticker added to Favorites.",RemovedFromFavorites:"Sticker was removed from Favorites",RemovedFromRecent:"Sticker was removed from Recent",DeleteFromFavorites:"Delete from Favorites",DeleteFromRecent:"Remove from Recent",NewChatsFromNonContacts:"New chats from unknown users",ArchiveAndMute:"Archive and Mute",ArchiveAndMuteInfo:"Automatically archive and mute new chats, groups and channels from non-contacts.",PrivacyVoiceMessages:"Voice Messages",PrivacyVoiceMessagesTitle:"Who can send me voice or video messages?",PrivacyVoiceMessagesInfo:"You can restrict who can send you voice or video messages with granular precision.",PrivacyVoiceMessagesPremiumOnly:"Only subscribers of *Telegram Premium* can restrict receiving voice messages.",EmojiCount:{other_value:"%1$d emoji"},AddEmojiNotFound:"Emoji pack not found.",MessageContainsEmojiPack:"This message contains emoji from %s pack.",MessageContainsEmojiPacks:{other_value:"This message contains emoji from **%d Packs**."},EmojiPackCount:{one_value:"%1$d Emoji Pack",other_value:"%1$d Emoji Packs"},ReactionsAll:"All",EnableSomeReactionsInfo:"Members of the group can use only certain approved emoji as reactions to messages.",EnableAllReactionsInfo:"Members of the group can use any emoji as reactions to messages.",DisableReactionsInfo:"Members of the group can’t add any reactions to messages.",OnlyAllowThisReactions:"Only allow these reactions",AllReactions:"All reactions",SomeReactions:"Some reactions",NoReactions:"No reactions",LimitReached:"Limit Reached",LimitReachedPinDialogs:"You can't pin more than %1$d chats to the top. Unpin some that are currently pinned – or subscribe to **Telegram Premium** to double the limit to **%2$d** chats.",LimitReachedPinDialogsPremium:"Sorry, you can't pin more than %1$d chats to the top. Unpin some that are currently pinned.",LimitReachedPinDialogsLocked:"Sorry, you can't pin more than %1$d chats to the top. Unpin some that are currently pinned. We are working to let you increase this limit in the future.",IncreaseLimit:"Increase Limit",LimitFree:"Free",LimitPremium:"Premium",ActionTTLChanged:"un1 set messages to auto-delete in %1$s",ActionTTLYouChanged:"You set messages to auto-delete in %1$s",ActionTTLChannelChanged:"Messages in this channel will be automatically deleted after %1$s",ActionTTLChannelDisabled:"Messages in this channel will no longer be automatically deleted",ActionTTLDisabled:"un1 disabled the auto-delete timer",ActionTTLYouDisabled:"You disabled the auto-delete timer",UsernamesProfileHeader:"Username order",UsernamesProfileHelp:"Drag and drop links to change the order in which they will be displayed on your info page.",UsernamesChannelHelp:"Drag and drop links to change the order in which they will be displayed on the channel info page.",UsernameLinkEditable:"tap to edit",UsernameLinkActive:"active",UsernameLinkInactive:"not active",UsernameActivateLink:"Activate link",UsernameDeactivateLink:"Deactivate link",UsernameActivateLinkProfileMessage:"Do you want to show this link on your info page?",UsernameDeactivateLinkProfileMessage:"Do you want to hide this link from your info page?",UsernameActivateLinkChannelMessage:"Do you want to show this link on the channel info page?",UsernameDeactivateLinkChannelMessage:"Do you want to hide this link from the channel info page?",Hide:"Hide",Show:"Show",UsernameActivateErrorTitle:"Too many active links",UsernameActivateErrorMessage:"Sorry, you have too many active public links already. Please hide one of your active public links first.",ChannelSignMessages:"Sign Messages",TopicWasCreatedAction:"%s was created",Topics:"Topics",ForumToggleDescription:"The group chat will be divided into topics created by admins or users.",AnonymousNumber:"Anonymous Number",Info:"Info",BotSettings:"Settings",OpenMessage:"VIEW MESSAGE",OpenGroup:"VIEW GROUP",CloseTopic:"Close topic",RestartTopic:"Reopen topic",LimitReachedPinnedTopics:"Sorry, you can't pin more than %d topics to the top.",TopicProfileStatus:"In %s",AccDescrTopic:"Topic",DeleteTopics:{one_value:"Delete topic",other_value:"Delete topics"},DeleteSelectedTopic:"Are you sure you want delete %s?",NewTopic:"New Topic",CreateTopicTitle:"Choose a topic name and icon",CreateGeneralTopicTitle:"Choose topic name",EditTopicHide:"Show in Topics",EditTopicHideInfo:"If the 'General' topic is hidden, group members can pull down in the topic list to view it.",OpenUrlOption1:"Log in to %1$s as **%2$s**",OpenUrlOption2:"Allow **%1$s** to send me messages",OtherWebSessions:"Connected websites",WebSessionsTitle:"Logged In with Telegram",TerminateWebSessionText:"Are you sure you want to disconnect %1$s?",Disconnect:"Disconnect",TerminateAllWebSessions:"Disconnect All Websites",AreYouSureWebSessions:"Are you sure you want to disconnect all websites where you logged in with Telegram?",ClearOtherWebSessionsHelp:"You can log in on websites that support signing in with Telegram.",TerminateWebSessionInfo:"Tap to disconnect from your Telegram account.",EnablePhotoSpoiler:"Hide with spoiler",DisablePhotoSpoiler:"Remove spoiler",LimitReachedFolders:"You have reached the limit of **%1$d** folders. You can double the limit to **%2$d** folders by subscribing to **Telegram Premium**.",LimitReachedFoldersPremium:"You have reached the limit of **%1$d** folders for this account.",LimitReachedFoldersLocked:"You have reached the limit of **%1$d** folders for this account. We are working to let you increase this limit in the future.","AccountSettings.Filters":"Chat Folders","AccountSettings.Notifications":"Notifications and Sounds","AccountSettings.PrivacyAndSecurity":"Privacy and Security","AccountSettings.Language":"Language","Alert.UserDoesntExists":"Sorry, this user doesn't seem to exist.","Alert.Confirm.Discard":"Discard","Appearance.Reset":"Reset to Defaults","AutoDownloadSettings.Delimeter":", ","AutoDownloadSettings.LastDelimeter":" and ","Bio.Description":"Any details such as age, occupation or city.\nExample: 23 y.o. designer from San Francisco","Call.Accept":"Accept","Call.Decline":"Decline","Call.End":"End","Call.Camera":"Camera","Call.Mute":"Mute","Call.Recall":"Recall","Call.Close":"Close","Call.Screen":"Screen","Call.Confirm.Discard.Voice.Header":"Video Chat in Progress","Call.Confirm.Discard.Voice.ToVoice.Text":'Leave video chat in "%1$@" and start a new one in "%2$@"?',"Call.Confirm.Discard.Voice.ToCall.Text":'Leave video chat in "%1$@" and start a call with "%2$@"?',"Call.Confirm.Discard.Call.Header":"Call in Progress","Call.Confirm.Discard.Call.ToVoice.Text":'End call with "%1$@" and start a video chat in "%2$@"?',"Call.Confirm.Discard.Call.ToCall.Text":'End call with "%1$@" and start a video chat in "%2$@"?',"Call.PrivacyErrorMessage":"Sorry, you cannot call %@ because of their privacy settings.","Call.StatusRequesting":"Contacting...","Call.StatusRinging":"Ringing...","Call.StatusConnecting":"Connecting...","Call.StatusEnded":"Call Ended","Call.StatusFailed":"Call Failed","Call.StatusBusy":"Busy","Call.StatusCalling":"is calling you...","Contacts.PhoneNumber.NotRegistred":"The person with this phone number is not registered on Telegram yet.","Channel.UsernameAboutChannel":"People can share this link with others and can find your channel using Telegram search.","Channel.UsernameAboutGroup":"People can share this link with others and find your group using Telegram search.","Chat.Accessory.Forward":{one_value:"Forward Message",other_value:"Forward %d Messages"},"Chat.Accessory.Forward.You":"You","Chat.Accessory.Forward.From":"From","Chat.Accessory.Hidden":{one_value:"Forward Message (sender's name hidden)",other_value:"Forward %d Messages (senders' names hidden)"},"Chat.Alert.Forward.Action.Another":"Forward to Another Chat","Chat.Alert.Forward.Action.Hide1":{one_value:"Hide Sender's Name",other_value:"Hide Senders' Names"},"Chat.Alert.Forward.Action.Show1":{one_value:"Show Sender's Name",other_value:"Show Senders' Names"},"Chat.Alert.Forward.Action.ShowCaption":{one_value:"Show Caption",other_value:"Show Captions"},"Chat.Alert.Forward.Action.HideCaption":{one_value:"Hide Caption",other_value:"Hide Captions"},"Chat.CopySelectedText":"Copy Selected Text","Chat.Confirm.Unpin":"Would you like to unpin this message?","Chat.Context.Reacted":"%1$@/%2$@ Reacted","Chat.Context.ReactedFast":{other_value:"%d Reacted"},"Chat.Date.ScheduledFor":"Scheduled for %@","Chat.Date.ScheduledForToday":"Scheduled for today","Chat.DropTitle":"Drop files here to send them","Chat.DropQuickDesc":"in a quick way","Chat.DropAsFilesDesc":"without compression","Chat.Edit.Cancel.Text":"Are you sure you want to discard all changes?","Chat.Input.ReplyToAnswer":"Reply to message in topics","Chat.SendVoice.PrivacyError":"%@ doesn't accept voice and video messages","Chat.Service.Call.Cancelled":"Cancelled","Chat.Service.Call.Missed":"Missed","Chat.Service.PeerJoinedTelegram":"%@ joined Telegram","Chat.Service.Channel.UpdatedTitle":'Channel renamed to "%@"',"Chat.Service.Channel.UpdatedPhoto":"Channel photo updated","Chat.Service.Channel.RemovedPhoto":"Channel photo removed","Chat.Service.Channel.UpdatedVideo":"Channel video updated","Chat.Service.BotPermissionAllowed":"You allowed this bot to message you when you logged in on %@","Chat.Service.Group.UpdatedPinnedMessage":'%@ pinned "%@"',"Chat.Service.Group.TopicEdited.Icon":"%1$@ changed topic icon to %2$@","Chat.Service.Group.TopicEdited.Icon.Removed":"%1$@ removed icon","Chat.Service.Group.TopicEdited.Title":'%1$@ changed topic name to "%2$@"',"Chat.Service.Group.TopicEdited.Paused":"%1$@ closed topic","Chat.Service.Group.TopicEdited.Resumed":"%1$@ restarted topic","Chat.Service.Group.TopicEdited.You.Icon":"You changed topic icon to %1$@","Chat.Service.Group.TopicEdited.You.Icon.Removed":"You removed icon","Chat.Service.Group.TopicEdited.You.Title":'You changed topic name to "%1$@"',"Chat.Service.Group.TopicEdited.You.Paused":"You closed topic","Chat.Service.Group.TopicEdited.You.Resumed":"You restarted topic","Chat.Service.Group.TopicEdited.You.Hided":"You hid the general topic","Chat.Service.Group.TopicEdited.You.Unhided":"You unhid the general topic","Chat.Service.Group.TopicEdited.Hided":"%1$@ hid the general topic","Chat.Service.Group.TopicEdited.Unhided":"%1$@ unhid the general topic","Chat.Service.PaymentSent1":"You have successfully transferred **%1$@** to **%2$@** for **%3$@**","Chat.Service.PaymentSent1NoTitle":"You have successfully transferred **%1$@** to **%2$@**","Chat.Service.PaymentSentRecurringInit":"You successfully transferred **%1$@** to **%2$@** for **%3$@** and allowed future recurring payments","Chat.Service.PaymentSentRecurringInitNoTitle":"You successfully transferred **%1$@** to **%2$@** and allowed future recurring payments","Chat.Service.PaymentSentRecurringUsed":"You have just successfully transferred **%1$@** to **%2$@** for **%3$@** via recurrent payments","Chat.Service.PaymentSentRecurringUsedNoTitle":"You have just successfully transferred **%1$@** to **%2$@** via recurrent payments","Chat.Service.VoiceChatStarted":"%1$@ started a [video chat](open)","Chat.Service.VoiceChatStartedYou":"You started a [video chat](open)","Chat.Service.VoiceChatStarted.Channel":"[Live Stream](open) started","Chat.Service.VoiceChatFinished":"%1$@ ended the video chat (%2$@)","Chat.Service.VoiceChatFinishedYou":"You ended the video chat (%@)","Chat.Service.VoiceChatFinished.Channel":"Live Stream ended (%1$@)","Chat.Service.VoiceChatInvitation":"%1$@ invited %2$@ to the [video chat](open)","Chat.Service.VoiceChatInvitationByYou":"You invited %1$@ to the [video chat](open)","Chat.Service.VoiceChatInvitationForYou":"%1$@ invited you to the [video chat](open)","ChatService.UserJoinedGroupByRequest":"%@ was accepted to the group","ChatService.UserJoinedChannelByRequest":"%@ joined the channel by request","ChatList.Service.VoiceChatScheduled":"%1$@ scheduled a video chat for %2$@","ChatList.Service.VoiceChatScheduledYou":"You scheduled a video chat for %2$@","Chat.Poll.Unvote":"Retract Vote","Chat.Poll.Stop":"Stop Poll","Chat.Poll.ViewResults":"View Results","Chat.Poll.SubmitVote":"Vote","Chat.Poll.Type.Anonymous":"Anonymous Poll","Chat.Poll.Type.Public":"Poll","Chat.Poll.Type.AnonymousQuiz":"Anonymous Quiz","Chat.Poll.Type.Quiz":"Quiz","Chat.Poll.Type.Closed":"Final Results","Chat.Poll.TotalVotes1":{one_value:"%d vote",other_value:"%d votes"},"Chat.Quiz.TotalVotes":{one_value:"%d answer",other_value:"%d answers"},"Chat.Poll.TotalVotesEmpty":"No votes yet","Chat.Poll.TotalVotesResultEmpty":"No votes","Chat.Quiz.TotalVotesEmpty":"No answers yet","Chat.Quiz.TotalVotesResultEmpty":"No answers","Chat.Pinned.DontShow":"Don't Show Pinned Messages","Chat.Title.Comments":{one_value:"%d Comment",other_value:"%d Comments"},"ChatTitle.ReportMessages":"Report Messages","Chat.Send.WithoutSound":"Send Without Sound","Chat.Send.SetReminder":"Set a Reminder","Chat.Send.ScheduledMessage":"Schedule Message","Chat.SendAs.PersonalAccount":"personal account","Chat.UnpinAllMessagesConfirmation":{one_value:"Do you want to unpin %d message in this chat?",other_value:"Do you want to unpin all %d messages in this chat?"},"Chat.Message.Ad.Text":"Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\n\nUnlike other apps, Telegram doesn't track whether you tapped on a sponsored message and doesn't profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\n\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:\n\n%@\n\nSponsored Messages are currently in test mode. Once they are fully launched and allow Telegram to cover its basic costs, we will start sharing ad revenue with the owners of public channels in which sponsored messages are displayed.\n\nOnline ads should no longer be synonymous with abuse of user privacy. Let us redefine how a tech company should operate – together.","Chat.Message.Ad.ReadMore":"Read More","Chat.Message.ViewChannel":"VIEW CHANNEL","Chat.Message.ViewBot":"VIEW BOT","Chat.Message.ViewGroup":"VIEW GROUP","Chat.Message.Sponsored.What":"What are sponsored messages?","Chat.Message.Sponsored.Link":"https://promote.telegram.org","Checkout.2FA.Text":"Saving payment details is only available with 2-Step Verification.","Checkout.NewCard.CardholderNamePlaceholder":"Cardholder Name","Checkout.PasswordEntry.Title":"Payment Confirmation","Checkout.PasswordEntry.Pay":"Pay","Checkout.PasswordEntry.Text":"Your card %@ is on file. To pay with this card, please enter your 2-Step-Verification password.","Checkout.PayPrice":"Pay %@","Checkout.WebConfirmation.Title":"Complete Payment","ChatList.Context.Mute":"Mute","ChatList.Context.Unmute":"Unmute","ChatList.Context.Pin":"Pin","ChatList.Context.Unpin":"Unpin","ChatList.Context.DeleteChat":"Delete Chat","ChatList.Context.DeleteAndExit":"Delete and Leave","ChatList.Context.LeaveChannel":"Leave Channel","ChatList.Context.LeaveGroup":"Leave Group","ChatList.Service.Call.incoming":"Incoming Call (%@)","ChatList.Service.Call.outgoing":"Outgoing Call (%@)","ChatList.Service.VideoCall.incoming":"Incoming Video Call (%@)","ChatList.Service.VideoCall.outgoing":"Outgoing Video Call (%@)","ChatList.Service.Call.Cancelled":"Cancelled Call","ChatList.Service.Call.Missed":"Missed Call","ChatList.Service.VideoCall.Cancelled":"Cancelled Video Call","ChatList.Service.VideoCall.Missed":"Missed Video Call","ChatList.Service.VoiceChatScheduled.Channel":"Voice chat scheduled for %@","ChatList.Filter.Header":"Create folders for different groups of chats and quickly switch between them.","ChatList.Filter.NewTitle":"Create Folder","ChatList.Filter.List.Title":"Chat Folders","ChatList.Filter.Include.AddChat":"Add Chats","ChatList.Filter.Exclude.AddChat":"Add Chats","ChatList.Filter.Contacts":"Contacts","ChatList.Filter.NonContacts":"Non-Contacts","ChatList.Filter.Groups":"Groups","ChatList.Filter.Channels":"Channels","ChatList.Filter.Bots":"Bots","ChatList.Filter.MutedChats":"Muted","ChatList.Filter.ReadChats":"Read","ChatList.Filter.Archive":"Archived","ChatList.Filter.Include.LimitReached":"Sorry, you can only add up to 100 individual chats. Try using chat types.","ChatList.Filter.Exclude.LimitReached":"Sorry, you can only add up to 100 individual chats. Try using chat types.","ChatList.Filter.Confirm.Remove.Header":"Remove Folder","ChatList.Filter.Confirm.Remove.Text":"Are you sure you want to remove this folder? Your chats will not be deleted.","ChatList.Mute.1Hour":"For 1 Hour","ChatList.Mute.4Hours":"For 4 Hours","ChatList.Mute.8Hours":"For 8 Hours","ChatList.Mute.1Day":"For 1 Day","ChatList.Mute.3Days":"For 3 Days","ChatList.Mute.Forever":"Forever","Channel.DescriptionHolderDescrpiton":"You can provide an optional description for your channel.","ChannelVisibility.Confirm.MakePrivate.Channel":"If you make this channel private, the name @%@ will be removed. Anyone else will be able to take it for their public groups or channels.","ChannelVisibility.Confirm.MakePrivate.Group":"If you make this group private, the name @%@ will be removed. Anyone else will be able to take it for their public groups or channels.","Context.ViewStickerSet":"View Sticker Set","CreateGroup.NameHolder":"Group Name","CustomEmoji.PremiumAlert":"Subscribe to Telegram Premium to unlock this emoji. [Read More]()","Date.Today":"Today","DeleteChat.DeleteGroupForAll":"Delete for all members",DeleteChannelForAll:"Delete for all subscribers","ForumTopic.Context.Info":"Group Info","ForumTopic.Context.AddMember":"Add Members","ForumTopic.Context.ShowAsMessages":"View as Messages","ForumTopic.Context.New":"Create Topic","ForumTopic.Name.Placeholder":"Topic Name","ForumTopic.Title.Edit":"Edit Topic","EditAccount.Username":"Username","EditAccount.Title":"Edit Profile","EditAccount.Logout":"Log Out","Emoji.Recent":"Frequently Used","Emoji.SmilesAndPeople":"Smileys & People","Emoji.AnimalsAndNature":"Animals & Nature","Emoji.FoodAndDrink":"Food & Drink","Emoji.ActivityAndSport":"Activity & Sport","Emoji.TravelAndPlaces":"Travel & Places","Emoji.Objects":"Objects","Emoji.Flags":"Flags","Error.AnError":"An error occurred. Please try again later.","FileSize.B":"%@ B","FileSize.KB":"%@ KB","FileSize.MB":"%@ MB","FileSize.GB":"%@ GB","InstalledStickers.LoopAnimated":"Loop Animated Stickers","LastSeen.HoursAgo":{one_value:"last seen %d hour ago",other_value:"last seen %d hours ago"},"Login.Register.LastName.Placeholder":"Last Name","Message.Context.Select":"Select","Message.Context.Pin":"Pin","Message.Context.Unpin":"Unpin","Message.Context.Goto":"Show Message","Message.ReplyActionButtonShowReceipt":"Show Receipt","MessageContext.CopyMessageLink1":"Copy Message Link","Modal.Send":"Send","NewContact.Exception.ShareMyPhoneNumber":"Share My Phone Number","NewContact.Exception.ShareMyPhoneNumber.Desc":"You can make your phone visible to %@.","NewPoll.Anonymous":"Anonymous Voting","NewPoll.Explanation.Placeholder":"Add a Comment (Optional)","NewPoll.OptionsAddOption":"Add an Option","NewPoll.MultipleChoice":"Multiple Answers","NewPoll.Quiz":"Quiz Mode","Notification.Contact.Reacted":'%1$@ to your "%2$@"',"Payments.Recurrent.Accept":"I accept [Terms of Service]() of **%@**.","Peer.Activity.User.PlayingGame":"playing a game","Peer.Activity.User.TypingText":"typing","Peer.Activity.User.SendingPhoto":"sending a photo","Peer.Activity.User.RecordingVideo":"recording video","Peer.Activity.User.SendingVideo":"sending a video","Peer.Activity.User.RecordingAudio":"recording voice","Peer.Activity.User.SendingFile":"sending file","Peer.Activity.User.ChoosingSticker":"choosing a sticker","Peer.Activity.User.EnjoyingAnimations":"watching %@","Peer.Activity.Chat.PlayingGame":"%@ is playing a game","Peer.Activity.Chat.TypingText":"%@ is typing","Peer.Activity.Chat.SendingPhoto":"%@ is sending a photo","Peer.Activity.Chat.RecordingVideo":"%@ is recording video","Peer.Activity.Chat.SendingVideo":"%@ is sending a video","Peer.Activity.Chat.RecordingAudio":"%@ is recording voice","Peer.Activity.Chat.SendingFile":"%@ is sending a file","Peer.Activity.Chat.ChoosingSticker":"%@ is choosing a sticker","Peer.Activity.Chat.EnjoyingAnimations":"%@ is watching %@","Peer.Activity.Chat.Multi.PlayingGame1":"%@ and %d others are playing a game","Peer.Activity.Chat.Multi.TypingText1":"%@ and %d others are typing","Peer.Activity.Chat.Multi.SendingPhoto1":"%@ and %d others are sending photos","Peer.Activity.Chat.Multi.RecordingVideo1":"%@ and %d others are recording video","Peer.Activity.Chat.Multi.SendingVideo1":"%@ and %d others are sending videos","Peer.Activity.Chat.Multi.RecordingAudio1":"%@ and %d others are recording voice","Peer.Activity.Chat.Multi.SendingFile1":"%@ and %d others are sending files","Peer.Activity.Chat.Multi.ChoosingSticker1":"%@ and %d others are choosing stickers","Peer.ServiceNotifications":"service notifications","Peer.RepliesNotifications":"Reply Notifications","Peer.Status.justNow":"last seen just now","Peer.Status.Today":"today","Peer.Status.Yesterday":"yesterday","Peer.Status.LastSeenAt":"last seen %@ at %@","Peer.Status.minAgo":{one_value:"last seen %d minute ago",other_value:"last seen %d minutes ago"},"Peer.Status.Member":{one_value:"%d member",other_value:"%d members"},"Peer.Status.Subscribers":{one_value:"%d subscriber",other_value:"%d subscribers"},"PeerInfo.Administrators":"Administrators","PeerInfo.DeleteChannel":"Delete Channel","PeerInfo.Discussion":"Discussion","PeerInfo.Discussion.Add":"Add","PeerInfo.SharedMedia":"Shared Media","PeerInfo.Subscribers":"Subscribers","PeerInfo.DeleteContact":"Delete Contact","PeerInfo.Action.VoiceChat":"Video Chat","PeerInfo.Action.LiveStream":"Live Stream","PeerInfo.Phone.AnonymousInfo":"This number is not tied to a SIM card and was acquired on [Fragment]().","PeerMedia.Members":"Members","PollResults.Title.Poll":"Poll Results","PollResults.Title.Quiz":"Quiz Results","PollResults.LoadMore":{other_value:"Show More (%d)"},"Preview.Dragging.AddItems":{one_value:"Add Item",other_value:"Add Items"},"PreviewSender.CaptionPlaceholder":"Add a caption...","PreviewSender.CompressFile":"Send compressed","PreviewSender.SendFile":{one_value:"Send File",other_value:"Send %d Files"},"PreviewSender.SendPhoto":{one_value:"Send Photo",other_value:"Send %d Photos"},"PreviewSender.SendVideo":{one_value:"Send Video",other_value:"Send %d Videos"},"PrivacyAndSecurity.Item.On":"On","PrivacyAndSecurity.Item.Off":"Off","PrivacyAndSecurity.SensitiveText":"Disable filtering","PrivacyAndSecurity.SensitiveDesc":"Display sensitive media in public channels on all your Telegram devices.","PrivacySettings.VoiceCalls":"Calls","PrivacySettings.Forwards":"Forwarded Messages","PrivacySettings.Groups":"Groups and Channels","PrivacySettingsController.AddUsers":"Add Users","PrivacySettingsController.GroupDescription":"You can restrict who can add you to groups and channels with granular precision.","PrivacySettingsController.Forwards.CustomHelp":"You can restrict who can add a link to your account when forwarding your messages.","PrivacySettingsController.P2p.Desc":"Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio and video quality.","PrivacySettingsController.PhoneCallDescription":"You can restrict who can call you with granular precision.","PrivacySettingsController.ProfilePhoto.CustomHelp":"You can restrict who can see your profile photo with granular precision.","PrivacySettingsController.LastSeenDescription":"You won't see Last Seen and Online statuses for people with whom you don't share yours. Approximate last seen will be shown instead (recently, within a week, within a month).","PrivacySettingsController.PeerInfo":"You can add users or entire groups as exceptions that will override the settings above.","PrivacySettingsController.Everbody":"Everybody","PrivacySettingsController.MyContacts":"My Contacts","PrivacySettingsController.Nobody":"Nobody","PrivacySettingsController.NeverShare":"Never Share With","PrivacySettingsController.AlwaysShare":"Always Share With","PrivacySettingsController.NeverAllow":"Never Allow","PrivacySettingsController.AlwaysAllow":"Always Allow","PrivacySettingsController.UserCount":{one_value:"%d user",other_value:"%d users"},"RecentSessions.Error.FreshReset":"For security reasons, you can't terminate older sessions from a device that you've just connected. Please use an earlier connection or wait for a few hours.","RequestJoin.Button":"Request to Join","Stickers.SearchAdd":"Add","Stickers.SearchAdded":"Added","Stickers.SuggestStickers":"Suggest Stickers by Emoji","ShareModal.Search.Placeholder":"Share to...","ShareModal.Search.ForwardPlaceholder":"Forward to...","Telegram.GeneralSettingsViewController":"General Settings","Telegram.InstalledStickerPacksController":"Stickers","Telegram.NotificationSettingsViewController":"Notifications","Telegram.LanguageViewController":"Language","Text.CopyLabel_About":"Copy About","Text.CopyLabel_Bio":"Copy Bio","Text.CopyLabel_PhoneNumber":"Copy Phone Number","Text.CopyLabel_Username":"Copy Username","Text.CopyLabel_ShareLink":"Copy Share Link","GeneralSettings.BigEmoji":"Large Emoji","GeneralSettings.EmojiPrediction":"Suggest Emoji","GroupPermission.Delete":"Delete Exception","Search.Confirm.ClearHistory":"Are you sure you want to clear your search history?","SecureId.Identity.Placeholder.ExpiryDate":"Expiry Date","Separator.ShowMore":"show more","Separator.ShowLess":"show less","ScheduleController.at":"at","Schedule.SendToday":"Send today at %@","Schedule.SendDate":"Send on %@ at %@","Schedule.SendWhenOnline":"Send When Online","Sticker.Premium.Click.Info":"This pack contains premium stickers like this one. [View Pack]()","Stickers.Recent":"Recent","StickerSet.DontExist":"Sorry, this sticker set doesn't seem to exist.","Text.Context.Copy.Username":"Copy Username","Text.Context.Copy.Hashtag":"Copy Hashtag","Time.TomorrowAt":"tomorrow at %@","TwoStepAuth.SetPasswordHelp":"You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.","TwoStepAuth.GenericHelp":"You have enabled Two-Step verification.\nYou'll need the password you set up here to log in to your Telegram account.","TwoStepAuth.ChangePassword":"Change Password","TwoStepAuth.RemovePassword":"Turn Password Off","TwoStepAuth.SetupEmail":"Set Recovery Email","TwoStepAuth.ChangeEmail":"Change Recovery Email","TwoStepAuth.ConfirmEmailCodeDesc":"Please enter the code we've just emailed to %@.","TwoStepAuth.RecoveryTitle":"Email Code","TwoStepAuth.RecoveryCode":"Code","TwoStepAuth.RecoveryCodeInvalid":"Invalid code. Please try again.","TwoStepAuth.RecoveryCodeExpired":"Code Expired","TwoStepAuth.SetupHintTitle":"Password Hint","TwoStepAuth.SetupHintPlaceholder":"Hint","VoiceChat.Chat.StartNew":"Video chat ended. Start a new one?","VoiceChat.Chat.StartNew.OK":"Start","VoiceChat.Chat.Ended":"Video chat ended.","VoiceChat.Invite.InviteMembers":"Invite members","VoiceChat.Status.Connecting":"Connecting...","VoiceChat.Status.Members":{one_value:"%d participant",other_value:"%d participants"},"VoiceChat.Status.MutedForYou":"muted for you","VoiceChat.Status.Speaking":"speaking","VoiceChat.Status.Listening":"listening","VoiceChat.Status.WantsSpeak":"wants to speak","VoiceChat.Status.Muted":"muted","VoiceChat.Status.You":"This is you","VoiceChat.Video.Stream.Video":"video","VoiceChat.Video.Stream.Screencast":"screen","VoiceChat.Video.Stream.More":"more","VoiceChat.Leave":"Leave","VoiceChat.End.Title":"Leave video chat","VoiceChat.End.Text":"Are you sure you want to leave this video chat?","VoiceChat.End.Third":"End Video Chat","VoiceChat.End.OK":"Leave","VoiceChat.MutePeer":"Mute","VoiceChat.UnmutePeer":"Allow To Speak","VoiceChat.RemovePeer":"Remove","VoiceChat.OpenProfile":"Open Profile","VoiceChat.MuteForMe":"Mute For Me","VoiceChat.UnmuteForMe":"Unmute For Me","VoiceChat.RemovePeer.Confirm.Channel":"Do you want to remove %1$@ from the channel?","VoiceChat.RemovePeer.Confirm":"Are you sure you want to remove %1$@ from the group?","VoiceChat.RemovePeer.Confirm.OK":"Remove"}}}]); -//# sourceMappingURL=104.91dd6279f1f693880508.chunk.js.map \ No newline at end of file +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[104],{9104:(e,t,o)=>{o.r(t),o.d(t,{default:()=>a});const a={Animations:"Animations",AttachAlbum:"Album","Appearance.Color.Hex":"HEX","Appearance.Color.RGB":"RGB","BlockModal.Search.Placeholder":"Block user...",DarkMode:"Dark Mode",FilterIncludeExcludeInfo:"Choose chats and types of chats that will\nappear and never appear in this folder.",FilterMenuDelete:"Delete Folder",FilterHeaderEdit:"Edit Folder",FilterAllGroups:"All Groups",FilterAllContacts:"All Contacts",FilterAllNonContacts:"All Non-Contacts",FilterAllChannels:"All Channels",FilterAllBots:"All Bots","EditContact.OriginalName":"original name","EditProfile.FirstNameLabel":"Name","EditProfile.BioLabel":"Bio (optional)","EditProfile.Username.Label":"Username (optional)","EditProfile.Username.Available":"Username is available","EditProfile.Username.Taken":"Username is already taken","EditProfile.Username.Invalid":"Username is invalid","ExceptionModal.Search.Placeholder":"Add exception...","Chat.Menu.SelectMessages":"Select Messages","Chat.Menu.ClearSelection":"Clear Selection","Chat.Menu.Hint":"To **edit** or **reply**, close this menu.\nThen tap next to a message.","Chat.Input.UnpinAll":"Unpin All Messages","Chat.Input.Attach.PhotoOrVideo":"Photo or Video","Chat.Input.Attach.Document":"Document","Chat.Subscribe":"SUBSCRIBE","Chat.Selection.LimitToast":"Max selection count reached.","Chat.Search.MessagesFound":{one_value:"%d message found",other_value:"%d messages found"},"Chat.Search.NoMessagesFound":"No messages found","Chat.Search.PrivateSearch":"Private Search","Chat.Service.TopicEdited.Mixed":"%1$@ changed the topic name and icon to %2$@","Chat.Service.TopicEdited.You.Mixed":"You changed the topic name and icon to %2$@","Chat.Service.TopicEdited.Mixed.IconRemoved":'%1$@ changed the topic name to "%1$@" and removed icon',"Chat.Service.TopicEdited.You.Mixed.IconRemoved":'You changed the topic name to "%1$@" and removed icon',"ChatList.Main.EmptyPlaceholder.Title":"Your chats will appear here","ChatList.Main.EmptyPlaceholder.Subtitle":"You have %s on Telegram","ChatList.Main.EmptyPlaceholder.SubtitleNoContacts":"Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts","ChatList.Menu.SwitchTo.Webogram":"Switch to Old Version","ChatList.Menu.SwitchTo.Z":"Switch to Z version","ChatMigration.From":"Migrated from %s","ChatMigration.To":"Migrated to %s","ConnectionStatus.ForceReconnect":"force reconnect","ConnectionStatus.ReconnectIn":"Reconnect in %ds, %s","ConnectionStatus.Reconnect":"reconnect","ConnectionStatus.Reconnecting":"Reconnecting...","ConnectionStatus.TimedOut":"Request timed out, %s","ConnectionStatus.Waiting":"Waiting for network...","Contacts.Count":{one_value:"%d contact",other_value:"%d contacts"},"Deactivated.Title":"Too many tabs...","Deactivated.Subtitle":"Telegram supports only one active tab with the app.\nClick anywhere to continue using this tab.","Deactivated.Version.Title":"WebK has updated...","Deactivated.Version.Subtitle":"Another tab is running a newer version of Telegram.\nClick anywhere to reload this tab.","General.Keyboard":"Keyboard","General.SendShortcut.Enter":"Send by Enter","General.SendShortcut.CtrlEnter":"Send by %s + Enter","General.SendShortcut.NewLine.ShiftEnter":"New line by Shift + Enter","General.SendShortcut.NewLine.Enter":"New line by Enter","General.TimeFormat":"Time Format","General.TimeFormat.h12":"12-hour","General.TimeFormat.h23":"24-hour","ChatBackground.UploadWallpaper":"Upload Wallpaper","ChatBackground.Blur":"Blur Wallpaper Image","Notifications.Sound":"Notification Sound",NewPrivateChat:"New Private Chat","NewPoll.OptionLabel":"Option %d","Message.Context.Selection.Copy":"Copy selected","Message.Context.Selection.Clear":"Clear selection","Message.Context.Selection.Delete":"Delete selected","Message.Context.Selection.Forward":"Forward selected","Message.Context.Selection.SendNow":"Send Now selected","Message.Unsupported.Desktop":"__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__","Message.Unsupported.Mobile":"__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__","Checkbox.Enabled":"Enabled","Checkbox.Disabled":"Disabled","Error.PreviewSender.CaptionTooLong":"Caption is too long.","PreviewSender.GroupItems":"Group items","PreviewSender.SendAlbum":{one_value:"Send Album",other_value:"Send %d Albums"},"Presence.YourChat":"chat with yourself","Privacy.Devices":{one_value:"%1$d device",other_value:"%1$d devices"},"Privacy.Websites":{one_value:"%1$d website",other_value:"%1$d websites"},"Privacy.SensitiveContent":"Sensitive Content","PrivacyModal.Search.Placeholder":"Add Users or Groups...","Permissions.NoExceptions":"No exceptions","Permissions.ExceptionsCount":{one_value:"%d exception",other_value:"%d exceptions"},"Link.Available":"Link is available","Link.Taken":"Link is already taken","Link.Invalid":"Link is invalid","StickersTab.SearchPlaceholder":"Search Stickers",ForwardedFrom:"Forwarded from %s","Popup.Avatar.Title":"Drag to Reposition","Popup.Unpin.AllTitle":"Unpin all messages","Popup.Unpin.HideTitle":"Hide pinned messages","Popup.Unpin.HideDescription":"Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.","Popup.Unpin.Hide":"Hide","TwoStepAuth.EmailCodeChangeEmail":"Change Email","MarkupTooltip.LinkPlaceholder":"Enter URL...","MediaViewer.Context.Download":"Download",Profile:"Profile",Saved:"Saved",Deleted:"Deleted",ReportBug:"Report Bug","Notifications.Count":{one_value:"%d notification",other_value:"%d notifications"},"Notifications.Forwarded":{one_value:"Forwarded %d message",other_value:"Forwarded %d messages"},"Notifications.New":"New notification","PushNotification.Action.Mute1d":"Mute background alerts for 1 day","PushNotification.Action.Settings":"Background alerts settings","PushNotification.Action.Mute1d.Mobile":"Mute for 24H","PushNotification.Action.Settings.Mobile":"Alerts settings","PushNotification.Message.NoPreview":"You have a new message","LogOut.Description":"Are you sure you want to log out?\n\nNote that you can seamlessly use Telegram on all your devices at once.","VoiceChat.DiscussionGroup":"discussion group","PaymentInfo.CVV":"CVV Code","PaymentInfo.Card.Title":"Enter your card information","PaymentInfo.Billing.Title":"Enter your billing address","PaymentInfo.Done":"PROCEED TO CHECKOUT","PaymentCard.Error.Invalid":"Invalid card number","PaymentCard.Error.Incomplete":"Incomplete card number","LimitReached.Ok":"OK, GOT IT","Username.Purchase":"**This username is already taken.** However, it is currently available for purchase. [Learn more…]()","Video.Unsupported.Desktop":"__Unfortunately, this video can't be played on Telegram Web. Try opening it with our [desktop app](https://getdesktop.telegram.org/) instead.__","Video.Unsupported.Mobile":"__Unfortunately, this video can't be played on Telegram Web. Try opening it with our [mobile app](https://telegram.org/dl/) instead.__",AccDescrEditing:"Editing",ActionCreateChannel:"Channel created",ActionCreateGroup:"un1 created the group",ActionChangedTitle:"un1 changed the group name to un2",ActionRemovedPhoto:"un1 removed the group photo",ActionChangedPhoto:"un1 changed the group photo",ActionChangedVideo:"un1 changed the group video",ActionAddUser:"un1 added un2",ActionAddUserSelf:"un1 returned to the group",ActionAddUserSelfYou:"You returned to the group",ActionAddUserSelfMega:"un1 joined the group",ActionLeftUser:"un1 left the group",ActionKickUser:"un1 removed un2",ActionInviteUser:"un1 joined the group via invite link",ActionPinnedNoText:"un1 pinned a message",ActionMigrateFromGroup:"This group was upgraded to a supergroup",ActionYouScored:"You scored %1$s",ActionUserScored:"un1 scored %1$s",ActionYouScoredInGame:"You scored %1$s in un2",ActionUserScoredInGame:"un1 scored %1$s in un2",AndOther:{one_value:"and %1$d other",other_value:"and %1$d others"},AttachPhoto:"Photo",AttachVideo:"Video",AttachGif:"GIF",AttachLocation:"Location",AttachLiveLocation:"Live Location",AttachContact:"Contact",AttachSticker:"Sticker",AttachAudio:"Voice message",AttachRound:"Video message",AttachGame:"Game",Bot:"bot",ChannelMegaJoined:"You joined this group",EnterChannelName:"Channel name",DescriptionOptionalPlaceholder:"Description (optional)",DescriptionPlaceholder:"Description",DiscussionStarted:"Discussion started",Draft:"Draft",FilterAlwaysShow:"Include Chats",FilterNeverShow:"Exclude Chats",FilterInclude:"Included Chats",FilterExclude:"Excluded Chats",FilterChatTypes:"Chat types",FilterChats:"Chats",FilterNew:"New Folder",Filters:"Folders",FilterRecommended:"Recommended Folders",FilterShowMoreChats:{one_value:"Show %1$d More Chat",other_value:"Show %1$d More Chats"},ForwardedMessageCount:{one_value:"Forwarded message",other_value:"%1$d forwarded messages"},FromYou:"You",Add:"Add",Chats:{one_value:"%1$d chat",other_value:"%1$d chats"},Channels:{one_value:"%1$d channel",other_value:"%1$d channels"},Comments:{one_value:"%1$d Comment",other_value:"%1$d Comments"},Groups:{one_value:"%1$d group",other_value:"%1$d groups"},Users:{one_value:"%1$d user",other_value:"%1$d users"},Members:{one_value:"%1$d member",other_value:"%1$d members"},messages:{one_value:"%1$d message",other_value:"%1$d messages"},UsernameHelpLink:"This link opens a chat with you:\n%1$s",NewChannel:"New Channel",NewGroup:"New Group",Contacts:"Contacts",SavedMessages:"Saved Messages",Settings:"Settings",SettingsHelp:"Help",General:"General",TextSize:"Message Text Size",ChatBackground:"Chat Background",EnableAnimations:"Enable Animations",AutoDownloadMedia:"Auto-Download Media",AutodownloadContacts:"Contacts",AutodownloadPrivateChats:"Private Chats",AutodownloadGroupChats:"Group Chats",AutodownloadChannels:"Channels",AutoplayGIF:"GIFs",AutoplayVideo:"Videos",NotificationsForGroups:"Notifications for groups",NotificationsForPrivateChats:"Notifications for private chats",NotificationsForChannels:"Notifications for channels",NotificationsPrivateChats:"Private Chats",NotificationsGroups:"Groups",NotificationsChannels:"Channels",NotificationsOther:"Other",MarkAsUnread:"Mark as unread",MarkAsRead:"Mark as read",ContactJoined:"Contact joined Telegram",Loading:"Loading...",Unblock:"Unblock",BlockedUsers:"Blocked Users",BlockedUsersInfo:"Blocked users will not be able to contact you and will not see your Last Seen time.",BlockedEmpty:"None",TwoStepVerification:"Two-Step Verification",TwoStepVerificationTitle:"Two-Step Verification",PinnedMessage:"Pinned Message",PinnedMessagesCount:{one_value:"Pinned Message",other_value:"%1$d Pinned Messages"},PrivacyExceptions:"Exceptions",PrivacyLastSeen:"Last Seen & Online",PrivacySettings:"Privacy and Security",PrivacyTitle:"Privacy",PrivacyPhone:"Phone Number",PrivacyPhoneTitle:"Who can see my phone number?",PrivacyPhoneTitle2:"Who can find me by my number?",PrivacyPhoneInfo:"Users who have your number saved in their contacts will also see it on Telegram.",PrivacyPhoneInfo3:"Users who add your number to their contacts will see it on Telegram only if they are your contacts.",PrivacyProfilePhoto:"Profile Photos",PrivacyProfilePhotoTitle:"Who can see my profile photos & videos?",PrivacyP2PHeader:"Peer-to-Peer",PrivacyForwardsTitle:"Who can add a link to my account when forwarding my messages?",Reminders:"Reminders",ScheduledMessages:"Scheduled Messages",LastSeenTitle:"Who can see your Last Seen time?",SessionsTitle:"Active Sessions",CurrentSession:"This device",TerminateAllSessions:"Terminate All Other Sessions",TerminateSessionText:"Are you sure you want to terminate this session?",OtherSessions:"Active sessions",AreYouSureDeleteSingleMessage:"Are you sure you want to delete this message?",AreYouSureDeleteFewMessages:"Are you sure you want to delete these messages?",AreYouSureDeleteSingleMessageMega:"Are you sure you want to delete this message for everyone?",AreYouSureDeleteFewMessagesMega:"Are you sure you want to delete these messages for everyone?",AreYouSureDeleteAndExitName:"Are you sure you want to delete and leave the group **%1$s**?",AreYouSureDeleteThisChatSavedMessages:"Are you sure you want to delete **Saved Messages**?",AreYouSureDeleteThisChatWithUser:"Are you sure you want to delete the chat with **%1$s**?",AreYouSureSessionTitle:"Terminate session",AreYouSureSessionsTitle:"Terminate sessions",AreYouSureSessions:"Are you sure you want to terminate all other sessions?",Terminate:"Terminate",WhoCanCallMe:"Who can call me?",WhoCanAddMe:"Who can add me to group chats?",ArchivedChats:"Archived Chats",Cancel:"Cancel",HistoryCleared:"History was cleared",Archive:"Archive",Unarchive:"Unarchive",Delete:"Delete",Reply:"Reply",Edit:"Edit",Forward:"Forward",CopyLink:"Copy Link",Copy:"Copy",Search:"Search",LinkCopied:"Link copied to clipboard",LinkCopiedPrivateInfo:"This link will only work for members of this chat.",GroupAddMembers:"Add Members",SendMessageTo:"Add people...",JumpToDate:"Jump to Date",Caption:"Caption",Message:"Message",Poll:"Poll",SharedFilesTab2:"Files",SharedMediaTab2:"Media",SharedLinksTab2:"Links",SharedMusicTab2:"Music",SharedVoiceTab2:"Voice",NewPoll:"New Poll",PollOptions:"Poll options",AskAQuestion:"Ask a Question",AddAnExplanationInfo:"Users will see this text after choosing the wrong answer, good for educational purposes.",AccDescrQuizExplanation:"Explanation",PhoneCopied:"Phone copied to clipboard",UsernameCopied:"Username copied to clipboard.",BioCopied:"Bio copied to clipboard.",UserBio:"Bio",Username:"Username",UsernameAlso:"also %1$s",UsernameHelp:"You can choose a username on **Telegram**. If you do, people will be able to find you by this username and contact you without needing your phone number.\n\nYou can use **a–z**, **0–9** and underscores. Minimum length is **5** characters.",Phone:"Phone",Notifications:"Notifications",AreYouSureDeleteContact:"Are you sure you want to delete this contact?",AreYouSureDeleteAndExit:"Are you sure you want to delete and leave the group?",AreYouSureDeleteAndExitChannel:"Do you want to delete and leave the channel?",DeleteContact:"Delete contact",GroupType:"Group Type",ChannelType:"Channel Type",TypePrivate:"Private",TypePublic:"Public",TypePrivateGroup:"Private",TypePublicGroup:"Public",GroupMembers:"Members",DeleteMega:"Delete Group",DeleteMegaMenu:"Delete group",DeleteAndExitButton:"Delete and Leave Group",ChannelDelete:"Delete Channel",ChannelDeleteMenu:"Delete channel",ChannelPermissions:"Permissions",ChannelPermissionsHeader:"What can members of this group do?",ChannelAddException:"Add Exception",ChannelBlockedUsers:"Removed users",NoBlockedUsers:"No removed users",UserRestrictions:"User Permissions",UserRestrictionsDisabled:"This option is disabled for all members in Group Permissions",UserRestrictionsCanDo:"What can this user do?",UserRestrictionsRead:"Read Messages",UserRestrictionsSend:"Send Messages",UserRestrictionsSendMedia:"Send Media",UserRestrictionsSendPolls:"Send Polls",UserRestrictionsSendStickers:"Send Stickers and GIFs",UserRestrictionsEmbedLinks:"Embed Links",UserRestrictionsChangeInfo:"Change Chat Info",UserRestrictionsPinMessages:"Pin Messages",UserRestrictionsInviteUsers:"Add Users",UserRestrictionsNoSend:"can't send messages",UserRestrictionsNoSendMedia:"no media",UserRestrictionsNoSendPolls:"no polls",UserRestrictionsNoSendStickers:"no stickers & GIFs",UserRestrictionsNoEmbedLinks:"no embed links",UserRestrictionsNoChangeInfo:"can't change Info",UserRestrictionsNoPinMessages:"no pins",UserRestrictionsNoInviteUsers:"can't add users",UserRestrictionsBlock:"Ban and remove from group",ChannelPublic:"Public Channel",MegaPublic:"Public Group",ChannelPublicInfo:"Public channels can be found in search, anyone can join them.",MegaPublicInfo:"Public groups can be found in search, chat history is available to everyone and anyone can join.",ChannelPrivate:"Private Channel",MegaPrivate:"Private Group",ChannelPrivateInfo:"Private channels can only be joined via an invite link.",MegaPrivateInfo:"Private groups can only be joined if you were invited or have an invite link.",ChannelPrivateLinkHelp:"People can join your channel by following this link. You can revoke the link any time.",MegaPrivateLinkHelp:"People can join your group by following this link. You can revoke the link any time.",RevokeButton:"Revoke",RevokeLink:"Revoke Link",RevokeAlert:"Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it.",SetUrlPlaceholder:"Link",Subscribers:{one_value:"%1$d subscriber",other_value:"%1$d subscribers"},SearchGifsTitle:"Search GIFs",PinMessageAlert:"Pin this message in the group?",PinMessageAlertTitle:"Pin message",PinMessageAlertChannel:"Do you want to pin this message in this channel?",PinMessageAlertChat:"Do you want to pin this message at the top of the chat?",UnpinMessageAlertTitle:"Unpin message",UnpinMessageAlert:"Do you want to unpin this message?",PinNotify:"Notify all members",PinMessage:"Pin",UnpinMessage:"Unpin",PinAlsoFor:"Also pin for %1$s",DeleteMessagesTitle:"Delete %1$s",DeleteSingleMessagesTitle:"Delete message",DeleteMessagesOption:"Unsend My Messages",DeleteMessagesOptionAlso:"Also delete for %1$s",DeleteForAll:"Delete for all members",DeleteMessagesTextGroup:'You can also delete the %1$s you sent from the inboxes of other group members by checking "Unsend my messages".',LeaveChannel:"Leave Channel",LeaveChannelMenu:"Leave channel",ChannelLeaveAlertWithName:"Are you sure you want to leave **%1$s**?",LeaveMegaMenu:"Leave group",DeleteChatUser:"Delete chat",PleaseEnterCurrentPassword:"Enter your password",PleaseEnterFirstPassword:"Enter a password",PleaseReEnterPassword:"Re-enter your password",Continue:"Continue",YourEmailSkip:"Skip",YourEmailSkipWarning:"Warning",YourEmailSkipWarningText:"No, seriously.\n\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it.",TurnPasswordOffQuestionTitle:"Disable password",TurnPasswordOffQuestion:"Are you sure you want to disable your password?",Disable:"Disable",TwoStepVerificationSetPassword:"Set Password",TwoStepVerificationPasswordSet:"Password Set!",TwoStepVerificationPasswordSetInfo:"This password will be required when you log in on a new device in addition to the code you get in the SMS.",TwoStepVerificationPasswordReturnSettings:"Return to Settings",RecoveryEmail:"Recovery email",RecoveryEmailTitle:"Recovery Email",ResendCode:"Resend code",PasswordAsHintError:"Hint must be different from your password",AddStickersCount:"ADD %1$s",RemoveStickersCount:"REMOVE %1$s",Stickers:{one_value:"%1$d sticker",other_value:"%1$d stickers"},HidAccount:"The account was hidden by the user",TelegramFeatures:"Telegram Features",SetColor:"Set a color",Open:"Open",OpenUrlTitle:"Open Link",OpenUrlAlert2:"Do you want to open %1$s?",FilterNoChatsToDisplay:"Folder is empty",FilterNoChatsToDisplayInfo:"No chats currently belong to this folder.",SupportStatus:"support",Lately:"last seen recently",WithinAWeek:"last seen within a week",WithinAMonth:"last seen within a month",ALongTimeAgo:"last seen a long time ago",Online:"online",MessageScheduleSend:"Send Now",MessageScheduleEditTime:"Reschedule",YouLeft:"You left this group",Recent:"Recent",Of:"%1$d of %2$d",NoResult:"No results",Updating:"Updating...",Emoji:"Emoji",AddContactTitle:"Add Contact",HiddenName:"Deleted Account",Seconds:{one_value:"%1$d second",other_value:"%1$d seconds"},Minutes:{one_value:"%1$d minute",other_value:"%1$d minutes"},Hours:{one_value:"%1$d hour",other_value:"%1$d hours"},Days:{one_value:"%1$d day",other_value:"%1$d days"},Weeks:{one_value:"%1$d week",other_value:"%1$d weeks"},Months:{one_value:"%1$d month",other_value:"%1$d months"},Years:{one_value:"%1$d year",other_value:"%1$d years"},TodayAtFormattedWithToday:"today at %1$s",formatDateAtTime:"%1$s at %2$s",JoinByPeekChannelTitle:"Join Channel",JoinByPeekGroupTitle:"Join Group",YouWereKicked:"you were removed",ViaBot:"via",InviteExpired:"This invite link has expired.",NoUsernameFound:"There is no Telegram account with this username.",PrivacyDeleteCloudDrafts:"Delete All Cloud Drafts",AreYouSureClearDraftsTitle:"Delete cloud drafts",AreYouSureClearDrafts:"Are you sure you want to delete all cloud drafts?",BotInfoTitle:"What can this bot do?",ChatYourSelf:"forward here to save",GroupEmptyTitle1:"You have created a **group**.",GroupEmptyTitle2:"Groups can have:",GroupDescription1:"Up to 200,000 members",GroupDescription2:"Persistent chat history",GroupDescription3:"Public links such as t.me/title",GroupDescription4:"Admins with different rights",ChatYourSelfDescription1:"Forward messages here to save them",ChatYourSelfDescription2:"Send media and files to store them",ChatYourSelfDescription3:"Access this chat from any device",ChatYourSelfDescription4:"Use search to quickly find things",ChatYourSelfTitle:"Your cloud storage",ActionYouCreateGroup:"You created the group",NoMessages:"No messages here yet...",NoScheduledMessages:"No scheduled messages here yet...",NoMessagesGreetingsDescription:"Send a message or tap the greeting below.",InviteToGroupError:"Sorry, you can't add this user to groups because of user's privacy settings.",InviteToChannelError:"Sorry, you can't add this user to channels because of user's privacy settings.",AddMembersAlertTitle:"Add %1$s",AddOneMemberAlertTitle:"Add member",AddMembersAlertNamesText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersAlertCountText:"Are you sure you want to add %1$s to **%2$s**?",AddMembersForwardMessages:"Show the last 100 messages to the new members",AddOneMemberForwardMessages:"Show the last 100 messages to **%1$s**",PinToTopLimitReached2:"Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.",FiltersSetupPinAlert:"Set Up Folders",AppName:"Telegram",OK:"OK",PinFolderLimitReached:"Sorry, you can't pin any more chats to the top.",Send:"Send",ChannelJoin:"JOIN",Yesterday:"yesterday",LeaveAComment:"Leave a comment",ViewInChat:"View in chat",LinkNotFound:"Unfortunately, you can't access this message. You are not a member of the chat where it was posted.",Create:"Create",ViewDiscussion:"View discussion",MessageScheduledUntilOnline:"Scheduled until online",ReportChat:"Report",ReportChatSpam:"Spam",ReportChatViolence:"Violence",ReportChatPornography:"Pornography",ReportChatChild:"Child Abuse",ReportChatOther:"Other",ReportChatDescription:"Description",ReportInfo:"Please enter any additional details relevant to your report.",ReportSentInfo:"Telegram moderators will review your report.\nThank you for your cooperation!",ReportHint:"Additional details...",ChatHistory:"Chat history for new members",ShareContact:"Share contact",SendMessageTitle:"Send message",SendContactToGroupText:"Do you want to send this contact to **%1$s**?",ChannelBroadcast:"Broadcast",ChannelSilentBroadcast:"Silent Broadcast",Comment:"Comment",SendAnonymously:"Send anonymously",DiscardVoiceMessageTitle:"Discard Voice Message",DiscardVoiceMessageDescription:"Are you sure you want to stop recording and discard your voice message?",DiscardVoiceMessageAction:"Discard",AddContact:"Add to contacts",BlockUser:"Block user",MobileHidden:"Mobile hidden",MobileHiddenExceptionInfo:"Phone number will be visible once %1$s adds you as a contact.",FirstName:"First name (required)",LastName:"Last name (optional)",AreYouSureBlockContact2:"Are you sure you want to block **%1$s**?",UserBlocked:"User blocked",UserUnblocked:"User unblocked",AudioUnknownArtist:"Unknown artist",AudioUnknownTitle:"Unknown title",LogOut:"Log out",OnlineCount:{one_value:"%1$d online",other_value:"%1$d online"},EditedMessage:"edited",GlobalSearch:"Global search",SearchMessages:"Messages",SearchAllChatsShort:"Chats",ClearButton:"Clear",FilterAllChats:"All Chats",FilterAllChatsShort:"All",Call:"Call",VideoCall:"Video Call",CallMessageOutgoing:"Outgoing Call",CallMessageIncoming:"Incoming Call",CallMessageVideoOutgoing:"Outgoing Video Call",CallMessageVideoIncoming:"Incoming Video Call",VoipExchangingKeys:"Exchanging encryption keys",VoipUnmute:"Unmute",SavingContentTitle:"Saving content",RestrictSavingContent:"Restrict saving content",RestrictSavingContentInfoGroup:"Members won't be able to copy, save and forward content from this group.",RestrictSavingContentInfoChannel:"Subscribers won't be able to copy, save and forward content from this channel.",ClearOtherSessionsHelp:"Logs out all devices except for this one.",SessionsListInfo:"The official Telegram app is available for Android, iPhone, iPad, Windows, macOS and Linux.",SponsoredMessage:"sponsored",OpenChannelPost:"VIEW POST",FilterNameHint:"Folder name",BotStart:"START",BotUnblock:"RESTART",BotStop:"Stop bot",BotRestart:"Restart bot",ShareYouPhoneNumberTitle:"Share your phone number?",AreYouSureShareMyContactInfoBot:"The bot will know your phone number. This can be useful for integration with other services.",DistanceUnitsTitle:"Distance units",DistanceUnitsKilometers:"Kilometers",DistanceUnitsMiles:"Miles",PeopleNearby:"People Nearby",MakeMyselfVisible:"Make Myself Visible",MakeMyselfVisibleTitle:"Show Your Profile?",MakeMyselfVisibleInfo:"Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\n\nYour phone number will remain hidden.",StopShowingMe:"Stop Showing Me",PeopleNearbyInfo2:"Exchange contact info with people nearby and find new friends.",NearbyCreateGroup:"Create a Local group",AwayTo:"%1$s away",MessagePreview:"Message Preview",KMetersAway2:"%1$s km away",MetersAway2:"%1$s m away",MilesAway:"%1$s mi away",FootsAway:"%1$s ft away",PeopleNearbyHeader:"People nearby",ChatsNearbyHeader:"Groups nearby",ChatLocation:"Location",RequestToJoinGroupDescription:"This group accepts new members only after they are approved by its admins.",RequestToJoinChannelDescription:"This channel accepts new subscribers only after they are approved by its admins.",RequestToJoinSent:"Join request sent",RequestToJoinGroupApproved:"Your request to join the group was approved",RequestToJoinChannelApproved:"Your request to join the channel was approved",Update:"UPDATE",Reactions:"Reactions",DoubleTapSetting:"Quick Reaction",EnableReactions:"Enable Reactions",EnableReactionsChannelInfo:"Allow subscribers to react to channel posts.",EnableReactionsGroupInfo:"Allow members to react to group messages.",AvailableReactions:"Available reactions",NobodyViewed:"Nobody viewed",MessageSeen:{one_value:"Seen",other_value:"%1$d Seen"},DataSettings:"Data and Storage",GroupsAndChannelsHelp:"Change who can add you to groups and channels.",SessionsInfo:"Control your sessions on other devices.",StickersBotInfo:"Artists are welcome to add their own sticker sets using our @stickers bot.",AutomaticMediaDownload:"Automatic media download",AutoDownloadPhotos:"Photos",AutoDownloadVideos:"Videos",AutoDownloadFiles:"Files",AutoDownloadOnAllChats:"On in all chats",AutoDownloadUpToOnAllChats:"Up to %1$s in all chats",AutoDownloadOff:"Off",AutoDownloadOnUpToFor:"Up to %1$s for %2$s",AutoDownloadOnFor:"On for %1$s",AutoDownloadContacts:"Contacts",AutoDownloadPm:"PM",AutoDownloadGroups:"Groups",AutoDownloadChannels:"Channels",AutoDownloadAudioInfo:"Voice messages are tiny, so they're always downloaded automatically.",AutoplayMedia:"Auto-play media",AutoDownloadPhotosTitle:"Auto-download photos",AutoDownloadVideosTitle:"Auto-download videos and GIFs",AutoDownloadFilesTitle:"Auto-download files and music",AutoDownloadMaxFileSize:"Maximum file size",AutodownloadSizeLimitUpTo:"up to %1$s",ResetAutomaticMediaDownload:"Reset Auto-Download Settings",ResetAutomaticMediaDownloadAlertTitle:"Reset settings",ResetAutomaticMediaDownloadAlert:"Are you sure you want to reset auto-download settings?",Reset:"Reset",SendMessageAsTitle:"Send message as...",Devices:"Devices",LanguageName:"English",EditCantEditPermissionsPublic:"This permission is not available in public groups.",VoipUserMicrophoneIsOff:"%s's microphone is off",VoipUserCameraIsOff:"%s's camera is off",PrivacyPhoneInfo4:"This public link opens a chat with you:",ReportChatIllegalDrugs:"Illegal Drugs",ReportChatPersonalDetails:"Personal Details",VoipPeerIncompatible:"**%1$s**'s app is using an incompatible protocol. They need to update their app before you can call them.",TelegramFeaturesUrl:"https://t.me/TelegramTips",ScamMessage:"SCAM",FakeMessage:"FAKE",TextCopied:"Text copied to clipboard",PaymentInvoice:"INVOICE",PaymentTestInvoice:"TEST INVOICE",PaymentReceipt:"Receipt",PaymentCheckout:"Checkout",PaymentTransactionTotal:"Total",PaymentTip:"Tip",PaymentTipOptional:"Tip (Optional)",PaymentCheckoutPay:"PAY %1$s",PaymentCheckoutMethod:"Payment method",PaymentCheckoutProvider:"Payment provider",PaymentCardNumber:"Card Number",PaymentCardSavePaymentInformation:"Save Payment Information",PaymentCardInfo:"Payment info",PaymentCardSavePaymentInformationInfoLine1:"You can save your payment info for future use. It will be stored directly with the payment provider. Telegram has no access to your credit card data.",Done:"Done",PaymentShippingMethod:"Shipping methods",PaymentNoShippingMethod:"Sorry, it is not possible to deliver to your address.",PaymentShippingInfo:"Shipping Information",PaymentShippingAddress:"Shipping address",PaymentShippingAddress1Placeholder:"Address 1 (Street)",PaymentShippingAddress2Placeholder:"Address 2 (Street)",PaymentShippingCityPlaceholder:"City",PaymentShippingStatePlaceholder:"State",PaymentShippingCountry:"Country",PaymentShippingZipPlaceholder:"Postcode",PaymentShippingReceiver:"Receiver",PaymentShippingName:"Full Name",PaymentShippingEmailPlaceholder:"Email",PaymentCheckoutPhoneNumber:"Phone number",PaymentCheckoutShippingMethod:"Shipping method",PaymentShippingSave:"Save Shipping Information",PaymentShippingSaveInfo:"You can save your shipping info for future use.",PaymentInfoHint:"You paid **%1$s** for **%2$s**.",PrivacyPayments:"Payments",PrivacyPaymentsClearInfo:"You can delete your shipping info and instruct all payment providers to remove your saved credit cards. Note that Telegram never stores your credit card data.",PrivacyPaymentsClear:"Clear Payment and Shipping Info",PrivacyPaymentsClearAlertTitle:"Clear payment info",PrivacyPaymentsClearAlertText:"Are you sure you want to clear your payment and shipping info?",PrivacyPaymentsPaymentInfoCleared:"Payment info cleared.",PrivacyPaymentsShippingInfoCleared:"Shipping info cleared.",PrivacyPaymentsPaymentShippingCleared:"Payment and shipping info cleared.",PrivacyClearShipping:"Shipping info",PrivacyClearPayment:"Payment info",Clear:"Clear",Save:"Save",PaymentCheckoutName:"Name",ClearRecentStickersAlertTitle:"Clear recent stickers",ClearRecentStickersAlertMessage:"Do you want to clear all your recent stickers?",PremiumStickersShort:"Premium",FavoriteStickers:"Favorites",AddToFavorites:"Add to Favorites",AddedToFavorites:"Sticker added to Favorites.",RemovedFromFavorites:"Sticker was removed from Favorites",RemovedFromRecent:"Sticker was removed from Recent",DeleteFromFavorites:"Delete from Favorites",DeleteFromRecent:"Remove from Recent",NewChatsFromNonContacts:"New chats from unknown users",ArchiveAndMute:"Archive and Mute",ArchiveAndMuteInfo:"Automatically archive and mute new chats, groups and channels from non-contacts.",PrivacyVoiceMessages:"Voice Messages",PrivacyVoiceMessagesTitle:"Who can send me voice or video messages?",PrivacyVoiceMessagesInfo:"You can restrict who can send you voice or video messages with granular precision.",PrivacyVoiceMessagesPremiumOnly:"Only subscribers of *Telegram Premium* can restrict receiving voice messages.",EmojiCount:{other_value:"%1$d emoji"},AddEmojiNotFound:"Emoji pack not found.",MessageContainsEmojiPack:"This message contains emoji from %s pack.",MessageContainsEmojiPacks:{other_value:"This message contains emoji from **%d Packs**."},EmojiPackCount:{one_value:"%1$d Emoji Pack",other_value:"%1$d Emoji Packs"},ReactionsAll:"All",EnableSomeReactionsInfo:"Members of the group can use only certain approved emoji as reactions to messages.",EnableAllReactionsInfo:"Members of the group can use any emoji as reactions to messages.",DisableReactionsInfo:"Members of the group can’t add any reactions to messages.",OnlyAllowThisReactions:"Only allow these reactions",AllReactions:"All reactions",SomeReactions:"Some reactions",NoReactions:"No reactions",LimitReached:"Limit Reached",LimitReachedPinDialogs:"You can't pin more than %1$d chats to the top. Unpin some that are currently pinned – or subscribe to **Telegram Premium** to double the limit to **%2$d** chats.",LimitReachedPinDialogsPremium:"Sorry, you can't pin more than %1$d chats to the top. Unpin some that are currently pinned.",LimitReachedPinDialogsLocked:"Sorry, you can't pin more than %1$d chats to the top. Unpin some that are currently pinned. We are working to let you increase this limit in the future.",IncreaseLimit:"Increase Limit",LimitFree:"Free",LimitPremium:"Premium",ActionTTLChanged:"un1 set messages to auto-delete in %1$s",ActionTTLYouChanged:"You set messages to auto-delete in %1$s",ActionTTLChannelChanged:"Messages in this channel will be automatically deleted after %1$s",ActionTTLChannelDisabled:"Messages in this channel will no longer be automatically deleted",ActionTTLDisabled:"un1 disabled the auto-delete timer",ActionTTLYouDisabled:"You disabled the auto-delete timer",UsernamesProfileHeader:"Username order",UsernamesProfileHelp:"Drag and drop links to change the order in which they will be displayed on your info page.",UsernamesChannelHelp:"Drag and drop links to change the order in which they will be displayed on the channel info page.",UsernameLinkEditable:"tap to edit",UsernameLinkActive:"active",UsernameLinkInactive:"not active",UsernameActivateLink:"Activate link",UsernameDeactivateLink:"Deactivate link",UsernameActivateLinkProfileMessage:"Do you want to show this link on your info page?",UsernameDeactivateLinkProfileMessage:"Do you want to hide this link from your info page?",UsernameActivateLinkChannelMessage:"Do you want to show this link on the channel info page?",UsernameDeactivateLinkChannelMessage:"Do you want to hide this link from the channel info page?",Hide:"Hide",Show:"Show",UsernameActivateErrorTitle:"Too many active links",UsernameActivateErrorMessage:"Sorry, you have too many active public links already. Please hide one of your active public links first.",ChannelSignMessages:"Sign Messages",TopicWasCreatedAction:"%s was created",Topics:"Topics",ForumToggleDescription:"The group chat will be divided into topics created by admins or users.",AnonymousNumber:"Anonymous Number",Info:"Info",BotSettings:"Settings",OpenMessage:"VIEW MESSAGE",OpenGroup:"VIEW GROUP",CloseTopic:"Close topic",RestartTopic:"Reopen topic",LimitReachedPinnedTopics:"Sorry, you can't pin more than %d topics to the top.",TopicProfileStatus:"In %s",AccDescrTopic:"Topic",DeleteTopics:{one_value:"Delete topic",other_value:"Delete topics"},DeleteSelectedTopic:"Are you sure you want delete %s?",NewTopic:"New Topic",CreateTopicTitle:"Choose a topic name and icon",CreateGeneralTopicTitle:"Choose topic name",EditTopicHide:"Show in Topics",EditTopicHideInfo:"If the 'General' topic is hidden, group members can pull down in the topic list to view it.",OpenUrlOption1:"Log in to %1$s as **%2$s**",OpenUrlOption2:"Allow **%1$s** to send me messages",OtherWebSessions:"Connected websites",WebSessionsTitle:"Logged In with Telegram",TerminateWebSessionText:"Are you sure you want to disconnect %1$s?",Disconnect:"Disconnect",TerminateAllWebSessions:"Disconnect All Websites",AreYouSureWebSessions:"Are you sure you want to disconnect all websites where you logged in with Telegram?",ClearOtherWebSessionsHelp:"You can log in on websites that support signing in with Telegram.",TerminateWebSessionInfo:"Tap to disconnect from your Telegram account.",EnablePhotoSpoiler:"Hide with spoiler",DisablePhotoSpoiler:"Remove spoiler",LimitReachedFolders:"You have reached the limit of **%1$d** folders. You can double the limit to **%2$d** folders by subscribing to **Telegram Premium**.",LimitReachedFoldersPremium:"You have reached the limit of **%1$d** folders for this account.",LimitReachedFoldersLocked:"You have reached the limit of **%1$d** folders for this account. We are working to let you increase this limit in the future.",FwdMessageToSavedMessages:"Message forwarded to **Saved Messages**.",FwdMessagesToSavedMessages:"Messages forwarded to **Saved Messages**.","AccountSettings.Filters":"Chat Folders","AccountSettings.Notifications":"Notifications and Sounds","AccountSettings.PrivacyAndSecurity":"Privacy and Security","AccountSettings.Language":"Language","Alert.UserDoesntExists":"Sorry, this user doesn't seem to exist.","Alert.Confirm.Discard":"Discard","Appearance.Reset":"Reset to Defaults","AutoDownloadSettings.Delimeter":", ","AutoDownloadSettings.LastDelimeter":" and ","Bio.Description":"Any details such as age, occupation or city.\nExample: 23 y.o. designer from San Francisco","Call.Accept":"Accept","Call.Decline":"Decline","Call.End":"End","Call.Camera":"Camera","Call.Mute":"Mute","Call.Recall":"Recall","Call.Close":"Close","Call.Screen":"Screen","Call.Confirm.Discard.Voice.Header":"Video Chat in Progress","Call.Confirm.Discard.Voice.ToVoice.Text":'Leave video chat in "%1$@" and start a new one in "%2$@"?',"Call.Confirm.Discard.Voice.ToCall.Text":'Leave video chat in "%1$@" and start a call with "%2$@"?',"Call.Confirm.Discard.Call.Header":"Call in Progress","Call.Confirm.Discard.Call.ToVoice.Text":'End call with "%1$@" and start a video chat in "%2$@"?',"Call.Confirm.Discard.Call.ToCall.Text":'End call with "%1$@" and start a video chat in "%2$@"?',"Call.PrivacyErrorMessage":"Sorry, you cannot call %@ because of their privacy settings.","Call.StatusRequesting":"Contacting...","Call.StatusRinging":"Ringing...","Call.StatusConnecting":"Connecting...","Call.StatusEnded":"Call Ended","Call.StatusFailed":"Call Failed","Call.StatusBusy":"Busy","Call.StatusCalling":"is calling you...","Contacts.PhoneNumber.NotRegistred":"The person with this phone number is not registered on Telegram yet.","Channel.UsernameAboutChannel":"People can share this link with others and can find your channel using Telegram search.","Channel.UsernameAboutGroup":"People can share this link with others and find your group using Telegram search.","Chat.Accessory.Forward":{one_value:"Forward Message",other_value:"Forward %d Messages"},"Chat.Accessory.Forward.You":"You","Chat.Accessory.Forward.From":"From","Chat.Accessory.Hidden":{one_value:"Forward Message (sender's name hidden)",other_value:"Forward %d Messages (senders' names hidden)"},"Chat.Alert.Forward.Action.Another":"Forward to Another Chat","Chat.Alert.Forward.Action.Hide1":{one_value:"Hide Sender's Name",other_value:"Hide Senders' Names"},"Chat.Alert.Forward.Action.Show1":{one_value:"Show Sender's Name",other_value:"Show Senders' Names"},"Chat.Alert.Forward.Action.ShowCaption":{one_value:"Show Caption",other_value:"Show Captions"},"Chat.Alert.Forward.Action.HideCaption":{one_value:"Hide Caption",other_value:"Hide Captions"},"Chat.CopySelectedText":"Copy Selected Text","Chat.Confirm.Unpin":"Would you like to unpin this message?","Chat.Context.Reacted":"%1$@/%2$@ Reacted","Chat.Context.ReactedFast":{other_value:"%d Reacted"},"Chat.Date.ScheduledFor":"Scheduled for %@","Chat.Date.ScheduledForToday":"Scheduled for today","Chat.DropTitle":"Drop files here to send them","Chat.DropQuickDesc":"in a quick way","Chat.DropAsFilesDesc":"without compression","Chat.Edit.Cancel.Text":"Are you sure you want to discard all changes?","Chat.Input.ReplyToAnswer":"Reply to message in topics","Chat.SendVoice.PrivacyError":"%@ doesn't accept voice and video messages","Chat.Service.Call.Cancelled":"Cancelled","Chat.Service.Call.Missed":"Missed","Chat.Service.PeerJoinedTelegram":"%@ joined Telegram","Chat.Service.Channel.UpdatedTitle":'Channel renamed to "%@"',"Chat.Service.Channel.UpdatedPhoto":"Channel photo updated","Chat.Service.Channel.RemovedPhoto":"Channel photo removed","Chat.Service.Channel.UpdatedVideo":"Channel video updated","Chat.Service.BotPermissionAllowed":"You allowed this bot to message you when you logged in on %@","Chat.Service.Group.UpdatedPinnedMessage":'%@ pinned "%@"',"Chat.Service.Group.TopicEdited.Icon":"%1$@ changed topic icon to %2$@","Chat.Service.Group.TopicEdited.Icon.Removed":"%1$@ removed icon","Chat.Service.Group.TopicEdited.Title":'%1$@ changed topic name to "%2$@"',"Chat.Service.Group.TopicEdited.Paused":"%1$@ closed topic","Chat.Service.Group.TopicEdited.Resumed":"%1$@ restarted topic","Chat.Service.Group.TopicEdited.You.Icon":"You changed topic icon to %1$@","Chat.Service.Group.TopicEdited.You.Icon.Removed":"You removed icon","Chat.Service.Group.TopicEdited.You.Title":'You changed topic name to "%1$@"',"Chat.Service.Group.TopicEdited.You.Paused":"You closed topic","Chat.Service.Group.TopicEdited.You.Resumed":"You restarted topic","Chat.Service.Group.TopicEdited.You.Hided":"You hid the general topic","Chat.Service.Group.TopicEdited.You.Unhided":"You unhid the general topic","Chat.Service.Group.TopicEdited.Hided":"%1$@ hid the general topic","Chat.Service.Group.TopicEdited.Unhided":"%1$@ unhid the general topic","Chat.Service.PaymentSent1":"You have successfully transferred **%1$@** to **%2$@** for **%3$@**","Chat.Service.PaymentSent1NoTitle":"You have successfully transferred **%1$@** to **%2$@**","Chat.Service.PaymentSentRecurringInit":"You successfully transferred **%1$@** to **%2$@** for **%3$@** and allowed future recurring payments","Chat.Service.PaymentSentRecurringInitNoTitle":"You successfully transferred **%1$@** to **%2$@** and allowed future recurring payments","Chat.Service.PaymentSentRecurringUsed":"You have just successfully transferred **%1$@** to **%2$@** for **%3$@** via recurrent payments","Chat.Service.PaymentSentRecurringUsedNoTitle":"You have just successfully transferred **%1$@** to **%2$@** via recurrent payments","Chat.Service.VoiceChatStarted":"%1$@ started a [video chat](open)","Chat.Service.VoiceChatStartedYou":"You started a [video chat](open)","Chat.Service.VoiceChatStarted.Channel":"[Live Stream](open) started","Chat.Service.VoiceChatFinished":"%1$@ ended the video chat (%2$@)","Chat.Service.VoiceChatFinishedYou":"You ended the video chat (%@)","Chat.Service.VoiceChatFinished.Channel":"Live Stream ended (%1$@)","Chat.Service.VoiceChatInvitation":"%1$@ invited %2$@ to the [video chat](open)","Chat.Service.VoiceChatInvitationByYou":"You invited %1$@ to the [video chat](open)","Chat.Service.VoiceChatInvitationForYou":"%1$@ invited you to the [video chat](open)","ChatService.UserJoinedGroupByRequest":"%@ was accepted to the group","ChatService.UserJoinedChannelByRequest":"%@ joined the channel by request","ChatList.Service.VoiceChatScheduled":"%1$@ scheduled a video chat for %2$@","ChatList.Service.VoiceChatScheduledYou":"You scheduled a video chat for %2$@","Chat.Poll.Unvote":"Retract Vote","Chat.Poll.Stop":"Stop Poll","Chat.Poll.ViewResults":"View Results","Chat.Poll.SubmitVote":"Vote","Chat.Poll.Type.Anonymous":"Anonymous Poll","Chat.Poll.Type.Public":"Poll","Chat.Poll.Type.AnonymousQuiz":"Anonymous Quiz","Chat.Poll.Type.Quiz":"Quiz","Chat.Poll.Type.Closed":"Final Results","Chat.Poll.TotalVotes1":{one_value:"%d vote",other_value:"%d votes"},"Chat.Quiz.TotalVotes":{one_value:"%d answer",other_value:"%d answers"},"Chat.Poll.TotalVotesEmpty":"No votes yet","Chat.Poll.TotalVotesResultEmpty":"No votes","Chat.Quiz.TotalVotesEmpty":"No answers yet","Chat.Quiz.TotalVotesResultEmpty":"No answers","Chat.Pinned.DontShow":"Don't Show Pinned Messages","Chat.Title.Comments":{one_value:"%d Comment",other_value:"%d Comments"},"ChatTitle.ReportMessages":"Report Messages","Chat.Send.WithoutSound":"Send Without Sound","Chat.Send.SetReminder":"Set a Reminder","Chat.Send.ScheduledMessage":"Schedule Message","Chat.SendAs.PersonalAccount":"personal account","Chat.UnpinAllMessagesConfirmation":{one_value:"Do you want to unpin %d message in this chat?",other_value:"Do you want to unpin all %d messages in this chat?"},"Chat.Message.Ad.Text":"Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\n\nUnlike other apps, Telegram doesn't track whether you tapped on a sponsored message and doesn't profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\n\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:\n\n%@\n\nSponsored Messages are currently in test mode. Once they are fully launched and allow Telegram to cover its basic costs, we will start sharing ad revenue with the owners of public channels in which sponsored messages are displayed.\n\nOnline ads should no longer be synonymous with abuse of user privacy. Let us redefine how a tech company should operate – together.","Chat.Message.Ad.ReadMore":"Read More","Chat.Message.ViewChannel":"VIEW CHANNEL","Chat.Message.ViewBot":"VIEW BOT","Chat.Message.ViewGroup":"VIEW GROUP","Chat.Message.Sponsored.What":"What are sponsored messages?","Chat.Message.Sponsored.Link":"https://promote.telegram.org","Checkout.2FA.Text":"Saving payment details is only available with 2-Step Verification.","Checkout.NewCard.CardholderNamePlaceholder":"Cardholder Name","Checkout.PasswordEntry.Title":"Payment Confirmation","Checkout.PasswordEntry.Pay":"Pay","Checkout.PasswordEntry.Text":"Your card %@ is on file. To pay with this card, please enter your 2-Step-Verification password.","Checkout.PayPrice":"Pay %@","Checkout.WebConfirmation.Title":"Complete Payment","ChatList.Context.Mute":"Mute","ChatList.Context.Unmute":"Unmute","ChatList.Context.Pin":"Pin","ChatList.Context.Unpin":"Unpin","ChatList.Context.DeleteChat":"Delete Chat","ChatList.Context.DeleteAndExit":"Delete and Leave","ChatList.Context.LeaveChannel":"Leave Channel","ChatList.Context.LeaveGroup":"Leave Group","ChatList.Service.Call.incoming":"Incoming Call (%@)","ChatList.Service.Call.outgoing":"Outgoing Call (%@)","ChatList.Service.VideoCall.incoming":"Incoming Video Call (%@)","ChatList.Service.VideoCall.outgoing":"Outgoing Video Call (%@)","ChatList.Service.Call.Cancelled":"Cancelled Call","ChatList.Service.Call.Missed":"Missed Call","ChatList.Service.VideoCall.Cancelled":"Cancelled Video Call","ChatList.Service.VideoCall.Missed":"Missed Video Call","ChatList.Service.VoiceChatScheduled.Channel":"Voice chat scheduled for %@","ChatList.Filter.Header":"Create folders for different groups of chats and quickly switch between them.","ChatList.Filter.NewTitle":"Create Folder","ChatList.Filter.List.Title":"Chat Folders","ChatList.Filter.Include.AddChat":"Add Chats","ChatList.Filter.Exclude.AddChat":"Add Chats","ChatList.Filter.Contacts":"Contacts","ChatList.Filter.NonContacts":"Non-Contacts","ChatList.Filter.Groups":"Groups","ChatList.Filter.Channels":"Channels","ChatList.Filter.Bots":"Bots","ChatList.Filter.MutedChats":"Muted","ChatList.Filter.ReadChats":"Read","ChatList.Filter.Archive":"Archived","ChatList.Filter.Include.LimitReached":"Sorry, you can only add up to 100 individual chats. Try using chat types.","ChatList.Filter.Exclude.LimitReached":"Sorry, you can only add up to 100 individual chats. Try using chat types.","ChatList.Filter.Confirm.Remove.Header":"Remove Folder","ChatList.Filter.Confirm.Remove.Text":"Are you sure you want to remove this folder? Your chats will not be deleted.","ChatList.Mute.1Hour":"For 1 Hour","ChatList.Mute.4Hours":"For 4 Hours","ChatList.Mute.8Hours":"For 8 Hours","ChatList.Mute.1Day":"For 1 Day","ChatList.Mute.3Days":"For 3 Days","ChatList.Mute.Forever":"Forever","Channel.DescriptionHolderDescrpiton":"You can provide an optional description for your channel.","ChannelVisibility.Confirm.MakePrivate.Channel":"If you make this channel private, the name @%@ will be removed. Anyone else will be able to take it for their public groups or channels.","ChannelVisibility.Confirm.MakePrivate.Group":"If you make this group private, the name @%@ will be removed. Anyone else will be able to take it for their public groups or channels.","Context.ViewStickerSet":"View Sticker Set","CreateGroup.NameHolder":"Group Name","CustomEmoji.PremiumAlert":"Subscribe to Telegram Premium to unlock this emoji. [Read More]()","Date.Today":"Today","DeleteChat.DeleteGroupForAll":"Delete for all members",DeleteChannelForAll:"Delete for all subscribers","ForumTopic.Context.Info":"Group Info","ForumTopic.Context.AddMember":"Add Members","ForumTopic.Context.ShowAsMessages":"View as Messages","ForumTopic.Context.New":"Create Topic","ForumTopic.Name.Placeholder":"Topic Name","ForumTopic.Title.Edit":"Edit Topic","EditAccount.Username":"Username","EditAccount.Title":"Edit Profile","EditAccount.Logout":"Log Out","Emoji.Recent":"Frequently Used","Emoji.SmilesAndPeople":"Smileys & People","Emoji.AnimalsAndNature":"Animals & Nature","Emoji.FoodAndDrink":"Food & Drink","Emoji.ActivityAndSport":"Activity & Sport","Emoji.TravelAndPlaces":"Travel & Places","Emoji.Objects":"Objects","Emoji.Flags":"Flags","Error.AnError":"An error occurred. Please try again later.","FileSize.B":"%@ B","FileSize.KB":"%@ KB","FileSize.MB":"%@ MB","FileSize.GB":"%@ GB","InstalledStickers.LoopAnimated":"Loop Animated Stickers","LastSeen.HoursAgo":{one_value:"last seen %d hour ago",other_value:"last seen %d hours ago"},"Login.Register.LastName.Placeholder":"Last Name","Message.Context.Select":"Select","Message.Context.Pin":"Pin","Message.Context.Unpin":"Unpin","Message.Context.Goto":"Show Message","Message.ReplyActionButtonShowReceipt":"Show Receipt","MessageContext.CopyMessageLink1":"Copy Message Link","Modal.Send":"Send","NewContact.Exception.ShareMyPhoneNumber":"Share My Phone Number","NewContact.Exception.ShareMyPhoneNumber.Desc":"You can make your phone visible to %@.","NewPoll.Anonymous":"Anonymous Voting","NewPoll.Explanation.Placeholder":"Add a Comment (Optional)","NewPoll.OptionsAddOption":"Add an Option","NewPoll.MultipleChoice":"Multiple Answers","NewPoll.Quiz":"Quiz Mode","Notification.Contact.Reacted":'%1$@ to your "%2$@"',"Payments.Recurrent.Accept":"I accept [Terms of Service]() of **%@**.","Peer.Activity.User.PlayingGame":"playing a game","Peer.Activity.User.TypingText":"typing","Peer.Activity.User.SendingPhoto":"sending a photo","Peer.Activity.User.RecordingVideo":"recording video","Peer.Activity.User.SendingVideo":"sending a video","Peer.Activity.User.RecordingAudio":"recording voice","Peer.Activity.User.SendingFile":"sending file","Peer.Activity.User.ChoosingSticker":"choosing a sticker","Peer.Activity.User.EnjoyingAnimations":"watching %@","Peer.Activity.Chat.PlayingGame":"%@ is playing a game","Peer.Activity.Chat.TypingText":"%@ is typing","Peer.Activity.Chat.SendingPhoto":"%@ is sending a photo","Peer.Activity.Chat.RecordingVideo":"%@ is recording video","Peer.Activity.Chat.SendingVideo":"%@ is sending a video","Peer.Activity.Chat.RecordingAudio":"%@ is recording voice","Peer.Activity.Chat.SendingFile":"%@ is sending a file","Peer.Activity.Chat.ChoosingSticker":"%@ is choosing a sticker","Peer.Activity.Chat.EnjoyingAnimations":"%@ is watching %@","Peer.Activity.Chat.Multi.PlayingGame1":"%@ and %d others are playing a game","Peer.Activity.Chat.Multi.TypingText1":"%@ and %d others are typing","Peer.Activity.Chat.Multi.SendingPhoto1":"%@ and %d others are sending photos","Peer.Activity.Chat.Multi.RecordingVideo1":"%@ and %d others are recording video","Peer.Activity.Chat.Multi.SendingVideo1":"%@ and %d others are sending videos","Peer.Activity.Chat.Multi.RecordingAudio1":"%@ and %d others are recording voice","Peer.Activity.Chat.Multi.SendingFile1":"%@ and %d others are sending files","Peer.Activity.Chat.Multi.ChoosingSticker1":"%@ and %d others are choosing stickers","Peer.ServiceNotifications":"service notifications","Peer.RepliesNotifications":"Reply Notifications","Peer.Status.justNow":"last seen just now","Peer.Status.Today":"today","Peer.Status.Yesterday":"yesterday","Peer.Status.LastSeenAt":"last seen %@ at %@","Peer.Status.minAgo":{one_value:"last seen %d minute ago",other_value:"last seen %d minutes ago"},"Peer.Status.Member":{one_value:"%d member",other_value:"%d members"},"Peer.Status.Subscribers":{one_value:"%d subscriber",other_value:"%d subscribers"},"PeerInfo.Administrators":"Administrators","PeerInfo.DeleteChannel":"Delete Channel","PeerInfo.Discussion":"Discussion","PeerInfo.Discussion.Add":"Add","PeerInfo.SharedMedia":"Shared Media","PeerInfo.Subscribers":"Subscribers","PeerInfo.DeleteContact":"Delete Contact","PeerInfo.Action.VoiceChat":"Video Chat","PeerInfo.Action.LiveStream":"Live Stream","PeerInfo.Phone.AnonymousInfo":"This number is not tied to a SIM card and was acquired on [Fragment]().","PeerMedia.Members":"Members","PollResults.Title.Poll":"Poll Results","PollResults.Title.Quiz":"Quiz Results","PollResults.LoadMore":{other_value:"Show More (%d)"},"Preview.Dragging.AddItems":{one_value:"Add Item",other_value:"Add Items"},"PreviewSender.CaptionPlaceholder":"Add a caption...","PreviewSender.CompressFile":"Send compressed","PreviewSender.SendFile":{one_value:"Send File",other_value:"Send %d Files"},"PreviewSender.SendPhoto":{one_value:"Send Photo",other_value:"Send %d Photos"},"PreviewSender.SendVideo":{one_value:"Send Video",other_value:"Send %d Videos"},"PrivacyAndSecurity.Item.On":"On","PrivacyAndSecurity.Item.Off":"Off","PrivacyAndSecurity.SensitiveText":"Disable filtering","PrivacyAndSecurity.SensitiveDesc":"Display sensitive media in public channels on all your Telegram devices.","PrivacySettings.VoiceCalls":"Calls","PrivacySettings.Forwards":"Forwarded Messages","PrivacySettings.Groups":"Groups and Channels","PrivacySettingsController.AddUsers":"Add Users","PrivacySettingsController.GroupDescription":"You can restrict who can add you to groups and channels with granular precision.","PrivacySettingsController.Forwards.CustomHelp":"You can restrict who can add a link to your account when forwarding your messages.","PrivacySettingsController.P2p.Desc":"Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio and video quality.","PrivacySettingsController.PhoneCallDescription":"You can restrict who can call you with granular precision.","PrivacySettingsController.ProfilePhoto.CustomHelp":"You can restrict who can see your profile photo with granular precision.","PrivacySettingsController.LastSeenDescription":"You won't see Last Seen and Online statuses for people with whom you don't share yours. Approximate last seen will be shown instead (recently, within a week, within a month).","PrivacySettingsController.PeerInfo":"You can add users or entire groups as exceptions that will override the settings above.","PrivacySettingsController.Everbody":"Everybody","PrivacySettingsController.MyContacts":"My Contacts","PrivacySettingsController.Nobody":"Nobody","PrivacySettingsController.NeverShare":"Never Share With","PrivacySettingsController.AlwaysShare":"Always Share With","PrivacySettingsController.NeverAllow":"Never Allow","PrivacySettingsController.AlwaysAllow":"Always Allow","PrivacySettingsController.UserCount":{one_value:"%d user",other_value:"%d users"},"RecentSessions.Error.FreshReset":"For security reasons, you can't terminate older sessions from a device that you've just connected. Please use an earlier connection or wait for a few hours.","RequestJoin.Button":"Request to Join","Stickers.SearchAdd":"Add","Stickers.SearchAdded":"Added","Stickers.SuggestStickers":"Suggest Stickers by Emoji","ShareModal.Search.Placeholder":"Share to...","ShareModal.Search.ForwardPlaceholder":"Forward to...","Telegram.GeneralSettingsViewController":"General Settings","Telegram.InstalledStickerPacksController":"Stickers","Telegram.NotificationSettingsViewController":"Notifications","Telegram.LanguageViewController":"Language","Text.CopyLabel_About":"Copy About","Text.CopyLabel_Bio":"Copy Bio","Text.CopyLabel_PhoneNumber":"Copy Phone Number","Text.CopyLabel_Username":"Copy Username","Text.CopyLabel_ShareLink":"Copy Share Link","GeneralSettings.BigEmoji":"Large Emoji","GeneralSettings.EmojiPrediction":"Suggest Emoji","GroupPermission.Delete":"Delete Exception","Search.Confirm.ClearHistory":"Are you sure you want to clear your search history?","SecureId.Identity.Placeholder.ExpiryDate":"Expiry Date","Separator.ShowMore":"show more","Separator.ShowLess":"show less","ScheduleController.at":"at","Schedule.SendToday":"Send today at %@","Schedule.SendDate":"Send on %@ at %@","Schedule.SendWhenOnline":"Send When Online","Sticker.Premium.Click.Info":"This pack contains premium stickers like this one. [View Pack]()","Stickers.Recent":"Recent","StickerSet.DontExist":"Sorry, this sticker set doesn't seem to exist.","Text.Context.Copy.Username":"Copy Username","Text.Context.Copy.Hashtag":"Copy Hashtag","Time.TomorrowAt":"tomorrow at %@","TwoStepAuth.SetPasswordHelp":"You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.","TwoStepAuth.GenericHelp":"You have enabled Two-Step verification.\nYou'll need the password you set up here to log in to your Telegram account.","TwoStepAuth.ChangePassword":"Change Password","TwoStepAuth.RemovePassword":"Turn Password Off","TwoStepAuth.SetupEmail":"Set Recovery Email","TwoStepAuth.ChangeEmail":"Change Recovery Email","TwoStepAuth.ConfirmEmailCodeDesc":"Please enter the code we've just emailed to %@.","TwoStepAuth.RecoveryTitle":"Email Code","TwoStepAuth.RecoveryCode":"Code","TwoStepAuth.RecoveryCodeInvalid":"Invalid code. Please try again.","TwoStepAuth.RecoveryCodeExpired":"Code Expired","TwoStepAuth.SetupHintTitle":"Password Hint","TwoStepAuth.SetupHintPlaceholder":"Hint","VoiceChat.Chat.StartNew":"Video chat ended. Start a new one?","VoiceChat.Chat.StartNew.OK":"Start","VoiceChat.Chat.Ended":"Video chat ended.","VoiceChat.Invite.InviteMembers":"Invite members","VoiceChat.Status.Connecting":"Connecting...","VoiceChat.Status.Members":{one_value:"%d participant",other_value:"%d participants"},"VoiceChat.Status.MutedForYou":"muted for you","VoiceChat.Status.Speaking":"speaking","VoiceChat.Status.Listening":"listening","VoiceChat.Status.WantsSpeak":"wants to speak","VoiceChat.Status.Muted":"muted","VoiceChat.Status.You":"This is you","VoiceChat.Video.Stream.Video":"video","VoiceChat.Video.Stream.Screencast":"screen","VoiceChat.Video.Stream.More":"more","VoiceChat.Leave":"Leave","VoiceChat.End.Title":"Leave video chat","VoiceChat.End.Text":"Are you sure you want to leave this video chat?","VoiceChat.End.Third":"End Video Chat","VoiceChat.End.OK":"Leave","VoiceChat.MutePeer":"Mute","VoiceChat.UnmutePeer":"Allow To Speak","VoiceChat.RemovePeer":"Remove","VoiceChat.OpenProfile":"Open Profile","VoiceChat.MuteForMe":"Mute For Me","VoiceChat.UnmuteForMe":"Unmute For Me","VoiceChat.RemovePeer.Confirm.Channel":"Do you want to remove %1$@ from the channel?","VoiceChat.RemovePeer.Confirm":"Are you sure you want to remove %1$@ from the group?","VoiceChat.RemovePeer.Confirm.OK":"Remove"}}}]); +//# sourceMappingURL=104.c914ddc183166c9696a7.chunk.js.map \ No newline at end of file diff --git a/public/104.c914ddc183166c9696a7.chunk.js.map b/public/104.c914ddc183166c9696a7.chunk.js.map new file mode 100644 index 000000000..5e953d9ed --- /dev/null +++ b/public/104.c914ddc183166c9696a7.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"104.c914ddc183166c9696a7.chunk.js","mappings":"yHAAA,MAyzCA,EAzzCa,CACX,WAAc,aACd,YAAe,QACf,uBAAwB,MACxB,uBAAwB,MACxB,gCAAiC,gBACjC,SAAY,YACZ,yBAA4B,qFAC5B,iBAAoB,gBACpB,iBAAoB,cACpB,gBAAmB,aACnB,kBAAqB,eACrB,qBAAwB,mBACxB,kBAAqB,eACrB,cAAiB,WACjB,2BAA4B,gBAC5B,6BAA8B,OAC9B,uBAAwB,iBACxB,6BAA8B,sBAC9B,iCAAkC,wBAClC,6BAA8B,4BAC9B,+BAAgC,sBAChC,oCAAqC,mBACrC,2BAA4B,kBAC5B,2BAA4B,kBAC5B,iBAAkB,0EAClB,sBAAuB,qBACvB,iCAAkC,iBAClC,6BAA8B,WAC9B,iBAAkB,YAClB,4BAA6B,+BAC7B,4BAA6B,CAC3B,UAAa,mBACb,YAAe,qBAEjB,8BAA+B,oBAC/B,4BAA6B,iBAC7B,iCAAkC,+CAClC,qCAAsC,8CACtC,6CAA8C,yDAC9C,iDAAkD,wDAClD,uCAAwC,8BACxC,0CAA2C,0BAC3C,oDAAqD,sIAErD,kCAAmC,wBACnC,2BAA4B,sBAC5B,qBAAsB,mBACtB,mBAAoB,iBACpB,kCAAmC,kBACnC,+BAAgC,uBAChC,6BAA8B,YAC9B,gCAAiC,kBACjC,4BAA6B,wBAC7B,2BAA4B,yBAC5B,iBAAkB,CAChB,UAAa,aACb,YAAe,eAEjB,oBAAqB,mBACrB,uBAAwB,kGACxB,4BAA6B,sBAC7B,+BAAgC,0FAKhC,mBAAoB,WACpB,6BAA8B,gBAC9B,iCAAkC,qBAClC,0CAA2C,4BAC3C,qCAAsC,oBACtC,qBAAsB,cACtB,yBAA0B,UAC1B,yBAA0B,UAC1B,iCAAkC,mBAClC,sBAAuB,uBACvB,sBAAuB,qBACvB,eAAkB,mBAClB,sBAAuB,YACvB,iCAAkC,gBAClC,kCAAmC,kBACnC,mCAAoC,kBACpC,oCAAqC,mBACrC,oCAAqC,oBACrC,8BAA+B,+HAC/B,6BAA8B,+GAC9B,mBAAoB,UACpB,oBAAqB,WACrB,qCAAsC,uBACtC,2BAA4B,cAC5B,0BAA2B,CACzB,UAAa,aACb,YAAe,kBAEjB,oBAAqB,qBACrB,kBAAmB,CACjB,UAAa,cACb,YAAe,gBAEjB,mBAAoB,CAClB,UAAa,eACb,YAAe,iBAEjB,2BAA4B,oBAC5B,kCAAmC,yBACnC,2BAA4B,gBAC5B,8BAA+B,CAC7B,UAAa,eACb,YAAe,iBAEjB,iBAAkB,oBAClB,aAAc,wBACd,eAAgB,kBAChB,gCAAiC,kBACjC,cAAiB,oBACjB,qBAAsB,qBACtB,uBAAwB,qBACxB,wBAAyB,uBACzB,8BAA+B,gGAC/B,mBAAoB,OACpB,mCAAoC,eACpC,gCAAiC,eACjC,+BAAgC,WAChC,QAAW,UACX,MAAS,QACT,QAAW,UACX,UAAa,aACb,sBAAuB,CACrB,UAAa,kBACb,YAAe,oBAEjB,0BAA2B,CACzB,UAAa,uBACb,YAAe,yBAEjB,oBAAqB,mBACrB,iCAAkC,mCAClC,mCAAoC,6BACpC,wCAAyC,eACzC,0CAA2C,kBAC3C,qCAAsC,yBACtC,qBAAsB,8GAGtB,4BAA6B,mBAC7B,kBAAmB,WACnB,yBAA0B,8BAC1B,4BAA6B,6BAC7B,mBAAoB,sBACpB,4BAA6B,sBAC7B,+BAAgC,yBAChC,kBAAmB,aACnB,oBAAqB,uGACrB,4BAA6B,kJAC7B,2BAA4B,yIAG5B,gBAAmB,UACnB,oBAAuB,kBACvB,kBAAqB,wBACrB,mBAAsB,oCACtB,mBAAsB,8BACtB,mBAAsB,8BACtB,mBAAsB,8BACtB,cAAiB,gBACjB,kBAAqB,4BACrB,qBAAwB,4BACxB,sBAAyB,uBACzB,eAAkB,qBAClB,eAAkB,kBAClB,iBAAoB,uCACpB,mBAAsB,uBACtB,uBAA0B,0CAC1B,gBAAmB,kBACnB,iBAAoB,kBACpB,sBAAyB,yBACzB,uBAA0B,yBAC1B,SAAY,CACV,UAAa,iBACb,YAAe,mBAEjB,YAAe,QACf,YAAe,QACf,UAAa,MACb,eAAkB,WAClB,mBAAsB,gBACtB,cAAiB,UAEjB,cAAiB,UACjB,YAAe,gBACf,YAAe,gBACf,WAAc,OACd,IAAO,MAEP,kBAAqB,wBACrB,iBAAoB,eACpB,+BAAkC,yBAClC,uBAA0B,cAC1B,kBAAqB,qBACrB,MAAS,QACT,iBAAoB,gBACpB,gBAAmB,gBACnB,cAAiB,iBACjB,cAAiB,iBACjB,gBAAmB,aACnB,YAAe,QACf,UAAa,aACb,QAAW,UACX,kBAAqB,sBACrB,oBAAuB,CACrB,UAAa,sBACb,YAAe,wBAEjB,sBAAyB,CACvB,UAAa,oBACb,YAAe,2BAEjB,QAAW,MACX,IAAO,MACP,MAAS,CACP,UAAa,YACb,YAAe,cAEjB,SAAY,CACV,UAAa,eACb,YAAe,iBAEjB,SAAY,CACV,UAAa,eACb,YAAe,iBAEjB,OAAU,CACR,UAAa,aACb,YAAe,eAEjB,MAAS,CACP,UAAa,YACb,YAAe,cAEjB,QAAW,CACT,UAAa,cACb,YAAe,gBAEjB,SAAY,CACV,UAAa,eACb,YAAe,iBAEjB,iBAAoB,yCACpB,WAAc,cACd,SAAY,YACZ,SAAY,WACZ,cAAiB,iBACjB,SAAY,WACZ,aAAgB,OAChB,QAAW,UACX,SAAY,oBACZ,eAAkB,kBAClB,iBAAoB,oBACpB,kBAAqB,sBACrB,qBAAwB,WACxB,yBAA4B,gBAC5B,uBAA0B,cAC1B,qBAAwB,WACxB,YAAe,OACf,cAAiB,SACjB,uBAA0B,2BAC1B,6BAAgC,kCAChC,yBAA4B,6BAC5B,0BAA6B,gBAC7B,oBAAuB,SACvB,sBAAyB,WACzB,mBAAsB,QACtB,aAAgB,iBAChB,WAAc,eACd,cAAiB,0BACjB,QAAW,aACX,QAAW,UACX,aAAgB,gBAChB,iBAAoB,sFACpB,aAAgB,OAChB,oBAAuB,wBACvB,yBAA4B,wBAC5B,cAAiB,iBACjB,oBAAuB,CACrB,UAAa,iBACb,YAAe,wBAGjB,kBAAqB,aACrB,gBAAmB,qBACnB,gBAAmB,uBACnB,aAAgB,UAChB,aAAgB,eAChB,kBAAqB,+BACrB,mBAAsB,gCACtB,iBAAoB,mFACpB,kBAAqB,sGACrB,oBAAuB,iBACvB,yBAA4B,0CAC5B,iBAAoB,eACpB,qBAAwB,gEACxB,UAAa,YACb,kBAAqB,qBACrB,cAAiB,mCACjB,cAAiB,kBACjB,eAAkB,cAClB,qBAAwB,+BACxB,qBAAwB,mDACxB,cAAiB,kBACjB,8BAAiC,gDACjC,4BAA+B,kDAC/B,kCAAqC,6DACrC,gCAAmC,+DACnC,4BAA+B,gEAC/B,sCAAyC,sDACzC,iCAAoC,0DACpC,uBAA0B,oBAC1B,wBAA2B,qBAC3B,mBAAsB,yDACtB,UAAa,YACb,aAAgB,mBAChB,YAAe,iCACf,cAAiB,iBACjB,OAAU,SACV,eAAkB,sBAClB,QAAW,UACX,UAAa,YACb,OAAU,SACV,MAAS,QACT,KAAQ,OACR,QAAW,UACX,SAAY,YACZ,KAAQ,OACR,OAAU,SACV,WAAc,2BACd,sBAAyB,qDACzB,gBAAmB,cACnB,cAAiB,gBAEjB,WAAc,eACd,QAAW,UACX,QAAW,UACX,KAAQ,OACR,gBAAmB,QACnB,gBAAmB,QAGnB,gBAAmB,QACnB,gBAAmB,QACnB,gBAAmB,QAEnB,QAAW,WACX,YAAe,eACf,aAAgB,iBAChB,qBAAwB,2FACxB,wBAA2B,cAC3B,YAAe,4BACf,eAAkB,gCAElB,UAAa,2BACb,QAAW,MACX,SAAY,WACZ,aAAgB,YAChB,aAAgB,iPAChB,MAAS,QACT,cAAiB,gBACjB,wBAA2B,gDAC3B,wBAA2B,uDAC3B,+BAAkC,+CAClC,cAAiB,iBACjB,UAAa,aACb,YAAe,eACf,YAAe,UACf,WAAc,SACd,iBAAoB,UACpB,gBAAmB,SACnB,aAAgB,UAChB,WAAc,eACd,eAAkB,eAClB,oBAAuB,yBACvB,cAAiB,iBACjB,kBAAqB,iBACrB,mBAAsB,cACtB,yBAA4B,qCAC5B,oBAAuB,gBACvB,oBAAuB,gBACvB,eAAkB,mBAClB,iBAAoB,mBACpB,yBAA4B,+DAC5B,sBAAyB,yBACzB,qBAAwB,gBACxB,qBAAwB,gBACxB,0BAA6B,aAC7B,0BAA6B,aAC7B,6BAAgC,yBAChC,2BAA8B,cAC9B,2BAA8B,mBAC9B,4BAA+B,eAC/B,4BAA+B,YAE/B,uBAA0B,sBAC1B,4BAA+B,WAC/B,4BAA+B,WAC/B,+BAAkC,qBAClC,6BAAgC,iBAChC,6BAAgC,oBAChC,8BAAiC,UACjC,8BAAiC,kBACjC,sBAAyB,4BACzB,cAAiB,iBACjB,WAAc,eAEd,kBAAqB,gEACrB,eAAkB,mGAClB,eAAkB,kBAClB,YAAe,gBACf,mBAAsB,0DACtB,gBAAmB,gFACnB,uBAA0B,yFAC1B,oBAAuB,uFACvB,aAAgB,SAChB,WAAc,cACd,YAAe,6GACf,kBAAqB,OACrB,YAAe,CACb,UAAa,kBACb,YAAe,oBAEjB,gBAAmB,cACnB,gBAAmB,iCACnB,qBAAwB,cACxB,uBAA0B,mDAC1B,oBAAuB,0DACvB,uBAA0B,gBAC1B,kBAAqB,qCACrB,UAAa,qBACb,WAAc,MACd,aAAgB,QAChB,WAAc,oBACd,oBAAuB,cACvB,0BAA6B,iBAC7B,qBAAwB,qBACxB,yBAA4B,uBAC5B,aAAgB,yBAChB,wBAA2B,kHAC3B,aAAgB,gBAChB,iBAAoB,gBACpB,0BAA6B,2CAC7B,cAAiB,cACjB,eAAkB,cAClB,2BAA8B,sBAC9B,yBAA4B,mBAC5B,sBAAyB,yBACzB,SAAY,WACZ,cAAiB,OACjB,qBAAwB,UACxB,yBAA4B,oIAC5B,6BAAgC,mBAChC,wBAA2B,kDAC3B,QAAW,UACX,+BAAkC,eAClC,+BAAkC,gBAClC,mCAAsC,6GACtC,0CAA6C,qBAC7C,cAAiB,iBACjB,mBAAsB,iBACtB,WAAc,cACd,oBAAuB,4CACvB,iBAAoB,WACpB,oBAAuB,cACvB,SAAY,CACV,UAAa,eACb,YAAe,iBAEjB,WAAc,qCACd,iBAAoB,oBACpB,SAAY,cACZ,KAAQ,OACR,aAAgB,YAChB,cAAiB,4BACjB,uBAA0B,kBAC1B,2BAA8B,4CAC9B,cAAiB,UACjB,OAAU,qBACV,YAAe,0BACf,aAAgB,2BAChB,aAAgB,4BAChB,OAAU,SACV,oBAAuB,WACvB,wBAA2B,aAC3B,QAAW,sBACX,OAAU,SACV,GAAM,eACN,SAAY,aACZ,SAAY,cACZ,MAAS,QACT,gBAAmB,cACnB,WAAc,kBACd,QAAW,CACT,UAAa,cACb,YAAe,gBAEjB,QAAW,CACT,UAAa,cACb,YAAe,gBAEjB,MAAS,CACP,UAAa,YACb,YAAe,cAEjB,KAAQ,CACN,UAAa,WACb,YAAe,aAEjB,MAAS,CACP,UAAa,YACb,YAAe,cAEjB,OAAU,CACR,UAAa,aACb,YAAe,eAEjB,MAAS,CACP,UAAa,YACb,YAAe,cAEjB,0BAA6B,gBAC7B,iBAAoB,eACpB,uBAA0B,eAC1B,qBAAwB,aACxB,cAAiB,mBACjB,OAAU,MACV,cAAiB,gCACjB,gBAAmB,mDACnB,yBAA4B,0BAC5B,2BAA8B,sBAC9B,sBAAyB,oDACzB,aAAgB,wBAChB,aAAgB,uBAChB,iBAAoB,gCACpB,iBAAoB,mBACpB,kBAAqB,wBACrB,kBAAqB,0BACrB,kBAAqB,kCACrB,kBAAqB,+BACrB,yBAA4B,qCAC5B,yBAA4B,qCAC5B,yBAA4B,mCAC5B,yBAA4B,oCAC5B,kBAAqB,qBACrB,qBAAwB,wBACxB,WAAc,0BACd,oBAAuB,oCACvB,+BAAkC,4CAClC,mBAAsB,+EACtB,qBAAwB,iFACxB,qBAAwB,WACxB,uBAA0B,aAC1B,yBAA4B,iDAC5B,yBAA4B,iDAC5B,0BAA6B,gDAC7B,4BAA+B,yCAC/B,sBAAyB,uHACzB,qBAAwB,iBACxB,QAAW,WACX,GAAM,KACN,sBAAyB,kDACzB,KAAQ,OACR,YAAe,OACf,UAAa,YACb,cAAiB,kBACjB,WAAc,eACd,aAAgB,sGAChB,OAAU,SACV,eAAkB,kBAClB,4BAA+B,yBAC/B,WAAc,SACd,eAAkB,OAElB,mBAAsB,WACtB,sBAAyB,cACzB,gBAAmB,cACnB,gBAAmB,QACnB,sBAAyB,cACzB,WAAc,+DACd,eAAkB,gFAClB,WAAc,wBACd,YAAe,+BACf,aAAgB,gBAChB,iBAAoB,eACpB,uBAA0B,gDAC1B,iBAAoB,YACpB,uBAA0B,mBAC1B,QAAW,UACX,gBAAmB,mBACnB,yBAA4B,wBAC5B,+BAAkC,0EAClC,0BAA6B,UAC7B,WAAc,kBACd,UAAa,aACb,aAAgB,gBAChB,0BAA6B,gEAC7B,UAAa,wBACb,SAAY,uBACZ,wBAA2B,2CAC3B,YAAe,eACf,cAAiB,iBACjB,mBAAsB,iBACtB,kBAAqB,gBACrB,OAAU,UACV,YAAe,CACb,UAAa,cACb,YAAe,eAEjB,cAAiB,SACjB,aAAgB,gBAChB,eAAkB,WAClB,oBAAuB,QACvB,YAAe,QACf,eAAkB,YAClB,oBAAuB,MACvB,KAAQ,OACR,UAAa,aACb,oBAAuB,gBACvB,oBAAuB,gBACvB,yBAA4B,sBAC5B,yBAA4B,sBAC5B,mBAAsB,6BACtB,WAAc,SACd,mBAAsB,iBACtB,sBAAyB,0BACzB,+BAAkC,2EAClC,iCAAoC,iFACpC,uBAA0B,4CAC1B,iBAAoB,8FACpB,iBAAoB,YACpB,gBAAmB,YACnB,eAAkB,cAClB,SAAY,QACZ,WAAc,UACd,QAAW,WACX,WAAc,cACd,yBAA4B,2BAC5B,gCAAmC,+FACnC,mBAAsB,iBACtB,wBAA2B,aAC3B,mBAAsB,QACtB,aAAgB,gBAChB,kBAAqB,sBACrB,uBAA0B,qBAC1B,sBAAyB,gPACzB,cAAiB,kBACjB,kBAAqB,iEACrB,kBAAqB,uBACrB,OAAU,YACV,eAAkB,kBAClB,aAAgB,eAChB,YAAe,cACf,UAAa,eACb,UAAa,eACb,mBAAsB,gBACtB,kBAAqB,gBACrB,aAAgB,WAChB,8BAAiC,6EACjC,gCAAmC,mFACnC,kBAAqB,oBACrB,2BAA8B,8CAC9B,6BAAgC,gDAChC,OAAU,SACV,UAAa,YACb,iBAAoB,iBACpB,gBAAmB,mBACnB,2BAA8B,+CAC9B,yBAA4B,4CAC5B,mBAAsB,sBACtB,aAAgB,gBAChB,YAAe,CACb,UAAa,OACb,YAAe,aAGjB,aAAgB,mBAChB,sBAAyB,iDACzB,aAAgB,0CAChB,gBAAmB,6EACnB,uBAA0B,2BAC1B,mBAAsB,SACtB,mBAAsB,SACtB,kBAAqB,QACrB,uBAA0B,kBAC1B,2BAA8B,0BAC9B,gBAAmB,MACnB,sBAAyB,sBACzB,kBAAqB,cACrB,qBAAwB,WACxB,eAAkB,KAClB,mBAAsB,SACtB,qBAAwB,WACxB,sBAAyB,uEACzB,cAAiB,kBACjB,wBAA2B,uBAC3B,wBAA2B,gCAC3B,uBAA0B,gCAC1B,wBAA2B,oBAC3B,0BAA6B,aAC7B,4BAA+B,+BAC/B,sCAAyC,iBACzC,iCAAoC,yDACpC,MAAS,QACT,mBAAsB,qBACtB,QAAW,UACX,aAAgB,UAChB,8BAAiC,qDACjC,wBAA2B,yBAC3B,oBAAuB,qBACvB,kBAAqB,0CACrB,uBAA0B,gBAC1B,0BAA6B,mBAC7B,qBAAwB,4GACxB,oBAAuB,4BACvB,YAAe,OACf,YAAe,OACf,WAAc,2BACd,eAAkB,UAClB,mBAAsB,eACtB,eAAkB,UAClB,gBAAmB,WACnB,wBAA2B,QAC3B,WAAc,MACd,mBAAsB,iBACtB,mBAAsB,WACtB,sBAAyB,iBACzB,wBAA2B,mBAC3B,kBAAqB,cACrB,kCAAqC,2BACrC,gBAAmB,eACnB,2CAA8C,wJAC9C,KAAQ,OACR,sBAAyB,mBACzB,wBAA2B,wDAC3B,oBAAuB,uBACvB,uBAA0B,mBAC1B,mCAAsC,qBACtC,mCAAsC,qBACtC,+BAAkC,OAClC,gCAAmC,QACnC,uBAA0B,UAC1B,8BAAiC,WACjC,wBAA2B,WAC3B,oBAAuB,YACvB,gCAAmC,QACnC,2BAA8B,eAC9B,8BAAiC,kBACjC,oBAAuB,4BACvB,wBAA2B,kDAC3B,gBAAmB,kCACnB,gBAAmB,WACnB,yBAA4B,iKAC5B,qBAAwB,kCACxB,+BAAkC,qBAClC,8BAAiC,iEACjC,kCAAqC,wBACrC,mCAAsC,yBACtC,sCAAyC,qCACzC,qBAAwB,gBACxB,oBAAuB,eACvB,MAAS,QACT,KAAQ,OACR,oBAAuB,OACvB,8BAAiC,wBACjC,gCAAmC,iDACnC,qBAAwB,UACxB,iBAAoB,YACpB,eAAkB,mBAClB,iBAAoB,8BACpB,qBAAwB,qCACxB,kBAAqB,kCACrB,oBAAuB,wBACvB,iBAAoB,qBACpB,wBAA2B,+BAC3B,eAAkB,mBAClB,mBAAsB,mFACtB,qBAAwB,iBACxB,0BAA6B,2CAC7B,yBAA4B,qFAC5B,gCAAmC,gFACnC,WAAc,CACZ,YAAe,cAEjB,iBAAoB,wBACpB,yBAA4B,4CAC5B,0BAA6B,CAC3B,YAAe,kDAEjB,eAAkB,CAChB,UAAa,kBACb,YAAe,oBAEjB,aAAgB,MAChB,wBAA2B,qFAC3B,uBAA0B,mEAC1B,qBAAwB,4DACxB,uBAA0B,6BAC1B,aAAgB,gBAChB,cAAiB,iBACjB,YAAe,eACf,aAAgB,gBAChB,uBAA0B,oKAC1B,8BAAiC,8FACjC,6BAAgC,2JAChC,cAAiB,iBACjB,UAAa,OACb,aAAgB,UAChB,iBAAoB,0CACpB,oBAAuB,0CACvB,wBAA2B,oEAC3B,yBAA4B,mEAC5B,kBAAqB,qCACrB,qBAAwB,qCACxB,uBAA0B,iBAC1B,qBAAwB,6FACxB,qBAAwB,oGACxB,qBAAwB,cACxB,mBAAsB,SACtB,qBAAwB,aACxB,qBAAwB,gBACxB,uBAA0B,kBAC1B,mCAAsC,mDACtC,qCAAwC,qDACxC,mCAAsC,0DACtC,qCAAwC,4DACxC,KAAQ,OACR,KAAQ,OACR,2BAA8B,wBAC9B,6BAAgC,2GAChC,oBAAuB,gBAEvB,sBAAyB,iBACzB,OAAU,SACV,uBAA0B,yEAC1B,gBAAmB,mBACnB,KAAQ,OACR,YAAe,WACf,YAAe,eACf,UAAa,aACb,WAAc,cACd,aAAgB,eAChB,yBAA4B,uDAC5B,mBAAsB,QACtB,cAAiB,QACjB,aAAgB,CACd,UAAa,eACb,YAAe,iBAEjB,oBAAuB,mCACvB,SAAY,YACZ,iBAAoB,+BACpB,wBAA2B,oBAC3B,cAAiB,iBACjB,kBAAqB,8FACrB,eAAkB,6BAClB,eAAkB,qCAClB,iBAAoB,qBACpB,iBAAoB,0BACpB,wBAA2B,4CAC3B,WAAc,aACd,wBAA2B,0BAC3B,sBAAyB,sFACzB,0BAA6B,oEAC7B,wBAA2B,gDAC3B,mBAAsB,oBACtB,oBAAuB,iBACvB,oBAAuB,uIACvB,2BAA8B,mEAC9B,0BAA6B,gIAC7B,0BAA6B,2CAC7B,2BAA8B,4CAG9B,0BAA2B,eAC3B,gCAAiC,2BACjC,qCAAsC,uBACtC,2BAA4B,WAC5B,yBAA0B,0CAC1B,wBAAyB,UACzB,mBAAoB,oBACpB,iCAAkC,KAClC,qCAAsC,QACtC,kBAAmB,6FACnB,cAAe,SACf,eAAgB,UAChB,WAAY,MACZ,cAAe,SACf,YAAa,OACb,cAAe,SACf,aAAc,QACd,cAAe,SACf,oCAAqC,yBACrC,0CAA2C,4DAC3C,yCAA0C,2DAC1C,mCAAoC,mBACpC,yCAA0C,yDAC1C,wCAAyC,yDACzC,2BAA4B,+DAC5B,wBAAyB,gBACzB,qBAAsB,aACtB,wBAAyB,gBACzB,mBAAoB,aACpB,oBAAqB,cACrB,kBAAmB,OACnB,qBAAsB,oBACtB,oCAAqC,uEACrC,+BAAgC,0FAChC,6BAA8B,oFAC9B,yBAA0B,CACxB,UAAa,kBACb,YAAe,uBAEjB,6BAA8B,MAC9B,8BAA+B,OAC/B,wBAAyB,CACvB,UAAa,yCACb,YAAe,+CAEjB,oCAAqC,0BACrC,kCAAmC,CACjC,UAAa,qBACb,YAAe,uBAEjB,kCAAmC,CACjC,UAAa,qBACb,YAAe,uBAEjB,wCAAyC,CACvC,UAAa,eACb,YAAe,iBAEjB,wCAAyC,CACvC,UAAa,eACb,YAAe,iBAEjB,wBAAyB,qBACzB,qBAAsB,wCACtB,uBAAwB,oBACxB,2BAA4B,CAC1B,YAAe,cAEjB,yBAA0B,mBAC1B,8BAA+B,sBAC/B,iBAAkB,+BAClB,qBAAsB,iBACtB,uBAAwB,sBACxB,wBAAyB,gDACzB,2BAA4B,6BAC5B,8BAA+B,6CAC/B,8BAA+B,YAC/B,2BAA4B,SAC5B,kCAAmC,qBACnC,oCAAqC,0BACrC,oCAAqC,wBACrC,oCAAqC,wBACrC,oCAAqC,wBACrC,oCAAqC,+DACrC,0CAA2C,iBAC3C,sCAAuC,kCACvC,8CAA+C,oBAC/C,uCAAwC,oCACxC,wCAAyC,oBACzC,yCAA0C,uBAC1C,0CAA2C,iCAC3C,kDAAmD,mBACnD,2CAA4C,mCAC5C,4CAA6C,mBAC7C,6CAA8C,sBAC9C,2CAA4C,4BAC5C,6CAA8C,8BAC9C,uCAAwC,6BACxC,yCAA0C,+BAC1C,4BAA6B,sEAC7B,mCAAoC,yDACpC,wCAAyC,uGACzC,+CAAgD,0FAChD,wCAAyC,kGACzC,+CAAgD,qFAChD,gCAAiC,oCACjC,mCAAoC,mCACpC,wCAAyC,8BACzC,iCAAkC,mCAClC,oCAAqC,gCACrC,yCAA0C,2BAC1C,mCAAoC,8CACpC,wCAAyC,6CACzC,yCAA0C,6CAC1C,uCAAwC,+BACxC,yCAA0C,mCAC1C,sCAAuC,uCACvC,yCAA0C,sCAC1C,mBAAoB,eACpB,iBAAkB,YAClB,wBAAyB,eACzB,uBAAwB,OACxB,2BAA4B,iBAC5B,wBAAyB,OACzB,+BAAgC,iBAChC,sBAAuB,OACvB,wBAAyB,gBACzB,wBAAyB,CACvB,UAAa,UACb,YAAe,YAEjB,uBAAwB,CACtB,UAAa,YACb,YAAe,cAEjB,4BAA6B,eAC7B,kCAAmC,WACnC,4BAA6B,iBAC7B,kCAAmC,aAOnC,uBAAwB,6BACxB,sBAAuB,CACrB,UAAa,aACb,YAAe,eAEjB,2BAA4B,kBAC5B,yBAA0B,qBAC1B,wBAAyB,iBACzB,6BAA8B,mBAC9B,8BAA+B,mBAC/B,oCAAqC,CACnC,UAAa,gDACb,YAAe,sDAEjB,uBAAwB,60CACxB,2BAA4B,YAC5B,2BAA4B,eAC5B,uBAAwB,WACxB,yBAA0B,aAC1B,8BAA+B,+BAC/B,8BAA+B,+BAC/B,oBAAqB,qEACrB,6CAA8C,kBAC9C,+BAAgC,uBAChC,6BAA8B,MAC9B,8BAA+B,kGAC/B,oBAAqB,SACrB,iCAAkC,mBAClC,wBAAyB,OACzB,0BAA2B,SAC3B,uBAAwB,MACxB,yBAA0B,QAC1B,8BAA+B,cAC/B,iCAAkC,mBAClC,gCAAiC,gBACjC,8BAA+B,cAC/B,iCAAkC,qBAClC,iCAAkC,qBAClC,sCAAuC,2BACvC,sCAAuC,2BACvC,kCAAmC,iBACnC,+BAAgC,cAChC,uCAAwC,uBACxC,oCAAqC,oBACrC,8CAA+C,8BAC/C,yBAA0B,gFAC1B,2BAA4B,gBAC5B,6BAA8B,eAC9B,kCAAmC,YACnC,kCAAmC,YAEnC,2BAA4B,WAC5B,8BAA+B,eAC/B,yBAA0B,SAC1B,2BAA4B,WAC5B,uBAAwB,OACxB,6BAA8B,QAC9B,4BAA6B,OAC7B,0BAA2B,WAC3B,uCAAwC,4EACxC,uCAAwC,4EACxC,wCAAyC,gBACzC,sCAAuC,+EACvC,sBAAuB,aACvB,uBAAwB,cACxB,uBAAwB,cACxB,qBAAsB,YACtB,sBAAuB,aACvB,wBAAyB,UACzB,sCAAuC,4DACvC,gDAAiD,2IACjD,8CAA+C,yIAC/C,yBAA0B,mBAC1B,yBAA0B,aAC1B,2BAA4B,oEAC5B,aAAc,QACd,+BAAgC,yBAChC,oBAAuB,6BACvB,0BAA2B,aAC3B,+BAAgC,cAChC,oCAAqC,mBACrC,yBAA0B,eAC1B,8BAA+B,aAC/B,wBAAyB,aACzB,uBAAwB,WACxB,oBAAqB,eACrB,qBAAsB,UACtB,eAAgB,kBAChB,wBAAyB,mBACzB,yBAA0B,mBAC1B,qBAAsB,eACtB,yBAA0B,mBAC1B,wBAAyB,kBACzB,gBAAiB,UAEjB,cAAe,QACf,gBAAiB,6CACjB,aAAc,OACd,cAAe,QACf,cAAe,QACf,cAAe,QACf,iCAAkC,yBAClC,oBAAqB,CACnB,UAAa,wBACb,YAAe,0BAEjB,sCAAuC,YACvC,yBAA0B,SAC1B,sBAAuB,MACvB,wBAAyB,QACzB,uBAAwB,eACxB,uCAAwC,eACxC,kCAAmC,oBACnC,aAAc,OACd,0CAA2C,wBAC3C,+CAAgD,yCAChD,oBAAqB,mBACrB,kCAAmC,2BACnC,2BAA4B,gBAC5B,yBAA0B,mBAC1B,eAAgB,YAChB,+BAAgC,sBAEhC,4BAA6B,2CAC7B,iCAAkC,iBAClC,gCAAiC,SACjC,kCAAmC,kBACnC,oCAAqC,kBACrC,kCAAmC,kBACnC,oCAAqC,kBACrC,iCAAkC,eAClC,qCAAsC,qBACtC,wCAAyC,cACzC,iCAAkC,uBAClC,gCAAiC,eACjC,kCAAmC,wBACnC,oCAAqC,wBACrC,kCAAmC,wBACnC,oCAAqC,wBACrC,iCAAkC,uBAClC,qCAAsC,2BACtC,wCAAyC,oBACzC,wCAAyC,sCACzC,uCAAwC,8BACxC,yCAA0C,sCAC1C,2CAA4C,uCAC5C,yCAA0C,sCAC1C,2CAA4C,uCAE5C,wCAAyC,qCACzC,4CAA6C,yCAC7C,4BAA6B,wBAC7B,4BAA6B,sBAC7B,sBAAuB,qBACvB,oBAAqB,QACrB,wBAAyB,YACzB,yBAA0B,qBAC1B,qBAAsB,CACpB,UAAa,0BACb,YAAe,4BAEjB,qBAAsB,CACpB,UAAa,YACb,YAAe,cAEjB,0BAA2B,CACzB,UAAa,gBACb,YAAe,kBAEjB,0BAA2B,iBAC3B,yBAA0B,iBAC1B,sBAAuB,aACvB,0BAA2B,MAC3B,uBAAwB,eACxB,uBAAwB,cACxB,yBAA0B,iBAE1B,4BAA6B,aAC7B,6BAA8B,cAC9B,+BAAgC,0EAChC,oBAAqB,UACrB,yBAA0B,eAC1B,yBAA0B,eAC1B,uBAAwB,CACtB,YAAe,kBAGjB,4BAA6B,CAC3B,UAAa,WACb,YAAe,aAEjB,mCAAoC,mBACpC,6BAA8B,kBAC9B,yBAA0B,CACxB,UAAa,YACb,YAAe,iBAEjB,0BAA2B,CACzB,UAAa,aACb,YAAe,kBAEjB,0BAA2B,CACzB,UAAa,aACb,YAAe,kBAEjB,6BAA8B,KAC9B,8BAA+B,MAC/B,mCAAoC,oBACpC,mCAAoC,2EACpC,6BAA8B,QAC9B,2BAA4B,qBAC5B,yBAA0B,sBAC1B,qCAAsC,YACtC,6CAA8C,mFAC9C,gDAAiD,qFACjD,qCAAsC,8JACtC,iDAAkD,6DAClD,oDAAqD,2EACrD,gDAAiD,iLACjD,qCAAsC,0FACtC,qCAAsC,YACtC,uCAAwC,cACxC,mCAAoC,SACpC,uCAAwC,mBACxC,wCAAyC,oBACzC,uCAAwC,cACxC,wCAAyC,eACzC,sCAAuC,CACrC,UAAa,UACb,YAAe,YAEjB,kCAAmC,+JACnC,qBAAsB,kBACtB,qBAAsB,MACtB,uBAAwB,QACxB,2BAA4B,4BAC5B,gCAAiC,cACjC,uCAAwC,gBACxC,yCAA0C,mBAC1C,2CAA4C,WAC5C,8CAA+C,gBAC/C,kCAAmC,WACnC,uBAAwB,aACxB,qBAAsB,WACtB,6BAA8B,oBAC9B,0BAA2B,gBAC3B,2BAA4B,kBAC5B,2BAA4B,cAC5B,kCAAmC,gBACnC,yBAA0B,mBAC1B,8BAA+B,sDAC/B,2CAA4C,cAC5C,qBAAsB,YACtB,qBAAsB,YACtB,wBAAyB,KACzB,qBAAsB,mBACtB,oBAAqB,mBACrB,0BAA2B,mBAC3B,6BAA8B,mEAC9B,kBAAmB,SAEnB,uBAAwB,iDACxB,6BAA8B,gBAC9B,4BAA6B,eAC7B,kBAAmB,iBACnB,8BAA+B,2HAC/B,0BAA2B,wHAC3B,6BAA8B,kBAC9B,6BAA8B,oBAC9B,yBAA0B,qBAC1B,0BAA2B,wBAC3B,mCAAoC,kDACpC,4BAA6B,aAC7B,2BAA4B,OAC5B,kCAAmC,kCACnC,kCAAmC,eACnC,6BAA8B,gBAC9B,mCAAoC,OACpC,0BAA2B,qCAC3B,6BAA8B,QAC9B,uBAAwB,oBACxB,iCAAkC,iBAClC,8BAA+B,gBAC/B,2BAA4B,CAC1B,UAAa,iBACb,YAAe,mBAEjB,+BAAgC,gBAChC,4BAA6B,WAC7B,6BAA8B,YAC9B,8BAA+B,iBAC/B,yBAA0B,QAC1B,uBAAwB,cACxB,+BAAgC,QAChC,oCAAqC,SACrC,8BAA+B,OAC/B,kBAAmB,QACnB,sBAAuB,mBACvB,qBAAsB,kDACtB,sBAAuB,iBACvB,mBAAoB,QACpB,qBAAsB,OACtB,uBAAwB,iBACxB,uBAAwB,SACxB,wBAAyB,eACzB,sBAAuB,cACvB,wBAAyB,gBACzB,uCAAwC,+CACxC,+BAAgC,uDAChC,kCAAmC,S","sources":["webpack://tweb/./src/lang.ts"],"sourcesContent":["const lang = {\n 'Animations': 'Animations',\n 'AttachAlbum': 'Album',\n 'Appearance.Color.Hex': 'HEX',\n 'Appearance.Color.RGB': 'RGB',\n 'BlockModal.Search.Placeholder': 'Block user...',\n 'DarkMode': 'Dark Mode',\n 'FilterIncludeExcludeInfo': 'Choose chats and types of chats that will\\nappear and never appear in this folder.',\n 'FilterMenuDelete': 'Delete Folder',\n 'FilterHeaderEdit': 'Edit Folder',\n 'FilterAllGroups': 'All Groups',\n 'FilterAllContacts': 'All Contacts',\n 'FilterAllNonContacts': 'All Non-Contacts',\n 'FilterAllChannels': 'All Channels',\n 'FilterAllBots': 'All Bots',\n 'EditContact.OriginalName': 'original name',\n 'EditProfile.FirstNameLabel': 'Name',\n 'EditProfile.BioLabel': 'Bio (optional)',\n 'EditProfile.Username.Label': 'Username (optional)',\n 'EditProfile.Username.Available': 'Username is available',\n 'EditProfile.Username.Taken': 'Username is already taken',\n 'EditProfile.Username.Invalid': 'Username is invalid',\n 'ExceptionModal.Search.Placeholder': 'Add exception...',\n 'Chat.Menu.SelectMessages': 'Select Messages',\n 'Chat.Menu.ClearSelection': 'Clear Selection',\n 'Chat.Menu.Hint': 'To **edit** or **reply**, close this menu.\\nThen tap next to a message.',\n 'Chat.Input.UnpinAll': 'Unpin All Messages',\n 'Chat.Input.Attach.PhotoOrVideo': 'Photo or Video',\n 'Chat.Input.Attach.Document': 'Document',\n 'Chat.Subscribe': 'SUBSCRIBE',\n 'Chat.Selection.LimitToast': 'Max selection count reached.',\n 'Chat.Search.MessagesFound': {\n 'one_value': '%d message found',\n 'other_value': '%d messages found'\n },\n 'Chat.Search.NoMessagesFound': 'No messages found',\n 'Chat.Search.PrivateSearch': 'Private Search',\n 'Chat.Service.TopicEdited.Mixed': '%1$@ changed the topic name and icon to %2$@',\n 'Chat.Service.TopicEdited.You.Mixed': 'You changed the topic name and icon to %2$@',\n 'Chat.Service.TopicEdited.Mixed.IconRemoved': '%1$@ changed the topic name to \"%1$@\" and removed icon',\n 'Chat.Service.TopicEdited.You.Mixed.IconRemoved': 'You changed the topic name to \"%1$@\" and removed icon',\n 'ChatList.Main.EmptyPlaceholder.Title': 'Your chats will appear here',\n 'ChatList.Main.EmptyPlaceholder.Subtitle': 'You have %s on Telegram',\n 'ChatList.Main.EmptyPlaceholder.SubtitleNoContacts': 'Use Telegram app on your [Android](https://telegram.org/android) or [iOS](https://telegram.org/dl/ios) device to sync your contacts',\n // \"ChatList.Menu.Archived\": \"Archived\",\n 'ChatList.Menu.SwitchTo.Webogram': 'Switch to Old Version',\n 'ChatList.Menu.SwitchTo.Z': 'Switch to Z version',\n 'ChatMigration.From': 'Migrated from %s',\n 'ChatMigration.To': 'Migrated to %s',\n 'ConnectionStatus.ForceReconnect': 'force reconnect',\n 'ConnectionStatus.ReconnectIn': 'Reconnect in %ds, %s',\n 'ConnectionStatus.Reconnect': 'reconnect',\n 'ConnectionStatus.Reconnecting': 'Reconnecting...',\n 'ConnectionStatus.TimedOut': 'Request timed out, %s',\n 'ConnectionStatus.Waiting': 'Waiting for network...',\n 'Contacts.Count': {\n 'one_value': '%d contact',\n 'other_value': '%d contacts'\n },\n 'Deactivated.Title': 'Too many tabs...',\n 'Deactivated.Subtitle': 'Telegram supports only one active tab with the app.\\nClick anywhere to continue using this tab.',\n 'Deactivated.Version.Title': 'WebK has updated...',\n 'Deactivated.Version.Subtitle': 'Another tab is running a newer version of Telegram.\\nClick anywhere to reload this tab.',\n // \"Drafts\": {\n // \"one_value\": \"%d draft\",\n // \"other_value\": \"%d drafts\",\n // },\n 'General.Keyboard': 'Keyboard',\n 'General.SendShortcut.Enter': 'Send by Enter',\n 'General.SendShortcut.CtrlEnter': 'Send by %s + Enter',\n 'General.SendShortcut.NewLine.ShiftEnter': 'New line by Shift + Enter',\n 'General.SendShortcut.NewLine.Enter': 'New line by Enter',\n 'General.TimeFormat': 'Time Format',\n 'General.TimeFormat.h12': '12-hour',\n 'General.TimeFormat.h23': '24-hour',\n 'ChatBackground.UploadWallpaper': 'Upload Wallpaper',\n 'ChatBackground.Blur': 'Blur Wallpaper Image',\n 'Notifications.Sound': 'Notification Sound',\n 'NewPrivateChat': 'New Private Chat',\n 'NewPoll.OptionLabel': 'Option %d',\n 'Message.Context.Selection.Copy': 'Copy selected',\n 'Message.Context.Selection.Clear': 'Clear selection',\n 'Message.Context.Selection.Delete': 'Delete selected',\n 'Message.Context.Selection.Forward': 'Forward selected',\n 'Message.Context.Selection.SendNow': 'Send Now selected',\n 'Message.Unsupported.Desktop': '__This message is currently not supported on Telegram Web. Try [getdesktop.telegram.org](https://getdesktop.telegram.org/)__',\n 'Message.Unsupported.Mobile': '__This message is currently not supported on Telegram Web. Try [telegram.org/dl](https://telegram.org/dl/)__',\n 'Checkbox.Enabled': 'Enabled',\n 'Checkbox.Disabled': 'Disabled',\n 'Error.PreviewSender.CaptionTooLong': 'Caption is too long.',\n 'PreviewSender.GroupItems': 'Group items',\n 'PreviewSender.SendAlbum': {\n 'one_value': 'Send Album',\n 'other_value': 'Send %d Albums'\n },\n 'Presence.YourChat': 'chat with yourself',\n 'Privacy.Devices': {\n 'one_value': '%1$d device',\n 'other_value': '%1$d devices'\n },\n 'Privacy.Websites': {\n 'one_value': '%1$d website',\n 'other_value': '%1$d websites'\n },\n 'Privacy.SensitiveContent': 'Sensitive Content',\n 'PrivacyModal.Search.Placeholder': 'Add Users or Groups...',\n 'Permissions.NoExceptions': 'No exceptions',\n 'Permissions.ExceptionsCount': {\n 'one_value': '%d exception',\n 'other_value': '%d exceptions'\n },\n 'Link.Available': 'Link is available',\n 'Link.Taken': 'Link is already taken',\n 'Link.Invalid': 'Link is invalid',\n 'StickersTab.SearchPlaceholder': 'Search Stickers',\n 'ForwardedFrom': 'Forwarded from %s',\n 'Popup.Avatar.Title': 'Drag to Reposition',\n 'Popup.Unpin.AllTitle': 'Unpin all messages',\n 'Popup.Unpin.HideTitle': 'Hide pinned messages',\n 'Popup.Unpin.HideDescription': 'Do you want to hide the pinned message bar? It wil stay hidden until a new message is pinned.',\n 'Popup.Unpin.Hide': 'Hide',\n 'TwoStepAuth.EmailCodeChangeEmail': 'Change Email',\n 'MarkupTooltip.LinkPlaceholder': 'Enter URL...',\n 'MediaViewer.Context.Download': 'Download',\n 'Profile': 'Profile',\n 'Saved': 'Saved',\n 'Deleted': 'Deleted',\n 'ReportBug': 'Report Bug',\n 'Notifications.Count': {\n 'one_value': '%d notification',\n 'other_value': '%d notifications'\n },\n 'Notifications.Forwarded': {\n 'one_value': 'Forwarded %d message',\n 'other_value': 'Forwarded %d messages'\n },\n 'Notifications.New': 'New notification',\n 'PushNotification.Action.Mute1d': 'Mute background alerts for 1 day',\n 'PushNotification.Action.Settings': 'Background alerts settings',\n 'PushNotification.Action.Mute1d.Mobile': 'Mute for 24H',\n 'PushNotification.Action.Settings.Mobile': 'Alerts settings',\n 'PushNotification.Message.NoPreview': 'You have a new message',\n 'LogOut.Description': 'Are you sure you want to log out?\\n\\nNote that you can seamlessly use Telegram on all your devices at once.',\n // \"PushNotification.Action.Mute1d.Success\": \"Notification settings were successfully saved.\",\n // it is from iOS\n 'VoiceChat.DiscussionGroup': 'discussion group',\n 'PaymentInfo.CVV': 'CVV Code',\n 'PaymentInfo.Card.Title': 'Enter your card information',\n 'PaymentInfo.Billing.Title': 'Enter your billing address',\n 'PaymentInfo.Done': 'PROCEED TO CHECKOUT',\n 'PaymentCard.Error.Invalid': 'Invalid card number',\n 'PaymentCard.Error.Incomplete': 'Incomplete card number',\n 'LimitReached.Ok': 'OK, GOT IT',\n 'Username.Purchase': '**This username is already taken.** However, it is currently available for purchase. [Learn more…]()',\n 'Video.Unsupported.Desktop': '__Unfortunately, this video can\\'t be played on Telegram Web. Try opening it with our [desktop app](https://getdesktop.telegram.org/) instead.__',\n 'Video.Unsupported.Mobile': '__Unfortunately, this video can\\'t be played on Telegram Web. Try opening it with our [mobile app](https://telegram.org/dl/) instead.__',\n\n // * android\n 'AccDescrEditing': 'Editing',\n 'ActionCreateChannel': 'Channel created',\n 'ActionCreateGroup': 'un1 created the group',\n 'ActionChangedTitle': 'un1 changed the group name to un2',\n 'ActionRemovedPhoto': 'un1 removed the group photo',\n 'ActionChangedPhoto': 'un1 changed the group photo',\n 'ActionChangedVideo': 'un1 changed the group video',\n 'ActionAddUser': 'un1 added un2',\n 'ActionAddUserSelf': 'un1 returned to the group',\n 'ActionAddUserSelfYou': 'You returned to the group',\n 'ActionAddUserSelfMega': 'un1 joined the group',\n 'ActionLeftUser': 'un1 left the group',\n 'ActionKickUser': 'un1 removed un2',\n 'ActionInviteUser': 'un1 joined the group via invite link',\n 'ActionPinnedNoText': 'un1 pinned a message',\n 'ActionMigrateFromGroup': 'This group was upgraded to a supergroup',\n 'ActionYouScored': 'You scored %1$s',\n 'ActionUserScored': 'un1 scored %1$s',\n 'ActionYouScoredInGame': 'You scored %1$s in un2',\n 'ActionUserScoredInGame': 'un1 scored %1$s in un2',\n 'AndOther': {\n 'one_value': 'and %1$d other',\n 'other_value': 'and %1$d others'\n },\n 'AttachPhoto': 'Photo',\n 'AttachVideo': 'Video',\n 'AttachGif': 'GIF',\n 'AttachLocation': 'Location',\n 'AttachLiveLocation': 'Live Location',\n 'AttachContact': 'Contact',\n // \"AttachDocument\": \"File\",\n 'AttachSticker': 'Sticker',\n 'AttachAudio': 'Voice message',\n 'AttachRound': 'Video message',\n 'AttachGame': 'Game',\n 'Bot': 'bot',\n // \"ChannelJoined\": \"You joined this channel\",\n 'ChannelMegaJoined': 'You joined this group',\n 'EnterChannelName': 'Channel name',\n 'DescriptionOptionalPlaceholder': 'Description (optional)',\n 'DescriptionPlaceholder': 'Description',\n 'DiscussionStarted': 'Discussion started',\n 'Draft': 'Draft',\n 'FilterAlwaysShow': 'Include Chats',\n 'FilterNeverShow': 'Exclude Chats',\n 'FilterInclude': 'Included Chats',\n 'FilterExclude': 'Excluded Chats',\n 'FilterChatTypes': 'Chat types',\n 'FilterChats': 'Chats',\n 'FilterNew': 'New Folder',\n 'Filters': 'Folders',\n 'FilterRecommended': 'Recommended Folders',\n 'FilterShowMoreChats': {\n 'one_value': 'Show %1$d More Chat',\n 'other_value': 'Show %1$d More Chats'\n },\n 'ForwardedMessageCount': {\n 'one_value': 'Forwarded message',\n 'other_value': '%1$d forwarded messages'\n },\n 'FromYou': 'You',\n 'Add': 'Add',\n 'Chats': {\n 'one_value': '%1$d chat',\n 'other_value': '%1$d chats'\n },\n 'Channels': {\n 'one_value': '%1$d channel',\n 'other_value': '%1$d channels'\n },\n 'Comments': {\n 'one_value': '%1$d Comment',\n 'other_value': '%1$d Comments'\n },\n 'Groups': {\n 'one_value': '%1$d group',\n 'other_value': '%1$d groups'\n },\n 'Users': {\n 'one_value': '%1$d user',\n 'other_value': '%1$d users'\n },\n 'Members': {\n 'one_value': '%1$d member',\n 'other_value': '%1$d members'\n },\n 'messages': {\n 'one_value': '%1$d message',\n 'other_value': '%1$d messages'\n },\n 'UsernameHelpLink': 'This link opens a chat with you:\\n%1$s',\n 'NewChannel': 'New Channel',\n 'NewGroup': 'New Group',\n 'Contacts': 'Contacts',\n 'SavedMessages': 'Saved Messages',\n 'Settings': 'Settings',\n 'SettingsHelp': 'Help',\n 'General': 'General',\n 'TextSize': 'Message Text Size',\n 'ChatBackground': 'Chat Background',\n 'EnableAnimations': 'Enable Animations',\n 'AutoDownloadMedia': 'Auto-Download Media',\n 'AutodownloadContacts': 'Contacts',\n 'AutodownloadPrivateChats': 'Private Chats',\n 'AutodownloadGroupChats': 'Group Chats',\n 'AutodownloadChannels': 'Channels',\n 'AutoplayGIF': 'GIFs',\n 'AutoplayVideo': 'Videos',\n 'NotificationsForGroups': 'Notifications for groups',\n 'NotificationsForPrivateChats': 'Notifications for private chats',\n 'NotificationsForChannels': 'Notifications for channels',\n 'NotificationsPrivateChats': 'Private Chats',\n 'NotificationsGroups': 'Groups',\n 'NotificationsChannels': 'Channels',\n 'NotificationsOther': 'Other',\n 'MarkAsUnread': 'Mark as unread',\n 'MarkAsRead': 'Mark as read',\n 'ContactJoined': 'Contact joined Telegram',\n 'Loading': 'Loading...',\n 'Unblock': 'Unblock',\n 'BlockedUsers': 'Blocked Users',\n 'BlockedUsersInfo': 'Blocked users will not be able to contact you and will not see your Last Seen time.',\n 'BlockedEmpty': 'None',\n 'TwoStepVerification': 'Two-Step Verification',\n 'TwoStepVerificationTitle': 'Two-Step Verification',\n 'PinnedMessage': 'Pinned Message',\n 'PinnedMessagesCount': {\n 'one_value': 'Pinned Message',\n 'other_value': '%1$d Pinned Messages'\n },\n // \"PreviousPinnedMessage\": \"Previous Message\",\n 'PrivacyExceptions': 'Exceptions',\n 'PrivacyLastSeen': 'Last Seen & Online',\n 'PrivacySettings': 'Privacy and Security',\n 'PrivacyTitle': 'Privacy',\n 'PrivacyPhone': 'Phone Number',\n 'PrivacyPhoneTitle': 'Who can see my phone number?',\n 'PrivacyPhoneTitle2': 'Who can find me by my number?',\n 'PrivacyPhoneInfo': 'Users who have your number saved in their contacts will also see it on Telegram.',\n 'PrivacyPhoneInfo3': 'Users who add your number to their contacts will see it on Telegram only if they are your contacts.',\n 'PrivacyProfilePhoto': 'Profile Photos',\n 'PrivacyProfilePhotoTitle': 'Who can see my profile photos & videos?',\n 'PrivacyP2PHeader': 'Peer-to-Peer',\n 'PrivacyForwardsTitle': 'Who can add a link to my account when forwarding my messages?',\n 'Reminders': 'Reminders',\n 'ScheduledMessages': 'Scheduled Messages',\n 'LastSeenTitle': 'Who can see your Last Seen time?',\n 'SessionsTitle': 'Active Sessions',\n 'CurrentSession': 'This device',\n 'TerminateAllSessions': 'Terminate All Other Sessions',\n 'TerminateSessionText': 'Are you sure you want to terminate this session?',\n 'OtherSessions': 'Active sessions',\n 'AreYouSureDeleteSingleMessage': 'Are you sure you want to delete this message?',\n 'AreYouSureDeleteFewMessages': 'Are you sure you want to delete these messages?',\n 'AreYouSureDeleteSingleMessageMega': 'Are you sure you want to delete this message for everyone?',\n 'AreYouSureDeleteFewMessagesMega': 'Are you sure you want to delete these messages for everyone?',\n 'AreYouSureDeleteAndExitName': 'Are you sure you want to delete and leave the group **%1$s**?',\n 'AreYouSureDeleteThisChatSavedMessages': 'Are you sure you want to delete **Saved Messages**?',\n 'AreYouSureDeleteThisChatWithUser': 'Are you sure you want to delete the chat with **%1$s**?',\n 'AreYouSureSessionTitle': 'Terminate session',\n 'AreYouSureSessionsTitle': 'Terminate sessions',\n 'AreYouSureSessions': 'Are you sure you want to terminate all other sessions?',\n 'Terminate': 'Terminate',\n 'WhoCanCallMe': 'Who can call me?',\n 'WhoCanAddMe': 'Who can add me to group chats?',\n 'ArchivedChats': 'Archived Chats',\n 'Cancel': 'Cancel',\n 'HistoryCleared': 'History was cleared',\n 'Archive': 'Archive',\n 'Unarchive': 'Unarchive',\n 'Delete': 'Delete',\n 'Reply': 'Reply',\n 'Edit': 'Edit',\n 'Forward': 'Forward',\n 'CopyLink': 'Copy Link',\n 'Copy': 'Copy',\n 'Search': 'Search',\n 'LinkCopied': 'Link copied to clipboard',\n 'LinkCopiedPrivateInfo': 'This link will only work for members of this chat.',\n 'GroupAddMembers': 'Add Members',\n 'SendMessageTo': 'Add people...',\n // \"SelectChat\": \"Select Chat\",\n 'JumpToDate': 'Jump to Date',\n 'Caption': 'Caption',\n 'Message': 'Message',\n 'Poll': 'Poll',\n 'SharedFilesTab2': 'Files',\n 'SharedMediaTab2': 'Media',\n // \"SharedMediaTabFull2\": \"Shared Media\",\n // \"SharedGroupsTab2\": \"Groups\",\n 'SharedLinksTab2': 'Links',\n 'SharedMusicTab2': 'Music',\n 'SharedVoiceTab2': 'Voice',\n // \"SharedGIFsTab2\": \"GIFs\",\n 'NewPoll': 'New Poll',\n 'PollOptions': 'Poll options',\n 'AskAQuestion': 'Ask a Question',\n 'AddAnExplanationInfo': 'Users will see this text after choosing the wrong answer, good for educational purposes.',\n 'AccDescrQuizExplanation': 'Explanation',\n 'PhoneCopied': 'Phone copied to clipboard',\n 'UsernameCopied': 'Username copied to clipboard.',\n // \"HashtagCopied\": \"Hashtag copied to clipboard.\",\n 'BioCopied': 'Bio copied to clipboard.',\n 'UserBio': 'Bio',\n 'Username': 'Username',\n 'UsernameAlso': 'also %1$s',\n 'UsernameHelp': 'You can choose a username on **Telegram**. If you do, people will be able to find you by this username and contact you without needing your phone number.\\n\\nYou can use **a–z**, **0–9** and underscores. Minimum length is **5** characters.',\n 'Phone': 'Phone',\n 'Notifications': 'Notifications',\n 'AreYouSureDeleteContact': 'Are you sure you want to delete this contact?',\n 'AreYouSureDeleteAndExit': 'Are you sure you want to delete and leave the group?',\n 'AreYouSureDeleteAndExitChannel': 'Do you want to delete and leave the channel?',\n 'DeleteContact': 'Delete contact',\n 'GroupType': 'Group Type',\n 'ChannelType': 'Channel Type',\n 'TypePrivate': 'Private',\n 'TypePublic': 'Public',\n 'TypePrivateGroup': 'Private',\n 'TypePublicGroup': 'Public',\n 'GroupMembers': 'Members',\n 'DeleteMega': 'Delete Group',\n 'DeleteMegaMenu': 'Delete group',\n 'DeleteAndExitButton': 'Delete and Leave Group',\n 'ChannelDelete': 'Delete Channel',\n 'ChannelDeleteMenu': 'Delete channel',\n 'ChannelPermissions': 'Permissions',\n 'ChannelPermissionsHeader': 'What can members of this group do?',\n 'ChannelAddException': 'Add Exception',\n 'ChannelBlockedUsers': 'Removed users',\n 'NoBlockedUsers': 'No removed users',\n 'UserRestrictions': 'User Permissions',\n 'UserRestrictionsDisabled': 'This option is disabled for all members in Group Permissions',\n 'UserRestrictionsCanDo': 'What can this user do?',\n 'UserRestrictionsRead': 'Read Messages',\n 'UserRestrictionsSend': 'Send Messages',\n 'UserRestrictionsSendMedia': 'Send Media',\n 'UserRestrictionsSendPolls': 'Send Polls',\n 'UserRestrictionsSendStickers': 'Send Stickers and GIFs',\n 'UserRestrictionsEmbedLinks': 'Embed Links',\n 'UserRestrictionsChangeInfo': 'Change Chat Info',\n 'UserRestrictionsPinMessages': 'Pin Messages',\n 'UserRestrictionsInviteUsers': 'Add Users',\n // \"UserRestrictionsNoRead\": \"can't read\",\n 'UserRestrictionsNoSend': 'can\\'t send messages',\n 'UserRestrictionsNoSendMedia': 'no media',\n 'UserRestrictionsNoSendPolls': 'no polls',\n 'UserRestrictionsNoSendStickers': 'no stickers & GIFs',\n 'UserRestrictionsNoEmbedLinks': 'no embed links',\n 'UserRestrictionsNoChangeInfo': 'can\\'t change Info',\n 'UserRestrictionsNoPinMessages': 'no pins',\n 'UserRestrictionsNoInviteUsers': 'can\\'t add users',\n 'UserRestrictionsBlock': 'Ban and remove from group',\n 'ChannelPublic': 'Public Channel',\n 'MegaPublic': 'Public Group',\n // \"MegaLocation\": \"Location-based Group\",\n 'ChannelPublicInfo': 'Public channels can be found in search, anyone can join them.',\n 'MegaPublicInfo': 'Public groups can be found in search, chat history is available to everyone and anyone can join.',\n 'ChannelPrivate': 'Private Channel',\n 'MegaPrivate': 'Private Group',\n 'ChannelPrivateInfo': 'Private channels can only be joined via an invite link.',\n 'MegaPrivateInfo': 'Private groups can only be joined if you were invited or have an invite link.',\n 'ChannelPrivateLinkHelp': 'People can join your channel by following this link. You can revoke the link any time.',\n 'MegaPrivateLinkHelp': 'People can join your group by following this link. You can revoke the link any time.',\n 'RevokeButton': 'Revoke',\n 'RevokeLink': 'Revoke Link',\n 'RevokeAlert': 'Are you sure you want to revoke this link? Once the link is revoked, no one will be able to join using it.',\n 'SetUrlPlaceholder': 'Link',\n 'Subscribers': {\n 'one_value': '%1$d subscriber',\n 'other_value': '%1$d subscribers'\n },\n 'SearchGifsTitle': 'Search GIFs',\n 'PinMessageAlert': 'Pin this message in the group?',\n 'PinMessageAlertTitle': 'Pin message',\n 'PinMessageAlertChannel': 'Do you want to pin this message in this channel?',\n 'PinMessageAlertChat': 'Do you want to pin this message at the top of the chat?',\n 'UnpinMessageAlertTitle': 'Unpin message',\n 'UnpinMessageAlert': 'Do you want to unpin this message?',\n 'PinNotify': 'Notify all members',\n 'PinMessage': 'Pin',\n 'UnpinMessage': 'Unpin',\n 'PinAlsoFor': 'Also pin for %1$s',\n 'DeleteMessagesTitle': 'Delete %1$s',\n 'DeleteSingleMessagesTitle': 'Delete message',\n 'DeleteMessagesOption': 'Unsend My Messages',\n 'DeleteMessagesOptionAlso': 'Also delete for %1$s',\n 'DeleteForAll': 'Delete for all members',\n 'DeleteMessagesTextGroup': 'You can also delete the %1$s you sent from the inboxes of other group members by checking \"Unsend my messages\".',\n 'LeaveChannel': 'Leave Channel',\n 'LeaveChannelMenu': 'Leave channel',\n 'ChannelLeaveAlertWithName': 'Are you sure you want to leave **%1$s**?',\n 'LeaveMegaMenu': 'Leave group',\n 'DeleteChatUser': 'Delete chat',\n 'PleaseEnterCurrentPassword': 'Enter your password',\n 'PleaseEnterFirstPassword': 'Enter a password',\n 'PleaseReEnterPassword': 'Re-enter your password',\n 'Continue': 'Continue',\n 'YourEmailSkip': 'Skip',\n 'YourEmailSkipWarning': 'Warning',\n 'YourEmailSkipWarningText': 'No, seriously.\\n\\nIf you forget your password, you will lose access to your Telegram account. There will be no way to restore it.',\n 'TurnPasswordOffQuestionTitle': 'Disable password',\n 'TurnPasswordOffQuestion': 'Are you sure you want to disable your password?',\n 'Disable': 'Disable',\n 'TwoStepVerificationSetPassword': 'Set Password',\n 'TwoStepVerificationPasswordSet': 'Password Set!',\n 'TwoStepVerificationPasswordSetInfo': 'This password will be required when you log in on a new device in addition to the code you get in the SMS.',\n 'TwoStepVerificationPasswordReturnSettings': 'Return to Settings',\n 'RecoveryEmail': 'Recovery email',\n 'RecoveryEmailTitle': 'Recovery Email',\n 'ResendCode': 'Resend code',\n 'PasswordAsHintError': 'Hint must be different from your password',\n 'AddStickersCount': 'ADD %1$s',\n 'RemoveStickersCount': 'REMOVE %1$s',\n 'Stickers': {\n 'one_value': '%1$d sticker',\n 'other_value': '%1$d stickers'\n },\n 'HidAccount': 'The account was hidden by the user',\n 'TelegramFeatures': 'Telegram Features',\n 'SetColor': 'Set a color',\n 'Open': 'Open',\n 'OpenUrlTitle': 'Open Link',\n 'OpenUrlAlert2': 'Do you want to open %1$s?',\n 'FilterNoChatsToDisplay': 'Folder is empty',\n 'FilterNoChatsToDisplayInfo': 'No chats currently belong to this folder.',\n 'SupportStatus': 'support',\n 'Lately': 'last seen recently',\n 'WithinAWeek': 'last seen within a week',\n 'WithinAMonth': 'last seen within a month',\n 'ALongTimeAgo': 'last seen a long time ago',\n 'Online': 'online',\n 'MessageScheduleSend': 'Send Now',\n 'MessageScheduleEditTime': 'Reschedule',\n 'YouLeft': 'You left this group',\n 'Recent': 'Recent',\n 'Of': '%1$d of %2$d',\n 'NoResult': 'No results',\n 'Updating': 'Updating...',\n 'Emoji': 'Emoji',\n 'AddContactTitle': 'Add Contact',\n 'HiddenName': 'Deleted Account',\n 'Seconds': {\n 'one_value': '%1$d second',\n 'other_value': '%1$d seconds'\n },\n 'Minutes': {\n 'one_value': '%1$d minute',\n 'other_value': '%1$d minutes'\n },\n 'Hours': {\n 'one_value': '%1$d hour',\n 'other_value': '%1$d hours'\n },\n 'Days': {\n 'one_value': '%1$d day',\n 'other_value': '%1$d days'\n },\n 'Weeks': {\n 'one_value': '%1$d week',\n 'other_value': '%1$d weeks'\n },\n 'Months': {\n 'one_value': '%1$d month',\n 'other_value': '%1$d months'\n },\n 'Years': {\n 'one_value': '%1$d year',\n 'other_value': '%1$d years'\n },\n 'TodayAtFormattedWithToday': 'today at %1$s',\n 'formatDateAtTime': '%1$s at %2$s',\n 'JoinByPeekChannelTitle': 'Join Channel',\n 'JoinByPeekGroupTitle': 'Join Group',\n 'YouWereKicked': 'you were removed',\n 'ViaBot': 'via',\n 'InviteExpired': 'This invite link has expired.',\n 'NoUsernameFound': 'There is no Telegram account with this username.',\n 'PrivacyDeleteCloudDrafts': 'Delete All Cloud Drafts',\n 'AreYouSureClearDraftsTitle': 'Delete cloud drafts',\n 'AreYouSureClearDrafts': 'Are you sure you want to delete all cloud drafts?',\n 'BotInfoTitle': 'What can this bot do?',\n 'ChatYourSelf': 'forward here to save',\n 'GroupEmptyTitle1': 'You have created a **group**.',\n 'GroupEmptyTitle2': 'Groups can have:',\n 'GroupDescription1': 'Up to 200,000 members',\n 'GroupDescription2': 'Persistent chat history',\n 'GroupDescription3': 'Public links such as t.me/title',\n 'GroupDescription4': 'Admins with different rights',\n 'ChatYourSelfDescription1': 'Forward messages here to save them',\n 'ChatYourSelfDescription2': 'Send media and files to store them',\n 'ChatYourSelfDescription3': 'Access this chat from any device',\n 'ChatYourSelfDescription4': 'Use search to quickly find things',\n 'ChatYourSelfTitle': 'Your cloud storage',\n 'ActionYouCreateGroup': 'You created the group',\n 'NoMessages': 'No messages here yet...',\n 'NoScheduledMessages': 'No scheduled messages here yet...',\n 'NoMessagesGreetingsDescription': 'Send a message or tap the greeting below.',\n 'InviteToGroupError': 'Sorry, you can\\'t add this user to groups because of user\\'s privacy settings.',\n 'InviteToChannelError': 'Sorry, you can\\'t add this user to channels because of user\\'s privacy settings.',\n 'AddMembersAlertTitle': 'Add %1$s',\n 'AddOneMemberAlertTitle': 'Add member',\n 'AddMembersAlertNamesText': 'Are you sure you want to add %1$s to **%2$s**?',\n 'AddMembersAlertCountText': 'Are you sure you want to add %1$s to **%2$s**?',\n 'AddMembersForwardMessages': 'Show the last 100 messages to the new members',\n 'AddOneMemberForwardMessages': 'Show the last 100 messages to **%1$s**',\n 'PinToTopLimitReached2': 'Sorry, you can only pin %1$s to the top in the main list. More chats can be pinned in Chat Folders and your Archive.',\n 'FiltersSetupPinAlert': 'Set Up Folders',\n 'AppName': 'Telegram',\n 'OK': 'OK',\n 'PinFolderLimitReached': 'Sorry, you can\\'t pin any more chats to the top.',\n 'Send': 'Send',\n 'ChannelJoin': 'JOIN',\n 'Yesterday': 'yesterday',\n 'LeaveAComment': 'Leave a comment',\n 'ViewInChat': 'View in chat',\n 'LinkNotFound': 'Unfortunately, you can\\'t access this message. You are not a member of the chat where it was posted.',\n 'Create': 'Create',\n 'ViewDiscussion': 'View discussion',\n 'MessageScheduledUntilOnline': 'Scheduled until online',\n 'ReportChat': 'Report',\n 'ReportChatSpam': 'Spam',\n // \"ReportChatFakeAccount\": \"Fake Account\",\n 'ReportChatViolence': 'Violence',\n 'ReportChatPornography': 'Pornography',\n 'ReportChatChild': 'Child Abuse',\n 'ReportChatOther': 'Other',\n 'ReportChatDescription': 'Description',\n 'ReportInfo': 'Please enter any additional details relevant to your report.',\n 'ReportSentInfo': 'Telegram moderators will review your report.\\nThank you for your cooperation!',\n 'ReportHint': 'Additional details...',\n 'ChatHistory': 'Chat history for new members',\n 'ShareContact': 'Share contact',\n 'SendMessageTitle': 'Send message',\n 'SendContactToGroupText': 'Do you want to send this contact to **%1$s**?',\n 'ChannelBroadcast': 'Broadcast',\n 'ChannelSilentBroadcast': 'Silent Broadcast',\n 'Comment': 'Comment',\n 'SendAnonymously': 'Send anonymously',\n 'DiscardVoiceMessageTitle': 'Discard Voice Message',\n 'DiscardVoiceMessageDescription': 'Are you sure you want to stop recording and discard your voice message?',\n 'DiscardVoiceMessageAction': 'Discard',\n 'AddContact': 'Add to contacts',\n 'BlockUser': 'Block user',\n 'MobileHidden': 'Mobile hidden',\n 'MobileHiddenExceptionInfo': 'Phone number will be visible once %1$s adds you as a contact.',\n 'FirstName': 'First name (required)',\n 'LastName': 'Last name (optional)',\n 'AreYouSureBlockContact2': 'Are you sure you want to block **%1$s**?',\n 'UserBlocked': 'User blocked',\n 'UserUnblocked': 'User unblocked',\n 'AudioUnknownArtist': 'Unknown artist',\n 'AudioUnknownTitle': 'Unknown title',\n 'LogOut': 'Log out',\n 'OnlineCount': {\n 'one_value': '%1$d online',\n 'other_value': '%1$d online'\n },\n 'EditedMessage': 'edited',\n 'GlobalSearch': 'Global search',\n 'SearchMessages': 'Messages',\n 'SearchAllChatsShort': 'Chats',\n 'ClearButton': 'Clear',\n 'FilterAllChats': 'All Chats',\n 'FilterAllChatsShort': 'All',\n 'Call': 'Call',\n 'VideoCall': 'Video Call',\n 'CallMessageOutgoing': 'Outgoing Call',\n 'CallMessageIncoming': 'Incoming Call',\n 'CallMessageVideoOutgoing': 'Outgoing Video Call',\n 'CallMessageVideoIncoming': 'Incoming Video Call',\n 'VoipExchangingKeys': 'Exchanging encryption keys',\n 'VoipUnmute': 'Unmute',\n 'SavingContentTitle': 'Saving content',\n 'RestrictSavingContent': 'Restrict saving content',\n 'RestrictSavingContentInfoGroup': 'Members won\\'t be able to copy, save and forward content from this group.',\n 'RestrictSavingContentInfoChannel': 'Subscribers won\\'t be able to copy, save and forward content from this channel.',\n 'ClearOtherSessionsHelp': 'Logs out all devices except for this one.',\n 'SessionsListInfo': 'The official Telegram app is available for Android, iPhone, iPad, Windows, macOS and Linux.',\n 'SponsoredMessage': 'sponsored',\n 'OpenChannelPost': 'VIEW POST',\n 'FilterNameHint': 'Folder name',\n 'BotStart': 'START',\n 'BotUnblock': 'RESTART',\n 'BotStop': 'Stop bot',\n 'BotRestart': 'Restart bot',\n 'ShareYouPhoneNumberTitle': 'Share your phone number?',\n 'AreYouSureShareMyContactInfoBot': 'The bot will know your phone number. This can be useful for integration with other services.',\n 'DistanceUnitsTitle': 'Distance units',\n 'DistanceUnitsKilometers': 'Kilometers',\n 'DistanceUnitsMiles': 'Miles',\n 'PeopleNearby': 'People Nearby',\n 'MakeMyselfVisible': 'Make Myself Visible',\n 'MakeMyselfVisibleTitle': 'Show Your Profile?',\n 'MakeMyselfVisibleInfo': 'Users nearby will be able to view your profile and send you messages. This may help you find new friends, but could also attract excessive attention. You can stop sharing your profile at any time.\\n\\nYour phone number will remain hidden.',\n 'StopShowingMe': 'Stop Showing Me',\n 'PeopleNearbyInfo2': 'Exchange contact info with people nearby and find new friends.',\n 'NearbyCreateGroup': 'Create a Local group',\n 'AwayTo': '%1$s away',\n 'MessagePreview': 'Message Preview',\n 'KMetersAway2': '%1$s km away',\n 'MetersAway2': '%1$s m away',\n 'MilesAway': '%1$s mi away',\n 'FootsAway': '%1$s ft away',\n 'PeopleNearbyHeader': 'People nearby',\n 'ChatsNearbyHeader': 'Groups nearby',\n 'ChatLocation': 'Location',\n 'RequestToJoinGroupDescription': 'This group accepts new members only after they are approved by its admins.',\n 'RequestToJoinChannelDescription': 'This channel accepts new subscribers only after they are approved by its admins.',\n 'RequestToJoinSent': 'Join request sent',\n 'RequestToJoinGroupApproved': 'Your request to join the group was approved',\n 'RequestToJoinChannelApproved': 'Your request to join the channel was approved',\n 'Update': 'UPDATE',\n 'Reactions': 'Reactions',\n 'DoubleTapSetting': 'Quick Reaction',\n 'EnableReactions': 'Enable Reactions',\n 'EnableReactionsChannelInfo': 'Allow subscribers to react to channel posts.',\n 'EnableReactionsGroupInfo': 'Allow members to react to group messages.',\n 'AvailableReactions': 'Available reactions',\n 'NobodyViewed': 'Nobody viewed',\n 'MessageSeen': {\n 'one_value': 'Seen',\n 'other_value': '%1$d Seen'\n },\n // \"Close\": \"Close\",\n 'DataSettings': 'Data and Storage',\n 'GroupsAndChannelsHelp': 'Change who can add you to groups and channels.',\n 'SessionsInfo': 'Control your sessions on other devices.',\n 'StickersBotInfo': 'Artists are welcome to add their own sticker sets using our @stickers bot.',\n 'AutomaticMediaDownload': 'Automatic media download',\n 'AutoDownloadPhotos': 'Photos',\n 'AutoDownloadVideos': 'Videos',\n 'AutoDownloadFiles': 'Files',\n 'AutoDownloadOnAllChats': 'On in all chats',\n 'AutoDownloadUpToOnAllChats': 'Up to %1$s in all chats',\n 'AutoDownloadOff': 'Off',\n 'AutoDownloadOnUpToFor': 'Up to %1$s for %2$s',\n 'AutoDownloadOnFor': 'On for %1$s',\n 'AutoDownloadContacts': 'Contacts',\n 'AutoDownloadPm': 'PM',\n 'AutoDownloadGroups': 'Groups',\n 'AutoDownloadChannels': 'Channels',\n 'AutoDownloadAudioInfo': 'Voice messages are tiny, so they\\'re always downloaded automatically.',\n 'AutoplayMedia': 'Auto-play media',\n 'AutoDownloadPhotosTitle': 'Auto-download photos',\n 'AutoDownloadVideosTitle': 'Auto-download videos and GIFs',\n 'AutoDownloadFilesTitle': 'Auto-download files and music',\n 'AutoDownloadMaxFileSize': 'Maximum file size',\n 'AutodownloadSizeLimitUpTo': 'up to %1$s',\n 'ResetAutomaticMediaDownload': 'Reset Auto-Download Settings',\n 'ResetAutomaticMediaDownloadAlertTitle': 'Reset settings',\n 'ResetAutomaticMediaDownloadAlert': 'Are you sure you want to reset auto-download settings?',\n 'Reset': 'Reset',\n 'SendMessageAsTitle': 'Send message as...',\n 'Devices': 'Devices',\n 'LanguageName': 'English',\n 'EditCantEditPermissionsPublic': 'This permission is not available in public groups.',\n 'VoipUserMicrophoneIsOff': '%s\\'s microphone is off',\n 'VoipUserCameraIsOff': '%s\\'s camera is off',\n 'PrivacyPhoneInfo4': 'This public link opens a chat with you:',\n 'ReportChatIllegalDrugs': 'Illegal Drugs',\n 'ReportChatPersonalDetails': 'Personal Details',\n 'VoipPeerIncompatible': '**%1$s**\\'s app is using an incompatible protocol. They need to update their app before you can call them.',\n 'TelegramFeaturesUrl': 'https://t.me/TelegramTips',\n 'ScamMessage': 'SCAM',\n 'FakeMessage': 'FAKE',\n 'TextCopied': 'Text copied to clipboard',\n 'PaymentInvoice': 'INVOICE',\n 'PaymentTestInvoice': 'TEST INVOICE',\n 'PaymentReceipt': 'Receipt',\n 'PaymentCheckout': 'Checkout',\n 'PaymentTransactionTotal': 'Total',\n 'PaymentTip': 'Tip',\n 'PaymentTipOptional': 'Tip (Optional)',\n 'PaymentCheckoutPay': 'PAY %1$s',\n 'PaymentCheckoutMethod': 'Payment method',\n 'PaymentCheckoutProvider': 'Payment provider',\n 'PaymentCardNumber': 'Card Number',\n 'PaymentCardSavePaymentInformation': 'Save Payment Information',\n 'PaymentCardInfo': 'Payment info',\n 'PaymentCardSavePaymentInformationInfoLine1': 'You can save your payment info for future use. It will be stored directly with the payment provider. Telegram has no access to your credit card data.',\n 'Done': 'Done',\n 'PaymentShippingMethod': 'Shipping methods',\n 'PaymentNoShippingMethod': 'Sorry, it is not possible to deliver to your address.',\n 'PaymentShippingInfo': 'Shipping Information',\n 'PaymentShippingAddress': 'Shipping address',\n 'PaymentShippingAddress1Placeholder': 'Address 1 (Street)',\n 'PaymentShippingAddress2Placeholder': 'Address 2 (Street)',\n 'PaymentShippingCityPlaceholder': 'City',\n 'PaymentShippingStatePlaceholder': 'State',\n 'PaymentShippingCountry': 'Country',\n 'PaymentShippingZipPlaceholder': 'Postcode',\n 'PaymentShippingReceiver': 'Receiver',\n 'PaymentShippingName': 'Full Name',\n 'PaymentShippingEmailPlaceholder': 'Email',\n 'PaymentCheckoutPhoneNumber': 'Phone number',\n 'PaymentCheckoutShippingMethod': 'Shipping method',\n 'PaymentShippingSave': 'Save Shipping Information',\n 'PaymentShippingSaveInfo': 'You can save your shipping info for future use.',\n 'PaymentInfoHint': 'You paid **%1$s** for **%2$s**.',\n 'PrivacyPayments': 'Payments',\n 'PrivacyPaymentsClearInfo': 'You can delete your shipping info and instruct all payment providers to remove your saved credit cards. Note that Telegram never stores your credit card data.',\n 'PrivacyPaymentsClear': 'Clear Payment and Shipping Info',\n 'PrivacyPaymentsClearAlertTitle': 'Clear payment info',\n 'PrivacyPaymentsClearAlertText': 'Are you sure you want to clear your payment and shipping info?',\n 'PrivacyPaymentsPaymentInfoCleared': 'Payment info cleared.',\n 'PrivacyPaymentsShippingInfoCleared': 'Shipping info cleared.',\n 'PrivacyPaymentsPaymentShippingCleared': 'Payment and shipping info cleared.',\n 'PrivacyClearShipping': 'Shipping info',\n 'PrivacyClearPayment': 'Payment info',\n 'Clear': 'Clear',\n 'Save': 'Save',\n 'PaymentCheckoutName': 'Name',\n 'ClearRecentStickersAlertTitle': 'Clear recent stickers',\n 'ClearRecentStickersAlertMessage': 'Do you want to clear all your recent stickers?',\n 'PremiumStickersShort': 'Premium',\n 'FavoriteStickers': 'Favorites',\n 'AddToFavorites': 'Add to Favorites',\n 'AddedToFavorites': 'Sticker added to Favorites.',\n 'RemovedFromFavorites': 'Sticker was removed from Favorites',\n 'RemovedFromRecent': 'Sticker was removed from Recent',\n 'DeleteFromFavorites': 'Delete from Favorites',\n 'DeleteFromRecent': 'Remove from Recent',\n 'NewChatsFromNonContacts': 'New chats from unknown users',\n 'ArchiveAndMute': 'Archive and Mute',\n 'ArchiveAndMuteInfo': 'Automatically archive and mute new chats, groups and channels from non-contacts.',\n 'PrivacyVoiceMessages': 'Voice Messages',\n 'PrivacyVoiceMessagesTitle': 'Who can send me voice or video messages?',\n 'PrivacyVoiceMessagesInfo': 'You can restrict who can send you voice or video messages with granular precision.',\n 'PrivacyVoiceMessagesPremiumOnly': 'Only subscribers of *Telegram Premium* can restrict receiving voice messages.',\n 'EmojiCount': {\n 'other_value': '%1$d emoji'\n },\n 'AddEmojiNotFound': 'Emoji pack not found.',\n 'MessageContainsEmojiPack': 'This message contains emoji from %s pack.',\n 'MessageContainsEmojiPacks': {\n 'other_value': 'This message contains emoji from **%d Packs**.'\n },\n 'EmojiPackCount': {\n 'one_value': '%1$d Emoji Pack',\n 'other_value': '%1$d Emoji Packs'\n },\n 'ReactionsAll': 'All',\n 'EnableSomeReactionsInfo': 'Members of the group can use only certain approved emoji as reactions to messages.',\n 'EnableAllReactionsInfo': 'Members of the group can use any emoji as reactions to messages.',\n 'DisableReactionsInfo': 'Members of the group can’t add any reactions to messages.',\n 'OnlyAllowThisReactions': 'Only allow these reactions',\n 'AllReactions': 'All reactions',\n 'SomeReactions': 'Some reactions',\n 'NoReactions': 'No reactions',\n 'LimitReached': 'Limit Reached',\n 'LimitReachedPinDialogs': 'You can\\'t pin more than %1$d chats to the top. Unpin some that are currently pinned – or subscribe to **Telegram Premium** to double the limit to **%2$d** chats.',\n 'LimitReachedPinDialogsPremium': 'Sorry, you can\\'t pin more than %1$d chats to the top. Unpin some that are currently pinned.',\n 'LimitReachedPinDialogsLocked': 'Sorry, you can\\'t pin more than %1$d chats to the top. Unpin some that are currently pinned. We are working to let you increase this limit in the future.',\n 'IncreaseLimit': 'Increase Limit',\n 'LimitFree': 'Free',\n 'LimitPremium': 'Premium',\n 'ActionTTLChanged': 'un1 set messages to auto-delete in %1$s',\n 'ActionTTLYouChanged': 'You set messages to auto-delete in %1$s',\n 'ActionTTLChannelChanged': 'Messages in this channel will be automatically deleted after %1$s',\n 'ActionTTLChannelDisabled': 'Messages in this channel will no longer be automatically deleted',\n 'ActionTTLDisabled': 'un1 disabled the auto-delete timer',\n 'ActionTTLYouDisabled': 'You disabled the auto-delete timer',\n 'UsernamesProfileHeader': 'Username order',\n 'UsernamesProfileHelp': 'Drag and drop links to change the order in which they will be displayed on your info page.',\n 'UsernamesChannelHelp': 'Drag and drop links to change the order in which they will be displayed on the channel info page.',\n 'UsernameLinkEditable': 'tap to edit',\n 'UsernameLinkActive': 'active',\n 'UsernameLinkInactive': 'not active',\n 'UsernameActivateLink': 'Activate link',\n 'UsernameDeactivateLink': 'Deactivate link',\n 'UsernameActivateLinkProfileMessage': 'Do you want to show this link on your info page?',\n 'UsernameDeactivateLinkProfileMessage': 'Do you want to hide this link from your info page?',\n 'UsernameActivateLinkChannelMessage': 'Do you want to show this link on the channel info page?',\n 'UsernameDeactivateLinkChannelMessage': 'Do you want to hide this link from the channel info page?',\n 'Hide': 'Hide',\n 'Show': 'Show',\n 'UsernameActivateErrorTitle': 'Too many active links',\n 'UsernameActivateErrorMessage': 'Sorry, you have too many active public links already. Please hide one of your active public links first.',\n 'ChannelSignMessages': 'Sign Messages',\n // 'ChannelSignMessagesInfo': 'Add names of admins to the messages they post',\n 'TopicWasCreatedAction': '%s was created',\n 'Topics': 'Topics',\n 'ForumToggleDescription': 'The group chat will be divided into topics created by admins or users.',\n 'AnonymousNumber': 'Anonymous Number',\n 'Info': 'Info',\n 'BotSettings': 'Settings',\n 'OpenMessage': 'VIEW MESSAGE',\n 'OpenGroup': 'VIEW GROUP',\n 'CloseTopic': 'Close topic',\n 'RestartTopic': 'Reopen topic',\n 'LimitReachedPinnedTopics': 'Sorry, you can\\'t pin more than %d topics to the top.',\n 'TopicProfileStatus': 'In %s',\n 'AccDescrTopic': 'Topic',\n 'DeleteTopics': {\n 'one_value': 'Delete topic',\n 'other_value': 'Delete topics'\n },\n 'DeleteSelectedTopic': 'Are you sure you want delete %s?',\n 'NewTopic': 'New Topic',\n 'CreateTopicTitle': 'Choose a topic name and icon',\n 'CreateGeneralTopicTitle': 'Choose topic name',\n 'EditTopicHide': 'Show in Topics',\n 'EditTopicHideInfo': 'If the \\'General\\' topic is hidden, group members can pull down in the topic list to view it.',\n 'OpenUrlOption1': 'Log in to %1$s as **%2$s**',\n 'OpenUrlOption2': 'Allow **%1$s** to send me messages',\n 'OtherWebSessions': 'Connected websites',\n 'WebSessionsTitle': 'Logged In with Telegram',\n 'TerminateWebSessionText': 'Are you sure you want to disconnect %1$s?',\n 'Disconnect': 'Disconnect',\n 'TerminateAllWebSessions': 'Disconnect All Websites',\n 'AreYouSureWebSessions': 'Are you sure you want to disconnect all websites where you logged in with Telegram?',\n 'ClearOtherWebSessionsHelp': 'You can log in on websites that support signing in with Telegram.',\n 'TerminateWebSessionInfo': 'Tap to disconnect from your Telegram account.',\n 'EnablePhotoSpoiler': 'Hide with spoiler',\n 'DisablePhotoSpoiler': 'Remove spoiler',\n 'LimitReachedFolders': 'You have reached the limit of **%1$d** folders. You can double the limit to **%2$d** folders by subscribing to **Telegram Premium**.',\n 'LimitReachedFoldersPremium': 'You have reached the limit of **%1$d** folders for this account.',\n 'LimitReachedFoldersLocked': 'You have reached the limit of **%1$d** folders for this account. We are working to let you increase this limit in the future.',\n 'FwdMessageToSavedMessages': 'Message forwarded to **Saved Messages**.',\n 'FwdMessagesToSavedMessages': 'Messages forwarded to **Saved Messages**.',\n\n // * macos\n 'AccountSettings.Filters': 'Chat Folders',\n 'AccountSettings.Notifications': 'Notifications and Sounds',\n 'AccountSettings.PrivacyAndSecurity': 'Privacy and Security',\n 'AccountSettings.Language': 'Language',\n 'Alert.UserDoesntExists': 'Sorry, this user doesn\\'t seem to exist.',\n 'Alert.Confirm.Discard': 'Discard',\n 'Appearance.Reset': 'Reset to Defaults',\n 'AutoDownloadSettings.Delimeter': ', ',\n 'AutoDownloadSettings.LastDelimeter': ' and ',\n 'Bio.Description': 'Any details such as age, occupation or city.\\nExample: 23 y.o. designer from San Francisco',\n 'Call.Accept': 'Accept',\n 'Call.Decline': 'Decline',\n 'Call.End': 'End',\n 'Call.Camera': 'Camera',\n 'Call.Mute': 'Mute',\n 'Call.Recall': 'Recall',\n 'Call.Close': 'Close',\n 'Call.Screen': 'Screen',\n 'Call.Confirm.Discard.Voice.Header': 'Video Chat in Progress',\n 'Call.Confirm.Discard.Voice.ToVoice.Text': 'Leave video chat in \"%1$@\" and start a new one in \"%2$@\"?',\n 'Call.Confirm.Discard.Voice.ToCall.Text': 'Leave video chat in \"%1$@\" and start a call with \"%2$@\"?',\n 'Call.Confirm.Discard.Call.Header': 'Call in Progress',\n 'Call.Confirm.Discard.Call.ToVoice.Text': 'End call with \"%1$@\" and start a video chat in \"%2$@\"?',\n 'Call.Confirm.Discard.Call.ToCall.Text': 'End call with \"%1$@\" and start a video chat in \"%2$@\"?',\n 'Call.PrivacyErrorMessage': 'Sorry, you cannot call %@ because of their privacy settings.',\n 'Call.StatusRequesting': 'Contacting...',\n 'Call.StatusRinging': 'Ringing...',\n 'Call.StatusConnecting': 'Connecting...',\n 'Call.StatusEnded': 'Call Ended',\n 'Call.StatusFailed': 'Call Failed',\n 'Call.StatusBusy': 'Busy',\n 'Call.StatusCalling': 'is calling you...',\n 'Contacts.PhoneNumber.NotRegistred': 'The person with this phone number is not registered on Telegram yet.',\n 'Channel.UsernameAboutChannel': 'People can share this link with others and can find your channel using Telegram search.',\n 'Channel.UsernameAboutGroup': 'People can share this link with others and find your group using Telegram search.',\n 'Chat.Accessory.Forward': {\n 'one_value': 'Forward Message',\n 'other_value': 'Forward %d Messages'\n },\n 'Chat.Accessory.Forward.You': 'You',\n 'Chat.Accessory.Forward.From': 'From',\n 'Chat.Accessory.Hidden': {\n 'one_value': 'Forward Message (sender\\'s name hidden)',\n 'other_value': 'Forward %d Messages (senders\\' names hidden)'\n },\n 'Chat.Alert.Forward.Action.Another': 'Forward to Another Chat',\n 'Chat.Alert.Forward.Action.Hide1': {\n 'one_value': 'Hide Sender\\'s Name',\n 'other_value': 'Hide Senders\\' Names'\n },\n 'Chat.Alert.Forward.Action.Show1': {\n 'one_value': 'Show Sender\\'s Name',\n 'other_value': 'Show Senders\\' Names'\n },\n 'Chat.Alert.Forward.Action.ShowCaption': {\n 'one_value': 'Show Caption',\n 'other_value': 'Show Captions'\n },\n 'Chat.Alert.Forward.Action.HideCaption': {\n 'one_value': 'Hide Caption',\n 'other_value': 'Hide Captions'\n },\n 'Chat.CopySelectedText': 'Copy Selected Text',\n 'Chat.Confirm.Unpin': 'Would you like to unpin this message?',\n 'Chat.Context.Reacted': '%1$@/%2$@ Reacted',\n 'Chat.Context.ReactedFast': {\n 'other_value': '%d Reacted'\n },\n 'Chat.Date.ScheduledFor': 'Scheduled for %@',\n 'Chat.Date.ScheduledForToday': 'Scheduled for today',\n 'Chat.DropTitle': 'Drop files here to send them',\n 'Chat.DropQuickDesc': 'in a quick way',\n 'Chat.DropAsFilesDesc': 'without compression',\n 'Chat.Edit.Cancel.Text': 'Are you sure you want to discard all changes?',\n 'Chat.Input.ReplyToAnswer': 'Reply to message in topics',\n 'Chat.SendVoice.PrivacyError': '%@ doesn\\'t accept voice and video messages',\n 'Chat.Service.Call.Cancelled': 'Cancelled',\n 'Chat.Service.Call.Missed': 'Missed',\n 'Chat.Service.PeerJoinedTelegram': '%@ joined Telegram',\n 'Chat.Service.Channel.UpdatedTitle': 'Channel renamed to \"%@\"',\n 'Chat.Service.Channel.UpdatedPhoto': 'Channel photo updated',\n 'Chat.Service.Channel.RemovedPhoto': 'Channel photo removed',\n 'Chat.Service.Channel.UpdatedVideo': 'Channel video updated',\n 'Chat.Service.BotPermissionAllowed': 'You allowed this bot to message you when you logged in on %@',\n 'Chat.Service.Group.UpdatedPinnedMessage': '%@ pinned \"%@\"',\n 'Chat.Service.Group.TopicEdited.Icon': '%1$@ changed topic icon to %2$@',\n 'Chat.Service.Group.TopicEdited.Icon.Removed': '%1$@ removed icon',\n 'Chat.Service.Group.TopicEdited.Title': '%1$@ changed topic name to \"%2$@\"',\n 'Chat.Service.Group.TopicEdited.Paused': '%1$@ closed topic',\n 'Chat.Service.Group.TopicEdited.Resumed': '%1$@ restarted topic',\n 'Chat.Service.Group.TopicEdited.You.Icon': 'You changed topic icon to %1$@',\n 'Chat.Service.Group.TopicEdited.You.Icon.Removed': 'You removed icon',\n 'Chat.Service.Group.TopicEdited.You.Title': 'You changed topic name to \"%1$@\"',\n 'Chat.Service.Group.TopicEdited.You.Paused': 'You closed topic',\n 'Chat.Service.Group.TopicEdited.You.Resumed': 'You restarted topic',\n 'Chat.Service.Group.TopicEdited.You.Hided': 'You hid the general topic',\n 'Chat.Service.Group.TopicEdited.You.Unhided': 'You unhid the general topic',\n 'Chat.Service.Group.TopicEdited.Hided': '%1$@ hid the general topic',\n 'Chat.Service.Group.TopicEdited.Unhided': '%1$@ unhid the general topic',\n 'Chat.Service.PaymentSent1': 'You have successfully transferred **%1$@** to **%2$@** for **%3$@**',\n 'Chat.Service.PaymentSent1NoTitle': 'You have successfully transferred **%1$@** to **%2$@**',\n 'Chat.Service.PaymentSentRecurringInit': 'You successfully transferred **%1$@** to **%2$@** for **%3$@** and allowed future recurring payments',\n 'Chat.Service.PaymentSentRecurringInitNoTitle': 'You successfully transferred **%1$@** to **%2$@** and allowed future recurring payments',\n 'Chat.Service.PaymentSentRecurringUsed': 'You have just successfully transferred **%1$@** to **%2$@** for **%3$@** via recurrent payments',\n 'Chat.Service.PaymentSentRecurringUsedNoTitle': 'You have just successfully transferred **%1$@** to **%2$@** via recurrent payments',\n 'Chat.Service.VoiceChatStarted': '%1$@ started a [video chat](open)',\n 'Chat.Service.VoiceChatStartedYou': 'You started a [video chat](open)',\n 'Chat.Service.VoiceChatStarted.Channel': '[Live Stream](open) started',\n 'Chat.Service.VoiceChatFinished': '%1$@ ended the video chat (%2$@)',\n 'Chat.Service.VoiceChatFinishedYou': 'You ended the video chat (%@)',\n 'Chat.Service.VoiceChatFinished.Channel': 'Live Stream ended (%1$@)',\n 'Chat.Service.VoiceChatInvitation': '%1$@ invited %2$@ to the [video chat](open)',\n 'Chat.Service.VoiceChatInvitationByYou': 'You invited %1$@ to the [video chat](open)',\n 'Chat.Service.VoiceChatInvitationForYou': '%1$@ invited you to the [video chat](open)',\n 'ChatService.UserJoinedGroupByRequest': '%@ was accepted to the group',\n 'ChatService.UserJoinedChannelByRequest': '%@ joined the channel by request',\n 'ChatList.Service.VoiceChatScheduled': '%1$@ scheduled a video chat for %2$@',\n 'ChatList.Service.VoiceChatScheduledYou': 'You scheduled a video chat for %2$@',\n 'Chat.Poll.Unvote': 'Retract Vote',\n 'Chat.Poll.Stop': 'Stop Poll',\n 'Chat.Poll.ViewResults': 'View Results',\n 'Chat.Poll.SubmitVote': 'Vote',\n 'Chat.Poll.Type.Anonymous': 'Anonymous Poll',\n 'Chat.Poll.Type.Public': 'Poll',\n 'Chat.Poll.Type.AnonymousQuiz': 'Anonymous Quiz',\n 'Chat.Poll.Type.Quiz': 'Quiz',\n 'Chat.Poll.Type.Closed': 'Final Results',\n 'Chat.Poll.TotalVotes1': {\n 'one_value': '%d vote',\n 'other_value': '%d votes'\n },\n 'Chat.Quiz.TotalVotes': {\n 'one_value': '%d answer',\n 'other_value': '%d answers'\n },\n 'Chat.Poll.TotalVotesEmpty': 'No votes yet',\n 'Chat.Poll.TotalVotesResultEmpty': 'No votes',\n 'Chat.Quiz.TotalVotesEmpty': 'No answers yet',\n 'Chat.Quiz.TotalVotesResultEmpty': 'No answers',\n // \"Chat.Poll.Stop.Confirm.Header\": \"Stop Poll?\",\n // \"Chat.Poll.Stop.Confirm.Text\": \"If you stop this poll now, nobody will be able to vote in it anymore. This action cannot be undone.\",\n // \"Chat.Pinned.UnpinAll\": {\n // \"one_value\": \"Unpin %d Message\",\n // \"other_value\": \"Unpin All %d Messages\"\n // },\n 'Chat.Pinned.DontShow': 'Don\\'t Show Pinned Messages',\n 'Chat.Title.Comments': {\n 'one_value': '%d Comment',\n 'other_value': '%d Comments'\n },\n 'ChatTitle.ReportMessages': 'Report Messages',\n 'Chat.Send.WithoutSound': 'Send Without Sound',\n 'Chat.Send.SetReminder': 'Set a Reminder',\n 'Chat.Send.ScheduledMessage': 'Schedule Message',\n 'Chat.SendAs.PersonalAccount': 'personal account',\n 'Chat.UnpinAllMessagesConfirmation': {\n 'one_value': 'Do you want to unpin %d message in this chat?',\n 'other_value': 'Do you want to unpin all %d messages in this chat?'\n },\n 'Chat.Message.Ad.Text': 'Unlike other apps, Telegram never uses your private data to target ads. Sponsored messages on Telegram are based solely on the topic of the public channels in which they are shown. This means that no user data is mined or analyzed to display ads, and every user viewing a channel on Telegram sees the same sponsored messages.\\n\\nUnlike other apps, Telegram doesn\\'t track whether you tapped on a sponsored message and doesn\\'t profile you based on your activity. We also prevent external links in sponsored messages to ensure that third parties can’t spy on our users. We believe that everyone has the right to privacy, and technological platforms should respect that.\\n\\nTelegram offers a free and unlimited service to hundreds of millions of users, which involves significant server and traffic costs. In order to remain independent and stay true to its values, Telegram developed a paid tool to promote messages with user privacy in mind. We welcome responsible advertisers at:\\n\\n%@\\n\\nSponsored Messages are currently in test mode. Once they are fully launched and allow Telegram to cover its basic costs, we will start sharing ad revenue with the owners of public channels in which sponsored messages are displayed.\\n\\nOnline ads should no longer be synonymous with abuse of user privacy. Let us redefine how a tech company should operate – together.',\n 'Chat.Message.Ad.ReadMore': 'Read More',\n 'Chat.Message.ViewChannel': 'VIEW CHANNEL',\n 'Chat.Message.ViewBot': 'VIEW BOT',\n 'Chat.Message.ViewGroup': 'VIEW GROUP',\n 'Chat.Message.Sponsored.What': 'What are sponsored messages?',\n 'Chat.Message.Sponsored.Link': 'https://promote.telegram.org',\n 'Checkout.2FA.Text': 'Saving payment details is only available with 2-Step Verification.',\n 'Checkout.NewCard.CardholderNamePlaceholder': 'Cardholder Name',\n 'Checkout.PasswordEntry.Title': 'Payment Confirmation',\n 'Checkout.PasswordEntry.Pay': 'Pay',\n 'Checkout.PasswordEntry.Text': 'Your card %@ is on file. To pay with this card, please enter your 2-Step-Verification password.',\n 'Checkout.PayPrice': 'Pay %@',\n 'Checkout.WebConfirmation.Title': 'Complete Payment',\n 'ChatList.Context.Mute': 'Mute',\n 'ChatList.Context.Unmute': 'Unmute',\n 'ChatList.Context.Pin': 'Pin',\n 'ChatList.Context.Unpin': 'Unpin',\n 'ChatList.Context.DeleteChat': 'Delete Chat',\n 'ChatList.Context.DeleteAndExit': 'Delete and Leave',\n 'ChatList.Context.LeaveChannel': 'Leave Channel',\n 'ChatList.Context.LeaveGroup': 'Leave Group',\n 'ChatList.Service.Call.incoming': 'Incoming Call (%@)',\n 'ChatList.Service.Call.outgoing': 'Outgoing Call (%@)',\n 'ChatList.Service.VideoCall.incoming': 'Incoming Video Call (%@)',\n 'ChatList.Service.VideoCall.outgoing': 'Outgoing Video Call (%@)',\n 'ChatList.Service.Call.Cancelled': 'Cancelled Call',\n 'ChatList.Service.Call.Missed': 'Missed Call',\n 'ChatList.Service.VideoCall.Cancelled': 'Cancelled Video Call',\n 'ChatList.Service.VideoCall.Missed': 'Missed Video Call',\n 'ChatList.Service.VoiceChatScheduled.Channel': 'Voice chat scheduled for %@',\n 'ChatList.Filter.Header': 'Create folders for different groups of chats and quickly switch between them.',\n 'ChatList.Filter.NewTitle': 'Create Folder',\n 'ChatList.Filter.List.Title': 'Chat Folders',\n 'ChatList.Filter.Include.AddChat': 'Add Chats',\n 'ChatList.Filter.Exclude.AddChat': 'Add Chats',\n // \"ChatList.Filter.All\": \"All\",\n 'ChatList.Filter.Contacts': 'Contacts',\n 'ChatList.Filter.NonContacts': 'Non-Contacts',\n 'ChatList.Filter.Groups': 'Groups',\n 'ChatList.Filter.Channels': 'Channels',\n 'ChatList.Filter.Bots': 'Bots',\n 'ChatList.Filter.MutedChats': 'Muted',\n 'ChatList.Filter.ReadChats': 'Read',\n 'ChatList.Filter.Archive': 'Archived',\n 'ChatList.Filter.Include.LimitReached': 'Sorry, you can only add up to 100 individual chats. Try using chat types.',\n 'ChatList.Filter.Exclude.LimitReached': 'Sorry, you can only add up to 100 individual chats. Try using chat types.',\n 'ChatList.Filter.Confirm.Remove.Header': 'Remove Folder',\n 'ChatList.Filter.Confirm.Remove.Text': 'Are you sure you want to remove this folder? Your chats will not be deleted.',\n 'ChatList.Mute.1Hour': 'For 1 Hour',\n 'ChatList.Mute.4Hours': 'For 4 Hours',\n 'ChatList.Mute.8Hours': 'For 8 Hours',\n 'ChatList.Mute.1Day': 'For 1 Day',\n 'ChatList.Mute.3Days': 'For 3 Days',\n 'ChatList.Mute.Forever': 'Forever',\n 'Channel.DescriptionHolderDescrpiton': 'You can provide an optional description for your channel.',\n 'ChannelVisibility.Confirm.MakePrivate.Channel': 'If you make this channel private, the name @%@ will be removed. Anyone else will be able to take it for their public groups or channels.',\n 'ChannelVisibility.Confirm.MakePrivate.Group': 'If you make this group private, the name @%@ will be removed. Anyone else will be able to take it for their public groups or channels.',\n 'Context.ViewStickerSet': 'View Sticker Set',\n 'CreateGroup.NameHolder': 'Group Name',\n 'CustomEmoji.PremiumAlert': 'Subscribe to Telegram Premium to unlock this emoji. [Read More]()',\n 'Date.Today': 'Today',\n 'DeleteChat.DeleteGroupForAll': 'Delete for all members',\n 'DeleteChannelForAll': 'Delete for all subscribers',\n 'ForumTopic.Context.Info': 'Group Info',\n 'ForumTopic.Context.AddMember': 'Add Members',\n 'ForumTopic.Context.ShowAsMessages': 'View as Messages',\n 'ForumTopic.Context.New': 'Create Topic',\n 'ForumTopic.Name.Placeholder': 'Topic Name',\n 'ForumTopic.Title.Edit': 'Edit Topic',\n 'EditAccount.Username': 'Username',\n 'EditAccount.Title': 'Edit Profile',\n 'EditAccount.Logout': 'Log Out',\n 'Emoji.Recent': 'Frequently Used',\n 'Emoji.SmilesAndPeople': 'Smileys & People',\n 'Emoji.AnimalsAndNature': 'Animals & Nature',\n 'Emoji.FoodAndDrink': 'Food & Drink',\n 'Emoji.ActivityAndSport': 'Activity & Sport',\n 'Emoji.TravelAndPlaces': 'Travel & Places',\n 'Emoji.Objects': 'Objects',\n // \"Emoji.Symbols\": \"Symbols\",\n 'Emoji.Flags': 'Flags',\n 'Error.AnError': 'An error occurred. Please try again later.',\n 'FileSize.B': '%@ B',\n 'FileSize.KB': '%@ KB',\n 'FileSize.MB': '%@ MB',\n 'FileSize.GB': '%@ GB',\n 'InstalledStickers.LoopAnimated': 'Loop Animated Stickers',\n 'LastSeen.HoursAgo': {\n 'one_value': 'last seen %d hour ago',\n 'other_value': 'last seen %d hours ago'\n },\n 'Login.Register.LastName.Placeholder': 'Last Name',\n 'Message.Context.Select': 'Select',\n 'Message.Context.Pin': 'Pin',\n 'Message.Context.Unpin': 'Unpin',\n 'Message.Context.Goto': 'Show Message',\n 'Message.ReplyActionButtonShowReceipt': 'Show Receipt',\n 'MessageContext.CopyMessageLink1': 'Copy Message Link',\n 'Modal.Send': 'Send',\n 'NewContact.Exception.ShareMyPhoneNumber': 'Share My Phone Number',\n 'NewContact.Exception.ShareMyPhoneNumber.Desc': 'You can make your phone visible to %@.',\n 'NewPoll.Anonymous': 'Anonymous Voting',\n 'NewPoll.Explanation.Placeholder': 'Add a Comment (Optional)',\n 'NewPoll.OptionsAddOption': 'Add an Option',\n 'NewPoll.MultipleChoice': 'Multiple Answers',\n 'NewPoll.Quiz': 'Quiz Mode',\n 'Notification.Contact.Reacted': '%1$@ to your \"%2$@\"',\n // \"Notification.Group.Reacted\": \"%1$@: %2$@ to your \"%3$@\"\",\n 'Payments.Recurrent.Accept': 'I accept [Terms of Service]() of **%@**.',\n 'Peer.Activity.User.PlayingGame': 'playing a game',\n 'Peer.Activity.User.TypingText': 'typing',\n 'Peer.Activity.User.SendingPhoto': 'sending a photo',\n 'Peer.Activity.User.RecordingVideo': 'recording video',\n 'Peer.Activity.User.SendingVideo': 'sending a video',\n 'Peer.Activity.User.RecordingAudio': 'recording voice',\n 'Peer.Activity.User.SendingFile': 'sending file',\n 'Peer.Activity.User.ChoosingSticker': 'choosing a sticker',\n 'Peer.Activity.User.EnjoyingAnimations': 'watching %@',\n 'Peer.Activity.Chat.PlayingGame': '%@ is playing a game',\n 'Peer.Activity.Chat.TypingText': '%@ is typing',\n 'Peer.Activity.Chat.SendingPhoto': '%@ is sending a photo',\n 'Peer.Activity.Chat.RecordingVideo': '%@ is recording video',\n 'Peer.Activity.Chat.SendingVideo': '%@ is sending a video',\n 'Peer.Activity.Chat.RecordingAudio': '%@ is recording voice',\n 'Peer.Activity.Chat.SendingFile': '%@ is sending a file',\n 'Peer.Activity.Chat.ChoosingSticker': '%@ is choosing a sticker',\n 'Peer.Activity.Chat.EnjoyingAnimations': '%@ is watching %@',\n 'Peer.Activity.Chat.Multi.PlayingGame1': '%@ and %d others are playing a game',\n 'Peer.Activity.Chat.Multi.TypingText1': '%@ and %d others are typing',\n 'Peer.Activity.Chat.Multi.SendingPhoto1': '%@ and %d others are sending photos',\n 'Peer.Activity.Chat.Multi.RecordingVideo1': '%@ and %d others are recording video',\n 'Peer.Activity.Chat.Multi.SendingVideo1': '%@ and %d others are sending videos',\n 'Peer.Activity.Chat.Multi.RecordingAudio1': '%@ and %d others are recording voice',\n // \"Peer.Activity.Chat.Multi.SendingAudio1\": \"%@ and %d others are sending audio\",\n 'Peer.Activity.Chat.Multi.SendingFile1': '%@ and %d others are sending files',\n 'Peer.Activity.Chat.Multi.ChoosingSticker1': '%@ and %d others are choosing stickers',\n 'Peer.ServiceNotifications': 'service notifications',\n 'Peer.RepliesNotifications': 'Reply Notifications',\n 'Peer.Status.justNow': 'last seen just now',\n 'Peer.Status.Today': 'today',\n 'Peer.Status.Yesterday': 'yesterday',\n 'Peer.Status.LastSeenAt': 'last seen %@ at %@',\n 'Peer.Status.minAgo': {\n 'one_value': 'last seen %d minute ago',\n 'other_value': 'last seen %d minutes ago'\n },\n 'Peer.Status.Member': {\n 'one_value': '%d member',\n 'other_value': '%d members'\n },\n 'Peer.Status.Subscribers': {\n 'one_value': '%d subscriber',\n 'other_value': '%d subscribers'\n },\n 'PeerInfo.Administrators': 'Administrators',\n 'PeerInfo.DeleteChannel': 'Delete Channel',\n 'PeerInfo.Discussion': 'Discussion',\n 'PeerInfo.Discussion.Add': 'Add',\n 'PeerInfo.SharedMedia': 'Shared Media',\n 'PeerInfo.Subscribers': 'Subscribers',\n 'PeerInfo.DeleteContact': 'Delete Contact',\n // \"PeerInfo.Confirm.RemovePeer\": \"Remove %@ from the group?\",\n 'PeerInfo.Action.VoiceChat': 'Video Chat',\n 'PeerInfo.Action.LiveStream': 'Live Stream',\n 'PeerInfo.Phone.AnonymousInfo': 'This number is not tied to a SIM card and was acquired on [Fragment]().',\n 'PeerMedia.Members': 'Members',\n 'PollResults.Title.Poll': 'Poll Results',\n 'PollResults.Title.Quiz': 'Quiz Results',\n 'PollResults.LoadMore': {\n 'other_value': 'Show More (%d)'\n },\n // \"PeerInfo.Confirm.DeleteGroupConfirmation\": \"Wait! Deleting this group will remove all members and all messages will be lost. Delete the group anyway?\",\n 'Preview.Dragging.AddItems': {\n 'one_value': 'Add Item',\n 'other_value': 'Add Items'\n },\n 'PreviewSender.CaptionPlaceholder': 'Add a caption...',\n 'PreviewSender.CompressFile': 'Send compressed',\n 'PreviewSender.SendFile': {\n 'one_value': 'Send File',\n 'other_value': 'Send %d Files'\n },\n 'PreviewSender.SendPhoto': {\n 'one_value': 'Send Photo',\n 'other_value': 'Send %d Photos'\n },\n 'PreviewSender.SendVideo': {\n 'one_value': 'Send Video',\n 'other_value': 'Send %d Videos'\n },\n 'PrivacyAndSecurity.Item.On': 'On',\n 'PrivacyAndSecurity.Item.Off': 'Off',\n 'PrivacyAndSecurity.SensitiveText': 'Disable filtering',\n 'PrivacyAndSecurity.SensitiveDesc': 'Display sensitive media in public channels on all your Telegram devices.',\n 'PrivacySettings.VoiceCalls': 'Calls',\n 'PrivacySettings.Forwards': 'Forwarded Messages',\n 'PrivacySettings.Groups': 'Groups and Channels',\n 'PrivacySettingsController.AddUsers': 'Add Users',\n 'PrivacySettingsController.GroupDescription': 'You can restrict who can add you to groups and channels with granular precision.',\n 'PrivacySettingsController.Forwards.CustomHelp': 'You can restrict who can add a link to your account when forwarding your messages.',\n 'PrivacySettingsController.P2p.Desc': 'Disabling peer-to-peer will relay all calls through Telegram servers to avoid revealing your IP address, but may slightly decrease audio and video quality.',\n 'PrivacySettingsController.PhoneCallDescription': 'You can restrict who can call you with granular precision.',\n 'PrivacySettingsController.ProfilePhoto.CustomHelp': 'You can restrict who can see your profile photo with granular precision.',\n 'PrivacySettingsController.LastSeenDescription': 'You won\\'t see Last Seen and Online statuses for people with whom you don\\'t share yours. Approximate last seen will be shown instead (recently, within a week, within a month).',\n 'PrivacySettingsController.PeerInfo': 'You can add users or entire groups as exceptions that will override the settings above.',\n 'PrivacySettingsController.Everbody': 'Everybody',\n 'PrivacySettingsController.MyContacts': 'My Contacts',\n 'PrivacySettingsController.Nobody': 'Nobody',\n 'PrivacySettingsController.NeverShare': 'Never Share With',\n 'PrivacySettingsController.AlwaysShare': 'Always Share With',\n 'PrivacySettingsController.NeverAllow': 'Never Allow',\n 'PrivacySettingsController.AlwaysAllow': 'Always Allow',\n 'PrivacySettingsController.UserCount': {\n 'one_value': '%d user',\n 'other_value': '%d users'\n },\n 'RecentSessions.Error.FreshReset': 'For security reasons, you can\\'t terminate older sessions from a device that you\\'ve just connected. Please use an earlier connection or wait for a few hours.',\n 'RequestJoin.Button': 'Request to Join',\n 'Stickers.SearchAdd': 'Add',\n 'Stickers.SearchAdded': 'Added',\n 'Stickers.SuggestStickers': 'Suggest Stickers by Emoji',\n 'ShareModal.Search.Placeholder': 'Share to...',\n 'ShareModal.Search.ForwardPlaceholder': 'Forward to...',\n 'Telegram.GeneralSettingsViewController': 'General Settings',\n 'Telegram.InstalledStickerPacksController': 'Stickers',\n 'Telegram.NotificationSettingsViewController': 'Notifications',\n 'Telegram.LanguageViewController': 'Language',\n 'Text.CopyLabel_About': 'Copy About',\n 'Text.CopyLabel_Bio': 'Copy Bio',\n 'Text.CopyLabel_PhoneNumber': 'Copy Phone Number',\n 'Text.CopyLabel_Username': 'Copy Username',\n 'Text.CopyLabel_ShareLink': 'Copy Share Link',\n 'GeneralSettings.BigEmoji': 'Large Emoji',\n 'GeneralSettings.EmojiPrediction': 'Suggest Emoji',\n 'GroupPermission.Delete': 'Delete Exception',\n 'Search.Confirm.ClearHistory': 'Are you sure you want to clear your search history?',\n 'SecureId.Identity.Placeholder.ExpiryDate': 'Expiry Date',\n 'Separator.ShowMore': 'show more',\n 'Separator.ShowLess': 'show less',\n 'ScheduleController.at': 'at',\n 'Schedule.SendToday': 'Send today at %@',\n 'Schedule.SendDate': 'Send on %@ at %@',\n 'Schedule.SendWhenOnline': 'Send When Online',\n 'Sticker.Premium.Click.Info': 'This pack contains premium stickers like this one. [View Pack]()',\n 'Stickers.Recent': 'Recent',\n // \"Stickers.Favorite\": \"Favorite\",\n 'StickerSet.DontExist': 'Sorry, this sticker set doesn\\'t seem to exist.',\n 'Text.Context.Copy.Username': 'Copy Username',\n 'Text.Context.Copy.Hashtag': 'Copy Hashtag',\n 'Time.TomorrowAt': 'tomorrow at %@',\n 'TwoStepAuth.SetPasswordHelp': 'You can set a password that will be required when you log in on a new device in addition to the code you get in the SMS.',\n 'TwoStepAuth.GenericHelp': 'You have enabled Two-Step verification.\\nYou\\'ll need the password you set up here to log in to your Telegram account.',\n 'TwoStepAuth.ChangePassword': 'Change Password',\n 'TwoStepAuth.RemovePassword': 'Turn Password Off',\n 'TwoStepAuth.SetupEmail': 'Set Recovery Email',\n 'TwoStepAuth.ChangeEmail': 'Change Recovery Email',\n 'TwoStepAuth.ConfirmEmailCodeDesc': 'Please enter the code we\\'ve just emailed to %@.',\n 'TwoStepAuth.RecoveryTitle': 'Email Code',\n 'TwoStepAuth.RecoveryCode': 'Code',\n 'TwoStepAuth.RecoveryCodeInvalid': 'Invalid code. Please try again.',\n 'TwoStepAuth.RecoveryCodeExpired': 'Code Expired',\n 'TwoStepAuth.SetupHintTitle': 'Password Hint',\n 'TwoStepAuth.SetupHintPlaceholder': 'Hint',\n 'VoiceChat.Chat.StartNew': 'Video chat ended. Start a new one?',\n 'VoiceChat.Chat.StartNew.OK': 'Start',\n 'VoiceChat.Chat.Ended': 'Video chat ended.',\n 'VoiceChat.Invite.InviteMembers': 'Invite members',\n 'VoiceChat.Status.Connecting': 'Connecting...',\n 'VoiceChat.Status.Members': {\n 'one_value': '%d participant',\n 'other_value': '%d participants'\n },\n 'VoiceChat.Status.MutedForYou': 'muted for you',\n 'VoiceChat.Status.Speaking': 'speaking',\n 'VoiceChat.Status.Listening': 'listening',\n 'VoiceChat.Status.WantsSpeak': 'wants to speak',\n 'VoiceChat.Status.Muted': 'muted',\n 'VoiceChat.Status.You': 'This is you',\n 'VoiceChat.Video.Stream.Video': 'video',\n 'VoiceChat.Video.Stream.Screencast': 'screen',\n 'VoiceChat.Video.Stream.More': 'more',\n 'VoiceChat.Leave': 'Leave',\n 'VoiceChat.End.Title': 'Leave video chat',\n 'VoiceChat.End.Text': 'Are you sure you want to leave this video chat?',\n 'VoiceChat.End.Third': 'End Video Chat',\n 'VoiceChat.End.OK': 'Leave',\n 'VoiceChat.MutePeer': 'Mute',\n 'VoiceChat.UnmutePeer': 'Allow To Speak',\n 'VoiceChat.RemovePeer': 'Remove',\n 'VoiceChat.OpenProfile': 'Open Profile',\n 'VoiceChat.MuteForMe': 'Mute For Me',\n 'VoiceChat.UnmuteForMe': 'Unmute For Me',\n 'VoiceChat.RemovePeer.Confirm.Channel': 'Do you want to remove %1$@ from the channel?',\n 'VoiceChat.RemovePeer.Confirm': 'Are you sure you want to remove %1$@ from the group?',\n 'VoiceChat.RemovePeer.Confirm.OK': 'Remove'\n};\n\nexport default lang;\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/460.057266426d36dd34300a.chunk.js b/public/460.057266426d36dd34300a.chunk.js deleted file mode 100644 index 9a1bb82a7..000000000 --- a/public/460.057266426d36dd34300a.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackChunktweb=this.webpackChunktweb||[]).push([[460],{5814:(e,t,i)=>{"use strict";i.d(t,{Z:()=>m});var s=i(5400),n=i(3512),a=i(4762),o=i(410),r=i(8487),d=i(3772),l=i(1655),c=i(7625),h=i(2586),u=i(3013),p=i(3035);const f=new class{constructor(){this.observer=new IntersectionObserver((e=>{for(const t of e){const e=t.target;for(const i in this.byGroups){if(this.intersectionLockedGroups[i])continue;const s=this.byGroups[i].find((t=>t.el===e));if(s){if(t.isIntersecting)this.visible.add(s),this.checkAnimation(s,!1);else{this.visible.delete(s),this.checkAnimation(s,!0);const e=s.animation;e instanceof d.Z&&e.clearCache()}break}}}})),this.visible=new Set,this.overrideIdleGroups=new Set,this.byGroups={},this.byPlayer=new Map,this.lockedGroups={},this.onlyOnePlayableGroup="",this.intersectionLockedGroups={},this.videosLocked=!1,u.Z.addEventListener("play",(({doc:e})=>{"round"===e.type&&(this.videosLocked=!0,this.checkAnimations2())})),u.Z.addEventListener("pause",(()=>{this.videosLocked&&(this.videosLocked=!1,this.checkAnimations2())})),h.Z.addEventListener("change",(e=>{this.checkAnimations2(e)}))}setOverrideIdleGroup(e,t){t?this.overrideIdleGroups.add(e):this.overrideIdleGroups.delete(e)}getAnimations(e){const t=[];for(const i in this.byGroups)for(const s of this.byGroups[i])s.el===e&&t.push(s);return t}removeAnimation(e){const{el:t,animation:i}=e;i.remove(),i instanceof HTMLVideoElement&&a.IS_SAFARI&&setTimeout((()=>{i.src="",i.load()}),1e3);const s=this.byGroups[e.group];s&&((0,l.Z)(s,e),s.length||delete this.byGroups[e.group]),this.observer.unobserve(t),this.visible.delete(e),this.byPlayer.delete(i)}removeAnimationByPlayer(e){const t=this.byPlayer.get(e);t&&this.removeAnimation(t)}addAnimation(e,t="",i,a){var o,r,l,c;if("none"===t||this.byPlayer.has(e))return;i||(e instanceof d.Z?i=e.el[0]:e instanceof s.KZ?i=e.canvas:e instanceof s.LD?i=null!==(o=e.placeholder)&&void 0!==o?o:e:e instanceof HTMLElement&&(i=e));const h={el:i,animation:e,group:t,controlled:a};e instanceof d.Z&&!n.Z.settings.stickers.loop&&e.loop&&(e.loop=n.Z.settings.stickers.loop),(null!==(r=(l=this.byGroups)[c=t])&&void 0!==r?r:l[c]=[]).push(h),this.observer.observe(h.el),this.byPlayer.set(e,h)}checkAnimations(e,t,i,s){if(void 0!==t&&!this.byGroups[t])return;const n=void 0!==t?[t]:Object.keys(this.byGroups);for(const t of n){if(s&&this.intersectionLockedGroups[t])continue;const n=this.byGroups[t];(0,c.Z)(n,(t=>{this.checkAnimation(t,e,i)}))}}checkAnimations2(e){this.checkAnimations(e,void 0,void 0,!0)}checkAnimation(e,t,i){const{el:s,animation:n,group:a}=e;i||!this.lockedGroups[a]&&!(0,r.Z)(s)?e.controlled&&!i||this.removeAnimation(e):t||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||n instanceof HTMLVideoElement&&this.videosLocked?n.paused||n.pause():!(n.paused&&this.visible.has(e)&&n.autoplay)||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||h.Z.isIdle&&!this.overrideIdleGroups.has(e.group)||n.play()}getOnlyOnePlayableGroup(){return this.onlyOnePlayableGroup}setOnlyOnePlayableGroup(e=""){this.onlyOnePlayableGroup=e}lockGroup(e){this.lockedGroups[e]=!0}unlockGroup(e){delete this.lockedGroups[e],this.checkAnimations(void 0,e)}refreshGroup(e){const t=this.byGroups[e];(null==t?void 0:t.length)&&(t.forEach((e=>{this.observer.unobserve(e.el)})),(0,p.T2)((()=>{t.forEach((e=>{this.observer.observe(e.el)}))})))}lockIntersectionGroup(e){this.intersectionLockedGroups[e]=!0}unlockIntersectionGroup(e){delete this.intersectionLockedGroups[e],this.refreshGroup(e)}toggleIntersectionGroup(e,t){t?this.lockIntersectionGroup(e):this.unlockIntersectionGroup(e)}};o.GO&&(o.GO.animationIntersector=f);const m=f},3013:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L});var s=i(3512),n=i(3725),a=i(4762),o=i(410),r=i(6669),d=i(5432),l=i(2325),c=i(3719),h=i(8479),u=i(6848),p=i(3699),f=i(7530),m=i(493),g=i(2312),v=i(925),b=i(3241),y=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const w=(()=>{try{return a.IS_SAFARI&&+navigator.userAgent.match(/ Version\/(\d+)/)[1]<14}catch(e){return!1}})();class S extends b.Z{constructor(){super(...arguments),this.media=new Map,this.scheduled=new Map,this.mediaDetails=new Map,this.waitingMediaForLoad=new Map,this.waitingScheduledMediaForLoad=new Map,this.waitingDocumentsForLoad={},this.playbackRates={voice:1,video:1,audio:1},this.seekBackward=(e,t=this.playingMedia)=>{t&&(t.currentTime=Math.max(0,t.currentTime-(e.seekOffset||10)))},this.seekForward=(e,t=this.playingMedia)=>{t&&(t.currentTime=Math.min(t.duration,t.currentTime+(e.seekOffset||10)))},this.seekTo=(e,t=this.playingMedia)=>{t&&(t.currentTime=e.seekTime)},this.onMediaDocumentLoad=e=>y(this,void 0,void 0,(function*(){const t=this.mediaDetails.get(e),i=yield this.managers.appDocsManager.getDoc(t.docId);"audio"===i.type&&i.supportsStreaming&&w&&this.handleSafariStreamable(e);const s=yield this.managers.thumbsStorage.getCacheContext(i);e.src=s.url,this.playingMedia===e&&(e.playbackRate=this.playbackRate,"audio"===i.type&&(e.loop=this.loop));const n=this.waitingDocumentsForLoad[i.id];n&&(n.delete(e),n.size||delete this.waitingDocumentsForLoad[i.id])})),this.onPlay=e=>{const t=e.target,i=this.mediaDetails.get(t),{peerId:s,mid:n}=i,a=this.pip;a&&a.pause();const o=this.getMessageByMedia(t);if(this.playingMedia!==t){this.stop(),this.setMedia(t,o);const e=e=>e.mid===n&&e.peerId===s,i=this.listLoader,a=i.getCurrent();if(!a||!e(a)){let t;for(const s of[!1,!0]){const n=i.getPrevious(s);let a=n.findIndex(e);if(-1!==a?t=-(n.length-a):(a=i.getNext(s).findIndex(e),-1!==a&&(t=a+1)),void 0!==t)break}t?this.go(t,!1):this.setTargets({peerId:s,mid:n})}}setTimeout((()=>{this.playingMedia===t&&(this.dispatchEvent("play",this.getPlayingDetails()),this.pauseMediaInOtherTabs())}),0)},this.onPause=e=>{this.dispatchEvent("pause")},this.onEnded=e=>{if(!e.isTrusted)return;this.onPause(e);const t=this.listLoader;!this.lockedSwitchers&&(this.round||!t.current||t.next.length)&&t.getNext(!0).length&&this.next()||(this.stop(),this.dispatchEvent("stop"))},this.play=()=>this.toggle(!0),this.pause=()=>this.toggle(!1),this.stop=(e=this.playingMedia)=>{if(!e)return!1;if(e.paused||e.pause(),e.currentTime=0,(0,r.Z)(e,"ended"),e===this.playingMedia){const t=this.mediaDetails.get(e);if(null==t?void 0:t.clean){e.src="";const i=t.peerId,s=t.isScheduled?this.scheduled:this.media,n=s.get(i);n&&(n.delete(t.mid),n.size||s.delete(i)),e.remove(),this.mediaDetails.delete(e)}this.playingMedia=void 0,this.playingMediaType=void 0}return!0},this.playItem=e=>{const{peerId:t,mid:i}=e,s=this.searchContext.isScheduled;this.getMedia(t,i,s).play(),setTimeout((()=>{this.resolveWaitingForLoadMedia(t,i,s)}),0)},this.go=(e,t)=>{const i=this.listLoader;if(!this.lockedSwitchers&&i)return"audio"===this.playingMediaType?i.goRound(e,t):i.go(e,t)},this.browserPlay=this.bindBrowserCallback((e=>this.toggle(!0,e))),this.browserPause=this.bindBrowserCallback((e=>this.toggle(!1,e))),this.browserStop=this.bindBrowserCallback((e=>this.stop(e))),this.browserSeekBackward=this.bindBrowserCallback(((e,t)=>this.seekBackward(t,e))),this.browserSeekForward=this.bindBrowserCallback(((e,t)=>this.seekForward(t,e))),this.browserSeekTo=this.bindBrowserCallback(((e,t)=>this.seekTo(t,e))),this.browserNext=this.bindBrowserCallback((e=>e||this.next())),this.browserPrevious=this.bindBrowserCallback((e=>e?this.seekToStart(e):this.previous())),this.next=()=>this.go(1),this.previous=()=>{if(!this.seekToStart(this.playingMedia))return this.go(-1)}}construct(e){if(this.managers=e,this.container=document.createElement("div"),this.container.style.cssText="display: none;",document.body.append(this.container),navigator.mediaSession){const e={play:this.browserPlay,pause:this.browserPause,stop:this.browserStop,seekbackward:this.browserSeekBackward,seekforward:this.browserSeekForward,seekto:this.browserSeekTo,previoustrack:this.browserPrevious,nexttrack:this.browserNext};for(const t in e)try{navigator.mediaSession.setActionHandler(t,e[t])}catch(e){console.warn("MediaSession action is not supported:",t)}}s.Z.addEventListener("document_downloaded",(e=>{const t=this.waitingDocumentsForLoad[e];if(t)for(const e of t)this.onMediaDocumentLoad(e)})),s.Z.addEventListener("media_play",(()=>{this.skipMediaPlayEvent?this.skipMediaPlayEvent=!1:!this.pause()&&this.pip&&this.pip.pause()}));const t={};["volume","muted","playbackRate","loop","round"].forEach((e=>{const i="_"+e;t[e]={get:()=>this[i],set:t=>{this[i]!==t&&(this[i]=t,!this.playingMedia||"loop"===e&&"audio"!==this.playingMediaType||"round"===e||(this.playingMedia[e]=t),"playbackRate"===e&&void 0!==this.playingMediaType&&(this.playbackRates[this.playingMediaType]=t),this.dispatchPlaybackParams())}}})),Object.defineProperties(this,t)}dispatchPlaybackParams(){this.dispatchEvent("playbackParams",this.getPlaybackParams())}getPlaybackParams(){const{volume:e,muted:t,playbackRate:i,playbackRates:s,loop:n,round:a}=this;return{volume:e,muted:t,playbackRate:i,playbackRates:s,loop:n,round:a}}setPlaybackParams(e){this.playbackRates=e.playbackRates,this._volume=e.volume,this._muted=e.muted,this._playbackRate=e.playbackRate,this._loop=e.loop,this._round=e.round}addMedia(e,t,i){const{peerId:a,mid:o}=e,r=e.pFlags.is_scheduled?this.scheduled:this.media;let d=r.get(e.peerId);d||r.set(e.peerId,d=new Map);let l=d.get(o);if(l)return l;const c=(0,f.Z)(e);d.set(o,l=document.createElement("round"===c.type||"video"===c.type?"video":"audio")),"round"===c.type&&l.setAttribute("playsinline","true");const h={peerId:a,mid:o,docId:c.id,doc:c,message:e,clean:i,isScheduled:e.pFlags.is_scheduled};this.mediaDetails.set(l,h),l.volume=1,this.container.append(l),l.addEventListener("play",this.onPlay),l.addEventListener("pause",this.onPause),l.addEventListener("ended",this.onEnded),"audio"!==c.type&&(null==e?void 0:e.pFlags.media_unread)&&e.fromId!==s.Z.myId&&l.addEventListener("timeupdate",(()=>{this.managers.appMessagesManager.readMessages(a,[o])}),{once:!0});const u=(0,n.Z)();if(t)u.resolve();else{const t=e.pFlags.is_scheduled?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad;let i=t.get(a);i||t.set(a,i=new Map),i.set(o,u)}return u.then((()=>y(this,void 0,void 0,(function*(){if(c.supportsStreaming||(yield this.managers.thumbsStorage.getCacheContext(c)).url)this.onMediaDocumentLoad(l);else{let e=this.waitingDocumentsForLoad[c.id];e||(e=this.waitingDocumentsForLoad[c.id]=new Set),e.add(l),g.Z.downloadMediaURL({media:c})}})))),l}getMedia(e,t,i){const s=(i?this.scheduled:this.media).get(e);return null==s?void 0:s.get(t)}handleSafariStreamable(e){e.addEventListener("play",(()=>{const t=e.currentTime;e.addEventListener("progress",(()=>{e.currentTime=e.duration-1,e.addEventListener("progress",(()=>{e.currentTime=t,e.paused||e.play()}),{once:!0})}),{once:!0})}))}resolveWaitingForLoadMedia(e,t,i){const s=i?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad,n=s.get(e);if(!n)return;const a=n.get(t);a&&(a.resolve(),n.delete(t),n.size||s.delete(e))}isSafariBuffering(e){return!!e.safariBuffering}setSafariBuffering(e,t){e.safariBuffering=t}setNewMediadata(e,t=this.playingMedia){var i,s;return y(this,void 0,void 0,(function*(){if(document.pictureInPictureElement)return;yield(0,v.Z)(t,void 0,!1);const n=(0,f.Z)(e),o=[],r="voice"===n.type||"round"===n.type;let c="",h="";if(null===(i=n.thumbs)||void 0===i?void 0:i.length){const i=n.thumbs[n.thumbs.length-1];if(!i.bytes){const s=yield this.managers.thumbsStorage.getCacheContext(n,i.type);s.url?o.push({src:s.url,sizes:`${i.w}x${i.h}`,type:"image/jpeg"}):g.Z.downloadMediaURL({media:n,thumb:i}).then((()=>{this.playingMedia===t&&s.url&&this.setNewMediadata(e)}))}}else if(r){const t=e.fromId||e.peerId;yield this.managers.appPeersManager.getPeerPhoto(t),c=yield(0,m.Z)({peerId:t,plainText:!0,onlyFirstName:!1}),h=l.ZP.format("voice"===n.type?"AttachAudio":"AttachRound",!0)}if(!r){const e=n.attributes.find((e=>"documentAttributeAudio"===e._));c=null!==(s=null==e?void 0:e.title)&&void 0!==s?s:n.file_name,h=null==e?void 0:e.performer}o.length||(a.IS_APPLE?d.Z?o.push({src:"assets/img/apple-touch-icon-precomposed.png",sizes:"180x180",type:"image/png"}):o.push({src:"assets/img/apple-touch-icon.png",sizes:"180x180",type:"image/png"}):[72,96,144,192,256,384,512].forEach((e=>{const t=`${e}x${e}`;o.push({src:`assets/img/android-chrome-${t}.png`,sizes:t,type:"image/png"})})));const u=new MediaMetadata({title:c,artist:h,artwork:o});navigator.mediaSession.metadata=u}))}setCurrentMediadata(){const{playingMedia:e}=this;if(!e)return;const t=this.getMessageByMedia(e);this.setNewMediadata(t,e)}getMessageByMedia(e){return this.mediaDetails.get(e).message}getPlayingDetails(){const{playingMedia:e}=this;if(!e)return;const t=this.getMessageByMedia(e);return{doc:(0,f.Z)(t),message:t,media:e,playbackParams:this.getPlaybackParams()}}pauseMediaInOtherTabs(){this.skipMediaPlayEvent=!0,s.Z.dispatchEvent("media_play")}toggle(e,t=this.playingMedia){return!!t&&(void 0===e&&(e=t.paused),t.paused===e&&(e?t.play():t.pause(),!0))}bindBrowserCallback(e){return t=>{e(this.pip,t)}}seekToStart(e){return(null==e?void 0:e.currentTime)>5&&(e.currentTime=0,this.toggle(!0,e),!0)}willBePlayed(e){this.willBePlayedMedia=e}setSearchContext(e){return!(0,u.Z)(this.searchContext,e)&&(this.searchContext=(0,h.Z)(e),!0)}getSearchContext(){return this.searchContext}setTargets(e,t,i){let s=this.listLoader;s?s.reset():s=this.listLoader=new c.Z({loadCount:10,loadWhenLeft:5,processItem:e=>(this.addMedia(e,!1),{peerId:e.peerId,mid:e.mid}),onJump:(e,t)=>{this.playItem(e)},onEmptied:()=>{this.dispatchEvent("stop"),this.stop()}});const n=void 0===this.searchContext.folderId;t?s.setTargets(t,i,n):s.reverse=n,s.setSearchContext(this.searchContext),s.current=e,s.load(!0),s.load(!1)}getPlaybackMediaTypeFromMessage(e){const t=(0,f.Z)(e);let i="audio";return(null==t?void 0:t.type)&&("voice"===t.type||"round"===t.type?i="voice":"video"===t.type&&(i="video")),i}setMedia(e,t){const i=this.getPlaybackMediaTypeFromMessage(t);this._playbackRate=this.playbackRates[i],this.playingMedia=e,this.playingMediaType=i,this.playingMedia.volume=this.volume,this.playingMedia.muted=this.muted,this.playingMedia.playbackRate=this.playbackRate,"audio"===i&&(this.playingMedia.loop=this.loop),"mediaSession"in navigator&&this.setNewMediadata(t)}setSingleMedia(e,t){const i=this.playingMedia,s=this.pause();let n;return e?(n=()=>{const e=this.pip;e&&e.pause(),this.pauseMediaInOtherTabs()},e.paused||n(),e.addEventListener("play",n)):this.pauseMediaInOtherTabs(),this.willBePlayed(void 0),e?this.setMedia(e,t):this.playingMedia=void 0,this.toggleSwitchers(!1),(t=s)=>{this.toggleSwitchers(!0),i&&(this.mediaDetails.get(i)?this.setMedia(i,this.getMessageByMedia(i)):this.next()||this.previous()),this.playingMedia===e&&(this.playingMedia=void 0,this.playingMediaType=void 0),e&&e.removeEventListener("play",n),t&&this.play()}}toggleSwitchers(e){this.lockedSwitchers=!e}setPictureInPicture(e){this.pip=e;const t=new p.Z;t.add(e)("leavepictureinpicture",(()=>{this.pip===e&&(this.pip=void 0,t.removeAll())}),{once:!0}),t.add(e)("play",(t=>{this.playingMedia!==e&&this.pause(),this.pauseMediaInOtherTabs()}))}}const C=new S;o.GO.appMediaPlaybackController=C;const L=C},1784:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L});var s=i(2341),n=i(3910),a=i(2738),o=i(8497),r=i(4668),d=i(130),l=i(4755),c=i(3719),h=i(2312),u=i(4271),p=i(3709),f=i(7530),m=i(5400),g=i(5824),v=i(5128),b=i(4524),y=i(8805),w=i(4332),S=i(1669),C=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class L extends g.Z{get searchContext(){return this.listLoader.searchContext}constructor(){let e;super(new c.Z({processItem:e=>{const t="inputMessagesFilterDocument"===this.searchContext.inputFilter._,{mid:i,peerId:s}=e,n=(0,f.Z)(e);if(n&&(!t||L.isMediaCompatibleForDocumentViewer(n)))return{element:null,mid:i,peerId:s}}}),["delete","forward"]),this.onPrevClick=e=>C(this,void 0,void 0,(function*(){this.openMedia(yield this.getMessageByPeer(e.peerId,e.mid),e.element,-1)})),this.onNextClick=e=>C(this,void 0,void 0,(function*(){this.openMedia(yield this.getMessageByPeer(e.peerId,e.mid),e.element,1)})),this.onDeleteClick=()=>{const e=this.target;new v.Z(e.peerId,[e.mid],"chat",(()=>{this.target={element:this.content.media},this.close()}))},this.onForwardClick=()=>{const e=this.target;e.mid&&new b.Z({[e.peerId]:[e.mid]},(()=>this.close()))},this.onAuthorClick=e=>C(this,void 0,void 0,(function*(){const{mid:t,peerId:i}=this.target;if(t&&t!==Number.MAX_SAFE_INTEGER){const s=this.searchContext.threadId,n=yield this.getMessageByPeer(i,t);this.close(e).then((()=>C(this,void 0,void 0,(function*(){if(l.Z.isMobile){const e=w.ZP.getTab(S.Z);e&&e.close()}u.Z.setInnerPeer({peerId:n.peerId,lastMsgId:t,type:s?"discussion":void 0,threadId:s})}))))}})),this.onDownloadClick=()=>C(this,void 0,void 0,(function*(){const{peerId:e,mid:t}=this.target,i=yield this.getMessageByPeer(e,t),s=(0,f.Z)(i);s&&h.Z.downloadToDisc({media:s,queueId:u.Z.chat.bubbles.lazyLoadQueue.queueId})})),this.listLoader.onEmptied=()=>{this.close()},this.content.caption=document.createElement("div"),this.content.caption.classList.add(g.x+"-caption","spoilers-container");const t=()=>{e&&clearTimeout(e),e=window.setTimeout((()=>{e=void 0,this.content.caption.classList.remove("is-focused")}),800)};this.content.caption.addEventListener("touchstart",(()=>{l.Z.isMobile&&(this.content.caption.classList.add("is-focused"),e&&(clearTimeout(e),e=void 0),document.addEventListener("touchend",t,{once:!0}))})),new y.ZP(this.content.caption).onAdditionalScroll=t,this.wholeDiv.append(this.content.caption),(0,a.fc)(this.buttons.delete,this.onDeleteClick);const i=[this.btnMenuForward={icon:"forward",text:"Forward",onClick:this.onForwardClick},this.btnMenuDownload={icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick},this.btnMenuDelete={icon:"delete danger",text:"Delete",onClick:this.onDeleteClick}];this.setBtnMenuToggle(i),this.setListeners()}setListeners(){super.setListeners(),(0,a.fc)(this.buttons.forward,this.onForwardClick),(0,a.fc)(this.author.container,this.onAuthorClick);const e=t=>{const i=(0,r.Z)(t.target,"A"),s=(0,o.Z)(t.target,"spoiler");if(i instanceof HTMLAnchorElement&&(!s||this.content.caption.classList.contains("is-spoiler-visible"))){const s=i.getAttribute("onclick");if(!s||s.includes("showMaskedAlert"))return;return(0,n.Z)(t),this.close().then((()=>{this.content.caption.removeEventListener("click",e,{capture:!0}),i.click()})),!1}};this.content.caption.addEventListener("click",e,{capture:!0})}getMessageByPeer(e,t){return this.searchContext.isScheduled?this.managers.appMessagesManager.getScheduledMessageByPeer(e,t):this.managers.appMessagesManager.getMessageByPeer(e,t)}setCaption(e){const t=e.message;let i="";t&&(i=(0,m.ZP)(t,{entities:e.totalEntities})),(0,d.Z)(this.content.caption.firstElementChild,i),this.content.caption.classList.toggle("hide",!t)}setSearchContext(e){return this.listLoader.setSearchContext(e),this}openMedia(e,t,i=0,s=!1,n=[],a=[]){const o=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return C(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const r=e.mid,d=e.fwd_from&&!e.fromId?e.fwd_from.from_name:e.fromId,l=(0,f.Z)(e),c=yield this.managers.appPeersManager.noForwards(e.peerId),h="messageService"===e._,u=h||!(yield this.managers.appMessagesManager.canForward(e)),m=(h?c:u)||!(0,p.Z)(e);[[[this.buttons.forward,this.btnMenuForward],u],[[this.buttons.download,this.btnMenuDownload],m],[[this.buttons.delete,this.btnMenuDelete],!(yield this.managers.appMessagesManager.canDeleteMessage(e))]].forEach((([e,t])=>{e.forEach((e=>{e instanceof HTMLElement?e.classList.toggle("hide",t):e.verify=()=>!t}))})),this.wholeDiv.classList.toggle("no-forwards",m),this.setCaption(e);const g=o._openMedia.call(this,l,e.date,d,i,t,s,n,a,e);return this.target.mid=r,this.target.peerId=e.peerId,g}))}static isMediaCompatibleForDocumentViewer(e){return"photo"===e._||s.Z.has(e.mime_type)}}},5824:(e,t,i)=>{"use strict";i.d(t,{x:()=>Q,Z:()=>Y});var s=i(3725),n=i(4755),a=i(5432),o=i(4762),r=i(5003),d=i(3013),l=i(3910),c=i(3699),h=i(3003),u=i(5322),p=i(7529),f=i(6733),m=i(5157),g=i(7207),v=i(8427),b=i(5701),y=i(3815),w=i(925),S=i(2738);class C extends p.Z{constructor({video:e,play:t=!1,streamable:i=!1,duration:s,onPlaybackRackMenuToggle:n,onPip:a,onPipClose:o}){if(super(),this.video=e,this.wrapper=document.createElement("div"),this.wrapper.classList.add("ckin__player"),this.onPlaybackRackMenuToggle=n,this.onPip=a,this.onPipClose=o,this.listenerSetter=new c.Z,this.setup({element:this.wrapper,listenerSetter:this.listenerSetter,canHideControls:()=>!(this.video.paused||this.playbackRateButton&&this.playbackRateButton.classList.contains("menu-open")),showOnLeaveToClassName:"media-viewer-caption",ignoreClickClassName:"ckin__controls"}),e.parentNode.insertBefore(this.wrapper,e),this.wrapper.appendChild(e),this.skin="default",this.stylePlayer(s),this.setBtnMenuToggle(),"default"===this.skin){const t=this.wrapper.querySelector(".default__controls.ckin__controls");this.progress=new g.Z(e,i),t.prepend(this.progress.container)}t&&e.play().catch((t=>{"NotAllowedError"===t.name&&(e.muted=!0,e.autoplay=!0,e.play())})).finally((()=>{this.wrapper.classList.toggle("is-playing",!this.video.paused)}))}stylePlayer(e){const{wrapper:t,video:i,skin:s,listenerSetter:n}=this;t.classList.add(s);const o=this.buildControls();let r;if(t.insertAdjacentHTML("beforeend",o),"default"===s){this.playbackRateButton=this.wrapper.querySelector(".playback-rate"),this.pipButton=this.wrapper.querySelector(".pip");const e=t.querySelectorAll(".toggle"),s=t.querySelector(".fullscreen"),o=t.querySelector("#time-elapsed");r=t.querySelector("#time-duration"),r.textContent=(0,m.Z)(0|i.duration);const c=new v.Z(n),h=t.querySelector(".left-controls");if(c.btn.classList.remove("btn-icon"),h.insertBefore(c.btn,o.parentElement),Array.from(e).forEach((e=>{(0,S.fc)(e,(()=>{this.togglePlay()}),{listenerSetter:this.listenerSetter})})),this.pipButton){(0,S.fc)(this.pipButton,(()=>{this.video.requestPictureInPicture()}),{listenerSetter:this.listenerSetter});const e=e=>{this.wrapper.style.visibility=e?"hidden":"",this.onPip&&this.onPip(e)},t=20,s=(0,b.Z)(e,t,!1,!0);n.add(i)("enterpictureinpicture",(()=>{s(!0),n.add(i)("leavepictureinpicture",(()=>{const e=n.add(i)("pause",(()=>{clearTimeout(s),this.onPipClose&&this.onPipClose()}),{once:!0}),s=setTimeout((()=>{n.remove(e)}),t)}),{once:!0})})),n.add(i)("leavepictureinpicture",(()=>{s(!1)}))}a.Z||((0,S.fc)(i,(()=>{this.togglePlay()}),{listenerSetter:this.listenerSetter}),n.add(document)("keydown",(e=>{if(y.Z.overlaysActive>1||document.pictureInPictureElement===i)return;const{key:s,code:n}=e;let a=!0;if("KeyF"===n)this.toggleFullScreen();else if("KeyM"===n)d.Z.muted=!d.Z.muted;else if("Space"===n)this.togglePlay();else if(!e.altKey||"Equal"!==n&&"Minus"!==n)!t.classList.contains("ckin__fullscreen")||"ArrowLeft"!==s&&"ArrowRight"!==s?a=!1:"ArrowLeft"===s?d.Z.seekBackward({action:"seekbackward"}):d.Z.seekForward({action:"seekforward"});else{const e="Equal"===n?1:-1,t=d.Z.playbackRate,i=C.PLAYBACK_RATES.indexOf(t)+e;i>=0&&i{a.Z||this.toggleFullScreen()})),(0,S.fc)(s,(()=>{this.toggleFullScreen()}),{listenerSetter:this.listenerSetter}),(0,f.Ms)(t,this.onFullScreen.bind(this,s),n),n.add(i)("timeupdate",(()=>{o.textContent=(0,m.Z)(0|i.currentTime)})),n.add(i)("play",(()=>{t.classList.add("played"),a.Z||n.add(i)("play",(()=>{this.hideControls(!0)}))}),{once:!0}),n.add(i)("pause",(()=>{this.showControls(!1)})),n.add(d.Z)("playbackParams",(()=>{this.setPlaybackRateIcon()}))}n.add(i)("play",(()=>{t.classList.add("is-playing")})),n.add(i)("pause",(()=>{t.classList.remove("is-playing")})),i.duration||e?r.textContent=(0,m.Z)(Math.round(i.duration||e)):(0,w.Z)(i).then((()=>{r.textContent=(0,m.Z)(Math.round(i.duration))}))}togglePlay(){this.video[this.video.paused?"play":"pause"]()}buildControls(){const e=this.skin;if("default"===e)return`\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n ${!o.IS_MOBILE&&document.pictureInPictureEnabled?``:""}\n \n
\n
\n
`}setBtnMenuToggle(){const e=C.PLAYBACK_RATES.map(((e,t)=>({regularText:e+"x",onClick:()=>{d.Z.playbackRate=e}}))),t=(0,h.b)({buttons:e});t.classList.add("top-left"),(0,u.v)({el:this.playbackRateButton,onOpen:this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!0)}:void 0,onClose:this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!1)}:void 0}),this.playbackRateButton.append(t),this.setPlaybackRateIcon()}setPlaybackRateIcon(){const e=this.playbackRateButton;C.PLAYBACK_RATES_ICONS.forEach((t=>{t="tgico-"+t,e.classList.remove(t)}));let t=C.PLAYBACK_RATES.indexOf(d.Z.playbackRate);-1===t&&(t=C.PLAYBACK_RATES.indexOf(1)),e.classList.add("tgico-"+C.PLAYBACK_RATES_ICONS[t])}toggleFullScreen(){const e=this.wrapper;if(o.IS_APPLE_MOBILE){const e=this.video;return e.webkitEnterFullscreen(),void e.enterFullscreen()}(0,f.rB)()?(0,f.C8)():(0,f.Dj)(e)}onFullScreen(e){const t=(0,f.rB)();this.wrapper.classList.toggle("ckin__fullscreen",t),t?(e.classList.remove("tgico-fullscreen"),e.classList.add("tgico-smallscreen"),e.setAttribute("title","Exit Full Screen")):(e.classList.remove("tgico-smallscreen"),e.classList.add("tgico-fullscreen"),e.setAttribute("title","Full Screen"))}cleanup(){super.cleanup(),this.listenerSetter.removeAll(),this.progress.removeListeners(),this.onPlaybackRackMenuToggle=this.onPip=void 0}}C.PLAYBACK_RATES=[.5,1,1.5,2],C.PLAYBACK_RATES_ICONS=["playback_05","playback_1x","playback_15","playback_2x"];var L=i(3512),E=i(5814),I=i(9331),M=i(2230),P=i(3442),Z=i(3757),k=i(632),T=i(6385),x=i(8497),A=i(6740),_=i(8204),F=i(9171),D=i(5565),R=i(3035),B=i(65),N=i(241),O=i(3241),U=i(1507),H=i(7660),z=i(8580),j=i(1713),G=i(8115),V=i(4421),K=i(2312),W=i(7362),$=i(2796),q=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Q="media-viewer";class Y extends O.Z{get target(){return this.listLoader.current}set target(e){this.listLoader.current=e}constructor(e,t){super(!1),this.listLoader=e,this.author={},this.content={},this.buttons={},this.tempId=0,this.preloader=null,this.preloaderStreamable=null,this.isFirstOpen=!0,this.pageEl=document.getElementById("page-chats"),this.zoomElements={},this.zoomSwipeStartX=0,this.zoomSwipeStartY=0,this.zoomSwipeX=0,this.zoomSwipeY=0,this.setZoomValue=(e=this.zoomElements.rangeSelector.value)=>{1===e&&(this.zoomSwipeX=0,this.zoomSwipeY=0),this.moversContainer.style.transform=`matrix(${e}, 0, 0, ${e}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`,this.zoomElements.btnOut.classList.toggle("inactive",.5===e),this.zoomElements.btnIn.classList.toggle("inactive",4===e),this.toggleZoom(1!==e)},this.onClick=e=>{if(this.setMoverAnimationPromise)return;const t=e.target;if("A"===t.tagName)return;if((0,l.Z)(e),a.Z)return this.highlightSwitchersTimeout?clearTimeout(this.highlightSwitchersTimeout):this.wholeDiv.classList.add("highlight-switchers"),void(this.highlightSwitchersTimeout=window.setTimeout((()=>{this.wholeDiv.classList.remove("highlight-switchers"),this.highlightSwitchersTimeout=0}),3e3));const i=this.isZooming();let s=null;const n=["ckin__player","media-viewer-buttons","media-viewer-author","media-viewer-caption","zoom-container"];i&&n.push("media-viewer-movers"),n.find((e=>{try{if(s=(0,x.Z)(t,e),s)return!0}catch(e){return!1}})),s&&(i||"IMG"!==t.tagName&&"image"!==t.tagName)||this.close()},this.onKeyDown=e=>{if(y.Z.overlaysActive>1)return;const t=e.key;let i=!0;"ArrowRight"===t?this.buttons.next.click():"ArrowLeft"===t?this.buttons.prev.click():"-"===t||"="===t?this.ctrlKeyDown&&this.changeZoom("="===t):i=!1,(e.ctrlKey||e.metaKey)&&(this.ctrlKeyDown=!0),i&&(0,l.Z)(e)},this.onKeyUp=e=>{y.Z.overlaysActive>1||e.ctrlKey||e.metaKey||(this.ctrlKeyDown=!1,this.isZooming()&&this.setZoomValue())},this.onWheel=e=>{if(!(y.Z.overlaysActive>1||(0,x.Z)(e.target,"media-viewer-caption")&&!this.ctrlKeyDown)&&((0,l.Z)(e),this.ctrlKeyDown)){const t=e.deltaY<0;this.changeZoom(!!t)}},this.managers=L.Z.managers,this.log=(0,r.kg)("AMV"),this.preloader=new P.Z,this.preloaderStreamable=new P.Z({cancelable:!1,streamable:!0}),this.preloader.construct(),this.preloaderStreamable.construct(),this.lazyLoadQueue=new V.Z,this.wholeDiv=document.createElement("div"),this.wholeDiv.classList.add(Q+"-whole"),this.overlaysDiv=document.createElement("div"),this.overlaysDiv.classList.add("overlays");const i=document.createElement("div");i.classList.add(Q);const s=this.topbar=document.createElement("div");s.classList.add(Q+"-topbar",Q+"-appear");const n=document.createElement("div");n.classList.add(Q+"-topbar-left"),this.buttons["mobile-close"]=(0,M.Z)("close",{onlyMobile:!0}),this.author.container=document.createElement("div"),this.author.container.classList.add(Q+"-author","no-select");const o=document.createElement("div");this.author.avatarEl=new I.Z,this.author.avatarEl.classList.add(Q+"-userpic","avatar-44"),this.author.nameEl=document.createElement("div"),this.author.nameEl.classList.add(Q+"-name"),this.author.date=document.createElement("div"),this.author.date.classList.add(Q+"-date"),o.append(this.author.nameEl,this.author.date),this.author.container.append(this.author.avatarEl,o);const d=document.createElement("div");d.classList.add(Q+"-buttons"),t.concat(["download","zoom","close"]).forEach((e=>{const t=(0,M.Z)(e,{noRipple:!0});this.buttons[e]=t,d.append(t)})),this.buttons.zoom.classList.add("zoom-in"),this.zoomElements.container=document.createElement("div"),this.zoomElements.container.classList.add("zoom-container"),this.zoomElements.btnOut=(0,M.Z)("zoomout",{noRipple:!0}),(0,S.fc)(this.zoomElements.btnOut,(()=>this.changeZoom(!1))),this.zoomElements.btnIn=(0,M.Z)("zoomin",{noRipple:!0}),(0,S.fc)(this.zoomElements.btnIn,(()=>this.changeZoom(!0))),this.zoomElements.rangeSelector=new B.Z({step:.5,min:.5,max:4,withTransition:!0},1),this.zoomElements.rangeSelector.setListeners(),this.zoomElements.rangeSelector.setHandlers({onScrub:this.setZoomValue,onMouseUp:()=>this.setZoomValue()}),this.zoomElements.container.append(this.zoomElements.btnOut,this.zoomElements.rangeSelector.container,this.zoomElements.btnIn),this.wholeDiv.append(this.zoomElements.container),this.content.main=document.createElement("div"),this.content.main.classList.add(Q+"-content"),this.content.container=document.createElement("div"),this.content.container.classList.add(Q+"-container"),this.content.media=document.createElement("div"),this.content.media.classList.add(Q+"-media"),this.content.container.append(this.content.media),this.content.main.append(this.content.container),i.append(this.content.main),this.overlaysDiv.append(i),n.append(this.buttons["mobile-close"],this.author.container),s.append(n,d),this.buttons.prev=document.createElement("div"),this.buttons.prev.className=`${Q}-switcher ${Q}-switcher-left`,this.buttons.prev.innerHTML=``,this.buttons.next=document.createElement("div"),this.buttons.next.className=`${Q}-switcher ${Q}-switcher-right`,this.buttons.next.innerHTML=``,this.moversContainer=document.createElement("div"),this.moversContainer.classList.add(Q+"-movers"),this.wholeDiv.append(this.overlaysDiv,this.buttons.prev,this.buttons.next,this.topbar,this.moversContainer),this.listLoader.onLoadedMore=()=>{this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length)},this.setNewMover()}setListeners(){(0,S.fc)(this.buttons.download,this.onDownloadClick),[this.buttons.close,this.buttons["mobile-close"],this.preloaderStreamable.preloader].forEach((e=>{(0,S.fc)(e,this.close.bind(this))})),[[-1,this.buttons.prev],[1,this.buttons.next]].forEach((([e,t])=>{t.addEventListener("click",(t=>{(0,l.Z)(t),this.setMoverPromise||this.listLoader.go(e)}))})),(0,S.fc)(this.buttons.zoom,(()=>{this.isZooming()?this.toggleZoom(!1):this.changeZoom(!0)})),this.wholeDiv.addEventListener("click",this.onClick),this.listLoader.onJump=(e,t)=>{t?this.onNextClick(e):this.onPrevClick(e)},a.Z&&new Z.Z({element:this.wholeDiv,onSwipe:(e,t)=>{if(!(0,f.rB)())return Math.abs(e)/N.Z.width>.2||e>125?(e>0?this.buttons.prev.click():this.buttons.next.click(),!0):(Math.abs(t)/N.Z.height>.2||t>125)&&(this.close(),!0)},verifyTouchTarget:e=>(console.log("verify"),"INPUT"!==e.target.tagName&&!(0,x.Z)(e.target,"media-viewer-caption"))})}toggleZoom(e){const t=this.isZooming();if((this.zoomElements.rangeSelector.mousedown||this.ctrlKeyDown)&&(e=!0),t===e)return;void 0===e&&(e=!t),this.buttons.zoom.classList.toggle("zoom-in",!e),this.zoomElements.container.classList.toggle("is-visible",e);const i=e?this.zoomElements.rangeSelector.value:1;if(this.setZoomValue(i),this.zoomElements.rangeSelector.setProgress(i),this.videoPlayer&&this.videoPlayer.lockControls(!e&&void 0),e){if(this.zoomSwipeHandler)this.zoomSwipeHandler.setListeners();else{let e,t;const i=1;this.zoomSwipeHandler=new Z.Z({element:this.moversContainer,onFirstSwipe:()=>{e=t=0,this.moversContainer.classList.add("no-transition")},onSwipe:(s,n)=>{[s,n]=[s*i,n*i],this.zoomSwipeX+=s-e,this.zoomSwipeY+=n-t,[e,t]=[s,n],this.setZoomValue()},onReset:()=>{this.moversContainer.classList.remove("no-transition")},cursor:"move"})}this.zoomElements.rangeSelector.setProgress(i)}else e||this.zoomSwipeHandler.removeListeners()}changeZoom(e){this.zoomElements.rangeSelector.addProgress(.5*(e?1:-1)),this.setZoomValue()}isZooming(){return this.zoomElements.container.classList.contains("is-visible")}setBtnMenuToggle(e){const t=(0,u.Z)({buttonOptions:{onlyMobile:!0},direction:"bottom-left",buttons:e});this.topbar.append(t)}close(e){var t;if(e&&(0,l.Z)(e),this.setMoverAnimationPromise)return Promise.reject();this.navigationItem&&T.Z.removeItem(this.navigationItem),this.lazyLoadQueue.clear();const i=this.setMoverToTarget(null===(t=this.target)||void 0===t?void 0:t.element,!0).then((({onAnimationEnd:e})=>e));return this.listLoader.reset(),this.listLoader.cleanup&&this.listLoader.cleanup(),this.setMoverPromise=null,this.tempId=-1,window.appMediaViewer===this&&(window.appMediaViewer=void 0),this.removeGlobalListeners(),this.zoomSwipeHandler=void 0,i.finally((()=>{this.wholeDiv.remove(),this.toggleOverlay(!1)})),i}toggleOverlay(e){y.Z.isOverlayActive=e,E.Z.checkAnimations2(e)}toggleGlobalListeners(e){e?this.setGlobalListeners():this.removeGlobalListeners()}removeGlobalListeners(){this.zoomSwipeHandler&&this.zoomSwipeHandler.removeListeners(),window.removeEventListener("keydown",this.onKeyDown),window.removeEventListener("keyup",this.onKeyUp),window.removeEventListener("wheel",this.onWheel,{capture:!0})}setGlobalListeners(){this.isZooming()&&this.zoomSwipeHandler.setListeners(),window.addEventListener("keydown",this.onKeyDown),window.addEventListener("keyup",this.onKeyUp),a.Z||window.addEventListener("wheel",this.onWheel,{passive:!1,capture:!0})}setMoverToTarget(e,t=!1,i=0){return q(this,void 0,void 0,(function*(){this.dispatchEvent("setMoverBefore");const n=this.content.mover;t||(n.innerHTML="");const a=this.isZooming()&&t?this.zoomElements.rangeSelector.value:1;this.removeCenterFromMover(n);const o=0!==i,r=L.Z.settings.animationsEnabled?o?350:200:0;let d,l;e&&(e instanceof I.Z||e.classList.contains("grid-item")?(d=e,l=e.getBoundingClientRect()):e instanceof SVGImageElement||e.parentElement instanceof SVGForeignObjectElement?(d=(0,x.Z)(e,"attachment"),l=d.getBoundingClientRect()):e.classList.contains("profile-avatars-avatar")&&(d=(0,x.Z)(e,"profile-avatars-container"),l=d.getBoundingClientRect(),t&&e.getBoundingClientRect().left!==l.left&&(e=d=l=void 0))),e||(e=this.content.media),l||(d=e.parentElement,l=e.getBoundingClientRect());let c=!1;if(e!==this.content.media&&!e.classList.contains("profile-avatars-avatar")){const i=(0,x.Z)(d,"scrollable"),s=(0,_.Z)(d,i,!0);!t||s&&2!==s.overflow.vertical&&2!==s.overflow.horizontal?!s||1!==s.overflow.vertical&&1!==s.overflow.horizontal||(c=!0):(d=(e=this.content.media).parentElement,l=e.getBoundingClientRect())}const h=this.content.media.getBoundingClientRect();let u,p,f,m="";if(o?(u=1===i?N.Z.width:-h.width,p=h.top):(u=l.left,p=l.top),m+=`translate3d(${u}px,${p}px,0) `,e instanceof HTMLImageElement||e instanceof HTMLVideoElement||"DIV"===e.tagName){if(n.firstElementChild&&n.firstElementChild.classList.contains("media-viewer-aspecter")){f=n.firstElementChild;const e=f.querySelector(".ckin__player");if(e){const t=e.firstElementChild;f.append(t),e.remove()}f.style.cssText||(n.classList.remove("active"),this.setFullAspect(f,h,l),n.offsetLeft,n.classList.add("active"))}else f=document.createElement("div"),f.classList.add("media-viewer-aspecter"),n.prepend(f);f.style.cssText=`width: ${l.width}px; height: ${l.height}px; transform: scale3d(${h.width/l.width}, ${h.height/l.height}, 1);`}n.style.width=h.width+"px",n.style.height=h.height+"px";const g=l.width/h.width,v=l.height/h.height;o||(m+=`scale3d(${g},${v},1) `);let b=window.getComputedStyle(d).getPropertyValue("border-radius");const y=function(e){const t=e.split(" ");if(4!==t.length){t[0]||(t[0]="0px");for(let e=t.length;e<4;++e)t[e]=t[e%2]||t[0]||"0px"}return t}(b);if(b=y.map((e=>parseInt(e)/g+"px")).join(" "),o||(n.style.borderRadius=b),t&&1!==a){const e=N.Z.width/2-l.width/2,t=N.Z.height/2-l.height/2,i=l.left-e,s=l.top-t;this.moversContainer.style.transform=`matrix(${g}, 0, 0, ${v}, ${i}, ${s})`}else n.style.transform=m;let w;c&&(n.style.opacity="0");const S=e.classList.contains("is-out"),C=this.setMoverAnimationPromise=(0,s.Z)(),E={onAnimationEnd:C},M=setTimeout((()=>{C.isFulfilled||C.isRejected||C.resolve()}),1e3);if(C.finally((()=>{this.dispatchEvent("setMoverAfter"),this.setMoverAnimationPromise===C&&(this.setMoverAnimationPromise=null),clearTimeout(M)})),t)return e instanceof SVGSVGElement&&(w=n.querySelector("path"),w&&this.sizeTailPath(w,h,g,r,!1,S,b)),e.classList.contains("media-viewer-media")&&n.classList.add("hiding"),this.toggleWholeActive(!1),setTimeout((()=>{n.style.borderRadius=b,n.firstElementChild&&(n.firstElementChild.style.borderRadius=b)}),r/2),setTimeout((()=>{n.innerHTML="",n.classList.remove("moving","active","hiding"),n.style.cssText="display: none;",C.resolve()}),r),n.classList.remove("opening"),E;{let t,i;const s="video, img, .canvas-thumbnail",a=e.matches(s)?e.parentElement:e,r=Array.from(a.querySelectorAll(s));if(r.length){e=r.pop();const t=document.createElement("canvas"),i=t.getContext("2d");e instanceof HTMLImageElement?(t.width=e.naturalWidth,t.height=e.naturalHeight):e instanceof HTMLVideoElement?(t.width=e.videoWidth,t.height=e.videoHeight):e instanceof HTMLCanvasElement&&(t.width=e.width,t.height=e.height),t.className="canvas-thumbnail thumbnail media-photo",i.drawImage(e,0,0),e=t}if("DIV"===e.tagName||"AVATAR-ELEMENT"===e.tagName){const s=Array.from(e.querySelectorAll("img")).pop();s&&(t=new Image,i=s.src,n.append(t))}else if(e instanceof HTMLImageElement)t=new Image,i=e.src;else if(e instanceof HTMLVideoElement)t=(0,H.Z)(),t.src=e.src;else if(e instanceof SVGSVGElement){const t=e.dataset.clipId,i=t+"-mv",{width:s,height:a}=h,o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.setAttributeNS(null,"width",""+s),o.setAttributeNS(null,"height",""+a),o.setAttributeNS(null,"viewBox",`0 0 ${s} ${a}`),o.setAttributeNS(null,"preserveAspectRatio","xMidYMid meet"),o.insertAdjacentHTML("beforeend",e.firstElementChild.outerHTML.replace(t,i)),o.insertAdjacentHTML("beforeend",e.lastElementChild.outerHTML.replace(t,i));const r=o.firstElementChild,d=r.firstElementChild.firstElementChild;if(d instanceof SVGUseElement){let e,t=d.getAttributeNS(null,"transform");t=t.replace(/translate\((.+?), (.+?)\) scale\((.+?), (.+?)\)/,((e,t,i,n,o)=>`translate(${t=2!=(t=+t)?s-2/g:2/g}, ${a}) scale(${+n/g}, ${+o/v})`)),d.setAttributeNS(null,"transform",t),w=r.firstElementChild.lastElementChild;const i=b.split(" ").map((e=>parseInt(e)));e=S?(0,F.Z)(0,0,s-9/g,a,...i):(0,F.Z)(9/g,0,s-9/g,a,...i),w.setAttributeNS(null,"d",e)}const l=o.lastElementChild;l.setAttributeNS(null,"width",""+h.width),l.setAttributeNS(null,"height",""+h.height),n.prepend(o)}else e instanceof HTMLCanvasElement&&(t=e);f&&(f.style.borderRadius=b,t&&f.append(t)),t=n.querySelector("video, img"),t instanceof HTMLImageElement&&(t.classList.add("thumbnail"),f||(t.style.width=h.width+"px",t.style.height=h.height+"px"),i&&(yield(0,A.cj)(t,i))),n.style.display="",(0,R.T2)((()=>{n.classList.add(o?"moving":"active")}))}return n.classList.add("opening"),yield(0,R.d1)(),n.style.transform=`translate3d(${h.left}px,${h.top}px,0) scale3d(1,1,1)`,c&&(n.style.opacity=""),f&&this.setFullAspect(f,h,l),setTimeout((()=>{n.style.borderRadius="",n.firstElementChild&&(n.firstElementChild.style.borderRadius="")}),0),n.dataset.timeout=""+setTimeout((()=>{n.classList.remove("moving","opening"),f&&(n.querySelector("video"),n.classList.remove("active"),f.style.cssText="",n.offsetLeft),n.classList.add("center","no-transition"),n.classList.add("active"),delete n.dataset.timeout,C.resolve()}),r),w&&this.sizeTailPath(w,h,g,r,!0,S,b),E}))}toggleWholeActive(e){e?this.wholeDiv.classList.add("active"):(this.wholeDiv.classList.add("backwards"),setTimeout((()=>{this.wholeDiv.classList.remove("active")}),0))}setFullAspect(e,t,i){const s=t.width/t.height;let{width:n,height:a}=i;s>0?n=a*s:a=n*s,e.style.cssText=`width: ${n}px; height: ${a}px; transform: scale3d(${t.width/n}, ${t.height/a}, 1);`}sizeTailPath(e,t,i,s,n,a,o){const r=Date.now(),{width:d,height:l}=t;s/=2;const c=o.split(" ").map((e=>parseInt(e))),h=()=>{const t=Date.now()-r;let o=s?t/s:1;o>1&&(o=1),n&&(o=1-o);const u=c.map((e=>e*o));let p;p=a?(0,F.Z)(0,0,d-9/i*o,l,...u):(0,F.Z)(9/i*o,0,d,l,...u),e.setAttributeNS(null,"d",p),t{const a=t?-s.width:i;return e.replace(n,a+"px")}));e.style.transform=n,setTimeout((()=>{e.remove()}),350)}setNewMover(){const e=document.createElement("div");return e.classList.add("media-viewer-mover"),e.style.display="none",this.content.mover?this.content.mover.parentElement.append(e):this.moversContainer.append(e),this.content.mover=e}updateMediaSource(e,t,i){const s=e.tagName.toLowerCase()===i?e:e.querySelector(i);if(s&&!(0,x.Z)(e,"document")){if((0,x.Z)(e,"attachment")){const t=e.parentElement.parentElement.querySelector(".preloader-container");if(t){if("video"===i)return void(t.classList.contains("manual")&&t.click());t.remove()}}s.src!==t&&(0,A.ZP)(s,t),s.classList.contains("thumbnail")&&s.parentElement.classList.contains("media-container-aspecter")&&s.classList.remove("thumbnail")}}setAuthorInfo(e,t){const i=e.isPeerId();let s;if(i)s=(0,W.Z)({peerId:e,dialog:!1,onlyFirstName:!1,plainText:!1});else{const t=s=document.createElement("span");t.append((0,G.Z)(e)),t.classList.add("peer-title")}const n=this.author.avatarEl,a=this.author.avatarEl=n.cloneNode();return Promise.all([this.author.avatarEl.updateWithOptions({peerId:e||U.NM,peerTitle:i?void 0:""+e}),s]).then((([e,i])=>{this.author.avatarEl===a&&((0,D.Z)(this.author.date,(0,k.OD)(t)),(0,D.Z)(this.author.nameEl,i),n.replaceWith(this.author.avatarEl))}))}_openMedia(e,t,i,s,a,r=!1,c=[],h=[],u){return q(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const p=this.setAuthorInfo(i,t),f="document"===e._,m=f&&e.mime_type&&(["video","gif"].includes(e.type)||0===e.mime_type.indexOf("video/"));this.isFirstOpen&&(this.isFirstOpen=!1,this.listLoader.setTargets(c,h,r),window.appMediaViewer=this),this.listLoader.next.length<10&&setTimeout((()=>{this.listLoader.load(!0)}),0),this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length);const g=this.content.media,v=!a||a===g;v&&(a=g),this.target={element:a};const b=++this.tempId;g.firstElementChild&&(g.innerHTML=""),0!==s?(this.moveTheMover(this.content.mover,1===s),this.setNewMover()):(this.toggleOverlay(!0),this.setGlobalListeners(),yield p,this.wholeDiv.parentElement||(this.pageEl.insertBefore(this.wholeDiv,document.getElementById("main-columns")),this.wholeDiv.offsetLeft),this.toggleWholeActive(!0),o.IS_MOBILE_SAFARI||(this.navigationItem={type:"media",onPop:e=>{if(this.setMoverAnimationPromise)return!1;this.close()}},T.Z.pushItem(this.navigationItem)));const y=this.content.mover,w=N.Z.width;let S=0;const L=N.Z.height;L<1e6&&!n.Z.isMobile&&(S=120);const E=L-120-S;let I=Promise.resolve();const M=(0,j.Z)(e,g,w,E,!n.Z.isMobile,void 0,!!(f&&e.w&&e.h)).photoSize;if(v){const t=yield this.managers.thumbsStorage.getCacheContext(e,M.type);let i;if(t.downloaded)i=new Image,i.src=t.url;else{const s=(0,z.Z)(e,t,!0);s&&(I=s.loadPromise,i=s.image)}i&&(i.classList.add("thumbnail"),g.append(i))}const P=!(!f||!e.supportsStreaming),Z=P?this.preloaderStreamable:this.preloader,k=()=>this.managers.thumbsStorage.getCacheContext(e,null==M?void 0:M.type);let x;if(m){const t=u&&"gif"!==e.type,i=(0,H.Z)({pip:t});this.wholeDiv.classList.contains("no-forwards")&&i.addEventListener("contextmenu",l.Z);const n=()=>this.setMoverToTarget(a,!1,s).then((({onAnimationEnd:s})=>{const n=y.firstElementChild&&y.firstElementChild.classList.contains("media-viewer-aspecter")?y.firstElementChild:y,r=y.querySelector("video");r&&r.remove(),i.setAttribute("playsinline","true"),i.addEventListener("timeupdate",(()=>{this.tempId!==b&&i.pause()})),this.addEventListener("setMoverAfter",(()=>{i.src="",i.load()}),{once:!0}),o.IS_SAFARI&&(i.autoplay=!0),"gif"===e.type?(i.muted=!0,i.autoplay=!0,i.loop=!0):e.duration<60&&(i.loop=!0),n.append(i);const c=new Promise((e=>{i.addEventListener("canplay",e,{once:!0})})),h=()=>{"gif"!==e.type&&(i.dataset.ckin="default",i.dataset.overlay="1",Promise.all([c,s]).then((()=>{this.tempId===b&&((this.videoPlayer=new C({video:i,play:!0,streamable:P,onPlaybackRackMenuToggle:e=>{this.wholeDiv.classList.toggle("hide-caption",!!e)},onPip:e=>{const s=window.appMediaViewer;if(!e&&s&&s!==this)return this.releaseSingleMedia=void 0,void this.close();this.moversContainer.lastElementChild.classList.toggle("hiding",e),this.toggleWholeActive(!e),this.toggleOverlay(!e),this.toggleGlobalListeners(!e),this.navigationItem&&(e?T.Z.removeItem(this.navigationItem):T.Z.pushItem(this.navigationItem)),t&&(e?(this.releaseSingleMedia(!1),this.releaseSingleMedia=void 0,d.Z.setPictureInPicture(i)):this.releaseSingleMedia=d.Z.setSingleMedia(i,u))},onPipClose:()=>{this.close()}})).addEventListener("toggleControls",(e=>{this.wholeDiv.classList.toggle("has-video-controls",e)})),this.addEventListener("setMoverBefore",(()=>{this.wholeDiv.classList.remove("has-video-controls"),this.videoPlayer.cleanup(),this.videoPlayer=void 0}),{once:!0}),this.isZooming()&&this.videoPlayer.lockControls(!1))})))};if(P){s.then((()=>{i.readyState{i.addEventListener("canplay",(()=>{Z.detach(),i.parentElement.classList.remove("is-buffering")}),{once:!0})};i.addEventListener("waiting",(()=>{const t=i.networkState===i.NETWORK_LOADING,s=i.readyState{(0,l.Z)(e)})),e()}this.lazyLoadQueue.unshift({load:()=>q(this,void 0,void 0,(function*(){const r=P?Promise.resolve():K.Z.downloadMediaURL({media:e});return P||s.then((()=>q(this,void 0,void 0,(function*(){(yield k()).url||Z.attach(y,!0,r)})))),Promise.all([r,s]).then((()=>q(this,void 0,void 0,(function*(){if(this.tempId!==b)return void this.log.warn("media viewer changed video");const e=(yield k()).url;i.addEventListener("error",(()=>{(0,$.bC)({langPackKey:o.IS_MOBILE?"Video.Unsupported.Mobile":"Video.Unsupported.Desktop"}),4!==i.error.code&&this.log.error("Error "+i.error.code+"; details: "+i.error.message),null==Z||Z.detach()}),{once:!0}),a instanceof SVGSVGElement?n.firstElementChild.lastElementChild.append(i):(0,A.ZP)(i,e),t&&(this.releaseSingleMedia=d.Z.setSingleMedia(i,u),this.addEventListener("setMoverBefore",(()=>{this.releaseSingleMedia&&(this.releaseSingleMedia(),this.releaseSingleMedia=void 0)}),{once:!0})),this.updateMediaSource(a,e,"video"),h()})))),r}))})}));x=I.then(n)}else{const t=()=>this.setMoverToTarget(a,!1,s).then((({onAnimationEnd:t})=>{this.lazyLoadQueue.unshift({load:()=>q(this,void 0,void 0,(function*(){const i=f?K.Z.downloadMediaURL({media:e}):K.Z.downloadMediaURL({media:e,thumb:M});return t.then((()=>q(this,void 0,void 0,(function*(){(yield k()).url||this.preloader.attachPromise(i)})))),Promise.all([t,i]).then((()=>q(this,void 0,void 0,(function*(){var e;if(this.tempId!==b)return void this.log.warn("media viewer changed photo");const t=(yield k()).url;if(a instanceof SVGSVGElement){if(this.updateMediaSource(a,t,"img"),this.updateMediaSource(y,t,"img"),n.Z.isMobile){const e=y.querySelectorAll("img");e&&e.length&&e.forEach((e=>{e.classList.remove("thumbnail")}))}}else{const i=y.firstElementChild&&y.firstElementChild.classList.contains("media-viewer-aspecter")?y.firstElementChild:y,s="IMG"===(null===(e=i.firstElementChild)||void 0===e?void 0:e.tagName)?i.firstElementChild:null;if(!s||s.src!==t){const e=new Image;e.classList.add("thumbnail"),(0,A.ZP)(e,t,(()=>{this.updateMediaSource(a,t,"img"),s&&(0,R.T2)((()=>{s.remove()})),i.append(e)}))}}})))).catch((e=>{this.log.error(e),this.preloader.attach(y),this.preloader.setManual()})),i}))})}));x=I.then(t)}return this.setMoverPromise=x.catch((()=>{this.setMoverAnimationPromise=null})).finally((()=>{this.setMoverPromise=null}))}))}}},6385:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(410),n=i(4762),a=i(5003),o=i(8799),r=i(3910),d=i(3444),l=i(1655);const c=new class{constructor(){if(this.onPopState=e=>{const t=window.location.hash,i=e.state;if(this.debug&&this.log("popstate",e,this.isPossibleSwipe,t),t!==this.currentHash)if(this.debug&&this.log.warn(`hash changed, new=${t}, current=${this.currentHash}, overridden=${this.overriddenHash}`),i===this.id&&this.overriddenHash&&this.overriddenHash!==t)this.overrideHash(this.overriddenHash);else{if(!i||this.overriddenHash||!t)return this.currentHash=t,void(this.onHashChange&&this.onHashChange());this.overrideHash()}if(i!==this.id&&(this.pushState(),!this.navigations.length))return;const s=this.navigations.pop();s?(this.manual=!this.isPossibleSwipe,this.handleItem(s)):this.pushState()},this.onKeyDown=e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||((0,r.Z)(e),this.back(t.type)))},this.onTouchStart=e=>{e.touches.length>1||(this.debug&&this.log("touchstart"),(0,d.Z)(e)&&(this.isPossibleSwipe=!0,window.addEventListener("touchend",(()=>{setTimeout((()=>{this.isPossibleSwipe=!1}),100)}),{passive:!0,once:!0})))},this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=(0,a.kg)("NC"),this.debug=!0,this.currentHash=window.location.hash,this.overriddenHash="",this.isPossibleSwipe=!1,window.addEventListener("popstate",this.onPopState),window.addEventListener("keydown",this.onKeyDown,{capture:!0,passive:!1}),n.IS_MOBILE_SAFARI){const e={passive:!0};window.addEventListener("touchstart",this.onTouchStart,e)}history.scrollRestoration="manual",this.pushState()}overrideHash(e=""){e&&"#"!==e[0]?e="#"+e:"#"===e&&(e=""),this.currentHash!==e&&(this.overriddenHash=this.currentHash=e,this.replaceState(),this.pushState())}handleItem(e){const t=e.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",e,this.navigations),!1===t?this.pushItem(e):e.noBlurOnPop||(0,o.Z)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const i=this.navigations[t];if(i.type===e)return{item:i,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return void this.backByItem(t.item,t.index)}history.back()}backByItem(e,t=this.navigations.indexOf(e)){this.manual=!0,this.navigations.splice(t,1),this.handleItem(e)}onItemAdded(e){this.debug&&this.log("onItemAdded",e,this.navigations),e.noHistory||this.pushState()}pushItem(e){this.navigations.push(e),this.onItemAdded(e)}unshiftItem(e){this.navigations.unshift(e),this.onItemAdded(e)}spliceItems(e,t,...i){this.navigations.splice(e,t,...i),i.forEach((e=>{this.onItemAdded(e)}))}pushState(){this.debug&&this.log("push"),this.manual=!1,history.pushState(this.id,"")}replaceState(){this.debug&&this.log.warn("replace");const e=location.origin+location.pathname+location.search+this.overriddenHash;history.replaceState(this.id,"",e)}removeItem(e){e&&(0,l.Z)(this.navigations,e)}removeByType(e,t=!1){for(let i=this.navigations.length-1;i>=0&&(this.navigations[i].type!==e||(this.navigations.splice(i,1),!t));--i);}};s.GO.appNavigationController=c;const h=c},5884:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,z:()=>d});var s=i(8130),n=i(8805),a=i(5565),o=i(2325),r=i(3512);class d{constructor(e,t,i=!0,n,a=!0,r=!0,d,l){this.name=e,this.type=t,this.clearable=i,this.autonomous=r,this.onFound=d,this.noIcons=l,this.list=s.default.createChatList(),this.container=document.createElement("div"),n&&(this.container.className=n),e&&(this.nameEl=document.createElement("div"),this.nameEl.classList.add("search-group__name"),"string"==typeof e&&this.nameEl.append((0,o.ag)(e)),this.container.append(this.nameEl)),this.container.classList.add("search-group","search-group-"+t),this.container.append(this.list),this.container.style.display="none",a&&s.default.setListClickListener(this.list,d,void 0,r)}clear(){this.container.style.display="none",this.clearable&&(this.list.innerHTML="")}setActive(){this.container.style.display=""}toggle(){this.list.childElementCount?this.setActive():this.clear()}}class l{constructor(e,t,i,s,a){this.container=e,this.searchInput=t,this.searchGroups=i,this.onSearch=s,this.noIcons=a,this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1,this.searchPromise=null,this.searchTimeout=0,this.query="",this.listsContainer=null,this.threadId=0,this.scrollable=new n.ZP(this.container),this.listsContainer=this.scrollable.container;for(const e in this.searchGroups)this.listsContainer.append(this.searchGroups[e].container);this.searchGroups.messages&&this.scrollable.setVirtualContainer(this.searchGroups.messages.list),this.searchInput.onChange=e=>{this.query=e,this.reset(!1),this.searchMore()},this.scrollable.onScrolledBottom=()=>{this.query.trim()&&(this.searchTimeout||(this.searchTimeout=window.setTimeout((()=>{this.searchMore(),this.searchTimeout=0}),0)))}}reset(e=!0){e&&(this.searchInput.value="",this.query="",this.peerId=void 0,this.threadId=0),this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1;for(const e in this.searchGroups)this.searchGroups[e].clear();this.searchPromise=null}beginSearch(e,t=0,i=""){this.peerId=e,this.threadId=t,this.query!==i&&(this.searchInput.inputField.value=i),this.searchInput.input.focus()}searchMore(){if(this.searchPromise)return this.searchPromise;const e=this.query;if(!e.trim())return void(this.onSearch&&this.onSearch(0));if(-1!==this.foundCount&&this.loadedCount>=this.foundCount)return Promise.resolve();const t=this.minMsgId||0;return this.searchPromise=r.Z.managers.appMessagesManager.getSearch({peerId:this.peerId,query:e,inputFilter:{_:"inputMessagesFilterEmpty"},maxId:t,limit:20,threadId:this.threadId}).then((t=>{if(this.searchPromise=null,this.searchInput.value!==e)return;const{count:i,history:n}=t;n.length&&n[0].mid===this.minMsgId&&n.shift();const r=this.searchGroups.messages;n.forEach((t=>{try{const i=this.peerId?t.fromId:t.peerId;s.default.addDialogAndSetLastMessage({peerId:i,container:this.scrollable,avatarSize:"bigger",meAsSaved:!1,message:t,query:e,noIcons:this.noIcons})}catch(e){console.error("[appSearch] render search result",e)}})),r.toggle(),this.minMsgId=n.length&&n[n.length-1].mid,-1===this.loadedCount&&(this.loadedCount=0),this.loadedCount+=n.length,-1===this.foundCount&&(this.foundCount=i,r.nameEl&&(0,a.Z)(r.nameEl,(0,o.ag)(i?"Chat.Search.MessagesFound":"Chat.Search.NoMessagesFound",[i])),this.onSearch&&this.onSearch(this.foundCount))})).catch((e=>{console.error("search error",e),this.searchPromise=null}))}}},6360:(e,t,i)=>{"use strict";i.d(t,{Z:()=>fe});var s=i(8130),n=i(5003),a=i(3512),o=i(5884),r=i(6008),d=i(2153),l=i(279),c=i(1405),h=i(8805),u=i(8594),p=i(2325),f=i(8497),m=i(3624),g=i(2894),v=i(4668),b=i(4332),y=i(4755),w=i(4271),S=i(4484),C=i(467),L=i(5432),E=i(1154),I=i(241),M=i(6272),P=i(3003),Z=i(4524),k=i(5128),T=i(7479),x=i(5705),A=i(6054),_=i(3910),F=i(2738),D=i(1784),R=i(8479),B=i(7401),N=i(5953),O=i(3738),U=i(4064),H=i(130),z=i(7030),j=i(2498),G=i(1336),V=i(5798),K=i(2342),W=i(2491),$=i(5400),q=i(5671),Q=i(1604),Y=i(7530),X=i(6566),J=i(177),ee=i(3061),te=i(2566),ie=i(6976),se=i(3416),ne=i(1483),ae=i(3855),oe=i(3699),re=i(296),de=i(9492),le=i(2887),ce=i(319),he=i(6131),ue=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class pe{constructor(e,t,i){this.attachTo=e,this.searchSuper=t,this.listenerSetter=i,this.onGotoClick=()=>{w.Z.setInnerPeer({peerId:this.peerId,lastMsgId:this.mid,threadId:this.searchSuper.searchContext.threadId})},this.onForwardClick=()=>{this.searchSuper.selection.isSelecting?(0,F.tH)(this.searchSuper.selection.selectionForwardBtn):new Z.Z({[this.peerId]:[this.mid]})},this.onSelectClick=()=>{this.searchSuper.selection.toggleByElement(this.target)},this.onClearSelectionClick=()=>{this.searchSuper.selection.cancelSelection()},this.onDeleteClick=()=>{this.searchSuper.selection.isSelecting?(0,F.tH)(this.searchSuper.selection.selectionDeleteBtn):new k.Z(this.peerId,[this.mid],"chat")},this.managers=t.managers;L.Z||(0,ie.E)(e,(e=>{let i;this.init&&(this.init(),this.init=null);try{i=(0,f.Z)(e.target,"search-super-item")}catch(e){}if(i){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),(()=>{ue(this,void 0,void 0,(function*(){this.target=i,this.peerId=i.dataset.peerId.toPeerId(),this.mid=+i.dataset.mid,this.isSelected=t.selection.isMidSelected(this.peerId,this.mid),yield Promise.all(this.buttons.map((e=>ue(this,void 0,void 0,(function*(){let t;t=!(this.isSelected&&!e.withSelection)&&(!e.verify||(yield e.verify())),e.element.classList.toggle("hide",!t)}))))),i.classList.add("menu-open"),(0,ne.Z)(e,this.element),se.Z.openBtnMenu(this.element,(()=>{i.classList.remove("menu-open")}))}))})()}}),i)}init(){this.buttons=[{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>ue(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canForward(yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,this.mid))}))},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionForwardBtn.classList.contains("hide"),withSelection:!0},{icon:"message",text:"Message.Context.Goto",onClick:this.onGotoClick,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,withSelection:!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>ue(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canDeleteMessage(yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,this.mid))}))},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionDeleteBtn.classList.contains("hide"),withSelection:!0}],this.element=(0,P.b)({buttons:this.buttons,listenerSetter:this.listenerSetter}),this.element.classList.add("search-contextmenu","contextmenu"),document.getElementById("page-chats").append(this.element)}}class fe{constructor(e){this.tabs={},this.prevTabId=-1,this.lazyLoadQueue=new d.Z,this.middleware=(0,m.k)(),this.historyStorage={},this.usedFromHistory={},this.loadMutex=Promise.resolve(),this.nextRates={},this.loadPromises={},this.loaded={},this.loadedChats=!1,this.firstLoad=!0,this.log=(0,n.kg)("SEARCH-SUPER"),this.monthContainers={},this.mediaTabsMap=new Map,this.asChatList=!1,this.groupByMonth=!0,this.hideEmptyTabs=!0,this.showSender=!1,this.onTransitionStart=()=>{this.container.classList.add("sliding")},this.onTransitionEnd=()=>{this.container.classList.remove("sliding")},(0,N.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("search-super"),this.listenerSetter=new oe.Z,this.searchContextMenu=new pe(this.container,this,this.listenerSetter),this.selection=new A.e(this,this.managers,this.listenerSetter);const t=this.navScrollableContainer=document.createElement("div");t.classList.add("search-super-tabs-scrollable","menu-horizontal-scrollable","sticky");const i=this.navScrollable=new h.v7(t);i.container.classList.add("search-super-nav-scrollable");const s=this.nav=document.createElement("nav");s.classList.add("search-super-tabs","menu-horizontal-div"),this.tabsMenu=s,i.container.append(s);for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const i=document.createElement("span"),s=document.createElement("i");i.append((0,p.ag)(e.name)),i.append(s),t.append(i),(0,c.Z)(t),this.tabsMenu.append(t),this.mediaTabsMap.set(e.type,e),e.menuTab=t}let a;this.tabsContainer=document.createElement("div"),this.tabsContainer.classList.add("search-super-tabs-container","tabs-container"),L.Z&&(this.swipeHandler=(0,E.Z)({element:this.tabsContainer,onSwipe:(e,t,i)=>{e*=-1;const s=this.selectTab.prevId(),n=Array.from(this.tabsMenu.children);let o;if(e>0){for(let e=s+1;e=0;--e)if(!n[e].classList.contains("hide")){o=e;break}void 0!==o&&(a=function(e){const t=e=>{(0,_.Z)(e)};let i=2;const s=()=>{--i||e.removeEventListener("touchmove",t,{capture:!0})};return e.addEventListener("touchmove",t,{capture:!0,passive:!1}),e.addEventListener("touchend",s,{once:!0}),s}(this.tabsContainer),this.selectTab(o))}}));for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("search-super-container-"+e.type,"tabs-tab");const i=document.createElement("div");i.classList.add("search-super-content-"+e.type),t.append(i),this.tabsContainer.append(t),this.tabs[e.inputFilter]=i,e.contentTab=i}this.container.append(t,this.tabsContainer),this.searchGroupMedia=new o.z(!1,"messages",!0),this.scrollable.onScrolledBottom=()=>{this.mediaTab.contentTab&&this.canLoadMediaTab(this.mediaTab)&&this.load(!0)},this.selectTab=(0,r.X)(this.tabsMenu,this.tabsContainer,((e,t,i)=>{if(this.prevTabId===e&&!this.skipScroll)return void this.scrollable.scrollIntoViewNew({element:this.container,position:"start",startCallback:this.scrollStartCallback});const s=this.mediaTabs[e];this.onChangeTab&&this.onChangeTab(s);const n=this.mediaTab;if(this.mediaTab=s,-1!==this.prevTabId&&i&&this.onTransitionStart(),this.skipScroll)this.skipScroll=!1;else{const e=this.container.offsetTop;let t=this.scrollable.scrollTop;if(tn&&(s.scroll={scrollTop:n,scrollHeight:0})}if(s.scroll){const e=n.scroll.scrollTop-s.scroll.scrollTop;e&&(s.contentTab.style.transform=`translateY(${e}px)`)}}-1===this.prevTabId||s.contentTab.childElementCount||this.load(!0),this.prevTabId=e}),(()=>{this.scrollable.onScroll(),void 0!==this.mediaTab.scroll&&(this.mediaTab.contentTab.style.transform="",this.scrollable.scrollTop=this.mediaTab.scroll.scrollTop),a&&(a(),a=void 0),this.onTransitionEnd()}),void 0,i,this.listenerSetter),(0,F.fc)(this.tabsContainer,(e=>{this.selection.isSelecting&&((0,_.Z)(e),this.selection.toggleByElement((0,f.Z)(e.target,"search-super-item")))}),{capture:!0,passive:!1,listenerSetter:this.listenerSetter});const l=(e,t,i,s)=>ue(this,void 0,void 0,(function*(){const n=(0,f.Z)(s.target,e);if(!n)return;const a=+n.dataset.mid;if(!a)return void this.log.warn("no messageId by click on target:",n);const o=n.querySelector(".media-spoiler-container");if(o)return void(0,he.kN)({event:s,mediaSpoiler:o});const r=n.dataset.peerId.toPeerId(),d=Array.from(this.tabs[i].querySelectorAll("."+t)).map((t=>{const i=(0,f.Z)(t,e);return{element:t,mid:+i.dataset.mid,peerId:i.dataset.peerId.toPeerId()}})),l=d.findIndex((e=>e.mid===a&&e.peerId===r)),c=yield this.managers.appMessagesManager.getMessageByPeer(r,a);(new D.Z).setSearchContext(this.copySearchContext(i)).openMedia(c,d[l].element,0,!1,d.slice(0,l),d.slice(l+1))}));(0,F.fc)(this.tabs.inputMessagesFilterPhotoVideo,l.bind(null,"grid-item","grid-item","inputMessagesFilterPhotoVideo"),{listenerSetter:this.listenerSetter}),(0,F.fc)(this.tabs.inputMessagesFilterDocument,l.bind(null,"document-with-thumb","media-container","inputMessagesFilterDocument"),{listenerSetter:this.listenerSetter}),this.mediaTab=this.mediaTabs[0],(0,u.ZP)((()=>{this.lazyLoadQueue.lock()}),(()=>{this.lazyLoadQueue.unlockAndRefresh()}),this.listenerSetter)}filterMessagesByType(e,t){return(0,X.Z)(t,e,e.length)}processEmptyFilter({message:e,searchGroup:t}){const i=[],n=s.default.addDialogNew({peerId:e.peerId,container:t.list,avatarSize:"bigger",loadPromises:i}),a=s.default.setLastMessageN({dialog:{_:"dialog",peerId:e.peerId},lastMessage:e,dialogElement:n,highlightWord:this.searchContext.query});return i.push(a),Promise.all(i).then(ce.Z)}processPhotoVideoFilter({message:e,promises:t,middleware:i}){return ue(this,void 0,void 0,(function*(){const s=(0,Y.Z)(e),n=document.createElement("div");let a;n.classList.add("grid-item");const o=(0,z.Z)(s,200,200);if(a="photo"!==s._?yield(yield(0,le.Z)({doc:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,onlyPreview:!0,withoutPreloader:!0,noPlayButton:!0,photoSize:o})).thumb:yield(0,de.Z)({photo:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,withoutPreloader:!0,noBlur:!0,size:o}),e.media.pFlags.spoiler){const e=yield(0,he.ZP)({animationGroup:"chat",media:s,middleware:i,width:140,height:140,multiply:.3});n.append(e)}return[a.images.thumb,a.images.full].filter(Boolean).forEach((e=>{e.classList.add("grid-item-media")})),t.push(a.loadPromises.thumb),{element:n,message:e}}))}processDocumentFilter({message:e,inputFilter:t}){return ue(this,void 0,void 0,(function*(){const i=(0,Y.Z)(e),s=this.showSender||["voice","round"].includes(i.type),n=yield(0,re.Z)({message:e,withTime:!s,fontWeight:400,voiceAsMusic:!0,showSender:s,searchContext:this.copySearchContext(t),lazyLoadQueue:this.lazyLoadQueue,autoDownloadSize:0});return["audio","voice","round"].includes(i.type)&&n.classList.add("audio-48"),{message:e,element:n}}))}processUrlFilter({message:e,promises:t,middleware:i}){var s;return ue(this,void 0,void 0,(function*(){let n=null===(s=e.media)||void 0===s?void 0:s.webpage;if(!n){const t=e.totalEntities?e.totalEntities.find((e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._)):null;let i,s,a;if(t)a=e.message.slice(t.offset,t.offset+t.length);else{const t=(0,K.Z)(e.message);if(!t)return;i=t[0]}i="messageEntityTextUrl"===(null==t?void 0:t._)?t.url:i||a,s=i;const o=e.message===i;i.match(/^(ftp|http|https):\/\//)||(s="https://"+i,i=i.includes("@")?i:"https://"+i),s=new URL(s).hostname,n={_:"webPage",url:i,display_url:s,id:"",hash:0},o||(n.description=e.message)}if("webPageEmpty"===n._)return;const a=document.createElement("div");a.classList.add("preview"),n.photo?(0,de.Z)({container:a,message:null,photo:n.photo,boxWidth:0,boxHeight:0,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,size:(0,z.Z)(n.photo,60,60,!1),loadPromises:t,noBlur:!0}):(a.classList.add("empty"),(0,H.Z)(a,(0,V.Z)(n.title||n.display_url||n.description||n.url,!0)));const o=(0,G.Z)(n),r=(0,j.Z)(n),d=(0,x.Z)((0,$.ZP)(n.url||"")).firstElementChild;if(d instanceof HTMLAnchorElement)try{d.innerText=decodeURIComponent(d.href)}catch(e){}r.firstChild&&r.append("\n"),r.append(d),this.showSender&&r.append("\n",yield(0,q.Z)(e)),o.textContent||o.append((0,W.Z)(n.display_url.split("/",1)[0]));const l=new T.ZP({title:o,titleRight:(0,Q.Z)(e),subtitle:r,havePadding:!0,clickable:!0,noRipple:!0});return l.applyMediaElement(a,"big"),l.container.innerText.trim().length?{message:e,element:l.container}:void 0}))}performSearchResult(e,t,i=!0){return ue(this,void 0,void 0,(function*(){const s=[],n=t.contentTab,a=[],o=this.middleware.get();let r,d=t.inputFilter;yield(0,u.e9)(),"inputMessagesFilterPhotoVideo"===d&&this.searchContext.query.trim()?(d="inputMessagesFilterEmpty",r=this.searchGroupMedia,n.append(r.container)):"inputMessagesFilterEmpty"===d&&(r=this.searchGroups.messages);const l={elemsToAppend:s,inputFilter:d,message:void 0,middleware:o,promises:a,searchGroup:r};let c;switch(d){case"inputMessagesFilterEmpty":c=this.processEmptyFilter;break;case"inputMessagesFilterPhotoVideo":c=this.processPhotoVideoFilter;break;case"inputMessagesFilterVoice":case"inputMessagesFilterRoundVoice":case"inputMessagesFilterMusic":case"inputMessagesFilterDocument":c=this.processDocumentFilter;break;case"inputMessagesFilterUrl":c=this.processUrlFilter}if(c){c=c.bind(this);const t=e.map((e=>ue(this,void 0,void 0,(function*(){try{return l.message=e,yield c(l)}catch(t){this.log.error("error rendering filter",d,l,e,t)}})))),i=(yield Promise.all(t)).filter(Boolean);s.push(...i)}if(r&&r.list.childElementCount&&r.setActive(),this.loadMutex&&a.push(this.loadMutex),!a.length||(yield Promise.all(a),o())){if(s.length){const e=i?"append":"prepend";s.forEach((t=>{var i;const{element:s,message:n}=t,a=this.getMonthContainerByTimestamp(this.groupByMonth?n.date:0,d);s.classList.add("search-super-item"),s.dataset.mid=""+n.mid,s.dataset.peerId=""+n.peerId,a.items[e](s),(null===(i=this.selection)||void 0===i?void 0:i.isSelecting)&&this.selection.toggleElementCheckbox(s,!0)}))}this.afterPerforming("inputMessagesFilterEmpty"===d?1:s.length,n)}}))}afterPerforming(e,t){if(t){const i=t.parentElement;if(Array.from(i.children).slice(1).forEach((e=>{e.remove()})),!e&&!t.childElementCount){const e=document.createElement("div");e.innerText="Nothing interesting here yet...",e.classList.add("position-center","text-center","content-empty","no-select"),i.append(e)}}}loadChats(){const e=new Set,t=this.middleware.get();for(const e in this.searchGroups){const t=this.searchGroups[e];this.tabs.inputMessagesFilterEmpty.append(t.container),t.clear()}const i=this.searchContext.query;if(i){const n=(t,n,o=!1)=>{t.map((t=>{if(e.has(t))return;e.add(t);const{dom:i}=s.default.addDialogNew({peerId:t,container:n.list,avatarSize:"abitbigger",autonomous:n.autonomous});return{dom:i,peerId:t}})).filter(Boolean).forEach((({dom:e,peerId:t})=>ue(this,void 0,void 0,(function*(){const s=yield this.managers.appPeersManager.getPeer(t);if(o&&(s.participants_count||s.participants)){const s=new RegExp(`(${(0,O.Z)(i)}|${(0,O.Z)((0,C.ZP)(i))})`,"gi");e.titleSpan.innerHTML=e.titleSpan.innerHTML.replace(s,"$1"),e.lastMessageSpan.append(yield(0,J.Z)(t.toChatId()))}else if(t===a.Z.myId)e.lastMessageSpan.append((0,p.ag)("Presence.YourChat"));else{let i=yield this.managers.appPeersManager.getPeerUsername(t);if(i)i="@"+i;else{const e=yield this.managers.appUsersManager.getUser(t);e&&e.phone&&(i="+"+(0,M.u)(e.phone).formatted)}e.lastMessageSpan.textContent=i}})))),n.toggle()},o=e=>{if(t())return e};return Promise.all([this.managers.appUsersManager.getContactsPeerIds(i,!0,void 0,10).then(o).then((e=>{e&&n(e,this.searchGroups.contacts,!0)})),this.managers.appUsersManager.searchContacts(i,20).then(o).then((e=>{if(e&&(n(e.my_results,this.searchGroups.contacts,!0),n(e.results,this.searchGroups.globalContacts),this.searchGroups.globalContacts.container.classList.add("is-short"),this.searchGroups.globalContacts.nameEl.lastElementChild!==this.searchGroups.globalContacts.nameEl.firstElementChild&&this.searchGroups.globalContacts.nameEl.lastElementChild.remove(),this.searchGroups.globalContacts.list.childElementCount>3)){const e=document.createElement("div");e.classList.add("search-group__show-more");const t=new p.ZP.IntlElement({key:"Separator.ShowMore"});e.append(t.element),this.searchGroups.globalContacts.nameEl.append(e),(0,F.fc)(e,(()=>{const e=this.searchGroups.globalContacts.container.classList.toggle("is-short");t.key=e?"Separator.ShowMore":"Separator.ShowLess",t.update()}))}})),this.managers.dialogsStorage.getDialogs({query:i,offsetIndex:0,limit:20,filterId:0}).then(o).then((e=>{e&&n(e.dialogs.map((e=>e.peerId)),this.searchGroups.contacts,!0)}))])}if(this.searchContext.peerId||this.searchContext.minDate)return Promise.resolve();{const e=(e=!0)=>ae.Z.getState().then((i=>{t()&&(this.searchGroups.recent.list.replaceChildren(),i.recentSearch.slice(0,20).forEach((e=>ue(this,void 0,void 0,(function*(){const{dom:t}=s.default.addDialogNew({peerId:e,container:this.searchGroups.recent.list,meAsSaved:!0,avatarSize:"abitbigger",autonomous:!0});t.lastMessageSpan.append(yield e.isUser()?(0,ee.Z)(yield this.managers.appUsersManager.getUser(e.toUserId())):(0,J.Z)(e.toChatId()))})))),i.recentSearch.length?e&&this.searchGroups.recent.setActive():this.searchGroups.recent.clear())}));return Promise.all([this.managers.appUsersManager.getTopPeers("correspondents").then((e=>{if(!t())return;const i=e.findIndex((e=>e.id===a.Z.myId));-1!==i&&(e=e.slice()).splice(i,1),e.forEach((e=>{const{dom:t}=s.default.addDialogNew({peerId:e.id,container:this.searchGroups.people.list,onlyFirstName:!0,avatarSize:"bigger",autonomous:!1,noIcons:this.searchGroups.people.noIcons});t.subtitleEl.remove()})),this.searchGroups.people.toggle()})),e()])}}loadMembers(e){return ue(this,void 0,void 0,(function*(){const t=this.searchContext.peerId.toChatId(),i=this.middleware.get();let n;const a=t=>ue(this,void 0,void 0,(function*(){if(!this.loadMutex||(yield this.loadMutex,i())){this.membersList||(this.membersList=new g.Z({lazyLoadQueue:this.lazyLoadQueue,rippleEnabled:!1,managers:this.managers}),(0,F.fc)(this.membersList.list,(e=>{const t=(0,v.Z)(e.target,s.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=t.dataset.peerId.toPeerId();let n=Promise.resolve();y.Z.isMobile&&(n=b.ZP.toggleSidebar(!1)),n.then((()=>{w.Z.setInnerPeer({peerId:i})}))})),e.contentTab.append(this.membersList.list),this.afterPerforming(1,e.contentTab));for(const e of t){const t=(0,te.Z)(e);t.isAnyChat()||((yield this.managers.appUsersManager.getUser(t)).pFlags.deleted||this.membersList.add(t))}}}));if(yield this.managers.appChatsManager.isChannel(t)){const s=this.membersList?200:50;n=this.managers.appProfileManager.getChannelParticipants(t,void 0,s,this.nextRates[e.inputFilter]).then((t=>{if(!i())return;const n=e.contentTab.firstElementChild;return this.nextRates[e.inputFilter]=(n?n.childElementCount:0)+t.participants.length,t.participants.length{if(!i())return;this.loaded[e.inputFilter]=!0;const s=t.participants;return"chatParticipantsForbidden"!==s._?a(s.participants):void 0}));return this.loadPromises[e.inputFilter]=n.finally((()=>{i()&&(this.loadPromises[e.inputFilter]=null)}))}))}loadType(e,t,i,s){var n,a;const o=e.inputFilter;if(this.loadPromises[o])return this.loadPromises[o];if("members"===e.type)return this.loadMembers(e);const r=null!==(n=(a=this.historyStorage)[o])&&void 0!==n?n:a[o]=[];if(!("inputMessagesFilterEmpty"!==o||r.length||(this.loadedChats||(this.loadChats(),this.loadedChats=!0),this.searchContext.query.trim()||this.searchContext.peerId||this.searchContext.minDate)))return this.loaded[o]=!0,Promise.resolve();const d=this.loadPromises[o]=Promise.resolve().then((()=>ue(this,void 0,void 0,(function*(){var n,a;if(r.length&&this.usedFromHistory[o]this.managers.appMessagesManager.getMessageByPeer(e.peerId,e.mid))));t.push(...this.filterMessagesByType(a,o))}while(n{setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}const l=r.length?r[r.length-1].mid:0,c=yield this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{inputFilter:{_:o},maxId:l,limit:i,nextRate:null!==(n=(a=this.nextRates)[o])&&void 0!==n?n:a[o]=0}));if(r.push(...c.history.map((e=>({mid:e.mid,peerId:e.peerId})))),s()&&((c.history.length{setTimeout((()=>{if(s()&&this.mediaTab===e){const e=this.load(!0,!0);e&&e.then((()=>{s()&&setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}}),0)})),this.performSearchResult(this.filterMessagesByType(c.history,o),e)})))).catch((e=>{this.log.error("load error:",e)})).finally((()=>{this.loadPromises[o]=null}));return d}canLoadMediaTab(e){const t=e.inputFilter;return!this.loaded[t]||this.historyStorage[t]&&this.usedFromHistory[t]"inputMessagesFilterEmpty"!==e.inputFilter)),n=s.map((e=>({_:e.inputFilter}))),[a,o]=yield Promise.all([this.managers.appMessagesManager.getSearchCounters(t,n,void 0,i),this.canViewMembers()]);if(!e())return;if(this.loadMutex&&(yield this.loadMutex,!e()))return;let r,d=0;s.forEach((e=>{const t=a.find((t=>t.filter._===e.inputFilter));e.menuTab.classList.toggle("hide",!t.count),e.menuTab.classList.remove("active"),t.count&&(void 0===r&&(r=e),++d)}));const l=this.mediaTabsMap.get("members");l.menuTab.classList.toggle("hide",!o),o&&(r=l,++d),this.container.classList.toggle("hide",!r),this.container.parentElement.classList.toggle("search-empty",!r),r&&(this.skipScroll=!0,this.selectTab(this.mediaTabs.indexOf(r),!1),this.navScrollableContainer.classList.toggle("hide",d<=1))}))}load(e=!1,t=!1){var i;return ue(this,void 0,void 0,(function*(){const s=this.searchContext.peerId;this.log("load",e,s,this.loadPromises);const n=this.middleware.get();if(this.firstLoad){if(yield null!==(i=this.loadFirstTimePromise)&&void 0!==i?i:this.loadFirstTimePromise=this.loadFirstTime(),!n())return;this.loadFirstTimePromise=void 0,this.firstLoad=!1}let a=e?[this.mediaTab]:this.mediaTabs.filter((e=>e!==this.mediaTab));if(a=a.filter((e=>this.canLoadMediaTab(e))),s.isUser()&&(0,U.Z)(a,(e=>"members"===e.type)),!a.length)return;const o=t?50:Math.round(3*(I.Z.height/130|0)*1.25),r=a.map((e=>this.loadType(e,t,o,n)));return Promise.all(r).catch((e=>{this.log.error("Load error all promises:",e)}))}))}getMonthContainerByTimestamp(e,t){var i;const s=new Date(1e3*e);s.setHours(0,0,0),s.setDate(1);const n=s.getTime(),a=null!==(i=this.monthContainers[t])&&void 0!==i?i:this.monthContainers[t]={};if(!(n in a)){const e=document.createElement("div");e.className="search-super-month";const i=document.createElement("div");i.classList.add("search-super-month-name");const o={month:"long"};s.getFullYear()!==(new Date).getFullYear()&&(o.year="numeric");const r=new p.ZP.IntlDateElement({date:s,options:o}).element;i.append(r),e.append(i);const d=document.createElement("div");d.classList.add("search-super-month-items"),e.append(i,d);const l=(0,B.Z)(a,"desc");let c=0;for(;cl[c]);++c);a[n]={container:e,items:d},(0,S.Z)(e,this.tabs[t],c)}return a[n]}canViewMembers(){const{peerId:e}=this.searchContext;if(!e.isAnyChat())return Promise.resolve(!1);const t=e.toChatId();return Promise.all([this.managers.appChatsManager.isBroadcast(t),this.managers.appChatsManager.hasRights(t,"view_participants"),this.managers.appChatsManager.isForum(t)]).then((([e,t,i])=>!e&&t&&(!this.searchContext.threadId||!i)))}cleanup(){var e;this.loadPromises={},this.loaded={},this.loadedChats=!1,this.nextRates={},this.firstLoad=!0,this.prevTabId=-1,this.lazyLoadQueue.clear(),this.mediaTabs.forEach((e=>{this.usedFromHistory[e.inputFilter]=-1})),(null===(e=this.selection)||void 0===e?void 0:e.isSelecting)&&this.selection.cancelSelection(),this.middleware.clean(),this.loadFirstTimePromise=void 0,this.cleanScrollPositions(),this.membersList=void 0}cleanScrollPositions(){this.mediaTabs.forEach((e=>{e.scroll=void 0}))}cleanupHTML(e=!1){this.mediaTabs.forEach((e=>{if(e.contentTab.replaceChildren(),this.hideEmptyTabs&&(this.container.classList.add("hide"),this.container.parentElement.classList.add("search-empty")),"chats"!==e.type&&!this.historyStorage[e.inputFilter]){const t=e.contentTab.parentElement;t.querySelector(".preloader")||(0,l.y)(t,!0);const i=t.querySelector(".content-empty");i&&i.remove()}})),this.monthContainers={},this.searchGroupMedia.clear(),this.scrollable.scrollTop=0}copySearchContext(e){const t=(0,R.Z)(this.searchContext);return t.inputFilter={_:e},t.nextRate=this.nextRates[e],t}setQuery({peerId:e,query:t,threadId:i,historyStorage:s,folderId:n,minDate:a,maxDate:o}){this.searchContext={peerId:e,query:t||"",inputFilter:{_:this.mediaTab.inputFilter},threadId:i,folderId:n,minDate:a,maxDate:o},this.historyStorage=null!=s?s:{},this.cleanup()}destroy(){var e,t;this.cleanup(),this.listenerSetter.removeAll(),this.scrollable.destroy(),null===(e=this.swipeHandler)||void 0===e||e.removeListeners(),null===(t=this.selection)||void 0===t||t.cleanup(),this.scrollStartCallback=void 0,this.onChangeTab=void 0,this.selectTab=void 0,this.searchContextMenu=void 0,this.swipeHandler=void 0,this.selection=void 0}}},5644:(e,t,i)=>{"use strict";i.d(t,{Z:()=>A});var s=i(8130),n=i(3512),a=i(8805),o=i(4789),r=i(9807),d=i(2325),l=i(8763),c=i(8497),h=i(8842),u=i(3910),p=i(5565),f=i(5701),m=i(241),g=i(2738),v=i(6690),b=i(1655),y=i(5953),w=i(4064),S=i(9331),C=i(2353),L=i(2566),E=i(177),I=i(3061),M=i(8493),P=i(7120),Z=i(8050),k=i(36),T=i(5029),x=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class A{constructor(e){this.container=document.createElement("div"),this.list=s.default.createChatList(),this.chatsContainer=document.createElement("div"),this.selected=new Set,this.freezed=!1,this.folderId=0,this.offsetIndex=0,this.query="",this.loadedWhat={},this.renderedPeerIds=new Set,this.peerType=["dialogs"],this.multiSelect=!0,this.rippleEnabled=!0,this.avatarSize="abitbigger",this.exceptSelf=!1,this.tempIds={},this.selfPresence="Presence.YourChat",this.needSwitchList=!1,this.design="round",this.onInput=()=>{const e=this.input.value;if(this.query!==e){(this.peerType.includes("contacts")||this.peerType.includes("dialogs"))&&(this.cachedContacts=void 0),this.peerType.includes("dialogs")&&(this.folderId=0,this.offsetIndex=0);for(const e in this.tempIds)++this.tempIds[e];this.list=s.default.createChatList(),this.promise=void 0,this.loadedWhat={},this.query=e,this.renderedPeerIds.clear(),this.needSwitchList=!0,this.getMoreResults()}},this.checkForTriggers=()=>{this.scrollable.checkForTriggers()},(0,y.Z)(this,e),this.container.classList.add("selector","selector-"+this.design);const t=(this.renderResultsFunc||this.renderResults).bind(this);if(this.renderResultsFunc=e=>x(this,void 0,void 0,(function*(){return this.needSwitchList&&(this.scrollable.splitUp.replaceWith(this.list),this.scrollable.setVirtualContainer(this.list),this.needSwitchList=!1),e=e.filter((e=>{const t=!this.renderedPeerIds.has(e);return t&&this.renderedPeerIds.add(e),t})),this.filterPeerTypeBy&&(e=yield(0,C.Z)(e,(e=>x(this,void 0,void 0,(function*(){if(e.isPeerId()&&(yield this.managers.appPeersManager.getPeer(e)))for(const t of this.filterPeerTypeBy)if(yield this.managers.appPeersManager[t](e))return!0;return!0}))))),t(e)})),this.input=document.createElement("input"),this.input.classList.add("selector-search-input"),this.placeholder?(0,d.$d)(this.input,this.placeholder,void 0,"placeholder"):(0,d.$d)(this.input,"SendMessageTo",void 0,"placeholder"),this.input.type="text",this.multiSelect){const e=new T.Z({});e.innerContainer.classList.add("selector-search-section");const t=document.createElement("div");t.classList.add("selector-search-container"),this.selectedContainer=document.createElement("div"),this.selectedContainer.classList.add("selector-search"),this.selectedContainer.append(this.input),t.append(this.selectedContainer),this.selectedScrollable=new a.ZP(t),(0,g.fc)(this.selectedContainer,(e=>{if(this.freezed)return;let t=e.target;if(t=(0,c.Z)(t,"selector-user"),!t)return;const i=t.dataset.key,s=this.chatsContainer.querySelector('[data-peer-id="'+i+'"]');s?(0,g.tH)(s):this.remove(i.toPeerId())})),e.content.append(t),this.container.append(e.container)}this.chatsContainer.classList.add("chatlist-container");const i=new T.Z({name:this.sectionNameLangPackKey,noShadow:!0});i.content.append(this.list),this.chatsContainer.append(i.container),this.scrollable=new a.ZP(this.chatsContainer),this.scrollable.setVirtualContainer(this.list),(0,g.fc)(this.chatsContainer,(e=>{const t=(0,l.Z)(e.target,"data-peer-id");if((0,u.Z)(e),!t)return;if(this.freezed)return;let i=t.dataset.peerId;if(i=i.isPeerId()?i.toPeerId():i,!this.multiSelect)return void this.add(i);this.selected.has(i)?this.remove(i):this.add(i);const s=t.querySelector("input");s.checked=!s.checked}));const n=(0,f.Z)(this.onInput,200,!1,!0);this.input.addEventListener("input",n),this.scrollable.onScrolledBottom=()=>{this.getMoreResults()},this.scrollable.container.prepend((0,k.G)()),this.container.append(this.chatsContainer),this.appendTo.append(this.container),setTimeout((()=>{const t=this.getMoreResults();e.onFirstRender&&t.then((()=>{e.onFirstRender()}))}),0)}renderSaved(){return x(this,void 0,void 0,(function*(){this.exceptSelf||this.offsetIndex||0!==this.folderId||!this.peerType.includes("dialogs")||this.query&&!(yield this.managers.appUsersManager.testSelfSearch(this.query))||(yield this.renderResultsFunc([n.Z.myId]))}))}getTempId(e){var t,i;null!==(t=(i=this.tempIds)[e])&&void 0!==t||(i[e]=0);const s=++this.tempIds[e];return{tempId:s,middleware:()=>this.tempIds[e]===s}}getMoreDialogs(){return x(this,void 0,void 0,(function*(){if(this.loadedWhat.dialogs&&this.loadedWhat.archived)return;const e=m.Z.height/56*1.25|0,{middleware:t}=this.getTempId("dialogs"),i=this.managers.dialogsStorage.getDialogs({query:this.query,offsetIndex:this.offsetIndex,limit:e,filterId:this.folderId,skipMigrated:!0});i.catch((()=>{t()&&(this.loadedWhat[this.loadedWhat.dialogs?"archived":"dialogs"]=!0)}));const s=yield i;if(!t())return;let a=s.dialogs;if(a.length){const e=(0,Z.Z)(a[a.length-1])||0;if(a=a.slice(),(0,w.Z)(a,(e=>e.peerId===n.Z.myId)),this.chatRightsAction&&(a=yield(0,C.Z)(a,(e=>this.filterByRights(e.peerId))),!t()))return;if(yield this.renderSaved(),!t())return;this.offsetIndex=e}if(this.renderResultsFunc(a.map((e=>e.peerId))),s.isEnd){if(!this.loadedWhat.dialogs){if(yield this.renderSaved(),!t())return;return this.loadedWhat.dialogs=!0,this.offsetIndex=0,this.folderId=1,this.getMoreDialogs()}if(this.loadedWhat.archived=!0,!this.loadedWhat.contacts)return this.getMoreContacts()}}))}filterByRights(e){return x(this,void 0,void 0,(function*(){const t=yield this.managers.appPeersManager.getPeer(e);return e.isUser()?"send_messages"!==this.chatRightsAction||(0,M.Z)(t):!!(0,P.Z)(t,this.chatRightsAction)||void 0}))}getMoreContacts(){return x(this,void 0,void 0,(function*(){if(this.loadedWhat.contacts)return;const e=this.peerType.includes("contacts");if(!this.cachedContacts){const{middleware:t}=this.getTempId("contacts"),i=Promise.all([e?this.managers.appUsersManager.getContactsPeerIds(this.query):[],this.query?this.managers.appUsersManager.searchContacts(this.query):void 0]);i.catch((()=>{t()&&(this.loadedWhat.contacts=!0)}));const[s,a]=yield i;if(!t())return;if(a){let i=e?a.my_results.concat(a.results):a.my_results;if(this.chatRightsAction&&(i=yield(0,C.Z)(i,(e=>this.filterByRights(e))),!t()))return;this.peerType.includes("dialogs")||(i=i.filter((e=>e.isUser()))),this.cachedContacts=(0,v.Z)(s.concat(i))}else this.cachedContacts=s.slice();(0,b.Z)(this.cachedContacts,n.Z.myId)}const t=m.Z.height/56*1.25|0,i=this.cachedContacts.splice(0,t);this.renderResultsFunc(i),this.cachedContacts.length||(this.loadedWhat.contacts=!0)}))}getMoreChannelParticipants(){return x(this,void 0,void 0,(function*(){if(this.loadedWhat.channelParticipants)return;const{middleware:e}=this.getTempId("channelParticipants"),t=this.managers.appProfileManager.getChannelParticipants(this.peerId.toChatId(),{_:"channelParticipantsSearch",q:this.query},50,this.list.childElementCount);t.catch((()=>{e()&&(this.loadedWhat.channelParticipants=!0)}));const i=yield t;if(!e())return;const s=i.participants.map((e=>(0,L.Z)(e)));(0,b.Z)(s,n.Z.myId),this.renderResultsFunc(s),(this.list.childElementCount>=i.count||i.participants.length<50)&&(this.loadedWhat.channelParticipants=!0)}))}getMoreResults(){if(this.promise)return this.promise;const e=(()=>this.peerType.includes("dialogs")&&!this.loadedWhat.archived?this.getMoreSomething("dialogs"):!this.peerType.includes("contacts")&&!this.peerType.includes("dialogs")||this.loadedWhat.contacts?this.peerType.includes("channelParticipants")&&!this.loadedWhat.channelParticipants?this.getMoreSomething("channelParticipants"):void 0:this.getMoreSomething("contacts"))();if(!e)return Promise.resolve();const t=this.promise=e.catch((e=>{console.error("get more result error",e)})).finally((()=>{this.promise===t&&(this.promise=void 0),this.checkForTriggers()}));return t}getMoreSomething(e){return{dialogs:this.getMoreDialogs,contacts:this.getMoreContacts,channelParticipants:this.getMoreChannelParticipants}[e].call(this)}renderResults(e){return x(this,void 0,void 0,(function*(){!this.peerType.includes("dialogs")&&this.loadedWhat.contacts&&(e=yield(0,C.Z)(e,(e=>this.managers.appUsersManager.isNonContactUser(e)))),e.forEach((e=>x(this,void 0,void 0,(function*(){const{dom:t}=s.default.addDialogNew({peerId:e,container:this.scrollable,rippleEnabled:this.rippleEnabled,avatarSize:this.avatarSize});if(this.multiSelect){const i=this.selected.has(e),s=new r.Z;i&&(s.input.checked=!0),t.containerEl.prepend(s.label)}let i;i=e.isAnyChat()?yield(0,E.Z)(e.toChatId()):e===n.Z.myId?(0,d.ag)(this.selfPresence):(0,I.Z)(yield this.managers.appUsersManager.getUser(e.toUserId())),t.lastMessageSpan.append(i)}))))}))}add(e,t,i=!0){var s;if(this.selected.add(e),!this.multiSelect)return void this.onChange(this.selected.size);this.query.trim()&&(this.input.value="",this.onInput());const n=document.createElement("div");n.classList.add("selector-user","scale-in");const a=new S.Z;if(a.classList.add("selector-user-avatar","tgico","avatar-32"),a.isDialog=!0,n.dataset.key=""+e,e.isPeerId()){if(void 0===t){const i=new h.Z;i.update({peerId:e.toPeerId(),dialog:!0}),t=i.element}a.updateWithOptions({peerId:e})}return t&&("string"==typeof t?n.innerHTML=t:((0,p.Z)(n,t),n.append(t))),n.insertAdjacentElement("afterbegin",a),this.selectedContainer.insertBefore(n,this.input),null===(s=this.onChange)||void 0===s||s.call(this,this.selected.size),i&&this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center"}),n}remove(e){if(!this.multiSelect)return;const t=this.selectedContainer.querySelector(`[data-key="${e}"]`);t.classList.remove("scale-in"),t.offsetWidth,t.classList.add("scale-out");const i=()=>{this.selected.delete(e),t.remove(),this.onChange&&this.onChange(this.selected.size)};n.Z.settings.animationsEnabled?t.addEventListener("animationend",i,{once:!0}):i()}getSelected(){return[...this.selected]}addInitial(e){e.forEach((e=>{this.add(e,void 0,!1)})),window.requestAnimationFrame((()=>{this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center",forceDirection:o.f.Static})}))}}},8448:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>F,ns:()=>_});var s=i(3442),n=i(3013),a=i(4755),o=i(4762),r=i(3512),d=i(3910),l=i(2738),c=i(3725),h=i(3699),u=i(319),p=i(8497),f=i(2325),m=i(3251),g=i(632),v=i(9966),b=i(1507),y=i(4081),w=i(5296),S=i(3228),C=i(5157),L=i(7207),E=i(130),I=i(8115),M=i(5671),P=i(1604),Z=i(7530),k=i(2312),T=i(9492),x=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function A(e=!0){const t=new s.Z({cancelable:!0,tryAgainOnFail:e});return t.construct(),e||(t.circle.setAttributeNS(null,"r","23"),t.totalLength=143.58203125),t}r.Z.addEventListener("messages_media_read",(({mids:e,peerId:t})=>{e.forEach((e=>{const i=`[data-mid="${e}"][data-peer-id="${t}"]`;Array.from(document.querySelectorAll(`audio-element.is-unread${i}, .media-round.is-unread${i}`)).forEach((e=>{e.classList.remove("is-unread")}))}))}));const _=(e,t)=>{let i,s;const n=!e.classList.contains("search-super-item"),a=(0,p.Z)(e,n?"bubbles-inner":"tabs-tab");if(a){const t=':not([data-is-outgoing="1"])',o=`.audio:not(.is-voice)${t}`;let r;if(r=e.matches(o)?[o]:[`.audio.is-voice${t}`,`.media-round${t}`],n){const e=".bubble:not(.webpage) ";r=r.map((t=>e+t))}const d=r.join(", "),l=Array.from(a.querySelectorAll(d)),c=l.indexOf(e),h=l.map((e=>({peerId:e.dataset.peerId.toPeerId(),mid:+e.dataset.mid})));i=h.slice(0,c),s=h.slice(c+1)}return(s.length&&s[0].midt)&&([i,s]=[s.reverse(),i.reverse()]),[i,s]};class F extends HTMLElement{constructor(){super(...arguments),this.withTime=!1,this.voiceAsMusic=!1,this.showSender=!1,this.listenerSetter=new h.Z}render(){var e,t,i;return x(this,void 0,void 0,(function*(){this.classList.add("audio"),this.managers=r.Z.managers,this.dataset.mid=""+this.message.mid,this.dataset.peerId=""+this.message.peerId;const s=(0,Z.Z)(this.message),h="voice"===s.type,p=!this.voiceAsMusic&&h,F=this.message.pFlags.is_outgoing,D=null===(e=this.message)||void 0===e?void 0:e.uploadingFileName,R=(0,C.Z)(0|s.duration);this.innerHTML='\n
\n
\n
\n
\n
\n
';const B=this.firstElementChild,N=document.createElement("div");N.classList.add("audio-download"),"audio"!==s.type&&this.message&&this.message.pFlags.media_unread&&this.classList.add("is-unread"),D&&(this.classList.add("is-outgoing"),this.append(N));const O=yield p?function(e){return x(this,void 0,void 0,(function*(){e.classList.add("is-voice");const t=e.message,i=(0,Z.Z)(t);t.pFlags.out&&e.classList.add("is-out");let s=i.attributes.find((e=>"documentAttributeAudio"===e._)).waveform||new Uint8Array([]);s=function(e){e instanceof Uint8Array||(e=new Uint8Array(e));const t=8*e.length/5|0;if(!t)return new Uint8Array([]);let i;try{const s=new DataView(e.buffer);i=new Uint8Array(t);for(let e=0;e>n&31}}catch(e){i=new Uint8Array([])}return i}(s.slice(0,63));const{svg:n,container:o,availW:r}=function(e,t){const i=a.Z.isMobile?16:23,s=a.Z.isMobile?152:190,n=a.Z.isMobile?190:256,o=(0,S.Z)(t/60*n,s,n),r=document.createElementNS("http://www.w3.org/2000/svg","svg");r.classList.add("audio-waveform-bars"),r.setAttributeNS(null,"width",""+o),r.setAttributeNS(null,"height",""+i),r.setAttributeNS(null,"viewBox",`0 0 ${o} ${i}`);const d=Math.max(...e),l=e.length?e.length:100,c=Math.min(o/4|0,l);let h=0;const u=i-4;let p="";for(let t=0,s=0,n=0;t=l){n=n+c-l,n<(c+1)/2&&h\n `,s+=4,h=n<(c+1)/2?0:a}else h{let t=e.audio;const i=()=>{c.style.width=t.currentTime/t.duration*100+"%"};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&i();const s=(0,v.Z)(i);return e.addAudioListener("timeupdate",s),e.addAudioListener("ended",s),e.addAudioListener("play",(()=>{(0,w.cK)((()=>!!t&&(i(),!t.paused)),e)})),e.readyPromise.then((()=>{let e=!1,i=!1;function s(e){let i;if(e instanceof MouseEvent)i=e.offsetX;else{const t=e.target.getBoundingClientRect();i=e.targetTouches[0].pageX-t.left}const s=i/r*t.duration;t.currentTime=s}f.addEventListener("mouseleave",(s=>{e&&(t.play(),e=!1),i=!1})),f.addEventListener("mousemove",(t=>{i=!0,e&&s(t)})),f.addEventListener("mousedown",(i=>{i.preventDefault(),0===i.button&&(t.paused||t.pause(),s(i),e=!0)})),f.addEventListener("mouseup",(s=>{i&&e&&(t.play(),e=!1)})),(0,l.fc)(f,(e=>{(0,d.Z)(e),t.paused||s(e)}))}),u.Z),()=>{f.remove(),f=null,t=null}}}))}(this):function(e){var t;return x(this,void 0,void 0,(function*(){const i=e.withTime,s=e.message,n=(0,Z.Z)(s),a="voice"===n.type||"round"===n.type,o=document.createElement("div");o.classList.add("audio-description");const r=n.attributes.find((e=>"documentAttributeAudio"===e._));if(!a){const t=[];(null==r?void 0:r.performer)&&t.push((0,I.Z)(r.performer)),i?t.push((0,g.OD)(s.date)):t.length||t.push((0,y.Z)(n.size)),e.showSender&&t.push(yield(0,M.Z)(s)),o.append(...(0,f.A1)(t," • "))}e.insertAdjacentHTML("beforeend",'\n
\n
\n
\n
');const d=e.querySelector(".audio-title"),l=new m.I;l.dataset.fontWeight=e.dataset.fontWeight,l.dataset.fontSize=e.dataset.fontSize,l.dataset.sizeType=e.dataset.sizeType,a?l.append(yield(0,M.Z)(s)):(0,E.Z)(l,(0,I.Z)(null!==(t=null==r?void 0:r.title)&&void 0!==t?t:n.file_name)),d.append(l),e.showSender&&d.append((0,P.Z)(s));const c=e.querySelector(".audio-subtitle");return c.append(o),()=>{let t=!1,i=new L.Z(e.audio,n.supportsStreaming);e.addAudioListener("ended",(()=>{e.classList.remove("audio-show-progress"),c.lastChild.replaceWith(o),t=!1}));const s=()=>{t||(e.classList.add("audio-show-progress"),t=!0,i&&c.lastChild.replaceWith(i.container))};return e.addAudioListener("play",s),(!e.audio.paused||e.audio.currentTime>0)&&s(),()=>{i.removeListeners(),i.container.remove(),i=null}}}))}(this),U=this.querySelector(".audio-time");U.innerHTML=R;const H=this.onLoad=e=>{this.onLoad=void 0;const t=this.audio=n.Z.addMedia(this.message,e),i=this.readyPromise=(0,c.Z)();this.audio.readyState>=this.audio.HAVE_CURRENT_DATA?i.resolve():this.addAudioListener("canplay",(()=>i.resolve()),{once:!0}),this.onTypeDisconnect=O();const s=()=>(0,C.Z)(0|t.currentTime)+(p?" / "+R:""),a=()=>{U.innerText=s(),B.classList.toggle("playing",!t.paused)};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&a();const o=(e,i=t.paused)=>{if(e&&(0,d.Z)(e),i){const e=!!this.searchContext;if(n.Z.setSearchContext(this.searchContext||{peerId:b.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,i]=e?_(this,this.message.mid):[];n.Z.setTargets({peerId:this.message.peerId,mid:this.message.mid},t,i)}t.play().catch((()=>{}))}else t.pause()};return(0,l.fc)(B,(e=>o(e)),{listenerSetter:this.listenerSetter}),this.addAudioListener("ended",(()=>{B.classList.remove("playing"),U.innerText=R})),this.addAudioListener("timeupdate",(()=>{!t.currentTime&&t.paused||n.Z.isSafariBuffering(t)||(U.innerText=s())})),this.addAudioListener("pause",(()=>{B.classList.remove("playing")})),this.addAudioListener("play",a),o};if(null===(t=s.thumbs)||void 0===t?void 0:t.length){const e=[],t=yield(0,T.Z)({photo:s,message:null,container:B,boxWidth:48,boxHeight:48,loadPromises:this.loadPromises,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue});B.style.width=B.style.height="",t.images.thumb&&e.push(t.images.thumb),t.images.full&&e.push(t.images.full),this.classList.add("audio-with-thumb"),e.forEach((e=>e.classList.add("audio-thumb")))}if(F)D&&(this.preloader=A(!1),this.preloader.attachPromise(k.Z.getUpload(D)),this.dataset.isOutgoing="1",this.preloader.attach(N,!1));else{let e=this.preloader;const t="audio"!==s.type;H(t);const a=t=>{if(this.audio.src)return;n.Z.resolveWaitingForLoadMedia(this.message.peerId,this.message.mid,this.message.pFlags.is_scheduled);const i=()=>{t&&(n.Z.willBePlayed(this.audio),o.IS_SAFARI&&!this.audio.autoplay&&(this.audio.autoplay=!0))};if(i(),!e)if(s.supportsStreaming){let e;this.classList.add("corner-download");const t=()=>{const t=A(!1),s=(0,c.Z)();s.notifyAll({done:75,total:100}),s.catch((()=>{this.audio.pause(),n.Z.willBePlayed(void 0)})),s.cancel=()=>{s.cancel=u.Z;const e=new Error;e.type="CANCELED",s.reject(e)},t.attach(N,!1,s),e=this.addAudioListener("pause",(()=>{s.cancel()}),{once:!0}),i()},s=this.addAudioListener("play",t);this.readyPromise.then((()=>{this.listenerSetter.remove(s),this.listenerSetter.remove(e)}))}else{e=A(),t||(this.readyPromise=(0,c.Z)());const n=()=>{i();const n=k.Z.downloadMediaURL({media:s});return t||n.then((()=>{this.readyPromise.resolve()})),e.attach(N,!1,n),{download:n}};e.setDownloadFunction(n),n()}this.classList.contains("corner-download")?B.append(N):this.append(N),this.classList.add("downloading"),this.readyPromise.then((()=>{this.classList.remove("downloading"),N.classList.add("downloaded"),setTimeout((()=>{N.remove()}),200),n.Z.willBePlayedMedia===this.audio&&(this.audio.play(),n.Z.willBePlayed(void 0))}))};(null===(i=this.audio)||void 0===i?void 0:i.src)||(t?a(!1):(0,l.fc)(B,(()=>{a(!0)}),{once:!0,capture:!0,passive:!1,listenerSetter:this.listenerSetter}))}}))}get addAudioListener(){return this.listenerSetter.add(this.audio)}disconnectedCallback(){setTimeout((()=>{this.isConnected||(this.onTypeDisconnect&&(this.onTypeDisconnect(),this.onTypeDisconnect=null),this.readyPromise&&this.readyPromise.reject(),this.listenerSetter&&(this.listenerSetter.removeAll(),this.listenerSetter=null),this.preloader&&(this.preloader=null))}),100)}}customElements.define("audio-element",F)},9331:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L,C:()=>y});var s=i(3512),n=i(2738),a=i(3910),o=i(1784),r=i(6074);class d extends r.Z{constructor(e){super(Object.assign(Object.assign({},e),{loadMore:(e,t,i)=>{if(this.peerId.isAnyChat()||!t)return Promise.resolve({count:0,items:[]});const s=null==e?void 0:e.photoId;return this.managers.appPhotosManager.getUserPhotos(this.peerId,s,i).then((e=>{const t=e.photos.map((e=>({element:null,photoId:e})));return{count:e.count,items:t}}))}})),this.loadedAllUp=!0,this.peerId=e.peerId}}var l=i(2312),c=i(4271),h=i(5824),u=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class p extends h.Z{constructor(e){super(new d({peerId:e,managers:s.Z.managers}),[]),this.onPrevClick=e=>{this.openMedia(e.photoId,e.element,-1)},this.onNextClick=e=>{this.openMedia(e.photoId,e.element,1)},this.onDownloadClick=()=>u(this,void 0,void 0,(function*(){l.Z.downloadToDisc({media:yield this.managers.appPhotosManager.getPhoto(this.target.photoId),queueId:c.Z.chat.bubbles.lazyLoadQueue.queueId})})),this.peerId=e,this.setBtnMenuToggle([{icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick}]),this.setListeners()}openMedia(e,t,i=0,s,n){const a=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return u(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const o=yield this.managers.appPhotosManager.getPhoto(e),r=a._openMedia.call(this,o,o.date,this.peerId,i,t,!1,s,n);return this.target.photoId=o.id,r}))}}var f=i(5880),m=i(9931),g=i(3624),v=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const b=({peerId:e,threadId:t})=>{let i='avatar-element[data-peer-id="'+e+'"]';t&&(i+='[data-thread-id="'+t+'"]'),Array.from(document.querySelectorAll(i)).forEach((e=>{e.update()}))};function y(e,t,i,n,a,r){return v(this,void 0,void 0,(function*(){let d=yield s.Z.managers.appProfileManager.getFullPhoto(t);if(!i()||!d)return;const l=()=>Array.from(e.querySelectorAll("img")).find((e=>!e.classList.contains("emoji")))?e:null;if(t.isAnyChat()){const e=!!n,c="inputMessagesFilterChatPhotos";if(!n&&(n=yield s.Z.managers.appMessagesManager.getSearch({peerId:t,inputFilter:{_:c},maxId:0,limit:1}).then((e=>e.history[0])),!i()))return;if(n){n.action.photo.id!==d.id&&(e||(n=s.Z.managers.appMessagesManager.generateFakeAvatarMessage(t,d)));const i=e=>e.map((e=>({element:e.element,mid:e.item.mid,peerId:e.item.peerId})));return void(new o.Z).setSearchContext({peerId:t,inputFilter:{_:c}}).openMedia(n,l(),void 0,void 0,a?i(a):void 0,r?i(r):void 0)}}if(d){!(0,f.Z)(n)&&n&&(d=yield s.Z.managers.appPhotosManager.getPhoto(n));const e=e=>e.map((e=>({element:e.element,photoId:e.item})));new p(t).openMedia(d.id,l(),void 0,a?e(a):void 0,r?e(r):void 0)}}))}s.Z.addEventListener("avatar_update",b),s.Z.addEventListener("peer_title_edit",(e=>v(void 0,void 0,void 0,(function*(){(yield s.Z.managers.appAvatarsManager.isAvatarCached(e.peerId))||b(e)}))));const w=new Map,S=new Set;function C(e,t){return e+(t?"_"+t:"")}class L extends HTMLElement{constructor(){super(),this.addedToQueue=!1,this.classList.add("avatar-like"),this.middlewareHelper=(0,g.k)()}disconnectedCallback(){var e;const t=C(this.peerId,this.threadId),i=w.get(t);(null==i?void 0:i.has(this))&&(i.delete(this),i.size||w.delete(t)),null===(e=this.lazyLoadQueue)||void 0===e||e.delete({div:this})}attachClickEvent(){let e=!1;(0,n.fc)(this,(t=>v(this,void 0,void 0,(function*(){if((0,a.Z)(t),e)return;const i=this.peerId;e=!0,yield y(this,this.peerId,(()=>this.peerId===i)),e=!1}))))}updateOptions(e){for(const t in e)this[t]=e[t]}updateWithOptions(e){var t;const i=this.peerId,s=this.threadId;this.updateOptions(e);const n=this.peerId,a=this.threadId;if(i===n&&s===a)return;if(this.dataset.peerId=""+n,a?this.dataset.threadId=""+a:s&&delete this.dataset.threadId,i){const e=C(i,s),t=w.get(e);t&&(t.delete(this),t.size||w.delete(e))}const o=null===(t=e.wrapOptions)||void 0===t?void 0:t.middleware;return this.middlewareHelper.destroy(),o?this.middlewareHelper=o.create():this.middlewareHelper.destroy(),this.update()}remove(){this.middlewareHelper.destroy(),super.remove()}r(e=!1){const t=(0,m.Z)({div:this,peerId:this.peerId,isDialog:this.isDialog,title:this.peerTitle,onlyThumb:e,isBig:this.isBig,threadId:this.threadId,wrapOptions:Object.assign({middleware:this.middlewareHelper.get()},this.wrapOptions||{})});return this.loadPromises&&(this.loadPromises.push(t),t.finally((()=>{this.loadPromises=void 0}))),t}update(){if(this.lazyLoadQueue){if(!S.has(this.peerId)){if(this.addedToQueue)return;this.addedToQueue=!0;const e=C(this.peerId,this.threadId);let t=w.get(e);return t||w.set(e,t=new Set),t.add(this),this.lazyLoadQueue.push({div:this,load:()=>(S.add(this.peerId),this.update())}),this.r(!0)}this.addedToQueue&&this.lazyLoadQueue.delete({div:this})}S.add(this.peerId);const e=this.r();this.addedToQueue&&e.finally((()=>{this.addedToQueue=!1}));const t=C(this.peerId,this.threadId),i=w.get(t);if(i){i.delete(this);const e=Array.from(i);w.delete(t);for(let t=0,i=e.length;t{"use strict";i.d(t,{Z:()=>o});var s=i(2738),n=i(1168),a=i(6765);class o{constructor(e,t){this.container=document.createElement("div"),this.container.classList.add("avatar-edit"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("avatar-edit-canvas"),this.icon=document.createElement("span"),this.icon.classList.add("tgico","tgico-cameraadd"),this.container.append(this.canvas,this.icon),(0,s.fc)(this.container,(()=>{n.Z.createPopup(a.Z,t).open(this.canvas,e)}))}clear(){this.canvas.getContext("2d").clearRect(0,0,this.canvas.width,this.canvas.height)}}},4494:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(2325),n=i(1405);function a(e,t={}){const i=document.createElement(t.asLink?"a":t.asDiv?"div":"button");return i.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&i.classList.add("rp-square"),(0,n.Z)(i)),t.onlyMobile&&i.classList.add("only-handhelds"),t.disabled&&i.setAttribute("disabled","true"),t.text&&i.append((0,s.ag)(t.text)),i}},8119:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4494);const n=(e={})=>(0,s.Z)("btn-circle btn-corner z-depth-1"+(e.className?" "+e.className:""),e)},2230:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4494);const n=(e,t={})=>(0,s.Z)("btn-icon",Object.assign({icon:e||void 0},t))},3003:(e,t,i)=>{"use strict";i.d(t,{Z:()=>m,b:()=>f});var s=i(7238),n=i(3416),a=i(3910),o=i(2738),r=i(8497),d=i(130),l=i(2325),c=i(9492),h=i(8812),u=i(8222);function p(e){if(e.element)return[e.separator,e.element].filter(Boolean);const{icon:t,iconDoc:i,text:s,onClick:p,checkboxField:f,noCheckboxClickListener:m}=e,g=document.createElement("div");g.className="btn-menu-item rp-overflow"+(t?" tgico-"+t:"");let v=e.textElement;if(v||(v=e.textElement=s?(0,l.ag)(s,e.textArgs):document.createElement("span"),e.regularText&&(0,d.Z)(v,e.regularText)),i){const t=document.createElement("span");t.classList.add("btn-menu-item-icon"),g.append(t),e.loadPromise=(0,c.Z)({container:t,photo:i,boxWidth:24,boxHeight:24,withoutPreloader:!0,noFadeIn:!0,noBlur:!0,processUrl:e=>fetch(e).then((e=>e.text())).then((e=>{const t=u.Z.getProperty("primary-text-color"),i=(new DOMParser).parseFromString(e,"image/svg+xml").firstElementChild;return i.querySelectorAll("path").forEach((e=>{e.setAttributeNS(null,"fill",t),e.style.stroke=t,e.style.strokeWidth=".25px"})),(0,h.Z)(i.outerHTML)}))}).then((e=>e.loadPromises.thumb))}v.classList.add("btn-menu-item-text"),g.append(v);const b=!!f||!!e.keepOpen;return p&&(0,o.fc)(g,(e=>{(0,a.Z)(e);const t=(0,r.Z)(e.target,"btn-menu");t&&!t.classList.contains("active")||!1!==p(e)&&(b||n.Z.close(),f&&!m&&(f.checked="radio"===f.input.type||!f.checked))}),e.options),f&&g.append(f.label),!0===e.separator&&(e.separator=document.createElement("hr")),e.multiline&&g.classList.add("is-multiline"),[e.separator,e.element=g].filter(Boolean)}function f({listenerSetter:e,buttons:t}){const i=document.createElement("div");i.classList.add("btn-menu"),e&&t.forEach((t=>{t.options?t.options.listenerSetter=e:t.options={listenerSetter:e}}));const n=t.map(p);return i.append(...(0,s.Z)(n)),i}function m(e){return t=this,i=void 0,n=function*(){const t=f(e);return yield Promise.all(e.buttons.map((({loadPromise:e})=>e))),t},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}},5322:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,v:()=>h});var s=i(3416),n=i(3910),a=i(2738),o=i(3699),r=i(2230),d=i(3003),l=i(2353),c=i(3035);function h({el:e,onOpen:t,options:i,onClose:o}){((null==i?void 0:i.listenerSetter)?i.listenerSetter.add(e):e.addEventListener.bind(e))(a.pf,(i=>{if(!e.classList.contains("btn-menu-toggle"))return!1;if((0,n.Z)(i),e.classList.contains("menu-open"))s.Z.close();else{const n=null==t?void 0:t(i),a=()=>{const t=e.querySelector(".btn-menu");s.Z.openBtnMenu(t,o)};n instanceof Promise?n.then(a):a()}}))}function u({buttonOptions:e,listenerSetter:t,container:i,direction:s,buttons:n,onOpenBefore:a,onOpen:u,onClose:p,onCloseAfter:f}){e&&(e.asDiv=!0);const m=null!=i?i:(0,r.Z)("more",e);m.classList.add("btn-menu-toggle");const g=new o.Z;let v,b;return h({el:m,onOpen:e=>{return t=this,i=void 0,r=function*(){if(yield null==a?void 0:a(e),b)return clearTimeout(b),void(b=void 0);const t=yield(i=n,(0,l.Z)(i,(e=>{var t,i;return null===(i=null===(t=null==e?void 0:e.verify)||void 0===t?void 0:t.call(e))||void 0===i||i})));var i;if(!t.length)return;const o=v=yield(0,d.Z)({buttons:t,listenerSetter:g});o.classList.add(s),yield null==u?void 0:u(e,o),m.append(o),yield(0,c.d1)()},new((o=void 0)||(o=Promise))((function(e,s){function n(e){try{d(r.next(e))}catch(e){s(e)}}function a(e){try{d(r.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,a)}d((r=r.apply(t,i||[])).next())}));var t,i,o,r},options:{listenerSetter:t},onClose:()=>{null==p||p(),b=window.setTimeout((()=>{null==f||f(),b=void 0,g.removeAll(),n.forEach((e=>e.element=void 0)),v.remove()}),300)}}),m}},1571:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(5296),n=i(2064);class a{constructor(){this._width=50,this._height=50,this._tails=90,this._scrollTails=50,this._curve=[0,.25,.5,.75,1,1.5,2,2.5,3,3.5,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,18.3,18.6,18.9,19.2,19.5,19.8,20.1,20.4,20.7,21,21.3,21.6,21.9,22.2,22.5,22.8,23.1,23.4,23.7,24,24.3,24.6,24.9,25.2,25.5,25.8,26.1,26.3,26.4,26.5,26.6,26.7,26.8,26.9,27],this._positions=[{x:.8,y:.1},{x:.6,y:.2},{x:.35,y:.25},{x:.25,y:.6},{x:.2,y:.9},{x:.4,y:.8},{x:.65,y:.75},{x:.75,y:.4}],this._phases=this._positions.length,this.onWheel=e=>{this._animatingToNextPosition||(this._scrollDelta+=e.deltaY,void 0===this._onWheelRAF&&(this._onWheelRAF=requestAnimationFrame(this.drawOnWheel)))},this.drawOnWheel=()=>{const e=this._scrollDelta/this._scrollTails;this._scrollDelta%=this._scrollTails;const t=e>0?Math.floor(e):Math.ceil(e);t&&this.changeTailAndDraw(t),this._onWheelRAF=void 0},this.drawNextPositionAnimated=e=>{var t;let i,s;if(e){const s=e();i=s>=1;const a=-1*(n=s)*(n-2),o=null!==(t=this._nextPositionTail)&&void 0!==t?t:0,r=(this._nextPositionTail=this._nextPositionTails*a)-o;r&&(this._nextPositionLeft-=r,this.changeTailAndDraw(r))}else{const e=this._frames;s=e.shift(),i=!e.length}var n;return s&&this.drawImageData(s),i&&(this._nextPositionLeft=void 0,this._nextPositionTails=void 0,this._nextPositionTail=void 0,this._animatingToNextPosition=void 0),!i};const e=this._tails/this._curve[this._curve.length-1];for(let t=0,i=this._curve.length;t{var s;return e-(null!==(s=i[t-1])&&void 0!==s?s:0)}))}hexToRgb(e){const t=(0,n.oo)(e);return{r:t[0],g:t[1],b:t[2]}}getPositions(e){const t=this._positions.slice();t.push(...t.splice(0,e));const i=[];for(let e=0;e({x:(e.x-s[i].x)/t,y:(e.y-s[i].y)/t})));return i.map((e=>n.map(((t,i)=>({x:s[i].x+t.x*e,y:s[i].y+t.y*e})))))}curPosition(e,t){return this.getNextPositions(e,this._tails,[t])[0]}changeTail(e){for(this._tail+=e;this._tail>=this._tails;)this._tail-=this._tails,++this._phase>=this._phases&&(this._phase-=this._phases);for(;this._tail<0;)this._tail+=this._tails,--this._phase<0&&(this._phase+=this._phases)}changeTailAndDraw(e){this.changeTail(e);const t=this.curPosition(this._phase,this._tail);this.drawGradient(t)}getGradientImageData(e){const t=this._hctx.createImageData(this._width,this._height),i=t.data;let s=0;for(let t=0;tthis.hexToRgb(e))),this._hc||(this._hc=document.createElement("canvas"),this._hc.width=this._width,this._hc.height=this._height,this._hctx=this._hc.getContext("2d",{alpha:!1})),this._canvas=e,this._ctx=this._canvas.getContext("2d",{alpha:!1}),this.update()}update(){if(this._colors.length<2){const e=this._colors[0];return this._ctx.fillStyle=`rgb(${e.r}, ${e.g}, ${e.b})`,void this._ctx.fillRect(0,0,this._width,this._height)}const e=this.curPosition(this._phase,this._tail);this.drawGradient(e)}toNextPosition(e){var t,i;if(this._colors.length<2)return;if(e)return this._nextPositionLeft=this._tails+(null!==(t=this._nextPositionLeft)&&void 0!==t?t:0),this._nextPositionTails=this._nextPositionLeft,this._nextPositionTail=void 0,this._animatingToNextPosition=!0,void(0,s.cK)(this.drawNextPositionAnimated.bind(this,e),this);const n=this._tail,a=this._tails;let o;const r=[];for(let e=0,t=this._incrementalCurve.length;ea&&void 0===o&&(o=e,s%=a),r.push(s)}[r.slice(0,o),void 0!==o?r.slice(o):[]].forEach(((e,t,i)=>{const s=e[e.length-1];if(void 0!==s&&s>a&&(e[e.length-1]=+s.toFixed(2)),this._tail=null!=s?s:0,!e.length)return;const n=this.getNextPositions(this._phase,a,e);t!==i.length-1&&++this._phase>=this._phases&&(this._phase-=this._phases);const o=n.map((e=>this.getGradientImageData(e)));this._frames.push(...o)})),this._animatingToNextPosition=!0,(0,s.cK)(this.drawNextPositionAnimated,this)}scrollAnimate(e){}cleanup(){this.scrollAnimate(!1)}static createCanvas(e){const t=document.createElement("canvas");return t.width=50,t.height=50,void 0!==e&&(t.dataset.colors=e),t}static create(e){const t=this.createCanvas(e),i=new a;return i.init(t),{gradientRenderer:i,canvas:t}}}},6054:(e,t,i)=>{"use strict";i.d(t,{e:()=>T,Z:()=>x});var s=i(5432),n=i(4494),a=i(2230),o=i(9807),r=i(5128),d=i(4524),l=i(9099),c=i(1962),h=i(6385),u=i(4762),p=i(2325),f=i(8497),m=i(8799),g=i(3910),v=i(6760),b=i(5565),y=i(8487),w=i(144),S=i(2738),C=i(5975),L=i(3241),E=i(5953),I=i(6976),M=(i(6690),i(4271)),P=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Z=e=>[...e.values()].reduce(((e,t)=>e+t.size),0);class k extends L.Z{constructor(e){super(!1),this.selectedMids=new Map,this.isSelecting=!1,this.onMouseDown=e=>{const t=(0,f.Z)(e.target,this.targetLookupClassName);if(0!==e.button)return;if(this.verifyTarget&&!this.verifyTarget(e,t))return;const i=new Map;let s,n=t;const a=(e,t=!0)=>{const o=+e.dataset.mid;if(!o||!e.dataset.peerId)return;const r=e.dataset.peerId.toPeerId();(0,y.Z)(n)||(n=e);let d=i.get(r);if(d||i.set(r,d=new Set),d.has(o))return;const l=this.isMidSelected(r,o);if(void 0===s&&(s=!l),d.add(o),s&&!l||!s&&l){const s=Z(i);if(this.toggleByElement&&t){s<2&&(0,C.Z)(e,n)&&(n=e);const t=this.getElementsBetween(n,e);t.length&&t.forEach((e=>{a(e,!1)}))}if(this.selectedMids.size)this.toggleByElement&&this.toggleByElement(e);else if(2===s&&this.toggleByMid)for(const[e,t]of i)for(const i of t)this.toggleByMid(e,i)}};let o=!1;const r=e=>{o||((0,v.Z)(),o=!0);const t=this.getElementFromTarget(e.target);if(t)return this.verifyMouseMoveTarget&&!this.verifyMouseMoveTarget(e,t,s)?(this.listenerSetter.removeManual(this.listenElement,"mousemove",r),void this.listenerSetter.removeManual(document,"mouseup",d,l)):void a(t)},d=e=>{i.size&&(0,S.fc)(window,g.Z,{capture:!0,once:!0,passive:!1}),this.listenerSetter.removeManual(this.listenElement,"mousemove",r),(0,v.Z)()},l={once:!0};this.listenerSetter.add(this.listenElement)("mousemove",r),this.listenerSetter.add(document)("mouseup",d,l)},this.getElementsBetween=(e,t)=>{if(e===t)return[];const i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),n=(i.top-s.top||i.left-s.left)<0,a=(0,f.Z)(e,this.lookupBetweenParentClassName);if(!a)return[];const o=Array.from(a.querySelectorAll(this.lookupBetweenElementsQuery));let r=o.indexOf(e),d=o.indexOf(t);return n||([d,r]=[r,d]),o.slice(r+1,d)},this.cancelSelection=e=>P(this,void 0,void 0,(function*(){e&&(this.doNotAnimate=!0),this.onCancelSelection&&(yield this.onCancelSelection()),this.selectedMids.clear(),this.toggleSelection(),(0,v.Z)(),e&&(this.doNotAnimate=void 0)})),(0,E.Z)(this,e),this.navigationType="multiselect-"+(0,w.a)()}attachListeners(e,t){if(this.listenElement&&this.listenerSetter.removeAll(),this.listenElement=e,this.listenerSetter=t,e)return s.Z?(t.add(e)("touchend",(()=>{this.isSelecting&&(this.selectedText=window.getSelection?window.getSelection().toString():document.selection?document.selection.createRange().text:"")})),void(0,I.E)(e,(t=>{if(this.isSelecting||this.verifyTouchLongPress&&!this.verifyTouchLongPress())return;document.body.classList.add("no-select"),e.addEventListener("touchend",(e=>{(0,g.Z)(e),document.body.classList.remove("no-select")}),{once:!0,capture:!0}),(0,v.Z)();const i=this.getElementFromTarget(t.target);i&&this.toggleByElement(i)}),t)):void t.add(e)("mousedown",this.onMouseDown)}isElementShouldBeSelected(e){return this.isMidSelected(e.dataset.peerId.toPeerId(),+e.dataset.mid)}appendCheckbox(e,t){e.prepend(t.label)}toggleElementCheckbox(e,t){const i=!!this.getCheckboxInputFromElement(e);if(t){if(i)return!1;const t=new o.Z({name:e.dataset.mid,round:!0});this.isSelecting&&this.isElementShouldBeSelected(e)&&(t.input.checked=!0,e.classList.add("is-selected")),this.appendCheckbox(e,t)}else i&&(this.getCheckboxInputFromElement(e).parentElement.remove(),(0,l.Z)({element:e,className:"is-selected",forwards:!1,duration:200}));return!0}getCheckboxInputFromElement(e){var t;return"LABEL"===(null===(t=e.firstElementChild)||void 0===t?void 0:t.tagName)&&e.firstElementChild.firstElementChild}updateContainer(e=!1){var t;return P(this,void 0,void 0,(function*(){const i=this.selectedMids.size;if(!i&&!e)return;let s=!i,n=!i;const a=!i;for(const[e,t]of this.selectedMids){const i=`${e}_${this.isScheduled?"scheduled":"history"}`,a=yield this.managers.appMessagesManager.cantForwardDeleteMids(i,Array.from(t));if(s=a.cantForward,n=a.cantDelete,s&&n)break}null===(t=this.onUpdateContainer)||void 0===t||t.call(this,s,n,a)}))}toggleSelection(e=!0,t=!1){var i;const n=this.isSelecting,a=this.selectedMids.size;if(this.isSelecting=!!a||t,n===this.isSelecting)return!1;this.dispatchEvent("toggle",this.isSelecting),s.Z||(this.listenElement.classList.toggle("no-select",this.isSelecting),n&&(0,v.Z)()),(0,m.Z)();const o=!!a||t,r=null===(i=this.onToggleSelection)||void 0===i?void 0:i.call(this,o,!this.doNotAnimate);return u.IS_MOBILE_SAFARI||(o?h.Z.pushItem({type:this.navigationType,onPop:()=>{this.cancelSelection()}}):h.Z.removeByType(this.navigationType)),t&&(r||Promise.resolve()).then((()=>this.updateContainer(t))),!0}cleanup(){this.doNotAnimate=!0,this.selectedMids.clear(),this.toggleSelection(!1),this.doNotAnimate=void 0}updateElementSelection(e,t){this.toggleElementCheckbox(e,!0),this.getCheckboxInputFromElement(e).checked=t,this.toggleSelection(),this.updateContainer(),(0,l.Z)({element:e,className:"is-selected",forwards:t,duration:200})}isMidSelected(e,t){const i=this.selectedMids.get(e);return null==i?void 0:i.has(t)}length(){return Z(this.selectedMids)}toggleMid(e,t,i){let s=this.selectedMids.get(e);return i||void 0===i&&(null==s?void 0:s.has(t))?s&&(s.delete(t),s.size||this.selectedMids.delete(e)):(s||(s=new Set,this.selectedMids.set(e,s)),s.add(t)),!0}deleteSelectedMids(e,t){const i=this.selectedMids.get(e);i&&(t.forEach((e=>{i.delete(e)})),i.size||this.selectedMids.delete(e),this.updateContainer(),this.toggleSelection())}}class T extends k{constructor(e,t,i){super({managers:t,verifyTarget:(e,t)=>!!t&&this.isSelecting,getElementFromTarget:e=>(0,f.Z)(e,"search-super-item"),targetLookupClassName:"search-super-item",lookupBetweenParentClassName:"tabs-tab",lookupBetweenElementsQuery:".search-super-item"}),this.searchSuper=e,this.toggleByElement=e=>{const t=+e.dataset.mid,i=e.dataset.peerId.toPeerId();this.toggleMid(i,t)&&this.updateElementSelection(e,this.isMidSelected(i,t))},this.toggleByMid=(e,t)=>{const i=this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id="${e}"][data-mid="${t}"]`);this.toggleByElement(i)},this.onUpdateContainer=(e,t,i)=>{const s=this.length();(0,b.Z)(this.selectionCountEl,(0,p.ag)("messages",[s])),this.selectionGotoBtn.classList.toggle("hide",1!==s),this.selectionForwardBtn.classList.toggle("hide",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.classList.toggle("hide",t)},this.onToggleSelection=(e,t)=>{if((0,l.Z)({element:this.searchSuper.navScrollableContainer,className:"is-selecting",forwards:e,duration:t?200:0,onTransitionEnd:()=>{this.isSelecting||(this.selectionContainer.remove(),this.selectionContainer=this.selectionForwardBtn=this.selectionDeleteBtn=null,this.selectedText=void 0)}}),(0,l.Z)({element:this.searchSuper.container,className:"is-selecting",forwards:e,duration:200}),this.isSelecting&&!this.selectionContainer){const e="search-super-selection";this.selectionContainer=document.createElement("div"),this.selectionContainer.classList.add(e+"-container");const t=(0,a.Z)(`close ${e}-cancel`,{noRipple:!0});(0,S.fc)(t,(()=>this.cancelSelection()),{listenerSetter:this.listenerSetter,once:!0}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add(e+"-count"),this.selectionGotoBtn=(0,a.Z)(`message ${e}-goto`);const i={listenerSetter:this.listenerSetter};(0,S.fc)(this.selectionGotoBtn,(()=>{const e=[...this.selectedMids.keys()][0],t=[...this.selectedMids.get(e)][0];this.cancelSelection(),M.Z.setInnerPeer({peerId:e,lastMsgId:t})}),i),this.selectionForwardBtn=(0,a.Z)(`forward ${e}-forward`),(0,S.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new d.Z(e,(()=>{this.cancelSelection()}))}),i),this.isPrivate&&(this.selectionDeleteBtn=(0,a.Z)(`delete danger ${e}-delete`),(0,S.fc)(this.selectionDeleteBtn,(()=>{const e=[...this.selectedMids.keys()][0];new r.Z(e,[...this.selectedMids.get(e)],"chat",(()=>{this.cancelSelection()}))}),i)),this.selectionContainer.append(...[t,this.selectionCountEl,this.selectionGotoBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean));const s=this.selectionContainer;s.style.opacity="0",this.searchSuper.navScrollableContainer.append(s),s.offsetLeft,s.style.opacity=""}},this.isPrivate=!e.showSender,this.attachListeners(e.container,i)}toggleSelection(e=!0,t=!1){const i=super.toggleSelection(e,t);return i&&e&&Array.from(this.searchSuper.tabsContainer.querySelectorAll(".search-super-item")).forEach((e=>{this.toggleElementCheckbox(e,this.isSelecting)})),i}}class x extends k{constructor(e,t,i,s){super({managers:s,getElementFromTarget:e=>(0,f.Z)(e,"grouped-item")||(0,f.Z)(e,"bubble"),verifyTarget:(e,t)=>!(!this.selectedMids.size&&!e.target.classList.contains("bubble")&&!e.target.classList.contains("document-selection")&&t),verifyMouseMoveTarget:(e,t,i)=>!(e.target!==t&&!e.target.classList.contains("document-selection")&&void 0===i&&!this.selectedMids.size),verifyTouchLongPress:()=>!this.chat.input.recording,targetLookupClassName:"bubble",lookupBetweenParentClassName:"bubbles-inner",lookupBetweenElementsQuery:".bubble:not(.is-multiple-documents), .grouped-item",isScheduled:"scheduled"===e.type}),this.chat=e,this.bubbles=t,this.input=i,this.toggleByElement=e=>{if(!this.canSelectBubble(e))return;const t=+e.dataset.mid;if(e.classList.contains("is-grouped")){if(!this.isGroupedBubbleSelected(e)){const t=this.selectedMids.get(this.chat.peerId);t&&this.getMidsFromGroupContainer(e).forEach((e=>t.delete(e)))}this.bubbles.getBubbleGroupedItems(e).map(this.toggleByElement)}else if(this.toggleMid(this.chat.peerId,t)){if(e.classList.contains("grouped-item")){const t=(0,f.Z)(e,"bubble"),i=this.isGroupedBubbleSelected(t),s=this.isGroupedMidsSelected(t);(s||i)&&this.updateElementSelection(t,s)}this.updateElementSelection(e,this.isMidSelected(this.chat.peerId,t))}},this.toggleByMid=(e,t)=>P(this,void 0,void 0,(function*(){const e=yield this.bubbles.getMountedBubble(t);e&&this.toggleByElement(e.bubble)})),this.onToggleSelection=(e,t)=>P(this,void 0,void 0,(function*(){const{needTranslateX:i,widthFrom:s,widthTo:o}=yield this.chat.input.center(t);(0,l.Z)({element:this.listenElement,className:"is-selecting",forwards:e,duration:t?200:0,onTransitionEnd:()=>{this.isSelecting||(this.selectionInputWrapper.remove(),this.selectionInputWrapper=this.selectionContainer=this.selectionSendNowBtn=this.selectionForwardBtn=this.selectionDeleteBtn=this.selectionLeft=this.selectionRight=null,this.selectedText=void 0)}});const h=sthis.cancelSelection()),{once:!0,listenerSetter:this.listenerSetter}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add("selection-container-count"),"scheduled"===this.chat.type?(this.selectionSendNowBtn=(0,n.Z)("btn-primary btn-transparent btn-short text-bold selection-container-send",{icon:"send2"}),this.selectionSendNowBtn.append((0,p.ag)("MessageScheduleSend")),(0,S.fc)(this.selectionSendNowBtn,(()=>{new c.Z(this.chat.peerId,[...this.selectedMids.get(this.chat.peerId)],(()=>{this.cancelSelection()}))}),e)):(this.selectionForwardBtn=(0,n.Z)("btn-primary btn-transparent text-bold selection-container-forward",{icon:"forward"}),this.selectionForwardBtn.append((0,p.ag)("Forward")),(0,S.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new d.Z(e,(()=>{this.cancelSelection()}))}),e)),this.selectionDeleteBtn=(0,n.Z)("btn-primary btn-transparent danger text-bold selection-container-delete",{icon:"delete"}),this.selectionDeleteBtn.append((0,p.ag)("Delete")),(0,S.fc)(this.selectionDeleteBtn,(()=>{new r.Z(this.chat.peerId,[...this.selectedMids.get(this.chat.peerId)],this.chat.type,(()=>{this.cancelSelection()}))}),e);const i=this.selectionLeft=document.createElement("div");i.classList.add("selection-container-left"),i.append(t,this.selectionCountEl);const s=this.selectionRight=document.createElement("div");s.classList.add("selection-container-right"),s.append(...[this.selectionSendNowBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean)),void 0!==h&&(i.style.transform=`translateX(${-h}px)`,s.style.transform=`translateX(${h}px)`),this.selectionContainer.append(i,s),this.selectionInputWrapper.style.opacity="0",this.selectionInputWrapper.append(this.selectionContainer),this.input.inputContainer.append(this.selectionInputWrapper),this.selectionInputWrapper.offsetLeft,this.selectionInputWrapper.style.opacity="",i.style.transform="",s.style.transform=""}}else this.selectionLeft&&void 0!==h&&(this.selectionLeft.style.transform=`translateX(-${h}px)`,this.selectionRight.style.transform=`translateX(${h}px)`)})),this.onUpdateContainer=(e,t,i)=>{(0,b.Z)(this.selectionCountEl,(0,p.ag)("messages",[this.length()])),this.selectionSendNowBtn&&this.selectionSendNowBtn.toggleAttribute("disabled",i),this.selectionForwardBtn&&this.selectionForwardBtn.toggleAttribute("disabled",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.toggleAttribute("disabled",t)},this.onCancelSelection=()=>P(this,void 0,void 0,(function*(){}))}appendCheckbox(e,t){t.label.classList.add("bubble-select-checkbox"),e.classList.contains("document-container")?e.querySelector(".document, audio-element").append(t.label):super.appendCheckbox(e,t)}toggleSelection(e=!0,t=!1){const i=super.toggleSelection(e,t);if(i&&e)for(const e in this.bubbles.bubbles){if(this.bubbles.skippedMids.has(+e))continue;const t=this.bubbles.bubbles[e];this.toggleElementCheckbox(t,this.isSelecting)}return i}toggleElementCheckbox(e,t){if(!this.canSelectBubble(e))return;const i=super.toggleElementCheckbox(e,t);return i&&e.classList.contains("is-grouped")&&this.bubbles.getBubbleGroupedItems(e).forEach((e=>this.toggleElementCheckbox(e,t))),i}isElementShouldBeSelected(e){const t=e.classList.contains("is-grouped");return super.isElementShouldBeSelected(e)&&(!t||this.isGroupedMidsSelected(e))}isGroupedBubbleSelected(e){const t=this.getCheckboxInputFromElement(e);return null==t?void 0:t.checked}getMidsFromGroupContainer(e){const t=this.chat.bubbles.getBubbleGroupedItems(e);return t.length||t.push(e),t.map((e=>+e.dataset.mid))}isGroupedMidsSelected(e){const t=this.getMidsFromGroupContainer(e),i=t.filter((e=>this.isMidSelected(this.chat.peerId,e)));return t.length===i.length}getCheckboxInputFromElement(e){return e.classList.contains("document-container")?e.querySelector("label input"):super.getCheckboxInputFromElement(e)}canSelectBubble(e){return!(e.classList.contains("service")||e.classList.contains("is-outgoing")||e.classList.contains("is-error")||e.classList.contains("bubble-first")||e.classList.contains("avoid-selection"))}}},9807:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(1405),n=i(2325),a=i(9750),o=i(3512),r=i(3855);class d{constructor(e={}){const t=this.label=document.createElement("label");t.classList.add("checkbox-field"),e.restriction&&t.classList.add("checkbox-field-restriction"),e.round&&t.classList.add("checkbox-field-round"),e.disabled&&this.toggleDisability(!0),this.listenerSetter=e.listenerSetter;const i=this.input=document.createElement("input");if(i.classList.add("checkbox-field-input"),i.type="checkbox",e.name&&(i.id="input-"+e.name),e.checked&&(i.checked=!0),e.stateKey){let t=!1;const s=()=>{if(!t)return;let s;s=e.stateValues?e.stateValues[i.checked?1:0]:i.checked,o.Z.managers.appStateManager.setByKey(e.stateKey,s)};r.Z.getState().then((i=>{t=!0;const s=(0,a.Z)(i,e.stateKey);let n;n=e.stateValues?1===e.stateValues.indexOf(s):s,this.setValueSilently(n)})),e.listenerSetter?e.listenerSetter.add(i)("change",s):i.addEventListener("change",s)}let d;if(e.text?(d=this.span=document.createElement("span"),d.classList.add("checkbox-caption"),(0,n.$d)(d,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(i),e.toggle){t.classList.add("checkbox-field-toggle");const e=document.createElement("div");e.classList.add("checkbox-toggle"),t.append(e)}else{const e=document.createElement("div");e.classList.add("checkbox-box");const i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.classList.add("checkbox-box-check"),i.setAttributeNS(null,"viewBox","0 0 24 24");const s=document.createElementNS("http://www.w3.org/2000/svg","use");s.setAttributeNS(null,"href","#check"),s.setAttributeNS(null,"x","-1"),i.append(s);const n=document.createElement("div");n.classList.add("checkbox-box-background");const a=document.createElement("div");a.classList.add("checkbox-box-border"),e.append(a,n,i),t.append(e)}d&&t.append(d),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),(0,s.Z)(t,void 0,void 0,!0)):e.withHover&&t.classList.add("hover-effect")}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}toggleDisability(e){return this.label.classList.toggle("checkbox-disabled",e),()=>this.toggleDisability(!e)}}},4489:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(503);class n extends s.ZP{constructor(e){super(Object.assign(e,{plainText:!0})),this.options=e;const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let i=0;this.input.addEventListener("input",(t=>{this.input.classList.remove("error"),this.setLabel();const s=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(s);const n=this.value.length;if(n===e.length)e.onFill(this.value);else if(n===i)return;i=n}))}}},5592:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(1168),n=i(8127);function a(e){return new Promise(((t,i)=>{var a;const{button:o,checkbox:r}=e;o.callback=i=>{t(r||!i?i?!!i.size:void 0:e.checkboxes.map((e=>i.has(e.text))))};const d=(0,s.x)(e.buttons||[o]),l=d.find((e=>e.isCancel));l.callback=()=>{i()},e.buttons=d,null!==(a=e.checkboxes)&&void 0!==a||(e.checkboxes=r&&[r]),new n.Z("popup-confirmation",e).show()}))}},5431:(e,t,i)=>{"use strict";i.d(t,{Z:()=>S});var s=i(9976),n=i(3910),a=i(8497),o=i(4668),r=i(5565),d=i(130),l=i(4789),c=i(144),h=i(2325),u=i(8115),p=i(3512),f=i(671),m=i(503),g=i(8805);let v;const b=()=>{v=h.ZP.countriesList.filter((e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)})).sort(((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name)))};let y=()=>{b(),p.Z.addEventListener("language_change",(()=>{b()}))};const w=new Set(["FT"]);class S extends m.ZP{constructor(e={}){super(Object.assign({label:"Country",name:(0,c.a)()},e)),this.options=e,this.hidePicker=()=>{void 0===this.hideTimeout&&(this.selectWrapper.classList.remove("active"),this.hideTimeout=window.setTimeout((()=>{this.selectWrapper.classList.add("hide"),this.hideTimeout=void 0}),200))},this.selectCountryByTarget=e=>{var t,i;const s=e.querySelector("[data-default-name]").dataset.defaultName,n=e.querySelector(".phone-code"),a=null==n?void 0:n.innerText,o=a&&a.replace(/\D/g,"");(0,r.Z)(this.input,(0,h.ag)(s)),this.simulateInputEvent(),this.lastCountrySelected=v.find((e=>e.default_name===s)),this.lastCountryCodeSelected=o&&this.lastCountrySelected.country_codes.find((e=>e.country_code===o)),null===(i=(t=this.options).onCountryChange)||void 0===i||i.call(t,this.lastCountrySelected,this.lastCountryCodeSelected),this.hidePicker()},y&&(y(),y=void 0),this.liMap=new Map,this.container.classList.add("input-select");const t=this.selectWrapper=document.createElement("div");t.classList.add("select-wrapper","z-depth-3","hide");const i=document.createElement("span");i.classList.add("arrow","arrow-down"),this.container.append(i);const p=document.createElement("ul");t.appendChild(p),new g.ZP(t);let m=()=>{m=null,v.forEach((t=>{if(e.noPhoneCodes&&w.has(t.iso2))return;const i=(0,f.Ml)(t.iso2),n=[];for(let a=0,o=Math.min(t.country_codes.length,e.noPhoneCodes?1:1/0);a{if(0!==e.button)return;const t=(0,o.Z)(e.target,"LI");this.selectCountryByTarget(t)})),this.container.appendChild(t)};m(),this.input.addEventListener("focus",(e=>{m?m():v.forEach((e=>{const t=this.liMap.get(e.iso2);t&&t.forEach((e=>e.style.display=""))})),clearTimeout(this.hideTimeout),this.hideTimeout=void 0,t.classList.remove("hide"),t.offsetWidth,t.classList.add("active"),this.select(),(0,l.Z)({container:(0,a.Z)(this.container,"scrollable-y"),element:this.input,position:"start",margin:4}),setTimeout((()=>{b||(document.addEventListener("mousedown",S,{capture:!0}),b=!0)}),0)}));let b=!1;const S=e=>{(0,a.Z)(e.target,"input-select")||e.target!==this.input&&(this.hidePicker(),document.removeEventListener("mousedown",S,{capture:!0}),b=!1)},C=e=>{const t=e.key;if(e.ctrlKey||"Control"===t)return!1;const i=this.value.toLowerCase(),s=[];v.forEach((e=>{const t=this.liMap.get(e.iso2);if(!t)return;const n=[e.name,e.default_name,e.iso2];n.filter(Boolean).forEach((e=>{const t=e.split(" ").filter((e=>/\w/.test(e))).map((e=>e[0])).join("");t.length>1&&n.push(t)}));const a=!!n.filter(Boolean).find((e=>-1!==e.toLowerCase().indexOf(i)));t.forEach((e=>e.style.display=a?"":"none")),a&&s.push(e)})),0===s.length?v.forEach((e=>{const t=this.liMap.get(e.iso2);t&&t.forEach((e=>e.style.display=""))})):1===s.length&&"Enter"===t&&((0,n.Z)(e),this.selectCountryByTarget(this.liMap.get(s[0].iso2)[0]))};this.input.addEventListener("keyup",C),this.input.addEventListener("keydown",(e=>{"Enter"===e.key&&C(e)})),i.addEventListener("mousedown",(e=>{this.input.matches(":focus")?(this.hidePicker(),this.input.blur()):(e.cancelBubble=!0,e.preventDefault(),this.input.focus())}))}getSelected(){return{country:this.lastCountrySelected,code:this.lastCountryCodeSelected}}selectCountryByIso2(e){this.selectCountryByTarget(this.liMap.get(e)[0])}override(e,t,i){var s,n;(0,r.Z)(this.input,e?(0,h.ag)(e.default_name):i),this.lastCountrySelected=e,this.lastCountryCodeSelected=t,null===(n=(s=this.options).onCountryChange)||void 0===n||n.call(s,this.lastCountrySelected,this.lastCountryCodeSelected)}}},6628:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(4762),n=i(5296),a=i(3228),o=i(5814);class r{constructor(e,t,i){this.width=e,this.height=t,this.multiply=i;const s=this.canvas=document.createElement("canvas"),n=this.dpr=window.devicePixelRatio;s.width=e*n,s.height=t*n,s.classList.add("canvas-thumbnail","canvas-dots"),this.paused=!0,this.autoplay=!0,this.tempId=0,this.context=s.getContext("2d")}prepare(){let e=Math.round(this.width*this.height/(35*(s.IS_MOBILE?2:1)));e*=this.multiply||1,e=Math.min(s.IS_MOBILE?1e3:2200,e),e=Math.round(e);const t=this.dots=new Array(e);for(let i=0;i=.8?1:.5)*this.dpr,a=new Path2D;return a.arc(t,i,n,0,2*Math.PI,!1),{x:t,y:i,opacity:s,radius:n,mOpacity:s,adding:null!=e?e:Math.random()>=.5,counter:0,path:a}}draw(){const{context:e,canvas:t,dots:i}=this;e.clearRect(0,0,t.width,t.height),e.fillStyle="#fff";for(let t=0,s=i.length;t=1&&(i[t]=this.generateDot(s.adding))):s.mOpacity>=1&&(s.adding=!1)}}remove(){this.pause()}pause(){this.paused||(this.paused=!0,++this.tempId)}renderFirstFrame(){this.dots||this.prepare(),this.draw()}play(){if(!this.paused)return;this.paused=!1;const e=++this.tempId;this.dots||this.prepare(),(0,n.jt)((()=>this.tempId===e&&!this.paused&&(this.draw(),!0)))}static create({width:e,height:t,middleware:i,animationGroup:s,multiply:n}){i.onClean((()=>{o.Z.removeAnimationByPlayer(a)}));const a=new r(e,t,n);return a.renderFirstFrame(),o.Z.addAnimation(a,s,a.canvas,!0),a}}},2621:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(187),n=i(9331),a=i(8119),o=i(5953),r=i(1507);class d{constructor(e){this._disabled=!1,this.avatarSize=120,this.isChanged=()=>{if(this.uploadAvatar)return!0;let e=0,t=0,i=0;return this.inputFields.forEach((s=>{s.isValid()&&(s.isChanged()&&++e,s.required&&++i),s.required&&++t})),t===i&&e>0},this.handleChange=()=>{this.nextBtn.classList.toggle("is-visible",this.isChanged())},(0,o.Z)(this,e),this.peerId||(this.peerId=r.NM),this.nextBtn?this.nextBtn.classList.contains("btn-corner")||(this.handleChange=()=>{this.nextBtn.toggleAttribute("disabled",!this.isChanged()||this.disabled)}):this.nextBtn=(0,a.Z)({icon:"check"}),e.withoutAvatar||(this.avatarElem=new n.Z,this.avatarElem.classList.add("avatar-placeholder","avatar-"+this.avatarSize),this.avatarElem.updateWithOptions({peerId:this.peerId}),e.doNotEditAvatar||(this.avatarEdit=new s.Z((e=>{this.uploadAvatar=e,this.handleChange(),this.avatarElem.remove()}),e.popupOptions),this.avatarEdit.container.append(this.avatarElem))),this.inputFields.forEach((e=>{this.listenerSetter.add(e.input)("input",this.handleChange)})),this.handleChange()}get disabled(){return this._disabled}set disabled(e){this._disabled=e,this.inputFields.forEach((t=>t.input.toggleAttribute("disabled",e))),this.handleChange()}lockWithPromise(e,t=!1){this.disabled=!0,e.then((()=>{t&&(this.disabled=!1)}),(()=>{this.disabled=!1}))}}},3173:(e,t,i)=>{"use strict";i.d(t,{Yd:()=>Y,Jo:()=>J,ZP:()=>te});var s=i(5432),n=i(4271),a=i(3512),o=i(5814),r=i(6008),d=i(2153),l=i(4332),c=i(5117),h=i(6039),u=i(1080),p=i(8805),f=i(279),m=i(2738);class g{constructor(e){this.managers=e}init(){this.content=document.getElementById("content-gifs");const e=this.content.firstElementChild;(0,m.fc)(e,J.onMediaClick);const t=this.scrollable=new p.ZP(this.content,"GIFS"),i=new u.Z(e,Y,t),s=(0,f.y)(this.content,!0);this.managers.appDocsManager.getGifs().then((e=>{e.forEach((e=>{i.add(e)})),s.remove()})),te.addLazyLoadQueueRepeat(i.lazyLoadQueue,i.processInvisibleDiv),this.init=null}onClose(){}}var v=i(6057),b=i(410),y=i(3552),w=i(3607),S=i(4755),C=i(8497),L=i(1507),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const I="GIFS-SEARCH";class M extends y._{constructor(){super(...arguments),this.nextOffset="",this.loadedAll=!1,this.onGifsClick=e=>E(this,void 0,void 0,(function*(){const t=(0,C.Z)(e.target,"gif");if(!t)return;const i=t.dataset.docId;(yield n.Z.chat.input.sendMessageWithDocument(i))?S.Z.isMobile&&l.ZP.onCloseBtnClick():console.warn("got no doc by id:",i)}))}init(){this.container.id="search-gifs-container",this.inputSearch=new w.Z("SearchGifsTitle",(e=>{this.reset(),this.search(e)})),this.title.replaceWith(this.inputSearch.container),this.gifsDiv=document.createElement("div"),this.gifsDiv.classList.add("gifs-masonry"),(0,m.fc)(this.gifsDiv,this.onGifsClick,{listenerSetter:this.listenerSetter}),this.scrollable.append(this.gifsDiv),this.masonry=new u.Z(this.gifsDiv,I,this.scrollable),l.ZP.toggleSidebar(!0).then((()=>{this.search("",!0),this.scrollable.onScrolledBottom=()=>{this.search(this.inputSearch.value,!1)}}))}onClose(){this.scrollable.onScrolledBottom=()=>{}}onCloseAfterTimeout(){return this.reset(),this.gifsDiv.innerHTML="",o.Z.checkAnimations(void 0,I),this.inputSearch.remove(),super.onCloseAfterTimeout()}reset(){this.searchPromise=null,this.nextOffset="",this.loadedAll=!1,this.masonry.clear()}search(e,t=!0){return E(this,void 0,void 0,(function*(){if(!this.searchPromise&&!this.loadedAll){this.gifBotPeerId||(this.gifBotPeerId=(yield this.managers.appUsersManager.resolveUsername("gif")).id.toPeerId(!1));try{this.searchPromise=this.managers.appInlineBotsManager.getInlineResults(L.NM,this.gifBotPeerId,e,this.nextOffset);const{results:i,next_offset:s}=yield this.searchPromise;if(this.inputSearch.value!==e)return;this.searchPromise=null,this.nextOffset=s,t&&(this.gifsDiv.innerHTML=""),i.length?i.forEach((e=>{"botInlineMediaResult"===e._&&e.document&&this.masonry.add(e.document)})):this.loadedAll=!0,this.scrollable.onScroll()}catch(e){throw this.searchPromise=null,console.error("gifs loading error:",e),e}}}))}}var P=i(6787),Z=i(2325),k=i(7625),T=i(130),x=i(8115),A=i(9259),_=i(3541);class F extends y._{init(){this.container.id="stickers-container",this.container.classList.add("chatlist-container"),this.lazyLoadQueue=new d.Z,this.inputSearch=new w.Z("StickersTab.SearchPlaceholder",(e=>{this.search(e)})),this.title.replaceWith(this.inputSearch.container),this.setsDiv=document.createElement("div"),this.setsDiv.classList.add("sticker-sets"),this.scrollable.append(this.setsDiv),(0,A.Z)({listenTo:this.setsDiv,listenerSetter:this.listenerSetter}),(0,m.fc)(this.setsDiv,(e=>{const t=(0,C.Z)(e.target,"sticker-set-sticker");if(t){const e=t.dataset.docId;return void n.Z.chat.input.sendMessageWithDocument(e)}const i=(0,C.Z)(e.target,"sticker-set");if(!i)return;const s=i.dataset.stickerSet,a=i.dataset.access_hash,o=(0,C.Z)(e.target,"sticker-set-button");o?(e.preventDefault(),e.cancelBubble=!0,o.setAttribute("disabled","true"),this.managers.appStickersManager.getStickerSet({id:s,access_hash:a}).then((e=>{this.managers.appStickersManager.toggleStickerSet(e.set).then((t=>{t&&(o.textContent="",o.append((0,Z.ag)(e.set.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),o.classList.toggle("gray",!!e.set.installed_date))})).finally((()=>{o.removeAttribute("disabled")}))}))):this.managers.appStickersManager.getStickerSet({id:s,access_hash:a}).then((e=>{new P.Z(e.set).show()}))}),{listenerSetter:this.listenerSetter}),l.ZP.toggleSidebar(!0).then((()=>{this.renderFeatured()}))}onCloseAfterTimeout(){return this.setsDiv.innerHTML="",o.Z.checkAnimations(void 0,"STICKERS-SEARCH"),super.onCloseAfterTimeout()}renderSet(e){const t=document.createElement("div");t.classList.add("sticker-set");const i=document.createElement("div");i.classList.add("sticker-set-header");const s=document.createElement("div");s.classList.add("sticker-set-details"),s.innerHTML='
',(0,T.Z)(s.firstElementChild,(0,x.Z)(e.title));const n=document.createElement("div");n.classList.add("sticker-set-count"),n.append((0,Z.ag)("Stickers",[e.count])),s.append(n);const a=document.createElement("button");a.classList.add("btn-primary","btn-color-primary","sticker-set-button"),a.append((0,Z.ag)(e.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),e.installed_date&&a.classList.add("gray"),i.append(s,a);const o=document.createElement("div");o.classList.add("sticker-set-stickers");const r=Math.min(5,e.count);for(let e=0;e{for(let t=0;t{this.inputSearch.value||(e=this.filterRendered("",e)).forEach((e=>{this.renderSet(e.set)}))}))}filterRendered(e,t){t=t.slice();const i=Array.from(this.setsDiv.children);return(0,k.Z)(i,(i=>{const s=i.dataset.stickerSet,n=t.findIndex((e=>e.set.id===s));-1!==n?t.splice(n,1):e&&i.dataset.title.toLowerCase().includes(e.toLowerCase())||i.remove()})),o.Z.checkAnimations(void 0,"STICKERS-SEARCH"),t}search(e){return e?this.managers.appStickersManager.searchStickerSets(e,!1).then((t=>{this.inputSearch.value===e&&(t=this.filterRendered(e,t)).forEach((e=>{this.renderSet(e.set)}))})):this.renderFeatured()}}var D,R=i(4668),B=i(8799),N=i(2648),O=i(3910),U=i(6339),H=i(5418),z=i(4762),j=i(3815),G=i(319),V=i(4789),K=i(6802),W=i.n(K),$=i(669),q=i(3299),Q=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Y="emoticons-dropdown",X={forceDuration:200,transitionFunction:W()(.42,0,.58,1)};class J extends U.Z{constructor(){super({element:document.getElementById("emoji-dropdown"),ignoreOutClickClassName:"input-message-input"}),this.tabId=-1,this.onSelectTabClick=e=>{if(this.tabId!==e)o.Z.checkAnimations(!0,Y),this.tabId=e,this.searchButton.classList.toggle("hide",this.tabId===this.emojiTab.tabId),this.deleteBtn.classList.toggle("hide",this.tabId!==this.emojiTab.tabId);else{const{tab:e}=this;this.scrollTo(e,e.scrollable.container.firstElementChild)}},this.checkRights=()=>Q(this,void 0,void 0,(function*(){const{peerId:e,threadId:t}=n.Z.chat,i=this.tabsEl.children,s=Array.from(i),[a,o]=yield Promise.all([this.managers.appMessagesManager.canSendToPeer(e,t,"send_stickers"),this.managers.appMessagesManager.canSendToPeer(e,t,"send_gifs")]);s[this.stickersTab.tabId+1].toggleAttribute("disabled",!a),s[this.gifsTab.tabId+1].toggleAttribute("disabled",!o);const r=this.tabsEl.querySelector(".active");!r||(0,N.Z)(r)===this.emojiTab.tabId+1||a&&o||this.selectTab(this.emojiTab.tabId,!1)})),this.addEventListener("open",(()=>Q(this,void 0,void 0,(function*(){var e;s.Z&&(0,B.Z)()&&(yield(0,H.Z)(100)),this.element.parentElement!==n.Z.chat.input.chatInput&&n.Z.chat.input.chatInput.append(this.element),this.savedRange=this.getGoodRange(),J.lazyLoadQueue.lock(),o.Z.lockIntersectionGroup(Y);const t=this.tab;null===(e=t.onOpen)||void 0===e||e.call(t)})))),this.addEventListener("opened",(()=>{var e;o.Z.unlockIntersectionGroup(Y),J.lazyLoadQueue.unlockAndRefresh();const t=this.tab;null===(e=t.onOpened)||void 0===e||e.call(t)})),this.addEventListener("close",(()=>{var e;J.lazyLoadQueue.lock(),o.Z.lockIntersectionGroup(Y),o.Z.checkAnimations(!0,Y);const t=this.tab;null===(e=t.onClose)||void 0===e||e.call(t)})),this.addEventListener("closed",(()=>{var e;o.Z.unlockIntersectionGroup(Y),J.lazyLoadQueue.unlock(),J.lazyLoadQueue.refresh(),this.savedRange=void 0;const t=this.tab;null===(e=t.onClosed)||void 0===e||e.call(t)}))}get tab(){return this.tabs[this.tabId]}init(){this.managers=a.Z.managers,this.emojiTab=new h.ZP({managers:this.managers}),this.stickersTab=new v.ZP(this.managers),this.gifsTab=new g(this.managers),this.tabs={},[this.emojiTab,this.stickersTab,this.gifsTab].forEach(((e,t)=>{e.tabId=t,this.tabs[t]=e})),this.container=this.element.querySelector(".emoji-container .tabs-container"),this.container.prepend(this.emojiTab.container,this.stickersTab.container),this.tabsEl=this.element.querySelector(".emoji-tabs"),this.selectTab=(0,r.X)(this.tabsEl,this.container,this.onSelectTabClick,(()=>{var e;const{tab:t}=this;null===(e=t.init)||void 0===e||e.call(t),o.Z.checkAnimations(!1,Y)})),this.searchButton=this.element.querySelector(".emoji-tabs-search"),this.searchButton.addEventListener("click",(()=>{this.tabId===this.stickersTab.tabId?l.ZP.isTabExists(F)||l.ZP.createTab(F).open():l.ZP.isTabExists(M)||l.ZP.createTab(M).open()})),this.deleteBtn=this.element.querySelector(".emoji-tabs-delete"),(0,m.fc)(this.deleteBtn,(e=>{(0,O.Z)(e);const t=n.Z.chat.input.messageInput;let i=$.Z.getInstance().getSavedRange(t);i||(i=document.createRange(),i.setStartAfter(t.lastChild));const s=i.cloneRange();if(i.collapsed){const{node:e,offset:n}=(0,q.q)(t,i.endContainer,i.endOffset);let a;if(n)a=e;else{if(a=e.previousSibling,!a)return;for(;a.nodeType===a.TEXT_NODE&&!a.nodeValue&&(a=a.previousSibling););if(a.nodeType===a.ELEMENT_NODE&&!a.isContentEditable)return}if(a.nodeType===a.ELEMENT_NODE&&"IMG"===a.tagName)s.selectNode(a);else{const e=[...a.textContent];let t;if(n){let i=0;t=e.find((e=>(i+=e.length,i>=n)))}else t=e.pop()||"";const i=n?n-t.length:a.textContent.length-t.length;s.setStart(a,i)}}s.deleteContents(),n.Z.chat.input.messageInputField.simulateInputEvent()}));const e=z.IS_APPLE_MOBILE&&!1,t=e?this.stickersTab.tabId:this.emojiTab.tabId;if(e&&this.tabsEl.children[1].classList.add("hide"),(0,m.tH)(this.tabsEl.children[t+1]),this.tabs[t].init&&this.tabs[t].init(),!s.Z){let e,t=!1;const i=t=>{e=t};j.Z.addEventListener("change",(s=>{s?t||(document.body.addEventListener("mousemove",i),t=!0):t&&(document.body.removeEventListener("mousemove",i),e&&this.onMouseOut(e))}))}return n.Z.addEventListener("peer_changing",(()=>{this.toggle(!1)})),n.Z.addEventListener("peer_changed",this.checkRights),this.checkRights(),super.init()}getElement(){return this.element}scrollTo(e,t){e.scrollable.scrollIntoViewNew(Object.assign({element:t,axis:"y",position:"start"},X))}static sendDocId(e,t,i){return Q(this,void 0,void 0,(function*(){return(yield n.Z.chat.input.sendMessageWithDocument(e,void 0,t,i))?(ee.container&&(ee.forceClose=!0,ee.toggle(!1)),!0):(console.warn("got no doc by id:",e),!1)}))}addLazyLoadQueueRepeat(e,t){this.addEventListener("close",(()=>{e.lock()})),this.addEventListener("closed",(()=>{const i=e.intersector.getVisible();for(const e of i)t(e);e.intersector.clearVisible()})),this.addEventListener("opened",(()=>{e.unlockAndRefresh()}))}getSavedRange(){return this.getGoodRange()||this.savedRange}getGoodRange(){const e=document.getSelection();if(e.rangeCount&&document.activeElement===n.Z.chat.input.messageInput)return e.getRangeAt(0)}}D=J,J.lazyLoadQueue=new d.Z(1),J.menuOnClick=(e,t,i,s,n,a)=>{let o=-1;const r=(e,t=!0)=>{if(e===n)return!1;let i=!1;return n&&(n.elements.menuTab.classList.remove("active"),n.menuScroll&&n.menuScroll!==e.menuScroll&&(i=!0,n.menuScroll.container.parentElement.classList.remove("active"),n.menuScroll.scrollIntoViewNew(Object.assign({element:n.menuScroll.container.firstElementChild,forceDirection:t?void 0:V.f.Static,position:"center",axis:"x"},X)))),e.elements.menuTab.classList.add("active"),e.menuScroll&&(e.menuScroll.container.parentElement.classList.add("active"),t&&s.scrollIntoViewNew(Object.assign({element:e.menuScroll.container.parentElement,position:"center",axis:"x"},X))),n&&((e,t)=>{const i=e.menuScroll||s;i&&i.scrollIntoViewNew(Object.assign({element:e.elements.menuTab,position:"center",axis:"x",getElementPosition:t?({elementPosition:e})=>e-106:void 0},X))})(e,i),n=e,!0};let d=!1;const l=new c.Z(i.container,((t,s)=>{if(d)return;if(Math.abs(o-i.container.scrollTop)<=1)return;o=-1;const n=e.getCategoryByContainer(s),a=(0,N.Z)(s);(t||!a&&!n.menuScroll)&&r(n)}));(0,m.fc)(t,(t=>{let s=(0,C.Z)(t.target,"menu-horizontal-div-item");if(!s){if(s=(0,C.Z)(t.target,"menu-horizontal-inner"),!s||s.classList.contains("active"))return;s=s.firstElementChild.firstElementChild}const n=(0,N.Z)(s),a=e.getCategoryByMenuTab(s);r(a);let l=0,c=0;if(n>0||a.menuScroll){const e=a.elements.container;c=1,l=e.offsetTop+c}o=l,d=!0,i.scrollIntoViewNew(Object.assign({element:l?a.elements.container:i.container.firstElementChild,position:"start",axis:"y",getElementPosition:l?({elementPosition:e})=>e+c:void 0},X)).finally((()=>{r(a),d=!1}))}),{listenerSetter:a});const h=i.onAdditionalScroll?i.onAdditionalScroll.bind(i):G.Z;return i.onAdditionalScroll=()=>{e.content.parentElement.classList.toggle("scrolled-top",!i.scrollTop),h()},{stickyIntersector:l,setActive:r,setActiveStatic:t=>{if(null==n?void 0:n.local)return;e.scrollable.scrollTop=t.elements.container.offsetTop+1;const i=e.menuScroll.container,s=t.elements.menuTab;i.scrollLeft=s.offsetLeft-i.clientWidth/2+s.offsetWidth/2,r(t,!1)}}},J.onMediaClick=(e,t=!1,i)=>Q(void 0,void 0,void 0,(function*(){const s=(0,R.Z)(e.target,"DIV");if(!s)return!1;const n=s.dataset.docId;return!!n&&D.sendDocId(n,t,i)}));const ee=new J;b.GO.emoticonsDropdown=ee;const te=ee},6039:(e,t,i)=>{"use strict";i.d(t,{IA:()=>F,ZP:()=>j,xG:()=>D});var s=i(3173),n=i(3910),a=i(8497),o=i(3035),r=i(5418),d=i(4271),l=i(3512),c=i(671),h=i(279),u=i(8805),p=i(9976),f=i(5432),m=i(8799),g=i(3447),v=i(7746),b=i(8115),y=i(7197),w=i(5400),S=i(2738),C=i(6057),L=i(9405),E=i(2940),I=i(4755),M=i(1273),P=i(9259),Z=i(4064),k=i(4484),T=i(6787),x=i(2796),A=i(5953);const _=new Set;function F(e,t,i=!1,s=!1){var n;const a=document.createElement("span");let r;if(a.classList.add("super-emoji"),s&&!p.Z?r=function(e){return(0,w.ZP)(e,{entities:[(0,y.Z)(e)]})}(e):(e=(0,v.Z)(e),r=(0,b.Z)(e)),a.append(r),a.children.length>1){const e=a.firstElementChild;a.innerHTML="",a.append(e)}if("IMG"===(null===(n=a.firstElementChild)||void 0===n?void 0:n.tagName)){const e=a.firstElementChild,t=e.src;if(!_.has(t)){e.setAttribute("loading","lazy");const i=document.createElement("span");i.classList.add("emoji-placeholder"),l.Z.settings.animationsEnabled&&(e.style.opacity="0",i.style.opacity="1"),e.addEventListener("load",(()=>{(0,o.T2)((()=>{l.Z.settings.animationsEnabled&&(e.style.opacity="",i.style.opacity=""),a.classList.remove("empty"),_.add(t)}))}),{once:!0}),a.append(i)}}return t&&(i?t.prepend(a):t.appendChild(a)),a}function D(e){const t=(0,a.Z)(e,"super-emoji");if(!t)return;const i=t.firstElementChild;return i&&i.classList.contains("custom-emoji")?{emoji:i.dataset.stickerEmoji,docId:i.dataset.docId}:e.nodeType===e.TEXT_NODE?{emoji:e.nodeValue}:("SPAN"===e.tagName&&!e.classList.contains("emoji")&&e.firstElementChild&&(e=e.firstElementChild),{emoji:e.getAttribute("alt")||e.innerText})}const R="Emoji.Recent",B=[R,"recent"],N=["",""],O=[["Emoji.SmilesAndPeople","smile"],["Emoji.AnimalsAndNature","animals"],["Emoji.FoodAndDrink","eats"],["Emoji.TravelAndPlaces","car"],["Emoji.ActivityAndSport","sport"],["Emoji.Objects","lamp"],["Emoji.Flags","flag"],["Skin Tones",""]];let U;function H(){if(U)return U;U=new Map([[N,[]],[B,[]]]);for(const e in g.Z){const t=""+g.Z[e],i=O[+t[0]-1];if(!i)continue;let s=U.get(i);s||(s=[],U.set(i,s)),s[+t.slice(1)||0]=e}U.delete(O.pop()),O.unshift(N,B);const e=O.map((([e])=>e)),t=[...U.entries()].sort(((t,i)=>e.indexOf(t[0][0])-e.indexOf(i[0][0])));return U=new Map(t),U}const z=(0,L.C)(42,42);class j extends C.pw{constructor(e){super(e.managers,"super-emojis",(()=>z),16,4,0),this.onCategoryVisibility=({target:e,visible:t})=>{const i=this.categoriesMap.get(e),s=i.elements.renderer,n=[];if(s){n.push(s);const e=new Map;t?(n.push(...i.items.map((({docId:t,element:i})=>{if(!t)return i;const s=i.firstElementChild;return s.clear(!1),e.set(s.docId,new Set([s])),i}))),s.add(e,void 0,void 0,!1)):(s.clearCanvas(),s.middlewareHelper.clean())}else t&&n.push(...i.items.map((({element:e})=>e)));if(i.elements.items.replaceChildren(...n),s&&!t){const e=new Map;i.items.forEach((({docId:t,element:i})=>{if(!t)return;const s=i.firstElementChild;s.clear(),e.set(s.docId,new Set([s]))})),s.add(e,void 0,!0)}},this.onContentClick=e=>{(0,n.Z)(e);const{target:t}=e,i=(0,a.Z)(t,"emoji-category"),s=this.categoriesMap.get(i);if((0,a.Z)(t,"category-title")){if(s.local)return;return void new T.Z({id:s.set.id,access_hash:s.set.access_hash},!0).show()}const o=D(t);if(o){if(o.docId&&!l.Z.premium&&(this.isStandalone?""!==s.id:this.peerId!==l.Z.myId)){const e=document.createElement("a");return e.onclick=()=>{d.Z.openPremiumBot(),(0,x.PE)()},void(0,x.bC)({langPackKey:"CustomEmoji.PremiumAlert",langPackArguments:[e]})}this.onClick?this.onClick(Object.assign(Object.assign({},o),{element:(0,a.Z)(t,"super-emoji").firstElementChild})):d.Z.chat.input.onEmojiSelected(o,!1),f.Z&&(0,m.Z)()}},(0,A.Z)(this,e),this.container.classList.add("emoji-padding"),this.content.id="content-emoji",this.activeElements=[]}destroy(){var e;super.destroy(),null===(e=this.menuInnerScroll)||void 0===e||e.destroy()}init(){super.init(),this.init=void 0;const e={root:this.isStandalone?this.content:s.ZP.getElement()};this.categoriesIntersector=new E.Z(this.onCategoryVisibility,e),this.menuOnClickResult=s.Jo.menuOnClick(this,this.menu,this.scrollable,this.menuScroll,void 0,this.listenerSetter);const t=(0,h.y)(this.content,!0);let i,n;if(!this.isStandalone){const e=this.menuInnerScroll=new u.v7(void 0);e.container.classList.add("menu-horizontal-inner-scroll"),i=document.createElement("div"),i.classList.add("menu-horizontal-inner"),i.append(e.container)}H(),n=this.noRegularEmoji?new Map([[[N[0],"recent"],[]]]):H(),n.forEach(((e,[t,i])=>{const s=this.createLocalCategory(t,t,i,!i);s.elements.container.classList.remove("hide"),s.elements.items.classList.add(i&&!this.isStandalone?"is-local":"not-local"),e.forEach((e=>{const t=(0,c.zu)(e);this.addEmojiToCategory({category:s,emoji:{emoji:t},batch:!0})}))}));const a=Promise.all([this.isStandalone?void 0:(0,r.Z)(200),!this.noRegularEmoji&&this.managers.appEmojiManager.getRecentEmojis("native"),!this.isStandalone&&this.managers.appEmojiManager.getRecentEmojis("custom"),this.stickerSetId&&this.managers.appStickersManager.getLocalStickerSet(this.stickerSetId),this.managers.appEmojiManager.getCustomEmojis()]).then((([e,n,a,o,r])=>{t.remove(),o&&(a=o.documents.map((e=>e.id)));const c=this.categories[R],h=this.categories[""];if(this.isStandalone||[c&&[c,n],h&&[h,a]].filter(Boolean).forEach((([e,t])=>{e.limit=32,t.splice(32,t.length-32)})),c&&n)for(const e of n)this.addEmojiToCategory({category:c,emoji:{emoji:e},batch:!0});if(h){if(this.createRendererForCategory(h),a)for(const e of a)this.addEmojiToCategory({category:h,emoji:{emoji:"",docId:e},batch:!0});h.elements.container.style.paddingTop=".5rem"}O.forEach((([e])=>{const t=this.categories[e];t&&(this.toggleLocalCategory(t,!0),e!==R&&""!==e&&(t.menuScroll=this.menuInnerScroll,this.menuInnerScroll.container.append(t.elements.menuTab)))})),this.resizeCategories(),c&&i&&c.elements.menuTab.after(i),r.sets.forEach((e=>{this.renderStickerSet(e)})),this.listenerSetter.add(l.Z)("premium_toggle",(()=>{this.toggleCustomCategory()})),this.listenerSetter.add(l.Z)("stickers_top",this.postponedEvent((e=>{const t=this.categories[e];t&&(this.positionCategory(t,!0),this.listenerSetter.add(s.ZP)("openAfterLayout",(()=>{this.menuOnClickResult.setActiveStatic(t)}),{once:!0}))})));const u=e=>{for(const t in this.categories){const i=this.categories[t].elements.renderer;i&&(i.ignoreSettingDimensions=e,e||i.setDimensionsFromRect(void 0,!0))}};!this.isStandalone&&this.listenerSetter.add(s.ZP)("opened",(()=>{u(!1)})),!this.isStandalone&&this.listenerSetter.add(s.ZP)("close",(()=>{u(!0)})),this.listenerSetter.add(l.Z)("stickers_installed",(e=>{!this.categories[e.id]&&e.pFlags.emojis&&this.renderStickerSet(e,!0)})),this.listenerSetter.add(l.Z)("stickers_deleted",(e=>{const t=this.categories[e.id];if(this.deleteCategory(t)){const{renderer:e}=t.elements;e&&e.middlewareHelper.clean()}})),!this.isStandalone&&this.listenerSetter.add(l.Z)("emoji_recent",this.postponedEvent((e=>{const t=this.categories[e.docId?"":R];if(!t)return;const i=e.docId?t=>t.docId===e.docId:t=>t.emoji===e.emoji,s=(0,Z.Z)(t.items,i);if(s){if(t.items.unshift(s),this.isCategoryVisible(t)){const{renderer:e}=t.elements;(0,k.Z)(s.element,t.elements.items,e?1:0,-1),null==e||e.forceRender()}}else this.addEmojiToCategory({category:t,emoji:e,batch:!1,prepend:!0});0===this.closeScrollTop&&this.menuOnClickResult.setActive(e.docId?this.categories[R]:t)}))),!this.isStandalone&&this.listenerSetter.add(d.Z)("peer_changed",(()=>{this.toggleCustomCategory()})),this.toggleCustomCategory(),this.menuOnClickResult.setActive(null!=c?c:h)}));return(0,S.fc)(this.content,this.onContentClick,{listenerSetter:this.listenerSetter}),(0,P.Z)({listenTo:this.content,listenerSetter:this.listenerSetter}),a}renderStickerSet(e,t){const i=this.createCategory(e,(0,b.Z)(e.title));this.positionCategory(i,t);const{container:n,menuTabPadding:a}=i.elements;i.elements.items.classList.add("not-local"),i.elements.container.classList.add("is-premium-set"),i.elements.title.classList.add("tgico"),this.createRendererForCategory(i),this.managers.appStickersManager.getStickerSet(e).then((({documents:e})=>{e.forEach((e=>{this.addEmojiToCategory({category:i,emoji:{docId:e.id,emoji:e.stickerEmojiRaw},batch:!0})})),this.onCategoryVisibility({target:i.elements.container,visible:this.isCategoryVisible(i)}),i.setCategoryItemsHeight(),n.classList.remove("hide")})),(0,M.Z)({set:e,container:a,group:s.Yd,lazyLoadQueue:s.Jo.lazyLoadQueue,width:32,height:32,autoplay:!1})}get peerId(){return d.Z.chat.peerId}getCustomCategory(){return this.categories[""]}toggleCustomCategory(){const e=this.categories[""],t=l.Z.premium||this.peerId===l.Z.myId,i=t||this.isStandalone;super.toggleLocalCategory(e,!!e.items.length&&i),this.content.classList.toggle("has-premium",t)}toggleLocalCategory(e,t){""!==e.id?super.toggleLocalCategory(e,t):this.toggleCustomCategory()}createRendererForCategory(e){const t=w.KZ.create({animationGroup:s.Yd,customEmojiSize:I.Z.active.esgCustomEmoji});e.elements.renderer=t,e.elements.items.append(t)}addEmojiToCategory(e){const{category:t,emoji:i,batch:s,prepend:n}=e;let a=e.element;if(a){const e=document.createElement("span");e.classList.add("super-emoji"),e.append(a),a=e}else if(i.docId){const e=w.LD.create(i.docId),t=document.createElement("span");t.classList.add("super-emoji"),t.append(e),a=t}else a=F(i.emoji,void 0,!1);const o=Object.assign(Object.assign({},i||{emoji:void 0}),{element:a});(e.active||this.activeEmoji&&(o.docId?this.activeEmoji.docId===o.docId:this.activeEmoji.emoji===o.emoji))&&(this.activeEmoji,this.activeElements.push(o),a.classList.add("active")),t.items[n?"unshift":"push"](o),s||this.spliceExceed(t)||this.onLocalCategoryUpdate(t)}setActive(e){var t,i;(e===this.activeEmoji||(null==e?void 0:e.docId)?e.docId!==(null===(t=this.activeEmoji)||void 0===t?void 0:t.docId):(null==e?void 0:e.emoji)!==(null===(i=this.activeEmoji)||void 0===i?void 0:i.emoji))&&(this.activeEmoji=e,this.activeElements.forEach((e=>{e.element.classList.remove("active")})),this.activeElements.length=0,this.categoriesMap.forEach((t=>{t.items.forEach((t=>{(e.docId?t.docId===e.docId:t.emoji===e.emoji)&&(t.element.classList.add("active"),this.activeElements.push(t))}))})))}onClose(){this.closeScrollTop=this.scrollable.scrollTop}}},6057:(e,t,i)=>{"use strict";i.d(t,{pw:()=>_,vT:()=>x,ZP:()=>F});var s=i(3173),n=i(8497),a=i(4755),o=i(2325),r=i(8115),d=i(3512),l=i(5814),c=i(1655),h=i(7009),u=i(2940);class p extends h.Z{constructor(e,t,i){super(e),this.onVisibilityChange=t,this.elementsMap=new Map,this.intersector=new u.Z((e=>{var t;const{target:i,visible:s}=e,n=this.elementsMap.get(i);n.visible=s,s?(n.wasSeen=!0,this.queue.includes(n)||this.queue.push(n)):(0,c.Z)(this.queue,n),null===(t=this.onVisibilityChange)||void 0===t||t.call(this,e),this.setProcessQueueTimeout()}),i)}clear(){super.clear(),this.elementsMap.clear()}observe(e){this.elementsMap.set(e.div,e),super.observe(e)}unobserve(e){this.elementsMap.delete(e.div),super.unobserve(e)}}var f=i(279),m=i(6787),g=i(8805),v=i(4064),b=i(2738),y=i(4484),w=i(319),S=i(2230),C=i(5592),L=i(3163),E=i(5975),I=i(7625),M=i(9259),P=i(3699),Z=i(3541),k=i(1273),T=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class x{constructor(e,t,i,s){this.regularLazyLoadQueue=e,this.group=t,this.managers=i,this.options=s,this.animated=new Set,this.checkAnimationContainer=(e,t)=>{l.Z.getAnimations(e).forEach((e=>{t?l.Z.checkAnimation(e,!1):l.Z.removeAnimation(e)}))},this.processVisible=e=>T(this,void 0,void 0,(function*(){const t=e.dataset.docId,i=yield this.managers.appDocsManager.getDoc(t),s=a.Z.active.esgSticker.width,n=(0,Z.ZP)({doc:i,div:e,width:s,height:s,lazyLoadQueue:null,group:this.group,onlyThumb:!1,play:!0,loop:!0,withLock:!0}).then((({render:e})=>e));return n.then((()=>{this.checkAnimationContainer(e,this.lazyLoadQueue.intersector.isVisible(e))})),n})),this.processInvisible=e=>T(this,void 0,void 0,(function*(){const t=e.dataset.docId,i=yield this.managers.appDocsManager.getDoc(t);this.checkAnimationContainer(e,!1),e.textContent="",this.renderSticker(i,e)})),this.lazyLoadQueue=new p(void 0,(({target:e,visible:t})=>{t||this.processInvisible(e)}),s)}clear(){this.lazyLoadQueue.clear()}renderSticker(e,t,i){return t||((t=document.createElement("div")).classList.add("grid-item","super-sticker"),t.dataset.docId=""+e.id,e.animated&&this.observeAnimated(t)),(0,Z.ZP)({doc:e,div:t,lazyLoadQueue:this.regularLazyLoadQueue,group:this.group,onlyThumb:e.animated,loadPromises:i}),t}observeAnimated(e){this.animated.add(e),this.lazyLoadQueue.observe({div:e,load:this.processVisible})}unobserveAnimated(e){this.animated.delete(e),this.lazyLoadQueue.delete({div:e})}}class A{constructor(e){var t,i;const s=document.createElement("div");s.classList.add("emoji-category");const n=document.createElement("div");let a,o,r;n.classList.add("category-items"),e.title&&(a=document.createElement("div"),a.classList.add("category-title"),a.append(e.title)),e.noMenuTab||(o=(0,S.Z)(void 0,{noRipple:!0}),o.classList.add("menu-horizontal-div-item"),r=document.createElement("div"),r.classList.add("menu-horizontal-div-item-padding"),o.append(r)),a&&s.append(a),s.append(n),this.elements={container:s,title:a,items:n,menuTab:o,menuTabPadding:r},this.id=e.id,this.items=[],this.getContainerSize=e.getContainerSize,this.getElementMediaSize=e.getElementMediaSize,this.gapX=null!==(t=e.gapX)&&void 0!==t?t:0,this.gapY=null!==(i=e.gapY)&&void 0!==i?i:0}setCategoryItemsHeight(){const{width:e}=this.getContainerSize(),t=this.getElementMediaSize().width;let i=e/t;this.gapX&&(i-=Math.floor(i-1)*this.gapX/t),i=Math.floor(i);const s=Math.ceil(this.items.length/i);let n=s*t;this.gapY&&(n+=(s-1)*this.gapY),this.elements.items.style.minHeight=n+"px"}}class _{constructor(e,t,i,n,a,o){this.managers=e,this.categoryItemsClassName=t,this.getElementMediaSize=i,this.padding=n,this.gapX=a,this.gapY=o,this.mounted=!1,this.resizeCategories=()=>{for(const[e,t]of this.categoriesMap)t.setCategoryItemsHeight()},this.postponedEvent=e=>(...t)=>{s.ZP.isActive()?this.postponedEvents.push({cb:e,args:t}):e(...t)},this.categories={},this.categoriesMap=new Map,this.categoriesByMenuTabMap=new Map,this.localCategories=[],this.postponedEvents=[],this.listenerSetter=new P.Z,this.container=document.createElement("div"),this.container.classList.add("tabs-tab","emoticons-container"),this.menuWrapper=document.createElement("div"),this.menuWrapper.classList.add("menu-wrapper","emoticons-menu-wrapper"),this.menu=document.createElement("nav"),this.menu.className="menu-horizontal-div no-stripe justify-start emoticons-menu",this.menuWrapper.append(this.menu),this.menuScroll=new g.v7(this.menuWrapper),this.content=document.createElement("div"),this.content.classList.add("emoticons-content"),this.container.append(this.menuWrapper,this.content),this.scrollable=new g.ZP(this.content,"STICKERS")}getCategoryByContainer(e){return this.categoriesMap.get(e)}getCategoryByMenuTab(e){return this.categoriesByMenuTabMap.get(e)}createCategory(e,t,i,s){const n=new A({id:""+e.id,title:t,overflowElement:this.content,getContainerSize:()=>{var e,t;const{width:i,height:s}=null!==(t=null===(e=this.getContainerSize)||void 0===e?void 0:e.call(this))&&void 0!==t?t:this.content.getBoundingClientRect();return{width:i-this.padding,height:s}},getElementMediaSize:this.getElementMediaSize,gapX:this.gapX,gapY:this.gapY,noMenuTab:s});this.categoryItemsClassName&&n.elements.items.classList.add(this.categoryItemsClassName);const a=n.elements.container;return a.classList.add("hide"),n.set=e,this.categories[e.id]=n,this.categoriesMap.set(a,n),!s&&this.categoriesByMenuTabMap.set(n.elements.menuTab,n),this.categoriesIntersector.observe(a),!s&&this.menuOnClickResult.stickyIntersector.observeStickyHeaderChanges(a),i||!s&&n.elements.menuTab.classList.add("not-local"),n}positionCategory(e,t){const{menuTab:i,container:s}=e.elements,n=t?this.localCategories.filter((e=>e.mounted)).length:65535;let a=!1;const o=t?this.localCategories.filter((e=>e.menuScroll&&!a?(a=!0,!0):e.mounted&&!e.menuScroll&&e.elements.menuTab)).length:65535;(0,y.Z)(s,this.scrollable.container,n),(0,y.Z)(i,this.menu,o)}isCategoryVisible(e){return this.categoriesIntersector.getVisible().includes(e.elements.container)}toggleLocalCategory(e,t){var i;if(t){const t=this.localCategories.indexOf(e),i=this.localCategories.slice(0,t);let s=0,n=0;i.forEach((e=>{e.mounted?e.elements.menuTab&&!e.menuScroll||++n:(++s,++n)}));const a=t-s,o=t-n;e.elements.menuTab&&(0,y.Z)(e.elements.menuTab,this.menu,o),(0,y.Z)(e.elements.container,this.scrollable.container,a)}else null===(i=e.elements.menuTab)||void 0===i||i.remove(),e.elements.container.remove();e.mounted=t}createLocalCategory(e,t,i,s){const n=this.createCategory({id:e},t&&(0,o.ag)(t),!0,s);return n.local=!0,this.localCategories.push(n),n.elements.title&&n.elements.title.classList.add("disable-hover"),s||(i&&n.elements.menuTab.classList.add("tgico","tgico-"+i),n.elements.menuTabPadding.remove()),this.toggleLocalCategory(n,!1),n}onLocalCategoryUpdate(e){e.setCategoryItemsHeight(),this.toggleLocalCategory(e,!!e.items.length)}deleteCategory(e){return!!e&&(e.elements.container.remove(),e.elements.menuTab.remove(),this.categoriesIntersector.unobserve(e.elements.container),delete this.categories[e.id],this.categoriesMap.delete(e.elements.container),this.categoriesByMenuTabMap.delete(e.elements.menuTab),!0)}spliceExceed(e){if(void 0===e.limit)return!1;const{items:t,limit:i}=e;return t.splice(i,t.length-i).forEach((({element:e})=>{e.remove()})),this.onLocalCategoryUpdate(e),!0}init(){this.listenerSetter.add(s.ZP)("closed",(()=>{this.postponedEvents.forEach((({cb:e,args:t})=>{e(...t)})),this.postponedEvents.length=0}))}destroy(){var e,t,i,s;this.getContainerSize=void 0,this.postponedEvents.length=0,null===(e=this.categoriesIntersector)||void 0===e||e.disconnect(),this.listenerSetter.removeAll(),this.scrollable.destroy(),null===(t=this.menuScroll)||void 0===t||t.destroy(),null===(s=null===(i=this.menuOnClickResult)||void 0===i?void 0:i.stickyIntersector)||void 0===s||s.disconnect()}}class F extends _{constructor(e){super(e,"super-stickers",(()=>a.Z.active.esgSticker),6,4,4),this.onCategoryVisibility=({target:e,visible:t,entry:i})=>{const s=this.categoriesMap.get(e);s.elements.items.replaceChildren(...t?s.items.map((({element:e})=>e)):[])},this.setTyping=(e=!1)=>{(e||s.ZP.isActive()&&s.ZP.tab===this)&&d.Z.dispatchEvent("choosing_sticker",!e)},this.container.classList.add("stickers-padding"),this.content.id="content-stickers"}setFavedLimit(e){this.categories.faved.limit=e}categoryAppendStickers(e,t){const{container:i}=e.elements;t.then((t=>{const s=this.isCategoryVisible(e);t.forEach((t=>{const i=this.superStickerRenderer.renderSticker(t);e.items.push({document:t,element:i}),s&&e.elements.items.append(i)})),e.setCategoryItemsHeight(),i.classList.remove("hide")}))}renderStickerSet(e,t=!1){return T(this,void 0,void 0,(function*(){const i=this.createCategory(e,(0,r.Z)(e.title)),{menuTabPadding:n}=i.elements,a=this.managers.appStickersManager.getStickerSet(e);this.categoryAppendStickers(i,a.then((e=>e.documents))),this.positionCategory(i,t),(0,k.Z)({set:e,container:n,group:s.Yd,lazyLoadQueue:s.Jo.lazyLoadQueue,width:32,height:32,autoplay:!1})}))}init(){super.init(),this.scrollable.onAdditionalScroll=()=>{this.setTyping()};const e={root:s.ZP.getElement()};this.categoriesIntersector=new u.Z(this.onCategoryVisibility,e);const t=e=>{e.elements.items.replaceChildren(),e.items.forEach((({element:e})=>this.superStickerRenderer.unobserveAnimated(e))),e.items.length=0};this.scrollable.container.addEventListener("click",(e=>{const t=e.target;if((0,n.Z)(t,"category-title")){const e=(0,n.Z)(t,"emoji-category"),i=this.categoriesMap.get(e);if(i.local)return;new m.Z({id:i.set.id,access_hash:i.set.access_hash}).show()}else s.Jo.onMediaClick(e)})),this.menuOnClickResult=s.Jo.menuOnClick(this,this.menu,this.scrollable,this.menuScroll);const i=(0,f.y)(this.content,!0),o=(e,t)=>{e.limit&&(t=t.slice(0,e.limit));const i=new Set(t.map((e=>e.id)));(0,I.Z)(e.items,(t=>{i.has(t.document.id)||this.deleteSticker(e,t.document,!0)})),this.toggleLocalCategory(e,!!t.length),(0,I.Z)(t,((t,i)=>{this.unshiftSticker(e,t,!0,i)})),this.spliceExceed(e),e.elements.container.classList.remove("hide")},r=this.createLocalCategory("faved","FavoriteStickers","savedmessages"),l=this.createLocalCategory("recent","Stickers.Recent","recent");l.limit=20;const c=(0,S.Z)("close",{noRipple:!0});l.elements.title.append(c),(0,b.fc)(c,(()=>{(0,C.Z)({titleLangKey:"ClearRecentStickersAlertTitle",descriptionLangKey:"ClearRecentStickersAlertMessage",button:{langKey:"Clear"}}).then((()=>{this.managers.appStickersManager.clearRecentStickers()}),w.Z)}));const h=this.createLocalCategory("premium","PremiumStickersShort"),p=document.createElement("span");p.classList.add("tgico-star","color-premium"),h.elements.menuTab.append(p);const g=[Promise.all([this.managers.apiManager.getLimit("favedStickers"),this.managers.appStickersManager.getFavedStickersStickers()]).then((([e,t])=>{this.setFavedLimit(e),o(r,t)})),this.managers.appStickersManager.getRecentStickersStickers().then((e=>{o(l,e)})),this.managers.appStickersManager.getAllStickers().then((e=>{for(const t of e.sets)this.renderStickerSet(t)})),this.managers.appStickersManager.getPremiumStickers().then((e=>{const t=e.length;this.toggleLocalCategory(h,d.Z.premium&&!!t),this.categoryAppendStickers(h,Promise.resolve(e)),d.Z.addEventListener("premium_toggle",(e=>{this.toggleLocalCategory(this.categories.premium,e&&!!t)}))}))];Promise.race(g).finally((()=>{i.remove()})),Promise.all(g).finally((()=>{this.mounted=!0,this.setTyping();const e=this.categories.faved,t=this.categories.recent;this.menuOnClickResult.setActive(e.items.length?e:t),d.Z.addEventListener("stickers_installed",(e=>{this.categories[e.id]||this.renderStickerSet(e,!0)}))})),this.superStickerRenderer=new x(s.Jo.lazyLoadQueue,s.Yd,this.managers,e);const v=this.superStickerRenderer.lazyLoadQueue;s.ZP.addLazyLoadQueueRepeat(v,this.superStickerRenderer.processInvisible),d.Z.addEventListener("sticker_updated",(({type:e,document:t,faved:i})=>{const s=this.categories["faved"===e?"faved":"recent"];s&&(i?this.unshiftSticker(s,t):this.deleteSticker(s,t))})),d.Z.addEventListener("stickers_deleted",(({id:e})=>{const i=this.categories[e];this.deleteCategory(i)&&t(i)})),d.Z.addEventListener("stickers_top",this.postponedEvent((e=>{const t=this.categories[e];t&&(this.positionCategory(t,!0),s.ZP.addEventListener("openAfterLayout",(()=>{this.menuOnClickResult.setActiveStatic(t)}),{once:!0}))}))),d.Z.addEventListener("stickers_updated",(({type:e,stickers:t})=>{const i=this.categories["faved"===e?"faved":"recent"];i&&o(i,t)})),d.Z.addEventListener("app_config",(()=>{this.managers.apiManager.getLimit("favedStickers").then((e=>{this.setFavedLimit(e)}))})),a.Z.addEventListener("resize",this.resizeCategories),(0,M.Z)({listenTo:this.content,listenerSetter:new P.Z});const y="menu";(0,L.Z)({listenTo:this.content,verifyRecent:e=>!!(0,E.Z)(e,this.categories.recent.elements.items),onOpen:()=>{s.ZP.setIgnoreMouseOut(y,!0)},onClose:()=>{s.ZP.setIgnoreMouseOut(y,!1)}}),this.init=null}deleteSticker(e,t,i){const s=(0,v.Z)(e.items,(e=>e.document.id===t.id));s&&(s.element.remove(),i||this.onLocalCategoryUpdate(e))}unshiftSticker(e,t,i,s){if(void 0!==s){const i=e.items[s];if(i&&i.document.id===t.id)return}let n=(0,v.Z)(e.items,(e=>e.document.id===t.id));n||(n={element:this.superStickerRenderer.renderSticker(t),document:t}),e.items.unshift(n),e.elements.items.prepend(n.element),i||this.spliceExceed(e)}unshiftRecentSticker(e){this.managers.appStickersManager.saveRecentSticker(e.id)}deleteRecentSticker(e){this.managers.appStickersManager.saveRecentSticker(e.id,!0)}onClosed(){this.setTyping(!0)}onOpened(){this.setTyping(),this.resizeCategories()}}},36:(e,t,i)=>{"use strict";i.d(t,{G:()=>s});const s=()=>{const e=document.createElement("div");return e.classList.add("gradient-delimiter"),e}},5948:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2325);function n(e){const t=document.createElement("span");return t.classList.add("badge-fake"),(0,s.$d)(t,e?"ScamMessage":"FakeMessage"),t}},1080:(e,t,i)=>{"use strict";i.d(t,{Z:()=>f});var s=i(5814),n=i(3725),a=i(3035),o=i(3512),r=i(8847),d=i(7009),l=i(2940);class c extends d.Z{constructor(e,t){super(e),this.onVisibilityChange=t,this.intersector=new l.Z((e=>{const{target:t,visible:i}=e,s=(0,r.Z)(this.queue,(e=>e.div===t));i&&s.length&&s.forEach((e=>{this.queue.unshift(e)})),this.onVisibilityChange&&this.onVisibilityChange(e),this.setProcessQueueTimeout()}))}observe(e){super.observe(e)}}var h=i(2887),u=i(319),p=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class f{constructor(e,t,i,r=!0){this.element=e,this.group=t,this.scrollable=i,this.scrollPromise=Promise.resolve(),this.timeout=0,this.onScroll=()=>{this.timeout?clearTimeout(this.timeout):this.scrollPromise=(0,n.Z)(),this.timeout=window.setTimeout((()=>{this.timeout=0,this.scrollPromise.resolve()}),150)},this.processInvisibleDiv=e=>this.scrollPromise.then((()=>p(this,void 0,void 0,(function*(){if(this.lazyLoadQueue.intersector.isVisible(e))return;const t=e.querySelector("video"),i=e.querySelector("img, canvas");i&&(i.classList.remove("hide"),yield(0,a.d1)()),!this.lazyLoadQueue.intersector.isVisible(e)&&t&&(t.remove(),t.src="",t.load(),s.Z.getAnimations(t).forEach((e=>{s.Z.removeAnimation(e)})))})))),this.managers=o.Z.managers,this.lazyLoadQueue=new c(void 0,(({target:e,visible:t})=>{t?this.processVisibleDiv(e):this.processInvisibleDiv(e)})),r&&this.attach()}attach(){this.scrollable.container.addEventListener("scroll",this.onScroll)}detach(){this.clear(),this.scrollable.container.removeEventListener("scroll",this.onScroll)}clear(){this.lazyLoadQueue.clear()}processVisibleDiv(e){e.querySelector("video")||this.lazyLoadQueue.push({div:e,load:()=>{const t=e.dataset.docId;return Promise.all([this.managers.appDocsManager.getDoc(t),this.scrollPromise]).then((([t])=>p(this,void 0,void 0,(function*(){const i=(yield(0,h.Z)({doc:t,container:e,lazyLoadQueue:null,group:this.group,noInfo:!0,noPreview:!0})).loadPromise;return i.finally((()=>{const t=e.querySelector("video"),i=e.querySelector("img, canvas");i&&i.classList.add("hide"),t&&!t.parentElement&&setTimeout((()=>{t.src="",t.load(),s.Z.getAnimations(t).forEach((e=>{s.Z.removeAnimation(e)}))}),0),this.lazyLoadQueue.intersector.isVisible(e)||this.processInvisibleDiv(e)})),i}))))}})}add(e,t=this.element){const i=document.createElement("div");i.classList.add("gif","grid-item"),i.dataset.docId=""+e.id,t.append(i),this.lazyLoadQueue.observe({div:i,load:u.Z}),(0,h.Z)({doc:e,container:i,lazyLoadQueue:null,noInfo:!0,onlyPreview:!0})}}},6008:(e,t,i)=>{"use strict";i.d(t,{X:()=>c});var s=i(426),n=i(3512),a=i(3035),o=i(4789),r=i(5975),d=i(2648),l=i(2738);function c(e,t,i,c,h=200,u,p){const f=(0,s.Z)({content:t,type:e||"tabs"===t.dataset.animation?"tabs":"navigation",transitionTime:h,onTransitionEnd:c,listenerSetter:p});if(!e)return f;const m=new Proxy(f,{apply:(t,i,s)=>{const n=+s[0],a=void 0===s[1]||s[1],o=e.querySelector(`[data-tab="${n}"]`)||e.children[n];g(o,n,a)}}),g=(s,r,d=!0)=>{return l=this,c=void 0,m=function*(){const l=t.children[r];if(i){const e=i(r,l,d),t=e instanceof Promise?yield e:e;if(void 0!==t&&!t)return}u&&u.scrollIntoViewNew({element:s.parentElement.children[r],position:"center",forceDirection:d?void 0:o.f.Static,forceDuration:h,axis:"x"}),n.Z.settings.animationsEnabled||(d=!1);const c=f.prevId();if(s.classList.contains("active")||r===c)return!1;const p=d?a.T2:e=>e(),m=e.querySelector(b.toLowerCase()+".active");m&&p((()=>{m.classList.remove("active")})),v&&-1!==c&&d&&p((()=>{const e=s.querySelector("i"),t=s.parentElement.children[c].querySelector("i");t.classList.remove("animate"),e.classList.remove("animate");const i=t.parentElement.parentElement.offsetLeft-e.parentElement.parentElement.offsetLeft,n=t.clientWidth/e.clientWidth;e.style.transform=`translate3d(${i}px, 0, 0) scale3d(${n}, 1, 1)`,(0,a.T2)((()=>{e.classList.add("animate"),e.style.transform="none"}))})),p((()=>{s.classList.add("active")})),f(r,d)},new((p=void 0)||(p=Promise))((function(e,t){function i(e){try{n(m.next(e))}catch(e){t(e)}}function s(e){try{n(m.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof p?n:new p((function(e){e(n)}))).then(i,s)}n((m=m.apply(l,c||[])).next())}));var l,c,p,m},v=!e.classList.contains("no-stripe"),b=e.firstElementChild.tagName;return(0,l.fc)(e,(t=>{let i,s=t.target;if(s=(0,r.Z)(s,e),!s)return!1;if(s.dataset.tab){if(i=+s.dataset.tab,-1===i)return!1}else i=(0,d.Z)(s);g(s,i)}),{listenerSetter:p}),m}},503:(e,t,i)=>{"use strict";i.d(t,{I1:()=>C,ZP:()=>I,rf:()=>w});var s=i(3910),n=i(6669),a=i(1544),o=i(8763),r=i(4668),d=i(3299),l=i(9336),c=i(1293),h=i(5565),u=i(669),p=i(130),f=i(2325),m=i(1507),g=i(6241),v=i(6535),b=i(3066),y=i(5400);function w(e,t,i,o){return r=this,l=void 0,h=function*(){const r=[],l=(null==i?void 0:i.some((e=>"messageEntityCustomEmoji"===e._)))?L():void 0,c=(0,b.Z)(t,{entities:i,wrappingForPeerId:o,loadPromises:r,customEmojiRenderer:l});c.querySelectorAll('[contenteditable="false"]').forEach((e=>{e.contentEditable="inherit",e.classList.add("pc")})),r.length&&(yield Promise.all(r)),c.querySelectorAll(".input-selectable").forEach((e=>{e.prepend((0,y.SZ)(!0))}));const h=u.Y?u.Z.getInstance():void 0,p=Array.from(c.querySelectorAll(".custom-emoji-placeholder")).map((e=>(e.dataset.ces="1",e.customEmojiElement))),f=(0,a.Z)(c);null==l||l.destroy();const m=(0,d.Z)(e);if(m.node);else{const t=document.createRange();let i=e.lastChild;i||e.append(i=document.createTextNode("")),t.setStartAfter(i),t.collapse(!0),m.selection.removeAllRanges(),m.selection.addRange(t)}e.addEventListener("input",s.Z,{capture:!0,once:!0}),null==h||h.onBeforeInput({inputType:"insertContent"}),window.document.execCommand("insertHTML",!1,f),Array.from(e.querySelectorAll("[data-ces]")).forEach(((e,t)=>{delete e.dataset.ces;const i=p[t];e.customEmojiElement=i,i.placeholder=e})),e.querySelectorAll(".pc").forEach((e=>{e.contentEditable="false"})),null==h||h.removeExtraBOMs(e),(0,n.Z)(e,"input")},new((c=void 0)||(c=Promise))((function(e,t){function i(e){try{n(h.next(e))}catch(e){t(e)}}function s(e){try{n(h.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof c?n:new c((function(e){e(n)}))).then(i,s)}n((h=h.apply(r,l||[])).next())}));var r,l,c,h}let S=()=>{document.addEventListener("paste",(e=>{const t=(0,o.Z)(e.target,'contenteditable="true"');if(!t)return;const i=!!t.dataset.noLinebreaks;let s,n;e.preventDefault();let a=(e.originalEvent||e).clipboardData.getData("text/plain"),r=!0,d=(e.originalEvent||e).clipboardData.getData("text/html");const c=e=>"messageEntityEmoji"===e._||"messageEntityLinebreak"===e._&&!i;if(i){const e=/[\r\n]/g;a=a.replace(e,""),d=d.replace(e,"")}const h=(t.dataset.peerId||m.NM).toPeerId();if(d.trim()){d=d.replace(//,""),d=d.replace(//,""),d=d.replace('
',"");const e=d.match(/([\s\S]*)<\/body>/);e&&(d=e[1].trim());const t=(new DOMParser).parseFromString(d,"text/html").body||document.createElement("body");let i=t.firstChild;for(;i;){const e=i.nextSibling;i.nodeType===i.TEXT_NODE&&(i.nodeValue.trim()||i.remove()),i=e}const o=(0,l.Z)(t,!0,!1);h||(o.entities=o.entities.filter((e=>"messageEntityCustomEmoji"!==e._)));{const e=o.value.split("\n");let t=0;for(let i=0;i"messageEntityCustomEmoji"===e._))){s=o.value,n=o.entities,r=!1;let e=(0,v.Z)(s);e=e.filter(c),(0,g.Z)(n,e)}}r&&(s=a,n=(0,v.Z)(s),n=n.filter(c)),w(t,s,n,h)})),S=null};var C;function L(){return y.KZ.create({wrappingDraft:!0,isSelectable:!0})}function E(e){const t=Array.from(e.querySelectorAll(".custom-emoji, .custom-emoji-placeholder"));let i=e.querySelector(".custom-emoji-renderer");if(!i&&t.length)i=L(),e.prepend(i);else if(i&&!t.length)return void i.remove();if(!i)return;const s=new Map;t.forEach((e=>{const t=e instanceof y.LD?e:e.customEmojiElement,{docId:i}=t;let n=s.get(i);n||s.set(i,n=new Set),n.add(t)}));for(const[e,t]of s){let s=i.customEmojis.get(e);if(s)for(const e of s)t.has(e)||e.destroy();else s=new Set;for(const e of t)s.has(e)||e.connectedCallback()}i.add(s,!1),i.forceRender()}!function(e){e[e.Neutral=0]="Neutral",e[e.Valid=1]="Valid",e[e.Error=2]="Error"}(C||(C={}));class I{constructor(e={}){this.options=e,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=e.required,this.validate=e.validate,void 0!==e.maxLength&&void 0===e.showLengthOn&&(e.showLengthOn=Math.min(40,Math.round(e.maxLength/3)));const{placeholder:t,maxLength:i,showLengthOn:s,name:n,plainText:a,canBeEdited:o=!0,autocomplete:d}=e,h=e.label||e.labelText,m=[];let g;if(a?(this.container.innerHTML=`\n \n `,g=this.container.firstElementChild):(S&&S(),this.container.innerHTML='
',g=this.container.firstElementChild,g.contentEditable=""+!!o,u.Z.getInstance(),g.addEventListener("mousedown",(e=>{var t;const i=document.getSelection();if(!i.isCollapsed)return;const s=(0,r.Z)(e.target,"IMG");if(!s)return;const n=s.getBoundingClientRect(),a=n.left+n.width/2,o=e.clientX>=a,d=document.createRange();d.setStartAfter(o?s:null!==(t=s.previousSibling)&&void 0!==t?t:s),i.removeAllRanges(),i.addRange(d)})),m.push((()=>{(0,c.Z)(g)&&g.replaceChildren(),u.Y&&Array.from(g.querySelectorAll("br:not(.br-not-br)")).forEach((e=>{e.remove()})),(0,y.Cx)(Array.from(g.querySelectorAll(".input-something"))),E(g)}))),(0,p.m)(g),e.inputMode&&(g.inputMode=e.inputMode),t&&(0,f.$d)(g,t,void 0,"placeholder"),h||t){const e=document.createElement("div");e.classList.add("input-field-border"),this.container.append(e)}if(h&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const e=this.container.lastElementChild;let t=!1;const n=()=>{const n=g.classList.contains("error"),o=a?g.value.length:[...(0,l.Z)(g,!1,!1).value].length,r=i-o,d=r<0;g.classList.toggle("error",d),d||r<=s?(this.setLabel(),e.append(` (${i-o})`),t||(t=!0)):(n&&!d||t)&&(this.setLabel(),t=!1)};m.push(n)}!e.withLinebreaks&&!a&&(g.dataset.noLinebreaks="1",g.addEventListener("keypress",(e=>{if("Enter"===e.key)return e.preventDefault(),!1}))),m.length&&g.addEventListener("input",(()=>{m.forEach((e=>e()))})),this.input=g}select(){this.value&&(this.options.plainText?this.input.select():function(e){const t=document.createRange();t.selectNodeContents(e);const i=window.getSelection();i.removeAllRanges(),i.addRange(t)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?(0,p.Z)(this.label,this.options.labelText):this.label.append((0,f.ag)(this.options.label,this.options.labelOptions))}get value(){return this.options.plainText?this.input.value:(0,l.Z)(this.input,!1,!1).value}set value(e){this.setValueSilently(e,!0),this.simulateInputEvent()}simulateInputEvent(){(0,n.Z)(this.input,"input")}setValueSilently(e,t){this.options.plainText?this.input.value=e:((0,h.Z)(this.input,e),E(this.input))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!(0,c.Z)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(e="",t){this.options.plainText||(e=(0,a.Z)((0,b.Z)(e))),t?this.setValueSilently(e,!1):this.value=e}setOriginalValue(e="",t){this.originalValue=e,this.setDraftValue(e,t)}setState(e,t){t?(this.label.textContent="",this.label.append((0,f.ag)(t,this.options.labelOptions))):this.setLabel(),this.input.classList.toggle("error",!!(e&C.Error)),this.input.classList.toggle("valid",!!(e&C.Valid))}setError(e){this.setState(C.Error,e)}}},3607:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(503);class n{constructor(e,t){this.prevValue="",this.timeout=0,this.onInput=()=>{if(!this.onChange)return;const e=this.value;e!==this.prevValue&&(this.prevValue=e,clearTimeout(this.timeout),this.timeout=window.setTimeout((()=>{this.onChange(e)}),200))},this.onClearClick=()=>{this.value="",this.onChange&&this.onChange(""),this.onClear&&this.onClear()},this.inputField=new s.ZP({placeholder:e,plainText:!0}),this.container=this.inputField.container,this.container.classList.remove("input-field"),this.container.classList.add("input-search"),this.onChange=t,this.input=this.inputField.input,this.input.classList.add("input-search-input");const i=document.createElement("i");i.classList.add("tgico","tgico-search"),this.clearBtn=document.createElement("i"),this.clearBtn.classList.add("tgico","btn-icon","tgico-close"),this.input.addEventListener("input",this.onInput),this.clearBtn.addEventListener("click",this.onClearClick),this.container.append(i,this.clearBtn)}get value(){return this.inputField.value}set value(e){this.prevValue=e,clearTimeout(this.timeout),this.inputField.value=e}remove(){clearTimeout(this.timeout),this.input.removeEventListener("input",this.onInput),this.clearBtn.removeEventListener("click",this.onClearClick)}}},2153:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(2940),n=i(8847),a=i(4064),o=i(7009),r=i(8594);class d extends o.Z{constructor(e,t){super(e),this.onVisibilityChange=({target:e,visible:t})=>{(0,n.Z)(this.queue,(t=>t.div===e)).forEach((e=>{t&&(e.wasSeen=!0),e.visible=t;const i=this.queue.findIndex((e=>!e.visible));this.queue.splice(Math.max(0,i),0,e)})),this.setProcessQueueTimeout()},this.intersector=new s.Z(this.onVisibilityChange),!t&&(0,r.ZP)((()=>{this.lock()}),(()=>{this.unlockAndRefresh()}))}getItem(){return(0,a.Z)(this.queue,(e=>e.wasSeen))}processItem(e){const t=Object.create(null,{processItem:{get:()=>super.processItem}});return i=this,s=void 0,a=function*(){yield t.processItem.call(this,e),this.intersector.unobserve(e.div)},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}addElement(e,t){var i;return!!super.addElement(e,t)&&(this.observe(t),null!==(i=t.wasSeen)&&void 0!==i||(t.wasSeen=!1),!0)}}},7009:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8847),n=i(4421);class a extends n.Z{constructor(e){super(e),this.queue=[],this.inProcess=new Set}lock(){super.lock(),this.intersector.lock()}unlock(){super.unlock(),this.intersector.unlock()}unlockAndRefresh(){super.unlock(),this.intersector.unlockAndRefresh()}clear(){super.clear(),this.intersector.disconnect()}refresh(){this.intersector.refresh()}loadItem(e){return e.load(e.div)}addElement(e,t){if(this.queue.find((e=>e.div===t.div&&e.load===t.load)))return!1;for(const e of this.inProcess)if(e.div===t.div&&e.load===t.load)return!1;return this.queue[e](t),!0}setProcessQueueTimeout(){var e;null!==(e=this.intersectorTimeout)&&void 0!==e||(this.intersectorTimeout=window.setTimeout((()=>{this.intersectorTimeout=void 0,this.processQueue()}),0))}push(e){super.push(e)}unshift(e){super.unshift(e)}delete(e){(0,s.Z)(this.queue,(t=>t.div===e.div)),this.unobserve(e)}observe(e){this.intersector.observe(e.div)}unobserve(e){this.intersector.unobserve(e.div)}}},7207:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3013),n=i(65);class a extends n.Z{constructor(e,t,i,s){super({step:1e3/60/1e3,min:0,max:1,withTransition:i,useTransform:s},0),this.progressRAF=0,this.onLoadedData=()=>{this.max=this.media.duration,this.seek.setAttribute("max",""+this.max)},this.onEnded=()=>{this.setProgress()},this.onPlay=()=>{const e=()=>{this.setProgress(),this.progressRAF=this.media.paused?0:window.requestAnimationFrame(e)};this.progressRAF&&window.cancelAnimationFrame(this.progressRAF),this.streamable&&this.setLoadProgress(),this.progressRAF=window.requestAnimationFrame(e)},this.onTimeUpdate=()=>{this.media.paused&&(this.setProgress(),this.streamable&&this.setLoadProgress())},this.onProgress=e=>{this.setLoadProgress()},e&&this.setMedia(e,t)}setMedia(e,t=!1){this.media&&this.removeListeners(),t&&!this.filledLoad?(this.filledLoad=document.createElement("div"),this.filledLoad.classList.add("progress-line__filled","progress-line__loaded"),this.container.prepend(this.filledLoad)):this.filledLoad&&this.filledLoad.classList.toggle("hide",!t),this.media=e,this.streamable=t,(!e.paused||e.currentTime>0)&&this.onPlay();let i=!1;this.setSeekMax(),this.setListeners(),this.setHandlers({onMouseDown:()=>{i=!this.media.paused,i&&this.media.pause()},onMouseUp:e=>{i&&this.media.play()}})}scrub(e){const t=super.scrub(e);return this.media.currentTime=t,t}setLoadProgress(){if(s.Z.isSafariBuffering(this.media))return;const e=this.media.buffered,t=e.length,i=this.media.currentTime;let n=0,a=0;for(let s=0;s=t&&t>=n&&(n=t,a=e.end(s))}const o=this.media.duration?a/this.media.duration:0;this.filledLoad.style.width=100*o+"%"}setSeekMax(){this.max=this.media.duration||0,this.max>0?this.onLoadedData():this.media.addEventListener("loadeddata",this.onLoadedData)}setProgress(){if(s.Z.isSafariBuffering(this.media))return;const e=this.media.currentTime;super.setProgress(e)}setListeners(){super.setListeners(),this.media.addEventListener("ended",this.onEnded),this.media.addEventListener("play",this.onPlay),this.media.addEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.addEventListener("progress",this.onProgress)}removeListeners(){super.removeListeners(),this.media&&(this.media.removeEventListener("loadeddata",this.onLoadedData),this.media.removeEventListener("ended",this.onEnded),this.media.removeEventListener("play",this.onPlay),this.media.removeEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.removeEventListener("progress",this.onProgress)),this.progressRAF&&(window.cancelAnimationFrame(this.progressRAF),this.progressRAF=0)}}},3251:(e,t,i)=>{"use strict";i.d(t,{I:()=>f});var s=i(3189),n=i(8097),a=i(4755),o=i(3228),r=i(3035);const d=new Map,l=new Set;let c=!1;function h(){c||(c=!0,(0,r.T2)((()=>{c=!1,l.forEach(p),l.clear()})))}function u(e){const t=e.dataset.sizeType;return t?a.Z.active[t].width:e.getBoundingClientRect().width}function p(e){let t=d.get(e);const i=!t;let{text:a,textLength:r,from:l,multiplier:c,font:h,textWidth:p,elementWidth:f}=t||{};if(i){a=e.textContent,r=a.length,l=50,c=l>0&&l/100;let i=e.dataset.fontSize;i&&+i&&(i+="px"),h=`${e.dataset.fontWeight||s.U9} ${i||s.Bf} ${s.bt}`,p=(0,n.Z)(a,h),f=u(e),t={text:a,textLength:r,from:l,multiplier:c,font:h,textWidth:p,elementWidth:f},d.set(e,t)}const m=u(e),g=i||f!==m;if(!i&&g&&(t.elementWidth=f=m),g)if(p>f){e.setAttribute("title",a);let i=a,s=f;for(;i.length>3;){const t=i.length,a=c&&(0,o.Z)(c*t<<0,1,t-2)||Math.max(t+l-1,1),r=i.substr(0,a).replace(/\s*$/,""),d=i.substr(a+1).replace(/^\s*/,"");if(i=r+d,s=(0,n.Z)(i+"…",h),s{for(const[e]of d)l.add(e);h()}),{capture:!0,passive:!0});class f extends HTMLElement{connectedCallback(){d.set(this,null),this.dataset.sizeType?p(this):(l.add(this),h())}disconnectedCallback(){d.delete(this),l.delete(this)}}customElements.define("middle-ellipsis-element",f)},4425:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1447);class n{constructor(e,t){this.passwordInputField=e,this.size=t,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=s.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then((e=>(this.animation=e,this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())})),this.passwordInputField.helpers.onVisibilityClickAdditional=()=>{this.passwordInputField.helpers.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},s.Z.waitForFirstFrame(e))))}remove(){this.animation&&this.animation.remove()}}},3083:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1447);class n{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const i=e.input;i.addEventListener("blur",(()=>{this.playAnimation(0)})),i.addEventListener("input",(t=>{this.playAnimation(e.value.length)}))}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas[0].style.display="none"),this.animation.canvas[0].style.display=""):t=0;const i=this.needFrame>t?-1:1;this.animation.setDirection(i),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([s.Z.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then((e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),s.Z.waitForFirstFrame(e)))),s.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then((e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas[0].style.display="none"),this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas[0].style.display="",this.idleAnimation.play(),this.animation.canvas[0].style.display="none")})),s.Z.waitForFirstFrame(e))))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},6830:(e,t,i)=>{"use strict";i.d(t,{T:()=>a,Z:()=>o});var s=i(3910),n=i(503);class a{constructor(e,t){this.container=e,this.input=t,this.passwordVisible=!1,this.onVisibilityClick=e=>{(0,s.Z)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()},t.type="password",t.setAttribute("required",""),t.name="notsearch_password",t.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",t.parentElement.prepend(i),t.parentElement.insertBefore(i.cloneNode(),t.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),e.classList.add("input-field-password"),e.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}class o extends n.ZP{constructor(e={}){super(Object.assign({plainText:!0},e)),this.helpers=new a(this.container,this.input)}}},8261:(e,t,i)=>{"use strict";i.d(t,{Z:()=>G});var s=i(2365),n=i(3725),a=i(2166),o=i(3532),r=i(2738),d=i(5565),l=i(130),c=i(3699),h=i(5471),u=i(9405),p=i(3624),f=i(8631),m=i(4271),g=i(2790),v=i(5102),b=i(2325),y=i(5400),w=i(3512),S=i(9331),C=i(9807),L=i(36),E=i(5432),I=i(4064),M=i(3910),P=i(1708),Z=i(6074),k=i(3035),T=i(7030),x=i(9931),A=i(3757),_=i(9492),F=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class D{constructor(e,t){this.scrollable=e,this.managers=t,this.processItem=e=>F(this,void 0,void 0,(function*(){const t=document.createElement("div");let i;t.classList.add(D.BASE_CLASS+"-avatar","media-container","hide"),this.avatars.append(t),e&&(i="object"!=typeof e?yield this.managers.appPhotosManager.getPhoto(e):e.action.photo);const s=new Image;s.classList.add("avatar-photo"),s.draggable=!1;const n=()=>F(this,void 0,void 0,(function*(){if(i){const e=yield(0,_.Z)({container:t,photo:i,size:(0,T.Z)(i,420,420,!1),withoutPreloader:!0});[e.images.thumb,e.images.full].filter(Boolean).forEach((e=>{e.classList.add("avatar-photo")}))}else{const e=yield this.managers.appPeersManager.getPeerPhoto(this.peerId);yield(0,x.Y)(t,this.peerId,e,"photo_big",s)}t.classList.remove("hide")}));return this.avatars.childElementCount<=3?yield n():(this.intersectionObserver.observe(t),this.loadCallbacks.set(t,n)),this.addTab(),e})),this.container=document.createElement("div"),this.container.classList.add(D.BASE_CLASS+"-container"),this.avatars=document.createElement("div"),this.avatars.classList.add(D.BASE_CLASS+"-avatars"),this.gradient=document.createElement("div"),this.gradient.classList.add(D.BASE_CLASS+"-gradient"),this.info=document.createElement("div"),this.info.classList.add(D.BASE_CLASS+"-info"),this.tabs=document.createElement("div"),this.tabs.classList.add(D.BASE_CLASS+"-tabs"),this.arrowPrevious=document.createElement("div"),this.arrowPrevious.classList.add(D.BASE_CLASS+"-arrow","tgico-avatarprevious"),this.arrowNext=document.createElement("div"),this.arrowNext.classList.add(D.BASE_CLASS+"-arrow",D.BASE_CLASS+"-arrow-next","tgico-avatarnext"),this.container.append(this.avatars,this.gradient,this.info,this.tabs,this.arrowPrevious,this.arrowNext),this.loadCallbacks=new Map,this.listenerSetter=new c.Z;const i=()=>0===this.scrollable.scrollTop||(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),!1),s=1/3;let n=!1,a=!1;(0,r.fc)(this.container,(e=>F(this,void 0,void 0,(function*(){if(a)return void(0,M.Z)(e);if(n)return void(n=!1);if(!i())return;const t=this.container.getBoundingClientRect(),o=e.pageX,r=o-t.left;if(!this.listLoader.previous.length&&!this.listLoader.next.length||r>t.width*s&&r{t.push({element:this.avatars.children[i],item:e})}));const i=t.slice(0,this.listLoader.previous.length),s=t.slice(this.listLoader.previous.length+1),n=this.avatars.children[this.listLoader.previous.length];a=!0,(0,S.C)(n,e,(()=>e===this.peerId),this.listLoader.current,i,s),a=!1}else{const e=o>t.right-t.width/2;let i;this.avatars.classList.add("no-transition"),this.avatars.offsetLeft,i=0!==this.listLoader.index||e?this.listLoader.index===this.listLoader.count-1&&e?-(this.listLoader.count-1):e?1:-1:this.listLoader.count-1,this.listLoader.go(i),(0,k.T2)((()=>{this.avatars.classList.remove("no-transition")}))}}))),{listenerSetter:this.listenerSetter});const o=()=>{n=!0,document.body.addEventListener(E.Z?"touchend":"click",(e=>{n=!1}),{once:!0})};let d=0,l=0,h=0,u=0;this.swipeHandler=new A.Z({element:this.avatars,onSwipe:(e,t)=>{h=e*=-1;let i=l+e*-D.SCALE;return i>0?i=0:ii()?!this.container.classList.contains("is-single")&&!a:(o(),(0,M.Z)(e),!1),onFirstSwipe:()=>{const e=this.avatars.getBoundingClientRect();d=e.width,u=-d*(this.tabs.childElementCount-1),l=e.left-this.container.getBoundingClientRect().left,this.avatars.style.transform=D.TRANSLATE_TEMPLATE.replace("{x}",l+"px"),this.container.classList.add("is-swiping"),this.avatars.classList.add("no-transition"),this.avatars.offsetLeft},onReset:()=>{const e=Math.ceil(Math.abs(h)/(d/D.SCALE))*(h>=0?1:-1);o(),this.avatars.classList.remove("no-transition"),(0,k.T2)((()=>{this.listLoader.go(e),this.container.classList.remove("is-swiping")}))}}),this.intersectionObserver=new IntersectionObserver((e=>{e.forEach((e=>{e.isIntersecting&&this.loadNearestToTarget(e.target)}))}))}setPeer(e){return F(this,void 0,void 0,(function*(){this.peerId=e;const t=yield this.managers.appPeersManager.getPeerPhoto(e);if(!t)return;const i=this.listLoader=new Z.Z({loadCount:50,loadMore:(t,s,n)=>{if(!s)return Promise.resolve({count:void 0,items:[]});if(e.isUser()){const i=t;return this.managers.appPhotosManager.getUserPhotos(e,i,n).then((e=>({count:e.count,items:e.photos})))}{const t=[];return i.current||t.push(this.managers.appProfileManager.getChatFull(e.toChatId())),t.push(this.managers.appMessagesManager.getSearch({peerId:e,maxId:Number.MAX_SAFE_INTEGER,inputFilter:{_:"inputMessagesFilterChatPhotos"},limit:n,backLimit:0})),Promise.all(t).then((e=>F(this,void 0,void 0,(function*(){const t=e.pop();if((0,P.Z)(t),!i.current){const s=e[0],n=(0,I.Z)(t.history,(e=>e.action.photo.id===s.chat_photo.id));i.current=n||(yield this.managers.appMessagesManager.generateFakeAvatarMessage(this.peerId,s.chat_photo))}return{count:t.count,items:t.history}}))))}},processItem:this.processItem,onJump:(e,t)=>{const i=this.listLoader.index,s=100*D.SCALE*i;this.avatars.style.transform=D.TRANSLATE_TEMPLATE.replace("{x}",`-${s}%`);const n=this.tabs.querySelector(".active");n&&n.classList.remove("active"),this.tabs.children[i].classList.add("active"),this.loadNearestToTarget(this.avatars.children[i])}});"userProfilePhoto"===t._&&(i.current=t.photo_id),yield this.processItem(i.current),i.load(!0)}))}addTab(){const e=document.createElement("div");e.classList.add(D.BASE_CLASS+"-tab"),this.tabs.append(e),1===this.tabs.childElementCount&&e.classList.add("active"),this.container.classList.toggle("is-single",this.tabs.childElementCount<=1)}loadNearestToTarget(e){const t=Array.from(e.parentElement.children),i=t.indexOf(e);t.slice(Math.max(0,i-3),Math.min(t.length,i+3)).forEach((e=>{const t=this.loadCallbacks.get(e);t&&(t(),this.loadCallbacks.delete(e),this.intersectionObserver.unobserve(e))}))}cleanup(){var e;this.listenerSetter.removeAll(),this.swipeHandler.removeListeners(),null===(e=this.intersectionObserver)||void 0===e||e.disconnect()}}D.BASE_CLASS="profile-avatars",D.SCALE=s.Z?2:1,D.TRANSLATE_TEMPLATE=s.Z?`translate3d({x}, 0, -1px) scale(${D.SCALE})`:"translate({x}, 0)";var R=i(7479),B=i(5029),N=i(2796),O=i(8210),U=i(7362),H=i(9102),z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const j=(e,t)=>{(0,l.Z)(t.title,e||""),t.container.style.display=e?"":"none"};class G{constructor(e,t,i,n=!0){this.managers=e,this.scrollable=t,this.listenerSetter=i,this.isDialog=n,s.Z||this.scrollable.container.classList.add("no-parallax"),i||(this.listenerSetter=new c.Z),this.middlewareHelper=(0,p.k)()}init(){this.init=null,this.element=document.createElement("div"),this.element.classList.add("profile-content"),this.section=new B.Z({noDelimiter:!0}),this.name=document.createElement("div"),this.name.classList.add("profile-name"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("profile-subtitle"),this.bio=new R.ZP({title:" ",subtitle:!0,icon:"info",clickable:e=>{"A"!==e.target.tagName&&((0,a.T)(this.bio.title.textContent),(0,N.Am)(b.ZP.format("BioCopied",!0)))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_About",onClick:()=>{(0,r.tH)(this.bio.container)},verify:()=>!this.peerId.isUser()},{icon:"copy",text:"Text.CopyLabel_Bio",onClick:()=>{(0,r.tH)(this.bio.container)},verify:()=>this.peerId.isUser()}]}}),this.bio.title.classList.add("pre-wrap"),this.username=new R.ZP({title:" ",subtitleLangKey:"Username",icon:"username",clickable:()=>{(0,a.T)("@"+this.username.title.textContent),(0,N.Am)(b.ZP.format("UsernameCopied",!0))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_Username",onClick:()=>{(0,r.tH)(this.username.container)}}]}}),this.phone=new R.ZP({title:" ",subtitle:!0,icon:"phone",clickable:()=>{(0,a.T)(this.phone.title.textContent.replace(/\s/g,"")),(0,N.Am)(b.ZP.format("PhoneCopied",!0))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_PhoneNumber",onClick:()=>{(0,r.tH)(this.phone.container)}},{icon:"info",text:"PeerInfo.Phone.AnonymousInfo",textArgs:[document.createElement("a")],onClick:()=>{window.open("https://fragment.com/numbers","_blank")},separator:!0,multiline:!0,verify:()=>z(this,void 0,void 0,(function*(){const{isAnonymous:e}=(yield this.managers.appUsersManager.getUserPhone(this.peerId.toUserId()))||{};return e}))}]}}),this.link=new R.ZP({title:" ",subtitleLangKey:"SetUrlPlaceholder",icon:"link",clickable:()=>{const e=this.link.title.textContent;(0,a.T)(e);const t=e.includes("/c/");(0,N.Am)(b.ZP.format(t?"LinkCopiedPrivateInfo":"LinkCopied",!0))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_ShareLink",onClick:()=>{(0,r.tH)(this.link.container)}}]}}),this.location=new R.ZP({title:" ",subtitleLangKey:"ChatLocation",icon:"location"}),this.section.content.append(this.phone.container,this.username.container,this.location.container,this.bio.container,this.link.container);const{listenerSetter:e}=this;this.isDialog&&(this.notifications=new R.ZP({checkboxField:new C.Z({toggle:!0}),titleLangKey:"Notifications",icon:"unmute",listenerSetter:this.listenerSetter}),e.add(this.notifications.checkboxField.input)("change",(e=>{e.isTrusted&&this.managers.appMessagesManager.togglePeerMute({peerId:this.peerId,threadId:this.threadId})})),e.add(w.Z)("dialog_notify_settings",(e=>z(this,void 0,void 0,(function*(){if(this.peerId===e.peerId){const e=yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.threadId});this.notifications.checkboxField.checked=!e}})))),this.section.content.append(this.notifications.container)),this.element.append(this.section.container),s.Z&&this.element.append((0,L.G)()),e.add(w.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),e.add(w.Z)("peer_bio_edit",(e=>{e===this.peerId&&this.setMoreDetails(!0)}));const t=({peerId:e,threadId:t})=>z(this,void 0,void 0,(function*(){return this.peerId===e&&(!(yield this.managers.appPeersManager.isForum(this.peerId))||!this.threadId||this.threadId===t)}));e.add(w.Z)("peer_title_edit",(e=>z(this,void 0,void 0,(function*(){(yield t(e))&&(this.fillUsername(),this.setMoreDetails(!0))})))),e.add(w.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),e.add(w.Z)("contacts_update",(e=>z(this,void 0,void 0,(function*(){this.peerId===e.toPeerId()&&((yield this.managers.appUsersManager.getUser(e)).pFlags.self&&this.isDialog||this.fillUserPhone())})))),e.add(w.Z)("avatar_update",(e=>z(this,void 0,void 0,(function*(){(yield t(e))&&this.setAvatar()})))),this.setPeerStatusInterval=window.setInterval((()=>this.setPeerStatus()),6e4)}setPeerStatus(e=!1,t){return z(this,void 0,void 0,(function*(){const i=this.peerId,s=[];s.push((()=>{this.element.classList.toggle("is-me",i===w.Z.myId)}));let n=Promise.resolve();if(i&&(w.Z.myId!==i||!this.isDialog)){const t=yield this.managers.appPeersManager.isForum(this.peerId),a=this.middlewareHelper.get();n=t&&this.threadId?(0,H.Z)({peerId:i,wrapOptions:{middleware:a}}).then((({element:e})=>{this.subtitle.replaceChildren(e)})):m.Z.setPeerStatus({peerId:i,element:this.subtitle,needClear:e,useWhitespace:!0,middleware:a,ignoreSelf:!this.isDialog}),n.then((e=>e&&s.push(e)))}const a=()=>s.forEach((e=>e()));return n.then((()=>{if(t)return a;a()}))}))}cleanupHTML(){[this.bio,this.phone,this.username,this.location,this.link].forEach((e=>{e.container.style.display="none"})),this.notifications&&(this.notifications.container.style.display="",this.notifications.checkboxField.checked=!0),this.clearSetMoreDetailsTimeout()}canBeDetailed(){return this.peerId!==w.Z.myId||!this.isDialog}createAvatar(){const e=new S.Z;return e.classList.add("profile-avatar","avatar-120"),e.isDialog=this.isDialog,e.attachClickEvent(),e}_setAvatar(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this,t=!(!this.threadId||!(yield this.managers.appPeersManager.isForum(e)));if(this.canBeDetailed()&&!t&&(yield this.managers.appPeersManager.getPeerPhoto(e))){const t=this.avatars;return this.avatars=new D(this.scrollable,this.managers),yield this.avatars.setPeer(e),()=>{var e;this.avatars.info.append(this.name,this.subtitle),null===(e=this.avatar)||void 0===e||e.remove(),this.avatar=void 0,t?t.container.replaceWith(this.avatars.container):this.element.prepend(this.avatars.container),s.Z&&this.scrollable.container.classList.add("parallax")}}const i=this.createAvatar();return yield i.updateWithOptions({peerId:e,threadId:t?this.threadId:void 0,wrapOptions:{customEmojiSize:(0,u.C)(120,120),middleware:this.middlewareHelper.get()}}),()=>{var e;s.Z&&this.scrollable.container.classList.remove("parallax"),this.avatars&&(this.avatars.container.remove(),this.avatars.cleanup(),this.avatars=void 0),null===(e=this.avatar)||void 0===e||e.remove(),this.avatar=i,this.section.content.prepend(this.avatar,this.name,this.subtitle)}}))}setAvatar(e){const t=this._setAvatar();return e?t:t.then((e=>e()))}getUsernamesAlso(e){const t=e.slice(1);if(t.length){const e=t.map((e=>(0,o.Z)({username:e})));return(0,b.ag)("UsernameAlso",[(0,b.v_)(e,!1)])}}fillUsername(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=yield this.managers.appPeersManager.getPeerActiveUsernames(e),i=this.getUsernamesAlso(t);return()=>{this.username.subtitle.replaceChildren(i||(0,b.ag)("Username")),j(t[0],this.username)}}}))}fillUserPhone(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const{phone:t,isAnonymous:i}=(yield this.managers.appUsersManager.getUserPhone(e.toUserId()))||{};return()=>{this.phone.subtitle.replaceChildren((0,b.ag)(i?"AnonymousNumber":"Phone")),j(t?(0,O.Z)(t):void 0,this.phone)}}}))}fillNotifications(){return z(this,void 0,void 0,(function*(){const e=this.notifications;if(e){if(this.canBeDetailed()){const t=yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.threadId});return()=>{e.checkboxField.checked=!t}}return()=>{e.container.style.display="none"}}}))}fillName(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this,[t]=yield Promise.all([(0,U.Z)({peerId:e,dialog:this.isDialog,withIcons:!this.threadId,threadId:this.threadId})]);return()=>{(0,d.Z)(this.name,t)}}))}fillRows(e){return z(this,void 0,void 0,(function*(){return Promise.all([this.fillName(),this.fillUsername(),this.fillUserPhone(),this.fillNotifications(),this.setMoreDetails(void 0,e),this.setPeerStatus(!0,!0)]).then((e=>()=>{e.forEach((e=>null==e?void 0:e()))}))}))}fillProfileElements(){return z(this,void 0,void 0,(function*(){if(!this.cleaned)return;this.cleaned=!1,this.cleanupHTML();const e=(0,n.Z)();this.middlewareHelper.get().onClean((()=>{e.reject()}));const t=yield Promise.all([this.setAvatar(!0),this.fillRows(e)]);return()=>{e.resolve(),t.forEach((e=>null==e?void 0:e()))}}))}_setMoreDetails(e,t){return z(this,void 0,void 0,(function*(){const i=this.getMiddlewarePromise();if(this.threadId&&(yield i(this.managers.appPeersManager.isForum(e)))){let t="https://t.me/";const s=(0,g.Z)(this.threadId),n=yield i(this.managers.appPeersManager.getPeerUsername(e));return t+=n?`${n}/${s}`:`c/${e.toChatId()}/${s}`,()=>{j(t,this.link)}}const s=[];if(s.push((()=>{this.bio.subtitle.replaceChildren((0,b.ag)(e.isUser()?"UserBio":"Info")),j(t.about?(0,y.ZP)(t.about):void 0,this.bio)})),!e.isUser()){const n=yield i(this.managers.appChatsManager.getChat(e.toChatId())),a=(0,v.Z)(n);let o;if(a.length)o=this.getUsernamesAlso(a),s.push((()=>j("https://t.me/"+a[0],this.link)));else{const e=t.exported_invite;"chatInviteExported"===(null==e?void 0:e._)&&s.push((()=>j(e.link,this.link)))}s.push((()=>this.link.subtitle.replaceChildren(o||(0,b.ag)("SetUrlPlaceholder"))))}const n=t.location;return"channelLocation"==(null==n?void 0:n._)&&s.push((()=>j(n.address,this.location))),this.setMoreDetailsTimeout=window.setTimeout((()=>this.setMoreDetails(!0)),6e4),()=>{s.forEach((e=>e()))}}))}setMoreDetails(e,t){return z(this,void 0,void 0,(function*(){this.clearSetMoreDetailsTimeout();const{peerId:i}=this,s=this.getMiddlewarePromise();if(!i||!this.canBeDetailed()||(yield s(this.managers.appPeersManager.isPeerRestricted(i))))return;const n=yield s(this.managers.acknowledged.appProfileManager.getProfileByPeerId(i,e)),a=s(n.result).then((e=>z(this,void 0,void 0,(function*(){if(!(yield s(this.managers.appPeersManager.isPeerRestricted(i))))return yield s(this._setMoreDetails(i,e))}))));if(n.cached&&t)return a;(t||Promise.resolve()).then((()=>a)).then((e=>{null==e||e()}))}))}getMiddlewarePromise(){return(0,f.Z)(this.middlewareHelper.get(),(0,h.Z)("MIDDLEWARE"))}setPeer(e,t){var i;this.peerId===e&&this.threadId===t||(null===(i=this.init)||void 0===i||i.call(this),this.peerId=e,this.threadId=t,this.middlewareHelper.clean(),this.cleaned=!0)}clearSetMoreDetailsTimeout(){void 0!==this.setMoreDetailsTimeout&&(clearTimeout(this.setMoreDetailsTimeout),this.setMoreDetailsTimeout=void 0)}destroy(){var e;this.peerId=this.threadId=void 0,this.clearSetMoreDetailsTimeout(),clearInterval(this.setPeerStatusInterval),null===(e=this.avatars)||void 0===e||e.cleanup(),this.middlewareHelper.destroy()}}},8842:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(3512),n=i(2325),a=i(5565),o=i(1507),r=i(8456),d=i(130),l=i(5953),c=i(8115),h=i(493),u=(i(4755),i(5948));i(3541);function p(e,t,i,n,a){return o=this,r=void 0,l=function*(){const t=[],o=yield s.Z.managers.appPeersManager.getPeer(e);if(o.pFlags.verified&&!i&&t.push(function(){const e=document.createElement("span");e.classList.add("verified-icon","tgico");const t=document.createElementNS("http://www.w3.org/2000/svg","svg");t.setAttributeNS(null,"viewBox","0 0 26 26"),t.setAttributeNS(null,"width","26"),t.setAttributeNS(null,"height","26"),t.classList.add("verified-icon-svg");const i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS(null,"href","#verified-icon-background"),i.classList.add("verified-icon-background");const s=document.createElementNS("http://www.w3.org/2000/svg","use");return s.setAttributeNS(null,"href","#verified-icon-check"),s.classList.add("verified-icon-check"),t.append(s,i),e.append(t),e}()),!o.pFlags.fake&&!o.pFlags.scam||n||t.push((0,u.Z)(o.pFlags.scam)),o.pFlags.premium&&!a){const e=o.emoji_status;e&&e._,t.push(function(){const e=document.createElement("span");return e.classList.add("premium-icon","tgico-star"),e}())}return t},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l}var f=i(9345);const m=new WeakMap;s.Z.addEventListener("peer_title_edit",(({peerId:e,threadId:t})=>{let i=`.peer-title[data-peer-id="${e}"]`;t&&(i+=`[data-thread-id="${t}"]`),Array.from(document.querySelectorAll(i)).forEach((e=>{const t=m.get(e);null==t||t.update()}))}));class g{constructor(e){this.element=document.createElement("span"),this.element.classList.add("peer-title"),(0,d.m)(this.element),this.options={},e&&this.update(e),m.set(this.element,this)}setOptions(e){if(e){(0,l.Z)(this.options,e);for(const t in e){const i=e[t];"object"!=typeof i&&"function"!=typeof i&&(this.element.dataset[t]=i?""+("boolean"==typeof i?+i:i):"0")}}}setHasInner(e){this.hasInner!==e&&(this.hasInner=e,this.element.classList.toggle("with-icons",e))}update(e){var t,i,l,u,m,g,v,b;return m=this,g=void 0,b=function*(){this.setOptions(e);let m,g=this.options.fromName;if(void 0!==g)return void 0!==this.options.limitSymbols&&(g=(0,r.Z)(g,this.options.limitSymbols,this.options.limitSymbols)),void(0,d.Z)(this.element,(0,c.Z)(g));null!==(t=(u=this.options).peerId)&&void 0!==t||(u.peerId=o.NM);const{peerId:v,threadId:b}=this.options;if(v===s.Z.myId&&this.options.dialog)(0,a.Z)(this.element,(0,n.ag)(this.options.onlyFirstName?"Saved":"SavedMessages"));else{if(b){const[e,t]=yield Promise.all([s.Z.managers.dialogsStorage.getForumTopic(v,b),s.Z.managers.appPeersManager.isForum(v)]);if(!e&&t)return s.Z.managers.dialogsStorage.getForumTopicById(v,b).then((e=>{if(!e&&this.options.threadId===b)return this.options.threadId=void 0,void this.update({threadId:void 0});this.update()}),(()=>{this.options.threadId===b&&(this.options.threadId=void 0,this.update({threadId:void 0}))})),(0,d.Z)(this.element,(0,n.ag)("Loading")),void this.setHasInner(!1)}const e=b&&this.options.withIcons?s.Z.managers.dialogsStorage.getForumTopic(v,b).then((e=>{var t;return(0,f.e)(Object.assign(Object.assign({},null!==(t=this.options.wrapOptions)&&void 0!==t?t:{}),{topic:e}))})):void 0,[t,a,o]=yield Promise.all([(0,h.Z)(this.options),this.options.withIcons&&p(v,null===(i=this.options.wrapOptions)||void 0===i||i.middleware)||this.options.withPremiumIcon&&p(v,null===(l=this.options.wrapOptions)||void 0===l||l.middleware,!0,!0),e]);if((null==a?void 0:a.length)||o){const e=document.createElement("span");e.classList.add("peer-title-inner"),m=!0,(0,d.Z)(e,t);const i=document.createDocumentFragment();i.append(...[o,e,...null!=a?a:[]].filter(Boolean)),(0,d.Z)(this.element,i)}else(0,d.Z)(this.element,t)}this.setHasInner(m)},new((v=void 0)||(v=Promise))((function(e,t){function i(e){try{n(b.next(e))}catch(e){t(e)}}function s(e){try{n(b.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof v?n:new v((function(e){e(n)}))).then(i,s)}n((b=b.apply(m,g||[])).next())}))}}},6765:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(1168),n=i(2325),a=i(2738),o=i(8678),r=i(2312);class d extends s.Z{constructor(e={}){super("popup-avatar",{closable:!0,withConfirm:!0}),this.image=new Image,this.cropper={crop:()=>{},removeHandlers:()=>{}},this.h6=document.createElement("h6"),(0,n.$d)(this.h6,"Popup.Avatar.Title"),this.btnClose.classList.remove("btn-icon"),this.header.append(this.h6),this.cropContainer=document.createElement("div"),this.cropContainer.classList.add("crop"),this.cropContainer.append(this.image),e.isForum&&this.cropContainer.classList.add("is-forum"),this.input=document.createElement("input"),this.input.type="file",this.input.style.display="none",this.listenerSetter.add(this.input)("change",(e=>{const t=e.target.files[0];t&&(0,o.Z)(t).then((e=>{this.image=new Image,this.cropContainer.append(this.image),this.image.src=e,this.image.onload=()=>{this.show(),this.cropper=function(e,t){let i,s,n,a={},o=0,r=0,d=0,l=0,c=0;function h(){e.classList.add("crop-blur"),e.draggable=!1,n=new Image,n.src=e.src,n.draggable=!1,n.classList.add("crop-overlay-image"),t||(t=document.createElement("canvas")),i=document.createElement("div"),i.classList.add("crop-component"),s=document.createElement("div"),s.classList.add("crop-overlay");const a=document.createElement("div");a.classList.add("crop-overlay-color"),i.appendChild(s),e.parentNode.appendChild(i),i.appendChild(n),i.appendChild(e),i.appendChild(a),s.appendChild(n),n.style.maxWidth=e.width+"px",c=e.naturalWidth/e.offsetWidth;const o=e.offsetWidth/2-100,r=e.offsetHeight/2-100;u(200,200),p(o,r),f(o,r),s.addEventListener("mousedown",b,!1),s.addEventListener("touchstart",b,!1),s.addEventListener("wheel",v,!1),document.addEventListener("keypress",g,!1)}function u(e,t){d=e*c,l=t*c,s.style.width=e+"px",s.style.height=t+"px"}function p(e,t){r=t*c,o=e*c,n.style.top=-t+"px",n.style.left=-e+"px"}function f(e,t){s.style.top=t+"px",s.style.left=e+"px"}function m(e){e=e*Math.PI*2;let t,i,a,o,r=Math.floor(s.clientWidth+e),d=Math.floor(s.clientHeight+e),l=n.clientWidth,c=n.clientHeight;r<50||r>l||(t=s.offsetLeft-e/2,i=s.offsetTop-e/2,a=t+r,o=i+d,t<0&&(t=0),i<0&&(i=0),a>l||o>c||(u(r,r),p(t,i),f(t,i)))}function g(e){switch(e.preventDefault(),String.fromCharCode(e.charCode)){case"+":m(4);break;case"-":m(-4)}}function v(e){e.preventDefault(),m(e.deltaY>0?1:-1)}function b(e){e.preventDefault(),e.stopPropagation(),function(e){a.container_width=s.offsetWidth,a.container_height=s.offsetHeight,a.container_left=s.offsetLeft,a.container_top=s.offsetTop,a.mouse_x=(e.clientX||e.pageX||e.touches&&e.touches[0].clientX)+window.scrollX,a.mouse_y=(e.clientY||e.pageY||e.touches&&e.touches[0].clientY)+window.scrollY}(e),document.addEventListener("mousemove",w),document.addEventListener("touchmove",w),document.addEventListener("mouseup",y),document.addEventListener("touchend",y)}function y(e){e.preventDefault(),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",w),document.removeEventListener("touchmove",w)}function w(e){let t,i,o,r,d={x:0,y:0};e.preventDefault(),e.stopPropagation(),d.x=e.pageX||e.touches&&e.touches[0].pageX,d.y=e.pageY||e.touches&&e.touches[0].pageY,t=d.x-(a.mouse_x-a.container_left),i=d.y-(a.mouse_y-a.container_top),o=s.offsetWidth,r=s.offsetHeight,t<0?t=0:t>n.offsetWidth-o&&(t=n.offsetWidth-o),i<0?i=0:i>n.offsetHeight-r&&(i=n.offsetHeight-r),p(t,i),f(t,i)}return e.complete?h():e.onload=h,{crop:function(){t.width=d,t.height=l,t.getContext("2d").drawImage(e,o,r,d,l,0,0,d,l)},removeHandlers:function(){s.removeEventListener("mousedown",b),s.removeEventListener("touchstart",b),s.removeEventListener("wheel",v),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",w),document.removeEventListener("touchmove",w),document.removeEventListener("keypress",g),i.remove(),s.remove(),n.remove()}}}(this.image,this.canvas),this.input.value=""}}))}),!1),this.btnConfirm.className="btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1",(0,a.fc)(this.btnConfirm,(()=>{this.cropper.crop(),this.hide(),this.canvas.toBlob((e=>{this.blob=e,this.darkenCanvas(),this.resolve()}),"image/jpeg",1)}),{listenerSetter:this.listenerSetter}),this.container.append(this.cropContainer,this.btnConfirm,this.input),this.addEventListener("closeAfterTimeout",(()=>{this.cropper.removeHandlers(),this.image&&this.image.remove()}))}resolve(){this.onCrop((()=>r.Z.upload(this.blob)))}open(e,t){this.canvas=e,this.onCrop=t,this.input.click()}darkenCanvas(){const e=this.canvas.getContext("2d");e.fillStyle="rgba(0, 0, 0, 0.3)",e.fillRect(0,0,this.canvas.width,this.canvas.height)}}},6194:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(1168),n=i(7362),a=i(8127);class o{constructor(e,t,i,s){this.peerId=e,this.peerType=t,this.onSelect=i,this.threadId=s,this.construct()}construct(){return e=this,t=void 0,o=function*(){let{peerId:e,peerType:t,onSelect:i,threadId:o}=this;const r=yield(0,n.Z)({peerId:e,threadId:o}),d=s.Z.MANAGERS;void 0===t&&(t=yield d.appPeersManager.getDialogType(e));const l=(t,s=g&&!!t.size)=>{let n=d.appChatsManager.leave(e.toChatId());s&&(n=n.then((()=>d.appMessagesManager.flushHistory(e)))),null==i||i(n)},c=t=>{let s;if(o)s=d.appMessagesManager.flushHistory(e,!1,!0,o);else if(e.isUser())s=d.appMessagesManager.flushHistory(e,!1,g?!!t.size:void 0);else{if(!t.size)return l(t);s=d.appChatsManager.delete(e.toChatId())}null==i||i(s)};let h,u,p,f,m,g;switch(t){case"channel":(yield d.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(h="ChannelDeleteMenu",p="AreYouSureDeleteAndExitChannel",m=[{langKey:"ChannelDeleteMenu",isDanger:!0,callback:c}],g=[{text:"DeleteChannelForAll"}]):(h="LeaveChannelMenu",p="ChannelLeaveAlertWithName",f=[r],m=[{langKey:"LeaveChannel",isDanger:!0,callback:l}]);break;case"chat":h="DeleteChatUser",p="AreYouSureDeleteThisChatWithUser",f=[r],m=[{langKey:"DeleteChatUser",isDanger:!0,callback:c}],g=[{text:"DeleteMessagesOptionAlso",textArgs:[yield(0,n.Z)({peerId:e})]}];break;case"saved":h="DeleteChatUser",p="AreYouSureDeleteThisChatSavedMessages",m=[{langKey:"DeleteChatUser",isDanger:!0,callback:c}];break;case"megagroup":case"group":o?(h="DeleteTopics",u=[1],p="DeleteSelectedTopic",f=[r],m=[{langKey:"Delete",isDanger:!0,callback:c}]):(yield d.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(h="DeleteMegaMenu",p="AreYouSureDeleteAndExit",m=[{langKey:"DeleteMegaMenu",isDanger:!0,callback:c}],g=[{text:"DeleteChat.DeleteGroupForAll"}]):(h="LeaveMegaMenu",p="AreYouSureDeleteAndExitName",f=[r],m=[{langKey:"DeleteChatUser",isDanger:!0,callback:e=>l(e,!0)}])}new a.Z("popup-delete-chat",{peerId:e,threadId:o,titleLangKey:h,titleLangArgs:u,descriptionLangKey:p,descriptionLangArgs:f,buttons:m,checkboxes:g}).show()},new((i=void 0)||(i=Promise))((function(s,n){function a(e){try{d(o.next(e))}catch(e){n(e)}}function r(e){try{d(o.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,r)}d((o=o.apply(e,t||[])).next())}));var e,t,i,o}}},5128:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(3512),n=i(1168),a=i(8127),o=i(2325),r=i(7120),d=i(2353),l=i(7362),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class h{constructor(e,t,i,s,n){this.peerId=e,this.mids=t,this.type=i,this.onConfirm=s,this.threadId=n,this.construct()}construct(){return c(this,void 0,void 0,(function*(){let{peerId:e,mids:t,type:i,onConfirm:h,threadId:u}=this;const p=yield(0,l.Z)({peerId:e,threadId:u}),f=n.Z.MANAGERS;t=t.slice();const m=(s,n)=>{h&&h(),"scheduled"===i?f.appMessagesManager.deleteScheduledMessages(e,t):f.appMessagesManager.deleteMessages(e,t,!!s.size||n)},g=[{langKey:"Delete",isDanger:!0,callback:m}],v=[];let b,y,w,S;if(1===t.length?b="DeleteSingleMessagesTitle":(b="DeleteMessagesTitle",y=[(0,o.ag)("messages",[t.length])]),w=(yield f.appPeersManager.isMegagroup(e))?1===t.length?"AreYouSureDeleteSingleMessageMega":"AreYouSureDeleteFewMessagesMega":1===t.length?"AreYouSureDeleteSingleMessage":"AreYouSureDeleteFewMessages",e===s.Z.myId||"scheduled"===i);else if(e.isUser())v.push({text:"DeleteMessagesOptionAlso",textArgs:[p]});else{const i=yield f.appChatsManager.getChat(e.toChatId()),n=(0,r.Z)(i,"delete_messages");if("chat"===i._){const i=n?t.slice():yield(0,d.Z)(t,(t=>c(this,void 0,void 0,(function*(){return(yield f.appMessagesManager.getMessageByPeer(e,t)).fromId===s.Z.myId}))));i.length&&(i.length===t.length?v.push({text:"DeleteForAll"}):(v.push({text:"DeleteMessagesOption"}),w="DeleteMessagesTextGroup",S=[(0,o.ag)("messages",[i.length])]))}else g[0].callback=e=>m(e,!0)}(0,n.x)(g),new a.Z("popup-delete-chat",{peerId:e,threadId:u,titleLangKey:b,titleLangArgs:y,descriptionLangKey:w,descriptionLangArgs:S,buttons:g,checkboxes:v}).show()}))}}},4524:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(4271),n=i(2995);class a extends n.Z{constructor(e,t,i=!1){super({peerTypes:["dialogs","contacts"],onSelect:i?t:i=>{return n=this,a=void 0,r=function*(){if(t){const e=t(i);e instanceof Promise&&(yield e)}s.Z.setInnerPeer({peerId:i}),s.Z.chat.input.initMessagesForward(e)},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}d((r=r.apply(n,a||[])).next())}));var n,a,o,r},placeholder:"ShareModal.Search.ForwardPlaceholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})}}},1168:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L,x:()=>E});var s=i(1405),n=i(5814),a=i(6385),o=i(2325),r=i(8497),d=i(8799),l=i(3699),c=i(2738),h=i(6299),u=i(3910),p=i(3241),f=i(6733),m=i(1655),g=i(3815),v=i(8805),b=i(3624),y=i(8115);const w=document.body;let S=w;const C=()=>{S=(0,f.W7)()||w,L.reAppend()};(0,f.Ms)(w,C);class L extends p.Z{constructor(e,t={}){if(super(!1),this.element=document.createElement("div"),this.container=document.createElement("div"),this.header=document.createElement("div"),this.title=document.createElement("div"),this.onEscape=()=>!0,this.hide=()=>{a.Z.backByItem(this.navigationItem)},this.element.classList.add("popup"),this.element.className="popup"+(e?" "+e:""),this.container.classList.add("popup-container","z-depth-1"),this.header.classList.add("popup-header"),(t.title||t.titleRaw)&&(this.title.classList.add("popup-title"),"string"==typeof t.title?(0,o.$d)(this.title,t.title):t.titleRaw&&this.title.append((0,y.Z)(t.titleRaw)),this.header.append(this.title)),this.middlewareHelper=(0,b.k)(),this.listenerSetter=new l.Z,this.managers=L.MANAGERS,this.confirmShortcutIsSendShortcut=t.confirmShortcutIsSendShortcut,t.closable&&(this.btnClose=document.createElement("span"),this.btnClose.classList.add("btn-icon","popup-close","tgico-close"),this.header.prepend(this.btnClose),(0,c.fc)(this.btnClose,this.hide,{listenerSetter:this.listenerSetter,once:!0})),this.withoutOverlay=t.withoutOverlay,this.withoutOverlay&&this.element.classList.add("no-overlay"),t.overlayClosable&&(0,c.fc)(this.element,(e=>{(0,r.Z)(e.target,"popup-container")||this.hide()}),{listenerSetter:this.listenerSetter}),t.withConfirm&&(this.btnConfirm=document.createElement("button"),this.btnConfirm.classList.add("btn-primary","btn-color-primary"),!0!==t.withConfirm&&this.btnConfirm.append((0,o.ag)(t.withConfirm)),this.header.append(this.btnConfirm),(0,s.Z)(this.btnConfirm)),this.container.append(this.header),t.body&&(this.body=document.createElement("div"),this.body.classList.add("popup-body"),this.container.append(this.body)),t.scrollable){const e=this.scrollable=new v.ZP(this.body);this.attachScrollableListeners(),this.body||this.container.insertBefore(e.container,this.header.nextSibling)}let i=this.btnConfirm;const n=this.buttons=t.buttons;if(null==n?void 0:n.length){const e=this.buttonsEl=document.createElement("div");e.classList.add("popup-buttons");const t=n.map((e=>{const t=document.createElement("button");return t.className="btn"+(e.isDanger?" danger":" primary"),e.noRipple||(0,s.Z)(t),e.text?t.textContent=e.text:t.append((0,o.ag)(e.langKey,e.langArgs)),(0,c.fc)(t,(()=>{var t;null===(t=e.callback)||void 0===t||t.call(e),this.destroy()}),{listenerSetter:this.listenerSetter,once:!0}),e.element=t}));if(!i&&2===n.length){const e=n.find((e=>!e.isCancel));e&&(i=e.element)}e.append(...t),this.container.append(e)}this.btnConfirmOnEnter=i,this.element.append(this.container),L.POPUPS.push(this)}attachScrollableListeners(e){return this.scrollable.attachBorderListeners(e)}onContentUpdate(){this.scrollable&&this.scrollable.onAdditionalScroll()}show(){this.navigationItem={type:"popup",onPop:()=>this.destroy(),onEscape:this.onEscape},a.Z.pushItem(this.navigationItem),(0,d.Z)(),S.append(this.element),this.element.offsetWidth,this.element.classList.add("active"),this.onContentUpdate(),this.withoutOverlay||(g.Z.isOverlayActive=!0,n.Z.checkAnimations2(!0)),setTimeout((()=>{this.element.classList.contains("active")&&this.listenerSetter.add(document.body)("keydown",(e=>{L.POPUPS[L.POPUPS.length-1]===this&&(this.confirmShortcutIsSendShortcut?(0,h.Z)(e):"Enter"===e.key)&&((0,c.tH)(this.btnConfirmOnEnter),(0,u.Z)(e))}))}),0)}destroy(){this.dispatchEvent("close"),this.element.classList.add("hiding"),this.element.classList.remove("active"),this.listenerSetter.removeAll(),this.middlewareHelper.destroy(),this.withoutOverlay||(g.Z.isOverlayActive=!1),a.Z.removeItem(this.navigationItem),this.navigationItem=void 0,(0,m.Z)(L.POPUPS,this),C(),setTimeout((()=>{var e;this.element.remove(),this.dispatchEvent("closeAfterTimeout"),this.cleanup(),null===(e=this.scrollable)||void 0===e||e.destroy(),this.withoutOverlay||n.Z.checkAnimations2(!1)}),150)}static reAppend(){this.POPUPS.forEach((e=>{const{element:t,container:i}=e,s=t.parentElement;s&&s!==S&&S!==i&&S.append(t)}))}static getPopups(e){return this.POPUPS.filter((t=>t instanceof e))}static createPopup(e,...t){return new e(...t)}}L.POPUPS=[];const E=e=>(e.find((e=>e.isCancel))||e.push({langKey:"Cancel",isCancel:!0}),e)},3186:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3035),n=i(4271),a=i(2325),o=i(3512),r=i(8127);const d={pin:{title:"LimitReached",description:"LimitReachedPinDialogs",descriptionPremium:"LimitReachedPinDialogsPremium",descriptionLocked:"LimitReachedPinDialogsLocked",icon:"limit_pin"},folders:{title:"LimitReached",description:"LimitReachedFolders",descriptionPremium:"LimitReachedFoldersPremium",descriptionLocked:"LimitReachedFoldersLocked",icon:"limit_folders"}};class l extends r.Z{constructor(e,t){super("popup-limit",{buttons:void 0===e.isPremium?[{langKey:"LimitReached.Ok",isCancel:!0}]:e.isPremium?[{langKey:"OK",isCancel:!0}]:[{langKey:"IncreaseLimit",callback:()=>{n.Z.openPremiumBot()},noRipple:!0},{langKey:"Cancel",isCancel:!0}],descriptionLangKey:void 0===e.isPremium?t.descriptionLocked:e.isPremium?t.descriptionPremium:t.description,descriptionLangArgs:e.isPremium?[e.limitPremium]:[e.limit,e.limitPremium],titleLangKey:t.title});const i=void 0===e.isPremium;if(i)this.element.classList.add("is-locked");else if(e.isPremium)this.element.classList.add("is-premium");else{const e=this.buttons.find((e=>!e.isCancel));e.element.classList.add("popup-limit-button");const t=document.createElement("i");t.classList.add("popup-limit-button-icon","tgico-premium_double"),e.element.append(t)}const r=document.createElement("div");r.classList.add("popup-limit-line");const d=document.createElement("div");d.classList.add("popup-limit-hint");const l=document.createElement("span");if(l.classList.add("popup-limit-hint-icon","tgico-"+t.icon),d.append(l,""+(e.isPremium?e.limitPremium:e.limit)),r.append(d),!i){const t=document.createElement("div");t.classList.add("limit-line");const i=document.createElement("div");i.classList.add("limit-line-free");const s=document.createElement("div");s.classList.add("limit-line-premium"),t.append(i,s),(0,a.$d)(i,"LimitFree"),s.append((0,a.ag)("LimitPremium"),""+e.limitPremium),r.append(t)}this.container.insertBefore(r,this.description);const c=()=>{d.classList.add("active")};o.Z.settings.animationsEnabled?(0,s.d1)().then(c):c()}}function c(e){return function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))}(this,void 0,void 0,(function*(){const t=d[e],[i,s,n]=yield Promise.all([o.Z.managers.apiManager.getAppConfig(),...[!1,!0].map((t=>o.Z.managers.apiManager.getLimit(e,t)))]),a=i.premium_purchase_blocked;new l({isPremium:a?void 0:o.Z.premium,limit:s,limitPremium:n},t).show()}))}},3897:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(7298),n=i(1507),a=i(7479),o=i(8127);const r=[{value:3600,langPackKey:"ChatList.Mute.1Hour"},{value:14400,langPackKey:"ChatList.Mute.4Hours"},{value:28800,langPackKey:"ChatList.Mute.8Hours"},{value:86400,langPackKey:"ChatList.Mute.1Day"},{value:259200,langPackKey:"ChatList.Mute.3Days"},{value:-1,langPackKey:"ChatList.Mute.Forever",checked:!0}];class d extends o.Z{constructor(e,t){let i;super("popup-mute",{peerId:e,titleLangKey:"Notifications",buttons:[{langKey:"ChatList.Context.Mute",callback:()=>{this.managers.appMessagesManager.mutePeer({peerId:e,muteUntil:-1===i?n.rU:(0,s.Z)(!0)+i,threadId:t})}}],body:!0});const o=(0,a.ZC)(r,(e=>{i=+e}));this.body.append(o),this.show()}}},8127:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(9331),n=i(1168),a=i(2325),o=i(9807),r=i(130);class d extends n.Z{constructor(e,t={}){if(super("popup-peer"+(e?" "+e:""),Object.assign(Object.assign({overlayClosable:!0},t),{title:!0,buttons:t.buttons&&(0,n.x)(t.buttons)})),this.className=e,t.peerId){const e=new s.Z;e.classList.add("avatar-32"),e.updateWithOptions({isDialog:!0,peerId:t.peerId,threadId:t.threadId,wrapOptions:{middleware:this.middlewareHelper.get()}}),this.header.prepend(e)}t.noTitle||(t.titleLangKey||!t.title?this.title.append((0,a.ag)(t.titleLangKey||"AppName",t.titleLangArgs)):t.title instanceof HTMLElement?this.title.append(t.title):this.title.innerText=t.title||"");const i=document.createDocumentFragment();if(t.descriptionLangKey||t.description){const e=this.description=document.createElement("p");e.classList.add("popup-description"),t.descriptionLangKey?e.append((0,a.ag)(t.descriptionLangKey,t.descriptionLangArgs)):t.description&&(0,r.Z)(e,t.description),i.append(e)}t.checkboxes&&(this.container.classList.add("have-checkbox"),t.checkboxes.forEach((e=>{e.withRipple=!0;const t=new o.Z(e);e.checkboxField=t,i.append(t.label)})),t.buttons.forEach((e=>{if(e.callback){const i=e.callback;e.callback=()=>{const e=new Set;t.checkboxes.forEach((t=>{t.checkboxField.checked&&e.add(t.text)})),i(e)}}}))),this.container.insertBefore(i,this.header.nextElementSibling)}}},2995:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5432),n=i(5644),a=i(1168);class o extends a.Z{constructor(e){super("popup-forward",{closable:!0,overlayClosable:!0,body:!0,title:!0}),this.selector=new n.Z({appendTo:this.body,onChange:()=>{return t=this,i=void 0,n=function*(){const t=this.selector.getSelected(),i=t[t.length-1].toPeerId();if(e.onSelect){const t=e.onSelect(i);if(t instanceof Promise)try{yield t}catch(e){return}}this.selector=null,this.hide()},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n},peerType:e.peerTypes,onFirstRender:()=>{this.show(),this.selector.checkForTriggers(),s.Z||this.selector.input.focus()},chatRightsAction:e.chatRightsAction,multiSelect:!1,rippleEnabled:!1,avatarSize:"abitbigger",peerId:e.peerId,placeholder:e.placeholder,selfPresence:e.selfPresence,managers:this.managers}),this.scrollable=this.selector.scrollable,this.attachScrollableListeners(),this.title.append(this.selector.input)}}},1962:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(8127);class n extends s.Z{constructor(e,t,i){super("popup-delete-chat",{title:`Send Message${t.length>1?"s":""} Now`,description:t.length>1?"Send "+t.length+" messages now?":"Send message now?",buttons:[{langKey:"Send",callback:()=>{i&&i(),this.managers.appMessagesManager.sendScheduledMessages(e,t)}}]}),this.show()}}},6787:(e,t,i)=>{"use strict";i.d(t,{Z:()=>P});var s=i(1168),n=i(3541),a=i(2153),o=i(279),r=i(5814),d=i(4271),l=i(4755),c=i(2325),h=i(4494),u=i(8497),p=i(1656),f=i(2738),m=i(2796),g=i(130),v=i(8115),b=i(3163),y=i(9259),w=i(7479),S=i(5565),C=i(3512),L=i(9083),E=i(3173),I=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const M="STICKERS-POPUP";class P extends s.Z{constructor(e,t){super("popup-stickers",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:!0}),this.stickerSetInput=e,this.isEmojis=t,this.onStickersClick=e=>I(this,void 0,void 0,(function*(){const t=(0,u.Z)(e.target,"sticker-set-sticker");if(!t)return;const i=t.dataset.docId;(yield d.Z.chat.input.sendMessageWithDocument(i))&&this.hide()})),this.title.append((0,c.ag)("Loading")),this.updateAdded={},E.ZP.setIgnoreMouseOut("popup",!0),this.addEventListener("close",(()=>{E.ZP.setIgnoreMouseOut("popup",!1),r.Z.setOnlyOnePlayableGroup()})),this.appendTo=this.scrollable.container,this.appendTo.classList.add("is-loading"),(0,o.y)(this.appendTo,!0),this.stickersFooter=document.createElement("div"),this.stickersFooter.classList.add("sticker-set-footer");const i=(0,h.Z)("btn-primary btn-primary-transparent disable-hover",{noRipple:!0,text:"Loading"});this.stickersFooter.append(i),this.body.append(this.stickersFooter),(0,y.Z)({listenTo:this.appendTo,listenerSetter:this.listenerSetter});const s=e=>{const t=this.sets.findIndex((t=>t.id===e.id));if(-1===t)return;this.sets[t]=e;const i=this.updateAdded[e.id];null==i||i(!!e.installed_date),this.updateButton()};this.listenerSetter.add(C.Z)("stickers_installed",s),this.listenerSetter.add(C.Z)("stickers_deleted",s),this.loadStickerSet()}createStickerSetElements(e){const t=document.createElement("div");let i,s;t.classList.add("sticker-set"),e&&(i=new w.ZP({title:(0,v.Z)(e.title),subtitle:(0,c.ag)(e.pFlags.emojis?"EmojiCount":"Stickers",[e.count]),buttonRight:!0}),s=e=>{(0,S.Z)(i.buttonRight,(0,c.ag)(e?"Stickers.SearchAdded":"Stickers.SearchAdd")),i.buttonRight.classList.toggle("active",e)},s(!!e.installed_date),t.append(i.container));const n=document.createElement("div");return n.classList.add("sticker-set-stickers"),t.append(n),{container:t,headerRow:i,updateAdded:s,itemsContainer:n}}loadStickerSet(){var e;return I(this,void 0,void 0,(function*(){const t=this.middlewareHelper.get(),i=(Array.isArray(this.stickerSetInput)?this.stickerSetInput:[this.stickerSetInput]).map((e=>this.managers.appStickersManager.getStickerSet(e)));let s=yield Promise.all(i);if(!t())return;let o=s[0];if(1===s.length&&!o)return(0,m.bC)({langPackKey:this.isEmojis?"AddEmojiNotFound":"StickerSet.DontExist"}),void this.hide();s=s.filter(Boolean),o=s[0],this.sets=s.map((e=>e.set));const d=null!==(e=this.isEmojis)&&void 0!==e?e:this.isEmojis=!!o.set.pFlags.emojis;if(!d){(0,f.fc)(this.appendTo,this.onStickersClick,{listenerSetter:this.listenerSetter});const{destroy:e}=(0,b.Z)({listenTo:this.appendTo,isStickerPack:!0,onSend:()=>this.hide()});this.addEventListener("close",e)}r.Z.setOnlyOnePlayableGroup(M);const u=new a.Z,y=[],w=s.map((e=>I(this,void 0,void 0,(function*(){const{container:i,itemsContainer:a,headerRow:o,updateAdded:r}=this.createStickerSetElements(s.length>1?e.set:void 0);let c;o&&(0,f.fc)(o.buttonRight,(()=>{this.managers.appStickersManager.toggleStickerSet(e.set)}),{listenerSetter:this.listenerSetter}),this.updateAdded[e.set.id]=r;const h=e.documents.filter((e=>"document"===(null==e?void 0:e._)));if(d){const e=(0,L.Z)({docIds:h.map((e=>e.id)),loadPromises:y,animationGroup:M,customEmojiSize:l.Z.active.esgCustomEmoji,middleware:t});Array.from(e.children).slice(1).forEach((e=>{const t=document.createElement("span");t.classList.add("super-emoji"),e.replaceWith(t),t.append(e)})),c=[e],a.classList.replace("sticker-set-stickers","super-emojis"),a.classList.add("is-emojis","not-local")}else c=yield Promise.all(h.map((e=>I(this,void 0,void 0,(function*(){const i=document.createElement("div");i.classList.add("sticker-set-sticker");const s=l.Z.active.popupSticker.width;return yield(0,n.ZP)({doc:e,div:i,lazyLoadQueue:u,group:M,play:!0,loop:!0,width:s,height:s,withLock:!0,loadPromises:y,middleware:t}),i})))));return a.append(...c.filter(Boolean)),i})))),S=yield Promise.all(w);yield Promise.all(y);const C=this.button=(0,h.Z)("",{noRipple:!0});this.updateButton(),(0,f.fc)(C,(()=>{const e=(0,p.Z)([C],!0);this.managers.appStickersManager.toggleStickerSets(s.map((e=>e.set))).then((()=>{this.hide()})).catch((()=>{e()}))}),{listenerSetter:this.listenerSetter}),1===s.length?(0,g.Z)(this.title,(0,v.Z)(o.set.title)):(0,g.Z)(this.title,(0,c.ag)("Emoji")),this.stickersFooter.textContent="",this.stickersFooter.append(C),this.appendTo.classList.remove("is-loading"),this.appendTo.textContent="",this.appendTo.append(...S),this.scrollable.onAdditionalScroll()}))}updateButton(){const{sets:e,isEmojis:t}=this;let i,s;if(1===e.length){const n=e[0];s=(0,c.ag)(t?"EmojiCount":"Stickers",[n.count]),i=!n.installed_date}else{const t=e.filter((e=>e.installed_date));let n;e.length===t.length?(i=!1,n=e.length):(i=!0,n=e.length-t.length),s=(0,c.ag)("EmojiPackCount",[n])}this.button.className=i?"btn-primary btn-color-primary":"btn-primary btn-primary-transparent danger",(0,S.Z)(this.button,(0,c.ag)(i?"AddStickersCount":"RemoveStickersCount",[s]))}}},3442:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l});var s=i(9099),n=i(3035),a=i(3910),o=i(2738),r=i(8487),d=i(5953);class l{constructor(e){this.tempId=0,this.detached=!0,this.promise=null,this.isUpload=!1,this.cancelable=!0,this.streamable=!1,this.tryAgainOnFail=!0,this.attachMethod="append",this.onClick=e=>{e&&(0,a.Z)(e),this.preloader.classList.contains("manual")?this.loadFunc&&this.loadFunc(e):this.promise&&this.promise.cancel&&this.promise.cancel()},e&&(0,d.Z)(this,e),this.isUpload&&(this.tryAgainOnFail=!1)}constructContainer(e={}){this.preloader||(this.preloader=document.createElement("div"),this.preloader.classList.add("preloader-container"),e.color&&this.preloader.classList.add("preloader-"+e.color),e.bold&&this.preloader.classList.add("preloader-bold"),this.streamable&&this.preloader.classList.add("preloader-streamable"))}constructDownloadIcon(){this.constructContainer()}construct(){this.construct=null,this.constructContainer(),this.preloader.innerHTML=`\n
\n \n \n \n
`,this.streamable?this.totalLength=118.61124420166016:this.totalLength=149.82473754882812,this.cancelable?(this.preloader.innerHTML+='\n \n \n \n \n \n \n \n \n \n \n \n ',this.downloadSvg=this.preloader.lastElementChild,this.cancelSvg=this.downloadSvg.previousElementSibling):this.preloader.classList.add("preloader-swing"),this.circle=this.preloader.firstElementChild.firstElementChild.firstElementChild,this.cancelable&&(0,o.fc)(this.preloader,this.onClick)}setDownloadFunction(e){this.loadFunc=e}setManual(){this.preloader.classList.add("manual"),this.setProgress(0)}attachPromise(e){if(this.isUpload&&this.promise)return;this.promise=e;const t=--this.tempId,i=Date.now(),s=s=>{if(e.notify=e.notifyAll=null,t!==this.tempId)return;const a=Date.now()-i;if(!s&&this.cancelable){this.setProgress(100);const e=150;a{t===this.tempId&&this.detach()}),e)}else this.tryAgainOnFail?(this.attach(this.preloader.parentElement),(0,n.T2)((()=>{this.setManual()}))):this.detach();this.promise=e=null};e.then((()=>s(null))).catch((e=>s(e))),e.addNotifyListener&&e.addNotifyListener((e=>{if(t!==this.tempId)return;const i=e.done/e.total*100;this.setProgress(i)}))}attach(e,t=!1,i){this.construct&&this.construct(),this.preloader.parentElement&&this.preloader.classList.remove("manual"),this.detached=!1,i&&this.attachPromise(i);let n=0;(this.detached||this.preloader.parentElement!==e)&&(n=(0,r.Z)(this.preloader)?1:2,this.preloader.parentElement!==e&&e[this.attachMethod](this.preloader)),(0,s.Z)({element:this.preloader,className:"is-visible",forwards:!0,duration:200,useRafs:n}),this.cancelable&&t&&this.setProgress(0)}detach(){var e;this.detached||(this.detached=!0,(null===(e=this.preloader)||void 0===e?void 0:e.parentElement)&&(0,s.Z)({element:this.preloader,className:"is-visible",forwards:!1,duration:200,onTransitionEnd:()=>{this.preloader.remove()},useRafs:1}))}setProgress(e){if(this.totalLength||(0,r.Z)(this.circle))if(0!==e)try{this.totalLength||(this.totalLength=this.circle.getTotalLength()),this.circle.style.strokeDasharray=Math.max(5,e/100*this.totalLength)+", "+this.totalLength}catch(e){}else this.circle.style.strokeDasharray=""}}},9931:(e,t,i)=>{"use strict";i.d(t,{Z:()=>b,Y:()=>g});var s=i(4059),n=i(6740),a=i(5565),o=i(130),r=i(9674),d=i(5990),l=i(7256),c=i(1507),h=i(5798),u=i(3512),p=i(9345),f=i(319),m=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function g(e,t,i,o,d=new Image,l=!1){return m(this,void 0,void 0,(function*(){const l=yield u.Z.managers.acknowledged.appAvatarsManager.loadAvatar(t,i,o),c=l.result,h=l.cached;let p,m,v;if(d.classList.add("avatar-photo"),h)m=()=>{(0,a.Z)(e,d),e.dataset.color=""};else{const l=u.Z.settings.animationsEnabled;l&&d.classList.add("fade-in");let c=!1;if("photo_big"===o){const s=yield g(e,t,i,"photo_small");p=s.loadThumbPromise||s.loadPromise,v=s.thumbImage}else if(i.stripped_thumb){v=new Image,e.classList.add("avatar-relative"),v.classList.add("avatar-photo","avatar-photo-thumbnail");const t=(0,s.Z)(i.stripped_thumb);p=(0,n.cj)(v,t).then((()=>{c||(0,a.Z)(e,v)}))}m=()=>{c=!0,v?e.append(d):(0,a.Z)(e,d),setTimeout((()=>{e.childElementCount&&r.Z.mutateElement(d,(()=>{e.dataset.color="",l&&d.classList.remove("fade-in"),null==v||v.remove()}))}),l?200:0)}}const b=c.then((e=>(0,n.cj)(d,e))).then(m);return p&&(yield p.catch(f.Z)),{cached:h,loadPromise:b,loadThumbPromise:h?b:p||Promise.resolve(),thumbImage:v}}))}function v(e,t,i,s,n,a){(0,o.Z)(e,t),e.dataset.color=i,e.classList.remove("tgico-saved","tgico-deletedaccount","tgico-reply_filled","is-forum","is-topic"),s&&e.classList.add(s),n&&e.classList.add("is-forum"),a&&e.classList.add("is-topic")}function b({div:e,peerId:t,isDialog:i=!1,title:s="",onlyThumb:n=!1,isBig:a,threadId:o,wrapOptions:r={}}){var f,b;return m(this,void 0,void 0,(function*(){const m=u.Z.myId;if(t===m&&i)return void v(e,"","","tgico-saved");const y=u.Z.managers;if(o){const i=yield y.dialogsStorage.getForumTopic(t,o);return v(e,"","",void 0,void 0,!0),r.customEmojiSize&&e.style.setProperty("--size",r.customEmojiSize.width+"px"),(0,p.e)(Object.assign(Object.assign({},r),{topic:i,lazyLoadQueue:!1})).then((t=>{e.replaceChildren(t)}))}const w=yield y.appPeersManager.getPeer(t);if(t!==c.NM&&t.isUser()&&(null===(f=null==w?void 0:w.pFlags)||void 0===f?void 0:f.deleted))return void v(e,"",(0,d.Z)(t),"tgico-deletedaccount");const S=!!(null===(b=null==w?void 0:w.pFlags)||void 0===b?void 0:b.forum),C=a?"photo_big":"photo_small",L=(0,l.Z)(w),E=!!L,I=!!e.firstElementChild&&!e.firstElementChild.classList.contains("emoji");if(!E||!I||!(yield y.appAvatarsManager.isAvatarCached(t,C))){let n="";if(!t||t===m&&i||(n=(0,d.Z)(t)),t===c.hj)return void v(e,"",n,"tgico-reply_filled");const a=s?(0,h.Z)(s):function(e){var t;let i="";return e&&(i=null!==(t=e.title)&&void 0!==t?t:[e.first_name,e.last_name].filter(Boolean).join(" ")),(0,h.Z)(i)}(w);v(e,a,n,"",S)}return E?g(e,t,L,C,void 0,n):void 0}))}},279:(e,t,i)=>{"use strict";function s(e,t=!1){const i='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=i,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",i),e.lastElementChild}function n(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,s(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.d(t,{p:()=>n,y:()=>s}),i(410).GO.putPreloader=s},1218:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(9750),n=i(2325),a=i(3855),o=i(3512);class r{constructor(e){const t=this.label=document.createElement("label");t.classList.add("radio-field"),e.alignRight&&t.classList.add("radio-field-right");const i=this.input=document.createElement("input");i.type="radio",i.name="input-radio-"+e.name,e.value&&(i.value=e.value,e.stateKey&&(a.Z.getState().then((t=>{i.checked=(0,s.Z)(t,e.stateKey)===e.value})),i.addEventListener("change",(()=>{o.Z.managers.appStateManager.setByKey(e.stateKey,e.value)}))));const r=this.main=document.createElement("div");r.classList.add("radio-field-main"),e.text?r.innerHTML=e.text:e.langKey&&(0,n.$d)(r,e.langKey),t.append(i,r)}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}}},5133:(e,t,i)=>{"use strict";function s(e,t){const i=document.createElement("form");return e.forEach((e=>{const{container:s,input:n}=e;i.append(s),n.addEventListener("change",(e=>{n.checked&&t(n.value,e)}))})),i}i.d(t,{Z:()=>s})},65:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5077),n=i(3228),a=i(5953);class o{constructor(e,t=0){this.mousedown=!1,this.events={},this.withTransition=!1,this.useTransform=!1,this.vertical=!1,this.onMouseMove=e=>{this.scrub(e)},this.onMouseDown=e=>{var t;this.rect=this.container.getBoundingClientRect(),this.mousedown=!0,this.scrub(e),this.container.classList.add("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseDown)&&this.events.onMouseDown(e)},this.onMouseUp=e=>{var t;this.mousedown=!1,this.container.classList.remove("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseUp)&&this.events.onMouseUp(e)},this.onInput=()=>{var e;const t=+this.seek.value;this.setFilled(t),(null===(e=this.events)||void 0===e?void 0:e.onScrub)&&this.events.onScrub(t)},(0,a.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("progress-line"),this.useTransform?this.container.classList.add("use-transform"):this.withTransition&&this.container.classList.add("with-transition"),this.filled=document.createElement("div"),this.filled.classList.add("progress-line__filled");const i=this.seek=document.createElement("input");i.classList.add("progress-line__seek"),i.type="range",i.step=""+this.step,i.min=""+this.min,i.max=""+this.max,i.value=""+t,t&&this.setProgress(t);const s=""+this.step,n=s.indexOf(".");this.decimals=-1===n?0:s.length-n-1,this.container.append(this.filled,i)}get value(){return+this.seek.value}setHandlers(e){this.events=e}setListeners(){this.seek.addEventListener("input",this.onInput),this._removeListeners=(0,s.Z)(this.container,this.onMouseDown,this.onMouseMove,this.onMouseUp)}setProgress(e){this.seek.value=""+e,this.setFilled(+this.seek.value)}addProgress(e){this.seek.value=""+(+this.seek.value+e),this.setFilled(+this.seek.value)}setFilled(e){let t=(e-this.min)/(this.max-this.min);t=(0,n.Z)(t,0,1),this.useTransform?this.filled.style.transform=`scaleX(${t})`:this.filled.style.width=100*t+"%"}scrub(e){var t;const i=this.vertical?this.rect.height:this.rect.width,s=(0,n.Z)(this.vertical?-(e.y-this.rect.bottom):e.x-this.rect.left,0,i);let a=this.min+s/i*(this.max-this.min);return a-this.min<(this.max-this.min)/2&&(a-=this.step/10),a=+a.toFixed(this.decimals),a=(0,n.Z)(a,this.min,this.max),this.setProgress(a),(null===(t=this.events)||void 0===t?void 0:t.onScrub)&&this.events.onScrub(a),a}removeListeners(){this._removeListeners&&(this._removeListeners(),this._removeListeners=null),this.seek.removeEventListener("input",this.onInput),this.events={}}}},1405:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(8497),n=i(9674),a=i(5432),o=i(3512),r=i(5975),d=i(3035);let l=0;function c(e,t=(()=>Promise.resolve()),i=null,c=!1,h=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");const u=document.createElement("div");let p;u.classList.add("c-ripple"),e.classList.contains("rp-square")&&u.classList.add("is-square"),e[c?"prepend":"append"](u);const f=(e,s)=>{const o=Date.now(),r=document.createElement("div"),c=l++,h=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s",""),f=p=()=>{const e=Date.now()-o,t=()=>{n.Z.mutate((()=>{r.remove()})),null==i||i(c)};if(er.classList.add("hiding")),Math.max(i-h/2,0)),setTimeout(t,i)}else r.classList.add("hiding"),setTimeout(t,h/2);a.Z||(window.removeEventListener("contextmenu",p),window.removeEventListener("mousemove",p)),p=null,g=!1};null==t||t(c),(0,d.T2)((()=>{if(f!==p)return;const t=u.getBoundingClientRect();r.classList.add("c-ripple__circle");const i=e-t.left,n=s-t.top,a=Math.sqrt(Math.pow(Math.abs(n-t.height/2)+t.height/2,2)+Math.pow(Math.abs(i-t.width/2)+t.width/2,2)),o=i-a/2,d=n-a/2;r.style.width=r.style.height=a+"px",r.style.left=o+"px",r.style.top=d+"px",u.append(r)}))},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||(0,s.Z)(t.target,"c-ripple")!==u)&&(h===e||!(0,r.Z)(t.target,h));let g=!1;if(a.Z){const e=()=>{null==p||p()};h.addEventListener("touchstart",(t=>{if(!o.Z.settings.animationsEnabled)return;if(t.touches.length>1||g||m(t))return;g=!0;const{clientX:i,clientY:s}=t.touches[0];f(i,s),h.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",(t=>{t.cancelBubble=!0,t.stopPropagation(),e(),h.removeEventListener("touchend",e)}),{once:!0})}),{passive:!0})}else h.addEventListener("mousedown",(e=>{if(![0,2].includes(e.button))return;if(!o.Z.settings.animationsEnabled)return;if("0"===h.dataset.ripple||m(e))return;if(g)return void(g=!1);const{clientX:t,clientY:i}=e;f(t,i),window.addEventListener("mouseup",p,{once:!0,passive:!0}),window.addEventListener("contextmenu",p,{once:!0,passive:!0})}),{passive:!0})}},7479:(e,t,i)=>{"use strict";i.d(t,{De:()=>g,ZC:()=>v,ZP:()=>f,tG:()=>m});var s=i(9807),n=i(1218),a=i(1405),o=i(5133),r=i(2325),d=i(5565),l=i(130),c=i(2738),h=i(4494),u=i(4531);const p=(e,t)=>{!0===t||("string"==typeof t?(0,l.Z)(e,t):e.append(t))};class f{constructor(e={}){this.freezed=!1,e.checkboxFieldOptions&&(e.checkboxField=new s.Z(Object.assign({listenerSetter:e.listenerSetter},e.checkboxFieldOptions)));const t=e.asLink?"a":e.radioField||e.checkboxField?"label":"div";if(this.container=document.createElement(t),this.container.classList.add("row","no-subtitle"),e.noWrap&&this.container.classList.add("no-wrap"),e.subtitle){const t=this.subtitle;if(p(t,e.subtitle),e.noWrap&&t.classList.add("no-wrap"),e.subtitleRight){this.container.append(this.subtitleRow=this.createRow()),this.subtitleRow.classList.add("row-subtitle-row");const i=this.subtitleRight=document.createElement("div");i.classList.add("row-subtitle","row-subtitle-right"),p(i,e.subtitleRight),this.subtitleRow.append(t,i)}}else e.subtitleLangKey&&this.subtitle.append((0,r.ag)(e.subtitleLangKey,e.subtitleLangArgs));let i=!!e.havePadding;if(e.radioField||e.checkboxField){if(e.radioField&&(this.radioField=e.radioField,this.container.append(this.radioField.label),i=!0),e.checkboxField){this.checkboxField=e.checkboxField;const t=e.checkboxField.label.classList.contains("checkbox-field-toggle");if(t?(this.container.classList.add("row-with-toggle"),e.titleRight=this.checkboxField.label):(i=!0,this.container.append(this.checkboxField.label)),e.withCheckboxSubtitle&&!t){const t=()=>{(0,d.Z)(this.subtitle,(0,r.ag)(this.checkboxField.input.checked?"Checkbox.Enabled":"Checkbox.Disabled"))};e.listenerSetter?e.listenerSetter.add(this.checkboxField.input)("change",t):this.checkboxField.input.addEventListener("change",t)}}(e.radioField||e.checkboxField).label.classList.add("disable-hover")}if(e.title||e.titleLangKey){let t;const i=e.titleRight||e.titleRightSecondary;if(i?(this.container.append(t=this.titleRow=this.createRow()),this.titleRow.classList.add("row-title-row")):t=this.container,this.title=this.createTitle(),e.noWrap&&this.title.classList.add("no-wrap"),e.title?p(this.title,e.title):e.titleLangKey&&this.title.append((0,r.ag)(e.titleLangKey)),t.append(this.title),i){const s=this.titleRight=document.createElement("div");s.classList.add("row-title","row-title-right"),e.titleRightSecondary&&s.classList.add("row-title-right-secondary"),p(s,i),t.append(s)}}e.icon&&(i=!0,this.container.classList.add("tgico","tgico-"+e.icon),this.container.classList.add("row-with-icon")),i&&this.container.classList.add("row-with-padding"),e.navigationTab&&(e.clickable=()=>e.navigationTab.open()),(e.clickable||e.radioField||e.checkboxField)&&("function"==typeof e.clickable&&(0,c.fc)(this.container,(t=>{this.freezed||e.clickable(t)}),{listenerSetter:e.listenerSetter}),this.container.classList.add("row-clickable","hover-effect"),e.noRipple||(0,a.Z)(this.container,void 0,void 0,!0)),(e.buttonRight||e.buttonRightLangKey)&&(this.buttonRight=e.buttonRight instanceof HTMLElement?e.buttonRight:(0,h.Z)("btn-primary btn-color-primary",{text:e.buttonRightLangKey}),this.container.append(this.buttonRight)),e.contextMenu&&(0,u.Z)(Object.assign(Object.assign({},e.contextMenu),{listenTo:this.container,listenerSetter:e.listenerSetter}))}get subtitle(){var e;return null!==(e=this._subtitle)&&void 0!==e?e:this._subtitle=this.createSubtitle()}get midtitle(){var e;return null!==(e=this._midtitle)&&void 0!==e?e:this._midtitle=this.createMidtitle()}createRow(){const e=document.createElement("div");return e.classList.add("row-row"),e}createTitle(){const e=document.createElement("div");return e.classList.add("row-title"),(0,l.m)(e),e}createSubtitle(){const e=document.createElement("div");return e.classList.add("row-subtitle"),(0,l.m)(e),this.title?this.title.after(e):this.container.prepend(e),this.container.classList.remove("no-subtitle"),e}createMidtitle(){const e=document.createElement("div");return e.classList.add("row-midtitle"),this.subtitle.parentElement.insertBefore(e,this.subtitle),e}createMedia(e){const t=document.createElement("div");return this.applyMediaElement(t,e)}applyMediaElement(e,t){return this.container.classList.add("row-with-padding"),this.media=e,e.classList.add("row-media"),t&&e.classList.add("row-media-"+t),this.container.append(e),e}disableWithPromise(e){this.container.classList.add("is-disabled"),e.finally((()=>{this.container.classList.remove("is-disabled")}))}makeSortable(){const e=document.createElement("span");this.container.classList.add("row-sortable","tgico"),e.classList.add("row-sortable-icon","tgico-menu"),this.container.append(e)}toggleSorting(e){this.container.classList.toggle("cant-sort",!e)}}const m=e=>new f({checkboxField:e,listenerSetter:e.listenerSetter}),g=(e,t)=>(0,o.Z)(e.map((e=>({container:e.container,input:e.radioField.input}))),t),v=(e,t)=>{const i="name-"+(8388607*Math.random()|0);let s;const a=e.map((({langPackKey:e,value:t,checked:a})=>{const o=new f({radioField:new n.Z({langKey:e,name:i,value:""+t})});return a&&(s=o.radioField),o})),o=g(a,t);return s&&(s.checked=!0),o}},8805:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>l,v7:()=>c});var s=i(5432),n=i(5003),a=i(4789),o=i(8594),r=i(3910);class d{constructor(e,t="",i=document.createElement("div")){this.el=e,this.container=i,this.onScrollMeasure=0,this.lastScrollPosition=0,this.lastScrollDirection=0,this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation=!1,this.onScroll=()=>{if(this.isHeavyAnimationInProgress)return this.cancelMeasure(),void(this.needCheckAfterAnimation=!0);(this.onScrolledTop||this.onScrolledBottom||this.splitUp||this.onAdditionalScroll)&&(this.onScrollMeasure||(this.onScrollMeasure=window.setTimeout((()=>{this.onScrollMeasure=0;const e=this.container[this.scrollProperty];this.lastScrollDirection=this.lastScrollPosition===e?0:this.lastScrollPositionthis.container.append(e))),e.append(this.container))}addScrollListener(){this.addedScrollListener||(this.addedScrollListener=!0,this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}))}removeScrollListener(){this.addedScrollListener&&(this.addedScrollListener=!1,this.container.removeEventListener("scroll",this.onScroll,{capture:!0}))}setListeners(){this.removeHeavyAnimationListener||(window.addEventListener("resize",this.onScroll,{passive:!0}),this.addScrollListener(),this.removeHeavyAnimationListener=(0,o.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.cancelMeasure(),this.needCheckAfterAnimation=!0)}),(()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)})))}removeListeners(){this.removeHeavyAnimationListener&&(window.removeEventListener("resize",this.onScroll),this.removeScrollListener(),this.removeHeavyAnimationListener(),this.removeHeavyAnimationListener=void 0)}destroy(){this.removeListeners(),this.onAdditionalScroll=void 0,this.onScrolledTop=void 0,this.onScrolledBottom=void 0}append(e){this.container.append(e)}scrollIntoViewNew(e){return(0,a.Z)(Object.assign(Object.assign({},e),{container:this.container}))}cancelMeasure(){this.onScrollMeasure&&(clearTimeout(this.onScrollMeasure),this.onScrollMeasure=0)}}class l extends d{constructor(e,t="",i=300,s){super(e,t),this.onScrollOffset=i,this.loadedAll={top:!0,bottom:!1},this.checkForTriggers=()=>{if(!this.onScrolledTop&&!this.onScrolledBottom)return;if(this.isHeavyAnimationInProgress)return void this.onScroll();const e=this.container.scrollHeight;if(!e)return;const t=e-this.container.clientHeight,i=this.lastScrollPosition;this.onScrolledTop&&i<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-i<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners(),this.scrollProperty="scrollTop"}attachBorderListeners(e=this.container){const t=this.onAdditionalScroll;this.onAdditionalScroll=()=>{null==t||t(),e.classList.toggle("scrolled-top",!this.scrollTop),e.classList.toggle("scrolled-bottom",this.isScrolledDown)},e.classList.add("scrolled-top","scrolled-bottom","scrollable-y-bordered")}setVirtualContainer(e){this.splitUp=e,this.log("setVirtualContainer:",e,this)}prepend(...e){(this.splitUp||this.padding||this.container).prepend(...e)}append(...e){(this.splitUp||this.padding||this.container).append(...e)}getDistanceToEnd(){return this.scrollHeight-Math.round(this.scrollTop+this.container.offsetHeight)}get isScrolledDown(){return this.getDistanceToEnd()<=1}set scrollTop(e){this.container.scrollTop=e}get scrollTop(){return this.container.scrollTop}setScrollTopSilently(e){this.lastScrollPosition=e,this.ignoreNextScrollEvent(),this.scrollTop=e}ignoreNextScrollEvent(){this.removeHeavyAnimationListener&&(this.removeScrollListener(),this.container.addEventListener("scroll",(e=>{(0,r.Z)(e),this.addScrollListener()}),{capture:!0,passive:!1,once:!0}))}get scrollHeight(){return this.container.scrollHeight}}class c extends d{constructor(e,t="",i=300,n=15,a=document.createElement("div")){if(super(e,t,a),this.onScrollOffset=i,this.splitCount=n,this.container=a,this.container.classList.add("scrollable-x"),!s.Z){const e=e=>{!e.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=e.deltaY/4,(0,r.Z)(e))};this.container.addEventListener("wheel",e,{passive:!1})}this.scrollProperty="scrollLeft"}}},5029:(e,t,i)=>{"use strict";i.d(t,{R:()=>r,Z:()=>o});var s=i(2325),n=i(36);const a="sidebar-left-section";class o{constructor(e={}){var t;const i=this.container=document.createElement("div");i.classList.add(a+"-container");const o=this.innerContainer=document.createElement("div");if(o.classList.add(a),e.noShadow&&o.classList.add("no-shadow"),e.fakeGradientDelimiter)o.append((0,n.G)()),o.classList.add("with-fake-delimiter");else if(e.noDelimiter)o.classList.add("no-delimiter");else{const e=document.createElement("hr");o.append(e)}const r=this.content=this.generateContentElement();if(e.name){const t=this.title=document.createElement("div");t.classList.add("sidebar-left-h2",a+"-name"),(0,s.XZ)({element:t,key:e.name,args:e.nameArgs}),r.append(t)}i.append(o);const d=null!==(t=e.caption)&&void 0!==t?t:e.captionOld;if(d){const t=this.caption=this.generateContentElement();t.classList.add(a+"-caption"),e.captionOld||i.append(t),!0!==d&&(0,s.XZ)({element:t,key:d,args:e.captionArgs})}}generateContentElement(){const e=document.createElement("div");return e.classList.add(a+"-content"),this.innerContainer.append(e),e}}const r=(e,t,i)=>{const s=new o({name:t,caption:i});return e.append(s.container),s.content}},4273:(e,t,i)=>{"use strict";i.d(t,{ir:()=>di,ZP:()=>hi});var s=i(4271),n=i(3512),a=i(5884),o=i(9331),r=i(8805),d=i(3607),l=i(3552),c=i(426),h=i(8130),u=i(503),p=i(187),f=i(2325),m=i(8119),g=i(3061),v=i(2738),b=i(5029);class y extends l._{constructor(){super(...arguments),this.uploadAvatar=null,this.isGeoChat=!1}init(e,t=!1){this.isGeoChat=t,this.peerIds=e,this.container.classList.add("new-group-container"),this.setTitle("NewGroup"),this.avatarEdit=new p.Z((e=>{this.uploadAvatar=e}));const i=new b.Z({}),n=document.createElement("div");n.classList.add("input-wrapper"),this.groupNameInputField=new u.ZP({label:"CreateGroup.NameHolder",maxLength:128}),this.groupLocationInputField=new u.ZP({label:"ChatLocation",name:"location",canBeEdited:!1}),n.append(this.groupNameInputField.container,this.groupLocationInputField.container),this.listenerSetter.add(this.groupNameInputField.input)("input",(()=>{let e=!!this.groupNameInputField.value.length&&!this.groupNameInputField.input.classList.contains("error");this.isGeoChat&&(e=e&&!!this.userLocationCoords&&!!this.userLocationAddress),this.nextBtn.classList.toggle("is-visible",!!e)})),this.nextBtn=(0,m.Z)({icon:"arrow_next"}),(0,v.fc)(this.nextBtn,(()=>{const e=this.groupNameInputField.value;let t;if(this.isGeoChat){if(!this.userLocationAddress||!this.userLocationCoords)return;t=this.managers.appChatsManager.createChannel({title:e,about:"",geo_point:Object.assign({_:"inputGeoPoint"},this.userLocationCoords),address:this.userLocationAddress,megagroup:!0}).then((e=>(this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),this.peerIds.length&&this.managers.appChatsManager.inviteToChannel(e,this.peerIds),e)))}else this.nextBtn.disabled=!0,t=this.managers.appChatsManager.createChat(e,this.peerIds.map((e=>e.toUserId()))).then((e=>(this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),e)));t&&t.then((e=>{this.close(),s.Z.setInnerPeer({peerId:e.toPeerId(!0)})}))}),{listenerSetter:this.listenerSetter});const a=new b.Z({name:"Members",nameArgs:[this.peerIds.length]}),o=this.list=h.default.createChatList({new:!0});return a.content.append(o),i.content.append(this.avatarEdit.container,n),this.content.append(this.nextBtn),this.scrollable.append(i.container,a.container),t?(this.setTitle("NearbyCreateGroup"),this.groupLocationInputField.container.classList.remove("hide"),this.groupLocationInputField.setValueSilently(f.ZP.format("Loading",!0)),this.startLocating()):this.groupLocationInputField.container.classList.add("hide"),Promise.all(this.peerIds.map((e=>{return t=this,i=void 0,n=function*(){const{dom:t}=h.default.addDialogNew({peerId:e,container:this.list,rippleEnabled:!1,avatarSize:"abitbigger"});t.lastMessageSpan.append((0,g.Z)(yield this.managers.appUsersManager.getUser(e)))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n})))}onCloseAfterTimeout(){this.avatarEdit.clear(),this.uploadAvatar=null,this.groupNameInputField.value="",this.groupLocationInputField.container.classList.add("hide"),this.nextBtn.disabled=!1}startLocating(){navigator.geolocation.getCurrentPosition((e=>{this.userLocationCoords={lat:e.coords.latitude,long:e.coords.longitude};let t="https://nominatim.openstreetmap.org/reverse";t+="?lat="+e.coords.latitude,t+="&lon="+e.coords.longitude,t+="&format=json",t+="&addressdetails=1",t+="&accept-language=en",fetch(t).then((e=>e.json())).then((e=>{this.userLocationAddress=e.display_name,this.groupLocationInputField.setValueSilently(e.display_name)}))}),(e=>{e instanceof GeolocationPositionError?this.groupLocationInputField.setValueSilently("Location permission denied. Please retry later."):this.groupLocationInputField.setValueSilently("An error has occurred. Please retry later.")}))}}var w,S=i(6360),C=i(632),L=i(410),E=i(5322),I=i(4494),M=i(6024),P=i(7479),Z=i(5565),k=i(144);function T(e){const t=[],i={users:[],chats:[]},s={users:[],chats:[]};return e.forEach((e=>{switch(e._){case"privacyValueAllowAll":t.push(2);break;case"privacyValueDisallowAll":t.push(0);break;case"privacyValueAllowContacts":t.push(1);break;case"privacyValueAllowChatParticipants":i.chats.push(...e.chats);break;case"privacyValueAllowUsers":i.users.push(...e.users);break;case"privacyValueDisallowChatParticipants":s.chats.push(...e.chats);break;case"privacyValueDisallowUsers":s.users.push(...e.users)}})),{type:t[0],disallowPeers:s,allowPeers:i}}!function(e){e[e.Everybody=2]="Everybody",e[e.Contacts=1]="Contacts",e[e.Nobody=0]="Nobody"}(w||(w={}));const x=w;var A=i(1218),_=i(5670);class F{constructor(e){this.options=e,this.onRadioChange=e=>{e=+e,this.type=e;const t=this.options.captions[this.type],i=this.radioSection.caption;t?t instanceof HTMLElement?(0,Z.Z)(i,t):(0,f.$d)(i,t):i.innerHTML="",i.classList.toggle("hide",!t),this.exceptions&&(this.exceptions.get("allow").row.container.classList.toggle("hide",this.type===x.Everybody),this.exceptions.get("disallow").row.container.classList.toggle("hide",this.type===x.Nobody)),this.options.onRadioChange&&this.options.onRadioChange(e)},e.captions&&e.captions.reverse();const t=e.managers;this.radioSection=new b.Z({name:e.title,caption:!0}),this.radioRows=new Map;let i=[{type:x.Everybody,langKey:"PrivacySettingsController.Everbody"},{type:x.Contacts,langKey:"PrivacySettingsController.MyContacts"},{type:x.Nobody,langKey:"PrivacySettingsController.Nobody"}];e.skipTypes&&(i=i.filter((t=>!e.skipTypes.includes(t.type))));const s=(0,k.a)();i.forEach((({type:e,langKey:t})=>{const i=new P.ZP({radioField:new A.Z({langKey:t,name:s,value:""+e})});this.radioRows.set(e,i)}));const n=(0,P.De)([...this.radioRows.values()],this.onRadioChange);if(this.radioSection.content.append(n),e.appendTo&&e.appendTo.append(this.radioSection.container),!e.noExceptions){const t=(0,b.R)(e.appendTo,"PrivacyExceptions","PrivacySettingsController.PeerInfo");this.exceptions=new Map([["disallow",{titleLangKey:e.exceptionTexts[0],key:"disallow",row:null,icon:"deleteuser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}],["allow",{titleLangKey:e.exceptionTexts[1],key:"allow",row:null,icon:"adduser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}]]),this.exceptions.forEach((i=>{i.row=new P.ZP(i),i.row.container.addEventListener("click",(()=>{a.then((()=>{const t=this.peerIds[i.key];e.tab.slider.createTab(_.Z).open({type:"privacy",skippable:!0,title:i.titleLangKey,placeholder:"PrivacyModal.Search.Placeholder",takeOut:e=>{t.length=0,t.push(...e),i.row.subtitle.innerHTML="",i.row.subtitle.append(...this.generateStr(this.splitPeersByType(e)))},selectedPeerIds:t})}))})),t.append(i.row.container)}))}const a=t.appPrivacyManager.getPrivacy(e.inputKey).then((i=>{const s=T(i);this.setRadio(s.type),this.exceptions&&(this.peerIds={},["allow","disallow"].forEach((e=>{const t=[],i="allow"===e?s.allowPeers:s.disallowPeers;t.push(...i.users.map((e=>e.toPeerId()))),t.push(...i.chats.map((e=>e.toPeerId(!0)))),this.peerIds[e]=t;const n=this.exceptions.get(e).row.subtitle;n.innerHTML="",n.append(...this.generateStr(i))}))),e.tab.eventListener.addEventListener("destroy",(()=>{return i=this,s=void 0,a=function*(){const i=[];switch(this.type){case x.Everybody:i.push({_:"inputPrivacyValueAllowAll"});break;case x.Contacts:i.push({_:"inputPrivacyValueAllowContacts"});break;case x.Nobody:i.push({_:"inputPrivacyValueDisallowAll"})}if(this.exceptions){const e=[["allow","inputPrivacyValueAllowChatParticipants","inputPrivacyValueAllowUsers"],["disallow","inputPrivacyValueDisallowChatParticipants","inputPrivacyValueDisallowUsers"]];for(const[s,n,a]of e){if(this.exceptions.get(s).row.container.classList.contains("hide"))continue;const e=this.peerIds[s];if(e){const s=this.splitPeersByType(e);s.chats.length&&i.push({_:n,chats:s.chats}),s.users.length&&i.push({_:a,users:yield Promise.all(s.users.map((e=>t.appUsersManager.getUserInput(e))))})}}}t.appPrivacyManager.setPrivacy(e.inputKey,i)},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}),{once:!0})}))}setRadio(e){const t=this.radioRows.get(e);this.onRadioChange(e),t.radioField.input.checked=!0}splitPeersByType(e){const t={users:[],chats:[]};return e.forEach((e=>{t[e.isAnyChat()?"chats":"users"].push(e.isAnyChat()?e.toChatId():e)})),t}generateStr(e){return e.users.length||e.chats.length?(0,f.v_)([e.users.length?(0,f.ag)("Users",[e.users.length]):null,e.chats.length?(0,f.ag)("Chats",[e.chats.length]):null].filter(Boolean),!1):[(0,f.ag)("PrivacySettingsController.AddUsers")]}}var D=i(3532);class R extends M.h{init(){return e=this,t=void 0,s=function*(){this.container.classList.add("privacy-tab","privacy-phone-number"),this.setTitle("PrivacyPhone");const e="+"+(yield this.managers.appUsersManager.getSelf()).phone,t=document.createElement("div");t.append((0,f.ag)("PrivacyPhoneInfo"),document.createElement("br"),document.createElement("br"),(0,f.ag)("PrivacyPhoneInfo4"),document.createElement("br"),(0,D.Z)({mePath:e}));const i=new F({tab:this,title:"PrivacyPhoneTitle",inputKey:"inputPrivacyKeyPhoneNumber",captions:[t,t,""],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,onRadioChange:e=>{n.setRadio(x.Everybody),n.radioSection.container.classList.toggle("hide",e!==x.Nobody)},managers:this.managers}),s="PrivacyPhoneInfo3",n=new F({tab:this,title:"PrivacyPhoneTitle2",inputKey:"inputPrivacyKeyAddedByPhone",captions:[s,s,""],noExceptions:!0,skipTypes:[x.Nobody],managers:this.managers});this.scrollable.container.insertBefore(n.radioSection.container,i.radioSection.container.nextSibling)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var B=i(8127),N=i(5772),O=i(279);class U extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-set"),this.setTitle("TwoStepVerificationPasswordSet");const e=new b.Z({captionOld:"TwoStepVerificationPasswordSetInfo",noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({emoji:"🥳",div:t,width:160,height:160}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=(0,I.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationPasswordReturnSettings"});(0,v.fc)(n,(e=>{this.close()})),this.slider.sliceTabsUntilTab(Ht,this),s.append(n),i.append(s),this.scrollable.container.append(e.container)}}var H=i(4489),z=i(4762);function j(e){return!z.IS_MOBILE_SAFARI||!e}var G=i(1656);class V extends l._{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email-confirmation"),this.setTitle("TwoStepAuth.RecoveryTitle");const e=new b.Z({captionOld:!0,noDelimiter:!0});(0,f.$d)(e.caption,"TwoStepAuth.ConfirmEmailCodeDesc",[this.email]);const t=document.createElement("div");(0,N.Z)({div:t,width:160,height:160,emoji:"📬"}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=this.codeInputField=new H.Z({name:"recovery-email-code",label:"TwoStepAuth.RecoveryCode",length:this.length,onFill:e=>{d(!0),this.managers.passwordManager.confirmPasswordEmail(""+e).then((e=>{r()})).catch((e=>{switch(e.type){case"CODE_INVALID":n.input.classList.add("error"),(0,Z.Z)(n.label,(0,f.ag)("TwoStepAuth.RecoveryCodeInvalid"));break;case"EMAIL_HASH_EXPIRED":n.input.classList.add("error"),(0,Z.Z)(n.label,(0,f.ag)("TwoStepAuth.RecoveryCodeExpired"));break;default:console.error("confirm error",e)}d(!1)}))}}),a=(0,I.Z)("btn-primary btn-primary-transparent primary",{text:"TwoStepAuth.EmailCodeChangeEmail"}),o=(0,I.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"ResendCode"}),r=()=>{this.slider.createTab(U).open()},d=e=>{(0,G.Z)([n.input,a,o],e)};(0,v.fc)(a,(e=>{d(!0),this.managers.passwordManager.cancelPasswordEmail().then((e=>{this.slider.sliceTabsUntilTab($,this),this.close()}),(()=>{d(!1)}))})),(0,v.fc)(o,(e=>{d(!0);const t=(0,O.y)(o);this.managers.passwordManager.resendPasswordEmail().then((e=>{t.remove(),d(!1)}))})),s.append(n.container,a,o),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){j(this.isFirst)&&this.codeInputField.input.focus()}}var K=i(3910),W=i(1171);class $ extends l._{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email"),this.setTitle("RecoveryEmailTitle");const e=new b.Z({captionOld:!0,noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({div:t,width:160,height:160,emoji:"💌"}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=this.inputField=new u.ZP({name:"recovery-email",label:"RecoveryEmail",plainText:!0});n.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,K.Z)(e),d()})),n.input.addEventListener("input",(e=>{n.input.classList.remove("error")}));const a=(0,I.Z)("btn-primary btn-color-primary",{text:"Continue"}),o=(0,I.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),r=()=>{this.slider.createTab(U).open()},d=()=>{const e=n.value.trim(),t=(0,W.Z)(e);if(!t||t[0].length!==e.length)return void n.input.classList.add("error");l(!0);const i=(0,O.y)(a);this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:e}).then((e=>{r()}),(t=>{if(t.type.includes("EMAIL_UNCONFIRMED")){const i=+t.type.match(/^EMAIL_UNCONFIRMED_(\d+)/)[1],s=this.slider.createTab(V);s.state=this.state,s.email=e,s.length=i,s.open()}else console.log("password set error",t);l(!1),i.remove()}))};(0,v.fc)(a,d);const l=e=>{e?(a.setAttribute("disabled","true"),o.setAttribute("disabled","true")):(a.removeAttribute("disabled"),o.removeAttribute("disabled"))};(0,v.fc)(o,(e=>{new B.Z("popup-skip-email",{buttons:[{langKey:"Cancel",isCancel:!0},{langKey:"YourEmailSkip",callback:()=>{l(!0),(0,O.y)(o),this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:""}).then((()=>{r()}),(e=>{l(!1)}))},isDanger:!0}],titleLangKey:"YourEmailSkipWarning",descriptionLangKey:"YourEmailSkipWarningText"}).show()})),s.append(n.container,a,o),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){j(this.isFirst)&&this.inputField.input.focus()}}var q=i(130),Q=i(8115),Y=i(4425),X=i(6830),J=i(3083),ee=i(2796);class te extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-hint"),this.setTitle("TwoStepAuth.SetupHintTitle");const e=new b.Z({noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({div:t,width:160,height:160,emoji:"💡"}),e.content.append(t);const i=document.createElement("div");i.classList.add("input-wrapper");const s=this.inputField=new u.ZP({name:"hint",label:"TwoStepAuth.SetupHintPlaceholder"});s.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,K.Z)(e),s.value?r():d()}));const n=(e,t)=>{e&&(0,K.Z)(e);const i=t?s.value:void 0;if(i&&this.newPassword===i)return void(0,ee.Am)(f.ZP.format("PasswordAsHintError",!0));const n=this.slider.createTab($);n.state=this.state,n.plainPassword=this.plainPassword,n.newPassword=this.newPassword,n.hint=i,n.open()},a=(0,I.Z)("btn-primary btn-color-primary",{text:"Continue"}),o=(0,I.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),r=e=>n(e,!0),d=e=>n(e,!1);(0,v.fc)(a,r),(0,v.fc)(o,d),i.append(s.container,a,o),e.content.append(i),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){this.inputField.input.focus()}}class ie extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-enter-password","two-step-verification-re-enter-password"),this.setTitle("PleaseReEnterPassword");const e=new b.Z({noDelimiter:!0}),t=document.createElement("div");t.classList.add("input-wrapper");const i=this.passwordInputField=new X.Z({name:"re-enter-password",label:"PleaseReEnterPassword"}),s=new J.Z(i,157),n=(0,I.Z)("btn-primary btn-color-primary",{text:"Continue"});t.append(i.container,n),e.content.append(s.container,t),this.scrollable.container.append(e.container),i.input.addEventListener("keypress",(e=>{if(i.input.classList.contains("error")&&i.setState(u.I1.Neutral),"Enter"===e.key)return o()}));const a=()=>this.newPassword===i.value||(i.setError(),!1),o=e=>{if(e&&(0,K.Z)(e),!a())return;const t=this.slider.createTab(te);t.state=this.state,t.plainPassword=this.plainPassword,t.newPassword=this.newPassword,t.open()};return(0,v.fc)(n,o),s.load()}onOpenAfterTimeout(){this.passwordInputField.input.focus()}}class se extends l._{constructor(){super(...arguments),this.isFirst=!0}init(){const e=!this.state.pFlags.has_password||this.plainPassword;this.container.classList.add("two-step-verification","two-step-verification-enter-password"),this.setTitle(e?"PleaseEnterFirstPassword":"PleaseEnterCurrentPassword");const t=new b.Z({noDelimiter:!0}),i=document.createElement("div");i.classList.add("input-wrapper");const s=this.passwordInputField=new X.Z({name:"enter-password",label:e?"PleaseEnterFirstPassword":this.state.hint?void 0:"LoginPassword",labelText:!e&&this.state.hint?(0,Q.Z)(this.state.hint):void 0}),n=new Y.Z(s,157),a=(0,I.Z)("btn-primary btn-color-primary"),o=new f.ZP.IntlElement({key:"Continue"});a.append(o.element),i.append(s.container,a),t.content.append(n.container,i),this.scrollable.container.append(t.container),s.input.addEventListener("keypress",(e=>{if(s.input.classList.contains("error")&&(s.input.classList.remove("error"),o.key="Continue",o.update()),"Enter"===e.key)return d()}));const r=()=>!!s.value.length||(s.input.classList.add("error"),!1);let d;if(e)d=e=>{if(e&&(0,K.Z)(e),!r())return;const t=this.slider.createTab(ie);t.state=this.state,t.newPassword=s.value,t.plainPassword=this.plainPassword,t.open()};else{let e;const t=()=>(e||(e=window.setInterval(t,1e4)),this.managers.passwordManager.getState().then((e=>{this.state=e,this.state.hint?(0,q.Z)(s.label,(0,Q.Z)(this.state.hint)):(0,Z.Z)(s.label,(0,f.ag)("LoginPassword"))})));d=i=>{if(!r())return void(0,K.Z)(i);a.setAttribute("disabled","true"),o.key="PleaseWait",o.update();const d=(0,O.y)(a),l=s.value;this.managers.passwordManager.check(s.value,this.state).then((t=>{if(console.log(t),"auth.authorization"===t._){clearInterval(e),n&&n.remove();const t=this.slider.createTab(ne);t.state=this.state,t.plainPassword=l,t.open(),this.slider.removeTabFromHistory(this)}}),(e=>{a.removeAttribute("disabled"),s.input.classList.add("error"),e.type,o.key="PASSWORD_HASH_INVALID",o.update(),d.remove(),s.select(),t()}))},t()}return(0,v.fc)(a,d),n.load()}onOpenAfterTimeout(){j(this.isFirst)&&this.passwordInputField.input.focus()}}class ne extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-main"),this.setTitle("TwoStepVerificationTitle");const e=new b.Z({captionOld:!0,noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({div:t,width:168,height:168,emoji:"🔐"}),e.content.append(t);const i=e.generateContentElement();if(this.state.pFlags.has_password){(0,f.$d)(e.caption,"TwoStepAuth.GenericHelp");const t=(0,I.Z)("btn-primary btn-transparent",{icon:"edit",text:"TwoStepAuth.ChangePassword"}),s=(0,I.Z)("btn-primary btn-transparent",{icon:"passwordoff",text:"TwoStepAuth.RemovePassword"}),n=(0,I.Z)("btn-primary btn-transparent",{icon:"email",text:this.state.pFlags.has_recovery?"TwoStepAuth.ChangeEmail":"TwoStepAuth.SetupEmail"});(0,v.fc)(t,(()=>{const e=this.slider.createTab(se);e.state=this.state,e.plainPassword=this.plainPassword,e.open()})),(0,v.fc)(s,(()=>{new B.Z("popup-disable-password",{buttons:[{langKey:"Disable",callback:()=>{this.managers.passwordManager.updateSettings({currentPassword:this.plainPassword}).then((()=>{this.slider.sliceTabsUntilTab(Ht,this),this.close()}))},isDanger:!0}],titleLangKey:"TurnPasswordOffQuestionTitle",descriptionLangKey:"TurnPasswordOffQuestion"}).show()})),(0,v.fc)(n,(()=>{const e=this.slider.createTab($);e.state=this.state,e.hint=this.state.hint,e.plainPassword=this.plainPassword,e.newPassword=this.plainPassword,e.isFirst=!0,e.open()})),i.append(t,s,n)}else{(0,f.$d)(e.caption,"TwoStepAuth.SetPasswordHelp");const t=document.createElement("div");t.classList.add("input-wrapper");const s=(0,I.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationSetPassword"});t.append(s),i.append(t),(0,v.fc)(s,(e=>{const t=this.slider.createTab(se);t.state=this.state,t.open()}))}this.scrollable.container.append(e.container)}}class ae extends M.h{init(){this.container.classList.add("privacy-tab","privacy-last-seen"),this.setTitle("PrivacyLastSeen");const e="PrivacySettingsController.LastSeenDescription";new F({tab:this,title:"LastSeenTitle",inputKey:"inputPrivacyKeyStatusTimestamp",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,managers:this.managers})}}class oe extends M.h{init(){this.container.classList.add("privacy-tab","privacy-profile-photo"),this.setTitle("PrivacyProfilePhoto");const e="PrivacySettingsController.ProfilePhoto.CustomHelp";new F({tab:this,title:"PrivacyProfilePhotoTitle",inputKey:"inputPrivacyKeyProfilePhoto",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,skipTypes:[x.Nobody],managers:this.managers})}}class re extends M.h{init(){this.container.classList.add("privacy-tab","privacy-forward-messages"),this.setTitle("PrivacySettings.Forwards");const e="PrivacySettingsController.Forwards.CustomHelp";new F({tab:this,title:"PrivacyForwardsTitle",inputKey:"inputPrivacyKeyForwards",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}class de extends M.h{init(){this.container.classList.add("privacy-tab","privacy-add-to-groups"),this.setTitle("PrivacySettings.Groups");const e="PrivacySettingsController.GroupDescription";new F({tab:this,title:"WhoCanAddMe",inputKey:"inputPrivacyKeyChatInvite",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,skipTypes:[x.Nobody],managers:this.managers})}}class le extends M.h{init(){this.container.classList.add("privacy-tab","privacy-calls"),this.setTitle("PrivacySettings.VoiceCalls");const e="PrivacySettingsController.PhoneCallDescription";new F({tab:this,title:"WhoCanCallMe",inputKey:"inputPrivacyKeyPhoneCall",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers});{const e="PrivacySettingsController.P2p.Desc";new F({tab:this,title:"PrivacyP2PHeader",inputKey:"inputPrivacyKeyPhoneP2P",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}}var ce=i(3003),he=i(8497),ue=i(4064),pe=i(6976),fe=i(1483),me=i(3416);class ge extends M.h{init(){this.container.classList.add("active-sessions-container"),this.setTitle("SessionsTitle");const e=e=>{const t=new P.ZP({title:[e.app_name,e.app_version].join(" "),subtitle:[e.ip,e.country].join(" - "),clickable:!0,titleRight:e.pFlags.current?void 0:(0,C.zM)(new Date(1e3*Math.max(e.date_active,e.date_created)))});return t.container.dataset.hash=""+e.hash,t.midtitle.textContent=[e.device_model,e.system_version||e.platform].filter(Boolean).join(", "),t},t=this.authorizations.slice();{const n=new b.Z({name:"CurrentSession",caption:"ClearOtherSessionsHelp"}),a=(0,ue.Z)(t,(e=>e.pFlags.current)),o=e(a);if(n.content.append(o.container),t.length){const e=(0,I.Z)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllSessions"});(0,v.fc)(e,(t=>{new B.Z("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{const t=(0,G.Z)([e],!0);this.managers.apiManager.invokeApi("auth.resetAuthorizations").then((t=>{e.remove(),i.container.remove()}),s).finally((()=>{t()}))}}],titleLangKey:"AreYouSureSessionsTitle",descriptionLangKey:"AreYouSureSessions"}).show()})),n.content.append(e)}this.scrollable.append(n.container)}if(!t.length)return;const i=new b.Z({name:"OtherSessions",caption:"SessionsListInfo"});t.forEach((t=>{i.content.append(e(t).container)})),this.scrollable.append(i.container);const s=e=>{"FRESH_RESET_AUTHORISATION_FORBIDDEN"===e.type&&(0,ee.Am)(f.ZP.format("RecentSessions.Error.FreshReset",!0))};let n;const a=()=>{const e=n.dataset.hash;new B.Z("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{this.managers.apiManager.invokeApi("account.resetAuthorization",{hash:e}).then((e=>{e&&n.remove()}),s)}}],titleLangKey:"AreYouSureSessionTitle",descriptionLangKey:"TerminateSessionText"}).show()},o=this.menuElement=(0,ce.b)({buttons:[{icon:"stop",text:"Terminate",onClick:a}]});o.id="active-sessions-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),(0,pe.E)(this.scrollable.container,(e=>{n=(0,he.Z)(e.target,"row"),n&&"0"!==n.dataset.hash&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),(0,fe.Z)(e,o),me.Z.openBtnMenu(o))})),(0,v.fc)(this.scrollable.container,(e=>{n=(0,he.Z)(e.target,"row"),n&&"0"!==n.dataset.hash&&a()}))}onCloseAfterTimeout(){var e;return null===(e=this.menuElement)||void 0===e||e.remove(),super.onCloseAfterTimeout()}}var ve=i(2995),be=i(4668),ye=i(8210),we=i(5102);class Se extends l._{init(){this.container.classList.add("blocked-users-container"),this.setTitle("BlockedUsers");const e=new b.Z({caption:"BlockedUsersInfo"});e.caption.parentElement.prepend(e.caption),this.scrollable.append(e.container);const t=(0,m.Z)({icon:"add",className:"is-visible"});this.content.append(t),(0,v.fc)(t,(e=>{new ve.Z({peerTypes:["contacts"],placeholder:"BlockModal.Search.Placeholder",onSelect:e=>{this.managers.appUsersManager.toggleBlock(e,!0)}})}),{listenerSetter:this.listenerSetter});const i=h.default.createChatList();this.scrollable.container.classList.add("chatlist-container"),e.content.append(i);const s=(e,t)=>{return s=this,n=void 0,o=function*(){const{dom:s}=h.default.addDialogNew({peerId:e,container:i,rippleEnabled:!0,avatarSize:"abitbigger",append:t}),n=yield this.managers.appUsersManager.getUser(e.toUserId());if(!n)return;const a=(0,we.Z)(n)[0];n.pFlags.bot?s.lastMessageSpan.append("@"+a):n.phone?s.lastMessageSpan.innerHTML=(0,ye.Z)(n.phone):s.lastMessageSpan.append(a?"@"+a:(0,g.Z)(n))},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}d((o=o.apply(s,n||[])).next())}));var s,n,a,o};for(const e of this.peerIds)s(e,!0);let a;const o=this.menuElement=(0,ce.b)({buttons:[{icon:"lockoff",text:"Unblock",onClick:()=>{const e=a.dataset.peerId.toPeerId();this.managers.appUsersManager.toggleBlock(e,!1)},options:{listenerSetter:this.listenerSetter}}]});o.id="blocked-users-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),(0,pe.E)(this.scrollable.container,(e=>{a=(0,be.Z)(e.target,h.DIALOG_LIST_ELEMENT_TAG),a&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),(0,fe.Z)(e,o),me.Z.openBtnMenu(o))}),this.listenerSetter),this.listenerSetter.add(n.Z)("peer_block",(e=>{const{peerId:t,blocked:n}=e,a=i.querySelector(`[data-peer-id="${t}"]`);n?a||s(t,!1):a&&a.remove()}));let r=!1;this.scrollable.onScrolledBottom=()=>{r||(r=!0,this.managers.appUsersManager.getBlocked(i.childElementCount,50).then((e=>{for(const t of e.peerIds)s(t,!0);(e.peerIds.length<50||i.childElementCount===e.count)&&(this.scrollable.onScrolledBottom=null),this.scrollable.checkForTriggers()})).finally((()=>{r=!1})))}}onOpenAfterTimeout(){this.scrollable.onScroll()}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}var Ce=i(9807);function Le(e){return"input"+(e[0].toUpperCase()+e.slice(1))}var Ee=i(5592),Ie=i(319);class Me extends M.h{init(){this.container.classList.add("privacy-tab","privacy-voices"),this.setTitle("PrivacyVoiceMessages");const e="PrivacyVoiceMessagesInfo";new F({tab:this,title:"PrivacyVoiceMessagesTitle",inputKey:"inputPrivacyKeyVoiceMessages",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}var Pe=i(7362),Ze=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class ke extends M.h{init(e){return Ze(this,void 0,void 0,(function*(){this.container.classList.add("active-sessions-container"),this.setTitle("WebSessionsTitle");const t=e=>Ze(this,void 0,void 0,(function*(){const t=e.bot_id.toPeerId(),i=new P.ZP({title:yield(0,Pe.Z)({peerId:t}),subtitle:[e.ip,e.region].join(" - "),clickable:!0,titleRight:(0,C.zM)(new Date(1e3*Math.max(e.date_active,e.date_created)))}),s=i.createMedia("big"),n=new o.Z;return n.classList.add("avatar-48"),yield n.updateWithOptions({peerId:t}),s.append(n),i.container.dataset.hash=""+e.hash,i.container.dataset.peerId=""+t,i.midtitle.textContent=[e.domain,e.browser,e.platform].filter(Boolean).join(", "),i}));{const e=new b.Z({caption:"ClearOtherWebSessionsHelp"}),t=(0,I.Z)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllWebSessions"});(0,v.fc)(t,(()=>Ze(this,void 0,void 0,(function*(){yield(0,Ee.Z)({descriptionLangKey:"AreYouSureWebSessions",button:{langKey:"Disconnect",isDanger:!0}}),(0,G.Z)([t],!0),this.managers.appSeamlessLoginManager.resetWebAuthorizations().then((()=>{this.close()}))}))),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}{const i=new b.Z({name:"OtherWebSessions",caption:"TerminateWebSessionInfo"}),s=yield Promise.all(e.map(t));i.content.append(...s.map((e=>e.container)));let n=s.length;(0,v.fc)(i.content,(e=>Ze(this,void 0,void 0,(function*(){const t=(0,he.Z)(e.target,"row");if(!t)return;yield(0,Ee.Z)({descriptionLangKey:"TerminateWebSessionText",descriptionLangArgs:[yield(0,Pe.Z)({peerId:t.dataset.peerId.toPeerId()})],button:{langKey:"Disconnect",isDanger:!0}});const i=t.dataset.hash;t.classList.add("is-disabled"),this.managers.appSeamlessLoginManager.resetWebAuthorization(i).then((()=>{--n?t.remove():this.close()}))}))),{listenerSetter:this.listenerSetter}),this.scrollable.append(i.container)}}))}}class Te extends M.h{static getInitArgs(e){return{appConfig:e.managers.apiManager.getAppConfig(),globalPrivacy:e.managers.appPrivacyManager.getGlobalPrivacySettings(),contentSettings:e.managers.apiManager.invokeApi("account.getContentSettings"),webAuthorizations:e.managers.appSeamlessLoginManager.getWebAuthorizations()}}init(e){this.container.classList.add("dont-u-dare-block-me"),this.setTitle("PrivacySettings");const t="Loading",i=[];{const s=new b.Z({noDelimiter:!0,caption:"SessionsInfo"});let a;const o=new P.ZP({icon:"deleteuser",titleLangKey:"BlockedUsers",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(Se);e.peerIds=a,e.open()},listenerSetter:this.listenerSetter});let r;o.freezed=!0;const d={icon:"lock",titleLangKey:"TwoStepVerification",subtitleLangKey:t,clickable:e=>{let t;r.pFlags.has_password?t=this.slider.createTab(se):r.email_unconfirmed_pattern?(t=this.slider.createTab(V),t.email=r.email_unconfirmed_pattern,t.length=6,t.isFirst=!0,this.managers.passwordManager.resendPasswordEmail()):t=this.slider.createTab(ne),t.state=r,t.open()},listenerSetter:this.listenerSetter},l=new P.ZP(d);l.freezed=!0;const c=this.activeSessionsRow=new P.ZP({icon:"activesessions",titleLangKey:"SessionsTitle",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(ge);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.updateActiveSessions()}),{once:!0}),e.open()},listenerSetter:this.listenerSetter});c.freezed=!0;const h=this.websitesRow=new P.ZP({icon:"mention",titleLangKey:"OtherWebSessions",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(ke);e.eventListener.addEventListener("destroy",(()=>{this.updateActiveWebsites()})),e.open(this.websites)},listenerSetter:this.listenerSetter});h.freezed=!0,s.content.append(o.container,l.container,c.container,h.container),this.scrollable.append(s.container);const u=e=>{e?(0,Z.Z)(o.subtitle,(0,f.ag)("PrivacySettingsController.UserCount",[e])):(0,Z.Z)(o.subtitle,(0,f.ag)("BlockedEmpty",[e]))};this.listenerSetter.add(n.Z)("peer_block",(()=>{p()}));const p=()=>{this.managers.appUsersManager.getBlocked().then((e=>{o.freezed=!1,u(e.count),a=e.peerIds}))};p(),this.managers.passwordManager.getState().then((e=>{r=e,(0,Z.Z)(l.subtitle,(0,f.ag)(e.pFlags.has_password?"PrivacyAndSecurity.Item.On":"PrivacyAndSecurity.Item.Off")),l.freezed=!1})),this.updateActiveSessions(),i.push(this.updateActiveWebsites(e.webAuthorizations))}{const e=new b.Z({name:"PrivacyTitle",caption:"GroupsAndChannelsHelp"});e.content.classList.add("privacy-navigation-container");const i={},s=i.inputPrivacyKeyPhoneNumber=new P.ZP({titleLangKey:"PrivacyPhoneTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(R).open()},listenerSetter:this.listenerSetter}),a=i.inputPrivacyKeyStatusTimestamp=new P.ZP({titleLangKey:"LastSeenTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(ae).open()},listenerSetter:this.listenerSetter}),o=i.inputPrivacyKeyProfilePhoto=new P.ZP({titleLangKey:"PrivacyProfilePhotoTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(oe).open()},listenerSetter:this.listenerSetter}),r=i.inputPrivacyKeyPhoneCall=new P.ZP({titleLangKey:"WhoCanCallMe",subtitleLangKey:t,clickable:()=>{this.slider.createTab(le).open()},listenerSetter:this.listenerSetter}),d=i.inputPrivacyKeyForwards=new P.ZP({titleLangKey:"PrivacyForwardsTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(re).open()},listenerSetter:this.listenerSetter}),l=i.inputPrivacyKeyChatInvite=new P.ZP({titleLangKey:"WhoCanAddMe",subtitleLangKey:t,clickable:()=>{this.slider.createTab(de).open()},listenerSetter:this.listenerSetter}),c=i.inputPrivacyKeyVoiceMessages=new P.ZP({titleLangKey:"PrivacyVoiceMessagesTitle",subtitleLangKey:t,clickable:()=>{n.Z.premium?this.slider.createTab(Me).open():(0,ee.bC)({langPackKey:"PrivacyVoiceMessagesPremiumOnly"})},listenerSetter:this.listenerSetter}),h=e=>{const t=i[e];t&&this.managers.appPrivacyManager.getPrivacy(e).then((e=>{const i=T(e),s=i.type===x.Everybody?"PrivacySettingsController.Everbody":i.type===x.Contacts?"PrivacySettingsController.MyContacts":"PrivacySettingsController.Nobody",n=i.disallowPeers.users.length+i.disallowPeers.chats.length,a=i.allowPeers.users.length+i.allowPeers.chats.length;t.subtitle.innerHTML="";const o=(0,f.ag)(s);t.subtitle.append(o),(n||a)&&t.subtitle.append(` (${[-n,a?"+"+a:0].filter(Boolean).join(", ")})`)}))};e.content.append(s.container,a.container,o.container,r.container,d.container,l.container,c.container),this.scrollable.append(e.container);for(const e in i)h(e);n.Z.addEventListener("privacy_update",(e=>{h(Le(e.key._))}))}{const t=new b.Z({name:"NewChatsFromNonContacts",caption:"ArchiveAndMuteInfo"}),s=new Ce.Z({text:"ArchiveAndMute"}),a=new P.ZP({checkboxField:s});let o,r;t.content.append(a.container),this.eventListener.addEventListener("destroy",(()=>{if(r=!0,void 0!==o&&o!==s.checked)return this.managers.appPrivacyManager.setGlobalPrivacySettings({_:"globalPrivacySettings",archive_and_mute_new_noncontact_peers:s.checked})}),{once:!0});const d=Promise.all([e.appConfig,e.globalPrivacy]).then((([e,i])=>{if(r)return;const a=i=>{t.container.classList.toggle("hide",!i&&!e.autoarchive_setting_available)};this.listenerSetter.add(n.Z)("premium_toggle",a),a(n.Z.premium),o=!!i.archive_and_mute_new_noncontact_peers,s.setValueSilently(o)}));i.push(d),this.scrollable.append(t.container)}{const t=new b.Z({name:"Privacy.SensitiveContent",caption:"PrivacyAndSecurity.SensitiveDesc"});t.container.classList.add("hide");const s=new Ce.Z({text:"PrivacyAndSecurity.SensitiveText"}),n=new P.ZP({checkboxField:s});let a;t.content.append(n.container),this.eventListener.addEventListener("destroy",(()=>{if(void 0===a)return;const e=n.checkboxField.checked;return e!==a?this.managers.apiManager.invokeApi("account.setContentSettings",{sensitive_enabled:e}):void 0}),{once:!0});const o=e.contentSettings.then((e=>{e.pFlags.sensitive_can_change&&(a=!!e.pFlags.sensitive_enabled,s.setValueSilently(a),t.container.classList.remove("hide"))}));i.push(o),this.scrollable.append(t.container)}{const e=new b.Z({name:"PrivacyPayments",caption:"PrivacyPaymentsClearInfo"}),t=()=>{const e={titleLangKey:"PrivacyPaymentsClearAlertTitle",descriptionLangKey:"PrivacyPaymentsClearAlertText",button:{langKey:"Clear"},checkboxes:[{text:"PrivacyClearShipping",checked:!0},{text:"PrivacyClearPayment",checked:!0}]};(0,Ee.Z)(e).then((()=>{const[t,s]=e.checkboxes.map((e=>e.checkboxField.checked)),n=(0,G.Z)([i],!0);this.managers.appPaymentsManager.clearSavedInfo(t,s).then((()=>{(t||s)&&(n(),(0,ee.bC)({langPackKey:t&&s?"PrivacyPaymentsPaymentShippingCleared":t?"PrivacyPaymentsShippingInfoCleared":"PrivacyPaymentsPaymentInfoCleared"}))}))}),Ie.Z)},i=(0,I.Z)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyPaymentsClear"});this.listenerSetter.add(i)("click",t),e.content.append(i),this.scrollable.append(e.container)}{const e=new b.Z({name:"FilterChats"}),t=()=>{new B.Z("popup-delete-drafts",{buttons:[{langKey:"Delete",callback:()=>{const e=(0,G.Z)([i],!0);this.managers.appDraftsManager.clearAllDrafts().then((()=>{e()}))},isDanger:!0}],titleLangKey:"AreYouSureClearDraftsTitle",descriptionLangKey:"AreYouSureClearDrafts"}).show()},i=(0,I.Z)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyDeleteCloudDrafts"});this.listenerSetter.add(i)("click",t),e.content.append(i),this.scrollable.append(e.container)}return Promise.all(i)}updateActiveSessions(){return this.managers.apiManager.invokeApi("account.getAuthorizations").then((e=>{this.activeSessionsRow.freezed=!1,this.authorizations=e.authorizations,(0,f.$d)(this.activeSessionsRow.subtitle,"Privacy.Devices",[this.authorizations.length])}))}updateActiveWebsites(e=this.managers.appSeamlessLoginManager.getWebAuthorizations()){return e.then((e=>{this.websitesRow.freezed=!1,this.websites=e,(0,f.$d)(this.websitesRow.subtitle,"Privacy.Websites",[this.websites.length]),this.websitesRow.container.classList.toggle("hide",!this.websites.length)}))}}var xe=i(65),Ae=i(6740);function _e(e){const t=e.getContext("2d"),i=new Array(4).fill(0),s=t.getImageData(0,0,e.width,e.height).data,n=s.length/4;for(let e=0;e0&&(i=Math.min(100,i+5+.1*(100-i))),s=Math.max(0,.65*s),`hsla(${t}, ${i}%, ${s}%, .4)`}var Ne=i(8479),Oe=i(9674),Ue=i(1571),He=i(2312),ze=i(3442),je=i(6724),Ge=i(6714),Ve=i(5077),Ke=i(3228);class We{constructor(){this.hue=0,this.saturation=100,this.lightness=50,this.alpha=1,this.elements={},this.onGrabStart=()=>{document.documentElement.style.cursor=this.elements.boxDragger.style.cursor="grabbing"},this.onGrabEnd=()=>{document.documentElement.style.cursor=this.elements.boxDragger.style.cursor=""},this.container=document.createElement("div"),this.container.classList.add(We.BASE_CLASS);const e=`\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n `;this.container.innerHTML=e,this.elements.box=this.container.firstElementChild,this.elements.boxDragger=this.elements.box.lastElementChild,this.elements.saturation=this.elements.box.firstElementChild.firstElementChild,this.elements.sliders=this.elements.box.nextElementSibling,this.elements.hue=this.elements.sliders.firstElementChild,this.elements.hueDragger=this.elements.hue.lastElementChild,this.hexInputField=new u.ZP({plainText:!0,label:"Appearance.Color.Hex"}),this.rgbInputField=new u.ZP({plainText:!0,label:"Appearance.Color.RGB"});const t=document.createElement("div");t.className=We.BASE_CLASS+"-inputs",t.append(this.hexInputField.container,this.rgbInputField.container),this.container.append(t),this.hexInputField.input.addEventListener("input",(()=>{let e=this.hexInputField.value.replace(/#/g,"").slice(0,6);const t=e.match(/([a-fA-F\d]+)/),i=t&&t[0].length===e.length&&[6].includes(e.length);this.hexInputField.setState(i?u.I1.Neutral:u.I1.Error),e="#"+e,this.hexInputField.setValueSilently(e),i&&this.setColor(e,!1,!0)}));const i=/^(?:rgb)?\(?([01]?\d\d?|2[0-4]\d|25[0-5])(?:\W+)([01]?\d\d?|2[0-4]\d|25[0-5])\W+(?:([01]?\d\d?|2[0-4]\d|25[0-5])\)?)$/;this.rgbInputField.input.addEventListener("input",(()=>{const e=this.rgbInputField.value.match(i);this.rgbInputField.setState(e?u.I1.Neutral:u.I1.Error),e&&this.setColor((0,Re.dI)(+e[1],+e[2],+e[3]),!0,!1)})),this.attachBoxListeners(),this.attachHueListeners()}attachBoxListeners(){(0,Ve.Z)(this.elements.box,(()=>{this.onGrabStart(),this.boxRect=this.elements.box.getBoundingClientRect()}),(e=>{this.saturationHandler(e.x,e.y)}),(()=>{this.onGrabEnd()}))}attachHueListeners(){(0,Ve.Z)(this.elements.hue,(()=>{this.onGrabStart(),this.hueRect=this.elements.hue.getBoundingClientRect()}),(e=>{this.hueHandler(e.x)}),(()=>{this.onGrabEnd()}))}setColor(e,t=!0,i=!0){if(void 0===e)e={h:0,s:100,l:50,a:1};else if("string"==typeof e)if("#"===e[0])e=(0,Re.cw)(e);else{const t=e.match(/[.?\d]+/g);e=(0,Re.dI)(+t[0],+t[1],+t[2],void 0===t[3]?1:+t[3])}this.boxRect=this.elements.box.getBoundingClientRect();const s=this.boxRect.width/100*e.s,n=100-e.l/(100-e.s/2)*100,a=this.boxRect.height/100*n;this.saturationHandler(this.boxRect.left+s,this.boxRect.top+a,!1),this.hueRect=this.elements.hue.getBoundingClientRect();const o=e.h/360,r=this.hueRect.left+this.hueRect.width*o;this.hueHandler(r,!1),this.hue=e.h,this.saturation=e.s,this.lightness=e.l,this.alpha=e.a,this.updatePicker(t,i)}getCurrentColor(){const e=(0,Re.Y6)(this.hue,this.saturation,this.lightness,this.alpha),t=(0,Re.t1)(e),i=t.slice(0,-2);return{hsl:`hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,rgb:`rgb(${e[0]}, ${e[1]}, ${e[2]})`,hex:i,hsla:`hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,rgba:`rgba(${e[0]}, ${e[1]}, ${e[2]}, ${e[3]})`,hexa:t,rgbaArray:e}}updatePicker(e=!0,t=!0){const i=this.getCurrentColor();this.elements.boxDragger.setAttributeNS(null,"fill",i.hex),e&&(this.hexInputField.setValueSilently(i.hex),this.hexInputField.setState(u.I1.Neutral)),t&&(this.rgbInputField.setValueSilently(i.rgbaArray.slice(0,-1).join(", ")),this.rgbInputField.setState(u.I1.Neutral)),this.onChange&&this.onChange(i)}hueHandler(e,t=!0){const i=(0,Ke.Z)(e-this.hueRect.left,0,this.hueRect.width)/this.hueRect.width;this.hue=Math.round(360*i);const s=`hsla(${this.hue}, 100%, 50%, ${this.alpha})`;this.elements.hueDragger.setAttributeNS(null,"x",100*i+"%"),this.elements.hueDragger.setAttributeNS(null,"fill",s),this.elements.saturation.lastElementChild.setAttributeNS(null,"stop-color",s),t&&this.updatePicker()}saturationHandler(e,t,i=!0){const s=this.boxRect.width,n=this.boxRect.height,a=(0,Ke.Z)(e-this.boxRect.left,0,s)/s*100,o=(0,Ke.Z)(t-this.boxRect.top,0,n)/n*100,r=this.elements.boxDragger;r.setAttributeNS(null,"x",a+"%"),r.setAttributeNS(null,"y",o+"%");const d=(0,Ke.Z)(a,0,100),l=100-d/2,c=100-(0,Ke.Z)(o,0,100),h=(0,Ke.Z)(c/100*l,0,100);this.saturation=d,this.lightness=h,i&&this.updatePicker()}}We.BASE_CLASS="color-picker";class $e extends l._{constructor(){super(...arguments),this._applyColor=(e,t=!0)=>{if(t)this.colorPicker.setColor(e);else{const t=(0,Re.Pi)(e),i=this.theme.background,a=Be(t);i.id="2",i.intensity=0,i.slug="",i.color=e.toLowerCase(),i.highlightningColor=a,this.managers.appStateManager.pushToState("settings",n.Z.settings),s.Z.applyCurrentTheme(void 0,void 0,!0),this.setActive()}},this.onColorChange=e=>{this.applyColor(e.hex,!1)}}init(){this.container.classList.add("background-container","background-color-container"),this.setTitle("SetColor"),this.theme=Ge.Z.getTheme();const e=new b.Z({});this.colorPicker=new We,e.content.append(this.colorPicker.container),this.scrollable.append(e.container);const t=new b.Z({}),i=this.grid=document.createElement("div");i.classList.add("grid"),["#E6EBEE","#B2CEE1","#008DD0","#C6E7CB","#C4E1A6","#60B16E","#CCD0AF","#A6A997","#7A7072","#FDD7AF","#FDB76E","#DD8851"].forEach((e=>{const t=document.createElement("div");t.classList.add("grid-item"),t.dataset.color=e.toLowerCase();const s=document.createElement("div");s.classList.add("grid-item-media"),s.style.backgroundColor=e,t.append(s),i.append(t)})),(0,v.fc)(i,(e=>{const t=(0,he.Z)(e.target,"grid-item");if(!t||t.classList.contains("active"))return;const i=t.dataset.color;i&&this.applyColor(i)}),{listenerSetter:this.listenerSetter}),t.content.append(i),this.scrollable.append(t.container),this.applyColor=(0,je.Z)(this._applyColor,16,!0)}setActive(){const e=this.grid.querySelector(".active"),t=this.theme.background,i=t.color?this.grid.querySelector(`.grid-item[data-color="${t.color}"]`):null;e!==i&&(e&&e.classList.remove("active"),i&&i.classList.add("active"))}onOpen(){setTimeout((()=>{const e=this.theme.background,t=(e.color||"").split(",")[0],i=!!t&&!e.slug;i&&(this.colorPicker.onChange=this.onColorChange),this.colorPicker.setColor(t||"#cccccc"),i||(this.colorPicker.onChange=this.onColorChange)}),0)}onCloseAfterTimeout(){return this.colorPicker.onChange=void 0,this.colorPicker=void 0,super.onCloseAfterTimeout()}}var qe=i(7030),Qe=i(236),Ye=i(7814),Xe=i(9405),Je=i(9492),et=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class tt extends l._{constructor(){super(...arguments),this.tempId=0,this.clicked=new Set,this.wallPapersByElement=new Map,this.elementsByKey=new Map,this.onUploadClick=()=>{(function(e){const t=document.createElement("input");t.type="file",t.style.display="none",e&&(t.accept=e),document.body.append(t);const i=new Promise(((e,i)=>{t.addEventListener("change",(t=>{const s=t.target.files[0];s?e(s):i("NO_FILE_SELECTED")}),{once:!0})})).finally((()=>{t.remove()}));return t.click(),i})("image/x-png,image/png,image/jpeg").then((e=>et(this,void 0,void 0,(function*(){if(e.name.endsWith(".png")){const t=document.createElement("img"),i=URL.createObjectURL(e);yield(0,Ae.cj)(t,i,!1);const s="image/jpeg",{blob:n}=yield(0,Ye.Z)({media:t,size:new Xe.c(t.naturalWidth,t.naturalHeight),mimeType:s});e=new File([n],e.name.replace(/\.png$/,".jpg"),{type:s})}const t=yield this.managers.appDocsManager.prepareWallPaperUpload(e),i=this.managers.appDocsManager.uploadWallPaper(t.id),s=He.Z.getNewDeferredForUpload(e.name,i),n=(0,De.Z)();n.addNotifyListener=s.addNotifyListener,n.cancel=s.cancel,s.then((e=>{this.clicked.delete(a),this.elementsByKey.delete(a),this.wallPapersByElement.set(r,e);const t=this.getWallPaperKey(e);this.elementsByKey.set(t,r),this.setBackgroundDocument(e).then(n.resolve,n.reject)}),n.reject);const a=this.getWallPaperKey(t);n.catch((()=>{r.remove()}));const o=new ze.Z({isUpload:!0,cancelable:!0,tryAgainOnFail:!1}),r=this.addWallPaper(t,!1);this.clicked.add(a),o.attach(r,!1,n)}))))},this.onResetClick=()=>{const e=Qe.h.settings.themes.find((e=>e.name===this.theme.name));e&&(++this.tempId,this.theme.background=(0,Ne.Z)(e.background),this.managers.appStateManager.pushToState("settings",n.Z.settings),s.Z.applyCurrentTheme(void 0,void 0,!0),this.blurCheckboxField.setValueSilently(this.theme.background.blur))},this.onGridClick=e=>{const t=(0,he.Z)(e.target,"grid-item");if(!t)return;const i=this.wallPapersByElement.get(t);if("wallPaperNoFile"===i._)return void this.setBackgroundDocument(i);const s=this.getWallPaperKey(i);if(this.clicked.has(s))return;this.clicked.add(s);const n=i.document,a=new ze.Z({cancelable:!0,tryAgainOnFail:!1}),o=()=>et(this,void 0,void 0,(function*(){const e=this.setBackgroundDocument(i);(yield this.managers.thumbsStorage.getCacheContext(n)).url&&!this.theme.background.blur||a.attach(t,!0,e)}));a.construct(),(0,v.fc)(t,(e=>{a.preloader.parentElement?(a.onClick(e),a.detach()):o()}),{listenerSetter:this.listenerSetter}),o()},this.saveToCache=(e,t)=>{fetch(t).then((t=>{s.Z.cacheStorage.save("backgrounds/"+e,t)}))},this.setBackgroundDocument=e=>{const t=++this.tempId,i=()=>t===this.tempId,a=e.document,o=(0,De.Z)();let r;return a?(r=He.Z.downloadMediaURL({media:a,queueId:s.Z.chat.bubbles?s.Z.chat.bubbles.lazyLoadQueue.queueId:0}),o.addNotifyListener=r.addNotifyListener,o.cancel=r.cancel):r=Promise.resolve(),r.then((()=>et(this,void 0,void 0,(function*(){if(!i())return void o.resolve();const t=this.theme.background,r=a=>{let r;const d=this.getColorsFromWallPaper(e);if(a&&!d)r=function(e){const t=document.createElement("img");return(0,Ae.cj)(t,e,!1).then((()=>function(e,t,i){const s=document.createElement("canvas"),n=t/i;return 1===n?(s.width=50,s.height=s.width/n):n>1?(s.height=50,s.width=s.height/n):s.width=s.height=50,s.getContext("2d").drawImage(e,0,0,t,i,0,0,s.width,s.height),_e(s)}(t,t.naturalWidth,t.naturalHeight)))}(a);else{const{canvas:e}=Ue.Z.create(d);r=Promise.resolve(_e(e))}r.then((r=>{var l,c,h;if(!i())return void o.resolve();const u=Be(Array.from(r)),p=null!==(l=e.slug)&&void 0!==l?l:"";t.id=e.id,t.intensity=null!==(h=null===(c=e.settings)||void 0===c?void 0:c.intensity)&&void 0!==h?h:0,t.color=d,t.slug=p,t.highlightningColor=u,this.managers.appStateManager.pushToState("settings",n.Z.settings),p&&this.saveToCache(p,a),s.Z.applyCurrentTheme(p,a,!0).then(o.resolve)}))};if(!a)return void r();const d=yield this.managers.thumbsStorage.getCacheContext(a);t.blur?setTimeout((()=>{const{canvas:e,promise:t}=(0,Fe.Z)(d.url,12,4);t.then((()=>{i()?r(e.toDataURL()):o.resolve()}))}),200):r(d.url)})))),o},this.setActive=()=>{const e=this.grid.querySelector(".active"),t=this.elementsByKey.get(this.getWallPaperKeyFromTheme(this.theme));e!==t&&(e&&e.classList.remove("active"),t&&t.classList.add("active"))}}get theme(){return Ge.Z.getTheme()}init(){this.container.classList.add("background-container","background-image-container"),this.setTitle("ChatBackground");{const e=(0,b.R)(this.scrollable),i=(0,I.Z)("btn-primary btn-transparent",{icon:"cameraadd",text:"ChatBackground.UploadWallpaper"}),s=(0,I.Z)("btn-primary btn-transparent",{icon:"colorize",text:"SetColor"}),a=(0,I.Z)("btn-primary btn-transparent",{icon:"favourites",text:"Appearance.Reset"});(0,v.fc)(i,this.onUploadClick,{listenerSetter:this.listenerSetter}),(0,v.fc)(s,(()=>{this.slider.createTab($e).open()}),{listenerSetter:this.listenerSetter}),(0,v.fc)(a,this.onResetClick,{listenerSetter:this.listenerSetter});const o=this.blurCheckboxField=new Ce.Z({text:"ChatBackground.Blur",name:"blur",checked:this.theme.background.blur});this.listenerSetter.add(o.input)("change",(()=>et(this,void 0,void 0,(function*(){this.theme.background.blur=o.input.checked,yield this.managers.appStateManager.pushToState("settings",n.Z.settings),setTimeout((()=>{const e=t.querySelector(".active");if(!e)return;const i=this.wallPapersByElement.get(e);i.pFlags.pattern||"wallPaperNoFile"===i._||this.setBackgroundDocument(i)}),100)})))),e.append(i,s,a,(0,P.tG)(o).container)}n.Z.addEventListener("background_change",this.setActive),this.managers.appDocsManager.getWallPapers().then((e=>{e.forEach((e=>{this.addWallPaper(e)}))}));const e=(0,b.R)(this.scrollable),t=this.grid=document.createElement("div");t.classList.add("grid"),(0,v.fc)(t,this.onGridClick,{listenerSetter:this.listenerSetter}),e.append(t)}getColorsFromWallPaper(e){return e.settings?[e.settings.background_color,e.settings.second_background_color,e.settings.third_background_color,e.settings.fourth_background_color].filter(Boolean).map((e=>"#"+e.toString(16))).join(","):""}getWallPaperKey(e){return""+e.id}getWallPaperKeyFromTheme(e){return""+e.background.id}addWallPaper(e,t=!0){const i=this.getColorsFromWallPaper(e),s="wallPaper"===e._;if(s&&e.pFlags.pattern&&!i)return;const n=!!e.pFlags.dark,a=s?e.document:void 0,o=document.createElement("div");o.classList.add("grid-item"),o.dataset.id=""+e.id;const r=this.getWallPaperKey(e);this.wallPapersByElement.set(o,e),this.elementsByKey.set(r,o);const d=document.createElement("div");let l,c;if(d.classList.add("grid-item-media"),s?(c=(0,qe.Z)(a,200,200),l=(0,Je.Z)({photo:a,message:null,container:d,withoutPreloader:!0,size:c,noFadeIn:e.pFlags.pattern}),e.pFlags.pattern&&d.classList.add("is-pattern"),l.then((({loadPromises:e,images:t})=>et(this,void 0,void 0,(function*(){return(yield e.thumb)||e.full,t})))).then((t=>{var i;e.pFlags.pattern&&(n?(t.full.style.display="none",t.thumb&&(t.thumb.style.display="none")):(null===(i=e.settings)||void 0===i?void 0:i.intensity)&&(t.full.style.opacity=""+Math.abs(e.settings.intensity)/100)),Oe.Z.mutate((()=>{o.append(d)}))}))):o.append(d),e.settings&&void 0!==e.settings.background_color){const{canvas:t}=Ue.Z.create(i);t.classList.add("background-colors-canvas"),n&&s?l.then((({loadPromises:i})=>{i.full.then((()=>et(this,void 0,void 0,(function*(){const i=yield this.managers.thumbsStorage.getCacheContext(a,c.type);t.style.webkitMaskImage=`url(${i.url})`,t.style.opacity=""+(e.pFlags.dark?100+e.settings.intensity:e.settings.intensity)/100,d.append(t)}))))})):d.append(t)}return this.getWallPaperKeyFromTheme(this.theme)===r&&o.classList.add("active"),this.grid[t?"append":"prepend"](o),o}}var it=i(8938),st=i(2153),nt=i(6787),at=i(6761);var ot=i(3731),rt=i(62);class dt extends M.Z{init(){return this.setTitle("DoubleTapSetting"),this.container.classList.add("quick-reaction-container"),Promise.all([this.managers.appReactionsManager.getQuickReaction(),this.managers.appReactionsManager.getAvailableReactions()]).then((([e,t])=>{t=t.filter((e=>!e.pFlags.inactive));const i=new b.Z,s=t.map((t=>{const i=new A.Z({name:"quick-reaction",text:t.title,value:t.reaction,alignRight:!0}),s=new P.ZP({radioField:i,havePadding:!0});return i.main.classList.add("quick-reaction-title"),(0,rt.Z)({row:s,doc:t.static_icon,size:"small"}),t.reaction===e.reaction&&i.setValueSilently(!0),s})),n=(0,P.De)(s,(e=>{this.managers.appReactionsManager.setDefaultReaction({_:"reactionEmoji",emoticon:e})}));i.content.append(n),this.scrollable.append(i.container)}))}}var lt=i(1273);class ct{constructor(e,t,i,s,n,a=!0){const o="range-setting-selector";this.container=document.createElement("div"),this.container.classList.add(o);const r=document.createElement("div");r.classList.add(o+"-details");const d=document.createElement("div");d.classList.add(o+"-name"),(0,f.$d)(d,e);const l=this.valueContainer=document.createElement("div");l.classList.add(o+"-value"),a&&(l.innerHTML=""+i),r.append(d,l),this.range=new xe.Z({step:t,min:s,max:n},i),this.range.setListeners(),this.range.setHandlers({onScrub:e=>{this.onChange&&this.onChange(e),a&&(l.innerText=""+e)}}),this.container.append(r,this.range.container)}}class ht extends M.h{init(){this.container.classList.add("general-settings-container"),this.setTitle("General");const e=b.R.bind(null,this.scrollable);{const t=e("Settings"),i=new ct("TextSize",1,n.Z.settings.messagesTextSize,12,20);i.onChange=e=>{n.Z.managers.appStateManager.setByKey("settings.messagesTextSize",e)};const s=(0,I.Z)("btn-primary btn-transparent",{icon:"image",text:"ChatBackground"});(0,v.fc)(s,(()=>{this.slider.createTab(tt).open()}));const a=new Ce.Z({text:"EnableAnimations",name:"animations",stateKey:"settings.animationsEnabled",listenerSetter:this.listenerSetter});t.append(i.container,s,(0,P.tG)(a).container)}{const t=e("General.Keyboard"),i=document.createElement("form"),s="send-shortcut",n="settings.sendShortcut",a=new P.ZP({radioField:new A.Z({langKey:"General.SendShortcut.Enter",name:s,value:"enter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.ShiftEnter"}),o=new P.ZP({radioField:new A.Z({name:s,value:"ctrlEnter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.Enter"});(0,f.$d)(o.radioField.main,"General.SendShortcut.CtrlEnter",[z.IS_APPLE?"⌘":"Ctrl"]),i.append(a.container,o.container),t.append(i)}if(ot.Z){const t=e("DistanceUnitsTitle"),i=document.createElement("form"),s="distance-unit",n="settings.distanceUnit",a=new P.ZP({radioField:new A.Z({langKey:"DistanceUnitsKilometers",name:s,value:"kilometers",stateKey:n})}),o=new P.ZP({radioField:new A.Z({langKey:"DistanceUnitsMiles",name:s,value:"miles",stateKey:n})});i.append(a.container,o.container),t.append(i)}{const t=e("General.TimeFormat"),i=document.createElement("form"),s="time-format",n="settings.timeFormat",a=[["h12","General.TimeFormat.h12"],["h23","General.TimeFormat.h23"]],o=a.map((([e,t])=>new P.ZP({radioField:new A.Z({langKey:t,name:s,value:e,stateKey:n})}))),r=function(e,t=!0){return function(e,t,i=!0){const s=e;let n;return i||(e=Ie.Z),function i(){e(),n=at.Z.setTimeout(i,t())}(),e=s,()=>{clearTimeout(n)}}(e,(()=>1e3*(60-(new Date).getSeconds())),t)}((()=>{const e=new Date;a.forEach((([t],i)=>{const s=e.toLocaleTimeString("en-us-u-hc-"+t,{hour:"2-digit",minute:"2-digit"});o[i].subtitle.textContent=s}))}));this.eventListener.addEventListener("destroy",r),i.append(...o.map((e=>e.container))),t.append(i)}{const t=e("Emoji"),i=new Ce.Z({text:"GeneralSettings.EmojiPrediction",name:"suggest-emoji",stateKey:"settings.emoji.suggest",listenerSetter:this.listenerSetter}),s=new Ce.Z({text:"GeneralSettings.BigEmoji",name:"emoji-big",stateKey:"settings.emoji.big",listenerSetter:this.listenerSetter});t.append((0,P.tG)(i).container,(0,P.tG)(s).container)}{const e=new b.Z({name:"Telegram.InstalledStickerPacksController",caption:"StickersBotInfo"}),t=new P.ZP({titleLangKey:"DoubleTapSetting",havePadding:!0,clickable:()=>{this.slider.createTab(dt).open()},listenerSetter:this.listenerSetter}),i=()=>{this.managers.appReactionsManager.getQuickReaction().then((e=>"availableReaction"===e._?e.static_icon:this.managers.appEmojiManager.getCustomEmojiDocument(e.document_id))).then((e=>{(0,rt.Z)({row:t,doc:e,size:"small"})}))};i(),this.listenerSetter.add(n.Z)("quick_reaction",i);const s=new Ce.Z({text:"Stickers.SuggestStickers",name:"suggest",stateKey:"settings.stickers.suggest",listenerSetter:this.listenerSetter}),a=new Ce.Z({text:"InstalledStickers.LoopAnimated",name:"loop",stateKey:"settings.stickers.loop",listenerSetter:this.listenerSetter}),o={},r=e.generateContentElement(),d=new st.Z,l=(e,t="append")=>{const i=new P.ZP({title:(0,Q.Z)(e.title),subtitleLangKey:"Stickers",subtitleLangArgs:[e.count],havePadding:!0,clickable:()=>{new nt.Z({id:e.id,access_hash:e.access_hash}).show()},listenerSetter:this.listenerSetter});o[e.id]=i;const s=document.createElement("div");s.classList.add("row-media"),(0,lt.Z)({set:e,container:s,group:"GENERAL-SETTINGS",lazyLoadQueue:d,width:36,height:36,autoplay:!0}),i.container.append(s),r[t](i.container)};this.managers.appStickersManager.getAllStickers().then((e=>{(0,it.Z)(e);for(const t of e.sets)l(t)})),this.listenerSetter.add(n.Z)("stickers_installed",(e=>{o[e.id]||l(e,"prepend")})),this.listenerSetter.add(n.Z)("stickers_deleted",(e=>{o[e.id]&&(o[e.id].container.remove(),delete o[e.id])})),e.content.append(t.container,(0,P.tG)(s).container,(0,P.tG)(a).container),this.scrollable.append(e.container)}}onOpen(){this.init&&(this.init(),this.init=null)}}var ut=i(2010),pt=i(1447),ft=i(534),mt=i(4484),gt=i(1507),vt=i(2914),bt=i(2648),yt=i(1655),wt=i(3186),St=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Ct extends l._{constructor(){super(...arguments),this.filtersRendered={}}static getInitArgs(){return pt.Z.loadAnimationFromURLManually("Folders_1")}renderFolder(e,t,i,s){return St(this,void 0,void 0,(function*(){let n,a="";const o=[];if("dialogFilterSuggested"===e._)n=e.filter,a=e.description;else{if(n=e,1===Object.keys(n.pFlags).length){const e=n.pFlags;let t;e.contacts?t="FilterAllContacts":e.non_contacts?t="FilterAllNonContacts":e.groups?t="FilterAllGroups":e.broadcasts?t="FilterAllChannels":e.bots&&(t="FilterAllBots"),t&&o.push((0,f.ag)(t))}if(!o.length){const e=yield this.managers.dialogsStorage.getFolderDialogs(n.id);let t=0,i=0,s=0;yield Promise.all(e.map((e=>St(this,void 0,void 0,(function*(){(yield this.managers.appPeersManager.isAnyGroup(e.peerId))?s++:(yield this.managers.appPeersManager.isBroadcast(e.peerId))?i++:t++}))))),t&&o.push((0,f.ag)("Chats",[t])),i&&o.push((0,f.ag)("Channels",[i])),s&&o.push((0,f.ag)("Groups",[s]))}}if(i)n.id!==gt.J$&&(0,Z.Z)(i.title,(0,Q.Z)(n.title)),i.subtitle.textContent="",i.subtitle.append(...(0,f.v_)(o));else if(i=new P.ZP({title:n.id===gt.J$?(0,f.ag)("FilterAllChats"):(0,Q.Z)(n.title),subtitle:a,clickable:!0,buttonRightLangKey:"dialogFilterSuggested"===e._?"Add":void 0}),o.length&&i.subtitle.append(...(0,f.v_)(o)),"dialogFilter"===e._){const e=n.id;this.filtersRendered[n.id]||n.id===gt.J$||(0,v.fc)(i.container,(()=>St(this,void 0,void 0,(function*(){this.slider.createTab(ft.Z).open(yield this.managers.filtersStorage.getFilter(e))}))),{listenerSetter:this.listenerSetter}),this.filtersRendered[n.id]=i,i.makeSortable()}const r=i.container;if(s){const e=n.localId;void 0!==e?(0,mt.Z)(r,r.parentElement||t,e):t&&t.append(r)}return i}))}init(e=Ct.getInitArgs()){this.container.classList.add("chat-folders-container"),this.setTitle("ChatList.Filter.List.Title"),this.scrollable.container.classList.add("chat-folders"),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container");const t=document.createElement("div");t.classList.add("caption"),(0,f.XZ)({element:t,key:"ChatList.Filter.Header"}),this.createFolderBtn=(0,I.Z)("btn-primary btn-color-primary btn-control tgico",{text:"ChatList.Filter.NewTitle",icon:"add"}),this.foldersSection=new b.Z({name:"Filters"}),this.foldersSection.container.classList.add("hide"),this.list=document.createElement("div"),this.foldersSection.content.append(this.list),this.suggestedSection=new b.Z({name:"FilterRecommended"}),this.suggestedSection.container.classList.add("hide"),this.scrollable.append(this.stickerContainer,t,this.createFolderBtn,this.foldersSection.container,this.suggestedSection.container),(0,v.fc)(this.createFolderBtn,(()=>St(this,void 0,void 0,(function*(){(yield this.canCreateFolder())?this.slider.createTab(ft.Z).open():(0,wt.Z)("folders")}))),{listenerSetter:this.listenerSetter});const i=()=>{this.foldersSection.container.classList.toggle("hide",!Object.keys(this.filtersRendered).length)};return this.managers.filtersStorage.getDialogFilters().then((e=>St(this,void 0,void 0,(function*(){for(const t of e)t.id!==gt.Zi&&(yield this.renderFolder(t,this.list,void 0,!0));this.toggleAllChats(),i()})))),this.listenerSetter.add(n.Z)("filter_update",(e=>St(this,void 0,void 0,(function*(){const t=this.filtersRendered[e.id];t?yield this.renderFolder(e,null,t):e.id!==gt.Zi&&(yield this.renderFolder(e,this.list,void 0,!0)),i(),this.getSuggestedFilters()})))),this.listenerSetter.add(n.Z)("filter_delete",(e=>{const t=this.filtersRendered[e.id];t&&(this.getSuggestedFilters(),t.container.remove(),delete this.filtersRendered[e.id]),i()})),this.listenerSetter.add(n.Z)("filter_order",(e=>{e.filter((e=>!!this.filtersRendered[e])).forEach(((e,t)=>{const i=this.filtersRendered[e].container;(0,mt.Z)(i,i.parentElement,t+1)}))})),this.listenerSetter.add(n.Z)("premium_toggle",(()=>{this.toggleAllChats()})),this.loadAnimationPromise=e.then((e=>St(this,void 0,void 0,(function*(){const t=yield e({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86});return this.animation=t,pt.Z.waitForFirstFrame(t)})))),new vt.Z({list:this.list,middleware:this.middlewareHelper.get(),onSort:(e,t)=>{let i=[];for(const e in this.filtersRendered){const t=this.filtersRendered[e];i[(0,bt.Z)(t.container)]=+e}i=i.filter((e=>void 0!==e)),n.Z.premium||(0,yt.Z)(i,gt.J$),this.managers.filtersStorage.updateDialogFiltersOrder(i)},scrollable:this.scrollable}),this.getSuggestedFilters(),this.loadAnimationPromise}onOpenAfterTimeout(){return this.loadAnimationPromise.then((()=>{this.animation.autoplay=!0,this.animation.play()})),super.onOpenAfterTimeout()}toggleAllChats(){this.filtersRendered[gt.J$].container.classList.toggle("hide",!n.Z.premium)}canCreateFolder(){return St(this,void 0,void 0,(function*(){const[e,t]=yield Promise.all([this.managers.apiManager.getLimit("folders"),this.managers.filtersStorage.getDialogFilters()]);return t.filter((e=>!gt.DZ.has(e.id))).lengthSt(this,void 0,void 0,(function*(){this.suggestedSection.container.classList.toggle("hide",!e.length),Array.from(this.suggestedSection.content.children).slice(1).forEach((e=>e.remove()));for(const t of e){const e=yield this.renderFolder(t);this.suggestedSection.content.append(e.container);const i=e.buttonRight;(0,v.fc)(i,(s=>St(this,void 0,void 0,(function*(){if((0,K.Z)(s),!(yield this.canCreateFolder()))return void(0,wt.Z)("folders");i.setAttribute("disabled","true");const n=t.filter;n.includePeerIds=[],n.excludePeerIds=[],n.pinnedPeerIds=[],this.managers.filtersStorage.createDialogFilter(n,!0).then((()=>{e.container.remove(),this.suggestedSection.container.classList.toggle("hide",1===this.suggestedSection.content.childElementCount)})).finally((()=>{i.removeAttribute("disabled")}))}))),{listenerSetter:this.listenerSetter})}}))))}}var Lt=i(3855),Et=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class It extends M.h{init(){this.container.classList.add("notifications-container"),this.setTitle("Telegram.NotificationSettingsViewController");const e=e=>{const t=new b.Z({name:e.name}),i=new P.ZP({checkboxField:new Ce.Z({text:e.typeText,checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0}),s=new P.ZP({checkboxField:new Ce.Z({text:"MessagePreview",checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0});t.content.append(i.container,s.container),this.scrollable.append(t.container);const a={_:e.inputKey},o=this.managers.appNotificationsManager.getNotifySettings(a);(o instanceof Promise?o:Promise.resolve(o)).then((t=>{const o=()=>Et(this,void 0,void 0,(function*(){const e=yield this.managers.appNotificationsManager.isMuted(t);return i.checkboxField.checked=!e,s.checkboxField.checked=t.show_previews,e}));o(),this.eventListener.addEventListener("destroy",(()=>Et(this,void 0,void 0,(function*(){const e=!i.checkboxField.checked,n=s.checkboxField.checked;if(e===(yield this.managers.appNotificationsManager.isMuted(t))&&n===t.show_previews)return;const o=(0,Ne.Z)(t);o._="inputPeerNotifySettings",o.mute_until=e?gt.rU:0,o.show_previews=n,this.managers.appNotificationsManager.updateNotifySettings(a,o)}))),{once:!0}),this.listenerSetter.add(n.Z)("notify_settings",(i=>{const s=Le(i.peer._);e.inputKey===s&&(t=i.notify_settings,o())}))}))};e({name:"NotificationsPrivateChats",typeText:"NotificationsForPrivateChats",inputKey:"inputNotifyUsers"}),e({name:"NotificationsGroups",typeText:"NotificationsForGroups",inputKey:"inputNotifyChats"}),e({name:"NotificationsChannels",typeText:"NotificationsForChannels",inputKey:"inputNotifyBroadcasts"});{const e=new b.Z({name:"NotificationsOther"}),t=new P.ZP({checkboxField:new Ce.Z({text:"ContactJoined",checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0}),i=new P.ZP({checkboxField:new Ce.Z({text:"Notifications.Sound",checked:!0,stateKey:"settings.notifications.sound",listenerSetter:this.listenerSetter}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0});Lt.Z.getState().then((e=>{i.checkboxField.checked=e.settings.notifications.sound})),e.content.append(t.container,i.container),this.scrollable.append(e.container),this.managers.appNotificationsManager.getContactSignUpNotification().then((e=>{t.checkboxField.checked=e,this.eventListener.addEventListener("destroy",(()=>{const i=t.checkboxField.checked;e!==i&&this.managers.appNotificationsManager.setContactSignUpNotification(!i)}),{once:!0})}))}}}class Mt extends l._{static getInitArgs(){return{languages1:n.Z.managers.apiManager.invokeApiCacheable("langpack.getLanguages",{lang_pack:"web"}),languages2:Promise.resolve([])}}init(e){this.header.classList.add("with-border"),this.container.classList.add("language-container"),this.setTitle("Telegram.LanguageViewController");const t=new b.Z({}),i=new Map,s=Promise.all([e.languages1,e.languages2]).then((([e,s])=>{const n=new Set,a=e.map((e=>e.lang_code)),o=(0,k.a)();e.concat(s).forEach((e=>{if(n.has(e.lang_code))return;n.add(e.lang_code);const t=new P.ZP({radioField:new A.Z({text:e.name,name:o,value:e.lang_code}),subtitle:e.native_name});i.set(e.lang_code,t)}));const r=(0,P.De)([...i.values()],(e=>{f.ZP.getLangPack(e,a.includes(e))}));f.ZP.getCacheLangPack().then((e=>{const t=i.get(e.lang_code);t?t.radioField.setValueSilently(!0):console.error("no row",t,e)})),t.content.append(r)}));return this.scrollable.append(t.container),s}}var Pt=i(4081),Zt=i(6848),kt=i(5701);function Tt(e,t,i){const s=new b.Z({name:t}),n="settings.autoDownload."+e+".",a=new Ce.Z({text:"AutodownloadContacts",name:"contacts",stateKey:n+"contacts",listenerSetter:i}),o=new Ce.Z({text:"AutodownloadPrivateChats",name:"private",stateKey:n+"private",listenerSetter:i}),r=new Ce.Z({text:"AutodownloadGroupChats",name:"groups",stateKey:n+"groups",listenerSetter:i}),d=new Ce.Z({text:"AutodownloadChannels",name:"channels",stateKey:n+"channels",listenerSetter:i});return s.content.append((0,P.tG)(a).container,(0,P.tG)(o).container,(0,P.tG)(r).container,(0,P.tG)(d).container),s}class xt extends M.h{init(){this.setTitle("AutoDownloadPhotos");const e=Tt("photo","AutoDownloadPhotosTitle",this.listenerSetter);this.scrollable.append(e.container)}}class At extends M.h{init(){this.setTitle("AutoDownloadFiles");const e=(0,kt.Z)((e=>{this.managers.appStateManager.setByKey("settings.autoDownloadNew.file_size_max",e)}),200,!1,!0),t=Tt("file","AutoDownloadFilesTitle",this.listenerSetter),i=524288,s=20447232,a=n.Z.settings.autoDownloadNew.file_size_max,o=Math.sqrt(Math.sqrt((a-i)/s)),r=new f.ZP.IntlElement({key:"AutodownloadSizeLimitUpTo",args:[(0,Pt.Z)(a)]}),d=new ct("AutoDownloadMaxFileSize",.01,o,0,1,!1);d.onChange=t=>{const n=Math.pow(t,4)*s+i|0;r.compareAndUpdate({args:[(0,Pt.Z)(n)]}),e(n)},d.valueContainer.append(r.element),t.content.append(d.container),this.scrollable.append(t.container)}}class _t extends M.h{init(){this.setTitle("AutoDownloadVideos");const e=Tt("video","AutoDownloadVideosTitle",this.listenerSetter);this.scrollable.append(e.container)}}const Ft={contacts:"AutoDownloadContacts",private:"AutoDownloadPm",groups:"AutoDownloadGroups",channels:"AutoDownloadChannels"};class Dt extends M.h{init(){return e=this,t=void 0,s=function*(){this.setTitle("DataSettings");{const e=new b.Z({name:"AutomaticMediaDownload",caption:"AutoDownloadAudioInfo"}),t=yield Lt.Z.getState(),i=new Ce.Z({text:"AutoDownloadMedia",name:"auto",checked:!t.settings.autoDownloadNew.pFlags.disabled,listenerSetter:this.listenerSetter}),s=new P.ZP({checkboxField:i,listenerSetter:this.listenerSetter}),a=()=>{(0,G.Z)([h],(0,Zt.Z)(t.settings.autoDownload,Qe.h.settings.autoDownload)&&(0,Zt.Z)(t.settings.autoDownloadNew,Qe.h.settings.autoDownloadNew))},o=()=>{this.setAutoDownloadSubtitle(d,t.settings.autoDownload.photo),this.setAutoDownloadSubtitle(l,t.settings.autoDownload.video),this.setAutoDownloadSubtitle(c,t.settings.autoDownload.file,t.settings.autoDownloadNew.file_size_max)},r=e=>{const t=this.slider.createTab(e);t.open(),this.listenerSetter.add(t.eventListener)("destroy",(()=>{o(),a()}),{once:!0})},d=new P.ZP({titleLangKey:"AutoDownloadPhotos",subtitle:"",clickable:()=>{r(xt)},listenerSetter:this.listenerSetter}),l=new P.ZP({titleLangKey:"AutoDownloadVideos",subtitle:"",clickable:()=>{r(_t)},listenerSetter:this.listenerSetter}),c=new P.ZP({titleLangKey:"AutoDownloadFiles",subtitle:"",clickable:()=>{r(At)},listenerSetter:this.listenerSetter}),h=(0,I.Z)("btn-primary btn-transparent primary",{icon:"delete",text:"ResetAutomaticMediaDownload"});(0,v.fc)(h,(()=>{(0,Ee.Z)({titleLangKey:"ResetAutomaticMediaDownloadAlertTitle",descriptionLangKey:"ResetAutomaticMediaDownloadAlert",button:{langKey:"Reset"}}).then((()=>{const e=n.Z.settings;e.autoDownloadNew=(0,Ne.Z)(Qe.h.settings.autoDownloadNew),e.autoDownload=(0,Ne.Z)(Qe.h.settings.autoDownload),t.settings=e,this.managers.appStateManager.setByKey("settings",e),o(),i.checked=!t.settings.autoDownloadNew.pFlags.disabled}))}));const u=()=>{const e=!i.checked,t=n.Z.settings;e?t.autoDownloadNew.pFlags.disabled=!0:delete t.autoDownloadNew.pFlags.disabled,[d,l,c].forEach((t=>{t.container.classList.toggle("is-disabled",e)})),this.managers.appStateManager.setByKey("settings",t),a()};i.input.addEventListener("change",u),u(),o(),e.content.append(s.container,d.container,l.container,c.container,h),this.scrollable.append(e.container)}{const e=new b.Z({name:"AutoplayMedia"});e.content.append(new P.ZP({checkboxField:new Ce.Z({text:"AutoplayGIF",name:"gifs",stateKey:"settings.autoPlay.gifs",listenerSetter:this.listenerSetter}),listenerSetter:this.listenerSetter}).container,new P.ZP({checkboxField:new Ce.Z({text:"AutoplayVideo",name:"videos",stateKey:"settings.autoPlay.videos",listenerSetter:this.listenerSetter}),listenerSetter:this.listenerSetter}).container),this.scrollable.append(e.container)}},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}setAutoDownloadSubtitle(e,t,i){let s;const n=[],a=Object.keys(t),o=a.map((e=>t[e]?Ft[e]:void 0)).filter(Boolean);if(o.length&&0!==i){const e=o.length===a.length;if(void 0!==i?(s=e?"AutoDownloadUpToOnAllChats":"AutoDownloadOnUpToFor",n.push((0,Pt.Z)(i))):s=e?"AutoDownloadOnAllChats":"AutoDownloadOnFor",!e){const e=document.createElement("span");e.append(...(0,f.v_)(o.map((e=>(0,f.ag)(e))),!0,!1)),n.push(e)}}else s="AutoDownloadOff";(0,Z.Z)(e.subtitle,(0,f.ag)(s,n))}}var Rt=i(2230),Bt=i(8261),Nt=i(6765),Ot=i(1168),Ut=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Ht extends l._{constructor(){super(...arguments),this.buttons={}}init(){return Ut(this,void 0,void 0,(function*(){this.container.classList.add("settings-container"),this.setTitle("Settings");const e=(0,E.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[{icon:"logout",text:"EditAccount.Logout",onClick:()=>{new B.Z("logout",{titleLangKey:"LogOut",descriptionLangKey:"LogOut.Description",buttons:[{langKey:"LogOut",callback:()=>{this.managers.apiManager.logOut()},isDanger:!0}]}).show()}}]});this.buttons.edit=(0,Rt.Z)("edit"),this.header.append(this.buttons.edit,e),this.profile=new Bt.Z(this.managers,this.scrollable,this.listenerSetter,!1),this.profile.init(),this.profile.setPeer(n.Z.myId);const t=this.profile.fillProfileElements(),i=(0,I.Z)("btn-circle btn-corner z-depth-1 profile-change-avatar",{icon:"cameraadd"});(0,v.fc)(i,(()=>{const e=document.createElement("canvas");Ot.Z.createPopup(Nt.Z).open(e,(e=>{e().then((e=>this.managers.appProfileManager.uploadProfilePhoto(e)))}))}),{listenerSetter:this.listenerSetter}),this.profile.element.lastElementChild.firstElementChild.append(i);const s=()=>Ut(this,void 0,void 0,(function*(){var e;const t=yield this.managers.appUsersManager.getSelf();i.classList.toggle("hide","userProfilePhoto"!==(null===(e=t.photo)||void 0===e?void 0:e._))}));s(),this.listenerSetter.add(n.Z)("avatar_update",(({peerId:e})=>{n.Z.myId===e&&s()}));const a=document.createElement("div");a.classList.add("profile-buttons");const o=(e,t,i,s)=>{if(!s){const e=i.getInitArgs;e&&(s=()=>[e(this)])}return{icon:e,text:t,tabConstructor:i,getInitArgs:s,args:null==s?void 0:s()}},r=[o("unmute","AccountSettings.Notifications",It),o("data","DataSettings",Dt),o("lock","AccountSettings.PrivacyAndSecurity",Te),o("settings","Telegram.GeneralSettingsViewController",ht),o("folder","AccountSettings.Filters",Ct)].map((e=>{const{icon:t,text:i,tabConstructor:s,getInitArgs:n}=e;return new P.ZP({titleLangKey:i,icon:t,clickable:()=>Ut(this,void 0,void 0,(function*(){const t=e.args?yield e.args:[],i=this.slider.createTab(s);i.open(...t),i instanceof M.h&&n&&i.eventListener.addEventListener("destroyAfter",(t=>{e.args=t.then((()=>n()))}))})),listenerSetter:this.listenerSetter})})),d=Mt.getInitArgs();r.push(this.devicesRow=new P.ZP({titleLangKey:"Devices",titleRightSecondary:" ",icon:"activesessions",clickable:()=>Ut(this,void 0,void 0,(function*(){this.authorizations||(yield this.updateActiveSessions());const e=this.slider.createTab(ge);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.authorizations=void 0,this.updateActiveSessions(!0)}),{once:!0}),e.open()})),listenerSetter:this.listenerSetter}),this.languageRow=new P.ZP({titleLangKey:"AccountSettings.Language",titleRightSecondary:(0,f.ag)("LanguageName"),icon:"language",clickable:()=>{this.slider.createTab(Mt).open(d)},listenerSetter:this.listenerSetter})),a.append(...r.map((e=>e.container)));const l=new b.Z;l.content.append(a),this.scrollable.append(this.profile.element,l.container);const c=()=>{h=ut.Z.getInitArgs()};let h;(0,v.fc)(this.buttons.edit,(()=>{this.slider.createTab(ut.Z).open(h)}),{listenerSetter:this.listenerSetter}),c(),this.listenerSetter.add(n.Z)("user_update",(e=>{n.Z.myId.toUserId()===e&&c()})),pt.Z.loadLottieWorkers(),this.updateActiveSessions(),(yield t)()}))}getAuthorizations(e){if(this.getAuthorizationsPromise&&!e)return this.getAuthorizationsPromise;const t=this.getAuthorizationsPromise=this.managers.apiManager.invokeApi("account.getAuthorizations").finally((()=>{this.getAuthorizationsPromise===t&&(this.getAuthorizationsPromise=void 0)}));return t}updateActiveSessions(e){return this.getAuthorizations(e).then((e=>{this.authorizations=e.authorizations,this.devicesRow.titleRight.textContent=""+this.authorizations.length}))}onCloseAfterTimeout(){return this.profile.destroy(),super.onCloseAfterTimeout()}}class zt extends l._{constructor(){super(...arguments),this.uploadAvatar=null}init(){this.container.classList.add("new-channel-container"),this.setTitle("NewChannel"),this.avatarEdit=new p.Z((e=>{this.uploadAvatar=e}));const e=new b.Z({caption:"Channel.DescriptionHolderDescrpiton"}),t=document.createElement("div");t.classList.add("input-wrapper"),this.channelNameInputField=new u.ZP({label:"EnterChannelName",maxLength:128}),this.channelDescriptionInputField=new u.ZP({label:"DescriptionOptionalPlaceholder",maxLength:255}),t.append(this.channelNameInputField.container,this.channelDescriptionInputField.container);const i=()=>{this.nextBtn.classList.toggle("is-visible",!!this.channelNameInputField.value.length&&!this.channelNameInputField.input.classList.contains("error")&&!this.channelDescriptionInputField.input.classList.contains("error"))};this.channelNameInputField.input.addEventListener("input",i),this.channelDescriptionInputField.input.addEventListener("input",i),this.nextBtn=(0,m.Z)({icon:"arrow_next"}),(0,v.fc)(this.nextBtn,(()=>{const e=this.channelNameInputField.value,t=this.channelDescriptionInputField.value;this.nextBtn.disabled=!0,this.managers.appChatsManager.createChannel({title:e,about:t,broadcast:!0}).then((e=>{this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),s.Z.setInnerPeer({peerId:e.toPeerId(!0)}),hi.removeTabFromHistory(this),this.slider.createTab(_.Z).open({type:"channel",skippable:!0,title:"GroupAddMembers",placeholder:"SendMessageTo",takeOut:t=>this.managers.appChatsManager.inviteToChannel(e,t)})}))}),{listenerSetter:this.listenerSetter}),this.content.append(this.nextBtn),e.content.append(this.avatarEdit.container,t),this.scrollable.append(e.container)}onCloseAfterTimeout(){return this.avatarEdit.clear(),this.uploadAvatar=null,this.channelNameInputField.value="",this.channelDescriptionInputField.value="",this.nextBtn.disabled=!1,super.onCloseAfterTimeout()}}var jt=i(241),Gt=i(2621),Vt=i(709),Kt=i(6272);class Wt extends Ot.Z{constructor(){super("popup-create-contact popup-send-photo popup-new-media",{closable:!0,withConfirm:"Add",title:"AddContactTitle"}),this.construct()}construct(){return e=this,t=void 0,s=function*(){(0,v.fc)(this.btnConfirm,(()=>{const e=this.managers.appUsersManager.importContact(i.value,s.value,n.value);e.then((()=>{this.hide()}),(e=>{"NO_USER"===e.type&&((0,ee.bC)({langPackKey:"Contacts.PhoneNumber.NotRegistred"}),d.disabled=!1)})),d.lockWithPromise(e)}),{listenerSetter:this.listenerSetter});const e=[],t=document.createElement("div");t.classList.add("name-fields");const i=new u.ZP({label:"FirstName",name:"create-contact-name",maxLength:70,required:!0}),s=new u.ZP({label:"LastName",name:"create-contact-lastname",maxLength:70}),n=new Vt.Z({required:!0});e.push(i,s,n);const a=()=>{const e=i.value+" "+s.value;d.avatarElem.peerTitle=e,d.avatarElem.update()};this.listenerSetter.add(i.input)("input",a),this.listenerSetter.add(s.input)("input",a),n.validate=()=>!!n.value.match(/\d/);const o=yield this.managers.appUsersManager.getSelf(),r=(0,Kt.u)(o.phone);r.code&&(n.value="+"+r.code.country_code);const d=new Gt.Z({inputFields:e,listenerSetter:this.listenerSetter,doNotEditAvatar:!0,nextBtn:this.btnConfirm,avatarSize:100});t.append(i.container,s.container,d.avatarElem),this.container.append(t,n.container),this.show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var $t=i(2894),qt=i(3624);class Qt extends l._{init(){this.container.id="contacts-container";const e=(0,m.Z)({icon:"add",className:"is-visible"});this.content.append(e),(0,v.fc)(e,(()=>{Ot.Z.createPopup(Wt)}),{listenerSetter:this.listenerSetter}),this.inputSearch=new d.Z("Search",(e=>{this.openContacts(e)})),this.listenerSetter.add(n.Z)("contacts_update",(e=>{return t=this,i=void 0,n=function*(){const t=yield this.managers.appUsersManager.isContact(e),i=e.toPeerId();t?this.sortedUserList.add(i):this.sortedUserList.delete(i)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n})),this.title.replaceWith(this.inputSearch.container),this.middleware=(0,qt.k)(),this.openContacts()}createList(){const e=new $t.Z({managers:this.managers}),t=e.list;return t.id="contacts",t.classList.add("contacts-container"),h.default.setListClickListener(t,(()=>{this.close()}),void 0,!0),e}onClose(){this.middleware.clean()}onOpenAfterTimeout(){!z.IS_MOBILE&&j(!0)&&this.inputSearch.input.focus()}openContacts(e){this.middleware.clean();const t=this.middleware.get();this.scrollable.onScrolledBottom=null,this.scrollable.container.textContent="",this.managers.appUsersManager.getContactsPeerIds(e,void 0,"online").then((e=>{if(!t())return;const i=this.sortedUserList=this.createList();let s=()=>{const t=jt.Z.height/56*1.25|0;e.splice(0,t).forEach((e=>{i.add(e)})),e.length||(s=void 0,this.scrollable.onScrolledBottom=null)};s(),this.scrollable.onScrolledBottom=()=>{s?s():this.scrollable.onScrolledBottom=null},(0,Z.Z)(this.scrollable.container,i.list)}))}}class Yt extends l._{init(){if(this.wasFilterId=h.default.filterId,this.container.id="chats-archived-container",this.setTitle("ArchivedChats"),this.header.classList.add("can-have-forum"),this.content.classList.add("can-have-forum"),!h.default.xds[Yt.filterId]){const{ul:e,scrollable:t}=h.default.l({title:void 0,id:Yt.filterId,localId:gt.Zi});t.container.append(e)}const e=h.default.xds[Yt.filterId].scrollable;return this.scrollable.container.replaceWith(e.container),e.attachBorderListeners(this.container),h.default.setFilterIdAndChangeTab(Yt.filterId).then((({cached:e,renderPromise:t})=>{if(e)return t}))}onOpenAfterTimeout(){h.default.xds[this.wasFilterId].clear()}onClose(){this.scrollable.onAdditionalScroll=void 0,h.default.setFilterIdAndChangeTab(this.wasFilterId)}onCloseAfterTimeout(){return h.default.xds[Yt.filterId].clear(),super.onCloseAfterTimeout()}}Yt.filterId=gt.Zi;class Xt extends l._{constructor(){super(...arguments),this.isLocationWatched=!1}parseDistance(e){return"miles"===n.Z.settings.distanceUnit?e>1609.34?(0,f.ag)("MilesAway",[Math.round(e/1609)]):(0,f.ag)("FootsAway",[Math.round(3.281*e)]):e>=1e3?(0,f.ag)("KMetersAway2",[e/1e3]):(0,f.ag)("MetersAway2",[e])}startWatching(){this.latestLocationSaved&&!this.isLocationWatched&&(this.isLocationWatched=!0,(0,ee.Am)("Your position is now being shared. Do not close the page or it will be suspended."),this.managers.appUsersManager.getLocated(this.latestLocationSaved.latitude,this.latestLocationSaved.longitude,this.latestLocationSaved.accuracy,!0,2147483647),navigator.geolocation.watchPosition((e=>{const t=e.coords.longitude!==this.latestLocationSaved.longitude,i=e.coords.latitude!==this.latestLocationSaved.latitude,s=this.calculateDistance(e.coords.latitude,e.coords.longitude,this.latestLocationSaved.latitude,this.latestLocationSaved.longitude)>100;(i||t)&&s&&(this.managers.appUsersManager.getLocated(e.coords.latitude,e.coords.longitude,e.coords.accuracy,!0,2147483647),this.latestLocationSaved={latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy})})))}stopWatching(){this.isLocationWatched&&(this.isLocationWatched=!1,(0,ee.Am)("The sharing of your position has been stopped. You will no longer be visible to other users."),this.managers.appUsersManager.getLocated(0,0,0,!1,0))}calculateDistance(e,t,i,s){const n=.017453292519943295;return 12742*Math.asin(Math.sqrt(.5-Math.cos((i-e)*n)+Math.cos(e*n)*Math.cos(i*n)*(1-Math.cos((s-t)*n)/2)))}}var Jt=i(6385),ei=i(8842),ti=i(4159),ii=i(7487),si=i(1405),ni=i(2559),ai=i(4755),oi=i(3035),ri=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const di="is-left-column-shown";class li extends l.Z{constructor(){super({sidebarEl:document.getElementById("column-left"),navigationType:"left"}),this.searchGroups={}}construct(e){this.managers=e,this.inputSearch=new d.Z("Search");const t=this.sidebarEl.querySelector(".item-main .sidebar-header");t.append(this.inputSearch.container);const i=()=>{this.createTab(Qt).open()};this.backBtn=this.sidebarEl.querySelector(".sidebar-back-button");const a={icon:"archive",text:"ArchivedChats",onClick:()=>{this.createTab(Yt).open()},verify:()=>ri(this,void 0,void 0,(function*(){return!!(yield this.managers.dialogsStorage.getFolderDialogs(gt.Zi,!1)).length||!(yield this.managers.dialogsStorage.isDialogsLoaded(gt.Zi))}))},o=new Ce.Z({toggle:!0,checked:"night"===Ge.Z.getTheme().name});o.input.addEventListener("change",(()=>ri(this,void 0,void 0,(function*(){yield this.managers.appStateManager.setByKey("settings.theme",o.input.checked?"night":"day"),n.Z.dispatchEvent("theme_change")})))),n.Z.addEventListener("theme_change",(()=>{o.setValueSilently("night"===Ge.Z.getTheme().name)}));const r=[{icon:"savedmessages",text:"SavedMessages",onClick:()=>{setTimeout((()=>{s.Z.setPeer({peerId:s.Z.myId})}),0)}},a,{icon:"user",text:"Contacts",onClick:i},ot.Z?{icon:"group",text:"PeopleNearby",onClick:()=>{this.createTab(Xt).open()}}:void 0,{icon:"settings",text:"Settings",onClick:()=>{this.createTab(Ht).open()}},{icon:"darkmode",text:"DarkMode",onClick:()=>{},checkboxField:o},{icon:"animations",text:"Animations",onClick:()=>{},checkboxField:new Ce.Z({toggle:!0,checked:!0,stateKey:"settings.animationsEnabled"})},{icon:"help",text:"TelegramFeatures",onClick:()=>{const e=f.ZP.format("TelegramFeaturesUrl",!0);s.Z.openUrl(e)}},{icon:"bug",text:"ReportBug",onClick:()=>{const e=document.createElement("a");e.target="_blank",e.href="https://bugs.telegram.org/?tag_ids=40&sort=time",document.body.append(e),e.click(),setTimeout((()=>{e.remove()}),0)}},{icon:"char z",text:"ChatList.Menu.SwitchTo.Z",onClick:()=>{Promise.all([ii.Z.set({kz_version:"Z"}),ii.Z.delete("tgme_sync")]).then((()=>{location.href="https://web.telegram.org/z/"}))},verify:()=>ti.Z.isMainDomain},{icon:"char w",text:"ChatList.Menu.SwitchTo.Webogram",onClick:()=>{ii.Z.delete("tgme_sync").then((()=>{location.href="https://web.telegram.org/?legacy=1"}))},verify:()=>ti.Z.isMainDomain}].filter(Boolean);this.toolsBtn=(0,E.Z)({direction:"bottom-right",buttons:r,onOpen:(e,t)=>{var i;const s=document.createElement("a");s.href="https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md",s.target="_blank",s.rel="noopener noreferrer",s.classList.add("btn-menu-footer"),s.addEventListener(v.pf,(e=>{e.stopPropagation(),me.Z.close()}));const n=document.createElement("span");n.classList.add("btn-menu-footer-text"),n.innerHTML="Telegram Web"+ti.Z.suffix+" "+ti.Z.versionFull,s.append(n),t.classList.add("has-footer"),t.append(s),null===(i=a.element)||void 0===i||i.append(this.archivedCount)}}),this.toolsBtn.classList.remove("tgico-more"),this.toolsBtn.classList.add("sidebar-tools-button","is-visible"),this.backBtn.parentElement.insertBefore(this.toolsBtn,this.backBtn),this.newBtnMenu=(0,E.Z)({direction:"top-left",buttons:[{icon:"newchannel",text:"NewChannel",onClick:()=>{this.createTab(zt).open()}},{icon:"newgroup",text:"NewGroup",onClick:()=>{this.createTab(_.Z).open({type:"chat",skippable:!1,takeOut:e=>this.createTab(y).open(e),title:"GroupAddMembers",placeholder:"SendMessageTo"})}},{icon:"newprivate",text:"NewPrivateChat",onClick:i}]}),this.newBtnMenu.className="btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon",this.newBtnMenu.insertAdjacentHTML("afterbegin",'\n \n \n '),this.newBtnMenu.id="new-menu",t.nextElementSibling.append(this.newBtnMenu),this.updateBtn=document.createElement("div"),this.updateBtn.className="btn-circle rp btn-corner z-depth-1 btn-update is-hidden",(0,si.Z)(this.updateBtn),this.updateBtn.append((0,f.ag)("Update")),(0,v.fc)(this.updateBtn,(()=>{this.updateBtn.classList.contains("is-hidden")||location.reload()})),t.nextElementSibling.append(this.updateBtn),this.inputSearch.input.addEventListener("focus",(()=>this.initSearch()),{once:!0}),this.archivedCount=document.createElement("span"),this.archivedCount.className="archived-count badge badge-24 badge-gray",n.Z.addEventListener("folder_unread",(e=>{if(e.id===gt.Zi){const t=e.unreadPeerIds.size;this.archivedCount.textContent=""+(0,ni.Z)(t,1),this.archivedCount.classList.toggle("hide",!t)}})),this.managers.appUsersManager.getTopPeers("correspondents");const l={type:"global-search-focus",onPop:()=>(setTimeout((()=>{this.inputSearch.input.focus()}),0),!1),noHistory:!0};Jt.Z.pushItem(l),Lt.Z.getState().then((()=>{const e=setInterval((()=>{fetch("version",{cache:"no-cache"}).then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((t=>{t!==ti.Z.versionFull&&(this.hasUpdate=!0,clearInterval(e),this.newBtnMenu.classList.contains("is-hidden")||this.updateBtn.classList.remove("is-hidden"))})).catch(Ie.Z)}),18e5)}));const c=()=>{const e=this.rect=this.tabsContainer.getBoundingClientRect();document.documentElement.style.setProperty("--left-column-width",e.width+"px")};(0,oi.T2)(c),ai.Z.addEventListener("resize",c)}initSearch(){const e=this.sidebarEl.querySelector("#search-container"),t=new r.ZP(e),i=()=>{(0,v.tH)(this.backBtn)};this.searchGroups={contacts:new a.z("SearchAllChatsShort","contacts",void 0,void 0,void 0,void 0,i),globalContacts:new a.z("GlobalSearch","contacts",void 0,void 0,void 0,void 0,i),messages:new a.z("SearchMessages","messages"),people:new a.z(!1,"contacts",!0,"search-group-people",!0,!1,i,!0),recent:new a.z("Recent","contacts",!0,"search-group-recent",!0,!0,i)};const s=this.searchSuper=new S.Z({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"FilterChats",type:"chats"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:t,searchGroups:this.searchGroups,asChatList:!0,hideEmptyTabs:!1,showSender:!0,managers:this.managers});e.prepend(s.nav.parentElement.parentElement),t.container.append(s.container),s.setQuery({peerId:"".toPeerId(),folderId:0}),s.selectTab(0),s.load(!0);const n=[];let d="".toPeerId(),l=0,u=0;const p=()=>{this.inputSearch.container.classList.toggle("is-picked-twice",2===n.length),this.inputSearch.container.classList.toggle("is-picked",!!n.length),n.length?this.inputSearch.input.style.setProperty("--paddingLeft",n[n.length-1].getBoundingClientRect().right-this.inputSearch.input.getBoundingClientRect().left+"px"):this.inputSearch.input.style.removeProperty("--paddingLeft")},f=document.createElement("div");f.classList.add("search-helper"),f.addEventListener("click",(e=>{const t=(0,he.Z)(e.target,"selector-user");if(!t)return;const i=t.dataset.key;if(0===i.indexOf("date_")){const[e,t,s]=i.split("_");l=+t,u=+s}else d=i.toPeerId();t.addEventListener("click",(()=>{g(t)})),this.inputSearch.container.append(t),this.inputSearch.onChange(this.inputSearch.value=""),n.push(t),p()})),s.nav.parentElement.append(f);const m=(e,t)=>{const i=document.createElement("div");i.classList.add("selector-user");const s=new o.Z;return s.classList.add("selector-user-avatar","tgico","avatar-32"),s.isDialog=!0,i.dataset.key=""+e,e.isPeerId()?(void 0===t&&(t=new ei.Z({peerId:e.toPeerId()}).element),s.updateWithOptions({peerId:e})):s.classList.add("tgico-calendarfilter"),t&&("string"==typeof t?i.innerHTML=t:((0,Z.Z)(i,t),i.append(t))),i.insertAdjacentElement("afterbegin",s),i},g=e=>{0===e.dataset.key.indexOf("date_")?l=u=0:d="".toPeerId(),e.remove(),(0,yt.Z)(n,e),setTimeout((()=>{p(),this.inputSearch.onChange(this.inputSearch.value)}),0)};this.inputSearch.onClear=()=>{n.forEach((e=>{g(e)}))},this.inputSearch.onChange=e=>{if(s.cleanupHTML(),s.setQuery({peerId:d,folderId:d?void 0:0,query:e,minDate:l,maxDate:u}),s.load(!0),f.innerHTML="",s.nav.classList.remove("hide"),!d&&e.trim()){const t=s.middleware.get();Promise.all([this.managers.dialogsStorage.getDialogs({query:e}).then((({dialogs:e})=>e.map((e=>e.peerId)))),this.managers.appUsersManager.getContactsPeerIds(e,!0)]).then((e=>{t()&&(new Set(e[0].concat(e[1])).forEach((e=>{f.append(m(e))})),s.nav.classList.toggle("hide",!!f.innerHTML))}))}if(!l&&e.trim()){const t=[];(0,C.fl)(e,t),t.forEach((e=>{f.append(m("date_"+e.minDate+"_"+e.maxDate,e.title))})),s.nav.classList.toggle("hide",!!f.innerHTML)}},s.tabs.inputMessagesFilterEmpty.addEventListener("mousedown",(e=>{const t=(0,be.Z)(e.target,h.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=(0,he.Z)(t,"search-group");if(!i||i.classList.contains("search-group-recent")||i.classList.contains("search-group-people"))return;const s=t.getAttribute("data-peer-id").toPeerId();this.managers.appUsersManager.pushRecentSearch(s)}),{capture:!0});const b=document.createElement("div");b.classList.add("search-group-scrollable"),b.append(this.searchGroups.people.list),this.searchGroups.people.container.append(b),new r.v7(b);let y,w=!0;const L=(0,c.Z)({content:e.parentElement,type:"zoom-fade",transitionTime:150,onTransitionEnd:e=>{y&&clearTimeout(y),0!==e||w||(s.selectTab(0,!1),this.inputSearch.onClearClick(),y=window.setTimeout((()=>{y=0,this.newBtnMenu.classList.remove("is-hidden"),this.hasUpdate&&this.updateBtn.classList.remove("is-hidden")}),150)),w=!1}});L(0);const E="is-visible",I=()=>{this.toolsBtn.classList.remove(E),this.backBtn.classList.add(E),this.newBtnMenu.classList.add("is-hidden"),this.updateBtn.classList.add("is-hidden"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!0);const e="global-search";z.IS_MOBILE_SAFARI||Jt.Z.findItemByType(e)||Jt.Z.pushItem({onPop:()=>{i()},type:e}),L(1)};this.inputSearch.input.addEventListener("focus",I),I(),(0,v.fc)(this.backBtn,(e=>{this.toolsBtn.classList.add(E),this.backBtn.classList.remove(E),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!1),Jt.Z.removeByType("global-search"),L(0)}));const M=(0,Rt.Z)("close");this.searchGroups.recent.nameEl.append(M),M.addEventListener("click",(()=>{(0,Ee.Z)({descriptionLangKey:"Search.Confirm.ClearHistory",button:{langKey:"ClearButton",isDanger:!0}}).then((()=>this.managers.appUsersManager.clearRecentSearch().then((()=>{this.searchGroups.recent.clear()}))))}))}}const ci=new li;L.GO.appSidebarLeft=ci;const hi=ci},5670:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(3552),n=i(5644),a=i(279),o=i(8119);class r extends s._{init(e){this.container.classList.add("add-members-container"),this.nextBtn=(0,o.Z)({icon:"arrow_next"}),this.content.append(this.nextBtn),this.scrollable.container.remove(),this.nextBtn.addEventListener("click",(()=>{const e=this.selector.getSelected().map((e=>e.toPeerId())),t=this.takeOut(e);this.skippable?this.close():t instanceof Promise?this.attachToPromise(t):void 0===t&&this.close()})),this.setTitle(e.title),this.peerType=e.type,this.takeOut=e.takeOut,this.skippable=e.skippable;const t="privacy"===this.peerType;this.selector=new n.Z({appendTo:this.content,onChange:this.skippable?null:e=>{this.nextBtn.classList.toggle("is-visible",!!e)},peerType:[t?"dialogs":"contacts"],placeholder:e.placeholder,exceptSelf:t,filterPeerTypeBy:t?["isAnyGroup","isUser"]:void 0,managers:this.managers,design:"square"}),e.selectedPeerIds&&this.selector.addInitial(e.selectedPeerIds),this.nextBtn.classList.add("tgico-arrow_next"),this.nextBtn.innerHTML="",this.nextBtn.disabled=!1,this.nextBtn.classList.toggle("is-visible",this.skippable)}attachToPromise(e){const t=(0,a.p)(this.nextBtn,"arrow_next");e.then((()=>{this.close()}),(()=>{t()}))}}},534:(e,t,i)=>{"use strict";i.d(t,{Z:()=>k});var s=i(8130),n=i(1447),a=i(3552),o=i(2796),r=i(503),d=i(2230),l=i(5322),c=i(4494),h=i(5644),u=i(9807),p=i(2325),f=i(8479),m=i(7625),g=i(130),v=i(8115),b=i(1507),y=i(3512),w=i(2738),S=i(5029),C=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class L extends a._{constructor(){super(...arguments),this.renderResults=e=>C(this,void 0,void 0,(function*(){yield this.managers.appUsersManager.getContacts(),e.forEach((e=>{const{dom:t}=s.default.addDialogNew({peerId:e,container:this.selector.scrollable,rippleEnabled:!0,avatarSize:"abitbigger"}),i=this.selector.selected.has(e);t.containerEl.append(this.checkbox(i));const n=[];this.dialogsByFilters.forEach(((t,i)=>{if(t.has(e)){const e=document.createElement("span");(0,g.Z)(e,(0,v.Z)(i.title)),n.push(e)}})),(0,p.v_)(n,!1).forEach((e=>{t.lastMessageSpan.append(e)}))}))})),this.onSelectChange=e=>{"included"===this.type&&(this.confirmBtn.style.display=e?"":"none")}}init(e,t,i){this.originalFilter=e,this.filter=(0,f.Z)(this.originalFilter),this.type=t,this.editFolderTab=i,this.content.remove(),this.container.classList.add("included-chatlist-container"),this.confirmBtn=(0,d.Z)("check btn-confirm blue",{noRipple:!0}),this.confirmBtn.style.display="none",this.header.append(this.confirmBtn),(0,w.fc)(this.confirmBtn,(()=>C(this,void 0,void 0,(function*(){const e=this.selector.getSelected();if("included"===this.type)for(const e in this.filter.pFlags)0!==e.indexOf("exclude_")&&delete this.filter.pFlags[e];else for(const e in this.filter.pFlags)0===e.indexOf("exclude_")&&delete this.filter.pFlags[e];const t=[];for(const i of e)i.isPeerId()?t.push(i.toPeerId()):this.filter.pFlags[i]=!0;let i;i="included"===this.type?e=>t.includes(e):e=>!t.includes(e),(0,m.Z)(this.filter.pinnedPeerIds,((e,t)=>{i(e)||(this.filter.pinnedPeerIds.splice(t,1),this.filter.pinned_peers.splice(t,1))}));const s="included"===this.type?"excludePeerIds":"includePeerIds",n="included"===this.type?"exclude_peers":"include_peers";(0,m.Z)(this.filter[s],((e,i)=>{t.includes(e)&&(this.filter[s].splice(i,1),this.filter[n].splice(i,1))})),this.filter["included"===this.type?"includePeerIds":"excludePeerIds"]=t,this.filter["included"===this.type?"include_peers":"exclude_peers"]=yield Promise.all(t.map((e=>this.managers.appPeersManager.getInputPeerById(e)))),this.editFolderTab.setFilter(this.filter,!1),this.close()}))),{listenerSetter:this.listenerSetter});const s=e=>{this.limit=y.Z.premium?e.dialog_filters_chats_limit_premium:e.dialog_filters_chats_limit_default};return this.listenerSetter.add(y.Z)("app_config",s),this.dialogsByFilters=new Map,Promise.all([this.managers.filtersStorage.getDialogFilters().then((e=>C(this,void 0,void 0,(function*(){yield Promise.all(e.filter((e=>!b.DZ.has(e.id))).map((e=>C(this,void 0,void 0,(function*(){const t=(yield this.managers.dialogsStorage.getFolderDialogs(e.id)).map((e=>e.peerId));this.dialogsByFilters.set(e,new Set(t))})))))})))),this.managers.apiManager.getAppConfig().then((e=>{s(e)}))])}checkbox(e){const t=new u.Z({round:!0});return e&&(t.input.checked=e),t.label}onOpen(){this.confirmBtn.style.display="excluded"===this.type?"":"none",this.setTitle("included"===this.type?"FilterAlwaysShow":"FilterNeverShow");const e=this.filter,t=new S.Z({noDelimiter:!0,name:"FilterChatTypes"});let i;t.container.classList.add("folder-categories"),i="excluded"===this.type?{exclude_muted:{ico:"mute",text:"ChatList.Filter.MutedChats"},exclude_archived:{ico:"archive",text:"ChatList.Filter.Archive"},exclude_read:{ico:"readchats",text:"ChatList.Filter.ReadChats"}}:{contacts:{ico:"newprivate",text:"ChatList.Filter.Contacts"},non_contacts:{ico:"noncontacts",text:"ChatList.Filter.NonContacts"},groups:{ico:"group",text:"ChatList.Filter.Groups"},broadcasts:{ico:"newchannel",text:"ChatList.Filter.Channels"},bots:{ico:"bots",text:"ChatList.Filter.Bots"}};const s=document.createDocumentFragment();for(const e in i){const t=(0,c.Z)("btn-primary btn-transparent folder-category-button",{icon:i[e].ico,text:i[e].text});t.dataset.peerId=e,t.append(this.checkbox()),s.append(t)}t.content.append(s);const n=("included"===this.type?e.includePeerIds:e.excludePeerIds).slice();this.selector=new h.Z({appendTo:this.container,onChange:this.onSelectChange,peerType:["dialogs"],renderResultsFunc:this.renderResults,placeholder:"Search",sectionNameLangPackKey:"FilterChats",managers:this.managers}),this.selector.selected=new Set(n);let a=!1;const r=this.selector.add.bind(this.selector);this.selector.add=(e,t,s)=>{if(this.selector.selected.size>=this.limit&&a&&!i[e]){const t=this.selector.list.querySelector(`[data-peer-id="${e}"] [type="checkbox"]`);t&&setTimeout((()=>{t.checked=!1}),0);const i=p.ZP.format("excluded"===this.type?"ChatList.Filter.Exclude.LimitReached":"ChatList.Filter.Include.LimitReached",!0);return void(0,o.Am)(i)}const n=r(e,i[e]?(0,p.ag)(i[e].text):void 0,s);return i[e]&&n.querySelector("avatar-element").classList.add("tgico-"+i[e].ico),n},this.selector.scrollable.container.append(t.container,this.selector.scrollable.container.lastElementChild),this.selector.addInitial(n),a=!0;for(const s in e.pFlags)i.hasOwnProperty(s)&&e.pFlags[s]&&(0,w.tH)(t.content.querySelector(`[data-peer-id="${s}"]`))}onCloseAfterTimeout(){return this.selector&&(this.selector.container.remove(),this.selector=null),super.onCloseAfterTimeout()}}var E=i(8127),I=i(6848),M=i(3066),P=i(2353),Z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class k extends a._{constructor(){super(...arguments),this.flags={}}init(){this.container.classList.add("edit-folder-container"),this.caption=document.createElement("div"),this.caption.classList.add("caption"),this.caption.append((0,p.ag)("FilterIncludeExcludeInfo")),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container"),this.confirmBtn=(0,d.Z)("check btn-confirm hide blue");const e={icon:"delete danger",text:"FilterMenuDelete",onClick:()=>{new E.Z("filter-delete",{titleLangKey:"ChatList.Filter.Confirm.Remove.Header",descriptionLangKey:"ChatList.Filter.Confirm.Remove.Text",buttons:[{langKey:"Delete",callback:()=>{e.element.setAttribute("disabled","true"),this.managers.filtersStorage.updateDialogFilter(this.filter,!0).then((e=>{e&&this.close()})).finally((()=>{e.element.removeAttribute("disabled")}))},isDanger:!0}]}).show()}};this.menuBtn=(0,l.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[e]}),this.menuBtn.classList.add("hide"),this.header.append(this.confirmBtn,this.menuBtn);const t=new S.Z({}),i=document.createElement("div");i.classList.add("input-wrapper"),this.nameInputField=new r.ZP({label:"FilterNameHint",maxLength:12}),i.append(this.nameInputField.container),t.content.append(i);const s=(e,t,i,s)=>{const n=new S.Z({name:t,noDelimiter:!0});n.container.classList.add("folder-list",e);const a=n.generateContentElement();return a.classList.add("folder-categories"),i.forEach((e=>{const t=(0,c.Z)("folder-category-button btn btn-primary btn-transparent",{icon:e.icon,text:e.text,noRipple:!e.withRipple||void 0});e.name&&(s[e.name]=t),a.append(t)})),n};this.includePeerIds=s("folder-list-included","FilterInclude",[{icon:"add primary",text:"ChatList.Filter.Include.AddChat",withRipple:!0},{text:"ChatList.Filter.Contacts",icon:"newprivate",name:"contacts"},{text:"ChatList.Filter.NonContacts",icon:"noncontacts",name:"non_contacts"},{text:"ChatList.Filter.Groups",icon:"group",name:"groups"},{text:"ChatList.Filter.Channels",icon:"channel",name:"broadcasts"},{text:"ChatList.Filter.Bots",icon:"bots",name:"bots"}],this.flags),this.excludePeerIds=s("folder-list-excluded","FilterExclude",[{icon:"minus primary",text:"ChatList.Filter.Exclude.AddChat",withRipple:!0},{text:"ChatList.Filter.MutedChats",icon:"mute",name:"exclude_muted"},{text:"ChatList.Filter.Archive",icon:"archive",name:"exclude_archived"},{text:"ChatList.Filter.ReadChats",icon:"readchats",name:"exclude_read"}],this.flags),this.scrollable.append(this.stickerContainer,this.caption,t.container,this.includePeerIds.container,this.excludePeerIds.container);const a=this.includePeerIds.container.querySelector(".folder-categories"),h=this.excludePeerIds.container.querySelector(".folder-categories");(0,w.fc)(a.querySelector(".btn"),(()=>{this.slider.createTab(L).open(this.filter,"included",this)}),{listenerSetter:this.listenerSetter}),(0,w.fc)(h.querySelector(".btn"),(()=>{this.slider.createTab(L).open(this.filter,"excluded",this)}),{listenerSetter:this.listenerSetter}),(0,w.fc)(this.confirmBtn,(()=>{if(this.nameInputField.input.classList.contains("error"))return;if(!this.nameInputField.value.trim())return void this.nameInputField.input.classList.add("error");let e,t=Array.from(a.children).slice(1).reduce(((e,t)=>e+ +!t.style.display),0);t+=this.filter.include_peers.length,t?(this.confirmBtn.setAttribute("disabled","true"),e=this.filter.id?this.managers.filtersStorage.updateDialogFilter(this.filter):this.managers.filtersStorage.createDialogFilter(this.filter),e.then((e=>{e&&this.close()})).catch((e=>{"DIALOG_FILTERS_TOO_MUCH"===e.type?(0,o.Am)("Sorry, you can't create more folders."):console.error("updateDialogFilter error:",e)})).finally((()=>{this.confirmBtn.removeAttribute("disabled")}))):(0,o.Am)("Please choose at least one chat for this folder.")}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.nameInputField.input)("input",(()=>{this.filter.title=this.nameInputField.value,this.editCheckForChange()}));const u="edit"===this.type?[this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"pinned_peers"),this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"include_peers"),this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"exclude_peers")]:[];return Promise.all([this.loadAnimationPromise=n.Z.loadAnimationAsAsset({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86},"Folders_2").then((e=>(this.animation=e,n.Z.waitForFirstFrame(e)))),...u])}onOpenAfterTimeout(){this.loadAnimationPromise.then((()=>{this.animation.autoplay=!0,this.animation.play()}))}onCreateOpen(){this.setTitle("FilterNew"),this.menuBtn.classList.add("hide"),this.confirmBtn.classList.remove("hide"),this.nameInputField.value="";for(const e in this.flags)this.flags[e].style.display="none"}onEditOpen(){this.setTitle("create"===this.type?"FilterNew":"FilterHeaderEdit"),"edit"===this.type&&(this.menuBtn.classList.remove("hide"),this.confirmBtn.classList.add("hide"));const e=this.filter;this.nameInputField.value=(0,M.Z)(e.title);for(const t in this.flags)this.flags[t].style.display=e.pFlags[t]?"":"none";["includePeerIds","excludePeerIds"].forEach((t=>Z(this,void 0,void 0,(function*(){const i=this[t],n=s.default.createChatList({ignoreClick:!0});let a=e[t];const o=e=>Z(this,void 0,void 0,(function*(){return!!(yield this.managers.appMessagesManager.getDialogOnly(e))||!!e.isUser()&&"user"===(yield this.managers.appUsersManager.getUser(e.toUserId()))._})),r=yield(0,P.Z)(a,(e=>o(e)));a.length=0,a.push(...r),a=a.slice();const d=e=>Z(this,void 0,void 0,(function*(){for(let t=0,i=Math.min(a.length,e);td(20)),{listenerSetter:this.listenerSetter}),l.append((0,p.ag)("FilterShowMoreChats",[a.length])),e.append(l)}d(4)}))))}editCheckForChange(){if("edit"===this.type){const e=!(0,I.Z)(this.originalFilter,this.filter);this.confirmBtn.classList.toggle("hide",!e),this.menuBtn.classList.toggle("hide",e)}}setFilter(e,t){this.container&&Array.from(this.container.querySelectorAll("ul, .load-more")).forEach((e=>e.remove())),t?(this.originalFilter=e,this.filter=(0,f.Z)(e)):(this.filter=e,this.onEditOpen(),this.editCheckForChange())}open(e){return void 0===e?(this.setFilter({_:"dialogFilter",id:0,title:"",pFlags:{},pinned_peers:[],include_peers:[],exclude_peers:[],pinnedPeerIds:[],includePeerIds:[],excludePeerIds:[]},!0),this.type="create"):(this.setFilter(e,!0),this.type="edit"),super.open().then((()=>{"edit"===this.type?(this.setFilter(this.originalFilter,!0),this.onEditOpen()):this.onCreateOpen()}))}}},2010:(e,t,i)=>{"use strict";i.d(t,{J:()=>f,Z:()=>m});var s=i(503),n=i(3552),a=i(2621),o=i(6726),r=i(2325),d=i(2738),l=i(3512),c=i(2521),h=i(6082),u=i(5029),p=i(9522);function f(){const e=document.createElement("div"),t=(0,c.Z)(document.createElement("a")),i=(0,r.ag)("Username.Purchase",[t]);return i.classList.add("username-purchase-help"),e.append(i,document.createElement("br"),document.createElement("br")),e.classList.add("hide"),{element:e,setUsername:i=>{i&&(t.href="https://fragment.com/username/"+i),e.classList.toggle("hide",!i)}}}class m extends n._{static getInitArgs(){return{bioMaxLength:l.Z.managers.apiManager.getLimit("bio"),user:l.Z.managers.appUsersManager.getSelf(),userFull:l.Z.managers.appProfileManager.getProfile(l.Z.myId.toUserId())}}init(e){return t=this,i=void 0,c=function*(){this.container.classList.add("edit-profile-container"),this.setTitle("EditAccount.Title");const t=[],[i,n,c]=yield Promise.all([e.bioMaxLength,e.user,e.userFull]);{const e=(0,u.R)(this.scrollable,void 0,"Bio.Description"),n=document.createElement("div");n.classList.add("input-wrapper"),this.firstNameInputField=new s.ZP({label:"EditProfile.FirstNameLabel",name:"first-name",maxLength:70}),this.lastNameInputField=new s.ZP({label:"Login.Register.LastName.Placeholder",name:"last-name",maxLength:64}),this.bioInputField=new s.ZP({label:"EditProfile.BioLabel",name:"bio",maxLength:i}),n.append(this.firstNameInputField.container,this.lastNameInputField.container,this.bioInputField.container);const o=document.createElement("div");o.classList.add("caption"),(0,r.XZ)({element:o,key:"Bio.Description"}),t.push(this.firstNameInputField,this.lastNameInputField,this.bioInputField),this.editPeer=new a.Z({peerId:l.Z.myId,inputFields:t,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),e.append(this.editPeer.avatarEdit.container,n)}{const e=new u.Z({name:"EditAccount.Username",caption:!0}),i=document.createElement("div");i.classList.add("input-wrapper"),this.usernameInputField=new o.l({label:"EditProfile.Username.Label",name:"username",plainText:!0,listenerSetter:this.listenerSetter,onChange:()=>{this.editPeer.handleChange();const{error:e}=this.usernameInputField,t="USERNAME_PURCHASE_AVAILABLE"===(null==e?void 0:e.type);n(t?this.usernameInputField.value:void 0)},availableText:"EditProfile.Username.Available",takenText:"EditProfile.Username.Taken",invalidText:"EditProfile.Username.Invalid"},this.managers),i.append(this.usernameInputField.container);const s=e.caption,{setUsername:n,element:a}=f();s.append(a,(0,r.ag)("UsernameHelp")),t.push(this.usernameInputField),e.content.append(i),this.scrollable.append(e.container)}{const e=new p.Z({peerId:l.Z.myId,peer:n,listenerSetter:this.listenerSetter,usernameInputField:this.usernameInputField,middleware:this.middlewareHelper.get()});this.scrollable.append(e.container)}(0,d.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;const e=[],t=this.managers.appProfileManager.updateProfile(this.firstNameInputField.value,this.lastNameInputField.value,this.bioInputField.value);e.push(t.then((()=>{this.close()}),(e=>{console.error("updateProfile error:",e)}))),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then((e=>this.managers.appProfileManager.uploadProfilePhoto(e)))),this.usernameInputField.isValidToChange()&&e.push(this.managers.appUsersManager.updateUsername(this.usernameInputField.value)),Promise.race(e).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled")}))}),{listenerSetter:this.listenerSetter}),this.firstNameInputField.setOriginalValue(n.first_name,!0),this.lastNameInputField.setOriginalValue(n.last_name,!0),this.bioInputField.setOriginalValue(c.about,!0),this.usernameInputField.setOriginalValue((0,h.Z)(n),!0),this.editPeer.handleChange()},new((n=void 0)||(n=Promise))((function(e,s){function a(e){try{r(c.next(e))}catch(e){s(e)}}function o(e){try{r(c.throw(e))}catch(e){s(e)}}function r(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(a,o)}r((c=c.apply(t,i||[])).next())}));var t,i,n,c}}},4332:(e,t,i)=>{"use strict";i.d(t,{HQ:()=>d,ZP:()=>h});var s=i(4271),n=i(3552),a=i(4755),o=i(1669),r=i(410);const d="is-right-column-shown";class l extends n.Z{constructor(){super({sidebarEl:document.getElementById("column-right"),canHideFirst:!0,navigationType:"right"}),this.isColumnProportionSet=!1}construct(e){this.managers=e,a.Z.addEventListener("changeScreen",((e,t)=>{t===a._.medium&&e!==a._.mobile&&this.toggleSidebar(!1)})),a.Z.addEventListener("resize",(()=>{this.setColumnProportion()}))}createSharedMediaTab(){const e=this.createTab(o.Z,!1,!0);return e.slider=this,e}replaceSharedMediaTab(e){const t=this.sharedMediaTab;if(t){const i=this.historyTabIds.indexOf(t);this._selectTab.getFrom()===t.container&&this._selectTab.setFrom(null==e?void 0:e.container),e?(-1!==i&&(this.historyTabIds[i]=e),t.container.classList.contains("active")&&e.container.classList.add("active"),t.container.replaceWith(e.container)):(-1!==i&&this.historyTabIds.splice(i,1),t.container.remove())}else this.tabsContainer.prepend(e.container);this.sharedMediaTab=e}onCloseTab(e,t,i){this.historyTabIds.length||this.toggleSidebar(!1,t),super.onCloseTab(e,t,i)}setColumnProportion(){const e=this.sidebarEl.scrollWidth/this.sidebarEl.previousElementSibling.scrollWidth;document.documentElement.style.setProperty("--right-column-proportion",""+e)}toggleSidebar(e,t){const i=document.body.classList.contains(d);let n;if(void 0!==e?e?i||(n=!0):i&&(n=!0):n=!0,!n)return Promise.resolve();i||this.historyTabIds.length||this.sharedMediaTab.open(),this.isColumnProportionSet||(this.setColumnProportion(),this.isColumnProportionSet=!0);const a=s.Z.selectTab(i?1:2,t);return document.body.classList.toggle(d,e),a}}const c=new l;r.GO.appSidebarRight=c;const h=c},4240:(e,t,i)=>{"use strict";i.d(t,{Z:()=>S});var s=i(3552),n=i(503),a=i(2621),o=i(7479),r=i(9807),d=i(4494),l=i(8842),c=i(3512),h=i(8127),u=i(1168),p=i(2325),f=i(2738),m=i(1656),g=i(2946),v=i(8210),b=i(5029),y=i(7362),w=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class S extends s._{init(){return w(this,void 0,void 0,(function*(){const{peerId:e}=this,t=e.toUserId();this.container.classList.add("edit-peer-container","edit-contact-container");const[i,s]=yield Promise.all([this.managers.appUsersManager.isContact(t),this.managers.appPrivacyManager.getPrivacy("inputPrivacyKeyPhoneNumber")]),S=!i;this.setTitle(S?"AddContactTitle":"Edit");{const i=new b.Z({noDelimiter:!0}),s=[],d=document.createElement("div");if(d.classList.add("input-wrapper"),this.nameInputField=new n.ZP({label:"FirstName",name:"contact-name",maxLength:70,required:!0}),this.lastNameInputField=new n.ZP({label:"LastName",name:"contact-lastname",maxLength:70}),t){const e=yield this.managers.appUsersManager.getUser(t);S?(this.nameInputField.setDraftValue(e.first_name),this.lastNameInputField.setDraftValue(e.last_name)):(this.nameInputField.setOriginalValue(e.first_name),this.lastNameInputField.setOriginalValue(e.last_name))}if(d.append(this.nameInputField.container,this.lastNameInputField.container),s.push(this.nameInputField,this.lastNameInputField),this.editPeer=new a.Z({peerId:e,inputFields:s,listenerSetter:this.listenerSetter,doNotEditAvatar:!0}),this.content.append(this.editPeer.nextBtn),e){const s=document.createElement("div");s.classList.add("avatar-edit"),s.append(this.editPeer.avatarElem);const n=new r.Z({text:"Notifications"});n.input.addEventListener("change",(t=>{t.isTrusted&&this.managers.appMessagesManager.togglePeerMute({peerId:e})})),this.listenerSetter.add(c.Z)("notify_settings",(e=>w(this,void 0,void 0,(function*(){if("notifyPeer"!==e.peer._)return;const t=(0,g.Z)(e.peer.peer);if(t==t){const t=!(yield this.managers.appNotificationsManager.isMuted(e.notify_settings));t!==n.checked&&(n.checked=t)}}))));const a=document.createElement("div");a.classList.add("profile-name"),a.append(new l.Z({peerId:e}).element);const h=document.createElement("div");if(h.classList.add("profile-subtitle"),h.append((0,p.ag)("EditContact.OriginalName")),i.content.append(s,a,h,d),S){const s=yield this.managers.appUsersManager.getUser(t),n=new o.ZP({icon:"phone",titleLangKey:s.phone?void 0:"MobileHidden",title:s.phone?(0,v.Z)(s.phone):void 0,subtitleLangKey:s.phone?"Phone":"MobileHiddenExceptionInfo",subtitleLangArgs:s.phone?void 0:[new l.Z({peerId:e}).element]});i.content.append(n.container)}else{const t=new o.ZP({checkboxField:n,withCheckboxSubtitle:!0,listenerSetter:this.listenerSetter}),s=!(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!1}));n.checked=s,i.content.append(t.container)}}else i.content.append(d);this.scrollable.append(i.container)}if(S){if(s.some((e=>"privacyValueDisallowAll"===e._))&&!s.some((e=>"privacyValueAllowUsers"===e._&&e.users.includes(t)))){const e=new b.Z({caption:"NewContact.Exception.ShareMyPhoneNumber.Desc",captionArgs:[yield(0,y.Z)({peerId:this.peerId})]}),t=this.sharePhoneCheckboxField=new r.Z({text:"NewContact.Exception.ShareMyPhoneNumber",checked:!0}),i=(0,o.tG)(t);e.content.append(i.container),this.scrollable.append(e.container)}}else{const i=new b.Z,s=(0,d.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"PeerInfo.DeleteContact"});(0,f.fc)(s,(()=>{new h.Z("popup-delete-contact",{peerId:e,titleLangKey:"DeleteContact",descriptionLangKey:"AreYouSureDeleteContact",buttons:(0,u.x)([{langKey:"Delete",callback:()=>{const e=(0,m.Z)([s],!0);this.managers.appUsersManager.deleteContacts([t]).then((()=>{this.close()}),(()=>{e()}))},isDanger:!0}])}).show()}),{listenerSetter:this.listenerSetter}),i.content.append(s),this.scrollable.append(i.container)}(0,f.fc)(this.editPeer.nextBtn,(()=>w(this,void 0,void 0,(function*(){var e;this.editPeer.nextBtn.disabled=!0,this.managers.appUsersManager.addContact(t,this.nameInputField.value,this.lastNameInputField.value,(yield this.managers.appUsersManager.getUser(t)).phone,null===(e=this.sharePhoneCheckboxField)||void 0===e?void 0:e.checked).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}))),{listenerSetter:this.listenerSetter})}))}}},730:(e,t,i)=>{"use strict";i.d(t,{Z:()=>C});var s=i(2738),n=i(1656),a=i(9405),o=i(8479),r=i(6848),d=i(4271),l=i(1507),c=i(3785),h=i(2230),u=i(9807),p=i(6039),f=i(503),m=i(7479),g=i(5029),v=i(4273),b=i(6024),y=i(9345),w=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const S=(0,a.C)(64,64);class C extends b.Z{init(e,t){return w(this,void 0,void 0,(function*(){this.colorIndex=0;const i=!t,a=t===l.Ox;this.container.classList.add("edit-topic-container"),this.setTitle(i?"NewTopic":"ForumTopic.Title.Edit");const r=e.toChatId();t&&(this.topic=this.originalTopic=(0,o.Z)(yield this.managers.dialogsStorage.getForumTopic(e,t)));{const i=new g.Z({name:a?"CreateGeneralTopicTitle":"CreateTopicTitle"}),o=this.iconDiv=document.createElement("div");o.classList.add("edit-topic-icon-container"),!t&&(0,s.fc)(o,(()=>{this.topic.icon_emoji_id||(this.colorIndex=(this.colorIndex+1)%l.OS.length,this.setIcon())}),{listenerSetter:this.listenerSetter}),t&&o.classList.add("disable-hover");const c=document.createElement("div");c.classList.add("input-wrapper");const u=this.nameInputField=new f.ZP({label:"ForumTopic.Name.Placeholder",withLinebreaks:!1,name:"topic-name",maxLength:70,required:!0});this.topic&&u.setOriginalValue(this.topic.title,!0);const p=this.confirmBtn=(0,h.Z)("check btn-confirm blue hide",{noRipple:!0});this.header.append(p),(0,s.fc)(p,(()=>{const i=(0,n.Z)([p],!0);t?this.managers.appChatsManager.editForumTopic({chatId:r,topicId:t,title:u.value,iconEmojiId:this.topic.icon_emoji_id||0}).then((()=>{this.close()})).catch((e=>{console.error("edit topic error",e),i()})):this.managers.appChatsManager.createForumTopic({chatId:r,iconColor:l.OS[this.colorIndex],iconEmojiId:this.topic.icon_emoji_id,title:u.value}).then((t=>{this.close(),d.Z.setInnerPeer({peerId:e,threadId:t})})).catch((e=>{console.error("create topic error",e),i()}))}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(u.input)("input",(()=>{var e;this.validate(),this.setIcon(null===(e=this.topic)||void 0===e?void 0:e.icon_emoji_id)})),c.append(u.container),i.content.append(o,c),this.scrollable.append(i.container)}const c=[];if(a){const e=new g.Z({caption:"EditTopicHideInfo"}),i=new u.Z({checked:!this.topic.pFlags.hidden,text:"EditTopicHide"});this.listenerSetter.add(i.input)("change",(()=>{const e=this.managers.appChatsManager.editForumTopic({chatId:r,topicId:t,hidden:!i.checked});s.disableWithPromise(e)}));const s=new m.ZP({checkboxField:i});e.content.append(s.container),this.scrollable.append(e.container)}else{const e=new g.Z({});e.container.classList.add("edit-topic-emoticons-container");const t=new p.ZP({managers:this.managers,isStandalone:!0,noRegularEmoji:!0,stickerSetId:"inputStickerSetEmojiDefaultTopicIcons",onClick:e=>{t.setActive(e.docId?e:{emoji:void 0,docId:void 0}),this.setIcon(e.docId)}});t.getContainerSize=()=>({width:v.ZP.rect.width,height:400}),this.middlewareHelper.onDestroy((()=>{t.destroy()})),t.container.classList.remove("tabs-tab"),this.emojiElement=document.createElement("span"),this.emojiElement.classList.add("super-emoji-topic-icon");const i=t.init().then((()=>w(this,void 0,void 0,(function*(){var e;const i=t.getCustomCategory(),s=null===(e=this.topic)||void 0===e?void 0:e.icon_emoji_id;t.addEmojiToCategory({category:i,element:this.emojiElement,batch:!1,prepend:!0,active:!s}),s&&t.setActive({docId:s,emoji:""})}))));c.push(i),e.content.replaceWith(t.container),this.scrollable.append(e.container)}return Promise.all(c).then((()=>this.s()))}))}validate(){let e=this.nameInputField.isValidToChange();!e&&this.originalTopic&&(e=this.topic.icon_emoji_id!==this.originalTopic.icon_emoji_id),this.confirmBtn.classList.toggle("hide",!e)}s(){var e,t;return(null===(e=this.topic)||void 0===e?void 0:e.icon_color)&&(this.colorIndex=l.OS.indexOf(this.topic.icon_color)),this.setIcon(null===(t=this.topic)||void 0===t?void 0:t.icon_emoji_id,void 0,!0)}setIcon(e,t=this.iconDiv,i){var s;return w(this,void 0,void 0,(function*(){const n=this.nameInputField.value,a=t===this.iconDiv;if(a){const t={id:null===(s=this.topic)||void 0===s?void 0:s.id,icon_color:l.OS[this.colorIndex],title:(0,c.Z)(n,!0).text||"A",icon_emoji_id:e},a=this.topic;if(this.topic=t,!i&&a&&a.icon_color===t.icon_color&&a.title===t.title||this.setIcon(void 0,this.emojiElement),(0,r.Z)(a,t)&&!i)return;this.validate()}const o=yield(0,y.e)({topic:a?this.topic:Object.assign(Object.assign({},this.topic),{icon_emoji_id:void 0}),customEmojiSize:S,middleware:this.middlewareHelper.get()}),d=document.createElement("div");d.classList.add("edit-topic-icon"),d.append(o);const h=t.lastElementChild;t.append(d);const u=(e,t)=>{const i=e.animate([{opacity:"0",transform:"scale(0.8)"},{opacity:"1",transform:"scale(1)"}],{duration:200,iterations:1,easing:"ease-in-out",fill:"forwards",direction:t?"normal":"reverse"});return new Promise((e=>{i.addEventListener("finish",(()=>{e()}),{once:!0})}))};h&&u(h,!1).then((()=>h.remove())),u(d,!0)}))}}},1669:(e,t,i)=>{"use strict";i.d(t,{Z:()=>de});var s=i(3512),n=i(6360),a=i(3552),o=i(426),r=i(503),d=i(2621),l=i(7479),c=i(4494),h=i(2166),u=i(144),p=i(279),f=i(1218),m=i(2796),g=i(6726),v=i(6024),b=i(2325),y=i(8127),w=i(8119),S=i(2738),C=i(1656),L=i(9807),E=i(5029),I=i(9522),M=i(6082),P=i(5102),Z=i(2010),k=i(5592),T=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class x extends v.h{init(){return T(this,void 0,void 0,(function*(){this.container.classList.add("edit-peer-container","group-type-container");const e=yield this.managers.appChatsManager.isBroadcast(this.chatId);this.setTitle(e?"ChannelType":"GroupType");const t=new E.Z({name:e?"ChannelType":"GroupType"}),i=(0,u.a)(),n=new l.ZP({radioField:new f.Z({langKey:e?"ChannelPrivate":"MegaPrivate",name:i,value:"private"}),subtitleLangKey:e?"ChannelPrivateInfo":"MegaPrivateInfo"}),a=new l.ZP({radioField:new f.Z({langKey:e?"ChannelPublic":"MegaPublic",name:i,value:"public"}),subtitleLangKey:e?"ChannelPublicInfo":"MegaPublicInfo"}),o=(0,l.De)([n,a],(e=>{const t=[[d.container],[U]];"public"===e&&t.reverse(),t[0].forEach((e=>e.classList.remove("hide"))),t[1].forEach((e=>e.classList.add("hide"))),D()})),r=yield this.managers.appChatsManager.getChat(this.chatId);t.content.append(o);const d=new E.Z({}),v=new l.ZP({title:this.chatFull.exported_invite.link,subtitleLangKey:e?"ChannelPrivateLinkHelp":"MegaPrivateLinkHelp",clickable:()=>{(0,h.T)(this.chatFull.exported_invite.link),(0,m.Am)(b.ZP.format("LinkCopied",!0))},listenerSetter:this.listenerSetter}),x=(0,c.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"RevokeLink"});(0,S.fc)(x,(()=>{new y.Z("revoke-link",{buttons:[{langKey:"RevokeButton",callback:()=>{const e=(0,C.Z)([x],!0);this.managers.appProfileManager.getChatInviteLink(this.chatId,!0).then((t=>{e(),v.title.innerHTML=t}))}}],titleLangKey:"RevokeLink",descriptionLangKey:"RevokeAlert"}).show()}),{listenerSetter:this.listenerSetter}),d.content.append(v.container,x);const A=new E.Z({caption:!0,noDelimiter:!0}),_=document.createElement("div");_.classList.add("input-wrapper");const F="t.me/",D=()=>{const e=n.radioField.checked&&H!==F||R.isValidToChange()&&R.input.classList.contains("valid");z.classList.toggle("is-visible",e);const{error:t}=R,i="USERNAME_PURCHASE_AVAILABLE"===(null==t?void 0:t.type);B(i?R.getValue():void 0)},R=new g.l({label:"SetUrlPlaceholder",name:"group-public-link",plainText:!0,listenerSetter:this.listenerSetter,availableText:"Link.Available",invalidText:"Link.Invalid",takenText:"Link.Taken",onChange:D,peerId:this.chatId.toPeerId(!0),head:F},this.managers),{setUsername:B,element:N}=(0,Z.J)();A.caption.append(N,(0,b.ag)(e?"Channel.UsernameAboutChannel":"Channel.UsernameAboutGroup"));const O=new I.Z({peerId:this.chatId.toPeerId(!0),peer:r,listenerSetter:this.listenerSetter,usernameInputField:R,middleware:this.middlewareHelper.get()}),U=document.createElement("div");U.append(A.container,O.container);const H=F+((0,M.Z)(r)||"");_.append(R.container),A.content.append(_);const z=(0,w.Z)({icon:"check",className:"is-visible"});this.content.append(z),(0,S.fc)(z,(()=>T(this,void 0,void 0,(function*(){const t=a.radioField.checked?R.getValue():"";if(!t){const t=yield this.managers.appChatsManager.getChat(this.chatId),i=(0,M.Z)(t);i&&(yield(0,k.Z)({descriptionLangKey:e?"ChannelVisibility.Confirm.MakePrivate.Channel":"ChannelVisibility.Confirm.MakePrivate.Group",descriptionLangArgs:[i],button:{langKey:"OK"}}))}(0,p.p)(z),this.managers.appChatsManager.migrateChat(this.chatId).then((e=>t?this.managers.appChatsManager.updateUsername(e,t):this.managers.appChatsManager.makeChannelPrivate(e))).then((()=>{this.close()}))}))),{listenerSetter:this.listenerSetter}),(H!==F||(0,P.Z)(r).length?a:n).radioField.checked=!0,R.setOriginalValue(H,!0),this.scrollable.append(t.container,d.container,U);{const t=new E.Z({name:"SavingContentTitle",caption:e?"RestrictSavingContentInfoChannel":"RestrictSavingContentInfoGroup"}),i=new L.Z({text:"RestrictSavingContent",withRipple:!0});this.listenerSetter.add(i.input)("change",(()=>{const e=i.toggleDisability(!0);this.managers.appChatsManager.toggleNoForwards(this.chatId,i.checked).then((()=>{e()}))}));const n=()=>{i.setValueSilently(!!r.pFlags.noforwards)};this.listenerSetter.add(s.Z)("chat_update",(e=>{this.chatId===e&&n()})),n(),t.content.append(i.label),this.scrollable.append(t.container)}}))}}var A=i(4668),_=i(5565),F=i(8936),D=i(8130),R=i(8479),B=i(7120),N=i(2946),O=i(2995),U=i(6848),H=i(3061);class z extends v.h{init(){return e=this,t=void 0,s=function*(){let e;this.container.classList.add("edit-peer-container","user-permissions-container"),this.setTitle("UserRestrictions");{const t=new E.Z({name:"UserRestrictionsCanDo"}),i=document.createElement("div");i.classList.add("chatlist-container"),t.content.insertBefore(i,t.title);const s=D.default.createChatList({new:!0});i.append(s);const{dom:n}=D.default.addDialogNew({peerId:this.userId.toPeerId(!1),container:s,rippleEnabled:!0,avatarSize:"abitbigger"});n.lastMessageSpan.append((0,H.Z)(yield this.managers.appUsersManager.getUser(this.userId)));const a=new G({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content,participant:"channelParticipantBanned"===this.participant._?this.participant:void 0},this.managers);e=()=>{const e=a.takeOut();"channelParticipantBanned"===this.participant._&&(0,U.Z)(this.participant.banned_rights.pFlags,e.pFlags)||this.managers.appChatsManager.editBanned(this.chatId,this.participant,e)},this.eventListener.addEventListener("destroy",e,{once:!0}),this.scrollable.append(t.container)}{const t=new E.Z({});if("channelParticipantBanned"===this.participant._){const i=(0,c.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"GroupPermission.Delete"});(0,S.fc)(i,(()=>{const t=(0,C.Z)([i],!0);this.managers.appChatsManager.clearChannelParticipantBannedRights(this.chatId,this.participant).then((()=>{this.eventListener.removeEventListener("destroy",e),this.close()}),(()=>{t()}))}),{listenerSetter:this.listenerSetter}),t.content.append(i)}const i=(0,c.Z)("btn-primary btn-transparent danger",{icon:"deleteuser",text:"UserRestrictionsBlock"});(0,S.fc)(i,(()=>{(0,C.Z)([i],!0),this.managers.appChatsManager.kickFromChannel(this.chatId,this.participant).then((()=>{this.eventListener.removeEventListener("destroy",e),this.close()}))}),{listenerSetter:this.listenerSetter}),t.content.append(i),this.scrollable.append(t.container)}},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var j=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class G{constructor(e,t){this.options=e,this.managers=t,this.construct()}construct(){return j(this,void 0,void 0,(function*(){this.v=[{flags:["send_messages"],text:"UserRestrictionsSend",exceptionText:"UserRestrictionsNoSend"},{flags:["send_media"],text:"UserRestrictionsSendMedia",exceptionText:"UserRestrictionsNoSendMedia"},{flags:["send_stickers","send_gifs"],text:"UserRestrictionsSendStickers",exceptionText:"UserRestrictionsNoSendStickers"},{flags:["send_polls"],text:"UserRestrictionsSendPolls",exceptionText:"UserRestrictionsNoSendPolls"},{flags:["embed_links"],text:"UserRestrictionsEmbedLinks",exceptionText:"UserRestrictionsNoEmbedLinks"},{flags:["invite_users"],text:"UserRestrictionsInviteUsers",exceptionText:"UserRestrictionsNoInviteUsers"},{flags:["pin_messages"],text:"UserRestrictionsPinMessages",exceptionText:"UserRestrictionsNoPinMessages"},{flags:["change_info"],text:"UserRestrictionsChangeInfo",exceptionText:"UserRestrictionsNoChangeInfo"}],this.toggleWith={send_messages:["send_media","send_stickers","send_polls","embed_links"]};const e=this.options,t=yield this.managers.appChatsManager.getChat(e.chatId),i=t.default_banned_rights,s=e.participant?function(e,t){if(e.default_banned_rights){t=(0,R.Z)(t);const i=e.default_banned_rights.pFlags;for(const e in i)t.pFlags[e]=i[e]}return t}(t,e.participant.banned_rights):i,n=e.participant?"UserRestrictionsDisabled":"EditCantEditPermissionsPublic";for(const a of this.v){const o=a.flags[0],r=(0,l.tG)(a.checkboxField=new L.Z({text:a.text,checked:(0,B.Z)(t,o,s),restriction:!0,listenerSetter:e.listenerSetter}));(e.participant&&i.pFlags[o]||(0,P.Z)(t)[0]&&(a.flags.includes("pin_messages")||a.flags.includes("change_info")))&&(a.checkboxField.input.disabled=!0,(0,S.fc)(a.checkboxField.label,(e=>{(0,m.Am)(b.ZP.format(n,!0))}),{listenerSetter:e.listenerSetter})),this.toggleWith[o]&&e.listenerSetter.add(a.checkboxField.input)("change",(()=>{a.checkboxField.checked||this.v.filter((e=>this.toggleWith[o].includes(e.flags[0]))).forEach((e=>{e.checkboxField.checked=!1}))})),e.appendTo.append(r.container)}}))}takeOut(){const e={_:"chatBannedRights",until_date:2147483647,pFlags:{}};for(const t of this.v)!t.checkboxField.checked&&t.flags.forEach((t=>{e.pFlags[t]=!0}));return e}}class V extends v.h{init(){return j(this,void 0,void 0,(function*(){let e;this.container.classList.add("edit-peer-container","group-permissions-container"),this.setTitle("ChannelPermissions");{const t=new E.Z({name:"ChannelPermissionsHeader"});e=new G({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content},this.managers),this.eventListener.addEventListener("destroy",(()=>{this.managers.appChatsManager.editChatDefaultBannedRights(this.chatId,e.takeOut())}),{once:!0}),this.scrollable.append(t.container)}{const t=new E.Z({name:"PrivacyExceptions"}),i=new l.ZP({titleLangKey:"ChannelAddException",subtitleLangKey:"Loading",icon:"adduser",clickable:()=>{new O.Z({peerTypes:["channelParticipants"],onSelect:e=>{setTimeout((()=>{n(e)}),0)},placeholder:"ExceptionModal.Search.Placeholder",peerId:-this.chatId})},listenerSetter:this.listenerSetter}),n=e=>j(this,void 0,void 0,(function*(){let t;try{t=yield this.managers.appProfileManager.getChannelParticipant(this.chatId,e)}catch(e){return void(0,m.Am)("User is no longer participant")}const i=this.slider.createTab(z);i.participant=t,i.chatId=this.chatId,i.userId=e,i.open()}));t.content.append(i.container);const a=t.generateContentElement();a.classList.add("chatlist-container");const o=D.default.createChatList({new:!0});a.append(o),(0,S.fc)(o,(e=>{const t=(0,A.Z)(e.target,D.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=t.dataset.peerId.toPeerId();n(i)}),{listenerSetter:this.listenerSetter});const r=(t,i)=>j(this,void 0,void 0,(function*(){const s=i.banned_rights,n=(yield this.managers.appChatsManager.getChat(this.chatId)).default_banned_rights,a=[];e.v.forEach((e=>{const t=e.flags[0];s.pFlags[t]&&!n.pFlags[t]&&a.push(e.exceptionText)}));const o=t.lastMessageSpan;a.length&&o.replaceChildren(...(0,b.v_)(a.map((e=>(0,b.ag)(e))),!1)),o.classList.toggle("hide",!a.length)})),d=(e,t)=>{const{dom:i}=D.default.addDialogNew({peerId:(0,N.Z)(e.peer),container:o,rippleEnabled:!0,avatarSize:"abitbigger",append:t});r(i,e)},c=()=>{(0,_.Z)(i.subtitle,(0,b.ag)(u?"Permissions.ExceptionsCount":"Permissions.NoExceptions",[u]))};let h,u=0;const p=()=>(h=new F.Z({scrollable:this.scrollable,getPromise:()=>this.managers.appProfileManager.getChannelParticipants(this.chatId,{_:"channelParticipantsBanned",q:""},50,o.childElementCount).then((e=>{for(const t of e.participants)d(t,!0);return u=e.count,c(),e.participants.length<50||e.count===o.childElementCount}))}),h.load());this.scrollable.append(t.container),(yield this.managers.appChatsManager.isChannel(this.chatId))?yield p():(c(),this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.chatId===e&&(this.chatId=t,p())})))}}))}onOpenAfterTimeout(){this.scrollable.onScroll()}}var K=i(6194),W=i(5701),$=i(62),q=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Q extends v.h{init(){var e;return q(this,void 0,void 0,(function*(){this.setTitle("Reactions");const t=yield this.managers.appReactionsManager.getActiveAvailableReactions(),i=yield this.managers.appProfileManager.getChatFull(this.chatId),s=yield this.managers.appChatsManager.isBroadcast(this.chatId);let n=null!==(e=i.available_reactions)&&void 0!==e?e:{_:"chatReactionsNone"},a=n,o=new Set("chatReactionsSome"===n._?n.reactions.map((e=>e.emoticon)):[]);const r=e=>e.map((e=>({_:"reactionEmoji",emoticon:e}))),d=()=>s?"EnableReactionsChannelInfo":"chatReactionsAll"===a._?"EnableAllReactionsInfo":"chatReactionsNone"===a._?"DisableReactionsInfo":"EnableSomeReactionsInfo",c=new E.Z({name:s?void 0:"AvailableReactions",caption:d()}),h=new E.Z({name:"OnlyAllowThisReactions"}),u=()=>{var e;const t=null!==(e=a.reactions)&&void 0!==e?e:[];o=new Set(t.map((({emoticon:e})=>e))),f.forEach(((e,t)=>{e.setValueSilently(o.has(t))}))};let p;if(s){p=new L.Z({toggle:!0,checked:"chatReactionsSome"===n._});const e=new l.ZP({checkboxField:p,titleLangKey:"EnableReactions",listenerSetter:this.listenerSetter});c.content.append(e.container),this.listenerSetter.add(p.input)("change",(()=>{let e=!0;p.checked?m.every((e=>!e.checked))?a={_:"chatReactionsSome",reactions:r(t.map((({reaction:e})=>e)))}:"chatReactionsSome"!==a._?a={_:"chatReactionsSome",reactions:r(Array.from(o))}:e=!1:a={_:"chatReactionsNone"},e&&(u(),v())}))}else{const e=[["chatReactionsAll","AllReactions"],["chatReactionsSome","SomeReactions"],["chatReactionsNone","NoReactions"]],t=()=>{h.container.classList.toggle("hide","chatReactionsSome"!==a._)};let i=n._;const s=(0,l.ZC)(e.map((([e,t])=>({langPackKey:t,value:e,checked:n._===e}))),(e=>{i=e,a="chatReactionsAll"===i?{_:i,pFlags:{allow_custom:!0}}:"chatReactionsNone"===i?{_:i}:{_:i,reactions:r(["👍","👎"])},(0,_.Z)(c.caption,(0,b.ag)(d())),u(),v(),t()}));c.content.append(s),t()}const f=new Map,m=t.map((e=>{const t=e.reaction,i=new L.Z({toggle:!0,checked:o.has(t)});f.set(t,i),this.listenerSetter.add(i.input)("change",(()=>{i.checked?(o.add(t),p&&!p.checked&&(p.checked=!0)):(o.delete(t),(null==p?void 0:p.checked)&&!o.size&&(p.checked=!1)),v()}));const s=new l.ZP({checkboxField:i,title:e.title,havePadding:!0,listenerSetter:this.listenerSetter});return(0,$.Z)({row:s,doc:e.static_icon,size:"small"}),h.content.append(s.container),i})),g=()=>q(this,void 0,void 0,(function*(){v.clearTimeout(),"chatReactionsSome"===a._&&(a.reactions=r(Array.from(o))),this.managers.appChatsManager.setChatAvailableReactions(this.chatId,a),n=a})),v=(0,W.Z)(g,3e3,!1,!0);this.eventListener.addEventListener("destroy",(()=>{v.isDebounced()&&g()}),{once:!0}),this.scrollable.append(c.container,h.container)}))}}var Y=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class X extends a._{_init(){return Y(this,void 0,void 0,(function*(){this.listenerSetter.removeAll(),this.scrollable.container.replaceChildren(),this.container.classList.add("edit-peer-container","edit-group-container"),this.setTitle("Edit");let[e,t,i,n,a,o,h,u]=yield Promise.all([this.managers.appProfileManager.getChatFull(this.chatId,!0),this.managers.appChatsManager.getChat(this.chatId),this.managers.appChatsManager.isBroadcast(this.chatId),this.managers.appChatsManager.isChannel(this.chatId),this.managers.appChatsManager.hasRights(this.chatId,"change_type"),this.managers.appChatsManager.hasRights(this.chatId,"change_permissions"),this.managers.appChatsManager.hasRights(this.chatId,"manage_topics"),this.managers.apiManager.getAppConfig()]);const p={full:[],basic:[]},f=(e,t="basic")=>{p[t].push(e)};this.listenerSetter.add(s.Z)("chat_update",(e=>Y(this,void 0,void 0,(function*(){this.chatId===e&&(t=yield this.managers.appChatsManager.getChat(this.chatId),p.basic.forEach((e=>e())))})))),this.listenerSetter.add(s.Z)("chat_full_update",(t=>Y(this,void 0,void 0,(function*(){this.chatId===t&&(e=(yield this.managers.appProfileManager.getCachedFullChat(t))||e,p.full.forEach((e=>e())))}))));const m=this.chatId.toPeerId(!0);{const s=new E.Z({noDelimiter:!0,caption:!0}),n=[],c=document.createElement("div");if(c.classList.add("input-wrapper"),this.chatNameInputField=new r.ZP({label:i?"EnterChannelName":"CreateGroup.NameHolder",name:"chat-name",maxLength:255,required:!0}),this.descriptionInputField=new r.ZP({label:"DescriptionPlaceholder",name:"chat-description",maxLength:255}),this.chatNameInputField.setOriginalValue(t.title),this.descriptionInputField.setOriginalValue(e.about),c.append(this.chatNameInputField.container,this.descriptionInputField.container),n.push(this.chatNameInputField,this.descriptionInputField),this.editPeer=new d.Z({peerId:m,inputFields:n,listenerSetter:this.listenerSetter,popupOptions:{isForum:t.pFlags.forum}}),this.content.append(this.editPeer.nextBtn),s.content.append(this.editPeer.avatarEdit.container,c),a){const n=new l.ZP({titleLangKey:i?"ChannelType":"GroupType",clickable:()=>{const t=this.slider.createTab(x);t.chatId=this.chatId,t.chatFull=e,t.open()},icon:"lock",listenerSetter:this.listenerSetter}),a=()=>{let e;const s=(0,P.Z)(t)[0];e=i?s?"TypePublic":"TypePrivate":s?"TypePublicGroup":"TypePrivateGroup",n.subtitle.replaceChildren((0,b.ag)(e))};a(),f(a),s.content.append(n.container)}if(a||o){const t=new l.ZP({titleLangKey:"Reactions",icon:"reactions",clickable:()=>{const e=this.slider.createTab(Q);e.chatId=this.chatId,e.open()},listenerSetter:this.listenerSetter}),i=(yield this.managers.appReactionsManager.getAvailableReactions()).filter((e=>!e.pFlags.inactive)).length,n=()=>{var s;const n=null!==(s=e.available_reactions)&&void 0!==s?s:{_:"chatReactionsNone"};if("chatReactionsSome"===n._){const e=n.reactions.length;e===i?(0,_.Z)(t.subtitle,(0,b.ag)("ReactionsAll")):t.subtitle.textContent=e+"/"+i}else(0,_.Z)(t.subtitle,(0,b.ag)("chatReactionsAll"===n._?"ReactionsAll":"Checkbox.Disabled"))};n(),f(n,"full"),s.content.append(t.container)}if(o&&!i){const e=["send_messages","send_media","send_stickers","send_polls","embed_links","invite_users","pin_messages","change_info"],i=new l.ZP({titleLangKey:"ChannelPermissions",clickable:()=>{const e=this.slider.createTab(V);e.chatId=this.chatId,e.open()},icon:"permissions",listenerSetter:this.listenerSetter}),n=()=>{i.subtitle.textContent=e.reduce(((e,i)=>e+ +(0,B.Z)(t,i,t.default_banned_rights)),0)+"/"+e.length};n(),f(n),s.content.append(i.container)}if(h&&(t.participants_count>=u.forum_upgrade_participants_min||t.pFlags.forum)&&!i){const e=new l.ZP({checkboxField:new L.Z({toggle:!0}),titleLangKey:"Topics",clickable:()=>{},icon:"topics",listenerSetter:this.listenerSetter}),i=()=>{const i=!!t.pFlags.forum;this.editPeer.avatarElem.parentElement.classList.toggle("is-forum",i),e.checkboxField.setValueSilently(i)};this.listenerSetter.add(e.checkboxField.input)("change",(t=>{if(!t.isTrusted)return;const i=this.managers.appChatsManager.toggleForum(this.chatId,e.checkboxField.checked);e.disableWithPromise(i)})),i(),f(i),s.caption.replaceChildren((0,b.ag)("ForumToggleDescription")),s.content.append(e.container)}if(s.caption.classList.toggle("hide",!s.caption.childElementCount),this.scrollable.append(s.container),(0,S.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;const e=[],t=this.chatId;this.chatNameInputField.isValidToChange()&&e.push(this.managers.appChatsManager.editTitle(t,this.chatNameInputField.value)),this.descriptionInputField.isValidToChange()&&e.push(this.managers.appChatsManager.editAbout(t,this.descriptionInputField.value)),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then((e=>this.managers.appChatsManager.editPhoto(t,e)))),Promise.race(e).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}),{listenerSetter:this.listenerSetter}),i&&(yield this.managers.appChatsManager.hasRights(this.chatId,"change_info"))){const e=new L.Z({text:"ChannelSignMessages",checked:!!t.pFlags.signatures});this.listenerSetter.add(e.input)("change",(()=>{const t=e.toggleDisability(!0);this.managers.appChatsManager.toggleSignatures(this.chatId,e.checked).then((()=>{t()}))})),f((()=>{e.setValueSilently(!!t.pFlags.signatures)})),s.content.append((0,l.tG)(e).container)}}if(!i){const t=new E.Z({});if(!i&&a){const i=new L.Z({text:"ChatHistory"});this.listenerSetter.add(i.input)("change",(()=>{const e=i.toggleDisability(!0);this.managers.appChatsManager.togglePreHistoryHidden(this.chatId,!i.checked).then((()=>{e()}))}));const s=()=>{i.setValueSilently(n&&!e.pFlags.hidden_prehistory)};s(),f(s),t.content.append((0,l.tG)(i).container)}t.content.childElementCount&&this.scrollable.append(t.container)}if(yield this.managers.appChatsManager.hasRights(this.chatId,"delete_chat")){const e=new E.Z({}),t=(0,c.Z)("btn-primary btn-transparent danger",{icon:"delete",text:i?"PeerInfo.DeleteChannel":"DeleteAndExitButton"});(0,S.fc)(t,(()=>{new K.Z(m,void 0,(e=>{const i=(0,C.Z)([t],!0);e.then((()=>{this.close()}),(()=>{i()}))}))}),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}n||this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{m===e&&(this.chatId=t.toChatId(),this._init())}))}))}init(){return this._init()}}var J=i(8842),ee=i(4240),te=i(2230),ie=i(5670),se=i(8261),ne=i(4993),ae=i(730),oe=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const re={};class de extends a._{init(){this.container.classList.add("shared-media-container","profile-container");const e=(0,c.Z)("btn-icon sidebar-close-button",{noRipple:!0});this.closeBtn.replaceWith(e),this.closeBtn=e;const t=document.createElement("div");t.classList.add("animated-close-icon"),e.append(t),this.isFirst&&t.classList.add("state-back");const i=document.createElement("div");i.className="transition slide-fade";const a=document.createElement("div");a.classList.add("transition-item"),this.titleI18n=new b.ZP.IntlElement,this.title.append(this.titleI18n.element),this.editBtn=(0,te.Z)("edit"),a.append(this.title,this.editBtn);const r=document.createElement("div");r.classList.add("transition-item");const d=this.title.cloneNode();d.append((0,b.ag)("PeerInfo.SharedMedia")),r.append(d),i.append(a,r),this.header.append(i),this.profile=new se.Z(this.managers,this.scrollable,this.listenerSetter),this.profile.init(),this.scrollable.append(this.profile.element),this.scrollable.onAdditionalScroll=()=>{const e=this.searchSuper.nav.getBoundingClientRect();if(!e.width)return;const t=e.top-1;l(t<=56)};const l=e=>{t.classList.toggle("state-back",this.isFirst||e),this.searchSuper.container.classList.toggle("is-full-viewport",e),h(+e),e||this.searchSuper.cleanScrollPositions()},h=(0,o.Z)({content:i,type:"slide-fade",transitionTime:400,isHeavy:!1});h(0),(0,S.fc)(this.closeBtn,(e=>{h.prevId()?(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),h(0),this.isFirst||t.classList.remove("state-back")):this.scrollable.isHeavyAnimationInProgress||this.slider.onCloseBtnClick()}),{listenerSetter:this.listenerSetter}),(0,S.fc)(this.editBtn,(()=>oe(this,void 0,void 0,(function*(){let e;const{peerId:t,threadId:i}=this;e=i&&(yield this.managers.appPeersManager.isForum(t))?this.slider.createTab(ae.Z):t.isAnyChat()?this.slider.createTab(X):this.slider.createTab(ee.Z),e&&(e instanceof ae.Z?e.open(t,this.threadId):(e instanceof X?e.chatId=t.toChatId():e.peerId=t,e.open()))}))),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(s.Z)("contacts_update",(e=>{this.peerId===e&&this.toggleEditBtn()})),this.listenerSetter.add(s.Z)("chat_update",(e=>{this.peerId===e.toPeerId(!0)&&this.toggleEditBtn()})),this.listenerSetter.add(s.Z)("history_multiappend",(e=>{this.renderNewMessage(e)})),this.listenerSetter.add(s.Z)("history_delete",(({peerId:e,msgs:t})=>{this.deleteDeletedMessages(e,Array.from(t))})),this.listenerSetter.add(s.Z)("message_sent",(({message:e})=>{this.renderNewMessage(e)})),this.searchSuper=new n.Z({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"PeerMedia.Members",type:"members"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:this.scrollable,onChangeTab:e=>{const t="members"===e.type&&s.Z.settings.animationsEnabled?250:0;setTimeout((()=>{u.classList.toggle("is-hidden","members"!==e.type)}),t)},managers:this.managers}),this.searchSuper.scrollStartCallback=()=>{l(!0)},this.profile.element.append(this.searchSuper.container);const u=(0,w.Z)({icon:"addmember_filled"});this.content.append(u),(0,S.fc)(u,(()=>oe(this,void 0,void 0,(function*(){const e=this.peerId,t=this.peerId.toChatId(),i=yield this.managers.appChatsManager.isChannel(t),s=(t,s)=>{let n,a,o,r,d;if(t.length>1)n="AddMembersAlertTitle",a=[(0,b.ag)("Members",[t.length])],o="AddMembersAlertCountText",r=t.map((e=>{const t=document.createElement("b");return t.append(new J.Z({peerId:e}).element),t})),i||(d=[{text:"AddMembersForwardMessages",checked:!0}]);else{n="AddOneMemberAlertTitle",o="AddMembersAlertNamesText";const e=document.createElement("b");e.append(new J.Z({peerId:t[0]}).element),r=[e],i||(d=[{text:"AddOneMemberForwardMessages",textArgs:[new J.Z({peerId:t[0]}).element],checked:!0}])}r.push(new J.Z({peerId:e}).element),new y.Z("popup-add-members",{peerId:e,titleLangKey:n,descriptionLangKey:o,descriptionLangArgs:r,buttons:[{langKey:"Add",callback:s}],checkboxes:d}).show()},n=e=>{"USER_PRIVACY_RESTRICTED"===e.type&&(0,m.bC)({langPackKey:"InviteToGroupError"})};if(i){const e=this.slider.createTab(ie.Z);e.open({type:"channel",skippable:!1,takeOut:i=>(s(i,(()=>{const s=this.managers.appChatsManager.inviteToChannel(t,i);s.catch(n),e.attachToPromise(s)})),!1),title:"GroupAddMembers",placeholder:"SendMessageTo"})}else new O.Z({peerTypes:["contacts"],placeholder:"Search",onSelect:e=>{setTimeout((()=>{s([e],(i=>{this.managers.appChatsManager.addChatUser(t,e,i.size?void 0:0).catch(n)}))}),0)}})}))),{listenerSetter:this.listenerSetter})}_renderNewMessage(e,t){var i;const s=null===(i=re[e.peerId])||void 0===i?void 0:i[t];if(s)for(const t of this.searchSuper.mediaTabs){const i=t.inputFilter,n=s[i];if(!n)continue;const a=this.searchSuper.filterMessagesByType([e],i).filter((e=>!n.find((t=>t.mid===e.mid&&t.peerId===e.peerId))));a.length&&(n.unshift(...a.map((e=>({mid:e.mid,peerId:e.peerId})))),this.peerId===e.peerId&&-1!==this.searchSuper.usedFromHistory[i]&&(this.searchSuper.usedFromHistory[i]+=a.length,this.searchSuper.performSearchResult(a,t,!1)))}}renderNewMessage(e){return oe(this,void 0,void 0,(function*(){if(this.init)return;const{peerId:t}=e,i=yield this.managers.appPeersManager.isForum(t),s=(0,ne.Z)(e,i);this._renderNewMessage(e),s&&this._renderNewMessage(e,s)}))}_deleteDeletedMessages(e,t,i){for(const s of i)for(const i of this.searchSuper.mediaTabs){const n=i.inputFilter,a=e[n];if(!a)continue;const o=a.findIndex((e=>e.mid===s));if(-1!==o&&(a.splice(o,1),this.peerId===t)){const e=this.searchSuper.tabs[n].querySelector(`[data-mid="${s}"][data-peer-id="${t}"]`);e&&(this.searchSuper.selection.isSelecting&&this.searchSuper.selection.toggleByElement(e),e.remove()),this.searchSuper.usedFromHistory[n]>=o+1&&--this.searchSuper.usedFromHistory[n]}}}deleteDeletedMessages(e,t){if(this.init)return;const i=re[e];if(i){for(const s in i)this._deleteDeletedMessages(i[s],e,t);this.scrollable.onScroll()}}cleanupHTML(){return oe(this,void 0,void 0,(function*(){const e=this.peerId.isAnyChat(),[t,i]=yield Promise.all([!!e&&this.searchSuper.canViewMembers(),!!e&&this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"invite_users")]);return()=>{this.profile.cleanupHTML(),this.editBtn.classList.add("hide"),this.searchSuper.cleanupHTML(!0),this.container.classList.toggle("can-add-members",t&&i)}}))}setLoadMutex(e){this.searchSuper.loadMutex=e}setPeer(e,t){var i,s,n;return(this.peerId!==e||this.threadId!==t)&&(this.peerId=e,this.threadId=t,this.peerChanged=!0,this.init&&(this.init(),this.init=null),this.searchSuper.setQuery({peerId:e,threadId:t,historyStorage:null!==(s=(n=null!==(i=re[e])&&void 0!==i?i:re[e]={})[t])&&void 0!==s?s:n[t]={}}),this.profile.setPeer(e,t),!0)}changeTitleKey(){return oe(this,void 0,void 0,(function*(){const e=this.managers.appPeersManager.isForum(this.peerId);return()=>{this.titleI18n.compareAndUpdate({key:this.threadId&&e?"AccDescrTopic":"Profile"})}}))}fillProfileElements(){return oe(this,void 0,void 0,(function*(){if(!this.peerChanged)return;this.peerChanged=!1;const e=yield Promise.all([this.cleanupHTML(),this.toggleEditBtn(!0),this.profile.fillProfileElements(),this.changeTitleKey()]);return()=>{e.forEach((e=>{null==e||e()}))}}))}toggleEditBtn(e){return oe(this,void 0,void 0,(function*(){let t;if(this.peerId.isUser())t=this.peerId!==s.Z.myId&&(yield this.managers.appUsersManager.isContact(this.peerId.toUserId()));else{const e=this.peerId.toChatId(),i=this.threadId&&(yield this.managers.appChatsManager.isForum(e));t=yield this.managers.appChatsManager.hasRights(e,i?"manage_topics":"change_info")}const i=()=>{this.editBtn.classList.toggle("hide",!t)};return e?i:i()}))}loadSidebarMedia(e,t){this.searchSuper.load(e,t)}onOpenAfterTimeout(){super.onOpenAfterTimeout(),this.scrollable.onScroll()}onCloseAfterTimeout(){super.onCloseAfterTimeout(),this.destroyable&&(this.profile.destroy(),this.searchSuper.destroy())}destroy(){this.destroyable=!0,this.onCloseAfterTimeout()}}},9099:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512);const n=e=>{const{element:t,className:i,forwards:a,duration:o,onTransitionEnd:r,onTransitionStart:d,useRafs:l}=e,{timeout:c,raf:h}=t.dataset;if(void 0!==c&&clearTimeout(+c),void 0!==h&&(window.cancelAnimationFrame(+h),l||delete t.dataset.raf),l&&s.Z.settings.animationsEnabled&&o)return void(t.dataset.raf=""+window.requestAnimationFrame((()=>{delete t.dataset.raf,n(Object.assign(Object.assign({},e),{useRafs:l-1}))})));a&&i&&t.classList.add(i);const u=()=>{delete t.dataset.timeout,!a&&i&&t.classList.remove("backwards",i),t.classList.remove("animating"),null==r||r()};if(null==d||d(),!s.Z.settings.animationsEnabled||!o)return t.classList.remove("animating","backwards"),void u();t.classList.add("animating"),t.classList.toggle("backwards",!a),t.dataset.timeout=""+setTimeout(u,o)},a=n},3552:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,_:()=>a.Z});var s=i(426),n=i(6385),a=i(6024),o=i(1655),r=i(5953),d=i(3624);class l{constructor(e){var t;this.historyTabIds=[],this.canHideFirst=!1,this.onCloseBtnClick=()=>{n.Z.findItemByType(this.navigationType)?n.Z.back(this.navigationType):this.historyTabIds.length&&this.closeTab(this.historyTabIds[this.historyTabIds.length-1])},this.closeTab=(e,t,i)=>{if(void 0!==e&&this.historyTabIds[this.historyTabIds.length-1]!==e)return this.removeTabFromHistory(e),!1;const s=this.historyTabIds.pop();this.onCloseTab(s,t,i);const n=this.historyTabIds[this.historyTabIds.length-1];return this._selectTab(void 0!==n?n instanceof a.Z?n.container:n:this.canHideFirst?-1:0,t),!0},(0,r.Z)(this,e),null!==(t=this.tabs)&&void 0!==t||(this.tabs=new Map),this.tabsContainer=this.sidebarEl.querySelector(".sidebar-slider"),this._selectTab=(0,s.Z)({content:this.tabsContainer,type:"navigation",transitionTime:250}),this.canHideFirst||this._selectTab(0),this.middlewareHelper=(0,d.k)()}getMiddleware(){return this.middlewareHelper.get()}selectTab(e){var t,i,s,o,r;return i=this,s=void 0,r=function*(){if(this.historyTabIds[this.historyTabIds.length-1]===e)return!1;const i=e instanceof a.Z?e:this.tabs.get(e);return this.onOpenTab&&(yield this.onOpenTab()),i&&(null===(t=i.onOpen)||void 0===t||t.call(i),i.onOpenAfterTimeout&&setTimeout((()=>{i.onOpenAfterTimeout()}),250)),n.Z.pushItem({type:this.navigationType,onPop:e=>(this.closeTab(void 0,e,!0),!0)}),this.historyTabIds.push(e),this._selectTab(e instanceof a.Z?e.container:e),!0},new((o=void 0)||(o=Promise))((function(e,t){function n(e){try{d(r.next(e))}catch(e){t(e)}}function a(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,a)}d((r=r.apply(i,s||[])).next())}))}removeTabFromHistory(e){(0,o.Z)(this.historyTabIds,e),this.onCloseTab(e,void 0)}sliceTabsUntilTab(e,t){for(let i=this.historyTabIds.length-1;i>=0;--i){const s=this.historyTabIds[i];if(s!==t){if(s instanceof e)break;this.removeTabFromHistory(s)}}}getTab(e){return this.historyTabIds.find((t=>t instanceof e))}getHistory(){return this.historyTabIds}isTabExists(e){return!!this.getTab(e)}onCloseTab(e,t,i){var s;i||n.Z.removeByType(this.navigationType,!0);const o=e instanceof a.Z?e:this.tabs.get(e);if(o){try{null===(s=o.onClose)||void 0===s||s.call(o)}catch(e){console.error("tab onClose error",o)}o.onCloseAfterTimeout&&setTimeout((()=>{o.onCloseAfterTimeout()}),280)}}addTab(e){e.container.parentElement||(this.tabsContainer.append(e.container),e.closeBtn&&e.closeBtn.addEventListener("click",this.onCloseBtnClick))}deleteTab(e){this.tabs.delete(e)}createTab(e,t=!0,i){const s=new e(i?void 0:this,t);return s.managers=this.managers,s}}},6024:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c,h:()=>h});var s=i(3241),n=i(3699),a=i(3624),o=i(319),r=i(2325),d=i(2230),l=i(8805);class c{constructor(e,t){this._constructor(e,t)}_constructor(e,t=!0){var i;this.slider=e,this.middlewareHelper=e?e.getMiddleware().create():(0,a.k)(),this.destroyable=t,this.container=document.createElement("div"),this.container.classList.add("tabs-tab","sidebar-slider-item"),this.header=document.createElement("div"),this.header.classList.add("sidebar-header"),this.closeBtn=(0,d.Z)("left sidebar-close-button",{noRipple:!0}),this.title=document.createElement("div"),this.title.classList.add("sidebar-header__title"),this.header.append(this.closeBtn,this.title),this.content=document.createElement("div"),this.content.classList.add("sidebar-content"),this.scrollable=new l.ZP(this.content,void 0,void 0,!0),this.scrollable.attachBorderListeners(this.container),this.container.append(this.header,this.content),null===(i=this.slider)||void 0===i||i.addTab(this),this.listenerSetter=new n.Z}close(){return this.slider.closeTab(this)}open(...e){return t=this,i=void 0,n=function*(){if(this.init)try{const t=this.init(...e);this.init=null,t instanceof Promise&&(yield t)}catch(e){console.error("open tab error",e)}this.slider.selectTab(this)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}init(...e){}onOpen(){}onOpenAfterTimeout(){}onClose(){}onCloseAfterTimeout(){var e,t,i;this.destroyable&&(null===(e=this.slider)||void 0===e||e.deleteTab(this),this.container.remove(),this.scrollable.destroy(),null===(t=this.listenerSetter)||void 0===t||t.removeAll(),null===(i=this.middlewareHelper)||void 0===i||i.destroy())}setTitle(e){this.title.replaceChildren((0,r.ag)(e))}}class h extends c{constructor(e){super(e),this.eventListener=new s.Z}onClose(){this.eventListener.dispatchEvent("close")}onCloseAfterTimeout(){const e=this.eventListener.dispatchResultableEvent("destroy");return this.eventListener.dispatchEvent("destroyAfter",Promise.all(e).then(o.Z,o.Z)),this.eventListener.cleanup(),super.onCloseAfterTimeout()}}},2894:(e,t,i)=>{"use strict";i.d(t,{Z:()=>p});var s=i(8130),n=i(8594),a=i(8487),o=i(4484),r=i(5565),d=i(3035),l=i(5345),c=i(5953),h=i(3061),u=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class p extends l.Z{constructor(e){let t;super({getIndex:e.getIndex||(e=>this.managers.appUsersManager.getUserStatusForSort(e.id)),onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onUpdate:e.onUpdate||(e=>u(this,void 0,void 0,(function*(){const t=(0,h.Z)(yield this.managers.appUsersManager.getUser(e.id));(0,r.Z)(e.dom.lastMessageSpan,t)}))),onSort:(e,t)=>{const i=e.dom.listEl.parentElement!==this.list;(0,o.Z)(e.dom.listEl,this.list,t),i&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:e=>{const{dom:t}=s.default.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,wrapOptions:{lazyLoadQueue:this.lazyLoadQueue}});return e.dom=t,e},updateElementWith:d.T2,updateListWith:e=>u(this,void 0,void 0,(function*(){return(0,a.Z)(this.list)?(yield(0,n.e9)(),(0,a.Z)(this.list)?void e(!0):e(!1)):e(!1)}))}),this.avatarSize="abitbigger",this.rippleEnabled=!0,this.autonomous=!0,(0,c.Z)(this,e),this.list=s.default.createChatList(this.createChatListOptions);const i=()=>{t=window.setTimeout((()=>{this.updateList((e=>{e&&i()}))}),p.SORT_INTERVAL)};i()}}p.SORT_INTERVAL=3e4},9259:(e,t,i)=>{"use strict";i.d(t,{Z:()=>I});var s=i(5432),n=i(3910),a=i(2738),o=i(5975),r=i(8497),d=i(8204),l=i(9405),c=i(3624),h=i(3035),u=i(5418),p=i(241),f=i(13),m=i(8115),g=i(5400),v=i(1447),b=i(3772),y=i(3512),w=i(5814),S=i(9099),C=i(3541),L=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let E=!1;function I({listenTo:e,listenerSetter:t,selector:i,findTarget:I}){if(s.Z)return;const M=(t,s)=>{let n;if(I)n=I(t);else{const e=i||".media-sticker-wrapper";n=t.target.closest(e)}return!n||s&&!(0,o.Z)(n,e)?void 0:n},P=y.Z.managers;t.add(e)("mousedown",(e=>{if(E||e.buttons>1||0!==e.button)return;let t=M(e);if(!t)return;const i=t.dataset.docId;if(!i)return;const s="sticker-viewer",y="STICKER-VIEWER",I=w.Z.getOnlyOnePlayableGroup(),Z=(0,c.k)();let k,T;const x=({mediaContainer:e,doc:t,middleware:i,lockGroups:n,isSwitching:o})=>L(this,void 0,void 0,(function*(){const c=(0,f.Z)(t),S=e.getBoundingClientRect(),L=(0,l.C)(t.w,t.h),E=c?280:360,I=(0,l.C)(E,E),M=S.width===S.height?I:L.aspectFitted(I),Z=(0,r.Z)(e,"bubble"),T=!Z||Z.classList.contains("is-out"),x=document.createElement("div");x.classList.add(s+"-transformer");const A=document.createElement("div");A.classList.add(s+"-sticker"),A.style.width=M.width+"px",A.style.height=M.height+"px";const _=document.createElement("div");if(_.classList.add(s+"-emoji"),_.append((0,m.Z)(t.stickerEmojiRaw)),c){const e=(E*C.Vp-E)/3*(T?1:-1);x.classList.add("has-effect"),x.style.setProperty("--translateX",`${e}px`),_.style.setProperty("--translateX",-e+"px")}const F=(0,r.Z)(e,"scrollable"),D=(0,d.Z)(e,F,!0,S);(D.overflow.vertical||D.overflow.horizontal)&&A.classList.add("is-overflow");const R=e.getBoundingClientRect(),B=R.width/M.width,N=R.height/M.height,O=R.left-(p.Z.width-R.width)/2,U=R.top-(p.Z.height-R.height)/2;x.style.transform=`translate(${O}px, ${U}px) scale(${B}, ${N})`,o&&x.classList.add("is-switching"),x.append(A,_),k.append(x);const H=yield(0,C.ZP)({doc:t,div:A,group:y,width:M.width,height:M.height,play:!1,loop:!0,middleware:i,managers:P,needFadeIn:!1,isOut:T,withThumb:!1,relativeEffect:!0,loopEffect:!0}).then((({render:e})=>e));if(!i())return;k.parentElement||document.body.append(k);const z=Array.isArray(H)?H[0]:H,j=z instanceof b.Z?new Promise((e=>z.addEventListener("firstFrame",e,{once:!0}))):Promise.resolve();if(yield Promise.all([j,(0,h.d1)()]),yield(0,u.Z)(0),i()){if(n&&(w.Z.setOnlyOnePlayableGroup(y),w.Z.checkAnimations2(!0)),z instanceof b.Z){const t=e instanceof g.LD?e.player:v.Z.getAnimation(e);if(t){if(z.curFrame=t.curFrame,z.play(),yield new Promise((e=>{let t=0;const i=()=>{2==++t&&(e(),z.removeEventListener("enterFrame",i))};z.addEventListener("enterFrame",i)})),!i())return;z.pause()}}else if(z instanceof HTMLVideoElement){const t=e.querySelector("video");t&&(z.currentTime=t.currentTime)}return{ready:()=>{(z instanceof b.Z||z instanceof HTMLVideoElement)&&z.play(),c&&(0,a.tH)(A)},transformer:x}}})),A=window.setTimeout((()=>L(this,void 0,void 0,(function*(){document.removeEventListener("mousemove",F),k=document.createElement("div"),k.classList.add(s),E=!0;const e=Z.get(),n=yield P.appDocsManager.getDoc(i);if(!e())return;let a;try{if(a=yield x({doc:n,mediaContainer:t,middleware:e,lockGroups:!0}),!a)return}catch(e){return}const{ready:o,transformer:r}=a;T=r,(0,S.Z)({element:k,className:"is-visible",forwards:!0,duration:200,onTransitionEnd:()=>{e()&&o()}}),document.addEventListener("mousemove",_)}))),125),_=e=>L(this,void 0,void 0,(function*(){const i=M(e,!0);if(!i||t===i)return;const s=i.dataset.docId;if(!s)return;t=i,Z.clean();const n=Z.get(),a=yield P.appDocsManager.getDoc(s);if(!n())return;let o;try{if(o=yield x({doc:a,mediaContainer:t,middleware:n,isSwitching:!0}),!o)return}catch(e){return void console.error("sticker viewer error",e)}const{ready:r,transformer:d}=o,l=T;(0,S.Z)({element:l,className:"is-switching",forwards:!0,duration:200,onTransitionEnd:()=>{l.remove()}}),T=d,(0,S.Z)({element:d,className:"is-switching",forwards:!1,duration:200,onTransitionEnd:()=>{n()&&r()}})})),F=e=>{(0,o.Z)(e.target,t)||D()},D=()=>{clearTimeout(A),Z.clean(),k&&((0,S.Z)({element:k,className:"is-visible",forwards:!1,duration:200,onTransitionEnd:()=>{k.remove(),w.Z.setOnlyOnePlayableGroup(I),w.Z.checkAnimations2(!1),E=!1}}),(0,a.fc)(document.body,n.Z,{capture:!0,once:!0})),document.removeEventListener("mousemove",F),document.removeEventListener("mousemove",_),document.removeEventListener("mouseup",D,{capture:!0})};document.addEventListener("mousemove",F),document.addEventListener("mouseup",D,{once:!0,capture:!0})}))}},5117:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e,t){this.container=e,this.handler=t,this.observeHeaders(),this.observeElements()}observeHeaders(){this.headersObserver=new IntersectionObserver((e=>{for(const t of e){const e=t.boundingClientRect,i=t.target.parentElement,s=t.rootBounds;e.bottom=s.top&&e.bottom{const t=e.filter((e=>e.boundingClientRect.tope.boundingClientRect.top-t.boundingClientRect.top))[0];if(!t)return;const i=t.isIntersecting?t.target:t.target.nextElementSibling;this.handler(!0,i)}),{root:this.container})}addSentinel(e,t){const i=document.createElement("div");return i.classList.add("sticky_sentinel",t),e.appendChild(i)}observeStickyHeaderChanges(e){const t=this.addSentinel(e,"sticky_sentinel--top");this.headersObserver.observe(t),this.elementsObserver.observe(e)}disconnect(){this.headersObserver.disconnect(),this.elementsObserver.disconnect()}unobserve(e,t){this.elementsObserver.unobserve(e),this.headersObserver.unobserve(t)}}},3757:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(3910),n=i(5432),a=i(5953),o=i(3416),r=i(3699),d=i(6976),l=i(5418),c=i(3725);const h=e=>"touches"in e?e.touches[0]:e,u=window;let p=!1;o.Z.addEventListener("toggle",(e=>{p=e}));const f={passive:!1,capture:!0},m=!1;class g{constructor(e){var t,i;this.cursor="grabbing",this.cancelEvent=!0,this.listenerOptions=!1,this.reset=e=>{var t;n.Z?this.listenerSetter.removeManual(u,"touchmove",this.handleMove,f):(this.listenerSetter.removeManual(u,"mousemove",this.handleMove,m),this.setCursorTo.style.cursor=""),this.hadMove&&(null===(t=this.onReset)||void 0===t||t.call(this)),this.resetValues()},this.handleStart=e=>{return t=this,i=void 0,a=function*(){var t;if(this.isMouseDown)return;const i=h(e);if(0!==Math.max(0,null!==(t=i.button)&&void 0!==t?t:0))return;if(this.verifyTouchTarget&&!(yield this.verifyTouchTarget(e)))return this.reset();const s=++this.tempId;if(this.isMouseDown=!0,this.withDelay&&!n.Z){const e=Object.assign(Object.assign({},m),{once:!0}),t=(0,c.Z)(),i=()=>t.resolve(),n=this.listenerSetter.add(u)("mousemove",i,e);if(yield Promise.race([(0,l.Z)(300),t]),t.resolve(),this.listenerSetter.remove(n),this.tempId!==s)return}this.xDown=i.clientX,this.yDown=i.clientY,this.eventUp=i,n.Z?this.listenerSetter.add(u)("touchmove",this.handleMove,f):this.listenerSetter.add(u)("mousemove",this.handleMove,m),this.onStart&&(this.onStart(),this.hadMove=!0,this.handleMove(i))},new((s=void 0)||(s=Promise))((function(e,n){function o(e){try{d(a.next(e))}catch(e){n(e)}}function r(e){try{d(a.throw(e))}catch(e){n(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,s,a},this.handleMove=e=>{var t;if(void 0===this.xDown||void 0===this.yDown||p)return void this.reset();this.cancelEvent&&(0,s.Z)(e);const i=this.eventUp=h(e),a=i.clientX,o=i.clientY,r=a-this.xDown+this.xAdded,d=o-this.yDown+this.yAdded;if(!this.hadMove){if(!r&&!d)return;this.hadMove=!0,n.Z||this.setCursorTo.style.setProperty("cursor",this.cursor,"important"),null===(t=this.onFirstSwipe)||void 0===t||t.call(this,e)}const l=this.onSwipe(r,d,e);void 0!==l&&l&&this.reset()},(0,a.Z)(this,e),null!==(t=this.setCursorTo)&&void 0!==t||(this.setCursorTo=this.element),this.listenerSetter=new r.Z,this.setListeners(),this.resetValues(),this.tempId=0,null===(i=e.middleware)||void 0===i||i.onDestroy((()=>{this.reset(),this.removeListeners()}))}setListeners(){n.Z?(this.withDelay?(0,d.E)(this.element,(e=>{(0,s.Z)(e),this.handleStart(e)}),this.listenerSetter):this.listenerSetter.add(this.element)("touchstart",this.handleStart,this.listenerOptions),this.listenerSetter.add(u)("touchend",this.reset)):(this.listenerSetter.add(this.element)("mousedown",this.handleStart,this.listenerOptions),this.listenerSetter.add(u)("mouseup",this.reset))}removeListeners(){this.listenerSetter.removeAll()}setCursor(e=""){this.cursor=e,!n.Z&&this.hadMove&&this.setCursorTo.style.setProperty("cursor",this.cursor,"important")}add(e,t){this.xAdded=e,this.yAdded=t,this.handleMove({clientX:this.eventUp.clientX,clientY:this.eventUp.clientY,target:this.eventUp.target})}resetValues(){++this.tempId,this.hadMove=!1,this.xAdded=this.yAdded=0,this.xDown=this.yDown=this.eventUp=this.isMouseDown=void 0}}},709:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(2398),n=i(6272),a=i(4762),o=i(503);class r extends o.ZP{constructor(e={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},e)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");const t=this.input;if(t instanceof HTMLInputElement)t.type="tel",t.autocomplete="rr55RandomRR55";else{t.inputMode="decimal";const e=window.devicePixelRatio;if(e>1){let i;a.IS_APPLE?i=-.16*e:a.IS_ANDROID&&(i=0),t.style.setProperty("--letter-spacing",i+"px")}const i=this.setValueSilently.bind(this);this.setValueSilently=e=>{i(e),(0,s.Z)(this.input,!0)}}t.addEventListener("input",(()=>{t.classList.remove("error");const i=this.value;let s;Math.abs(i.length-this.lastValue.length)>1&&!this.pasted&&a.IS_APPLE_MOBILE&&this.setValueSilently(this.lastValue+i),this.pasted=!1,this.setLabel();let o,r,d,l="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(s=(0,n.u)(this.value),o=s.formatted,r=s.country,l=s.leftPattern,d=s.code,this.setValueSilently(this.lastValue=o?"+"+o:"")),t.dataset.leftPattern=l,e.onInput&&e.onInput(s)})),t.addEventListener("paste",(()=>{this.pasted=!0})),t.addEventListener("keypress",(e=>{const t=e.key;if(/\D/.test(t)&&!e.metaKey&&!e.ctrlKey&&"Backspace"!==t&&("+"!==t||!e.shiftKey))return e.preventDefault(),!1}))}}},2796:(e,t,i)=>{"use strict";i.d(t,{Am:()=>c,PE:()=>l,bC:()=>h});var s=i(5565),n=i(2296),a=i(2325);const o=document.createElement("div");let r;o.classList.add("toast");const d=new n.Z("toast");function l(){d.close(),o.classList.remove("is-visible"),r&&clearTimeout(+r),r=window.setTimeout((()=>{o.remove(),r=void 0}),200)}function c(e,t){d.close(),(0,s.Z)(o,e),o.parentElement||(document.body.append(o),o.offsetLeft),o.classList.add("is-visible"),r&&clearTimeout(+r),d.open(o),r=window.setTimeout(l,3e3),t&&d.addEventListener("toggle",t,{once:!0})}function h(e){c((0,a.ag)(e.langPackKey,e.langPackArguments),e.onClose)}d.addEventListener("toggle",(e=>{e||l()}))},426:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l});var s=i(3512),n=i(3725),a=i(8594),o=i(2648),r=i(3910);const d={navigation:{callback:(e,t,i)=>{const s=t.getBoundingClientRect().width,n=[e,t];return i&&n.reverse(),n[0].style.filter="brightness(80%)",n[0].style.transform=`translate3d(${.25*-s}px, 0, 0)`,n[1].style.transform=`translate3d(${s}px, 0, 0)`,e.classList.add("active"),e.offsetWidth,e.style.transform="",e.style.filter="",()=>{t.style.transform=t.style.filter=""}},animateFirst:!1},tabs:{callback:(e,t,i)=>{const s=t.getBoundingClientRect().width,n=[e,t];return i&&n.reverse(),n[0].style.transform=`translate3d(${-s}px, 0, 0)`,n[1].style.transform=`translate3d(${s}px, 0, 0)`,e.classList.add("active"),e.offsetWidth,e.style.transform="",()=>{t.style.transform=""}},animateFirst:!1}},l=e=>{let{content:t,type:i,transitionTime:l,onTransitionEnd:c,isHeavy:h=!0,once:u=!1,withAnimationListener:p=!0,listenerSetter:f,animateFirst:m=!1}=e;const{callback:g,animateFirst:v}=d[i]||{};t.dataset.animation=i,void 0!==v&&(m=v);const b=new Map;let y,w=null;if(p){const e=g?"transitionend":"animationend",i=s=>{if((0,r.Z)(s),s.target.parentElement!==t)return;const n=b.get(s.target);null==n||n(),s.target===w&&(!y&&h||(y&&(y.resolve(),y=void 0),null==c||c(S.prevId()),t.classList.remove("animating","backwards","disable-hover"),u&&(f?f.removeManual(t,e,i):t.removeEventListener(e,i),w=y=void 0,b.clear())))};f?f.add(t)(e,i):t.addEventListener(e,i)}function S(e,i=!0,r){r&&(w=r),e instanceof HTMLElement&&(e=(0,o.Z)(e));const d=S.prevId();if(e===d)return!1;const u=t.children[e];if(s.Z.settings.animationsEnabled&&(-1!==d||m)||(i=!1),!p){const e=t.dataset.timeout;void 0!==e&&clearTimeout(+e),delete t.dataset.timeout}if(!i){if(w)w.classList.remove("active","to","from");else if(u){const e=b.get(u);null==e||e()}return u&&(u.classList.remove("to","from"),u.classList.add("active")),t.classList.remove("animating","backwards","disable-hover"),w=u,void(null==c||c(e))}p||(t.dataset.timeout=""+window.setTimeout((()=>{u.classList.remove("to"),w&&w.classList.remove("from"),t.classList.remove("animating","backwards","disable-hover"),delete t.dataset.timeout}),l)),w&&(w.classList.remove("to"),w.classList.add("from")),t.classList.add("animating");const f=d{u.classList.remove("to"),b.delete(u)}))}if(w){let e;const t=w,i=()=>{clearTimeout(e),t.classList.remove("active","from"),null==v||v(),b.delete(t)};u?(e=window.setTimeout(i,l+100),b.set(t,i)):(e=window.setTimeout(i,l),b.set(t,(()=>{clearTimeout(e),b.delete(t)}))),t.dataset.transitionTimeout=""+e,h&&(y||(y=(0,n.Z)()),(0,a.YW)(y,2*l))}w=u}return S.prevId=()=>w?(0,o.Z)(w):-1,S.getFrom=()=>w,S.setFrom=e=>w=e,S}},6726:(e,t,i)=>{"use strict";i.d(t,{l:()=>o});var s=i(5701),n=i(503);function a(e){return(e.length>=3&&e.length<=32||!e.length)&&/^[a-zA-Z0-9_]*$/.test(e)}class o extends n.ZP{constructor(e,t){super(e),this.managers=t,this.checkUsernameDebounced=(0,s.Z)(this.checkUsername.bind(this),150,!1,!0),e.listenerSetter.add(this.input)("input",(()=>{var e,t,i,s;const o=this.getValue();if(this.error=void 0,o===this.originalValue||!o.length)return this.setState(n.I1.Neutral),void(null===(t=(e=this.options).onChange)||void 0===t||t.call(e));a(o)?this.setState(n.I1.Neutral):this.setError(this.options.invalidText),this.input.classList.contains("error")?null===(s=(i=this.options).onChange)||void 0===s||s.call(i):this.checkUsernameDebounced(o)}))}getValue(){let e=this.value;return this.options.head&&(e=e.slice(this.options.head.length),this.setValueSilently(this.options.head+e)),e}checkUsername(e){if(this.checkUsernamePromise)return;let t;this.error=void 0,t=this.options.peerId?this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(),e):this.managers.appUsersManager.checkUsername(e);const i=this.checkUsernamePromise=t.then((t=>{this.getValue()===e&&(t?this.setState(n.I1.Valid,this.options.availableText):this.setError(this.options.takenText))}),(t=>{this.getValue()===e&&(this.error=t,"USERNAME_PURCHASE_AVAILABLE"===t.type?this.setError(this.options.takenText):this.setError(this.options.invalidText))})).then((()=>{var t,s;this.checkUsernamePromise===i&&(this.checkUsernamePromise=void 0),null===(s=(t=this.options).onChange)||void 0===s||s.call(t);const n=this.getValue();n!==e&&this.isValidToChange()&&a(n)&&this.checkUsername(n)}))}}},9522:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(2738),n=i(5975),a=i(2398),o=i(4484),r=i(2914),d=i(319),l=i(5345),c=i(2325),h=i(3512),u=i(5592),p=i(7479),f=i(5029),m=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class g extends f.Z{constructor(e){super({name:"UsernamesProfileHeader",caption:e.peerId.isUser()?"UsernamesProfileHelp":"UsernamesChannelHelp"});const{peerId:t,peer:i,usernameInputField:f,listenerSetter:g,middleware:v}=e,b=h.Z.managers,y=t.isUser()?void 0:t.toChatId(),w=this,S="usernames",C=document.createElement("div");let L;C.classList.add(S);const E=new l.Z({getIndex:e=>L.length-L.findIndex((t=>t.username===e.id)),onDelete:e=>{e.row.container.remove()},onSort:(e,t)=>{(0,o.Z)(e.row.container,C,t)},onElementCreate:e=>{const t=L.find((t=>t.username===e.id)),i=new p.ZP({title:"@"+t.username,subtitle:!0,clickable:!0}),s=!!t.pFlags.editable,n=!!t.pFlags.active;return s&&(i.container.dataset.editable="1"),i.container.dataset.username=t.username,i.container.classList.add(S+"-username"),i.subtitle.classList.add(S+"-username-status"),i.createMedia("medium").classList.add(S+"-username-icon","tgico"),i.makeSortable(),I(i,n),e.row=i,e}}),I=(e,t)=>{e.subtitle.replaceChildren((0,c.ag)(e.container.dataset.editable?"UsernameLinkEditable":t?"UsernameLinkActive":"UsernameLinkInactive")),e.container.classList.toggle("active",t),e.toggleSorting(t)},M=(e=[])=>{L=e,E.getAll().forEach((t=>{e.some((e=>e.username===t.id))||E.delete(t.id)})),e.forEach((e=>{if(E.has(e.username)){const t=E.get(e.username);E.update(e.username,t),I(t.row,!!e.pFlags.active)}else E.add(e.username)})),w.container.classList.toggle("hide",!E.getAll().size)};M(i.usernames),g.add(h.Z)("peer_title_edit",(({peerId:e})=>m(this,void 0,void 0,(function*(){if(e!==t)return;const i=yield b.appPeersManager.getPeer(t);M(i.usernames)}))));let P=!1;(0,s.fc)(C,(e=>m(this,void 0,void 0,(function*(){if(P)return void(P=!1);const t=(0,n.Z)(e.target,C);if(!t)return;if(t.dataset.editable)return void(0,a.Z)(f.input,!0,!0);const i=t.dataset.username,s=t.classList.contains("active");let o,r;s?(o="UsernameDeactivateLink",r=y?"UsernameDeactivateLinkChannelMessage":"UsernameDeactivateLinkProfileMessage"):(o="UsernameActivateLink",r=y?"UsernameActivateLinkChannelMessage":"UsernameActivateLinkProfileMessage");try{yield(0,u.Z)({titleLangKey:o,descriptionLangKey:r,button:{langKey:s?"Hide":"Show"}})}catch(e){return}const l=!s;let c;c=y?b.appChatsManager.toggleUsername(y,i,l):b.appUsersManager.toggleUsername(i,l),c.catch((e=>{"USERNAMES_ACTIVE_TOO_MUCH"===e.type?(0,u.Z)({titleLangKey:"UsernameActivateErrorTitle",descriptionLangKey:"UsernameActivateErrorMessage",button:{langKey:"OK",isCancel:!0}}).catch(d.Z):console.error("turn username error",e)}))})))),new r.Z({list:C,middleware:v,onSort:(e,t)=>{const i=L.splice(e,1)[0];L.splice(t,0,i),E.updateList();const s=L.filter((e=>e.pFlags.active)).map((e=>e.username));y?b.appChatsManager.reorderUsernames(y,s):b.appUsersManager.reorderUsernames(s)}}),w.content.append(C)}}},2940:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e,t){this.items=new Map,this.locked=!1,this.observer=new IntersectionObserver((t=>{if(this.locked)return;const i=[];t.forEach(((e,t)=>{const s=e.target;if(this.items.get(s)===e.isIntersecting)return;this.items.set(s,e.isIntersecting);const n={target:s,visible:e.isIntersecting,entry:e,index:t};i.push(n)})),i.forEach((t=>{e(t)}))}),t)}getVisible(){const e=[];return this.items.forEach(((t,i)=>{t&&e.push(i)})),e}clearVisible(){const e=this.getVisible();for(const t of e)this.items.set(t,!1)}isVisible(e){return this.items.get(e)}disconnect(){this.observer.disconnect(),this.items.clear()}refresh(){this.observer.disconnect();const e=[...this.items.keys()];for(const t of e)this.observer.observe(t)}refreshVisible(){const e=this.getVisible();for(const t of e)this.observer.unobserve(t);for(const t of e)this.observer.observe(t)}observe(e){this.items.set(e,!1),this.observer.observe(e)}unobserve(e){this.observer.unobserve(e),this.items.delete(e)}unlock(){this.locked=!1}unlockAndRefresh(){this.unlock(),this.refresh()}lock(){this.locked=!0}}},8427:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(3910),n=i(2738),a=i(3013),o=i(65);class r extends o.Z{constructor(e,t=!1){super({step:.01,min:0,max:1,vertical:t},1),this.listenerSetter=e,this.vertical=t,this.onMuteClick=e=>{e&&(0,s.Z)(e),a.Z.muted=!a.Z.muted},this.setVolume=()=>{const{volume:e,muted:t}=a.Z;let i;i=!e||t?0:e>.5?3:e>0&&e<.25?1:2,r.ICONS.forEach((e=>this.icon.classList.remove("tgico-"+e))),this.icon.classList.add("tgico-"+r.ICONS[i]),this.mousedown||this.setProgress(t?0:e)},this.setListeners(),this.setHandlers({onScrub:e=>{const t=Math.max(Math.min(e,1),0);a.Z.muted=!1,a.Z.volume=t}});const i="player-volume",o=this.btn=document.createElement("div");o.classList.add("btn-icon",i);const d=this.icon=document.createElement("span");d.classList.add(i+"__icon"),o.append(d,this.container),(0,n.fc)(d,this.onMuteClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.Z)("playbackParams",this.setVolume),this.setVolume()}}r.ICONS=["volume_off","volume_mute","volume_down","volume_up"]},9083:(e,t,i)=>{"use strict";i.d(t,{N:()=>a,Z:()=>n});var s=i(5400);function n({docIds:e,loadPromises:t,middleware:i,lazyLoadQueue:n,customEmojiSize:a,animationGroup:o}){const r=" ".repeat(e.length),d=[];return e.forEach(((e,t)=>{d.push({_:"messageEntityCustomEmoji",offset:t,length:1,document_id:e})})),(0,s.ZP)(r,{entities:d,loadPromises:t,animationGroup:o,customEmojiSize:a,middleware:i,lazyLoadQueue:n})}function a(e){var t;const i=null!==(t=e.loadPromises)&&void 0!==t?t:e.loadPromises=[],s=n(e);return Promise.all(i).then((()=>s))}},296:(e,t,i)=>{"use strict";i.d(t,{Z:()=>I});var s=i(2341),n=i(467),a=i(632),o=i(2738),r=i(8497),d=i(4081),l=i(319),c=i(2312),h=i(4271),u=i(1243),p=i(7030),f=i(2325),m=i(1507),g=i(2491),v=i(3512),b=i(8448),y=i(3251),w=i(3442),S=i(9492),C=i(5671),L=i(1604),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function I({message:e,withTime:t,fontWeight:i,voiceAsMusic:I,showSender:M,searchContext:P,loadPromises:Z,autoDownloadSize:k,lazyLoadQueue:T,sizeType:x,managers:A=v.Z.managers,cacheContext:_,fontSize:F}){var D;return E(this,void 0,void 0,(function*(){null!=i||(i=500),null!=x||(x=""),null!=F||(F=0);const R=0===k,B=e.media.document||e.media.webpage.document,N=null==e?void 0:e.uploadingFileName;if("audio"===B.type||"voice"===B.type||"round"===B.type){const s=new b.ZP;return s.withTime=t,s.message=e,s.noAutoDownload=R,s.lazyLoadQueue=T,s.loadPromises=Z,I&&(s.voiceAsMusic=I),P&&(s.searchContext=P),M&&(s.showSender=M),s.dataset.fontWeight=""+i,s.dataset.fontSize=""+F,s.dataset.sizeType=x,yield s.render(),s}const O=B.file_name?B.file_name.split("."):"";let U="";U=O.length>1&&Array.isArray(O)?(0,n.ST)(O.pop().split(" ",1)[0].toLowerCase()):"file";const H=document.createElement("div");H.classList.add("document",`ext-${U}`),H.dataset.docId=""+B.id,H.doc=B;const z=document.createElement("div");let j;z.classList.add("document-ico");const G=!!_,V=()=>G?_:A.thumbsStorage.getCacheContext(B);_=yield V();let K=!1;if((null===(D=B.thumbs)||void 0===D?void 0:D.length)||e.pFlags.is_outgoing&&_.url&&"photo"===B.type){H.classList.add("document-with-thumb"),K=!0;const t=[];if(e.pFlags.is_outgoing&&["photo","video"].includes(B.type)&&_.url)z.innerHTML=``,t.push(z.firstElementChild);else{performance.now();const e=yield(0,S.Z)({photo:B,message:null,container:z,boxWidth:54,boxHeight:54,loadPromises:Z,withoutPreloader:!0,lazyLoadQueue:T,size:(0,p.Z)(B,54,54,!0),managers:A});z.style.width=z.style.height="",e.images.thumb&&t.push(e.images.thumb),e.images.full&&t.push(e.images.full)}t.forEach((e=>e.classList.add("document-thumb")))}else j=document.createElement("span"),j.classList.add("document-ico-text"),j.innerText=U,z.append(j);const W=B.file_name?(0,g.Z)(B.file_name):"Unknown.file";document.createElement("div").classList.add("document-description");const $=document.createElement("span"),q=[(0,d.Z)(B.size)];if(t&&q.push((0,a.OD)(e.date)),M&&q.push(yield(0,C.Z)(e)),!t&&!M){const e=document.createElement("span"),t=(0,d.Z)(B.size);e.append(" / ",t),e.style.visibility="hidden",q.push(e)}H.innerHTML=`\n ${_.downloaded&&!N||!e.mid||!K?"":'
'}\n
\n
\n `;const Q=H.querySelector(".document-name"),Y=new y.I;Y.dataset.fontWeight=""+i,Y.dataset.fontSize=""+F,Y.dataset.sizeType=x,Y.textContent=W,e.mid||H.classList.add("downloaded"),Q.append(Y),M&&Q.append((0,L.Z)(e));const X=H.querySelector(".document-size");if($.append(...(0,f.A1)(q," · ")),X.append($),H.prepend(z),!N&&e.pFlags.is_outgoing&&!e.mid)return H;let J,ee=null;const te=()=>{if(H.classList.remove("downloading"),B.size>m.Iw&&!N)return ee.setManual(),ee.attach(J),ee.preloader.classList.add("manual"),void ee.setDownloadFunction(se);if(B.size<=m.Iw&&H.classList.add("downloaded"),J){if(J!==z){const e=J;setTimeout((()=>{e.remove()}),200)}J=null}ee&&(ee=null)},ie=e=>{H.classList.add("downloading");const t=document.createElement("span"),i=(0,d.Z)(B.size);t.style.position="absolute",t.style.left="0",e.then(te,l.Z).finally((()=>{$.style.visibility="",t.remove()}));const s=e=>(0,d.Z)(e);let n=s(0);$.style.visibility="hidden",t.append(n," / ",i),$.parentElement.append(t),e.addNotifyListener((e=>{const t=s(e.done);n.replaceWith(t),n=t}))},se=e=>{var t;const i=!e||e.isTrusted,n=H.doc;let a;const o=h.Z.chat.bubbles?h.Z.chat.bubbles.lazyLoadQueue.queueId:void 0;if(i)if("pdf"===n.type){const e=!ee||ee.detached;a=c.Z.downloadMediaURL({media:n,queueId:o}),e&&a.then((()=>{setTimeout((()=>E(this,void 0,void 0,(function*(){const e=(yield V()).url;window.open(e)}))),v.Z.settings.animationsEnabled?250:0)}))}else a=s.Z.has(n.mime_type)&&(null===(t=n.thumbs)||void 0===t?void 0:t.length)?c.Z.downloadMediaURL({media:n,queueId:o}):c.Z.downloadToDisc({media:n,queueId:o});else a=c.Z.downloadToDisc({media:n,queueId:o},!0);a.catch((()=>{H.classList.remove("downloading")})),J&&(ee.attach(J,!0,a),ie(a))},{fileName:ne}=(0,u.Z)({media:B,downloadId:"1"});if(yield A.apiFileManager.isDownloading(ne)){J=H.querySelector(".document-download")||z;const e=c.Z.downloadToDisc({media:B},!0);ee=new w.Z,ee.attach(J,!1,e),ee.setDownloadFunction(se),ie(e)}else if(!_.downloaded||N)if(J=H.querySelector(".document-download")||z,ee=new w.Z({isUpload:!!N}),N){const e=c.Z.getUpload(N);ee.attachPromise(e),ee.attach(J),ie(e)}else ee.construct(),ee.setManual(),ee.attach(J),ee.setDownloadFunction(se),void 0!==k&&k>=B.size&&(0,o.tH)(ee.preloader);return(0,o.fc)(H,(e=>{(0,r.Z)(e.target,"time")||(ee?ee.onClick(e):se(e))})),H}))}v.Z.addEventListener("document_downloading",(e=>{Array.from(document.querySelectorAll(`.document[data-doc-id="${e}"]`)).forEach((e=>{e.querySelector(".preloader-container.manual")&&(0,o.tH)(e)}))}))},8210:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(6272);function n(e){return"+"+(0,s.u)(e).formatted}},177:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(2575),n=i(2325),a=i(3512);function o(e,t=a.Z.managers){var i,o,r,d,l,c;return r=this,d=void 0,c=function*(){const a=yield t.appChatsManager.getChat(e);if("chatForbidden"===a._)return(0,n.ag)("YouWereKicked");const r=yield t.appProfileManager.getCachedFullChat(e);let d;d=r?"channelFull"===r._?r.participants_count:null===(i=r.participants.participants)||void 0===i?void 0:i.length:a.participants_count||(null===(o=a.participants)||void 0===o?void 0:o.participants.length),d=d||1;const l=a.pFlags.broadcast?"Peer.Status.Subscribers":"Peer.Status.Member";return(0,n.ag)(l,[(0,s.Z)(d)])},new((l=void 0)||(l=Promise))((function(e,t){function i(e){try{n(c.next(e))}catch(e){t(e)}}function s(e){try{n(c.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof l?n:new l((function(e){e(n)}))).then(i,s)}n((c=c.apply(r,d||[])).next())}))}},493:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(8456),n=i(5102),a=i(2325),o=i(8115),r=i(3512);function d(e){return t=this,i=void 0,l=function*(){const{peerId:t=r.Z.myId,plainText:i,onlyFirstName:d,limitSymbols:l,managers:c=r.Z.managers,threadId:h}=e;let u="";if(t.isUser()){const e=yield c.appUsersManager.getUser(t.toUserId());e&&(e.first_name&&(u+=e.first_name),!e.last_name||d&&u||(u+=" "+e.last_name)),u=u?u.trim():!e||e.pFlags.deleted?a.ZP.format(d?"Deleted":"HiddenName",!0):(0,n.Z)(e)[0]||""}else{if(h){const e=yield c.dialogsStorage.getForumTopic(t,h);u=(null==e?void 0:e.title)||""}if(!u){const e=yield c.appChatsManager.getChat(t.toChatId());u=(null==e?void 0:e.title)||""}d&&(u=u.split(" ")[0])}return void 0!==l&&(u=(0,s.Z)(u,l,l)),i?u:(0,o.Z)(u)},new((d=void 0)||(d=Promise))((function(e,s){function n(e){try{o(l.next(e))}catch(e){s(e)}}function a(e){try{o(l.throw(e))}catch(e){s(e)}}function o(t){var i;t.done?e(t.value):(i=t.value,i instanceof d?i:new d((function(e){e(i)}))).then(n,a)}o((l=l.apply(t,i||[])).next())}));var t,i,d,l}},3061:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(632),n=i(2325),a=i(1507);function o(e){var t;if(!e)return document.createElement("span");let i,o;switch(e.id){case a.hj.toUserId():i="Peer.RepliesNotifications";break;case a.yF.toUserId():i="Peer.ServiceNotifications";break;default:if(e.pFlags.bot){i="Bot";break}if(e.pFlags.support){i="SupportStatus";break}switch(null===(t=e.status)||void 0===t?void 0:t._){case"userStatusRecently":i="Lately";break;case"userStatusLastWeek":i="WithinAWeek";break;case"userStatusLastMonth":i="WithinAMonth";break;case"userStatusOffline":{const t=e.status.was_online,n=new Date,a=(n.getTime()/1e3|0)-t;if(a<60)i="Peer.Status.justNow";else if(a<3600)i="Peer.Status.minAgo",o=[a/60|0];else if(a<86400&&n.getDate()===new Date(1e3*t).getDate())i="LastSeen.HoursAgo",o=[a/3600|0];else{i="Peer.Status.LastSeenAt";const{dateEl:e,timeEl:n}=(0,s.rz)(t);o=[e,n]}break}case"userStatusOnline":i="Online";break;default:i="ALongTimeAgo"}}return(0,n.ag)(i,o)}},6131:(e,t,i)=>{"use strict";i.d(t,{MR:()=>d,ZP:()=>c,kN:()=>l});var s=i(3910),n=i(1046),a=i(319),o=i(6628),r=i(9099);function d(e){const{mediaSpoiler:t,reveal:i,destroyAfter:s}=e;(0,r.Z)({element:t,forwards:i,className:"is-revealing",duration:250,onTransitionEnd:()=>{i&&s&&(t.remove(),t.middlewareHelper.destroy())}})}function l(e){const{mediaSpoiler:t,event:i}=e;if((0,s.Z)(i),t.classList.contains("is-revealing"))return;const n=t.parentElement.querySelector("video");n&&!t.parentElement.querySelector(".video-play")&&(n.autoplay=!0,n.play().catch(a.Z)),d({mediaSpoiler:t,reveal:!0,destroyAfter:!0})}function c(e){return t=this,i=void 0,a=function*(){const{media:t}=e,i=(t.sizes||t.thumbs).find((e=>"photoStrippedSize"===e._));if(!i)return;const{image:s,loadPromise:a}=(0,n.Z)(t,i,!0);return yield a,function(e){const{middleware:t,image:i}=e;if(!t())return;i.classList.add("media-spoiler-thumbnail");const s=document.createElement("div");s.classList.add("media-spoiler-container"),s.middlewareHelper=t.create();const n=o.Z.create(Object.assign(Object.assign({},e),{middleware:s.middlewareHelper.get()}));return s.append(i,n.canvas),s}(Object.assign(Object.assign({},e),{image:s}))},new((s=void 0)||(s=Promise))((function(e,n){function o(e){try{d(a.next(e))}catch(e){n(e)}}function r(e){try{d(a.throw(e))}catch(e){n(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,s,a}},6239:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(9345);function n(e){return t=this,i=void 0,a=function*(){try{return yield(0,s.Z)(e)}catch(t){return console.error("wrapMessageActionTextNewUnsafe error:",t),e.plain?"":document.createElement("span")}},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a}},9345:(e,t,i)=>{"use strict";i.d(t,{Z:()=>F,e:()=>x});var s=i(1655),n=i(632),a=i(2614),o=i(130),r=i(8939),d=i(5180),l=i(2946),c=i(2325),h=i(1507),u=i(8115),p=i(2491),f=i(5400),m=i(3512),g=i(2064),v=i(5798);let b,y,w;const S=new Map;var C=i(9083),L=i(493),E=i(3591);function I(e){const t=e.action,{onclick:i,url:s}=(0,E.Z)(`tg://voicechat?chat_id=${e.peerId.toChatId()}&id=${t.call.id}&access_hash=${t.call.access_hash}`);if(!i)return document.createElement("span");const n=document.createElement("a");return n.href=s,n.setAttribute("onclick",i+"(this)"),n}var M=i(496),P=i(7362),Z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function k(e){return Z(this,void 0,void 0,(function*(){const t=yield(0,M.Z)(e);if(e.plain)return t;const i=document.createElement("i");return i.dataset.savedFrom=e.message.peerId+"_"+e.message.mid,i.dir="auto",i.append(t),i}))}function T(e,t){return t?e:(0,a.Z)((0,u.Z)(e))}function x(e){return Z(this,void 0,void 0,(function*(){const t=e.topic;let i=null==t?void 0:t.icon_emoji_id;return(null==t?void 0:t.id)===h.Ox&&(i="5390854796011906616"),i?e.plain?m.Z.managers.appEmojiManager.getCustomEmojiDocument(i).then((e=>e.stickerEmojiRaw)):(0,C.N)(Object.assign(Object.assign({},e),{docIds:[i]})).then((e=>(e.lastElementChild.classList.add("topic-icon"),e))):e.plain?"":function(e,t){if(!b){w=document.getElementById("svg-defs");const e="http://www.w3.org/2000/svg";b=document.createElementNS(e,"svg"),b.setAttributeNS(null,"width","26"),b.setAttributeNS(null,"height","26"),b.setAttributeNS(null,"viewBox","0 0 26 26"),b.classList.add("topic-icon-svg");const t=document.createElementNS(e,"use");t.setAttributeNS(null,"href","#topic-icon"),b.append(t),y=document.createElement("span"),y.classList.add("topic-icon","avatar-like");const i=document.createElement("span");i.classList.add("topic-icon-content"),y.append(b,i)}e||(console.error("NO TOPIC ICON COLOR!"),e=h.OS[0]),t||(console.error("NO TOPIC NAME!"),t="");const i=e.toString(16),s=`topic-icon-gradient-${e}`;let n=S.get(e);if(!n){const{h:t,s:a,l:o,a:r}=(0,g.cw)("#"+i);w.insertAdjacentHTML("beforeend",`\n \n \n \n \n `),S.set(e,n=`hsla(${t}, ${a}%, ${Math.max(0,o-40)}%, ${r})`)}const a=y.cloneNode(!0);return a.firstElementChild.style.fill=`url(#${s})`,a.firstElementChild.style.stroke=n,a.lastElementChild.append((0,v.Z)(t,!0)),a}(null==t?void 0:t.icon_color,null==t?void 0:t.title)}))}function A(e){const t=e.message.action;return x(Object.assign(Object.assign({},e),{topic:t}))}function _(e){return Z(this,void 0,void 0,(function*(){const t=e.message.action,i=document.createElement("span");return i.classList.add("topic-name"),i.append(yield A(e),T(t.title,e.plain)),i}))}function F(e){var t;return Z(this,void 0,void 0,(function*(){const{plain:i,message:h,middleware:u,lazyLoadQueue:g,customEmojiSize:v,animationGroup:b}=e,y=i?void 0:document.createElement("span"),w="action"in h&&h.action;if(w.message){const e=w.message;return i?(0,p.Z)(e):((0,o.Z)(y,(0,f.ZP)(e,{noLinebreaks:!0})),y)}{let o,u,p=w._;const g=m.Z.managers,v=(e,t)=>t?(0,L.Z)({peerId:e,plainText:t}):(0,P.Z)({peerId:e});switch(w._){case"messageActionPhoneCall":p+="."+w.type,u=[(0,r.Z)(w.duration,i)];break;case"messageActionGroupCall":p+="."+w.type,u=[],p.endsWith("You")||h.pFlags.post||u.push(v(h.fromId,i)),void 0!==w.duration?u.push((0,r.Z)(w.duration,i)):u.push(I(h));break;case"messageActionInviteToGroupCall":{const e=[h.fromId,w.users[0].toPeerId()];let t="Chat.Service.VoiceChatInvitation";const n=m.Z.myId;e[0]===n?t+="ByYou":e[1]===n&&(t+="ForYou"),(0,s.Z)(e,n),o=t,u=e.map((e=>v(e,i))),u.push(I(h));break}case"messageActionGroupCallScheduled":{const e=new Date,t=new Date(1e3*w.schedule_date),s=(t.getTime()-e.getTime())/864e5,a=new Date(e);a.setDate(a.getDate()+1);const r=yield g.appPeersManager.isBroadcast(h.peerId);o=r?"ChatList.Service.VoiceChatScheduled.Channel":"ChatList.Service.VoiceChatScheduled",u=[];const d=m.Z.myId;let l;h.fromId===d?o+="You":r||u.push(v(h.fromId,i));const p=[];s<1&&t.getDate()===e.getDate()?l="TodayAtFormattedWithToday":s<2&&t.getDate()===a.getDate()?l="Time.TomorrowAt":(l="formatDateAtTime",p.push(new c.ZP.IntlDateElement({date:t,options:{day:"2-digit",month:"2-digit",year:"2-digit"}}).element)),p.push((0,n.mr)(t));const f=(0,c.ag)(l,p);u.push(f);break}case"messageActionChatCreate":{const e=m.Z.myId;h.fromId===e?p+="You":u=[v(h.fromId,i)];break}case"messageActionPinMessage":{const t=h.peerId,s=yield g.appMessagesManager.getMessageByPeer(t,h.reply_to_mid);u=[v(h.fromId,i)],s?u.push(k(Object.assign(Object.assign({},e),{message:s}))):(o="ActionPinnedNoText",h.reply_to_mid&&g.appMessagesManager.fetchMessageReplyTo(h));break}case"messageActionChatJoinedByRequest":{const e=yield g.appPeersManager.isBroadcast(h.peerId);h.pFlags.out?o=e?"RequestToJoinChannelApproved":"RequestToJoinGroupApproved":(o=e?"ChatService.UserJoinedChannelByRequest":"ChatService.UserJoinedGroupByRequest",u=[v(h.fromId,i)]);break}case"messageActionContactSignUp":case"messageActionChatReturn":case"messageActionChatLeave":case"messageActionChatJoined":case"messageActionChatEditPhoto":case"messageActionChatDeletePhoto":case"messageActionChatEditVideo":case"messageActionChatJoinedByLink":case"messageActionChannelEditVideo":case"messageActionChannelDeletePhoto":u=[v(h.fromId,i)];break;case"messageActionChannelEditTitle":case"messageActionChatEditTitle":u=[],"messageActionChatEditTitle"===w._&&u.push(v(h.fromId,i)),u.push(T(w.title));break;case"messageActionChatDeleteUser":case"messageActionChatAddUsers":case"messageActionChatAddUser":{const e=w.users||[w.user_id];if(u=[v(h.fromId,i)],e.length>1){const t=(0,c.v_)(yield Promise.all(e.map((e=>v(e.toPeerId(),i)))),!1,i);if(i)u.push(...t);else{const e=document.createElement("span");e.append(...t),u.push(e)}}else u.push(v(e[0].toPeerId(),i));break}case"messageActionBotAllowed":{const e=(0,f.ZP)(w.domain,{entities:[{_:"messageEntityUrl",length:w.domain.length,offset:0}]});u=[(0,a.Z)(e)];break}case"messageActionPaymentSent":{const s=w.pFlags.recurring_init,n=w.pFlags.recurring_used;if(o=n?"Chat.Service.PaymentSentRecurringUsedNoTitle":s?"Chat.Service.PaymentSentRecurringInitNoTitle":"Chat.Service.PaymentSent1NoTitle",u=[(0,d.Z)(w.total_amount,w.currency),v(h.peerId,i)],h.reply_to_mid){const i=yield g.appMessagesManager.getMessageByPeer((null===(t=h.reply_to)||void 0===t?void 0:t.reply_to_peer_id)?(0,l.Z)(h.reply_to.reply_to_peer_id):h.peerId,h.reply_to_mid);i?(o=n?"Chat.Service.PaymentSentRecurringUsed":s?"Chat.Service.PaymentSentRecurringInit":"Chat.Service.PaymentSent1",u.push(k(Object.assign(Object.assign({},e),{message:i})).then((e=>(e instanceof HTMLElement&&e.classList.add("is-receipt-link"),e))))):g.appMessagesManager.fetchMessageReplyTo(h)}break}case"messageActionSetMessagesTTL":{u=[];const e=yield g.appPeersManager.isBroadcast(h.peerId);if(w.period){let t;if(e?o="ActionTTLChannelChanged":h.fromId===m.Z.myId?o="ActionTTLYouChanged":(o="ActionTTLChanged",u.push(v(h.fromId,i))),w.period>1814400){let e;const s=[],a=31536e3;w.period>=a?(e="Years",s.push(w.period/a|0)):(e="Months",s.push(w.period/(30*n.s2)|0)),t=i?c.ZP.format(e,!0,s):(0,c.ag)(e,s)}else t=(0,r.Z)(w.period,i);u.push(t)}else e?o="ActionTTLChannelDisabled":h.fromId===m.Z.myId?o="ActionTTLYouDisabled":(o="ActionTTLDisabled",u.push(v(h.fromId,i)));break}case"messageActionTopicEdit":{let t,s,n;const a=!!h.pFlags.out,r=void 0!==w.icon_emoji_id,d=r&&!+w.icon_emoji_id,l=void 0!==w.title,c=void 0!==w.hidden;a||(n=v(h.fromId,i)),l&&(s=T(w.title)),r&&!d&&(t=A(e)),u=n?[n]:[],w.closed?o=a?"Chat.Service.Group.TopicEdited.You.Paused":"Chat.Service.Group.TopicEdited.Paused":!1===w.closed?o=a?"Chat.Service.Group.TopicEdited.You.Resumed":"Chat.Service.Group.TopicEdited.Resumed":d&&l?(o=a?"Chat.Service.TopicEdited.You.Mixed.IconRemoved":"Chat.Service.TopicEdited.Mixed.IconRemoved",u.push(s)):r&&l?(o=a?"Chat.Service.TopicEdited.You.Mixed":"Chat.Service.TopicEdited.Mixed",u.push(_(e))):d?o=a?"Chat.Service.Group.TopicEdited.You.Icon.Removed":"Chat.Service.Group.TopicEdited.Icon.Removed":l?(o=a?"Chat.Service.Group.TopicEdited.You.Title":"Chat.Service.Group.TopicEdited.Title",u.push(s)):r?(o=a?"Chat.Service.Group.TopicEdited.You.Icon":"Chat.Service.Group.TopicEdited.Icon",u.push(t)):c&&(o=a?w.hidden?"Chat.Service.Group.TopicEdited.You.Hided":"Chat.Service.Group.TopicEdited.You.Unhided":w.hidden?"Chat.Service.Group.TopicEdited.Hided":"Chat.Service.Group.TopicEdited.Unhided");break}case"messageActionTopicCreate":u=[_(e)],o="TopicWasCreatedAction";break;default:o=c.Hz[p]||`[${w._}]`}o||(o=c.Hz[p],void 0===o&&(o="["+p+"]"));const b=u&&(yield Promise.all(u));return i?c.ZP.format(o,!0,b):(0,c.$d)(y,o,b)}}))}},496:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(8938),n=i(5705),a=i(677),o=i(3738),r=i(8456),d=i(5381),l=i(2325),c=i(1346),h=i(8115),u=i(2491),p=i(5400),f=i(3512),m=i(6239);function g(e){var t,i,g,v,b,y;return g=this,v=void 0,y=function*(){let{message:g,text:v,usingMids:b,plain:y,highlightWord:w,withoutMediaType:S}=e;null!=v||(v=g.message);const C=[];let L=!1;const E=(e,t)=>{if(e){if(void 0===t&&L)return;t=y?l.ZP.format(e,!0):(0,l.ag)(e)}if(y)C.push(t);else{const e=document.createElement("span");"string"==typeof t?e.innerHTML=t:e.append(t),C.push(e)}},I=f.Z.managers.appMessagesManager,M=(0,d.Z)(g);let P=null!==(t=g.totalEntities)&&void 0!==t?t:g.entities;if(g.media&&!M){(0,s.Z)(g);let e=!0;if(g.grouped_id){if(b){const t=yield I.getMidsByMessage(g);if(b.length===t.length){for(const i of t)if(!b.includes(i)){e=!1;break}}else e=!1}if(e){const e=yield I.getAlbumText(g.grouped_id);v=(null==e?void 0:e.message)||"",P=(null==e?void 0:e.totalEntities)||[],S||(E("AttachAlbum"),L=!0)}}else e=!1;if(!e&&!S||!v){const e=g.media;switch(e._){case"messageMediaPhoto":E("AttachPhoto");break;case"messageMediaDice":E(void 0,y?e.emoticon:(0,h.Z)(e.emoticon));break;case"messageMediaVenue":v=e.title,E("AttachLocation");break;case"messageMediaGeo":E("AttachLocation");break;case"messageMediaGeoLive":E("AttachLiveLocation");break;case"messageMediaPoll":const t="📊 "+(e.poll.question||"poll");E(void 0,y?t:(0,h.Z)(t));break;case"messageMediaContact":E("AttachContact");break;case"messageMediaGame":{const t="🎮 "+e.game.title;E(void 0,y?t:(0,h.Z)(t));break}case"messageMediaDocument":{const t=e.document;if("video"===t.type)E("AttachVideo");else if("voice"===t.type)E("AttachAudio");else if("gif"===t.type)E("AttachGif");else if("round"===t.type)E("AttachRound");else if("sticker"===t.type){const e=C.length;if(t.stickerEmojiRaw){const e=t.stickerEmojiRaw+" ";E(void 0,y?e:(0,h.Z)(e))}E("AttachSticker");const i=C.splice(e,2);if(y)C.push(i[0]+(i[1]?i[1]:""));else{const e=window.document.createElement("span");e.append(...i),C.push(e)}v=""}else if("audio"===t.type){const e=t.attributes.find((e=>"documentAttributeAudio"===e._&&(e.title||e.performer))),i="🎵 "+(e?[e.title,e.performer].filter(Boolean).join(" - "):t.file_name);E(void 0,y?i:(0,h.Z)(i))}else E(void 0,y?t.file_name:(0,h.Z)(t.file_name));break}case"messageMediaInvoice":"messageExtendedMediaPreview"===(null===(i=e.extended_media)||void 0===i?void 0:i._)?E(void 0,y?e.description:(0,h.Z)(e.description)):E(void 0,y?e.title:(0,h.Z)(e.title));break;case"messageMediaUnsupported":E(l.nK)}}const t=C.length;for(let e=1;e{"use strict";i.d(t,{Z:()=>n});var s=i(8842);function n(e){return t=this,i=void 0,a=function*(){const t=new s.Z;return yield t.update(e),t.element},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a}},9492:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(2830),n=i(4755),a=i(3512),o=i(3442),r=i(6705),d=i(8580),l=i(1713),c=i(7030),h=i(2312),u=i(3114),p=i(7660),f=i(319),m=i(1507),g=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function v({photo:e,message:t,container:i,boxWidth:b,boxHeight:y,withTail:w,isOut:S,lazyLoadQueue:C,middleware:L,size:E,withoutPreloader:I,loadPromises:M,autoDownloadSize:P,noBlur:Z,noThumb:k,noFadeIn:T,blurAfter:x,managers:A=a.Z.managers,processUrl:_}){return g(this,void 0,void 0,(function*(){const F={loadPromises:{thumb:Promise.resolve(),full:Promise.resolve()},images:{thumb:null,full:null},preloader:null,aspecter:null},D="document"===e._,R=D&&e.mime_type.startsWith("image/")&&!E,B=(0,u.Z)(e);if(!(e.sizes||e.thumbs||B||R))return b&&y&&!E&&D&&(0,l.Z)(e,i,b,y,void 0,t),F;let N=0===P;E||(void 0===b&&(b=n.Z.active.regular.width),void 0===y&&(y=n.Z.active.regular.height)),i.classList.add("media-container");let O,U,H,z=i,j=!0,G=Promise.resolve();if(b&&y&&!E){const s=(0,l.Z)(e,i,b,y,void 0,t,void 0,R?{_:"photoSize",w:e.w,h:e.h,size:e.size,type:m.Pt}:void 0);if(E=s.photoSize,j=s.isFit,U=yield A.thumbsStorage.getCacheContext(e,E.type),!j&&!B){z=document.createElement("div"),z.classList.add("media-container-aspecter"),z.style.width=s.size.width+"px",z.style.height=s.size.height+"px";const n=(0,d.Z)(e,U,!Z,!0);if(n){G=n.loadPromise;const e=n.image;e.classList.add("media-photo"),i.append(e)}else(yield v({container:i,message:t,photo:e,boxWidth:0,boxHeight:0,size:E,lazyLoadQueue:C,isOut:S,loadPromises:M,middleware:L,withoutPreloader:I,withTail:w,autoDownloadSize:P,noBlur:Z,noThumb:!0,blurAfter:!0,managers:A})).images.full.classList.add("media-photo","thumbnail");i.classList.add("media-container-fitted"),i.append(z)}}else E||(E=(0,c.Z)(e,b,y,!0)),U=yield A.thumbsStorage.getCacheContext(e,null==E?void 0:E.type);if(!k&&!B){const t=(0,d.Z)(e,U,!Z);t&&(G=Promise.all([G,t.loadPromise]),F.loadPromises.thumb=F.loadPromises.full=G,O=F.images.thumb=t.image,O.classList.add("media-photo"),z.append(O))}if(F.aspecter=z,"photoSizeEmpty"===(null==E?void 0:E._)&&D||(null==E?void 0:E.bytes))return F;"videoSize"===(null==E?void 0:E._)?(H=F.images.full=(0,p.Z)(),H.autoplay=!0,H.loop=!0,H.muted=!0,H.classList.add("media-photo")):(H=F.images.full=new Image,H.classList.add("media-photo"));const V=(O||!U.downloaded)&&a.Z.settings.animationsEnabled&&!T;let K;const W=null==t?void 0:t.uploadingFileName;I||(U.downloaded&&!W||(K=new o.Z({attachMethod:"prepend",isUpload:!!W})),W&&(K.attachPromise(h.Z.getUpload(W)),K.attach(i),N=void 0));const $=e=>(0,s.Z)(i,H,e,V,z,O),q=e=>g(this,void 0,void 0,(function*(){if(!L||L()){if(_&&(e=yield _(e)),x){const t=(0,r.Z)(e,12);return t.promise.then((()=>$(t.canvas.toDataURL())))}return $(e)}}));let Q;const Y=E.w>=150&&E.h>=150||N,X=()=>g(this,void 0,void 0,(function*(){N&&!I&&K&&(K.construct(),K.setManual());const t=(()=>{const t=R&&!E;return h.Z.downloadMediaURL({media:e,thumb:E,queueId:null==C?void 0:C.queueId,onlyCache:t?void 0:N})})(),s=yield A.thumbsStorage.getCacheContext(e,null==E?void 0:E.type);K&&!s.downloaded&&!I&&Y&&K.attach(i,!1,t),N=void 0;const n=t.then(q);return n.catch(f.Z),{download:t,render:n}}));return K&&K.setDownloadFunction(X),U.downloaded?G=Q=(yield X()).render:C?C.push({div:i,load:()=>X().then((({download:e})=>e))}):Q=(yield X()).render,M&&G&&M.push(G),yield G,F.loadPromises.thumb=G,F.loadPromises.full=Q||Promise.resolve(),F.preloader=K,F}))}},5671:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(2291),n=i(2325),a=i(3512),o=i(7362);function r(e){return t=this,i=void 0,d=function*(){const t=document.createElement("span");t.classList.add("sender-title");const i=e.fromId===a.Z.myId&&e.peerId!==a.Z.myId;if(t.append(i?(0,n.ag)("FromYou"):yield(0,o.Z)(Object.assign(Object.assign({},(0,s.Z)(e)),{dialog:e.peerId===a.Z.myId}))),(yield a.Z.managers.appPeersManager.isAnyGroup(e.peerId))||i){const i=yield(0,o.Z)({peerId:e.peerId});t.append(" ➝ ",i)}return t},new((r=void 0)||(r=Promise))((function(e,s){function n(e){try{o(d.next(e))}catch(e){s(e)}}function a(e){try{o(d.throw(e))}catch(e){s(e)}}function o(t){var i;t.done?e(t.value):(i=t.value,i instanceof r?i:new r((function(e){e(i)}))).then(n,a)}o((d=d.apply(t,i||[])).next())}));var t,i,r,d}},1604:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(632);function n(e){const t=document.createElement("span");return t.classList.add("sent-time"),t.append((0,s.zM)(new Date(1e3*e.date))),t}},3541:(e,t,i)=>{"use strict";i.d(t,{Vp:()=>F,ZP:()=>B,_2:()=>N,_i:()=>R});var s=i(5269),n=i(3725),a=i(3910),o=i(2738),r=i(7660),d=i(8497),l=i(6740),c=i(1046),h=i(1185),u=i(5471),p=i(9405),f=i(4755),m=i(925),g=i(3174),v=i(6724),b=i(9674),y=i(2312),w=i(4271),S=i(2790),C=i(7030),L=i(13),E=i(1447),I=i(3512),M=i(7730),P=i(671),Z=i(5814),k=i(6787),T=i(2796),x=i(6775),A=i(645),_=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const F=1.49,D={},R={};function B({doc:e,div:t,middleware:i,loadStickerMiddleware:d,lazyLoadQueue:m,exportLoad:v,group:w,play:S,onlyThumb:B,emoji:N,width:O,height:U,withThumb:H,loop:z,loadPromises:j,needFadeIn:G,needUpscale:V,skipRatio:K,static:W,managers:$=I.Z.managers,fullThumb:q,isOut:Q,noPremium:Y,withLock:X,relativeEffect:J,loopEffect:ee,isCustomEmoji:te,syncedVideo:ie}){var se;return _(this,void 0,void 0,(function*(){t=Array.isArray(t)?t:[t],te&&(N=e.stickerEmojiRaw);const ne=e.sticker;if(1===ne&&(W=!0),!O&&!U){const t=f.Z.active,i=N?t.emojiSticker:e.animated?t.animatedSticker:t.staticSticker,s=(0,p.C)(e.w,e.h).aspectFitted(i);O=s.width,U=s.height}let ae;2===ne&&E.Z.loadLottieWorkers(),t.forEach((t=>{t.dataset.docId=""+e.id,N&&(t.dataset.stickerEmoji=N),t.classList.add("media-sticker-wrapper")}));const oe=(t=(null==ae?void 0:ae.type))=>_(this,void 0,void 0,(function*(){return ae=yield $.thumbsStorage.getCacheContext(e,t)})),re=!W&&(2===ne||3===ne),de=(0,L.Z)(e);void 0!==Q&&de&&!Q&&t.forEach((e=>e.classList.add("reflect-x")));const le=de&&X;if(le){const i=D[e.id];t.forEach((e=>{e.classList.add("is-premium-sticker","tgico-premium_lock"),i&&e.style.setProperty("--lock-url",`url(${i})`)}))}if(W&&1!==ne){const t=(0,C.Z)(e,O,U,!1);yield oe(t.type)}else yield oe(null==q?void 0:q.type);const ce=N&&!te?(0,P.tB)(N):-1,he=ae.downloaded&&!G,ue=re,pe=2===ne||3===ne?yield $.appDocsManager.getLottieCachedThumb(e.id,ce):void 0,fe={render:void 0,load:void 0};let me=(0,n.Z)(),ge=!1;if(((null===(se=e.thumbs)||void 0===se?void 0:se.length)||pe)&&!t[0].firstElementChild&&(!he||ue||B)&&!1!==H){let n=pe||e.thumbs[0];const a=(e,t)=>{e.childElementCount?me.resolve():(t.classList.add("media-sticker","thumbnail"),b.Z.mutateElement(e,(()=>{e.append(t),me.resolve()})))};if("url"in n)ge=!0,t.forEach((e=>{const t=new Image;(0,l.ZP)(t,n.url,(()=>a(e,t)))}));else if("bytes"in n){if("photoPathSize"===n._){n.bytes.length||(n=e.thumbs.find((e=>{var t;return null===(t=e.bytes)||void 0===t?void 0:t.length}))||n);const i=function(e){let t="M";for(let i=0,s=e.length;i=192?t+="AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,"[s-128-64]:(s>=128?t+=",":s>=64&&(t+="-"),t+=""+(63&s))}return t+="z",t}(n.bytes),s="http://www.w3.org/2000/svg",a=document.createElementNS(s,"svg");a.classList.add("rlottie-vector","media-sticker","thumbnail"),a.setAttributeNS(null,"viewBox",`0 0 ${e.w||512} ${e.h||512}`);const o=document.createElementNS(s,"path");o.setAttributeNS(null,"d",i),I.Z.settings.animationsEnabled&&!te&&o.setAttributeNS(null,"fill","url(#g)"),a.append(o),t.forEach(((e,t)=>e.append(t>0?a.cloneNode(!0):a))),ge=!0,me.resolve()}else if(ce<=0){const o=()=>{t.forEach((t=>{const i=new Image,s=(0,h.Z)(e,n,!0);(0,l.ZP)(i,s,(()=>a(t,i)))}))};s.Z||e.pFlags.stickerThumbConverted||ae.url?(ge=!0,o()):(ge=!0,M.Z.convert("main-"+e.id,n.bytes).then((s=>{$.appDocsManager.saveWebPConvertedStrippedThumb(e.id,s),n.bytes=s,e.pFlags.stickerThumbConverted=!0,i&&!i()||t[0].childElementCount?me.resolve():o()})).catch((()=>me.resolve())))}}else if((2===ne&&ce<=0||3===ne)&&(H||B)){const s=()=>_(this,void 0,void 0,(function*(){if(t[0].childElementCount||i&&!i())return void me.resolve();const s=(e,t,s)=>{e.childElementCount||i&&!i()?me.resolve():s?(0,l.ZP)(t,s,(()=>a(e,t))):a(e,t)};yield oe(),t.forEach((t=>{if(ae.url)s(t,new Image,ae.url);else if("bytes"in n){const i=(0,c.Z)(e,n,!0);i.loadPromise.then((()=>s(t,i.image,"")))}else y.Z.downloadMediaURL({media:e,thumb:n}).then((e=>_(this,void 0,void 0,(function*(){return s(t,new Image,e)}))))}))}));if(m&&B)return m.push({div:t[0],load:s}),me.resolve(),fe;s(),n.url&&(ge=!0)}}if(j&&ge&&j.push(me),B)return fe;const ve=(0,u.Z)("MIDDLEWARE"),be=()=>_(this,void 0,void 0,(function*(){if(i&&!i())throw ve;if(2===ne&&!W)return y.Z.downloadMedia({media:e,queueId:null==m?void 0:m.queueId,thumb:q}).then((s=>_(this,void 0,void 0,(function*(){if(i&&!i())throw ve;const n=yield E.Z.loadAnimationWorker({container:t[0],loop:!(N&&!te)&&z,autoplay:S,animationData:s,width:O,height:U,name:"doc"+e.id,needUpscale:V,skipRatio:K,toneIndex:ce,sync:te},w,null!=d?d:i),a=le?()=>{var i,s;const a=null!==(i=D[s=e.id])&&void 0!==i?i:D[s]=function(e){var t;const i=e.getContext("2d"),s=20*(null!==(t=e.dpr)&&void 0!==t?t:1),n=s,a=s,o=(e.width-n)/2,r=e.height-a-0,d=i.getImageData(o,r,n,a).data;let l=0,c=0,h=0,u=0;for(let e=0;ee.style.setProperty("--lock-url",`url(${a})`)))}:void 0;return n.addEventListener("firstFrame",(()=>{const i=n.canvas[0];(!1!==H||te)&&(0,g.O)(e,i,ce),le&&a(),te||t.forEach(((e,t)=>{((e,t)=>{const i=e.firstElementChild;!1!==G&&(G=(G||!i||"svg"===i.tagName)&&I.Z.settings.animationsEnabled);const s=()=>{i&&i!==t&&"DIV"!==i.tagName&&i.remove()};G?b.Z.mutate((()=>{t&&t.classList.add("fade-in"),i&&i.classList.add("fade-out"),(t||i).addEventListener("animationend",(()=>{b.Z.mutate((()=>{t&&t.classList.remove("fade-in"),s()}))}),{once:!0})})):i&&b.Z.mutate(s)})(e,n.canvas[t])}))}),{once:!0}),N&&$.appStickersManager.preloadAnimatedEmojiStickerAnimation(N),n}))));if(W||3===ne){const s=re&&ie,n=s?A.Z.generateName(""+e.id,0,0,void 0,void 0):void 0,a=R[n];if(a)return a;const o=(s?t.slice(0,1):t).map((()=>{let e;if(W)e=new Image;else{const t=e=(0,r.Z)();if(t.muted=!0,S&&(t.autoplay=!0),z&&(t.loop=!0),z&&"number"==typeof z){let i=0,s=0;function n(){i>this.currentTime&&++s===z&&(this.autoplay=!1,this.loop=!1,this.pause(),t.removeEventListener("timeupdate",n)),i=this.currentTime}t.addEventListener("timeupdate",n)}}return e.classList.add("media-sticker"),e})),c=t.map(((e,t)=>e.firstElementChild!==o[t]&&e.firstElementChild));!1!==G&&(G=(G||!he||(W?c[0]:!c[0]||"svg"===c[0].tagName))&&I.Z.settings.animationsEnabled),G&&o.forEach((e=>e.classList.add("fade-in")));const h=new Promise(((n,a)=>_(this,void 0,void 0,(function*(){const r=()=>_(this,void 0,void 0,(function*(){if(i&&!i())return void a(ve);const r=o.length,d=[];let h;yield oe(),t.forEach(((t,u)=>{const p=o[u];p&&(h=(0,l.cj)(p,ae.url)),h.then((()=>((t,o,l)=>{b.Z.mutateElement(t,(()=>{if(!i||i())if(o){if(o){const t=O*window.devicePixelRatio,i=U*window.devicePixelRatio;if(!(0,g.k)(e,ce,t,i)){const s=document.createElement("canvas");s.width=t,s.height=i,s.getContext("2d").drawImage(o,0,0,s.width,s.height),(0,g.O)(e,s,ce)}}s?n(o):(t.append(o),G?(l&&l.classList.add("fade-out"),o.addEventListener("animationend",(()=>{o.classList.remove("fade-in"),null==l||l.remove()}),{once:!0})):null==l||l.remove(),re&&Z.Z.addAnimation(o,w),d.push(o)===r&&n(d))}else s&&re||null==l||l.remove();else a(ve)}))})(t,p,c[u])))}))}));if(yield oe(),ae.url)r();else{let t;if(1!==ne&&W){const i=(0,C.Z)(e,O,U,!1);t=y.Z.downloadMediaURL({media:e,thumb:i,queueId:null==m?void 0:m.queueId})}else t=y.Z.downloadMediaURL({media:e,queueId:null==m?void 0:m.queueId});t.then(r,a)}}))));return n&&(R[n]=h,d&&h.finally((()=>{d()||delete R[n]}))),h}}));if(v&&(1===v&&(!he||re)||2===v))return fe.load=be,fe;const ye=!m||he&&!re?be():(m.push({div:t[0],load:be}),Promise.resolve());return he&&W&&(me=ye,j&&j.push(me)),2===ne&&de&&void 0!==Q&&!Y&&function({container:e,doc:t,managers:i,middleware:s,isOut:n,width:r,loadPromise:d,relativeEffect:l,loopEffect:c}){i.appStickersManager.preloadSticker(t.id,!0);let h=!1;(0,o.fc)(e,(i=>_(this,void 0,void 0,(function*(){if((0,a.Z)(i),h){const e=document.createElement("a");return e.onclick=()=>{(0,T.PE)(),new k.Z(t.stickerSetInput).show()},void(0,T.bC)({langPackKey:"Sticker.Premium.Click.Info",langPackArguments:[e]})}h=!0,yield d;const{animationDiv:o,stickerPromise:u}=(0,x.Z)({doc:t,middleware:s,side:n?"right":"left",size:r*F,target:e,play:!0,fullThumb:(0,L.Z)(t),relativeEffect:l,loopEffect:c});void 0===n||n||o.classList.add("reflect-x"),u.then((e=>{e.addEventListener("destroy",(()=>{h=!1}))}))}))))}({container:t[0],doc:e,managers:$,middleware:i,isOut:Q,width:O,loadPromise:ye,relativeEffect:J,loopEffect:ee}),fe.render=ye,fe}))}function N({event:e,container:t,managers:i,peerId:s,middleware:n}){var o,r;return _(this,void 0,void 0,(function*(){(0,a.Z)(e);const l=(0,d.Z)(t,"bubble"),c=t.dataset.stickerEmoji,h=t.classList.contains("custom-emoji")?void 0:E.Z.getAnimation(t);if(null==h?void 0:h.paused){const e=yield i.appStickersManager.getAnimatedEmojiSoundDocument(c);if(e){const i=document.createElement("audio");i.style.display="none",t.parentElement.append(i);try{const t=yield y.Z.downloadMediaURL({media:e});i.src=t,i.play(),yield(0,m.Z)(i,void 0,!0),i.addEventListener("ended",(()=>{i.src="",i.remove()}),{once:!0})}catch(e){}}h.autoplay=!0,h.restart()}if(!s.isUser())return;const u=yield i.appStickersManager.getAnimatedEmojiSticker(c,!0);if(!u)return;const p=null!==(o=(r=t).emojiData)&&void 0!==o?o:r.emojiData={a:[],v:1},f=t.sendInteractionThrottled=(0,v.Z)((()=>{if(!p.a.length)return;const e=p.a[0].t;p.a.forEach((t=>{t.t=(t.t-e)/1e3}));const s=(0,d.Z)(t,"bubble");i.appMessagesManager.setTyping(w.Z.chat.peerId,{_:"sendMessageEmojiInteraction",msg_id:(0,S.Z)(+s.dataset.mid),emoticon:c,interaction:{_:"dataJSON",data:JSON.stringify(p)}},!0,w.Z.chat.threadId),p.a.length=0}),1e3,!1),g=l?l.classList.contains("is-out"):void 0,{animationDiv:b}=(0,x.Z)({doc:u,middleware:n,side:g?"right":"left",size:360,target:t,play:!0,withRandomOffset:!0});void 0===g||g||b.classList.add("reflect-x"),e.isTrusted&&(p.a.push({i:1,t:Date.now()}),f())}))}},6775:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u});var s=i(2131),n=i(8938),a=i(8487),o=i(5471),r=i(3624),d=i(9966),l=i(241),c=i(4271),h=i(3541);function u({size:e,doc:t,middleware:i,target:u,side:p,skipRatio:f,play:m,managers:g,fullThumb:v,withRandomOffset:b,relativeEffect:y,loopEffect:w}){var S;const C=document.createElement("div");let L;C.classList.add("emoji-animation"),C.style.width=e+"px",C.style.height=e+"px";const E=()=>{I.clean(),null==L||L.remove(),C.remove(),c.Z.chat.bubbles.scrollable.container.removeEventListener("scroll",x)},I=null!==(S=null==i?void 0:i.create())&&void 0!==S?S:(0,r.k)();i=I.get();const M=(0,h.ZP)({div:C,doc:t,middleware:i,withThumb:!1,needFadeIn:!1,loop:!!w,width:e,height:e,play:m,group:"none",skipRatio:f,managers:g,fullThumb:v}).then((({render:e})=>e)).then((e=>{if((0,n.Z)(e),!i())throw e.remove(),(0,o.Z)("MIDDLEWARE");return L=e,L.addEventListener("enterFrame",(e=>{(w||e!==L.maxFrame)&&(0,a.Z)(u)||E()})),s.Z&&L.addEventListener("firstFrame",(()=>{navigator.vibrate(100)}),{once:!0}),L})),P=e=>{const t=Math.random()*e*2;return t>e?-t%e:t},Z=b?P(16):0,k=b?P(4):0,T=()=>{if(!(0,a.Z)(u))return void E();const t=u.getBoundingClientRect(),i=t.width/200,s="center"===p?0:16*("right"===p?1:-1)*i,n="center"===p?0:0*i,o="right"===p?t.right:t.left,r=t.top,d=("center"===p?(t.width-e)/2:"right"===p?-e:0)+s+Z,c=(t.height-e)/2+n+k,h=o+d,f=r+c;f<=-e||f>=l.Z.height?E():y?("center"!==p?C.style[p]=-1*Math.abs(s)+"px":C.style.left=d+"px",C.style.top=c+"px"):(C.style.top=f+"px",C.style.left=h+"px")},x=(0,d.Z)(T);return c.Z.chat.bubbles.scrollable.container.addEventListener("scroll",x),T(),y?(C.classList.add("is-relative"),u.parentElement.append(C)):c.Z.emojiAnimationContainer.append(C),{animationDiv:C,stickerPromise:M}}},5772:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(3541);function a({emoji:e,div:t,width:i,height:a,managers:o=s.Z.managers}){return r=this,d=void 0,c=function*(){const s=yield o.appStickersManager.getAnimatedEmojiSticker(e);if(!s)throw t.classList.add("media-sticker-wrapper"),new Error("no sticker");return(0,n.ZP)({doc:s,div:t,emoji:e,width:i,height:a,loop:!1,play:!0})},new((l=void 0)||(l=Promise))((function(e,t){function i(e){try{n(c.next(e))}catch(e){t(e)}}function s(e){try{n(c.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof l?n:new l((function(e){e(n)}))).then(i,s)}n((c=c.apply(r,d||[])).next())}));var r,d,l,c}},1273:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(7660),n=i(6740),a=i(2312),o=i(1447),r=i(3512),d=i(5814),l=i(3541),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function h({set:e,lazyLoadQueue:t,container:i,group:h,autoplay:u,width:p,height:f,managers:m=r.Z.managers}){var g;return c(this,void 0,void 0,(function*(){if(null===(g=e.thumbs)||void 0===g?void 0:g.length)return i.classList.add("media-sticker-wrapper"),void t.push({div:i,load:()=>c(this,void 0,void 0,(function*(){const t=yield m.appStickersManager.getStickerSetThumbDownloadOptions(e),r=a.Z.download(t);if(e.pFlags.animated&&!e.pFlags.videos)return r.then((t=>{o.Z.loadAnimationWorker({container:i,loop:!0,autoplay:u,animationData:t,width:p,height:f,needUpscale:!0,name:"setThumb"+e.id},h)}));{let t;return e.pFlags.videos?(t=(0,s.Z)(),t.autoplay=!0,t.muted=!0,t.loop=!0):t=new Image,t.classList.add("media-sticker"),r.then((s=>{(0,n.ZP)(t,URL.createObjectURL(s),(()=>{i.append(t),e.pFlags.videos&&d.Z.addAnimation(t,h)}))}))}}))});let r;r=e.thumb_document_id?m.appEmojiManager.getCustomEmojiDocument(e.thumb_document_id):m.appStickersManager.getStickerSet(e).then((e=>e.documents[0]));const v=yield r;"documentEmpty"!==v._&&(0,l.ZP)({doc:v,div:i,group:h,lazyLoadQueue:t,managers:m,width:p,height:f})}))}},62:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3541);function n({doc:e,row:t,size:i,managers:n}){const a=t.media,o=t.createMedia("small");a&&o.classList.add("hide");const r=a?[]:void 0,d="small"===i?32:48,l=(0,s.ZP)({div:o,doc:e,width:d,height:d,loadPromises:r,managers:n}).then((({render:e})=>e));return r&&Promise.all(r).then((()=>{o.classList.remove("hide"),a.remove()})),l}},9102:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(2790),n=i(4497),a=i(7362);function o(e){return t=this,i=void 0,r=function*(){const{peerId:t,threadId:i,lastMsgId:o}=e,r=Promise.resolve(),d=(0,n.Z)("t.me/c/"+t.toChatId()+(i?"/"+(0,s.Z)(i):"")+(o?"/"+(0,s.Z)(o):""));return d.classList.add("topic-name","topic-name-button"),d.append(yield(0,a.Z)(e)),{cached:!0,element:d,loadPromise:r}},new((o=void 0)||(o=Promise))((function(e,s){function n(e){try{d(r.next(e))}catch(e){s(e)}}function a(e){try{d(r.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,a)}d((r=r.apply(t,i||[])).next())}));var t,i,o,r}},2887:(e,t,i)=>{"use strict";i.d(t,{Z:()=>x});var s=i(4762),n=i(5296),a=i(3725),o=i(3910),r=i(2738),d=i(7660),l=i(8487),c=i(6740),h=i(8580),u=i(5471),p=i(4755),f=i(319),m=i(925),g=i(3035),v=i(6724),b=i(9674),y=i(5157),w=i(2312),S=i(4271),C=i(1507),L=i(3512),E=i(5814),I=i(3013),M=i(8448),P=i(3442),Z=i(9492),k=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let T=0;function x({doc:e,container:t,message:i,boxWidth:x,boxHeight:A,withTail:_,isOut:F,middleware:D,lazyLoadQueue:R,noInfo:B,group:N,onlyPreview:O,noPreview:U,withoutPreloader:H,loadPromises:z,noPlayButton:j,photoSize:G,videoSize:V,searchContext:K,autoDownload:W,managers:$=L.Z.managers,noAutoplayAttribute:q}){var Q;return k(this,void 0,void 0,(function*(){const Y=null==W?void 0:W.video;let X=0===Y;const J=!(x&&A),ee=("video"!==e.type||e.size<=52428800&&!J)&&("gif"===e.type?L.Z.settings.autoPlay.gifs:L.Z.settings.autoPlay.videos);let te,ie;if(!B){te=document.createElement("span"),te.classList.add("video-time"),t.append(te);let i=!1;"gif"!==e.type?(te.innerText=(0,y.Z)(e.duration,!1),j||"round"===e.type||(ee&&!X?te.classList.add("tgico","can-autoplay"):i=!0)):(te.innerText="GIF",ee||j||(i=!0,X=void 0)),i&&(ie=document.createElement("span"),ie.classList.add("video-play","tgico-largeplay","btn-circle","position-center"),t.append(ie))}const se={};if("image/gif"===e.mime_type){const s=yield(0,Z.Z)({photo:e,message:i,container:t,boxWidth:x,boxHeight:A,withTail:_,isOut:F,lazyLoadQueue:R,middleware:D,withoutPreloader:H,loadPromises:z,autoDownloadSize:Y,size:G,managers:$});return se.thumb=s,se.loadPromise=s.loadPromises.full,se}let ne;const ae=(0,d.Z)();if(ae.classList.add("media-video"),ae.muted=!0,"round"===e.type){const s=document.createElement("div");s.classList.add("media-round","z-depth-1"),s.dataset.mid=""+i.mid,s.dataset.peerId=""+i.peerId,s.message=i;const a=p.Z.active.round,d=a.width/2,c=3.5,h=d-2*c;s.innerHTML=`\n \n `;const u=s.firstElementChild.firstElementChild;T||(T=2*Math.PI*h),u.style.strokeDasharray=T+" "+T,u.style.strokeDashoffset=""+T,te.classList.add("tgico"),i.pFlags.media_unread&&s.classList.add("is-unread");const f=document.createElement("canvas");f.width=f.height=e.w,s.prepend(f,te),s.append(ae),t.append(s);const m=f.getContext("2d"),b=()=>{const e=s.message,t=I.Z.addMedia(e,!X),i=()=>{(S.Z.chat.setPeerPromise||Promise.resolve()).finally((()=>{(0,l.Z)(t)||(t.removeEventListener("play",h),t.removeEventListener("timeupdate",c),t.removeEventListener("pause",p),t.removeEventListener("ended",b))}))},a=()=>{m.drawImage(t,0,0);const e=T-t.currentTime/t.duration*T;return u.style.strokeDashoffset=""+e,!t.paused},d=()=>{t.duration&&((0,l.Z)(t)?(t.paused&&a(),te.innerText=(0,y.Z)(t.duration-t.currentTime,!1)):i())},c=(0,v.Z)((()=>{(0,g.T2)(d)}),1e3,!1),h=()=>{ae.classList.add("hide"),s.classList.remove("is-paused"),(0,n.cK)(a,f),ne&&ne.preloader&&ne.preloader.classList.contains("manual")&&ne.onClick()},p=()=>{(0,l.Z)(t)?s.classList.add("is-paused"):i()},b=()=>{ae.classList.remove("hide"),s.classList.add("is-paused"),ae.currentTime=0,te.innerText=(0,y.Z)(t.duration,!1),t.currentTime&&(t.currentTime=0)};t.addEventListener("play",h),t.addEventListener("timeupdate",c),t.addEventListener("pause",p),t.addEventListener("ended",b),(0,r.fc)(f,(i=>{if((0,o.Z)(i),ne&&!ne.detached&&ne.onClick(),t.paused){const i=!!K;if(I.Z.setSearchContext(K||{peerId:C.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,n]=i?(0,M.ns)(s,e.mid):[];I.Z.setTargets({peerId:e.peerId,mid:e.mid},t,n)}t.play()}else t.pause()})),t.paused?t.duration&&t.currentTime!==t.duration&&t.currentTime>0?(a(),d(),ae.classList.add("hide")):p():h()};i.pFlags.is_outgoing?(s.onLoad=b,s.dataset.isOutgoing="1"):b()}else q||(ae.autoplay=!0);let oe,re;if(i){if(oe=yield(0,Z.Z)({photo:e,message:i,container:t,boxWidth:x,boxHeight:A,withTail:_,isOut:F,lazyLoadQueue:R,middleware:D,withoutPreloader:!0,loadPromises:z,autoDownloadSize:null==W?void 0:W.photo,size:G,managers:$}),se.thumb=oe,!ee&&"gif"!==e.type||O)return se.loadPromise=oe.loadPromises.full,se;if(_){const e=(oe.images.thumb||oe.images.full).parentElement;ae.width=+e.getAttributeNS(null,"width"),ae.height=+e.getAttributeNS(null,"height"),e.append(ae)}}else if(!U){const i=(0,h.Z)(e,{},!0);if(i){const e=i.image;e.classList.add("media-poster"),t.append(e),se.thumb={loadPromises:{thumb:i.loadPromise,full:Promise.resolve()},images:{thumb:e,full:null},preloader:null,aspecter:null},null==z||z.push(i.loadPromise),se.loadPromise=i.loadPromise}}if(O)return se;!ae.parentElement&&t&&((null==oe?void 0:oe.aspecter)||t).append(ae);const de=()=>k(this,void 0,void 0,(function*(){return re=yield $.thumbsStorage.getCacheContext(e,null==V?void 0:V.type)}));yield de();const le=null==i?void 0:i.uploadingFileName;le?(ne=new P.Z({attachMethod:"prepend",isUpload:!0}),ne.attachPromise(w.Z.getUpload(le)),ne.attach(t,!1),X=void 0):re.downloaded||e.supportsStreaming||H?e.supportsStreaming&&(ne=new P.Z({cancelable:!1,attachMethod:"prepend"})):ne=new P.Z({attachMethod:"prepend"});const ce=(0,a.Z)();if(ae.addEventListener("error",(e=>{4!==ae.error.code&&console.error("Error "+ae.error.code+"; details: "+ae.error.message),ne&&!le&&ne.detach(),ce.isFulfilled||ce.resolve()}),{once:!0}),"video"===e.type){const e=()=>{ae.duration&&(te.innerText=(0,y.Z)(ae.duration-ae.currentTime,!1))},t=(0,v.Z)((()=>{(0,g.T2)(e)}),1e3,!1);ae.addEventListener("timeupdate",t),ie&&ae.addEventListener("timeupdate",(()=>{b.Z.mutateElement(ie,(()=>{ie.remove()}))}),{once:!0})}ae.muted=!0,ae.loop=!0,q||(ae.autoplay=!0);let he=X&&(null===(Q=null==oe?void 0:oe.preloader)||void 0===Q?void 0:Q.loadFunc);const ue=()=>k(this,void 0,void 0,(function*(){ne&&X&&!H&&(ne.construct(),ne.setManual()),yield de();let n=Promise.resolve();if(ne&&!le||H)if(re.downloaded||e.supportsStreaming)e.supportsStreaming&&(X?n=Promise.reject((0,u.Z)("NO_AUTO_DOWNLOAD")):!re.downloaded&&ne&&(ne.attach(t,!1,null),ae.addEventListener(s.IS_SAFARI?"timeupdate":"canplay",(()=>{ne.detach()}),{once:!0})));else{const i=n=w.Z.downloadMediaURL({media:e,queueId:null==R?void 0:R.queueId,onlyCache:X,thumb:V});ne&&ne.attach(t,!1,i)}return!X&&he&&(he(),he=null),X=void 0,n.then((()=>k(this,void 0,void 0,(function*(){!D||D()?("round"===e.type&&I.Z.resolveWaitingForLoadMedia(i.peerId,i.mid,i.pFlags.is_scheduled),yield de(),(0,m.Z)(ae).then((()=>{N&&E.Z.addAnimation(ae,N),ne&&!le&&ne.detach(),ce.resolve()}),(e=>{console.error("video load error",e),te&&te.classList.add("is-error"),ce.reject(e)})),(0,c.ZP)(ae,re.url)):ce.resolve()}))),f.Z),{download:n,render:Promise.all([n,ce])}}));return ne&&!le&&ne.setDownloadFunction(ue),"gif"!==e.type||ee?se.loadPromise=R?(R.push({div:t,load:()=>ue().then((({render:e})=>e))}),Promise.resolve()):(yield ue()).render:(0,r.fc)(t,(e=>{(0,o.Z)(e),ie.remove(),ue()}),{capture:!0,once:!0}),se.thumb&&(yield se.thumb.loadPromises.thumb),se}))}p.Z.addEventListener("changeScreen",((e,t)=>{if(t===p._.mobile||e===p._.mobile){const e=Array.from(document.querySelectorAll(".media-round .progress-ring")),t=p.Z.active.round.width,i=t/2,s=i-7;T=2*Math.PI*s,e.forEach((e=>{e.setAttributeNS(null,"width",""+t),e.setAttributeNS(null,"height",""+t);const n=e.firstElementChild;n.setAttributeNS(null,"cx",""+i),n.setAttributeNS(null,"cy",""+i),n.setAttributeNS(null,"r",""+s),n.style.strokeDasharray=T+" "+T,n.style.strokeDashoffset=""+T}))}}))},2498:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8456),n=i(5400);function a(e){const t=(0,s.Z)(e.description||"",150,180);return(0,n.ZP)(t)}},1336:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8456),n=i(5400);function a(e){let t=e.title||e.author||e.site_name||"";return t=(0,s.Z)(t,80,100),(0,n.ZP)(t,{noLinks:!0,noLinebreaks:!0})}},7445:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s={AED:{code:"AED",title:"United Arab Emirates Dirham",symbol:"AED",native:"د.إ.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"367",max_amount:"3673030"},AFN:{code:"AFN",title:"Afghan Afghani",symbol:"AFN",native:"؋",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"8729",max_amount:"87299487"},ALL:{code:"ALL",title:"Albanian Lek",symbol:"ALL",native:"Lek",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!1,exp:2,min_amount:"11842",max_amount:"118421187"},AMD:{code:"AMD",title:"Armenian Dram",symbol:"AMD",native:"դր.",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"40943",max_amount:"409436718"},ARS:{code:"ARS",title:"Argentine Peso",symbol:"ARS",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"14705",max_amount:"147059002"},AUD:{code:"AUD",title:"Australian Dollar",symbol:"AU$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"153",max_amount:"1536825"},AZN:{code:"AZN",title:"Azerbaijani Manat",symbol:"AZN",native:"ман.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"169",max_amount:"1699858"},BAM:{code:"BAM",title:"Bosnia & Herzegovina Convertible Mark",symbol:"BAM",native:"KM",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"199",max_amount:"1990677"},BDT:{code:"BDT",title:"Bangladeshi Taka",symbol:"BDT",native:"৳",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"10009",max_amount:"100094046"},BGN:{code:"BGN",title:"Bulgarian Lev",symbol:"BGN",native:"лв.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"199",max_amount:"1993315"},BND:{code:"BND",title:"Brunei Dollar",symbol:"BND",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"142",max_amount:"1421883"},BOB:{code:"BOB",title:"Bolivian Boliviano",symbol:"BOB",native:"Bs",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"683",max_amount:"6832607"},BRL:{code:"BRL",title:"Brazilian Real",symbol:"R$",native:"R$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"539",max_amount:"5397799"},BYN:{code:"BYN",title:"Belarusian ruble",symbol:"BYN",native:"BYN",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"249",max_amount:"2495801"},CAD:{code:"CAD",title:"Canadian Dollar",symbol:"CA$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"136",max_amount:"1366860"},CHF:{code:"CHF",title:"Swiss Franc",symbol:"CHF",native:"CHF",thousands_sep:"'",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"97",max_amount:"976705"},CLP:{code:"CLP",title:"Chilean Peso",symbol:"CLP",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:0,min_amount:"963",max_amount:"9637495"},CNY:{code:"CNY",title:"Chinese Renminbi Yuan",symbol:"CN¥",native:"CN¥",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"709",max_amount:"7094102"},COP:{code:"COP",title:"Colombian Peso",symbol:"COP",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"452870",max_amount:"4528700000"},CRC:{code:"CRC",title:"Costa Rican Colón",symbol:"CRC",native:"₡",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"62506",max_amount:"625061070"},CZK:{code:"CZK",title:"Czech Koruna",symbol:"CZK",native:"Kč",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"2497",max_amount:"24975029"},DKK:{code:"DKK",title:"Danish Krone",symbol:"DKK",native:"kr",thousands_sep:"",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"755",max_amount:"7555990"},DOP:{code:"DOP",title:"Dominican Peso",symbol:"DOP",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5275",max_amount:"52757308"},DZD:{code:"DZD",title:"Algerian Dinar",symbol:"DZD",native:"د.ج.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"14035",max_amount:"140353307"},EGP:{code:"EGP",title:"Egyptian Pound",symbol:"EGP",native:"ج.م.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1953",max_amount:"19537405"},ETB:{code:"ETB",title:"Ethiopian Birr",symbol:"ETB",native:"ብር",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5224",max_amount:"52247069"},EUR:{code:"EUR",title:"Euro",symbol:"€",native:"€",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"101",max_amount:"1016045"},GBP:{code:"GBP",title:"British Pound",symbol:"£",native:"£",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"89",max_amount:"894445"},GEL:{code:"GEL",title:"Georgian Lari",symbol:"GEL",native:"GEL",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"283",max_amount:"2830234"},GTQ:{code:"GTQ",title:"Guatemalan Quetzal",symbol:"GTQ",native:"Q",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"778",max_amount:"7781323"},HKD:{code:"HKD",title:"Hong Kong Dollar",symbol:"HK$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"784",max_amount:"7849750"},HNL:{code:"HNL",title:"Honduran Lempira",symbol:"HNL",native:"L",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"2441",max_amount:"24413729"},HRK:{code:"HRK",title:"Croatian Kuna",symbol:"HRK",native:"kn",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"764",max_amount:"7648805"},HUF:{code:"HUF",title:"Hungarian Forint",symbol:"HUF",native:"Ft",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"42685",max_amount:"426850229"},IDR:{code:"IDR",title:"Indonesian Rupiah",symbol:"IDR",native:"Rp",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"1523370",max_amount:"15233700000"},ILS:{code:"ILS",title:"Israeli New Sheqel",symbol:"₪",native:"₪",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"354",max_amount:"3543350"},INR:{code:"INR",title:"Indian Rupee",symbol:"₹",native:"₹",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"8155",max_amount:"81555550"},ISK:{code:"ISK",title:"Icelandic Króna",symbol:"ISK",native:"kr",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:0,min_amount:"142",max_amount:"1425603"},JMD:{code:"JMD",title:"Jamaican Dollar",symbol:"JMD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"15013",max_amount:"150131044"},JPY:{code:"JPY",title:"Japanese Yen",symbol:"¥",native:"¥",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"144",max_amount:"1443065"},KES:{code:"KES",title:"Kenyan Shilling",symbol:"KES",native:"Ksh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"12075",max_amount:"120750271"},KGS:{code:"KGS",title:"Kyrgyzstani Som",symbol:"KGS",native:"KGS",thousands_sep:" ",decimal_sep:"-",symbol_left:!1,space_between:!0,exp:2,min_amount:"8018",max_amount:"80182898"},KRW:{code:"KRW",title:"South Korean Won",symbol:"₩",native:"₩",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"1431",max_amount:"14315201"},KZT:{code:"KZT",title:"Kazakhstani Tenge",symbol:"KZT",native:"₸",thousands_sep:" ",decimal_sep:"-",symbol_left:!0,space_between:!1,exp:2,min_amount:"47186",max_amount:"471867112"},LBP:{code:"LBP",title:"Lebanese Pound",symbol:"LBP",native:"ل.ل.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"150999",max_amount:"1509998778"},LKR:{code:"LKR",title:"Sri Lankan Rupee",symbol:"LKR",native:"රු.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"35546",max_amount:"355469651"},MAD:{code:"MAD",title:"Moroccan Dirham",symbol:"MAD",native:"د.م.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1093",max_amount:"10938136"},MDL:{code:"MDL",title:"Moldovan Leu",symbol:"MDL",native:"MDL",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"1926",max_amount:"19264439"},MNT:{code:"MNT",title:"Mongolian Tögrög",symbol:"MNT",native:"MNT",thousands_sep:" ",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"322444",max_amount:"3224442056"},MUR:{code:"MUR",title:"Mauritian Rupee",symbol:"MUR",native:"MUR",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"4453",max_amount:"44535174"},MVR:{code:"MVR",title:"Maldivian Rufiyaa",symbol:"MVR",native:"MVR",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"1546",max_amount:"15460397"},MXN:{code:"MXN",title:"Mexican Peso",symbol:"MX$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"2012",max_amount:"20122860"},MYR:{code:"MYR",title:"Malaysian Ringgit",symbol:"MYR",native:"RM",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"463",max_amount:"4632502"},MZN:{code:"MZN",title:"Mozambican Metical",symbol:"MZN",native:"MTn",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"6382",max_amount:"63829729"},NGN:{code:"NGN",title:"Nigerian Naira",symbol:"NGN",native:"₦",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"43203",max_amount:"432039828"},NIO:{code:"NIO",title:"Nicaraguan Córdoba",symbol:"NIO",native:"C$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"3556",max_amount:"35566412"},NOK:{code:"NOK",title:"Norwegian Krone",symbol:"NOK",native:"kr",thousands_sep:" ",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"1069",max_amount:"10690975"},NPR:{code:"NPR",title:"Nepalese Rupee",symbol:"NPR",native:"नेरू",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"12954",max_amount:"129546657"},NZD:{code:"NZD",title:"New Zealand Dollar",symbol:"NZ$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"174",max_amount:"1746220"},PAB:{code:"PAB",title:"Panamanian Balboa",symbol:"PAB",native:"B/.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"98",max_amount:"988722"},PEN:{code:"PEN",title:"Peruvian Nuevo Sol",symbol:"PEN",native:"S/.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"390",max_amount:"3902208"},PHP:{code:"PHP",title:"Philippine Peso",symbol:"PHP",native:"₱",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5862",max_amount:"58627496"},PKR:{code:"PKR",title:"Pakistani Rupee",symbol:"PKR",native:"₨",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"22642",max_amount:"226426805"},PLN:{code:"PLN",title:"Polish Złoty",symbol:"PLN",native:"zł",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"493",max_amount:"4932350"},PYG:{code:"PYG",title:"Paraguayan Guaraní",symbol:"PYG",native:"₲",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:0,min_amount:"6977",max_amount:"69772317"},QAR:{code:"QAR",title:"Qatari Riyal",symbol:"QAR",native:"ر.ق.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"364",max_amount:"3640989"},RON:{code:"RON",title:"Romanian Leu",symbol:"RON",native:"RON",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"502",max_amount:"5028645"},RSD:{code:"RSD",title:"Serbian Dinar",symbol:"RSD",native:"дин.",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"11918",max_amount:"119184990"},RUB:{code:"RUB",title:"Russian Ruble",symbol:"RUB",native:"₽",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"7128",max_amount:"71281218"},SAR:{code:"SAR",title:"Saudi Riyal",symbol:"SAR",native:"ر.س.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"375",max_amount:"3756546"},SEK:{code:"SEK",title:"Swedish Krona",symbol:"SEK",native:"kr",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1109",max_amount:"11094972"},SGD:{code:"SGD",title:"Singapore Dollar",symbol:"SGD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"143",max_amount:"1430495"},THB:{code:"THB",title:"Thai Baht",symbol:"฿",native:"฿",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"3780",max_amount:"37800497"},TJS:{code:"TJS",title:"Tajikistani Somoni",symbol:"TJS",native:"TJS",thousands_sep:" ",decimal_sep:";",symbol_left:!1,space_between:!0,exp:2,min_amount:"975",max_amount:"9753854"},TRY:{code:"TRY",title:"Turkish Lira",symbol:"TRY",native:"TL",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1854",max_amount:"18543598"},TTD:{code:"TTD",title:"Trinidad and Tobago Dollar",symbol:"TTD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"672",max_amount:"6722681"},TWD:{code:"TWD",title:"New Taiwan Dollar",symbol:"NT$",native:"NT$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"3173",max_amount:"31738502"},TZS:{code:"TZS",title:"Tanzanian Shilling",symbol:"TZS",native:"TSh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"233199",max_amount:"2331999890"},UAH:{code:"UAH",title:"Ukrainian Hryvnia",symbol:"UAH",native:"₴",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!1,exp:2,min_amount:"3633",max_amount:"36338830"},UGX:{code:"UGX",title:"Ugandan Shilling",symbol:"UGX",native:"USh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"3816",max_amount:"38166726"},USD:{code:"USD",title:"United States Dollar",symbol:"$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"100",max_amount:1e6},UYU:{code:"UYU",title:"Uruguayan Peso",symbol:"UYU",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"4080",max_amount:"40801205"},UZS:{code:"UZS",title:"Uzbekistani Som",symbol:"UZS",native:"UZS",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1089058",max_amount:"10890583014"},VND:{code:"VND",title:"Vietnamese Đồng",symbol:"₫",native:"₫",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:0,min_amount:"23862",max_amount:"238625000"},YER:{code:"YER",title:"Yemeni Rial",symbol:"YER",native:"ر.ي.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"25030",max_amount:"250300677"},ZAR:{code:"ZAR",title:"South African Rand",symbol:"ZAR",native:"R",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1789",max_amount:"17894299"}}},3447:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a,i:()=>s});const s={14:{"1f6dd":4867,"1f6de":4916,"1f6df":4923,"1f7f0":62832,"1f979":183,"1f9cc":1557,"1fa7b":61332,"1fa7c":61330,"1faa9":51093,"1faaa":61364,"1faab":61189,"1faac":51085,"1fab7":2651,"1fab8":2631,"1fab9":2672,"1faba":2673,"1fac3":1520,"1fac4":1521,"1fac5":1505,"1fad7":3793,"1fad8":3707,"1fad9":3804,"1fae0":111,"1fae1":136,"1fae2":132,"1fae3":133,"1fae4":174,"1fae5":142,"1fae6":1385,"1fae7":61353,"1faf0":1341,"1faf1":1332,"1faf2":1333,"1faf3":1334,"1faf4":1335,"1faf5":1351,"1faf6":1360,"1faf1-1f3fb-200d-1faf2-1f3fc":0,"1faf1-1f3fb-200d-1faf2-1f3fd":0,"1faf1-1f3fb-200d-1faf2-1f3fe":0,"1faf1-1f3fb-200d-1faf2-1f3ff":0,"1faf1-1f3fc-200d-1faf2-1f3fb":0,"1faf1-1f3fc-200d-1faf2-1f3fd":0,"1faf1-1f3fc-200d-1faf2-1f3fe":0,"1faf1-1f3fc-200d-1faf2-1f3ff":0,"1faf1-1f3fd-200d-1faf2-1f3fb":0,"1faf1-1f3fd-200d-1faf2-1f3fc":0,"1faf1-1f3fd-200d-1faf2-1f3fe":0,"1faf1-1f3fd-200d-1faf2-1f3ff":0,"1faf1-1f3fe-200d-1faf2-1f3fb":0,"1faf1-1f3fe-200d-1faf2-1f3fc":0,"1faf1-1f3fe-200d-1faf2-1f3fd":0,"1faf1-1f3fe-200d-1faf2-1f3ff":0,"1faf1-1f3ff-200d-1faf2-1f3fb":0,"1faf1-1f3ff-200d-1faf2-1f3fc":0,"1faf1-1f3ff-200d-1faf2-1f3fd":0,"1faf1-1f3ff-200d-1faf2-1f3fe":0,"1fac3-1f3fb":0,"1fac3-1f3fc":0,"1fac3-1f3fd":0,"1fac3-1f3fe":0,"1fac3-1f3ff":0,"1fac4-1f3fb":0,"1fac4-1f3fc":0,"1fac4-1f3fd":0,"1fac4-1f3fe":0,"1fac4-1f3ff":0,"1fac5-1f3fb":0,"1fac5-1f3fc":0,"1fac5-1f3fd":0,"1fac5-1f3fe":0,"1fac5-1f3ff":0,"1faf0-1f3fb":0,"1faf0-1f3fc":0,"1faf0-1f3fd":0,"1faf0-1f3fe":0,"1faf0-1f3ff":0,"1faf1-1f3fb":0,"1faf1-1f3fc":0,"1faf1-1f3fd":0,"1faf1-1f3fe":0,"1faf1-1f3ff":0,"1faf2-1f3fb":0,"1faf2-1f3fc":0,"1faf2-1f3fd":0,"1faf2-1f3fe":0,"1faf2-1f3ff":0,"1faf3-1f3fb":0,"1faf3-1f3fc":0,"1faf3-1f3fd":0,"1faf3-1f3fe":0,"1faf3-1f3ff":0,"1faf4-1f3fb":0,"1faf4-1f3fc":0,"1faf4-1f3fd":0,"1faf4-1f3fe":0,"1faf4-1f3ff":0,"1faf5-1f3fb":0,"1faf5-1f3fc":0,"1faf5-1f3fd":0,"1faf5-1f3fe":0,"1faf5-1f3ff":0,"1faf6-1f3fb":0,"1faf6-1f3fc":0,"1faf6-1f3fd":0,"1faf6-1f3fe":0,"1faf6-1f3ff":0},"":{2049:62835,2122:62863,2139:62888,2194:62764,2195:62763,2196:62762,2197:62756,2198:62758,2199:62760,2328:61194,2600:4990,2601:4998,2602:41013,2603:41018,2604:41020,2611:62851,2614:41014,2615:3781,2618:2667,2620:1106,2622:62753,2623:62754,2626:62783,2638:62780,2639:177,2648:62788,2649:62789,2650:62796,2651:62797,2652:62798,2653:62799,2660:51095,2663:51098,2665:51096,2666:51097,2668:4865,2692:61297,2693:4922,2694:61300,2696:61311,2697:61319,2699:61309,2702:61284,2705:62850,2708:4931,2709:61245,2712:61259,2714:62852,2716:62828,2721:62779,2728:51029,2733:62858,2734:62859,2744:41017,2747:62860,2753:62836,2754:62837,2755:62838,2757:62839,2763:1137,2764:1141,2795:62829,2796:62830,2797:62831,2934:62767,2935:62768,3030:62840,3297:62912,3299:62913,"0023-20e3":62864,"002a-20e3":62865,"0030-20e3":62866,"0031-20e3":62867,"0032-20e3":62868,"0033-20e3":62869,"0034-20e3":62870,"0035-20e3":62871,"0036-20e3":62872,"0037-20e3":62873,"0038-20e3":62874,"0039-20e3":62875,"00a9":62861,"00ae":62862,"1f004":51101,"1f0cf":51100,"1f170":62882,"1f171":62884,"1f17e":62893,"1f17f":62895,"1f18e":62883,"1f191":62885,"1f192":62886,"1f193":62887,"1f194":62889,"1f195":62891,"1f196":62892,"1f197":62894,"1f198":62896,"1f199":62897,"1f19a":62898,"1f1e6-1f1e8":71594,"1f1e6-1f1e9":71595,"1f1e6-1f1ea":71596,"1f1e6-1f1eb":71597,"1f1e6-1f1ec":71598,"1f1e6-1f1ee":71599,"1f1e6-1f1f1":71600,"1f1e6-1f1f2":71601,"1f1e6-1f1f4":71602,"1f1e6-1f1f6":71603,"1f1e6-1f1f7":71604,"1f1e6-1f1f8":71605,"1f1e6-1f1f9":71606,"1f1e6-1f1fa":71607,"1f1e6-1f1fc":71608,"1f1e6-1f1fd":71609,"1f1e6-1f1ff":71610,"1f1e7-1f1e6":71611,"1f1e7-1f1e7":71612,"1f1e7-1f1e9":71613,"1f1e7-1f1ea":71614,"1f1e7-1f1eb":71615,"1f1e7-1f1ec":71616,"1f1e7-1f1ed":71617,"1f1e7-1f1ee":71618,"1f1e7-1f1ef":71619,"1f1e7-1f1f1":71620,"1f1e7-1f1f2":71621,"1f1e7-1f1f3":71622,"1f1e7-1f1f4":71623,"1f1e7-1f1f6":71624,"1f1e7-1f1f7":71625,"1f1e7-1f1f8":71626,"1f1e7-1f1f9":71627,"1f1e7-1f1fb":71628,"1f1e7-1f1fc":71629,"1f1e7-1f1fe":71630,"1f1e7-1f1ff":71631,"1f1e8-1f1e6":71632,"1f1e8-1f1e8":71633,"1f1e8-1f1e9":71634,"1f1e8-1f1eb":71635,"1f1e8-1f1ec":71636,"1f1e8-1f1ed":71637,"1f1e8-1f1ee":71638,"1f1e8-1f1f0":71639,"1f1e8-1f1f1":71640,"1f1e8-1f1f2":71641,"1f1e8-1f1f3":71642,"1f1e8-1f1f4":71643,"1f1e8-1f1f5":71644,"1f1e8-1f1f7":71645,"1f1e8-1f1fa":71646,"1f1e8-1f1fb":71647,"1f1e8-1f1fc":71648,"1f1e8-1f1fd":71649,"1f1e8-1f1fe":71650,"1f1e8-1f1ff":71651,"1f1e9-1f1ea":71652,"1f1e9-1f1ec":71653,"1f1e9-1f1ef":71654,"1f1e9-1f1f0":71655,"1f1e9-1f1f2":71656,"1f1e9-1f1f4":71657,"1f1e9-1f1ff":71658,"1f1ea-1f1e6":71659,"1f1ea-1f1e8":71660,"1f1ea-1f1ea":71661,"1f1ea-1f1ec":71662,"1f1ea-1f1ed":71663,"1f1ea-1f1f7":71664,"1f1ea-1f1f8":71665,"1f1ea-1f1f9":71666,"1f1ea-1f1fa":71667,"1f1eb-1f1ee":71668,"1f1eb-1f1ef":71669,"1f1eb-1f1f0":71670,"1f1eb-1f1f2":71671,"1f1eb-1f1f4":71672,"1f1eb-1f1f7":71673,"1f1ec-1f1e6":71674,"1f1ec-1f1e7":71675,"1f1ec-1f1e9":71676,"1f1ec-1f1ea":71677,"1f1ec-1f1eb":71678,"1f1ec-1f1ec":71679,"1f1ec-1f1ed":71680,"1f1ec-1f1ee":71681,"1f1ec-1f1f1":71682,"1f1ec-1f1f2":71683,"1f1ec-1f1f3":71684,"1f1ec-1f1f5":71685,"1f1ec-1f1f6":71686,"1f1ec-1f1f7":71687,"1f1ec-1f1f8":71688,"1f1ec-1f1f9":71689,"1f1ec-1f1fa":71690,"1f1ec-1f1fc":71691,"1f1ec-1f1fe":71692,"1f1ed-1f1f0":71693,"1f1ed-1f1f2":71694,"1f1ed-1f1f3":71695,"1f1ed-1f1f7":71696,"1f1ed-1f1f9":71697,"1f1ed-1f1fa":71698,"1f1ee-1f1e8":71699,"1f1ee-1f1e9":71700,"1f1ee-1f1ea":71701,"1f1ee-1f1f1":71702,"1f1ee-1f1f2":71703,"1f1ee-1f1f3":71704,"1f1ee-1f1f4":71705,"1f1ee-1f1f6":71706,"1f1ee-1f1f7":71707,"1f1ee-1f1f8":71708,"1f1ee-1f1f9":71709,"1f1ef-1f1ea":71710,"1f1ef-1f1f2":71711,"1f1ef-1f1f4":71712,"1f1ef-1f1f5":71713,"1f1f0-1f1ea":71714,"1f1f0-1f1ec":71715,"1f1f0-1f1ed":71716,"1f1f0-1f1ee":71717,"1f1f0-1f1f2":71718,"1f1f0-1f1f3":71719,"1f1f0-1f1f5":71720,"1f1f0-1f1f7":71721,"1f1f0-1f1fc":71722,"1f1f0-1f1fe":71723,"1f1f0-1f1ff":71724,"1f1f1-1f1e6":71725,"1f1f1-1f1e7":71726,"1f1f1-1f1e8":71727,"1f1f1-1f1ee":71728,"1f1f1-1f1f0":71729,"1f1f1-1f1f7":71730,"1f1f1-1f1f8":71731,"1f1f1-1f1f9":71732,"1f1f1-1f1fa":71733,"1f1f1-1f1fb":71734,"1f1f1-1f1fe":71735,"1f1f2-1f1e6":71736,"1f1f2-1f1e8":71737,"1f1f2-1f1e9":71738,"1f1f2-1f1ea":71739,"1f1f2-1f1eb":71740,"1f1f2-1f1ec":71741,"1f1f2-1f1ed":71742,"1f1f2-1f1f0":71743,"1f1f2-1f1f1":71744,"1f1f2-1f1f2":71745,"1f1f2-1f1f3":71746,"1f1f2-1f1f4":71747,"1f1f2-1f1f5":71748,"1f1f2-1f1f6":71749,"1f1f2-1f1f7":71750,"1f1f2-1f1f8":71751,"1f1f2-1f1f9":71752,"1f1f2-1f1fa":71753,"1f1f2-1f1fb":71754,"1f1f2-1f1fc":71755,"1f1f2-1f1fd":71756,"1f1f2-1f1fe":71757,"1f1f2-1f1ff":71758,"1f1f3-1f1e6":71759,"1f1f3-1f1e8":71760,"1f1f3-1f1ea":71761,"1f1f3-1f1eb":71762,"1f1f3-1f1ec":71763,"1f1f3-1f1ee":71764,"1f1f3-1f1f1":71765,"1f1f3-1f1f4":71766,"1f1f3-1f1f5":71767,"1f1f3-1f1f7":71768,"1f1f3-1f1fa":71769,"1f1f3-1f1ff":71770,"1f1f4-1f1f2":71771,"1f1f5-1f1e6":71772,"1f1f5-1f1ea":71773,"1f1f5-1f1eb":71774,"1f1f5-1f1ec":71775,"1f1f5-1f1ed":71776,"1f1f5-1f1f0":71777,"1f1f5-1f1f1":71778,"1f1f5-1f1f2":71779,"1f1f5-1f1f3":71780,"1f1f5-1f1f7":71781,"1f1f5-1f1f8":71782,"1f1f5-1f1f9":71783,"1f1f5-1f1fc":71784,"1f1f5-1f1fe":71785,"1f1f6-1f1e6":71786,"1f1f7-1f1ea":71787,"1f1f7-1f1f4":71788,"1f1f7-1f1f8":71789,"1f1f7-1f1fa":71790,"1f1f7-1f1fc":71791,"1f1f8-1f1e6":71792,"1f1f8-1f1e7":71793,"1f1f8-1f1e8":71794,"1f1f8-1f1e9":71795,"1f1f8-1f1ea":71796,"1f1f8-1f1ec":71797,"1f1f8-1f1ed":71798,"1f1f8-1f1ee":71799,"1f1f8-1f1ef":71800,"1f1f8-1f1f0":71801,"1f1f8-1f1f1":71802,"1f1f8-1f1f2":71803,"1f1f8-1f1f3":71804,"1f1f8-1f1f4":71805,"1f1f8-1f1f7":71806,"1f1f8-1f1f8":71807,"1f1f8-1f1f9":71808,"1f1f8-1f1fb":71809,"1f1f8-1f1fd":71810,"1f1f8-1f1fe":71811,"1f1f8-1f1ff":71812,"1f1f9-1f1e6":71813,"1f1f9-1f1e8":71814,"1f1f9-1f1e9":71815,"1f1f9-1f1eb":71816,"1f1f9-1f1ec":71817,"1f1f9-1f1ed":71818,"1f1f9-1f1ef":71819,"1f1f9-1f1f0":71820,"1f1f9-1f1f1":71821,"1f1f9-1f1f2":71822,"1f1f9-1f1f3":71823,"1f1f9-1f1f4":71824,"1f1f9-1f1f7":71825,"1f1f9-1f1f9":71826,"1f1f9-1f1fb":71827,"1f1f9-1f1fc":71828,"1f1f9-1f1ff":71829,"1f1fa-1f1e6":71830,"1f1fa-1f1ec":71831,"1f1fa-1f1f2":71832,"1f1fa-1f1f3":71833,"1f1fa-1f1f8":71834,"1f1fa-1f1fe":71835,"1f1fa-1f1ff":71836,"1f1fb-1f1e6":71837,"1f1fb-1f1e8":71838,"1f1fb-1f1ea":71839,"1f1fb-1f1ec":71840,"1f1fb-1f1ee":71841,"1f1fb-1f1f3":71842,"1f1fb-1f1fa":71843,"1f1fc-1f1eb":71844,"1f1fc-1f1f8":71845,"1f1fd-1f1f0":71846,"1f1fe-1f1ea":71847,"1f1fe-1f1f9":71848,"1f1ff-1f1e6":71849,"1f1ff-1f1f2":71850,"1f1ff-1f1fc":71851,"1f201":62899,"1f202":62900,"1f21a":62906,"1f22f":62903,"1f232":62907,"1f233":62911,"1f234":62910,"1f235":62915,"1f236":62902,"1f237":62901,"1f238":62909,"1f239":62905,"1f23a":62914,"1f250":62904,"1f251":62908,"1f300":41010,"1f301":4857,"1f302":41012,"1f303":4858,"1f304":4860,"1f305":4861,"1f306":4862,"1f307":4863,"1f308":41011,"1f309":4864,"1f30a":41023,"1f30b":4815,"1f30c":4997,"1f30d":4806,"1f30e":4807,"1f30f":4808,"1f310":4809,"1f311":4977,"1f312":4978,"1f313":4979,"1f314":4980,"1f315":4981,"1f316":4982,"1f317":4983,"1f318":4984,"1f319":4985,"1f31a":4986,"1f31b":4987,"1f31c":4988,"1f31d":4991,"1f31e":4992,"1f31f":4995,"1f320":4996,"1f321":4989,"1f324":41001,"1f325":41002,"1f326":41003,"1f327":41004,"1f328":41005,"1f329":41006,"1f32a":41007,"1f32b":41008,"1f32c":41009,"1f32d":3725,"1f32e":3727,"1f32f":3728,"1f330":3708,"1f331":2659,"1f332":2661,"1f333":2662,"1f334":2663,"1f335":2664,"1f336":3698,"1f337":2658,"1f338":2649,"1f339":2653,"1f33a":2655,"1f33b":2656,"1f33c":2657,"1f33d":3697,"1f33e":2665,"1f33f":2666,"1f340":2668,"1f341":2669,"1f342":2670,"1f343":2671,"1f344":3705,"1f345":3690,"1f346":3694,"1f347":3674,"1f348":3675,"1f349":3676,"1f34a":3677,"1f34b":3678,"1f34c":3679,"1f34d":3680,"1f34e":3682,"1f34f":3683,"1f350":3684,"1f351":3685,"1f352":3686,"1f353":3687,"1f354":3722,"1f355":3724,"1f356":3718,"1f357":3719,"1f358":3744,"1f359":3745,"1f35a":3746,"1f35b":3747,"1f35c":3748,"1f35d":3749,"1f35e":3709,"1f35f":3723,"1f360":3750,"1f361":3756,"1f362":3751,"1f363":3752,"1f364":3753,"1f365":3754,"1f366":3765,"1f367":3766,"1f368":3767,"1f369":3768,"1f36a":3769,"1f36b":3774,"1f36c":3775,"1f36d":3776,"1f36e":3777,"1f36f":3778,"1f370":3771,"1f371":3743,"1f372":3735,"1f373":3733,"1f374":3801,"1f375":3783,"1f376":3784,"1f377":3786,"1f378":3787,"1f379":3788,"1f37a":3789,"1f37b":3790,"1f37c":3779,"1f37d":3800,"1f37e":3785,"1f37f":3739,"1f380":51040,"1f381":51041,"1f382":3770,"1f383":51024,"1f384":51025,"1f385":1527,"1f386":51026,"1f387":51027,"1f388":51030,"1f389":51031,"1f38a":51032,"1f38b":51033,"1f38c":71588,"1f38d":51034,"1f38e":51035,"1f38f":51036,"1f390":51037,"1f391":51038,"1f392":61134,"1f393":61147,"1f396":51045,"1f397":51042,"1f399":61167,"1f39a":61168,"1f39b":61169,"1f39e":61203,"1f39f":51043,"1f3a0":4866,"1f3a1":4868,"1f3a2":4869,"1f3a3":51072,"1f3a4":61170,"1f3a5":61202,"1f3a6":62819,"1f3a7":61171,"1f3a8":51105,"1f3a9":61146,"1f3aa":4871,"1f3ab":51044,"1f3ac":61205,"1f3ad":51103,"1f3ae":51086,"1f3af":51078,"1f3b0":51088,"1f3b1":51081,"1f3b2":51089,"1f3b3":51060,"1f3b4":51102,"1f3b5":61165,"1f3b6":61166,"1f3b7":61173,"1f3b8":61175,"1f3b9":61176,"1f3ba":61177,"1f3bb":61178,"1f3bc":61164,"1f3bd":51074,"1f3be":51058,"1f3bf":51075,"1f3c0":51054,"1f3c1":71586,"1f3c2":1600,"1f3c3-200d-2640":1584,"1f3c3-200d-2642":1583,"1f3c3":1582,"1f3c4-200d-2640":1606,"1f3c4-200d-2642":1605,"1f3c4":1604,"1f3c5":51047,"1f3c6":51046,"1f3c7":1598,"1f3c8":51056,"1f3c9":51057,"1f3ca-200d-2640":1612,"1f3ca-200d-2642":1611,"1f3ca":1610,"1f3cb-200d-2640":1618,"1f3cb-200d-2642":1617,"1f3cb":1616,"1f3cc-200d-2640":1603,"1f3cc-200d-2642":1602,"1f3cc":1601,"1f3cd":4902,"1f3ce":4901,"1f3cf":51061,"1f3d0":51055,"1f3d1":51062,"1f3d2":51063,"1f3d3":51065,"1f3d4":4813,"1f3d5":4817,"1f3d6":4818,"1f3d7":4824,"1f3d8":4829,"1f3d9":4859,"1f3da":4830,"1f3db":4823,"1f3dc":4819,"1f3dd":4820,"1f3de":4821,"1f3df":4822,"1f3e0":4831,"1f3e1":4832,"1f3e2":4833,"1f3e3":4834,"1f3e4":4835,"1f3e5":4836,"1f3e6":4837,"1f3e7":62729,"1f3e8":4838,"1f3e9":4839,"1f3ea":4840,"1f3eb":4841,"1f3ec":4842,"1f3ed":4843,"1f3ee":61216,"1f3ef":4844,"1f3f0":4845,"1f3f3-200d-1f308":71591,"1f3f3-200d-26a7":71592,"1f3f3":71590,"1f3f4-200d-2620":71593,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71852,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71853,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71854,"1f3f4":71589,"1f3f5":2652,"1f3f7":61234,"1f3f8":51066,"1f3f9":61303,"1f3fa":3805,"1f3fb":9525,"1f3fc":9526,"1f3fd":9527,"1f3fe":9528,"1f3ff":9529,"1f400":2576,"1f401":2575,"1f402":2556,"1f403":2557,"1f404":2558,"1f405":2547,"1f406":2548,"1f407":2579,"1f408-200d-2b1b":2544,"1f408":2543,"1f409":2618,"1f40a":2613,"1f40b":2622,"1f40c":2632,"1f40d":2616,"1f40e":2550,"1f40f":2563,"1f410":2565,"1f411":2564,"1f412":2531,"1f413":2596,"1f414":2595,"1f415-200d-1f9ba":2537,"1f415":2535,"1f416":2560,"1f417":2561,"1f418":2570,"1f419":2629,"1f41a":2630,"1f41b":2634,"1f41c":2635,"1f41d":2636,"1f41e":2638,"1f41f":2625,"1f420":2626,"1f421":2627,"1f422":2614,"1f423":2597,"1f424":2598,"1f425":2599,"1f426":2600,"1f427":2601,"1f428":2586,"1f429":2538,"1f42a":2566,"1f42b":2567,"1f42c":2623,"1f42d":2574,"1f42e":2555,"1f42f":2546,"1f430":2578,"1f431":2542,"1f432":2617,"1f433":2621,"1f434":2549,"1f435":2530,"1f436":2534,"1f437":2559,"1f438":2612,"1f439":2577,"1f43a":2539,"1f43b-200d-2744":2585,"1f43b":2584,"1f43c":2587,"1f43d":2562,"1f43e":2593,"1f43f":2580,"1f440":1381,"1f441-200d-1f5e8":1159,"1f441":1382,"1f442":1373,"1f443":1375,"1f444":1384,"1f445":1383,"1f446":1347,"1f447":1349,"1f448":1345,"1f449":1346,"1f44a":1355,"1f44b":1327,"1f44c":1336,"1f44d":1352,"1f44e":1353,"1f44f":1358,"1f450":1361,"1f451":61144,"1f452":61145,"1f453":61110,"1f454":61115,"1f455":61116,"1f456":61117,"1f457":61122,"1f458":61123,"1f459":61128,"1f45a":61129,"1f45b":61130,"1f45c":61131,"1f45d":61132,"1f45e":61136,"1f45f":61137,"1f460":61140,"1f461":61141,"1f462":61143,"1f463":1687,"1f464":1684,"1f465":1685,"1f466":1388,"1f467":1389,"1f468-200d-1f33e":1457,"1f468-200d-1f373":1460,"1f468-200d-1f37c":1524,"1f468-200d-1f393":1448,"1f468-200d-1f3a4":1478,"1f468-200d-1f3a8":1481,"1f468-200d-1f3eb":1451,"1f468-200d-1f3ed":1466,"1f468-200d-1f466-200d-1f466":1674,"1f468-200d-1f466":1673,"1f468-200d-1f467-200d-1f466":1676,"1f468-200d-1f467-200d-1f467":1677,"1f468-200d-1f467":1675,"1f468-200d-1f468-200d-1f466":1663,"1f468-200d-1f468-200d-1f466-200d-1f466":1666,"1f468-200d-1f468-200d-1f467":1664,"1f468-200d-1f468-200d-1f467-200d-1f466":1665,"1f468-200d-1f468-200d-1f467-200d-1f467":1667,"1f468-200d-1f469-200d-1f466":1658,"1f468-200d-1f469-200d-1f466-200d-1f466":1661,"1f468-200d-1f469-200d-1f467":1659,"1f468-200d-1f469-200d-1f467-200d-1f466":1660,"1f468-200d-1f469-200d-1f467-200d-1f467":1662,"1f468-200d-1f4bb":1475,"1f468-200d-1f4bc":1469,"1f468-200d-1f527":1463,"1f468-200d-1f52c":1472,"1f468-200d-1f680":1487,"1f468-200d-1f692":1490,"1f468-200d-1f9af":1574,"1f468-200d-1f9b0":1396,"1f468-200d-1f9b1":1397,"1f468-200d-1f9b2":1399,"1f468-200d-1f9b3":1398,"1f468-200d-1f9bc":1577,"1f468-200d-1f9bd":1580,"1f468-200d-2695":1445,"1f468-200d-2696":1454,"1f468-200d-2708":1484,"1f468-200d-2764-200d-1f468":1655,"1f468-200d-2764-200d-1f48b-200d-1f468":1651,"1f468":1392,"1f469-200d-1f33e":1458,"1f469-200d-1f373":1461,"1f469-200d-1f37c":1523,"1f469-200d-1f393":1449,"1f469-200d-1f3a4":1479,"1f469-200d-1f3a8":1482,"1f469-200d-1f3eb":1452,"1f469-200d-1f3ed":1467,"1f469-200d-1f466-200d-1f466":1679,"1f469-200d-1f466":1678,"1f469-200d-1f467-200d-1f466":1681,"1f469-200d-1f467-200d-1f467":1682,"1f469-200d-1f467":1680,"1f469-200d-1f469-200d-1f466":1668,"1f469-200d-1f469-200d-1f466-200d-1f466":1671,"1f469-200d-1f469-200d-1f467":1669,"1f469-200d-1f469-200d-1f467-200d-1f466":1670,"1f469-200d-1f469-200d-1f467-200d-1f467":1672,"1f469-200d-1f4bb":1476,"1f469-200d-1f4bc":1470,"1f469-200d-1f527":1464,"1f469-200d-1f52c":1473,"1f469-200d-1f680":1488,"1f469-200d-1f692":1491,"1f469-200d-1f9af":1575,"1f469-200d-1f9b0":1401,"1f469-200d-1f9b1":1403,"1f469-200d-1f9b2":1407,"1f469-200d-1f9b3":1405,"1f469-200d-1f9bc":1578,"1f469-200d-1f9bd":1581,"1f469-200d-2695":1446,"1f469-200d-2696":1455,"1f469-200d-2708":1485,"1f469-200d-2764-200d-1f468":1654,"1f469-200d-2764-200d-1f469":1656,"1f469-200d-2764-200d-1f48b-200d-1f468":1650,"1f469-200d-2764-200d-1f48b-200d-1f469":1652,"1f469":1400,"1f46a":1657,"1f46b":1647,"1f46c":1648,"1f46d":1646,"1f46e-200d-2640":1494,"1f46e-200d-2642":1493,"1f46e":1492,"1f46f-200d-2640":1590,"1f46f-200d-2642":1589,"1f46f":1588,"1f470-200d-2640":1518,"1f470-200d-2642":1517,"1f470":1516,"1f471-200d-2640":1409,"1f471-200d-2642":1410,"1f471":1391,"1f472":1511,"1f473-200d-2640":1510,"1f473-200d-2642":1509,"1f473":1508,"1f474":1412,"1f475":1413,"1f476":1386,"1f477-200d-2640":1504,"1f477-200d-2642":1503,"1f477":1502,"1f478":1507,"1f479":1109,"1f47a":1110,"1f47b":1111,"1f47c":1526,"1f47d":1112,"1f47e":1113,"1f47f":1104,"1f480":1105,"1f481-200d-2640":1428,"1f481-200d-2642":1427,"1f481":1426,"1f482-200d-2640":1500,"1f482-200d-2642":1499,"1f482":1498,"1f483":1585,"1f484":61152,"1f485":1366,"1f486-200d-2640":1560,"1f486-200d-2642":1559,"1f486":1558,"1f487-200d-2640":1563,"1f487-200d-2642":1562,"1f487":1561,"1f488":4870,"1f489":61326,"1f48a":61328,"1f48b":1127,"1f48c":1128,"1f48d":61153,"1f48e":61154,"1f48f":1649,"1f490":2648,"1f491":1653,"1f492":4846,"1f493":1133,"1f494":1138,"1f495":1135,"1f496":1131,"1f497":1132,"1f498":1129,"1f499":1145,"1f49a":1144,"1f49b":1143,"1f49c":1146,"1f49d":1130,"1f49e":1134,"1f49f":1136,"1f4a0":62946,"1f4a1":61214,"1f4a2":1151,"1f4a3":1157,"1f4a4":1163,"1f4a5":1152,"1f4a6":1154,"1f4a7":41022,"1f4a8":1155,"1f4a9":1107,"1f4aa":1368,"1f4ab":1153,"1f4ac":1158,"1f4ad":1162,"1f4ae":2650,"1f4af":1150,"1f4b0":61235,"1f4b1":62841,"1f4b2":62842,"1f4b3":61242,"1f4b4":61237,"1f4b5":61238,"1f4b6":61239,"1f4b7":61240,"1f4b8":61241,"1f4b9":61244,"1f4ba":4936,"1f4bb":61191,"1f4bc":61265,"1f4bd":61197,"1f4be":61198,"1f4bf":61199,"1f4c0":61200,"1f4c1":61266,"1f4c2":61267,"1f4c3":61227,"1f4c4":61229,"1f4c5":61269,"1f4c6":61270,"1f4c7":61273,"1f4c8":61274,"1f4c9":61275,"1f4ca":61276,"1f4cb":61277,"1f4cc":61278,"1f4cd":61279,"1f4ce":61280,"1f4cf":61282,"1f4d0":61283,"1f4d1":61232,"1f4d2":61226,"1f4d3":61225,"1f4d4":61218,"1f4d5":61219,"1f4d6":61220,"1f4d7":61221,"1f4d8":61222,"1f4d9":61223,"1f4da":61224,"1f4db":62847,"1f4dc":61228,"1f4dd":61264,"1f4de":61185,"1f4df":61186,"1f4e0":61187,"1f4e1":61325,"1f4e2":61159,"1f4e3":61160,"1f4e4":61249,"1f4e5":61250,"1f4e6":61251,"1f4e7":61246,"1f4e8":61247,"1f4e9":61248,"1f4ea":61253,"1f4eb":61252,"1f4ec":61254,"1f4ed":61255,"1f4ee":61256,"1f4ef":61161,"1f4f0":61230,"1f4f1":61182,"1f4f2":61183,"1f4f3":62823,"1f4f4":62824,"1f4f5":62751,"1f4f6":62822,"1f4f7":61207,"1f4f8":61208,"1f4f9":61209,"1f4fa":61206,"1f4fb":61172,"1f4fc":61210,"1f4fd":61204,"1f4ff":61151,"1f500":62801,"1f501":62802,"1f502":62803,"1f503":62769,"1f504":62770,"1f505":62820,"1f506":62821,"1f507":61155,"1f508":61156,"1f509":61157,"1f50a":61158,"1f50b":61188,"1f50c":61190,"1f50d":61211,"1f50e":61212,"1f50f":61290,"1f510":61291,"1f511":61292,"1f512":61288,"1f513":61289,"1f514":61162,"1f515":61163,"1f516":61233,"1f517":61313,"1f518":62947,"1f519":62771,"1f51a":62772,"1f51b":62773,"1f51c":62774,"1f51d":62775,"1f51e":62752,"1f51f":62876,"1f520":62877,"1f521":62878,"1f522":62879,"1f523":62880,"1f524":62881,"1f525":41021,"1f526":61215,"1f527":61306,"1f528":61294,"1f529":61308,"1f52a":3803,"1f52b":61301,"1f52c":61323,"1f52d":61324,"1f52e":51082,"1f52f":62787,"1f530":62848,"1f531":62846,"1f532":62949,"1f533":62948,"1f534":62916,"1f535":62920,"1f536":62940,"1f537":62941,"1f538":62942,"1f539":62943,"1f53a":62944,"1f53b":62945,"1f53c":62811,"1f53d":62813,"1f549":62778,"1f54a":2602,"1f54b":4854,"1f54c":4850,"1f54d":4852,"1f54e":62786,"1f550":4955,"1f551":4957,"1f552":4959,"1f553":4961,"1f554":4963,"1f555":4965,"1f556":4967,"1f557":4969,"1f558":4971,"1f559":4973,"1f55a":4975,"1f55b":4953,"1f55c":4956,"1f55d":4958,"1f55e":4960,"1f55f":4962,"1f560":4964,"1f561":4966,"1f562":4968,"1f563":4970,"1f564":4972,"1f565":4974,"1f566":4976,"1f567":4954,"1f56f":61213,"1f570":4952,"1f573":1156,"1f574":1587,"1f575-200d-2640":1497,"1f575-200d-2642":1496,"1f575":1495,"1f576":61111,"1f577":2641,"1f578":2642,"1f579":51087,"1f57a":1586,"1f587":61281,"1f58a":61261,"1f58b":61260,"1f58c":61262,"1f58d":61263,"1f590":1329,"1f595":1348,"1f596":1331,"1f5a4":1148,"1f5a5":61192,"1f5a8":61193,"1f5b1":61195,"1f5b2":61196,"1f5bc":51104,"1f5c2":61268,"1f5c3":61285,"1f5c4":61286,"1f5d1":61287,"1f5d2":61271,"1f5d3":61272,"1f5dc":61310,"1f5dd":61293,"1f5de":61231,"1f5e1":61299,"1f5e3":1683,"1f5e8":1160,"1f5ef":1161,"1f5f3":61257,"1f5fa":4810,"1f5fb":4816,"1f5fc":4847,"1f5fd":4848,"1f5fe":4811,"1f5ff":61362,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":114,"1f608":1103,"1f609":112,"1f60a":113,"1f60b":124,"1f60c":150,"1f60d":116,"1f60e":170,"1f60f":144,"1f610":139,"1f611":140,"1f612":145,"1f613":195,"1f614":151,"1f615":173,"1f616":192,"1f617":119,"1f618":118,"1f619":122,"1f61a":121,"1f61b":125,"1f61c":126,"1f61d":128,"1f61e":194,"1f61f":175,"1f620":1101,"1f621":1100,"1f622":189,"1f623":193,"1f624":199,"1f625":188,"1f626":184,"1f627":185,"1f628":186,"1f629":196,"1f62a":152,"1f62b":197,"1f62c":147,"1f62d":190,"1f62e-200d-1f4a8":148,"1f62e":178,"1f62f":179,"1f630":187,"1f631":191,"1f632":180,"1f633":181,"1f634":154,"1f635-200d-1f4ab":165,"1f635":164,"1f636-200d-1f32b":143,"1f636":141,"1f637":155,"1f638":1116,"1f639":1117,"1f63a":1115,"1f63b":1118,"1f63c":1119,"1f63d":1120,"1f63e":1123,"1f63f":1122,"1f640":1121,"1f641":176,"1f642":19,"1f643":110,"1f644":146,"1f645-200d-2640":1422,"1f645-200d-2642":1421,"1f645":1420,"1f646-200d-2640":1425,"1f646-200d-2642":1424,"1f646":1423,"1f647-200d-2640":1437,"1f647-200d-2642":1436,"1f647":1435,"1f648":1124,"1f649":1125,"1f64a":1126,"1f64b-200d-2640":1431,"1f64b-200d-2642":1430,"1f64b":1429,"1f64c":1359,"1f64d-200d-2640":1416,"1f64d-200d-2642":1415,"1f64d":1414,"1f64e-200d-2640":1419,"1f64e-200d-2642":1418,"1f64e":1417,"1f64f":1364,"1f680":4942,"1f681":4937,"1f682":4872,"1f683":4873,"1f684":4874,"1f685":4875,"1f686":4876,"1f687":4877,"1f688":4878,"1f689":4879,"1f68a":4880,"1f68b":4883,"1f68c":4884,"1f68d":4885,"1f68e":4886,"1f68f":4911,"1f690":4887,"1f691":4888,"1f692":4889,"1f693":4890,"1f694":4891,"1f695":4892,"1f696":4893,"1f697":4894,"1f698":4895,"1f699":4896,"1f69a":4898,"1f69b":4899,"1f69c":4900,"1f69d":4881,"1f69e":4882,"1f69f":4938,"1f6a0":4939,"1f6a1":4940,"1f6a2":4930,"1f6a3-200d-2640":1609,"1f6a3-200d-2642":1608,"1f6a3":1607,"1f6a4":4926,"1f6a5":4918,"1f6a6":4919,"1f6a7":4921,"1f6a8":4917,"1f6a9":71587,"1f6aa":61333,"1f6ab":62745,"1f6ac":61358,"1f6ad":62747,"1f6ae":62730,"1f6af":62748,"1f6b0":62731,"1f6b1":62749,"1f6b2":4907,"1f6b3":62746,"1f6b4-200d-2640":1621,"1f6b4-200d-2642":1620,"1f6b4":1619,"1f6b5-200d-2640":1624,"1f6b5-200d-2642":1623,"1f6b5":1622,"1f6b6-200d-2640":1566,"1f6b6-200d-2642":1565,"1f6b6":1564,"1f6b7":62750,"1f6b8":62743,"1f6b9":62733,"1f6ba":62734,"1f6bb":62735,"1f6bc":62736,"1f6bd":61340,"1f6be":62737,"1f6bf":61342,"1f6c0":1643,"1f6c1":61343,"1f6c2":62738,"1f6c3":62739,"1f6c4":62740,"1f6c5":62741,"1f6cb":61338,"1f6cc":1644,"1f6cd":61133,"1f6ce":4944,"1f6cf":61337,"1f6d0":62776,"1f6d1":4920,"1f6d2":61357,"1f6d5":4851,"1f6d6":4828,"1f6d7":61334,"1f6e0":61298,"1f6e1":61304,"1f6e2":4914,"1f6e3":4912,"1f6e4":4913,"1f6e5":4929,"1f6e9":4932,"1f6eb":4933,"1f6ec":4934,"1f6f0":4941,"1f6f3":4927,"1f6f4":4908,"1f6f5":4903,"1f6f6":4925,"1f6f7":51076,"1f6f8":4943,"1f6f9":4909,"1f6fa":4906,"1f6fb":4897,"1f6fc":4910,"1f7e0":62917,"1f7e1":62918,"1f7e2":62919,"1f7e3":62921,"1f7e4":62922,"1f7e5":62925,"1f7e6":62929,"1f7e7":62926,"1f7e8":62927,"1f7e9":62928,"1f7ea":62930,"1f7eb":62931,"1f90c":1337,"1f90d":1149,"1f90e":1147,"1f90f":1338,"1f910":137,"1f911":129,"1f912":156,"1f913":171,"1f914":135,"1f915":157,"1f916":1114,"1f917":130,"1f918":1343,"1f919":1344,"1f91a":1328,"1f91b":1356,"1f91c":1357,"1f91d":1363,"1f91e":1340,"1f91f":1342,"1f920":167,"1f921":1108,"1f922":158,"1f923":17,"1f924":153,"1f925":149,"1f926-200d-2640":1440,"1f926-200d-2642":1439,"1f926":1438,"1f927":160,"1f928":138,"1f929":117,"1f92a":127,"1f92b":134,"1f92c":1102,"1f92d":131,"1f92e":159,"1f92f":166,"1f930":1519,"1f931":1522,"1f932":1362,"1f933":1367,"1f934":1506,"1f935-200d-2640":1515,"1f935-200d-2642":1514,"1f935":1513,"1f936":1528,"1f937-200d-2640":1443,"1f937-200d-2642":1442,"1f937":1441,"1f938-200d-2640":1627,"1f938-200d-2642":1626,"1f938":1625,"1f939-200d-2640":1639,"1f939-200d-2642":1638,"1f939":1637,"1f93a":1597,"1f93c-200d-2640":1630,"1f93c-200d-2642":1629,"1f93c":1628,"1f93d-200d-2640":1633,"1f93d-200d-2642":1632,"1f93d":1631,"1f93e-200d-2640":1636,"1f93e-200d-2642":1635,"1f93e":1634,"1f93f":51073,"1f940":2654,"1f941":61180,"1f942":3791,"1f943":3792,"1f944":3802,"1f945":51069,"1f947":51048,"1f948":51049,"1f949":51050,"1f94a":51067,"1f94b":51068,"1f94c":51077,"1f94d":51064,"1f94e":51053,"1f94f":51059,"1f950":3710,"1f951":3693,"1f952":3700,"1f953":3721,"1f954":3695,"1f955":3696,"1f956":3711,"1f957":3738,"1f958":3734,"1f959":3730,"1f95a":3732,"1f95b":3780,"1f95c":3706,"1f95d":3689,"1f95e":3715,"1f95f":3757,"1f960":3758,"1f961":3759,"1f962":3799,"1f963":3737,"1f964":3794,"1f965":3692,"1f966":3702,"1f967":3773,"1f968":3713,"1f969":3720,"1f96a":3726,"1f96b":3742,"1f96c":3701,"1f96d":3681,"1f96e":3755,"1f96f":3714,"1f970":115,"1f971":198,"1f972":123,"1f973":168,"1f974":163,"1f975":161,"1f976":162,"1f977":1501,"1f978":169,"1f97a":182,"1f97b":61124,"1f97c":61113,"1f97d":61112,"1f97e":61138,"1f97f":61139,"1f980":3760,"1f981":2545,"1f982":2643,"1f983":2594,"1f984":2551,"1f985":2603,"1f986":2604,"1f987":2583,"1f988":2628,"1f989":2606,"1f98a":2540,"1f98b":2633,"1f98c":2553,"1f98d":2532,"1f98e":2615,"1f98f":2572,"1f990":3762,"1f991":3763,"1f992":2569,"1f993":2552,"1f994":2582,"1f995":2619,"1f996":2620,"1f997":2639,"1f998":2591,"1f999":2568,"1f99a":2610,"1f99b":2573,"1f99c":2611,"1f99d":2541,"1f99e":3761,"1f99f":2644,"1f9a0":2647,"1f9a1":2592,"1f9a2":2605,"1f9a3":2571,"1f9a4":2607,"1f9a5":2588,"1f9a6":2589,"1f9a7":2533,"1f9a8":2590,"1f9a9":2609,"1f9aa":3764,"1f9ab":2581,"1f9ac":2554,"1f9ad":2624,"1f9ae":2536,"1f9af":61312,"1f9b4":1380,"1f9b5":1371,"1f9b6":1372,"1f9b7":1379,"1f9b8-200d-2640":1532,"1f9b8-200d-2642":1531,"1f9b8":1530,"1f9b9-200d-2640":1535,"1f9b9-200d-2642":1534,"1f9b9":1533,"1f9ba":61114,"1f9bb":1374,"1f9bc":4905,"1f9bd":4904,"1f9be":1369,"1f9bf":1370,"1f9c0":3717,"1f9c1":3772,"1f9c2":3741,"1f9c3":3796,"1f9c4":3703,"1f9c5":3704,"1f9c6":3731,"1f9c7":3716,"1f9c8":3740,"1f9c9":3797,"1f9ca":3798,"1f9cb":3795,"1f9cd-200d-2640":1569,"1f9cd-200d-2642":1568,"1f9cd":1567,"1f9ce-200d-2640":1572,"1f9ce-200d-2642":1571,"1f9ce":1570,"1f9cf-200d-2640":1434,"1f9cf-200d-2642":1433,"1f9cf":1432,"1f9d0":172,"1f9d1-200d-1f33e":1456,"1f9d1-200d-1f373":1459,"1f9d1-200d-1f37c":1525,"1f9d1-200d-1f384":1529,"1f9d1-200d-1f393":1447,"1f9d1-200d-1f3a4":1477,"1f9d1-200d-1f3a8":1480,"1f9d1-200d-1f3eb":1450,"1f9d1-200d-1f3ed":1465,"1f9d1-200d-1f4bb":1474,"1f9d1-200d-1f4bc":1468,"1f9d1-200d-1f527":1462,"1f9d1-200d-1f52c":1471,"1f9d1-200d-1f680":1486,"1f9d1-200d-1f692":1489,"1f9d1-200d-1f91d-200d-1f9d1":1645,"1f9d1-200d-1f9af":1573,"1f9d1-200d-1f9b0":1402,"1f9d1-200d-1f9b1":1404,"1f9d1-200d-1f9b2":1408,"1f9d1-200d-1f9b3":1406,"1f9d1-200d-1f9bc":1576,"1f9d1-200d-1f9bd":1579,"1f9d1-200d-2695":1444,"1f9d1-200d-2696":1453,"1f9d1-200d-2708":1483,"1f9d1":1390,"1f9d2":1387,"1f9d3":1411,"1f9d4-200d-2640":1395,"1f9d4-200d-2642":1394,"1f9d4":1393,"1f9d5":1512,"1f9d6-200d-2640":1593,"1f9d6-200d-2642":1592,"1f9d6":1591,"1f9d7-200d-2640":1596,"1f9d7-200d-2642":1595,"1f9d7":1594,"1f9d8-200d-2640":1642,"1f9d8-200d-2642":1641,"1f9d8":1640,"1f9d9-200d-2640":1538,"1f9d9-200d-2642":1537,"1f9d9":1536,"1f9da-200d-2640":1541,"1f9da-200d-2642":1540,"1f9da":1539,"1f9db-200d-2640":1544,"1f9db-200d-2642":1543,"1f9db":1542,"1f9dc-200d-2640":1547,"1f9dc-200d-2642":1546,"1f9dc":1545,"1f9dd-200d-2640":1550,"1f9dd-200d-2642":1549,"1f9dd":1548,"1f9de-200d-2640":1553,"1f9de-200d-2642":1552,"1f9de":1551,"1f9df-200d-2640":1556,"1f9df-200d-2642":1555,"1f9df":1554,"1f9e0":1376,"1f9e1":1142,"1f9e2":61148,"1f9e3":61118,"1f9e4":61119,"1f9e5":61120,"1f9e6":61121,"1f9e7":51039,"1f9e8":51028,"1f9e9":51090,"1f9ea":61320,"1f9eb":61321,"1f9ec":61322,"1f9ed":4812,"1f9ee":61201,"1f9ef":61356,"1f9f0":61316,"1f9f1":4825,"1f9f2":61317,"1f9f3":4945,"1f9f4":61346,"1f9f5":51106,"1f9f6":51108,"1f9f7":61347,"1f9f8":51091,"1f9f9":61348,"1f9fa":61349,"1f9fb":61350,"1f9fc":61352,"1f9fd":61355,"1f9fe":61243,"1f9ff":51084,"1fa70":61142,"1fa71":61125,"1fa72":61126,"1fa73":61127,"1fa74":61135,"1fa78":61327,"1fa79":61329,"1fa7a":61331,"1fa80":51079,"1fa81":51080,"1fa82":4935,"1fa83":61302,"1fa84":51083,"1fa85":51092,"1fa86":51094,"1fa90":4993,"1fa91":61339,"1fa92":61345,"1fa93":61295,"1fa94":61217,"1fa95":61179,"1fa96":61149,"1fa97":61174,"1fa98":61181,"1fa99":61236,"1fa9a":61305,"1fa9b":61307,"1fa9c":61318,"1fa9d":61315,"1fa9e":61335,"1fa9f":61336,"1faa0":61341,"1faa1":51107,"1faa2":51109,"1faa3":61351,"1faa4":61344,"1faa5":61354,"1faa6":61360,"1faa7":61363,"1faa8":4826,"1fab0":2645,"1fab1":2646,"1fab2":2637,"1fab3":2640,"1fab4":2660,"1fab5":4827,"1fab6":2608,"1fac0":1377,"1fac1":1378,"1fac2":1686,"1fad0":3688,"1fad1":3699,"1fad2":3691,"1fad3":3712,"1fad4":3729,"1fad5":3736,"1fad6":3782,"203c":62834,"21a9":62765,"21aa":62766,"231a":4948,"231b":4946,"23cf":62818,"23e9":62805,"23ea":62809,"23eb":62812,"23ec":62814,"23ed":62806,"23ee":62810,"23ef":62807,"23f0":4949,"23f1":4950,"23f2":4951,"23f3":4947,"23f8":62815,"23f9":62816,"23fa":62817,"24c2":62890,"25aa":62938,"25ab":62939,"25b6":62804,"25c0":62808,"25fb":62935,"25fc":62934,"25fd":62937,"25fe":62936,"260e":61184,"261d":1350,"262a":62784,"262e":62785,"262f":62781,"263a":120,"264a":62790,"264b":62791,"264c":62792,"264d":62793,"264e":62794,"264f":62795,"265f":51099,"267b":62844,"267e":62833,"267f":62732,"269b":62777,"269c":62845,"26a0":62742,"26a1":41016,"26a7":62827,"26aa":62924,"26ab":62923,"26b0":61359,"26b1":61361,"26bd":51051,"26be":51052,"26c4":41019,"26c5":4999,"26c8":41e3,"26ce":62800,"26cf":61296,"26d1":61150,"26d3":61314,"26d4":62744,"26e9":4853,"26ea":4849,"26f0":4814,"26f1":41015,"26f2":4855,"26f3":51070,"26f4":4928,"26f5":4924,"26f7":1599,"26f8":51071,"26f9-200d-2640":1615,"26f9-200d-2642":1614,"26f9":1613,"26fa":4856,"26fd":4915,"270a":1354,"270b":1330,"270c":1339,"270d":1365,"270f":61258,"271d":62782,"274c":62853,"274e":62854,"2764-200d-1f525":1139,"2764-200d-1fa79":1140,"27a1":62757,"27b0":62855,"27bf":62856,"2b05":62761,"2b06":62755,"2b07":62759,"2b1b":62932,"2b1c":62933,"2b50":4994,"2b55":62849,"303d":62857,"1f385-1f3fb":0,"1f385-1f3fc":0,"1f385-1f3fd":0,"1f385-1f3fe":0,"1f385-1f3ff":0,"1f3c2-1f3fb":0,"1f3c2-1f3fc":0,"1f3c2-1f3fd":0,"1f3c2-1f3fe":0,"1f3c2-1f3ff":0,"1f3c3-1f3fb-200d-2640":0,"1f3c3-1f3fc-200d-2640":0,"1f3c3-1f3fd-200d-2640":0,"1f3c3-1f3fe-200d-2640":0,"1f3c3-1f3ff-200d-2640":0,"1f3c3-1f3fb-200d-2642":0,"1f3c3-1f3fc-200d-2642":0,"1f3c3-1f3fd-200d-2642":0,"1f3c3-1f3fe-200d-2642":0,"1f3c3-1f3ff-200d-2642":0,"1f3c3-1f3fb":0,"1f3c3-1f3fc":0,"1f3c3-1f3fd":0,"1f3c3-1f3fe":0,"1f3c3-1f3ff":0,"1f3c4-1f3fb-200d-2640":0,"1f3c4-1f3fc-200d-2640":0,"1f3c4-1f3fd-200d-2640":0,"1f3c4-1f3fe-200d-2640":0,"1f3c4-1f3ff-200d-2640":0,"1f3c4-1f3fb-200d-2642":0,"1f3c4-1f3fc-200d-2642":0,"1f3c4-1f3fd-200d-2642":0,"1f3c4-1f3fe-200d-2642":0,"1f3c4-1f3ff-200d-2642":0,"1f3c4-1f3fb":0,"1f3c4-1f3fc":0,"1f3c4-1f3fd":0,"1f3c4-1f3fe":0,"1f3c4-1f3ff":0,"1f3c7-1f3fb":0,"1f3c7-1f3fc":0,"1f3c7-1f3fd":0,"1f3c7-1f3fe":0,"1f3c7-1f3ff":0,"1f3ca-1f3fb-200d-2640":0,"1f3ca-1f3fc-200d-2640":0,"1f3ca-1f3fd-200d-2640":0,"1f3ca-1f3fe-200d-2640":0,"1f3ca-1f3ff-200d-2640":0,"1f3ca-1f3fb-200d-2642":0,"1f3ca-1f3fc-200d-2642":0,"1f3ca-1f3fd-200d-2642":0,"1f3ca-1f3fe-200d-2642":0,"1f3ca-1f3ff-200d-2642":0,"1f3ca-1f3fb":0,"1f3ca-1f3fc":0,"1f3ca-1f3fd":0,"1f3ca-1f3fe":0,"1f3ca-1f3ff":0,"1f3cb-1f3fb-200d-2640":0,"1f3cb-1f3fc-200d-2640":0,"1f3cb-1f3fd-200d-2640":0,"1f3cb-1f3fe-200d-2640":0,"1f3cb-1f3ff-200d-2640":0,"1f3cb-1f3fb-200d-2642":0,"1f3cb-1f3fc-200d-2642":0,"1f3cb-1f3fd-200d-2642":0,"1f3cb-1f3fe-200d-2642":0,"1f3cb-1f3ff-200d-2642":0,"1f3cb-1f3fb":0,"1f3cb-1f3fc":0,"1f3cb-1f3fd":0,"1f3cb-1f3fe":0,"1f3cb-1f3ff":0,"1f3cc-1f3fb-200d-2640":0,"1f3cc-1f3fc-200d-2640":0,"1f3cc-1f3fd-200d-2640":0,"1f3cc-1f3fe-200d-2640":0,"1f3cc-1f3ff-200d-2640":0,"1f3cc-1f3fb-200d-2642":0,"1f3cc-1f3fc-200d-2642":0,"1f3cc-1f3fd-200d-2642":0,"1f3cc-1f3fe-200d-2642":0,"1f3cc-1f3ff-200d-2642":0,"1f3cc-1f3fb":0,"1f3cc-1f3fc":0,"1f3cc-1f3fd":0,"1f3cc-1f3fe":0,"1f3cc-1f3ff":0,"1f442-1f3fb":0,"1f442-1f3fc":0,"1f442-1f3fd":0,"1f442-1f3fe":0,"1f442-1f3ff":0,"1f443-1f3fb":0,"1f443-1f3fc":0,"1f443-1f3fd":0,"1f443-1f3fe":0,"1f443-1f3ff":0,"1f446-1f3fb":0,"1f446-1f3fc":0,"1f446-1f3fd":0,"1f446-1f3fe":0,"1f446-1f3ff":0,"1f447-1f3fb":0,"1f447-1f3fc":0,"1f447-1f3fd":0,"1f447-1f3fe":0,"1f447-1f3ff":0,"1f448-1f3fb":0,"1f448-1f3fc":0,"1f448-1f3fd":0,"1f448-1f3fe":0,"1f448-1f3ff":0,"1f449-1f3fb":0,"1f449-1f3fc":0,"1f449-1f3fd":0,"1f449-1f3fe":0,"1f449-1f3ff":0,"1f44a-1f3fb":0,"1f44a-1f3fc":0,"1f44a-1f3fd":0,"1f44a-1f3fe":0,"1f44a-1f3ff":0,"1f44b-1f3fb":0,"1f44b-1f3fc":0,"1f44b-1f3fd":0,"1f44b-1f3fe":0,"1f44b-1f3ff":0,"1f44c-1f3fb":0,"1f44c-1f3fc":0,"1f44c-1f3fd":0,"1f44c-1f3fe":0,"1f44c-1f3ff":0,"1f44d-1f3fb":0,"1f44d-1f3fc":0,"1f44d-1f3fd":0,"1f44d-1f3fe":0,"1f44d-1f3ff":0,"1f44e-1f3fb":0,"1f44e-1f3fc":0,"1f44e-1f3fd":0,"1f44e-1f3fe":0,"1f44e-1f3ff":0,"1f44f-1f3fb":0,"1f44f-1f3fc":0,"1f44f-1f3fd":0,"1f44f-1f3fe":0,"1f44f-1f3ff":0,"1f450-1f3fb":0,"1f450-1f3fc":0,"1f450-1f3fd":0,"1f450-1f3fe":0,"1f450-1f3ff":0,"1f466-1f3fb":0,"1f466-1f3fc":0,"1f466-1f3fd":0,"1f466-1f3fe":0,"1f466-1f3ff":0,"1f467-1f3fb":0,"1f467-1f3fc":0,"1f467-1f3fd":0,"1f467-1f3fe":0,"1f467-1f3ff":0,"1f468-1f3fb-200d-1f33e":0,"1f468-1f3fc-200d-1f33e":0,"1f468-1f3fd-200d-1f33e":0,"1f468-1f3fe-200d-1f33e":0,"1f468-1f3ff-200d-1f33e":0,"1f468-1f3fb-200d-1f373":0,"1f468-1f3fc-200d-1f373":0,"1f468-1f3fd-200d-1f373":0,"1f468-1f3fe-200d-1f373":0,"1f468-1f3ff-200d-1f373":0,"1f468-1f3fb-200d-1f37c":0,"1f468-1f3fc-200d-1f37c":0,"1f468-1f3fd-200d-1f37c":0,"1f468-1f3fe-200d-1f37c":0,"1f468-1f3ff-200d-1f37c":0,"1f468-1f3fb-200d-1f393":0,"1f468-1f3fc-200d-1f393":0,"1f468-1f3fd-200d-1f393":0,"1f468-1f3fe-200d-1f393":0,"1f468-1f3ff-200d-1f393":0,"1f468-1f3fb-200d-1f3a4":0,"1f468-1f3fc-200d-1f3a4":0,"1f468-1f3fd-200d-1f3a4":0,"1f468-1f3fe-200d-1f3a4":0,"1f468-1f3ff-200d-1f3a4":0,"1f468-1f3fb-200d-1f3a8":0,"1f468-1f3fc-200d-1f3a8":0,"1f468-1f3fd-200d-1f3a8":0,"1f468-1f3fe-200d-1f3a8":0,"1f468-1f3ff-200d-1f3a8":0,"1f468-1f3fb-200d-1f3eb":0,"1f468-1f3fc-200d-1f3eb":0,"1f468-1f3fd-200d-1f3eb":0,"1f468-1f3fe-200d-1f3eb":0,"1f468-1f3ff-200d-1f3eb":0,"1f468-1f3fb-200d-1f3ed":0,"1f468-1f3fc-200d-1f3ed":0,"1f468-1f3fd-200d-1f3ed":0,"1f468-1f3fe-200d-1f3ed":0,"1f468-1f3ff-200d-1f3ed":0,"1f468-1f3fb-200d-1f4bb":0,"1f468-1f3fc-200d-1f4bb":0,"1f468-1f3fd-200d-1f4bb":0,"1f468-1f3fe-200d-1f4bb":0,"1f468-1f3ff-200d-1f4bb":0,"1f468-1f3fb-200d-1f4bc":0,"1f468-1f3fc-200d-1f4bc":0,"1f468-1f3fd-200d-1f4bc":0,"1f468-1f3fe-200d-1f4bc":0,"1f468-1f3ff-200d-1f4bc":0,"1f468-1f3fb-200d-1f527":0,"1f468-1f3fc-200d-1f527":0,"1f468-1f3fd-200d-1f527":0,"1f468-1f3fe-200d-1f527":0,"1f468-1f3ff-200d-1f527":0,"1f468-1f3fb-200d-1f52c":0,"1f468-1f3fc-200d-1f52c":0,"1f468-1f3fd-200d-1f52c":0,"1f468-1f3fe-200d-1f52c":0,"1f468-1f3ff-200d-1f52c":0,"1f468-1f3fb-200d-1f680":0,"1f468-1f3fc-200d-1f680":0,"1f468-1f3fd-200d-1f680":0,"1f468-1f3fe-200d-1f680":0,"1f468-1f3ff-200d-1f680":0,"1f468-1f3fb-200d-1f692":0,"1f468-1f3fc-200d-1f692":0,"1f468-1f3fd-200d-1f692":0,"1f468-1f3fe-200d-1f692":0,"1f468-1f3ff-200d-1f692":0,"1f468-1f3fb-200d-1f9af":0,"1f468-1f3fc-200d-1f9af":0,"1f468-1f3fd-200d-1f9af":0,"1f468-1f3fe-200d-1f9af":0,"1f468-1f3ff-200d-1f9af":0,"1f468-1f3fb-200d-1f9b0":0,"1f468-1f3fc-200d-1f9b0":0,"1f468-1f3fd-200d-1f9b0":0,"1f468-1f3fe-200d-1f9b0":0,"1f468-1f3ff-200d-1f9b0":0,"1f468-1f3fb-200d-1f9b1":0,"1f468-1f3fc-200d-1f9b1":0,"1f468-1f3fd-200d-1f9b1":0,"1f468-1f3fe-200d-1f9b1":0,"1f468-1f3ff-200d-1f9b1":0,"1f468-1f3fb-200d-1f9b2":0,"1f468-1f3fc-200d-1f9b2":0,"1f468-1f3fd-200d-1f9b2":0,"1f468-1f3fe-200d-1f9b2":0,"1f468-1f3ff-200d-1f9b2":0,"1f468-1f3fb-200d-1f9b3":0,"1f468-1f3fc-200d-1f9b3":0,"1f468-1f3fd-200d-1f9b3":0,"1f468-1f3fe-200d-1f9b3":0,"1f468-1f3ff-200d-1f9b3":0,"1f468-1f3fb-200d-1f9bc":0,"1f468-1f3fc-200d-1f9bc":0,"1f468-1f3fd-200d-1f9bc":0,"1f468-1f3fe-200d-1f9bc":0,"1f468-1f3ff-200d-1f9bc":0,"1f468-1f3fb-200d-1f9bd":0,"1f468-1f3fc-200d-1f9bd":0,"1f468-1f3fd-200d-1f9bd":0,"1f468-1f3fe-200d-1f9bd":0,"1f468-1f3ff-200d-1f9bd":0,"1f468-1f3fb-200d-2695":0,"1f468-1f3fc-200d-2695":0,"1f468-1f3fd-200d-2695":0,"1f468-1f3fe-200d-2695":0,"1f468-1f3ff-200d-2695":0,"1f468-1f3fb-200d-2696":0,"1f468-1f3fc-200d-2696":0,"1f468-1f3fd-200d-2696":0,"1f468-1f3fe-200d-2696":0,"1f468-1f3ff-200d-2696":0,"1f468-1f3fb-200d-2708":0,"1f468-1f3fc-200d-2708":0,"1f468-1f3fd-200d-2708":0,"1f468-1f3fe-200d-2708":0,"1f468-1f3ff-200d-2708":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fb":0,"1f468-1f3fc":0,"1f468-1f3fd":0,"1f468-1f3fe":0,"1f468-1f3ff":0,"1f469-1f3fb-200d-1f33e":0,"1f469-1f3fc-200d-1f33e":0,"1f469-1f3fd-200d-1f33e":0,"1f469-1f3fe-200d-1f33e":0,"1f469-1f3ff-200d-1f33e":0,"1f469-1f3fb-200d-1f373":0,"1f469-1f3fc-200d-1f373":0,"1f469-1f3fd-200d-1f373":0,"1f469-1f3fe-200d-1f373":0,"1f469-1f3ff-200d-1f373":0,"1f469-1f3fb-200d-1f37c":0,"1f469-1f3fc-200d-1f37c":0,"1f469-1f3fd-200d-1f37c":0,"1f469-1f3fe-200d-1f37c":0,"1f469-1f3ff-200d-1f37c":0,"1f469-1f3fb-200d-1f393":0,"1f469-1f3fc-200d-1f393":0,"1f469-1f3fd-200d-1f393":0,"1f469-1f3fe-200d-1f393":0,"1f469-1f3ff-200d-1f393":0,"1f469-1f3fb-200d-1f3a4":0,"1f469-1f3fc-200d-1f3a4":0,"1f469-1f3fd-200d-1f3a4":0,"1f469-1f3fe-200d-1f3a4":0,"1f469-1f3ff-200d-1f3a4":0,"1f469-1f3fb-200d-1f3a8":0,"1f469-1f3fc-200d-1f3a8":0,"1f469-1f3fd-200d-1f3a8":0,"1f469-1f3fe-200d-1f3a8":0,"1f469-1f3ff-200d-1f3a8":0,"1f469-1f3fb-200d-1f3eb":0,"1f469-1f3fc-200d-1f3eb":0,"1f469-1f3fd-200d-1f3eb":0,"1f469-1f3fe-200d-1f3eb":0,"1f469-1f3ff-200d-1f3eb":0,"1f469-1f3fb-200d-1f3ed":0,"1f469-1f3fc-200d-1f3ed":0,"1f469-1f3fd-200d-1f3ed":0,"1f469-1f3fe-200d-1f3ed":0,"1f469-1f3ff-200d-1f3ed":0,"1f469-1f3fb-200d-1f4bb":0,"1f469-1f3fc-200d-1f4bb":0,"1f469-1f3fd-200d-1f4bb":0,"1f469-1f3fe-200d-1f4bb":0,"1f469-1f3ff-200d-1f4bb":0,"1f469-1f3fb-200d-1f4bc":0,"1f469-1f3fc-200d-1f4bc":0,"1f469-1f3fd-200d-1f4bc":0,"1f469-1f3fe-200d-1f4bc":0,"1f469-1f3ff-200d-1f4bc":0,"1f469-1f3fb-200d-1f527":0,"1f469-1f3fc-200d-1f527":0,"1f469-1f3fd-200d-1f527":0,"1f469-1f3fe-200d-1f527":0,"1f469-1f3ff-200d-1f527":0,"1f469-1f3fb-200d-1f52c":0,"1f469-1f3fc-200d-1f52c":0,"1f469-1f3fd-200d-1f52c":0,"1f469-1f3fe-200d-1f52c":0,"1f469-1f3ff-200d-1f52c":0,"1f469-1f3fb-200d-1f680":0,"1f469-1f3fc-200d-1f680":0,"1f469-1f3fd-200d-1f680":0,"1f469-1f3fe-200d-1f680":0,"1f469-1f3ff-200d-1f680":0,"1f469-1f3fb-200d-1f692":0,"1f469-1f3fc-200d-1f692":0,"1f469-1f3fd-200d-1f692":0,"1f469-1f3fe-200d-1f692":0,"1f469-1f3ff-200d-1f692":0,"1f469-1f3fb-200d-1f9af":0,"1f469-1f3fc-200d-1f9af":0,"1f469-1f3fd-200d-1f9af":0,"1f469-1f3fe-200d-1f9af":0,"1f469-1f3ff-200d-1f9af":0,"1f469-1f3fb-200d-1f9b0":0,"1f469-1f3fc-200d-1f9b0":0,"1f469-1f3fd-200d-1f9b0":0,"1f469-1f3fe-200d-1f9b0":0,"1f469-1f3ff-200d-1f9b0":0,"1f469-1f3fb-200d-1f9b1":0,"1f469-1f3fc-200d-1f9b1":0,"1f469-1f3fd-200d-1f9b1":0,"1f469-1f3fe-200d-1f9b1":0,"1f469-1f3ff-200d-1f9b1":0,"1f469-1f3fb-200d-1f9b2":0,"1f469-1f3fc-200d-1f9b2":0,"1f469-1f3fd-200d-1f9b2":0,"1f469-1f3fe-200d-1f9b2":0,"1f469-1f3ff-200d-1f9b2":0,"1f469-1f3fb-200d-1f9b3":0,"1f469-1f3fc-200d-1f9b3":0,"1f469-1f3fd-200d-1f9b3":0,"1f469-1f3fe-200d-1f9b3":0,"1f469-1f3ff-200d-1f9b3":0,"1f469-1f3fb-200d-1f9bc":0,"1f469-1f3fc-200d-1f9bc":0,"1f469-1f3fd-200d-1f9bc":0,"1f469-1f3fe-200d-1f9bc":0,"1f469-1f3ff-200d-1f9bc":0,"1f469-1f3fb-200d-1f9bd":0,"1f469-1f3fc-200d-1f9bd":0,"1f469-1f3fd-200d-1f9bd":0,"1f469-1f3fe-200d-1f9bd":0,"1f469-1f3ff-200d-1f9bd":0,"1f469-1f3fb-200d-2695":0,"1f469-1f3fc-200d-2695":0,"1f469-1f3fd-200d-2695":0,"1f469-1f3fe-200d-2695":0,"1f469-1f3ff-200d-2695":0,"1f469-1f3fb-200d-2696":0,"1f469-1f3fc-200d-2696":0,"1f469-1f3fd-200d-2696":0,"1f469-1f3fe-200d-2696":0,"1f469-1f3ff-200d-2696":0,"1f469-1f3fb-200d-2708":0,"1f469-1f3fc-200d-2708":0,"1f469-1f3fd-200d-2708":0,"1f469-1f3fe-200d-2708":0,"1f469-1f3ff-200d-2708":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fb":0,"1f469-1f3fc":0,"1f469-1f3fd":0,"1f469-1f3fe":0,"1f469-1f3ff":0,"1f46b-1f3fb":0,"1f46b-1f3fc":0,"1f46b-1f3fd":0,"1f46b-1f3fe":0,"1f46b-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46c-1f3fb":0,"1f46c-1f3fc":0,"1f46c-1f3fd":0,"1f46c-1f3fe":0,"1f46c-1f3ff":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46d-1f3fb":0,"1f46d-1f3fc":0,"1f46d-1f3fd":0,"1f46d-1f3fe":0,"1f46d-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe":0,"1f46e-1f3fb-200d-2640":0,"1f46e-1f3fc-200d-2640":0,"1f46e-1f3fd-200d-2640":0,"1f46e-1f3fe-200d-2640":0,"1f46e-1f3ff-200d-2640":0,"1f46e-1f3fb-200d-2642":0,"1f46e-1f3fc-200d-2642":0,"1f46e-1f3fd-200d-2642":0,"1f46e-1f3fe-200d-2642":0,"1f46e-1f3ff-200d-2642":0,"1f46e-1f3fb":0,"1f46e-1f3fc":0,"1f46e-1f3fd":0,"1f46e-1f3fe":0,"1f46e-1f3ff":0,"1f470-1f3fb-200d-2640":0,"1f470-1f3fc-200d-2640":0,"1f470-1f3fd-200d-2640":0,"1f470-1f3fe-200d-2640":0,"1f470-1f3ff-200d-2640":0,"1f470-1f3fb-200d-2642":0,"1f470-1f3fc-200d-2642":0,"1f470-1f3fd-200d-2642":0,"1f470-1f3fe-200d-2642":0,"1f470-1f3ff-200d-2642":0,"1f470-1f3fb":0,"1f470-1f3fc":0,"1f470-1f3fd":0,"1f470-1f3fe":0,"1f470-1f3ff":0,"1f471-1f3fb-200d-2640":0,"1f471-1f3fc-200d-2640":0,"1f471-1f3fd-200d-2640":0,"1f471-1f3fe-200d-2640":0,"1f471-1f3ff-200d-2640":0,"1f471-1f3fb-200d-2642":0,"1f471-1f3fc-200d-2642":0,"1f471-1f3fd-200d-2642":0,"1f471-1f3fe-200d-2642":0,"1f471-1f3ff-200d-2642":0,"1f471-1f3fb":0,"1f471-1f3fc":0,"1f471-1f3fd":0,"1f471-1f3fe":0,"1f471-1f3ff":0,"1f472-1f3fb":0,"1f472-1f3fc":0,"1f472-1f3fd":0,"1f472-1f3fe":0,"1f472-1f3ff":0,"1f473-1f3fb-200d-2640":0,"1f473-1f3fc-200d-2640":0,"1f473-1f3fd-200d-2640":0,"1f473-1f3fe-200d-2640":0,"1f473-1f3ff-200d-2640":0,"1f473-1f3fb-200d-2642":0,"1f473-1f3fc-200d-2642":0,"1f473-1f3fd-200d-2642":0,"1f473-1f3fe-200d-2642":0,"1f473-1f3ff-200d-2642":0,"1f473-1f3fb":0,"1f473-1f3fc":0,"1f473-1f3fd":0,"1f473-1f3fe":0,"1f473-1f3ff":0,"1f474-1f3fb":0,"1f474-1f3fc":0,"1f474-1f3fd":0,"1f474-1f3fe":0,"1f474-1f3ff":0,"1f475-1f3fb":0,"1f475-1f3fc":0,"1f475-1f3fd":0,"1f475-1f3fe":0,"1f475-1f3ff":0,"1f476-1f3fb":0,"1f476-1f3fc":0,"1f476-1f3fd":0,"1f476-1f3fe":0,"1f476-1f3ff":0,"1f477-1f3fb-200d-2640":0,"1f477-1f3fc-200d-2640":0,"1f477-1f3fd-200d-2640":0,"1f477-1f3fe-200d-2640":0,"1f477-1f3ff-200d-2640":0,"1f477-1f3fb-200d-2642":0,"1f477-1f3fc-200d-2642":0,"1f477-1f3fd-200d-2642":0,"1f477-1f3fe-200d-2642":0,"1f477-1f3ff-200d-2642":0,"1f477-1f3fb":0,"1f477-1f3fc":0,"1f477-1f3fd":0,"1f477-1f3fe":0,"1f477-1f3ff":0,"1f478-1f3fb":0,"1f478-1f3fc":0,"1f478-1f3fd":0,"1f478-1f3fe":0,"1f478-1f3ff":0,"1f47c-1f3fb":0,"1f47c-1f3fc":0,"1f47c-1f3fd":0,"1f47c-1f3fe":0,"1f47c-1f3ff":0,"1f481-1f3fb-200d-2640":0,"1f481-1f3fc-200d-2640":0,"1f481-1f3fd-200d-2640":0,"1f481-1f3fe-200d-2640":0,"1f481-1f3ff-200d-2640":0,"1f481-1f3fb-200d-2642":0,"1f481-1f3fc-200d-2642":0,"1f481-1f3fd-200d-2642":0,"1f481-1f3fe-200d-2642":0,"1f481-1f3ff-200d-2642":0,"1f481-1f3fb":0,"1f481-1f3fc":0,"1f481-1f3fd":0,"1f481-1f3fe":0,"1f481-1f3ff":0,"1f482-1f3fb-200d-2640":0,"1f482-1f3fc-200d-2640":0,"1f482-1f3fd-200d-2640":0,"1f482-1f3fe-200d-2640":0,"1f482-1f3ff-200d-2640":0,"1f482-1f3fb-200d-2642":0,"1f482-1f3fc-200d-2642":0,"1f482-1f3fd-200d-2642":0,"1f482-1f3fe-200d-2642":0,"1f482-1f3ff-200d-2642":0,"1f482-1f3fb":0,"1f482-1f3fc":0,"1f482-1f3fd":0,"1f482-1f3fe":0,"1f482-1f3ff":0,"1f483-1f3fb":0,"1f483-1f3fc":0,"1f483-1f3fd":0,"1f483-1f3fe":0,"1f483-1f3ff":0,"1f485-1f3fb":0,"1f485-1f3fc":0,"1f485-1f3fd":0,"1f485-1f3fe":0,"1f485-1f3ff":0,"1f486-1f3fb-200d-2640":0,"1f486-1f3fc-200d-2640":0,"1f486-1f3fd-200d-2640":0,"1f486-1f3fe-200d-2640":0,"1f486-1f3ff-200d-2640":0,"1f486-1f3fb-200d-2642":0,"1f486-1f3fc-200d-2642":0,"1f486-1f3fd-200d-2642":0,"1f486-1f3fe-200d-2642":0,"1f486-1f3ff-200d-2642":0,"1f486-1f3fb":0,"1f486-1f3fc":0,"1f486-1f3fd":0,"1f486-1f3fe":0,"1f486-1f3ff":0,"1f487-1f3fb-200d-2640":0,"1f487-1f3fc-200d-2640":0,"1f487-1f3fd-200d-2640":0,"1f487-1f3fe-200d-2640":0,"1f487-1f3ff-200d-2640":0,"1f487-1f3fb-200d-2642":0,"1f487-1f3fc-200d-2642":0,"1f487-1f3fd-200d-2642":0,"1f487-1f3fe-200d-2642":0,"1f487-1f3ff-200d-2642":0,"1f487-1f3fb":0,"1f487-1f3fc":0,"1f487-1f3fd":0,"1f487-1f3fe":0,"1f487-1f3ff":0,"1f48f-1f3fb":0,"1f48f-1f3fc":0,"1f48f-1f3fd":0,"1f48f-1f3fe":0,"1f48f-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f491-1f3fb":0,"1f491-1f3fc":0,"1f491-1f3fd":0,"1f491-1f3fe":0,"1f491-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe":0,"1f4aa-1f3fb":0,"1f4aa-1f3fc":0,"1f4aa-1f3fd":0,"1f4aa-1f3fe":0,"1f4aa-1f3ff":0,"1f574-1f3fb":0,"1f574-1f3fc":0,"1f574-1f3fd":0,"1f574-1f3fe":0,"1f574-1f3ff":0,"1f575-1f3fb-200d-2640":0,"1f575-1f3fc-200d-2640":0,"1f575-1f3fd-200d-2640":0,"1f575-1f3fe-200d-2640":0,"1f575-1f3ff-200d-2640":0,"1f575-1f3fb-200d-2642":0,"1f575-1f3fc-200d-2642":0,"1f575-1f3fd-200d-2642":0,"1f575-1f3fe-200d-2642":0,"1f575-1f3ff-200d-2642":0,"1f575-1f3fb":0,"1f575-1f3fc":0,"1f575-1f3fd":0,"1f575-1f3fe":0,"1f575-1f3ff":0,"1f57a-1f3fb":0,"1f57a-1f3fc":0,"1f57a-1f3fd":0,"1f57a-1f3fe":0,"1f57a-1f3ff":0,"1f590-1f3fb":0,"1f590-1f3fc":0,"1f590-1f3fd":0,"1f590-1f3fe":0,"1f590-1f3ff":0,"1f595-1f3fb":0,"1f595-1f3fc":0,"1f595-1f3fd":0,"1f595-1f3fe":0,"1f595-1f3ff":0,"1f596-1f3fb":0,"1f596-1f3fc":0,"1f596-1f3fd":0,"1f596-1f3fe":0,"1f596-1f3ff":0,"1f645-1f3fb-200d-2640":0,"1f645-1f3fc-200d-2640":0,"1f645-1f3fd-200d-2640":0,"1f645-1f3fe-200d-2640":0,"1f645-1f3ff-200d-2640":0,"1f645-1f3fb-200d-2642":0,"1f645-1f3fc-200d-2642":0,"1f645-1f3fd-200d-2642":0,"1f645-1f3fe-200d-2642":0,"1f645-1f3ff-200d-2642":0,"1f645-1f3fb":0,"1f645-1f3fc":0,"1f645-1f3fd":0,"1f645-1f3fe":0,"1f645-1f3ff":0,"1f646-1f3fb-200d-2640":0,"1f646-1f3fc-200d-2640":0,"1f646-1f3fd-200d-2640":0,"1f646-1f3fe-200d-2640":0,"1f646-1f3ff-200d-2640":0,"1f646-1f3fb-200d-2642":0,"1f646-1f3fc-200d-2642":0,"1f646-1f3fd-200d-2642":0,"1f646-1f3fe-200d-2642":0,"1f646-1f3ff-200d-2642":0,"1f646-1f3fb":0,"1f646-1f3fc":0,"1f646-1f3fd":0,"1f646-1f3fe":0,"1f646-1f3ff":0,"1f647-1f3fb-200d-2640":0,"1f647-1f3fc-200d-2640":0,"1f647-1f3fd-200d-2640":0,"1f647-1f3fe-200d-2640":0,"1f647-1f3ff-200d-2640":0,"1f647-1f3fb-200d-2642":0,"1f647-1f3fc-200d-2642":0,"1f647-1f3fd-200d-2642":0,"1f647-1f3fe-200d-2642":0,"1f647-1f3ff-200d-2642":0,"1f647-1f3fb":0,"1f647-1f3fc":0,"1f647-1f3fd":0,"1f647-1f3fe":0,"1f647-1f3ff":0,"1f64b-1f3fb-200d-2640":0,"1f64b-1f3fc-200d-2640":0,"1f64b-1f3fd-200d-2640":0,"1f64b-1f3fe-200d-2640":0,"1f64b-1f3ff-200d-2640":0,"1f64b-1f3fb-200d-2642":0,"1f64b-1f3fc-200d-2642":0,"1f64b-1f3fd-200d-2642":0,"1f64b-1f3fe-200d-2642":0,"1f64b-1f3ff-200d-2642":0,"1f64b-1f3fb":0,"1f64b-1f3fc":0,"1f64b-1f3fd":0,"1f64b-1f3fe":0,"1f64b-1f3ff":0,"1f64c-1f3fb":0,"1f64c-1f3fc":0,"1f64c-1f3fd":0,"1f64c-1f3fe":0,"1f64c-1f3ff":0,"1f64d-1f3fb-200d-2640":0,"1f64d-1f3fc-200d-2640":0,"1f64d-1f3fd-200d-2640":0,"1f64d-1f3fe-200d-2640":0,"1f64d-1f3ff-200d-2640":0,"1f64d-1f3fb-200d-2642":0,"1f64d-1f3fc-200d-2642":0,"1f64d-1f3fd-200d-2642":0,"1f64d-1f3fe-200d-2642":0,"1f64d-1f3ff-200d-2642":0,"1f64d-1f3fb":0,"1f64d-1f3fc":0,"1f64d-1f3fd":0,"1f64d-1f3fe":0,"1f64d-1f3ff":0,"1f64e-1f3fb-200d-2640":0,"1f64e-1f3fc-200d-2640":0,"1f64e-1f3fd-200d-2640":0,"1f64e-1f3fe-200d-2640":0,"1f64e-1f3ff-200d-2640":0,"1f64e-1f3fb-200d-2642":0,"1f64e-1f3fc-200d-2642":0,"1f64e-1f3fd-200d-2642":0,"1f64e-1f3fe-200d-2642":0,"1f64e-1f3ff-200d-2642":0,"1f64e-1f3fb":0,"1f64e-1f3fc":0,"1f64e-1f3fd":0,"1f64e-1f3fe":0,"1f64e-1f3ff":0,"1f64f-1f3fb":0,"1f64f-1f3fc":0,"1f64f-1f3fd":0,"1f64f-1f3fe":0,"1f64f-1f3ff":0,"1f6a3-1f3fb-200d-2640":0,"1f6a3-1f3fc-200d-2640":0,"1f6a3-1f3fd-200d-2640":0,"1f6a3-1f3fe-200d-2640":0,"1f6a3-1f3ff-200d-2640":0,"1f6a3-1f3fb-200d-2642":0,"1f6a3-1f3fc-200d-2642":0,"1f6a3-1f3fd-200d-2642":0,"1f6a3-1f3fe-200d-2642":0,"1f6a3-1f3ff-200d-2642":0,"1f6a3-1f3fb":0,"1f6a3-1f3fc":0,"1f6a3-1f3fd":0,"1f6a3-1f3fe":0,"1f6a3-1f3ff":0,"1f6b4-1f3fb-200d-2640":0,"1f6b4-1f3fc-200d-2640":0,"1f6b4-1f3fd-200d-2640":0,"1f6b4-1f3fe-200d-2640":0,"1f6b4-1f3ff-200d-2640":0,"1f6b4-1f3fb-200d-2642":0,"1f6b4-1f3fc-200d-2642":0,"1f6b4-1f3fd-200d-2642":0,"1f6b4-1f3fe-200d-2642":0,"1f6b4-1f3ff-200d-2642":0,"1f6b4-1f3fb":0,"1f6b4-1f3fc":0,"1f6b4-1f3fd":0,"1f6b4-1f3fe":0,"1f6b4-1f3ff":0,"1f6b5-1f3fb-200d-2640":0,"1f6b5-1f3fc-200d-2640":0,"1f6b5-1f3fd-200d-2640":0,"1f6b5-1f3fe-200d-2640":0,"1f6b5-1f3ff-200d-2640":0,"1f6b5-1f3fb-200d-2642":0,"1f6b5-1f3fc-200d-2642":0,"1f6b5-1f3fd-200d-2642":0,"1f6b5-1f3fe-200d-2642":0,"1f6b5-1f3ff-200d-2642":0,"1f6b5-1f3fb":0,"1f6b5-1f3fc":0,"1f6b5-1f3fd":0,"1f6b5-1f3fe":0,"1f6b5-1f3ff":0,"1f6b6-1f3fb-200d-2640":0,"1f6b6-1f3fc-200d-2640":0,"1f6b6-1f3fd-200d-2640":0,"1f6b6-1f3fe-200d-2640":0,"1f6b6-1f3ff-200d-2640":0,"1f6b6-1f3fb-200d-2642":0,"1f6b6-1f3fc-200d-2642":0,"1f6b6-1f3fd-200d-2642":0,"1f6b6-1f3fe-200d-2642":0,"1f6b6-1f3ff-200d-2642":0,"1f6b6-1f3fb":0,"1f6b6-1f3fc":0,"1f6b6-1f3fd":0,"1f6b6-1f3fe":0,"1f6b6-1f3ff":0,"1f6c0-1f3fb":0,"1f6c0-1f3fc":0,"1f6c0-1f3fd":0,"1f6c0-1f3fe":0,"1f6c0-1f3ff":0,"1f6cc-1f3fb":0,"1f6cc-1f3fc":0,"1f6cc-1f3fd":0,"1f6cc-1f3fe":0,"1f6cc-1f3ff":0,"1f90c-1f3fb":0,"1f90c-1f3fc":0,"1f90c-1f3fd":0,"1f90c-1f3fe":0,"1f90c-1f3ff":0,"1f90f-1f3fb":0,"1f90f-1f3fc":0,"1f90f-1f3fd":0,"1f90f-1f3fe":0,"1f90f-1f3ff":0,"1f918-1f3fb":0,"1f918-1f3fc":0,"1f918-1f3fd":0,"1f918-1f3fe":0,"1f918-1f3ff":0,"1f919-1f3fb":0,"1f919-1f3fc":0,"1f919-1f3fd":0,"1f919-1f3fe":0,"1f919-1f3ff":0,"1f91a-1f3fb":0,"1f91a-1f3fc":0,"1f91a-1f3fd":0,"1f91a-1f3fe":0,"1f91a-1f3ff":0,"1f91b-1f3fb":0,"1f91b-1f3fc":0,"1f91b-1f3fd":0,"1f91b-1f3fe":0,"1f91b-1f3ff":0,"1f91c-1f3fb":0,"1f91c-1f3fc":0,"1f91c-1f3fd":0,"1f91c-1f3fe":0,"1f91c-1f3ff":0,"1f91d-1f3fb":0,"1f91d-1f3fc":0,"1f91d-1f3fd":0,"1f91d-1f3fe":0,"1f91d-1f3ff":0,"1f91e-1f3fb":0,"1f91e-1f3fc":0,"1f91e-1f3fd":0,"1f91e-1f3fe":0,"1f91e-1f3ff":0,"1f91f-1f3fb":0,"1f91f-1f3fc":0,"1f91f-1f3fd":0,"1f91f-1f3fe":0,"1f91f-1f3ff":0,"1f926-1f3fb-200d-2640":0,"1f926-1f3fc-200d-2640":0,"1f926-1f3fd-200d-2640":0,"1f926-1f3fe-200d-2640":0,"1f926-1f3ff-200d-2640":0,"1f926-1f3fb-200d-2642":0,"1f926-1f3fc-200d-2642":0,"1f926-1f3fd-200d-2642":0,"1f926-1f3fe-200d-2642":0,"1f926-1f3ff-200d-2642":0,"1f926-1f3fb":0,"1f926-1f3fc":0,"1f926-1f3fd":0,"1f926-1f3fe":0,"1f926-1f3ff":0,"1f930-1f3fb":0,"1f930-1f3fc":0,"1f930-1f3fd":0,"1f930-1f3fe":0,"1f930-1f3ff":0,"1f931-1f3fb":0,"1f931-1f3fc":0,"1f931-1f3fd":0,"1f931-1f3fe":0,"1f931-1f3ff":0,"1f932-1f3fb":0,"1f932-1f3fc":0,"1f932-1f3fd":0,"1f932-1f3fe":0,"1f932-1f3ff":0,"1f933-1f3fb":0,"1f933-1f3fc":0,"1f933-1f3fd":0,"1f933-1f3fe":0,"1f933-1f3ff":0,"1f934-1f3fb":0,"1f934-1f3fc":0,"1f934-1f3fd":0,"1f934-1f3fe":0,"1f934-1f3ff":0,"1f935-1f3fb-200d-2640":0,"1f935-1f3fc-200d-2640":0,"1f935-1f3fd-200d-2640":0,"1f935-1f3fe-200d-2640":0,"1f935-1f3ff-200d-2640":0,"1f935-1f3fb-200d-2642":0,"1f935-1f3fc-200d-2642":0,"1f935-1f3fd-200d-2642":0,"1f935-1f3fe-200d-2642":0,"1f935-1f3ff-200d-2642":0,"1f935-1f3fb":0,"1f935-1f3fc":0,"1f935-1f3fd":0,"1f935-1f3fe":0,"1f935-1f3ff":0,"1f936-1f3fb":0,"1f936-1f3fc":0,"1f936-1f3fd":0,"1f936-1f3fe":0,"1f936-1f3ff":0,"1f937-1f3fb-200d-2640":0,"1f937-1f3fc-200d-2640":0,"1f937-1f3fd-200d-2640":0,"1f937-1f3fe-200d-2640":0,"1f937-1f3ff-200d-2640":0,"1f937-1f3fb-200d-2642":0,"1f937-1f3fc-200d-2642":0,"1f937-1f3fd-200d-2642":0,"1f937-1f3fe-200d-2642":0,"1f937-1f3ff-200d-2642":0,"1f937-1f3fb":0,"1f937-1f3fc":0,"1f937-1f3fd":0,"1f937-1f3fe":0,"1f937-1f3ff":0,"1f938-1f3fb-200d-2640":0,"1f938-1f3fc-200d-2640":0,"1f938-1f3fd-200d-2640":0,"1f938-1f3fe-200d-2640":0,"1f938-1f3ff-200d-2640":0,"1f938-1f3fb-200d-2642":0,"1f938-1f3fc-200d-2642":0,"1f938-1f3fd-200d-2642":0,"1f938-1f3fe-200d-2642":0,"1f938-1f3ff-200d-2642":0,"1f938-1f3fb":0,"1f938-1f3fc":0,"1f938-1f3fd":0,"1f938-1f3fe":0,"1f938-1f3ff":0,"1f939-1f3fb-200d-2640":0,"1f939-1f3fc-200d-2640":0,"1f939-1f3fd-200d-2640":0,"1f939-1f3fe-200d-2640":0,"1f939-1f3ff-200d-2640":0,"1f939-1f3fb-200d-2642":0,"1f939-1f3fc-200d-2642":0,"1f939-1f3fd-200d-2642":0,"1f939-1f3fe-200d-2642":0,"1f939-1f3ff-200d-2642":0,"1f939-1f3fb":0,"1f939-1f3fc":0,"1f939-1f3fd":0,"1f939-1f3fe":0,"1f939-1f3ff":0,"1f93d-1f3fb-200d-2640":0,"1f93d-1f3fc-200d-2640":0,"1f93d-1f3fd-200d-2640":0,"1f93d-1f3fe-200d-2640":0,"1f93d-1f3ff-200d-2640":0,"1f93d-1f3fb-200d-2642":0,"1f93d-1f3fc-200d-2642":0,"1f93d-1f3fd-200d-2642":0,"1f93d-1f3fe-200d-2642":0,"1f93d-1f3ff-200d-2642":0,"1f93d-1f3fb":0,"1f93d-1f3fc":0,"1f93d-1f3fd":0,"1f93d-1f3fe":0,"1f93d-1f3ff":0,"1f93e-1f3fb-200d-2640":0,"1f93e-1f3fc-200d-2640":0,"1f93e-1f3fd-200d-2640":0,"1f93e-1f3fe-200d-2640":0,"1f93e-1f3ff-200d-2640":0,"1f93e-1f3fb-200d-2642":0,"1f93e-1f3fc-200d-2642":0,"1f93e-1f3fd-200d-2642":0,"1f93e-1f3fe-200d-2642":0,"1f93e-1f3ff-200d-2642":0,"1f93e-1f3fb":0,"1f93e-1f3fc":0,"1f93e-1f3fd":0,"1f93e-1f3fe":0,"1f93e-1f3ff":0,"1f977-1f3fb":0,"1f977-1f3fc":0,"1f977-1f3fd":0,"1f977-1f3fe":0,"1f977-1f3ff":0,"1f9b5-1f3fb":0,"1f9b5-1f3fc":0,"1f9b5-1f3fd":0,"1f9b5-1f3fe":0,"1f9b5-1f3ff":0,"1f9b6-1f3fb":0,"1f9b6-1f3fc":0,"1f9b6-1f3fd":0,"1f9b6-1f3fe":0,"1f9b6-1f3ff":0,"1f9b8-1f3fb-200d-2640":0,"1f9b8-1f3fc-200d-2640":0,"1f9b8-1f3fd-200d-2640":0,"1f9b8-1f3fe-200d-2640":0,"1f9b8-1f3ff-200d-2640":0,"1f9b8-1f3fb-200d-2642":0,"1f9b8-1f3fc-200d-2642":0,"1f9b8-1f3fd-200d-2642":0,"1f9b8-1f3fe-200d-2642":0,"1f9b8-1f3ff-200d-2642":0,"1f9b8-1f3fb":0,"1f9b8-1f3fc":0,"1f9b8-1f3fd":0,"1f9b8-1f3fe":0,"1f9b8-1f3ff":0,"1f9b9-1f3fb-200d-2640":0,"1f9b9-1f3fc-200d-2640":0,"1f9b9-1f3fd-200d-2640":0,"1f9b9-1f3fe-200d-2640":0,"1f9b9-1f3ff-200d-2640":0,"1f9b9-1f3fb-200d-2642":0,"1f9b9-1f3fc-200d-2642":0,"1f9b9-1f3fd-200d-2642":0,"1f9b9-1f3fe-200d-2642":0,"1f9b9-1f3ff-200d-2642":0,"1f9b9-1f3fb":0,"1f9b9-1f3fc":0,"1f9b9-1f3fd":0,"1f9b9-1f3fe":0,"1f9b9-1f3ff":0,"1f9bb-1f3fb":0,"1f9bb-1f3fc":0,"1f9bb-1f3fd":0,"1f9bb-1f3fe":0,"1f9bb-1f3ff":0,"1f9cd-1f3fb-200d-2640":0,"1f9cd-1f3fc-200d-2640":0,"1f9cd-1f3fd-200d-2640":0,"1f9cd-1f3fe-200d-2640":0,"1f9cd-1f3ff-200d-2640":0,"1f9cd-1f3fb-200d-2642":0,"1f9cd-1f3fc-200d-2642":0,"1f9cd-1f3fd-200d-2642":0,"1f9cd-1f3fe-200d-2642":0,"1f9cd-1f3ff-200d-2642":0,"1f9cd-1f3fb":0,"1f9cd-1f3fc":0,"1f9cd-1f3fd":0,"1f9cd-1f3fe":0,"1f9cd-1f3ff":0,"1f9ce-1f3fb-200d-2640":0,"1f9ce-1f3fc-200d-2640":0,"1f9ce-1f3fd-200d-2640":0,"1f9ce-1f3fe-200d-2640":0,"1f9ce-1f3ff-200d-2640":0,"1f9ce-1f3fb-200d-2642":0,"1f9ce-1f3fc-200d-2642":0,"1f9ce-1f3fd-200d-2642":0,"1f9ce-1f3fe-200d-2642":0,"1f9ce-1f3ff-200d-2642":0,"1f9ce-1f3fb":0,"1f9ce-1f3fc":0,"1f9ce-1f3fd":0,"1f9ce-1f3fe":0,"1f9ce-1f3ff":0,"1f9cf-1f3fb-200d-2640":0,"1f9cf-1f3fc-200d-2640":0,"1f9cf-1f3fd-200d-2640":0,"1f9cf-1f3fe-200d-2640":0,"1f9cf-1f3ff-200d-2640":0,"1f9cf-1f3fb-200d-2642":0,"1f9cf-1f3fc-200d-2642":0,"1f9cf-1f3fd-200d-2642":0,"1f9cf-1f3fe-200d-2642":0,"1f9cf-1f3ff-200d-2642":0,"1f9cf-1f3fb":0,"1f9cf-1f3fc":0,"1f9cf-1f3fd":0,"1f9cf-1f3fe":0,"1f9cf-1f3ff":0,"1f9d1-1f3fb-200d-1f33e":0,"1f9d1-1f3fc-200d-1f33e":0,"1f9d1-1f3fd-200d-1f33e":0,"1f9d1-1f3fe-200d-1f33e":0,"1f9d1-1f3ff-200d-1f33e":0,"1f9d1-1f3fb-200d-1f373":0,"1f9d1-1f3fc-200d-1f373":0,"1f9d1-1f3fd-200d-1f373":0,"1f9d1-1f3fe-200d-1f373":0,"1f9d1-1f3ff-200d-1f373":0,"1f9d1-1f3fb-200d-1f37c":0,"1f9d1-1f3fc-200d-1f37c":0,"1f9d1-1f3fd-200d-1f37c":0,"1f9d1-1f3fe-200d-1f37c":0,"1f9d1-1f3ff-200d-1f37c":0,"1f9d1-1f3fb-200d-1f384":0,"1f9d1-1f3fc-200d-1f384":0,"1f9d1-1f3fd-200d-1f384":0,"1f9d1-1f3fe-200d-1f384":0,"1f9d1-1f3ff-200d-1f384":0,"1f9d1-1f3fb-200d-1f393":0,"1f9d1-1f3fc-200d-1f393":0,"1f9d1-1f3fd-200d-1f393":0,"1f9d1-1f3fe-200d-1f393":0,"1f9d1-1f3ff-200d-1f393":0,"1f9d1-1f3fb-200d-1f3a4":0,"1f9d1-1f3fc-200d-1f3a4":0,"1f9d1-1f3fd-200d-1f3a4":0,"1f9d1-1f3fe-200d-1f3a4":0,"1f9d1-1f3ff-200d-1f3a4":0,"1f9d1-1f3fb-200d-1f3a8":0,"1f9d1-1f3fc-200d-1f3a8":0,"1f9d1-1f3fd-200d-1f3a8":0,"1f9d1-1f3fe-200d-1f3a8":0,"1f9d1-1f3ff-200d-1f3a8":0,"1f9d1-1f3fb-200d-1f3eb":0,"1f9d1-1f3fc-200d-1f3eb":0,"1f9d1-1f3fd-200d-1f3eb":0,"1f9d1-1f3fe-200d-1f3eb":0,"1f9d1-1f3ff-200d-1f3eb":0,"1f9d1-1f3fb-200d-1f3ed":0,"1f9d1-1f3fc-200d-1f3ed":0,"1f9d1-1f3fd-200d-1f3ed":0,"1f9d1-1f3fe-200d-1f3ed":0,"1f9d1-1f3ff-200d-1f3ed":0,"1f9d1-1f3fb-200d-1f4bb":0,"1f9d1-1f3fc-200d-1f4bb":0,"1f9d1-1f3fd-200d-1f4bb":0,"1f9d1-1f3fe-200d-1f4bb":0,"1f9d1-1f3ff-200d-1f4bb":0,"1f9d1-1f3fb-200d-1f4bc":0,"1f9d1-1f3fc-200d-1f4bc":0,"1f9d1-1f3fd-200d-1f4bc":0,"1f9d1-1f3fe-200d-1f4bc":0,"1f9d1-1f3ff-200d-1f4bc":0,"1f9d1-1f3fb-200d-1f527":0,"1f9d1-1f3fc-200d-1f527":0,"1f9d1-1f3fd-200d-1f527":0,"1f9d1-1f3fe-200d-1f527":0,"1f9d1-1f3ff-200d-1f527":0,"1f9d1-1f3fb-200d-1f52c":0,"1f9d1-1f3fc-200d-1f52c":0,"1f9d1-1f3fd-200d-1f52c":0,"1f9d1-1f3fe-200d-1f52c":0,"1f9d1-1f3ff-200d-1f52c":0,"1f9d1-1f3fb-200d-1f680":0,"1f9d1-1f3fc-200d-1f680":0,"1f9d1-1f3fd-200d-1f680":0,"1f9d1-1f3fe-200d-1f680":0,"1f9d1-1f3ff-200d-1f680":0,"1f9d1-1f3fb-200d-1f692":0,"1f9d1-1f3fc-200d-1f692":0,"1f9d1-1f3fd-200d-1f692":0,"1f9d1-1f3fe-200d-1f692":0,"1f9d1-1f3ff-200d-1f692":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fb-200d-1f9af":0,"1f9d1-1f3fc-200d-1f9af":0,"1f9d1-1f3fd-200d-1f9af":0,"1f9d1-1f3fe-200d-1f9af":0,"1f9d1-1f3ff-200d-1f9af":0,"1f9d1-1f3fb-200d-1f9b0":0,"1f9d1-1f3fc-200d-1f9b0":0,"1f9d1-1f3fd-200d-1f9b0":0,"1f9d1-1f3fe-200d-1f9b0":0,"1f9d1-1f3ff-200d-1f9b0":0,"1f9d1-1f3fb-200d-1f9b1":0,"1f9d1-1f3fc-200d-1f9b1":0,"1f9d1-1f3fd-200d-1f9b1":0,"1f9d1-1f3fe-200d-1f9b1":0,"1f9d1-1f3ff-200d-1f9b1":0,"1f9d1-1f3fb-200d-1f9b2":0,"1f9d1-1f3fc-200d-1f9b2":0,"1f9d1-1f3fd-200d-1f9b2":0,"1f9d1-1f3fe-200d-1f9b2":0,"1f9d1-1f3ff-200d-1f9b2":0,"1f9d1-1f3fb-200d-1f9b3":0,"1f9d1-1f3fc-200d-1f9b3":0,"1f9d1-1f3fd-200d-1f9b3":0,"1f9d1-1f3fe-200d-1f9b3":0,"1f9d1-1f3ff-200d-1f9b3":0,"1f9d1-1f3fb-200d-1f9bc":0,"1f9d1-1f3fc-200d-1f9bc":0,"1f9d1-1f3fd-200d-1f9bc":0,"1f9d1-1f3fe-200d-1f9bc":0,"1f9d1-1f3ff-200d-1f9bc":0,"1f9d1-1f3fb-200d-1f9bd":0,"1f9d1-1f3fc-200d-1f9bd":0,"1f9d1-1f3fd-200d-1f9bd":0,"1f9d1-1f3fe-200d-1f9bd":0,"1f9d1-1f3ff-200d-1f9bd":0,"1f9d1-1f3fb-200d-2695":0,"1f9d1-1f3fc-200d-2695":0,"1f9d1-1f3fd-200d-2695":0,"1f9d1-1f3fe-200d-2695":0,"1f9d1-1f3ff-200d-2695":0,"1f9d1-1f3fb-200d-2696":0,"1f9d1-1f3fc-200d-2696":0,"1f9d1-1f3fd-200d-2696":0,"1f9d1-1f3fe-200d-2696":0,"1f9d1-1f3ff-200d-2696":0,"1f9d1-1f3fb-200d-2708":0,"1f9d1-1f3fc-200d-2708":0,"1f9d1-1f3fd-200d-2708":0,"1f9d1-1f3fe-200d-2708":0,"1f9d1-1f3ff-200d-2708":0,"1f9d1-1f3fb":0,"1f9d1-1f3fc":0,"1f9d1-1f3fd":0,"1f9d1-1f3fe":0,"1f9d1-1f3ff":0,"1f9d2-1f3fb":0,"1f9d2-1f3fc":0,"1f9d2-1f3fd":0,"1f9d2-1f3fe":0,"1f9d2-1f3ff":0,"1f9d3-1f3fb":0,"1f9d3-1f3fc":0,"1f9d3-1f3fd":0,"1f9d3-1f3fe":0,"1f9d3-1f3ff":0,"1f9d4-1f3fb-200d-2640":0,"1f9d4-1f3fc-200d-2640":0,"1f9d4-1f3fd-200d-2640":0,"1f9d4-1f3fe-200d-2640":0,"1f9d4-1f3ff-200d-2640":0,"1f9d4-1f3fb-200d-2642":0,"1f9d4-1f3fc-200d-2642":0,"1f9d4-1f3fd-200d-2642":0,"1f9d4-1f3fe-200d-2642":0,"1f9d4-1f3ff-200d-2642":0,"1f9d4-1f3fb":0,"1f9d4-1f3fc":0,"1f9d4-1f3fd":0,"1f9d4-1f3fe":0,"1f9d4-1f3ff":0,"1f9d5-1f3fb":0,"1f9d5-1f3fc":0,"1f9d5-1f3fd":0,"1f9d5-1f3fe":0,"1f9d5-1f3ff":0,"1f9d6-1f3fb-200d-2640":0,"1f9d6-1f3fc-200d-2640":0,"1f9d6-1f3fd-200d-2640":0,"1f9d6-1f3fe-200d-2640":0,"1f9d6-1f3ff-200d-2640":0,"1f9d6-1f3fb-200d-2642":0,"1f9d6-1f3fc-200d-2642":0,"1f9d6-1f3fd-200d-2642":0,"1f9d6-1f3fe-200d-2642":0,"1f9d6-1f3ff-200d-2642":0,"1f9d6-1f3fb":0,"1f9d6-1f3fc":0,"1f9d6-1f3fd":0,"1f9d6-1f3fe":0,"1f9d6-1f3ff":0,"1f9d7-1f3fb-200d-2640":0,"1f9d7-1f3fc-200d-2640":0,"1f9d7-1f3fd-200d-2640":0,"1f9d7-1f3fe-200d-2640":0,"1f9d7-1f3ff-200d-2640":0,"1f9d7-1f3fb-200d-2642":0,"1f9d7-1f3fc-200d-2642":0,"1f9d7-1f3fd-200d-2642":0,"1f9d7-1f3fe-200d-2642":0,"1f9d7-1f3ff-200d-2642":0,"1f9d7-1f3fb":0,"1f9d7-1f3fc":0,"1f9d7-1f3fd":0,"1f9d7-1f3fe":0,"1f9d7-1f3ff":0,"1f9d8-1f3fb-200d-2640":0,"1f9d8-1f3fc-200d-2640":0,"1f9d8-1f3fd-200d-2640":0,"1f9d8-1f3fe-200d-2640":0,"1f9d8-1f3ff-200d-2640":0,"1f9d8-1f3fb-200d-2642":0,"1f9d8-1f3fc-200d-2642":0,"1f9d8-1f3fd-200d-2642":0,"1f9d8-1f3fe-200d-2642":0,"1f9d8-1f3ff-200d-2642":0,"1f9d8-1f3fb":0,"1f9d8-1f3fc":0,"1f9d8-1f3fd":0,"1f9d8-1f3fe":0,"1f9d8-1f3ff":0,"1f9d9-1f3fb-200d-2640":0,"1f9d9-1f3fc-200d-2640":0,"1f9d9-1f3fd-200d-2640":0,"1f9d9-1f3fe-200d-2640":0,"1f9d9-1f3ff-200d-2640":0,"1f9d9-1f3fb-200d-2642":0,"1f9d9-1f3fc-200d-2642":0,"1f9d9-1f3fd-200d-2642":0,"1f9d9-1f3fe-200d-2642":0,"1f9d9-1f3ff-200d-2642":0,"1f9d9-1f3fb":0,"1f9d9-1f3fc":0,"1f9d9-1f3fd":0,"1f9d9-1f3fe":0,"1f9d9-1f3ff":0,"1f9da-1f3fb-200d-2640":0,"1f9da-1f3fc-200d-2640":0,"1f9da-1f3fd-200d-2640":0,"1f9da-1f3fe-200d-2640":0,"1f9da-1f3ff-200d-2640":0,"1f9da-1f3fb-200d-2642":0,"1f9da-1f3fc-200d-2642":0,"1f9da-1f3fd-200d-2642":0,"1f9da-1f3fe-200d-2642":0,"1f9da-1f3ff-200d-2642":0,"1f9da-1f3fb":0,"1f9da-1f3fc":0,"1f9da-1f3fd":0,"1f9da-1f3fe":0,"1f9da-1f3ff":0,"1f9db-1f3fb-200d-2640":0,"1f9db-1f3fc-200d-2640":0,"1f9db-1f3fd-200d-2640":0,"1f9db-1f3fe-200d-2640":0,"1f9db-1f3ff-200d-2640":0,"1f9db-1f3fb-200d-2642":0,"1f9db-1f3fc-200d-2642":0,"1f9db-1f3fd-200d-2642":0,"1f9db-1f3fe-200d-2642":0,"1f9db-1f3ff-200d-2642":0,"1f9db-1f3fb":0,"1f9db-1f3fc":0,"1f9db-1f3fd":0,"1f9db-1f3fe":0,"1f9db-1f3ff":0,"1f9dc-1f3fb-200d-2640":0,"1f9dc-1f3fc-200d-2640":0,"1f9dc-1f3fd-200d-2640":0,"1f9dc-1f3fe-200d-2640":0,"1f9dc-1f3ff-200d-2640":0,"1f9dc-1f3fb-200d-2642":0,"1f9dc-1f3fc-200d-2642":0,"1f9dc-1f3fd-200d-2642":0,"1f9dc-1f3fe-200d-2642":0,"1f9dc-1f3ff-200d-2642":0,"1f9dc-1f3fb":0,"1f9dc-1f3fc":0,"1f9dc-1f3fd":0,"1f9dc-1f3fe":0,"1f9dc-1f3ff":0,"1f9dd-1f3fb-200d-2640":0,"1f9dd-1f3fc-200d-2640":0,"1f9dd-1f3fd-200d-2640":0,"1f9dd-1f3fe-200d-2640":0,"1f9dd-1f3ff-200d-2640":0,"1f9dd-1f3fb-200d-2642":0,"1f9dd-1f3fc-200d-2642":0,"1f9dd-1f3fd-200d-2642":0,"1f9dd-1f3fe-200d-2642":0,"1f9dd-1f3ff-200d-2642":0,"1f9dd-1f3fb":0,"1f9dd-1f3fc":0,"1f9dd-1f3fd":0,"1f9dd-1f3fe":0,"1f9dd-1f3ff":0,"261d-1f3fb":0,"261d-1f3fc":0,"261d-1f3fd":0,"261d-1f3fe":0,"261d-1f3ff":0,"26f9-1f3fb-200d-2640":0,"26f9-1f3fc-200d-2640":0,"26f9-1f3fd-200d-2640":0,"26f9-1f3fe-200d-2640":0,"26f9-1f3ff-200d-2640":0,"26f9-1f3fb-200d-2642":0,"26f9-1f3fc-200d-2642":0,"26f9-1f3fd-200d-2642":0,"26f9-1f3fe-200d-2642":0,"26f9-1f3ff-200d-2642":0,"26f9-1f3fb":0,"26f9-1f3fc":0,"26f9-1f3fd":0,"26f9-1f3fe":0,"26f9-1f3ff":0,"270a-1f3fb":0,"270a-1f3fc":0,"270a-1f3fd":0,"270a-1f3fe":0,"270a-1f3ff":0,"270b-1f3fb":0,"270b-1f3fc":0,"270b-1f3fd":0,"270b-1f3fe":0,"270b-1f3ff":0,"270c-1f3fb":0,"270c-1f3fc":0,"270c-1f3fd":0,"270c-1f3fe":0,"270c-1f3ff":0,"270d-1f3fb":0,"270d-1f3fc":0,"270d-1f3fd":0,"270d-1f3fe":0,"270d-1f3ff":0}},n=s[""];for(const e in s)e&&Object.assign(n,s[e]);const a=n},3189:(e,t,i)=>{"use strict";i.d(t,{Bf:()=>n,U9:()=>a,bt:()=>s});const s='Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif',n="16px",a="400"},356:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s="undefined"!=typeof ImageBitmap},5296:(e,t,i)=>{"use strict";i.d(t,{Kx:()=>r,cK:()=>d,jt:()=>l});var s=i(3035),n=i(3725);const a=new Map;function o(e){return a.get(e)}function r(e){const t=o(e);t&&(t.isCancelled=!0,t.deferred.resolve())}function d(e,t,i){return i||(i=function(e){r(e);const t={isCancelled:!1,deferred:(0,n.Z)()};return a.set(e,t),t.deferred.then((()=>{o(e)===t&&a.delete(e)})),t}(t)),(0,s.T2)((()=>{i.isCancelled||(e()?d(e,t,i):i.deferred.resolve())})),i.deferred}function l(e){(0,s.T2)((()=>{e()&&l(e)}))}},2353:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function n(e,t){return s(this,void 0,void 0,(function*(){const i=e.map(((e,i,n)=>s(this,void 0,void 0,(function*(){if(yield t(e,i,n))return e}))));return(yield Promise.all(i)).filter(Boolean)}))}},8847:(e,t,i)=>{"use strict";function s(e,t){const i=[];let s=-1;for(;-1!==(s=e.findIndex(t));)i.push(e.splice(s,1)[0]);return i}i.d(t,{Z:()=>s})},5916:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e){this.assets=e,this.tempId=0}playSound(e,t=!1){++this.tempId,this.assetName=e;try{const i=this.createAudio();i.autoplay=!0,i.src="assets/audio/"+e,i.loop=t,i.play()}catch(t){console.error("playSound",e,t)}}playSoundIfDifferent(e,t){this.assetName!==e&&this.playSound(e,t)}createAudio(){let{audio:e}=this;return e||(e=this.audio=new Audio,e.play(),e)}stopSound(){this.audio&&this.audio.pause()}cancelDelayedPlay(){++this.tempId}playSoundWithTimeout(e,t,i){const s=++this.tempId;setTimeout((()=>{this.tempId===s&&this.playSound(e,t)}),i)}}},8678:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3019);function n(e){return(0,s.Z)(e,"readAsDataURL")}},6705:(e,t,i)=>{"use strict";i.d(t,{Z:()=>m});var s=i(3725),n=i(8594),a=i(3035);const o=[];let r=!1;function d(e,t="push"){if(!e.items.length)return Promise.resolve([]);const i=e.promise=(0,s.Z)();return o[t](e),l(),i}function l(){r||function(e){if(!e.items.length)return e.promise.resolve([]),Promise.resolve([]);const t=e.items.slice(),i=[];return new Promise(((s,o)=>{const r=()=>{return d=this,l=void 0,h=function*(){const d=performance.now();do{yield(0,n.e9)();const s=e.process.apply(e.context,t.shift());let a;if(s instanceof Promise)try{a=yield s}catch(e){return void o(e)}else a=s;i.push(a)}while(t.length>0&&performance.now()-d<6);t.length>0?(0,a.T2)(r):s(i)},new((c=void 0)||(c=Promise))((function(e,t){function i(e){try{n(h.next(e))}catch(e){t(e)}}function s(e){try{n(h.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof c?n:new c((function(e){e(n)}))).then(i,s)}n((h=h.apply(d,l||[])).next())}));var d,l,c,h};(0,a.T2)(r)})).then(e.promise.resolve,e.promise.reject)}(o.shift()).finally((()=>{r=!1,o.length&&l()}))}var c=i(6663);let h,u;function p(e,t,i,s=document.createElement("canvas")){s.width=e.width,s.height=e.height;const n=s.getContext("2d",{alpha:!1});return c.Z?(n.filter=`blur(${t}px)`,n.drawImage(e,2*-t,2*-t,s.width+4*t,s.height+4*t)):(n.drawImage(e,0,0),u(n,0,0,s.width,s.height,t,i)),s}h=c.Z?Promise.resolve():i.e(77).then(i.bind(i,7077)).then((e=>{u=e.default}));const f=new Map;function m(e,t=2,i=2){if(!e)throw"no dataUri for blur: "+e;f.size>150&&f.clear();const s=document.createElement("canvas");s.className="canvas-thumbnail";let n=f.get(e);if(n)s.width=n.canvas.width,s.height=n.canvas.height,n.promise.then((()=>{s.getContext("2d").drawImage(n.canvas,0,0,s.width,s.height)}));else{const a=new Promise((n=>{h.then((()=>{const a=new Image;a.onload=()=>{d({items:[[a,t,i,s]],context:null,process:p},"unshift").then((()=>{n()}))},a.src=e}))}));f.set(e,n={canvas:s,promise:a})}return Object.assign(Object.assign({},n),{canvas:s})}},4059:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,o:()=>d});var s=i(4762),n=i(3306),a=i(9818);const o=(0,n.Z)("ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00"),r=(0,n.Z)("ffd9");function d(e){const t="base64,",i=e.slice(e.indexOf(t)+t.length),s=[...atob(i)].map((e=>e.charCodeAt(0)));return new Uint8Array(s)}function l(e,t=!1){let i,n;t||1!==e[0]?i=(0,a.Z)(e):(i=new Uint8Array(o.concat(Array.from(e.slice(3)),r)),i[164]=e[1],i[166]=e[2]),n=t?s.IS_SAFARI?"image/png":"image/webp":"image/jpeg";const d=function(e,t="image/jpeg"){return`data:${t};base64,${btoa(String.fromCharCode(...e))}`}(i,n);return d}},9897:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(410),n=i(9405);function a(e,t,i,s,a=!0){if(ei/s?r=t*i/e|0:(o=e*s/t|0,o>i&&(r=r*i/o|0,o=i)),a&&o>=e&&r>=t&&(o=e,r=t),(0,n.C)(o,r)}s.GO.calcImageInBox=a},8097:(e,t,i)=>{"use strict";let s;function n(e,t){if(!s){const e=document.createElement("canvas");s=e.getContext("2d",{alpha:!1})}return s.font!==t&&(s.font=t),s.measureText(e).width}i.d(t,{Z:()=>n})},7814:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(356);function n(e){return new Promise((t=>{return i=this,n=void 0,o=function*(){var i,n,a;const o=document.createElement("canvas"),r=null!==(i=e.size)&&void 0!==i?i:e.mediaSize.aspectFitted(e.boxSize),d=window.devicePixelRatio&&1;o.width=r.width*d,o.height=r.height*d;const l=o.getContext("2d");let c;c=s.Z?yield createImageBitmap(e.media,{resizeWidth:r.width,resizeHeight:r.height}):e.media,l.drawImage(c,0,0,o.width,o.height),s.Z&&(null==c||c.close());const h=null!==(n=e.mimeType)&&void 0!==n?n:"image/jpeg",u=null!==(a=e.quality)&&void 0!==a?a:1;if(e.toDataURL){const e=o.toDataURL(h,u);t({url:e,size:r})}else o.toBlob((e=>{t({blob:e,size:r})}),h,u)},new((a=void 0)||(a=Promise))((function(e,t){function s(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}d((o=o.apply(i,n||[])).next())}));var i,n,a,o}))}},467:(e,t,i)=>{"use strict";i.d(t,{ST:()=>r,ZP:()=>d,gV:()=>l});var s=i(5813);const n=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,a=/^\s+|\s$/g,o={й:"q",ц:"w",у:"e",к:"r",е:"t",н:"y",г:"u",ш:"i",щ:"o",з:"p",х:"[",ъ:"]",ф:"a",ы:"s",в:"d",а:"f",п:"g",р:"h",о:"j",л:"k",д:"l",ж:";",э:"'",я:"z",ч:"x",с:"c",м:"v",и:"b",т:"n",ь:"m",б:",",ю:".",".":"/"};function r(e){return e.replace(n,"").replace(a,"")}function d(e,t=!0){return l(e,{clearBadChars:!0,latinize:t,ignoreCase:!0})}function l(e,t={}){const i=t.includeTag&&"%"===e.charAt(0),n=e;return t.clearBadChars&&(e=r(e)),t.latinize&&(e=function(e){return e.replace(/[^A-Za-z0-9]/g,(e=>{const t=s.Z[e];return null!=t?t:e}))}(e)),t.ignoreCase&&(e=e.toLowerCase()),i&&(e="%"+e),t.latinize&&(e+=""+function(e){return e.toLowerCase().replace(/[\wа-я]/g,(e=>{const t=o[e];return null!=t?t:e}))}(n)),e}},2166:(e,t,i)=>{"use strict";function s(e){var t=document.createElement("textarea");t.value=e,t.style.top="0",t.style.left="0",t.style.position="fixed",document.body.appendChild(t),t.focus(),t.select();try{document.execCommand("copy")}catch(e){}document.body.removeChild(t)}function n(e){navigator.clipboard?navigator.clipboard.writeText(e).catch((t=>{console.error("clipboard error",t),s(e)})):s(e)}i.d(t,{T:()=>n})},3416:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(5432),n=i(4755),a=i(2296);class o extends a.Z{constructor(){super("menu",!0),this.onMouseMove=e=>{const t=this.element.getBoundingClientRect(),{clientX:i,clientY:s}=e,n=i>=t.right?i-t.right:t.left-i,a=s>=t.bottom?s-t.bottom:t.top-s;(n>=100||a>=100)&&this.close()},n.Z.addEventListener("resize",(()=>{this.element&&this.close()}))}isOpened(){return!!this.element}close(){this.element&&(this.element.classList.remove("active"),this.element.parentElement.classList.remove("menu-open")),super.close(),s.Z||window.removeEventListener("mousemove",this.onMouseMove)}openBtnMenu(e,t){super.open(e),this.element.classList.add("active"),this.element.parentElement.classList.add("menu-open"),t&&this.addEventListener("toggle",t,{once:!0}),s.Z||window.addEventListener("mousemove",this.onMouseMove)}}const r=new o},632:(e,t,i)=>{"use strict";i.d(t,{OD:()=>h,fl:()=>S,mr:()=>u,rz:()=>c,s2:()=>r,xE:()=>p,zM:()=>l});var s=i(410),n=i(2325);const a=["January","February","March","April","May","June","July","August","September","October","November","December"],o=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],r=86400,d=e=>{const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),i=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-i);const s=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-s.getTime())/r+1)/7)};function l(e){const t=new Date,i=t.getTime()/1e3|0,s=e.getTime()/1e3|0,a={};return i-s{const i=t.monthAsNumber?".":" ",s=("0"+e.getHours()).slice(-2)+":"+("0"+e.getMinutes()).slice(-2)+(t.noSeconds?"":":"+("0"+e.getSeconds()).slice(-2));return(t.leadingZero?("0"+e.getDate()).slice(-2):e.getDate())+i+(t.monthAsNumber?("0"+(e.getMonth()+1)).slice(-2):a[e.getMonth()])+i+e.getFullYear()+(t.noTime?"":", "+s)},f=2013,m=new RegExp("20[0-9]{1,2}"),g=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),v=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),b=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),y=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),w=[31,29,31,30,31,30,31,31,30,31,30,31];function S(e,t){const i=e.trim().toLowerCase();if(i.length<3)return;if(0==="today".indexOf(i)){const e=new Date,i=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(i,s,n),e.setHours(0,0,0);const a=e.getTime();e.setFullYear(i,s,n+1),e.setHours(0,0,0);const o=e.getTime()-1;return void t.push({title:"Today",minDate:a,maxDate:o})}if(0==="yesterday".indexOf(i)){const e=new Date,i=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(i,s,n),e.setHours(0,0,0);const a=e.getTime()-864e5;e.setFullYear(i,s,n+1),e.setHours(0,0,0);const o=e.getTime()-86400001;return void t.push({title:"Yesterday",minDate:a,maxDate:o})}const s=function(e){const t=new Date;if(e.length<=3)return-1;for(let i=0;i<7;i++)if(t.setDate(t.getDate()+1),0===P(t.getTime()).toLowerCase().indexOf(e))return t.getDay();return-1}(i);if(s>=0){const e=new Date,i=e.getTime(),n=s-e.getDay();e.setDate(e.getDate()+n),e.getTime()>i&&e.setTime(e.getTime()-6048e5);const a=e.getFullYear(),o=e.getMonth(),r=e.getDate();e.setFullYear(a,o,r),e.setHours(0,0,0);const d=e.getTime();e.setFullYear(a,o,r+1),e.setHours(0,0,0);const l=e.getTime()-1;return void t.push({title:P(d),minDate:d,maxDate:l})}let n;if(null===(n=b.exec(i)))if(null===(n=y.exec(i)))if(null===(n=m.exec(i))){if(null!==(n=g.exec(i))){const e=n[1],i=n[2],s=k(e);if(s>=0){const e=+i;if(e>0&&e<=31)return void L(t,e-1,s);if(e>=f)return void C(t,s,e)}}if(null!==(n=v.exec(i))){const e=n[1],i=k(n[2]);if(i>=0){const s=+e;if(s>0&&s<=31)return void L(t,s-1,i);s>=f&&C(t,i,s)}}}else{let e=+i;const s=(new Date).getFullYear();if(e=e;i--){const e=new Date;e.setFullYear(i,0,1),e.setHours(0,0,0);const s=e.getTime();e.setFullYear(i+1,0,1),e.setHours(0,0,0);const n=e.getTime()-1;t.push({title:""+i,minDate:s,maxDate:n})}}else if(e<=s){const i=new Date;i.setFullYear(e,0,1),i.setHours(0,0,0);const s=i.getTime();i.setFullYear(e+1,0,1),i.setHours(0,0,0);const n=i.getTime()-1;t.push({title:""+e,minDate:s,maxDate:n})}}else{const e=n[1],i=n[3],s=n[5];if(!n[2]===n[4])return;const a=parseInt(e),o=parseInt(i)-1;let r=parseInt(s);r>=10&&r<=99&&(r+=2e3);const d=(new Date).getFullYear();if(Z(a-1,o)&&r>=f&&r<=d){const e=new Date;e.setFullYear(r,o,a),e.setHours(0,0,0);const i=e.getTime();e.setFullYear(r,o,a+1),e.setHours(0,0,0);const s=e.getTime()-1;return void t.push({title:M(i),minDate:i,maxDate:s})}}else{const e=n[1],i=n[3],s=parseInt(e),a=parseInt(i);if(s>0&&s<=31){if(a>=f&&s<=12)return void C(t,s-1,a);a<=12&&L(t,s-1,a-1)}else s>=f&&a<=12&&C(t,a-1,s)}}function C(e,t,i){const s=(new Date).getFullYear(),n=Date.now();if(i>=f&&i<=s){const s=new Date;s.setFullYear(i,t,1),s.setHours(0,0,0);const a=s.getTime();if(a>n)return;s.setMonth(s.getMonth()+1);const o=s.getTime()-1;e.push({title:E(a),minDate:a,maxDate:o})}}function L(e,t,i){if(Z(t,i)){const n=(new Date).getFullYear(),a=Date.now();for(let o=n;o>=f;o--){if(1===i&&28===t&&((s=o)%4!=0||s%100==0)&&s%400!=0)continue;const r=new Date;r.setFullYear(o,i,t+1),r.setHours(0,0,0);const d=r.getTime();if(d>a)continue;r.setFullYear(o,i,t+2),r.setHours(0,0,0);const l=r.getTime()-1;o===n?e.push({title:I(d),minDate:d,maxDate:l}):e.push({title:M(d),minDate:d,maxDate:l})}}var s}function E(e){const t=new Date(e);return a[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function I(e){const t=new Date(e);return a[t.getMonth()].slice(0,3)+" "+t.getDate()}function M(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function P(e){const t=new Date(e);return o[t.getDay()]}function Z(e,t){return t>=0&&t<12&&e>=0&&e{"use strict";i.d(t,{Z:()=>d});var s=i(2796),n=i(2166),a=i(3910),o=i(2738);const r="https://t.me/";function d(e={}){const t=document.createElement("a");t.classList.add("anchor-copy");let i,d="LinkCopied";if(e.mePath){const s=r+e.mePath;i=t.href=t.innerText=s}if(e.username){const s=r+e.username;t.href=s,i=t.innerText="@"+e.username,d="UsernameCopied"}return(0,o.fc)(t,(e=>{(0,a.Z)(e),(0,n.T)(null!=i?i:t.href),(0,s.bC)({langPackKey:d})})),t}},6976:(e,t,i)=>{"use strict";i.d(t,{E:()=>c,s:()=>l});var s=i(5432),n=i(4762),a=i(3416),o=i(3910);let r=!1,d=0;function l(){d&&clearTimeout(d),d=window.setTimeout((()=>{d=0,r=!1}),400),r=!0}function c(e,t,i){const d=i?i.add(e):e.addEventListener.bind(e),l=i?i.removeManual.bind(i,e):e.removeEventListener.bind(e);if(n.IS_APPLE&&s.Z){let e;const i={capture:!0},s=()=>{clearTimeout(e),l("touchmove",s,i),l("touchend",s,i),l("touchcancel",s,i)};d("touchstart",(n=>{n.touches.length>1?s():(d("touchmove",s,i),d("touchend",s,i),d("touchcancel",s,i),e=window.setTimeout((()=>{r?s():(t(n),s(),a.Z.isOpened()&&d("touchend",o.Z,{once:!0}))}),400))}))}else d("contextmenu",s.Z?e=>{t(e),a.Z.isOpened()&&d("touchend",o.Z,{once:!0})}:t)}},5077:(e,t,i)=>{"use strict";function s(e,t,i,s){const n=e=>{i({x:e.pageX,y:e.pageY,event:e})},a=t=>{document.removeEventListener("mousemove",n),e.addEventListener("mousedown",o,{once:!0}),s&&s({x:t.pageX,y:t.pageY,event:t})},o=i=>{0===i.button?(t({x:i.pageX,y:i.pageY,event:i}),n(i),document.addEventListener("mousemove",n),document.addEventListener("mouseup",a,{once:!0})):e.addEventListener("mousedown",o,{once:!0})};e.addEventListener("mousedown",o,{once:!0});const r=e=>{e.preventDefault(),i({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e})},d=t=>{document.removeEventListener("touchmove",r),e.addEventListener("touchstart",l,{passive:!1,once:!0}),s&&s({x:t.touches[0].clientX,y:t.touches[0].clientY,isTouch:!0,event:t})},l=e=>{t({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e}),r(e),document.addEventListener("touchmove",r,{passive:!1}),document.addEventListener("touchend",d,{passive:!1,once:!0})};return e.addEventListener("touchstart",l,{passive:!1,once:!0}),()=>{e.removeEventListener("mousedown",o),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",a),e.removeEventListener("touchstart",l),document.removeEventListener("touchmove",r),document.removeEventListener("touchend",d)}}i.d(t,{Z:()=>s})},6760:(e,t,i)=>{"use strict";function s(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()}i.d(t,{Z:()=>s})},2738:(e,t,i)=>{"use strict";i.d(t,{EN:()=>r,fc:()=>o,pf:()=>a,tH:()=>d});var s=i(5432),n=i(6669);const a=s.Z?"mousedown":"click";function o(e,t,i={}){const s=i.listenerSetter?i.listenerSetter.add(e):e.addEventListener.bind(e),n=i.listenerSetter?i.listenerSetter.removeManual.bind(i.listenerSetter,e):e.removeEventListener.bind(e);return i.touchMouseDown=!0,s(a,t,i),()=>n(a,t,i)}function r(e,t,i){e.removeEventListener(a,t,i)}function d(e){(0,n.Z)(e,a)}},7529:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(5432),n=i(3241),a=i(5953),o=i(8497);class r extends n.Z{constructor(){super(!1),this.hideControls=(e=!1)=>{if(e)return void(this.hideControlsTimeout||(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3)));clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0;const t=this.element.classList.contains("show-controls");if(!1!==this.controlsLocked){if(this.canHideControls&&!this.canHideControls()||!t||this.controlsLocked)return}else if(!t)return;this.dispatchEvent("toggleControls",!1),this.element.classList.remove("show-controls")},this.showControls=(e=!0)=>{this.hideControlsTimeout?(clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0):this.element.classList.contains("show-controls")||!1===this.controlsLocked||(this.dispatchEvent("toggleControls",!0),this.element.classList.add("show-controls")),e&&!this.controlsLocked&&(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3))},this.toggleControls=e=>{const t=this.element.classList.contains("show-controls");if(void 0===e)t?this.hideControls():this.showControls();else{if(e===t)return;!1===e?this.hideControls():this.showControls()}},this.hideControlsTimeout=0}setup(e){(0,a.Z)(this,e);const{listenerSetter:t,element:i}=this;s.Z?t.add(i)("click",(e=>{this.ignoreClickClassName&&(0,o.Z)(e.target,this.ignoreClickClassName)||this.toggleControls()})):(t.add(i)("mousemove",(()=>{this.showControls()})),t.add(i)("mouseenter",(()=>{this.showControls(!1)})),t.add(i)("mouseleave",(e=>{e.relatedTarget&&this.showOnLeaveToClassName&&(0,o.Z)(e.relatedTarget,this.showOnLeaveToClassName)?this.showControls(!1):this.hideControls()})))}lockControls(e){this.controlsLocked=e,this.element.classList.toggle("disable-hover",!1===e),this.toggleControls(e)}}},4531:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(3003),n=i(2353),a=i(3416),o=i(3699),r=i(3624),d=i(1483),l=i(6976),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function h({buttons:e,findElement:t,listenTo:i,appendTo:h,filterButtons:u,onOpen:p,onClose:f,onBeforeOpen:m,listenerSetter:g}){null!=h||(h=document.body),null!=g||(g=new o.Z);const v=new o.Z,b=(0,r.k)();let y;(0,l.E)(i,(e=>{const s=t?t(e):i;if(!s)return;let n=y;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),n&&n.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0),(()=>{c(this,void 0,void 0,(function*(){yield null==p?void 0:p(s);const t=yield S();if(!t)return;n=t.element;const{cleanup:i,destroy:o}=t;(0,d.Z)(e,n),a.Z.openBtnMenu(n,(()=>{null==f||f(),i(),setTimeout((()=>{o()}),300)}))}))})()}),g);const w=()=>{v.removeAll(),b.clean()},S=()=>c(this,void 0,void 0,(function*(){w(),e.forEach((e=>e.element=void 0));const t=u||(e=>(0,n.Z)(e,(e=>{var t,i;return null===(i=null===(t=null==e?void 0:e.verify)||void 0===t?void 0:t.call(e))||void 0===i||i}))),i=yield t(e);if(!i.length)return;const a=y=yield(0,s.Z)({buttons:i,listenerSetter:v});return a.classList.add("contextmenu"),yield null==m?void 0:m(),h.append(a),{element:a,cleanup:w,destroy:()=>{a.remove()}}}));return{element:y,destroy:()=>{w(),g.removeAll()}}}},3163:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(6787),n=i(4271),a=i(3512),o=i(4531),r=i(8497),d=i(3173),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function c(e){const{listenTo:t,isStickerPack:i,verifyRecent:c,appendTo:h,onOpen:u,onClose:p,onSend:f}=e;let m,g;const v=e=>l(this,void 0,void 0,(function*(){const t=yield a.Z.managers.acknowledged.appStickersManager.getFavedStickersStickers();if(!t.cached)return!1;const i=(yield t.result).some((e=>e.id===g.id));return e?!i:i}));return(0,o.Z)({listenTo:t,appendTo:h,findElement:e=>m=(0,r.Z)(e.target,"media-sticker-wrapper"),onOpen:()=>l(this,void 0,void 0,(function*(){return g=yield a.Z.managers.appDocsManager.getDoc(m.dataset.docId),null==u?void 0:u()})),onClose:p,buttons:[{icon:"stickers",text:"Context.ViewStickerSet",onClick:()=>new s.Z(g.stickerSetInput).show(),verify:()=>!i},{icon:"favourites",text:"AddToFavorites",onClick:()=>a.Z.managers.appStickersManager.faveSticker(g.id,!1),verify:()=>v(!0)},{icon:"favourites",text:"DeleteFromFavorites",onClick:()=>a.Z.managers.appStickersManager.faveSticker(g.id,!0),verify:()=>v(!1)},{icon:"delete",text:"DeleteFromRecent",onClick:()=>a.Z.managers.appStickersManager.saveRecentSticker(g.id,!0),verify:()=>{var e;return null!==(e=null==c?void 0:c(m))&&void 0!==e&&e}},{icon:"mute",text:"Chat.Send.WithoutSound",onClick:()=>(null==f||f(),d.Jo.sendDocId(g.id,!1,!0)),verify:()=>!(!n.Z.chat.peerId||n.Z.chat.peerId===a.Z.myId)},{icon:"schedule",text:"Chat.Send.ScheduledMessage",onClick:()=>n.Z.chat.input.scheduleSending((()=>n.Z.chat.input.sendMessageWithDocument(g))),verify:()=>!!n.Z.chat.peerId}]})}},7660:(e,t,i)=>{"use strict";function s(e={}){const t=document.createElement("video");return e.pip||(t.disablePictureInPicture=!0),t.setAttribute("playsinline","true"),t}i.d(t,{Z:()=>s})},8222:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3512);const n=new class{constructor(){this.cache={},s.Z.addEventListener("theme_change",(()=>{this.computedStyle=void 0;const e=this.cache;this.cache={};for(const t in e)this.getProperty(t)}))}getProperty(e){let t=this.cache[e];return t||(this.computedStyle||(this.computedStyle=window.getComputedStyle(document.documentElement)),t=this.computedStyle.getPropertyValue("--"+e).trim(),this.cache[e]=t)}}},6669:(e,t,i)=>{"use strict";function s(e,t){const i=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(i)}i.d(t,{Z:()=>s})},1544:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4056);function n(e){return Array.from(e.childNodes).map((e=>e.nodeType===e.TEXT_NODE?(0,s.Z)(e.textContent):e.outerHTML)).join("")}},5975:(e,t,i)=>{"use strict";function s(e,t){if(!e)return null;if(e.parentElement===t)return e;for(;e.parentElement;)if((e=e.parentElement).parentElement===t)return e;return null}i.d(t,{Z:()=>s})},8763:(e,t,i)=>{"use strict";function s(e,t){return e.closest(`[${t}]`)}i.d(t,{Z:()=>s})},4668:(e,t,i)=>{"use strict";function s(e,t){return e.closest(t)}i.d(t,{Z:()=>s})},6733:(e,t,i)=>{"use strict";function s(e){e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()}function n(){document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()}function a(e,t,i){const s=i?i.add(e):e.addEventListener.bind(e);"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange".split(" ").forEach((e=>{s(e,t,!1)}))}function o(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function r(){return!!o()}i.d(t,{C8:()=>n,Dj:()=>s,Ms:()=>a,W7:()=>o,rB:()=>r})},3299:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n,q:()=>a});var s=i(5975);function n(e,t){const i=document.getSelection(),n=i[t?"anchorNode":"focusNode"],o=i[t?"anchorOffset":"focusOffset"];return(0,s.Z)(n,e)||n===e?Object.assign(Object.assign({},a(e,n,o)),{selection:i}):{selection:i}}function a(e,t,i){if(t===e){const s=e.childNodes,n=s.length;n&&i>=n?i=((t=s[n-1]).textContent||t.alt||"").length:(t=s[i],i=0)}return{node:t,offset:i}}},9041:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d,o:()=>n});var s=i(6854);const n={bold:{match:'[style*="bold"], [style*="font-weight: 700"], [style*="font-weight: 600"], [style*="font-weight:700"], [style*="font-weight:600"], b, strong',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u, ins',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i, em',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face*="monospace"], pre',entityName:"messageEntityCode"},strikethrough:{match:'[style*="line-through"], [style*="strikethrough"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},a=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR","OL","UL"]),o=(new Set(["OL","UL"]),new RegExp(s.Z,"g"));function r(e,t,i,s){const a=e.parentElement;for(const e in n){const o=n[e],r=a.closest(o.match+', [contenteditable="true"]');null===(null==r?void 0:r.getAttribute("contenteditable"))&&("messageEntityTextUrl"===o.entityName?i.push({_:o.entityName,url:r.href,offset:s.offset,length:t.length}):"messageEntityMentionName"===o.entityName?i.push({_:o.entityName,offset:s.offset,length:t.length,user_id:r.dataset.follow.toUserId()}):i.push({_:o.entityName,offset:s.offset,length:t.length}))}}function d(e,t,i,s,n,l,c={offset:0}){if(e.nodeType===e.TEXT_NODE){let t=e.nodeValue;return t=t.replace(o,""),t?s===e?i.push(t.substr(0,n)+""+t.substr(n)):i.push(t):s===e&&i.push(""),l&&t.length&&e.parentNode&&r(e,t,l,c),void(c.offset+=t.length)}if(e.nodeType!==e.ELEMENT_NODE)return;const h=s===e,u=a.has(e.tagName);if(u&&(i.length||"BR"===e.tagName))t.push(i.join("")),i.length=0,++c.offset;else{const t=e.dataset.stickerEmoji||e.alt,s=e.dataset.stickerEmoji;t&&l&&r(e,t,l,c),s&&l&&l.push({_:"messageEntityCustomEmoji",document_id:e.dataset.docId,offset:c.offset,length:t.length}),t&&(i.push(t),c.offset+=t.length)}h&&!n&&i.push("");const p=e.matches('[style*="table-cell"], th, td'),f=null==l?void 0:l.length;let m=e.firstChild;for(;m;)d(m,t,i,s,n,l,c),m=m.nextSibling;if(h&&n&&i.push(""),p&&e.nextSibling&&i.length&&(i.push(" "),++c.offset,void 0!==f))for(let e=f,t=l.length;e{"use strict";i.d(t,{Z:()=>r});var s=i(410),n=i(6875),a=i(1346),o=i(9041);function r(e,t=!0,i=!0){const s=[],r=[],{node:d,offset:l}=!(e instanceof DocumentFragment)&&i&&function(e){const t=window.getSelection();let i,s;if(null==t?void 0:t.rangeCount){const n=t.getRangeAt(0),a=n.startOffset;if(n.startContainer&&n.startContainer==n.endContainer&&a==n.endOffset){const t=a-1,o=e.childNodes;if(n.startContainer===e&&o[t]){i=o[t],s=0;for(let e=0;e{"use strict";i.d(t,{Z:()=>n});var s=i(8204);function n({overflowElement:e,overflowRect:t,selector:i,extraSize:n,elements:a}){null!=t||(t=e.getBoundingClientRect()),null!=a||(a=Array.from(e.querySelectorAll(i))),n&&(t={top:t.top-n,right:t.right+n,bottom:t.bottom+n,left:t.left-n});const o=[],r=[],d=[];let l=!1;for(const i of a){const n=i.getBoundingClientRect(),a=(0,s.Z)(i,e,!1,n,t);let c;a?(l=!0,c=r):c=l?d:o,c.push({element:i,rect:n,visibleRect:a})}return{invisibleTop:o,visible:r,invisibleBottom:d}}},8204:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(241);function n(e,t,i,n=e.getBoundingClientRect(),a=t.getBoundingClientRect()){let{top:o,right:r,bottom:d,left:l}=a;if(i){const e=t.querySelector(".sticky");e&&(o=e.getBoundingClientRect().bottom)}if(n.top>=d||n.bottom<=o||n.right<=l||n.left>=r)return null;const c={top:!1,right:!1,bottom:!1,left:!1,vertical:0,horizontal:0},h=s.Z.width,u=s.Z.height;return{rect:{top:n.topr&&r!==h?(c.right=!0,++c.horizontal,r):n.right,bottom:n.bottom>d&&d!==u?(c.bottom=!0,++c.vertical,d):n.bottom,left:n.left{"use strict";i.d(t,{Z:()=>r});var s=i(3757),n=i(3910),a=i(8497),o=i(3444);function r(e){let t=!1;return new s.Z(Object.assign(Object.assign({},e),{verifyTouchTarget:t=>!(0,a.Z)(t.target,"progress-line")&&!(0,o.Z)(t)&&(!e.verifyTouchTarget||e.verifyTouchTarget(t)),onSwipe:(i,s,a)=>{if(i*=-1,s*=-1,!t&&Math.abs(s)>20)return!0;if(Math.abs(i)>Math.abs(s))(0,n.Z)(a),t=!0;else if(!t&&Math.abs(s)>Math.abs(i))return!0;return e.onSwipe(i,s,a)},onReset:()=>{t=!1,e.onReset&&e.onReset()},cancelEvent:!1}))}},1154:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(6976),n=i(2416);function a(e){return(0,n.Z)(Object.assign(Object.assign({},e),{onSwipe:(t,i,n)=>{if(t*=-1,i*=-1,Math.abs(t)>50)return e.onSwipe(t,i,n),(0,s.s)(),!0}}))}},5705:(e,t,i)=>{"use strict";function s(e){if(e instanceof DocumentFragment)return e;const t=document.createElement("template");return e=e.trim(),t.innerHTML=e,t.content}i.d(t,{Z:()=>s})},2614:(e,t,i)=>{"use strict";function s(e){const t=document.createElement("span");return"string"==typeof e?t.innerHTML=e:t.append(e),t}i.d(t,{Z:()=>s})},8487:(e,t,i)=>{"use strict";function s(e){return null==e?void 0:e.isConnected}i.d(t,{Z:()=>s})},1293:(e,t,i)=>{"use strict";function s(e){return e.isContentEditable||"INPUT"!==e.tagName?!e.textContent.trim()&&!e.querySelector(".emoji, .custom-emoji, .custom-emoji-placeholder"):!e.value.trim()}i.d(t,{Z:()=>s})},6299:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(4762);function a(e){if("Enter"===e.key&&!n.IS_MOBILE&&!e.isComposing){if("enter"===s.Z.settings.sendShortcut){if(e.shiftKey||e.ctrlKey||e.metaKey)return;return!0}{const t=n.IS_APPLE?e.metaKey:e.ctrlKey;if(e.shiftKey||(n.IS_APPLE?e.ctrlKey:e.metaKey))return;if(t)return!0}}return!1}},3444:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4762);function n(e){return s.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},2398:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(5432);function n(e,t=!1,i=!0){if(!s.Z||t&&("INPUT"===document.activeElement.tagName||document.activeElement.isContentEditable))if(i&&e.focus(),e instanceof HTMLInputElement){const t=e.value.length;e.selectionStart=t,e.selectionEnd=t}else{const t=document.createRange();t.selectNodeContents(e),t.collapse(!1);const i=window.getSelection();i.removeAllRanges(),i.addRange(t)}}window.placeCaretAtEnd=n},4484:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2648);function n(e,t,i,n){return void 0===n&&(n=e.parentElement===t?(0,s.Z)(e):-1),n!==i&&(-1!==n&&ni?t.insertBefore(e,t.children[i]):t.append(e):t.prepend(e),!0)}},6740:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>o,cj:()=>r});var s=i(925);const n={},a=(e,t)=>{e instanceof HTMLImageElement||e instanceof HTMLVideoElement?e.src=t:e instanceof SVGImageElement?e.setAttributeNS(null,"href",t):e.style.backgroundImage="url("+t+")"};function o(e,t,i,o=!0){if(!t)return console.error("renderImageFromUrl: no url?",e,t),void(null==i||i());const r=e instanceof HTMLVideoElement;if(n[t]&&o||r)e&&a(e,t),i&&(r?(0,s.Z)(e).then(i):null==i||i());else{const s=e instanceof HTMLImageElement,o=s?e:new Image;o.src=t;const r=()=>{!s&&e&&a(e,t),n[t]=!0,null==i||i(),o.removeEventListener("error",d)},d=e=>{console.error("Render image from url failed:",e,t,o),o.removeEventListener("load",r),null==i||i()};o.addEventListener("load",r,{once:!0}),o.addEventListener("error",d,{once:!0})}}function r(e,t,i){return new Promise((s=>{o(e,t,s,i)}))}},2830:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(9674),n=i(6740);function a(e,t,i,a,o=e,r){return a&&t.classList.add("fade-in"),(0,n.cj)(t,i).then((()=>s.Z.mutateElement(e,(()=>{o.append(t),a?t.addEventListener("animationend",(()=>{s.Z.mutate((()=>{t.classList.remove("fade-in"),null==r||r.remove()}))}),{once:!0}):null==r||r.remove()}))))}},5565:(e,t,i)=>{"use strict";function s(e,t){if("string"==typeof t)return void(e.innerHTML=t);const i=e.firstChild;i?e.lastChild===i?i.replaceWith(t):(e.textContent="",e.append(t)):e.append(t)}i.d(t,{Z:()=>s})},669:(e,t,i)=>{"use strict";i.d(t,{Y:()=>m,Z:()=>g});var s=i(4762),n=i(5003),a=i(5400),o=i(3699),r=i(6854),d=i(3228),l=i(5975),c=i(2648);function h(e,t,i,s){let n;if(e===i)n=t-s;else if(e.parentElement===i.parentElement)n=(0,c.Z)(e,!0)-(0,c.Z)(i,!0);else{const t=[];let s=e.parentElement;do{t.push(s)}while(s=s.parentElement);s=i.parentElement;do{if(t.includes(s))break}while(s=s.parentElement);const a=s;e=(0,l.Z)(e,a),i=(0,l.Z)(i,a),n=(0,c.Z)(e,!0)-(0,c.Z)(i,!0)}return(0,d.Z)(n,-1,1)}window.compareNodes=h;var u=i(3299),p=i(2398);const f=new RegExp(`[^${r.Z}]`),m=!1;class g{constructor(){this.saveSelectionOnChange=e=>{const t=document.activeElement;this.saveRangeForElement(t)},this.onFocusOut=e=>{this.lastNode=this.lastOffset=void 0},this.onSelectionChange=e=>{var t;const{input:i}=this;if(!i)return void this.setSelectionClassName(document.getSelection());let s=this.getCaretPosN();for(;;){const{node:e,offset:n,selection:a,move:o}=s;if((null==e?void 0:e.nodeValue)!==r.Z||!this.lastNode)break;const d=h(e,n,this.lastNode,this.lastOffset)<0;void 0!==d&&(a.isCollapsed?this.superMove(i,s,d,!0):a.modify(a.isCollapsed?"move":"extend",d?"backward":"forward","character")),this.log("selectionchange",e,n,this.lastNode,this.lastOffset,e===this.lastNode,(0,c.Z)(this.getFiller(e)),(0,c.Z)(this.getFiller(this.lastNode)),d,a,document.getSelection(),document.getSelection().getRangeAt(0),null==e?void 0:e.parentNode,null===(t=this.lastNode)||void 0===t?void 0:t.parentNode),s=this.getCaretPosN(),this.lastNode=e,this.lastOffset=n;break}this.lastNode=this.lastOffset=void 0,this.setSelectionClassName(s.selection,i)},this.onBeforeInput=e=>{var t;const{input:i,log:s}=this;if(!i)return;const n=this.addInputCallback.bind(this,i),a=this.getCaretPosN();let{node:o,offset:d,selection:l,move:c}=a;if(s("beforeinput",e,o,d,l,a),this.lastNode=this.lastOffset=void 0,e.inputType.startsWith("delete")){if(n((()=>{this.processEmptiedFillers(i),this.removeExtraBOMs(i),this.fixInsertedLineBreaks(i)})),(null==o?void 0:o.nodeValue)===r.Z&&l.isCollapsed&&e.inputType.includes("deleteContent")){const t=e.inputType.includes("Backward"),s=d===r.Z.length&&t||!d&&!t;this.superMove(i,a,t,s)}}else{if(e.inputType.startsWith("insert")){if(null===(t=null==o?void 0:o.classList)||void 0===t?void 0:t.contains("input-something")){o=o.previousSibling.firstChild;const e=l.getRangeAt(0);e.setStart(o,0),e.setEnd(o,0),e.collapse(!0);const t=this.getCaretPosN();o=t.node,l=t.selection,d=t.offset}if(o&&o.textContent===r.Z&&d===r.Z.length){l.modify("move","backward","character");const e=this.getCaretPosN();o=e.node,l=e.selection,d=e.offset}e.inputType;{o&&o.nodeType===o.ELEMENT_NODE&&(o=o.firstChild,s.warn("fixing focus on span"));const t=(null==o?void 0:o.nodeValue)===r.Z;if(s("inserting line break",t,o,`"${null==o?void 0:o.nodeValue}"`,(null==o?void 0:o.parentElement)?Array.from(o.parentElement.childNodes).slice():[]),t){const e=o.parentElement;e.classList.replace("input-filler","input-filler-text"),e.childNodes.length,n((()=>{e.childNodes.length>1?(s("inserting line break, remove"),o=Array.from(e.childNodes).find((e=>e.nodeValue===r.Z)),e.t=o):o.nodeValue!==r.Z&&(s("inserting line break, deleteData"),o.deleteData(o.nodeValue.indexOf(r.Z),r.Z.length)),this.fixInsertedLineBreaks(i)}))}else"insertLineBreak"===e.inputType&&n((()=>{this.fixInsertedLineBreaks(i)}))}return}"historyUndo"===e.inputType?n((()=>{this.processFilledFillers(i),this.processEmptiedFillers(i),this.removeExtraBOMs(i),this.removeEmptyTextNodes(i),this.fixBuggedCaret()})):"historyRedo"===e.inputType&&n((()=>{this.processFilledFillers(i),this.processEmptiedFillers(i),i.querySelectorAll(".input-something:not([contenteditable])").forEach((e=>{e.contentEditable="false"})),this.removeExtraBOMs(i),this.fixBuggedCaret()}))}},this.onKeyDown=e=>{var t;const i=e.key;if("ArrowDown"===i||"ArrowUp"===i)this.lastNode=this.lastOffset=void 0;else{const{node:e,offset:t}=this.getCaretPosN();this.lastNode=e,this.lastOffset=t,this.lastNode===this.input&&(this.lastNode=this.lastOffset=void 0)}this.log("keydown",this.lastNode,null===(t=this.lastNode)||void 0===t?void 0:t.parentNode,this.lastOffset,this.getCaretPosN(),e)},this.log=(0,n.kg)("RICH-INPUT"),this.listenerSetter=new o.Z,this.savedRanges=new WeakMap,this.listenerSetter.add(document)("selectionchange",this.saveSelectionOnChange),m&&(this.listenerSetter.add(document)("focusout",this.onFocusOut),this.listenerSetter.add(document)("selectionchange",this.onSelectionChange),this.listenerSetter.add(document)("beforeinput",this.onBeforeInput),this.listenerSetter.add(document)("keydown",this.onKeyDown,{capture:!0}),s.IS_FIREFOX&&(this.inputCaptureCallbacks=[],this.listenerSetter.add(document)("input",(()=>{this.inputCaptureCallbacks.forEach((e=>e())),this.inputCaptureCallbacks.length=0}),{capture:!0})))}get input(){const e=document.getSelection(),{anchorNode:t}=e;if(t)return(t.closest?t:t.parentElement).closest('[contenteditable="true"]')}saveRangeForElement(e){e&&(e.isContentEditable||"INPUT"===e.tagName)&&document.getSelection().rangeCount&&this.savedRanges.set(e,document.getSelection().getRangeAt(0))}findPreviousSmthIndex(e,t,i){const s=Array.from(null!=i?i:e.querySelectorAll(".input-something")),n=s.findIndex((e=>h(e,0,t,0)>=0));return-1===n?s.length-1:Math.max(0,n-1)}superMove(e,t,i,s){var n,a;const{node:o,offset:d,move:l}=t,c=e.querySelectorAll(".input-something"),h=this.findPreviousSmthIndex(e,o,c),u=document.createRange();u[i?"setEnd":"setStart"](o,d),s&&l(i);const p=this.getCaretPosN();if((null===(n=p.node)||void 0===n?void 0:n.nodeValue)===r.Z&&(!s||o===this.lastNode)){const t=this.findPreviousSmthIndex(e,p.node,c);let n=!s;for(;;){const s=this.getCaretPosN(),d=this.findPreviousSmthIndex(e,s.node,c);u[i?"setStart":"setEnd"](s.node,s.offset);const p=u.toString(),m=!f.test(p);if(this.log("test cursor",p,m,t,d),!m||(null===(a=s.node)||void 0===a?void 0:a.nodeValue)!==r.Z||d!==t||!d&&!s.offset||!(d{e.classList.add("br-not-br")}))}fixBuggedCaret(){const e=document.getSelection(),t=e.getRangeAt(0);e.removeAllRanges(),e.addRange(t)}addInputCallback(e,t,i=!0){const n=()=>{this.log("input modify callback"),t()};i&&s.IS_FIREFOX?this.inputCaptureCallbacks.push(n):this.listenerSetter.add(e)("input",n,{once:!0,capture:i})}removeExtraBOMs(e){const t=e=>{var t;return null===(t=null==e?void 0:e.classList)||void 0===t?void 0:t.contains("input-something")};e.querySelectorAll(".input-filler").forEach((e=>{var i;const{previousSibling:s,nextSibling:n}=e;let o=!1;!(null===(i=null==n?void 0:n.classList)||void 0===i?void 0:i.contains("input-filler"))&&(0,a.Hc)(n)&&(o=t(s)||t(n)),o||(this.log.warn("removing empty bom node",e),e.remove())}))}getFiller(e){return e&&e.nodeType===e.TEXT_NODE&&e.parentElement!==this.input?e.parentElement:e}getCaretPosN(){const e=(0,u.Z)(this.input);return Object.assign(Object.assign({},e),{move:this.move.bind(this,e.selection)})}removeEmptyTextNodes(e){const{log:t}=this,i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:t=>t.parentElement!==e||t.nodeValue?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT});let s;for(;s=i.nextNode();)t.warn("removing empty text node",s),s.remove()}removePossibleBOMSiblings(e,t){[e,t].forEach((e=>{var t;(null===(t=null==e?void 0:e.classList)||void 0===t?void 0:t.contains("input-filler"))&&e.remove()}))}removePossibleBOMSiblingsByNode(e){const{previousSibling:t,nextSibling:i}=e;this.removePossibleBOMSiblings(t,i)}processEmptiedFillers(e){e.querySelectorAll(".input-filler-text").forEach((e=>{var t;this.removeExtraBOMs(e);let i=!0;if(e.textContent)f.test(e.textContent)||e.querySelector(".input-something")?i=!1:e.classList.replace("input-filler-text","input-filler");else{e.classList.replace("input-filler-text","input-filler");const i=Array.from(e.childNodes).find((e=>e.nodeType===e.TEXT_NODE));i?i.insertData(0,r.Z):(null===(t=e.t)||void 0===t?void 0:t.nodeValue)?e.append(e.t):e.append(document.createTextNode(r.Z))}i&&this.removePossibleBOMSiblingsByNode(e)}))}processFilledFillers(e){e.querySelectorAll(".input-filler").forEach((e=>{if(e.textContent!==r.Z){e.classList.replace("input-filler","input-filler-text");const t=e.t,i=Array.from(e.childNodes).find((e=>e.nodeType===e.TEXT_NODE&&e.nodeValue.includes(r.Z)));if(i&&!(null==t?void 0:t.nodeValue)){const e=i.nodeValue.indexOf(r.Z);-1!==e&&i.deleteData(e,r.Z.length)}}}))}setSelectionClassName(e,t){if(e.rangeCount){const i=e.getRangeAt(0);t?Array.from(t.querySelectorAll(".input-selectable")).forEach((e=>{e.classList.toggle("selection",!i.collapsed&&i.intersectsNode(e))})):Array.from(document.querySelectorAll(".input-selectable.selection")).forEach((e=>e.classList.remove("selection")))}}move(e,t){const{focusNode:i,focusOffset:s}=e;e.modify("extend",t?"backward":"forward","character"),t?e.collapseToStart():e.collapseToEnd();const{focusNode:n,focusOffset:a}=e;this.log("moving cursor",t,i,i.nodeType===i.ELEMENT_NODE?i:i.parentElement,s,n,n.nodeType===n.ELEMENT_NODE?n:n.parentElement,a)}prepareApplyingMarkdown(){const{input:e}=this,t=e.querySelectorAll(".input-filler"),i=e.querySelectorAll(".input-something");return i.forEach((e=>{e.contentEditable="inherit"})),()=>{t.forEach((e=>{e.contentEditable="inherit"})),i.forEach((e=>{e.contentEditable="false"})),this.removeExtraBOMs(e)}}static getInstance(){var e;return null!==(e=this.INSTANCE)&&void 0!==e?e:this.INSTANCE=new g}}},130:(e,t,i)=>{"use strict";function s(e,t){n(e),"string"==typeof t?t?e.innerHTML=t:e.replaceChildren():e.replaceChildren(t)}function n(e){e.setAttribute("dir","auto")}i.d(t,{Z:()=>s,m:()=>n})},2914:(e,t,i)=>{"use strict";i.d(t,{Z:()=>f});var s=i(3757),n=i(5432),a=i(3512),o=i(3228),r=i(5953),d=i(5418),l=i(3910),c=i(2738),h=i(5975),u=i(4484),p=i(2648);class f{constructor(e){this.onSwipe=(e,t)=>{t=(0,o.Z)(t,this.minY,this.maxY),this.element.style.transform=`translateY(${t}px)`;const i=Math.round(Math.abs(t)/this.elementRect.height),s=this.siblings;this.siblings=[];const n=t<0?"previousElementSibling":"nextElementSibling";let a=this.element[n];for(let e=0;e{this.siblings.includes(e)||(e.style.transform="")})),this.siblings.forEach((e=>{const i=this.elementRect.height*(t<0?1:-1);e.style.transform=`translateY(${i}px)`})),this.scrollableRect){const e=t,i=e>0,s=(i?this.elementRect.bottom:this.elementRect.top)+e-this.addScrollPos;let n=2;s+(i?0:this.elementRect.height)>=this.scrollableRect.bottom||(s-(i?this.elementRect.height:0)<=this.scrollableRect.top?n*=-1:n=void 0),void 0!==n&&(this.scrollable.container[this.scrollable.scrollProperty]+=n)}},this.verifyTouchTarget=e=>!this.list.classList.contains("is-reordering")&&(this.element=this.getSortableTarget(e.target),!!this.element),this.onScroll=()=>{const e=this.scrollable.container[this.scrollable.scrollProperty],t=this.addScrollPos=e-this.startScrollPos,i="scrollTop"===this.scrollable.scrollProperty;this.swipeHandler.add(i?0:t,i?t:0)},this.onStart=()=>{this.list.classList.add("is-reordering"),this.element.classList.add("is-dragging","no-transition"),this.swipeHandler.setCursor("grabbing"),this.elementRect=this.element.getBoundingClientRect(),this.containerRect=this.list.getBoundingClientRect(),this.minY=this.containerRect.top-this.elementRect.top,this.maxY=this.containerRect.bottom-this.elementRect.bottom,this.addScrollPos=0,this.scrollable&&(this.startScrollPos=this.scrollable.container[this.scrollable.scrollProperty],this.scrollableRect=this.scrollable.container.getBoundingClientRect(),this.scrollable.container.addEventListener("scroll",this.onScroll))},this.onReset=()=>{return e=this,t=void 0,s=function*(){const e=this.siblings.length,t=e&&e*(this.siblings[0].previousElementSibling===this.element?1:-1),i=(0,p.Z)(this.element),s=i+t;this.element.classList.remove("no-transition"),this.element.style.transform=t?`translateY(${t*this.elementRect.height}px)`:"",this.swipeHandler.setCursor(""),this.scrollable&&this.scrollable.container.removeEventListener("scroll",this.onScroll),n.Z||(0,c.fc)(document.body,l.Z,{capture:!0,once:!0}),a.Z.settings.animationsEnabled&&(yield(0,d.Z)(250)),this.list.classList.remove("is-reordering"),this.element.classList.remove("is-dragging"),(0,u.Z)(this.element,this.list,s,i),[this.element,...this.siblings].forEach((e=>{e.style.transform=""})),this.element=this.siblings=this.elementRect=this.containerRect=this.minY=this.maxY=this.startScrollPos=this.addScrollPos=void 0,t&&this.onSort(i,s)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s},(0,r.Z)(this,e),this.swipeHandler=new s.Z({element:this.list,onSwipe:this.onSwipe,verifyTouchTarget:this.verifyTouchTarget,onStart:this.onStart,onReset:this.onReset,setCursorTo:document.body,middleware:this.middleware,withDelay:!0})}getSortableTarget(e){if(!e)return;let t=(0,h.Z)(e,this.list);return t&&t.classList.contains("cant-sort")&&(t=void 0),t}}},1656:(e,t,i)=>{"use strict";function s(e,t){return t?e.forEach((e=>e.setAttribute("disabled","true"))):e.forEach((e=>e.removeAttribute("disabled"))),()=>s(e,!t)}i.d(t,{Z:()=>s})},2648:(e,t,i)=>{"use strict";function s(e,t){if(!e.parentNode)return-1;if(t)return Array.from(e.parentNode.childNodes).indexOf(e);let i=0;for(;null!==(e=e.previousElementSibling);)++i;return i}i.d(t,{Z:()=>s})},6339:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(2738),n=i(5975),a=i(3241),o=i(5432),r=i(5953),d=i(6385),l=i(8497),c=i(3512);class h extends a.Z{constructor(e){super(!1),this.onClickOut=e=>{const t=e.target;(0,n.Z)(t,this.element)||Array.from(this.ignoreButtons).some((e=>(0,n.Z)(t,e)||t===e))||!(this.ignoreMouseOut.size<=1)||this.ignoreOutClickClassName&&(0,l.Z)(t,this.ignoreOutClickClassName)||this.toggle(!1)},this.onMouseOut=e=>{if(!this.isActive())return;if(this.clearTimeout("toggle"),this.ignoreMouseOut.size)return;const t=e.toElement;t&&(0,n.Z)(t,this.element)||this.setTimeout("toggle",(()=>{this.toggle(!1)}),200)},this.toggle=e=>{return t=this,i=void 0,a=function*(){const t=!!this.element.style.display&&void 0===e||e;if(this.init){if(!t)return;this.init(),this.init=null}if(t===this.isActive())return;const i=o.Z||!c.Z.settings.animationsEnabled?0:200;if(this.element.style.display&&void 0===e||e){const e=this.dispatchResultableEvent("open");yield Promise.all(e),this.element.style.display="",this.element.offsetLeft,this.element.classList.add("active"),this.dispatchEvent("openAfterLayout"),d.Z.pushItem(this.navigationItem={type:"dropdown",onPop:()=>{this.toggle(!1)}}),this.clearTimeout("toggle"),this.setTimeout("done",(()=>{this.forceClose=!1,this.dispatchEvent("opened")}),i)}else this.dispatchEvent("close"),this.ignoreMouseOut.clear(),this.ignoreButtons.clear(),this.element.classList.remove("active"),d.Z.removeItem(this.navigationItem),(0,s.EN)(window,this.onClickOut,{capture:!0}),this.clearTimeout("toggle"),this.setTimeout("done",(()=>{this.element.style.display="none",this.forceClose=!1,this.dispatchEvent("closed")}),i)},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a},(0,r.Z)(this,e),this.forceClose=!1,this.inited=!1,this.ignoreMouseOut=new Set,this.ignoreButtons=new Set,this.timeouts={}}attachButtonListener(e,t){let i=!0;o.Z?(0,s.fc)(e,(()=>{i?(i=!1,this.toggle(!0)):this.toggle()}),{listenerSetter:t}):(t.add(e)("mouseover",(s=>{i&&(t.add(e)("mouseout",(e=>{this.clearTimeout("toggle"),this.onMouseOut(e)})),i=!1),this.setTimeout("toggle",(()=>{this.toggle(!0)}),200)})),(0,s.fc)(e,(()=>{const t="click",i=!this.ignoreMouseOut.has(t);i&&!this.ignoreMouseOut.size&&(this.ignoreButtons.add(e),setTimeout((()=>{(0,s.fc)(window,this.onClickOut,{capture:!0})}),0)),this.setIgnoreMouseOut(t,i),this.toggle(i)}),{listenerSetter:t}))}clearTimeout(e){void 0!==this.timeouts[e]&&(clearTimeout(this.timeouts[e]),delete this.timeouts[e])}setTimeout(e,t,i){this.clearTimeout(e),this.timeouts[e]=window.setTimeout((()=>{this.clearTimeout(e),t()}),i)}init(){o.Z||(this.element.onmouseout=this.onMouseOut,this.element.onmouseover=e=>{this.forceClose||this.clearTimeout("toggle")})}isActive(){return this.element.classList.contains("active")}setIgnoreMouseOut(e,t){t?this.ignoreMouseOut.add(e):this.ignoreMouseOut.delete(e)}}},4789:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,f:()=>s});var s,n=i(8594),a=i(3035),o=i(5296),r=i(3512),d=i(8487);function l(e){var t,i,o;if(null!==(t=e.margin)&&void 0!==t||(e.margin=0),null!==(i=e.maxDistance)&&void 0!==i||(e.maxDistance=1500),null!==(o=e.axis)&&void 0!==o||(e.axis="y"),r.Z.settings.animationsEnabled&&0!==e.forceDuration||(e.forceDirection=s.Static),e.forceDirection===s.Static)return e.forceDuration=0,c(e);const d=(0,a.AD)().then((()=>c(e)));return"y"===e.axis?(0,n.YW)(d):d}function c(e){const{element:t,container:i,getNormalSize:s,getElementPosition:n,transitionFunction:a,axis:r,margin:l,position:p,forceDirection:f,maxDistance:m,forceDuration:g}=e;if(!(0,d.Z)(t))return(0,o.Kx)(i),Promise.resolve();const v="y"===r?"top":"left",b="y"===r?"bottom":"right",y="y"===r?"height":"width",w="y"===r?"scrollHeight":"scrollWidth",S="y"===r?"scrollHeight":"offsetWidth",C="y"===r?"scrollTop":"scrollLeft",L=t.getBoundingClientRect(),E=i.getBoundingClientRect?i.getBoundingClientRect():document.body.getBoundingClientRect(),I=L[v]-E[v],M=n?n({elementRect:L,containerRect:E,elementPosition:I}):I,P=t[S],Z=s?s({rect:E}):E[y];let k=i[C];const T=i[w];let x;switch(p){case"start":x=M-l;break;case"end":x=L[b]-E[b]+l;break;case"nearest":case"center":if(Pm?(k=i.scrollTop+=x-m,x=m):x<-m&&(k=i.scrollTop+=x+m,x=-m)),x<0){const e=-k;x=Math.max(x,e)}else if(x>0){const e=T-(k+Z);x=Math.min(x,e)}const A=i[C]+x,_=Math.abs(x),F=null!=g?g:250+_/1500*350,D=Date.now(),R=null!=a?a:_<500?u:h,B=()=>F?Math.min((Date.now()-D)/F,1):1,N=()=>{const e=B(),t=R(e),s=x*(1-t);return i[C]=Math.round(A-s),e<1};if(!F||!x)return(0,o.Kx)(i),N(),Promise.resolve();if(e.startCallback){const t=T-Math.round(A+i["y"===r?"offsetHeight":"offsetWidth"]);e.startCallback({scrollSize:T,scrollPosition:k,distanceToEnd:t,path:x,duration:F,containerRect:E,elementRect:L,getProgress:B})}return(0,o.cK)(N,i)}function h(e){return 1-Math.pow(1-e,5)}function u(e){return 1-Math.pow(1-e,3.5)}!function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Static=2]="Static"}(s||(s={}))},8801:(e,t,i)=>{"use strict";i.d(t,{P:()=>n});const s="_";function n(e,t){const i=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join(s);break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join(s);break;case"inputFileLocation":n=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":n=["webFile",e.url].join(s);break;default:console.error("Unrecognized location:",e),n=""}return n+((null==t?void 0:t.downloadId)?"_download":"")+(i?"."+i:i)}},1708:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(7625);function n(e){(0,s.Z)(e.history,((t,i,s)=>{t.action.photo||(s.splice(i,1),void 0!==e.count&&--e.count)}))}},4081:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2325);function n(e,t="auto"){if(0===e)return(0,s.ag)("FileSize.B",[0]);const i="auto"===t,n=Math.floor(Math.log(e)/Math.log(1024)),a="auto"===t?Math.max(0,n-1):t,o=Math.max(0,a),r=(e/Math.pow(1024,n)).toFixed(o);return(0,s.ag)(["FileSize.B","FileSize.KB","FileSize.MB","FileSize.GB"][n],[i?r:parseFloat(r)])}},8939:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(2325);const n={s:"Seconds",m:"Minutes",h:"Hours",d:"Days",w:"Weeks",mm:"Months",y:"Years"};function a(e,t){const i=function(e,t=2){e||(e=1);const i=[],s=[{m:1,t:"s"},{m:60,t:"m"},{m:60,t:"h"},{m:24,t:"d"},{m:7,t:"w"}];let n=1;s.forEach(((t,a)=>{if(n=Math.round(n*t.m),e=0;--e)0===a[e].duration&&a.splice(e,1);return a}(e,2);if(t){const e=i.map((e=>s.ZP.format(n[e.type],!0,[e.duration])));return(0,s.v_)(e,!1,t)}const a=i.map((e=>(0,s.ag)(n[e.type],[e.duration]))),o=document.createElement("span");return o.append(...(0,s.v_)(a,!1)),o}},6272:(e,t,i)=>{"use strict";i.d(t,{u:()=>r});var s=i(2325);const n=new Map;let a=0;const o=(e,t,i="")=>{i=t.country_code+i,a=Math.max(a,i.length),n.set(i,{country:e,code:t})};function r(e){e=e||"",n.size||s.ZP.countriesList.forEach((e=>{e.country_codes.forEach((t=>{t.prefixes?t.prefixes.forEach((i=>{o(e,t,i)})):o(e,t)}))}));let t=e.replace(/\D/g,"");const i=t.slice(0,a);let r;for(let e=i.length-1;e>=0&&(r=n.get(i.slice(0,e+1)),!r);--e);if(!r)return{formatted:t,country:void 0,code:void 0,leftPattern:""};const d=r.country,l=r.code.patterns||[],c=t.slice(r.code.country_code.length);let h="",u=0,p="";for(let e=l.length-1;e>=0;--e){h=l[e];const t=h.replace(/ /g,"");let i=0;for(let e=0,s=Math.min(c.length,t.length);eu&&(u=i,p=h)}h=p||h,h=h.replace(/\d/g,"X"),h=r.code.country_code+" "+h,h.split("").forEach(((e,i)=>{" "===e&&" "!==t[i]&&t.length>i&&(t=t.slice(0,i)+" "+t.slice(i))}));let f=h&&h.length>t.length?h.slice(t.length):"";return f&&(f=f.replace(/X/g,"‒")),{formatted:t,country:d,code:r.code,leftPattern:f}}},645:(e,t,i)=>{"use strict";i.d(t,{M:()=>s,Z:()=>n});class s{constructor(){this.cache=new Map}static createCache(){const e={frames:new Map,framesNew:new Map,framesURLs:new Map,clearCache:()=>{e.framesNew.forEach((e=>{var t,i;null===(i=(t=e).close)||void 0===i||i.call(t)})),e.frames.clear(),e.framesNew.clear(),e.framesURLs.clear()},counter:0};return e}getCache(e){let t=this.cache.get(e);return t||this.cache.set(e,t=s.createCache()),++t.counter,t}releaseCache(e){const t=this.cache.get(e);t&&!--t.counter&&this.cache.delete(e)}getCacheCounter(e){const t=this.cache.get(e);return null==t?void 0:t.counter}generateName(e,t,i,s,n){return[e,t,i,s?"colored":"",n||""].filter(Boolean).join("-")}}const n=new s},9171:(e,t,i)=>{"use strict";function s(e,t,i,s,n,a,o){return[e,",",t," ",i," ",s,",",n," ",a,",",o].join("")}function n(e,t,i,n,a,o,r,d){const l=[];return l.push("M"+(e+i/2)+","+t),l.push("H"+(e+i-o)),o>0&&l.push("A"+s(o,o,0,0,1,e+i,t+o)),l.push("V"+(t+n-r)),r>0&&l.push("A"+s(r,r,0,0,1,e+i-r,t+n)),l.push("H"+(e+d)),d>0&&l.push("A"+s(d,d,0,0,1,e+0,t+n-d)),l.push("V"+(t+a)),a>0&&l.push("A"+s(a,a,0,0,1,e+a,t+0)),l.push("Z"),l.join(" ")}i.d(t,{Z:()=>n}),i(410).GO.generatePathData=n},1046:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(6740),n=i(1185),a=i(6705);function o(e,t,i){const o=(0,n.Z)(e,t,!1);let r,d;if(i){const e=(0,a.Z)(o);r=e.canvas,d=e.promise}else r=new Image,d=(0,s.cj)(r,o);return r.classList.add("thumbnail"),{image:r,loadPromise:d}}},1185:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4059);function n(e,t,i=!1){return(0,s.Z)(t.bytes,i)}},8580:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(1507),n=i(1046);function a(e,t,i,a=!1){const o=["video","gif"].includes(e.type);if(!t.downloaded||o||a){if("document"===e._&&t.downloaded&&!a&&(!o||t.type!==s.Pt))return null;const r=e.sizes||e.thumbs,d=(null==r?void 0:r.length)?r.find((e=>"photoStrippedSize"===e._)):null;if(d&&"bytes"in d)return(0,n.Z)(e,d,i)}return null}},6074:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(7625),n=i(5953);class a{constructor(e){this.previous=[],this.next=[],this.reverse=!1,this.loadCount=50,this.loadWhenLeft=20,this.loadedAllUp=!1,this.loadedAllDown=!1,(0,n.Z)(this,e)}setTargets(e,t,i){this.previous=e,this.next=t,this.reverse=i}get index(){return void 0!==this.count?this.previous.length:-1}reset(e=!1){this.current=void 0,this.previous=[],this.next=[],this.setLoaded(!0,e),this.setLoaded(!1,e)}go(e,t=!0){let i,s;if(e>0){if(i=this.next.splice(0,e),s=i.pop(),!s)return;void 0!==this.current&&i.unshift(this.current),this.previous.push(...i)}else{if(i=this.previous.splice(Math.max(0,this.previous.length+e),-e),s=i.shift(),!s)return;void 0!==this.current&&i.push(this.current),this.next.unshift(...i)}return this.next.length0),this.current}unsetCurrent(e){e?this.previous.push(this.current):this.next.unshift(this.current),this.current=void 0}goUnsafe(e,t){const i=e>0?Math.max(0,e-this.next.length):Math.min(0,e+this.previous.length),s=this.go(e,!i&&t);return{item:i?void 0:s,leftLength:i}}setLoaded(e,t){return(e?this.loadedAllDown:this.loadedAllUp)!==t&&(e?this.loadedAllDown=t:this.loadedAllUp=t,t||(e?this.loadPromiseDown=null:this.loadPromiseUp=null),!0)}load(e){if(e?this.loadedAllDown:this.loadedAllUp)return Promise.resolve();let t,i=e?this.loadPromiseDown:this.loadPromiseUp;return i||(t=e?this.reverse?this.previous[0]:this.next[this.next.length-1]:this.reverse?this.next[this.next.length-1]:this.previous[0],null!=t||(t=this.current),i=this.loadMore(t,e,this.loadCount).then((t=>{return n=this,a=void 0,r=function*(){if((e?this.loadPromiseDown:this.loadPromiseUp)!==i)return;t.items.length{const t=this.processItem?this.processItem(e):e;t&&n.push(t)}));const a=yield Promise.all(n);e?this.reverse?this.previous.unshift(...a):this.next.push(...a):this.reverse?this.next.push(...a):this.previous.unshift(...a),this.onLoadedMore&&this.onLoadedMore()},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}d((r=r.apply(n,a||[])).next())}));var n,a,o,r}),(()=>{})).then((()=>{e?this.loadPromiseDown=null:this.loadPromiseUp=null})),e?this.loadPromiseDown=i:this.loadPromiseUp=i,i)}}},3699:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(){this.listeners=new Set}add(e){return(t,i,s)=>{const n={element:e,event:t,callback:i,options:s};return this.addManual(n),n}}addManual(e){var t;e.element.addEventListener(e.event,e.callback,e.options),(null===(t=e.options)||void 0===t?void 0:t.once)&&(e.onceCallback=()=>{this.remove(e),e.onceFired=!0},e.element.addEventListener(e.event,e.onceCallback,e.options)),this.listeners.add(e)}remove(e){e.onceFired||(e.element.removeEventListener(e.event,e.callback,e.options),e.onceCallback&&e.element.removeEventListener(e.event,e.onceCallback,e.options)),this.listeners.delete(e)}removeManual(e,t,i,s){let n;for(const a of this.listeners)if(a.element===e&&a.event===t&&a.callback===i&&a.options===s){n=a;break}n&&this.remove(n)}removeAll(){this.listeners.forEach((e=>{this.remove(e)}))}}},9405:(e,t,i)=>{"use strict";i.d(t,{C:()=>a,c:()=>n});var s=i(9897);class n{constructor(e=0,t=e){this.width=e,this.height=t}aspect(e,t){return(0,s.Z)(this.width,this.height,e.width,e.height,t)}aspectFitted(e){return this.aspect(e,!0)}aspectCovered(e){return this.aspect(e,!1)}}function a(e,t){return new n(e,t)}},4755:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,_:()=>s});var s,n=i(410),a=i(3241),o=i(9405);!function(e){e[e.mobile=0]="mobile",e[e.medium=1]="medium",e[e.large=2]="large"}(s||(s={}));const r=(0,o.C)(20,20),d=(0,o.C)(36,36),l=(0,o.C)(18,18);class c extends a.Z{constructor(){super(),this.screenSizes=[{key:s.mobile,value:600},{key:s.medium,value:1275},{key:s.large,value:1680}],this.sizes={handhelds:{regular:(0,o.C)(270,270),webpage:(0,o.C)(270,200),album:(0,o.C)(270,0),esgSticker:(0,o.C)(68,68),animatedSticker:(0,o.C)(180,180),staticSticker:(0,o.C)(180,180),emojiSticker:(0,o.C)(112,112),poll:(0,o.C)(240,0),round:(0,o.C)(200,200),documentName:(0,o.C)(200,0),invoice:(0,o.C)(270,270),extendedInvoice:(0,o.C)(270,270),customEmoji:r,esgCustomEmoji:d,emojiStatus:l,popupSticker:(0,o.C)(68,68)},desktop:{regular:(0,o.C)(420,340),webpage:(0,o.C)(420,340),album:(0,o.C)(420,0),esgSticker:(0,o.C)(72,72),animatedSticker:(0,o.C)(200,200),staticSticker:(0,o.C)(200,200),emojiSticker:(0,o.C)(112,112),poll:(0,o.C)(330,0),round:(0,o.C)(280,280),documentName:(0,o.C)(240,0),invoice:(0,o.C)(320,320),extendedInvoice:(0,o.C)(420,340),customEmoji:r,esgCustomEmoji:d,emojiStatus:l,popupSticker:(0,o.C)(80,80)}},this.isMobile=!1,this.handleResize=()=>{const e=window.innerWidth;let t=this.screenSizes[0].key;for(let i=this.screenSizes.length-1;i>=0;--i)if(this.screenSizes[i].value{this.rAF&&window.cancelAnimationFrame(this.rAF),this.rAF=window.requestAnimationFrame((()=>{this.handleResize(),this.rAF=0}))})),this.handleResize()}}const h=new c;n.GO.mediaSizes=h;const u=h},8631:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});const s=(0,i(5471).Z)("MIDDLEWARE");function n(e,t=s){return i=>{if(!(i instanceof Promise)){if(i instanceof Error)throw i;return i}return i.then((i=>{if(!e())throw t;return i}))}}},3228:(e,t,i)=>{"use strict";function s(e,t,i){return ei?i:e}i.d(t,{Z:()=>s})},2559:(e,t,i)=>{"use strict";function s(e,t=2){if(0===e)return"0";const i=t<0?0:t,s=Math.floor(Math.log(e)/Math.log(1e3));return parseFloat((e/Math.pow(1e3,s)).toFixed(i))+["","K","M","B","T"][s]}i.d(t,{Z:()=>s})},2575:(e,t,i)=>{"use strict";function s(e,t=" "){const i=e.toString().split(".");return i[0]=i[0].replace(/\B(?=(\d{3})+(?!\d))/g,t),i.join(".")}i.d(t,{Z:()=>s})},925:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4762);function n(e,t=e.HAVE_METADATA,i){return new Promise(((n,a)=>{if(e.readyState>=t)return void n();const o=s.IS_APPLE_MOBILE&&!i?"loadeddata":"canplay",r="error",d=()=>{e.removeEventListener(r,l),n()},l=t=>{e.removeEventListener(o,d),a(t)};e.addEventListener(o,d,{once:!0}),e.addEventListener(r,l,{once:!0})}))}},2296:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(6385),n=i(5432),a=i(4762),o=i(3910),r=i(2738),d=i(5975),l=i(3241);class c extends l.Z{constructor(e,t){super(!1),this.navigationType=e,this.withOverlay=t,this.onClick=e=>{var t;this.element&&(0,d.Z)(e.target,this.element)||((null===(t=this.listenerOptions)||void 0===t?void 0:t.capture)&&(0,o.Z)(e),this.close())},this.listenerOptions=t?{}:{capture:!0}}close(){var e;this.element&&(null===(e=this.overlay)||void 0===e||e.remove(),this.element=void 0,this.dispatchEvent("toggle",!1)),n.Z||window.removeEventListener("contextmenu",this.onClick,this.listenerOptions),document.removeEventListener(r.pf,this.onClick,this.listenerOptions),a.IS_MOBILE_SAFARI||s.Z.removeByType(this.navigationType)}open(e){this.close(),a.IS_MOBILE_SAFARI||s.Z.pushItem({type:this.navigationType,onPop:e=>{this.close()}}),this.element=e,!this.overlay&&this.withOverlay&&(this.overlay=document.createElement("div"),this.overlay.classList.add("btn-menu-overlay"),this.overlay.addEventListener(r.pf,(e=>{(0,o.Z)(e),this.onClick(e)}))),this.overlay&&this.element.parentElement.insertBefore(this.overlay,this.element),n.Z||window.addEventListener("contextmenu",this.onClick,Object.assign(Object.assign({},this.listenerOptions),{once:!0})),document.addEventListener(r.pf,this.onClick,this.listenerOptions),this.dispatchEvent("toggle",!0)}}},5180:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(7445);function n(e,t,i){const n=(e=+e)<0,a=s.Z[t];if(!a)throw new Error("CURRENCY_WRAP_INVALID");const o=e/Math.pow(10,a.exp);let r=a.exp;"IRR"==t&&Math.floor(o)==o&&(r=0);let d=function(e,t,i,s){e=(e+"").replace(/[^0-9+\-Ee.]/g,"");var n=isFinite(+e)?+e:0,a=isFinite(+t)?Math.abs(t):0,o=void 0===s?",":s,r=void 0===i?".":i,d="";return(d=(a?function(e,t){var i=Math.pow(10,t);return""+Math.round(e*i)/i}(n,a):""+Math.round(n)).split("."))[0].length>3&&(d[0]=d[0].replace(/\B(?=(?:\d{3})+(?!\d))/g,o)),(d[1]||"").length{"use strict";i.d(t,{Z:()=>n});var s=i(4755);function n(e,t,i,n){e.touches&&(e=e.touches[0]);const{pageX:a,pageY:o}=e,r=Array.from(t.children).find((e=>e.classList.contains("btn-menu-item")&&!e.classList.contains("hide")))||t;let{scrollWidth:d}=r;const{scrollHeight:l}=t,c=document.body.getBoundingClientRect(),h=c.width,u=c.height;d+=2*r.offsetLeft;let p=8,f=8,m=8,g=8;n&&(n.top&&n.top,n.right&&(f+=n.right),n.bottom&&(m+=n.bottom),n.left&&(g+=n.left)),i=s.Z.isMobile?"right":"left";let v="top";const b=u-l-m,y=h-d-f,w=g,S={x:{left:a,right:Math.min(y,a-d)},intermediateX:"right"===i?w:y,y:{top:o,bottom:o-l},intermediateY:b},C={left:S.x.left+d+f<=h,right:S.x.right>=g},L={top:S.y.top+l+m<=u,bottom:S.y.bottom-m>=m};{const e=C[i]?S.x[i]:(i="center",S.intermediateX);t.style.left=e+"px"}{const e=L[v]?S.y[v]:(v="center",S.intermediateY);t.style.top=e+"px"}return t.className=t.className.replace(/(top|center|bottom)-(left|center|right)/g,""),t.classList.add(("center"===v?v:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left")),{width:d,height:l}}},677:(e,t,i)=>{"use strict";i.d(t,{RP:()=>a,X:()=>o});const s=new Set(["all","web","webk"]),n=new Set;function a(e){return e.find((e=>s.has(e.platform)&&!n.has(e.reason)))}function o(e){return!!a(e)}},3174:(e,t,i)=>{"use strict";i.d(t,{O:()=>o,k:()=>a});var s=i(3512);const n={};function a(e,t,i,s){const a=e.id+"-"+t,o=n[a];return o&&o.width>=i&&o.height>=s}function o(e,t,i){return o=this,r=void 0,l=function*(){const o=e.id+"-"+i,{width:r,height:d}=t;if(a(e,i,r,d))return;const l=n[o]={width:r,height:d},c=yield s.Z.managers.appDocsManager.getLottieCachedThumb(e.id,i);if(n[o]!==l)return;if(c&&c.w>=r&&c.h>=d)return;const h=new Promise((e=>{t.toBlob((t=>e(t)))})),u=yield h;n[o]===l&&s.Z.managers.appDocsManager.saveLottiePreview(e.id,u,r,d,i)},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l}},9966:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3035);function n(e){return function(e,t){let i,s=!1;return(...n)=>{i=n,s||(s=!0,e((()=>{s=!1,t(...i)})))}}(s.T2,e)}},8936:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(5953);class n{constructor(e){this.loading=!1,this.loaded=!1,(0,s.Z)(this,e),e.scrollable.onScrolledBottom=()=>{this.load()}}load(){return this.loaded?Promise.resolve():this.loading?this.promise:(this.loading=!0,void(this.promise=this.getPromise().then((e=>{this.loading=!1,this.promise=void 0,e?(this.loaded=!0,this.scrollable.onScrolledBottom=null):this.scrollable.checkForTriggers()}),(()=>{this.promise=void 0,this.loading=!1}))))}}},3719:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3781),n=i(2790),a=i(3512),o=i(7625),r=i(1708),d=i(6074),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class c extends d.Z{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{loadMore:(e,t,i)=>{const a=t?0:i;let o=null==e?void 0:e.mid;var d;return void 0===o&&(o=this.searchContext.maxId),t||(d=o,1,o=(0,s.Z)((0,n.Z)(d)+1)),this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{peerId:this.searchContext.peerId||(null==e?void 0:e.peerId),maxId:o,limit:a?0:i,backLimit:a})).then((e=>("inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(0,r.Z)(e),e.next_rate&&(this.searchContext.nextRate=e.next_rate),{count:e.count,items:e.history})))},processItem:t=>l(this,void 0,void 0,(function*(){if((yield this.filterMids([t.mid])).length)return e.processItem(t)}))})),this.onHistoryDelete=({peerId:e,msgs:t})=>{const i=i=>i.peerId===e&&t.has(i.mid),s=(e,t,s)=>{i(e)&&s.splice(t,1)};(0,o.Z)(this.previous,s),(0,o.Z)(this.next,s),this.current&&i(this.current)&&(this.current=void 0,this.onEmptied&&this.onEmptied())},this.onHistoryMultiappend=e=>l(this,void 0,void 0,(function*(){if(void 0!==this.searchContext.folderId)return;if(!this.loadedAllUp||this.loadPromiseUp)return;if(e.peerId!==this.searchContext.peerId)return;const t=yield this.filterMids([e.mid]),i=(yield Promise.all(t.map((e=>this.processItem(e))))).filter(Boolean);i.length&&(this.current?this.next.push(...i):this.previous.push(...i))})),this.onMessageSent=({message:e})=>{this.onHistoryMultiappend(e)},null!==(t=this.managers)&&void 0!==t||(this.managers=a.Z.managers),a.Z.addEventListener("history_delete",this.onHistoryDelete),a.Z.addEventListener("history_multiappend",this.onHistoryMultiappend),a.Z.addEventListener("message_sent",this.onMessageSent),e.isInner||(this.otherSideLoader=new c(Object.assign(Object.assign({},e),{isInner:!0})))}filterMids(e){return l(this,void 0,void 0,(function*(){const t=`${this.searchContext.peerId}_${this.searchContext.isScheduled?"scheduled":"history"}`;return yield this.managers.appMessagesManager.filterMessagesByInputFilterFromStorage(this.searchContext.inputFilter._,e,t,e.length)}))}setSearchContext(e){this.searchContext=e,void 0!==this.searchContext.folderId&&(this.loadedAllUp=!0,void 0===this.searchContext.nextRate&&(this.loadedAllDown=!0)),"inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(this.loadedAllUp=!0),!1===this.searchContext.useSearch&&(this.loadedAllDown=this.loadedAllUp=!0),this.otherSideLoader&&this.otherSideLoader.setSearchContext(e)}reset(){super.reset(),this.searchContext=void 0,this.otherSideLoader&&this.otherSideLoader.reset()}getPrevious(e){let t=this.previous;return this.otherSideLoader&&e&&(t=t.concat(this.otherSideLoader.previous)),t}getNext(e){let t=this.next;return this.otherSideLoader&&e&&(t=t.concat(this.otherSideLoader.next)),t}getCurrent(){var e;return this.current||(null===(e=this.otherSideLoader)||void 0===e?void 0:e.current)}goToOtherEnd(e){return e>0?this.go(-this.previous.length):this.go(this.next.length)}goRound(e,t){var i;let s;if(null===(i=this.otherSideLoader)||void 0===i?void 0:i.current){if(s=this.otherSideLoader.goUnsafe(e,t),s.item)return s.item;if(!((e=s.leftLength)>0?this.otherSideLoader.next:this.otherSideLoader.previous).length){if(!(e>0?this.otherSideLoader.loadedAllUp:this.otherSideLoader.loadedAllDown))return;if(e>0&&(1===this.otherSideLoader.searchContext.maxId||this.otherSideLoader.loadedAllDown)||e<0&&(0===this.otherSideLoader.searchContext.maxId||this.otherSideLoader.loadedAllUp))return this.otherSideLoader.goToOtherEnd(e);this.otherSideLoader.unsetCurrent(e>0)}}if(s=this.goUnsafe(e,t),!s.item){if(this.loadedAllUp&&this.loadedAllDown)return this.goToOtherEnd(e);this.otherSideLoader&&(e=s.leftLength,s=this.otherSideLoader.goUnsafe(e,t),s.item&&this.unsetCurrent(e>0))}return null==s?void 0:s.item}setLoaded(e,t){var i;const s=super.setLoaded(e,t);if(s&&this.otherSideLoader&&t&&!1!==(null===(i=this.searchContext)||void 0===i?void 0:i.useSearch)){const e=this.loadedAllUp;this.otherSideLoader.setSearchContext(Object.assign(Object.assign({},this.searchContext),{maxId:e?1:0})),this.otherSideLoader.reverse=this.reverse,this.otherSideLoader.setLoaded(e,!0),this.otherSideLoader.load(!e)}return s}cleanup(){this.reset(),a.Z.removeEventListener("history_delete",this.onHistoryDelete),a.Z.removeEventListener("history_multiappend",this.onHistoryMultiappend),a.Z.removeEventListener("message_sent",this.onMessageSent),this.onEmptied=void 0,this.otherSideLoader&&(this.otherSideLoader.cleanup(),this.otherSideLoader=void 0)}}},9674:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(3035),n=i(3725),a=i(410),o=i(8487);const r=new class{constructor(){this.promises={},this.raf=s.T2.bind(null),this.scheduled=!1}do(e,t){let i=this.promises[e];return i||(this.scheduleFlush(),i=this.promises[e]=(0,n.Z)()),void 0!==t&&i.then((()=>t())),i}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const i=(0,o.Z)(e),s=i?this.mutate():Promise.resolve();return void 0!==t&&(i?s.then((()=>t())):t()),s}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf((()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}})))}};a.GO&&(a.GO.sequentialDom=r);const d=r},1713:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(1507),n=i(7030),a=i(9405),o=i(3114);function r(e,t,i,r,d=!0,l,c,h){const u=(0,o.Z)(e);let p;h||(h=(0,n.Z)(e,i,r,void 0,c));const f="document"===e._;p=f||u?(0,a.C)(e.w||h.w||512,e.h||h.h||512):(0,a.C)(h.w||100,h.h||100);let m=(0,a.C)(i,r);m=p=p.aspect(m,d);let g=!0;return(!f||["video","gif"].includes(e.type)||u)&&(m.width<200&&m.height<200&&(m=p=p.aspectCovered((0,a.C)(200,200))),l&&(l.message||l.reply_to_mid||l.media.webpage||l.replies&&l.replies.pFlags.comments&&l.replies.channel_id.toChatId()!==s.IA)&&m.width<320&&(m=(0,a.C)(320,m.height),g=!1),g&&m.width<120&&l&&(m=(0,a.C)(120,m.height),g=!1)),t.style.width=m.width+"px",t.style.height=m.height+"px",{photoSize:h,size:p,isFit:g}}},5345:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,s:()=>h});var s=i(5003),n=i(6519),a=i(3624),o=i(8631),r=i(5953),d=i(5418),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let c=0;class h{constructor(e){var t;(0,r.Z)(this,e),this.queue=[],null!==(t=this.middlewareHelper)&&void 0!==t||(this.middlewareHelper=(0,a.k)());const i="BATCH-PROCESSOR-"+ ++c;this.log?this.log=this.log.bindPrefix(i):this.log=(0,s.kg)(i)}get queuePromise(){return this.promise}clear(){this.log("clear"),this.queue.length=0,this.promise=void 0,this.middlewareHelper.clean()}addToQueue(e){return this.queue.push(e),this.setQueue()}setQueue(){if(!this.queue.length)return Promise.resolve();if(this.promise)return this.promise;const e=this.middlewareHelper.get(),t=this.log.bindPrefix("queue"),i=(0,o.Z)(e,this.possibleError),s=()=>l(this,void 0,void 0,(function*(){t("start",this.queue.length);const e=this.queue.splice(0,this.queue.length),n=performance.now(),a=e.map((e=>(e.then((e=>{t("render item time",performance.now()-n,e)})),e))),o=yield i(Promise.all(a));if(yield i(this.process(o,i,t)),t("queue rendered"),this.queue.length)return t("have new items to render"),s();t("end")}));t("setting pause");const n=this.promise=i((0,d.Z)(0)).then((()=>s().catch((e=>{throw e!==this.possibleError&&t.error("process queue error",e),e}))),(e=>{throw t("pause has been cleared"),e})).finally((()=>{this.promise===n&&(this.promise=void 0)}));return n}}class u{constructor(e){this.updateElementWith=e=>e(),this.updateListWith=e=>e(!0),(0,r.Z)(this,e),this.elements=new Map,this.sorted=[],this.middleware=(0,a.k)(),this.batchProcessor=new h({log:this.log,process:(e,t,i)=>l(this,void 0,void 0,(function*(){const i=e.map((e=>this.update(e.id,e)));yield t(Promise.all(i))}))})}clear(){this.batchProcessor.clear(),this.middleware.clean(),this.elements.clear(),this.sorted.length=0}_updateList(){this.elements.forEach((e=>{this.update(e.id)})),this.onSort&&this.sorted.forEach(((e,t)=>{this.onSort(e,t)}))}updateList(e){const t=this.middleware.get();this.updateListWith((i=>{t()&&(void 0===i||i)?(this._updateList(),null==e||e(!0)):null==e||e(!1)}))}has(e){return this.elements.has(e)}get(e){return this.elements.get(e)}getAll(){return this.elements}add(e){return l(this,void 0,void 0,(function*(){if(this.get(e))return;const t={id:e,index:0};this.elements.set(e,t);const i=Promise.resolve(this.onElementCreate(t));return this.batchProcessor.addToQueue(i)}))}delete(e,t){const i=this.elements.get(e);if(!i)return!1;this.elements.delete(e);const s=this.sorted.indexOf(i);if(-1!==s&&this.sorted.splice(s,1),this.onDelete)if(t)this.onDelete(i);else{const e=this.middleware.get();this.updateElementWith((()=>{e()&&this.onDelete(i)}))}return!0}update(e,t=this.get(e)){var i;return l(this,void 0,void 0,(function*(){if(!t)return;if(t.index=yield this.getIndex(t),this.get(e)!==t)return;null===(i=this.onUpdate)||void 0===i||i.call(this,t);const s=(0,n.Z)(this.sorted,t,"index");this.onSort(t,s)}))}}},6854:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s="\ufeff"},4056:(e,t,i)=>{"use strict";function s(e){return e.replace(/&/g,"&").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,(e=>"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";")).replace(/([^\#-~| |!])/g,(e=>"&#"+e.charCodeAt(0)+";")).replace(//g,">")}i.d(t,{Z:()=>s})},3738:(e,t,i)=>{"use strict";function s(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}i.d(t,{Z:()=>s})},8456:(e,t,i)=>{"use strict";function s(e,t,i=t+10){return(e=e.trim()).length>i&&(e=e.slice(0,t)+"..."),e}i.d(t,{Z:()=>s})},5157:(e,t,i)=>{"use strict";function s(e,t=!1){const i=parseInt(e+"",10),s=Math.floor(i/3600);let n=Math.floor((i-3600*s)/60),a=i-3600*s-60*n;return s&&(t=!0),n<10&&(n=t?"0"+n:n),a<10&&(a="0"+a),(s?s+":":"")+n+":"+a}i.d(t,{Z:()=>s})},8812:(e,t,i)=>{"use strict";function s(e){const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise((e=>{const i=new FileReader;i.onload=t=>{e(t.target.result)},i.readAsDataURL(t)}))}i.d(t,{Z:()=>s})},241:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1352);const n=new class{constructor(){if(s.kC)return;const e="visualViewport"in window?window.visualViewport:window,t=()=>{this.width=e.width||e.innerWidth,this.height=e.height||e.innerHeight};e.addEventListener("resize",t),t()}}},8594:(e,t,i)=>{"use strict";i.d(t,{YW:()=>p,ZP:()=>v,e9:()=>g,gp:()=>m});var s=i(3725),n=i(410),a=i(5418);const o=new(i(3241).Z),r="start",d="end";let l=!1,c=(0,s.Z)(),h=0;c.resolve();const u=console.log.bind(console.log,"[HEAVY-ANIMATION]:");function p(e,t){l||(c=(0,s.Z)(),o.dispatchEvent(r),l=!0,n.ZP&&u("start")),++h,n.ZP&&u("attach promise, length:",h,t);const i=[void 0!==t?(0,a.Z)(t):void 0,e.finally((()=>{}))].filter(Boolean),d=performance.now(),p=c;return Promise.race(i).then((()=>{c!==p||c.isFulfilled||(--h,n.ZP&&u("promise end, length:",h,performance.now()-d),h<=0&&f())})),c}function f(){c.isFulfilled||(l=!1,h=0,o.dispatchEvent(d),c.resolve(),n.ZP&&u("end"))}function m(){f()}function g(){return c}function v(e,t,i){l&&e();const s=i?i.add(o):o.addEventListener.bind(o),n=i?i.removeManual.bind(i,o):o.removeEventListener.bind(o);return s(r,e),s(d,t),()=>{n(d,t),n(r,e)}}window.dispatchHeavyAnimationEvent=p},8130:(e,t,i)=>{"use strict";i.r(t),i.d(t,{AppDialogsManager:()=>ht,DIALOG_LIST_ELEMENT_TAG:()=>it,default:()=>pt});var s=i(9331),n=i(3512),a=i(3003),o=i(6194),r=i(2325),d=i(4668),l=i(2796),c=i(3897),h=i(1483),u=i(3416),p=i(1507),f=i(3186),m=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class g{constructor(e){this.managers=e,this.onArchiveClick=()=>m(this,void 0,void 0,(function*(){const e=yield this.managers.appMessagesManager.getDialogOnly(this.peerId);e&&this.managers.appMessagesManager.editPeerFolders([e.peerId],+!e.folder_id)})),this.hideTopic=()=>{this.managers.appChatsManager.editForumTopic({chatId:this.peerId.toChatId(),topicId:this.threadId,hidden:!0})},this.toggleTopic=()=>{this.managers.appChatsManager.editForumTopic({chatId:this.peerId.toChatId(),topicId:this.threadId,closed:!this.dialog.pFlags.closed})},this.onPinClick=()=>{const{peerId:e,filterId:t,threadId:i}=this;this.managers.appMessagesManager.toggleDialogPin({peerId:e,filterId:t,topicId:i}).catch((e=>m(this,void 0,void 0,(function*(){"PINNED_DIALOGS_TOO_MUCH"!==e.type&&"PINNED_TOO_MUCH"!==e.type||(i?this.managers.apiManager.getLimit("topicPin").then((e=>{(0,l.bC)({langPackKey:"LimitReachedPinnedTopics",langPackArguments:[e]})})):t>=1?(0,l.bC)({langPackKey:"PinFolderLimitReached"}):(0,f.Z)("pin"))}))))},this.onUnmuteClick=()=>{this.managers.appMessagesManager.togglePeerMute({peerId:this.peerId,mute:!1,threadId:this.threadId})},this.onMuteClick=()=>{new c.Z(this.peerId,this.threadId)},this.onUnreadClick=()=>m(this,void 0,void 0,(function*(){const{peerId:e,dialog:t}=this;t.unread_count?(this.managers.appMessagesManager.readHistory(e,t.top_message,this.threadId),this.threadId||this.managers.appMessagesManager.markDialogUnread(e,!0)):this.threadId||this.managers.appMessagesManager.markDialogUnread(e)})),this.onDeleteClick=()=>{new o.Z(this.peerId,void 0,void 0,this.threadId)},this.onContextMenu=e=>{this.init&&(this.init(),this.init=null);let t=null;try{t=(0,d.Z)(e.target,it)}catch(e){}if(t){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),(()=>{m(this,void 0,void 0,(function*(){this.peerId=t.dataset.peerId.toPeerId(),this.threadId=+t.dataset.threadId||void 0,this.dialog=yield this.managers.dialogsStorage.getDialogOrTopic(this.peerId,this.threadId),this.filterId=this.threadId?void 0:pt.filterId,this.canManageTopics=this.threadId?yield this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"manage_topics"):void 0,yield Promise.all(this.buttons.map((e=>m(this,void 0,void 0,(function*(){const t=yield e.verify();e.element.classList.toggle("hide",!t)})))));const i=this.threadId?"Delete":yield this.managers.appPeersManager.getDeleteButtonText(this.peerId);this.buttons[this.buttons.length-1].element.lastChild.replaceWith((0,r.ag)(i)),t.classList.add("menu-open"),(0,h.Z)(e,this.element),u.Z.openBtnMenu(this.element,(()=>{t.classList.remove("menu-open"),this.peerId=this.dialog=this.filterId=this.threadId=this.canManageTopics=void 0}))}))})()}}}init(){this.buttons=[{icon:"unread",text:"MarkAsUnread",onClick:this.onUnreadClick,verify:()=>m(this,void 0,void 0,(function*(){return!this.threadId&&!(yield this.managers.appMessagesManager.isDialogUnread(this.dialog))}))},{icon:"readchats",text:"MarkAsRead",onClick:this.onUnreadClick,verify:()=>this.managers.appMessagesManager.isDialogUnread(this.dialog)},{icon:"pin",text:"ChatList.Context.Pin",onClick:this.onPinClick,verify:()=>m(this,void 0,void 0,(function*(){var e;return!(this.threadId&&!this.canManageTopics)&&!(void 0!==this.filterId&&this.filterId>1?(yield this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId):null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned)}))},{icon:"unpin",text:"ChatList.Context.Unpin",onClick:this.onPinClick,verify:()=>m(this,void 0,void 0,(function*(){var e;return!(this.threadId&&!this.canManageTopics)&&(void 0!==this.filterId&&this.filterId>1?(yield this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId):!!(null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned))}))},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>m(this,void 0,void 0,(function*(){return this.peerId!==n.Z.myId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.dialog.peerId,threadId:this.threadId}))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:this.onUnmuteClick,verify:()=>m(this,void 0,void 0,(function*(){return this.peerId!==n.Z.myId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.dialog.peerId,threadId:this.threadId}))}))},{icon:"archive",text:"Archive",onClick:this.onArchiveClick,verify:()=>0===this.filterId&&this.peerId!==n.Z.myId},{icon:"unarchive",text:"Unarchive",onClick:this.onArchiveClick,verify:()=>1===this.filterId&&this.peerId!==n.Z.myId},{icon:"hide",text:"Hide",onClick:this.hideTopic,verify:()=>m(this,void 0,void 0,(function*(){return this.canManageTopics&&this.dialog.id===p.Ox}))},{icon:"lock",text:"CloseTopic",onClick:this.toggleTopic,verify:()=>this.canManageTopics&&!this.dialog.pFlags.closed},{icon:"lockoff",text:"RestartTopic",onClick:this.toggleTopic,verify:()=>this.canManageTopics&&!!this.dialog.pFlags.closed},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>m(this,void 0,void 0,(function*(){return!this.threadId||!!this.canManageTopics&&this.dialog.id!==p.Ox}))}],this.element=(0,a.b)({buttons:this.buttons}),this.element.id="dialogs-contextmenu",this.element.classList.add("contextmenu"),document.getElementById("page-chats").append(this.element)}}var v=i(6008),b=i(1405),y=i(8805),w=i(632),S=i(4762),C=i(5003),L=i(4271),E=i(4494),I=i(9099),M=i(410),P=i(8842),Z=i(1447),k=i(9492),T=i(534),x=i(4273),A=i(2738),_=i(4484),F=i(5565),D=i(4159),R=i(3442),B=i(7487),N=i(9174),O=i(3910),U=i(490);class H{constructor(e,t){this.managers=e,this.hadConnect=!1,this.connecting=!1,this.timedOut=!1,this.updating=!1,this.setConnectionStatus=e=>{Promise.all([B.Z.get("dc"),n.Z.managers.rootScope.getConnectionStatus()]).then((([t,i])=>{t||(t=D.Z.baseDcId),this.setFirstConnectionTimeout&&(clearTimeout(this.setFirstConnectionTimeout),this.setFirstConnectionTimeout=0);const s=i["NET-"+t],n=s&&(e||s.status)===N.Q.Connected;this.connecting&&n&&this.managers.apiUpdatesManager.forceGetDifference(),n&&!this.hadConnect&&(this.hadConnect=!0),this.timedOut=s&&(e||s.status)===N.Q.TimedOut,this.connecting=!n,this.retryAt=s&&s.retryAt,M.ZP&&this.log("connecting",this.connecting),this.setState()}))},this.setStatusText=(e,t)=>{this.currentLangPackKey!==e&&(this.currentLangPackKey=e,(0,F.Z)(this.statusEl,(0,r.ag)(e,t)),this.statusPreloader.attach(this.statusEl))},this.setState=()=>{if(U.Z.deactivatedReason)return;const e=H.CHANGE_STATE_DELAY;if(this.connecting)if(this.timedOut){const e=this.getA("ConnectionStatus.ForceReconnect",(()=>this.managers.networkerFactory.forceReconnect()));this.setStatusText("ConnectionStatus.TimedOut",[e])}else if(this.hadConnect)if(void 0!==this.retryAt){const e=document.createElement("span"),t=this.retryAt,i=()=>{const i=Date.now();e.innerText=""+Math.max(0,Math.round((t-i)/1e3)),i>t&&clearInterval(s)},s=setInterval(i,1e3);i();const n=this.getA("ConnectionStatus.Reconnect",(()=>this.managers.networkerFactory.forceReconnectTimeout()));this.setStatusText("ConnectionStatus.ReconnectIn",[e,n])}else this.setStatusText("ConnectionStatus.Reconnecting");else this.setStatusText("ConnectionStatus.Waiting");else this.updating&&this.setStatusText("Updating");M.ZP&&this.log("setState",this.connecting||this.updating),window.requestAnimationFrame((()=>{this.setStateTimeout&&clearTimeout(this.setStateTimeout),this.setStateTimeout=window.setTimeout((()=>{(0,I.Z)({element:this.statusContainer,className:"is-shown",forwards:this.connecting||this.updating,duration:200}),this.setStateTimeout=0,M.ZP&&this.log("setState: isShown:",this.connecting||this.updating)}),e)}))},this.log=(0,C.kg)("CS",void 0,void 0),this.statusContainer=document.createElement("div"),this.statusContainer.classList.add("connection-status"),this.statusEl=(0,E.Z)("btn-primary bg-warning connection-status-button",{noRipple:!0}),this.statusPreloader=new R.Z({cancelable:!1}),this.statusPreloader.constructContainer({color:"transparent",bold:!0}),this.statusContainer.append(this.statusEl),t.prepend(this.statusContainer),n.Z.addEventListener("connection_status_change",(e=>{this.setConnectionStatus()})),n.Z.addEventListener("state_synchronizing",(e=>{e||(this.updating=!0,M.ZP&&this.log("updating",this.updating),this.setState())})),n.Z.addEventListener("state_synchronized",(e=>{M.ZP&&this.log("state_synchronized",e),e||(this.updating=!1,M.ZP&&this.log("updating",this.updating),this.setState())})),this.setFirstConnectionTimeout=window.setTimeout(this.setConnectionStatus,H.CHANGE_STATE_DELAY+1e3)}getA(e,t){const i=document.createElement("a");return i.classList.add("force-reconnect"),i.append((0,r.ag)(e)),(0,A.fc)(i,(e=>{(0,O.Z)(e),t()})),i}}H.CHANGE_STATE_DELAY=1e3;var z,j=i(6740),G=i(3035),V=i(2894),K=i(5432),W=i(1154),$=i(241),q=i(8487);!function(e){e[e.Error=-1]="Error",e[e.Pending=0]="Pending",e[e.Sent=1]="Sent",e[e.Read=2]="Read"}(z||(z={}));var Q=i(5345),Y=i(5701),X=i(5296),J=i(8222);function ee(e,t,i,s){return e>=s?t+i:function(e,t){return-t/2*(Math.cos(Math.PI*e)-1)}(e/s,i)+t}var te=i(4755);function ie(e,t,i,s,n,a,o,r){const d=e.canvas.dpr;if(d&&(t*=d,i*=d,s*=d,n*=d),"number"==typeof a)d&&(a*=d),a={tl:a,tr:a,br:a,bl:a};else{const e={tl:0,tr:0,br:0,bl:0};for(const t in e)a[t]=a[t]?d?a[t]*d:a[t]:e[t]}e.beginPath(),e.moveTo(t+a.tl,i),e.lineTo(t+s-a.tr,i),e.quadraticCurveTo(t+s,i,t+s,i+a.tr),e.lineTo(t+s,i+n-a.br),e.quadraticCurveTo(t+s,i+n,t+s-a.br,i+n),e.lineTo(t+a.bl,i+n),e.quadraticCurveTo(t,i+n,t,i+n-a.bl),e.lineTo(t,i+a.tl),e.quadraticCurveTo(t,i,t+a.tl,i),e.closePath(),o&&e.fill(),r&&e.stroke()}const se=window.devicePixelRatio,ne=20*se,ae=2.5*se,oe=2*se,re=1*se;var de=i(6818),le=i(6385),ce=i(3013),he=i(130),ue=i(4332),pe=i(1168),fe=i(7030),me=i(8115),ge=i(496),ve=i(5381),be=i(7530),ye=i(2291),we=i(5772),Se=i(3385),Ce=i(2554),Le=i(8050),Ee=i(6976),Ie=i(3725),Me=i(7362),Pe=i(8631),Ze=i(2312),ke=i(2059),Te=i(2493),xe=i(319);var Ae=i(3228);class _e{constructor(){this.font="30pt Helvetica",this.currTime=Date.now(),this.diffTime=0,this.spread=0,this.paused=!1,this.pausedTime=0,this.pauseInterval=850,this.lightSource=0,this.inc=.032,this.lightSpread=.55,this.animations=["slide","slide","slide","slide"],this.currentAnimationIndex=0}keepTime(){this.diffTime=Date.now()-this.currTime,this.currTime=Date.now()}cycleAnimation(){++this.currentAnimationIndex,this.currentAnimationIndex>=this.animations.length&&(this.currentAnimationIndex=0)}animate(){const e=this.animations[this.currentAnimationIndex];return"glow"===e?this.animateGlow():"slide"===e?this.animateSlide():void console.log("unknown animation type: "+String(e))}animateGlow(){var e=68;return()=>{var t=this.diffTime/(1e3/60)*10;return this.paused?Date.now()-this.pausedTime>800&&(e=68,this.cycleAnimation(),this.paused=!1):(e=parseInt(""+(e+t)))>=255&&(this.paused=!0,this.pausedTime=Date.now()),"rgb("+e+","+e+","+e+")"}}animateSlide(){var e,t,i,s=this.ctx.createLinearGradient(0,0,this.canvas.width,0),n=this.inc*(this.diffTime/(1e3/60));if(this.paused){if(Date.now()-this.pausedTime>this.pauseInterval)return this.lightSource=-.6,this.cycleAnimation(),this.paused=!1,this.animateSlide()}else this.lightSource+=n,this.lightSource>1+this.lightSpread&&(this.paused=!0,this.pausedTime=Date.now());i=(0,Ae.Z)(this.lightSource,0,1),e=(0,Ae.Z)(this.lightSource-this.lightSpread,0,1),t=(0,Ae.Z)(this.lightSource+this.lightSpread,0,1);const a=J.Z.getProperty("background-color-true"),o=J.Z.getProperty("surface-color");return s.addColorStop(e,a),s.addColorStop(i,o),s.addColorStop(t,a),s}settings(e={}){var t,i,s,n,a,o;this.canvas=null!==(t=e.canvas)&&void 0!==t?t:document.createElement("canvas"),this.ctx=this.canvas.getContext("2d"),this.font=null!==(i=e.font)&&void 0!==i?i:this.font,this.lightSpread=null!==(s=e.lightSpread)&&void 0!==s?s:this.lightSpread,this.inc=null!==(n=e.inc)&&void 0!==n?n:this.inc,this.animations=null!==(a=e.animations)&&void 0!==a?a:this.animations,this.text=null!==(o=e.text)&&void 0!==o?o:this.text,this.fillStyle=e.fillStyle,this.canvas.classList.add("shimmer-canvas")}on(){const{width:e,height:t}=this.canvas;this.keepTime(),this.ctx.clearRect(0,0,e,t),this.font&&(this.ctx.font=this.font),this.ctx.fillStyle=this.animate(),this.ctx.fillRect(0,0,e,t),this.fillStyle&&(this.ctx.fillStyle=this.fillStyle,this.ctx.fillRect(0,0,e,t)),this.text&&this.ctx.fillText(this.text,50,50)}}class Fe{constructor(e={}){var t,i,s;this.onThemeChange=()=>{this.stopAnimation(),this.startAnimation()},this.onResize=()=>{const{canvas:e}=this,{width:t,height:i,dpr:s}=e;this.updateCanvasSize(),e.width===t&&e.height===i&&e.dpr===s||(this.stopAnimation(),this.startAnimation())},this.shimmer=new _e,this.tempId=0,this.canvas=document.createElement("canvas"),this.canvas.classList.add("dialogs-placeholder-canvas"),this.ctx=this.canvas.getContext("2d"),this.generatedValues=[],this.avatarSize=null!==(t=e.avatarSize)&&void 0!==t?t:54,this.marginVertical=null!==(i=e.marginVertical)&&void 0!==i?i:9,this.totalHeight=null!==(s=e.totalHeight)&&void 0!==s?s:this.avatarSize+2*this.marginVertical,this.lineHeight=10,this.lineBorderRadius=6,this.lineMarginVertical=8,this.statusWidth=24}attach({container:e,rect:t,getRectFrom:i,onRemove:s,blockScrollable:n}){const{canvas:a}=this;this.onRemove=s,this.getRectFrom="function"==typeof i?i:(i||e).getBoundingClientRect.bind(i||e),(this.blockScrollable=n)&&(n.container.style.overflowY="hidden"),this.updateCanvasSize(t),this.startAnimation(),e.append(a)}detach(e){this.detachTime||(this.availableLength=e,this.detachTime=Date.now(),n.Z.settings.animationsEnabled||this.remove())}remove(){var e;this.stopAnimation(),this.canvas.parentElement&&(this.canvas.remove(),this.blockScrollable&&(this.blockScrollable.container.style.overflowY="",this.blockScrollable=void 0)),null===(e=this.onRemove)||void 0===e||e.call(this),this.onRemove=void 0}updateCanvasSize(e=this.getRectFrom()){const{canvas:t}=this,i=t.dpr=window.devicePixelRatio;t.width=e.width*i,t.height=e.height*i,t.style.width=e.width+"px",t.style.height=e.height+"px"}renderDetachAnimationFrame(){const{canvas:e,ctx:t,detachTime:i,length:s,availableLength:a}=this;if(!i)return;if(!n.Z.settings.animationsEnabled)return void this.remove();const{width:o}=e;t.globalCompositeOperation="destination-out";const r=Date.now()-i;let d=!0;for(let e=0;e=a?15*(a-1):15*e);if(i<=0){d=!1;continue}const n=ee(i,0,1,150);t.beginPath(),t.rect(0,this.dialogHeight*e,o,this.dialogHeight),t.fillStyle=`rgba(0, 0, 0, ${n})`,t.fill(),n<1&&(d=!1)}t.globalCompositeOperation="source-over",d&&this.remove()}renderFrame(){this.shimmer.on(),this.renderDetachAnimationFrame()}startAnimation(){const{canvas:e,shimmer:t}=this,i=++this.tempId,s=this.createPattern();t.settings({canvas:e,fillStyle:s});const a=()=>this.tempId===i;this.renderFrame(),(0,X.jt)((()=>!!a()&&(n.Z.settings.animationsEnabled&&this.renderFrame(),a()))),n.Z.addEventListener("theme_change",this.onThemeChange),te.Z.addEventListener("resize",this.onResize)}stopAnimation(){++this.tempId,n.Z.removeEventListener("theme_change",this.onThemeChange),te.Z.removeEventListener("resize",this.onResize)}createPattern(){const{canvas:e,ctx:t}=this,i=document.createElement("canvas"),s=i.getContext("2d"),n=e.dpr;i.dpr=n,i.width=e.width,i.height=e.height,s.fillStyle=J.Z.getProperty("surface-color"),s.fillRect(0,0,i.width,i.height),s.fillStyle="#000",s.globalCompositeOperation="destination-out";const a=this.dialogHeight=this.totalHeight*n,o=this.length=Math.ceil(e.height/a);for(let e=0;e{})).finally((()=>{e[t]===s&&delete e[t]}));const n=(0,Pe.Z)((()=>e[t]===s));return{deferred:s,middleware:n}}class nt extends Q.Z{constructor(e){super({getIndex:e=>{var t;return this.managers.dialogsStorage.getDialogIndex(null!==(t=this.forumPeerId)&&void 0!==t?t:e.id,this.indexKey,this.forumPeerId?e.id:void 0)},onDelete:e=>{var t;e.dom.listEl.remove(),null===(t=this.onListLengthChange)||void 0===t||t.call(this)},onSort:(e,t)=>{var i;const s=e.dom.listEl.parentElement!==this.list;(0,_.Z)(e.dom.listEl,this.list,t),s&&(null===(i=this.onListLengthChange)||void 0===i||i.call(this))},onElementCreate:e=>tt(this,void 0,void 0,(function*(){var t;const i=[],s=ut.addListDialog({peerId:null!==(t=this.forumPeerId)&&void 0!==t?t:e.id,loadPromises:i,isBatch:!0,threadId:this.forumPeerId?e.id:void 0,isMainList:"index_0"===this.indexKey});return e.dom=s.dom,e.dialogElement=s,yield Promise.all(i),e})),updateElementWith:G.TR,log:e.log}),(0,Ve.Z)(this,e)}clear(){this.list.replaceChildren(),super.clear()}}class at extends ze.ZP{constructor({peerId:e,rippleEnabled:t=!0,onlyFirstName:i=!1,meAsSaved:n=!0,avatarSize:a="bigger",autonomous:o,loadPromises:r,fromName:d,noIcons:l,threadId:c,wrapOptions:h={},isMainList:u}){var p;super({clickable:!0,noRipple:!t,havePadding:!c,title:!0,titleRightSecondary:!0,subtitle:!0,subtitleRight:!0,noWrap:!0,asLink:!0}),this.subtitleRight.remove();const f=c?void 0:new s.Z;if(f){const t={bigger:54,abitbigger:42,small:32}[a];f.classList.add("dialog-avatar","avatar-"+t),f.updateWithOptions({loadPromises:r,lazyLoadQueue:h.lazyLoadQueue,isDialog:!!n,peerId:e,peerTitle:d}),this.applyMediaElement(f,a)}const m=this.container,g=this.title;g.classList.add("user-title"),this.titleRow.classList.add("dialog-title");const v=new P.Z,b=v.update({peerId:e,fromName:d,dialog:n,onlyFirstName:i,withIcons:!l,threadId:c});null==r||r.push(b),g.append(v.element),g.classList.add("tgico");const y=this.subtitle,w=this.container;w.classList.add("chatlist-chat","chatlist-chat-"+a),o||(w.href="#"+e),"bigger"===a?this.container.classList.add("row-big"):"small"===a&&this.container.classList.add("row-small"),w.dataset.peerId=""+e,c&&(w.dataset.threadId=""+c);const S=document.createElement("span");S.classList.add("message-status","sending-status");const C=document.createElement("span");C.classList.add("message-time");const E=this.titleRight;E.classList.add("dialog-title-details"),E.append(S,C),this.subtitleRow.classList.add("dialog-subtitle");const I=this.dom={avatarEl:f,captionDiv:m,titleSpan:v.element,titleSpanContainer:g,statusSpan:S,lastTimeSpan:C,lastMessageSpan:y,containerEl:w,listEl:w,subtitleEl:this.subtitleRow};if(!o){w.dialogDom=I;const t=L.Z.chat;t&&L.Z.isSamePeer(t,{peerId:e,threadId:c,type:"chat"})&&ut.setDialogActive(w,!0),u&&(null===(p=ut.forumTab)||void 0===p?void 0:p.peerId)===e&&!c&&w.classList.add("is-forum-open")}}createUnreadBadge(){if(this.dom.unreadBadge)return;const e=this.dom.unreadBadge=document.createElement("div");e.className="dialog-subtitle-badge badge badge-22",this.dom.subtitleEl.append(e)}createUnreadAvatarBadge(){if(this.dom.unreadAvatarBadge)return;const e=this.dom.unreadAvatarBadge=document.createElement("div");e.className="dialog-subtitle-badge badge badge-22 avatar-badge",this.dom.listEl.append(e)}createMentionsBadge(){if(this.dom.mentionsBadge)return;const e=this.dom.mentionsBadge=document.createElement("div");e.className="dialog-subtitle-badge badge badge-22 mention mention-badge",e.innerText="@",this.dom.lastMessageSpan.after(e)}toggleBadgeByKey(e,t,i,s){(0,I.Z)({element:this.dom[e],className:"is-visible",forwards:t,duration:s?0:250,onTransitionEnd:t?void 0:()=>{this.dom[e].remove(),delete this.dom[e]},useRafs:i&&(0,q.Z)(this.dom[e])?0:2})}}class ot extends Ge.h{toggle(e){return tt(this,void 0,void 0,(function*(){this.init2&&(yield this.init2()),(0,I.Z)({element:this.container,className:"is-visible",forwards:e,duration:300,onTransitionEnd:e?void 0:()=>{this.onCloseAfterTimeout()},useRafs:this.firstTime?(this.firstTime=void 0,2):void 0})}))}init(e){(0,Ve.Z)(this,e),this.log=(0,C.kg)("FORUM"),this.firstTime=!0,this.container.classList.add("topics-container");const t=!this.slider;t&&(this.closeBtn.classList.replace("tgico-left","tgico-close"),this.container.classList.add("active","is-floating"),(0,A.fc)(this.closeBtn,(()=>{ut.toggleForumTab(void 0,this)}),{listenerSetter:this.listenerSetter})),this.rows=document.createElement("div"),this.rows.classList.add("sidebar-header__rows"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("sidebar-header__subtitle"),this.title.replaceWith(this.rows),this.rows.append(this.title,this.subtitle);const i=ut.createChatList();ut.setListClickListener(i,null,!0),this.scrollable.append(i),this.xd=new lt(this.peerId,t?80:0),this.xd.scrollable=this.scrollable,this.xd.sortedList=new nt({managers:this.managers,log:this.log,list:i,indexKey:"index_0",forumPeerId:this.peerId}),this.xd.bindScrollable();const s=()=>({peerId:this.peerId,type:"chat"}),a=(0,We.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[{icon:"info",text:"ForumTopic.Context.Info",onClick:()=>tt(this,void 0,void 0,(function*(){const e=x.ZP.createTab(Qe.Z,!0);e.isFirst=!0,e.setPeer(this.peerId),(yield e.fillProfileElements())(),e.loadSidebarMedia(!0),e.open()}))},{icon:"message",text:"ForumTopic.Context.ShowAsMessages",onClick:()=>{const e=L.Z.chat;L.Z[(null==e?void 0:e.peerId)===this.peerId?"setPeer":"setInnerPeer"](s())},verify:()=>{const e=L.Z.chat;return!e||!L.Z.isSamePeer(e,s())}},{icon:"adduser",text:"ForumTopic.Context.AddMember",onClick:()=>{},verify:()=>!1},{icon:"add",text:"ForumTopic.Context.New",onClick:()=>{x.ZP.createTab(Je.Z).open(this.peerId)},separator:!0,verify:()=>this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"manage_topics")}]});if(this.listenerSetter.add(n.Z)("history_reload",(e=>{this.peerId===e&&this.xd.fullReset()})),this.listenerSetter.add(n.Z)("chat_update",(e=>tt(this,void 0,void 0,(function*(){this.peerId===e.toPeerId(!0)&&((yield this.managers.appChatsManager.getChat(e)).pFlags.forum||ut.toggleForumTab(void 0,this))})))),K.Z&&(0,W.Z)({element:this.container,onSwipe:()=>{ut.toggleForumTab(void 0,this)},middleware:this.middlewareHelper.get()}),this.header.append(a),!t)return this.init2()}init2(){return tt(this,void 0,void 0,(function*(){this.init2=void 0;const e=this.middlewareHelper.get(),t=this.peerId;this.managers.apiUpdatesManager.subscribeToChannelUpdates(this.peerId.toChatId()),e.onDestroy((()=>{this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(this.peerId.toChatId())}));const i=(0,Me.Z)({peerId:t,dialog:!0,wrapOptions:{middleware:e}}),s=L.Z.setPeerStatus({peerId:t,element:this.subtitle,needClear:!0,useWhitespace:!1,middleware:e,noTyping:!0});return Promise.all([i,s,this.xd.onChatsScroll().then((e=>e.cached?e.renderPromise:void 0))]).then((([t,i,s])=>{e()&&(this.title.append(t),null==i||i())}))}))}onCloseAfterTimeout(){super.onCloseAfterTimeout(),this.xd.destroy()}}const rt=new Error("not implemented");class dt{constructor(){this.onChatsRegularScroll=()=>{this.sliceTimeout&&clearTimeout(this.sliceTimeout),this.sliceTimeout=window.setTimeout((()=>{this.sliceTimeout=void 0,this.sortedList.list.childElementCount&&!ut.processContact&&(0,G.TR)((()=>{const e=performance.now(),t=this.scrollable.scrollTop,i=this.sortedList.list.firstElementChild,s=this.scrollable.container.getBoundingClientRect(),n=i.getBoundingClientRect(),a=Array.from(this.scrollable.splitUp.children);let o=this.scrollable.splitUp.offsetTop;o&&t{this.deleteDialogByKey(this.getDialogKeyFromElement(e))})),this.setOffsets(),this.scrollable.scrollTop=c.offsetTop-u,this.log("slice time",performance.now()-e)}))}),200)},this.log=(0,C.kg)("CL"),this.offsets={top:0,bottom:0},this.managers=n.Z.managers,this.listenerSetter=new Ke.Z}getOffsetIndex(e){return{index:this.scrollable.loadedAll[e]?0:this.offsets[e]}}isDialogMustBeInViewport(e){const t=this.getOffsetIndex("top"),i=this.getOffsetIndex("bottom");if(!t.index&&!i.index)return!0;const s=(0,Le.Z)(e,this.indexKey);return(!t.index||s<=t.index)&&(!i.index||s>=i.index)}setIndexKey(e){this.indexKey=e,this.sortedList.indexKey=e}deleteDialogByKey(e){this.sortedList.delete(e)}deleteDialog(e){return this.deleteDialogByKey(this.getDialogKey(e))}updateDialog(e){const t=this.getDialogKey(e);if(!this.isDialogMustBeInViewport(e))return void this.deleteDialog(e);if(!this.sortedList.has(t)&&this.loadedDialogsAtLeastOnce)return void this.sortedList.add(t);const i=this.getDialogElement(t);i&&(ut.setLastMessageN({dialog:e,dialogElement:i,setUnread:!0}),this.sortedList.update(t))}onChatsScrollTop(){return this.onChatsScroll("top")}onChatsScroll(e="bottom"){return this.loadDialogs(e)}createPlaceholder(){const e=this.placeholder=new Fe(this.placeholderOptions),t=this.getRectFromForPlaceholder();return e.attach({container:this.sortedList.list.parentElement,getRectFrom:t,onRemove:()=>{this.placeholder===e&&(this.placeholder=void 0)},blockScrollable:this.scrollable}),e}loadDialogs(e){const t=this.log.bindPrefix("load-"+(i=1e3,s=9999,i=Math.ceil(i),s=Math.floor(s),Math.floor(Math.random()*(s-i+1))+i));var i,s;if(t("try",e),this.loadDialogsPromise||this.loadDialogsRenderPromise)return this.loadDialogsPromise;if(this.scrollable.loadedAll[e])return Promise.resolve({cached:!0,renderPromise:Promise.resolve()});t.warn("start",e);const n=(0,He.Z)("MIDDLEWARE"),a=(0,Ie.Z)(),o=new Promise(((i,s)=>tt(this,void 0,void 0,(function*(){const r=this.sortedList.list;let d=this.placeholder;try{const i=this.loadDialogsInner(e),s=yield i;if(!r.childElementCount&&!d&&(!this.loadedDialogsAtLeastOnce&&this.needPlaceholderAtFirstTime||!s.cached)){if(this.loadDialogsRenderPromise!==o)throw n;d=this.createPlaceholder(),a.resolve(!1)}const l=yield s.result;if(this.loadDialogsRenderPromise!==o)throw n;a.resolve(s.cached),"bottom"===e?l.isEnd&&(this.scrollable.loadedAll[e]=!0):l.isTopEnd&&(this.scrollable.loadedAll[e]=!0);const c=l.dialogs.length;if(t(`will render ${c} dialogs`),c){const t=("top"===e?l.dialogs.slice().reverse():l.dialogs).map((e=>this.sortedList.add(this.getDialogKey(e))));if(yield Promise.all(t).catch(),this.loadDialogsRenderPromise!==o)throw n}const h=l.dialogs["top"===e?0:c-1];h&&(this.offsets[e]=(0,Le.Z)(h,this.indexKey)),this.loadedDialogsAtLeastOnce=!0,ut.onListLengthChange(),t("getDialogs",l,r.childElementCount),setTimeout((()=>{this.scrollable.onScroll()}),0),d&&d.detach(r.childElementCount)}catch(e){return"MIDDLEWARE"!==(null==e?void 0:e.type)&&t.error(e),s(e),void a.reject(e)}i()})))).finally((()=>{this.loadDialogsRenderPromise===o?(t("end"),this.loadDialogsRenderPromise=void 0):t("has been cleared")}));this.loadDialogsRenderPromise=o;const r=this.loadDialogsPromise=a.then((e=>({cached:e,renderPromise:o}))).finally((()=>{this.loadDialogsPromise===r&&(this.loadDialogsPromise=void 0)}));return r}setOffsets(){return tt(this,void 0,void 0,(function*(){const e=this.sortedList.list,[t,i]=yield Promise.all([this.getDialogFromElement(e.firstElementChild),this.getDialogFromElement(e.lastElementChild)]),{indexKey:s}=this;this.offsets.top=(0,Le.Z)(t,s),this.offsets.bottom=(0,Le.Z)(i,s)}))}getDialogKey(e){throw rt}getDialogKeyFromElement(e){throw rt}getRectFromForPlaceholder(){throw rt}getDialogFromElement(e){throw rt}loadDialogsInner(e){throw rt}setTyping(e){return tt(this,void 0,void 0,(function*(){const t=this.getDialogKey(e),i=this.getDialogDom(t);if(!i)return;const s=i.lastMessageSpan.querySelector(".peer-typing-container"),n=yield L.Z.getPeerTyping(e.peerId,s,"forumTopic"===e._?e.id:void 0);!s&&n&&((0,F.Z)(i.lastMessageSpan,n),i.lastMessageSpan.classList.add("user-typing"))}))}unsetTyping(e){const t=this.getDialogKey(e),i=this.getDialogElement(t);i&&(i.dom.lastMessageSpan.classList.remove("user-typing"),ut.setLastMessageN({dialog:e,lastMessage:null,dialogElement:i,setUnread:null}))}getDialogDom(e){const t=this.sortedList.get(e);return null==t?void 0:t.dom}getDialogElement(e){const t=this.sortedList.get(e);return null==t?void 0:t.dialogElement}bindScrollable(){this.scrollable.container.addEventListener("scroll",this.onChatsRegularScroll),this.scrollable.onScrolledTop=this.onChatsScrollTop.bind(this),this.scrollable.onScrolledBottom=this.onChatsScroll.bind(this),this.scrollable.setVirtualContainer(this.sortedList.list)}clear(){var e;this.sortedList.clear(),null===(e=this.placeholder)||void 0===e||e.remove()}reset(){this.scrollable.loadedAll.top=!0,this.scrollable.loadedAll.bottom=!1,this.offsets.top=this.offsets.bottom=0,this.loadDialogsRenderPromise=void 0,this.loadDialogsPromise=void 0}fullReset(){return this.reset(),this.clear(),this.onChatsScroll()}destroy(){this.clear(),this.scrollable.destroy(),this.listenerSetter.removeAll()}}class lt extends dt{constructor(e,t){super(),this.peerId=e,this.paddingX=t,this.placeholderOptions={avatarSize:0,marginVertical:5,totalHeight:64},this.listenerSetter.add(n.Z)("peer_typings",(({peerId:e,threadId:t,typings:i})=>tt(this,void 0,void 0,(function*(){if(!t||this.peerId!==e)return;const s=yield this.managers.dialogsStorage.getForumTopic(e,t);s&&(i.length?this.setTyping(s):this.unsetTyping(s))})))),this.listenerSetter.add(n.Z)("dialogs_multiupdate",(e=>{for(const[t,{dialog:i,topics:s}]of e)t===this.peerId&&(null==s?void 0:s.size)&&s.forEach((e=>{this.updateDialog(e)}))})),this.listenerSetter.add(n.Z)("dialog_unread",(({dialog:e})=>{"forumTopic"===(null==e?void 0:e._)&&e.peerId===this.peerId&&ut.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))})})),this.listenerSetter.add(n.Z)("dialog_notify_settings",(e=>tt(this,void 0,void 0,(function*(){if(e.peerId===this.peerId)if("dialog"!==e._)ut.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))});else{const e=[...this.sortedList.getAll().entries()],t=e.map((([e])=>this.managers.dialogsStorage.getForumTopic(this.peerId,e))),i=yield Promise.all(t);e.forEach((([e,t],s)=>{ut.setUnreadMessagesN({dialog:i[s],dialogElement:t.dialogElement})}))}})))),this.listenerSetter.add(n.Z)("dialog_drop",(e=>{"forumTopic"===e._&&e.peerId===this.peerId&&this.deleteDialogByKey(this.getDialogKey(e))})),this.listenerSetter.add(n.Z)("dialog_draft",(({dialog:e,drop:t,peerId:i})=>{"forumTopic"===e._&&e.peerId===this.peerId&&(t?this.deleteDialog(e):this.updateDialog(e))}))}isDialogMustBeInViewport(e){return!e.pFlags.hidden&&super.isDialogMustBeInViewport(e)}getDialogKey(e){return e.id}getDialogKeyFromElement(e){return+e.dataset.threadId}getRectFromForPlaceholder(){return()=>{const e=x.ZP.rect;return{top:56,right:e.right,bottom:0,left:this.paddingX,width:e.width-this.paddingX,height:e.height-56}}}getDialogFromElement(e){return this.managers.dialogsStorage.getForumTopic(+e.dataset.peerId,+e.dataset.threadId)}loadDialogsInner(e){return tt(this,void 0,void 0,(function*(){const{indexKey:t}=this;let i=$.Z.height/64*1.25|0,s=0;const n=this.peerId,{index:a}=this.getOffsetIndex(e);if(s=a,a)if("top"===e){const e=yield this.managers.dialogsStorage.getFolderDialogs(n,!0),o=e.findIndex((e=>(0,Le.Z)(e,t)<=a)),r=Math.max(0,o-i);i=o-r,s=(0,Le.Z)(e[r],t)+1}else s=a;return this.managers.acknowledged.dialogsStorage.getDialogs({offsetIndex:s,limit:i,filterId:n,skipMigrated:!0})}))}}class ct extends dt{constructor(e){super(),this.filterId=e,this.needPlaceholderAtFirstTime=!0,this.listenerSetter.add(n.Z)("peer_typings",(({peerId:e,typings:t})=>tt(this,void 0,void 0,(function*(){const[i,s]=yield Promise.all([this.managers.appMessagesManager.getDialogOnly(e),this.managers.appPeersManager.isForum(e)]);i&&!s&&(t.length?this.setTyping(i):this.unsetTyping(i))})))),this.listenerSetter.add(n.Z)("user_update",(e=>tt(this,void 0,void 0,(function*(){if(!this.isActive)return;const t=e.toPeerId(),i=this.getDialogDom(t);if(!i)return;const s=yield this.managers.appUsersManager.getUserStatus(e),n="userStatusOnline"===(null==s?void 0:s._);this.setOnlineStatus(i.avatarEl,n)})))),this.listenerSetter.add(n.Z)("chat_update",(e=>tt(this,void 0,void 0,(function*(){const t=e.toPeerId(!0);this.processDialogForCallStatus(t)})))),this.listenerSetter.add(n.Z)("dialog_flush",(({dialog:e})=>{this.isActive&&e&&(ut.setLastMessageN({dialog:e,setUnread:!0}),this.validateDialogForFilter(e))})),this.listenerSetter.add(n.Z)("dialogs_multiupdate",(e=>{var t;if(this.isActive)for(const[i,{dialog:s,topics:n}]of e)"dialog"===(null==s?void 0:s._)&&(this.updateDialog(s),null===(t=ut.processContact)||void 0===t||t.call(ut,i.toPeerId()),this.validateDialogForFilter(s))})),this.listenerSetter.add(n.Z)("dialog_drop",(e=>{var t;this.isActive&&"dialog"===e._&&(this.deleteDialogByKey(e.peerId),null===(t=ut.processContact)||void 0===t||t.call(ut,e.peerId))})),this.listenerSetter.add(n.Z)("dialog_unread",(({dialog:e})=>{this.isActive&&"dialog"===(null==e?void 0:e._)&&(ut.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))}),this.validateDialogForFilter(e))})),this.listenerSetter.add(n.Z)("dialog_notify_settings",(e=>{this.isActive&&"forumTopic"!==e._&&(this.validateDialogForFilter(e),ut.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))}))})),this.listenerSetter.add(n.Z)("dialog_draft",(({dialog:e,drop:t,peerId:i})=>{var s;this.isActive&&"forumTopic"!==e._&&(t?this.deleteDialog(e):this.updateDialog(e),null===(s=ut.processContact)||void 0===s||s.call(ut,i))})),this.listenerSetter.add(n.Z)("filter_update",(e=>tt(this,void 0,void 0,(function*(){if(this.isActive&&e.id===this.filterId&&!p.DZ.has(e.id)){const e=yield this.managers.dialogsStorage.getCachedDialogs(!0);yield this.validateListForFilter();for(let t=0,i=e.length;t(0,Le.Z)(e,i)<=o)),r=Math.max(0,a-s);s=a-r,n=(0,Le.Z)(e[r],i)+1}else n=o;const r=this.managers.acknowledged.dialogsStorage.getDialogs({offsetIndex:n,limit:s,filterId:t,skipMigrated:!0}),d=yield r;return a&&(d.result=Promise.reject((0,He.Z)("MIDDLEWARE"))),d}))}setOnlineStatus(e,t){const i="is-online",s=e.classList.contains(i);!s&&t&&e.classList.add(i),(0,I.Z)({element:e,className:"is-visible",forwards:t,duration:250,onTransitionEnd:t?void 0:()=>{e.classList.remove(i)},useRafs:t&&!s?2:0})}generateScrollable(e,t){const i=t.id,s=new y.ZP(null,"CL",500);s.container.dataset.filterId=""+i;const a=(0,Se.Z)(t.localId),o=new nt({managers:n.Z.managers,log:this.log,list:e,indexKey:a,onListLengthChange:ut.onListLengthChange});return this.scrollable=s,this.sortedList=o,this.setIndexKey(a),this.bindScrollable(),s}testDialogForFilter(e){return p.DZ.has(this.filterId)?this.filterId===e.folder_id:void 0!==(0,Le.Z)(e,this.indexKey)}isDialogMustBeInViewport(e){return!(void 0!==e.migratedTo||!this.testDialogForFilter(e))&&super.isDialogMustBeInViewport(e)}validateListForFilter(){return tt(this,void 0,void 0,(function*(){this.sortedList.getAll().forEach((e=>tt(this,void 0,void 0,(function*(){const t=yield n.Z.managers.appMessagesManager.getDialogOnly(e.id);this.testDialogForFilter(t)||this.deleteDialog(t)}))))}))}validateDialogForFilter(e){this.getDialogElement(e.peerId)&&(this.testDialogForFilter(e)||this.deleteDialog(e))}setCallStatus(e,t){let{callIcon:i,listEl:s}=e;if(!i&&t){const{canvas:t,startAnimation:n}=e.callIcon=i=function(e=!1){const t=document.createElement("canvas");t.width=t.height=ne;const i=t.getContext("2d"),s=(ne-(3*oe+2*ae))/2,n=Date.now();let a=!1;const o=()=>{if(t.isConnected)a||(a=t.isConnected);else if(a)return!1;const o=ee((Date.now()-n)%1e3,0,1,1e3);i.clearRect(0,0,ne,ne),i.fillStyle=e&&!te.Z.isMobile?J.Z.getProperty("primary-color"):"#fff";for(let e=0;e<3;++e){let t;t=o>=.5?e%2?2-2*o:2*(o-.5):e%2?2*o:1-2*o;let n=4+8*t;n*=se,ie(i,s+e*oe+e*ae,(ne-n)/2,oe,n,re,!0)}return!0};return{canvas:t,startAnimation:()=>{(0,X.jt)(o),o()},setActive:t=>{e=t,o()}}}(s.classList.contains("active"));t.classList.add("dialog-group-call-icon"),s.append(t),n()}i&&(0,I.Z)({element:e.callIcon.canvas,className:"is-visible",forwards:t,duration:250,onTransitionEnd:t?void 0:()=>{e.callIcon.canvas.remove(),e.callIcon=void 0},useRafs:t?2:0})}processDialogForCallStatus(e,t){return tt(this,void 0,void 0,(function*(){if(!de.Z)return;if(t||(t=this.getDialogDom(e)),!t)return;const i=yield n.Z.managers.appChatsManager.getChat(e.toChatId());this.setCallStatus(t,!(!i.pFlags.call_active||!i.pFlags.call_not_empty))}))}onChatsScroll(e="bottom"){var t;return this.scrollable.loadedAll[e]&&(null===(t=ut.loadContacts)||void 0===t||t.call(ut)),this.log("onChatsScroll",e),super.onChatsScroll(e)}toggleAvatarUnreadBadges(e,t){if(!e)return void this.sortedList.getAll().forEach((e=>{const{dom:t,dialogElement:i}=e;t.unreadAvatarBadge&&i.toggleBadgeByKey("unreadAvatarBadge",!1,!1,!1)}));const i=["unread","mention"];this.sortedList.getAll().forEach((e=>{var t;const{dom:s,dialogElement:n}=e,a=null===(t=s.unreadBadge)||void 0===t?void 0:t.textContent;if(!a||s.unreadBadge.classList.contains("backwards"))return;const o=!!s.unreadAvatarBadge;n.createUnreadAvatarBadge(),n.toggleBadgeByKey("unreadAvatarBadge",!0,o),s.unreadAvatarBadge.textContent=a;const r=s.unreadAvatarBadge.classList,d=s.unreadBadge.classList;i.forEach((e=>{r.toggle(e,d.contains(e))}))}))}getDialogKey(e){return e.peerId}getDialogKeyFromElement(e){return+e.dataset.peerId}getDialogFromElement(e){return n.Z.managers.appMessagesManager.getDialogOnly(e.dataset.peerId.toPeerId())}}class ht{constructor(){this.chatsContainer=document.getElementById("chatlist-container"),this.log=(0,C.kg)("DIALOGS",C.v9.Log|C.v9.Error|C.v9.Warn|C.v9.Debug),this.folders={menu:document.getElementById("folders-tabs"),menuScrollContainer:null,container:document.getElementById("folders-container")},this.filtersRendered={},this.lastActiveElements=new Set,this.initedListeners=!1,this.xds={},this.onTabChange=()=>(this.xd=this.xds[this.filterId],this.xd.reset(),this.xd.onChatsScroll()),this._onListLengthChange=()=>{if(!this.xd.loadedDialogsAtLeastOnce)return;if(this.checkIfPlaceholderNeeded(),this.filterId!==p.J$)return;const e=this.chatList,t=e.childElementCount,i=e.parentElement.parentElement,s=e.parentElement.nextElementSibling,n=!!s.childElementCount;if(t>=10)return void(n&&this.removeContactsPlaceholder());if(n)return;i.classList.add("with-contacts");const a=new je.Z({name:"Contacts",noDelimiter:!0,fakeGradientDelimiter:!0});a.container.classList.add("hide"),this.managers.appUsersManager.getContactsPeerIds(void 0,void 0,"online").then((e=>{let t=!1;const i=()=>{t&&a.container.classList.toggle("hide",!s.list.childElementCount),this.updateContactsLength(!0)},s=new V.Z({avatarSize:"abitbigger",createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onListLengthChange:i,managers:this.managers});this.loadContacts=()=>{const t=$.Z.height/60|0;(0,Be.Z)(e.splice(0,t),this.verifyPeerIdForContacts).then((e=>{e.forEach((e=>{s.add(e)}))})),e.length||(this.loadContacts=void 0)},this.loadContacts(),this.processContact=e=>tt(this,void 0,void 0,(function*(){if(e.isAnyChat())return;const t=yield this.verifyPeerIdForContacts(e),i=s.has(e);!i&&t?s.add(e):i&&!t&&s.delete(e)}));const n=s.list;n.classList.add("chatlist-new"),this.setListClickListener(n),a.content.append(n),t=!0,i()})),s.append(a.container)},this.verifyPeerIdForContacts=e=>tt(this,void 0,void 0,(function*(){const[t,i]=yield Promise.all([this.managers.appPeersManager.isContact(e),this.managers.appMessagesManager.getDialogOnly(e)]);return t&&!i}))}start(){const e=this.managers=(0,Ce.Z)();this.contextMenu=new g(e),this.stateMiddlewareHelper=(0,Ue.k)(),this.folders.menuScrollContainer=this.folders.menu.parentElement,this.onListLengthChange=(0,Y.Z)(this._onListLengthChange,100,!1,!0);const t=document.createElement("div");t.classList.add("connection-status-bottom"),t.append(this.folders.container),this.forumsTabs=new Map,this.forumsSlider=document.createElement("div"),this.forumsSlider.classList.add("topics-slider"),this.chatsContainer.parentElement.parentElement.append(this.forumsSlider),K.Z&&(0,W.Z)({element:this.folders.container,onSwipe:e=>{const t=s.prevId();s(e<0?t+1:t-1)},verifyTouchTarget:()=>!this.forumTab}),this.allChatsIntlElement=new r.ZP.IntlElement({key:"FilterAllChatsShort"}),n.Z.addEventListener("premium_toggle",(e=>tt(this,void 0,void 0,(function*(){e||(yield this.managers.filtersStorage.isFilterIdAvailable(this.filterId))||s((0,Oe.Z)(this.filtersRendered[p.J$].menu),!1)})))),n.Z.addEventListener("state_cleared",(()=>{const e=p.DZ.has(this.filterId);Re.Z.getState().then((t=>tt(this,void 0,void 0,(function*(){this.xd.loadedDialogsAtLeastOnce=!1,this.showFiltersPromise=void 0,e&&(this.xd.clear(),this.onTabChange()),this.onStateLoaded(t)}))))})),this.setFilterId(p.J$,p.J$),this.addFilter({id:p.J$,title:"",localId:p.J$});const i=new y.v7(this.folders.menuScrollContainer);t.prepend(this.folders.menuScrollContainer);const s=this.selectTab=(0,v.X)(this.folders.menu,this.folders.container,((e,t)=>tt(this,void 0,void 0,(function*(){const i=e;if(e=+t.dataset.filterId||p.J$,-1!==this.filterId&&!p.DZ.has(e)&&!(yield this.managers.filtersStorage.isFilterIdAvailable(e)))return!1;const n=this.filterId;if(S.IS_MOBILE_SAFARI||(i?this.filtersNavigationItem||(this.filtersNavigationItem={type:"filters",onPop:()=>{s(0),this.filtersNavigationItem=void 0}},le.Z.spliceItems(1,0,this.filtersNavigationItem)):this.filtersNavigationItem&&(le.Z.removeItem(this.filtersNavigationItem),this.filtersNavigationItem=void 0)),n===e)return;this.xds[e].clear();const a=this.setFilterIdAndChangeTab(e).then((({cached:e,renderPromise:t})=>{if(e)return t}));return-1!==n?a:void 0}))),(()=>{for(const e in this.xds)+e!==this.filterId&&this.xds[e].clear()}),void 0,i);Re.Z.getState().then((e=>(ce.Z.setPlaybackParams(e.playbackParams),ce.Z.addEventListener("playbackParams",(e=>{this.managers.appStateManager.pushToState("playbackParams",e)})),this.onStateLoaded(e)))),te.Z.addEventListener("resize",(()=>{this.changeFiltersAllChatsKey()})),new H(this.managers,this.chatsContainer),this.chatsContainer.append(t),setTimeout((()=>{Z.Z.loadLottieWorkers()}),200),pe.Z.MANAGERS=n.Z.managers=e,Ze.Z.construct(e),x.ZP.construct(e),ue.ZP.construct(e),ke.ZP.construct(e),Te.Z.construct(e),L.Z.construct(e),this.xd=this.xds[this.filterId]}get chatList(){return this.xd.sortedList.list}setFilterId(e,t){this.filterId=e}setFilterIdAndChangeTab(e){return tt(this,void 0,void 0,(function*(){return this.filterId=e,this.onTabChange()}))}initListeners(){n.Z.addEventListener("dialog_flush",(({dialog:e})=>{e&&this.setFiltersUnreadCount()})),n.Z.addEventListener("folder_unread",(e=>tt(this,void 0,void 0,(function*(){if(e.id<0){const t=this.xd.getDialogElement(e.id);if(!t)return;this.setUnreadMessagesN({dialog:yield this.managers.dialogsStorage.getDialogOnly(e.id),dialogElement:t})}else this.setFilterUnreadCount(e.id)})))),n.Z.addEventListener("contacts_update",(e=>{var t;null===(t=this.processContact)||void 0===t||t.call(this,e.toPeerId())})),L.Z.addEventListener("peer_changed",(({peerId:e,threadId:t,isForum:i})=>{const s={peerId:e,threadId:i?t:void 0};for(const e of this.lastActiveElements){const t=+e.dataset.threadId||void 0,i=e.dataset.peerId.toPeerId();L.Z.isSamePeer({peerId:i,threadId:t},s)||this.setDialogActive(e,!1)}Array.from(document.querySelectorAll(`[data-autonomous="0"] .chatlist-chat[data-peer-id="${e}"]`)).forEach((t=>{const i=+t.dataset.threadId||void 0;L.Z.isSamePeer({peerId:e,threadId:i},s)&&this.setDialogActive(t,!0)}))})),n.Z.addEventListener("filter_update",(e=>tt(this,void 0,void 0,(function*(){if(p.DZ.has(e.id))return;if(!this.filtersRendered[e.id])return void this.addFilter(e);const t=this.filtersRendered[e.id];(0,he.Z)(t.title,(0,me.Z)(e.title))})))),n.Z.addEventListener("filter_delete",(e=>{const t=this.filtersRendered[e.id];t&&(t.container.remove(),t.menu.remove(),this.xds[e.id].destroy(),delete this.xds[e.id],delete this.filtersRendered[e.id],this.onFiltersLengthChange(),this.filterId===e.id&&this.selectTab(0,!1))})),n.Z.addEventListener("filter_order",(e=>tt(this,void 0,void 0,(function*(){e=e.slice(),(0,Ne.Z)(e,p.Zi);const t=this.folders.menu,i=yield Promise.all(e.map((e=>tt(this,void 0,void 0,(function*(){const[t,i]=yield Promise.all([this.managers.dialogsStorage.getDialogIndexKeyByFilterId(e),this.managers.filtersStorage.getFilter(e)]);return{indexKey:t,filter:i}})))));e.forEach(((e,s)=>{const{indexKey:n,filter:a}=i[s],o=this.filtersRendered[e];this.xds[e].setIndexKey(n),(0,_.Z)(o.menu,t,a.localId),(0,_.Z)(o.container,this.folders.container,a.localId)}))}))))}setDialogActive(e,t){var i;const s=e.dialogDom;e.classList.toggle("active",t),e.classList.toggle("is-forum-open",(null===(i=this.forumTab)||void 0===i?void 0:i.peerId)===e.dataset.peerId.toPeerId()&&!e.dataset.threadId),t?this.lastActiveElements.add(e):this.lastActiveElements.delete(e),(null==s?void 0:s.callIcon)&&s.callIcon.setActive(t)}onStateLoaded(e){return tt(this,void 0,void 0,(function*(){this.stateMiddlewareHelper.clean();const t=this.stateMiddlewareHelper.get(),i=e.filtersArr,s=i.length>p.DZ.size,n=e=>{for(const t of e)this.addFilter(t)};let a;s?n(i):a=this.managers.filtersStorage.getDialogFilters().then(n),this.doNotRenderChatList=!0;const o=this.xd.onChatsScroll(),r=(0,Pe.Z)(t);try{yield r(o)}catch(e){}s||this.selectTab(0,!1),a&&(yield r(a)),this.doNotRenderChatList=void 0,this.filterId=-1,this.selectTab(0,!1),this.initedListeners||(this.initListeners(),this.initedListeners=!0),s&&this.showFiltersPromise&&(yield r(this.showFiltersPromise)),this.managers.appNotificationsManager.getNotifyPeerTypeSettings(),yield(yield r(o)).renderPromise.catch(xe.Z),this.managers.appMessagesManager.fillConversations()}))}setFilterUnreadCount(e){var t;return tt(this,void 0,void 0,(function*(){const i=null===(t=this.filtersRendered[e])||void 0===t?void 0:t.unread;if(!i)return;const{unreadUnmutedCount:s,unreadCount:n}=yield this.managers.dialogsStorage.getFolderUnreadCount(e);i.classList.toggle("badge-gray",!s);const a=e===p.J$?s:n;i.innerText=a?""+a:""}))}setFiltersUnreadCount(){for(const e in this.filtersRendered)this.setFilterUnreadCount(+e)}l(e){const t=this.createChatList(),i=this.xds[e.id]=new ct(e.id),s=i.generateScrollable(t,e);return this.setListClickListener(t,null,!0),{ul:t,xd:i,scrollable:s}}addFilter(e){if(e.id===p.Zi)return;const t=this.folders.menu,i=this.filtersRendered[e.id];if(i)return(0,_.Z)(i.menu,t,e.localId),void(0,_.Z)(i.container,this.folders.container,e.localId);const s=document.createElement("div");s.classList.add("menu-horizontal-div-item");const n=document.createElement("span"),a=document.createElement("span");a.classList.add("text-super"),e.id===p.J$?a.append(this.allChatsIntlElement.element):(0,he.Z)(a,(0,me.Z)(e.title));const o=document.createElement("div");o.classList.add("badge","badge-20","badge-primary");const r=document.createElement("i");n.append(a,o,r),(0,b.Z)(s),s.append(n),s.dataset.filterId=""+e.id,(0,_.Z)(s,t,e.localId);const{ul:d,scrollable:l}=this.l(e);l.container.classList.add("tabs-tab","chatlist-parts");const c=document.createElement("div");c.classList.add("chatlist-top");const h=document.createElement("div");h.classList.add("chatlist-bottom"),c.append(d),l.container.append(c,h);const u=l.container;(0,_.Z)(l.container,this.folders.container,e.localId),this.filtersRendered[e.id]={menu:s,container:u,unread:o,title:a},this.onFiltersLengthChange()}changeFiltersAllChatsKey(){const e=this.folders.menuScrollContainer.firstElementChild,t=e.scrollWidth>e.clientWidth?"FilterAllChatsShort":"FilterAllChats";this.allChatsIntlElement.compareAndUpdate({key:t})}onFiltersLengthChange(){let e=this.showFiltersPromise;return null!=e?e:e=this.showFiltersPromise=(0,De.Z)(0).then((()=>{if(this.showFiltersPromise!==e)return;const t=Object.keys(this.filtersRendered).length>1,i=!this.folders.menuScrollContainer.classList.contains("hide");t!==i&&(this.folders.menuScrollContainer.classList.toggle("hide",!t),t&&!i&&this.setFiltersUnreadCount(),this.chatsContainer.classList.toggle("has-filters",t)),this.changeFiltersAllChatsKey(),this.showFiltersPromise=void 0}))}generateEmptyPlaceholder(e){const t="empty-placeholder",i=document.createElement("div");i.classList.add(t,t+"-"+e.classNameType);const s=document.createElement("div");s.classList.add(t+"-header"),(0,r.$d)(s,e.title);const n=document.createElement("div");return n.classList.add(t+"-subtitle"),e.subtitle&&(0,r.$d)(n,e.subtitle,e.subtitleArgs),i.append(s,n),{container:i,header:s,subtitle:n}}checkIfPlaceholderNeeded(){if(this.filterId===p.Zi)return;const e=this.chatList,t=e.parentElement;let i=Array.from(t.children).find((e=>e.matches(".empty-placeholder")));const s=this.xd.scrollable.loadedAll.bottom&&!e.childElementCount;if(s&&i)return;if(!s)return void(i&&(t.classList.remove("with-placeholder"),i.remove()));let n,a;if(this.filterId){n=this.generateEmptyPlaceholder({title:"FilterNoChatsToDisplay",subtitle:"FilterNoChatsToDisplayInfo",classNameType:a="folder"}),i=n.container;const e=document.createElement("div"),t="📂",s=128;(0,we.Z)({div:e,emoji:t,width:s,height:s}),i.prepend(e);const o=(0,E.Z)("btn-primary btn-color-primary btn-control tgico",{text:"FilterHeaderEdit",icon:"settings"});(0,A.fc)(o,(()=>tt(this,void 0,void 0,(function*(){x.ZP.createTab(T.Z).open(yield this.managers.filtersStorage.getFilter(this.filterId))})))),i.append(o)}else{n=this.generateEmptyPlaceholder({title:"ChatList.Main.EmptyPlaceholder.Title",classNameType:a="dialogs"}),i=n.container;const e=document.createElement("img");e.classList.add("empty-placeholder-dialogs-icon"),this.emptyDialogsPlaceholderSubtitle=new r.ZP.IntlElement({element:n.subtitle}),Promise.all([this.updateContactsLength(!1),(0,j.cj)(e,"assets/img/EmptyChats.svg"),(0,G.AD)()]).then((([e])=>{i.classList.add("visible"),t.classList.toggle("has-contacts",!!e)})),i.prepend(e)}t.append(i),t.classList.add("with-placeholder"),t.dataset.placeholderType=a}updateContactsLength(e){var t;return null!==(t=this.updateContactsLengthPromise)&&void 0!==t?t:this.updateContactsLengthPromise=this.managers.appUsersManager.getContacts().then((t=>{const i=this.emptyDialogsPlaceholderSubtitle;if(i){let e,s;t.length?(e="ChatList.Main.EmptyPlaceholder.Subtitle",s=[(0,r.ag)("Contacts.Count",[t.length])]):(e="ChatList.Main.EmptyPlaceholder.SubtitleNoContacts",s=[]),i.compareAndUpdate({key:e,args:s})}return e&&this.chatList.parentElement.classList.toggle("has-contacts",!!t.length),this.updateContactsLengthPromise=void 0,t.length}))}removeContactsPlaceholder(){const e=this.chatList,t=e.parentElement.parentElement,i=e.parentElement.nextElementSibling;t.classList.remove("with-contacts"),i.replaceChildren(),this.loadContacts=void 0,this.processContact=void 0}toggleForumTab(e,t=this.forumTab){return tt(this,void 0,void 0,(function*(){if(!t&&!e)return;if(t){const e=this.xd.getDialogElement(t.peerId);e&&e.dom.listEl.classList.remove("is-forum-open")}t===e&&(e=void 0),null==t||t.toggle(!1);const i=null==e?void 0:e.toggle(!0);if(t===this.forumTab&&(this.forumTab=e),e){const t=this.xd.getDialogElement(e.peerId);t&&t.dom.listEl.classList.add("is-forum-open")}i&&(yield i),e&&!this.forumNavigationItem?(this.forumNavigationItem={type:"forum",onPop:()=>{this.forumNavigationItem=void 0,this.toggleForumTab()}},le.Z.pushItem(this.forumNavigationItem)):!e&&this.forumNavigationItem&&(le.Z.removeItem(this.forumNavigationItem),this.forumNavigationItem=void 0);const s=!!e,n=i?2:void 0;this.xd.toggleAvatarUnreadBadges(s,n);const a=(0,Ie.Z)();(0,I.Z)({element:this.forumsSlider.parentElement,className:"is-forum-visible",duration:300,forwards:s,useRafs:n,onTransitionEnd:()=>{a.resolve()}}),(0,Ye.YW)(a,300).then((()=>a.resolve()))}))}toggleForumTabByPeerId(e,t){const{managers:i}=this,s=x.ZP.getHistory(),n=s[s.length-1];let a;if(n)return n instanceof ot&&n.peerId===e&&t?void Xe(n.container):(a=x.ZP.createTab(ot),void a.open({peerId:e,managers:i}));a=this.forumsTabs.get(e);const o=this.forumTab&&this.forumTab===a;if(null!=t||(t=!o),t!==o)return t&&!a&&(a=new ot(void 0),a.init({peerId:e,managers:i}),this.forumsTabs.set(e,a),this.forumsSlider.append(a.container),a.managers=this.managers,a.eventListener.addEventListener("destroy",(()=>{this.forumsTabs.delete(e)}))),this.toggleForumTab(a);t&&Xe(a.container)}setListClickListener(e,t,i=!1,s=!1,n=!1){let a;const o=(n?L.Z.setInnerPeer:L.Z.setPeer).bind(L.Z);e.dataset.autonomous=""+ +s,e.addEventListener("mousedown",(i=>{if(0!==i.button)return;this.log("dialogs click list");const n=i.target,r=(0,d.Z)(n,it);if(!r)return;const l=r.dataset.peerId.toPeerId(),c=+r.dataset.mid||void 0,h=+r.dataset.threadId||void 0;if(null==t||t(),!r.querySelector(".is-forum")||i.shiftKey||c){if(i.ctrlKey||i.metaKey)return window.open(r.href||"#"+l,"_blank"),void(0,O.Z)(i);s&&(a&&!(a===r)&&a.classList.remove("active"),r&&(r.classList.add("active"),a=r,this.lastActiveElements.add(r))),h&&!c||this.xd.sortedList.list!==e||this.xd===this.xds[p.Zi]||this.toggleForumTab(),o({peerId:l,lastMsgId:c,threadId:h})}else this.toggleForumTabByPeerId(l)}),{capture:!0}),e.addEventListener("click",(e=>{0===e.button&&(0,O.Z)(e)}),{capture:!0}),i&&(0,Ee.E)(e,this.contextMenu.onContextMenu)}createChatList(e={}){const t=document.createElement("ul");return t.classList.add("chatlist"),e.new&&t.classList.add("chatlist-new"),e.dialogSize&&t.classList.add("chatlist-"+e.dialogSize),t}setLastMessageN(e){return this.setLastMessage(e).catch((e=>{"MIDDLEWARE"!==(null==e?void 0:e.type)&&this.log.error("set last message error",e)}))}setLastMessage({dialog:e,lastMessage:t,dialogElement:i,highlightWord:s,isBatch:a=!1,setUnread:o=!1}){var d,l;return tt(this,void 0,void 0,(function*(){if(!i&&!(i=this.xd.getDialogElement(e.peerId)))return;const{dom:c}=i,{peerId:h}=e,{deferred:u,middleware:p}=st(c,"setLastMessagePromise");let f;if(!t&&("draftMessage"!==(null===(d=e.draft)||void 0===d?void 0:d._)||h.isAnyChat()&&"forumTopic"!==e._&&(yield this.managers.appPeersManager.isForum(h))||(f=e.draft),(null==(t=e.topMessage)?void 0:t.mid)!==e.top_message)){const i=this.managers.appMessagesManager.getMessageByPeer(h,e.top_message);t=yield p(i)}if(this.setUnreadMessagesN({dialog:e,dialogElement:i,isBatch:a,setLastMessagePromise:u}),!t)return c.lastMessageSpan.replaceChildren(),c.lastTimeSpan.replaceChildren(),delete c.listEl.dataset.mid,void u.resolve();const m=t&&(0,ve.Z)(t);{let e;const i=[];if(t&&!f&&!m){const s=(0,be.Z)(t),n=new Set(["video","gif","round"]);if(s&&("photo"===s._||n.has(s.type))){const a=(0,fe.Z)(s,20,20);if("photoSizeEmpty"!==a._&&(e=document.createElement("div"),e.classList.add("dialog-subtitle-media"),"round"===s.type&&e.classList.add("is-round"),i.push((0,k.Z)({photo:s,message:t,container:e,withoutPreloader:!0,size:a}).then((()=>e))),n.has(s.type))){const t=document.createElement("span");t.classList.add("tgico-play"),e.append(t)}}}if(f){const e=document.createElement("span");e.classList.add("danger"),e.append((0,r.ag)("Draft"),": "),i.unshift(e)}else if(h.isAnyChat()&&h!==t.fromId&&!t.action){const e=document.createElement("span");if(e.classList.add("primary-text"),t.fromId===n.Z.myId)e.append((0,r.ag)("FromYou")),i.unshift(e);else{const s=p((0,Me.Z)({peerId:t.fromId,onlyFirstName:!0})).then((t=>(e.prepend(t),e)),xe.Z);i.unshift(s)}e.append(": ")}const a=!!e&&!!(null==t?void 0:t.message);let o;if(o=s&&t.message?yield p((0,ge.Z)({message:t,highlightWord:s,withoutMediaType:a})):f?yield p((0,ge.Z)({message:f})):t?yield p((0,ge.Z)({message:t,withoutMediaType:a})):document.createDocumentFragment(),i.length){const e=yield p(Promise.all(i));o.prepend(...e)}(0,F.Z)(c.lastMessageSpan,o)}if(t||f){const e=f?Math.max(f.date,t.date||0):t.date;(0,F.Z)(c.lastTimeSpan,(0,w.zM)(new Date(1e3*e)))}else c.lastTimeSpan.textContent="";if(null!==o&&!o){c.listEl.dataset.mid=""+t.mid;const e=t.reply_to;(null===(l=null==e?void 0:e.pFlags)||void 0===l?void 0:l.forum_topic)&&(c.listEl.dataset.threadId=""+(0,$e.Z)(t))}u.resolve()}))}setUnreadMessagesN(e){return this.setUnreadMessages(e).catch((()=>{}))}setUnreadMessages({dialog:e,dialogElement:t,isBatch:i=!1,setLastMessagePromise:s}){var a;return tt(this,void 0,void 0,(function*(){const{dom:o}=t;if(!o)return;const r="forumTopic"===e._,{deferred:d,middleware:l}=st(o,"setUnreadMessagePromise"),{peerId:c}=e,h=Promise.all([this.managers.appNotificationsManager.isPeerLocalMuted({peerId:c,respectType:!0,threadId:r?e.id:void 0}),"draftMessage"!==(null===(a=e.draft)||void 0===a?void 0:a._)?this.managers.appMessagesManager.getMessageByPeer(c,e.top_message):void 0,r?!!e.pFlags.pinned:this.managers.dialogsStorage.isDialogPinned(c,this.filterId),this.managers.appMessagesManager.isDialogUnread(e),c.isAnyChat()&&!r?this.managers.acknowledged.dialogsStorage.getForumUnreadCount(c).then((i=>i.cached?i.result:(i.result.then((()=>{this.setUnreadMessagesN({dialog:e,dialogElement:t})})),{count:0,hasUnmuted:!1}))).catch((()=>{})):void 0]);let[u,f,m,g,v]=yield l(h);const b=o.listEl.classList.contains("is-muted"),{count:y,hasUnmuted:w}=v||{};let S;f&&f.pFlags.out&&f.peerId!==n.Z.myId&&(S=f);const C=null!=y?y:e.unread_count;void 0!==y&&(g=!!C),r&&!g&&(g=!(0,et.Z)(e.read_inbox_max_id));const L=m||g,E=this.xd!==this.xds[p.Zi]&&!r&&!!this.forumTab&&this.xd.getDialogElement(c)===t&&g;if(s)try{yield l(s)}catch(e){return}const M=i?0:250;o.listEl.classList.toggle("no-unmuted-topic",!u&&void 0!==w&&!w),u!==b&&(0,I.Z)({element:o.listEl,className:"is-muted",forwards:u,duration:M}),function(e,t,i){let s;if("string"==typeof t?s=t:(null==t?void 0:t.pFlags.out)&&(s=t.error?"sendingerror":t.pFlags.is_outgoing?"sending":t.pFlags.unread?"check":"checks"),!s)return void(e.textContent="");const n="tgico-"+s,a=e.lastElementChild;if(a&&a.classList.contains(n))return;const o=document.createElement("i");o.classList.add("sending-status-icon",n),e.append(o),a&&a.remove()}(o.statusSpan,r&&e.pFlags.closed?"premium_lock":S);const P=!!o.unreadBadge;L&&t.createUnreadBadge();const Z=!!o.unreadAvatarBadge;E&&t.createUnreadAvatarBadge();const k=e.unread_mentions_count&&(e.unread_mentions_count>1||e.unread_count>1),T=!!o.mentionsBadge;if(k&&t.createMentionsBadge(),[["unreadBadge",L,P],["unreadAvatarBadge",E,Z],["mentionsBadge",k,T]].forEach((([e,s,n])=>{o[e]&&t.toggleBadgeByKey(e,s,n,i)})),!L)return void d.resolve();m?o.unreadBadge.classList.add("tgico-chatspinned","tgico"):o.unreadBadge&&o.unreadBadge.classList.remove("tgico-chatspinned","tgico");let x,A=!0,_=!1;if(e.unread_mentions_count&&1===C?(x="@",_=!0):g?x=""+(C?(0,qe.Z)(C,1):" "):(x="",A=!1),r){const e=g&&" "===x;o.unreadBadge.classList.toggle("not-visited",e)}[[o.unreadBadge,x],[o.unreadAvatarBadge,x||void 0]].filter(Boolean).forEach((([e,t])=>{void 0!==t&&(e.innerText=x),e.classList.toggle("unread",A),e.classList.toggle("mention",_)})),d.resolve()}))}getDialog(e,t){return tt(this,void 0,void 0,(function*(){if("object"!=typeof e){let i;if(t){if(i=yield this.managers.dialogsStorage.getForumTopic(e,t),!i)return{peerId:e||p.NM,pFlags:{}}}else if(i=yield this.managers.appMessagesManager.getDialogOnly(e),!i){const t=e||p.NM;return{peerId:t,peer:yield this.managers.appPeersManager.getOutputPeer(t),pFlags:{}}}return i}return e}))}addListDialog(e){var t;e.autonomous=!1;const i=this.addDialogNew(e);if(i){const{peerId:s}=e,a=this.getDialog(s,e.threadId).then((t=>{const a=[],o=s.isUser();return o||"dialog"!==t._||a.push(this.xd.processDialogForCallStatus(s,i.dom)),s!==n.Z.myId&&o&&a.push(this.managers.appUsersManager.getUserStatus(s.toUserId()).then((e=>{"userStatusOnline"===(null==e?void 0:e._)&&this.xd.setOnlineStatus(i.dom.avatarEl,!0)}))),a.push(this.setLastMessageN({dialog:t,dialogElement:i,isBatch:e.isBatch,setUnread:!0})),Promise.all(a)}));null===(t=e.loadPromises)||void 0===t||t.push(a)}return i}addDialogAndSetLastMessage(e){const{peerId:t,message:i,query:s}=e,n=this.addDialogNew(Object.assign(Object.assign(Object.assign({},e),(0,ye.Z)(i)),{peerId:t}));return this.setLastMessageN({dialog:{_:"dialog",peerId:t},lastMessage:i,dialogElement:n,highlightWord:s}),i.peerId!==t&&(n.dom.listEl.dataset.peerId=""+i.peerId),n}addDialogNew(e){const t=new at(Object.assign({autonomous:!!e.container,avatarSize:"bigger"},e));if(e.container){const i=e.append?"prepend":"append";e.container[i](t.container)}return t}}const ut=new ht;M.GO.appDialogsManager=ut;const pt=ut},2312:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(3725),n=i(2202),a=i(3512),o=i(410),r=i(319),d=i(1243),l=i(7086),c=i(1655),h=i(5471),u=i(8801),p=i(6658),f=i(7667),m=i(3855);const g=new class{constructor(){this.downloads={},this.progress={}}construct(e){this.managers=e,a.Z.addEventListener("download_progress",(e=>{var t;const i=this.downloads[e.fileName];(null===(t=null==i?void 0:i.main)||void 0===t?void 0:t.notifyAll)&&(this.progress[e.fileName]=e,i.main.notifyAll(e))}))}getNewDeferred(e,t){const i=(0,s.Z)();let n=this.downloads[e];if(n){const e=n.main;["cancel","addNotifyListener","notify","notifyAll"].forEach((t=>{e[t]&&(i[t]=e[t].bind(e))}))}else n=this.downloads[e]={main:i},i.cancel=()=>{const t=(0,h.Z)("DOWNLOAD_CANCELED");this.managers.apiFileManager.cancelDownload(e),i.reject(t),i.cancel=r.Z},i.catch((()=>{this.clearDownload(e,t)})).finally((()=>{delete this.progress[e]}));return"disc"===t&&i.catch(r.Z).finally((()=>{this.clearDownload(e,t)})),n[t]=i}getNewDeferredForUpload(e,t){const i=this.getNewDeferred(e);return t.then(i.resolve,i.reject),i.finally((()=>{this.clearDownload(e)})),i}clearDownload(e,t){const i=this.downloads[e];if(!i)return;delete i[t];const s=Object.keys(i).length;(!s||i.main&&1===s)&&delete this.downloads[e]}getUpload(e){let t=this.getDownload(e);return t||(t=this.getNewDeferred(e),this.managers.appMessagesManager.getUploadPromise(e).then(t.resolve,t.reject),t)}d(e,t,i){let s=this.getDownload(e,i);return s||(s=this.getNewDeferred(e,i),t().then(s.resolve,s.reject),s)}download(e){const t=(0,l.Z)(e);return this.d(t,(()=>this.managers.apiFileManager.download(e)),"blob")}downloadMedia(e,t="blob",i){const{downloadOptions:s,fileName:n}=(0,d.Z)(e);return this.d(n,(()=>{let s;return s="url"===t?this.managers.apiFileManager.downloadMediaURL:"void"===t?this.managers.apiFileManager.downloadMediaVoid:this.managers.apiFileManager.downloadMedia,i?i.then((()=>s(e))):s(e)}),t)}downloadMediaURL(e){return this.downloadMedia(e,"url")}downloadMediaVoid(e){return this.downloadMedia(e,"void")}upload(e,t,i){return t||(t=(0,n.Z)(e)),i||(i=this.managers.apiFileManager.upload({file:e,fileName:t})),this.getNewDeferredForUpload(t,i)}getDownload(e,t){const i=this.downloads[e];return i&&i[t]}downloadToDisc(e,t){const i=e.media,s="document"===i._;s||e.thumb||(e.thumb=i.sizes.slice().pop());const n=""+(2147483647*Math.random()|0),a=`download/${n}`;e.downloadId=n;const o=m.Z.pingServiceWorkerWithIframe(),d=this.downloadMedia(e,"disc",o);if(t)return d;const l=document.createElement("iframe");l.hidden=!0,o.then((()=>{l.src=a,document.body.append(l)}));let h,g=!1;const v=()=>{g||(g=!0,h=l,(0,c.Z)(d.listeners,v))};return d.addNotifyListener(v),d.then((t=>{if(!t)return;const n=URL.createObjectURL(t),a=s?(0,p.Z)(i):(0,f.Z)(i,e.thumb),o=e.media.file_name||(0,u.P)(a.location);!function(e,t,i){const s=document.createElement("a");s.href=e,s.download=t,s.target="_blank",s.style.position="absolute",s.style.top="1px",s.style.left="1px",document.body.append(s);try{const e=document.createEvent("MouseEvents");e.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),s.dispatchEvent(e)}catch(t){console.error("Download click error",t);try{s.click()}catch(t){window.open(e,"_blank")}}setTimeout((()=>{s.remove(),i&&i()}),100)}(n,a.fileName||o,(()=>{URL.revokeObjectURL(n)}))})).catch(r.Z).finally((()=>{g||v(),setTimeout((()=>{null==h||h.remove()}),1e3)})),d}};o.GO&&(o.GO.appDownloadManager=g);const v=g},4271:(e,t,i)=>{"use strict";i.d(t,{Z:()=>Xr});var s=i(5814),n=i(4273),a=i(4332),o=i(4755),r=i(5003),d=i(3512),l=i(3241),c=i(5432),h=i(1655),u=i(6519),p=i(4484),f=i(9331),m=i(1507),g=i(7625),v=i(4993);class b{constructor(e,t,i){this.container=document.createElement("div"),this.container.classList.add("bubbles-group"),this.chat=e,this.groups=t,this.items=[],this.dateTimestamp=i,this.offset=0}createAvatar(e){if(this.avatarLoadPromise)return this.avatarLoadPromise;if("messageService"===e._)return;this.avatarContainer=document.createElement("div"),this.avatarContainer.classList.add("bubbles-group-avatar-container"),++this.offset;const t=e.fwd_from,i=e.fwdFromId,s=e.from_id&&"peerChannel"===e.from_id._&&e.fromId===i,n=this.chat.peerId;this.avatar=new f.Z,this.avatar.classList.add("bubbles-group-avatar","user-avatar","avatar-40");const a=(t&&(n===d.Z.myId||n===m.hj)||s?i:e.fromId)||m.NM,o=this.avatar.updateWithOptions({lazyLoadQueue:this.chat.bubbles.lazyLoadQueue,peerId:a,peerTitle:!i&&t&&t.from_name?t.from_name:void 0});return this.avatarLoadPromise=o,this.avatarContainer.append(this.avatar),this.container.append(this.avatarContainer),this.avatarLoadPromise}get firstTimestamp(){return this.firstItem.timestamp}get firstMid(){return this.firstItem.mid}get firstItem(){return this.items[this.items.length-1]}get lastTimestamp(){return this.lastItem.timestamp}get lastMid(){return this.lastItem.mid}get lastItem(){return this.items[0]}updateClassNames(){const e=this.items,t=e.length;if(!t)return;const i=e[t-1].bubble;if(1===e.length)return void i.classList.add("is-group-first","is-group-last");i.classList.remove("is-group-last"),i.classList.add("is-group-first");for(let i=1,s=t-1;i{this.mountItem(e,s-1-i,t)})),e&&this.updateClassNames(),this.onItemMount()}mountItem(e,t=this.items.indexOf(e),i=this.offset){e.mounted||((0,p.Z)(e.bubble,this.container,i+t),e.mounted=!0)}unmountItem(e){e.mounted&&(e.bubble.remove(),e.mounted=!1,this.onItemUnmount())}onItemMount(){if(this.mounted)return;const e=this.chat.bubbles.getDateContainerByTimestamp(this.dateTimestamp/1e3),t=this.groups.groups.filter((e=>e.dateTimestamp===this.dateTimestamp)),i=t.length,s=t.indexOf(this),n=t.slice(s+1).reduce(((e,t)=>e+(t.mounted?0:1)),0);(0,p.Z)(this.container,e.container,Cs+i-1-s-n),this.mounted=!0}onItemUnmount(){this.mounted&&(this.items.length?this.updateClassNames():(this.container.remove(),this.chat.bubbles.deleteEmptyDateGroups(),this.mounted=!1))}}class y{constructor(e){this.chat=e,this.itemsArr=[],this.itemsMap=new Map,this.groups=[],this.newGroupDiff=121,this.sortItemsKey="scheduled"===e.type?"timestamp":"mid",this.sortGroupsKey="scheduled"===e.type?"lastTimestamp":"lastMid",this.sortGroupItemsKey="groupMid"}removeItem(e){var t;null===(t=e.group)||void 0===t||t.removeItem(e),this.removeItemFromCache(e)}removeAndUnmountBubble(e){const t=this.getItemByBubble(e);if(!t)return e.parentElement&&e.remove(),!1;const i=this.itemsArr,s=i.indexOf(t),n=this.getSiblingsAtIndex(s,i),a=t.group;this.removeItem(t);const o=new Set;a&&(a.unmountItem(t),o.add(a));const[r,d]=n;if(r&&d&&this.canItemsBeGrouped(r,d)&&r.group!==d.group){const e=d.group;this.f(d.group.items),e.onItemUnmount(),o.add(r.group),this.groupUngrouped()}return this.mountUnmountGroups(Array.from(o)),!0}mountUnmountGroups(e){const[t,i]=function(e,t){const i=[],s=[];for(let t=0,a=e.length;t{e.onItemUnmount()})),t.forEach((e=>{e.mount(!0)}))}f(e,t=0,i=e.length){for(;ts.add(e)))}}return s}cleanup(){this.itemsArr=[],this.groups=[],this.itemsMap.clear()}}var w=i(1168),S=i(2738),C=i(2325),L=i(503);class E extends w.Z{constructor(e,t,i={}){if(super("popup-date-picker",Object.assign({body:!0,overlayClosable:!0,buttons:i.noButtons?[]:[{langKey:"JumpToDate",callback:()=>{this.onPick&&this.onPick(this.selectedDate.getTime()/1e3|0)}},{langKey:"Cancel",isCancel:!0}],title:!0},i)),this.onPick=t,this.options=i,this.onPrevClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()-1),this.setMonth(),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.nextBtn.removeAttribute("disabled")},this.onNextClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()+1),this.setMonth(),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),this.prevBtn.removeAttribute("disabled")},this.onDateClick=e=>{const t=e.target;if(!t.dataset.timestamp)return;if(this.selectedEl){if(this.selectedEl===t)return;this.selectedEl.classList.remove("active")}this.selectedEl=t,t.classList.add("active");const i=+t.dataset.timestamp;this.selectedDate=new Date(i),this.setTitle(),this.setTimeTitle()},this.minDate=i.minDate||new Date("2013-08-01T00:00:00"),e{const n=""+e;this.listenerSetter.add(t.input)("input",(a=>{let o=t.value.replace(/\D/g,"");o.length>2?o=o.slice(0,2):(1===o.length&&+o[0]>+n[0]||2===o.length&&+o>e)&&(2===o.length&&s&&s(+o[1]),o="0"+o[0]),t.setValueSilently(o),i(o.length)}))};this.hoursInputField=new L.ZP({plainText:!0}),this.minutesInputField=new L.ZP({plainText:!0}),i(23,this.hoursInputField,(e=>{2===e&&this.minutesInputField.input.focus(),this.setTimeTitle()}),(e=>{this.minutesInputField.value=(e+this.minutesInputField.value).slice(0,2)})),i(59,this.minutesInputField,(e=>{e||this.hoursInputField.input.focus(),this.setTimeTitle()})),this.selectedDate=e,e.setMinutes(e.getMinutes()+10),this.hoursInputField.setValueSilently(("0"+e.getHours()).slice(-2)),this.minutesInputField.setValueSilently(("0"+e.getMinutes()).slice(-2)),e.setHours(0,0,0,0),this.timeDiv.append(this.hoursInputField.container,t,this.minutesInputField.container),(0,S.fc)(this.btnConfirm,(()=>{this.onPick&&(this.selectedDate.setHours(+this.hoursInputField.value||0,+this.minutesInputField.value||0,0,0),this.onPick(this.selectedDate.getTime()/1e3|0)),this.hide()}),{listenerSetter:this.listenerSetter}),this.body.append(this.timeDiv),this.prevBtn.classList.add("primary"),this.nextBtn.classList.add("primary")}const s=document.createElement("div");s.classList.add("popup-centerer"),s.append(this.container),this.element.append(s),e.setHours(0,0,0,0),this.selectedDate=e,this.maxDate=i.maxDate||new Date,this.maxDate.setHours(0,0,0,0),this.selectedMonth=new Date(this.selectedDate),this.selectedMonth.setDate(1),this.maxMonth=new Date(this.maxDate),this.maxMonth.setDate(1),this.minMonth=new Date(this.minDate),this.minMonth.setHours(0,0,0,0),this.minMonth.setDate(1),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),i.noTitle&&(this.setTitle=()=>{}),this.setTimeTitle(),this.setTitle(),this.setMonth()}setTimeTitle(){if(this.btnConfirm&&this.selectedDate){let e;const t=[],i=new Date;i.setHours(0,0,0,0);const s={minute:"2-digit",hour:"2-digit"},n=new Date(this.selectedDate.getTime());if(n.setHours(+this.hoursInputField.value,+this.minutesInputField.value),this.selectedDate.getTime()===i.getTime())e="Schedule.SendToday";else{e="Schedule.SendDate";const s={month:"short",day:"numeric"};n.getFullYear()!==i.getFullYear()&&(s.year="numeric"),t.push(new C.ZP.IntlDateElement({date:n,options:s}).element)}t.push(new C.ZP.IntlDateElement({date:n,options:s}).element),this.btnConfirm.firstChild.replaceWith((0,C.ag)(e,t))}}setTitle(){this.title.textContent="",this.title.append(new C.ZP.IntlDateElement({date:this.selectedDate,options:{day:"numeric",month:"long",weekday:"short"}}).element)}renderElement(e,t=""){const i=document.createElement("button");return i.classList.add("btn-icon","date-picker-month-date"),e&&i.setAttribute("disabled","true"),t&&i.append(t),i}setMonth(){const e=new Date(this.selectedMonth),t={year:"numeric",month:this.timeDiv&&o.Z.isMobile?"short":"long"};this.monthTitle.textContent="",this.monthTitle.append(new C.ZP.IntlDateElement({date:e,options:t}).element),this.month&&this.month.remove(),this.month=document.createElement("div"),this.month.classList.add("date-picker-month");const i=new Date,s=i.getDay();1!==s&&i.setHours(-24*(s-1));for(let e=0;e<7;++e){const e=this.renderElement(!0,new C.ZP.IntlDateElement({date:i,options:{weekday:"narrow"}}).element);e.classList.remove("date-picker-month-date"),e.classList.add("date-picker-month-day"),this.month.append(e),i.setDate(i.getDate()+1)}let n=e.getDay()-1;-1===n&&(n=6);const a=new Date(e.getTime());a.setDate(a.getDate()-n-1);for(let e=0;ethis.maxDate||e{f&&!f()||(p.forEach((e=>e.remove())),o&&o.classList.toggle("is-round",u))})),h}))}class Y extends j{constructor(e,t){super(e,((e,i="",s)=>$(this,void 0,void 0,(function*(){this.mediaEl||(this.mediaEl=document.createElement("div"),this.mediaEl.classList.add(this.className+"-media"));const n=yield Q({title:e,titleEl:this.title,subtitle:i,subtitleEl:this.subtitle,mediaEl:this.mediaEl,message:s,animationGroup:t});this.container.classList.toggle("is-media",n),n?this.content.prepend(this.mediaEl):this.mediaEl.remove()})))),this.className=e,this.animationGroup=t}}function X(e,t,i,s,n){const a=new Y("reply",i),o=a.fill(e,t,s);if(n){const e=(0,O.Z)(n,!1),[t,i,s]=(0,N.oo)(e);a.container.style.setProperty("--override-color",`${t}, ${i}, ${s}`),a.container.classList.add("is-overriding-color")}return{container:a.container,fillPromise:o}}const J="stacked-avatars",ee=J+"-avatar",te=ee+"-container";class ie{constructor(e){this.lazyLoadQueue=e.lazyLoadQueue,this.avatarSize=e.avatarSize,this.container=document.createElement("div"),this.container.classList.add(J),this.container.style.setProperty("--avatar-size",e.avatarSize+"px")}render(e,t){const i=this.container.children;(e=e.slice().reverse()).length>3&&(e=e.slice(-3)),e.forEach(((e,s)=>{let n=i[s];n||(n=document.createElement("div"),n.classList.add(te));let a=n.firstElementChild;a||(a=new f.Z,a.classList.add("avatar-"+this.avatarSize,ee),a.updateOptions({isDialog:!1,loadPromises:t})),a.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e}),a.parentNode||n.append(a),n.parentNode||this.container.append(n)})),Array.from(i).slice(e.length).forEach((e=>e.remove()))}}const se="replies-element";d.Z.addEventListener("replies_updated",(e=>{Array.from(document.querySelectorAll(se+`[data-post-key="${e.peerId}_${e.mid}"]`)).forEach((t=>{t.message=e,t.render()}))}));class ne extends HTMLElement{constructor(){super(),this.updated=!1,this.managers=d.Z.managers}init(){this.render(),this.dataset.postKey=this.message.peerId+"_"+this.message.mid,this.classList.add("replies","replies-"+this.type)}render(){const e=this.message.replies;if("footer"===this.type){let t;this.firstElementChild&&(t=this.firstElementChild),(null==e?void 0:e.recent_repliers)?(t&&!t.classList.contains("replies-footer-avatars")&&(this.innerHTML="",t=null),this.stackedAvatars||(this.stackedAvatars=new ie({lazyLoadQueue:this.lazyLoadQueue,avatarSize:30}),this.stackedAvatars.container.classList.add("replies-footer-avatars")),t=this.stackedAvatars.container,this.stackedAvatars.render(e.recent_repliers.map((e=>(0,D.Z)(e))),this.loadPromises)):(t&&!t.classList.contains("tgico-comments")&&(t.remove(),t=null),t||(t=document.createElement("span"),t.classList.add("tgico-comments"))),t.parentElement||this.prepend(t),this.text||(this.text=new C.ZP.IntlElement);const i=this.text;if(e?e.replies?i.compareAndUpdate({key:"Comments",args:[e.replies]}):i.compareAndUpdate({key:"LeaveAComment"}):i.compareAndUpdate({key:"ViewInChat"}),e){let t=!1;e.replies&&void 0!==e.read_max_id&&void 0!==e.max_id&&(t=e.read_max_id${(null==e?void 0:e.replies)?(0,F.Z)(e.replies,0):""}`;!e||this.updated||this.message.pFlags.is_outgoing||(this.managers.appMessagesManager.subscribeRepliesThread(this.message.peerId,this.message.mid),this.managers.appMessagesManager.updateMessage(this.message.peerId,this.message.mid,"replies_updated"),this.updated=!0),this.loadPromises&&(this.loadPromises=void 0)}}customElements.define(se,ne);const ae=()=>{const e=document.createElement("i");return e.classList.add("edited"),(0,C.$d)(e,"EditedMessage"),e},oe=()=>(0,C.ag)("SponsoredMessage");var re;!function(e){e.setTime=e=>{var t;const{chatType:i,message:s}=e,n=new Date(1e3*s.date),a=[];let o,r;const d=!!s.pFlags.sponsored,l=!("action"in s)&&!d,c=d?void 0:(0,A.mr)(n);if(l){if(s.views){const e=s.post_author||(null===(t=s.fwd_from)||void 0===t?void 0:t.post_author),i=document.createElement("span");i.classList.add("post-views"),i.innerHTML=(0,F.Z)(s.views,1);const n=document.createElement("i");if(n.classList.add("tgico-channelviews","time-icon"),a.push(i,n),e){const t=document.createElement("span");(0,_.Z)(t,(0,R.Z)(e)),t.insertAdjacentHTML("beforeend",", "),a.push(t)}}if(s.edit_date&&"scheduled"!==i&&!s.pFlags.edit_hide&&a.unshift(o=ae()),"pinned"!==i&&s.pFlags.pinned){const e=document.createElement("i");e.classList.add("tgico-pinnedchat","time-icon"),a.unshift(e)}}else d&&a.push(r=oe());c&&a.push(c);let h=d?void 0:(0,A.xE)(n);l&&(h+=(s.edit_date&&!s.pFlags.edit_hide?`\nEdited: ${(0,A.xE)(new Date(1e3*s.edit_date))}`:"")+(s.fwd_from?`\nOriginal: ${(0,A.xE)(new Date(1e3*s.fwd_from.date))}`:""));const u=document.createElement("span");u.classList.add("time","tgico"),u.append(...a);const p=document.createElement("div");p.classList.add("inner","tgico"),h&&(p.title=h);let f=a;return o&&(f[f.indexOf(o)]=ae()),r&&(f[f.indexOf(r)]=oe()),f=f.map((e=>e instanceof HTMLElement&&!e.classList.contains("i18n")&&!e.classList.contains("reactions")?e.cloneNode(!0):e)),c&&(f[f.length-1]=(0,A.mr)(n)),p.append(...f),u.append(p),u},e.renderReplies=({bubble:e,bubbleContainer:t,message:i,messageDiv:s,loadPromises:n,lazyLoadQueue:a})=>{const o=!e.classList.contains("sticker")&&!e.classList.contains("emoji-big")&&!e.classList.contains("round"),r=new ne;return r.message=i,r.type=o?"footer":"beside",r.loadPromises=n,r.lazyLoadQueue=a,r.init(),t.prepend(r),o},e.setReply=({chat:e,bubble:t,bubbleContainer:i,message:s})=>{return n=this,a=void 0,r=function*(){const n=!i;n&&(i=t.querySelector(".bubble-content"));const a=n?i.querySelector(".reply"):null;if(!s.reply_to_mid)return null==a||a.remove(),void t.classList.remove("is-reply");const o=s.reply_to.reply_to_peer_id?(0,D.Z)(s.reply_to.reply_to_peer_id):e.peerId,r=yield d.Z.managers.appMessagesManager.getMessageByPeer(o,s.reply_to_mid);let l,c;if(r){const e=r.fwdFromId;c=s.fwdFromId&&s.fwdFromId===e?s.fwdFromId:r.fromId||e,l=new B.Z({peerId:c,dialog:!1,onlyFirstName:!1,plainText:!1}).element}else d.Z.managers.appMessagesManager.fetchMessageReplyTo(s),e.bubbles.needUpdate.push({replyToPeerId:o,replyMid:s.reply_to_mid,mid:s.mid}),l=(0,C.ag)("Loading");const{container:h,fillPromise:u}=X(l,void 0,e.animationGroup,r,e.isAnyGroup?c:void 0);return yield u,a?(a.classList.contains("floating-part")&&h.classList.add("floating-part"),a.replaceWith(h)):i.append(h),t.classList.add("is-reply"),h},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}d((r=r.apply(n,a||[])).next())}));var n,a,o,r}}(re||(re={}));var de=i(2153),le=i(3699),ce=i(8448),he=i(4789),ue=i(8594),pe=i(3035),fe=i(3725),me=i(410),ge=i(252),ve=i(8497),be=i(4668),ye=i(2796);function we(e,t,i){const s=e.getBoundingClientRect(),n="center"===i?Math.ceil(s.left+(s.right-s.left)/2+1):Math.ceil(s.left+1),a="bottom"===t?Math.floor(s.top+s.height-1):Math.ceil(s.top+1);return document.elementFromPoint(n,a)}me.GO.getElementByPoint=we;var Se=i(3624),Ce=i(3910),Le=i(5705);function Ee(e){e.style.display="none",e.offsetLeft,e.style.display=""}var Ie=i(2648),Me=i(5296),Pe=i(8938),Ze=i(5701);const ke=2147483646;var Te,xe=i(241),Ae=i(6272),_e=i(1784),Fe=i(9099),De=i(2416),Re=i(8763),Be=i(5975),Ne=i(8939),Oe=i(993),Ue=i(4494),He=i(8204),ze=i(2575),je=i(9931);class Ge extends w.Z{constructor(e,t){super("popup-join-chat-invite",{closable:!0,overlayClosable:!0,body:!0,buttons:(0,w.x)([{langKey:t.pFlags.request_needed?"RequestJoin.Button":t.pFlags.broadcast?"JoinByPeekChannelTitle":"JoinByPeekGroupTitle",callback:()=>{this.managers.appChatsManager.importChatInvite(e).then((e=>{const t=e.toPeerId(!0);Xr.setInnerPeer({peerId:t})}),(e=>{"INVITE_REQUEST_SENT"===e.type&&(0,ye.bC)({langPackKey:"RequestToJoinSent"})}))}}])}),this.hash=e,this.chatInvite=t,this.construct()}construct(){return e=this,t=void 0,s=function*(){this.header.remove();const{chatInvite:e,managers:t,hash:i}=this,s=new f.Z;s.classList.add("avatar-100"),s.isDialog=!1,"photo"===e.photo._?(e.photo=yield t.appPhotosManager.savePhoto(e.photo),(0,V.Z)({container:s,message:null,photo:e.photo,boxHeight:100,boxWidth:100,withoutPreloader:!0}),s.style.width=s.style.height=""):(0,je.Z)({div:s,peerId:m.NM,isDialog:!1,title:e.title});const n=document.createElement("div");n.classList.add("chat-title"),(0,_.Z)(n,(0,R.Z)(e.title));const a=e.pFlags.broadcast,o=(0,C.ag)(a?"Subscribers":"Members",[(0,ze.Z)(e.participants_count)]);if(o.classList.add("chat-participants-count"),this.body.append(s,n,o),e.pFlags.request_needed){const e=document.createElement("div");(0,C.$d)(e,a?"RequestToJoinChannelDescription":"RequestToJoinGroupDescription"),e.classList.add("chat-participants-count","request-caption"),this.body.append(e)}this.show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}!function(e){e[e.MESSAGE=0]="MESSAGE",e[e.PRIVATE_POST=1]="PRIVATE_POST",e[e.STICKER_SET=2]="STICKER_SET",e[e.JOIN_CHAT=3]="JOIN_CHAT",e[e.VOICE_CHAT=4]="VOICE_CHAT",e[e.USER_PHONE_NUMBER=5]="USER_PHONE_NUMBER",e[e.INVOICE=6]="INVOICE",e[e.EMOJI_SET=7]="EMOJI_SET"}(Te||(Te={}));var Ve=i(5285),Ke=i(6654),We=i(9083),$e=i(6775),qe=i(9405),Qe=i(319);const Ye="reaction",Xe=Ye+"-element";class Je extends HTMLElement{constructor(){super(),this.classList.add(Ye),this.managers=d.Z.managers}get reactionCount(){return this._reactionCount}set reactionCount(e){this._reactionCount=e}get count(){return this.reactionCount.count}init(e,t){this.type=e,this.classList.add(Ye+"-"+e),this.middleware=t}setCanRenderAvatars(e){this.canRenderAvatars=e}render(e){const t=!!this.stickerContainer;t||(this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add(Ye+"-sticker"),this.append(this.stickerContainer));const i=this.reactionCount;if(!e&&!t){const e=i.reaction;if("reactionEmoji"===e._){const t=this.managers.appReactionsManager.getReaction(e.emoticon);(0,Ke.Z)(t,(e=>{var t;e.center_icon||this.stickerContainer.classList.add("is-static"),e.pFlags.inactive&&this.classList.add("is-inactive"),this.renderDoc(null!==(t=e.center_icon)&&void 0!==t?t:e.static_icon)}))}else if("reactionCustomEmoji"===e._){this.stickerContainer.classList.add("is-custom");const t=(0,We.Z)({docIds:[e.document_id],customEmojiSize:(0,qe.C)(22,22)});this.stickerContainer.append(t)}}}renderDoc(e){const t="inline"===this.type?14:22,i=this.wrapStickerPromise=(0,K.ZP)({div:this.stickerContainer,doc:e,width:t,height:t,static:!0,managers:this.managers,middleware:this.middleware}).then((({render:e})=>e)).finally((()=>{this.wrapStickerPromise===i&&(this.wrapStickerPromise=void 0)}))}renderCounter(){var e;const t=this.reactionCount,i="inline"===this.type?2:4;if(t.count>=i||"block"===this.type&&!this.canRenderAvatars){this.counter||(this.counter=document.createElement("inline"===this.type?"i":"span"),this.counter.classList.add(Ye+"-counter"));const e=(0,F.Z)(t.count);this.counter.textContent!==e&&(this.counter.textContent=e),this.counter.parentElement||this.append(this.counter)}else(null===(e=this.counter)||void 0===e?void 0:e.parentElement)&&(this.counter.remove(),this.counter=void 0)}renderAvatars(e){"inline"!==this.type&&(this.reactionCount.count>=4||!this.canRenderAvatars?this.stackedAvatars&&(this.stackedAvatars.container.remove(),this.stackedAvatars=void 0):(this.stackedAvatars||(this.stackedAvatars=new ie({avatarSize:24}),this.append(this.stackedAvatars.container)),this.stackedAvatars.render(e.map((e=>(0,D.Z)(e.peer_id))))))}setIsChosen(e=void 0!==this.reactionCount.chosen_order){"inline"!==this.type&&(this.classList.contains("is-chosen")&&!this.classList.contains("backwards"))!==e&&(0,Fe.Z)({element:this,className:"is-chosen",forwards:e,duration:this.isConnected?300:0})}fireAroundAnimation(){const e=this.reactionCount.reaction;"reactionEmoji"===e._&&(0,Ke.Z)(this.managers.appReactionsManager.getReaction(e.emoticon),(e=>{const t="inline"===this.type?28:40,i=document.createElement("div");i.classList.add(Ye+"-sticker-activate"),Promise.all([(0,K.ZP)({div:i,doc:e.center_icon,width:t,height:t,withThumb:!1,needUpscale:!0,play:!1,skipRatio:1,group:"none",needFadeIn:!1,managers:this.managers,middleware:this.middleware}).then((({render:e})=>e)),(0,$e.Z)({doc:e.around_animation,size:80,target:this.stickerContainer,side:"center",skipRatio:1,play:!1,managers:this.managers,middleware:this.middleware}).stickerPromise.catch(Qe.Z)]).then((([e,t])=>{const s=()=>{e.remove(),i.remove(),this.stickerContainer.classList.remove("has-animation")};if(!t)return void s();const n=()=>{(0,pe.T2)(s)};e.addEventListener("enterFrame",(t=>{t===e.maxFrame&&(this.wrapStickerPromise?this.wrapStickerPromise.then((()=>{setTimeout(n,1e3)})):n())})),e.addEventListener("firstFrame",(()=>{this.stickerContainer.append(i),this.stickerContainer.classList.add("has-animation"),e.play(),t.play()}),{once:!0})}))}))}}customElements.define(Xe,Je);const et="reactions",tt=et+"-element",it=new Map;class st extends HTMLElement{constructor(){super(),this.classList.add(et),this.sorted=[],this.middlewareHelpers=new Map,this.managers=d.Z.managers}connectedCallback(){let e=it.get(this.key);e||it.set(this.key,e=new Set),e.add(this),this.onConnectCallback&&this.isConnected&&(this.onConnectCallback(),this.onConnectCallback=void 0)}disconnectedCallback(){const e=it.get(this.key);e.delete(this),e.size||it.delete(this.key)}getReactionCount(e){return this.sorted[this.sorted.indexOf(e)].reactionCount}getMessage(){return this.message}init(e,t,i,s=this.isPlaceholder){void 0!==this.key&&this.disconnectedCallback(),this.middleware!==i&&i.onDestroy((()=>{this.middlewareHelpers.clear()})),this.message=e,this.key=this.message.peerId+"_"+this.message.mid,this.middleware=i,this.isPlaceholder=s,this.type!==t&&(this.type=t,this.classList.add(et+"-"+t)),this.connectedCallback()}changeMessage(e){return this.init(e,this.type,this.middleware)}update(e,t){this.message=e,this.render(t)}render(e){const t=this.message.reactions,i=!(!t||!t.results.length);if(this.classList.toggle("has-no-reactions",!i),!i&&!this.sorted.length)return;this.managers.appReactionsManager.getAvailableReactions();const s=i?t.results:[];s.sort(((e,t)=>{var i,s;return t.count-e.count||(null!==(i=e.chosen_order)&&void 0!==i?i:0)-(null!==(s=t.chosen_order)&&void 0!==s?s:0)})),(0,g.Z)(this.sorted,((e,t,i)=>{const n=e.reactionCount.reaction;s.some((e=>(0,Ve.Z)(e.reaction,n)))||(this.middlewareHelpers.get(e).destroy(),this.middlewareHelpers.delete(e),i.splice(t,1),e.remove())}));const n=s.reduce(((e,t)=>e+t.count),0),a=t&&(!!t.pFlags.can_see_list||this.message.peerId.isUser())&&n<4;if(this.sorted=s.map(((e,i)=>{let s=this.sorted.find((t=>(0,Ve.Z)(t.reactionCount.reaction,e.reaction)));if(!s){const e=this.middleware.create();s=new Je,s.init(this.type,e.get()),this.middlewareHelpers.set(s,e)}(0,p.Z)(s,this,i);const n=t.recent_reactions?t.recent_reactions.filter((t=>(0,Ve.Z)(t.reaction,e.reaction))):[];return s.reactionCount=Object.assign({},e),s.setCanRenderAvatars(a),s.render(this.isPlaceholder),s.renderCounter(),s.renderAvatars(n),s.setIsChosen(),s})),!this.isPlaceholder&&(null==e?void 0:e.length)&&(this.isConnected?this.handleChangedResults(e):this.onConnectCallback=()=>{this.handleChangedResults(e)}),!this.sorted.length&&"block"===this.type){const e=this.parentElement;if(this.remove(),e.classList.contains("document-message")&&!e.childNodes.length)return void e.remove();const t=this.querySelector(".time");t&&e.append(t)}}handleChangedResults(e){this.message.peerId===Xr.chat.peerId&&e.forEach((e=>{const t=this.sorted.find((t=>(0,Ve.Z)(t.reactionCount.reaction,e.reaction)));null==t||t.fireAroundAnimation()}))}}customElements.define(tt,st);var nt=i(5418);class at{constructor(e,t,i){this.scrollable=e,this.query=t,this.reverse=i}get container(){return this.scrollable.container}getSaved(){return{scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,clientHeight:this.clientHeight}}findElements(){if(!this.query)return[];const{container:e}=this,t=e.getBoundingClientRect(),i=Array.from(e.querySelectorAll(this.query)),s=[];for(const n of i){const i=n.getBoundingClientRect();if((0,He.Z)(n,e,void 0,i,t))s.push({element:n,rect:i});else if(s.length)break}if(!s.length){const e=i[0];e&&s.push({element:e,rect:e.getBoundingClientRect()})}return s}replaceSaved(e,t){if(!this.elements)return;const i=this.elements.findIndex((({element:t})=>e===t));-1!==i&&(this.elements[i].element=t)}findAndSetElements(){this.elements=this.findElements()}save(){this.findAndSetElements(),this._save()}_save(){const{scrollTop:e,scrollHeight:t,clientHeight:i}=this.container;this.scrollHeight=t,this.scrollTop=e,this.clientHeight=i,this.scrollHeightMinusTop=this.reverse?t-e:e}onRestore(e){T.IS_SAFARI&&e&&Ee(this.container)}setScrollTop(e,t){this.scrollable.setScrollTopSilently(this.scrollTop=e),this.onRestore(t)}restore(e){var t;const{scrollTop:i,scrollHeight:s}=this.scrollable;if(this.scrollHeight=s,!this.elements.length)return void this._restore(e);let n;if(n=this.elements[this.elements.length-1],!(null===(t=null==n?void 0:n.element)||void 0===t?void 0:t.parentElement)&&(this.findAndSetElements(),n=this.elements[this.elements.length-1],!n))return void this._restore(e);const{element:a,rect:o}=n,r=a.getBoundingClientRect().bottom-o.bottom;this.setScrollTop(i+r,e)}_restore(e){const{scrollHeightMinusTop:t,scrollable:i}=this,s=this.scrollHeight,n=this.reverse?s-t:t;this.setScrollTop(n,e)}}me.GO&&(me.GO.ScrollSaver=at);var ot=i(7401),rt=i(4881);class dt{constructor(e){this.observing=new Map,this.observingQueue=new Map,this.freezedObservingNew=!1,this.observer=new IntersectionObserver((e=>{const t=this.observing;for(let i=0,s=e.length;ie+t),t)}var xt=i(8097);const At=function(e){const t={},i={};return s=>{var n,a;const o="_"+s;return null!==(n=(a="string"==typeof s?t:i)[o])&&void 0!==n?n:a[o]=e(s)}};function _t(e){return e.replace(/\D/g,"")}const Ft={visa:/^4/,mastercard:/^(51|52|53|54|55|222|23|24|25|26|27)/,amex:/^(34|37)/,discover:/^(60|64|65)/,diners:/^(30|38|39)/,diners14:/^(36)/,jcb:/^(35)/,unionpay:/^(62[0-6,8-9]|627[0-6,8-9]|6277[0-7,9]|62778[1-9]|81)/,elo:/^(5067|509|636368|627780)/,mir:/^(220[0-4])/},Dt={visa:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},mastercard:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},amex:{minLength:15,maxLength:15,cvcMaxLength:4,cvcMinLength:3},unionpay:{minLength:13,maxLength:19,cvcMaxLength:3,cvcMinLength:null},diners:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},diners14:{minLength:14,maxLength:14,cvcMaxLength:3,cvcMinLength:null},discover:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},jcb:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},elo:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},mir:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},unknown:{minLength:16,maxLength:16,cvcMaxLength:4,cvcMinLength:3}},Rt=At(((e="")=>{const t=Object.keys(Ft),i=_t(e);let s,n=0;return t.forEach((e=>{const t=Ft[e],a=i.match(t);if(a){const t=a[0];t&&t.length>n&&(s=e,n=t.length)}})),s||"unknown"}));function Bt(e=""){return"diners14"===(t=Rt(e))?"diners":t;var t}var Nt=i(2398),Ot=i(6740),Ut=i(1656),Ht=i(7298),zt=i(9807),jt=i(279),Gt=i(7479),Vt=i(7362);function Kt(e,t,i){const s=new Array(e);return s.fill(t),i?s.map(i):s}const Wt="0".charCodeAt(0)-"0".charCodeAt(0),$t=/[0-9]/g;function qt(e){return String.fromCharCode(e.charCodeAt(0)-Wt)}function Qt(e){return e.replace($t,qt)}function Yt(e,t){return{type:"optional",result:e,consumed:t}}function Xt(e,t,i){return{type:"required",result:e,consumed:t,partial:i}}function Jt(e,t){return i=>{const s=new RegExp("^".concat(e.source.replace(/^\^/,""))),n=i.match(s),a=t?Yt:Xt;if(n){const e=n[0];return a(e,n.index+e.length)}return a("",i.length)}}const ei=Jt(/1[0-2]|0?[1-9]|0/),ti={digit:function(e){return Jt(/[0-9]/)(Qt(e))},capitalCharacter:function(e){const t=Jt(/\w/)(e);return t.result?Xt(t.result.toUpperCase(),t.consumed):t},month:e=>{const t=ei(Qt(e)),i=_t(t.result);return["0","1"].includes(t.result)&&1===e.length||"0"===t.result&&e.length>=2?Xt(t.result,e.length,!0):Xt(1===i.length?"0"+i:i,t.consumed)},formattingCharacter:e=>t=>{const i=e===t[0]?1:0;return function(e,t){return{type:"formatting",result:e,consumed:t}}(e,i)},optionalPattern:e=>t=>{const i=Jt(e,!0)(t);return i.result?i:Yt("",0)}},ii=ti.digit,si=ti.capitalCharacter,ni=ti.formattingCharacter(" "),ai=ti.optionalPattern(/\d\d/),oi=[ii,ii,ii,ii,ni,ii,ii,ii,ii,ii,ii,ni,ii,ii,ii,ii,ii],ri=[ii,ii,ii,ii,ni,ii,ii,ii,ii,ii,ii,ni,ii,ii,ii,ii],di=new Set(["DZ","AR","AM","AU","AT","AZ","PT","BD","BY","BE","BA","BR","BN","BG","CA","IC","CN","CO","HR","CY","CZ","DK","EC","GB","EE","FO","FI","FR","GE","DE","GR","GL","GU","GG","NL","HU","IN","ID","IL","IT","JP","JE","KZ","KR","FM","KG","LV","LI","LT","LU","MK","MG","PT","MY","MH","MQ","YT","MX","MN","ME","NL","NZ","GB","NO","PK","PH","PL","FM","PT","PR","RE","RU","SA","SF","RS","SG","SK","SI","ZA","ES","LK","SX","VI","VI","SE","CH","TW","TJ","TH","TU","TN","TR","TM","VI","UA","GB","US","UY","UZ","VA","VN","GB","FM"]),li=At((e=>{const t=[];for(let i=0,s=0;i[ti.month,ti.formattingCharacter("/"),ii,ii,ai],cardCvc:e=>ci.cardCvcFromBrand(Rt(e)),cardCvcFromBrand:At((e=>{const t=Dt[e],{cvcMinLength:i,cvcMaxLength:s}=t,n=Kt(i||s,ii);if(i&&i{switch(e){case"US":return Kt(5,ii);case"CA":return T.IS_ANDROID?null:[si,si,si,ni,si,si,si];default:const t=Kt(10,ti.optionalPattern(/\d/));return di.has(e)&&(t[0]=ii),t}}))},hi=ci;function ui(e){return Tt(e.map((e=>e.length)),0)}const pi=new RegExp("‎","g");function fi(e){return e?{type:"invalid",code:e}:null}function mi(e,t={}){const{sanitized:i,minLength:s}=function(e){const t=_t(e),i=Rt(e);return{sanitized:t,brand:i,minLength:Dt[i].minLength}}(e);return function(e,t,i){return e.length>=t?function(e){const t="0".charCodeAt(0),i=e.length%2;let s=0;for(let n=e.length-1;n>=0;--n){const a=i===n%2;let o=e.charCodeAt(n)-t;a&&(o*=2),o>9&&(o-=9),s+=o}return!(s%10)}(e)||"mir"===Rt(e)?null:fi("invalid"):i?null:fi("incomplete")}(i,s,t.ignoreIncomplete)}function gi(e,t={}){const i=e.replace(pi,"").split(/ ?\/ ?/),[s,n=""]=i,[a,o]=[s,n].map((e=>+e)),r=2===n.length?o%100:o;return n.length<2||3===n.length?t.ignoreIncomplete?null:fi("incomplete"):fi(function(e,t,i){const s=new Date(Date.now()),n=e<100?s.getFullYear()%100:s.getFullYear(),a=s.getMonth()+1;return isNaN(e)||isNaN(t)?(null==i?void 0:i.ignoreIncomplete)?null:"incomplete":e-n<0?"invalid_expiry_year_past":e-n>50?"invalid_expiry_year":!(e-n)&&t{const t=yi.get(e.source);t&&t(JSON.parse(e.data))}));class wi extends l.Z{constructor({url:e,sandbox:t}){super(!1),this.onTelegramWebViewEvent=({eventType:e,eventData:t})=>{""===t&&(t=void 0),console.log("onTelegramWebViewEvent",e,t),this.dispatchEvent(e,t)};const i=this.iframe=document.createElement("iframe");i.src=e,t&&i.setAttribute("sandbox",t)}onMount(){yi.set(this.iframe.contentWindow,this.onTelegramWebViewEvent)}destroy(){this.cleanup(),yi.delete(this.iframe.contentWindow)}}function Si(e){const t=new wi(Object.assign(Object.assign({},e),{sandbox:"allow-forms allow-scripts allow-same-origin allow-modals"})),{iframe:i}=t;return i.allow="payment",i.classList.add("payment-verification"),t}class Ci extends w.Z{constructor(e,t){super("popup-payment popup-payment-verification",{closable:!0,overlayClosable:!0,body:!0,title:"Checkout.WebConfirmation.Title"}),this.url=e,this.openPathAfter=t,this.d()}d(){const e=this.telegramWebView=Si({url:this.url});e.addEventListener("web_app_open_tg_link",(e=>{this.dispatchEvent("finish"),this.hide(),this.openPathAfter&&Xr.openUrl("https://t.me"+e.path_full)})),this.body.append(e.iframe),this.show(),e.onMount()}destroy(){return this.telegramWebView.destroy(),super.destroy()}}var Li=i(6830),Ei=i(5029);class Ii extends L.ZP{constructor(e){super(e),this.options=e,this.onKeyDown=e=>{var t,i;this.lastKeyDown=e.key,null===(i=(t=this.options).onKeyDown)||void 0===i||i.call(t,e)},this.onInput=()=>{var e,t;const i=this.value,s="Backspace"===this.lastKeyDown&&(this.lastTransformed&&this.lastTransformed.value.length||0)-i.length==1,n=this.lastTransformed=function(e){const{value:t,getPattern:i,deleting:s,input:n}=e,a=!s&&!!t.length,o=function(e,t,i={},s){const n=e(t);if(!n)return{value:t,selection:null,autocorrectComplete:!!t};const a=n.length,o=[],r=[];let d=0,l=0,c=0===i.selectionStart?0:null,h=0===i.selectionEnd?0:null;const u=e=>{e>0&&(null===c&&l+1>=i.selectionStart&&(c=ui(o)+(s?r.length:0)),null===h&&l+1>=i.selectionEnd&&(h=ui(o)+(s?r.length:0)),l+=e)};for(;d=t.length)break;r.push(a),++d,u(c)}}return s&&o.push(...r),{value:o.join(""),selection:{selectionStart:null===c||t.length&&i.selectionStart===t.length?ui(o):c,selectionEnd:null===h||t.length&&i.selectionEnd===t.length?ui(o):h},autocorrectComplete:d===a}}(i,t,{selectionStart:n?n.selectionStart:0,selectionEnd:n?n.selectionEnd:0},a),{value:r,selection:d}=o;return{value:r,meta:{autocorrectComplete:o.autocorrectComplete,empty:!r},selection:d}}({value:i,getPattern:this.options.formatMethod,deleting:s,input:this.input}),a=n.value;a!==i&&(this.setValueSilently(a),n.selection&&(this.input.selectionStart=n.selection.selectionStart,this.input.selectionEnd=n.selection.selectionEnd)),this.validateNew(a,{ignoreIncomplete:!0}),null===(t=(e=this.options).onChange)||void 0===t||t.call(e,n)},this.onBlur=()=>{var e;const t=null===(e=this.lastTransformed)||void 0===e?void 0:e.value;t&&this.validateNew(t)},this.validate=()=>this.validateNew(),this.input.addEventListener("keydown",this.onKeyDown),this.input.addEventListener("input",this.onInput),this.input.addEventListener("blur",this.onBlur)}update(){this.onInput()}validateNew(e,t,i){var s,n,a,o,r;let d;if(void 0===e&&(e=null!==(n=null===(s=this.lastTransformed)||void 0===s?void 0:s.value)&&void 0!==n?n:""),void 0===t&&(t={}),d=this.options.validateMethod?null===(o=(a=this.options).validateMethod)||void 0===o?void 0:o.call(a,e,t):function(e,t,i={}){return e.meta.autocorrectComplete||i.ignoreIncomplete?null:fi("incomplete")}(this.lastTransformed,0,t),null==d?void 0:d.code){const e=null===(r=this.options.errorKeys)||void 0===r?void 0:r[d.code];return!i&&this.setState(L.I1.Error,e),!1}return!i&&this.setState(L.I1.Neutral),!0}}function Mi(e,t){const i=()=>{const i=e.every((e=>"validateNew"in e?e.validateNew(void 0,void 0,!0):e.isValid()));t(i)};return e.forEach((e=>{if(e instanceof Ii){const t=e.options.onChange;e.options.onChange=(...e)=>{null==t||t(...e),i()},"update"in e&&e.update()}else e.input.addEventListener("input",i)})),{validate:i}}function Pi(e,t){let i,s;return(e||t)&&(e&&(i=new bi.Z({noPhoneCodes:!0,onCountryChange:()=>{null==s||s.update()},required:!0,autocomplete:"country"})),t&&(s=new Ii({label:"PaymentShippingZipPlaceholder",plainText:!0,inputMode:"numeric",autocomplete:"postal-code",formatMethod:()=>{const{country:e}=i.getSelected(),t=null==e?void 0:e.iso2;return hi.postalCodeFromCountry(t&&t.toUpperCase())}}))),{countryInputField:i,postcodeInputField:s}}const Zi=new Set(["stripe","smartglocal"]);class ki extends w.Z{constructor(e,t){if(super("popup-payment popup-payment-card",{closable:!0,overlayClosable:!0,body:!0,scrollable:Zi.has(e.native_provider),title:"PaymentCardInfo"}),this.paymentForm=e,this.savedCard=t,Zi.has(e.native_provider))this.d();else{const t=this.telegramWebView=Si({url:e.url});t.addEventListener("payment_form_submit",(t=>{const i={title:t.title,save:!1};this.dispatchEvent("finish",{token:t.credentials,card:i}),this.hide(),e.pFlags.can_save_credentials&&(0,vi.Z)({titleLangKey:"PaymentCardSavePaymentInformation",descriptionLangKey:"PaymentCardSavePaymentInformationInfoLine1",button:{langKey:"Save"}}).then((()=>{i.save=!0}),Qe.Z)})),this.body.append(t.iframe),this.show(),t.onMount()}}destroy(){return this.telegramWebView.destroy(),super.destroy()}d(){const e=this.savedCard,t=new Ei.Z({name:"PaymentInfo.Card.Title",noDelimiter:!0,noShadow:!0}),i=JSON.parse(this.paymentForm.native_params.data);let s,n,a=0;const o=new Ii({label:"PaymentCardNumber",plainText:!0,inputMode:"numeric",autocomplete:"cc-number",formatMethod:hi.cardNumber,validateMethod:mi,errorKeys:{invalid:"PaymentCard.Error.Invalid",incomplete:"PaymentCard.Error.Incomplete"},onChange:e=>{(e=>{if(s===e)return;const t=++a;s=e;const i=Ni(e);if(!i)return void(n&&(n.remove(),n=void 0));const r=new Image;r.classList.add("input-field-icon"),(0,Ot.cj)(r,i,!1).then((()=>{a===t&&(n?n.replaceWith(r):o.container.append(r),n=r)}))})(Bt(e.value)),l.update()}});let r;i.need_cardholder_name&&(r=new L.ZP({label:"Checkout.NewCard.CardholderNamePlaceholder",maxLength:255,required:!0,autocomplete:"cc-name"}));const d=new Ii({label:"SecureId.Identity.Placeholder.ExpiryDate",plainText:!0,inputMode:"numeric",autocomplete:"cc-exp",formatMethod:hi.cardExpiry,validateMethod:gi});d.input.addEventListener("input",(()=>{let e=d.value;if(e.length<5)return;const t=e.split("/");4===t[1].length&&(e=[t[0],t[1].slice(2)].join("/"),d.setValueSilently(e))}),{capture:!0});const l=new Ii({labelText:"CVC",plainText:!0,inputMode:"numeric",autocomplete:"cc-csc",name:"cvc",formatMethod:()=>hi.cardCvc(o.value)}),c=(new Li.T(l.container,l.input),[o,d,l,r].filter(Boolean));c.forEach((e=>{const t=t=>{if(!e.value&&"Backspace"===t.key){const t=c[c.indexOf(e)-1];t&&(0,Nt.Z)(t.input,!0)}};if(e instanceof Ii){e.options.onKeyDown=t;const i=e.options.onChange;e.options.onChange=t=>{if(null==i||i(t),document.activeElement===e.input&&t.meta.autocorrectComplete)for(let t=c.indexOf(e),i=c.length;te.container))));const g=!!this.paymentForm.pFlags.can_save_credentials,v=new zt.Z({text:"PaymentCardSavePaymentInformation",checked:!!g}),b=new Gt.ZP({checkboxField:v,subtitleLangKey:g?"PaymentCardSavePaymentInformationInfoLine1":"Checkout.2FA.Text"});g||b.container.classList.add("is-disabled"),(p||t).content.append(b.container),this.scrollable.append(...[t,p].filter(Boolean).map((e=>e.container)));const y=Oi({key:"PaymentInfo.Done",onClick:()=>{return e=this,t=void 0,n=function*(){const e={cardNumber:o.value,expiryFull:d.value,expiryMonth:d.value.split("/")[0],expiryYear:d.value.split("/")[1],cvc:l.value,cardholderName:null==r?void 0:r.value,country:null==f?void 0:f.value,zip:null==m?void 0:m.value,save:null==v?void 0:v.checked},t=this.paymentForm.native_provider;let s;if("stripe"===t){const t=new URL("https://api.stripe.com/v1/tokens");t.search=new URLSearchParams({"card[number]":e.cardNumber,"card[exp_month]":e.expiryMonth,"card[exp_year]":e.expiryYear,"card[cvc]":e.cvc,"card[address_zip]":e.zip,"card[address_country]":e.country,"card[name]":e.cardholderName}).toString();const n=yield fetch(t.toString(),{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:`Bearer ${i.publishable_key}`}});s=yield n.json()}else if("smartglocal"===t){const t={card:{number:e.cardNumber.replace(/[^\d]+/g,""),expiration_month:e.expiryMonth,expiration_year:e.expiryYear,security_code:e.cvc.replace(/[^\d]+/g,"")}},n="https://tgb.smart-glocal.com/cds/v1/tokenize/card",a=yield fetch(n,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","X-PUBLIC-TOKEN":i.public_token},body:JSON.stringify(t)});s={type:"card",token:(yield a.json()).data.token}}this.dispatchEvent("finish",{token:s,card:e}),this.hide()},new((s=void 0)||(s=Promise))((function(i,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}d((n=n.apply(e,t||[])).next())}));var e,t,s,n}});Mi([o,r,d,l,f,m].filter(Boolean),(e=>{y.disabled=!e})),e&&(o.value=e.cardNumber,d.value=e.expiryFull,l.value=e.cvc,r&&(r.value=e.cardholderName),f&&(f.value=e.country),m&&(m.value=e.zip)),this.body.append(this.btnConfirmOnEnter=y),this.show(),o.validateNew(void 0,void 0,!0)||(0,Nt.Z)(o.input)}}class Ti extends w.Z{constructor(e,t){super("popup-payment popup-payment-card-confirmation",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"Checkout.PasswordEntry.Title"});const i=new Ei.Z({noDelimiter:!0,noShadow:!0,caption:"Checkout.PasswordEntry.Text",captionArgs:[e]}),s=new Li.Z({labelText:t.hint});i.content.append(s.container),this.scrollable.append(i.container);const n=()=>{a.disabled=!s.value,s.setState(L.I1.Neutral)};s.input.addEventListener("input",n);const a=Oi({key:"Checkout.PasswordEntry.Pay",onClick:()=>{return e=this,i=void 0,a=function*(){try{const e=yield this.managers.passwordManager.getInputCheckPassword(s.value,t),i=yield this.managers.apiManager.invokeApi("account.getTmpPassword",{password:e,period:60});this.dispatchEvent("finish",i),this.hide()}catch(e){throw"PASSWORD_HASH_INVALID"===e.type&&(e.handled=!0,s.setError("PASSWORD_HASH_INVALID")),e}},new((n=void 0)||(n=Promise))((function(t,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(e){var i;e.done?t(e.value):(i=e.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(e,i||[])).next())}));var e,i,n,a}});this.body.append(this.btnConfirmOnEnter=a),n(),this.show(),(0,Nt.Z)(s.input)}}var xi=i(1171),Ai=i(709);class _i extends w.Z{constructor(e,t,i){super("popup-payment popup-payment-shipping",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"PaymentShippingInfo"}),this.paymentForm=e,this.inputInvoice=t,this.focus=i,this.d()}d(){const e=this.paymentForm.invoice,t=this.paymentForm.saved_info;let i,s,n,a,o,r,d,l,c,h,u;if(e.pFlags.shipping_address_requested){i=new Ei.Z({name:"PaymentShippingAddress",noDelimiter:!0,noShadow:!0}),s=new L.ZP({label:"PaymentShippingAddress1Placeholder",maxLength:64,required:!0}),n=new L.ZP({label:"PaymentShippingAddress2Placeholder",maxLength:64}),a=new L.ZP({label:"PaymentShippingCityPlaceholder",maxLength:64,required:!0}),o=new L.ZP({label:"PaymentShippingStatePlaceholder",maxLength:64});const e=Pi(!0,!0);r=e.countryInputField,d=e.postcodeInputField,i.content.append(...[s,n,a,o,r,d].filter(Boolean).map((e=>e.container)))}if([e.pFlags.name_requested,e.pFlags.email_requested,e.pFlags.phone_requested].includes(!0)){l=new Ei.Z({name:"PaymentShippingReceiver",noDelimiter:!0,noShadow:!0});const t=()=>{const e=h.value,t=(0,xi.Z)(e);return!(!t||t[0].length!==e.length)},i=()=>!!u.value.match(/\d/);e.pFlags.name_requested&&(c=new L.ZP({label:"PaymentShippingName",maxLength:256,required:!0})),e.pFlags.email_requested&&(h=new L.ZP({label:"PaymentShippingEmailPlaceholder",maxLength:64,required:!0,validate:t})),e.pFlags.phone_requested&&(u=new Ai.Z({required:!0,validate:i})),l.content.append(...[c,h,u].filter(Boolean).map((e=>e.container)))}const p=new zt.Z({text:"PaymentShippingSave",checked:!0}),f=new Gt.ZP({checkboxField:p,subtitleLangKey:"PaymentShippingSaveInfo"});(l||i).content.append(f.container),this.scrollable.append(...[i,l].filter(Boolean).map((e=>e.container)));const m=Oi({key:"PaymentInfo.Done",onClick:()=>{return e=this,t=void 0,l=function*(){const e=r&&r.getSelected().country,t={_:"paymentRequestedInfo",shipping_address:e&&{_:"postAddress",street_line1:s.value,street_line2:n.value,city:a.value,state:o.value,country_iso2:null==e?void 0:e.iso2,post_code:d.value},name:null==c?void 0:c.value,email:null==h?void 0:h.value,phone:null==u?void 0:u.value};try{const e=yield this.managers.appPaymentsManager.validateRequestedInfo(this.inputInvoice,t,null==p?void 0:p.checked);this.dispatchEvent("finish",{shippingAddress:t,requestedInfo:e}),this.hide()}catch(e){const t={ADDRESS_STREET_LINE1_INVALID:s,ADDRESS_STREET_LINE2_INVALID:n,ADDRESS_COUNTRY_INVALID:r,ADDRESS_CITY_INVALID:a,ADDRESS_STATE_INVALID:o,ADDRESS_POSTCODE_INVALID:d,REQ_INFO_NAME_INVALID:c,REQ_INFO_EMAIL_INVALID:h,REQ_INFO_PHONE_INVALID:u}[e.type];throw t&&(t.setError(),e.handled=!0),e}},new((i=void 0)||(i=Promise))((function(s,n){function a(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,o)}r((l=l.apply(e,t||[])).next())}));var e,t,i,l}});if(this.body.append(this.btnConfirmOnEnter=m),t){const e=t.shipping_address;e&&(s.value=e.street_line1,n.value=e.street_line2,a.value=e.city,o.value=e.state,r.selectCountryByIso2(e.country_iso2),d.value=e.post_code),t.name&&c&&(c.value=t.name),t.email&&h&&(h.value=t.email),t.phone&&u&&(u.value=t.phone)}const{validate:g}=Mi([s,n,a,o,r,d,c,h,u].filter(Boolean),(e=>{m.disabled=!e}));let v;g(),this.show(),v=this.focus?{name:c,email:h,phone:u}[this.focus]:s,v&&(0,Nt.Z)(v.input)}}var Fi=i(1218);class Di extends w.Z{constructor(e,t,i){super("popup-payment popup-payment-shipping-methods",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"PaymentShippingMethod"}),this.paymentForm=e,this.requestedInfo=t,this.shippingOption=i,this.d()}d(){const e=new Ei.Z({name:"PaymentCheckoutShippingMethod",noDelimiter:!0,noShadow:!0}),t=this.requestedInfo.shipping_options.map((e=>new Gt.ZP({radioField:new Fi.Z({text:e.title,name:"shipping-method",value:e.id}),subtitle:(0,Pt.Z)(Tt(e.prices.map((({amount:e})=>+e)),0),this.paymentForm.invoice.currency)})));let i;const s=(0,Gt.De)(t,(e=>{i=e}));this.shippingOption?t.find((e=>e.radioField.input.value===this.shippingOption.id)).radioField.checked=!0:t[0].radioField.checked=!0,e.content.append(s),this.scrollable.append(e.container);const n=Oi({key:"PaymentInfo.Done",onClick:()=>{this.dispatchEvent("finish",this.requestedInfo.shipping_options.find((e=>e.id===i))),this.hide()}});this.body.append(this.btnConfirmOnEnter=n),this.show()}}var Ri=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Bi=["amex","card","diners","discover","jcb","mastercard","visa","unionpay","mir","logo"];function Ni(e){if(Bi.includes(e))return`assets/img/${e}.svg`}function Oi(e){var t,i;const s=null!==(t=e.textEl)&&void 0!==t?t:new C.ZP.IntlElement({key:null!==(i=e.key)&&void 0!==i?i:"PaymentInfo.Done"}),n=s.key,a=(0,Ue.Z)("btn-primary btn-color-primary payment-item-pay");return a.append(s.element),(0,S.fc)(a,(()=>Ri(this,void 0,void 0,(function*(){const t=e.onClick();if(!(t instanceof Promise))return;const i=(0,jt.y)(a),o=(0,Ut.Z)([a],!0);s.compareAndUpdate({key:"PleaseWait"});try{yield t}catch(e){e.handled||console.error("payment button error",e),o(),s.compareAndUpdate({key:n}),i.remove()}})))),a}class Ui extends w.Z{constructor(e,t,i,s){super("popup-payment",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:!0}),this.message=e,this.inputInvoice=t,this.paymentForm=i,this.isReceipt=s,this.tipButtonsMap=new Map,this.d().catch((e=>{console.error("payment popup error",e),this.hide()}))}d(){var e,t,i;return Ri(this,void 0,void 0,(function*(){this.element.classList.add("is-loading"),this.show();let s=!1;const n=()=>{s||(s=!0,ke&&ke.hide(),this.hide())};let{paymentForm:a,message:o}=this;o&&this.listenerSetter.add(d.Z)("payment_sent",(({peerId:e,mid:t})=>{o.peerId===e&&o.mid===t&&n()}));const r=null==o?void 0:o.media,l=null!==(e=this.isReceipt)&&void 0!==e?e:r?!!r.receipt_msg_id||"messageExtendedMedia"===(null===(t=r.extended_media)||void 0===t?void 0:t._):"payments.paymentReceipt"===a._,c=r?r.pFlags.test:a.invoice.pFlags.test,h=r?r.photo:a.photo,u=r?r.title:a.title,p=r?r.description:a.description;(0,C.$d)(this.title,l?"PaymentReceipt":"PaymentCheckout"),c&&this.title.append(" (Test)");const m="payment-item",g=document.createElement("div");g.classList.add(m);const v=m+"-details",b=document.createElement("div");let y;b.classList.add(v),h&&(y=document.createElement("div"),y.classList.add(v+"-photo","media-container-contain"),(0,V.Z)({photo:h,container:y,boxWidth:100,boxHeight:100,size:{_:"photoSizeEmpty",type:""}}),b.append(y));const w=v+"-lines",L=document.createElement("div");L.classList.add(w);const E=document.createElement("div");E.classList.add(w+"-title");const I=document.createElement("div");I.classList.add(w+"-description");const M=document.createElement("div");M.classList.add(w+"-bot-name"),L.append(E,I,M),(0,_.Z)(E,(0,R.Z)(u)),(0,_.Z)(I,(0,R.Z)(p));const P=new B.Z;M.append(P.element),b.append(L),g.append(b),this.scrollable.append(g);const Z=document.createElement("div");Z.classList.add(m+"-preloader-container"),(0,jt.y)(Z,!0),this.scrollable.container.append(Z);const k=this.inputInvoice;a||(a=l?yield this.managers.appPaymentsManager.getPaymentReceipt(o.peerId,r.receipt_msg_id||k.msg_id):yield this.managers.appPaymentsManager.getPaymentForm(k),this.paymentForm=a);let T=a.saved_info||a.info;const x=null===(i=a.saved_credentials)||void 0===i?void 0:i[0];let[A,F,D]=yield Promise.all([!l&&T&&this.managers.appPaymentsManager.validateRequestedInfo(k,T),x&&this.managers.passwordManager.getState(),(0,Vt.Z)({peerId:a.provider_id.toPeerId()})]);yield P.update({peerId:a.bot_id.toPeerId()}),Z.remove(),this.element.classList.remove("is-loading");const N=(e,t)=>(0,Pt.Z)(e,H,t),{invoice:O}=a,H=O.currency,z=O.pFlags.recurring&&!l;yield P.update({peerId:a.bot_id.toPeerId()});const j=z?yield(0,Vt.Z)({peerId:a.bot_id.toPeerId()}):void 0;Z.remove(),this.element.classList.remove("is-loading");const G=()=>{const e=document.createElement("div");e.classList.add(K+"-price");const t=document.createElement("span"),i=document.createElement("span");return e.append(t,i),{label:e,left:t,right:i}},K=m+"-prices",W=document.createElement("div");W.classList.add(K);const $=e=>e.map((e=>{const{amount:t,label:i}=e,s=G();s.left.textContent=i;const n=N(t);return s.right.textContent=n,s.label})),q=$(O.prices);let Q=()=>0,Y=0;const X=()=>{const e=N(te+Q()+Y);ee.right.textContent=e,J.compareAndUpdate({key:"PaymentCheckoutPay",args:[e]})},J=new C.ZP.IntlElement,ee=G();ee.label.classList.add("is-total"),(0,C.$d)(ee.left,"PaymentTransactionTotal");const te=Tt(O.prices.map((({amount:e})=>+e)),0),ie=void 0!==O.max_tip_amount&&!l||!!a.tip_amount;if(ie){const e=m+"-tips",t=Zt.Z[H];Q=()=>+i().replace(/\D/g,"");const i=()=>r.value,s=()=>{const e=(0,xt.Z)(i(),`500 ${kt.Bf} ${kt.bt}`);r.style.width=e+"px"},n=e=>{e=Math.min(+e,+O.max_tip_amount);const t=N(e,!0);r.value=t,document.activeElement===r&&(0,Nt.Z)(r),g&&g();const i=this.tipButtonsMap.get(e);i&&i.classList.add("active"),s(),X()},o=G();(0,C.$d)(o.left,l?"PaymentTip":"PaymentTipOptional");const r=document.createElement("input");r.type="tel",r.classList.add("input-clear",e+"-input"),o.right.append(r),l?o.label.classList.add("disable-hover"):o.label.style.cursor="text",o.label.addEventListener("mousedown",(e=>{(0,Be.Z)(e.target,r)||(0,Nt.Z)(r)}));const d=r instanceof HTMLInputElement?1:2,c=()=>{p?--p:(p=d,(0,Nt.Z)(r))},h=()=>{setTimeout((()=>{p=d,(0,Nt.Z)(r),document.addEventListener("selectionchange",c)}),0)},u=()=>{r.addEventListener("focus",h,{once:!0}),document.removeEventListener("selectionchange",c)};let p;r.addEventListener("focusout",u),u(),r.addEventListener("input",(()=>{n(Q())}));const f=[t.symbol,t.space_between?" ":""];let g;if(t.symbol_left||f.reverse(),o.right[t.symbol_left?"prepend":"append"](f.join("")),q.push(o.label),l)n(a.tip_amount);else{const t=document.createElement("div");t.classList.add(e);const i=e+"-tip",s=O.suggested_tip_amounts.map((e=>{const t=(0,Ue.Z)(i,{noRipple:!0});return t.textContent=N(e),this.tipButtonsMap.set(+e,t),t}));g=()=>{const e=t.querySelector(".active");e&&e.classList.remove("active")},(0,S.fc)(t,(e=>{const t=(0,ve.Z)(e.target,i);if(!t)return;let s=0;if(t.classList.contains("active"))t.classList.remove("active");else{g(),t.classList.add("active");for(const[e,i]of this.tipButtonsMap)if(i===t){s=e;break}}n(s)})),n(0),t.append(...s),q.push(t)}}else X();q.push(ee.label),W.append(...q),g.append(W);const se=(e,t)=>Ri(this,void 0,void 0,(function*(){const i=document.createElement("img");i.classList.add("media-photo"),yield(0,Ot.cj)(i,Ni(t));let s=e.media;s?(0,U.Z)(s,i):(s=e.createMedia("small"),s.classList.add("media-container-cover"),s.append(i)),e.container.classList.remove("row-with-icon")})),ne=e=>{e.titleLangKey&&(e.subtitleLangKey=e.titleLangKey),e.noWrap=!0;const t=new Gt.ZP(e);return t.container.classList.add(m+"-row"),e.titleLangKey&&t.subtitle.classList.add("hide"),t},ae=(e,t)=>{if(e.title.textContent=t,!t){const t=C.ZP.weakMap.get(e.subtitle.firstElementChild);e.title.append((0,C.ag)(t.key))}e.subtitle.classList.toggle("hide",!t)},oe=e=>{let t,i,s;"title"in e?(t=e.title.split(" ").shift(),i=e.title,s=e.icon):(t=Bt(e.cardNumber),i=t+" *"+e.cardNumber.split(" ").pop()),ce.title.classList.remove("tgico","tgico-card_outline"),se(ce,s||t.toLowerCase()),ae(ce,i)},re=()=>{new ki(a,de).addEventListener("finish",(({token:e,card:t})=>{le=e,de=t,oe(t)}))};let de,le;const ce=ne({titleLangKey:"PaymentCheckoutMethod",clickable:l?void 0:re,icon:"card_outline"});ce.container.classList.add(m+"-method-row"),x?oe(x):a.credentials_title&&oe({title:a.credentials_title});const he=ne({title:D,subtitleLangKey:"PaymentCheckoutProvider"}),ue=new f.Z;let pe,fe,me,ge,be,we,Se,Ce;ue.classList.add("avatar-32"),he.createMedia("small").append(ue),ue.updateWithOptions({peerId:a.provider_id.toPeerId()});const Le=O.pFlags.shipping_address_requested?e=>{if(!e)return be.subtitle.classList.add("hide"),void(0,U.Z)(be.title,(0,C.ag)("PaymentShippingAddress"));const t=e.shipping_address;ae(pe,[t.city,t.street_line1,t.street_line2].filter(Boolean).join(", ")),be.container.classList.toggle("hide",!A&&!l)}:void 0,Ee=e=>{Le&&Le(e),fe&&ae(fe,e.name),me&&ae(me,e.email),ge&&ae(ge,e.phone&&"+"+(0,Ae.u)(e.phone).formatted)};if(l||(Se=e=>{new _i(a,k,e).addEventListener("finish",(({shippingAddress:e,requestedInfo:t})=>{A=t,T=a.saved_info=e,Ee(e)}))}),O.pFlags.shipping_address_requested){const e=e=>{const i=new at(this.scrollable,void 0,!0);if(i.save(),t&&t.forEach((e=>e.remove())),!e)return Y=0,X(),i.restore(),void this.onContentUpdate();we=e,ae(be,e.title),Y=Tt(e.prices.map((({amount:e})=>+e)),0),t=$(e.prices);let s=ee.label;ie&&(s=s.previousElementSibling,l||(s=s.previousElementSibling)),t.forEach((e=>s.parentElement.insertBefore(e,s))),X(),i.restore(),this.onContentUpdate()};let t;pe=ne({icon:"location",titleLangKey:"PaymentShippingAddress",clickable:!l&&Se.bind(null,void 0)}),be=ne({icon:"shipping",titleLangKey:"PaymentCheckoutShippingMethod",clickable:!l&&(Ce=()=>{new Di(a,A,we).addEventListener("finish",(t=>{e(t)}))})}),be.container.classList.add("hide");const i=a.shipping;i&&e(i)}O.pFlags.name_requested&&(fe=ne({icon:"newprivate",titleLangKey:"PaymentCheckoutName",clickable:!l&&Se.bind(null,"name")})),O.pFlags.email_requested&&(me=ne({icon:"mention",titleLangKey:"PaymentShippingEmailPlaceholder",clickable:!l&&Se.bind(null,"email")})),O.pFlags.phone_requested&&(ge=ne({icon:"phone",titleLangKey:"PaymentCheckoutPhoneNumber",clickable:!l&&Se.bind(null,"phone")})),T&&Ee(T);const Ie=[ce,he,pe,be,fe,me,ge].filter(Boolean),Me=z&&new zt.Z({text:"Payments.Recurrent.Accept",textArgs:[(0,ft.ZP)(O.recurring_terms_url),j]}),Pe=z&&ne({checkboxField:Me}),Ze=z?[document.createElement("hr"),Pe.container]:[];let ke,Te;this.scrollable.append(...[document.createElement("hr"),...Ie.map((e=>e.container)),...Ze].filter(Boolean));const xe=()=>{_e.disabled=!(!Me||Me.checked)};let _e;_e=Oi(l?{onClick:()=>this.hide(),key:"Done"}:{onClick:()=>{const e=O.pFlags.name_requested&&!(null==T?void 0:T.name)?"name":O.pFlags.email_requested&&!(null==T?void 0:T.email)?"email":O.pFlags.phone_requested&&!(null==T?void 0:T.phone)?"phone":void 0;if(O.pFlags.shipping_address_requested){if(!A)return void Se();if(!we)return void Ce()}else if(e)return void Se(e);return de||Te?Promise.resolve().then((()=>Ri(this,void 0,void 0,(function*(){const e=Te?{_:"inputPaymentCredentialsSaved",id:x.id,tmp_password:Te.tmp_password}:{_:"inputPaymentCredentials",data:{_:"dataJSON",data:JSON.stringify(le.token?le:{type:le.type,id:le.id})},pFlags:{save:de.save||void 0}};try{const t=yield this.managers.appPaymentsManager.sendPaymentForm(k,a.form_id,null==A?void 0:A.id,null==we?void 0:we.id,e,Q());"payments.paymentResult"===t._?n():(ke=new Ci(t.url,!r.extended_media),ke.addEventListener("finish",(()=>{ke=void 0,n()})),yield new Promise(((e,t)=>{ke.addEventListener("close",(()=>{if(ke=void 0,s)e();else{const e=new Error("payment not finished");e.handled=!0,t(e)}}))})))}catch(e){throw"BOT_PRECHECKOUT_TIMEOUT"===e.type?((0,ye.bC)({langPackKey:"Error.AnError"}),e.handled=!0):"TMP_PASSWORD_INVALID"===e.type&&(F=Te=void 0,(0,S.tH)(_e),e.handled=!0),e}})))):x?void Promise.resolve(null!=F?F:this.managers.passwordManager.getState()).then((e=>{new Ti(x.title,e).addEventListener("finish",(e=>{F=void 0,Te=e,(0,S.tH)(_e);const t=e.valid_until-(0,Ht.Z)(!0)-5;setTimeout((()=>{Te===e&&(Te=void 0)}),1e3*t)}))})):void re()},textEl:J}),xe(),Me&&Me.input.addEventListener("change",xe),this.body.append(this.btnConfirmOnEnter=_e),this.onContentUpdate()}))}}var Hi=i(8487),zi=i(13),ji=i(9259),Gi=i(3228);class Vi{constructor(e,t,i,s,n=t){this.sizes=e,this.maxWidth=t,this.minWidth=i,this.spacing=s,this.maxHeight=n,this.count=e.length,this.ratios=Vi.countRatios(e),this.proportions=Vi.countProportions(this.ratios),this.averageRatio=Tt(this.ratios,1)/this.count,this.maxSizeRatio=t/this.maxHeight}layout(){return this.count?this.count>=5||this.ratios.find((e=>e>2))?new Ki(this.ratios,this.averageRatio,this.maxWidth,this.minWidth,this.spacing).layout():2===this.count?this.layoutTwo():3===this.count?this.layoutThree():this.layoutFour():[]}layoutTwo(){return"ww"===this.proportions&&this.averageRatio>1.4*this.maxSizeRatio&&this.ratios[1]-this.ratios[0]<.2?this.layoutTwoTopBottom():"ww"===this.proportions||"qq"===this.proportions?this.layoutTwoLeftRightEqual():this.layoutTwoLeftRight()}layoutThree(){return"n"===this.proportions[0]?this.layoutThreeLeftAndOther():this.layoutThreeTopAndOther()}layoutFour(){return"w"===this.proportions[0]?this.layoutFourTopAndOther():this.layoutFourLeftAndOther()}layoutTwoTopBottom(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],(this.maxHeight-this.spacing)/2)));return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:e,height:t},sides:14}]}layoutTwoLeftRightEqual(){const e=(this.maxWidth-this.spacing)/2,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],1*this.maxHeight)));return[{geometry:{x:0,y:0,width:e,height:t},sides:13},{geometry:{x:e+this.spacing,y:0,width:e,height:t},sides:7}]}layoutTwoLeftRight(){const e=Math.round(1.5*this.minWidth),t=Math.min(Math.round(Math.max(.4*(this.maxWidth-this.spacing),(this.maxWidth-this.spacing)/this.ratios[0]/(1/this.ratios[0]+1/this.ratios[1]))),this.maxWidth-this.spacing-e),i=this.maxWidth-t-this.spacing,s=Math.min(this.maxHeight,Math.round(Math.min(i/this.ratios[0],t/this.ratios[1])));return[{geometry:{x:0,y:0,width:i,height:s},sides:13},{geometry:{x:i+this.spacing,y:0,width:t,height:s},sides:7}]}layoutThreeLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min((this.maxHeight-this.spacing)/2,this.ratios[1]*(this.maxWidth-this.spacing)/(this.ratios[2]+this.ratios[1]))),i=e-t-this.spacing,s=Math.max(this.minWidth,Math.round(Math.min((this.maxWidth-this.spacing)/2,Math.min(t*this.ratios[2],i*this.ratios[1])))),n=Math.min(Math.round(e*this.ratios[0]),this.maxWidth-this.spacing-s);return[{geometry:{x:0,y:0,width:n,height:e},sides:13},{geometry:{x:n+this.spacing,y:0,width:s,height:i},sides:3},{geometry:{x:n+this.spacing,y:i+this.spacing,width:s,height:t},sides:6}]}layoutThreeTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),i=(this.maxWidth-this.spacing)/2,s=Math.min(this.maxHeight-t-this.spacing,Math.round(Math.min(i/this.ratios[1],i/this.ratios[2]))),n=e-i-this.spacing;return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:i,height:s},sides:12},{geometry:{x:i+this.spacing,y:t+this.spacing,width:n,height:s},sides:6}]}layoutFourTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),i=Math.round((this.maxWidth-2*this.spacing)/(this.ratios[1]+this.ratios[2]+this.ratios[3])),s=Math.max(this.minWidth,Math.round(Math.min(.4*(this.maxWidth-2*this.spacing),i*this.ratios[1]))),n=Math.round(Math.max(Math.max(1*this.minWidth,.33*(this.maxWidth-2*this.spacing)),i*this.ratios[3])),a=e-s-n-2*this.spacing,o=Math.min(this.maxHeight-t-this.spacing,i);return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:s,height:o},sides:12},{geometry:{x:s+this.spacing,y:t+this.spacing,width:a,height:o},sides:4},{geometry:{x:s+this.spacing+a+this.spacing,y:t+this.spacing,width:n,height:o},sides:6}]}layoutFourLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min(e*this.ratios[0],.6*(this.maxWidth-this.spacing))),i=Math.round((this.maxHeight-2*this.spacing)/(1/this.ratios[1]+1/this.ratios[2]+1/this.ratios[3])),s=Math.round(i/this.ratios[1]),n=Math.round(i/this.ratios[2]),a=e-s-n-2*this.spacing,o=Math.max(this.minWidth,Math.min(this.maxWidth-t-this.spacing,i));return[{geometry:{x:0,y:0,width:t,height:e},sides:13},{geometry:{x:t+this.spacing,y:0,width:o,height:s},sides:3},{geometry:{x:t+this.spacing,y:s+this.spacing,width:o,height:n},sides:2},{geometry:{x:t+this.spacing,y:s+n+2*this.spacing,width:o,height:a},sides:6}]}static countRatios(e){return e.map((e=>e.w/e.h))}static countProportions(e){return e.map((e=>e>1.2?"w":e<.8?"n":"q")).join("")}}class Ki{constructor(e,t,i,s,n,a=4*i/3){this.averageRatio=t,this.maxWidth=i,this.minWidth=s,this.spacing=n,this.maxHeight=a,this.ratios=Ki.cropRatios(e,t),this.count=e.length}static cropRatios(e,t){return e.map((e=>t>1.1?(0,Gi.Z)(e,1,2.75):(0,Gi.Z)(e,.6667,1)))}layout(){const e=new Array(this.count),t=[],i=(e,t)=>{const i=Tt(this.ratios.slice(e,e+t),0);return(this.maxWidth-(t-1)*this.spacing)/i},s=e=>{const s=[];let n=0;for(const t of e)s.push(i(n,t)),n+=t;t.push({lineCounts:e,heights:s})};for(let e=1;e!==this.count;++e){const t=this.count-e;e>3||t>3||s([e,t])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t){const i=this.count-e-t;e>3||t>(this.averageRatio<.85?4:3)||i>3||s([e,t,i])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t)for(let i=1;i!==this.count-e-t;++i){const n=this.count-e-t-i;e>3||t>3||i>3||n>3||s([e,t,i,n])}let n=null,a=0;for(const e of t){const{heights:t,lineCounts:i}=e,s=i.length,o=Tt(t,0)+this.spacing*(s-1),r=Math.min(...t),d=(Math.max(...t),r{for(let e=1;e!==s;++e)if(i[e-1]>i[e])return 1.5;return 1})(),c=Math.abs(o-this.maxHeight)*d*l;(!n||c2&e.sides)),s=i.geometry.width+i.geometry.x,n=t.find((e=>4&e.sides)),a=n.geometry.height+n.geometry.y,o=e.container;o.style.width=s+"px",o.style.height=a+"px";const r=o.children;t.forEach((({geometry:t,sides:i},n)=>{let d;if(d=r[n],d||(d=document.createElement("div"),o.append(d)),d.classList.add("album-item","grouped-item"),d.style.width=t.width/s*100+"%",d.style.height=t.height/a*100+"%",d.style.top=t.y/a*100+"%",d.style.left=t.x/s*100+"%",8&i&&1&i&&(d.style.borderTopLeftRadius="inherit"),8&i&&4&i&&(d.style.borderBottomLeftRadius="inherit"),2&i&&1&i&&(d.style.borderTopRightRadius="inherit"),2&i&&4&i&&(d.style.borderBottomRightRadius="inherit"),e.forMedia){const e=document.createElement("div");e.classList.add("album-item-media"),d.append(e)}}))}var $i=i(6131);function qi({messages:e,attachmentDiv:t,middleware:i,uploading:s,lazyLoadQueue:n,isOut:a,chat:r,loadPromises:l,autoDownload:c,managers:h=d.Z.managers,animationGroup:u}){const p=[];for(const t of e){const e=(0,vt.Z)(t),i="photo"===e._?(0,z.Z)(e,480,480):{w:e.w,h:e.h};p.push({size:i,media:e,message:t})}Wi({container:t,items:p.map((e=>({w:e.size.w,h:e.size.h}))),maxWidth:o.Z.active.album.width,minWidth:100,spacing:2,forMedia:!0});const{width:f,height:m}=t.style,g=parseInt(f),v=parseInt(m);p.forEach(((e,s)=>{var o;const{size:r,media:d,message:p}=e,f=!!(null===(o=p.media.pFlags)||void 0===o?void 0:o.spoiler),m=t.children[s];m.dataset.mid=""+p.mid,m.dataset.peerId=""+p.peerId;const b=m.firstElementChild;let y;if(y="photo"===d._?(0,V.Z)({photo:d,message:p,container:b,boxWidth:0,boxHeight:0,isOut:a,lazyLoadQueue:n,middleware:i,size:r,loadPromises:l,autoDownloadSize:c.photo,managers:h}):(0,W.Z)({doc:d,container:b,message:p,boxWidth:0,boxHeight:0,withTail:!1,isOut:a,lazyLoadQueue:n,middleware:i,loadPromises:l,autoDownload:c,managers:h,noAutoplayAttribute:f}),y&&(null==l||l.push(y)),f){const e=(y||Promise.resolve()).then((()=>{return e=this,t=void 0,n=function*(){if(!i())return;const{width:e,height:t}=m.style,s=+e.slice(0,-1)/100*g,n=+t.slice(0,-1)/100*v,a=yield(0,$i.ZP)({media:d,animationGroup:u,middleware:i,width:s,height:n});i()&&b.append(a)},new((s=void 0)||(s=Promise))((function(i,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}d((n=n.apply(e,t||[])).next())}));var e,t,s,n}));null==l||l.push(e)}}))}var Qi=i(296),Yi=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))},Xi=i(3552),Ji=i(8130);class es extends Xi._{init(e){return t=this,i=void 0,n=function*(){this.container.id="poll-results-container",this.container.classList.add("chatlist-container"),this.resultsDiv=document.createElement("div"),this.resultsDiv.classList.add("poll-results"),this.scrollable.append(this.resultsDiv);const t=yield this.managers.appPollsManager.getPoll(e.media.poll.id);this.setTitle(t.poll.pFlags.quiz?"PollResults.Title.Quiz":"PollResults.Title.Poll");const i=document.createElement("h3");(0,_.Z)(i,(0,R.Z)(t.poll.question));const s=t.results.results.map((e=>e.voters/t.results.total_voters*100));ss(s);const n=document.createDocumentFragment();t.results.results.forEach(((i,o)=>{if(!i.voters)return;const r=document.createElement("hr"),d=t.poll.answers[o],l=document.createElement("div");l.classList.add("poll-results-answer");const c=document.createElement("div");(0,_.Z)(c,(0,R.Z)(d.text));const h=document.createElement("div");h.innerText=Math.round(s[o])+"%",l.append(c,h);const u=Ji.default.createChatList();u.classList.add("poll-results-voters"),Ji.default.setListClickListener(u,(()=>{a.ZP.onCloseBtnClick()}),void 0,!0),u.style.minHeight=48*Math.min(i.voters,4)+"px",n.append(r,l,u);let p,f=4,m=!1,g=Math.max(0,i.voters-4);const v=()=>{m||(m=!0,this.managers.appPollsManager.getVotes(e,d.option,p,f).then((e=>{e.votes.forEach((e=>{const{dom:t}=Ji.default.addDialogNew({peerId:e.user_id.toPeerId(!1),container:u,rippleEnabled:!1,meAsSaved:!1,avatarSize:"small"});t.lastMessageSpan.parentElement.remove()})),p&&(g=Math.max(0,g-e.votes.length),g&&b.lastElementChild.replaceWith((0,C.ag)("PollResults.LoadMore",[Math.min(20,g)]))),p=e.next_offset,f=20,g&&e.votes.length||b.remove()})).finally((()=>{m=!1})))},b=(0,Ue.Z)("poll-results-more btn btn-primary btn-transparent",{icon:"down"});b.addEventListener("click",v),b.append((0,C.ag)("PollResults.LoadMore",[Math.min(20,g)])),n.append(b),v()})),this.resultsDiv.append(i,n),a.ZP.toggleSidebar(!0).then((()=>{}))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}}var ts=i(5157);let is=0;const ss=e=>{const t=e.reduce(((e,t)=>e+Math.round(t)),0);if(t>100){const i=t-100,s=e.length;for(let t=0;t=.5&&si&&(i=s,t=n)}if(-1===t)return;e[t]+=1-i}}};d.Z.addEventListener("poll_update",(({poll:e,results:t})=>{Array.from(document.querySelectorAll(`poll-element[poll-id="${e.id}"]`)).forEach((i=>{i.isClosed=!!e.pFlags.closed,i.performResults(t,e.chosenIndexes)}))})),o.Z.addEventListener("resize",(()=>{ls.setMaxLength(),ls.resizePolls()})),o.Z.addEventListener("changeScreen",(()=>{ls.setMaxLength()}));const ns=(e,t,i)=>{e.classList.remove("active"),clearTimeout(i),setTimeout((()=>{t(),e.remove(),as===e&&os===t&&rs===i&&(as=os=null,rs=0)}),200)};let as,os,rs,ds=!1;class ls extends HTMLElement{constructor(){super(...arguments),this.isClosed=!1,this.isQuiz=!1,this.isRetracted=!1,this.isPublic=!1,this.isMultiple=!1,this.chosenIndexes=[],this.chosingIndexes=[],this.sentVote=!1}static setMaxLength(){const e=xe.Z.width<=360?xe.Z.width-120:o.Z.active.poll.width;this.MAX_LENGTH=e+9+this.MAX_OFFSET+-13.7}static resizePolls(){this.MAX_LENGTH&&Array.from(document.querySelectorAll("poll-element.is-voted")).forEach((e=>{e.svgLines.forEach(((t,i)=>{e.setLineProgress(i,1)}))}))}render(){return e=this,t=void 0,s=function*(){is||(is=document.getElementById("poll-line").getTotalLength(),ls.setMaxLength());const{poll:e,results:t}=this.message.media;let i;this.message.pFlags.is_scheduled&&this.classList.add("disable-hover"),e.pFlags&&(this.isPublic=!!e.pFlags.public_voters,this.isQuiz=!!e.pFlags.quiz,this.isClosed=!!e.pFlags.closed,this.isMultiple=!!e.pFlags.multiple_choice,this.isClosed?(i="Chat.Poll.Type.Closed",this.classList.add("is-closed")):i=this.isQuiz?this.isPublic?"Chat.Poll.Type.Quiz":"Chat.Poll.Type.AnonymousQuiz":this.isPublic?"Chat.Poll.Type.Public":"Chat.Poll.Type.Anonymous"),this.classList.toggle("is-multiple",this.isMultiple);const s=this.isMultiple?'':"",n=e.answers.map(((e,t)=>`\n
\n
\n
\n \n \n \n ${s}\n
\n
\n
\n \n \n
\n `)).join("");if(this.innerHTML=`\n
\n
\n
\n
\n
\n ${n}`,(0,_.Z)(this.firstElementChild,(0,R.Z)(e.question)),Array.from(this.querySelectorAll(".poll-answer-text")).forEach(((t,i)=>{(0,_.Z)(t,(0,R.Z)(e.answers[i].text))})),this.descDiv=this.firstElementChild.nextElementSibling,this.typeDiv=this.descDiv.firstElementChild,this.avatarsDiv=this.descDiv.lastElementChild,i&&this.typeDiv.append((0,C.ag)(i)),this.isQuiz&&(this.classList.add("is-quiz"),e.close_period&&e.close_date)){const t=document.createElement("div");t.classList.add("poll-time"),this.descDiv.append(t);const i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.classList.add("poll-quiz-timer"),this.quizTimer=i;const s=2,n=7,a=2*Math.PI*n,o=document.createElementNS("http://www.w3.org/2000/svg","circle");o.classList.add("poll-quiz-timer-circle"),o.setAttributeNS(null,"cx","16"),o.setAttributeNS(null,"cy","16"),o.setAttributeNS(null,"r",""+n),o.setAttributeNS(null,"stroke-width",""+s),i.append(o),this.descDiv.append(i);const r=1e3*e.close_period,l=1e3*(e.close_date-(yield d.Z.managers.timeManager.getServerTimeOffset()));this.quizInterval=window.setInterval((()=>{const e=Date.now(),i=(l-e)/r,s=(l-e)/1e3+1|0;t.innerHTML=(0,ts.Z)(s),s<=5&&(t.style.color="#ee545c",o.style.stroke="#ee545c"),o.style.strokeDashoffset=a+i*a,o.style.strokeDasharray=`${a} ${a}`,e>=l&&(clearInterval(this.quizInterval),t.innerHTML="",o.style.strokeDashoffset=a,this.quizInterval=0,setTimeout((()=>{this.managers.appPollsManager.getResults(this.message)}),3e3))}),1e3)}this.answerDivs=Array.from(this.querySelectorAll(".poll-answer")),this.svgLines=Array.from(this.querySelectorAll(".poll-line")),this.numberDivs=Array.from(this.querySelectorAll(".poll-answer-percents"));const o=document.createElement("div");o.classList.add("poll-footer"),this.viewResults=document.createElement("div"),this.viewResults.className="poll-footer-button poll-view-results hide",this.viewResults.append((0,C.ag)("Chat.Poll.ViewResults")),this.votersCountDiv=document.createElement("div"),this.votersCountDiv.className="poll-votes-count",o.append(this.viewResults,this.votersCountDiv),this.append(o),this.viewResults.addEventListener("click",(e=>{(0,Ce.Z)(e),a.ZP.isTabExists(es)||a.ZP.createTab(es).open(this.message)})),(0,x.Z)(this.viewResults),this.isMultiple&&(this.sendVoteBtn=document.createElement("div"),this.sendVoteBtn.classList.add("poll-footer-button","poll-send-vote"),this.sendVoteBtn.append((0,C.ag)("Chat.Poll.SubmitVote")),(0,x.Z)(this.sendVoteBtn),e.chosenIndexes.length||this.votersCountDiv.classList.add("hide"),(0,S.fc)(this.sendVoteBtn,(e=>{(0,Ce.Z)(e),this.chosingIndexes.length&&this.sendVotes(this.chosingIndexes).then((()=>{this.chosingIndexes.length=0,this.answerDivs.forEach((e=>{e.classList.remove("is-chosing")}))}))})),o.append(this.sendVoteBtn));const r=!(e.chosenIndexes.length||this.isClosed);r&&!this.isPublic||this.performResults(t,e.chosenIndexes,!1),r&&(this.setVotersCount(t),(0,S.fc)(this,this.clickHandler))},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}initQuizHint(e){if(e.solution&&e.solution_entities){const t=document.createElement("div");if(t.classList.add("tgico-tip","poll-hint"),this.descDiv.append(t),(0,S.fc)(t,(i=>{(0,Ce.Z)(i),t.classList.add("active"),((e,t,i)=>{as&&ns(as,os,rs);const s=document.createElement("div");s.classList.add("quiz-hint");const n=document.createElement("div");n.classList.add("container","tgico");const a=document.createElement("div");a.classList.add("text"),n.append(a),s.append(n),(0,_.Z)(a,(0,ft.ZP)(e,{entities:t})),Xr.chat.bubbles.container.append(s),s.offsetLeft,s.classList.add("active"),as=s,os=i,rs=window.setTimeout((()=>{ns(s,i,rs)}),c.Z?5e3:7e3),ds||(ds=!0,Xr.addEventListener("peer_changed",(()=>{as&&ns(as,os,rs)})))})(e.solution,e.solution_entities,(()=>{t.classList.remove("active")}))})),this.sentVote){const i=e.results.find((e=>e.pFlags.correct));i&&!i.pFlags.chosen&&(0,S.tH)(t)}}}clickHandler(e){const t=(0,ve.Z)(e.target,"poll-answer");if(!t)return;(0,Ce.Z)(e);const i=+t.dataset.index;if(this.isMultiple){t.classList.toggle("is-chosing");const e=this.chosingIndexes.indexOf(i);-1!==e?this.chosingIndexes.splice(e,1):this.chosingIndexes.push(i)}else this.sendVotes([i])}sendVotes(e){if(this.sendVotePromise)return this.sendVotePromise;const t=this.answerDivs.filter(((t,i)=>e.includes(i)));return t.forEach((e=>{e.classList.add("is-voting")})),this.classList.add("disable-hover"),this.sentVote=!0,this.sendVotePromise=this.managers.appPollsManager.sendVote(this.message,e).then((()=>{t.forEach((e=>{e.classList.remove("is-voting")})),this.classList.remove("disable-hover")})).catch((()=>{this.sentVote=!1})).finally((()=>{this.sendVotePromise=null}))}performResults(e,t,i=!0){var s,n;if(d.Z.settings.animationsEnabled||(i=!1),this.isQuiz&&((null===(s=e.results)||void 0===s?void 0:s.length)||this.isClosed)){this.answerDivs.forEach(((t,i)=>{t.classList.toggle("is-correct",!!e.results[i].pFlags.correct)})),this.initQuizHint&&(this.initQuizHint(e),this.initQuizHint=null),this.quizInterval&&(clearInterval(this.quizInterval),this.quizInterval=0),(null===(n=this.quizTimer)||void 0===n?void 0:n.parentElement)&&this.quizTimer.remove();const t=this.descDiv.querySelector(".poll-time");t&&t.remove()}if(this.isClosed&&(this.classList.add("is-closed"),(0,U.Z)(this.typeDiv,(0,C.ag)("Chat.Poll.Type.Closed"))),(this.chosenIndexes.length!==t.length||this.isClosed)&&(this.isRetracted=this.chosenIndexes.length&&!t.length,this.chosenIndexes=t.slice(),this.isRetracted?(0,S.fc)(this,this.clickHandler):(0,S.EN)(this,this.clickHandler)),this.chosenIndexes.length||this.isRetracted||this.isClosed){const t=e.results.map((t=>e.total_voters?t.voters/e.total_voters*100:0));this.classList.toggle("no-transition",!i),i&&(0,Fe.Z)({element:this,className:"",forwards:!this.isRetracted,duration:340}),(0,pe.T2)((()=>{this.setResults(this.isRetracted?this.percents:t,this.chosenIndexes,i),this.percents=t,this.isRetracted=!1}))}if(this.setVotersCount(e),this.isPublic){this.isMultiple||(this.viewResults.classList.toggle("hide",!e.total_voters||!this.chosenIndexes.length),this.votersCountDiv.classList.toggle("hide",!!this.chosenIndexes.length));const t=(e.recent_voters||[]).map((e=>e.toPeerId())),i=new ie({avatarSize:16});i.render(t),(0,U.Z)(this.avatarsDiv,i.container)}if(this.isMultiple){const t=!!this.chosenIndexes.length,i=this.isClosed||t,s=!this.isPublic||!e.total_voters||!t&&!this.isClosed;this.sendVoteBtn.classList.toggle("hide",i),this.viewResults.classList.toggle("hide",s),this.votersCountDiv.classList.toggle("hide",!i||!s)}}setResults(e,t,i){this.svgLines.forEach((e=>e.style.display="")),this.answerDivs.forEach(((e,i)=>{e.classList.toggle("is-chosen",t.includes(i))}));const s=Math.max(...e);if(this.maxPercents=e.map((e=>e/s)),this.isRetracted)this.svgLines.forEach(((e,t)=>{this.setLineProgress(t,-1)}));else{const e=()=>{this.svgLines.forEach(((e,t)=>{this.setLineProgress(t,1)}))};i?(0,pe.T2)(e):e()}let n;e=e.slice(),ss(e);const a=t=>{e.forEach(((e,i)=>{const s=n(e,t);this.numberDivs[i].innerText=s+"%"}))};if(this.isRetracted)if(n=(e,t)=>Math.round(e/10*t),i)for(let e=9,t=0;e>=0;--e,++t)setTimeout((()=>{a(e)}),34*t);else a(0);else if(n=(e,t)=>Math.round(e/10*(t+1)),i)for(let e=0;e<10;++e)setTimeout((()=>{a(e)}),34*e);else a(9);if(this.isRetracted){i&&this.classList.add("is-retracting"),this.classList.remove("is-voted");const e=()=>{this.svgLines.forEach((e=>e.style.display="none"))};i?setTimeout((()=>{this.classList.remove("is-retracting"),e()}),340):e()}else this.classList.add("is-voted")}setVotersCount(e){const t=e.total_voters||0;let i;const s=[t];i=this.isClosed?this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesResultEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesResultEmpty":this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesEmpty",(0,U.Z)(this.votersCountDiv,(0,C.ag)(i,s))}setLineProgress(e,t){const i=this.svgLines[e];-1===t?(i.style.strokeDasharray="",i.style.strokeDashoffset=""):(i.style.strokeDasharray=t*this.maxPercents[e]*ls.MAX_LENGTH+", 485.9",i.style.strokeDashoffset=""+t*ls.MAX_OFFSET)}}ls.MAX_OFFSET=-46.5,ls.MAX_LENGTH=0,customElements.define("poll-element",ls);const cs="֑-߿יִ-﷽ﹰ-ﻼ",hs=(new RegExp("^[^A-Za-zÀ-ÖØ-öø-ʸ̀-֐ࠀ-῿Ⰰ-﬜﷾-﹯﻽-￿]*["+cs+"]"),new RegExp("["+cs+"]"));var us=i(6628),ps=i(5345),fs=i(3591),ms=i(9102),gs=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const vs=new Map([["messageActionHistoryClear",!0],["messageActionChatCreate",e=>e.pFlags.out]]),bs=new Set;Oe.Z&&bs.add("messageActionPhoneCall");const ys=void 0;let ws=ys,Ss=0;const Cs=3,Ls=new Error("peer changed"),Es={1:96,2:90,3:84,4:72,5:60,6:48,7:36},Is=Object.keys(Es).length;function Ms(e){return Math.max(...e)}class Ps{constructor(e,t){let i;this.chat=e,this.managers=t,this.unreadOut=new Set,this.needUpdate=[],this.bubbles={},this.skippedMids=new Set,this.bubblesNewByGroupedId={},this.bubblesNew={},this.dateMessages={},this.scrolledDown=!0,this.isScrollingTimeout=0,this.unreaded=new Map,this.unreadedSeen=new Set,this.preloader=null,this.messagesQueueOnRenderAdditional=null,this.firstUnreadBubble=null,this.middlewareHelper=(0,Se.k)(),this.followStack=[],this.isHeavyAnimationInProgress=!1,this.isFirstLoad=!0,this.passEntities={},this.viewsMids=new Set,this.isTopPaddingSet=!1,this.renderingMessages=new Set,this.bubblesToEject=new Set,this.bubblesToReplace=new Map,this.setPeerTempId=0,this.renderNewPromises=new Set,this.extendedMediaMessages=new Set,this.unreadedObserverCallback=e=>{if(e.isIntersecting){const t=e.target,i=this.unreaded.get(t);this.onUnreadedInViewport(t,i)}},this.viewsObserverCallback=e=>{if(e.isIntersecting){const t=+e.target.dataset.mid;if(this.observer.unobserve(e.target,this.viewsObserverCallback),t)this.viewsMids.add(t),this.sendViewCountersDebounced();else{const{sponsoredMessage:e}=this,t=null==e?void 0:e.random_id;t&&(this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(),t),delete e.random_id)}}},this.stickerEffectObserverCallback=e=>{if(e.isIntersecting){this.observer.unobserve(e.target,this.stickerEffectObserverCallback);const t=e.target.querySelector(".attachment");(0,ue.e9)().then((()=>{(0,Hi.Z)(t)&&(0,S.tH)(t)}))}},this.onBubblesMouseMove=e=>gs(this,void 0,void 0,(function*(){const t=(0,ve.Z)(e.target,"bubble-content");if("scheduled"===this.chat.type||!t||this.chat.selection.isSelecting||(0,ve.Z)(e.target,"service")||(0,ve.Z)(e.target,"bubble-beside-button"))this.unhoverPrevious();else{const e=(0,ve.Z)(t,"bubble");if(!this.chat.selection.canSelectBubble(e))return void this.unhoverPrevious();let{hoverBubble:i,hoverReaction:s}=this;if(e===i)return;if(this.unhoverPrevious(),i=this.hoverBubble=e,s=this.hoverReaction,s)s.dataset.loaded&&this.setHoverVisible(s,!0);else{s=this.hoverReaction=document.createElement("div"),s.classList.add("bubble-hover-reaction");const i=document.createElement("div");i.classList.add("bubble-hover-reaction-sticker"),s.append(i),t.append(s);let n=yield this.chat.getMessage(+e.dataset.mid);if("message"!==(null==n?void 0:n._))return void this.unhoverPrevious();n=yield this.managers.appMessagesManager.getGroupsFirstMessage(n);const a=this.getMiddleware((()=>this.hoverReaction===s));Promise.all([this.managers.appReactionsManager.getAvailableReactionsByMessage(n),(0,nt.Z)(400)]).then((([e])=>{const t=e[0];t?(0,K.ZP)({div:i,doc:t.select_animation,width:18,height:18,needUpscale:!0,middleware:a,group:this.chat.animationGroup,withThumb:!1,needFadeIn:!1}).then((({render:e})=>e)).then((e=>{(0,Pe.Z)(e),e.addEventListener("firstFrame",(()=>{a()&&(s.dataset.loaded="1",this.setHoverVisible(s,!0))}),{once:!0}),(0,S.fc)(s,(e=>{(0,Ce.Z)(e),this.managers.appReactionsManager.sendReaction(n,t),this.unhoverPrevious()}),{listenerSetter:this.listenerSetter})}),Qe.Z):s.remove()}))}}})),this.unhoverPrevious=()=>{const{hoverBubble:e,hoverReaction:t}=this;e&&(this.setHoverVisible(t,!1),this.hoverBubble=void 0,this.hoverReaction=void 0)},this.onBubblesClick=e=>gs(this,void 0,void 0,(function*(){var t;let i=e.target,s=null;try{s=(0,ve.Z)(i,"bubble")}catch(e){}if(!s&&!this.chat.selection.isSelecting){const e=(0,ve.Z)(i,"user-avatar");if(!e)return;const t=e.dataset.peerId.toPeerId();return void(t!==m.NM?this.chat.appImManager.setInnerPeer({peerId:t}):(0,ye.Am)(C.ZP.format("HidAccount",!0)))}if(s.classList.contains("is-date")&&(0,ve.Z)(i,"bubble-content")){if(s.classList.contains("is-fake")&&(s=s.previousElementSibling),s.classList.contains("is-sticky")&&!this.chatInner.classList.contains("is-scrolling"))return;for(const e in this.dateMessages)if(this.dateMessages[e].div===s){w.Z.createPopup(E,new Date(+e),this.onDatePick).show();break}return}if(!c.Z&&(0,ve.Z)(i,"time"))return void this.chat.selection.toggleByElement(s);if(this.chat.selection.isSelecting&&e.isTrusted){if(s.classList.contains("service")&&void 0===s.dataset.mid)return;return(0,Ce.Z)(e),c.Z&&this.chat.selection.selectedText?void(this.chat.selection.selectedText=void 0):void this.chat.selection.toggleByElement((0,ve.Z)(i,"grouped-item")||s)}const n=(0,ve.Z)(i,"media-spoiler-container");if(n)return void(0,$i.kN)({event:e,mediaSpoiler:n});const a=(0,ve.Z)(i,"contact");if(a)return void this.chat.appImManager.setInnerPeer({peerId:a.dataset.peerId.toPeerId()});const o=(0,ve.Z)(i,"bubble-call");if(o)return void this.chat.appImManager.callUser(this.peerId.toUserId(),o.dataset.type);if((0,ve.Z)(i,"is-buy")){(0,Ce.Z)(e);const t=yield this.chat.getMessage(+s.dataset.mid);if(!t)return;return void new Ui(t,yield this.managers.appPaymentsManager.getInputInvoiceByPeerId(t.peerId,t.mid))}const r=(0,be.Z)(i,"REACTION-ELEMENT");if(r){if((0,Ce.Z)(e),r.classList.contains("is-inactive"))return;const t=r.parentElement,i=t.getReactionCount(r),s=t.getMessage();return void this.managers.appReactionsManager.sendReaction(s,i.reaction)}const d=(0,Re.Z)(i,"data-sticker-emoji");if(d&&1===d.parentElement.querySelectorAll("[data-sticker-emoji]").length&&s.classList.contains("emoji-big"))return void(0,K._2)({event:e,container:d,managers:this.managers,middleware:this.getMiddleware(),peerId:this.peerId});if((0,ve.Z)(i,"replies")){const e=+s.dataset.mid;if(this.peerId===m.hj){const t=yield this.chat.getMessage(e),i=(0,D.Z)(t.reply_to.reply_to_peer_id),s=t.reply_to.reply_to_top_id,n=t.fwd_from.saved_from_msg_id;this.chat.appImManager.openThread({peerId:i,lastMsgId:n,threadId:s})}else{const t=yield this.chat.getMessage(e),i=yield this.managers.appMessagesManager.getMessageWithReplies(t),s=i.replies;s&&this.managers.appMessagesManager.getDiscussionMessage(this.peerId,i.mid).then((e=>{this.chat.appImManager.setInnerPeer({peerId:s.channel_id.toPeerId(!0),type:"discussion",threadId:e.mid})}))}return}const l=(0,ve.Z)(i,"is-via");if(l){const t=l.querySelector(".peer-title");if(i===t||(0,Be.Z)(i,t)){const i=t.innerText+" ";return this.managers.appDraftsManager.setDraft(this.peerId,this.chat.threadId,i),void(0,Ce.Z)(e)}}const h=(0,ve.Z)(i,"peer-title")||(0,be.Z)(i,"AVATAR-ELEMENT")||(0,Re.Z)(i,"data-saved-from");if(h&&h!==s){i=h||i;const e=i.dataset.peerId||i.getAttribute("peer")||i.peerId,t=i.dataset.savedFrom;if("string"==typeof e||t)if(t){const[e,n]=t.split("_");if(i.classList.contains("is-receipt-link")){const t=yield this.managers.appMessagesManager.getMessageByPeer(e.toPeerId(),+n);if(t){const e=yield this.managers.appPaymentsManager.getInputInvoiceByPeerId(this.peerId,+s.dataset.mid);new Ui(t,e,void 0,!0)}}else this.chat.appImManager.setInnerPeer({peerId:e.toPeerId(),lastMsgId:+n})}else{const t=e.toPeerId();t!==m.NM?this.chat.appImManager.setInnerPeer({peerId:t}):(0,ye.Am)(C.ZP.format("HidAccount",!0))}return}if(s.classList.contains("sticker")&&i.parentElement.classList.contains("attachment")){const e=+s.dataset.mid,i=null===(t=(yield this.chat.getMessage(e)).media)||void 0===t?void 0:t.document;return void((null==i?void 0:i.stickerSetInput)&&new M.Z(i.stickerSetInput).show())}const u=(0,ve.Z)(i,"document-with-thumb");if("IMG"===i.tagName&&!i.classList.contains("emoji")&&!i.classList.contains("document-thumb")||i.classList.contains("album-item")||"VIDEO"===i.tagName&&!s.classList.contains("round")||u&&!u.querySelector(".preloader-container")||i.classList.contains("canvas-thumbnail")){const t=(0,ve.Z)(i,"album-item")||(0,ve.Z)(i,"document-container"),n=(t||s).querySelector(".preloader-container");if(n)return(0,S.tH)(n),void(0,Ce.Z)(e);(0,Ce.Z)(e);const a=+(t||s).dataset.mid,o=yield this.chat.getMessage(a);if(!o)return void this.log.warn("no message by messageId:",a);const r="webpage",d=s.classList.contains(r),l=u?e=>_e.Z.isMediaCompatibleForDocumentViewer(e):e=>"photo"===e._||["video","gif"].includes(e.type),c=[],h=d?[a]:(yield Promise.all(Object.keys(this.bubbles).map((e=>+e)).map((e=>gs(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e),i=(0,vt.Z)(t);return i&&l(i)&&e})))))).filter(Boolean).sort(((e,t)=>e-t));h.forEach((e=>{let t;u?t=".document-container":(t=".album-item video, .album-item img, .preview video, .preview img, ",t+=this.bubbles[e].classList.contains("with-media-tail")?".bubble__media-container":".attachment video, .attachment img");const i=Array.from(this.bubbles[e].querySelectorAll(t)),s=new Set;if(u)i.forEach((e=>{c.push({element:e.querySelector(".document-ico"),mid:+e.dataset.mid,peerId:this.peerId})}));else{const t=!!this.bubbles[e].querySelector(".media-container-aspecter");i.forEach((i=>{if(t&&!(0,ve.Z)(i,"media-container-aspecter"))return;const n=(0,ve.Z)(i,"album-item"),a=n||i.parentElement;s.has(a)||(s.add(a),c.push({element:i,mid:n?+n.dataset.mid:e,peerId:this.peerId}))}))}})),c.sort(((e,t)=>e.mid-t.mid));const p=c.findIndex((e=>e.mid===a));return me.ZP&&this.log("open mediaViewer single with ids:",h,p,c),c[p]?void(new _e.Z).setSearchContext({threadId:this.chat.threadId,peerId:this.peerId,inputFilter:{_:u?"inputMessagesFilterDocument":"inputMessagesFilterPhotoVideo"},useSearch:"scheduled"!==this.chat.type&&!d,isScheduled:"scheduled"===this.chat.type}).openMedia(o,c[p].element,0,!0,c.slice(0,p),c.slice(p+1)):void this.log("no target for media viewer!",i)}if(-1===["IMG","DIV","SPAN"].indexOf(i.tagName)&&(i=(0,be.Z)(i,"DIV")),-1!==["DIV","SPAN"].indexOf(i.tagName)){if(i.classList.contains("goto-original")){const e=s.dataset.savedFrom,[t,i]=e.split("_");return void this.chat.appImManager.setInnerPeer({peerId:t.toPeerId(),lastMsgId:+i})}if(i.classList.contains("forward")){const e=+s.dataset.mid,t=yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,e);return void new I.Z({[this.peerId]:yield this.managers.appMessagesManager.getMidsByMessage(t)})}let t=!1;try{t=!!(0,ve.Z)(e.target,"reply")}catch(e){}if(t&&s.classList.contains("is-reply")){const e=+s.dataset.mid;this.followStack.push(e);const t=yield this.chat.getMessage(e),i=t.reply_to.reply_to_peer_id?(0,D.Z)(t.reply_to.reply_to_peer_id):this.peerId,n=t.reply_to.reply_to_msg_id;this.chat.appImManager.setInnerPeer({peerId:i,lastMsgId:n,type:this.chat.type,threadId:this.chat.threadId})}}})),this.onScroll=(e,t,i)=>{var s,n,a,o,r;if(this.isHeavyAnimationInProgress){if(null===(s=this.sliceViewportDebounced)||void 0===s||s.clearTimeout(),this.scrolledDown&&!e)return}else null===(n=this.chat.topbar.pinnedMessage)||void 0===n||n.setCorrectIndexThrottled(this.scrollable.lastScrollDirection),null===(a=this.sliceViewportDebounced)||void 0===a||a.call(this),this.setStickyDateManually();if(t&&t.distanceToEnd<300&&this.scrolledDown)return;const d=i?0:null!==(o=null==t?void 0:t.distanceToEnd)&&void 0!==o?o:this.scrollable.getDistanceToEnd();(0!==this.scrollable.lastScrollDirection&&d>0||t||i)&&(this.isScrollingTimeout?clearTimeout(this.isScrollingTimeout):this.chatInner.classList.contains("is-scrolling")||this.chatInner.classList.add("is-scrolling"),this.isScrollingTimeout=window.setTimeout((()=>{this.chatInner.classList.remove("is-scrolling"),this.isScrollingTimeout=0}),1350+(null!==(r=null==t?void 0:t.duration)&&void 0!==r?r:0))),d<300&&(i||this.scrollable.loadedAll.bottom||this.chat.setPeerPromise||!this.peerId)?(this.container.classList.add("scrolled-down"),this.scrolledDown=!0):this.container.classList.contains("scrolled-down")&&(this.container.classList.remove("scrolled-down"),this.scrolledDown=!1)},this.processBatch=(...e)=>gs(this,void 0,void 0,(function*(){var t,i,s;let[n,a,o]=e;const r=e=>e.filter((e=>e&&this.bubbles[e.bubble.dataset.mid]===e.bubble));n=r(n),o("messages rendered");const d=null===(t=n[0])||void 0===t?void 0:t.reverse,{groups:l,avatarPromises:c}=this.groupBubbles(n.filter((e=>e.updatePosition))),h=n.reduce(((e,t)=>{const i=performance.now(),s=t.promises.slice(),n=s.map((e=>gs(this,void 0,void 0,(function*(){return yield e,performance.now()-i}))));return Promise.all(n).then((e=>{o.groupCollapsed("media message time",performance.now()-i,t,e),e.forEach(((e,t)=>{o("media message time",e,t,s[t])})),o.groupEnd()})),e.push(...t.promises),e}),[]);h.push(...c),o("media promises to call",h,n,this.isHeavyAnimationInProgress),yield a(Promise.all([...h,this.setUnreadDelimiter()]).catch(Qe.Z)),yield a((0,pe.AD)()),o("media promises end"),n=r(n);const{restoreScroll:u,scrollSaver:p}=this.prepareToSaveScroll(d);null===(i=this.messagesQueueOnRenderAdditional)||void 0===i||i.call(this),this.ejectBubbles();for(const[e,t]of this.bubblesToReplace){if(p&&p.replaceSaved(t,e),!n.find((t=>t.bubble===e)))continue;const i=this.bubbleGroups.getItemByBubble(e);i?(i.mounted=!1,l.includes(i.group)||l.push(i.group)):this.log.error("NO ITEM BY BUBBLE",e),this.bubblesToReplace.delete(e)}this.chat.selection.isSelecting&&n.forEach((({bubble:e})=>{this.chat.selection.toggleElementCheckbox(e,!0)})),n.forEach((({message:e,bubble:t,updatePosition:i})=>{e.pFlags.local&&i&&this.chatInner[e.pFlags.sponsored?"append":"prepend"](t)})),this.bubbleGroups.mountUnmountGroups(l),null===(s=this.updatePlaceholderPosition)||void 0===s||s.call(this),null==u||u()})),this.onDatePick=e=>{const t=this.peerId;this.managers.appMessagesManager.requestHistory(t,0,2,-1,e,this.chat.threadId).then((e=>{var i;(null===(i=null==e?void 0:e.messages)||void 0===i?void 0:i.length)?this.peerId===t&&this.chat.setMessageId(e.messages[0].mid):this.log.error("no history!")}))},this.log=this.chat.log,this.listenerSetter=new le.Z,this.constructBubbles(),this.batchProcessor=new ps.s({log:this.log,process:this.processBatch,possibleError:Ls}),this.bubbleGroups=new y(this.chat),this.preloader=new P.Z({cancelable:!1}),this.lazyLoadQueue=new de.Z(void 0,!0),this.lazyLoadQueue.queueId=++Ss,this.listenerSetter.add(d.Z)("history_update",(({storageKey:e,sequential:t,message:i})=>gs(this,void 0,void 0,(function*(){if(this.chat.messagesStorageKey!==e||"scheduled"===this.chat.type)return;const{mid:s}=i,n=this.bubbles[s];if(!n)return;if(this.renderNewPromises.size&&(yield Promise.all(Array.from(this.renderNewPromises))),this.messagesQueuePromise&&(yield this.messagesQueuePromise),this.bubbles[s]!==n)return;const a=this.bubbleGroups.getItemByBubble(n);if(!a)return;if(a.mid===s)return;if(t){const e=a.group,o=this.bubbleGroups.createItem(n,i),r=this.bubbleGroups.itemsArr.slice();(0,h.Z)(r,a);const l=this.bubbleGroups.findGroupSiblingByItem(o,r);if(e===(null==l?void 0:l.group)||e===this.bubbleGroups.getLastGroup()&&1===e.items.length&&o.dateTimestamp===a.dateTimestamp||this.peerId===d.Z.myId&&t&&o.dateTimestamp===a.dateTimestamp)return void this.bubbleGroups.changeBubbleMid(n,s)}this.bubbleGroups.removeAndUnmountBubble(n);const{groups:o}=this.groupBubbles([{bubble:n,message:i}]);this.bubbleGroups.mountUnmountGroups(o),this.scrollingToBubble&&this.scrollToEnd()})))),this.listenerSetter.add(d.Z)("dialog_flush",(({peerId:e})=>{this.peerId===e&&this.deleteMessagesByIds(Object.keys(this.bubbles).map((e=>+e)))})),this.listenerSetter.add(d.Z)("message_sent",(e=>gs(this,void 0,void 0,(function*(){const{storageKey:t,tempId:i,tempMessage:s,mid:n,message:a}=e;if(this.chat.messagesStorageKey!==t)return;const o=this.bubbles,r=o[i];if(r){const e=o[i];o[n]=e,e.dataset.mid=""+n,delete o[i],(0,pe.T2)((()=>{const t=+e.dataset.mid;o[t]===e&&e.classList.contains("is-outgoing")&&(e.classList.remove("is-sending","is-outgoing"),e.classList.add(this.peerId===d.Z.myId&&"scheduled"!==this.chat.type||!this.unreadOut.has(t)?"is-read":"is-sent"))}))}if(this.unreadOut.has(i)&&(this.unreadOut.delete(i),this.unreadOut.add(n)),"scheduled"===this.chat.type&&(Date.now()/1e3|0)>=s.date-10&&this.deleteMessagesByIds([n]),!r)return;let l,c;const h=a.grouped_id;if(h){l=yield this.managers.appMessagesManager.getMessagesByAlbum(h);const e=l.map((({mid:e})=>e));if(!e.length||Ms(e)!==n||o[n]!==r)return;if(o[n]!==r)return;c=Array.from(r.querySelectorAll(".grouped-item")).map((e=>+e.dataset.mid))}else l=[a],c=[i];const u=Array.from(r.querySelectorAll("reactions-element"));u.length&&u.forEach((e=>{e.changeMessage(a)})),l.forEach(((e,t)=>{var i,n,a,o,l;if(!e)return;const u=c[t],p=e.mid,f=r.querySelector(`.document-container[data-mid="${p}"]`)||r;if("message"!==e._)return;if(e.replies){const t=r.querySelector("replies-element");t&&(t.message=e,t.init())}const m=null!==(i=e.media)&&void 0!==i?i:{},g=m.document,v=m.poll,b=m.webpage;if(g){const t=f.querySelector(`.document-container[data-mid="${u}"] .document`);if(t){const i=(0,ve.Z)(t,"document-container");!(null===(o=null===(a=null===(n=s.media)||void 0===n?void 0:n.document)||void 0===a?void 0:a.thumbs)||void 0===o?void 0:o.length)&&(null===(l=g.thumbs)||void 0===l?void 0:l.length)&&(0,ue.e9)().then((()=>gs(this,void 0,void 0,(function*(){const i=t.querySelector(".time"),s=yield(0,Qi.Z)({message:e,fontSize:d.Z.settings.messagesTextSize});t.replaceWith(s),i&&(s.querySelector(".document")||s).append(i)})))),i&&(i.dataset.mid=""+p)}const i=f.querySelector(`audio-element[data-mid="${u}"], .document[data-doc-id="${u}"], .media-round[data-mid="${u}"]`);i&&(i instanceof ce.ZP||i.classList.contains("media-round")?(i.dataset.mid=""+e.mid,delete i.dataset.isOutgoing,i.message=e,i.onLoad(!0)):(i.dataset.docId=""+g.id,i.doc=g))}else if(v){const t=f.querySelector("poll-element");t&&(t.message=e,t.setAttribute("poll-id",""+v.id),t.setAttribute("message-id",""+p))}else b&&!f.querySelector(".web")&&(0,ue.e9)().then((()=>{this.safeRenderMessage(e,!0,f),this.scrollToBubbleIfLast(f)}));if(h){const e=f.querySelector(`.grouped-item[data-mid="${u}"]`)||f;e&&(e.dataset.mid=""+p)}}))})))),this.listenerSetter.add(d.Z)("message_edit",(({storageKey:e,message:t})=>gs(this,void 0,void 0,(function*(){if(e!==this.chat.messagesStorageKey)return;const i=this.bubbles[t.mid];i&&(yield(0,ue.e9)(),this.bubbles[t.mid]===i&&this.safeRenderMessage(t,!0,i))})))),this.listenerSetter.add(d.Z)("message_error",(({storageKey:e,tempId:t})=>gs(this,void 0,void 0,(function*(){if(e!==this.chat.messagesStorageKey)return;const i=this.bubbles[t];i&&(yield(0,ue.e9)(),this.bubbles[t]===i&&(i.classList.remove("is-outgoing"),i.classList.add("is-error")))})))),this.listenerSetter.add(d.Z)("album_edit",(({peerId:e,messages:t,deletedMids:i})=>{if(e!==this.peerId)return;const s=t.map((({mid:e})=>e)),n=Ms(s.concat(Array.from(i))),a=this.bubbles[n];if(!a)return;const o=Ms(s),r=t.find((e=>e.mid===o));this.safeRenderMessage(r,!0,a)})),this.listenerSetter.add(d.Z)("messages_reactions",(e=>gs(this,void 0,void 0,(function*(){if("scheduled"===this.chat.type)return;let t;const i=e.map((({message:e,changedResults:t})=>gs(this,void 0,void 0,(function*(){if(this.peerId!==e.peerId)return;const i=yield this.getMountedBubble(e.mid,e);return i?{bubble:i.bubble,message:e,changedResults:t}:void 0}))));(yield Promise.all(i)).filter(Boolean).forEach((({bubble:e,message:i,changedResults:s})=>{t||(t=this.createScrollSaver(!1),t.save());const n=i.peerId+"_"+i.mid,a=it.get(n);if(a)for(const e of a)e.update(i,s);else{if(!i.reactions||!i.reactions.results.length)return;this.appendReactionsElementToBubble(e,i,i,s)}})),t&&t.restore()})))),this.listenerSetter.add(d.Z)("messages_downloaded",(({peerId:e,mids:t})=>gs(this,void 0,void 0,(function*(){const i=this.getMiddleware();yield(0,ue.e9)(),i()&&t.forEach((t=>{this.needUpdate;const i=[];(0,g.Z)(this.needUpdate,((s,n)=>{s.replyMid===t&&s.replyToPeerId===e&&(this.needUpdate.splice(n,1)[0],i.push(s))})),i.forEach((({mid:e,replyMid:t,replyToPeerId:i})=>gs(this,void 0,void 0,(function*(){const t=this.bubbles[e];if(!t)return;const i=yield this.chat.getMessage(e);re.setReply({chat:this.chat,bubble:t,message:i})}))))}))})))),(0,ji.Z)({listenTo:this.scrollable.container,listenerSetter:this.listenerSetter,findTarget:e=>{const t=e.target;return t.closest(".attachment.media-sticker-wrapper")||(0,ve.Z)(t,"attachment")&&t.closest(".custom-emoji")}}),(0,S.fc)(this.scrollable.container,this.onBubblesClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.scrollable.container)("mousedown",(e=>{if(0!==e.button)return;const t=(0,be.Z)(e.target,"CODE");if(t){(0,Ce.Z)(e),i=t,(0,ct.T)(i.textContent);const s=e=>{(0,Ce.Z)(e),(0,ye.bC)({langPackKey:"TextCopied",onClose:()=>{n()}})},n=(0,S.fc)(window,s,{listenerSetter:this.listenerSetter,once:!0,capture:!0})}else var i})),this.stickyIntersector=new k.Z(this.scrollable.container,((e,t)=>{for(const i in this.dateMessages){const s=this.dateMessages[i];if(s.container===t){const t=s.div;t.classList.toggle("is-sticky",e),e&&(this.previousStickyDate=t);break}}this.previousStickyDate})),T.IS_SAFARI||(this.sliceViewportDebounced=(0,Ze.Z)(this.sliceViewport.bind(this),3e3,!1,!0)),(0,ue.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.lazyLoadQueue.lock(),i=this.getMiddleware()}),(()=>{this.isHeavyAnimationInProgress=!1,(null==i?void 0:i())&&this.lazyLoadQueue.unlockAndRefresh(),i=null}),this.listenerSetter)}constructBubbles(){const e=this.container=document.createElement("div");e.classList.add("bubbles","scrolled-down"),(this.chatInner=document.createElement("div")).classList.add("bubbles-inner"),this.setScroll(),e.append(this.scrollable.container)}attachContainerListeners(){const e=this.container;if(this.chat.contextMenu.attachTo(e),this.chat.selection.attachListeners(e,new le.Z),me.ZP&&this.listenerSetter.add(e)("dblclick",(e=>gs(this,void 0,void 0,(function*(){const t=(0,ve.Z)(e.target,"grouped-item")||(0,ve.Z)(e.target,"bubble");if(t){const e=+t.dataset.mid;this.log("debug message:",yield this.chat.getMessage(e)),this.highlightBubble(t)}})))),T.IS_MOBILE){if(c.Z){const t="is-gesturing-reply",i=64,s=.75*i;let n,a,o=!1;(0,De.Z)({element:e,verifyTouchTarget:e=>gs(this,void 0,void 0,(function*(){return!("pinned"===this.chat.type||this.chat.selection.isSelecting||!(yield this.chat.canSend())||(n=(0,ve.Z)(e.target,"bubble"),n&&((0,Fe.Z)({element:n,className:t,forwards:!0,duration:250}),n.offsetLeft,a?(a.classList.remove("is-visible"),a.style.opacity=""):(a=document.createElement("span"),a.classList.add("tgico-reply_filled","bubble-gesture-reply-icon")),n.append(a)),!n))})),onSwipe:e=>{o=e>=s,o&&!a.classList.contains("is-visible")&&a.classList.add("is-visible"),a.style.opacity=""+Math.min(1,e/s);const t=-Math.max(0,Math.min(i,e));n.style.transform=`translateX(${t}px)`,(0,Ct.s)()},onReset:()=>{const e=n;(0,Fe.Z)({element:e,className:t,forwards:!1,duration:250,onTransitionEnd:()=>{a.parentElement===e&&(a.classList.remove("is-visible"),a.remove())}}),(0,pe.T2)((()=>{if(e.style.transform="",o){const{mid:t}=e.dataset;this.chat.input.initMessageReply(+t),o=!1}}))},listenerOptions:{capture:!0}})}}else this.listenerSetter.add(e)("dblclick",(e=>gs(this,void 0,void 0,(function*(){if("pinned"===this.chat.type||this.chat.selection.isSelecting||!(yield this.chat.canSend()))return;const t=e.target,i=t.classList.contains("bubble")?t:t.classList.contains("document-selection")?t.parentElement:null;if(i&&!i.classList.contains("bubble-first")){const e=+i.dataset.mid;if((yield this.chat.getMessage(e)).pFlags.is_outgoing)return;this.chat.input.initMessageReply(e)}}))))}constructPeerHelpers(){this.listenerSetter.add(d.Z)("history_append",(({storageKey:e,message:t})=>gs(this,void 0,void 0,(function*(){e===this.chat.messagesStorageKey&&"scheduled"!==this.chat.type&&(d.Z.settings.animationsEnabled&&(this.updateGradient=!0),this.scrollable.loadedAll.bottom?this.renderNewMessage(t,!0):this.chat.setMessageId())})))),this.listenerSetter.add(d.Z)("history_multiappend",(e=>{this.peerId===e.peerId&&"scheduled"!==this.chat.type&&this.renderNewMessage(e)})),this.listenerSetter.add(d.Z)("history_delete",(({peerId:e,msgs:t})=>{e===this.peerId&&"scheduled"!==this.chat.type&&this.deleteMessagesByIds(Array.from(t))})),this.listenerSetter.add(d.Z)("dialog_unread",(({peerId:e})=>{e===this.peerId&&(this.chat.input.setUnreadCount(),(0,ue.e9)().then((()=>{this.updateUnreadByDialog()})))})),this.listenerSetter.add(d.Z)("dialogs_multiupdate",(e=>{e.has(this.peerId)&&"scheduled"!==this.chat.type&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(d.Z)("dialog_notify_settings",(e=>{this.peerId===e.peerId&&"scheduled"!==this.chat.type&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(d.Z)("chat_update",(e=>gs(this,void 0,void 0,(function*(){const{peerId:t}=this;if(t!==e.toPeerId(!0))return;const i=yield this.managers.appChatsManager.getChat(e);this.chatInner.classList.contains("has-rights")!==(yield this.chat.canSend())&&(yield Promise.all([this.finishPeerChange(),this.chat.input.finishPeerChange()])).forEach((e=>e())),!!i.pFlags.forum!==this.chat.isForum&&"chat"===this.chat.type&&(this.chat.peerId=0,this.chat.appImManager.setPeer({peerId:t}))})))),this.listenerSetter.add(d.Z)("history_reload",(e=>{if(e!==this.peerId)return;const t=(0,ot.Z)(this.bubbles,"desc").filter((e=>e>0)),i=this.getMiddleware();this.managers.appMessagesManager.reloadMessages(this.peerId,t).then((e=>{if(!i())return;const s=[];e.forEach(((e,i)=>{const n=t[i];if(e){const t=this.bubbles[e.mid];if(!t)return;this.safeRenderMessage(e,!0,t)}else s.push(n)})),this.deleteMessagesByIds(s),this.setLoaded("top",!1),this.setLoaded("bottom",!1),this.scrollable.checkForTriggers()}))})),this.listenerSetter.add(d.Z)("settings_updated",(({key:e})=>gs(this,void 0,void 0,(function*(){if("settings.emoji.big"===e){const e=this.getMiddleware(),t=(0,ot.Z)(this.bubbles,"desc").map((e=>gs(this,void 0,void 0,(function*(){const t=this.bubbles[e];if(t.classList.contains("can-have-big-emoji"))return{bubble:t,message:yield this.chat.getMessage(e)}})))),i=yield Promise.all(t);if(!e())return;i.filter(Boolean).forEach((({bubble:e,message:t})=>{this.bubbles[t.mid]===e&&this.safeRenderMessage(t,!0,e)}))}})))),this.listenerSetter.add(d.Z)("messages_views",(e=>{"scheduled"!==this.chat.type&&(0,pe.T2)((()=>{let t;for(const{peerId:i,views:s,mid:n}of e){if(this.peerId!==i)continue;const e=this.bubbles[n];if(!e)continue;const a=Array.from(e.querySelectorAll(".post-views"));if(!a.length)continue;const o=(0,F.Z)(s,1);let r=!1;a.forEach((e=>{(r||e.textContent!==o)&&(t||(t=this.createScrollSaver(!0),t.save()),r=!0,e.textContent=o)}))}null==t||t.restore()}))})),this.observer=new dt({root:this.scrollable.container}),this.sendViewCountersDebounced=(0,Ze.Z)((()=>{const e=[...this.viewsMids];this.viewsMids.clear(),this.managers.appMessagesManager.incrementMessageViews(this.peerId,e)}),1e3,!1,!0),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e,mids:t,pinned:i})=>{"pinned"===this.chat.type&&e===this.peerId&&t&&(i||this.deleteMessagesByIds(t))}));const e=()=>gs(this,void 0,void 0,(function*(){this.chat.topbar.setTitle((yield this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size)}));this.listenerSetter.add(d.Z)("scheduled_new",(t=>{"scheduled"===this.chat.type&&t.peerId===this.peerId&&(this.renderNewMessage(t),e())})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:t,mids:i})=>{"scheduled"===this.chat.type&&t===this.peerId&&(this.deleteMessagesByIds(i),e())}))}get peerId(){return this.chat.peerId}get messagesQueuePromise(){return this.batchProcessor.queuePromise}createScrollSaver(e=!0){return new at(this.scrollable,".bubble:not(.is-date)",e)}createResizeObserver(){if(!("ResizeObserver"in window)||this.resizeObserver)return;const e=this.scrollable.container;let t=0,i=!1,s=!1,n=0,a=0,o=0;const r=()=>{const r=e.offsetHeight,d=this.scrollable.isScrolledDown;r===t||s&&d||(a+=t-r),a&&this.scrollable.setScrollTopSilently(this.scrollable.scrollTop+Math.round(a)),t=r,n=0,o=0,a=0,i=!1,s=!1},d=e=>{o&&window.cancelAnimationFrame(o),o=window.requestAnimationFrame(e?r:()=>{o=window.requestAnimationFrame(r)})};(this.resizeObserver=new ResizeObserver((e=>{if(s)return void d(!1);const o=e[0].contentRect.height;if(!t)return void(t=o);const r=t-o;let l=r+a;const c=l%1;if(l-=c,!i&&(i=!0,r<0&&this.scrollable.isScrolledDown))return a=-r,s=!0,void d(!1);if(n+=l,l){const e=this.scrollable.scrollTop+l;this.scrollable.setScrollTopSilently(e)}d(!1),a=c,t=o}))).observe(e)}destroyResizeObserver(){const e=this.resizeObserver;e&&(e.disconnect(),this.resizeObserver=void 0)}setReactionsHoverListeners(){this.listenerSetter.add(Lt.Z)("toggle",this.unhoverPrevious),this.listenerSetter.add(St.Z)("change",this.unhoverPrevious),this.listenerSetter.add(this.chat.selection)("toggle",this.unhoverPrevious),this.listenerSetter.add(this.container)("mousemove",this.onBubblesMouseMove)}setHoverVisible(e,t){e.parentElement&&e.parentElement.classList.toggle("hover-reaction-visible",t),(0,Fe.Z)({element:e,className:"is-visible",forwards:t,duration:200,onTransitionEnd:t?void 0:()=>{e.remove()},useRafs:2})}setStickyDateManually(){}getRenderedLength(){return Object.keys(this.bubbles).length-this.skippedMids.size}onUnreadedInViewport(e,t){this.unreadedSeen.add(t),this.observer.unobserve(e,this.unreadedObserverCallback),this.unreaded.delete(e),this.readUnreaded()}readUnreaded(){if(this.readPromise)return;const e=this.getMiddleware();this.readPromise=wt.Z.getFocusPromise().then((()=>gs(this,void 0,void 0,(function*(){if(!e())return;let t=Math.max(...Array.from(this.unreadedSeen));if(this.scrollable.loadedAll.bottom){const e=Math.max(...Object.keys(this.bubbles).map((e=>+e)));t>=e&&(t=Math.max((yield this.chat.getHistoryMaxId())||0,t))}this.unreaded.forEach(((e,i)=>{e<=t&&this.onUnreadedInViewport(i,e)}));const i=[];for(const e of this.unreadedSeen)gt(yield this.chat.getMessage(e))&&i.push(e);return this.managers.appMessagesManager.readMessages(this.peerId,i),this.unreadedSeen.clear(),me.ZP&&this.log("will readHistory by maxId:",t),this.managers.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId).catch((e=>{this.log.error("readHistory err:",e),this.managers.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId)})).finally((()=>{e()&&(this.readPromise=void 0,this.unreadedSeen.size&&this.readUnreaded())}))}))))}onGoDownClick(){return gs(this,void 0,void 0,(function*(){if(!this.followStack.length)return void this.chat.setMessageId();const e=this.getMiddleware(),t=this.followStack.slice(),i=yield Promise.all(t.map((e=>this.chat.getMessage(e))));if(!e())return;t.forEach(((e,t)=>{const s=i[t],n=this.bubbles[e];let a=!0;if(n){const e=n.getBoundingClientRect();a=xe.Z.height/2>e.top}else s&&(a=!1);a&&this.followStack.splice(this.followStack.indexOf(e),1)})),this.followStack.sort(((e,t)=>t-e));const s=this.followStack.pop();this.chat.setMessageId(s)}))}getBubbleByPoint(e){let t=we(this.scrollable.container,e,"center");return t&&(t=(0,ve.Z)(t,"bubble")),t}getGroupedBubble(e){return gs(this,void 0,void 0,(function*(){const t=yield this.managers.appMessagesManager.getMidsByAlbum(e);for(const e of t)if(this.bubbles[e]&&!this.skippedMids.has(e))return{bubble:this.bubbles[e],mid:e}}))}getBubbleGroupedItems(e){return Array.from(e.querySelectorAll(".grouped-item"))}getMountedBubble(e,t){return gs(this,void 0,void 0,(function*(){if(void 0===t&&(t=yield this.chat.getMessage(e)),!t)return;const i=t.grouped_id;if(i){const t=yield this.getGroupedBubble(i);if(t)return t.bubble=t.bubble.querySelector(`.document-container[data-mid="${e}"]`)||t.bubble,t}const s=this.bubbles[e];return s?{bubble:s,mid:e}:void 0}))}findNextMountedBubbleByMsgId(e,t){const i=(0,ot.Z)(this.bubbles,t?"desc":"asc");let s;s=t?t=>te{var t;return!!s(e)&&!!(null===(t=this.bubbles[e])||void 0===t?void 0:t.parentElement)}));return this.bubbles[n]}loadMoreHistory(e,t=!1){if(!this.peerId||this.chat.setPeerPromise||this.isHeavyAnimationInProgress||e&&(this.getHistoryTopPromise||this.scrollable.loadedAll.top)||!e&&(this.getHistoryBottomPromise||this.scrollable.loadedAll.bottom))return;const i=Object.keys(this.bubbles).map((e=>+e)).filter((e=>e>0&&!this.skippedMids.has(e))).sort(((e,t)=>e-t));i.length||i.push(0),e?(me.ZP&&this.log("Will load more (up) history by id:",i[0],"maxId:",i[i.length-1],t),this.getHistory1(i[0],!0,void 0,void 0,t)):(me.ZP&&this.log("Will load more (down) history by id:",i[i.length-1],t),this.getHistory1(i[i.length-1],!1,!0,void 0,t))}setScroll(){this.scrollable&&this.destroyScrollable(),this.scrollable=new Z.ZP(null,"IM",300),this.setLoaded("top",!1,!1),this.setLoaded("bottom",!1,!1),this.scrollable.container.append(this.chatInner),this.scrollable.onAdditionalScroll=this.onScroll,this.scrollable.onScrolledTop=()=>this.loadMoreHistory(!0),this.scrollable.onScrolledBottom=()=>this.loadMoreHistory(!1),c.Z}updateUnreadByDialog(){return gs(this,void 0,void 0,(function*(){const e=yield this.chat.getHistoryStorage(),t=this.peerId===d.Z.myId?e.readMaxId:e.readOutboxMaxId;for(const e of this.unreadOut)if(e>0&&e<=t){const t=this.bubbles[e];if(t){if(this.unreadOut.delete(e),t.classList.contains("is-outgoing")||t.classList.contains("is-error"))continue;t.classList.remove("is-sent","is-sending","is-outgoing"),t.classList.add("is-read")}}}))}destroyBubble(e,t=+e.dataset.mid){e.middlewareHelper.destroy(),this.bubbles[t]===e&&delete this.bubbles[t],this.skippedMids.delete(t),this.firstUnreadBubble===e&&(this.firstUnreadBubble=null),this.bubbleGroups.removeAndUnmountBubble(e),this.observer&&(this.observer.unobserve(e,this.unreadedObserverCallback),this.unreaded.delete(e),this.observer.unobserve(e,this.viewsObserverCallback),this.viewsMids.delete(t),this.observer.unobserve(e,this.stickerEffectObserverCallback))}deleteMessagesByIds(e,t=!0,i){let n=!1;e.forEach((e=>{const t=this.bubbles[e];t&&(this.destroyBubble(t,e),n=!0)})),n&&(this.scrollable.ignoreNextScrollEvent(),t&&this.chat.selection.isSelecting&&this.chat.selection.deleteSelectedMids(this.peerId,e),s.Z.checkAnimations(!1,this.chat.animationGroup),this.deleteEmptyDateGroups(),i||this.scrollable.onScroll())}pollExtendedMediaMessages(){const e=Array.from(this.extendedMediaMessages);return this.managers.appMessagesManager.getExtendedMedia(this.peerId,e)}setExtendedMediaMessagesPollInterval(){!this.pollExtendedMediaMessagesPromise&&this.extendedMediaMessages.size&&(this.pollExtendedMediaMessagesPromise=(0,nt.Z)(3e4).then((()=>this.pollExtendedMediaMessages())).then((()=>this.setExtendedMediaMessagesPollInterval())))}setTopPadding(e=this.getMiddleware()){let t,i=!1;if(!this.isTopPaddingSet&&"scheduled"!==this.chat.type){const{clientHeight:e,scrollHeight:s}=this.scrollable.container;i=e===s,i&&(t=this.chatInner,t.style.paddingTop=e+"px",this.scrollable.setScrollTopSilently(s),this.isTopPaddingSet=!0)}return{isPaddingNeeded:i,unsetPadding:i?()=>{e()&&i&&(t.style.paddingTop="",this.isTopPaddingSet=!1)}:void 0}}renderNewMessage(e,t){const i=this._renderNewMessage(e,t);return this.renderNewPromises.add(i),i.catch(Qe.Z).finally((()=>{this.renderNewPromises.delete(i)})),i}_renderNewMessage(e,t){return gs(this,void 0,void 0,(function*(){if(!this.scrollable.loadedAll.bottom){const t=this.chat.setPeerPromise;if(t){const i=this.getMiddleware();t.then((()=>gs(this,void 0,void 0,(function*(){if(!i())return;const t=yield this.chat.getMessage(e.mid);i()&&this.renderNewMessage(t)}))))}return}if(this.chat.threadId&&(0,v.Z)(e,this.chat.isForum)!==this.chat.threadId)return;if(this.bubbles[e.mid])return;t||(t=this.scrolledDown&&(!this.scrollingToBubble||this.scrollingToBubble===this.getLastBubble()||this.scrollingToBubble===this.chatInner));const i=this.getMiddleware(),{isPaddingNeeded:s,unsetPadding:n}=this.setTopPadding(i),a=this.performHistoryResult({history:[e]},!1);return t&&a.then((()=>{if(!i())return;let t;"scheduled"===this.chat.type&&(t=this.bubbles[e.mid]);const a=t?this.scrollToBubbleEnd(t):this.scrollToEnd();s&&a.then(n)})),a}))}getLastBubble(){var e;const t=this.bubbleGroups.getLastGroup();return null===(e=null==t?void 0:t.lastItem)||void 0===e?void 0:e.bubble}scrollToBubble(e,t,i,s){const n=(0,ve.Z)(e,"bubble");let a;if(e.parentElement||this.log.error("element is not connected",n),n&&"end"!==t){const e=this.bubbleGroups.getItemByBubble(n);e&&e.group.firstItem===e&&(0,Ie.Z)(e.group.container)===(this.stickyIntersector?Cs:1)&&(a=e.group.container.parentElement)}const r=this.chat.input.messageInput&&this.chat.input.messageInput.classList.contains("is-changing-height")||this.chat.container.classList.contains("is-toggling-helper"),d=this.scrollable.scrollIntoViewNew({element:e,position:t,margin:4,forceDirection:i,forceDuration:s,axis:"y",getNormalSize:r?({rect:e})=>{let t=xe.Z.height;return t-=this.container.offsetTop,t-=o.Z.isMobile||xe.Z.height<570?58:78,t}:void 0,fallbackToElementStartWhenCentering:a,startCallback:e=>{if(this.onScroll(!0,e),this.updateGradient){const{gradientRenderer:t}=this.chat;null==t||t.toNextPosition(e.getProgress),this.updateGradient=void 0}}});return i===he.f.Static&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop),d}scrollToEnd(){return this.scrollToBubbleEnd(this.chatInner)}scrollToBubbleEnd(e){return gs(this,void 0,void 0,(function*(){if(e){this.scrollingToBubble=e;const t=this.getMiddleware();if(yield this.scrollToBubble(e,"end",void 0,void 0),!t())return;this.scrollingToBubble=void 0}}))}scrollToBubbleIfLast(e){return gs(this,void 0,void 0,(function*(){if(this.getLastBubble()===e)return this.scrollToEnd()}))}highlightBubble(e){const t="highlightTimeout";e.dataset[t]&&(clearTimeout(+e.dataset[t]),e.classList.remove("is-highlighted"),e.offsetWidth),e.classList.add("is-highlighted"),e.dataset[t]=""+setTimeout((()=>{e.classList.remove("is-highlighted"),delete e.dataset[t]}),2e3)}createDateBubble(e,t=new Date(1e3*e)){let i;const s=new Date;s.setHours(0,0,0,0);const n="scheduled"===this.chat.type;if(s.getTime()===t.getTime())i=(0,C.ag)(n?"Chat.Date.ScheduledForToday":"Date.Today");else if(n&&e===ke)i=(0,C.ag)("MessageScheduledUntilOnline");else{const e={day:"numeric",month:"long"};t.getFullYear()!==s.getFullYear()&&(e.year="numeric"),i=new C.ZP.IntlDateElement({date:t,options:e}).element,n&&(i=(0,C.ag)("Chat.Date.ScheduledFor",[i]))}const a=document.createElement("div");a.className="bubble service is-date";const o=document.createElement("div");o.classList.add("bubble-content");const r=document.createElement("div");return r.classList.add("service-msg"),r.append(i),o.append(r),a.append(o),a}getDateForDateContainer(e){const t=new Date(1e3*e);return t.setHours(0,0,0),{date:t,dateTimestamp:t.getTime()}}getDateContainerByTimestamp(e){var t;const{date:i,dateTimestamp:s}=this.getDateForDateContainer(e);let n=this.dateMessages[s];if(n)return n;const a=this.createDateBubble(e,i),o=this.createDateBubble(e,i);o.classList.add("is-fake");const r=document.createElement("section");r.className="bubbles-date-group",r.append(a,o),n=this.dateMessages[s]={div:a,container:r,firstTimestamp:i.getTime()};const d=(0,ot.Z)(this.dateMessages,"asc"),l=d.length;let c,h=0;for(;hthis.setPeerTempId===d,u=(0,Et.Z)(h,Ls);i||(yield u(this.chat.onChangePeer(e,u)));const p=this.chat.type;("scheduled"===p||this.chat.isRestricted)&&(o=0);const f=yield u(this.chat.getHistoryStorage()),g="pinned"===p?yield u(this.managers.appMessagesManager.getPinnedMessagesMaxId(n,this.chat.threadId)):null!==(t=f.maxId)&&void 0!==t?t:0,v=void 0!==o;let b,y,w,S=0;if(!v)if(i||(y=this.chat.appImManager.getChatSavedPosition(this.chat)),y);else if(g){S=yield u(this.managers.appMessagesManager.getReadMaxIdIfUnread(n,this.chat.threadId));const e=yield u(this.chat.getDialogOrTopic());if(!S||i||e&&1===e.unread_count)o=g;else{const e=f.history.findSliceOffset(S);e&&e.slice.isEnd(ge.D.Bottom)&&(w=e.slice[e.offset-25]||e.slice[0]||S),b=!v,o=S}}const C=o!==g;if(void 0===r&&(yield u(this.chat.isStartButtonNeeded()))&&(r=m.gZ),i){a&&o&&this.followStack.push(a);const e=yield u(this.getMountedBubble(o));if(e)return v?(this.scrollToBubble(e.bubble,"center"),this.highlightBubble(e.bubble),this.chat.dispatchEvent("setPeer",o,!1)):g&&!C&&(this.scrollToEnd(),this.chat.dispatchEvent("setPeer",o,!0)),void 0!==r&&this.chat.input.setStartParam(r),null}else this.peerId&&(this.lazyLoadQueue.queueId=++Ss,this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)),this.followStack.length=0,this.passEntities={messageEntityBotCommand:(yield u(this.managers.appPeersManager.isAnyGroup(n)))||this.chat.isBot};me.ZP&&c("setPeer peerId:",n,f,o,g);const L=null!=w?w:C||"scheduled"===p||this.chat.isRestricted?0:g;let E=0;if(i){const e=this.getBubbleByPoint("bottom");e&&(E=+e.dataset.mid),E<=0&&(E=Math.max(...Object.keys(this.bubbles).map((e=>+e))))}else this.isFirstLoad=!0,this.destroyResizeObserver();const I=this.chatInner,M=this.emptyPlaceholderBubble;this.cleanup();const P=this.chatInner=document.createElement("div");i?(P.className=I.className,P.classList.remove("disable-hover","is-scrolling")):P.classList.add("bubbles-inner"),this.lazyLoadQueue.lock();const Z=i||g&&C||v,k=E>0&&(!o||Ethis.performHistoryResult({history:y.mids},!0))),cached:!0,waitPromise:Promise.resolve()}:yield u(this.getHistory1(o,!0,C,L)),this.setPeerCached=A.cached,c.warn("got history");const{promise:_,cached:F}=A;F||i||(yield u(this.chat.finishPeerChange(v,C,o,r)),this.scrollable.container.textContent="",this.preloader.attach(this.container)),s.Z.lockGroup(this.chat.animationGroup);const D=u(_).then((()=>gs(this,void 0,void 0,(function*(){var e;c.warn("promise fulfilled");const t=Z?yield u(o?this.getMountedBubble(o):{bubble:this.getLastBubble()}):void 0;F&&!i&&(c.warn("finishing peer change"),yield u(this.chat.finishPeerChange(v,C,o,r)),c.warn("finished peer change")),this.preloader.detach(),this.resolveLadderAnimation&&(this.resolveLadderAnimation(),this.resolveLadderAnimation=void 0),this.setPeerCached=void 0;const a=this.scrollable;if(a.lastScrollDirection=0,a.lastScrollPosition=0,(0,U.Z)(a.container,P),M&&this.cleanupPlaceholders(M),this.attachPlaceholderOnRender&&this.attachPlaceholderOnRender(),!v&&this.chat.isPinnedMessagesNeeded()&&(null===(e=this.chat.topbar.pinnedMessage)||void 0===e||e.setCorrectIndex(0)),this.container.classList.toggle("has-groups",!!Object.keys(this.dateMessages).length),c.warn("mounted chat",this.chatInner===P,this.chatInner.parentElement,performance.now()-l),s.Z.unlockGroup(this.chat.animationGroup),s.Z.checkAnimations(!1,this.chat.animationGroup),this.lazyLoadQueue.unlock(),y)a.setScrollTopSilently(y.top);else if(Z){let e;if(T)a.setScrollTopSilently(99999);else if(x){const t=this.setTopPadding();t.isPaddingNeeded&&(e=t.unsetPadding),a.setScrollTopSilently(0)}let s,n=b&&this.firstUnreadBubble||(null==t?void 0:t.bubble);if((null==n?void 0:n.parentElement)||(n=this.findNextMountedBubbleByMsgId(o,!1)||this.findNextMountedBubbleByMsgId(o,!0)),n){const e=this.getLastBubble(),t=b?"start":C||v||e!==n?"center":"end";s="end"===t&&e===n&&i?this.scrollToEnd():this.scrollToBubble(n,t,i?void 0:he.f.Static),!b&&v&&this.highlightBubble(n)}e&&(s||Promise.resolve()).then((()=>{e()}))}else a.setScrollTopSilently(99999);this.onRenderScrollSet(),this.onScroll();const d=Promise.all([D,(0,ue.e9)()]);if(d.then((()=>{a.checkForTriggers()})),this.chat.dispatchEvent("setPeer",o,!C),Promise.all([this.setFetchReactionsInterval(d),this.setFetchHistoryInterval({afterSetPromise:d,lastMsgId:o,samePeer:i,savedPosition:y,topMessage:g})]).then((()=>{c("scrolledAllDown:",a.loadedAll.bottom),a.loadedAll.bottom&&g&&!this.unreaded.size&&this.onScrolledAllDown()})),"chat"===p&&!this.chat.isForumTopic){const e=yield u(this.managers.appMessagesManager.getDialogOnly(n));(null==e?void 0:e.pFlags.unread_mark)&&this.managers.appMessagesManager.markDialogUnread(n,!0)}})))).catch((e=>{throw c.error("setPeer promise error:",e),h()||this.preloader.detach(),e}));return{cached:F,promise:D}}))}setFetchReactionsInterval(e){return gs(this,void 0,void 0,(function*(){const t=this.getMiddleware();if(this.chat.isChannel){const i=()=>gs(this,void 0,void 0,(function*(){if(!t())return;const e=[];for(const t in this.bubbles){let i=yield this.chat.getMessage(+t);"message"===(null==i?void 0:i._)&&(i=yield this.managers.appMessagesManager.getGroupsFirstMessage(i),e.push(i.mid))}(e.length?this.managers.appReactionsManager.getMessagesReactions(this.peerId,e):Promise.resolve()).then((()=>{setTimeout(i,1e4)}))}));Promise.all([e,(0,ue.e9)(),(0,nt.Z)(500)]).then((()=>{i()}))}}))}setFetchHistoryInterval({lastMsgId:e,topMessage:t,afterSetPromise:i,savedPosition:s,samePeer:n}){return gs(this,void 0,void 0,(function*(){const e=this.getMiddleware(),t=this.peerId,n=yield this.managers.appMessagesManager.isFetchIntervalNeeded(t);if(!s&&!n)return;if(yield i,!e())return;const a=t.toChatId();e.onClean((()=>{this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(a)})),this.managers.apiUpdatesManager.subscribeToChannelUpdates(a)}))}onScrolledAllDown(){return gs(this,void 0,void 0,(function*(){if("chat"===this.chat.type||"discussion"===this.chat.type){const e=yield this.chat.getHistoryMaxId();this.managers.appMessagesManager.readHistory(this.peerId,e,this.chat.threadId,!0)}}))}finishPeerChange(){return gs(this,void 0,void 0,(function*(){const[e,t,i]=yield Promise.all([this.chat.isChannel,this.chat.canSend(),this.chat.isAnyGroup]);return()=>{this.chatInner.classList.toggle("has-rights",t),this.container.classList.toggle("is-chat-input-hidden",!t),this.chatInner.classList.toggle("is-chat",i),this.chatInner.classList.toggle("is-channel",e),this.createResizeObserver()}}))}renderMessagesQueue(e){return this.batchProcessor.addToQueue(e)}ejectBubbles(){for(const e of this.bubblesToEject)e.remove();this.bubblesToEject.clear()}groupBubbles(e){let t;"scheduled"===this.chat.type&&(t=new Set,e.forEach((({bubble:e,message:i})=>{const s=this.bubbleGroups.getItemByBubble(e),n=null==s?void 0:s.group;n&&s.message.date!==i.date&&(this.bubbleGroups.removeItem(s),t.add(n))}))),e.forEach((({bubble:e,message:t})=>{this.bubbleGroups.prepareForGrouping(e,t)}));const i=this.bubbleGroups.groupUngrouped(),s=Array.from(i).map((e=>{if(e.avatar)return;const t=e.firstItem;return t&&this.chat.isAvatarNeeded(t.message)?e.createAvatar(t.message):void 0})).filter(Boolean);if(t)for(const e of t)i.add(e);return{groups:[...i],avatarPromises:s}}getMiddleware(e){return this.middlewareHelper.get(e)}wrapMediaSpoiler({media:e,promise:t,middleware:i,attachmentDiv:s}){return gs(this,void 0,void 0,(function*(){if(yield t,!i())return;const{width:n,height:a}=s.style,o=yield(0,$i.ZP)({media:e,width:parseInt(n),height:parseInt(a),middleware:i,animationGroup:this.chat.animationGroup});i()&&s.append(o)}))}safeRenderMessage(e,t,i,s=!0,n){return gs(this,void 0,void 0,(function*(){if(!e||this.renderingMessages.has(e.mid)||this.bubbles[e.mid]&&!i)return;const a=this.getMiddleware().create(),o=a.get();let r;try{this.renderingMessages.add(e.mid);const d=document.createElement("div");d.middlewareHelper=a,d.dataset.mid=""+e.mid,d.dataset.peerId=""+e.peerId,d.dataset.timestamp=""+e.date,i&&(i.middlewareHelper.destroy(),this.skippedMids.delete(e.mid),this.bubblesToEject.add(i),this.bubblesToReplace.delete(i),this.bubblesToReplace.set(d,i),this.bubbleGroups.changeBubbleByBubble(i,d)),i=this.bubbles[e.mid]=d;let l=this.renderMessage(e,t,i,o);n&&(l=n(l,i));const c=l.then((e=>e&&o()?Object.assign(Object.assign({},e),{updatePosition:s}):void 0));if(this.renderMessagesQueue(c.catch((()=>{}))),r=yield c,!o())return;r||this.skippedMids.add(+e.mid)}catch(e){this.log.error("renderMessage error:",e)}return o()?(this.renderingMessages.delete(e.mid),r):void 0}))}renderMessage(e,t=!1,i,s){var n,a,r;return gs(this,void 0,void 0,(function*(){const l="message"===e._,c=l&&e.grouped_id;let h,u;const p=c?yield this.managers.appMessagesManager.getMessagesByAlbum(c):void 0,g="pinned"!==this.chat.type;if(c&&g){h=p.map((e=>e.mid));const t=Ms(h);if(e.mid!==t)return}l&&(u=c?p[0]:e);const b=this.chat.isOurMessage(e),y=document.createElement("div");y.classList.add("message","spoilers-container");const w=document.createElement("div");w.classList.add("bubble-content-wrapper");const L=document.createElement("div");L.classList.add("bubble-content"),i.classList.add("bubble"),w.append(L),i.append(w);let E=!b&&!e.pFlags.out&&(e.pFlags.unread||gt(e));if(!E&&this.chat.peerId.isAnyChat()){const t=yield this.managers.appMessagesManager.getReadMaxIdIfUnread(this.chat.peerId,this.chat.threadId);void 0!==t&&t"messageEntityEmoji"===e._)),t=k.replace(/\s/g,"").length;if(e.reduce(((e,t)=>e+t.length),0)===t){U=Math.min(Is,e.length),N=o.Z.active.customEmoji;const t=Es[U];t&&(N=(0,qe.C)(t,t),i.style.setProperty("--emoji-size",t+"px"))}}null!=N||(N=this.chat.appImManager.customEmojiSize);const H=(0,ft.ZP)(k,{entities:A,passEntities:this.passEntities,loadPromises:M,lazyLoadQueue:this.lazyLoadQueue,customEmojiSize:N,middleware:s,animationGroup:this.chat.animationGroup});let z,j=!0,G=!1;if(U){if(d.Z.settings.emoji.big){const e=1===U&&!A.find((e=>"messageEntityCustomEmoji"===e._))&&(yield this.managers.appStickersManager.getAnimatedEmojiSticker(k));1===U&&!F&&e?F={_:"messageMediaDocument",document:e}:(z=document.createElement("div"),z.classList.add("attachment","spoilers-container"),(0,_.Z)(z,H),L.append(z)),i.classList.add("is-message-empty","emoji-big"),G=!0,j=!1,D=!1}i.classList.add("can-have-big-emoji")}D&&(0,_.Z)(y,H);const $=(q=k,hs.test(q));var q;const Q=re.setTime({chatType:this.chat.type,message:e,reactionsMessage:u});let Y;if(y.append(Q),L.prepend(y),$&&Q.classList.add("is-block"),l&&this.chat.isAllMessagesForum){const t=yield(0,ms.Z)({peerId:this.peerId,threadId:(0,v.Z)(e,this.chat.isForum),lastMsgId:e.mid,wrapOptions:{middleware:s},withIcons:!0}),{element:i}=t;Y=document.createElement("div"),Y.classList.add("topic-name-button-container"),Y.append(i)}if(l&&e.views){if(i.classList.add("channel-post"),!(null===(n=e.fwd_from)||void 0===n?void 0:n.saved_from_msg_id)&&"pinned"!==this.chat.type){const e=document.createElement("div");e.classList.add("bubble-beside-button","forward","tgico-forward_filled"),L.prepend(e),i.classList.add("with-beside-button")}!e.pFlags.is_outgoing&&this.observer&&this.observer.observe(i,this.viewsObserverCallback)}const X=l&&e.reply_markup;let J="replyInlineMarkup"===(null==X?void 0:X._)&&X.rows;if(J&&(J=J.filter((e=>e.buttons.length))),J){const t=document.createElement("div");t.classList.add("reply-markup"),J.forEach((i=>{const s=i.buttons,n=document.createElement("div");n.classList.add("reply-markup-row"),s.forEach((t=>{let i,s=(0,ft.ZP)(t.text,{noLinks:!0,noLinebreaks:!0});switch(t._){case"keyboardButtonUrl":{const e=(0,ft.ZP)(" ",{entities:[{_:"messageEntityTextUrl",length:1,offset:0,url:t.url}]});i=(0,Le.Z)(e).firstElementChild,i.classList.add("is-link");break}case"keyboardButtonSwitchInline":i=document.createElement("button"),i.classList.add("is-switch-inline"),(0,S.fc)(i,(i=>{(0,Ce.Z)(i);const s=e.viaBotId||e.fromId;let n;n=t.pFlags.same_peer?Promise.resolve(this.peerId):this.managers.appInlineBotsManager.checkSwitchReturn(s).then((e=>e||new Promise(((e,t)=>{const i=new I.Z({[this.peerId]:[]},(t=>{e(t)}),!0);i.addEventListener("close",(()=>{t()}))})))),n.then((e=>{const i=this.peerId===e?this.chat.threadId:void 0;this.chat.appImManager.setInnerPeer({peerId:e}),this.managers.appInlineBotsManager.switchInlineQuery(e,i,s,t.query)}))}));break;case"keyboardButtonBuy":{const e="messageMediaInvoice"===F._?F:void 0;if(null==e?void 0:e.extended_media)break;i=document.createElement("button"),i.classList.add("is-buy"),(null==e?void 0:e.receipt_msg_id)&&(s=(0,C.ag)("Message.ReplyActionButtonShowReceipt"));break}case"keyboardButtonUrlAuth":{i=document.createElement("button"),i.classList.add("is-url-auth");const{peerId:s}=this,{mid:n}=e,{url:a,button_id:o}=t;(0,S.fc)(i,(()=>{const e=(0,Ut.Z)([i],!0);this.chat.appImManager.handleUrlAuth({peerId:s,mid:n,url:a,buttonId:o}).then((()=>{e()}))}));break}default:i=document.createElement("button")}if(!i)return;i.classList.add("reply-markup-button","rp","tgico");const a=document.createElement("span");a.classList.add("reply-markup-button-text"),"string"==typeof s?a.insertAdjacentHTML("beforeend",s):a.append(s),(0,x.Z)(i),i.append(a),n.append(i)})),n.childElementCount&&t.append(n)}));const s=!!t.childElementCount;s&&(0,S.fc)(t,(t=>{let i=t.target;if(i.classList.contains("reply-markup-button")||(i=(0,ve.Z)(i,"reply-markup-button")),!i||i.classList.contains("is-link")||i.classList.contains("is-switch-inline")||i.classList.contains("is-buy")||i.classList.contains("is-url-auth"))return;(0,Ce.Z)(t);const s=(0,Ie.Z)(i),n=J[(0,Ie.Z)(i.parentElement)];if(!n.buttons||!n.buttons[s])return void this.log.warn("no such button",n,s,e);const a=n.buttons[s];this.managers.appInlineBotsManager.callbackButtonClick(this.peerId,e.mid,a).then((e=>{"string"==typeof e.message&&e.message.length&&(0,ye.Am)((0,ft.ZP)(e.message,{noLinks:!0,noLinebreaks:!0}))}))})),s&&(i.classList.add("with-reply-markup"),w.append(t))}const ee=e.pFlags.is_outgoing;if(b){(e.pFlags.unread||ee)&&this.unreadOut.add(e.mid);let t="";t=e.error?"is-error":ee?"is-sending":e.pFlags.unread||e.pFlags.is_scheduled?"is-sent":"is-read",i.classList.add(t)}ee&&!e.error&&i.classList.add("is-outgoing");const te=l&&(yield this.managers.appMessagesManager.getMessageWithCommentReplies(e)),ie=!!te&&e.mid>0;ie&&i.classList.add("with-replies");const se=l&&e.fwd_from,ne=l&&e.fwdFromId,ae=this.chat.isOutMessage(e);let oe=L;const de=!(e.viaBotId||e.fromId!==d.Z.myId&&e.pFlags.out),le=!k;let ce;if(F){z=document.createElement("div"),z.classList.add("attachment"),le&&i.classList.add("is-message-empty");let t=!1;switch(F._){case"messageMediaPhoto":{const t=F.photo;if(le&&(j=!1),de&&i.classList.add("hide-name"),i.classList.add("photo"),g&&c&&1!==h.length){i.classList.add("is-album","is-grouped"),qi({messages:p,attachmentDiv:z,middleware:this.getMiddleware(),isOut:b,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:M,autoDownload:this.chat.autoDownload});break}const n=!T.IS_ANDROID&&j&&!ie&&!1;n&&i.classList.add("with-media-tail");const a=(0,V.Z)({photo:t,message:e,container:z,withTail:n,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:M,autoDownloadSize:this.chat.autoDownload.photo});F.pFlags.spoiler&&M.push(this.wrapMediaSpoiler({media:t,promise:a,middleware:s,attachmentDiv:z}));break}case"messageMediaWebPage":{t=!0;const s=F.webpage;if("webPage"!==s._)break;const n=(0,fs.Z)(s.url);if("im"===(null==n?void 0:n.onclick)){const e={telegram_channel:"Chat.Message.ViewChannel",telegram_megagroup:"OpenGroup",telegram_bot:"Chat.Message.ViewBot"}[s.type]||"OpenMessage";ce=this.makeViewButton({text:e,asLink:!0}),ce.href=n.url,ce.setAttribute("onclick",`${n.onclick}(this)`)}i.classList.add("webpage");const a=document.createElement("div");a.classList.add("web");const r=document.createElement("div");let l,c;r.classList.add("quote");const h=s.photo;(h||s.document)&&(l=document.createElement("div"),l.classList.add("preview-resizer"),c=document.createElement("div"),c.classList.add("preview"),l.append(c));const u=document.createElement("div");u.classList.add("quote-text");const p=s.document;if(p)if("gif"===p.type||"video"===p.type||"round"===p.type){const t="round"===p.type?o.Z.active.round:o.Z.active.webpage;"round"===p.type?(i.classList.add("round"),c.classList.add("is-round")):i.classList.add("video"),(0,W.Z)({doc:p,container:c,message:e,boxWidth:t.width,boxHeight:t.height,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),isOut:ae,group:this.chat.animationGroup,loadPromises:M,autoDownload:this.chat.autoDownload,noInfo:e.mid<0})}else{const t=yield(0,Qi.Z)({message:e,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,loadPromises:M,sizeType:"documentName",searchContext:{useSearch:!1,peerId:this.peerId,inputFilter:{_:"inputMessagesFilterEmpty"}},fontSize:d.Z.settings.messagesTextSize});c.append(t),c.classList.add("preview-with-document"),u.classList.add("has-document")}let f;if(l&&u.append(l),s.site_name){const e=(0,ft.ZP)(s.url),t=(0,Le.Z)(e).firstElementChild;t.classList.add("webpage-name");const i=document.createElement("strong");(0,_.Z)(i,(0,R.Z)(s.site_name)),t.textContent="",t.append(i),u.append(t),f=t}const m=(0,pt.Z)(s);if(m.textContent){const e=document.createElement("div");e.classList.add("title");const t=document.createElement("strong");(0,_.Z)(t,m),e.append(t),u.append(e),f=e}const g=(0,ut.Z)(s);if(g.textContent){const e=document.createElement("div");e.classList.add("text"),(0,_.Z)(e,g),u.append(e),f=e}if(r.append(u),h&&!p){i.classList.add("photo");const t=h.sizes[h.sizes.length-1];let s=!1;t.w===t.h&&f?(i.classList.add("is-square-photo"),s=!0,(0,ht.Z)(h,c,48,48,!1)):t.h>t.w&&i.classList.add("is-vertical-photo"),(0,V.Z)({photo:h,message:e,container:c,boxWidth:s?0:o.Z.active.webpage.width,boxHeight:s?0:o.Z.active.webpage.height,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:M,withoutPreloader:s,autoDownloadSize:this.chat.autoDownload.photo})}a.append(r),y.insertBefore(a,Q);break}case"messageMediaDocument":{const n=F.document;if(n.sticker){i.classList.add("sticker"),j=!1,G=!0,n.animated&&i.classList.add("sticker-animated");const e=o.Z.active,t=i.classList.contains("emoji-big"),r=t?e.emojiSticker:n.animated?e.animatedSticker:e.staticSticker;(0,ht.Z)(n,z,r.width,r.height),L.style.minWidth=z.style.width,L.style.minHeight=z.style.height,(0,K.ZP)({doc:n,div:z,middleware:s,lazyLoadQueue:this.lazyLoadQueue,group:this.chat.animationGroup,play:!0,loop:!0,emoji:t?k:void 0,withThumb:!0,loadPromises:M,isOut:ae,noPremium:null===(a=null==F?void 0:F.pFlags)||void 0===a?void 0:a.nopremium}),((0,zi.Z)(n)||t)&&(E||ee)&&this.observer.observe(i,this.stickerEffectObserverCallback)}else if("video"===n.type||"gif"===n.type||"round"===n.type){const t="round"===n.type;if(t&&(G=!0),(t||le)&&(j=!1),de&&i.classList.add("hide-name"),i.classList.add(t?"round":"video"),g&&c&&1!==h.length)i.classList.add("is-album","is-grouped"),qi({messages:p,attachmentDiv:z,middleware:s,isOut:b,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:M,autoDownload:this.chat.autoDownload});else{const a=!T.IS_ANDROID&&!T.IS_APPLE&&!t&&j&&!ie&&!1;a&&i.classList.add("with-media-tail");const r=(0,W.Z)({doc:n,container:z,message:e,boxWidth:o.Z.active.regular.width,boxHeight:o.Z.active.regular.height,withTail:a,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:s,group:this.chat.animationGroup,loadPromises:M,autoDownload:this.chat.autoDownload,searchContext:t?{peerId:this.peerId,inputFilter:{_:"inputMessagesFilterRoundVoice"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0,noInfo:e.mid<0,noAutoplayAttribute:!!F.pFlags.spoiler});F.pFlags.spoiler&&M.push(this.wrapMediaSpoiler({media:n,promise:r,middleware:s,attachmentDiv:z}))}}else{const s=yield function({albumMustBeRenderedFull:e,message:t,bubble:i,messageDiv:s,chat:n,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:d,useSearch:l,sizeType:c,managers:h,fontWeight:u,fontSize:p,richTextFragment:f}){return Yi(this,void 0,void 0,(function*(){let l;const m=e?yield n.getMidsByMid(t.mid):[t.mid],g=m.map(((e,t)=>Yi(this,void 0,void 0,(function*(){const i=yield n.getMessage(e),s=yield(0,Qi.Z)({message:i,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:d,sizeType:c,managers:h,fontWeight:u,fontSize:p}),g=document.createElement("div");g.classList.add("document-container"),g.dataset.mid=""+e,g.dataset.peerId=""+i.peerId;const v=document.createElement("div");if(v.classList.add("document-wrapper"),i.message){const e=document.createElement("div");e.classList.add("document-message"),(0,_.Z)(e,f),v.append(e)}if(m.length>1){const e=document.createElement("div");e.classList.add("document-selection"),g.append(e),g.classList.add("grouped-item"),0===t&&(l=v)}return v.append(s),g.append(v),g})))),v=yield Promise.all(g);return s.append(...v),m.length>1&&i.classList.add("is-multiple-documents","is-grouped"),l}))}({albumMustBeRenderedFull:g,message:e,bubble:i,messageDiv:y,chat:this.chat,loadPromises:M,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,searchContext:"voice"===n.type||"audio"===n.type?{peerId:this.peerId,inputFilter:{_:"voice"===n.type?"inputMessagesFilterRoundVoice":"inputMessagesFilterMusic"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0,sizeType:"documentName",fontSize:d.Z.settings.messagesTextSize,richTextFragment:H});s&&(oe=s);const a=y.lastElementChild.querySelector(".document-message, .document, .audio");a&&a.append(Q),i.classList.remove("is-message-empty"),y.classList.add((["photo","pdf"].includes(n.type)?"document":n.type||"document")+"-message"),t=!0}break}case"messageMediaCall":{const e=F.action,s=document.createElement("div");s.classList.add("bubble-call",e.pFlags.video?"tgico-videocamera":"tgico-phone");const n=e.pFlags.video?"video":"voice";s.dataset.type=n;const a=document.createElement("div");a.classList.add("bubble-call-title"),(0,C.$d)(a,ae?e.pFlags.video?"CallMessageVideoOutgoing":"CallMessageOutgoing":e.pFlags.video?"CallMessageVideoIncoming":"CallMessageIncoming");const o=document.createElement("div");if(o.classList.add("bubble-call-subtitle"),void 0!==e.duration)o.append((0,Ne.Z)(e.duration));else{let t;switch(e.reason._){case"phoneCallDiscardReasonBusy":t="Call.StatusBusy";break;case"phoneCallDiscardReasonMissed":t="Chat.Service.Call.Missed";break;default:t="Chat.Service.Call.Cancelled"}o.classList.add("is-reason"),(0,C.$d)(o,t)}o.classList.add("tgico","arrow-"+(void 0!==e.duration?"green":"red")),s.append(a,o),t=!0,i.classList.remove("is-message-empty"),y.classList.add("call-message"),y.append(s);break}case"messageMediaContact":{const e=F,s=document.createElement("div");s.classList.add("contact"),s.dataset.peerId=""+e.user_id,t=!0;const n=document.createElement("div");n.className="contact-details";const a=document.createElement("div");a.className="contact-name",a.append((0,R.Z)([e.first_name,e.last_name].filter(Boolean).join(" ")));const o=document.createElement("div");o.className="contact-number",o.textContent=e.phone_number?"+"+(0,Ae.u)(e.phone_number).formatted:"Unknown phone number",s.append(n),n.append(a,o);const r=new f.Z;r.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e.user_id.toPeerId()}),r.classList.add("contact-avatar","avatar-54"),s.prepend(r),i.classList.remove("is-message-empty"),y.classList.add("contact-message"),y.append(s);break}case"messageMediaPoll":{i.classList.remove("is-message-empty");const t=function(e,t=d.Z.managers){const i=new ls;return i.message=e,i.managers=t,i.setAttribute("peer-id",""+e.peerId),i.setAttribute("poll-id",e.media.poll.id),i.setAttribute("message-id",""+e.mid),i.render(),i}(e);y.prepend(t),y.classList.add("poll-message");break}case"messageMediaInvoice":{const t=F.pFlags.test,n=F.extended_media,a="messageExtendedMedia"===(null==n?void 0:n._),r="messageExtendedMediaPreview"===(null==n?void 0:n._);let d=a?n.media.photo||n.media.document:F.photo;const l=(0,Pt.Z)(F.total_amount,F.currency);let c,h;if(n){if(r&&(c=document.createElement("span"),c.classList.add("extended-media-buy","tgico-premium_lock"),z.classList.add("is-buy"),(0,C.$d)(c,"Checkout.PayPrice",[l]),void 0!==n.video_duration)){const e=document.createElement("span");e.classList.add("video-time"),e.textContent=(0,ts.Z)(n.video_duration,!1),z.append(e)}}else{c=document.createElement(d?"span":"div");const e=document.createDocumentFragment(),i=(0,C.ag)(F.receipt_msg_id?"PaymentReceipt":t?"PaymentTestInvoice":"PaymentInvoice");i.classList.add("text-uppercase");const s=" ‎",n=document.createElement("span");if(n.classList.add("text-bold"),n.textContent=l+s,e.append(n,i),t&&F.receipt_msg_id){const t=document.createElement("span");t.classList.add("text-uppercase","pre-wrap"),t.append(s+"(Test)"),e.append(t)}(0,_.Z)(c,e)}if(r&&(n.thumb.w=n.w,n.thumb.h=n.h,d={_:"photo",access_hash:"",pFlags:{},date:0,dc_id:0,file_reference:[],id:0,sizes:[n.thumb]}),d){const t=n?o.Z.active.extendedInvoice:o.Z.active.invoice;"document"===d._?((0,W.Z)({doc:d,container:z,withTail:!1,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:s,loadPromises:M,boxWidth:t.width,boxHeight:t.height,group:this.chat.animationGroup,message:e}),i.classList.add("video")):((0,V.Z)({photo:d,container:z,withTail:!1,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:s,loadPromises:M,boxWidth:t.width,boxHeight:t.height,message:a?e:void 0}),i.classList.add("photo")),c&&(n||c.classList.add("video-time"),z.append(c))}else z=void 0;if(r){const{mid:t}=e;this.extendedMediaMessages.add(t),s.onClean((()=>{this.extendedMediaMessages.delete(t)})),this.setExtendedMediaMessagesPollInterval();const{width:i,height:n}=z.style,a=us.Z.create({width:parseInt(i),height:parseInt(n),middleware:s,animationGroup:this.chat.animationGroup});z.append(a.canvas)}n||(h=document.createElement("div"),h.classList.add("bubble-primary-color"),(0,_.Z)(h,(0,R.Z)(F.title)));const u=a?void 0:(0,R.Z)(F.description);y.prepend(...[h,!d&&c,u].filter(Boolean)),u?i.classList.remove("is-message-empty"):j=!1,i.classList.add("is-invoice");break}default:z=void 0,i.classList.remove("is-message-empty"),y.append((0,C.ag)(C.nK),Q),this.log.warn("unrecognized media type:",F._,e)}!t&&z&&L.append(z)}G&&i.classList.add("just-media"),ce&&Q.before(ce);let he="";const ue=e.fromId!==d.Z.myId&&this.chat.isAnyGroup||e.viaBotId||e.pFlags.sponsored;if(ue||se||e.reply_to_mid||Y){let t,s;const n="peerChannel"===(null===(r=e.from_id)||void 0===r?void 0:r._)&&e.fromId===ne,a=!!e.viaBotId,o=se&&!se.from_id;e.viaBotId&&(s=document.createElement("span"),s.innerText="@"+(yield this.managers.appPeersManager.getPeerUsername(e.viaBotId)),s.classList.add("peer-title")),a&&i.classList.add("must-have-name");const c=ne||se;let h,u;if(o?(t=document.createElement("span"),(0,_.Z)(t,(0,R.Z)(se.from_name)),t.classList.add("peer-title"),i.classList.add("hidden-profile")):t=new B.Z({peerId:ne||e.fromId,withPremiumIcon:!c,wrapOptions:Z}).element,l&&e.reply_to_mid&&e.reply_to_mid!==this.chat.threadId&&(!this.chat.isAllMessagesForum||e.reply_to.reply_to_top_id)&&(h=yield re.setReply({chat:this.chat,bubble:i,bubbleContainer:L,message:e})),c)if(this.peerId===d.Z.myId||n||i.classList.add("forwarded"),e.savedFrom&&(he=e.savedFrom,t.dataset.savedFrom=he),u=document.createElement("div"),t.dataset.peerId=""+ne,this.peerId!==d.Z.myId&&this.peerId!==m.hj&&!n||G){const e=[t];if(G){const t=document.createElement("br");t.classList.add("hide-ol"),e.unshift(t)}u.append((0,C.ag)("ForwardedFrom",[e]))}else u.style.color=(0,O.Z)(ne,!1),u.classList.add("colored-name"),u.append(t);else if(!e.viaBotId)if(!G&&ue){u=document.createElement("div"),u.append(t);const i=yield this.managers.appPeersManager.getPeer(e.fromId),s=null==i?void 0:i.pFlags;s&&(s.scam||s.fake)&&u.append((0,lt.Z)(s.scam)),b||(u.style.color=(0,O.Z)(e.fromId,!1),u.classList.add("colored-name")),u.dataset.peerId=""+e.fromId}else i.classList.add("hide-name");if(e.viaBotId){u?u.append(" "):u=document.createElement("div");const e=document.createElement("span");e.append((0,C.ag)("ViaBot")," ",s),e.classList.add("is-via"),u.append(e)}Y&&(G?Y.classList.add("floating-part"):(u||(u=document.createElement("div")),u.append(Y),i.classList.remove("hide-name"))),u?(u.classList.add("name"),G?(oe.append(oe=document.createElement("div")),oe.classList.add("name-with-reply","floating-part")):u.classList.add("floating-part"),oe.append(u),G&&h&&oe.append(h)):G&&h&&h.classList.add("floating-part"),Y&&G&&(z?z.after(Y):this.log.error("no attachment div?",i,e))}else i.classList.add("hide-name");if("pinned"===this.chat.type&&(he=`${this.chat.peerId}_${e.mid}`),te&&te.mid===this.chat.threadId&&i.classList.add("is-thread-starter","is-group-last"),he&&("pinned"===this.chat.type||se.saved_from_msg_id)&&this.peerId!==m.hj){const e=document.createElement("div");e.classList.add("bubble-beside-button","goto-original","tgico-arrow_next"),L.append(e),i.dataset.savedFrom=he,i.classList.add("with-beside-button")}return i.classList.add(ae?"is-out":"is-in"),ie&&(re.renderReplies({bubble:i,bubbleContainer:L,message:te,messageDiv:y,loadPromises:M,lazyLoadQueue:this.lazyLoadQueue})?j=!0:i.classList.add("with-beside-replies")),l&&this.appendReactionsElementToBubble(i,e,u),j&&(i.classList.add("can-have-tail"),L.append(Zs())),P}))}appendReactionsElementToBubble(e,t,i,s){if(this.peerId.isUser(),!(null==i?void 0:i.reactions)||!i.reactions.results.length)return;const n=new st;if(n.init(i,"block",e.middlewareHelper.get()),n.render(s),e.classList.contains("is-message-empty"))e.querySelector(".bubble-content-wrapper").append(n);else{const s=e.querySelector(".message");if(e.classList.contains("is-multiple-documents")){const e=s.lastElementChild;let a=e.querySelector(".document-message"),o=a&&a.querySelector(".time");o||(o=re.setTime({chatType:this.chat.type,message:t,reactionsMessage:i})),n.append(o),a||(a=document.createElement("div"),a.classList.add("document-message"),e.querySelector(".document-wrapper").prepend(a)),a.append(n)}else{const t=Array.from(e.querySelectorAll(".time")).pop();n.append(t),s.append(n)}}}prepareToSaveScroll(e){if(!this.chatInner.parentElement)return{};const t=this.log.bindPrefix("prepareToSaveScroll");t("save");const i=this.createScrollSaver(e);if(i.save(),this.getRenderedLength()&&!this.chat.setPeerPromise){const e=this.getViewportSlice();this.deleteViewportSlice(e,!0)}return{restoreScroll:()=>{t("restore"),i.restore(e),this.onRenderScrollSet(i.getSaved())},scrollSaver:i}}performHistoryResult(e,t){var i;return gs(this,void 0,void 0,(function*(){let s=e.history;s=s.slice(),this.needReflowScroll&&(Ee(this.scrollable.container),this.needReflowScroll=!1);const n=yield Promise.all(s.map((e=>"number"==typeof e?this.chat.getMessage(e):e))),a=[];if(!this.scrollable.loadedAll.bottom||!this.scrollable.loadedAll.top){let t=e.isEnd;if(!t){const e=yield this.chat.getHistoryStorage(),i=e.history.first,n=e.history.last;t={top:!1,bottom:!1,both:!1},!i.isEnd(ge.D.Bottom)||i.length&&!s.includes(i[0])||(t.bottom=!0),!n.isEnd(ge.D.Top)||n.length&&!s.includes(n[n.length-1])||(t.top=!0)}if(!t.bottom&&this.setPeerOptions){const{lastMsgId:e,topMessage:i}=this.setPeerOptions;this.setPeerOptions=void 0,e&&!this.bubbles[i]&&e!==i||(t.bottom=!0)}t.top&&a.push(this.setLoaded("top",!0)),t.bottom&&a.push(this.setLoaded("bottom",!0))}yield Promise.all(a);const o=n.map((e=>e?e.pFlags.local?this.processLocalMessageRender(e):this.safeRenderMessage(e,t):void 0));yield Promise.all(o),yield this.messagesQueuePromise,this.scrollable.loadedAll.top&&this.messagesQueueOnRenderAdditional&&(this.messagesQueueOnRenderAdditional(),null===(i=this.messagesQueueOnRenderAdditional)||void 0===i||i.call(this))}))}onRenderScrollSet(e){const t="has-sticky-dates";if(this.container.classList.contains(t)||this.preloader.detached&&(null!=e||(e={scrollHeight:this.scrollable.scrollHeight,clientHeight:this.scrollable.container.clientHeight}),e.scrollHeight===e.clientHeight))this.willScrollOnLoad=void 0;else{const e=this.getMiddleware(),i=()=>{e()&&this.container.classList.add(t)};this.willScrollOnLoad?i():setTimeout(i,600)}}requestHistory(e,t,i){return"chat"===this.chat.type||"discussion"===this.chat.type?this.managers.acknowledged.appMessagesManager.getHistory(this.peerId,e,t,i,this.chat.threadId):"pinned"===this.chat.type?this.managers.acknowledged.appMessagesManager.getSearch({peerId:this.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:t,backLimit:i}).then((e=>({cached:e.cached,result:Promise.resolve(e.result).then((e=>({history:e.history.map((e=>e.mid))})))}))):"scheduled"===this.chat.type?this.managers.acknowledged.appMessagesManager.getScheduledMessages(this.peerId).then((e=>({cached:e.cached,result:Promise.resolve(e.result).then((e=>({history:e.slice().reverse()})))}))):void 0}animateAsLadder(e,t,i,s,n){return gs(this,void 0,void 0,(function*(){const a=this.log.bindPrefix("ladder");if(this.chat.setPeerPromise&&!this.resolveLadderAnimation)return a.warn("will be delayed"),void(this.resolveLadderAnimation=this.animateAsLadder.bind(this,e,t,i,s,n));if(!Object.keys(this.bubbles).length)return void a.warn("no bubbles");let o,r=(0,ot.Z)(this.bubbles,"desc");i&&t.length&&(r=r.filter((e=>!t.includes(e)))),o=s?n||Math.max(...r):e||Math.max(...r);const d=r.slice(r.findIndex((e=>o>e))),l=i?[]:[o],c=i?[]:r.slice(0,r.findIndex((e=>o>=e))).reverse();me.ZP&&a("targeting mid:",o,n,e,d.map((e=>(0,bt.Z)(e))),c.map((e=>(0,bt.Z)(e))));const h=[];this.chatInner.classList.add("zoom-fading");const u=i?10:40,p=i?0:1,f=(e,t=0)=>{const i=(0,fe.Z)();let s=0;return e.forEach(((n,o)=>{const r=this.bubbles[n];if(!r||this.skippedMids.has(n))return void a.warn("no bubble by mid:",n);s=(o+t||.1)*u;const d=r.lastElementChild,l=[d],c=this.bubbleGroups.getItemByBubble(r);if(c&&c.group.avatar&&c.group.lastItem===c&&l.push(c.group.avatar),l.forEach((e=>{e.classList.add("zoom-fade","can-zoom-fade"),e.style.transitionDelay=s+"ms"})),o===e.length-1){const e=t=>{t.target===d&&(i.resolve(),d.removeEventListener("transitionend",e))};d.addEventListener("transitionend",e)}h.push(...l)})),e.length||i.resolve(),{lastMsDelay:s,animationPromise:i}},m=f(d,p),g=f(l),v=f(c,p),b=[m.animationPromise,g.animationPromise,v.animationPromise],y=[m.lastMsDelay,g.lastMsDelay,v.lastMsDelay];let w;return this.onAnimateLadder&&(yield this.onAnimateLadder()),(0,pe.T2)((()=>{this.setStickyDateManually(),h.forEach((e=>{e.classList.remove("zoom-fade")}))})),(d.length||l.length||c.length)&&(w=Promise.all(b),(0,ue.YW)(w,Math.max(...y)+200).then((()=>{(0,pe.T2)((()=>{h.forEach((e=>{e.style.transitionDelay="",e.classList.remove("can-zoom-fade")})),this.chatInner.classList.remove("zoom-fading")}))}))),w}))}renderEmptyPlaceholder(e,t,i,s){return gs(this,void 0,void 0,(function*(){const i="empty-bubble-placeholder";let n,a;if(t.classList.add(i,i+"-"+e),"group"===e?n=(0,C.ag)("GroupEmptyTitle1"):"saved"===e?n=(0,C.ag)("ChatYourSelfTitle"):"noMessages"===e||"greeting"===e?n=(0,C.ag)("NoMessages"):"noScheduledMessages"===e?n=(0,C.ag)("NoScheduledMessages"):"restricted"===e&&(n=document.createElement("span"),n.innerText=yield this.managers.appPeersManager.getRestrictionReasonText(this.peerId)),n.classList.add("center",i+"-title"),s.push(n),"group"===e)s.push((0,C.ag)("GroupEmptyTitle2")),a=[(0,C.ag)("GroupDescription1"),(0,C.ag)("GroupDescription2"),(0,C.ag)("GroupDescription3"),(0,C.ag)("GroupDescription4")];else if("saved"===e)a=[(0,C.ag)("ChatYourSelfDescription1"),(0,C.ag)("ChatYourSelfDescription2"),(0,C.ag)("ChatYourSelfDescription3"),(0,C.ag)("ChatYourSelfDescription4")];else if("greeting"===e){const e=(0,C.ag)("NoMessagesGreetingsDescription");e.classList.add("center",i+"-subtitle");const t=document.createElement("div");t.classList.add(i+"-sticker");const n=this.getMiddleware();yield this.managers.appStickersManager.getGreetingSticker().then((e=>gs(this,void 0,void 0,(function*(){if(!n())return;const i=[];return yield(0,K.ZP)({doc:e,div:t,middleware:n,lazyLoadQueue:this.lazyLoadQueue,group:this.chat.animationGroup,play:!0,loop:!0,withThumb:!0,loadPromises:i}),(0,S.fc)(t,(e=>{(0,Ce.Z)(e),It.Jo.onMediaClick({target:e.target})})),Promise.all(i)})))),s.push(e,t)}a&&(s.push(...a.map((e=>{const t=document.createElement("span");return t.classList.add(i+"-list-item"),t.append(e),t}))),"group"===e?a.forEach((e=>{const t=document.createElement("span");t.classList.add("tgico-check"),e.prepend(t)})):"saved"===e&&a.forEach((e=>{const t=document.createElement("span");t.classList.add(i+"-list-bullet"),t.innerText="•",e.prepend(t)}))),s.length>1&&t.classList.add("has-description"),s.forEach((e=>e.classList.add(i+"-line")))}))}processLocalMessageRender(e,t,i=this.getMiddleware()){return gs(this,void 0,void 0,(function*(){const s=!!e.pFlags.sponsored,n=(0,Et.Z)(i);return this.safeRenderMessage(e,!s,void 0,!1,(i=>gs(this,void 0,void 0,(function*(){const{bubble:a}=yield n(i);if(!a)return i;a.message=e,a.classList.add("is-group-last","is-group-first");const o=()=>{this.updatePlaceholderPosition===o&&(this.updatePlaceholderPosition=void 0),u[p](a)};s||(a.classList.add("bubble-first"),a.classList.remove("can-have-tail","is-in"));const r=[],l=this.chat.isBot;let c,u=this.container,p="append";if(this.chat.isRestricted)c=this.renderEmptyPlaceholder("restricted",a,e,r);else if(s){let i,s,n,o;a.classList.add("avoid-selection"),a.style.order="999999";const r=this.sponsoredMessage=e.sponsoredMessage,d=(0,D.Z)(r.from_id);r.channel_post?(i="OpenChannelPost",s=(0,yt.Z)(r.channel_post)):r.start_param||l?(i="Chat.Message.ViewBot",n=r.start_param):i=(yield this.managers.appPeersManager.isAnyGroup(d))?"Chat.Message.ViewGroup":"Chat.Message.ViewChannel",o=r.chat_invite?()=>{new Ge(r.chat_invite_hash,r.chat_invite)}:r.chat_invite_hash?()=>{const e={_:Te.JOIN_CHAT,invite:r.chat_invite_hash};this.chat.appImManager.processInternalLink(e)}:()=>{this.chat.appImManager.setInnerPeer({peerId:d,lastMsgId:s,startParam:n})};const c=this.makeViewButton({text:i});this.observer.observe(c,this.viewsObserverCallback),o&&(0,S.fc)(c,o),a.querySelector(".bubble-content").prepend(c),u=this.chatInner,p="append",t=!1}else if(l&&"message"===e._){const e=document.createElement("b");e.append((0,C.ag)("BotInfoTitle")),r.push(e,"\n\n"),u=this.chatInner,p="prepend"}else c=this.chat.isAnyGroup&&(yield n(this.managers.appPeersManager.getPeer(this.peerId))).pFlags.creator?this.renderEmptyPlaceholder("group",a,e,r):"scheduled"===this.chat.type?this.renderEmptyPlaceholder("noScheduledMessages",a,e,r):d.Z.myId===this.peerId?this.renderEmptyPlaceholder("saved",a,e,r):this.peerId.isUser()&&!l&&(yield n(this.chat.canSend()))&&"chat"===this.chat.type?this.renderEmptyPlaceholder("greeting",a,e,r):this.renderEmptyPlaceholder("noMessages",a,e,r);c&&(yield c),r.length&&a.querySelector(".message, .service-msg").prepend(...r);const f=!!this.messagesQueueOnRenderAdditional,m=this.setPeerCached&&!f;if(m){const e=a.firstElementChild;e.classList.add("no-transition"),this.chat.setPeerPromise&&this.chat.setPeerPromise.catch(Qe.Z).finally((()=>{e.classList.remove("no-transition")}))}if(void 0!==t||m||(t=!0),f||t?(this.updatePlaceholderPosition=o,this.onAnimateLadder=()=>{if(this.onAnimateLadder=void 0,!this.messagesQueuePromise)return(0,pe.AD)()}):this.chat.setPeerPromise?this.attachPlaceholderOnRender=()=>{this.attachPlaceholderOnRender=void 0,o()}:this.updatePlaceholderPosition=o,!f&&t){yield n((0,ue.e9)());const t=(0,ot.Z)(this.bubbles);(0,h.Z)(t,e.mid),this.animateAsLadder(e.mid,t,!1,0,0)}return a.middlewareHelper.onDestroy((()=>{this.emptyPlaceholderBubble===a&&(this.emptyPlaceholderBubble=void 0)})),this.emptyPlaceholderBubble=a,i}))))}))}makeViewButton(e){return(0,Ue.Z)("btn-primary btn-primary-transparent bubble-view-button",e)}generateLocalMessageId(e=0){const t=("scheduled"===this.chat.type?-1:0)+e,i=-Math.abs(t);return{id:i,mid:-Math.abs((0,yt.Z)(i))}}generateLocalFirstMessage(e,t,i=0){return gs(this,void 0,void 0,(function*(){const{id:s,mid:n}=this.generateLocalMessageId(i);let a={_:e?"messageService":"message",date:0,id:s,mid:n,peer_id:yield this.managers.appPeersManager.getOutputPeer(this.peerId),pFlags:{local:!0}};return e||(a.message=""),(0,Pe.Z)(a),t&&t(a),a=(yield this.managers.appMessagesManager.saveMessages([a],{storage:new Map}))[0],a.mid=n,a}))}getViewportSlice(){return(0,rt.Z)({overflowElement:this.scrollable.container,selector:".bubbles-date-group .bubble:not(.is-date)",extraSize:2*Math.max(700,xe.Z.height)})}deleteViewportSlice(e,t){const{invisibleTop:i,invisibleBottom:s}=e,n=i.concat(s);if(!n.length)return;i.length&&(this.setLoaded("top",!1),this.getHistoryTopPromise=void 0),s.length&&(this.setLoaded("bottom",!1),this.getHistoryBottomPromise=void 0);const a=n.map((({element:e})=>+e.dataset.mid));let o;t||(o=this.createScrollSaver(!!i.length),o.save()),this.deleteMessagesByIds(a,!1,!0),o?o.restore():i.length&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop)}sliceViewport(e){if(T.IS_SAFARI||this.isHeavyAnimationInProgress&&!e)return;const t=this.getViewportSlice();this.deleteViewportSlice(t)}setLoaded(e,t,i=!0){return gs(this,void 0,void 0,(function*(){if(this.scrollable.loadedAll[e]!==t)return this.log.bindPrefix("setLoaded")("change",e,t),this.scrollable.loadedAll[e]=t,this.scrollable.onScroll(),i?!this.chat.isRestricted&&("bottom"===e&&this.chat.isBroadcast&&this.toggleSponsoredMessage(t),"top"===e&&t&&this.chat.isBot)?this.renderBotPlaceholder():this.checkIfEmptyPlaceholderNeeded():void 0}))}toggleSponsoredMessage(e){return gs(this,void 0,void 0,(function*(){const t=this.log.bindPrefix("sponsored");t("checking");const{mid:i}=this.generateLocalMessageId(1);if(e){const e=this.getMiddleware((()=>this.scrollable.loadedAll.bottom&&this.getSponsoredMessagePromise===i)),i=this.getSponsoredMessagePromise=this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId()).then((i=>gs(this,void 0,void 0,(function*(){if(!e()||"messages.sponsoredMessagesEmpty"===i._)return;const s=i.messages[0];if(!s)return void t("no message");const n=this.generateLocalFirstMessage(!1,(e=>{e.message=s.message,e.from_id=s.from_id,e.entities=s.entities,e.pFlags.sponsored=!0,e.sponsoredMessage=s}),1);return Promise.all([n,this.getHistoryTopPromise,this.messagesQueuePromise]).then((([i])=>{if(e())return t("rendering",i),this.performHistoryResult({history:[i]},!1)}))})))).finally((()=>{this.getSponsoredMessagePromise===i&&(this.getSponsoredMessagePromise=void 0)}))}else t("clearing rendered",i),this.getSponsoredMessagePromise=void 0,this.deleteMessagesByIds([i])}))}renderBotPlaceholder(){return gs(this,void 0,void 0,(function*(){const e=this.log.bindPrefix("bot placeholder"),t=this.getMiddleware(),i=yield this.managers.acknowledged.appProfileManager.getProfile(this.peerId.toUserId());e("getting profile, cached:",i.cached);const s=i.result.then((s=>gs(this,void 0,void 0,(function*(){var n;if(!t())return;if(!(null===(n=s.bot_info)||void 0===n?void 0:n.description))return e.warn("no description"),this.checkIfEmptyPlaceholderNeeded();const a=yield this.generateLocalFirstMessage(!1,(e=>{const t=s.bot_info;e.message=t.description,t.description_document&&(e.media={_:"messageMediaDocument",document:t.description_document,pFlags:{}}),t.description_photo&&(e.media={_:"messageMediaPhoto",photo:t.description_photo,pFlags:{}})}));return t()?(e("rendering"),{renderPromise:this.processLocalMessageRender(a,!i.cached).then((()=>{e("done")}))}):void 0}))));if(i.cached)return s}))}checkIfEmptyPlaceholderNeeded(){return gs(this,void 0,void 0,(function*(){if(this.scrollable.loadedAll.top&&this.scrollable.loadedAll.bottom&&void 0===this.emptyPlaceholderBubble&&(this.chat.isRestricted||!(yield this.chat.getHistoryStorage()).count||Object.keys(this.bubbles).length&&!this.getRenderedLength()||"scheduled"===this.chat.type&&!Object.keys(this.bubbles).length)){this.log("inject empty peer placeholder");const e=yield this.generateLocalFirstMessage(!0);return{renderPromise:this.processLocalMessageRender(e)}}}))}getHistory1(e,t,i,s,n){const a=this.getMiddleware(n?void 0:()=>(t?this.getHistoryTopPromise:this.getHistoryBottomPromise)===r),o=this.getHistory(e,t,i,s,n,a),r=o.then((e=>e&&(e.waitPromise||e.promise)));return t?this.getHistoryTopPromise=r:this.getHistoryBottomPromise=r,r.then((()=>{a()&&(t?this.getHistoryTopPromise=void 0:this.getHistoryBottomPromise=void 0,n||"chat"===this.chat.type&&setTimeout((()=>{t?this.loadMoreHistory(!0,!0):this.loadMoreHistory(!1,!0)}),0))})),o}getHistory(e=0,t=!1,i=!1,s=0,n=!1,a){return gs(this,void 0,void 0,(function*(){const o=this.peerId,r=this.chat.isBroadcast,l=Math.min(30,xe.Z.height/40|0);let c=r?20:Object.keys(this.bubbles).length>0?Math.max(35,l):l;if(void 0!==ws){if(!ws)return{cached:!1,promise:Promise.resolve(),waitPromise:Promise.resolve()};Object.keys(this.bubbles).length>0&&--ws}let h,u=0;if(i&&(u=c,t||(c=0)),s&&!i)if("pinned"===this.chat.type)h=[s];else{const t=(yield this.chat.getHistoryStorage()).history.slice;if(t.length=0;--e){const t=yield this.chat.getMessage(h[e]);if(!(null==t?void 0:t.grouped_id))break;h.splice(e,1)}e=h[h.length-1]||e}}let p,f=yield this.requestHistory(e,c,u);this.log("i vin brehnya",f,e,c,u);const m=(null==h?void 0:h.length)&&!f.cached,g=this.isFirstLoad&&u&&!f.cached||m;m&&(p=f.result,f={cached:!0,result:Promise.resolve({history:h})}),this.isFirstLoad=!1;const v=e=>gs(this,void 0,void 0,(function*(){var t;if(null===(t=e.isEnd)||void 0===t?void 0:t.top){if("discussion"===this.chat.type){const t=yield this.managers.appMessagesManager.getThreadServiceMessageId(this.peerId,this.chat.threadId);t&&e.history.push(t);const i=yield this.chat.getMidsByMid(this.chat.threadId);e.history.push(...i.reverse())}yield this.managers.appProfileManager.getProfileByPeerId(o)}})),b=e=>(0,ue.e9)().then((()=>v(e))).then((()=>(!m&&s&&e.history.unshift(s),this.performHistoryResult(e,t)))),y=e=>{const t=Promise.resolve(e).then((e=>{if(a&&!a())throw Ls;if(!n)return b(e);this.scrollable.onScroll()}),(e=>{throw this.log.error("getHistory error:",e),e}));return t};let w,S;if(f.cached){if(n)return this.scrollable.onScroll(),null;S=!0,w=b(yield f.result)}else S=!1,w=y(f.result);const C=m?y(p):w;if(g&&d.Z.settings.animationsEnabled){let i=m?2:1;this.messagesQueueOnRenderAdditional=()=>{this.log("messagesQueueOnRenderAdditional"),--i||(this.messagesQueueOnRenderAdditional=void 0,this.animateAsLadder(s,h,m,u,e).then((()=>{setTimeout((()=>{this.loadMoreHistory(t,!0)}),0)})))}}else this.messagesQueueOnRenderAdditional=void 0;return n?null:{cached:S,promise:w,waitPromise:C}}))}setUnreadDelimiter(){return gs(this,void 0,void 0,(function*(){if("chat"!==this.chat.type&&"discussion"!==this.chat.type)return;if(this.attachedUnreadBubble)return;const e=yield this.chat.getHistoryMaxId();let t=yield this.managers.appMessagesManager.getReadMaxIdIfUnread(this.peerId,this.chat.threadId);if(t&&(t=Object.keys(this.bubbles).filter((e=>!this.bubbles[e].classList.contains("is-out"))).map((e=>+e)).sort(((e,t)=>e-t)).find((e=>e>t)),t&&this.bubbles[t])){const i=this.bubbles[t];this.firstUnreadBubble&&this.firstUnreadBubble!==i&&(this.firstUnreadBubble.classList.remove("is-first-unread"),this.firstUnreadBubble=null),t!==e&&i.classList.add("is-first-unread"),this.firstUnreadBubble=i,this.attachedUnreadBubble=!0}}))}deleteEmptyDateGroups(){const e=this.stickyIntersector?Cs:1;let t=!1;for(const i in this.dateMessages){const s=this.dateMessages[i];s.container.childElementCount===e&&(s.container.remove(),this.stickyIntersector&&this.stickyIntersector.unobserve(s.container,s.div),delete this.dateMessages[i],t=!0)}t&&(Object.keys(this.dateMessages).length||this.container.classList.remove("has-groups"),this.checkIfEmptyPlaceholderNeeded(),this.setStickyDateManually())}}function Zs(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttributeNS(null,"viewBox","0 0 11 20"),e.setAttributeNS(null,"width","11"),e.setAttributeNS(null,"height","20"),e.classList.add("bubble-tail");const t=document.createElementNS("http://www.w3.org/2000/svg","use");return t.setAttributeNS(null,"href","#message-tail-filled"),e.append(t),e}var ks=i(3003),Ts=i(5128),xs=i(8127);class As{constructor(e,t,i,s){this.peerId=e,this.mid=t,this.unpin=i,this.onConfirm=s,this.construct()}construct(){return e=this,t=void 0,s=function*(){const{peerId:e,mid:t,unpin:i,onConfirm:s}=this;let n,a,o;const r=[],l=[],c=w.Z.MANAGERS,h=yield c.appPeersManager.canPinMessage(e),u=(n,a,o)=>{setTimeout((()=>{let n;n=i&&!t?h?c.appMessagesManager.unpinAllMessages(e):c.appMessagesManager.hidePinnedMessages(e):c.appMessagesManager.updatePinnedMessage(e,t,i,o,a),s&&n.then(s)}),300)};if(i){let i="UnpinMessage";t?(n="UnpinMessageAlertTitle",a="Chat.Confirm.Unpin"):h?(n="Popup.Unpin.AllTitle",a="Chat.UnpinAllMessagesConfirmation",o=[""+((yield c.appMessagesManager.getPinnedMessagesCount(e))||1)]):(n="Popup.Unpin.HideTitle",a="Popup.Unpin.HideDescription",i="Popup.Unpin.Hide"),r.push({langKey:i,isDanger:!0,callback:u})}else{n="PinMessageAlertTitle";const t="PinMessage";e.isAnyChat()?(r.push({langKey:t,callback:e=>u(0,!1,!e.size)}),(yield c.appChatsManager.isBroadcast(e.toChatId()))?a="PinMessageAlertChannel":(a="PinMessageAlert",l.push({text:"PinNotify",checked:!0}))):(a="PinMessageAlertChat",e===d.Z.myId?r.push({langKey:t,callback:u}):(r.push({langKey:t,callback:e=>u(0,!e.size)}),l.push({text:"PinAlsoFor",textArgs:[yield(0,Vt.Z)({peerId:e})],checked:!0})))}(0,w.x)(r),new xs.Z("popup-delete-chat",{peerId:e,titleLangKey:n,descriptionLangKey:a,descriptionLangArgs:o,buttons:r,checkboxes:l}).show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var _s=i(1962);function Fs(e=window.getSelection()){if(!(null==e?void 0:e.rangeCount))return!0;const t=e.getRangeAt(0);return!(!t.collapsed&&t.START_TO_END)}var Ds=i(2312),Rs=i(1447),Bs=i(671),Ns=i(3174);function Os(e,t,i){return d.Z.managers.appStickersManager.preloadAnimatedEmojiSticker(e).then((({doc:s})=>{if(s)return Ds.Z.downloadMedia({media:s}).then((n=>{return a=this,r=void 0,l=function*(){const a=o.Z.active.emojiSticker,r=(0,Bs.tB)(e),d=yield Rs.Z.loadAnimationWorker({container:void 0,animationData:n,width:null!=t?t:a.width,height:null!=i?i:a.height,name:"doc"+s.id,autoplay:!1,loop:!1,toneIndex:r},"none");d.addEventListener("firstFrame",(()=>{(0,Ns.O)(s,d.canvas[0],r),d.remove()}),{once:!0})},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(a,r||[])).next())}));var a,r,d,l}))}))}var Us=i(5772);class Hs extends xs.Z{constructor(e,t,i,s){super("popup-report-messages-confirm",{noTitle:!0,descriptionLangKey:"ReportInfo",buttons:[{langKey:"ReportChat",callback:()=>{a.isValid()&&(s&&s(),this.managers.appMessagesManager.reportMessages(e,t,i,a.value).then((e=>{e&&(0,ye.bC)({langPackKey:"ReportSentInfo"})})))}}],body:!0});const n=document.createElement("div");(0,Us.Z)({div:n,emoji:Hs.STICKER_EMOJI,width:100,height:100}).then((({render:e})=>e)).finally((()=>{this.show()})),this.header.append(n);const a=new L.ZP({label:"ReportHint",maxLength:512,placeholder:"ReportChatDescription"});a.input.addEventListener("input",(()=>{this.buttons[0].element.toggleAttribute("disabled",!a.isValid())})),this.body.append(a.container)}}Hs.STICKER_EMOJI="👮‍♀️";class zs extends xs.Z{constructor(e,t,i){super("popup-report-messages",{titleLangKey:"ChatTitle.ReportMessages",buttons:[],body:!0}),t=t.slice();const s=[["ReportChatSpam","inputReportReasonSpam"],["ReportChatViolence","inputReportReasonViolence"],["ReportChatChild","inputReportReasonChildAbuse"],["ReportChatPornography","inputReportReasonPornography"],["ReportChatOther","inputReportReasonOther"],["ReportChatPersonalDetails","inputReportReasonPersonalDetails"],["ReportChatIllegalDrugs","inputReportReasonIllegalDrugs"]];s.forEach((e=>{const t=(0,Ue.Z)("btn-primary btn-transparent",{text:e[0]});this.body.append(t)}));const n=Os(Hs.STICKER_EMOJI);(0,S.fc)(this.body,(a=>{const o=(0,ve.Z)(a.target,"btn-primary"),r=s[(0,Ie.Z)(o)][1];n.then((()=>{this.hide(),new Hs(e,t,r,i)}))}),{listenerSetter:this.listenerSetter}),this.buttonsEl.style.marginTop=".5rem",this.show()}}class js extends xs.Z{constructor(){super("popup-sponsored",{titleLangKey:"Chat.Message.Sponsored.What",descriptionLangKey:"Chat.Message.Ad.Text",descriptionLangArgs:[(0,C.ag)("Chat.Message.Sponsored.Link")],buttons:[{langKey:"OK",isCancel:!0},{langKey:"Chat.Message.Ad.ReadMore",callback:()=>{window.open(C.ZP.format("Chat.Message.Sponsored.Link",!0))},isCancel:!0}],scrollable:!0}),this.scrollable.append(this.description),this.show()}}var Gs=i(6008),Vs=i(8936),Ks=i(3061),Ws=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class $s extends w.Z{constructor(e){super("popup-reacted-list",{closable:!0,overlayClosable:!0,body:!0}),this.message=e,this.init()}init(){return Ws(this,void 0,void 0,(function*(){const e=this.middlewareHelper.get(),t=yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message);if(!e())return;const i=yield this.managers.appMessagesManager.canViewMessageReadParticipants(t);if(!e())return;const s=new st,n=Object.assign(Object.assign({},t),{mid:0,id:0,reactions:Object.assign(Object.assign({_:"messageReactions",results:[]},t.reactions),{pFlags:{},recent_reactions:[]})});n.reactions.results=n.reactions.results.map((e=>Object.assign(Object.assign({},e),{chosen_order:void 0,pFlags:{}}))),s.init(n,"block",this.middlewareHelper.get()),s.render(),s.classList.add("no-stripe"),s.classList.remove("has-no-reactions"),s.append(this.btnClose),this.header.append(s);const a=document.createElement("div");a.classList.add("tabs-container"),a.dataset.animation="tabs";const o=new Map;let r=!1;if(n.reactions.results.length){const e=this.createFakeReaction("reactions",n.reactions.results.reduce(((e,t)=>e+t.count),0));s.prepend(e),n.reactions.results.unshift(e.reactionCount),r=!0}let d=!1;if(i)try{const i=yield this.managers.appMessagesManager.getMessageReadParticipants(t.peerId,t.mid);if(!e())return;if(!i.length)throw"";const a=this.createFakeReaction("checks",i.length);s.prepend(a),n.reactions.results.unshift(a.reactionCount),d=!0}catch(e){}n.reactions.results.forEach((i=>{const s=new Z.ZP(void 0);s.container.classList.add("tabs-tab");const n=new Ei.Z({noShadow:!0,noDelimiter:!0}),r=Ji.default.createChatList({dialogSize:72});Ji.default.setListClickListener(r,(()=>{this.hide()}),void 0,!1,!0),n.content.append(r),s.container.append(n.container);const d="checks"!==i.reaction,l="checks"===i.reaction;["checks","reactions"].includes(i.reaction)&&(i.reaction=void 0);const c=(0,qe.C)(24,24);let h;const u=new Vs.Z({scrollable:s,getPromise:()=>Ws(this,void 0,void 0,(function*(){const s=yield this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(t,void 0,i.reaction,h,d,l);return h=s.nextOffset,yield Promise.all(s.combined.map((({peerId:t,reaction:i})=>Ws(this,void 0,void 0,(function*(){const{dom:s}=Ji.default.addDialogNew({peerId:t,autonomous:!0,container:r,avatarSize:"abitbigger",rippleEnabled:!1,meAsSaved:!1});if(i){const t=document.createElement("div");if(t.classList.add("reacted-list-reaction-icon"),"reactionEmoji"===i._){const s=yield this.managers.appReactionsManager.getReactionCached(i.emoticon);(0,K.ZP)({doc:s.static_icon,div:t,width:24,height:24,middleware:e})}else"reactionCustomEmoji"===i._&&t.append((0,We.Z)({docIds:[i.document_id],customEmojiSize:c,middleware:e}));s.listEl.append(t)}(0,U.Z)(s.lastMessageSpan,(0,Ks.Z)(yield this.managers.appUsersManager.getUser(t.toUserId())))}))))),!h}))});o.set(s.container,u),a.append(s.container)})),this.body.append(a);const l=(0,Gs.X)(s,a,((e,t)=>{if(e===s.childElementCount-1)return!1;const i=s.children[e],n=l.prevId();-1!==n&&s.children[n].setIsChosen(!1),i.setIsChosen(!0),o.get(t).load()}),void 0,void 0,void 0,this.listenerSetter);l(0,!1),this.show()}))}createFakeReaction(e,t){const i=new Je;i.init("block",this.middlewareHelper.get()),i.reactionCount={_:"reactionCount",count:t,reaction:e},i.setCanRenderAvatars(!1),i.renderCounter();const s=document.createElement("div");return s.classList.add("reaction-counter","reaction-sticker-icon","tgico-"+e),i.prepend(s),i}}const qs="btn-menu-reactions",Qs=qs+"-reaction",Ys=!T.IS_SAFARI;class Xs{constructor(e,t,i){this.managers=e,this.type=t,this.onScroll=()=>{this.reactionsMap.forEach(((e,t)=>{this.onScrollProcessItem(t,e)}))},this.onMouseMove=e=>{var t;const i=(0,ve.Z)(e.target,Qs);if(!i)return;const s=this.reactionsMap.get(i);if(!s)return;if(!(null===(t=s.appear)||void 0===t?void 0:t.paused))return;const n=s.select;n&&n.paused&&(n.autoplay=!0,n.restart())};const n=this.widthContainer=document.createElement("div");n.classList.add(qs+"-container"),n.classList.add(qs+"-container-"+t);const a=this.container=document.createElement("div");a.classList.add(qs);const o=this.scrollable="vertical"===t?new Z.ZP(void 0):new Z.v7(void 0);a.append(o.container),o.onAdditionalScroll=this.onScroll,o.setListeners(),o.container.classList.add("no-scrollbar"),this.reactionsMap=new Map,this.animationGroup=`CHAT-MENU-REACTIONS-${Date.now()}`,s.Z.setOverrideIdleGroup(this.animationGroup,!0),c.Z||a.addEventListener("mousemove",this.onMouseMove),(0,S.fc)(a,(e=>{const t=(0,ve.Z)(e.target,Qs);if(!t)return;const i=this.reactionsMap.get(t);i&&this.managers.appReactionsManager.sendReaction(this.message,i.reaction)})),n.append(a),this.middleware=null!=i?i:(0,Se.k)()}init(e){this.message=e;const t=this.middleware.get(),i=this.managers.appReactionsManager.getAvailableReactionsByMessage(e);(0,Ke.Z)(i,(e=>{if(!t()||!e.length)return;e.forEach((e=>{e.pFlags.premium&&!d.Z.premium||this.renderReaction(e)}));const s=()=>{this.container.classList.add("is-visible")};i instanceof Promise?(0,pe.T2)(s):s()}))}cleanup(){this.middleware.clean(),this.scrollable.removeListeners(),this.reactionsMap.clear(),s.Z.setOverrideIdleGroup(this.animationGroup,!1),s.Z.checkAnimations(!0,this.animationGroup,!0)}canUseAnimations(){return d.Z.settings.animationsEnabled&&!T.IS_MOBILE}renderReaction(e){const t=document.createElement("div");t.classList.add(Qs);const i=document.createElement("div");i.classList.add(Qs+"-scale");const s=document.createElement("div");let n;s.classList.add(Qs+"-appear"),this.canUseAnimations()&&(n=document.createElement("div"),n.classList.add(Qs+"-select","hide"));const a={selectWrapper:n,appearWrapper:s,reaction:{_:"reactionEmoji",emoticon:e.reaction}};this.reactionsMap.set(t,a);const o=this.middleware.get(),r=26*(c.Z?1:1.25),d={width:r,height:r,skipRatio:1,needFadeIn:!1,withThumb:!1,group:this.animationGroup,middleware:o};if(this.canUseAnimations()){let t=!0;(0,K.ZP)(Object.assign({doc:e.appear_animation,div:s,play:!0},d)).then((({render:e})=>e)).then((e=>{(0,Pe.Z)(e),a.appear=e,e.addEventListener("enterFrame",(o=>{e.maxFrame===o&&i.then((e=>{(0,Pe.Z)(e),s.classList.add("hide"),n.classList.remove("hide"),t&&(a.select=e,t=!1)}),Qe.Z)}))}),Qe.Z);const i=(0,K.ZP)(Object.assign({doc:e.select_animation,div:n},d)).then((({render:e})=>e)).then((e=>((0,Pe.Z)(e),Rs.Z.waitForFirstFrame(e)))).catch(Qe.Z)}else delete d.needFadeIn,delete d.withThumb,(0,K.ZP)(Object.assign({doc:e.static_icon,div:s},d));i.append(s),n&&i.append(n),t.append(i),this.scrollable.append(t)}onScrollProcessItem(e,t){const i=e.firstElementChild,s=(0,He.Z)(e,this.scrollable.container);let n;if(s)if(s.overflow.left||s.overflow.right){const e=Math.abs(s.rect.left-s.rect.right);n="scale("+Math.min(Math.pow(e,2)/Math.pow(34,2),1)+")"}else n="";else{if(!t.appearWrapper.classList.contains("hide")||!t.appear)return;t.select&&t.select.stop(),t.appear.stop(),t.appear.autoplay=!0,t.appearWrapper.classList.remove("hide"),t.selectWrapper.classList.add("hide"),n=""}Ys&&(i.style.transform=n)}}var Js=i(1483),en=i(2353),tn=i(6690),sn=i(3709),nn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class an{constructor(e,t){this.chat=e,this.managers=t,this.onContextMenu=e=>{let t,i;try{i=(0,ve.Z)(e.target,"bubble-content-wrapper"),t=i?i.parentElement:(0,ve.Z)(e.target,"bubble")}catch(e){}if(!t||t.classList.contains("bubble-first"))return;let s=this.element;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),s&&s.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0);let n=+t.dataset.mid;n&&(()=>{nn(this,void 0,void 0,(function*(){const a=this.isSponsored=n<0;this.isSelectable=this.chat.selection.canSelectBubble(t),this.peerId=this.chat.peerId,this.target=e.target,this.isTextSelected=!Fs(),this.isAnchorTarget="A"===this.target.tagName&&("_blank"===this.target.target||this.target.classList.contains("anchor-url")),this.isUsernameTarget="A"===this.target.tagName&&this.target.classList.contains("mention");const o=yield this.chat.getMidsByMid(n);if(this.chat.selection.isSelecting&&!i){if(a)return;if(o.length>1){const e=this.chat.selection.isMidSelected(this.peerId,n)?n:o.find((e=>this.chat.selection.isMidSelected(this.peerId,e)));e&&(n=e)}}this.isOverBubble=!!i;const r=(0,ve.Z)(this.target,"grouped-item");this.isTargetAGroupedItem=!!r,this.mid=r?+r.dataset.mid:n,this.isSelected=this.chat.selection.isMidSelected(this.peerId,this.mid),this.message=t.message||(yield this.chat.getMessage(this.mid)),this.albumMessages=this.message.grouped_id?yield this.managers.appMessagesManager.getMessagesByAlbum(this.message.grouped_id):void 0,this.noForwards=!a&&!(yield this.managers.appMessagesManager.canForward(this.message)),this.viewerPeerId=void 0,this.canOpenReactedList=void 0,this.linkToMessage=yield this.getUrlToMessage(),this.selectedMessagesText=yield this.getSelectedMessagesText();const d=yield this.init();if(!d)return;s=d.element;const{cleanup:l,destroy:c,menuPadding:h,reactionsMenu:u,reactionsMenuPosition:p}=d;let f=!1;if(u){const e="is-visible";if(f=u.container.classList.contains(e),f&&u.container.classList.remove(e),"horizontal"===p){const e=s.offsetWidth,t=(e-8)/34%1,i=.65;if(t{u&&u.container.classList.remove("is-visible"),this.mid=0,this.peerId=void 0,this.target=null,this.viewerPeerId=void 0,this.canOpenReactedList=void 0,l(),setTimeout((()=>{c()}),300)})),f&&u.container.classList.add("is-visible")}))})()},this.onSendScheduledClick=()=>nn(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,S.tH)(this.chat.selection.selectionSendNowBtn):new _s.Z(this.peerId,yield this.chat.getMidsByMid(this.mid))})),this.onReplyClick=()=>{this.chat.input.initMessageReply(this.mid)},this.onFaveStickerClick=e=>{const t=this.message.media.document.id;this.managers.appStickersManager.faveSticker(t,e)},this.onEditClick=()=>{this.chat.input.initMessageEditing(this.mid)},this.onCopyClick=()=>nn(this,void 0,void 0,(function*(){Fs()?(0,ct.T)(this.selectedMessagesText):document.execCommand("copy")})),this.onCopyAnchorLinkClick=()=>{(0,ct.T)(this.target.href)},this.onCopyLinkClick=()=>{const{url:e,isPrivate:t}=this.linkToMessage,i=t?"LinkCopiedPrivateInfo":"LinkCopied";(0,ye.Am)(C.ZP.format(i,!0)),(0,ct.T)(e)},this.onPinClick=()=>{new As(this.peerId,this.mid)},this.onUnpinClick=()=>{new As(this.peerId,this.mid,!0)},this.onRetractVote=()=>{this.managers.appPollsManager.sendVote(this.message,[])},this.onStopPoll=()=>{this.managers.appPollsManager.stopPoll(this.message)},this.onForwardClick=()=>nn(this,void 0,void 0,(function*(){if(this.chat.selection.isSelecting)(0,S.tH)(this.chat.selection.selectionForwardBtn);else{const e=this.peerId,t=this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid);new I.Z({[e]:t})}})),this.onSelectClick=()=>{this.chat.selection.toggleByElement((0,ve.Z)(this.target,"grouped-item")||(0,ve.Z)(this.target,"bubble"))},this.onClearSelectionClick=()=>{this.chat.selection.cancelSelection()},this.onDeleteClick=()=>nn(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,S.tH)(this.chat.selection.selectionDeleteBtn):new Ts.Z(this.peerId,this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid),this.chat.type)})),this.listenerSetter=new le.Z,this.attachListenerSetter=new le.Z,this.middleware=(0,Se.k)()}attachTo(e){this.attachListenerSetter.removeAll(),c.Z?(0,S.fc)(e,(e=>{this.chat.selection.isSelecting||(this.chat.log("touchend",e),!e.target.closest([".name",".peer-title",".reply",".document","audio-element","avatar-element","a",".bubble-beside-button","replies-element","[data-saved-from]:not(.bubble)","poll-element",".attachment",".reply-markup-button"].join(", "))&&((0,Ce.Z)(e),this.onContextMenu(e)))}),{listenerSetter:this.attachListenerSetter}):(0,Ct.E)(e,this.onContextMenu,this.attachListenerSetter)}cleanup(){this.listenerSetter.removeAll(),this.reactionsMenu&&this.reactionsMenu.cleanup(),this.middleware.clean()}destroy(){this.cleanup(),this.attachListenerSetter.removeAll()}filterButtons(e){return nn(this,void 0,void 0,(function*(){return this.isSponsored?e.filter((e=>e.isSponsored)):(0,en.Z)(e,(e=>nn(this,void 0,void 0,(function*(){let t;return this.chat.selection.isSelecting&&!e.withSelection?t=!1:(this.isOverBubble||c.Z,t=yield e.verify()),!!t}))))}))}setButtons(){const e=e=>nn(this,void 0,void 0,(function*(){var t;const i=null===(t=this.message.media)||void 0===t?void 0:t.document;if(!(null==i?void 0:i.sticker))return!1;const s=yield this.managers.acknowledged.appStickersManager.getFavedStickersStickers();if(!s.cached)return!1;const n=(yield s.result).some((e=>e.id===i.id));return e?!n:n}));this.buttons=[{icon:"send2",text:"MessageScheduleSend",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&!this.message.pFlags.is_outgoing},{icon:"send2",text:"Message.Context.Selection.SendNow",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&this.isSelected&&!this.chat.selection.selectionSendNowBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"schedule",text:"MessageScheduleEditTime",onClick:()=>{this.chat.input.scheduleSending((()=>{(0,Pe.Z)(this.message),this.managers.appMessagesManager.editMessage(this.message,this.message.message,{scheduleDate:this.chat.input.scheduleDate,entities:this.message.entities}),this.chat.input.onMessageSent(!1,!1)}),new Date(1e3*this.message.date))},verify:()=>"scheduled"===this.chat.type},{icon:"reply",text:"Reply",onClick:this.onReplyClick,verify:()=>nn(this,void 0,void 0,(function*(){return(yield this.chat.canSend())&&!this.message.pFlags.is_outgoing&&!!this.chat.input.messageInput&&"scheduled"!==this.chat.type}))},{icon:"favourites",text:"AddToFavorites",onClick:this.onFaveStickerClick.bind(this,!1),verify:()=>e(!0)},{icon:"favourites",text:"DeleteFromFavorites",onClick:this.onFaveStickerClick.bind(this,!0),verify:()=>e(!1)},{icon:"edit",text:"Edit",onClick:this.onEditClick,verify:()=>nn(this,void 0,void 0,(function*(){return(yield this.managers.appMessagesManager.canEditMessage(this.message,"text"))&&!!this.chat.input.messageInput}))},{icon:"copy",text:"Copy",onClick:this.onCopyClick,verify:()=>!(this.noForwards||!this.message.message||this.isTextSelected||this.isAnchorTarget&&this.message.message===this.target.innerText)},{icon:"copy",text:"Chat.CopySelectedText",onClick:this.onCopyClick,verify:()=>!this.noForwards&&!!this.message.message&&this.isTextSelected},{icon:"copy",text:"Message.Context.Selection.Copy",onClick:this.onCopyClick,verify:()=>nn(this,void 0,void 0,(function*(){if(!this.isSelected||this.noForwards)return!1;for(const[e,t]of this.chat.selection.selectedMids){const i=`${e}_${"scheduled"===this.chat.type?"scheduled":"history"}`;for(const e of t)if((yield this.managers.appMessagesManager.getMessageFromStorage(i,e)).message)return!0}return!1})),notDirect:()=>!0,withSelection:!0},{icon:"copy",text:"CopyLink",onClick:this.onCopyAnchorLinkClick,verify:()=>this.isAnchorTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Username",onClick:()=>{(0,ct.T)(this.target.innerHTML)},verify:()=>this.isUsernameTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Hashtag",onClick:()=>{(0,ct.T)(this.target.innerHTML)},verify:()=>this.target.classList.contains("anchor-hashtag"),withSelection:!0},{icon:"link",text:"MessageContext.CopyMessageLink1",onClick:this.onCopyLinkClick,verify:()=>nn(this,void 0,void 0,(function*(){return(yield this.managers.appPeersManager.isChannel(this.peerId))&&!this.message.pFlags.is_outgoing}))},{icon:"pin",text:"Message.Context.Pin",onClick:this.onPinClick,verify:()=>nn(this,void 0,void 0,(function*(){return!this.message.pFlags.is_outgoing&&"messageService"!==this.message._&&!this.message.pFlags.pinned&&(yield this.managers.appPeersManager.canPinMessage(this.peerId))&&"scheduled"!==this.chat.type}))},{icon:"unpin",text:"Message.Context.Unpin",onClick:this.onUnpinClick,verify:()=>nn(this,void 0,void 0,(function*(){return this.message.pFlags.pinned&&(yield this.managers.appPeersManager.canPinMessage(this.peerId))}))},{icon:"download",text:"MediaViewer.Context.Download",onClick:()=>{Ds.Z.downloadToDisc({media:(0,vt.Z)(this.message)})},verify:()=>{var e,t;if(!(0,sn.Z)(this.message)||this.noForwards)return!1;let i=!1;if(null===(e=this.message.media)||void 0===e?void 0:e.photo)i=!0;else{if(!(null===(t=this.message.media)||void 0===t?void 0:t.document))return!1;i=!0}let s=!!c.Z;return i&&(s||(s=!!((0,ve.Z)(this.target,"document")||(0,ve.Z)(this.target,"audio")||(0,ve.Z)(this.target,"media-sticker-wrapper")||(0,ve.Z)(this.target,"media-photo")||(0,ve.Z)(this.target,"media-video")))),i&&s}},{icon:"checkretract",text:"Chat.Poll.Unvote",onClick:this.onRetractVote,verify:()=>{var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return t&&t.chosenIndexes.length&&!t.pFlags.closed&&!t.pFlags.quiz}},{icon:"stop",text:"Chat.Poll.Stop",onClick:this.onStopPoll,verify:()=>nn(this,void 0,void 0,(function*(){var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return(yield this.managers.appMessagesManager.canEditMessage(this.message,"poll"))&&t&&!t.pFlags.closed&&!this.message.pFlags.is_outgoing}))},{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>!(this.noForwards||"scheduled"===this.chat.type||this.message.pFlags.is_outgoing&&this.message.fromId!==m.yF||"messageService"===this.message._)},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.chat.selection.selectionForwardBtn&&this.isSelected&&!this.chat.selection.selectionForwardBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"flag",text:"ReportChat",onClick:()=>{new zs(this.peerId,[this.mid])},verify:()=>nn(this,void 0,void 0,(function*(){return!this.message.pFlags.out&&"message"===this.message._&&!this.message.pFlags.is_outgoing&&(yield this.managers.appPeersManager.isChannel(this.peerId))})),notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick,verify:()=>!this.message.action&&!this.isSelected&&this.isSelectable,notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,notDirect:()=>!0,withSelection:!0},{onClick:()=>{if(this.viewerPeerId)this.chat.appImManager.setInnerPeer({peerId:this.viewerPeerId});else{if(!this.canOpenReactedList)return!1;new $s(this.message)}},verify:()=>nn(this,void 0,void 0,(function*(){var e,t;return!this.peerId.isUser()&&(!!(null===(t=null===(e=this.message.reactions)||void 0===e?void 0:e.recent_reactions)||void 0===t?void 0:t.length)||(yield this.managers.appMessagesManager.canViewMessageReadParticipants(this.message)))})),notDirect:()=>!0,localName:"views"},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>nn(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canDeleteMessage(this.message)}))},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.chat.selection.selectionDeleteBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"info",text:"Chat.Message.Sponsored.What",onClick:()=>{new js},verify:()=>!1,isSponsored:!0},{text:"Loading",onClick:()=>{this.emojiInputsPromise.then((e=>{new M.Z(e,!0).show()}))},verify:()=>!!this.getUniqueCustomEmojisFromMessage().length,notDirect:()=>!0,localName:"emojis"}]}getUniqueCustomEmojisFromMessage(){const e=[],t=this.albumMessages&&(0,Mt.Z)(this.albumMessages)||this.message,i=t.entities;if(i){const t=i.filter((e=>"messageEntityCustomEmoji"===e._));e.push(...t.map((e=>e.document_id)))}const s=t.reactions;if(s){const t=s.results.filter((e=>"reactionCustomEmoji"===e.reaction._));e.push(...t.map((e=>e.reaction.document_id)))}return(0,tn.Z)(e)}init(){return nn(this,void 0,void 0,(function*(){this.cleanup(),this.setButtons();const e=yield this.filterButtons(this.buttons);if(!e.length)return;const t=this.element=yield(0,ks.Z)({buttons:e,listenerSetter:this.listenerSetter});t.id="bubble-contextmenu",t.classList.add("contextmenu");const i=e.find((e=>"views"===e.localName));if(i){const e=this.message.reactions,t=null==e?void 0:e.recent_reactions,s=!!(null==t?void 0:t.length),n=(yield this.managers.appMessagesManager.canViewMessageReadParticipants(this.message))?(yield this.managers.appPeersManager.getPeer(this.peerId)).participants_count:void 0,a=e?e.results.reduce(((e,t)=>e+t.count),0):void 0;i.element.classList.add("tgico-"+(s?"reactions":"checks"));const o=new C.ZP.IntlElement({key:s?void 0===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted":"NobodyViewed",args:s?void 0===n?[a]:[n,n]:void 0,element:i.textElement});let r;r=s?void 0===n?(0,C.ag)("Chat.Context.ReactedFast",[a]):(0,C.ag)(t.length===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted",[t.length,n]):(0,C.ag)("Loading"),r.classList.add("btn-menu-item-text-fake"),i.element.append(r);const d=22,l=3,c=1.125;o.element.style.visibility="hidden",o.element.style.paddingRight=s?c*Math.min(l,t.length)+"rem":"1rem";const h=this.middleware.get();this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message).then((e=>{if(!h())return;r&&r.remove();const a=e.combined,u=void 0===n?e.reactionsCount:s?a.filter((e=>e.reaction)).length:a.length;let p;if(1===a.length)p=new B.Z({peerId:a[0].peerId,onlyFirstName:!0,dialog:!1}).element,(!s||e.readParticipants.length<=1)&&(this.viewerPeerId=a[0].peerId);else if(s){const e=u===a.length||void 0===n;p=(0,C.ag)(e?"Chat.Context.ReactedFast":"Chat.Context.Reacted",e?[u]:[u,a.length])}else a.length?p=(0,C.ag)("MessageSeen",[a.length]):o.element.style.visibility="";if(p&&(p.style.paddingRight=c*Math.min(l,u)+"rem",p.classList.add("btn-menu-item-text-fake"),i.element.append(p)),a.length){const e=new ie({avatarSize:d});e.render(t?t.map((e=>(0,D.Z)(e.peer_id))):a.map((e=>e.peerId))),i.element.append(e.container),this.canOpenReactedList=!0}}))}let s,n,a;if(!("message"!==this.message._||this.chat.selection.isSelecting||this.message.pFlags.is_outgoing||this.message.pFlags.is_scheduled||this.message.pFlags.local)){a=T.IS_APPLE||c.Z?"horizontal":"vertical",n=this.reactionsMenu=new Xs(this.managers,a,this.middleware),n.init(yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message));const e=44,t=0;s="vertical"===a?{top:t,left:e}:{top:e,right:0,left:t}}const o=e.find((e=>"emojis"===e.localName));if(o){o.element.classList.add("is-multiline"),o.element.parentElement.insertBefore(document.createElement("hr"),o.element);const e=()=>{null!=s||(s={}),s.bottom=24},t=this.getUniqueCustomEmojisFromMessage(),i=this.emojiInputsPromise=(0,fe.Z)();yield this.managers.appEmojiManager.getCachedCustomEmojiDocuments(t).then((s=>nn(this,void 0,void 0,(function*(){const n=t=>nn(this,void 0,void 0,(function*(){const s=new Map;t.forEach((e=>{e&&!s.has(e.stickerSetInput.id)&&s.set(e.stickerSetInput.id,e.stickerSetInput)}));const n=[...s.values()];if(i.resolve(n),1===s.size){const t=yield this.managers.acknowledged.appStickersManager.getStickerSet(n[0]),i=t.result.then((e=>{const t=(0,C.ag)("MessageContainsEmojiPack",[(0,R.Z)(e.set.title)]);(0,U.Z)(o.textElement,t)}));return t.cached?i:void e()}(0,U.Z)(o.textElement,(0,C.ag)("MessageContainsEmojiPacks",[s.size]))}));if(!s.some((e=>!e)))return n(s);e(),this.managers.appEmojiManager.getCustomEmojiDocuments(t).then(n)}))))}return this.chat.container.append(t),{element:t,cleanup:()=>{this.cleanup(),n&&n.cleanup()},destroy:()=>{t.remove(),n&&n.widthContainer.remove()},menuPadding:s,reactionsMenu:n,reactionsMenuPosition:a}}))}getUrlToMessage(){return nn(this,void 0,void 0,(function*(){if(this.peerId.isUser())return;let e;const{peerId:t,mid:i}=this,s=this.chat.threadId;"discussion"===this.chat.type&&(e=yield this.managers.appMessagesManager.getMessageByPeer(t,s));const n=yield this.managers.appPeersManager.getPeerUsername(e?e.fromId:t),a=(0,bt.Z)(i);let o="https://t.me/";return n?(o+=n,o+=e?`/${(0,bt.Z)(e.fwd_from.channel_post)}?comment=${a}`:s?`/${(0,bt.Z)(s)}/${a}`:"/"+a):(o+="c/"+t.toChatId(),o+=e?`/${a}?thread=${(0,bt.Z)(e.mid)}`:s?`/${(0,bt.Z)(s)}/${a}`:"/"+a),{url:o,isPrivate:!n}}))}getSelectedMessagesText(){return nn(this,void 0,void 0,(function*(){if(!Fs())return"";const e=this.chat.selection.isSelecting?[...this.chat.selection.selectedMids.get(this.peerId)].sort(((e,t)=>e-t)):[this.mid];return(yield Promise.all(e.map((e=>nn(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);return(null==t?void 0:t.message)?t.message+"\n":""})))))).join("")}))}}var on=i(4329),rn=i.n(on),dn=i(9043);class ln{constructor(e){this.sendMenuButtons=[{icon:"mute",text:"Chat.Send.WithoutSound",onClick:e.onSilentClick,verify:()=>"schedule"===this.type},{icon:"schedule",text:"Chat.Send.ScheduledMessage",onClick:e.onScheduleClick,verify:()=>"schedule"===this.type},{icon:"schedule",text:"Chat.Send.SetReminder",onClick:e.onScheduleClick,verify:()=>"reminder"===this.type}],this.sendMenu=(0,ks.b)({buttons:this.sendMenuButtons,listenerSetter:e.listenerSetter}),this.sendMenu.classList.add("menu-send",e.openSide),(0,Ct.E)(e.onContextElement,(t=>{e.onOpen&&!e.onOpen()||(this.sendMenuButtons.forEach((e=>{e.element.classList.toggle("hide",!e.verify())})),(0,Ce.Z)(t),Lt.Z.openBtnMenu(this.sendMenu))}),e.listenerSetter)}setPeerId(e){this.type=e===d.Z.myId?"reminder":"schedule"}}var cn=i(1293),hn=i(9336),un=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class pn extends w.Z{constructor(e){super("popup-create-poll popup-new-media",{closable:!0,withConfirm:"Create",body:!0,title:"NewPoll"}),this.chat=e,this.tempId=0,this.onSubmitClick=()=>{this.send()},this.onInput=e=>{const t=e.target,i=(0,be.Z)(t,"LABEL"),s=(0,cn.Z)(t);s||(t.parentElement.classList.add("is-filled"),i.classList.remove("hidden-widget"),i.firstElementChild.removeAttribute("disabled")),!i.nextElementSibling&&!s&&this.questions.childElementCount<10&&this.appendMoreField(),this.handleChange()},this.onDeleteClick=e=>{const t=e.target,i=(0,be.Z)(t,"LABEL"),s=(0,Ie.Z)(i);this.correctAnswers&&this.correctAnswers[0][0]===s&&(this.correctAnswers=void 0),i.remove(),this.optionInputFields.splice(s,1),this.optionInputFields.forEach(((e,t)=>{e.options.labelOptions.length=0,e.options.labelOptions.push(t+1),C.ZP.weakMap.get(e.label.firstElementChild).update()})),this.handleChange()},this.construct()}construct(){return un(this,void 0,void 0,(function*(){if(this.questionInputField=new L.ZP({placeholder:"AskAQuestion",label:"AskAQuestion",name:"question",maxLength:255}),this.listenerSetter.add(this.questionInputField.input)("input",(()=>{this.handleChange()})),this.optionInputFields=[],"scheduled"!==this.chat.type){const e=new ln({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending((()=>{this.send()}))},openSide:"bottom-left",onContextElement:this.btnConfirm});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.header.append(this.questionInputField.container);const e=document.createElement("hr"),t=document.createElement("div");t.classList.add("caption"),(0,C.$d)(t,"PollOptions"),this.questions=document.createElement("form"),this.questions.classList.add("poll-create-questions");const i=document.createElement("div");i.classList.add("poll-create-settings");const s=document.createElement("div");s.classList.add("caption"),(0,C.$d)(s,"Settings"),(yield this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))||(this.anonymousCheckboxField=new zt.Z({text:"NewPoll.Anonymous",name:"anonymous"}),this.anonymousCheckboxField.input.checked=!0,i.append(this.anonymousCheckboxField.label)),this.multipleCheckboxField=new zt.Z({text:"NewPoll.MultipleChoice",name:"multiple"}),this.quizCheckboxField=new zt.Z({text:"NewPoll.Quiz",name:"quiz"}),this.listenerSetter.add(this.multipleCheckboxField.input)("change",(()=>{const e=this.multipleCheckboxField.input.checked;this.quizCheckboxField.input.toggleAttribute("disabled",e)})),this.listenerSetter.add(this.quizCheckboxField.input)("change",(()=>{const e=this.quizCheckboxField.input.checked;Array.from(this.questions.children).map((t=>{t.classList.toggle("radio-field",e)})),e||(this.correctAnswers=void 0,this.quizSolutionField.setValueSilently("")),n.forEach((t=>t.classList.toggle("hide",!e))),this.multipleCheckboxField.input.toggleAttribute("disabled",e),this.handleChange()})),i.append(this.multipleCheckboxField.label,this.quizCheckboxField.label);const n=[],a=document.createElement("div");a.classList.add("caption"),(0,C.$d)(a,"AccDescrQuizExplanation");const o=document.createElement("hr"),r=document.createElement("div");r.classList.add("poll-create-questions"),this.quizSolutionField=new L.ZP({placeholder:"NewPoll.Explanation.Placeholder",label:"NewPoll.Explanation.Placeholder",name:"solution",maxLength:200}),this.listenerSetter.add(this.questionInputField.input)("input",(()=>{this.handleChange()}));const d=document.createElement("div");d.classList.add("subtitle"),(0,C.$d)(d,"AddAnExplanationInfo"),r.append(this.quizSolutionField.container,d),n.push(o,a,r),n.forEach((e=>e.classList.add("hide"))),this.body.parentElement.insertBefore(e,this.body),this.body.append(t,this.questions,document.createElement("hr"),s,i,...n),(0,S.fc)(this.btnConfirm,this.onSubmitClick,{listenerSetter:this.listenerSetter}),this.scrollable=new Z.ZP(this.body),this.appendMoreField(),this.onEscape=()=>!this.getFilledAnswers().length,this.handleChange()}))}getFilledAnswers(){return Array.from(this.questions.children).map(((e,t)=>{const i=e.querySelector(".input-field-input");return i instanceof HTMLInputElement?i.value:(0,hn.Z)(i,!1,!1).value})).filter((e=>!!e.trim()))}validate(){var e;const t=this.questionInputField.value;if(!t)return!1;if(t.length>255)return!1;if(this.quizCheckboxField.input.checked&&!(null===(e=this.correctAnswers)||void 0===e?void 0:e.length))return!1;const i=this.getFilledAnswers();if(i.length<2)return!1;if(i.find((e=>e.length>100)))return!1;const{value:s}=(0,hn.Z)(this.quizSolutionField.input,!1,!1);return!(s.length>200)}handleChange(){const e=this.validate();this.btnConfirm.toggleAttribute("disabled",!e)}send(e=!1){return un(this,void 0,void 0,(function*(){const t=this.questionInputField.value,i=this.getFilledAnswers(),{value:s,entities:n}=(0,hn.Z)(this.quizSolutionField.input,!0,!1);if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending((()=>{this.send(!0)}));this.hide();const a={};this.anonymousCheckboxField&&!this.anonymousCheckboxField.input.checked&&(a.public_voters=!0),this.multipleCheckboxField.input.checked&&(a.multiple_choice=!0),this.quizCheckboxField.input.checked&&(a.quiz=!0);const o={_:"poll",pFlags:a,question:t,answers:i.map(((e,t)=>({_:"pollAnswer",text:e,option:new Uint8Array([t])}))),id:void 0},r=yield this.chat.managers.appPollsManager.getInputMediaPoll(o,this.correctAnswers,s,n);this.chat.managers.appMessagesManager.sendOther(this.chat.peerId,r,Object.assign({},this.chat.getMessageSendingParams())),"reply"===this.chat.input.helperType&&this.chat.input.clearHelper(),this.chat.input.onMessageSent(!1,!1)}))}appendMoreField(){const e=this.tempId++,t=this.questions.childElementCount+1,i=new L.ZP({placeholder:"NewPoll.OptionsAddOption",label:"NewPoll.OptionLabel",labelOptions:[t],name:"question-"+e,maxLength:100});this.listenerSetter.add(i.input)("input",this.onInput);const s=new Fi.Z({text:"",name:"question"});s.main.append(i.container),(0,S.fc)(i.input,Ce.Z,{listenerSetter:this.listenerSetter}),s.label.classList.add("hidden-widget"),s.input.disabled=!0,this.quizCheckboxField.input.checked||s.label.classList.remove("radio-field"),this.listenerSetter.add(s.input)("change",(()=>{if(s.input.checked){const e=(0,Ie.Z)(s.label);this.correctAnswers=[new Uint8Array([e])],this.handleChange()}}));const n=document.createElement("span");n.classList.add("btn-icon","tgico-close"),i.container.append(n),(0,S.fc)(n,this.onDeleteClick,{listenerSetter:this.listenerSetter,once:!0}),this.questions.append(s.label),this.scrollable.scrollIntoViewNew({element:this.questions.lastElementChild,position:"center"}),this.optionInputFields.push(i)}}var fn=i(7814);function mn(e){let t,i;return e instanceof HTMLVideoElement?(t=e.videoWidth,i=e.videoHeight):(t=e.naturalWidth,i=e.naturalHeight),(0,fn.Z)({media:e,mediaSize:(0,qe.C)(t,i),boxSize:(0,qe.C)(320,240),quality:.9})}var gn=i(9897),vn=i(2341);function bn(e){const t=e.src;return fetch(t).then((e=>e.arrayBuffer())).then((e=>{const t=new Uint8Array(e);let i=0;for(let e=0,s=t.length;e{const t=e.target;if(t!==this.input){if("INPUT"===t.tagName||t.isContentEditable)return;this.input.focus(),(0,Nt.Z)(this.input)}},this.attachFile=e=>{const t=this.willAttach,i=this.shouldCompress(e.type),s=document.createElement("div");s.classList.add("popup-item");const n={file:e};(0,Ln.Z)(n,["scaledBlob","middlewareHelper","itemDiv","mediaSpoiler"]),n.middlewareHelper=this.middlewareHelper.get().create(),n.itemDiv=s;const a=i?this.attachMedia(n):this.attachDocument(n);return t.sendFileDetails.push(n),a},this.animationGroup="",this.construct(i)}construct(e){return In(this,void 0,void 0,(function*(){this.willAttach={type:e,sendFileDetails:[],group:!1};const t=yield this.managers.apiManager.getLimit("caption");if(this.captionLengthMax=t,(0,S.fc)(this.btnConfirm,(()=>this.send()),{listenerSetter:this.listenerSetter}),"scheduled"!==this.chat.type){const e=new ln({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending((()=>{this.send()}))},openSide:"bottom-left",onContextElement:this.btnConfirm,listenerSetter:this.listenerSetter});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.mediaContainer=document.createElement("div"),this.mediaContainer.classList.add("popup-photo");const i=new Z.ZP(null);let s,n,a;i.container.append(this.mediaContainer),this.inputField=new L.ZP({placeholder:"PreviewSender.CaptionPlaceholder",label:"Caption",name:"photo-caption",maxLength:this.captionLengthMax,withLinebreaks:!0}),this.input=this.inputField.input,this.inputField.value=this.wasInputValue=this.chat.input.messageInputField.input.innerHTML,this.chat.input.messageInputField.value="",this.body.append(i.container),this.container.append(this.inputField.container),this.attachFiles(),this.addEventListener("close",(()=>{this.files.length=0,this.willAttach.sendFileDetails.length=0,Mn===this&&(Mn=void 0)})),(0,Cn.Z)({buttons:[{icon:"mediaspoiler",text:"EnablePhotoSpoiler",onClick:()=>{this.applyMediaSpoiler(a)},verify:()=>n&&!a.mediaSpoiler},{icon:"mediaspoileroff",text:"DisablePhotoSpoiler",onClick:()=>{(0,$i.MR)({mediaSpoiler:a.mediaSpoiler,reveal:!0,destroyAfter:!0}),a.mediaSpoiler=void 0},verify:()=>!(!n||!a.mediaSpoiler)}],listenTo:this.mediaContainer,listenerSetter:this.listenerSetter,findElement:e=>(s=(0,ve.Z)(e.target,"popup-item"),n=s.classList.contains("popup-item-media"),a=this.willAttach.sendFileDetails.find((e=>e.itemDiv===s)),s)}),Mn=this}))}applyMediaSpoiler(e,t){return In(this,void 0,void 0,(function*(){const i=e.middlewareHelper.get(),{width:s,height:n}=e.itemDiv.style;let a,o;if(e.itemDiv.classList.contains("album-item")){const{width:t,height:i}=e.itemDiv.parentElement.style,r=parseInt(t),d=parseInt(i);a=+s.slice(0,-1)/100*r,o=+n.slice(0,-1)/100*d}else a=parseInt(s),o=parseInt(n);const{url:r}=yield(0,fn.Z)({media:e.itemDiv.firstElementChild,boxSize:(0,qe.C)(40,40),mediaSize:(0,qe.C)(a,o),toDataURL:!0,quality:.2}),d=(0,En.o)(r),l={_:"photoStrippedSize",bytes:d,type:"i"};e.strippedBytes=d;const c={_:"photo",sizes:[l],id:0,access_hash:0,date:0,dc_id:0,file_reference:[]},h=yield(0,$i.ZP)({middleware:i,width:a,height:o,animationGroup:this.animationGroup,media:c});i()&&(t||h.classList.add("is-revealing"),e.mediaSpoiler=h,e.itemDiv.append(h),yield(0,pe.d1)(),i()&&(0,$i.MR)({mediaSpoiler:h,reveal:!1}))}))}appendDrops(e){this.body.append(e)}get type(){return this.willAttach.type}set type(e){this.willAttach.type=e}appendGroupCheckboxField(){var e;const t=this.files.length>1;t&&!this.groupCheckboxField?(this.groupCheckboxField=new zt.Z({text:"PreviewSender.GroupItems",name:"group-items"}),this.container.append(...[this.groupCheckboxField.label,null===(e=this.mediaCheckboxField)||void 0===e?void 0:e.label,this.inputField.container].filter(Boolean)),this.willAttach.group=!0,this.groupCheckboxField.setValueSilently(this.willAttach.group),this.listenerSetter.add(this.groupCheckboxField.input)("change",(()=>{const e=this.groupCheckboxField.checked;this.willAttach.group=e,this.attachFiles()}))):this.groupCheckboxField&&this.groupCheckboxField.label.classList.toggle("hide",!t)}appendMediaCheckboxField(){var e;const t=!!this.files.find((e=>vn.Z.has(e.type)));t&&!this.mediaCheckboxField?(this.mediaCheckboxField=new zt.Z({text:"PreviewSender.CompressFile",name:"compress-items"}),this.container.append(...[null===(e=this.groupCheckboxField)||void 0===e?void 0:e.label,this.mediaCheckboxField.label,this.inputField.container].filter(Boolean)),this.mediaCheckboxField.setValueSilently("media"===this.willAttach.type),this.listenerSetter.add(this.mediaCheckboxField.input)("change",(()=>{const e=this.mediaCheckboxField.checked;this.willAttach.type=e?"media":"document",this.attachFiles()}))):this.mediaCheckboxField&&this.mediaCheckboxField.label.classList.toggle("hide",!t)}addFiles(e){const t=e.filter((e=>!this.files.find((t=>t.lastModified===e.lastModified&&t.name===e.name&&t.size===e.size))));t.length&&(this.files.push(...t),this.attachFiles())}send(e=!1){if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending((()=>{this.send(!0)}));let t=this.inputField.value;if(t.length>this.captionLengthMax)return void(0,ye.Am)(C.ZP.format("Error.PreviewSender.CaptionTooLong",!0));const i=this.willAttach;i.isMedia="media"===i.type||void 0;const{sendFileDetails:s,isMedia:n}=i,{peerId:a,input:o}=this.chat,{length:r}=s,d=this.chat.getMessageSendingParams();this.iterate((e=>{t&&e.length!==r&&(this.managers.appMessagesManager.sendText(a,t,Object.assign(Object.assign({},d),{clearDraft:!0})),t=void 0);const s=e.map((e=>Object.assign(Object.assign({},e),{file:e.scaledBlob||e.file,spoiler:!!e.mediaSpoiler}))),o=Object.assign(Object.assign({},i),{sendFileDetails:s});this.managers.appMessagesManager.sendAlbum(a,Object.assign(Object.assign(Object.assign({},d),{caption:t,isMedia:n,clearDraft:!0}),o)),t=void 0})),o.replyToMsgId=this.chat.threadId,o.onMessageSent(),this.hide()}scaleImageForTelegram(e,t){return In(this,void 0,void 0,(function*(){const i=2560,s=t.file.type;let n,a=e.src;if("image/gif"!==s&&Math.max(e.naturalWidth,e.naturalHeight)>i){const{blob:t}=yield(0,fn.Z)({media:e,boxSize:(0,qe.C)(i,i),mediaSize:(0,qe.C)(e.naturalWidth,e.naturalHeight),mimeType:s});n=t,URL.revokeObjectURL(a),a=yield Sn.Z.invoke("createObjectURL",t),yield(0,Ot.cj)(e,a)}t.objectURL=a,t.scaledBlob=n}))}attachMedia(e){return In(this,void 0,void 0,(function*(){const{itemDiv:t}=e;t.classList.add("popup-item-media");const i=e.file;let s;if(i.type.startsWith("video/")){const n=(0,yn.Z)(),a=document.createElement("source");a.src=e.objectURL=yield Sn.Z.invoke("createObjectURL",i),n.autoplay=!0,n.controls=!1,n.muted=!0,n.addEventListener("timeupdate",(()=>{n.pause()}),{once:!0}),s=(0,wn.Z)(n).then((()=>In(this,void 0,void 0,(function*(){e.width=n.videoWidth,e.height=n.videoHeight,e.duration=Math.floor(n.duration);const i=n.webkitAudioDecodedByteCount;void 0!==i&&(e.noSound=!i),t.append(n);const s=yield function(e){return new Promise(((t,i)=>{e.onseeked=()=>{e.onseeked=()=>{mn(e).then(t),e.onseeked=void 0},e.currentTime=0},e.onerror=i,e.currentTime=Math.min(e.duration,1)}))}(n);e.thumb=Object.assign({url:yield Sn.Z.invoke("createObjectURL",s.blob)},s)})))),n.append(a)}else{const s=new Image,n=yield Sn.Z.invoke("createObjectURL",i);if(yield(0,Ot.cj)(s,n),yield this.scaleImageForTelegram(s,e),e.width=s.naturalWidth,e.height=s.naturalHeight,t.append(s),"image/gif"===i.type)return e.noSound=!0,Promise.all([bn(s).then((t=>{e.duration=Math.ceil(t)})),mn(s).then((t=>In(this,void 0,void 0,(function*(){e.thumb=Object.assign({url:yield Sn.Z.invoke("createObjectURL",t.blob)},t)}))))])}return s}))}attachDocument(e){return In(this,void 0,void 0,(function*(){const{itemDiv:t}=e;t.classList.add("popup-item-document");const i=e.file,s=i.type.startsWith("image/"),n=i.type.startsWith("audio/");let a;(s||n||i.size<2e7)&&(e.objectURL||(e.objectURL=yield Sn.Z.invoke("createObjectURL",i))),s&&(a=new Image,yield(0,Ot.cj)(a,e.objectURL),yield this.scaleImageForTelegram(a,e),e.scaledBlob=void 0);const o={_:"document",file:i,file_name:i.name||"",size:i.size,type:s?"photo":"doc"};let r;e.objectURL&&(r={url:e.objectURL,downloaded:i.size,type:m.Pt});const d=yield(0,Qi.Z)({message:{_:"message",pFlags:{is_outgoing:!0},mid:0,peerId:0,media:{_:"messageMediaDocument",document:o}},cacheContext:r});s&&(e.width=a.naturalWidth,e.height=a.naturalHeight),t.append(d)}))}shouldCompress(e){return"media"===this.willAttach.type&&vn.Z.has(e)}onRender(){this.element.classList.contains("active")||(this.listenerSetter.add(document.body)("keydown",this.onKeyDown),this.addEventListener("close",(()=>{this.wasInputValue&&(this.chat.input.messageInputField.value=this.wasInputValue)})),this.show())}setTitle(){const{willAttach:e,title:t,files:i}=this;let s;const n=[];if("document"===e.type)s="PreviewSender.SendFile",n.push(i.length);else{let e=0,t=0,a=0;i.forEach((i=>{i.type.startsWith("image/")?++e:i.type.startsWith("video/")?++t:++a})),[e,t,a].filter((e=>e>0)).length>1?(s="PreviewSender.SendFile",n.push(i.length)):e?(s="PreviewSender.SendPhoto",n.push(e)):t&&(s="PreviewSender.SendVideo",n.push(t))}(0,U.Z)(t,(0,C.ag)(s,n))}appendMediaToContainer(e){if(this.shouldCompress(e.file.type)){const t=(0,gn.Z)(e.width,e.height,380,320);e.itemDiv.style.width=t.width+"px",e.itemDiv.style.height=t.height+"px"}this.mediaContainer.append(e.itemDiv)}iterate(e){const{sendFileDetails:t}=this.willAttach;if(!this.willAttach.group)return void t.forEach((t=>e([t])));const i=t.length;for(let s=0;s{e.middlewareHelper.destroy()})),this.appendGroupCheckboxField(),this.appendMediaCheckboxField();const n=e.map((e=>this.attachFile(e)));Promise.all(n).then((()=>{i.replaceChildren(),e.length&&(this.setTitle(),this.iterate((e=>{const t=this.shouldCompress(e[0].file.type);if(t&&e.length>1){const t=document.createElement("div");t.classList.add("popup-item-album","popup-item"),t.append(...e.map((e=>e.itemDiv))),Wi({container:t,items:e.map((e=>({w:e.width,h:e.height}))),maxWidth:380,minWidth:100,spacing:4}),i.append(t)}else e.forEach((e=>{this.appendMediaToContainer(e)}));t&&e.forEach((e=>{const t=s.find((t=>t.file===e.file));t&&t.mediaSpoiler&&this.applyMediaSpoiler(e,!0)}))})))})).then((()=>{this.onRender()}))}}var kn=i(6057);const Tn="keydown",xn="active",An=["ArrowUp","ArrowDown"],_n=["ArrowLeft","ArrowRight"];function Fn({list:e,type:t,onSelect:i,once:s,waitForKey:n}){let a=(null==n?void 0:n.length)?new Set(n):void 0;const o=new Set("xy"===t?An.concat(_n):"x"===t?_n:An);let r;const d=()=>r||e.querySelector("."+xn)||e.firstElementChild,l=(e,i)=>{if(r===e)return;let s=!1;r&&(s=!0,r.classList.remove(xn)),r=e,r&&(r.classList.add(xn),s&&p&&i&&(0,he.Z)({container:p,element:r,position:"center",forceDuration:100,axis:"x"===t?"x":"y"}))},c=(t,i)=>{let s;return s=i?t.nextElementSibling||e.firstElementChild:t.previousElementSibling||e.lastElementChild,s};let h;h="xy"===t?(t,i)=>"ArrowUp"===i||"ArrowDown"===i?((t,i)=>{const s=i?"nextElementSibling":"previousElementSibling",n=i?"firstElementChild":"lastElementChild",a=t.getBoundingClientRect();let o=t[s]||e[n];for(;o!==t;){const t=o.getBoundingClientRect();if(t.x===a.x&&t.y!==a.y)break;o=o[s]||e[n]}return o})(t,"ArrowDown"===i):c(t,"ArrowRight"===i):(e,t)=>c(e,"ArrowRight"===t||"ArrowDown"===t);let u=i=>{const s=i.key;if(o.has(s)){if((0,Ce.Z)(i),e.childElementCount>1){let e=d();e=h(e,s),l(e,!0)}}else("Enter"===s||"xy"!==t&&"Tab"===s)&&((0,Ce.Z)(i),g(d()))};const p=(0,ve.Z)(e,"scrollable");e.classList.add("navigable-list");const f=t=>{const i=(0,Be.Z)(t.target,e);i&&l(i,!1)},m=t=>{(0,Ce.Z)(t);const i=(0,Be.Z)(t.target,e);i&&(l(i,!1),g(d()))},g=e=>{return t=this,n=void 0,o=function*(){const t=yield i(e);(void 0!==t?!t:s)&&y()},new((a=void 0)||(a=Promise))((function(e,i){function s(e){try{d(o.next(e))}catch(e){i(e)}}function r(e){try{d(o.throw(e))}catch(e){i(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}d((o=o.apply(t,n||[])).next())}));var t,n,a,o};let v=!1;const b=()=>{v||(v=!0,document.addEventListener(Tn,u,{capture:!0,passive:!1}),e.addEventListener("mousemove",f,{passive:!0}),(0,S.fc)(e,m))},y=()=>{v&&(v=!1,document.removeEventListener(Tn,u,{capture:!0}),e.removeEventListener("mousemove",f),(0,S.EN)(e,m))},w=()=>{a||l(e.firstElementChild,!1)};if(a){const e=u;u=t=>{a.has(t.key)&&((0,Ce.Z)(t),document.removeEventListener(Tn,u,{capture:!0}),u=e,document.addEventListener(Tn,u,{capture:!0,passive:!1}),a=void 0,w())}}else w();return b(),{attach:b,detach:y,resetTarget:w}}var Dn=i(6385),Rn=i(5953);class Bn extends l.Z{constructor(e){super(!1),this.hidden=!0,this.onVisible=()=>{this.detach&&this.detach();const e=this.list,{attach:t,detach:i,resetTarget:s}=Fn({list:e,type:this.listType,onSelect:this.onSelect,once:!0,waitForKey:this.waitForKey});this.attach=t,this.detach=i,this.resetTarget=s,T.IS_MOBILE||this.navigationItem||(this.navigationItem={type:"autocomplete-helper",onPop:()=>{this.navigationItem=void 0,this.toggle(!0)},noBlurOnPop:!0},Dn.Z.pushItem(this.navigationItem)),this.addEventListener("hidden",(()=>{this.resetTarget=void 0,this.attach=void 0,this.detach=void 0,e.innerHTML="",i(),this.navigationItem&&(Dn.Z.removeItem(this.navigationItem),this.navigationItem=void 0)}),{once:!0})},(0,Rn.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("autocomplete-helper","z-depth-1"),e.appendTo.append(this.container),this.attachNavigation(),this.controller&&this.controller.addHelper(this)}toggleListNavigation(e){e?this.attach&&this.attach():this.detach&&this.detach()}attachNavigation(){this.addEventListener("visible",this.onVisible)}toggle(e,t=!1,i){if(this.init)return;if(void 0===e&&(e=this.container.classList.contains("is-visible")&&!this.container.classList.contains("backwards")),this.hidden===e)return void(e||this.dispatchEvent("visible"));this.hidden=e,e?(this.navigationItem&&(Dn.Z.removeItem(this.navigationItem),this.navigationItem=void 0),!t&&this.controller&&this.controller.hideOtherHelpers(),this.detach&&this.detach()):(this.controller&&this.controller.hideOtherHelpers(this),this.dispatchEvent("visible"));const s=this.controller||e?0:2;e&&this.dispatchEvent("hiding"),(0,Fe.Z)({element:this.container,className:"is-visible",forwards:!e,duration:d.Z.settings.animationsEnabled&&!i?300:0,onTransitionEnd:()=>{this.hidden&&this.dispatchEvent("hidden")},useRafs:s})}}class Nn extends Bn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"xy",onSelect:e=>{return t=this,i=void 0,n=function*(){return!(yield It.Jo.onMediaClick({target:e},!0))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n},waitForKey:["ArrowUp","ArrowDown"]}),this.chat=i,this.managers=s,this.container.classList.add("stickers-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0),d.Z.dispatchEvent("choosing_sticker",!0)})),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(o.Z.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0,this.listenerSetter.removeAll(),this.listenerSetter=void 0),d.Z.dispatchEvent("choosing_sticker",!1)}))}checkEmoticon(e){const t=this.controller.getMiddleware();this.lazyLoadQueue&&this.lazyLoadQueue.clear(),Os(e),this.managers.appStickersManager.getStickersByEmoticon(e).then((e=>{if(!t())return;this.init&&(this.init(),this.init=null);const i=this.list.cloneNode();let s;this.lazyLoadQueue.clear(),s=e.length?new Promise((t=>{const s=[];e.forEach((e=>{i.append(this.superStickerRenderer.renderSticker(e,void 0,s))})),Promise.all(s).finally(t)})):Promise.resolve(),s.then((()=>{this.list.replaceWith(i),this.list=i,this.onChangeScreen||(this.onChangeScreen=()=>{const e=this.list.childElementCount*o.Z.active.popupSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"},o.Z.addEventListener("changeScreen",this.onChangeScreen),this.listenerSetter=new le.Z,(0,ji.Z)({listenTo:this.container,listenerSetter:this.listenerSetter})),this.onChangeScreen(),this.toggle(!e.length),this.scrollable.scrollTop=0}))}))}init(){this.list=document.createElement("div"),this.list.classList.add("stickers-helper-stickers","super-stickers"),this.container.append(this.list),this.scrollable=new Z.ZP(this.container),this.lazyLoadQueue=new de.Z,this.superStickerRenderer=new kn.vT(this.lazyLoadQueue,this.chat.animationGroup,this.managers)}}var On=i(2230),Un=i(5322);const Hn=()=>{const e=new Date;return e.setHours(0,0,0,0),e},zn=()=>{const e=new Date;return e.setFullYear(e.getFullYear()+1),e.setDate(e.getDate()-1),e};class jn extends E{constructor(e,t,i){var s;if(super((s=e).getTime()>zn().getTime()?new Date:s,t,{noButtons:!0,noTitle:!0,closable:!0,withConfirm:!0,minDate:Hn(),maxDate:zn(),withTime:!0,showOverflowMonths:!0,confirmShortcutIsSendShortcut:!0,title:!0}),this.element.classList.add("popup-schedule"),this.header.append(this.controlsDiv),this.title.replaceWith(this.monthTitle),this.body.append(this.btnConfirm),i){const e=(0,Ue.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Schedule.SendWhenOnline"});this.body.append(e),(0,S.fc)(e,(()=>{t(ke),this.hide()}))}}}var Gn=i(8119),Vn=i(8799),Kn=i(6760),Wn=i(6299),$n=i(6039);class qn extends Bn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"x",onSelect:e=>{i.onEmojiSelected((0,$n.xG)(e),!0)}}),this.managers=s,this.container.classList.add("emoji-helper")}init(){this.list=document.createElement("div"),this.list.classList.add("emoji-helper-emojis","super-emojis"),this.container.append(this.list),this.scrollable=new Z.v7(this.container),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollLeft=0}),0)}))}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}(e=e.slice(0,80)).length&&(this.list.innerHTML="",e.forEach((e=>{(0,$n.IA)(e,this.list,!1,!0)}))),this.waitForKey=t?["ArrowUp","ArrowDown"]:void 0,this.toggle(!e.length)}checkQuery(e,t){const i=this.controller.getMiddleware();this.managers.appEmojiManager.getBothEmojiKeywords().then((()=>{return s=this,n=void 0,o=function*(){if(!i())return;const s=e.replace(/^:/,""),n=yield this.managers.appEmojiManager.searchEmojis(s);i()&&this.render(n,":"!==t)},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}d((o=o.apply(s,n||[])).next())}));var s,n,a,o}))}}class Qn extends Bn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"y",onSelect:s}),this.className=i,this.container.classList.add(Qn.BASE_CLASS,i)}init(){this.list=document.createElement("div"),this.list.classList.add(Qn.BASE_CLASS+"-list",this.className+"-list"),this.container.append(this.list),this.scrollable=new Z.ZP(this.container),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)}))}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}e.length&&(this.list.innerHTML="",e.forEach((e=>{const t=Qn.listElement({className:this.className,peerId:e.peerId,name:e.name,description:e.description});this.list.append(t)}))),t||this.toggle(!e.length)}static listElement(e){const t=Qn.BASE_CLASS_LIST_ELEMENT;e.className+="-list-element";const i=document.createElement("div");i.classList.add(t,e.className),i.dataset.peerId=""+e.peerId;const s=new f.Z;s.classList.add("avatar-30",t+"-avatar",e.className+"-avatar"),s.updateWithOptions({isDialog:!1,peerId:e.peerId});const n=document.createElement("div");if(n.classList.add(t+"-name",e.className+"-name"),e.name?(0,_.Z)(n,(0,R.Z)(e.name)):n.append(new B.Z({peerId:e.peerId,dialog:!1,onlyFirstName:!1,plainText:!1}).element),i.append(s,n),e.description){const s=document.createElement("div");s.classList.add(t+"-description",e.className+"-description"),(0,_.Z)(s,(0,R.Z)(e.description)),i.append(s)}return i}}Qn.BASE_CLASS="autocomplete-peer-helper",Qn.BASE_CLASS_LIST_ELEMENT=Qn.BASE_CLASS+"-list-element";var Yn=i(7381);function Xn(e,t,i){const s=[].concat(t.bot_info);let n;void 0!==i&&(n=new Yn.Z({ignoreCase:!0}));const a=new Map;let o;if(s.forEach((t=>{t.commands&&t.commands.forEach((({command:i,description:s},o)=>{const r="/"+i;a.set(i,{peerId:t.user_id?t.user_id.toPeerId(!1):e,command:i,name:r,description:s,index:o}),n&&n.indexObject(i,r)}))})),n){const e=n.search(i);o=Array.from(e).map((e=>a.get(e)))}else o=[...a.values()];return o=o.sort(((e,t)=>a.get(e.command).index-a.get(t.command).index)),o}class Jn extends Qn{constructor(e,t,i,s){super(e,t,"commands-helper",(e=>{const t=e.querySelector(`.${Qn.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return i.getReadyToSend((()=>{i.messageInput.innerHTML=t,i.sendMessage(!0)}))})),this.managers=s}checkQuery(e,t){return i=this,s=void 0,a=function*(){if(!(yield this.managers.appUsersManager.isBot(t)))return!1;const i=this.controller.getMiddleware();return this.managers.appProfileManager.getProfileByPeerId(t).then((s=>{if(!i())return;const n=Xn(t,s,e);this.render(n)})),!0},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}class ea{constructor(){this.helpers=new Set,this.middleware=(0,Se.k)()}toggleListNavigation(e){for(const t of this.helpers)t.toggleListNavigation(e)}getMiddleware(){return this.middleware.clean(),this.middleware.get()}addHelper(e){this.helpers.add(e)}hideOtherHelpers(e){this.helpers.forEach((t=>{t!==e&&t.toggle(!0,!0)})),e||this.middleware.clean()}}var ta=i(5102),ia=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class sa extends Qn{constructor(e,t,i,s){super(e,t,"mentions-helper",(e=>{const t=e.dataset.peerId.toUserId();Promise.resolve(s.appUsersManager.getUser(t)).then((e=>{let t,s="";const n=(0,ta.Z)(e);n[0]?s="@"+n[0]:(s=e.first_name||e.last_name,t={_:"messageEntityMentionName",length:s.length,offset:0,user_id:e.id}),s+=" ",i.insertAtCaret(s,t)}))})),this.managers=s}checkQuery(e,t,i){const s=e.trim();if(e.length!==s.length)return!1;const n=this.controller.getMiddleware();return this.managers.appProfileManager.getMentions(t&&t.toChatId(),s,i).then((e=>ia(this,void 0,void 0,(function*(){if(!n())return;e=e.filter((e=>e!==d.Z.myId));const t=e.map((e=>ia(this,void 0,void 0,(function*(){const t=yield this.managers.appUsersManager.getUser(e),i=(0,ta.Z)(t);return{peerId:e,description:i[0]?"@"+i[0]:void 0}}))));this.render((yield Promise.all(t)).filter(Boolean))})))),!0}}var na=i(5494),aa=i(6339),oa=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class ra extends aa.Z{constructor(e){super({element:document.createElement("div")}),this.onBodyTouchStart=e=>{const t=e.touches[0].target;(0,Be.Z)(t,this.element)||t===this.btnHover||((0,Ce.Z)(e),this.toggle(!1))},(0,Rn.Z)(this,e),this.element.classList.add(ra.BASE_CLASS),this.element.style.display="none",this.scrollable=new Z.ZP,this.element.append(this.scrollable.container),this.attachButtonListener(this.btnHover,this.listenerSetter),this.listenerSetter.add(d.Z)("history_reply_markup",(({peerId:e})=>oa(this,void 0,void 0,(function*(){this.peerId===e&&(this.checkAvailability()&&this.isActive()&&(yield this.render()),(0,ue.e9)().then((()=>{this.checkForceReply()})))}))))}init(){return this.appendTo.append(this.element),this.listenerSetter.add(this)("open",(()=>oa(this,void 0,void 0,(function*(){yield this.render(),c.Z&&(this.touchListener=this.listenerSetter.add(document.body)("touchstart",this.onBodyTouchStart,{passive:!1,capture:!0}),this.listenerSetter.add(this)("close",(()=>{this.listenerSetter.remove(this.touchListener)}),{once:!0}))})))),(0,S.fc)(this.element,(e=>{const t=(0,ve.Z)(e.target,"btn");if(!t)return;const i=t.dataset.type,{peerId:s}=this;"keyboardButtonRequestPhone"===i?(0,vi.Z)({titleLangKey:"ShareYouPhoneNumberTitle",button:{langKey:"OK"},descriptionLangKey:"AreYouSureShareMyContactInfoBot"}).then((()=>{this.managers.appMessagesManager.sendContact(s,d.Z.myId)})):this.managers.appMessagesManager.sendText(s,t.dataset.text),this.toggle(!1)}),{listenerSetter:this.listenerSetter}),super.init()}checkForceReply(){return oa(this,void 0,void 0,(function*(){const e=yield this.getReplyMarkup();"replyKeyboardForceReply"!==e._||e.pFlags.hidden||e.pFlags.used||(e.pFlags.used=!0,this.chatInput.initMessageReply(e.mid))}))}getReplyMarkup(){var e;return oa(this,void 0,void 0,(function*(){return null!==(e=(yield this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId)).replyMarkup)&&void 0!==e?e:{_:"replyKeyboardHide"}}))}render(e){return oa(this,void 0,void 0,(function*(){void 0===e&&(e=yield this.getReplyMarkup()),this.scrollable.container.replaceChildren();for(const t of e.rows){const e=document.createElement("div");e.classList.add(ra.BASE_CLASS+"-row");for(const i of t.buttons){const t=document.createElement("button");t.classList.add(ra.BASE_CLASS+"-button","btn"),(0,_.Z)(t,(0,R.Z)(i.text)),t.dataset.text=i.text,t.dataset.type=i._,e.append(t)}this.scrollable.container.append(e)}}))}checkAvailability(e){var t;return oa(this,void 0,void 0,(function*(){void 0===e&&(e=yield this.getReplyMarkup());const i="replyKeyboardHide"===e._||!(null===(t=e.rows)||void 0===t?void 0:t.length);return this.btnHover.classList.toggle("hide",i),i&&this.toggle(!1),!i}))}setPeer(e){this.peerId=e,this.checkAvailability(),this.checkForceReply()}}ra.BASE_CLASS="reply-keyboard";var da=i(1080),la=i(8678),ca=i(2830),ha=i(515);const ua="INLINE-HELPER";class pa extends Bn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"xy",waitForKey:["ArrowUp","ArrowDown"],onSelect:e=>{if(!e)return!1;const{peerId:t,botId:i,queryId:s}=this.list.dataset;return this.chat.input.getReadyToSend((()=>{const n=(0,ha.Z)(s,e.dataset.resultId);this.managers.appInlineBotsManager.sendInlineResult(t.toPeerId(),i,n,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{clearDraft:!0})),this.chat.input.onMessageSent(!0,!0)}))}}),this.chat=i,this.managers=s,this._checkQuery=(e,t,i)=>{return s=this,n=void 0,r=function*(){const s=this.controller.getMiddleware(),n=yield this.managers.appUsersManager.resolveUsername(t);if(!s())throw"PEER_CHANGED";if("user"!==n._||!n.pFlags.bot)throw"NOT_A_BOT";const a=this.managers.appInlineBotsManager.getInlineResults(e,n.id,i).then((t=>{if(!s())throw"PEER_CHANGED";this.init&&(this.init(),this.init=null);const i=this.list.cloneNode();i.dataset.peerId=""+e,i.dataset.botId=""+n.id,i.dataset.queryId=""+t.query_id;const a=new da.Z(null,ua,this.scrollable,!1);this.lazyLoadQueue.clear(),this.superStickerRenderer.clear();const r=[],d=!!t.pFlags.gallery;for(const e of t.results){const t=document.createElement("div");t.classList.add("inline-helper-result"),t.dataset.resultId=e.id;const n=d?void 0:document.createElement("div");if(n&&(n.classList.add("inline-helper-result-preview"),t.append(n)),i.append(t),d)t.classList.add("grid-item");else{n.classList.add("empty"),(0,_.Z)(n,(0,R.Z)([...e.title.trim()][0]));const s=document.createElement("div");s.classList.add("inline-helper-result-title"),(0,_.Z)(s,(0,R.Z)(e.title));const a=document.createElement("div");a.classList.add("inline-helper-result-description"),(0,_.Z)(a,(0,ft.ZP)(e.description,{noCommands:!0,noLinks:!0})),t.append(s,a);const o=document.createElement("div");o.classList.add("inline-helper-separator"),i.append(o)}if("botInlineResult"===e._){if(e.thumb&&0===e.thumb.mime_type.indexOf("image/")){let i;n?(i=document.createElement("div"),n.append(i)):i=t,i.classList.add("media-container"),d&&i.classList.add("no-border-radius"),this.lazyLoadQueue.push({div:t,load:()=>Ds.Z.download({dcId:4,location:{_:"inputWebFileLocation",access_hash:e.thumb.access_hash,url:e.thumb.url},size:e.thumb.size,mimeType:e.thumb.mime_type}).then((e=>{const t=new Image;t.classList.add("media-photo"),(0,la.Z)(e).then((e=>{(0,ca.Z)(i,t,e,!0)}))}))})}}else{const i=e.document||e.photo;if(["sticker","gif"].includes(null==i?void 0:i.type)&&d)(0,Pe.Z)(i),"gif"===i.type?a.add(i,t):"sticker"===i.type&&(t.classList.add("super-sticker"),this.superStickerRenderer.renderSticker(i,t,r),i.animated&&this.superStickerRenderer.observeAnimated(t));else if(i){const e=d?48:void 0;d&&t.classList.add("no-border-radius"),(0,V.Z)({photo:i,container:d?t:n,boxWidth:e,boxHeight:e,middleware:s,lazyLoadQueue:this.lazyLoadQueue,loadPromises:r})}}}return Promise.all(r).then((()=>{if(!s())return void a.clear();i.classList.toggle("is-gallery",d),i.classList.toggle("super-stickers",d),this.container.classList.toggle("is-gallery",d);const r=this.list.parentElement;if(r.textContent="",t.switch_pm){const i=(0,Ue.Z)("btn-primary btn-secondary btn-primary-transparent primary");(0,_.Z)(i,(0,R.Z)(t.switch_pm.text)),(0,S.fc)(i,(i=>{this.chat.appImManager.setInnerPeer({peerId:e}),this.managers.appInlineBotsManager.switchToPM(e,n.id,t.switch_pm.start_param)})),r.append(i)}r.append(this.list=i),this.gifsMasonry&&this.gifsMasonry.detach(),this.gifsMasonry=a,a.attach(),this.onChangeScreen||(this.onChangeScreen=()=>{if(this.list.classList.contains("is-gallery")){const e=this.list.childElementCount*o.Z.active.popupSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"}else this.list.style.width=""},o.Z.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!t.results.length&&!t.switch_pm),this.scrollable.scrollTop=0}))}));return{user:n,renderPromise:a}},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function o(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,o)}d((r=r.apply(s,n||[])).next())}));var s,n,a,r},this.container.classList.add("inline-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)})),this.checkQuery=(0,Ze.Z)(this._checkQuery,200,!0,!0),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(o.Z.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0)}))}init(){this.list=document.createElement("div"),this.list.classList.add("inline-helper-results"),this.container.append(this.list),this.scrollable=new Z.ZP(this.container),this.lazyLoadQueue=new de.Z,this.superStickerRenderer=new kn.vT(this.lazyLoadQueue,ua,this.managers)}}var fa=i(8090),ma=i(3013),ga=i(5133);class va extends Qn{constructor(e,t,i){super(e,void 0,"bot-commands",(e=>{const i=e.querySelector(`.${Qn.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return t.getReadyToSend((()=>{t.messageInput.innerHTML=i,t.sendMessage(!0),this.toggle(!0)}))})),this.managers=i}setUserId(e,t){var i;if(this.userId!==e||!(null===(i=this.list)||void 0===i?void 0:i.childElementCount))return this.userId=e,(0,Ke.Z)(this.managers.appProfileManager.getProfile(e),(i=>{if(!t())return;const s=Xn(e.toPeerId(!1),i),n=50*s.length+8+24;this.container.style.setProperty("--height",n+"px"),this.render(s)}));this.toggle(!1)}}var ba=i(8479),ya=(i(1544),i(7197)),wa=i(6241),Sa=i(6535),Ca=i(2821),La=i(3066);function Ea(e){return t=this,i=void 0,n=function*(){return{cached:e.cached,result:e.cached?yield e.result:e.result}},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}function Ia(e){return e.then(Ea)}var Ma=i(177),Pa=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Za{constructor(e,t,i){this.managers=e,this.onReady=t,this.onChange=i,this.middleware=(0,Se.k)(),this.listenerSetter=new le.Z,this.construct()}construct(){this.container=document.createElement("div"),this.container.classList.add("new-message-send-as-container"),this.closeBtn=document.createElement("div"),this.closeBtn.classList.add("new-message-send-as-close","new-message-send-as-avatar","tgico-close");const e=[{text:"SendMessageAsTitle",onClick:void 0}];let t;this.buttons=[];const i=e=>{e&&(t=this.avatar);const i=this.avatar!==t,s=!e&&i?2:0;(0,Fe.Z)({element:this.closeBtn,className:"is-visible",forwards:e,duration:300,useRafs:s}),i||(0,Fe.Z)({element:t,className:"is-visible",forwards:!e,duration:300,useRafs:s})};(0,Un.Z)({buttonOptions:{noRipple:!0},listenerSetter:this.listenerSetter,container:this.container,direction:"top-right",buttons:e,onOpenBefore:()=>{i(!0)},onOpen:(t,i)=>{e[0].element.classList.add("btn-menu-item-header"),this.btnMenu=i,this.btnMenu.classList.add("scrollable","scrollable-y"),this.btnMenu.append(...this.buttons.map((e=>e.element)))},onClose:()=>{i(!1)},onCloseAfter:()=>{this.btnMenu=void 0}}),this.container.append(this.closeBtn)}updateButtons(e){var t;return Pa(this,void 0,void 0,(function*(){const i=e.map(((e,t)=>Pa(this,void 0,void 0,(function*(){const i=document.createElement("div"),s=document.createElement("div");return s.classList.add("btn-menu-item-subtitle"),e.isUser()?s.append((0,C.ag)("Chat.SendAs.PersonalAccount")):e===this.peerId?s.append((0,C.ag)("VoiceChat.DiscussionGroup")):s.append(yield(0,Ma.Z)(e.toChatId())),i.append(new B.Z({peerId:e}).element,s),{onClick:t?()=>Pa(this,void 0,void 0,(function*(){const t=this.peerId;this.changeSendAsPeerId(e);const i=this.middleware.get(),s=()=>{if(this.sendAsPeerId!==e||!i())return;const t=this.sendAsPeerIds.slice();(0,h.Z)(t,e),t.unshift(e),this.updateButtons(t)};d.Z.settings.animationsEnabled?setTimeout(s,250):s(),this.managers.appMessagesManager.saveDefaultSendAs(t,e)})):void 0,textElement:i}})))),s=yield Promise.all(i);(0,ks.b)({buttons:s}),s.forEach(((t,i)=>{const s=e[i],n=new f.Z;n.classList.add("avatar-26","btn-menu-item-icon"),n.updateWithOptions({peerId:s}),i||n.classList.add("active"),t.element.prepend(n)})),this.buttons=s,null===(t=this.btnMenu)||void 0===t||t.append(...this.buttons.map((e=>e.element)))}))}updateAvatar(e,t){return Pa(this,void 0,void 0,(function*(){const i=this.avatar;if(i&&i.peerId===e)return;i||(t=!0);const s=t?0:2,n=t?0:300,a=this.avatar=new f.Z;a.classList.add("new-message-send-as-avatar","avatar-30"),yield a.updateWithOptions({isDialog:!1,peerId:e}),(0,Fe.Z)({element:a,className:"is-visible",forwards:!0,duration:n,useRafs:s}),i&&(0,Fe.Z)({element:i,className:"is-visible",forwards:!1,duration:n,onTransitionEnd:()=>{i.remove()},useRafs:s}),this.container.append(a)}))}changeSendAsPeerId(e,t){return this.sendAsPeerId=e,this.onChange(e),this.updateAvatar(e,t)}getDefaultSendAs(){return this.managers.acknowledged.appProfileManager.getChannelFull(this.peerId.toChatId()).then((e=>({cached:e.cached,result:e.result.then((e=>e.default_send_as?(0,D.Z)(e.default_send_as):void 0))})))}updateManual(e){return Pa(this,void 0,void 0,(function*(){const t=this.peerId;if(this.updatingPromise||!(yield this.managers.appPeersManager.isChannel(t)))return;const i=this.middleware.get((()=>!this.updatingPromise||this.updatingPromise===l)),{container:s}=this,n=t.toChatId(),a=(yield Ia(this.getDefaultSendAs())).result,o=e;a instanceof Promise&&(e=void 0);const r=o&&!e,l=this.updatingPromise=(0,Ke.Z)(a,(t=>Pa(this,void 0,void 0,(function*(){if(!i()||void 0===t)return;if(yield this.changeSendAsPeerId(t,e),!i())return;this.managers.appChatsManager.getSendAs(n).then((e=>{if(!i())return;const s=e.filter((e=>!e.pFlags.premium_required)).map((e=>e.peer)).map((e=>(0,D.Z)(e)));this.sendAsPeerIds=s.slice(),(0,h.Z)(s,t),s.unshift(t),this.updateButtons(s)}));const a=()=>{this.onReady(s,e),this.addedListener||(this.listenerSetter.add(d.Z)("peer_full_update",(e=>{this.peerId===e&&this.update()})),this.addedListener=!0)};if(!r)return a;a()}))));return l.finally((()=>{this.updatingPromise===l&&(this.updatingPromise=void 0)})),r?void 0:l}))}update(e){return this.updateManual(e).then((e=>null==e?void 0:e()))}setPeerId(e){this.middleware.clean(),this.updatingPromise=void 0,this.peerId=e}destroy(){this.container.remove(),this.setPeerId(),this.listenerSetter.removeAll()}}var ka=i(669),Ta=i(6854);const xa=new RegExp(`(${Ta.Z})|(
)`,"g");class Aa extends L.ZP{constructor(e){super(e),this.input.addEventListener("input",(()=>{this.updateInnerHTML(),this.onFakeInput()})),e.placeholder&&(0,C.$d)(this.inputFake,e.placeholder,void 0,"placeholder"),this.input.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.contentEditable="true",this.inputFake.tabIndex=-1,this.inputFake.className=this.input.className+" input-field-input-fake"}onFakeInput(e=!0){const{scrollHeight:t}=this.inputFake,i=+this.input.style.height.replace("px","");if(i===t)return;const s=Math.round(50*Math.log(Math.abs(t-i)));this.input.style.transitionDuration=`${s}ms`,e&&(this.input.style.height=t?t+"px":"");const n="is-changing-height";(0,Fe.Z)({element:this.input,className:n,forwards:!0,duration:s,onTransitionEnd:()=>{this.input.classList.remove(n)}})}updateInnerHTML(e=this.input.innerHTML){e=e.replace(//,"").replace(/().+?\/custom-emoji-element>/g,"$1"),ka.Y&&(e=e.replace(xa,"")),this.inputFake.innerHTML=e}setValueSilently(e,t){super.setValueSilently(e,t),this.updateInnerHTML(),t||this.onFakeInput()}}var _a=i(9041);function Fa(e){const t={};e.forEach((e=>t[e]=!1));const i=window.getSelection();if(!i.isCollapsed){const s=i.getRangeAt(0),n=s.commonAncestorContainer,a=document.createTreeWalker((n.nodeType===n.ELEMENT_NODE?n:n.parentElement).closest('[contenteditable="true"]'),NodeFilter.SHOW_ELEMENT,{acceptNode:e=>s.intersectsNode(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});let o;for(;o=a.nextNode();)for(const i of e){if(t[i])continue;const e=_a.o[i];o.matches(e.match)&&(t[i]=!0)}}return t}var Da=i(6034),Ra=i(8794),Ba=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Na="Posting media content isn't allowed in this group.";class Oa{constructor(e,t,i){this.chat=e,this.appImManager=t,this.managers=i,this.lastUrl="",this.lastTimeType=0,this.replyElements={},this.willSendWebPage=null,this.recording=!1,this.recordCanceled=!1,this.recordStartTime=0,this.lockRedo=!1,this.canRedoFromHTML="",this.undoHistory=[],this.executedHistory=[],this.canUndoFromHTML="",this.onCancelRecordClick=e=>{e&&(0,Ce.Z)(e),this.recordCanceled=!0,this.recorder.stop(),dn.Z.setKeepAlive(!1)},this.onEmoticonsOpen=()=>{const e=c.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!0)},this.onEmoticonsClose=()=>{const e=c.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!1)},this.scheduleSending=(e=this.sendMessage.bind(this,!0),t=new Date)=>Ba(this,void 0,void 0,(function*(){const{peerId:i}=this.chat,s=this.chat.bubbles.getMiddleware(),n=d.Z.myId!==i&&i.isUser()&&(yield this.managers.appUsersManager.isUserOnlineVisible(i));new jn(t,(t=>{s()&&(t<=10+(Date.now()/1e3|0)&&(t=void 0),this.scheduleDate=t,e(),"scheduled"!==this.chat.type&&t&&setTimeout((()=>{s()&&(w.Z.getPopups(M.Z).forEach((e=>e.hide())),this.appImManager.openScheduled(i))}),0))}),n).show()})),this.prepareDocumentExecute=()=>(this.executedHistory.push(this.messageInput.innerHTML),()=>this.canUndoFromHTML=this.messageInput.innerHTML),this.undoRedo=(e,t,i)=>{(0,Ce.Z)(e);let s=this.messageInput.innerHTML;if(s&&s!==i){this.lockRedo=!0;let e=0;do{document.execCommand(t,!1,null);const i=this.messageInput.innerHTML;if(s===i){if(++e>2)break}else e=0;s=i}while(s!==i);this.lockRedo=!1}},this.handleMarkdownShortcut=e=>{const t={KeyB:"bold",KeyI:"italic",KeyU:"underline",KeyS:"strikethrough",KeyM:"monospace",KeyP:"spoiler"};this.appImManager.markupTooltip&&(t.KeyK="link");const i=e.code,s=t[i];if(!Fs(document.getSelection())&&s&&("KeyK"===i?this.appImManager.markupTooltip.showLinkEditor():this.applyMarkdown(s),(0,Ce.Z)(e)),"KeyZ"===i){let t=this.messageInput.innerHTML;e.shiftKey?this.undoHistory.length&&(this.executedHistory.push(t),t=this.undoHistory.pop(),this.undoRedo(e,"redo",t),t=this.messageInput.innerHTML,this.canRedoFromHTML=this.undoHistory.length?t:"",this.canUndoFromHTML=t):!this.executedHistory.length||this.canUndoFromHTML&&t!==this.canUndoFromHTML||(this.undoHistory.push(t),t=this.executedHistory.pop(),this.undoRedo(e,"undo",t),this.canUndoFromHTML=this.canRedoFromHTML=this.messageInput.innerHTML)}},this.onMessageInput=e=>{var t;const{value:i,entities:s,caretPos:n}=(0,hn.Z)(this.messageInputField.input),a=(0,Ca.Z)(i,s,!0),o=(0,wa.Z)(s,(0,Sa.Z)(a));this.canRedoFromHTML&&!this.lockRedo&&this.messageInput.innerHTML!==this.canRedoFromHTML&&(this.canRedoFromHTML="",this.undoHistory.length=0);const r=(!(null===(t=this.editMessage)||void 0===t?void 0:t.media)||"messageMediaWebPage"===this.editMessage.media._)&&o.filter((e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._));if(r.length)for(const e of r){let t;if("messageEntityTextUrl"===e._)t=e.url;else if(t=i.slice(e.offset,e.offset+e.length),!t.includes("http://")&&!t.includes("https://"))continue;if(this.lastUrl!==t){this.lastUrl=t;const e=this.getWebPagePromise=this.managers.appWebPagesManager.getWebPage(t).then((i=>{this.getWebPagePromise===e&&(this.getWebPagePromise=void 0),this.lastUrl===t&&("webPage"===i._?(this.setTopInfo("webpage",(()=>{}),i.site_name||i.title||"Webpage",i.description||i.url||""),delete this.noWebPage,this.willSendWebPage=i):this.willSendWebPage&&this.onHelperCancel())}))}break}else this.lastUrl&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.helperType?this.helperFunc():this.clearHelper());if(i.trim()){const e=Date.now();e-this.lastTimeType>=6e3&&(this.lastTimeType=e,this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageTypingAction"},void 0,this.chat.threadId)),this.botCommands&&this.botCommands.toggle(!0)}else this.lastTimeType&&this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageCancelAction"},void 0,this.chat.threadId),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.hide(),document.activeElement===this.messageInput&&setTimeout((()=>{document.activeElement===this.messageInput&&this.resetCurrentFontFormatting()}),0);this.botCommands&&this.updateBotCommandsToggle(),this.editMsgId||this.saveDraftDebounced(),this.checkAutocomplete(i,n,o),this.updateSendBtn()},this.onEmojiSelected=(e,t)=>{const i=e.docId?{_:"messageEntityCustomEmoji",document_id:e.docId,length:e.emoji.length,offset:0}:(0,ya.Z)(e.emoji);this.insertAtCaret(e.emoji,i,t)},this.onBtnSendClick=e=>Ba(this,void 0,void 0,(function*(){if((0,Ce.Z)(e),!this.recorder||this.recording||!this.isInputEmpty()||this.forwarding||this.editMsgId)this.recording?Date.now()-this.recordStartTime<500?this.onCancelRecordClick():this.recorder.stop():this.sendMessage();else{const e=this.chat.peerId.isAnyChat();if(e&&!(yield this.chat.canSend("send_media")))return void(0,ye.Am)(Na);this.chatInput.classList.add("is-locked"),(0,Vn.Z)();let t=!1;if(!e){const e=yield this.managers.appProfileManager.getProfile(this.chat.peerId.toUserId());(null==e?void 0:e.pFlags.voice_messages_forbidden)&&((0,ye.bC)({langPackKey:"Chat.SendVoice.PrivacyError",langPackArguments:[yield(0,Vt.Z)({peerId:this.chat.peerId})]}),t=!0)}if(t)return void this.chatInput.classList.remove("is-locked");this.recorder.start().then((()=>{this.releaseMediaPlayback=ma.Z.setSingleMedia(),this.recordCanceled=!1,this.setRecording(!0),dn.Z.setKeepAlive(!0);const e=()=>{new xs.Z("popup-cancel-record",{titleLangKey:"DiscardVoiceMessageTitle",descriptionLangKey:"DiscardVoiceMessageDescription",buttons:[{langKey:"DiscardVoiceMessageAction",callback:()=>{(0,S.tH)(this.btnCancelRecord)}},{langKey:"Continue",isCancel:!0}]}).show()};this.recordingOverlayListener=this.listenerSetter.add(document.body)("mousedown",(t=>{(0,ve.Z)(t.target,"chat-input")||(0,ve.Z)(t.target,"popup-cancel-record")||((0,Ce.Z)(t),e())}),{capture:!0,passive:!1}),Dn.Z.pushItem(this.recordingNavigationItem={type:"voice",onPop:()=>(setTimeout((()=>{e()}),0),!1)}),this.recordStartTime=Date.now();const t=this.recorder.sourceNode,i=t.context.createAnalyser();t.connect(i),i.fftSize=32;const s=new Uint8Array(i.frequencyBinCount),n=255*s.length,a=()=>{if(!this.recording)return;i.getByteFrequencyData(s);let e=0;s.forEach((t=>{e+=t}));const t=Math.min(1,e/n+.36);this.recordRippleEl.style.transform=`scale(${t})`;const o=Date.now()-this.recordStartTime,r=o%1e3,d=(0,ts.Z)(o/1e3)+","+("00"+Math.round(r/10)).slice(-2);this.recordTimeEl.innerText=d,(0,pe.T2)(a)};a()})).catch((e=>{switch(e.name){case"NotAllowedError":(0,ye.Am)("Please allow access to your microphone");break;case"NotReadableError":(0,ye.Am)(e.message);break;default:console.error("Recorder start error:",e,e.name,e.message),(0,ye.Am)(e.message)}this.setRecording(!1),this.chatInput.classList.remove("is-locked")}))}})),this.onHelperCancel=(e,t)=>Ba(this,void 0,void 0,(function*(){if(e&&(0,Ce.Z)(e),this.willSendWebPage){const e=this.lastUrl;let t=!1;if(this.helperType&&(yield this.helperFunc(),t=!0),this.lastUrl=e,this.noWebPage=!0,this.willSendWebPage=null,t)return}if("edit"===this.helperType&&!t){const e=this.editMessage,t=this.getCurrentInputAsDraft();if(t&&delete t.pFlags.no_webpage,!(0,Da.Z)(t,Object.assign(Object.assign({},e),{_:"draftMessage"})))return void new xs.Z("discard-editing",{buttons:[{langKey:"Alert.Confirm.Discard",callback:()=>{this.onHelperCancel(void 0,!0)}}],descriptionLangKey:"Chat.Edit.Cancel.Text"}).show()}this.clearHelper(),this.updateSendBtn()})),this.onHelperClick=e=>{if((0,Ce.Z)(e),(0,ve.Z)(e.target,"reply"))if("forward"===this.helperType){const{forwardElements:e}=this;e&&c.Z&&!e.container.classList.contains("active")&&Lt.Z.openBtnMenu(e.container)}else"reply"===this.helperType?this.chat.setMessageId(this.replyToMsgId):"edit"===this.helperType&&this.chat.setMessageId(this.editMsgId)},this.listenerSetter=new le.Z}construct(){this.chatInput=document.createElement("div"),this.chatInput.classList.add("chat-input","hide"),this.inputContainer=document.createElement("div"),this.inputContainer.classList.add("chat-input-container"),this.rowsWrapperWrapper=document.createElement("div"),this.rowsWrapperWrapper.classList.add("rows-wrapper-wrapper"),this.rowsWrapper=document.createElement("div"),this.rowsWrapper.classList.add("rows-wrapper","chat-input-wrapper"),this.rowsWrapperWrapper.append(this.rowsWrapper);const e=Zs();this.rowsWrapper.append(e);const t=this.fakeRowsWrapper=document.createElement("div");t.classList.add("fake-wrapper","fake-rows-wrapper");const i=this.fakeSelectionWrapper=document.createElement("div");i.classList.add("fake-wrapper","fake-selection-wrapper"),this.inputContainer.append(this.rowsWrapperWrapper,t,i),this.chatInput.append(this.inputContainer),this.goDownBtn=(0,Gn.Z)({icon:"arrow_down",className:"bubbles-corner-button chat-secondary-button bubbles-go-down hide"}),this.inputContainer.append(this.goDownBtn),(0,S.fc)(this.goDownBtn,(e=>{(0,Ce.Z)(e),this.chat.bubbles.onGoDownClick()}),{listenerSetter:this.listenerSetter});const s=this.controlContainer=document.createElement("div");s.classList.add("chat-input-control","chat-input-wrapper"),this.inputContainer.append(s)}constructPeerHelpers(){this.replyElements.container=document.createElement("div"),this.replyElements.container.classList.add("reply-wrapper"),this.replyElements.iconBtn=(0,On.Z)(""),this.replyElements.cancelBtn=(0,On.Z)("close reply-cancel",{noRipple:!0}),this.replyElements.container.append(this.replyElements.iconBtn,this.replyElements.cancelBtn);const e=()=>(s=!0,this.canToggleHideAuthor()),t=()=>{s=!1},i=this.forwardElements={};let s=!1;const n=[i.showSender={text:"Chat.Alert.Forward.Action.Show1",onClick:e,checkboxField:new zt.Z({checked:!0})},i.hideSender={text:"Chat.Alert.Forward.Action.Hide1",onClick:e,checkboxField:new zt.Z({checked:!1})},i.showCaption={text:"Chat.Alert.Forward.Action.ShowCaption",onClick:t,checkboxField:new zt.Z({checked:!0})},i.hideCaption={text:"Chat.Alert.Forward.Action.HideCaption",onClick:t,checkboxField:new zt.Z({checked:!1})},i.changePeer={text:"Chat.Alert.Forward.Action.Another",onClick:()=>{this.changeForwardRecipient()},icon:"replace"}],a=i.container=(0,ks.b)({buttons:n,listenerSetter:this.listenerSetter}),o=Array.from(a.children);[{elements:o.slice(0,2),onChange:(e,t)=>{const n=!!+e;s&&(this.forwardWasDroppingAuthor=!n);const a=this.replyElements.container.querySelector(".reply-title");if(a){const e=a.firstElementChild,t=C.ZP.weakMap.get(e),s=i.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden";t.key=s,t.update()}}},{elements:o.slice(2,4),onChange:e=>{const t=!!+e;let s;s=t&&void 0!==this.forwardWasDroppingAuthor?this.forwardWasDroppingAuthor?i.hideSender:i.showSender:t?i.showSender:i.hideSender,s.checkboxField.checked=!0}}].forEach((e=>{const t=(0,ga.Z)(e.elements.map((e=>({container:e,input:e.querySelector("input")}))),e.onChange),i=document.createElement("hr");t.append(i),a.append(t)})),a.append(i.changePeer.element),c.Z||(this.forwardHover=new aa.Z({element:a})),i.modifyArgs=n.slice(0,-1),this.replyElements.container.append(a),i.modifyArgs.forEach(((e,t)=>{const{input:i}=e.checkboxField;i.type="radio",i.name=t<2?"author":"caption",i.value=""+ +!(t%2)})),this.newMessageWrapper=document.createElement("div"),this.newMessageWrapper.classList.add("new-message-wrapper"),this.replyInTopicOverlay=document.createElement("div"),this.replyInTopicOverlay.classList.add("reply-in-topic-overlay","hide"),this.replyInTopicOverlay.append((0,C.ag)("Chat.Input.ReplyToAnswer")),this.btnToggleEmoticons=(0,On.Z)("none toggle-emoticons",{noRipple:!0}),this.inputMessageContainer=document.createElement("div"),this.inputMessageContainer.classList.add("input-message-container"),this.goDownUnreadBadge=document.createElement("span"),this.goDownUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goDownBtn.append(this.goDownUnreadBadge),this.goMentionBtn=(0,Gn.Z)({icon:"mention",className:"bubbles-corner-button chat-secondary-button bubbles-go-mention"}),this.goMentionUnreadBadge=document.createElement("span"),this.goMentionUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goMentionBtn.append(this.goMentionUnreadBadge),this.inputContainer.append(this.goMentionBtn),(0,S.fc)(this.goMentionBtn,(e=>{(0,Ce.Z)(e);const t=this.chat.bubbles.getMiddleware();this.managers.appMessagesManager.goToNextMention(this.chat.peerId,this.chat.threadId).then((e=>{t()&&e&&this.chat.setMessageId(e)}))}),{listenerSetter:this.listenerSetter}),this.btnScheduled=(0,On.Z)("scheduled btn-scheduled float hide",{noRipple:!0}),(0,S.fc)(this.btnScheduled,(e=>{this.appImManager.openScheduled(this.chat.peerId)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(d.Z)("scheduled_new",(({peerId:e})=>{this.chat.peerId===e&&this.btnScheduled.classList.remove("hide")})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:e})=>{this.chat.peerId===e&&this.managers.appMessagesManager.getScheduledMessages(this.chat.peerId).then((e=>{this.btnScheduled.classList.toggle("hide",!e.length)}))})),this.btnToggleReplyMarkup=(0,On.Z)("botcom toggle-reply-markup float hide",{noRipple:!0}),this.replyKeyboard=new ra({appendTo:this.rowsWrapper,listenerSetter:this.listenerSetter,managers:this.managers,btnHover:this.btnToggleReplyMarkup,chatInput:this}),this.listenerSetter.add(this.replyKeyboard)("open",(()=>this.btnToggleReplyMarkup.classList.add("active"))),this.listenerSetter.add(this.replyKeyboard)("close",(()=>this.btnToggleReplyMarkup.classList.remove("active"))),this.botCommands=new va(this.rowsWrapper,this,this.managers),this.botCommandsToggle=document.createElement("div"),this.botCommandsToggle.classList.add("new-message-bot-commands");const r=document.createElement("div");r.classList.add("new-message-bot-commands-icon-scale");const l=this.botCommandsIcon=document.createElement("div");l.classList.add("animated-menu-icon","animated-menu-close-icon"),r.append(l),this.botCommandsToggle.append(r),(0,S.fc)(this.botCommandsToggle,(e=>{(0,Ce.Z)(e),l.classList.contains("state-back")?(this.botCommands.toggle(!0),l.classList.remove("state-back")):(this.botCommands.setUserId(this.chat.peerId.toUserId(),this.chat.bubbles.getMiddleware()),l.classList.add("state-back"))}),{listenerSetter:this.listenerSetter}),this.botCommands.addEventListener("visible",(()=>{l.classList.add("state-back")})),this.botCommands.addEventListener("hiding",(()=>{l.classList.remove("state-back")})),this.attachMenuButtons=[{icon:"image",text:"Chat.Input.Attach.PhotoOrVideo",onClick:()=>{this.fileInput.value="";const e=[...vn.Z].join(", ");this.fileInput.setAttribute("accept",e),this.willAttachType="media",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"document",text:"Chat.Input.Attach.Document",onClick:()=>{this.fileInput.value="",this.fileInput.removeAttribute("accept"),this.willAttachType="document",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"poll",text:"Poll",onClick:()=>{w.Z.createPopup(pn,this.chat).show()},verify:()=>(this.chat.peerId.isAnyChat()||this.chat.isBot)&&this.chat.canSend("send_polls")}];const h=this.attachMenuButtons.slice();this.attachMenu=(0,Un.Z)({buttonOptions:{noRipple:!0},listenerSetter:this.listenerSetter,direction:"top-left",buttons:this.attachMenuButtons,onOpenBefore:()=>Ba(this,void 0,void 0,(function*(){const e=yield this.managers.appAttachMenuBotsManager.getAttachMenuBots(),t=h.slice(),i=e.filter((e=>!e.pFlags.inactive)).map((e=>{const t=(0,Ra.Z)(e);return{regularText:(0,R.Z)(e.short_name),onClick:()=>{this.managers.appAttachMenuBotsManager.requestWebView(Object.assign({botId:e.bot_id,peerId:this.chat.peerId},this.chat.getMessageSendingParams())).then((t=>{const i=["allow-scripts","allow-same-origin","allow-popups","allow-forms","allow-modals","allow-storage-access-by-user-activation"].join(" ");class s extends w.Z{constructor(t){super("popup-payment popup-payment-verification",{closable:!0,overlayClosable:!0,body:!0,titleRaw:e.short_name}),this.url=t,this.d()}destroy(){return this.telegramWebView.destroy(),super.destroy()}d(){const e=this.telegramWebView=new wi({url:this.url,sandbox:i});e.iframe.classList.add("payment-verification"),this.body.append(e.iframe),this.show(),e.onMount()}}new s(t.url)}))},iconDoc:null==t?void 0:t.icon,verify:()=>Ba(this,void 0,void 0,(function*(){let t=!1;const i={attachMenuPeerTypeSameBotPM:()=>this.chat.peerId.toUserId()===e.bot_id,attachMenuPeerTypeBotPM:()=>this.chat.isBot,attachMenuPeerTypePM:()=>this.chat.peerId.isUser(),attachMenuPeerTypeChat:()=>this.chat.isAnyGroup,attachMenuPeerTypeBroadcast:()=>this.chat.isBroadcast};for(const s of e.peer_types){const e=i[s._];if(t=yield e(),t)break}return t}))}}));t.splice(t.length,0,...i),this.attachMenuButtons.splice(0,this.attachMenuButtons.length,...t)}))}),this.attachMenu.classList.add("attach-file","tgico-attach"),this.attachMenu.classList.remove("tgico-more"),this.recordTimeEl=document.createElement("div"),this.recordTimeEl.classList.add("record-time"),this.fileInput=document.createElement("input"),this.fileInput.type="file",this.fileInput.multiple=!0,this.fileInput.style.display="none",this.newMessageWrapper.append(...[this.botCommandsToggle,this.btnToggleEmoticons,this.inputMessageContainer,this.btnScheduled,this.btnToggleReplyMarkup,this.attachMenu,this.recordTimeEl,this.fileInput].filter(Boolean)),this.rowsWrapper.append(this.replyElements.container),this.autocompleteHelperController=new ea,this.stickersHelper=new Nn(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.managers),this.emojiHelper=new qn(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.commandsHelper=new Jn(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.mentionsHelper=new sa(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.inlineHelper=new pa(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.managers),this.rowsWrapper.append(this.newMessageWrapper),this.btnCancelRecord=(0,On.Z)("binfilled btn-circle btn-record-cancel chat-secondary-button"),this.btnSendContainer=document.createElement("div"),this.btnSendContainer.classList.add("btn-send-container"),this.recordRippleEl=document.createElement("div"),this.recordRippleEl.classList.add("record-ripple"),this.btnSend=(0,On.Z)("none btn-circle btn-send animated-button-icon"),this.btnSend.insertAdjacentHTML("afterbegin",'\n \n \n \n \n '),this.btnSendContainer.append(this.recordRippleEl,this.btnSend),this.sendMenu=new ln({onSilentClick:()=>{this.sendSilent=!0,this.sendMessage()},onScheduleClick:()=>{this.scheduleSending(void 0)},listenerSetter:this.listenerSetter,openSide:"top-left",onContextElement:this.btnSend,onOpen:()=>!("scheduled"===this.chat.type||this.isInputEmpty()&&!Object.keys(this.forwarding).length)}),this.btnSendContainer.append(this.sendMenu.sendMenu),this.inputContainer.append(this.btnCancelRecord,this.btnSendContainer),It.ZP.attachButtonListener(this.btnToggleEmoticons,this.listenerSetter),this.listenerSetter.add(It.ZP)("open",this.onEmoticonsOpen),this.listenerSetter.add(It.ZP)("close",this.onEmoticonsClose),this.attachMessageInputField(),this.listenerSetter.add(d.Z)("settings_updated",(()=>{var e;(this.stickersHelper||this.emojiHelper)&&(this.previousQuery="",this.checkAutocomplete()),null===(e=this.messageInputField)||void 0===e||e.onFakeInput()})),this.listenerSetter.add(d.Z)("draft_updated",(({peerId:e,threadId:t,draft:i,force:s})=>{this.chat.threadId===t&&this.chat.peerId===e&&"scheduled"!==this.chat.type&&this.setDraft(i,!0,s)})),this.listenerSetter.add(this.appImManager)("peer_changing",(e=>{this.chat!==e||"chat"!==this.chat.type&&"discussion"!==this.chat.type||this.saveDraft()})),this.listenerSetter.add(this.appImManager)("chat_changing",(({from:e,to:t})=>{this.chat===e?this.autocompleteHelperController.toggleListNavigation(!1):this.chat===t&&this.autocompleteHelperController.toggleListNavigation(!0)})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:e,mids:t})=>{"scheduled"===this.chat.type&&this.chat.peerId===e&&t.includes(this.editMsgId)&&this.onMessageSent()})),this.listenerSetter.add(d.Z)("history_delete",(({peerId:e,msgs:t})=>{this.chat.peerId===e&&"scheduled"!==this.chat.type&&(t.has(this.editMsgId)&&this.onMessageSent(),this.replyToMsgId&&t.has(this.replyToMsgId)&&this.clearHelper("reply"))})),this.listenerSetter.add(d.Z)("dialogs_multiupdate",(e=>{!e.has(this.chat.peerId)||"chat"!==this.chat.type&&"discussion"!==this.chat.type||(this.startParam===m.gZ?this.setStartParam():this.center(!0))}));try{this.recorder=new(rn())({encoderSampleRate:48e3,monitorGain:0,numberOfChannels:1,recordingGain:1,reuseWorker:!0})}catch(e){console.error("Recorder constructor error:",e)}this.updateSendBtn(),this.listenerSetter.add(this.fileInput)("change",(e=>{const t=e.target.files;t.length&&(w.Z.createPopup(Zn,this.chat,Array.from(t).slice(),this.willAttachType),this.fileInput.value="")}),!1),(0,S.fc)(this.btnSend,this.onBtnSendClick,{listenerSetter:this.listenerSetter,touchMouseDown:!0}),this.recorder&&((0,S.fc)(this.btnCancelRecord,this.onCancelRecordClick,{listenerSetter:this.listenerSetter}),this.recorder.onstop=()=>{this.setRecording(!1),this.chatInput.classList.remove("is-locked"),this.recordRippleEl.style.transform=""},this.recorder.ondataavailable=e=>{if(this.releaseMediaPlayback&&(this.releaseMediaPlayback(),this.releaseMediaPlayback=void 0),this.recordingOverlayListener&&(this.listenerSetter.remove(this.recordingOverlayListener),this.recordingOverlayListener=void 0),this.recordingNavigationItem&&(Dn.Z.removeItem(this.recordingNavigationItem),this.recordingNavigationItem=void 0),this.recordCanceled)return;const{peerId:t,threadId:i}=this.chat,s=this.replyToMsgId,n=(Date.now()-this.recordStartTime)/1e3|0,a=new Blob([e],{type:"audio/ogg"});dn.Z.decode(e,!0).then((e=>{dn.Z.setKeepAlive(!1),this.managers.appMessagesManager.sendFile(t,{file:a,isVoiceMessage:!0,isMedia:!0,duration:n,waveform:e.waveform,objectURL:e.url,replyToMsgId:s,threadId:i,clearDraft:!0}),this.onMessageSent(!1,!0)}))}),(0,S.fc)(this.replyElements.cancelBtn,this.onHelperCancel,{listenerSetter:this.listenerSetter}),(0,S.fc)(this.replyElements.container,this.onHelperClick,{listenerSetter:this.listenerSetter}),this.saveDraftDebounced=(0,Ze.Z)((()=>this.saveDraft()),2500,!1,!0),this.botStartBtn=(0,Ue.Z)("btn-primary btn-transparent text-bold chat-input-control-button"),this.botStartBtn.append((0,C.ag)("BotStart")),(0,S.fc)(this.botStartBtn,(()=>{const{startParam:e}=this;if(void 0===e)return;const t=this.toggleBotStartBtnDisability=(0,Ut.Z)([this.botStartBtn],!0),i=this.chat.peerId,s=this.chat.bubbles.getMiddleware((()=>this.chat.peerId===i&&this.startParam===e&&this.toggleBotStartBtnDisability===t));this.managers.appMessagesManager.startBot(i.toUserId(),void 0,e).then((()=>{s()&&(t(),this.toggleBotStartBtnDisability=void 0,this.setStartParam())}))}),{listenerSetter:this.listenerSetter}),this.controlContainer.append(this.botStartBtn,this.replyInTopicOverlay),this.pinnedControlBtn=(0,Ue.Z)("btn-primary btn-transparent text-bold chat-input-control-button",{icon:"unpin"}),this.controlContainer.append(this.pinnedControlBtn),this.listenerSetter.add(this.pinnedControlBtn)("click",(()=>{const e=this.chat.peerId;new As(e,0,!0,(()=>{this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}))}))}_center(e,t){if(!e&&!this.inputContainer.classList.contains("is-centering"))return;if(e===this.fakeWrapperTo)return;const i=e||this.fakeWrapperTo,s=!!e,n=this.fakeWrapperTo;let a,o="",r="";const d=i.getBoundingClientRect(),l=this.fakeRowsWrapper.getBoundingClientRect(),c=l.width,h=d.width;if(c!==h){const e=h/c,t=(c-h)/2;if(a=d.left-l.left-t,s&&(o=`translateX(${a}px) scaleX(${e})`,e<1)){const t=16;r=t+t*(1-e)+"px"}}this.fakeWrapperTo=e;const u=t?200:0;return(0,Fe.Z)({element:this.inputContainer,className:"is-centering",forwards:s,duration:u}),(0,Fe.Z)({element:this.rowsWrapperWrapper,className:"is-centering-to-control",forwards:!!(s&&e&&e.classList.contains("chat-input-control")),duration:u}),this.rowsWrapper.style.transform=o,this.rowsWrapper.style.borderRadius=r,{transform:o,borderRadius:r,needTranslateX:n&&(e&&e.classList.contains("chat-input-control")&&n===this.fakeSelectionWrapper||n.classList.contains("chat-input-control"))?-.5*a:a,widthFrom:c,widthTo:h}}center(e=!1){return Ba(this,void 0,void 0,(function*(){return this._center(yield this.getNeededFakeContainer(),e)}))}setStartParam(e){this.startParam!==e&&(this.startParam=e,this.center(!0))}isReplyInTopicOverlayNeeded(){return this.chat.isForum&&!this.chat.isForumTopic&&!this.replyToMsgId&&"chat"===this.chat.type}getNeededFakeContainer(e=this.startParam){return Ba(this,void 0,void 0,(function*(){return this.chat.selection.isSelecting?this.fakeSelectionWrapper:void 0!==e||!(yield this.chat.canSend())||"pinned"===this.chat.type||(yield this.chat.isStartButtonNeeded())||this.isReplyInTopicOverlayNeeded()?this.controlContainer:void 0}))}getReadyToSend(e){return"scheduled"===this.chat.type?(this.scheduleSending(e),!0):(e(),!1)}setUnreadCount(){return Ba(this,void 0,void 0,(function*(){if(!this.goDownUnreadBadge)return;const e=yield this.managers.dialogsStorage.getDialogOrTopic(this.chat.peerId,"discussion"===this.chat.type?void 0:this.chat.threadId),t=null==e?void 0:e.unread_count;if(this.goDownUnreadBadge.innerText=""+(t||""),this.goDownUnreadBadge.classList.toggle("badge-gray",yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.chat.peerId,respectType:!0,threadId:this.chat.threadId})),this.goMentionUnreadBadge&&"chat"===this.chat.type){const t=!(!(null==e?void 0:e.unread_mentions_count)||!e.unread_count);this.goMentionUnreadBadge.innerText=t?""+e.unread_mentions_count:"",this.goMentionBtn.classList.toggle("is-visible",t)}}))}getCurrentInputAsDraft(){const{value:e,entities:t}=(0,hn.Z)(this.messageInputField.input,!0,!1);let i;return(e.length||this.replyToMsgId)&&(i={_:"draftMessage",date:(0,Ht.Z)(!0),message:e,entities:t.length?t:void 0,pFlags:{no_webpage:this.noWebPage},reply_to_msg_id:this.replyToMsgId}),i}saveDraft(){if(!this.chat.peerId||this.editMsgId||"scheduled"===this.chat.type)return;const e=this.getCurrentInputAsDraft();this.managers.appDraftsManager.syncDraft(this.chat.peerId,this.chat.threadId,e)}destroy(){this.listenerSetter.removeAll()}cleanup(e=!0){this.chat.peerId||(this.chatInput.classList.add("hide"),this.goDownBtn.classList.add("hide")),(0,Kn.Z)(),this.lastTimeType=0,this.startParam=void 0,this.toggleBotStartBtnDisability&&(this.toggleBotStartBtnDisability(),this.toggleBotStartBtnDisability=void 0),this.messageInput&&(this.clearInput(),e&&this.clearHelper())}setDraft(e,t=!0,i=!1){return Ba(this,void 0,void 0,(function*(){if(!i&&!(0,cn.Z)(this.messageInput)||"scheduled"===this.chat.type)return!1;if(!e&&!(e=yield this.managers.appDraftsManager.getDraft(this.chat.peerId,this.chat.threadId)))return i&&(this.chat.container.classList.contains("is-helper-active")&&this.t(),this.messageInputField.inputFake.textContent="",this.messageInputField.onFakeInput(!1),(this.chat.bubbles.messagesQueuePromise||Promise.resolve()).then((()=>{(0,pe.T2)((()=>{this.onMessageSent()}))}))),!1;const s=function(e,t,i){const s=(0,Sa.Z)(e.message),n=e.entities||[],a=(0,wa.Z)(n.slice(),s);return(0,La.Z)(e.message,{entities:a,wrappingForPeerId:t,loadPromises:void 0})}(e,this.chat.peerId),n=this.getCurrentInputAsDraft();return!((0,Da.Z)(e,n)&&this.replyToMsgId===e.reply_to_msg_id||(t&&this.clearHelper(),this.noWebPage=e.pFlags.no_webpage,e.reply_to_msg_id&&this.initMessageReply(e.reply_to_msg_id),this.setInputValue(s,t,t),0))}))}createSendAs(){if(this.sendAsPeerId=void 0,"chat"===this.chat.type||"discussion"===this.chat.type){let e=!0;this.sendAs=new Za(this.managers,((e,t)=>{let i=0;e.parentElement||(this.newMessageWrapper.prepend(e),i=2),this.updateOffset("as",!0,t,i)}),(t=>{this.sendAsPeerId=t,e?e=!1:this.getPlaceholderKey().then((e=>{this.updateMessageInputPlaceholder(e)}))}))}else this.sendAs=void 0;return this.sendAs}finishPeerChange(e){return Ba(this,void 0,void 0,(function*(){const t=this.chat.peerId,{forwardElements:i,btnScheduled:s,replyKeyboard:n,sendMenu:a,goDownBtn:o,chatInput:r,botCommandsToggle:d}=this,l=this.sendAs,c=this.createSendAs(),[h,u,p,f,m,g,v,b,y]=yield Promise.all([this.managers.appPeersManager.isBroadcast(t),this.managers.appPeersManager.canPinMessage(t),this.managers.appPeersManager.isBot(t),this.chat.canSend(),this.getNeededFakeContainer(e),Ia(this.managers.acknowledged.appProfileManager.getProfileByPeerId(t)),s?Ia(this.managers.acknowledged.appMessagesManager.getScheduledMessages(t)):void 0,c?(c.setPeerId(this.chat.peerId),c.updateManual(!0)):void 0,this.filterAttachMenuButtons()]),w=this.messageInput?yield this.getPlaceholderKey():void 0;return()=>{var c;if(r.classList.remove("hide"),o.classList.toggle("is-broadcast",h),o.classList.remove("hide"),null===(c=this.messageInputField)||void 0===c||c.onFakeInput(),this.goDownUnreadBadge&&this.setUnreadCount(),"pinned"===this.chat.type&&r.classList.toggle("can-pin",u),i&&(this.forwardWasDroppingAuthor=!1,i.showCaption.checkboxField.setValueSilently(!0),i.showSender.checkboxField.setValueSilently(!0)),s&&v){s.classList.add("hide");const e=this.chat.bubbles.getMiddleware();(0,Ke.Z)(v.result,(t=>{e()&&t&&s.classList.toggle("hide",!t.length)}))}if(this.newMessageWrapper&&this.updateOffset(null,!1,!0),d&&(this.hasBotCommands=void 0,this.botCommands.toggle(!0,void 0,!0),this.updateBotCommandsToggle(!0),d.remove(),p)){const e=this.chat.bubbles.getMiddleware(),t=g.result;(0,Ke.Z)(t,(i=>{e()&&this.updateBotCommands(i,!(t instanceof Promise))}))}l&&l.destroy(),b&&b(),n&&n.setPeer(t),a&&a.setPeerId(t),this.messageInput&&(this.updateMessageInput(f,w,y),this.messageInput.dataset.peerId=""+t);let S=!1;if(this.pinnedControlBtn){const e="pinned"===this.chat.type;S||(S=e),this.pinnedControlBtn.classList.toggle("hide",!e),this.pinnedControlBtn.replaceChildren((0,C.ag)(u?"Chat.Input.UnpinAll":"Chat.Pinned.DontShow"))}{const e=this.chat.isForum&&!this.chat.isForumTopic&&"chat"===this.chat.type;S||(S=e),this.replyInTopicOverlay.classList.toggle("hide",!e)}this.botStartBtn.classList.toggle("hide",S),this.startParam=e,this._center(m,!1)}}))}updateOffset(e,t,i,s){e?this.newMessageWrapper.dataset.offset=e:delete this.newMessageWrapper.dataset.offset,(0,Fe.Z)({element:this.newMessageWrapper,className:"has-offset",forwards:t,duration:i?0:300,useRafs:s})}updateBotCommands(e,t){var i,s;this.hasBotCommands=!!(null===(s=null===(i=e.bot_info)||void 0===i?void 0:i.commands)||void 0===s?void 0:s.length),this.updateBotCommandsToggle(t)}updateBotCommandsToggle(e){const{botCommandsToggle:t,hasBotCommands:i}=this,s=!!i&&this.isInputEmpty();if(!i){if(!t.parentElement)return;t.remove()}const n=s,a=t.parentElement?0:2;t.parentElement||this.newMessageWrapper.prepend(t),this.updateOffset("commands",n,e,a)}getPlaceholderKey(){return Ba(this,void 0,void 0,(function*(){const{peerId:e,threadId:t,isForum:i}=this.chat;let s;return s=t&&!i?"Comment":(yield this.managers.appPeersManager.isBroadcast(e))?"ChannelBroadcast":void 0!==this.sendAsPeerId&&this.sendAsPeerId!==d.Z.myId||(yield this.managers.appMessagesManager.isAnonymousSending(e))?"SendAnonymously":"Message",s}))}updateMessageInputPlaceholder(e){const t=C.ZP.weakMap.get(this.messageInput);t&&t.compareAndUpdate({key:e})}filterAttachMenuButtons(){if(this.attachMenuButtons)return(0,en.Z)(this.attachMenuButtons,(e=>e.verify()))}updateMessageInput(e,t,i){const{chatInput:s,attachMenu:n,messageInput:a}=this,{peerId:o,threadId:r}=this.chat;s.classList.contains("is-hidden")!==!e&&(s.classList.add("no-transition"),s.classList.toggle("is-hidden",!e),s.offsetLeft,s.classList.remove("no-transition")),this.updateMessageInputPlaceholder(t),e?(a.contentEditable="true",this.setDraft(void 0,!1),a.innerHTML||this.messageInputField.onFakeInput()):a.contentEditable="inherit",n&&(n.toggleAttribute("disabled",!i.length),n.classList.toggle("btn-disabled",!i.length)),this.updateSendBtn()}attachMessageInputField(){const e=this.messageInputField;this.messageInputField=new Aa({placeholder:"Message",name:"message",withLinebreaks:!0}),this.messageInputField.input.classList.replace("input-field-input","input-message-input"),this.messageInputField.inputFake.classList.replace("input-field-input","input-message-input"),this.messageInput=this.messageInputField.input,this.messageInput.classList.add("no-scrollbar"),this.attachMessageInputListeners(),fa.T&&(0,fa.Z)(this.messageInput),e?(e.input.replaceWith(this.messageInputField.input),e.inputFake.replaceWith(this.messageInputField.inputFake)):this.inputMessageContainer.append(this.messageInputField.input,this.messageInputField.inputFake)}attachMessageInputListeners(){this.listenerSetter.add(this.messageInput)("keydown",(e=>{const t=e.key;if((0,Wn.Z)(e))(0,Ce.Z)(e),this.sendMessage();else if(e.ctrlKey||e.metaKey)this.handleMarkdownShortcut(e);else if(("PageUp"===t||"PageDown"===t)&&!e.shiftKey)if(e.preventDefault(),"PageUp"===t){const e=document.createRange(),t=window.getSelection();e.setStart(this.messageInput.childNodes[0]||this.messageInput,0),e.collapse(!0),t.removeAllRanges(),t.addRange(e)}else(0,Nt.Z)(this.messageInput)})),c.Z&&(0,S.fc)(this.messageInput,(e=>{if(It.ZP.isActive())return It.ZP.toggle(!1),(0,Vn.Z)(),void(0,Ce.Z)(e);this.appImManager.selectTab(1)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.messageInput)("input",this.onMessageInput),this.listenerSetter.add(this.messageInput)("keyup",(()=>{this.checkAutocomplete()})),this.listenerSetter.add(this.messageInput)("focusin",(()=>{"chat"!==this.chat.type&&"discussion"!==this.chat.type||!this.chat.bubbles.scrollable.loadedAll.bottom||this.managers.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId)}))}applyMarkdown(e,t){const i={link:t?()=>document.execCommand("createLink",!1,t):()=>document.execCommand("unlink",!1,null)},s=e=>{i[e]=()=>{const t=(n.includes(e)?n:[e]).filter((e=>l[e]));return(0,h.Z)(t,e)||t.push(e),t.length?document.execCommand("fontName",!1,"markup-"+t.join("-")):this.resetCurrentFontFormatting()}},n=["bold","italic","underline","strikethrough","spoiler"];if(n.forEach((e=>{s(e)})),s("monospace"),!i[e])return!1;const a=i[e],o=[],r=ka.Z.getInstance().prepareApplyingMarkdown(),d=this.listenerSetter.add(this.messageInput)("input",Ce.Z,{capture:!0,passive:!1});o.push(document.execCommand("styleWithCSS",!1,"true"));const l=Fa(Object.keys(i));return l.monospace&&"link"===e&&o.push(this.resetCurrentFormatting()),o.push("function"==typeof a?a():document.execCommand(a,!1,null)),o.push(document.execCommand("styleWithCSS",!1,"false")),r(),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.setActiveMarkupButton(),this.listenerSetter.remove(d),this.messageInputField.simulateInputEvent(),!0}resetCurrentFormatting(){return document.execCommand("removeFormat",!1,null)}resetCurrentFontFormatting(){return document.execCommand("fontName",!1,"Roboto")}insertAtCaret(e,t,i=!0){ka.Z.getInstance().makeFocused(this.messageInput);const{value:s,caretPos:n,entities:a}=(0,hn.Z)(this.messageInput),o=n>=0?n:s.length,r=s.substr(0,o),d=(s.substr(o),i?r.match(Oa.AUTO_COMPLETE_REG_EXP):null),l=d?d.index+(d[0].length-d[2].length):r.length;if(r.slice(0,l),i&&-1!==n){const e=d[2],t=document.getSelection();let i=0;for(;t.toString()!==e;){if(++i>=1e4)throw new Error("lolwhat");t.modify("extend","backward","character")}}(0,L.rf)(this.messageInput,e,t?[t]:void 0,this.chat.peerId)}checkAutocomplete(e,t,i){return Ba(this,void 0,void 0,(function*(){if(void 0===e){const s=(0,hn.Z)(this.messageInputField.input,!0,!0);e=s.value,t=s.caretPos,i=s.entities}if(-1===t&&(t=e.length),void 0===i){const t=(0,Ca.Z)(e,i,!0);i=(0,wa.Z)(i,(0,Sa.Z)(t))}if(e=e.slice(0,t),this.previousQuery===e)return;this.previousQuery=e;const s=e.match(Oa.AUTO_COMPLETE_REG_EXP);let n;if(s){const t=i[0];let a=s[2];const o=a[0];if(this.stickersHelper&&d.Z.settings.stickers.suggest&&(yield this.chat.canSend("send_stickers"))&&"messageEntityEmoji"===(null==t?void 0:t._)&&t.length===e.length&&!t.offset)n=this.stickersHelper,this.stickersHelper.checkEmoticon(e);else if("@"===o){const e=this.chat.threadId?(0,bt.Z)(this.chat.threadId):void 0;(yield this.mentionsHelper.checkQuery(a,this.chat.peerId.isUser()?m.NM:this.chat.peerId,e))&&(n=this.mentionsHelper)}else s[1]||"/"!==o?d.Z.settings.emoji.suggest&&(a=a.replace(/^\s*/,""),e.match(/^\s*:(.+):\s*$/)||e.match(/:[;!@#$%^&*()-=|]/)||!a||(n=this.emojiHelper,this.emojiHelper.checkQuery(a,o))):(yield this.commandsHelper.checkQuery(a,this.chat.peerId))&&(n=this.commandsHelper)}n=this.checkInlineAutocomplete(e,n),this.autocompleteHelperController.hideOtherHelpers(n)}))}checkInlineAutocomplete(e,t){let i=!1;const s=e=>{this.btnPreloader&&(0,Fe.Z)({element:this.btnPreloader,className:"show",forwards:e,duration:400})};if(!t){const n=e.match(/^@([a-zA-Z\\d_]{3,32})\s/);if(n){const a=n[1],o=e.slice(n[0].length);i=n[0].length===e.length,t=this.inlineHelper,this.btnPreloader?s(!0):(this.btnPreloader=(0,On.Z)("none btn-preloader float show disable-hover",{noRipple:!0}),(0,jt.y)(this.btnPreloader,!0),this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader,this.inputMessageContainer.nextSibling)),this.inlineHelper.checkQuery(this.chat.peerId,a,o).then((({user:e,renderPromise:t})=>{i&&e.bot_inline_placeholder&&(this.messageInput.dataset.inlinePlaceholder=e.bot_inline_placeholder),t.then((()=>{s(!1)}))})).catch((e=>{s(!1)}))}}return i||delete this.messageInput.dataset.inlinePlaceholder,t!==this.inlineHelper&&s(!1),t}setRecording(e){this.recording!==e&&((0,Fe.Z)({element:this.chatInput,className:"is-recording",forwards:e,duration:200}),this.recording=e,this.updateSendBtn())}changeForwardRecipient(){if(this.helperWaitingForward)return;this.helperWaitingForward=!0;const e=(0,ba.Z)(this.forwarding),t=this.helperFunc;this.clearHelper(),this.updateSendBtn();let i=!1;new I.Z(e,(()=>{i=!0})).addEventListener("close",(()=>{this.helperWaitingForward=!1,i||t()}))}clearInput(e=!0,t=!0,i=""){return Ba(this,void 0,void 0,(function*(){if(document.activeElement===this.messageInput&&T.IS_MOBILE_SAFARI){const e=document.createElement("input");document.body.append(e),(0,na.Z)(e),this.messageInputField.setValueSilently(i),(0,na.Z)(this.messageInput),e.remove()}else this.messageInputField.setValueSilently(i);c.Z||(this.canRedoFromHTML="",this.undoHistory.length=0,this.executedHistory.length=0,this.canUndoFromHTML="");let s=!1;e&&(s=yield this.setDraft(void 0,!1)),!s&&t&&this.onMessageInput()}))}isInputEmpty(){return(0,cn.Z)(this.messageInput)}updateSendBtn(){let e;const t=this.isInputEmpty();e=this.editMsgId?"edit":!this.recorder||this.recording||!t||this.forwarding?"scheduled"===this.chat.type?"schedule":"send":"record",["send","record","edit","schedule"].forEach((t=>{this.btnSend.classList.toggle(t,e===t)})),this.btnScheduled&&this.btnScheduled.classList.toggle("show",t&&"scheduled"!==this.chat.type),this.btnToggleReplyMarkup&&this.btnToggleReplyMarkup.classList.toggle("show",t&&"scheduled"!==this.chat.type)}getValueAndEntities(e){const{entities:t,value:i}=(0,hn.Z)(this.messageInput,!0,!1),s=(0,Sa.Z)(i);return{value:i,totalEntities:(0,wa.Z)(t,s)}}onMessageSent(e=!0,t){"scheduled"!==this.chat.type&&this.managers.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId,!0),this.scheduleDate=void 0,this.sendSilent=void 0;const{totalEntities:i}=this.getValueAndEntities(this.messageInput);let s=0;i.filter((e=>{if("messageEntityEmoji"===e._||"messageEntityCustomEmoji"===e._){const t=e.offset+e.length;return!(t<=s||(s=t,0))}return!1})).forEach((e=>{const t="messageEntityEmoji"===e._?{emoji:(0,Bs.zu)(e.unicode)}:{docId:e.document_id,emoji:""};this.managers.appEmojiManager.pushRecentEmoji(t)})),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.clearInput()),(t||e)&&this.clearHelper(),this.updateSendBtn()}sendMessage(e=!1){const{editMsgId:t,chat:i}=this;if("scheduled"===i.type&&!e&&!t)return void this.scheduleSending();const{peerId:s}=i,{noWebPage:n}=this,a=this.chat.getMessageSendingParams(),{value:o,entities:r}=(0,hn.Z)(this.messageInputField.input,!0,!1);if(t){const e=this.editMessage;if(!o.trim()&&!e.media)return void new Ts.Z(s,[t],i.type);this.managers.appMessagesManager.editMessage(e,o,{entities:r,noWebPage:n}),this.onMessageSent()}else o.trim()&&(this.managers.appMessagesManager.sendText(s,o,Object.assign(Object.assign({entities:r},a),{noWebPage:n,webPage:this.getWebPagePromise?void 0:this.willSendWebPage,clearDraft:!0})),"scheduled"===this.chat.type?this.onMessageSent(!0):this.onMessageSent(!1,!1));if(this.forwarding){const e=(0,ba.Z)(this.forwarding);for(const t in e)this.managers.appMessagesManager.forwardMessages(s,t.toPeerId(),e[t],Object.assign(Object.assign({},a),{dropAuthor:this.forwardElements&&this.forwardElements.hideSender.checkboxField.checked,dropCaptions:this.isDroppingCaptions()})).catch((e=>Ba(this,void 0,void 0,(function*(){"VOICE_MESSAGES_FORBIDDEN"===e.type&&(0,ye.bC)({langPackKey:"Chat.SendVoice.PrivacyError",langPackArguments:[yield(0,Vt.Z)({peerId:s})]})}))));o||this.onMessageSent()}}sendMessageWithDocument(e,t=!1,i=!1,s=!1){return Ba(this,void 0,void 0,(function*(){const n="sticker"===(e=yield this.managers.appDocsManager.getDoc(e)).type?"send_stickers":"gif"===e.type?"send_gifs":"send_media";return this.chat.peerId.isAnyChat()&&!(yield this.chat.canSend(n))?((0,ye.Am)(Na),!1):"scheduled"!==this.chat.type||t?!(!e||e.sticker&&(0,zi.Z)(e)&&!d.Z.premium||(this.managers.appMessagesManager.sendFile(this.chat.peerId,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{file:e,isMedia:!0,clearDraft:i,silent:s})),this.onMessageSent(i,!0),"sticker"===e.type&&this.managers.appStickersManager.saveRecentSticker(e.id),0)):(this.scheduleSending((()=>this.sendMessageWithDocument(e,!0,i,s))),!1)}))}canToggleHideAuthor(){const{forwardElements:e}=this;if(!e)return!1;const t=e.hideCaption.checkboxField;return!t.checked||(0,be.Z)(t.label,"FORM").classList.contains("hide")}isDroppingCaptions(){return!this.canToggleHideAuthor()}initMessageEditing(e){return Ba(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);let i=(0,La.Z)(t.message,{entities:t.totalEntities,wrappingForPeerId:this.chat.peerId});const s=()=>Ba(this,void 0,void 0,(function*(){const n=yield(0,G.Z)({message:t,usingMids:[t.mid]});this.setTopInfo("edit",s,(0,C.ag)("AccDescrEditing"),n,i,t),this.editMsgId=e,this.editMessage=t,i=void 0}));s()}))}initMessagesForward(e){const t=()=>Ba(this,void 0,void 0,(function*(){const i=Object.keys(e).map((e=>e.toPeerId())),s=new Set;let n=0,a=0;const o=i.map((t=>Ba(this,void 0,void 0,(function*(){const i=e[t],o=i.map((e=>Ba(this,void 0,void 0,(function*(){var i;const n=yield this.managers.appMessagesManager.getMessageByPeer(t,e);!(null===(i=n.fwd_from)||void 0===i?void 0:i.from_name)||n.fromId||n.fwdFromId?s.add("P"+n.fromId):s.add("N"+n.fwd_from.from_name),n.media&&n.message&&++a}))));yield Promise.all(o),n+=i.length}))));yield Promise.all(o);const r=s.size>2,l=[...s].map((e=>{const t=e[0];if(e=e.slice(1),"P"===t){const t=e.toPeerId();return t===d.Z.myId?(0,C.ag)("Chat.Accessory.Forward.You"):new B.Z({peerId:t,dialog:!1,onlyFirstName:r}).element}return r?e.split(" ")[0]:e})),{forwardElements:c}=this;(0,be.Z)(c.showCaption.checkboxField.label,"FORM").classList.toggle("hide",!a);const h=c.hideCaption.checkboxField.checked;a&&h?c.hideSender.checkboxField.setValueSilently(!0):void 0!==this.forwardWasDroppingAuthor&&(this.forwardWasDroppingAuthor?c.hideSender:c.showSender).checkboxField.setValueSilently(!0);const u=c.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden",p=(0,C.ag)(u,[n]),f=document.createDocumentFragment();let m,g;if(l.length<3?f.append(...(0,C.v_)(l,!1)):f.append(l[0],(0,C.ag)("AndOther",[l.length-1])),1===i.length){const t=i[0],s=e[t];if(m=yield this.managers.appMessagesManager.getMessageByPeer(t,s[0]),g=!!m.grouped_id,g){const e=yield this.managers.appMessagesManager.getMidsByMessage(m);(e.length!==n||e.find((e=>!s.includes(e))))&&(g=!1)}}const v=document.createDocumentFragment();if(g||1===n){const t=e[i[0]],s=yield(0,G.Z)({message:m,usingMids:t});v.append(f,": ",s)}else v.append((0,C.ag)("Chat.Accessory.Forward.From"),": ",f);const b=this.setTopInfo("forward",t,p,v);c.modifyArgs.forEach(((e,t)=>{const s=e.textElement,n=C.ZP.weakMap.get(s);n.args=[t<2?i.length:a],n.update()})),this.forwardHover&&this.forwardHover.attachButtonListener(b,this.listenerSetter),this.forwarding=e}));t()}initMessageReply(e){return Ba(this,void 0,void 0,(function*(){if(this.replyToMsgId===e)return;let t=yield this.chat.getMessage(e);const i=()=>{let s;t?s=new B.Z({peerId:t.fromId,dialog:!1}).element:(s=(0,C.ag)("Loading"),this.managers.appMessagesManager.reloadMessages(this.chat.peerId,e).then((s=>{this.replyToMsgId===e&&(t=s,t?i():this.clearHelper("reply"))}))),this.setTopInfo("reply",i,s,t&&t.message,void 0,t),this.setReplyToMsgId(e)};i()}))}setReplyToMsgId(e){this.replyToMsgId=e,this.center(!0)}clearHelper(e){"edit"===this.helperType&&"edit"!==e&&this.clearInput(),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null),"reply"!==e&&(this.setReplyToMsgId(void 0),this.forwarding=void 0),this.editMsgId=this.editMessage=void 0,this.helperType=this.helperFunc=void 0,this.chat.container.classList.contains("is-helper-active")&&(Dn.Z.removeByType("input-helper"),this.chat.container.classList.remove("is-helper-active"),this.t())}t(){const e="is-toggling-helper";(0,Fe.Z)({element:this.chat.container,className:e,forwards:!0,duration:150,onTransitionEnd:()=>{this.chat.container.classList.remove(e)}})}setInputValue(e,t=!0,i=!0){e||(e=""),t?this.clearInput(!1,!1,e):this.messageInputField.setValueSilently(e),(0,pe.T2)((()=>{i&&(0,Nt.Z)(this.messageInput),this.onMessageInput(),this.messageInput.scrollTop=this.messageInput.scrollHeight}))}setTopInfo(e,t,i="",s="",n,a){if(this.willSendWebPage&&"reply"===e)return;"webpage"!==e&&(this.clearHelper(e),this.helperType=e,this.helperFunc=t);const o=this.replyElements.container,r=o.lastElementChild.previousElementSibling,d=r.classList.contains("reply");this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn=(0,On.Z)(("webpage"===e?"link":e)+" active reply-icon",{noRipple:!0}));const{container:l}=X(i,s,this.chat.animationGroup,a);return d?r.replaceWith(l):o.insertBefore(l,o.lastElementChild),"webpage"===e&&(l.style.cursor="default"),this.chat.container.classList.contains("is-helper-active")||(this.chat.container.classList.add("is-helper-active"),this.t()),T.IS_MOBILE||Dn.Z.pushItem({type:"input-helper",onPop:()=>{this.onHelperCancel()}}),void 0!==n&&this.setInputValue(n),setTimeout((()=>{this.updateSendBtn()}),0),l}}Oa.AUTO_COMPLETE_REG_EXP=/(\s|^)((?:(?:@|^\/)\S*)|(?::|^[^:@\/])(?!.*[:@\/]).*)$/;var Ua=i(6054);const Ha="pinned-container";class za{constructor(e){this.floating=!1,(0,Rn.Z)(this,e);const{divAndCaption:t,className:i}=this;t.container.classList.add(Ha,"hide"),t.title.classList.add(Ha+"-title"),t.subtitle.classList.add(Ha+"-subtitle"),t.content.classList.add(Ha+"-content"),this.btnClose=document.createElement("button"),this.btnClose.classList.add(Ha+"-close",`pinned-${i}-close`,"btn-icon","tgico-close"),this.wrapper=document.createElement("div"),this.wrapper.classList.add(Ha+"-wrapper"),(0,x.Z)(this.wrapper),this.wrapperUtils=document.createElement("div"),this.wrapperUtils.classList.add(Ha+"-wrapper-utils"),this.wrapperUtils.append(this.btnClose),this.wrapper.append(...Array.from(t.container.children),this.wrapperUtils),t.container.append(this.wrapper),this.attachOnCloseEvent(this.btnClose)}attachOnCloseEvent(e){(0,S.fc)(e,(e=>{(0,Ce.Z)(e),((this.onClose?this.onClose():null)||Promise.resolve(!0)).then((e=>{e&&this.toggle(!0)}))}),{listenerSetter:this.listenerSetter})}toggle(e){const t=this.divAndCaption.container.classList.contains("hide");if(void 0===e)e=!t;else if(e===t)return;const i=(this.floating||o.Z.isMobile)&&!e;this.divAndCaption.container.classList.toggle("is-floating",i),this.divAndCaption.container.classList.toggle("hide",e),this.topbar.container.classList.toggle("is-pinned-floating",i),this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`,!e),this.topbar.setFloating(),this.topbar.setUtilsWidth()}isVisible(){return!this.divAndCaption.container.classList.contains("hide")}isFloating(){return this.divAndCaption.container.classList.contains("is-floating")}fill(e,t,i){this.divAndCaption.container.dataset.peerId=""+i.peerId,this.divAndCaption.container.dataset.mid=""+i.mid,this.divAndCaption.fill(e,t,i),this.topbar.setUtilsWidth()}}var ja,Ga=i(7207),Va=i(8427);class Ka extends za{constructor(e,t,i){super({topbar:e,chat:t,listenerSetter:e.listenerSetter,className:"audio",divAndCaption:new j("pinned-audio",((e,t)=>{(0,U.Z)(this.divAndCaption.title,e),(0,U.Z)(this.divAndCaption.subtitle,t)})),onClose:()=>{ma.Z.stop()},floating:!0}),this.topbar=e,this.chat=t,this.managers=i,this.onPlaybackParams=e=>{this.fasterEl.classList.toggle("active",e.playbackRate>1),this.repeatEl.classList.remove("tgico-audio_repeat","tgico-audio_repeat_single"),this.repeatEl.classList.add(e.loop?"tgico-audio_repeat_single":"tgico-audio_repeat"),this.repeatEl.classList.toggle("active",e.loop||e.round)},this.onPause=()=>{this.toggleEl.classList.remove("flip-icon")},this.onStop=()=>{this.toggle(!0)},this.onMediaPlay=({doc:e,message:t,media:i,playbackParams:s})=>{var n,a;let o,r;const d="voice"!==e.type&&"round"!==e.type;if(d){const t=e.attributes.find((e=>"documentAttributeAudio"===e._));o=(0,R.Z)(null!==(a=null==t?void 0:t.title)&&void 0!==a?a:e.file_name),r=(null==t?void 0:t.performer)?(0,R.Z)(t.performer):(0,C.ag)("AudioUnknownArtist")}else o=new B.Z({peerId:t.fromId,fromName:null===(n=t.fwd_from)||void 0===n?void 0:n.from_name}).element,r=(0,A.OD)(t.date);this.fasterEl.classList.toggle("hide",d),this.repeatEl.classList.toggle("hide",!d),this.onPlaybackParams(s),this.volumeSelector.setVolume(),this.progressLine.setMedia(i),this.fill(o,r,t),this.toggleEl.classList.toggle("flip-icon",!i.paused),this.toggle(!1)},this.divAndCaption.border.remove();const s=(0,On.Z)("fast_rewind active",{noRipple:!0}),n=(0,On.Z)("fast_forward active",{noRipple:!0}),a=(e,t)=>{(0,S.fc)(e,(e=>{(0,Ce.Z)(e),t()}),{listenerSetter:this.topbar.listenerSetter})};a(s,(()=>{ma.Z.previous()})),a(n,(()=>{ma.Z.next()})),this.toggleEl=(0,On.Z)("",{noRipple:!0}),this.toggleEl.classList.add("active","pinned-audio-ico","tgico"),a(this.toggleEl,(()=>{ma.Z.toggle()})),this.wrapper.prepend(this.wrapper.firstElementChild,s,this.toggleEl,n),this.volumeSelector=new Va.Z(this.listenerSetter,!0);const o=document.createElement("div");o.classList.add("progress-line-container"),o.append(this.volumeSelector.container);const r=document.createElement("div");r.classList.add("pinned-audio-volume-tunnel"),this.volumeSelector.btn.classList.add("pinned-audio-volume","active"),this.volumeSelector.btn.prepend(r),this.volumeSelector.btn.append(o),this.repeatEl=(0,On.Z)("audio_repeat",{noRipple:!0}),a(this.repeatEl,(()=>{const e=ma.Z.getPlaybackParams();e.round?e.loop?(ma.Z.round=!1,ma.Z.loop=!1):ma.Z.loop=!ma.Z.loop:ma.Z.round=!0}));const d=this.fasterEl=(0,On.Z)("playback_2x",{noRipple:!0});a(d,(()=>{ma.Z.playbackRate=d.classList.contains("active")?1:1.75})),this.wrapperUtils.prepend(this.volumeSelector.btn,d,this.repeatEl);const l=document.createElement("div");l.classList.add("pinned-audio-progress-wrapper"),this.progressLine=new Ga.Z(void 0,void 0,!0,!0),this.progressLine.container.classList.add("pinned-audio-progress"),l.append(this.progressLine.container),this.wrapper.insertBefore(l,this.wrapperUtils),this.topbar.listenerSetter.add(ma.Z)("play",this.onMediaPlay),this.topbar.listenerSetter.add(ma.Z)("pause",this.onPause),this.topbar.listenerSetter.add(ma.Z)("stop",this.onStop),this.topbar.listenerSetter.add(ma.Z)("playbackParams",this.onPlaybackParams);const c=ma.Z.getPlayingDetails();c&&(this.onMediaPlay(c),this.onPlaybackParams(c.playbackParams))}destroy(){this.progressLine&&this.progressLine.removeListeners()}}!function(e){e[e.ONE=32]="ONE",e[e.TWO=15]="TWO",e[e.THREE=10]="THREE",e[e.FOUR=8]="FOUR",e[e.MORE=8]="MORE"}(ja||(ja={}));const Wa="pinned-message-border";class $a{constructor(){this.drawRect=(e,t,i,s,n)=>`M${e},${t+n}a${n},${n},0,0,1,${i},0v${s-2*n}a${n},${n},0,0,1,${-i},0Z`,this.getClipPath=(e,t,i)=>{let s="";if(2===i)s=this.drawRect(0,0,2,t,1)+this.drawRect(0,t+2,2,t,1);else for(let e=0;e{let i;return e<=1?i=ja.ONE:2===e?i=ja.TWO:3===e?i=ja.THREE:4===e?i=ja.FOUR:e>3&&(i=ja.MORE),i},this.getMarkHeight=(e,t)=>{let i;return e<=1?i=ja.ONE:2===e?i=ja.TWO:3===e?i=ja.THREE:4===e?i=ja.FOUR:e>3&&(i=ja.MORE),i},this.getMarkTranslateY=(e,t,i)=>1===i?0:2===i?e?t+1:0:3===i?e?1===e?t+1:2*t+2+1:0:(t+1)*e,this.getTrackTranslateY=(e,t,i,s)=>t<=4||e<=1?0:e>=t-2?s-ja.ONE-i:(e-2)*i+1*e,this.getTrackHeight=(e,t)=>e<=3?ja.ONE:t*e+1*(e-1)}render(e,t){if(this.border||(this.border=document.createElement("div"),this.border.classList.add(Wa),this.wrapper=document.createElement("div"),this.border.append(this.wrapper)),1===e)return this.count!==e&&(this.wrapper.className=Wa+"-wrapper-1",this.border.classList.remove(Wa+"-mask"),this.wrapper.innerHTML=this.wrapper.style.cssText=""),this.border;const i=this.getBarHeight(e,t),s=this.getMarkHeight(e,t),n=this.getTrackHeight(e,i),a=`clipPath_${e}`,o=this.getClipPath(a,i,e),r=this.getMarkTranslateY(t,i,e),d=this.getTrackTranslateY(t,e,i,n);return this.border.classList.toggle(Wa+"-mask",e>4),t<=1?(this.border.classList.add("mask-bottom"),this.border.classList.remove("mask-top")):t>=e-2?(this.border.classList.add("mask-top"),this.border.classList.remove("mask-bottom")):this.border.classList.add("mask-top","mask-bottom"),this.wrapper.className=Wa+"-wrapper",this.wrapper.style.cssText=`clip-path: url(#${a}); width: 2px; height: ${n}px; transform: translateY(-${d}px);`,this.svg||(this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.setAttributeNS(null,"height","0"),this.svg.setAttributeNS(null,"width","0"),this.defs=document.createElementNS("http://www.w3.org/2000/svg","defs"),this.defs.append(o),this.svg.append(this.defs),this.mark=document.createElement("div"),this.mark.classList.add(Wa+"-mark")),this.svg.parentElement||this.wrapper.append(this.svg,this.mark),this.mark.style.cssText=`height: ${s}px; transform: translateY(${r}px);`,this.count=e,this.index=t,this.border}}var qa=i(6724),Qa=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Ya{constructor(){this.rows={},this.container=document.createElement("div"),this.container.className=Ya.BASE_CLASS}getRow(e,t=!1){if(this.rows[e])return this.rows[e].element;const i=document.createElement("div"),s=!Object.keys(this.rows).length&&!t;return i.className=Ya.BASE_CLASS+"-row"+(s?"":" is-hiding hide"),this.rows[e]={element:i,new:!0},this.container.append(i),i}clearRow(e){this.rows[e]&&(this.rows[e].element.remove(),delete this.rows[e])}clearRows(e){this.clearTimeout&&clearTimeout(this.clearTimeout),this.clearTimeout=window.setTimeout((()=>{for(const t in this.rows)+t!==e&&this.clearRow(+t)}),Ya.DURATION)}setNewRow(e,t=!1){const i=this.rows[e];i.new&&(t?(i.element.classList.remove("hide"),i.element.offsetLeft):i.element.classList.remove("is-hiding","hide"),delete i.new),this.clearRows(e)}animate(e,t,i=e>t,s=!1){if(e===t)return this.setNewRow(e);const n=this.rows[e],a=this.rows[t];if(!a&&!s)return this.setNewRow(e);const o=["from-top","from-bottom"];i||o.reverse(),n.element.classList.add(o[0]),n.element.classList.remove(o[1]),a&&(a.element.classList.add(o[1]),a.element.classList.remove(o[0])),n.new&&this.setNewRow(e,!0),n.element.classList.toggle("is-hiding",!1),a&&a.element.classList.toggle("is-hiding",!0),this.clearRows(e)}}Ya.DURATION=200,Ya.BASE_CLASS="animated-super";class Xa{constructor(e=!1){this.reverse=e,this.decimals=[],this.previousNumber=0,this.container=document.createElement("div"),this.container.className=Xa.BASE_CLASS}getDecimal(e){if(this.decimals[e])return this.decimals[e];const t=document.createElement("div");t.className=Xa.BASE_CLASS+"-decimal";const i=document.createElement("div");i.className=Xa.BASE_CLASS+"-decimal-placeholder";const s=new Ya;return s.container.className=Xa.BASE_CLASS+"-decimal-wrapper",t.append(i,s.container),this.container.append(t),this.decimals[e]={container:t,placeholder:i,animatedSuper:s}}clear(e){this.clearTimeout&&clearTimeout(this.clearTimeout);const t=(""+e).length;t>=this.decimals.length||(this.clearTimeout=window.setTimeout((()=>{this.decimals.splice(t,this.decimals.length-t).forEach((e=>{e.container.remove()}))}),Ya.DURATION))}hideLeft(e){const t=(""+e).length;this.decimals.slice(t).forEach((t=>{const i=+t.placeholder.innerText||0;t.animatedSuper.getRow(Xa.EMPTY_INDEX,!0),t.animatedSuper.animate(Xa.EMPTY_INDEX,i,this.reverse?ethis.previousNumber,!0)})),this.clear(e)}setCount(e){const t=Array.from(""+this.previousNumber).map((e=>+e));Array.from(""+e).map((e=>+e)).forEach(((i,s)=>{var n;const a=this.getDecimal(s),o=a.animatedSuper.getRow(i,!0),r=null!==(n=t[s])&&void 0!==n?n:Xa.EMPTY_INDEX;o.innerText=a.placeholder.innerText=""+i,a.animatedSuper.animate(i,r,this.reverse?ethis.previousNumber,!0)})),this.hideLeft(e),this.previousNumber=e}}Xa.EMPTY_INDEX=-1,Xa.BASE_CLASS="animated-counter";class Ja{constructor(e,t,i){this.topbar=e,this.chat=t,this.managers=i,this.pinnedMaxMid=0,this.pinnedMid=0,this.pinnedIndex=-1,this.wasPinnedIndex=0,this.wasPinnedMediaIndex=0,this.locked=!1,this.waitForScrollBottom=!1,this.count=0,this.mids=[],this.offsetIndex=0,this.loading=!1,this.loadedBottom=!1,this.loadedTop=!1,this.scrollDownListenerSetter=null,this.hidden=!1,this.getCurrentIndexPromise=null,this.listenerSetter=new le.Z,this.log=(0,r.kg)("PM"),this.debug=!0,this.isStatic=!1;const s=new Y("pinned-message",t.animationGroup);this.pinnedMessageContainer=new za({topbar:e,chat:t,listenerSetter:this.listenerSetter,className:"message",divAndCaption:s,onClose:()=>Qa(this,void 0,void 0,(function*(){return(yield i.appPeersManager.canPinMessage(this.chat.peerId))?new As(this.chat.peerId,this.pinnedMid,!0):new As(this.chat.peerId,0,!0),!1}))}),this.pinnedMessageBorder=new $a,s.border.replaceWith(this.pinnedMessageBorder.render(1,0)),this.animatedSubtitle=new Ya,s.subtitle.append(this.animatedSubtitle.container),this.animatedMedia=new Ya,this.animatedMedia.container.classList.add("pinned-message-media-container"),s.content.prepend(this.animatedMedia.container),this.animatedCounter=new Xa(!0),s.title.append((0,C.ag)("PinnedMessage")," ",this.animatedCounter.container);const n=this.pinnedMessageContainer.btnClose.cloneNode(!0);this.pinnedMessageContainer.attachOnCloseEvent(n),s.container.prepend(n),this.btnOpen=(0,On.Z)("pinlist pinned-container-close pinned-message-pinlist",{noRipple:!0}),this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen),(0,S.fc)(this.btnOpen,(e=>{(0,Ce.Z)(e),this.topbar.openPinned(!0)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e})=>{e===this.chat.peerId&&(this.hidden&&this.pinnedMessageContainer.toggle(this.hidden=!1),this.loadedTop=this.loadedBottom=!1,this.pinnedIndex=-1,this.pinnedMid=0,this.count=0,this.mids=[],this.offsetIndex=0,this.pinnedMaxMid=0,this.setCorrectIndex(0))})),this.listenerSetter.add(d.Z)("peer_pinned_hidden",(({peerId:e})=>{e===this.chat.peerId&&this.pinnedMessageContainer.toggle(this.hidden=!0)})),this.setPinnedMessage=(0,Ze.Z)((()=>this._setPinnedMessage()),100,!0,!0),this.setCorrectIndexThrottled=(0,qa.Z)(this.setCorrectIndex.bind(this),100,!1),this.isStatic=!this.chat.isPinnedMessagesNeeded()}destroy(){this.pinnedMessageContainer.divAndCaption.container.remove(),this.pinnedMessageContainer.toggle(!0),this.listenerSetter.removeAll(),this.unsetScrollDownListener(!1)}setCorrectIndex(e){if(this.isStatic)return;if(this.locked||this.hidden)return;if((this.loadedBottom||this.loadedTop)&&!this.count)return;const t=this.chat.bubbles.getBubbleByPoint("bottom");if(!t)return;const i=t.dataset.mid;t&&void 0!==i&&this.testMid(+i,e)}testMid(e,t){if(this.isStatic)return;if(this.hidden)return;let i=this.mids.findIndex((t=>t<=e));if(-1===i||this.isNeededMore(i)){if(!(this.loadedTop&&ei))return;this.pinnedIndex=i,this.pinnedMid=this.mids.find((t=>t<=e))||this.mids[this.mids.length-1],this.setPinnedMessage()}}isNeededMore(e){return this.count>Ja.LOAD_COUNT&&(!this.loadedBottom&&e<=Ja.LOAD_OFFSET||!this.loadedTop&&this.count-1-e<=Ja.LOAD_OFFSET)}getCurrentIndex(e,t=!0){return Qa(this,void 0,void 0,(function*(){if(!this.loading){this.loading=!0;try{const i=this.debug?this.log.bindPrefix("getCurrentIndex"):void 0;i&&i("start",e,t);let s=!1;const n=[this.managers.appMessagesManager.getSearch({peerId:this.chat.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:Ja.LOAD_COUNT,backLimit:Ja.LOAD_COUNT,threadId:this.chat.threadId}).then((e=>(s=!0,e)))];if(!this.pinnedMaxMid){const e=this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId,this.chat.threadId).then((e=>{e.maxId&&(this.pinnedMaxMid=e.maxId,!s&&t&&(this.mids=[this.pinnedMaxMid],this.count=e.count,this.pinnedIndex=0,this.pinnedMid=this.mids[0],this.setPinnedMessage()))}));n.push(e)}const a=(yield Promise.all(n))[0];let o=a.history.findIndex((t=>t.mid<=e));-1===o&&(o=a.history.length),this.offsetIndex=a.offset_id_offset?a.offset_id_offset-o:0,this.mids=a.history.map((e=>e.mid)).slice(),this.count=a.count,this.count||this.pinnedMessageContainer.toggle(!0),this.loadedTop=this.offsetIndex+this.mids.length===this.count,this.loadedBottom=!this.offsetIndex,i&&i("result",e,a,o,this.offsetIndex,this.loadedTop,this.loadedBottom)}catch(e){this.log.error("getCurrentIndex error",e)}this.loading=!1,this.locked?this.testMid(e):t&&this.setCorrectIndex(0),this.getCurrentIndexPromise=null}}))}setScrollDownListener(){this.waitForScrollBottom=!0,this.scrollDownListenerSetter||(this.scrollDownListenerSetter=new le.Z,function(e,t,i,s){if(c.Z){let t;const n={passive:!0};s.add(e)("touchstart",(i=>{i.touches.length>1?o():(t=i.touches[0].clientY,s.add(e)("touchmove",a,n),s.add(e)("touchend",o,n))}),n);const a=e=>{const s=e.touches[0].clientY,n=s{s.removeManual(e,"touchmove",a,n),s.removeManual(e,"touchend",o,n)}}else s.add(e)("wheel",(e=>{const t=e.deltaY>0;!t||i()}),{passive:!0})}(this.chat.bubbles.scrollable.container,0,(()=>{this.unsetScrollDownListener()}),this.scrollDownListenerSetter))}unsetScrollDownListener(e=!0){this.waitForScrollBottom=!1,this.scrollDownListenerSetter&&(this.scrollDownListenerSetter.removeAll(),this.scrollDownListenerSetter=null),e&&this.setCorrectIndex(0)}handleFollowingPinnedMessage(){return Qa(this,void 0,void 0,(function*(){this.locked=!0,this.debug&&this.log("handleFollowingPinnedMessage");try{this.setScrollDownListener();const e=this.chat.setPeerPromise;e instanceof Promise&&(yield e),yield(0,ue.e9)(),this.getCurrentIndexPromise&&(yield this.getCurrentIndexPromise),this.debug&&this.log("handleFollowingPinnedMessage: unlock"),this.locked=!1}catch(e){this.log.error("handleFollowingPinnedMessage error:",e),this.locked=!1,this.waitForScrollBottom=!1,this.setCorrectIndex(0)}}))}followPinnedMessage(e){return Qa(this,void 0,void 0,(function*(){(yield this.chat.getMessage(e))&&(this.chat.setMessageId(e),(this.chat.setPeerPromise||Promise.resolve()).then((()=>{this.handleFollowingPinnedMessage(),this.testMid(this.pinnedIndex>=this.count-1?this.pinnedMaxMid:e-1)})))}))}_setPinnedMessage(){return Qa(this,void 0,void 0,(function*(){const e=this.count;if(e){const t=this.pinnedIndex,i=yield this.chat.getMessage(this.pinnedMid),s=0===t;this.animatedCounter.container.classList.toggle("is-last",s),s||this.animatedCounter.setCount(e-t),this.pinnedMessageContainer.toggle(!1);const n=t>this.wasPinnedIndex;this.debug&&this.log("setPinnedMessage: fromTop",n,t,this.wasPinnedIndex);const a=this.animatedSubtitle.getRow(t),o=this.animatedMedia.getRow(t);o.classList.add("pinned-message-media");const r=[],d=yield Q({title:void 0,titleEl:null,subtitle:i.message,subtitleEl:a,message:i,mediaEl:o,loadPromises:r,animationGroup:this.chat.animationGroup});yield Promise.all(r),this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-media",d),this.animatedSubtitle.animate(t,this.wasPinnedIndex),d?(this.animatedMedia.animate(t,this.wasPinnedMediaIndex),this.wasPinnedMediaIndex=t):this.animatedMedia.clearRows(),this.pinnedMessageBorder.render(e,e-t-1),this.wasPinnedIndex=t,this.pinnedMessageContainer.divAndCaption.container.dataset.mid=""+i.mid}else this.pinnedMessageContainer.toggle(!0),this.wasPinnedIndex=0;this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-many",this.count>1)}))}}Ja.LOAD_COUNT=50,Ja.LOAD_OFFSET=5;var eo=i(6194),to=i(2995),io=i(4240),so=i(6818),no=i(3897),ao=i(7120),oo=i(2059),ro=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class lo{constructor(e,t,i){this.chat=e,this.appSidebarRight=t,this.managers=i,this.verifyButtons=e=>{const t=!!e||!(!this.btnMore||!this.btnMore.classList.contains("menu-open"));e&&(0,Ce.Z)(e),(()=>{ro(this,void 0,void 0,(function*(){const e=this.buttonsToVerify.concat(t?this.menuButtons:[]);(yield Promise.all(e.map((e=>ro(this,void 0,void 0,(function*(){return{result:yield e.verify(),button:e}})))))).forEach((({button:e,result:t})=>{e.element.classList.toggle("hide",!t)}))}))})()},this.verifyVideoChatButton=e=>ro(this,void 0,void 0,(function*(){var t;if(!so.Z||this.peerId.isUser()||"chat"!==this.chat.type||this.chat.threadId)return!1;const i=oo.ZP.groupCall,s=this.peerId.toChatId();if((null==i?void 0:i.chatId)===s)return!1;if(e&&((yield this.managers.appPeersManager.isBroadcast(this.peerId))&&"group"===e||(yield this.managers.appPeersManager.isAnyGroup(this.peerId))&&"broadcast"===e))return!1;const n=yield this.managers.appChatsManager.getChat(s);return(null===(t=n.pFlags)||void 0===t?void 0:t.call_active)||(0,ao.Z)(n,"manage_call")})),this.verifyCallButton=e=>ro(this,void 0,void 0,(function*(){if(!Oe.Z||!this.peerId.isUser())return!1;const t=this.peerId.toUserId(),i=yield this.managers.appProfileManager.getCachedFullUser(t);return!!i&&!!("voice"===e?i.pFlags.phone_calls_available:i.pFlags.video_calls_available)})),this.onJoinGroupCallClick=()=>{this.chat.appImManager.joinGroupCall(this.peerId)},this.onMuteClick=()=>{new no.Z(this.peerId)},this.onResize=()=>{this.setUtilsWidth(!0),this.setFloating()},this.onChangeScreen=(e,t)=>{this.container.classList.toggle("is-pinned-floating",o.Z.isMobile),this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-floating",t===o._.mobile),this.onResize()},this.setUtilsWidth=(e=!1)=>{this.setUtilsRAF&&window.cancelAnimationFrame(this.setUtilsRAF),T.IS_SAFARI&&e&&this.chatUtils.classList.add("hide"),this.setUtilsRAF=window.requestAnimationFrame((()=>{T.IS_SAFARI&&e&&this.chatUtils.classList.remove("hide");const t=this.chatUtils.getBoundingClientRect().width;this.chat.log("utils width:",t),this.container.style.setProperty("--utils-width",t+"px"),this.setUtilsRAF=0}))},this.setFloating=()=>{var e;const t=[this.chatAudio,null===(e=this.pinnedMessage)||void 0===e?void 0:e.pinnedMessageContainer].filter(Boolean).reduce(((e,t)=>{const i=t.isFloating();return this.container.classList.toggle(`is-pinned-${t.className}-floating`,i),t.isVisible()?e+ +i:e}),0);this.container.dataset.floating=""+t},this.setPeerStatusManual=(e=!1)=>ro(this,void 0,void 0,(function*(){if(!this.subtitle||"chat"!==this.chat.type)return;if(this.chat.threadId){const e=yield(0,Vt.Z)({peerId:this.peerId,dialog:!0}),t=(0,C.ag)("TopicProfileStatus",[e]);return()=>(0,U.Z)(this.subtitle,t)}const t=this.peerId;return this.chat.appImManager.setPeerStatus({peerId:t,element:this.subtitle,needClear:e,useWhitespace:!1,middleware:()=>t===this.peerId})})),this.setPeerStatus=e=>this.setPeerStatusManual(e).then((e=>{null==e||e()})),this.listenerSetter=new le.Z,this.menuButtons=[],this.buttonsToVerify=[]}construct(){this.container=document.createElement("div"),this.container.classList.add("sidebar-header","topbar","hide"),this.container.dataset.floating="0",this.btnBack=(0,On.Z)("left sidebar-close-button",{noRipple:!0}),this.chatInfoContainer=document.createElement("div"),this.chatInfoContainer.classList.add("chat-info-container"),this.chatInfo=document.createElement("div"),this.chatInfo.classList.add("chat-info");const e=this.person=document.createElement("div");e.classList.add("person");const t=document.createElement("div");t.classList.add("content");const i=document.createElement("div");i.classList.add("top"),this.title=document.createElement("div"),this.title.classList.add("user-title"),i.append(this.title);const s=document.createElement("div");s.classList.add("bottom"),this.subtitle&&s.append(this.subtitle),t.append(i,s),this.avatarElement&&e.append(this.avatarElement),e.append(t),this.chatInfo.append(e),this.chatUtils=document.createElement("div"),this.chatUtils.classList.add("chat-utils"),this.chatAudio=new Ka(this,this.chat,this.managers),this.menuButtons.length&&(this.btnMore=(0,Un.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:this.menuButtons,onOpen:(e,t)=>ro(this,void 0,void 0,(function*(){const e=this.menuButtons[this.menuButtons.length-1];if(null==e?void 0:e.element){const t=yield this.managers.appPeersManager.getDeleteButtonText(this.peerId);e.element.lastChild.replaceWith((0,C.ag)(t))}}))})),this.chatUtils.append(...[this.pinnedMessage?this.pinnedMessage.pinnedMessageContainer.divAndCaption.container:null,this.btnJoin,this.btnPinned,this.btnCall,this.btnGroupCall,this.btnMute,this.btnSearch,this.btnMore].filter(Boolean)),this.pushButtonToVerify(this.btnCall,this.verifyCallButton.bind(this,"voice")),this.pushButtonToVerify(this.btnGroupCall,this.verifyVideoChatButton),this.chatInfoContainer.append(this.btnBack,this.chatInfo,this.chatUtils),this.container.append(this.chatInfoContainer),this.chatAudio&&this.container.append(this.chatAudio.divAndCaption.container),this.listenerSetter.add(window)("resize",this.onResize),this.listenerSetter.add(o.Z)("changeScreen",this.onChangeScreen),(0,S.fc)(this.container,(e=>{const t=(0,ve.Z)(e.target,"pinned-container");if((0,Vn.Z)(),t){if((0,Ce.Z)(e),(0,ve.Z)(e.target,"progress-line"))return;const i=+t.dataset.mid;if(t.classList.contains("pinned-message"))this.pinnedMessage.followPinnedMessage(i);else{const e=t.dataset.peerId.toPeerId(),s=ma.Z.getSearchContext();this.chat.appImManager.setInnerPeer({peerId:e,lastMsgId:i,type:s.isScheduled?"scheduled":s.threadId?"discussion":void 0,threadId:s.threadId})}}else o.Z.activeScreen===o._.medium&&document.body.classList.contains(n.ir)?r():(0,be.Z)(e.target,"AVATAR-ELEMENT")?this.appSidebarRight.toggleSidebar(!document.body.classList.contains(a.HQ)):this.appSidebarRight.toggleSidebar(!0)}),{listenerSetter:this.listenerSetter});const r=e=>{if(e&&(0,Ce.Z)(e),o.Z.activeScreen===o._.medium&&document.body.classList.contains(n.ir))this.chat.appImManager.setPeer({peerId:this.peerId});else{const e=0===this.chat.appImManager.chats.indexOf(this.chat);Dn.Z.back(e?"im":"chat")}};(0,S.fc)(this.btnBack,r,{listenerSetter:this.listenerSetter})}pushButtonToVerify(e,t){e&&this.buttonsToVerify.push({element:e,verify:t})}constructUtils(){this.menuButtons=[{icon:"search",text:"Search",onClick:()=>{this.chat.initSearch()},verify:()=>o.Z.isMobile},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>ro(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&d.Z.myId!==this.peerId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.chat.threadId}))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:()=>{this.managers.appMessagesManager.togglePeerMute({peerId:this.peerId,threadId:this.chat.threadId})},verify:()=>ro(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&d.Z.myId!==this.peerId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.chat.threadId}))}))},{icon:"comments",text:"ViewDiscussion",onClick:()=>{const e=this.chat.bubbles.getMiddleware();Promise.resolve(this.managers.appProfileManager.getChannelFull(this.peerId.toChatId())).then((t=>{e()&&t.linked_chat_id&&this.chat.appImManager.setInnerPeer({peerId:t.linked_chat_id.toPeerId(!0)})}))},verify:()=>ro(this,void 0,void 0,(function*(){const e=yield this.managers.appProfileManager.getCachedFullChat(this.peerId.toChatId());return"chat"===this.chat.type&&!!(null==e?void 0:e.linked_chat_id)}))},{icon:"phone",text:"Call",onClick:this.onCallClick.bind(this,"voice"),verify:this.verifyCallButton.bind(this,"voice")},{icon:"videocamera",text:"VideoCall",onClick:this.onCallClick.bind(this,"video"),verify:this.verifyCallButton.bind(this,"video")},{icon:"videochat",text:"PeerInfo.Action.LiveStream",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"broadcast")},{icon:"videochat",text:"PeerInfo.Action.VoiceChat",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"group")},{icon:"select",text:"Chat.Menu.SelectMessages",onClick:()=>{const e=this.chat.selection;e.toggleSelection(!0,!0),Sn.Z.getState().then((t=>{if(t.chatContextMenuHintWasShown)return;const i=e.toggleByElement.bind(e);e.toggleByElement=t=>ro(this,void 0,void 0,(function*(){this.managers.appStateManager.pushToState("chatContextMenuHintWasShown",!0),(0,ye.Am)((0,C.ag)("Chat.Menu.Hint")),e.toggleByElement=i,e.toggleByElement(t)}))}))},verify:()=>!this.chat.selection.isSelecting&&!!this.chat.bubbles.getRenderedLength()},{icon:"select",text:"Chat.Menu.ClearSelection",onClick:()=>{this.chat.selection.cancelSelection()},verify:()=>this.chat.selection.isSelecting},{icon:"adduser",text:"AddContact",onClick:()=>{if(!this.appSidebarRight.isTabExists(io.Z)){const e=this.appSidebarRight.createTab(io.Z);e.peerId=this.peerId,e.open(),this.appSidebarRight.toggleSidebar(!0)}},verify:()=>ro(this,void 0,void 0,(function*(){return this.peerId.isUser()&&!(yield this.managers.appPeersManager.isContact(this.peerId))}))},{icon:"forward",text:"ShareContact",onClick:()=>{const e=this.peerId;new to.Z({peerTypes:["dialogs","contacts"],onSelect:t=>new Promise(((i,s)=>{new xs.Z("",{titleLangKey:"SendMessageTitle",descriptionLangKey:"SendContactToGroupText",descriptionLangArgs:[new B.Z({peerId:t,dialog:!0}).element],buttons:[{langKey:"Send",callback:()=>{i(),this.managers.appMessagesManager.sendContact(t,e),this.chat.appImManager.setInnerPeer({peerId:t})}},{langKey:"Cancel",callback:()=>{s()},isCancel:!0}],peerId:t,overlayClosable:!0}).show()})),placeholder:"ShareModal.Search.Placeholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})},verify:()=>ro(this,void 0,void 0,(function*(){return d.Z.myId!==this.peerId&&this.peerId.isUser()&&(yield this.managers.appPeersManager.isContact(this.peerId))&&!!(yield this.managers.appUsersManager.getUser(this.peerId.toUserId())).phone}))},{icon:"bots",text:"Settings",onClick:()=>{this.managers.appMessagesManager.sendText(this.peerId,"/settings")},verify:()=>ro(this,void 0,void 0,(function*(){var e;try{const t=yield this.managers.appAttachMenuBotsManager.getAttachMenuBot(this.peerId.toUserId());return!!(null===(e=null==t?void 0:t.pFlags)||void 0===e?void 0:e.has_settings)}catch(e){return!1}}))},{icon:"lock",text:"BlockUser",onClick:()=>{new xs.Z("",{peerId:this.peerId,titleLangKey:"BlockUser",descriptionLangKey:"AreYouSureBlockContact2",descriptionLangArgs:[new B.Z({peerId:this.peerId}).element],buttons:[{langKey:"BlockUser",isDanger:!0,callback:()=>{this.managers.appUsersManager.toggleBlock(this.peerId,!0).then((e=>{e&&(0,ye.bC)({langPackKey:"UserBlocked"})}))}}]}).show()},verify:()=>ro(this,void 0,void 0,(function*(){var e;if(!this.peerId.isUser())return!1;const t=yield this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());return this.peerId!==d.Z.myId&&t&&!(null===(e=t.pFlags)||void 0===e?void 0:e.blocked)}))},{icon:"lockoff",text:"Unblock",onClick:()=>{this.managers.appUsersManager.toggleBlock(this.peerId,!1).then((e=>{e&&(0,ye.bC)({langPackKey:"UserUnblocked"})}))},verify:()=>ro(this,void 0,void 0,(function*(){var e;const t=yield this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());return!!(null===(e=null==t?void 0:t.pFlags)||void 0===e?void 0:e.blocked)}))},{icon:"delete danger",text:"Delete",onClick:()=>{new eo.Z(this.peerId)},verify:()=>ro(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&!!(yield this.managers.appMessagesManager.getDialogOnly(this.peerId))}))}],this.btnSearch=(0,On.Z)("search"),this.attachClickEvent(this.btnSearch,(e=>{this.chat.initSearch()}),!0)}attachClickEvent(e,t,i){(0,S.fc)(e,(e=>{(0,Ce.Z)(e),!i&&(0,Vn.Z)(),t(e)}),{listenerSetter:this.listenerSetter})}onCallClick(e){this.chat.appImManager.callUser(this.peerId.toUserId(),e)}constructAvatar(){const e=new f.Z;return e.isDialog=!0,e.classList.add("avatar-42","person-avatar"),e}get peerId(){return this.chat.peerId}constructPeerHelpers(){return this.avatarElement=this.constructAvatar(),this.subtitle=document.createElement("div"),this.subtitle.classList.add("info"),this.pinnedMessage=new Ja(this,this.chat,this.managers),this.btnJoin=(0,Ue.Z)("btn-primary btn-color-primary chat-join hide"),this.btnCall=(0,On.Z)("phone"),this.btnGroupCall=(0,On.Z)("videochat"),this.btnPinned=(0,On.Z)("pinlist"),this.btnMute=(0,On.Z)("mute"),this.attachClickEvent(this.btnCall,this.onCallClick.bind(this,"voice")),this.attachClickEvent(this.btnGroupCall,this.onJoinGroupCallClick),this.attachClickEvent(this.btnPinned,(()=>{this.openPinned(!0)})),this.attachClickEvent(this.btnMute,this.onMuteClick),this.attachClickEvent(this.btnJoin,(()=>ro(this,void 0,void 0,(function*(){const e=this.chat.bubbles.getMiddleware();this.btnJoin.setAttribute("disabled","true");const t=this.peerId.toChatId();let i;i=(yield this.managers.appChatsManager.isChannel(t))?this.managers.appChatsManager.joinChannel(t):this.managers.appChatsManager.addChatUser(t,d.Z.myId),i.finally((()=>{e()&&this.btnJoin.removeAttribute("disabled")}))})))),this.listenerSetter.add(d.Z)("chat_update",(e=>ro(this,void 0,void 0,(function*(){var t;if(this.peerId===e.toPeerId(!0)){const i=yield this.managers.appChatsManager.getChat(e);this.btnJoin.classList.toggle("hide",!(null===(t=null==i?void 0:i.pFlags)||void 0===t?void 0:t.left)),this.setUtilsWidth(),this.verifyButtons()}})))),this.listenerSetter.add(d.Z)("dialog_notify_settings",(e=>{e.peerId===this.peerId&&this.setMutedState()})),this.listenerSetter.add(d.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),this.listenerSetter.add(d.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),this.listenerSetter.add(d.Z)("peer_full_update",(e=>{this.peerId===e&&this.verifyButtons()})),this.chat.addEventListener("setPeer",((e,t)=>{const i=this.chat.bubbles.getMiddleware();Sn.Z.getState().then((s=>{i()&&this.pinnedMessage&&(this.pinnedMessage.hidden=!!s.hiddenPinnedMessages[this.chat.peerId],t?(this.pinnedMessage.unsetScrollDownListener(),this.pinnedMessage.testMid(e,0)):this.pinnedMessage.locked||(this.pinnedMessage.handleFollowingPinnedMessage(),this.pinnedMessage.testMid(e)))}))})),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e,mids:t})=>{"pinned"===this.chat.type&&e===this.peerId&&t&&this.setTitle()})),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4),this}openPinned(e){this.chat.appImManager.setInnerPeer({peerId:this.peerId,lastMsgId:e?+this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid:0,type:"pinned"})}destroy(){var e,t;this.listenerSetter.removeAll(),window.clearInterval(this.setPeerStatusInterval),null===(e=this.pinnedMessage)||void 0===e||e.destroy(),null===(t=this.chatAudio)||void 0===t||t.destroy(),delete this.chatAudio,delete this.pinnedMessage}cleanup(){this.chat.peerId||this.container.classList.add("hide")}finishPeerChange(e){var t;return ro(this,void 0,void 0,(function*(){const{peerId:e,threadId:i}=this.chat;let s;"chat"===this.chat.type&&(s=(null===(t=this.avatarElement)||void 0===t?void 0:t.peerId)!==this.peerId||this.avatarElement.threadId!==this.chat.threadId?this.constructAvatar():this.avatarElement);const[n,a,o,r,d,l,c]=yield Promise.all([this.managers.appPeersManager.isBroadcast(e),this.managers.appPeersManager.isAnyChat(e),e.isAnyChat()?this.managers.appChatsManager.getChat(e.toChatId()):void 0,s?s.updateWithOptions({peerId:e,threadId:i,wrapOptions:{customEmojiSize:(0,qe.C)(32,32)}}):void 0,this.setTitleManual(),this.setPeerStatusManual(!0),Sn.Z.getState()]);return()=>{var t,i;const r=!("pinned"===this.chat.type||"scheduled"===this.chat.type);this.btnMute&&this.btnMute.classList.toggle("hide",!n||!r),this.btnJoin&&(a&&!this.chat.isRestricted&&r?((0,U.Z)(this.btnJoin,(0,C.ag)(n?"Chat.Subscribe":"ChannelJoin")),this.btnJoin.classList.toggle("hide",!(null===(t=null==o?void 0:o.pFlags)||void 0===t?void 0:t.left))):this.btnJoin.classList.add("hide")),this.btnSearch&&this.btnSearch.classList.toggle("hide",!r),this.btnPinned&&this.btnPinned.classList.toggle("hide",!r),this.avatarElement!==s&&(s&&(this.avatarElement?this.avatarElement.replaceWith(s):this.person.prepend(s)),null===(i=this.avatarElement)||void 0===i||i.remove(),this.avatarElement=s),this.setUtilsWidth(),this.verifyButtons(),this.btnMore&&this.btnMore.classList.toggle("hide",!r);const h=this.chat.isPinnedMessagesNeeded();if(h||"discussion"===this.chat.type){if(this.chat.wasAlreadyUsed||!this.pinnedMessage){const e=new Ja(this,this.chat,this.managers);this.pinnedMessage?(this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(e.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage.destroy()):this.chatUtils.prepend(this.pinnedMessage.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage=e}h?this.pinnedMessage.hidden=!!c.hiddenPinnedMessages[e]:"discussion"===this.chat.type&&(this.pinnedMessage.pinnedMid=this.chat.threadId,this.pinnedMessage.count=1,this.pinnedMessage.pinnedIndex=0,this.pinnedMessage._setPinnedMessage())}else this.pinnedMessage&&(this.pinnedMessage.destroy(),this.pinnedMessage=void 0);d(),null==l||l(),this.subtitle.classList.toggle("hide",!l),this.setMutedState(),this.container.classList.remove("hide")}}))}setTitleManual(e){return ro(this,void 0,void 0,(function*(){const{peerId:t,threadId:i}=this.chat,s=()=>this.chat.bubbles.getMiddleware();let n;if("pinned"===this.chat.type)n=void 0===e?(0,C.ag)("Loading"):(0,C.ag)("PinnedMessagesCount",[e]),void 0===e&&this.managers.appMessagesManager.getSearchCounters(t,[{_:"inputMessagesFilterPinned"}],!1).then((e=>{if(!s())return;const t=e[0].count;if(this.setTitle(t),!t){this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}}));else if("scheduled"===this.chat.type)n=(0,C.ag)(t===d.Z.myId?"Reminders":"ScheduledMessages");else if("discussion"===this.chat.type){if(void 0===e){const n=yield this.managers.acknowledged.appMessagesManager.getHistory(t,0,1,0,i);if(!s())return;if(n.cached){const t=yield n.result;if(!s())return;e=t.count}else n.result.then((e=>{s()&&this.setTitle(e.count)}))}n=void 0===e?(0,C.ag)("Loading"):(0,C.ag)("Chat.Title.Comments",[e])}else if("chat"===this.chat.type&&([n]=yield Promise.all([(0,Vt.Z)({peerId:t,dialog:!0,withIcons:!i,threadId:i})]),!s()))return;return()=>{(0,U.Z)(this.title,n)}}))}setTitle(e){this.setTitleManual(e).then((e=>e()))}setMutedState(){return ro(this,void 0,void 0,(function*(){if(!this.btnMute)return;const e=this.peerId,t=yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!1,threadId:this.chat.threadId});(yield this.managers.appPeersManager.isBroadcast(e))?(this.btnMute.classList.remove("tgico-mute","tgico-unmute"),this.btnMute.classList.add(t?"tgico-unmute":"tgico-mute"),this.btnMute.style.display=""):this.btnMute.style.display="none"}))}}var co=i(5884),ho=i(3607);class uo extends Xi._{constructor(){super(...arguments),this.threadId=0,this.query=""}onOpenAfterTimeout(){this.appSearch.beginSearch(this.peerId,this.threadId,this.query)}init(e,t,i,s){this.container.id="search-private-container",this.container.classList.add("chatlist-container"),this.inputSearch=new ho.Z("Search"),this.title.replaceWith(this.inputSearch.container),this.btnPickDate=(0,On.Z)("calendar sidebar-header-right"),this.header.append(this.btnPickDate);const n=document.createElement("div");n.classList.add("chatlist-container"),this.scrollable.container.replaceWith(n),this.appSearch=new co.Z(n,this.inputSearch,{messages:new co.z("Chat.Search.PrivateSearch","messages")}),this.peerId?this.appSearch.beginSearch(this.peerId,this.threadId,s):(this.query=s,this.peerId=e,this.threadId=t,this.onDatePick=i,this.btnPickDate.classList.toggle("hide",!this.onDatePick),this.onDatePick&&(0,S.fc)(this.btnPickDate,(()=>{w.Z.createPopup(E,new Date,this.onDatePick).show()})),s&&this.appSearch.searchInput.inputField.setValueSilently(s),a.ZP.toggleSidebar(!0))}}class po{constructor(e,t,i){this.topbar=e,this.chat=t,this.foundCount=0,this.selectedIndex=0,this.onDateClick=e=>{(0,Ce.Z)(e),w.Z.createPopup(E,new Date,this.chat.bubbles.onDatePick).show()},this.onResultsClick=e=>{const t=(0,be.Z)(e.target,Ji.DIALOG_LIST_ELEMENT_TAG);t&&this.selectResult(t)},this.onFooterClick=e=>{this.foundCount&&(this.chat.bubbles.container.classList.toggle("search-results-active"),this.results.classList.toggle("active"))},this.onUpClick=e=>{(0,Ce.Z)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex+1])},this.onDownClick=e=>{(0,Ce.Z)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex-1])},this.element=document.createElement("div"),this.element.classList.add("sidebar-header","chat-search","chatlist-container"),this.backBtn=document.createElement("button"),this.backBtn.classList.add("btn-icon","tgico-left","sidebar-close-button"),(0,x.Z)(this.backBtn);const s=this.listenerSetter=new le.Z,n=(e,t)=>{(0,S.fc)(e,t,{listenerSetter:s})};n(this.backBtn,(()=>{this.destroy()})),this.inputSearch=new ho.Z("Search"),this.results=document.createElement("div"),this.results.classList.add("chat-search-results","chatlist-container"),this.searchGroup=new co.z(!1,"messages",void 0,"",!1),n(this.searchGroup.list,this.onResultsClick),this.appSearch=new co.Z(this.results,this.inputSearch,{messages:this.searchGroup},(e=>{this.foundCount=e,this.foundCount?this.selectResult(this.searchGroup.list.children[0]):((0,U.Z)(this.foundCountEl,this.inputSearch.value?(0,C.ag)("NoResult"):""),this.results.classList.remove("active"),this.chat.bubbles.container.classList.remove("search-results-active"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"))})),this.appSearch.beginSearch(this.chat.peerId,this.chat.threadId),this.chat.bubbles.container.append(this.results),this.footer=document.createElement("div"),this.footer.classList.add("chat-search-footer"),n(this.footer,this.onFooterClick),(0,x.Z)(this.footer),this.foundCountEl=document.createElement("span"),this.foundCountEl.classList.add("chat-search-count"),this.dateBtn=document.createElement("button"),this.dateBtn.classList.add("btn-icon","tgico-calendar"),this.controls=document.createElement("div"),this.controls.classList.add("chat-search-controls"),this.upBtn=document.createElement("button"),this.upBtn.classList.add("btn-icon","tgico-up"),this.downBtn=document.createElement("button"),this.downBtn.classList.add("btn-icon","tgico-down"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"),n(this.dateBtn,this.onDateClick),n(this.upBtn,this.onUpClick),n(this.downBtn,this.onDownClick),this.controls.append(this.upBtn,this.downBtn),this.footer.append(this.foundCountEl,this.dateBtn,this.controls),this.topbar.container.parentElement.insertBefore(this.footer,t.input.chatInput),this.element.append(this.backBtn,this.inputSearch.container),this.topbar.container.classList.add("hide-pinned"),this.topbar.container.parentElement.append(this.element),this.inputSearch.input.focus(),i&&this.setQuery(i),T.IS_MOBILE_SAFARI||(this.navigationItem={type:"mobile-search",onPop:()=>{this.destroy()}},Dn.Z.pushItem(this.navigationItem))}destroy(){this.topbar.container.classList.remove("hide-pinned"),this.element.remove(),this.inputSearch.remove(),this.results.remove(),this.footer.remove(),this.listenerSetter.removeAll(),this.chat.bubbles.container.classList.remove("search-results-active"),this.chat.search=void 0,Dn.Z.removeItem(this.navigationItem)}setQuery(e){this.inputSearch.inputField.value=e}selectResult(e){if(this.setPeerPromise)return this.setPeerPromise;const t=e.dataset.peerId.toPeerId(),i=+e.dataset.mid||void 0,s=(0,Ie.Z)(e);s===this.foundCount-1?this.upBtn.setAttribute("disabled","true"):this.upBtn.removeAttribute("disabled"),s?this.downBtn.removeAttribute("disabled"):this.downBtn.setAttribute("disabled","true"),this.results.classList.remove("active"),this.chat.bubbles.container.classList.remove("search-results-active");const n=this.chat.setPeer({peerId:t,lastMsgId:i});this.setPeerPromise=(n instanceof Promise?n:Promise.resolve(n)).then((()=>{this.selectedIndex=s,(0,U.Z)(this.foundCountEl,(0,C.ag)("Of",[s+1,this.foundCount]));const e=this.searchGroup.list.childElementCount;this.selectedIndex>=e-6&&this.appSearch.searchMore()})).finally((()=>{this.setPeerPromise=null}))}}var fo=i(1571),mo=i(6848),go=i(356);class vo{constructor(){this.canvases=new Set}static getInstance(e){let t=this.INSTANCES.find((t=>(0,mo.Z)(t.options,e)));return t||(t=new vo,t.init(e),this.INSTANCES.push(t)),t}init(e){this.options=e}renderToCanvas(e){return this.renderImageFromUrl(this.options.url).then((()=>this.fillCanvas(e)))}renderImageFromUrl(e){if(this.renderImageFromUrlPromise)return this.renderImageFromUrlPromise;const t=this.image=document.createElement("img");return t.crossOrigin="anonymous",this.renderImageFromUrlPromise=(0,Ot.cj)(t,e,!1).then((()=>go.Z?createImageBitmap(t,{resizeWidth:1440,resizeHeight:2960}).then((e=>(this.imageBitmap=e,t))):t))}cleanup(e){var t;this.canvases.delete(e),this.canvases.size||((0,h.Z)(vo.INSTANCES,this),this.objectUrl&&(null===(t=this.imageBitmap)||void 0===t||t.close(),URL.revokeObjectURL(this.objectUrl)))}fillCanvas(e){const t=e.getContext("2d"),{width:i,height:s}=e,n=this.imageBitmap||this.image;let a=n.width,o=n.height;const r=(500+xe.Z.height/2.5)*e.dpr;a*=r/o,o=r,this.options.mask?(t.fillStyle="#000",t.fillRect(0,0,i,s),t.globalCompositeOperation="destination-out"):t.globalCompositeOperation="source-over";const d=e=>{for(let s=0;s0){let e=l;do{d(e-=o)}while(e>=0)}const c=s-1;for(let e=l+o;ei.resize(e,t))))}}vo.INSTANCES=[];var bo=i(6714),yo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class wo extends l.Z{constructor(e,t){super(),this.appImManager=e,this.managers=t,this.type="chat",this.animationGroup=`chat-${Math.round(65535*Math.random())}`,this.container=document.createElement("div"),this.container.classList.add("chat","tabs-tab"),this.backgroundEl=document.createElement("div"),this.backgroundEl.classList.add("chat-background"),this.log=(0,r.kg)("CHAT",r.v9.Log|r.v9.Warn|r.v9.Debug|r.v9.Error),this.log.warn("constructor"),this.peerId=m.NM,this.container.append(this.backgroundEl),this.appImManager.chatsContainer.append(this.container),this.backgroundTempId=0,this.sharedMediaTabs=[]}setBackground(e,t){const i=bo.Z.getTheme();let s;if(i.background.color&&!i.background.slug&&!i.background.intensity&&"grabbing"===document.documentElement.style.cursor&&this.gradientRenderer&&!this.patternRenderer)return this.gradientCanvas.dataset.colors=i.background.color,this.gradientRenderer.init(this.gradientCanvas),Promise.resolve();const n=++this.backgroundTempId,a=this.gradientRenderer,o=this.patternRenderer,r=(this.gradientCanvas,this.patternCanvas);this.gradientRenderer=this.patternRenderer=this.gradientCanvas=this.patternCanvas=void 0;const l=i.background.intensity&&i.background.intensity/100,c=!!l&&l<0;let h,u,p,f=null==s?void 0:s.firstElementChild;if(!s)if(s=document.createElement("div"),s.classList.add("chat-background-item"),e)if(l){s.classList.add("is-pattern");const t=this.appImManager.chatsContainer.getBoundingClientRect();h=this.patternRenderer=vo.getInstance({url:e,width:t.width,height:t.height,mask:c}),f=this.patternCanvas=h.createCanvas(),f.classList.add("chat-background-item-canvas","chat-background-item-pattern-canvas"),c&&s.classList.add("is-dark")}else i.background.slug&&s.classList.add("is-image");else i.background.color&&s.classList.add("is-color");const m=i.background.color;if(m){const{canvas:e,gradientRenderer:t}=fo.Z.create(m);p=this.gradientRenderer=t,u=this.gradientCanvas=e,u.classList.add("chat-background-item-canvas","chat-background-item-color-canvas"),d.Z.settings.animationsEnabled&&p.scrollAnimate(!0)}h&&(c?u:f).style.setProperty("--opacity-max",""+Math.abs(l)*(c?.5:1));const g=new Promise((i=>{const d=()=>{if(this.backgroundTempId!==n)return h&&h.cleanup(f),void(p&&p.cleanup());const e=this.backgroundEl.lastElementChild;if(e===s)return void i();const d=[u,f].filter(Boolean);d.length&&s.append(...d),this.backgroundEl.append(s),(0,Fe.Z)({element:s,className:"is-visible",forwards:!0,duration:t?0:200,onTransitionEnd:e?()=>{null==o||o.cleanup(r),null==a||a.cleanup(),e.remove()}:null,useRafs:2}),i()};h?h.renderToCanvas(f).then((()=>{this.backgroundTempId===n&&d()})):e?(0,Ot.ZP)(s,e,d):d()}));return this.setBackgroundPromise=Promise.race([(0,nt.Z)(500),g])}setType(e){this.type=e}init(){this.topbar=new lo(this,a.ZP,this.managers),this.bubbles=new Ps(this,this.managers),this.input=new Oa(this,this.appImManager,this.managers),this.contextMenu=new an(this,this.managers),this.selection=new Ua.Z(this,this.bubbles,this.input,this.managers),this.topbar.constructUtils(),this.topbar.constructPeerHelpers(),this.topbar.construct(),this.input.construct(),this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers(),c.Z||this.bubbles.setReactionsHoverListeners(),this.bubbles.attachContainerListeners(),this.container.append(this.topbar.container,this.bubbles.container,this.input.chatInput),this.bubbles.listenerSetter.add(d.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.peerId===e&&this.setPeer({peerId:t})})),this.bubbles.listenerSetter.add(d.Z)("dialog_drop",(e=>{e.peerId!==this.peerId||"dialog"!==e._&&this.threadId!==e.id||this.appImManager.setPeer()})),this.bubbles.listenerSetter.add(this.appImManager)("chat_changing",(({to:e})=>{const t=e!==this,i=()=>{var e;null===(e=this.bubbles.observer)||void 0===e||e.toggleObservingNew(t),s.Z.toggleIntersectionGroup(this.animationGroup,t),t&&s.Z.checkAnimations(t,this.animationGroup)};t?i():setTimeout((()=>{i()}),400)}))}beforeDestroy(){this.bubbles.cleanup()}cleanupBackground(){++this.backgroundTempId,this.patternRenderer&&(this.patternRenderer.cleanup(this.patternCanvas),this.patternRenderer=void 0),this.gradientRenderer&&(this.gradientRenderer.cleanup(),this.gradientRenderer=void 0)}destroy(){this.destroySharedMediaTab(),this.topbar.destroy(),this.bubbles.destroy(),this.input.destroy(),this.contextMenu&&this.contextMenu.destroy(),this.selection&&this.selection.attachListeners(void 0,void 0),this.cleanupBackground(),delete this.topbar,delete this.bubbles,delete this.input,delete this.selection,delete this.contextMenu,this.container.remove()}cleanup(e=!0){this.input.cleanup(e),this.topbar.cleanup(),this.selection.cleanup()}get isForumTopic(){return!(!this.isForum||!this.threadId)}onChangePeer(e,t){var i;return yo(this,void 0,void 0,(function*(){const{peerId:s,threadId:n}=this,o=a.ZP.getTab(uo);null==o||o.close();const[r,d,l,c,h,u,p,f,m]=yield t(Promise.all([this.managers.appPeersManager.noForwards(s),this.managers.appPeersManager.isPeerRestricted(s),this._isAnyGroup(s),this.setAutoDownloadMedia(),this.managers.appPeersManager.isMegagroup(s),this.managers.appPeersManager.isBroadcast(s),this.managers.appPeersManager.isChannel(s),this.managers.appPeersManager.isBot(s),this.managers.appPeersManager.isForum(s)]));m&&n&&(yield t(this.managers.dialogsStorage.getForumTopicOrReload(s,n))),this.noForwards=r,this.isRestricted=d,this.isAnyGroup=l,this.isMegagroup=h,this.isBroadcast=u,this.isChannel=p,this.isBot=f,this.isForum=m,this.isAllMessagesForum=m&&!n,n&&!this.isForum&&(e.type="discussion");const g=null!==(i=e.type)&&void 0!==i?i:"chat";this.setType(g),this.messagesStorageKey=`${this.peerId}_${"scheduled"===this.type?"scheduled":"history"}`,this.container.classList.toggle("no-forwards",this.noForwards),this.sharedMediaTab=a.ZP.createSharedMediaTab(),this.sharedMediaTabs.push(this.sharedMediaTab),this.sharedMediaTab.setPeer(s,n),this.input.clearHelper(),this.selection.cleanup()}))}setPeer(e){const{peerId:t,threadId:i}=e;t?this.inited||(this.init&&(this.init(),this.init=null),this.inited=!0):this.inited=void 0;const s=this.appImManager.isSamePeer(this,e);if(s){if(this.setPeerPromise)return}else this.appImManager.dispatchEvent("peer_changing",this),this.peerId=t||m.NM,this.threadId=i;if(!t)return a.ZP.toggleSidebar(!1),this.cleanup(!0),this.bubbles.setPeer({samePeer:!1,peerId:t}),this.peerId=0,this.appImManager.dispatchEvent("peer_changed",this),a.ZP.replaceSharedMediaTab(),this.destroySharedMediaTab(),void(this.sharedMediaTab=void 0);this.peerChanged=s;const n=this.bubbles.setPeer(Object.assign(Object.assign({},e),{samePeer:s})),o=this.setPeerPromise=n.then((e=>e.promise)).catch(Qe.Z).finally((()=>{this.setPeerPromise===o&&(this.setPeerPromise=null)}));return n}destroySharedMediaTab(e=this.sharedMediaTab){e&&((0,h.Z)(this.sharedMediaTabs,e),e.destroy())}setAutoDownloadMedia(){return yo(this,void 0,void 0,(function*(){this.autoDownload=yield function(e){return t=this,i=void 0,n=function*(){let t,i=0,s=0,n=0;const a=d.Z.settings,o=d.Z.managers.appPeersManager;return!a.autoDownloadNew.pFlags.disabled&&e&&(t=e.isUser()?(yield o.isContact(e))?"contacts":"private":(yield o.isBroadcast(e))?"channels":"groups",a.autoDownload.photo[t]&&(i=a.autoDownloadNew.photo_size_max),a.autoDownload.video[t]&&(s=a.autoDownloadNew.video_size_max),a.autoDownload.file[t]&&(n=a.autoDownloadNew.file_size_max)),{photo:i,video:s,file:n}},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}(this.peerId)}))}setMessageId(e){return this.setPeer({peerId:this.peerId,threadId:this.threadId,lastMsgId:e})}finishPeerChange(e,t,i,s){return yo(this,void 0,void 0,(function*(){if(this.peerChanged)return;const t=this.peerId;this.peerChanged=!0,this.wasAlreadyUsed=!0;const i=this.bubbles.getMiddleware();this.cleanup(!1);const n=this.sharedMediaTab,o=Promise.all([this.topbar.finishPeerChange(e),this.bubbles.finishPeerChange(),this.input.finishPeerChange(s),n.fillProfileElements()]),r=yield o;n.loadSidebarMedia(!0),i()&&(r.forEach((e=>{null==e||e()})),a.ZP.replaceSharedMediaTab(n),this.sharedMediaTabs.filter((e=>e!==n)).forEach((e=>this.destroySharedMediaTab(e))),this.container.dataset.type=this.type,this.log.setPrefix("CHAT-"+t+"-"+this.type),this.appImManager.dispatchEvent("peer_changed",this))}))}getMessage(e){return this.managers.appMessagesManager.getMessageFromStorage(this.messagesStorageKey,e)}getMidsByMid(e){return yo(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.getMidsByMessage(yield this.getMessage(e))}))}getHistoryStorage(e){return this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId,e?void 0:this.threadId).then((e=>Object.assign(Object.assign({},e),{history:ge.Z.fromJSON(e.historySerialized)})))}getDialogOrTopic(){return this.isForum&&this.threadId?this.managers.dialogsStorage.getForumTopic(this.peerId,this.threadId):this.managers.dialogsStorage.getDialogOnly(this.peerId)}getHistoryMaxId(){return this.getHistoryStorage().then((e=>e.maxId))}_isAnyGroup(e){return yo(this,void 0,void 0,(function*(){return e===d.Z.myId||e===m.hj||(yield this.managers.appPeersManager.isAnyGroup(e))}))}initSearch(e){if(this.peerId)if(o.Z.isMobile)this.search?this.search.setQuery(e):this.search=new po(this.topbar,this,e);else{let t=a.ZP.getTab(uo);t||(t=a.ZP.createTab(uo)),t.open(this.peerId,this.threadId,this.bubbles.onDatePick,e)}}canSend(e){return this.managers.appMessagesManager.canSendToPeer(this.peerId,this.threadId,e)}isStartButtonNeeded(){return Promise.all([this.managers.appPeersManager.isBot(this.peerId),this.managers.appMessagesManager.getDialogOnly(this.peerId),this.getHistoryStorage(!0)]).then((([e,t,i])=>e&&!t&&!i.history.length))}getMessageSendingParams(){return{threadId:this.threadId,replyToMsgId:this.input.replyToMsgId,scheduleDate:this.input.scheduleDate,silent:this.input.sendSilent,sendAsPeerId:this.input.sendAsPeerId}}isOurMessage(e){return e.fromId===d.Z.myId||!!e.pFlags.out&&this.isMegagroup}isOutMessage(e){const t=e.fwd_from;return!(!this.isOurMessage(e)||t&&this.peerId===d.Z.myId)}isAvatarNeeded(e){return this.isAnyGroup&&!this.isOutMessage(e)}isPinnedMessagesNeeded(){return"chat"===this.type||this.isForum}}var So=i(2342),Co=i(6637);class Lo{constructor(e){this.appImManager=e,this.buttons={},this.addedListener=!1,this.waitingForMouseUp=!1,this.mouseUpCounter=0,this.onMouseUpSingle=e=>{if(this.waitingForMouseUp=!1,c.Z){if(e&&(0,Ce.Z)(e),0!=this.mouseUpCounter++)return void this.hide();this.resetSelection(this.savedRange)}this.show()}}init(){this.container=document.createElement("div"),this.container.classList.add("markup-tooltip","z-depth-1","hide"),this.wrapper=document.createElement("div"),this.wrapper.classList.add("markup-tooltip-wrapper");const e=document.createElement("div"),t=document.createElement("div");e.classList.add("markup-tooltip-tools"),t.classList.add("markup-tooltip-tools"),["bold","italic","underline","strikethrough","monospace","spoiler","link"].forEach((t=>{const i=(0,On.Z)(t,{noRipple:!0});e.append(this.buttons[t]=i),"link"!==t?i.addEventListener("mousedown",(e=>{(0,Ce.Z)(e),this.appImManager.chat.input.applyMarkdown(t),this.cancelClosening()})):(0,S.fc)(i,(e=>{(0,Ce.Z)(e),this.showLinkEditor(),this.cancelClosening()}))})),this.linkBackButton=(0,On.Z)("left",{noRipple:!0}),this.linkInput=document.createElement("input"),(0,C.$d)(this.linkInput,"MarkupTooltip.LinkPlaceholder",void 0,"placeholder"),this.linkInput.classList.add("input-clear"),this.linkInput.addEventListener("keydown",(e=>{const t=!this.linkInput.value.length||!!(0,So.Z)(this.linkInput.value);"Enter"===e.key&&(t?this.applyLink(e):(this.linkInput.classList.contains("error")&&(this.linkInput.classList.remove("error"),this.linkInput.offsetLeft),this.linkInput.classList.add("error")))})),this.linkInput.addEventListener("input",(e=>{const t=this.isLinkValid();this.linkInput.classList.toggle("is-valid",t),this.linkInput.classList.remove("error")})),this.linkBackButton.addEventListener("mousedown",(e=>{(0,Ce.Z)(e),this.container.classList.remove("is-link"),this.resetSelection(),this.setTooltipPosition(),this.cancelClosening()})),this.linkApplyButton=(0,On.Z)("check markup-tooltip-link-apply",{noRipple:!0}),this.linkApplyButton.addEventListener("mousedown",(e=>{this.applyLink(e)}));const i=document.createElement("div");i.classList.add("markup-tooltip-link-apply-container");const s=document.createElement("span"),n=document.createElement("span"),a=document.createElement("span");s.classList.add("markup-tooltip-delimiter"),n.classList.add("markup-tooltip-delimiter"),a.classList.add("markup-tooltip-delimiter"),e.insertBefore(s,this.buttons.link),i.append(a,this.linkApplyButton),t.append(this.linkBackButton,n,this.linkInput,i),this.wrapper.append(e,t),this.container.append(this.wrapper),document.body.append(this.container),window.addEventListener("resize",(()=>{this.hide()}))}showLinkEditor(){this.container&&this.container.classList.contains("is-visible")||this.show();const e=this.buttons.link;this.container.classList.add("is-link");const t=document.getSelection();if(this.savedRange=t.getRangeAt(0),e.classList.contains("active")){const e=this.savedRange.startContainer.parentElement;this.linkInput.value=e.href}else this.linkInput.value="";this.setTooltipPosition(!0),setTimeout((()=>{this.linkInput.focus()}),200),this.linkInput.classList.toggle("is-valid",this.isLinkValid())}applyLink(e){(0,Ce.Z)(e),this.resetSelection();let t=this.linkInput.value;t&&!(0,Co.Z)(t)&&(t="https://"+t),this.appImManager.chat.input.applyMarkdown("link",t),setTimeout((()=>{this.hide()}),0)}isLinkValid(){return!this.linkInput.value.length||!!(0,So.Z)(this.linkInput.value)}resetSelection(e=this.savedRange){const t=window.getSelection();t.removeAllRanges(),t.addRange(e),this.appImManager.chat.input.messageInput.focus()}hide(){this.init||(this.container.classList.remove("is-visible"),document.removeEventListener("mouseup",this.onMouseUpSingle),this.waitingForMouseUp=!1,Dn.Z.removeByType("markup"),this.hideTimeout&&clearTimeout(this.hideTimeout),this.hideTimeout=window.setTimeout((()=>{this.hideTimeout=void 0,this.container.classList.add("hide"),this.container.classList.remove("is-link")}),200))}getActiveMarkupButton(){const e=new Set,t=Object.keys(this.buttons),i=Fa(t);return t.forEach((t=>{i[t]&&e.add(this.buttons[t])})),[...e]}setActiveMarkupButton(){const e=this.getActiveMarkupButton();for(const t in this.buttons){const i=this.buttons[t];i.classList.toggle("active",e.includes(i))}}setTooltipPosition(e=!1){const t=document.getSelection().getRangeAt(0),i=document.body.getBoundingClientRect(),s=t.getBoundingClientRect(),n=this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();this.container.style.maxWidth=n.width+"px";const a=(0,He.Z)(void 0,this.appImManager.chat.input.messageInput,!1,s).rect.top+-1*i.top,o=(this.container.classList.contains("is-link")?this.wrapper.lastElementChild:this.wrapper.firstElementChild).getBoundingClientRect(),r=a-o.height-8,d=n.left,l=n.left+n.width-Math.min(n.width,o.width);let c;if(e){const e=this.container.getBoundingClientRect();c=(0,Gi.Z)(e.left,d,l)}else{const e=s.left+(s.width-o.width)/2;c=(0,Gi.Z)(e,d,l)}this.container.style.transform=`translate3d(${c}px, ${r}px, 0)`}show(){if(this.init&&(this.init(),this.init=null),Fs())return void this.hide();if(void 0!==this.hideTimeout&&clearTimeout(this.hideTimeout),this.container.classList.contains("is-visible"))return;this.setActiveMarkupButton(),this.container.classList.remove("is-link");const e=this.container.classList.contains("hide");e&&(this.container.classList.remove("hide"),this.container.classList.add("no-transition")),this.setTooltipPosition(),e&&(this.container.offsetLeft,this.container.classList.remove("no-transition")),this.container.classList.add("is-visible"),T.IS_MOBILE||Dn.Z.pushItem({type:"markup",onPop:()=>{this.hide()}})}setMouseUpEvent(){this.waitingForMouseUp||(this.waitingForMouseUp=!0,document.addEventListener("mouseup",this.onMouseUpSingle,{once:!0}))}cancelClosening(){c.Z&&!T.IS_APPLE&&(document.removeEventListener("mouseup",this.onMouseUpSingle),document.addEventListener("mouseup",(e=>{(0,Ce.Z)(e),this.mouseUpCounter=1,this.waitingForMouseUp=!1,this.setMouseUpEvent()}),{once:!0}))}handleSelection(){this.addedListener||(this.addedListener=!0,document.addEventListener("selectionchange",(e=>{if(document.activeElement===this.linkInput)return;const t=this.appImManager.chat.input.messageInput;if(document.activeElement!==t)return void this.hide();const i=document.getSelection();if(Fs(i))this.hide();else if(c.Z)if(T.IS_APPLE)this.show(),this.setTooltipPosition();else{if(2===this.mouseUpCounter)return void(this.mouseUpCounter=0);this.savedRange=i.getRangeAt(0),this.setMouseUpEvent()}else this.container&&this.container.classList.contains("is-visible")?this.setTooltipPosition():t.matches(":active")?this.setMouseUpEvent():this.show()})),document.addEventListener("beforeinput",(e=>{"historyRedo"!==e.inputType&&"historyUndo"!==e.inputType||e.target.addEventListener("input",(()=>this.setActiveMarkupButton()),{once:!0})})))}}var Eo=i(9171);class Io{constructor(e,t){let i;this.options=t,this.onDragOver=e=>{this.container.classList.add("is-dragover")},this.onDragLeave=e=>{this.container.classList.remove("is-dragover")},this.onDrop=e=>{this.options.onDrop(e)},this.container=document.createElement("div"),this.container.classList.add("drop","z-depth-1"),this.outlineWrapper=document.createElement("div"),this.outlineWrapper.classList.add("drop-outline-wrapper"),this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.classList.add("drop-outline"),this.path=document.createElementNS("http://www.w3.org/2000/svg","path"),this.path.classList.add("drop-outline-path"),t.icon&&(i=document.createElement("div"),i.classList.add("drop-icon","tgico-"+t.icon));const s=document.createElement("div");let n;s.classList.add("drop-header"),s.append((0,C.ag)(t.header,t.headerArgs)),t.subtitle&&(n=document.createElement("div"),n.classList.add("drop-subtitle"),n.append((0,C.ag)(t.subtitle))),this.svg.append(this.path),this.outlineWrapper.append(this.svg),this.container.append(...[this.outlineWrapper,i,s,n].filter(Boolean)),e.append(this.container),this.container.addEventListener("dragover",this.onDragOver),this.container.addEventListener("dragleave",this.onDragLeave),this.container.addEventListener("drop",this.onDrop)}destroy(){delete this.options,this.container.remove(),this.container.removeEventListener("dragover",this.onDragOver),this.container.removeEventListener("dragleave",this.onDragLeave),this.container.removeEventListener("drop",this.onDrop)}setPath(){const e=this.outlineWrapper.getBoundingClientRect();this.svg.setAttributeNS(null,"preserveAspectRatio","none"),this.svg.setAttributeNS(null,"viewBox",`0 0 ${e.width} ${e.height}`),this.svg.setAttributeNS(null,"width",`${e.width}`),this.svg.setAttributeNS(null,"height",`${e.height}`);const t=10,i=e.width-t,s=e.height-t,n=(0,Eo.Z)(5,5,i,s,t,t,t,t);this.path.setAttributeNS(null,"d",n)}}var Mo=i(7922);function Po(e){e.forEach((e=>e.classList.add("no-transition"))),(0,pe.d1)().then((()=>{e.forEach((e=>e.classList.remove("no-transition")))}))}var Zo=i(490),ko=i(2831),To=i(2207);class xo{constructor(e){this.maxRadius=10,this.minRadius=0,this.N=e,this.radius=new Array(e+1),this.radiusNext=new Array(e+1),this.progress=new Array(e+1),this.speed=new Array(e+1);for(let t=0;t<=e;t++)this.generateBlob(this.radius,t),this.generateBlob(this.radiusNext,t),this.progress[t]=0}generateBlob(e,t){const{maxRadius:i,minRadius:s,speed:n}=this,a=i-s;e[t]=s+Math.random()*a,n[t]=.017+.003*Math.random()}generateNextBlob(){const{radius:e,radiusNext:t,progress:i,N:s}=this;for(let n=0;n=1&&(s[r]=0,a[r]=o[r],this.generateBlob(o,r))}draw(e,t,i,s,n,a,o,r){if(n.getContext){const d=n.getContext("2d");d.beginPath(),d.moveTo(i,s),d.lineTo(e,s);const{radius:l,radiusNext:c,N:h}=this;for(let n=0;n<=h;n++)if(0===n){const i=this.progress[n],s=(t-(l[n]*(1-i)+c[n]*i))*r+o*(1-r);d.lineTo(e,s)}else{const a=this.progress[n-1],u=l[n-1]*(1-a)+c[n-1]*a,p=this.progress[n],f=(i-e)/h*(n-1),m=(i-e)/h*n,g=f+(m-f)/2,v=(t-u)*r+o*(1-r),b=(t-(l[n]*(1-p)+c[n]*p))*r+o*(1-r);d.bezierCurveTo(g,v,g,b,m,b),n===h&&d.lineTo(i,s)}a(d),d.fill(),d.closePath()}}}class Ao{constructor(e){this.stateId=e,this.createGradient(e)}createGradient(e){this.shader=(t,i,s,n,a)=>{t.fillStyle=Ao.getGradientFromType(t,e,i,s,n,a)}}static getGradientFromType(e,t,i,s,n,a){const o=e.createLinearGradient(i,s,n,a);return t===To.Z.MUTED_BY_ADMIN?(o.addColorStop(0,"#F05459"),o.addColorStop(.4,"#766EE9"),o.addColorStop(1,"#57A4FE")):t===To.Z.UNMUTED?(o.addColorStop(0,"#52CE5D"),o.addColorStop(1,"#00B1C0")):t===To.Z.MUTED?(o.addColorStop(0,"#0976E3"),o.addColorStop(1,"#2BCEFF")):t===To.Z.CONNECTING&&(o.addColorStop(0,"#8599aa"),o.addColorStop(1,"#8599aa")),o}update(e,t,i,s){}}class _o{constructor(){this.handleDevicePixelRatioChanged=e=>{this.setSize(),this.forceUpdate()},this.handleResize=()=>{this.resizeHandler&&(clearTimeout(this.resizeHandler),this.resizeHandler=null),this.resizing=!0,this.resizeCanvas(),this.resizeHandler=window.setTimeout((()=>{this.resizing=!1,this.invokeDraw()}),250)},this.handleFocus=()=>{this.focused=!0,this.invokeDraw()},this.handleBlur=()=>{this.focused=!1},this.invokeDraw=()=>{this.raf||this.draw()},this.draw=(e=!1)=>{if(this.raf=null,!this.mounted)return;const{lbd:t,lbd1:i,lbd2:s,scale:n,left:a,top:o,right:r,bottom:d,currentState:l,previousState:c,focused:h,resizing:u,canvas:p}=this;if(!h&&!u&&this.progressToState>=1)return;let f=Date.now()-this.lastUpdateTime;f>20&&(f=17),this.animateToAmplitude!==this.amplitude&&(this.amplitude+=this.animateAmplitudeDiff*f,this.animateAmplitudeDiff>0?this.amplitude>this.animateToAmplitude&&(this.amplitude=this.animateToAmplitude):this.amplitude0?this.amplitude2>this.animateToAmplitude&&(this.amplitude2=this.animateToAmplitude):this.amplitude21&&(this.progressToState=1,this.previousState=null));const{amplitude:m,amplitude2:g,progressToState:v}=this,b=6*g*n,y=6*g*n;p.getContext("2d").clearRect(0,0,p.width,p.height),t.minRadius=0,t.maxRadius=(2+2*m)*n,i.minRadius=0,i.maxRadius=(3+9*m)*n,s.minRadius=0,s.maxRadius=(3+9*m)*n,t.update(m,.3),i.update(m,.7),s.update(m,.7);for(let e=0;e<2;e++){if(0===e&&!c)continue;let n=1,h=null;0===e?(n=1-v,h=c):(n=c?v:1,l.update(d-o,r-a,f,m),h=l);const u=e=>{e.globalAlpha=.3*n,h.shader(e,a,o,r,d)},g=t=>{t.globalAlpha=0===e?1:n,h.shader(t,a,o,r,d)};i.draw(a,o-b,r,d,p,u,o,1),s.draw(a,o-y,r,d,p,u,o,1),t.draw(a,o,r,d,p,g,o,1)}e||(this.raf=requestAnimationFrame((()=>this.draw())))},this.setCurrentState=(e,t)=>{const{currentState:i,states:s}=this;(null==i?void 0:i.stateId)!==e&&(this.previousState=t?i:null,this.currentState=s.get(e),this.progressToState=this.previousState?0:1)},this.focused=!0,this.resizing=!1,this.lastUpdateTime=Date.now(),this.amplitude=0,this.amplitude2=0,this.states=new Map([[To.Z.UNMUTED,new Ao(To.Z.UNMUTED)],[To.Z.MUTED,new Ao(To.Z.MUTED)],[To.Z.MUTED_BY_ADMIN,new Ao(To.Z.MUTED_BY_ADMIN)],[To.Z.CONNECTING,new Ao(To.Z.CONNECTING)]]),this.previousState=null,this.currentState=this.states.get(To.Z.CONNECTING),this.progressToState=1}componentDidMount(){this.mounted||(this.mounted=!0,window.addEventListener("resize",this.handleResize),this.media=window.matchMedia("screen and (min-resolution: 2dppx)"),this.media.addEventListener("change",this.handleDevicePixelRatioChanged),this.setSize(),this.forceUpdate(),this.lbd=new xo(3),this.lbd1=new xo(7),this.lbd2=new xo(8),this.setAmplitude(this.amplitude),this.draw())}componentWillUnmount(){this.mounted=!1,window.removeEventListener("resize",this.handleResize),this.media.addEventListener("change",this.handleDevicePixelRatioChanged);const{canvas:e}=this;e.getContext("2d").clearRect(0,0,e.width,e.height)}setSize(){this.scale=window.devicePixelRatio,this.top=20*this.scale,this.right=(this.mounted?this.container.offsetWidth:1261)*this.scale,this.bottom=(this.mounted?this.container.offsetHeight:68)*this.scale,this.left=0*this.scale,this.setCanvasSize()}setCanvasSize(){this.canvas.width=this.right,this.canvas.height=this.bottom}resizeCanvas(){this.scale=window.devicePixelRatio,this.right=this.container.offsetWidth*this.scale,this.forceUpdate(),this.invokeDraw()}setAmplitude(e){const{amplitude:t}=this;this.animateToAmplitude=e,this.animateAmplitudeDiff=(e-t)/250,this.animateAmplitudeDiff2=(e-t)/120}forceUpdate(){this.setCanvasSize()}render(e){const t=this.container=document.createElement("div");t.classList.add(e);const i=this.canvas=document.createElement("canvas");return i.classList.add(e+"-canvas"),t.append(i),t}}var Fo=i(8222);class Do{constructor(e,t){this.item=e,(0,Rn.Z)(this,t)}play(e){return this.item.playPart(this,e)}}class Ro{constructor(e,t){this.icon=e,this.autoplay=!1,(0,Rn.Z)(this,t),this.parts=this.parts.map((e=>this.createPart(e)))}load(){var e;let t=this.loadPromise;if(t)return t;const{container:i,canvas:s,width:n,height:a}=this.icon;return t=Rs.Z.loadAnimationAsAsset({container:i,canvas:s,width:n,height:a,group:"none",loop:!1,autoplay:null!==(e=this.autoplay)&&void 0!==e&&e,initFrame:this.initFrame,skipFirstFrameRendering:void 0===this.initFrame,color:this.color,inverseColor:this.inverseColor},this.name).then((e=>Rs.Z.waitForFirstFrame(e))).then((e=>{this.player=e,this.onLoadForColor&&(this.onLoadForColor(),this.onLoadForColor=void 0),this.onLoadForPart&&(this.onLoadForPart(),this.onLoadForPart=void 0)})),this.loadPromise=t,this.icon.loadPromises.set(this.name,t),t}createPart(e){return new Do(this,e)}getPart(e){return e instanceof Do?e:"string"==typeof e?this.parts.find((t=>t.name===e)):this.parts[e]}playPart(e,t){return this.icon.playPart(this,e,t)}}class Bo{constructor(e){(0,Rn.Z)(this,e),this.container||(this.container=document.createElement("div")),this.container.classList.add("rlottie-icon");const{width:t,height:i}=this;this.container.style.width=t+"px",this.container.style.height=i+"px";const s=this.canvas=document.createElement("canvas");s.classList.add("rlottie"),s.width=t,s.height=i,this.items=new Map,this.loadPromises=new Map}get loadPromise(){return Promise.all([...this.loadPromises.values()]).then(Qe.Z)}getItem(e){return e||1!==this.items.size?this.items.get(e):this.items.values().next().value}add(e){const t=new Ro(this,e);return this.items.set(e.name,t),t}playPart(e,t,i){if(!e.player)return void(e.onLoadForPart=()=>{this.playPart(e,t,i)});const s=e.getPart(t);e.player.playPart({from:d.Z.settings.animationsEnabled&&!this.skipAnimation?s.startFrame:s.endFrame,to:s.endFrame,callback:i})}static generateEqualParts(e,t){return new Array(e).fill(0).map(((e,i)=>{const s=i*t;return{startFrame:s,endFrame:s+t-1}}))}}class No extends Bo{constructor(e){super({width:e.width,height:e.height}),(0,Rn.Z)(this,e)}load(e,t){if(this.loaded)return this.loadPromise;this.loaded=!0,this.partState=e,this.colorState=t;const i=this.getPart(e),s=void 0!==t&&this.getColor&&this.getColor(t),n=i.item;n.initFrame=i.endFrame,n.color=s;const a=[...this.items.values()].map((e=>e.load()));return Promise.all(a).then(Qe.Z)}setState(e,t,i){this.loaded||this.load(e,t);let s=!1,n=!1;return void 0!==e?s=this.setPartState(e,t,i):void 0!==t&&(n=this.setColorState(t)),s||n}setPartState(e,t,i){const{partState:s}=this;return s===e?void 0!==t&&this.setColorState(t):(void 0!==t&&this.setColorState(t,!1),this.partState=e,this.getPart(e,s).play(i),!0)}setColorState(e,t=!0){const{colorState:i}=this;if(i===e||!this.getColor)return!1;this.colorState=e;const s=this.getItem(),n=this.getColor(e,i),a=()=>{s.player.setColor(n,t)};return s.player?a():s.onLoadForColor=a,!0}destroy(){this.items.forEach((e=>{e.loadPromise.then((()=>{e.player.remove()}))}))}}class Oo extends No{constructor(){super({width:36,height:36,getPart:(e,t)=>{const i=pr;let s;switch(e){case i.HAND:s=t===i.MUTED?"muted-to-hand":"unmuted-to-hand";break;case i.MUTED:s=t===i.HAND?"hand-to-muted":"mute";break;case i.UNMUTED:s="unmute"}return this.getItem().getPart(s)}}),this.container.classList.add("group-call-microphone-icon-container"),this.add({name:"voip_filled",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:172,name:"unmuted-to-hand"},{startFrame:173,endFrame:201,name:"scheduled-crossing"},{startFrame:202,endFrame:236,name:"scheduled-to-muted"},{startFrame:237,endFrame:273,name:"scheduled-to-hand"},{startFrame:274,endFrame:310,name:"scheduled-crossed-to-hand"},{startFrame:311,endFrame:343,name:"scheduled-uncrossing"},{startFrame:344,endFrame:375,name:"scheduled-to-muted"},{startFrame:376,endFrame:403,name:"play-to-muted"}]})}}var Uo=i(6733);class Ho extends No{constructor(e){super({width:32,height:32,getPart:(e,t)=>{const i=ur;let s;switch(e){case i.HAND:s=3;break;case i.MUTED:s=t===i.HAND?0:2;break;case i.UNMUTED:s=1}return this.getItem().getPart(s)},getColor:e?(e,t)=>function(e){const t=ur;let i;switch(e){case t.HAND:i="blue";break;case t.MUTED:case t.MUTED_FOR_ME:case t.MUTED_BY_ADMIN:i=e===t.MUTED?"secondary":"red";break;case t.UNMUTED:i="green"}const s=Fo.Z.getProperty("gc-"+i+"-text-color");return(0,N.oo)(s)}(e):void 0}),this.colored=e,this.container.classList.add("group-call-participant-muted-icon-container");const t=Bo.generateEqualParts(4,21);this.add({name:"voice_outlined2",parts:t})}setState(e){return super.setState(function(e){const t=ur;switch(e){case t.MUTED_BY_ADMIN:case t.MUTED_FOR_ME:return t.MUTED;default:return e}}(e),e)}}const zo="group-call-participant-status";class jo{constructor(e){this.withIcons=e,this.container=document.createElement("div"),this.container.classList.add(zo+"-container")}setState(e,t){const i=ur,s=this.withIcons.filter((e=>!!t[e])).map((e=>{const t="tgico-"+("presentation"===e?"listscreenshare":"videocamera_filled"),i=document.createElement("i");return i.classList.add(zo+"-icon",zo+"-icon-"+e,t),i}));let n,a;if(e===i.MUTED_FOR_ME)n=(0,C.ag)("VoiceChat.Status.MutedForYou"),a="is-muted";else if(e===i.UNMUTED)n=(0,C.ag)("VoiceChat.Status.Speaking"),a="is-speaking";else if(e===i.HAND)n=(0,C.ag)("VoiceChat.Status.WantsSpeak"),a="is-waiting";else{if(t.about&&!s.length)return void(0,_.Z)(this.container,(0,R.Z)(t.about));n=(0,C.ag)("VoiceChat.Status.Listening"),a="is-listening"}const o=document.createElement("span");o.classList.add(zo,a),o.append(...s,n),(0,U.Z)(this.container,o)}}var Go=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Vo extends ps.Z{constructor(e){super({getIndex:e=>Go(this,void 0,void 0,(function*(){return(yield this.instance.getParticipantByPeerId(e.id)).date})),onDelete:e=>{e.dom.listEl.remove(),this.onElementDestroy(e)},onUpdate:e=>Go(this,void 0,void 0,(function*(){const t=yield this.instance.getParticipantByPeerId(e.id),i=fr(t);e.mutedIcon.setState(i),e.status.setState(i,t)})),onSort:(e,t)=>{(0,p.Z)(e.dom.listEl,this.list,t)},onElementCreate:e=>{const{dom:t}=Ji.default.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,wrapOptions:{lazyLoadQueue:this.lazyLoadQueue}});t.listEl.classList.add("group-call-participant");const i=new Ho(!0),s=new jo(["presentation","video"]);return(0,U.Z)(t.lastMessageSpan,s.container),t.listEl.append(i.container),e.mutedIcon=i,e.status=s,e.dom=t,e},updateElementWith:pe.T2}),this.instance=e,this.avatarSize="abitbigger",this.rippleEnabled=!0,this.autonomous=!0,this.createChatListOptions={dialogSize:72},this.list=Ji.default.createChatList(this.createChatListOptions)}destroy(){this.elements.forEach((e=>{this.onElementDestroy(e)}))}onElementDestroy(e){e.mutedIcon.destroy()}}var Ko=i(7529);function Wo(e){const t=document.createElement("canvas");t.classList.add("call-video-blur"),t.width=16,t.height=16;const i=t.getContext("2d",{alpha:!1});i.filter="blur(2px)";const s=()=>{i.drawImage(e,0,0,e.videoWidth,e.videoHeight,0,0,t.width,t.height)};return(0,Me.jt)((()=>(s(),t.isConnected))),s(),t}const $o="group-call-participant-video";class qo{constructor(e,t,i){this.managers=e,this.instance=t,this.source=i,this.container=document.createElement("div"),this.container.classList.add($o+"-container"),this.info=document.createElement("div"),this.info.classList.add($o+"-info"),this.left=document.createElement("div"),this.left.classList.add($o+"-info-left"),this.right=document.createElement("div"),this.right.classList.add($o+"-info-right"),this.info.append(this.left,this.right),this.container.append(this.info)}setPinned(e){if(!e)return void(this.header&&(this.header.remove(),this.header=void 0));if(this.header)return;this.header=document.createElement("div"),this.header.classList.add($o+"-header");const t=document.createElement("i");t.classList.add("group-call-pin-icon","tgico-pin"),this.header.append(t),this.container.append(this.header)}setParticipant(e,t,i){let s;e.pFlags.self?(s=(0,C.ag)("VoiceChat.Status.You"),s.classList.add("peer-title")):(this.peerTitle=new B.Z({peerId:(0,D.Z)(e.peer)}),s=this.peerTitle.element),this.groupCallParticipantMutedIcon=new Ho(!1),this.groupCallParticipantStatus=new jo([t]),this.left.append(s,this.groupCallParticipantStatus.container),this.right.append(this.groupCallParticipantMutedIcon.container),i.classList.add($o,"call-video"),i.paused&&i.play();const n=Wo(i);n.classList.add($o+"-blur"),this.container.prepend(n,i),this.updateParticipant(e)}updateParticipant(e){const t=fr(e);this.groupCallParticipantMutedIcon.setState(t),this.groupCallParticipantStatus.setState(t,e)}destroy(){this.groupCallParticipantMutedIcon.destroy()}}class Qo extends Ko.Z{constructor(e){super(),(0,Rn.Z)(this,e);const t=this.container=document.createElement("div");this.container.classList.add("group-call-participants-video-container"),e.appendTo.append(t),this.participantsElements=new Map,this.containers=new Map;const{listenerSetter:i}=this;i.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),i.add(this.instance)("pinned",(e=>{this.participantsElements.forEach((t=>{t.forEach((t=>{this.setElementDisplay(t,e)}))}))})),(0,S.fc)(this.container,(e=>{const t=(0,ve.Z)(e.target,"group-call-participant-video-container");if(!t)return;const i=this.containers.get(t);this.instance.pinnedSource!==i.source?this.instance.pinSource(i.source):this.instance.unpinAll()}),{listenerSetter:i}),this.setInstance(this.instance),this.setup({element:t,listenerSetter:i,showOnLeaveToClassName:"group-call-buttons"})}shouldDisplayElement(e,t){return this.displayPinned?!t||e.source===t:t&&e.source!==t}setElementDisplay(e,t){const i=this.shouldDisplayElement(e,t);e.container.classList.toggle("video-hidden",!i);const s=e.source===t;e.setPinned(s)}updateParticipant(e){const t=(0,D.Z)(e.peer),i=["video","presentation"],s=i.some((t=>!!e[t]));let n=this.participantsElements.get(t);(s||n)&&(n||this.participantsElements.set(t,n=new Map),i.forEach((i=>{let s=n.get(i);const a=e[i];if(!!a!=!!s){if(a){const t=this.instance.getVideoElementFromParticipantByType(e,i);if(!t)return;const{video:a,source:o}=t;s=new qo(this.managers,this.instance,o),this.containers.set(s.container,s),this.setElementDisplay(s,this.instance.pinnedSource),n.set(i,s),s.setParticipant(e,i,a),this.container.prepend(s.container)}else n.delete(i),s.container.remove(),n.size||(this.participantsElements.delete(t),this.containers.delete(s.container),s.destroy());this._onLengthChange()}else s&&s.updateParticipant(e)})))}_onLengthChange(){const e=this.container.childElementCount;this.container.dataset.length=""+e,this.container.dataset.layout=e<=2?"1":3===e?"3":"4",this.onLengthChange&&this.onLengthChange(e)}setInstance(e){return t=this,i=void 0,n=function*(){(yield e.participants).forEach((e=>{this.updateParticipant(e)}))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}destroy(){this.containers.forEach((e=>{e.destroy()}))}}var Yo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Xo{constructor(e){this.onOpenProfileClick=()=>{const e=w.Z.getPopups(vr)[0];e&&e.hide(),Xr.setInnerPeer({peerId:this.targetPeerId})},this.toggleParticipantMuted=e=>{this.instance.editParticipant(this.participant,{muted:e})},this.buttons=[{icon:"gc_microphoneoff",text:"VoiceChat.MutePeer",verify:()=>this.canManageCall&&this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmutePeer",verify:()=>this.canManageCall&&!this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"gc_microphoneoff",text:"VoiceChat.MuteForMe",verify:()=>!this.canManageCall&&!this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmuteForMe",verify:()=>!this.canManageCall&&this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"newprivate",text:"VoiceChat.OpenProfile",verify:()=>!0,onClick:this.onOpenProfileClick},{icon:"deleteuser danger",text:"VoiceChat.RemovePeer",verify:()=>this.managers.appChatsManager.hasRights(this.chatId,"ban_users"),onClick:()=>Yo(this,void 0,void 0,(function*(){(0,vi.Z)({peerId:this.targetPeerId,title:new B.Z({peerId:this.targetPeerId}).element,descriptionLangKey:(yield this.managers.appChatsManager.isBroadcast(this.chatId))?"VoiceChat.RemovePeer.Confirm.Channel":"VoiceChat.RemovePeer.Confirm",descriptionLangArgs:[new B.Z({peerId:this.targetPeerId}).element],button:{langKey:"VoiceChat.RemovePeer.Confirm.OK",isDanger:!0}}).then((()=>{this.managers.appChatsManager.kickFromChat(this.chatId,this.targetPeerId)}),Qe.Z)}))}];const{listenerSetter:t}=e;this.managers=e.managers,this.instance=e.instance,this.chatId=this.instance.chatId,this.element=(0,ks.b)({buttons:this.buttons,listenerSetter:t}),this.element.classList.add("group-call-participant-menu","night"),(0,Ct.E)(e.onContextElement,(e=>Yo(this,void 0,void 0,(function*(){const t=(0,ve.Z)(e.target,"group-call-participant");if(!t)return;this.element.parentElement!==i&&i.append(this.element),(0,Ce.Z)(e);const s=this.targetPeerId=t.dataset.peerId.toPeerId();this.participant=yield this.instance.getParticipantByPeerId(s),this.participant.pFlags.self||(this.canManageCall=yield this.managers.appChatsManager.hasRights(this.chatId,"manage_call"),yield(0,en.Z)(this.buttons,(e=>Yo(this,void 0,void 0,(function*(){const t=yield e.verify(s);return e.element.classList.toggle("hide",!t),t})))),(0,Js.Z)(e.touches?e.touches[0]:e,this.element,"right"),Lt.Z.openBtnMenu(this.element))}))),t),t.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{if(this.instance.id===e){const e=(0,D.Z)(t.peer);this.targetPeerId===e&&Lt.Z.close()}}));let i=document.body;(0,Uo.Ms)(document.body,(()=>{const e=(0,Uo.rB)();i=e?w.Z.getPopups(vr)[0].getContainer():document.body,e||Lt.Z.close()}),t)}}class Jo{constructor(e){(0,Rn.Z)(this,e);const t="group-call-participants",i=new Z.ZP(void 0);i.container.classList.add(t+"-scrollable");const s=this.container=document.createElement("div");s.classList.add(t);const n=this.sortedList=new Vo(this.instance),{instance:a,listenerSetter:o}=this;this.contextMenu=new Xo(Object.assign(Object.assign({},e),{onContextElement:n.list,listenerSetter:o,instance:a})),this.groupCallParticipantsVideo=new Qo(Object.assign(Object.assign({},e),{appendTo:i.container,displayPinned:!1})),i.append(n.list),s.append(i.container),e.appendTo.append(s),o.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),new Vs.Z({scrollable:i,getPromise:()=>this.managers.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then((({participants:e,isEnd:t})=>(e.forEach((e=>{this.updateParticipant(e)})),t)))}),this.setInstance(a)}updateParticipant(e){const t=(0,D.Z)(e.peer),i=this.sortedList.has(t);e.pFlags.left?i&&this.sortedList.delete(t):i?this.sortedList.update(t):this.sortedList.add(t)}setInstance(e){return Yo(this,void 0,void 0,(function*(){(yield e.participants).forEach((e=>{this.updateParticipant(e)}))}))}destroy(){this.sortedList.destroy(),this.groupCallParticipantsVideo.destroy()}}class er{constructor(e){this.appendTo=e,this.descriptionIntl=new C.ZP.IntlElement({key:"VoiceChat.Status.Connecting"}),this.descriptionIntl.element.classList.add("group-call-description")}detach(){this.descriptionIntl.element.remove()}update(e){const{state:t}=e;let i,s;t===To.Z.CONNECTING?i="VoiceChat.Status.Connecting":(i="VoiceChat.Status.Members",s=[e.groupCall.participants_count]);const{descriptionIntl:n}=this;n.compareAndUpdate({key:i,args:s}),this.descriptionIntl.element.parentElement||this.appendTo.append(this.descriptionIntl.element)}}class tr{constructor(e){this.appendTo=e,this.peerTitle=new B.Z({peerId:0})}update(e){const{peerTitle:t,appendTo:i}=this,s=e.groupCall,n=e.chatId.toPeerId(!0);s.title?(0,_.Z)(i,(0,R.Z)(s.title)):(t.options.peerId!==n&&(t.options.peerId=n,t.update()),t.element.parentElement!==i&&i.append(t.element))}}var ir=i(2820);function sr(e,t,i){const s=e+"-button",n=document.createElement("div");n.classList.add(s,"call-button","rp-overflow"),i.icon&&n.classList.add("tgico-"+i.icon),i.noRipple||(0,x.Z)(n),i.isDanger&&n.classList.add(s+"-red"),i.isConfirm&&n.classList.add(s+"-green"),i.callback&&(0,S.fc)(n,i.callback,{listenerSetter:t});let a=n;if(i.text){const e=document.createElement("div");e.classList.add(s+"-container","call-button-container");const t="string"==typeof i.text?(0,C.ag)(i.text):i.text;t.classList.add(s+"-text","call-button-text"),e.append(n,t),a=e}return a}var nr=i(3757);const ar="movable-element",or=ar+"-resize-handler";class rr extends l.Z{constructor(e){super(!0),this.onResize=()=>{this.fixDimensions(),this.fixPosition(),this.setPosition()},(0,Rn.Z)(this,e),this.top=this.left=this.width=this.height=0,this.element.classList.add(ar),this.addResizeHandlers(),this.setSwipeHandler(),o.Z.addEventListener("resize",this.onResize)}destroyElements(){this.element.classList.remove(ar),this.handlers&&this.handlers.forEach((e=>{e.remove()}))}destroy(){o.Z.removeEventListener("resize",this.onResize),this.swipeHandler.removeListeners()}addResizeHandlers(){this.handlers=["n","e","s","w","ne","se","sw","nw"].map((e=>{const t=document.createElement("div");return t.dataset.side=e,t.classList.add(or,or+"-side-"+e),this.element.append(t),t}))}setSwipeHandler(){let e,t,i,s,n;const a=this.swipeHandler=new nr.Z({element:this.element,onSwipe:(a,o,r)=>{if(n){if(n.includes("e")||n.includes("w")){const e=n.includes("e")&&a>0||n.includes("w")&&a<0,s=Math.abs(a)*(e?1:-1),o=n.includes("e")?xe.Z.width-t:i+t;this.width=Math.min(o,i+s)}if(n.includes("n")||n.includes("s")){const t=n.includes("s")&&o>0||n.includes("n")&&o<0,i=Math.abs(o)*(t?1:-1),a=n.includes("s")?xe.Z.height-e:s+e;this.height=Math.min(a,s+i)}this.fixDimensions(),n.includes("w")&&(this.left=Math.min(t+i-this.minWidth,t+a)),n.includes("n")&&(this.top=Math.min(e+s-this.minHeight,e+o))}else this.top=e+o,this.left=t+a;this.fixPosition(),this.setPosition()},verifyTouchTarget:e=>{const t=e.target;if(this.verifyTouchTarget&&!this.verifyTouchTarget(e))return!1;const i=(0,ve.Z)(t,or);return i?(n=i.dataset.side,a.setCursor("")):(n=void 0,a.setCursor("grabbing")),!0},onFirstSwipe:()=>{e=this.top,t=this.left,i=this.width,s=this.height}})}setPositionToCenter(){this.top=xe.Z.height/2-this.height/2,this.left=xe.Z.width/2-this.width/2,this.setPosition()}fixDimensions(){this.width=(0,Gi.Z)(this.width,this.minWidth,xe.Z.width),this.height=(0,Gi.Z)(this.height,this.minHeight,xe.Z.height)}fixPosition(){this.top=(0,Gi.Z)(this.top,0,xe.Z.height-this.height),this.left=(0,Gi.Z)(this.left,0,xe.Z.width-this.width)}setPosition(){this.element.style.top=this.top+"px",this.element.style.left=this.left+"px",this.element.style.right="auto",this.element.style.bottom="auto",this.element.style.width=this.width+"px",this.element.style.height=this.height+"px",this.dispatchEvent("resize")}get width(){return this._width}get height(){return this._height}set width(e){this._width=e}set height(e){this._height=e}get state(){const{top:e,left:t,width:i,height:s}=this;return{top:e,left:t,width:i,height:s}}set state(e){const{top:t,left:i,width:s,height:n}=e;this.top=t,this.left=i,this.width=s,this.height=n,this.onResize()}}var dr,lr=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i};class cr{constructor(e){dr.set(this,void 0),(0,Rn.Z)(this,e),this.toggleMovable(!c.Z),this.listenerSetter.add(o.Z)("changeScreen",((e,t)=>{t!==o._.mobile&&e!==o._.mobile||this.toggleMovable(!c.Z)}))}destroy(){const e=this.movable;e&&e.destroy()}get movable(){return function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)}(this,dr,"f")}get state(){return this.movable?this.movable.state:this.previousState}set state(e){this.previousState=e}toggleMovable(e){let{movable:t}=this;if(e){if(t)return;t=lr(this,dr,new rr(this.movableOptions),"f"),t.state=this.previousState,void 0===this.previousState.top&&t.setPositionToCenter(),this.onResize&&this.listenerSetter.add(t)("resize",this.onResize)}else{if(!t)return;this.previousState=t.state,t.destroyElements(),t.destroy(),lr(this,dr,void 0,"f")}}}function hr(e,t,i){return t.forEach((t=>{t.classList.toggle(e,i)})),()=>hr(e,t,!i)}dr=new WeakMap;var ur,pr;function fr(e){const t=ur;return e.pFlags.muted_by_you?t.MUTED_FOR_ME:void 0!==e.raise_hand_rating?t.HAND:e.pFlags.muted?e.pFlags.can_self_unmute?t.MUTED:t.MUTED_BY_ADMIN:t.UNMUTED}!function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_FOR_ME=2]="MUTED_FOR_ME",e[e.MUTED_BY_ADMIN=3]="MUTED_BY_ADMIN",e[e.HAND=4]="HAND"}(ur||(ur={})),function(e){e[e.HAND=0]="HAND",e[e.MUTED=1]="MUTED",e[e.UNMUTED=2]="UNMUTED"}(pr||(pr={}));let mr={width:420,height:640};const gr="group-call";class vr extends w.Z{constructor(){super("popup-group-call",{body:!0,withoutOverlay:!0,closable:!0,title:!0}),this.onFullScreenClick=()=>{(0,Uo.Dj)(this.container)},this.onToggleControls=e=>{this.container.classList.toggle("show-controls",e),this.buttonsContainer.classList.toggle("show-controls",e)},this.toggleDisability=hr.bind(null,"btn-disabled"),this.onVideoClick=()=>{const e=this.toggleDisability([this.btnVideo],!0);this.instance.toggleVideoSharing().finally((()=>{e()}))},this.onScreenClick=()=>{const e=this.toggleDisability([this.btnScreen],!0);this.instance.toggleScreenSharing().finally((()=>{e()}))},this.onMuteClick=()=>{const e=this.instance.participant;e.pFlags.can_self_unmute?this.instance.toggleMuted():void 0===e.raise_hand_rating&&this.instance.changeRaiseHand(!0)},this.onLeaveClick=()=>{return e=this,t=void 0,s=function*(){const e=e=>{this.instance.hangUp(e)};(yield this.managers.appChatsManager.hasRights(this.instance.chatId,"manage_call"))?new xs.Z("popup-end-video-chat",{titleLangKey:"VoiceChat.End.Title",descriptionLangKey:"VoiceChat.End.Text",checkboxes:[{text:"VoiceChat.End.Third"}],buttons:[{langKey:"VoiceChat.End.OK",callback:t=>{e(!!t.size)},isDanger:!0}]}).show():e(!1)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s},this.onFullScreenChange=()=>{this.toggleBigLayout();const e=(0,Uo.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,n=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),i&&i.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==n&&(s.Z.checkAnimations2(e),bo.Z.setThemeColor(e?"#000000":void 0))},this.toggleBigLayout=()=>{var e;const t=(0,Uo.rB)(),i=null===(e=this.movablePanel)||void 0===e?void 0:e.movable,s=(t||!!(i&&i.width>=680))&&!!this.videosCount,n=this.container.classList.contains("is-big-layout");let a;s&&!n&&(a=Array.from(this.buttonsContainer.children),a.forEach((e=>{e.style.opacity="0"})),this.buttonsContainer.offsetLeft),this.container.classList.toggle("is-big-layout",s),this.btnInvite.classList.toggle("hide",s),this.btnShowColumn.classList.toggle("hide",!s),a&&a.forEach((e=>{e.style.opacity=""}))},this.toggleRightColumn=()=>{this.container.classList.toggle("is-right-column-shown")},this.videosCount=0,this.container.classList.add(gr,"night");const e=this.instance=oo.ZP.groupCall,{listenerSetter:t}=this;if(!T.IS_APPLE_MOBILE){const e=this.btnFullScreen=(0,On.Z)("fullscreen"),i=this.btnFullScreen2=(0,On.Z)("fullscreen "+gr+"-cfs"),s=this.btnExitFullScreen=(0,On.Z)("smallscreen");(0,S.fc)(e,this.onFullScreenClick,{listenerSetter:t}),(0,S.fc)(i,this.onFullScreenClick,{listenerSetter:t}),(0,S.fc)(s,(()=>{(0,Uo.C8)()}),{listenerSetter:t}),(0,Uo.Ms)(this.container,this.onFullScreenChange,t)}this.btnInvite=(0,On.Z)("adduser");const i=this.btnShowColumn=(0,On.Z)("rightpanel "+gr+"-only-big");(0,S.fc)(i,this.toggleRightColumn,{listenerSetter:t});const n=document.createElement("div");n.classList.add(gr+"-header-info"),this.title.classList.add(gr+"-header-title");const a=document.createElement("div");a.classList.add(gr+"-header-subtitle"),n.append(this.title,a),this.header.classList.add(gr+"-header"),this.header.append(...[this.btnExitFullScreen,n,this.btnFullScreen,i].filter(Boolean));const o=this.header.cloneNode(!1),r=n.cloneNode(!1),l=this.title.cloneNode(!1);r.append(l);const c=(0,On.Z)("rightpanel");o.append(...[c,r,this.btnFullScreen2].filter(Boolean)),(0,S.fc)(c,this.toggleRightColumn,{listenerSetter:t}),this.body.prepend(o);const h=new Z.ZP(void 0);h.container.classList.add("group-call-big-video-container"),this.container.append(h.container),this.groupCallTitle=new tr(this.title),this.groupCallDescription=new er(a),this.groupCallBodyHeaderDescription=new er(l),this.constructButtons(),this.groupCallParticipantsVideo=new Qo({appendTo:h.container,instance:e,listenerSetter:t,displayPinned:!0,onLengthChange:e=>{this.videosCount=e,this.toggleBigLayout()},managers:this.managers}),this.groupCallParticipants=new Jo({appendTo:this.body,instance:e,listenerSetter:t,managers:this.managers}),this.movablePanel=new cr({listenerSetter:t,movableOptions:{minWidth:400,minHeight:480,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,ve.Z)(t,"chatlist")||(0,ve.Z)(t,"group-call-button")||(0,ve.Z)(t,"btn-icon")||(0,ve.Z)(t,"group-call-participants-video-container")||(0,Uo.rB)())}},onResize:()=>this.toggleBigLayout(),previousState:mr}),t.add(e)("state",(()=>{this.updateInstance()})),t.add(d.Z)("group_call_update",(e=>{var t;(null===(t=this.instance)||void 0===t?void 0:t.id)===e.id&&this.updateInstance()})),t.add(e)("pinned",(()=>{this.setHasPinned()})),t.add(this.groupCallParticipantsVideo)("toggleControls",this.onToggleControls),this.addEventListener("close",(()=>{const{movablePanel:e}=this;mr=e.state,this.groupCallParticipantsVideo.destroy(),this.groupCallParticipants.destroy(),this.groupCallMicrophoneIcon.destroy(),e.destroy()})),this.toggleRightColumn(),this.onFullScreenChange(),this.updateInstance()}constructButtons(){const e=this.buttonsContainer=document.createElement("div");e.classList.add(gr+"-buttons");const t=sr.bind(null,gr,this.listenerSetter),i=this.btnVideo=t({callback:this.onVideoClick,icon:"videocamera_filled"}),s=this.btnScreen=t({callback:this.onScreenClick,icon:"sharescreen_filled"});s.classList.toggle("hide",!ir.Z);const n=t({noRipple:!0,callback:(0,qa.Z)(this.onMuteClick,600,!0)});n.classList.add(gr+"-microphone-button");const a=this.groupCallMicrophoneIcon=new Oo;n.append(a.container);const o=t({icon:"settings_filled"});o.classList.add("btn-disabled"),o.classList.toggle("hide",!ir.Z);const r=t({isDanger:!0,callback:this.onLeaveClick,icon:"close"});e.append(i,s,n,o,r),this.container.append(e)}getContainer(){return this.container}setHasPinned(){this.container.classList.toggle("has-pinned",!!this.instance.pinnedSource)}updateInstance(){if(this.instance.state===To.Z.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,Uo.C8)(),void this.hide();const{participant:e,groupCall:t}=this.instance;if(!e)return;this.setTitle(),this.setDescription(),this.setHasPinned();const i=function(e,t){const i=pr;return t.pFlags.can_self_unmute?t.pFlags.muted?i.MUTED:i.UNMUTED:i.HAND}(0,e);this.container.dataset.micState=i===pr.HAND?"hand":i===pr.MUTED?"muted":"unmuted",this.groupCallMicrophoneIcon.setState(i)}setTitle(){this.groupCallTitle.update(this.instance)}setDescription(){this.groupCallDescription.update(this.instance),this.groupCallBodyHeaderDescription.update(this.instance)}}var br=i(9078),yr=i(3335);class wr{constructor(e){this.appendTo=e,this.container=document.createElement("div"),this.container.classList.add("call-description")}detach(){void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0),this.container.remove(),this.state=void 0}update(e){const{connectionState:t}=e;if(this.state===t)return;let i;if(this.state=t,t===yr.Z.CONNECTED){i=document.createElement("span"),i.classList.add("call-description-duration");const t=()=>{i.innerText=(0,ts.Z)(e.duration,!0)};this.interval=window.setInterval(t,1e3),t()}else{let s;switch(t){case yr.Z.PENDING:s=e.isOutgoing?"Call.StatusRinging":"Call.StatusCalling";break;case yr.Z.REQUESTING:s="Call.StatusRequesting";break;case yr.Z.EXCHANGING_KEYS:s="VoipExchangingKeys";break;case yr.Z.CLOSED:s=void 0!==e.connectedAt?"Call.StatusEnded":"Call.StatusFailed";break;default:s="Call.StatusConnecting"}i=(0,C.ag)(s),void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0)}this.container.classList.toggle("has-duration",t===yr.Z.CONNECTED),(0,U.Z)(this.container,i),this.container.parentElement||this.appendTo.append(this.container)}}class Sr extends No{constructor(e,t){super({width:36,height:36,getPart:e=>this.getItem().getPart(e?"unmute":"mute"),getColor:e?e=>e?[255,255,255]:[158,158,158]:void 0,skipAnimation:t}),this.add({name:"voice_mini",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:171,name:"unmuted-to-hand"}]})}}const Cr="call",Lr={width:400,height:580};let Er=Object.assign({},Lr);class Ir extends w.Z{constructor(e){super("popup-call",{withoutOverlay:!0,closable:!0}),this.instance=e,this.onFullScreenClick=()=>{(0,Uo.Dj)(this.container)},this.onFullScreenChange=()=>{const e=(0,Uo.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,n=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),i&&i.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==n&&(s.Z.checkAnimations(e),bo.Z.setThemeColor(e?"#000000":void 0),this.resizeVideoContainers())},this.videoContainers={};const{container:t,listenerSetter:i}=this;t.classList.add(Cr,"night");const n=document.createElement("div");n.classList.add(Cr+"-avatar");const a=this.peerId=this.instance.interlocutorUserId.toPeerId(),o=new f.Z;o.classList.add("avatar-full"),o.updateWithOptions({isBig:!0,peerId:a}),n.append(o);const r=new B.Z({peerId:a}).element;r.classList.add(Cr+"-title");const d=document.createElement("div");d.classList.add(Cr+"-subtitle"),this.description=new wr(d);const l=this.emojisSubtitle=document.createElement("div");l.classList.add(Cr+"-emojis"),t.append(n,r,d),T.IS_MOBILE?this.header.append(l):(this.btnFullScreen=(0,On.Z)("fullscreen"),this.btnExitFullScreen=(0,On.Z)("smallscreen hide"),(0,S.fc)(this.btnFullScreen,this.onFullScreenClick,{listenerSetter:i}),(0,S.fc)(this.btnExitFullScreen,(()=>(0,Uo.C8)()),{listenerSetter:i}),(0,Uo.Ms)(this.container,this.onFullScreenChange,i),this.header.prepend(this.btnExitFullScreen),this.header.append(this.btnFullScreen),t.append(l)),this.partyStates=document.createElement("div"),this.partyStates.classList.add(Cr+"-party-states"),this.partyMutedState=document.createElement("div"),this.partyMutedState.classList.add(Cr+"-party-state");const c=(0,C.ag)("VoipUserMicrophoneIsOff",[new B.Z({peerId:a,onlyFirstName:!0,limitSymbols:18}).element]);c.classList.add(Cr+"-party-state-text");const h=new Sr(!1,!0);h.setState(!1,!1),this.partyMutedState.append(h.container,c),this.partyStates.append(this.partyMutedState),this.container.append(this.partyStates),this.makeButton=sr.bind(null,Cr,this.listenerSetter),this.constructFirstButtons(),this.constructSecondButtons(),i.add(e)("state",(()=>{this.updateInstance()})),i.add(e)("mediaState",(()=>{this.updateInstance()})),this.movablePanel=new cr({listenerSetter:i,movableOptions:{minWidth:400,minHeight:580,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,ve.Z)(t,"call-button")||(0,ve.Z)(t,"btn-icon")||(0,Uo.rB)())}},previousState:this.instance.wasTryingToJoin||this.instance.isOutgoing?Er:Object.assign({},Lr)});const u=this.movablePanel.movable;u&&this.listenerSetter.add(u)("resize",(()=>{this.resizeVideoContainers()}));const p=this.controlsHover=new Ko.Z;p.setup({element:this.container,listenerSetter:this.listenerSetter,showOnLeaveToClassName:"call-buttons"}),p.showControls(!1),this.addEventListener("close",(()=>{const{movablePanel:e}=this;Er=e.state,this.microphoneIcon.destroy(),e.destroy()})),this.updateInstance()}getCallInstance(){return this.instance}constructFirstButtons(){const e=this.firstButtonsRow=document.createElement("div");e.classList.add(Cr+"-buttons","is-first");const t=hr.bind(null,"btn-disabled"),i=this.btnVideo=this.makeButton({text:"Call.Camera",icon:"videocamera_filled",callback:()=>{const e=t([i,s],!0);this.instance.toggleVideoSharing().finally(e)}}),s=this.btnScreen=this.makeButton({text:"Call.Screen",icon:"sharescreen_filled",callback:()=>{const e=t([i,s],!0);this.instance.toggleScreenSharing().finally(e)}});ir.Z||(s.classList.add("hide"),this.container.classList.add("no-screen")),this.muteI18nElement=new C.ZP.IntlElement({key:"Call.Mute"});const n=this.btnMute=this.makeButton({text:this.muteI18nElement.element,callback:()=>{this.instance.toggleMuted()}}),a=this.microphoneIcon=new Sr(!0,!0);n.firstElementChild.append(a.container),e.append(i,s,n),this.container.append(e)}constructSecondButtons(){const e=this.secondButtonsRow=document.createElement("div");e.classList.add(Cr+"-buttons","is-second"),this.declineI18nElement=new C.ZP.IntlElement({key:"Call.Decline"});const t=this.btnDecline=this.makeButton({text:this.declineI18nElement.element,icon:"endcall_filled",callback:()=>{this.instance.hangUp("phoneCallDiscardReasonHangup")},isDanger:!0}),i=this.btnAccept=this.makeButton({text:"Call.Accept",icon:"phone_filled",callback:()=>{this.instance.acceptCall()},isConfirm:!0});e.append(t,i),this.container.append(e)}createVideoContainer(e){const t=Cr+"-video",i=document.createElement("div");i.classList.add(t+"-container"),e.classList.add(t),e.paused&&e.play(),(0,S.fc)(i,(()=>{if(!i.classList.contains("small"))return;const e=Object.values(this.videoContainers).find((e=>!e.classList.contains("small")));e.classList.add("small"),e.style.cssText=i.style.cssText,i.classList.remove("small"),i.style.cssText="",this.resizeVideoContainers()}));const s=Wo(e);return s.classList.add(t+"-blur"),i.append(s,e),i}updateInstance(){const{instance:e}=this,{connectionState:t}=e;if(t===yr.Z.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,Uo.C8)(),this.btnVideo.classList.add("disabled"),void this.hide();const i=!e.isOutgoing&&t===yr.Z.PENDING;this.declineI18nElement.compareAndUpdate({key:t===yr.Z.PENDING?"Call.Decline":"Call.End"}),this.btnAccept.classList.toggle("disable",!i),this.btnAccept.classList.toggle("hide-me",!i),this.container.classList.toggle("two-button-rows",i);const s=e.isMuted,n=()=>{this.btnMute.firstElementChild.classList.toggle("active",s)},a=this.microphoneIcon.getItem().player;this.microphoneIcon.setState(!s,!s,n),a||n(),this.muteI18nElement.compareAndUpdate({key:s?"VoipUnmute":"Call.Mute"});const o=e.isSharingVideo;this.btnVideo.firstElementChild.classList.toggle("active",o);const r=e.isSharingScreen;this.btnScreen.firstElementChild.classList.toggle("active",r);const d=e.getMediaState("output");(0,Fe.Z)({element:this.partyMutedState,className:"is-visible",forwards:!!(null==d?void 0:d.muted),duration:300});const l=this.videoContainers,c=Object.assign({},l);["input","output"].forEach((t=>{const i=e.getMediaState(t),s=e.getVideoElement(t),n=!!(s&&s.videoWidth&&s.videoHeight);!s||n||s.dataset.hasPromise||(s.dataset.hasPromise="1",(0,wn.Z)(s).then((()=>{delete s.dataset.hasPromise,this.updateInstance()})));const a=!!s&&n&&!(!i||"active"!==i.videoState&&"active"!==i.screencastState);let o=l[t];a&&s&&!o&&(o=l[t]=this.createVideoContainer(s),this.container.append(o)),!a&&o&&(o.remove(),delete l[t])}));{const e=l.input,t=l.output;Object.keys(c).length!==Object.keys(l).length&&e&&e.classList.toggle("small",!!t),t&&!e&&t.classList.remove("small")}this.resizeVideoContainers(),this.container.classList.toggle("no-video",!Object.keys(l).length),!this.emojisSubtitle.textContent&&t{(0,U.Z)(this.emojisSubtitle,(0,R.Z)(e.join("")))})),this.setDescription()}resizeVideoContainers(){Object.values(this.videoContainers).forEach((e=>{if(e.classList.contains("small")){const t=e.querySelector("video"),i=this.movablePanel.state,s=240,n=240,a=t.videoHeight>t.videoWidth,o=a?n:s,r=1/3*((0,Uo.rB)()?65535:a?i.height:i.width),d=a?t.videoWidth/t.videoHeight:1,l=a?1:t.videoHeight/t.videoWidth;e.style.width=r*d+"px",e.style.height=r*l+"px",e.style.maxWidth=o*d+"px",e.style.maxHeight=o*l+"px"}else e.style.cssText=""}))}setDescription(){this.description.update(this.instance)}}var Mr=i(2069),Pr=i(9585),Zr=i(2493);const kr="topbar-call";class Tr{constructor(e){this.managers=e,this.onState=()=>{this.updateInstance(this.instance)};const t=this.listenerSetter=new le.Z;t.add(Zr.Z)("instance",(({instance:e})=>{this.instance||this.updateInstance(e)})),t.add(Zr.Z)("accepting",(e=>{this.instance!==e&&this.updateInstance(e)})),t.add(oo.ZP)("instance",(e=>{this.updateInstance(e)})),t.add(d.Z)("group_call_update",(e=>{const t=oo.ZP.groupCall;(null==t?void 0:t.id)===e.id&&this.updateInstance(t)})),t.add(Pr.Z.ANALYSER_LISTENER)("amplitude",(({amplitudes:e,type:t})=>{const{weave:i}=this;if(!e.length||!i)return;let s=0;for(let t=0;ts?n:s}i.setAmplitude(s)}))}clearCurrentInstance(){this.instance&&(this.center.textContent="",this.currentDescription&&(this.currentDescription.detach(),this.currentDescription=void 0),this.instance=void 0,this.instanceListenerSetter.removeAll())}updateInstance(e){this.construct&&(this.construct(),this.construct=void 0);const t=this.instance!==e;t&&(this.clearCurrentInstance(),this.instance=e,this.instanceListenerSetter=new le.Z,this.instanceListenerSetter.add(e)("state",this.onState),e instanceof br.Z?this.currentDescription=this.groupCallDescription:(this.currentDescription=this.callDescription,this.instanceListenerSetter.add(e)("muted",this.onState)),this.container.classList.toggle("is-call",!(e instanceof br.Z)));const i=this.instance.isMuted,s=e instanceof br.Z?e.state:function(e,t){switch(e){case yr.Z.CLOSING:case yr.Z.CLOSED:return To.Z.CLOSED;case yr.Z.CONNECTED:return t?To.Z.MUTED:To.Z.UNMUTED;default:return To.Z.CONNECTING}}(e.connectionState,i),{weave:n}=this;n.componentDidMount();const a=s===To.Z.CLOSED;(!document.body.classList.contains("is-calling")||t||a)&&(a&&n.setAmplitude(0),(0,Fe.Z)({element:document.body,className:"is-calling",forwards:!a,duration:250,onTransitionEnd:a?()=>{n.componentWillUnmount(),this.clearCurrentInstance()}:void 0})),a||(n.setCurrentState(s,!0),this.setTitle(e),this.setDescription(e),this.groupCallMicrophoneIconMini.setState(!i))}setDescription(e){return this.currentDescription.update(e)}setTitle(e){if(e instanceof br.Z)return this.groupCallTitle.update(e);(0,U.Z)(this.center,new B.Z({peerId:e.interlocutorUserId.toPeerId()}).element)}construct(){const{listenerSetter:e}=this,t=this.container=document.createElement("div");t.classList.add("sidebar-header",kr+"-container");const i=document.createElement("div");i.classList.add(kr+"-left");const s=this.groupCallMicrophoneIconMini=new Sr,n=(0,On.Z)();n.append(s.container),i.append(n);const a=(0,qa.Z)((()=>{this.instance.toggleMuted()}),600,!0);(0,S.fc)(n,(e=>{(0,Ce.Z)(e),a()}),{listenerSetter:e});const o=this.center=document.createElement("div");o.classList.add(kr+"-center"),this.groupCallTitle=new tr(o),this.groupCallDescription=new er(i),this.callDescription=new wr(i);const r=document.createElement("div");r.classList.add(kr+"-right");const d=(0,On.Z)("endcall_filled");r.append(d),(0,S.fc)(d,(e=>{(0,Ce.Z)(e);const{instance:t}=this;t&&(t instanceof br.Z?t.hangUp():t.hangUp("phoneCallDiscardReasonHangup"))}),{listenerSetter:e}),(0,S.fc)(t,(()=>{if(this.instance instanceof br.Z){if(w.Z.getPopups(vr).length)return;(new vr).show()}else if(this.instance instanceof Mr.Z){if(w.Z.getPopups(Ir).find((e=>e.getCallInstance()===this.instance)))return;new Ir(this.instance).show()}}),{listenerSetter:e}),t.append(i,o,r);const l=this.weave=new _o,c=l.render(kr+"-weave");t.prepend(c),document.getElementById("column-center").prepend(t),l.componentDidMount()}}var xr=i(2614),Ar=i(6009),_r=i(493),Fr=i(2131),Dr=i(6702),Rr=i(7746),Br=i(2491),Nr=i(1722),Or=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Ur=new class{constructor(){this.notificationsShown={},this.notificationIndex=0,this.notificationsCount=0,this.soundsPlayed={},this.vibrateSupport=Fr.Z,this.faviconElements=Array.from(document.head.querySelectorAll('link[rel="icon"], link[rel="alternate icon"]')),this.titleBackup=document.title,this.titleChanged=!1,this.stopped=!1,this.settings={},this.pushInited=!1,this.updateLocalSettings=()=>{const e=["notify_nodesktop","notify_volume","notify_novibrate","notify_nopreview","notify_nopush"].map((()=>{}));Promise.all(e).then((e=>{if(this.settings.nodesktop=e[0],this.settings.volume=void 0===e[1]?.5:e[1],this.settings.novibrate=e[2],this.settings.nopreview=e[3],this.settings.nopush=e[4],this.pushInited){const e=!this.settings.nopush&&!this.settings.nodesktop&&Dr.default.isAvailable||!1;e!==(!1!==this.registeredDevice)&&(e?Dr.default.subscribe():Dr.default.unsubscribe())}Dr.default.setSettings(this.settings)})),Sn.Z.getState().then((e=>{this.settings.nosound=!e.settings.notifications.sound}))},this.requestPermission=()=>{Notification.requestPermission(),window.removeEventListener("click",this.requestPermission)}}construct(e){this.managers=e,navigator.vibrate=navigator.vibrate||navigator.mozVibrate||navigator.webkitVibrate,this.setAppBadge=navigator.setAppBadge&&navigator.setAppBadge.bind(navigator),this.setAppBadge&&this.setAppBadge(0),this.notificationsUiSupport="Notification"in window||"mozNotification"in navigator,this.notifySoundEl=document.createElement("div"),this.notifySoundEl.id="notify-sound",document.body.append(this.notifySoundEl),this.topMessagesDeferred=(0,fe.Z)(),Zo.Z.addEventListener("deactivated",(()=>{this.stop()})),Zo.Z.addEventListener("activated",(()=>{this.stopped&&this.start()})),wt.Z.addEventListener("change",(e=>{this.stopped||(e||this.clear(),this.toggleToggler())})),d.Z.addEventListener("notification_reset",(e=>{this.soundReset(e)})),d.Z.addEventListener("notification_cancel",(e=>{this.cancel(e)})),this.setAppBadge&&d.Z.addEventListener("folder_unread",(e=>{0===e.id&&this.setAppBadge(e.unreadUnmutedPeerIds.size)})),Dr.default.addEventListener("push_init",(e=>{this.pushInited=!0,this.settings.nodesktop||this.settings.nopush?this.unregisterDevice(e):e?this.registerDevice(e):Dr.default.subscribe()})),Dr.default.addEventListener("push_subscribe",(e=>{this.registerDevice(e)})),Dr.default.addEventListener("push_unsubscribe",(e=>{this.unregisterDevice(e)})),d.Z.addEventListener("dialogs_multiupdate",(()=>{this.topMessagesDeferred.resolve()}),{once:!0}),Dr.default.addEventListener("push_notification_click",(e=>{if("push_settings"===e.action)return;if("mute1d"===e.action)return void this.managers.apiManager.invokeApi("account.updateDeviceLocked",{period:86400}).then((()=>{}));const t=e.custom&&e.custom.peerId.toPeerId();console.log("click",e,t),t&&this.topMessagesDeferred.then((()=>Or(this,void 0,void 0,(function*(){e.custom.channel_id&&!(yield this.managers.appChatsManager.hasChat(e.custom.channel_id))||t.isUser()&&!(yield this.managers.appUsersManager.hasUser(t))||Xr.setInnerPeer({peerId:t,lastMsgId:(0,yt.Z)(+e.custom.msg_id)})}))))}))}buildNotification({message:e,fwdCount:t,peerReaction:i,peerTypeNotifySettings:s}){return Or(this,void 0,void 0,(function*(){const n=e.peerId,a=n.isAnyChat(),o={},[r,d=!1]=yield Promise.all([this.managers.appPeersManager.getPeerString(n),a&&this.managers.appPeersManager.isForum(n)]);let l,c=!1;if(s.show_previews)if("message"===e._&&e.fwd_from&&t>1)l=C.ZP.format("Notifications.Forwarded",!0,[t]);else{l=yield(0,G.Z)({message:e,plain:!0});const t=null==i?void 0:i.reaction;if("reactionEmoji"===(null==t?void 0:t._)){const e="Notification.Contact.Reacted",i=[(0,Rr.Z)(t.emoticon),l];l=C.ZP.format(e,!0,i)}else c=!0}else l=C.ZP.format("Notifications.New",!0);i&&(o.noIncrement=!0,o.silent=!0);const h=d?(0,v.Z)(e,d):void 0,u=i?(0,D.Z)(i.peer_id):e.fromId;if(o.title=yield(0,_r.Z)({peerId:n,plainText:!0,managers:this.managers,threadId:h}),d){const t=yield(0,_r.Z)({peerId:n,plainText:!0,managers:this.managers});o.title+=` (${t})`,c&&u!==e.peerId&&(l=(yield(0,_r.Z)({peerId:u,plainText:!0,managers:this.managers}))+": "+l)}else a&&u!==e.peerId&&(o.title=(yield(0,_r.Z)({peerId:u,plainText:!0,managers:this.managers}))+" @ "+o.title);o.title=(0,Br.Z)(o.title),o.onclick=()=>{Xr.setInnerPeer({peerId:n,lastMsgId:e.mid,threadId:h})},o.message=l,o.key="msg"+e.mid,o.tag=r,o.silent=!0;const p=yield this.managers.appPeersManager.getPeerPhoto(n);p?this.managers.appAvatarsManager.loadAvatar(n,p,"photo_small").then((t=>{(e.pFlags.unread||i)&&(o.image=t,this.notify(o))})):this.notify(o)}))}toggleToggler(e=wt.Z.isIdle){if(T.IS_MOBILE)return;const t=e=>{this.titleChanged=!1,document.title=this.titleBackup,this.setFavicon()};window.clearInterval(this.titleInterval),this.titleInterval=0,e?this.titleInterval=window.setInterval((()=>{const e=this.notificationsCount;if(e)if(this.titleChanged)t();else{this.titleChanged=!0,document.title=C.ZP.format("Notifications.Count",!0,[e]);const t=document.createElement("canvas");t.width=32*window.devicePixelRatio,t.height=t.width;const i=t.getContext("2d");i.beginPath(),i.arc(t.width/2,t.height/2,t.width/2,0,2*Math.PI,!1),i.fillStyle="#3390ec",i.fill();let s=24,n=""+e;e<10?s=22:e<100?s=20:(n="99+",s=16),s*=window.devicePixelRatio,i.font=`700 ${s}px ${kt.bt}`,i.textBaseline="middle",i.textAlign="center",i.fillStyle="white",i.fillText(n,t.width/2,.5625*t.height),this.setFavicon(t.toDataURL())}else this.toggleToggler(!1)}),1e3):t()}setFavicon(e){this.prevFavicon!==e&&(this.prevFavicon=e,this.faviconElements.forEach(((t,i,s)=>{const n=t.cloneNode();n.dataset.href||(n.dataset.href=n.href),null!=e||(e=n.dataset.href),n.href=e,t.replaceWith(s[i]=n)})))}notify(e){if(this.stopped)return;e.image||(e.image="assets/img/logo_filled_rounded.png"),e.noIncrement||++this.notificationsCount,this.titleInterval||this.toggleToggler();const t=++this.notificationIndex,i=e.key||"k"+t;this.notificationsShown[i]=!0;const s=(0,Ht.Z)();if(this.settings.volume>0&&!this.settings.nosound&&(this.testSound(this.settings.volume),this.soundsPlayed[e.tag]=s),!this.notificationsUiSupport||"Notification"in window&&"granted"!==Notification.permission)return!1;if(this.settings.nodesktop)return this.vibrateSupport&&!this.settings.novibrate?void navigator.vibrate([200,100,200]):void 0;let n;if("Notification"in window){try{if(e.tag)for(const t in this.notificationsShown){const i=this.notificationsShown[t];"boolean"!=typeof i&&i.tag===e.tag&&(i.hidden=!0)}n=new Notification(e.title,{icon:e.image||"",body:e.message||"",tag:e.tag||"",silent:e.silent||!1})}catch(e){return this.notificationsUiSupport=!1,void Dr.default.setLocalNotificationsDisabled()}n.onclick=()=>{n.close(),Nr.Z.focus(),this.clear(),e.onclick&&e.onclick()},n.onclose=()=>{n.hidden||(delete this.notificationsShown[i],this.clear())},n.show&&n.show(),this.notificationsShown[i]=n,T.IS_MOBILE||setTimeout((()=>{this.hide(i)}),8e3)}}getLocalSettings(){return this.settings}hide(e){const t=this.notificationsShown[e];if(t&&"boolean"!=typeof t)try{t.close&&(t.hidden=!0,t.close())}catch(e){}}soundReset(e){delete this.soundsPlayed[e]}testSound(e){const t=(0,Ht.Z)();if(this.nextSoundAt&&t\n \n `,this.notifySoundEl.append(s),s.addEventListener("ended",(()=>{s.remove()}),{once:!0})}cancel(e){const t=this.notificationsShown[e];if(t){this.notificationsCount>0&&--this.notificationsCount;try{"boolean"!=typeof t&&t.close&&(t.hidden=!0,t.close())}catch(e){}delete this.notificationsShown[e]}}clear(){for(const e in this.notificationsShown){const t=this.notificationsShown[e];try{"boolean"!=typeof t&&t.close&&t.close()}catch(e){}}this.notificationsShown={},this.notificationsCount=0,Dr.default.hidePushNotifications()}start(){if(this.updateLocalSettings(),d.Z.addEventListener("settings_updated",this.updateLocalSettings),Dr.default.start(),!this.notificationsUiSupport)return!1;"Notification"in window&&"granted"!==Notification.permission&&"denied"!==Notification.permission&&window.addEventListener("click",this.requestPermission);try{"onbeforeunload"in window&&window.addEventListener("beforeunload",this.clear)}catch(e){}}stop(){this.clear(),window.clearInterval(this.titleInterval),this.titleInterval=0,this.setFavicon(),this.stopped=!0}registerDevice(e){if(this.registeredDevice&&(0,mo.Z)(this.registeredDevice,e))return!1;this.managers.apiManager.invokeApi("account.registerDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[],app_sandbox:!1,secret:new Uint8Array}).then((()=>{this.registeredDevice=e}),(e=>{e.handled=!0}))}unregisterDevice(e){if(!this.registeredDevice)return!1;this.managers.apiManager.invokeApi("account.unregisterDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[]}).then((()=>{this.registeredDevice=!1}),(e=>{e.handled=!0}))}};me.GO&&(me.GO.uiNotificationsManager=Ur);const Hr=Ur;var zr=i(2423),jr=i(236),Gr=i(5936),Vr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function Kr(e,t=!1){return Vr(this,void 0,void 0,(function*(){const i=[],s=(e,n)=>Vr(this,void 0,void 0,(function*(){if(e.isDirectory){const t=e.createReader();yield new Promise(((e,i)=>{t.readEntries((t=>Vr(this,void 0,void 0,(function*(){for(const e of t)yield s(e,n);e()}))))}))}else if(e)if(t)i.push(e.type);else{const t=n.getAsFile(),s=e instanceof File?e:e instanceof DataTransferItem?e.getAsFile():yield new Promise(((i,s)=>e.file(i,(e=>i(t)))));if(!s)return;i.push(s)}}));if(e instanceof DragEvent&&e.dataTransfer.files&&!e.dataTransfer.items)for(let s=0;s{!e.noCancelEvent&&(0,Ce.Z)(null);let i,s,n=t.href;const a=new URL(n),o=a.host.match(/(.+?)\.t(?:elegram)?\.me/);o&&!m.BX.has(o[1])&&(a.pathname=o[1]+("/"===a.pathname?"":a.pathname),n=a.toString()),e.noPathnameParams||(i=new URL(n).pathname.split("/").slice(1)),e.noUriParams||(s=(0,Wr.Z)(n));const r=e.callback({pathnameParams:i,uriParams:s},t);return void 0===r&&r}}var qr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Qr extends l.Z{constructor(){super(...arguments),this.columnEl=document.getElementById("column-center"),this.offline=!1,this.updateStatusInterval=0,this.setPeerPromise=null,this.tabId=-1,this.chats=[],this.cacheStorage=new Gr.Z("cachedFiles"),this.onHashChange=e=>{try{this.onHashChangeUnsafe(e)}catch(e){this.log.error("hash change error",e)}},this.onHashChangeUnsafe=e=>{const t=location.hash;e||Dn.Z.replaceState();const i=t.split("?"),s=(0,Wr.Z)(t,i);if(this.log("hashchange",t,i[0],s),t)if(s.tgaddr)this.openUrl(s.tgaddr);else switch(i[0]){default:s.p=i[0].slice(1);case"#/im":{if(!Object.keys(s).length)break;const e=s.p,t=void 0!==s.post?(0,yt.Z)(+s.post):void 0;"@"===e[0]?this.openUsername({userName:e,lastMsgId:t}):this.setInnerPeer({peerId:t?e.toPeerId(!0):e.toPeerId(),lastMsgId:t})}}},this.setSettings=()=>{const{messagesTextSize:e}=d.Z.settings;this.customEmojiSize=(0,qe.C)(e+4,e+4),document.documentElement.style.setProperty("--messages-text-size",e+"px"),this.customEmojiSize&&(document.querySelectorAll("middle-ellipsis-element").forEach((t=>{t.disconnectedCallback(),t.dataset.fontSize=""+e,t.title&&(t.textContent=t.title),t.connectedCallback()})),document.querySelectorAll(".chat custom-emoji-renderer-element").forEach((e=>{e.forceRenderAfterSize=!0}))),document.body.classList.toggle("animation-level-0",!d.Z.settings.animationsEnabled),document.body.classList.toggle("animation-level-1",!1),document.body.classList.toggle("animation-level-2",d.Z.settings.animationsEnabled),this.chatsSelectTabDebounced=(0,Ze.Z)((()=>{var e;null===(e=this.chat.topbar.pinnedMessage)||void 0===e||e.setCorrectIndex(0),this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)}),d.Z.settings.animationsEnabled?250:0,!1,!0),Rs.Z.setLoop(d.Z.settings.stickers.loop),s.Z.checkAnimations2(!1);for(const e of this.chats)e.setAutoDownloadMedia();C.ZP.setTimeFormat(d.Z.settings.timeFormat),this.toggleChatGradientAnimation(this.chat)},this.onDocumentPaste=(e,t)=>qr(this,void 0,void 0,(function*(){const i=Pn();if(e instanceof DragEvent){const t=e.dataTransfer.types;(t.contains?t.contains("Files"):t.indexOf("Files")>=0)&&(0,Ce.Z)(e)}const s=yield Kr(e);if(((yield this.canDrag())||i)&&s.length){if(i)return void i.addFiles(s);const e=this.chat.input;e.willAttachType=t||(vn.Z.has(s[0].type)?"media":"document"),w.Z.createPopup(Zn,this.chat,s,e.willAttachType)}}))}get myId(){return d.Z.myId}get chat(){return this.chats[this.chats.length-1]}construct(e){this.managers=e;const{apiUpdatesManager:t}=e;t.attach(C.ZP.lastRequestedLangCode),ma.Z.construct(e),Hr.construct(e),Hr.start(),this.log=(0,r.kg)("IM",r.v9.Log|r.v9.Warn|r.v9.Debug|r.v9.Error),this.backgroundPromises={},jr.h.settings.themes.forEach((e=>{if(e.background.slug){const t="assets/img/"+e.background.slug+".svg"+(T.IS_FIREFOX?"?1":"");this.backgroundPromises[e.background.slug]=Promise.resolve(t)}})),this.selectTab(0),wt.Z.addEventListener("change",(e=>{this.offline=e,this.updateStatus(),e?clearInterval(this.updateStatusInterval):this.updateStatusInterval=window.setInterval((()=>this.updateStatus()),5e4)})),this.chatsContainer=document.createElement("div"),this.chatsContainer.classList.add("chats-container","tabs-container"),this.chatsContainer.dataset.animation="navigation",this.emojiAnimationContainer=document.createElement("div"),this.emojiAnimationContainer.classList.add("emoji-animation-container"),this.appendEmojiAnimationContainer(o.Z.activeScreen),this.columnEl.append(this.chatsContainer),this.createNewChat(),this.chatsSelectTab(this.chat.container),Dn.Z.onHashChange=this.onHashChange,this.setSettings(),d.Z.addEventListener("settings_updated",this.setSettings);const i=e=>{document.body.classList.toggle("is-premium",e)};d.Z.addEventListener("premium_toggle",i),i(d.Z.premium),this.managers.rootScope.getPremium().then(i),(0,ue.ZP)((()=>{s.Z.setOnlyOnePlayableGroup("lock"),s.Z.checkAnimations2(!0)}),(()=>{s.Z.setOnlyOnePlayableGroup(),s.Z.checkAnimations2(!1)})),T.IS_FIREFOX&&Sn.Z.oldVersion&&-1===(0,Ar.Z)(Sn.Z.oldVersion,"1.4.3")?this.deleteFilesIterative((e=>"image/svg+xml"===e.headers.get("Content-Type"))).then((()=>{this.applyCurrentTheme()})):this.applyCurrentTheme(),o.Z.addEventListener("changeScreen",((e,t)=>{document.body.classList.contains(n.ir)&&document.body.classList.contains(a.HQ)&&a.ZP.toggleSidebar(!1),this.appendEmojiAnimationContainer(t)})),o.Z.addEventListener("resize",(()=>{const e=this.chatsContainer.getBoundingClientRect();vo.resizeInstances(e.width,e.height).then((()=>{}))})),this.addEventListener("peer_changing",(e=>{this.saveChatPosition(e)})),d.Z.addEventListener("theme_change",(()=>{this.applyCurrentTheme()})),d.Z.addEventListener("choosing_sticker",(e=>{this.setChoosingStickerTyping(!e)})),d.Z.addEventListener("peer_title_edit",(({peerId:e,threadId:t})=>{var i;(null===(i=this.chat)||void 0===i?void 0:i.peerId)!==e||t||-1===this.tabId||this.overrideHash(e)})),d.Z.addEventListener("peer_typings",(({peerId:e,typings:t})=>{var i;const s=this.chat;if(!s||s.peerId!==e||St.Z.isOverlayActive||o.Z.activeScreen===o._.mobile&&1!==this.tabId)return;const n=t.find((e=>"sendMessageEmojiInteraction"===e.action._));if("sendMessageEmojiInteraction"===(null===(i=null==n?void 0:n.action)||void 0===i?void 0:i._)){const t=n.action,i=s.bubbles.bubbles[(0,yt.Z)(n.action.msg_id)];if(i&&i.classList.contains("emoji-big")&&(0,He.Z)(i,s.bubbles.scrollable.container)){const s=i.querySelector(".media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)");JSON.parse(t.interaction.data).a.forEach((e=>{setTimeout((()=>{(0,S.tH)(s)}),1e3*e.t)})),this.managers.appMessagesManager.setTyping(e,{_:"sendMessageEmojiInteractionSeen",emoticon:t.emoticon})}}}));const l=e=>{const t="version"===e,i=new w.Z("popup-instance-deactivated",{overlayClosable:!0}),s=document.createElement("div");s.classList.add("instance-deactivated-container"),i.container.replaceWith(s);const n=document.createElement("div");n.classList.add("header"),n.append((0,C.ag)(t?"Deactivated.Version.Title":"Deactivated.Title"));const a=document.createElement("div");a.classList.add("subtitle"),a.append((0,C.ag)(t?"Deactivated.Version.Subtitle":"Deactivated.Subtitle")),s.append(n,a),document.body.classList.add("deactivated");const o=t?()=>{Nr.Z.reload()}:()=>{document.body.classList.add("deactivated-backwards"),Zo.Z.activateInstance(),setTimeout((()=>{document.body.classList.remove("deactivated","deactivated-backwards")}),333)};i.addEventListener("close",o),i.show()};Zo.Z.addEventListener("deactivated",l),Zo.Z.deactivatedReason&&l(Zo.Z.deactivatedReason),this.addEventListener("chat_changing",(({to:e})=>{this.toggleChatGradientAnimation(e)})),d.Z.addEventListener("service_notification",(e=>{(0,vi.Z)({button:{langKey:"OK",isCancel:!0},description:(0,ft.ZP)(e.message)})})),d.Z.addEventListener("payment_sent",(({peerId:e,mid:t,receiptMessage:i})=>qr(this,void 0,void 0,(function*(){const s=yield this.managers.appMessagesManager.getMessageByPeer(e,t);if(!s)return;const n=i.action;(0,ye.bC)({langPackKey:"PaymentInfoHint",langPackArguments:[(0,Pt.Z)(n.total_amount,n.currency),(0,R.Z)(s.media.title)]})})))),window.onSpoilerClick=e=>{const t=(0,ve.Z)(e.target,"spoiler"),i=(0,ve.Z)(t,"spoilers-container")||t.parentElement,s="is-spoiler-visible",n=i.classList.contains(s);n||((0,Ce.Z)(e),"click"!==S.pf&&window.addEventListener("click",Ce.Z,{capture:!0,once:!0}));const a=n?0:2;a&&i.classList.add("will-change");const o=i.dataset.spoilerTimeout;null!==o&&(clearTimeout(+o),delete i.dataset.spoilerTimeout),(0,Fe.Z)({element:i,className:s,forwards:!0,duration:200,onTransitionEnd:()=>{i.dataset.spoilerTimeout=""+window.setTimeout((()=>{(0,Fe.Z)({element:i,className:s,forwards:!1,duration:200,onTransitionEnd:()=>{i.classList.remove("will-change"),delete i.dataset.spoilerTimeout}})}),5e3)},useRafs:a})},d.Z.addEventListener("sticker_updated",(({type:e,faved:t})=>{"faved"===e?(0,ye.bC)({langPackKey:t?"AddedToFavorites":"RemovedFromFavorites"}):t||(0,ye.bC)({langPackKey:"RemovedFromRecent"})})),Sn.Z.addEventListener("notificationBuild",(e=>qr(this,void 0,void 0,(function*(){const t=yield this.managers.appPeersManager.isForum(e.message.peerId),i=(0,v.Z)(e.message,t);(this.chat.peerId!==e.message.peerId||this.chat.threadId!==i||wt.Z.isIdle)&&Hr.buildNotification(e)})))),this.addEventListener("peer_changed",(({peerId:e})=>qr(this,void 0,void 0,(function*(){document.body.classList.toggle("has-chat",!!e),this.emojiAnimationContainer.textContent="",this.overrideHash(e),Sn.Z.updateTabState("chatPeerIds",this.chats.map((e=>e.peerId)).filter(Boolean))})))),Mo.Z.setToCache("chatPositions",{}),(Oe.Z||so.Z)&&(this.topbarCall=new Tr(e)),Oe.Z&&(Zr.Z.addEventListener("instance",(({instance:e})=>{const t=new Ir(e);e.addEventListener("acceptCallOverride",(()=>this.discardCurrentCall(e.interlocutorUserId.toPeerId(),void 0,e).then((()=>(Zr.Z.dispatchEvent("accepting",e),!0))).catch((()=>!1)))),t.addEventListener("close",(()=>{const t=Zr.Z.currentCall;t&&t!==e&&!e.wasTryingToJoin&&e.hangUp("phoneCallDiscardReasonBusy")}),{once:!0}),t.show()})),Zr.Z.addEventListener("incompatible",(e=>qr(this,void 0,void 0,(function*(){(0,ye.bC)({langPackKey:"VoipPeerIncompatible",langPackArguments:[yield(0,Vt.Z)({peerId:e.toPeerId()})]})}))))),Zo.Z.activateInstance();const c=()=>{ko.default.setAuthorized(!0)};setInterval(c,A.s2),c(),$r({name:"showMaskedAlert",callback:(e,t)=>{const i=t.href,s=t.cloneNode(!0);s.className="anchor-url",s.innerText=i,s.removeAttribute("onclick"),new xs.Z("popup-masked-url",{titleLangKey:"OpenUrlTitle",descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[s],buttons:[{langKey:"Open",callback:()=>{s.click()}}]}).show()}}),$r({name:"execBotCommand",callback:({uriParams:e})=>{const{command:t,bot:i}=e;this.managers.appMessagesManager.sendText(this.chat.peerId,"/"+t+(i?"@"+i:""))}}),$r({name:"searchByHashtag",callback:({uriParams:e})=>{const{hashtag:t}=e;t&&this.chat.initSearch("#"+t+" ")}}),[["addstickers",Te.STICKER_SET],["addemoji",Te.EMOJI_SET]].forEach((([e,t])=>{$r({name:e,callback:({pathnameParams:e})=>{if(!e[1])return;const i={_:t,set:e[1]};this.processInternalLink(i)}}),$r({name:e,protocol:"tg",callback:({uriParams:e})=>{const i=this.makeLink(t,e);this.processInternalLink(i)}})})),$r({name:"invoice",callback:({pathnameParams:e})=>{const t={_:Te.INVOICE,slug:e.length>1?e[1]:e[0].slice(1)};this.processInternalLink(t)}}),$r({name:"joinchat",callback:({pathnameParams:e})=>{const t={_:Te.JOIN_CHAT,invite:e[1]||decodeURIComponent(e[0]).slice(1)};this.processInternalLink(t)}}),so.Z&&$r({name:"voicechat",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Te.VOICE_CHAT,e);this.processInternalLink(t)}}),$r({name:"im",callback:({pathnameParams:e,uriParams:t},i)=>qr(this,void 0,void 0,(function*(){let s;if(zr.kO.test(e[0]))s={_:Te.USER_PHONE_NUMBER,phone:e[0].slice(1)};else if("c"===e[0]){e.shift();const n="thread"in t?t.thread:e[2]&&e[1];s={_:Te.PRIVATE_POST,channel:e[0],post:e[2]||e[1],thread:n,comment:t.comment,stack:this.getStackFromElement(i)}}else{const n="thread"in t?t.thread:e[2]&&e[1];s={_:Te.MESSAGE,domain:e[0],post:e[2]||e[1],thread:n,comment:t.comment,start:"start"in t?t.start:void 0,stack:this.getStackFromElement(i)}}this.processInternalLink(s)}))}),$r({name:"resolve",protocol:"tg",callback:({uriParams:e},t)=>{let i;e.phone?i=this.makeLink(Te.USER_PHONE_NUMBER,e):"telegrampassport"===e.domain||(i=this.makeLink(Te.MESSAGE,Object.assign(Object.assign({},e),{stack:this.getStackFromElement(t)}))),this.processInternalLink(i)}}),$r({name:"privatepost",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Te.PRIVATE_POST,e);this.processInternalLink(t)}}),$r({name:"invoice",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Te.INVOICE,e);this.processInternalLink(t)}}),["joinchat","join"].forEach((e=>{$r({name:e,protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Te.JOIN_CHAT,e);this.processInternalLink(t)}})})),this.onHashChange(!0),this.attachKeydownListener(),this.handleAutologinDomains()}handleUrlAuth(e){const{peerId:t,mid:i,buttonId:s,url:n}=e,a=e=>{window.open(e,"_blank")},o=e=>qr(this,void 0,void 0,(function*(){if("urlAuthResultRequest"===e._){const r=document.createElement("b");r.append(e.domain);const l=yield(0,Vt.Z)({peerId:d.Z.myId}),c=yield(0,Vt.Z)({peerId:e.bot.id.toPeerId()}),h={text:"OpenUrlOption1",textArgs:[r.cloneNode(!0),l],checked:!0},u=e.pFlags.request_write_access?{text:"OpenUrlOption2",textArgs:[c],checked:!0}:void 0,p=[h,u],f=(0,vi.Z)({titleLangKey:"OpenUrlTitle",button:{langKey:"Open"},descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[r],checkboxes:p.filter(Boolean)});u&&h.checkboxField.input.addEventListener("change",(()=>{const e=!h.checkboxField.checked;u.checkboxField.toggleDisability(e),e&&(u.checkboxField.checked=!1)}));const[m,g]=yield f;if(!m)return void a(n);const v=yield this.managers.appSeamlessLoginManager.acceptUrlAuth(n,t,i,s,g);return o(v)}"urlAuthResultAccepted"===e._?(e=>{a(e.url)})(e):a(n)}));return this.managers.appSeamlessLoginManager.requestUrlAuth(n,t,i,s).then((e=>{o(e)}))}handleAutologinDomains(){let e;d.Z.addEventListener("app_config",(t=>{e=t}));const t=t=>{var i,s;const n=new URL(t.href);if(e.url_auth_domains.includes(n.hostname))return this.handleUrlAuth({url:t.href}),void(0,Ce.Z)();if(!e.autologin_token||!e.autologin_domains)return;const a=null!==(i=(s=t.dataset).originalUrl)&&void 0!==i?i:s.originalUrl=t.href;e.autologin_domains.includes(n.hostname)&&(n.searchParams.set("autologin_token",e.autologin_token),t.href=n.toString(),setTimeout((()=>{t.href=a,delete t.dataset.originalUrl}),0))};document.addEventListener("click",(e=>{const i=(0,be.Z)(e.target,"A");(null==i?void 0:i.href)&&t(i)}))}getStackFromElement(e){const t=(0,ve.Z)(e,"bubble");return t?+t.dataset.mid:void 0}deleteFilesIterative(e){return this.cacheStorage.timeoutOperation((t=>{const i=performance.now();return t.keys().then((i=>{const s=i.map((i=>t.match(i).then((t=>e(t)))));return Promise.all(s).then((e=>(e.map(((e,s)=>{if(!e)return;const n=i[s];return t.delete(n)})),Promise.all(e.filter(Boolean)))))})).then((()=>{this.log("deleted files",performance.now()-i)}))}))}toggleChatGradientAnimation(e){this.chats.forEach((t=>{t.gradientRenderer&&t.gradientRenderer.scrollAnimate(d.Z.settings.animationsEnabled&&t===e)}))}appendEmojiAnimationContainer(e){const t=e===o._.mobile?this.columnEl:document.body;this.emojiAnimationContainer.parentElement!==t&&t.append(this.emojiAnimationContainer)}attachKeydownListener(){const e=new Set(["PageUp","PageDown","Meta","Control"]);document.body.addEventListener("keydown",(t=>{var i;const s=t.key,n=document.getSelection().isCollapsed;if(St.Z.isOverlayActive||e.has(s))return;const a=t.target,r=this.chat;if((!(s.startsWith("Arrow")||t.shiftKey&&"Shift"===s)||n)&&("KeyC"!==t.code||!t.ctrlKey&&!t.metaKey||"INPUT"===a.tagName)){if(!t.altKey||"ArrowUp"!==s&&"ArrowDown"!==s){if("ArrowUp"===s&&"scheduled"!==this.chat.type){if(r.input.editMsgId||!r.input.isInputEmpty())return;this.managers.appMessagesManager.getFirstMessageToEdit(r.peerId,r.threadId).then((e=>{e&&(r.input.initMessageEditing(e.mid),(0,Ce.Z)(t))}))}else if("ArrowDown"===s)return}else(0,Ce.Z)(t),this.managers.dialogsStorage.getNextDialog(this.chat.peerId,"ArrowDown"===s,Ji.default.filterId).then((e=>{e&&this.setPeer({peerId:e.peerId})}));if((null===(i=null==r?void 0:r.input)||void 0===i?void 0:i.messageInput)&&t.target!==r.input.messageInput&&"INPUT"!==a.tagName&&!a.isContentEditable&&!c.Z&&(!o.Z.isMobile||1===this.tabId)&&!r.selection.isSelecting&&!r.input.recording){r.input.messageInput.focus(),(0,Nt.Z)(r.input.messageInput);const e=new KeyboardEvent(t.type,t);r.input.messageInput.dispatchEvent(e)}}}))}makeLink(e,t){return Object.assign({_:e},t)}processInternalLink(e){return qr(this,void 0,void 0,(function*(){switch(null==e?void 0:e._){case Te.MESSAGE:{const t=e.post?(0,yt.Z)(+e.post):void 0,i=e.comment?(0,yt.Z)(+e.comment):void 0,s=e.thread?(0,yt.Z)(+e.thread):void 0;this.openUsername({userName:e.domain,lastMsgId:t,commentId:i,startParam:e.start,stack:e.stack,threadId:s});break}case Te.PRIVATE_POST:{const t=e.channel.toChatId(),i=(t.toPeerId(!0),yield this.managers.appChatsManager.getChat(t));if(!i)try{yield this.managers.appChatsManager.resolveChannel(t)}catch(e){throw(0,ye.bC)({langPackKey:"LinkNotFound"}),e}const s=(0,yt.Z)(+e.post),n=e.thread?(0,yt.Z)(+e.thread):void 0;this.op({peer:i,lastMsgId:s,threadId:n,stack:e.stack});break}case Te.EMOJI_SET:case Te.STICKER_SET:new M.Z({id:e.set},e._===Te.EMOJI_SET).show();break;case Te.JOIN_CHAT:this.managers.appChatsManager.checkChatInvite(e.invite).then((t=>{t.chat&&this.managers.appChatsManager.saveApiChat(t.chat,!0),"chatInviteAlready"!==t._&&"chatInvitePeek"!==t._?new Ge(e.invite,t):this.setInnerPeer({peerId:t.chat.id.toPeerId(!0)})}),(e=>{"INVITE_HASH_EXPIRED"===e.type&&(0,ye.Am)((0,C.ag)("InviteExpired"))}));break;case Te.VOICE_CHAT:so.Z&&this.joinGroupCall(e.chat_id.toPeerId(!0),e.id);break;case Te.USER_PHONE_NUMBER:this.managers.appUsersManager.resolvePhone(e.phone).then((e=>{this.setInnerPeer({peerId:e.id.toPeerId(!1)})})).catch((e=>{"PHONE_NOT_OCCUPIED"===e.type&&(0,ye.bC)({langPackKey:"Alert.UserDoesntExists"})}));break;case Te.INVOICE:this.managers.appPaymentsManager.getInputInvoiceBySlug(e.slug).then((e=>{this.managers.appPaymentsManager.getPaymentForm(e).then((t=>{new Ui(void 0,e,t)}))}));break;default:this.log.warn("Not supported internal link:",e)}}))}openUrl(e){const{url:t,onclick:i}=(0,fs.Z)(e);if(!i)return;const s=document.createElement("a");s.href=t,window[i](s)}op(e){return qr(this,void 0,void 0,(function*(){let{peer:t,commentId:i,threadId:s,lastMsgId:n}=e;const a="user"===t._,o=t.id.toPeerId(!a),r="channel"===t._&&t.pFlags.forum;if(i||s||n||!r){if(r&&n&&!s){const t=yield this.managers.appMessagesManager.reloadMessages(o,n);t?s=e.threadId=(0,v.Z)(t,r):(s=e.threadId=n,n=e.lastMsgId=void 0)}return s?this.openThread(Object.assign(Object.assign({},e),{peerId:o})):i?this.openComment({peerId:o,msgId:n,commentId:i}):this.setInnerPeer(Object.assign(Object.assign({},e),{peerId:o}))}Ji.default.toggleForumTabByPeerId(o,!0)}))}openPremiumBot(){return this.managers.apiManager.getAppConfig().then((e=>this.openUsername({userName:e.premium_bot_username})))}openUsername(e){const{userName:t}=e;return this.managers.appUsersManager.resolveUsername(t).then((t=>this.op(Object.assign({peer:t},e))),(e=>{"USERNAME_NOT_OCCUPIED"===e.type?(0,ye.bC)({langPackKey:"NoUsernameFound"}):"USERNAME_INVALID"===e.type&&(0,ye.bC)({langPackKey:"Alert.UserDoesntExists"})}))}openThread(e){return qr(this,void 0,void 0,(function*(){return(yield this.managers.appChatsManager.isForum(e.peerId.toChatId()))?(yield this.managers.dialogsStorage.getForumTopicOrReload(e.peerId,e.threadId),this.setInnerPeer(e)):this.managers.appMessagesManager.reloadMessages(e.peerId,e.threadId).then((t=>(t?this.managers.appMessagesManager.generateThreadServiceStartMessage(t):e.lastMsgId=void 0,this.setInnerPeer(Object.assign(Object.assign({},e),{type:"discussion"})))))}))}openComment(e){return this.managers.appMessagesManager.getDiscussionMessage(e.peerId,e.msgId).then((t=>this.openThread({peerId:t.peerId,lastMsgId:e.commentId,threadId:t.mid})))}callUser(e,t){return qr(this,void 0,void 0,(function*(){Zr.Z.getCallByUserId(e)||((yield this.managers.appProfileManager.getProfile(e)).pFlags.phone_calls_private?(0,Vt.Z)({peerId:e.toPeerId()}).then((e=>(0,vi.Z)({descriptionLangKey:"Call.PrivacyErrorMessage",descriptionLangArgs:[e],button:{langKey:"OK",isCancel:!0}}))):(yield this.discardCurrentCall(e.toPeerId()),Zr.Z.startCallInternal(e,"video"===t)))}))}discardCurrentCall(e,t,i){return oo.ZP.groupCall&&oo.ZP.groupCall!==t?this.discardGroupCallConfirmation(e):Zr.Z.currentCall&&Zr.Z.currentCall!==i?this.discardCallConfirmation(e):Promise.resolve()}discardCallConfirmation(e){return qr(this,void 0,void 0,(function*(){const t=Zr.Z.currentCall;t&&(yield Promise.all([(0,Vt.Z)({peerId:t.interlocutorUserId.toPeerId(!1)}),(0,Vt.Z)({peerId:e})]).then((([t,i])=>(0,vi.Z)({titleLangKey:"Call.Confirm.Discard.Call.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Call.ToCall.Text":"Call.Confirm.Discard.Call.ToVoice.Text",descriptionLangArgs:[t,i],button:{langKey:"OK"}}))),t.isClosing||(yield t.hangUp("phoneCallDiscardReasonDisconnect")))}))}discardGroupCallConfirmation(e){return qr(this,void 0,void 0,(function*(){const t=oo.ZP.groupCall;t&&(yield Promise.all([(0,Vt.Z)({peerId:t.chatId.toPeerId(!0)}),(0,Vt.Z)({peerId:e})]).then((([t,i])=>(0,vi.Z)({titleLangKey:"Call.Confirm.Discard.Voice.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Voice.ToCall.Text":"Call.Confirm.Discard.Voice.ToVoice.Text",descriptionLangArgs:[t,i],button:{langKey:"OK"}}))),oo.ZP.groupCall===t&&(yield t.hangUp()))}))}joinGroupCall(e,t){return qr(this,void 0,void 0,(function*(){const i=e.toChatId(),s=this.managers.appChatsManager.hasRights(i,"manage_call");if(t&&"groupCallDiscarded"===(yield this.managers.appGroupCallsManager.getGroupCallFull(t))._){if(!s)return void(0,ye.bC)({langPackKey:"VoiceChat.Chat.Ended"});yield(0,vi.Z)({descriptionLangKey:"VoiceChat.Chat.StartNew",button:{langKey:"VoiceChat.Chat.StartNew.OK"}})}(()=>{qr(this,void 0,void 0,(function*(){const e=yield this.managers.appProfileManager.getChatFull(i);let t;if(e.call)t=e.call;else{if(!s)return;t=yield this.managers.appGroupCallsManager.createGroupCall(i)}oo.ZP.joinGroupCall(i,t.id,!0,!1)}))})()}))}setCurrentBackground(e=!1){const t=bo.Z.getTheme();if(t.background.slug){const i=jr.h.settings.themes.find((e=>e.name===t.name));return this.getBackground(t.background.slug).then((t=>this.setBackground(t,e)),(()=>(t.background=(0,ba.Z)(i.background),this.setCurrentBackground(!0))))}return this.setBackground("",e)}getBackground(e){return this.backgroundPromises[e]?this.backgroundPromises[e]:this.backgroundPromises[e]=this.cacheStorage.getFile("backgrounds/"+e).then((e=>URL.createObjectURL(e)))}setBackground(e,t=!0){this.lastBackgroundUrl=e;const i=this.chats.map((t=>t.setBackground(e)));return i[i.length-1].then((()=>{t&&d.Z.dispatchEvent("background_change")}))}saveChatPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.bubbles,i=e.peerId+(e.threadId?"_"+e.threadId:""),s=Mo.Z.getFromCache("chatPositions");if(t.scrollable.getDistanceToEnd()<=16&&t.scrollable.loadedAll.bottom||!t.getRenderedLength())delete s[i],this.log("deleted chat position");else{t.sliceViewport(!0);const e=t.scrollable.scrollTop,n={mids:(0,ot.Z)(t.bubbles,"desc").filter((e=>e>0&&!t.skippedMids.has(e))),top:e};s[i]=n,this.log("saved chat position:",n)}Mo.Z.set({chatPositions:s},!0)}getChatSavedPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.peerId+(e.threadId?"_"+e.threadId:""),i=Mo.Z.getFromCache("chatPositions");return i&&i[t]}applyCurrentTheme(e,t,i){return t&&(this.backgroundPromises[e]=Promise.resolve(t)),bo.Z.setTheme(),this.setCurrentBackground(void 0===i?!!e:i)}chatsSelectTab(e,t){if(this.prevTab!==e){if(!1===t&&this.prevTab&&Po([e,this.prevTab].filter(Boolean)),this.prevTab){this.prevTab.classList.remove("active"),this.chatsSelectTabDebounced(),d.Z.settings.animationsEnabled&&!1!==t&&(0,ue.YW)((0,nt.Z)(400),400);const i=(0,Ie.Z)(this.prevTab);(0,Ie.Z)(e)>i&&Dn.Z.pushItem({type:"chat",onPop:e=>{this.setPeer({},e),(0,Vn.Z)()}})}e.classList.add("active"),this.prevTab=e}}init(){document.addEventListener("paste",this.onDocumentPaste,!0),c.Z||this.attachDragAndDropListeners(),this.markupTooltip=new Lo(this),this.markupTooltip.handleSelection()}attachDragAndDropListeners(){const e=[],t=[];let i=!1;const s=(r,d)=>qr(this,void 0,void 0,(function*(){if(d===i)return;const l=r.dataTransfer.types,c=l.contains?l.contains("Files"):l.indexOf("Files")>=0,h=Pn(),u=yield Kr(r,!0);if(!c||!(yield this.canDrag())&&!h)return void(n=0);const p=h?o:a,f=h?t:e;if(d&&!f.length){const e=c&&!u.length,t=u.filter((e=>vn.Z.has(e))).length;this.log("drag files",u),h?(h.appendDrops(p),(u.length||e)&&f.push(new Io(p,{header:"Preview.Dragging.AddItems",headerArgs:[u.length],onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}}))):((u.length||e)&&f.push(new Io(p,{icon:"dragfiles",header:"Chat.DropTitle",subtitle:"Chat.DropAsFilesDesc",onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}})),(t||e)&&f.push(new Io(p,{icon:"dragmedia",header:"Chat.DropTitle",subtitle:"Chat.DropQuickDesc",onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"media")}})),this.chat.container.append(p))}(0,Fe.Z)({element:p,className:"is-visible",forwards:d,duration:200,onTransitionEnd:()=>{d||(f.forEach((e=>{e.destroy()})),f.length=0)}}),d?f.forEach((e=>{e.setPath()})):n=0,document.body.classList.toggle("is-dragging",d),i=d}));let n=0;document.body.addEventListener("dragenter",(e=>{n++})),document.body.addEventListener("dragover",(e=>{s(e,!0),(0,Ce.Z)(e)})),document.body.addEventListener("dragleave",(e=>{n--,0===n&&s(e,!1)}));const a=document.createElement("div");a.classList.add("drops-container");const o=a.cloneNode(!0)}canDrag(){return qr(this,void 0,void 0,(function*(){const e=this.chat;return!(!(null==e?void 0:e.peerId)||St.Z.isOverlayActive||!(yield e.canSend("send_media")))}))}overrideHash(e){return qr(this,void 0,void 0,(function*(){let t;if(e){const i=yield this.managers.appPeersManager.getPeerUsername(e);t=i?"@"+i:""+e}Dn.Z.overrideHash(t)}))}selectTab(e,t){var i;!1===t&&Po([n.ZP.sidebarEl,this.columnEl,a.ZP.sidebarEl]),document.body.classList.toggle(n.ir,0===e);const s=this.tabId;-1!==s&&this.overrideHash(e>0?null===(i=this.chat)||void 0===i?void 0:i.peerId:void 0),this.log("selectTab",e,s);let r=d.Z.settings.animationsEnabled?(0,pe.d1)():Promise.resolve();if(-1!==s&&s!==e&&d.Z.settings.animationsEnabled&&!1!==t){const e=100+(o.Z.isMobile?250:200);r=(0,nt.Z)(e),(0,ue.YW)(r,e)}this.tabId=e,(0,Vn.Z)(),o.Z.isMobile&&2===s&&e<2&&document.body.classList.remove(a.HQ),-1!==s&&e>s&&(e<2||!Dn.Z.findItemByType("im"))&&Dn.Z.pushItem({type:"im",onPop:e=>{this.setPeer({},e)}});const l=window.onImTabChange;return l&&l(e),r}updateStatus(){return this.managers.appUsersManager.updateMyOnlineStatus(this.offline)}createNewChat(){const e=new wo(this,this.managers);return this.chats.length&&e.setBackground(this.lastBackgroundUrl,!0),this.chats.push(e),e}spliceChats(e,t=!0,i,s){if(e>=this.chats.length)return;const n=this.chat;this.chats.length>1&&t&&this.dispatchEvent("peer_changing",this.chat),s||(s=this.chats.splice(e,this.chats.length-e));const o=this.chat;this.dispatchEvent("chat_changing",{from:n,to:o});for(let e=0;e1&&s.slice(0,-1).forEach((e=>{e.container.remove()})),this.chatsSelectTab(o.container,i),t){this.dispatchEvent("peer_changed",o);const e=a.ZP.getTab(uo);null==e||e.close(),a.ZP.replaceSharedMediaTab(o.sharedMediaTab)}s.forEach((e=>{e.beforeDestroy()})),setTimeout((()=>{s.forEach((e=>{e.destroy()}))}),350)}setPeer(e={},t){var i;return qr(this,void 0,void 0,(function*(){this.init&&(this.init(),this.init=null),null!==(i=e.peerId)&&void 0!==i||(e.peerId=m.NM);const{peerId:s,lastMsgId:a,threadId:r}=e,d=this.chat,l=this.chats.indexOf(d);if(s){if(l>0&&d.peerId&&!this.isSamePeer(d,e)){const t=this.chats.splice(1,this.chats.length-1);if(this.chat.peerId===s)return void this.spliceChats(0,!0,!0,t);{const i=this.setPeer(e);return this.spliceChats(0,!1,!1,t),i}}}else{if(l>0)return void this.spliceChats(l,void 0,t);if(o.Z.activeScreen===o._.medium)return void this.selectTab(+!this.tabId,t)}if(s===d.peerId&&o.Z.activeScreen<=o._.medium&&document.body.classList.contains(n.ir))return this.selectTab(1,t),!1;if(s||o.Z.activeScreen!==o._.mobile){const i=yield d.setPeer(e),n=(null==i?void 0:i.cached)?i.promise:Promise.resolve();s&&Promise.all([n,d.setBackgroundPromise]).then((()=>{setTimeout((()=>{setTimeout((()=>{this.chatsSelectTab(this.chat.container)}),0),this.selectTab(1,t)}),0)}))}return s?void 0:(this.selectTab(0,t),!1)}))}setInnerPeer(e){var t;return qr(this,void 0,void 0,(function*(){const{peerId:i}=e;if(i===m.NM||!i)return;e.type||(e.threadId&&!(yield this.managers.appPeersManager.isForum(e.peerId))&&(e.type="discussion"),null!==(t=e.type)&&void 0!==t||(e.type="chat"));const s=this.chats.findIndex((t=>this.isSamePeer(t,e)));if(-1!==s)return this.spliceChats(s+1),this.setPeer(e);const n=this.chat;let a=n;return n.inited&&(a=this.createNewChat()),this.dispatchEvent("chat_changing",{from:n,to:a}),this.setPeer(e)}))}openScheduled(e){this.setInnerPeer({peerId:e,type:"scheduled"})}getTypingElement(e){const t=document.createElement("span");let i="peer-typing";switch(t.classList.add(i),t.dataset.action=e._,e._){case"sendMessageTypingAction":i+="-text";for(let e=0;e<3;++e){const e=document.createElement("span");e.className=i+"-dot",t.append(e)}break;case"sendMessageUploadAudioAction":case"sendMessageUploadDocumentAction":case"sendMessageUploadRoundAction":case"sendMessageUploadVideoAction":case"sendMessageUploadPhotoAction":i+="-upload";break;case"sendMessageRecordAudioAction":case"sendMessageRecordRoundAction":case"sendMessageRecordVideoAction":i+="-record";break;case"sendMessageEmojiInteractionSeen":case"sendMessageChooseStickerAction":i+="-choosing-sticker";for(let e=0;e<2;++e){const e=document.createElement("div");e.className=i+"-eye",t.append(e)}}return t.classList.add(i),t}getPeerTyping(e,t,i){return qr(this,void 0,void 0,(function*(){const s=e.isUser();if(s&&(yield this.managers.appUsersManager.isBot(e)))return;const n=yield this.managers.appProfileManager.getPeerTypings(e,i);if(!(null==n?void 0:n.length))return;const a=n[0],o={private:{sendMessageTypingAction:"Peer.Activity.User.TypingText",sendMessageUploadAudioAction:"Peer.Activity.User.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.User.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.User.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.User.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.User.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.User.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.User.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.User.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.User.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.User.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.User.EnjoyingAnimations"},chat:{sendMessageTypingAction:"Peer.Activity.Chat.TypingText",sendMessageUploadAudioAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.Chat.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.Chat.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.Chat.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.Chat.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.Chat.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.Chat.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.Chat.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.Chat.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.Chat.EnjoyingAnimations"},multi:{sendMessageTypingAction:"Peer.Activity.Chat.Multi.TypingText1",sendMessageUploadAudioAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadDocumentAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadPhotoAction:"Peer.Activity.Chat.Multi.SendingPhoto1",sendMessageUploadVideoAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageUploadRoundAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageRecordVideoAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageRecordAudioAction:"Peer.Activity.Chat.Multi.RecordingAudio1",sendMessageRecordRoundAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageGamePlayAction:"Peer.Activity.Chat.Multi.PlayingGame1",sendMessageChooseStickerAction:"Peer.Activity.Chat.Multi.ChoosingSticker1"}},r=s?o.private:n.length>1?o.multi:o.chat;let d=a.action;if(n.length>1){const e={};n.forEach((t=>{const i=t.action._;void 0===e[i]&&(e[i]=0),++e[i]})),Object.keys(e).length>1&&(d={_:"sendMessageTypingAction"})}const l=r[d._];if(!l)return;let c,h;if(e.isAnyChat()){const e=new B.Z;c=e.update({peerId:a.userId.toPeerId(!1),onlyFirstName:!0}),h=[e.element,n.length-1],yield c}t||(t=document.createElement("span")).classList.add("online","peer-typing-container"),t.classList.toggle("peer-typing-flex","sendMessageChooseStickerAction"===d._||"sendMessageEmojiInteractionSeen"===d._);let u=t.firstElementChild;if(u?u.dataset.action!==d._&&u.replaceWith(this.getTypingElement(d)):(u=this.getTypingElement(d),t.prepend(u)),"sendMessageEmojiInteractionSeen"===d._){h?h.pop():h=[];const e=(0,xr.Z)((0,R.Z)(d.emoticon));h.push(e)}const p=(0,C.ag)(l,h);return p.classList.add("peer-typing-description"),t.childElementCount>1?t.lastElementChild.replaceWith(p):t.append(p),t}))}getChatStatus(e,t){return qr(this,void 0,void 0,(function*(){const i=t?void 0:yield this.getPeerTyping(e.toPeerId(!0));if(i)return{cached:!0,result:Promise.resolve(i)};const s=yield this.managers.acknowledged.appProfileManager.getChatFull(e),n=Promise.resolve(s.result).then((t=>qr(this,void 0,void 0,(function*(){var i,s;const n=t.participants_count||(null===(s=null===(i=t.participants)||void 0===i?void 0:i.participants)||void 0===s?void 0:s.length)||1;let a=yield(0,Ma.Z)(e);if(n<2)return a;const o=yield this.managers.appProfileManager.getOnlines(e);if(o>1){const e=document.createElement("span");e.append(...(0,C.v_)([a,(0,C.ag)("OnlineCount",[(0,ze.Z)(o)])],!1)),a=e}return a}))));return{cached:s.cached,result:n}}))}getUserStatus(e,t){var i;return qr(this,void 0,void 0,(function*(){const s={cached:!0,result:Promise.resolve(void 0)},n=yield this.managers.appUsersManager.getUser(e);if(!n||n.pFlags.self&&!t)return s;const a=(0,Ks.Z)(n);if(!n.pFlags.bot&&!n.pFlags.support){let t=yield this.getPeerTyping(e.toPeerId());if(t||"userStatusOnline"!==(null===(i=n.status)||void 0===i?void 0:i._)||(t=document.createElement("span"),t.classList.add("online"),t.append(a)),t)return s.result=Promise.resolve(t),s}return s.result=Promise.resolve(a),s}))}getPeerStatus(e,t,i){return qr(this,void 0,void 0,(function*(){if(!e)return;let s;return s=e.isAnyChat()?this.getChatStatus(e.toChatId(),i):this.getUserStatus(e.toUserId(),t),s}))}setPeerStatus(e){return qr(this,void 0,void 0,(function*(){const{peerId:t,element:i,needClear:s,useWhitespace:n,middleware:a,ignoreSelf:o,noTyping:r}=e;if(!s){const e=i.querySelector(".peer-typing-container");if(e&&(yield this.getPeerTyping(t,e)))return}const d=yield this.getPeerStatus(t,o,r);if(!a())return;const l=()=>qr(this,void 0,void 0,(function*(){const e=d&&(yield d.result);if(a())return()=>(0,U.Z)(i,e||c)})),c=n?"‎":"";return!d||d.cached||void 0===s?yield l():s?()=>(i.textContent=c,l().then((e=>null==e?void 0:e()))):void 0}))}setChoosingStickerTyping(e){this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:e?"sendMessageCancelAction":"sendMessageChooseStickerAction"},void 0,this.chat.threadId)}isSamePeer(e,t){return e.peerId===t.peerId&&e.threadId===t.threadId&&(typeof e.type!=typeof t.type||e.type===t.type)}}const Yr=new Qr;me.GO&&(me.GO.appImManager=Yr);const Xr=Yr},3709:(e,t,i)=>{"use strict";function s(e){var t;return e&&!e.pFlags.is_outgoing&&!e.pFlags.noforwards&&!(null===(t=e.media)||void 0===t?void 0:t.extended_media)}i.d(t,{Z:()=>s})},7530:(e,t,i)=>{"use strict";function s(e){var t;if(!e)return;let i;if(e.action)i=e.action.photo;else if(e.media){let s=e.media;s.webpage?s=s.webpage:"messageExtendedMedia"===(null===(t=s.extended_media)||void 0===t?void 0:t._)&&(s=s.extended_media.media),i=s.document||s.photo}return i}i.d(t,{Z:()=>s})},2291:(e,t,i)=>{"use strict";function s(e){var t;return e.fromId?{peerId:e.fromId}:{fromName:null===(t=e.fwd_from)||void 0===t?void 0:t.from_name}}i.d(t,{Z:()=>s})},5381:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(677);function n(e){return!(!e.restriction_reason||!(0,s.X)(e.restriction_reason))}},5990:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});const s=["#fc5c51","#0fb297","#d09306","#3d72ed","#895dd5","#cd4073","#00c1a6","#fa790f"],n=["red","green","yellow","blue","violet","pink","cyan","orange"],a=[0,7,4,1,6,3,5];function o(e,t=!0){if(!e)return"";const i=a[Math.abs(+e)%7];return(t?n:s)[i]}},6082:(e,t,i)=>{"use strict";function s(e){if(e.username)return e.username;const t=e.usernames,i=null==t?void 0:t.find((e=>e.pFlags.editable));return null==i?void 0:i.username}i.d(t,{Z:()=>s})},2946:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(5880),n=i(1507);function a(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if((0,s.Z)(e)){const t=e.user_id;if(void 0!==t)return t.toPeerId(!1);const i=e.channel_id||e.chat_id;return void 0!==i?i.toPeerId(!0):n.NM}if(!e)return n.NM;const t="u"===e.charAt(0),i=e.substr(1).split("_");return t?i[0].toPeerId():(i[0]||"").toPeerId(!0)}},7030:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(9897),n=i(1507);function a(e,t=0,i=0,a=!1,o=!1){window.devicePixelRatio>1&&(t*=2,i*=2);let r=e.sizes||e.thumbs,d={_:"photoSizeEmpty",type:n.Pt};if(o&&r&&"photo"!==e._&&(r=r.concat({_:"photoSize",w:e.w,h:e.h,size:e.size,type:n.Pt})),null==r?void 0:r.length){for(let e=0,n=r.length;e=t||a.height>=i)break}a&&"photoSizeEmpty"===d._&&"photoStrippedSize"===r[0]._&&(d=r[0])}return d}},3075:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5953),n=i(5003),a=i(6752);class o{constructor(e){var t;(0,s.Z)(this,e),this.log||(this.log=(null===(t=this.connection)||void 0===t?void 0:t.log)||(0,n.kg)("CALL-CONNECTION-BASE")),this.sources={}}createPeerConnection(e){return this.connection||(this.connection=function(e,t){t||(t=(0,n.kg)("RTCPeerConnection")),t("constructor");const i=new RTCPeerConnection(e);return i.addEventListener("track",(e=>{t("ontrack",e)})),i.addEventListener("signalingstatechange",(()=>{t("onsignalingstatechange",i.signalingState)})),i.addEventListener("connectionstatechange",(()=>{t("onconnectionstatechange",i.connectionState)})),i.addEventListener("negotiationneeded",(()=>{t("onnegotiationneeded",i.signalingState)})),i.addEventListener("icecandidate",(e=>{t("onicecandidate",e)})),i.addEventListener("iceconnectionstatechange",(()=>{t("oniceconnectionstatechange",i.iceConnectionState)})),i.addEventListener("datachannel",(()=>{t("ondatachannel")})),i.log=t,{connection:i}}(e,this.log.bindPrefix("connection")).connection)}createDataChannel(e){return this.dataChannel||(this.dataChannel=function(e,t,i){i||(i=(0,n.kg)("RTCDataChannel"));const s=e.createDataChannel("data",t);return s.addEventListener("message",(e=>{i("onmessage",e)})),s.addEventListener("open",(()=>{i("onopen")})),s.addEventListener("close",(()=>{i("onclose")})),s.log=i,s}(this.connection,e,this.log.bindPrefix("data")))}createDescription(){return this.description||(this.description=new a.ZP(this.connection))}appendStreamToConference(){return this.streamManager.appendToConference(this.description)}closeConnection(){const{connection:e}=this;if(e)try{e.log("close"),e.close()}catch(e){this.log.error(e)}}closeConnectionAndStream(e){this.closeConnection(),e&&this.streamManager.stop()}negotiate(){return this.negotiating||(this.negotiating=this.negotiateInternal().finally((()=>{this.negotiating=void 0})))}sendDataChannelData(e){"open"===this.dataChannel.readyState&&this.dataChannel.send(JSON.stringify(e))}}},2069:(e,t,i)=>{"use strict";i.d(t,{Z:()=>N});var s=i(6761),n=i(4762),a=i(5953),o=i(5701),r=i(671),d=i(5003),l=i(3855),c=i(3075),h=i(3773);function u(e){const t=(0,h.Z)(e,e.media[0]),i={"@type":"InitialSetup",fingerprints:[t.fingerprint],ufrag:t.ufrag,pwd:t.pwd,audio:void 0,video:void 0,screencast:void 0},s=e=>""+e;for(const t of e.media){const n=t.mediaType;if("application"===n||!t.isSending)continue;const a=i["video"===n&&i.video?"screencast":n]={},o=(0,h.Z)(e,t);a.ssrc=s(o.source),o.sourceGroups&&(a.ssrcGroups=o.sourceGroups.map((e=>({semantics:e.semantics,ssrcs:e.sources.map(s)}))));const r=a.rtpExtensions=[];t.attributes.get("extmap").forEach((e=>{r.push({id:+e.key,uri:e.value})}));const d=new Map,l=e=>{let t=d.get(e);return t||d.set(e,t={id:e}),t};t.attributes.get("rtpmap").forEach((e=>{const t=+e.key,i=l(t),s=e.value.split("/"),[n,a,o]=s;i.name=n,i.clockrate=+a,i.channels=o?+o:0})),t.attributes.get("rtcp-fb").forEach((e=>{const t=+e.key;l(t).feedbackTypes=e.lines.map((e=>{const t=e.split(" "),[i,s]=t;return{type:i,subtype:s||""}}))})),t.attributes.get("fmtp").forEach((e=>{const t=+e.key,i=l(t).parameters={},s=e.value.split(";");for(const e of s){const[t,s]=e.split("=");i[t]=s}})),a.payloadTypes=Array.from(d.values())}return i}var p=i(9124);class f extends c.Z{constructor(e){super(e)}negotiateInternal(){return e=this,t=void 0,s=function*(){const{connection:e,call:t}=this;if(!e.localDescription&&!e.remoteDescription&&!t.isOutgoing)return;let i;if(t.offerReceived){t.offerReceived=!1;const s=i=yield e.createAnswer();this.log("[sdp] local",s.type,s.sdp),yield e.setLocalDescription(s),this.log("[InitialSetup] send 2")}else{const s=i=yield e.createOffer();this.log("[sdp] local",s.sdp),yield e.setLocalDescription(s),t.offerSent=!0,this.log("[InitialSetup] send 0")}const s=u((0,p.DV)(i.sdp));t.sendCallSignalingData(s)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var m=i(8500),g=i(2493),v=i(3335),b=i(1677),y=i(49),w=i(6752),S=i(4903);const C="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;var L=i(9818),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class I{constructor(e,t){this.isOutgoing=e,this.p2pKey=t,this.type="Signaling",this.counter=0,this.seqMap=new Map}concatSHA256(e){return t=(0,S.Z)(...e),C.digest("SHA-256",(0,L.Z)(t)).then((e=>new Uint8Array(e)));var t}encryptPrepared(e){return E(this,void 0,void 0,(function*(){const t={counter:0,bytes:new Uint8Array(16+e.length)},i=(this.isOutgoing?0:8)+("Signaling"===this.type?128:0),s=this.p2pKey,n=yield this.concatSHA256([s.subarray(i+88,i+88+32),e]),a=t.bytes;for(let e=0;e<16;++e)a[e]=n[e+8];const o=yield this.prepareAesKeyIv(s,a,i),r=yield this.aesProcessCtr(e,e.length,o,!0);return t.bytes=new Uint8Array([...t.bytes.subarray(0,16),...r]),t}))}encryptRawPacket(e){const t=++this.counter,i=new ArrayBuffer(4);new DataView(i).setUint32(0,t>>>0,!1);const s=new Uint8Array([...new Uint8Array(i),...e]);return this.encryptPrepared(s)}prepareAesKeyIv(e,t,i){return E(this,void 0,void 0,(function*(){const[s,n]=yield Promise.all([this.concatSHA256([t.subarray(0,16),e.subarray(i,i+36)]),this.concatSHA256([e.subarray(40+i,40+i+36),t.subarray(0,16)])]);return{key:new Uint8Array([...s.subarray(0,8),...n.subarray(8,24),...s.subarray(24,32)]),iv:new Uint8Array([...n.subarray(0,4),...s.subarray(8,16),...n.subarray(24,28)])}}))}aesProcessCtr(e,t,i,s=!0){return E(this,void 0,void 0,(function*(){const t=yield C.importKey("raw",i.key,{name:"AES-CTR"},!1,[s?"encrypt":"decrypt"]),n=yield C[s?"encrypt":"decrypt"]({name:"AES-CTR",counter:i.iv,length:8*i.iv.length},t,e);return new Uint8Array(n)}))}constTimeIsDifferent(e,t,i){let s=!0;for(let n=0;n134217728)return;const{isOutgoing:t,type:i}=this,s=(t?8:0)+("Signaling"===i?128:0),n=this.p2pKey,a=e.subarray(0,16),o=e.subarray(16),r=e.length-16,d=yield this.prepareAesKeyIv(n,a,s),l=yield this.aesProcessCtr(o,r,d,!1),c=yield this.concatSHA256([n.subarray(88+s,88+s+32),l]);if(this.constTimeIsDifferent(c.subarray(8),a,16))return;const h=new DataView(l.buffer).getUint32(0);return this.seqMap.has(h)?void 0:(this.seqMap.set(h,h),l.slice(4))}))}}var M=i(630);class P{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new M.Z;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r.add(`a=fingerprint:${t} ${i}`,`a=setup:${s}`)})),i&&s&&r.add(`a=ice-ufrag:${i}`,`a=ice-pwd:${s}`),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} audio${s}`),r.add("a=rtcp-mux",_(a),F(i,s,n,d));break;case"video":r.add(`m=video 61986 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",_(a),F(i,s,n,d))}}return r.add("m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"),r.finalize()}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new M.Z;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r.add(`a=fingerprint:${t} ${i}`,`a=setup:${s}`)})),i&&s&&r.add(`a=ice-ufrag:${i}`,`a=ice-pwd:${s}`),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} audio${s}`),r.add("a=rtcp-mux",_(a),F(i,s,n,d));break;case"video":r.add(`m=video 61986 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",_(a),F(i,s,n,d))}}return r.add("m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"),r.finalize()}}class Z{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(l),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(l),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(h),r+="\na=rtcp-mux",r+=_(l),r+=F(i,n,a,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${l.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(h),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(l),r+=F(i,n,a,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}}class k{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} audio${s}`),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} audio${s}`),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}}function T(){return navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function x(){return navigator.userAgent.toLowerCase().indexOf("safari")>-1&&-1===navigator.userAgent.toLowerCase().indexOf("chrome")}function A(e){let t=[];for(let i=0;i{const{type:i,subtype:s}=e;t.push(`a=rtcp-fb:${n} ${[i,s].join(" ")}`)})),l){const e=[];Object.getOwnPropertyNames(l).forEach((t=>{e.push(`${t}=${l[t]}`)})),t.push(`a=fmtp:${n} ${e.join(";")}`)}}return t.join("\n")}function F(e,t,i,s){let n=[];return i&&i.length>0?i.forEach((t=>{t&&t.ssrcs.length>0&&(n.push(`a=ssrc-group:${t.semantics} ${t.ssrcs.join(" ")}`),t.ssrcs.forEach((t=>{n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${s} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`)})))})):t&&n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${s} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`),n.join("\n")}class D{static generateCandidate(e){if(!e)return null;const{sdpString:t,sdpMLineIndex:i,sdpMid:s,foundation:n,component:a,protocol:o,priority:r,address:d,type:l,relAddress:c,generation:h,tcpType:u,networkId:p,networkCost:f,username:m}=e;if(t)return{candidate:t,sdpMLineIndex:i,sdpMid:s};throw"no sdpString"}static generateOffer(e){return T()?Z.generateOffer(e):x()?k.generateOffer(e):P.generateOffer(e)}static generateAnswer(e){return T()?Z.generateAnswer(e):x()?k.generateAnswer(e):P.generateAnswer(e)}}var R=i(9585),B=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class N extends m.Z{constructor(e){super(),this.log=(0,d.kg)("CALL"),this.protocol||(this.protocol={_:"phoneCallProtocol",pFlags:{udp_p2p:!0,udp_reflector:!0},min_layer:92,max_layer:92,library_versions:["4.0.0"]}),(0,a.Z)(this,e),this.createdAt=Date.now(),this.offerReceived=!1,this.offerSent=!1,this.decryptQueue=[],this.candidates=[],this.addEventListener("state",(e=>{this.log("state",v.Z[e]),e===v.Z.CLOSED&&this.cleanup()}));const t=this.streamManager=new R.Z(b.iK);t.direction="sendrecv",t.types.push("screencast"),this.isOutgoing||(t.locked=!0,t.canCreateConferenceEntry=!1);let i={"@type":"MediaState",type:"input",lowBattery:!1,muted:!0,screencastState:"inactive",videoRotation:0,videoState:"inactive"};const s=this;i=new Proxy(i,{set:function(e,t,n){return e[t]=n,s.setMediaState(i),s.sendMediaState(),!0}}),this.mediaStates={input:i},this.sendMediaState=(0,o.Z)(this._sendMediaState.bind(this),0,!1,!0)}get connectionState(){const{_connectionState:e,connectionInstance:t}=this;if(void 0!==e)return e;if(t){const{iceConnectionState:e}=t.connection;return"closed"===e?v.Z.CLOSED:"connected"===e||n.IS_SAFARI&&"completed"===e?v.Z.CONNECTED:v.Z.CONNECTING}return v.Z.CONNECTING}get sortIndex(){const e=this.connectionState;let t=1e13*(v.Z.CLOSED-e+1);return t+=2147483647e3-(e===v.Z.PENDING&&this.isOutgoing?0:this.createdAt),t}getVideoElement(e){if("input"===e)return this.elements.get("main");{const e=this.getMediaState("output");if(!e)return;const t="active"===e.videoState?"video":"active"===e.screencastState?"screencast":void 0;if(!t)return;const i=this.description.findEntry((e=>e.type===t));if(!i)return;return this.elements.get(""+i.recvEntry.source)}}startScreenSharingInternal(){return B(this,void 0,void 0,(function*(){try{this.wasStartingScreen=!0,this.wasStartingVideo=!1,this.streamManager.types=["audio","screencast"],yield this.requestScreen()}catch(e){this.log.error("startScreenSharing error",e)}}))}toggleScreenSharing(){return B(this,void 0,void 0,(function*(){return this.isSharingVideo&&(yield this.stopVideoSharing()),this.isSharingScreen?this.stopVideoSharing():this.startScreenSharingInternal()}))}startVideoSharingInternal(){return B(this,void 0,void 0,(function*(){try{this.wasStartingScreen=!1,this.wasStartingVideo=!0,this.streamManager.types=["audio","video"],yield this.requestInputSource(!1,!0,!1)}catch(e){this.log.error("startVideoSharing error",e)}}))}stopVideoSharing(){return B(this,void 0,void 0,(function*(){const e=this.getMediaState("input");e.videoState=e.screencastState="inactive";const{streamManager:t,description:i}=this,s=t.inputStream.getVideoTracks()[0];s&&((0,y.Z)(s),t.appendToConference(i))}))}toggleVideoSharing(){return B(this,void 0,void 0,(function*(){return this.isSharingScreen&&(yield this.stopVideoSharing()),this.isSharingVideo?this.stopVideoSharing():this.startVideoSharingInternal()}))}getMediaState(e){return this.mediaStates[e]}setMediaState(e){this.mediaStates[e.type]=e,this.dispatchEvent("mediaState",e)}isSharingVideoType(e){try{return super.isSharingVideo&&!!(this.wasStartingScreen&&"screencast"===e||this.wasStartingVideo&&"video"===e)}catch(e){return!1}}get isSharingVideo(){return this.isSharingVideoType("video")}get isSharingScreen(){return this.isSharingVideoType("screencast")}get isMuted(){const e=this.streamManager.inputStream.getAudioTracks()[0];return!(null==e?void 0:e.enabled)}get isClosing(){const{connectionState:e}=this;return e===v.Z.CLOSING||e===v.Z.CLOSED}get description(){var e;return null===(e=this.connectionInstance)||void 0===e?void 0:e.description}setHangUpTimeout(e,t){this.clearHangUpTimeout(),this.hangUpTimeout=s.Z.setTimeout((()=>{this.hangUpTimeout=void 0,this.hangUp(t)}),e)}clearHangUpTimeout(){void 0!==this.hangUpTimeout&&(clearTimeout(this.hangUpTimeout),this.hangUpTimeout=void 0)}setPhoneCall(e){this.call=e;const{id:t}=e;if(this.id!==t){const e=this.id;this.id=t,this.dispatchEvent("id",t,e)}}acceptCall(){var e;return B(this,void 0,void 0,(function*(){const t=null===(e=(yield Promise.all(this.dispatchResultableEvent("acceptCallOverride")))[0])||void 0===e||e;if(this.isClosing||!t)return;this.overrideConnectionState(v.Z.EXCHANGING_KEYS);const i=this.call;this.requestInputSource(!0,!!i.pFlags.video,!1);const s=i.g_a_hash;this.managers.appCallsManager.generateDh().then((e=>B(this,void 0,void 0,(function*(){return this.dh={g_a_hash:s,b:e.a,g_b:e.g_a,g_b_hash:e.g_a_hash,p:e.p},this.managers.apiManager.invokeApi("phone.acceptCall",{peer:yield this.managers.appCallsManager.getCallInput(this.id),protocol:this.protocol,g_b:this.dh.g_b})})))).then((e=>B(this,void 0,void 0,(function*(){yield this.managers.appCallsManager.savePhonePhoneCall(e)})))).catch((e=>{this.log.error("accept call error",e),this.hangUp("phoneCallDiscardReasonHangup")}))}))}joinCall(){this.log("joinCall"),this.getEmojisFingerprint(),this.overrideConnectionState();const{isOutgoing:e,encryptionKey:t,streamManager:i}=this,s=function(e){const t=[];return e.connections.forEach((e=>{switch(e._){case"phoneConnectionWebrtc":{const{ip:i,ipv6:s,port:n,username:a,password:o}=e,r=[];e.pFlags.turn?(i&&r.push(`turn:${i}:${n}`),s&&r.push(`turn:[${s}]:${n}`)):e.pFlags.stun&&(i&&r.push(`stun:${i}:${n}`),s&&r.push(`stun:[${s}]:${n}`)),r.length>0&&t.push({urls:r,username:a,credential:o});break}}})),{iceServers:t,iceTransportPolicy:e.pFlags.p2p_allowed?"all":"relay"}}(this.call);if(this.log("joinCall configuration",s),!s)return;const n=this.connectionInstance=new f({call:this,streamManager:i,log:this.log.bindPrefix("connection")}),a=n.createPeerConnection(s);a.addEventListener("iceconnectionstatechange",(()=>{const e=this.connectionState;void 0===this.connectedAt&&e===v.Z.CONNECTED&&(this.connectedAt=Date.now()),this.dispatchEvent("state",e)})),a.addEventListener("negotiationneeded",(()=>{n.negotiate()})),a.addEventListener("icecandidate",(e=>{const{candidate:t}=e;a.log("onicecandidate",t),(null==t?void 0:t.candidate)&&this.sendIceCandidate(t)})),a.addEventListener("track",(e=>{const{track:t}=e;a.log("ontrack",t),this.onTrack(e)})),n.createDescription(),this.encryptor=new I(e,t),this.decryptor=new I(!e,t),this.log("currentCall",this),e&&n.appendStreamToConference(),this.createDataChannel(),this.processDecryptQueue()}createDataChannelEntry(){const e=this.description.createEntry("application");e.setDirection("sendrecv"),e.sendEntry=e.recvEntry=e}createDataChannel(){if(this.connectionInstance.dataChannel)return;const e=this.connectionInstance.createDataChannel({id:0,negotiated:!0});e.addEventListener("message",(e=>{this.applyDataChannelData(JSON.parse(e.data))})),e.addEventListener("open",(()=>{this.sendMediaState()}))}applyDataChannelData(e){"MediaState"===e["@type"]?(e.type="output",this.log("got output media state",e),this.setMediaState(e)):this.log.error("unknown data channel data:",e)}_sendMediaState(){const{connectionInstance:e}=this;if(!e)return;const t=Object.assign({},this.getMediaState("input"));delete t.type,this.log("sendMediaState",t),e.sendDataChannelData(t)}sendCallSignalingData(e){return B(this,void 0,void 0,(function*(){const t=JSON.stringify(e),i=(new TextEncoder).encode(t),{bytes:s}=yield this.encryptor.encryptRawPacket(i);this.log("sendCallSignalingData",this.id,t),yield this.managers.apiManager.invokeApi("phone.sendSignalingData",{peer:yield this.managers.appCallsManager.getCallInput(this.id),data:s})}))}sendIceCandidate(e){this.log("sendIceCandidate",e);const{candidate:t,sdpMLineIndex:i}=e;if(0!==i)return;const s=function(e){if(!e||!e.startsWith("candidate:"))return;const t=e;e=e.substr("candidate:".length);const[i,s,n,a,o,r,...d]=e.split(" "),l={sdpString:t,foundation:i,component:s,protocol:n,priority:a,address:{ip:o,port:r}};for(let e=0;e(this.getEmojisFingerprintPromise=void 0,this.emojisFingerprint=e.map((e=>(0,r.zu)(e))))))}unlockStreamManager(){this.connectionInstance.streamManager.locked=!1,this.connectionInstance.appendStreamToConference()}doTheMagic(){return B(this,void 0,void 0,(function*(){this.connectionInstance.appendStreamToConference();const e=this.connectionInstance.connection;let t=yield e.createAnswer();this.log("[sdp] local",t.type,t.sdp),yield e.setLocalDescription(t),e.getTransceivers().filter((e=>"recvonly"===e.direction)).forEach((e=>{const t=this.connectionInstance.description.getEntryByMid(e.mid);t.transceiver=t.recvEntry.transceiver=e,e.direction="sendrecv"}));const i=this.description,s=i.entries.map((e=>e.mid)),n={type:"offer",sdp:i.generateSdp({bundle:s,entries:i.entries.filter((e=>s.includes(e.mid))),isAnswer:!0})};yield e.setRemoteDescription(n),t=yield e.createAnswer(),yield e.setLocalDescription(t);const a=u((0,p.DV)(t.sdp));this.log("[InitialSetup] send 1"),this.sendCallSignalingData(a),this.unlockStreamManager()}))}overrideConnectionState(e){this._connectionState=e,this.dispatchEvent("state",this.connectionState)}get duration(){return void 0!==this.connectedAt?(Date.now()-this.connectedAt)/1e3|0:0}onInputStream(e){super.onInputStream(e);const t=e.getVideoTracks()[0];if(t){const e=this.getMediaState("input");this.wasStartingScreen||this.wasStartingVideo||(this.wasStartingVideo=!0),this.isSharingVideo?e.videoState="active":this.isSharingScreen&&(e.screencastState="active"),t.addEventListener("ended",(()=>{this.stopVideoSharing()}),{once:!0})}e.getAudioTracks().length&&this.onMutedChange()}onMutedChange(){const e=this.isMuted;this.dispatchEvent("muted",e),this.getMediaState("input").muted=e}toggleMuted(){return this.requestAudioSource(!0).then((()=>{this.setMuted(),this.onMutedChange()}))}hangUp(e,t){return B(this,void 0,void 0,(function*(){if(!this.isClosing&&(this.discardReason=e,this.log("hangUp",e),this.overrideConnectionState(v.Z.CLOSED),this.connectionInstance&&this.connectionInstance.closeConnectionAndStream(!0),e&&!t)){let t=!1;for(const e in this.mediaStates){const i=this.mediaStates[e];t="active"===i.videoState||"active"===i.screencastState||t}yield this.managers.appCallsManager.discardCall(this.id,this.duration,e,t)}}))}performCodec(e){const t=e.payloadTypes.map((e=>Object.assign(Object.assign({},e),{"rtcp-fbs":e.feedbackTypes})));return{"rtp-hdrexts":e.rtpExtensions,"payload-types":t}}setDataToDescription(e){this.description.setData({transport:{pwd:e.pwd,ufrag:e.ufrag,fingerprints:e.fingerprints,"rtcp-mux":!0},audio:this.performCodec(e.audio),video:e.video?this.performCodec(e.video):void 0,screencast:e.screencast?this.performCodec(e.screencast):void 0})}filterNotVP8(e){this.isOutgoing||[e.video,e.screencast].filter(Boolean).forEach((e=>{const t=e.payloadTypes,i=t.findIndex((e=>"VP8"===e.name)),s=t[i],n=t.findIndex((e=>{var t;return+(null===(t=e.parameters)||void 0===t?void 0:t.apt)===s.id}));e.payloadTypes=[t[i],t[n]]}))}applyCallSignalingData(e){return B(this,void 0,void 0,(function*(){this.log("applyCallSignalingData",this,e);const{connection:t,description:i}=this.connectionInstance;switch(e["@type"]){case"InitialSetup":{this.log("[sdp] InitialSetup",e),this.filterNotVP8(e),this.setDataToDescription(e);const s=e=>e.map((e=>({_:"groupCallParticipantVideoSourceGroup",semantics:e.semantics,sources:e.ssrcs.map((e=>+e))})));[(0,w.z_)("audio",+e.audio.ssrc),e.video?(0,w.z_)("video",s(e.video.ssrcGroups)):void 0,e.screencast?(0,w.z_)("screencast",s(e.screencast.ssrcGroups)):void 0].filter(Boolean).forEach((e=>{let t=i.getEntryBySource(e.source);if(t)return;const s=i.findFreeSendRecvEntry(e.type,!1);t=new w.Lp(s.mid,e.type),t.setDirection("sendrecv"),s.recvEntry=t,i.setEntrySource(t,e.sourceGroups||e.source)})),this.createDataChannelEntry();const n=this.offerSent;this.offerSent=!1;const a=i.entries.map((e=>e.mid)),o={type:n?"answer":"offer",sdp:i.generateSdp({bundle:a,entries:i.entries.filter((e=>a.includes(e.mid))),isAnswer:!n})};this.log("[sdp] remote",o.sdp),yield t.setRemoteDescription(o),yield this.tryToReleaseCandidates(),n||(yield this.doTheMagic());break}case"Candidates":for(const t of e.candidates){const e=D.generateCandidate(t);e.sdpMLineIndex=0;const i=new RTCIceCandidate(e);this.candidates.push(i)}yield this.tryToReleaseCandidates();break;default:this.log.error("unrecognized signaling data",e)}}))}tryToReleaseCandidates(){return B(this,void 0,void 0,(function*(){const{connectionInstance:e}=this;if(!e)return;const{connection:t}=e;if(t.remoteDescription){const e=this.candidates.map((e=>this.addIceCandidate(t,e)));this.candidates.length=0,yield Promise.all(e)}else this.log("[candidates] postpone")}))}addIceCandidate(e,t){return B(this,void 0,void 0,(function*(){this.log("[candidate] start",t);try{yield e.addIceCandidate(t),this.log("[candidate] add",t)}catch(e){this.log.error("[candidate] error",t,e)}}))}processDecryptQueue(){return B(this,void 0,void 0,(function*(){const{encryptor:e}=this;if(!e)return void this.log.warn("got encrypted signaling data before the encryption key");if(!this.decryptQueue.length)return;const t=this.decryptQueue.slice();this.decryptQueue.length=0;for(const i of t){const t=yield e.decryptRawPacket(i);if(!t)continue;const s=(new TextDecoder).decode(t);try{const e=JSON.parse(s);this.log("[update] updateNewCallSignalingData",e),this.applyCallSignalingData(e)}catch(e){this.log.error("wrong signaling data",s),this.hangUp("phoneCallDiscardReasonDisconnect"),g.Z.dispatchEvent("incompatible",this.interlocutorUserId)}}}))}onUpdatePhoneCallSignalingData(e){this.decryptQueue.push(e),this.processDecryptQueue()}}},8500:(e,t,i)=>{"use strict";i.d(t,{Z:()=>p});var s=i(3241),n=i(319),a=i(9125),o=i(9337),r=i(382),d=i(5424);function l(){const e={main:{},screen:{}};return t=>{return i=this,s=void 0,a=function*(){const{isScreen:i,constraints:s}=t,n=e[i?"screen":"main"];let a=n[s.audio?"audio":"video"];a||(a=(i?r.Z:d.Z)(s,t.muted),s.audio&&!n.audio&&(n.audio=a.finally((()=>n.audio=void 0))),s.video&&!n.video&&(n.video=a.finally((()=>n.video=void 0))));try{return yield a}catch(e){throw e}},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}window.getStreamCached=l;var c=i(312),h=i(49),u=i(9585);class p extends s.Z{constructor(){super(!1);const e=this.player=document.createElement("div");e.classList.add("call-player"),e.style.display="none",document.body.append(e),this.elements=new Map;const t=this.audio=new Audio;t.autoplay=!0,t.volume=1,this.player.append(t),this.elements.set("audio",t),this.fixSafariAudio(),this.getStream=l()}get isSharingAudio(){return!!this.streamManager.hasInputTrackKind("audio")}get isSharingVideo(){return!!this.streamManager.hasInputTrackKind("video")}fixSafariAudio(){this.audio.play().catch(n.Z)}requestAudioSource(e){return this.requestInputSource(!0,!1,e)}requestInputSource(e,t,i){const{streamManager:s}=this;if(s){const i=!e||this.isSharingAudio,s=!t||this.isSharingVideo;if(i&&s)return Promise.resolve()}const n={audio:e&&(0,a.Z)(),video:t&&(0,c.Z)()};return this.getStream({constraints:n,muted:i}).then((e=>{this.onInputStream(e)}))}requestScreen(){return this.getStream({isScreen:!0,constraints:(0,o.Z)(!0)}).then((e=>{this.onInputStream(e)}))}getElement(e){return this.elements.get(""+e)}cleanup(){this.player.textContent="",this.player.remove(),this.elements.clear(),this.streamManager.stop(),super.cleanup()}onTrack(e){this.tryAddTrack({stream:e.streams[0],track:e.track,type:"output"})}saveInputVideoStream(e,t){const i=e.getVideoTracks()[0];this.tryAddTrack({stream:e,track:i,type:"input",source:t||"main"})}tryAddTrack({stream:e,track:t,type:i,source:s}){s||(s=u.Z.getSource(e,i)),this.log("tryAddTrack",e,t,i,s);const a="output"===i,{player:o,elements:r,streamManager:d}=this,l=t.kind,c="video"===l,h=c?s:l;let p=r.get(h);c&&t.addEventListener("ended",(()=>{this.log("[track] onended"),r.delete(h)}),{once:!0}),a&&d.addTrack(e,t,i);const f=c?e:d.outputStream;if(p)p.paused&&p.play().catch(n.Z),p.srcObject=f;else{if(p=document.createElement(l),p.autoplay=!0,p.srcObject=f,p.volume=1,"undefined"!==p.sinkId){const{outputDeviceId:e}=this;e&&p.setSinkId(e)}c?(p.setAttribute("playsinline","true"),p.muted=!0):o.appendChild(p),r.set(h,p)}return s}setMuted(e){this.streamManager.inputStream.getAudioTracks().forEach((t=>{"audio"===(null==t?void 0:t.kind)&&(t.enabled=void 0===e?!t.enabled:!e)}))}onInputStream(e){if(this.isClosing)e.getTracks().forEach((e=>{(0,h.Z)(e)}));else{e.getVideoTracks().length&&this.saveInputVideoStream(e,"main");const{streamManager:t,description:i}=this;t.addStream(e,"input"),i&&t.appendToConference(i)}}}},3335:(e,t,i)=>{"use strict";var s;i.d(t,{Z:()=>n}),function(e){e[e.CONNECTED=0]="CONNECTED",e[e.CONNECTING=1]="CONNECTING",e[e.EXCHANGING_KEYS=2]="EXCHANGING_KEYS",e[e.PENDING=3]="PENDING",e[e.REQUESTING=4]="REQUESTING",e[e.CLOSING=5]="CLOSING",e[e.CLOSED=6]="CLOSED"}(s||(s={}));const n=s},2493:(e,t,i)=>{"use strict";i.d(t,{Z:()=>C});var s=i(5916);let n;var a=i(410),o=i(993),r=i(1655),d=i(6519),l=i(9895),c=i(3241),h=i(7298),u=i(5003),p=i(3855),f=i(1507),m=i(3512),g=i(2069),v=i(3335),b=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const y=45e3;class w extends c.Z{construct(e){this.managers=e,this.log=(0,u.kg)("CC"),o.Z&&(this.audioAsset=null!=n?n:n=new s.Z(["call_busy.mp3","call_connect.mp3","call_end.mp3","call_incoming.mp3","call_outgoing.mp3","voip_failed.mp3"]),this.tempId=0,this.instances=new Map,this.sortedInstances=[],m.Z.addEventListener("call_update",(e=>b(this,void 0,void 0,(function*(){var t;let i=this.instances.get(e.id);switch(i&&i.setPhoneCall(e),e._){case"phoneCallDiscarded":i&&i.hangUp(null===(t=e.reason)||void 0===t?void 0:t._,!0);break;case"phoneCallAccepted":i&&i.confirmCall();break;case"phoneCallRequested":i||(i=this.createCallInstance({isOutgoing:!1,interlocutorUserId:e.admin_id}),i.overrideConnectionState(v.Z.PENDING),i.setPhoneCall(e),i.setHangUpTimeout(y,"phoneCallDiscardReasonMissed"));break;case"phoneCall":{if(!i||i.encryptionKey)break;const t=i.dh.g_a=e.g_a_or_b,s=i.dh,n=yield p.Z.invokeCrypto("sha256",t);if(!(0,l.Z)(s.g_a_hash,n)){this.log.error("Incorrect g_a_hash",s.g_a_hash,n);break}const{key:a,key_fingerprint:o}=yield this.managers.appCallsManager.computeKey(t,s.b,s.p);if(e.key_fingerprint!==o){this.log.error("Incorrect key fingerprint",e.key_fingerprint,o,t,s),i.hangUp("phoneCallDiscardReasonDisconnect");break}i.encryptionKey=a,i.joinCall();break}}})))),m.Z.addEventListener("call_signaling",(({callId:e,data:t})=>{const i=this.instances.get(e);(null==i?void 0:i.id)===e&&i.onUpdatePhoneCallSignalingData(t)})))}get currentCall(){return this.sortedInstances[0]}getCallByUserId(e){for(const[t,i]of this.instances)if(i.interlocutorUserId===e)return i}createCallInstance(e){const t=new g.Z(Object.assign({managers:this.managers},e));return t.addEventListener("state",(e=>{const i=this.currentCall;e===v.Z.CLOSED?(this.instances.delete(t.id),(0,r.Z)(this.sortedInstances,t)):(0,d.Z)(this.sortedInstances,t,"sortIndex"),e===v.Z.EXCHANGING_KEYS&&(t.wasTryingToJoin=!0);const s=void 0!==t.connectedAt;e===v.Z.EXCHANGING_KEYS||e===v.Z.CONNECTING&&s?t.setHangUpTimeout(y,"phoneCallDiscardReasonDisconnect"):t.clearHangUpTimeout(),i!==t&&i||(e===v.Z.CLOSED?t.isOutgoing||t.wasTryingToJoin?t.wasTryingToJoin&&!s?this.audioAsset.playSound("voip_failed.mp3"):this.audioAsset.playSound("phoneCallDiscardReasonBusy"===t.discardReason?"call_busy.mp3":"call_end.mp3"):this.audioAsset.stopSound():e===v.Z.PENDING?this.audioAsset.playSound(t.isOutgoing?"call_outgoing.mp3":"call_incoming.mp3",!0):e===v.Z.EXCHANGING_KEYS?this.audioAsset.playSoundIfDifferent("call_connect.mp3"):e===v.Z.CONNECTING?t.duration&&this.audioAsset.playSound("voip_connecting.mp3",!0):this.audioAsset.stopSound())})),t.addEventListener("id",((e,i)=>{void 0!==i&&this.instances.delete(i);const s=!!this.currentCall;this.instances.set(e,t),void 0===i&&this.dispatchEvent("instance",{instance:t,hasCurrent:s})})),t}startCallInternal(e,t){return b(this,void 0,void 0,(function*(){this.log("p2pStartCallInternal",e,t);const i=yield this.managers.appProfileManager.getProfile(e);if(!i)return;const{video_calls_available:s}=i.pFlags,n=this.createCallInstance({isOutgoing:!0,interlocutorUserId:e});n.requestInputSource(!0,!(!t||!s),!1),n.overrideConnectionState(v.Z.REQUESTING),n.setPhoneCall({_:"phoneCallWaiting",access_hash:"",admin_id:f.NM,date:(0,h.Z)(!0),id:--this.tempId,participant_id:e,protocol:n.protocol,pFlags:{video:t||void 0}}),this.managers.appCallsManager.generateDh().then((i=>b(this,void 0,void 0,(function*(){return n.dh=i,this.managers.appCallsManager.requestCall(e,n.protocol,n.dh.g_a_hash,t&&s)})))).then((e=>{n.overrideConnectionState(v.Z.PENDING),n.setPhoneCall(e),n.setHangUpTimeout(y,"phoneCallDiscardReasonHangup")}))}))}}const S=new w;a.GO&&(a.GO.callsController=S);const C=S},1677:(e,t,i)=>{"use strict";i.d(t,{KM:()=>s,iK:()=>n});const s=50,n=100},9078:(e,t,i)=>{"use strict";i.d(t,{Z:()=>T});var s=i(4762),n=i(1655),a=i(5953),o=i(6724),r=i(5003),d=i(1507),l=i(3512),c=i(8500),h=i(7625),u=i(3075),p=i(8479),f=i(6752),m=i(9124),g=i(4373),v=i(3773),b=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class y extends u.Z{constructor(e){super(e),this.negotiateThrottled=(0,o.Z)(this.negotiate.bind(this),0,!1)}createPeerConnection(){return this.connection||super.createPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",iceCandidatePoolSize:0})}createDataChannel(){if(this.dataChannel)return this.dataChannel;const e=super.createDataChannel();return e.addEventListener("open",(()=>{this.maybeUpdateRemoteVideoConstraints()})),e.addEventListener("close",(()=>{this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)})),e}createDescription(){return this.description?this.description:super.createDescription()}appendStreamToConference(){super.appendStreamToConference()}invokeJoinGroupCall(e,t,i){return b(this,void 0,void 0,(function*(){const{groupCall:s,description:n}=this,a=s.id,o=t.map((t=>{const i=function(e,t){const i=(0,v.Z)(e,t),s=t.mediaType,n={source:i.source,sourceGroups:i.sourceGroups,type:s};i.fingerprint.setup="active";const a={fingerprints:[i.fingerprint],pwd:i.pwd,ssrc:i.source,"ssrc-groups":i.sourceGroups||[],ufrag:i.ufrag};return{params:{_:"dataJSON",data:JSON.stringify(a)},source:i.source,media:t,sourceGroups:i.sourceGroups,entry:n}}(e,t);return this.sources[i.entry.type]=i.entry,i})),r=o.find((e=>"audio"===e.media.mediaType)),d=o.find((e=>"video"===e.media.mediaType));let{source:c,params:u}=r||{};const p=d||r,f={audio:r,video:d};if(n.entries.forEach((e=>{if("sendonly"===e.direction){const t=f[e.type];if(!t)return;n.setEntrySource(e,t.sourceGroups||t.source),n.setEntryPeerId(e,l.Z.myId)}})),u!==p.params){const e=JSON.parse(p.params.data);c?e.ssrc=c:delete e.ssrc,u={_:"dataJSON",data:JSON.stringify(e)}}const m=yield this.managers.appGroupCallsManager.joinGroupCall(a,u,i),g=JSON.parse(m.params.data);return g.audio=g.audio||s.connections.main.description.audio,n.setData(g),function(e,t){["audio","video"].filter((e=>t[e])).map((e=>[t[e],e])).forEach((([t,i])=>{const s=e.find((e=>e.mediaType===i));if(!s)return;const n=(e=>{const t={};return e.attributes.get("extmap").forEach((e=>{const i=e.key.split("/",1)[0];t[i]=e.value})),t})(s);(0,h.Z)(t["rtp-hdrexts"],((e,t,s)=>{n[e.id]!==e.uri&&(s.splice(t,1),console.log("[sdp] filtered extmap:",e,t,i))}))}))}(t,g),g}))}negotiateInternal(){return b(this,void 0,void 0,(function*(){const{connection:e,description:t}=this,i="new"===e.iceConnectionState&&!t.getEntryByMid("0").source,s=this.log.bindPrefix("startNegotiation");s("start");const n=yield e.createOffer({iceRestart:!1});i&&this.dataChannel&&t.createEntry("application").setDirection("sendrecv");const{sdp:a,offer:o}=function(e){const{offer:t,data:i}=e,s=(0,m.DV)(t.sdp);let n=!1;if(e.skipAddingMulticast||(n=(0,m.e6)(s)||n),(0,h.Z)(s.media,((e,t,a)=>{if(e.isSending)return;if("application"===e.mediaType)return;const o=e.mediaLine,r=o.mediaLineParts,d=(r.ids,o.toString()),l=i[e.mediaType]["payload-types"].map((e=>""+e.id));if(d!==(0,g.Px)(e.mediaType,void 0,l)){const o=(0,v.Z)(s,e),d=Object.assign({},i);d.transport=(0,p.Z)(d.transport),d.transport.ufrag=o.ufrag,d.transport.pwd=o.pwd,d.transport.fingerprints=[o.fingerprint],d.transport.candidates=[];const l=new f.Lp(o.mid,r.type);l.setPort(r.port),o.source&&l.setSource(o.sourceGroups||o.source),l.setDirection(e.direction);const c=(new g.DY).addSsrcEntry(l,d).finalize(),h=(0,m.DV)(c).media[0];a[t]=h,n=!0}})),n){const e=s.toString();t.sdp=e}return{offer:t,sdp:s}}({offer:n,data:t});s("[sdp] setLocalDescription",o.sdp),yield e.setLocalDescription(o);const r=a.media.filter((e=>"application"!==e.mediaType&&e.isSending));if(i)try{yield this.invokeJoinGroupCall(a,r,this.options)}catch(e){this.log.error("[tdweb] joinGroupCall error",e)}const d=[],l=a.bundle;(0,h.Z)(l,((e,i,s)=>{const n=t.getEntryByMid(e);n.shouldBeSkipped(!0)&&(s.splice(i,1),d.push(n))}));const c=a.media.map((e=>{const i=e.mid;let s=t.getEntryByMid(i);return s||(s=new f.Lp(i,e.mediaType),s.setDirection("inactive")),s})),u={type:"answer",sdp:t.generateSdp({bundle:l,entries:c,isAnswer:!0})};d.forEach((e=>{t.deleteEntry(e)})),s(`[sdp] setRemoteDescription signaling=${e.signalingState} ice=${e.iceConnectionState} gathering=${e.iceGatheringState} connection=${e.connectionState}`,u.sdp),yield e.setRemoteDescription(u),s("end")}))}negotiate(){let e=this.negotiating;return e||(e=super.negotiate(),this.updateConstraints&&e.then((()=>{this.maybeUpdateRemoteVideoConstraints(),this.updateConstraints=!1})),"presentation"===this.options.type&&e.then((()=>{this.connection.getTransceivers().find((e=>{var t,i;"video"===(null===(i=null===(t=e.sender)||void 0===t?void 0:t.track)||void 0===i?void 0:i.kind)&&e.sender.setParameters(Object.assign(Object.assign({},e.sender.getParameters()),{degradationPreference:"maintain-resolution"}))}))})),e)}maybeUpdateRemoteVideoConstraints(){if("open"!==this.dataChannel.readyState)return;this.log("maybeUpdateRemoteVideoConstraints");const e={colibriClass:"ReceiverVideoConstraints",constraints:{},defaultConstraints:{maxHeight:0},onStageEndpoints:[]};for(const t of this.description.entries){if("recvonly"!==t.direction||"video"!==t.type)continue;const{endpoint:i}=t;e.onStageEndpoints.push(i),e.constraints[i]={minHeight:180,maxHeight:720}}this.sendDataChannelData(e),e.onStageEndpoints.length?this.updateConstraintsInterval||(this.updateConstraintsInterval=window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this),5e3)):this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)}addInputVideoStream(e){this.groupCall.saveInputVideoStream(e,this.type),this.streamManager.addStream(e,"input"),this.appendStreamToConference()}}var w=i(2207),S=i(9337),C=i(382),L=i(5424),E=i(312),I=i(49),M=i(9585),P=i(2946),Z=i(2059),k=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class T extends c.Z{constructor(e){super(),(0,a.Z)(this,e),this.log||(this.log=(0,r.kg)("GROUP-CALL")),this.connections||(this.connections={}),this.isSpeakingMap||(this.isSpeakingMap=new Map),this.pinnedSources=[],this.participantsSsrcs=new Map,this.hadAutoPinnedSources=new Set,this.dispatchPinnedThrottled=(0,o.Z)((()=>{this.dispatchEvent("pinned",this.pinnedSource)}),0,!1),this.addEventListener("state",(e=>{e===w.Z.CLOSED&&this.cleanup()}))}get connectionState(){return this.connections.main.connection.iceConnectionState}get state(){const{connectionState:e}=this;if("closed"===e)return w.Z.CLOSED;if("connected"===e||s.IS_SAFARI&&"completed"===e){const{participant:e}=this;return e.pFlags.can_self_unmute?e.pFlags.muted?w.Z.MUTED:w.Z.UNMUTED:w.Z.MUTED_BY_ADMIN}return w.Z.CONNECTING}get participants(){return this.managers.appGroupCallsManager.getCachedParticipants(this.id)}get isSharingScreen(){return!!this.connections.presentation}get pinnedSource(){return this.pinnedSources[this.pinnedSources.length-1]}get isMuted(){return this.state!==w.Z.UNMUTED}get isClosing(){const{state:e}=this;return e===w.Z.CLOSED}get streamManager(){return this.connections.main.streamManager}get description(){return this.connections.main.description}pinSource(e){(0,n.Z)(this.pinnedSources,e),this.pinnedSources.push(e),this.dispatchPinnedThrottled()}unpinSource(e){this.hadAutoPinnedSources.delete(e),(0,n.Z)(this.pinnedSources,e),this.dispatchPinnedThrottled()}unpinAll(){this.pinnedSources.length=0,this.dispatchPinnedThrottled()}getParticipantByPeerId(e){return k(this,void 0,void 0,(function*(){return d.NM===e?this.participant:(yield this.participants).get(e)}))}toggleMuted(){return this.requestAudioSource(!0).then((()=>this.changeUserMuted(d.NM)))}changeUserMuted(e,t){return k(this,void 0,void 0,(function*(){const i=yield this.getParticipantByPeerId(e);return d.NM===e&&i.pFlags.can_self_unmute&&(t=void 0===t?!i.pFlags.muted:t),this.editParticipant(i,{muted:t})}))}getElement(e){return super.getElement(e)}getVideoElementFromParticipantByType(e,t){let i;i=e.pFlags.self?"video"===t?"main":"presentation":e[t].source_groups[0].sources[0];const s=this.getElement(i);if(!s)return;const n=s.cloneNode();return n.srcObject=s.srcObject,{video:n,source:i}}createConnectionInstance(e){return this.connections[e.type]=new y(Object.assign({groupCall:this,log:this.log.bindPrefix(e.type),managers:this.managers},e))}changeRaiseHand(e){return this.editParticipant(this.participant,{raiseHand:e})}startScreenSharingInternal(){return k(this,void 0,void 0,(function*(){try{const e="presentation",t=yield(0,C.Z)((0,S.Z)()),i=new M.Z,s=this.createConnectionInstance({streamManager:i,type:e,options:{type:e}});s.createPeerConnection().addEventListener("negotiationneeded",(()=>{s.negotiate()})),t.getVideoTracks()[0].addEventListener("ended",(()=>{this.connections.presentation&&this.stopScreenSharing()}),{once:!0}),s.createDescription(),s.addInputVideoStream(t)}catch(e){this.log.error("start screen sharing error",e)}}))}startScreenSharing(){var e;return null!==(e=this.startScreenSharingPromise)&&void 0!==e?e:this.startScreenSharingPromise=this.startScreenSharingInternal().finally((()=>{this.startScreenSharingPromise=void 0}))}stopScreenSharing(){const e=this.connections.presentation;return e?(delete this.connections.presentation,this.unpinSource("presentation"),e.closeConnectionAndStream(!0),delete this.participant.presentation,this.managers.appGroupCallsManager.saveApiParticipant(this.id,this.participant),this.managers.appGroupCallsManager.leaveGroupCallPresentation(this.id)):Promise.resolve()}toggleScreenSharing(){return this.isSharingScreen?this.stopScreenSharing():this.startScreenSharing()}startVideoSharingInternal(){return k(this,void 0,void 0,(function*(){const e={video:(0,E.Z)()};try{const t=yield(0,L.Z)(e,!1);this.connections.main.addInputVideoStream(t),yield this.editParticipant(this.participant,{videoPaused:!1,videoStopped:!1})}catch(t){this.log.error("startVideoSharing error",t,e)}}))}startVideoSharing(){var e;return null!==(e=this.startVideoSharingPromise)&&void 0!==e?e:this.startVideoSharingPromise=this.startVideoSharingInternal().finally((()=>{this.startVideoSharingPromise=void 0}))}stopVideoSharing(){return k(this,void 0,void 0,(function*(){const e=this.connections.main,t=e.streamManager.inputStream.getVideoTracks()[0];t&&((0,I.Z)(t),e.streamManager.appendToConference(e.description),yield this.editParticipant(this.participant,{videoStopped:!0}))}))}toggleVideoSharing(){return this.isSharingVideo?this.stopVideoSharing():this.startVideoSharing()}hangUp(e=!1,t=!1,i=!1){return k(this,void 0,void 0,(function*(){for(const e in this.connections)this.connections[e].closeConnectionAndStream(!t);if(this.dispatchEvent("state",this.state),!i&&!t){const t=e||(this.joined?this.connections.main.sources.audio.source:void 0);this.managers.appGroupCallsManager.hangUp(this.id,t)}}))}tryAddTrack(e){const{description:t}=this,i=super.tryAddTrack(e);if("output"===e.type){const e=t.getEntryBySource(+i);this.getParticipantByPeerId(e.peerId).then((e=>{e&&l.Z.dispatchEvent("group_call_participant",{groupCallId:this.id,participant:e})}))}return i}editParticipant(e,t){return k(this,void 0,void 0,(function*(){if(Object.keys(t).length){if(e){const i=e.pFlags.self;if(i&&void 0!==t.muted&&!this.isSharingAudio&&(delete t.muted,!Object.keys(t).length))return;const s=t.muted;void 0!==s&&e.pFlags.self&&(s?e.pFlags.muted=!0:e.pFlags.can_self_unmute&&delete e.pFlags.muted),void 0!==t.raiseHand&&(t.raiseHand?e.raise_hand_rating="1":delete e.raise_hand_rating),i&&(void 0!==t.videoStopped&&(t.videoStopped?delete e.video:e.video=(0,Z.KR)(this.connections.main.sources.video)),!e.pFlags.muted&&e.pFlags.can_self_unmute&&this.setMuted(!1),this.dispatchEvent("state",this.state))}return this.managers.appGroupCallsManager.editParticipant(this.id,e,t)}}))}onParticipantUpdate(e,t){const i=this.connections.main,{connection:s,description:n}=i,a=(0,P.Z)(e.peer),o=!!e.pFlags.left,r=this.participantsSsrcs.get(a)||[];if(e.presentation&&!o){const{source:t}=(0,Z._f)(e,"video",e.presentation.source_groups,e.presentation.endpoint);this.hadAutoPinnedSources.has(t)||(this.hadAutoPinnedSources.add(t),this.pinSource(e.pFlags.self?"presentation":t))}if(e.pFlags.self){this.participant=e,i.sources.audio.source!==e.source&&this.hangUp();let s=!1;return e.pFlags.can_self_unmute?e.pFlags.muted&&(s=!0):(this.stopScreenSharing(),this.stopVideoSharing(),s=!0),s&&this.setMuted(!0),void(t!==a&&this.dispatchEvent("state",this.state))}const d=o?[]:(0,Z.s$)(e);o?this.participantsSsrcs.delete(a):this.participantsSsrcs.set(a,d);const l=new Set;r.forEach((e=>{const t=e.source;if(!d.find((e=>e.source===t))){this.unpinSource(t);const e=n.getEntryBySource(t);e&&"inactive"!==e.direction&&(e.setDirection("inactive"),l.add(e.type))}})),d.forEach((e=>{let t=n.getEntryBySource(e.source);t?"inactive"===t.direction&&(t.setDirection(t.originalDirection),l.add(t.type)):(t=n.createEntry(e.type),n.setEntrySource(t,e.sourceGroups||e.source),n.setEntryPeerId(t,a),"video"===e.type&&t.setEndpoint(e.endpoint),t.createTransceiver(s,{direction:"recvonly"}),l.add(t.type))})),l.size&&(l.has("video")&&(i.updateConstraints=!0),i.negotiateThrottled())}}},2207:(e,t,i)=>{"use strict";var s;i.d(t,{Z:()=>n}),function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_BY_ADMIN=2]="MUTED_BY_ADMIN",e[e.CONNECTING=3]="CONNECTING",e[e.CLOSED=4]="CLOSED"}(s||(s={}));const n=s},2059:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>L,KR:()=>w,_f:()=>y,s$:()=>b});var s=i(5916);let n;var a=i(410),o=i(3241),r=i(5003),d=i(3512),l=i(9078),c=i(2207),h=i(1677),u=i(9585),p=i(9125),f=i(5424),m=i(312),g=i(6752),v=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function b(e){var t,i;return[y(0,"audio",e.source),(null===(t=e.video)||void 0===t?void 0:t.audio_source)&&y(0,"audio",e.video.audio_source),e.video&&y(0,"video",e.video.source_groups,e.video.endpoint),(null===(i=e.presentation)||void 0===i?void 0:i.audio_source)&&y(0,"audio",e.presentation.audio_source),e.presentation&&y(0,"video",e.presentation.source_groups,e.presentation.endpoint)].filter(Boolean)}function y(e,t,i,s){return(0,g.z_)(t,i,s)}function w(e,t){return e&&{_:"groupCallParticipantVideo",pFlags:{},endpoint:"",source_groups:e.sourceGroups,audio_source:t}}class S extends o.Z{construct(e){this.managers=e,this.audioAsset=null!=n?n:n=new s.Z(["group_call_connect.mp3","group_call_end.mp3","group_call_start.mp3","voip_onallowtalk.mp3"]),this.log=(0,r.kg)("GCC"),d.Z.addEventListener("group_call_update",(e=>{const{currentGroupCall:t}=this;(null==t?void 0:t.id)===e.id&&(t.groupCall=e,"groupCallDiscarded"===e._&&t.hangUp(!1,!1,!0))})),d.Z.addEventListener("group_call_participant",(({groupCallId:e,participant:t})=>{const{currentGroupCall:i}=this;(null==i?void 0:i.id)===e&&i.onParticipantUpdate(t)}))}get groupCall(){return this.currentGroupCall}setCurrentGroupCall(e){this.currentGroupCall=e,e&&this.dispatchEvent("instance",e)}startConnectingSound(){this.stopConnectingSound(),this.audioAsset.playSoundWithTimeout("group_call_connect.mp3",!0,2500)}stopConnectingSound(){this.audioAsset.stopSound(),this.audioAsset.cancelDelayedPlay()}joinGroupCall(e,t,i=!0,s,n){return v(this,void 0,void 0,(function*(){let a;return this.audioAsset.createAudio(),this.log(`joinGroupCall chatId=${e} id=${t} muted=${i} rejoin=${s}`),a=s?this.currentGroupCall.connections.main.streamManager:yield function(e,t){return i=this,s=void 0,a=function*(){const i={audio:(0,p.Z)(),video:t&&(0,m.Z)()},s=new u.Z(h.iK);try{const t=yield(0,f.Z)(i,e);s.addStream(t,"input")}catch(e){console.error("joinGroupCall getStream error",e,i),s.inputStream=new MediaStream}return s},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}(i,n),this.joinGroupCallInternal(e,t,a,i,s,n).then((()=>{const{currentGroupCall:e}=this;e.participants.then((t=>{this.currentGroupCall===e&&e.state!==c.Z.CLOSED&&t.forEach((t=>{t.pFlags.self||e.onParticipantUpdate(t)}))}))}))}))}joinGroupCallInternal(e,t,i,s,n=!1,a){return v(this,void 0,void 0,(function*(){const o=this.log.bindPrefix("joinGroupCallInternal");o("start",t);const r="main";let{currentGroupCall:h}=this;if(!h||!n){h=new l.Z({chatId:e,id:t,managers:this.managers}),h.fixSafariAudio(),h.addEventListener("state",(e=>{this.currentGroupCall===h&&e===c.Z.CLOSED&&(this.setCurrentGroupCall(null),this.stopConnectingSound(),this.audioAsset.playSound("group_call_end.mp3"),d.Z.dispatchEvent("chat_update",h.chatId))})),h.groupCall=yield this.managers.appGroupCallsManager.getGroupCallFull(t);const u=h.createConnectionInstance({streamManager:i,type:r,options:{type:r,isMuted:s,joinVideo:a,rejoin:n}}),p=u.createPeerConnection();return p.addEventListener("negotiationneeded",(()=>{u.negotiate()})),p.addEventListener("track",(e=>{o("ontrack",e),h.onTrack(e)})),p.addEventListener("iceconnectionstatechange",(()=>{h.dispatchEvent("state",h.state);const{iceConnectionState:e}=p;switch("disconnected"===e||"checking"===e||"new"===e?this.startConnectingSound():this.stopConnectingSound(),e){case"checking":case"completed":case"disconnected":case"new":break;case"closed":case"failed":h.hangUp();break;case"connected":h.joined||(h.joined=!0,this.audioAsset.playSound("group_call_start.mp3"),this.managers.appGroupCallsManager.getGroupCallParticipants(t))}})),u.createDescription(),u.createDataChannel(),u.appendStreamToConference(),this.setCurrentGroupCall(h),o("set currentGroupCall",t,h),this.startConnectingSound(),u.negotiate()}h.handleUpdateGroupCallParticipants=!1,h.updatingSdp=!1,o("update currentGroupCall",t,h)}))}}const C=new S;a.GO&&(a.GO.groupCallController=C);const L=C},9125:(e,t,i)=>{"use strict";function s(){const e={channelCount:2};return["noiseSuppression","echoCancellation","autoGainControl"].forEach((t=>{(function(e){var t;return(!!(null===(t=null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||void 0===t?void 0:t.getSupportedConstraints()))[e]})(t)&&(e[t]=!0)})),e}i.d(t,{Z:()=>s})},9337:(e,t,i)=>{"use strict";function s(e){const t={video:{width:{max:1920},height:{max:1080},frameRate:{max:30}}};return e||(t.audio=!0),t}i.d(t,{Z:()=>s})},382:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});function s(e){return t=this,i=void 0,n=function*(){const t=yield navigator.mediaDevices.getDisplayMedia(e);return t.getVideoTracks()[0].contentHint="text",t},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}},5424:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});function s(e,t){return i=this,s=void 0,a=function*(){const i=yield navigator.mediaDevices.getUserMedia(e);return i.getTracks().forEach((e=>{e.enabled=!t})),i},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}window.getStream=s},312:(e,t,i)=>{"use strict";function s(){return{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}}i.d(t,{Z:()=>s})},3773:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(8957);function n(e,t){const i=t.lookupAttributeKeys({"ice-ufrag":!0,"ice-pwd":!0,fingerprint:!0,setup:!0,ssrc:!0,mid:!0,"ssrc-group":!1});if(!i.fingerprint){const t=e.session.lines.find((e=>{var t;return"fingerprint"===(null===(t=e.parsed)||void 0===t?void 0:t.key)}));i.fingerprint=t.parsed.value}const n=function(e){const t=e.map((e=>{const[t,...i]=e.split(" ");return{_:"groupCallParticipantVideoSourceGroup",semantics:t,sources:i.map((e=>(0,s.Fk)(+e)))}}));return t.length?t:void 0}(i["ssrc-group"]),[a,o]=i.fingerprint.split(" ",2),r=i.ssrc&&(0,s.Fk)(+i.ssrc.split(" ",1)[0]);return{raw:i,ufrag:i["ice-ufrag"],pwd:i["ice-pwd"],fingerprint:{fingerprint:o,setup:i.setup,hash:a},source:r,sourceGroups:n,mid:i.mid}}},49:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(6669);function n(e){e.stop(),(0,s.Z)(e,"ended")}},6752:(e,t,i)=>{"use strict";i.d(t,{Lp:()=>o,ZP:()=>d,z_:()=>r});var s=i(1655),n=i(5953),a=i(4373);class o{constructor(e,t){this.mid=e,this.type=t,this.port=a._D}setDirection(e){return this.originalDirection||(this.originalDirection=e),this.direction=e}setPort(e){return this.port=e}setEndpoint(e){return this.endpoint=e}setPeerId(e){return this.peerId=e}createTransceiver(e,t){return(null==t?void 0:t.direction)&&this.setDirection(t.direction),this.transceiver=e.addTransceiver((0,a.pl)(this.type),t)}setSource(e){let t;if(Array.isArray(e)){if(!e[0])return;t=e,e=t[0].sources[0]}return this.sourceGroups=t,this.source=e}shouldBeSkipped(e){return e&&"inactive"===this.direction}}function r(e,t,i){let s;if(Array.isArray(t)){if(!t[0])return;s=t,t=s[0].sources[0]}return{endpoint:i,type:e,source:t,sourceGroups:s}}class d{constructor(e){this.connection=e,this.sessionId=""+Date.now(),this.maxSeenId=-1,this.entries=[],this.entriesByMid=new Map,this.entriesBySource=new Map,this.entriesByPeerId=new Map}setData(e){return(0,n.Z)(this,e)}createEntry(e){const t=""+ ++this.maxSeenId,i=new o(t,e);return this.entries.push(i),this.entriesByMid.set(t,i),i}deleteEntry(e){(0,s.Z)(this.entries,e),this.entriesByMid.delete(e.mid),this.entriesBySource.delete(e.source);const t=this.entriesByPeerId.get(e.peerId);t&&(t.delete(e),t.size||this.entriesByPeerId.delete(e.peerId))}setEntrySource(e,t){e.setSource(t),this.entriesBySource.set(e.source,e)}setEntryPeerId(e,t){e.setPeerId(t);let i=this.entriesByPeerId.get(t);i||this.entriesByPeerId.set(t,i=new Set),i.add(e)}findEntry(e){return this.entries.find(e)}findFreeSendRecvEntry(e,t){let i=this.entries.find((i=>"sendrecv"===i.direction&&i.type===e&&!(t?i.sendEntry:i.recvEntry)));return i||(i=this.createEntry(e),i.setDirection("sendrecv")),i}getEntryByMid(e){return this.entriesByMid.get(e)}getEntryBySource(e){return this.entriesBySource.get(e)}getEntriesByPeerId(e){return this.entriesByPeerId.get(e)}generateSdp(e){return a.DY.fromConference(Object.assign({conference:this},e))}}},9124:(e,t,i)=>{"use strict";i.d(t,{e6:()=>de,DV:()=>oe});var s,n,a=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},o=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class r{constructor(e,t){s.set(this,void 0),n.set(this,void 0),a(this,s,e,"f"),a(this,n,t,"f")}get session(){return o(this,s,"f")}get media(){return o(this,n,"f")}get bundle(){return this.session.lines.find((e=>{var t;return"group"===(null===(t=e.parsed)||void 0===t?void 0:t.key)})).value.split(" ").slice(1)}toString(){return this.session.lines.concat(...this.media.map((e=>e.lines))).map((e=>e.toString())).join("\r\n")+"\r\n"}}function d(e,t,i){const s=e.split(t),n=[];for(;i>0&&s.length;)n.push(s.shift()),--i;return s.length&&n.push(s.join(t)),n}s=new WeakMap,n=new WeakMap;var l,c,h,u=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},p=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class f{constructor(e,t){l.set(this,void 0),c.set(this,void 0),h.set(this,void 0),u(this,l,new Set,"f"),u(this,c,e,"f"),u(this,h,t,"f")}generate(){const e=p(this,c,"f"),t=p(this,h,"f"),i=p(this,l,"f"),s=t-e+1;let n=Math.floor(e+s*Math.random()),a=0;for(;i.has(n);)if(n=s)return null;return i.add(n),n}add(e){p(this,l,"f").add(e)}}l=new WeakMap,c=new WeakMap,h=new WeakMap;var m,g,v=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},b=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class y{constructor(e,t){m.set(this,void 0),g.set(this,void 0),v(this,m,e,"f"),v(this,g,t,"f")}get key(){return b(this,m,"f")}get value(){return b(this,g,"f")}}m=new WeakMap,g=new WeakMap;var w,S,C,L,E=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},I=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class M{constructor(e,t,i,s){w.set(this,void 0),S.set(this,void 0),C.set(this,void 0),L.set(this,void 0),E(this,w,e,"f"),E(this,S,t,"f"),E(this,C,i,"f"),E(this,L,s,"f")}get type(){return I(this,w,"f")}get port(){return I(this,S,"f")}get protocol(){return I(this,C,"f")}get ids(){return I(this,L,"f")}toString(){return this.type+" "+this.port+" "+this.protocol+" "+this.ids.join(" ")}}w=new WeakMap,S=new WeakMap,C=new WeakMap,L=new WeakMap;var P,Z,k,T,x=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},A=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class _{constructor(e,t){if(P.set(this,void 0),Z.set(this,void 0),k.set(this,void 0),T.set(this,void 0),x(this,P,e,"f"),"string"==typeof t){if(x(this,Z,t,"f"),"m"===e){const e=t.split(" ");x(this,k,new M(e[0],e[1],e[2],e.slice(3)),"f")}else if("a"===e){const e=d(t,":",1);t=e[0],x(this,T,1===e.length?new y(t,null):new y(t,e[1]),"f")}}else t instanceof M?(x(this,k,t,"f"),x(this,Z,t.toString(),"f")):t instanceof y&&(x(this,T,t,"f"),x(this,Z,t.value?`${t.key}:${t.value}`:t.key,"f"))}get key(){return A(this,P,"f")}get value(){return A(this,Z,"f")}get parsed(){return A(this,T,"f")}get mediaLineParts(){return A(this,k,"f")}toString(){return`${this.key}=${this.value}`}}P=new WeakMap,Z=new WeakMap,k=new WeakMap,T=new WeakMap;var F,D,R,B,N,O,U=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},H=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class z{constructor(e,t,i=":",s=!1){F.set(this,void 0),D.set(this,void 0),R.set(this,void 0),B.set(this,void 0),N.set(this,void 0),O.set(this,void 0),U(this,F,e,"f"),U(this,D,t,"f"),U(this,R,i,"f"),U(this,N,s,"f"),U(this,B,s?new Map:null,"f"),U(this,O,s?[]:null,"f")}get lines(){return H(this,D,"f")}get value(){return H(this,N,"f")||!this.lines.length?null:this.lines[0]}get exists(){return!H(this,N,"f")}get key(){return H(this,F,"f")}get keys(){return z.fill(this),H(this,O,"f")}forEach(e){z.fill(this),H(this,B,"f").forEach(e)}get(e){return z.fill(this),H(this,B,"f").get(e)||new z(e,[],":",!0)}static fill(e){if(null!==H(e,B,"f"))return;const t=new Map;e.lines.forEach((i=>{const[s,n]=d(i,H(e,R,"f"),1),a=t.get(s)||[];t.set(s,[...a,n||""])}));const i=U(e,B,z.makeAttributes(t),"f");U(e,O,Array.from(i.keys()),"f")}static makeAttributes(e){const t=new Map;return e.forEach(((e,i)=>{t.set(i,new z(i,e))})),t}}F=new WeakMap,D=new WeakMap,R=new WeakMap,B=new WeakMap,N=new WeakMap,O=new WeakMap;var j,G,V=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},K=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class W{constructor(e){j.set(this,void 0),G.set(this,void 0),V(this,j,e,"f"),V(this,G,new Map,"f"),W.fillAttributes(this)}get(e){return K(this,G,"f").get(e)||new z(e,[]," ",!0)}static fillAttributes(e){const t=new Map;K(e,j,"f").forEach((e=>{if("a"===e.key){const{key:i,value:s}=e.parsed;let n=t.get(i);n||(n=[],t.set(i,n)),n.push(s||"")}})),t.forEach(((t,i)=>{K(e,G,"f").set(i,new z(i,t," ",!1))}))}}j=new WeakMap,G=new WeakMap;var $,q,Q,Y,X=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},J=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class ee{constructor(e){$.set(this,void 0),q.set(this,void 0),Q.set(this,void 0),Y.set(this,void 0),X(this,$,e,"f"),X(this,q,e[0],"f"),X(this,Q,X(this,Y,null,"f"),"f")}get lines(){return J(this,$,"f")}get mediaLine(){return J(this,q,"f")}get mediaLineParts(){return J(this,q,"f").mediaLineParts}get mediaType(){return this.mediaLineParts.type}get direction(){if(!J(this,Y,"f")){const e=this.attributes;let t;t=e.get("sendonly").exists?"sendonly":e.get("recvonly").exists?"recvonly":e.get("inactive").exists?"inactive":"sendrecv",X(this,Y,t,"f")}return J(this,Y,"f")}get isSending(){return"sendrecv"===this.direction||"sendonly"===this.direction}get isReceiving(){return"sendrecv"===this.direction||"recvonly"===this.direction}get attributes(){return J(this,Q,"f")||X(this,Q,new W(this.lines),"f"),J(this,Q,"f")}get mid(){return this.attributes.get("mid").value}lookupAttributeKeys(e){const t={};for(const i in e){const s=this.attributes.get(i),n=!e[i];t[i]=s?n?s.lines:s.value:n?[]:void 0}return t}}$=new WeakMap,q=new WeakMap,Q=new WeakMap,Y=new WeakMap;var te,ie,se=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},ne=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class ae{constructor(e){te.set(this,void 0),ie.set(this,void 0),se(this,te,e,"f"),se(this,ie,e.filter((e=>"o"===e.key)).map((e=>e.value.split(" ")[1]))[0],"f")}get lines(){return ne(this,te,"f")}get sessionId(){return ne(this,ie,"f")}}function oe(e){function t(){i?n.push(new ee(s)):i=new ae(s)}let i=null,s=[];const n=[];return e.split(/\r?\n/).forEach((e=>{if(!function(e){return/^[\s\xa0]*$/.test(e)}(e)){const i=re(e);"m"===i.key&&(t(),s=[]),s.push(i)}})),t(),new r(i,n)}function re(e){const t=d(e,"=",1);return new _(t[0],t[1])}function de(e){let t;return e.media.forEach(((i,s)=>{if("video"===i.mediaType&&i.isSending&&!i.attributes.get("ssrc-group").get("SIM").exists){t||(t=new f(2,4294967295));const n=i.attributes.get("ssrc-group").get("FID").value.split(" "),a=i.lines;n.forEach((e=>t.add(+e)));const o=[n[0],t.generate(),t.generate()],r=[n[1],t.generate(),t.generate()];a.push(re("a=ssrc-group:SIM "+o.join(" ")));const d=i.attributes.get("ssrc").get(n[0]).lines;o.forEach(((e,t)=>{const i=r[t];t>0&&(a.push(re("a=ssrc-group:FID "+e+" "+i)),d.forEach((t=>{a.push(re("a=ssrc:"+e+" "+t))})),d.forEach((e=>{a.push(re("a=ssrc:"+i+" "+e))})))})),e.media[s]=new ee(a)}})),!!t}te=new WeakMap,ie=new WeakMap},4373:(e,t,i)=>{"use strict";i.d(t,{DY:()=>c,Px:()=>l,_D:()=>o,pl:()=>r});var s=i(4762),n=i(630),a=i(8957);const o="9";function r(e){return"screencast"===e?"video":e}function d(e){return"application"===e?"DTLS/SCTP":"UDP/TLS/RTP/SAVPF"}function l(e,t=o,i){const s=d(e);return`m=${r(e)} ${t} ${s} ${i.join(" ")}`}class c extends n.Z{addCandidate(e){return this.add(function(e){const t=[];return t.push("a=candidate:"),t.push(`${e.foundation} ${e.component} ${e.protocol.toUpperCase()} ${e.priority} ${e.ip} ${e.port} typ ${e.type}`),void 0!==e["rel-addr"]&&t.push(` raddr ${e["rel-addr"]} rport ${e["rel-port"]}`),t.push(` generation ${e.generation}`),t.join("")}(e))}addHeader(e,t){const i=t.join(" ");return this.add("v=0",`o=- ${e} 2 IN IP4 0.0.0.0`,"s=-","t=0 0","a=extmap-allow-mixed",`a=group:BUNDLE ${i}`,"a=ice-options:trickle","a=msid-semantic:WMS *")}addTransport(e,t){this.add(`a=ice-ufrag:${e.ufrag}`,`a=ice-pwd:${e.pwd}`,"a=ice-options:trickle");for(const t of e.fingerprints)this.add(`a=fingerprint:${t.hash} ${t.fingerprint}`,`a=setup:${t.setup}`);if(!t&&e.candidates)for(const t of e.candidates)this.addCandidate(t);return this}addSsrc(e){let t="stream",{type:i,sourceGroups:s}=e;const n=(0,a.h)(e.source);t+=n,i+=n;const o=e=>{this.add(`a=ssrc:${e} cname:${t}`,`a=ssrc:${e} msid:${t} ${i}`,`a=ssrc:${e} mslabel:${t}`,`a=ssrc:${e} label:${i}`)};return(()=>{this.add(`a=msid:${t} ${i}`)})(),(null==s?void 0:s.length)?s.forEach((e=>{if(e.sources.length){const t=e.sources.map(a.h);this.add(`a=ssrc-group:${e.semantics} ${t.join(" ")}`),t.forEach(o)}})):o(n),this}addSsrcEntry(e,t,i){const s=(...e)=>this.add(...e),{type:n,mid:a,direction:o,port:c}=e,h=t.transport,u="application"===n,p=u?void 0:t[n],f="inactive"===o;if(e.shouldBeSkipped(i))return s(`m=${r(n)} 0 ${d(n)} 0`,"c=IN IP4 0.0.0.0","a=inactive",`a=mid:${a}`);const m=u?[{id:5e3}]:p["payload-types"],g=m.map((e=>e.id));s(l(n,c,g),"c=IN IP4 0.0.0.0",`a=rtcp:${c} IN IP4 0.0.0.0`),h["rtcp-mux"]&&s("a=rtcp-mux"),s(`a=mid:${a}`);let v=o;if("sendrecv"===o||!i||f||u||(v="sendonly"===o?"recvonly":"sendonly"),s(`a=${v}`),this.addTransport(h),u)s(`a=sctpmap:${m[0].id} webrtc-datachannel 256`);else{const e=p["rtp-hdrexts"];(null==e?void 0:e.length)&&e.forEach((e=>{s(`a=extmap:${e.id} ${e.uri}`)})),m.forEach((e=>{s(`a=rtpmap:${e.id} ${e.name}/${e.clockrate}${e.channels&&e.channels>1?`/${e.channels}`:""}`);const t=e.parameters;if(Array.isArray(t))t.length&&console.error("parameters is array???",t);else if(t&&Object.keys(t).length){const i=[];for(const e in t)i.push(`${e}=${t[e]}`);s(`a=fmtp:${e.id} ${i.join(";")}`)}const i=e["rtcp-fbs"];(null==i?void 0:i.length)&&i.forEach((t=>{s(`a=rtcp-fb:${e.id} ${t.type}${t.subtype?" "+t.subtype:""}`)}))}))}return!e.source||"sendonly"!==v&&"sendrecv"!==v||this.addSsrc(e),this}addConference(e){const{conference:t,entries:i,bundle:n,isAnswer:a}=e;this.addHeader(t.sessionId,n),s.IS_FIREFOX&&this.addTransport(t.transport);for(const e of i)this.addSsrcEntry((a?e.recvEntry||e.sendEntry:e.sendEntry||e.recvEntry)||e,t,a);return this}static fromConference(e){return(new c).addConference(e).finalize()}}},9585:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3241),n=i(5003),a=i(1677),o=i(49),r=i(4373),d=i(8957);class l{constructor(e,t){const i=this.streamSource=e.createMediaStreamSource(t),s=this.analyser=e.createAnalyser();this.gain=e.createGain(),s.minDecibels=-100,s.maxDecibels=-30,s.smoothingTimeConstant=.05,s.fftSize=1024,i.connect(s)}}class c{constructor(e){this.interval=e,this.getAmplitude=e=>{const{streamAnalyser:t,stream:i,track:s,source:n,type:a}=e,o=t.analyser;if(!o)return;const r=new Uint8Array(o.frequencyBinCount);return o.getByteFrequencyData(r),{type:a,source:n,stream:i,track:s,value:(0,d.UN)(r)}},this.analyse=()=>{const e=this.counter%3==0,t=(e?this.items:this.items.filter((e=>"input"===e.type))).filter((e=>"audio"===e.kind)).slice(0,a.KM).map(this.getAmplitude);++this.counter>=1e3&&(this.counter=0),c.ANALYSER_LISTENER.dispatchEvent("amplitude",{amplitudes:t,type:e?"all":"input"})},this.context=new(window.AudioContext||window.webkitAudioContext),this.items=[],this.outputStream=new MediaStream,this.inputStream=new MediaStream,this.counter=0,this.log=(0,n.kg)("SM"),this.direction="sendonly",this.canCreateConferenceEntry=!0,this.types=["audio","video"]}addStream(e,t){e.getTracks().forEach((i=>{this.addTrack(e,i,t)}))}addTrack(e,t,i){this.log("addTrack",i,t,e);const{context:s,items:n,inputStream:a,outputStream:o}=this,r=t.kind,d=c.getSource(e,i);switch(i){case"input":a?a.addTrack(t):this.inputStream=e;break;case"output":for(let e=0;e{this.removeTrack(t)}),{once:!0}),this.items.push(e)}hasInputTrackKind(e){return this.items.find((t=>"input"===t.type&&t.kind===e))}static getSource(e,t){return"input"===t?e.source||e.id:""+(0,d.Fk)(+e.id.substring(6))}removeTrack(e){this.log("removeTrack",e);const{items:t}=this;let i=!1;for(let s=0,n=t.length;!i&&s[e,n])),o=t.getTracks();for(const[t,n]of a){let a=e.findEntry((e=>e.direction===i&&e.type===t));if(!a){if(!s)continue;a=e.createEntry(t)}let{transceiver:d}=a;d||(d=a.createTransceiver(e.connection,n)),a.direction!==d.direction&&(d.direction=a.direction);const l=(0,r.pl)(t),c=o.findIndex((e=>e.kind===l)),h=-1!==c?o.splice(c,1)[0]:void 0,u=d.sender;u.track!==h&&u.replaceTrack(h).catch((e=>{this.log.error(e)}))}}stop(){try{this.inputStream.getTracks().concat(this.outputStream.getTracks()).forEach((e=>{(0,o.Z)(e)}))}catch(e){this.log.error(e)}}}c.ANALYSER_LISTENER=new s.Z},630:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e="\r\n"){this.joiner=e,this.lines=[],this.newLine=[]}add(...e){return this.lines.push(...e),this}push(e){return this.newLine.push(e),this}addJoined(e=""){return this.add(this.newLine.join(e)),this.newLine=[],this}join(){return this.lines.join(this.joiner)}finalize(){return this.join()+this.joiner}}},8957:(e,t,i)=>{"use strict";function s(e){return e<<0}function n(e){return e>>>0}function a(e,t=3){if(!e)return 0;const{length:i}=e;let s=0;for(let t=0;ts,UN:()=>a,h:()=>n})},3785:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(7197),n=i(1229);const a=new RegExp(`(^${n.Z})`);function o(e,t=!1){const i=(e||"").trim().split(" ");if(!i[0])return{text:"",entities:[]};const n=[],o=i[0].match(a),r=(null==o?void 0:o[0])||i[0][0];o&&n.push((0,s.Z)(r));const d=i.length;if(t||1===d)return{text:r,entities:n};const l=i[d-1].match(a),c=(null==l?void 0:l[0])||i[d-1][0];return l&&n.push(Object.assign(Object.assign({},(0,s.Z)(c)),{offset:r.length})),{text:r+c,entities:n}}},7197:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(671);function n(e){return{_:"messageEntityEmoji",offset:0,length:e.length,unicode:(0,s.w1)(e).join("-").replace(/-?fe0f/g,"")}}},1171:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2423);function n(e){return e?e.match(s.E):null}},2521:(e,t,i)=>{"use strict";function s(e){return e.target="_blank",e.rel="noopener noreferrer",e}i.d(t,{Z:()=>s})},5798:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8115),n=i(3785);function a(e,t){const{text:i,entities:a}=(0,n.Z)(e,t);return(0,s.Z)(i,void 0,a)}},3066:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(5400);function a(e,t={}){if(!e)return(0,n.ZP)("");let i=t.entities;return i&&!s.Z.premium&&t.wrappingForPeerId!==s.Z.myId&&(i=i.filter((e=>"messageEntityCustomEmoji"!==e._))),(0,n.ZP)(e,Object.assign(Object.assign({},t),{entities:i,noLinks:!0,wrappingDraft:!0,passEntities:{messageEntityTextUrl:!0,messageEntityMentionName:!0}}))}},8115:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(6535),n=i(5400);function a(e,t=!1,i){return e?(null!=i||(i=(0,s.Z)(e).filter((e=>"messageEntityEmoji"===e._))),(0,n.ZP)(e,{entities:i,wrappingDraft:t})):(0,n.ZP)("")}},5400:(e,t,i)=>{"use strict";i.d(t,{LD:()=>_,KZ:()=>F,SZ:()=>G,ZP:()=>j,Cx:()=>K,Hc:()=>V});var s=i(2423),n=i(3447),a=i(9976),o=i(8479),r=i(4056),d=i(1379),l=i(6535),c=i(2521),h=i(3591);const u={};a.Z&&(u[""]=!0,[["14","🫱🏻"]].forEach((([e,t])=>{u[e]=function(e){const t=document.createElement("span");t.classList.add("emoji"),document.body.appendChild(t),t.innerText=e;const i=t.offsetWidth;t.innerText="❤️";const s=t.offsetWidth;return document.body.removeChild(t),Math.abs(i-s)<5}(t)})));const p=u;var f=i(2738),m=i(3512),g=i(4755),v=i(3541),b=i(3772),y=i(5814),w=i(2153),S=i(393),C=i(8938),L=i(319),E=i(8497),I=i(4881),M=i(3624),P=i(5565),Z=i(6854),k=i(645),T=i(4497);const x=new ResizeObserver((e=>{for(const t of e)t.target.parentElement.setDimensionsFromRect(t.contentRect)})),A=new w.Z;class _ extends HTMLElement{constructor(){super(),this.paused=!0,this.classList.add("custom-emoji")}get docId(){return this.dataset.docId}static create(e){const t=new _;return t.dataset.docId=""+e,t}get isConnected(){var e,t;return null!==(t=null===(e=this.placeholder)||void 0===e?void 0:e.isConnected)&&void 0!==t?t:super.isConnected}connectedCallback(){this.player&&y.Z.addAnimation(this,this.renderer.animationGroup,void 0,!0)}disconnectedCallback(){var e;!this.isConnected&&(null===(e=this.renderer)||void 0===e?void 0:e.isSelectable)&&this.clear()}destroy(){this.clear()}clear(e=!0){var t;if(this.clean)return;this.clean=!0,this.pause();const{syncedPlayer:i}=this;if(i&&i.pausedElements.delete(this),null===(t=this.middlewareHelper)||void 0===t||t.clean(),this.renderer){const t=this.renderer.customEmojis.get(this.docId);(null==t?void 0:t.delete(this))&&!t.size&&(this.renderer.customEmojis.delete(this.docId),this.renderer.playersSynced.delete(t)),e&&(this.renderer.isSelectable?this.replaceChildren(G(!0)):this.replaceChildren())}this.player&&y.Z.removeAnimationByPlayer(this),A&&A.delete({div:this}),this.elements=this.renderer=this.player=this.syncedPlayer=void 0}pause(){this.paused||(this.paused=!0,this.player instanceof HTMLVideoElement&&!this.syncedPlayer&&(this.renderer.lastPausedVideo=this.player,this.player.pause()),this.syncedPlayer&&!this.syncedPlayer.pausedElements.has(this)&&(this.syncedPlayer.pausedElements.add(this),this.syncedPlayer.player&&this.syncedPlayer.pausedElements.size===this.syncedPlayer.middlewares.size&&this.syncedPlayer.player.pause()))}play(){var e;this.paused&&(this.paused=!1,this.player instanceof HTMLVideoElement&&(this.player.currentTime=(null===(e=this.renderer.lastPausedVideo)||void 0===e?void 0:e.currentTime)||this.player.currentTime,this.player.play().catch(L.Z)),this.syncedPlayer&&this.syncedPlayer.pausedElements.has(this)&&(this.syncedPlayer.pausedElements.delete(this),this.syncedPlayer.pausedElements.size!==this.syncedPlayer.middlewares.size&&this.player.play()))}remove(){this.clear()}get autoplay(){return!0}}class F extends HTMLElement{constructor(){super(),this.classList.add("custom-emoji-renderer"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("custom-emoji-canvas"),this.context=this.canvas.getContext("2d"),this.append(this.canvas),this.playersSynced=new Map,this.clearedElements=new WeakSet,this.customEmojis=new Map,this.animationGroup="EMOJI",this.isCanvasClean=!1}connectedCallback(){B.has(this)||(x.observe(this.canvas),B.add(this),this.connectedCallback=void 0)}disconnectedCallback(){var e;!this.isConnected&&this.auto&&(null===(e=this.destroy)||void 0===e||e.call(this),this.disconnectedCallback=void 0)}destroy(){var e;x.unobserve(this.canvas),this.customEmojis.forEach((e=>{e.forEach((e=>{e.clear()}))})),B.delete(this),this.playersSynced.clear(),null===(e=this.middlewareHelper)||void 0===e||e.clean(),this.customEmojis.clear(),this.destroy=this.lastPausedVideo=void 0}getOffsets(e=new Map){if(!this.playersSynced.size)return e;const t=(0,E.Z)(this,"scrollable")||this.offsetParent;if(!t)return e;const i=t.getBoundingClientRect(),s=this.getBoundingClientRect();for(const n of this.playersSynced.keys()){const a=Array.from(n),o=this.isSelectable?a.map((e=>e.placeholder)):a,{visible:r}=(0,I.Z)({overflowElement:t,overflowRect:i,elements:o,extraSize:2.5*this.size.height}),d=r.map((({rect:e})=>({top:e.top-s.top,left:e.left-s.left,width:e.width})));d.length&&e.set(n,d)}return e}clearCanvas(){if(this.isCanvasClean)return;const{context:e,canvas:t}=this;e.clearRect(0,0,t.width,t.height),this.isCanvasClean=!0}render(e){const{context:t,canvas:i,isDimensionsSet:s}=this;s||this.setDimensionsFromRect(void 0,!1),this.isCanvasClean=!1;const{width:n,height:a,dpr:o}=i;for(const[i,s]of e){const e=this.playersSynced.get(i),a=O.get(e)||(e instanceof HTMLVideoElement?e:void 0);if(!a)continue;const r=a instanceof ImageData;let d,l;e instanceof HTMLVideoElement?(d=this.size.width*o,l=this.size.height*o):(d=a.width,l=a.height);const c=Math.round(s[0].width*o);c!==d&&(d=c,l=c);const h=n-d;this.clearedElements.has(i)||this.isSelectable||(this.isSelectable?i.forEach((e=>{var t;null!==(t=e.lastChildWas)&&void 0!==t||(e.lastChildWas=e.lastChild),(0,P.Z)(e,e.firstChild)})):i.forEach((e=>{e.replaceChildren()})),this.clearedElements.add(i)),s.forEach((({top:e,left:i})=>{e=Math.round(e*o),(i=Math.round(i*o))<0||i>h||(r?t.putImageData(a,i,e):t.drawImage(a,i,e,d,l))}))}}checkForAnyFrame(){for(const e of this.playersSynced.values())if(O.has(e)||e instanceof HTMLVideoElement)return!0;return!1}remove(){super.remove()}setDimensionsFromRect(e=this.lastRect,t=!0){const{canvas:i}=this,{dpr:s}=i;if(this.lastRect!==e&&(this.lastRect=e),!e||!s||this.ignoreSettingDimensions)return;const{width:n,height:a}=e,o=Math.floor(Math.round(n*s)),r=Math.floor(Math.round(a*s));i.width===o&&i.height===r||(i.width=o,i.height=r,this.isDimensionsSet=!0,this.isCanvasClean=!0,(this.forceRenderAfterSize||this.isSelectable&&t)&&(this.forceRenderAfterSize=void 0,this.forceRender()))}forceRender(){this.isDimensionsSet&&(U(new Set([this]))||this.clearCanvas())}add(e,t,i,s){const n=this;if(e.forEach(((t,i)=>{let s=this.customEmojis.get(i);s?this.clearedElements.delete(s):this.customEmojis.set(i,s=new Set);for(const e of t)s.has(e)?t.delete(e):(e.clean=!1,e.renderer=n,e.elements=s,e.middlewareHelper=this.middlewareHelper.get().create(),s.add(e),e.lastChildWas&&!e.lastChildWas.parentNode&&e.append(e.lastChildWas));t.size||e.delete(i)})),!e.size)return;const a=!(t||!1===t||!A),o=Array.from(e.keys()),r=m.Z.managers,d=this.middlewareHelper.get(),l=this.size;return r.appEmojiManager.getCachedCustomEmojiDocuments(o).then((c=>{if(d&&!d())return;const h=[],u=(o,c)=>{const h=o.id,u=e.get(h),p=n.customEmojis.get(h),f=2===o.sticker,m="video/webm"===o.mime_type&&!S.Z,g=(f||3===o.sticker&&this.isSelectable)&&!i&&!m,w=[],E=Array.from(u),I=(0,v.ZP)({div:E,doc:o,width:l.width,height:l.height,loop:!0,play:D,managers:r,isCustomEmoji:!0,group:"none",loadPromises:w,middleware:d,exportLoad:a||!1===t?2:1,needFadeIn:!1,loadStickerMiddleware:g&&d?d.create().get((()=>!!P.middlewares.size)):void 0,static:m,onlyThumb:i,withThumb:null!=s?s:!n.clearedElements.has(p)&&void 0,syncedVideo:this.isSelectable});c&&I.then((()=>c.push(...w)));const M={elements:u};if(1===o.sticker||i||m)return this.isSelectable&&(M.onRender=()=>Promise.all(w).then((()=>{d&&!d()||E.forEach((e=>{const{placeholder:t}=e;t.src=e.firstElementChild.src}))}))),I.then((e=>Object.assign(Object.assign({},e),M)));let P;M.onRender=e=>Promise.all(w).then((()=>{var t;if(d&&!d()||!o.animated)return;const i=Array.isArray(e)?e:[e],s=Array.isArray(i)?i[0]:i;if((0,C.Z)(s),E.forEach(((e,t)=>{const s=i[t]||i[0];e.player=s,P&&(e.syncedPlayer=P,e.paused?e.syncedPlayer.pausedElements.add(e):s.paused&&s.play()),e.isConnected&&y.Z.addAnimation(e,e.renderer.animationGroup,void 0,!0)})),(s instanceof b.Z||s instanceof HTMLVideoElement&&this.isSelectable)&&(P.player=s,n.playersSynced.set(p,s)),s instanceof b.Z?(s.group=n.animationGroup,null!==(t=s.overrideRender)&&void 0!==t||(s.overrideRender=e=>{O.set(s,e)})):HTMLVideoElement,g){const e=(0,b.a)(this.size.width,this.size.height);n.canvas.dpr=e,H()}}));const Z=[h,l.width,l.height].join("-");if(g){P=N.get(Z),P||(P={player:void 0,middlewares:new Set,pausedElements:new Set,key:Z},N.set(Z,P));for(const e of u){const t=e.middlewareHelper.get();P.middlewares.add(t),t.onClean((()=>{var i,s;if(P.middlewares.delete(t),!P.middlewares.size){if(P.player){const t=O.get(P.player);if(t&&(null===(s=(i=t).close)||void 0===s||s.call(i),O.delete(P.player)),O.delete(P.player),P.player instanceof b.Z)P.player.overrideRender=L.Z,P.player.remove();else if(P.player instanceof HTMLVideoElement){const t=k.Z.generateName(""+e.docId,0,0,void 0,void 0);delete v._i[t]}P.player=void 0}N.get(P.key)===P&&N.delete(P.key)&&!N.size&&z()}}))}}return I.then((e=>Object.assign(Object.assign({},e),M)))},p=[],f=c.map(((e,t)=>{if(e)return u(e,h);p.push(o[t])})).filter(Boolean),m=p.length?r.appEmojiManager.getCustomEmojiDocuments(p).then((e=>d&&!d()?[]:e.filter(Boolean).map((e=>u(e))))):Promise.resolve([]),g=e=>Promise.all(e).then((e=>{const t=e.map((({load:e,onRender:t,elements:i})=>{if(!e)return;const s=()=>e().then(t);if(!a)return s();i.forEach((e=>{A.push({div:e,load:()=>(i.forEach((e=>{A.delete({div:e})})),s())})}))}));return Promise.all(t)})),w=()=>{if(d&&!d())return;const e=g(f),t=m.then((e=>g(e)));return Promise.all([e,t])};return t?t.push({div:n.canvas,load:w}):w(),Promise.all(f).then((()=>Promise.all(h))).then((()=>{}))}))}static create(e){const t=new F;t.animationGroup=e.animationGroup,t.size=e.customEmojiSize||g.Z.active.customEmoji,t.isSelectable=e.isSelectable,e.wrappingDraft&&(t.contentEditable="false",t.style.height="inherit");let i=e.middleware;return i?(t.middlewareHelper=i.create(),i=t.middlewareHelper.get(),i.onDestroy((()=>{var e;null===(e=t.destroy)||void 0===e||e.call(t)}))):(t.auto=!0,t.middlewareHelper=(0,M.k)()),t}}const D=!0;let R;const B=new Set,N=new Map,O=new Map,U=(e=B)=>{const t=Array.from(e).filter((e=>e.isConnected&&e.checkForAnyFrame()&&!e.ignoreSettingDimensions));if(!t.length)return!1;const i=t.map((e=>{const t=[...e.playersSynced.values()].reduce(((e,t)=>e+ +!!t.paused),0);if(e.playersSynced.size===t)return;const i=e.getOffsets();return i.size?[e,i]:void 0})).filter(Boolean);for(const[e]of i)e.clearCanvas();for(const[e,t]of i)e.render(t);return!0},H=()=>{R||(R=window.setInterval(U,16.666666666666668),U())},z=()=>{R&&(clearInterval(R),R=void 0)};function j(e,t={}){var i,u,m,g,v,b,y,w;const S=document.createDocumentFragment();if(!e)return S;const C=null!==(i=t.nasty)&&void 0!==i?i:t.nasty={i:0,usedLength:0,text:e},L=(e,i)=>{const s=document.createElement("span");return t.wrappingDraft&&(s.contentEditable="false"),s.classList.add("input-something"),s.append(e),(D||S).append(s),e.classList.add("input-selectable"),!i&&e.append(G(!0)),I.add(s),s};t.isSelectable||(t.isSelectable=t.wrappingDraft);const E=null!==(u=t.customEmojis)&&void 0!==u?u:t.customEmojis=new Map,I=null!==(m=t.customWraps)&&void 0!==m?m:t.customWraps=new Set,M=null!==(g=t.entities)&&void 0!==g?g:t.entities=(0,l.Z)(C.text),P=null!==(v=t.passEntities)&&void 0!==v?v:t.passEntities={},Z=null!==(b=t.contextSite)&&void 0!==b?b:t.contextSite="Telegram",k="Telegram"!==Z,x=C.text.length,A=M.length;let D;for(;C.i=x){if("messageEntityCaret"!==e._)continue}else e.offset+e.length>x&&(e=(0,o.Z)(e),e.length=x-e.offset);e.length&&(C.lastEntity=e);let i=M[C.i+1];const l=e.offset,u=l+e.length,m=Math.min(u,null!==(y=null==i?void 0:i.offset)&&void 0!==y?y:65535),g=C.text.slice(l,u);let v=C.text.slice(l,m);C.usedLengthv.length&&b?b:S,t.voodoo)return S}var R;if(C.lastEntity&&(C.usedLength=C.lastEntity.offset+C.lastEntity.length),C.usedLength{const t=document.createElement("span");return t.classList.add(e?"input-filler2":"input-filler"),t.textContent=Z.Z,t};function V(e){var t;if((null==e?void 0:e.textContent)!==Z.Z||"false"===(null===(t=null==e?void 0:e.getAttribute)||void 0===t?void 0:t.call(e,"contenteditable"))){if(!e||e.textContent!==Z.Z||e.firstElementChild)return 2;if(e.nodeType===e.ELEMENT_NODE)return 1}return 0}function K(e){const t=(e,t,i)=>{const s=V(t);2===s?e[i](G()):1===s&&t.appendChild(document.createTextNode(Z.Z))};for(const i of e){const{previousSibling:e,nextSibling:s}=i;t(i,e,"before"),t(i,s,"after")}}window.wrapRichText=j},4497:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3591);function n(e){const{url:t,onclick:i}=(0,s.Z)(e),n=document.createElement("a");return n.href=t,i&&n.setAttribute("onclick",`${i}(this)`),n}},1447:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(5814),n=i(410),a=i(5418),o=i(5003),r=i(3772),d=i(7328),l=i(3241);class c extends l.Z{constructor(e){super(),this.worker=e,this.worker.onerror=e=>{try{this.dispatchEvent("workerError",e),this.cleanup(),this.terminate()}catch(e){}},this.worker.onmessage=e=>{this.dispatchEvent(e.data.queryMethodListener,...e.data.queryMethodArguments)}}postMessage(e){this.worker.postMessage(e)}terminate(){this.worker.terminate()}sendQuery(e,t){this.worker.postMessage({queryMethod:e.shift(),queryMethodArguments:e},d.Z?t:void 0)}}var h=i(8975),u=i(3855);const p="undefined"!=typeof WebAssembly;var f=i(5471),m=i(4159);const g=new class{constructor(){this.loadPromise=p?void 0:Promise.reject(),this.loaded=!1,this.workersLimit=m.Z.threads,this.players={},this.playersByCacheName={},this.workers=[],this.curWorkerNum=0,this.log=(0,o.kg)("LOTTIE",o.v9.Error),this.onPlayerLoaded=(e,t,i)=>{const s=this.players[e];s?(this.log.debug("onPlayerLoaded"),s.onLoad(t,i)):this.log.warn("onPlayerLoaded on destroyed player:",e,t)},this.onFrame=(e,t,i)=>{const s=this.players[e];s?(void 0!==s.clamped&&i instanceof Uint8ClampedArray&&(s.clamped=i),s.renderFrame(i,t)):this.log.warn("onFrame on destroyed player:",e,t)},this.onPlayerError=(e,t)=>{const i=this.players[e];i&&s.Z.getAnimations(i.el[0]).forEach((e=>{s.Z.removeAnimation(e)}))}}getAnimation(e){for(const t in this.players)if(this.players[t].el.includes(e))return this.players[t];return null}setLoop(e){for(const t in this.players){const i=this.players[t];i.loop=e,i.autoplay=i._autoplay}}loadLottieWorkers(){return this.loadPromise?this.loadPromise:this.loadPromise=new Promise(((e,t)=>{let s=this.workersLimit;for(let n=0;n{this.log("worker #"+n+" ready"),o.addEventListener("frame",this.onFrame),o.addEventListener("loaded",this.onPlayerLoaded),o.addEventListener("error",this.onPlayerError),--s,s||(this.log("workers ready"),e(),this.loaded=!0)}),{once:!0}),o.addEventListener("workerError",(e=>{t("rlottie load error: "+e.message),this.loaded=!1}),{once:!0})}}))}makeAssetUrl(e){return"assets/tgs/"+e+".json"}loadAnimationAsAsset(e,t){return this.loadAnimationFromURL(e,this.makeAssetUrl(t))}loadAnimationDataFromURL(e){return p?(this.loadLottieWorkers(),fetch(e).then((e=>e.headers&&"application/octet-stream"!==e.headers.get("content-type")?e.blob():e.arrayBuffer().then((e=>u.Z.invokeCrypto("gzipUncompress",e))).then((e=>(0,h.Z)(e,"")))))):this.loadPromise}loadAnimationFromURLManually(e){const t=this.makeAssetUrl(e);return this.loadAnimationDataFromURL(t).then((e=>i=>this.loadAnimationFromURLNext(e,i,t)))}loadAnimationFromURL(e,t){return this.loadAnimationDataFromURL(t).then((i=>this.loadAnimationFromURLNext(i,e,t)))}loadAnimationFromURLNext(e,t,i){const s=Object.assign(t,{animationData:e,needUpscale:!0});return s.name||(s.name=i),this.loadAnimationWorker(s)}waitForFirstFrame(e){return Promise.race([new Promise((t=>{e.addEventListener("firstFrame",t,{once:!0})})),(0,a.Z)(2500)]).then((()=>e))}loadAnimationWorker(e,t=e.group||"",i){return n=this,a=void 0,d=function*(){if(!p)return this.loadPromise;if(this.loaded||(yield this.loadLottieWorkers()),i&&!i())throw(0,f.Z)("MIDDLEWARE");if(e.sync){const t=r.Z.CACHE.generateName(e.name,e.width,e.height,e.color,e.toneIndex),i=this.playersByCacheName[t];if(null==i?void 0:i.size)return Promise.resolve(i.entries().next().value[0])}const n=Array.isArray(e.container)?e.container:[e.container];if(e.width&&e.height||(e.width=parseInt(n[0].style.width),e.height=parseInt(n[0].style.height)),!e.width||!e.height)throw new Error("No size for sticker!");e.group=t;const a=this.initPlayer(n,e);return s.Z.addAnimation(a,t),a},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{r(d.next(e))}catch(e){t(e)}}function s(e){try{r(d.throw(e))}catch(e){t(e)}}function r(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}r((d=d.apply(n,a||[])).next())}));var n,a,o,d}onDestroy(e){delete this.players[e]}destroyWorkers(){p&&(this.workers.forEach(((e,t)=>{e.terminate(),this.log("worker #"+t+" terminated")})),this.log("workers destroyed"),this.workers.length=0,this.curWorkerNum=0,this.loaded=!1,this.loadPromise=void 0)}initPlayer(e,t){var i,s;const n=new r.Z({el:e,worker:this.workers[this.curWorkerNum++],options:t}),{reqId:a,cacheName:o}=n;this.players[a]=n;const d=o?null!==(i=(s=this.playersByCacheName)[o])&&void 0!==i?i:s[o]=new Set:void 0;return o&&d.add(n),this.curWorkerNum>=this.workers.length&&(this.curWorkerNum=0),n.addEventListener("destroy",(()=>{this.onDestroy(a),d.delete(n)&&!d.size&&delete this.playersByCacheName[o]})),n.loadFromData(t.animationData),n}};n.GO.lottieLoader=g;const v=g},3772:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,a:()=>h});var s=i(7328),n=i(8189),a=i(4762),o=i(3241),r=i(4755),d=i(3228),l=i(356),c=i(645);function h(e,t,i){let s=(0,d.Z)(window.devicePixelRatio,1,2);return s>1&&!i&&(e>90&&t>90?!a.IS_APPLE&&r.Z.isMobile&&(s=1):(e>60&&t>60||a.IS_ANDROID)&&(s=Math.max(1.5,s-1.5))),s}class u extends o.Z{constructor({el:e,worker:t,options:i}){super(!0),this.reqId=0,this.width=0,this.height=0,this.paused=!0,this.direction=1,this.speed=1,this.autoplay=!0,this.loop=!0,this.group="",this.cachingDelta=0,this.playedTimes=0,this.reqId=++u.reqId,this.el=e,this.worker=t;for(const e in i)this.hasOwnProperty(e)&&(this[e]=i[e]);let o;this._loop=this.loop,this._autoplay=this.autoplay,this.initFrame=i.initFrame,this.color=i.color,this.inverseColor=i.inverseColor,this.name=i.name,this.skipFirstFrameRendering=i.skipFirstFrameRendering,this.toneIndex=i.toneIndex,this.raw=void 0!==this.color,this.name&&(this.cacheName=u.CACHE.generateName(this.name,this.width,this.height,this.color,this.toneIndex)),void 0!==i.skipRatio?o=i.skipRatio:(a.IS_ANDROID||a.IS_APPLE_MOBILE||a.IS_APPLE&&!a.IS_SAFARI&&!n.Z)&&this.width<100&&this.height<100&&!i.needUpscale&&(o=.5),this.skipDelta=void 0!==o?1/o|0:1;const r=h(this.width,this.height,i.needUpscale);this.width=Math.round(this.width*r),this.height=Math.round(this.height*r),i.noCache||(a.IS_APPLE&&this.width>100&&this.height>100?this.cachingDelta=2:this.width<100&&this.height<100?this.cachingDelta=1/0:this.cachingDelta=4),this.canvas||(this.canvas=this.el.map((()=>{const e=document.createElement("canvas");return e.classList.add("rlottie"),e.width=this.width,e.height=this.height,e.dpr=r,e}))),this.contexts=this.canvas.map((e=>e.getContext("2d"))),l.Z&&!this.raw||(this.imageData=new ImageData(this.width,this.height),s.Z&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4))),this.name?this.cache=u.CACHE.getCache(this.cacheName):this.cache=c.M.createCache()}clearCache(){this.cachingDelta!==1/0&&(this.cacheName&&this.cache.counter>1||this.cache.clearCache())}sendQuery(e,t){this.worker.sendQuery([e.shift(),this.reqId,...e],t)}loadFromData(e){this.sendQuery(["loadFromData",e,this.width,this.height,this.toneIndex,void 0!==this.color])}play(){this.paused&&(this.paused=!1,this.setMainLoop())}pause(e=!0){this.paused||(this.paused=!0,e&&(clearTimeout(this.rafId),this.rafId=void 0))}resetCurrentFrame(){var e;return this.curFrame=null!==(e=this.initFrame)&&void 0!==e?e:1===this.direction?this.minFrame:this.maxFrame}stop(e=!0){this.pause();const t=this.resetCurrentFrame();e&&this.requestFrame(t)}restart(){this.stop(!1),this.play()}setSpeed(e){this.speed!==e&&(this.speed=e,this.paused||this.setMainLoop())}setDirection(e){this.direction!==e&&(this.direction=e,this.paused||this.setMainLoop())}remove(){this.pause(),this.sendQuery(["destroy"]),this.cacheName&&u.CACHE.releaseCache(this.cacheName),this.dispatchEvent("destroy"),this.cleanup()}applyColor(e){const[t,i,s]=this.color;for(let n=0,a=e.length;n{let n=this.cache.framesNew.get(t);if(e instanceof Uint8ClampedArray?s>0&&(n=this.canvas[0]):n=e,!n){const e=document.createElement("canvas");e.width=i.canvas.width,e.height=i.canvas.height,e.getContext("2d").putImageData(this.imageData,0,0),this.cache.framesNew.set(t,e),n=e}this.overrideRender&&this.renderedFirstFrame?this.overrideRender(n||this.imageData):n?(i.clearRect(0,0,n.width,n.height),i.drawImage(n,0,0)):i.putImageData(this.imageData,0,0),this.renderedFirstFrame||(this.renderedFirstFrame=!0)})),this.dispatchEvent("enterFrame",t)}catch(e){console.error("RLottiePlayer renderFrame error:",e,this.width,this.height),this.autoplay=!1,this.pause()}}renderFrame(e,t){if(this.cachingDelta&&(t%this.cachingDelta||!t)&&(e instanceof Uint8ClampedArray&&!this.cache.frames.has(t)?this.cache.frames.set(t,new Uint8ClampedArray(e)):l.Z&&e instanceof ImageBitmap&&!this.cache.framesNew.has(t)&&this.cache.framesNew.set(t,e)),this.frInterval){const i=Date.now()-this.frThen;if(i<0){const s=this.frInterval>-i?-i%this.frInterval:this.frInterval;return this.rafId&&clearTimeout(this.rafId),void(this.rafId=window.setTimeout((()=>{this.renderFrame2(e,t)}),s))}}this.renderFrame2(e,t)}requestFrame(e){const t=this.cache.frames.get(e),i=this.cache.framesNew.get(e);i?this.renderFrame(i,e):t?this.renderFrame(t,e):(this.clamped&&!this.clamped.length&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.sendQuery(["renderFrame",e],this.clamped?[this.clamped.buffer]:void 0))}onLap(){return++this.playedTimes===this.loop&&(this.loop=!1),!!this.loop||(this.pause(!1),!1)}mainLoopForwards(){const{skipDelta:e,maxFrame:t}=this,i=this.curFrame+e>t?this.curFrame=this.loop?this.minFrame:this.maxFrame:this.curFrame+=e;return this.requestFrame(i),!(i+e>t)||this.onLap()}mainLoopBackwards(){const{skipDelta:e,minFrame:t}=this,i=this.curFrame-et?1:-1,callback:s})}playToFrame(e){this.pause();const{frame:t,speed:i,callback:s,direction:n}=e;this.setDirection(void 0===n?this.curFrame>t?-1:1:n),void 0!==i&&this.setSpeed(i);const a=[this.curFrame,t];-1===this.direction&&a.reverse(),this.loop=!1,this.setMinMax(a[0],a[1]),this.playToFrameOnFrameCallback&&this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),s&&(this.playToFrameOnFrameCallback=e=>{e===t&&(this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),s())},this.addEventListener("enterFrame",this.playToFrameOnFrameCallback)),this.play()}setColor(e,t){this.color=e,t&&this.paused&&this.renderFrame2(this.imageData.data,this.curFrame)}setInverseColor(e){this.inverseColor=e}setMinMax(e=0,t=this.frameCount-1){this.minFrame=e,this.maxFrame=t}onLoad(e,t){return i=this,s=void 0,a=function*(){this.frameCount=e,this.fps=t,this.setMinMax(),void 0!==this.initFrame&&(this.initFrame=(0,d.Z)(this.initFrame,this.minFrame,this.maxFrame));const i=this.resetCurrentFrame();if(this.fps<60&&1!==this.skipDelta){const e=60/t;this.skipDelta=this.skipDelta/e|0}this.frInterval=1e3/this.fps/this.speed*this.skipDelta,this.frThen=Date.now()-this.frInterval,!this.skipFirstFrameRendering&&this.requestFrame(i),this.dispatchEvent("ready"),this.addEventListener("enterFrame",(()=>{this.dispatchEvent("firstFrame"),this.canvas[0].parentNode||!this.el||this.overrideRender||this.el.forEach(((e,t)=>e.append(this.canvas[t]))),this.frameListener=()=>{if(this.paused||!this.currentMethod)return;const e=Date.now();this.frThen=e+this.frInterval,this.currentMethod()||this.loop||!this.autoplay||(this.autoplay=!1)},this.addEventListener("enterFrame",this.frameListener),"none"===this.group&&this.autoplay&&this.play()}),{once:!0})},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}u.CACHE=c.Z,u.reqId=0},4874:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(1447),n=i(6008),a=i(410),o=i(4789),r=i(2648);const d=new class{constructor(){this.pageId=-1,this.pagesDiv=document.getElementById("auth-pages"),this.scrollableDiv=this.pagesDiv.querySelector(".scrollable"),this.selectTab=(0,n.X)(null,this.scrollableDiv.querySelector(".tabs-container"),null,(()=>{var e;(null===(e=this.page)||void 0===e?void 0:e.onShown)&&this.page.onShown()}))}setPage(e){if(e.isAuthPage){this.pagesDiv.style.display="";const t=(0,r.Z)(e.pageEl);if(this.pageId===t)return;this.selectTab(t),-1!==this.pageId&&t>1&&s.Z.loadLottieWorkers(),this.pageId=t,this.scrollableDiv&&(0,o.Z)({container:this.scrollableDiv,element:this.scrollableDiv.firstElementChild,position:"start"})}else this.pagesDiv.style.display="none",e.pageEl.style.display="",this.pageId=-1;this.page=e}};a.GO.pagesManager=d;const l=d;class c{constructor(e,t,i,s,n){this.isAuthPage=t,this.onFirstMount=i,this.onMount=s,this.onShown=n,this.installed=!1,this.pageEl=document.body.querySelector("."+e)}mount(...e){return t=this,i=void 0,n=function*(){if(this.onMount){const t=this.onMount(...e);t instanceof Promise&&(yield t)}if(!this.installed){if(this.onFirstMount)try{const t=this.onFirstMount(...e);t instanceof Promise&&(yield t)}catch(e){console.error("PAGE MOUNT ERROR:",e)}this.installed=!0}l.setPage(this)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}}},671:(e,t,i)=>{"use strict";function s(e){return r(o(e)).join("-")}i.d(t,{Ml:()=>c,N0:()=>s,tB:()=>d,w1:()=>r,zu:()=>h});const n=/\uFE0F/g,a=String.fromCharCode(8205),o=e=>e.indexOf(a)<0?e.replace(n,""):e;function r(e){const t=[];let i=0,s=0,n=0;for(;n55296&&i<=56319?s=i:t.push(i.toString(16));return t.length&&2===t[0].length&&(t[0]="00"+t[0]),t}function d(e){const t=e.match(/[\uDFFB-\uDFFF]/);return t?5-(57343-t[0].charCodeAt(0)):0}const l=new Map([["FT","🏴‍☠"]]);function c(e){var t;return null!==(t=l.get(e))&&void 0!==t?t:String.fromCharCode(55356,56741+e.charCodeAt(0),55356,56741+e.charCodeAt(1))}function h(e){return e.split("-").reduce(((e,t)=>e+String.fromCodePoint(parseInt(t,16))),"")}},4329:function(e){"undefined"!=typeof self&&self,e.exports=function(e){var t={};function i(s){if(t[s])return t[s].exports;var n=t[s]={i:s,l:!1,exports:{}};return e[s].call(n.exports,n,n.exports,i),n.l=!0,n.exports}return i.m=e,i.c=t,i.d=function(e,t,s){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(i.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(s,n,function(t){return e[t]}.bind(null,n));return s},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=0)}([function(e,t,i){"use strict";(function(t){var i=t.AudioContext||t.webkitAudioContext,s=function(e){if(!s.isRecordingSupported())throw new Error("Recording is not supported in this browser");e||(e={}),this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};s.isRecordingSupported=function(){return i&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},s.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},s.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],i=0;i{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},s.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then((e=>(this.stream=e,this.audioContext.createMediaStreamSource(e))))},s.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},s.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise(((t,i)=>{var s=i=>{switch(i.data.message){case"ready":t();break;case"page":this.encodedSamplePosition=i.data.samplePosition,e(i.data.page);break;case"done":this.encoder.removeEventListener("message",s),this.finish()}};this.encoder.addEventListener("message",s),this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))}))},s.prototype.pause=function(e){if("recording"===this.state){if(this.state="paused",e&&this.config.streamPages){var t=this.encoder;return new Promise(((e,i)=>{var s=i=>{"flushed"===i.data.message&&(t.removeEventListener("message",s),this.onpause(),e())};t.addEventListener("message",s),t.postMessage({command:"flush"})}))}return this.onpause(),Promise.resolve()}},s.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.onresume())},s.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},s.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},s.prototype.start=function(e){if("inactive"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then((()=>this.initSourceNode(e))).then((e=>{this.sourceNode=e,this.state="recording",this.onstart(),this.encoder.postMessage({command:"getHeaderPages"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)}))},s.prototype.stop=function(){if("inactive"!==this.state){this.state="inactive",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise((t=>{var i=s=>{"done"===s.data.message&&(e.removeEventListener("message",i),t())};e.addEventListener("message",i),e.postMessage({command:"done"}),this.config.reuseWorker||e.postMessage({command:"close"})}))}return Promise.resolve()},s.prototype.destroyWorker=function(){"inactive"===this.state&&this.encoder&&(this.encoder.postMessage({command:"close"}),delete this.encoder)},s.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},s.prototype.streamPage=function(e){this.ondataavailable(e)},s.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,i){return e.set(i,t),t+i.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},s.prototype.ondataavailable=function(){},s.prototype.onpause=function(){},s.prototype.onresume=function(){},s.prototype.onstart=function(){},s.prototype.onstop=function(){},e.exports=s}).call(this,i(1))},function(e,t){var i;i=function(){return this}();try{i=i||new Function("return this")()}catch(e){"object"==typeof window&&(i=window)}e.exports=i}])},6802:e=>{var t=.1,i="function"==typeof Float32Array;function s(e,t){return 1-3*t+3*e}function n(e,t){return 3*t-6*e}function a(e){return 3*e}function o(e,t,i){return((s(t,i)*e+n(t,i))*e+a(t))*e}function r(e,t,i){return 3*s(t,i)*e*e+2*n(t,i)*e+a(t)}function d(e){return e}e.exports=function(e,s,n,a){if(!(0<=e&&e<=1&&0<=n&&n<=1))throw new Error("bezier x values must be in [0, 1] range");if(e===s&&n===a)return d;for(var l=i?new Float32Array(11):new Array(11),c=0;c<11;++c)l[c]=o(c*t,e,n);return function(i){return 0===i||1===i?i:o(function(i){for(var s=0,a=1;10!==a&&l[a]<=i;++a)s+=t;--a;var d=s+(i-l[a])/(l[a+1]-l[a])*t,c=r(d,e,n);return c>=.001?function(e,t,i,s){for(var n=0;n<4;++n){var a=r(t,i,s);if(0===a)return t;t-=(o(t,i,s)-e)/a}return t}(i,d,e,n):0===c?d:function(e,t,i,s,n){var a,r,d=0;do{(a=o(r=t+(i-t)/2,s,n)-e)>0?i=r:t=r}while(Math.abs(a)>1e-7&&++d<10);return r}(i,s,s+t,e,n)}(i),s,a)}}}}]); -//# sourceMappingURL=460.057266426d36dd34300a.chunk.js.map \ No newline at end of file diff --git a/public/460.057266426d36dd34300a.chunk.js.map b/public/460.057266426d36dd34300a.chunk.js.map deleted file mode 100644 index 53e149d3c..000000000 --- a/public/460.057266426d36dd34300a.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"460.057266426d36dd34300a.chunk.js","mappings":"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AO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,MAAO,kBAAkB,MAAO,QAAQ,MAAO,kBAAkB,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,wCAAwC,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,IAAK,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,iBAAiB,KAAM,iBAAiB,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG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","sources":["webpack://tweb/./src/components/animationIntersector.ts","webpack://tweb/./src/components/appMediaPlaybackController.ts","webpack://tweb/./src/components/appMediaViewer.ts","webpack://tweb/./src/lib/mediaPlayer.ts","webpack://tweb/./src/components/appMediaViewerBase.ts","webpack://tweb/./src/helpers/fillPropertyValue.ts","webpack://tweb/./src/components/appNavigationController.ts","webpack://tweb/./src/components/appSearch.ts","webpack://tweb/./src/components/appSearchSuper..ts","webpack://tweb/./src/helpers/dom/lockTouchScroll.ts","webpack://tweb/./src/components/appSelectPeers.ts","webpack://tweb/./src/components/audio.ts","webpack://tweb/./src/helpers/avatarListLoader.ts","webpack://tweb/./src/components/appMediaViewerAvatar.ts","webpack://tweb/./src/components/avatar.ts","webpack://tweb/./src/components/avatarEdit.ts","webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/buttonCorner.ts","webpack://tweb/./src/components/buttonIcon.ts","webpack://tweb/./src/components/buttonMenu.ts","webpack://tweb/./src/components/buttonMenuToggle.ts","webpack://tweb/./src/components/chat/gradientRenderer.ts","webpack://tweb/./src/helpers/easing/easeOutQuad.ts","webpack://tweb/./src/components/chat/selection.ts","webpack://tweb/./src/helpers/dom/getSelectedText.ts","webpack://tweb/./src/components/checkboxField.ts","webpack://tweb/./src/components/codeInputField.ts","webpack://tweb/./src/components/confirmationPopup.ts","webpack://tweb/./src/components/countryInputField.ts","webpack://tweb/./src/components/dotRenderer.ts","webpack://tweb/./src/components/editPeer.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/gifs.ts","webpack://tweb/./src/components/sidebarRight/tabs/gifs.ts","webpack://tweb/./src/components/sidebarRight/tabs/stickers.ts","webpack://tweb/./src/components/emoticonsDropdown/index.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/emoji.ts","webpack://tweb/./src/lib/richTextProcessor/wrapSingleEmoji.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/stickers.ts","webpack://tweb/./src/components/generateDelimiter.ts","webpack://tweb/./src/components/generateFakeIcon.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat2.ts","webpack://tweb/./src/components/gifsMasonry.ts","webpack://tweb/./src/components/horizontalMenu.ts","webpack://tweb/./src/components/inputField.ts","webpack://tweb/./src/helpers/dom/selectElementContents.ts","webpack://tweb/./src/components/inputSearch.ts","webpack://tweb/./src/components/lazyLoadQueue.ts","webpack://tweb/./src/components/lazyLoadQueueIntersector.ts","webpack://tweb/./src/components/mediaProgressLine.ts","webpack://tweb/./src/components/middleEllipsis.ts","webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/monkeys/tracking.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/components/peerProfileAvatars.ts","webpack://tweb/./src/components/peerProfile.ts","webpack://tweb/./src/components/generateTitleIcons.ts","webpack://tweb/./src/components/generateVerifiedIcon.ts","webpack://tweb/./src/components/generatePremiumIcon.ts","webpack://tweb/./src/components/peerTitle.ts","webpack://tweb/./src/components/popups/avatar.ts","webpack://tweb/./src/lib/cropper.ts","webpack://tweb/./src/components/popups/deleteDialog.ts","webpack://tweb/./src/components/popups/deleteMessages.ts","webpack://tweb/./src/components/popups/forward.ts","webpack://tweb/./src/components/popups/index.ts","webpack://tweb/./src/components/popups/limit.ts","webpack://tweb/./src/components/popups/mute.ts","webpack://tweb/./src/components/popups/peer.ts","webpack://tweb/./src/components/popups/pickUser.ts","webpack://tweb/./src/components/popups/sendNow.ts","webpack://tweb/./src/components/popups/stickers.ts","webpack://tweb/./src/components/preloader.ts","webpack://tweb/./src/components/putPhoto.ts","webpack://tweb/./src/components/wrappers/getPeerInitials.ts","webpack://tweb/./src/components/putPreloader.ts","webpack://tweb/./src/components/radioField.ts","webpack://tweb/./src/components/radioForm.ts","webpack://tweb/./src/components/rangeSelector.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/components/row.ts","webpack://tweb/./src/components/scrollable.ts","webpack://tweb/./src/components/settingSection.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newGroup.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/privacyType.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/getPrivacyRulesDetails.ts","webpack://tweb/./src/components/privacySection.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/phoneNumber.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/passwordSet.ts","webpack://tweb/./src/helpers/dom/canFocus.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/emailConfirmation.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/email.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/hint.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/reEnterPassword.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/enterPassword.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/index.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/lastSeen.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/profilePhoto.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/forwardMessages.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/addToGroups.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/calls.ts","webpack://tweb/./src/components/sidebarLeft/tabs/activeSessions.ts","webpack://tweb/./src/components/sidebarLeft/tabs/blockedUsers.ts","webpack://tweb/./src/helpers/string/convertKeyToInputKey.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/voices.ts","webpack://tweb/./src/components/sidebarLeft/tabs/activeWebSessions.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacyAndSecurity.ts","webpack://tweb/./src/helpers/averageColor.ts","webpack://tweb/./src/helpers/highlightningColor.ts","webpack://tweb/./src/components/colorPicker.ts","webpack://tweb/./src/components/sidebarLeft/tabs/backgroundColor.ts","webpack://tweb/./src/components/sidebarLeft/tabs/background.ts","webpack://tweb/./src/helpers/files/requestFile.ts","webpack://tweb/./src/components/sidebarLeft/tabs/quickReaction.ts","webpack://tweb/./src/components/sidebarLeft/tabs/generalSettings.ts","webpack://tweb/./src/helpers/eachMinute.ts","webpack://tweb/./src/helpers/eachTimeout.ts","webpack://tweb/./src/components/sidebarLeft/tabs/chatFolders.ts","webpack://tweb/./src/components/sidebarLeft/tabs/notifications.ts","webpack://tweb/./src/components/sidebarLeft/tabs/language.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/photo.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/file.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/video.ts","webpack://tweb/./src/components/sidebarLeft/tabs/dataAndStorage.ts","webpack://tweb/./src/components/sidebarLeft/tabs/settings.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newChannel.ts","webpack://tweb/./src/components/popups/createContact.ts","webpack://tweb/./src/components/sidebarLeft/tabs/contacts.ts","webpack://tweb/./src/components/sidebarLeft/tabs/archivedTab.ts","webpack://tweb/./src/components/sidebarLeft/tabs/peopleNearby.ts","webpack://tweb/./src/components/sidebarLeft/index.ts","webpack://tweb/./src/components/sidebarLeft/tabs/addMembers.ts","webpack://tweb/./src/components/sidebarLeft/tabs/includedChats.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editFolder.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editProfile.ts","webpack://tweb/./src/components/sidebarRight/index.ts","webpack://tweb/./src/components/sidebarRight/tabs/editContact.ts","webpack://tweb/./src/components/sidebarRight/tabs/editTopic.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatType.ts","webpack://tweb/./src/components/sidebarRight/tabs/userPermissions.ts","webpack://tweb/./src/components/sidebarRight/tabs/groupPermissions.ts","webpack://tweb/./src/lib/appManagers/utils/chats/combineParticipantBannedRights.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatReactions.ts","webpack://tweb/./src/components/sidebarRight/tabs/editChat.ts","webpack://tweb/./src/components/sidebarRight/tabs/sharedMedia.ts","webpack://tweb/./src/components/singleTransition.ts","webpack://tweb/./src/components/slider.ts","webpack://tweb/./src/components/sliderTab.ts","webpack://tweb/./src/components/sortedUserList.ts","webpack://tweb/./src/components/stickerViewer.ts","webpack://tweb/./src/components/stickyIntersector.ts","webpack://tweb/./src/components/swipeHandler.ts","webpack://tweb/./src/components/telInputField.ts","webpack://tweb/./src/components/toast.ts","webpack://tweb/./src/components/transition.ts","webpack://tweb/./src/lib/richTextProcessor/isUsernameValid.ts","webpack://tweb/./src/components/usernameInputField.ts","webpack://tweb/./src/components/usernamesSection.ts","webpack://tweb/./src/components/visibilityIntersector.ts","webpack://tweb/./src/components/volumeSelector.ts","webpack://tweb/./src/components/wrappers/customEmoji.ts","webpack://tweb/./src/components/wrappers/document.ts","webpack://tweb/./src/components/wrappers/formatUserPhone.ts","webpack://tweb/./src/components/wrappers/getChatMembersString.ts","webpack://tweb/./src/components/wrappers/getPeerTitle.ts","webpack://tweb/./src/components/wrappers/getUserStatusString.ts","webpack://tweb/./src/components/wrappers/mediaSpoiler.ts","webpack://tweb/./src/components/wrappers/messageActionTextNew.ts","webpack://tweb/./src/components/topicAvatar.ts","webpack://tweb/./src/components/wrappers/joinVoiceChatAnchor.ts","webpack://tweb/./src/components/wrappers/messageActionTextNewUnsafe.ts","webpack://tweb/./src/components/wrappers/messageForReply.ts","webpack://tweb/./src/components/wrappers/peerTitle.ts","webpack://tweb/./src/components/wrappers/photo.ts","webpack://tweb/./src/components/wrappers/senderToPeer.ts","webpack://tweb/./src/components/wrappers/sentTime.ts","webpack://tweb/./src/components/wrappers/sticker.ts","webpack://tweb/./src/helpers/bytes/getPathFromBytes.ts","webpack://tweb/./src/helpers/computeLockColor.ts","webpack://tweb/./src/components/wrappers/stickerAnimation.ts","webpack://tweb/./src/components/wrappers/stickerEmoji.ts","webpack://tweb/./src/components/wrappers/stickerSetThumb.ts","webpack://tweb/./src/components/wrappers/stickerToRow.ts","webpack://tweb/./src/components/wrappers/topicNameButton.ts","webpack://tweb/./src/components/wrappers/video.ts","webpack://tweb/./src/components/wrappers/webPageDescription.ts","webpack://tweb/./src/components/wrappers/webPageTitle.ts","webpack://tweb/./src/config/currencies.ts","webpack://tweb/./src/config/emoji.ts","webpack://tweb/./src/config/font.ts","webpack://tweb/./src/environment/imageBitmapSupport.ts","webpack://tweb/./src/helpers/animation.ts","webpack://tweb/./src/helpers/array/filterAsync.ts","webpack://tweb/./src/helpers/array/findAndSpliceAll.ts","webpack://tweb/./src/helpers/audioAssetPlayer.ts","webpack://tweb/./src/helpers/blob/readBlobAsDataURL.ts","webpack://tweb/./src/helpers/heavyQueue.ts","webpack://tweb/./src/helpers/blur.ts","webpack://tweb/./src/helpers/bytes/getPreviewURLFromBytes.ts","webpack://tweb/./src/helpers/bytes/bytesToDataURL.ts","webpack://tweb/./src/helpers/calcImageInBox.ts","webpack://tweb/./src/helpers/canvas/getTextWidth.ts","webpack://tweb/./src/helpers/canvas/scaleMediaElement.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/clipboard.ts","webpack://tweb/./src/helpers/contextMenuController.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/helpers/dom/anchorCopy.ts","webpack://tweb/./src/helpers/dom/attachContextMenuListener.ts","webpack://tweb/./src/helpers/dom/attachGrabListeners.ts","webpack://tweb/./src/helpers/dom/cancelSelection.ts","webpack://tweb/./src/helpers/dom/clickEvent.ts","webpack://tweb/./src/helpers/dom/controlsHover.ts","webpack://tweb/./src/helpers/dom/createContextMenu.ts","webpack://tweb/./src/helpers/dom/createStickersContextMenu.ts","webpack://tweb/./src/helpers/dom/createVideo.ts","webpack://tweb/./src/helpers/dom/customProperties.ts","webpack://tweb/./src/helpers/dom/dispatchEvent.ts","webpack://tweb/./src/helpers/dom/documentFragmentToHTML.ts","webpack://tweb/./src/helpers/dom/findUpAsChild.ts","webpack://tweb/./src/helpers/dom/findUpAttribute.ts","webpack://tweb/./src/helpers/dom/findUpTag.ts","webpack://tweb/./src/helpers/dom/fullScreen.ts","webpack://tweb/./src/helpers/dom/getCaretPosNew.ts","webpack://tweb/./src/helpers/dom/getRichElementValue.ts","webpack://tweb/./src/helpers/dom/getRichValueWithCaret.ts","webpack://tweb/./src/helpers/dom/getViewportSlice.ts","webpack://tweb/./src/helpers/dom/getVisibleRect.ts","webpack://tweb/./src/helpers/dom/handleHorizontalSwipe.ts","webpack://tweb/./src/helpers/dom/handleTabSwipe.ts","webpack://tweb/./src/helpers/dom/htmlToDocumentFragment.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/helpers/dom/isInDOM.ts","webpack://tweb/./src/helpers/dom/isInputEmpty.ts","webpack://tweb/./src/helpers/dom/isSendShortcutPressed.ts","webpack://tweb/./src/helpers/dom/isSwipingBackSafari.ts","webpack://tweb/./src/helpers/dom/placeCaretAtEnd.ts","webpack://tweb/./src/helpers/dom/positionElementByIndex.ts","webpack://tweb/./src/helpers/dom/renderImageFromUrl.ts","webpack://tweb/./src/helpers/dom/renderMediaWithFadeIn.ts","webpack://tweb/./src/helpers/dom/replaceContent.ts","webpack://tweb/./src/helpers/dom/compareNodes.ts","webpack://tweb/./src/helpers/dom/richInputHandler.ts","webpack://tweb/./src/helpers/dom/setInnerHTML.ts","webpack://tweb/./src/helpers/dom/sortable.ts","webpack://tweb/./src/helpers/dom/toggleDisability.ts","webpack://tweb/./src/helpers/dom/whichChild.ts","webpack://tweb/./src/helpers/dropdownHover.ts","webpack://tweb/./src/helpers/fastSmoothScroll.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/helpers/filterChatPhotosMessages.ts","webpack://tweb/./src/helpers/formatBytes.ts","webpack://tweb/./src/helpers/formatCallDuration.ts","webpack://tweb/./src/helpers/formatDuration.ts","webpack://tweb/./src/helpers/formatPhoneNumber.ts","webpack://tweb/./src/helpers/framesCache.ts","webpack://tweb/./src/helpers/generatePathData.ts","webpack://tweb/./src/helpers/getImageFromStrippedThumb.ts","webpack://tweb/./src/helpers/getPreviewURLFromThumb.ts","webpack://tweb/./src/helpers/getStrippedThumbIfNeeded.ts","webpack://tweb/./src/helpers/listLoader.ts","webpack://tweb/./src/helpers/listenerSetter.ts","webpack://tweb/./src/helpers/mediaSize.ts","webpack://tweb/./src/helpers/mediaSizes.ts","webpack://tweb/./src/helpers/middlewarePromise.ts","webpack://tweb/./src/helpers/number/clamp.ts","webpack://tweb/./src/helpers/number/formatNumber.ts","webpack://tweb/./src/helpers/number/numberThousandSplitter.ts","webpack://tweb/./src/helpers/onMediaLoad.ts","webpack://tweb/./src/helpers/overlayClickHandler.ts","webpack://tweb/./src/helpers/paymentsWrapCurrencyAmount.ts","webpack://tweb/./src/helpers/positionMenu.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/helpers/saveLottiePreview.ts","webpack://tweb/./src/helpers/schedulers/throttleWithRaf.ts","webpack://tweb/./src/helpers/schedulers/throttleWith.ts","webpack://tweb/./src/helpers/scrollableLoader.ts","webpack://tweb/./src/helpers/searchListLoader.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/incrementMessageId.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/helpers/setAttachmentSize.ts","webpack://tweb/./src/helpers/sortedList.ts","webpack://tweb/./src/helpers/string/bom.ts","webpack://tweb/./src/helpers/string/encodeEntities.ts","webpack://tweb/./src/helpers/string/escapeRegExp.ts","webpack://tweb/./src/helpers/string/limitSymbols.ts","webpack://tweb/./src/helpers/string/toHHMMSS.ts","webpack://tweb/./src/helpers/textToSvgURL.ts","webpack://tweb/./src/helpers/windowSize.ts","webpack://tweb/./src/hooks/useHeavyAnimationCheck.ts","webpack://tweb/./src/components/dialogsContextMenu.ts","webpack://tweb/./src/components/connectionStatus.ts","webpack://tweb/./src/components/sendingStatus.ts","webpack://tweb/./src/helpers/easing/easeInOutSine.ts","webpack://tweb/./src/helpers/canvas/roundRect.ts","webpack://tweb/./src/components/groupCallActiveIcon.ts","webpack://tweb/./src/helpers/canvas/shimmer.ts","webpack://tweb/./src/helpers/dialogsPlaceholder.ts","webpack://tweb/./src/helpers/canvas/drawCircle.ts","webpack://tweb/./src/helpers/dom/shake.ts","webpack://tweb/./src/lib/appManagers/appDialogsManager.ts","webpack://tweb/./src/helpers/number/getUnsafeRandomInt.ts","webpack://tweb/./src/lib/appManagers/appDownloadManager.ts","webpack://tweb/./src/helpers/dom/createDownloadAnchor.ts","webpack://tweb/./src/components/chat/bubbleGroups.ts","webpack://tweb/./src/helpers/array/partition.ts","webpack://tweb/./src/components/popups/datePicker.ts","webpack://tweb/./src/components/divAndCaption.ts","webpack://tweb/./src/components/chat/replyContainer.ts","webpack://tweb/./src/components/wrappers/reply.ts","webpack://tweb/./src/components/stackedAvatars.ts","webpack://tweb/./src/components/chat/replies.ts","webpack://tweb/./src/components/chat/messageRender.ts","webpack://tweb/./src/helpers/dom/getElementByPoint.ts","webpack://tweb/./src/helpers/dom/reflowScrollableElement.ts","webpack://tweb/./src/lib/mtproto/constants.ts","webpack://tweb/./src/lib/appManagers/internalLink.ts","webpack://tweb/./src/components/popups/joinChatInvite.ts","webpack://tweb/./src/components/chat/reaction.ts","webpack://tweb/./src/components/chat/reactions.ts","webpack://tweb/./src/helpers/scrollSaver.ts","webpack://tweb/./src/helpers/dom/superIntersectionObserver.ts","webpack://tweb/./src/lib/appManagers/utils/messages/isMentionUnread.ts","webpack://tweb/./src/helpers/array/accumulate.ts","webpack://tweb/./src/helpers/cacheCallback.ts","webpack://tweb/./src/helpers/string/replaceNonNumber.ts","webpack://tweb/./src/helpers/cards/cardBrands.ts","webpack://tweb/./src/helpers/array/createArray.ts","webpack://tweb/./src/helpers/string/buggedNumbers.ts","webpack://tweb/./src/helpers/cards/patternCharacters.ts","webpack://tweb/./src/helpers/cards/cardFormattingPatterns.ts","webpack://tweb/./src/helpers/cards/formatValueByPattern.ts","webpack://tweb/./src/helpers/cards/validateCard.ts","webpack://tweb/./src/helpers/string/nbsp.ts","webpack://tweb/./src/components/telegramWebView.ts","webpack://tweb/./src/components/popups/paymentVerification.ts","webpack://tweb/./src/components/popups/paymentCard.ts","webpack://tweb/./src/helpers/cards/formatInputValueByPattern.ts","webpack://tweb/./src/components/popups/paymentCardConfirmation.ts","webpack://tweb/./src/components/popups/paymentShipping.ts","webpack://tweb/./src/components/popups/paymentShippingMethods.ts","webpack://tweb/./src/components/popups/payment.ts","webpack://tweb/./src/components/groupedLayout.ts","webpack://tweb/./src/components/prepareAlbum.ts","webpack://tweb/./src/components/wrappers/album.ts","webpack://tweb/./src/components/sidebarRight/tabs/pollResults.ts","webpack://tweb/./src/components/poll.ts","webpack://tweb/./src/helpers/string/isRTL.ts","webpack://tweb/./src/components/chat/bubbles.ts","webpack://tweb/./src/helpers/dom/copyFromElement.ts","webpack://tweb/./src/components/wrappers/groupedDocuments.ts","webpack://tweb/./src/components/wrappers/poll.ts","webpack://tweb/./src/components/popups/unpinMessage.ts","webpack://tweb/./src/helpers/dom/isSelectionEmpty.ts","webpack://tweb/./src/helpers/preloadAnimatedEmojiSticker.ts","webpack://tweb/./src/components/popups/reportMessagesConfirm.ts","webpack://tweb/./src/components/popups/reportMessages.ts","webpack://tweb/./src/components/popups/sponsored.ts","webpack://tweb/./src/components/popups/reactedList.ts","webpack://tweb/./src/components/chat/reactionsMenu.ts","webpack://tweb/./src/components/chat/contextMenu.ts","webpack://tweb/./src/components/chat/sendContextMenu.ts","webpack://tweb/./src/components/popups/createPoll.ts","webpack://tweb/./src/helpers/createPoster.ts","webpack://tweb/./src/helpers/getGifDuration.ts","webpack://tweb/./src/components/popups/newMedia.ts","webpack://tweb/./src/helpers/dom/attachListNavigation.ts","webpack://tweb/./src/components/chat/autocompleteHelper.ts","webpack://tweb/./src/components/chat/stickersHelper.ts","webpack://tweb/./src/components/popups/schedule.ts","webpack://tweb/./src/components/chat/emojiHelper.ts","webpack://tweb/./src/components/chat/autocompletePeerHelper.ts","webpack://tweb/./src/components/chat/commandsHelper.ts","webpack://tweb/./src/components/chat/autocompleteHelperController.ts","webpack://tweb/./src/components/chat/mentionsHelper.ts","webpack://tweb/./src/components/chat/replyKeyboard.ts","webpack://tweb/./src/components/chat/inlineHelper.ts","webpack://tweb/./src/components/chat/botCommands.ts","webpack://tweb/./src/helpers/modifyAckedResult.ts","webpack://tweb/./src/components/chat/sendAs.ts","webpack://tweb/./src/components/inputFieldAnimated.ts","webpack://tweb/./src/helpers/dom/hasMarkupInSelection.ts","webpack://tweb/./src/components/chat/input.ts","webpack://tweb/./src/components/wrappers/draft.ts","webpack://tweb/./src/components/chat/pinnedContainer.ts","webpack://tweb/./src/components/chat/pinnedMessageBorder.ts","webpack://tweb/./src/components/chat/audio.ts","webpack://tweb/./src/components/chat/pinnedMessage.ts","webpack://tweb/./src/helpers/dom/handleScrollSideEvent.ts","webpack://tweb/./src/components/chat/topbar.ts","webpack://tweb/./src/components/sidebarRight/tabs/search.ts","webpack://tweb/./src/components/chat/search.ts","webpack://tweb/./src/components/chat/patternRenderer.ts","webpack://tweb/./src/components/chat/chat.ts","webpack://tweb/./src/helpers/autoDownload.ts","webpack://tweb/./src/components/chat/markupTooltip.ts","webpack://tweb/./src/components/chat/dragAndDrop.ts","webpack://tweb/./src/helpers/dom/disableTransition.ts","webpack://tweb/./src/components/lineBlobDrawable.ts","webpack://tweb/./src/components/topbarWeave.ts","webpack://tweb/./src/lib/rlottie/rlottieIcon.ts","webpack://tweb/./src/components/superIcon.ts","webpack://tweb/./src/components/groupCall/microphoneIcon.ts","webpack://tweb/./src/components/groupCall/participantMutedIcon.ts","webpack://tweb/./src/components/groupCall/index.ts","webpack://tweb/./src/components/groupCall/participantStatus.ts","webpack://tweb/./src/components/groupCall/participantsList.ts","webpack://tweb/./src/components/call/videoCanvasBlur.ts","webpack://tweb/./src/components/groupCall/participantVideo.ts","webpack://tweb/./src/components/groupCall/participantVideos.ts","webpack://tweb/./src/components/groupCall/participants.ts","webpack://tweb/./src/components/groupCall/description.ts","webpack://tweb/./src/components/groupCall/title.ts","webpack://tweb/./src/components/call/button.ts","webpack://tweb/./src/components/movableElement.ts","webpack://tweb/./src/helpers/movablePanel.ts","webpack://tweb/./src/helpers/toggleClassName.ts","webpack://tweb/./src/components/call/description.ts","webpack://tweb/./src/components/groupCall/microphoneIconMini.ts","webpack://tweb/./src/components/call/index.ts","webpack://tweb/./src/components/topbarCall.ts","webpack://tweb/./src/lib/appManagers/uiNotificationsManager.ts","webpack://tweb/./src/helpers/files/getFilesFromEvent.ts","webpack://tweb/./src/helpers/addAnchorListener.ts","webpack://tweb/./src/lib/appManagers/appImManager.ts","webpack://tweb/./src/lib/appManagers/utils/messages/canSaveMessageMedia.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMediaFromMessage.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMessageSenderPeerIdOrName.ts","webpack://tweb/./src/lib/appManagers/utils/messages/isMessageRestricted.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerColorById.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerEditableUsername.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerId.ts","webpack://tweb/./src/lib/appManagers/utils/photos/choosePhotoSize.ts","webpack://tweb/./src/lib/calls/callConnectionInstanceBase.ts","webpack://tweb/./src/lib/calls/helpers/createPeerConnection.ts","webpack://tweb/./src/lib/calls/helpers/createDataChannel.ts","webpack://tweb/./src/lib/calls/helpers/parseSignalingData.ts","webpack://tweb/./src/lib/calls/callConnectionInstance.ts","webpack://tweb/./src/lib/crypto/subtle.ts","webpack://tweb/./src/lib/calls/p2P/p2PEncryptor.ts","webpack://tweb/./src/lib/crypto/utils/sha256.ts","webpack://tweb/./src/lib/calls/p2P/chromeP2PSdpBuilder.ts","webpack://tweb/./src/lib/calls/p2P/p2PSdpBuilder.js","webpack://tweb/./src/lib/calls/p2P/firefoxP2PSdpBuilder.js","webpack://tweb/./src/lib/calls/p2P/safariP2PSdpBuilder.js","webpack://tweb/./src/lib/calls/callInstance.ts","webpack://tweb/./src/lib/calls/p2P/getCallProtocol.ts","webpack://tweb/./src/lib/calls/p2P/getRtcConfiguration.ts","webpack://tweb/./src/lib/calls/helpers/getStreamCached.ts","webpack://tweb/./src/lib/calls/callInstanceBase.ts","webpack://tweb/./src/lib/calls/callState.ts","webpack://tweb/./src/components/call/getAudioAsset.ts","webpack://tweb/./src/lib/calls/callsController.ts","webpack://tweb/./src/lib/calls/constants.ts","webpack://tweb/./src/lib/calls/groupCallConnectionInstance.ts","webpack://tweb/./src/lib/calls/helpers/processMediaSection.ts","webpack://tweb/./src/lib/calls/helpers/filterServerCodecs.ts","webpack://tweb/./src/lib/calls/helpers/fixLocalOffer.ts","webpack://tweb/./src/lib/calls/groupCallInstance.ts","webpack://tweb/./src/lib/calls/groupCallState.ts","webpack://tweb/./src/components/groupCall/getAudioAsset.ts","webpack://tweb/./src/lib/calls/groupCallsController.ts","webpack://tweb/./src/lib/calls/helpers/createMainStreamManager.ts","webpack://tweb/./src/lib/calls/helpers/getAudioConstraints.ts","webpack://tweb/./src/environment/constraintSupport.ts","webpack://tweb/./src/lib/calls/helpers/getScreenConstraints.ts","webpack://tweb/./src/lib/calls/helpers/getScreenStream.ts","webpack://tweb/./src/lib/calls/helpers/getStream.ts","webpack://tweb/./src/lib/calls/helpers/getVideoConstraints.ts","webpack://tweb/./src/lib/calls/helpers/parseMediaSectionInfo.ts","webpack://tweb/./src/lib/calls/helpers/parseSourceGroups.ts","webpack://tweb/./src/lib/calls/helpers/stopTrack.ts","webpack://tweb/./src/lib/calls/localConferenceDescription.ts","webpack://tweb/./src/lib/calls/sdp/index.ts","webpack://tweb/./src/helpers/string/splitStringByLimitWithRest.ts","webpack://tweb/./src/helpers/uniqueNumberGenerator.ts","webpack://tweb/./src/lib/calls/sdp/attributeSplitted.ts","webpack://tweb/./src/lib/calls/sdp/mediaLineParts.ts","webpack://tweb/./src/lib/calls/sdp/line.ts","webpack://tweb/./src/lib/calls/sdp/attributeInner.ts","webpack://tweb/./src/lib/calls/sdp/attributes.ts","webpack://tweb/./src/lib/calls/sdp/mediaSection.ts","webpack://tweb/./src/lib/calls/sdp/sessionSection.ts","webpack://tweb/./src/lib/calls/sdp/utils.ts","webpack://tweb/./src/lib/calls/sdpBuilder.ts","webpack://tweb/./src/lib/calls/streamManager.ts","webpack://tweb/./src/lib/calls/stringFromLineBuilder.ts","webpack://tweb/./src/lib/calls/utils.ts","webpack://tweb/./src/lib/richTextProcessor/getAbbreviation.ts","webpack://tweb/./src/lib/richTextProcessor/getEmojiEntityFromEmoji.ts","webpack://tweb/./src/lib/richTextProcessor/matchEmail.ts","webpack://tweb/./src/lib/richTextProcessor/setBlankToAnchor.ts","webpack://tweb/./src/lib/richTextProcessor/wrapAbbreviation.ts","webpack://tweb/./src/lib/richTextProcessor/wrapDraftText.ts","webpack://tweb/./src/lib/richTextProcessor/wrapEmojiText.ts","webpack://tweb/./src/environment/emojiVersionsSupport.ts","webpack://tweb/./src/lib/richTextProcessor/wrapRichText.ts","webpack://tweb/./src/helpers/buildURLHash.ts","webpack://tweb/./src/lib/richTextProcessor/wrapTelegramUrlToAnchor.ts","webpack://tweb/./src/lib/rlottie/queryableWorker.ts","webpack://tweb/./src/environment/webAssemblySupport.ts","webpack://tweb/./src/lib/rlottie/lottieLoader.ts","webpack://tweb/./src/lib/rlottie/rlottiePlayer.ts","webpack://tweb/./src/pages/pagesManager.ts","webpack://tweb/./src/pages/page.ts","webpack://tweb/./src/vendor/emoji/index.ts","webpack://tweb/./public/recorder.min.js","webpack://tweb/./src/vendor/bezier-easing/index.js"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {CustomEmojiElement, CustomEmojiRendererElement} from '../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../lib/rootScope';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport forEachReverse from '../helpers/array/forEachReverse';\nimport idleController from '../helpers/idleController';\nimport appMediaPlaybackController from './appMediaPlaybackController';\nimport {fastRaf} from '../helpers/schedulers';\n\nexport type AnimationItemGroup = '' | 'none' | 'chat' | 'lock' |\n 'STICKERS-POPUP' | 'emoticons-dropdown' | 'STICKERS-SEARCH' | 'GIFS-SEARCH' |\n `CHAT-MENU-REACTIONS-${number}` | 'INLINE-HELPER' | 'GENERAL-SETTINGS' | 'STICKER-VIEWER' | 'EMOJI' |\n 'EMOJI-STATUS' | `chat-${number}`;\nexport interface AnimationItem {\n el: HTMLElement,\n group: AnimationItemGroup,\n animation: AnimationItemWrapper,\n controlled?: boolean\n};\n\nexport interface AnimationItemWrapper {\n remove: () => void;\n paused: boolean;\n pause: () => any;\n play: () => any;\n autoplay: boolean;\n // onVisibilityChange?: (visible: boolean) => boolean;\n};\n\nexport class AnimationIntersector {\n private observer: IntersectionObserver;\n private visible: Set;\n\n private overrideIdleGroups: Set;\n private byGroups: {[group in AnimationItemGroup]?: AnimationItem[]};\n private byPlayer: Map;\n private lockedGroups: {[group in AnimationItemGroup]?: true};\n private onlyOnePlayableGroup: AnimationItemGroup;\n\n private intersectionLockedGroups: {[group in AnimationItemGroup]?: true};\n private videosLocked: boolean;\n\n constructor() {\n this.observer = new IntersectionObserver((entries) => {\n // if(rootScope.idle.isIDLE) return;\n\n for(const entry of entries) {\n const target = entry.target;\n\n for(const group in this.byGroups) {\n if(this.intersectionLockedGroups[group as AnimationItemGroup]) {\n continue;\n }\n\n const animation = this.byGroups[group as AnimationItemGroup].find((p) => p.el === target);\n if(!animation) {\n continue;\n }\n\n if(entry.isIntersecting) {\n this.visible.add(animation);\n this.checkAnimation(animation, false);\n\n /* if(animation instanceof HTMLVideoElement && animation.dataset.src) {\n animation.src = animation.dataset.src;\n animation.load();\n } */\n } else {\n this.visible.delete(animation);\n this.checkAnimation(animation, true);\n\n const _animation = animation.animation;\n if(_animation instanceof RLottiePlayer/* && animation.cachingDelta === 2 */) {\n // console.warn('will clear cache', player);\n _animation.clearCache();\n }/* else if(animation instanceof HTMLVideoElement && animation.src) {\n animation.dataset.src = animation.src;\n animation.src = '';\n animation.load();\n } */\n }\n\n break;\n }\n }\n });\n\n this.visible = new Set();\n\n this.overrideIdleGroups = new Set();\n this.byGroups = {};\n this.byPlayer = new Map();\n this.lockedGroups = {};\n this.onlyOnePlayableGroup = '';\n\n this.intersectionLockedGroups = {};\n this.videosLocked = false;\n\n appMediaPlaybackController.addEventListener('play', ({doc}) => {\n if(doc.type === 'round') {\n this.videosLocked = true;\n this.checkAnimations2();\n }\n });\n\n appMediaPlaybackController.addEventListener('pause', () => {\n if(this.videosLocked) {\n this.videosLocked = false;\n this.checkAnimations2();\n }\n });\n\n idleController.addEventListener('change', (idle) => {\n this.checkAnimations2(idle);\n });\n }\n\n public setOverrideIdleGroup(group: string, override: boolean) {\n if(override) this.overrideIdleGroups.add(group);\n else this.overrideIdleGroups.delete(group);\n }\n\n public getAnimations(element: HTMLElement) {\n const found: AnimationItem[] = [];\n for(const group in this.byGroups) {\n for(const player of this.byGroups[group as AnimationItemGroup]) {\n if(player.el === element) {\n found.push(player);\n }\n }\n }\n\n return found;\n }\n\n public removeAnimation(player: AnimationItem) {\n const {el, animation} = player;\n // if(!(animation instanceof CustomEmojiElement)) {\n animation.remove();\n // }\n\n if(animation instanceof HTMLVideoElement && IS_SAFARI) {\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\n animation.src = '';\n animation.load();\n }, 1e3);\n }\n\n const group = this.byGroups[player.group];\n if(group) {\n indexOfAndSplice(group, player);\n if(!group.length) {\n delete this.byGroups[player.group];\n }\n }\n\n this.observer.unobserve(el);\n this.visible.delete(player);\n this.byPlayer.delete(animation);\n }\n\n public removeAnimationByPlayer(player: AnimationItemWrapper) {\n const item = this.byPlayer.get(player);\n if(item) {\n this.removeAnimation(item);\n }\n }\n\n public addAnimation(\n animation: AnimationItem['animation'],\n group: AnimationItemGroup = '',\n observeElement?: HTMLElement,\n controlled?: boolean\n ) {\n if(group === 'none' || this.byPlayer.has(animation)) {\n return;\n }\n\n if(!observeElement) {\n if(animation instanceof RLottiePlayer) {\n observeElement = animation.el[0];\n } else if(animation instanceof CustomEmojiRendererElement) {\n observeElement = animation.canvas;\n } else if(animation instanceof CustomEmojiElement) {\n observeElement = animation.placeholder ?? animation;\n } else if(animation instanceof HTMLElement) {\n observeElement = animation;\n }\n }\n\n const item: AnimationItem = {\n el: observeElement,\n animation: animation,\n group,\n controlled\n };\n\n if(animation instanceof RLottiePlayer) {\n if(!rootScope.settings.stickers.loop && animation.loop) {\n animation.loop = rootScope.settings.stickers.loop;\n }\n }\n\n (this.byGroups[group as AnimationItemGroup] ??= []).push(item);\n this.observer.observe(item.el);\n this.byPlayer.set(animation, item);\n }\n\n public checkAnimations(\n blurred?: boolean,\n group?: AnimationItemGroup,\n destroy?: boolean,\n imitateIntersection?: boolean\n ) {\n // if(rootScope.idle.isIDLE) return;\n\n if(group !== undefined && !this.byGroups[group]) {\n // console.warn('no animation group:', group);\n return;\n }\n\n const groups = group !== undefined /* && false */ ? [group] : Object.keys(this.byGroups) as AnimationItemGroup[];\n\n for(const group of groups) {\n if(imitateIntersection && this.intersectionLockedGroups[group]) {\n continue;\n }\n\n const animations = this.byGroups[group];\n\n forEachReverse(animations, (animation) => {\n this.checkAnimation(animation, blurred, destroy);\n });\n }\n }\n\n public checkAnimations2(blurred?: boolean) {\n this.checkAnimations(blurred, undefined, undefined, true);\n }\n\n public checkAnimation(player: AnimationItem, blurred?: boolean, destroy?: boolean) {\n const {el, animation, group} = player;\n // return;\n if(destroy || (!this.lockedGroups[group] && !isInDOM(el))) {\n if(!player.controlled || destroy) {\n this.removeAnimation(player);\n }\n\n return;\n }\n\n if(blurred ||\n (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) ||\n (animation instanceof HTMLVideoElement && this.videosLocked)\n ) {\n if(!animation.paused) {\n // console.warn('pause animation:', animation);\n animation.pause();\n }\n } else if(animation.paused &&\n this.visible.has(player) &&\n animation.autoplay &&\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group) &&\n (!idleController.isIdle || this.overrideIdleGroups.has(player.group))\n ) {\n // console.warn('play animation:', animation);\n animation.play();\n }\n }\n\n public getOnlyOnePlayableGroup() {\n return this.onlyOnePlayableGroup;\n }\n\n public setOnlyOnePlayableGroup(group: AnimationItemGroup = '') {\n this.onlyOnePlayableGroup = group;\n }\n\n public lockGroup(group: AnimationItemGroup) {\n this.lockedGroups[group] = true;\n }\n\n public unlockGroup(group: AnimationItemGroup) {\n delete this.lockedGroups[group];\n this.checkAnimations(undefined, group);\n }\n\n public refreshGroup(group: AnimationItemGroup) {\n const animations = this.byGroups[group];\n if(!animations?.length) {\n return;\n }\n\n animations.forEach((animation) => {\n this.observer.unobserve(animation.el);\n });\n\n fastRaf(() => {\n animations.forEach((animation) => {\n this.observer.observe(animation.el);\n });\n });\n }\n\n public lockIntersectionGroup(group: AnimationItemGroup) {\n this.intersectionLockedGroups[group] = true;\n }\n\n public unlockIntersectionGroup(group: AnimationItemGroup) {\n delete this.intersectionLockedGroups[group];\n this.refreshGroup(group);\n }\n\n public toggleIntersectionGroup(group: AnimationItemGroup, lock: boolean) {\n if(lock) this.lockIntersectionGroup(group);\n else this.unlockIntersectionGroup(group);\n }\n}\n\nconst animationIntersector = new AnimationIntersector();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.animationIntersector = animationIntersector);\nexport default animationIntersector;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {IS_APPLE, IS_SAFARI} from '../environment/userAgent';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport simulateEvent from '../helpers/dom/dispatchEvent';\nimport type {SearchSuperContext} from './appSearchSuper.';\nimport {Document, DocumentAttribute, Message, PhotoSize} from '../layer';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport I18n from '../lib/langPack';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport copy from '../helpers/object/copy';\nimport deepEqual from '../helpers/object/deepEqual';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport getPeerTitle from './wrappers/getPeerTitle';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport onMediaLoad from '../helpers/onMediaLoad';\nimport EventListenerBase from '../helpers/eventListenerBase';\n\n// TODO: Safari: проверить стрим, включить его и сразу попробовать включить видео или другую песню\n// TODO: Safari: попробовать замаскировать подгрузку последнего чанка\n// TODO: Safari: пофиксить момент, когда заканчивается песня и пытаешься включить её заново - прогресс сразу в конце\n\nexport type MediaItem = {mid: number, peerId: PeerId};\n\ntype HTMLMediaElement = HTMLAudioElement | HTMLVideoElement;\n\nconst SHOULD_USE_SAFARI_FIX = (() => {\n try {\n return IS_SAFARI && +navigator.userAgent.match(/ Version\\/(\\d+)/)[1] < 14;\n } catch(err) {\n return false;\n }\n})();\n\nconst SEEK_OFFSET = 10;\n\nexport type MediaSearchContext = SearchSuperContext & Partial<{\n isScheduled: boolean,\n useSearch: boolean\n}>;\n\ntype MediaDetails = {\n peerId: PeerId,\n mid: number,\n docId: DocId,\n doc: MyDocument,\n message: Message.message,\n clean?: boolean,\n isScheduled?: boolean,\n isSingle?: boolean\n};\n\nexport type PlaybackMediaType = 'voice' | 'video' | 'audio';\n\nexport class AppMediaPlaybackController extends EventListenerBase<{\n play: (details: ReturnType) => void,\n pause: () => void,\n playbackParams: (params: ReturnType) => void,\n stop: () => void,\n}> {\n private container: HTMLElement;\n private media: Map> = new Map();\n private scheduled: AppMediaPlaybackController['media'] = new Map();\n private mediaDetails: Map = new Map();\n private playingMedia: HTMLMediaElement;\n private playingMediaType: PlaybackMediaType;\n\n private waitingMediaForLoad: Map>> = new Map();\n private waitingScheduledMediaForLoad: AppMediaPlaybackController['waitingMediaForLoad'] = new Map();\n private waitingDocumentsForLoad: {[docId: string]: Set} = {};\n\n public willBePlayedMedia: HTMLMediaElement;\n private searchContext: MediaSearchContext;\n\n private listLoader: SearchListLoader;\n\n public volume: number;\n public muted: boolean;\n public playbackRate: number;\n public loop: boolean;\n public round: boolean;\n private _volume: number;\n private _muted: boolean;\n private _playbackRate: number;\n private _loop: boolean;\n private _round: boolean;\n private lockedSwitchers: boolean;\n private playbackRates: Record = {\n voice: 1,\n video: 1,\n audio: 1\n };\n\n private pip: HTMLVideoElement;\n private managers: AppManagers;\n private skipMediaPlayEvent: boolean;\n\n construct(managers: AppManagers) {\n this.managers = managers;\n this.container = document.createElement('div');\n // this.container.style.cssText = 'position: absolute; top: -10000px; left: -10000px;';\n this.container.style.cssText = 'display: none;';\n document.body.append(this.container);\n\n if(navigator.mediaSession) {\n const actions: {[action in MediaSessionAction]?: MediaSessionActionHandler} = {\n play: this.browserPlay,\n pause: this.browserPause,\n stop: this.browserStop,\n seekbackward: this.browserSeekBackward,\n seekforward: this.browserSeekForward,\n seekto: this.browserSeekTo,\n previoustrack: this.browserPrevious,\n nexttrack: this.browserNext\n };\n\n for(const action in actions) {\n try {\n navigator.mediaSession.setActionHandler(action as MediaSessionAction, actions[action as MediaSessionAction]);\n } catch(err) {\n console.warn('MediaSession action is not supported:', action);\n }\n }\n }\n\n rootScope.addEventListener('document_downloaded', (docId) => {\n const set = this.waitingDocumentsForLoad[docId];\n if(set) {\n for(const media of set) {\n this.onMediaDocumentLoad(media);\n }\n }\n });\n\n rootScope.addEventListener('media_play', () => {\n if(this.skipMediaPlayEvent) {\n this.skipMediaPlayEvent = false;\n return;\n }\n\n if(!this.pause() && this.pip) {\n this.pip.pause();\n }\n });\n\n const properties: {[key: PropertyKey]: PropertyDescriptor} = {};\n const keys = [\n 'volume' as const,\n 'muted' as const,\n 'playbackRate' as const,\n 'loop' as const,\n 'round' as const\n ];\n keys.forEach((key) => {\n const _key = ('_' + key) as `_${typeof key}`;\n properties[key] = {\n get: () => this[_key],\n set: (value: number | boolean) => {\n if(this[_key] === value) {\n return;\n }\n\n // @ts-ignore\n this[_key] = value;\n if(this.playingMedia && (key !== 'loop' || this.playingMediaType === 'audio') && key !== 'round') {\n // @ts-ignore\n this.playingMedia[key] = value;\n }\n\n if(key === 'playbackRate' && this.playingMediaType !== undefined) {\n this.playbackRates[this.playingMediaType] = value as number;\n }\n\n this.dispatchPlaybackParams();\n }\n };\n });\n Object.defineProperties(this, properties);\n }\n\n private dispatchPlaybackParams() {\n this.dispatchEvent('playbackParams', this.getPlaybackParams());\n }\n\n public getPlaybackParams() {\n const {volume, muted, playbackRate, playbackRates, loop, round} = this;\n return {\n volume,\n muted,\n playbackRate,\n playbackRates,\n loop,\n round\n };\n }\n\n public setPlaybackParams(params: ReturnType) {\n this.playbackRates = params.playbackRates;\n this._volume = params.volume;\n this._muted = params.muted;\n this._playbackRate = params.playbackRate;\n this._loop = params.loop;\n this._round = params.round;\n }\n\n public seekBackward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\n if(media) {\n media.currentTime = Math.max(0, media.currentTime - (details.seekOffset || SEEK_OFFSET));\n }\n };\n\n public seekForward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\n if(media) {\n media.currentTime = Math.min(media.duration, media.currentTime + (details.seekOffset || SEEK_OFFSET));\n }\n };\n\n public seekTo = (details: MediaSessionActionDetails, media = this.playingMedia) => {\n if(media) {\n media.currentTime = details.seekTime;\n }\n };\n\n public addMedia(message: Message.message, autoload: boolean, clean?: boolean): HTMLMediaElement {\n const {peerId, mid} = message;\n\n const isScheduled = !!message.pFlags.is_scheduled;\n const s = isScheduled ? this.scheduled : this.media;\n let storage = s.get(message.peerId);\n if(!storage) {\n s.set(message.peerId, storage = new Map());\n }\n\n let media = storage.get(mid);\n if(media) {\n return media;\n }\n\n const doc = getMediaFromMessage(message) as Document.document;\n storage.set(mid, media = document.createElement(doc.type === 'round' || doc.type === 'video' ? 'video' : 'audio'));\n // const source = document.createElement('source');\n // source.type = doc.type === 'voice' && !opusDecodeController.isPlaySupported() ? 'audio/wav' : doc.mime_type;\n\n if(doc.type === 'round') {\n media.setAttribute('playsinline', 'true');\n // media.muted = true;\n }\n\n const details: MediaDetails = {\n peerId,\n mid,\n docId: doc.id,\n doc,\n message,\n clean,\n isScheduled: message.pFlags.is_scheduled\n };\n\n this.mediaDetails.set(media, details);\n\n // media.autoplay = true;\n media.volume = 1;\n // media.append(source);\n\n this.container.append(media);\n\n media.addEventListener('play', this.onPlay);\n media.addEventListener('pause', this.onPause);\n media.addEventListener('ended', this.onEnded);\n\n if(doc.type !== 'audio' && message?.pFlags.media_unread && message.fromId !== rootScope.myId) {\n media.addEventListener('timeupdate', () => {\n this.managers.appMessagesManager.readMessages(peerId, [mid]);\n }, {once: true});\n }\n\n /* const onError = (e: Event) => {\n //console.log('appMediaPlaybackController: video onError', e);\n\n if(this.nextMid === mid) {\n this.loadSiblingsMedia(peerId, doc.type as MediaType, mid).then(() => {\n if(this.nextMid && storage[this.nextMid]) {\n storage[this.nextMid].play();\n }\n });\n }\n };\n\n media.addEventListener('error', onError); */\n\n const deferred = deferredPromise();\n if(autoload) {\n deferred.resolve();\n } else {\n const w = message.pFlags.is_scheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\n let waitingStorage = w.get(peerId);\n if(!waitingStorage) {\n w.set(peerId, waitingStorage = new Map());\n }\n\n waitingStorage.set(mid, deferred);\n }\n\n deferred.then(async() => {\n // media.autoplay = true;\n // console.log('will set media url:', media, doc, doc.type, doc.url);\n\n if(doc.supportsStreaming || (await this.managers.thumbsStorage.getCacheContext(doc)).url) {\n this.onMediaDocumentLoad(media);\n } else {\n let set = this.waitingDocumentsForLoad[doc.id];\n if(!set) {\n set = this.waitingDocumentsForLoad[doc.id] = new Set();\n }\n\n set.add(media);\n appDownloadManager.downloadMediaURL({media: doc});\n }\n }/* , onError */);\n\n return media;\n }\n\n public getMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\n const s = (isScheduled ? this.scheduled : this.media).get(peerId);\n return s?.get(mid);\n }\n\n private onMediaDocumentLoad = async(media: HTMLMediaElement) => {\n const details = this.mediaDetails.get(media);\n const doc = await this.managers.appDocsManager.getDoc(details.docId);\n if(doc.type === 'audio' && doc.supportsStreaming && SHOULD_USE_SAFARI_FIX) {\n this.handleSafariStreamable(media);\n }\n\n // setTimeout(() => {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\n media.src = cacheContext.url;\n\n if(this.playingMedia === media) {\n media.playbackRate = this.playbackRate;\n\n if(doc.type === 'audio') {\n media.loop = this.loop;\n }\n }\n // }, doc.supportsStreaming ? 500e3 : 0);\n\n const set = this.waitingDocumentsForLoad[doc.id];\n if(set) {\n set.delete(media);\n\n if(!set.size) {\n delete this.waitingDocumentsForLoad[doc.id];\n }\n }\n };\n\n // safari подгрузит последний чанк и песня включится,\n // при этом этот чанк нельзя руками отдать из SW, потому что браузер тогда теряется\n private handleSafariStreamable(media: HTMLMediaElement) {\n media.addEventListener('play', () => {\n /* if(media.readyState === 4) { // https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest/readyState\n return;\n } */\n\n // media.volume = 0;\n const currentTime = media.currentTime;\n // this.setSafariBuffering(media, true);\n\n media.addEventListener('progress', () => {\n media.currentTime = media.duration - 1;\n\n media.addEventListener('progress', () => {\n media.currentTime = currentTime;\n // media.volume = 1;\n // this.setSafariBuffering(media, false);\n\n if(!media.paused) {\n media.play()/* .catch(() => {}) */;\n }\n }, {once: true});\n }, {once: true});\n }/* , {once: true} */);\n }\n\n public resolveWaitingForLoadMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\n const w = isScheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\n const storage = w.get(peerId);\n if(!storage) {\n return;\n }\n\n const promise = storage.get(mid);\n if(promise) {\n promise.resolve();\n storage.delete(mid);\n\n if(!storage.size) {\n w.delete(peerId);\n }\n }\n }\n\n /**\n * Only for audio\n */\n public isSafariBuffering(media: HTMLMediaElement) {\n // @ts-ignore\n return !!media.safariBuffering;\n }\n\n private setSafariBuffering(media: HTMLMediaElement, value: boolean) {\n // @ts-ignore\n media.safariBuffering = value;\n }\n\n private async setNewMediadata(message: Message.message, playingMedia = this.playingMedia) {\n if(document.pictureInPictureElement) {\n return;\n }\n\n await onMediaLoad(playingMedia, undefined, false); // have to wait for load, otherwise on macOS won't set\n\n const doc = getMediaFromMessage(message) as MyDocument;\n\n const artwork: MediaImage[] = [];\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n let title = '', artist = '';\n\n if(doc.thumbs?.length) {\n const size = doc.thumbs[doc.thumbs.length - 1];\n if(!(size as PhotoSize.photoStrippedSize).bytes) {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc, size.type);\n\n if(cacheContext.url) {\n artwork.push({\n src: cacheContext.url,\n sizes: `${(size as PhotoSize.photoSize).w}x${(size as PhotoSize.photoSize).h}`,\n type: 'image/jpeg'\n });\n } else {\n const download = appDownloadManager.downloadMediaURL({media: doc, thumb: size});\n download.then(() => {\n if(this.playingMedia !== playingMedia || !cacheContext.url) {\n return;\n }\n\n this.setNewMediadata(message);\n });\n }\n }\n } else if(isVoice) {\n const peerId = message.fromId || message.peerId;\n const peerPhoto = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n // const result = this.managers.appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small');\n // if(result.cached) {\n // const url = await result.loadPromise;\n // artwork.push({\n // src: url,\n // sizes: '160x160',\n // type: 'image/jpeg'\n // });\n // } else {\n // result.loadPromise.then((url) => {\n // if(this.playingMedia !== playingMedia || !url) {\n // return;\n // }\n\n // this.setNewMediadata(message);\n // });\n // }\n }\n\n title = await getPeerTitle({peerId, plainText: true, onlyFirstName: false});\n artist = I18n.format(doc.type === 'voice' ? 'AttachAudio' : 'AttachRound', true);\n }\n\n if(!isVoice) {\n const attribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n title = attribute?.title ?? doc.file_name;\n artist = attribute?.performer;\n }\n\n if(!artwork.length) {\n if(IS_APPLE) {\n if(IS_TOUCH_SUPPORTED) {\n artwork.push({\n src: `assets/img/apple-touch-icon-precomposed.png`,\n sizes: '180x180',\n type: 'image/png'\n });\n } else {\n artwork.push({\n src: `assets/img/apple-touch-icon.png`,\n sizes: '180x180',\n type: 'image/png'\n });\n }\n } else {\n [72, 96, 144, 192, 256, 384, 512].forEach((size) => {\n const sizes = `${size}x${size}`;\n artwork.push({\n src: `assets/img/android-chrome-${sizes}.png`,\n sizes,\n type: 'image/png'\n });\n });\n }\n }\n\n const metadata = new MediaMetadata({\n title,\n artist,\n artwork\n });\n\n navigator.mediaSession.metadata = metadata;\n }\n\n public setCurrentMediadata() {\n const {playingMedia} = this;\n if(!playingMedia) return;\n const message = this.getMessageByMedia(playingMedia);\n this.setNewMediadata(message, playingMedia);\n }\n\n private getMessageByMedia(media: HTMLMediaElement): Message.message {\n const details = this.mediaDetails.get(media);\n return details.message;\n // const {peerId, mid} = details;\n // const message = details.isScheduled ?\n // this.managers.appMessagesManager.getScheduledMessageByPeer(peerId, mid) :\n // this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n // return message;\n }\n\n public getPlayingDetails() {\n const {playingMedia} = this;\n if(!playingMedia) {\n return;\n }\n\n const message = this.getMessageByMedia(playingMedia);\n return {\n doc: getMediaFromMessage(message) as MyDocument,\n message,\n media: playingMedia,\n playbackParams: this.getPlaybackParams()\n };\n }\n\n private onPlay = (e?: Event) => {\n const media = e.target as HTMLMediaElement;\n const details = this.mediaDetails.get(media);\n const {peerId, mid} = details;\n\n // console.log('appMediaPlaybackController: video playing', this.currentPeerId, this.playingMedia, media);\n\n const pip = this.pip;\n if(pip) {\n pip.pause();\n }\n\n const message = this.getMessageByMedia(media);\n\n const previousMedia = this.playingMedia;\n if(previousMedia !== media) {\n this.stop();\n this.setMedia(media, message);\n\n const verify = (element: MediaItem) => element.mid === mid && element.peerId === peerId;\n const listLoader = this.listLoader;\n const current = listLoader.getCurrent();\n if(!current || !verify(current)) {\n let jumpLength: number;\n\n for(const withOtherSide of [false, true]) {\n const previous = listLoader.getPrevious(withOtherSide);\n\n let idx = previous.findIndex(verify);\n if(idx !== -1) {\n jumpLength = -(previous.length - idx);\n } else {\n const next = listLoader.getNext(withOtherSide);\n idx = next.findIndex(verify);\n if(idx !== -1) {\n jumpLength = idx + 1;\n }\n }\n\n if(jumpLength !== undefined) {\n break;\n }\n }\n\n if(jumpLength) {\n this.go(jumpLength, false);\n } else {\n this.setTargets({peerId, mid});\n }\n }\n }\n\n // audio_pause не успеет сработать без таймаута\n setTimeout(() => {\n if(this.playingMedia !== media) {\n return;\n }\n\n this.dispatchEvent('play', this.getPlayingDetails());\n this.pauseMediaInOtherTabs();\n }, 0);\n };\n\n private onPause = (e?: Event) => {\n /* const target = e.target as HTMLMediaElement;\n if(!isInDOM(target)) {\n this.container.append(target);\n target.play();\n return;\n } */\n\n // if(this.pip) {\n // this.pip.play();\n // }\n\n this.dispatchEvent('pause');\n };\n\n private onEnded = (e?: Event) => {\n if(!e.isTrusted) {\n return;\n }\n\n this.onPause(e);\n\n // console.log('on media end');\n\n const listLoader = this.listLoader;\n if(this.lockedSwitchers ||\n (!this.round && listLoader.current && !listLoader.next.length) ||\n !listLoader.getNext(true).length ||\n !this.next()) {\n this.stop();\n this.dispatchEvent('stop');\n }\n };\n\n public pauseMediaInOtherTabs() {\n this.skipMediaPlayEvent = true;\n rootScope.dispatchEvent('media_play');\n }\n\n // public get pip() {\n // return document.pictureInPictureElement as HTMLVideoElement;\n // }\n\n public toggle(play?: boolean, media = this.playingMedia) {\n if(!media) {\n return false;\n }\n\n if(play === undefined) {\n play = media.paused;\n }\n\n if(media.paused !== play) {\n return false;\n }\n\n if(play) {\n media.play();\n } else {\n media.pause();\n }\n\n return true;\n }\n\n public play = () => {\n return this.toggle(true);\n };\n\n public pause = () => {\n return this.toggle(false);\n };\n\n public stop = (media = this.playingMedia) => {\n if(!media) {\n return false;\n }\n\n if(!media.paused) {\n media.pause();\n }\n\n media.currentTime = 0;\n simulateEvent(media, 'ended');\n\n if(media === this.playingMedia) {\n const details = this.mediaDetails.get(media);\n if(details?.clean) {\n media.src = '';\n const peerId = details.peerId;\n const s = details.isScheduled ? this.scheduled : this.media;\n const storage = s.get(peerId);\n if(storage) {\n storage.delete(details.mid);\n\n if(!storage.size) {\n s.delete(peerId);\n }\n }\n\n media.remove();\n\n this.mediaDetails.delete(media);\n }\n\n this.playingMedia = undefined;\n this.playingMediaType = undefined;\n }\n\n return true;\n };\n\n public playItem = (item: MediaItem) => {\n const {peerId, mid} = item;\n const isScheduled = this.searchContext.isScheduled;\n const media = this.getMedia(peerId, mid, isScheduled);\n\n /* if(isSafari) {\n media.autoplay = true;\n } */\n\n media.play();\n\n setTimeout(() => {\n this.resolveWaitingForLoadMedia(peerId, mid, isScheduled);\n }, 0);\n };\n\n public go = (length: number, dispatchJump?: boolean) => {\n const listLoader = this.listLoader;\n if(this.lockedSwitchers || !listLoader) {\n return;\n }\n\n if(this.playingMediaType === 'audio') {\n return listLoader.goRound(length, dispatchJump);\n } else {\n return listLoader.go(length, dispatchJump);\n }\n };\n\n private bindBrowserCallback(cb: (video: HTMLVideoElement, details: MediaSessionActionDetails) => void) {\n const handler: MediaSessionActionHandler = (details) => {\n cb(this.pip, details);\n };\n\n return handler;\n }\n\n public browserPlay = this.bindBrowserCallback((video) => this.toggle(true, video));\n public browserPause = this.bindBrowserCallback((video) => this.toggle(false, video));\n public browserStop = this.bindBrowserCallback((video) => this.stop(video));\n public browserSeekBackward = this.bindBrowserCallback((video, details) => this.seekBackward(details, video));\n public browserSeekForward = this.bindBrowserCallback((video, details) => this.seekForward(details, video));\n public browserSeekTo = this.bindBrowserCallback((video, details) => this.seekTo(details, video));\n public browserNext = this.bindBrowserCallback((video) => video || this.next());\n public browserPrevious = this.bindBrowserCallback((video) => video ? this.seekToStart(video) : this.previous());\n\n public next = () => {\n return this.go(1);\n };\n\n public previous = () => {\n if(this.seekToStart(this.playingMedia)) {\n return;\n }\n\n return this.go(-1);\n };\n\n public seekToStart(media: HTMLMediaElement) {\n if(media?.currentTime > 5) {\n media.currentTime = 0;\n this.toggle(true, media);\n return true;\n }\n\n return false;\n }\n\n public willBePlayed(media: HTMLMediaElement) {\n this.willBePlayedMedia = media;\n }\n\n public setSearchContext(context: MediaSearchContext) {\n if(deepEqual(this.searchContext, context)) {\n return false;\n }\n\n this.searchContext = copy(context); // {_: type === 'audio' ? 'inputMessagesFilterMusic' : 'inputMessagesFilterRoundVoice'}\n return true;\n }\n\n public getSearchContext() {\n return this.searchContext;\n }\n\n public setTargets(current: MediaItem, prev?: MediaItem[], next?: MediaItem[]) {\n let listLoader = this.listLoader;\n if(!listLoader) {\n listLoader = this.listLoader = new SearchListLoader({\n loadCount: 10,\n loadWhenLeft: 5,\n processItem: (message: Message.message) => {\n this.addMedia(message, false);\n return {peerId: message.peerId, mid: message.mid};\n },\n onJump: (item, older) => {\n this.playItem(item);\n },\n onEmptied: () => {\n this.dispatchEvent('stop');\n this.stop();\n }\n });\n } else {\n listLoader.reset();\n }\n\n const reverse = this.searchContext.folderId !== undefined ? false : true;\n if(prev) {\n listLoader.setTargets(prev, next, reverse);\n } else {\n listLoader.reverse = reverse;\n }\n\n listLoader.setSearchContext(this.searchContext);\n listLoader.current = current;\n\n listLoader.load(true);\n listLoader.load(false);\n }\n\n private getPlaybackMediaTypeFromMessage(message: Message.message) {\n const doc = getMediaFromMessage(message) as MyDocument;\n let mediaType: PlaybackMediaType = 'audio';\n if(doc?.type) {\n if(doc.type === 'voice' || doc.type === 'round') {\n mediaType = 'voice';\n } else if(doc.type === 'video') {\n mediaType = 'video';\n }\n }\n\n return mediaType;\n }\n\n public setMedia(media: HTMLMediaElement, message: Message.message) {\n const mediaType = this.getPlaybackMediaTypeFromMessage(message);\n\n this._playbackRate = this.playbackRates[mediaType];\n\n this.playingMedia = media;\n this.playingMediaType = mediaType;\n this.playingMedia.volume = this.volume;\n this.playingMedia.muted = this.muted;\n this.playingMedia.playbackRate = this.playbackRate;\n\n if(mediaType === 'audio') {\n this.playingMedia.loop = this.loop;\n }\n\n if('mediaSession' in navigator) {\n this.setNewMediadata(message);\n }\n }\n\n public setSingleMedia(media?: HTMLMediaElement, message?: Message.message) {\n const playingMedia = this.playingMedia;\n\n const wasPlaying = this.pause();\n\n let onPlay: () => void;\n if(media) {\n onPlay = () => {\n const pip = this.pip;\n if(pip) {\n pip.pause();\n }\n\n this.pauseMediaInOtherTabs();\n };\n\n if(!media.paused) {\n onPlay();\n }\n\n media.addEventListener('play', onPlay);\n } else { // maybe it's voice recording\n this.pauseMediaInOtherTabs();\n }\n\n this.willBePlayed(undefined);\n if(media) this.setMedia(media, message);\n else this.playingMedia = undefined;\n this.toggleSwitchers(false);\n\n return (playPaused = wasPlaying) => {\n this.toggleSwitchers(true);\n\n if(playingMedia) {\n if(this.mediaDetails.get(playingMedia)) {\n this.setMedia(playingMedia, this.getMessageByMedia(playingMedia));\n } else {\n this.next() || this.previous();\n }\n }\n\n // If it's still not cleaned\n if(this.playingMedia === media) {\n this.playingMedia = undefined;\n this.playingMediaType = undefined;\n }\n\n if(media) {\n media.removeEventListener('play', onPlay);\n }\n\n // I don't remember what it was for\n // if(media && this.playingMedia === media) {\n // this.stop();\n // }\n\n if(playPaused) {\n this.play();\n }\n };\n }\n\n public toggleSwitchers(enabled: boolean) {\n this.lockedSwitchers = !enabled;\n }\n\n public setPictureInPicture(video: HTMLVideoElement) {\n this.pip = video;\n\n // let wasPlaying = this.pause();\n\n const listenerSetter = new ListenerSetter();\n listenerSetter.add(video)('leavepictureinpicture', () => {\n if(this.pip !== video) {\n return;\n }\n\n this.pip = undefined;\n // if(wasPlaying) {\n // this.play();\n // }\n\n listenerSetter.removeAll();\n }, {once: true});\n\n listenerSetter.add(video)('play', (e) => {\n if(this.playingMedia !== video) {\n this.pause();\n }\n\n this.pauseMediaInOtherTabs();\n // if(this.pause()) {\n // listenerSetter.add(video)('pause', () => {\n // this.play();\n // }, {once: true});\n // }\n });\n }\n}\n\nconst appMediaPlaybackController = new AppMediaPlaybackController();\nMOUNT_CLASS_TO.appMediaPlaybackController = appMediaPlaybackController;\nexport default appMediaPlaybackController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../environment/mediaMimeTypesSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport mediaSizes from '../helpers/mediaSizes';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport {Message} from '../layer';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport appImManager from '../lib/appManagers/appImManager';\nimport {MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport canSaveMessageMedia from '../lib/appManagers/utils/messages/canSaveMessageMedia';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport {MediaSearchContext} from './appMediaPlaybackController';\nimport AppMediaViewerBase, {MEDIA_VIEWER_CLASSNAME} from './appMediaViewerBase';\nimport {ButtonMenuItemOptionsVerifiable} from './buttonMenu';\nimport PopupDeleteMessages from './popups/deleteMessages';\nimport PopupForward from './popups/forward';\nimport Scrollable from './scrollable';\nimport appSidebarRight from './sidebarRight';\nimport AppSharedMediaTab from './sidebarRight/tabs/sharedMedia';\n\ntype AppMediaViewerTargetType = {\n element: HTMLElement,\n mid: number,\n peerId: PeerId\n};\nexport default class AppMediaViewer extends AppMediaViewerBase<'caption', 'delete' | 'forward', AppMediaViewerTargetType> {\n protected listLoader: SearchListLoader;\n protected btnMenuForward: ButtonMenuItemOptionsVerifiable;\n protected btnMenuDownload: ButtonMenuItemOptionsVerifiable;\n protected btnMenuDelete: ButtonMenuItemOptionsVerifiable;\n\n get searchContext() {\n return this.listLoader.searchContext;\n }\n\n constructor() {\n super(new SearchListLoader({\n processItem: (item) => {\n const isForDocument = this.searchContext.inputFilter._ === 'inputMessagesFilterDocument';\n const {mid, peerId} = item;\n const media: MyPhoto | MyDocument = getMediaFromMessage(item);\n\n if(!media) return;\n\n if(isForDocument && !AppMediaViewer.isMediaCompatibleForDocumentViewer(media)) {\n return;\n }\n\n return {element: null as HTMLElement, mid, peerId};\n }\n }), ['delete', 'forward']);\n\n this.listLoader.onEmptied = () => {\n this.close();\n };\n\n /* const stub = document.createElement('div');\n stub.classList.add(MEDIA_VIEWER_CLASSNAME + '-stub');\n this.content.main.prepend(stub); */\n\n this.content.caption = document.createElement('div');\n this.content.caption.classList.add(MEDIA_VIEWER_CLASSNAME + '-caption', 'spoilers-container'/* , 'media-viewer-stub' */);\n\n let captionTimeout: number;\n const setCaptionTimeout = () => {\n if(captionTimeout) {\n clearTimeout(captionTimeout);\n }\n\n captionTimeout = window.setTimeout(() => {\n captionTimeout = undefined;\n this.content.caption.classList.remove('is-focused');\n }, 800);\n };\n this.content.caption.addEventListener('touchstart', () => {\n if(!mediaSizes.isMobile) return;\n\n this.content.caption.classList.add('is-focused');\n\n if(captionTimeout) {\n clearTimeout(captionTimeout);\n captionTimeout = undefined;\n }\n\n document.addEventListener('touchend', setCaptionTimeout, {once: true});\n });\n\n const captionScrollable = new Scrollable(this.content.caption);\n captionScrollable.onAdditionalScroll = setCaptionTimeout;\n\n // this.content.main.append(this.content.caption);\n this.wholeDiv.append(this.content.caption);\n\n attachClickEvent(this.buttons.delete, this.onDeleteClick);\n\n const buttons: ButtonMenuItemOptionsVerifiable[] = [this.btnMenuForward = {\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick\n }, this.btnMenuDownload = {\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }, this.btnMenuDelete = {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick\n }];\n\n this.setBtnMenuToggle(buttons);\n\n // * constructing html end\n\n this.setListeners();\n }\n\n protected setListeners() {\n super.setListeners();\n attachClickEvent(this.buttons.forward, this.onForwardClick);\n attachClickEvent(this.author.container, this.onAuthorClick);\n\n const onCaptionClick = (e: MouseEvent) => {\n const a = findUpTag(e.target, 'A');\n const spoiler = findUpClassName(e.target, 'spoiler');\n if(a instanceof HTMLAnchorElement && (!spoiler || this.content.caption.classList.contains('is-spoiler-visible'))) { // close viewer if it's t.me/ redirect\n const onclick = a.getAttribute('onclick');\n if(!onclick || onclick.includes('showMaskedAlert')) {\n return;\n }\n\n cancelEvent(e);\n\n this.close().then(() => {\n this.content.caption.removeEventListener('click', onCaptionClick, {capture: true});\n a.click();\n });\n\n return false;\n }\n };\n\n this.content.caption.addEventListener('click', onCaptionClick, {capture: true});\n }\n\n /* public close(e?: MouseEvent) {\n const good = !this.setMoverAnimationPromise;\n const promise = super.close(e);\n\n if(good) { // clear\n this.currentMessageId = 0;\n this.peerId = 0;\n }\n\n return promise;\n } */\n\n protected getMessageByPeer(peerId: PeerId, mid: number) {\n return this.searchContext.isScheduled ? this.managers.appMessagesManager.getScheduledMessageByPeer(peerId, mid) : this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n }\n\n onPrevClick = async(target: AppMediaViewerTargetType) => {\n this.openMedia(await this.getMessageByPeer(target.peerId, target.mid), target.element, -1);\n };\n\n onNextClick = async(target: AppMediaViewerTargetType) => {\n this.openMedia(await this.getMessageByPeer(target.peerId, target.mid), target.element, 1);\n };\n\n onDeleteClick = () => {\n const target = this.target;\n new PopupDeleteMessages(target.peerId, [target.mid], 'chat', () => {\n this.target = {element: this.content.media} as any;\n this.close();\n });\n };\n\n onForwardClick = () => {\n const target = this.target;\n if(target.mid) {\n // appSidebarRight.forwardTab.open([target.mid]);\n new PopupForward({\n [target.peerId]: [target.mid]\n }, () => {\n return this.close();\n });\n }\n };\n\n onAuthorClick = async(e: MouseEvent) => {\n const {mid, peerId} = this.target;\n if(mid && mid !== Number.MAX_SAFE_INTEGER) {\n const threadId = this.searchContext.threadId;\n const message = await this.getMessageByPeer(peerId, mid);\n this.close(e)\n // .then(() => mediaSizes.isMobile ? appSidebarRight.sharedMediaTab.closeBtn.click() : Promise.resolve())\n .then(async() => {\n if(mediaSizes.isMobile) {\n const tab = appSidebarRight.getTab(AppSharedMediaTab);\n if(tab) {\n tab.close();\n }\n }\n\n appImManager.setInnerPeer({\n peerId: message.peerId,\n lastMsgId: mid,\n type: threadId ? 'discussion' : undefined,\n threadId\n });\n });\n }\n };\n\n onDownloadClick = async() => {\n const {peerId, mid} = this.target;\n const message = await this.getMessageByPeer(peerId, mid);\n const media = getMediaFromMessage(message);\n if(!media) return;\n appDownloadManager.downloadToDisc({media, queueId: appImManager.chat.bubbles.lazyLoadQueue.queueId});\n };\n\n private setCaption(message: MyMessage) {\n const caption = (message as Message.message).message;\n let html: Parameters[1] = '';\n if(caption) {\n html = wrapRichText(caption, {\n entities: (message as Message.message).totalEntities\n });\n }\n\n // html = 'Dandelion are a family of flowering plants that grow in many parts of the world.';\n setInnerHTML(this.content.caption.firstElementChild, html);\n this.content.caption.classList.toggle('hide', !caption);\n // this.content.container.classList.toggle('with-caption', !!caption);\n }\n\n public setSearchContext(context: MediaSearchContext) {\n this.listLoader.setSearchContext(context);\n\n return this;\n }\n\n public async openMedia(message: MyMessage, target?: HTMLElement, fromRight = 0, reverse = false,\n prevTargets: AppMediaViewerTargetType[] = [], nextTargets: AppMediaViewerTargetType[] = []/* , needLoadMore = true */) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const mid = message.mid;\n const fromId = (message as Message.message).fwd_from && !message.fromId ? (message as Message.message).fwd_from.from_name : message.fromId;\n const media = getMediaFromMessage(message);\n\n const noForwards = await this.managers.appPeersManager.noForwards(message.peerId);\n const isServiceMessage = message._ === 'messageService';\n const cantForwardMessage = isServiceMessage || !(await this.managers.appMessagesManager.canForward(message));\n const cantDownloadMessage = (isServiceMessage ? noForwards : cantForwardMessage) || !canSaveMessageMedia(message);\n const a: [(HTMLElement | ButtonMenuItemOptionsVerifiable)[], boolean][] = [\n [[this.buttons.forward, this.btnMenuForward], cantForwardMessage],\n [[this.buttons.download, this.btnMenuDownload], cantDownloadMessage],\n [[this.buttons.delete, this.btnMenuDelete], !(await this.managers.appMessagesManager.canDeleteMessage(message))]\n ];\n\n a.forEach(([buttons, hide]) => {\n buttons.forEach((button) => {\n if(button instanceof HTMLElement) {\n button.classList.toggle('hide', hide);\n } else {\n button.verify = () => !hide;\n }\n });\n });\n\n this.wholeDiv.classList.toggle('no-forwards', cantDownloadMessage);\n\n this.setCaption(message);\n const promise = super._openMedia(media, message.date, fromId, fromRight, target, reverse, prevTargets, nextTargets, message/* , needLoadMore */);\n this.target.mid = mid;\n this.target.peerId = message.peerId;\n\n return promise;\n }\n\n public static isMediaCompatibleForDocumentViewer(media: MyPhoto | MyDocument) {\n return media._ === 'photo' || MEDIA_MIME_TYPES_SUPPORTED.has(media.mime_type);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMediaPlaybackController from '../components/appMediaPlaybackController';\nimport {IS_APPLE_MOBILE, IS_MOBILE} from '../environment/userAgent';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport ListenerSetter, {Listener} from '../helpers/listenerSetter';\nimport {ButtonMenuSync} from '../components/buttonMenu';\nimport {ButtonMenuToggleHandler} from '../components/buttonMenuToggle';\nimport ControlsHover from '../helpers/dom/controlsHover';\nimport {addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen} from '../helpers/dom/fullScreen';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport MediaProgressLine from '../components/mediaProgressLine';\nimport VolumeSelector from '../components/volumeSelector';\nimport debounce from '../helpers/schedulers/debounce';\nimport overlayCounter from '../helpers/overlayCounter';\nimport onMediaLoad from '../helpers/onMediaLoad';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\n\nexport default class VideoPlayer extends ControlsHover {\n private static PLAYBACK_RATES = [0.5, 1, 1.5, 2];\n private static PLAYBACK_RATES_ICONS = ['playback_05', 'playback_1x', 'playback_15', 'playback_2x'];\n\n protected video: HTMLVideoElement;\n protected wrapper: HTMLDivElement;\n protected progress: MediaProgressLine;\n protected skin: 'default';\n\n protected listenerSetter: ListenerSetter;\n protected playbackRateButton: HTMLElement;\n protected pipButton: HTMLElement;\n\n /* protected videoParent: HTMLElement;\n protected videoWhichChild: number; */\n\n protected onPlaybackRackMenuToggle?: (open: boolean) => void;\n protected onPip?: (pip: boolean) => void;\n protected onPipClose?: () => void;\n\n constructor({video, play = false, streamable = false, duration, onPlaybackRackMenuToggle, onPip, onPipClose}: {\n video: HTMLVideoElement,\n play?: boolean,\n streamable?: boolean,\n duration?: number,\n onPlaybackRackMenuToggle?: VideoPlayer['onPlaybackRackMenuToggle'],\n onPip?: VideoPlayer['onPip'],\n onPipClose?: VideoPlayer['onPipClose']\n }) {\n super();\n\n this.video = video;\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('ckin__player');\n\n this.onPlaybackRackMenuToggle = onPlaybackRackMenuToggle;\n this.onPip = onPip;\n this.onPipClose = onPipClose;\n\n this.listenerSetter = new ListenerSetter();\n\n this.setup({\n element: this.wrapper,\n listenerSetter: this.listenerSetter,\n canHideControls: () => {\n return !this.video.paused && (!this.playbackRateButton || !this.playbackRateButton.classList.contains('menu-open'));\n },\n showOnLeaveToClassName: 'media-viewer-caption',\n ignoreClickClassName: 'ckin__controls'\n });\n\n video.parentNode.insertBefore(this.wrapper, video);\n this.wrapper.appendChild(video);\n\n this.skin = 'default';\n\n this.stylePlayer(duration);\n this.setBtnMenuToggle();\n\n if(this.skin === 'default') {\n const controls = this.wrapper.querySelector('.default__controls.ckin__controls') as HTMLDivElement;\n this.progress = new MediaProgressLine(video, streamable);\n controls.prepend(this.progress.container);\n }\n\n if(play/* && video.paused */) {\n const promise = video.play();\n promise.catch((err: Error) => {\n if(err.name === 'NotAllowedError') {\n video.muted = true;\n video.autoplay = true;\n video.play();\n }\n }).finally(() => { // due to autoplay, play will not call\n this.wrapper.classList.toggle('is-playing', !this.video.paused);\n });\n }\n }\n\n private stylePlayer(initDuration: number) {\n const {wrapper, video, skin, listenerSetter} = this;\n\n wrapper.classList.add(skin);\n\n const html = this.buildControls();\n wrapper.insertAdjacentHTML('beforeend', html);\n let timeDuration: HTMLElement;\n\n if(skin === 'default') {\n this.playbackRateButton = this.wrapper.querySelector('.playback-rate') as HTMLElement;\n this.pipButton = this.wrapper.querySelector('.pip') as HTMLElement;\n\n const toggle = wrapper.querySelectorAll('.toggle') as NodeListOf;\n const fullScreenButton = wrapper.querySelector('.fullscreen') as HTMLElement;\n const timeElapsed = wrapper.querySelector('#time-elapsed');\n timeDuration = wrapper.querySelector('#time-duration') as HTMLElement;\n timeDuration.textContent = toHHMMSS(video.duration | 0);\n\n const volumeSelector = new VolumeSelector(listenerSetter);\n\n const leftControls = wrapper.querySelector('.left-controls');\n volumeSelector.btn.classList.remove('btn-icon');\n leftControls.insertBefore(volumeSelector.btn, timeElapsed.parentElement);\n\n Array.from(toggle).forEach((button) => {\n attachClickEvent(button, () => {\n this.togglePlay();\n }, {listenerSetter: this.listenerSetter});\n });\n\n if(this.pipButton) {\n attachClickEvent(this.pipButton, () => {\n this.video.requestPictureInPicture();\n }, {listenerSetter: this.listenerSetter});\n\n const onPip = (pip: boolean) => {\n this.wrapper.style.visibility = pip ? 'hidden': '';\n if(this.onPip) {\n this.onPip(pip);\n }\n };\n\n const debounceTime = 20;\n const debouncedPip = debounce(onPip, debounceTime, false, true);\n\n listenerSetter.add(video)('enterpictureinpicture', () => {\n debouncedPip(true);\n\n listenerSetter.add(video)('leavepictureinpicture', () => {\n const onPause = () => {\n clearTimeout(timeout);\n if(this.onPipClose) {\n this.onPipClose();\n }\n };\n const listener = listenerSetter.add(video)('pause', onPause, {once: true}) as any as Listener;\n const timeout = setTimeout(() => {\n listenerSetter.remove(listener);\n }, debounceTime);\n }, {once: true});\n });\n\n listenerSetter.add(video)('leavepictureinpicture', () => {\n debouncedPip(false);\n });\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n attachClickEvent(video, () => {\n this.togglePlay();\n }, {listenerSetter: this.listenerSetter});\n\n listenerSetter.add(document)('keydown', (e: KeyboardEvent) => {\n if(overlayCounter.overlaysActive > 1 || document.pictureInPictureElement === video) { // forward popup is active, etc\n return;\n }\n\n const {key, code} = e;\n\n let good = true;\n if(code === 'KeyF') {\n this.toggleFullScreen();\n } else if(code === 'KeyM') {\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n } else if(code === 'Space') {\n this.togglePlay();\n } else if(e.altKey && (code === 'Equal' || code === 'Minus')) {\n const add = code === 'Equal' ? 1 : -1;\n const playbackRate = appMediaPlaybackController.playbackRate;\n const idx = VideoPlayer.PLAYBACK_RATES.indexOf(playbackRate);\n const nextIdx = idx + add;\n if(nextIdx >= 0 && nextIdx < VideoPlayer.PLAYBACK_RATES.length) {\n appMediaPlaybackController.playbackRate = VideoPlayer.PLAYBACK_RATES[nextIdx];\n }\n } else if(wrapper.classList.contains('ckin__fullscreen') && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n if(key === 'ArrowLeft') appMediaPlaybackController.seekBackward({action: 'seekbackward'});\n else appMediaPlaybackController.seekForward({action: 'seekforward'});\n } else {\n good = false;\n }\n\n if(good) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n listenerSetter.add(video)('dblclick', () => {\n if(!IS_TOUCH_SUPPORTED) {\n this.toggleFullScreen();\n }\n });\n\n attachClickEvent(fullScreenButton, () => {\n this.toggleFullScreen();\n }, {listenerSetter: this.listenerSetter});\n\n addFullScreenListener(wrapper, this.onFullScreen.bind(this, fullScreenButton), listenerSetter);\n\n listenerSetter.add(video)('timeupdate', () => {\n timeElapsed.textContent = toHHMMSS(video.currentTime | 0);\n });\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('played');\n\n if(!IS_TOUCH_SUPPORTED) {\n listenerSetter.add(video)('play', () => {\n this.hideControls(true);\n });\n }\n }, {once: true});\n\n listenerSetter.add(video)('pause', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(appMediaPlaybackController)('playbackParams', () => {\n this.setPlaybackRateIcon();\n });\n }\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('is-playing');\n });\n\n listenerSetter.add(video)('pause', () => {\n wrapper.classList.remove('is-playing');\n });\n\n if(video.duration || initDuration) {\n timeDuration.textContent = toHHMMSS(Math.round(video.duration || initDuration));\n } else {\n onMediaLoad(video).then(() => {\n timeDuration.textContent = toHHMMSS(Math.round(video.duration));\n });\n }\n }\n\n protected togglePlay() {\n this.video[this.video.paused ? 'play' : 'pause']();\n }\n\n private buildControls() {\n const skin = this.skin;\n if(skin === 'default') {\n return `\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n ${!IS_MOBILE && document.pictureInPictureEnabled ? `` : ''}\n \n
\n
\n
`;\n }\n }\n\n protected setBtnMenuToggle() {\n const buttons: Parameters[0]['buttons'] = VideoPlayer.PLAYBACK_RATES.map((rate, idx) => {\n return {\n // icon: VideoPlayer.PLAYBACK_RATES_ICONS[idx],\n regularText: rate + 'x',\n onClick: () => {\n appMediaPlaybackController.playbackRate = rate;\n }\n };\n });\n const btnMenu = ButtonMenuSync({buttons});\n btnMenu.classList.add('top-left');\n ButtonMenuToggleHandler({\n el: this.playbackRateButton,\n onOpen: this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(true);\n } : undefined,\n onClose: this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(false);\n } : undefined\n });\n this.playbackRateButton.append(btnMenu);\n\n this.setPlaybackRateIcon();\n }\n\n protected setPlaybackRateIcon() {\n const playbackRateButton = this.playbackRateButton;\n VideoPlayer.PLAYBACK_RATES_ICONS.forEach((className) => {\n className = 'tgico-' + className;\n playbackRateButton.classList.remove(className);\n });\n\n let idx = VideoPlayer.PLAYBACK_RATES.indexOf(appMediaPlaybackController.playbackRate);\n if(idx === -1) idx = VideoPlayer.PLAYBACK_RATES.indexOf(1);\n\n playbackRateButton.classList.add('tgico-' + VideoPlayer.PLAYBACK_RATES_ICONS[idx]);\n }\n\n protected toggleFullScreen() {\n const player = this.wrapper;\n\n // * https://caniuse.com/#feat=fullscreen\n if(IS_APPLE_MOBILE) {\n const video = this.video as any;\n video.webkitEnterFullscreen();\n video.enterFullscreen();\n return;\n }\n\n if(!isFullScreen()) {\n /* const videoParent = this.video.parentElement;\n const videoWhichChild = whichChild(this.video);\n const needVideoRemount = videoParent !== player;\n\n if(needVideoRemount) {\n this.videoParent = videoParent;\n this.videoWhichChild = videoWhichChild;\n player.prepend(this.video);\n } */\n\n requestFullScreen(player);\n } else {\n /* if(this.videoParent) {\n const {videoWhichChild, videoParent} = this;\n if(!videoWhichChild) {\n videoParent.prepend(this.video);\n } else {\n videoParent.insertBefore(this.video, videoParent.children[videoWhichChild]);\n }\n\n this.videoParent = null;\n this.videoWhichChild = -1;\n } */\n\n cancelFullScreen();\n }\n }\n\n protected onFullScreen(fullScreenButton: HTMLElement) {\n const isFull = isFullScreen();\n this.wrapper.classList.toggle('ckin__fullscreen', isFull);\n if(!isFull) {\n fullScreenButton.classList.remove('tgico-smallscreen');\n fullScreenButton.classList.add('tgico-fullscreen');\n fullScreenButton.setAttribute('title', 'Full Screen');\n } else {\n fullScreenButton.classList.remove('tgico-fullscreen');\n fullScreenButton.classList.add('tgico-smallscreen');\n fullScreenButton.setAttribute('title', 'Exit Full Screen');\n }\n }\n\n public cleanup() {\n super.cleanup();\n this.listenerSetter.removeAll();\n this.progress.removeListeners();\n this.onPlaybackRackMenuToggle = this.onPip = undefined;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport deferredPromise from '../helpers/cancellablePromise';\nimport mediaSizes from '../helpers/mediaSizes';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {IS_MOBILE, IS_MOBILE_SAFARI, IS_SAFARI} from '../environment/userAgent';\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {logger} from '../lib/logger';\nimport VideoPlayer from '../lib/mediaPlayer';\nimport rootScope from '../lib/rootScope';\nimport animationIntersector from './animationIntersector';\nimport appMediaPlaybackController, {AppMediaPlaybackController} from './appMediaPlaybackController';\nimport AvatarElement from './avatar';\nimport ButtonIcon from './buttonIcon';\nimport {ButtonMenuItemOptions} from './buttonMenu';\nimport ButtonMenuToggle from './buttonMenuToggle';\nimport ProgressivePreloader from './preloader';\nimport SwipeHandler from './swipeHandler';\nimport {formatFullSentTime} from '../helpers/date';\nimport appNavigationController, {NavigationItem} from './appNavigationController';\nimport {Message} from '../layer';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport renderImageFromUrl, {renderImageFromUrlPromise} from '../helpers/dom/renderImageFromUrl';\nimport getVisibleRect from '../helpers/dom/getVisibleRect';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport fillPropertyValue from '../helpers/fillPropertyValue';\nimport generatePathData from '../helpers/generatePathData';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {doubleRaf, fastRaf} from '../helpers/schedulers';\nimport RangeSelector from './rangeSelector';\nimport windowSize from '../helpers/windowSize';\nimport ListLoader from '../helpers/listLoader';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport {isFullScreen} from '../helpers/dom/fullScreen';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport createVideo from '../helpers/dom/createVideo';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getStrippedThumbIfNeeded from '../helpers/getStrippedThumbIfNeeded';\nimport setAttachmentSize from '../helpers/setAttachmentSize';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport LazyLoadQueueBase from './lazyLoadQueueBase';\nimport overlayCounter from '../helpers/overlayCounter';\nimport {ThumbCache} from '../lib/storages/thumbs';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport wrapPeerTitle from './wrappers/peerTitle';\nimport {toastNew} from './toast';\n\nconst ZOOM_STEP = 0.5;\nconst ZOOM_INITIAL_VALUE = 1;\nconst ZOOM_MIN_VALUE = 0.5;\nconst ZOOM_MAX_VALUE = 4;\n\n// TODO: масштабирование картинок (не SVG) при ресайзе, и правильный возврат на исходную позицию\n// TODO: картинки \"обрезаются\" если возвращаются или появляются с места, где есть их перекрытие (топбар, поле ввода)\n// TODO: видео в мобильной вёрстке, если показываются элементы управления: если свайпнуть в сторону, то элементы вернутся на место, т.е. прыгнут - это не ок, надо бы замаскировать\n\nexport const MEDIA_VIEWER_CLASSNAME = 'media-viewer';\n\nexport default class AppMediaViewerBase<\n ContentAdditionType extends string,\n ButtonsAdditionType extends string,\n TargetType extends {element: HTMLElement\n}> extends EventListenerBase<{\n setMoverBefore: () => void,\n setMoverAfter: () => void\n}> {\n protected wholeDiv: HTMLElement;\n protected overlaysDiv: HTMLElement;\n protected author: {[k in 'container' | 'avatarEl' | 'nameEl' | 'date']: HTMLElement} = {} as any;\n protected content: {[k in 'main' | 'container' | 'media' | 'mover' | ContentAdditionType]: HTMLElement} = {} as any;\n protected buttons: {[k in 'download' | 'close' | 'prev' | 'next' | 'mobile-close' | 'zoom' | ButtonsAdditionType]: HTMLElement} = {} as any;\n protected topbar: HTMLElement;\n protected moversContainer: HTMLElement;\n\n protected tempId = 0;\n protected preloader: ProgressivePreloader = null;\n protected preloaderStreamable: ProgressivePreloader = null;\n\n // protected targetContainer: HTMLElement = null;\n // protected loadMore: () => void = null;\n\n protected log: ReturnType;\n\n protected isFirstOpen = true;\n\n // protected needLoadMore = true;\n\n protected pageEl = document.getElementById('page-chats') as HTMLDivElement;\n\n protected setMoverPromise: Promise;\n protected setMoverAnimationPromise: Promise;\n\n protected lazyLoadQueue: LazyLoadQueueBase;\n\n protected highlightSwitchersTimeout: number;\n\n protected onDownloadClick: (e: MouseEvent) => void;\n protected onPrevClick: (target: TargetType) => void;\n protected onNextClick: (target: TargetType) => void;\n\n protected videoPlayer: VideoPlayer;\n\n protected zoomElements: {\n container: HTMLElement,\n btnOut: HTMLElement,\n btnIn: HTMLElement,\n rangeSelector: RangeSelector\n } = {} as any;\n // protected zoomValue = ZOOM_INITIAL_VALUE;\n protected zoomSwipeHandler: SwipeHandler;\n protected zoomSwipeStartX = 0;\n protected zoomSwipeStartY = 0;\n protected zoomSwipeX = 0;\n protected zoomSwipeY = 0;\n\n protected ctrlKeyDown: boolean;\n protected releaseSingleMedia: ReturnType;\n protected navigationItem: NavigationItem;\n\n protected managers: AppManagers;\n\n get target() {\n return this.listLoader.current;\n }\n\n set target(value) {\n this.listLoader.current = value;\n }\n\n constructor(\n protected listLoader: ListLoader,\n topButtons: Array['buttons']>\n ) {\n super(false);\n\n this.managers = rootScope.managers;\n\n this.log = logger('AMV');\n this.preloader = new ProgressivePreloader();\n this.preloaderStreamable = new ProgressivePreloader({\n cancelable: false,\n streamable: true\n });\n this.preloader.construct();\n this.preloaderStreamable.construct();\n this.lazyLoadQueue = new LazyLoadQueueBase();\n\n this.wholeDiv = document.createElement('div');\n this.wholeDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-whole');\n\n this.overlaysDiv = document.createElement('div');\n this.overlaysDiv.classList.add('overlays');\n\n const mainDiv = document.createElement('div');\n mainDiv.classList.add(MEDIA_VIEWER_CLASSNAME);\n\n const topbar = this.topbar = document.createElement('div');\n topbar.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar', MEDIA_VIEWER_CLASSNAME + '-appear');\n\n const topbarLeft = document.createElement('div');\n topbarLeft.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar-left');\n\n this.buttons['mobile-close'] = ButtonIcon('close', {onlyMobile: true});\n\n // * author\n this.author.container = document.createElement('div');\n this.author.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-author', 'no-select');\n const authorRight = document.createElement('div');\n\n this.author.avatarEl = new AvatarElement();\n this.author.avatarEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-userpic', 'avatar-44');\n\n this.author.nameEl = document.createElement('div');\n this.author.nameEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-name');\n\n this.author.date = document.createElement('div');\n this.author.date.classList.add(MEDIA_VIEWER_CLASSNAME + '-date');\n\n authorRight.append(this.author.nameEl, this.author.date);\n\n this.author.container.append(this.author.avatarEl, authorRight);\n\n // * buttons\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-buttons');\n\n topButtons.concat(['download', 'zoom', 'close']).forEach((name) => {\n const button = ButtonIcon(name, {noRipple: true});\n this.buttons[name] = button;\n buttonsDiv.append(button);\n });\n\n this.buttons.zoom.classList.add('zoom-in');\n\n // * zoom\n this.zoomElements.container = document.createElement('div');\n this.zoomElements.container.classList.add('zoom-container');\n\n this.zoomElements.btnOut = ButtonIcon('zoomout', {noRipple: true});\n attachClickEvent(this.zoomElements.btnOut, () => this.changeZoom(false));\n this.zoomElements.btnIn = ButtonIcon('zoomin', {noRipple: true});\n attachClickEvent(this.zoomElements.btnIn, () => this.changeZoom(true));\n\n this.zoomElements.rangeSelector = new RangeSelector({\n step: ZOOM_STEP,\n min: ZOOM_MIN_VALUE,\n max: ZOOM_MAX_VALUE,\n withTransition: true\n }, ZOOM_INITIAL_VALUE);\n this.zoomElements.rangeSelector.setListeners();\n this.zoomElements.rangeSelector.setHandlers({\n onScrub: this.setZoomValue,\n onMouseUp: () => this.setZoomValue()\n });\n\n this.zoomElements.container.append(this.zoomElements.btnOut, this.zoomElements.rangeSelector.container, this.zoomElements.btnIn);\n\n this.wholeDiv.append(this.zoomElements.container);\n\n // * content\n this.content.main = document.createElement('div');\n this.content.main.classList.add(MEDIA_VIEWER_CLASSNAME + '-content');\n\n this.content.container = document.createElement('div');\n this.content.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-container');\n\n this.content.media = document.createElement('div');\n this.content.media.classList.add(MEDIA_VIEWER_CLASSNAME + '-media');\n\n this.content.container.append(this.content.media);\n\n this.content.main.append(this.content.container);\n mainDiv.append(this.content.main);\n this.overlaysDiv.append(mainDiv);\n // * overlays end\n\n topbarLeft.append(this.buttons['mobile-close'], this.author.container);\n topbar.append(topbarLeft, buttonsDiv);\n\n this.buttons.prev = document.createElement('div');\n this.buttons.prev.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-left`;\n this.buttons.prev.innerHTML = ``;\n\n this.buttons.next = document.createElement('div');\n this.buttons.next.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-right`;\n this.buttons.next.innerHTML = ``;\n\n this.moversContainer = document.createElement('div');\n this.moversContainer.classList.add(MEDIA_VIEWER_CLASSNAME + '-movers');\n\n this.wholeDiv.append(this.overlaysDiv, this.buttons.prev, this.buttons.next, this.topbar, this.moversContainer);\n\n // * constructing html end\n\n this.listLoader.onLoadedMore = () => {\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n };\n\n this.setNewMover();\n }\n\n protected setListeners() {\n attachClickEvent(this.buttons.download, this.onDownloadClick);\n [this.buttons.close, this.buttons['mobile-close'], this.preloaderStreamable.preloader].forEach((el) => {\n attachClickEvent(el, this.close.bind(this));\n });\n\n ([[-1, this.buttons.prev], [1, this.buttons.next]] as [number, HTMLElement][]).forEach(([moveLength, button]) => {\n // attachClickEvent(button, (e) => {\n button.addEventListener('click', (e) => {\n cancelEvent(e);\n if(this.setMoverPromise) return;\n\n this.listLoader.go(moveLength);\n });\n });\n\n attachClickEvent(this.buttons.zoom, () => {\n if(this.isZooming()) this.toggleZoom(false);\n else {\n this.changeZoom(true);\n }\n });\n\n // ! cannot use the function because it'll cancel slide event on touch devices\n // attachClickEvent(this.wholeDiv, this.onClick);\n this.wholeDiv.addEventListener('click', this.onClick);\n\n this.listLoader.onJump = (item, older) => {\n if(older) this.onNextClick(item);\n else this.onPrevClick(item);\n };\n\n if(IS_TOUCH_SUPPORTED) {\n const swipeHandler = new SwipeHandler({\n element: this.wholeDiv,\n onSwipe: (xDiff, yDiff) => {\n if(isFullScreen()) {\n return;\n }\n\n const percents = Math.abs(xDiff) / windowSize.width;\n if(percents > .2 || xDiff > 125) {\n // console.log('will swipe', xDiff);\n\n if(xDiff > 0) {\n this.buttons.prev.click();\n } else {\n this.buttons.next.click();\n }\n\n return true;\n }\n\n const percentsY = Math.abs(yDiff) / windowSize.height;\n if(percentsY > .2 || yDiff > 125) {\n this.close();\n return true;\n }\n\n return false;\n },\n verifyTouchTarget: (evt) => {\n console.log('verify');\n // * Fix for seek input\n if((evt.target as HTMLElement).tagName === 'INPUT' || findUpClassName(evt.target, 'media-viewer-caption')) {\n return false;\n }\n\n return true;\n }\n });\n }\n }\n\n protected toggleZoom(enable?: boolean) {\n const isVisible = this.isZooming();\n if(this.zoomElements.rangeSelector.mousedown || this.ctrlKeyDown) {\n enable = true;\n }\n\n if(isVisible === enable) return;\n\n if(enable === undefined) {\n enable = !isVisible;\n }\n\n this.buttons.zoom.classList.toggle('zoom-in', !enable);\n this.zoomElements.container.classList.toggle('is-visible', enable);\n const zoomValue = enable ? this.zoomElements.rangeSelector.value : 1;\n this.setZoomValue(zoomValue);\n this.zoomElements.rangeSelector.setProgress(zoomValue);\n\n if(this.videoPlayer) {\n this.videoPlayer.lockControls(enable ? false : undefined);\n }\n\n if(enable) {\n if(!this.zoomSwipeHandler) {\n let lastDiffX: number, lastDiffY: number;\n const multiplier = 1;\n this.zoomSwipeHandler = new SwipeHandler({\n element: this.moversContainer,\n onFirstSwipe: () => {\n lastDiffX = lastDiffY = 0;\n this.moversContainer.classList.add('no-transition');\n },\n onSwipe: (xDiff, yDiff) => {\n [xDiff, yDiff] = [xDiff * multiplier, yDiff * multiplier];\n this.zoomSwipeX += xDiff - lastDiffX;\n this.zoomSwipeY += yDiff - lastDiffY;\n [lastDiffX, lastDiffY] = [xDiff, yDiff];\n\n this.setZoomValue();\n },\n onReset: () => {\n this.moversContainer.classList.remove('no-transition');\n },\n cursor: 'move'\n });\n } else {\n this.zoomSwipeHandler.setListeners();\n }\n\n this.zoomElements.rangeSelector.setProgress(zoomValue);\n } else if(!enable) {\n this.zoomSwipeHandler.removeListeners();\n }\n }\n\n protected changeZoom(add: boolean) {\n this.zoomElements.rangeSelector.addProgress(ZOOM_STEP * (add ? 1 : -1));\n this.setZoomValue();\n }\n\n protected setZoomValue = (value = this.zoomElements.rangeSelector.value) => {\n // this.zoomValue = value;\n if(value === ZOOM_INITIAL_VALUE) {\n this.zoomSwipeX = 0;\n this.zoomSwipeY = 0;\n }\n\n this.moversContainer.style.transform = `matrix(${value}, 0, 0, ${value}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`;\n\n this.zoomElements.btnOut.classList.toggle('inactive', value === ZOOM_MIN_VALUE);\n this.zoomElements.btnIn.classList.toggle('inactive', value === ZOOM_MAX_VALUE);\n\n this.toggleZoom(value !== ZOOM_INITIAL_VALUE);\n };\n\n protected isZooming() {\n return this.zoomElements.container.classList.contains('is-visible');\n }\n\n protected setBtnMenuToggle(buttons: ButtonMenuItemOptions[]) {\n const btnMenuToggle = ButtonMenuToggle({buttonOptions: {onlyMobile: true}, direction: 'bottom-left', buttons});\n this.topbar.append(btnMenuToggle);\n }\n\n public close(e?: MouseEvent) {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.setMoverAnimationPromise) return Promise.reject();\n\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n }\n\n this.lazyLoadQueue.clear();\n\n const promise = this.setMoverToTarget(this.target?.element, true).then(({onAnimationEnd}) => onAnimationEnd);\n\n this.listLoader.reset();\n (this.listLoader as SearchListLoader).cleanup && (this.listLoader as SearchListLoader).cleanup();\n this.setMoverPromise = null;\n this.tempId = -1;\n if((window as any).appMediaViewer === this) {\n (window as any).appMediaViewer = undefined;\n }\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n promise.then(() => {\n appSidebarRight.forwardTab.closeBtn.click();\n });\n } */\n\n this.removeGlobalListeners();\n\n this.zoomSwipeHandler = undefined;\n\n promise.finally(() => {\n this.wholeDiv.remove();\n this.toggleOverlay(false);\n });\n\n return promise;\n }\n\n protected toggleOverlay(active: boolean) {\n overlayCounter.isOverlayActive = active;\n animationIntersector.checkAnimations2(active);\n }\n\n protected toggleGlobalListeners(active: boolean) {\n if(active) this.setGlobalListeners();\n else this.removeGlobalListeners();\n }\n\n protected removeGlobalListeners() {\n if(this.zoomSwipeHandler) {\n this.zoomSwipeHandler.removeListeners();\n }\n\n window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n window.removeEventListener('wheel', this.onWheel, {capture: true});\n }\n\n protected setGlobalListeners() {\n if(this.isZooming()) {\n this.zoomSwipeHandler.setListeners();\n }\n\n window.addEventListener('keydown', this.onKeyDown);\n window.addEventListener('keyup', this.onKeyUp);\n if(!IS_TOUCH_SUPPORTED) window.addEventListener('wheel', this.onWheel, {passive: false, capture: true});\n }\n\n onClick = (e: MouseEvent) => {\n if(this.setMoverAnimationPromise) return;\n\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') return;\n cancelEvent(e);\n\n if(IS_TOUCH_SUPPORTED) {\n if(this.highlightSwitchersTimeout) {\n clearTimeout(this.highlightSwitchersTimeout);\n } else {\n this.wholeDiv.classList.add('highlight-switchers');\n }\n\n this.highlightSwitchersTimeout = window.setTimeout(() => {\n this.wholeDiv.classList.remove('highlight-switchers');\n this.highlightSwitchersTimeout = 0;\n }, 3e3);\n\n return;\n }\n\n const isZooming = this.isZooming();\n let mover: HTMLElement = null;\n const classNames = ['ckin__player', 'media-viewer-buttons', 'media-viewer-author', 'media-viewer-caption', 'zoom-container'];\n if(isZooming) {\n classNames.push('media-viewer-movers');\n }\n\n classNames.find((s) => {\n try {\n mover = findUpClassName(target, s);\n if(mover) return true;\n } catch(err) {return false;}\n });\n\n if(/* target === this.mediaViewerDiv */!mover || (!isZooming && (target.tagName === 'IMG' || target.tagName === 'image'))) {\n this.close();\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n // this.log('onKeyDown', e);\n if(overlayCounter.overlaysActive > 1) {\n return;\n }\n\n const key = e.key;\n\n let good = true;\n if(key === 'ArrowRight') {\n this.buttons.next.click();\n } else if(key === 'ArrowLeft') {\n this.buttons.prev.click();\n } else if(key === '-' || key === '=') {\n if(this.ctrlKeyDown) {\n this.changeZoom(key === '=');\n }\n } else {\n good = false;\n }\n\n if(e.ctrlKey || e.metaKey) {\n this.ctrlKeyDown = true;\n }\n\n if(good) {\n cancelEvent(e);\n }\n };\n\n private onKeyUp = (e: KeyboardEvent) => {\n if(overlayCounter.overlaysActive > 1) {\n return;\n }\n\n if(!(e.ctrlKey || e.metaKey)) {\n this.ctrlKeyDown = false;\n\n if(this.isZooming()) {\n this.setZoomValue();\n }\n }\n };\n\n private onWheel = (e: WheelEvent) => {\n if(overlayCounter.overlaysActive > 1 || (findUpClassName(e.target, 'media-viewer-caption') && !this.ctrlKeyDown)) {\n return;\n }\n\n cancelEvent(e);\n\n if(this.ctrlKeyDown) {\n const scrollingUp = e.deltaY < 0;\n // if(!scrollingUp && !this.isZooming()) return;\n this.changeZoom(!!scrollingUp);\n }\n };\n\n protected async setMoverToTarget(target: HTMLElement, closing = false, fromRight = 0) {\n this.dispatchEvent('setMoverBefore');\n\n const mover = this.content.mover;\n\n if(!closing) {\n mover.innerHTML = '';\n // mover.append(this.buttons.prev, this.buttons.next);\n }\n\n const zoomValue = this.isZooming() && closing /* && false */ ? this.zoomElements.rangeSelector.value : ZOOM_INITIAL_VALUE;\n /* if(!(zoomValue > 1 && closing)) */ this.removeCenterFromMover(mover);\n\n const wasActive = fromRight !== 0;\n\n const delay = rootScope.settings.animationsEnabled ? (wasActive ? 350 : 200) : 0;\n // let delay = wasActive ? 350 : 10000;\n\n /* if(wasActive) {\n this.moveTheMover(mover);\n mover = this.setNewMover();\n } */\n\n /* if(DEBUG) {\n this.log('setMoverToTarget', target, closing, wasActive, fromRight);\n } */\n\n let realParent: HTMLElement;\n\n let rect: DOMRect;\n if(target) {\n if(target instanceof AvatarElement || target.classList.contains('grid-item')/* || target.classList.contains('document-ico') */) {\n realParent = target;\n rect = target.getBoundingClientRect();\n } else if(target instanceof SVGImageElement || target.parentElement instanceof SVGForeignObjectElement) {\n realParent = findUpClassName(target, 'attachment');\n rect = realParent.getBoundingClientRect();\n } else if(target.classList.contains('profile-avatars-avatar')) {\n realParent = findUpClassName(target, 'profile-avatars-container');\n rect = realParent.getBoundingClientRect();\n\n // * if not active avatar\n if(closing && target.getBoundingClientRect().left !== rect.left) {\n target = realParent = rect = undefined;\n }\n }\n }\n\n if(!target) {\n target = this.content.media;\n }\n\n if(!rect) {\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n }\n\n let needOpacity = false;\n if(target !== this.content.media && !target.classList.contains('profile-avatars-avatar')) {\n const overflowElement = findUpClassName(realParent, 'scrollable');\n const visibleRect = getVisibleRect(realParent, overflowElement, true);\n\n if(closing && (!visibleRect || visibleRect.overflow.vertical === 2 || visibleRect.overflow.horizontal === 2)) {\n target = this.content.media;\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n } else if(visibleRect && (visibleRect.overflow.vertical === 1 || visibleRect.overflow.horizontal === 1)) {\n needOpacity = true;\n }\n }\n\n const containerRect = this.content.media.getBoundingClientRect();\n\n let transform = '';\n let left: number;\n let top: number;\n\n if(wasActive) {\n left = fromRight === 1 ? windowSize.width : -containerRect.width;\n top = containerRect.top;\n } else {\n left = rect.left;\n top = rect.top;\n }\n\n /* if(zoomValue > 1) { // 33\n // const diffX = (rect.width * zoomValue - rect.width) / 4;\n const diffX = (rect.width * zoomValue - rect.width) / 2;\n const diffY = (rect.height * zoomValue - rect.height) / 4;\n // left -= diffX;\n // top += diffY;\n } */\n\n transform += `translate3d(${left}px,${top}px,0) `;\n\n /* if(wasActive) {\n left = fromRight === 1 ? appPhotosManager.windowW / 2 : -(containerRect.width + appPhotosManager.windowW / 2);\n transform += `translate(${left}px,-50%) `;\n } else {\n left = rect.left - (appPhotosManager.windowW / 2);\n top = rect.top - (appPhotosManager.windowH / 2);\n transform += `translate(${left}px,${top}px) `;\n } */\n\n let aspecter: HTMLDivElement;\n if(target instanceof HTMLImageElement || target instanceof HTMLVideoElement || target.tagName === 'DIV') {\n if(mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter')) {\n aspecter = mover.firstElementChild as HTMLDivElement;\n\n const player = aspecter.querySelector('.ckin__player');\n if(player) {\n const video = player.firstElementChild as HTMLVideoElement;\n aspecter.append(video);\n player.remove();\n }\n\n if(!aspecter.style.cssText) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n mover.classList.remove('active');\n this.setFullAspect(aspecter, containerRect, rect);\n void mover.offsetLeft; // reflow\n mover.classList.add('active');\n }\n } else {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-viewer-aspecter'/* , 'disable-hover' */);\n mover.prepend(aspecter);\n }\n\n aspecter.style.cssText = `width: ${rect.width}px; height: ${rect.height}px; transform: scale3d(${containerRect.width / rect.width}, ${containerRect.height / rect.height}, 1);`;\n }\n\n mover.style.width = containerRect.width + 'px';\n mover.style.height = containerRect.height + 'px';\n\n // const scaleX = rect.width / (containerRect.width * zoomValue);\n // const scaleY = rect.height / (containerRect.height * zoomValue);\n const scaleX = rect.width / containerRect.width;\n const scaleY = rect.height / containerRect.height;\n if(!wasActive) {\n transform += `scale3d(${scaleX},${scaleY},1) `;\n }\n\n let borderRadius = window.getComputedStyle(realParent).getPropertyValue('border-radius');\n const brSplitted = fillPropertyValue(borderRadius) as string[];\n borderRadius = brSplitted.map((r) => (parseInt(r) / scaleX) + 'px').join(' ');\n if(!wasActive) {\n mover.style.borderRadius = borderRadius;\n }\n // let borderRadius = '0px 0px 0px 0px';\n\n if(closing && zoomValue !== 1) {\n // const width = this.moversContainer.scrollWidth * scaleX;\n // const height = this.moversContainer.scrollHeight * scaleY;\n const willBeLeft = windowSize.width / 2 - rect.width / 2;\n const willBeTop = windowSize.height / 2 - rect.height / 2;\n const left = rect.left - willBeLeft/* + (width - rect.width) / 2 */;\n const top = rect.top - willBeTop/* + (height - rect.height) / 2 */;\n this.moversContainer.style.transform = `matrix(${scaleX}, 0, 0, ${scaleY}, ${left}, ${top})`;\n } else {\n mover.style.transform = transform;\n }\n\n needOpacity && (mover.style.opacity = '0'/* !closing ? '0' : '' */);\n\n /* if(wasActive) {\n this.log('setMoverToTarget', mover.style.transform);\n } */\n\n let path: SVGPathElement;\n const isOut = target.classList.contains('is-out');\n\n const deferred = this.setMoverAnimationPromise = deferredPromise();\n const ret = {onAnimationEnd: deferred};\n\n const timeout = setTimeout(() => {\n if(!deferred.isFulfilled && !deferred.isRejected) {\n deferred.resolve();\n }\n }, 1000);\n\n deferred.finally(() => {\n this.dispatchEvent('setMoverAfter');\n\n if(this.setMoverAnimationPromise === deferred) {\n this.setMoverAnimationPromise = null;\n }\n\n clearTimeout(timeout);\n });\n\n if(!closing) {\n let mediaElement: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;\n let src: string;\n\n // if(target instanceof HTMLVideoElement) {\n const selector = 'video, img, .canvas-thumbnail';\n const queryFrom = target.matches(selector) ? target.parentElement : target;\n const elements = Array.from(queryFrom.querySelectorAll(selector)) as HTMLImageElement[];\n if(elements.length) {\n target = elements.pop();\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if(target instanceof HTMLImageElement) {\n canvas.width = target.naturalWidth;\n canvas.height = target.naturalHeight;\n } else if(target instanceof HTMLVideoElement) {\n canvas.width = target.videoWidth;\n canvas.height = target.videoHeight;\n } else if(target instanceof HTMLCanvasElement) {\n canvas.width = target.width;\n canvas.height = target.height;\n }\n\n canvas.className = 'canvas-thumbnail thumbnail media-photo';\n context.drawImage(target as HTMLImageElement | HTMLCanvasElement, 0, 0);\n target = canvas;\n }\n // }\n\n if(target.tagName === 'DIV' || target.tagName === 'AVATAR-ELEMENT') { // useContainerAsTarget\n const images = Array.from(target.querySelectorAll('img')) as HTMLImageElement[];\n const image = images.pop();\n if(image) {\n mediaElement = new Image();\n src = image.src;\n mover.append(mediaElement);\n }\n /* mediaElement = new Image();\n src = target.style.backgroundImage.slice(5, -2); */\n } else if(target instanceof HTMLImageElement) {\n mediaElement = new Image();\n src = target.src;\n } else if(target instanceof HTMLVideoElement) {\n mediaElement = createVideo();\n mediaElement.src = target.src;\n } else if(target instanceof SVGSVGElement) {\n const clipId = target.dataset.clipId;\n const newClipId = clipId + '-mv';\n\n const {width, height} = containerRect;\n\n const newSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n newSvg.setAttributeNS(null, 'width', '' + width);\n newSvg.setAttributeNS(null, 'height', '' + height);\n\n // нижние два свойства для масштабирования\n newSvg.setAttributeNS(null, 'viewBox', `0 0 ${width} ${height}`);\n newSvg.setAttributeNS(null, 'preserveAspectRatio', 'xMidYMid meet');\n\n newSvg.insertAdjacentHTML('beforeend', target.firstElementChild.outerHTML.replace(clipId, newClipId));\n newSvg.insertAdjacentHTML('beforeend', target.lastElementChild.outerHTML.replace(clipId, newClipId));\n\n // теперь надо выставить новую позицию для хвостика\n const defs = newSvg.firstElementChild;\n const use = defs.firstElementChild.firstElementChild as SVGUseElement;\n if(use instanceof SVGUseElement) {\n let transform = use.getAttributeNS(null, 'transform');\n transform = transform.replace(/translate\\((.+?), (.+?)\\) scale\\((.+?), (.+?)\\)/, (match, x, y, sX, sY) => {\n x = +x;\n if(x !== 2) {\n x = width - (2 / scaleX);\n } else {\n x = 2 / scaleX;\n }\n\n y = height;\n\n return `translate(${x}, ${y}) scale(${+sX / scaleX}, ${+sY / scaleY})`;\n });\n use.setAttributeNS(null, 'transform', transform);\n\n // и новый RECT\n path = defs.firstElementChild.lastElementChild as SVGPathElement;\n\n // код ниже нужен только чтобы скрыть моргание до момента как сработает таймаут\n let d: string;\n const br: [number, number, number, number] = borderRadius.split(' ').map((v) => parseInt(v)) as any;\n if(isOut) d = generatePathData(0, 0, width - 9 / scaleX, height, ...br);\n else d = generatePathData(9 / scaleX, 0, width - 9 / scaleX, height, ...br);\n path.setAttributeNS(null, 'd', d);\n }\n\n const foreignObject = newSvg.lastElementChild;\n foreignObject.setAttributeNS(null, 'width', '' + containerRect.width);\n foreignObject.setAttributeNS(null, 'height', '' + containerRect.height);\n\n mover.prepend(newSvg);\n } else if(target instanceof HTMLCanvasElement) {\n mediaElement = target;\n }\n\n if(aspecter) {\n aspecter.style.borderRadius = borderRadius;\n\n if(mediaElement) {\n aspecter.append(mediaElement);\n }\n }\n\n mediaElement = mover.querySelector('video, img');\n if(mediaElement instanceof HTMLImageElement) {\n mediaElement.classList.add('thumbnail');\n if(!aspecter) {\n mediaElement.style.width = containerRect.width + 'px';\n mediaElement.style.height = containerRect.height + 'px';\n }\n\n if(src) {\n await renderImageFromUrlPromise(mediaElement, src);\n }\n }/* else if(mediaElement instanceof HTMLVideoElement && mediaElement.firstElementChild && ((mediaElement.firstElementChild as HTMLSourceElement).src || src)) {\n await new Promise((resolve, reject) => {\n mediaElement.addEventListener('loadeddata', resolve);\n\n if(src) {\n (mediaElement.firstElementChild as HTMLSourceElement).src = src;\n }\n });\n } */\n\n mover.style.display = '';\n\n fastRaf(() => {\n mover.classList.add(wasActive ? 'moving' : 'active');\n });\n } else {\n /* if(mover.classList.contains('center')) {\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n } */\n\n if(target instanceof SVGSVGElement) {\n path = mover.querySelector('path');\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, false, isOut, borderRadius);\n }\n }\n\n if(target.classList.contains('media-viewer-media')) {\n mover.classList.add('hiding');\n }\n\n this.toggleWholeActive(false);\n\n // return ret;\n\n setTimeout(() => {\n mover.style.borderRadius = borderRadius;\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = borderRadius;\n }\n }, delay / 2);\n\n setTimeout(() => {\n mover.innerHTML = '';\n mover.classList.remove('moving', 'active', 'hiding');\n mover.style.cssText = 'display: none;';\n\n deferred.resolve();\n }, delay);\n\n mover.classList.remove('opening');\n\n return ret;\n }\n\n mover.classList.add('opening');\n\n // await new Promise((resolve) => setTimeout(resolve, 0));\n // await new Promise((resolve) => window.requestAnimationFrame(resolve));\n // * одного RAF'а недостаточно, иногда анимация с одним не срабатывает (преимущественно на мобильных)\n await doubleRaf();\n\n // чтобы проверить установленную позицию - раскомментировать\n // throw '';\n\n // await new Promise((resolve) => setTimeout(resolve, 5e3));\n\n mover.style.transform = `translate3d(${containerRect.left}px,${containerRect.top}px,0) scale3d(1,1,1)`;\n // mover.style.transform = `translate(-50%,-50%) scale(1,1)`;\n needOpacity && (mover.style.opacity = ''/* closing ? '0' : '' */);\n\n if(aspecter) {\n this.setFullAspect(aspecter, containerRect, rect);\n }\n\n // throw '';\n\n setTimeout(() => {\n mover.style.borderRadius = '';\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = '';\n }\n }, 0/* delay / 2 */);\n\n mover.dataset.timeout = '' + setTimeout(() => {\n mover.classList.remove('moving', 'opening');\n\n if(aspecter) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n if(mover.querySelector('video') || true) {\n mover.classList.remove('active');\n aspecter.style.cssText = '';\n void mover.offsetLeft; // reflow\n }\n\n // aspecter.classList.remove('disable-hover');\n }\n\n // эти строки нужны для установки центральной позиции, в случае ресайза это будет нужно\n mover.classList.add('center', 'no-transition');\n /* mover.style.left = mover.style.top = '50%';\n mover.style.transform = 'translate(-50%, -50%)';\n void mover.offsetLeft; // reflow */\n\n // это уже нужно для будущих анимаций\n mover.classList.add('active');\n delete mover.dataset.timeout;\n\n deferred.resolve();\n }, delay);\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, true, isOut, borderRadius);\n }\n\n return ret;\n }\n\n protected toggleWholeActive(active: boolean) {\n if(active) {\n this.wholeDiv.classList.add('active');\n } else {\n this.wholeDiv.classList.add('backwards');\n setTimeout(() => {\n this.wholeDiv.classList.remove('active');\n }, 0);\n }\n }\n\n protected setFullAspect(aspecter: HTMLDivElement, containerRect: DOMRect, rect: DOMRect) {\n /* let media = aspecter.firstElementChild;\n let proportion: number;\n if(media instanceof HTMLImageElement) {\n proportion = media.naturalWidth / media.naturalHeight;\n } else if(media instanceof HTMLVideoElement) {\n proportion = media.videoWidth / media.videoHeight;\n } */\n const proportion = containerRect.width / containerRect.height;\n\n let {width, height} = rect;\n /* if(proportion === 1) {\n aspecter.style.cssText = '';\n } else { */\n if(proportion > 0) {\n width = height * proportion;\n } else {\n height = width * proportion;\n }\n\n // this.log('will set style aspecter:', `width: ${width}px; height: ${height}px; transform: scale(${containerRect.width / width}, ${containerRect.height / height});`);\n\n aspecter.style.cssText = `width: ${width}px; height: ${height}px; transform: scale3d(${containerRect.width / width}, ${containerRect.height / height}, 1);`;\n // }\n }\n\n protected sizeTailPath(path: SVGPathElement, rect: DOMRect, scaleX: number, delay: number, upscale: boolean, isOut: boolean, borderRadius: string) {\n const start = Date.now();\n const {width, height} = rect;\n delay = delay / 2;\n\n const br = borderRadius.split(' ').map((v) => parseInt(v));\n\n const step = () => {\n const diff = Date.now() - start;\n\n let progress = delay ? diff / delay : 1;\n if(progress > 1) progress = 1;\n if(upscale) progress = 1 - progress;\n\n const _br: [number, number, number, number] = br.map((v) => v * progress) as any;\n\n let d: string;\n if(isOut) d = generatePathData(0, 0, width - (9 / scaleX * progress), height, ..._br);\n else d = generatePathData(9 / scaleX * progress, 0, width/* width - (9 / scaleX * progress) */, height, ..._br);\n path.setAttributeNS(null, 'd', d);\n\n if(diff < delay) fastRaf(step);\n };\n\n // window.requestAnimationFrame(step);\n step();\n }\n\n protected removeCenterFromMover(mover: HTMLElement) {\n if(mover.classList.contains('center')) {\n // const rect = mover.getBoundingClientRect();\n const rect = this.content.media.getBoundingClientRect();\n mover.style.transform = `translate3d(${rect.left}px,${rect.top}px,0)`;\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n mover.classList.remove('no-transition');\n }\n }\n\n protected moveTheMover(mover: HTMLElement, toLeft = true) {\n const windowW = windowSize.width;\n\n this.removeCenterFromMover(mover);\n\n // mover.classList.remove('active');\n mover.classList.add('moving');\n\n if(mover.dataset.timeout) { // и это тоже всё из-за скейла видео, так бы это не нужно было\n clearTimeout(+mover.dataset.timeout);\n }\n\n const rect = mover.getBoundingClientRect();\n\n const newTransform = mover.style.transform.replace(/translate3d\\((.+?),/, (match, p1) => {\n const x = toLeft ? -rect.width : windowW;\n // const x = toLeft ? -(rect.right + (rect.width / 2)) : windowW / 2;\n\n return match.replace(p1, x + 'px');\n });\n\n // //////this.log('set newTransform:', newTransform, mover.style.transform, toLeft);\n mover.style.transform = newTransform;\n\n setTimeout(() => {\n mover.remove();\n }, 350);\n }\n\n protected setNewMover() {\n const newMover = document.createElement('div');\n newMover.classList.add('media-viewer-mover');\n newMover.style.display = 'none';\n\n if(this.content.mover) {\n const oldMover = this.content.mover;\n oldMover.parentElement.append(newMover);\n } else {\n this.moversContainer.append(newMover);\n }\n\n return this.content.mover = newMover;\n }\n\n protected updateMediaSource(target: HTMLElement, url: string, tagName: 'video' | 'img') {\n // if(target instanceof SVGSVGElement) {\n const el = target.tagName.toLowerCase() === tagName ? target : target.querySelector(tagName) as HTMLElement;\n if(el && !findUpClassName(target, 'document')) {\n if(findUpClassName(target, 'attachment')) {\n // two parentElements because element can be contained in aspecter\n const preloader = target.parentElement.parentElement.querySelector('.preloader-container') as HTMLElement;\n if(preloader) {\n if(tagName === 'video') {\n if(preloader.classList.contains('manual')) {\n preloader.click();\n // return;\n }\n\n return;\n }\n\n preloader.remove();\n }\n }\n\n if((el as HTMLImageElement).src !== url) {\n renderImageFromUrl(el, url);\n }\n\n // ! костыль, но он тут даже и не нужен\n if(el.classList.contains('thumbnail') && el.parentElement.classList.contains('media-container-aspecter')) {\n el.classList.remove('thumbnail');\n }\n }\n /* } else {\n\n } */\n }\n\n protected setAuthorInfo(fromId: PeerId | string, timestamp: number) {\n const isPeerId = fromId.isPeerId();\n let wrapTitlePromise: Promise | HTMLElement;\n if(isPeerId) {\n wrapTitlePromise = wrapPeerTitle({\n peerId: fromId as PeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n })\n } else {\n const title = wrapTitlePromise = document.createElement('span');\n title.append(wrapEmojiText(fromId));\n title.classList.add('peer-title');\n }\n\n const oldAvatar = this.author.avatarEl;\n const newAvatar = this.author.avatarEl = (oldAvatar.cloneNode() as AvatarElement);\n\n return Promise.all([\n (this.author.avatarEl as AvatarElement).updateWithOptions({\n peerId: fromId as PeerId || NULL_PEER_ID,\n peerTitle: isPeerId ? undefined : '' + fromId\n }),\n\n wrapTitlePromise\n ]).then(([_, title]) => {\n if(this.author.avatarEl !== newAvatar) {\n return;\n }\n\n replaceContent(this.author.date, formatFullSentTime(timestamp));\n replaceContent(this.author.nameEl, title);\n oldAvatar.replaceWith(this.author.avatarEl);\n });\n }\n\n protected async _openMedia(\n media: MyDocument | MyPhoto,\n timestamp: number,\n fromId: PeerId | string,\n fromRight: number,\n target?: HTMLElement,\n reverse = false,\n prevTargets: TargetType[] = [],\n nextTargets: TargetType[] = [],\n message?: MyMessage\n /* , needLoadMore = true */\n ) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n /* if(DEBUG) {\n this.log('openMedia:', media, fromId, prevTargets, nextTargets);\n } */\n\n const setAuthorPromise = this.setAuthorInfo(fromId, timestamp);\n\n const isDocument = media._ === 'document';\n const isVideo = isDocument && media.mime_type && ((['video', 'gif'] as MyDocument['type'][]).includes(media.type) || media.mime_type.indexOf('video/') === 0);\n\n if(this.isFirstOpen) {\n // this.targetContainer = targetContainer;\n // this.needLoadMore = needLoadMore;\n this.isFirstOpen = false;\n this.listLoader.setTargets(prevTargets, nextTargets, reverse);\n (window as any).appMediaViewer = this;\n // this.loadMore = loadMore;\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n appSidebarRight.forwardTab.closeBtn.click();\n await new Promise((resolve) => setTimeout(resolve, 200));\n } */\n }\n\n if(this.listLoader.next.length < 10) {\n setTimeout(() => {\n this.listLoader.load(true);\n }, 0);\n }\n\n // if(prevTarget && (!prevTarget.parentElement || !this.isElementVisible(this.targetContainer, prevTarget))) prevTarget = null;\n // if(nextTarget && (!nextTarget.parentElement || !this.isElementVisible(this.targetContainer, nextTarget))) nextTarget = null;\n\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n\n const container = this.content.media;\n const useContainerAsTarget = !target || target === container;\n if(useContainerAsTarget) target = container;\n\n this.target = {element: target} as any;\n const tempId = ++this.tempId;\n\n if(container.firstElementChild) {\n container.innerHTML = '';\n }\n\n // ok set\n\n const wasActive = fromRight !== 0;\n if(wasActive) {\n this.moveTheMover(this.content.mover, fromRight === 1);\n this.setNewMover();\n } else {\n this.toggleOverlay(true);\n this.setGlobalListeners();\n await setAuthorPromise;\n\n if(!this.wholeDiv.parentElement) {\n this.pageEl.insertBefore(this.wholeDiv, document.getElementById('main-columns'));\n void this.wholeDiv.offsetLeft; // reflow\n }\n\n this.toggleWholeActive(true);\n\n if(!IS_MOBILE_SAFARI) {\n this.navigationItem = {\n type: 'media',\n onPop: (canAnimate) => {\n if(this.setMoverAnimationPromise) {\n return false;\n }\n\n this.close();\n }\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n }\n\n // //////this.log('wasActive:', wasActive);\n\n const mover = this.content.mover;\n\n const maxWidth = windowSize.width;\n // const maxWidth = this.pageEl.scrollWidth;\n // TODO: const maxHeight = mediaSizes.isMobile ? appPhotosManager.windowH : appPhotosManager.windowH - 100;\n let padding = 0;\n const windowH = windowSize.height;\n if(windowH < 1000000 && !mediaSizes.isMobile) {\n padding = 120;\n }\n const maxHeight = windowH - 120 - padding;\n let thumbPromise: Promise = Promise.resolve();\n const size = setAttachmentSize(media, container, maxWidth, maxHeight, mediaSizes.isMobile ? false : true, undefined, !!(isDocument && media.w && media.h)).photoSize;\n if(useContainerAsTarget) {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(media, size.type);\n let img: HTMLImageElement | HTMLCanvasElement;\n if(cacheContext.downloaded) {\n img = new Image();\n img.src = cacheContext.url;\n } else {\n const gotThumb = getStrippedThumbIfNeeded(media, cacheContext, true);\n if(gotThumb) {\n thumbPromise = gotThumb.loadPromise;\n img = gotThumb.image;\n }\n }\n\n if(img) {\n img.classList.add('thumbnail');\n container.append(img);\n }\n }\n\n // need after setAttachmentSize\n /* if(useContainerAsTarget) {\n target = target.querySelector('img, video') || target;\n } */\n\n const supportsStreaming: boolean = !!(isDocument && media.supportsStreaming);\n const preloader = supportsStreaming ? this.preloaderStreamable : this.preloader;\n\n const getCacheContext = () => {\n return this.managers.thumbsStorage.getCacheContext(media, size?.type);\n };\n\n let setMoverPromise: Promise;\n if(isVideo) {\n // //////this.log('will wrap video', media, size);\n\n // потому что для safari нужно создать элемент из event'а\n // const video = document.createElement('video');\n const useController = message && media.type !== 'gif';\n const video = /* useController ?\n appMediaPlaybackController.addMedia(message, false, true) as HTMLVideoElement :\n */createVideo({pip: useController});\n\n if(this.wholeDiv.classList.contains('no-forwards')) {\n video.addEventListener('contextmenu', cancelEvent);\n }\n\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n // return; // set and don't move\n // if(wasActive) return;\n // return;\n\n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n // const video = mover.querySelector('video') || document.createElement('video');\n\n const moverVideo = mover.querySelector('video');\n if(moverVideo) {\n moverVideo.remove();\n }\n\n // video.src = '';\n\n video.setAttribute('playsinline', 'true');\n\n // * fix for playing video if viewer is closed (https://contest.com/javascript-web-bonus/entry1425#issue11629)\n video.addEventListener('timeupdate', () => {\n if(this.tempId !== tempId) {\n video.pause();\n }\n });\n\n this.addEventListener('setMoverAfter', () => {\n video.src = '';\n video.load();\n }, {once: true});\n\n if(IS_SAFARI) {\n // test stream\n // video.controls = true;\n video.autoplay = true;\n }\n\n if(media.type === 'gif') {\n video.muted = true;\n video.autoplay = true;\n video.loop = true;\n } else if(media.duration < 60) {\n video.loop = true;\n }\n\n // if(!video.parentElement) {\n div.append(video);\n // }\n\n const canPlayThrough = new Promise((resolve) => {\n video.addEventListener('canplay', resolve, {once: true});\n });\n\n const createPlayer = () => {\n if(media.type !== 'gif') {\n video.dataset.ckin = 'default';\n video.dataset.overlay = '1';\n\n Promise.all([canPlayThrough, onAnimationEnd]).then(() => {\n if(this.tempId !== tempId) {\n return;\n }\n\n // const play = useController ? appMediaPlaybackController.willBePlayedMedia === video : true;\n const play = true;\n const player = this.videoPlayer = new VideoPlayer({\n video,\n play,\n streamable: supportsStreaming,\n onPlaybackRackMenuToggle: (open) => {\n this.wholeDiv.classList.toggle('hide-caption', !!open);\n },\n onPip: (pip) => {\n const otherMediaViewer = (window as any).appMediaViewer;\n if(!pip && otherMediaViewer && otherMediaViewer !== this) {\n this.releaseSingleMedia = undefined;\n this.close();\n return;\n }\n\n const mover = this.moversContainer.lastElementChild as HTMLElement;\n mover.classList.toggle('hiding', pip);\n this.toggleWholeActive(!pip);\n this.toggleOverlay(!pip);\n this.toggleGlobalListeners(!pip);\n\n if(this.navigationItem) {\n if(pip) appNavigationController.removeItem(this.navigationItem);\n else appNavigationController.pushItem(this.navigationItem);\n }\n\n if(useController) {\n if(pip) {\n // appMediaPlaybackController.toggleSwitchers(true);\n\n this.releaseSingleMedia(false);\n this.releaseSingleMedia = undefined;\n\n appMediaPlaybackController.setPictureInPicture(video);\n } else {\n this.releaseSingleMedia = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n }\n }\n },\n onPipClose: () => {\n // this.target = undefined;\n // this.toggleWholeActive(false);\n // this.toggleOverlay(false);\n this.close();\n }\n });\n player.addEventListener('toggleControls', (show) => {\n this.wholeDiv.classList.toggle('has-video-controls', show);\n });\n\n this.addEventListener('setMoverBefore', () => {\n this.wholeDiv.classList.remove('has-video-controls');\n this.videoPlayer.cleanup();\n this.videoPlayer = undefined;\n }, {once: true});\n\n if(this.isZooming()) {\n this.videoPlayer.lockControls(false);\n }\n /* div.append(video);\n mover.append(player.wrapper); */\n });\n }\n };\n\n if(supportsStreaming) {\n onAnimationEnd.then(() => {\n if(video.readyState < video.HAVE_FUTURE_DATA) {\n // console.log('ppp 1');\n preloader.attach(mover, true);\n }\n\n /* canPlayThrough.then(() => {\n preloader.detach();\n }); */\n });\n\n const attachCanPlay = () => {\n video.addEventListener('canplay', () => {\n // console.log('ppp 2');\n preloader.detach();\n video.parentElement.classList.remove('is-buffering');\n }, {once: true});\n };\n\n video.addEventListener('waiting', () => {\n const loading = video.networkState === video.NETWORK_LOADING;\n const isntEnoughData = video.readyState < video.HAVE_FUTURE_DATA;\n\n // this.log('video waiting for progress', loading, isntEnoughData);\n if(loading && isntEnoughData) {\n attachCanPlay();\n\n // console.log('ppp 3');\n preloader.attach(mover, true);\n\n // поставлю класс для плеера, чтобы убрать большую иконку пока прелоадер на месте\n video.parentElement.classList.add('is-buffering');\n }\n });\n\n if(this.wholeDiv.classList.contains('no-forwards')) {\n video.addEventListener('contextmenu', (e) => {\n cancelEvent(e);\n });\n }\n\n attachCanPlay();\n }\n\n // if(!video.src || media.url !== video.src) {\n const load = async() => {\n /* if(useController) {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n } */\n\n const promise: Promise = supportsStreaming ? Promise.resolve() : appDownloadManager.downloadMediaURL({media});\n\n if(!supportsStreaming) {\n onAnimationEnd.then(async() => {\n if(!(await getCacheContext()).url) {\n // console.log('ppp 4');\n preloader.attach(mover, true, promise);\n }\n });\n }\n\n Promise.all([promise, onAnimationEnd]).then(async() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed video');\n return;\n }\n\n const url = (await getCacheContext()).url;\n\n video.addEventListener('error', () => {\n toastNew({\n langPackKey: IS_MOBILE ? 'Video.Unsupported.Mobile' : 'Video.Unsupported.Desktop'\n });\n\n if(video.error.code !== 4) {\n this.log.error('Error ' + video.error.code + '; details: ' + video.error.message);\n }\n\n preloader?.detach();\n }, {once: true});\n\n if(target instanceof SVGSVGElement/* && (video.parentElement || !isSafari) */) { // if video exists\n // if(!video.parentElement) {\n div.firstElementChild.lastElementChild.append(video);\n // }\n } else {\n renderImageFromUrl(video, url);\n }\n\n // * have to set options (especially playbackRate) after src\n // * https://github.com/videojs/video.js/issues/2516\n if(useController) {\n this.releaseSingleMedia = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n\n this.addEventListener('setMoverBefore', () => {\n if(this.releaseSingleMedia) {\n this.releaseSingleMedia();\n this.releaseSingleMedia = undefined;\n }\n }, {once: true});\n }\n\n this.updateMediaSource(target, url, 'video');\n\n createPlayer();\n });\n\n return promise;\n };\n\n this.lazyLoadQueue.unshift({load});\n // } else createPlayer();\n });\n\n setMoverPromise = thumbPromise.then(set);\n } else {\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n // return; // set and don't move\n // if(wasActive) return;\n // return;\n\n const load = async() => {\n const cancellablePromise = isDocument ? appDownloadManager.downloadMediaURL({media}) : appDownloadManager.downloadMediaURL({media, thumb: size});\n\n onAnimationEnd.then(async() => {\n if(!(await getCacheContext()).url) {\n this.preloader.attachPromise(cancellablePromise);\n // this.preloader.attach(mover, true, cancellablePromise);\n }\n });\n\n Promise.all([onAnimationEnd, cancellablePromise]).then(async() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed photo');\n return;\n }\n\n // /////this.log('indochina', blob);\n\n const url = (await getCacheContext()).url;\n if(target instanceof SVGSVGElement) {\n this.updateMediaSource(target, url, 'img');\n this.updateMediaSource(mover, url, 'img');\n\n if(mediaSizes.isMobile) {\n const imgs = mover.querySelectorAll('img');\n if(imgs && imgs.length) {\n imgs.forEach((img) => {\n img.classList.remove('thumbnail'); // может здесь это вообще не нужно\n });\n }\n }\n } else {\n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n const haveImage = div.firstElementChild?.tagName === 'IMG' ? div.firstElementChild as HTMLImageElement : null;\n if(!haveImage || haveImage.src !== url) {\n const image = new Image();\n image.classList.add('thumbnail');\n\n // this.log('will renderImageFromUrl:', image, div, target);\n\n renderImageFromUrl(image, url, () => {\n this.updateMediaSource(target, url, 'img');\n\n if(haveImage) {\n fastRaf(() => {\n haveImage.remove();\n });\n }\n\n div.append(image);\n });\n }\n }\n\n // this.preloader.detach();\n }).catch((err) => {\n this.log.error(err);\n this.preloader.attach(mover);\n this.preloader.setManual();\n });\n\n return cancellablePromise;\n };\n\n this.lazyLoadQueue.unshift({load});\n });\n\n setMoverPromise = thumbPromise.then(set);\n }\n\n return this.setMoverPromise = setMoverPromise.catch(() => {\n this.setMoverAnimationPromise = null;\n }).finally(() => {\n this.setMoverPromise = null;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function fillPropertyValue(str: string) {\n const splitted = str.split(' ');\n if(splitted.length !== 4) {\n if(!splitted[0]) splitted[0] = '0px';\n for(let i = splitted.length; i < 4; ++i) {\n splitted[i] = splitted[i % 2] || splitted[0] || '0px';\n }\n }\n\n return splitted;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {IS_MOBILE_SAFARI} from '../environment/userAgent';\nimport {logger} from '../lib/logger';\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport isSwipingBackSafari from '../helpers/dom/isSwipingBackSafari';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\n\nexport type NavigationItem = {\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' |\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' |\n 'global-search' | 'voice' | 'mobile-search' | 'filters' | 'global-search-focus' |\n 'toast' | 'dropdown' | 'forum',\n onPop: (canAnimate: boolean) => boolean | void,\n onEscape?: () => boolean,\n noHistory?: boolean,\n noBlurOnPop?: boolean,\n};\n\nexport class AppNavigationController {\n private navigations: Array;\n private id: number;\n private manual: boolean;\n private log: ReturnType;\n private debug: boolean;\n private currentHash: string; // have to start with # if not empty\n private overriddenHash: string; // have to start with # if not empty\n private isPossibleSwipe: boolean;\n public onHashChange: () => void;\n\n constructor() {\n this.navigations = [];\n this.id = Date.now();\n this.manual = false;\n this.log = logger('NC');\n this.debug = true;\n this.currentHash = window.location.hash;\n this.overriddenHash = '';\n this.isPossibleSwipe = false;\n\n window.addEventListener('popstate', this.onPopState);\n window.addEventListener('keydown', this.onKeyDown, {capture: true, passive: false});\n\n if(IS_MOBILE_SAFARI) {\n const options = {passive: true};\n window.addEventListener('touchstart', this.onTouchStart, options);\n }\n\n history.scrollRestoration = 'manual';\n\n this.pushState(); // * push init state\n }\n\n private onPopState = (e: PopStateEvent) => {\n const hash = window.location.hash;\n const id: number = e.state;\n this.debug && this.log('popstate', e, this.isPossibleSwipe, hash);\n if(hash !== this.currentHash) {\n this.debug && this.log.warn(`hash changed, new=${hash}, current=${this.currentHash}, overridden=${this.overriddenHash}`);\n // fix for returning to wrong hash (e.g. chat -> archive -> chat -> 3x back)\n if(id === this.id && this.overriddenHash && this.overriddenHash !== hash) {\n this.overrideHash(this.overriddenHash);\n } else if(id/* === this.id */ && !this.overriddenHash && hash) {\n this.overrideHash();\n } else {\n this.currentHash = hash;\n this.onHashChange && this.onHashChange();\n // this.replaceState();\n return;\n }\n }\n\n if(id !== this.id/* && !this.navigations.length */) {\n this.pushState();\n\n if(!this.navigations.length) {\n return;\n }\n }\n\n const item = this.navigations.pop();\n if(!item) {\n this.pushState();\n return;\n }\n\n this.manual = !this.isPossibleSwipe;\n this.handleItem(item);\n // this.pushState(); // * prevent adding forward arrow\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n const item = this.navigations[this.navigations.length - 1];\n if(!item) return;\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\n cancelEvent(e);\n this.back(item.type);\n }\n };\n\n private onTouchStart = (e: TouchEvent) => {\n if(e.touches.length > 1) return;\n this.debug && this.log('touchstart');\n\n if(isSwipingBackSafari(e)) {\n this.isPossibleSwipe = true;\n\n window.addEventListener('touchend', () => {\n setTimeout(() => {\n this.isPossibleSwipe = false;\n }, 100);\n }, {passive: true, once: true});\n }\n\n /* const detach = () => {\n window.removeEventListener('touchend', onTouchEnd);\n window.removeEventListener('touchmove', onTouchMove);\n };\n\n let moved = false;\n const onTouchMove = (e: TouchEvent) => {\n this.debug && this.log('touchmove');\n if(e.touches.length > 1) {\n detach();\n return;\n }\n\n moved = true;\n };\n\n const onTouchEnd = (e: TouchEvent) => {\n this.debug && this.log('touchend');\n if(e.touches.length > 1 || !moved) {\n detach();\n return;\n }\n\n isPossibleSwipe = true;\n doubleRaf().then(() => {\n isPossibleSwipe = false;\n });\n\n detach();\n };\n\n window.addEventListener('touchend', onTouchEnd, options);\n window.addEventListener('touchmove', onTouchMove, options); */\n };\n\n public overrideHash(hash: string = '') {\n if(hash && hash[0] !== '#') hash = '#' + hash;\n else if(hash === '#') hash = '';\n\n if(this.currentHash === hash) {\n return;\n }\n\n this.overriddenHash = this.currentHash = hash;\n this.replaceState();\n this.pushState();\n }\n\n private handleItem(item: NavigationItem) {\n const good = item.onPop(!this.manual ? false : undefined);\n this.debug && this.log('popstate, navigation:', item, this.navigations);\n if(good === false) {\n this.pushItem(item);\n } else if(!item.noBlurOnPop) {\n blurActiveElement(); // no better place for it\n }\n\n this.manual = false;\n }\n\n public findItemByType(type: NavigationItem['type']) {\n for(let i = this.navigations.length - 1; i >= 0; --i) {\n const item = this.navigations[i];\n if(item.type === type) {\n return {item, index: i};\n }\n }\n }\n\n public back(type?: NavigationItem['type']) {\n if(type) {\n const ret = this.findItemByType(type);\n if(ret) {\n this.backByItem(ret.item, ret.index);\n return;\n }\n }\n\n history.back();\n }\n\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\n this.manual = true;\n // ! commented because 'popstate' event will be fired with delay\n // if(index !== (this.navigations.length - 1)) {\n this.navigations.splice(index, 1);\n this.handleItem(item);\n // }\n }\n\n private onItemAdded(item: NavigationItem) {\n this.debug && this.log('onItemAdded', item, this.navigations);\n\n if(!item.noHistory) {\n this.pushState();\n }\n }\n\n public pushItem(item: NavigationItem) {\n this.navigations.push(item);\n this.onItemAdded(item);\n }\n\n public unshiftItem(item: NavigationItem) {\n this.navigations.unshift(item);\n this.onItemAdded(item);\n }\n\n public spliceItems(index: number, length: number, ...items: NavigationItem[]) {\n this.navigations.splice(index, length, ...items);\n items.forEach((item) => {\n this.onItemAdded(item);\n });\n }\n\n private pushState() {\n this.debug && this.log('push');\n this.manual = false;\n history.pushState(this.id, '');\n }\n\n public replaceState() {\n this.debug && this.log.warn('replace');\n\n const url = location.origin + location.pathname + location.search + this.overriddenHash;\n history.replaceState(this.id, '', url);\n }\n\n public removeItem(item: NavigationItem) {\n if(!item) {\n return;\n }\n\n indexOfAndSplice(this.navigations, item);\n }\n\n public removeByType(type: NavigationItem['type'], single = false) {\n for(let i = this.navigations.length - 1; i >= 0; --i) {\n const item = this.navigations[i];\n if(item.type === type) {\n this.navigations.splice(i, 1);\n\n if(single) {\n break;\n }\n }\n }\n }\n}\n\nconst appNavigationController = new AppNavigationController();\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\nexport default appNavigationController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from '../lib/appManagers/appDialogsManager';\nimport Scrollable from './scrollable';\nimport InputSearch from './inputSearch';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\n\nexport class SearchGroup {\n container: HTMLDivElement;\n nameEl: HTMLDivElement;\n list: HTMLUListElement;\n\n constructor(\n public name: LangPackKey | boolean,\n public type: string,\n private clearable = true,\n className?: string,\n clickable = true,\n public autonomous = true,\n public onFound?: () => void,\n public noIcons?: boolean\n ) {\n this.list = appDialogsManager.createChatList();\n this.container = document.createElement('div');\n if(className) this.container.className = className;\n\n if(name) {\n this.nameEl = document.createElement('div');\n this.nameEl.classList.add('search-group__name');\n if(typeof(name) === 'string') {\n this.nameEl.append(i18n(name));\n }\n this.container.append(this.nameEl);\n }\n\n this.container.classList.add('search-group', 'search-group-' + type);\n this.container.append(this.list);\n this.container.style.display = 'none';\n\n if(clickable) {\n appDialogsManager.setListClickListener(this.list, onFound, undefined, autonomous);\n }\n }\n\n clear() {\n this.container.style.display = 'none';\n\n if(this.clearable) {\n this.list.innerHTML = '';\n }\n }\n\n setActive() {\n this.container.style.display = '';\n }\n\n toggle() {\n if(this.list.childElementCount) {\n this.setActive();\n } else {\n this.clear();\n }\n }\n}\n\nexport type SearchGroupType = 'contacts' | 'globalContacts' | 'messages' | string;\n\nexport default class AppSearch {\n private minMsgId = 0;\n private loadedCount = -1;\n private foundCount = -1;\n\n private searchPromise: Promise = null;\n private searchTimeout: number = 0;\n\n private query = '';\n\n private listsContainer: HTMLDivElement = null;\n\n private peerId: PeerId; // 0 - means global\n private threadId = 0;\n\n private scrollable: Scrollable;\n\n constructor(\n public container: HTMLElement,\n public searchInput: InputSearch,\n public searchGroups: {[group in SearchGroupType]: SearchGroup},\n public onSearch?: (count: number) => void,\n public noIcons?: boolean\n ) {\n this.scrollable = new Scrollable(this.container);\n this.listsContainer = this.scrollable.container as HTMLDivElement;\n for(const i in this.searchGroups) {\n this.listsContainer.append(this.searchGroups[i as SearchGroupType].container);\n }\n\n if(this.searchGroups.messages) {\n this.scrollable.setVirtualContainer(this.searchGroups.messages.list);\n }\n\n this.searchInput.onChange = (value) => {\n /* if(!value.trim()) {\n //this.peerId = 0;\n return;\n } */\n\n this.query = value;\n this.reset(false);\n this.searchMore();\n };\n\n this.scrollable.onScrolledBottom = () => {\n if(!this.query.trim()) return;\n\n if(!this.searchTimeout) {\n this.searchTimeout = window.setTimeout(() => {\n this.searchMore();\n this.searchTimeout = 0;\n }, 0);\n }\n };\n }\n\n public reset(all = true) {\n if(all) {\n this.searchInput.value = '';\n this.query = '';\n this.peerId = undefined;\n this.threadId = 0;\n }\n\n this.minMsgId = 0;\n this.loadedCount = -1;\n this.foundCount = -1;\n\n for(const i in this.searchGroups) {\n this.searchGroups[i as SearchGroupType].clear();\n }\n\n this.searchPromise = null;\n }\n\n public beginSearch(peerId?: PeerId, threadId = 0, query = '') {\n this.peerId = peerId;\n this.threadId = threadId;\n\n if(this.query !== query) {\n this.searchInput.inputField.value = query;\n }\n\n this.searchInput.input.focus();\n }\n\n public searchMore() {\n if(this.searchPromise) return this.searchPromise;\n\n const query = this.query;\n\n if(!query.trim()) {\n this.onSearch && this.onSearch(0);\n return;\n }\n\n if(this.foundCount !== -1 && this.loadedCount >= this.foundCount) {\n return Promise.resolve();\n }\n\n const maxId = this.minMsgId || 0;\n\n return this.searchPromise = rootScope.managers.appMessagesManager.getSearch({\n peerId: this.peerId,\n query,\n inputFilter: {_: 'inputMessagesFilterEmpty'},\n maxId,\n limit: 20,\n threadId: this.threadId\n }).then((res) => {\n this.searchPromise = null;\n\n if(this.searchInput.value !== query) {\n return;\n }\n\n // console.log('input search result:', this.peerId, query, null, maxId, 20, res);\n\n const {count, history} = res;\n\n if(history.length && history[0].mid === this.minMsgId) {\n history.shift();\n }\n\n const searchGroup = this.searchGroups.messages;\n\n history.forEach((message) => {\n try {\n const peerId = this.peerId ? message.fromId : message.peerId;\n appDialogsManager.addDialogAndSetLastMessage({\n peerId,\n container: this.scrollable/* searchGroup.list */,\n avatarSize: 'bigger',\n meAsSaved: false,\n message,\n query,\n noIcons: this.noIcons\n });\n } catch(err) {\n console.error('[appSearch] render search result', err);\n }\n });\n\n searchGroup.toggle();\n\n this.minMsgId = history.length && history[history.length - 1].mid;\n\n if(this.loadedCount === -1) {\n this.loadedCount = 0;\n }\n this.loadedCount += history.length;\n\n if(this.foundCount === -1) {\n this.foundCount = count;\n\n if(searchGroup.nameEl) {\n replaceContent(searchGroup.nameEl, i18n(count ? 'Chat.Search.MessagesFound' : 'Chat.Search.NoMessagesFound', [count]));\n }\n\n this.onSearch && this.onSearch(this.foundCount);\n }\n }).catch((err) => {\n console.error('search error', err);\n this.searchPromise = null;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyInputMessagesFilter, MyMessage} from '../lib/appManagers/appMessagesManager';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../lib/appManagers/appDialogsManager';\nimport {logger} from '../lib/logger';\nimport rootScope from '../lib/rootScope';\nimport {SearchGroup, SearchGroupType} from './appSearch';\nimport {horizontalMenu} from './horizontalMenu';\nimport LazyLoadQueue from './lazyLoadQueue';\nimport {putPreloader} from './putPreloader';\nimport ripple from './ripple';\nimport Scrollable, {ScrollableX} from './scrollable';\nimport useHeavyAnimationCheck, {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport I18n, {LangPackKey, i18n} from '../lib/langPack';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport {getMiddleware, Middleware} from '../helpers/middleware';\nimport {ChannelParticipant, Chat, ChatFull, ChatParticipant, ChatParticipants, Document, Message, MessageMedia, Photo, WebPage} from '../layer';\nimport SortedUserList from './sortedUserList';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport appSidebarRight from './sidebarRight';\nimport mediaSizes from '../helpers/mediaSizes';\nimport appImManager from '../lib/appManagers/appImManager';\nimport positionElementByIndex from '../helpers/dom/positionElementByIndex';\nimport cleanSearchText from '../helpers/cleanSearchText';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport handleTabSwipe from '../helpers/dom/handleTabSwipe';\nimport windowSize from '../helpers/windowSize';\nimport {formatPhoneNumber} from '../helpers/formatPhoneNumber';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from './buttonMenu';\nimport PopupForward from './popups/forward';\nimport PopupDeleteMessages from './popups/deleteMessages';\nimport Row from './row';\nimport htmlToDocumentFragment from '../helpers/dom/htmlToDocumentFragment';\nimport {SearchSelection} from './chat/selection';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport AppMediaViewer from './appMediaViewer';\nimport lockTouchScroll from '../helpers/dom/lockTouchScroll';\nimport copy from '../helpers/object/copy';\nimport getObjectKeysAndSort from '../helpers/object/getObjectKeysAndSort';\nimport safeAssign from '../helpers/object/safeAssign';\nimport escapeRegExp from '../helpers/string/escapeRegExp';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport {ScrollStartCallbackDimensions} from '../helpers/fastSmoothScroll';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport wrapWebPageDescription from './wrappers/webPageDescription';\nimport wrapWebPageTitle from './wrappers/webPageTitle';\nimport wrapAbbreviation from '../lib/richTextProcessor/wrapAbbreviation';\nimport matchUrl from '../lib/richTextProcessor/matchUrl';\nimport wrapPlainText from '../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport wrapSenderToPeer from './wrappers/senderToPeer';\nimport wrapSentTime from './wrappers/sentTime';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport filterMessagesByInputFilter from '../lib/appManagers/utils/messages/filterMessagesByInputFilter';\nimport getChatMembersString from './wrappers/getChatMembersString';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport getParticipantPeerId from '../lib/appManagers/utils/chats/getParticipantPeerId';\nimport {Awaited} from '../types';\nimport {attachContextMenuListener} from '../helpers/dom/attachContextMenuListener';\nimport contextMenuController from '../helpers/contextMenuController';\nimport positionMenu from '../helpers/positionMenu';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport SwipeHandler from './swipeHandler';\nimport wrapDocument from './wrappers/document';\nimport wrapPhoto from './wrappers/photo';\nimport wrapVideo from './wrappers/video';\nimport noop from '../helpers/noop';\nimport wrapMediaSpoiler, {onMediaSpoilerClick} from './wrappers/mediaSpoiler';\n\n// const testScroll = false;\n\nexport type SearchSuperType = MyInputMessagesFilter/* | 'members' */;\nexport type SearchSuperContext = {\n peerId: PeerId,\n inputFilter: {_: MyInputMessagesFilter},\n query?: string,\n maxId?: number,\n folderId?: number,\n threadId?: number,\n date?: number,\n nextRate?: number,\n minDate?: number,\n maxDate?: number\n};\n\nexport type SearchSuperMediaType = 'members' | 'media' | 'files' | 'links' | 'music' | 'chats' | 'voice';\nexport type SearchSuperMediaTab = {\n inputFilter: SearchSuperType,\n name: LangPackKey,\n type: SearchSuperMediaType,\n contentTab?: HTMLElement,\n menuTab?: HTMLElement,\n scroll?: {scrollTop: number, scrollHeight: number}\n};\n\nclass SearchContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify?: () => boolean | Promise, withSelection?: true})[];\n private element: HTMLElement;\n private target: HTMLElement;\n private peerId: PeerId;\n private mid: number;\n private isSelected: boolean;\n private managers: AppManagers;\n\n constructor(\n private attachTo: HTMLElement,\n private searchSuper: AppSearchSuper,\n private listenerSetter: ListenerSetter\n ) {\n this.managers = searchSuper.managers;\n\n const onContextMenu: Parameters[1] = (e) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let item: HTMLElement;\n try {\n item = findUpClassName(e.target, 'search-super-item');\n } catch(e) {}\n\n if(!item) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n const r = async() => {\n this.target = item;\n this.peerId = item.dataset.peerId.toPeerId();\n this.mid = +item.dataset.mid;\n this.isSelected = searchSuper.selection.isMidSelected(this.peerId, this.mid);\n\n await Promise.all(this.buttons.map(async(button) => {\n let good: boolean;\n\n if(this.isSelected && !button.withSelection) {\n good = false;\n } else {\n good = button.verify ? await button.verify() : true;\n }\n\n button.element.classList.toggle('hide', !good);\n }));\n\n item.classList.add('menu-open');\n\n positionMenu(e, this.element);\n contextMenuController.openBtnMenu(this.element, () => {\n item.classList.remove('menu-open');\n });\n };\n\n r();\n };\n\n if(IS_TOUCH_SUPPORTED) {\n\n } else {\n attachContextMenuListener(attachTo, onContextMenu as any, listenerSetter);\n }\n }\n\n private init() {\n this.buttons = [{\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick,\n verify: async() => this.managers.appMessagesManager.canForward(await this.managers.appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'forward',\n text: 'Message.Context.Selection.Forward',\n onClick: this.onForwardClick,\n verify: () => this.isSelected &&\n !this.searchSuper.selection.selectionForwardBtn.classList.contains('hide'),\n withSelection: true\n }, {\n icon: 'message',\n text: 'Message.Context.Goto',\n onClick: this.onGotoClick,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Select',\n onClick: this.onSelectClick\n }, {\n icon: 'select',\n text: 'Message.Context.Selection.Clear',\n onClick: this.onClearSelectionClick,\n verify: () => this.isSelected,\n withSelection: true\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: async() => this.managers.appMessagesManager.canDeleteMessage(await this.managers.appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'delete danger',\n text: 'Message.Context.Selection.Delete',\n onClick: this.onDeleteClick,\n verify: () => this.isSelected && !this.searchSuper.selection.selectionDeleteBtn.classList.contains('hide'),\n withSelection: true\n }];\n\n this.element = ButtonMenuSync({buttons: this.buttons, listenerSetter: this.listenerSetter});\n this.element.classList.add('search-contextmenu', 'contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onGotoClick = () => {\n appImManager.setInnerPeer({\n peerId: this.peerId,\n lastMsgId: this.mid,\n threadId: this.searchSuper.searchContext.threadId\n });\n };\n\n private onForwardClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionForwardBtn);\n } else {\n new PopupForward({\n [this.peerId]: [this.mid]\n });\n }\n };\n\n private onSelectClick = () => {\n this.searchSuper.selection.toggleByElement(this.target);\n };\n\n private onClearSelectionClick = () => {\n this.searchSuper.selection.cancelSelection();\n };\n\n private onDeleteClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionDeleteBtn);\n } else {\n new PopupDeleteMessages(this.peerId, [this.mid], 'chat');\n }\n };\n}\n\nexport type ProcessSearchSuperResult = {\n message: Message.message,\n middleware: Middleware,\n promises: Promise[],\n elemsToAppend: {element: HTMLElement, message: any}[],\n inputFilter: MyInputMessagesFilter,\n searchGroup?: SearchGroup\n};\n\nexport default class AppSearchSuper {\n public tabs: {[t in SearchSuperType]: HTMLDivElement} = {} as any;\n\n public mediaTab: SearchSuperMediaTab;\n\n public container: HTMLElement;\n public nav: HTMLElement;\n public navScrollableContainer: HTMLDivElement;\n public tabsContainer: HTMLElement;\n public navScrollable: ScrollableX;\n private tabsMenu: HTMLElement;\n private prevTabId = -1;\n\n private lazyLoadQueue = new LazyLoadQueue();\n public middleware = getMiddleware();\n\n public historyStorage: Partial<{[type in SearchSuperType]: {mid: number, peerId: PeerId}[]}> = {};\n public usedFromHistory: Partial<{[type in SearchSuperType]: number}> = {};\n\n public searchContext: SearchSuperContext;\n public loadMutex: Promise = Promise.resolve();\n\n private nextRates: Partial<{[type in SearchSuperType]: number}> = {};\n private loadPromises: Partial<{[type in SearchSuperType]: Promise}> = {};\n private loaded: Partial<{[type in SearchSuperType]: boolean}> = {};\n private loadedChats = false;\n private firstLoad = true;\n\n private log = logger('SEARCH-SUPER');\n public selectTab: ReturnType;\n\n private monthContainers: Partial<{\n [type in SearchSuperType]: {\n [timestamp: number]: {\n container: HTMLElement,\n items: HTMLElement\n }\n }\n }> = {};\n\n private searchGroupMedia: SearchGroup;\n\n public mediaTabsMap: Map = new Map();\n\n private membersList: SortedUserList;\n\n private skipScroll: boolean;\n\n // * arguments\n public mediaTabs: SearchSuperMediaTab[];\n public scrollable: Scrollable;\n public searchGroups?: {[group in SearchGroupType]: SearchGroup};\n public asChatList? = false;\n public groupByMonth? = true;\n public hideEmptyTabs? = true;\n public onChangeTab?: (mediaTab: SearchSuperMediaTab) => void;\n public showSender? = false;\n\n private searchContextMenu: SearchContextMenu;\n public selection: SearchSelection;\n\n public scrollStartCallback: (dimensions: ScrollStartCallbackDimensions) => void;\n\n public managers: AppManagers;\n private loadFirstTimePromise: Promise;\n\n private listenerSetter: ListenerSetter;\n private swipeHandler: SwipeHandler;\n\n constructor(options: Pick) {\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('search-super');\n\n this.listenerSetter = new ListenerSetter();\n this.searchContextMenu = new SearchContextMenu(this.container, this, this.listenerSetter);\n this.selection = new SearchSelection(this, this.managers, this.listenerSetter);\n\n const navScrollableContainer = this.navScrollableContainer = document.createElement('div');\n navScrollableContainer.classList.add('search-super-tabs-scrollable', 'menu-horizontal-scrollable', 'sticky');\n\n const navScrollable = this.navScrollable = new ScrollableX(navScrollableContainer);\n navScrollable.container.classList.add('search-super-nav-scrollable');\n\n const nav = this.nav = document.createElement('nav');\n nav.classList.add('search-super-tabs', 'menu-horizontal-div');\n this.tabsMenu = nav;\n\n navScrollable.container.append(nav);\n\n for(const mediaTab of this.mediaTabs) {\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const i = document.createElement('i');\n\n span.append(i18n(mediaTab.name));\n span.append(i);\n\n menuTab.append(span);\n\n ripple(menuTab);\n\n this.tabsMenu.append(menuTab);\n\n this.mediaTabsMap.set(mediaTab.type, mediaTab);\n\n mediaTab.menuTab = menuTab;\n }\n\n this.tabsContainer = document.createElement('div');\n this.tabsContainer.classList.add('search-super-tabs-container', 'tabs-container');\n\n let unlockScroll: ReturnType;\n if(IS_TOUCH_SUPPORTED) {\n this.swipeHandler = handleTabSwipe({\n element: this.tabsContainer,\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1;\n yDiff *= -1;\n const prevId = this.selectTab.prevId();\n const children = Array.from(this.tabsMenu.children) as HTMLElement[];\n let idx: number;\n if(xDiff > 0) {\n for(let i = prevId + 1; i < children.length; ++i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n } else {\n for(let i = prevId - 1; i >= 0; --i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n }\n\n if(idx !== undefined) {\n unlockScroll = lockTouchScroll(this.tabsContainer);\n this.selectTab(idx);\n }\n }\n });\n }\n\n for(const mediaTab of this.mediaTabs) {\n const container = document.createElement('div');\n container.classList.add('search-super-container-' + mediaTab.type, 'tabs-tab');\n\n const content = document.createElement('div');\n content.classList.add('search-super-content-' + mediaTab.type);\n\n container.append(content);\n\n this.tabsContainer.append(container);\n\n this.tabs[mediaTab.inputFilter] = content;\n\n mediaTab.contentTab = content;\n }\n\n this.container.append(navScrollableContainer, this.tabsContainer);\n\n // * construct end\n\n this.searchGroupMedia = new SearchGroup(false, 'messages', true);\n\n this.scrollable.onScrolledBottom = () => {\n if(this.mediaTab.contentTab && this.canLoadMediaTab(this.mediaTab)/* && false */) {\n // this.log('onScrolledBottom will load media');\n this.load(true);\n }\n };\n // this.scroll.attachSentinels(undefined, 400);\n\n this.selectTab = horizontalMenu(this.tabsMenu, this.tabsContainer, (id, tabContent, animate) => {\n if(this.prevTabId === id && !this.skipScroll) {\n this.scrollable.scrollIntoViewNew({\n element: this.container,\n position: 'start',\n startCallback: this.scrollStartCallback\n });\n return;\n }\n\n const newMediaTab = this.mediaTabs[id];\n if(this.onChangeTab) {\n this.onChangeTab(newMediaTab);\n }\n\n const fromMediaTab = this.mediaTab;\n this.mediaTab = newMediaTab;\n\n if(this.prevTabId !== -1 && animate) {\n this.onTransitionStart();\n }\n\n if(this.skipScroll) {\n this.skipScroll = false;\n } else {\n const offsetTop = this.container.offsetTop;\n let scrollTop = this.scrollable.scrollTop;\n if(scrollTop < offsetTop) {\n this.scrollable.scrollIntoViewNew({\n element: this.container,\n position: 'start',\n startCallback: this.scrollStartCallback\n });\n scrollTop = offsetTop;\n }\n\n fromMediaTab.scroll = {scrollTop: scrollTop, scrollHeight: this.scrollable.scrollHeight};\n\n if(newMediaTab.scroll === undefined) {\n const rect = this.container.getBoundingClientRect();\n const rect2 = this.container.parentElement.getBoundingClientRect();\n const diff = rect.y - rect2.y;\n\n if(scrollTop > diff) {\n newMediaTab.scroll = {scrollTop: diff, scrollHeight: 0};\n }\n }\n\n if(newMediaTab.scroll) {\n const diff = fromMediaTab.scroll.scrollTop - newMediaTab.scroll.scrollTop;\n // console.log('what you gonna do', this.goingHard, diff);\n\n // this.scrollable.scrollTop = scrollTop;\n if(diff/* && diff < 0 */) {\n /* if(diff > -(fromMediaTab.contentTab.scrollHeight + this.nav.scrollHeight)) {\n fromMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n this.scrollable.scrollTop = scrollTop - diff;\n } else { */\n newMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n // }\n }\n }\n }\n\n /* if(this.prevTabId !== -1 && nav.offsetTop) {\n this.scrollable.scrollTop -= nav.offsetTop;\n } */\n\n /* this.log('setVirtualContainer', id, this.sharedMediaSelected, this.sharedMediaSelected.childElementCount);\n this.scroll.setVirtualContainer(this.sharedMediaSelected); */\n\n if(this.prevTabId !== -1 && !newMediaTab.contentTab.childElementCount) { // quick brown fix\n // this.contentContainer.classList.remove('loaded');\n this.load(true);\n }\n\n this.prevTabId = id;\n }, () => {\n this.scrollable.onScroll();\n\n // console.log('what y', this.tabSelected.style.transform);\n if(this.mediaTab.scroll !== undefined) {\n this.mediaTab.contentTab.style.transform = '';\n this.scrollable.scrollTop = this.mediaTab.scroll.scrollTop;\n }\n\n if(unlockScroll) {\n unlockScroll();\n unlockScroll = undefined;\n }\n\n this.onTransitionEnd();\n }, undefined, navScrollable, this.listenerSetter);\n\n attachClickEvent(this.tabsContainer, (e) => {\n if(this.selection.isSelecting) {\n cancelEvent(e);\n this.selection.toggleByElement(findUpClassName(e.target, 'search-super-item'));\n }\n }, {capture: true, passive: false, listenerSetter: this.listenerSetter});\n\n const onMediaClick = async(className: string, targetClassName: string, inputFilter: MyInputMessagesFilter, e: MouseEvent) => {\n const target = findUpClassName(e.target as HTMLDivElement, className);\n if(!target) return;\n\n const mid = +target.dataset.mid;\n if(!mid) {\n this.log.warn('no messageId by click on target:', target);\n return;\n }\n\n const mediaSpoiler: HTMLElement = target.querySelector('.media-spoiler-container');\n if(mediaSpoiler) {\n onMediaSpoilerClick({\n event: e,\n mediaSpoiler\n })\n return;\n }\n\n const peerId = target.dataset.peerId.toPeerId();\n\n const targets = (Array.from(this.tabs[inputFilter].querySelectorAll('.' + targetClassName)) as HTMLElement[]).map((el) => {\n const containerEl = findUpClassName(el, className);\n return {\n element: el,\n mid: +containerEl.dataset.mid,\n peerId: containerEl.dataset.peerId.toPeerId()\n };\n });\n\n // const ids = Object.keys(this.mediaDivsByIds).map((k) => +k).sort((a, b) => a - b);\n const idx = targets.findIndex((item) => item.mid === mid && item.peerId === peerId);\n\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n new AppMediaViewer()\n .setSearchContext(this.copySearchContext(inputFilter))\n .openMedia(message, targets[idx].element, 0, false, targets.slice(0, idx), targets.slice(idx + 1));\n };\n\n attachClickEvent(this.tabs.inputMessagesFilterPhotoVideo, onMediaClick.bind(null, 'grid-item', 'grid-item', 'inputMessagesFilterPhotoVideo'), {listenerSetter: this.listenerSetter});\n attachClickEvent(this.tabs.inputMessagesFilterDocument, onMediaClick.bind(null, 'document-with-thumb', 'media-container', 'inputMessagesFilterDocument'), {listenerSetter: this.listenerSetter});\n\n /* attachClickEvent(this.tabs.inputMessagesFilterUrl, (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') {\n return;\n }\n\n try {\n const a = findUpClassName(target, 'row').querySelector('.anchor-url:last-child') as HTMLAnchorElement;\n a.click();\n } catch(err) {}\n }); */\n\n this.mediaTab = this.mediaTabs[0];\n\n useHeavyAnimationCheck(() => {\n this.lazyLoadQueue.lock();\n }, () => {\n this.lazyLoadQueue.unlockAndRefresh(); // ! maybe not so efficient\n }, this.listenerSetter);\n }\n\n private onTransitionStart = () => {\n this.container.classList.add('sliding');\n };\n\n private onTransitionEnd = () => {\n this.container.classList.remove('sliding');\n };\n\n public filterMessagesByType(messages: any[], type: SearchSuperType): MyMessage[] {\n return filterMessagesByInputFilter(type, messages, messages.length);\n }\n\n private processEmptyFilter({message, searchGroup}: ProcessSearchSuperResult) {\n const loadPromises: Promise[] = [];\n const dialogElement = appDialogsManager.addDialogNew({\n peerId: message.peerId,\n container: searchGroup.list,\n avatarSize: 'bigger',\n loadPromises\n });\n\n const setLastMessagePromise = appDialogsManager.setLastMessageN({\n dialog: {\n _: 'dialog',\n peerId: message.peerId\n } as any,\n lastMessage: message,\n dialogElement,\n highlightWord: this.searchContext.query\n });\n\n loadPromises.push(setLastMessagePromise);\n return Promise.all(loadPromises).then(noop);\n }\n\n private async processPhotoVideoFilter({message, promises, middleware}: ProcessSearchSuperResult) {\n const media = getMediaFromMessage(message);\n\n const div = document.createElement('div');\n div.classList.add('grid-item');\n // this.log(message, photo);\n\n let wrapped: Awaited>;\n const size = choosePhotoSize(media, 200, 200);\n if(media._ !== 'photo') {\n wrapped = await (await wrapVideo({\n doc: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n onlyPreview: true,\n withoutPreloader: true,\n noPlayButton: true,\n photoSize: size\n })).thumb;\n } else {\n wrapped = await wrapPhoto({\n photo: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n noBlur: true,\n size\n });\n }\n\n if((message.media as MessageMedia.messageMediaPhoto).pFlags.spoiler) {\n const mediaSpoiler = await wrapMediaSpoiler({\n animationGroup: 'chat',\n media,\n middleware,\n width: 140,\n height: 140,\n multiply: 0.3\n });\n\n div.append(mediaSpoiler);\n }\n\n [\n wrapped.images.thumb,\n wrapped.images.full\n ].filter(Boolean).forEach((image) => {\n image.classList.add('grid-item-media');\n });\n\n promises.push(wrapped.loadPromises.thumb);\n\n return {element: div, message};\n }\n\n private async processDocumentFilter({message, inputFilter}: ProcessSearchSuperResult) {\n const document = getMediaFromMessage(message) as Document.document;\n const showSender = this.showSender || (['voice', 'round'] as MyDocument['type'][]).includes(document.type);\n\n const div = await wrapDocument({\n message,\n withTime: !showSender,\n fontWeight: 400,\n voiceAsMusic: true,\n showSender,\n searchContext: this.copySearchContext(inputFilter),\n lazyLoadQueue: this.lazyLoadQueue,\n autoDownloadSize: 0\n });\n\n if((['audio', 'voice', 'round'] as MyDocument['type'][]).includes(document.type)) {\n div.classList.add('audio-48');\n }\n\n return {message, element: div};\n }\n\n private async processUrlFilter({message, promises, middleware}: ProcessSearchSuperResult) {\n let webPage = (message.media as MessageMedia.messageMediaWebPage)?.webpage as WebPage.webPage | WebPage.webPageEmpty;\n\n if(!webPage) {\n const entity = message.totalEntities ? message.totalEntities.find((e: any) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') : null;\n let url: string, display_url: string, sliced: string;\n\n if(!entity) {\n const match = matchUrl(message.message);\n if(!match) {\n return;\n }\n\n url = match[0];\n } else {\n sliced = message.message.slice(entity.offset, entity.offset + entity.length);\n }\n\n if(entity?._ === 'messageEntityTextUrl') {\n url = entity.url;\n // display_url = sliced;\n } else {\n url = url || sliced;\n }\n\n display_url = url;\n\n const same = message.message === url;\n if(!url.match(/^(ftp|http|https):\\/\\//)) {\n display_url = 'https://' + url;\n url = url.includes('@') ? url : 'https://' + url;\n }\n\n display_url = new URL(display_url).hostname;\n\n webPage = {\n _: 'webPage',\n url,\n display_url,\n id: '',\n hash: 0\n };\n\n if(!same) {\n webPage.description = message.message;\n }\n }\n\n if(webPage._ === 'webPageEmpty') {\n return;\n }\n\n const previewDiv = document.createElement('div');\n previewDiv.classList.add('preview');\n\n // this.log('wrapping webpage', webpage);\n\n if(webPage.photo) {\n const res = wrapPhoto({\n container: previewDiv,\n message: null,\n photo: webPage.photo as Photo.photo,\n boxWidth: 0,\n boxHeight: 0,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n size: choosePhotoSize(webPage.photo as Photo.photo, 60, 60, false),\n loadPromises: promises,\n noBlur: true\n });\n } else {\n previewDiv.classList.add('empty');\n setInnerHTML(previewDiv, wrapAbbreviation(webPage.title || webPage.display_url || webPage.description || webPage.url, true));\n }\n\n const title = wrapWebPageTitle(webPage);\n\n const subtitleFragment = wrapWebPageDescription(webPage);\n const aFragment = htmlToDocumentFragment(wrapRichText(webPage.url || ''));\n const a = aFragment.firstElementChild;\n if(a instanceof HTMLAnchorElement) {\n try { // can have 'URIError: URI malformed'\n a.innerText = decodeURIComponent(a.href);\n } catch(err) {\n\n }\n }\n\n if(subtitleFragment.firstChild) {\n subtitleFragment.append('\\n');\n }\n\n subtitleFragment.append(a);\n\n if(this.showSender) {\n subtitleFragment.append('\\n', await wrapSenderToPeer(message));\n }\n\n if(!title.textContent) {\n // title = new URL(webpage.url).hostname;\n title.append(wrapPlainText(webPage.display_url.split('/', 1)[0]));\n }\n\n const row = new Row({\n title,\n titleRight: wrapSentTime(message),\n subtitle: subtitleFragment,\n havePadding: true,\n clickable: true,\n noRipple: true\n });\n\n row.applyMediaElement(previewDiv, 'big');\n\n if(row.container.innerText.trim().length) {\n return {message, element: row.container};\n }\n }\n\n public async performSearchResult(messages: any[], mediaTab: SearchSuperMediaTab, append = true) {\n const elemsToAppend: {element: HTMLElement, message: any}[] = [];\n const sharedMediaDiv: HTMLElement = mediaTab.contentTab;\n const promises: Promise[] = [];\n const middleware = this.middleware.get();\n let inputFilter = mediaTab.inputFilter;\n\n await getHeavyAnimationPromise();\n\n let searchGroup: SearchGroup;\n if(inputFilter === 'inputMessagesFilterPhotoVideo' && !!this.searchContext.query.trim()) {\n inputFilter = 'inputMessagesFilterEmpty';\n searchGroup = this.searchGroupMedia;\n sharedMediaDiv.append(searchGroup.container);\n } else if(inputFilter === 'inputMessagesFilterEmpty') {\n searchGroup = this.searchGroups.messages;\n }\n\n const options: ProcessSearchSuperResult = {\n elemsToAppend,\n inputFilter,\n message: undefined,\n middleware,\n promises,\n searchGroup\n };\n\n let processCallback: (options: ProcessSearchSuperResult) => any;\n\n // https://core.telegram.org/type/MessagesFilter\n switch(inputFilter) {\n case 'inputMessagesFilterEmpty': {\n processCallback = this.processEmptyFilter;\n break;\n }\n\n case 'inputMessagesFilterPhotoVideo': {\n processCallback = this.processPhotoVideoFilter;\n break;\n }\n\n case 'inputMessagesFilterVoice':\n case 'inputMessagesFilterRoundVoice':\n case 'inputMessagesFilterMusic':\n case 'inputMessagesFilterDocument': {\n processCallback = this.processDocumentFilter;\n break;\n }\n\n case 'inputMessagesFilterUrl': {\n processCallback = this.processUrlFilter;\n break;\n }\n\n default:\n // this.log.warn('death is my friend', messages);\n break;\n }\n\n if(processCallback) {\n processCallback = processCallback.bind(this);\n\n type K = {element: HTMLElement, message: Message.message | Message.messageService};\n const results: (Promise | K)[] = messages.map(async(message) => {\n try {\n options.message = message;\n return await processCallback(options);\n } catch(err) {\n this.log.error('error rendering filter', inputFilter, options, message, err);\n }\n });\n\n const awaited = (await Promise.all(results)).filter(Boolean);\n elemsToAppend.push(...awaited);\n }\n\n if(searchGroup && searchGroup.list.childElementCount) {\n searchGroup.setActive();\n }\n\n if(this.loadMutex) {\n promises.push(this.loadMutex);\n }\n\n if(promises.length) {\n await Promise.all(promises);\n if(!middleware()) {\n // this.log.warn('peer changed');\n return;\n }\n }\n\n if(elemsToAppend.length) {\n const method = append ? 'append' : 'prepend';\n elemsToAppend.forEach((details) => {\n const {element, message} = details;\n if(!message) {\n debugger;\n }\n\n const monthContainer = this.getMonthContainerByTimestamp(this.groupByMonth ? message.date : 0, inputFilter);\n element.classList.add('search-super-item');\n element.dataset.mid = '' + message.mid;\n element.dataset.peerId = '' + message.peerId;\n monthContainer.items[method](element);\n\n if(this.selection?.isSelecting) {\n this.selection.toggleElementCheckbox(element, true);\n }\n });\n }\n\n // if(type !== 'inputMessagesFilterEmpty') {\n this.afterPerforming(inputFilter === 'inputMessagesFilterEmpty' ? 1 : elemsToAppend.length, sharedMediaDiv);\n // }\n }\n\n private afterPerforming(length: number, contentTab: HTMLElement) {\n if(contentTab) {\n const parent = contentTab.parentElement;\n Array.from(parent.children).slice(1).forEach((child) => {\n child.remove();\n });\n\n // this.contentContainer.classList.add('loaded');\n\n if(!length && !contentTab.childElementCount) {\n const div = document.createElement('div');\n div.innerText = 'Nothing interesting here yet...';\n div.classList.add('position-center', 'text-center', 'content-empty', 'no-select');\n\n parent.append(div);\n }\n }\n }\n\n private loadChats() {\n const renderedPeerIds: Set = new Set();\n const middleware = this.middleware.get();\n\n for(const i in this.searchGroups) {\n const group = this.searchGroups[i as SearchGroupType];\n this.tabs.inputMessagesFilterEmpty.append(group.container);\n group.clear();\n }\n\n const query = this.searchContext.query;\n if(query) {\n const setResults = (results: PeerId[], group: SearchGroup, showMembersCount = false) => {\n results.map((peerId) => {\n if(renderedPeerIds.has(peerId)) {\n return;\n }\n\n renderedPeerIds.add(peerId);\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: group.list,\n avatarSize: 'abitbigger',\n autonomous: group.autonomous\n });\n\n return {dom, peerId};\n }).filter(Boolean).forEach(async({dom, peerId}) => {\n const peer = await this.managers.appPeersManager.getPeer(peerId);\n if(showMembersCount && ((peer as Chat.channel).participants_count || (peer as any).participants)) {\n const regExp = new RegExp(`(${escapeRegExp(query)}|${escapeRegExp(cleanSearchText(query))})`, 'gi');\n dom.titleSpan.innerHTML = dom.titleSpan.innerHTML.replace(regExp, '$1');\n dom.lastMessageSpan.append(await getChatMembersString(peerId.toChatId()));\n } else if(peerId === rootScope.myId) {\n dom.lastMessageSpan.append(i18n('Presence.YourChat'));\n } else {\n let username = await this.managers.appPeersManager.getPeerUsername(peerId);\n if(!username) {\n const user = await this.managers.appUsersManager.getUser(peerId);\n if(user && user.phone) {\n username = '+' + formatPhoneNumber(user.phone).formatted;\n }\n } else {\n username = '@' + username;\n }\n\n dom.lastMessageSpan.textContent = username;\n }\n });\n\n group.toggle();\n };\n\n const onLoad = (arg: T) => {\n if(!middleware()) {\n return;\n }\n\n // this.loadedContacts = true;\n\n return arg;\n };\n\n return Promise.all([\n this.managers.appUsersManager.getContactsPeerIds(query, true, undefined, 10)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts, this.searchGroups.contacts, true);\n }\n }),\n\n this.managers.appUsersManager.searchContacts(query, 20)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts.my_results, this.searchGroups.contacts, true);\n setResults(contacts.results/* .concat(contacts.results, contacts.results, contacts.results) */, this.searchGroups.globalContacts);\n\n this.searchGroups.globalContacts.container.classList.add('is-short');\n\n if(this.searchGroups.globalContacts.nameEl.lastElementChild !== this.searchGroups.globalContacts.nameEl.firstElementChild) {\n this.searchGroups.globalContacts.nameEl.lastElementChild.remove();\n }\n\n if(this.searchGroups.globalContacts.list.childElementCount > 3) {\n const showMore = document.createElement('div');\n showMore.classList.add('search-group__show-more');\n const intlElement = new I18n.IntlElement({\n key: 'Separator.ShowMore'\n });\n showMore.append(intlElement.element);\n this.searchGroups.globalContacts.nameEl.append(showMore);\n attachClickEvent(showMore, () => {\n const isShort = this.searchGroups.globalContacts.container.classList.toggle('is-short');\n intlElement.key = isShort ? 'Separator.ShowMore' : 'Separator.ShowLess';\n intlElement.update();\n });\n }\n }\n }),\n\n this.managers.dialogsStorage.getDialogs({query, offsetIndex: 0, limit: 20, filterId: 0})\n .then(onLoad)\n .then((value) => {\n if(value) {\n setResults(value.dialogs.map((d) => d.peerId), this.searchGroups.contacts, true);\n }\n })\n ]);\n } else if(!this.searchContext.peerId && !this.searchContext.minDate) {\n const renderRecentSearch = (setActive = true) => {\n return apiManagerProxy.getState().then((state) => {\n if(!middleware()) {\n return;\n }\n\n this.searchGroups.recent.list.replaceChildren();\n\n state.recentSearch.slice(0, 20).forEach(async(peerId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.searchGroups.recent.list,\n meAsSaved: true,\n avatarSize: 'abitbigger',\n autonomous: true\n });\n\n dom.lastMessageSpan.append(await (peerId.isUser() ?\n getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId())) :\n getChatMembersString(peerId.toChatId())));\n });\n\n if(!state.recentSearch.length) {\n this.searchGroups.recent.clear();\n } else if(setActive) {\n this.searchGroups.recent.setActive();\n }\n });\n };\n\n return Promise.all([\n this.managers.appUsersManager.getTopPeers('correspondents').then((peers) => {\n if(!middleware()) return;\n\n const idx = peers.findIndex((peer) => peer.id === rootScope.myId);\n if(idx !== -1) {\n peers = peers.slice();\n peers.splice(idx, 1);\n }\n\n peers.forEach((peer) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peer.id,\n container: this.searchGroups.people.list,\n onlyFirstName: true,\n avatarSize: 'bigger',\n autonomous: false,\n noIcons: this.searchGroups.people.noIcons\n });\n\n dom.subtitleEl.remove();\n });\n\n this.searchGroups.people.toggle();\n }),\n\n renderRecentSearch()\n ]);\n } else return Promise.resolve();\n }\n\n private async loadMembers(mediaTab: SearchSuperMediaTab) {\n const id = this.searchContext.peerId.toChatId();\n const middleware = this.middleware.get();\n let promise: Promise;\n\n const renderParticipants = async(participants: (ChatParticipant | ChannelParticipant)[]) => {\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n\n if(!this.membersList) {\n this.membersList = new SortedUserList({\n lazyLoadQueue: this.lazyLoadQueue,\n rippleEnabled: false,\n managers: this.managers\n });\n attachClickEvent(this.membersList.list, (e) => {\n const li = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(!li) {\n return;\n }\n\n const peerId = li.dataset.peerId.toPeerId();\n let promise: Promise = Promise.resolve();\n if(mediaSizes.isMobile) {\n promise = appSidebarRight.toggleSidebar(false);\n }\n\n promise.then(() => {\n appImManager.setInnerPeer({peerId});\n });\n });\n mediaTab.contentTab.append(this.membersList.list);\n this.afterPerforming(1, mediaTab.contentTab);\n }\n\n for(const participant of participants) {\n const peerId = getParticipantPeerId(participant);\n if(peerId.isAnyChat()) {\n continue;\n }\n\n const user = await this.managers.appUsersManager.getUser(peerId);\n if(user.pFlags.deleted) {\n continue;\n }\n\n this.membersList.add(peerId);\n }\n };\n\n if(await this.managers.appChatsManager.isChannel(id)) {\n const LOAD_COUNT = !this.membersList ? 50 : 200;\n promise = this.managers.appProfileManager.getChannelParticipants(id, undefined, LOAD_COUNT, this.nextRates[mediaTab.inputFilter]).then((participants) => {\n if(!middleware()) {\n return;\n }\n\n const list = mediaTab.contentTab.firstElementChild as HTMLUListElement;\n this.nextRates[mediaTab.inputFilter] = (list ? list.childElementCount : 0) + participants.participants.length;\n\n if(participants.participants.length < LOAD_COUNT) {\n this.loaded[mediaTab.inputFilter] = true;\n }\n\n return renderParticipants(participants.participants);\n });\n } else {\n promise = this.managers.appProfileManager.getChatFull(id).then((chatFull) => {\n if(!middleware()) {\n return;\n }\n\n // console.log('anymore', chatFull);\n this.loaded[mediaTab.inputFilter] = true;\n const participants = (chatFull as ChatFull.chatFull).participants;\n if(participants._ === 'chatParticipantsForbidden') {\n return;\n }\n\n return renderParticipants(participants.participants);\n });\n }\n\n return this.loadPromises[mediaTab.inputFilter] = promise.finally(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadPromises[mediaTab.inputFilter] = null;\n });\n }\n\n private loadType(mediaTab: SearchSuperMediaTab, justLoad: boolean, loadCount: number, middleware: () => boolean) {\n const type = mediaTab.inputFilter;\n\n if(this.loadPromises[type]) {\n return this.loadPromises[type];\n }\n\n if(mediaTab.type === 'members') {\n return this.loadMembers(mediaTab);\n }\n\n const history = this.historyStorage[type] ??= [];\n\n if(type === 'inputMessagesFilterEmpty' && !history.length) {\n if(!this.loadedChats) {\n this.loadChats();\n this.loadedChats = true;\n }\n\n if(!this.searchContext.query.trim() && !this.searchContext.peerId && !this.searchContext.minDate) {\n this.loaded[type] = true;\n return Promise.resolve();\n }\n }\n\n const promise = this.loadPromises[type] = Promise.resolve().then(async() => {\n // render from cache\n if(history.length && this.usedFromHistory[type] < history.length && !justLoad) {\n const messages: any[] = [];\n let used = Math.max(0, this.usedFromHistory[type]);\n let slicedLength = 0;\n\n do {\n const ids = history.slice(used, used + loadCount);\n used += ids.length;\n slicedLength += ids.length;\n\n const notFilteredMessages = await Promise.all(ids.map((m) => this.managers.appMessagesManager.getMessageByPeer(m.peerId, m.mid)));\n\n messages.push(...this.filterMessagesByType(notFilteredMessages, type));\n } while(slicedLength < loadCount && used < history.length);\n\n // если перебор\n /* if(slicedLength > loadCount) {\n let diff = messages.length - loadCount;\n messages = messages.slice(0, messages.length - diff);\n used -= diff;\n } */\n\n this.usedFromHistory[type] = used;\n // if(messages.length) {\n return this.performSearchResult(messages, mediaTab).finally(() => {\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n // }\n }\n\n const maxId = history.length ? history[history.length - 1].mid : 0;\n\n const value = await this.managers.appMessagesManager.getSearch({\n ...this.searchContext,\n inputFilter: {_: type},\n maxId,\n limit: loadCount,\n nextRate: this.nextRates[type] ??= 0\n });\n\n history.push(...value.history.map((m) => ({mid: m.mid, peerId: m.peerId})));\n\n if(!middleware()) {\n // this.log.warn('peer changed');\n return;\n }\n\n // ! Фикс случая, когда не загружаются документы при открытой панели разработчиков (происходит из-за того, что не совпадают критерии отбора документов в getSearch)\n if(value.history.length < loadCount || (this.searchContext.folderId !== undefined && !value.next_rate) || value.history.length === value.count) {\n // if((value.count || history.length === value.count) && history.length >= value.count) {\n // this.log(logStr + 'loaded all media', value, loadCount);\n this.loaded[type] = true;\n }\n\n this.nextRates[type] = value.next_rate;\n\n if(justLoad) {\n return;\n }\n\n this.usedFromHistory[type] = history.length;\n\n if(!this.loaded[type]) {\n promise.then(() => {\n setTimeout(() => {\n if(!middleware()) return;\n // this.log('will preload more');\n if(this.mediaTab === mediaTab) {\n const promise = this.load(true, true);\n if(promise) {\n promise.then(() => {\n if(!middleware()) return;\n // this.log('preloaded more');\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n }\n }\n }, 0);\n });\n }\n\n // if(value.history.length) {\n return this.performSearchResult(this.filterMessagesByType(value.history, type), mediaTab);\n // }\n }).catch((err) => {\n this.log.error('load error:', err);\n }).finally(() => {\n this.loadPromises[type] = null;\n });\n\n return promise;\n }\n\n private canLoadMediaTab(mediaTab: SearchSuperMediaTab) {\n const inputFilter = mediaTab.inputFilter;\n return !this.loaded[inputFilter] || (this.historyStorage[inputFilter] && this.usedFromHistory[inputFilter] < this.historyStorage[inputFilter].length);\n }\n\n private async loadFirstTime() {\n const middleware = this.middleware.get();\n const {peerId, threadId} = this.searchContext;\n if(!this.hideEmptyTabs) {\n return;\n }\n\n const mediaTabs = this.mediaTabs.filter((mediaTab) => mediaTab.inputFilter !== 'inputMessagesFilterEmpty');\n const filters = mediaTabs.map((mediaTab) => ({_: mediaTab.inputFilter}));\n\n const [counters, canViewMembers] = await Promise.all([\n this.managers.appMessagesManager.getSearchCounters(peerId, filters, undefined, threadId),\n this.canViewMembers()\n ]);\n\n if(!middleware()) {\n return;\n }\n\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n\n let firstMediaTab: SearchSuperMediaTab;\n let count = 0;\n mediaTabs.forEach((mediaTab) => {\n const counter = counters.find((c) => c.filter._ === mediaTab.inputFilter);\n\n mediaTab.menuTab.classList.toggle('hide', !counter.count);\n mediaTab.menuTab.classList.remove('active');\n // mediaTab.contentTab.classList.toggle('hide', !counter.count);\n\n if(counter.count) {\n if(firstMediaTab === undefined) {\n firstMediaTab = mediaTab;\n }\n\n ++count;\n }\n });\n\n const membersTab = this.mediaTabsMap.get('members');\n membersTab.menuTab.classList.toggle('hide', !canViewMembers);\n\n if(canViewMembers) {\n firstMediaTab = membersTab;\n ++count;\n }\n\n this.container.classList.toggle('hide', !firstMediaTab);\n this.container.parentElement.classList.toggle('search-empty', !firstMediaTab);\n if(firstMediaTab) {\n this.skipScroll = true;\n this.selectTab(this.mediaTabs.indexOf(firstMediaTab), false);\n // firstMediaTab.menuTab.classList.add('active');\n\n this.navScrollableContainer.classList.toggle('hide', count <= 1);\n }\n }\n\n public async load(single = false, justLoad = false) {\n const peerId = this.searchContext.peerId;\n this.log('load', single, peerId, this.loadPromises);\n const middleware = this.middleware.get();\n\n if(this.firstLoad) {\n await (this.loadFirstTimePromise ??= this.loadFirstTime());\n if(!middleware()) {\n return;\n }\n\n this.loadFirstTimePromise = undefined;\n this.firstLoad = false;\n }\n\n let toLoad = single ? [this.mediaTab] : this.mediaTabs.filter((t) => t !== this.mediaTab);\n toLoad = toLoad.filter((mediaTab) => {\n return this.canLoadMediaTab(mediaTab);\n });\n\n if(peerId.isUser()) {\n findAndSplice(toLoad, (mediaTab) => mediaTab.type === 'members');\n }\n\n if(!toLoad.length) {\n return;\n }\n\n const loadCount = justLoad ? 50 : Math.round((windowSize.height / 130 | 0) * 3 * 1.25); // that's good for all types\n\n const promises: Promise[] = toLoad.map((mediaTab) => {\n return this.loadType(mediaTab, justLoad, loadCount, middleware);\n });\n\n return Promise.all(promises).catch((err) => {\n this.log.error('Load error all promises:', err);\n });\n }\n\n private getMonthContainerByTimestamp(timestamp: number, type: SearchSuperType) {\n const date = new Date(timestamp * 1000);\n date.setHours(0, 0, 0);\n date.setDate(1);\n const dateTimestamp = date.getTime();\n const containers = this.monthContainers[type] ?? (this.monthContainers[type] = {});\n if(!(dateTimestamp in containers)) {\n const container = document.createElement('div');\n container.className = 'search-super-month';\n\n const name = document.createElement('div');\n name.classList.add('search-super-month-name');\n\n const options: Intl.DateTimeFormatOptions = {\n month: 'long'\n };\n\n if(date.getFullYear() !== new Date().getFullYear()) {\n options.year = 'numeric';\n }\n\n const dateElement = new I18n.IntlDateElement({\n date,\n options\n }).element;\n name.append(dateElement);\n\n container.append(name);\n\n const items = document.createElement('div');\n items.classList.add('search-super-month-items');\n\n container.append(name, items);\n\n const haveTimestamps = getObjectKeysAndSort(containers, 'desc');\n let i = 0;\n for(; i < haveTimestamps.length; ++i) {\n const t = haveTimestamps[i];\n if(dateTimestamp > t) {\n break;\n }\n }\n\n containers[dateTimestamp] = {container, items};\n positionElementByIndex(container, this.tabs[type], i);\n }\n\n return containers[dateTimestamp];\n }\n\n public canViewMembers() {\n const {peerId} = this.searchContext;\n const isAnyChat = peerId.isAnyChat();\n if(!isAnyChat) return Promise.resolve(false);\n const chatId = peerId.toChatId();\n return Promise.all([\n this.managers.appChatsManager.isBroadcast(chatId),\n this.managers.appChatsManager.hasRights(chatId, 'view_participants'),\n this.managers.appChatsManager.isForum(chatId)\n ]).then(([isBroadcast, hasRights, isForum]) => {\n return !isBroadcast && hasRights && (!this.searchContext.threadId || !isForum);\n });\n }\n\n public cleanup() {\n this.loadPromises = {};\n this.loaded = {};\n this.loadedChats = false;\n this.nextRates = {};\n this.firstLoad = true;\n this.prevTabId = -1;\n\n this.lazyLoadQueue.clear();\n\n this.mediaTabs.forEach((mediaTab) => {\n this.usedFromHistory[mediaTab.inputFilter] = -1;\n });\n\n if(this.selection?.isSelecting) {\n this.selection.cancelSelection();\n }\n\n // * must go to first tab (это костыль)\n /* const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n const tab = this.canViewMembers() ? membersTab : this.mediaTabs[this.mediaTabs.indexOf(membersTab) + 1];\n this.mediaTab = tab;\n } */\n\n this.middleware.clean();\n this.loadFirstTimePromise = undefined;\n this.cleanScrollPositions();\n this.membersList = undefined;\n }\n\n public cleanScrollPositions() {\n this.mediaTabs.forEach((mediaTab) => {\n mediaTab.scroll = undefined;\n });\n }\n\n public cleanupHTML(goFirst = false) {\n this.mediaTabs.forEach((tab) => {\n tab.contentTab.replaceChildren();\n\n if(this.hideEmptyTabs) {\n // tab.menuTab.classList.add('hide');\n this.container.classList.add('hide');\n this.container.parentElement.classList.add('search-empty');\n }\n\n if(tab.type === 'chats') {\n return;\n }\n\n if(!this.historyStorage[tab.inputFilter]) {\n const parent = tab.contentTab.parentElement;\n // if(!testScroll) {\n if(!parent.querySelector('.preloader')) {\n putPreloader(parent, true);\n }\n // }\n\n const empty = parent.querySelector('.content-empty');\n if(empty) {\n empty.remove();\n }\n }\n });\n\n /* if(goFirst) {\n const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n let idx = this.canViewMembers() ? 0 : 1;\n membersTab.menuTab.classList.toggle('hide', idx !== 0);\n\n this.selectTab(idx, false);\n } else {\n this.selectTab(0, false);\n }\n } */\n\n this.monthContainers = {};\n this.searchGroupMedia.clear();\n this.scrollable.scrollTop = 0;\n\n /* if(testScroll) {\n for(let i = 0; i < 1500; ++i) {\n let div = document.createElement('div');\n div.insertAdjacentHTML('beforeend', ``);\n div.classList.add('grid-item');\n div.dataset.id = '' + (i / 3 | 0);\n //div.innerText = '' + (i / 3 | 0);\n this.tabs.inputMessagesFilterPhotoVideo.append(div);\n }\n } */\n }\n\n private copySearchContext(newInputFilter: MyInputMessagesFilter) {\n const context = copy(this.searchContext);\n context.inputFilter = {_: newInputFilter};\n context.nextRate = this.nextRates[newInputFilter];\n return context;\n }\n\n public setQuery({peerId, query, threadId, historyStorage, folderId, minDate, maxDate}: {\n peerId: PeerId,\n query?: string,\n threadId?: number,\n historyStorage?: AppSearchSuper['historyStorage'],\n folderId?: number,\n minDate?: number,\n maxDate?: number\n }) {\n this.searchContext = {\n peerId,\n query: query || '',\n inputFilter: {_: this.mediaTab.inputFilter},\n threadId,\n folderId,\n minDate,\n maxDate\n };\n\n this.historyStorage = historyStorage ?? {};\n\n this.cleanup();\n }\n\n public destroy() {\n this.cleanup();\n this.listenerSetter.removeAll();\n this.scrollable.destroy();\n this.swipeHandler?.removeListeners();\n this.selection?.cleanup();\n\n this.scrollStartCallback = undefined;\n this.onChangeTab = undefined;\n this.selectTab = undefined;\n this.searchContextMenu = undefined;\n this.swipeHandler = undefined;\n this.selection = undefined;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from './cancelEvent';\n\nexport default function lockTouchScroll(container: HTMLElement) {\n const onTouchMove = (e: TouchEvent) => {\n cancelEvent(e);\n };\n\n let lockers = 2;\n const cb = () => {\n if(!--lockers) {\n container.removeEventListener('touchmove', onTouchMove, {capture: true});\n }\n };\n\n container.addEventListener('touchmove', onTouchMove, {capture: true, passive: false});\n container.addEventListener('touchend', cb, {once: true});\n\n return cb;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ChatRights} from '../lib/appManagers/appChatsManager';\nimport type {Dialog} from '../lib/appManagers/appMessagesManager';\nimport appDialogsManager, {DialogElementSize as DialogElementSize} from '../lib/appManagers/appDialogsManager';\nimport rootScope from '../lib/rootScope';\nimport Scrollable from './scrollable';\nimport {FocusDirection} from '../helpers/fastSmoothScroll';\nimport CheckboxField from './checkboxField';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport findUpAttribute from '../helpers/dom/findUpAttribute';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport PeerTitle from './peerTitle';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport debounce from '../helpers/schedulers/debounce';\nimport windowSize from '../helpers/windowSize';\nimport type {IsPeerType} from '../lib/appManagers/appPeersManager';\nimport {attachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\nimport filterUnique from '../helpers/array/filterUnique';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport safeAssign from '../helpers/object/safeAssign';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport AvatarElement from './avatar';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport filterAsync from '../helpers/array/filterAsync';\nimport getParticipantPeerId from '../lib/appManagers/utils/chats/getParticipantPeerId';\nimport getChatMembersString from './wrappers/getChatMembersString';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport {Chat, User} from '../layer';\nimport canSendToUser from '../lib/appManagers/utils/users/canSendToUser';\nimport hasRights from '../lib/appManagers/utils/chats/hasRights';\nimport getDialogIndex from '../lib/appManagers/utils/dialogs/getDialogIndex';\nimport {generateDelimiter} from './generateDelimiter';\nimport SettingSection from './settingSection';\n\ntype SelectSearchPeerType = 'contacts' | 'dialogs' | 'channelParticipants';\n\n// TODO: правильная сортировка для addMembers, т.е. для peerType: 'contacts', потому что там идут сначала контакты - потом неконтакты, а должно всё сортироваться по имени\n\nexport default class AppSelectPeers {\n public container = document.createElement('div');\n public list = appDialogsManager.createChatList(/* {\n handheldsSize: 66,\n avatarSize: 48\n } */);\n private chatsContainer = document.createElement('div');\n public scrollable: Scrollable;\n private selectedScrollable: Scrollable;\n\n private selectedContainer: HTMLElement;\n public input: HTMLInputElement;\n\n // public selected: {[peerId: PeerId]: HTMLElement} = {};\n public selected = new Set();\n\n public freezed = false;\n\n private folderId = 0;\n private offsetIndex = 0;\n private promise: Promise;\n\n private query = '';\n private cachedContacts: PeerId[];\n\n private loadedWhat: Partial<{[k in 'dialogs' | 'archived' | 'contacts' | 'channelParticipants']: true}> = {};\n\n private renderedPeerIds: Set = new Set();\n\n private appendTo: HTMLElement;\n private onChange: (length: number) => void;\n private peerType: SelectSearchPeerType[] = ['dialogs'];\n private renderResultsFunc: (peerIds: PeerId[]) => void | Promise;\n private chatRightsAction: ChatRights;\n private multiSelect = true;\n private rippleEnabled = true;\n private avatarSize: DialogElementSize = 'abitbigger';\n private exceptSelf = false;\n private filterPeerTypeBy: IsPeerType[];\n\n private tempIds: {[k in keyof AppSelectPeers['loadedWhat']]: number} = {};\n private peerId: PeerId;\n\n private placeholder: LangPackKey;\n\n private selfPresence: LangPackKey = 'Presence.YourChat';\n\n private needSwitchList = false;\n\n private sectionNameLangPackKey: LangPackKey;\n\n private managers: AppManagers;\n\n private design: 'round' | 'square' = 'round';\n\n constructor(options: {\n appendTo: AppSelectPeers['appendTo'],\n onChange?: AppSelectPeers['onChange'],\n peerType?: AppSelectPeers['peerType'],\n peerId?: AppSelectPeers['peerId'],\n onFirstRender?: () => void,\n renderResultsFunc?: AppSelectPeers['renderResultsFunc'],\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\n multiSelect?: AppSelectPeers['multiSelect'],\n rippleEnabled?: AppSelectPeers['rippleEnabled'],\n avatarSize?: AppSelectPeers['avatarSize'],\n placeholder?: AppSelectPeers['placeholder'],\n selfPresence?: AppSelectPeers['selfPresence'],\n exceptSelf?: AppSelectPeers['exceptSelf'],\n filterPeerTypeBy?: AppSelectPeers['filterPeerTypeBy'],\n sectionNameLangPackKey?: AppSelectPeers['sectionNameLangPackKey'],\n managers: AppSelectPeers['managers'],\n design?: AppSelectPeers['design']\n }) {\n safeAssign(this, options);\n\n this.container.classList.add('selector', 'selector-' + this.design);\n\n const f = (this.renderResultsFunc || this.renderResults).bind(this);\n this.renderResultsFunc = async(peerIds) => {\n if(this.needSwitchList) {\n this.scrollable.splitUp.replaceWith(this.list);\n this.scrollable.setVirtualContainer(this.list);\n this.needSwitchList = false;\n }\n\n peerIds = peerIds.filter((peerId) => {\n const notRendered = !this.renderedPeerIds.has(peerId);\n if(notRendered) this.renderedPeerIds.add(peerId);\n return notRendered;\n });\n\n if(this.filterPeerTypeBy) {\n peerIds = await filterAsync(peerIds, async(peerId) => {\n if(peerId.isPeerId()) {\n const peer = await this.managers.appPeersManager.getPeer(peerId);\n if(peer) {\n for(const method of this.filterPeerTypeBy) {\n if(await this.managers.appPeersManager[method](peerId)) {\n return true;\n }\n }\n }\n }\n\n return true;\n });\n }\n\n return f(peerIds);\n };\n\n this.input = document.createElement('input');\n this.input.classList.add('selector-search-input');\n if(this.placeholder) {\n _i18n(this.input, this.placeholder, undefined, 'placeholder');\n } else {\n _i18n(this.input, 'SendMessageTo', undefined, 'placeholder');\n }\n\n this.input.type = 'text';\n\n if(this.multiSelect) {\n const section = new SettingSection({});\n section.innerContainer.classList.add('selector-search-section');\n const topContainer = document.createElement('div');\n topContainer.classList.add('selector-search-container');\n\n this.selectedContainer = document.createElement('div');\n this.selectedContainer.classList.add('selector-search');\n\n this.selectedContainer.append(this.input);\n topContainer.append(this.selectedContainer);\n this.selectedScrollable = new Scrollable(topContainer);\n\n // let delimiter = document.createElement('hr');\n\n attachClickEvent(this.selectedContainer, (e) => {\n if(this.freezed) return;\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'selector-user');\n\n if(!target) return;\n\n const peerId = target.dataset.key;\n const li = this.chatsContainer.querySelector('[data-peer-id=\"' + peerId + '\"]') as HTMLElement;\n if(!li) {\n this.remove(peerId.toPeerId());\n } else {\n simulateClickEvent(li);\n }\n });\n\n section.content.append(topContainer);\n this.container.append(section.container/* , delimiter */);\n }\n\n this.chatsContainer.classList.add('chatlist-container');\n // this.chatsContainer.append(this.list);\n const section = new SettingSection({\n name: this.sectionNameLangPackKey,\n noShadow: true\n });\n section.content.append(this.list);\n this.chatsContainer.append(section.container);\n this.scrollable = new Scrollable(this.chatsContainer);\n this.scrollable.setVirtualContainer(this.list);\n\n attachClickEvent(this.chatsContainer, (e) => {\n const target = findUpAttribute(e.target, 'data-peer-id') as HTMLElement;\n cancelEvent(e);\n\n if(!target) return;\n if(this.freezed) return;\n\n let key: PeerId | string = target.dataset.peerId;\n key = key.isPeerId() ? key.toPeerId() : key;\n\n if(!this.multiSelect) {\n this.add(key);\n return;\n }\n\n // target.classList.toggle('active');\n if(this.selected.has(key)) {\n this.remove(key);\n } else {\n this.add(key);\n }\n\n const checkbox = target.querySelector('input') as HTMLInputElement;\n checkbox.checked = !checkbox.checked;\n });\n\n const debouncedInput = debounce(this.onInput, 200, false, true);\n this.input.addEventListener('input', debouncedInput);\n\n this.scrollable.onScrolledBottom = () => {\n this.getMoreResults();\n };\n\n this.scrollable.container.prepend(generateDelimiter());\n\n this.container.append(this.chatsContainer);\n this.appendTo.append(this.container);\n\n // WARNING TIMEOUT\n setTimeout(() => {\n const getResultsPromise = this.getMoreResults() as Promise;\n if(options.onFirstRender) {\n getResultsPromise.then(() => {\n options.onFirstRender();\n });\n }\n }, 0);\n }\n\n private onInput = () => {\n const value = this.input.value;\n if(this.query !== value) {\n if(this.peerType.includes('contacts') || this.peerType.includes('dialogs')) {\n this.cachedContacts = undefined;\n }\n\n if(this.peerType.includes('dialogs')) {\n this.folderId = 0;\n this.offsetIndex = 0;\n }\n\n for(const i in this.tempIds) {\n // @ts-ignore\n ++this.tempIds[i];\n }\n\n this.list = appDialogsManager.createChatList();\n\n this.promise = undefined;\n this.loadedWhat = {};\n this.query = value;\n this.renderedPeerIds.clear();\n this.needSwitchList = true;\n\n // console.log('selectPeers input:', this.query);\n this.getMoreResults();\n }\n };\n\n private async renderSaved() {\n if(\n !this.exceptSelf &&\n !this.offsetIndex &&\n this.folderId === 0 &&\n this.peerType.includes('dialogs') &&\n (!this.query || await this.managers.appUsersManager.testSelfSearch(this.query))\n ) {\n await this.renderResultsFunc([rootScope.myId]);\n }\n }\n\n private getTempId(type: keyof AppSelectPeers['tempIds']) {\n this.tempIds[type] ??= 0;\n const tempId = ++this.tempIds[type];\n return {\n tempId,\n middleware: () => this.tempIds[type] === tempId\n };\n }\n\n private async getMoreDialogs(): Promise {\n if(this.loadedWhat.dialogs && this.loadedWhat.archived) {\n return;\n }\n\n // в десктопе - сначала без группы, потом архивные, потом контакты без сообщений\n const pageCount = windowSize.height / 56 * 1.25 | 0;\n\n const {middleware} = this.getTempId('dialogs');\n const promise = this.managers.dialogsStorage.getDialogs({\n query: this.query,\n offsetIndex: this.offsetIndex,\n limit: pageCount,\n filterId: this.folderId,\n skipMigrated: true\n });\n\n promise.catch(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat[this.loadedWhat.dialogs ? 'archived' : 'dialogs'] = true;\n });\n\n const value = await promise;\n if(!middleware()) {\n return;\n }\n\n let dialogs = value.dialogs as Dialog[];\n if(dialogs.length) {\n const newOffsetIndex = getDialogIndex(dialogs[dialogs.length - 1]) || 0;\n\n dialogs = dialogs.slice();\n findAndSplice(dialogs, d => d.peerId === rootScope.myId); // no my account\n\n if(this.chatRightsAction) {\n dialogs = await filterAsync(dialogs, (d) => this.filterByRights(d.peerId));\n if(!middleware()) {\n return;\n }\n }\n\n await this.renderSaved();\n if(!middleware()) {\n return;\n }\n\n this.offsetIndex = newOffsetIndex;\n }\n\n this.renderResultsFunc(dialogs.map((dialog) => dialog.peerId));\n\n if(value.isEnd) {\n if(!this.loadedWhat.dialogs) {\n await this.renderSaved();\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat.dialogs = true;\n this.offsetIndex = 0;\n this.folderId = 1;\n\n return this.getMoreDialogs();\n } else {\n this.loadedWhat.archived = true;\n\n if(!this.loadedWhat.contacts/* && this.peerType.includes('contacts') */) {\n return this.getMoreContacts();\n }\n }\n }\n }\n\n private async filterByRights(peerId: PeerId) {\n const peer: User | Chat = await this.managers.appPeersManager.getPeer(peerId);\n if(peerId.isUser()) {\n return this.chatRightsAction !== 'send_messages' || canSendToUser(peer as User.user);\n } else if(hasRights(peer as Chat.chat, this.chatRightsAction)) {\n return true;\n }\n }\n\n private async getMoreContacts() {\n if(this.loadedWhat.contacts) {\n return;\n }\n\n const isGlobalSearch = this.peerType.includes('contacts');\n\n if(!this.cachedContacts) {\n /* const promises: Promise[] = [appUsersManager.getContacts(this.query)];\n if(!this.peerType.includes('dialogs')) {\n promises.push(appMessagesManager.getConversationsAll());\n }\n\n this.promise = Promise.all(promises);\n this.cachedContacts = (await this.promise)[0].slice(); */\n const {middleware} = this.getTempId('contacts');\n const promise = Promise.all([\n isGlobalSearch ? this.managers.appUsersManager.getContactsPeerIds(this.query) : [],\n this.query ? this.managers.appUsersManager.searchContacts(this.query) : undefined\n ]);\n\n promise.catch(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat.contacts = true;\n });\n\n const [cachedContacts, searchResult] = await promise;\n if(!middleware()) {\n return;\n }\n\n if(searchResult) {\n // do not add global result if only dialogs needed\n let resultPeerIds = isGlobalSearch ? searchResult.my_results.concat(searchResult.results) : searchResult.my_results;\n\n if(this.chatRightsAction) {\n resultPeerIds = await filterAsync(resultPeerIds, (peerId) => this.filterByRights(peerId));\n if(!middleware()) {\n return;\n }\n }\n\n if(!this.peerType.includes('dialogs')) {\n resultPeerIds = resultPeerIds.filter((peerId) => peerId.isUser());\n }\n\n this.cachedContacts = filterUnique(cachedContacts.concat(resultPeerIds));\n } else this.cachedContacts = cachedContacts.slice();\n\n indexOfAndSplice(this.cachedContacts, rootScope.myId); // no my account\n }\n\n // if(this.cachedContacts.length) {\n const pageCount = windowSize.height / 56 * 1.25 | 0;\n const arr = this.cachedContacts.splice(0, pageCount);\n this.renderResultsFunc(arr);\n // }\n\n if(!this.cachedContacts.length) {\n this.loadedWhat.contacts = true;\n\n // need to load non-contacts\n /* if(!this.peerType.includes('dialogs')) {\n return this.getMoreDialogs();\n } */\n }\n }\n\n private async getMoreChannelParticipants() {\n if(this.loadedWhat.channelParticipants) {\n return;\n }\n\n const pageCount = 50; // same as in group permissions to use cache\n\n const {middleware} = this.getTempId('channelParticipants');\n const promise = this.managers.appProfileManager.getChannelParticipants(\n this.peerId.toChatId(),\n {\n _: 'channelParticipantsSearch',\n q: this.query\n },\n pageCount,\n this.list.childElementCount\n );\n\n promise.catch(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat.channelParticipants = true;\n });\n\n const participants = await promise;\n if(!middleware()) {\n return;\n }\n\n const peerIds = participants.participants.map((participant) => {\n return getParticipantPeerId(participant);\n });\n indexOfAndSplice(peerIds, rootScope.myId);\n this.renderResultsFunc(peerIds);\n\n if(this.list.childElementCount >= participants.count || participants.participants.length < pageCount) {\n this.loadedWhat.channelParticipants = true;\n }\n }\n\n checkForTriggers = () => {\n this.scrollable.checkForTriggers();\n };\n\n private getMoreResults() {\n if(this.promise) {\n return this.promise;\n }\n\n const get = () => {\n if((this.peerType.includes('dialogs')/* || this.loadedWhat.contacts */) && !this.loadedWhat.archived) { // to load non-contacts\n return this.getMoreSomething('dialogs');\n }\n\n if((this.peerType.includes('contacts') || this.peerType.includes('dialogs')) && !this.loadedWhat.contacts) {\n return this.getMoreSomething('contacts');\n }\n\n if(this.peerType.includes('channelParticipants') && !this.loadedWhat.channelParticipants) {\n return this.getMoreSomething('channelParticipants');\n }\n };\n\n const loadPromise = get();\n if(!loadPromise) {\n return Promise.resolve();\n }\n\n const promise = this.promise = loadPromise.catch((err) => {\n console.error('get more result error', err);\n }).finally(() => {\n if(this.promise === promise) {\n this.promise = undefined;\n }\n\n this.checkForTriggers();\n });\n\n return promise;\n }\n\n private getMoreSomething(peerType: SelectSearchPeerType) {\n const map: {[type in SelectSearchPeerType]: () => Promise} = {\n dialogs: this.getMoreDialogs,\n contacts: this.getMoreContacts,\n channelParticipants: this.getMoreChannelParticipants\n };\n\n const promise = map[peerType].call(this);\n return promise;\n }\n\n private async renderResults(peerIds: PeerId[]) {\n // console.log('will renderResults:', peerIds);\n\n // оставим только неконтакты с диалогов\n if(!this.peerType.includes('dialogs') && this.loadedWhat.contacts) {\n peerIds = await filterAsync(peerIds, (peerId) => {\n return this.managers.appUsersManager.isNonContactUser(peerId);\n });\n }\n\n peerIds.forEach(async(peerId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.scrollable,\n rippleEnabled: this.rippleEnabled,\n avatarSize: this.avatarSize\n });\n\n if(this.multiSelect) {\n const selected = this.selected.has(peerId);\n const checkboxField = new CheckboxField();\n\n if(selected) {\n // dom.listEl.classList.add('active');\n checkboxField.input.checked = true;\n }\n\n dom.containerEl.prepend(checkboxField.label);\n }\n\n let subtitleEl: HTMLElement;\n if(peerId.isAnyChat()) {\n subtitleEl = await getChatMembersString(peerId.toChatId());\n } else if(peerId === rootScope.myId) {\n subtitleEl = i18n(this.selfPresence);\n } else {\n subtitleEl = getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId()));\n }\n\n dom.lastMessageSpan.append(subtitleEl);\n });\n }\n\n public add(key: PeerId | string, title?: string | HTMLElement, scroll = true) {\n // console.trace('add');\n this.selected.add(key);\n\n if(!this.multiSelect) {\n this.onChange(this.selected.size);\n return;\n }\n\n if(this.query.trim()) {\n this.input.value = '';\n this.onInput();\n }\n\n const div = document.createElement('div');\n div.classList.add('selector-user', 'scale-in');\n\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('selector-user-avatar', 'tgico', 'avatar-32');\n avatarEl.isDialog = true;\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n const peerTitle = new PeerTitle();\n peerTitle.update({peerId: key.toPeerId(), dialog: true});\n title = peerTitle.element;\n }\n\n avatarEl.updateWithOptions({\n peerId: key as PeerId\n });\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n this.selectedContainer.insertBefore(div, this.input);\n // this.selectedScrollable.scrollTop = this.selectedScrollable.scrollHeight;\n this.onChange?.(this.selected.size);\n\n if(scroll) {\n this.selectedScrollable.scrollIntoViewNew({\n element: this.input,\n position: 'center'\n });\n }\n\n return div;\n }\n\n public remove(key: PeerId | string) {\n if(!this.multiSelect) return;\n // const div = this.selected[peerId];\n const div = this.selectedContainer.querySelector(`[data-key=\"${key}\"]`) as HTMLElement;\n div.classList.remove('scale-in');\n void div.offsetWidth;\n div.classList.add('scale-out');\n\n const onAnimationEnd = () => {\n this.selected.delete(key);\n div.remove();\n this.onChange && this.onChange(this.selected.size);\n };\n\n if(rootScope.settings.animationsEnabled) {\n div.addEventListener('animationend', onAnimationEnd, {once: true});\n } else {\n onAnimationEnd();\n }\n }\n\n public getSelected() {\n return [...this.selected];\n }\n\n public addInitial(values: any[]) {\n values.forEach((value) => {\n this.add(value, undefined, false);\n });\n\n window.requestAnimationFrame(() => { // ! not the best place for this raf though it works\n this.selectedScrollable.scrollIntoViewNew({\n element: this.input,\n position: 'center',\n forceDirection: FocusDirection.Static\n });\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport ProgressivePreloader from './preloader';\nimport appMediaPlaybackController, {MediaItem, MediaSearchContext} from './appMediaPlaybackController';\nimport {DocumentAttribute, Message} from '../layer';\nimport mediaSizes from '../helpers/mediaSizes';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport rootScope from '../lib/rootScope';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport LazyLoadQueue from './lazyLoadQueue';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport ListenerSetter, {Listener} from '../helpers/listenerSetter';\nimport noop from '../helpers/noop';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport {joinElementsWith} from '../lib/langPack';\nimport {MiddleEllipsisElement} from './middleEllipsis';\nimport {formatFullSentTime} from '../helpers/date';\nimport throttleWithRaf from '../helpers/schedulers/throttleWithRaf';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport formatBytes from '../helpers/formatBytes';\nimport {animateSingle} from '../helpers/animation';\nimport clamp from '../helpers/number/clamp';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport MediaProgressLine from './mediaProgressLine';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport wrapSenderToPeer from './wrappers/senderToPeer';\nimport wrapSentTime from './wrappers/sentTime';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport wrapPhoto from './wrappers/photo';\n\nrootScope.addEventListener('messages_media_read', ({mids, peerId}) => {\n mids.forEach((mid) => {\n const attr = `[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`;\n (Array.from(document.querySelectorAll(`audio-element.is-unread${attr}, .media-round.is-unread${attr}`)) as AudioElement[]).forEach((elem) => {\n elem.classList.remove('is-unread');\n });\n });\n});\n\n// https://github.com/LonamiWebs/Telethon/blob/4393ec0b83d511b6a20d8a20334138730f084375/telethon/utils.py#L1285\nexport function decodeWaveform(waveform: Uint8Array | number[]) {\n if(!(waveform instanceof Uint8Array)) {\n waveform = new Uint8Array(waveform);\n }\n\n const bitCount = waveform.length * 8;\n const valueCount = bitCount / 5 | 0;\n if(!valueCount) {\n return new Uint8Array([]);\n }\n\n let result: Uint8Array;\n try {\n const dataView = new DataView(waveform.buffer);\n result = new Uint8Array(valueCount);\n for(let i = 0; i < valueCount; i++) {\n const byteIndex = i * 5 / 8 | 0;\n const bitShift = i * 5 % 8;\n const value = dataView.getUint16(byteIndex, true);\n result[i] = (value >> bitShift) & 0b00011111;\n }\n } catch(err) {\n result = new Uint8Array([]);\n }\n\n /* var byteIndex = (valueCount - 1) / 8 | 0;\n var bitShift = (valueCount - 1) % 8;\n if(byteIndex === waveform.length - 1) {\n var value = waveform[byteIndex];\n } else {\n var value = dataView.getUint16(byteIndex, true);\n }\n console.log('decoded waveform, setting last value:', value, byteIndex, bitShift);\n result[valueCount - 1] = (value >> bitShift) & 0b00011111; */\n return result;\n}\n\nfunction createWaveformBars(waveform: Uint8Array, duration: number) {\n const barWidth = 2;\n const barMargin = 2; // mediaSizes.isMobile ? 2 : 1;\n const barHeightMin = 4; // mediaSizes.isMobile ? 3 : 2;\n const barHeightMax = mediaSizes.isMobile ? 16 : 23;\n // const availW = 150; //mediaSizes.isMobile ? 152 : 190;\n\n const minW = mediaSizes.isMobile ? 152 : 190;\n const maxW = mediaSizes.isMobile ? 190 : 256;\n const availW = clamp(duration / 60 * maxW, minW, maxW); // mediaSizes.isMobile ? 152 : 224;\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.classList.add('audio-waveform-bars');\n svg.setAttributeNS(null, 'width', '' + availW);\n svg.setAttributeNS(null, 'height', '' + barHeightMax);\n svg.setAttributeNS(null, 'viewBox', `0 0 ${availW} ${barHeightMax}`);\n\n // console.log('decoded waveform:', waveform);\n\n const normValue = Math.max(...waveform);\n const wfSize = waveform.length ? waveform.length : 100;\n const barCount = Math.min((availW / (barWidth + barMargin)) | 0, wfSize);\n\n let maxValue = 0;\n const maxDelta = barHeightMax - barHeightMin;\n\n let html = '';\n for(let i = 0, barX = 0, sumI = 0; i < wfSize; ++i) {\n const value = waveform[i] || 0;\n if((sumI + barCount) >= wfSize) { // draw bar\n sumI = sumI + barCount - wfSize;\n if(sumI < (barCount + 1) / 2) {\n if(maxValue < value) maxValue = value;\n }\n\n const bar_value = Math.max(((maxValue * maxDelta) + ((normValue + 1) / 2)) / (normValue + 1), barHeightMin);\n\n const h = `\n \n `;\n html += h;\n\n barX += barWidth + barMargin;\n\n if(sumI < (barCount + 1) / 2) {\n maxValue = 0;\n } else {\n maxValue = value;\n }\n } else {\n if(maxValue < value) maxValue = value;\n\n sumI += barCount;\n }\n }\n\n const container = document.createElement('div');\n container.classList.add('audio-waveform');\n container.append(svg);\n\n svg.insertAdjacentHTML('beforeend', html);\n return {svg, container, availW};\n}\n\nasync function wrapVoiceMessage(audioEl: AudioElement) {\n audioEl.classList.add('is-voice');\n\n const message = audioEl.message;\n const doc = getMediaFromMessage(message) as MyDocument;\n\n if(message.pFlags.out) {\n audioEl.classList.add('is-out');\n }\n\n let waveform = (doc.attributes.find((attribute) => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio).waveform || new Uint8Array([]);\n waveform = decodeWaveform(waveform.slice(0, 63));\n\n const {svg, container: svgContainer, availW} = createWaveformBars(waveform, doc.duration);\n\n const fakeSvgContainer = svgContainer.cloneNode(true) as HTMLElement;\n fakeSvgContainer.classList.add('audio-waveform-fake');\n svgContainer.classList.add('audio-waveform-background');\n\n const waveformContainer = document.createElement('div');\n waveformContainer.classList.add('audio-waveform-container');\n waveformContainer.append(svgContainer, fakeSvgContainer);\n\n const timeDiv = document.createElement('div');\n timeDiv.classList.add('audio-time');\n audioEl.append(waveformContainer, timeDiv);\n\n let progress = svg as any as HTMLElement;\n\n const onLoad = () => {\n let audio = audioEl.audio;\n\n const setAnimation = () => {\n animateSingle(() => {\n if(!audio) return false;\n onTimeUpdate();\n return !audio.paused;\n }, audioEl);\n };\n\n const onTimeUpdate = () => {\n fakeSvgContainer.style.width = (audio.currentTime / audio.duration * 100) + '%';\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onTimeUpdate();\n }\n\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\n audioEl.addAudioListener('timeupdate', throttledTimeUpdate);\n audioEl.addAudioListener('ended', throttledTimeUpdate);\n audioEl.addAudioListener('play', setAnimation);\n\n audioEl.readyPromise.then(() => {\n let mousedown = false, mousemove = false;\n progress.addEventListener('mouseleave', (e) => {\n if(mousedown) {\n audio.play();\n mousedown = false;\n }\n mousemove = false;\n });\n progress.addEventListener('mousemove', (e) => {\n mousemove = true;\n if(mousedown) scrub(e);\n });\n progress.addEventListener('mousedown', (e) => {\n e.preventDefault();\n if(e.button !== 0) return;\n if(!audio.paused) {\n audio.pause();\n }\n\n scrub(e);\n mousedown = true;\n });\n progress.addEventListener('mouseup', (e) => {\n if(mousemove && mousedown) {\n audio.play();\n mousedown = false;\n }\n });\n attachClickEvent(progress, (e) => {\n cancelEvent(e);\n if(!audio.paused) scrub(e);\n });\n\n function scrub(e: MouseEvent | TouchEvent) {\n let offsetX: number;\n if(e instanceof MouseEvent) {\n offsetX = e.offsetX;\n } else { // touch\n const rect = (e.target as HTMLElement).getBoundingClientRect();\n offsetX = e.targetTouches[0].pageX - rect.left;\n }\n\n const scrubTime = offsetX / availW /* width */ * audio.duration;\n audio.currentTime = scrubTime;\n }\n }, noop);\n\n return () => {\n progress.remove();\n progress = null;\n audio = null;\n };\n };\n\n return onLoad;\n}\n\nasync function wrapAudio(audioEl: AudioElement) {\n const withTime = audioEl.withTime;\n\n const message = audioEl.message;\n const doc = getMediaFromMessage(message) as MyDocument;\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('audio-description');\n\n const audioAttribute = doc.attributes.find((attr) => attr._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n\n if(!isVoice) {\n const parts: (Node | string)[] = [];\n if(audioAttribute?.performer) {\n parts.push(wrapEmojiText(audioAttribute.performer));\n }\n\n if(withTime) {\n parts.push(formatFullSentTime(message.date));\n } else if(!parts.length) {\n parts.push(formatBytes(doc.size));\n }\n\n if(audioEl.showSender) {\n parts.push(await wrapSenderToPeer(message));\n }\n\n descriptionEl.append(...joinElementsWith(parts, ' • '));\n }\n\n const html = `\n
\n
\n
\n
`;\n audioEl.insertAdjacentHTML('beforeend', html);\n\n const titleEl = audioEl.querySelector('.audio-title') as HTMLElement;\n\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = audioEl.dataset.fontWeight;\n middleEllipsisEl.dataset.fontSize = audioEl.dataset.fontSize;\n middleEllipsisEl.dataset.sizeType = audioEl.dataset.sizeType;\n if(isVoice) {\n middleEllipsisEl.append(await wrapSenderToPeer(message));\n } else {\n setInnerHTML(middleEllipsisEl, wrapEmojiText(audioAttribute?.title ?? doc.file_name));\n }\n\n titleEl.append(middleEllipsisEl);\n\n if(audioEl.showSender) {\n titleEl.append(wrapSentTime(message));\n }\n\n const subtitleDiv = audioEl.querySelector('.audio-subtitle') as HTMLDivElement;\n subtitleDiv.append(descriptionEl);\n\n const onLoad = () => {\n let launched = false;\n\n let progressLine = new MediaProgressLine(audioEl.audio, doc.supportsStreaming);\n\n audioEl.addAudioListener('ended', () => {\n audioEl.classList.remove('audio-show-progress');\n // Reset subtitle\n subtitleDiv.lastChild.replaceWith(descriptionEl);\n launched = false;\n });\n\n const onPlay = () => {\n if(!launched) {\n audioEl.classList.add('audio-show-progress');\n launched = true;\n\n if(progressLine) {\n subtitleDiv.lastChild.replaceWith(progressLine.container);\n }\n }\n };\n\n audioEl.addAudioListener('play', onPlay);\n\n if(!audioEl.audio.paused || audioEl.audio.currentTime > 0) {\n onPlay();\n }\n\n return () => {\n progressLine.removeListeners();\n progressLine.container.remove();\n progressLine = null;\n };\n };\n\n return onLoad;\n}\n\nfunction constructDownloadPreloader(tryAgainOnFail = true) {\n const preloader = new ProgressivePreloader({cancelable: true, tryAgainOnFail});\n preloader.construct();\n\n if(!tryAgainOnFail) {\n preloader.circle.setAttributeNS(null, 'r', '23');\n preloader.totalLength = 143.58203125;\n }\n\n return preloader;\n}\n\nexport const findMediaTargets = (anchor: HTMLElement, anchorMid: number/* , useSearch: boolean */) => {\n let prev: MediaItem[], next: MediaItem[];\n // if(anchor.classList.contains('search-super-item') || !useSearch) {\n const isBubbles = !anchor.classList.contains('search-super-item');\n const container = findUpClassName(anchor, !isBubbles ? 'tabs-tab' : 'bubbles-inner');\n if(container) {\n const attr = `:not([data-is-outgoing=\"1\"])`;\n const justAudioSelector = `.audio:not(.is-voice)${attr}`;\n let selectors: string[];\n if(!anchor.matches(justAudioSelector)) {\n selectors = [`.audio.is-voice${attr}`, `.media-round${attr}`];\n } else {\n selectors = [justAudioSelector];\n }\n\n if(isBubbles) {\n const prefix = '.bubble:not(.webpage) ';\n selectors = selectors.map((s) => prefix + s);\n }\n\n const selector = selectors.join(', ');\n\n const elements = Array.from(container.querySelectorAll(selector)) as HTMLElement[];\n const idx = elements.indexOf(anchor);\n\n const mediaItems: MediaItem[] = elements.map((element) => ({peerId: element.dataset.peerId.toPeerId(), mid: +element.dataset.mid}));\n\n prev = mediaItems.slice(0, idx);\n next = mediaItems.slice(idx + 1);\n }\n // }\n\n if((next.length && next[0].mid < anchorMid) || (prev.length && prev[prev.length - 1].mid > anchorMid)) {\n [prev, next] = [next.reverse(), prev.reverse()];\n }\n\n // prev = next = undefined;\n\n return [prev, next];\n};\n\nexport default class AudioElement extends HTMLElement {\n public audio: HTMLAudioElement;\n public preloader: ProgressivePreloader;\n public message: Message.message;\n public withTime = false;\n public voiceAsMusic = false;\n public searchContext: MediaSearchContext;\n public showSender = false;\n public noAutoDownload: boolean;\n public lazyLoadQueue: LazyLoadQueue;\n public loadPromises: Promise[];\n public managers: AppManagers;\n\n private listenerSetter = new ListenerSetter();\n private onTypeDisconnect: () => void;\n public onLoad: (autoload?: boolean) => void;\n public readyPromise: CancellablePromise;\n\n public async render() {\n this.classList.add('audio');\n this.managers = rootScope.managers;\n\n this.dataset.mid = '' + this.message.mid;\n this.dataset.peerId = '' + this.message.peerId;\n\n const doc = getMediaFromMessage(this.message) as MyDocument;\n const isRealVoice = doc.type === 'voice';\n const isVoice = !this.voiceAsMusic && isRealVoice;\n const isOutgoing = this.message.pFlags.is_outgoing;\n const uploadingFileName = this.message?.uploadingFileName;\n\n const durationStr = toHHMMSS(doc.duration | 0);\n\n this.innerHTML = `\n
\n
\n
\n
\n
\n
`;\n\n const toggle = this.firstElementChild as HTMLElement;\n\n const downloadDiv = document.createElement('div');\n downloadDiv.classList.add('audio-download');\n\n const isUnread = doc.type !== 'audio' && this.message && this.message.pFlags.media_unread;\n if(isUnread) {\n this.classList.add('is-unread');\n }\n\n if(uploadingFileName) {\n this.classList.add('is-outgoing');\n this.append(downloadDiv);\n }\n\n const onTypeLoad = await (isVoice ? wrapVoiceMessage(this) : wrapAudio(this));\n\n const audioTimeDiv = this.querySelector('.audio-time') as HTMLDivElement;\n audioTimeDiv.innerHTML = durationStr;\n\n const onLoad = this.onLoad = (autoload: boolean) => {\n this.onLoad = undefined;\n\n const audio = this.audio = appMediaPlaybackController.addMedia(this.message, autoload);\n\n const readyPromise = this.readyPromise = deferredPromise();\n if(this.audio.readyState >= this.audio.HAVE_CURRENT_DATA) readyPromise.resolve();\n else {\n this.addAudioListener('canplay', () => readyPromise.resolve(), {once: true});\n }\n\n this.onTypeDisconnect = onTypeLoad();\n\n const getTimeStr = () => toHHMMSS(audio.currentTime | 0) + (isVoice ? (' / ' + durationStr) : '');\n\n const onPlay = () => {\n audioTimeDiv.innerText = getTimeStr();\n toggle.classList.toggle('playing', !audio.paused);\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onPlay();\n }\n\n const togglePlay = (e?: Event, paused = audio.paused) => {\n e && cancelEvent(e);\n\n if(paused) {\n const hadSearchContext = !!this.searchContext;\n if(appMediaPlaybackController.setSearchContext(this.searchContext || {\n peerId: NULL_PEER_ID,\n inputFilter: {_: 'inputMessagesFilterEmpty'},\n useSearch: false\n })) {\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(this, this.message.mid/* , this.searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: this.message.peerId, mid: this.message.mid}, prev, next);\n }\n\n audio.play().catch(() => {});\n } else {\n audio.pause();\n }\n };\n\n attachClickEvent(toggle, (e) => togglePlay(e), {listenerSetter: this.listenerSetter});\n\n this.addAudioListener('ended', () => {\n toggle.classList.remove('playing');\n audioTimeDiv.innerText = durationStr;\n });\n\n this.addAudioListener('timeupdate', () => {\n if((!audio.currentTime && audio.paused) || appMediaPlaybackController.isSafariBuffering(audio)) return;\n audioTimeDiv.innerText = getTimeStr();\n });\n\n this.addAudioListener('pause', () => {\n toggle.classList.remove('playing');\n });\n\n this.addAudioListener('play', onPlay);\n\n return togglePlay;\n };\n\n if(doc.thumbs?.length) {\n const imgs: HTMLElement[] = [];\n const wrapped = await wrapPhoto({\n photo: doc,\n message: null,\n container: toggle,\n boxWidth: 48,\n boxHeight: 48,\n loadPromises: this.loadPromises,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue\n });\n toggle.style.width = toggle.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n\n this.classList.add('audio-with-thumb');\n imgs.forEach((img) => img.classList.add('audio-thumb'));\n }\n\n if(!isOutgoing) {\n let preloader: ProgressivePreloader = this.preloader;\n\n const autoDownload = doc.type !== 'audio'/* || !this.noAutoDownload */;\n onLoad(autoDownload);\n\n const r = (shouldPlay: boolean) => {\n if(this.audio.src) {\n return;\n }\n\n appMediaPlaybackController.resolveWaitingForLoadMedia(this.message.peerId, this.message.mid, this.message.pFlags.is_scheduled);\n\n const onDownloadInit = () => {\n if(shouldPlay) {\n appMediaPlaybackController.willBePlayed(this.audio); // prepare for loading audio\n\n if(IS_SAFARI && !this.audio.autoplay) {\n this.audio.autoplay = true;\n }\n }\n };\n\n onDownloadInit();\n\n if(!preloader) {\n if(doc.supportsStreaming) {\n this.classList.add('corner-download');\n\n let pauseListener: Listener;\n const onPlay = () => {\n const preloader = constructDownloadPreloader(false);\n const deferred = deferredPromise();\n deferred.notifyAll({done: 75, total: 100});\n deferred.catch(() => {\n this.audio.pause();\n appMediaPlaybackController.willBePlayed(undefined);\n });\n deferred.cancel = () => {\n deferred.cancel = noop;\n const err = new Error();\n (err as any).type = 'CANCELED';\n deferred.reject(err);\n };\n preloader.attach(downloadDiv, false, deferred);\n\n pauseListener = this.addAudioListener('pause', () => {\n deferred.cancel();\n }, {once: true}) as any;\n\n onDownloadInit();\n };\n\n /* if(!this.audio.paused) {\n onPlay();\n } */\n\n const playListener: any = this.addAudioListener('play', onPlay);\n this.readyPromise.then(() => {\n this.listenerSetter.remove(playListener);\n this.listenerSetter.remove(pauseListener);\n });\n } else {\n preloader = constructDownloadPreloader();\n\n if(!shouldPlay) {\n this.readyPromise = deferredPromise();\n }\n\n const load = () => {\n onDownloadInit();\n\n const download = appDownloadManager.downloadMediaURL({media: doc});\n\n if(!shouldPlay) {\n download.then(() => {\n this.readyPromise.resolve();\n });\n }\n\n preloader.attach(downloadDiv, false, download);\n return {download};\n };\n\n preloader.setDownloadFunction(load);\n load();\n }\n }\n\n if(this.classList.contains('corner-download')) {\n toggle.append(downloadDiv);\n } else {\n this.append(downloadDiv);\n }\n\n this.classList.add('downloading');\n\n this.readyPromise.then(() => {\n this.classList.remove('downloading');\n downloadDiv.classList.add('downloaded');\n setTimeout(() => {\n downloadDiv.remove();\n }, 200);\n\n // setTimeout(() => {\n // release loaded audio\n if(appMediaPlaybackController.willBePlayedMedia === this.audio) {\n this.audio.play();\n appMediaPlaybackController.willBePlayed(undefined);\n }\n // }, 10e3);\n });\n };\n\n if(!this.audio?.src) {\n if(autoDownload) {\n r(false);\n } else {\n attachClickEvent(toggle, () => {\n r(true);\n }, {once: true, capture: true, passive: false, listenerSetter: this.listenerSetter});\n }\n }\n } else if(uploadingFileName) {\n this.preloader = constructDownloadPreloader(false);\n this.preloader.attachPromise(appDownloadManager.getUpload(uploadingFileName));\n this.dataset.isOutgoing = '1';\n this.preloader.attach(downloadDiv, false);\n // onLoad();\n }\n }\n\n get addAudioListener() {\n return this.listenerSetter.add(this.audio);\n }\n\n disconnectedCallback() {\n setTimeout(() => {\n if(this.isConnected) {\n return;\n }\n\n if(this.onTypeDisconnect) {\n this.onTypeDisconnect();\n this.onTypeDisconnect = null;\n }\n\n if(this.readyPromise) {\n this.readyPromise.reject();\n }\n\n if(this.listenerSetter) {\n this.listenerSetter.removeAll();\n this.listenerSetter = null;\n }\n\n if(this.preloader) {\n this.preloader = null;\n }\n }, 100);\n }\n}\n\ncustomElements.define('audio-element', AudioElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Photo} from '../layer';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport ListLoader, {ListLoaderOptions} from './listLoader';\n\nexport default class AvatarListLoader extends ListLoader {\n private peerId: PeerId;\n private managers: AppManagers;\n\n constructor(options: Omit, 'loadMore'> & {peerId: PeerId, managers: AppManagers}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n if(this.peerId.isAnyChat() || !older) return Promise.resolve({count: 0, items: []}); // ! это значит, что открыло аватар чата, но следующих фотографий нет.\n\n const maxId = anchor?.photoId;\n return this.managers.appPhotosManager.getUserPhotos(this.peerId, maxId, loadCount).then((value) => {\n const items = value.photos.map((photoId) => {\n return {element: null as HTMLElement, photoId} as any;\n });\n\n return {count: value.count, items};\n });\n }\n });\n\n this.loadedAllUp = true;\n this.peerId = options.peerId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarListLoader from '../helpers/avatarListLoader';\nimport {Photo} from '../layer';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport appImManager from '../lib/appManagers/appImManager';\nimport rootScope from '../lib/rootScope';\nimport AppMediaViewerBase from './appMediaViewerBase';\n\ntype AppMediaViewerAvatarTargetType = {element: HTMLElement, photoId: Photo.photo['id']};\nexport default class AppMediaViewerAvatar extends AppMediaViewerBase<'', 'delete', AppMediaViewerAvatarTargetType> {\n public peerId: PeerId;\n\n constructor(peerId: PeerId) {\n super(new AvatarListLoader({peerId, managers: rootScope.managers}), [/* 'delete' */]);\n\n this.peerId = peerId;\n\n this.setBtnMenuToggle([{\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }/* , {\n icon: 'delete danger btn-disabled',\n text: 'Delete',\n onClick: () => {}\n } */]);\n\n // * constructing html end\n\n this.setListeners();\n }\n\n onPrevClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, -1);\n };\n\n onNextClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, 1);\n };\n\n onDownloadClick = async() => {\n appDownloadManager.downloadToDisc({\n media: await this.managers.appPhotosManager.getPhoto(this.target.photoId),\n queueId: appImManager.chat.bubbles.lazyLoadQueue.queueId\n });\n };\n\n public async openMedia(photoId: Photo.photo['id'], target?: HTMLElement, fromRight = 0, prevTargets?: AppMediaViewerAvatarTargetType[], nextTargets?: AppMediaViewerAvatarTargetType[]) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const photo = await this.managers.appPhotosManager.getPhoto(photoId);\n const ret = super._openMedia(photo, photo.date, this.peerId, fromRight, target, false, prevTargets, nextTargets);\n this.target.photoId = photo.id;\n\n return ret;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\nimport {Message, Photo} from '../layer';\nimport type LazyLoadQueue from './lazyLoadQueue';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport AppMediaViewer from './appMediaViewer';\nimport AppMediaViewerAvatar from './appMediaViewerAvatar';\nimport isObject from '../helpers/object/isObject';\nimport {ArgumentTypes} from '../types';\nimport putPhoto from './putPhoto';\nimport {recordPromise} from '../helpers/recordPromise';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\n\nconst onAvatarUpdate = ({peerId, threadId}: {peerId: PeerId, threadId?: number}) => {\n let query = 'avatar-element[data-peer-id=\"' + peerId + '\"]';\n if(threadId) {\n query += '[data-thread-id=\"' + threadId + '\"]';\n }\n\n (Array.from(document.querySelectorAll(query)) as AvatarElement[]).forEach((elem) => {\n // console.log('updating avatar:', elem);\n elem.update();\n });\n};\n\nrootScope.addEventListener('avatar_update', onAvatarUpdate);\nrootScope.addEventListener('peer_title_edit', async(data) => {\n if(!(await rootScope.managers.appAvatarsManager.isAvatarCached(data.peerId))) {\n onAvatarUpdate(data);\n }\n});\n\nexport async function openAvatarViewer(\n target: HTMLElement,\n peerId: PeerId,\n middleware: () => boolean,\n message?: any,\n prevTargets?: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[],\n nextTargets?: typeof prevTargets\n) {\n let photo = await rootScope.managers.appProfileManager.getFullPhoto(peerId);\n if(!middleware() || !photo) {\n return;\n }\n\n const getTarget = () => {\n const good = Array.from(target.querySelectorAll('img')).find((img) => !img.classList.contains('emoji'));\n return good ? target : null;\n };\n\n if(peerId.isAnyChat()) {\n const hadMessage = !!message;\n const inputFilter = 'inputMessagesFilterChatPhotos';\n if(!message) {\n message = await rootScope.managers.appMessagesManager.getSearch({\n peerId,\n inputFilter: {_: inputFilter},\n maxId: 0,\n limit: 1\n }).then((value) => {\n // console.log(lol);\n // ! by descend\n return value.history[0];\n });\n\n if(!middleware()) {\n return;\n }\n }\n\n if(message) {\n // ! гений в деле, костылируем (но это гениально)\n const messagePhoto = message.action.photo;\n if(messagePhoto.id !== photo.id) {\n if(!hadMessage) {\n message = rootScope.managers.appMessagesManager.generateFakeAvatarMessage(peerId, photo);\n } else {\n\n }\n }\n\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\n element: el.element,\n mid: (el.item as Message.messageService).mid,\n peerId: (el.item as Message.messageService).peerId\n }));\n\n new AppMediaViewer()\n .setSearchContext({\n peerId,\n inputFilter: {_: inputFilter}\n })\n .openMedia(message, getTarget(), undefined, undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\n\n return;\n }\n }\n\n if(photo) {\n if(!isObject(message) && message) {\n photo = await rootScope.managers.appPhotosManager.getPhoto(message);\n }\n\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\n element: el.element,\n photoId: el.item as string\n }));\n\n new AppMediaViewerAvatar(peerId).openMedia(\n photo.id,\n getTarget(),\n undefined,\n prevTargets ? f(prevTargets) : undefined,\n nextTargets ? f(nextTargets) : undefined\n );\n }\n}\n\nconst believeMe: Map> = new Map();\nconst seen: Set = new Set();\n\nfunction getAvatarQueueKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n}\n\nexport default class AvatarElement extends HTMLElement {\n public peerId: PeerId;\n public isDialog: boolean;\n public peerTitle: string;\n public loadPromises: Promise[];\n public lazyLoadQueue: LazyLoadQueue;\n public isBig: boolean;\n public threadId: number;\n private addedToQueue = false;\n public wrapOptions: WrapSomethingOptions;\n\n public middlewareHelper: MiddlewareHelper;\n\n constructor() {\n super();\n this.classList.add('avatar-like');\n this.middlewareHelper = getMiddleware();\n }\n\n disconnectedCallback() {\n // браузер вызывает этот метод при удалении элемента из документа\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\n const key = getAvatarQueueKey(this.peerId, this.threadId);\n const set = believeMe.get(key);\n if(set?.has(this)) {\n set.delete(this);\n if(!set.size) {\n believeMe.delete(key);\n }\n }\n\n this.lazyLoadQueue?.delete({div: this});\n }\n\n public attachClickEvent() {\n let loading = false;\n attachClickEvent(this, async(e) => {\n cancelEvent(e);\n if(loading) return;\n const peerId = this.peerId;\n loading = true;\n await openAvatarViewer(this, this.peerId, () => this.peerId === peerId);\n loading = false;\n });\n }\n\n public updateOptions(options: Partial[0]>) {\n for(const i in options) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n public updateWithOptions(options: {\n peerId: PeerId,\n threadId?: number,\n isDialog?: boolean,\n isBig?: boolean,\n peerTitle?: string,\n lazyLoadQueue?: LazyLoadQueue | false,\n loadPromises?: Promise[],\n wrapOptions?: WrapSomethingOptions\n }) {\n const wasPeerId = this.peerId;\n const wasThreadId = this.threadId;\n this.updateOptions(options);\n const newPeerId = this.peerId;\n const threadId = this.threadId;\n\n if(wasPeerId === newPeerId && wasThreadId === threadId) {\n return;\n }\n\n this.dataset.peerId = '' + newPeerId;\n\n if(threadId) {\n this.dataset.threadId = '' + threadId;\n } else if(wasThreadId) {\n delete this.dataset.threadId;\n }\n\n if(wasPeerId) {\n const key = getAvatarQueueKey(wasPeerId, wasThreadId);\n const set = believeMe.get(key);\n if(set) {\n set.delete(this);\n if(!set.size) {\n believeMe.delete(key);\n }\n }\n }\n\n const middleware = options.wrapOptions?.middleware;\n this.middlewareHelper.destroy();\n if(middleware) {\n this.middlewareHelper = middleware.create();\n } else {\n this.middlewareHelper.destroy();\n }\n\n return this.update();\n }\n\n public remove() {\n this.middlewareHelper.destroy();\n super.remove();\n }\n\n private r(onlyThumb = false) {\n const promise = putPhoto({\n div: this,\n peerId: this.peerId,\n isDialog: this.isDialog,\n title: this.peerTitle,\n onlyThumb,\n isBig: this.isBig,\n threadId: this.threadId,\n wrapOptions: {\n middleware: this.middlewareHelper.get(),\n ...(this.wrapOptions || {})\n }\n });\n // recordPromise(promise, 'avatar putPhoto-' + this.peerId);\n\n if(this.loadPromises) {\n this.loadPromises.push(promise);\n\n promise.finally(() => {\n this.loadPromises = undefined;\n });\n }\n\n return promise;\n }\n\n public update() {\n if(this.lazyLoadQueue) {\n if(!seen.has(this.peerId)) {\n if(this.addedToQueue) return;\n this.addedToQueue = true;\n\n const key = getAvatarQueueKey(this.peerId, this.threadId);\n let set = believeMe.get(key);\n if(!set) {\n believeMe.set(key, set = new Set());\n }\n\n set.add(this);\n\n this.lazyLoadQueue.push({\n div: this,\n load: () => {\n seen.add(this.peerId);\n return this.update();\n }\n });\n\n return this.r(true);\n } else if(this.addedToQueue) {\n this.lazyLoadQueue.delete({div: this});\n }\n }\n\n seen.add(this.peerId);\n\n const promise = this.r();\n\n if(this.addedToQueue) {\n promise.finally(() => {\n this.addedToQueue = false;\n });\n }\n\n const key = getAvatarQueueKey(this.peerId, this.threadId);\n const set = believeMe.get(key);\n if(set) {\n set.delete(this);\n const arr = Array.from(set);\n believeMe.delete(key);\n\n for(let i = 0, length = arr.length; i < length; ++i) {\n arr[i].update();\n }\n }\n\n return promise;\n }\n}\n\ncustomElements.define('avatar-element', AvatarElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {CancellablePromise} from '../helpers/cancellablePromise';\nimport type {InputFile} from '../layer';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport PopupElement from './popups';\nimport PopupAvatar from './popups/avatar';\n\nexport default class AvatarEdit {\n public container: HTMLElement;\n private canvas: HTMLCanvasElement;\n private icon: HTMLSpanElement;\n\n constructor(onChange: (uploadAvatar: () => CancellablePromise) => void, options?: ConstructorParameters[0]) {\n this.container = document.createElement('div');\n this.container.classList.add('avatar-edit');\n\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('avatar-edit-canvas');\n\n this.icon = document.createElement('span');\n this.icon.classList.add('tgico', 'tgico-cameraadd');\n\n this.container.append(this.canvas, this.icon);\n\n attachClickEvent(this.container, () => {\n PopupElement.createPopup(PopupAvatar, options).open(this.canvas, onChange);\n });\n }\n\n public clear() {\n const ctx = this.canvas.getContext('2d');\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport ripple from './ripple';\n\nexport type ButtonOptions = Partial<{\n noRipple: true,\n onlyMobile: true,\n icon: string,\n rippleSquare: true,\n text: LangPackKey,\n disabled: boolean,\n asDiv: boolean,\n asLink: boolean\n}>;\n\nexport default function Button(className: string, options: T = {} as T): T['asLink'] extends true ? HTMLAnchorElement : HTMLButtonElement {\n const button = document.createElement(options.asLink ? 'a' : (options.asDiv ? 'div' : 'button'));\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\n\n if(!options.noRipple) {\n if(options.rippleSquare) {\n button.classList.add('rp-square');\n }\n\n ripple(button);\n }\n\n if(options.onlyMobile) {\n button.classList.add('only-handhelds');\n }\n\n if(options.disabled) {\n button.setAttribute('disabled', 'true');\n }\n\n if(options.text) {\n button.append(i18n(options.text));\n }\n\n return button as any;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Button from './button';\n\nconst ButtonCorner = (options: Partial<{className: string, icon: string, noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\n const button = Button('btn-circle btn-corner z-depth-1' + (options.className ? ' ' + options.className : ''), options);\n return button;\n};\n\nexport default ButtonCorner;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Button from './button';\n\nconst ButtonIcon = (className?: string, options: Partial<{noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\n const button = Button('btn-icon', {\n icon: className || undefined,\n ...options\n });\n\n return button;\n};\n\nexport default ButtonIcon;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport flatten from '../helpers/array/flatten';\nimport contextMenuController from '../helpers/contextMenuController';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {AttachClickOptions, attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\nimport CheckboxField from './checkboxField';\nimport {Document} from '../layer';\nimport wrapPhoto from './wrappers/photo';\nimport textToSvgURL from '../helpers/textToSvgURL';\nimport customProperties from '../helpers/dom/customProperties';\n\nexport type ButtonMenuItemOptions = {\n icon?: string,\n iconDoc?: Document.document,\n text?: LangPackKey,\n textArgs?: FormatterArguments,\n regularText?: Parameters[1],\n onClick: (e: MouseEvent | TouchEvent) => void | boolean | any,\n element?: HTMLElement,\n textElement?: HTMLElement,\n options?: AttachClickOptions,\n checkboxField?: CheckboxField,\n noCheckboxClickListener?: boolean,\n keepOpen?: boolean,\n separator?: boolean | HTMLElement,\n multiline?: boolean,\n loadPromise?: Promise\n /* , cancelEvent?: true */\n};\n\nexport type ButtonMenuItemOptionsVerifiable = ButtonMenuItemOptions & {\n verify?: () => boolean | Promise\n};\n\nfunction ButtonMenuItem(options: ButtonMenuItemOptions) {\n if(options.element) return [options.separator as HTMLElement, options.element].filter(Boolean);\n\n const {icon, iconDoc, text, onClick, checkboxField, noCheckboxClickListener} = options;\n const el = document.createElement('div');\n el.className = 'btn-menu-item rp-overflow' + (icon ? ' tgico-' + icon : '');\n // ripple(el);\n\n let textElement = options.textElement;\n if(!textElement) {\n textElement = options.textElement = text ? i18n(text, options.textArgs) : document.createElement('span');\n if(options.regularText) {\n setInnerHTML(textElement, options.regularText);\n }\n }\n\n if(iconDoc) {\n const iconElement = document.createElement('span');\n iconElement.classList.add('btn-menu-item-icon');\n el.append(iconElement);\n\n options.loadPromise = wrapPhoto({\n container: iconElement,\n photo: iconDoc,\n boxWidth: 24,\n boxHeight: 24,\n withoutPreloader: true,\n noFadeIn: true,\n noBlur: true,\n processUrl: (url) => {\n return fetch(url)\n .then((response) => response.text())\n .then((text) => {\n const color = customProperties.getProperty('primary-text-color');\n const doc = new DOMParser().parseFromString(text, 'image/svg+xml');\n const svg = doc.firstElementChild as HTMLElement;\n svg.querySelectorAll('path').forEach((path) => {\n path.setAttributeNS(null, 'fill', color);\n path.style.stroke = color;\n path.style.strokeWidth = '.25px';\n });\n return textToSvgURL(svg.outerHTML);\n });\n }\n }).then((ret) => ret.loadPromises.thumb);\n }\n\n textElement.classList.add('btn-menu-item-text');\n el.append(textElement);\n\n const keepOpen = !!checkboxField || !!options.keepOpen;\n\n // * cancel mobile keyboard close\n onClick && attachClickEvent(el, /* CLICK_EVENT_NAME !== 'click' || keepOpen ? */ (e) => {\n cancelEvent(e);\n\n const menu = findUpClassName(e.target, 'btn-menu');\n if(menu && !menu.classList.contains('active')) {\n return;\n }\n\n const result = onClick(e);\n\n if(result === false) {\n return;\n }\n\n if(!keepOpen) {\n contextMenuController.close();\n }\n\n if(checkboxField && !noCheckboxClickListener/* && result !== false */) {\n checkboxField.checked = checkboxField.input.type === 'radio' ? true : !checkboxField.checked;\n }\n }/* : onClick */, options.options);\n\n if(checkboxField) {\n el.append(checkboxField.label);\n }\n\n if(options.separator === true) {\n options.separator = document.createElement('hr');\n }\n\n if(options.multiline) {\n el.classList.add('is-multiline');\n }\n\n return [options.separator as HTMLElement, options.element = el].filter(Boolean);\n}\n\nexport function ButtonMenuSync({listenerSetter, buttons}: {\n buttons: ButtonMenuItemOptions[],\n listenerSetter?: ListenerSetter\n}) {\n const el: HTMLElement = document.createElement('div');\n el.classList.add('btn-menu');\n\n if(listenerSetter) {\n buttons.forEach((b) => {\n if(b.options) {\n b.options.listenerSetter = listenerSetter;\n } else {\n b.options = {listenerSetter};\n }\n });\n }\n\n const items = buttons.map(ButtonMenuItem);\n el.append(...flatten(items));\n\n return el;\n}\n\nexport default async function ButtonMenu(options: Parameters[0]) {\n const el = ButtonMenuSync(options);\n await Promise.all(options.buttons.map(({loadPromise}) => loadPromise));\n return el;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport contextMenuController from '../helpers/contextMenuController';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {AttachClickOptions, CLICK_EVENT_NAME} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ButtonIcon from './buttonIcon';\nimport ButtonMenu, {ButtonMenuItemOptionsVerifiable} from './buttonMenu';\nimport filterAsync from '../helpers/array/filterAsync';\nimport {doubleRaf} from '../helpers/schedulers';\n\n// TODO: refactor for attachClickEvent, because if move finger after touchstart, it will start anyway\nexport function ButtonMenuToggleHandler({\n el,\n onOpen,\n options,\n onClose\n}: {\n el: HTMLElement,\n onOpen?: (e: Event) => any,\n options?: AttachClickOptions,\n onClose?: () => void\n}) {\n const add = options?.listenerSetter ? options.listenerSetter.add(el) : el.addEventListener.bind(el);\n\n add(CLICK_EVENT_NAME, (e: Event) => {\n if(!el.classList.contains('btn-menu-toggle')) return false;\n\n cancelEvent(e);\n\n if(el.classList.contains('menu-open')) {\n contextMenuController.close();\n } else {\n const result = onOpen?.(e);\n const open = () => {\n const openedMenu = el.querySelector('.btn-menu') as HTMLDivElement;\n contextMenuController.openBtnMenu(openedMenu, onClose);\n };\n\n if(result instanceof Promise) {\n result.then(open);\n } else {\n open();\n }\n }\n });\n}\n\nexport default function ButtonMenuToggle({\n buttonOptions,\n listenerSetter: attachListenerSetter,\n container,\n direction,\n buttons,\n onOpenBefore,\n onOpen,\n onClose,\n onCloseAfter\n}: {\n buttonOptions?: Parameters[1],\n listenerSetter?: ListenerSetter,\n container?: HTMLElement\n direction: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right',\n buttons: ButtonMenuItemOptionsVerifiable[],\n onOpenBefore?: (e: Event) => any,\n onOpen?: (e: Event, element: HTMLElement) => any,\n onClose?: () => void,\n onCloseAfter?: () => void\n}) {\n if(buttonOptions) {\n buttonOptions.asDiv = true;\n }\n\n const button = container ?? ButtonIcon('more', buttonOptions);\n button.classList.add('btn-menu-toggle');\n\n const listenerSetter = new ListenerSetter();\n\n let element: HTMLElement, closeTimeout: number;\n ButtonMenuToggleHandler({\n el: button,\n onOpen: async(e) => {\n await onOpenBefore?.(e);\n if(closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n return;\n }\n\n const f = (b: (typeof buttons[0])[]) => filterAsync(b, (button) => button?.verify?.() ?? true);\n\n const filteredButtons = await f(buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const _element = element = await ButtonMenu({\n buttons: filteredButtons,\n listenerSetter\n });\n _element.classList.add(direction);\n\n await onOpen?.(e, _element);\n\n button.append(_element);\n await doubleRaf();\n },\n options: {\n listenerSetter: attachListenerSetter\n },\n onClose: () => {\n onClose?.();\n\n closeTimeout = window.setTimeout(() => {\n onCloseAfter?.();\n closeTimeout = undefined;\n listenerSetter.removeAll();\n buttons.forEach((button) => button.element = undefined);\n element.remove();\n }, 300);\n }\n });\n\n return button;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko, Artem Kolnogorov and unknown creator of the script taken from http://useless.altervista.org/gradient.html\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {animateSingle} from '../../helpers/animation';\nimport {hexToRgb} from '../../helpers/color';\nimport {easeOutQuadApply} from '../../helpers/easing/easeOutQuad';\n\nconst WIDTH = 50;\nconst HEIGHT = WIDTH;\n\nexport default class ChatBackgroundGradientRenderer {\n private readonly _width = WIDTH;\n private readonly _height = HEIGHT;\n private _phase: number;\n private _tail: number;\n private readonly _tails = 90;\n private readonly _scrollTails = 50;\n private _frames: ImageData[];\n private _colors: {r: number, g: number, b: number}[];\n private readonly _curve = [\n 0, 0.25, 0.50, 0.75, 1, 1.5, 2, 2.5, 3, 3.5, 4, 5, 6, 7, 8, 9, 10, 11, 12,\n 13, 14, 15, 16, 17, 18, 18.3, 18.6, 18.9, 19.2, 19.5, 19.8, 20.1, 20.4, 20.7,\n 21.0, 21.3, 21.6, 21.9, 22.2, 22.5, 22.8, 23.1, 23.4, 23.7, 24.0, 24.3, 24.6,\n 24.9, 25.2, 25.5, 25.8, 26.1, 26.3, 26.4, 26.5, 26.6, 26.7, 26.8, 26.9, 27\n ];\n private readonly _incrementalCurve: number[];\n private readonly _positions = [\n {x: 0.80, y: 0.10},\n {x: 0.60, y: 0.20},\n {x: 0.35, y: 0.25},\n {x: 0.25, y: 0.60},\n {x: 0.20, y: 0.90},\n {x: 0.40, y: 0.80},\n {x: 0.65, y: 0.75},\n {x: 0.75, y: 0.40}\n ];\n private readonly _phases = this._positions.length;\n private _onWheelRAF: number;\n private _scrollDelta: number;\n\n // private _ts = 0;\n // private _fps = 15;\n // private _frametime = 1000 / this._fps;\n // private _raf: number;\n\n private _canvas: HTMLCanvasElement;\n private _ctx: CanvasRenderingContext2D;\n private _hc: HTMLCanvasElement;\n private _hctx: CanvasRenderingContext2D;\n\n private _addedScrollListener: boolean;\n private _animatingToNextPosition: boolean;\n private _nextPositionTail: number;\n private _nextPositionTails: number;\n private _nextPositionLeft: number;\n\n constructor() {\n const diff = this._tails / this._curve[this._curve.length - 1];\n\n for(let i = 0, length = this._curve.length; i < length; ++i) {\n this._curve[i] = this._curve[i] * diff;\n }\n\n this._incrementalCurve = this._curve.map((v, i, arr) => {\n return v - (arr[i - 1] ?? 0);\n });\n }\n\n private hexToRgb(hex: string) {\n const result = hexToRgb(hex);\n return {r: result[0], g: result[1], b: result[2]};\n }\n\n private getPositions(shift: number) {\n const positions = this._positions.slice();\n positions.push(...positions.splice(0, shift));\n\n const result: typeof positions = [];\n for(let i = 0; i < positions.length; i += 2) {\n result.push(positions[i]);\n }\n return result;\n }\n\n private getNextPositions(phase: number, curveMax: number, curve: number[]) {\n const pos = this.getPositions(phase);\n if(!curve[0] && curve.length === 1) {\n return [pos];\n }\n\n const nextPos = this.getPositions(++phase % this._phases);\n const distances = nextPos.map((nextPos, idx) => {\n return {\n x: (nextPos.x - pos[idx].x) / curveMax,\n y: (nextPos.y - pos[idx].y) / curveMax\n };\n });\n\n const positions = curve.map((value) => {\n return distances.map((distance, idx) => {\n return {\n x: pos[idx].x + distance.x * value,\n y: pos[idx].y + distance.y * value\n };\n });\n });\n\n return positions;\n }\n\n private curPosition(phase: number, tail: number) {\n const positions = this.getNextPositions(phase, this._tails, [tail]);\n return positions[0];\n }\n\n private changeTail(diff: number) {\n this._tail += diff;\n\n while(this._tail >= this._tails) {\n this._tail -= this._tails;\n if(++this._phase >= this._phases) {\n this._phase -= this._phases;\n }\n }\n\n while(this._tail < 0) {\n this._tail += this._tails;\n if(--this._phase < 0) {\n this._phase += this._phases;\n }\n }\n }\n\n private onWheel = (e: {deltaY: number}) => {\n if(this._animatingToNextPosition) {\n return;\n }\n\n this._scrollDelta += e.deltaY;\n if(this._onWheelRAF === undefined) {\n this._onWheelRAF = requestAnimationFrame(this.drawOnWheel);\n }\n };\n\n private changeTailAndDraw(diff: number) {\n this.changeTail(diff);\n const curPos = this.curPosition(this._phase, this._tail);\n this.drawGradient(curPos);\n }\n\n private drawOnWheel = () => {\n const value = this._scrollDelta / this._scrollTails;\n this._scrollDelta %= this._scrollTails;\n const diff = value > 0 ? Math.floor(value) : Math.ceil(value);\n if(diff) {\n this.changeTailAndDraw(diff);\n }\n this._onWheelRAF = undefined;\n };\n\n private drawNextPositionAnimated = (getProgress?: () => number) => {\n let done: boolean, id: ImageData;\n if(getProgress) {\n const value = getProgress();\n done = value >= 1;\n const transitionValue = easeOutQuadApply(value, 1);\n const nextPositionTail = this._nextPositionTail ?? 0;\n const tail = this._nextPositionTail = this._nextPositionTails * transitionValue;\n const diff = tail - nextPositionTail;\n if(diff) {\n this._nextPositionLeft -= diff;\n this.changeTailAndDraw(diff);\n }\n } else {\n const frames = this._frames;\n id = frames.shift();\n done = !frames.length;\n }\n\n if(id) {\n this.drawImageData(id);\n }\n\n if(done) {\n this._nextPositionLeft = undefined;\n this._nextPositionTails = undefined;\n this._nextPositionTail = undefined;\n this._animatingToNextPosition = undefined;\n }\n\n return !done;\n };\n\n private getGradientImageData(positions: {x: number, y: number}[]) {\n const id = this._hctx.createImageData(this._width, this._height);\n const pixels = id.data;\n\n let offset = 0;\n for(let y = 0; y < this._height; ++y) {\n const directPixelY = y / this._height;\n const centerDistanceY = directPixelY - 0.5;\n const centerDistanceY2 = centerDistanceY * centerDistanceY;\n\n for(let x = 0; x < this._width; ++x) {\n const directPixelX = x / this._width;\n\n const centerDistanceX = directPixelX - 0.5;\n const centerDistance = Math.sqrt(centerDistanceX * centerDistanceX + centerDistanceY2);\n\n const swirlFactor = 0.35 * centerDistance;\n const theta = swirlFactor * swirlFactor * 0.8 * 8.0;\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n\n const pixelX = Math.max(0.0, Math.min(1.0, 0.5 + centerDistanceX * cosTheta - centerDistanceY * sinTheta));\n const pixelY = Math.max(0.0, Math.min(1.0, 0.5 + centerDistanceX * sinTheta + centerDistanceY * cosTheta));\n\n let distanceSum = 0.0;\n\n let r = 0.0;\n let g = 0.0;\n let b = 0.0;\n\n for(let i = 0; i < this._colors.length; i++) {\n const colorX = positions[i].x;\n const colorY = positions[i].y;\n\n const distanceX = pixelX - colorX;\n const distanceY = pixelY - colorY;\n\n let distance = Math.max(0.0, 0.9 - Math.sqrt(distanceX * distanceX + distanceY * distanceY));\n distance = distance * distance * distance * distance;\n distanceSum += distance;\n\n r += distance * this._colors[i].r / 255;\n g += distance * this._colors[i].g / 255;\n b += distance * this._colors[i].b / 255;\n }\n\n pixels[offset++] = r / distanceSum * 255.0;\n pixels[offset++] = g / distanceSum * 255.0;\n pixels[offset++] = b / distanceSum * 255.0;\n pixels[offset++] = 0xFF;\n }\n }\n return id;\n }\n\n private drawImageData(id: ImageData) {\n this._hctx.putImageData(id, 0, 0);\n this._ctx.drawImage(this._hc, 0, 0, this._width, this._height);\n }\n\n private drawGradient(positions: {x: number, y: number}[]) {\n this.drawImageData(this.getGradientImageData(positions));\n }\n\n // private doAnimate = () => {\n // const now = +Date.now();\n // if(!document.hasFocus() || (now - this._ts) < this._frametime) {\n // this._raf = requestAnimationFrame(this.doAnimate);\n // return;\n // }\n\n // this._ts = now;\n // this.changeTail(1);\n // const cur_pos = this.curPosition(this._phase, this._tail);\n // this.drawGradient(cur_pos);\n // this._raf = requestAnimationFrame(this.doAnimate);\n // };\n\n // public animate(start?: boolean) {\n // if(!start) {\n // cancelAnimationFrame(this._raf);\n // return;\n // }\n // this.doAnimate();\n // }\n\n public init(el: HTMLCanvasElement) {\n this._frames = [];\n this._phase = 0;\n this._tail = 0;\n this._scrollDelta = 0;\n if(this._onWheelRAF !== undefined) {\n cancelAnimationFrame(this._onWheelRAF);\n this._onWheelRAF = undefined;\n }\n\n const colors = el.getAttribute('data-colors').split(',').reverse();\n this._colors = colors.map((color) => {\n return this.hexToRgb(color);\n });\n\n if(!this._hc) {\n this._hc = document.createElement('canvas');\n this._hc.width = this._width;\n this._hc.height = this._height;\n this._hctx = this._hc.getContext('2d', {alpha: false});\n }\n\n this._canvas = el;\n this._ctx = this._canvas.getContext('2d', {alpha: false});\n this.update();\n }\n\n public update() {\n if(this._colors.length < 2) {\n const color = this._colors[0];\n this._ctx.fillStyle = `rgb(${color.r}, ${color.g}, ${color.b})`;\n this._ctx.fillRect(0, 0, this._width, this._height);\n return;\n }\n\n const pos = this.curPosition(this._phase, this._tail);\n this.drawGradient(pos);\n }\n\n public toNextPosition(getProgress?: () => number) {\n if(this._colors.length < 2) {\n return;\n }\n\n if(getProgress) {\n this._nextPositionLeft = this._tails + (this._nextPositionLeft ?? 0);\n this._nextPositionTails = this._nextPositionLeft;\n this._nextPositionTail = undefined;\n this._animatingToNextPosition = true;\n animateSingle(this.drawNextPositionAnimated.bind(this, getProgress), this);\n return;\n }\n\n const tail = this._tail;\n const tails = this._tails;\n\n let nextPhaseOnIdx: number;\n\n const curve: number[] = [];\n for(let i = 0, length = this._incrementalCurve.length; i < length; ++i) {\n const inc = this._incrementalCurve[i];\n let value = (curve[i - 1] ?? tail) + inc;\n\n if(+value.toFixed(2) > tails && nextPhaseOnIdx === undefined) {\n nextPhaseOnIdx = i;\n value %= tails;\n }\n\n curve.push(value);\n }\n\n const currentPhaseCurve = curve.slice(0, nextPhaseOnIdx);\n const nextPhaseCurve = nextPhaseOnIdx !== undefined ? curve.slice(nextPhaseOnIdx) : [];\n\n [currentPhaseCurve, nextPhaseCurve].forEach((curve, idx, curves) => {\n const last = curve[curve.length - 1];\n if(last !== undefined && last > tails) {\n curve[curve.length - 1] = +last.toFixed(2);\n }\n\n this._tail = last ?? 0;\n\n if(!curve.length) {\n return;\n }\n\n const positions = this.getNextPositions(this._phase, tails, curve);\n if(idx !== (curves.length - 1)) {\n if(++this._phase >= this._phases) {\n this._phase -= this._phases;\n }\n }\n\n const ids = positions.map((pos) => {\n return this.getGradientImageData(pos);\n });\n\n this._frames.push(...ids);\n });\n\n this._animatingToNextPosition = true;\n animateSingle(this.drawNextPositionAnimated, this);\n }\n\n // public toNextPositionThrottled = throttle(this.toNextPosition.bind(this), 100, true);\n\n public scrollAnimate(start?: boolean) {\n return;\n\n if(this._colors.length < 2 && start) {\n return;\n }\n\n if(start && !this._addedScrollListener) {\n document.addEventListener('wheel', this.onWheel);\n this._addedScrollListener = true;\n } else if(!start && this._addedScrollListener) {\n document.removeEventListener('wheel', this.onWheel);\n this._addedScrollListener = false;\n }\n }\n\n public cleanup() {\n this.scrollAnimate(false);\n // this.animate(false);\n }\n\n public static createCanvas(colors?: string) {\n const canvas = document.createElement('canvas');\n canvas.width = WIDTH;\n canvas.height = HEIGHT;\n if(colors !== undefined) {\n canvas.dataset.colors = colors;\n }\n\n return canvas;\n }\n\n public static create(colors?: string) {\n const canvas = this.createCanvas(colors);\n const gradientRenderer = new ChatBackgroundGradientRenderer();\n gradientRenderer.init(canvas);\n\n return {gradientRenderer, canvas};\n }\n}\n","export default function easeOutQuad(t: number, b: number, c: number, d: number) {\n return t >= d ? b + c : easeOutQuadApply(t / d, c) + b;\n}\n\nexport function easeOutQuadApply(v: number, c: number) {\n return -c * v * (v - 2);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppMessagesManager, MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\nimport type ChatBubbles from './bubbles';\nimport type ChatInput from './input';\nimport type Chat from './chat';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport Button from '../button';\nimport ButtonIcon from '../buttonIcon';\nimport CheckboxField from '../checkboxField';\nimport PopupDeleteMessages from '../popups/deleteMessages';\nimport PopupForward from '../popups/forward';\nimport SetTransition from '../singleTransition';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport PopupSendNow from '../popups/sendNow';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport I18n, {i18n, _i18n} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport cancelSelection from '../../helpers/dom/cancelSelection';\nimport getSelectedText from '../../helpers/dom/getSelectedText';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport AppSearchSuper from '../appSearchSuper.';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport {randomLong} from '../../helpers/random';\nimport {attachClickEvent, AttachClickOptions} from '../../helpers/dom/clickEvent';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport appImManager from '../../lib/appManagers/appImManager';\n\nconst accumulateMapSet = (map: Map>) => {\n return [...map.values()].reduce((acc, v) => acc + v.size, 0);\n};\n\n// const MIN_CLICK_MOVE = 32; // minimum bubble height\n\nclass AppSelection extends EventListenerBase<{\n toggle: (isSelecting: boolean) => void\n}> {\n public selectedMids: Map> = new Map();\n public isSelecting = false;\n\n public selectedText: string;\n\n protected listenerSetter: ListenerSetter;\n protected isScheduled: boolean;\n protected listenElement: HTMLElement;\n\n protected onToggleSelection: (forwards: boolean, animate: boolean) => void | Promise;\n protected onUpdateContainer: (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => void;\n protected onCancelSelection: () => void;\n protected toggleByMid: (peerId: PeerId, mid: number) => void;\n protected toggleByElement: (bubble: HTMLElement) => void;\n\n protected navigationType: NavigationItem['type'];\n\n protected getElementFromTarget: (target: HTMLElement) => HTMLElement;\n protected verifyTarget: (e: MouseEvent, target: HTMLElement) => boolean;\n protected verifyMouseMoveTarget: (e: MouseEvent, element: HTMLElement, selecting: boolean) => boolean;\n protected verifyTouchLongPress: () => boolean;\n protected targetLookupClassName: string;\n protected lookupBetweenParentClassName: string;\n protected lookupBetweenElementsQuery: string;\n\n protected doNotAnimate: boolean;\n protected managers: AppManagers;\n\n constructor(options: {\n managers: AppManagers,\n getElementFromTarget: AppSelection['getElementFromTarget'],\n verifyTarget?: AppSelection['verifyTarget'],\n verifyMouseMoveTarget?: AppSelection['verifyMouseMoveTarget'],\n verifyTouchLongPress?: AppSelection['verifyTouchLongPress'],\n targetLookupClassName: string,\n lookupBetweenParentClassName: string,\n lookupBetweenElementsQuery: string,\n isScheduled?: AppSelection['isScheduled']\n }) {\n super(false);\n\n safeAssign(this, options);\n\n this.navigationType = 'multiselect-' + randomLong() as any;\n }\n\n public attachListeners(listenElement: HTMLElement, listenerSetter: ListenerSetter) {\n if(this.listenElement) {\n this.listenerSetter.removeAll();\n }\n\n this.listenElement = listenElement;\n this.listenerSetter = listenerSetter;\n\n if(!listenElement) {\n return;\n }\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(listenElement)('touchend', () => {\n if(!this.isSelecting) return;\n this.selectedText = getSelectedText();\n });\n\n attachContextMenuListener(listenElement, (e) => {\n if(this.isSelecting || (this.verifyTouchLongPress && !this.verifyTouchLongPress())) return;\n\n // * these two lines will fix instant text selection on iOS Safari\n document.body.classList.add('no-select'); // * need no-select on body because chat-input transforms in channels\n listenElement.addEventListener('touchend', (e) => {\n cancelEvent(e); // ! this one will fix propagation to document loader button, etc\n document.body.classList.remove('no-select');\n\n // this.chat.bubbles.onBubblesClick(e);\n }, {once: true, capture: true});\n\n cancelSelection();\n // cancelEvent(e as any);\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(element) {\n this.toggleByElement(element);\n }\n }, listenerSetter);\n\n return;\n }\n\n listenerSetter.add(listenElement)('mousedown', this.onMouseDown);\n }\n\n private onMouseDown = (e: MouseEvent) => {\n // console.log('selection mousedown', e);\n const element = findUpClassName(e.target, this.targetLookupClassName);\n if(e.button !== 0) {\n return;\n }\n\n if(this.verifyTarget && !this.verifyTarget(e, element)) {\n return;\n }\n\n const seen: AppSelection['selectedMids'] = new Map();\n let selecting: boolean;\n\n /* let good = false;\n const {x, y} = e; */\n\n /* const bubbles = appImManager.bubbles;\n for(const mid in bubbles) {\n const bubble = bubbles[mid];\n bubble.addEventListener('mouseover', () => {\n console.log('mouseover');\n }, {once: true});\n } */\n\n let firstTarget = element;\n\n const processElement = (element: HTMLElement, checkBetween = true) => {\n const mid = +element.dataset.mid;\n if(!mid || !element.dataset.peerId) return;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!isInDOM(firstTarget)) {\n firstTarget = element;\n }\n\n let seenSet = seen.get(peerId);\n if(!seenSet) {\n seen.set(peerId, seenSet = new Set());\n }\n\n if(seenSet.has(mid)) {\n return;\n }\n\n const isSelected = this.isMidSelected(peerId, mid);\n if(selecting === undefined) {\n // bubblesContainer.classList.add('no-select');\n selecting = !isSelected;\n }\n\n seenSet.add(mid);\n\n if((selecting && !isSelected) || (!selecting && isSelected)) {\n const seenLength = accumulateMapSet(seen);\n if(this.toggleByElement && checkBetween) {\n if(seenLength < 2) {\n if(findUpAsChild(element, firstTarget)) {\n firstTarget = element;\n }\n }\n\n const elementsBetween = this.getElementsBetween(firstTarget, element);\n // console.log(elementsBetween);\n if(elementsBetween.length) {\n elementsBetween.forEach((element) => {\n processElement(element, false);\n });\n }\n }\n\n if(!this.selectedMids.size) {\n if(seenLength === 2 && this.toggleByMid) {\n for(const [peerId, mids] of seen) {\n for(const mid of mids) {\n this.toggleByMid(peerId, mid);\n }\n }\n }\n } else if(this.toggleByElement) {\n this.toggleByElement(element);\n }\n }\n };\n\n // const foundTargets: Map = new Map();\n let canceledSelection = false;\n const onMouseMove = (e: MouseEvent) => {\n if(!canceledSelection) {\n cancelSelection();\n canceledSelection = true;\n }\n /* if(!good) {\n if(Math.abs(e.x - x) > MIN_CLICK_MOVE || Math.abs(e.y - y) > MIN_CLICK_MOVE) {\n good = true;\n } else {\n return;\n }\n } */\n\n /* if(foundTargets.has(e.target as HTMLElement)) return;\n foundTargets.set(e.target as HTMLElement, true); */\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(!element) {\n // console.error('found no bubble', e);\n return;\n }\n\n if(this.verifyMouseMoveTarget && !this.verifyMouseMoveTarget(e, element, selecting)) {\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n this.listenerSetter.removeManual(document, 'mouseup', onMouseUp, documentListenerOptions);\n return;\n }\n\n processElement(element);\n };\n\n const onMouseUp = (e: MouseEvent) => {\n if(seen.size) {\n attachClickEvent(window, cancelEvent, {capture: true, once: true, passive: false});\n }\n\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n // bubblesContainer.classList.remove('no-select');\n\n // ! CANCEL USER SELECTION !\n cancelSelection();\n };\n\n const documentListenerOptions = {once: true};\n this.listenerSetter.add(this.listenElement)('mousemove', onMouseMove);\n this.listenerSetter.add(document)('mouseup', onMouseUp, documentListenerOptions);\n };\n\n private getElementsBetween = (first: HTMLElement, last: HTMLElement) => {\n if(first === last) {\n return [];\n }\n\n const firstRect = first.getBoundingClientRect();\n const lastRect = last.getBoundingClientRect();\n const difference = (firstRect.top - lastRect.top) || (firstRect.left - lastRect.left);\n const isHigher = difference < 0;\n\n const parent = findUpClassName(first, this.lookupBetweenParentClassName);\n if(!parent) {\n return [];\n }\n\n const elements = Array.from(parent.querySelectorAll(this.lookupBetweenElementsQuery)) as HTMLElement[];\n let firstIndex = elements.indexOf(first);\n let lastIndex = elements.indexOf(last);\n\n if(!isHigher) {\n [lastIndex, firstIndex] = [firstIndex, lastIndex];\n }\n\n const slice = elements.slice(firstIndex + 1, lastIndex);\n\n // console.log('getElementsBetween', first, last, slice, firstIndex, lastIndex, isHigher);\n\n return slice;\n };\n\n protected isElementShouldBeSelected(element: HTMLElement) {\n return this.isMidSelected(element.dataset.peerId.toPeerId(), +element.dataset.mid);\n }\n\n protected appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n element.prepend(checkboxField.label);\n }\n\n public toggleElementCheckbox(element: HTMLElement, show: boolean) {\n const hasCheckbox = !!this.getCheckboxInputFromElement(element);\n if(show) {\n if(hasCheckbox) {\n return false;\n }\n\n const checkboxField = new CheckboxField({\n name: element.dataset.mid,\n round: true\n });\n\n // * if it is a render of new message\n if(this.isSelecting) { // ! avoid breaking animation on start\n if(this.isElementShouldBeSelected(element)) {\n checkboxField.input.checked = true;\n element.classList.add('is-selected');\n }\n }\n\n this.appendCheckbox(element, checkboxField);\n } else if(hasCheckbox) {\n this.getCheckboxInputFromElement(element).parentElement.remove();\n SetTransition({\n element,\n className: 'is-selected',\n forwards: false,\n duration: 200\n });\n }\n\n return true;\n }\n\n protected getCheckboxInputFromElement(element: HTMLElement): HTMLInputElement {\n return element.firstElementChild?.tagName === 'LABEL' &&\n element.firstElementChild.firstElementChild as HTMLInputElement;\n }\n\n protected async updateContainer(forceSelection = false) {\n const size = this.selectedMids.size;\n if(!size && !forceSelection) return;\n\n let cantForward = !size,\n cantDelete = !size;\n const cantSend = !size;\n for(const [peerId, mids] of this.selectedMids) {\n const storageKey: MessagesStorageKey = `${peerId}_${this.isScheduled ? 'scheduled' : 'history'}`;\n const r = await this.managers.appMessagesManager.cantForwardDeleteMids(storageKey, Array.from(mids));\n cantForward = r.cantForward;\n cantDelete = r.cantDelete;\n\n if(cantForward && cantDelete) break;\n }\n\n this.onUpdateContainer?.(cantForward, cantDelete, cantSend);\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const wasSelecting = this.isSelecting;\n const size = this.selectedMids.size;\n this.isSelecting = !!size || forceSelection;\n\n if(wasSelecting === this.isSelecting) return false;\n\n this.dispatchEvent('toggle', this.isSelecting);\n\n // const bubblesContainer = this.bubbles.bubblesContainer;\n // bubblesContainer.classList.toggle('is-selecting', !!size);\n\n /* if(bubblesContainer.classList.contains('is-chat-input-hidden')) {\n const scrollable = this.appImManager.scrollable;\n if(scrollable.isScrolledDown) {\n scrollable.scrollTo(scrollable.scrollHeight, 'top', true, true, 200);\n }\n } */\n\n if(!IS_TOUCH_SUPPORTED) {\n this.listenElement.classList.toggle('no-select', this.isSelecting);\n\n if(wasSelecting) {\n // ! CANCEL USER SELECTION !\n cancelSelection();\n }\n }/* else {\n if(!wasSelecting) {\n bubblesContainer.classList.add('no-select');\n setTimeout(() => {\n cancelSelection();\n bubblesContainer.classList.remove('no-select');\n cancelSelection();\n }, 100);\n }\n } */\n\n blurActiveElement();\n\n const forwards = !!size || forceSelection;\n const toggleResult = this.onToggleSelection?.(forwards, !this.doNotAnimate);\n\n if(!IS_MOBILE_SAFARI) {\n if(forwards) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: () => {\n this.cancelSelection();\n }\n });\n } else {\n appNavigationController.removeByType(this.navigationType);\n }\n }\n\n if(forceSelection) {\n (toggleResult || Promise.resolve()).then(() => this.updateContainer(forceSelection));\n }\n\n return true;\n }\n\n public cancelSelection = async(doNotAnimate?: boolean) => {\n if(doNotAnimate) this.doNotAnimate = true;\n this.onCancelSelection && await this.onCancelSelection();\n this.selectedMids.clear();\n this.toggleSelection();\n cancelSelection();\n if(doNotAnimate) this.doNotAnimate = undefined;\n };\n\n public cleanup() {\n this.doNotAnimate = true;\n this.selectedMids.clear();\n this.toggleSelection(false);\n this.doNotAnimate = undefined;\n }\n\n protected updateElementSelection(element: HTMLElement, isSelected: boolean) {\n this.toggleElementCheckbox(element, true);\n const input = this.getCheckboxInputFromElement(element);\n input.checked = isSelected;\n\n this.toggleSelection();\n this.updateContainer();\n SetTransition({\n element,\n className: 'is-selected',\n forwards: isSelected,\n duration: 200\n });\n }\n\n public isMidSelected(peerId: PeerId, mid: number) {\n const set = this.selectedMids.get(peerId);\n return set?.has(mid);\n }\n\n public length() {\n return accumulateMapSet(this.selectedMids);\n }\n\n protected toggleMid(peerId: PeerId, mid: number, unselect?: boolean) {\n let set = this.selectedMids.get(peerId);\n if(unselect || (unselect === undefined && set?.has(mid))) {\n if(set) {\n set.delete(mid);\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n }\n } else {\n // const diff = rootScope.config.forwarded_count_max - this.length() - 1;\n // if(diff < 0) {\n // toast(I18n.format('Chat.Selection.LimitToast', true));\n // return false;\n // /* const it = this.selectedMids.values();\n // do {\n // const mid = it.next().value;\n // const mounted = this.appImManager.getMountedBubble(mid);\n // if(mounted) {\n // this.toggleByBubble(mounted.bubble);\n // } else {\n // const mids = this.appMessagesManager.getMidsByMid(mid);\n // for(const mid of mids) {\n // this.selectedMids.delete(mid);\n // }\n // }\n // } while(this.selectedMids.size > MAX_SELECTION_LENGTH); */\n // }\n\n if(!set) {\n set = new Set();\n this.selectedMids.set(peerId, set);\n }\n\n set.add(mid);\n }\n\n return true;\n }\n\n /**\n * ! Call this method only to handle deleted messages\n */\n public deleteSelectedMids(peerId: PeerId, mids: number[]) {\n const set = this.selectedMids.get(peerId);\n if(!set) {\n return;\n }\n\n mids.forEach((mid) => {\n set.delete(mid);\n });\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n\n this.updateContainer();\n this.toggleSelection();\n }\n}\n\nexport class SearchSelection extends AppSelection {\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n public selectionGotoBtn: HTMLElement;\n\n private isPrivate: boolean;\n\n constructor(private searchSuper: AppSearchSuper, managers: AppManagers, listenerSetter: ListenerSetter) {\n super({\n managers,\n verifyTarget: (e, target) => !!target && this.isSelecting,\n getElementFromTarget: (target) => findUpClassName(target, 'search-super-item'),\n targetLookupClassName: 'search-super-item',\n lookupBetweenParentClassName: 'tabs-tab',\n lookupBetweenElementsQuery: '.search-super-item'\n });\n\n this.isPrivate = !searchSuper.showSender;\n this.attachListeners(searchSuper.container, listenerSetter);\n }\n\n /* public appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(element.classList.contains('document') || element.tagName === 'AUDIO-ELEMENT') {\n element.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n } */\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n const elements = Array.from(this.searchSuper.tabsContainer.querySelectorAll('.search-super-item')) as HTMLElement[];\n elements.forEach((element) => {\n this.toggleElementCheckbox(element, this.isSelecting);\n });\n }\n\n return ret;\n }\n\n public toggleByElement = (element: HTMLElement) => {\n const mid = +element.dataset.mid;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!this.toggleMid(peerId, mid)) {\n return;\n }\n\n this.updateElementSelection(element, this.isMidSelected(peerId, mid));\n };\n\n public toggleByMid = (peerId: PeerId, mid: number) => {\n const element = this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id=\"${peerId}\"][data-mid=\"${mid}\"]`) as HTMLElement;\n this.toggleByElement(element);\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n const length = this.length();\n replaceContent(this.selectionCountEl, i18n('messages', [length]));\n this.selectionGotoBtn.classList.toggle('hide', length !== 1);\n this.selectionForwardBtn.classList.toggle('hide', cantForward);\n this.selectionDeleteBtn && this.selectionDeleteBtn.classList.toggle('hide', cantDelete);\n };\n\n protected onToggleSelection = (forwards: boolean, animate: boolean) => {\n SetTransition({\n element: this.searchSuper.navScrollableContainer,\n className: 'is-selecting',\n forwards,\n duration: animate ? 200 : 0,\n onTransitionEnd: () => {\n if(!this.isSelecting) {\n this.selectionContainer.remove();\n this.selectionContainer =\n this.selectionForwardBtn =\n this.selectionDeleteBtn =\n null;\n this.selectedText = undefined;\n }\n }\n });\n\n SetTransition({\n element: this.searchSuper.container,\n className: 'is-selecting',\n forwards,\n duration: 200\n });\n\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n const BASE_CLASS = 'search-super-selection';\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add(BASE_CLASS + '-container');\n\n const btnCancel = ButtonIcon(`close ${BASE_CLASS}-cancel`, {noRipple: true});\n attachClickEvent(btnCancel, () => this.cancelSelection(), {listenerSetter: this.listenerSetter, once: true});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add(BASE_CLASS + '-count');\n\n this.selectionGotoBtn = ButtonIcon(`message ${BASE_CLASS}-goto`);\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n attachClickEvent(this.selectionGotoBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n const mid = [...this.selectedMids.get(peerId)][0];\n this.cancelSelection();\n\n appImManager.setInnerPeer({peerId, lastMsgId: mid});\n }, attachClickOptions);\n\n this.selectionForwardBtn = ButtonIcon(`forward ${BASE_CLASS}-forward`);\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n if(this.isPrivate) {\n this.selectionDeleteBtn = ButtonIcon(`delete danger ${BASE_CLASS}-delete`);\n attachClickEvent(this.selectionDeleteBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n new PopupDeleteMessages(peerId, [...this.selectedMids.get(peerId)], 'chat', () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionContainer.append(...[\n btnCancel,\n this.selectionCountEl,\n this.selectionGotoBtn,\n this.selectionForwardBtn,\n this.selectionDeleteBtn\n ].filter(Boolean));\n\n const transitionElement = this.selectionContainer;\n transitionElement.style.opacity = '0';\n this.searchSuper.navScrollableContainer.append(transitionElement);\n\n void transitionElement.offsetLeft; // reflow\n transitionElement.style.opacity = '';\n }\n }\n };\n}\n\nexport default class ChatSelection extends AppSelection {\n protected selectionInputWrapper: HTMLElement;\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionSendNowBtn: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n private selectionLeft: HTMLDivElement;\n private selectionRight: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private bubbles: ChatBubbles,\n private input: ChatInput,\n managers: AppManagers\n ) {\n super({\n managers,\n getElementFromTarget: (target) => findUpClassName(target, 'grouped-item') || findUpClassName(target, 'bubble'),\n verifyTarget: (e, target) => {\n // LEFT BUTTON\n // проверка внизу нужна для того, чтобы не активировать селект если target потомок .bubble\n const bad = !this.selectedMids.size &&\n !(e.target as HTMLElement).classList.contains('bubble') &&\n !(e.target as HTMLElement).classList.contains('document-selection') &&\n target;\n\n return !bad;\n },\n verifyMouseMoveTarget: (e, element, selecting) => {\n const bad = e.target !== element &&\n !(e.target as HTMLElement).classList.contains('document-selection') &&\n selecting === undefined &&\n !this.selectedMids.size;\n return !bad;\n },\n verifyTouchLongPress: () => !this.chat.input.recording,\n targetLookupClassName: 'bubble',\n lookupBetweenParentClassName: 'bubbles-inner',\n lookupBetweenElementsQuery: '.bubble:not(.is-multiple-documents), .grouped-item',\n isScheduled: chat.type === 'scheduled'\n });\n }\n\n public appendCheckbox(bubble: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(bubble.classList.contains('document-container')) {\n bubble.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n for(const mid in this.bubbles.bubbles) {\n if(this.bubbles.skippedMids.has(+mid)) {\n continue;\n }\n\n const bubble = this.bubbles.bubbles[mid];\n this.toggleElementCheckbox(bubble, this.isSelecting);\n }\n }\n\n return ret;\n }\n\n public toggleElementCheckbox(bubble: HTMLElement, show: boolean) {\n if(!this.canSelectBubble(bubble)) return;\n\n const ret = super.toggleElementCheckbox(bubble, show);\n if(ret) {\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n this.bubbles.getBubbleGroupedItems(bubble).forEach((item) => this.toggleElementCheckbox(item, show));\n }\n }\n\n return ret;\n }\n\n public toggleByElement = (bubble: HTMLElement): Promise => {\n if(!this.canSelectBubble(bubble)) return;\n\n const mid = +bubble.dataset.mid;\n\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n if(!this.isGroupedBubbleSelected(bubble)) {\n const set = this.selectedMids.get(this.chat.peerId);\n if(set) {\n // const mids = await this.chat.getMidsByMid(mid);\n const mids = this.getMidsFromGroupContainer(bubble);\n mids.forEach((mid) => set.delete(mid));\n }\n }\n\n /* const promises = */this.bubbles.getBubbleGroupedItems(bubble).map(this.toggleByElement);\n // await Promise.all(promises);\n return;\n }\n\n if(!this.toggleMid(this.chat.peerId, mid)) {\n return;\n }\n\n const isGroupedItem = bubble.classList.contains('grouped-item');\n if(isGroupedItem) {\n const groupContainer = findUpClassName(bubble, 'bubble');\n const isGroupedSelected = this.isGroupedBubbleSelected(groupContainer);\n const isGroupedMidsSelected = this.isGroupedMidsSelected(groupContainer);\n\n const willChange = isGroupedMidsSelected || isGroupedSelected;\n if(willChange) {\n this.updateElementSelection(groupContainer, isGroupedMidsSelected);\n }\n }\n\n this.updateElementSelection(bubble, this.isMidSelected(this.chat.peerId, mid));\n };\n\n protected toggleByMid = async(peerId: PeerId, mid: number) => {\n const mounted = await this.bubbles.getMountedBubble(mid);\n if(mounted) {\n this.toggleByElement(mounted.bubble);\n }\n };\n\n public isElementShouldBeSelected(element: HTMLElement) {\n const isGrouped = element.classList.contains('is-grouped');\n return super.isElementShouldBeSelected(element) && (!isGrouped || this.isGroupedMidsSelected(element));\n }\n\n protected isGroupedBubbleSelected(bubble: HTMLElement) {\n const groupedCheckboxInput = this.getCheckboxInputFromElement(bubble);\n return groupedCheckboxInput?.checked;\n }\n\n protected getMidsFromGroupContainer(groupContainer: HTMLElement) {\n const elements = this.chat.bubbles.getBubbleGroupedItems(groupContainer);\n if(!elements.length) {\n elements.push(groupContainer);\n }\n\n return elements.map((element) => +element.dataset.mid);\n }\n\n protected isGroupedMidsSelected(groupContainer: HTMLElement) {\n const mids = this.getMidsFromGroupContainer(groupContainer);\n const selectedMids = mids.filter((mid) => this.isMidSelected(this.chat.peerId, mid));\n return mids.length === selectedMids.length;\n }\n\n protected getCheckboxInputFromElement(bubble: HTMLElement) {\n /* let perf = performance.now();\n let checkbox = bubble.firstElementChild.tagName === 'LABEL' && bubble.firstElementChild.firstElementChild as HTMLInputElement;\n console.log('getCheckboxInputFromBubble firstElementChild time:', performance.now() - perf);\n\n perf = performance.now();\n checkbox = bubble.querySelector('label input');\n console.log('getCheckboxInputFromBubble querySelector time:', performance.now() - perf); */\n /* let perf = performance.now();\n let contains = bubble.classList.contains('document-container');\n console.log('getCheckboxInputFromBubble classList time:', performance.now() - perf);\n\n perf = performance.now();\n contains = bubble.className.includes('document-container');\n console.log('getCheckboxInputFromBubble className time:', performance.now() - perf); */\n\n return bubble.classList.contains('document-container') ?\n bubble.querySelector('label input') as HTMLInputElement :\n super.getCheckboxInputFromElement(bubble);\n }\n\n public canSelectBubble(bubble: HTMLElement) {\n return !bubble.classList.contains('service') &&\n !bubble.classList.contains('is-outgoing') &&\n !bubble.classList.contains('is-error') &&\n !bubble.classList.contains('bubble-first') &&\n !bubble.classList.contains('avoid-selection');\n }\n\n protected onToggleSelection = async(forwards: boolean, animate: boolean) => {\n const {needTranslateX, widthFrom, widthTo} = await this.chat.input.center(animate);\n\n SetTransition({\n element: this.listenElement,\n className: 'is-selecting',\n forwards,\n duration: animate ? 200 : 0,\n onTransitionEnd: () => {\n if(!this.isSelecting) {\n this.selectionInputWrapper.remove();\n this.selectionInputWrapper =\n this.selectionContainer =\n this.selectionSendNowBtn =\n this.selectionForwardBtn =\n this.selectionDeleteBtn =\n this.selectionLeft =\n this.selectionRight =\n null;\n this.selectedText = undefined;\n }\n\n /* fastRaf(() => {\n this.bubbles.onScroll();\n }); */\n }\n });\n\n // const chatInput = this.appImManager.chatInput;\n\n const translateButtonsX = widthFrom < widthTo ? undefined : needTranslateX * 2;\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n this.selectionInputWrapper = document.createElement('div');\n this.selectionInputWrapper.classList.add('chat-input-wrapper', 'selection-wrapper');\n\n // const background = document.createElement('div');\n // background.classList.add('chat-input-wrapper-background');\n\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add('selection-container');\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n const btnCancel = ButtonIcon('close', {noRipple: true});\n attachClickEvent(btnCancel, () => this.cancelSelection(), {once: true, listenerSetter: this.listenerSetter});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add('selection-container-count');\n\n if(this.chat.type === 'scheduled') {\n this.selectionSendNowBtn = Button('btn-primary btn-transparent btn-short text-bold selection-container-send', {icon: 'send2'});\n this.selectionSendNowBtn.append(i18n('MessageScheduleSend'));\n attachClickEvent(this.selectionSendNowBtn, () => {\n new PopupSendNow(this.chat.peerId, [...this.selectedMids.get(this.chat.peerId)], () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n } else {\n this.selectionForwardBtn = Button('btn-primary btn-transparent text-bold selection-container-forward', {icon: 'forward'});\n this.selectionForwardBtn.append(i18n('Forward'));\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionDeleteBtn = Button('btn-primary btn-transparent danger text-bold selection-container-delete', {icon: 'delete'});\n this.selectionDeleteBtn.append(i18n('Delete'));\n attachClickEvent(this.selectionDeleteBtn, () => {\n new PopupDeleteMessages(this.chat.peerId, [...this.selectedMids.get(this.chat.peerId)], this.chat.type, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n const left = this.selectionLeft = document.createElement('div');\n left.classList.add('selection-container-left');\n left.append(btnCancel, this.selectionCountEl);\n\n const right = this.selectionRight = document.createElement('div');\n right.classList.add('selection-container-right');\n right.append(...[\n this.selectionSendNowBtn,\n this.selectionForwardBtn,\n this.selectionDeleteBtn\n ].filter(Boolean))\n\n if(translateButtonsX !== undefined) {\n left.style.transform = `translateX(${-translateButtonsX}px)`;\n right.style.transform = `translateX(${translateButtonsX}px)`;\n }\n\n this.selectionContainer.append(left, right);\n\n // background.style.opacity = '0';\n this.selectionInputWrapper.style.opacity = '0';\n this.selectionInputWrapper.append(/* background, */this.selectionContainer);\n this.input.inputContainer.append(this.selectionInputWrapper);\n\n void this.selectionInputWrapper.offsetLeft; // reflow\n // background.style.opacity = '';\n this.selectionInputWrapper.style.opacity = '';\n left.style.transform = '';\n right.style.transform = '';\n }\n } else if(this.selectionLeft && translateButtonsX !== undefined) {\n this.selectionLeft.style.transform = `translateX(-${translateButtonsX}px)`;\n this.selectionRight.style.transform = `translateX(${translateButtonsX}px)`;\n }\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n replaceContent(this.selectionCountEl, i18n('messages', [this.length()]));\n this.selectionSendNowBtn && this.selectionSendNowBtn.toggleAttribute('disabled', cantSend);\n this.selectionForwardBtn && this.selectionForwardBtn.toggleAttribute('disabled', cantForward);\n this.selectionDeleteBtn && this.selectionDeleteBtn.toggleAttribute('disabled', cantDelete);\n };\n\n protected onCancelSelection = async() => {\n return;\n const promises: Promise[] = [];\n for(const [peerId, mids] of this.selectedMids) {\n for(const mid of mids) {\n promises.push(this.bubbles.getMountedBubble(mid).then((m) => m?.bubble));\n }\n }\n\n const bubbles = filterUnique((await Promise.all(promises)).filter(Boolean));\n bubbles.forEach((bubble) => {\n this.toggleByElement(bubble);\n });\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function getSelectedText(): string {\n if(window.getSelection) {\n return window.getSelection().toString();\n // @ts-ignore\n } else if(document.selection) {\n // @ts-ignore\n return document.selection.createRange().text;\n }\n\n return '';\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../helpers/listenerSetter';\nimport ripple from './ripple';\nimport {LangPackKey, _i18n} from '../lib/langPack';\nimport getDeepProperty from '../helpers/object/getDeepProperty';\nimport rootScope from '../lib/rootScope';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\n\nexport type CheckboxFieldOptions = {\n text?: LangPackKey,\n textArgs?: any[],\n name?: string,\n round?: boolean,\n toggle?: boolean,\n stateKey?: string,\n stateValues?: any[],\n disabled?: boolean,\n checked?: boolean,\n restriction?: boolean,\n withRipple?: boolean,\n withHover?: boolean,\n listenerSetter?: ListenerSetter\n};\nexport default class CheckboxField {\n public input: HTMLInputElement;\n public label: HTMLLabelElement;\n public span: HTMLSpanElement;\n public listenerSetter: ListenerSetter;\n\n constructor(options: CheckboxFieldOptions = {}) {\n const label = this.label = document.createElement('label');\n label.classList.add('checkbox-field');\n\n if(options.restriction) {\n label.classList.add('checkbox-field-restriction');\n }\n\n if(options.round) {\n label.classList.add('checkbox-field-round');\n }\n\n if(options.disabled) {\n this.toggleDisability(true);\n }\n\n this.listenerSetter = options.listenerSetter;\n\n const input = this.input = document.createElement('input');\n input.classList.add('checkbox-field-input');\n input.type = 'checkbox';\n if(options.name) {\n input.id = 'input-' + options.name;\n }\n\n if(options.checked) {\n input.checked = true;\n }\n\n if(options.stateKey) {\n let loaded = false;\n const onChange = () => {\n if(!loaded) {\n return;\n }\n\n let value: any;\n if(options.stateValues) {\n value = options.stateValues[input.checked ? 1 : 0];\n } else {\n value = input.checked;\n }\n\n rootScope.managers.appStateManager.setByKey(options.stateKey, value);\n };\n\n apiManagerProxy.getState().then((state) => {\n loaded = true;\n const stateValue = getDeepProperty(state, options.stateKey);\n let checked: boolean;\n if(options.stateValues) {\n checked = options.stateValues.indexOf(stateValue) === 1;\n } else {\n checked = stateValue;\n }\n\n this.setValueSilently(checked);\n });\n\n if(options.listenerSetter) options.listenerSetter.add(input)('change', onChange);\n else input.addEventListener('change', onChange);\n }\n\n let span: HTMLSpanElement;\n if(options.text) {\n span = this.span = document.createElement('span');\n span.classList.add('checkbox-caption');\n _i18n(span, options.text, options.textArgs);\n } else {\n label.classList.add('checkbox-without-caption');\n }\n\n label.append(input);\n\n if(options.toggle) {\n label.classList.add('checkbox-field-toggle');\n\n const toggle = document.createElement('div');\n toggle.classList.add('checkbox-toggle');\n label.append(toggle);\n } else {\n const box = document.createElement('div');\n box.classList.add('checkbox-box');\n\n const checkSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n checkSvg.classList.add('checkbox-box-check');\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#check');\n use.setAttributeNS(null, 'x', '-1');\n checkSvg.append(use);\n\n const bg = document.createElement('div');\n bg.classList.add('checkbox-box-background');\n\n const border = document.createElement('div');\n border.classList.add('checkbox-box-border');\n\n box.append(border, bg, checkSvg);\n\n label.append(box);\n }\n\n if(span) {\n label.append(span);\n }\n\n if(options.withRipple) {\n label.classList.add('checkbox-ripple', 'hover-effect');\n ripple(label, undefined, undefined, true);\n // label.prepend(input);\n } else if(options.withHover) {\n label.classList.add('hover-effect');\n }\n }\n\n get checked() {\n return this.input.checked;\n }\n\n set checked(checked: boolean) {\n /* if(this.checked === checked) {\n return;\n } */\n\n this.setValueSilently(checked);\n\n const event = new Event('change', {bubbles: true, cancelable: true});\n this.input.dispatchEvent(event);\n }\n\n public setValueSilently(checked: boolean) {\n this.input.checked = checked;\n }\n\n public toggleDisability(disable: boolean) {\n this.label.classList.toggle('checkbox-disabled', disable);\n return () => this.toggleDisability(!disable);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField, {InputFieldOptions} from './inputField';\n\nexport default class CodeInputField extends InputField {\n constructor(public options: InputFieldOptions & {\n length: number,\n onFill: (code: string) => void\n }) {\n super(Object.assign(options, {\n plainText: true\n }));\n\n const input = this.input as HTMLInputElement;\n input.type = 'tel';\n input.setAttribute('required', '');\n input.autocomplete = 'off';\n\n let lastLength = 0;\n this.input.addEventListener('input', (e) => {\n this.input.classList.remove('error');\n this.setLabel();\n\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\n this.setValueSilently(value);\n\n const length = this.value.length;\n if(length === options.length) { // submit code\n options.onFill(this.value);\n } else if(length === lastLength) {\n return;\n }\n\n lastLength = length;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {addCancelButton} from './popups';\nimport PopupPeer, {PopupPeerCheckboxOptions, PopupPeerOptions} from './popups/peer';\n\n// type PopupConfirmationOptions = Pick;\nexport type PopupConfirmationOptions = PopupPeerOptions & {\n button: PopupPeerOptions['buttons'][0],\n checkbox?: PopupPeerOptions['checkboxes'][0]\n};\n\nexport default function confirmationPopup(\n options: T\n): Promise : (T['checkbox'] extends PopupPeerCheckboxOptions ? boolean : void)> {\n return new Promise((resolve, reject) => {\n const {button, checkbox} = options;\n button.callback = (set) => {\n if(checkbox || !set) {\n resolve(set ? !!set.size : undefined);\n } else {\n resolve(options.checkboxes.map((checkbox) => set.has(checkbox.text)));\n }\n };\n\n const buttons = addCancelButton(options.buttons || [button]);\n const cancelButton = buttons.find((button) => button.isCancel);\n cancelButton.callback = () => {\n reject();\n };\n\n options.buttons = buttons;\n options.checkboxes ??= checkbox && [checkbox];\n\n new PopupPeer('popup-confirmation', options).show();\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_EMOJI_SUPPORTED from '../environment/emojiSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport fastSmoothScroll from '../helpers/fastSmoothScroll';\nimport {randomLong} from '../helpers/random';\nimport {HelpCountry, HelpCountryCode} from '../layer';\nimport I18n, {i18n} from '../lib/langPack';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../lib/rootScope';\nimport {getCountryEmoji} from '../vendor/emoji';\nimport InputField, {InputFieldOptions} from './inputField';\nimport Scrollable from './scrollable';\n\nlet countries: HelpCountry.helpCountry[];\nconst setCountries = () => {\n countries = I18n.countriesList\n .filter((country) => !country.pFlags?.hidden)\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\n};\n\nlet init = () => {\n setCountries();\n rootScope.addEventListener('language_change', () => {\n setCountries();\n });\n};\n\nconst VIRTUAL_COUNTRIES = new Set(['FT']);\n\nexport default class CountryInputField extends InputField {\n private lastCountrySelected: HelpCountry;\n private lastCountryCodeSelected: HelpCountryCode;\n\n private hideTimeout: number;\n private selectWrapper: HTMLElement;\n\n private liMap: Map;\n\n constructor(public options: InputFieldOptions & {\n onCountryChange?: (country: HelpCountry.helpCountry, code: HelpCountryCode.helpCountryCode) => void,\n noPhoneCodes?: boolean\n } = {}) {\n super({\n label: 'Country',\n name: randomLong(),\n ...options\n });\n\n if(init) {\n init();\n init = undefined;\n }\n\n this.liMap = new Map();\n\n this.container.classList.add('input-select');\n\n const selectWrapper = this.selectWrapper = document.createElement('div');\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\n\n const arrowDown = document.createElement('span');\n arrowDown.classList.add('arrow', 'arrow-down');\n this.container.append(arrowDown);\n\n const selectList = document.createElement('ul');\n selectWrapper.appendChild(selectList);\n\n const scroll = new Scrollable(selectWrapper);\n\n let initSelect = () => {\n initSelect = null;\n\n countries.forEach((c) => {\n if(options.noPhoneCodes && VIRTUAL_COUNTRIES.has(c.iso2)) {\n return;\n }\n\n const emoji = getCountryEmoji(c.iso2);\n\n const liArr: Array = [];\n for(let i = 0, length = Math.min(c.country_codes.length, options.noPhoneCodes ? 1 : Infinity); i < length; ++i) {\n const countryCode = c.country_codes[i];\n const li = document.createElement('li');\n\n const wrapped = wrapEmojiText(emoji);\n if(IS_EMOJI_SUPPORTED) {\n const spanEmoji = document.createElement('span');\n setInnerHTML(spanEmoji, wrapped);\n li.append(spanEmoji);\n } else {\n setInnerHTML(li, wrapped);\n }\n\n const el = i18n(c.default_name as any);\n el.dataset.defaultName = c.default_name;\n li.append(el);\n\n if(!options.noPhoneCodes) {\n const span = document.createElement('span');\n span.classList.add('phone-code');\n span.innerText = '+' + countryCode.country_code;\n li.appendChild(span);\n }\n\n liArr.push(li);\n selectList.append(li);\n }\n\n this.liMap.set(c.iso2, liArr);\n });\n\n selectList.addEventListener('mousedown', (e) => {\n if(e.button !== 0) { // other buttons but left shall not pass\n return;\n }\n\n const target = findUpTag(e.target, 'LI')\n this.selectCountryByTarget(target);\n // console.log('clicked', e, countryName, phoneCode);\n });\n\n this.container.appendChild(selectWrapper);\n };\n\n initSelect();\n\n this.input.addEventListener('focus', (e) => {\n if(initSelect) {\n initSelect();\n } else {\n countries.forEach((c) => {\n const arr = this.liMap.get(c.iso2);\n if(!arr) return;\n arr.forEach((li) => li.style.display = '');\n });\n }\n\n clearTimeout(this.hideTimeout);\n this.hideTimeout = undefined;\n\n selectWrapper.classList.remove('hide');\n void selectWrapper.offsetWidth; // reflow\n selectWrapper.classList.add('active');\n\n this.select();\n\n fastSmoothScroll({\n // container: page.pageEl.parentElement.parentElement,\n container: findUpClassName(this.container, 'scrollable-y'),\n element: this.input,\n position: 'start',\n margin: 4\n });\n\n setTimeout(() => {\n if(!mouseDownHandlerAttached) {\n document.addEventListener('mousedown', onMouseDown, {capture: true});\n mouseDownHandlerAttached = true;\n }\n }, 0);\n });\n\n let mouseDownHandlerAttached = false;\n const onMouseDown = (e: MouseEvent) => {\n if(findUpClassName(e.target, 'input-select')) {\n return;\n }\n if(e.target === this.input) {\n return;\n }\n\n this.hidePicker();\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\n mouseDownHandlerAttached = false;\n };\n\n /* false && this.input.addEventListener('blur', function(this: typeof this.input, e) {\n hidePicker();\n\n e.cancelBubble = true;\n }, {capture: true}); */\n\n const onKeyPress = (e: KeyboardEvent) => {\n const key = e.key;\n if(e.ctrlKey || key === 'Control') return false;\n\n // let i = new RegExp('^' + this.value, 'i');\n const _value = this.value.toLowerCase();\n const matches: HelpCountry[] = [];\n countries.forEach((c) => {\n const arr = this.liMap.get(c.iso2);\n if(!arr) {\n return;\n }\n\n const names = [\n c.name,\n c.default_name,\n c.iso2\n ];\n\n names.filter(Boolean).forEach((name) => {\n const abbr = name.split(' ').filter((word) => /\\w/.test(word)).map((word) => word[0]).join('');\n if(abbr.length > 1) {\n names.push(abbr);\n }\n });\n\n const good = !!names.filter(Boolean).find((str) => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;// i.test(c.name);\n\n arr.forEach((li) => li.style.display = good ? '' : 'none');\n if(good) matches.push(c);\n });\n\n // Код ниже автоматически выберет страну если она осталась одна при поиске\n /* if(matches.length === 1 && matches[0].li.length === 1) {\n if(matches[0].name === lastCountrySelected) return false;\n //console.log('clicking', matches[0]);\n\n var clickEvent = document.createEvent('MouseEvents');\n clickEvent.initEvent('mousedown', true, true);\n matches[0].li[0].dispatchEvent(clickEvent);\n return false;\n } else */if(matches.length === 0) {\n countries.forEach((c) => {\n const arr = this.liMap.get(c.iso2);\n if(!arr) {\n return;\n }\n\n arr.forEach((li) => li.style.display = '');\n });\n } else if(matches.length === 1 && key === 'Enter') {\n cancelEvent(e);\n this.selectCountryByTarget(this.liMap.get(matches[0].iso2)[0]);\n }\n };\n\n this.input.addEventListener('keyup', onKeyPress);\n this.input.addEventListener('keydown', (e) => {\n if(e.key === 'Enter') {\n onKeyPress(e);\n }\n });\n\n arrowDown.addEventListener('mousedown', (e) => {\n if(this.input.matches(':focus')) {\n this.hidePicker();\n this.input.blur();\n } else {\n e.cancelBubble = true;\n e.preventDefault();\n this.input.focus();\n }\n });\n }\n\n public getSelected() {\n return {country: this.lastCountrySelected, code: this.lastCountryCodeSelected};\n }\n\n public hidePicker = () => {\n if(this.hideTimeout !== undefined) return;\n this.selectWrapper.classList.remove('active');\n this.hideTimeout = window.setTimeout(() => {\n this.selectWrapper.classList.add('hide');\n this.hideTimeout = undefined;\n }, 200);\n }\n\n public selectCountryByTarget = (target: HTMLElement) => {\n const defaultName = target.querySelector('[data-default-name]').dataset.defaultName;\n const phoneCodeEl = target.querySelector('.phone-code');\n const phoneCode = phoneCodeEl?.innerText;\n const countryCode = phoneCode && phoneCode.replace(/\\D/g, '');\n\n replaceContent(this.input, i18n(defaultName as any));\n this.simulateInputEvent();\n this.lastCountrySelected = countries.find((c) => c.default_name === defaultName);\n this.lastCountryCodeSelected = countryCode && this.lastCountrySelected.country_codes.find((_countryCode) => _countryCode.country_code === countryCode);\n\n this.options.onCountryChange?.(this.lastCountrySelected, this.lastCountryCodeSelected);\n this.hidePicker();\n }\n\n public selectCountryByIso2(iso2: string) {\n this.selectCountryByTarget(this.liMap.get(iso2)[0]);\n }\n\n public override(country: HelpCountry, code: HelpCountryCode, countryName?: string) {\n replaceContent(this.input, country ? i18n(country.default_name as any) : countryName);\n this.lastCountrySelected = country;\n this.lastCountryCodeSelected = code;\n this.options.onCountryChange?.(this.lastCountrySelected, this.lastCountryCodeSelected);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_MOBILE} from '../environment/userAgent';\nimport {animate} from '../helpers/animation';\nimport {Middleware} from '../helpers/middleware';\nimport clamp from '../helpers/number/clamp';\nimport animationIntersector, {AnimationItemGroup, AnimationItemWrapper} from './animationIntersector';\n\ntype DotRendererDot = {\n x: number,\n y: number,\n opacity: number,\n radius: number\n mOpacity: number,\n adding: boolean,\n counter: number,\n path: Path2D\n};\nexport default class DotRenderer implements AnimationItemWrapper {\n public canvas: HTMLCanvasElement;\n private context: CanvasRenderingContext2D;\n private dots: DotRendererDot[];\n\n public paused: boolean;\n public autoplay: boolean;\n public tempId: number;\n\n private dpr: number;\n\n constructor(\n private width: number,\n private height: number,\n private multiply?: number\n ) {\n const canvas = this.canvas = document.createElement('canvas');\n const dpr = this.dpr = window.devicePixelRatio;\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n canvas.classList.add('canvas-thumbnail', 'canvas-dots');\n\n this.paused = true;\n this.autoplay = true;\n this.tempId = 0;\n this.context = canvas.getContext('2d');\n }\n\n private prepare() {\n let count = Math.round(this.width * this.height / (35 * (IS_MOBILE ? 2 : 1)));\n count *= this.multiply || 1;\n count = Math.min(IS_MOBILE ? 1000 : 2200, count);\n count = Math.round(count);\n const dots: DotRendererDot[] = this.dots = new Array(count);\n\n for(let i = 0; i < count; ++i) {\n dots[i] = this.generateDot();\n }\n }\n\n private generateDot(adding?: boolean): DotRendererDot {\n const x = Math.floor(Math.random() * this.canvas.width);\n const y = Math.floor(Math.random() * this.canvas.height);\n const opacity = adding ? 0 : Math.random();\n const radius = (Math.random() >= .8 ? 1 : 0.5) * this.dpr;\n const path = new Path2D();\n path.arc(x, y, radius, 0, 2 * Math.PI, false);\n return {\n x,\n y,\n opacity,\n radius,\n mOpacity: opacity,\n adding: adding ?? Math.random() >= .5,\n counter: 0,\n path\n };\n }\n\n private draw() {\n const {context, canvas, dots} = this;\n context.clearRect(0, 0, canvas.width, canvas.height);\n context.fillStyle = '#fff';\n\n const add = 0.02;\n for(let i = 0, length = dots.length; i < length; ++i) {\n const dot = dots[i];\n const addOpacity = dot.adding ? add : -add;\n\n dot.mOpacity += addOpacity;\n // if(dot.mOpacity <= 0) dot.mOpacity = dot.opacity;\n\n // const easedOpacity = easing(dot.mOpacity);\n const easedOpacity = clamp(dot.mOpacity, 0, 1);\n context.globalAlpha = easedOpacity;\n context.fill(dot.path);\n\n if(dot.mOpacity <= 0) {\n dot.adding = true;\n\n if(++dot.counter >= 1) {\n dots[i] = this.generateDot(dot.adding);\n }\n } else if(dot.mOpacity >= 1) {\n dot.adding = false;\n }\n }\n }\n\n public remove() {\n this.pause();\n }\n\n public pause() {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n ++this.tempId;\n }\n\n public renderFirstFrame() {\n if(!this.dots) {\n this.prepare();\n }\n\n this.draw();\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n const tempId = ++this.tempId;\n\n if(!this.dots) {\n this.prepare();\n }\n\n animate(() => {\n if(this.tempId !== tempId || this.paused) {\n return false;\n }\n\n this.draw();\n return true;\n });\n }\n\n public static create({\n width,\n height,\n middleware,\n animationGroup,\n multiply\n }: {\n width: number,\n height: number,\n middleware: Middleware,\n animationGroup: AnimationItemGroup,\n multiply?: number\n }) {\n middleware.onClean(() => {\n animationIntersector.removeAnimationByPlayer(dotRenderer);\n });\n\n const dotRenderer = new DotRenderer(width, height, multiply);\n dotRenderer.renderFirstFrame();\n\n animationIntersector.addAnimation(dotRenderer, animationGroup, dotRenderer.canvas, true);\n\n return dotRenderer;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputFile} from '../layer';\nimport AvatarEdit from './avatarEdit';\nimport AvatarElement from './avatar';\nimport InputField from './inputField';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ButtonCorner from './buttonCorner';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\n\nexport default class EditPeer {\n public nextBtn: HTMLButtonElement;\n\n public uploadAvatar: () => Promise;\n public avatarEdit: AvatarEdit;\n public avatarElem: AvatarElement;\n\n private inputFields: InputField[];\n private listenerSetter: ListenerSetter;\n\n private peerId: PeerId;\n\n private _disabled = false;\n private avatarSize = 120;\n\n constructor(options: {\n peerId?: EditPeer['peerId'],\n inputFields: EditPeer['inputFields'],\n listenerSetter: ListenerSetter,\n doNotEditAvatar?: boolean,\n withoutAvatar?: boolean,\n nextBtn?: HTMLButtonElement,\n avatarSize?: number,\n popupOptions?: ConstructorParameters[1]\n }) {\n safeAssign(this, options);\n\n this.peerId ||= NULL_PEER_ID;\n\n if(!this.nextBtn) {\n this.nextBtn = ButtonCorner({icon: 'check'});\n } else if(!this.nextBtn.classList.contains('btn-corner')) {\n this.handleChange = () => {\n this.nextBtn.toggleAttribute('disabled', !this.isChanged() || this.disabled);\n };\n }\n\n if(!options.withoutAvatar) {\n this.avatarElem = new AvatarElement();\n this.avatarElem.classList.add('avatar-placeholder', 'avatar-' + this.avatarSize);\n this.avatarElem.updateWithOptions({peerId: this.peerId});\n\n if(!options.doNotEditAvatar) {\n this.avatarEdit = new AvatarEdit((_upload) => {\n this.uploadAvatar = _upload;\n this.handleChange();\n this.avatarElem.remove();\n }, options.popupOptions);\n\n this.avatarEdit.container.append(this.avatarElem);\n }\n }\n\n this.inputFields.forEach((inputField) => {\n this.listenerSetter.add(inputField.input)('input', this.handleChange);\n });\n\n this.handleChange();\n }\n\n public get disabled() {\n return this._disabled;\n }\n\n public set disabled(value) {\n this._disabled = value;\n this.inputFields.forEach((inputField) => inputField.input.toggleAttribute('disabled', value));\n this.handleChange();\n }\n\n public lockWithPromise(promise: Promise, unlockOnSuccess = false) {\n this.disabled = true;\n promise.then(() => {\n if(unlockOnSuccess) {\n this.disabled = false;\n }\n }, () => {\n this.disabled = false;\n });\n }\n\n public isChanged = () => {\n if(this.uploadAvatar) {\n return true;\n }\n\n let changedLength = 0, requiredLength = 0, requiredValidLength = 0;\n this.inputFields.forEach((inputField) => {\n if(inputField.isValid()) {\n if(inputField.isChanged()) {\n ++changedLength;\n }\n\n if(inputField.required) {\n ++requiredValidLength;\n }\n }\n\n if(inputField.required) {\n ++requiredLength;\n }\n });\n\n return requiredLength === requiredValidLength && changedLength > 0;\n };\n\n public handleChange = () => {\n this.nextBtn.classList.toggle('is-visible', this.isChanged());\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport emoticonsDropdown, {EmoticonsDropdown, EmoticonsTab, EMOTICONSSTICKERGROUP} from '..';\nimport GifsMasonry from '../../gifsMasonry';\nimport Scrollable from '../../scrollable';\nimport {putPreloader} from '../../putPreloader';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\n\nexport default class GifsTab implements EmoticonsTab {\n public content: HTMLElement;\n public scrollable: Scrollable;\n public tabId: number;\n\n constructor(private managers: AppManagers) {\n\n }\n\n init() {\n this.content = document.getElementById('content-gifs');\n const gifsContainer = this.content.firstElementChild as HTMLDivElement;\n attachClickEvent(gifsContainer, EmoticonsDropdown.onMediaClick);\n\n const scroll = this.scrollable = new Scrollable(this.content, 'GIFS');\n const masonry = new GifsMasonry(gifsContainer, EMOTICONSSTICKERGROUP, scroll);\n const preloader = putPreloader(this.content, true);\n\n this.managers.appDocsManager.getGifs().then((docs) => {\n docs.forEach((doc) => {\n masonry.add(doc);\n });\n\n preloader.remove();\n });\n\n emoticonsDropdown.addLazyLoadQueueRepeat(masonry.lazyLoadQueue, masonry.processInvisibleDiv);\n\n this.init = null;\n }\n\n onClose() {\n\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../../lib/appManagers/appDocsManager';\nimport {SliderSuperTab} from '../../slider';\nimport InputSearch from '../../inputSearch';\nimport animationIntersector, {AnimationItemGroup} from '../../animationIntersector';\nimport appSidebarRight from '..';\nimport {AppInlineBotsManager} from '../../../lib/appManagers/appInlineBotsManager';\nimport GifsMasonry from '../../gifsMasonry';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport {NULL_PEER_ID} from '../../../lib/mtproto/mtproto_config';\n\nconst ANIMATIONGROUP: AnimationItemGroup = 'GIFS-SEARCH';\n\nexport default class AppGifsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private gifsDiv: HTMLDivElement;\n\n private nextOffset = '';\n private loadedAll = false;\n\n private gifBotPeerId: PeerId;\n private masonry: GifsMasonry;\n\n private searchPromise: ReturnType;\n\n public init() {\n this.container.id = 'search-gifs-container';\n\n this.inputSearch = new InputSearch('SearchGifsTitle', (value) => {\n this.reset();\n this.search(value);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.gifsDiv = document.createElement('div');\n this.gifsDiv.classList.add('gifs-masonry');\n attachClickEvent(this.gifsDiv, this.onGifsClick, {listenerSetter: this.listenerSetter});\n\n this.scrollable.append(this.gifsDiv);\n\n this.masonry = new GifsMasonry(this.gifsDiv, ANIMATIONGROUP, this.scrollable);\n // this.backBtn.parentElement.append(this.inputSearch.container);\n\n appSidebarRight.toggleSidebar(true).then(() => {\n this.search('', true);\n\n this.scrollable.onScrolledBottom = () => {\n this.search(this.inputSearch.value, false);\n };\n });\n }\n\n private onGifsClick = async(e: MouseEvent | TouchEvent) => {\n const target = findUpClassName(e.target, 'gif');\n if(!target) return;\n\n const fileId = target.dataset.docId;\n if(await appImManager.chat.input.sendMessageWithDocument(fileId)) {\n if(mediaSizes.isMobile) {\n appSidebarRight.onCloseBtnClick();\n }\n } else {\n console.warn('got no doc by id:', fileId);\n }\n };\n\n public onClose() {\n this.scrollable.onScrolledBottom = () => {};\n }\n\n public onCloseAfterTimeout() {\n this.reset();\n this.gifsDiv.innerHTML = '';\n animationIntersector.checkAnimations(undefined, ANIMATIONGROUP);\n this.inputSearch.remove();\n return super.onCloseAfterTimeout();\n }\n\n private reset() {\n this.searchPromise = null;\n this.nextOffset = '';\n this.loadedAll = false;\n this.masonry.clear();\n }\n\n public async search(query: string, newSearch = true) {\n if(this.searchPromise || this.loadedAll) return;\n\n if(!this.gifBotPeerId) {\n this.gifBotPeerId = (await this.managers.appUsersManager.resolveUsername('gif')).id.toPeerId(false);\n }\n\n try {\n this.searchPromise = this.managers.appInlineBotsManager.getInlineResults(NULL_PEER_ID, this.gifBotPeerId, query, this.nextOffset);\n const {results, next_offset} = await this.searchPromise;\n\n if(this.inputSearch.value !== query) {\n return;\n }\n\n this.searchPromise = null;\n this.nextOffset = next_offset;\n if(newSearch) {\n this.gifsDiv.innerHTML = '';\n }\n\n if(results.length) {\n results.forEach((result) => {\n if(result._ === 'botInlineMediaResult' && result.document) {\n this.masonry.add(result.document as MyDocument);\n }\n });\n } else {\n this.loadedAll = true;\n }\n\n this.scrollable.onScroll();\n } catch(err) {\n this.searchPromise = null;\n console.error('gifs loading error:', err);\n throw err;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport InputSearch from '../../inputSearch';\nimport LazyLoadQueue from '../../lazyLoadQueue';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport PopupStickers from '../../popups/stickers';\nimport animationIntersector from '../../animationIntersector';\nimport appSidebarRight from '..';\nimport {StickerSet, StickerSetCovered} from '../../../layer';\nimport {i18n} from '../../../lib/langPack';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport wrapSticker from '../../wrappers/sticker';\n\nexport default class AppStickersTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private setsDiv: HTMLDivElement;\n private lazyLoadQueue: LazyLoadQueue;\n\n public init() {\n this.container.id = 'stickers-container';\n this.container.classList.add('chatlist-container');\n\n this.lazyLoadQueue = new LazyLoadQueue();\n\n this.inputSearch = new InputSearch('StickersTab.SearchPlaceholder', (value) => {\n this.search(value);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.setsDiv = document.createElement('div');\n this.setsDiv.classList.add('sticker-sets');\n this.scrollable.append(this.setsDiv);\n\n attachStickerViewerListeners({listenTo: this.setsDiv, listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.setsDiv, (e) => {\n const sticker = findUpClassName(e.target, 'sticker-set-sticker');\n if(sticker) {\n const docId = sticker.dataset.docId;\n appImManager.chat.input.sendMessageWithDocument(docId);\n return;\n }\n\n const target = findUpClassName(e.target, 'sticker-set');\n if(!target) return;\n\n const id = target.dataset.stickerSet as string;\n const access_hash = target.dataset.access_hash as string;\n\n const button = findUpClassName(e.target, 'sticker-set-button') as HTMLElement;\n if(button) {\n e.preventDefault();\n e.cancelBubble = true;\n\n button.setAttribute('disabled', 'true');\n\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\n this.managers.appStickersManager.toggleStickerSet(full.set).then((changed) => {\n if(changed) {\n button.textContent = '';\n button.append(i18n(full.set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\n button.classList.toggle('gray', !!full.set.installed_date);\n }\n }).finally(() => {\n // button.style.width = set.installed_date ? '68px' : '52px';\n button.removeAttribute('disabled');\n });\n });\n } else {\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\n new PopupStickers(full.set).show();\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n appSidebarRight.toggleSidebar(true).then(() => {\n this.renderFeatured();\n });\n }\n\n public onCloseAfterTimeout() {\n this.setsDiv.innerHTML = '';\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\n return super.onCloseAfterTimeout();\n }\n\n public renderSet(set: StickerSet.stickerSet) {\n // console.log('renderSet:', set);\n const div = document.createElement('div');\n div.classList.add('sticker-set');\n\n const header = document.createElement('div');\n header.classList.add('sticker-set-header');\n\n const details = document.createElement('div');\n details.classList.add('sticker-set-details');\n details.innerHTML = `
`;\n\n setInnerHTML(details.firstElementChild, wrapEmojiText(set.title));\n\n const countDiv = document.createElement('div');\n countDiv.classList.add('sticker-set-count');\n countDiv.append(i18n('Stickers', [set.count]));\n details.append(countDiv);\n\n const button = document.createElement('button');\n button.classList.add('btn-primary', 'btn-color-primary', 'sticker-set-button');\n button.append(i18n(set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\n // button.style.width = set.installed_date ? '68px' : '52px';\n\n if(set.installed_date) {\n button.classList.add('gray');\n }\n\n // ripple(button);\n\n header.append(details, button);\n\n const stickersDiv = document.createElement('div');\n stickersDiv.classList.add('sticker-set-stickers');\n\n const count = Math.min(5, set.count);\n for(let i = 0; i < count; ++i) {\n const stickerDiv = document.createElement('div');\n stickerDiv.classList.add('sticker-set-sticker');\n\n stickersDiv.append(stickerDiv);\n }\n\n this.managers.appStickersManager.getStickerSet(set).then((set) => {\n // console.log('renderSet got set:', set);\n\n for(let i = 0; i < count; ++i) {\n const div = stickersDiv.children[i] as HTMLDivElement;\n const doc = set.documents[i];\n if(doc._ === 'documentEmpty') {\n continue;\n }\n\n wrapSticker({\n doc,\n div,\n lazyLoadQueue: this.lazyLoadQueue,\n group: 'STICKERS-SEARCH',\n /* play: false,\n loop: false, */\n play: true,\n loop: true,\n width: 68,\n height: 68,\n withLock: true\n });\n }\n });\n\n /* const onMouseOver = () => {\n const animations: AnimationItem['animation'][] = [];\n for(let i = 0; i < count; ++i) {\n const stickerDiv = stickersDiv.children[i] as HTMLElement;\n const animationItem = animationIntersector.getAnimation(stickerDiv);\n if(!animationItem) continue;\n\n const animation = animationItem.animation;\n\n animations.push(animation);\n animation.loop = true;\n animation.play();\n }\n\n div.addEventListener('mouseout', () => {\n animations.forEach((animation) => {\n animation.loop = false;\n });\n\n div.addEventListener('mouseover', onMouseOver, {once: true});\n }, {once: true});\n };\n\n div.addEventListener('mouseover', onMouseOver, {once: true}); */\n\n div.dataset.stickerSet = '' + set.id;\n div.dataset.access_hash = '' + set.access_hash;\n div.dataset.title = set.title;\n\n div.append(header, stickersDiv);\n\n this.setsDiv.append(div);\n }\n\n public renderFeatured() {\n return this.managers.appStickersManager.getFeaturedStickers().then((coveredSets) => {\n if(this.inputSearch.value) {\n return;\n }\n\n coveredSets = this.filterRendered('', coveredSets);\n coveredSets.forEach((set) => {\n this.renderSet(set.set);\n });\n });\n }\n\n private filterRendered(query: string, coveredSets: StickerSetCovered[]) {\n coveredSets = coveredSets.slice();\n\n const children = Array.from(this.setsDiv.children) as HTMLElement[];\n forEachReverse(children, el => {\n const id = el.dataset.stickerSet;\n const index = coveredSets.findIndex((covered) => covered.set.id === id);\n\n if(index !== -1) {\n coveredSets.splice(index, 1);\n } else if(!query || !el.dataset.title.toLowerCase().includes(query.toLowerCase())) {\n el.remove();\n }\n });\n\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\n\n return coveredSets;\n }\n\n public search(query: string) {\n if(!query) {\n return this.renderFeatured();\n }\n\n return this.managers.appStickersManager.searchStickerSets(query, false).then((coveredSets) => {\n if(this.inputSearch.value !== query) {\n return;\n }\n\n // console.log('search result:', coveredSets);\n\n coveredSets = this.filterRendered(query, coveredSets);\n coveredSets.forEach((set) => {\n this.renderSet(set.set);\n });\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport {horizontalMenu} from '../horizontalMenu';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport Scrollable, {ScrollableX} from '../scrollable';\nimport appSidebarRight from '../sidebarRight';\nimport StickyIntersector from '../stickyIntersector';\nimport EmojiTab from './tabs/emoji';\nimport GifsTab from './tabs/gifs';\nimport StickersTab, {EmoticonsTabC, StickersTabCategory} from './tabs/stickers';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport AppGifsTab from '../sidebarRight/tabs/gifs';\nimport AppStickersTab from '../sidebarRight/tabs/stickers';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport whichChild from '../../helpers/dom/whichChild';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport DropdownHover from '../../helpers/dropdownHover';\nimport pause from '../../helpers/schedulers/pause';\nimport {IS_APPLE_MOBILE} from '../../environment/userAgent';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport type LazyLoadQueueIntersector from '../lazyLoadQueueIntersector';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport noop from '../../helpers/noop';\nimport {FocusDirection, ScrollOptions} from '../../helpers/fastSmoothScroll';\nimport BezierEasing from '../../vendor/bezier-easing';\nimport RichInputHandler from '../../helpers/dom/richInputHandler';\nimport {getCaretPosF} from '../../helpers/dom/getCaretPosNew';\nimport ListenerSetter from '../../helpers/listenerSetter';\n\nexport const EMOTICONSSTICKERGROUP: AnimationItemGroup = 'emoticons-dropdown';\n\nexport interface EmoticonsTab {\n content: HTMLElement;\n scrollable: Scrollable;\n menuScroll?: ScrollableX;\n tabId: number;\n init: () => void;\n onOpen?: () => void;\n onOpened?: () => void;\n onClose?: () => void;\n onClosed?: () => void;\n}\n\nconst easing = BezierEasing(0.42, 0.0, 0.58, 1.0);\nconst scrollOptions: Partial = {\n forceDuration: 200,\n transitionFunction: easing\n};\n\nexport class EmoticonsDropdown extends DropdownHover {\n public static lazyLoadQueue = new LazyLoadQueue(1);\n\n private emojiTab: EmojiTab;\n private stickersTab: StickersTab;\n private gifsTab: GifsTab;\n\n private container: HTMLElement;\n private tabsEl: HTMLElement;\n private tabId = -1;\n\n private tabs: {[id: number]: EmoticonsTab};\n\n private searchButton: HTMLElement;\n private deleteBtn: HTMLElement;\n\n private selectTab: ReturnType;\n\n private savedRange: Range;\n private managers: AppManagers;\n\n constructor() {\n super({\n element: document.getElementById('emoji-dropdown') as HTMLDivElement,\n ignoreOutClickClassName: 'input-message-input'\n });\n\n this.addEventListener('open', async() => {\n if(IS_TOUCH_SUPPORTED) {\n // appImManager.chat.input.saveScroll();\n if(blurActiveElement()) {\n await pause(100);\n }\n }\n\n if(this.element.parentElement !== appImManager.chat.input.chatInput) {\n appImManager.chat.input.chatInput.append(this.element);\n }\n\n this.savedRange = this.getGoodRange();\n\n EmoticonsDropdown.lazyLoadQueue.lock();\n // EmoticonsDropdown.lazyLoadQueue.unlock();\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n\n const tab = this.tab;\n tab.onOpen?.();\n });\n\n this.addEventListener('opened', () => {\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlockAndRefresh();\n\n // this.container.classList.remove('disable-hover');\n\n const tab = this.tab;\n tab.onOpened?.();\n });\n\n this.addEventListener('close', () => {\n EmoticonsDropdown.lazyLoadQueue.lock();\n // EmoticonsDropdown.lazyLoadQueue.lock();\n\n // нужно залочить группу и выключить стикеры\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n const tab = this.tab;\n tab.onClose?.();\n });\n\n this.addEventListener('closed', () => {\n // теперь можно убрать visible, чтобы они не включились после фокуса\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n // this.container.classList.remove('disable-hover');\n\n this.savedRange = undefined;\n\n const tab = this.tab;\n tab.onClosed?.();\n });\n }\n\n public get tab() {\n return this.tabs[this.tabId];\n }\n\n public init() {\n this.managers = rootScope.managers;\n this.emojiTab = new EmojiTab({managers: this.managers});\n this.stickersTab = new StickersTab(this.managers);\n this.gifsTab = new GifsTab(this.managers);\n\n this.tabs = {};\n [this.emojiTab, this.stickersTab, this.gifsTab].forEach((tab, idx) => {\n tab.tabId = idx;\n this.tabs[idx] = tab;\n });\n\n this.container = this.element.querySelector('.emoji-container .tabs-container') as HTMLDivElement;\n this.container.prepend(this.emojiTab.container, this.stickersTab.container);\n this.tabsEl = this.element.querySelector('.emoji-tabs') as HTMLUListElement;\n this.selectTab = horizontalMenu(this.tabsEl, this.container, this.onSelectTabClick, () => {\n const {tab} = this;\n tab.init?.();\n animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\n });\n\n this.searchButton = this.element.querySelector('.emoji-tabs-search');\n this.searchButton.addEventListener('click', () => {\n if(this.tabId === this.stickersTab.tabId) {\n if(!appSidebarRight.isTabExists(AppStickersTab)) {\n appSidebarRight.createTab(AppStickersTab).open();\n }\n } else {\n if(!appSidebarRight.isTabExists(AppGifsTab)) {\n appSidebarRight.createTab(AppGifsTab).open();\n }\n }\n });\n\n this.deleteBtn = this.element.querySelector('.emoji-tabs-delete');\n attachClickEvent(this.deleteBtn, (e) => {\n cancelEvent(e);\n const input = appImManager.chat.input.messageInput;\n // RichInputHandler.getInstance().makeFocused(appImManager.chat.input.messageInput);\n let range = RichInputHandler.getInstance().getSavedRange(input);\n if(!range) {\n range = document.createRange();\n range.setStartAfter(input.lastChild);\n }\n\n const newRange = range.cloneRange();\n // if(range.endOffset === range.startOffset && range.endContainer === range.startContainer) {\n if(range.collapsed) {\n const {node, offset} = getCaretPosF(input, range.endContainer, range.endOffset);\n let newStartNode: Node;\n if(offset) {\n newStartNode = node;\n } else {\n newStartNode = node.previousSibling;\n if(!newStartNode) {\n return;\n }\n\n while(newStartNode.nodeType === newStartNode.TEXT_NODE && !newStartNode.nodeValue && (newStartNode = newStartNode.previousSibling)) {\n\n }\n\n if(newStartNode.nodeType === newStartNode.ELEMENT_NODE && !(newStartNode as HTMLElement).isContentEditable) {\n return;\n }\n }\n\n if(newStartNode.nodeType === newStartNode.ELEMENT_NODE && (newStartNode as any).tagName === 'IMG') {\n newRange.selectNode(newStartNode);\n } else {\n const text = [...newStartNode.textContent];\n let t: string;\n if(offset) {\n let length = 0;\n t = text.find((text) => (length += text.length, length >= offset));\n } else {\n t = text.pop() || '';\n }\n\n const newOffset = offset ? offset - t.length : newStartNode.textContent.length - t.length;\n newRange.setStart(newStartNode, newOffset);\n }\n }\n\n newRange.deleteContents();\n\n appImManager.chat.input.messageInputField.simulateInputEvent();\n // const selection = document.getSelection();\n // if(selection.isCollapsed) {\n // selection.modify('extend', 'backward', 'character');\n // }\n\n // selection.deleteFromDocument();\n // (document.activeElement as HTMLElement).blur();\n\n // document.execCommand('undo', false, null);\n // const input = appImManager.chat.input.messageInput;\n // if((input.lastChild as any)?.tagName) {\n // input.lastElementChild.remove();\n // } else if(input.lastChild) {\n // if(!input.lastChild.textContent.length) {\n // input.lastChild.remove();\n // } else {\n // input.lastChild.textContent = input.lastChild.textContent.slice(0, -1);\n // }\n // }\n\n // const event = new Event('input', {bubbles: true, cancelable: true});\n // appImManager.chat.input.messageInput.dispatchEvent(event);\n // // appSidebarRight.stickersTab.init();\n });\n\n const HIDE_EMOJI_TAB = IS_APPLE_MOBILE && false;\n\n const INIT_TAB_ID = HIDE_EMOJI_TAB ? this.stickersTab.tabId : this.emojiTab.tabId;\n\n if(HIDE_EMOJI_TAB) {\n (this.tabsEl.children[1] as HTMLElement).classList.add('hide');\n }\n\n simulateClickEvent(this.tabsEl.children[INIT_TAB_ID + 1] as HTMLElement);\n if(this.tabs[INIT_TAB_ID].init) {\n this.tabs[INIT_TAB_ID].init(); // onTransitionEnd не вызовется, т.к. это первая открытая вкладка\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n let lastMouseMoveEvent: MouseEvent, mouseMoveEventAttached = false;\n const onMouseMove = (e: MouseEvent) => {\n lastMouseMoveEvent = e;\n };\n overlayCounter.addEventListener('change', (isActive) => {\n if(isActive) {\n if(!mouseMoveEventAttached) {\n document.body.addEventListener('mousemove', onMouseMove);\n mouseMoveEventAttached = true;\n }\n } else if(mouseMoveEventAttached) {\n document.body.removeEventListener('mousemove', onMouseMove);\n if(lastMouseMoveEvent) {\n this.onMouseOut(lastMouseMoveEvent);\n }\n }\n });\n }\n\n appImManager.addEventListener('peer_changing', () => {\n this.toggle(false);\n });\n appImManager.addEventListener('peer_changed', this.checkRights);\n this.checkRights();\n\n return super.init();\n }\n\n public getElement() {\n return this.element;\n }\n\n public scrollTo(tab: EmoticonsTab, element: HTMLElement) {\n tab.scrollable.scrollIntoViewNew({\n element: element as HTMLElement,\n axis: 'y',\n position: 'start',\n ...scrollOptions\n });\n }\n\n private onSelectTabClick = (id: number) => {\n if(this.tabId === id) {\n const {tab} = this;\n this.scrollTo(tab, tab.scrollable.container.firstElementChild as HTMLElement);\n return;\n }\n\n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n this.tabId = id;\n this.searchButton.classList.toggle('hide', this.tabId === this.emojiTab.tabId);\n this.deleteBtn.classList.toggle('hide', this.tabId !== this.emojiTab.tabId);\n };\n\n private checkRights = async() => {\n const {peerId, threadId} = appImManager.chat;\n const children = this.tabsEl.children;\n const tabsElements = Array.from(children) as HTMLElement[];\n\n const [canSendStickers, canSendGifs] = await Promise.all([\n this.managers.appMessagesManager.canSendToPeer(peerId, threadId, 'send_stickers'),\n this.managers.appMessagesManager.canSendToPeer(peerId, threadId, 'send_gifs')\n ]);\n\n tabsElements[this.stickersTab.tabId + 1].toggleAttribute('disabled', !canSendStickers);\n tabsElements[this.gifsTab.tabId + 1].toggleAttribute('disabled', !canSendGifs);\n\n const active = this.tabsEl.querySelector('.active');\n if(active && whichChild(active) !== (this.emojiTab.tabId + 1) && (!canSendStickers || !canSendGifs)) {\n this.selectTab(this.emojiTab.tabId, false);\n }\n };\n\n public static menuOnClick = (\n emoticons: EmoticonsTabC,\n menu: HTMLElement,\n scrollable: Scrollable,\n menuScroll?: ScrollableX,\n prevTab?: StickersTabCategory,\n listenerSetter?: ListenerSetter\n ) => {\n let jumpedTo = -1;\n\n const scrollToTab = (tab: typeof prevTab, f?: boolean) => {\n const m = tab.menuScroll || menuScroll;\n if(m) {\n m.scrollIntoViewNew({\n element: tab.elements.menuTab,\n position: 'center',\n axis: 'x',\n getElementPosition: f ? ({elementPosition}) => {\n return elementPosition - 106;\n } : undefined,\n ...scrollOptions\n });\n }\n };\n\n const setActive = (tab: typeof prevTab, scroll = true) => {\n if(tab === prevTab) {\n return false;\n }\n\n let f = false;\n if(prevTab) {\n prevTab.elements.menuTab.classList.remove('active');\n if(prevTab.menuScroll && prevTab.menuScroll !== tab.menuScroll) {\n f = true;\n // scroll to first\n prevTab.menuScroll.container.parentElement.classList.remove('active');\n prevTab.menuScroll.scrollIntoViewNew({\n element: prevTab.menuScroll.container.firstElementChild as HTMLElement,\n forceDirection: scroll ? undefined : FocusDirection.Static,\n position: 'center',\n axis: 'x',\n ...scrollOptions\n });\n }\n }\n\n tab.elements.menuTab.classList.add('active');\n\n if(tab.menuScroll) {\n tab.menuScroll.container.parentElement.classList.add('active');\n scroll && menuScroll.scrollIntoViewNew({\n element: tab.menuScroll.container.parentElement,\n position: 'center',\n axis: 'x',\n ...scrollOptions\n });\n }\n\n if(prevTab) {\n scrollToTab(tab, f);\n }\n\n prevTab = tab;\n\n return true;\n };\n\n const setActiveStatic = (tab: typeof prevTab) => {\n if(prevTab?.local) {\n return;\n }\n\n emoticons.scrollable.scrollTop = tab.elements.container.offsetTop + 1;\n const s = emoticons.menuScroll.container;\n const e = tab.elements.menuTab;\n s.scrollLeft = e.offsetLeft - s.clientWidth / 2 + e.offsetWidth / 2;\n setActive(tab, false);\n };\n\n let scrollingToContent = false;\n const stickyIntersector = new StickyIntersector(scrollable.container, (stuck, target) => {\n if(scrollingToContent) {\n return;\n }\n\n // console.log('sticky scrollTop', stuck, target, scrollable.container.scrollTop, jumpedTo);\n\n if(Math.abs(jumpedTo - scrollable.container.scrollTop) <= 1) {\n return;\n } else {\n jumpedTo = -1;\n }\n\n const tab = emoticons.getCategoryByContainer(target);\n const which = whichChild(target);\n if(!stuck && (which || tab.menuScroll)) {\n return;\n }\n\n setActive(tab);\n });\n\n attachClickEvent(menu, (e) => {\n let target = findUpClassName(e.target as HTMLElement, 'menu-horizontal-div-item');\n if(!target) {\n target = findUpClassName(e.target as HTMLElement, 'menu-horizontal-inner');\n if(!target || target.classList.contains('active')) {\n return;\n }\n\n target = target.firstElementChild.firstElementChild as HTMLElement;\n }\n\n const which = whichChild(target);\n\n const tab = emoticons.getCategoryByMenuTab(target);\n\n /* if(menuScroll) {\n menuScroll.scrollIntoView(target, false, 0);\n } */\n\n if(setActive(tab)) {\n // scrollToTab(tab);\n // return;\n }\n\n let offsetTop = 0, additionalOffset = 0;\n if(which > 0 || tab.menuScroll) {\n const element = tab.elements.container;\n additionalOffset = 1;\n offsetTop = element.offsetTop + additionalOffset; // * due to stickyIntersector\n }\n\n jumpedTo = offsetTop;\n\n scrollingToContent = true;\n scrollable.scrollIntoViewNew({\n element: offsetTop ? tab.elements.container : scrollable.container.firstElementChild,\n position: 'start',\n axis: 'y',\n getElementPosition: offsetTop ? ({elementPosition}) => elementPosition + additionalOffset : undefined,\n ...scrollOptions\n }).finally(() => {\n setActive(tab);\n scrollingToContent = false;\n });\n }, {listenerSetter});\n\n const a = scrollable.onAdditionalScroll ? scrollable.onAdditionalScroll.bind(scrollable) : noop;\n scrollable.onAdditionalScroll = () => {\n emoticons.content.parentElement.classList.toggle('scrolled-top', !scrollable.scrollTop);\n a();\n };\n\n return {stickyIntersector, setActive, setActiveStatic};\n };\n\n public static onMediaClick = async(e: {target: EventTarget | Element}, clearDraft = false, silent?: boolean) => {\n const target = findUpTag(e.target as HTMLElement, 'DIV');\n if(!target) return false;\n\n const docId = target.dataset.docId;\n if(!docId) return false;\n\n return this.sendDocId(docId, clearDraft, silent);\n };\n\n public static async sendDocId(docId: DocId, clearDraft?: boolean, silent?: boolean) {\n if(await appImManager.chat.input.sendMessageWithDocument(docId, undefined, clearDraft, silent)) {\n /* dropdown.classList.remove('active');\n toggleEl.classList.remove('active'); */\n if(emoticonsDropdown.container) {\n emoticonsDropdown.forceClose = true;\n // emoticonsDropdown.container.classList.add('disable-hover');\n emoticonsDropdown.toggle(false);\n }\n\n return true;\n } else {\n console.warn('got no doc by id:', docId);\n return false;\n }\n }\n\n public addLazyLoadQueueRepeat(lazyLoadQueue: LazyLoadQueueIntersector, processInvisibleDiv: (div: HTMLElement) => void) {\n this.addEventListener('close', () => {\n lazyLoadQueue.lock();\n });\n\n this.addEventListener('closed', () => {\n const divs = lazyLoadQueue.intersector.getVisible();\n\n for(const div of divs) {\n processInvisibleDiv(div);\n }\n\n lazyLoadQueue.intersector.clearVisible();\n });\n\n this.addEventListener('opened', () => {\n lazyLoadQueue.unlockAndRefresh();\n });\n }\n\n public getSavedRange() {\n return this.getGoodRange() || this.savedRange;\n }\n\n private getGoodRange() {\n const sel = document.getSelection();\n if(sel.rangeCount && document.activeElement === appImManager.chat.input.messageInput) {\n return sel.getRangeAt(0);\n }\n }\n}\n\nconst emoticonsDropdown = new EmoticonsDropdown();\nMOUNT_CLASS_TO.emoticonsDropdown = emoticonsDropdown;\nexport default emoticonsDropdown;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport emoticonsDropdown, {EmoticonsDropdown, EMOTICONSSTICKERGROUP} from '..';\nimport cancelEvent from '../../../helpers/dom/cancelEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {fastRaf} from '../../../helpers/schedulers';\nimport pause from '../../../helpers/schedulers/pause';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport {emojiFromCodePoints} from '../../../vendor/emoji';\nimport {putPreloader} from '../../putPreloader';\nimport Scrollable, {ScrollableX} from '../../scrollable';\nimport IS_EMOJI_SUPPORTED from '../../../environment/emojiSupport';\nimport IS_TOUCH_SUPPORTED from '../../../environment/touchSupport';\nimport blurActiveElement from '../../../helpers/dom/blurActiveElement';\nimport Emoji from '../../../config/emoji';\nimport fixEmoji from '../../../lib/richTextProcessor/fixEmoji';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport wrapSingleEmoji from '../../../lib/richTextProcessor/wrapSingleEmoji';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport {EmoticonsTabC, StickersTabCategory} from './stickers';\nimport {makeMediaSize} from '../../../helpers/mediaSize';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport VisibilityIntersector, {OnVisibilityChangeItem} from '../../visibilityIntersector';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport ListenerSetter from '../../../helpers/listenerSetter';\nimport {Document, StickerSet} from '../../../layer';\nimport {CustomEmojiElement, CustomEmojiRendererElement} from '../../../lib/richTextProcessor/wrapRichText';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport PopupStickers from '../../popups/stickers';\nimport {hideToast, toastNew} from '../../toast';\nimport safeAssign from '../../../helpers/object/safeAssign';\nimport type {AppStickersManager} from '../../../lib/appManagers/appStickersManager';\n\nconst loadedURLs: Set = new Set();\nexport function appendEmoji(emoji: string, container?: HTMLElement, prepend = false, unify = false) {\n // const emoji = details.unified;\n // const emoji = (details.unified as string).split('-')\n // .reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n\n const spanEmoji = document.createElement('span');\n spanEmoji.classList.add('super-emoji');\n\n let kek: DocumentFragment;\n if(unify && !IS_EMOJI_SUPPORTED) {\n kek = wrapSingleEmoji(emoji);\n } else {\n emoji = fixEmoji(emoji);\n kek = wrapEmojiText(emoji);\n }\n\n /* if(!kek.includes('emoji')) {\n console.log(emoji, kek, spanEmoji, emoji.length, new TextEncoder().encode(emoji), emojiUnicode(emoji));\n return;\n } */\n\n // console.log(kek);\n\n spanEmoji.append(kek);\n\n if(spanEmoji.children.length > 1) {\n const first = spanEmoji.firstElementChild;\n spanEmoji.innerHTML = '';\n spanEmoji.append(first);\n }\n\n if(spanEmoji.firstElementChild?.tagName === 'IMG') {\n const image = spanEmoji.firstElementChild as HTMLImageElement;\n\n const url = image.src;\n if(!loadedURLs.has(url)) {\n image.setAttribute('loading', 'lazy');\n const placeholder = document.createElement('span');\n placeholder.classList.add('emoji-placeholder');\n\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '0';\n placeholder.style.opacity = '1';\n }\n\n image.addEventListener('load', () => {\n fastRaf(() => {\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '';\n placeholder.style.opacity = '';\n }\n\n spanEmoji.classList.remove('empty');\n\n loadedURLs.add(url);\n });\n }, {once: true});\n\n spanEmoji.append(placeholder);\n }\n }\n\n // spanEmoji = spanEmoji.firstElementChild as HTMLSpanElement;\n // spanEmoji.setAttribute('emoji', emoji);\n if(container) {\n if(prepend) container.prepend(spanEmoji);\n else container.appendChild(spanEmoji);\n }\n\n return spanEmoji;\n}\n\nexport function getEmojiFromElement(element: HTMLElement): {docId?: DocId, emoji: string} {\n const superEmoji = findUpClassName(element, 'super-emoji');\n if(!superEmoji) return;\n\n const firstElementChild = superEmoji.firstElementChild as HTMLElement;\n if(firstElementChild && firstElementChild.classList.contains('custom-emoji')) {\n return {emoji: firstElementChild.dataset.stickerEmoji, docId: firstElementChild.dataset.docId} as const;\n } else {\n if(element.nodeType === element.TEXT_NODE) return {emoji: element.nodeValue};\n if(element.tagName === 'SPAN' && !element.classList.contains('emoji') && element.firstElementChild) {\n element = element.firstElementChild as HTMLElement;\n }\n\n return {emoji: element.getAttribute('alt') || element.innerText} as const;\n }\n}\n\nconst EMOJI_RECENT_ID: (typeof EMOJI_CATEGORIES)[0][0] = 'Emoji.Recent';\nconst EMOJI_RECENT_CATEGORY: (typeof EMOJI_CATEGORIES)[0] = [EMOJI_RECENT_ID, 'recent'];\nconst CUSTOM_EMOJI_RECENT_ID: (typeof EMOJI_CATEGORIES)[0][0] = '';\nconst CUSTOM_EMOJI_RECENT_CATEGORY: (typeof EMOJI_CATEGORIES)[0] = [CUSTOM_EMOJI_RECENT_ID, ''];\nconst EMOJI_CATEGORIES: [LangPackKey | '', string][] = [\n ['Emoji.SmilesAndPeople', 'smile'],\n ['Emoji.AnimalsAndNature', 'animals'],\n ['Emoji.FoodAndDrink', 'eats'],\n ['Emoji.TravelAndPlaces', 'car'],\n ['Emoji.ActivityAndSport', 'sport'],\n ['Emoji.Objects', 'lamp'],\n // ['Emoji.Symbols', 'info'],\n ['Emoji.Flags', 'flag'],\n ['Skin Tones' as any, '']\n];\n\nlet sorted: Map<(typeof EMOJI_CATEGORIES)[0], string[]>;\nfunction prepare() {\n if(sorted) {\n return sorted;\n }\n\n const a: Array<[(typeof EMOJI_CATEGORIES)[0], string[]]> = [\n [CUSTOM_EMOJI_RECENT_CATEGORY, []],\n [EMOJI_RECENT_CATEGORY, []]\n ];\n\n sorted = new Map(a);\n for(const emoji in Emoji) {\n const details = Emoji[emoji];\n const i = '' + details;\n const category = EMOJI_CATEGORIES[+i[0] - 1];\n if(!category) continue; // maybe it's skin tones\n\n let s = sorted.get(category);\n if(!s) {\n s = [];\n sorted.set(category, s);\n }\n\n s[+i.slice(1) || 0] = emoji;\n }\n\n sorted.delete(EMOJI_CATEGORIES.pop());\n EMOJI_CATEGORIES.unshift(CUSTOM_EMOJI_RECENT_CATEGORY, EMOJI_RECENT_CATEGORY);\n const order = EMOJI_CATEGORIES.map(([id]) => id);\n const entries = [...sorted.entries()].sort((a, b) => order.indexOf(a[0][0]) - order.indexOf(b[0][0]));\n sorted = new Map(entries);\n\n return sorted;\n}\n\nconst EMOJI_ELEMENT_SIZE = makeMediaSize(42, 42);\nconst RECENT_MAX_LENGTH = 32;\n\ntype EmojiTabItem = {element: HTMLElement} & ReturnType;\ntype EmojiTabCategory = StickersTabCategory;\nexport default class EmojiTab extends EmoticonsTabC {\n private closeScrollTop: number;\n private menuInnerScroll: ScrollableX;\n private isStandalone?: boolean;\n private noRegularEmoji?: boolean;\n private stickerSetId?: Parameters[0];\n private onClick: (emoji: EmojiTabItem) => void;\n private activeEmoji: ReturnType;\n private activeElements: EmojiTabItem[];\n\n constructor(options: {\n managers: AppManagers,\n isStandalone?: boolean,\n noRegularEmoji?: boolean,\n stickerSetId?: EmojiTab['stickerSetId'],\n onClick?: EmojiTab['onClick']\n }) {\n super(\n options.managers,\n 'super-emojis',\n () => EMOJI_ELEMENT_SIZE,\n 16,\n 4,\n 0\n );\n\n safeAssign(this, options);\n this.container.classList.add('emoji-padding');\n this.content.id = 'content-emoji';\n this.activeElements = [];\n }\n\n private onCategoryVisibility = ({target, visible}: Pick) => {\n const category = this.categoriesMap.get(target);\n // console.log(target, visible, category);\n // if(category.local) return;\n\n const renderer = category.elements.renderer;\n const newChildren: HTMLElement[] = [];\n if(renderer) {\n newChildren.push(renderer);\n const customEmojis: Parameters[0] = new Map();\n if(visible) {\n newChildren.push(...category.items.map(({docId, element}) => {\n if(!docId) {\n return element;\n }\n\n // return element;\n\n // if(element.firstElementChild) {\n // return element;\n // }\n\n const customEmojiElement = element.firstElementChild as CustomEmojiElement;\n customEmojiElement.clear(false);\n // const customEmojiElement = CustomEmojiElement.create(document.id);\n customEmojis.set(customEmojiElement.docId, new Set([customEmojiElement]));\n // element.append(customEmojiElement);\n return element;\n }));\n\n renderer.add(customEmojis/* , EmoticonsDropdown.lazyLoadQueue */, undefined, undefined, false);\n } else {\n renderer.clearCanvas();\n renderer.middlewareHelper.clean();\n }\n } else if(visible) {\n newChildren.push(...category.items.map(({element}) => element));\n }\n\n // if(visible)\n category.elements.items.replaceChildren(...newChildren);\n\n if(renderer && !visible) {\n const customEmojis: Parameters[0] = new Map();\n category.items.forEach(({docId, element}) => {\n if(!docId) {\n return;\n }\n\n const customEmojiElement = element.firstElementChild as CustomEmojiElement;\n customEmojiElement.clear();\n customEmojis.set(customEmojiElement.docId, new Set([customEmojiElement]));\n });\n\n /* const promise = */renderer.add(customEmojis/* , EmoticonsDropdown.lazyLoadQueue */, undefined, true);\n // promise.then(() => {\n // customEmojis.forEach((elements) => {\n // elements.forEach((element) => {\n // if(!element.innerHTML) {\n // console.log('no thumb', element);\n // // debugger;\n // }\n // });\n // });\n\n // const set = customEmojis.get('5766933926429854499');\n // console.log(`wrapped ${customEmojis.size} thumbs`, set && set.values().next().value.innerHTML);\n // });\n }\n\n // if(!visible) {\n // const customEmojis: Parameters[0] = {};\n // category.items.forEach((item) => {\n // const {element, document} = item;\n // if(!element.firstElementChild) {\n // return;\n // }\n\n // const customEmojiElement = CustomEmojiElement.create(document.id);\n // customEmojis[customEmojiElement.docId] = new Set([customEmojiElement]);\n // element.firstElementChild.replaceWith(customEmojiElement);\n // });\n\n // renderer.add(customEmojis, EmoticonsDropdown.lazyLoadQueue);\n // }\n };\n\n public destroy() {\n super.destroy();\n this.menuInnerScroll?.destroy();\n }\n\n public init() {\n super.init();\n this.init = undefined;\n\n const intersectionOptions: IntersectionObserverInit = {\n root: this.isStandalone ? this.content : emoticonsDropdown.getElement()\n };\n\n this.categoriesIntersector = new VisibilityIntersector(this.onCategoryVisibility, intersectionOptions);\n\n this.menuOnClickResult = EmoticonsDropdown.menuOnClick(this, this.menu, this.scrollable, this.menuScroll, undefined, this.listenerSetter);\n\n const preloader = putPreloader(this.content, true);\n\n let innerScrollWrapper: HTMLElement;\n\n if(!this.isStandalone) {\n const x = this.menuInnerScroll = new ScrollableX(undefined);\n x.container.classList.add('menu-horizontal-inner-scroll');\n\n innerScrollWrapper = document.createElement('div');\n innerScrollWrapper.classList.add('menu-horizontal-inner');\n innerScrollWrapper.append(x.container);\n }\n\n let preparedMap: ReturnType;\n prepare();\n if(!this.noRegularEmoji) {\n preparedMap = prepare();\n } else {\n preparedMap = new Map([\n [[CUSTOM_EMOJI_RECENT_CATEGORY[0], 'recent'], []]\n // [EMOJI_RECENT_CATEGORY, []]\n ]);\n }\n\n preparedMap.forEach((emojis, [titleLangPackKey, icon]) => {\n const category = this.createLocalCategory(titleLangPackKey, titleLangPackKey, icon, !icon);\n category.elements.container.classList.remove('hide');\n category.elements.items.classList.add(icon && !this.isStandalone ? 'is-local' : 'not-local');\n\n emojis.forEach((unified) => {\n /* if(emojiUnicode(emoji) === '1f481-200d-2642') {\n console.log('append emoji', emoji, emojiUnicode(emoji));\n } */\n\n const emoji = emojiFromCodePoints(unified);\n // if(emoji.includes('🕵')) {\n // console.log('toCodePoints', toCodePoints(emoji));\n // emoji = emoji.replace(/(\\u200d[\\u2640\\u2642\\u2695])(?!\\ufe0f)/, '\\ufe0f$1');\n // const zwjIndex = emoji.indexOf('\\u200d');\n // if(zwjIndex !== -1 && !emoji.includes('\\ufe0f')) {\n // /* if(zwjIndex !== (emoji.length - 1)) {\n // emoji = emoji.replace(/(\\u200d)/g, '\\ufe0f$1');\n // } */\n\n // emoji += '\\ufe0f';\n // //emoji += '\\ufe0f';\n // }\n\n // debugger;\n // }\n\n this.addEmojiToCategory({\n category,\n emoji: {emoji},\n batch: true\n });\n\n /* if(category === 'Smileys & Emotion') {\n console.log('appended emoji', emoji, itemsDiv.children[itemsDiv.childElementCount - 1].innerHTML, emojiUnicode(emoji));\n } */\n });\n });\n\n const promise = Promise.all([\n this.isStandalone ? undefined : pause(200),\n !this.noRegularEmoji && this.managers.appEmojiManager.getRecentEmojis('native'),\n !this.isStandalone && this.managers.appEmojiManager.getRecentEmojis('custom'),\n this.stickerSetId && this.managers.appStickersManager.getLocalStickerSet(this.stickerSetId),\n this.managers.appEmojiManager.getCustomEmojis()\n ]).then(([_, recent, recentCustom, mainSet, sets]) => {\n preloader.remove();\n\n if(mainSet) {\n recentCustom = mainSet.documents.map((doc) => doc.id);\n }\n\n const recentCategory = this.categories[EMOJI_RECENT_ID];\n const recentCustomCategory = this.categories[CUSTOM_EMOJI_RECENT_ID];\n\n if(!this.isStandalone) {\n const a = [\n recentCategory && [recentCategory, recent] as const,\n recentCustomCategory && [recentCustomCategory, recentCustom] as const\n ];\n\n a.filter(Boolean).forEach(([category, recent]) => {\n category.limit = RECENT_MAX_LENGTH;\n recent.splice(RECENT_MAX_LENGTH, recent.length - RECENT_MAX_LENGTH);\n });\n }\n\n if(recentCategory && recent) for(const emoji of recent) {\n this.addEmojiToCategory({\n category: recentCategory,\n emoji: {emoji},\n batch: true\n });\n }\n\n if(recentCustomCategory) {\n this.createRendererForCategory(recentCustomCategory);\n if(recentCustom) for(const docId of recentCustom) {\n this.addEmojiToCategory({\n category: recentCustomCategory,\n emoji: {emoji: '', docId},\n batch: true\n });\n }\n recentCustomCategory.elements.container.style.paddingTop = '.5rem';\n }\n\n EMOJI_CATEGORIES.forEach(([id]) => {\n const category = this.categories[id];\n if(!category) {\n return;\n }\n\n this.toggleLocalCategory(category, true);\n\n if(id !== EMOJI_RECENT_ID && id !== CUSTOM_EMOJI_RECENT_ID) {\n category.menuScroll = this.menuInnerScroll;\n this.menuInnerScroll.container.append(category.elements.menuTab);\n }\n });\n\n this.resizeCategories();\n\n recentCategory && innerScrollWrapper && recentCategory.elements.menuTab.after(innerScrollWrapper);\n\n sets.sets.forEach((set) => {\n this.renderStickerSet(set);\n });\n\n this.listenerSetter.add(rootScope)('premium_toggle', () => {\n this.toggleCustomCategory();\n });\n\n this.listenerSetter.add(rootScope)('stickers_top', this.postponedEvent((id) => {\n const category = this.categories[id];\n if(!category) {\n return;\n }\n\n this.positionCategory(category, true);\n\n this.listenerSetter.add(emoticonsDropdown)('openAfterLayout', () => {\n this.menuOnClickResult.setActiveStatic(category);\n }, {once: true});\n }));\n\n const toggleRenderers = (ignore: boolean) => {\n for(const id in this.categories) {\n const category = this.categories[id];\n const renderer = category.elements.renderer;\n if(renderer) {\n renderer.ignoreSettingDimensions = ignore;\n if(!ignore) {\n renderer.setDimensionsFromRect(undefined, true);\n }\n }\n }\n };\n\n !this.isStandalone && this.listenerSetter.add(emoticonsDropdown)('opened', () => {\n toggleRenderers(false);\n });\n\n !this.isStandalone && this.listenerSetter.add(emoticonsDropdown)('close', () => {\n toggleRenderers(true);\n });\n\n this.listenerSetter.add(rootScope)('stickers_installed', (set) => {\n if(!this.categories[set.id] && set.pFlags.emojis) {\n this.renderStickerSet(set, true);\n }\n });\n\n this.listenerSetter.add(rootScope)('stickers_deleted', (set) => {\n const category = this.categories[set.id];\n if(this.deleteCategory(category)) {\n const {renderer} = category.elements;\n if(renderer) {\n renderer.middlewareHelper.clean();\n }\n }\n });\n\n !this.isStandalone && this.listenerSetter.add(rootScope)('emoji_recent', this.postponedEvent((emoji) => {\n const category = this.categories[emoji.docId ? CUSTOM_EMOJI_RECENT_ID : EMOJI_RECENT_ID];\n if(!category) {\n return;\n }\n\n const verify: (item: EmojiTabItem) => boolean = emoji.docId ?\n (item) => item.docId === emoji.docId :\n (item) => item.emoji === emoji.emoji;\n const found = findAndSplice(category.items, verify);\n if(found) {\n category.items.unshift(found);\n if(this.isCategoryVisible(category)) {\n const {renderer} = category.elements;\n positionElementByIndex(found.element, category.elements.items, renderer ? 1 : 0, -1);\n renderer?.forceRender();\n }\n } else {\n this.addEmojiToCategory({\n category,\n emoji,\n batch: false,\n prepend: true\n });\n }\n\n if(this.closeScrollTop === 0) {\n this.menuOnClickResult.setActive(emoji.docId ? this.categories[EMOJI_RECENT_ID] : category);\n }\n }));\n\n !this.isStandalone && this.listenerSetter.add(appImManager)('peer_changed', () => {\n this.toggleCustomCategory();\n });\n\n this.toggleCustomCategory();\n\n this.menuOnClickResult.setActive(recentCategory ?? recentCustomCategory);\n });\n\n attachClickEvent(this.content, this.onContentClick, {listenerSetter: this.listenerSetter});\n attachStickerViewerListeners({listenTo: this.content, listenerSetter: this.listenerSetter});\n\n return promise;\n }\n\n private renderStickerSet(set: StickerSet.stickerSet, prepend?: boolean) {\n const category = this.createCategory(set, wrapEmojiText(set.title));\n this.positionCategory(category, prepend);\n const {container, menuTabPadding} = category.elements;\n category.elements.items.classList.add('not-local');\n category.elements.container.classList.add('is-premium-set');\n category.elements.title.classList.add('tgico');\n\n this.createRendererForCategory(category);\n\n const promise = this.managers.appStickersManager.getStickerSet(set);\n promise.then(({documents}) => {\n documents.forEach((document) => {\n this.addEmojiToCategory({\n category,\n emoji: {docId: document.id, emoji: (document as Document.document).stickerEmojiRaw},\n batch: true\n });\n });\n\n // if(this.isCategoryVisible(category)) {\n // category.elements.items.append(...category.items.map(({element}) => element));\n // }\n\n this.onCategoryVisibility({target: category.elements.container, visible: this.isCategoryVisible(category)});\n\n category.setCategoryItemsHeight();\n container.classList.remove('hide');\n });\n\n wrapStickerSetThumb({\n set,\n container: menuTabPadding,\n group: EMOTICONSSTICKERGROUP,\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n width: 32,\n height: 32,\n autoplay: false\n });\n }\n\n private get peerId() {\n return appImManager.chat.peerId;\n }\n\n public getCustomCategory() {\n return this.categories[CUSTOM_EMOJI_RECENT_ID];\n }\n\n private toggleCustomCategory() {\n const category = this.categories[CUSTOM_EMOJI_RECENT_ID];\n const hasPremium = rootScope.premium || this.peerId === rootScope.myId;\n const canSeeCustomCategory = hasPremium || this.isStandalone;\n super.toggleLocalCategory(category, !!category.items.length && canSeeCustomCategory);\n this.content.classList.toggle('has-premium', hasPremium);\n }\n\n protected toggleLocalCategory(category: EmojiTabCategory, visible: boolean) {\n if(category.id === CUSTOM_EMOJI_RECENT_ID) {\n this.toggleCustomCategory();\n return;\n }\n\n super.toggleLocalCategory(category, visible);\n }\n\n private createRendererForCategory(category: EmojiTabCategory) {\n const renderer = CustomEmojiRendererElement.create({\n animationGroup: EMOTICONSSTICKERGROUP,\n customEmojiSize: mediaSizes.active.esgCustomEmoji\n });\n\n category.elements.renderer = renderer;\n category.elements.items.append(renderer);\n }\n\n public addEmojiToCategory(options: {\n category: EmojiTabCategory,\n emoji?: ReturnType,\n element?: HTMLElement,\n batch?: boolean,\n prepend?: boolean,\n active?: boolean\n }) {\n const {category, emoji, batch, prepend} = options;\n let element = options.element;\n if(element) {\n const spanEmoji = document.createElement('span');\n spanEmoji.classList.add('super-emoji');\n spanEmoji.append(element);\n element = spanEmoji;\n } else if(emoji.docId) {\n const customEmojiElement = CustomEmojiElement.create(emoji.docId);\n const span = document.createElement('span');\n span.classList.add(/* 'emoji', */'super-emoji');\n span.append(customEmojiElement);\n element = span;\n } else {\n element = appendEmoji(emoji.emoji/* .replace(/[\\ufe0f\\u2640\\u2642\\u2695]/g, '') */, undefined, false/* , false */);\n }\n\n const item: typeof category['items'][0] = {\n ...(emoji || {emoji: undefined}),\n element\n };\n\n if(\n options.active || (\n this.activeEmoji && (\n item.docId ?\n this.activeEmoji.docId === item.docId :\n this.activeEmoji.emoji === item.emoji\n )\n )\n ) {\n this.activeEmoji === emoji;\n this.activeElements.push(item);\n element.classList.add('active');\n }\n\n category.items[prepend ? 'unshift' : 'push'](item);\n if(!batch && !this.spliceExceed(category)) {\n this.onLocalCategoryUpdate(category);\n }\n }\n\n // private addEmojisToCategory(category: EmojiTabCategory, emojis: string[], prepend?: boolean) {\n // emojis.forEach((emoji) => {\n // this.addEmojiToCategory(category, emoji, true, prepend);\n // });\n\n // this.onLocalCategoryUpdate(category);\n // }\n\n private onContentClick = (e: MouseEvent) => {\n cancelEvent(e);\n\n const {target} = e;\n\n const container = findUpClassName(target, 'emoji-category');\n const category = this.categoriesMap.get(container);\n if(findUpClassName(target, 'category-title')) {\n if(category.local) {\n return;\n }\n\n new PopupStickers({id: category.set.id, access_hash: category.set.access_hash}, true).show();\n return;\n }\n\n const emoji = getEmojiFromElement(target as HTMLElement);\n if(!emoji) {\n return;\n }\n\n if(\n emoji.docId &&\n !rootScope.premium && (\n this.isStandalone ? category.id !== CUSTOM_EMOJI_RECENT_ID : this.peerId !== rootScope.myId\n )\n ) {\n const a = document.createElement('a');\n a.onclick = () => {\n appImManager.openPremiumBot();\n hideToast();\n };\n toastNew({\n langPackKey: 'CustomEmoji.PremiumAlert',\n langPackArguments: [a]\n });\n return;\n }\n\n if(this.onClick) {\n this.onClick({\n ...emoji,\n element: findUpClassName(target, 'super-emoji').firstElementChild as HTMLElement\n });\n } else {\n appImManager.chat.input.onEmojiSelected(emoji, false);\n }\n\n if(IS_TOUCH_SUPPORTED) {\n blurActiveElement();\n }\n };\n\n public setActive(emoji: ReturnType) {\n if(\n emoji === this.activeEmoji ||\n emoji?.docId ? emoji.docId === this.activeEmoji?.docId : emoji?.emoji === this.activeEmoji?.emoji\n ) {\n return;\n }\n\n this.activeEmoji = emoji;\n\n this.activeElements.forEach((item) => {\n item.element.classList.remove('active');\n });\n\n this.activeElements.length = 0;\n\n this.categoriesMap.forEach((category) => {\n category.items.forEach((item) => {\n if(emoji.docId ? item.docId === emoji.docId : item.emoji === emoji.emoji) {\n item.element.classList.add('active');\n this.activeElements.push(item);\n }\n });\n });\n }\n\n public onClose() {\n this.closeScrollTop = this.scrollable.scrollTop;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getEmojiEntityFromEmoji from './getEmojiEntityFromEmoji';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapSingleEmoji(emoji: string) {\n return wrapRichText(emoji, {\n entities: [getEmojiEntityFromEmoji(emoji)]\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport VisibilityIntersector, {OnVisibilityChange} from './visibilityIntersector';\n\nexport default class LazyLoadQueueRepeat extends LazyLoadQueueIntersector {\n private elementsMap: Map = new Map();\n\n constructor(\n parallelLimit?: number,\n protected onVisibilityChange?: OnVisibilityChange,\n options?: IntersectionObserverInit\n ) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector((item) => {\n const {target, visible} = item;\n\n const queueItem = this.elementsMap.get(target);\n queueItem.visible = visible;\n\n if(visible) {\n queueItem.wasSeen = true;\n if(!this.queue.includes(queueItem)) {\n this.queue.push(queueItem);\n }\n } else {\n indexOfAndSplice(this.queue, queueItem);\n }\n\n this.onVisibilityChange?.(item);\n this.setProcessQueueTimeout();\n }, options);\n }\n\n public clear() {\n super.clear();\n this.elementsMap.clear();\n }\n\n /* public async processItem(item: LazyLoadElement) {\n //await super.processItem(item);\n await LazyLoadQueueBase.prototype.processItem.call(this, item);\n\n if(this.lazyLoadMedia.length) {\n this.processQueue();\n }\n } */\n\n public observe(el: LazyLoadElement) {\n this.elementsMap.set(el.div, el);\n super.observe(el);\n }\n\n public unobserve(el: LazyLoadElement) {\n this.elementsMap.delete(el.div);\n super.unobserve(el);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport emoticonsDropdown, {EmoticonsDropdown, EMOTICONSSTICKERGROUP, EmoticonsTab} from '..';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport {Document, MessagesAllStickers, StickerSet} from '../../../layer';\nimport {MyDocument} from '../../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../../animationIntersector';\nimport LazyLoadQueue from '../../lazyLoadQueue';\nimport LazyLoadQueueRepeat from '../../lazyLoadQueueRepeat';\nimport {putPreloader} from '../../putPreloader';\nimport PopupStickers from '../../popups/stickers';\nimport Scrollable, {ScrollableX} from '../../scrollable';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport noop from '../../../helpers/noop';\nimport ButtonIcon from '../../buttonIcon';\nimport confirmationPopup from '../../confirmationPopup';\nimport VisibilityIntersector, {OnVisibilityChangeItem} from '../../visibilityIntersector';\nimport createStickersContextMenu from '../../../helpers/dom/createStickersContextMenu';\nimport findUpAsChild from '../../../helpers/dom/findUpAsChild';\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport ListenerSetter from '../../../helpers/listenerSetter';\nimport wrapSticker from '../../wrappers/sticker';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport {MediaSize} from '../../../helpers/mediaSize';\nimport {AnyFunction} from '../../../types';\nimport {IgnoreMouseOutType} from '../../../helpers/dropdownHover';\n\nexport class SuperStickerRenderer {\n public lazyLoadQueue: LazyLoadQueueRepeat;\n private animated: Set = new Set();\n\n constructor(\n private regularLazyLoadQueue: LazyLoadQueue,\n private group: AnimationItemGroup,\n private managers: AppManagers,\n private options?: IntersectionObserverInit\n ) {\n this.lazyLoadQueue = new LazyLoadQueueRepeat(undefined, ({target, visible}) => {\n if(!visible) {\n this.processInvisible(target);\n }\n }, options);\n }\n\n public clear() {\n this.lazyLoadQueue.clear();\n }\n\n public renderSticker(doc: MyDocument, element?: HTMLElement, loadPromises?: Promise[]) {\n if(!element) {\n element = document.createElement('div');\n element.classList.add('grid-item', 'super-sticker');\n element.dataset.docId = '' + doc.id;\n\n if(doc.animated) {\n this.observeAnimated(element);\n }\n }\n\n // * This will wrap only a thumb\n /* !doc.animated && */wrapSticker({\n doc,\n div: element,\n lazyLoadQueue: this.regularLazyLoadQueue,\n group: this.group,\n onlyThumb: doc.animated,\n loadPromises\n });\n\n return element;\n }\n\n public observeAnimated(element: HTMLElement) {\n this.animated.add(element);\n this.lazyLoadQueue.observe({\n div: element,\n load: this.processVisible\n });\n }\n\n public unobserveAnimated(element: HTMLElement) {\n this.animated.delete(element);\n this.lazyLoadQueue.delete({div: element});\n }\n\n private checkAnimationContainer = (element: HTMLElement, visible: boolean) => {\n // console.error('checkAnimationContainer', div, visible);\n const players = animationIntersector.getAnimations(element);\n players.forEach((player) => {\n if(!visible) {\n animationIntersector.removeAnimation(player);\n } else {\n animationIntersector.checkAnimation(player, false);\n }\n });\n };\n\n private processVisible = async(element: HTMLElement) => {\n const docId = element.dataset.docId;\n const doc = await this.managers.appDocsManager.getDoc(docId);\n\n const size = mediaSizes.active.esgSticker.width;\n\n // console.log('processVisibleDiv:', element);\n\n const promise = wrapSticker({\n doc,\n div: element,\n width: size,\n height: size,\n lazyLoadQueue: null,\n group: this.group,\n onlyThumb: false,\n play: true,\n loop: true,\n withLock: true\n }).then(({render}) => render);\n\n promise.then(() => {\n // clearTimeout(timeout);\n this.checkAnimationContainer(element, this.lazyLoadQueue.intersector.isVisible(element));\n });\n\n /* let timeout = window.setTimeout(() => {\n console.error('processVisibleDiv timeout', div, doc);\n }, 1e3); */\n\n return promise;\n };\n\n public processInvisible = async(element: HTMLElement) => {\n const docId = element.dataset.docId;\n const doc = await this.managers.appDocsManager.getDoc(docId);\n\n // console.log('STICKER INvisible:', /* div, */docId);\n\n this.checkAnimationContainer(element, false);\n\n element.textContent = '';\n this.renderSticker(doc, element as HTMLDivElement);\n };\n}\n\nexport type StickersTabCategoryItem = {element: HTMLElement};\n\nexport class StickersTabCategory = {}> {\n public elements: {\n container: HTMLElement,\n title: HTMLElement,\n items: HTMLElement,\n menuTab: HTMLElement,\n menuTabPadding: HTMLElement\n } & AdditionalElements;\n public items: Item[];\n public mounted: boolean;\n public id: string;\n public limit: number;\n\n public getContainerSize: () => {width: number, height: number};\n private getElementMediaSize: () => MediaSize;\n\n private gapX: number;\n private gapY: number;\n\n public set?: StickerSet;\n public local?: boolean;\n public menuScroll?: ScrollableX;\n\n constructor(options: {\n id: string,\n title: HTMLElement | DocumentFragment,\n overflowElement: HTMLElement,\n getContainerSize: StickersTabCategory['getContainerSize'],\n getElementMediaSize: StickersTabCategory['getElementMediaSize'],\n gapX: number,\n gapY: number,\n noMenuTab?: boolean\n }) {\n const container = document.createElement('div');\n container.classList.add('emoji-category');\n\n const items = document.createElement('div');\n items.classList.add('category-items');\n\n let title: HTMLElement;\n if(options.title) {\n title = document.createElement('div');\n title.classList.add('category-title');\n title.append(options.title);\n }\n\n let menuTab: HTMLElement, menuTabPadding: HTMLElement;\n if(!options.noMenuTab) {\n menuTab = ButtonIcon(undefined, {noRipple: true});\n menuTab.classList.add('menu-horizontal-div-item');\n\n menuTabPadding = document.createElement('div');\n menuTabPadding.classList.add('menu-horizontal-div-item-padding');\n\n menuTab.append(menuTabPadding);\n }\n\n if(title) container.append(title);\n container.append(items);\n\n this.elements = {\n container,\n title,\n items,\n menuTab,\n menuTabPadding\n } as any;\n this.id = options.id;\n this.items = [];\n\n this.getContainerSize = options.getContainerSize;\n this.getElementMediaSize = options.getElementMediaSize;\n this.gapX = options.gapX ?? 0;\n this.gapY = options.gapY ?? 0;\n }\n\n public setCategoryItemsHeight() {\n const {width: containerWidth} = this.getContainerSize();\n const elementSize = this.getElementMediaSize().width;\n\n let itemsPerRow = containerWidth / elementSize;\n if(this.gapX) itemsPerRow -= Math.floor(itemsPerRow - 1) * this.gapX / elementSize;\n itemsPerRow = Math.floor(itemsPerRow);\n\n const rows = Math.ceil(this.items.length / itemsPerRow);\n let height = rows * elementSize;\n if(this.gapY) height += (rows - 1) * this.gapY;\n\n this.elements.items.style.minHeight = height + 'px';\n }\n}\n\nexport class EmoticonsTabC> implements EmoticonsTab {\n public content: HTMLElement;\n public menuScroll: ScrollableX;\n public container: HTMLElement;\n public menuWrapper: HTMLElement;\n public menu: HTMLElement;\n\n protected categories: {[id: string]: Category};\n protected categoriesMap: Map;\n protected categoriesByMenuTabMap: Map;\n protected categoriesIntersector: VisibilityIntersector;\n protected localCategories: Category[];\n\n protected listenerSetter: ListenerSetter;\n\n public scrollable: Scrollable;\n protected mounted = false;\n protected menuOnClickResult: ReturnType;\n\n public tabId: number;\n\n protected postponedEvents: {cb: AnyFunction, args: any[]}[];\n\n public getContainerSize: Category['getContainerSize'];\n\n constructor(\n protected managers: AppManagers,\n protected categoryItemsClassName: string,\n protected getElementMediaSize: () => MediaSize,\n protected padding: number,\n protected gapX: number,\n protected gapY: number\n ) {\n this.categories = {};\n this.categoriesMap = new Map();\n this.categoriesByMenuTabMap = new Map();\n this.localCategories = [];\n this.postponedEvents = [];\n\n this.listenerSetter = new ListenerSetter();\n\n this.container = document.createElement('div');\n this.container.classList.add('tabs-tab', 'emoticons-container');\n\n this.menuWrapper = document.createElement('div');\n this.menuWrapper.classList.add('menu-wrapper', 'emoticons-menu-wrapper');\n\n this.menu = document.createElement('nav');\n this.menu.className = 'menu-horizontal-div no-stripe justify-start emoticons-menu';\n\n this.menuWrapper.append(this.menu);\n this.menuScroll = new ScrollableX(this.menuWrapper);\n\n this.content = document.createElement('div');\n this.content.classList.add('emoticons-content');\n\n this.container.append(this.menuWrapper, this.content);\n\n this.scrollable = new Scrollable(this.content, 'STICKERS');\n }\n\n public getCategoryByContainer(container: HTMLElement) {\n return this.categoriesMap.get(container);\n }\n\n public getCategoryByMenuTab(menuTab: HTMLElement) {\n return this.categoriesByMenuTabMap.get(menuTab);\n }\n\n protected createCategory(stickerSet: StickerSet, title: HTMLElement | DocumentFragment, isLocal?: boolean, noMenuTab?: boolean) {\n const category: Category = new StickersTabCategory({\n id: '' + stickerSet.id,\n title,\n overflowElement: this.content,\n getContainerSize: () => {\n const {width, height} = this.getContainerSize?.() ?? this.content.getBoundingClientRect();\n return {width: width - this.padding, height};\n },\n getElementMediaSize: this.getElementMediaSize,\n gapX: this.gapX,\n gapY: this.gapY,\n noMenuTab\n }) as any;\n\n if(this.categoryItemsClassName) {\n category.elements.items.classList.add(this.categoryItemsClassName);\n }\n\n const container = category.elements.container;\n container.classList.add('hide');\n\n category.set = stickerSet;\n this.categories[stickerSet.id] = category;\n this.categoriesMap.set(container, category);\n !noMenuTab && this.categoriesByMenuTabMap.set(category.elements.menuTab, category);\n\n this.categoriesIntersector.observe(container);\n !noMenuTab && this.menuOnClickResult.stickyIntersector.observeStickyHeaderChanges(container);\n\n if(!isLocal) {\n !noMenuTab && category.elements.menuTab.classList.add('not-local');\n }\n\n return category;\n }\n\n protected positionCategory(category: Category, prepend?: boolean) {\n const {menuTab, container} = category.elements;\n const posItems = prepend ? this.localCategories.filter((category) => category.mounted).length : 0xFFFF;\n let foundMenuScroll = false;\n const posMenu = prepend ? this.localCategories.filter((category) => {\n if(category.menuScroll && !foundMenuScroll) {\n foundMenuScroll = true;\n return true;\n }\n\n return category.mounted && !category.menuScroll && category.elements.menuTab;\n }).length : 0xFFFF;\n positionElementByIndex(container, this.scrollable.container, posItems);\n positionElementByIndex(menuTab, this.menu, posMenu);\n }\n\n protected isCategoryVisible(category: Category) {\n return this.categoriesIntersector.getVisible().includes(category.elements.container);\n }\n\n protected toggleLocalCategory(category: Category, visible: boolean) {\n if(!visible) {\n category.elements.menuTab?.remove();\n category.elements.container.remove();\n } else {\n const idx = this.localCategories.indexOf(category);\n const sliced = this.localCategories.slice(0, idx);\n let notMountedItems = 0, notMountedMenus = 0;\n sliced.forEach((category) => {\n if(!category.mounted) {\n ++notMountedItems;\n ++notMountedMenus;\n } else if(!category.elements.menuTab || category.menuScroll) {\n ++notMountedMenus;\n }\n });\n const itemsIdx = idx - notMountedItems, menuIdx = idx - notMountedMenus;\n category.elements.menuTab && positionElementByIndex(category.elements.menuTab, this.menu, menuIdx);\n positionElementByIndex(category.elements.container, this.scrollable.container, itemsIdx);\n }\n\n category.mounted = visible;\n // category.elements.container.classList.toggle('hide', !visible);\n }\n\n protected createLocalCategory(id: string, title: LangPackKey | '', icon?: string, noMenuTab?: boolean) {\n const category = this.createCategory({id} as any, title && i18n(title), true, noMenuTab);\n category.local = true;\n this.localCategories.push(category);\n if(category.elements.title) {\n category.elements.title.classList.add('disable-hover');\n }\n\n if(!noMenuTab) {\n if(icon) {\n category.elements.menuTab.classList.add('tgico', 'tgico-' + icon);\n }\n\n category.elements.menuTabPadding.remove();\n }\n\n this.toggleLocalCategory(category, false);\n return category;\n }\n\n protected onLocalCategoryUpdate(category: Category) {\n category.setCategoryItemsHeight();\n this.toggleLocalCategory(category, !!category.items.length);\n }\n\n protected resizeCategories = () => {\n for(const [container, category] of this.categoriesMap) {\n category.setCategoryItemsHeight();\n }\n };\n\n protected deleteCategory(category: Category) {\n if(category) {\n category.elements.container.remove();\n category.elements.menuTab.remove();\n this.categoriesIntersector.unobserve(category.elements.container);\n delete this.categories[category.id];\n this.categoriesMap.delete(category.elements.container);\n this.categoriesByMenuTabMap.delete(category.elements.menuTab);\n\n return true;\n }\n\n return false;\n }\n\n protected spliceExceed(category: Category) {\n if(category.limit === undefined) {\n return false;\n }\n\n const {items, limit} = category;\n items.splice(limit, items.length - limit).forEach(({element}) => {\n element.remove();\n });\n\n this.onLocalCategoryUpdate(category);\n\n return true;\n }\n\n public init() {\n this.listenerSetter.add(emoticonsDropdown)('closed', () => {\n this.postponedEvents.forEach(({cb, args}) => {\n cb(...args);\n });\n\n this.postponedEvents.length = 0;\n });\n }\n\n public destroy() {\n this.getContainerSize = undefined;\n this.postponedEvents.length = 0;\n this.categoriesIntersector?.disconnect();\n this.listenerSetter.removeAll();\n this.scrollable.destroy();\n this.menuScroll?.destroy();\n this.menuOnClickResult?.stickyIntersector?.disconnect();\n }\n\n protected postponedEvent = (cb: (...args: K[]) => void) => {\n return (...args: K[]) => {\n if(emoticonsDropdown.isActive()) {\n this.postponedEvents.push({cb, args});\n } else {\n cb(...args);\n }\n };\n };\n}\n\ntype StickersTabItem = {element: HTMLElement, document: Document.document};\nexport default class StickersTab extends EmoticonsTabC> {\n private superStickerRenderer: SuperStickerRenderer;\n\n constructor(managers: AppManagers) {\n super(\n managers,\n 'super-stickers',\n () => mediaSizes.active.esgSticker,\n 3 * 2,\n 4,\n 4\n );\n\n this.container.classList.add('stickers-padding');\n this.content.id = 'content-stickers';\n }\n\n private setFavedLimit(limit: number) {\n const category = this.categories['faved'];\n category.limit = limit;\n }\n\n private categoryAppendStickers(\n category: StickersTabCategory,\n promise: Promise\n ) {\n const {container} = category.elements;\n\n promise.then((documents) => {\n const isVisible = this.isCategoryVisible(category);\n\n documents.forEach((document) => {\n const element = this.superStickerRenderer.renderSticker(document);\n category.items.push({document, element});\n\n if(isVisible) {\n category.elements.items.append(element);\n }\n });\n\n category.setCategoryItemsHeight();\n container.classList.remove('hide');\n });\n }\n\n private async renderStickerSet(set: StickerSet.stickerSet, prepend = false) {\n const category = this.createCategory(set, wrapEmojiText(set.title));\n const {menuTabPadding} = category.elements;\n\n const promise = this.managers.appStickersManager.getStickerSet(set);\n this.categoryAppendStickers(\n category,\n promise.then((stickerSet) => stickerSet.documents as MyDocument[])\n );\n\n this.positionCategory(category, prepend);\n\n wrapStickerSetThumb({\n set,\n container: menuTabPadding,\n group: EMOTICONSSTICKERGROUP,\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n width: 32,\n height: 32,\n autoplay: false\n });\n }\n\n private onCategoryVisibility = ({target, visible, entry}: OnVisibilityChangeItem) => {\n const category = this.categoriesMap.get(target);\n category.elements.items.replaceChildren(...(!visible ? [] : category.items.map(({element}) => element)));\n };\n\n public init() {\n super.init();\n\n this.scrollable.onAdditionalScroll = () => {\n this.setTyping();\n };\n\n /* stickersDiv.addEventListener('mouseover', (e) => {\n let target = e.target as HTMLElement;\n\n if(target.tagName === 'CANVAS') { // turn on sticker\n let animation = lottieLoader.getAnimation(target.parentElement, EMOTICONSSTICKERGROUP);\n\n if(animation) {\n // @ts-ignore\n if(animation.currentFrame === animation.totalFrames - 1) {\n animation.goToAndPlay(0, true);\n } else {\n animation.play();\n }\n }\n }\n }); */\n\n const intersectionOptions: IntersectionObserverInit = {root: emoticonsDropdown.getElement()};\n this.categoriesIntersector = new VisibilityIntersector(this.onCategoryVisibility, intersectionOptions);\n\n const clearCategoryItems = (category: StickersTabCategory) => {\n category.elements.items.replaceChildren();\n category.items.forEach(({element}) => this.superStickerRenderer.unobserveAnimated(element));\n category.items.length = 0;\n };\n\n this.scrollable.container.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n if(findUpClassName(target, 'category-title')) {\n const container = findUpClassName(target, 'emoji-category');\n const category = this.categoriesMap.get(container);\n if(category.local) {\n return;\n }\n\n new PopupStickers({id: category.set.id, access_hash: category.set.access_hash}).show();\n return;\n }\n\n EmoticonsDropdown.onMediaClick(e);\n });\n\n this.menuOnClickResult = EmoticonsDropdown.menuOnClick(this, this.menu, this.scrollable, this.menuScroll);\n\n const preloader = putPreloader(this.content, true);\n\n const onCategoryStickers = (category: StickersTabCategory, stickers: MyDocument[]) => {\n // if(category.id === 'faved' && category.limit && category.limit < stickers.length) {\n // category.limit = stickers.length;\n // }\n\n if(category.limit) {\n stickers = stickers.slice(0, category.limit);\n }\n\n const ids = new Set(stickers.map((doc) => doc.id));\n forEachReverse(category.items, (item) => {\n if(!ids.has(item.document.id)) {\n this.deleteSticker(category, item.document, true);\n }\n });\n\n this.toggleLocalCategory(category, !!stickers.length);\n forEachReverse(stickers, (doc, idx) => {\n this.unshiftSticker(category, doc, true, idx);\n });\n this.spliceExceed(category);\n category.elements.container.classList.remove('hide');\n };\n\n const favedCategory = this.createLocalCategory('faved', 'FavoriteStickers', 'savedmessages');\n // favedCategory.elements.menuTab.classList.add('active');\n\n const recentCategory = this.createLocalCategory('recent', 'Stickers.Recent', 'recent');\n recentCategory.limit = 20;\n\n const clearButton = ButtonIcon('close', {noRipple: true});\n recentCategory.elements.title.append(clearButton);\n attachClickEvent(clearButton, () => {\n confirmationPopup({\n titleLangKey: 'ClearRecentStickersAlertTitle',\n descriptionLangKey: 'ClearRecentStickersAlertMessage',\n button: {\n langKey: 'Clear'\n }\n }).then(() => {\n this.managers.appStickersManager.clearRecentStickers();\n }, noop);\n });\n\n const premiumCategory = this.createLocalCategory('premium', 'PremiumStickersShort');\n const s = document.createElement('span');\n s.classList.add('tgico-star', 'color-premium');\n premiumCategory.elements.menuTab.append(s);\n\n const promises = [\n Promise.all([\n this.managers.apiManager.getLimit('favedStickers'),\n this.managers.appStickersManager.getFavedStickersStickers()\n ]).then(([limit, stickers]) => {\n this.setFavedLimit(limit);\n onCategoryStickers(favedCategory, stickers);\n }),\n\n this.managers.appStickersManager.getRecentStickersStickers().then((stickers) => {\n onCategoryStickers(recentCategory, stickers);\n }),\n\n this.managers.appStickersManager.getAllStickers().then((res) => {\n for(const set of (res as MessagesAllStickers.messagesAllStickers).sets) {\n this.renderStickerSet(set);\n }\n }),\n\n this.managers.appStickersManager.getPremiumStickers().then((stickers) => {\n const length = stickers.length;\n this.toggleLocalCategory(premiumCategory, rootScope.premium && !!length);\n this.categoryAppendStickers(premiumCategory, Promise.resolve(stickers));\n\n rootScope.addEventListener('premium_toggle', (isPremium) => {\n this.toggleLocalCategory(this.categories['premium'], isPremium && !!length);\n });\n })\n ];\n\n Promise.race(promises).finally(() => {\n preloader.remove();\n });\n\n Promise.all(promises).finally(() => {\n this.mounted = true;\n this.setTyping();\n\n const favedCategory = this.categories['faved'];\n const recentCategory = this.categories['recent'];\n this.menuOnClickResult.setActive(favedCategory.items.length ? favedCategory : recentCategory);\n\n rootScope.addEventListener('stickers_installed', (set) => {\n if(!this.categories[set.id]) {\n this.renderStickerSet(set, true);\n }\n });\n });\n\n this.superStickerRenderer = new SuperStickerRenderer(EmoticonsDropdown.lazyLoadQueue, EMOTICONSSTICKERGROUP, this.managers, intersectionOptions);\n\n const rendererLazyLoadQueue = this.superStickerRenderer.lazyLoadQueue;\n emoticonsDropdown.addLazyLoadQueueRepeat(rendererLazyLoadQueue, this.superStickerRenderer.processInvisible);\n\n // emoticonsDropdown.addEventListener('close', () => {\n // this.categoriesIntersector.lock();\n // });\n\n // emoticonsDropdown.addEventListener('closed', () => {\n // for(const [container] of this.categoriesMap) {\n // onCategoryVisibility(container, false);\n // }\n // });\n\n // emoticonsDropdown.addEventListener('opened', () => {\n // this.categoriesIntersector.unlockAndRefresh();\n // });\n\n // setInterval(() => {\n // // @ts-ignore\n // const players = Object.values(lottieLoader.players).filter((p) => p.width >= 80);\n\n // console.log(\n // 'STICKERS RENDERED IN PANEL:',\n // players.length,\n // players.filter((p) => !p.paused).length,\n // rendererLazyLoadQueue.intersector.getVisible().length\n // );\n // }, .25e3);\n\n rootScope.addEventListener('sticker_updated', ({type, document, faved}) => {\n // if(type === 'faved') {\n // return;\n // }\n\n const category = this.categories[type === 'faved' ? 'faved' : 'recent'];\n if(category) {\n if(faved) {\n this.unshiftSticker(category, document);\n } else {\n this.deleteSticker(category, document);\n }\n }\n });\n\n rootScope.addEventListener('stickers_deleted', ({id}) => {\n const category = this.categories[id];\n if(this.deleteCategory(category)) {\n clearCategoryItems(category);\n }\n });\n\n rootScope.addEventListener('stickers_top', this.postponedEvent((id) => {\n const category = this.categories[id];\n if(category) {\n this.positionCategory(category, true);\n emoticonsDropdown.addEventListener('openAfterLayout', () => {\n this.menuOnClickResult.setActiveStatic(category);\n }, {once: true});\n }\n }));\n\n rootScope.addEventListener('stickers_updated', ({type, stickers}) => {\n const category = this.categories[type === 'faved' ? 'faved' : 'recent'];\n if(category) {\n onCategoryStickers(category, stickers);\n }\n });\n\n rootScope.addEventListener('app_config', () => {\n this.managers.apiManager.getLimit('favedStickers').then((limit) => {\n this.setFavedLimit(limit);\n });\n });\n\n mediaSizes.addEventListener('resize', this.resizeCategories);\n\n attachStickerViewerListeners({listenTo: this.content, listenerSetter: new ListenerSetter()});\n\n const type: IgnoreMouseOutType = 'menu';\n createStickersContextMenu({\n listenTo: this.content,\n verifyRecent: (target) => !!findUpAsChild(target, this.categories['recent'].elements.items),\n onOpen: () => {\n emoticonsDropdown.setIgnoreMouseOut(type, true);\n },\n onClose: () => {\n emoticonsDropdown.setIgnoreMouseOut(type, false);\n }\n });\n\n this.init = null;\n }\n\n public deleteSticker(category: StickersTabCategory, doc: MyDocument, batch?: boolean) {\n const item = findAndSplice(category.items, (item) => item.document.id === doc.id);\n if(item) {\n item.element.remove();\n\n if(!batch) {\n this.onLocalCategoryUpdate(category);\n }\n }\n }\n\n public unshiftSticker(category: StickersTabCategory, doc: MyDocument, batch?: boolean, idx?: number) {\n if(idx !== undefined) {\n const i = category.items[idx];\n if(i && i.document.id === doc.id) {\n return;\n }\n }\n\n let item = findAndSplice(category.items, (item) => item.document.id === doc.id);\n if(!item) {\n item = {\n element: this.superStickerRenderer.renderSticker(doc),\n document: doc\n };\n }\n\n category.items.unshift(item);\n category.elements.items.prepend(item.element);\n\n if(!batch) {\n this.spliceExceed(category);\n }\n }\n\n public unshiftRecentSticker(doc: MyDocument) {\n this.managers.appStickersManager.saveRecentSticker(doc.id);\n }\n\n public deleteRecentSticker(doc: MyDocument) {\n this.managers.appStickersManager.saveRecentSticker(doc.id, true);\n }\n\n public setTyping = (cancel = false) => {\n if(!cancel && (!emoticonsDropdown.isActive() || emoticonsDropdown.tab !== this)) {\n return;\n }\n\n rootScope.dispatchEvent('choosing_sticker', !cancel);\n };\n\n public onClosed() {\n this.setTyping(true);\n }\n\n public onOpened() {\n this.setTyping();\n this.resizeCategories();\n }\n}\n","export const generateDelimiter = () => {\n const delimiter = document.createElement('div');\n delimiter.classList.add('gradient-delimiter');\n return delimiter;\n};\n","import {_i18n} from '../lib/langPack';\n\nexport default function generateFakeIcon(isScam?: boolean) {\n const span = document.createElement('span');\n span.classList.add('badge-fake');\n _i18n(span, isScam ? 'ScamMessage' : 'FakeMessage');\n return span;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport VisibilityIntersector, {OnVisibilityChange} from './visibilityIntersector';\n\nexport default class LazyLoadQueueRepeat2 extends LazyLoadQueueIntersector {\n constructor(parallelLimit?: number, protected onVisibilityChange?: OnVisibilityChange) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector((item) => {\n const {target, visible} = item;\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\n if(visible && spliced.length) {\n spliced.forEach((item) => {\n this.queue.unshift(item);\n });\n }\n\n this.onVisibilityChange && this.onVisibilityChange(item);\n this.setProcessQueueTimeout();\n });\n }\n\n public observe(el: LazyLoadElement) {\n super.observe(el);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport animationIntersector, {AnimationItemGroup} from './animationIntersector';\nimport Scrollable from './scrollable';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport calcImageInBox from '../helpers/calcImageInBox';\nimport {doubleRaf} from '../helpers/schedulers';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport rootScope from '../lib/rootScope';\nimport LazyLoadQueueRepeat2 from './lazyLoadQueueRepeat2';\nimport wrapVideo from './wrappers/video';\nimport noop from '../helpers/noop';\n\nconst width = 400;\nconst maxSingleWidth = width - 100;\nconst height = 100;\n\nexport default class GifsMasonry {\n public lazyLoadQueue: LazyLoadQueueRepeat2;\n private scrollPromise: CancellablePromise = Promise.resolve();\n private timeout: number = 0;\n private managers: AppManagers;\n\n constructor(\n private element: HTMLElement,\n private group: AnimationItemGroup,\n private scrollable: Scrollable,\n attach = true\n ) {\n this.managers = rootScope.managers;\n\n this.lazyLoadQueue = new LazyLoadQueueRepeat2(undefined, ({target, visible}) => {\n if(visible) {\n this.processVisibleDiv(target);\n } else {\n this.processInvisibleDiv(target);\n }\n });\n\n /* setInterval(() => {\n // @ts-ignore\n const players = animationIntersector.byGroups[group];\n\n if(players) {\n console.log(`GIFS RENDERED IN ${group}:`, players.length, players.filter((p) => !p.animation.paused).length, this.lazyLoadQueue.intersector.getVisible().length);\n }\n }, .25e3); */\n\n if(attach) {\n this.attach();\n }\n }\n\n private onScroll = () => {\n if(this.timeout) {\n clearTimeout(this.timeout);\n } else {\n this.scrollPromise = deferredPromise();\n // animationIntersector.checkAnimations(true, group);\n }\n\n this.timeout = window.setTimeout(() => {\n this.timeout = 0;\n this.scrollPromise.resolve();\n // animationIntersector.checkAnimations(false, group);\n }, 150);\n };\n\n public attach() {\n this.scrollable.container.addEventListener('scroll', this.onScroll);\n }\n\n public detach() {\n this.clear();\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\n }\n\n public clear() {\n this.lazyLoadQueue.clear();\n }\n\n private processVisibleDiv(div: HTMLElement) {\n const video = div.querySelector('video');\n if(video) {\n return;\n }\n\n const load = () => {\n const docId = div.dataset.docId;\n const promise = Promise.all([this.managers.appDocsManager.getDoc(docId), this.scrollPromise]).then(async([doc]) => {\n const res = await wrapVideo({\n doc,\n container: div as HTMLDivElement,\n lazyLoadQueue: null,\n // lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n group: this.group,\n noInfo: true,\n noPreview: true\n });\n\n const promise = res.loadPromise;\n promise.finally(() => {\n const video = div.querySelector('video');\n const thumb = div.querySelector('img, canvas');\n\n // div.style.opacity = '';\n thumb && thumb.classList.add('hide');\n\n if(video && !video.parentElement) {\n setTimeout(() => {\n video.src = '';\n video.load();\n const animations = animationIntersector.getAnimations(video);\n animations.forEach((item) => {\n animationIntersector.removeAnimation(item);\n });\n }, 0);\n }\n\n // clearTimeout(timeout);\n if(!this.lazyLoadQueue.intersector.isVisible(div)) {\n this.processInvisibleDiv(div);\n }\n });\n\n return promise;\n });\n\n /* let timeout = window.setTimeout(() => {\n console.error('processVisibleDiv timeout', div, doc);\n }, 1e3); */\n\n return promise;\n };\n\n // return load();\n\n this.lazyLoadQueue.push({div, load});\n }\n\n public processInvisibleDiv = (div: HTMLElement) => {\n return this.scrollPromise.then(async() => {\n // return;\n\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\n return;\n }\n\n const video = div.querySelector('video');\n const thumb = div.querySelector('img, canvas');\n\n if(thumb) {\n thumb.classList.remove('hide');\n\n await doubleRaf();\n }\n\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\n return;\n }\n\n if(video) {\n video.remove();\n video.src = '';\n video.load();\n const animations = animationIntersector.getAnimations(video);\n animations.forEach((item) => {\n animationIntersector.removeAnimation(item);\n });\n }\n });\n };\n\n public add(doc: MyDocument, appendTo = this.element) {\n // let gifWidth = doc.w;\n // let gifHeight = doc.h;\n // if(gifHeight < height) {\n // gifWidth = height / gifHeight * gifWidth;\n // gifHeight = height;\n // }\n\n // const willUseWidth = Math.min(maxSingleWidth, width, gifWidth);\n // const size = calcImageInBox(gifWidth, gifHeight, willUseWidth, height);\n\n const div = document.createElement('div');\n div.classList.add('gif', 'grid-item'/* , 'fade-in-transition' */);\n // div.style.width = size.width + 'px';\n // div.style.opacity = '0';\n // div.style.height = h + 'px';\n div.dataset.docId = '' + doc.id;\n\n appendTo.append(div);\n\n this.lazyLoadQueue.observe({div, load: noop as any});\n\n // let preloader = new ProgressivePreloader(div);\n\n wrapVideo({\n doc,\n container: div as HTMLDivElement,\n lazyLoadQueue: null,\n noInfo: true,\n onlyPreview: true\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport TransitionSlider from './transition';\nimport {ScrollableX} from './scrollable';\nimport rootScope from '../lib/rootScope';\nimport {fastRaf} from '../helpers/schedulers';\nimport {FocusDirection} from '../helpers/fastSmoothScroll';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport whichChild from '../helpers/dom/whichChild';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\n\nexport function horizontalMenu(\n tabs: HTMLElement,\n content: HTMLElement,\n onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean | Promise,\n onTransitionEnd?: () => void,\n transitionTime = 200,\n scrollableX?: ScrollableX,\n listenerSetter?: ListenerSetter\n) {\n const selectTab = TransitionSlider({\n content,\n type: tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation',\n transitionTime,\n onTransitionEnd,\n listenerSetter\n });\n\n if(!tabs) {\n return selectTab;\n }\n\n const proxy = new Proxy(selectTab, {\n apply: (target, that, args) => {\n const id = +args[0];\n const animate = args[1] !== undefined ? args[1] : true;\n\n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\n selectTarget(el, id, animate);\n }\n });\n\n const selectTarget = async(target: HTMLElement, id: number, animate = true) => {\n const tabContent = content.children[id] as HTMLDivElement;\n\n if(onClick) {\n const result1 = onClick(id, tabContent, animate);\n const canChange = result1 instanceof Promise ? await result1 : result1;\n if(canChange !== undefined && !canChange) {\n return;\n }\n }\n\n if(scrollableX) {\n scrollableX.scrollIntoViewNew({\n element: target.parentElement.children[id] as HTMLElement,\n position: 'center',\n forceDirection: animate ? undefined : FocusDirection.Static,\n forceDuration: transitionTime,\n axis: 'x'\n });\n }\n\n if(!rootScope.settings.animationsEnabled) {\n animate = false;\n }\n\n const prevId = selectTab.prevId();\n if(target.classList.contains('active') || id === prevId) {\n return false;\n }\n\n const mutateCallback = animate ? fastRaf : (cb: () => void) => cb();\n\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\n if(prev) {\n mutateCallback(() => {\n prev.classList.remove('active');\n });\n }\n\n // a great stripe from Jolly Cobra\n if(useStripe && prevId !== -1 && animate) {\n mutateCallback(() => {\n const indicator = target.querySelector('i')!;\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\n\n currentIndicator.classList.remove('animate');\n indicator.classList.remove('animate');\n\n // We move and resize our indicator so it repeats the position and size of the previous one.\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\n\n // console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\n\n fastRaf(() => {\n // Now we remove the transform to let it animate to its own position and size.\n indicator.classList.add('animate');\n indicator.style.transform = 'none';\n });\n });\n }\n\n mutateCallback(() => {\n target.classList.add('active');\n });\n\n selectTab(id, animate);\n };\n\n const useStripe = !tabs.classList.contains('no-stripe');\n\n // const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\n const tagName = tabs.firstElementChild.tagName;\n attachClickEvent(tabs, (e) => {\n let target = e.target as HTMLElement;\n\n target = findUpAsChild(target, tabs);\n\n // console.log('tabs click:', target);\n\n if(!target) return false;\n\n let id: number;\n if(target.dataset.tab) {\n id = +target.dataset.tab;\n if(id === -1) {\n return false;\n }\n } else {\n id = whichChild(target);\n }\n\n selectTarget(target, id);\n }, {listenerSetter});\n\n return proxy;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport simulateEvent from '../helpers/dom/dispatchEvent';\nimport documentFragmentToHTML from '../helpers/dom/documentFragmentToHTML';\nimport findUpAttribute from '../helpers/dom/findUpAttribute';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport getCaretPosNew from '../helpers/dom/getCaretPosNew';\nimport getRichValueWithCaret from '../helpers/dom/getRichValueWithCaret';\nimport isInputEmpty from '../helpers/dom/isInputEmpty';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport RichInputHandler, {USING_BOMS} from '../helpers/dom/richInputHandler';\nimport selectElementContents from '../helpers/dom/selectElementContents';\nimport setInnerHTML, {setDirection} from '../helpers/dom/setInnerHTML';\nimport {MessageEntity} from '../layer';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport mergeEntities from '../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../lib/richTextProcessor/parseEntities';\nimport wrapDraftText from '../lib/richTextProcessor/wrapDraftText';\nimport {createCustomFiller, CustomEmojiElement, CustomEmojiRendererElement, insertCustomFillers, renderEmojis} from '../lib/richTextProcessor/wrapRichText';\n\nexport async function insertRichTextAsHTML(input: HTMLElement, text: string, entities: MessageEntity[], wrappingForPeerId: PeerId) {\n const loadPromises: Promise[] = [];\n const wrappingCustomEmoji = entities?.some((entity) => entity._ === 'messageEntityCustomEmoji');\n const renderer = wrappingCustomEmoji ? createCustomEmojiRendererForInput() : undefined;\n const fragment = wrapDraftText(text, {entities, wrappingForPeerId, loadPromises, customEmojiRenderer: renderer});\n const something = fragment.querySelectorAll('[contenteditable=\"false\"]');\n something.forEach((el) => {\n el.contentEditable = 'inherit';\n el.classList.add('pc');\n });\n\n loadPromises.length && await Promise.all(loadPromises);\n\n fragment.querySelectorAll('.input-selectable').forEach((el) => {\n el.prepend(createCustomFiller(true));\n });\n\n const richInputHandler = USING_BOMS ? RichInputHandler.getInstance() : undefined;\n // const restore = richInputHandler.prepareApplyingMarkdown();\n\n // fragment.querySelectorAll('.input-filler').forEach((el) => el.remove());\n\n // const fillers = Array.from(input.querySelectorAll('.input-filler')).map((el) => {\n // el.contentEditable = 'false';\n // return el;\n // });\n\n const customEmojiElements = Array.from(fragment.querySelectorAll('.custom-emoji-placeholder')).map((el) => {\n el.dataset.ces = '1';\n return (el as any).customEmojiElement as CustomEmojiElement;\n });\n\n const html = documentFragmentToHTML(fragment);\n renderer?.destroy();\n\n // console.log(html);\n\n const pre = getCaretPosNew(input);\n // console.log('pre', pre);\n let textNode: ChildNode, textNodeValue: string;\n if(pre.node) {\n // if(pre.node?.nodeValue === BOM && false) {\n // textNode = document.createTextNode(textNodeValue = BOM);\n // (pre.node.parentNode as any as ChildNode).after(textNode);\n // pre.selection.modify('extend', 'forward', 'character');\n // pre.selection.collapseToEnd();\n // }\n } else {\n const range = document.createRange();\n let node = input.lastChild;\n if(!node) {\n input.append(node /* = textNode */ = document.createTextNode(''));\n }\n\n range.setStartAfter(node);\n range.collapse(true);\n pre.selection.removeAllRanges();\n pre.selection.addRange(range);\n }\n\n // const fragmentLastChild = fragment.lastChild;\n\n // const s = document.createElement('span');\n // (node as ChildNode).replaceWith(s);\n // s.append(node);\n input.addEventListener('input', cancelEvent, {capture: true, once: true});\n richInputHandler?.onBeforeInput({inputType: 'insertContent'});\n window.document.execCommand('insertHTML', false, html);\n Array.from(input.querySelectorAll('[data-ces]')).forEach((el, idx) => {\n delete el.dataset.ces;\n const customEmojiElement = customEmojiElements[idx];\n (el as any).customEmojiElement = customEmojiElement;\n customEmojiElement.placeholder = el;\n });\n // fillers.forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n input.querySelectorAll('.pc').forEach((el) => {\n el.contentEditable = 'false';\n });\n if(textNode) {\n const {nodeValue} = textNode;\n if(nodeValue === textNodeValue) {\n textNode.remove();\n } else {\n (textNode as CharacterData).replaceData(nodeValue.indexOf(textNodeValue), textNodeValue.length, '');\n }\n }\n // restore();\n richInputHandler?.removeExtraBOMs(input);\n simulateEvent(input, 'input');\n\n // if(textNode) {\n // const selection = document.getSelection();\n // const node = fragmentLastChild.nextSibling || fragmentLastChild;\n // const range = document.createRange();\n // range.setStartAfter(node);\n // range.collapse(true);\n // selection.removeAllRanges();\n // selection.addRange(range);\n // }\n\n // const after = getCaretPosNew(input);\n // console.log('after', after);\n // if(after.node?.nodeValue === BOM) {\n // const smth = findUpClassName(after.node.parentElement, 'input-something');\n // if(smth) {\n // const selection = document.getSelection();\n // const node = smth.nextSibling;\n // const range = document.createRange();\n // range.setStartAfter(node);\n // range.collapse(true);\n // selection.removeAllRanges();\n // selection.addRange(range);\n\n // // if(after.offset === 0) after.selection.modify('extend', 'forward', 'character');\n // // after.selection.modify('extend', 'forward', 'character');\n // // after.selection.collapseToEnd();\n // }\n // }\n\n // setCaretAt(fragmentLastChild.nextSibling);\n\n // console.log('ASD');\n}\n\nlet init = () => {\n document.addEventListener('paste', (e) => {\n const input = findUpAttribute(e.target, 'contenteditable=\"true\"');\n if(!input) {\n return;\n }\n\n const noLinebreaks = !!input.dataset.noLinebreaks;\n e.preventDefault();\n let text: string, entities: MessageEntity[];\n\n // @ts-ignore\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\n let usePlainText = true;\n\n // @ts-ignore\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\n\n const filterEntity = (e: MessageEntity) => e._ === 'messageEntityEmoji' || (e._ === 'messageEntityLinebreak' && !noLinebreaks);\n if(noLinebreaks) {\n const regExp = /[\\r\\n]/g;\n plainText = plainText.replace(regExp, '');\n html = html.replace(regExp, '');\n }\n\n const peerId = (input.dataset.peerId || NULL_PEER_ID).toPeerId();\n if(html.trim()) {\n // console.log(html.replace(/ (style|class|id)=\".+?\"/g, ''));\n\n html = html.replace(//, '');\n html = html.replace(//, '');\n html = html.replace('
', '');\n\n const match = html.match(/([\\s\\S]*)<\\/body>/);\n if(match) {\n html = match[1].trim();\n }\n\n // const s = cleanHTML(html, true) as NodeList;\n // console.log(s);\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const span = doc.body || document.createElement('body');\n\n // const span: HTMLElement = document.createElement('span');\n // span.innerHTML = html;\n // span.append(...Array.from(s));\n\n let curChild = span.firstChild;\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\n const nextSibling = curChild.nextSibling;\n if(curChild.nodeType === curChild.TEXT_NODE) {\n if(!curChild.nodeValue.trim()) {\n curChild.remove();\n }\n }\n\n curChild = nextSibling;\n }\n\n const richValue = getRichValueWithCaret(span, true, false);\n\n const canWrapCustomEmojis = !!peerId;\n if(!canWrapCustomEmojis) {\n richValue.entities = richValue.entities.filter((entity) => entity._ !== 'messageEntityCustomEmoji');\n }\n\n { // * fix extra new lines appearing from

(can have them from some sources, like macOS Terminal)\n const lines = richValue.value.split('\\n');\n let textLength = 0;\n for(let i = 0; i < lines.length; ++i) {\n const line = lines[i];\n textLength += line.length;\n const index = textLength;\n if(plainText[index] !== '\\n' && i !== (lines.length - 1)) {\n lines[i] = line + lines.splice(i + 1, 1)[0];\n }\n textLength += 1;\n }\n\n const correctedText = lines.join('\\n');\n richValue.value = correctedText;\n }\n\n const richTextLength = richValue.value.replace(/\\s/g, '').length;\n const plainTextLength = plainText.replace(/\\s/g, '').length;\n if(richTextLength === plainTextLength ||\n richValue.entities.find((entity) => entity._ === 'messageEntityCustomEmoji')) {\n text = richValue.value;\n entities = richValue.entities;\n usePlainText = false;\n\n let entities2 = parseEntities(text);\n entities2 = entities2.filter(filterEntity);\n mergeEntities(entities, entities2);\n }\n }\n\n if(usePlainText) {\n text = plainText;\n entities = parseEntities(text);\n entities = entities.filter(filterEntity);\n }\n\n insertRichTextAsHTML(input, text, entities, peerId);\n });\n\n init = null;\n};\n\n// ! it doesn't respect symbols other than strongs\n/* const checkAndSetRTL = (input: HTMLElement) => {\n //const isEmpty = isInputEmpty(input);\n //console.log('input', isEmpty);\n\n //const char = [...getRichValue(input)][0];\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\n let direction = 'ltr';\n if(char && checkRTL(char)) {\n direction = 'rtl';\n }\n\n //console.log('RTL', direction, char);\n\n input.style.direction = direction;\n}; */\n\nexport enum InputState {\n Neutral = 0,\n Valid = 1,\n Error = 2\n};\n\nexport type InputFieldOptions = {\n placeholder?: LangPackKey,\n label?: LangPackKey,\n labelOptions?: any[],\n labelText?: string | DocumentFragment,\n name?: string,\n maxLength?: number,\n showLengthOn?: number,\n plainText?: true,\n required?: boolean,\n canBeEdited?: boolean,\n validate?: () => boolean,\n inputMode?: 'tel' | 'numeric',\n withLinebreaks?: boolean,\n autocomplete?: string\n};\n\nfunction createCustomEmojiRendererForInput() {\n const renderer = CustomEmojiRendererElement.create({\n wrappingDraft: true,\n isSelectable: true\n });\n return renderer;\n}\n\nfunction processCustomEmojisInInput(input: HTMLElement) {\n const customEmojiElements = Array.from(input.querySelectorAll('.custom-emoji, .custom-emoji-placeholder'));\n let renderer = input.querySelector('.custom-emoji-renderer');\n if(!renderer && customEmojiElements.length) {\n renderer = createCustomEmojiRendererForInput();\n input.prepend(renderer);\n } else if(renderer && !customEmojiElements.length) {\n renderer.remove();\n return;\n }\n\n if(!renderer) {\n return;\n }\n\n const customEmojis: Parameters[0] = new Map();\n customEmojiElements.forEach((element) => {\n const customEmojiElement = element instanceof CustomEmojiElement ? element : (element as any).customEmojiElement as CustomEmojiElement;\n const {docId} = customEmojiElement;\n let set = customEmojis.get(docId);\n if(!set) {\n customEmojis.set(docId, set = new Set());\n }\n\n set.add(customEmojiElement);\n });\n\n for(const [docId, customEmojiElements] of customEmojis) {\n let hasSet = renderer.customEmojis.get(docId);\n if(hasSet) {\n for(const customEmojiElement of hasSet) {\n if(!customEmojiElements.has(customEmojiElement)) {\n customEmojiElement.destroy();\n }\n }\n } else {\n hasSet = new Set();\n }\n\n for(const customEmojiElement of customEmojiElements) {\n if(!hasSet.has(customEmojiElement)) {\n customEmojiElement.connectedCallback();\n }\n }\n }\n\n renderer.add(customEmojis, false);\n renderer.forceRender();\n}\n\nexport default class InputField {\n public container: HTMLElement;\n public input: HTMLElement;\n public label: HTMLLabelElement;\n\n public originalValue: string;\n\n public required: boolean;\n public validate: () => boolean;\n\n constructor(public options: InputFieldOptions = {}) {\n this.container = document.createElement('div');\n this.container.classList.add('input-field');\n\n this.required = options.required;\n this.validate = options.validate;\n\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\n }\n\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true, autocomplete} = options;\n const label = options.label || options.labelText;\n\n const onInputCallbacks: Array<() => void> = [];\n let input: HTMLElement;\n if(!plainText) {\n if(init) {\n init();\n }\n\n this.container.innerHTML = `

`;\n\n input = this.container.firstElementChild as HTMLElement;\n input.contentEditable = '' + !!canBeEdited;\n // const observer = new MutationObserver(() => {\n // //checkAndSetRTL(input);\n\n // if(processInput) {\n // processInput();\n // }\n // });\n\n RichInputHandler.getInstance();\n\n input.addEventListener('mousedown', (e) => {\n const selection = document.getSelection();\n if(!selection.isCollapsed) {\n return;\n }\n\n const placeholder = findUpTag(e.target, 'IMG');\n if(!placeholder) {\n return;\n }\n\n const rect = placeholder.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const focusOnNext = e.clientX >= centerX;\n\n const range = document.createRange();\n range.setStartAfter(focusOnNext ? placeholder : placeholder.previousSibling ?? placeholder);\n selection.removeAllRanges();\n selection.addRange(range);\n });\n\n onInputCallbacks.push(() => {\n // console.log('input');\n // return;\n // * because if delete all characters there will br left\n if(isInputEmpty(input)) {\n // const textNode = Array.from(input.childNodes).find((node) => node.nodeType === node.TEXT_NODE) || document.createTextNode('');\n input.replaceChildren();\n // input.append(document.createTextNode('')); // need first text node to support history stack\n }\n\n // const fillers = Array.from(input.querySelectorAll('.emoji-filler')) as HTMLElement[];\n // fillers.forEach((filler) => {\n // const textContent = filler.textContent;\n // if(textContent === BOM) {\n // return;\n // }\n\n // if(textContent) {\n\n // } else {\n // let curChild = filler.firstChild;\n // while(curChild) {\n // curChild = curChild.nextSibling;\n // }\n // }\n\n // filler.classList.remove('emoji-filler');\n // });\n\n // Array.from(input.querySelectorAll('br, span:empty')).forEach((el) => {\n // const parentElement = el.parentElement;\n // (parentElement === input ? el : parentElement).remove();\n // });\n USING_BOMS && Array.from(input.querySelectorAll('br:not(.br-not-br)')).forEach((el) => {\n // const parentElement = el.parentElement;\n el.remove();\n // if(!parentElement.children.length && !parentElement.textContent) {\n // parentElement.textContent = '';\n // }\n });\n\n insertCustomFillers(Array.from(input.querySelectorAll('.input-something')));\n\n processCustomEmojisInInput(input);\n\n // .forEach((el) => el.remove());\n });\n\n // ! childList for paste first symbol\n // observer.observe(input, {characterData: true, childList: true, subtree: true});\n } else {\n this.container.innerHTML = `\n \n `;\n\n input = this.container.firstElementChild as HTMLElement;\n // input.addEventListener('input', () => checkAndSetRTL(input));\n }\n\n setDirection(input);\n\n if(options.inputMode) {\n input.inputMode = options.inputMode;\n }\n\n if(placeholder) {\n _i18n(input, placeholder, undefined, 'placeholder');\n }\n\n if(label || placeholder) {\n const border = document.createElement('div');\n border.classList.add('input-field-border');\n this.container.append(border);\n }\n\n if(label) {\n this.label = document.createElement('label');\n this.setLabel();\n this.container.append(this.label);\n }\n\n if(maxLength) {\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\n let showingLength = false;\n\n const onInput = () => {\n const wasError = input.classList.contains('error');\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValueWithCaret(input, false, false).value].length;\n const diff = maxLength - inputLength;\n const isError = diff < 0;\n input.classList.toggle('error', isError);\n\n // this.onLengthChange && this.onLengthChange(inputLength, isError);\n\n if(isError || diff <= showLengthOn) {\n this.setLabel();\n labelEl.append(` (${maxLength - inputLength})`);\n if(!showingLength) showingLength = true;\n } else if((wasError && !isError) || showingLength) {\n this.setLabel();\n showingLength = false;\n }\n };\n\n onInputCallbacks.push(onInput);\n }\n\n const noLinebreaks = !options.withLinebreaks;\n if(noLinebreaks && !plainText) {\n input.dataset.noLinebreaks = '1';\n input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n e.preventDefault();\n return false;\n }\n });\n }\n\n if(onInputCallbacks.length) {\n input.addEventListener('input', () => {\n onInputCallbacks.forEach((callback) => callback());\n });\n }\n\n this.input = input;\n }\n\n public select() {\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\n return;\n }\n\n if(this.options.plainText) {\n (this.input as HTMLInputElement).select(); // * select text\n } else {\n selectElementContents(this.input);\n }\n }\n\n public setLabel() {\n this.label.textContent = '';\n if(this.options.labelText) {\n setInnerHTML(this.label, this.options.labelText);\n } else {\n this.label.append(i18n(this.options.label, this.options.labelOptions));\n }\n }\n\n get value(): string {\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValueWithCaret(this.input, false, false).value;\n // return getRichValue(this.input);\n }\n\n set value(value: Parameters[1]) {\n this.setValueSilently(value, true);\n this.simulateInputEvent();\n }\n\n public simulateInputEvent() {\n simulateEvent(this.input, 'input');\n }\n\n public setValueSilently(value: Parameters[1], fromSet?: boolean) {\n if(this.options.plainText) {\n (this.input as HTMLInputElement).value = value as string;\n } else {\n replaceContent(this.input, value);\n processCustomEmojisInInput(this.input);\n }\n }\n\n public isChanged() {\n return this.value !== this.originalValue;\n }\n\n public isValid() {\n return !this.input.classList.contains('error') &&\n (!this.validate || this.validate()) &&\n (!this.required || !isInputEmpty(this.input));\n }\n\n public isValidToChange() {\n return this.isValid() && this.isChanged();\n }\n\n public setDraftValue(value = '', silent?: boolean) {\n if(!this.options.plainText) {\n value = documentFragmentToHTML(wrapDraftText(value));\n }\n\n if(silent) {\n this.setValueSilently(value, false);\n } else {\n this.value = value;\n }\n }\n\n public setOriginalValue(value: InputField['originalValue'] = '', silent?: boolean) {\n this.originalValue = value;\n this.setDraftValue(value, silent);\n }\n\n public setState(state: InputState, label?: LangPackKey) {\n if(label) {\n this.label.textContent = '';\n this.label.append(i18n(label, this.options.labelOptions));\n } else {\n this.setLabel();\n }\n\n this.input.classList.toggle('error', !!(state & InputState.Error));\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\n }\n\n public setError(label?: LangPackKey) {\n this.setState(InputState.Error, label);\n }\n}\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { getRichValue } from \"../helpers/dom\";\nimport {LangPackKey} from '../lib/langPack';\nimport InputField from './inputField';\n\nexport default class InputSearch {\n public container: HTMLElement;\n public input: HTMLElement;\n public inputField: InputField;\n public clearBtn: HTMLElement;\n\n public prevValue = '';\n public timeout = 0;\n public onChange: (value: string) => void;\n public onClear: () => void;\n\n constructor(placeholder: LangPackKey, onChange?: (value: string) => void) {\n this.inputField = new InputField({\n placeholder,\n plainText: true\n });\n\n this.container = this.inputField.container;\n this.container.classList.remove('input-field');\n this.container.classList.add('input-search');\n\n this.onChange = onChange;\n\n this.input = this.inputField.input;\n this.input.classList.add('input-search-input');\n\n const searchIcon = document.createElement('i');\n searchIcon.classList.add('tgico', 'tgico-search');\n\n this.clearBtn = document.createElement('i');\n this.clearBtn.classList.add('tgico', 'btn-icon', 'tgico-close');\n\n this.input.addEventListener('input', this.onInput);\n this.clearBtn.addEventListener('click', this.onClearClick);\n\n this.container.append(searchIcon, this.clearBtn);\n }\n\n onInput = () => {\n if(!this.onChange) return;\n\n const value = this.value;\n\n // this.input.classList.toggle('is-empty', !value.trim());\n\n if(value !== this.prevValue) {\n this.prevValue = value;\n clearTimeout(this.timeout);\n this.timeout = window.setTimeout(() => {\n this.onChange(value);\n }, 200);\n }\n };\n\n onClearClick = () => {\n this.value = '';\n this.onChange && this.onChange('');\n this.onClear && this.onClear();\n };\n\n get value() {\n return this.inputField.value;\n }\n\n set value(value: string) {\n this.prevValue = value;\n clearTimeout(this.timeout);\n this.inputField.value = value;\n }\n\n public remove() {\n clearTimeout(this.timeout);\n this.input.removeEventListener('input', this.onInput);\n this.clearBtn.removeEventListener('click', this.onClearClick);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport VisibilityIntersector, {OnVisibilityChangeItem} from './visibilityIntersector';\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport useHeavyAnimationCheck from '../hooks/useHeavyAnimationCheck';\n\nexport default class LazyLoadQueue extends LazyLoadQueueIntersector {\n constructor(parallelLimit?: number, ignoreHeavyAnimation?: boolean) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector(this.onVisibilityChange);\n\n !ignoreHeavyAnimation && useHeavyAnimationCheck(() => {\n this.lock();\n }, () => {\n this.unlockAndRefresh();\n });\n }\n\n private onVisibilityChange = ({target, visible}: OnVisibilityChangeItem) => {\n // if(DEBUG) {\n // this.log('isIntersecting', target, visible);\n // }\n\n // if visible - will move to the end of visible arary\n findAndSpliceAll(this.queue, (i) => i.div === target).forEach((item) => {\n if(visible) {\n item.wasSeen = true;\n }\n\n item.visible = visible;\n const index = this.queue.findIndex((item) => !item.visible);\n this.queue.splice(Math.max(0, index), 0, item);\n });\n\n this.setProcessQueueTimeout();\n };\n\n protected getItem() {\n return findAndSplice(this.queue, (item) => item.wasSeen);\n }\n\n public async processItem(item: LazyLoadElement) {\n await super.processItem(item);\n this.intersector.unobserve(item.div);\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\n const inserted = super.addElement(method, el);\n\n if(!inserted) return false;\n\n this.observe(el);\n /* if(el.wasSeen) {\n this.processQueue(el);\n } else */\n el.wasSeen ??= false;\n\n return true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport LazyLoadQueueBase, {LazyLoadElementBase} from './lazyLoadQueueBase';\nimport VisibilityIntersector from './visibilityIntersector';\n\nexport type LazyLoadElement = Omit & {\n load: (target?: HTMLElement) => Promise,\n div: HTMLElement\n wasSeen?: boolean,\n visible?: boolean\n};\n\nexport default class LazyLoadQueueIntersector extends LazyLoadQueueBase {\n protected queue: Array = [];\n protected inProcess: Set = new Set();\n\n public intersector: VisibilityIntersector;\n protected intersectorTimeout: number;\n\n constructor(parallelLimit?: number) {\n super(parallelLimit);\n }\n\n public lock() {\n super.lock();\n this.intersector.lock();\n }\n\n public unlock() {\n super.unlock();\n this.intersector.unlock();\n }\n\n public unlockAndRefresh() {\n super.unlock();\n this.intersector.unlockAndRefresh();\n }\n\n public clear() {\n super.clear();\n this.intersector.disconnect();\n }\n\n public refresh() {\n this.intersector.refresh();\n }\n\n protected loadItem(item: LazyLoadElement) {\n return item.load(item.div);\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\n const item = this.queue.find((i) => i.div === el.div && i.load === el.load);\n if(item) {\n return false;\n } else {\n for(const item of this.inProcess) {\n if(item.div === el.div && item.load === el.load) {\n return false;\n }\n }\n }\n\n this.queue[method](el);\n return true;\n }\n\n protected setProcessQueueTimeout() {\n this.intersectorTimeout ??= window.setTimeout(() => {\n this.intersectorTimeout = undefined;\n this.processQueue();\n }, 0);\n }\n\n public push(el: LazyLoadElement) {\n super.push(el);\n }\n\n public unshift(el: LazyLoadElement) {\n super.unshift(el);\n }\n\n public delete(el: Omit) {\n findAndSpliceAll(this.queue, (i) => i.div === el.div);\n this.unobserve(el);\n }\n\n public observe(el: LazyLoadElement) {\n this.intersector.observe(el.div);\n }\n\n public unobserve(el: Omit) {\n this.intersector.unobserve(el.div);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GrabEvent} from '../helpers/dom/attachGrabListeners';\nimport appMediaPlaybackController from './appMediaPlaybackController';\nimport RangeSelector from './rangeSelector';\n\nexport default class MediaProgressLine extends RangeSelector {\n protected filledLoad: HTMLDivElement;\n\n protected progressRAF = 0;\n\n protected media: HTMLMediaElement;\n protected streamable: boolean;\n\n constructor(media?: HTMLAudioElement | HTMLVideoElement, streamable?: boolean, withTransition?: boolean, useTransform?: boolean) {\n super({\n step: 1000 / 60 / 1000,\n min: 0,\n max: 1,\n withTransition,\n useTransform\n }, 0);\n\n if(media) {\n this.setMedia(media, streamable);\n }\n }\n\n public setMedia(media: HTMLMediaElement, streamable = false) {\n if(this.media) {\n this.removeListeners();\n }\n\n if(streamable && !this.filledLoad) {\n this.filledLoad = document.createElement('div');\n this.filledLoad.classList.add('progress-line__filled', 'progress-line__loaded');\n this.container.prepend(this.filledLoad);\n // this.setLoadProgress();\n } else if(this.filledLoad) {\n this.filledLoad.classList.toggle('hide', !streamable);\n }\n\n this.media = media;\n this.streamable = streamable;\n if(!media.paused || media.currentTime > 0) {\n this.onPlay();\n }\n\n let wasPlaying = false;\n this.setSeekMax();\n this.setListeners();\n this.setHandlers({\n onMouseDown: () => {\n wasPlaying = !this.media.paused;\n wasPlaying && this.media.pause();\n },\n\n onMouseUp: (e) => {\n // cancelEvent(e.event);\n wasPlaying && this.media.play();\n }\n });\n }\n\n protected onLoadedData = () => {\n this.max = this.media.duration;\n this.seek.setAttribute('max', '' + this.max);\n };\n\n protected onEnded = () => {\n this.setProgress();\n };\n\n protected onPlay = () => {\n const r = () => {\n this.setProgress();\n\n this.progressRAF = this.media.paused ? 0 : window.requestAnimationFrame(r);\n };\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n }\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n\n this.progressRAF = window.requestAnimationFrame(r);\n };\n\n protected onTimeUpdate = () => {\n if(this.media.paused) {\n this.setProgress();\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n }\n };\n\n protected onProgress = (e: Event) => {\n this.setLoadProgress();\n };\n\n protected scrub(e: GrabEvent) {\n const scrubTime = super.scrub(e);\n this.media.currentTime = scrubTime;\n return scrubTime;\n }\n\n protected setLoadProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const buf = this.media.buffered;\n const numRanges = buf.length;\n\n const currentTime = this.media.currentTime;\n let nearestStart = 0, end = 0;\n for(let i = 0; i < numRanges; ++i) {\n const start = buf.start(i);\n if(currentTime >= start && start >= nearestStart) {\n nearestStart = start;\n end = buf.end(i);\n }\n\n // console.log('onProgress range:', i, buf.start(i), buf.end(i), this.media);\n }\n\n // console.log('onProgress correct range:', nearestStart, end, this.media);\n\n const percents = this.media.duration ? end / this.media.duration : 0;\n this.filledLoad.style.width = (percents * 100) + '%';\n // this.filledLoad.style.transform = 'scaleX(' + percents + ')';\n }\n\n protected setSeekMax() {\n this.max = this.media.duration || 0;\n if(this.max > 0) {\n this.onLoadedData();\n } else {\n this.media.addEventListener('loadeddata', this.onLoadedData);\n }\n }\n\n public setProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const currentTime = this.media.currentTime;\n\n super.setProgress(currentTime);\n }\n\n public setListeners() {\n super.setListeners();\n this.media.addEventListener('ended', this.onEnded);\n this.media.addEventListener('play', this.onPlay);\n this.media.addEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.addEventListener('progress', this.onProgress);\n }\n\n public removeListeners() {\n super.removeListeners();\n\n if(this.media) {\n this.media.removeEventListener('loadeddata', this.onLoadedData);\n this.media.removeEventListener('ended', this.onEnded);\n this.media.removeEventListener('play', this.onPlay);\n this.media.removeEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.removeEventListener('progress', this.onProgress);\n }\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n this.progressRAF = 0;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {FontFamily, FontSize, FontWeight} from '../config/font';\nimport getTextWidth from '../helpers/canvas/getTextWidth';\nimport mediaSizes from '../helpers/mediaSizes';\nimport clamp from '../helpers/number/clamp';\nimport {fastRaf} from '../helpers/schedulers';\n\n// Thanks to https://stackoverflow.com/a/49349813\n\n/**\n * Attibute modifier to create middle ellipsis\n * When the attribute value is left blank the ellipsis will be in the middle\n * When positive the attribute value will be used as a percentage\n * When negative the attribute value will be used as character index counted from the end\n * @example\n *
A Javascript solution to middle ellipsis
\n *
A Javascript solution to middle ellipsis
\n *
A Javascript solution to middle ellipsis
\n */\nconst ellipsis = '…';\nconst map: Map = new Map();\n\nconst testQueue: Set = new Set();\nconst fontSize = '16px';\nlet pendingTest = false;\n\nfunction setTestQueue() {\n if(pendingTest) {\n return;\n }\n\n pendingTest = true;\n fastRaf(() => {\n pendingTest = false;\n testQueueElements();\n });\n}\n\nfunction testQueueElements() {\n testQueue.forEach(testElement);\n testQueue.clear();\n}\n\nwindow.addEventListener('resize', () => {\n for(const [key] of map) {\n testQueue.add(key);\n }\n\n setTestQueue();\n}, {capture: true, passive: true});\n\nfunction getElementWidth(element: HTMLElement) {\n const type = element.dataset.sizeType;\n if(type) {\n const mediaSize = mediaSizes.active;\n // @ts-ignore\n const size: MediaSize = mediaSize[type];\n return size.width;\n }\n\n return element.getBoundingClientRect().width;\n}\n\nfunction testElement(element: HTMLElement) {\n // const perf = performance.now();\n // do not recalculate variables a second time\n let mapped = map.get(element);\n const firstTime = !mapped;\n\n let {text, textLength, from, multiplier, font, textWidth, elementWidth} = mapped || {};\n // console.log('[MEE] testElement got mapped', mapped);\n\n if(firstTime) {\n text = element.textContent;\n textLength = text.length;\n from = /* parseFloat(element.getAttribute(attributeName)) || */50;\n multiplier = from > 0 && from / 100;\n\n let fontSize = element.dataset.fontSize;\n if(fontSize && +fontSize) fontSize += 'px';\n // const perf = performance.now();\n font = `${element.dataset.fontWeight || FontWeight} ${fontSize || FontSize} ${FontFamily}`;\n /* const computedStyle = window.getComputedStyle(elm, null);\n font = `${computedStyle.getPropertyValue('font-weight')} ${computedStyle.getPropertyValue('font-size')} ${computedStyle.getPropertyValue('font-family')}`; */\n // console.log('testMiddleEllipsis get computed style:', performance.now() - perf, font);\n\n textWidth = getTextWidth(text, font);\n // const perf = performance.now();\n elementWidth = getElementWidth(element);\n // console.log('testMiddleEllipsis get offsetWidth:', performance.now() - perf, font);\n mapped = {text, textLength, from, multiplier, font, textWidth, elementWidth};\n map.set(element, mapped);\n\n // console.log('[MEE] testElement map set', element);\n }\n\n const newElementWidth = getElementWidth(element);\n const widthChanged = firstTime || elementWidth !== newElementWidth;\n !firstTime && widthChanged && (mapped.elementWidth = elementWidth = newElementWidth);\n\n if(widthChanged) {\n if(textWidth > elementWidth) {\n element.setAttribute('title', text);\n let smallerText = text;\n let smallerWidth = elementWidth;\n while(smallerText.length > 3) {\n const smallerTextLength = smallerText.length;\n const half = multiplier &&\n clamp(multiplier * smallerTextLength << 0, 1, smallerTextLength - 2) ||\n Math.max(smallerTextLength + from - 1, 1);\n const half1 = smallerText.substr(0, half).replace(/\\s*$/, '');\n const half2 = smallerText.substr(half + 1).replace(/^\\s*/, '');\n smallerText = half1 + half2;\n smallerWidth = getTextWidth(smallerText + ellipsis, font);\n if(smallerWidth < elementWidth) {\n element.textContent = half1 + ellipsis + half2;\n break;\n }\n }\n\n // * set new width after cutting text\n mapped.elementWidth = getElementWidth(element);\n // mapped.textWidth = smallerWidth;\n } else {\n element.removeAttribute('title');\n }\n }\n\n // console.log('testMiddleEllipsis for element:', elm, performance.now() - perf);\n}\n\nexport class MiddleEllipsisElement extends HTMLElement {\n connectedCallback() {\n // console.log('[MEE]: connectedCallback before', map.has(this), testQueue.has(this), map.size, this.textContent, map);\n\n map.set(this, null);\n if(this.dataset.sizeType) {\n testElement(this);\n } else {\n testQueue.add(this);\n setTestQueue();\n }\n // testElement(this);\n\n // console.log('[MEE]: connectedCallback after', map.has(this), map.size, testQueue.has(this), testQueue.size);\n }\n\n disconnectedCallback() {\n const deleted = map.delete(this);\n testQueue.delete(this);\n // console.log('[MEE]: disconnectedCallback', deleted, map.has(this), map.size, this.textContent, map);\n }\n}\n\ncustomElements.define('middle-ellipsis-element', MiddleEllipsisElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport lottieLoader, {LottieLoader} from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport PasswordInputField from '../passwordInputField';\n\nexport default class PasswordMonkey {\n public container: HTMLElement;\n public animation: RLottiePlayer;\n public needFrame = 0;\n protected loadPromise: ReturnType;\n\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\n this.container = document.createElement('div');\n this.container.classList.add('media-sticker-wrapper');\n }\n\n public load() {\n if(this.loadPromise) return this.loadPromise;\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\n container: this.container,\n loop: false,\n autoplay: false,\n width: this.size,\n height: this.size,\n noCache: true\n // }, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then((_animation) => {\n }, 'TwoFactorSetupMonkeyPeek').then((_animation) => {\n // return;\n this.animation = _animation;\n this.animation.addEventListener('enterFrame', currentFrame => {\n // console.log('enterFrame', currentFrame, this.needFrame);\n\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\n this.animation.setSpeed(1);\n this.animation.pause();\n }\n });\n\n this.passwordInputField.helpers.onVisibilityClickAdditional = () => {\n if(this.passwordInputField.helpers.passwordVisible) {\n this.animation.setDirection(1);\n this.animation.curFrame = 0;\n this.needFrame = 16;\n this.animation.play();\n } else {\n this.animation.setDirection(-1);\n this.animation.curFrame = 16;\n this.needFrame = 0;\n this.animation.play();\n }\n };\n\n return lottieLoader.waitForFirstFrame(_animation);\n });\n }\n\n public remove() {\n if(this.animation) {\n this.animation.remove();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField from '../inputField';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\n\nexport default class TrackingMonkey {\n public container: HTMLElement;\n\n protected max = 45;\n protected needFrame = 0;\n\n protected animation: RLottiePlayer;\n protected idleAnimation: RLottiePlayer;\n\n protected loadPromise: Promise;\n\n constructor(protected inputField: InputField, protected size: number) {\n this.container = document.createElement('div');\n this.container.classList.add('media-sticker-wrapper');\n\n const input = inputField.input;\n\n input.addEventListener('blur', () => {\n this.playAnimation(0);\n });\n\n input.addEventListener('input', (e) => {\n this.playAnimation(inputField.value.length);\n });\n\n /* codeInput.addEventListener('focus', () => {\n playAnimation(Math.max(codeInput.value.length, 1));\n }); */\n }\n\n // 1st symbol = frame 15\n // end symbol = frame 165\n public playAnimation(length: number) {\n if(!this.animation) return;\n\n length = Math.min(length, 30);\n let frame: number;\n if(length) {\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\n\n if(this.idleAnimation) {\n this.idleAnimation.stop(true);\n this.idleAnimation.canvas[0].style.display = 'none';\n }\n\n this.animation.canvas[0].style.display = '';\n } else {\n /* const cb = (frameNo: number) => {\n if(frameNo <= 1) { */\n /* idleAnimation.play();\n idleAnimation.canvas.style.display = '';\n animation.canvas.style.display = 'none'; */\n /* animation.removeListener('enterFrame', cb);\n }\n };\n animation.addListener('enterFrame', cb); */\n\n frame = 0;\n }\n // animation.playSegments([1, 2]);\n\n const direction = this.needFrame > frame ? -1 : 1;\n // console.log('keydown', length, frame, direction);\n\n this.animation.setDirection(direction);\n if(this.needFrame !== 0 && frame === 0) {\n this.animation.setSpeed(7);\n }\n /* let diff = Math.abs(needFrame - frame * direction);\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\n this.needFrame = frame;\n\n this.animation.play();\n\n /* animation.goToAndStop(15, true); */\n // animation.goToAndStop(length / max * );\n }\n\n public load() {\n if(this.loadPromise) return this.loadPromise;\n return this.loadPromise = Promise.all([\n lottieLoader.loadAnimationAsAsset({\n container: this.container,\n loop: true,\n autoplay: true,\n width: this.size,\n height: this.size\n }, 'TwoFactorSetupMonkeyIdle').then((animation) => {\n this.idleAnimation = animation;\n\n // ! animationIntersector will stop animation instantly\n if(!this.inputField.value.length) {\n animation.play();\n }\n\n return lottieLoader.waitForFirstFrame(animation);\n }),\n\n lottieLoader.loadAnimationAsAsset({\n container: this.container,\n loop: false,\n autoplay: false,\n width: this.size,\n height: this.size\n }, 'TwoFactorSetupMonkeyTracking').then((_animation) => {\n this.animation = _animation;\n\n if(!this.inputField.value.length) {\n this.animation.canvas[0].style.display = 'none';\n }\n\n this.animation.addEventListener('enterFrame', currentFrame => {\n // console.log('enterFrame', currentFrame, needFrame);\n // let currentFrame = Math.round(e.currentTime);\n\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\n this.animation.setSpeed(1);\n this.animation.pause();\n }\n\n if(currentFrame === 0 && this.needFrame === 0) {\n // animation.curFrame = 0;\n\n if(this.idleAnimation) {\n this.idleAnimation.canvas[0].style.display = '';\n this.idleAnimation.play();\n this.animation.canvas[0].style.display = 'none';\n }\n }\n });\n // console.log(animation.getDuration(), animation.getDuration(true));\n\n return lottieLoader.waitForFirstFrame(_animation);\n })\n ]);\n }\n\n public remove() {\n if(this.animation) this.animation.remove();\n if(this.idleAnimation) this.idleAnimation.remove();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport InputField, {InputFieldOptions} from './inputField';\n\nexport class PasswordInputHelpers {\n public passwordVisible = false;\n public toggleVisible: HTMLElement;\n public onVisibilityClickAdditional: () => void;\n\n constructor(public container: HTMLElement, public input: HTMLInputElement) {\n input.type = 'password';\n input.setAttribute('required', '');\n input.name = 'notsearch_password';\n input.autocomplete = 'off';\n\n // * https://stackoverflow.com/a/35949954/6758968\n const stealthy = document.createElement('input');\n stealthy.classList.add('stealthy');\n stealthy.tabIndex = -1;\n stealthy.type = 'password';\n input.parentElement.prepend(stealthy);\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\n\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\n input.setAttribute('readonly', '');\n input.addEventListener('focus', () => {\n input.removeAttribute('readonly');\n }, {once: true});\n } */\n\n const toggleVisible = this.toggleVisible = document.createElement('span');\n toggleVisible.classList.add('toggle-visible', 'tgico');\n\n container.classList.add('input-field-password');\n container.append(toggleVisible);\n\n toggleVisible.addEventListener('click', this.onVisibilityClick);\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\n }\n\n public onVisibilityClick = (e: Event) => {\n cancelEvent(e);\n this.passwordVisible = !this.passwordVisible;\n\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\n };\n}\n\nexport default class PasswordInputField extends InputField {\n public helpers: PasswordInputHelpers;\n\n constructor(options: InputFieldOptions = {}) {\n super({\n plainText: true,\n ...options\n });\n\n this.helpers = new PasswordInputHelpers(this.container, this.input as HTMLInputElement);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_PARALLAX_SUPPORTED from '../environment/parallaxSupport';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport filterChatPhotosMessages from '../helpers/filterChatPhotosMessages';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ListLoader from '../helpers/listLoader';\nimport {fastRaf} from '../helpers/schedulers';\nimport {Message, ChatFull, MessageAction, Photo} from '../layer';\nimport type {AppMessagesManager} from '../lib/appManagers/appMessagesManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport {openAvatarViewer} from './avatar';\nimport {putAvatar} from './putPhoto';\nimport Scrollable from './scrollable';\nimport SwipeHandler from './swipeHandler';\nimport wrapPhoto from './wrappers/photo';\n\nconst LOAD_NEAREST = 3;\n\nexport default class PeerProfileAvatars {\n private static BASE_CLASS = 'profile-avatars';\n private static SCALE = IS_PARALLAX_SUPPORTED ? 2 : 1;\n private static TRANSLATE_TEMPLATE = IS_PARALLAX_SUPPORTED ? `translate3d({x}, 0, -1px) scale(${PeerProfileAvatars.SCALE})` : 'translate({x}, 0)';\n public container: HTMLElement;\n public avatars: HTMLElement;\n public gradient: HTMLElement;\n public info: HTMLElement;\n public arrowPrevious: HTMLElement;\n public arrowNext: HTMLElement;\n private tabs: HTMLDivElement;\n private listLoader: ListLoader;\n private peerId: PeerId;\n private intersectionObserver: IntersectionObserver;\n private loadCallbacks: Map void>;\n private listenerSetter: ListenerSetter;\n private swipeHandler: SwipeHandler;\n\n constructor(\n public scrollable: Scrollable,\n private managers: AppManagers\n ) {\n this.container = document.createElement('div');\n this.container.classList.add(PeerProfileAvatars.BASE_CLASS + '-container');\n\n this.avatars = document.createElement('div');\n this.avatars.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatars');\n\n this.gradient = document.createElement('div');\n this.gradient.classList.add(PeerProfileAvatars.BASE_CLASS + '-gradient');\n\n this.info = document.createElement('div');\n this.info.classList.add(PeerProfileAvatars.BASE_CLASS + '-info');\n\n this.tabs = document.createElement('div');\n this.tabs.classList.add(PeerProfileAvatars.BASE_CLASS + '-tabs');\n\n this.arrowPrevious = document.createElement('div');\n this.arrowPrevious.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', 'tgico-avatarprevious');\n\n /* const previousIcon = document.createElement('i');\n previousIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-previous');\n this.arrowBack.append(previousIcon); */\n\n this.arrowNext = document.createElement('div');\n this.arrowNext.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', PeerProfileAvatars.BASE_CLASS + '-arrow-next', 'tgico-avatarnext');\n\n /* const nextIcon = document.createElement('i');\n nextIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-next');\n this.arrowNext.append(nextIcon); */\n\n this.container.append(this.avatars, this.gradient, this.info, this.tabs, this.arrowPrevious, this.arrowNext);\n\n this.loadCallbacks = new Map();\n this.listenerSetter = new ListenerSetter();\n\n const checkScrollTop = () => {\n if(this.scrollable.scrollTop !== 0) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement,\n position: 'start'\n });\n return false;\n }\n\n return true;\n };\n\n const SWITCH_ZONE = 1 / 3;\n let cancel = false;\n let freeze = false;\n attachClickEvent(this.container, async(_e) => {\n if(freeze) {\n cancelEvent(_e);\n return;\n }\n\n if(cancel) {\n cancel = false;\n return;\n }\n\n if(!checkScrollTop()) {\n return;\n }\n\n const rect = this.container.getBoundingClientRect();\n\n // const e = (_e as TouchEvent).touches ? (_e as TouchEvent).touches[0] : _e as MouseEvent;\n const e = _e;\n const x = e.pageX;\n\n const clickX = x - rect.left;\n if((!this.listLoader.previous.length && !this.listLoader.next.length) ||\n (clickX > (rect.width * SWITCH_ZONE) && clickX < (rect.width - rect.width * SWITCH_ZONE))) {\n const peerId = this.peerId;\n\n const targets: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[] = [];\n this.listLoader.previous.concat(this.listLoader.current, this.listLoader.next).forEach((item, idx) => {\n targets.push({\n element: /* null */this.avatars.children[idx] as HTMLElement,\n item\n });\n });\n\n const prevTargets = targets.slice(0, this.listLoader.previous.length);\n const nextTargets = targets.slice(this.listLoader.previous.length + 1);\n\n const target = this.avatars.children[this.listLoader.previous.length] as HTMLElement;\n freeze = true;\n openAvatarViewer(target, peerId, () => peerId === this.peerId, this.listLoader.current, prevTargets, nextTargets);\n freeze = false;\n } else {\n const centerX = rect.right - (rect.width / 2);\n const toRight = x > centerX;\n\n // this.avatars.classList.remove('no-transition');\n // fastRaf(() => {\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n\n let distance: number;\n if(this.listLoader.index === 0 && !toRight) distance = this.listLoader.count - 1;\n else if(this.listLoader.index === (this.listLoader.count - 1) && toRight) distance = -(this.listLoader.count - 1);\n else distance = toRight ? 1 : -1;\n this.listLoader.go(distance);\n\n fastRaf(() => {\n this.avatars.classList.remove('no-transition');\n });\n // });\n }\n }, {listenerSetter: this.listenerSetter});\n\n const cancelNextClick = () => {\n cancel = true;\n document.body.addEventListener(IS_TOUCH_SUPPORTED ? 'touchend' : 'click', (e) => {\n cancel = false;\n }, {once: true});\n };\n\n let width = 0, x = 0, lastDiffX = 0, /* lastIndex = 0, */ minX = 0;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.avatars,\n onSwipe: (xDiff, yDiff) => {\n xDiff *= -1;\n yDiff *= -1;\n\n lastDiffX = xDiff;\n let lastX = x + xDiff * -PeerProfileAvatars.SCALE;\n if(lastX > 0) lastX = 0;\n else if(lastX < minX) lastX = minX;\n\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', lastX + 'px');\n // console.log(xDiff, yDiff);\n return false;\n },\n verifyTouchTarget: (e) => {\n if(!checkScrollTop()) {\n cancelNextClick();\n cancelEvent(e as any as Event);\n return false;\n } else if(this.container.classList.contains('is-single') || freeze) {\n return false;\n }\n\n return true;\n },\n onFirstSwipe: () => {\n const rect = this.avatars.getBoundingClientRect();\n width = rect.width;\n minX = -width * (this.tabs.childElementCount - 1);\n\n /* lastIndex = whichChild(this.tabs.querySelector('.active'));\n x = -width * lastIndex; */\n x = rect.left - this.container.getBoundingClientRect().left;\n\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', x + 'px');\n\n this.container.classList.add('is-swiping');\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n },\n onReset: () => {\n const addIndex = Math.ceil(Math.abs(lastDiffX) / (width / PeerProfileAvatars.SCALE)) * (lastDiffX >= 0 ? 1 : -1);\n cancelNextClick();\n\n // console.log(addIndex);\n\n this.avatars.classList.remove('no-transition');\n fastRaf(() => {\n this.listLoader.go(addIndex);\n this.container.classList.remove('is-swiping');\n });\n }\n });\n\n this.intersectionObserver = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if(!entry.isIntersecting) {\n return;\n }\n\n this.loadNearestToTarget(entry.target);\n });\n });\n\n /* this.listenerSetter.add(rootScope)('avatar_update', (peerId) => {\n if(this.peerId === peerId) {\n const photo = appPeersManager.getPeerPhoto(peerId);\n if(photo) {\n const id = photo.photo_id;\n const previous = this.listLoader.previous;\n for(let i = 0; i < previous.length; ++i) {\n if(previous[i] === id)\n }\n this.listLoader.previous.forEach((_id, idx, arr) => {});\n }\n }\n }); */\n }\n\n public async setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n const photo = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(!photo) {\n return;\n }\n\n const listLoader: PeerProfileAvatars['listLoader'] = this.listLoader = new ListLoader({\n loadCount: 50,\n loadMore: (anchor, older, loadCount) => {\n if(!older) return Promise.resolve({count: undefined, items: []});\n\n if(peerId.isUser()) {\n const maxId: Photo.photo['id'] = anchor as any;\n return this.managers.appPhotosManager.getUserPhotos(peerId, maxId, loadCount).then((value) => {\n return {\n count: value.count,\n items: value.photos\n };\n });\n } else {\n const promises: [Promise | ChatFull, ReturnType] = [] as any;\n if(!listLoader.current) {\n promises.push(this.managers.appProfileManager.getChatFull(peerId.toChatId()));\n }\n\n promises.push(this.managers.appMessagesManager.getSearch({\n peerId,\n maxId: Number.MAX_SAFE_INTEGER,\n inputFilter: {\n _: 'inputMessagesFilterChatPhotos'\n },\n limit: loadCount,\n backLimit: 0\n }));\n\n return Promise.all(promises).then(async(result) => {\n const value = result.pop() as typeof result[1];\n\n filterChatPhotosMessages(value);\n\n if(!listLoader.current) {\n const chatFull = result[0];\n const message = findAndSplice(value.history, (message) => {\n return ((message as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo.id === chatFull.chat_photo.id;\n }) as Message.messageService;\n\n listLoader.current = message || await this.managers.appMessagesManager.generateFakeAvatarMessage(this.peerId, chatFull.chat_photo);\n }\n\n // console.log('avatars loaded:', value);\n return {\n count: value.count,\n items: value.history\n };\n });\n }\n },\n processItem: this.processItem,\n onJump: (item, older) => {\n const id = this.listLoader.index;\n // const nextId = Math.max(0, id);\n const x = 100 * PeerProfileAvatars.SCALE * id;\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', `-${x}%`);\n\n const activeTab = this.tabs.querySelector('.active');\n if(activeTab) activeTab.classList.remove('active');\n\n const tab = this.tabs.children[id] as HTMLElement;\n tab.classList.add('active');\n\n this.loadNearestToTarget(this.avatars.children[id]);\n }\n });\n\n if(photo._ === 'userProfilePhoto') {\n listLoader.current = photo.photo_id;\n }\n\n await this.processItem(listLoader.current);\n\n // listLoader.loaded\n listLoader.load(true);\n }\n\n public addTab() {\n const tab = document.createElement('div');\n tab.classList.add(PeerProfileAvatars.BASE_CLASS + '-tab');\n this.tabs.append(tab);\n\n if(this.tabs.childElementCount === 1) {\n tab.classList.add('active');\n }\n\n this.container.classList.toggle('is-single', this.tabs.childElementCount <= 1);\n }\n\n public processItem = async(photoId: Photo.photo['id'] | Message.messageService) => {\n const avatar = document.createElement('div');\n avatar.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatar', 'media-container', 'hide');\n\n this.avatars.append(avatar);\n\n let photo: Photo.photo;\n if(photoId) {\n photo = typeof(photoId) !== 'object' ?\n await this.managers.appPhotosManager.getPhoto(photoId) :\n (photoId.action as MessageAction.messageActionChannelEditPhoto).photo as Photo.photo;\n }\n\n const img = new Image();\n img.classList.add('avatar-photo');\n img.draggable = false;\n\n const loadCallback = async() => {\n if(photo) {\n const res = await wrapPhoto({\n container: avatar,\n photo,\n size: choosePhotoSize(photo, 420, 420, false),\n withoutPreloader: true\n });\n\n [res.images.thumb, res.images.full].filter(Boolean).forEach((img) => {\n img.classList.add('avatar-photo');\n });\n } else {\n const photo = await this.managers.appPeersManager.getPeerPhoto(this.peerId);\n await putAvatar(avatar, this.peerId, photo, 'photo_big', img);\n }\n\n avatar.classList.remove('hide');\n };\n\n if(this.avatars.childElementCount <= LOAD_NEAREST) {\n await loadCallback();\n } else {\n this.intersectionObserver.observe(avatar);\n this.loadCallbacks.set(avatar, loadCallback);\n }\n\n this.addTab();\n\n return photoId;\n };\n\n private loadNearestToTarget(target: Element) {\n const children = Array.from(target.parentElement.children);\n const idx = children.indexOf(target);\n const slice = children.slice(Math.max(0, idx - LOAD_NEAREST), Math.min(children.length, idx + LOAD_NEAREST));\n\n slice.forEach((target) => {\n const callback = this.loadCallbacks.get(target);\n if(callback) {\n callback();\n this.loadCallbacks.delete(target);\n this.intersectionObserver.unobserve(target);\n }\n });\n }\n\n public cleanup() {\n this.listenerSetter.removeAll();\n this.swipeHandler.removeListeners();\n this.intersectionObserver?.disconnect();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_PARALLAX_SUPPORTED from '../environment/parallaxSupport';\nimport deferredPromise from '../helpers/cancellablePromise';\nimport {copyTextToClipboard} from '../helpers/clipboard';\nimport anchorCopy from '../helpers/dom/anchorCopy';\nimport {simulateClickEvent} from '../helpers/dom/clickEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport makeError from '../helpers/makeError';\nimport {makeMediaSize} from '../helpers/mediaSize';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\nimport middlewarePromise from '../helpers/middlewarePromise';\nimport {Chat, ChatFull, User, UserFull} from '../layer';\nimport appImManager from '../lib/appManagers/appImManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getServerMessageId from '../lib/appManagers/utils/messageId/getServerMessageId';\nimport getPeerActiveUsernames from '../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport I18n, {i18n, join} from '../lib/langPack';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../lib/rootScope';\nimport AvatarElement from './avatar';\nimport CheckboxField from './checkboxField';\nimport {generateDelimiter} from './generateDelimiter';\nimport PeerProfileAvatars from './peerProfileAvatars';\nimport Row from './row';\nimport Scrollable from './scrollable';\nimport SettingSection from './settingSection';\nimport {toast} from './toast';\nimport formatUserPhone from './wrappers/formatUserPhone';\nimport wrapPeerTitle from './wrappers/peerTitle';\nimport wrapTopicNameButton from './wrappers/topicNameButton';\n\nconst setText = (text: Parameters[1], row: Row) => {\n // fastRaf(() => {\n setInnerHTML(row.title, text || '');\n row.container.style.display = text ? '' : 'none';\n // });\n};\n\nexport default class PeerProfile {\n public element: HTMLElement;\n private avatars: PeerProfileAvatars;\n private avatar: AvatarElement;\n private section: SettingSection;\n private name: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private bio: Row;\n private username: Row;\n private phone: Row;\n private notifications: Row;\n private location: Row;\n private link: Row;\n\n private cleaned: boolean;\n private setMoreDetailsTimeout: number;\n private setPeerStatusInterval: number;\n\n private peerId: PeerId;\n private threadId: number;\n\n private middlewareHelper: MiddlewareHelper;\n\n constructor(\n private managers: AppManagers,\n public scrollable: Scrollable,\n private listenerSetter?: ListenerSetter,\n private isDialog = true\n ) {\n if(!IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('no-parallax');\n }\n\n if(!listenerSetter) {\n this.listenerSetter = new ListenerSetter();\n }\n\n this.middlewareHelper = getMiddleware();\n }\n\n public init() {\n this.init = null;\n\n\n this.element = document.createElement('div');\n this.element.classList.add('profile-content');\n\n this.section = new SettingSection({\n noDelimiter: true\n });\n\n this.name = document.createElement('div');\n this.name.classList.add('profile-name');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('profile-subtitle');\n\n this.bio = new Row({\n title: ' ',\n subtitle: true,\n icon: 'info',\n clickable: (e) => {\n if((e.target as HTMLElement).tagName === 'A') {\n return;\n }\n\n copyTextToClipboard(this.bio.title.textContent);\n toast(I18n.format('BioCopied', true));\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_About',\n onClick: () => {\n simulateClickEvent(this.bio.container);\n },\n verify: () => !this.peerId.isUser()\n }, {\n icon: 'copy',\n text: 'Text.CopyLabel_Bio',\n onClick: () => {\n simulateClickEvent(this.bio.container);\n },\n verify: () => this.peerId.isUser()\n }]\n }\n });\n\n this.bio.title.classList.add('pre-wrap');\n\n this.username = new Row({\n title: ' ',\n subtitleLangKey: 'Username',\n icon: 'username',\n clickable: () => {\n // const username = await this.managers.appPeersManager.getPeerUsername(this.peerId);\n copyTextToClipboard('@' + this.username.title.textContent);\n toast(I18n.format('UsernameCopied', true));\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_Username',\n onClick: () => {\n simulateClickEvent(this.username.container);\n }\n }]\n }\n });\n\n this.phone = new Row({\n title: ' ',\n subtitle: true,\n icon: 'phone',\n clickable: () => {\n copyTextToClipboard(this.phone.title.textContent.replace(/\\s/g, ''));\n toast(I18n.format('PhoneCopied', true));\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_PhoneNumber',\n onClick: () => {\n simulateClickEvent(this.phone.container);\n }\n }, {\n icon: 'info',\n text: 'PeerInfo.Phone.AnonymousInfo',\n textArgs: [(() => {\n const a = document.createElement('a');\n return a;\n })()],\n onClick: () => {\n window.open('https://fragment.com/numbers', '_blank');\n },\n separator: true,\n multiline: true,\n verify: async() => {\n const {isAnonymous} = await this.managers.appUsersManager.getUserPhone(this.peerId.toUserId()) || {};\n return isAnonymous;\n }\n }]\n }\n });\n\n this.link = new Row({\n title: ' ',\n subtitleLangKey: 'SetUrlPlaceholder',\n icon: 'link',\n clickable: () => {\n const url = this.link.title.textContent;\n copyTextToClipboard(url);\n // Promise.resolve(appProfileManager.getChatFull(this.peerId.toChatId())).then((chatFull) => {\n // copyTextToClipboard(chatFull.exported_invite.link);\n const isPrivate = url.includes('/c/');\n toast(I18n.format(isPrivate ? 'LinkCopiedPrivateInfo' : 'LinkCopied', true));\n // });\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_ShareLink',\n onClick: () => {\n simulateClickEvent(this.link.container);\n }\n }]\n }\n });\n\n this.location = new Row({\n title: ' ',\n subtitleLangKey: 'ChatLocation',\n icon: 'location'\n });\n\n this.section.content.append(\n this.phone.container,\n this.username.container,\n this.location.container,\n this.bio.container,\n this.link.container\n );\n\n const {listenerSetter} = this;\n if(this.isDialog) {\n this.notifications = new Row({\n checkboxField: new CheckboxField({toggle: true}),\n titleLangKey: 'Notifications',\n icon: 'unmute',\n listenerSetter: this.listenerSetter\n });\n\n listenerSetter.add(this.notifications.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n // let checked = this.notificationsCheckbox.checked;\n this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, threadId: this.threadId});\n });\n\n listenerSetter.add(rootScope)('dialog_notify_settings', async(dialog) => {\n if(this.peerId === dialog.peerId) {\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.threadId});\n this.notifications.checkboxField.checked = !muted;\n }\n });\n\n this.section.content.append(this.notifications.container);\n }\n\n this.element.append(this.section.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.element.append(generateDelimiter());\n }\n\n listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('peer_bio_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.setMoreDetails(true);\n }\n });\n\n const n = async({peerId, threadId}: {peerId: PeerId, threadId?: number}) => {\n if(this.peerId !== peerId) {\n return false;\n }\n\n const isForum = await this.managers.appPeersManager.isForum(this.peerId);\n if(isForum && this.threadId ? this.threadId === threadId : true) {\n return true;\n }\n\n return false;\n };\n\n listenerSetter.add(rootScope)('peer_title_edit', async(data) => {\n if(await n(data)) {\n this.fillUsername();\n this.setMoreDetails(true);\n }\n });\n\n listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('contacts_update', async(userId) => {\n if(this.peerId === userId.toPeerId()) {\n const user = await this.managers.appUsersManager.getUser(userId);\n if(!user.pFlags.self || !this.isDialog) {\n this.fillUserPhone();\n }\n }\n });\n\n listenerSetter.add(rootScope)('avatar_update', async(data) => {\n if(await n(data)) {\n this.setAvatar();\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(() => this.setPeerStatus(), 60e3);\n }\n\n private async setPeerStatus(\n needClear = false,\n manual?: T\n ): Promise void : void> {\n const peerId = this.peerId;\n\n const callbacks: Array<() => void> = [];\n callbacks.push(() => {\n this.element.classList.toggle('is-me', peerId === rootScope.myId);\n });\n\n let promise: Promise<(() => void) | void> = Promise.resolve();\n if(!(!peerId || (rootScope.myId === peerId && this.isDialog))) {\n const isForum = await this.managers.appPeersManager.isForum(this.peerId);\n const middleware = this.middlewareHelper.get();\n if(isForum && this.threadId) {\n promise = wrapTopicNameButton({\n peerId,\n wrapOptions: {\n middleware\n }\n }).then(({element}) => {\n this.subtitle.replaceChildren(element);\n });\n } else {\n promise = appImManager.setPeerStatus({\n peerId,\n element: this.subtitle,\n needClear,\n useWhitespace: true,\n middleware,\n ignoreSelf: !this.isDialog\n });\n }\n\n promise.then((callback) => callback && callbacks.push(callback));\n }\n\n const callback = () => callbacks.forEach((callback) => callback());\n\n return promise.then(() => {\n if(manual) {\n return callback;\n }\n\n callback();\n }) as any;\n }\n\n public cleanupHTML() {\n [\n this.bio,\n this.phone,\n this.username,\n this.location,\n this.link\n ].forEach((row) => {\n row.container.style.display = 'none';\n });\n\n if(this.notifications) {\n this.notifications.container.style.display = '';\n this.notifications.checkboxField.checked = true;\n }\n\n this.clearSetMoreDetailsTimeout();\n }\n\n private canBeDetailed() {\n return this.peerId !== rootScope.myId || !this.isDialog;\n }\n\n private createAvatar() {\n const avatar = new AvatarElement();\n avatar.classList.add('profile-avatar', 'avatar-120');\n avatar.isDialog = this.isDialog;\n avatar.attachClickEvent();\n return avatar;\n }\n\n private async _setAvatar() {\n const {peerId} = this;\n const isTopic = !!(this.threadId && await this.managers.appPeersManager.isForum(peerId));\n if(this.canBeDetailed() && !isTopic) {\n const photo = await this.managers.appPeersManager.getPeerPhoto(peerId);\n\n if(photo) {\n const oldAvatars = this.avatars;\n this.avatars = new PeerProfileAvatars(this.scrollable, this.managers);\n await this.avatars.setPeer(peerId);\n\n return () => {\n this.avatars.info.append(this.name, this.subtitle);\n\n this.avatar?.remove();\n this.avatar = undefined;\n\n if(oldAvatars) oldAvatars.container.replaceWith(this.avatars.container);\n else this.element.prepend(this.avatars.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('parallax');\n }\n };\n }\n }\n\n const avatar = this.createAvatar();\n await avatar.updateWithOptions({\n peerId,\n threadId: isTopic ? this.threadId : undefined,\n wrapOptions: {\n customEmojiSize: makeMediaSize(120, 120),\n middleware: this.middlewareHelper.get()\n }\n });\n\n return () => {\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.remove('parallax');\n }\n\n if(this.avatars) {\n this.avatars.container.remove();\n this.avatars.cleanup();\n this.avatars = undefined;\n }\n\n this.avatar?.remove();\n this.avatar = avatar;\n\n this.section.content.prepend(this.avatar, this.name, this.subtitle);\n };\n }\n\n private setAvatar(manual?: T): T extends true ? Promise<() => void> : Promise {\n const promise = this._setAvatar();\n return manual ? promise : promise.then((callback) => callback()) as any;\n }\n\n private getUsernamesAlso(usernames: string[]) {\n const also = usernames.slice(1);\n if(also.length) {\n const a = also.map((username) => anchorCopy({username}));\n const i = i18n('UsernameAlso', [join(a, false)]);\n return i;\n }\n }\n\n private async fillUsername() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const usernames = await this.managers.appPeersManager.getPeerActiveUsernames(peerId);\n const also = this.getUsernamesAlso(usernames);\n\n return () => {\n this.username.subtitle.replaceChildren(also || i18n('Username'));\n setText(usernames[0], this.username);\n };\n }\n }\n\n private async fillUserPhone() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const {phone, isAnonymous} = await this.managers.appUsersManager.getUserPhone(peerId.toUserId()) || {};\n\n return () => {\n this.phone.subtitle.replaceChildren(i18n(isAnonymous ? 'AnonymousNumber' : 'Phone'));\n setText(phone ? formatUserPhone(phone) : undefined, this.phone);\n };\n }\n }\n\n private async fillNotifications() {\n const notificationsRow = this.notifications;\n if(!notificationsRow) {\n return;\n }\n\n if(this.canBeDetailed()) {\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.threadId});\n return () => {\n notificationsRow.checkboxField.checked = !muted;\n };\n } else {\n return () => {\n // fastRaf(() => {\n notificationsRow.container.style.display = 'none';\n // });\n };\n }\n }\n\n private async fillName() {\n const {peerId} = this;\n const [element/* , icons */] = await Promise.all([\n wrapPeerTitle({\n peerId,\n dialog: this.isDialog,\n withIcons: !this.threadId,\n threadId: this.threadId\n })\n\n // generateTitleIcons(peerId)\n ]);\n\n return () => {\n replaceContent(this.name, element);\n // this.name.append(...icons);\n };\n }\n\n private async fillRows(manual: Promise) {\n return Promise.all([\n this.fillName(),\n this.fillUsername(),\n this.fillUserPhone(),\n this.fillNotifications(),\n this.setMoreDetails(undefined, manual),\n this.setPeerStatus(true, true)\n ]).then((callbacks) => {\n return () => {\n callbacks.forEach((callback) => callback?.());\n };\n });\n }\n\n public async fillProfileElements() {\n if(!this.cleaned) return;\n this.cleaned = false;\n\n this.cleanupHTML();\n const deferred = deferredPromise();\n const middleware = this.middlewareHelper.get();\n middleware.onClean(() => {\n deferred.reject();\n });\n\n const callbacks = await Promise.all([\n this.setAvatar(true),\n this.fillRows(deferred)\n ]);\n\n return () => {\n deferred.resolve();\n callbacks.forEach((callback) => callback?.());\n };\n }\n\n private async _setMoreDetails(peerId: PeerId, peerFull?: ChatFull | UserFull) {\n const m = this.getMiddlewarePromise();\n const isTopic = !!(this.threadId && await m(this.managers.appPeersManager.isForum(peerId)));\n if(isTopic) {\n let url = 'https://t.me/';\n const threadId = getServerMessageId(this.threadId);\n const username = await m(this.managers.appPeersManager.getPeerUsername(peerId));\n if(username) {\n url += `${username}/${threadId}`;\n } else {\n url += `c/${peerId.toChatId()}/${threadId}`;\n }\n\n return () => {\n setText(url, this.link);\n };\n }\n\n const callbacks: (() => void)[] = [];\n // if(peerFull.about) {\n callbacks.push(() => {\n this.bio.subtitle.replaceChildren(i18n(peerId.isUser() ? 'UserBio' : 'Info'));\n setText(peerFull.about ? wrapRichText(peerFull.about) : undefined, this.bio);\n });\n // }\n\n if(!peerId.isUser()) {\n const chat = await m(this.managers.appChatsManager.getChat(peerId.toChatId())) as Chat.channel;\n const usernames = getPeerActiveUsernames(chat);\n let also: HTMLElement;\n if(usernames.length) {\n also = this.getUsernamesAlso(usernames);\n callbacks.push(() => setText('https://t.me/' + usernames[0], this.link));\n } else {\n const exportedInvite = (peerFull as ChatFull.channelFull).exported_invite;\n if(exportedInvite?._ === 'chatInviteExported') {\n callbacks.push(() => setText(exportedInvite.link, this.link));\n }\n }\n\n callbacks.push(() => this.link.subtitle.replaceChildren(also || i18n('SetUrlPlaceholder')));\n }\n\n const location = (peerFull as ChatFull.channelFull).location;\n if(location?._ == 'channelLocation') {\n callbacks.push(() => setText(location.address, this.location));\n }\n\n this.setMoreDetailsTimeout = window.setTimeout(() => this.setMoreDetails(true), 60e3);\n\n return () => {\n callbacks.forEach((callback) => callback());\n };\n }\n\n private async setMoreDetails(override?: true, manual?: Promise) {\n this.clearSetMoreDetailsTimeout();\n\n const {peerId} = this;\n const m = this.getMiddlewarePromise();\n\n if(!peerId || !this.canBeDetailed() || await m(this.managers.appPeersManager.isPeerRestricted(peerId))) {\n return;\n }\n\n const result = await m(this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId, override));\n const setPromise = m(result.result).then(async(peerFull) => {\n if(await m(this.managers.appPeersManager.isPeerRestricted(peerId))) {\n // this.log.warn('peer changed');\n return;\n }\n\n return await m(this._setMoreDetails(peerId, peerFull));\n });\n\n if(result.cached && manual) {\n return setPromise;\n } else {\n (manual || Promise.resolve())\n .then(() => setPromise)\n .then((callback) => {\n callback?.();\n });\n }\n }\n\n private getMiddlewarePromise() {\n return middlewarePromise(this.middlewareHelper.get(), makeError('MIDDLEWARE'));\n }\n\n public setPeer(peerId: PeerId, threadId?: number) {\n if(this.peerId === peerId && this.threadId === threadId) return;\n\n this.init?.();\n\n this.peerId = peerId;\n this.threadId = threadId;\n\n this.middlewareHelper.clean();\n this.cleaned = true;\n }\n\n public clearSetMoreDetailsTimeout() {\n if(this.setMoreDetailsTimeout !== undefined) {\n clearTimeout(this.setMoreDetailsTimeout);\n this.setMoreDetailsTimeout = undefined;\n }\n }\n\n public destroy() {\n this.peerId = this.threadId = undefined;\n this.clearSetMoreDetailsTimeout();\n clearInterval(this.setPeerStatusInterval);\n this.avatars?.cleanup();\n this.middlewareHelper.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport mediaSizes from '../helpers/mediaSizes';\nimport {Middleware} from '../helpers/middleware';\nimport {Chat, Document, EmojiStatus, User} from '../layer';\nimport rootScope from '../lib/rootScope';\nimport generateFakeIcon from './generateFakeIcon';\nimport generatePremiumIcon from './generatePremiumIcon';\nimport generateVerifiedIcon from './generateVerifiedIcon';\nimport wrapSticker from './wrappers/sticker';\n\nexport default async function generateTitleIcons(\n peerId: PeerId,\n middleware?: Middleware,\n noVerifiedIcon?: boolean,\n noFakeIcon?: boolean,\n noPremiumIcon?: boolean\n) {\n const elements: HTMLElement[] = [];\n const peer: Chat | User = await rootScope.managers.appPeersManager.getPeer(peerId);\n if((peer as Chat.channel).pFlags.verified && !noVerifiedIcon) {\n elements.push(generateVerifiedIcon());\n }\n\n if(((peer as Chat.channel).pFlags.fake || (peer as User.user).pFlags.scam) && !noFakeIcon) {\n elements.push(generateFakeIcon((peer as User.user).pFlags.scam));\n }\n\n if((peer as User.user).pFlags.premium && !noPremiumIcon) {\n const emojiStatus = (peer as User.user).emoji_status;\n if(emojiStatus && emojiStatus._ !== 'emojiStatusEmpty' && false) {\n const container = document.createElement('span');\n container.classList.add('emoji-status');\n const result = await rootScope.managers.acknowledged.appEmojiManager.getCustomEmojiDocument((emojiStatus as EmojiStatus.emojiStatus).document_id);\n const wrap = async(doc: Document.document) => {\n const size = mediaSizes.active.emojiStatus\n const loadPromises: Promise[] = [];\n await wrapSticker({\n doc,\n div: container,\n width: size.width,\n height: size.height,\n loop: 2,\n play: true,\n group: 'EMOJI-STATUS',\n loadPromises,\n middleware\n // group: 'none'\n });\n\n await Promise.all(loadPromises);\n };\n\n const p = result.result.then(wrap);\n if(result.cached) {\n await p;\n }\n\n elements.push(container);\n } else {\n elements.push(generatePremiumIcon());\n }\n }\n\n return elements;\n}\n","export default function generateVerifiedIcon() {\n const span = document.createElement('span');\n span.classList.add('verified-icon', 'tgico');\n\n const size = 26; // 24\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', `0 0 ${size} ${size}`);\n svg.setAttributeNS(null, 'width', `${size}`);\n svg.setAttributeNS(null, 'height', `${size}`);\n svg.classList.add('verified-icon-svg');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#verified-icon-background');\n use.classList.add('verified-icon-background');\n\n const use2 = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use2.setAttributeNS(null, 'href', '#verified-icon-check');\n use2.classList.add('verified-icon-check');\n\n // svg.append(use, use2);\n svg.append(use2, use);\n\n span.append(svg);\n\n return span;\n // const span = document.createElement('span');\n // span.classList.add('verified-icon', 'tgico-verified_filled');\n // return span;\n}\n","export default function generatePremiumIcon() {\n const span = document.createElement('span');\n span.classList.add('premium-icon', 'tgico-star');\n return span;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\nimport {i18n} from '../lib/langPack';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport limitSymbols from '../helpers/string/limitSymbols';\nimport setInnerHTML, {setDirection} from '../helpers/dom/setInnerHTML';\nimport safeAssign from '../helpers/object/safeAssign';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport getPeerTitle from './wrappers/getPeerTitle';\nimport generateTitleIcons from './generateTitleIcons';\nimport {wrapTopicIcon} from './wrappers/messageActionTextNewUnsafe';\n\nexport type PeerTitleOptions = {\n peerId?: PeerId,\n fromName?: string,\n plainText?: boolean,\n onlyFirstName?: boolean,\n dialog?: boolean,\n limitSymbols?: number,\n withIcons?: boolean,\n withPremiumIcon?: boolean,\n threadId?: number,\n wrapOptions?: WrapSomethingOptions\n};\n\nconst weakMap: WeakMap = new WeakMap();\n\nrootScope.addEventListener('peer_title_edit', ({peerId, threadId}) => {\n let query = `.peer-title[data-peer-id=\"${peerId}\"]`;\n if(threadId) {\n query += `[data-thread-id=\"${threadId}\"]`;\n }\n\n const elements = Array.from(document.querySelectorAll(query)) as HTMLElement[];\n elements.forEach((element) => {\n const peerTitle = weakMap.get(element);\n peerTitle?.update();\n });\n});\n\nexport default class PeerTitle {\n public element: HTMLElement;\n public options: PeerTitleOptions;\n private hasInner: boolean;\n\n constructor(options?: PeerTitleOptions) {\n this.element = document.createElement('span');\n this.element.classList.add('peer-title');\n setDirection(this.element);\n\n this.options = {};\n\n if(options) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n public setOptions(options?: PeerTitleOptions) {\n if(!options) {\n return;\n }\n\n safeAssign(this.options, options);\n for(const i in options) {\n // @ts-ignore\n const value = options[i];\n\n if(typeof(value) !== 'object' && typeof(value) !== 'function') {\n // @ts-ignore\n this.element.dataset[i] = value ? '' + (typeof(value) === 'boolean' ? +value : value) : '0';\n }\n }\n }\n\n private setHasInner(hasInner: boolean) {\n if(this.hasInner !== hasInner) {\n this.hasInner = hasInner;\n this.element.classList.toggle('with-icons', hasInner);\n }\n }\n\n public async update(options?: PeerTitleOptions) {\n this.setOptions(options);\n\n let fromName = this.options.fromName;\n if(fromName !== undefined) {\n if(this.options.limitSymbols !== undefined) {\n fromName = limitSymbols(fromName, this.options.limitSymbols, this.options.limitSymbols);\n }\n\n setInnerHTML(this.element, wrapEmojiText(fromName));\n return;\n }\n\n this.options.peerId ??= NULL_PEER_ID;\n\n let hasInner: boolean;\n const {peerId, threadId} = this.options;\n if(peerId !== rootScope.myId || !this.options.dialog) {\n if(threadId) {\n const [topic, isForum] = await Promise.all([\n rootScope.managers.dialogsStorage.getForumTopic(peerId, threadId),\n rootScope.managers.appPeersManager.isForum(peerId)\n ]);\n\n if(!topic && isForum) {\n rootScope.managers.dialogsStorage.getForumTopicById(peerId, threadId).then((forumTopic) => {\n if(!forumTopic && this.options.threadId === threadId) {\n this.options.threadId = undefined;\n this.update({threadId: undefined});\n return;\n }\n\n this.update();\n }, () => {\n if(this.options.threadId === threadId) {\n this.options.threadId = undefined;\n this.update({threadId: undefined});\n }\n });\n\n setInnerHTML(this.element, i18n('Loading'));\n this.setHasInner(false);\n return;\n }\n }\n\n const getTopicIconPromise = threadId && this.options.withIcons ?\n rootScope.managers.dialogsStorage.getForumTopic(peerId, threadId).then((topic) => wrapTopicIcon({...(this.options.wrapOptions ?? {}), topic})) :\n undefined;\n\n const [title, icons, topicIcon] = await Promise.all([\n getPeerTitle(this.options as Required),\n (this.options.withIcons && generateTitleIcons(peerId, this.options.wrapOptions?.middleware)) || (this.options.withPremiumIcon && generateTitleIcons(peerId, this.options.wrapOptions?.middleware, true, true)),\n getTopicIconPromise\n ]);\n\n if(icons?.length || topicIcon) {\n const inner = document.createElement('span');\n inner.classList.add('peer-title-inner');\n hasInner = true;\n setInnerHTML(inner, title);\n\n const fragment = document.createDocumentFragment();\n fragment.append(...[topicIcon, inner, ...(icons ?? [])].filter(Boolean));\n setInnerHTML(this.element, fragment);\n } else {\n setInnerHTML(this.element, title);\n }\n } else {\n replaceContent(this.element, i18n(this.options.onlyFirstName ? 'Saved' : 'SavedMessages'));\n }\n\n this.setHasInner(hasInner);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppDownloadManager} from '../../lib/appManagers/appDownloadManager';\nimport resizeableImage from '../../lib/cropper';\nimport PopupElement from '.';\nimport {_i18n} from '../../lib/langPack';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport readBlobAsDataURL from '../../helpers/blob/readBlobAsDataURL';\nimport rootScope from '../../lib/rootScope';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\n\nexport default class PopupAvatar extends PopupElement {\n private cropContainer: HTMLElement;\n private input: HTMLInputElement;\n private h6: HTMLElement;\n\n private image = new Image();\n\n private canvas: HTMLCanvasElement;\n private blob: Blob;\n private cropper = {\n crop: () => {},\n removeHandlers: () => {}\n };\n\n private onCrop: (upload: () => ReturnType) => void;\n\n constructor(options: Partial<{\n isForum: boolean\n }> = {}) {\n super('popup-avatar', {closable: true, withConfirm: true});\n\n this.h6 = document.createElement('h6');\n _i18n(this.h6, 'Popup.Avatar.Title');\n\n this.btnClose.classList.remove('btn-icon');\n\n this.header.append(this.h6);\n\n this.cropContainer = document.createElement('div');\n this.cropContainer.classList.add('crop');\n this.cropContainer.append(this.image);\n\n if(options.isForum) {\n this.cropContainer.classList.add('is-forum');\n }\n\n this.input = document.createElement('input');\n this.input.type = 'file';\n this.input.style.display = 'none';\n this.listenerSetter.add(this.input)('change', (e: any) => {\n const file = e.target.files[0];\n if(!file) {\n return;\n }\n\n readBlobAsDataURL(file).then((contents) => {\n this.image = new Image();\n this.cropContainer.append(this.image);\n this.image.src = contents;\n\n this.image.onload = () => {\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\n cropContainer.style.width = w + 'px';\n cropContainer.style.height = h + 'px'; */\n this.show();\n\n this.cropper = resizeableImage(this.image, this.canvas);\n this.input.value = '';\n };\n });\n }, false);\n\n this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\n attachClickEvent(this.btnConfirm, () => {\n this.cropper.crop();\n this.hide();\n\n this.canvas.toBlob((blob) => {\n this.blob = blob; // save blob to send after reg\n this.darkenCanvas();\n this.resolve();\n }, 'image/jpeg', 1);\n }, {listenerSetter: this.listenerSetter});\n\n this.container.append(this.cropContainer, this.btnConfirm, this.input);\n\n this.addEventListener('closeAfterTimeout', () => {\n this.cropper.removeHandlers();\n if(this.image) {\n this.image.remove();\n }\n });\n }\n\n private resolve() {\n this.onCrop(() => {\n return appDownloadManager.upload(this.blob);\n });\n }\n\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\n this.canvas = postCanvas;\n this.onCrop = onCrop;\n\n this.input.click();\n }\n\n public darkenCanvas() {\n const ctx = this.canvas.getContext('2d');\n ctx.fillStyle = 'rgba(0, 0, 0, 0.3)';\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\n let cropComponent: HTMLDivElement,\n container: HTMLDivElement,\n cropImage: HTMLImageElement,\n event_state: Partial<{\n mouse_x: number,\n mouse_y: number,\n container_width: number,\n container_height: number,\n container_left: number,\n container_top: number\n }> = {},\n keyZoomValue = 4.0,\n MINWIDTH = 50,\n MINHEIGHT = 50,\n CROPWIDTH = 200,\n CROPHEIGHT = 200,\n cropLeft = 0,\n cropTop = 0,\n cropWidth = 0,\n cropHeight = 0,\n scaledRatio = 0;\n\n if(originalImage.complete) init();\n else originalImage.onload = init;\n\n function removeHandlers() {\n container.removeEventListener('mousedown', startMoving);\n container.removeEventListener('touchstart', startMoving);\n container.removeEventListener('wheel', resizing);\n\n document.removeEventListener('mouseup', endMoving);\n document.removeEventListener('touchend', endMoving);\n document.removeEventListener('mousemove', moving);\n document.removeEventListener('touchmove', moving);\n document.removeEventListener('keypress', keyHandler);\n\n cropComponent.remove();\n container.remove();\n cropImage.remove();\n }\n\n function addHandlers() {\n container.addEventListener('mousedown', startMoving, false);\n container.addEventListener('touchstart', startMoving, false);\n container.addEventListener('wheel', resizing, false);\n\n document.addEventListener('keypress', keyHandler, false);\n // document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\n }\n\n function init() {\n originalImage.classList.add('crop-blur');\n originalImage.draggable = false;\n\n cropImage = new Image();\n cropImage.src = originalImage.src;\n cropImage.draggable = false;\n cropImage.classList.add('crop-overlay-image');\n\n if(!canvas) {\n canvas = document.createElement('canvas');\n }\n\n cropComponent = document.createElement('div');\n cropComponent.classList.add('crop-component');\n\n container = document.createElement('div');\n container.classList.add('crop-overlay');\n\n const overlayColor = document.createElement('div');\n overlayColor.classList.add('crop-overlay-color');\n\n cropComponent.appendChild(container);\n const wrapper = originalImage.parentNode as HTMLElement;\n wrapper.appendChild(cropComponent);\n cropComponent.appendChild(cropImage);\n cropComponent.appendChild(originalImage);\n cropComponent.appendChild(overlayColor);\n container.appendChild(cropImage);\n\n cropImage.style.maxWidth = originalImage.width + 'px';\n\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\n\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\n\n updateCropSize(CROPWIDTH, CROPHEIGHT);\n updateCropImage(left, top);\n updateContainer(left, top);\n addHandlers();\n // crop();\n }\n\n function updateCropSize(width: number, height: number) {\n cropWidth = width * scaledRatio;\n cropHeight = height * scaledRatio;\n\n container.style.width = width + 'px';\n container.style.height = height + 'px';\n }\n\n function updateCropImage(left: number, top: number) {\n cropTop = top * scaledRatio;\n cropLeft = left * scaledRatio;\n\n cropImage.style.top = -top + 'px';\n cropImage.style.left = -left + 'px';\n }\n\n function updateContainer(left: number, top: number) {\n container.style.top = top + 'px';\n container.style.left = left + 'px';\n }\n\n // Save the initial event details and container state\n function saveEventState(e: any) {\n event_state.container_width = container.offsetWidth;\n event_state.container_height = container.offsetHeight;\n\n event_state.container_left = container.offsetLeft;\n event_state.container_top = container.offsetTop;\n\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\n }\n\n function imgZoom(zoom: number) {\n zoom = zoom * Math.PI * 2\n let newWidth = Math.floor(container.clientWidth + zoom),\n newHeight = Math.floor(container.clientHeight + zoom),\n w = cropImage.clientWidth,\n h = cropImage.clientHeight,\n left: number,\n top: number,\n right: number,\n bottom: number;\n\n if(newWidth < MINWIDTH) {\n return;\n } else if(newWidth > w) {\n return;\n }\n\n left = container.offsetLeft - (zoom / 2);\n top = container.offsetTop - (zoom / 2);\n right = left + newWidth;\n bottom = top + newHeight;\n\n if(left < 0) left = 0;\n if(top < 0) top = 0;\n\n if(right > w) return;\n if(bottom > h) return;\n\n updateCropSize(newWidth, newWidth);\n updateCropImage(left, top);\n updateContainer(left, top);\n // crop();\n }\n\n function keyHandler(e: KeyboardEvent) {\n e.preventDefault();\n\n switch(String.fromCharCode(e.charCode)) {\n case '+':\n imgZoom(keyZoomValue);\n break;\n case '-':\n imgZoom(-keyZoomValue);\n break;\n }\n }\n\n function resizing(e: any) {\n e.preventDefault();\n imgZoom(e.deltaY > 0 ? 1 : -1);\n }\n\n function startMoving(e: MouseEvent | TouchEvent) {\n e.preventDefault();\n e.stopPropagation();\n\n saveEventState(e);\n\n document.addEventListener('mousemove', moving);\n document.addEventListener('touchmove', moving);\n document.addEventListener('mouseup', endMoving);\n document.addEventListener('touchend', endMoving);\n }\n\n function endMoving(e: MouseEvent | TouchEvent) {\n e.preventDefault();\n\n document.removeEventListener('mouseup', endMoving);\n document.removeEventListener('touchend', endMoving);\n document.removeEventListener('mousemove', moving);\n document.removeEventListener('touchmove', moving);\n }\n\n function moving(e: any) {\n let currentTouch = {x: 0, y: 0},\n left: number,\n top: number,\n w: number,\n h: number;\n\n e.preventDefault();\n e.stopPropagation();\n\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\n\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\n w = container.offsetWidth;\n h = container.offsetHeight;\n\n if(left < 0) left = 0;\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\n\n if(top < 0) top = 0;\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\n\n updateCropImage(left, top);\n updateContainer(left, top);\n // crop();\n }\n\n function crop() {\n canvas.width = cropWidth;\n canvas.height = cropHeight;\n\n const ctx = canvas.getContext('2d');\n ctx.drawImage(originalImage,\n cropLeft, cropTop,\n cropWidth, cropHeight,\n 0, 0,\n cropWidth, cropHeight\n );\n }\n\n return {crop, removeHandlers};\n}\n\nexport default resizeableImage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport type {PeerType} from '../../lib/appManagers/appPeersManager';\nimport {FormatterArguments, LangPackKey} from '../../lib/langPack';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\n\nexport default class PopupDeleteDialog {\n constructor(\n private peerId: PeerId,\n // actionType: 'leave' | 'delete',\n private peerType?: PeerType,\n private onSelect?: (promise: Promise) => void,\n private threadId?: number\n ) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, peerType, onSelect, threadId} = this;\n const peerTitleElement = await wrapPeerTitle({peerId, threadId: threadId});\n\n const managers = PopupElement.MANAGERS;\n if(peerType === undefined) {\n peerType = await managers.appPeersManager.getDialogType(peerId);\n }\n\n /* const callbackFlush = (checked: PopupPeerButtonCallbackCheckboxes) => {\n const promise = appMessagesManager.flushHistory(peerId, checkboxes ? !checked[checkboxes[0].text] : undefined);\n onSelect && onSelect(promise);\n }; */\n\n const callbackLeave = (checked: PopupPeerButtonCallbackCheckboxes, flush = checkboxes && !!checked.size) => {\n let promise = managers.appChatsManager.leave(peerId.toChatId());\n\n if(flush) {\n promise = promise.then(() => {\n return managers.appMessagesManager.flushHistory(peerId);\n }) as any;\n }\n\n onSelect?.(promise);\n };\n\n const callbackDelete = (checked: PopupPeerButtonCallbackCheckboxes) => {\n let promise: Promise;\n\n if(threadId) {\n promise = managers.appMessagesManager.flushHistory(peerId, false, true, threadId);\n } else if(peerId.isUser()) {\n promise = managers.appMessagesManager.flushHistory(peerId, false, checkboxes ? !!checked.size : undefined);\n } else {\n if(checked.size) {\n promise = managers.appChatsManager.delete(peerId.toChatId());\n } else {\n return callbackLeave(checked);\n }\n }\n\n onSelect?.(promise);\n };\n\n let title: LangPackKey,\n titleArgs: FormatterArguments,\n description: LangPackKey,\n descriptionArgs: FormatterArguments,\n buttons: PopupPeerOptions['buttons'],\n checkboxes: PopupPeerOptions['checkboxes'];\n switch(peerType) {\n case 'channel': {\n if(/* actionType === 'delete' && */await managers.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n title = 'ChannelDeleteMenu';\n description = 'AreYouSureDeleteAndExitChannel';\n buttons = [{\n langKey: 'ChannelDeleteMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChannelForAll'\n }];\n } else {\n title = 'LeaveChannelMenu';\n description = 'ChannelLeaveAlertWithName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'LeaveChannel',\n isDanger: true,\n callback: callbackLeave\n }];\n }\n\n break;\n }\n\n /* case 'megagroup': {\n title = 'Leave Group?';\n description = `Are you sure you want to leave this group?`;\n buttons = [{\n text: 'LEAVE ' + peerTitleElement,\n isDanger: true,\n callback: callbackLeave\n }];\n\n break;\n } */\n\n case 'chat': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatWithUser';\n descriptionArgs = [peerTitleElement];\n\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteMessagesOptionAlso',\n textArgs: [\n await wrapPeerTitle({peerId})\n ]\n }];\n\n break;\n }\n\n case 'saved': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatSavedMessages';\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n break;\n }\n\n case 'megagroup':\n case 'group': {\n if(threadId) {\n title = 'DeleteTopics';\n titleArgs = [1];\n description = 'DeleteSelectedTopic';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'Delete',\n isDanger: true,\n callback: callbackDelete\n }];\n } else if(/* actionType === 'delete' && */await managers.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n title = 'DeleteMegaMenu';\n description = 'AreYouSureDeleteAndExit';\n buttons = [{\n langKey: 'DeleteMegaMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChat.DeleteGroupForAll'\n }];\n } else {\n title = 'LeaveMegaMenu';\n description = 'AreYouSureDeleteAndExitName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: (checkboxes) => callbackLeave(checkboxes, true)\n }];\n }\n\n break;\n }\n }\n\n new PopupPeer('popup-delete-chat', {\n peerId,\n threadId,\n titleLangKey: title,\n titleLangArgs: titleArgs,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n }).show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../lib/rootScope';\nimport PopupElement, {addCancelButton} from '.';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\nimport {ChatType} from '../chat/chat';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport hasRights from '../../lib/appManagers/utils/chats/hasRights';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport wrapPeerTitle from '../wrappers/peerTitle';\n\nexport default class PopupDeleteMessages {\n constructor(\n private peerId: PeerId,\n private mids: number[],\n private type: ChatType,\n private onConfirm?: () => void,\n private threadId?: number\n ) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, mids, type, onConfirm, threadId} = this;\n\n const peerTitleElement = await wrapPeerTitle({peerId, threadId});\n\n const managers = PopupElement.MANAGERS;\n\n mids = mids.slice();\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, revoke?: boolean) => {\n onConfirm && onConfirm();\n if(type === 'scheduled') {\n managers.appMessagesManager.deleteScheduledMessages(peerId, mids);\n } else {\n managers.appMessagesManager.deleteMessages(peerId, mids, !!checked.size || revoke);\n }\n };\n\n const buttons: PopupPeerOptions['buttons'] = [{\n langKey: 'Delete',\n isDanger: true,\n callback\n }];\n const checkboxes: PopupPeerOptions['checkboxes'] = [];\n let title: LangPackKey, titleArgs: any[], description: LangPackKey, descriptionArgs: any[];\n if(mids.length === 1) {\n title = 'DeleteSingleMessagesTitle';\n } else {\n title = 'DeleteMessagesTitle';\n titleArgs = [i18n('messages', [mids.length])];\n }\n\n if(await managers.appPeersManager.isMegagroup(peerId)) {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessageMega' : 'AreYouSureDeleteFewMessagesMega';\n } else {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessage' : 'AreYouSureDeleteFewMessages';\n }\n\n if(peerId === rootScope.myId || type === 'scheduled') {\n\n } else {\n if(peerId.isUser()) {\n checkboxes.push({\n text: 'DeleteMessagesOptionAlso',\n textArgs: [peerTitleElement]\n });\n } else {\n const chat = await managers.appChatsManager.getChat(peerId.toChatId());\n\n const _hasRights = hasRights(chat, 'delete_messages');\n if(chat._ === 'chat') {\n const canRevoke = _hasRights ? mids.slice() : await filterAsync(mids, async(mid) => {\n const message = await managers.appMessagesManager.getMessageByPeer(peerId, mid);\n return message.fromId === rootScope.myId;\n });\n\n if(canRevoke.length) {\n if(canRevoke.length === mids.length) {\n checkboxes.push({\n text: 'DeleteForAll'\n });\n } else {\n checkboxes.push({\n text: 'DeleteMessagesOption'\n });\n\n description = 'DeleteMessagesTextGroup';\n descriptionArgs = [i18n('messages', [canRevoke.length])];\n // description = `You can also delete the ${canRevoke.length} message${canRevoke.length > 1 ? 's' : ''} you sent from the inboxes of other group members by pressing \"${buttonText}\".`;\n }\n }\n } else {\n buttons[0].callback = (checked) => callback(checked, true);\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n threadId,\n titleLangKey: title,\n titleLangArgs: titleArgs,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appImManager from '../../lib/appManagers/appImManager';\nimport PopupPickUser from './pickUser';\n\nexport default class PopupForward extends PopupPickUser {\n constructor(\n peerIdMids: {[fromPeerId: PeerId]: number[]},\n onSelect?: (peerId: PeerId) => Promise | void,\n overrideOnSelect = false\n ) {\n super({\n peerTypes: ['dialogs', 'contacts'],\n onSelect: overrideOnSelect ? onSelect : async(peerId) => {\n if(onSelect) {\n const res = onSelect(peerId);\n if(res instanceof Promise) {\n await res;\n }\n }\n\n appImManager.setInnerPeer({peerId});\n appImManager.chat.input.initMessagesForward(peerIdMids);\n },\n placeholder: 'ShareModal.Search.ForwardPlaceholder',\n chatRightsAction: 'send_messages',\n selfPresence: 'ChatYourSelf'\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ripple from '../ripple';\nimport animationIntersector from '../animationIntersector';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {i18n, LangPackKey, _i18n} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport EventListenerBase, {EventListenerListeners} from '../../helpers/eventListenerBase';\nimport {addFullScreenListener, getFullScreenElement} from '../../helpers/dom/fullScreen';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport Scrollable from '../scrollable';\nimport {getMiddleware, MiddlewareHelper} from '../../helpers/middleware';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\n\nexport type PopupButton = {\n text?: string,\n callback?: () => void,\n langKey?: LangPackKey,\n langArgs?: any[],\n isDanger?: boolean,\n isCancel?: boolean,\n element?: HTMLButtonElement,\n noRipple?: boolean\n};\n\nexport type PopupOptions = Partial<{\n closable: boolean,\n overlayClosable: boolean,\n withConfirm: LangPackKey | boolean,\n body: boolean,\n confirmShortcutIsSendShortcut: boolean,\n withoutOverlay: boolean,\n scrollable: boolean,\n buttons: Array,\n title: boolean | LangPackKey,\n titleRaw: string\n}>;\n\nexport interface PopupElementConstructable {\n new(...args: any[]): T;\n}\n\nconst DEFAULT_APPEND_TO = document.body;\nlet appendPopupTo = DEFAULT_APPEND_TO;\n\nconst onFullScreenChange = () => {\n appendPopupTo = getFullScreenElement() || DEFAULT_APPEND_TO;\n PopupElement.reAppend();\n};\n\naddFullScreenListener(DEFAULT_APPEND_TO, onFullScreenChange);\n\ntype PopupListeners = {\n close: () => void,\n closeAfterTimeout: () => void\n};\n\nexport default class PopupElement extends EventListenerBase {\n private static POPUPS: PopupElement[] = [];\n public static MANAGERS: AppManagers;\n\n protected element = document.createElement('div');\n protected container = document.createElement('div');\n protected header = document.createElement('div');\n protected title = document.createElement('div');\n protected btnClose: HTMLElement;\n protected btnConfirm: HTMLButtonElement;\n protected body: HTMLElement;\n protected buttonsEl: HTMLElement;\n\n protected onEscape: () => boolean = () => true;\n\n protected navigationItem: NavigationItem;\n\n protected listenerSetter: ListenerSetter;\n\n protected confirmShortcutIsSendShortcut: boolean;\n protected btnConfirmOnEnter: HTMLElement;\n\n protected withoutOverlay: boolean;\n\n protected managers: AppManagers;\n\n protected scrollable: Scrollable;\n\n protected buttons: Array;\n\n protected middlewareHelper: MiddlewareHelper;\n\n constructor(className: string, options: PopupOptions = {}) {\n super(false);\n this.element.classList.add('popup');\n this.element.className = 'popup' + (className ? ' ' + className : '');\n this.container.classList.add('popup-container', 'z-depth-1');\n\n this.header.classList.add('popup-header');\n\n if(options.title || options.titleRaw) {\n this.title.classList.add('popup-title');\n if(typeof(options.title) === 'string') {\n _i18n(this.title, options.title);\n } else if(options.titleRaw) {\n this.title.append(wrapEmojiText(options.titleRaw));\n }\n\n this.header.append(this.title);\n }\n\n this.middlewareHelper = getMiddleware();\n this.listenerSetter = new ListenerSetter();\n this.managers = PopupElement.MANAGERS;\n\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\n\n if(options.closable) {\n this.btnClose = document.createElement('span');\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\n // ripple(this.closeBtn);\n this.header.prepend(this.btnClose);\n\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\n }\n\n this.withoutOverlay = options.withoutOverlay;\n if(this.withoutOverlay) {\n this.element.classList.add('no-overlay');\n }\n\n if(options.overlayClosable) {\n attachClickEvent(this.element, (e: MouseEvent) => {\n if(!findUpClassName(e.target, 'popup-container')) {\n this.hide();\n }\n }, {listenerSetter: this.listenerSetter});\n }\n\n if(options.withConfirm) {\n this.btnConfirm = document.createElement('button');\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\n if(options.withConfirm !== true) {\n this.btnConfirm.append(i18n(options.withConfirm));\n }\n this.header.append(this.btnConfirm);\n ripple(this.btnConfirm);\n }\n\n this.container.append(this.header);\n if(options.body) {\n this.body = document.createElement('div');\n this.body.classList.add('popup-body');\n this.container.append(this.body);\n }\n\n if(options.scrollable) {\n const scrollable = this.scrollable = new Scrollable(this.body);\n this.attachScrollableListeners();\n\n if(!this.body) {\n this.container.insertBefore(scrollable.container, this.header.nextSibling);\n }\n }\n\n let btnConfirmOnEnter = this.btnConfirm;\n const buttons = this.buttons = options.buttons;\n if(buttons?.length) {\n const buttonsDiv = this.buttonsEl = document.createElement('div');\n buttonsDiv.classList.add('popup-buttons');\n\n const buttonsElements = buttons.map((b) => {\n const button = document.createElement('button');\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\n\n if(!b.noRipple) {\n ripple(button);\n }\n\n if(b.text) {\n button.textContent = b.text;\n } else {\n button.append(i18n(b.langKey, b.langArgs));\n }\n\n attachClickEvent(button, () => {\n b.callback?.();\n this.destroy();\n }, {listenerSetter: this.listenerSetter, once: true});\n\n return b.element = button;\n });\n\n if(!btnConfirmOnEnter && buttons.length === 2) {\n const button = buttons.find((button) => !button.isCancel);\n if(button) {\n btnConfirmOnEnter = button.element;\n }\n }\n\n buttonsDiv.append(...buttonsElements);\n this.container.append(buttonsDiv);\n }\n\n this.btnConfirmOnEnter = btnConfirmOnEnter;\n\n this.element.append(this.container);\n\n PopupElement.POPUPS.push(this);\n }\n\n protected attachScrollableListeners(setClassOn?: HTMLElement) {\n return this.scrollable.attachBorderListeners(setClassOn);\n }\n\n protected onContentUpdate() {\n if(this.scrollable) {\n this.scrollable.onAdditionalScroll();\n }\n }\n\n public show() {\n this.navigationItem = {\n type: 'popup',\n onPop: () => this.destroy(),\n onEscape: this.onEscape\n };\n\n appNavigationController.pushItem(this.navigationItem);\n\n blurActiveElement(); // * hide mobile keyboard\n appendPopupTo.append(this.element);\n void this.element.offsetWidth; // reflow\n this.element.classList.add('active');\n\n this.onContentUpdate();\n\n if(!this.withoutOverlay) {\n overlayCounter.isOverlayActive = true;\n animationIntersector.checkAnimations2(true);\n }\n\n // cannot add event instantly because keydown propagation will fire it\n // if(this.btnConfirmOnEnter) {\n setTimeout(() => {\n if(!this.element.classList.contains('active')) {\n return;\n }\n\n this.listenerSetter.add(document.body)('keydown', (e) => {\n if(PopupElement.POPUPS[PopupElement.POPUPS.length - 1] !== this) {\n return;\n }\n\n if(this.confirmShortcutIsSendShortcut ? isSendShortcutPressed(e) : e.key === 'Enter') {\n simulateClickEvent(this.btnConfirmOnEnter);\n cancelEvent(e);\n }\n });\n }, 0);\n // }\n }\n\n public hide = () => {\n appNavigationController.backByItem(this.navigationItem);\n };\n\n protected destroy() {\n this.dispatchEvent('close');\n this.element.classList.add('hiding');\n this.element.classList.remove('active');\n this.listenerSetter.removeAll();\n this.middlewareHelper.destroy();\n\n if(!this.withoutOverlay) {\n overlayCounter.isOverlayActive = false;\n }\n\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n\n indexOfAndSplice(PopupElement.POPUPS, this);\n\n // ! calm\n onFullScreenChange();\n\n setTimeout(() => {\n this.element.remove();\n this.dispatchEvent('closeAfterTimeout');\n this.cleanup();\n this.scrollable?.destroy();\n\n if(!this.withoutOverlay) {\n animationIntersector.checkAnimations2(false);\n }\n }, 150);\n }\n\n public static reAppend() {\n this.POPUPS.forEach((popup) => {\n const {element, container} = popup;\n const parentElement = element.parentElement;\n if(parentElement && parentElement !== appendPopupTo && appendPopupTo !== container) {\n appendPopupTo.append(element);\n }\n });\n }\n\n public static getPopups(popupConstructor: PopupElementConstructable) {\n return this.POPUPS.filter((element) => element instanceof popupConstructor) as T[];\n }\n\n public static createPopup>(ctor: {new(...args: A): T}, ...args: A) {\n const popup = new ctor(...args);\n return popup;\n }\n}\n\nexport const addCancelButton = (buttons: PopupButton[]) => {\n const button = buttons.find((b) => b.isCancel);\n if(!button) {\n buttons.push({\n langKey: 'Cancel',\n isCancel: true\n });\n }\n\n return buttons;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {doubleRaf} from '../../helpers/schedulers';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {LangPackKey, _i18n, i18n} from '../../lib/langPack';\nimport {ApiLimitType} from '../../lib/mtproto/api_methods';\nimport rootScope from '../../lib/rootScope';\nimport PopupPeer from './peer';\n\nconst a: {[type in ApiLimitType]?: {\n title: LangPackKey,\n description: LangPackKey,\n descriptionPremium: LangPackKey,\n descriptionLocked: LangPackKey,\n icon: string\n}} = {\n pin: {\n title: 'LimitReached',\n description: 'LimitReachedPinDialogs',\n descriptionPremium: 'LimitReachedPinDialogsPremium',\n descriptionLocked: 'LimitReachedPinDialogsLocked',\n icon: 'limit_pin'\n },\n folders: {\n title: 'LimitReached',\n description: 'LimitReachedFolders',\n descriptionPremium: 'LimitReachedFoldersPremium',\n descriptionLocked: 'LimitReachedFoldersLocked',\n icon: 'limit_folders'\n }\n};\n\nclass P extends PopupPeer {\n constructor(options: {\n isPremium: boolean,\n limit: number,\n limitPremium: number\n }, _a: typeof a[keyof typeof a]) {\n super('popup-limit', {\n buttons: options.isPremium === undefined ? [{\n langKey: 'LimitReached.Ok',\n isCancel: true\n }] : (options.isPremium ? [{\n langKey: 'OK',\n isCancel: true\n }] : [{\n langKey: 'IncreaseLimit',\n callback: () => {\n appImManager.openPremiumBot();\n },\n noRipple: true\n }, {\n langKey: 'Cancel',\n isCancel: true\n }]),\n descriptionLangKey: options.isPremium === undefined ? _a.descriptionLocked : (options.isPremium ? _a.descriptionPremium : _a.description),\n descriptionLangArgs: options.isPremium ? [options.limitPremium] : [options.limit, options.limitPremium],\n titleLangKey: _a.title\n });\n\n const isLocked = options.isPremium === undefined;\n if(isLocked) {\n this.element.classList.add('is-locked');\n } else if(options.isPremium) {\n this.element.classList.add('is-premium');\n } else {\n const button = this.buttons.find((b) => !b.isCancel);\n button.element.classList.add('popup-limit-button');\n const i = document.createElement('i');\n i.classList.add('popup-limit-button-icon', 'tgico-premium_double');\n button.element.append(i);\n }\n\n const limitContainer = document.createElement('div');\n limitContainer.classList.add('popup-limit-line');\n\n const hint = document.createElement('div');\n hint.classList.add('popup-limit-hint');\n const i = document.createElement('span');\n i.classList.add('popup-limit-hint-icon', 'tgico-' + _a.icon);\n hint.append(i, '' + (options.isPremium ? options.limitPremium : options.limit));\n\n limitContainer.append(hint);\n\n if(!isLocked) {\n const limit = document.createElement('div');\n limit.classList.add('limit-line');\n\n const free = document.createElement('div');\n free.classList.add('limit-line-free');\n\n const premium = document.createElement('div');\n premium.classList.add('limit-line-premium');\n\n limit.append(free, premium);\n\n _i18n(free, 'LimitFree');\n premium.append(i18n('LimitPremium'), '' + options.limitPremium);\n\n limitContainer.append(limit);\n }\n\n this.container.insertBefore(limitContainer, this.description);\n\n // if(options.isPremium === false) {\n // this.buttons.pop().element.remove();\n // }\n\n const setHintActive = () => {\n hint.classList.add('active');\n };\n\n if(rootScope.settings.animationsEnabled) {\n doubleRaf().then(setHintActive);\n } else {\n setHintActive();\n }\n }\n}\n\nexport default async function showLimitPopup(type: keyof typeof a) {\n const _a = a[type];\n const [appConfig, limit, limitPremium] = await Promise.all([\n rootScope.managers.apiManager.getAppConfig(),\n ...[false, true].map((v) => rootScope.managers.apiManager.getLimit(type, v))\n ]);\n const isLocked = appConfig.premium_purchase_blocked;\n new P({\n isPremium: isLocked ? undefined : rootScope.premium,\n limit,\n limitPremium\n }, _a).show();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport tsNow from '../../helpers/tsNow';\nimport {LangPackKey} from '../../lib/langPack';\nimport {MUTE_UNTIL} from '../../lib/mtproto/mtproto_config';\nimport {RadioFormFromValues} from '../row';\nimport PopupPeer from './peer';\n\nconst ONE_HOUR = 3600;\nconst times: {value: number | string, langPackKey: LangPackKey, checked?: boolean}[] = [{\n value: ONE_HOUR,\n langPackKey: 'ChatList.Mute.1Hour'\n}, {\n value: ONE_HOUR * 4,\n langPackKey: 'ChatList.Mute.4Hours'\n}, {\n value: ONE_HOUR * 8,\n langPackKey: 'ChatList.Mute.8Hours'\n}, {\n value: ONE_HOUR * 24,\n langPackKey: 'ChatList.Mute.1Day'\n}, {\n value: ONE_HOUR * 24 * 3,\n langPackKey: 'ChatList.Mute.3Days'\n}, {\n value: -1,\n langPackKey: 'ChatList.Mute.Forever',\n checked: true\n}];\n\nexport default class PopupMute extends PopupPeer {\n constructor(peerId: PeerId, threadId?: number) {\n super('popup-mute', {\n peerId,\n titleLangKey: 'Notifications',\n buttons: [{\n langKey: 'ChatList.Context.Mute',\n callback: () => {\n this.managers.appMessagesManager.mutePeer({peerId, muteUntil: time === -1 ? MUTE_UNTIL : tsNow(true) + time, threadId});\n }\n }],\n body: true\n });\n\n let time: number;\n const radioForm = RadioFormFromValues(times, (value) => {\n time = +value;\n });\n\n this.body.append(radioForm);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarElement from '../avatar';\nimport PopupElement, {addCancelButton, PopupButton, PopupOptions} from '.';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport CheckboxField, {CheckboxFieldOptions} from '../checkboxField';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\n\nexport type PopupPeerButton = Omit & Partial<{callback: PopupPeerButtonCallback}>;\nexport type PopupPeerButtonCallbackCheckboxes = Set;\nexport type PopupPeerButtonCallback = (checkboxes?: PopupPeerButtonCallbackCheckboxes) => void;\nexport type PopupPeerCheckboxOptions = CheckboxFieldOptions & {checkboxField?: CheckboxField};\n\nexport type PopupPeerOptions = Omit & Partial<{\n peerId: PeerId,\n threadId: number,\n title: string | HTMLElement,\n titleLangKey: LangPackKey,\n titleLangArgs: any[],\n noTitle: boolean,\n description: string | DocumentFragment,\n descriptionLangKey: LangPackKey,\n descriptionLangArgs: any[],\n buttons: Array,\n checkboxes: Array\n}>;\nexport default class PopupPeer extends PopupElement {\n protected description: HTMLParagraphElement;\n\n constructor(private className: string, options: PopupPeerOptions = {}) {\n super('popup-peer' + (className ? ' ' + className : ''), {\n overlayClosable: true,\n ...options,\n title: true,\n buttons: options.buttons && addCancelButton(options.buttons)\n });\n\n if(options.peerId) {\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('avatar-32');\n avatarEl.updateWithOptions({\n isDialog: true,\n peerId: options.peerId,\n threadId: options.threadId,\n wrapOptions: {\n middleware: this.middlewareHelper.get()\n }\n });\n this.header.prepend(avatarEl);\n }\n\n if(!options.noTitle) {\n if(options.titleLangKey || !options.title) this.title.append(i18n(options.titleLangKey || 'AppName', options.titleLangArgs));\n else if(options.title instanceof HTMLElement) {\n this.title.append(options.title);\n } else this.title.innerText = options.title || '';\n }\n\n const fragment = document.createDocumentFragment();\n\n if(options.descriptionLangKey || options.description) {\n const p = this.description = document.createElement('p');\n p.classList.add('popup-description');\n if(options.descriptionLangKey) p.append(i18n(options.descriptionLangKey, options.descriptionLangArgs));\n else if(options.description) setInnerHTML(p, options.description);\n\n fragment.append(p);\n }\n\n if(options.checkboxes) {\n this.container.classList.add('have-checkbox');\n\n options.checkboxes.forEach((o) => {\n o.withRipple = true;\n const checkboxField = new CheckboxField(o);\n o.checkboxField = checkboxField;\n fragment.append(checkboxField.label);\n });\n\n options.buttons.forEach((button) => {\n if(button.callback) {\n const original = button.callback;\n button.callback = () => {\n const c: Set = new Set();\n options.checkboxes.forEach((o) => {\n if(o.checkboxField.checked) {\n c.add(o.text);\n }\n });\n original(c);\n };\n }\n });\n }\n\n this.container.insertBefore(fragment, this.header.nextElementSibling);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport AppSelectPeers from '../appSelectPeers';\nimport PopupElement from '.';\nimport {LangPackKey, _i18n} from '../../lib/langPack';\n\nexport default class PopupPickUser extends PopupElement {\n protected selector: AppSelectPeers;\n\n constructor(options: {\n peerTypes: AppSelectPeers['peerType'],\n onSelect?: (peerId: PeerId) => Promise | void,\n placeholder: LangPackKey,\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\n peerId?: number,\n selfPresence?: LangPackKey\n }) {\n super('popup-forward', {closable: true, overlayClosable: true, body: true, title: true});\n\n this.selector = new AppSelectPeers({\n appendTo: this.body,\n onChange: async() => {\n const selected = this.selector.getSelected();\n const peerId = selected[selected.length - 1].toPeerId();\n\n if(options.onSelect) {\n const res = options.onSelect(peerId);\n if(res instanceof Promise) {\n try {\n await res;\n } catch(err) {\n return;\n }\n }\n }\n\n this.selector = null;\n this.hide();\n },\n peerType: options.peerTypes,\n onFirstRender: () => {\n this.show();\n this.selector.checkForTriggers(); // ! due to zero height before mounting\n\n if(!IS_TOUCH_SUPPORTED) {\n this.selector.input.focus();\n }\n },\n chatRightsAction: options.chatRightsAction,\n multiSelect: false,\n rippleEnabled: false,\n avatarSize: 'abitbigger',\n peerId: options.peerId,\n placeholder: options.placeholder,\n selfPresence: options.selfPresence,\n managers: this.managers\n });\n\n this.scrollable = this.selector.scrollable;\n this.attachScrollableListeners();\n\n // this.scrollable = new Scrollable(this.body);\n\n this.title.append(this.selector.input);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupPeer from './peer';\n\nexport default class PopupSendNow extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-delete-chat', {\n title: `Send Message${mids.length > 1 ? 's' : ''} Now`,\n description: mids.length > 1 ? 'Send ' + mids.length + ' messages now?' : 'Send message now?',\n buttons: [{\n langKey: 'Send',\n callback: () => {\n onConfirm && onConfirm();\n this.managers.appMessagesManager.sendScheduledMessages(peerId, mids);\n }\n }]\n });\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppStickersManager} from '../../lib/appManagers/appStickersManager';\nimport PopupElement from '.';\nimport wrapSticker from '../wrappers/sticker';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport {putPreloader} from '../putPreloader';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {i18n} from '../../lib/langPack';\nimport Button from '../button';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {toastNew} from '../toast';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport createStickersContextMenu from '../../helpers/dom/createStickersContextMenu';\nimport attachStickerViewerListeners from '../stickerViewer';\nimport {Document, StickerSet} from '../../layer';\nimport Row from '../row';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport rootScope from '../../lib/rootScope';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport emoticonsDropdown from '../emoticonsDropdown';\n\nconst ANIMATION_GROUP: AnimationItemGroup = 'STICKERS-POPUP';\n\nexport default class PopupStickers extends PopupElement {\n private stickersFooter: HTMLElement;\n private appendTo: HTMLElement;\n private updateAdded: {[setId: Long]: (added: boolean) => void};\n private sets: StickerSet.stickerSet[];\n private button: HTMLElement;\n\n constructor(\n private stickerSetInput: Parameters[0] | Parameters[0][],\n private isEmojis?: boolean\n ) {\n super('popup-stickers', {closable: true, overlayClosable: true, body: true, scrollable: true, title: true});\n\n this.title.append(i18n('Loading'));\n this.updateAdded = {};\n\n emoticonsDropdown.setIgnoreMouseOut('popup', true);\n this.addEventListener('close', () => {\n emoticonsDropdown.setIgnoreMouseOut('popup', false);\n animationIntersector.setOnlyOnePlayableGroup();\n });\n\n this.appendTo = this.scrollable.container;\n\n this.appendTo.classList.add('is-loading');\n putPreloader(this.appendTo, true);\n\n this.stickersFooter = document.createElement('div');\n this.stickersFooter.classList.add('sticker-set-footer');\n\n const btn = Button('btn-primary btn-primary-transparent disable-hover', {noRipple: true, text: 'Loading'});\n this.stickersFooter.append(btn);\n\n this.body.append(this.stickersFooter);\n\n attachStickerViewerListeners({listenTo: this.appendTo, listenerSetter: this.listenerSetter});\n\n const onStickerSetUpdate = (set: StickerSet.stickerSet) => {\n const idx = this.sets.findIndex((_set) => _set.id === set.id);\n if(idx === -1) {\n return;\n }\n\n this.sets[idx] = set;\n const updateAdded = this.updateAdded[set.id];\n updateAdded?.(!!set.installed_date);\n this.updateButton();\n };\n\n this.listenerSetter.add(rootScope)('stickers_installed', onStickerSetUpdate);\n this.listenerSetter.add(rootScope)('stickers_deleted', onStickerSetUpdate);\n\n this.loadStickerSet();\n }\n\n private createStickerSetElements(set?: StickerSet.stickerSet) {\n const container = document.createElement('div');\n container.classList.add('sticker-set');\n\n let headerRow: Row, updateAdded: (added: boolean) => void;\n if(set) {\n headerRow = new Row({\n title: wrapEmojiText(set.title),\n subtitle: i18n(set.pFlags.emojis ? 'EmojiCount' : 'Stickers', [set.count]),\n buttonRight: true\n });\n\n updateAdded = (added) => {\n replaceContent(headerRow.buttonRight, i18n(added ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\n headerRow.buttonRight.classList.toggle('active', added);\n };\n\n updateAdded(!!set.installed_date);\n\n container.append(headerRow.container);\n }\n\n const itemsContainer = document.createElement('div');\n itemsContainer.classList.add('sticker-set-stickers');\n\n container.append(itemsContainer);\n\n return {container, headerRow, updateAdded, itemsContainer};\n }\n\n private onStickersClick = async(e: MouseEvent) => {\n const target = findUpClassName(e.target, 'sticker-set-sticker');\n if(!target) return;\n\n const docId = target.dataset.docId;\n if(await appImManager.chat.input.sendMessageWithDocument(docId)) {\n this.hide();\n }\n };\n\n private async loadStickerSet() {\n const middleware = this.middlewareHelper.get();\n const inputs = Array.isArray(this.stickerSetInput) ? this.stickerSetInput : [this.stickerSetInput];\n const setsPromises = inputs.map((input) => this.managers.appStickersManager.getStickerSet(input));\n let sets = await Promise.all(setsPromises);\n if(!middleware()) return;\n let firstSet = sets[0];\n if(sets.length === 1 && !firstSet) {\n toastNew({langPackKey: this.isEmojis ? 'AddEmojiNotFound' : 'StickerSet.DontExist'});\n this.hide();\n return;\n }\n\n sets = sets.filter(Boolean);\n firstSet = sets[0];\n\n this.sets = sets.map((set) => set.set);\n\n const isEmojis = this.isEmojis ??= !!firstSet.set.pFlags.emojis;\n\n if(!isEmojis) {\n attachClickEvent(this.appendTo, this.onStickersClick, {listenerSetter: this.listenerSetter});\n\n const {destroy} = createStickersContextMenu({\n listenTo: this.appendTo,\n isStickerPack: true,\n onSend: () => this.hide()\n });\n\n this.addEventListener('close', destroy);\n }\n\n animationIntersector.setOnlyOnePlayableGroup(ANIMATION_GROUP);\n\n const lazyLoadQueue = new LazyLoadQueue();\n const loadPromises: Promise[] = [];\n\n const containersPromises = sets.map(async(set) => {\n const {container, itemsContainer, headerRow, updateAdded} = this.createStickerSetElements(sets.length > 1 ? set.set : undefined);\n\n if(headerRow) {\n attachClickEvent(headerRow.buttonRight, () => {\n this.managers.appStickersManager.toggleStickerSet(set.set);\n }, {listenerSetter: this.listenerSetter});\n }\n\n this.updateAdded[set.set.id] = updateAdded;\n\n let divs: (HTMLElement | DocumentFragment)[];\n\n const docs = set.documents.filter((doc) => doc?._ === 'document') as Document.document[];\n if(isEmojis) {\n const fragment = wrapCustomEmoji({\n docIds: docs.map((doc) => doc.id),\n loadPromises,\n animationGroup: ANIMATION_GROUP,\n customEmojiSize: mediaSizes.active.esgCustomEmoji,\n middleware\n // lazyLoadQueue\n });\n\n (Array.from(fragment.children) as HTMLElement[]).slice(1).forEach((element) => {\n const span = document.createElement('span');\n span.classList.add('super-emoji');\n element.replaceWith(span);\n span.append(element);\n });\n\n divs = [fragment];\n\n itemsContainer.classList.replace('sticker-set-stickers', 'super-emojis');\n itemsContainer.classList.add('is-emojis', 'not-local');\n } else {\n divs = await Promise.all(docs.map(async(doc) => {\n const div = document.createElement('div');\n div.classList.add('sticker-set-sticker');\n\n const size = mediaSizes.active.popupSticker.width;\n\n await wrapSticker({\n doc,\n div,\n lazyLoadQueue,\n group: ANIMATION_GROUP,\n play: true,\n loop: true,\n width: size,\n height: size,\n withLock: true,\n loadPromises,\n middleware\n });\n\n return div;\n }));\n }\n\n itemsContainer.append(...divs.filter(Boolean));\n\n return container;\n });\n\n const containers = await Promise.all(containersPromises);\n await Promise.all(loadPromises);\n\n const button = this.button = Button('', {noRipple: true});\n\n this.updateButton();\n\n attachClickEvent(button, () => {\n const toggle = toggleDisability([button], true);\n\n this.managers.appStickersManager.toggleStickerSets(sets.map((set) => set.set)).then(() => {\n this.hide();\n }).catch(() => {\n toggle();\n });\n }, {listenerSetter: this.listenerSetter});\n\n if(sets.length === 1) {\n setInnerHTML(this.title, wrapEmojiText(firstSet.set.title));\n } else {\n setInnerHTML(this.title, i18n('Emoji'));\n }\n\n this.stickersFooter.textContent = '';\n this.stickersFooter.append(button);\n\n this.appendTo.classList.remove('is-loading');\n this.appendTo.textContent = '';\n this.appendTo.append(...containers);\n\n this.scrollable.onAdditionalScroll();\n }\n\n private updateButton() {\n const {sets, isEmojis} = this;\n let isAdd: boolean, buttonAppend: HTMLElement;\n if(sets.length === 1) {\n const firstSet = sets[0];\n buttonAppend = i18n(isEmojis ? 'EmojiCount' : 'Stickers', [firstSet.count]);\n isAdd = !firstSet.installed_date;\n } else {\n const installed = sets.filter((set) => set.installed_date);\n let count: number;\n if(sets.length === installed.length) {\n isAdd = false;\n count = sets.length;\n } else {\n isAdd = true;\n count = sets.length - installed.length;\n }\n\n buttonAppend = i18n('EmojiPackCount', [count]);\n }\n\n this.button.className = isAdd ? 'btn-primary btn-color-primary' : 'btn-primary btn-primary-transparent danger';\n replaceContent(this.button, i18n(isAdd ? 'AddStickersCount' : 'RemoveStickersCount', [buttonAppend]));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {CancellablePromise} from '../helpers/cancellablePromise';\nimport SetTransition from './singleTransition';\nimport {fastRaf} from '../helpers/schedulers';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport safeAssign from '../helpers/object/safeAssign';\n\nconst TRANSITION_TIME = 200;\n\nexport default class ProgressivePreloader {\n public preloader: HTMLDivElement;\n public circle: SVGCircleElement;\n private cancelSvg: SVGSVGElement;\n private downloadSvg: HTMLElement;\n\n private tempId = 0;\n public detached = true;\n\n public promise: CancellablePromise = null;\n\n public isUpload = false;\n private cancelable = true;\n private streamable = false;\n private tryAgainOnFail = true;\n private attachMethod: 'append' | 'prepend' = 'append';\n\n public loadFunc: (e?: Event) => any;\n\n public totalLength: number;\n\n constructor(options?: Partial<{\n isUpload: ProgressivePreloader['isUpload'],\n cancelable: ProgressivePreloader['cancelable'],\n streamable: ProgressivePreloader['streamable'],\n tryAgainOnFail: ProgressivePreloader['tryAgainOnFail'],\n attachMethod: ProgressivePreloader['attachMethod']\n }>) {\n if(options) {\n safeAssign(this, options);\n }\n\n if(this.isUpload) {\n this.tryAgainOnFail = false;\n }\n }\n\n public constructContainer(options: Partial<{\n color: 'transparent',\n bold: boolean\n }> = {}) {\n if(!this.preloader) {\n this.preloader = document.createElement('div');\n this.preloader.classList.add('preloader-container');\n\n if(options.color) {\n this.preloader.classList.add('preloader-' + options.color);\n }\n\n if(options.bold) {\n this.preloader.classList.add('preloader-bold');\n }\n\n if(this.streamable) {\n this.preloader.classList.add('preloader-streamable');\n }\n }\n }\n\n public constructDownloadIcon() {\n this.constructContainer();\n }\n\n public construct() {\n this.construct = null;\n\n this.constructContainer();\n\n this.preloader.innerHTML = `\n
\n \n \n \n
`;\n\n if(this.streamable) {\n this.totalLength = 118.61124420166016;\n } else {\n this.totalLength = 149.82473754882812;\n }\n\n if(this.cancelable) {\n this.preloader.innerHTML += `\n \n \n \n \n \n \n \n \n \n \n \n `;\n\n this.downloadSvg = this.preloader.lastElementChild as HTMLElement;\n this.cancelSvg = this.downloadSvg.previousElementSibling as any;\n } else {\n this.preloader.classList.add('preloader-swing');\n }\n\n this.circle = this.preloader.firstElementChild.firstElementChild.firstElementChild as SVGCircleElement;\n\n if(this.cancelable) {\n attachClickEvent(this.preloader, this.onClick);\n }\n }\n\n public onClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.preloader.classList.contains('manual')) {\n if(this.loadFunc) {\n this.loadFunc(e);\n }\n } else {\n if(this.promise && this.promise.cancel) {\n this.promise.cancel();\n }\n }\n };\n\n public setDownloadFunction(func: ProgressivePreloader['loadFunc']) {\n this.loadFunc = func;\n }\n\n public setManual() {\n this.preloader.classList.add('manual');\n this.setProgress(0);\n }\n\n public attachPromise(promise: CancellablePromise) {\n if(this.isUpload && this.promise) return;\n\n this.promise = promise;\n\n const tempId = --this.tempId;\n const startTime = Date.now();\n\n const onEnd = (err: Error) => {\n promise.notify = promise.notifyAll = null;\n\n if(tempId !== this.tempId) {\n return;\n }\n\n const elapsedTime = Date.now() - startTime;\n\n // console.log('[PP]: end', this.detached, performance.now());\n\n if(!err && this.cancelable) {\n this.setProgress(100);\n\n const delay = TRANSITION_TIME * 0.75;\n\n if(elapsedTime < delay) {\n this.detach();\n } else {\n setTimeout(() => { // * wait for transition complete\n if(tempId === this.tempId) {\n this.detach();\n }\n }, delay);\n }\n } else {\n if(this.tryAgainOnFail) {\n this.attach(this.preloader.parentElement);\n fastRaf(() => {\n this.setManual();\n });\n } else {\n this.detach();\n }\n }\n\n this.promise = promise = null;\n };\n\n promise\n .then(() => onEnd(null))\n .catch((err) => onEnd(err));\n\n if(promise.addNotifyListener) {\n promise.addNotifyListener((details: {done: number, total: number}) => {\n /* if(details.done >= details.total) {\n onEnd();\n } */\n\n if(tempId !== this.tempId) return;\n\n // console.log('preloader download', promise, details);\n const percents = details.done / details.total * 100;\n this.setProgress(percents);\n });\n }\n }\n\n public attach(elem: Element, reset = false, promise?: CancellablePromise) {\n if(this.construct) {\n this.construct();\n }\n\n if(this.preloader.parentElement) {\n this.preloader.classList.remove('manual');\n }\n\n this.detached = false;\n\n if(promise/* && false */) {\n this.attachPromise(promise);\n }\n\n let useRafs = 0;\n if(this.detached || this.preloader.parentElement !== elem) {\n useRafs = isInDOM(this.preloader) ? 1 : 2;\n if(this.preloader.parentElement !== elem) {\n elem[this.attachMethod](this.preloader);\n }\n }\n\n SetTransition({\n element: this.preloader,\n className: 'is-visible',\n forwards: true,\n duration: TRANSITION_TIME,\n useRafs\n });\n\n if(this.cancelable && reset) {\n this.setProgress(0);\n }\n }\n\n public detach() {\n if(this.detached) {\n return;\n }\n // return;\n\n this.detached = true;\n\n // return;\n\n if(this.preloader?.parentElement) {\n /* setTimeout(() => */// fastRaf(() => {\n /* if(!this.detached) return;\n this.detached = true; */\n\n // fastRaf(() => {\n // console.log('[PP]: detach after rAF', this.detached, performance.now());\n\n // if(!this.detached || !this.preloader.parentElement) {\n // return;\n // }\n\n SetTransition({\n element: this.preloader,\n className: 'is-visible',\n forwards: false,\n duration: TRANSITION_TIME,\n onTransitionEnd: () => {\n this.preloader.remove();\n },\n useRafs: 1\n });\n // });\n // })/* , 5e3) */;\n }\n }\n\n public setProgress(percents: number) {\n if(!this.totalLength && !isInDOM(this.circle)) {\n return;\n }\n\n if(percents === 0) {\n this.circle.style.strokeDasharray = '';\n return;\n }\n\n try {\n if(!this.totalLength) {\n this.totalLength = this.circle.getTotalLength();\n }\n\n // console.log('setProgress', (percents / 100 * totalLength));\n this.circle.style.strokeDasharray = '' + Math.max(5, percents / 100 * this.totalLength) + ', ' + this.totalLength;\n } catch(err) {}\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {PeerPhotoSize} from '../lib/appManagers/appAvatarsManager';\nimport getPreviewURLFromBytes from '../helpers/bytes/getPreviewURLFromBytes';\nimport {renderImageFromUrlPromise} from '../helpers/dom/renderImageFromUrl';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {recordPromise} from '../helpers/recordPromise';\nimport sequentialDom from '../helpers/sequentialDom';\nimport {UserProfilePhoto, ChatPhoto, User, Chat} from '../layer';\nimport getPeerColorById from '../lib/appManagers/utils/peers/getPeerColorById';\nimport getPeerPhoto from '../lib/appManagers/utils/peers/getPeerPhoto';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport wrapAbbreviation from '../lib/richTextProcessor/wrapAbbreviation';\nimport rootScope from '../lib/rootScope';\nimport getPeerInitials from './wrappers/getPeerInitials';\nimport {wrapTopicIcon} from './wrappers/messageActionTextNewUnsafe';\nimport makeError from '../helpers/makeError';\nimport noop from '../helpers/noop';\n\nexport async function putAvatar(\n div: HTMLElement,\n peerId: PeerId,\n photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto,\n size: PeerPhotoSize,\n img = new Image(),\n onlyThumb = false\n) {\n const r = await rootScope.managers.acknowledged.appAvatarsManager.loadAvatar(peerId, photo, size);\n const loadPromise = r.result;\n const cached = r.cached;\n\n img.classList.add('avatar-photo');\n\n let renderThumbPromise: Promise;\n let callback: () => void;\n let thumbImage: HTMLImageElement;\n if(cached) {\n // смотри в misc.ts: renderImageFromUrl\n callback = () => {\n replaceContent(div, img);\n div.dataset.color = '';\n };\n } else {\n const animate = rootScope.settings.animationsEnabled;\n if(animate) {\n img.classList.add('fade-in');\n }\n\n let isFullLoaded = false;\n if(size === 'photo_big') { // let's load small photo first\n const res = await putAvatar(div, peerId, photo, 'photo_small');\n renderThumbPromise = res.loadThumbPromise || res.loadPromise;\n thumbImage = res.thumbImage;\n } else if(photo.stripped_thumb) {\n thumbImage = new Image();\n div.classList.add('avatar-relative');\n thumbImage.classList.add('avatar-photo', 'avatar-photo-thumbnail');\n const url = getPreviewURLFromBytes(photo.stripped_thumb);\n renderThumbPromise = renderImageFromUrlPromise(thumbImage, url).then(() => {\n if(isFullLoaded) {\n return;\n }\n\n replaceContent(div, thumbImage);\n });\n }\n\n callback = () => {\n isFullLoaded = true;\n\n if(thumbImage) {\n div.append(img);\n } else {\n replaceContent(div, img);\n }\n\n setTimeout(() => {\n if(div.childElementCount) {\n sequentialDom.mutateElement(img, () => {\n div.dataset.color = '';\n\n if(animate) {\n img.classList.remove('fade-in');\n }\n\n thumbImage?.remove();\n });\n }\n }, animate ? 200 : 0);\n };\n }\n\n const renderPromise = loadPromise\n .then((url) => renderImageFromUrlPromise(img, url/* , !cached */))\n .then(callback);\n\n renderThumbPromise && await renderThumbPromise.catch(noop);\n\n return {\n cached,\n loadPromise: renderPromise,\n loadThumbPromise: cached ? renderPromise : renderThumbPromise || Promise.resolve(),\n thumbImage\n };\n}\n\nfunction set(\n div: HTMLElement,\n innerHTML: Parameters[1],\n color: string,\n icon?: string,\n isForum?: boolean,\n isTopic?: boolean\n) {\n setInnerHTML(div, innerHTML);\n div.dataset.color = color;\n div.classList.remove('tgico-saved', 'tgico-deletedaccount', 'tgico-reply_filled', 'is-forum', 'is-topic');\n icon && div.classList.add(icon);\n isForum && div.classList.add('is-forum');\n isTopic && div.classList.add('is-topic');\n}\n\n// peerId === peerId || title\nexport default async function putPhoto({\n div,\n peerId,\n isDialog = false,\n title = '',\n onlyThumb = false,\n isBig,\n threadId,\n wrapOptions = {}\n}: {\n div: HTMLElement,\n peerId: PeerId,\n isDialog?: boolean,\n title?: string,\n onlyThumb?: boolean,\n isBig?: boolean,\n threadId?: number,\n wrapOptions?: WrapSomethingOptions\n}) {\n const myId = rootScope.myId;\n\n if(peerId === myId && isDialog) {\n set(div, '', '', 'tgico-saved');\n return;\n }\n\n const managers = rootScope.managers;\n\n if(threadId) {\n const topic = await managers.dialogsStorage.getForumTopic(peerId, threadId);\n set(div, '', '', undefined, undefined, true);\n\n if(wrapOptions.customEmojiSize) {\n div.style.setProperty('--size', wrapOptions.customEmojiSize.width + 'px');\n }\n\n return wrapTopicIcon({\n ...wrapOptions,\n topic,\n lazyLoadQueue: false\n }).then((icon) => {\n div.replaceChildren(icon);\n });\n }\n\n const peer = await managers.appPeersManager.getPeer(peerId);\n if(peerId !== NULL_PEER_ID && peerId.isUser() && (peer as User.user)?.pFlags?.deleted) {\n set(div, '', getPeerColorById(peerId), 'tgico-deletedaccount');\n return;\n }\n\n const isForum = !!(peer as Chat.channel)?.pFlags?.forum;\n const size: PeerPhotoSize = isBig ? 'photo_big' : 'photo_small';\n const photo = getPeerPhoto(peer);\n const avatarAvailable = !!photo;\n const avatarRendered = !!div.firstElementChild && !(div.firstElementChild as HTMLElement).classList.contains('emoji');\n if(!avatarAvailable || !avatarRendered || !(await managers.appAvatarsManager.isAvatarCached(peerId, size))) {\n let color = '';\n if(peerId && (peerId !== myId || !isDialog)) {\n color = getPeerColorById(peerId);\n }\n\n if(peerId === REPLIES_PEER_ID) {\n set(div, '', color, 'tgico-reply_filled');\n return;\n }\n\n const abbr = title ? wrapAbbreviation(title) : getPeerInitials(peer);\n set(div, abbr, color, '', isForum);\n // return Promise.resolve(true);\n }\n\n if(avatarAvailable/* && false */) {\n const promise = putAvatar(div, peerId, photo, size, undefined, onlyThumb);\n // recordPromise(promise, 'putAvatar-' + peerId);\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Chat, User} from '../../layer';\nimport wrapAbbreviation from '../../lib/richTextProcessor/wrapAbbreviation';\n\nexport default function getPeerInitials(peer: Chat | User) {\n let str = '';\n if(peer) {\n str = (peer as Chat.chat).title ?? [\n (peer as User.user).first_name,\n (peer as User.user).last_name\n ].filter(Boolean).join(' ');\n }\n\n return wrapAbbreviation(str);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\n\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\n const html = `\n \n \n `;\n\n if(returnDiv) {\n const div = document.createElement('div');\n div.classList.add('preloader');\n div.innerHTML = html;\n\n if(elem) {\n elem.appendChild(div);\n }\n\n return div;\n }\n\n elem.insertAdjacentHTML('beforeend', html);\n return elem.lastElementChild as HTMLElement;\n}\n\nMOUNT_CLASS_TO.putPreloader = putPreloader;\n\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\n elem.classList.remove('tgico-' + icon);\n elem.disabled = true;\n putPreloader(elem);\n\n return () => {\n elem.innerHTML = '';\n elem.classList.add('tgico-' + icon);\n elem.removeAttribute('disabled');\n };\n}\n\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\n Array.from(elements).forEach((el) => {\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\n if(!match) return;\n to[match[1]] = el as HTMLElement;\n });\n} */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getDeepProperty from '../helpers/object/getDeepProperty';\nimport {LangPackKey, _i18n} from '../lib/langPack';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\nimport rootScope from '../lib/rootScope';\n\nexport default class RadioField {\n public input: HTMLInputElement;\n public label: HTMLLabelElement;\n public main: HTMLElement;\n\n constructor(options: {\n text?: string,\n langKey?: LangPackKey,\n name: string,\n value?: string,\n stateKey?: string,\n alignRight?: boolean\n }) {\n const label = this.label = document.createElement('label');\n label.classList.add('radio-field');\n\n if(options.alignRight) {\n label.classList.add('radio-field-right');\n }\n\n const input = this.input = document.createElement('input');\n input.type = 'radio';\n /* input.id = */input.name = 'input-radio-' + options.name;\n\n if(options.value) {\n input.value = options.value;\n\n if(options.stateKey) {\n apiManagerProxy.getState().then((state) => {\n input.checked = getDeepProperty(state, options.stateKey) === options.value;\n });\n\n input.addEventListener('change', () => {\n rootScope.managers.appStateManager.setByKey(options.stateKey, options.value);\n });\n }\n }\n\n const main = this.main = document.createElement('div');\n main.classList.add('radio-field-main');\n\n if(options.text) {\n main.innerHTML = options.text;\n /* const caption = document.createElement('div');\n caption.classList.add('radio-field-main-caption');\n caption.innerHTML = text;\n\n if(subtitle) {\n label.classList.add('radio-field-with-subtitle');\n caption.insertAdjacentHTML('beforeend', `
${subtitle}
`);\n }\n\n main.append(caption); */\n } else if(options.langKey) {\n _i18n(main, options.langKey);\n }\n\n label.append(input, main);\n }\n\n get checked() {\n return this.input.checked;\n }\n\n set checked(checked: boolean) {\n this.setValueSilently(checked);\n\n const event = new Event('change', {bubbles: true, cancelable: true});\n this.input.dispatchEvent(event);\n }\n\n public setValueSilently(checked: boolean) {\n this.input.checked = checked;\n }\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function RadioForm(radios: {container: HTMLElement, input: HTMLInputElement}[], onChange: (value: string, event: Event) => void) {\n const form = document.createElement('form');\n\n radios.forEach((r) => {\n const {container, input} = r;\n form.append(container);\n input.addEventListener('change', (e) => {\n if(input.checked) {\n onChange(input.value, e);\n }\n });\n });\n\n return form;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport attachGrabListeners, {GrabEvent} from '../helpers/dom/attachGrabListeners';\nimport clamp from '../helpers/number/clamp';\nimport safeAssign from '../helpers/object/safeAssign';\n\nexport default class RangeSelector {\n public container: HTMLDivElement;\n protected filled: HTMLDivElement;\n protected seek: HTMLInputElement;\n\n public mousedown = false;\n protected rect: DOMRect;\n protected _removeListeners: () => void;\n\n private events: Partial<{\n // onMouseMove: ProgressLine['onMouseMove'],\n onMouseDown: RangeSelector['onMouseDown'],\n onMouseUp: RangeSelector['onMouseUp'],\n onScrub: (value: number) => void\n }> = {};\n\n protected decimals: number;\n\n protected step: number;\n protected min: number;\n protected max: number;\n protected withTransition = false;\n protected useTransform = false;\n protected vertical = false;\n\n constructor(\n options: {\n step: RangeSelector['step'],\n min: RangeSelector['min'],\n max: RangeSelector['max'],\n withTransition?: RangeSelector['withTransition'],\n useTransform?: RangeSelector['useTransform'],\n vertical?: RangeSelector['vertical']\n },\n value = 0\n ) {\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('progress-line');\n\n // there is no sense in using transition with transform, because it is updating every frame\n if(this.useTransform) {\n this.container.classList.add('use-transform');\n } else if(this.withTransition) {\n this.container.classList.add('with-transition');\n }\n\n this.filled = document.createElement('div');\n this.filled.classList.add('progress-line__filled');\n\n const seek = this.seek = document.createElement('input');\n seek.classList.add('progress-line__seek');\n // seek.setAttribute('max', '0');\n seek.type = 'range';\n seek.step = '' + this.step;\n seek.min = '' + this.min;\n seek.max = '' + this.max;\n seek.value = '' + value;\n\n if(value) {\n this.setProgress(value);\n }\n\n const stepStr = '' + this.step;\n const index = stepStr.indexOf('.');\n this.decimals = index === -1 ? 0 : stepStr.length - index - 1;\n\n // this.setListeners();\n\n this.container.append(this.filled, seek);\n }\n\n get value() {\n return +this.seek.value;\n }\n\n public setHandlers(events: RangeSelector['events']) {\n this.events = events;\n }\n\n protected onMouseMove = (event: GrabEvent) => {\n this.scrub(event);\n };\n\n protected onMouseDown = (event: GrabEvent) => {\n this.rect = this.container.getBoundingClientRect();\n this.mousedown = true;\n this.scrub(event);\n this.container.classList.add('is-focused');\n this.events?.onMouseDown && this.events.onMouseDown(event);\n };\n\n protected onMouseUp = (event: GrabEvent) => {\n this.mousedown = false;\n this.container.classList.remove('is-focused');\n this.events?.onMouseUp && this.events.onMouseUp(event);\n };\n\n public setListeners() {\n this.seek.addEventListener('input', this.onInput);\n this._removeListeners = attachGrabListeners(this.container, this.onMouseDown, this.onMouseMove, this.onMouseUp);\n }\n\n public onInput = () => {\n const value = +this.seek.value;\n this.setFilled(value);\n this.events?.onScrub && this.events.onScrub(value);\n };\n\n public setProgress(value: number) {\n this.seek.value = '' + value;\n this.setFilled(+this.seek.value); // clamp\n }\n\n public addProgress(value: number) {\n this.seek.value = '' + (+this.seek.value + value);\n this.setFilled(+this.seek.value); // clamp\n }\n\n public setFilled(value: number) {\n let percents = (value - this.min) / (this.max - this.min);\n percents = clamp(percents, 0, 1);\n\n // using scaleX and width even with vertical because it will be rotated\n if(this.useTransform) {\n this.filled.style.transform = `scaleX(${percents})`;\n } else {\n this.filled.style.width = (percents * 100) + '%';\n }\n }\n\n protected scrub(event: GrabEvent) {\n const rectMax = this.vertical ? this.rect.height : this.rect.width;\n const offsetAxisValue = clamp(this.vertical ? -(event.y - this.rect.bottom) : event.x - this.rect.left, 0, rectMax);\n\n let value = this.min + (offsetAxisValue / rectMax * (this.max - this.min));\n\n if((value - this.min) < ((this.max - this.min) / 2)) {\n value -= this.step / 10;\n }\n\n value = +value.toFixed(this.decimals);\n value = clamp(value, this.min, this.max);\n\n // this.seek.value = '' + value;\n // this.onInput();\n\n this.setProgress(value);\n this.events?.onScrub && this.events.onScrub(value);\n\n return value;\n }\n\n public removeListeners() {\n if(this._removeListeners) {\n this._removeListeners();\n this._removeListeners = null;\n }\n\n this.seek.removeEventListener('input', this.onInput);\n\n this.events = {};\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport sequentialDom from '../helpers/sequentialDom';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport rootScope from '../lib/rootScope';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport {fastRaf} from '../helpers/schedulers';\n\nlet rippleClickId = 0;\nexport default function ripple(\n elem: HTMLElement,\n callback: (id: number) => Promise = () => Promise.resolve(),\n onEnd: (id: number) => void = null,\n prepend = false,\n attachListenerTo = elem\n) {\n // return;\n if(elem.querySelector('.c-ripple')) return;\n elem.classList.add('rp');\n\n const r = document.createElement('div');\n r.classList.add('c-ripple');\n\n const isSquare = elem.classList.contains('rp-square');\n if(isSquare) {\n r.classList.add('is-square');\n }\n\n elem[prepend ? 'prepend' : 'append'](r);\n\n let handler: () => void;\n // let animationEndPromise: Promise;\n const drawRipple = (clientX: number, clientY: number) => {\n const startTime = Date.now();\n const circle = document.createElement('div');\n\n const clickId = rippleClickId++;\n\n // console.log('ripple drawRipple');\n\n // const auto = elem.classList.contains('row-sortable') && !elem.classList.contains('cant-sort');\n const auto = false;\n const duration = (auto ? .3 : +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '')) * 1000;\n // console.log('ripple duration', duration);\n\n const _handler = handler = () => {\n // handler = () => animationEndPromise.then((duration) => {\n // console.log('ripple animation was:', duration);\n\n // const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\n // return;\n const elapsedTime = Date.now() - startTime;\n const cb = () => {\n // console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\n sequentialDom.mutate(() => {\n circle.remove();\n });\n\n onEnd?.(clickId);\n };\n if(elapsedTime < duration) {\n const delay = Math.max(duration - elapsedTime, duration / 2);\n setTimeout(() => circle.classList.add('hiding'), Math.max(delay - duration / 2, 0));\n\n setTimeout(cb, delay);\n } else {\n circle.classList.add('hiding');\n setTimeout(cb, duration / 2);\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n window.removeEventListener('contextmenu', handler);\n window.removeEventListener('mousemove', handler);\n }\n\n handler = null;\n touchStartFired = false;\n };\n // });\n\n callback?.(clickId);\n\n /* callback().then((bad) => {\n if(bad) {\n span.remove();\n return;\n } */\n\n // console.log('ripple after promise', Date.now() - startTime);\n // console.log('ripple tooSlow:', tooSlow);\n /* if(tooSlow) {\n span.remove();\n return;\n } */\n\n fastRaf(() => {\n if(_handler !== handler) {\n return;\n }\n\n const rect = r.getBoundingClientRect();\n circle.classList.add('c-ripple__circle');\n\n const clickX = clientX - rect.left;\n const clickY = clientY - rect.top;\n\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\n const size = radius;\n\n // center of circle\n const x = clickX - size / 2;\n const y = clickY - size / 2;\n\n // console.log('ripple click', offsetFromCenter, size, clickX, clickY);\n\n circle.style.width = circle.style.height = size + 'px';\n circle.style.left = x + 'px';\n circle.style.top = y + 'px';\n\n // нижний код выполняется с задержкой\n /* animationEndPromise = new Promise((resolve) => {\n span.addEventListener('animationend', () => {\n // 713 -> 700\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\n }, {once: true});\n }); */\n\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\n /* span.style.display = 'none';\n r.append(span);\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\n span.style.display = ''; */\n\n r.append(circle);\n\n if(auto) {\n // window.addEventListener('mousemove', handler, {once: true, passive: true});\n handler();\n }\n\n // r.classList.add('active');\n // handler();\n });\n // });\n };\n\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) ||\n findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\n ) && (\n attachListenerTo === elem ||\n !findUpAsChild(e.target as HTMLElement, attachListenerTo)\n );\n\n // TODO: rename this variable\n let touchStartFired = false;\n if(IS_TOUCH_SUPPORTED) {\n const touchEnd = () => {\n handler?.();\n };\n\n attachListenerTo.addEventListener('touchstart', (e) => {\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n\n // console.log('ripple touchstart', e);\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\n return;\n }\n\n // console.log('touchstart', e);\n touchStartFired = true;\n\n const {clientX, clientY} = e.touches[0];\n drawRipple(clientX, clientY);\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\n\n window.addEventListener('touchmove', (e) => {\n e.cancelBubble = true;\n e.stopPropagation();\n touchEnd();\n attachListenerTo.removeEventListener('touchend', touchEnd);\n }, {once: true});\n }, {passive: true});\n } else {\n attachListenerTo.addEventListener('mousedown', (e) => {\n if(![0, 2].includes(e.button)) { // only left and right buttons\n return;\n }\n\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n // console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\n\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\n return;\n } else if(touchStartFired) {\n touchStartFired = false;\n return;\n }\n\n const {clientX, clientY} = e;\n drawRipple(clientX, clientY);\n window.addEventListener('mouseup', handler, {once: true, passive: true});\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\n }, {passive: true});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CheckboxField, {CheckboxFieldOptions} from './checkboxField';\nimport RadioField from './radioField';\nimport ripple from './ripple';\nimport {SliderSuperTab} from './slider';\nimport RadioForm from './radioForm';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML, {setDirection} from '../helpers/dom/setInnerHTML';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport Button from './button';\nimport createContextMenu from '../helpers/dom/createContextMenu';\n\ntype K = string | HTMLElement | DocumentFragment | true;\n\nconst setContent = (element: HTMLElement, content: K) => {\n if(content === true) {\n\n } else if(typeof(content) === 'string') {\n setInnerHTML(element, content);\n } else {\n element.append(content);\n }\n};\n\nexport type RowMediaSizeType = 'small' | 'medium' | 'big' | 'abitbigger' | 'bigger';\n\nexport default class Row {\n public container: HTMLElement;\n public title: HTMLElement;\n public titleRow: HTMLElement;\n public titleRight: HTMLElement;\n public media: HTMLElement;\n\n public subtitleRow: HTMLElement;\n public subtitleRight: HTMLElement;\n\n public checkboxField: CheckboxField;\n public radioField: RadioField;\n\n public freezed = false;\n\n public buttonRight: HTMLElement;\n\n private _subtitle: HTMLElement;\n private _midtitle: HTMLElement;\n\n constructor(options: Partial<{\n icon: string,\n subtitle: K,\n subtitleLangKey: LangPackKey,\n subtitleLangArgs: any[],\n subtitleRight: K,\n radioField: Row['radioField'],\n checkboxField: Row['checkboxField'],\n checkboxFieldOptions: CheckboxFieldOptions,\n withCheckboxSubtitle: boolean,\n title: K,\n titleLangKey: LangPackKey,\n titleRight: K,\n titleRightSecondary: K,\n clickable: boolean | ((e: Event) => void),\n navigationTab: SliderSuperTab,\n havePadding: boolean,\n noRipple: boolean,\n noWrap: boolean,\n listenerSetter: ListenerSetter,\n buttonRight?: HTMLElement | boolean,\n buttonRightLangKey: LangPackKey,\n asLink: boolean,\n contextMenu: Omit[0], 'findElement' | 'listenTo' | 'listenerSetter'>\n }> = {}) {\n if(options.checkboxFieldOptions) {\n options.checkboxField = new CheckboxField({\n listenerSetter: options.listenerSetter,\n ...options.checkboxFieldOptions\n });\n }\n\n const tagName = options.asLink ? 'a' : (options.radioField || options.checkboxField ? 'label' : 'div');\n this.container = document.createElement(tagName);\n this.container.classList.add('row', 'no-subtitle');\n\n if(options.noWrap) {\n this.container.classList.add('no-wrap');\n }\n\n if(options.subtitle) {\n const subtitle = this.subtitle;\n setContent(subtitle, options.subtitle);\n\n if(options.noWrap) subtitle.classList.add('no-wrap');\n\n if(options.subtitleRight) {\n this.container.append(this.subtitleRow = this.createRow());\n this.subtitleRow.classList.add('row-subtitle-row');\n const subtitleRight = this.subtitleRight = document.createElement('div');\n subtitleRight.classList.add('row-subtitle', 'row-subtitle-right');\n\n setContent(subtitleRight, options.subtitleRight);\n this.subtitleRow.append(subtitle, subtitleRight);\n }\n } else if(options.subtitleLangKey) {\n this.subtitle.append(i18n(options.subtitleLangKey, options.subtitleLangArgs));\n }\n\n let havePadding = !!options.havePadding;\n if(options.radioField || options.checkboxField) {\n if(options.radioField) {\n this.radioField = options.radioField;\n this.container.append(this.radioField.label);\n havePadding = true;\n }\n\n if(options.checkboxField) {\n this.checkboxField = options.checkboxField;\n\n const isToggle = options.checkboxField.label.classList.contains('checkbox-field-toggle');\n if(isToggle) {\n this.container.classList.add('row-with-toggle');\n options.titleRight = this.checkboxField.label;\n } else {\n havePadding = true;\n this.container.append(this.checkboxField.label);\n }\n\n if(options.withCheckboxSubtitle && !isToggle) {\n const onChange = () => {\n replaceContent(this.subtitle, i18n(this.checkboxField.input.checked ? 'Checkbox.Enabled' : 'Checkbox.Disabled'));\n };\n\n if(options.listenerSetter) options.listenerSetter.add(this.checkboxField.input)('change', onChange);\n else this.checkboxField.input.addEventListener('change', onChange);\n }\n }\n\n const i = options.radioField || options.checkboxField;\n i.label.classList.add('disable-hover');\n }\n\n if(options.title || options.titleLangKey) {\n let c: HTMLElement;\n const titleRightContent = options.titleRight || options.titleRightSecondary;\n if(titleRightContent) {\n this.container.append(c = this.titleRow = this.createRow());\n this.titleRow.classList.add('row-title-row');\n } else {\n c = this.container;\n }\n\n this.title = this.createTitle();\n if(options.noWrap) this.title.classList.add('no-wrap');\n if(options.title) {\n setContent(this.title, options.title);\n } else if(options.titleLangKey) {\n this.title.append(i18n(options.titleLangKey));\n }\n\n c.append(this.title);\n\n if(titleRightContent) {\n const titleRight = this.titleRight = document.createElement('div');\n titleRight.classList.add('row-title', 'row-title-right');\n\n if(options.titleRightSecondary) {\n titleRight.classList.add('row-title-right-secondary');\n }\n\n setContent(titleRight, titleRightContent);\n c.append(titleRight);\n }\n }\n\n if(options.icon) {\n havePadding = true;\n // this.title.classList.add('tgico', 'tgico-' + options.icon);\n this.container.classList.add('tgico', 'tgico-' + options.icon);\n this.container.classList.add('row-with-icon');\n }\n\n if(havePadding) {\n this.container.classList.add('row-with-padding');\n }\n\n if(options.navigationTab) {\n options.clickable = () => options.navigationTab.open();\n }\n\n if(options.clickable || options.radioField || options.checkboxField) {\n if(typeof(options.clickable) === 'function') {\n attachClickEvent(this.container, (e) => {\n if(this.freezed) return;\n (options.clickable as any)(e);\n }, {listenerSetter: options.listenerSetter});\n }\n\n this.container.classList.add('row-clickable', 'hover-effect');\n\n if(!options.noRipple) {\n ripple(this.container, undefined, undefined, true);\n }\n\n /* if(options.radioField || options.checkboxField) {\n this.container.prepend(this.container.lastElementChild);\n } */\n }\n\n if(options.buttonRight || options.buttonRightLangKey) {\n this.buttonRight = options.buttonRight instanceof HTMLElement ?\n options.buttonRight :\n Button('btn-primary btn-color-primary', {text: options.buttonRightLangKey});\n this.container.append(this.buttonRight);\n }\n\n if(options.contextMenu) {\n createContextMenu({\n ...options.contextMenu,\n listenTo: this.container,\n listenerSetter: options.listenerSetter\n });\n }\n }\n\n public get subtitle() {\n return this._subtitle ??= this.createSubtitle();\n }\n\n public get midtitle() {\n return this._midtitle ??= this.createMidtitle();\n }\n\n private createRow() {\n const c = document.createElement('div');\n c.classList.add('row-row');\n return c;\n }\n\n private createTitle() {\n const title = document.createElement('div');\n title.classList.add('row-title');\n setDirection(title);\n return title;\n }\n\n private createSubtitle() {\n const subtitle = document.createElement('div');\n subtitle.classList.add('row-subtitle');\n setDirection(subtitle);\n if(this.title) this.title.after(subtitle);\n else this.container.prepend(subtitle);\n this.container.classList.remove('no-subtitle');\n return subtitle;\n }\n\n private createMidtitle() {\n const midtitle = document.createElement('div');\n midtitle.classList.add('row-midtitle');\n this.subtitle.parentElement.insertBefore(midtitle, this.subtitle);\n return midtitle;\n }\n\n public createMedia(size?: RowMediaSizeType) {\n const media = document.createElement('div');\n return this.applyMediaElement(media, size);\n }\n\n public applyMediaElement(media: HTMLElement, size?: RowMediaSizeType) {\n this.container.classList.add('row-with-padding');\n\n this.media = media;\n media.classList.add('row-media');\n\n if(size) {\n media.classList.add('row-media-' + size);\n }\n\n this.container.append(media);\n\n return media;\n }\n\n public disableWithPromise(promise: Promise) {\n this.container.classList.add('is-disabled');\n promise.finally(() => {\n this.container.classList.remove('is-disabled');\n });\n }\n\n public makeSortable() {\n const sortIcon = document.createElement('span');\n this.container.classList.add('row-sortable', 'tgico');\n sortIcon.classList.add('row-sortable-icon', 'tgico-menu');\n this.container.append(sortIcon);\n }\n\n public toggleSorting(enabled?: boolean) {\n this.container.classList.toggle('cant-sort', !enabled);\n }\n}\n\nexport const CreateRowFromCheckboxField = (checkboxField: CheckboxField) => {\n return new Row({checkboxField, listenerSetter: checkboxField.listenerSetter});\n};\n\nexport const RadioFormFromRows = (rows: Row[], onChange: (value: string) => void) => {\n return RadioForm(rows.map((r) => ({container: r.container, input: r.radioField.input})), onChange);\n};\n\nexport const RadioFormFromValues = (values: {langPackKey: LangPackKey, value: number | string, checked?: boolean}[], onChange: Parameters[1]) => {\n const name = 'name-' + (Math.random() * 0x7FFFFF | 0);\n let checkedRadioField: RadioField;\n const rows = values.map(({langPackKey, value, checked}) => {\n const row = new Row({\n radioField: new RadioField({\n langKey: langPackKey,\n name,\n value: '' + value\n })\n });\n\n if(checked) {\n checkedRadioField = row.radioField;\n }\n\n return row;\n });\n\n const form = RadioFormFromRows(rows, onChange);\n if(checkedRadioField) {\n checkedRadioField.checked = true;\n }\n return form;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {logger, LogTypes} from '../lib/logger';\nimport fastSmoothScroll, {ScrollOptions} from '../helpers/fastSmoothScroll';\nimport useHeavyAnimationCheck from '../hooks/useHeavyAnimationCheck';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {IS_ANDROID} from '../environment/userAgent';\n/*\nvar el = $0;\nvar height = 0;\nvar checkUp = false;\n\ndo {\n height += el.scrollHeight;\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\nconsole.log(height);\n*/\n\n/*\nArray.from($0.querySelectorAll('.bubble-content')).forEach((_el) => {\n //_el.style.display = '';\n //return;\n\n let el = _el.parentElement;\n let height = el.scrollHeight;\n let width = el.scrollWidth;\n el.style.width = width + 'px';\n el.style.height = height + 'px';\n _el.style.display = 'none';\n});\n*/\n\n/* const scrollables: Map = new Map();\nconst scrollsIntersector = new IntersectionObserver((entries) => {\n for(let entry of entries) {\n const scrollable = scrollables.get(entry.target as HTMLElement);\n\n if(entry.isIntersecting) {\n scrollable.isVisible = true;\n } else {\n scrollable.isVisible = false;\n\n if(!isInDOM(entry.target)) {\n scrollsIntersector.unobserve(scrollable.container);\n scrollables.delete(scrollable.container);\n }\n }\n }\n}); */\n\nconst SCROLL_THROTTLE = /* IS_ANDROID ? 200 : */24;\n\nexport class ScrollableBase {\n protected log: ReturnType;\n\n public splitUp: HTMLElement;\n public onScrollMeasure: number = 0;\n\n public lastScrollPosition: number = 0;\n public lastScrollDirection: number = 0;\n\n public onAdditionalScroll: () => void;\n public onScrolledTop: () => void;\n public onScrolledBottom: () => void;\n\n public isHeavyAnimationInProgress = false;\n protected needCheckAfterAnimation = false;\n\n public checkForTriggers?: () => void;\n\n public scrollProperty: 'scrollTop' | 'scrollLeft';\n\n protected removeHeavyAnimationListener: () => void;\n protected addedScrollListener: boolean;\n\n constructor(public el?: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\n this.container.classList.add('scrollable');\n\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\n\n if(el) {\n Array.from(el.children).forEach((c) => this.container.append(c));\n\n el.append(this.container);\n }\n // this.onScroll();\n }\n\n public addScrollListener() {\n if(this.addedScrollListener) {\n return;\n }\n\n this.addedScrollListener = true;\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\n }\n\n public removeScrollListener() {\n if(!this.addedScrollListener) {\n return;\n }\n\n this.addedScrollListener = false;\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\n }\n\n public setListeners() {\n if(this.removeHeavyAnimationListener) {\n return;\n }\n\n window.addEventListener('resize', this.onScroll, {passive: true});\n this.addScrollListener();\n\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\n this.isHeavyAnimationInProgress = true;\n\n if(this.onScrollMeasure) {\n this.cancelMeasure();\n this.needCheckAfterAnimation = true;\n }\n }, () => {\n this.isHeavyAnimationInProgress = false;\n\n if(this.needCheckAfterAnimation) {\n this.onScroll();\n this.needCheckAfterAnimation = false;\n }\n });\n }\n\n public removeListeners() {\n if(!this.removeHeavyAnimationListener) {\n return;\n }\n\n window.removeEventListener('resize', this.onScroll);\n this.removeScrollListener();\n\n this.removeHeavyAnimationListener();\n this.removeHeavyAnimationListener = undefined;\n }\n\n public destroy() {\n this.removeListeners();\n this.onAdditionalScroll = undefined;\n this.onScrolledTop = undefined;\n this.onScrolledBottom = undefined;\n }\n\n public append(element: HTMLElement) {\n this.container.append(element);\n }\n\n public scrollIntoViewNew(options: Omit) {\n // return Promise.resolve();\n // this.removeListeners();\n return fastSmoothScroll({\n ...options,\n container: this.container\n });/* .finally(() => {\n this.setListeners();\n }); */\n }\n\n public onScroll = () => {\n // if(this.debug) {\n // this.log('onScroll call', this.onScrollMeasure);\n // }\n\n // return;\n\n if(this.isHeavyAnimationInProgress) {\n this.cancelMeasure();\n this.needCheckAfterAnimation = true;\n return;\n }\n\n // if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\n if(this.onScrollMeasure) return;\n // if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\n // this.onScrollMeasure = window.requestAnimationFrame(() => {\n this.onScrollMeasure = window.setTimeout(() => {\n this.onScrollMeasure = 0;\n\n const scrollPosition = this.container[this.scrollProperty];\n this.lastScrollDirection = this.lastScrollPosition === scrollPosition ? 0 : (this.lastScrollPosition < scrollPosition ? 1 : -1); // * 1 - bottom, -1 - top\n this.lastScrollPosition = scrollPosition;\n\n // lastScrollDirection check is useless here, every callback should decide on its own\n if(this.onAdditionalScroll/* && this.lastScrollDirection !== 0 */) {\n this.onAdditionalScroll();\n }\n\n if(this.checkForTriggers) {\n this.checkForTriggers();\n }\n // });\n }, SCROLL_THROTTLE);\n };\n\n public cancelMeasure() {\n if(this.onScrollMeasure) {\n // window.cancelAnimationFrame(this.onScrollMeasure);\n clearTimeout(this.onScrollMeasure);\n this.onScrollMeasure = 0;\n }\n }\n}\n\nexport type SliceSides = 'top' | 'bottom';\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\n\nexport default class Scrollable extends ScrollableBase {\n public padding: HTMLElement;\n\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\n\n constructor(el?: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\n super(el, logPrefix);\n\n /* if(withPaddingContainer) {\n this.padding = document.createElement('div');\n this.padding.classList.add('scrollable-padding');\n Array.from(this.container.children).forEach((c) => this.padding.append(c));\n this.container.append(this.padding);\n } */\n\n this.container.classList.add('scrollable-y');\n this.setListeners();\n this.scrollProperty = 'scrollTop';\n }\n\n public attachBorderListeners(setClassOn = this.container) {\n const cb = this.onAdditionalScroll;\n this.onAdditionalScroll = () => {\n cb?.();\n setClassOn.classList.toggle('scrolled-top', !this.scrollTop);\n setClassOn.classList.toggle('scrolled-bottom', this.isScrolledDown);\n };\n\n setClassOn.classList.add('scrolled-top', 'scrolled-bottom', 'scrollable-y-bordered');\n }\n\n public setVirtualContainer(el?: HTMLElement) {\n this.splitUp = el;\n this.log('setVirtualContainer:', el, this);\n }\n\n public checkForTriggers = () => {\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\n\n if(this.isHeavyAnimationInProgress) {\n this.onScroll();\n return;\n }\n\n const scrollHeight = this.container.scrollHeight;\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\n return;\n }\n\n const clientHeight = this.container.clientHeight;\n const maxScrollTop = scrollHeight - clientHeight;\n const scrollTop = this.lastScrollPosition;\n\n // this.log('checkForTriggers:', scrollTop, maxScrollTop);\n\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\n this.onScrolledTop();\n }\n\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\n this.onScrolledBottom();\n }\n };\n\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\n (this.splitUp || this.padding || this.container).prepend(...elements);\n }\n\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\n (this.splitUp || this.padding || this.container).append(...elements);\n }\n\n public getDistanceToEnd() {\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\n }\n\n get isScrolledDown() {\n return this.getDistanceToEnd() <= 1;\n }\n\n set scrollTop(y: number) {\n this.container.scrollTop = y;\n }\n\n get scrollTop() {\n // this.log.trace('get scrollTop');\n return this.container.scrollTop;\n }\n\n public setScrollTopSilently(value: number) {\n this.lastScrollPosition = value;\n this.ignoreNextScrollEvent();\n\n this.scrollTop = value;\n }\n\n public ignoreNextScrollEvent() {\n if(this.removeHeavyAnimationListener) {\n this.removeScrollListener();\n this.container.addEventListener('scroll', (e) => {\n cancelEvent(e);\n this.addScrollListener();\n }, {capture: true, passive: false, once: true});\n }\n }\n\n get scrollHeight() {\n return this.container.scrollHeight;\n }\n}\n\nexport class ScrollableX extends ScrollableBase {\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\n super(el, logPrefix, container);\n\n this.container.classList.add('scrollable-x');\n\n if(!IS_TOUCH_SUPPORTED) {\n const scrollHorizontally = (e: any) => {\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\n this.container.scrollLeft += e.deltaY / 4;\n cancelEvent(e);\n }\n };\n\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\n }\n\n this.scrollProperty = 'scrollLeft';\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {LangPackKey, FormatterArguments, i18n_} from '../lib/langPack';\nimport {generateDelimiter} from './generateDelimiter';\nimport Scrollable from './scrollable';\n\nexport type SettingSectionOptions = {\n name?: LangPackKey,\n nameArgs?: FormatterArguments,\n caption?: LangPackKey | true,\n captionArgs?: FormatterArguments,\n captionOld?: SettingSectionOptions['caption'],\n noDelimiter?: boolean,\n fakeGradientDelimiter?: boolean,\n noShadow?: boolean,\n // fullWidth?: boolean,\n // noPaddingTop?: boolean\n};\n\nconst className = 'sidebar-left-section';\nexport default class SettingSection {\n public container: HTMLElement;\n public innerContainer: HTMLElement;\n public content: HTMLElement;\n public title: HTMLElement;\n public caption: HTMLElement;\n\n private fullWidth: boolean;\n\n constructor(options: SettingSectionOptions = {}) {\n const container = this.container = document.createElement('div');\n container.classList.add(className + '-container');\n\n const innerContainer = this.innerContainer = document.createElement('div');\n innerContainer.classList.add(className);\n\n if(options.noShadow) {\n innerContainer.classList.add('no-shadow');\n }\n\n if(options.fakeGradientDelimiter) {\n innerContainer.append(generateDelimiter());\n innerContainer.classList.add('with-fake-delimiter');\n } else if(!options.noDelimiter) {\n const hr = document.createElement('hr');\n innerContainer.append(hr);\n } else {\n innerContainer.classList.add('no-delimiter');\n }\n\n // if(options.fullWidth) {\n // this.fullWidth = true;\n // }\n\n // if(options.noPaddingTop) {\n // innerContainer.classList.add('no-padding-top');\n // }\n\n const content = this.content = this.generateContentElement();\n\n if(options.name) {\n const title = this.title = document.createElement('div');\n title.classList.add('sidebar-left-h2', className + '-name');\n i18n_({element: title, key: options.name, args: options.nameArgs});\n content.append(title);\n }\n\n container.append(innerContainer);\n\n const caption = options.caption ?? options.captionOld;\n if(caption) {\n const el = this.caption = this.generateContentElement();\n el.classList.add(className + '-caption');\n\n if(!options.captionOld) {\n container.append(el);\n }\n\n if(caption !== true) {\n i18n_({element: el, key: caption, args: options.captionArgs});\n }\n }\n }\n\n public generateContentElement() {\n const content = document.createElement('div');\n content.classList.add(className + '-content');\n\n // if(this.fullWidth) {\n // content.classList.add('full-width');\n // }\n\n this.innerContainer.append(content);\n return content;\n }\n}\n\nexport const generateSection = (appendTo: Scrollable, name?: LangPackKey, caption?: LangPackKey) => {\n const section = new SettingSection({name, caption});\n appendTo.append(section.container);\n return section.content;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputFile} from '../../../layer';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport InputField from '../../inputField';\nimport {SliderSuperTab} from '../../slider';\nimport AvatarEdit from '../../avatarEdit';\nimport I18n from '../../../lib/langPack';\nimport ButtonCorner from '../../buttonCorner';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\ninterface OpenStreetMapInterface {\n place_id?: number;\n license?: string;\n osm_type?: string;\n osm_id?: number;\n lat?: string;\n lon?: string;\n display_name: string;\n address?: object;\n boundingbox?: object;\n}\n\nexport default class AppNewGroupTab extends SliderSuperTab {\n private avatarEdit: AvatarEdit;\n private uploadAvatar: () => Promise = null;\n private peerIds: PeerId[];\n private isGeoChat: boolean = false;\n private nextBtn: HTMLButtonElement;\n private groupNameInputField: InputField;\n private list: HTMLUListElement;\n private groupLocationInputField: InputField;\n private userLocationCoords: {lat: number, long: number};\n private userLocationAddress: string;\n\n public init(\n peerIds: PeerId[],\n isGeoChat: boolean = false\n ) {\n this.isGeoChat = isGeoChat;\n this.peerIds = peerIds;\n\n this.container.classList.add('new-group-container');\n this.setTitle('NewGroup');\n\n this.avatarEdit = new AvatarEdit((_upload) => {\n this.uploadAvatar = _upload;\n });\n\n const section = new SettingSection({});\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.groupNameInputField = new InputField({\n label: 'CreateGroup.NameHolder',\n maxLength: 128\n });\n\n this.groupLocationInputField = new InputField({\n label: 'ChatLocation',\n name: 'location',\n canBeEdited: false\n });\n\n inputWrapper.append(\n this.groupNameInputField.container,\n this.groupLocationInputField.container\n );\n\n this.listenerSetter.add(this.groupNameInputField.input)('input', () => {\n const value = this.groupNameInputField.value;\n let valueCheck = !!value.length && !this.groupNameInputField.input.classList.contains('error');\n if(this.isGeoChat) valueCheck = valueCheck && !!this.userLocationCoords && !!this.userLocationAddress;\n this.nextBtn.classList.toggle('is-visible', !!valueCheck);\n });\n\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\n\n attachClickEvent(this.nextBtn, () => {\n const title = this.groupNameInputField.value;\n\n let promise: Promise;\n if(this.isGeoChat) {\n if(!this.userLocationAddress || !this.userLocationCoords) return;\n promise = this.managers.appChatsManager.createChannel({\n title,\n about: '',\n geo_point: {\n _: 'inputGeoPoint',\n ...this.userLocationCoords\n },\n address: this.userLocationAddress,\n megagroup: true\n }).then((chatId) => {\n if(this.uploadAvatar) {\n this.uploadAvatar().then((inputFile) => {\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\n });\n }\n\n if(this.peerIds.length) {\n this.managers.appChatsManager.inviteToChannel(chatId, this.peerIds);\n }\n\n return chatId;\n });\n } else {\n this.nextBtn.disabled = true;\n promise = this.managers.appChatsManager.createChat(title, this.peerIds.map((peerId) => peerId.toUserId())).then((chatId) => {\n if(this.uploadAvatar) {\n this.uploadAvatar().then((inputFile) => {\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\n });\n }\n\n return chatId;\n });\n }\n\n if(!promise) {\n return;\n }\n\n promise.then((chatId) => {\n this.close();\n\n appImManager.setInnerPeer({peerId: chatId.toPeerId(true)});\n });\n }, {listenerSetter: this.listenerSetter});\n\n const chatsSection = new SettingSection({\n name: 'Members',\n nameArgs: [this.peerIds.length]\n });\n\n const list = this.list = appDialogsManager.createChatList({\n new: true\n });\n\n chatsSection.content.append(list);\n\n section.content.append(this.avatarEdit.container, inputWrapper);\n\n this.content.append(this.nextBtn);\n this.scrollable.append(section.container, chatsSection.container);\n\n if(isGeoChat) {\n this.setTitle('NearbyCreateGroup');\n this.groupLocationInputField.container.classList.remove('hide');\n this.groupLocationInputField.setValueSilently(I18n.format('Loading', true));\n this.startLocating();\n } else {\n this.groupLocationInputField.container.classList.add('hide');\n }\n\n return Promise.all(this.peerIds.map(async(userId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: userId,\n container: this.list,\n rippleEnabled: false,\n avatarSize: 'abitbigger'\n });\n\n dom.lastMessageSpan.append(getUserStatusString(await this.managers.appUsersManager.getUser(userId)));\n }));\n }\n\n public onCloseAfterTimeout() {\n this.avatarEdit.clear();\n this.uploadAvatar = null;\n this.groupNameInputField.value = '';\n this.groupLocationInputField.container.classList.add('hide');\n this.nextBtn.disabled = false;\n }\n\n private startLocating() {\n navigator.geolocation.getCurrentPosition((location) => {\n this.userLocationCoords = {\n lat: location.coords.latitude,\n long: location.coords.longitude\n };\n\n let uri = 'https://nominatim.openstreetmap.org/reverse';\n uri += '?lat='+location.coords.latitude;\n uri += '&lon='+location.coords.longitude;\n uri += '&format=json';\n uri += '&addressdetails=1';\n uri += '&accept-language=en';\n fetch(uri)\n .then((response) => response.json())\n .then((response: OpenStreetMapInterface) => {\n this.userLocationAddress = response.display_name;\n this.groupLocationInputField.setValueSilently(response.display_name);\n });\n }, (error) => {\n if(error instanceof GeolocationPositionError) {\n this.groupLocationInputField.setValueSilently('Location permission denied. Please retry later.');\n } else {\n this.groupLocationInputField.setValueSilently('An error has occurred. Please retry later.');\n }\n });\n }\n}\n","enum PrivacyType {\n Everybody = 2,\n Contacts = 1,\n Nobody = 0\n}\n\nexport default PrivacyType;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PrivacyRule} from '../../../../layer';\nimport PrivacyType from './privacyType';\n\nexport default function getPrivacyRulesDetails(rules: PrivacyRule[]) {\n const types: PrivacyType[] = [];\n\n type peers = {users: UserId[], chats: ChatId[]};\n const allowPeers: peers = {users: [], chats: []}, disallowPeers: peers = {users: [], chats: []};\n rules.forEach((rule) => {\n switch(rule._) {\n case 'privacyValueAllowAll':\n types.push(2);\n break;\n case 'privacyValueDisallowAll':\n types.push(0);\n break;\n case 'privacyValueAllowContacts':\n types.push(1);\n break;\n /* case 'privacyValueDisallowContacts':\n types.push('Except My Contacts');\n break; */\n case 'privacyValueAllowChatParticipants':\n allowPeers.chats.push(...rule.chats);\n break;\n case 'privacyValueAllowUsers':\n allowPeers.users.push(...rule.users);\n break;\n case 'privacyValueDisallowChatParticipants':\n disallowPeers.chats.push(...rule.chats);\n break;\n case 'privacyValueDisallowUsers':\n disallowPeers.users.push(...rule.users);\n break;\n }\n });\n\n return {type: types[0], disallowPeers, allowPeers};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {randomLong} from '../helpers/random';\nimport {InputPrivacyKey, InputPrivacyRule} from '../layer';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getPrivacyRulesDetails from '../lib/appManagers/utils/privacy/getPrivacyRulesDetails';\nimport PrivacyType from '../lib/appManagers/utils/privacy/privacyType';\nimport {i18n, join, LangPackKey, _i18n} from '../lib/langPack';\nimport RadioField from './radioField';\nimport Row, {RadioFormFromRows} from './row';\nimport Scrollable from './scrollable';\nimport SettingSection, {generateSection} from './settingSection';\nimport AppAddMembersTab from './sidebarLeft/tabs/addMembers';\nimport {SliderSuperTabEventable} from './sliderTab';\n\nexport type PrivacySectionStr = LangPackKey | '' | HTMLElement;\nexport default class PrivacySection {\n public radioRows: Map;\n public radioSection: SettingSection;\n public exceptions: Map;\n public peerIds: {\n disallow?: PeerId[],\n allow?: PeerId[]\n };\n public type: PrivacyType;\n\n constructor(public options: {\n tab: SliderSuperTabEventable,\n title: LangPackKey,\n inputKey: InputPrivacyKey['_'],\n captions?: [PrivacySectionStr, PrivacySectionStr, PrivacySectionStr],\n appendTo?: Scrollable,\n noExceptions?: boolean,\n onRadioChange?: (value: number) => any,\n skipTypes?: PrivacyType[],\n exceptionTexts?: [LangPackKey, LangPackKey],\n managers: AppManagers\n }) {\n if(options.captions) {\n options.captions.reverse();\n }\n\n const managers = options.managers;\n\n this.radioSection = new SettingSection({name: options.title, caption: true});\n\n this.radioRows = new Map();\n\n let r: Array<{type: PrivacyType, langKey: LangPackKey}> = [{\n type: PrivacyType.Everybody,\n langKey: 'PrivacySettingsController.Everbody'\n }, {\n type: PrivacyType.Contacts,\n langKey: 'PrivacySettingsController.MyContacts'\n }, {\n type: PrivacyType.Nobody,\n langKey: 'PrivacySettingsController.Nobody'\n }];\n\n if(options.skipTypes) {\n r = r.filter((r) => !options.skipTypes.includes(r.type));\n }\n\n const random = randomLong();\n r.forEach(({type, langKey}) => {\n const row = new Row({\n radioField: new RadioField({\n langKey,\n name: random,\n value: '' + type\n })\n });\n\n this.radioRows.set(type, row);\n });\n\n const form = RadioFormFromRows([...this.radioRows.values()], this.onRadioChange);\n\n this.radioSection.content.append(form);\n if(options.appendTo) {\n options.appendTo.append(this.radioSection.container);\n }\n\n if(!options.noExceptions) {\n const container = generateSection(options.appendTo, 'PrivacyExceptions', 'PrivacySettingsController.PeerInfo');\n\n this.exceptions = new Map([[\n 'disallow',\n {\n titleLangKey: options.exceptionTexts[0],\n key: 'disallow',\n row: null,\n icon: 'deleteuser',\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\n clickable: true\n }\n ], [\n 'allow',\n {\n titleLangKey: options.exceptionTexts[1],\n key: 'allow',\n row: null,\n icon: 'adduser',\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\n clickable: true\n }\n ]]);\n\n this.exceptions.forEach((exception) => {\n exception.row = new Row(exception);\n\n exception.row.container.addEventListener('click', () => {\n promise.then(() => {\n const _peerIds = this.peerIds[exception.key];\n options.tab.slider.createTab(AppAddMembersTab).open({\n type: 'privacy',\n skippable: true,\n title: exception.titleLangKey,\n placeholder: 'PrivacyModal.Search.Placeholder',\n takeOut: (newPeerIds) => {\n _peerIds.length = 0;\n _peerIds.push(...newPeerIds);\n exception.row.subtitle.innerHTML = '';\n exception.row.subtitle.append(...this.generateStr(this.splitPeersByType(newPeerIds)));\n },\n selectedPeerIds: _peerIds\n });\n });\n });\n\n container.append(exception.row.container);\n });\n }\n\n /* setTimeout(() => {\n this.setRadio(PrivacyType.Contacts);\n }, 0); */\n\n const promise = managers.appPrivacyManager.getPrivacy(options.inputKey).then((rules) => {\n const details = getPrivacyRulesDetails(rules);\n this.setRadio(details.type);\n\n if(this.exceptions) {\n this.peerIds = {};\n ['allow' as const, 'disallow' as const].forEach((k) => {\n const arr = [];\n const from = k === 'allow' ? details.allowPeers : details.disallowPeers;\n arr.push(...from.users.map((id) => id.toPeerId()));\n arr.push(...from.chats.map((id) => id.toPeerId(true)));\n this.peerIds[k] = arr;\n const s = this.exceptions.get(k).row.subtitle;\n s.innerHTML = '';\n s.append(...this.generateStr(from));\n });\n }\n\n options.tab.eventListener.addEventListener('destroy', async() => {\n const rules: InputPrivacyRule[] = [];\n\n switch(this.type) {\n case PrivacyType.Everybody:\n rules.push({_: 'inputPrivacyValueAllowAll'});\n break;\n case PrivacyType.Contacts:\n rules.push({_: 'inputPrivacyValueAllowContacts'});\n break;\n case PrivacyType.Nobody:\n rules.push({_: 'inputPrivacyValueDisallowAll'});\n break;\n }\n\n if(this.exceptions) {\n const a = ([\n ['allow', 'inputPrivacyValueAllowChatParticipants', 'inputPrivacyValueAllowUsers'],\n ['disallow', 'inputPrivacyValueDisallowChatParticipants', 'inputPrivacyValueDisallowUsers']\n ] as Array<[\n 'allow' | 'disallow',\n 'inputPrivacyValueAllowChatParticipants' | 'inputPrivacyValueDisallowChatParticipants',\n 'inputPrivacyValueAllowUsers' | 'inputPrivacyValueDisallowUsers'\n ]>);\n for(const [k, chatKey, usersKey] of a) {\n if(this.exceptions.get(k).row.container.classList.contains('hide')) {\n continue;\n }\n\n const _peerIds = this.peerIds[k];\n if(_peerIds) {\n const splitted = this.splitPeersByType(_peerIds);\n if(splitted.chats.length) {\n rules.push({_: chatKey, chats: splitted.chats});\n }\n\n if(splitted.users.length) {\n rules.push({\n _: usersKey,\n users: await Promise.all(splitted.users.map((id) => managers.appUsersManager.getUserInput(id)))\n });\n }\n }\n }\n }\n\n managers.appPrivacyManager.setPrivacy(options.inputKey, rules);\n }, {once: true});\n });\n }\n\n private onRadioChange = (value: string | PrivacySection['type']) => {\n value = +value as PrivacySection['type'];\n this.type = value;\n\n const caption = this.options.captions[this.type];\n const captionElement = this.radioSection.caption;\n if(!caption) {\n captionElement.innerHTML = '';\n } else if(caption instanceof HTMLElement) {\n replaceContent(captionElement, caption);\n } else {\n _i18n(captionElement, caption);\n }\n captionElement.classList.toggle('hide', !caption);\n\n if(this.exceptions) {\n this.exceptions.get('allow').row.container.classList.toggle('hide', this.type === PrivacyType.Everybody);\n this.exceptions.get('disallow').row.container.classList.toggle('hide', this.type === PrivacyType.Nobody);\n }\n\n this.options.onRadioChange && this.options.onRadioChange(value);\n };\n\n public setRadio(type: PrivacySection['type']) {\n const row = this.radioRows.get(type);\n this.onRadioChange(type);\n row.radioField.input.checked = true;\n }\n\n private splitPeersByType(peerIds: PeerId[]) {\n const peers = {users: [] as UserId[], chats: [] as ChatId[]};\n peerIds.forEach((peerId) => {\n peers[peerId.isAnyChat() ? 'chats' : 'users'].push(peerId.isAnyChat() ? peerId.toChatId() : peerId);\n });\n\n return peers;\n }\n\n private generateStr(peers: {users: UserId[], chats: ChatId[]}) {\n if(!peers.users.length && !peers.chats.length) {\n return [i18n('PrivacySettingsController.AddUsers')];\n }\n\n return join([\n peers.users.length ? i18n('Users', [peers.users.length]) : null,\n peers.chats.length ? i18n('Chats', [peers.chats.length]) : null\n ].filter(Boolean), false);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {i18n, LangPackKey} from '../../../../lib/langPack';\nimport anchorCopy from '../../../../helpers/dom/anchorCopy';\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\n\nexport default class AppPrivacyPhoneNumberTab extends SliderSuperTabEventable {\n public async init() {\n this.container.classList.add('privacy-tab', 'privacy-phone-number');\n this.setTitle('PrivacyPhone');\n\n const formatted = '+' + (await this.managers.appUsersManager.getSelf()).phone;\n const captionEl = document.createElement('div');\n captionEl.append(\n i18n('PrivacyPhoneInfo'),\n document.createElement('br'),\n document.createElement('br'),\n i18n('PrivacyPhoneInfo4'),\n document.createElement('br'),\n anchorCopy({\n mePath: formatted\n })\n );\n\n const phoneSection = new PrivacySection({\n tab: this,\n title: 'PrivacyPhoneTitle',\n inputKey: 'inputPrivacyKeyPhoneNumber',\n captions: [captionEl, captionEl, ''],\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\n appendTo: this.scrollable,\n onRadioChange: (type) => {\n s.setRadio(PrivacyType.Everybody);\n s.radioSection.container.classList.toggle('hide', type !== PrivacyType.Nobody);\n },\n managers: this.managers\n });\n\n const sCaption: LangPackKey = 'PrivacyPhoneInfo3';\n const s = new PrivacySection({\n tab: this,\n title: 'PrivacyPhoneTitle2',\n inputKey: 'inputPrivacyKeyAddedByPhone',\n captions: [sCaption, sCaption, ''],\n noExceptions: true,\n skipTypes: [PrivacyType.Nobody],\n managers: this.managers\n });\n\n this.scrollable.container.insertBefore(s.radioSection.container, phoneSection.radioSection.container.nextSibling);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport Button from '../../../button';\nimport SettingSection from '../../../settingSection';\nimport {SliderSuperTab} from '../../../slider';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport AppSettingsTab from '../settings';\n\nexport default class AppTwoStepVerificationSetTab extends SliderSuperTab {\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-set');\n this.setTitle('TwoStepVerificationPasswordSet');\n\n const section = new SettingSection({\n captionOld: 'TwoStepVerificationPasswordSetInfo',\n noDelimiter: true\n });\n\n const emoji = '🥳';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n emoji,\n div: stickerContainer,\n width: 160,\n height: 160\n });\n\n section.content.append(stickerContainer);\n\n const inputContent = section.generateContentElement();\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const btnReturn = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationPasswordReturnSettings'});\n\n attachClickEvent(btnReturn, (e) => {\n this.close();\n });\n\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\n\n inputWrapper.append(btnReturn);\n\n inputContent.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\n\nexport function canFocus(isFirstInput: boolean) {\n return !IS_MOBILE_SAFARI || !isFirstInput;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport {SliderSuperTab} from '../../../slider';\nimport AppTwoStepVerificationSetTab from './passwordSet';\nimport CodeInputField from '../../../codeInputField';\nimport AppTwoStepVerificationEmailTab from './email';\nimport {putPreloader} from '../../../putPreloader';\nimport {i18n, _i18n} from '../../../../lib/langPack';\nimport {canFocus} from '../../../../helpers/dom/canFocus';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../../helpers/dom/replaceContent';\nimport toggleDisability from '../../../../helpers/dom/toggleDisability';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationEmailConfirmationTab extends SliderSuperTab {\n public codeInputField: CodeInputField;\n public state: AccountPassword;\n public email: string;\n public length: number;\n public isFirst = false;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-email-confirmation');\n this.setTitle('TwoStepAuth.RecoveryTitle');\n\n const section = new SettingSection({\n captionOld: true,\n noDelimiter: true\n });\n\n _i18n(section.caption, 'TwoStepAuth.ConfirmEmailCodeDesc', [this.email]);\n\n const emoji = '📬';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n div: stickerContainer,\n width: 160,\n height: 160,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const inputContent = section.generateContentElement();\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const inputField = this.codeInputField = new CodeInputField({\n name: 'recovery-email-code',\n label: 'TwoStepAuth.RecoveryCode',\n length: this.length,\n onFill: (code) => {\n freeze(true);\n\n this.managers.passwordManager.confirmPasswordEmail('' + code)\n .then((value) => {\n if(!value) {\n\n }\n\n goNext();\n })\n .catch((err) => {\n switch(err.type) {\n case 'CODE_INVALID':\n inputField.input.classList.add('error');\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeInvalid'));\n break;\n\n case 'EMAIL_HASH_EXPIRED':\n inputField.input.classList.add('error');\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeExpired'));\n break;\n\n default:\n console.error('confirm error', err);\n break;\n }\n\n freeze(false);\n });\n }\n });\n\n const btnChange = Button('btn-primary btn-primary-transparent primary', {text: 'TwoStepAuth.EmailCodeChangeEmail'});\n const btnResend = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'ResendCode'});\n\n const goNext = () => {\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\n };\n\n const freeze = (disable: boolean) => {\n toggleDisability([inputField.input, btnChange, btnResend], disable);\n };\n\n attachClickEvent(btnChange, (e) => {\n freeze(true);\n this.managers.passwordManager.cancelPasswordEmail().then((value) => {\n this.slider.sliceTabsUntilTab(AppTwoStepVerificationEmailTab, this);\n this.close();\n }, () => {\n freeze(false);\n });\n });\n\n attachClickEvent(btnResend, (e) => {\n freeze(true);\n const d = putPreloader(btnResend);\n this.managers.passwordManager.resendPasswordEmail().then((value) => {\n d.remove();\n freeze(false);\n });\n });\n\n inputWrapper.append(inputField.container, btnChange, btnResend);\n\n inputContent.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n\n onOpenAfterTimeout() {\n if(!canFocus(this.isFirst)) return;\n this.codeInputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport {SliderSuperTab} from '../../../slider';\nimport InputField from '../../../inputField';\nimport {putPreloader} from '../../../putPreloader';\nimport AppTwoStepVerificationSetTab from './passwordSet';\nimport AppTwoStepVerificationEmailConfirmationTab from './emailConfirmation';\nimport PopupPeer from '../../../popups/peer';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {canFocus} from '../../../../helpers/dom/canFocus';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport matchEmail from '../../../../lib/richTextProcessor/matchEmail';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationEmailTab extends SliderSuperTab {\n public inputField: InputField;\n public state: AccountPassword;\n public plainPassword: string;\n public newPassword: string;\n public hint: string;\n public isFirst = false;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-email');\n this.setTitle('RecoveryEmailTitle');\n\n const section = new SettingSection({\n captionOld: true,\n noDelimiter: true\n });\n\n const emoji = '💌';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n div: stickerContainer,\n width: 160,\n height: 160,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const inputContent = section.generateContentElement();\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const inputField = this.inputField = new InputField({\n name: 'recovery-email',\n label: 'RecoveryEmail',\n plainText: true\n });\n\n inputField.input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n cancelEvent(e);\n return onContinueClick();\n }\n });\n\n inputField.input.addEventListener('input', (e) => {\n inputField.input.classList.remove('error');\n });\n\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\n\n const goNext = () => {\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\n };\n\n const onContinueClick = () => {\n const email = inputField.value.trim();\n const match = matchEmail(email);\n if(!match || match[0].length !== email.length) {\n inputField.input.classList.add('error');\n return;\n }\n\n toggleButtons(true);\n const d = putPreloader(btnContinue);\n\n this.managers.passwordManager.updateSettings({\n hint: this.hint,\n currentPassword: this.plainPassword,\n newPassword: this.newPassword,\n email\n }).then((value) => {\n goNext();\n }, (err) => {\n if(err.type.includes('EMAIL_UNCONFIRMED')) {\n const symbols = +err.type.match(/^EMAIL_UNCONFIRMED_(\\d+)/)[1];\n\n const tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\n tab.state = this.state;\n tab.email = email;\n tab.length = symbols;\n tab.open();\n } else {\n console.log('password set error', err);\n }\n\n toggleButtons(false);\n d.remove();\n });\n };\n attachClickEvent(btnContinue, onContinueClick);\n\n const toggleButtons = (freeze: boolean) => {\n if(freeze) {\n btnContinue.setAttribute('disabled', 'true');\n btnSkip.setAttribute('disabled', 'true');\n } else {\n btnContinue.removeAttribute('disabled');\n btnSkip.removeAttribute('disabled');\n }\n };\n\n attachClickEvent(btnSkip, (e) => {\n const popup = new PopupPeer('popup-skip-email', {\n buttons: [{\n langKey: 'Cancel',\n isCancel: true\n }, {\n langKey: 'YourEmailSkip',\n callback: () => {\n // inputContent.classList.add('sidebar-left-section-disabled');\n toggleButtons(true);\n putPreloader(btnSkip);\n this.managers.passwordManager.updateSettings({\n hint: this.hint,\n currentPassword: this.plainPassword,\n newPassword: this.newPassword,\n email: ''\n }).then(() => {\n goNext();\n }, (err) => {\n toggleButtons(false);\n });\n },\n isDanger: true\n }],\n titleLangKey: 'YourEmailSkipWarning',\n descriptionLangKey: 'YourEmailSkipWarningText'\n });\n\n popup.show();\n });\n\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\n\n inputContent.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n\n onOpenAfterTimeout() {\n if(!canFocus(this.isFirst)) return;\n this.inputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport {SliderSuperTab} from '../../../slider';\nimport InputField from '../../../inputField';\nimport AppTwoStepVerificationEmailTab from './email';\nimport {toast} from '../../../toast';\nimport I18n from '../../../../lib/langPack';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationHintTab extends SliderSuperTab {\n public inputField: InputField;\n public state: AccountPassword;\n public plainPassword: string;\n public newPassword: string;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-hint');\n this.setTitle('TwoStepAuth.SetupHintTitle');\n\n const section = new SettingSection({\n noDelimiter: true\n });\n\n const emoji = '💡';\n const stickerContainer = document.createElement('div');\n wrapStickerEmoji({\n div: stickerContainer,\n width: 160,\n height: 160,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const inputField = this.inputField = new InputField({\n name: 'hint',\n label: 'TwoStepAuth.SetupHintPlaceholder'\n });\n\n inputField.input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n cancelEvent(e);\n return inputField.value ? onContinueClick() : onSkipClick();\n }\n });\n\n const goNext = (e?: Event, saveHint?: boolean) => {\n if(e) {\n cancelEvent(e);\n }\n\n const hint = saveHint ? inputField.value : undefined;\n if(hint && this.newPassword === hint) {\n toast(I18n.format('PasswordAsHintError', true));\n return;\n }\n\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\n tab.state = this.state;\n tab.plainPassword = this.plainPassword;\n tab.newPassword = this.newPassword;\n tab.hint = hint;\n\n tab.open();\n };\n\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\n\n const onContinueClick = (e?: Event) => goNext(e, true);\n const onSkipClick = (e?: Event) => goNext(e, false);\n attachClickEvent(btnContinue, onContinueClick);\n attachClickEvent(btnSkip, onSkipClick);\n\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\n\n section.content.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n\n onOpenAfterTimeout() {\n this.inputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport PasswordInputField from '../../../passwordInputField';\nimport {SliderSuperTab} from '../../../slider';\nimport TrackingMonkey from '../../../monkeys/tracking';\nimport AppTwoStepVerificationHintTab from './hint';\nimport {InputState} from '../../../inputField';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationReEnterPasswordTab extends SliderSuperTab {\n public state: AccountPassword;\n public passwordInputField: PasswordInputField;\n public plainPassword: string;\n public newPassword: string;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password', 'two-step-verification-re-enter-password');\n this.setTitle('PleaseReEnterPassword');\n\n const section = new SettingSection({\n noDelimiter: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const passwordInputField = this.passwordInputField = new PasswordInputField({\n name: 're-enter-password',\n label: 'PleaseReEnterPassword'\n });\n\n const monkey = new TrackingMonkey(passwordInputField, 157);\n\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\n\n inputWrapper.append(passwordInputField.container, btnContinue);\n section.content.append(monkey.container, inputWrapper);\n\n this.scrollable.container.append(section.container);\n\n passwordInputField.input.addEventListener('keypress', (e) => {\n if(passwordInputField.input.classList.contains('error')) {\n passwordInputField.setState(InputState.Neutral);\n }\n\n if(e.key === 'Enter') {\n return onContinueClick();\n }\n });\n\n const verifyInput = () => {\n if(this.newPassword !== passwordInputField.value) {\n passwordInputField.setError();\n return false;\n }\n\n return true;\n };\n\n const onContinueClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(!verifyInput()) return;\n\n const tab = this.slider.createTab(AppTwoStepVerificationHintTab);\n tab.state = this.state;\n tab.plainPassword = this.plainPassword;\n tab.newPassword = this.newPassword;\n tab.open();\n };\n attachClickEvent(btnContinue, onContinueClick);\n\n return monkey.load();\n }\n\n onOpenAfterTimeout() {\n this.passwordInputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AppTwoStepVerificationTab from '.';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {canFocus} from '../../../../helpers/dom/canFocus';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../../../helpers/dom/setInnerHTML';\nimport {AccountPassword} from '../../../../layer';\nimport I18n, {i18n} from '../../../../lib/langPack';\nimport wrapEmojiText from '../../../../lib/richTextProcessor/wrapEmojiText';\nimport Button from '../../../button';\nimport {putPreloader} from '../../../putPreloader';\nimport PasswordMonkey from '../../../monkeys/password';\nimport PasswordInputField from '../../../passwordInputField';\nimport {SliderSuperTab} from '../../../slider';\nimport AppTwoStepVerificationReEnterPasswordTab from './reEnterPassword';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationEnterPasswordTab extends SliderSuperTab {\n public state: AccountPassword;\n public passwordInputField: PasswordInputField;\n public plainPassword: string;\n public isFirst = true;\n\n public init() {\n const isNew = !this.state.pFlags.has_password || this.plainPassword;\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password');\n this.setTitle(isNew ? 'PleaseEnterFirstPassword' : 'PleaseEnterCurrentPassword');\n\n const section = new SettingSection({\n noDelimiter: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const passwordInputField = this.passwordInputField = new PasswordInputField({\n name: 'enter-password',\n label: isNew ? 'PleaseEnterFirstPassword' : (this.state.hint ? undefined : 'LoginPassword'),\n labelText: !isNew && this.state.hint ? wrapEmojiText(this.state.hint) : undefined\n });\n\n const monkey = new PasswordMonkey(passwordInputField, 157);\n\n const btnContinue = Button('btn-primary btn-color-primary');\n const textEl = new I18n.IntlElement({key: 'Continue'});\n\n btnContinue.append(textEl.element);\n\n inputWrapper.append(passwordInputField.container, btnContinue);\n section.content.append(monkey.container, inputWrapper);\n\n this.scrollable.container.append(section.container);\n\n passwordInputField.input.addEventListener('keypress', (e) => {\n if(passwordInputField.input.classList.contains('error')) {\n passwordInputField.input.classList.remove('error');\n textEl.key = 'Continue';\n textEl.update();\n }\n\n if(e.key === 'Enter') {\n return onContinueClick();\n }\n });\n\n const verifyInput = () => {\n if(!passwordInputField.value.length) {\n passwordInputField.input.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n let onContinueClick: (e?: Event) => void;\n if(!isNew) {\n let getStateInterval: number;\n\n const getState = () => {\n // * just to check session relevance\n if(!getStateInterval) {\n getStateInterval = window.setInterval(getState, 10e3);\n }\n\n return this.managers.passwordManager.getState().then((_state) => {\n this.state = _state;\n\n if(this.state.hint) {\n setInnerHTML(passwordInputField.label, wrapEmojiText(this.state.hint));\n } else {\n replaceContent(passwordInputField.label, i18n('LoginPassword'));\n }\n });\n };\n\n const submit = (e?: Event) => {\n if(!verifyInput()) {\n cancelEvent(e);\n return;\n }\n\n btnContinue.setAttribute('disabled', 'true');\n textEl.key = 'PleaseWait';\n textEl.update();\n const preloader = putPreloader(btnContinue);\n\n const plainPassword = passwordInputField.value;\n this.managers.passwordManager.check(passwordInputField.value, this.state).then((auth) => {\n console.log(auth);\n\n if(auth._ === 'auth.authorization') {\n clearInterval(getStateInterval);\n if(monkey) monkey.remove();\n const tab = this.slider.createTab(AppTwoStepVerificationTab);\n tab.state = this.state;\n tab.plainPassword = plainPassword;\n tab.open();\n this.slider.removeTabFromHistory(this);\n }\n }, (err) => {\n btnContinue.removeAttribute('disabled');\n passwordInputField.input.classList.add('error');\n\n switch(err.type) {\n default:\n // btnContinue.innerText = err.type;\n textEl.key = 'PASSWORD_HASH_INVALID';\n textEl.update();\n preloader.remove();\n passwordInputField.select();\n break;\n }\n\n getState();\n });\n };\n\n onContinueClick = submit;\n\n getState();\n } else {\n onContinueClick = (e) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(!verifyInput()) return;\n\n const tab = this.slider.createTab(AppTwoStepVerificationReEnterPasswordTab);\n tab.state = this.state;\n tab.newPassword = passwordInputField.value;\n tab.plainPassword = this.plainPassword;\n tab.open();\n };\n }\n\n attachClickEvent(btnContinue, onContinueClick);\n\n return monkey.load();\n }\n\n onOpenAfterTimeout() {\n if(!canFocus(this.isFirst)) return;\n this.passwordInputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport {AccountPassword} from '../../../../layer';\nimport {_i18n} from '../../../../lib/langPack';\nimport Button from '../../../button';\nimport PopupPeer from '../../../popups/peer';\nimport SettingSection from '../../../settingSection';\nimport {SliderSuperTab} from '../../../slider';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport AppSettingsTab from '../settings';\nimport AppTwoStepVerificationEmailTab from './email';\nimport AppTwoStepVerificationEnterPasswordTab from './enterPassword';\n\nexport default class AppTwoStepVerificationTab extends SliderSuperTab {\n public state: AccountPassword;\n public plainPassword: string;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-main');\n this.setTitle('TwoStepVerificationTitle');\n\n const section = new SettingSection({\n captionOld: true,\n noDelimiter: true\n });\n\n const emoji = '🔐';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n div: stickerContainer,\n width: 168,\n height: 168,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const c = section.generateContentElement();\n if(this.state.pFlags.has_password) {\n _i18n(section.caption, 'TwoStepAuth.GenericHelp');\n\n const btnChangePassword = Button('btn-primary btn-transparent', {icon: 'edit', text: 'TwoStepAuth.ChangePassword'});\n const btnDisablePassword = Button('btn-primary btn-transparent', {icon: 'passwordoff', text: 'TwoStepAuth.RemovePassword'});\n const btnSetRecoveryEmail = Button('btn-primary btn-transparent', {icon: 'email', text: this.state.pFlags.has_recovery ? 'TwoStepAuth.ChangeEmail' : 'TwoStepAuth.SetupEmail'});\n\n attachClickEvent(btnChangePassword, () => {\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\n tab.state = this.state;\n tab.plainPassword = this.plainPassword;\n tab.open();\n });\n\n attachClickEvent(btnDisablePassword, () => {\n const popup = new PopupPeer('popup-disable-password', {\n buttons: [{\n langKey: 'Disable',\n callback: () => {\n this.managers.passwordManager.updateSettings({currentPassword: this.plainPassword}).then(() => {\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\n this.close();\n });\n },\n isDanger: true\n }],\n titleLangKey: 'TurnPasswordOffQuestionTitle',\n descriptionLangKey: 'TurnPasswordOffQuestion'\n });\n\n popup.show();\n });\n\n attachClickEvent(btnSetRecoveryEmail, () => {\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\n tab.state = this.state;\n tab.hint = this.state.hint;\n tab.plainPassword = this.plainPassword;\n tab.newPassword = this.plainPassword;\n tab.isFirst = true;\n tab.open();\n });\n\n c.append(btnChangePassword, btnDisablePassword, btnSetRecoveryEmail);\n } else {\n _i18n(section.caption, 'TwoStepAuth.SetPasswordHelp');\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const btnSetPassword = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationSetPassword'});\n\n inputWrapper.append(btnSetPassword);\n c.append(inputWrapper);\n\n attachClickEvent(btnSetPassword, (e) => {\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\n tab.state = this.state;\n tab.open();\n });\n }\n\n this.scrollable.container.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyLastSeenTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-last-seen');\n this.setTitle('PrivacyLastSeen');\n\n const caption: LangPackKey = 'PrivacySettingsController.LastSeenDescription';\n new PrivacySection({\n tab: this,\n title: 'LastSeenTitle',\n inputKey: 'inputPrivacyKeyStatusTimestamp',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\n\nexport default class AppPrivacyProfilePhotoTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-profile-photo');\n this.setTitle('PrivacyProfilePhoto');\n\n const caption: LangPackKey = 'PrivacySettingsController.ProfilePhoto.CustomHelp';\n new PrivacySection({\n tab: this,\n title: 'PrivacyProfilePhotoTitle',\n inputKey: 'inputPrivacyKeyProfilePhoto',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\n appendTo: this.scrollable,\n skipTypes: [PrivacyType.Nobody],\n managers: this.managers\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyForwardMessagesTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-forward-messages');\n this.setTitle('PrivacySettings.Forwards');\n\n const caption: LangPackKey = 'PrivacySettingsController.Forwards.CustomHelp';\n new PrivacySection({\n tab: this,\n title: 'PrivacyForwardsTitle',\n inputKey: 'inputPrivacyKeyForwards',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\n\nexport default class AppPrivacyAddToGroupsTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-add-to-groups');\n this.setTitle('PrivacySettings.Groups');\n\n const caption: LangPackKey = 'PrivacySettingsController.GroupDescription';\n new PrivacySection({\n tab: this,\n title: 'WhoCanAddMe',\n inputKey: 'inputPrivacyKeyChatInvite',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n skipTypes: [PrivacyType.Nobody],\n managers: this.managers\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyCallsTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-calls');\n this.setTitle('PrivacySettings.VoiceCalls');\n\n const caption: LangPackKey = 'PrivacySettingsController.PhoneCallDescription';\n new PrivacySection({\n tab: this,\n title: 'WhoCanCallMe',\n inputKey: 'inputPrivacyKeyPhoneCall',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n\n {\n const caption: LangPackKey = 'PrivacySettingsController.P2p.Desc';\n new PrivacySection({\n tab: this,\n title: 'PrivacyP2PHeader',\n inputKey: 'inputPrivacyKeyPhoneP2P',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Button from '../../button';\nimport Row from '../../row';\nimport {Authorization} from '../../../layer';\nimport {formatDateAccordingToTodayNew} from '../../../helpers/date';\nimport {ButtonMenuSync} from '../../buttonMenu';\nimport {toast} from '../../toast';\nimport I18n from '../../../lib/langPack';\nimport PopupPeer from '../../popups/peer';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport {attachContextMenuListener} from '../../../helpers/dom/attachContextMenuListener';\nimport positionMenu from '../../../helpers/positionMenu';\nimport contextMenuController from '../../../helpers/contextMenuController';\nimport SettingSection from '../../settingSection';\n\nexport default class AppActiveSessionsTab extends SliderSuperTabEventable {\n public authorizations: Authorization.authorization[];\n private menuElement: HTMLElement;\n\n public init() {\n this.container.classList.add('active-sessions-container');\n this.setTitle('SessionsTitle');\n\n const Session = (auth: Authorization.authorization) => {\n const row = new Row({\n title: [auth.app_name, auth.app_version].join(' '),\n subtitle: [auth.ip, auth.country].join(' - '),\n clickable: true,\n titleRight: auth.pFlags.current ? undefined : formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\n });\n\n row.container.dataset.hash = '' + auth.hash;\n\n row.midtitle.textContent = [auth.device_model, auth.system_version || auth.platform].filter(Boolean).join(', ');\n\n return row;\n };\n\n const authorizations = this.authorizations.slice();\n\n {\n const section = new SettingSection({\n name: 'CurrentSession',\n caption: 'ClearOtherSessionsHelp'\n });\n\n const auth = findAndSplice(authorizations, auth => auth.pFlags.current);\n const session = Session(auth);\n\n section.content.append(session.container);\n\n if(authorizations.length) {\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllSessions'});\n attachClickEvent(btnTerminate, (e) => {\n new PopupPeer('revoke-session', {\n buttons: [{\n langKey: 'Terminate',\n isDanger: true,\n callback: () => {\n const toggle = toggleDisability([btnTerminate], true);\n this.managers.apiManager.invokeApi('auth.resetAuthorizations').then((value) => {\n // toggleDisability([btnTerminate], false);\n btnTerminate.remove();\n otherSection.container.remove();\n }, onError).finally(() => {\n toggle();\n });\n }\n }],\n titleLangKey: 'AreYouSureSessionsTitle',\n descriptionLangKey: 'AreYouSureSessions'\n }).show();\n });\n\n section.content.append(btnTerminate);\n }\n\n this.scrollable.append(section.container);\n }\n\n if(!authorizations.length) {\n return;\n }\n\n const otherSection = new SettingSection({\n name: 'OtherSessions',\n caption: 'SessionsListInfo'\n });\n\n authorizations.forEach((auth) => {\n otherSection.content.append(Session(auth).container);\n });\n\n this.scrollable.append(otherSection.container);\n\n const onError = (err: any) => {\n if(err.type === 'FRESH_RESET_AUTHORISATION_FORBIDDEN') {\n toast(I18n.format('RecentSessions.Error.FreshReset', true));\n }\n };\n\n let target: HTMLElement;\n const onTerminateClick = () => {\n const hash = target.dataset.hash;\n\n new PopupPeer('revoke-session', {\n buttons: [{\n langKey: 'Terminate',\n isDanger: true,\n callback: () => {\n this.managers.apiManager.invokeApi('account.resetAuthorization', {hash})\n .then((value) => {\n if(value) {\n target.remove();\n }\n }, onError);\n }\n }],\n titleLangKey: 'AreYouSureSessionTitle',\n descriptionLangKey: 'TerminateSessionText'\n }).show();\n };\n\n const element = this.menuElement = ButtonMenuSync({\n buttons: [{\n icon: 'stop',\n text: 'Terminate',\n onClick: onTerminateClick\n }]\n });\n element.id = 'active-sessions-contextmenu';\n element.classList.add('contextmenu');\n\n document.getElementById('page-chats').append(element);\n\n attachContextMenuListener(this.scrollable.container, (e) => {\n target = findUpClassName(e.target, 'row');\n if(!target || target.dataset.hash === '0') {\n return;\n }\n\n if(e instanceof MouseEvent) e.preventDefault();\n // smth\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n positionMenu(e, element);\n contextMenuController.openBtnMenu(element);\n });\n\n attachClickEvent(this.scrollable.container, (e) => {\n target = findUpClassName(e.target, 'row');\n if(!target || target.dataset.hash === '0') {\n return;\n }\n\n onTerminateClick();\n });\n }\n\n onCloseAfterTimeout() {\n this.menuElement?.remove();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport {ButtonMenuSync} from '../../buttonMenu';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../../../lib/appManagers/appDialogsManager';\nimport PopupPickUser from '../../popups/pickUser';\nimport rootScope from '../../../lib/rootScope';\nimport findUpTag from '../../../helpers/dom/findUpTag';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport formatUserPhone from '../../wrappers/formatUserPhone';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\nimport {attachContextMenuListener} from '../../../helpers/dom/attachContextMenuListener';\nimport positionMenu from '../../../helpers/positionMenu';\nimport contextMenuController from '../../../helpers/contextMenuController';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport SettingSection from '../../settingSection';\n\nexport default class AppBlockedUsersTab extends SliderSuperTab {\n public peerIds: PeerId[];\n private menuElement: HTMLElement;\n\n public init() {\n this.container.classList.add('blocked-users-container');\n this.setTitle('BlockedUsers');\n\n const section = new SettingSection({\n caption: 'BlockedUsersInfo'\n });\n\n section.caption.parentElement.prepend(section.caption);\n\n this.scrollable.append(section.container);\n\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\n this.content.append(btnAdd);\n\n attachClickEvent(btnAdd, (e) => {\n new PopupPickUser({\n peerTypes: ['contacts'],\n placeholder: 'BlockModal.Search.Placeholder',\n onSelect: (peerId) => {\n // console.log('block', peerId);\n this.managers.appUsersManager.toggleBlock(peerId, true);\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n const list = appDialogsManager.createChatList();\n this.scrollable.container.classList.add('chatlist-container');\n section.content.append(list);\n\n const add = async(peerId: PeerId, append: boolean) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger',\n append\n });\n\n const user = await this.managers.appUsersManager.getUser(peerId.toUserId());\n if(!user) {\n return;\n }\n\n const usernames = getPeerActiveUsernames(user);\n const username = usernames[0];\n if(user.pFlags.bot) {\n dom.lastMessageSpan.append('@' + username);\n } else {\n if(user.phone) dom.lastMessageSpan.innerHTML = formatUserPhone(user.phone);\n else dom.lastMessageSpan.append(username ? '@' + username : getUserStatusString(user));\n }\n\n // dom.titleSpan.innerHTML = 'Raaid El Syed';\n // dom.lastMessageSpan.innerHTML = '+1 234 567891';\n };\n\n for(const peerId of this.peerIds) {\n add(peerId, true);\n }\n\n let target: HTMLElement;\n const onUnblock = () => {\n const peerId = target.dataset.peerId.toPeerId();\n this.managers.appUsersManager.toggleBlock(peerId, false);\n };\n\n const element = this.menuElement = ButtonMenuSync({\n buttons: [{\n icon: 'lockoff',\n text: 'Unblock',\n onClick: onUnblock,\n options: {listenerSetter: this.listenerSetter}\n }]\n });\n element.id = 'blocked-users-contextmenu';\n element.classList.add('contextmenu');\n\n document.getElementById('page-chats').append(element);\n\n attachContextMenuListener(this.scrollable.container, (e) => {\n target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(!target) {\n return;\n }\n\n if(e instanceof MouseEvent) e.preventDefault();\n // smth\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n positionMenu(e, element);\n contextMenuController.openBtnMenu(element);\n }, this.listenerSetter);\n\n this.listenerSetter.add(rootScope)('peer_block', (update) => {\n const {peerId, blocked} = update;\n const li = list.querySelector(`[data-peer-id=\"${peerId}\"]`);\n if(blocked) {\n if(!li) {\n add(peerId, false);\n }\n } else {\n if(li) {\n li.remove();\n }\n }\n });\n\n const LOAD_COUNT = 50;\n let loading = false;\n this.scrollable.onScrolledBottom = () => {\n if(loading) {\n return;\n }\n\n loading = true;\n this.managers.appUsersManager.getBlocked(list.childElementCount, LOAD_COUNT).then((res) => {\n for(const peerId of res.peerIds) {\n add(peerId, true);\n }\n\n if(res.peerIds.length < LOAD_COUNT || list.childElementCount === res.count) {\n this.scrollable.onScrolledBottom = null;\n }\n\n this.scrollable.checkForTriggers();\n }).finally(() => {\n loading = false;\n });\n };\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n\n onCloseAfterTimeout() {\n if(this.menuElement) {\n this.menuElement.remove();\n }\n\n return super.onCloseAfterTimeout();\n }\n}\n","export default function convertKeyToInputKey(key: string) {\n key = key[0].toUpperCase() + key.slice(1);\n key = 'input' + key;\n return key;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyVoicesTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-voices');\n this.setTitle('PrivacyVoiceMessages');\n\n const caption: LangPackKey = 'PrivacyVoiceMessagesInfo';\n new PrivacySection({\n tab: this,\n title: 'PrivacyVoiceMessagesTitle',\n inputKey: 'inputPrivacyKeyVoiceMessages',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatDateAccordingToTodayNew} from '../../../helpers/date';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport {WebAuthorization} from '../../../layer';\nimport AvatarElement from '../../avatar';\nimport Button from '../../button';\nimport confirmationPopup from '../../confirmationPopup';\nimport Row from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport wrapPeerTitle from '../../wrappers/peerTitle';\n\nexport default class AppActiveWebSessionsTab extends SliderSuperTabEventable {\n public async init(sessions: WebAuthorization[]) {\n this.container.classList.add('active-sessions-container');\n this.setTitle('WebSessionsTitle');\n\n const Session = async(auth: WebAuthorization) => {\n const peerId = auth.bot_id.toPeerId();\n const row = new Row({\n title: await wrapPeerTitle({peerId}),\n subtitle: [auth.ip, auth.region].join(' - '),\n clickable: true,\n titleRight: formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\n });\n\n const media = row.createMedia('big');\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-48');\n await avatar.updateWithOptions({peerId});\n media.append(avatar);\n\n row.container.dataset.hash = '' + auth.hash;\n row.container.dataset.peerId = '' + peerId;\n\n row.midtitle.textContent = [auth.domain, auth.browser, auth.platform].filter(Boolean).join(', ');\n\n return row;\n };\n\n {\n const section = new SettingSection({\n caption: 'ClearOtherWebSessionsHelp'\n });\n\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllWebSessions'});\n\n attachClickEvent(btnTerminate, async() => {\n await confirmationPopup({\n descriptionLangKey: 'AreYouSureWebSessions',\n button: {\n langKey: 'Disconnect',\n isDanger: true\n }\n });\n\n const toggle = toggleDisability([btnTerminate], true);\n this.managers.appSeamlessLoginManager.resetWebAuthorizations().then(() => {\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnTerminate);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({\n name: 'OtherWebSessions',\n caption: 'TerminateWebSessionInfo'\n });\n\n const rows = await Promise.all(sessions.map(Session));\n section.content.append(...rows.map((row) => row.container));\n\n let leftLength = rows.length;\n attachClickEvent(section.content, async(e) => {\n const row = findUpClassName(e.target, 'row');\n if(!row) {\n return;\n }\n\n await confirmationPopup({\n descriptionLangKey: 'TerminateWebSessionText',\n descriptionLangArgs: [await wrapPeerTitle({peerId: row.dataset.peerId.toPeerId()})],\n button: {\n langKey: 'Disconnect',\n isDanger: true\n }\n });\n\n const hash = row.dataset.hash;\n row.classList.add('is-disabled');\n this.managers.appSeamlessLoginManager.resetWebAuthorization(hash).then(() => {\n if(!--leftLength) {\n this.close();\n } else {\n row.remove();\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.scrollable.append(section.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SliderSuperTab, {SliderSuperTabEventable} from '../../sliderTab';\nimport Row from '../../row';\nimport {AccountPassword, Authorization, InputPrivacyKey, Updates, WebAuthorization} from '../../../layer';\nimport AppPrivacyPhoneNumberTab from './privacy/phoneNumber';\nimport AppTwoStepVerificationTab from './2fa';\nimport AppTwoStepVerificationEnterPasswordTab from './2fa/enterPassword';\nimport AppTwoStepVerificationEmailConfirmationTab from './2fa/emailConfirmation';\nimport AppPrivacyLastSeenTab from './privacy/lastSeen';\nimport AppPrivacyProfilePhotoTab from './privacy/profilePhoto';\nimport AppPrivacyForwardMessagesTab from './privacy/forwardMessages';\nimport AppPrivacyAddToGroupsTab from './privacy/addToGroups';\nimport AppPrivacyCallsTab from './privacy/calls';\nimport AppActiveSessionsTab from './activeSessions';\nimport AppBlockedUsersTab from './blockedUsers';\nimport rootScope from '../../../lib/rootScope';\nimport {i18n, LangPackKey, _i18n} from '../../../lib/langPack';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport CheckboxField from '../../checkboxField';\nimport PopupPeer from '../../popups/peer';\nimport Button from '../../button';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport convertKeyToInputKey from '../../../helpers/string/convertKeyToInputKey';\nimport getPrivacyRulesDetails from '../../../lib/appManagers/utils/privacy/getPrivacyRulesDetails';\nimport PrivacyType from '../../../lib/appManagers/utils/privacy/privacyType';\nimport confirmationPopup, {PopupConfirmationOptions} from '../../confirmationPopup';\nimport noop from '../../../helpers/noop';\nimport {toastNew} from '../../toast';\nimport AppPrivacyVoicesTab from './privacy/voices';\nimport SettingSection from '../../settingSection';\nimport AppActiveWebSessionsTab from './activeWebSessions';\n\nexport default class AppPrivacyAndSecurityTab extends SliderSuperTabEventable {\n private activeSessionsRow: Row;\n private authorizations: Authorization.authorization[];\n\n private websitesRow: Row;\n private websites: WebAuthorization[];\n\n public static getInitArgs(fromTab: SliderSuperTab) {\n return {\n appConfig: fromTab.managers.apiManager.getAppConfig(),\n globalPrivacy: fromTab.managers.appPrivacyManager.getGlobalPrivacySettings(),\n contentSettings: fromTab.managers.apiManager.invokeApi('account.getContentSettings'),\n webAuthorizations: fromTab.managers.appSeamlessLoginManager.getWebAuthorizations()\n };\n }\n\n public init(p: ReturnType) {\n this.container.classList.add('dont-u-dare-block-me');\n this.setTitle('PrivacySettings');\n\n const SUBTITLE: LangPackKey = 'Loading';\n const promises: Promise[] = [];\n\n {\n const section = new SettingSection({noDelimiter: true, caption: 'SessionsInfo'});\n\n let blockedPeerIds: PeerId[];\n const blockedUsersRow = new Row({\n icon: 'deleteuser',\n titleLangKey: 'BlockedUsers',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n const tab = this.slider.createTab(AppBlockedUsersTab);\n tab.peerIds = blockedPeerIds;\n tab.open();\n },\n listenerSetter: this.listenerSetter\n });\n blockedUsersRow.freezed = true;\n\n let passwordState: AccountPassword;\n const twoFactorRowOptions = {\n icon: 'lock',\n titleLangKey: 'TwoStepVerification' as LangPackKey,\n subtitleLangKey: SUBTITLE,\n clickable: (e: Event) => {\n let tab: AppTwoStepVerificationTab | AppTwoStepVerificationEnterPasswordTab | AppTwoStepVerificationEmailConfirmationTab;\n if(passwordState.pFlags.has_password) {\n tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\n } else if(passwordState.email_unconfirmed_pattern) {\n tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\n tab.email = passwordState.email_unconfirmed_pattern;\n tab.length = 6;\n tab.isFirst = true;\n this.managers.passwordManager.resendPasswordEmail();\n } else {\n tab = this.slider.createTab(AppTwoStepVerificationTab);\n }\n\n tab.state = passwordState;\n tab.open();\n },\n listenerSetter: this.listenerSetter\n };\n\n const twoFactorRow = new Row(twoFactorRowOptions);\n twoFactorRow.freezed = true;\n\n const activeSessionsRow = this.activeSessionsRow = new Row({\n icon: 'activesessions',\n titleLangKey: 'SessionsTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n const tab = this.slider.createTab(AppActiveSessionsTab);\n tab.authorizations = this.authorizations;\n tab.eventListener.addEventListener('destroy', () => {\n this.updateActiveSessions();\n }, {once: true});\n tab.open();\n },\n listenerSetter: this.listenerSetter\n });\n activeSessionsRow.freezed = true;\n\n const websitesRow = this.websitesRow = new Row({\n icon: 'mention',\n titleLangKey: 'OtherWebSessions',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n const tab = this.slider.createTab(AppActiveWebSessionsTab);\n tab.eventListener.addEventListener('destroy', () => {\n this.updateActiveWebsites();\n });\n tab.open(this.websites);\n },\n listenerSetter: this.listenerSetter\n });\n websitesRow.freezed = true;\n\n section.content.append(blockedUsersRow.container, twoFactorRow.container, activeSessionsRow.container, websitesRow.container);\n this.scrollable.append(section.container);\n\n const setBlockedCount = (count: number) => {\n if(count) {\n replaceContent(blockedUsersRow.subtitle, i18n('PrivacySettingsController.UserCount', [count]));\n } else {\n replaceContent(blockedUsersRow.subtitle, i18n('BlockedEmpty', [count]));\n }\n };\n\n this.listenerSetter.add(rootScope)('peer_block', () => {\n /* const {blocked, peerId} = update;\n if(!blocked) blockedPeerIds.findAndSplice((p) => p === peerId);\n else blockedPeerIds.unshift(peerId);\n blockedCount += blocked ? 1 : -1;\n setBlockedCount(blockedCount); */\n updateBlocked();\n });\n\n const updateBlocked = () => {\n this.managers.appUsersManager.getBlocked().then((res) => {\n blockedUsersRow.freezed = false;\n setBlockedCount(res.count);\n blockedPeerIds = res.peerIds;\n });\n };\n\n updateBlocked();\n\n this.managers.passwordManager.getState().then((state) => {\n passwordState = state;\n replaceContent(twoFactorRow.subtitle, i18n(state.pFlags.has_password ? 'PrivacyAndSecurity.Item.On' : 'PrivacyAndSecurity.Item.Off'));\n twoFactorRow.freezed = false;\n\n // console.log('password state', state);\n });\n\n this.updateActiveSessions();\n promises.push(this.updateActiveWebsites(p.webAuthorizations));\n }\n\n {\n const section = new SettingSection({name: 'PrivacyTitle', caption: 'GroupsAndChannelsHelp'});\n\n section.content.classList.add('privacy-navigation-container');\n\n const rowsByKeys: Partial<{\n [key in InputPrivacyKey['_']]: Row\n }> = {};\n\n const numberVisibilityRow = rowsByKeys['inputPrivacyKeyPhoneNumber'] = new Row({\n titleLangKey: 'PrivacyPhoneTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyPhoneNumberTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const lastSeenTimeRow = rowsByKeys['inputPrivacyKeyStatusTimestamp'] = new Row({\n titleLangKey: 'LastSeenTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyLastSeenTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const photoVisibilityRow = rowsByKeys['inputPrivacyKeyProfilePhoto'] = new Row({\n titleLangKey: 'PrivacyProfilePhotoTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyProfilePhotoTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const callRow = rowsByKeys['inputPrivacyKeyPhoneCall'] = new Row({\n titleLangKey: 'WhoCanCallMe',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyCallsTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const linkAccountRow = rowsByKeys['inputPrivacyKeyForwards'] = new Row({\n titleLangKey: 'PrivacyForwardsTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyForwardMessagesTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const groupChatsAddRow = rowsByKeys['inputPrivacyKeyChatInvite'] = new Row({\n titleLangKey: 'WhoCanAddMe',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyAddToGroupsTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const voicesRow = rowsByKeys['inputPrivacyKeyVoiceMessages'] = new Row({\n titleLangKey: 'PrivacyVoiceMessagesTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n if(!rootScope.premium) {\n toastNew({langPackKey: 'PrivacyVoiceMessagesPremiumOnly'});\n } else {\n this.slider.createTab(AppPrivacyVoicesTab).open();\n }\n },\n listenerSetter: this.listenerSetter\n });\n\n const updatePrivacyRow = (key: InputPrivacyKey['_']) => {\n const row = rowsByKeys[key];\n if(!row) {\n return;\n }\n\n this.managers.appPrivacyManager.getPrivacy(key).then((rules) => {\n const details = getPrivacyRulesDetails(rules);\n const langKey = details.type === PrivacyType.Everybody ? 'PrivacySettingsController.Everbody' : (details.type === PrivacyType.Contacts ? 'PrivacySettingsController.MyContacts' : 'PrivacySettingsController.Nobody');\n const disallowLength = details.disallowPeers.users.length + details.disallowPeers.chats.length;\n const allowLength = details.allowPeers.users.length + details.allowPeers.chats.length;\n\n row.subtitle.innerHTML = '';\n const s = i18n(langKey);\n row.subtitle.append(s);\n if(disallowLength || allowLength) {\n row.subtitle.append(` (${[-disallowLength, allowLength ? '+' + allowLength : 0].filter(Boolean).join(', ')})`);\n }\n });\n };\n\n section.content.append(\n numberVisibilityRow.container,\n lastSeenTimeRow.container,\n photoVisibilityRow.container,\n callRow.container,\n linkAccountRow.container,\n groupChatsAddRow.container,\n voicesRow.container\n );\n this.scrollable.append(section.container);\n\n for(const key in rowsByKeys) {\n updatePrivacyRow(key as keyof typeof rowsByKeys);\n }\n\n rootScope.addEventListener('privacy_update', (update) => {\n updatePrivacyRow(convertKeyToInputKey(update.key._) as any);\n });\n }\n\n {\n const section = new SettingSection({name: 'NewChatsFromNonContacts', caption: 'ArchiveAndMuteInfo'});\n\n const checkboxField = new CheckboxField({text: 'ArchiveAndMute'});\n const row = new Row({\n checkboxField\n });\n\n section.content.append(row.container);\n\n let enabled: boolean, destroyed: boolean;\n this.eventListener.addEventListener('destroy', () => {\n destroyed = true;\n if(enabled === undefined || enabled === checkboxField.checked) return;\n return this.managers.appPrivacyManager.setGlobalPrivacySettings({\n _: 'globalPrivacySettings',\n archive_and_mute_new_noncontact_peers: checkboxField.checked\n });\n }, {once: true});\n\n const promise = Promise.all([\n p.appConfig,\n p.globalPrivacy\n ]).then(([appConfig, settings]) => {\n if(destroyed) {\n return;\n }\n\n const onPremiumToggle = (isPremium: boolean) => {\n section.container.classList.toggle('hide', !isPremium && !appConfig.autoarchive_setting_available);\n };\n\n this.listenerSetter.add(rootScope)('premium_toggle', onPremiumToggle);\n onPremiumToggle(rootScope.premium);\n\n enabled = !!settings.archive_and_mute_new_noncontact_peers;\n\n checkboxField.setValueSilently(enabled);\n });\n\n promises.push(promise);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'Privacy.SensitiveContent', caption: 'PrivacyAndSecurity.SensitiveDesc'});\n section.container.classList.add('hide');\n\n const checkboxField = new CheckboxField({text: 'PrivacyAndSecurity.SensitiveText'});\n const row = new Row({\n checkboxField\n });\n\n section.content.append(row.container);\n\n let enabled: boolean;\n this.eventListener.addEventListener('destroy', () => {\n if(enabled === undefined) return;\n const _enabled = row.checkboxField.checked;\n const isChanged = _enabled !== enabled;\n if(!isChanged) {\n return;\n }\n\n return this.managers.apiManager.invokeApi('account.setContentSettings', {\n sensitive_enabled: _enabled\n });\n }, {once: true});\n\n const promise = p.contentSettings.then((settings) => {\n if(!settings.pFlags.sensitive_can_change) {\n return;\n }\n\n enabled = !!settings.pFlags.sensitive_enabled;\n checkboxField.setValueSilently(enabled);\n section.container.classList.remove('hide');\n });\n\n promises.push(promise);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'PrivacyPayments', caption: 'PrivacyPaymentsClearInfo'});\n\n const onClearClick = () => {\n const options: PopupConfirmationOptions = {\n titleLangKey: 'PrivacyPaymentsClearAlertTitle',\n descriptionLangKey: 'PrivacyPaymentsClearAlertText',\n button: {\n langKey: 'Clear'\n },\n checkboxes: [{\n text: 'PrivacyClearShipping',\n checked: true\n }, {\n text: 'PrivacyClearPayment',\n checked: true\n }]\n };\n\n confirmationPopup(options).then(() => {\n const [info, payment] = options.checkboxes.map((c) => c.checkboxField.checked);\n const toggle = toggleDisability([clearButton], true);\n this.managers.appPaymentsManager.clearSavedInfo(info, payment).then(() => {\n if(!info && !payment) {\n return;\n }\n\n toggle();\n toastNew({\n langPackKey: info && payment ? 'PrivacyPaymentsPaymentShippingCleared' : (info ? 'PrivacyPaymentsShippingInfoCleared' : 'PrivacyPaymentsPaymentInfoCleared')\n });\n });\n }, noop);\n };\n\n const clearButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyPaymentsClear'});\n this.listenerSetter.add(clearButton)('click', onClearClick);\n section.content.append(clearButton);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'FilterChats'});\n\n const onDeleteClick = () => {\n const popup = new PopupPeer('popup-delete-drafts', {\n buttons: [{\n langKey: 'Delete',\n callback: () => {\n const toggle = toggleDisability([deleteButton], true);\n this.managers.appDraftsManager.clearAllDrafts().then(() => {\n toggle();\n });\n },\n isDanger: true\n }],\n titleLangKey: 'AreYouSureClearDraftsTitle',\n descriptionLangKey: 'AreYouSureClearDrafts'\n });\n\n popup.show();\n };\n\n const deleteButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyDeleteCloudDrafts'});\n this.listenerSetter.add(deleteButton)('click', onDeleteClick);\n section.content.append(deleteButton);\n\n /* promises.push(apiManager.invokeApi('messages.getAllDrafts').then((drafts) => {\n const draftsRow = new Row({\n titleLangKey: 'PrivacyDeleteCloudDrafts',\n subtitleLangKey: 'Drafts',\n subtitleLangArgs: [(drafts as Updates.updates).updates.length],\n icon: 'delete',\n clickable: onDeleteClick\n });\n\n section.content.append(draftsRow.container);\n })); */\n\n this.scrollable.append(section.container);\n }\n\n // {\n // const section = new SettingSection({\n // name: 'OtherWebSessions'\n // });\n\n // const row = new Row({\n\n // });\n\n // this.scrollable.append(section.container);\n // }\n\n return Promise.all(promises);\n }\n\n public updateActiveSessions() {\n return this.managers.apiManager.invokeApi('account.getAuthorizations').then((auths) => {\n this.activeSessionsRow.freezed = false;\n this.authorizations = auths.authorizations;\n _i18n(this.activeSessionsRow.subtitle, 'Privacy.Devices', [this.authorizations.length]);\n });\n }\n\n public updateActiveWebsites(promise = this.managers.appSeamlessLoginManager.getWebAuthorizations()) {\n return promise.then((authorizations) => {\n this.websitesRow.freezed = false;\n this.websites = authorizations;\n _i18n(this.websitesRow.subtitle, 'Privacy.Websites', [this.websites.length]);\n this.websitesRow.container.classList.toggle('hide', !this.websites.length);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {renderImageFromUrlPromise} from './dom/renderImageFromUrl';\n\nexport function averageColorFromCanvas(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n\n const pixel = new Array(4).fill(0);\n const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data;\n const pixelsLength = pixels.length / 4;\n for(let i = 0; i < pixels.length; i += 4) {\n // const alphaPixel = pixels[i + 3];\n pixel[0] += pixels[i]/* * (alphaPixel / 255) */;\n pixel[1] += pixels[i + 1]/* * (alphaPixel / 255) */;\n pixel[2] += pixels[i + 2]/* * (alphaPixel / 255) */;\n pixel[3] += pixels[i + 3];\n }\n\n const outPixel = new Uint8ClampedArray(4);\n outPixel[0] = pixel[0] / pixelsLength;\n outPixel[1] = pixel[1] / pixelsLength;\n outPixel[2] = pixel[2] / pixelsLength;\n outPixel[3] = pixel[3] / pixelsLength;\n // outPixel[3] = 255;\n return outPixel;\n}\n\nexport function averageColorFromImageSource(imageSource: CanvasImageSource, width: number, height: number) {\n const canvas = document.createElement('canvas');\n const ratio = width / height;\n const DIMENSIONS = 50;\n if(ratio === 1) {\n canvas.width = DIMENSIONS;\n canvas.height = canvas.width / ratio;\n } else if(ratio > 1) {\n canvas.height = DIMENSIONS;\n canvas.width = canvas.height / ratio;\n } else {\n canvas.width = canvas.height = DIMENSIONS;\n }\n\n const context = canvas.getContext('2d');\n context.drawImage(imageSource, 0, 0, width, height, 0, 0, canvas.width, canvas.height);\n return averageColorFromCanvas(canvas);\n}\n\nexport function averageColor(imageUrl: string) {\n const img = document.createElement('img');\n return renderImageFromUrlPromise(img, imageUrl, false).then(() => {\n return averageColorFromImageSource(img, img.naturalWidth, img.naturalHeight);\n });\n};\n","import {rgbaToHsla} from './color';\n\n// * https://github.com/TelegramMessenger/Telegram-iOS/blob/3d062fff78cc6b287c74e6171f855a3500c0156d/submodules/TelegramPresentationData/Sources/PresentationData.swift#L453\nexport default function highlightningColor(rgba: [number, number, number, number?]) {\n let {h, s, l} = rgbaToHsla(rgba[0], rgba[1], rgba[2]);\n if(s > 0) {\n s = Math.min(100, s + 5 + 0.1 * (100 - s));\n }\n l = Math.max(0, l * .65);\n\n const hsla = `hsla(${h}, ${s}%, ${l}%, .4)`;\n return hsla;\n}\n","import {ColorHsla, ColorRgba, hexaToHsla, hslaToRgba, rgbaToHexa as rgbaToHexa, rgbaToHsla} from '../helpers/color';\nimport attachGrabListeners from '../helpers/dom/attachGrabListeners';\nimport clamp from '../helpers/number/clamp';\nimport InputField, {InputState} from './inputField';\n\nexport type ColorPickerColor = {\n hsl: string;\n rgb: string;\n hex: string;\n hsla: string;\n rgba: string;\n hexa: string;\n rgbaArray: ColorRgba;\n};\n\nexport default class ColorPicker {\n private static BASE_CLASS = 'color-picker';\n public container: HTMLElement;\n\n private boxRect: DOMRect;\n // private boxDraggerRect: DOMRect;\n private hueRect: DOMRect;\n // private hueDraggerRect: DOMRect;\n\n private hue = 0;\n private saturation = 100;\n private lightness = 50;\n private alpha = 1;\n private elements: {\n box: SVGSVGElement,\n boxDragger: SVGSVGElement,\n sliders: HTMLElement,\n hue: SVGSVGElement,\n hueDragger: SVGSVGElement,\n saturation: SVGLinearGradientElement,\n } = {} as any;\n private hexInputField: InputField;\n private rgbInputField: InputField;\n public onChange: (color: ReturnType) => void;\n\n constructor() {\n this.container = document.createElement('div');\n this.container.classList.add(ColorPicker.BASE_CLASS);\n\n const html = `\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n `;\n\n this.container.innerHTML = html;\n\n this.elements.box = this.container.firstElementChild as any;\n this.elements.boxDragger = this.elements.box.lastElementChild as any;\n this.elements.saturation = this.elements.box.firstElementChild.firstElementChild as any;\n\n this.elements.sliders = this.elements.box.nextElementSibling as any;\n\n this.elements.hue = this.elements.sliders.firstElementChild as any;\n this.elements.hueDragger = this.elements.hue.lastElementChild as any;\n\n this.hexInputField = new InputField({plainText: true, label: 'Appearance.Color.Hex'});\n this.rgbInputField = new InputField({plainText: true, label: 'Appearance.Color.RGB'});\n\n const inputs = document.createElement('div');\n inputs.className = ColorPicker.BASE_CLASS + '-inputs';\n inputs.append(this.hexInputField.container, this.rgbInputField.container);\n this.container.append(inputs);\n\n this.hexInputField.input.addEventListener('input', () => {\n let value = this.hexInputField.value.replace(/#/g, '').slice(0, 6);\n\n const match = value.match(/([a-fA-F\\d]+)/);\n const valid = match && match[0].length === value.length && [/* 3, 4, */6].includes(value.length);\n this.hexInputField.setState(valid ? InputState.Neutral : InputState.Error);\n\n value = '#' + value;\n this.hexInputField.setValueSilently(value);\n\n if(valid) {\n this.setColor(value, false, true);\n }\n });\n\n // patched https://stackoverflow.com/a/34029238/6758968\n const rgbRegExp = /^(?:rgb)?\\(?([01]?\\d\\d?|2[0-4]\\d|25[0-5])(?:\\W+)([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\W+(?:([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\)?)$/;\n this.rgbInputField.input.addEventListener('input', () => {\n const match = this.rgbInputField.value.match(rgbRegExp);\n this.rgbInputField.setState(match ? InputState.Neutral : InputState.Error);\n\n if(match) {\n this.setColor(rgbaToHsla(+match[1], +match[2], +match[3]), true, false);\n }\n });\n\n this.attachBoxListeners();\n this.attachHueListeners();\n }\n\n private onGrabStart = () => {\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = 'grabbing';\n };\n\n private onGrabEnd = () => {\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = '';\n };\n\n private attachBoxListeners() {\n attachGrabListeners(this.elements.box as any, () => {\n this.onGrabStart();\n this.boxRect = this.elements.box.getBoundingClientRect();\n // this.boxDraggerRect = this.elements.boxDragger.getBoundingClientRect();\n }, (pos) => {\n this.saturationHandler(pos.x, pos.y);\n }, () => {\n this.onGrabEnd();\n });\n }\n\n private attachHueListeners() {\n attachGrabListeners(this.elements.hue as any, () => {\n this.onGrabStart();\n this.hueRect = this.elements.hue.getBoundingClientRect();\n // this.hueDraggerRect = this.elements.hueDragger.getBoundingClientRect();\n }, (pos) => {\n this.hueHandler(pos.x);\n }, () => {\n this.onGrabEnd();\n });\n }\n\n public setColor(color: ColorHsla | string, updateHexInput = true, updateRgbInput = true) {\n if(color === undefined) { // * set to red\n color = {\n h: 0,\n s: 100,\n l: 50,\n a: 1\n };\n } else if(typeof(color) === 'string') {\n if(color[0] === '#') {\n color = hexaToHsla(color);\n } else {\n const rgb = color.match(/[.?\\d]+/g);\n color = rgbaToHsla(+rgb[0], +rgb[1], +rgb[2], rgb[3] === undefined ? 1 : +rgb[3]);\n }\n }\n\n // Set box\n this.boxRect = this.elements.box.getBoundingClientRect();\n\n const boxX = this.boxRect.width / 100 * color.s;\n const percentY = 100 - (color.l / (100 - color.s / 2)) * 100;\n const boxY = this.boxRect.height / 100 * percentY;\n\n this.saturationHandler(this.boxRect.left + boxX, this.boxRect.top + boxY, false);\n\n // Set hue\n this.hueRect = this.elements.hue.getBoundingClientRect();\n\n const percentHue = color.h / 360;\n const hueX = this.hueRect.left + this.hueRect.width * percentHue;\n\n this.hueHandler(hueX, false);\n\n // Set values\n this.hue = color.h;\n this.saturation = color.s;\n this.lightness = color.l;\n this.alpha = color.a;\n\n this.updatePicker(updateHexInput, updateRgbInput);\n };\n\n public getCurrentColor(): ColorPickerColor {\n const rgbaArray = hslaToRgba(this.hue, this.saturation, this.lightness, this.alpha);\n const hexa = rgbaToHexa(rgbaArray);\n const hex = hexa.slice(0, -2);\n\n return {\n hsl: `hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,\n rgb: `rgb(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]})`,\n hex: hex,\n hsla: `hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,\n rgba: `rgba(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]}, ${rgbaArray[3]})`,\n hexa: hexa,\n rgbaArray: rgbaArray\n };\n }\n\n public updatePicker(updateHexInput = true, updateRgbInput = true) {\n const color = this.getCurrentColor();\n this.elements.boxDragger.setAttributeNS(null, 'fill', color.hex);\n\n if(updateHexInput) {\n this.hexInputField.setValueSilently(color.hex);\n this.hexInputField.setState(InputState.Neutral);\n }\n\n if(updateRgbInput) {\n this.rgbInputField.setValueSilently(color.rgbaArray.slice(0, -1).join(', '));\n this.rgbInputField.setState(InputState.Neutral);\n }\n\n if(this.onChange) {\n this.onChange(color);\n }\n }\n\n private hueHandler(pageX: number, update = true) {\n const eventX = clamp(pageX - this.hueRect.left, 0, this.hueRect.width);\n\n const percents = eventX / this.hueRect.width;\n this.hue = Math.round(360 * percents);\n\n const hsla = `hsla(${this.hue}, 100%, 50%, ${this.alpha})`;\n\n this.elements.hueDragger.setAttributeNS(null, 'x', (percents * 100) + '%');\n this.elements.hueDragger.setAttributeNS(null, 'fill', hsla);\n\n this.elements.saturation.lastElementChild.setAttributeNS(null, 'stop-color', hsla);\n\n if(update) {\n this.updatePicker();\n }\n }\n\n private saturationHandler(pageX: number, pageY: number, update = true) {\n const maxX = this.boxRect.width;\n const maxY = this.boxRect.height;\n\n const eventX = clamp(pageX - this.boxRect.left, 0, maxX);\n const eventY = clamp(pageY - this.boxRect.top, 0, maxY);\n\n const posX = eventX / maxX * 100;\n const posY = eventY / maxY * 100;\n\n const boxDragger = this.elements.boxDragger;\n boxDragger.setAttributeNS(null, 'x', posX + '%');\n boxDragger.setAttributeNS(null, 'y', posY + '%');\n\n const saturation = clamp(posX, 0, 100);\n\n const lightnessX = 100 - saturation / 2;\n const lightnessY = 100 - clamp(posY, 0, 100);\n\n const lightness = clamp(lightnessY / 100 * lightnessX, 0, 100);\n\n this.saturation = saturation;\n this.lightness = lightness;\n\n if(update) {\n this.updatePicker();\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Theme} from '../../../config/state';\nimport {hexaToRgba} from '../../../helpers/color';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport highlightningColor from '../../../helpers/highlightningColor';\nimport throttle from '../../../helpers/schedulers/throttle';\nimport themeController from '../../../helpers/themeController';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport rootScope from '../../../lib/rootScope';\nimport ColorPicker, {ColorPickerColor} from '../../colorPicker';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTab} from '../../slider';\n\nexport default class AppBackgroundColorTab extends SliderSuperTab {\n private colorPicker: ColorPicker;\n private grid: HTMLElement;\n private applyColor: (hex: string, updateColorPicker?: boolean) => void;\n private theme: Theme;\n\n init() {\n this.container.classList.add('background-container', 'background-color-container');\n this.setTitle('SetColor');\n\n this.theme = themeController.getTheme();\n\n const section = new SettingSection({});\n this.colorPicker = new ColorPicker();\n\n section.content.append(this.colorPicker.container);\n\n this.scrollable.append(section.container);\n\n const gridSection = new SettingSection({});\n\n const grid = this.grid = document.createElement('div');\n grid.classList.add('grid');\n\n const colors = [\n '#E6EBEE',\n '#B2CEE1',\n '#008DD0',\n '#C6E7CB',\n '#C4E1A6',\n '#60B16E',\n '#CCD0AF',\n '#A6A997',\n '#7A7072',\n '#FDD7AF',\n '#FDB76E',\n '#DD8851'\n ];\n\n colors.forEach((color) => {\n const item = document.createElement('div');\n item.classList.add('grid-item');\n item.dataset.color = color.toLowerCase();\n\n // * need for transform scale\n const media = document.createElement('div');\n media.classList.add('grid-item-media');\n media.style.backgroundColor = color;\n\n item.append(media);\n grid.append(item);\n });\n\n attachClickEvent(grid, (e) => {\n const target = findUpClassName(e.target, 'grid-item');\n if(!target || target.classList.contains('active')) {\n return;\n }\n\n const color = target.dataset.color;\n if(!color) {\n return;\n }\n\n this.applyColor(color);\n }, {listenerSetter: this.listenerSetter});\n\n gridSection.content.append(grid);\n this.scrollable.append(gridSection.container);\n\n this.applyColor = throttle(this._applyColor, 16, true);\n }\n\n private setActive() {\n const active = this.grid.querySelector('.active');\n const background = this.theme.background;\n const target = background.color ? this.grid.querySelector(`.grid-item[data-color=\"${background.color}\"]`) : null;\n if(active === target) {\n return;\n }\n\n if(active) {\n active.classList.remove('active');\n }\n\n if(target) {\n target.classList.add('active');\n }\n }\n\n private _applyColor = (hex: string, updateColorPicker = true) => {\n if(updateColorPicker) {\n this.colorPicker.setColor(hex);\n } else {\n const rgba = hexaToRgba(hex);\n const background = this.theme.background;\n const hsla = highlightningColor(rgba);\n\n background.id = '2';\n background.intensity = 0;\n background.slug = '';\n background.color = hex.toLowerCase();\n background.highlightningColor = hsla;\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\n\n appImManager.applyCurrentTheme(undefined, undefined, true);\n this.setActive();\n }\n };\n\n private onColorChange = (color: ColorPickerColor) => {\n this.applyColor(color.hex, false);\n };\n\n onOpen() {\n setTimeout(() => {\n const background = this.theme.background;\n\n const color = (background.color || '').split(',')[0];\n const isColored = !!color && !background.slug;\n\n // * set active if type is color\n if(isColored) {\n this.colorPicker.onChange = this.onColorChange;\n }\n\n this.colorPicker.setColor(color || '#cccccc');\n\n if(!isColored) {\n this.colorPicker.onChange = this.onColorChange;\n }\n }, 0);\n }\n\n onCloseAfterTimeout() {\n this.colorPicker.onChange = undefined;\n this.colorPicker = undefined;\n\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {averageColor, averageColorFromCanvas} from '../../../helpers/averageColor';\nimport blur from '../../../helpers/blur';\nimport deferredPromise, {CancellablePromise} from '../../../helpers/cancellablePromise';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport highlightningColor from '../../../helpers/highlightningColor';\nimport copy from '../../../helpers/object/copy';\nimport sequentialDom from '../../../helpers/sequentialDom';\nimport ChatBackgroundGradientRenderer from '../../chat/gradientRenderer';\nimport {Document, PhotoSize, WallPaper} from '../../../layer';\nimport {MyDocument} from '../../../lib/appManagers/appDocsManager';\nimport appDownloadManager, {AppDownloadManager, DownloadBlob} from '../../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport rootScope from '../../../lib/rootScope';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport ProgressivePreloader from '../../preloader';\nimport {SliderSuperTab} from '../../slider';\nimport AppBackgroundColorTab from './backgroundColor';\nimport choosePhotoSize from '../../../lib/appManagers/utils/photos/choosePhotoSize';\nimport {STATE_INIT, Theme} from '../../../config/state';\nimport themeController from '../../../helpers/themeController';\nimport requestFile from '../../../helpers/files/requestFile';\nimport {renderImageFromUrlPromise} from '../../../helpers/dom/renderImageFromUrl';\nimport scaleMediaElement from '../../../helpers/canvas/scaleMediaElement';\nimport {MediaSize} from '../../../helpers/mediaSize';\nimport wrapPhoto from '../../wrappers/photo';\nimport {CreateRowFromCheckboxField} from '../../row';\nimport {generateSection} from '../../settingSection';\n\nexport default class AppBackgroundTab extends SliderSuperTab {\n private grid: HTMLElement;\n private tempId = 0;\n private clicked: Set = new Set();\n private blurCheckboxField: CheckboxField;\n\n private wallPapersByElement: Map = new Map();\n private elementsByKey: Map = new Map();\n\n private get theme() {\n return themeController.getTheme();\n }\n\n init() {\n this.container.classList.add('background-container', 'background-image-container');\n this.setTitle('ChatBackground');\n\n {\n const container = generateSection(this.scrollable);\n\n const uploadButton = Button('btn-primary btn-transparent', {icon: 'cameraadd', text: 'ChatBackground.UploadWallpaper'});\n const colorButton = Button('btn-primary btn-transparent', {icon: 'colorize', text: 'SetColor'});\n const resetButton = Button('btn-primary btn-transparent', {icon: 'favourites', text: 'Appearance.Reset'});\n\n attachClickEvent(uploadButton, this.onUploadClick, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(colorButton, () => {\n this.slider.createTab(AppBackgroundColorTab).open();\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(resetButton, this.onResetClick, {listenerSetter: this.listenerSetter});\n\n const blurCheckboxField = this.blurCheckboxField = new CheckboxField({\n text: 'ChatBackground.Blur',\n name: 'blur',\n checked: this.theme.background.blur\n });\n\n this.listenerSetter.add(blurCheckboxField.input)('change', async() => {\n this.theme.background.blur = blurCheckboxField.input.checked;\n await this.managers.appStateManager.pushToState('settings', rootScope.settings);\n\n // * wait for animation end\n setTimeout(() => {\n const active = grid.querySelector('.active') as HTMLElement;\n if(!active) return;\n\n const wallpaper = this.wallPapersByElement.get(active);\n if((wallpaper as WallPaper.wallPaper).pFlags.pattern || wallpaper._ === 'wallPaperNoFile') {\n return;\n }\n\n this.setBackgroundDocument(wallpaper);\n }, 100);\n });\n\n container.append(\n uploadButton,\n colorButton,\n resetButton,\n CreateRowFromCheckboxField(blurCheckboxField).container\n );\n }\n\n rootScope.addEventListener('background_change', this.setActive);\n\n this.managers.appDocsManager.getWallPapers().then((wallPapers) => {\n wallPapers.forEach((wallPaper) => {\n this.addWallPaper(wallPaper);\n });\n });\n\n const gridContainer = generateSection(this.scrollable);\n const grid = this.grid = document.createElement('div');\n grid.classList.add('grid');\n attachClickEvent(grid, this.onGridClick, {listenerSetter: this.listenerSetter});\n gridContainer.append(grid);\n }\n\n private onUploadClick = () => {\n requestFile('image/x-png,image/png,image/jpeg').then(async(file) => {\n if(file.name.endsWith('.png')) {\n const img = document.createElement('img');\n const url = URL.createObjectURL(file);\n await renderImageFromUrlPromise(img, url, false);\n const mimeType = 'image/jpeg';\n const {blob} = await scaleMediaElement({media: img, size: new MediaSize(img.naturalWidth, img.naturalHeight), mimeType});\n file = new File([blob], file.name.replace(/\\.png$/, '.jpg'), {type: mimeType});\n }\n\n const wallPaper = await this.managers.appDocsManager.prepareWallPaperUpload(file);\n const uploadPromise = this.managers.appDocsManager.uploadWallPaper(wallPaper.id);\n const uploadDeferred: CancellablePromise = appDownloadManager.getNewDeferredForUpload(file.name, uploadPromise);\n\n const deferred = deferredPromise();\n deferred.addNotifyListener = uploadDeferred.addNotifyListener;\n deferred.cancel = uploadDeferred.cancel;\n\n uploadDeferred.then((wallPaper) => {\n this.clicked.delete(key);\n this.elementsByKey.delete(key);\n this.wallPapersByElement.set(container, wallPaper);\n const newKey = this.getWallPaperKey(wallPaper);\n this.elementsByKey.set(newKey, container);\n\n this.setBackgroundDocument(wallPaper).then(deferred.resolve, deferred.reject);\n }, deferred.reject);\n\n const key = this.getWallPaperKey(wallPaper);\n deferred.catch(() => {\n container.remove();\n });\n\n const preloader = new ProgressivePreloader({\n isUpload: true,\n cancelable: true,\n tryAgainOnFail: false\n });\n\n const container = this.addWallPaper(wallPaper, false);\n this.clicked.add(key);\n\n preloader.attach(container, false, deferred);\n });\n };\n\n private onResetClick = () => {\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === this.theme.name);\n if(defaultTheme) {\n ++this.tempId;\n this.theme.background = copy(defaultTheme.background);\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\n appImManager.applyCurrentTheme(undefined, undefined, true);\n this.blurCheckboxField.setValueSilently(this.theme.background.blur);\n }\n };\n\n private getColorsFromWallPaper(wallPaper: WallPaper) {\n return wallPaper.settings ? [\n wallPaper.settings.background_color,\n wallPaper.settings.second_background_color,\n wallPaper.settings.third_background_color,\n wallPaper.settings.fourth_background_color\n ].filter(Boolean).map((color) => '#' + color.toString(16)).join(',') : '';\n }\n\n private getWallPaperKey(wallPaper: WallPaper) {\n return '' + wallPaper.id;\n }\n\n private getWallPaperKeyFromTheme(theme: Theme) {\n return '' + theme.background.id;\n }\n\n private addWallPaper(wallPaper: WallPaper, append = true) {\n const colors = this.getColorsFromWallPaper(wallPaper);\n const hasFile = wallPaper._ === 'wallPaper';\n if((hasFile && wallPaper.pFlags.pattern && !colors)/* ||\n (wallpaper.document as MyDocument).mime_type.indexOf('application/') === 0 */) {\n return;\n }\n\n const isDark = !!wallPaper.pFlags.dark;\n\n const doc = hasFile ? wallPaper.document as Document.document : undefined;\n\n const container = document.createElement('div');\n container.classList.add('grid-item');\n\n container.dataset.id = '' + wallPaper.id;\n\n const key = this.getWallPaperKey(wallPaper);\n this.wallPapersByElement.set(container, wallPaper);\n this.elementsByKey.set(key, container);\n\n const media = document.createElement('div');\n media.classList.add('grid-item-media');\n\n let wrapped: ReturnType, size: ReturnType;\n if(hasFile) {\n size = choosePhotoSize(doc, 200, 200);\n wrapped = wrapPhoto({\n photo: doc,\n message: null,\n container: media,\n withoutPreloader: true,\n size: size,\n noFadeIn: wallPaper.pFlags.pattern\n });\n\n if(wallPaper.pFlags.pattern) {\n media.classList.add('is-pattern');\n }\n\n wrapped.then(async({loadPromises, images}) => {\n await loadPromises.thumb || loadPromises.full;\n return images;\n }).then((images) => {\n if(wallPaper.pFlags.pattern) {\n if(isDark) {\n images.full.style.display = 'none';\n if(images.thumb) {\n images.thumb.style.display = 'none';\n }\n } else if(wallPaper.settings?.intensity) {\n images.full.style.opacity = '' + Math.abs(wallPaper.settings.intensity) / 100;\n }\n }\n\n sequentialDom.mutate(() => {\n container.append(media);\n });\n });\n } else {\n container.append(media);\n }\n\n if(wallPaper.settings && wallPaper.settings.background_color !== undefined) {\n const {canvas} = ChatBackgroundGradientRenderer.create(colors);\n canvas.classList.add('background-colors-canvas');\n\n if(isDark && hasFile) {\n wrapped.then(({loadPromises}) => {\n loadPromises.full.then(async() => {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc, size.type);\n canvas.style.webkitMaskImage = `url(${cacheContext.url})`;\n canvas.style.opacity = '' + (wallPaper.pFlags.dark ? 100 + wallPaper.settings.intensity : wallPaper.settings.intensity) / 100;\n media.append(canvas);\n });\n });\n } else {\n media.append(canvas);\n }\n }\n\n if(this.getWallPaperKeyFromTheme(this.theme) === key) {\n container.classList.add('active');\n }\n\n this.grid[append ? 'append' : 'prepend'](container);\n\n return container;\n }\n\n private onGridClick = (e: MouseEvent | TouchEvent) => {\n const target = findUpClassName(e.target, 'grid-item') as HTMLElement;\n if(!target) return;\n\n const wallpaper = this.wallPapersByElement.get(target);\n if(wallpaper._ === 'wallPaperNoFile') {\n this.setBackgroundDocument(wallpaper);\n return;\n }\n\n const key = this.getWallPaperKey(wallpaper);\n if(this.clicked.has(key)) return;\n this.clicked.add(key);\n\n const doc = wallpaper.document as MyDocument;\n const preloader = new ProgressivePreloader({\n cancelable: true,\n tryAgainOnFail: false\n });\n\n const load = async() => {\n const promise = this.setBackgroundDocument(wallpaper);\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\n if(!cacheContext.url || this.theme.background.blur) {\n preloader.attach(target, true, promise);\n }\n };\n\n preloader.construct();\n\n attachClickEvent(target, (e) => {\n if(preloader.preloader.parentElement) {\n preloader.onClick(e);\n preloader.detach();\n } else {\n load();\n }\n }, {listenerSetter: this.listenerSetter});\n\n load();\n\n // console.log(doc);\n };\n\n private saveToCache = (slug: string, url: string) => {\n fetch(url).then((response) => {\n appImManager.cacheStorage.save('backgrounds/' + slug, response);\n });\n };\n\n private setBackgroundDocument = (wallPaper: WallPaper) => {\n const _tempId = ++this.tempId;\n const middleware = () => _tempId === this.tempId;\n\n const doc = (wallPaper as WallPaper.wallPaper).document as MyDocument;\n const deferred = deferredPromise();\n let download: Promise | ReturnType;\n if(doc) {\n download = appDownloadManager.downloadMediaURL({media: doc, queueId: appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : 0});\n deferred.addNotifyListener = download.addNotifyListener;\n deferred.cancel = download.cancel;\n } else {\n download = Promise.resolve();\n }\n\n download.then(async() => {\n if(!middleware()) {\n deferred.resolve();\n return;\n }\n\n const background = this.theme.background;\n const onReady = (url?: string) => {\n // const perf = performance.now();\n let getPixelPromise: Promise;\n const backgroundColor = this.getColorsFromWallPaper(wallPaper);\n if(url && !backgroundColor) {\n getPixelPromise = averageColor(url);\n } else {\n const {canvas} = ChatBackgroundGradientRenderer.create(backgroundColor);\n getPixelPromise = Promise.resolve(averageColorFromCanvas(canvas));\n }\n\n getPixelPromise.then((pixel) => {\n if(!middleware()) {\n deferred.resolve();\n return;\n }\n\n const hsla = highlightningColor(Array.from(pixel) as any);\n // const hsla = 'rgba(0, 0, 0, 0.3)';\n // console.log(doc, hsla, performance.now() - perf);\n\n const slug = (wallPaper as WallPaper.wallPaper).slug ?? '';\n background.id = wallPaper.id;\n background.intensity = wallPaper.settings?.intensity ?? 0;\n background.color = backgroundColor;\n background.slug = slug;\n background.highlightningColor = hsla;\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\n\n if(slug) {\n this.saveToCache(slug, url);\n }\n\n appImManager.applyCurrentTheme(slug, url, true).then(deferred.resolve);\n });\n };\n\n if(!doc) {\n onReady();\n return;\n }\n\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\n if(background.blur) {\n setTimeout(() => {\n const {canvas, promise} = blur(cacheContext.url, 12, 4)\n promise.then(() => {\n if(!middleware()) {\n deferred.resolve();\n return;\n }\n\n onReady(canvas.toDataURL());\n });\n }, 200);\n } else {\n onReady(cacheContext.url);\n }\n });\n\n return deferred;\n };\n\n private setActive = () => {\n const active = this.grid.querySelector('.active');\n const target = this.elementsByKey.get(this.getWallPaperKeyFromTheme(this.theme));\n if(active === target) {\n return;\n }\n\n if(active) {\n active.classList.remove('active');\n }\n\n if(target) {\n target.classList.add('active');\n }\n };\n}\n","export default function requestFile(accept?: string) {\n const input = document.createElement('input');\n input.type = 'file';\n input.style.display = 'none';\n\n if(accept) {\n input.accept = accept;\n }\n\n document.body.append(input);\n\n const promise = new Promise((resolve, reject) => {\n input.addEventListener('change', (e: any) => {\n const file: File = e.target.files[0];\n if(!file) {\n reject('NO_FILE_SELECTED');\n return;\n }\n\n resolve(file);\n }, {once: true});\n }).finally(() => {\n input.remove();\n });\n\n input.click();\n\n return promise;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AvailableReaction} from '../../../layer';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport SettingSection from '../../settingSection';\nimport SliderSuperTab from '../../sliderTab';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\n\nexport default class AppQuickReactionTab extends SliderSuperTab {\n public init() {\n this.setTitle('DoubleTapSetting');\n this.container.classList.add('quick-reaction-container');\n\n return Promise.all([\n this.managers.appReactionsManager.getQuickReaction(),\n this.managers.appReactionsManager.getAvailableReactions()\n ]).then(([quickReaction, availableReactions]) => {\n availableReactions = availableReactions.filter((reaction) => !reaction.pFlags.inactive);\n\n const section = new SettingSection();\n\n const name = 'quick-reaction';\n const rows = availableReactions.map((availableReaction) => {\n const radioField = new RadioField({\n name,\n text: availableReaction.title,\n value: availableReaction.reaction,\n alignRight: true\n });\n\n const row = new Row({\n radioField,\n havePadding: true\n });\n\n radioField.main.classList.add('quick-reaction-title');\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n if(availableReaction.reaction === (quickReaction as AvailableReaction).reaction) {\n radioField.setValueSilently(true);\n }\n\n return row;\n });\n\n const form = RadioFormFromRows(rows, (value) => {\n this.managers.appReactionsManager.setDefaultReaction({_: 'reactionEmoji', emoticon: value});\n });\n\n section.content.append(form);\n this.scrollable.append(section.container);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport RangeSelector from '../../rangeSelector';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport RadioField from '../../radioField';\nimport rootScope from '../../../lib/rootScope';\nimport {IS_APPLE} from '../../../environment/userAgent';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport AppBackgroundTab from './background';\nimport {LangPackKey, _i18n} from '../../../lib/langPack';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport assumeType from '../../../helpers/assumeType';\nimport {AvailableReaction, MessagesAllStickers, StickerSet} from '../../../layer';\nimport LazyLoadQueue from '../../lazyLoadQueue';\nimport PopupStickers from '../../popups/stickers';\nimport eachMinute from '../../../helpers/eachMinute';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport IS_GEOLOCATION_SUPPORTED from '../../../environment/geolocationSupport';\nimport AppQuickReactionTab from './quickReaction';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport {State} from '../../../config/state';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\nimport SettingSection, {generateSection} from '../../settingSection';\n\nexport class RangeSettingSelector {\n public container: HTMLDivElement;\n public valueContainer: HTMLElement;\n private range: RangeSelector;\n\n public onChange: (value: number) => void;\n\n constructor(\n name: LangPackKey,\n step: number,\n initialValue: number,\n minValue: number,\n maxValue: number,\n writeValue = true\n ) {\n const BASE_CLASS = 'range-setting-selector';\n this.container = document.createElement('div');\n this.container.classList.add(BASE_CLASS);\n\n const details = document.createElement('div');\n details.classList.add(BASE_CLASS + '-details');\n\n const nameDiv = document.createElement('div');\n nameDiv.classList.add(BASE_CLASS + '-name');\n _i18n(nameDiv, name);\n\n const valueDiv = this.valueContainer = document.createElement('div');\n valueDiv.classList.add(BASE_CLASS + '-value');\n\n if(writeValue) {\n valueDiv.innerHTML = '' + initialValue;\n }\n\n details.append(nameDiv, valueDiv);\n\n this.range = new RangeSelector({\n step,\n min: minValue,\n max: maxValue\n }, initialValue);\n this.range.setListeners();\n this.range.setHandlers({\n onScrub: value => {\n if(this.onChange) {\n this.onChange(value);\n }\n\n if(writeValue) {\n // console.log('font size scrub:', value);\n valueDiv.innerText = '' + value;\n }\n }\n });\n\n this.container.append(details, this.range.container);\n }\n}\n\nexport default class AppGeneralSettingsTab extends SliderSuperTabEventable {\n init() {\n this.container.classList.add('general-settings-container');\n this.setTitle('General');\n\n const section = generateSection.bind(null, this.scrollable);\n\n {\n const container = section('Settings');\n\n const range = new RangeSettingSelector('TextSize', 1, rootScope.settings.messagesTextSize, 12, 20);\n range.onChange = (value) => {\n rootScope.managers.appStateManager.setByKey('settings.messagesTextSize', value);\n };\n\n const chatBackgroundButton = Button('btn-primary btn-transparent', {icon: 'image', text: 'ChatBackground'});\n\n attachClickEvent(chatBackgroundButton, () => {\n this.slider.createTab(AppBackgroundTab).open();\n });\n\n const animationsCheckboxField = new CheckboxField({\n text: 'EnableAnimations',\n name: 'animations',\n stateKey: 'settings.animationsEnabled',\n listenerSetter: this.listenerSetter\n });\n\n container.append(\n range.container,\n chatBackgroundButton,\n CreateRowFromCheckboxField(animationsCheckboxField).container\n );\n }\n\n {\n const container = section('General.Keyboard');\n\n const form = document.createElement('form');\n\n const name = 'send-shortcut';\n const stateKey = 'settings.sendShortcut';\n\n const enterRow = new Row({\n radioField: new RadioField({\n langKey: 'General.SendShortcut.Enter',\n name,\n value: 'enter',\n stateKey\n }),\n subtitleLangKey: 'General.SendShortcut.NewLine.ShiftEnter'\n });\n\n const ctrlEnterRow = new Row({\n radioField: new RadioField({\n name,\n value: 'ctrlEnter',\n stateKey\n }),\n subtitleLangKey: 'General.SendShortcut.NewLine.Enter'\n });\n _i18n(ctrlEnterRow.radioField.main, 'General.SendShortcut.CtrlEnter', [IS_APPLE ? '⌘' : 'Ctrl']);\n\n form.append(enterRow.container, ctrlEnterRow.container);\n container.append(form);\n }\n\n if(IS_GEOLOCATION_SUPPORTED) {\n const container = section('DistanceUnitsTitle');\n\n const form = document.createElement('form');\n\n const name = 'distance-unit';\n const stateKey = 'settings.distanceUnit';\n\n const kilometersRow = new Row({\n radioField: new RadioField({\n langKey: 'DistanceUnitsKilometers',\n name,\n value: 'kilometers',\n stateKey\n })\n });\n\n const milesRow = new Row({\n radioField: new RadioField({\n langKey: 'DistanceUnitsMiles',\n name,\n value: 'miles',\n stateKey\n })\n });\n\n form.append(kilometersRow.container, milesRow.container);\n container.append(form);\n }\n\n {\n const container = section('General.TimeFormat');\n\n const form = document.createElement('form');\n\n const name = 'time-format';\n const stateKey = 'settings.timeFormat';\n\n const formats: [State['settings']['timeFormat'], LangPackKey][] = [\n ['h12', 'General.TimeFormat.h12'],\n ['h23', 'General.TimeFormat.h23']\n ];\n\n const rows = formats.map(([format, langPackKey]) => {\n const row = new Row({\n radioField: new RadioField({\n langKey: langPackKey,\n name,\n value: format,\n stateKey\n })\n });\n\n return row;\n });\n\n const cancel = eachMinute(() => {\n const date = new Date();\n\n formats.forEach(([format], idx) => {\n const str = date.toLocaleTimeString('en-us-u-hc-' + format, {\n hour: '2-digit',\n minute: '2-digit'\n });\n\n rows[idx].subtitle.textContent = str;\n });\n });\n\n this.eventListener.addEventListener('destroy', cancel);\n\n form.append(...rows.map((row) => row.container));\n container.append(form);\n }\n\n {\n const container = section('Emoji');\n\n const suggestCheckboxField = new CheckboxField({\n text: 'GeneralSettings.EmojiPrediction',\n name: 'suggest-emoji',\n stateKey: 'settings.emoji.suggest',\n listenerSetter: this.listenerSetter\n });\n const bigCheckboxField = new CheckboxField({\n text: 'GeneralSettings.BigEmoji',\n name: 'emoji-big',\n stateKey: 'settings.emoji.big',\n listenerSetter: this.listenerSetter\n });\n\n container.append(\n CreateRowFromCheckboxField(suggestCheckboxField).container,\n CreateRowFromCheckboxField(bigCheckboxField).container\n );\n }\n\n {\n const section = new SettingSection({name: 'Telegram.InstalledStickerPacksController', caption: 'StickersBotInfo'});\n\n const reactionsRow = new Row({\n titleLangKey: 'DoubleTapSetting',\n havePadding: true,\n clickable: () => {\n this.slider.createTab(AppQuickReactionTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const renderQuickReaction = () => {\n this.managers.appReactionsManager.getQuickReaction().then((reaction) => {\n if(reaction._ === 'availableReaction') {\n return reaction.static_icon;\n } else {\n return this.managers.appEmojiManager.getCustomEmojiDocument(reaction.document_id);\n }\n }).then((doc) => {\n wrapStickerToRow({\n row: reactionsRow,\n doc,\n size: 'small'\n });\n });\n };\n\n renderQuickReaction();\n\n this.listenerSetter.add(rootScope)('quick_reaction', renderQuickReaction);\n\n const suggestCheckboxField = new CheckboxField({\n text: 'Stickers.SuggestStickers',\n name: 'suggest',\n stateKey: 'settings.stickers.suggest',\n listenerSetter: this.listenerSetter\n });\n const loopCheckboxField = new CheckboxField({\n text: 'InstalledStickers.LoopAnimated',\n name: 'loop',\n stateKey: 'settings.stickers.loop',\n listenerSetter: this.listenerSetter\n });\n\n const stickerSets: {[id: string]: Row} = {};\n\n const stickersContent = section.generateContentElement();\n\n const lazyLoadQueue = new LazyLoadQueue();\n const renderStickerSet = (stickerSet: StickerSet.stickerSet, method: 'append' | 'prepend' = 'append') => {\n const row = new Row({\n title: wrapEmojiText(stickerSet.title),\n subtitleLangKey: 'Stickers',\n subtitleLangArgs: [stickerSet.count],\n havePadding: true,\n clickable: () => {\n new PopupStickers({id: stickerSet.id, access_hash: stickerSet.access_hash}).show();\n },\n listenerSetter: this.listenerSetter\n });\n\n stickerSets[stickerSet.id] = row;\n\n const div = document.createElement('div');\n div.classList.add('row-media');\n\n wrapStickerSetThumb({\n set: stickerSet,\n container: div,\n group: 'GENERAL-SETTINGS',\n lazyLoadQueue,\n width: 36,\n height: 36,\n autoplay: true\n });\n\n row.container.append(div);\n\n stickersContent[method](row.container);\n };\n\n this.managers.appStickersManager.getAllStickers().then((allStickers) => {\n assumeType(allStickers);\n for(const stickerSet of allStickers.sets) {\n renderStickerSet(stickerSet);\n }\n });\n\n this.listenerSetter.add(rootScope)('stickers_installed', (set) => {\n if(!stickerSets[set.id]) {\n renderStickerSet(set, 'prepend');\n }\n });\n\n this.listenerSetter.add(rootScope)('stickers_deleted', (set) => {\n if(stickerSets[set.id]) {\n stickerSets[set.id].container.remove();\n delete stickerSets[set.id];\n }\n });\n\n section.content.append(\n reactionsRow.container,\n CreateRowFromCheckboxField(suggestCheckboxField).container,\n CreateRowFromCheckboxField(loopCheckboxField).container\n );\n this.scrollable.append(section.container);\n }\n }\n\n onOpen() {\n if(this.init) {\n this.init();\n this.init = null;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport eachTimeout from './eachTimeout';\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachMinute(callback: () => any, runFirst = true) {\n return eachTimeout(callback, () => (60 - new Date().getSeconds()) * 1000, runFirst);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from '../environment/ctx';\nimport noop from './noop';\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachTimeout(callback: () => any, getNextTimeout: () => number, runFirst = true) {\n const cancel = () => {\n clearTimeout(timeout);\n };\n\n // replace callback to run noop and restore after\n const _callback = callback;\n if(!runFirst) {\n callback = noop;\n }\n\n let timeout: number;\n (function run() {\n callback();\n timeout = ctx.setTimeout(run, getNextTimeout());\n })();\n\n callback = _callback;\n\n return cancel;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDialogFilter} from '../../../lib/storages/filters';\nimport type {DialogFilterSuggested} from '../../../layer';\nimport type _rootScope from '../../../lib/rootScope';\nimport {SliderSuperTab} from '../../slider';\nimport lottieLoader, {LottieLoader} from '../../../lib/rlottie/lottieLoader';\nimport Button from '../../button';\nimport rootScope from '../../../lib/rootScope';\nimport AppEditFolderTab from './editFolder';\nimport Row from '../../row';\nimport {i18n, i18n_, LangPackKey, join} from '../../../lib/langPack';\nimport cancelEvent from '../../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, REAL_FOLDERS} from '../../../lib/mtproto/mtproto_config';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport SettingSection from '../../settingSection';\nimport Sortable from '../../../helpers/dom/sortable';\nimport whichChild from '../../../helpers/dom/whichChild';\nimport indexOfAndSplice from '../../../helpers/array/indexOfAndSplice';\nimport showLimitPopup from '../../popups/limit';\n\nexport default class AppChatFoldersTab extends SliderSuperTab {\n private createFolderBtn: HTMLElement;\n private foldersSection: SettingSection;\n private suggestedSection: SettingSection;\n private stickerContainer: HTMLElement;\n private animation: RLottiePlayer;\n private list: HTMLElement;\n\n private filtersRendered: {[filterId: number]: Row} = {};\n private loadAnimationPromise: ReturnType;\n\n public static getInitArgs() {\n return lottieLoader.loadAnimationFromURLManually('Folders_1');\n }\n\n private async renderFolder(\n dialogFilter: DialogFilterSuggested | MyDialogFilter,\n container?: HTMLElement,\n row?: Row,\n append?: boolean\n ) {\n let filter: MyDialogFilter;\n let description = '';\n const d: HTMLElement[] = [];\n if(dialogFilter._ === 'dialogFilterSuggested') {\n filter = dialogFilter.filter as MyDialogFilter;\n description = dialogFilter.description;\n } else {\n filter = dialogFilter;\n\n const enabledFilters = Object.keys(filter.pFlags).length;\n /* (['include_peers', 'exclude_peers'] as ['include_peers', 'exclude_peers']).forEach((key) => {\n enabledFilters += +!!filter[key].length;\n }); */\n\n if(enabledFilters === 1) {\n const pFlags = filter.pFlags;\n let k: LangPackKey;\n if(pFlags.contacts) k = 'FilterAllContacts';\n else if(pFlags.non_contacts) k = 'FilterAllNonContacts';\n else if(pFlags.groups) k = 'FilterAllGroups';\n else if(pFlags.broadcasts) k = 'FilterAllChannels';\n else if(pFlags.bots) k = 'FilterAllBots';\n\n if(k) {\n d.push(i18n(k));\n }\n }\n\n if(!d.length) {\n const folder = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\n let chats = 0, channels = 0, groups = 0;\n await Promise.all(folder.map(async(dialog) => {\n if(await this.managers.appPeersManager.isAnyGroup(dialog.peerId)) groups++;\n else if(await this.managers.appPeersManager.isBroadcast(dialog.peerId)) channels++;\n else chats++;\n }));\n\n if(chats) d.push(i18n('Chats', [chats]));\n if(channels) d.push(i18n('Channels', [channels]));\n if(groups) d.push(i18n('Groups', [groups]));\n }\n }\n\n if(!row) {\n row = new Row({\n title: filter.id === FOLDER_ID_ALL ? i18n('FilterAllChats') : wrapEmojiText(filter.title),\n subtitle: description,\n clickable: true,\n buttonRightLangKey: dialogFilter._ === 'dialogFilterSuggested' ? 'Add' : undefined\n });\n\n if(d.length) {\n row.subtitle.append(...join(d));\n }\n\n if(dialogFilter._ === 'dialogFilter') {\n const filterId = filter.id;\n if(!this.filtersRendered[filter.id] && filter.id !== FOLDER_ID_ALL) {\n attachClickEvent(row.container, async() => {\n this.slider.createTab(AppEditFolderTab).open(await this.managers.filtersStorage.getFilter(filterId));\n }, {listenerSetter: this.listenerSetter});\n }\n\n this.filtersRendered[filter.id] = row;\n\n row.makeSortable();\n }\n } else {\n if(filter.id !== FOLDER_ID_ALL) {\n replaceContent(row.title, wrapEmojiText(filter.title));\n }\n\n row.subtitle.textContent = '';\n row.subtitle.append(...join(d));\n }\n\n const div = row.container;\n\n if(append) {\n const localId = (filter as MyDialogFilter).localId;\n if(localId !== undefined) {\n // ! header will be at 0 index\n positionElementByIndex(div, div.parentElement || container, localId);\n } else if(container) {\n container.append(div);\n }\n }\n\n return row;\n }\n\n public init(p: ReturnType = AppChatFoldersTab.getInitArgs()) {\n this.container.classList.add('chat-folders-container');\n this.setTitle('ChatList.Filter.List.Title');\n\n this.scrollable.container.classList.add('chat-folders');\n\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add('sticker-container');\n\n const caption = document.createElement('div');\n caption.classList.add('caption');\n i18n_({element: caption, key: 'ChatList.Filter.Header'});\n\n this.createFolderBtn = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'ChatList.Filter.NewTitle',\n icon: 'add'\n });\n\n this.foldersSection = new SettingSection({\n name: 'Filters'\n });\n this.foldersSection.container.classList.add('hide');\n\n this.list = document.createElement('div');\n this.foldersSection.content.append(this.list);\n\n this.suggestedSection = new SettingSection({\n name: 'FilterRecommended'\n });\n this.suggestedSection.container.classList.add('hide');\n\n this.scrollable.append(\n this.stickerContainer,\n caption,\n this.createFolderBtn,\n this.foldersSection.container,\n this.suggestedSection.container\n );\n\n attachClickEvent(this.createFolderBtn, async() => {\n if(!(await this.canCreateFolder())) {\n showLimitPopup('folders');\n } else {\n this.slider.createTab(AppEditFolderTab).open();\n }\n }, {listenerSetter: this.listenerSetter});\n\n const onFiltersContainerUpdate = () => {\n this.foldersSection.container.classList.toggle('hide', !Object.keys(this.filtersRendered).length);\n };\n\n this.managers.filtersStorage.getDialogFilters().then(async(filters) => {\n for(const filter of filters) {\n if(filter.id === FOLDER_ID_ARCHIVE) {\n continue;\n }\n\n await this.renderFolder(filter, this.list, undefined, true);\n }\n\n this.toggleAllChats();\n\n onFiltersContainerUpdate();\n });\n\n this.listenerSetter.add(rootScope)('filter_update', async(filter) => {\n const filterRendered = this.filtersRendered[filter.id];\n if(filterRendered) {\n await this.renderFolder(filter, null, filterRendered);\n } else if(filter.id !== FOLDER_ID_ARCHIVE) {\n await this.renderFolder(filter, this.list, undefined, true);\n }\n\n onFiltersContainerUpdate();\n\n this.getSuggestedFilters();\n });\n\n this.listenerSetter.add(rootScope)('filter_delete', (filter) => {\n const filterRendered = this.filtersRendered[filter.id];\n if(filterRendered) {\n /* for(const suggested of this.suggestedFilters) {\n if(deepEqual(suggested.filter, filter)) {\n\n }\n } */\n this.getSuggestedFilters();\n\n filterRendered.container.remove();\n delete this.filtersRendered[filter.id];\n }\n\n onFiltersContainerUpdate();\n });\n\n this.listenerSetter.add(rootScope)('filter_order', (order) => {\n order.filter((filterId) => !!this.filtersRendered[filterId]).forEach((filterId, idx) => {\n const filterRendered = this.filtersRendered[filterId];\n const container = filterRendered.container;\n positionElementByIndex(container, container.parentElement, idx + 1); // ! + 1 due to header\n });\n });\n\n this.listenerSetter.add(rootScope)('premium_toggle', () => {\n this.toggleAllChats();\n });\n\n this.loadAnimationPromise = p.then(async(cb) => {\n const player = await cb({\n container: this.stickerContainer,\n loop: false,\n autoplay: false,\n width: 86,\n height: 86\n });\n\n this.animation = player;\n\n return lottieLoader.waitForFirstFrame(player);\n });\n\n new Sortable({\n list: this.list,\n middleware: this.middlewareHelper.get(),\n onSort: (prevIdx, newIdx) => {\n let order: number[] = [];\n for(const filterId in this.filtersRendered) {\n const row = this.filtersRendered[filterId];\n const idx = whichChild(row.container);\n order[idx] = +filterId;\n }\n\n order = order.filter((filterId) => filterId !== undefined);\n if(!rootScope.premium) {\n indexOfAndSplice(order, FOLDER_ID_ALL);\n // order.unshift(FOLDER_ID_ALL);\n }\n\n this.managers.filtersStorage.updateDialogFiltersOrder(order);\n },\n scrollable: this.scrollable\n });\n\n this.getSuggestedFilters();\n\n /* return Promise.all([\n this.loadAnimationPromise\n ]); */\n return this.loadAnimationPromise;\n }\n\n onOpenAfterTimeout() {\n this.loadAnimationPromise.then(() => {\n this.animation.autoplay = true;\n this.animation.play();\n });\n\n return super.onOpenAfterTimeout();\n }\n\n private toggleAllChats() {\n const filterRendered = this.filtersRendered[FOLDER_ID_ALL];\n filterRendered.container.classList.toggle('hide', !rootScope.premium);\n }\n\n private async canCreateFolder() {\n const [limit, filters] = await Promise.all([\n this.managers.apiManager.getLimit('folders'),\n this.managers.filtersStorage.getDialogFilters()\n ]);\n\n const filtersLength = filters.filter((filter) => !REAL_FOLDERS.has(filter.id)).length;\n return filtersLength < limit;\n }\n\n private getSuggestedFilters() {\n return this.managers.filtersStorage.getSuggestedDialogsFilters().then(async(suggestedFilters) => {\n this.suggestedSection.container.classList.toggle('hide', !suggestedFilters.length);\n Array.from(this.suggestedSection.content.children).slice(1).forEach((el) => el.remove());\n\n for(const filter of suggestedFilters) {\n const row = await this.renderFolder(filter);\n this.suggestedSection.content.append(row.container);\n\n const button = row.buttonRight;\n attachClickEvent(button, async(e) => {\n cancelEvent(e);\n\n if(!(await this.canCreateFolder())) {\n showLimitPopup('folders');\n return;\n }\n\n button.setAttribute('disabled', 'true');\n\n const f = filter.filter as MyDialogFilter;\n f.includePeerIds = [];\n f.excludePeerIds = [];\n f.pinnedPeerIds = [];\n\n this.managers.filtersStorage.createDialogFilter(f, true).then(() => {\n row.container.remove();\n this.suggestedSection.container.classList.toggle('hide', this.suggestedSection.content.childElementCount === 1);\n }).finally(() => {\n button.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Row from '../../row';\nimport CheckboxField from '../../checkboxField';\nimport {InputNotifyPeer, Update} from '../../../layer';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport rootScope from '../../../lib/rootScope';\nimport {LangPackKey} from '../../../lib/langPack';\nimport copy from '../../../helpers/object/copy';\nimport convertKeyToInputKey from '../../../helpers/string/convertKeyToInputKey';\nimport {MUTE_UNTIL} from '../../../lib/mtproto/mtproto_config';\nimport apiManagerProxy from '../../../lib/mtproto/mtprotoworker';\nimport SettingSection from '../../settingSection';\n\ntype InputNotifyKey = Exclude;\n\nexport default class AppNotificationsTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('notifications-container');\n this.setTitle('Telegram.NotificationSettingsViewController');\n\n const NotifySection = (options: {\n name: LangPackKey,\n typeText: LangPackKey,\n inputKey: InputNotifyKey,\n }) => {\n const section = new SettingSection({\n name: options.name\n });\n\n const enabledRow = new Row({\n checkboxField: new CheckboxField({text: options.typeText, checked: true}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n const previewEnabledRow = new Row({\n checkboxField: new CheckboxField({text: 'MessagePreview', checked: true}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n section.content.append(enabledRow.container, previewEnabledRow.container);\n\n this.scrollable.append(section.container);\n\n const inputNotifyPeer = {_: options.inputKey};\n const ret = this.managers.appNotificationsManager.getNotifySettings(inputNotifyPeer);\n (ret instanceof Promise ? ret : Promise.resolve(ret)).then((notifySettings) => {\n const applySettings = async() => {\n const muted = await this.managers.appNotificationsManager.isMuted(notifySettings);\n enabledRow.checkboxField.checked = !muted;\n previewEnabledRow.checkboxField.checked = notifySettings.show_previews;\n\n return muted;\n };\n\n applySettings();\n\n this.eventListener.addEventListener('destroy', async() => {\n const mute = !enabledRow.checkboxField.checked;\n const showPreviews = previewEnabledRow.checkboxField.checked;\n\n if(mute === (await this.managers.appNotificationsManager.isMuted(notifySettings)) && showPreviews === notifySettings.show_previews) {\n return;\n }\n\n const inputSettings: any = copy(notifySettings);\n inputSettings._ = 'inputPeerNotifySettings';\n inputSettings.mute_until = mute ? MUTE_UNTIL : 0;\n inputSettings.show_previews = showPreviews;\n\n this.managers.appNotificationsManager.updateNotifySettings(inputNotifyPeer, inputSettings);\n }, {once: true});\n\n this.listenerSetter.add(rootScope)('notify_settings', (update: Update.updateNotifySettings) => {\n const inputKey = convertKeyToInputKey(update.peer._) as any;\n if(options.inputKey === inputKey) {\n notifySettings = update.notify_settings;\n applySettings();\n }\n });\n });\n };\n\n NotifySection({\n name: 'NotificationsPrivateChats',\n typeText: 'NotificationsForPrivateChats',\n inputKey: 'inputNotifyUsers'\n });\n\n NotifySection({\n name: 'NotificationsGroups',\n typeText: 'NotificationsForGroups',\n inputKey: 'inputNotifyChats'\n });\n\n NotifySection({\n name: 'NotificationsChannels',\n typeText: 'NotificationsForChannels',\n inputKey: 'inputNotifyBroadcasts'\n });\n\n {\n const section = new SettingSection({\n name: 'NotificationsOther'\n });\n\n const contactsSignUpRow = new Row({\n checkboxField: new CheckboxField({text: 'ContactJoined', checked: true}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n const soundRow = new Row({\n checkboxField: new CheckboxField({text: 'Notifications.Sound', checked: true, stateKey: 'settings.notifications.sound', listenerSetter: this.listenerSetter}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n apiManagerProxy.getState().then((state) => {\n soundRow.checkboxField.checked = state.settings.notifications.sound;\n });\n\n section.content.append(contactsSignUpRow.container, soundRow.container);\n\n this.scrollable.append(section.container);\n\n this.managers.appNotificationsManager.getContactSignUpNotification().then((enabled) => {\n contactsSignUpRow.checkboxField.checked = enabled;\n\n this.eventListener.addEventListener('destroy', () => {\n const _enabled = contactsSignUpRow.checkboxField.checked;\n if(enabled !== _enabled) {\n this.managers.appNotificationsManager.setContactSignUpNotification(!_enabled);\n }\n }, {once: true});\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {randomLong} from '../../../helpers/random';\nimport {LangPackLanguage} from '../../../layer';\nimport I18n from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTab} from '../../slider'\n\nexport default class AppLanguageTab extends SliderSuperTab {\n public static getInitArgs() {\n return {\n languages1: rootScope.managers.apiManager.invokeApiCacheable('langpack.getLanguages', {\n lang_pack: 'web'\n }),\n // languages2: rootScope.managers.apiManager.invokeApiCacheable('langpack.getLanguages', {\n // lang_pack: 'macos'\n // })\n languages2: Promise.resolve([] as LangPackLanguage[])\n };\n }\n\n public init(p: ReturnType) {\n this.header.classList.add('with-border');\n this.container.classList.add('language-container');\n this.setTitle('Telegram.LanguageViewController');\n\n const section = new SettingSection({});\n\n const radioRows: Map = new Map();\n\n const promise = Promise.all([\n p.languages1,\n p.languages2\n ]).then(([languages1, languages2]) => {\n const rendered: Set = new Set();\n const webLangCodes = languages1.map((language) => language.lang_code);\n\n const random = randomLong();\n languages1.concat(languages2).forEach((language) => {\n if(rendered.has(language.lang_code)) return;\n rendered.add(language.lang_code);\n\n const row = new Row({\n radioField: new RadioField({\n text: language.name,\n name: random,\n value: language.lang_code\n }),\n subtitle: language.native_name\n });\n\n radioRows.set(language.lang_code, row);\n });\n\n const form = RadioFormFromRows([...radioRows.values()], (value) => {\n I18n.getLangPack(value, webLangCodes.includes(value));\n });\n\n I18n.getCacheLangPack().then((langPack) => {\n const row = radioRows.get(langPack.lang_code);\n if(!row) {\n console.error('no row', row, langPack);\n return;\n }\n\n row.radioField.setValueSilently(true);\n });\n\n section.content.append(form);\n });\n\n this.scrollable.append(section.container);\n\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../../../../helpers/listenerSetter';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport CheckboxField from '../../../checkboxField';\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport Row, {CreateRowFromCheckboxField} from '../../../row';\nimport SettingSection from '../../../settingSection';\n\nexport function autoDownloadPeerTypeSection(type: 'photo' | 'video' | 'file', title: LangPackKey, listenerSetter: ListenerSetter) {\n const section = new SettingSection({name: title});\n\n const key = 'settings.autoDownload.' + type + '.';\n const contactsCheckboxField = new CheckboxField({\n text: 'AutodownloadContacts',\n name: 'contacts',\n stateKey: key + 'contacts',\n listenerSetter\n });\n const privateCheckboxField = new CheckboxField({\n text: 'AutodownloadPrivateChats',\n name: 'private',\n stateKey: key + 'private',\n listenerSetter\n });\n const groupsCheckboxField = new CheckboxField({\n text: 'AutodownloadGroupChats',\n name: 'groups',\n stateKey: key + 'groups',\n listenerSetter\n });\n const channelsCheckboxField = new CheckboxField({\n text: 'AutodownloadChannels',\n name: 'channels',\n stateKey: key + 'channels',\n listenerSetter\n });\n\n section.content.append(\n CreateRowFromCheckboxField(contactsCheckboxField).container,\n CreateRowFromCheckboxField(privateCheckboxField).container,\n CreateRowFromCheckboxField(groupsCheckboxField).container,\n CreateRowFromCheckboxField(channelsCheckboxField).container\n );\n\n return section;\n}\n\nexport default class AppAutoDownloadPhotoTab extends SliderSuperTabEventable {\n public init() {\n this.setTitle('AutoDownloadPhotos');\n\n const section = autoDownloadPeerTypeSection('photo', 'AutoDownloadPhotosTitle', this.listenerSetter);\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport formatBytes from '../../../../helpers/formatBytes';\nimport debounce from '../../../../helpers/schedulers/debounce';\nimport I18n from '../../../../lib/langPack';\nimport rootScope from '../../../../lib/rootScope';\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport {RangeSettingSelector} from '../generalSettings';\nimport {autoDownloadPeerTypeSection} from './photo';\n\nexport default class AppAutoDownloadFileTab extends SliderSuperTabEventable {\n public init() {\n this.setTitle('AutoDownloadFiles');\n\n const debouncedSave = debounce((sizeMax: number) => {\n this.managers.appStateManager.setByKey('settings.autoDownloadNew.file_size_max', sizeMax);\n }, 200, false, true);\n\n const section = autoDownloadPeerTypeSection('file', 'AutoDownloadFilesTitle', this.listenerSetter);\n\n const MIN = 512 * 1024;\n // const MAX = 2 * 1024 * 1024 * 1024;\n const MAX = 20 * 1024 * 1024;\n const MAX_RANGE = MAX - MIN;\n\n const sizeMax = rootScope.settings.autoDownloadNew.file_size_max;\n const value = Math.sqrt(Math.sqrt((sizeMax - MIN) / MAX_RANGE));\n const upTo = new I18n.IntlElement({\n key: 'AutodownloadSizeLimitUpTo',\n args: [formatBytes(sizeMax)]\n });\n const range = new RangeSettingSelector('AutoDownloadMaxFileSize', 0.01, value, 0, 1, false);\n range.onChange = (value) => {\n const sizeMax = (value ** 4 * MAX_RANGE + MIN) | 0;\n\n upTo.compareAndUpdate({args: [formatBytes(sizeMax)]});\n\n debouncedSave(sizeMax);\n };\n\n range.valueContainer.append(upTo.element);\n\n section.content.append(range.container);\n\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport {autoDownloadPeerTypeSection} from './photo';\n\nexport default class AppAutoDownloadVideoTab extends SliderSuperTabEventable {\n public init() {\n this.setTitle('AutoDownloadVideos');\n\n const section = autoDownloadPeerTypeSection('video', 'AutoDownloadVideosTitle', this.listenerSetter);\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AutoDownloadPeerTypeSettings, STATE_INIT} from '../../../config/state';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport formatBytes from '../../../helpers/formatBytes';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {FormatterArguments, i18n, join, LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport confirmationPopup from '../../confirmationPopup';\nimport Row from '../../row';\nimport {SliderSuperTabEventable, SliderSuperTabEventableConstructable} from '../../sliderTab';\nimport AppAutoDownloadFileTab from './autoDownload/file';\nimport AppAutoDownloadPhotoTab from './autoDownload/photo';\nimport AppAutoDownloadVideoTab from './autoDownload/video';\nimport apiManagerProxy from '../../../lib/mtproto/mtprotoworker';\nimport SettingSection from '../../settingSection';\n\nconst AUTO_DOWNLOAD_FOR_KEYS: {[k in keyof AutoDownloadPeerTypeSettings]: LangPackKey} = {\n contacts: 'AutoDownloadContacts',\n private: 'AutoDownloadPm',\n groups: 'AutoDownloadGroups',\n channels: 'AutoDownloadChannels'\n};\n\nexport default class AppDataAndStorageTab extends SliderSuperTabEventable {\n public async init() {\n this.setTitle('DataSettings');\n\n {\n const section = new SettingSection({name: 'AutomaticMediaDownload', caption: 'AutoDownloadAudioInfo'});\n\n const state = await apiManagerProxy.getState();\n\n const autoCheckboxField = new CheckboxField({\n text: 'AutoDownloadMedia',\n name: 'auto',\n checked: !state.settings.autoDownloadNew.pFlags.disabled,\n listenerSetter: this.listenerSetter\n });\n\n const autoRow = new Row({\n checkboxField: autoCheckboxField,\n listenerSetter: this.listenerSetter\n });\n\n const onChange = () => {\n toggleDisability([resetButton],\n deepEqual(state.settings.autoDownload, STATE_INIT.settings.autoDownload) &&\n deepEqual(state.settings.autoDownloadNew, STATE_INIT.settings.autoDownloadNew));\n };\n\n const setSubtitles = () => {\n this.setAutoDownloadSubtitle(photoRow, state.settings.autoDownload.photo /* state.settings.autoDownloadNew.photo_size_max */);\n this.setAutoDownloadSubtitle(videoRow, state.settings.autoDownload.video/* , state.settings.autoDownloadNew.video_size_max */);\n this.setAutoDownloadSubtitle(fileRow, state.settings.autoDownload.file, state.settings.autoDownloadNew.file_size_max);\n };\n\n const openTab = (tabConstructor: SliderSuperTabEventableConstructable) => {\n const tab = this.slider.createTab(tabConstructor);\n tab.open();\n\n this.listenerSetter.add(tab.eventListener)('destroy', () => {\n setSubtitles();\n onChange();\n }, {once: true});\n };\n\n const photoRow = new Row({\n titleLangKey: 'AutoDownloadPhotos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadPhotoTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const videoRow = new Row({\n titleLangKey: 'AutoDownloadVideos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadVideoTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const fileRow = new Row({\n titleLangKey: 'AutoDownloadFiles',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadFileTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const resetButton = Button('btn-primary btn-transparent primary', {icon: 'delete', text: 'ResetAutomaticMediaDownload'});\n attachClickEvent(resetButton, () => {\n confirmationPopup({\n titleLangKey: 'ResetAutomaticMediaDownloadAlertTitle',\n descriptionLangKey: 'ResetAutomaticMediaDownloadAlert',\n button: {\n langKey: 'Reset'\n }\n }).then(() => {\n const settings = rootScope.settings;\n settings.autoDownloadNew = copy(STATE_INIT.settings.autoDownloadNew);\n settings.autoDownload = copy(STATE_INIT.settings.autoDownload);\n state.settings = settings;\n this.managers.appStateManager.setByKey('settings', settings);\n\n setSubtitles();\n autoCheckboxField.checked = !state.settings.autoDownloadNew.pFlags.disabled;\n });\n });\n\n const onDisabledChange = () => {\n const disabled = !autoCheckboxField.checked;\n\n const settings = rootScope.settings;\n if(disabled) {\n settings.autoDownloadNew.pFlags.disabled = true;\n } else {\n delete settings.autoDownloadNew.pFlags.disabled;\n }\n\n [photoRow, videoRow, fileRow].forEach((row) => {\n row.container.classList.toggle('is-disabled', disabled);\n });\n\n this.managers.appStateManager.setByKey('settings', settings);\n\n onChange();\n };\n\n autoCheckboxField.input.addEventListener('change', onDisabledChange);\n onDisabledChange();\n setSubtitles();\n\n section.content.append(\n autoRow.container,\n photoRow.container,\n videoRow.container,\n fileRow.container,\n resetButton\n );\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'AutoplayMedia'});\n\n section.content.append(new Row({\n checkboxField: new CheckboxField({\n text: 'AutoplayGIF',\n name: 'gifs',\n stateKey: 'settings.autoPlay.gifs',\n listenerSetter: this.listenerSetter\n }),\n listenerSetter: this.listenerSetter\n }).container, new Row({\n checkboxField: new CheckboxField({\n text: 'AutoplayVideo',\n name: 'videos',\n stateKey: 'settings.autoPlay.videos',\n listenerSetter: this.listenerSetter\n }),\n listenerSetter: this.listenerSetter\n }).container);\n\n this.scrollable.append(section.container);\n }\n }\n\n private setAutoDownloadSubtitle(row: Row, settings: AutoDownloadPeerTypeSettings, sizeMax?: number) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n\n const peerKeys = Object.keys(settings) as (keyof typeof AUTO_DOWNLOAD_FOR_KEYS)[];\n const enabledKeys = peerKeys.map((key) => settings[key] ? AUTO_DOWNLOAD_FOR_KEYS[key] : undefined).filter(Boolean);\n if(!enabledKeys.length || sizeMax === 0) {\n key = 'AutoDownloadOff';\n } else {\n const isAll = enabledKeys.length === peerKeys.length;\n if(sizeMax !== undefined) {\n key = isAll ? 'AutoDownloadUpToOnAllChats' : 'AutoDownloadOnUpToFor';\n args.push(formatBytes(sizeMax));\n } else {\n key = isAll ? 'AutoDownloadOnAllChats' : 'AutoDownloadOnFor';\n }\n\n if(!isAll) {\n const fragment = document.createElement('span');\n fragment.append(...join(enabledKeys.map((key) => i18n(key)), true, false));\n args.push(fragment);\n }\n }\n\n replaceContent(row.subtitle, i18n(key, args));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport ButtonMenuToggle from '../../buttonMenuToggle';\nimport Button from '../../button';\nimport AppPrivacyAndSecurityTab from './privacyAndSecurity';\nimport AppGeneralSettingsTab from './generalSettings';\nimport AppEditProfileTab from './editProfile';\nimport AppChatFoldersTab from './chatFolders';\nimport AppNotificationsTab from './notifications';\nimport AppLanguageTab from './language';\nimport lottieLoader from '../../../lib/rlottie/lottieLoader';\nimport PopupPeer from '../../popups/peer';\nimport AppDataAndStorageTab from './dataAndStorage';\nimport ButtonIcon from '../../buttonIcon';\nimport PeerProfile from '../../peerProfile';\nimport rootScope from '../../../lib/rootScope';\nimport Row from '../../row';\nimport AppActiveSessionsTab from './activeSessions';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport {SliderSuperTabConstructable, SliderSuperTabEventable} from '../../sliderTab';\nimport PopupAvatar from '../../popups/avatar';\nimport {AccountAuthorizations, Authorization} from '../../../layer';\nimport PopupElement from '../../popups';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n// import AppMediaViewer from \"../../appMediaViewerNew\";\n\nexport default class AppSettingsTab extends SliderSuperTab {\n private buttons: {\n edit: HTMLButtonElement,\n folders: HTMLButtonElement,\n general: HTMLButtonElement,\n notifications: HTMLButtonElement,\n storage: HTMLButtonElement,\n privacy: HTMLButtonElement,\n } = {} as any;\n private profile: PeerProfile;\n\n private languageRow: Row;\n private devicesRow: Row;\n\n private authorizations: Authorization.authorization[];\n private getAuthorizationsPromise: Promise;\n\n public async init() {\n this.container.classList.add('settings-container');\n this.setTitle('Settings');\n\n const btnMenu = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [{\n icon: 'logout',\n text: 'EditAccount.Logout',\n onClick: () => {\n new PopupPeer('logout', {\n titleLangKey: 'LogOut',\n descriptionLangKey: 'LogOut.Description',\n buttons: [{\n langKey: 'LogOut',\n callback: () => {\n this.managers.apiManager.logOut();\n },\n isDanger: true\n }]\n }).show();\n }\n }]\n });\n\n this.buttons.edit = ButtonIcon('edit');\n\n this.header.append(this.buttons.edit, btnMenu);\n\n this.profile = new PeerProfile(this.managers, this.scrollable, this.listenerSetter, false);\n this.profile.init();\n this.profile.setPeer(rootScope.myId);\n const fillPromise = this.profile.fillProfileElements();\n\n const changeAvatarBtn = Button('btn-circle btn-corner z-depth-1 profile-change-avatar', {icon: 'cameraadd'});\n attachClickEvent(changeAvatarBtn, () => {\n const canvas = document.createElement('canvas');\n PopupElement.createPopup(PopupAvatar).open(canvas, (upload) => {\n upload().then((inputFile) => {\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\n });\n });\n }, {listenerSetter: this.listenerSetter});\n this.profile.element.lastElementChild.firstElementChild.append(changeAvatarBtn);\n\n const updateChangeAvatarBtn = async() => {\n const user = await this.managers.appUsersManager.getSelf();\n changeAvatarBtn.classList.toggle('hide', user.photo?._ !== 'userProfilePhoto');\n };\n\n updateChangeAvatarBtn();\n this.listenerSetter.add(rootScope)('avatar_update', ({peerId}) => {\n if(rootScope.myId === peerId) {\n updateChangeAvatarBtn();\n }\n });\n\n /* const div = document.createElement('div');\n //div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem 0 10rem auto;';\n //div.style.width = '135px';\n //div.style.height = '100px';\n div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem auto 10rem 0;';\n div.style.width = '135px';\n div.style.height = '100px';\n\n const img = document.createElement('img');\n img.src = 'assets/img/pepe.jpg';\n img.classList.add('media-photo');\n img.style.cssText = 'max-width: 100%;max-height: 100%;';\n\n div.append(img);\n\n div.addEventListener('click', () => {\n new AppMediaViewer().setSearchContext({peerId: 61004386, inputFilter: 'inputMessagesFilterPhotos'}).openMedia({\n _: 'message',\n mid: 1,\n peerId: 61004386,\n fromId: 61004386,\n message: '',\n media: {\n _: 'messageMediaPhoto',\n photo: {\n _: 'photo',\n url: img.src,\n downloaded: 111,\n sizes: [{\n _: 'photoSize',\n type: 'x',\n w: 618,\n h: 412\n }]\n }\n },\n date: Date.now() / 1000 | 0\n }, img);\n });\n\n this.scrollable.append(div); */\n\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add('profile-buttons');\n\n type ConstructorP = T extends {\n new (...args: any[]): infer U;\n } ? U : never;\n\n const m = (\n icon: string,\n text: LangPackKey,\n c: T,\n getInitArgs?: () => Promise['init']>>\n ): {\n icon: string,\n text: LangPackKey,\n tabConstructor: T,\n getInitArgs?: typeof getInitArgs,\n // args?: ReturnType\n args?: any\n } => {\n if(!getInitArgs) {\n const g = (c as any as typeof SliderSuperTab).getInitArgs;\n if(g) {\n // @ts-ignore\n getInitArgs = () => [g(this)];\n }\n }\n\n return {\n icon,\n text,\n tabConstructor: c,\n getInitArgs,\n args: getInitArgs?.()\n };\n };\n\n // const k = (c: T): () => [ReturnType['getInitArgs']>] => {\n // return () => (c as any).getInitArgs(this);\n // };\n\n const b = [\n m('unmute', 'AccountSettings.Notifications', AppNotificationsTab),\n m('data', 'DataSettings', AppDataAndStorageTab),\n m('lock', 'AccountSettings.PrivacyAndSecurity', AppPrivacyAndSecurityTab),\n m('settings', 'Telegram.GeneralSettingsViewController', AppGeneralSettingsTab),\n m('folder', 'AccountSettings.Filters', AppChatFoldersTab)\n ];\n\n const rows = b.map((item) => {\n const {icon, text: langPackKey, tabConstructor, getInitArgs} = item;\n return new Row({\n titleLangKey: langPackKey,\n icon,\n clickable: async() => {\n const args = item.args ? await item.args : [];\n const tab = this.slider.createTab(tabConstructor as any);\n tab.open(...args);\n\n if(tab instanceof SliderSuperTabEventable && getInitArgs) {\n tab.eventListener.addEventListener('destroyAfter', (promise) => {\n item.args = promise.then(() => getInitArgs() as any);\n });\n }\n },\n listenerSetter: this.listenerSetter\n });\n });\n\n const languageArgs = AppLanguageTab.getInitArgs();\n rows.push(\n this.devicesRow = new Row({\n titleLangKey: 'Devices',\n titleRightSecondary: ' ',\n icon: 'activesessions',\n clickable: async() => {\n if(!this.authorizations) {\n await this.updateActiveSessions();\n }\n\n const tab = this.slider.createTab(AppActiveSessionsTab);\n tab.authorizations = this.authorizations;\n tab.eventListener.addEventListener('destroy', () => {\n this.authorizations = undefined;\n this.updateActiveSessions(true);\n }, {once: true});\n tab.open();\n },\n listenerSetter: this.listenerSetter\n }),\n\n this.languageRow = new Row({\n titleLangKey: 'AccountSettings.Language',\n titleRightSecondary: i18n('LanguageName'),\n icon: 'language',\n clickable: () => {\n this.slider.createTab(AppLanguageTab).open(languageArgs);\n },\n listenerSetter: this.listenerSetter\n })\n );\n\n buttonsDiv.append(...rows.map((row) => row.container));\n\n // const profileSection = new SettingSection({fullWidth: true, noPaddingTop: true});\n // profileSection.content.append(this.profile.element);\n\n const buttonsSection = new SettingSection();\n buttonsSection.content.append(buttonsDiv);\n\n this.scrollable.append(this.profile.element/* profileSection.container */, buttonsSection.container);\n\n const getEditProfileArgs = () => {\n editProfileArgs = AppEditProfileTab.getInitArgs();\n };\n let editProfileArgs: ReturnType;\n attachClickEvent(this.buttons.edit, () => {\n const tab = this.slider.createTab(AppEditProfileTab);\n tab.open(editProfileArgs);\n }, {listenerSetter: this.listenerSetter});\n getEditProfileArgs();\n // this.listenerSetter.add(rootScope)('user_full_update', (userId) => {\n // if(rootScope.myId.toUserId() === userId) {\n // getEditProfileArgs();\n // }\n // });\n this.listenerSetter.add(rootScope)('user_update', (userId) => {\n if(rootScope.myId.toUserId() === userId) {\n getEditProfileArgs();\n }\n });\n\n lottieLoader.loadLottieWorkers();\n\n this.updateActiveSessions();\n\n (await fillPromise)();\n }\n\n private getAuthorizations(overwrite?: boolean) {\n if(this.getAuthorizationsPromise && !overwrite) return this.getAuthorizationsPromise;\n\n const promise = this.getAuthorizationsPromise = this.managers.apiManager.invokeApi('account.getAuthorizations')\n .finally(() => {\n if(this.getAuthorizationsPromise === promise) {\n this.getAuthorizationsPromise = undefined;\n }\n });\n\n return promise;\n }\n\n public updateActiveSessions(overwrite?: boolean) {\n return this.getAuthorizations(overwrite).then((auths) => {\n this.authorizations = auths.authorizations;\n this.devicesRow.titleRight.textContent = '' + this.authorizations.length;\n });\n }\n\n public onCloseAfterTimeout() {\n this.profile.destroy();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appSidebarLeft from '..';\nimport {InputFile} from '../../../layer';\nimport InputField from '../../inputField';\nimport {SliderSuperTab} from '../../slider';\nimport AvatarEdit from '../../avatarEdit';\nimport AppAddMembersTab from './addMembers';\nimport {_i18n} from '../../../lib/langPack';\nimport ButtonCorner from '../../buttonCorner';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\nexport default class AppNewChannelTab extends SliderSuperTab {\n private uploadAvatar: () => Promise = null;\n\n private channelNameInputField: InputField;\n private channelDescriptionInputField: InputField;\n private nextBtn: HTMLButtonElement;\n private avatarEdit: AvatarEdit;\n\n public init() {\n this.container.classList.add('new-channel-container');\n this.setTitle('NewChannel');\n\n this.avatarEdit = new AvatarEdit((_upload) => {\n this.uploadAvatar = _upload;\n });\n\n const section = new SettingSection({\n caption: 'Channel.DescriptionHolderDescrpiton'\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.channelNameInputField = new InputField({\n label: 'EnterChannelName',\n maxLength: 128\n });\n\n this.channelDescriptionInputField = new InputField({\n label: 'DescriptionOptionalPlaceholder',\n maxLength: 255\n });\n\n inputWrapper.append(this.channelNameInputField.container, this.channelDescriptionInputField.container);\n\n const onLengthChange = () => {\n this.nextBtn.classList.toggle('is-visible', !!this.channelNameInputField.value.length &&\n !this.channelNameInputField.input.classList.contains('error') &&\n !this.channelDescriptionInputField.input.classList.contains('error'));\n };\n\n this.channelNameInputField.input.addEventListener('input', onLengthChange);\n this.channelDescriptionInputField.input.addEventListener('input', onLengthChange);\n\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\n\n attachClickEvent(this.nextBtn, () => {\n const title = this.channelNameInputField.value;\n const about = this.channelDescriptionInputField.value;\n\n this.nextBtn.disabled = true;\n this.managers.appChatsManager.createChannel({\n title,\n about,\n broadcast: true\n }).then((channelId) => {\n if(this.uploadAvatar) {\n this.uploadAvatar().then((inputFile) => {\n this.managers.appChatsManager.editPhoto(channelId, inputFile);\n });\n }\n\n appImManager.setInnerPeer({peerId: channelId.toPeerId(true)});\n\n appSidebarLeft.removeTabFromHistory(this);\n this.slider.createTab(AppAddMembersTab).open({\n type: 'channel',\n skippable: true,\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo',\n takeOut: (peerIds) => {\n return this.managers.appChatsManager.inviteToChannel(channelId, peerIds);\n }\n });\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.content.append(this.nextBtn);\n section.content.append(this.avatarEdit.container, inputWrapper);\n this.scrollable.append(section.container);\n }\n\n public onCloseAfterTimeout() {\n this.avatarEdit.clear();\n this.uploadAvatar = null;\n this.channelNameInputField.value = '';\n this.channelDescriptionInputField.value = '';\n this.nextBtn.disabled = false;\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField from '../inputField';\nimport PopupElement from '.';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport EditPeer from '../editPeer';\nimport {_i18n} from '../../lib/langPack';\nimport TelInputField from '../telInputField';\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\nimport {toastNew} from '../toast';\n\nexport default class PopupCreateContact extends PopupElement {\n constructor() {\n super('popup-create-contact popup-send-photo popup-new-media', {closable: true, withConfirm: 'Add', title: 'AddContactTitle'});\n this.construct();\n }\n\n private async construct() {\n attachClickEvent(this.btnConfirm, () => {\n const promise = this.managers.appUsersManager.importContact(nameInputField.value, lastNameInputField.value, telInputField.value);\n\n promise.then(() => {\n this.hide();\n }, (err) => {\n if(err.type === 'NO_USER') {\n toastNew({langPackKey: 'Contacts.PhoneNumber.NotRegistred'});\n editPeer.disabled = false;\n }\n });\n\n editPeer.lockWithPromise(promise);\n }, {listenerSetter: this.listenerSetter});\n\n const inputFields: InputField[] = [];\n const div = document.createElement('div');\n div.classList.add('name-fields');\n const nameInputField = new InputField({\n label: 'FirstName',\n name: 'create-contact-name',\n maxLength: 70,\n required: true\n });\n const lastNameInputField = new InputField({\n label: 'LastName',\n name: 'create-contact-lastname',\n maxLength: 70\n });\n const telInputField = new TelInputField({required: true});\n inputFields.push(nameInputField, lastNameInputField, telInputField);\n\n const onInput = () => {\n const name = nameInputField.value + ' ' + lastNameInputField.value;\n // const abbr = getAbbreviation(name);\n editPeer.avatarElem.peerTitle = name;\n editPeer.avatarElem.update();\n };\n\n this.listenerSetter.add(nameInputField.input)('input', onInput);\n this.listenerSetter.add(lastNameInputField.input)('input', onInput);\n\n telInputField.validate = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n const user = await this.managers.appUsersManager.getSelf();\n const formatted = formatPhoneNumber(user.phone);\n if(formatted.code) {\n telInputField.value = '+' + formatted.code.country_code;\n }\n\n const editPeer = new EditPeer({\n inputFields,\n listenerSetter: this.listenerSetter,\n doNotEditAvatar: true,\n nextBtn: this.btnConfirm,\n avatarSize: 100\n });\n\n div.append(nameInputField.container, lastNameInputField.container, editPeer.avatarElem);\n this.container.append(div, telInputField.container);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport InputSearch from '../../inputSearch';\nimport {IS_MOBILE} from '../../../environment/userAgent';\nimport {canFocus} from '../../../helpers/dom/canFocus';\nimport windowSize from '../../../helpers/windowSize';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport PopupCreateContact from '../../popups/createContact';\nimport SortedUserList from '../../sortedUserList';\nimport {getMiddleware} from '../../../helpers/middleware';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport rootScope from '../../../lib/rootScope';\nimport PopupElement from '../../popups';\n\n// TODO: поиск по людям глобальный, если не нашло в контактах никого\n\nexport default class AppContactsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private middleware: ReturnType;\n private sortedUserList: SortedUserList;\n\n public init() {\n this.container.id = 'contacts-container';\n\n // this.list = appDialogsManager.createChatList(/* {avatarSize: 48, handheldsSize: 66} */);\n\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\n this.content.append(btnAdd);\n\n attachClickEvent(btnAdd, () => {\n PopupElement.createPopup(PopupCreateContact);\n }, {listenerSetter: this.listenerSetter});\n\n this.inputSearch = new InputSearch('Search', (value) => {\n this.openContacts(value);\n });\n\n this.listenerSetter.add(rootScope)('contacts_update', async(userId) => {\n const isContact = await this.managers.appUsersManager.isContact(userId);\n const peerId = userId.toPeerId();\n if(isContact) this.sortedUserList.add(peerId);\n else this.sortedUserList.delete(peerId);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.middleware = getMiddleware();\n\n this.openContacts();\n\n // preload contacts\n // appUsersManager.getContacts();\n }\n\n protected createList() {\n const sortedUserList = new SortedUserList({\n managers: this.managers\n });\n const list = sortedUserList.list;\n list.id = 'contacts';\n list.classList.add('contacts-container');\n appDialogsManager.setListClickListener(list, () => {\n this.close();\n }, undefined, true);\n return sortedUserList;\n }\n\n protected onClose() {\n this.middleware.clean();\n /* // need to clear, and left 1 page for smooth slide\n let pageCount = appPhotosManager.windowH / 56 * 1.25 | 0;\n (Array.from(this.list.children) as HTMLElement[]).slice(pageCount).forEach((el) => el.remove()); */\n }\n\n protected onOpenAfterTimeout() {\n if(IS_MOBILE || !canFocus(true)) return;\n this.inputSearch.input.focus();\n }\n\n public openContacts(query?: string) {\n this.middleware.clean();\n const middleware = this.middleware.get();\n this.scrollable.onScrolledBottom = null;\n this.scrollable.container.textContent = '';\n\n this.managers.appUsersManager.getContactsPeerIds(query, undefined, 'online').then((contacts) => {\n if(!middleware()) {\n return;\n }\n\n const sortedUserList = this.sortedUserList = this.createList();\n\n let renderPage = () => {\n const pageCount = windowSize.height / 56 * 1.25 | 0;\n const arr = contacts.splice(0, pageCount); // надо splice!\n\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n\n if(!contacts.length) {\n renderPage = undefined;\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n renderPage();\n this.scrollable.onScrolledBottom = () => {\n if(renderPage) {\n renderPage();\n } else {\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n replaceContent(this.scrollable.container, sortedUserList.list);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {SliderSuperTab} from '../../slider';\nimport {FOLDER_ID_ARCHIVE, REAL_FOLDER_ID} from '../../../lib/mtproto/mtproto_config';\n\nexport default class AppArchivedTab extends SliderSuperTab {\n private static filterId: REAL_FOLDER_ID = FOLDER_ID_ARCHIVE;\n private wasFilterId: number;\n\n public init() {\n this.wasFilterId = appDialogsManager.filterId;\n\n this.container.id = 'chats-archived-container';\n this.setTitle('ArchivedChats');\n\n this.header.classList.add('can-have-forum');\n this.content.classList.add('can-have-forum');\n\n if(!appDialogsManager.xds[AppArchivedTab.filterId]) {\n const {ul, scrollable} = appDialogsManager.l({\n title: undefined,\n id: AppArchivedTab.filterId,\n localId: FOLDER_ID_ARCHIVE\n });\n scrollable.container.append(ul);\n }\n\n const scrollable = appDialogsManager.xds[AppArchivedTab.filterId].scrollable;\n this.scrollable.container.replaceWith(scrollable.container);\n scrollable.attachBorderListeners(this.container);\n // ! DO NOT UNCOMMENT NEXT LINE - chats will stop loading on scroll after closing the tab\n // this.scrollable = scrollable;\n return appDialogsManager.setFilterIdAndChangeTab(AppArchivedTab.filterId).then(({cached, renderPromise}) => {\n if(cached) {\n return renderPromise;\n }\n });\n }\n\n // вообще, так делать нельзя, но нет времени чтобы переделать главный чатлист на слайд...\n onOpenAfterTimeout() {\n appDialogsManager.xds[this.wasFilterId].clear();\n }\n\n onClose() {\n this.scrollable.onAdditionalScroll = undefined;\n appDialogsManager.setFilterIdAndChangeTab(this.wasFilterId);\n }\n\n onCloseAfterTimeout() {\n appDialogsManager.xds[AppArchivedTab.filterId].clear();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport ButtonCorner from '../../buttonCorner';\nimport AppNewGroupTab from './newGroup';\nimport {toast} from '../../toast';\nimport {ButtonMenuItemOptions} from '../../buttonMenu';\nimport {i18n, join, _i18n} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport wrapSticker from '../../wrappers/sticker';\nimport SortedUserList from '../../sortedUserList';\nimport {PeerLocated, Update, Updates} from '../../../layer';\nimport {SettingChatListSection} from '..';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport confirmationPopup from '../../confirmationPopup';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport type LazyLoadQueue from '../../lazyLoadQueue';\n\nexport default class AppPeopleNearbyTab extends SliderSuperTab {\n private latestLocationSaved: {latitude: number, longitude: number, accuracy: number};\n private isLocationWatched: boolean = false;\n private errorCategory: HTMLElement;\n private retryBtn: HTMLButtonElement;\n private btnOptions: HTMLButtonElement;\n private menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[];\n\n protected lazyLoadQueue: LazyLoadQueue;\n protected peopleSection: SettingChatListSection;\n protected chatsSection: SettingChatListSection;\n\n protected locatedPeers: Map;\n\n // public async init() {\n // this.container.classList.add('people-nearby-container');\n // this.setTitle('PeopleNearby');\n\n // this.errorCategory = document.createElement('div');\n // this.errorCategory.classList.add('text', 'hide', 'nearby-error');\n\n // this.retryBtn = ButtonCorner({icon: 'check'});\n\n // const emoji = '🧭';\n // const doc = await this.managers.appStickersManager.getAnimatedEmojiSticker(emoji);\n // const stickerContainer = document.createElement('div');\n // stickerContainer.classList.add('sticker-container');\n\n // if(doc) {\n // wrapSticker({\n // doc,\n // div: stickerContainer,\n // loop: false,\n // play: true,\n // width: 86,\n // height: 86,\n // emoji,\n // needUpscale: true\n // }).then(() => {\n // // this.animation = player;\n // });\n // } else {\n // stickerContainer.classList.add('media-sticker-wrapper');\n // }\n\n // const caption = document.createElement('div');\n // caption.classList.add('caption');\n // _i18n(caption, 'PeopleNearbyInfo2');\n\n // this.locatedPeers = new Map();\n\n // const m = () => {\n // const sortedUserList = new SortedUserList({\n // avatarSize: 42,\n // createChatListOptions: {\n // dialogSize: 48,\n // new: true\n // },\n // autonomous: false,\n // onUpdate: (element) => {\n // const peer = this.locatedPeers.get(element.id);\n // const elements: HTMLElement[] = [\n // this.parseDistance(peer.distance)\n // ];\n\n // if(!element.id.isUser()) {\n // elements.push(this.managers.appProfileManager.getChatMembersString(element.id.toChatId()));\n // }\n\n // element.dom.lastMessageSpan.textContent = '';\n // element.dom.lastMessageSpan.append(...join(elements, false));\n // },\n // getIndex: (element) => {\n // const peer = this.locatedPeers.get(element.id);\n // return 0x7FFFFFFF - peer.distance;\n // },\n // appUsersManager: this.managers.appUsersManager\n // });\n\n // appDialogsManager.setListClickListener(sortedUserList.list, undefined, undefined, false);\n\n // return sortedUserList;\n // };\n\n // const peopleSection = this.peopleSection = new SettingChatListSection({\n // name: 'PeopleNearbyHeader',\n // sortedList: m()\n // });\n\n // const chatsSection = this.chatsSection = new SettingChatListSection({\n // name: 'ChatsNearbyHeader',\n // sortedList: m()\n // });\n\n // const btnMakeVisible = peopleSection.makeButton({\n // text: 'MakeMyselfVisible',\n // icon: 'location'\n // });\n\n // const btnMakeInvisible = peopleSection.makeButton({\n // text: 'StopShowingMe',\n // icon: 'location'\n // });\n\n // const btnCreateGroup = chatsSection.makeButton({\n // text: 'NearbyCreateGroup',\n // icon: 'newgroup'\n // });\n\n // attachClickEvent(btnMakeVisible, () => {\n // confirmationPopup({\n // titleLangKey: 'MakeMyselfVisibleTitle',\n // descriptionLangKey: 'MakeMyselfVisibleInfo',\n // button: {\n // langKey: 'OK'\n // }\n // }).then(() => {\n // this.startWatching();\n // });\n // }, {listenerSetter: this.listenerSetter});\n\n // attachClickEvent(btnMakeInvisible, () => {\n // this.stopWatching();\n // }, {listenerSetter: this.listenerSetter});\n\n // attachClickEvent(btnCreateGroup, () => {\n // this.slider.createTab(AppNewGroupTab).open([], true);\n // }, {listenerSetter: this.listenerSetter});\n\n // btnMakeVisible.classList.add('primary');\n // btnMakeInvisible.classList.add('danger');\n // btnCreateGroup.classList.add('primary');\n\n // this.content.append(this.retryBtn);\n // this.scrollable.append(\n // stickerContainer,\n // caption,\n // peopleSection.container,\n // chatsSection.container,\n // this.errorCategory\n // );\n // }\n\n private parseDistance(distance: number) {\n if(rootScope.settings.distanceUnit === 'miles') {\n if(distance > 1609.34) {\n return i18n('MilesAway', [Math.round(distance / 1609)]);\n } else {\n return i18n('FootsAway', [Math.round(distance * 3.281)]);\n }\n } else {\n if(distance >= 1000) {\n return i18n('KMetersAway2', [distance / 1000]);\n } else {\n return i18n('MetersAway2', [distance]);\n }\n }\n }\n\n // public open() {\n // const result = super.open();\n // result.then(() => {\n // this.retryBtn.classList.remove('is-visible');\n // navigator.geolocation.getCurrentPosition((location) => {\n // this.latestLocationSaved = {\n // latitude: location.coords.latitude,\n // longitude: location.coords.longitude,\n // accuracy: location.coords.accuracy\n // };\n\n // console.log(this.latestLocationSaved);\n\n // this.managers.appUsersManager.getLocated(\n // location.coords.latitude,\n // location.coords.longitude,\n // location.coords.accuracy\n // ).then((response) => {\n // const update = (response as Updates.updates).updates[0] as Update.updatePeerLocated;\n // const peers = update.peers as PeerLocated.peerLocated[];\n // const orderedPeers = peers.sort((a, b) => a.distance - b.distance);\n // const groupsCounter = peers.filter((e) => e.peer._ == 'peerChannel').length;\n // const usersCounter = peers.filter((e) => e.peer._ != 'peerChannel').length;\n // orderedPeers?.forEach((peer) => {\n // const peerId = getPeerId(peer.peer);\n // const section = peerId.isUser() ? this.peopleSection : this.chatsSection;\n // this.locatedPeers.set(peerId, peer);\n // section.sortedList.add(peerId);\n // });\n\n // this.errorCategory.classList.toggle('hide', !!(usersCounter || groupsCounter));\n // this.errorCategory.innerHTML = 'No groups or channels found around you.';\n // });\n // }, (error) => {\n // this.errorCategory.classList.remove('hide');\n // this.retryBtn.classList.add('is-visible');\n // this.retryBtn.addEventListener('click', this.open);\n // if(error instanceof GeolocationPositionError) {\n // this.errorCategory.innerHTML = 'Location permission denied. Click below to retry.';\n // } else {\n // this.errorCategory.innerHTML = 'An error has occurred. Please retry later clicking the button below.';\n // }\n // });\n // });\n\n // return result;\n // }\n\n private startWatching() {\n if(!this.latestLocationSaved || this.isLocationWatched) return;\n this.isLocationWatched = true;\n\n toast('Your position is now being shared. Do not close the page or it will be suspended.');\n\n this.managers.appUsersManager.getLocated(\n this.latestLocationSaved.latitude,\n this.latestLocationSaved.longitude,\n this.latestLocationSaved.accuracy,\n true, // background parameter\n 0x7fffffff // self_expires parameter\n );\n\n navigator.geolocation.watchPosition((result) => {\n const isLongitudeDifferent = result.coords.longitude !== this.latestLocationSaved.longitude;\n const isLatitudeDifferent = result.coords.latitude !== this.latestLocationSaved.latitude;\n const distanceCheck = this.calculateDistance(\n result.coords.latitude, result.coords.longitude,\n this.latestLocationSaved.latitude, this.latestLocationSaved.longitude\n ) > 100;\n\n if((isLatitudeDifferent || isLongitudeDifferent) && distanceCheck) {\n this.managers.appUsersManager.getLocated(\n result.coords.latitude,\n result.coords.longitude,\n result.coords.accuracy,\n true, // background parameter\n 0x7fffffff // self_expires parameter\n );\n this.latestLocationSaved = {\n latitude: result.coords.latitude,\n longitude: result.coords.longitude,\n accuracy: result.coords.accuracy\n }\n }\n });\n }\n\n private stopWatching() {\n if(!this.isLocationWatched) return;\n this.isLocationWatched = false;\n toast('The sharing of your position has been stopped. You will no longer be visible to other users.');\n this.managers.appUsersManager.getLocated(\n 0, // latitude parameter\n 0, // longitude parameter\n 0, // accuracy parameter\n false, // background parameter\n 0 // self_expires parameter\n );\n }\n\n private calculateDistance(lat1: number, long1: number, lat2: number, long2: number) {\n const p = 0.017453292519943295; // Math.PI/180\n return (\n 12742 * Math.asin(\n Math.sqrt(\n (0.5 - Math.cos((lat2 - lat1) * p)) +\n (\n Math.cos(lat1 * p) * Math.cos(lat2 * p) *\n (1 - Math.cos((long2 - long1) * p)/2)\n )\n )\n )\n );\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport {SearchGroup} from '../appSearch';\nimport '../avatar';\nimport Scrollable, {ScrollableX} from '../scrollable';\nimport InputSearch from '../inputSearch';\nimport SidebarSlider from '../slider';\nimport TransitionSlider from '../transition';\nimport AppNewGroupTab from './tabs/newGroup';\nimport AppSearchSuper from '../appSearchSuper.';\nimport {DateData, fillTipDates} from '../../helpers/date';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport AppSettingsTab from './tabs/settings';\nimport AppNewChannelTab from './tabs/newChannel';\nimport AppContactsTab from './tabs/contacts';\nimport AppArchivedTab from './tabs/archivedTab';\nimport AppAddMembersTab from './tabs/addMembers';\nimport I18n, {FormatterArguments, i18n, i18n_, LangPackKey} from '../../lib/langPack';\nimport AppPeopleNearbyTab from './tabs/peopleNearby';\nimport {ButtonMenuItemOptions} from '../buttonMenu';\nimport CheckboxField from '../checkboxField';\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport PeerTitle from '../peerTitle';\nimport App from '../../config/app';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport sessionStorage from '../../lib/sessionStorage';\nimport {attachClickEvent, CLICK_EVENT_NAME, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport ButtonIcon from '../buttonIcon';\nimport confirmationPopup from '../confirmationPopup';\nimport IS_GEOLOCATION_SUPPORTED from '../../environment/geolocationSupport';\nimport type SortedUserList from '../sortedUserList';\nimport Button, {ButtonOptions} from '../button';\nimport noop from '../../helpers/noop';\nimport ripple from '../ripple';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport AvatarElement from '../avatar';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport themeController from '../../helpers/themeController';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {DIALOG_LIST_ELEMENT_TAG} from '../../lib/appManagers/appDialogsManager';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport SettingSection, {SettingSectionOptions} from '../settingSection';\nimport {FOLDER_ID_ARCHIVE} from '../../lib/mtproto/mtproto_config';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {fastRaf} from '../../helpers/schedulers';\n\nexport const LEFT_COLUMN_ACTIVE_CLASSNAME = 'is-left-column-shown';\n\nexport class AppSidebarLeft extends SidebarSlider {\n private toolsBtn: HTMLElement;\n private backBtn: HTMLButtonElement;\n // private searchInput = document.getElementById('global-search') as HTMLInputElement;\n private inputSearch: InputSearch;\n\n public archivedCount: HTMLSpanElement;\n public rect: DOMRect;\n\n private newBtnMenu: HTMLElement;\n\n // private log = logger('SL');\n\n private searchGroups: {[k in 'contacts' | 'globalContacts' | 'messages' | 'people' | 'recent']: SearchGroup} = {} as any;\n private searchSuper: AppSearchSuper;\n\n private updateBtn: HTMLElement;\n private hasUpdate: boolean;\n\n constructor() {\n super({\n sidebarEl: document.getElementById('column-left') as HTMLDivElement,\n navigationType: 'left'\n });\n }\n\n construct(managers: AppManagers) {\n this.managers = managers;\n // this._selectTab(0); // make first tab as default\n\n this.inputSearch = new InputSearch('Search');\n const sidebarHeader = this.sidebarEl.querySelector('.item-main .sidebar-header');\n sidebarHeader.append(this.inputSearch.container);\n\n const onNewGroupClick = () => {\n this.createTab(AppAddMembersTab).open({\n type: 'chat',\n skippable: false,\n takeOut: (peerIds) => this.createTab(AppNewGroupTab).open(peerIds),\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n };\n\n const onContactsClick = () => {\n this.createTab(AppContactsTab).open();\n };\n\n // this.toolsBtn = this.sidebarEl.querySelector('.sidebar-tools-button') as HTMLButtonElement;\n this.backBtn = this.sidebarEl.querySelector('.sidebar-back-button') as HTMLButtonElement;\n\n const btnArchive: typeof menuButtons[0] = {\n icon: 'archive',\n text: 'ArchivedChats',\n onClick: () => {\n this.createTab(AppArchivedTab).open();\n },\n verify: async() => {\n const folder = await this.managers.dialogsStorage.getFolderDialogs(FOLDER_ID_ARCHIVE, false);\n return !!folder.length || !(await this.managers.dialogsStorage.isDialogsLoaded(FOLDER_ID_ARCHIVE));\n }\n };\n\n const themeCheckboxField = new CheckboxField({\n toggle: true,\n checked: themeController.getTheme().name === 'night'\n });\n themeCheckboxField.input.addEventListener('change', async() => {\n await this.managers.appStateManager.setByKey('settings.theme', themeCheckboxField.input.checked ? 'night' : 'day');\n rootScope.dispatchEvent('theme_change');\n });\n\n rootScope.addEventListener('theme_change', () => {\n themeCheckboxField.setValueSilently(themeController.getTheme().name === 'night');\n });\n\n const menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean | Promise})[] = [{\n icon: 'savedmessages',\n text: 'SavedMessages',\n onClick: () => {\n setTimeout(() => { // menu doesn't close if no timeout (lol)\n appImManager.setPeer({\n peerId: appImManager.myId\n });\n }, 0);\n }\n }, btnArchive, {\n icon: 'user',\n text: 'Contacts',\n onClick: onContactsClick\n }, IS_GEOLOCATION_SUPPORTED ? {\n icon: 'group',\n text: 'PeopleNearby',\n onClick: () => {\n this.createTab(AppPeopleNearbyTab).open();\n }\n } : undefined, {\n icon: 'settings',\n text: 'Settings',\n onClick: () => {\n this.createTab(AppSettingsTab).open();\n }\n }, {\n icon: 'darkmode',\n text: 'DarkMode',\n onClick: () => {\n\n },\n checkboxField: themeCheckboxField\n }, {\n icon: 'animations',\n text: 'Animations',\n onClick: () => {\n\n },\n checkboxField: new CheckboxField({\n toggle: true,\n checked: true,\n stateKey: 'settings.animationsEnabled'\n })\n }, {\n icon: 'help',\n text: 'TelegramFeatures',\n onClick: () => {\n const url = I18n.format('TelegramFeaturesUrl', true);\n appImManager.openUrl(url);\n }\n }, {\n icon: 'bug',\n text: 'ReportBug',\n onClick: () => {\n const a = document.createElement('a');\n a.target = '_blank';\n a.href = 'https://bugs.telegram.org/?tag_ids=40&sort=time';\n document.body.append(a);\n a.click();\n setTimeout(() => {\n a.remove();\n }, 0);\n }\n }, {\n icon: 'char z',\n text: 'ChatList.Menu.SwitchTo.Z',\n onClick: () => {\n Promise.all([\n sessionStorage.set({kz_version: 'Z'}),\n sessionStorage.delete('tgme_sync')\n ]).then(() => {\n location.href = 'https://web.telegram.org/z/';\n });\n },\n verify: () => App.isMainDomain\n }, {\n icon: 'char w',\n text: 'ChatList.Menu.SwitchTo.Webogram',\n onClick: () => {\n sessionStorage.delete('tgme_sync').then(() => {\n location.href = 'https://web.telegram.org/?legacy=1';\n });\n },\n verify: () => App.isMainDomain\n }];\n\n const filteredButtons = menuButtons.filter(Boolean);\n\n this.toolsBtn = ButtonMenuToggle({\n direction: 'bottom-right',\n buttons: filteredButtons,\n onOpen: (e, btnMenu) => {\n const btnMenuFooter = document.createElement('a');\n btnMenuFooter.href = 'https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md';\n btnMenuFooter.target = '_blank';\n btnMenuFooter.rel = 'noopener noreferrer';\n btnMenuFooter.classList.add('btn-menu-footer');\n btnMenuFooter.addEventListener(CLICK_EVENT_NAME, (e) => {\n e.stopPropagation();\n contextMenuController.close();\n });\n const t = document.createElement('span');\n t.classList.add('btn-menu-footer-text');\n t.innerHTML = 'Telegram Web' + App.suffix + ' '/* ' alpha ' */ + App.versionFull;\n btnMenuFooter.append(t);\n btnMenu.classList.add('has-footer');\n btnMenu.append(btnMenuFooter);\n\n btnArchive.element?.append(this.archivedCount);\n }\n });\n this.toolsBtn.classList.remove('tgico-more');\n this.toolsBtn.classList.add('sidebar-tools-button', 'is-visible');\n\n this.backBtn.parentElement.insertBefore(this.toolsBtn, this.backBtn);\n\n this.newBtnMenu = ButtonMenuToggle({\n direction: 'top-left',\n buttons: [{\n icon: 'newchannel',\n text: 'NewChannel',\n onClick: () => {\n this.createTab(AppNewChannelTab).open();\n }\n }, {\n icon: 'newgroup',\n text: 'NewGroup',\n onClick: onNewGroupClick\n }, {\n icon: 'newprivate',\n text: 'NewPrivateChat',\n onClick: onContactsClick\n }]\n });\n this.newBtnMenu.className = 'btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon';\n this.newBtnMenu.insertAdjacentHTML('afterbegin', `\n \n \n `);\n this.newBtnMenu.id = 'new-menu';\n sidebarHeader.nextElementSibling.append(this.newBtnMenu);\n\n this.updateBtn = document.createElement('div');\n this.updateBtn.className = 'btn-circle rp btn-corner z-depth-1 btn-update is-hidden';\n ripple(this.updateBtn);\n this.updateBtn.append(i18n('Update'));\n\n attachClickEvent(this.updateBtn, () => {\n if(this.updateBtn.classList.contains('is-hidden')) {\n return;\n }\n\n location.reload();\n });\n\n sidebarHeader.nextElementSibling.append(this.updateBtn);\n\n this.inputSearch.input.addEventListener('focus', () => this.initSearch(), {once: true});\n\n this.archivedCount = document.createElement('span');\n this.archivedCount.className = 'archived-count badge badge-24 badge-gray';\n\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === FOLDER_ID_ARCHIVE) {\n // const count = folder.unreadMessagesCount;\n const count = folder.unreadPeerIds.size;\n this.archivedCount.textContent = '' + formatNumber(count, 1);\n this.archivedCount.classList.toggle('hide', !count);\n }\n });\n\n this.managers.appUsersManager.getTopPeers('correspondents');\n\n // Focus search input by pressing Escape\n const navigationItem: NavigationItem = {\n type: 'global-search-focus',\n onPop: () => {\n setTimeout(() => {\n this.inputSearch.input.focus();\n }, 0);\n\n return false;\n },\n noHistory: true\n };\n appNavigationController.pushItem(navigationItem);\n\n apiManagerProxy.getState().then(() => {\n const CHECK_UPDATE_INTERVAL = 1800e3;\n const checkUpdateInterval = setInterval(() => {\n fetch('version', {cache: 'no-cache'})\n .then((res) => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then((text) => {\n if(text !== App.versionFull) {\n this.hasUpdate = true;\n clearInterval(checkUpdateInterval);\n\n if(!this.newBtnMenu.classList.contains('is-hidden')) {\n this.updateBtn.classList.remove('is-hidden');\n }\n }\n })\n .catch(noop);\n }, CHECK_UPDATE_INTERVAL);\n });\n\n const onResize = () => {\n const rect = this.rect = this.tabsContainer.getBoundingClientRect();\n document.documentElement.style.setProperty('--left-column-width', rect.width + 'px');\n };\n\n fastRaf(onResize);\n mediaSizes.addEventListener('resize', onResize);\n }\n\n private initSearch() {\n const searchContainer = this.sidebarEl.querySelector('#search-container') as HTMLDivElement;\n\n const scrollable = new Scrollable(searchContainer);\n\n const close = () => {\n // setTimeout(() => {\n simulateClickEvent(this.backBtn);\n // }, 0);\n };\n\n this.searchGroups = {\n contacts: new SearchGroup('SearchAllChatsShort', 'contacts', undefined, undefined, undefined, undefined, close),\n globalContacts: new SearchGroup('GlobalSearch', 'contacts', undefined, undefined, undefined, undefined, close),\n messages: new SearchGroup('SearchMessages', 'messages'),\n people: new SearchGroup(false, 'contacts', true, 'search-group-people', true, false, close, true),\n recent: new SearchGroup('Recent', 'contacts', true, 'search-group-recent', true, true, close)\n };\n\n const searchSuper = this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'FilterChats',\n type: 'chats'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }],\n scrollable,\n searchGroups: this.searchGroups,\n asChatList: true,\n hideEmptyTabs: false,\n showSender: true,\n managers: this.managers\n });\n\n searchContainer.prepend(searchSuper.nav.parentElement.parentElement);\n scrollable.container.append(searchSuper.container);\n\n const resetSearch = () => {\n searchSuper.setQuery({\n peerId: ''.toPeerId(),\n folderId: 0\n });\n searchSuper.selectTab(0);\n searchSuper.load(true);\n };\n\n resetSearch();\n\n const pickedElements: HTMLElement[] = [];\n let selectedPeerId: PeerId = ''.toPeerId();\n let selectedMinDate = 0;\n let selectedMaxDate = 0;\n const updatePicked = () => {\n // (this.inputSearch.input as HTMLInputElement).placeholder = pickedElements.length ? 'Search' : 'Telegram Search';\n this.inputSearch.container.classList.toggle('is-picked-twice', pickedElements.length === 2);\n this.inputSearch.container.classList.toggle('is-picked', !!pickedElements.length);\n\n if(pickedElements.length) {\n this.inputSearch.input.style.setProperty('--paddingLeft', (pickedElements[pickedElements.length - 1].getBoundingClientRect().right - this.inputSearch.input.getBoundingClientRect().left) + 'px');\n } else {\n this.inputSearch.input.style.removeProperty('--paddingLeft');\n }\n };\n\n const helper = document.createElement('div');\n helper.classList.add('search-helper');\n helper.addEventListener('click', (e) => {\n const target = findUpClassName(e.target, 'selector-user');\n if(!target) {\n return;\n }\n\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n const [_, minDate, maxDate] = key.split('_');\n selectedMinDate = +minDate;\n selectedMaxDate = +maxDate;\n } else {\n selectedPeerId = key.toPeerId();\n }\n\n target.addEventListener('click', () => {\n unselectEntity(target);\n });\n\n this.inputSearch.container.append(target);\n this.inputSearch.onChange(this.inputSearch.value = '');\n pickedElements.push(target);\n updatePicked();\n });\n\n searchSuper.nav.parentElement.append(helper);\n\n const renderEntity = (key: PeerId | string, title?: string | HTMLElement) => {\n const div = document.createElement('div');\n div.classList.add('selector-user'/* , 'scale-in' */);\n\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('selector-user-avatar', 'tgico', 'avatar-32');\n avatarEl.isDialog = true;\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n title = new PeerTitle({peerId: key.toPeerId()}).element;\n }\n\n avatarEl.updateWithOptions({peerId: key as PeerId});\n } else {\n avatarEl.classList.add('tgico-calendarfilter');\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n return div;\n };\n\n const unselectEntity = (target: HTMLElement) => {\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n selectedMinDate = selectedMaxDate = 0;\n } else {\n selectedPeerId = ''.toPeerId();\n }\n\n target.remove();\n indexOfAndSplice(pickedElements, target);\n\n setTimeout(() => {\n updatePicked();\n this.inputSearch.onChange(this.inputSearch.value);\n }, 0);\n };\n\n this.inputSearch.onClear = () => {\n pickedElements.forEach((el) => {\n unselectEntity(el);\n });\n };\n\n this.inputSearch.onChange = (value) => {\n searchSuper.cleanupHTML();\n searchSuper.setQuery({\n peerId: selectedPeerId,\n folderId: selectedPeerId ? undefined : 0,\n query: value,\n minDate: selectedMinDate,\n maxDate: selectedMaxDate\n });\n searchSuper.load(true);\n\n helper.innerHTML = '';\n searchSuper.nav.classList.remove('hide');\n if(!value) {\n }\n\n if(!selectedPeerId && value.trim()) {\n const middleware = searchSuper.middleware.get();\n Promise.all([\n // appMessagesManager.getConversationsAll(value).then((dialogs) => dialogs.map((d) => d.peerId)),\n this.managers.dialogsStorage.getDialogs({query: value}).then(({dialogs}) => dialogs.map((d) => d.peerId)),\n this.managers.appUsersManager.getContactsPeerIds(value, true)\n ]).then((results) => {\n if(!middleware()) return;\n const peerIds = new Set(results[0].concat(results[1]));\n\n peerIds.forEach((peerId) => {\n helper.append(renderEntity(peerId));\n });\n\n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n // console.log('got peerIds by value:', value, [...peerIds]);\n });\n }\n\n if(!selectedMinDate && value.trim()) {\n const dates: DateData[] = [];\n fillTipDates(value, dates);\n dates.forEach((dateData) => {\n helper.append(renderEntity('date_' + dateData.minDate + '_' + dateData.maxDate, dateData.title));\n });\n\n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n }\n };\n\n searchSuper.tabs.inputMessagesFilterEmpty.addEventListener('mousedown', (e) => {\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG) as HTMLElement;\n if(!target) {\n return;\n }\n\n const searchGroup = findUpClassName(target, 'search-group');\n if(!searchGroup || searchGroup.classList.contains('search-group-recent') || searchGroup.classList.contains('search-group-people')) {\n return;\n }\n\n const peerId = target.getAttribute('data-peer-id').toPeerId();\n this.managers.appUsersManager.pushRecentSearch(peerId);\n }, {capture: true});\n\n const peopleContainer = document.createElement('div');\n peopleContainer.classList.add('search-group-scrollable');\n peopleContainer.append(this.searchGroups.people.list);\n this.searchGroups.people.container.append(peopleContainer);\n const peopleScrollable = new ScrollableX(peopleContainer);\n\n let first = true;\n let hideNewBtnMenuTimeout: number;\n // const transition = Transition.bind(null, searchContainer.parentElement, 150);\n const transition = TransitionSlider({\n content: searchContainer.parentElement,\n type: 'zoom-fade',\n transitionTime: 150,\n onTransitionEnd: (id) => {\n if(hideNewBtnMenuTimeout) clearTimeout(hideNewBtnMenuTimeout);\n\n if(id === 0 && !first) {\n searchSuper.selectTab(0, false);\n this.inputSearch.onClearClick();\n hideNewBtnMenuTimeout = window.setTimeout(() => {\n hideNewBtnMenuTimeout = 0;\n this.newBtnMenu.classList.remove('is-hidden');\n this.hasUpdate && this.updateBtn.classList.remove('is-hidden');\n }, 150);\n }\n\n first = false;\n }\n });\n\n transition(0);\n\n const activeClassName = 'is-visible';\n const onFocus = () => {\n this.toolsBtn.classList.remove(activeClassName);\n this.backBtn.classList.add(activeClassName);\n this.newBtnMenu.classList.add('is-hidden');\n this.updateBtn.classList.add('is-hidden');\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', true);\n\n const navigationType: NavigationItem['type'] = 'global-search';\n if(!IS_MOBILE_SAFARI && !appNavigationController.findItemByType(navigationType)) {\n appNavigationController.pushItem({\n onPop: () => {\n close();\n },\n type: navigationType\n });\n }\n\n transition(1);\n };\n\n this.inputSearch.input.addEventListener('focus', onFocus);\n onFocus();\n\n attachClickEvent(this.backBtn, (e) => {\n this.toolsBtn.classList.add(activeClassName);\n this.backBtn.classList.remove(activeClassName);\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', false);\n\n appNavigationController.removeByType('global-search');\n\n transition(0);\n });\n\n const clearRecentSearchBtn = ButtonIcon('close');\n this.searchGroups.recent.nameEl.append(clearRecentSearchBtn);\n clearRecentSearchBtn.addEventListener('click', () => {\n confirmationPopup({\n descriptionLangKey: 'Search.Confirm.ClearHistory',\n button: {\n langKey: 'ClearButton',\n isDanger: true\n }\n }).then(() => {\n return this.managers.appUsersManager.clearRecentSearch().then(() => {\n this.searchGroups.recent.clear();\n });\n });\n });\n }\n}\n\nexport class SettingChatListSection extends SettingSection {\n public sortedList: SortedUserList;\n\n constructor(options: SettingSectionOptions & {sortedList: SortedUserList}) {\n super(options);\n\n this.sortedList = options.sortedList;\n\n this.content.append(this.sortedList.list);\n }\n\n public makeButton(options: ButtonOptions) {\n const button = Button('folder-category-button btn btn-primary btn-transparent', options);\n if(this.title) this.content.insertBefore(button, this.title.nextSibling);\n else this.content.prepend(button);\n return button;\n }\n}\n\nconst appSidebarLeft = new AppSidebarLeft();\nMOUNT_CLASS_TO.appSidebarLeft = appSidebarLeft;\nexport default appSidebarLeft;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport AppSelectPeers from '../../appSelectPeers';\nimport {setButtonLoader} from '../../putPreloader';\nimport {LangPackKey, _i18n} from '../../../lib/langPack';\nimport ButtonCorner from '../../buttonCorner';\n\nexport default class AppAddMembersTab extends SliderSuperTab {\n private nextBtn: HTMLButtonElement;\n private selector: AppSelectPeers;\n private peerType: 'channel' | 'chat' | 'privacy';\n private takeOut: (peerIds: PeerId[]) => Promise | false | void;\n private skippable: boolean;\n\n public init(options: {\n title: LangPackKey,\n placeholder: LangPackKey,\n type: AppAddMembersTab['peerType'],\n takeOut?: AppAddMembersTab['takeOut'],\n skippable: boolean,\n selectedPeerIds?: PeerId[]\n }) {\n this.container.classList.add('add-members-container');\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\n this.content.append(this.nextBtn);\n this.scrollable.container.remove();\n\n this.nextBtn.addEventListener('click', () => {\n const peerIds = this.selector.getSelected().map((sel) => sel.toPeerId());\n const result = this.takeOut(peerIds);\n\n if(this.skippable) {\n this.close();\n } else if(result instanceof Promise) {\n this.attachToPromise(result);\n } else if(result === undefined) {\n this.close();\n }\n });\n\n //\n this.setTitle(options.title);\n this.peerType = options.type;\n this.takeOut = options.takeOut;\n this.skippable = options.skippable;\n\n const isPrivacy = this.peerType === 'privacy';\n this.selector = new AppSelectPeers({\n appendTo: this.content,\n onChange: this.skippable ? null : (length) => {\n this.nextBtn.classList.toggle('is-visible', !!length);\n },\n peerType: [isPrivacy ? 'dialogs' : 'contacts'],\n placeholder: options.placeholder,\n exceptSelf: isPrivacy,\n filterPeerTypeBy: isPrivacy ? ['isAnyGroup', 'isUser'] : undefined,\n managers: this.managers,\n design: 'square'\n });\n\n if(options.selectedPeerIds) {\n this.selector.addInitial(options.selectedPeerIds);\n }\n\n this.nextBtn.classList.add('tgico-arrow_next');\n this.nextBtn.innerHTML = '';\n this.nextBtn.disabled = false;\n this.nextBtn.classList.toggle('is-visible', this.skippable);\n }\n\n public attachToPromise(promise: Promise) {\n const removeLoader = setButtonLoader(this.nextBtn, 'arrow_next');\n\n promise.then(() => {\n this.close();\n }, () => {\n removeLoader();\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport AppSelectPeers from '../../appSelectPeers';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {MyDialogFilter as DialogFilter} from '../../../lib/storages/filters';\nimport ButtonIcon from '../../buttonIcon';\nimport CheckboxField from '../../checkboxField';\nimport Button from '../../button';\nimport AppEditFolderTab from './editFolder';\nimport I18n, {i18n, LangPackKey, _i18n, join} from '../../../lib/langPack';\nimport {toast} from '../../toast';\nimport copy from '../../../helpers/object/copy';\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport {REAL_FOLDERS} from '../../../lib/mtproto/mtproto_config';\nimport rootScope from '../../../lib/rootScope';\nimport {MTAppConfig} from '../../../lib/mtproto/appConfig';\nimport {attachClickEvent, simulateClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\nexport default class AppIncludedChatsTab extends SliderSuperTab {\n private editFolderTab: AppEditFolderTab;\n private confirmBtn: HTMLElement;\n\n private selector: AppSelectPeers;\n private type: 'included' | 'excluded';\n private filter: DialogFilter;\n private originalFilter: DialogFilter;\n\n private dialogsByFilters: Map>;\n private limit: number;\n\n public init(\n filter: DialogFilter,\n type: 'included' | 'excluded',\n editFolderTab: AppIncludedChatsTab['editFolderTab']\n ) {\n this.originalFilter = filter;\n this.filter = copy(this.originalFilter);\n this.type = type;\n this.editFolderTab = editFolderTab;\n\n this.content.remove();\n this.container.classList.add('included-chatlist-container');\n this.confirmBtn = ButtonIcon('check btn-confirm blue', {noRipple: true});\n this.confirmBtn.style.display = 'none';\n\n this.header.append(this.confirmBtn);\n\n attachClickEvent(this.confirmBtn, async() => {\n const selected = this.selector.getSelected();\n\n // this.filter.pFlags = {};\n\n if(this.type === 'included') {\n for(const key in this.filter.pFlags) {\n if(key.indexOf('exclude_') === 0) {\n continue;\n }\n\n // @ts-ignore\n delete this.filter.pFlags[key];\n }\n } else {\n for(const key in this.filter.pFlags) {\n if(key.indexOf('exclude_') !== 0) {\n continue;\n }\n\n // @ts-ignore\n delete this.filter.pFlags[key];\n }\n }\n\n const peerIds: PeerId[] = [];\n for(const key of selected) {\n if(key.isPeerId()) {\n peerIds.push(key.toPeerId());\n } else {\n // @ts-ignore\n this.filter.pFlags[key] = true;\n }\n }\n\n let cmp: (peerId: PeerId) => boolean;\n if(this.type === 'included') {\n cmp = (peerId) => peerIds.includes(peerId);\n } else {\n cmp = (peerId) => !peerIds.includes(peerId);\n }\n\n forEachReverse(this.filter.pinnedPeerIds, (peerId, idx) => {\n if(!cmp(peerId)) {\n this.filter.pinnedPeerIds.splice(idx, 1);\n this.filter.pinned_peers.splice(idx, 1);\n }\n });\n\n const other = this.type === 'included' ? 'excludePeerIds' : 'includePeerIds';\n const otherLegacy = this.type === 'included' ? 'exclude_peers' : 'include_peers';\n forEachReverse(this.filter[other], (peerId, idx) => {\n if(peerIds.includes(peerId)) {\n this.filter[other].splice(idx, 1);\n this.filter[otherLegacy].splice(idx, 1);\n }\n });\n\n this.filter[this.type === 'included' ? 'includePeerIds' : 'excludePeerIds'] = peerIds;\n this.filter[this.type === 'included' ? 'include_peers' : 'exclude_peers'] = await Promise.all(peerIds.map((peerId) => this.managers.appPeersManager.getInputPeerById(peerId)));\n // this.filter.pinned_peers = this.filter.pinned_peers.filter((peerId) => this.filter.include_peers.includes(peerId));\n\n this.editFolderTab.setFilter(this.filter, false);\n this.close();\n }, {listenerSetter: this.listenerSetter});\n\n const onAppConfig = (appConfig: MTAppConfig) => {\n this.limit = rootScope.premium ? appConfig.dialog_filters_chats_limit_premium : appConfig.dialog_filters_chats_limit_default;\n };\n\n this.listenerSetter.add(rootScope)('app_config', onAppConfig);\n\n this.dialogsByFilters = new Map();\n return Promise.all([\n this.managers.filtersStorage.getDialogFilters().then(async(filters) => {\n await Promise.all(filters.filter((filter) => !REAL_FOLDERS.has(filter.id)).map(async(filter) => {\n const dialogs = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\n const peerIds = dialogs.map((d) => d.peerId);\n this.dialogsByFilters.set(filter, new Set(peerIds));\n }));\n }),\n\n this.managers.apiManager.getAppConfig().then((appConfig) => {\n onAppConfig(appConfig);\n })\n ]);\n }\n\n checkbox(selected?: boolean) {\n const checkboxField = new CheckboxField({\n round: true\n });\n if(selected) {\n checkboxField.input.checked = selected;\n }\n\n return checkboxField.label;\n }\n\n renderResults = async(peerIds: PeerId[]) => {\n // const other = this.type === 'included' ? this.filter.exclude_peers : this.filter.include_peers;\n\n await this.managers.appUsersManager.getContacts();\n peerIds.forEach((peerId) => {\n // if(other.includes(peerId)) return;\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.selector.scrollable,\n rippleEnabled: true,\n avatarSize: 'abitbigger'\n });\n\n const selected = this.selector.selected.has(peerId);\n dom.containerEl.append(this.checkbox(selected));\n // if(selected) dom.listEl.classList.add('active');\n\n const foundInFilters: HTMLElement[] = [];\n this.dialogsByFilters.forEach((dialogs, filter) => {\n if(dialogs.has(peerId)) {\n const span = document.createElement('span');\n setInnerHTML(span, wrapEmojiText(filter.title));\n foundInFilters.push(span);\n }\n });\n\n const joined = join(foundInFilters, false);\n joined.forEach((el) => {\n dom.lastMessageSpan.append(el);\n });\n });\n };\n\n onOpen() {\n this.confirmBtn.style.display = this.type === 'excluded' ? '' : 'none';\n this.setTitle(this.type === 'included' ? 'FilterAlwaysShow' : 'FilterNeverShow');\n\n const filter = this.filter;\n\n const categoriesSection = new SettingSection({\n noDelimiter: true,\n name: 'FilterChatTypes'\n });\n\n categoriesSection.container.classList.add('folder-categories');\n\n let details: {[flag: string]: {ico: string, text: LangPackKey}};\n if(this.type === 'excluded') {\n details = {\n exclude_muted: {ico: 'mute', text: 'ChatList.Filter.MutedChats'},\n exclude_archived: {ico: 'archive', text: 'ChatList.Filter.Archive'},\n exclude_read: {ico: 'readchats', text: 'ChatList.Filter.ReadChats'}\n };\n } else {\n details = {\n contacts: {ico: 'newprivate', text: 'ChatList.Filter.Contacts'},\n non_contacts: {ico: 'noncontacts', text: 'ChatList.Filter.NonContacts'},\n groups: {ico: 'group', text: 'ChatList.Filter.Groups'},\n broadcasts: {ico: 'newchannel', text: 'ChatList.Filter.Channels'},\n bots: {ico: 'bots', text: 'ChatList.Filter.Bots'}\n };\n }\n\n const f = document.createDocumentFragment();\n for(const key in details) {\n const button = Button('btn-primary btn-transparent folder-category-button', {icon: details[key].ico, text: details[key].text});\n button.dataset.peerId = key;\n button.append(this.checkbox());\n f.append(button);\n }\n categoriesSection.content.append(f);\n\n // ///////////////\n\n const selectedPeers = (this.type === 'included' ? filter.includePeerIds : filter.excludePeerIds).slice();\n\n this.selector = new AppSelectPeers({\n appendTo: this.container,\n onChange: this.onSelectChange,\n peerType: ['dialogs'],\n renderResultsFunc: this.renderResults,\n placeholder: 'Search',\n sectionNameLangPackKey: 'FilterChats',\n managers: this.managers\n });\n this.selector.selected = new Set(selectedPeers);\n\n let addedInitial = false;\n const _add = this.selector.add.bind(this.selector);\n this.selector.add = (peerId, title, scroll) => {\n if(this.selector.selected.size >= this.limit && addedInitial && !details[peerId]) {\n const el: HTMLInputElement = this.selector.list.querySelector(`[data-peer-id=\"${peerId}\"] [type=\"checkbox\"]`);\n if(el) {\n setTimeout(() => {\n el.checked = false;\n }, 0);\n }\n\n const str = I18n.format(this.type === 'excluded' ? 'ChatList.Filter.Exclude.LimitReached': 'ChatList.Filter.Include.LimitReached', true);\n toast(str);\n return;\n }\n\n const div = _add(peerId, details[peerId] ? i18n(details[peerId].text) : undefined, scroll);\n if(details[peerId]) {\n div.querySelector('avatar-element').classList.add('tgico-' + details[peerId].ico);\n }\n return div;\n };\n\n this.selector.scrollable.container.append(categoriesSection.container, this.selector.scrollable.container.lastElementChild);\n\n this.selector.addInitial(selectedPeers);\n addedInitial = true;\n\n for(const flag in filter.pFlags) {\n // @ts-ignore\n if(details.hasOwnProperty(flag) && !!filter.pFlags[flag]) {\n simulateClickEvent(categoriesSection.content.querySelector(`[data-peer-id=\"${flag}\"]`) as HTMLElement);\n }\n }\n }\n\n onSelectChange = (length: number) => {\n // const changed = !deepEqual(this.filter, this.originalFilter);\n if(this.type === 'included') {\n this.confirmBtn.style.display = length ? '' : 'none';\n }\n };\n\n onCloseAfterTimeout() {\n if(this.selector) {\n this.selector.container.remove();\n this.selector = null;\n }\n\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {MyDialogFilter as DialogFilter} from '../../../lib/storages/filters';\nimport lottieLoader, {LottieLoader} from '../../../lib/rlottie/lottieLoader';\nimport {SliderSuperTab} from '../../slider';\nimport {toast} from '../../toast';\nimport InputField from '../../inputField';\nimport ButtonIcon from '../../buttonIcon';\nimport ButtonMenuToggle from '../../buttonMenuToggle';\nimport {ButtonMenuItemOptions} from '../../buttonMenu';\nimport Button from '../../button';\nimport AppIncludedChatsTab from './includedChats';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport PopupPeer from '../../popups/peer';\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport wrapDraftText from '../../../lib/richTextProcessor/wrapDraftText';\nimport filterAsync from '../../../helpers/array/filterAsync';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\nconst MAX_FOLDER_NAME_LENGTH = 12;\n\nexport default class AppEditFolderTab extends SliderSuperTab {\n private caption: HTMLElement;\n private stickerContainer: HTMLElement;\n\n private confirmBtn: HTMLElement;\n private menuBtn: HTMLElement;\n private nameInputField: InputField;\n\n private includePeerIds: SettingSection;\n private excludePeerIds: SettingSection;\n private flags: {[k in 'contacts' | 'non_contacts' | 'groups' | 'broadcasts' | 'bots' | 'exclude_muted' | 'exclude_archived' | 'exclude_read']: HTMLElement} = {} as any;\n\n private animation: RLottiePlayer;\n private filter: DialogFilter;\n private originalFilter: DialogFilter;\n\n private type: 'edit' | 'create';\n private loadAnimationPromise: ReturnType;\n\n public init() {\n this.container.classList.add('edit-folder-container');\n this.caption = document.createElement('div');\n this.caption.classList.add('caption');\n this.caption.append(i18n('FilterIncludeExcludeInfo'));\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add('sticker-container');\n\n this.confirmBtn = ButtonIcon('check btn-confirm hide blue');\n const deleteFolderButton: ButtonMenuItemOptions = {\n icon: 'delete danger',\n text: 'FilterMenuDelete',\n onClick: () => {\n new PopupPeer('filter-delete', {\n titleLangKey: 'ChatList.Filter.Confirm.Remove.Header',\n descriptionLangKey: 'ChatList.Filter.Confirm.Remove.Text',\n buttons: [{\n langKey: 'Delete',\n callback: () => {\n deleteFolderButton.element.setAttribute('disabled', 'true');\n this.managers.filtersStorage.updateDialogFilter(this.filter, true).then((bool) => {\n if(bool) {\n this.close();\n }\n }).finally(() => {\n deleteFolderButton.element.removeAttribute('disabled');\n });\n },\n isDanger: true\n }]\n }).show();\n }\n };\n this.menuBtn = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [deleteFolderButton]\n });\n this.menuBtn.classList.add('hide');\n\n this.header.append(this.confirmBtn, this.menuBtn);\n\n const inputSection = new SettingSection({});\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.nameInputField = new InputField({\n label: 'FilterNameHint',\n maxLength: MAX_FOLDER_NAME_LENGTH\n });\n\n inputWrapper.append(this.nameInputField.container);\n inputSection.content.append(inputWrapper);\n\n const generateList = (className: string, h2Text: LangPackKey, buttons: {icon: string, name?: string, withRipple?: true, text: LangPackKey}[], to: any) => {\n const section = new SettingSection({\n name: h2Text,\n noDelimiter: true\n });\n\n section.container.classList.add('folder-list', className);\n\n const categories = section.generateContentElement();\n categories.classList.add('folder-categories');\n\n buttons.forEach((o) => {\n const button = Button('folder-category-button btn btn-primary btn-transparent', {\n icon: o.icon,\n text: o.text,\n noRipple: o.withRipple ? undefined : true\n });\n\n if(o.name) {\n to[o.name] = button;\n }\n\n categories.append(button);\n });\n\n return section;\n };\n\n this.includePeerIds = generateList('folder-list-included', 'FilterInclude', [{\n icon: 'add primary',\n text: 'ChatList.Filter.Include.AddChat',\n withRipple: true\n }, {\n text: 'ChatList.Filter.Contacts',\n icon: 'newprivate',\n name: 'contacts'\n }, {\n text: 'ChatList.Filter.NonContacts',\n icon: 'noncontacts',\n name: 'non_contacts'\n }, {\n text: 'ChatList.Filter.Groups',\n icon: 'group',\n name: 'groups'\n }, {\n text: 'ChatList.Filter.Channels',\n icon: 'channel',\n name: 'broadcasts'\n }, {\n text: 'ChatList.Filter.Bots',\n icon: 'bots',\n name: 'bots'\n }], this.flags);\n\n this.excludePeerIds = generateList('folder-list-excluded', 'FilterExclude', [{\n icon: 'minus primary',\n text: 'ChatList.Filter.Exclude.AddChat',\n withRipple: true\n }, {\n text: 'ChatList.Filter.MutedChats',\n icon: 'mute',\n name: 'exclude_muted'\n }, {\n text: 'ChatList.Filter.Archive',\n icon: 'archive',\n name: 'exclude_archived'\n }, {\n text: 'ChatList.Filter.ReadChats',\n icon: 'readchats',\n name: 'exclude_read'\n }], this.flags);\n\n this.scrollable.append(this.stickerContainer, this.caption, inputSection.container, this.includePeerIds.container, this.excludePeerIds.container);\n\n const includedFlagsContainer = this.includePeerIds.container.querySelector('.folder-categories');\n const excludedFlagsContainer = this.excludePeerIds.container.querySelector('.folder-categories');\n\n attachClickEvent(includedFlagsContainer.querySelector('.btn') as HTMLElement, () => {\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'included', this);\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(excludedFlagsContainer.querySelector('.btn') as HTMLElement, () => {\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'excluded', this);\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.confirmBtn, () => {\n if(this.nameInputField.input.classList.contains('error')) {\n return;\n }\n\n if(!this.nameInputField.value.trim()) {\n this.nameInputField.input.classList.add('error');\n return;\n }\n\n let include = (Array.from(includedFlagsContainer.children) as HTMLElement[]).slice(1).reduce((acc, el) => acc + +!el.style.display, 0);\n include += this.filter.include_peers.length;\n\n if(!include) {\n toast('Please choose at least one chat for this folder.');\n return;\n }\n\n this.confirmBtn.setAttribute('disabled', 'true');\n\n let promise: Promise;\n if(!this.filter.id) {\n promise = this.managers.filtersStorage.createDialogFilter(this.filter);\n } else {\n promise = this.managers.filtersStorage.updateDialogFilter(this.filter);\n }\n\n promise.then((bool) => {\n if(bool) {\n this.close();\n }\n }).catch((err) => {\n if(err.type === 'DIALOG_FILTERS_TOO_MUCH') {\n toast('Sorry, you can\\'t create more folders.');\n } else {\n console.error('updateDialogFilter error:', err);\n }\n }).finally(() => {\n this.confirmBtn.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(this.nameInputField.input)('input', () => {\n this.filter.title = this.nameInputField.value;\n this.editCheckForChange();\n });\n\n const reloadMissingPromises: Promise[] = this.type === 'edit' ? [\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'pinned_peers'),\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'include_peers'),\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'exclude_peers')\n ] : [];\n\n return Promise.all([\n this.loadAnimationPromise = lottieLoader.loadAnimationAsAsset({\n container: this.stickerContainer,\n loop: false,\n autoplay: false,\n width: 86,\n height: 86\n }, 'Folders_2').then((player) => {\n this.animation = player;\n\n return lottieLoader.waitForFirstFrame(player);\n }),\n\n ...reloadMissingPromises\n ]);\n }\n\n onOpenAfterTimeout() {\n this.loadAnimationPromise.then(() => {\n this.animation.autoplay = true;\n this.animation.play();\n });\n }\n\n private onCreateOpen() {\n // this.caption.style.display = '';\n this.setTitle('FilterNew');\n this.menuBtn.classList.add('hide');\n this.confirmBtn.classList.remove('hide');\n this.nameInputField.value = '';\n\n for(const flag in this.flags) {\n // @ts-ignore\n this.flags[flag].style.display = 'none';\n }\n }\n\n private onEditOpen() {\n // this.caption.style.display = 'none';\n this.setTitle(this.type === 'create' ? 'FilterNew' : 'FilterHeaderEdit');\n\n if(this.type === 'edit') {\n this.menuBtn.classList.remove('hide');\n this.confirmBtn.classList.add('hide');\n }\n\n const filter = this.filter;\n this.nameInputField.value = wrapDraftText(filter.title);\n\n for(const flag in this.flags) {\n this.flags[flag as keyof AppEditFolderTab['flags']].style.display = !!filter.pFlags[flag as keyof AppEditFolderTab['flags']] ? '' : 'none';\n }\n\n (['includePeerIds' as const, 'excludePeerIds' as const]).forEach(async(key) => {\n const section = this[key];\n const ul = appDialogsManager.createChatList({ignoreClick: true});\n\n let peers = filter[key];\n\n // filter peers where we're kicked\n const hasPeer = async(peerId: PeerId) => {\n return !!(await this.managers.appMessagesManager.getDialogOnly(peerId)) || (peerId.isUser() ? (await this.managers.appUsersManager.getUser(peerId.toUserId()))._ === 'user' : false);\n };\n\n const filtered = await filterAsync(peers, (peerId) => hasPeer(peerId));\n peers.length = 0;\n peers.push(...filtered);\n\n peers = peers.slice();\n\n const renderMore = async(_length: number) => {\n for(let i = 0, length = Math.min(peers.length, _length); i < length; ++i) {\n const peerId = peers.shift();\n if(peerId.isUser() ? false : !(await this.managers.appMessagesManager.getDialogOnly(peerId))) {\n continue;\n }\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: ul,\n rippleEnabled: false,\n meAsSaved: true,\n avatarSize: 'small'\n });\n dom.lastMessageSpan.parentElement.remove();\n }\n\n if(peers.length) {\n showMore.lastElementChild.replaceWith(i18n('FilterShowMoreChats', [peers.length]));\n } else if(showMore) {\n showMore.remove();\n }\n };\n\n section.generateContentElement().append(ul);\n\n let showMore: HTMLElement;\n if(peers.length) {\n const content = section.generateContentElement();\n showMore = Button('folder-category-button btn btn-primary btn-transparent', {icon: 'down'});\n showMore.classList.add('load-more', 'rp-overflow');\n attachClickEvent(showMore, () => renderMore(20), {listenerSetter: this.listenerSetter});\n showMore.append(i18n('FilterShowMoreChats', [peers.length]));\n\n content.append(showMore);\n }\n\n renderMore(4);\n });\n }\n\n editCheckForChange() {\n if(this.type === 'edit') {\n const changed = !deepEqual(this.originalFilter, this.filter);\n this.confirmBtn.classList.toggle('hide', !changed);\n this.menuBtn.classList.toggle('hide', changed);\n }\n };\n\n setFilter(filter: DialogFilter, firstTime: boolean) {\n if(this.container) {\n // cleanup\n Array.from(this.container.querySelectorAll('ul, .load-more')).forEach((el) => el.remove());\n }\n\n if(firstTime) {\n this.originalFilter = filter;\n this.filter = copy(filter);\n } else {\n this.filter = filter;\n this.onEditOpen();\n this.editCheckForChange();\n }\n }\n\n public open(filter?: DialogFilter) {\n if(filter === undefined) {\n this.setFilter({\n _: 'dialogFilter',\n id: 0,\n title: '',\n pFlags: {},\n pinned_peers: [],\n include_peers: [],\n exclude_peers: [],\n pinnedPeerIds: [],\n includePeerIds: [],\n excludePeerIds: []\n }, true);\n this.type = 'create';\n } else {\n this.setFilter(filter, true);\n this.type = 'edit';\n }\n\n // @ts-ignore\n return super.open().then(() => {\n if(this.type === 'edit') {\n this.setFilter(this.originalFilter, true);\n this.onEditOpen();\n } else {\n this.onCreateOpen();\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField from '../../inputField';\nimport {SliderSuperTab} from '../../slider';\nimport EditPeer from '../../editPeer';\nimport {UsernameInputField} from '../../usernameInputField';\nimport {i18n, i18n_, LangPackKey} from '../../../lib/langPack';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport rootScope from '../../../lib/rootScope';\nimport setBlankToAnchor from '../../../lib/richTextProcessor/setBlankToAnchor';\nimport getPeerEditableUsername from '../../../lib/appManagers/utils/peers/getPeerEditableUsername';\nimport SettingSection, {generateSection} from '../../settingSection';\nimport UsernamesSection from '../../usernamesSection';\n\n// TODO: аватарка не поменяется в этой вкладке после изменения почему-то (если поставить в другом клиенте, и потом тут проверить, для этого ещё вышел в чатлист)\n\nexport function purchaseUsernameCaption() {\n const p = document.createElement('div');\n const FRAGMENT_USERNAME_URL = 'https://fragment.com/username/';\n const a = setBlankToAnchor(document.createElement('a'));\n const purchaseText = i18n('Username.Purchase', [a]);\n purchaseText.classList.add('username-purchase-help');\n p.append(\n purchaseText,\n document.createElement('br'),\n document.createElement('br')\n );\n p.classList.add('hide');\n\n return {\n element: p,\n setUsername: (username: string) => {\n if(username) {\n a.href = FRAGMENT_USERNAME_URL + username;\n }\n\n p.classList.toggle('hide', !username);\n }\n };\n}\n\nexport default class AppEditProfileTab extends SliderSuperTab {\n private firstNameInputField: InputField;\n private lastNameInputField: InputField;\n private bioInputField: InputField;\n private usernameInputField: UsernameInputField;\n\n private profileUrlContainer: HTMLDivElement;\n private profileUrlAnchor: HTMLAnchorElement;\n\n private editPeer: EditPeer;\n\n public static getInitArgs() {\n return {\n bioMaxLength: rootScope.managers.apiManager.getLimit('bio'),\n user: rootScope.managers.appUsersManager.getSelf(),\n userFull: rootScope.managers.appProfileManager.getProfile(rootScope.myId.toUserId())\n };\n }\n\n public async init(p: ReturnType) {\n this.container.classList.add('edit-profile-container');\n this.setTitle('EditAccount.Title');\n\n const inputFields: InputField[] = [];\n\n const [bioMaxLength, user, userFull] = await Promise.all([p.bioMaxLength, p.user, p.userFull]);\n\n {\n const section = generateSection(this.scrollable, undefined, 'Bio.Description');\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.firstNameInputField = new InputField({\n label: 'EditProfile.FirstNameLabel',\n name: 'first-name',\n maxLength: 70\n });\n this.lastNameInputField = new InputField({\n label: 'Login.Register.LastName.Placeholder',\n name: 'last-name',\n maxLength: 64\n });\n this.bioInputField = new InputField({\n label: 'EditProfile.BioLabel',\n name: 'bio',\n maxLength: bioMaxLength\n });\n\n inputWrapper.append(this.firstNameInputField.container, this.lastNameInputField.container, this.bioInputField.container);\n\n const caption = document.createElement('div');\n caption.classList.add('caption');\n i18n_({element: caption, key: 'Bio.Description'});\n\n inputFields.push(this.firstNameInputField, this.lastNameInputField, this.bioInputField);\n\n this.editPeer = new EditPeer({\n peerId: rootScope.myId,\n inputFields,\n listenerSetter: this.listenerSetter\n });\n\n this.content.append(this.editPeer.nextBtn);\n\n section.append(this.editPeer.avatarEdit.container, inputWrapper);\n }\n\n {\n const section = new SettingSection({\n name: 'EditAccount.Username',\n caption: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.usernameInputField = new UsernameInputField({\n label: 'EditProfile.Username.Label',\n name: 'username',\n plainText: true,\n listenerSetter: this.listenerSetter,\n onChange: () => {\n this.editPeer.handleChange();\n // this.setProfileUrl();\n\n const {error} = this.usernameInputField;\n const isPurchase = error?.type === 'USERNAME_PURCHASE_AVAILABLE';\n setUsername(isPurchase ? this.usernameInputField.value : undefined);\n },\n availableText: 'EditProfile.Username.Available',\n takenText: 'EditProfile.Username.Taken',\n invalidText: 'EditProfile.Username.Invalid'\n }, this.managers);\n\n inputWrapper.append(this.usernameInputField.container);\n\n const caption = section.caption;\n\n const {setUsername, element: p} = purchaseUsernameCaption();\n\n caption.append(\n p,\n i18n('UsernameHelp')\n // document.createElement('br'),\n // document.createElement('br')\n );\n\n // const profileUrlContainer = this.profileUrlContainer = document.createElement('div');\n // profileUrlContainer.classList.add('profile-url-container');\n // const profileUrlAnchor = this.profileUrlAnchor = anchorCopy();\n // profileUrlContainer.append(i18n('UsernameHelpLink', [profileUrlAnchor]));\n // caption.append(profileUrlContainer);\n\n inputFields.push(this.usernameInputField);\n section.content.append(inputWrapper);\n this.scrollable.append(section.container);\n }\n\n {\n const section = new UsernamesSection({\n peerId: rootScope.myId,\n peer: user,\n listenerSetter: this.listenerSetter,\n usernameInputField: this.usernameInputField,\n middleware: this.middlewareHelper.get()\n });\n\n this.scrollable.append(section.container);\n }\n\n attachClickEvent(this.editPeer.nextBtn, () => {\n this.editPeer.nextBtn.disabled = true;\n\n const promises: Promise[] = [];\n\n const profilePromise = this.managers.appProfileManager.updateProfile(\n this.firstNameInputField.value,\n this.lastNameInputField.value,\n this.bioInputField.value\n );\n promises.push(profilePromise.then(() => {\n this.close();\n }, (err) => {\n console.error('updateProfile error:', err);\n }));\n\n if(this.editPeer.uploadAvatar) {\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\n }));\n }\n\n if(this.usernameInputField.isValidToChange()) {\n promises.push(this.managers.appUsersManager.updateUsername(this.usernameInputField.value));\n }\n\n Promise.race(promises).finally(() => {\n this.editPeer.nextBtn.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.firstNameInputField.setOriginalValue(user.first_name, true);\n this.lastNameInputField.setOriginalValue(user.last_name, true);\n this.bioInputField.setOriginalValue(userFull.about, true);\n this.usernameInputField.setOriginalValue(getPeerEditableUsername(user), true);\n\n // this.setProfileUrl();\n this.editPeer.handleChange();\n }\n\n // private setProfileUrl() {\n // if(this.usernameInputField.input.classList.contains('error') || !this.usernameInputField.value.length) {\n // this.profileUrlContainer.style.display = 'none';\n // } else {\n // this.profileUrlContainer.style.display = '';\n // this.profileUrlAnchor.replaceWith(this.profileUrlAnchor = anchorCopy({mePath: this.usernameInputField.value}));\n // }\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appImManager from '../../lib/appManagers/appImManager';\nimport SidebarSlider from '../slider';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport AppSharedMediaTab from './tabs/sharedMedia';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport const RIGHT_COLUMN_ACTIVE_CLASSNAME = 'is-right-column-shown';\n\nexport class AppSidebarRight extends SidebarSlider {\n private isColumnProportionSet = false;\n private sharedMediaTab: AppSharedMediaTab;\n // public rect: DOMRect;\n\n constructor() {\n super({\n sidebarEl: document.getElementById('column-right') as HTMLElement,\n canHideFirst: true,\n navigationType: 'right'\n });\n }\n\n construct(managers: AppManagers) {\n this.managers = managers;\n\n mediaSizes.addEventListener('changeScreen', (from, to) => {\n if(to === ScreenSize.medium && from !== ScreenSize.mobile) {\n this.toggleSidebar(false);\n }\n });\n\n mediaSizes.addEventListener('resize', () => {\n this.setColumnProportion();\n });\n }\n\n public createSharedMediaTab() {\n const tab = this.createTab(AppSharedMediaTab, false, true);\n tab.slider = this;\n // this.tabsContainer.prepend(tab.container);\n return tab;\n }\n\n public replaceSharedMediaTab(tab?: AppSharedMediaTab) {\n const previousTab = this.sharedMediaTab;\n if(previousTab) {\n const idx = this.historyTabIds.indexOf(previousTab);\n\n if(this._selectTab.getFrom() === previousTab.container) {\n this._selectTab.setFrom(tab?.container);\n }\n\n if(tab) {\n if(idx !== -1) {\n this.historyTabIds[idx] = tab;\n }\n\n const wasActive = previousTab.container.classList.contains('active');\n if(wasActive) {\n tab.container.classList.add('active');\n }\n\n previousTab.container.replaceWith(tab.container);\n } else {\n if(idx !== -1) {\n this.historyTabIds.splice(idx, 1);\n }\n\n previousTab.container.remove();\n }\n } else {\n this.tabsContainer.prepend(tab.container);\n }\n\n this.sharedMediaTab = tab;\n }\n\n public onCloseTab(id: number, animate: boolean, isNavigation?: boolean) {\n if(!this.historyTabIds.length) {\n this.toggleSidebar(false, animate);\n }\n\n super.onCloseTab(id, animate, isNavigation);\n }\n\n private setColumnProportion() {\n const proportion = this.sidebarEl.scrollWidth / this.sidebarEl.previousElementSibling.scrollWidth;\n document.documentElement.style.setProperty('--right-column-proportion', '' + proportion);\n // this.rect = this.sidebarEl.getBoundingClientRect();\n }\n\n public toggleSidebar(enable?: boolean, animate?: boolean) {\n const active = document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n let willChange: boolean;\n if(enable !== undefined) {\n if(enable) {\n if(!active) {\n willChange = true;\n }\n } else if(active) {\n willChange = true;\n }\n } else {\n willChange = true;\n }\n\n if(!willChange) return Promise.resolve();\n\n if(!active && !this.historyTabIds.length) {\n this.sharedMediaTab.open();\n }\n\n if(!this.isColumnProportionSet) {\n this.setColumnProportion();\n this.isColumnProportionSet = true;\n }\n\n const animationPromise = appImManager.selectTab(active ? 1 : 2, animate);\n document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, enable);\n return animationPromise;\n\n /* return new Promise((resolve, reject) => {\n const hidden: {element: HTMLDivElement, height: number}[] = [];\n const observer = new IntersectionObserver((entries) => {\n for(const entry of entries) {\n const bubble = entry.target as HTMLDivElement;\n if(!entry.isIntersecting) {\n hidden.push({element: bubble, height: bubble.scrollHeight});\n }\n }\n\n for(const item of hidden) {\n item.element.style.minHeight = item.height + 'px';\n (item.element.firstElementChild as HTMLElement).style.display = 'none';\n item.element.style.width = '1px';\n }\n\n //console.log('hidden', hidden);\n observer.disconnect();\n\n set();\n\n setTimeout(() => {\n for(const item of hidden) {\n item.element.style.minHeight = '';\n item.element.style.width = '';\n (item.element.firstElementChild as HTMLElement).style.display = '';\n }\n\n resolve();\n }, 200);\n });\n\n const length = Object.keys(appImManager.bubbles).length;\n if(length) {\n for(const i in appImManager.bubbles) {\n observer.observe(appImManager.bubbles[i]);\n }\n } else {\n set();\n setTimeout(resolve, 200);\n }\n }); */\n }\n}\n\nconst appSidebarRight = new AppSidebarRight();\nMOUNT_CLASS_TO.appSidebarRight = appSidebarRight;\nexport default appSidebarRight;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider'\nimport InputField from '../../inputField';\nimport EditPeer from '../../editPeer';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport CheckboxField from '../../checkboxField';\nimport Button from '../../button';\nimport PeerTitle from '../../peerTitle';\nimport rootScope from '../../../lib/rootScope';\nimport PopupPeer from '../../popups/peer';\nimport {addCancelButton} from '../../popups';\nimport {i18n} from '../../../lib/langPack';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport formatUserPhone from '../../wrappers/formatUserPhone';\nimport SettingSection from '../../settingSection';\nimport wrapPeerTitle from '../../wrappers/peerTitle';\n\nexport default class AppEditContactTab extends SliderSuperTab {\n private nameInputField: InputField;\n private lastNameInputField: InputField;\n private editPeer: EditPeer;\n private sharePhoneCheckboxField: CheckboxField;\n public peerId: PeerId;\n\n public async init() {\n const {peerId} = this;\n const userId = peerId.toUserId();\n this.container.classList.add('edit-peer-container', 'edit-contact-container');\n const [isContact, privacy] = await Promise.all([\n this.managers.appUsersManager.isContact(userId),\n this.managers.appPrivacyManager.getPrivacy('inputPrivacyKeyPhoneNumber')\n ]);\n const isNew = !isContact;\n this.setTitle(isNew ? 'AddContactTitle' : 'Edit');\n\n {\n const section = new SettingSection({noDelimiter: true});\n const inputFields: InputField[] = [];\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.nameInputField = new InputField({\n label: 'FirstName',\n name: 'contact-name',\n maxLength: 70,\n required: true\n });\n this.lastNameInputField = new InputField({\n label: 'LastName',\n name: 'contact-lastname',\n maxLength: 70\n });\n\n if(userId) {\n const user = await this.managers.appUsersManager.getUser(userId);\n\n if(isNew) {\n this.nameInputField.setDraftValue(user.first_name);\n this.lastNameInputField.setDraftValue(user.last_name);\n } else {\n this.nameInputField.setOriginalValue(user.first_name);\n this.lastNameInputField.setOriginalValue(user.last_name);\n }\n }\n\n inputWrapper.append(this.nameInputField.container, this.lastNameInputField.container);\n inputFields.push(this.nameInputField, this.lastNameInputField);\n\n this.editPeer = new EditPeer({\n peerId: peerId,\n inputFields,\n listenerSetter: this.listenerSetter,\n doNotEditAvatar: true\n });\n this.content.append(this.editPeer.nextBtn);\n\n if(peerId) {\n const div = document.createElement('div');\n div.classList.add('avatar-edit');\n div.append(this.editPeer.avatarElem);\n\n const notificationsCheckboxField = new CheckboxField({\n text: 'Notifications'\n });\n\n notificationsCheckboxField.input.addEventListener('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n this.managers.appMessagesManager.togglePeerMute({peerId});\n });\n\n this.listenerSetter.add(rootScope)('notify_settings', async(update) => {\n if(update.peer._ !== 'notifyPeer') return;\n const peerId = getPeerId(update.peer.peer);\n if(peerId === peerId) {\n const enabled = !(await this.managers.appNotificationsManager.isMuted(update.notify_settings));\n if(enabled !== notificationsCheckboxField.checked) {\n notificationsCheckboxField.checked = enabled;\n }\n }\n });\n\n const profileNameDiv = document.createElement('div');\n profileNameDiv.classList.add('profile-name');\n profileNameDiv.append(new PeerTitle({\n peerId: peerId\n }).element);\n // profileNameDiv.innerHTML = 'Karen Stanford';\n\n const profileSubtitleDiv = document.createElement('div');\n profileSubtitleDiv.classList.add('profile-subtitle');\n profileSubtitleDiv.append(i18n('EditContact.OriginalName'));\n\n section.content.append(div, profileNameDiv, profileSubtitleDiv, inputWrapper);\n\n if(!isNew) {\n const notificationsRow = new Row({\n checkboxField: notificationsCheckboxField,\n withCheckboxSubtitle: true,\n listenerSetter: this.listenerSetter\n });\n\n const enabled = !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId, respectType: false}));\n notificationsCheckboxField.checked = enabled;\n\n section.content.append(notificationsRow.container);\n } else {\n const user = await this.managers.appUsersManager.getUser(userId);\n\n const phoneRow = new Row({\n icon: 'phone',\n titleLangKey: user.phone ? undefined : 'MobileHidden',\n title: user.phone ? formatUserPhone(user.phone) : undefined,\n subtitleLangKey: user.phone ? 'Phone' : 'MobileHiddenExceptionInfo',\n subtitleLangArgs: user.phone ? undefined : [new PeerTitle({peerId: peerId}).element]\n });\n\n section.content.append(phoneRow.container);\n }\n } else {\n section.content.append(inputWrapper);\n }\n\n this.scrollable.append(section.container);\n }\n\n if(!isNew) {\n const section = new SettingSection();\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'PeerInfo.DeleteContact'});\n\n attachClickEvent(btnDelete, () => {\n new PopupPeer('popup-delete-contact', {\n peerId: peerId,\n titleLangKey: 'DeleteContact',\n descriptionLangKey: 'AreYouSureDeleteContact',\n buttons: addCancelButton([{\n langKey: 'Delete',\n callback: () => {\n const toggle = toggleDisability([btnDelete], true);\n\n this.managers.appUsersManager.deleteContacts([userId]).then(() => {\n this.close();\n }, () => {\n toggle();\n });\n },\n isDanger: true\n }])\n }).show();\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n } else if(\n privacy.some((privacyRule) => privacyRule._ === 'privacyValueDisallowAll') &&\n !privacy.some((privacyRule) => privacyRule._ === 'privacyValueAllowUsers' && privacyRule.users.includes(userId))\n ) {\n const section = new SettingSection({\n caption: 'NewContact.Exception.ShareMyPhoneNumber.Desc',\n captionArgs: [await wrapPeerTitle({peerId: this.peerId})]\n });\n const checkboxField = this.sharePhoneCheckboxField = new CheckboxField({\n text: 'NewContact.Exception.ShareMyPhoneNumber',\n checked: true\n });\n const row = CreateRowFromCheckboxField(checkboxField);\n\n section.content.append(row.container);\n\n this.scrollable.append(section.container);\n }\n\n attachClickEvent(this.editPeer.nextBtn, async() => {\n this.editPeer.nextBtn.disabled = true;\n\n this.managers.appUsersManager.addContact(\n userId,\n this.nameInputField.value,\n this.lastNameInputField.value,\n (await this.managers.appUsersManager.getUser(userId)).phone,\n this.sharePhoneCheckboxField?.checked\n ).finally(() => {\n this.editPeer.nextBtn.removeAttribute('disabled');\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport {makeMediaSize} from '../../../helpers/mediaSize';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {ForumTopic} from '../../../layer';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {GENERAL_TOPIC_ID, TOPIC_COLORS} from '../../../lib/mtproto/mtproto_config';\nimport getAbbreviation from '../../../lib/richTextProcessor/getAbbreviation';\nimport ButtonIcon from '../../buttonIcon';\nimport CheckboxField from '../../checkboxField';\nimport EmojiTab from '../../emoticonsDropdown/tabs/emoji';\nimport InputField from '../../inputField';\nimport Row from '../../row';\nimport SettingSection from '../../settingSection';\nimport appSidebarLeft from '../../sidebarLeft';\nimport SliderSuperTab from '../../sliderTab';\nimport {wrapTopicIcon} from '../../wrappers/messageActionTextNewUnsafe';\n\nconst size = 64;\nconst mediaSize = makeMediaSize(size, size);\n\nexport default class AppEditTopicTab extends SliderSuperTab {\n private iconDiv: HTMLElement;\n private colorIndex: number;\n private nameInputField: InputField;\n private topic: Parameters[0]['topic'];\n private emojiElement: HTMLElement;\n private confirmBtn: HTMLButtonElement;\n private originalTopic: ForumTopic.forumTopic;\n\n public async init(peerId: PeerId, threadId?: number) {\n this.colorIndex = 0;\n const isNew = !threadId;\n const isGeneral = threadId === GENERAL_TOPIC_ID;\n this.container.classList.add('edit-topic-container');\n this.setTitle(isNew ? 'NewTopic' : 'ForumTopic.Title.Edit');\n const chatId = peerId.toChatId();\n\n if(threadId) {\n this.topic = this.originalTopic = copy(await this.managers.dialogsStorage.getForumTopic(peerId, threadId));\n }\n\n {\n const section = new SettingSection({\n name: isGeneral ? 'CreateGeneralTopicTitle' : 'CreateTopicTitle'\n });\n\n const iconDiv = this.iconDiv = document.createElement('div');\n iconDiv.classList.add('edit-topic-icon-container');\n\n !threadId && attachClickEvent(iconDiv, () => {\n if(this.topic.icon_emoji_id) {\n return;\n }\n\n this.colorIndex = (this.colorIndex + 1) % TOPIC_COLORS.length;\n this.setIcon();\n }, {listenerSetter: this.listenerSetter});\n\n if(threadId) {\n iconDiv.classList.add('disable-hover');\n }\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const nameInputField = this.nameInputField = new InputField({\n label: 'ForumTopic.Name.Placeholder',\n withLinebreaks: false,\n name: 'topic-name',\n maxLength: 70,\n required: true\n });\n\n if(this.topic) {\n nameInputField.setOriginalValue(this.topic.title, true);\n }\n\n const confirmBtn = this.confirmBtn = ButtonIcon('check btn-confirm blue hide', {noRipple: true});\n this.header.append(confirmBtn);\n\n attachClickEvent(confirmBtn, () => {\n const toggle = toggleDisability([confirmBtn], true);\n if(threadId) {\n this.managers.appChatsManager.editForumTopic({\n chatId,\n topicId: threadId,\n title: nameInputField.value,\n iconEmojiId: this.topic.icon_emoji_id || 0\n }).then(() => {\n this.close();\n }).catch((err) => {\n console.error('edit topic error', err);\n toggle();\n });\n } else {\n this.managers.appChatsManager.createForumTopic({\n chatId,\n iconColor: TOPIC_COLORS[this.colorIndex],\n iconEmojiId: this.topic.icon_emoji_id,\n title: nameInputField.value\n }).then((threadId) => {\n this.close();\n appImManager.setInnerPeer({\n peerId,\n threadId\n });\n }).catch((err) => {\n console.error('create topic error', err);\n toggle();\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(nameInputField.input)('input', () => {\n this.validate();\n this.setIcon(this.topic?.icon_emoji_id);\n });\n\n inputWrapper.append(nameInputField.container);\n\n section.content.append(iconDiv, inputWrapper);\n\n this.scrollable.append(section.container);\n }\n\n const promises: Promise[] = [];\n\n if(!isGeneral) {\n const section = new SettingSection({});\n section.container.classList.add('edit-topic-emoticons-container');\n const emojiTab = new EmojiTab({\n managers: this.managers,\n isStandalone: true,\n noRegularEmoji: true,\n stickerSetId: 'inputStickerSetEmojiDefaultTopicIcons',\n onClick: (emoji) => {\n emojiTab.setActive(!emoji.docId ? {emoji: undefined, docId: undefined} : emoji);\n this.setIcon(emoji.docId);\n }\n });\n emojiTab.getContainerSize = () => ({\n width: appSidebarLeft.rect.width,\n height: 400\n });\n\n this.middlewareHelper.onDestroy(() => {\n emojiTab.destroy();\n });\n\n emojiTab.container.classList.remove('tabs-tab');\n\n this.emojiElement = document.createElement('span');\n this.emojiElement.classList.add('super-emoji-topic-icon');\n\n const promise = emojiTab.init().then(async() => {\n const category = emojiTab.getCustomCategory();\n\n const iconEmojiId = this.topic?.icon_emoji_id;\n emojiTab.addEmojiToCategory({\n category,\n element: this.emojiElement,\n batch: false,\n prepend: true,\n active: !iconEmojiId\n });\n\n if(iconEmojiId) {\n emojiTab.setActive({docId: iconEmojiId, emoji: ''});\n }\n });\n\n promises.push(promise);\n\n section.content.replaceWith(emojiTab.container);\n this.scrollable.append(section.container);\n } else {\n const section = new SettingSection({caption: 'EditTopicHideInfo'});\n\n const checkboxField = new CheckboxField({\n // toggle: true,\n checked: !(this.topic as ForumTopic.forumTopic).pFlags.hidden,\n text: 'EditTopicHide'\n });\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n const promise = this.managers.appChatsManager.editForumTopic({\n chatId,\n topicId: threadId,\n hidden: !checkboxField.checked\n });\n\n row.disableWithPromise(promise);\n });\n\n const row = new Row({\n checkboxField\n });\n\n section.content.append(row.container);\n\n this.scrollable.append(section.container);\n }\n\n return Promise.all(promises).then(() => {\n return this.s();\n });\n }\n\n private validate() {\n let isChanged = this.nameInputField.isValidToChange();\n if(!isChanged && this.originalTopic) {\n isChanged = this.topic.icon_emoji_id !== this.originalTopic.icon_emoji_id;\n }\n\n this.confirmBtn.classList.toggle('hide', !isChanged);\n }\n\n private s() {\n if(this.topic?.icon_color) {\n this.colorIndex = TOPIC_COLORS.indexOf(this.topic.icon_color);\n }\n\n return this.setIcon(this.topic?.icon_emoji_id, undefined, true);\n }\n\n private async setIcon(iconEmojiId?: Long, appendTo = this.iconDiv, force?: boolean) {\n const title = this.nameInputField.value;\n\n const isMainIcon = appendTo === this.iconDiv;\n\n if(isMainIcon) {\n const newTopic: AppEditTopicTab['topic'] = {\n id: this.topic?.id,\n icon_color: TOPIC_COLORS[this.colorIndex],\n title: getAbbreviation(title, true).text || 'A',\n icon_emoji_id: iconEmojiId\n };\n\n const oldTopic = this.topic;\n this.topic = newTopic;\n\n if(\n force ||\n !oldTopic ||\n oldTopic.icon_color !== newTopic.icon_color ||\n oldTopic.title !== newTopic.title\n ) {\n this.setIcon(undefined, this.emojiElement);\n }\n\n if(deepEqual(oldTopic, newTopic) && !force) {\n return;\n }\n\n this.validate();\n }\n\n const el = await wrapTopicIcon({\n topic: isMainIcon ? this.topic : {...this.topic, icon_emoji_id: undefined},\n customEmojiSize: mediaSize,\n middleware: this.middlewareHelper.get()\n });\n\n const span = document.createElement('div');\n span.classList.add('edit-topic-icon');\n span.append(el);\n\n const oldEl = appendTo.lastElementChild as HTMLElement;\n appendTo.append(span);\n\n const applyFadeAnimation = (el: HTMLElement, fadeIn: boolean) => {\n const frames: Keyframe[] = [\n {opacity: '0', transform: 'scale(0.8)'},\n {opacity: '1', transform: 'scale(1)'}\n ];\n\n const animation = el.animate(frames, {\n duration: 200,\n iterations: 1,\n easing: 'ease-in-out',\n fill: 'forwards',\n direction: fadeIn ? 'normal' : 'reverse'\n });\n\n return new Promise((resolve) => {\n animation.addEventListener('finish', () => {\n resolve();\n }, {once: true});\n });\n };\n\n if(oldEl) {\n applyFadeAnimation(oldEl, false).then(() => oldEl.remove());\n }\n\n applyFadeAnimation(span, true);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {copyTextToClipboard} from '../../../helpers/clipboard';\nimport {randomLong} from '../../../helpers/random';\nimport {Chat, ChatFull, ExportedChatInvite} from '../../../layer';\nimport Button from '../../button';\nimport {setButtonLoader} from '../../putPreloader';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport {toast} from '../../toast';\nimport {UsernameInputField} from '../../usernameInputField';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport I18n, {i18n} from '../../../lib/langPack';\nimport PopupPeer from '../../popups/peer';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport CheckboxField from '../../checkboxField';\nimport rootScope from '../../../lib/rootScope';\nimport SettingSection from '../../settingSection';\nimport UsernamesSection from '../../usernamesSection';\nimport getPeerEditableUsername from '../../../lib/appManagers/utils/peers/getPeerEditableUsername';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport {purchaseUsernameCaption} from '../../sidebarLeft/tabs/editProfile';\nimport confirmationPopup from '../../confirmationPopup';\n\nexport default class AppChatTypeTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n public chatFull: ChatFull;\n\n public async init() {\n this.container.classList.add('edit-peer-container', 'group-type-container');\n\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\n\n this.setTitle(isBroadcast ? 'ChannelType' : 'GroupType');\n\n const section = new SettingSection({\n name: isBroadcast ? 'ChannelType' : 'GroupType'\n });\n\n const random = randomLong();\n const privateRow = new Row({\n radioField: new RadioField({\n langKey: isBroadcast ? 'ChannelPrivate' : 'MegaPrivate',\n name: random,\n value: 'private'\n }),\n subtitleLangKey: isBroadcast ? 'ChannelPrivateInfo' : 'MegaPrivateInfo'\n });\n const publicRow = new Row({\n radioField: new RadioField({\n langKey: isBroadcast ? 'ChannelPublic' : 'MegaPublic',\n name: random,\n value: 'public'\n }),\n subtitleLangKey: isBroadcast ? 'ChannelPublicInfo' : 'MegaPublicInfo'\n });\n const form = RadioFormFromRows([privateRow, publicRow], (value) => {\n const a: HTMLElement[][] = [[privateSection.container], [publicContainer]];\n if(value === 'public') a.reverse();\n\n a[0].forEach((container) => container.classList.remove('hide'));\n a[1].forEach((container) => container.classList.add('hide'));\n\n onChange();\n });\n\n const chat: Chat = await this.managers.appChatsManager.getChat(this.chatId);\n\n section.content.append(form);\n\n const privateSection = new SettingSection({});\n\n // let revoked = false;\n const linkRow = new Row({\n title: (this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link,\n subtitleLangKey: isBroadcast ? 'ChannelPrivateLinkHelp' : 'MegaPrivateLinkHelp',\n clickable: () => {\n copyTextToClipboard((this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link);\n toast(I18n.format('LinkCopied', true));\n },\n listenerSetter: this.listenerSetter\n });\n\n const btnRevoke = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'RevokeLink'});\n\n attachClickEvent(btnRevoke, () => {\n new PopupPeer('revoke-link', {\n buttons: [{\n langKey: 'RevokeButton',\n callback: () => {\n const toggle = toggleDisability([btnRevoke], true);\n\n this.managers.appProfileManager.getChatInviteLink(this.chatId, true).then((link) => {\n toggle();\n linkRow.title.innerHTML = link;\n // revoked = true;\n // onChange();\n });\n }\n }],\n titleLangKey: 'RevokeLink',\n descriptionLangKey: 'RevokeAlert'\n }).show();\n }, {listenerSetter: this.listenerSetter});\n\n privateSection.content.append(linkRow.container, btnRevoke);\n\n const publicSection = new SettingSection({\n caption: true,\n noDelimiter: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const placeholder = 't.me/';\n\n const onChange = () => {\n const changed = (privateRow.radioField.checked && (originalValue !== placeholder/* || revoked */)) ||\n (linkInputField.isValidToChange() && linkInputField.input.classList.contains('valid'));\n applyBtn.classList.toggle('is-visible', changed);\n\n const {error} = linkInputField;\n const isPurchase = error?.type === 'USERNAME_PURCHASE_AVAILABLE';\n setUsername(isPurchase ? linkInputField.getValue() : undefined);\n };\n\n const linkInputField = new UsernameInputField({\n label: 'SetUrlPlaceholder',\n name: 'group-public-link',\n plainText: true,\n listenerSetter: this.listenerSetter,\n availableText: 'Link.Available',\n invalidText: 'Link.Invalid',\n takenText: 'Link.Taken',\n onChange: onChange,\n peerId: this.chatId.toPeerId(true),\n head: placeholder\n }, this.managers);\n\n const {setUsername, element: p} = purchaseUsernameCaption();\n\n publicSection.caption.append(\n p,\n i18n(isBroadcast ? 'Channel.UsernameAboutChannel' : 'Channel.UsernameAboutGroup')\n );\n\n const usernamesSection = new UsernamesSection({\n peerId: this.chatId.toPeerId(true),\n peer: chat as Chat.channel,\n listenerSetter: this.listenerSetter,\n usernameInputField: linkInputField,\n middleware: this.middlewareHelper.get()\n });\n\n const publicContainer = document.createElement('div');\n publicContainer.append(publicSection.container, usernamesSection.container);\n\n const originalValue = placeholder + (getPeerEditableUsername(chat as Chat.channel) || '');\n\n inputWrapper.append(linkInputField.container)\n publicSection.content.append(inputWrapper);\n\n const applyBtn = ButtonCorner({icon: 'check', className: 'is-visible'});\n this.content.append(applyBtn);\n\n attachClickEvent(applyBtn, async() => {\n const username = publicRow.radioField.checked ? linkInputField.getValue() : '';\n if(!username) {\n const chat = await this.managers.appChatsManager.getChat(this.chatId);\n const wasUsername = getPeerEditableUsername(chat as Chat.channel);\n if(wasUsername) {\n await confirmationPopup({\n descriptionLangKey: isBroadcast ? 'ChannelVisibility.Confirm.MakePrivate.Channel' : 'ChannelVisibility.Confirm.MakePrivate.Group',\n descriptionLangArgs: [wasUsername],\n button: {\n langKey: 'OK'\n }\n });\n }\n }\n\n /* const unsetLoader = */setButtonLoader(applyBtn);\n this.managers.appChatsManager.migrateChat(this.chatId).then((channelId) => {\n if(!username) {\n return this.managers.appChatsManager.makeChannelPrivate(channelId);\n } else {\n return this.managers.appChatsManager.updateUsername(channelId, username);\n }\n }).then(() => {\n // unsetLoader();\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n\n (originalValue !== placeholder || getPeerActiveUsernames(chat as Chat.channel).length ? publicRow : privateRow).radioField.checked = true;\n linkInputField.setOriginalValue(originalValue, true);\n\n this.scrollable.append(section.container, privateSection.container, publicContainer);\n\n {\n const section = new SettingSection({\n name: 'SavingContentTitle',\n caption: isBroadcast ? 'RestrictSavingContentInfoChannel' : 'RestrictSavingContentInfoGroup'\n });\n\n const checkboxField = new CheckboxField({\n text: 'RestrictSavingContent',\n withRipple: true\n });\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n const toggle = checkboxField.toggleDisability(true);\n this.managers.appChatsManager.toggleNoForwards(this.chatId, checkboxField.checked).then(() => {\n toggle();\n });\n });\n\n const onChatUpdate = () => {\n checkboxField.setValueSilently(!!(chat as Chat.channel).pFlags.noforwards);\n };\n\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\n if(this.chatId === chatId) {\n onChatUpdate();\n }\n });\n\n onChatUpdate();\n\n section.content.append(checkboxField.label);\n\n this.scrollable.append(section.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {ChannelParticipant} from '../../../layer';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport Button from '../../button';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\nimport {ChatPermissions} from './groupPermissions';\n\nexport default class AppUserPermissionsTab extends SliderSuperTabEventable {\n public participant: ChannelParticipant;\n public chatId: ChatId;\n public userId: UserId;\n\n public async init() {\n this.container.classList.add('edit-peer-container', 'user-permissions-container');\n this.setTitle('UserRestrictions');\n\n let destroyListener: () => void;\n\n {\n const section = new SettingSection({\n name: 'UserRestrictionsCanDo'\n });\n\n const div = document.createElement('div');\n div.classList.add('chatlist-container');\n section.content.insertBefore(div, section.title);\n\n const list = appDialogsManager.createChatList({new: true});\n div.append(list);\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: this.userId.toPeerId(false),\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger'\n });\n\n dom.lastMessageSpan.append(getUserStatusString(await this.managers.appUsersManager.getUser(this.userId)));\n\n const p = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n participant: this.participant._ === 'channelParticipantBanned' ? this.participant : undefined\n }, this.managers);\n\n destroyListener = () => {\n // appChatsManager.editChatDefaultBannedRights(this.chatId, p.takeOut());\n const rights = p.takeOut();\n if(this.participant._ === 'channelParticipantBanned' && deepEqual(this.participant.banned_rights.pFlags, rights.pFlags)) {\n return;\n }\n\n this.managers.appChatsManager.editBanned(this.chatId, this.participant, rights);\n };\n\n this.eventListener.addEventListener('destroy', destroyListener, {once: true});\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({});\n\n if(this.participant._ === 'channelParticipantBanned') {\n const btnDeleteException = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'GroupPermission.Delete'});\n\n attachClickEvent(btnDeleteException, () => {\n const toggle = toggleDisability([btnDeleteException], true);\n this.managers.appChatsManager.clearChannelParticipantBannedRights(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDeleteException);\n }\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'deleteuser', text: 'UserRestrictionsBlock'});\n\n attachClickEvent(btnDelete, () => {\n const toggle = toggleDisability([btnDelete], true);\n this.managers.appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n });\n /* new PopupPeer('popup-group-kick-user', {\n peerId: -this.chatId,\n title: 'Ban User?',\n description: `Are you sure you want to ban ${appPeersManager.getPeerTitle(this.userId)}`,\n buttons: addCancelButton([{\n text: 'BAN',\n callback: () => {\n const toggle = toggleDisability([btnDelete], true);\n\n appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n },\n isDanger: true\n }])\n }).show(); */\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpTag from '../../../helpers/dom/findUpTag';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport ListenerSetter from '../../../helpers/listenerSetter';\nimport ScrollableLoader from '../../../helpers/scrollableLoader';\nimport {ChannelParticipant, Chat, ChatBannedRights, Update} from '../../../layer';\nimport {ChatRights} from '../../../lib/appManagers/appChatsManager';\nimport appDialogsManager, {DialogDom, DIALOG_LIST_ELEMENT_TAG} from '../../../lib/appManagers/appDialogsManager';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport combineParticipantBannedRights from '../../../lib/appManagers/utils/chats/combineParticipantBannedRights';\nimport hasRights from '../../../lib/appManagers/utils/chats/hasRights';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport I18n, {i18n, join, LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport CheckboxField from '../../checkboxField';\nimport PopupPickUser from '../../popups/pickUser';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport {toast} from '../../toast';\nimport AppUserPermissionsTab from './userPermissions';\n\nexport class ChatPermissions {\n public v: Array<{\n flags: ChatRights[],\n text: LangPackKey,\n exceptionText: LangPackKey,\n checkboxField?: CheckboxField,\n }>;\n private toggleWith: Partial<{[chatRight in ChatRights]: ChatRights[]}>;\n\n constructor(private options: {\n chatId: ChatId,\n listenerSetter: ListenerSetter,\n appendTo: HTMLElement,\n participant?: ChannelParticipant.channelParticipantBanned\n }, private managers: AppManagers) {\n this.construct();\n }\n\n public async construct() {\n this.v = [\n {flags: ['send_messages'], text: 'UserRestrictionsSend', exceptionText: 'UserRestrictionsNoSend'},\n {flags: ['send_media'], text: 'UserRestrictionsSendMedia', exceptionText: 'UserRestrictionsNoSendMedia'},\n {flags: ['send_stickers', 'send_gifs'], text: 'UserRestrictionsSendStickers', exceptionText: 'UserRestrictionsNoSendStickers'},\n {flags: ['send_polls'], text: 'UserRestrictionsSendPolls', exceptionText: 'UserRestrictionsNoSendPolls'},\n {flags: ['embed_links'], text: 'UserRestrictionsEmbedLinks', exceptionText: 'UserRestrictionsNoEmbedLinks'},\n {flags: ['invite_users'], text: 'UserRestrictionsInviteUsers', exceptionText: 'UserRestrictionsNoInviteUsers'},\n {flags: ['pin_messages'], text: 'UserRestrictionsPinMessages', exceptionText: 'UserRestrictionsNoPinMessages'},\n {flags: ['change_info'], text: 'UserRestrictionsChangeInfo', exceptionText: 'UserRestrictionsNoChangeInfo'}\n ];\n\n this.toggleWith = {\n 'send_messages': ['send_media', 'send_stickers', 'send_polls', 'embed_links']\n };\n\n const options = this.options;\n const chat = await this.managers.appChatsManager.getChat(options.chatId) as Chat.chat | Chat.channel;\n const defaultBannedRights = chat.default_banned_rights;\n const rights = options.participant ? combineParticipantBannedRights(chat as Chat.channel, options.participant.banned_rights) : defaultBannedRights;\n\n const restrictionText: LangPackKey = options.participant ? 'UserRestrictionsDisabled' : 'EditCantEditPermissionsPublic';\n for(const info of this.v) {\n const mainFlag = info.flags[0];\n const row = CreateRowFromCheckboxField(\n info.checkboxField = new CheckboxField({\n text: info.text,\n checked: hasRights(chat, mainFlag, rights),\n restriction: true,\n listenerSetter: options.listenerSetter\n })\n );\n\n if((\n options.participant &&\n defaultBannedRights.pFlags[mainFlag as keyof typeof defaultBannedRights['pFlags']]\n ) || (\n getPeerActiveUsernames(chat as Chat.channel)[0] &&\n (\n info.flags.includes('pin_messages') ||\n info.flags.includes('change_info')\n )\n )\n ) {\n info.checkboxField.input.disabled = true;\n\n /* options.listenerSetter.add(info.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n cancelEvent(e);\n toast('This option is disabled for all members in Group Permissions.');\n info.checkboxField.checked = false;\n }); */\n\n attachClickEvent(info.checkboxField.label, (e) => {\n toast(I18n.format(restrictionText, true));\n }, {listenerSetter: options.listenerSetter});\n }\n\n if(this.toggleWith[mainFlag]) {\n options.listenerSetter.add(info.checkboxField.input)('change', () => {\n if(!info.checkboxField.checked) {\n const other = this.v.filter((i) => this.toggleWith[mainFlag].includes(i.flags[0]));\n other.forEach((info) => {\n info.checkboxField.checked = false;\n });\n }\n });\n }\n\n options.appendTo.append(row.container);\n }\n }\n\n public takeOut() {\n const rights: ChatBannedRights = {\n _: 'chatBannedRights',\n until_date: 0x7FFFFFFF,\n pFlags: {}\n };\n\n for(const info of this.v) {\n const banned = !info.checkboxField.checked;\n if(banned) {\n info.flags.forEach((flag) => {\n // @ts-ignore\n rights.pFlags[flag] = true;\n });\n }\n }\n\n return rights;\n }\n}\n\nexport default class AppGroupPermissionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n public async init() {\n this.container.classList.add('edit-peer-container', 'group-permissions-container');\n this.setTitle('ChannelPermissions');\n\n let chatPermissions: ChatPermissions;\n {\n const section = new SettingSection({\n name: 'ChannelPermissionsHeader'\n });\n\n chatPermissions = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content\n }, this.managers);\n\n this.eventListener.addEventListener('destroy', () => {\n this.managers.appChatsManager.editChatDefaultBannedRights(this.chatId, chatPermissions.takeOut());\n }, {once: true});\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({\n name: 'PrivacyExceptions'\n });\n\n const addExceptionRow = new Row({\n titleLangKey: 'ChannelAddException',\n subtitleLangKey: 'Loading',\n icon: 'adduser',\n clickable: () => {\n new PopupPickUser({\n peerTypes: ['channelParticipants'],\n onSelect: (peerId) => {\n setTimeout(() => {\n openPermissions(peerId);\n }, 0);\n },\n placeholder: 'ExceptionModal.Search.Placeholder',\n peerId: -this.chatId\n });\n },\n listenerSetter: this.listenerSetter\n });\n\n const openPermissions = async(peerId: PeerId) => {\n let participant: AppUserPermissionsTab['participant'];\n try {\n participant = await this.managers.appProfileManager.getChannelParticipant(this.chatId, peerId) as any;\n } catch(err) {\n toast('User is no longer participant');\n return;\n }\n\n const tab = this.slider.createTab(AppUserPermissionsTab);\n tab.participant = participant;\n tab.chatId = this.chatId;\n tab.userId = peerId;\n tab.open();\n };\n\n section.content.append(addExceptionRow.container);\n\n /* const removedUsersRow = new Row({\n titleLangKey: 'ChannelBlockedUsers',\n subtitleLangKey: 'NoBlockedUsers',\n icon: 'deleteuser',\n clickable: true\n });\n\n section.content.append(removedUsersRow.container); */\n\n const c = section.generateContentElement();\n c.classList.add('chatlist-container');\n\n const list = appDialogsManager.createChatList({new: true});\n c.append(list);\n\n attachClickEvent(list, (e) => {\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(!target) return;\n\n const peerId = target.dataset.peerId.toPeerId();\n openPermissions(peerId);\n }, {listenerSetter: this.listenerSetter});\n\n const setSubtitle = async(dom: DialogDom, participant: ChannelParticipant.channelParticipantBanned) => {\n const bannedRights = participant.banned_rights;// appChatsManager.combineParticipantBannedRights(this.chatId, participant.banned_rights);\n const defaultBannedRights = ((await this.managers.appChatsManager.getChat(this.chatId)) as Chat.channel).default_banned_rights;\n // const combinedRights = appChatsManager.combineParticipantBannedRights(this.chatId, bannedRights);\n\n const cantWhat: LangPackKey[] = []/* , canWhat: LangPackKey[] = [] */;\n chatPermissions.v.forEach((info) => {\n const mainFlag = info.flags[0];\n // @ts-ignore\n if(bannedRights.pFlags[mainFlag] && !defaultBannedRights.pFlags[mainFlag]) {\n cantWhat.push(info.exceptionText);\n // @ts-ignore\n }/* else if(!combinedRights.pFlags[mainFlag]) {\n canWhat.push(info.exceptionText);\n } */\n });\n\n const el = dom.lastMessageSpan as HTMLElement;\n\n if(cantWhat.length) {\n el.replaceChildren(...join(cantWhat.map((t) => i18n(t)), false));\n }/* else if(canWhat.length) {\n str = 'Can ' + canWhat.join(canWhat.length === 2 ? ' and ' : ', ');\n } */\n\n el.classList.toggle('hide', !cantWhat.length);\n };\n\n const add = (participant: ChannelParticipant.channelParticipantBanned, append: boolean) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: getPeerId(participant.peer),\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger',\n append\n });\n\n setSubtitle(dom, participant);\n\n // dom.titleSpan.innerHTML = 'Chinaza Akachi';\n // dom.lastMessageSpan.innerHTML = 'Can Add Users and Pin Messages';\n };\n\n // this.listenerSetter.add(rootScope)('updateChannelParticipant', (update: Update.updateChannelParticipant) => {\n // const needAdd = update.new_participant?._ === 'channelParticipantBanned' && !update.new_participant.banned_rights.pFlags.view_messages;\n // const li = list.querySelector(`[data-peer-id=\"${update.user_id}\"]`);\n // if(needAdd) {\n // if(!li) {\n // add(update.new_participant as ChannelParticipant.channelParticipantBanned, false);\n // } else {\n // setSubtitle(li, update.new_participant as ChannelParticipant.channelParticipantBanned);\n // }\n\n // if(update.prev_participant?._ !== 'channelParticipantBanned') {\n // ++exceptionsCount;\n // }\n // } else {\n // if(li) {\n // li.remove();\n // }\n\n // if(update.prev_participant?._ === 'channelParticipantBanned') {\n // --exceptionsCount;\n // }\n // }\n\n // setLength();\n // });\n\n const setLength = () => {\n replaceContent(addExceptionRow.subtitle, i18n(exceptionsCount ? 'Permissions.ExceptionsCount' : 'Permissions.NoExceptions', [exceptionsCount]));\n };\n\n let exceptionsCount = 0;\n let loader: ScrollableLoader;\n const setLoader = () => {\n const LOAD_COUNT = 50;\n loader = new ScrollableLoader({\n scrollable: this.scrollable,\n getPromise: () => {\n return this.managers.appProfileManager.getChannelParticipants(this.chatId, {_: 'channelParticipantsBanned', q: ''}, LOAD_COUNT, list.childElementCount).then((res) => {\n for(const participant of res.participants) {\n add(participant as ChannelParticipant.channelParticipantBanned, true);\n }\n\n exceptionsCount = res.count;\n setLength();\n\n return res.participants.length < LOAD_COUNT || res.count === list.childElementCount;\n });\n }\n });\n\n return loader.load();\n };\n\n this.scrollable.append(section.container);\n\n if(await this.managers.appChatsManager.isChannel(this.chatId)) {\n await setLoader();\n } else {\n setLength();\n\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.chatId === migrateFrom) {\n this.chatId = migrateTo;\n setLoader();\n }\n });\n }\n }\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport copy from '../../../../helpers/object/copy';\nimport {ChatBannedRights, Chat} from '../../../../layer';\n\nexport default function combineParticipantBannedRights(chat: Chat.channel, rights: ChatBannedRights) {\n if(chat.default_banned_rights) {\n rights = copy(rights);\n const defaultRights = chat.default_banned_rights.pFlags;\n for(const i in defaultRights) {\n // @ts-ignore\n rights.pFlags[i] = defaultRights[i];\n }\n }\n\n return rights;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport debounce from '../../../helpers/schedulers/debounce';\nimport {ChatReactions, Reaction} from '../../../layer';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport CheckboxField from '../../checkboxField';\nimport Row, {RadioFormFromValues} from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\n\nexport default class AppChatReactionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n public async init() {\n this.setTitle('Reactions');\n\n const availableReactions = await this.managers.appReactionsManager.getActiveAvailableReactions();\n const chatFull = await this.managers.appProfileManager.getChatFull(this.chatId);\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\n\n let _chatReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n let chatReactions = _chatReactions;\n let emoticons = new Set(_chatReactions._ === 'chatReactionsSome' ? _chatReactions.reactions.map((reaction) => (reaction as Reaction.reactionEmoji).emoticon) : []);\n\n const makeReactionFromEmoticons = (emoticons: Array): Reaction[] => emoticons.map((emoticon) => ({_: 'reactionEmoji', emoticon}));\n\n const getCaptionLangPackKey = (): LangPackKey => {\n if(isBroadcast) {\n return 'EnableReactionsChannelInfo';\n }\n\n return chatReactions._ === 'chatReactionsAll' ? 'EnableAllReactionsInfo' : (chatReactions._ === 'chatReactionsNone' ? 'DisableReactionsInfo' : 'EnableSomeReactionsInfo');\n };\n\n const toggleSection = new SettingSection({\n name: isBroadcast ? undefined : 'AvailableReactions',\n caption: getCaptionLangPackKey()\n });\n\n const reactionsSection = new SettingSection({\n name: 'OnlyAllowThisReactions'\n });\n\n const toggleCheckboxFieldsByEmoticons = () => {\n const r: Reaction.reactionEmoji[] = (chatReactions as ChatReactions.chatReactionsSome).reactions as any ?? [];\n emoticons = new Set(r.map(({emoticon}) => emoticon));\n checkboxFieldsByEmoticon.forEach((checkboxField, emoticon) => {\n checkboxField.setValueSilently(emoticons.has(emoticon));\n });\n };\n\n let toggleCheckboxField: CheckboxField;\n if(isBroadcast) {\n toggleCheckboxField = new CheckboxField({toggle: true, checked: _chatReactions._ === 'chatReactionsSome'});\n const toggleRow = new Row({\n checkboxField: toggleCheckboxField,\n titleLangKey: 'EnableReactions',\n listenerSetter: this.listenerSetter\n });\n\n toggleSection.content.append(toggleRow.container);\n\n this.listenerSetter.add(toggleCheckboxField.input)('change', () => {\n let save = true;\n if(!toggleCheckboxField.checked) {\n chatReactions = {_: 'chatReactionsNone'};\n } else if(checkboxFields.every((checkboxField) => !checkboxField.checked)) {\n chatReactions = {_: 'chatReactionsSome', reactions: makeReactionFromEmoticons(availableReactions.map(({reaction}) => reaction))};\n } else if(chatReactions._ !== 'chatReactionsSome') {\n chatReactions = {_: 'chatReactionsSome', reactions: makeReactionFromEmoticons(Array.from(emoticons))};\n } else {\n save = false;\n }\n\n if(save) {\n toggleCheckboxFieldsByEmoticons();\n saveReactionsDebounced();\n }\n });\n } else {\n const a: [ChatReactions['_'], LangPackKey][] = [\n ['chatReactionsAll', 'AllReactions'],\n ['chatReactionsSome', 'SomeReactions'],\n ['chatReactionsNone', 'NoReactions']\n ];\n\n const onChange = () => {\n reactionsSection.container.classList.toggle('hide', chatReactions._ !== 'chatReactionsSome');\n };\n\n let value = _chatReactions._;\n const form = RadioFormFromValues(a.map(([value, langPackKey]) => {\n return {\n langPackKey,\n value,\n checked: _chatReactions._ === value\n };\n }), (_value) => {\n value = _value as any;\n\n if(value === 'chatReactionsAll') {\n chatReactions = {\n _: value,\n pFlags: {\n allow_custom: true\n }\n };\n } else if(value === 'chatReactionsNone') {\n chatReactions = {\n _: value\n };\n } else {\n chatReactions = {\n _: value,\n reactions: makeReactionFromEmoticons(['👍', '👎'])\n };\n }\n\n replaceContent(toggleSection.caption, i18n(getCaptionLangPackKey()));\n toggleCheckboxFieldsByEmoticons();\n saveReactionsDebounced();\n onChange();\n });\n\n toggleSection.content.append(form);\n onChange();\n }\n\n const checkboxFieldsByEmoticon: Map = new Map();\n const checkboxFields = availableReactions.map((availableReaction) => {\n const emoticon = availableReaction.reaction;\n const checkboxField = new CheckboxField({\n toggle: true,\n checked: emoticons.has(emoticon)\n });\n\n checkboxFieldsByEmoticon.set(emoticon, checkboxField);\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n if(checkboxField.checked) {\n emoticons.add(emoticon);\n\n if(toggleCheckboxField && !toggleCheckboxField.checked) {\n toggleCheckboxField.checked = true;\n }\n } else {\n emoticons.delete(emoticon);\n\n if(toggleCheckboxField?.checked && !emoticons.size) {\n toggleCheckboxField.checked = false;\n }\n }\n\n saveReactionsDebounced();\n });\n\n const row = new Row({\n checkboxField,\n title: availableReaction.title,\n havePadding: true,\n listenerSetter: this.listenerSetter\n });\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n reactionsSection.content.append(row.container);\n\n return checkboxField;\n });\n\n const saveReactions = async() => {\n saveReactionsDebounced.clearTimeout();\n // const newReactions = Array.from(enabledReactions);\n // if([...newReactions].sort().join() === [...originalReactions].sort().join()) {\n // return;\n // }\n\n if(chatReactions._ === 'chatReactionsSome') {\n chatReactions.reactions = makeReactionFromEmoticons(Array.from(emoticons));\n }\n\n // const r = (chatReactions as ChatReactions.chatReactionsSome).reactions;\n // if(r?.length === availableReactions.length) {\n // chatReactions = {_: 'chatReactionsAll'};\n // }\n\n this.managers.appChatsManager.setChatAvailableReactions(this.chatId, chatReactions);\n _chatReactions = chatReactions;\n };\n\n const saveReactionsDebounced = debounce(saveReactions, 3000, false, true);\n\n this.eventListener.addEventListener('destroy', () => {\n if(saveReactionsDebounced.isDebounced()) {\n saveReactions();\n }\n }, {once: true});\n\n this.scrollable.append(toggleSection.container, reactionsSection.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider'\nimport InputField from '../../inputField';\nimport EditPeer from '../../editPeer';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport Button from '../../button';\nimport {ChatRights} from '../../../lib/appManagers/appChatsManager';\nimport {Chat, ChatFull} from '../../../layer';\nimport AppChatTypeTab from './chatType';\nimport rootScope from '../../../lib/rootScope';\nimport AppGroupPermissionsTab from './groupPermissions';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport PopupDeleteDialog from '../../popups/deleteDialog';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport CheckboxField from '../../checkboxField';\nimport AppChatReactionsTab from './chatReactions';\nimport hasRights from '../../../lib/appManagers/utils/chats/hasRights';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport SettingSection from '../../settingSection';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\n\nexport default class AppEditChatTab extends SliderSuperTab {\n private chatNameInputField: InputField;\n private descriptionInputField: InputField;\n private editPeer: EditPeer;\n public chatId: ChatId;\n\n protected async _init() {\n // * cleanup prev\n this.listenerSetter.removeAll();\n this.scrollable.container.replaceChildren();\n\n this.container.classList.add('edit-peer-container', 'edit-group-container');\n this.setTitle('Edit');\n\n let [\n chatFull,\n chat,\n isBroadcast,\n isChannel,\n canChangeType,\n canChangePermissions,\n canManageTopics,\n appConfig\n ] = await Promise.all([\n this.managers.appProfileManager.getChatFull(this.chatId, true),\n this.managers.appChatsManager.getChat(this.chatId) as Promise,\n this.managers.appChatsManager.isBroadcast(this.chatId),\n this.managers.appChatsManager.isChannel(this.chatId),\n this.managers.appChatsManager.hasRights(this.chatId, 'change_type'),\n this.managers.appChatsManager.hasRights(this.chatId, 'change_permissions'),\n this.managers.appChatsManager.hasRights(this.chatId, 'manage_topics'),\n this.managers.apiManager.getAppConfig()\n ]);\n\n const chatUpdateListeners: {[type in 'full' | 'basic']: (() => void)[]} = {full: [], basic: []};\n const addChatUpdateListener = (callback: () => void, type: 'full' | 'basic' = 'basic') => {\n chatUpdateListeners[type].push(callback);\n };\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.chatId === chatId) {\n chat = await this.managers.appChatsManager.getChat(this.chatId) as typeof chat;\n chatUpdateListeners['basic'].forEach((callback) => callback());\n }\n });\n\n this.listenerSetter.add(rootScope)('chat_full_update', async(chatId) => {\n if(this.chatId === chatId) {\n chatFull = await this.managers.appProfileManager.getCachedFullChat(chatId) || chatFull;\n chatUpdateListeners['full'].forEach((callback) => callback());\n }\n });\n\n const peerId = this.chatId.toPeerId(true);\n\n {\n const section = new SettingSection({noDelimiter: true, caption: true});\n const inputFields: InputField[] = [];\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.chatNameInputField = new InputField({\n label: isBroadcast ? 'EnterChannelName' : 'CreateGroup.NameHolder',\n name: 'chat-name',\n maxLength: 255,\n required: true\n });\n this.descriptionInputField = new InputField({\n label: 'DescriptionPlaceholder',\n name: 'chat-description',\n maxLength: 255\n });\n\n this.chatNameInputField.setOriginalValue(chat.title);\n this.descriptionInputField.setOriginalValue(chatFull.about);\n\n inputWrapper.append(this.chatNameInputField.container, this.descriptionInputField.container);\n\n inputFields.push(this.chatNameInputField, this.descriptionInputField);\n\n this.editPeer = new EditPeer({\n peerId,\n inputFields,\n listenerSetter: this.listenerSetter,\n popupOptions: {isForum: (chat as Chat.channel).pFlags.forum}\n });\n this.content.append(this.editPeer.nextBtn);\n\n section.content.append(this.editPeer.avatarEdit.container, inputWrapper);\n\n if(canChangeType) {\n const chatTypeRow = new Row({\n titleLangKey: isBroadcast ? 'ChannelType' : 'GroupType',\n clickable: () => {\n const tab = this.slider.createTab(AppChatTypeTab);\n tab.chatId = this.chatId;\n tab.chatFull = chatFull;\n tab.open();\n },\n icon: 'lock',\n listenerSetter: this.listenerSetter\n });\n\n const setChatTypeSubtitle = () => {\n let key: LangPackKey;\n const username = getPeerActiveUsernames(chat as Chat.channel)[0];\n if(isBroadcast) {\n key = username ? 'TypePublic' : 'TypePrivate';\n } else {\n key = username ? 'TypePublicGroup' : 'TypePrivateGroup';\n }\n\n chatTypeRow.subtitle.replaceChildren(i18n(key));\n };\n\n setChatTypeSubtitle();\n addChatUpdateListener(setChatTypeSubtitle);\n section.content.append(chatTypeRow.container);\n }\n\n if(canChangeType || canChangePermissions) {\n const reactionsRow = new Row({\n titleLangKey: 'Reactions',\n icon: 'reactions',\n clickable: () => {\n const tab = this.slider.createTab(AppChatReactionsTab);\n tab.chatId = this.chatId;\n tab.open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const availableReactions = await this.managers.appReactionsManager.getAvailableReactions();\n const availableReactionsLength = availableReactions.filter((availableReaction) => !availableReaction.pFlags.inactive).length;\n const setReactionsLength = () => {\n const chatAvailableReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n if(chatAvailableReactions._ === 'chatReactionsSome') {\n const length = chatAvailableReactions.reactions.length;\n if(length === availableReactionsLength) {\n replaceContent(reactionsRow.subtitle, i18n('ReactionsAll'));\n } else {\n reactionsRow.subtitle.textContent = length + '/' + availableReactionsLength;\n }\n } else {\n replaceContent(reactionsRow.subtitle, i18n(chatAvailableReactions._ === 'chatReactionsAll' ? 'ReactionsAll' : 'Checkbox.Disabled'));\n }\n };\n\n setReactionsLength();\n addChatUpdateListener(setReactionsLength, 'full');\n section.content.append(reactionsRow.container);\n }\n\n if(canChangePermissions && !isBroadcast) {\n const flags = [\n 'send_messages',\n 'send_media',\n 'send_stickers',\n 'send_polls',\n 'embed_links',\n 'invite_users',\n 'pin_messages',\n 'change_info'\n ] as ChatRights[];\n\n const permissionsRow = new Row({\n titleLangKey: 'ChannelPermissions',\n clickable: () => {\n const tab = this.slider.createTab(AppGroupPermissionsTab);\n tab.chatId = this.chatId;\n tab.open();\n },\n icon: 'permissions',\n listenerSetter: this.listenerSetter\n });\n\n const setPermissionsLength = () => {\n permissionsRow.subtitle.textContent = flags.reduce((acc, f) => acc + +hasRights(chat, f, (chat as Chat.chat).default_banned_rights), 0) + '/' + flags.length;\n };\n\n setPermissionsLength();\n addChatUpdateListener(setPermissionsLength);\n section.content.append(permissionsRow.container);\n }\n\n if(canManageTopics && (chat.participants_count >= appConfig.forum_upgrade_participants_min || (chat as Chat.channel).pFlags.forum) && !isBroadcast) {\n const topicsRow = new Row({\n checkboxField: new CheckboxField({toggle: true}),\n titleLangKey: 'Topics',\n clickable: () => {},\n icon: 'topics',\n listenerSetter: this.listenerSetter\n });\n\n const setTopics = () => {\n const isForum = !!(chat as Chat.channel).pFlags.forum;\n this.editPeer.avatarElem.parentElement.classList.toggle('is-forum', isForum);\n topicsRow.checkboxField.setValueSilently(isForum);\n };\n\n this.listenerSetter.add(topicsRow.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n const promise = this.managers.appChatsManager.toggleForum(this.chatId, topicsRow.checkboxField.checked);\n topicsRow.disableWithPromise(promise);\n });\n\n setTopics();\n addChatUpdateListener(setTopics);\n\n section.caption.replaceChildren(i18n('ForumToggleDescription'));\n section.content.append(topicsRow.container);\n }\n\n section.caption.classList.toggle('hide', !section.caption.childElementCount);\n\n /* const administratorsRow = new Row({\n titleLangKey: 'PeerInfo.Administrators',\n subtitle: '' + ((chatFull as ChatFull.channelFull).admins_count || 1),\n icon: 'admin',\n clickable: true\n });\n\n section.content.append(administratorsRow.container); */\n\n this.scrollable.append(section.container);\n\n attachClickEvent(this.editPeer.nextBtn, () => {\n this.editPeer.nextBtn.disabled = true;\n\n const promises: Promise[] = [];\n\n const id = this.chatId;\n if(this.chatNameInputField.isValidToChange()) {\n promises.push(this.managers.appChatsManager.editTitle(id, this.chatNameInputField.value));\n }\n\n if(this.descriptionInputField.isValidToChange()) {\n promises.push(this.managers.appChatsManager.editAbout(id, this.descriptionInputField.value));\n }\n\n if(this.editPeer.uploadAvatar) {\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\n return this.managers.appChatsManager.editPhoto(id, inputFile);\n }));\n }\n\n Promise.race(promises).finally(() => {\n this.editPeer.nextBtn.removeAttribute('disabled');\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n\n\n /* if(appChatsManager.hasRights(-this.peerId, 'change_info')) {\n const discussionRow = new Row({\n titleLangKey: 'PeerInfo.Discussion',\n subtitleLangKey: 'PeerInfo.Discussion.Add',\n clickable: true,\n icon: 'message'\n });\n\n section.content.append(discussionRow.container);\n }\n\n const administratorsRow = new Row({\n titleLangKey: 'PeerInfo.Administrators',\n subtitle: '' + chatFull.admins_count,\n icon: 'admin',\n clickable: true\n });\n\n section.content.append(administratorsRow.container); */\n\n if(isBroadcast && await this.managers.appChatsManager.hasRights(this.chatId, 'change_info')) {\n const signMessagesCheckboxField = new CheckboxField({\n text: 'ChannelSignMessages',\n checked: !!(chat as Chat.channel).pFlags.signatures\n });\n\n this.listenerSetter.add(signMessagesCheckboxField.input)('change', () => {\n const toggle = signMessagesCheckboxField.toggleDisability(true);\n this.managers.appChatsManager.toggleSignatures(this.chatId, signMessagesCheckboxField.checked).then(() => {\n toggle();\n });\n });\n\n addChatUpdateListener(() => {\n signMessagesCheckboxField.setValueSilently(!!(chat as Chat.channel).pFlags.signatures);\n });\n\n section.content.append(CreateRowFromCheckboxField(signMessagesCheckboxField).container);\n }\n }\n\n if(!isBroadcast) {\n const section = new SettingSection({\n\n });\n\n /* const membersRow = new Row({\n titleLangKey: isBroadcast ? 'PeerInfo.Subscribers' : 'GroupMembers',\n icon: 'newgroup',\n clickable: true\n });\n\n membersRow.subtitle.append(i18n('Subscribers', [numberThousandSplitter(335356)]));\n\n section.content.append(membersRow.container); */\n\n if(!isBroadcast && canChangeType) {\n const showChatHistoryCheckboxField = new CheckboxField({\n text: 'ChatHistory'\n });\n\n this.listenerSetter.add(showChatHistoryCheckboxField.input)('change', () => {\n const toggle = showChatHistoryCheckboxField.toggleDisability(true);\n this.managers.appChatsManager.togglePreHistoryHidden(this.chatId, !showChatHistoryCheckboxField.checked).then(() => {\n toggle();\n });\n });\n\n // ! it won't be updated because chatFull will be old\n const onChatUpdate = () => {\n showChatHistoryCheckboxField.setValueSilently(isChannel && !(chatFull as ChatFull.channelFull).pFlags.hidden_prehistory);\n };\n\n onChatUpdate();\n addChatUpdateListener(onChatUpdate);\n\n section.content.append(CreateRowFromCheckboxField(showChatHistoryCheckboxField).container);\n }\n\n if(section.content.childElementCount) {\n this.scrollable.append(section.container);\n }\n }\n\n if(await this.managers.appChatsManager.hasRights(this.chatId, 'delete_chat')) {\n const section = new SettingSection({});\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: isBroadcast ? 'PeerInfo.DeleteChannel' : 'DeleteAndExitButton'});\n\n attachClickEvent(btnDelete, () => {\n new PopupDeleteDialog(peerId/* , 'delete' */, undefined, (promise) => {\n const toggle = toggleDisability([btnDelete], true);\n promise.then(() => {\n this.close();\n }, () => {\n toggle();\n });\n });\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n }\n\n if(!isChannel) {\n // ! this one will fire earlier than tab's closeAfterTimeout (destroy) event and listeners will be erased, so destroy won't fire\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(peerId === migrateFrom) {\n this.chatId = migrateTo.toChatId();\n this._init();\n }\n });\n }\n }\n\n public init() {\n return this._init();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../../lib/rootScope';\nimport AppSearchSuper, {SearchSuperType} from '../../appSearchSuper.';\nimport SidebarSlider, {SliderSuperTab} from '../../slider';\nimport TransitionSlider from '../../transition';\nimport AppEditChatTab from './editChat';\nimport PeerTitle from '../../peerTitle';\nimport AppEditContactTab from './editContact';\nimport Button from '../../button';\nimport ButtonIcon from '../../buttonIcon';\nimport I18n, {i18n, LangPackKey} from '../../../lib/langPack';\nimport {toastNew} from '../../toast';\nimport AppAddMembersTab from '../../sidebarLeft/tabs/addMembers';\nimport PopupPickUser from '../../popups/pickUser';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerCheckboxOptions} from '../../popups/peer';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport PeerProfile from '../../peerProfile';\nimport {Message} from '../../../layer';\nimport getMessageThreadId from '../../../lib/appManagers/utils/messages/getMessageThreadId';\nimport AppEditTopicTab from './editTopic';\n\ntype SharedMediaHistoryStorage = Partial<{\n [type in SearchSuperType]: {mid: number, peerId: PeerId}[]\n}>;\n\nconst historiesStorage: {\n [peerId: PeerId]: {\n [threadId: number]: SharedMediaHistoryStorage\n }\n} = {};\n\n// TODO: отредактированное сообщение не изменится\nexport default class AppSharedMediaTab extends SliderSuperTab {\n private editBtn: HTMLElement;\n\n private peerId: PeerId;\n private threadId: number;\n\n private searchSuper: AppSearchSuper;\n\n private profile: PeerProfile;\n private peerChanged: boolean;\n\n private titleI18n: I18n.IntlElement;\n\n public isFirst: boolean;\n\n public init() {\n // const perf = performance.now();\n\n this.container.classList.add('shared-media-container', 'profile-container');\n\n // * header\n const newCloseBtn = Button('btn-icon sidebar-close-button', {noRipple: true});\n this.closeBtn.replaceWith(newCloseBtn);\n this.closeBtn = newCloseBtn;\n\n const animatedCloseIcon = document.createElement('div');\n animatedCloseIcon.classList.add('animated-close-icon');\n newCloseBtn.append(animatedCloseIcon);\n\n if(this.isFirst) {\n animatedCloseIcon.classList.add('state-back');\n }\n\n const transitionContainer = document.createElement('div');\n transitionContainer.className = 'transition slide-fade';\n\n const transitionFirstItem = document.createElement('div');\n transitionFirstItem.classList.add('transition-item');\n\n this.titleI18n = new I18n.IntlElement();\n this.title.append(this.titleI18n.element);\n this.editBtn = ButtonIcon('edit');\n // const moreBtn = ButtonIcon('more');\n\n transitionFirstItem.append(this.title, this.editBtn/* , moreBtn */);\n\n const transitionLastItem = document.createElement('div');\n transitionLastItem.classList.add('transition-item');\n\n const secondTitle: HTMLElement = this.title.cloneNode() as any;\n secondTitle.append(i18n('PeerInfo.SharedMedia'));\n\n transitionLastItem.append(secondTitle);\n\n transitionContainer.append(transitionFirstItem, transitionLastItem);\n\n this.header.append(transitionContainer);\n\n // * body\n\n this.profile = new PeerProfile(this.managers, this.scrollable, this.listenerSetter);\n this.profile.init();\n\n this.scrollable.append(this.profile.element);\n\n const HEADER_HEIGHT = 56;\n this.scrollable.onAdditionalScroll = () => {\n const rect = this.searchSuper.nav.getBoundingClientRect();\n if(!rect.width) return;\n\n const top = rect.top - 1;\n setIsSharedMedia(top <= HEADER_HEIGHT);\n };\n\n const setIsSharedMedia = (isSharedMedia: boolean) => {\n animatedCloseIcon.classList.toggle('state-back', this.isFirst || isSharedMedia);\n this.searchSuper.container.classList.toggle('is-full-viewport', isSharedMedia);\n transition(+isSharedMedia);\n\n if(!isSharedMedia) {\n this.searchSuper.cleanScrollPositions();\n }\n };\n\n const transition = TransitionSlider({\n content: transitionContainer,\n type: 'slide-fade',\n transitionTime: 400,\n isHeavy: false\n });\n\n transition(0);\n\n attachClickEvent(this.closeBtn, (e) => {\n if(transition.prevId()) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement,\n position: 'start'\n });\n transition(0);\n\n if(!this.isFirst) {\n animatedCloseIcon.classList.remove('state-back');\n }\n } else if(!this.scrollable.isHeavyAnimationInProgress) {\n this.slider.onCloseBtnClick();\n }\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.editBtn, async() => {\n let tab: AppEditChatTab | AppEditContactTab | AppEditTopicTab;\n const {peerId, threadId} = this;\n if(threadId && await this.managers.appPeersManager.isForum(peerId)) {\n tab = this.slider.createTab(AppEditTopicTab)\n } else if(peerId.isAnyChat()) {\n tab = this.slider.createTab(AppEditChatTab);\n } else {\n tab = this.slider.createTab(AppEditContactTab);\n }\n\n if(tab) {\n if(tab instanceof AppEditTopicTab) {\n tab.open(peerId, this.threadId);\n } else {\n if(tab instanceof AppEditChatTab) {\n tab.chatId = peerId.toChatId();\n } else {\n tab.peerId = peerId;\n }\n\n tab.open();\n }\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('contacts_update', (userId) => {\n if(this.peerId === userId) {\n this.toggleEditBtn();\n }\n });\n\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n this.toggleEditBtn();\n }\n });\n\n this.listenerSetter.add(rootScope)('history_multiappend', (message) => {\n this.renderNewMessage(message);\n });\n\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\n this.deleteDeletedMessages(peerId, Array.from(msgs));\n });\n\n // Calls when message successfully sent and we have an id\n this.listenerSetter.add(rootScope)('message_sent', ({message}) => {\n this.renderNewMessage(message);\n });\n\n // this.container.prepend(this.closeBtn.parentElement);\n\n this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'PeerMedia.Members',\n type: 'members'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }],\n scrollable: this.scrollable,\n onChangeTab: (mediaTab) => {\n const timeout = mediaTab.type === 'members' && rootScope.settings.animationsEnabled ? 250 : 0;\n setTimeout(() => {\n btnAddMembers.classList.toggle('is-hidden', mediaTab.type !== 'members');\n }, timeout);\n },\n managers: this.managers\n });\n\n this.searchSuper.scrollStartCallback = () => {\n setIsSharedMedia(true);\n };\n\n this.profile.element.append(this.searchSuper.container);\n\n const btnAddMembers = ButtonCorner({icon: 'addmember_filled'});\n this.content.append(btnAddMembers);\n\n attachClickEvent(btnAddMembers, async() => {\n const peerId = this.peerId;\n const id = this.peerId.toChatId();\n const isChannel = await this.managers.appChatsManager.isChannel(id);\n\n const showConfirmation = (peerIds: PeerId[], callback: (checked: PopupPeerButtonCallbackCheckboxes) => void) => {\n let titleLangKey: LangPackKey, titleLangArgs: any[],\n descriptionLangKey: LangPackKey, descriptionLangArgs: any[],\n checkboxes: PopupPeerCheckboxOptions[];\n\n if(peerIds.length > 1) {\n titleLangKey = 'AddMembersAlertTitle';\n titleLangArgs = [i18n('Members', [peerIds.length])];\n descriptionLangKey = 'AddMembersAlertCountText';\n descriptionLangArgs = peerIds.map((peerId) => {\n const b = document.createElement('b');\n b.append(new PeerTitle({peerId}).element);\n return b;\n });\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddMembersForwardMessages',\n checked: true\n }];\n }\n } else {\n titleLangKey = 'AddOneMemberAlertTitle';\n descriptionLangKey = 'AddMembersAlertNamesText';\n const b = document.createElement('b');\n b.append(new PeerTitle({\n peerId: peerIds[0]\n }).element);\n descriptionLangArgs = [b];\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddOneMemberForwardMessages',\n textArgs: [new PeerTitle({peerId: peerIds[0]}).element],\n checked: true\n }];\n }\n }\n\n descriptionLangArgs.push(new PeerTitle({\n peerId\n }).element);\n\n new PopupPeer('popup-add-members', {\n peerId,\n titleLangKey,\n descriptionLangKey,\n descriptionLangArgs,\n buttons: [{\n langKey: 'Add',\n callback\n }],\n checkboxes\n }).show();\n };\n\n const onError = (err: any) => {\n if(err.type === 'USER_PRIVACY_RESTRICTED') {\n toastNew({langPackKey: 'InviteToGroupError'});\n }\n };\n\n if(isChannel) {\n const tab = this.slider.createTab(AppAddMembersTab);\n tab.open({\n type: 'channel',\n skippable: false,\n takeOut: (peerIds) => {\n showConfirmation(peerIds, () => {\n const promise = this.managers.appChatsManager.inviteToChannel(id, peerIds);\n promise.catch(onError);\n tab.attachToPromise(promise);\n });\n\n return false;\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n } else {\n new PopupPickUser({\n peerTypes: ['contacts'],\n placeholder: 'Search',\n onSelect: (peerId) => {\n setTimeout(() => {\n showConfirmation([peerId], (checked) => {\n this.managers.appChatsManager.addChatUser(id, peerId, checked.size ? undefined : 0)\n .catch(onError);\n });\n }, 0);\n }\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n // console.log('construct shared media time:', performance.now() - perf);\n }\n\n private _renderNewMessage(message: Message.message | Message.messageService, threadId?: number) {\n const historyStorage = historiesStorage[message.peerId]?.[threadId];\n if(!historyStorage) return;\n\n for(const mediaTab of this.searchSuper.mediaTabs) {\n const inputFilter = mediaTab.inputFilter;\n const history = historyStorage[inputFilter];\n if(!history) {\n continue;\n }\n\n const filtered = this.searchSuper.filterMessagesByType([message], inputFilter)\n .filter((message) => !history.find((m) => m.mid === message.mid && m.peerId === message.peerId));\n if(filtered.length) {\n history.unshift(...filtered.map((message) => ({mid: message.mid, peerId: message.peerId})));\n\n if(this.peerId === message.peerId && this.searchSuper.usedFromHistory[inputFilter] !== -1) {\n this.searchSuper.usedFromHistory[inputFilter] += filtered.length;\n this.searchSuper.performSearchResult(filtered, mediaTab, false);\n }\n }\n }\n }\n\n private async renderNewMessage(message: Message.message | Message.messageService) {\n if(this.init) return; // * not inited yet\n\n const {peerId} = message;\n const isForum = await this.managers.appPeersManager.isForum(peerId);\n const threadId = getMessageThreadId(message, isForum);\n\n this._renderNewMessage(message);\n if(threadId) {\n this._renderNewMessage(message, threadId);\n }\n }\n\n public _deleteDeletedMessages(historyStorage: SharedMediaHistoryStorage, peerId: PeerId, mids: number[]) {\n for(const mid of mids) {\n for(const type of this.searchSuper.mediaTabs) {\n const inputFilter = type.inputFilter;\n\n const history = historyStorage[inputFilter];\n if(!history) continue;\n\n const idx = history.findIndex((m) => m.mid === mid);\n if(idx === -1) {\n continue;\n }\n\n history.splice(idx, 1);\n\n if(this.peerId === peerId) {\n const container = this.searchSuper.tabs[inputFilter];\n const div = container.querySelector(`[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`) as HTMLElement;\n if(div) {\n if(this.searchSuper.selection.isSelecting) {\n this.searchSuper.selection.toggleByElement(div);\n }\n\n div.remove();\n }\n\n if(this.searchSuper.usedFromHistory[inputFilter] >= (idx + 1)) {\n --this.searchSuper.usedFromHistory[inputFilter];\n }\n }\n\n // can have element in different tabs somehow\n // break;\n }\n }\n }\n\n public deleteDeletedMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n const h = historiesStorage[peerId];\n if(!h) return;\n\n for(const threadId in h) {\n this._deleteDeletedMessages(h[threadId], peerId, mids);\n }\n\n this.scrollable.onScroll();\n }\n\n private async cleanupHTML() {\n // const perf = performance.now();\n const isAnyChat = this.peerId.isAnyChat();\n const [canViewMembers, hasRights] = await Promise.all([\n isAnyChat ? this.searchSuper.canViewMembers() : false,\n isAnyChat ? this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users') : false\n ]);\n\n return () => {\n this.profile.cleanupHTML();\n this.editBtn.classList.add('hide');\n this.searchSuper.cleanupHTML(true);\n this.container.classList.toggle('can-add-members', canViewMembers && hasRights);\n };\n // console.log('cleanupHTML shared media time:', performance.now() - perf);\n }\n\n public setLoadMutex(promise: Promise) {\n this.searchSuper.loadMutex = promise;\n }\n\n public setPeer(peerId: PeerId, threadId?: number) {\n if(this.peerId === peerId && this.threadId === threadId) return false;\n\n this.peerId = peerId;\n this.threadId = threadId;\n this.peerChanged = true;\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.searchSuper.setQuery({\n peerId,\n threadId,\n historyStorage: (historiesStorage[peerId] ??= {})[threadId] ??= {}\n });\n\n this.profile.setPeer(peerId, threadId);\n\n return true;\n }\n\n private async changeTitleKey() {\n const isForum = this.managers.appPeersManager.isForum(this.peerId);\n\n return () => {\n this.titleI18n.compareAndUpdate({key: this.threadId && isForum ? 'AccDescrTopic' : 'Profile'});\n };\n }\n\n public async fillProfileElements() {\n if(!this.peerChanged) {\n return;\n }\n\n this.peerChanged = false;\n const callbacks = await Promise.all([\n this.cleanupHTML(),\n this.toggleEditBtn(true),\n this.profile.fillProfileElements(),\n this.changeTitleKey()\n ]);\n\n return () => {\n callbacks.forEach((callback) => {\n callback?.();\n });\n };\n }\n\n private async toggleEditBtn(manual?: T): Promise void : void> {\n let show: boolean;\n if(this.peerId.isUser()) {\n show = this.peerId !== rootScope.myId && await this.managers.appUsersManager.isContact(this.peerId.toUserId());\n } else {\n const chatId = this.peerId.toChatId();\n const isTopic = this.threadId && await this.managers.appChatsManager.isForum(chatId);\n show = await this.managers.appChatsManager.hasRights(chatId, isTopic ? 'manage_topics' : 'change_info');\n }\n\n const callback = () => {\n this.editBtn.classList.toggle('hide', !show);\n };\n\n return manual ? callback : callback() as any;\n }\n\n public loadSidebarMedia(single: boolean, justLoad?: boolean) {\n this.searchSuper.load(single, justLoad);\n }\n\n onOpenAfterTimeout() {\n super.onOpenAfterTimeout();\n\n this.scrollable.onScroll();\n }\n\n onCloseAfterTimeout() {\n super.onCloseAfterTimeout();\n\n if(this.destroyable) {\n this.profile.destroy();\n this.searchSuper.destroy();\n }\n }\n\n public destroy() {\n this.destroyable = true;\n this.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\n\ntype SetTransitionOptions = {\n element: HTMLElement,\n className: string,\n forwards: boolean,\n duration: number,\n onTransitionEnd?: () => void,\n useRafs?: number,\n onTransitionStart?: () => void\n};\nconst SetTransition = (options: SetTransitionOptions) => {\n const {element, className, forwards, duration, onTransitionEnd, onTransitionStart, useRafs} = options;\n const {timeout, raf} = element.dataset;\n if(timeout !== undefined) {\n clearTimeout(+timeout);\n }\n\n // useRafs = undefined;\n // duration = 0;\n\n if(raf !== undefined) {\n window.cancelAnimationFrame(+raf);\n if(!useRafs) {\n delete element.dataset.raf;\n }\n }\n\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\n // return;\n // }\n\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\n delete element.dataset.raf;\n SetTransition({\n ...options,\n useRafs: useRafs - 1\n });\n });\n\n return;\n }\n\n if(forwards && className) {\n element.classList.add(className);\n }\n\n const afterTimeout = () => {\n delete element.dataset.timeout;\n if(!forwards && className) {\n element.classList.remove('backwards', className);\n }\n\n element.classList.remove('animating');\n\n onTransitionEnd?.();\n };\n\n onTransitionStart?.();\n if(!rootScope.settings.animationsEnabled || !duration) {\n element.classList.remove('animating', 'backwards');\n afterTimeout();\n return;\n }\n\n element.classList.add('animating');\n\n element.classList.toggle('backwards', !forwards);\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\n};\n\nexport default SetTransition;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {horizontalMenu} from './horizontalMenu';\nimport TransitionSlider from './transition';\nimport appNavigationController, {NavigationItem} from './appNavigationController';\nimport SliderSuperTab, {SliderSuperTabConstructable} from './sliderTab';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\nimport {MaybePromise} from '../types';\n\nconst TRANSITION_TIME = 250;\n\nexport {SliderSuperTab};\n\nexport default class SidebarSlider {\n protected _selectTab: ReturnType;\n protected historyTabIds: (number | SliderSuperTab)[] = []; // * key is any, since right sidebar is ugly nowz\n protected tabsContainer: HTMLElement;\n public sidebarEl: HTMLElement;\n protected tabs: Map; // * key is any, since right sidebar is ugly now\n private canHideFirst = false;\n private navigationType: NavigationItem['type'];\n protected managers: AppManagers;\n protected middlewareHelper: MiddlewareHelper;\n public onOpenTab: () => MaybePromise;\n\n constructor(options: {\n sidebarEl: SidebarSlider['sidebarEl'],\n tabs?: SidebarSlider['tabs'],\n canHideFirst?: SidebarSlider['canHideFirst'],\n navigationType: SidebarSlider['navigationType']\n }) {\n safeAssign(this, options);\n\n this.tabs ??= new Map();\n\n this.tabsContainer = this.sidebarEl.querySelector('.sidebar-slider');\n this._selectTab = TransitionSlider({\n content: this.tabsContainer,\n type: 'navigation',\n transitionTime: TRANSITION_TIME\n });\n if(!this.canHideFirst) {\n this._selectTab(0);\n }\n\n this.middlewareHelper = getMiddleware();\n\n // Array.from(this.sidebarEl.querySelectorAll('.sidebar-close-button') as any as HTMLElement[]).forEach((el) => {\n // attachClickEvent(el, this.onCloseBtnClick);\n // });\n }\n\n public getMiddleware() {\n return this.middlewareHelper.get();\n }\n\n public onCloseBtnClick = () => {\n const item = appNavigationController.findItemByType(this.navigationType);\n if(item) {\n appNavigationController.back(this.navigationType);\n } else if(this.historyTabIds.length) {\n this.closeTab(this.historyTabIds[this.historyTabIds.length - 1]);\n }\n // this.closeTab();\n };\n\n public closeTab = (id?: number | SliderSuperTab, animate?: boolean, isNavigation?: boolean) => {\n if(id !== undefined && this.historyTabIds[this.historyTabIds.length - 1] !== id) {\n this.removeTabFromHistory(id);\n return false;\n }\n\n // console.log('sidebar-close-button click:', this.historyTabIDs);\n const closingId = this.historyTabIds.pop(); // pop current\n this.onCloseTab(closingId, animate, isNavigation);\n\n const tab = this.historyTabIds[this.historyTabIds.length - 1];\n this._selectTab(tab !== undefined ? (tab instanceof SliderSuperTab ? tab.container : tab) : (this.canHideFirst ? -1 : 0), animate);\n return true;\n };\n\n public async selectTab(id: number | SliderSuperTab) {\n /* if(id instanceof SliderSuperTab) {\n id = id.id;\n } */\n\n if(this.historyTabIds[this.historyTabIds.length - 1] === id) {\n return false;\n }\n\n const tab: SliderSuperTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\n this.onOpenTab && await this.onOpenTab();\n\n if(tab) {\n // @ts-ignore\n tab.onOpen?.();\n\n // @ts-ignore\n if(tab.onOpenAfterTimeout) {\n setTimeout(() => {\n // @ts-ignore\n tab.onOpenAfterTimeout();\n }, TRANSITION_TIME);\n }\n }\n\n // if(!this.canHideFirst || this.historyTabIds.length) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: (canAnimate) => {\n this.closeTab(undefined, canAnimate, true);\n return true;\n }\n });\n // }\n\n this.historyTabIds.push(id);\n this._selectTab(id instanceof SliderSuperTab ? id.container : id);\n return true;\n }\n\n public removeTabFromHistory(id: number | SliderSuperTab) {\n indexOfAndSplice(this.historyTabIds, id);\n this.onCloseTab(id, undefined);\n }\n\n public sliceTabsUntilTab(tabConstructor: SliderSuperTabConstructable, preserveTab: SliderSuperTab) {\n for(let i = this.historyTabIds.length - 1; i >= 0; --i) {\n const tab = this.historyTabIds[i];\n if(tab === preserveTab) continue;\n else if(tab instanceof tabConstructor) {\n break;\n }\n\n this.removeTabFromHistory(tab);\n // appNavigationController.removeByType(this.navigationType, true);\n }\n }\n\n public getTab(tabConstructor: SliderSuperTabConstructable) {\n return this.historyTabIds.find((t) => t instanceof tabConstructor) as T;\n }\n\n public getHistory() {\n return this.historyTabIds;\n }\n\n public isTabExists(tabConstructor: SliderSuperTabConstructable) {\n return !!this.getTab(tabConstructor);\n }\n\n protected onCloseTab(id: number | SliderSuperTab, animate: boolean, isNavigation?: boolean) {\n if(!isNavigation) {\n appNavigationController.removeByType(this.navigationType, true);\n }\n\n const tab: SliderSuperTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\n if(tab) {\n try {\n // @ts-ignore\n tab.onClose?.();\n } catch(err) {\n console.error('tab onClose error', tab);\n }\n\n // @ts-ignore\n if(tab.onCloseAfterTimeout) {\n setTimeout(() => {\n // @ts-ignore\n tab.onCloseAfterTimeout();\n }, TRANSITION_TIME + 30);\n }\n }\n }\n\n public addTab(tab: SliderSuperTab) {\n if(!tab.container.parentElement) {\n this.tabsContainer.append(tab.container);\n\n if(tab.closeBtn) {\n tab.closeBtn.addEventListener('click', this.onCloseBtnClick);\n }\n }\n }\n\n public deleteTab(tab: SliderSuperTab) {\n this.tabs.delete(tab);\n }\n\n public createTab(\n ctor: SliderSuperTabConstructable,\n destroyable = true,\n doNotAppend?: boolean\n ) {\n const tab = new ctor(doNotAppend ? undefined : this, destroyable);\n tab.managers = this.managers;\n return tab;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\nimport noop from '../helpers/noop';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport ButtonIcon from './buttonIcon';\nimport Scrollable from './scrollable';\nimport SidebarSlider from './slider';\n\nexport interface SliderSuperTabConstructable {\n new(slider: SidebarSlider, destroyable: boolean): T;\n}\n\nexport interface SliderSuperTabEventableConstructable {\n new(slider: SidebarSlider, destroyable: boolean): SliderSuperTabEventable;\n}\n\nexport default class SliderSuperTab {\n public static getInitArgs?(fromTab: SliderSuperTab): any;\n\n public container: HTMLElement;\n\n public header: HTMLElement;\n public closeBtn: HTMLElement;\n public title: HTMLElement;\n\n public content: HTMLElement;\n public scrollable: Scrollable;\n\n public slider: SidebarSlider;\n public destroyable: boolean;\n public listenerSetter: ListenerSetter;\n\n public managers: AppManagers;\n public middlewareHelper: MiddlewareHelper;\n\n constructor(slider: SidebarSlider, destroyable?: boolean) {\n this._constructor(slider, destroyable);\n }\n\n public _constructor(slider: SidebarSlider, destroyable = true): any {\n this.slider = slider;\n this.middlewareHelper = slider ? slider.getMiddleware().create() : getMiddleware();\n this.destroyable = destroyable;\n\n this.container = document.createElement('div');\n this.container.classList.add('tabs-tab', 'sidebar-slider-item');\n\n // * Header\n this.header = document.createElement('div');\n this.header.classList.add('sidebar-header');\n\n this.closeBtn = ButtonIcon('left sidebar-close-button', {noRipple: true});\n this.title = document.createElement('div');\n this.title.classList.add('sidebar-header__title');\n this.header.append(this.closeBtn, this.title);\n\n // * Content\n this.content = document.createElement('div');\n this.content.classList.add('sidebar-content');\n\n this.scrollable = new Scrollable(this.content, undefined, undefined, true);\n this.scrollable.attachBorderListeners(this.container);\n\n this.container.append(this.header, this.content);\n\n this.slider?.addTab(this);\n\n this.listenerSetter = new ListenerSetter();\n }\n\n public close() {\n return this.slider.closeTab(this);\n }\n\n public async open(...args: Parameters) {\n if(this.init) {\n try {\n const result = this.init(...args);\n this.init = null;\n\n if(result instanceof Promise) {\n await result;\n }\n } catch(err) {\n console.error('open tab error', err);\n }\n }\n\n this.slider.selectTab(this);\n }\n\n public init(...args: any[]): Promise | any {\n\n }\n\n protected onOpen() {}\n protected onOpenAfterTimeout() {}\n protected onClose() {}\n\n protected onCloseAfterTimeout() {\n if(this.destroyable) { // ! WARNING, пока что это будет работать только с самой последней внутренней вкладкой !\n this.slider?.deleteTab(this);\n this.container.remove();\n this.scrollable.destroy();\n this.listenerSetter?.removeAll();\n this.middlewareHelper?.destroy();\n }\n }\n\n protected setTitle(key: LangPackKey) {\n this.title.replaceChildren(i18n(key));\n }\n}\n\nexport class SliderSuperTabEventable extends SliderSuperTab {\n public eventListener: EventListenerBase<{\n destroy: () => void | Promise,\n destroyAfter: (promise: Promise) => void,\n close: () => void\n }>;\n\n constructor(slider: SidebarSlider) {\n super(slider);\n this.eventListener = new EventListenerBase();\n }\n\n onClose() {\n this.eventListener.dispatchEvent('close');\n }\n\n onCloseAfterTimeout() {\n const results = this.eventListener.dispatchResultableEvent('destroy');\n this.eventListener.dispatchEvent('destroyAfter', Promise.all(results).then(noop, noop));\n this.eventListener.cleanup();\n return super.onCloseAfterTimeout();\n }\n}\n\n/* // @ts-ignore\ninterface SliderSuperEventsTab extends SliderSuperTab, EventListenerBase<{}> {\n superConstructor: (...args: any[]) => any;\n}\nclass SliderSuperEventsTab implements SliderSuperEventsTab {\n constructor(slider: SidebarSlider) {\n this.superConstructor([slider, true]);\n }\n}\napplyMixins(SliderSuperEventsTab, [SliderSuperTab, EventListenerBase]);\n\n(window as any).lol = SliderSuperEventsTab\n\nexport {SliderSuperEventsTab}; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager, {AppDialogsManager, DialogDom, DialogElementSize} from '../lib/appManagers/appDialogsManager';\nimport {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport positionElementByIndex from '../helpers/dom/positionElementByIndex';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {fastRaf} from '../helpers/schedulers';\nimport SortedList, {SortedElementBase} from '../helpers/sortedList';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport type LazyLoadQueue from './lazyLoadQueue';\n\ninterface SortedUser extends SortedElementBase {\n dom: DialogDom\n}\n\nexport default class SortedUserList extends SortedList {\n protected static SORT_INTERVAL = 30e3;\n public list: HTMLUListElement;\n\n protected lazyLoadQueue: LazyLoadQueue;\n protected avatarSize: DialogElementSize = 'abitbigger';\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0];\n protected onListLengthChange: () => void;\n protected getIndex: (element: SortedUser) => number;\n protected onUpdate: (element: SortedUser) => void;\n protected managers: AppManagers;\n\n constructor(options: Partial<{\n lazyLoadQueue: SortedUserList['lazyLoadQueue'],\n avatarSize: SortedUserList['avatarSize'],\n rippleEnabled: SortedUserList['rippleEnabled'],\n createChatListOptions: SortedUserList['createChatListOptions'],\n autonomous: SortedUserList['autonomous'],\n onListLengthChange: SortedUserList['onListLengthChange'],\n getIndex: SortedUserList['getIndex'],\n onUpdate: SortedUserList['onUpdate']\n }> & {\n managers: SortedUserList['managers']\n }) {\n super({\n getIndex: options.getIndex || ((element) => this.managers.appUsersManager.getUserStatusForSort(element.id)),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onUpdate: options.onUpdate || (async(element) => {\n const status = getUserStatusString(await this.managers.appUsersManager.getUser(element.id));\n replaceContent(element.dom.lastMessageSpan, status);\n }),\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength && this.onListLengthChange) {\n this.onListLengthChange();\n }\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: base.id,\n container: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n wrapOptions: {\n lazyLoadQueue: this.lazyLoadQueue\n }\n });\n\n (base as SortedUser).dom = dom;\n return base as SortedUser;\n },\n updateElementWith: fastRaf,\n updateListWith: async(callback) => {\n if(!isInDOM(this.list)) {\n return callback(false);\n }\n\n await getHeavyAnimationPromise();\n\n if(!isInDOM(this.list)) {\n return callback(false);\n }\n\n callback(true);\n }\n });\n\n safeAssign(this, options);\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n\n let timeout: number;\n const doTimeout = () => {\n timeout = window.setTimeout(() => {\n this.updateList((good) => {\n if(good) {\n doTimeout();\n }\n });\n }, SortedUserList.SORT_INTERVAL);\n };\n\n doTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {simulateClickEvent, attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport getVisibleRect from '../helpers/dom/getVisibleRect';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {makeMediaSize} from '../helpers/mediaSize';\nimport {getMiddleware, Middleware} from '../helpers/middleware';\nimport {doubleRaf} from '../helpers/schedulers';\nimport pause from '../helpers/schedulers/pause';\nimport windowSize from '../helpers/windowSize';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport getStickerEffectThumb from '../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport {CustomEmojiElement} from '../lib/richTextProcessor/wrapRichText';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\nimport rootScope from '../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from './animationIntersector';\nimport SetTransition from './singleTransition';\nimport wrapSticker from './wrappers/sticker';\nimport {STICKER_EFFECT_MULTIPLIER} from './wrappers/sticker';\n\nlet hasViewer = false;\nexport default function attachStickerViewerListeners({listenTo, listenerSetter, selector, findTarget: originalFindTarget}: {\n listenerSetter: ListenerSetter,\n listenTo: HTMLElement,\n selector?: string,\n findTarget?: (e: MouseEvent) => HTMLElement\n}) {\n if(IS_TOUCH_SUPPORTED) {\n return;\n }\n\n const findTarget = (e: MouseEvent, checkForParent?: boolean) => {\n let el: HTMLElement;\n if(originalFindTarget) el = originalFindTarget(e);\n else {\n const s = selector || `.media-sticker-wrapper`;\n el = (e.target as HTMLElement).closest(s) as HTMLElement;\n }\n\n return el && (!checkForParent || findUpAsChild(el, listenTo)) ? el : undefined;\n };\n\n const managers = rootScope.managers;\n\n listenerSetter.add(listenTo)('mousedown', (e) => {\n if(hasViewer || e.buttons > 1 || e.button !== 0) return;\n let mediaContainer = findTarget(e);\n if(!mediaContainer) {\n return;\n }\n\n // const img: HTMLImageElement = mediaContainer.querySelector('img.media-sticker');\n\n const docId = mediaContainer.dataset.docId;\n if(!docId) {\n return;\n }\n\n const className = 'sticker-viewer';\n const group: AnimationItemGroup = 'STICKER-VIEWER';\n const openDuration = 200;\n const switchDuration = 200;\n const previousGroup = animationIntersector.getOnlyOnePlayableGroup();\n const _middleware = getMiddleware();\n let container: HTMLElement, previousTransformer: HTMLElement;\n\n const doThatSticker = async({mediaContainer, doc, middleware, lockGroups, isSwitching}: {\n mediaContainer: HTMLElement,\n doc: MyDocument,\n middleware: Middleware,\n lockGroups?: boolean,\n isSwitching?: boolean\n }) => {\n const effectThumb = getStickerEffectThumb(doc);\n const mediaRect: DOMRect = mediaContainer.getBoundingClientRect();\n const s = makeMediaSize(doc.w, doc.h);\n const size = effectThumb ? 280 : 360;\n const boxSize = makeMediaSize(size, size);\n const fitted = mediaRect.width === mediaRect.height ? boxSize : s.aspectFitted(boxSize);\n\n const bubble = findUpClassName(mediaContainer, 'bubble');\n const isOut = bubble ? bubble.classList.contains('is-out') : true;\n\n const transformer = document.createElement('div');\n transformer.classList.add(className + '-transformer');\n\n const stickerContainer = document.createElement('div');\n stickerContainer.classList.add(className + '-sticker');\n /* transformer.style.width = */stickerContainer.style.width = fitted.width + 'px';\n /* transformer.style.height = */stickerContainer.style.height = fitted.height + 'px';\n\n const stickerEmoji = document.createElement('div');\n stickerEmoji.classList.add(className + '-emoji');\n stickerEmoji.append(wrapEmojiText(doc.stickerEmojiRaw));\n\n if(effectThumb) {\n const margin = (size * STICKER_EFFECT_MULTIPLIER - size) / 3 * (isOut ? 1 : -1);\n transformer.classList.add('has-effect');\n // const property = `--margin-${isOut ? 'right' : 'left'}`;\n // stickerContainer.style.setProperty(property, `${margin * 2}px`);\n transformer.style.setProperty('--translateX', `${margin}px`);\n stickerEmoji.style.setProperty('--translateX', `${-margin}px`);\n }\n\n const overflowElement = findUpClassName(mediaContainer, 'scrollable');\n const visibleRect = getVisibleRect(mediaContainer, overflowElement, true, mediaRect);\n if(visibleRect.overflow.vertical || visibleRect.overflow.horizontal) {\n stickerContainer.classList.add('is-overflow');\n }\n\n // if(img) {\n // const ratio = img.naturalWidth / img.naturalHeight;\n // if((mediaRect.width / mediaRect.height).toFixed(1) !== ratio.toFixed(1)) {\n\n // mediaRect = mediaRect.toJSON();\n // }\n // }\n\n const rect = mediaContainer.getBoundingClientRect();\n const scaleX = rect.width / fitted.width;\n const scaleY = rect.height / fitted.height;\n const transformX = rect.left - (windowSize.width - rect.width) / 2;\n const transformY = rect.top - (windowSize.height - rect.height) / 2;\n transformer.style.transform = `translate(${transformX}px, ${transformY}px) scale(${scaleX}, ${scaleY})`;\n if(isSwitching) transformer.classList.add('is-switching');\n transformer.append(stickerContainer, stickerEmoji);\n container.append(transformer);\n\n const o = await wrapSticker({\n doc,\n div: stickerContainer,\n group,\n width: fitted.width,\n height: fitted.height,\n play: false,\n loop: true,\n middleware,\n managers,\n needFadeIn: false,\n isOut,\n withThumb: false,\n relativeEffect: true,\n loopEffect: true\n }).then(({render}) => render);\n if(!middleware()) return;\n\n if(!container.parentElement) {\n document.body.append(container);\n }\n\n const player = Array.isArray(o) ? o[0] : o;\n\n const firstFramePromise = player instanceof RLottiePlayer ?\n new Promise((resolve) => player.addEventListener('firstFrame', resolve, {once: true})) :\n Promise.resolve();\n await Promise.all([firstFramePromise, doubleRaf()]);\n await pause(0); // ! need it because firstFrame will be called just from the loop\n if(!middleware()) return;\n\n if(lockGroups) {\n animationIntersector.setOnlyOnePlayableGroup(group);\n animationIntersector.checkAnimations2(true);\n }\n\n if(player instanceof RLottiePlayer) {\n const prevPlayer = mediaContainer instanceof CustomEmojiElement ?\n mediaContainer.player as RLottiePlayer :\n lottieLoader.getAnimation(mediaContainer);\n if(prevPlayer) {\n player.curFrame = prevPlayer.curFrame;\n player.play();\n await new Promise((resolve) => {\n let i = 0;\n const c = () => {\n if(++i === 2) {\n resolve();\n player.removeEventListener('enterFrame', c);\n }\n };\n\n player.addEventListener('enterFrame', c);\n });\n if(!middleware()) return;\n player.pause();\n }\n } else if(player instanceof HTMLVideoElement) {\n const prevPlayer = mediaContainer.querySelector('video');\n if(prevPlayer) {\n player.currentTime = prevPlayer.currentTime;\n }\n }\n\n return {\n ready: () => {\n if(player instanceof RLottiePlayer || player instanceof HTMLVideoElement) {\n player.play();\n }\n\n if(effectThumb) {\n simulateClickEvent(stickerContainer);\n }\n },\n transformer\n };\n };\n\n const timeout = window.setTimeout(async() => {\n document.removeEventListener('mousemove', onMousePreMove);\n\n container = document.createElement('div');\n container.classList.add(className);\n hasViewer = true;\n\n const middleware = _middleware.get();\n const doc = await managers.appDocsManager.getDoc(docId);\n if(!middleware()) return;\n\n let result: Awaited>;\n try {\n result = await doThatSticker({\n doc,\n mediaContainer,\n middleware,\n lockGroups: true\n });\n if(!result) return;\n } catch(err) {\n return;\n }\n\n const {ready, transformer} = result;\n\n previousTransformer = transformer;\n\n SetTransition({\n element: container,\n className: 'is-visible',\n forwards: true,\n duration: openDuration,\n onTransitionEnd: () => {\n if(!middleware()) return;\n ready();\n }\n });\n\n document.addEventListener('mousemove', onMouseMove);\n }, 125);\n\n const onMouseMove = async(e: MouseEvent) => {\n const newMediaContainer = findTarget(e, true);\n if(!newMediaContainer || mediaContainer === newMediaContainer) {\n return;\n }\n\n const docId = newMediaContainer.dataset.docId;\n if(!docId) {\n return;\n }\n\n mediaContainer = newMediaContainer;\n _middleware.clean();\n const middleware = _middleware.get();\n\n const doc = await managers.appDocsManager.getDoc(docId);\n if(!middleware()) return;\n\n let r: Awaited>;\n try {\n r = await doThatSticker({\n doc,\n mediaContainer,\n middleware,\n isSwitching: true\n });\n if(!r) return;\n } catch(err) {\n console.error('sticker viewer error', err);\n return;\n }\n\n const {ready, transformer} = r;\n\n const _previousTransformer = previousTransformer;\n SetTransition({\n element: _previousTransformer,\n className: 'is-switching',\n forwards: true,\n duration: switchDuration,\n onTransitionEnd: () => {\n _previousTransformer.remove();\n }\n });\n\n previousTransformer = transformer;\n\n SetTransition({\n element: transformer,\n className: 'is-switching',\n forwards: false,\n duration: switchDuration,\n onTransitionEnd: () => {\n if(!middleware()) return;\n ready();\n }\n });\n };\n\n const onMousePreMove = (e: MouseEvent) => {\n if(!findUpAsChild(e.target as HTMLElement, mediaContainer)) {\n onMouseUp();\n }\n };\n\n const onMouseUp = () => {\n clearTimeout(timeout);\n _middleware.clean();\n\n if(container) {\n SetTransition({\n element: container,\n className: 'is-visible',\n forwards: false,\n duration: openDuration,\n onTransitionEnd: () => {\n container.remove();\n animationIntersector.setOnlyOnePlayableGroup(previousGroup);\n animationIntersector.checkAnimations2(false);\n hasViewer = false;\n }\n });\n\n attachClickEvent(document.body, cancelEvent, {capture: true, once: true});\n }\n\n document.removeEventListener('mousemove', onMousePreMove);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp, {capture: true});\n };\n\n document.addEventListener('mousemove', onMousePreMove);\n document.addEventListener('mouseup', onMouseUp, {once: true, capture: true});\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class StickyIntersector {\n private headersObserver: IntersectionObserver;\n private elementsObserver: IntersectionObserver;\n\n constructor(private container: HTMLElement, private handler: (stuck: boolean, target: HTMLElement) => void) {\n this.observeHeaders();\n this.observeElements();\n }\n\n /**\n * Sets up an intersection observer to notify when elements with the class\n * `.sticky_sentinel--top` become visible/invisible at the top of the container.\n * @param {!Element} container\n */\n private observeHeaders() {\n this.headersObserver = new IntersectionObserver((entries) => {\n for(const entry of entries) {\n const targetInfo = entry.boundingClientRect;\n const stickyTarget = entry.target.parentElement;\n const rootBoundsInfo = entry.rootBounds;\n\n // Started sticking.\n if(targetInfo.bottom < rootBoundsInfo.top) {\n this.handler(true, stickyTarget);\n }\n\n // Stopped sticking.\n if(targetInfo.bottom >= rootBoundsInfo.top &&\n targetInfo.bottom < rootBoundsInfo.bottom) {\n this.handler(false, stickyTarget);\n }\n }\n }, {threshold: 0, root: this.container});\n }\n\n private observeElements() {\n this.elementsObserver = new IntersectionObserver((entries) => {\n const entry = entries\n .filter((entry) => entry.boundingClientRect.top < entry.rootBounds.top)\n .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];\n if(!entry) return;\n\n const container = entry.isIntersecting ? entry.target : entry.target.nextElementSibling;\n this.handler(true, container as HTMLElement);\n }, {root: this.container});\n }\n\n /**\n * @param {!Element} container\n * @param {string} className\n */\n private addSentinel(container: HTMLElement, className: string) {\n const sentinel = document.createElement('div');\n sentinel.classList.add('sticky_sentinel', className);\n return container.appendChild(sentinel);\n }\n\n /**\n * Notifies when elements w/ the `sticky` class begin to stick or stop sticking.\n * Note: the elements should be children of `container`.\n * @param {!Element} container\n */\n public observeStickyHeaderChanges(element: HTMLElement) {\n const headerSentinel = this.addSentinel(element, 'sticky_sentinel--top');\n this.headersObserver.observe(headerSentinel);\n\n this.elementsObserver.observe(element);\n }\n\n public disconnect() {\n this.headersObserver.disconnect();\n this.elementsObserver.disconnect();\n }\n\n public unobserve(element: HTMLElement, headerSentinel: HTMLElement) {\n this.elementsObserver.unobserve(element);\n this.headersObserver.unobserve(headerSentinel);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport safeAssign from '../helpers/object/safeAssign';\nimport contextMenuController from '../helpers/contextMenuController';\nimport {Middleware} from '../helpers/middleware';\nimport ListenerSetter, {Listener, ListenerOptions} from '../helpers/listenerSetter';\nimport {attachContextMenuListener} from '../helpers/dom/attachContextMenuListener';\nimport pause from '../helpers/schedulers/pause';\nimport deferredPromise from '../helpers/cancellablePromise';\n\ntype E = {\n clientX: number,\n clientY: number,\n target: EventTarget,\n button?: number\n};\n\ntype EE = E | (Exclude & {\n touches: E[]\n});\n\nconst getEvent = (e: EE) => {\n return 'touches' in e ? e.touches[0] : e;\n};\n\nconst attachGlobalListenerTo = window;\n\nlet RESET_GLOBAL = false;\ncontextMenuController.addEventListener('toggle', (visible) => {\n RESET_GLOBAL = visible;\n});\n\nexport type SwipeHandlerOptions = {\n element: SwipeHandler['element'],\n onSwipe: SwipeHandler['onSwipe'],\n verifyTouchTarget?: SwipeHandler['verifyTouchTarget'],\n onFirstSwipe?: SwipeHandler['onFirstSwipe'],\n onReset?: SwipeHandler['onReset'],\n onStart?: SwipeHandler['onStart'],\n cursor?: SwipeHandler['cursor'],\n cancelEvent?: SwipeHandler['cancelEvent'],\n listenerOptions?: SwipeHandler['listenerOptions'],\n setCursorTo?: HTMLElement,\n middleware?: Middleware,\n withDelay?: boolean\n};\n\nconst TOUCH_MOVE_OPTIONS: ListenerOptions = {passive: false, capture: true};\nconst MOUSE_MOVE_OPTIONS: ListenerOptions = false as any;\n\nexport default class SwipeHandler {\n private element: HTMLElement;\n private onSwipe: (xDiff: number, yDiff: number, e: EE) => boolean | void;\n private verifyTouchTarget: (evt: EE) => boolean | Promise;\n private onFirstSwipe: (e: EE) => void;\n private onReset: () => void;\n private onStart: () => void;\n private cursor: 'grabbing' | 'move' | 'row-resize' | 'col-resize' | 'nesw-resize' | 'nwse-resize' | 'ne-resize' | 'se-resize' | 'sw-resize' | 'nw-resize' | 'n-resize' | 'e-resize' | 's-resize' | 'w-resize' | '' = 'grabbing';\n private cancelEvent = true;\n private listenerOptions: boolean | AddEventListenerOptions = false;\n private setCursorTo: HTMLElement;\n\n private isMouseDown: boolean;\n private tempId: number;\n\n private hadMove: boolean;\n private eventUp: E;\n private xDown: number;\n private yDown: number;\n private xAdded: number;\n private yAdded: number;\n\n private withDelay: boolean;\n private listenerSetter: ListenerSetter;\n\n constructor(options: SwipeHandlerOptions) {\n safeAssign(this, options);\n\n this.setCursorTo ??= this.element;\n this.listenerSetter = new ListenerSetter();\n this.setListeners();\n\n this.resetValues();\n this.tempId = 0;\n\n options.middleware?.onDestroy(() => {\n this.reset();\n this.removeListeners();\n });\n }\n\n public setListeners() {\n if(!IS_TOUCH_SUPPORTED) {\n // @ts-ignore\n this.listenerSetter.add(this.element)('mousedown', this.handleStart, this.listenerOptions);\n this.listenerSetter.add(attachGlobalListenerTo)('mouseup', this.reset);\n } else {\n if(this.withDelay) {\n attachContextMenuListener(this.element, (e) => {\n cancelEvent(e);\n // @ts-ignore\n this.handleStart(e);\n }, this.listenerSetter);\n } else {\n // @ts-ignore\n this.listenerSetter.add(this.element)('touchstart', this.handleStart, this.listenerOptions);\n }\n\n this.listenerSetter.add(attachGlobalListenerTo)('touchend', this.reset);\n }\n }\n\n public removeListeners() {\n this.listenerSetter.removeAll();\n }\n\n public setCursor(cursor: SwipeHandler['cursor'] = '') {\n this.cursor = cursor;\n\n if(!IS_TOUCH_SUPPORTED && this.hadMove) {\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\n }\n }\n\n public add(x: number, y: number) {\n this.xAdded = x;\n this.yAdded = y;\n this.handleMove({\n clientX: this.eventUp.clientX,\n clientY: this.eventUp.clientY,\n target: this.eventUp.target\n });\n }\n\n protected resetValues() {\n ++this.tempId;\n this.hadMove = false;\n this.xAdded = this.yAdded = 0;\n this.xDown =\n this.yDown =\n this.eventUp =\n this.isMouseDown =\n undefined;\n }\n\n protected reset = (e?: Event) => {\n /* if(e) {\n cancelEvent(e);\n } */\n\n if(IS_TOUCH_SUPPORTED) {\n this.listenerSetter.removeManual(attachGlobalListenerTo, 'touchmove', this.handleMove, TOUCH_MOVE_OPTIONS);\n } else {\n this.listenerSetter.removeManual(attachGlobalListenerTo, 'mousemove', this.handleMove, MOUSE_MOVE_OPTIONS);\n this.setCursorTo.style.cursor = '';\n }\n\n if(this.hadMove) {\n this.onReset?.();\n }\n\n this.resetValues();\n };\n\n protected handleStart = async(_e: EE) => {\n if(this.isMouseDown) {\n return;\n }\n\n const e = getEvent(_e);\n if(Math.max(0, e.button ?? 0) !== 0) {\n return;\n }\n\n if(this.verifyTouchTarget && !(await this.verifyTouchTarget(_e))) {\n return this.reset();\n }\n\n const tempId = ++this.tempId;\n this.isMouseDown = true;\n\n if(this.withDelay && !IS_TOUCH_SUPPORTED) {\n const options = {...MOUSE_MOVE_OPTIONS, once: true};\n const deferred = deferredPromise();\n const cb = () => deferred.resolve();\n const listener = this.listenerSetter.add(attachGlobalListenerTo)('mousemove', cb, options) as any as Listener;\n\n await Promise.race([\n pause(300),\n deferred\n ]);\n\n deferred.resolve();\n this.listenerSetter.remove(listener);\n\n if(this.tempId !== tempId) {\n return;\n }\n }\n\n this.xDown = e.clientX;\n this.yDown = e.clientY;\n this.eventUp = e;\n\n if(IS_TOUCH_SUPPORTED) {\n // @ts-ignore\n this.listenerSetter.add(attachGlobalListenerTo)('touchmove', this.handleMove, TOUCH_MOVE_OPTIONS);\n } else {\n // @ts-ignore\n this.listenerSetter.add(attachGlobalListenerTo)('mousemove', this.handleMove, MOUSE_MOVE_OPTIONS);\n }\n\n if(this.onStart) {\n this.onStart();\n\n // have to initiate move instantly\n this.hadMove = true;\n this.handleMove(e);\n }\n };\n\n protected handleMove = (_e: EE) => {\n if(this.xDown === undefined || this.yDown === undefined || RESET_GLOBAL) {\n this.reset();\n return;\n }\n\n if(this.cancelEvent) {\n cancelEvent(_e as any);\n }\n\n const e = this.eventUp = getEvent(_e);\n const xUp = e.clientX;\n const yUp = e.clientY;\n\n const xDiff = xUp - this.xDown + this.xAdded;\n const yDiff = yUp - this.yDown + this.yAdded;\n\n if(!this.hadMove) {\n if(!xDiff && !yDiff) {\n return;\n }\n\n this.hadMove = true;\n\n if(!IS_TOUCH_SUPPORTED) {\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\n }\n\n this.onFirstSwipe?.(_e);\n }\n\n const onSwipeResult = this.onSwipe(xDiff, yDiff, _e);\n if(onSwipeResult !== undefined && onSwipeResult) {\n this.reset();\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport placeCaretAtEnd from '../helpers/dom/placeCaretAtEnd';\nimport {formatPhoneNumber} from '../helpers/formatPhoneNumber';\nimport {IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE} from '../environment/userAgent';\nimport {HelpCountry, HelpCountryCode} from '../layer';\nimport InputField, {InputFieldOptions} from './inputField';\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n\n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n // plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n const telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n // console.log('input', this.value);\n telEl.classList.remove('error');\n\n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n\n this.pasted = false;\n\n this.setLabel();\n\n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n\n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n\n // console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n\n telEl.addEventListener('paste', () => {\n this.pasted = true;\n // console.log('paste', telEl.value);\n });\n\n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n\n telEl.addEventListener('keypress', (e) => {\n // console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../helpers/dom/replaceContent';\nimport OverlayClickHandler from '../helpers/overlayClickHandler';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\n\nconst toastEl = document.createElement('div');\ntoastEl.classList.add('toast');\nlet timeout: number;\n\nconst x = new OverlayClickHandler('toast');\nx.addEventListener('toggle', (open) => {\n if(!open) {\n hideToast();\n }\n});\n\nexport function hideToast() {\n x.close();\n\n toastEl.classList.remove('is-visible');\n timeout && clearTimeout(+timeout);\n\n timeout = window.setTimeout(() => {\n toastEl.remove();\n timeout = undefined;\n }, 200);\n}\n\nexport function toast(content: string | Node, onClose?: () => void) {\n x.close();\n\n replaceContent(toastEl, content);\n\n if(!toastEl.parentElement) {\n document.body.append(toastEl);\n void toastEl.offsetLeft; // reflow\n }\n\n toastEl.classList.add('is-visible');\n\n timeout && clearTimeout(+timeout);\n x.open(toastEl);\n\n timeout = window.setTimeout(hideToast, 3000);\n\n if(onClose) {\n x.addEventListener('toggle', onClose, {once: true});\n }\n}\n\nexport function toastNew(options: Partial<{\n langPackKey: LangPackKey,\n langPackArguments: FormatterArguments,\n onClose: () => void\n}>) {\n toast(i18n(options.langPackKey, options.langPackArguments), options.onClose);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {dispatchHeavyAnimationEvent} from '../hooks/useHeavyAnimationCheck';\nimport whichChild from '../helpers/dom/whichChild';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\n\nfunction makeTransitionFunction(options: TransitionFunction) {\n return options;\n}\n\nconst slideNavigation = makeTransitionFunction({\n callback: (tabContent, prevTabContent, toRight) => {\n const width = prevTabContent.getBoundingClientRect().width;\n const elements = [tabContent, prevTabContent];\n if(toRight) elements.reverse();\n elements[0].style.filter = `brightness(80%)`;\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n tabContent.style.filter = '';\n\n return () => {\n prevTabContent.style.transform = prevTabContent.style.filter = '';\n };\n },\n animateFirst: false\n});\n\nconst slideTabs = makeTransitionFunction({\n callback: (tabContent, prevTabContent, toRight) => {\n // Jolly Cobra's // Workaround for scrollable content flickering during animation.\n // const scrollableContainer = findUpClassName(tabContent, 'scrollable-y');\n // if(scrollableContainer && scrollableContainer.style.overflowY !== 'hidden') {\n // // const scrollBarWidth = scrollableContainer.offsetWidth - scrollableContainer.clientWidth;\n // scrollableContainer.style.overflowY = 'hidden';\n // // scrollableContainer.style.paddingRight = `${scrollBarWidth}px`;\n // // this.container.classList.add('sliding');\n // }\n\n // window.requestAnimationFrame(() => {\n const width = prevTabContent.getBoundingClientRect().width;\n /* tabContent.style.setProperty('--width', width + 'px');\n prevTabContent.style.setProperty('--width', width + 'px');\n\n tabContent.classList.add('active'); */\n // void tabContent.offsetWidth; // reflow\n const elements = [tabContent, prevTabContent];\n if(toRight) elements.reverse();\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n // });\n\n return () => {\n prevTabContent.style.transform = '';\n\n // if(scrollableContainer) {\n // // Jolly Cobra's // Workaround for scrollable content flickering during animation.\n // if(isSafari) { // ! safari doesn't respect sticky header, so it flicks when overflow is changing\n // scrollableContainer.style.display = 'none';\n // }\n\n // scrollableContainer.style.overflowY = '';\n\n // if(isSafari) {\n // void scrollableContainer.offsetLeft; // reflow\n // scrollableContainer.style.display = '';\n // }\n\n // // scrollableContainer.style.paddingRight = '0';\n // // this.container.classList.remove('sliding');\n // }\n };\n },\n animateFirst: false\n});\n\nconst slideTopics = makeTransitionFunction({\n callback: (tabContent, prevTabContent) => {\n const rect = tabContent.getBoundingClientRect();\n const offsetX = rect.width - 80;\n\n tabContent.style.transform = `transformX(${offsetX}px)`;\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n\n return () => {};\n },\n animateFirst: true\n});\n\nconst transitions: {[type in TransitionSliderType]?: TransitionFunction} = {\n navigation: slideNavigation,\n tabs: slideTabs\n // topics: slideTopics\n};\n\ntype TransitionSliderType = 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'topics' | 'none'/* | 'counter' */;\n\ntype TransitionSliderOptions = {\n content: HTMLElement,\n type: TransitionSliderType,\n transitionTime: number,\n onTransitionEnd?: (id: number) => void,\n isHeavy?: boolean,\n once?: boolean,\n withAnimationListener?: boolean,\n listenerSetter?: ListenerSetter,\n animateFirst?: boolean\n};\n\ntype TransitionFunction = {\n callback: (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => () => void,\n animateFirst: boolean\n};\n\nconst TransitionSlider = (options: TransitionSliderOptions) => {\n let {\n content,\n type,\n transitionTime,\n onTransitionEnd,\n isHeavy = true,\n once = false,\n withAnimationListener = true,\n listenerSetter,\n animateFirst = false\n } = options;\n\n const {callback: animationFunction, animateFirst: _animateFirst} = transitions[type] || {};\n content.dataset.animation = type;\n\n if(_animateFirst !== undefined) {\n animateFirst = _animateFirst;\n }\n\n const onTransitionEndCallbacks: Map = new Map();\n let animationDeferred: CancellablePromise;\n // let animationStarted = 0;\n let from: HTMLElement = null;\n\n if(withAnimationListener) {\n const listenerName = animationFunction ? 'transitionend' : 'animationend';\n\n const onEndEvent = (e: TransitionEvent | AnimationEvent) => {\n cancelEvent(e);\n\n if((e.target as HTMLElement).parentElement !== content) {\n return;\n }\n\n // console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\n\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\n callback?.();\n\n if(e.target !== from) {\n return;\n }\n\n if(!animationDeferred && isHeavy) return;\n\n if(animationDeferred) {\n animationDeferred.resolve();\n animationDeferred = undefined;\n }\n\n onTransitionEnd?.(selectTab.prevId());\n\n content.classList.remove('animating', 'backwards', 'disable-hover');\n\n if(once) {\n if(listenerSetter) listenerSetter.removeManual(content, listenerName, onEndEvent);\n else content.removeEventListener(listenerName, onEndEvent/* , {capture: false} */);\n from = animationDeferred = undefined;\n onTransitionEndCallbacks.clear();\n }\n };\n\n // TODO: check for transition type (transform, etc) using by animationFunction\n if(listenerSetter) listenerSetter.add(content)(listenerName, onEndEvent);\n else content.addEventListener(listenerName, onEndEvent/* , {passive: true, capture: false} */);\n }\n\n function selectTab(id: number | HTMLElement, animate = true, overrideFrom?: typeof from) {\n if(overrideFrom) {\n from = overrideFrom;\n }\n\n if(id instanceof HTMLElement) {\n id = whichChild(id);\n }\n\n const prevId = selectTab.prevId();\n if(id === prevId) return false;\n\n // console.log('selectTab id:', id);\n\n const to = content.children[id] as HTMLElement;\n\n if(!rootScope.settings.animationsEnabled || (prevId === -1 && !animateFirst)) {\n animate = false;\n }\n\n if(!withAnimationListener) {\n const timeout = content.dataset.timeout;\n if(timeout !== undefined) {\n clearTimeout(+timeout);\n }\n\n delete content.dataset.timeout;\n }\n\n if(!animate) {\n if(from) from.classList.remove('active', 'to', 'from');\n else if(to) { // fix instant opening back from closed slider (e.g. instant closening and opening right sidebar)\n const callback = onTransitionEndCallbacks.get(to);\n callback?.();\n }\n\n if(to) {\n to.classList.remove('to', 'from');\n to.classList.add('active');\n }\n\n content.classList.remove('animating', 'backwards', 'disable-hover');\n\n from = to;\n\n onTransitionEnd?.(id);\n return;\n }\n\n if(!withAnimationListener) {\n content.dataset.timeout = '' + window.setTimeout(() => {\n to.classList.remove('to');\n from && from.classList.remove('from');\n content.classList.remove('animating', 'backwards', 'disable-hover');\n delete content.dataset.timeout;\n }, transitionTime);\n }\n\n if(from) {\n from.classList.remove('to');\n from.classList.add('from');\n }\n\n content.classList.add('animating'/* , 'disable-hover' */);\n const toRight = prevId < id;\n content.classList.toggle('backwards', !toRight);\n\n let onTransitionEndCallback: ReturnType;\n if(!to) {\n // prevTabContent.classList.remove('active');\n } else {\n if(animationFunction) {\n onTransitionEndCallback = animationFunction(to, from, toRight);\n } else {\n to.classList.add('active');\n }\n\n to.classList.remove('from');\n to.classList.add('to');\n }\n\n if(to) {\n const transitionTimeout = to.dataset.transitionTimeout;\n if(transitionTimeout) {\n clearTimeout(+transitionTimeout);\n }\n\n onTransitionEndCallbacks.set(to, () => {\n to.classList.remove('to');\n onTransitionEndCallbacks.delete(to);\n });\n }\n\n if(from/* && false */) {\n let timeout: number;\n const _from = from;\n const callback = () => {\n clearTimeout(timeout);\n _from.classList.remove('active', 'from');\n\n onTransitionEndCallback?.();\n\n onTransitionEndCallbacks.delete(_from);\n };\n\n if(to) {\n timeout = window.setTimeout(callback, transitionTime + 100); // something happened to container\n onTransitionEndCallbacks.set(_from, callback);\n } else {\n timeout = window.setTimeout(callback, transitionTime);\n onTransitionEndCallbacks.set(_from, () => {\n clearTimeout(timeout);\n onTransitionEndCallbacks.delete(_from);\n });\n }\n\n _from.dataset.transitionTimeout = '' + timeout;\n\n if(isHeavy) {\n if(!animationDeferred) {\n animationDeferred = deferredPromise();\n // animationStarted = performance.now();\n }\n\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\n }\n }\n\n from = to;\n }\n\n // selectTab.prevId = -1;\n selectTab.prevId = () => from ? whichChild(from) : -1;\n selectTab.getFrom = () => from;\n selectTab.setFrom = (_from: HTMLElement) => from = _from;\n\n return selectTab;\n};\n\nexport default TransitionSlider;\n","export default function isUsernameValid(username: string) {\n return ((username.length >= 3 && username.length <= 32) || !username.length) && /^[a-zA-Z0-9_]*$/.test(username);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ListenerSetter from '../helpers/listenerSetter';\nimport debounce from '../helpers/schedulers/debounce';\nimport {LangPackKey} from '../lib/langPack';\nimport InputField, {InputFieldOptions, InputState} from './inputField';\nimport isUsernameValid from '../lib/richTextProcessor/isUsernameValid';\nimport {AppManagers} from '../lib/appManagers/managers';\n\nexport class UsernameInputField extends InputField {\n private checkUsernamePromise: Promise;\n private checkUsernameDebounced: (username: string) => void;\n public options: InputFieldOptions & {\n peerId?: PeerId,\n listenerSetter: ListenerSetter,\n onChange?: () => void,\n invalidText: LangPackKey,\n takenText: LangPackKey,\n availableText: LangPackKey,\n head?: string\n };\n public error: ApiError;\n\n constructor(\n options: UsernameInputField['options'],\n private managers: AppManagers\n ) {\n super(options);\n\n this.checkUsernameDebounced = debounce(this.checkUsername.bind(this), 150, false, true);\n\n options.listenerSetter.add(this.input)('input', () => {\n const value = this.getValue();\n\n this.error = undefined;\n if(value === this.originalValue || !value.length) {\n this.setState(InputState.Neutral);\n this.options.onChange?.();\n return;\n } else if(!isUsernameValid(value)) { // does not check the last underscore\n this.setError(this.options.invalidText);\n } else {\n this.setState(InputState.Neutral);\n }\n\n if(this.input.classList.contains('error')) {\n this.options.onChange?.();\n return;\n }\n\n this.checkUsernameDebounced(value);\n });\n }\n\n public getValue() {\n let value = this.value;\n if(this.options.head) {\n value = value.slice(this.options.head.length);\n this.setValueSilently(this.options.head + value);\n }\n\n return value;\n }\n\n private checkUsername(username: string) {\n if(this.checkUsernamePromise) return;\n\n this.error = undefined;\n let checkPromise: Promise\n if(this.options.peerId) {\n checkPromise = this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(), username);\n } else {\n checkPromise = this.managers.appUsersManager.checkUsername(username);\n }\n\n const promise = this.checkUsernamePromise = checkPromise.then((available) => {\n if(this.getValue() !== username) return;\n\n if(available) {\n this.setState(InputState.Valid, this.options.availableText);\n } else {\n this.setError(this.options.takenText);\n }\n }, (err) => {\n if(this.getValue() !== username) return;\n\n this.error = err;\n switch((err as ApiError).type) {\n case 'USERNAME_PURCHASE_AVAILABLE': {\n this.setError(this.options.takenText);\n break;\n }\n\n case 'USERNAME_INVALID':\n default: {\n this.setError(this.options.invalidText);\n break;\n }\n }\n }).then(() => {\n if(this.checkUsernamePromise === promise) {\n this.checkUsernamePromise = undefined;\n }\n\n this.options.onChange?.();\n\n const value = this.getValue();\n if(value !== username && this.isValidToChange() && isUsernameValid(value)) {\n this.checkUsername(value);\n }\n });\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport placeCaretAtEnd from '../helpers/dom/placeCaretAtEnd';\nimport positionElementByIndex from '../helpers/dom/positionElementByIndex';\nimport Sortable from '../helpers/dom/sortable';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {Middleware} from '../helpers/middleware';\nimport noop from '../helpers/noop';\nimport SortedList, {SortedElementBase} from '../helpers/sortedList';\nimport {Chat, User, Username} from '../layer';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport confirmationPopup from './confirmationPopup';\nimport Row from './row';\nimport SettingSection from './settingSection';\nimport {UsernameInputField} from './usernameInputField';\n\nexport default class UsernamesSection extends SettingSection {\n // public section: SettingSection;\n\n constructor(options: {\n peerId: PeerId,\n peer: Chat.channel | User.user,\n listenerSetter: ListenerSetter,\n usernameInputField: UsernameInputField,\n middleware: Middleware\n }) {\n /* const section = this.section = new SettingSection */super({\n name: 'UsernamesProfileHeader',\n caption: !options.peerId.isUser() ? 'UsernamesChannelHelp' : 'UsernamesProfileHelp'\n });\n\n const {peerId, peer, usernameInputField, listenerSetter, middleware} = options;\n const managers = rootScope.managers;\n const channelId = peerId.isUser() ? undefined : peerId.toChatId();\n\n const section = this;\n\n const CLASS_NAME = 'usernames';\n const list = document.createElement('div');\n list.classList.add(CLASS_NAME);\n\n let _usernames: Username[];\n\n interface SortedUsername extends SortedElementBase {\n row: Row\n }\n\n const sortedList = new SortedList({\n getIndex: (element) => _usernames.length - _usernames.findIndex((username) => username.username === element.id),\n onDelete: (element) => {\n element.row.container.remove();\n },\n onSort: (element, idx) => {\n positionElementByIndex(element.row.container, list, idx);\n },\n onElementCreate: (base) => {\n const username = _usernames.find((username) => username.username === base.id);\n const row = new Row({\n title: '@' + username.username,\n subtitle: true,\n clickable: true\n });\n\n const editable = !!username.pFlags.editable;\n const active = !!username.pFlags.active;\n\n if(editable) row.container.dataset.editable = '1';\n row.container.dataset.username = username.username;\n row.container.classList.add(CLASS_NAME + '-username');\n row.subtitle.classList.add(CLASS_NAME + '-username-status');\n const media = row.createMedia('medium');\n media.classList.add(CLASS_NAME + '-username-icon', 'tgico');\n\n row.makeSortable();\n\n changeActive(row, active);\n\n (base as SortedUsername).row = row;\n\n return base as SortedUsername;\n }\n });\n\n const changeActive = (row: Row, active: boolean) => {\n row.subtitle.replaceChildren(i18n(row.container.dataset.editable ? 'UsernameLinkEditable' : (active ? 'UsernameLinkActive' : 'UsernameLinkInactive')));\n row.container.classList.toggle('active', active);\n row.toggleSorting(active);\n };\n\n const applyUsernames = (usernames: Username[] = []) => {\n _usernames = usernames;\n\n sortedList.getAll().forEach((element) => {\n if(!usernames.some((username) => username.username === element.id)) {\n sortedList.delete(element.id);\n }\n });\n\n usernames.forEach((username) => {\n if(!sortedList.has(username.username)) {\n sortedList.add(username.username);\n } else {\n const element = sortedList.get(username.username);\n sortedList.update(username.username, element);\n changeActive(element.row, !!username.pFlags.active);\n }\n });\n\n section.container.classList.toggle('hide', !sortedList.getAll().size);\n };\n\n applyUsernames(peer.usernames);\n\n listenerSetter.add(rootScope)('peer_title_edit', async({peerId: _peerId}) => {\n if(_peerId !== peerId) {\n return;\n }\n\n const peer = await managers.appPeersManager.getPeer(peerId);\n applyUsernames((peer as User.user).usernames);\n });\n\n let cancelClick = false;\n attachClickEvent(list, async(e) => {\n if(cancelClick) {\n cancelClick = false;\n return;\n }\n\n const container = findUpAsChild(e.target as HTMLElement, list);\n if(!container) {\n return;\n }\n\n if(container.dataset.editable) {\n placeCaretAtEnd(usernameInputField.input, true, true);\n return;\n }\n\n const username = container.dataset.username;\n\n const active = container.classList.contains('active');\n let titleLangKey: LangPackKey, descriptionLangKey: LangPackKey;\n if(active) {\n titleLangKey = 'UsernameDeactivateLink';\n descriptionLangKey = channelId ? 'UsernameDeactivateLinkChannelMessage' : 'UsernameDeactivateLinkProfileMessage';\n } else {\n titleLangKey = 'UsernameActivateLink';\n descriptionLangKey = channelId ? 'UsernameActivateLinkChannelMessage' : 'UsernameActivateLinkProfileMessage';\n }\n\n try {\n await confirmationPopup({\n titleLangKey,\n descriptionLangKey,\n button: {\n langKey: active ? 'Hide' : 'Show'\n }\n });\n } catch(err) {\n return;\n }\n\n const newActive = !active;\n let promise: Promise;\n if(channelId) {\n promise = managers.appChatsManager.toggleUsername(channelId, username, newActive);\n } else {\n promise = managers.appUsersManager.toggleUsername(username, newActive);\n }\n\n promise.catch((err: ApiError) => {\n if(err.type === 'USERNAMES_ACTIVE_TOO_MUCH') {\n confirmationPopup({\n titleLangKey: 'UsernameActivateErrorTitle',\n descriptionLangKey: 'UsernameActivateErrorMessage',\n button: {langKey: 'OK', isCancel: true}\n }).catch(noop);\n } else {\n console.error('turn username error', err);\n }\n });\n });\n\n new Sortable({\n list,\n middleware,\n onSort: (idx, newIdx) => {\n const username = _usernames.splice(idx, 1)[0];\n _usernames.splice(newIdx, 0, username);\n sortedList.updateList();\n // can't just update particular element, have to change indexes\n // sortedList.update(username.username);\n\n const usernames = _usernames.filter((username) => username.pFlags.active).map((username) => username.username);\n if(channelId) {\n managers.appChatsManager.reorderUsernames(channelId, usernames);\n } else {\n managers.appUsersManager.reorderUsernames(usernames);\n }\n }\n });\n\n section.content.append(list);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\ntype TargetType = HTMLElement;\nexport type OnVisibilityChangeItem = {target: TargetType, visible: boolean, entry: IntersectionObserverEntry, index: number};\nexport type OnVisibilityChange = (item: OnVisibilityChangeItem) => void;\n\nexport default class VisibilityIntersector {\n private observer: IntersectionObserver;\n private items: Map = new Map();\n private locked = false;\n\n constructor(onVisibilityChange: OnVisibilityChange, options?: IntersectionObserverInit) {\n this.observer = new IntersectionObserver((entries) => {\n if(this.locked) {\n return;\n }\n\n const changed: OnVisibilityChangeItem[] = [];\n\n entries.forEach((entry, index) => {\n const target = entry.target as TargetType;\n\n if(this.items.get(target) === entry.isIntersecting) {\n return;\n } else {\n this.items.set(target, entry.isIntersecting);\n }\n\n /* if(entry.isIntersecting) {\n console.log('ooo', entry);\n } */\n\n /* if(this.locked) {\n return;\n } */\n\n const change: typeof changed[0] = {target, visible: entry.isIntersecting, entry, index};\n\n // ! order will be incorrect so can't use it\n // changed[entry.isIntersecting ? 'unshift' : 'push'](change);\n changed.push(change);\n\n // onVisibilityChange(target, entry.isIntersecting);\n });\n\n changed.forEach((item) => {\n onVisibilityChange(item);\n });\n }, options);\n }\n\n public getVisible() {\n const items: TargetType[] = [];\n this.items.forEach((value, key) => {\n if(value) {\n items.push(key);\n }\n });\n\n return items;\n }\n\n public clearVisible() {\n const visible = this.getVisible();\n for(const target of visible) {\n this.items.set(target, false);\n }\n }\n\n public isVisible(target: TargetType) {\n return this.items.get(target);\n }\n\n public disconnect() {\n this.observer.disconnect();\n this.items.clear();\n }\n\n public refresh() {\n this.observer.disconnect();\n\n // window.requestAnimationFrame(() => {\n const targets = [...this.items.keys()];\n for(const target of targets) {\n // this.items.set(target, false);\n this.observer.observe(target);\n }\n // });\n }\n\n public refreshVisible() {\n const visible = this.getVisible();\n for(const target of visible) {\n this.observer.unobserve(target);\n }\n\n for(const target of visible) {\n this.observer.observe(target);\n }\n }\n\n public observe(target: TargetType) {\n this.items.set(target, false);\n this.observer.observe(target);\n }\n\n public unobserve(target: TargetType) {\n this.observer.unobserve(target);\n this.items.delete(target);\n }\n\n public unlock() {\n this.locked = false;\n }\n\n public unlockAndRefresh() {\n this.unlock();\n this.refresh();\n }\n\n public lock() {\n this.locked = true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport rootScope from '../lib/rootScope';\nimport appMediaPlaybackController from './appMediaPlaybackController';\nimport RangeSelector from './rangeSelector';\n\nexport default class VolumeSelector extends RangeSelector {\n private static ICONS = ['volume_off', 'volume_mute', 'volume_down', 'volume_up'];\n public btn: HTMLElement;\n protected icon: HTMLSpanElement;\n\n constructor(protected listenerSetter: ListenerSetter, protected vertical = false) {\n super({\n step: 0.01,\n min: 0,\n max: 1,\n vertical\n }, 1);\n\n this.setListeners();\n this.setHandlers({\n onScrub: currentTime => {\n const value = Math.max(Math.min(currentTime, 1), 0);\n\n // console.log('volume scrub:', currentTime, value);\n\n appMediaPlaybackController.muted = false;\n appMediaPlaybackController.volume = value;\n }\n\n /* onMouseUp: (e) => {\n cancelEvent(e.event);\n } */\n });\n\n const className = 'player-volume';\n const btn = this.btn = document.createElement('div');\n btn.classList.add('btn-icon', className);\n const icon = this.icon = document.createElement('span');\n icon.classList.add(className + '__icon');\n\n btn.append(icon, this.container);\n\n attachClickEvent(icon, this.onMuteClick, {listenerSetter: this.listenerSetter});\n this.listenerSetter.add(appMediaPlaybackController)('playbackParams', this.setVolume);\n\n this.setVolume();\n }\n\n private onMuteClick = (e?: Event) => {\n e && cancelEvent(e);\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n };\n\n public setVolume = () => {\n // const volume = video.volume;\n const {volume, muted} = appMediaPlaybackController;\n let d: string;\n let iconIndex: number;\n if(!volume || muted) {\n iconIndex = 0;\n } else if(volume > .5) {\n iconIndex = 3;\n } else if(volume > 0 && volume < .25) {\n iconIndex = 1;\n } else {\n iconIndex = 2;\n }\n\n VolumeSelector.ICONS.forEach((icon) => this.icon.classList.remove('tgico-' + icon));\n this.icon.classList.add('tgico-' + VolumeSelector.ICONS[iconIndex]);\n\n if(!this.mousedown) {\n this.setProgress(muted ? 0 : volume);\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapCustomEmoji({\n docIds,\n loadPromises,\n middleware,\n lazyLoadQueue,\n customEmojiSize,\n animationGroup\n}: {\n docIds: DocId[],\n loadPromises?: Promise[]\n} & WrapSomethingOptions) {\n const text = ' '.repeat(docIds.length);\n const entities: MessageEntity[] = [];\n docIds.forEach((docId, idx) => {\n entities.push({\n _: 'messageEntityCustomEmoji',\n offset: idx,\n length: 1,\n document_id: docId\n });\n });\n\n const wrapped = wrapRichText(text, {\n entities,\n loadPromises,\n animationGroup,\n customEmojiSize,\n middleware,\n lazyLoadQueue\n });\n\n return wrapped;\n}\n\nexport function wrapCustomEmojiAwaited(options: Parameters[0]) {\n const loadPromises: Promise[] = options.loadPromises ??= [];\n const wrapped = wrapCustomEmoji(options);\n return Promise.all(loadPromises).then(() => wrapped);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {clearBadCharsAndTrim} from '../../helpers/cleanSearchText';\nimport {formatFullSentTime} from '../../helpers/date';\nimport {simulateClickEvent, attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport formatBytes from '../../helpers/formatBytes';\nimport {MediaSizeType} from '../../helpers/mediaSizes';\nimport noop from '../../helpers/noop';\nimport {Message, MessageMedia, WebPage} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager, {Progress} from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getDownloadMediaDetails from '../../lib/appManagers/utils/download/getDownloadMediaDetails';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport {joinElementsWith} from '../../lib/langPack';\nimport {MAX_FILE_SAVE_SIZE} from '../../lib/mtproto/mtproto_config';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport rootScope from '../../lib/rootScope';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport {MediaSearchContext} from '../appMediaPlaybackController';\nimport AudioElement from '../audio';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport {MiddleEllipsisElement} from '../middleEllipsis';\nimport ProgressivePreloader from '../preloader';\nimport wrapPhoto from './photo';\nimport wrapSenderToPeer from './senderToPeer';\nimport wrapSentTime from './sentTime';\n\nrootScope.addEventListener('document_downloading', (docId) => {\n const elements = Array.from(document.querySelectorAll(`.document[data-doc-id=\"${docId}\"]`)) as HTMLElement[];\n elements.forEach((element) => {\n if(element.querySelector('.preloader-container.manual')) {\n simulateClickEvent(element);\n }\n });\n});\n\nexport default async function wrapDocument({message, withTime, fontWeight, voiceAsMusic, showSender, searchContext, loadPromises, autoDownloadSize, lazyLoadQueue, sizeType, managers = rootScope.managers, cacheContext, fontSize}: {\n message: Message.message,\n withTime?: boolean,\n fontWeight?: number,\n voiceAsMusic?: boolean,\n showSender?: boolean,\n searchContext?: MediaSearchContext,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n lazyLoadQueue?: LazyLoadQueue,\n sizeType?: MediaSizeType,\n managers?: AppManagers,\n cacheContext?: ThumbCache,\n fontSize?: number\n}): Promise {\n fontWeight ??= 500;\n sizeType ??= '' as any;\n fontSize ??= 0;\n const noAutoDownload = autoDownloadSize === 0;\n\n const doc = ((message.media as MessageMedia.messageMediaDocument).document || ((message.media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage).document) as MyDocument;\n const uploadFileName = message?.uploadingFileName;\n if(doc.type === 'audio' || doc.type === 'voice' || doc.type === 'round') {\n const audioElement = new AudioElement();\n audioElement.withTime = withTime;\n audioElement.message = message;\n audioElement.noAutoDownload = noAutoDownload;\n audioElement.lazyLoadQueue = lazyLoadQueue;\n audioElement.loadPromises = loadPromises;\n\n if(voiceAsMusic) audioElement.voiceAsMusic = voiceAsMusic;\n if(searchContext) audioElement.searchContext = searchContext;\n if(showSender) audioElement.showSender = showSender;\n\n audioElement.dataset.fontWeight = '' + fontWeight;\n audioElement.dataset.fontSize = '' + fontSize;\n audioElement.dataset.sizeType = sizeType;\n await audioElement.render();\n return audioElement;\n }\n\n const extSplitted = doc.file_name ? doc.file_name.split('.') : '';\n let ext = '';\n ext = extSplitted.length > 1 && Array.isArray(extSplitted) ?\n clearBadCharsAndTrim(extSplitted.pop().split(' ', 1)[0].toLowerCase()) :\n 'file';\n\n const docDiv = document.createElement('div');\n docDiv.classList.add('document', `ext-${ext}`);\n docDiv.dataset.docId = '' + doc.id;\n (docDiv as any).doc = doc;\n\n // return docDiv;\n\n const icoDiv = document.createElement('div');\n icoDiv.classList.add('document-ico');\n let icoTextEl: HTMLElement;\n\n const hadContext = !!cacheContext;\n const getCacheContext = () => {\n return hadContext ? cacheContext : managers.thumbsStorage.getCacheContext(doc);\n };\n\n cacheContext = await getCacheContext();\n let hasThumb = false;\n if((doc.thumbs?.length || (message.pFlags.is_outgoing && cacheContext.url && doc.type === 'photo'))/* && doc.mime_type !== 'image/gif' */) {\n docDiv.classList.add('document-with-thumb');\n hasThumb = true;\n\n const imgs: (HTMLImageElement | HTMLCanvasElement | HTMLVideoElement)[] = [];\n // ! WARNING, use thumbs for check when thumb will be generated for media\n if(message.pFlags.is_outgoing && ['photo', 'video'].includes(doc.type) && cacheContext.url) {\n icoDiv.innerHTML = ``;\n imgs.push(icoDiv.firstElementChild as HTMLImageElement);\n } else {\n const perf = performance.now();\n const wrapped = await wrapPhoto({\n photo: doc,\n message: null,\n container: icoDiv,\n boxWidth: 54,\n boxHeight: 54,\n loadPromises,\n withoutPreloader: true,\n lazyLoadQueue,\n size: choosePhotoSize(doc, 54, 54, true),\n managers\n });\n // console.log('was wrapping photo', performance.now() - perf);\n icoDiv.style.width = icoDiv.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n }\n\n imgs.forEach((img) => img.classList.add('document-thumb'));\n } else {\n icoTextEl = document.createElement('span');\n icoTextEl.classList.add('document-ico-text');\n icoTextEl.innerText = ext;\n icoDiv.append(icoTextEl);\n }\n\n // let fileName = stringMiddleOverflow(doc.file_name || 'Unknown.file', 26);\n const fileName = doc.file_name ? wrapPlainText(doc.file_name) : 'Unknown.file';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('document-description');\n const bytesContainer = document.createElement('span');\n const bytesEl = formatBytes(doc.size);\n const bytesJoiner = ' / ';\n\n const descriptionParts: (HTMLElement | string | DocumentFragment)[] = [bytesEl];\n\n if(withTime) {\n descriptionParts.push(formatFullSentTime(message.date));\n }\n\n if(showSender) {\n descriptionParts.push(await wrapSenderToPeer(message));\n }\n\n if(!withTime && !showSender) {\n const b = document.createElement('span');\n const bytesMaxEl = formatBytes(doc.size);\n b.append(bytesJoiner, bytesMaxEl);\n b.style.visibility = 'hidden';\n descriptionParts.push(b);\n }\n\n docDiv.innerHTML = `\n ${(cacheContext.downloaded && !uploadFileName) || !message.mid || !hasThumb ? '' : `
`}\n
\n
\n `;\n\n const nameDiv = docDiv.querySelector('.document-name') as HTMLElement;\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = '' + fontWeight;\n middleEllipsisEl.dataset.fontSize = '' + fontSize;\n middleEllipsisEl.dataset.sizeType = sizeType;\n middleEllipsisEl.textContent = fileName;\n // setInnerHTML(middleEllipsisEl, fileName);\n\n // * new media popup\n if(!message.mid) {\n docDiv.classList.add('downloaded');\n }\n\n nameDiv.append(middleEllipsisEl);\n\n if(showSender) {\n nameDiv.append(wrapSentTime(message));\n }\n\n const sizeDiv = docDiv.querySelector('.document-size') as HTMLElement;\n bytesContainer.append(...joinElementsWith(descriptionParts, ' · '));\n sizeDiv.append(bytesContainer);\n\n docDiv.prepend(icoDiv);\n\n if(!uploadFileName && message.pFlags.is_outgoing && !message.mid) {\n return docDiv;\n }\n\n let downloadDiv: HTMLElement, preloader: ProgressivePreloader = null;\n const onLoad = () => {\n docDiv.classList.remove('downloading');\n\n if(/* !hasThumb || */(doc.size > MAX_FILE_SAVE_SIZE && !uploadFileName)) {\n preloader.setManual();\n preloader.attach(downloadDiv);\n preloader.preloader.classList.add('manual');\n preloader.setDownloadFunction(load);\n return;\n }\n\n if(doc.size <= MAX_FILE_SAVE_SIZE) {\n docDiv.classList.add('downloaded');\n }\n\n if(downloadDiv) {\n if(downloadDiv !== icoDiv) {\n const _downloadDiv = downloadDiv;\n setTimeout(() => {\n _downloadDiv.remove();\n }, 200);\n }\n\n downloadDiv = null;\n }\n\n if(preloader) {\n preloader = null;\n }\n };\n\n const addByteProgress = (promise: CancellablePromise) => {\n docDiv.classList.add('downloading');\n\n const sizeContainer = document.createElement('span');\n const _bytesContainer = formatBytes(doc.size);\n sizeContainer.style.position = 'absolute';\n sizeContainer.style.left = '0';\n promise.then(onLoad, noop).finally(() => {\n // sizeContainer.replaceWith(bytesContainer);\n bytesContainer.style.visibility = '';\n sizeContainer.remove();\n // b && b.classList.remove('hide');\n });\n\n // b && b.classList.add('hide');\n\n const format = (bytes: number) => formatBytes(bytes);\n let d = format(0);\n bytesContainer.style.visibility = 'hidden';\n // bytesContainer.replaceWith(sizeContainer);\n sizeContainer.append(d, bytesJoiner, _bytesContainer);\n bytesContainer.parentElement.append(sizeContainer);\n promise.addNotifyListener((progress: Progress) => {\n const _d = format(progress.done);\n d.replaceWith(_d);\n d = _d;\n });\n };\n\n // ! DO NOT USE ASYNC/AWAIT HERE ! SAFARI WON'T LET DOWNLOAD THE FILE BECAUSE OF ASYNC\n const load = (e?: Event) => {\n const save = !e || e.isTrusted;\n const doc = (docDiv as any).doc;\n // const doc = await managers.appDocsManager.getDoc(docDiv.dataset.docId);\n let download: CancellablePromise;\n const queueId = appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : undefined;\n if(!save) {\n download = appDownloadManager.downloadToDisc({media: doc, queueId}, true);\n } else if(doc.type === 'pdf') {\n const canOpenAfter = /* managers.appDocsManager.downloading.has(doc.id) || */!preloader || preloader.detached;\n download = appDownloadManager.downloadMediaURL({media: doc, queueId});\n if(canOpenAfter) {\n download.then(() => {\n setTimeout(async() => { // wait for preloader animation end\n const url = (await getCacheContext()).url;\n window.open(url);\n }, rootScope.settings.animationsEnabled ? 250 : 0);\n });\n }\n } else if(MEDIA_MIME_TYPES_SUPPORTED.has(doc.mime_type) && doc.thumbs?.length) {\n download = appDownloadManager.downloadMediaURL({media: doc, queueId});\n } else {\n download = appDownloadManager.downloadToDisc({media: doc, queueId});\n }\n\n download.catch(() => {\n docDiv.classList.remove('downloading');\n });\n\n if(downloadDiv) {\n preloader.attach(downloadDiv, true, download);\n addByteProgress(download);\n }\n };\n\n const {fileName: downloadFileName} = getDownloadMediaDetails({media: doc, downloadId: '1'});\n if(await managers.apiFileManager.isDownloading(downloadFileName)) {\n downloadDiv = docDiv.querySelector('.document-download') || icoDiv;\n const promise = appDownloadManager.downloadToDisc({media: doc}, true);\n\n preloader = new ProgressivePreloader();\n preloader.attach(downloadDiv, false, promise);\n preloader.setDownloadFunction(load);\n addByteProgress(promise);\n } else if(!cacheContext.downloaded || uploadFileName) {\n downloadDiv = docDiv.querySelector('.document-download') || icoDiv;\n preloader = new ProgressivePreloader({\n isUpload: !!uploadFileName\n });\n\n if(!uploadFileName) {\n preloader.construct();\n preloader.setManual();\n preloader.attach(downloadDiv);\n preloader.setDownloadFunction(load);\n\n if(autoDownloadSize !== undefined && autoDownloadSize >= doc.size) {\n simulateClickEvent(preloader.preloader);\n }\n } else {\n const uploadPromise = appDownloadManager.getUpload(uploadFileName);\n preloader.attachPromise(uploadPromise);\n preloader.attach(downloadDiv);\n addByteProgress(uploadPromise);\n }\n }\n\n attachClickEvent(docDiv, (e) => {\n if(findUpClassName(e.target, 'time')) { // prevent downloading by clicking on time\n return;\n }\n\n if(preloader) {\n preloader.onClick(e);\n } else {\n load(e);\n }\n });\n\n return docDiv;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\n\nexport default function formatUserPhone(phone: string) {\n return '+' + formatPhoneNumber(phone).formatted;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport {Chat, ChatParticipants} from '../../layer';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport rootScope from '../../lib/rootScope';\n\nexport default async function getChatMembersString(chatId: ChatId, managers = rootScope.managers) {\n const chat: Chat = await managers.appChatsManager.getChat(chatId);\n if(chat._ === 'chatForbidden') {\n return i18n('YouWereKicked');\n }\n\n const chatFull = await managers.appProfileManager.getCachedFullChat(chatId);\n let count: number;\n if(chatFull) {\n if(chatFull._ === 'channelFull') {\n count = chatFull.participants_count;\n } else {\n count = (chatFull.participants as ChatParticipants.chatParticipants).participants?.length;\n }\n } else {\n count = (chat as Chat.chat).participants_count || (chat as any).participants?.participants.length;\n }\n\n const isBroadcast = (chat as Chat.channel).pFlags.broadcast;\n count = count || 1;\n\n const key: LangPackKey = isBroadcast ? 'Peer.Status.Subscribers' : 'Peer.Status.Member';\n return i18n(key, [numberThousandSplitter(count)]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport _limitSymbols from '../../helpers/string/limitSymbols';\nimport {Chat} from '../../layer';\nimport getPeerActiveUsernames from '../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport I18n from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../lib/rootScope';\n\ntype GetPeerTitleOptions = {\n peerId: PeerId,\n plainText?: boolean,\n onlyFirstName?: boolean,\n limitSymbols?: number,\n threadId?: number\n} & Pick;\n\nexport default async function getPeerTitle(\n options: T\n): Promise {\n const {\n peerId = rootScope.myId,\n plainText,\n onlyFirstName,\n limitSymbols,\n managers = rootScope.managers,\n threadId\n } = options;\n\n let title = '';\n if(peerId.isUser()) {\n const user = await managers.appUsersManager.getUser(peerId.toUserId());\n if(user) {\n if(user.first_name) title += user.first_name;\n if(user.last_name && (!onlyFirstName || !title)) title += ' ' + user.last_name;\n }\n\n if(!title) title = !user || user.pFlags.deleted ? I18n.format(onlyFirstName ? 'Deleted' : 'HiddenName', true) : getPeerActiveUsernames(user)[0] || '';\n else title = title.trim();\n } else {\n if(threadId) {\n const topic = await managers.dialogsStorage.getForumTopic(peerId, threadId);\n title = topic?.title || '';\n }\n\n if(!title) {\n const chat = await managers.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n title = chat?.title || '';\n }\n\n if(onlyFirstName) {\n title = title.split(' ')[0];\n }\n }\n\n if(limitSymbols !== undefined) {\n title = _limitSymbols(title, limitSymbols, limitSymbols);\n }\n\n return plainText ? title : wrapEmojiText(title) as any;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatFullSentTimeRaw} from '../../helpers/date';\nimport {User} from '../../layer';\nimport {LangPackKey, i18n} from '../../lib/langPack';\nimport {REPLIES_PEER_ID, SERVICE_PEER_ID} from '../../lib/mtproto/mtproto_config';\n\nexport default function getUserStatusString(user: User.user): HTMLElement {\n if(!user) {\n return document.createElement('span');\n }\n\n let key: LangPackKey;\n let args: any[];\n\n switch(user.id) {\n case REPLIES_PEER_ID.toUserId():\n key = 'Peer.RepliesNotifications';\n break;\n case SERVICE_PEER_ID.toUserId():\n key = 'Peer.ServiceNotifications';\n break;\n default: {\n if(user.pFlags.bot) {\n key = 'Bot';\n break;\n }\n\n if(user.pFlags.support) {\n key = 'SupportStatus';\n break;\n }\n\n switch(user.status?._) {\n case 'userStatusRecently': {\n key = 'Lately';\n break;\n }\n\n case 'userStatusLastWeek': {\n key = 'WithinAWeek';\n break;\n }\n\n case 'userStatusLastMonth': {\n key = 'WithinAMonth';\n break;\n }\n\n case 'userStatusOffline': {\n const date = user.status.was_online;\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n\n const diff = now - date;\n if(diff < 60) {\n key = 'Peer.Status.justNow';\n } else if(diff < 3600) {\n key = 'Peer.Status.minAgo';\n const c = diff / 60 | 0;\n args = [c];\n } else if(diff < 86400 && today.getDate() === new Date(date * 1000).getDate()) {\n key = 'LastSeen.HoursAgo';\n const c = diff / 3600 | 0;\n args = [c];\n } else {\n key = 'Peer.Status.LastSeenAt';\n const {dateEl, timeEl} = formatFullSentTimeRaw(date);\n args = [dateEl, timeEl];\n }\n\n break;\n }\n\n case 'userStatusOnline': {\n key = 'Online';\n break;\n }\n\n default: {\n key = 'ALongTimeAgo';\n break;\n }\n }\n\n break;\n }\n }\n\n return i18n(key, args);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport getImageFromStrippedThumb from '../../helpers/getImageFromStrippedThumb';\nimport noop from '../../helpers/noop';\nimport {Document, Photo, PhotoSize} from '../../layer';\nimport DotRenderer from '../dotRenderer';\nimport SetTransition from '../singleTransition';\n\nexport function toggleMediaSpoiler(options: {\n mediaSpoiler: HTMLElement,\n reveal: boolean,\n destroyAfter?: boolean\n}) {\n const {mediaSpoiler, reveal, destroyAfter} = options;\n SetTransition({\n element: mediaSpoiler,\n forwards: reveal,\n className: 'is-revealing',\n duration: 250,\n onTransitionEnd: () => {\n if(reveal && destroyAfter) {\n mediaSpoiler.remove();\n mediaSpoiler.middlewareHelper.destroy();\n }\n }\n });\n}\n\nexport function onMediaSpoilerClick(options: {\n mediaSpoiler: HTMLElement,\n event: Event\n}) {\n const {mediaSpoiler, event} = options;\n cancelEvent(event);\n\n if(mediaSpoiler.classList.contains('is-revealing')) {\n return;\n }\n\n const video = mediaSpoiler.parentElement.querySelector('video');\n if(video && !mediaSpoiler.parentElement.querySelector('.video-play')) {\n video.autoplay = true;\n video.play().catch(noop);\n }\n\n toggleMediaSpoiler({\n mediaSpoiler,\n reveal: true,\n destroyAfter: true\n });\n}\n\nexport function wrapMediaSpoilerWithImage(options: {\n image: Awaited>['image']\n} & Parameters[0]) {\n const {middleware, image} = options;\n if(!middleware()) {\n return;\n }\n\n image.classList.add('media-spoiler-thumbnail');\n\n const container = document.createElement('div');\n container.classList.add('media-spoiler-container');\n container.middlewareHelper = middleware.create();\n\n const dotRenderer = DotRenderer.create({\n ...options,\n middleware: container.middlewareHelper.get()\n });\n\n container.append(image, dotRenderer.canvas);\n\n return container;\n}\n\nexport default async function wrapMediaSpoiler(\n options: Omit[0], 'image'> & {\n media: Document.document | Photo.photo\n }\n) {\n const {media} = options;\n const sizes = (media as Photo.photo).sizes || (media as Document.document).thumbs;\n const thumb = sizes.find((size) => size._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n if(!thumb) {\n return;\n }\n\n const {image, loadPromise} = getImageFromStrippedThumb(media, thumb, true);\n await loadPromise;\n\n return wrapMediaSpoilerWithImage({\n ...options,\n image\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport wrapMessageActionTextNewUnsafe from './messageActionTextNewUnsafe';\n\nexport type WrapMessageActionTextOptions = {\n message: MyMessage,\n plain?: boolean\n} & WrapSomethingOptions;\n\nexport default async function wrapMessageActionTextNew(\n options: T\n): Promise {\n try {\n return await wrapMessageActionTextNewUnsafe(options) as any;\n } catch(err) {\n console.error('wrapMessageActionTextNewUnsafe error:', err);\n return options.plain ? '' : document.createElement('span') as any;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {hexaToHsla} from '../helpers/color';\nimport {TOPIC_COLORS} from '../lib/mtproto/mtproto_config';\nimport wrapAbbreviation from '../lib/richTextProcessor/wrapAbbreviation';\n\nlet svg: SVGSVGElement, span: HTMLElement, defs: HTMLElement;\nconst hadColors: Map = new Map();\nexport default function topicAvatar(color: number, content: string) {\n if(!svg) {\n defs = document.getElementById('svg-defs') as HTMLElement;\n\n const ns = 'http://www.w3.org/2000/svg';\n\n svg = document.createElementNS(ns, 'svg');\n svg.setAttributeNS(null, 'width', '26');\n svg.setAttributeNS(null, 'height', '26');\n svg.setAttributeNS(null, 'viewBox', '0 0 26 26');\n svg.classList.add('topic-icon-svg');\n\n const use = document.createElementNS(ns, 'use');\n use.setAttributeNS(null, 'href', '#topic-icon');\n svg.append(use);\n\n span = document.createElement('span');\n span.classList.add('topic-icon', 'avatar-like');\n\n const contentSpan = document.createElement('span');\n contentSpan.classList.add('topic-icon-content');\n span.append(svg, contentSpan);\n }\n\n if(!color) {\n console.error('NO TOPIC ICON COLOR!');\n color = TOPIC_COLORS[0];\n }\n\n if(!content) {\n console.error('NO TOPIC NAME!');\n content = '';\n }\n\n const hex = color.toString(16);\n\n const gradientId = `topic-icon-gradient-${color}`;\n let strokeColor = hadColors.get(color);\n if(!strokeColor) {\n const {h, s, l, a} = hexaToHsla('#' + hex);\n defs.insertAdjacentHTML('beforeend', `\n \n \n \n \n `);\n\n hadColors.set(color, strokeColor = `hsla(${h}, ${s}%, ${Math.max(0, l - 40)}%, ${a})`);\n }\n\n const clone = span.cloneNode(true) as typeof span;\n (clone.firstElementChild as HTMLElement).style.fill = `url(#${gradientId})`;\n // (clone.firstElementChild as HTMLElement).style.stroke = `var(--peer-avatar-${color}-filled)`;\n (clone.firstElementChild as HTMLElement).style.stroke = strokeColor;\n clone.lastElementChild.append(wrapAbbreviation(content, true));\n return clone;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message, MessageAction} from '../../layer';\nimport wrapUrl from '../../lib/richTextProcessor/wrapUrl';\n\nexport default function wrapJoinVoiceChatAnchor(message: Message.messageService) {\n const action = message.action as MessageAction.messageActionInviteToGroupCall;\n const {onclick, url} = wrapUrl(`tg://voicechat?chat_id=${message.peerId.toChatId()}&id=${action.call.id}&access_hash=${action.call.access_hash}`);\n if(!onclick) {\n return document.createElement('span');\n }\n\n const a = document.createElement('a');\n a.href = url;\n a.setAttribute('onclick', onclick + '(this)');\n\n return a;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {formatTime, ONE_DAY} from '../../helpers/date';\nimport htmlToSpan from '../../helpers/dom/htmlToSpan';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport formatCallDuration from '../../helpers/formatCallDuration';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport {ForumTopic, Message, MessageAction} from '../../layer';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport I18n, {FormatterArgument, FormatterArguments, i18n, join, langPack, LangPackKey, _i18n} from '../../lib/langPack';\nimport {GENERAL_TOPIC_ID} from '../../lib/mtproto/mtproto_config';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport topicAvatar from '../topicAvatar';\nimport {wrapCustomEmojiAwaited} from './customEmoji';\nimport getPeerTitle from './getPeerTitle';\nimport wrapJoinVoiceChatAnchor from './joinVoiceChatAnchor';\nimport {WrapMessageActionTextOptions} from './messageActionTextNew';\nimport wrapMessageForReply, {WrapMessageForReplyOptions} from './messageForReply';\nimport wrapPeerTitle from './peerTitle';\n\nasync function wrapLinkToMessage(options: WrapMessageForReplyOptions) {\n const wrapped = await wrapMessageForReply(options);\n\n if(options.plain) {\n return wrapped;\n }\n\n const a = document.createElement('i');\n a.dataset.savedFrom = (options.message as Message.message).peerId + '_' + (options.message as Message.message).mid;\n a.dir = 'auto';\n a.append(wrapped);\n return a;\n}\n\nfunction wrapSomeText(text: string, plain?: boolean) {\n return plain ? text : htmlToSpan(wrapEmojiText(text));\n}\n\ntype WrapTopicIconOptions = {\n topic: Pick,\n plain?: boolean\n} & WrapSomethingOptions;\nexport async function wrapTopicIcon(options: T): Promise {\n const topic = options.topic;\n\n let iconEmojiId = topic?.icon_emoji_id;\n if(topic?.id === GENERAL_TOPIC_ID) {\n iconEmojiId = '5390854796011906616';\n }\n\n if(!iconEmojiId) {\n if(options.plain) return '' as any;\n\n // if(topic?.id === GENERAL_TOPIC_ID) {\n // const span = document.createElement('span');\n // span.innerHTML = `\n // \n // \n // \n // `;\n\n // span.classList.add('topic-icon');\n\n // return span as any;\n // }\n\n return topicAvatar(topic?.icon_color, topic?.title) as any;\n }\n\n return options.plain ?\n rootScope.managers.appEmojiManager.getCustomEmojiDocument(iconEmojiId).then((doc) => doc.stickerEmojiRaw) :\n wrapCustomEmojiAwaited({\n ...options,\n docIds: [iconEmojiId]\n }).then((fragment) => {\n fragment.lastElementChild.classList.add('topic-icon');\n return fragment;\n }) as any;\n}\n\nfunction wrapMessageActionTopicIcon(options: WrapMessageActionTextOptions) {\n const action = ((options.message as Message.messageService).action as MessageAction.messageActionTopicCreate);\n return wrapTopicIcon({\n ...options,\n topic: action as any as ForumTopic.forumTopic\n });\n}\n\nasync function wrapMessageActionTopicIconAndName(options: WrapMessageActionTextOptions) {\n const action = ((options.message as Message.messageService).action as MessageAction.messageActionTopicCreate);\n const span = document.createElement('span');\n span.classList.add('topic-name');\n span.append(await wrapMessageActionTopicIcon(options), wrapSomeText(action.title, options.plain));\n return span;\n}\n\nexport default async function wrapMessageActionTextNewUnsafe(options: WrapMessageActionTextOptions) {\n const {plain, message, middleware, lazyLoadQueue, customEmojiSize, animationGroup} = options;\n const element: HTMLElement = plain ? undefined : document.createElement('span');\n const action = 'action' in message && message.action;\n\n // this.log('message action:', action);\n\n if((action as MessageAction.messageActionCustomAction).message) {\n const unsafeMessage = (action as MessageAction.messageActionCustomAction).message;\n if(plain) {\n return wrapPlainText(unsafeMessage);\n } else {\n setInnerHTML(element, wrapRichText(unsafeMessage, {noLinebreaks: true}));\n return element;\n }\n } else {\n let _ = action._;\n // let suffix = '';\n let langPackKey: LangPackKey;\n let args: Array>;\n\n const managers = rootScope.managers;\n\n const getNameDivHTML = (peerId: PeerId, plain: boolean) => {\n return plain ? getPeerTitle({peerId, plainText: plain}) : wrapPeerTitle({peerId});\n };\n\n switch(action._) {\n case 'messageActionPhoneCall': {\n _ += '.' + (action as any).type;\n\n args = [formatCallDuration(action.duration, plain)];\n break;\n }\n\n case 'messageActionGroupCall': {\n _ += '.' + (action as any).type;\n\n args = [];\n if(!_.endsWith('You') && !message.pFlags.post) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n if(action.duration !== undefined) {\n args.push(formatCallDuration(action.duration, plain));\n } else {\n args.push(wrapJoinVoiceChatAnchor(message as any));\n }\n\n break;\n }\n\n case 'messageActionInviteToGroupCall': {\n const peerIds = [message.fromId, action.users[0].toPeerId()];\n let a = 'Chat.Service.VoiceChatInvitation';\n const myId = rootScope.myId;\n if(peerIds[0] === myId) a += 'ByYou';\n else if(peerIds[1] === myId) a += 'ForYou';\n indexOfAndSplice(peerIds, myId);\n\n langPackKey = a as LangPackKey;\n args = peerIds.map((peerId) => getNameDivHTML(peerId, plain));\n args.push(wrapJoinVoiceChatAnchor(message as any));\n break;\n }\n\n case 'messageActionGroupCallScheduled': {\n const today = new Date();\n const date = new Date(action.schedule_date * 1000);\n const daysToStart = (date.getTime() - today.getTime()) / 86400e3;\n const tomorrowDate = new Date(today);\n tomorrowDate.setDate(tomorrowDate.getDate() + 1);\n\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n langPackKey = isBroadcast ? 'ChatList.Service.VoiceChatScheduled.Channel' : 'ChatList.Service.VoiceChatScheduled';\n args = [];\n const myId = rootScope.myId;\n if(message.fromId === myId) {\n langPackKey += 'You';\n } else if(!isBroadcast) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let k: LangPackKey;\n const _args: FormatterArguments = [];\n if(daysToStart < 1 && date.getDate() === today.getDate()) {\n k = 'TodayAtFormattedWithToday';\n } else if(daysToStart < 2 && date.getDate() === tomorrowDate.getDate()) {\n k = 'Time.TomorrowAt';\n } else {\n k = 'formatDateAtTime';\n _args.push(new I18n.IntlDateElement({\n date,\n options: {\n day: '2-digit',\n month: '2-digit',\n year: '2-digit'\n }\n }).element);\n }\n\n _args.push(formatTime(date));\n const t = i18n(k, _args);\n args.push(t);\n\n break;\n }\n\n case 'messageActionChatCreate': {\n const myId = rootScope.myId;\n if(message.fromId === myId) {\n _ += 'You';\n } else {\n args = [getNameDivHTML(message.fromId, plain)];\n }\n\n break;\n }\n\n case 'messageActionPinMessage': {\n const peerId = message.peerId;\n const pinnedMessage = await managers.appMessagesManager.getMessageByPeer(peerId, message.reply_to_mid);\n\n args = [\n getNameDivHTML(message.fromId, plain)\n ];\n\n if(!pinnedMessage/* || true */) {\n langPackKey = 'ActionPinnedNoText';\n\n if(message.reply_to_mid) { // refresh original message\n managers.appMessagesManager.fetchMessageReplyTo(message);\n }\n } else {\n args.push(wrapLinkToMessage({\n ...options,\n message: pinnedMessage\n }));\n }\n\n break;\n }\n\n case 'messageActionChatJoinedByRequest': {\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n if(message.pFlags.out) {\n langPackKey = isBroadcast ? 'RequestToJoinChannelApproved' : 'RequestToJoinGroupApproved';\n } else {\n langPackKey = isBroadcast ? 'ChatService.UserJoinedChannelByRequest' : 'ChatService.UserJoinedGroupByRequest';\n args = [getNameDivHTML(message.fromId, plain)];\n }\n break;\n }\n\n case 'messageActionContactSignUp':\n case 'messageActionChatReturn':\n case 'messageActionChatLeave':\n case 'messageActionChatJoined':\n case 'messageActionChatEditPhoto':\n case 'messageActionChatDeletePhoto':\n case 'messageActionChatEditVideo':\n case 'messageActionChatJoinedByLink':\n case 'messageActionChannelEditVideo':\n case 'messageActionChannelDeletePhoto': {\n args = [getNameDivHTML(message.fromId, plain)];\n break;\n }\n\n case 'messageActionChannelEditTitle':\n case 'messageActionChatEditTitle': {\n args = [];\n if(action._ === 'messageActionChatEditTitle') {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n args.push(wrapSomeText(action.title));\n break;\n }\n\n case 'messageActionChatDeleteUser':\n case 'messageActionChatAddUsers':\n case 'messageActionChatAddUser': {\n const users = (action as MessageAction.messageActionChatAddUser).users ||\n [(action as MessageAction.messageActionChatDeleteUser).user_id];\n\n args = [getNameDivHTML(message.fromId, plain)];\n\n if(users.length > 1) {\n const joined = join(\n await Promise.all(users.map((userId: UserId) => getNameDivHTML(userId.toPeerId(), plain))),\n false,\n plain\n );\n\n if(plain) {\n args.push(...joined);\n } else {\n const fragment = document.createElement('span');\n fragment.append(...joined);\n args.push(fragment);\n }\n } else {\n args.push(getNameDivHTML(users[0].toPeerId(), plain));\n }\n\n break;\n }\n\n case 'messageActionBotAllowed': {\n const anchorHTML = wrapRichText(action.domain, {\n entities: [{\n _: 'messageEntityUrl',\n length: action.domain.length,\n offset: 0\n }]\n });\n\n const node = htmlToSpan(anchorHTML);\n\n args = [node];\n break;\n }\n\n case 'messageActionPaymentSent': {\n const isRecurringInit = action.pFlags.recurring_init;\n const isRecurringUsed = action.pFlags.recurring_used;\n langPackKey = isRecurringUsed ? 'Chat.Service.PaymentSentRecurringUsedNoTitle' : (isRecurringInit ? 'Chat.Service.PaymentSentRecurringInitNoTitle' : 'Chat.Service.PaymentSent1NoTitle');\n const price = paymentsWrapCurrencyAmount(action.total_amount, action.currency);\n args = [price, getNameDivHTML(message.peerId, plain)];\n\n if(message.reply_to_mid) {\n const invoiceMessage = await managers.appMessagesManager.getMessageByPeer(\n message.reply_to?.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : message.peerId,\n message.reply_to_mid\n );\n\n if(!invoiceMessage) {\n managers.appMessagesManager.fetchMessageReplyTo(message);\n } else {\n langPackKey = isRecurringUsed ? 'Chat.Service.PaymentSentRecurringUsed' : (isRecurringInit ? 'Chat.Service.PaymentSentRecurringInit' : 'Chat.Service.PaymentSent1');\n args.push(wrapLinkToMessage({\n ...options,\n message: invoiceMessage\n }).then((el) => {\n if(el instanceof HTMLElement) {\n el.classList.add('is-receipt-link');\n }\n\n return el;\n }));\n }\n }\n\n break;\n }\n\n case 'messageActionSetMessagesTTL': {\n args = [];\n\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n if(action.period) {\n if(isBroadcast) {\n langPackKey = 'ActionTTLChannelChanged';\n } else if(message.fromId === rootScope.myId) {\n langPackKey = 'ActionTTLYouChanged';\n } else {\n langPackKey = 'ActionTTLChanged';\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let duration: ReturnType;\n if(action.period > 1814400) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n const year = 31536000;\n if(action.period >= year) {\n key = 'Years';\n args.push(action.period / year | 0);\n } else {\n key = 'Months';\n args.push(action.period / (ONE_DAY * 30) | 0);\n }\n\n duration = plain ? I18n.format(key, true, args) : i18n(key, args);\n } else {\n duration = formatCallDuration(action.period, plain);\n }\n\n args.push(duration);\n } else {\n if(isBroadcast) {\n langPackKey = 'ActionTTLChannelDisabled';\n } else if(message.fromId === rootScope.myId) {\n langPackKey = 'ActionTTLYouDisabled';\n } else {\n langPackKey = 'ActionTTLDisabled';\n args.push(getNameDivHTML(message.fromId, plain));\n }\n }\n break;\n }\n\n case 'messageActionTopicEdit': {\n let iconElement: (typeof args)[0];\n let titleElement: typeof iconElement;\n let authorElement: ReturnType;\n const isMe = !!message.pFlags.out;\n const isIconChanged = action.icon_emoji_id !== undefined;\n const isIconRemoved = isIconChanged && !+action.icon_emoji_id;\n const isTitleChanged = action.title !== undefined;\n const isHiddenChanged = action.hidden !== undefined;\n\n if(!isMe) {\n authorElement = getNameDivHTML(message.fromId, plain);\n }\n\n if(isTitleChanged) {\n titleElement = wrapSomeText(action.title);\n }\n\n if(isIconChanged && !isIconRemoved) {\n iconElement = wrapMessageActionTopicIcon(options);\n }\n\n args = authorElement ? [authorElement] : [];\n\n if(action.closed) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Paused' : 'Chat.Service.Group.TopicEdited.Paused';\n } else if(action.closed === false) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Resumed' : 'Chat.Service.Group.TopicEdited.Resumed';\n } else if(isIconRemoved && isTitleChanged) {\n langPackKey = isMe ? 'Chat.Service.TopicEdited.You.Mixed.IconRemoved' : 'Chat.Service.TopicEdited.Mixed.IconRemoved';\n args.push(titleElement);\n } else if(isIconChanged && isTitleChanged) {\n langPackKey = isMe ? 'Chat.Service.TopicEdited.You.Mixed' : 'Chat.Service.TopicEdited.Mixed';\n args.push(wrapMessageActionTopicIconAndName(options));\n } else if(isIconRemoved) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Icon.Removed' : 'Chat.Service.Group.TopicEdited.Icon.Removed';\n } else if(isTitleChanged) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Title' : 'Chat.Service.Group.TopicEdited.Title';\n args.push(titleElement);\n } else if(isIconChanged) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Icon' : 'Chat.Service.Group.TopicEdited.Icon';\n args.push(iconElement);\n } else if(isHiddenChanged) {\n langPackKey = isMe ?\n (action.hidden ? 'Chat.Service.Group.TopicEdited.You.Hided' : 'Chat.Service.Group.TopicEdited.You.Unhided') :\n (action.hidden ? 'Chat.Service.Group.TopicEdited.Hided' : 'Chat.Service.Group.TopicEdited.Unhided');\n }\n\n break;\n }\n\n case 'messageActionTopicCreate': {\n args = [wrapMessageActionTopicIconAndName(options)];\n langPackKey = 'TopicWasCreatedAction';\n break;\n }\n\n default:\n langPackKey = (langPack[_] || `[${action._}]`) as any;\n break;\n }\n\n if(!langPackKey) {\n langPackKey = langPack[_];\n if(langPackKey === undefined) {\n langPackKey = '[' + _ + ']' as any;\n }\n }\n\n const waited = args && await Promise.all(args);\n\n if(plain) {\n return I18n.format(langPackKey, true, waited);\n } else {\n return _i18n(element, langPackKey, waited);\n }\n\n // str = !langPackKey || langPackKey[0].toUpperCase() === langPackKey[0] ? langPackKey : getNameDivHTML(message.fromId) + langPackKey + (suffix ? ' ' : '');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport assumeType from '../../helpers/assumeType';\nimport htmlToDocumentFragment from '../../helpers/dom/htmlToDocumentFragment';\nimport {getRestrictionReason} from '../../helpers/restrictions';\nimport escapeRegExp from '../../helpers/string/escapeRegExp';\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {Message, DocumentAttribute, DraftMessage} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {MyDraftMessage} from '../../lib/appManagers/appDraftsManager';\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport isMessageRestricted from '../../lib/appManagers/utils/messages/isMessageRestricted';\nimport I18n, {LangPackKey, i18n, UNSUPPORTED_LANG_PACK_KEY} from '../../lib/langPack';\nimport sortEntities from '../../lib/richTextProcessor/sortEntities';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport {Modify} from '../../types';\nimport wrapMessageActionTextNew, {WrapMessageActionTextOptions} from './messageActionTextNew';\n\nexport type WrapMessageForReplyOptions = Modify & {\n text?: string,\n usingMids?: number[],\n highlightWord?: string,\n withoutMediaType?: boolean\n};\n\n// export default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string, usingMids: number[], plain: true, highlightWord?: string, withoutMediaType?: boolean): Promise;\n// export default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text?: string, usingMids?: number[], plain?: false, highlightWord?: string, withoutMediaType?: boolean): Promise;\n// export default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string = (message as Message.message).message, usingMids?: number[], plain?: boolean, highlightWord?: string, withoutMediaType?: boolean): Promise {\nexport default async function wrapMessageForReply(\n options: T\n): Promise {\n let {message, text, usingMids, plain, highlightWord, withoutMediaType} = options;\n text ??= (message as Message.message).message;\n\n const parts: (Node | string)[] = [];\n\n let hasAlbumKey = false;\n const addPart = (langKey: LangPackKey, part?: string | HTMLElement | DocumentFragment) => {\n if(langKey) {\n if(part === undefined && hasAlbumKey) {\n return;\n }\n\n part = plain ? I18n.format(langKey, true) : i18n(langKey);\n }\n\n if(plain) {\n parts.push(part);\n } else {\n const el = document.createElement('span');\n if(typeof(part) === 'string') el.innerHTML = part;\n else el.append(part);\n parts.push(el);\n }\n };\n\n const managers = rootScope.managers;\n const appMessagesManager = managers.appMessagesManager;\n\n const isRestricted = isMessageRestricted(message as any);\n\n let entities = (message as Message.message).totalEntities ?? (message as DraftMessage.draftMessage).entities;\n if((message as Message.message).media && !isRestricted) {\n assumeType(message);\n let usingFullAlbum = true;\n if(message.grouped_id) {\n if(usingMids) {\n const mids = await appMessagesManager.getMidsByMessage(message);\n if(usingMids.length === mids.length) {\n for(const mid of mids) {\n if(!usingMids.includes(mid)) {\n usingFullAlbum = false;\n break;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n }\n\n if(usingFullAlbum) {\n const albumText = await appMessagesManager.getAlbumText(message.grouped_id);\n text = albumText?.message || '';\n entities = albumText?.totalEntities || [];\n\n if(!withoutMediaType) {\n addPart('AttachAlbum');\n hasAlbumKey = true;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n\n if((!usingFullAlbum && !withoutMediaType) || !text) {\n const media = message.media;\n switch(media._) {\n case 'messageMediaPhoto':\n addPart('AttachPhoto');\n break;\n case 'messageMediaDice':\n addPart(undefined, plain ? media.emoticon : wrapEmojiText(media.emoticon));\n break;\n case 'messageMediaVenue': {\n text = media.title;\n addPart('AttachLocation');\n break;\n }\n case 'messageMediaGeo':\n addPart('AttachLocation');\n break;\n case 'messageMediaGeoLive':\n addPart('AttachLiveLocation');\n break;\n case 'messageMediaPoll':\n const f = '📊' + ' ' + (media.poll.question || 'poll');\n addPart(undefined, plain ? f : wrapEmojiText(f));\n break;\n case 'messageMediaContact':\n addPart('AttachContact');\n break;\n case 'messageMediaGame': {\n const f = '🎮' + ' ' + media.game.title;\n addPart(undefined, plain ? f : wrapEmojiText(f));\n break;\n }\n case 'messageMediaDocument': {\n const document = media.document as MyDocument;\n\n if(document.type === 'video') {\n addPart('AttachVideo');\n } else if(document.type === 'voice') {\n addPart('AttachAudio');\n } else if(document.type === 'gif') {\n addPart('AttachGif');\n } else if(document.type === 'round') {\n addPart('AttachRound');\n } else if(document.type === 'sticker') {\n const i = parts.length;\n if(document.stickerEmojiRaw) {\n const f = document.stickerEmojiRaw + ' ';\n addPart(undefined, plain ? f : wrapEmojiText(f));\n }\n\n addPart('AttachSticker');\n\n // will combine two parts into one\n const p = parts.splice(i, 2);\n if(plain) parts.push((p[0] as string) + (p[1] ? p[1] as string : ''));\n else {\n const span = window.document.createElement('span');\n span.append(...p);\n parts.push(span);\n }\n\n text = '';\n } else if(document.type === 'audio') {\n const attribute = document.attributes.find((attribute) => attribute._ === 'documentAttributeAudio' && (attribute.title || attribute.performer)) as DocumentAttribute.documentAttributeAudio;\n const f = '🎵' + ' ' + (attribute ? [attribute.title, attribute.performer].filter(Boolean).join(' - ') : document.file_name);\n addPart(undefined, plain ? f : wrapEmojiText(f));\n } else {\n addPart(undefined, plain ? document.file_name : wrapEmojiText(document.file_name));\n }\n\n break;\n }\n\n case 'messageMediaInvoice': {\n if(media.extended_media?._ === 'messageExtendedMediaPreview') {\n addPart(undefined, plain ? media.description : wrapEmojiText(media.description));\n } else {\n addPart(undefined, plain ? media.title : wrapEmojiText(media.title));\n }\n\n break;\n }\n\n case 'messageMediaUnsupported': {\n addPart(UNSUPPORTED_LANG_PACK_KEY);\n break;\n }\n\n default:\n // messageText += media._;\n // /////appMessagesManager.log.warn('Got unknown media type!', message);\n break;\n }\n }\n\n const length = parts.length;\n for(let i = 1; i < length; i += 2) {\n parts.splice(i, 0, ', ');\n }\n\n if(text && length) {\n parts.push(', ');\n }\n }\n\n if((message as Message.messageService).action) {\n const actionWrapped = await wrapMessageActionTextNew({message: (message as Message.messageService), plain});\n if(actionWrapped) {\n addPart(undefined, actionWrapped);\n }\n }\n\n if(isRestricted) {\n text = getRestrictionReason((message as Message.message).restriction_reason).text;\n entities = [];\n }\n\n if(text) {\n text = limitSymbols(text, 100);\n\n if(!entities) {\n entities = [];\n }\n\n if(plain) {\n parts.push(wrapPlainText(text, entities));\n } else {\n // let entities = parseEntities(text.replace(/\\n/g, ' '));\n\n if(highlightWord) {\n highlightWord = highlightWord.trim();\n let found = false;\n let match: any;\n const regExp = new RegExp(escapeRegExp(highlightWord), 'gi');\n entities = entities.slice(); // fix leaving highlight entity\n while((match = regExp.exec(text)) !== null) {\n entities.push({_: 'messageEntityHighlight', length: highlightWord.length, offset: match.index});\n found = true;\n }\n\n if(found) {\n sortEntities(entities);\n }\n }\n\n const messageWrapped = wrapRichText(text, {\n noLinebreaks: true,\n entities,\n noLinks: true,\n noTextFormat: true\n });\n\n parts.push(htmlToDocumentFragment(messageWrapped));\n }\n }\n\n if(plain) {\n return parts.join('') as any;\n } else {\n const fragment = document.createDocumentFragment();\n fragment.append(...parts);\n return fragment as any;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PeerTitle, {PeerTitleOptions} from '../peerTitle';\n\nexport default async function wrapPeerTitle(options: PeerTitleOptions) {\n const peerTitle = new PeerTitle();\n await peerTitle.update(options);\n return peerTitle.element;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport renderMediaWithFadeIn from '../../helpers/dom/renderMediaWithFadeIn';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Message, PhotoSize, VideoSize, WebDocument} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../../lib/appManagers/appPhotosManager';\nimport rootScope from '../../lib/rootScope';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ProgressivePreloader from '../preloader';\nimport blur from '../../helpers/blur';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getStrippedThumbIfNeeded from '../../helpers/getStrippedThumbIfNeeded';\nimport setAttachmentSize from '../../helpers/setAttachmentSize';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport isWebDocument from '../../lib/appManagers/utils/webDocs/isWebDocument';\nimport createVideo from '../../helpers/dom/createVideo';\nimport noop from '../../helpers/noop';\nimport {THUMB_TYPE_FULL} from '../../lib/mtproto/mtproto_config';\nimport {Middleware} from '../../helpers/middleware';\n\nexport default async function wrapPhoto({photo, message, container, boxWidth, boxHeight, withTail, isOut, lazyLoadQueue, middleware, size, withoutPreloader, loadPromises, autoDownloadSize, noBlur, noThumb, noFadeIn, blurAfter, managers = rootScope.managers, processUrl}: {\n photo: MyPhoto | MyDocument | WebDocument,\n message?: Message.message | Message.messageService,\n container: HTMLElement,\n boxWidth?: number,\n boxHeight?: number,\n withTail?: boolean,\n isOut?: boolean,\n lazyLoadQueue?: LazyLoadQueue,\n middleware?: Middleware,\n size?: PhotoSize | VideoSize,\n withoutPreloader?: boolean,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n noBlur?: boolean,\n noThumb?: boolean,\n noFadeIn?: boolean,\n blurAfter?: boolean,\n managers?: AppManagers,\n processUrl?: (url: string) => Promise\n}) {\n const ret = {\n loadPromises: {\n thumb: Promise.resolve() as Promise,\n full: Promise.resolve() as Promise\n },\n images: {\n thumb: null as HTMLImageElement | HTMLCanvasElement,\n full: null as HTMLVideoElement | HTMLImageElement\n },\n preloader: null as ProgressivePreloader,\n aspecter: null as HTMLElement\n };\n\n const isDocument = photo._ === 'document';\n const isImageFromDocument = isDocument && photo.mime_type.startsWith('image/') && !size;\n const isWebDoc = isWebDocument(photo);\n if(!((photo as MyPhoto).sizes || (photo as MyDocument).thumbs) && !isWebDoc && !isImageFromDocument) {\n if(boxWidth && boxHeight && !size && isDocument) {\n setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message);\n }\n\n return ret;\n }\n\n let noAutoDownload = autoDownloadSize === 0;\n\n if(!size) {\n if(boxWidth === undefined) boxWidth = mediaSizes.active.regular.width;\n if(boxHeight === undefined) boxHeight = mediaSizes.active.regular.height;\n }\n\n container.classList.add('media-container');\n let aspecter = container;\n\n let isFit = true;\n let loadThumbPromise: Promise = Promise.resolve();\n let thumbImage: HTMLImageElement | HTMLCanvasElement;\n // let image: HTMLImageElement;\n let cacheContext: ThumbCache;\n // if(withTail) {\n // image = wrapMediaWithTail(photo, message, container, boxWidth, boxHeight, isOut);\n // } else {\n\n if(boxWidth && boxHeight && !size) { // !album\n const set = setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message, undefined, isImageFromDocument ? {\n _: 'photoSize',\n w: photo.w,\n h: photo.h,\n size: photo.size,\n type: THUMB_TYPE_FULL\n } : undefined);\n size = set.photoSize;\n isFit = set.isFit;\n cacheContext = await managers.thumbsStorage.getCacheContext(photo, size.type);\n\n if(!isFit && !isWebDoc) {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-container-aspecter');\n aspecter.style.width = set.size.width + 'px';\n aspecter.style.height = set.size.height + 'px';\n\n const gotThumb = getStrippedThumbIfNeeded(photo, cacheContext, !noBlur, true);\n if(gotThumb) {\n loadThumbPromise = gotThumb.loadPromise;\n const thumbImage = gotThumb.image; // local scope\n thumbImage.classList.add('media-photo');\n container.append(thumbImage);\n } else {\n const res = await wrapPhoto({\n container,\n message,\n photo,\n boxWidth: 0,\n boxHeight: 0,\n size,\n lazyLoadQueue,\n isOut,\n loadPromises,\n middleware,\n withoutPreloader,\n withTail,\n autoDownloadSize,\n noBlur,\n noThumb: true,\n blurAfter: true,\n managers\n // noFadeIn: true\n });\n const thumbImage = res.images.full;\n thumbImage.classList.add('media-photo', 'thumbnail');\n // container.append(thumbImage);\n }\n\n container.classList.add('media-container-fitted');\n container.append(aspecter);\n }\n } else {\n if(!size) {\n size = choosePhotoSize(photo, boxWidth, boxHeight, true);\n }\n\n cacheContext = await managers.thumbsStorage.getCacheContext(photo, size?.type);\n }\n\n if(!noThumb && !isWebDoc) {\n const gotThumb = getStrippedThumbIfNeeded(photo, cacheContext, !noBlur);\n if(gotThumb) {\n loadThumbPromise = Promise.all([loadThumbPromise, gotThumb.loadPromise]);\n ret.loadPromises.thumb = ret.loadPromises.full = loadThumbPromise;\n thumbImage = ret.images.thumb = gotThumb.image;\n thumbImage.classList.add('media-photo');\n aspecter.append(thumbImage);\n }\n }\n // }\n\n ret.aspecter = aspecter;\n\n if((size?._ === 'photoSizeEmpty' && isDocument) || (size as PhotoSize.photoStrippedSize)?.bytes) {\n return ret;\n }\n\n let media: HTMLVideoElement | HTMLImageElement;\n if(size?._ === 'videoSize') {\n media = ret.images.full = createVideo();\n media.autoplay = true;\n media.loop = true;\n media.muted = true;\n media.classList.add('media-photo');\n } else {\n media = ret.images.full = new Image();\n media.classList.add('media-photo');\n }\n\n // console.log('wrapPhoto downloaded:', photo, photo.downloaded, container);\n\n const needFadeIn = (thumbImage || !cacheContext.downloaded) && rootScope.settings.animationsEnabled && !noFadeIn;\n\n let preloader: ProgressivePreloader;\n const uploadingFileName = (message as Message.message)?.uploadingFileName;\n if(!withoutPreloader) {\n if(!cacheContext.downloaded || uploadingFileName) {\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend',\n isUpload: !!uploadingFileName\n });\n }\n\n if(uploadingFileName) { // means upload\n preloader.attachPromise(appDownloadManager.getUpload(uploadingFileName));\n preloader.attach(container);\n noAutoDownload = undefined;\n }\n }\n\n\n const getDownloadPromise = () => {\n // const promise = isGif && !size ?\n // managers.appDocsManager.downloadDoc(photo, /* undefined, */lazyLoadQueue?.queueId) :\n // managers.appPhotosManager.preloadPhoto(photo, size, lazyLoadQueue?.queueId, noAutoDownload);\n const haveToDownload = isImageFromDocument && !size;\n const promise = appDownloadManager.downloadMediaURL({\n media: photo,\n thumb: size,\n queueId: lazyLoadQueue?.queueId,\n onlyCache: haveToDownload ? undefined : noAutoDownload\n });\n\n return promise;\n };\n\n const renderOnLoad = (url: string) => {\n return renderMediaWithFadeIn(container, media, url, needFadeIn, aspecter, thumbImage);\n };\n\n const onLoad = async(url: string) => {\n if(middleware && !middleware()) return;\n\n if(processUrl) {\n url = await processUrl(url);\n }\n\n if(blurAfter) {\n const result = blur(url, 12);\n return result.promise.then(() => {\n // image = result.canvas;\n return renderOnLoad(result.canvas.toDataURL());\n });\n }\n\n return renderOnLoad(url);\n };\n\n let loadPromise: Promise;\n const canAttachPreloader = (\n (size as PhotoSize.photoSize).w >= 150 &&\n (size as PhotoSize.photoSize).h >= 150\n ) || noAutoDownload;\n const load = async() => {\n if(noAutoDownload && !withoutPreloader && preloader) {\n preloader.construct();\n preloader.setManual();\n }\n\n const promise = getDownloadPromise();\n const cacheContext = await managers.thumbsStorage.getCacheContext(photo, size?.type);\n if(\n preloader &&\n !cacheContext.downloaded &&\n !withoutPreloader &&\n canAttachPreloader\n ) {\n preloader.attach(container, false, promise);\n }\n\n noAutoDownload = undefined;\n\n const renderPromise = promise.then(onLoad);\n renderPromise.catch(noop);\n return {download: promise, render: renderPromise};\n };\n\n if(preloader) {\n preloader.setDownloadFunction(load);\n }\n\n if(cacheContext.downloaded) {\n loadThumbPromise = loadPromise = (await load()).render;\n } else {\n if(!lazyLoadQueue) loadPromise = (await load()).render;\n /* else if(noAutoDownload) {\n preloader.construct();\n preloader.setManual();\n preloader.attach(container);\n } */ else lazyLoadQueue.push({div: container, load: () => load().then(({download}) => download)});\n }\n\n if(loadPromises && loadThumbPromise) {\n loadPromises.push(loadThumbPromise);\n }\n\n // const perf = performance.now();\n await loadThumbPromise;\n ret.loadPromises.thumb = loadThumbPromise;\n ret.loadPromises.full = loadPromise || Promise.resolve();\n ret.preloader = preloader;\n\n // const elapsedTime = performance.now() - perf;\n // if(elapsedTime > 4) {\n // console.log('wrapping photo thumb time', elapsedTime, photo, size);\n // }\n\n return ret;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport getMessageSenderPeerIdOrName from '../../lib/appManagers/utils/messages/getMessageSenderPeerIdOrName';\nimport {i18n} from '../../lib/langPack';\nimport rootScope from '../../lib/rootScope';\nimport wrapPeerTitle from './peerTitle';\n\nexport default async function wrapSenderToPeer(message: MyMessage) {\n const senderTitle: HTMLElement = document.createElement('span');\n senderTitle.classList.add('sender-title');\n\n const fromMe = message.fromId === rootScope.myId && message.peerId !== rootScope.myId;\n senderTitle.append(\n fromMe ?\n i18n('FromYou') :\n await wrapPeerTitle({\n ...getMessageSenderPeerIdOrName(message),\n dialog: message.peerId === rootScope.myId\n })\n );\n\n if(await rootScope.managers.appPeersManager.isAnyGroup(message.peerId) || fromMe) {\n const peerTitle = await wrapPeerTitle({peerId: message.peerId});\n senderTitle.append(' ➝ ', peerTitle);\n }\n\n return senderTitle;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatDateAccordingToTodayNew} from '../../helpers/date';\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\n\nexport default function wrapSentTime(message: MyMessage) {\n const el: HTMLElement = document.createElement('span');\n el.classList.add('sent-time');\n el.append(formatDateAccordingToTodayNew(new Date(message.date * 1000)));\n\n return el;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\nimport assumeType from '../../helpers/assumeType';\nimport getPathFromBytes from '../../helpers/bytes/getPathFromBytes';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport computeLockColor from '../../helpers/computeLockColor';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport renderImageFromUrl, {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport getImageFromStrippedThumb from '../../helpers/getImageFromStrippedThumb';\nimport getPreviewURLFromThumb from '../../helpers/getPreviewURLFromThumb';\nimport makeError from '../../helpers/makeError';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport {isSavingLottiePreview, saveLottiePreview} from '../../helpers/saveLottiePreview';\nimport throttle from '../../helpers/schedulers/throttle';\nimport sequentialDom from '../../helpers/sequentialDom';\nimport {PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport type RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport webpWorkerController from '../../lib/webp/webpWorkerController';\nimport {Awaited, SendMessageEmojiInteractionData} from '../../types';\nimport {getEmojiToneIndex} from '../../vendor/emoji';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport PopupStickers from '../popups/stickers';\nimport {hideToast, toastNew} from '../toast';\nimport wrapStickerAnimation from './stickerAnimation';\nimport framesCache from '../../helpers/framesCache';\n\n// https://github.com/telegramdesktop/tdesktop/blob/master/Telegram/SourceFiles/history/view/media/history_view_sticker.cpp#L40\nexport const STICKER_EFFECT_MULTIPLIER = 1 + 0.245 * 2;\nconst EMOJI_EFFECT_MULTIPLIER = 3;\n\nconst locksUrls: {[docId: string]: string} = {};\n\nexport const videosCache: {[key: string]: Promise} = {};\n\nexport default async function wrapSticker({doc, div, middleware, loadStickerMiddleware, lazyLoadQueue, exportLoad, group, play, onlyThumb, emoji, width, height, withThumb, loop, loadPromises, needFadeIn, needUpscale, skipRatio, static: asStatic, managers = rootScope.managers, fullThumb, isOut, noPremium, withLock, relativeEffect, loopEffect, isCustomEmoji, syncedVideo}: {\n doc: MyDocument,\n div: HTMLElement | HTMLElement[],\n middleware?: Middleware,\n loadStickerMiddleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n exportLoad?: number,\n group?: AnimationItemGroup,\n play?: boolean,\n onlyThumb?: boolean,\n emoji?: string,\n width?: number,\n height?: number,\n withThumb?: boolean,\n loop?: RLottiePlayer['loop'],\n loadPromises?: Promise[],\n needFadeIn?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n static?: boolean,\n managers?: AppManagers,\n fullThumb?: PhotoSize | VideoSize,\n isOut?: boolean,\n noPremium?: boolean,\n withLock?: boolean,\n relativeEffect?: boolean,\n loopEffect?: boolean,\n isCustomEmoji?: boolean,\n syncedVideo?: boolean\n}) {\n div = Array.isArray(div) ? div : [div];\n\n if(isCustomEmoji) {\n emoji = doc.stickerEmojiRaw;\n }\n\n const stickerType = doc.sticker;\n if(stickerType === 1) {\n asStatic = true;\n }\n\n if(!width && !height) {\n const sizes = mediaSizes.active;\n const boxSize = emoji ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\n const size = makeMediaSize(doc.w, doc.h).aspectFitted(boxSize);\n width = size.width;\n height = size.height;\n }\n\n if(stickerType === 2) {\n // LottieLoader.loadLottie();\n lottieLoader.loadLottieWorkers();\n }\n\n div.forEach((div) => {\n div.dataset.docId = '' + doc.id;\n if(emoji) {\n div.dataset.stickerEmoji = emoji;\n }\n\n div.classList.add('media-sticker-wrapper');\n });\n\n /* if(stickerType === 3) {\n const videoRes = wrapVideo({\n doc,\n boxWidth: width,\n boxHeight: height,\n container: div,\n group,\n lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n loadPromises,\n noPlayButton: true,\n noInfo: true\n });\n\n if(videoRes.thumb) {\n if(videoRes.thumb.images.thumb) {\n videoRes.thumb.images.thumb.classList.add('media-sticker', 'thumbnail');\n }\n\n if(videoRes.thumb.images.full) {\n videoRes.thumb.images.full.classList.add('media-sticker');\n }\n }\n\n return videoRes.loadPromise;\n } */\n\n // console.log('wrap sticker', doc, div, onlyThumb);\n\n let cacheContext: ThumbCache;\n const getCacheContext = async(type: string = cacheContext?.type) => {\n return cacheContext = await managers.thumbsStorage.getCacheContext(doc, type);\n };\n\n const isAnimated = !asStatic && (stickerType === 2 || stickerType === 3);\n\n const effectThumb = getStickerEffectThumb(doc);\n if(isOut !== undefined && effectThumb && !isOut) {\n div.forEach((div) => div.classList.add('reflect-x'));\n }\n\n const willHaveLock = effectThumb && withLock;\n if(willHaveLock) {\n const lockUrl = locksUrls[doc.id];\n div.forEach((div) => {\n div.classList.add('is-premium-sticker', 'tgico-premium_lock');\n lockUrl && div.style.setProperty('--lock-url', `url(${lockUrl})`);\n });\n }\n\n if(asStatic && stickerType !== 1) {\n const thumb = choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\n await getCacheContext(thumb.type);\n } else {\n await getCacheContext(fullThumb?.type);\n }\n\n const toneIndex = emoji && !isCustomEmoji ? getEmojiToneIndex(emoji) : -1;\n const downloaded = cacheContext.downloaded && !needFadeIn;\n\n const isThumbNeededForType = isAnimated;\n const lottieCachedThumb = stickerType === 2 || stickerType === 3 ? await managers.appDocsManager.getLottieCachedThumb(doc.id, toneIndex) : undefined;\n\n const ret = {render: undefined as typeof loadPromise, load: undefined as typeof load};\n let loadThumbPromise = deferredPromise();\n let haveThumbCached = false;\n if((\n doc.thumbs?.length ||\n lottieCachedThumb\n ) &&\n !div[0].firstElementChild && (\n !downloaded ||\n isThumbNeededForType ||\n onlyThumb\n ) && withThumb !== false/* && doc.thumbs[0]._ !== 'photoSizeEmpty' */\n ) {\n let thumb = lottieCachedThumb || doc.thumbs[0];\n\n // console.log('wrap sticker', thumb, div);\n\n const afterRender = (div: HTMLElement, thumbImage: HTMLElement) => {\n if(!div.childElementCount) {\n thumbImage.classList.add('media-sticker', 'thumbnail');\n\n sequentialDom.mutateElement(div, () => {\n div.append(thumbImage);\n loadThumbPromise.resolve();\n });\n } else {\n loadThumbPromise.resolve();\n }\n };\n\n if('url' in thumb) {\n haveThumbCached = true;\n div.forEach((div) => {\n const thumbImage = new Image();\n renderImageFromUrl(thumbImage, (thumb as any).url, () => afterRender(div, thumbImage));\n });\n } else if('bytes' in thumb) {\n if(thumb._ === 'photoPathSize') {\n if(!thumb.bytes.length) {\n thumb = doc.thumbs.find((t) => (t as PhotoSize.photoStrippedSize).bytes?.length) || thumb;\n }\n\n const d = getPathFromBytes((thumb as PhotoSize.photoStrippedSize).bytes);\n const ns = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(ns, 'svg');\n svg.classList.add('rlottie-vector', 'media-sticker', 'thumbnail');\n svg.setAttributeNS(null, 'viewBox', `0 0 ${doc.w || 512} ${doc.h || 512}`);\n\n // const defs = document.createElementNS(ns, 'defs');\n // const linearGradient = document.createElementNS(ns, 'linearGradient');\n // linearGradient.setAttributeNS(null, 'id', 'g');\n // linearGradient.setAttributeNS(null, 'x1', '-300%');\n // linearGradient.setAttributeNS(null, 'x2', '-200%');\n // linearGradient.setAttributeNS(null, 'y1', '0');\n // linearGradient.setAttributeNS(null, 'y2', '0');\n // const stops = [\n // ['-10%', '.1'],\n // ['30%', '.07'],\n // ['70%', '.07'],\n // ['110%', '.1']\n // ].map(([offset, stopOpacity]) => {\n // const stop = document.createElementNS(ns, 'stop');\n // stop.setAttributeNS(null, 'offset', offset);\n // stop.setAttributeNS(null, 'stop-opacity', stopOpacity);\n // return stop;\n // });\n // const animates = [\n // ['-300%', '1200%'],\n // ['-200%', '1300%']\n // ].map(([from, to], idx) => {\n // const animate = document.createElementNS(ns, 'animate');\n // animate.setAttributeNS(null, 'attributeName', 'x' + (idx + 1));\n // animate.setAttributeNS(null, 'from', from);\n // animate.setAttributeNS(null, 'to', to);\n // animate.setAttributeNS(null, 'dur', '3s');\n // animate.setAttributeNS(null, 'repeatCount', 'indefinite');\n // return animate;\n // });\n // linearGradient.append(...stops, ...animates);\n // defs.append(linearGradient);\n // svg.append(defs);\n\n const path = document.createElementNS(ns, 'path');\n path.setAttributeNS(null, 'd', d);\n if(rootScope.settings.animationsEnabled && !isCustomEmoji) path.setAttributeNS(null, 'fill', 'url(#g)');\n svg.append(path);\n div.forEach((div, idx) => div.append(idx > 0 ? svg.cloneNode(true) : svg));\n haveThumbCached = true;\n loadThumbPromise.resolve();\n } else if(toneIndex <= 0) {\n const r = () => {\n (div as HTMLElement[]).forEach((div) => {\n const thumbImage = new Image();\n const url = getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true);\n renderImageFromUrl(thumbImage, url, () => afterRender(div, thumbImage));\n });\n };\n\n if((IS_WEBP_SUPPORTED || doc.pFlags.stickerThumbConverted || cacheContext.url)/* && false */) {\n haveThumbCached = true;\n r();\n } else {\n haveThumbCached = true;\n webpWorkerController.convert('main-' + doc.id, thumb.bytes).then((bytes) => {\n managers.appDocsManager.saveWebPConvertedStrippedThumb(doc.id, bytes);\n (thumb as PhotoSize.photoStrippedSize).bytes = bytes;\n doc.pFlags.stickerThumbConverted = true;\n\n if((middleware && !middleware()) || (div as HTMLElement[])[0].childElementCount) {\n loadThumbPromise.resolve();\n return;\n }\n\n r();\n }).catch(() => loadThumbPromise.resolve());\n }\n }\n } else if(((stickerType === 2 && toneIndex <= 0) || stickerType === 3) && (withThumb || onlyThumb)) {\n const load = async() => {\n if((div as HTMLElement[])[0].childElementCount || (middleware && !middleware())) {\n loadThumbPromise.resolve();\n return;\n }\n\n const r = (div: HTMLElement, thumbImage: HTMLElement, url: string) => {\n if(div.childElementCount || (middleware && !middleware())) {\n loadThumbPromise.resolve();\n return;\n }\n\n if(!url) afterRender(div, thumbImage);\n else renderImageFromUrl(thumbImage, url, () => afterRender(div, thumbImage));\n };\n\n await getCacheContext();\n (div as HTMLElement[]).forEach((div) => {\n if(cacheContext.url) {\n r(div, new Image(), cacheContext.url);\n } else if('bytes' in thumb) {\n const res = getImageFromStrippedThumb(doc, thumb as PhotoSize.photoStrippedSize, true);\n res.loadPromise.then(() => r(div, res.image, ''));\n\n // return managers.appDocsManager.getThumbURL(doc, thumb as PhotoSize.photoStrippedSize).promise.then(r);\n } else {\n appDownloadManager.downloadMediaURL({\n media: doc,\n thumb: thumb as PhotoSize\n }).then(async(url) => {\n return r(div, new Image(), url);\n });\n }\n });\n };\n\n if(lazyLoadQueue && onlyThumb) {\n lazyLoadQueue.push({div: div[0], load});\n loadThumbPromise.resolve();\n return ret;\n } else {\n load();\n\n if((thumb as any).url) {\n haveThumbCached = true;\n }\n }\n }\n }\n\n if(loadPromises && haveThumbCached) {\n loadPromises.push(loadThumbPromise);\n }\n\n if(onlyThumb/* || true */) { // for sticker panel\n return ret;\n }\n\n const middlewareError = makeError('MIDDLEWARE');\n const load = async() => {\n if(middleware && !middleware()) {\n throw middlewareError;\n }\n\n if(stickerType === 2 && !asStatic) {\n return appDownloadManager.downloadMedia({media: doc, queueId: lazyLoadQueue?.queueId, thumb: fullThumb})\n .then(async(blob) => {\n if(middleware && !middleware()) {\n throw middlewareError;\n }\n\n const animation = await lottieLoader.loadAnimationWorker({\n container: (div as HTMLElement[])[0],\n loop: !!(!emoji || isCustomEmoji) && loop,\n autoplay: play,\n animationData: blob,\n width,\n height,\n name: 'doc' + doc.id,\n needUpscale,\n skipRatio,\n toneIndex,\n sync: isCustomEmoji\n }, group, loadStickerMiddleware ?? middleware);\n\n // const deferred = deferredPromise();\n\n const setLockColor = willHaveLock ? () => {\n const lockUrl = locksUrls[doc.id] ??= computeLockColor(animation.canvas[0]);\n (div as HTMLElement[]).forEach((div) => div.style.setProperty('--lock-url', `url(${lockUrl})`));\n } : undefined;\n\n const onFirstFrame = (container: HTMLElement, canvas: HTMLCanvasElement) => {\n const element = container.firstElementChild;\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !element || element.tagName === 'svg') && rootScope.settings.animationsEnabled;\n }\n\n const cb = () => {\n if(element && element !== canvas && element.tagName !== 'DIV') {\n element.remove();\n }\n };\n\n if(!needFadeIn) {\n if(element) {\n sequentialDom.mutate(cb);\n }\n } else {\n sequentialDom.mutate(() => {\n canvas && canvas.classList.add('fade-in');\n if(element) {\n element.classList.add('fade-out');\n }\n\n (canvas || element).addEventListener('animationend', () => {\n sequentialDom.mutate(() => {\n canvas && canvas.classList.remove('fade-in');\n cb();\n });\n }, {once: true});\n });\n }\n };\n\n animation.addEventListener('firstFrame', () => {\n const canvas = animation.canvas[0];\n if(withThumb !== false || isCustomEmoji) {\n saveLottiePreview(doc, canvas, toneIndex);\n }\n\n if(willHaveLock) {\n setLockColor();\n }\n\n if(!isCustomEmoji) {\n (div as HTMLElement[]).forEach((container, idx) => {\n onFirstFrame(container, animation.canvas[idx]);\n });\n }\n }, {once: true});\n\n if(emoji) {\n managers.appStickersManager.preloadAnimatedEmojiStickerAnimation(emoji);\n }\n\n return animation;\n\n // return deferred;\n // await new Promise((resolve) => setTimeout(resolve, 5e3));\n });\n } else if(asStatic || stickerType === 3) {\n const isSingleVideo = isAnimated && syncedVideo;\n const cacheName = isSingleVideo ? framesCache.generateName('' + doc.id, 0, 0, undefined, undefined) : undefined;\n\n const cachePromise = videosCache[cacheName];\n if(cachePromise) {\n return cachePromise as typeof promise;\n }\n\n const d = isSingleVideo ? (div as HTMLElement[]).slice(0, 1) : div as HTMLElement[];\n const media: HTMLElement[] = d.map(() => {\n let media: HTMLElement;\n if(asStatic) {\n media = new Image();\n } else {\n const video = media = createVideo();\n video.muted = true;\n if(play) video.autoplay = true;\n if(loop) video.loop = true;\n\n if(loop && typeof(loop) === 'number') {\n let previousTime = 0, playedTimes = 0;\n function onTimeupdate(this: HTMLVideoElement) {\n if(previousTime > this.currentTime && ++playedTimes === loop as number) {\n this.autoplay = false;\n this.loop = false;\n this.pause();\n video.removeEventListener('timeupdate', onTimeupdate);\n }\n\n previousTime = this.currentTime;\n }\n\n video.addEventListener('timeupdate', onTimeupdate);\n }\n }\n\n media.classList.add('media-sticker');\n return media;\n });\n\n const thumbImage = (div as HTMLElement[]).map((div, idx) => (div.firstElementChild as HTMLElement) !== media[idx] && div.firstElementChild) as HTMLElement[];\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !downloaded || (asStatic ? thumbImage[0] : (!thumbImage[0] || thumbImage[0].tagName === 'svg'))) && rootScope.settings.animationsEnabled;\n }\n\n if(needFadeIn) {\n media.forEach((media) => media.classList.add('fade-in'));\n }\n\n const promise = new Promise(async(resolve, reject) => {\n const r = async() => {\n if(middleware && !middleware()) {\n reject(middlewareError);\n return;\n }\n\n const mediaLength = media.length;\n const loaded: HTMLElement[] = [];\n const onLoad = (div: HTMLElement, media: HTMLElement, thumbImage: HTMLElement) => {\n sequentialDom.mutateElement(div, () => {\n if(middleware && !middleware()) {\n reject(middlewareError);\n return;\n }\n\n if(!media) {\n if(!isSingleVideo || !isAnimated) {\n thumbImage?.remove();\n }\n\n return;\n }\n\n if(media as HTMLVideoElement) {\n const w = width * window.devicePixelRatio;\n const h = height * window.devicePixelRatio;\n if(!isSavingLottiePreview(doc, toneIndex, w, h)) {\n // const perf = performance.now();\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(media as HTMLVideoElement, 0, 0, canvas.width, canvas.height);\n saveLottiePreview(doc, canvas, toneIndex);\n // console.log('perf', performance.now() - perf);\n }\n }\n\n if(isSingleVideo) {\n resolve(media as any);\n return;\n }\n\n div.append(media);\n\n if(needFadeIn) {\n thumbImage && thumbImage.classList.add('fade-out');\n media.addEventListener('animationend', () => {\n media.classList.remove('fade-in');\n thumbImage?.remove();\n }, {once: true});\n } else {\n thumbImage?.remove();\n }\n\n if(isAnimated) {\n animationIntersector.addAnimation(media as HTMLVideoElement, group);\n }\n\n if(loaded.push(media) === mediaLength) {\n resolve(loaded as any);\n }\n });\n };\n\n await getCacheContext();\n let lastPromise: Promise;\n (div as HTMLElement[]).forEach((div, idx) => {\n const _media = media[idx];\n const cb = () => onLoad(div, _media, thumbImage[idx]);\n if(_media) lastPromise = renderImageFromUrlPromise(_media, cacheContext.url);\n lastPromise.then(cb);\n });\n };\n\n await getCacheContext();\n if(cacheContext.url) r();\n else {\n let promise: Promise;\n if(stickerType !== 1 && asStatic) {\n const thumb = choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\n // promise = managers.appDocsManager.getThumbURL(doc, thumb).promise\n promise = appDownloadManager.downloadMediaURL({media: doc, thumb, queueId: lazyLoadQueue?.queueId});\n } else {\n promise = appDownloadManager.downloadMediaURL({media: doc, queueId: lazyLoadQueue?.queueId});\n }\n\n promise.then(r, reject);\n }\n });\n\n if(cacheName) {\n videosCache[cacheName] = promise as any;\n loadStickerMiddleware && promise.finally(() => {\n if(!loadStickerMiddleware()) {\n delete videosCache[cacheName];\n }\n });\n }\n\n return promise;\n }\n };\n\n if(exportLoad && ((exportLoad === 1 && (!downloaded || isAnimated)) || exportLoad === 2)) {\n ret.load = load;\n return ret;\n }\n\n const loadPromise: Promise> | void> = lazyLoadQueue && (!downloaded || isAnimated) ?\n (lazyLoadQueue.push({div: div[0], load}), Promise.resolve()) :\n load();\n\n if(downloaded && (asStatic/* || stickerType === 3 */)) {\n loadThumbPromise = loadPromise as any;\n if(loadPromises) {\n loadPromises.push(loadThumbPromise);\n }\n }\n\n if(stickerType === 2 && effectThumb && isOut !== undefined && !noPremium) {\n attachStickerEffectHandler({\n container: div[0],\n doc,\n managers,\n middleware,\n isOut,\n width,\n loadPromise,\n relativeEffect,\n loopEffect\n });\n }\n\n ret.render = loadPromise as any;\n return ret;\n}\n\nfunction attachStickerEffectHandler({container, doc, managers, middleware, isOut, width, loadPromise, relativeEffect, loopEffect}: {\n container: HTMLElement,\n doc: MyDocument,\n managers: AppManagers,\n middleware: Middleware,\n isOut: boolean,\n width: number,\n loadPromise: Promise,\n relativeEffect?: boolean,\n loopEffect?: boolean\n}) {\n managers.appStickersManager.preloadSticker(doc.id, true);\n\n let playing = false;\n attachClickEvent(container, async(e) => {\n cancelEvent(e);\n if(playing) {\n const a = document.createElement('a');\n a.onclick = () => {\n hideToast();\n new PopupStickers(doc.stickerSetInput).show();\n };\n\n toastNew({\n langPackKey: 'Sticker.Premium.Click.Info',\n langPackArguments: [a]\n });\n\n return;\n }\n\n playing = true;\n\n await loadPromise;\n const {animationDiv, stickerPromise} = wrapStickerAnimation({\n doc,\n middleware,\n side: isOut ? 'right' : 'left',\n size: width * STICKER_EFFECT_MULTIPLIER,\n target: container,\n play: true,\n fullThumb: getStickerEffectThumb(doc),\n relativeEffect,\n loopEffect\n });\n\n if(isOut !== undefined && !isOut/* && !relativeEffect */) {\n animationDiv.classList.add('reflect-x');\n }\n\n stickerPromise.then((player) => {\n player.addEventListener('destroy', () => {\n playing = false;\n });\n });\n });\n}\n\nexport async function onEmojiStickerClick({event, container, managers, peerId, middleware}: {\n event: Event,\n container: HTMLElement,\n managers: AppManagers,\n peerId: PeerId,\n middleware: Middleware\n}) {\n cancelEvent(event);\n\n const bubble = findUpClassName(container, 'bubble');\n const emoji = container.dataset.stickerEmoji;\n\n const animation = !container.classList.contains('custom-emoji') ? lottieLoader.getAnimation(container) : undefined;\n if(animation?.paused) {\n const doc = await managers.appStickersManager.getAnimatedEmojiSoundDocument(emoji);\n if(doc) {\n const audio = document.createElement('audio');\n audio.style.display = 'none';\n container.parentElement.append(audio);\n\n try {\n const url = await appDownloadManager.downloadMediaURL({media: doc});\n\n audio.src = url;\n audio.play();\n await onMediaLoad(audio, undefined, true);\n\n audio.addEventListener('ended', () => {\n audio.src = '';\n audio.remove();\n }, {once: true});\n } catch(err) {\n\n }\n }\n\n animation.autoplay = true;\n animation.restart();\n }\n\n if(!peerId.isUser()) {\n return;\n }\n\n const doc = await managers.appStickersManager.getAnimatedEmojiSticker(emoji, true);\n if(!doc) {\n return;\n }\n\n const data: SendMessageEmojiInteractionData = (container as any).emojiData ??= {\n a: [],\n v: 1\n };\n\n const sendInteractionThrottled: () => void = (container as any).sendInteractionThrottled = throttle(() => {\n const length = data.a.length;\n if(!length) {\n return;\n }\n\n const firstTime = data.a[0].t;\n\n data.a.forEach((a) => {\n a.t = (a.t - firstTime) / 1000;\n });\n\n const bubble = findUpClassName(container, 'bubble');\n managers.appMessagesManager.setTyping(appImManager.chat.peerId, {\n _: 'sendMessageEmojiInteraction',\n msg_id: getServerMessageId(+bubble.dataset.mid),\n emoticon: emoji,\n interaction: {\n _: 'dataJSON',\n data: JSON.stringify(data)\n }\n }, true, appImManager.chat.threadId);\n\n data.a.length = 0;\n }, 1000, false);\n\n const isOut = bubble ? bubble.classList.contains('is-out') : undefined;\n const {animationDiv} = wrapStickerAnimation({\n doc,\n middleware,\n side: isOut ? 'right' : 'left',\n size: 360,\n target: container,\n play: true,\n withRandomOffset: true\n });\n\n if(isOut !== undefined && !isOut) {\n animationDiv.classList.add('reflect-x');\n }\n\n // using a trick here: simulated event from interlocutor's interaction won't fire ours\n if(event.isTrusted) {\n data.a.push({\n i: 1,\n t: Date.now()\n });\n\n sendInteractionThrottled();\n }\n // });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n/**\n * https://core.telegram.org/api/files#vector-thumbnails\n */\nexport default function getPathFromBytes(bytes: Uint8Array) {\n const lookup = 'AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,';\n\n let path = 'M';\n for(let i = 0, length = bytes.length; i < length; ++i) {\n const num = bytes[i];\n\n if(num >= (128 + 64)) {\n path += lookup[num - 128 - 64];\n } else {\n if(num >= 128) {\n path += ',';\n } else if(num >= 64) {\n path += '-';\n }\n path += '' + (num & 63);\n }\n }\n path += 'z';\n\n return path;\n}\n","// https://github.com/telegramdesktop/tdesktop/blob/543bfab24a76402992421063f1e6444f347d31fe/Telegram/SourceFiles/boxes/sticker_set_box.cpp#L75\nexport default function computeLockColor(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n const size = 20 * (canvas.dpr ?? 1);\n const width = size;\n const height = size;\n const skipx = (canvas.width - width) / 2;\n const margin = 0/* * (canvas.dpr ?? 1) */;\n const skipy = canvas.height - height - margin;\n const imageData = context.getImageData(skipx, skipy, width, height).data;\n let sr = 0, sg = 0, sb = 0, sa = 0;\n for(let i = 0; i < imageData.length; i += 4) {\n sr += imageData[i];\n sg += imageData[i + 1];\n sb += imageData[i + 2];\n sa += imageData[i + 3];\n }\n\n const outCanvas = document.createElement('canvas');\n outCanvas.width = size;\n outCanvas.height = size;\n const outContext = outCanvas.getContext('2d');\n const color = new Uint8ClampedArray([sr * 255 / sa, sg * 255 / sa, sb * 255 / sa, 255]);\n const rgba = `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3]})`;\n outContext.fillStyle = rgba;\n outContext.fillRect(0, 0, outCanvas.width, outCanvas.height);\n outContext.fillStyle = `rgba(112, 117, 121, 0.3)`;\n outContext.fillRect(0, 0, outCanvas.width, outCanvas.height);\n // document.querySelector('.popup-title').append(c);\n return outCanvas.toDataURL('image/jpeg');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_VIBRATE_SUPPORTED from '../../environment/vibrateSupport';\nimport assumeType from '../../helpers/assumeType';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport makeError from '../../helpers/makeError';\nimport {getMiddleware, Middleware} from '../../helpers/middleware';\nimport throttleWithRaf from '../../helpers/schedulers/throttleWithRaf';\nimport windowSize from '../../helpers/windowSize';\nimport {PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport wrapSticker from './sticker';\n\nexport default function wrapStickerAnimation({\n size,\n doc,\n middleware,\n target,\n side,\n skipRatio,\n play,\n managers,\n fullThumb,\n withRandomOffset,\n relativeEffect,\n loopEffect\n}: {\n size: number,\n doc: MyDocument,\n middleware?: Middleware,\n target: HTMLElement,\n side: 'left' | 'center' | 'right',\n skipRatio?: number,\n play: boolean,\n managers?: AppManagers,\n fullThumb?: PhotoSize | VideoSize,\n withRandomOffset?: boolean,\n relativeEffect?: boolean,\n loopEffect?: boolean\n}) {\n const animationDiv = document.createElement('div');\n animationDiv.classList.add('emoji-animation');\n\n // const size = 280;\n animationDiv.style.width = size + 'px';\n animationDiv.style.height = size + 'px';\n\n let animation: RLottiePlayer;\n const unmountAnimation = () => {\n middlewareHelper.clean();\n animation?.remove();\n animationDiv.remove();\n appImManager.chat.bubbles.scrollable.container.removeEventListener('scroll', onScroll);\n };\n\n const middlewareHelper = middleware?.create() ?? getMiddleware();\n middleware = middlewareHelper.get();\n\n const stickerPromise = wrapSticker({\n div: animationDiv,\n doc,\n middleware,\n withThumb: false,\n needFadeIn: false,\n loop: !!loopEffect,\n width: size,\n height: size,\n play,\n group: 'none',\n skipRatio,\n managers,\n fullThumb\n }).then(({render}) => render).then((_animation) => {\n assumeType(_animation);\n if(!middleware()) {\n _animation.remove();\n throw makeError('MIDDLEWARE');\n }\n\n animation = _animation;\n animation.addEventListener('enterFrame', (frameNo) => {\n if((!loopEffect && frameNo === animation.maxFrame) || !isInDOM(target)) {\n unmountAnimation();\n }\n });\n\n if(IS_VIBRATE_SUPPORTED) {\n animation.addEventListener('firstFrame', () => {\n navigator.vibrate(100);\n }, {once: true});\n }\n\n return animation;\n });\n\n const generateRandomSigned = (max: number) => {\n const r = Math.random() * max * 2;\n return r > max ? -r % max : r;\n };\n\n const randomOffsetX = withRandomOffset ? generateRandomSigned(16) : 0;\n const randomOffsetY = withRandomOffset ? generateRandomSigned(4) : 0;\n const setPosition = () => {\n if(!isInDOM(target)) {\n unmountAnimation();\n return;\n }\n\n const rect = target.getBoundingClientRect();\n\n const factor = rect.width / 200;\n const stableOffsetX = side === 'center' ? 0 : 16 * (side === 'right' ? 1 : -1) * factor;\n // const stableOffsetY = side === 'center' ? 0 : -50 * factor;\n const stableOffsetY = side === 'center' ? 0 : 0 * factor;\n\n const rectX = side === 'right' ? rect.right : rect.left;\n const rectY = rect.top;\n\n const addOffsetX = (side === 'center' ? (rect.width - size) / 2 : (side === 'right' ? -size : 0)) + stableOffsetX + randomOffsetX;\n const addOffsetY = (side === 'center' || true ? (rect.height - size) / 2 : 0) + stableOffsetY + randomOffsetY;\n const x = rectX + addOffsetX;\n const y = rectY + addOffsetY;\n\n if(y <= -size || y >= windowSize.height) {\n unmountAnimation();\n return;\n }\n\n if(relativeEffect) {\n if(side !== 'center') animationDiv.style[side] = Math.abs(stableOffsetX) * -1 + 'px';\n else animationDiv.style.left = addOffsetX + 'px';\n animationDiv.style.top = addOffsetY + 'px';\n } else {\n animationDiv.style.top = y + 'px';\n animationDiv.style.left = x + 'px';\n }\n };\n\n const onScroll = throttleWithRaf(setPosition);\n appImManager.chat.bubbles.scrollable.container.addEventListener('scroll', onScroll);\n\n setPosition();\n\n if(relativeEffect) {\n animationDiv.classList.add('is-relative');\n target.parentElement.append(animationDiv);\n } else {\n appImManager.emojiAnimationContainer.append(animationDiv);\n }\n\n return {animationDiv, stickerPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport rootScope from '../../lib/rootScope';\nimport wrapSticker from './sticker'\n\nexport default async function wrapStickerEmoji({emoji, div, width, height, managers = rootScope.managers}: {\n emoji: string,\n div: HTMLElement,\n managers?: AppManagers,\n width: number,\n height: number\n}) {\n const doc = await managers.appStickersManager.getAnimatedEmojiSticker(emoji);\n if(!doc) {\n div.classList.add('media-sticker-wrapper');\n throw new Error('no sticker');\n }\n\n return wrapSticker({\n doc,\n div,\n emoji,\n width,\n height,\n loop: false,\n play: true\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport createVideo from '../../helpers/dom/createVideo';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport {Document, StickerSet} from '../../layer';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport wrapSticker from './sticker';\n\nexport default async function wrapStickerSetThumb({set, lazyLoadQueue, container, group, autoplay, width, height, managers = rootScope.managers}: {\n set: StickerSet.stickerSet,\n lazyLoadQueue: LazyLoadQueue,\n container: HTMLElement,\n group: AnimationItemGroup,\n autoplay: boolean,\n width: number,\n height: number,\n managers?: AppManagers\n}) {\n if(set.thumbs?.length) {\n container.classList.add('media-sticker-wrapper');\n lazyLoadQueue.push({\n div: container,\n load: async() => {\n const downloadOptions = await managers.appStickersManager.getStickerSetThumbDownloadOptions(set);\n const promise = appDownloadManager.download(downloadOptions);\n\n if(set.pFlags.animated && !set.pFlags.videos) {\n return promise\n .then((blob) => {\n lottieLoader.loadAnimationWorker({\n container,\n loop: true,\n autoplay,\n animationData: blob,\n width,\n height,\n needUpscale: true,\n name: 'setThumb' + set.id\n }, group);\n });\n } else {\n let media: HTMLElement;\n if(set.pFlags.videos) {\n media = createVideo();\n (media as HTMLVideoElement).autoplay = true;\n (media as HTMLVideoElement).muted = true;\n (media as HTMLVideoElement).loop = true;\n } else {\n media = new Image();\n }\n\n media.classList.add('media-sticker');\n\n return promise.then((blob) => {\n renderImageFromUrl(media, URL.createObjectURL(blob), () => {\n container.append(media);\n\n if(set.pFlags.videos) {\n animationIntersector.addAnimation(media as HTMLVideoElement, group);\n }\n });\n });\n }\n }\n });\n\n return;\n }\n\n let getDocPromise: Promise;\n\n if(set.thumb_document_id) {\n getDocPromise = managers.appEmojiManager.getCustomEmojiDocument(set.thumb_document_id);\n } else {\n getDocPromise = managers.appStickersManager.getStickerSet(set).then((stickerSet) => stickerSet.documents[0]);\n }\n\n const doc = await getDocPromise;\n if(doc._ !== 'documentEmpty') { // as thumb will be used first sticker\n wrapSticker({\n doc,\n div: container,\n group: group,\n lazyLoadQueue,\n managers,\n width,\n height\n }); // kostil\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport Row from '../row';\nimport wrapSticker from './sticker';\n\nexport default function wrapStickerToRow({doc, row, size, managers}: {\n doc: MyDocument,\n row: Row,\n size?: 'small' | 'large',\n managers?: AppManagers\n}) {\n const previousMedia = row.media;\n const media = row.createMedia('small');\n\n if(previousMedia) {\n media.classList.add('hide');\n }\n\n const loadPromises: Promise[] = previousMedia ? [] : undefined;\n\n const _size = size === 'small' ? 32 : 48;\n const result = wrapSticker({\n div: media,\n doc: doc,\n width: _size,\n height: _size,\n loadPromises,\n managers\n }).then(({render}) => render);\n\n loadPromises && Promise.all(loadPromises).then(() => {\n media.classList.remove('hide');\n previousMedia.remove();\n });\n\n return result;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport {i18n} from '../../lib/langPack';\nimport wrapTelegramUrlToAnchor from '../../lib/richTextProcessor/wrapTelegramUrlToAnchor';\nimport rootScope from '../../lib/rootScope';\nimport wrapPeerTitle from './peerTitle';\n\nexport default async function wrapTopicNameButton(\n options: {\n lastMsgId?: number\n } & Pick[0], 'peerId' | 'threadId' | 'wrapOptions' | 'withIcons'>\n) {\n const {peerId, threadId, lastMsgId} = options;\n\n const loadPromise: Promise = Promise.resolve();\n const a = wrapTelegramUrlToAnchor('t.me/c/' + peerId.toChatId() + (threadId ? '/' + getServerMessageId(threadId) : '') + (lastMsgId ? '/' + getServerMessageId(lastMsgId) : ''));\n a.classList.add('topic-name', 'topic-name-button');\n // if(threadId) {\n // const topic = await rootScope.managers.dialogsStorage.getForumTopic(peerId, threadId);\n // if(!topic) {\n // a.append(i18n('Loading'));\n // loadPromise = rootScope.managers.dialogsStorage.getForumTopicById(peerId, threadId)\n // }\n // } else {\n a.append(await wrapPeerTitle(options));\n // }\n\n return {\n cached: true,\n element: a,\n loadPromise\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport {animateSingle} from '../../helpers/animation';\nimport {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport getStrippedThumbIfNeeded from '../../helpers/getStrippedThumbIfNeeded';\nimport makeError from '../../helpers/makeError';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport noop from '../../helpers/noop';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport {fastRaf} from '../../helpers/schedulers';\nimport throttle from '../../helpers/schedulers/throttle';\nimport sequentialDom from '../../helpers/sequentialDom';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport {Message, PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport rootScope from '../../lib/rootScope';\nimport {ThumbCache} from '../../lib/storages/thumbs';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport appMediaPlaybackController, {MediaSearchContext} from '../appMediaPlaybackController';\nimport {findMediaTargets} from '../audio';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ProgressivePreloader from '../preloader';\nimport wrapPhoto from './photo';\n\nconst MAX_VIDEO_AUTOPLAY_SIZE = 50 * 1024 * 1024; // 50 MB\n\nlet roundVideoCircumference = 0;\nmediaSizes.addEventListener('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n const elements = Array.from(document.querySelectorAll('.media-round .progress-ring')) as SVGSVGElement[];\n const width = mediaSizes.active.round.width;\n const halfSize = width / 2;\n const radius = halfSize - 7;\n roundVideoCircumference = 2 * Math.PI * radius;\n elements.forEach((element) => {\n element.setAttributeNS(null, 'width', '' + width);\n element.setAttributeNS(null, 'height', '' + width);\n\n const circle = element.firstElementChild as SVGCircleElement;\n circle.setAttributeNS(null, 'cx', '' + halfSize);\n circle.setAttributeNS(null, 'cy', '' + halfSize);\n circle.setAttributeNS(null, 'r', '' + radius);\n\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\n });\n }\n});\n\nexport default async function wrapVideo({doc, container, message, boxWidth, boxHeight, withTail, isOut, middleware, lazyLoadQueue, noInfo, group, onlyPreview, noPreview, withoutPreloader, loadPromises, noPlayButton, photoSize, videoSize, searchContext, autoDownload, managers = rootScope.managers, noAutoplayAttribute}: {\n doc: MyDocument,\n container?: HTMLElement,\n message?: Message.message,\n boxWidth?: number,\n boxHeight?: number,\n withTail?: boolean,\n isOut?: boolean,\n middleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n noInfo?: boolean,\n noPlayButton?: boolean,\n group?: AnimationItemGroup,\n onlyPreview?: boolean,\n noPreview?: boolean,\n withoutPreloader?: boolean,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n photoSize?: PhotoSize,\n videoSize?: VideoSize,\n searchContext?: MediaSearchContext,\n managers?: AppManagers,\n noAutoplayAttribute?: boolean\n}) {\n const autoDownloadSize = autoDownload?.video;\n let noAutoDownload = autoDownloadSize === 0;\n const isAlbumItem = !(boxWidth && boxHeight);\n const canAutoplay = /* doc.sticker || */(\n (\n doc.type !== 'video' || (\n doc.size <= MAX_VIDEO_AUTOPLAY_SIZE &&\n !isAlbumItem\n )\n ) && (doc.type === 'gif' ? rootScope.settings.autoPlay.gifs : rootScope.settings.autoPlay.videos)\n );\n let spanTime: HTMLElement, spanPlay: HTMLElement;\n\n if(!noInfo) {\n spanTime = document.createElement('span');\n spanTime.classList.add('video-time');\n container.append(spanTime);\n\n let needPlayButton = false;\n if(doc.type !== 'gif') {\n spanTime.innerText = toHHMMSS(doc.duration, false);\n\n if(!noPlayButton && doc.type !== 'round') {\n if(canAutoplay && !noAutoDownload) {\n spanTime.classList.add('tgico', 'can-autoplay');\n } else {\n needPlayButton = true;\n }\n }\n } else {\n spanTime.innerText = 'GIF';\n\n if(!canAutoplay && !noPlayButton) {\n needPlayButton = true;\n noAutoDownload = undefined;\n }\n }\n\n if(needPlayButton) {\n spanPlay = document.createElement('span');\n spanPlay.classList.add('video-play', 'tgico-largeplay', 'btn-circle', 'position-center');\n container.append(spanPlay);\n }\n }\n\n const res: {\n thumb?: typeof photoRes,\n loadPromise: Promise\n } = {} as any;\n\n if(doc.mime_type === 'image/gif') {\n const photoRes = await wrapPhoto({\n photo: doc,\n message,\n container,\n boxWidth,\n boxHeight,\n withTail,\n isOut,\n lazyLoadQueue,\n middleware,\n withoutPreloader,\n loadPromises,\n autoDownloadSize,\n size: photoSize,\n managers\n });\n\n res.thumb = photoRes;\n res.loadPromise = photoRes.loadPromises.full;\n return res;\n }\n\n /* const video = doc.type === 'round' ? appMediaPlaybackController.addMedia(doc, message.mid) as HTMLVideoElement : document.createElement('video');\n if(video.parentElement) {\n video.remove();\n } */\n\n let preloader: ProgressivePreloader; // it must be here, otherwise will get error before initialization in round onPlay\n\n const video = createVideo();\n video.classList.add('media-video');\n video.muted = true;\n if(doc.type === 'round') {\n const divRound = document.createElement('div');\n divRound.classList.add('media-round', 'z-depth-1');\n divRound.dataset.mid = '' + message.mid;\n divRound.dataset.peerId = '' + message.peerId;\n (divRound as any).message = message;\n\n const size = mediaSizes.active.round;\n const halfSize = size.width / 2;\n const strokeWidth = 3.5;\n const radius = halfSize - (strokeWidth * 2);\n divRound.innerHTML = `\n \n `;\n\n const circle = divRound.firstElementChild.firstElementChild as SVGCircleElement;\n if(!roundVideoCircumference) {\n roundVideoCircumference = 2 * Math.PI * radius;\n }\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\n\n spanTime.classList.add('tgico');\n\n const isUnread = message.pFlags.media_unread;\n if(isUnread) {\n divRound.classList.add('is-unread');\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = doc.w/* * window.devicePixelRatio */;\n\n divRound.prepend(canvas, spanTime);\n divRound.append(video);\n container.append(divRound);\n\n const ctx = canvas.getContext('2d');\n /* ctx.beginPath();\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, Math.PI * 2);\n ctx.clip(); */\n\n const onLoad = () => {\n const message: Message.message = (divRound as any).message;\n const globalVideo = appMediaPlaybackController.addMedia(message, !noAutoDownload) as HTMLVideoElement;\n const clear = () => {\n (appImManager.chat.setPeerPromise || Promise.resolve()).finally(() => {\n if(isInDOM(globalVideo)) {\n return;\n }\n\n globalVideo.removeEventListener('play', onPlay);\n globalVideo.removeEventListener('timeupdate', throttledTimeUpdate);\n globalVideo.removeEventListener('pause', onPaused);\n globalVideo.removeEventListener('ended', onEnded);\n });\n };\n\n const onFrame = () => {\n ctx.drawImage(globalVideo, 0, 0);\n\n const offset = roundVideoCircumference - globalVideo.currentTime / globalVideo.duration * roundVideoCircumference;\n circle.style.strokeDashoffset = '' + offset;\n\n return !globalVideo.paused;\n };\n\n const onTimeUpdate = () => {\n if(!globalVideo.duration) {\n return;\n }\n\n if(!isInDOM(globalVideo)) {\n clear();\n return;\n }\n\n if(globalVideo.paused) {\n onFrame();\n }\n\n spanTime.innerText = toHHMMSS(globalVideo.duration - globalVideo.currentTime, false);\n };\n\n const throttledTimeUpdate = throttle(() => {\n fastRaf(onTimeUpdate);\n }, 1000, false);\n\n const onPlay = () => {\n video.classList.add('hide');\n divRound.classList.remove('is-paused');\n animateSingle(onFrame, canvas);\n\n if(preloader && preloader.preloader && preloader.preloader.classList.contains('manual')) {\n preloader.onClick();\n }\n };\n\n const onPaused = () => {\n if(!isInDOM(globalVideo)) {\n clear();\n return;\n }\n\n divRound.classList.add('is-paused');\n };\n\n const onEnded = () => {\n video.classList.remove('hide');\n divRound.classList.add('is-paused');\n\n video.currentTime = 0;\n spanTime.innerText = toHHMMSS(globalVideo.duration, false);\n\n if(globalVideo.currentTime) {\n globalVideo.currentTime = 0;\n }\n };\n\n globalVideo.addEventListener('play', onPlay);\n globalVideo.addEventListener('timeupdate', throttledTimeUpdate);\n globalVideo.addEventListener('pause', onPaused);\n globalVideo.addEventListener('ended', onEnded);\n\n attachClickEvent(canvas, (e) => {\n cancelEvent(e);\n\n // ! костыль\n if(preloader && !preloader.detached) {\n preloader.onClick();\n }\n\n // ! can't use it here. on Safari iOS video won't start.\n /* if(globalVideo.readyState < 2) {\n return;\n } */\n\n if(globalVideo.paused) {\n const hadSearchContext = !!searchContext;\n if(appMediaPlaybackController.setSearchContext(searchContext || {\n peerId: NULL_PEER_ID,\n inputFilter: {_: 'inputMessagesFilterEmpty'},\n useSearch: false\n })) {\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(divRound, message.mid/* , searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: message.peerId, mid: message.mid}, prev, next);\n }\n\n globalVideo.play();\n } else {\n globalVideo.pause();\n }\n });\n\n if(globalVideo.paused) {\n if(globalVideo.duration && globalVideo.currentTime !== globalVideo.duration && globalVideo.currentTime > 0) {\n onFrame();\n onTimeUpdate();\n video.classList.add('hide');\n } else {\n onPaused();\n }\n } else {\n onPlay();\n }\n };\n\n if(message.pFlags.is_outgoing) {\n (divRound as any).onLoad = onLoad;\n divRound.dataset.isOutgoing = '1';\n } else {\n onLoad();\n }\n } else if(!noAutoplayAttribute) {\n video.autoplay = true; // для safari\n }\n\n let photoRes: Awaited>;\n if(message) {\n photoRes = await wrapPhoto({\n photo: doc,\n message,\n container,\n boxWidth,\n boxHeight,\n withTail,\n isOut,\n lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n loadPromises,\n autoDownloadSize: autoDownload?.photo,\n size: photoSize,\n managers\n });\n\n res.thumb = photoRes;\n\n if((!canAutoplay && doc.type !== 'gif') || onlyPreview) {\n res.loadPromise = photoRes.loadPromises.full;\n return res;\n }\n\n if(withTail) {\n const foreignObject = (photoRes.images.thumb || photoRes.images.full).parentElement;\n video.width = +foreignObject.getAttributeNS(null, 'width');\n video.height = +foreignObject.getAttributeNS(null, 'height');\n foreignObject.append(video);\n }\n } else if(!noPreview) { // * gifs masonry\n const gotThumb = getStrippedThumbIfNeeded(doc, {} as ThumbCache, true);\n if(gotThumb) {\n const thumbImage = gotThumb.image;\n thumbImage.classList.add('media-poster');\n container.append(thumbImage);\n res.thumb = {\n loadPromises: {\n thumb: gotThumb.loadPromise,\n full: Promise.resolve()\n },\n images: {\n thumb: thumbImage,\n full: null\n },\n preloader: null,\n aspecter: null\n };\n\n loadPromises?.push(gotThumb.loadPromise);\n res.loadPromise = gotThumb.loadPromise;\n }\n }\n\n if(onlyPreview) {\n return res;\n }\n\n if(!video.parentElement && container) {\n (photoRes?.aspecter || container).append(video);\n }\n\n let cacheContext: ThumbCache;\n const getCacheContext = async() => {\n return cacheContext = await managers.thumbsStorage.getCacheContext(doc, videoSize?.type);\n };\n\n await getCacheContext();\n\n const uploadFileName = message?.uploadingFileName;\n if(uploadFileName) { // means upload\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend',\n isUpload: true\n });\n preloader.attachPromise(appDownloadManager.getUpload(uploadFileName));\n preloader.attach(container, false);\n noAutoDownload = undefined;\n } else if(!cacheContext.downloaded && !doc.supportsStreaming && !withoutPreloader) {\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend'\n });\n } else if(doc.supportsStreaming) {\n preloader = new ProgressivePreloader({\n cancelable: false,\n attachMethod: 'prepend'\n });\n }\n\n const renderDeferred = deferredPromise();\n video.addEventListener('error', (e) => {\n if(video.error.code !== 4) {\n console.error('Error ' + video.error.code + '; details: ' + video.error.message);\n }\n\n if(preloader && !uploadFileName) {\n preloader.detach();\n }\n\n if(!renderDeferred.isFulfilled) {\n renderDeferred.resolve();\n }\n }, {once: true});\n\n if(doc.type === 'video') {\n const onTimeUpdate = () => {\n if(!video.duration) {\n return;\n }\n\n spanTime.innerText = toHHMMSS(video.duration - video.currentTime, false);\n };\n\n const throttledTimeUpdate = throttle(() => {\n fastRaf(onTimeUpdate);\n }, 1e3, false);\n\n video.addEventListener('timeupdate', throttledTimeUpdate);\n\n if(spanPlay) {\n video.addEventListener('timeupdate', () => {\n sequentialDom.mutateElement(spanPlay, () => {\n spanPlay.remove();\n });\n }, {once: true});\n }\n }\n\n video.muted = true;\n video.loop = true;\n // video.play();\n if(!noAutoplayAttribute) {\n video.autoplay = true;\n }\n\n let loadPhotoThumbFunc = noAutoDownload && photoRes?.preloader?.loadFunc;\n const load = async() => {\n if(preloader && noAutoDownload && !withoutPreloader) {\n preloader.construct();\n preloader.setManual();\n }\n\n await getCacheContext();\n let loadPromise: Promise = Promise.resolve();\n if((preloader && !uploadFileName) || withoutPreloader) {\n if(!cacheContext.downloaded && !doc.supportsStreaming) {\n const promise = loadPromise = appDownloadManager.downloadMediaURL({\n media: doc,\n queueId: lazyLoadQueue?.queueId,\n onlyCache: noAutoDownload,\n thumb: videoSize\n });\n\n if(preloader) {\n preloader.attach(container, false, promise);\n }\n } else if(doc.supportsStreaming) {\n if(noAutoDownload) {\n loadPromise = Promise.reject(makeError('NO_AUTO_DOWNLOAD'));\n } else if(!cacheContext.downloaded && preloader) { // * check for uploading video\n preloader.attach(container, false, null);\n video.addEventListener(IS_SAFARI ? 'timeupdate' : 'canplay', () => {\n preloader.detach();\n }, {once: true});\n }\n }\n }\n\n if(!noAutoDownload && loadPhotoThumbFunc) {\n loadPhotoThumbFunc();\n loadPhotoThumbFunc = null;\n }\n\n noAutoDownload = undefined;\n\n loadPromise.then(async() => {\n if(middleware && !middleware()) {\n renderDeferred.resolve();\n return;\n }\n\n if(doc.type === 'round') {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n }\n\n await getCacheContext();\n\n onMediaLoad(video).then(() => {\n if(group) {\n animationIntersector.addAnimation(video, group);\n }\n\n if(preloader && !uploadFileName) {\n preloader.detach();\n }\n\n renderDeferred.resolve();\n }, (err) => {\n console.error('video load error', err);\n if(spanTime) {\n spanTime.classList.add('is-error');\n }\n renderDeferred.reject(err);\n });\n\n renderImageFromUrl(video, cacheContext.url);\n }, noop);\n\n return {download: loadPromise, render: Promise.all([loadPromise, renderDeferred])};\n };\n\n if(preloader && !uploadFileName) {\n preloader.setDownloadFunction(load);\n }\n\n /* if(doc.size >= 20e6 && !doc.downloaded) {\n let downloadDiv = document.createElement('div');\n downloadDiv.classList.add('download');\n\n let span = document.createElement('span');\n span.classList.add('btn-circle', 'tgico-download');\n downloadDiv.append(span);\n\n downloadDiv.addEventListener('click', () => {\n downloadDiv.remove();\n loadVideo();\n });\n\n container.prepend(downloadDiv);\n\n return;\n } */\n\n if(doc.type === 'gif' && !canAutoplay) {\n attachClickEvent(container, (e) => {\n cancelEvent(e);\n spanPlay.remove();\n load();\n }, {capture: true, once: true});\n } else {\n res.loadPromise = !lazyLoadQueue ?\n (await load()).render :\n (lazyLoadQueue.push({div: container, load: () => load().then(({render}) => render)}), Promise.resolve());\n }\n\n if(res.thumb) {\n await res.thumb.loadPromises.thumb;\n }\n\n return res;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {WebPage} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapWebPageDescription(webPage: WebPage.webPage) {\n const shortDescriptionText = limitSymbols(webPage.description || '', 150, 180);\n // const siteName = webPage.site_name;\n // let contextHashtag = '';\n // if(siteName === 'GitHub') {\n // const matches = apiWebPage.url.match(/(https?:\\/\\/github\\.com\\/[^\\/]+\\/[^\\/]+)/);\n // if(matches) {\n // contextHashtag = matches[0] + '/issues/{1}';\n // }\n // }\n return wrapRichText(shortDescriptionText/* , {\n contextSite: siteName || 'external',\n contextHashtag: contextHashtag\n } */);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {WebPage} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapWebPageTitle(webPage: WebPage.webPage) {\n let shortTitle = webPage.title || webPage.author || webPage.site_name || '';\n shortTitle = limitSymbols(shortTitle, 80, 100);\n return wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true});\n}\n","// Taken from https://core.telegram.org/bots/payments/currencies.json\nexport type Currency = {\n code: string,\n title: string,\n symbol: string,\n native: string,\n thousands_sep: string,\n decimal_sep: string,\n symbol_left: boolean,\n space_between: boolean,\n exp: number,\n min_amount: string | number,\n max_amount: string | number\n};\n\n// eslint-disable-next-line quotes, comma-spacing\nconst Currencies: {[currency: string]: Currency} = {\"AED\":{\"code\":\"AED\",\"title\":\"United Arab Emirates Dirham\",\"symbol\":\"AED\",\"native\":\"د.إ.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"367\",\"max_amount\":\"3673030\"},\"AFN\":{\"code\":\"AFN\",\"title\":\"Afghan Afghani\",\"symbol\":\"AFN\",\"native\":\"؋\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"8729\",\"max_amount\":\"87299487\"},\"ALL\":{\"code\":\"ALL\",\"title\":\"Albanian Lek\",\"symbol\":\"ALL\",\"native\":\"Lek\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":false,\"exp\":2,\"min_amount\":\"11842\",\"max_amount\":\"118421187\"},\"AMD\":{\"code\":\"AMD\",\"title\":\"Armenian Dram\",\"symbol\":\"AMD\",\"native\":\"դր.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"40943\",\"max_amount\":\"409436718\"},\"ARS\":{\"code\":\"ARS\",\"title\":\"Argentine Peso\",\"symbol\":\"ARS\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"14705\",\"max_amount\":\"147059002\"},\"AUD\":{\"code\":\"AUD\",\"title\":\"Australian Dollar\",\"symbol\":\"AU$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"153\",\"max_amount\":\"1536825\"},\"AZN\":{\"code\":\"AZN\",\"title\":\"Azerbaijani Manat\",\"symbol\":\"AZN\",\"native\":\"ман.\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"169\",\"max_amount\":\"1699858\"},\"BAM\":{\"code\":\"BAM\",\"title\":\"Bosnia & Herzegovina Convertible Mark\",\"symbol\":\"BAM\",\"native\":\"KM\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"199\",\"max_amount\":\"1990677\"},\"BDT\":{\"code\":\"BDT\",\"title\":\"Bangladeshi Taka\",\"symbol\":\"BDT\",\"native\":\"৳\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"10009\",\"max_amount\":\"100094046\"},\"BGN\":{\"code\":\"BGN\",\"title\":\"Bulgarian Lev\",\"symbol\":\"BGN\",\"native\":\"лв.\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"199\",\"max_amount\":\"1993315\"},\"BND\":{\"code\":\"BND\",\"title\":\"Brunei Dollar\",\"symbol\":\"BND\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"142\",\"max_amount\":\"1421883\"},\"BOB\":{\"code\":\"BOB\",\"title\":\"Bolivian Boliviano\",\"symbol\":\"BOB\",\"native\":\"Bs\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"683\",\"max_amount\":\"6832607\"},\"BRL\":{\"code\":\"BRL\",\"title\":\"Brazilian Real\",\"symbol\":\"R$\",\"native\":\"R$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"539\",\"max_amount\":\"5397799\"},\"BYN\":{\"code\":\"BYN\",\"title\":\"Belarusian ruble\",\"symbol\":\"BYN\",\"native\":\"BYN\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"249\",\"max_amount\":\"2495801\"},\"CAD\":{\"code\":\"CAD\",\"title\":\"Canadian Dollar\",\"symbol\":\"CA$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"136\",\"max_amount\":\"1366860\"},\"CHF\":{\"code\":\"CHF\",\"title\":\"Swiss Franc\",\"symbol\":\"CHF\",\"native\":\"CHF\",\"thousands_sep\":\"'\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"97\",\"max_amount\":\"976705\"},\"CLP\":{\"code\":\"CLP\",\"title\":\"Chilean Peso\",\"symbol\":\"CLP\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":0,\"min_amount\":\"963\",\"max_amount\":\"9637495\"},\"CNY\":{\"code\":\"CNY\",\"title\":\"Chinese Renminbi Yuan\",\"symbol\":\"CN¥\",\"native\":\"CN¥\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"709\",\"max_amount\":\"7094102\"},\"COP\":{\"code\":\"COP\",\"title\":\"Colombian Peso\",\"symbol\":\"COP\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"452870\",\"max_amount\":\"4528700000\"},\"CRC\":{\"code\":\"CRC\",\"title\":\"Costa Rican Colón\",\"symbol\":\"CRC\",\"native\":\"₡\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"62506\",\"max_amount\":\"625061070\"},\"CZK\":{\"code\":\"CZK\",\"title\":\"Czech Koruna\",\"symbol\":\"CZK\",\"native\":\"Kč\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"2497\",\"max_amount\":\"24975029\"},\"DKK\":{\"code\":\"DKK\",\"title\":\"Danish Krone\",\"symbol\":\"DKK\",\"native\":\"kr\",\"thousands_sep\":\"\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"755\",\"max_amount\":\"7555990\"},\"DOP\":{\"code\":\"DOP\",\"title\":\"Dominican Peso\",\"symbol\":\"DOP\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5275\",\"max_amount\":\"52757308\"},\"DZD\":{\"code\":\"DZD\",\"title\":\"Algerian Dinar\",\"symbol\":\"DZD\",\"native\":\"د.ج.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"14035\",\"max_amount\":\"140353307\"},\"EGP\":{\"code\":\"EGP\",\"title\":\"Egyptian Pound\",\"symbol\":\"EGP\",\"native\":\"ج.م.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1953\",\"max_amount\":\"19537405\"},\"ETB\":{\"code\":\"ETB\",\"title\":\"Ethiopian Birr\",\"symbol\":\"ETB\",\"native\":\"ብር\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5224\",\"max_amount\":\"52247069\"},\"EUR\":{\"code\":\"EUR\",\"title\":\"Euro\",\"symbol\":\"€\",\"native\":\"€\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"101\",\"max_amount\":\"1016045\"},\"GBP\":{\"code\":\"GBP\",\"title\":\"British Pound\",\"symbol\":\"£\",\"native\":\"£\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"89\",\"max_amount\":\"894445\"},\"GEL\":{\"code\":\"GEL\",\"title\":\"Georgian Lari\",\"symbol\":\"GEL\",\"native\":\"GEL\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"283\",\"max_amount\":\"2830234\"},\"GTQ\":{\"code\":\"GTQ\",\"title\":\"Guatemalan Quetzal\",\"symbol\":\"GTQ\",\"native\":\"Q\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"778\",\"max_amount\":\"7781323\"},\"HKD\":{\"code\":\"HKD\",\"title\":\"Hong Kong Dollar\",\"symbol\":\"HK$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"784\",\"max_amount\":\"7849750\"},\"HNL\":{\"code\":\"HNL\",\"title\":\"Honduran Lempira\",\"symbol\":\"HNL\",\"native\":\"L\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"2441\",\"max_amount\":\"24413729\"},\"HRK\":{\"code\":\"HRK\",\"title\":\"Croatian Kuna\",\"symbol\":\"HRK\",\"native\":\"kn\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"764\",\"max_amount\":\"7648805\"},\"HUF\":{\"code\":\"HUF\",\"title\":\"Hungarian Forint\",\"symbol\":\"HUF\",\"native\":\"Ft\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"42685\",\"max_amount\":\"426850229\"},\"IDR\":{\"code\":\"IDR\",\"title\":\"Indonesian Rupiah\",\"symbol\":\"IDR\",\"native\":\"Rp\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"1523370\",\"max_amount\":\"15233700000\"},\"ILS\":{\"code\":\"ILS\",\"title\":\"Israeli New Sheqel\",\"symbol\":\"₪\",\"native\":\"₪\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"354\",\"max_amount\":\"3543350\"},\"INR\":{\"code\":\"INR\",\"title\":\"Indian Rupee\",\"symbol\":\"₹\",\"native\":\"₹\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"8155\",\"max_amount\":\"81555550\"},\"ISK\":{\"code\":\"ISK\",\"title\":\"Icelandic Króna\",\"symbol\":\"ISK\",\"native\":\"kr\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":0,\"min_amount\":\"142\",\"max_amount\":\"1425603\"},\"JMD\":{\"code\":\"JMD\",\"title\":\"Jamaican Dollar\",\"symbol\":\"JMD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"15013\",\"max_amount\":\"150131044\"},\"JPY\":{\"code\":\"JPY\",\"title\":\"Japanese Yen\",\"symbol\":\"¥\",\"native\":\"¥\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"144\",\"max_amount\":\"1443065\"},\"KES\":{\"code\":\"KES\",\"title\":\"Kenyan Shilling\",\"symbol\":\"KES\",\"native\":\"Ksh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"12075\",\"max_amount\":\"120750271\"},\"KGS\":{\"code\":\"KGS\",\"title\":\"Kyrgyzstani Som\",\"symbol\":\"KGS\",\"native\":\"KGS\",\"thousands_sep\":\" \",\"decimal_sep\":\"-\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"8018\",\"max_amount\":\"80182898\"},\"KRW\":{\"code\":\"KRW\",\"title\":\"South Korean Won\",\"symbol\":\"₩\",\"native\":\"₩\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"1431\",\"max_amount\":\"14315201\"},\"KZT\":{\"code\":\"KZT\",\"title\":\"Kazakhstani Tenge\",\"symbol\":\"KZT\",\"native\":\"₸\",\"thousands_sep\":\" \",\"decimal_sep\":\"-\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"47186\",\"max_amount\":\"471867112\"},\"LBP\":{\"code\":\"LBP\",\"title\":\"Lebanese Pound\",\"symbol\":\"LBP\",\"native\":\"ل.ل.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"150999\",\"max_amount\":\"1509998778\"},\"LKR\":{\"code\":\"LKR\",\"title\":\"Sri Lankan Rupee\",\"symbol\":\"LKR\",\"native\":\"රු.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"35546\",\"max_amount\":\"355469651\"},\"MAD\":{\"code\":\"MAD\",\"title\":\"Moroccan Dirham\",\"symbol\":\"MAD\",\"native\":\"د.م.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1093\",\"max_amount\":\"10938136\"},\"MDL\":{\"code\":\"MDL\",\"title\":\"Moldovan Leu\",\"symbol\":\"MDL\",\"native\":\"MDL\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1926\",\"max_amount\":\"19264439\"},\"MNT\":{\"code\":\"MNT\",\"title\":\"Mongolian Tögrög\",\"symbol\":\"MNT\",\"native\":\"MNT\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"322444\",\"max_amount\":\"3224442056\"},\"MUR\":{\"code\":\"MUR\",\"title\":\"Mauritian Rupee\",\"symbol\":\"MUR\",\"native\":\"MUR\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"4453\",\"max_amount\":\"44535174\"},\"MVR\":{\"code\":\"MVR\",\"title\":\"Maldivian Rufiyaa\",\"symbol\":\"MVR\",\"native\":\"MVR\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1546\",\"max_amount\":\"15460397\"},\"MXN\":{\"code\":\"MXN\",\"title\":\"Mexican Peso\",\"symbol\":\"MX$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"2012\",\"max_amount\":\"20122860\"},\"MYR\":{\"code\":\"MYR\",\"title\":\"Malaysian Ringgit\",\"symbol\":\"MYR\",\"native\":\"RM\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"463\",\"max_amount\":\"4632502\"},\"MZN\":{\"code\":\"MZN\",\"title\":\"Mozambican Metical\",\"symbol\":\"MZN\",\"native\":\"MTn\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"6382\",\"max_amount\":\"63829729\"},\"NGN\":{\"code\":\"NGN\",\"title\":\"Nigerian Naira\",\"symbol\":\"NGN\",\"native\":\"₦\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"43203\",\"max_amount\":\"432039828\"},\"NIO\":{\"code\":\"NIO\",\"title\":\"Nicaraguan Córdoba\",\"symbol\":\"NIO\",\"native\":\"C$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"3556\",\"max_amount\":\"35566412\"},\"NOK\":{\"code\":\"NOK\",\"title\":\"Norwegian Krone\",\"symbol\":\"NOK\",\"native\":\"kr\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1069\",\"max_amount\":\"10690975\"},\"NPR\":{\"code\":\"NPR\",\"title\":\"Nepalese Rupee\",\"symbol\":\"NPR\",\"native\":\"नेरू\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"12954\",\"max_amount\":\"129546657\"},\"NZD\":{\"code\":\"NZD\",\"title\":\"New Zealand Dollar\",\"symbol\":\"NZ$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"174\",\"max_amount\":\"1746220\"},\"PAB\":{\"code\":\"PAB\",\"title\":\"Panamanian Balboa\",\"symbol\":\"PAB\",\"native\":\"B\\/.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"98\",\"max_amount\":\"988722\"},\"PEN\":{\"code\":\"PEN\",\"title\":\"Peruvian Nuevo Sol\",\"symbol\":\"PEN\",\"native\":\"S\\/.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"390\",\"max_amount\":\"3902208\"},\"PHP\":{\"code\":\"PHP\",\"title\":\"Philippine Peso\",\"symbol\":\"PHP\",\"native\":\"₱\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5862\",\"max_amount\":\"58627496\"},\"PKR\":{\"code\":\"PKR\",\"title\":\"Pakistani Rupee\",\"symbol\":\"PKR\",\"native\":\"₨\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"22642\",\"max_amount\":\"226426805\"},\"PLN\":{\"code\":\"PLN\",\"title\":\"Polish Złoty\",\"symbol\":\"PLN\",\"native\":\"zł\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"493\",\"max_amount\":\"4932350\"},\"PYG\":{\"code\":\"PYG\",\"title\":\"Paraguayan Guaraní\",\"symbol\":\"PYG\",\"native\":\"₲\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":0,\"min_amount\":\"6977\",\"max_amount\":\"69772317\"},\"QAR\":{\"code\":\"QAR\",\"title\":\"Qatari Riyal\",\"symbol\":\"QAR\",\"native\":\"ر.ق.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"364\",\"max_amount\":\"3640989\"},\"RON\":{\"code\":\"RON\",\"title\":\"Romanian Leu\",\"symbol\":\"RON\",\"native\":\"RON\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"502\",\"max_amount\":\"5028645\"},\"RSD\":{\"code\":\"RSD\",\"title\":\"Serbian Dinar\",\"symbol\":\"RSD\",\"native\":\"дин.\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"11918\",\"max_amount\":\"119184990\"},\"RUB\":{\"code\":\"RUB\",\"title\":\"Russian Ruble\",\"symbol\":\"RUB\",\"native\":\"₽\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"7128\",\"max_amount\":\"71281218\"},\"SAR\":{\"code\":\"SAR\",\"title\":\"Saudi Riyal\",\"symbol\":\"SAR\",\"native\":\"ر.س.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"375\",\"max_amount\":\"3756546\"},\"SEK\":{\"code\":\"SEK\",\"title\":\"Swedish Krona\",\"symbol\":\"SEK\",\"native\":\"kr\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1109\",\"max_amount\":\"11094972\"},\"SGD\":{\"code\":\"SGD\",\"title\":\"Singapore Dollar\",\"symbol\":\"SGD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"143\",\"max_amount\":\"1430495\"},\"THB\":{\"code\":\"THB\",\"title\":\"Thai Baht\",\"symbol\":\"฿\",\"native\":\"฿\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"3780\",\"max_amount\":\"37800497\"},\"TJS\":{\"code\":\"TJS\",\"title\":\"Tajikistani Somoni\",\"symbol\":\"TJS\",\"native\":\"TJS\",\"thousands_sep\":\" \",\"decimal_sep\":\";\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"975\",\"max_amount\":\"9753854\"},\"TRY\":{\"code\":\"TRY\",\"title\":\"Turkish Lira\",\"symbol\":\"TRY\",\"native\":\"TL\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1854\",\"max_amount\":\"18543598\"},\"TTD\":{\"code\":\"TTD\",\"title\":\"Trinidad and Tobago Dollar\",\"symbol\":\"TTD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"672\",\"max_amount\":\"6722681\"},\"TWD\":{\"code\":\"TWD\",\"title\":\"New Taiwan Dollar\",\"symbol\":\"NT$\",\"native\":\"NT$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"3173\",\"max_amount\":\"31738502\"},\"TZS\":{\"code\":\"TZS\",\"title\":\"Tanzanian Shilling\",\"symbol\":\"TZS\",\"native\":\"TSh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"233199\",\"max_amount\":\"2331999890\"},\"UAH\":{\"code\":\"UAH\",\"title\":\"Ukrainian Hryvnia\",\"symbol\":\"UAH\",\"native\":\"₴\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":false,\"exp\":2,\"min_amount\":\"3633\",\"max_amount\":\"36338830\"},\"UGX\":{\"code\":\"UGX\",\"title\":\"Ugandan Shilling\",\"symbol\":\"UGX\",\"native\":\"USh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"3816\",\"max_amount\":\"38166726\"},\"USD\":{\"code\":\"USD\",\"title\":\"United States Dollar\",\"symbol\":\"$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"100\",\"max_amount\":1000000},\"UYU\":{\"code\":\"UYU\",\"title\":\"Uruguayan Peso\",\"symbol\":\"UYU\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"4080\",\"max_amount\":\"40801205\"},\"UZS\":{\"code\":\"UZS\",\"title\":\"Uzbekistani Som\",\"symbol\":\"UZS\",\"native\":\"UZS\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1089058\",\"max_amount\":\"10890583014\"},\"VND\":{\"code\":\"VND\",\"title\":\"Vietnamese Đồng\",\"symbol\":\"₫\",\"native\":\"₫\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":0,\"min_amount\":\"23862\",\"max_amount\":\"238625000\"},\"YER\":{\"code\":\"YER\",\"title\":\"Yemeni Rial\",\"symbol\":\"YER\",\"native\":\"ر.ي.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"25030\",\"max_amount\":\"250300677\"},\"ZAR\":{\"code\":\"ZAR\",\"title\":\"South African Rand\",\"symbol\":\"ZAR\",\"native\":\"R\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1789\",\"max_amount\":\"17894299\"}};\n\nexport default Currencies;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {EMOJI_VERSION} from '../environment/emojiVersionsSupport';\n\nexport const EmojiVersions: {[version in EMOJI_VERSION]: {[emoji: string]: number}} = {'14':{'1f6dd':4867, '1f6de':4916, '1f6df':4923, '1f7f0':62832, '1f979':183, '1f9cc':1557, '1fa7b':61332, '1fa7c':61330, '1faa9':51093, '1faaa':61364, '1faab':61189, '1faac':51085, '1fab7':2651, '1fab8':2631, '1fab9':2672, '1faba':2673, '1fac3':1520, '1fac4':1521, '1fac5':1505, '1fad7':3793, '1fad8':3707, '1fad9':3804, '1fae0':111, '1fae1':136, '1fae2':132, '1fae3':133, '1fae4':174, '1fae5':142, '1fae6':1385, '1fae7':61353, '1faf0':1341, '1faf1':1332, '1faf2':1333, '1faf3':1334, '1faf4':1335, '1faf5':1351, '1faf6':1360, '1faf1-1f3fb-200d-1faf2-1f3fc':0, '1faf1-1f3fb-200d-1faf2-1f3fd':0, '1faf1-1f3fb-200d-1faf2-1f3fe':0, '1faf1-1f3fb-200d-1faf2-1f3ff':0, '1faf1-1f3fc-200d-1faf2-1f3fb':0, '1faf1-1f3fc-200d-1faf2-1f3fd':0, '1faf1-1f3fc-200d-1faf2-1f3fe':0, '1faf1-1f3fc-200d-1faf2-1f3ff':0, '1faf1-1f3fd-200d-1faf2-1f3fb':0, '1faf1-1f3fd-200d-1faf2-1f3fc':0, '1faf1-1f3fd-200d-1faf2-1f3fe':0, '1faf1-1f3fd-200d-1faf2-1f3ff':0, '1faf1-1f3fe-200d-1faf2-1f3fb':0, '1faf1-1f3fe-200d-1faf2-1f3fc':0, '1faf1-1f3fe-200d-1faf2-1f3fd':0, '1faf1-1f3fe-200d-1faf2-1f3ff':0, '1faf1-1f3ff-200d-1faf2-1f3fb':0, '1faf1-1f3ff-200d-1faf2-1f3fc':0, '1faf1-1f3ff-200d-1faf2-1f3fd':0, '1faf1-1f3ff-200d-1faf2-1f3fe':0, '1fac3-1f3fb':0, '1fac3-1f3fc':0, '1fac3-1f3fd':0, '1fac3-1f3fe':0, '1fac3-1f3ff':0, '1fac4-1f3fb':0, '1fac4-1f3fc':0, '1fac4-1f3fd':0, '1fac4-1f3fe':0, '1fac4-1f3ff':0, '1fac5-1f3fb':0, '1fac5-1f3fc':0, '1fac5-1f3fd':0, '1fac5-1f3fe':0, '1fac5-1f3ff':0, '1faf0-1f3fb':0, '1faf0-1f3fc':0, '1faf0-1f3fd':0, '1faf0-1f3fe':0, '1faf0-1f3ff':0, '1faf1-1f3fb':0, '1faf1-1f3fc':0, '1faf1-1f3fd':0, '1faf1-1f3fe':0, '1faf1-1f3ff':0, '1faf2-1f3fb':0, '1faf2-1f3fc':0, '1faf2-1f3fd':0, '1faf2-1f3fe':0, '1faf2-1f3ff':0, '1faf3-1f3fb':0, '1faf3-1f3fc':0, '1faf3-1f3fd':0, '1faf3-1f3fe':0, '1faf3-1f3ff':0, '1faf4-1f3fb':0, '1faf4-1f3fc':0, '1faf4-1f3fd':0, '1faf4-1f3fe':0, '1faf4-1f3ff':0, '1faf5-1f3fb':0, '1faf5-1f3fc':0, '1faf5-1f3fd':0, '1faf5-1f3fe':0, '1faf5-1f3ff':0, '1faf6-1f3fb':0, '1faf6-1f3fc':0, '1faf6-1f3fd':0, '1faf6-1f3fe':0, '1faf6-1f3ff':0}, '':{'2049':62835, '2122':62863, '2139':62888, '2194':62764, '2195':62763, '2196':62762, '2197':62756, '2198':62758, '2199':62760, '2328':61194, '2600':4990, '2601':4998, '2602':41013, '2603':41018, '2604':41020, '2611':62851, '2614':41014, '2615':3781, '2618':2667, '2620':1106, '2622':62753, '2623':62754, '2626':62783, '2638':62780, '2639':177, '2648':62788, '2649':62789, '2650':62796, '2651':62797, '2652':62798, '2653':62799, '2660':51095, '2663':51098, '2665':51096, '2666':51097, '2668':4865, '2692':61297, '2693':4922, '2694':61300, '2696':61311, '2697':61319, '2699':61309, '2702':61284, '2705':62850, '2708':4931, '2709':61245, '2712':61259, '2714':62852, '2716':62828, '2721':62779, '2728':51029, '2733':62858, '2734':62859, '2744':41017, '2747':62860, '2753':62836, '2754':62837, '2755':62838, '2757':62839, '2763':1137, '2764':1141, '2795':62829, '2796':62830, '2797':62831, '2934':62767, '2935':62768, '3030':62840, '3297':62912, '3299':62913, '0023-20e3':62864, '002a-20e3':62865, '0030-20e3':62866, '0031-20e3':62867, '0032-20e3':62868, '0033-20e3':62869, '0034-20e3':62870, '0035-20e3':62871, '0036-20e3':62872, '0037-20e3':62873, '0038-20e3':62874, '0039-20e3':62875, '00a9':62861, '00ae':62862, '1f004':51101, '1f0cf':51100, '1f170':62882, '1f171':62884, '1f17e':62893, '1f17f':62895, '1f18e':62883, '1f191':62885, '1f192':62886, '1f193':62887, '1f194':62889, '1f195':62891, '1f196':62892, '1f197':62894, '1f198':62896, '1f199':62897, '1f19a':62898, '1f1e6-1f1e8':71594, '1f1e6-1f1e9':71595, '1f1e6-1f1ea':71596, '1f1e6-1f1eb':71597, '1f1e6-1f1ec':71598, '1f1e6-1f1ee':71599, '1f1e6-1f1f1':71600, '1f1e6-1f1f2':71601, '1f1e6-1f1f4':71602, '1f1e6-1f1f6':71603, '1f1e6-1f1f7':71604, '1f1e6-1f1f8':71605, '1f1e6-1f1f9':71606, '1f1e6-1f1fa':71607, '1f1e6-1f1fc':71608, '1f1e6-1f1fd':71609, '1f1e6-1f1ff':71610, '1f1e7-1f1e6':71611, '1f1e7-1f1e7':71612, '1f1e7-1f1e9':71613, '1f1e7-1f1ea':71614, '1f1e7-1f1eb':71615, '1f1e7-1f1ec':71616, '1f1e7-1f1ed':71617, '1f1e7-1f1ee':71618, '1f1e7-1f1ef':71619, '1f1e7-1f1f1':71620, '1f1e7-1f1f2':71621, '1f1e7-1f1f3':71622, '1f1e7-1f1f4':71623, '1f1e7-1f1f6':71624, '1f1e7-1f1f7':71625, '1f1e7-1f1f8':71626, '1f1e7-1f1f9':71627, '1f1e7-1f1fb':71628, '1f1e7-1f1fc':71629, '1f1e7-1f1fe':71630, '1f1e7-1f1ff':71631, '1f1e8-1f1e6':71632, '1f1e8-1f1e8':71633, '1f1e8-1f1e9':71634, '1f1e8-1f1eb':71635, '1f1e8-1f1ec':71636, '1f1e8-1f1ed':71637, '1f1e8-1f1ee':71638, '1f1e8-1f1f0':71639, '1f1e8-1f1f1':71640, '1f1e8-1f1f2':71641, '1f1e8-1f1f3':71642, '1f1e8-1f1f4':71643, '1f1e8-1f1f5':71644, '1f1e8-1f1f7':71645, '1f1e8-1f1fa':71646, '1f1e8-1f1fb':71647, '1f1e8-1f1fc':71648, '1f1e8-1f1fd':71649, '1f1e8-1f1fe':71650, '1f1e8-1f1ff':71651, '1f1e9-1f1ea':71652, '1f1e9-1f1ec':71653, '1f1e9-1f1ef':71654, '1f1e9-1f1f0':71655, '1f1e9-1f1f2':71656, '1f1e9-1f1f4':71657, '1f1e9-1f1ff':71658, '1f1ea-1f1e6':71659, '1f1ea-1f1e8':71660, '1f1ea-1f1ea':71661, '1f1ea-1f1ec':71662, '1f1ea-1f1ed':71663, '1f1ea-1f1f7':71664, '1f1ea-1f1f8':71665, '1f1ea-1f1f9':71666, '1f1ea-1f1fa':71667, '1f1eb-1f1ee':71668, '1f1eb-1f1ef':71669, '1f1eb-1f1f0':71670, '1f1eb-1f1f2':71671, '1f1eb-1f1f4':71672, '1f1eb-1f1f7':71673, '1f1ec-1f1e6':71674, '1f1ec-1f1e7':71675, '1f1ec-1f1e9':71676, '1f1ec-1f1ea':71677, '1f1ec-1f1eb':71678, '1f1ec-1f1ec':71679, '1f1ec-1f1ed':71680, '1f1ec-1f1ee':71681, '1f1ec-1f1f1':71682, '1f1ec-1f1f2':71683, '1f1ec-1f1f3':71684, '1f1ec-1f1f5':71685, '1f1ec-1f1f6':71686, '1f1ec-1f1f7':71687, '1f1ec-1f1f8':71688, '1f1ec-1f1f9':71689, '1f1ec-1f1fa':71690, '1f1ec-1f1fc':71691, '1f1ec-1f1fe':71692, '1f1ed-1f1f0':71693, '1f1ed-1f1f2':71694, '1f1ed-1f1f3':71695, '1f1ed-1f1f7':71696, '1f1ed-1f1f9':71697, '1f1ed-1f1fa':71698, '1f1ee-1f1e8':71699, '1f1ee-1f1e9':71700, '1f1ee-1f1ea':71701, '1f1ee-1f1f1':71702, '1f1ee-1f1f2':71703, '1f1ee-1f1f3':71704, '1f1ee-1f1f4':71705, '1f1ee-1f1f6':71706, '1f1ee-1f1f7':71707, '1f1ee-1f1f8':71708, '1f1ee-1f1f9':71709, '1f1ef-1f1ea':71710, '1f1ef-1f1f2':71711, '1f1ef-1f1f4':71712, '1f1ef-1f1f5':71713, '1f1f0-1f1ea':71714, '1f1f0-1f1ec':71715, '1f1f0-1f1ed':71716, '1f1f0-1f1ee':71717, '1f1f0-1f1f2':71718, '1f1f0-1f1f3':71719, '1f1f0-1f1f5':71720, '1f1f0-1f1f7':71721, '1f1f0-1f1fc':71722, '1f1f0-1f1fe':71723, '1f1f0-1f1ff':71724, '1f1f1-1f1e6':71725, '1f1f1-1f1e7':71726, '1f1f1-1f1e8':71727, '1f1f1-1f1ee':71728, '1f1f1-1f1f0':71729, '1f1f1-1f1f7':71730, '1f1f1-1f1f8':71731, '1f1f1-1f1f9':71732, '1f1f1-1f1fa':71733, '1f1f1-1f1fb':71734, '1f1f1-1f1fe':71735, '1f1f2-1f1e6':71736, '1f1f2-1f1e8':71737, '1f1f2-1f1e9':71738, '1f1f2-1f1ea':71739, '1f1f2-1f1eb':71740, '1f1f2-1f1ec':71741, '1f1f2-1f1ed':71742, '1f1f2-1f1f0':71743, '1f1f2-1f1f1':71744, '1f1f2-1f1f2':71745, '1f1f2-1f1f3':71746, '1f1f2-1f1f4':71747, '1f1f2-1f1f5':71748, '1f1f2-1f1f6':71749, '1f1f2-1f1f7':71750, '1f1f2-1f1f8':71751, '1f1f2-1f1f9':71752, '1f1f2-1f1fa':71753, '1f1f2-1f1fb':71754, '1f1f2-1f1fc':71755, '1f1f2-1f1fd':71756, '1f1f2-1f1fe':71757, '1f1f2-1f1ff':71758, '1f1f3-1f1e6':71759, '1f1f3-1f1e8':71760, '1f1f3-1f1ea':71761, '1f1f3-1f1eb':71762, '1f1f3-1f1ec':71763, '1f1f3-1f1ee':71764, '1f1f3-1f1f1':71765, '1f1f3-1f1f4':71766, '1f1f3-1f1f5':71767, '1f1f3-1f1f7':71768, '1f1f3-1f1fa':71769, '1f1f3-1f1ff':71770, '1f1f4-1f1f2':71771, '1f1f5-1f1e6':71772, '1f1f5-1f1ea':71773, '1f1f5-1f1eb':71774, '1f1f5-1f1ec':71775, '1f1f5-1f1ed':71776, '1f1f5-1f1f0':71777, '1f1f5-1f1f1':71778, '1f1f5-1f1f2':71779, '1f1f5-1f1f3':71780, '1f1f5-1f1f7':71781, '1f1f5-1f1f8':71782, '1f1f5-1f1f9':71783, '1f1f5-1f1fc':71784, '1f1f5-1f1fe':71785, '1f1f6-1f1e6':71786, '1f1f7-1f1ea':71787, '1f1f7-1f1f4':71788, '1f1f7-1f1f8':71789, '1f1f7-1f1fa':71790, '1f1f7-1f1fc':71791, '1f1f8-1f1e6':71792, '1f1f8-1f1e7':71793, '1f1f8-1f1e8':71794, '1f1f8-1f1e9':71795, '1f1f8-1f1ea':71796, '1f1f8-1f1ec':71797, '1f1f8-1f1ed':71798, '1f1f8-1f1ee':71799, '1f1f8-1f1ef':71800, '1f1f8-1f1f0':71801, '1f1f8-1f1f1':71802, '1f1f8-1f1f2':71803, '1f1f8-1f1f3':71804, '1f1f8-1f1f4':71805, '1f1f8-1f1f7':71806, '1f1f8-1f1f8':71807, '1f1f8-1f1f9':71808, '1f1f8-1f1fb':71809, '1f1f8-1f1fd':71810, '1f1f8-1f1fe':71811, '1f1f8-1f1ff':71812, '1f1f9-1f1e6':71813, '1f1f9-1f1e8':71814, '1f1f9-1f1e9':71815, '1f1f9-1f1eb':71816, '1f1f9-1f1ec':71817, '1f1f9-1f1ed':71818, '1f1f9-1f1ef':71819, '1f1f9-1f1f0':71820, '1f1f9-1f1f1':71821, '1f1f9-1f1f2':71822, '1f1f9-1f1f3':71823, '1f1f9-1f1f4':71824, '1f1f9-1f1f7':71825, '1f1f9-1f1f9':71826, '1f1f9-1f1fb':71827, '1f1f9-1f1fc':71828, '1f1f9-1f1ff':71829, '1f1fa-1f1e6':71830, '1f1fa-1f1ec':71831, '1f1fa-1f1f2':71832, '1f1fa-1f1f3':71833, '1f1fa-1f1f8':71834, '1f1fa-1f1fe':71835, '1f1fa-1f1ff':71836, '1f1fb-1f1e6':71837, '1f1fb-1f1e8':71838, '1f1fb-1f1ea':71839, '1f1fb-1f1ec':71840, '1f1fb-1f1ee':71841, '1f1fb-1f1f3':71842, '1f1fb-1f1fa':71843, '1f1fc-1f1eb':71844, '1f1fc-1f1f8':71845, '1f1fd-1f1f0':71846, '1f1fe-1f1ea':71847, '1f1fe-1f1f9':71848, '1f1ff-1f1e6':71849, '1f1ff-1f1f2':71850, '1f1ff-1f1fc':71851, '1f201':62899, '1f202':62900, '1f21a':62906, '1f22f':62903, '1f232':62907, '1f233':62911, '1f234':62910, '1f235':62915, '1f236':62902, '1f237':62901, '1f238':62909, '1f239':62905, '1f23a':62914, '1f250':62904, '1f251':62908, '1f300':41010, '1f301':4857, '1f302':41012, '1f303':4858, '1f304':4860, '1f305':4861, '1f306':4862, '1f307':4863, '1f308':41011, '1f309':4864, '1f30a':41023, '1f30b':4815, '1f30c':4997, '1f30d':4806, '1f30e':4807, '1f30f':4808, '1f310':4809, '1f311':4977, '1f312':4978, '1f313':4979, '1f314':4980, '1f315':4981, '1f316':4982, '1f317':4983, '1f318':4984, '1f319':4985, '1f31a':4986, '1f31b':4987, '1f31c':4988, '1f31d':4991, '1f31e':4992, '1f31f':4995, '1f320':4996, '1f321':4989, '1f324':41001, '1f325':41002, '1f326':41003, '1f327':41004, '1f328':41005, '1f329':41006, '1f32a':41007, '1f32b':41008, '1f32c':41009, '1f32d':3725, '1f32e':3727, '1f32f':3728, '1f330':3708, '1f331':2659, '1f332':2661, '1f333':2662, '1f334':2663, '1f335':2664, '1f336':3698, '1f337':2658, '1f338':2649, '1f339':2653, '1f33a':2655, '1f33b':2656, '1f33c':2657, '1f33d':3697, '1f33e':2665, '1f33f':2666, '1f340':2668, '1f341':2669, '1f342':2670, '1f343':2671, '1f344':3705, '1f345':3690, '1f346':3694, '1f347':3674, '1f348':3675, '1f349':3676, '1f34a':3677, '1f34b':3678, '1f34c':3679, '1f34d':3680, '1f34e':3682, '1f34f':3683, '1f350':3684, '1f351':3685, '1f352':3686, '1f353':3687, '1f354':3722, '1f355':3724, '1f356':3718, '1f357':3719, '1f358':3744, '1f359':3745, '1f35a':3746, '1f35b':3747, '1f35c':3748, '1f35d':3749, '1f35e':3709, '1f35f':3723, '1f360':3750, '1f361':3756, '1f362':3751, '1f363':3752, '1f364':3753, '1f365':3754, '1f366':3765, '1f367':3766, '1f368':3767, '1f369':3768, '1f36a':3769, '1f36b':3774, '1f36c':3775, '1f36d':3776, '1f36e':3777, '1f36f':3778, '1f370':3771, '1f371':3743, '1f372':3735, '1f373':3733, '1f374':3801, '1f375':3783, '1f376':3784, '1f377':3786, '1f378':3787, '1f379':3788, '1f37a':3789, '1f37b':3790, '1f37c':3779, '1f37d':3800, '1f37e':3785, '1f37f':3739, '1f380':51040, '1f381':51041, '1f382':3770, '1f383':51024, '1f384':51025, '1f385':1527, '1f386':51026, '1f387':51027, '1f388':51030, '1f389':51031, '1f38a':51032, '1f38b':51033, '1f38c':71588, '1f38d':51034, '1f38e':51035, '1f38f':51036, '1f390':51037, '1f391':51038, '1f392':61134, '1f393':61147, '1f396':51045, '1f397':51042, '1f399':61167, '1f39a':61168, '1f39b':61169, '1f39e':61203, '1f39f':51043, '1f3a0':4866, '1f3a1':4868, '1f3a2':4869, '1f3a3':51072, '1f3a4':61170, '1f3a5':61202, '1f3a6':62819, '1f3a7':61171, '1f3a8':51105, '1f3a9':61146, '1f3aa':4871, '1f3ab':51044, '1f3ac':61205, '1f3ad':51103, '1f3ae':51086, '1f3af':51078, '1f3b0':51088, '1f3b1':51081, '1f3b2':51089, '1f3b3':51060, '1f3b4':51102, '1f3b5':61165, '1f3b6':61166, '1f3b7':61173, '1f3b8':61175, '1f3b9':61176, '1f3ba':61177, '1f3bb':61178, '1f3bc':61164, '1f3bd':51074, '1f3be':51058, '1f3bf':51075, '1f3c0':51054, '1f3c1':71586, '1f3c2':1600, '1f3c3-200d-2640':1584, '1f3c3-200d-2642':1583, '1f3c3':1582, '1f3c4-200d-2640':1606, '1f3c4-200d-2642':1605, '1f3c4':1604, '1f3c5':51047, '1f3c6':51046, '1f3c7':1598, '1f3c8':51056, '1f3c9':51057, '1f3ca-200d-2640':1612, '1f3ca-200d-2642':1611, '1f3ca':1610, '1f3cb-200d-2640':1618, '1f3cb-200d-2642':1617, '1f3cb':1616, '1f3cc-200d-2640':1603, '1f3cc-200d-2642':1602, '1f3cc':1601, '1f3cd':4902, '1f3ce':4901, '1f3cf':51061, '1f3d0':51055, '1f3d1':51062, '1f3d2':51063, '1f3d3':51065, '1f3d4':4813, '1f3d5':4817, '1f3d6':4818, '1f3d7':4824, '1f3d8':4829, '1f3d9':4859, '1f3da':4830, '1f3db':4823, '1f3dc':4819, '1f3dd':4820, '1f3de':4821, '1f3df':4822, '1f3e0':4831, '1f3e1':4832, '1f3e2':4833, '1f3e3':4834, '1f3e4':4835, '1f3e5':4836, '1f3e6':4837, '1f3e7':62729, '1f3e8':4838, '1f3e9':4839, '1f3ea':4840, '1f3eb':4841, '1f3ec':4842, '1f3ed':4843, '1f3ee':61216, '1f3ef':4844, '1f3f0':4845, '1f3f3-200d-1f308':71591, '1f3f3-200d-26a7':71592, '1f3f3':71590, '1f3f4-200d-2620':71593, '1f3f4-e0067-e0062-e0065-e006e-e0067-e007f':71852, '1f3f4-e0067-e0062-e0073-e0063-e0074-e007f':71853, '1f3f4-e0067-e0062-e0077-e006c-e0073-e007f':71854, '1f3f4':71589, '1f3f5':2652, '1f3f7':61234, '1f3f8':51066, '1f3f9':61303, '1f3fa':3805, '1f3fb':9525, '1f3fc':9526, '1f3fd':9527, '1f3fe':9528, '1f3ff':9529, '1f400':2576, '1f401':2575, '1f402':2556, '1f403':2557, '1f404':2558, '1f405':2547, '1f406':2548, '1f407':2579, '1f408-200d-2b1b':2544, '1f408':2543, '1f409':2618, '1f40a':2613, '1f40b':2622, '1f40c':2632, '1f40d':2616, '1f40e':2550, '1f40f':2563, '1f410':2565, '1f411':2564, '1f412':2531, '1f413':2596, '1f414':2595, '1f415-200d-1f9ba':2537, '1f415':2535, '1f416':2560, '1f417':2561, '1f418':2570, '1f419':2629, '1f41a':2630, '1f41b':2634, '1f41c':2635, '1f41d':2636, '1f41e':2638, '1f41f':2625, '1f420':2626, '1f421':2627, '1f422':2614, '1f423':2597, '1f424':2598, '1f425':2599, '1f426':2600, '1f427':2601, '1f428':2586, '1f429':2538, '1f42a':2566, '1f42b':2567, '1f42c':2623, '1f42d':2574, '1f42e':2555, '1f42f':2546, '1f430':2578, '1f431':2542, '1f432':2617, '1f433':2621, '1f434':2549, '1f435':2530, '1f436':2534, '1f437':2559, '1f438':2612, '1f439':2577, '1f43a':2539, '1f43b-200d-2744':2585, '1f43b':2584, '1f43c':2587, '1f43d':2562, '1f43e':2593, '1f43f':2580, '1f440':1381, '1f441-200d-1f5e8':1159, '1f441':1382, '1f442':1373, '1f443':1375, '1f444':1384, '1f445':1383, '1f446':1347, '1f447':1349, '1f448':1345, '1f449':1346, '1f44a':1355, '1f44b':1327, '1f44c':1336, '1f44d':1352, '1f44e':1353, '1f44f':1358, '1f450':1361, '1f451':61144, '1f452':61145, '1f453':61110, '1f454':61115, '1f455':61116, '1f456':61117, '1f457':61122, '1f458':61123, '1f459':61128, '1f45a':61129, '1f45b':61130, '1f45c':61131, '1f45d':61132, '1f45e':61136, '1f45f':61137, '1f460':61140, '1f461':61141, '1f462':61143, '1f463':1687, '1f464':1684, '1f465':1685, '1f466':1388, '1f467':1389, '1f468-200d-1f33e':1457, '1f468-200d-1f373':1460, '1f468-200d-1f37c':1524, '1f468-200d-1f393':1448, '1f468-200d-1f3a4':1478, '1f468-200d-1f3a8':1481, '1f468-200d-1f3eb':1451, '1f468-200d-1f3ed':1466, '1f468-200d-1f466-200d-1f466':1674, '1f468-200d-1f466':1673, '1f468-200d-1f467-200d-1f466':1676, '1f468-200d-1f467-200d-1f467':1677, '1f468-200d-1f467':1675, '1f468-200d-1f468-200d-1f466':1663, '1f468-200d-1f468-200d-1f466-200d-1f466':1666, '1f468-200d-1f468-200d-1f467':1664, '1f468-200d-1f468-200d-1f467-200d-1f466':1665, '1f468-200d-1f468-200d-1f467-200d-1f467':1667, '1f468-200d-1f469-200d-1f466':1658, '1f468-200d-1f469-200d-1f466-200d-1f466':1661, '1f468-200d-1f469-200d-1f467':1659, '1f468-200d-1f469-200d-1f467-200d-1f466':1660, '1f468-200d-1f469-200d-1f467-200d-1f467':1662, '1f468-200d-1f4bb':1475, '1f468-200d-1f4bc':1469, '1f468-200d-1f527':1463, '1f468-200d-1f52c':1472, '1f468-200d-1f680':1487, '1f468-200d-1f692':1490, '1f468-200d-1f9af':1574, '1f468-200d-1f9b0':1396, '1f468-200d-1f9b1':1397, '1f468-200d-1f9b2':1399, '1f468-200d-1f9b3':1398, '1f468-200d-1f9bc':1577, '1f468-200d-1f9bd':1580, '1f468-200d-2695':1445, '1f468-200d-2696':1454, '1f468-200d-2708':1484, '1f468-200d-2764-200d-1f468':1655, '1f468-200d-2764-200d-1f48b-200d-1f468':1651, '1f468':1392, '1f469-200d-1f33e':1458, '1f469-200d-1f373':1461, '1f469-200d-1f37c':1523, '1f469-200d-1f393':1449, '1f469-200d-1f3a4':1479, '1f469-200d-1f3a8':1482, '1f469-200d-1f3eb':1452, '1f469-200d-1f3ed':1467, '1f469-200d-1f466-200d-1f466':1679, '1f469-200d-1f466':1678, '1f469-200d-1f467-200d-1f466':1681, '1f469-200d-1f467-200d-1f467':1682, '1f469-200d-1f467':1680, '1f469-200d-1f469-200d-1f466':1668, '1f469-200d-1f469-200d-1f466-200d-1f466':1671, '1f469-200d-1f469-200d-1f467':1669, '1f469-200d-1f469-200d-1f467-200d-1f466':1670, '1f469-200d-1f469-200d-1f467-200d-1f467':1672, '1f469-200d-1f4bb':1476, '1f469-200d-1f4bc':1470, '1f469-200d-1f527':1464, '1f469-200d-1f52c':1473, '1f469-200d-1f680':1488, '1f469-200d-1f692':1491, '1f469-200d-1f9af':1575, '1f469-200d-1f9b0':1401, '1f469-200d-1f9b1':1403, '1f469-200d-1f9b2':1407, '1f469-200d-1f9b3':1405, '1f469-200d-1f9bc':1578, '1f469-200d-1f9bd':1581, '1f469-200d-2695':1446, '1f469-200d-2696':1455, '1f469-200d-2708':1485, '1f469-200d-2764-200d-1f468':1654, '1f469-200d-2764-200d-1f469':1656, '1f469-200d-2764-200d-1f48b-200d-1f468':1650, '1f469-200d-2764-200d-1f48b-200d-1f469':1652, '1f469':1400, '1f46a':1657, '1f46b':1647, '1f46c':1648, '1f46d':1646, '1f46e-200d-2640':1494, '1f46e-200d-2642':1493, '1f46e':1492, '1f46f-200d-2640':1590, '1f46f-200d-2642':1589, '1f46f':1588, '1f470-200d-2640':1518, '1f470-200d-2642':1517, '1f470':1516, '1f471-200d-2640':1409, '1f471-200d-2642':1410, '1f471':1391, '1f472':1511, '1f473-200d-2640':1510, '1f473-200d-2642':1509, '1f473':1508, '1f474':1412, '1f475':1413, '1f476':1386, '1f477-200d-2640':1504, '1f477-200d-2642':1503, '1f477':1502, '1f478':1507, '1f479':1109, '1f47a':1110, '1f47b':1111, '1f47c':1526, '1f47d':1112, '1f47e':1113, '1f47f':1104, '1f480':1105, '1f481-200d-2640':1428, '1f481-200d-2642':1427, '1f481':1426, '1f482-200d-2640':1500, '1f482-200d-2642':1499, '1f482':1498, '1f483':1585, '1f484':61152, '1f485':1366, '1f486-200d-2640':1560, '1f486-200d-2642':1559, '1f486':1558, '1f487-200d-2640':1563, '1f487-200d-2642':1562, '1f487':1561, '1f488':4870, '1f489':61326, '1f48a':61328, '1f48b':1127, '1f48c':1128, '1f48d':61153, '1f48e':61154, '1f48f':1649, '1f490':2648, '1f491':1653, '1f492':4846, '1f493':1133, '1f494':1138, '1f495':1135, '1f496':1131, '1f497':1132, '1f498':1129, '1f499':1145, '1f49a':1144, '1f49b':1143, '1f49c':1146, '1f49d':1130, '1f49e':1134, '1f49f':1136, '1f4a0':62946, '1f4a1':61214, '1f4a2':1151, '1f4a3':1157, '1f4a4':1163, '1f4a5':1152, '1f4a6':1154, '1f4a7':41022, '1f4a8':1155, '1f4a9':1107, '1f4aa':1368, '1f4ab':1153, '1f4ac':1158, '1f4ad':1162, '1f4ae':2650, '1f4af':1150, '1f4b0':61235, '1f4b1':62841, '1f4b2':62842, '1f4b3':61242, '1f4b4':61237, '1f4b5':61238, '1f4b6':61239, '1f4b7':61240, '1f4b8':61241, '1f4b9':61244, '1f4ba':4936, '1f4bb':61191, '1f4bc':61265, '1f4bd':61197, '1f4be':61198, '1f4bf':61199, '1f4c0':61200, '1f4c1':61266, '1f4c2':61267, '1f4c3':61227, '1f4c4':61229, '1f4c5':61269, '1f4c6':61270, '1f4c7':61273, '1f4c8':61274, '1f4c9':61275, '1f4ca':61276, '1f4cb':61277, '1f4cc':61278, '1f4cd':61279, '1f4ce':61280, '1f4cf':61282, '1f4d0':61283, '1f4d1':61232, '1f4d2':61226, '1f4d3':61225, '1f4d4':61218, '1f4d5':61219, '1f4d6':61220, '1f4d7':61221, '1f4d8':61222, '1f4d9':61223, '1f4da':61224, '1f4db':62847, '1f4dc':61228, '1f4dd':61264, '1f4de':61185, '1f4df':61186, '1f4e0':61187, '1f4e1':61325, '1f4e2':61159, '1f4e3':61160, '1f4e4':61249, '1f4e5':61250, '1f4e6':61251, '1f4e7':61246, '1f4e8':61247, '1f4e9':61248, '1f4ea':61253, '1f4eb':61252, '1f4ec':61254, '1f4ed':61255, '1f4ee':61256, '1f4ef':61161, '1f4f0':61230, '1f4f1':61182, '1f4f2':61183, '1f4f3':62823, '1f4f4':62824, '1f4f5':62751, '1f4f6':62822, '1f4f7':61207, '1f4f8':61208, '1f4f9':61209, '1f4fa':61206, '1f4fb':61172, '1f4fc':61210, '1f4fd':61204, '1f4ff':61151, '1f500':62801, '1f501':62802, '1f502':62803, '1f503':62769, '1f504':62770, '1f505':62820, '1f506':62821, '1f507':61155, '1f508':61156, '1f509':61157, '1f50a':61158, '1f50b':61188, '1f50c':61190, '1f50d':61211, '1f50e':61212, '1f50f':61290, '1f510':61291, '1f511':61292, '1f512':61288, '1f513':61289, '1f514':61162, '1f515':61163, '1f516':61233, '1f517':61313, '1f518':62947, '1f519':62771, '1f51a':62772, '1f51b':62773, '1f51c':62774, '1f51d':62775, '1f51e':62752, '1f51f':62876, '1f520':62877, '1f521':62878, '1f522':62879, '1f523':62880, '1f524':62881, '1f525':41021, '1f526':61215, '1f527':61306, '1f528':61294, '1f529':61308, '1f52a':3803, '1f52b':61301, '1f52c':61323, '1f52d':61324, '1f52e':51082, '1f52f':62787, '1f530':62848, '1f531':62846, '1f532':62949, '1f533':62948, '1f534':62916, '1f535':62920, '1f536':62940, '1f537':62941, '1f538':62942, '1f539':62943, '1f53a':62944, '1f53b':62945, '1f53c':62811, '1f53d':62813, '1f549':62778, '1f54a':2602, '1f54b':4854, '1f54c':4850, '1f54d':4852, '1f54e':62786, '1f550':4955, '1f551':4957, '1f552':4959, '1f553':4961, '1f554':4963, '1f555':4965, '1f556':4967, '1f557':4969, '1f558':4971, '1f559':4973, '1f55a':4975, '1f55b':4953, '1f55c':4956, '1f55d':4958, '1f55e':4960, '1f55f':4962, '1f560':4964, '1f561':4966, '1f562':4968, '1f563':4970, '1f564':4972, '1f565':4974, '1f566':4976, '1f567':4954, '1f56f':61213, '1f570':4952, '1f573':1156, '1f574':1587, '1f575-200d-2640':1497, '1f575-200d-2642':1496, '1f575':1495, '1f576':61111, '1f577':2641, '1f578':2642, '1f579':51087, '1f57a':1586, '1f587':61281, '1f58a':61261, '1f58b':61260, '1f58c':61262, '1f58d':61263, '1f590':1329, '1f595':1348, '1f596':1331, '1f5a4':1148, '1f5a5':61192, '1f5a8':61193, '1f5b1':61195, '1f5b2':61196, '1f5bc':51104, '1f5c2':61268, '1f5c3':61285, '1f5c4':61286, '1f5d1':61287, '1f5d2':61271, '1f5d3':61272, '1f5dc':61310, '1f5dd':61293, '1f5de':61231, '1f5e1':61299, '1f5e3':1683, '1f5e8':1160, '1f5ef':1161, '1f5f3':61257, '1f5fa':4810, '1f5fb':4816, '1f5fc':4847, '1f5fd':4848, '1f5fe':4811, '1f5ff':61362, '1f600':11, '1f601':14, '1f602':18, '1f603':12, '1f604':13, '1f605':16, '1f606':15, '1f607':114, '1f608':1103, '1f609':112, '1f60a':113, '1f60b':124, '1f60c':150, '1f60d':116, '1f60e':170, '1f60f':144, '1f610':139, '1f611':140, '1f612':145, '1f613':195, '1f614':151, '1f615':173, '1f616':192, '1f617':119, '1f618':118, '1f619':122, '1f61a':121, '1f61b':125, '1f61c':126, '1f61d':128, '1f61e':194, '1f61f':175, '1f620':1101, '1f621':1100, '1f622':189, '1f623':193, '1f624':199, '1f625':188, '1f626':184, '1f627':185, '1f628':186, '1f629':196, '1f62a':152, '1f62b':197, '1f62c':147, '1f62d':190, '1f62e-200d-1f4a8':148, '1f62e':178, '1f62f':179, '1f630':187, '1f631':191, '1f632':180, '1f633':181, '1f634':154, '1f635-200d-1f4ab':165, '1f635':164, '1f636-200d-1f32b':143, '1f636':141, '1f637':155, '1f638':1116, '1f639':1117, '1f63a':1115, '1f63b':1118, '1f63c':1119, '1f63d':1120, '1f63e':1123, '1f63f':1122, '1f640':1121, '1f641':176, '1f642':19, '1f643':110, '1f644':146, '1f645-200d-2640':1422, '1f645-200d-2642':1421, '1f645':1420, '1f646-200d-2640':1425, '1f646-200d-2642':1424, '1f646':1423, '1f647-200d-2640':1437, '1f647-200d-2642':1436, '1f647':1435, '1f648':1124, '1f649':1125, '1f64a':1126, '1f64b-200d-2640':1431, '1f64b-200d-2642':1430, '1f64b':1429, '1f64c':1359, '1f64d-200d-2640':1416, '1f64d-200d-2642':1415, '1f64d':1414, '1f64e-200d-2640':1419, '1f64e-200d-2642':1418, '1f64e':1417, '1f64f':1364, '1f680':4942, '1f681':4937, '1f682':4872, '1f683':4873, '1f684':4874, '1f685':4875, '1f686':4876, '1f687':4877, '1f688':4878, '1f689':4879, '1f68a':4880, '1f68b':4883, '1f68c':4884, '1f68d':4885, '1f68e':4886, '1f68f':4911, '1f690':4887, '1f691':4888, '1f692':4889, '1f693':4890, '1f694':4891, '1f695':4892, '1f696':4893, '1f697':4894, '1f698':4895, '1f699':4896, '1f69a':4898, '1f69b':4899, '1f69c':4900, '1f69d':4881, '1f69e':4882, '1f69f':4938, '1f6a0':4939, '1f6a1':4940, '1f6a2':4930, '1f6a3-200d-2640':1609, '1f6a3-200d-2642':1608, '1f6a3':1607, '1f6a4':4926, '1f6a5':4918, '1f6a6':4919, '1f6a7':4921, '1f6a8':4917, '1f6a9':71587, '1f6aa':61333, '1f6ab':62745, '1f6ac':61358, '1f6ad':62747, '1f6ae':62730, '1f6af':62748, '1f6b0':62731, '1f6b1':62749, '1f6b2':4907, '1f6b3':62746, '1f6b4-200d-2640':1621, '1f6b4-200d-2642':1620, '1f6b4':1619, '1f6b5-200d-2640':1624, '1f6b5-200d-2642':1623, '1f6b5':1622, '1f6b6-200d-2640':1566, '1f6b6-200d-2642':1565, '1f6b6':1564, '1f6b7':62750, '1f6b8':62743, '1f6b9':62733, '1f6ba':62734, '1f6bb':62735, '1f6bc':62736, '1f6bd':61340, '1f6be':62737, '1f6bf':61342, '1f6c0':1643, '1f6c1':61343, '1f6c2':62738, '1f6c3':62739, '1f6c4':62740, '1f6c5':62741, '1f6cb':61338, '1f6cc':1644, '1f6cd':61133, '1f6ce':4944, '1f6cf':61337, '1f6d0':62776, '1f6d1':4920, '1f6d2':61357, '1f6d5':4851, '1f6d6':4828, '1f6d7':61334, '1f6e0':61298, '1f6e1':61304, '1f6e2':4914, '1f6e3':4912, '1f6e4':4913, '1f6e5':4929, '1f6e9':4932, '1f6eb':4933, '1f6ec':4934, '1f6f0':4941, '1f6f3':4927, '1f6f4':4908, '1f6f5':4903, '1f6f6':4925, '1f6f7':51076, '1f6f8':4943, '1f6f9':4909, '1f6fa':4906, '1f6fb':4897, '1f6fc':4910, '1f7e0':62917, '1f7e1':62918, '1f7e2':62919, '1f7e3':62921, '1f7e4':62922, '1f7e5':62925, '1f7e6':62929, '1f7e7':62926, '1f7e8':62927, '1f7e9':62928, '1f7ea':62930, '1f7eb':62931, '1f90c':1337, '1f90d':1149, '1f90e':1147, '1f90f':1338, '1f910':137, '1f911':129, '1f912':156, '1f913':171, '1f914':135, '1f915':157, '1f916':1114, '1f917':130, '1f918':1343, '1f919':1344, '1f91a':1328, '1f91b':1356, '1f91c':1357, '1f91d':1363, '1f91e':1340, '1f91f':1342, '1f920':167, '1f921':1108, '1f922':158, '1f923':17, '1f924':153, '1f925':149, '1f926-200d-2640':1440, '1f926-200d-2642':1439, '1f926':1438, '1f927':160, '1f928':138, '1f929':117, '1f92a':127, '1f92b':134, '1f92c':1102, '1f92d':131, '1f92e':159, '1f92f':166, '1f930':1519, '1f931':1522, '1f932':1362, '1f933':1367, '1f934':1506, '1f935-200d-2640':1515, '1f935-200d-2642':1514, '1f935':1513, '1f936':1528, '1f937-200d-2640':1443, '1f937-200d-2642':1442, '1f937':1441, '1f938-200d-2640':1627, '1f938-200d-2642':1626, '1f938':1625, '1f939-200d-2640':1639, '1f939-200d-2642':1638, '1f939':1637, '1f93a':1597, '1f93c-200d-2640':1630, '1f93c-200d-2642':1629, '1f93c':1628, '1f93d-200d-2640':1633, '1f93d-200d-2642':1632, '1f93d':1631, '1f93e-200d-2640':1636, '1f93e-200d-2642':1635, '1f93e':1634, '1f93f':51073, '1f940':2654, '1f941':61180, '1f942':3791, '1f943':3792, '1f944':3802, '1f945':51069, '1f947':51048, '1f948':51049, '1f949':51050, '1f94a':51067, '1f94b':51068, '1f94c':51077, '1f94d':51064, '1f94e':51053, '1f94f':51059, '1f950':3710, '1f951':3693, '1f952':3700, '1f953':3721, '1f954':3695, '1f955':3696, '1f956':3711, '1f957':3738, '1f958':3734, '1f959':3730, '1f95a':3732, '1f95b':3780, '1f95c':3706, '1f95d':3689, '1f95e':3715, '1f95f':3757, '1f960':3758, '1f961':3759, '1f962':3799, '1f963':3737, '1f964':3794, '1f965':3692, '1f966':3702, '1f967':3773, '1f968':3713, '1f969':3720, '1f96a':3726, '1f96b':3742, '1f96c':3701, '1f96d':3681, '1f96e':3755, '1f96f':3714, '1f970':115, '1f971':198, '1f972':123, '1f973':168, '1f974':163, '1f975':161, '1f976':162, '1f977':1501, '1f978':169, '1f97a':182, '1f97b':61124, '1f97c':61113, '1f97d':61112, '1f97e':61138, '1f97f':61139, '1f980':3760, '1f981':2545, '1f982':2643, '1f983':2594, '1f984':2551, '1f985':2603, '1f986':2604, '1f987':2583, '1f988':2628, '1f989':2606, '1f98a':2540, '1f98b':2633, '1f98c':2553, '1f98d':2532, '1f98e':2615, '1f98f':2572, '1f990':3762, '1f991':3763, '1f992':2569, '1f993':2552, '1f994':2582, '1f995':2619, '1f996':2620, '1f997':2639, '1f998':2591, '1f999':2568, '1f99a':2610, '1f99b':2573, '1f99c':2611, '1f99d':2541, '1f99e':3761, '1f99f':2644, '1f9a0':2647, '1f9a1':2592, '1f9a2':2605, '1f9a3':2571, '1f9a4':2607, '1f9a5':2588, '1f9a6':2589, '1f9a7':2533, '1f9a8':2590, '1f9a9':2609, '1f9aa':3764, '1f9ab':2581, '1f9ac':2554, '1f9ad':2624, '1f9ae':2536, '1f9af':61312, '1f9b4':1380, '1f9b5':1371, '1f9b6':1372, '1f9b7':1379, '1f9b8-200d-2640':1532, '1f9b8-200d-2642':1531, '1f9b8':1530, '1f9b9-200d-2640':1535, '1f9b9-200d-2642':1534, '1f9b9':1533, '1f9ba':61114, '1f9bb':1374, '1f9bc':4905, '1f9bd':4904, '1f9be':1369, '1f9bf':1370, '1f9c0':3717, '1f9c1':3772, '1f9c2':3741, '1f9c3':3796, '1f9c4':3703, '1f9c5':3704, '1f9c6':3731, '1f9c7':3716, '1f9c8':3740, '1f9c9':3797, '1f9ca':3798, '1f9cb':3795, '1f9cd-200d-2640':1569, '1f9cd-200d-2642':1568, '1f9cd':1567, '1f9ce-200d-2640':1572, '1f9ce-200d-2642':1571, '1f9ce':1570, '1f9cf-200d-2640':1434, '1f9cf-200d-2642':1433, '1f9cf':1432, '1f9d0':172, '1f9d1-200d-1f33e':1456, '1f9d1-200d-1f373':1459, '1f9d1-200d-1f37c':1525, '1f9d1-200d-1f384':1529, '1f9d1-200d-1f393':1447, '1f9d1-200d-1f3a4':1477, '1f9d1-200d-1f3a8':1480, '1f9d1-200d-1f3eb':1450, '1f9d1-200d-1f3ed':1465, '1f9d1-200d-1f4bb':1474, '1f9d1-200d-1f4bc':1468, '1f9d1-200d-1f527':1462, '1f9d1-200d-1f52c':1471, '1f9d1-200d-1f680':1486, '1f9d1-200d-1f692':1489, '1f9d1-200d-1f91d-200d-1f9d1':1645, '1f9d1-200d-1f9af':1573, '1f9d1-200d-1f9b0':1402, '1f9d1-200d-1f9b1':1404, '1f9d1-200d-1f9b2':1408, '1f9d1-200d-1f9b3':1406, '1f9d1-200d-1f9bc':1576, '1f9d1-200d-1f9bd':1579, '1f9d1-200d-2695':1444, '1f9d1-200d-2696':1453, '1f9d1-200d-2708':1483, '1f9d1':1390, '1f9d2':1387, '1f9d3':1411, '1f9d4-200d-2640':1395, '1f9d4-200d-2642':1394, '1f9d4':1393, '1f9d5':1512, '1f9d6-200d-2640':1593, '1f9d6-200d-2642':1592, '1f9d6':1591, '1f9d7-200d-2640':1596, '1f9d7-200d-2642':1595, '1f9d7':1594, '1f9d8-200d-2640':1642, '1f9d8-200d-2642':1641, '1f9d8':1640, '1f9d9-200d-2640':1538, '1f9d9-200d-2642':1537, '1f9d9':1536, '1f9da-200d-2640':1541, '1f9da-200d-2642':1540, '1f9da':1539, '1f9db-200d-2640':1544, '1f9db-200d-2642':1543, '1f9db':1542, '1f9dc-200d-2640':1547, '1f9dc-200d-2642':1546, '1f9dc':1545, '1f9dd-200d-2640':1550, '1f9dd-200d-2642':1549, '1f9dd':1548, '1f9de-200d-2640':1553, '1f9de-200d-2642':1552, '1f9de':1551, '1f9df-200d-2640':1556, '1f9df-200d-2642':1555, '1f9df':1554, '1f9e0':1376, '1f9e1':1142, '1f9e2':61148, '1f9e3':61118, '1f9e4':61119, '1f9e5':61120, '1f9e6':61121, '1f9e7':51039, '1f9e8':51028, '1f9e9':51090, '1f9ea':61320, '1f9eb':61321, '1f9ec':61322, '1f9ed':4812, '1f9ee':61201, '1f9ef':61356, '1f9f0':61316, '1f9f1':4825, '1f9f2':61317, '1f9f3':4945, '1f9f4':61346, '1f9f5':51106, '1f9f6':51108, '1f9f7':61347, '1f9f8':51091, '1f9f9':61348, '1f9fa':61349, '1f9fb':61350, '1f9fc':61352, '1f9fd':61355, '1f9fe':61243, '1f9ff':51084, '1fa70':61142, '1fa71':61125, '1fa72':61126, '1fa73':61127, '1fa74':61135, '1fa78':61327, '1fa79':61329, '1fa7a':61331, '1fa80':51079, '1fa81':51080, '1fa82':4935, '1fa83':61302, '1fa84':51083, '1fa85':51092, '1fa86':51094, '1fa90':4993, '1fa91':61339, '1fa92':61345, '1fa93':61295, '1fa94':61217, '1fa95':61179, '1fa96':61149, '1fa97':61174, '1fa98':61181, '1fa99':61236, '1fa9a':61305, '1fa9b':61307, '1fa9c':61318, '1fa9d':61315, '1fa9e':61335, '1fa9f':61336, '1faa0':61341, '1faa1':51107, '1faa2':51109, '1faa3':61351, '1faa4':61344, '1faa5':61354, '1faa6':61360, '1faa7':61363, '1faa8':4826, '1fab0':2645, '1fab1':2646, '1fab2':2637, '1fab3':2640, '1fab4':2660, '1fab5':4827, '1fab6':2608, '1fac0':1377, '1fac1':1378, '1fac2':1686, '1fad0':3688, '1fad1':3699, '1fad2':3691, '1fad3':3712, '1fad4':3729, '1fad5':3736, '1fad6':3782, '203c':62834, '21a9':62765, '21aa':62766, '231a':4948, '231b':4946, '23cf':62818, '23e9':62805, '23ea':62809, '23eb':62812, '23ec':62814, '23ed':62806, '23ee':62810, '23ef':62807, '23f0':4949, '23f1':4950, '23f2':4951, '23f3':4947, '23f8':62815, '23f9':62816, '23fa':62817, '24c2':62890, '25aa':62938, '25ab':62939, '25b6':62804, '25c0':62808, '25fb':62935, '25fc':62934, '25fd':62937, '25fe':62936, '260e':61184, '261d':1350, '262a':62784, '262e':62785, '262f':62781, '263a':120, '264a':62790, '264b':62791, '264c':62792, '264d':62793, '264e':62794, '264f':62795, '265f':51099, '267b':62844, '267e':62833, '267f':62732, '269b':62777, '269c':62845, '26a0':62742, '26a1':41016, '26a7':62827, '26aa':62924, '26ab':62923, '26b0':61359, '26b1':61361, '26bd':51051, '26be':51052, '26c4':41019, '26c5':4999, '26c8':41000, '26ce':62800, '26cf':61296, '26d1':61150, '26d3':61314, '26d4':62744, '26e9':4853, '26ea':4849, '26f0':4814, '26f1':41015, '26f2':4855, '26f3':51070, '26f4':4928, '26f5':4924, '26f7':1599, '26f8':51071, '26f9-200d-2640':1615, '26f9-200d-2642':1614, '26f9':1613, '26fa':4856, '26fd':4915, '270a':1354, '270b':1330, '270c':1339, '270d':1365, '270f':61258, '271d':62782, '274c':62853, '274e':62854, '2764-200d-1f525':1139, '2764-200d-1fa79':1140, '27a1':62757, '27b0':62855, '27bf':62856, '2b05':62761, '2b06':62755, '2b07':62759, '2b1b':62932, '2b1c':62933, '2b50':4994, '2b55':62849, '303d':62857, '1f385-1f3fb':0, '1f385-1f3fc':0, '1f385-1f3fd':0, '1f385-1f3fe':0, '1f385-1f3ff':0, '1f3c2-1f3fb':0, '1f3c2-1f3fc':0, '1f3c2-1f3fd':0, '1f3c2-1f3fe':0, '1f3c2-1f3ff':0, '1f3c3-1f3fb-200d-2640':0, '1f3c3-1f3fc-200d-2640':0, '1f3c3-1f3fd-200d-2640':0, '1f3c3-1f3fe-200d-2640':0, '1f3c3-1f3ff-200d-2640':0, '1f3c3-1f3fb-200d-2642':0, '1f3c3-1f3fc-200d-2642':0, '1f3c3-1f3fd-200d-2642':0, '1f3c3-1f3fe-200d-2642':0, '1f3c3-1f3ff-200d-2642':0, '1f3c3-1f3fb':0, '1f3c3-1f3fc':0, '1f3c3-1f3fd':0, '1f3c3-1f3fe':0, '1f3c3-1f3ff':0, '1f3c4-1f3fb-200d-2640':0, '1f3c4-1f3fc-200d-2640':0, '1f3c4-1f3fd-200d-2640':0, '1f3c4-1f3fe-200d-2640':0, '1f3c4-1f3ff-200d-2640':0, '1f3c4-1f3fb-200d-2642':0, '1f3c4-1f3fc-200d-2642':0, '1f3c4-1f3fd-200d-2642':0, '1f3c4-1f3fe-200d-2642':0, '1f3c4-1f3ff-200d-2642':0, '1f3c4-1f3fb':0, '1f3c4-1f3fc':0, '1f3c4-1f3fd':0, '1f3c4-1f3fe':0, '1f3c4-1f3ff':0, '1f3c7-1f3fb':0, '1f3c7-1f3fc':0, '1f3c7-1f3fd':0, '1f3c7-1f3fe':0, '1f3c7-1f3ff':0, '1f3ca-1f3fb-200d-2640':0, '1f3ca-1f3fc-200d-2640':0, '1f3ca-1f3fd-200d-2640':0, '1f3ca-1f3fe-200d-2640':0, '1f3ca-1f3ff-200d-2640':0, '1f3ca-1f3fb-200d-2642':0, '1f3ca-1f3fc-200d-2642':0, '1f3ca-1f3fd-200d-2642':0, '1f3ca-1f3fe-200d-2642':0, '1f3ca-1f3ff-200d-2642':0, '1f3ca-1f3fb':0, '1f3ca-1f3fc':0, '1f3ca-1f3fd':0, '1f3ca-1f3fe':0, '1f3ca-1f3ff':0, '1f3cb-1f3fb-200d-2640':0, '1f3cb-1f3fc-200d-2640':0, '1f3cb-1f3fd-200d-2640':0, '1f3cb-1f3fe-200d-2640':0, '1f3cb-1f3ff-200d-2640':0, '1f3cb-1f3fb-200d-2642':0, '1f3cb-1f3fc-200d-2642':0, '1f3cb-1f3fd-200d-2642':0, '1f3cb-1f3fe-200d-2642':0, '1f3cb-1f3ff-200d-2642':0, '1f3cb-1f3fb':0, '1f3cb-1f3fc':0, '1f3cb-1f3fd':0, '1f3cb-1f3fe':0, '1f3cb-1f3ff':0, '1f3cc-1f3fb-200d-2640':0, '1f3cc-1f3fc-200d-2640':0, '1f3cc-1f3fd-200d-2640':0, '1f3cc-1f3fe-200d-2640':0, '1f3cc-1f3ff-200d-2640':0, '1f3cc-1f3fb-200d-2642':0, '1f3cc-1f3fc-200d-2642':0, '1f3cc-1f3fd-200d-2642':0, '1f3cc-1f3fe-200d-2642':0, '1f3cc-1f3ff-200d-2642':0, '1f3cc-1f3fb':0, '1f3cc-1f3fc':0, '1f3cc-1f3fd':0, '1f3cc-1f3fe':0, '1f3cc-1f3ff':0, '1f442-1f3fb':0, '1f442-1f3fc':0, '1f442-1f3fd':0, '1f442-1f3fe':0, '1f442-1f3ff':0, '1f443-1f3fb':0, '1f443-1f3fc':0, '1f443-1f3fd':0, '1f443-1f3fe':0, '1f443-1f3ff':0, '1f446-1f3fb':0, '1f446-1f3fc':0, '1f446-1f3fd':0, '1f446-1f3fe':0, '1f446-1f3ff':0, '1f447-1f3fb':0, '1f447-1f3fc':0, '1f447-1f3fd':0, '1f447-1f3fe':0, '1f447-1f3ff':0, '1f448-1f3fb':0, '1f448-1f3fc':0, '1f448-1f3fd':0, '1f448-1f3fe':0, '1f448-1f3ff':0, '1f449-1f3fb':0, '1f449-1f3fc':0, '1f449-1f3fd':0, '1f449-1f3fe':0, '1f449-1f3ff':0, '1f44a-1f3fb':0, '1f44a-1f3fc':0, '1f44a-1f3fd':0, '1f44a-1f3fe':0, '1f44a-1f3ff':0, '1f44b-1f3fb':0, '1f44b-1f3fc':0, '1f44b-1f3fd':0, '1f44b-1f3fe':0, '1f44b-1f3ff':0, '1f44c-1f3fb':0, '1f44c-1f3fc':0, '1f44c-1f3fd':0, '1f44c-1f3fe':0, '1f44c-1f3ff':0, '1f44d-1f3fb':0, '1f44d-1f3fc':0, '1f44d-1f3fd':0, '1f44d-1f3fe':0, '1f44d-1f3ff':0, '1f44e-1f3fb':0, '1f44e-1f3fc':0, '1f44e-1f3fd':0, '1f44e-1f3fe':0, '1f44e-1f3ff':0, '1f44f-1f3fb':0, '1f44f-1f3fc':0, '1f44f-1f3fd':0, '1f44f-1f3fe':0, '1f44f-1f3ff':0, '1f450-1f3fb':0, '1f450-1f3fc':0, '1f450-1f3fd':0, '1f450-1f3fe':0, '1f450-1f3ff':0, '1f466-1f3fb':0, '1f466-1f3fc':0, '1f466-1f3fd':0, '1f466-1f3fe':0, '1f466-1f3ff':0, '1f467-1f3fb':0, '1f467-1f3fc':0, '1f467-1f3fd':0, '1f467-1f3fe':0, '1f467-1f3ff':0, '1f468-1f3fb-200d-1f33e':0, '1f468-1f3fc-200d-1f33e':0, '1f468-1f3fd-200d-1f33e':0, '1f468-1f3fe-200d-1f33e':0, '1f468-1f3ff-200d-1f33e':0, '1f468-1f3fb-200d-1f373':0, '1f468-1f3fc-200d-1f373':0, '1f468-1f3fd-200d-1f373':0, '1f468-1f3fe-200d-1f373':0, '1f468-1f3ff-200d-1f373':0, '1f468-1f3fb-200d-1f37c':0, '1f468-1f3fc-200d-1f37c':0, '1f468-1f3fd-200d-1f37c':0, '1f468-1f3fe-200d-1f37c':0, '1f468-1f3ff-200d-1f37c':0, '1f468-1f3fb-200d-1f393':0, '1f468-1f3fc-200d-1f393':0, '1f468-1f3fd-200d-1f393':0, '1f468-1f3fe-200d-1f393':0, '1f468-1f3ff-200d-1f393':0, '1f468-1f3fb-200d-1f3a4':0, '1f468-1f3fc-200d-1f3a4':0, '1f468-1f3fd-200d-1f3a4':0, '1f468-1f3fe-200d-1f3a4':0, '1f468-1f3ff-200d-1f3a4':0, '1f468-1f3fb-200d-1f3a8':0, '1f468-1f3fc-200d-1f3a8':0, '1f468-1f3fd-200d-1f3a8':0, '1f468-1f3fe-200d-1f3a8':0, '1f468-1f3ff-200d-1f3a8':0, '1f468-1f3fb-200d-1f3eb':0, '1f468-1f3fc-200d-1f3eb':0, '1f468-1f3fd-200d-1f3eb':0, '1f468-1f3fe-200d-1f3eb':0, '1f468-1f3ff-200d-1f3eb':0, '1f468-1f3fb-200d-1f3ed':0, '1f468-1f3fc-200d-1f3ed':0, '1f468-1f3fd-200d-1f3ed':0, '1f468-1f3fe-200d-1f3ed':0, '1f468-1f3ff-200d-1f3ed':0, '1f468-1f3fb-200d-1f4bb':0, '1f468-1f3fc-200d-1f4bb':0, '1f468-1f3fd-200d-1f4bb':0, '1f468-1f3fe-200d-1f4bb':0, '1f468-1f3ff-200d-1f4bb':0, '1f468-1f3fb-200d-1f4bc':0, '1f468-1f3fc-200d-1f4bc':0, '1f468-1f3fd-200d-1f4bc':0, '1f468-1f3fe-200d-1f4bc':0, '1f468-1f3ff-200d-1f4bc':0, '1f468-1f3fb-200d-1f527':0, '1f468-1f3fc-200d-1f527':0, '1f468-1f3fd-200d-1f527':0, '1f468-1f3fe-200d-1f527':0, '1f468-1f3ff-200d-1f527':0, '1f468-1f3fb-200d-1f52c':0, '1f468-1f3fc-200d-1f52c':0, '1f468-1f3fd-200d-1f52c':0, '1f468-1f3fe-200d-1f52c':0, '1f468-1f3ff-200d-1f52c':0, '1f468-1f3fb-200d-1f680':0, '1f468-1f3fc-200d-1f680':0, '1f468-1f3fd-200d-1f680':0, '1f468-1f3fe-200d-1f680':0, '1f468-1f3ff-200d-1f680':0, '1f468-1f3fb-200d-1f692':0, '1f468-1f3fc-200d-1f692':0, '1f468-1f3fd-200d-1f692':0, '1f468-1f3fe-200d-1f692':0, '1f468-1f3ff-200d-1f692':0, '1f468-1f3fb-200d-1f9af':0, '1f468-1f3fc-200d-1f9af':0, '1f468-1f3fd-200d-1f9af':0, '1f468-1f3fe-200d-1f9af':0, '1f468-1f3ff-200d-1f9af':0, '1f468-1f3fb-200d-1f9b0':0, '1f468-1f3fc-200d-1f9b0':0, '1f468-1f3fd-200d-1f9b0':0, '1f468-1f3fe-200d-1f9b0':0, '1f468-1f3ff-200d-1f9b0':0, '1f468-1f3fb-200d-1f9b1':0, '1f468-1f3fc-200d-1f9b1':0, '1f468-1f3fd-200d-1f9b1':0, '1f468-1f3fe-200d-1f9b1':0, '1f468-1f3ff-200d-1f9b1':0, '1f468-1f3fb-200d-1f9b2':0, '1f468-1f3fc-200d-1f9b2':0, '1f468-1f3fd-200d-1f9b2':0, '1f468-1f3fe-200d-1f9b2':0, '1f468-1f3ff-200d-1f9b2':0, '1f468-1f3fb-200d-1f9b3':0, '1f468-1f3fc-200d-1f9b3':0, '1f468-1f3fd-200d-1f9b3':0, '1f468-1f3fe-200d-1f9b3':0, '1f468-1f3ff-200d-1f9b3':0, '1f468-1f3fb-200d-1f9bc':0, '1f468-1f3fc-200d-1f9bc':0, '1f468-1f3fd-200d-1f9bc':0, '1f468-1f3fe-200d-1f9bc':0, '1f468-1f3ff-200d-1f9bc':0, '1f468-1f3fb-200d-1f9bd':0, '1f468-1f3fc-200d-1f9bd':0, '1f468-1f3fd-200d-1f9bd':0, '1f468-1f3fe-200d-1f9bd':0, '1f468-1f3ff-200d-1f9bd':0, '1f468-1f3fb-200d-2695':0, '1f468-1f3fc-200d-2695':0, '1f468-1f3fd-200d-2695':0, '1f468-1f3fe-200d-2695':0, '1f468-1f3ff-200d-2695':0, '1f468-1f3fb-200d-2696':0, '1f468-1f3fc-200d-2696':0, '1f468-1f3fd-200d-2696':0, '1f468-1f3fe-200d-2696':0, '1f468-1f3ff-200d-2696':0, '1f468-1f3fb-200d-2708':0, '1f468-1f3fc-200d-2708':0, '1f468-1f3fd-200d-2708':0, '1f468-1f3fe-200d-2708':0, '1f468-1f3ff-200d-2708':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fb':0, '1f468-1f3fc':0, '1f468-1f3fd':0, '1f468-1f3fe':0, '1f468-1f3ff':0, '1f469-1f3fb-200d-1f33e':0, '1f469-1f3fc-200d-1f33e':0, '1f469-1f3fd-200d-1f33e':0, '1f469-1f3fe-200d-1f33e':0, '1f469-1f3ff-200d-1f33e':0, '1f469-1f3fb-200d-1f373':0, '1f469-1f3fc-200d-1f373':0, '1f469-1f3fd-200d-1f373':0, '1f469-1f3fe-200d-1f373':0, '1f469-1f3ff-200d-1f373':0, '1f469-1f3fb-200d-1f37c':0, '1f469-1f3fc-200d-1f37c':0, '1f469-1f3fd-200d-1f37c':0, '1f469-1f3fe-200d-1f37c':0, '1f469-1f3ff-200d-1f37c':0, '1f469-1f3fb-200d-1f393':0, '1f469-1f3fc-200d-1f393':0, '1f469-1f3fd-200d-1f393':0, '1f469-1f3fe-200d-1f393':0, '1f469-1f3ff-200d-1f393':0, '1f469-1f3fb-200d-1f3a4':0, '1f469-1f3fc-200d-1f3a4':0, '1f469-1f3fd-200d-1f3a4':0, '1f469-1f3fe-200d-1f3a4':0, '1f469-1f3ff-200d-1f3a4':0, '1f469-1f3fb-200d-1f3a8':0, '1f469-1f3fc-200d-1f3a8':0, '1f469-1f3fd-200d-1f3a8':0, '1f469-1f3fe-200d-1f3a8':0, '1f469-1f3ff-200d-1f3a8':0, '1f469-1f3fb-200d-1f3eb':0, '1f469-1f3fc-200d-1f3eb':0, '1f469-1f3fd-200d-1f3eb':0, '1f469-1f3fe-200d-1f3eb':0, '1f469-1f3ff-200d-1f3eb':0, '1f469-1f3fb-200d-1f3ed':0, '1f469-1f3fc-200d-1f3ed':0, '1f469-1f3fd-200d-1f3ed':0, '1f469-1f3fe-200d-1f3ed':0, '1f469-1f3ff-200d-1f3ed':0, '1f469-1f3fb-200d-1f4bb':0, '1f469-1f3fc-200d-1f4bb':0, '1f469-1f3fd-200d-1f4bb':0, '1f469-1f3fe-200d-1f4bb':0, '1f469-1f3ff-200d-1f4bb':0, '1f469-1f3fb-200d-1f4bc':0, '1f469-1f3fc-200d-1f4bc':0, '1f469-1f3fd-200d-1f4bc':0, '1f469-1f3fe-200d-1f4bc':0, '1f469-1f3ff-200d-1f4bc':0, '1f469-1f3fb-200d-1f527':0, '1f469-1f3fc-200d-1f527':0, '1f469-1f3fd-200d-1f527':0, '1f469-1f3fe-200d-1f527':0, '1f469-1f3ff-200d-1f527':0, '1f469-1f3fb-200d-1f52c':0, '1f469-1f3fc-200d-1f52c':0, '1f469-1f3fd-200d-1f52c':0, '1f469-1f3fe-200d-1f52c':0, '1f469-1f3ff-200d-1f52c':0, '1f469-1f3fb-200d-1f680':0, '1f469-1f3fc-200d-1f680':0, '1f469-1f3fd-200d-1f680':0, '1f469-1f3fe-200d-1f680':0, '1f469-1f3ff-200d-1f680':0, '1f469-1f3fb-200d-1f692':0, '1f469-1f3fc-200d-1f692':0, '1f469-1f3fd-200d-1f692':0, '1f469-1f3fe-200d-1f692':0, '1f469-1f3ff-200d-1f692':0, '1f469-1f3fb-200d-1f9af':0, '1f469-1f3fc-200d-1f9af':0, '1f469-1f3fd-200d-1f9af':0, '1f469-1f3fe-200d-1f9af':0, '1f469-1f3ff-200d-1f9af':0, '1f469-1f3fb-200d-1f9b0':0, '1f469-1f3fc-200d-1f9b0':0, '1f469-1f3fd-200d-1f9b0':0, '1f469-1f3fe-200d-1f9b0':0, '1f469-1f3ff-200d-1f9b0':0, '1f469-1f3fb-200d-1f9b1':0, '1f469-1f3fc-200d-1f9b1':0, '1f469-1f3fd-200d-1f9b1':0, '1f469-1f3fe-200d-1f9b1':0, '1f469-1f3ff-200d-1f9b1':0, '1f469-1f3fb-200d-1f9b2':0, '1f469-1f3fc-200d-1f9b2':0, '1f469-1f3fd-200d-1f9b2':0, '1f469-1f3fe-200d-1f9b2':0, '1f469-1f3ff-200d-1f9b2':0, '1f469-1f3fb-200d-1f9b3':0, '1f469-1f3fc-200d-1f9b3':0, '1f469-1f3fd-200d-1f9b3':0, '1f469-1f3fe-200d-1f9b3':0, '1f469-1f3ff-200d-1f9b3':0, '1f469-1f3fb-200d-1f9bc':0, '1f469-1f3fc-200d-1f9bc':0, '1f469-1f3fd-200d-1f9bc':0, '1f469-1f3fe-200d-1f9bc':0, '1f469-1f3ff-200d-1f9bc':0, '1f469-1f3fb-200d-1f9bd':0, '1f469-1f3fc-200d-1f9bd':0, '1f469-1f3fd-200d-1f9bd':0, '1f469-1f3fe-200d-1f9bd':0, '1f469-1f3ff-200d-1f9bd':0, '1f469-1f3fb-200d-2695':0, '1f469-1f3fc-200d-2695':0, '1f469-1f3fd-200d-2695':0, '1f469-1f3fe-200d-2695':0, '1f469-1f3ff-200d-2695':0, '1f469-1f3fb-200d-2696':0, '1f469-1f3fc-200d-2696':0, '1f469-1f3fd-200d-2696':0, '1f469-1f3fe-200d-2696':0, '1f469-1f3ff-200d-2696':0, '1f469-1f3fb-200d-2708':0, '1f469-1f3fc-200d-2708':0, '1f469-1f3fd-200d-2708':0, '1f469-1f3fe-200d-2708':0, '1f469-1f3ff-200d-2708':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fb':0, '1f469-1f3fc':0, '1f469-1f3fd':0, '1f469-1f3fe':0, '1f469-1f3ff':0, '1f46b-1f3fb':0, '1f46b-1f3fc':0, '1f46b-1f3fd':0, '1f46b-1f3fe':0, '1f46b-1f3ff':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe':0, '1f46c-1f3fb':0, '1f46c-1f3fc':0, '1f46c-1f3fd':0, '1f46c-1f3fe':0, '1f46c-1f3ff':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe':0, '1f46d-1f3fb':0, '1f46d-1f3fc':0, '1f46d-1f3fd':0, '1f46d-1f3fe':0, '1f46d-1f3ff':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe':0, '1f46e-1f3fb-200d-2640':0, '1f46e-1f3fc-200d-2640':0, '1f46e-1f3fd-200d-2640':0, '1f46e-1f3fe-200d-2640':0, '1f46e-1f3ff-200d-2640':0, '1f46e-1f3fb-200d-2642':0, '1f46e-1f3fc-200d-2642':0, '1f46e-1f3fd-200d-2642':0, '1f46e-1f3fe-200d-2642':0, '1f46e-1f3ff-200d-2642':0, '1f46e-1f3fb':0, '1f46e-1f3fc':0, '1f46e-1f3fd':0, '1f46e-1f3fe':0, '1f46e-1f3ff':0, '1f470-1f3fb-200d-2640':0, '1f470-1f3fc-200d-2640':0, '1f470-1f3fd-200d-2640':0, '1f470-1f3fe-200d-2640':0, '1f470-1f3ff-200d-2640':0, '1f470-1f3fb-200d-2642':0, '1f470-1f3fc-200d-2642':0, '1f470-1f3fd-200d-2642':0, '1f470-1f3fe-200d-2642':0, '1f470-1f3ff-200d-2642':0, '1f470-1f3fb':0, '1f470-1f3fc':0, '1f470-1f3fd':0, '1f470-1f3fe':0, '1f470-1f3ff':0, '1f471-1f3fb-200d-2640':0, '1f471-1f3fc-200d-2640':0, '1f471-1f3fd-200d-2640':0, '1f471-1f3fe-200d-2640':0, '1f471-1f3ff-200d-2640':0, '1f471-1f3fb-200d-2642':0, '1f471-1f3fc-200d-2642':0, '1f471-1f3fd-200d-2642':0, '1f471-1f3fe-200d-2642':0, '1f471-1f3ff-200d-2642':0, '1f471-1f3fb':0, '1f471-1f3fc':0, '1f471-1f3fd':0, '1f471-1f3fe':0, '1f471-1f3ff':0, '1f472-1f3fb':0, '1f472-1f3fc':0, '1f472-1f3fd':0, '1f472-1f3fe':0, '1f472-1f3ff':0, '1f473-1f3fb-200d-2640':0, '1f473-1f3fc-200d-2640':0, '1f473-1f3fd-200d-2640':0, '1f473-1f3fe-200d-2640':0, '1f473-1f3ff-200d-2640':0, '1f473-1f3fb-200d-2642':0, '1f473-1f3fc-200d-2642':0, '1f473-1f3fd-200d-2642':0, '1f473-1f3fe-200d-2642':0, '1f473-1f3ff-200d-2642':0, '1f473-1f3fb':0, '1f473-1f3fc':0, '1f473-1f3fd':0, '1f473-1f3fe':0, '1f473-1f3ff':0, '1f474-1f3fb':0, '1f474-1f3fc':0, '1f474-1f3fd':0, '1f474-1f3fe':0, '1f474-1f3ff':0, '1f475-1f3fb':0, '1f475-1f3fc':0, '1f475-1f3fd':0, '1f475-1f3fe':0, '1f475-1f3ff':0, '1f476-1f3fb':0, '1f476-1f3fc':0, '1f476-1f3fd':0, '1f476-1f3fe':0, '1f476-1f3ff':0, '1f477-1f3fb-200d-2640':0, '1f477-1f3fc-200d-2640':0, '1f477-1f3fd-200d-2640':0, '1f477-1f3fe-200d-2640':0, '1f477-1f3ff-200d-2640':0, '1f477-1f3fb-200d-2642':0, '1f477-1f3fc-200d-2642':0, '1f477-1f3fd-200d-2642':0, '1f477-1f3fe-200d-2642':0, '1f477-1f3ff-200d-2642':0, '1f477-1f3fb':0, '1f477-1f3fc':0, '1f477-1f3fd':0, '1f477-1f3fe':0, '1f477-1f3ff':0, '1f478-1f3fb':0, '1f478-1f3fc':0, '1f478-1f3fd':0, '1f478-1f3fe':0, '1f478-1f3ff':0, '1f47c-1f3fb':0, '1f47c-1f3fc':0, '1f47c-1f3fd':0, '1f47c-1f3fe':0, '1f47c-1f3ff':0, '1f481-1f3fb-200d-2640':0, '1f481-1f3fc-200d-2640':0, '1f481-1f3fd-200d-2640':0, '1f481-1f3fe-200d-2640':0, '1f481-1f3ff-200d-2640':0, '1f481-1f3fb-200d-2642':0, '1f481-1f3fc-200d-2642':0, '1f481-1f3fd-200d-2642':0, '1f481-1f3fe-200d-2642':0, '1f481-1f3ff-200d-2642':0, '1f481-1f3fb':0, '1f481-1f3fc':0, '1f481-1f3fd':0, '1f481-1f3fe':0, '1f481-1f3ff':0, '1f482-1f3fb-200d-2640':0, '1f482-1f3fc-200d-2640':0, '1f482-1f3fd-200d-2640':0, '1f482-1f3fe-200d-2640':0, '1f482-1f3ff-200d-2640':0, '1f482-1f3fb-200d-2642':0, '1f482-1f3fc-200d-2642':0, '1f482-1f3fd-200d-2642':0, '1f482-1f3fe-200d-2642':0, '1f482-1f3ff-200d-2642':0, '1f482-1f3fb':0, '1f482-1f3fc':0, '1f482-1f3fd':0, '1f482-1f3fe':0, '1f482-1f3ff':0, '1f483-1f3fb':0, '1f483-1f3fc':0, '1f483-1f3fd':0, '1f483-1f3fe':0, '1f483-1f3ff':0, '1f485-1f3fb':0, '1f485-1f3fc':0, '1f485-1f3fd':0, '1f485-1f3fe':0, '1f485-1f3ff':0, '1f486-1f3fb-200d-2640':0, '1f486-1f3fc-200d-2640':0, '1f486-1f3fd-200d-2640':0, '1f486-1f3fe-200d-2640':0, '1f486-1f3ff-200d-2640':0, '1f486-1f3fb-200d-2642':0, '1f486-1f3fc-200d-2642':0, '1f486-1f3fd-200d-2642':0, '1f486-1f3fe-200d-2642':0, '1f486-1f3ff-200d-2642':0, '1f486-1f3fb':0, '1f486-1f3fc':0, '1f486-1f3fd':0, '1f486-1f3fe':0, '1f486-1f3ff':0, '1f487-1f3fb-200d-2640':0, '1f487-1f3fc-200d-2640':0, '1f487-1f3fd-200d-2640':0, '1f487-1f3fe-200d-2640':0, '1f487-1f3ff-200d-2640':0, '1f487-1f3fb-200d-2642':0, '1f487-1f3fc-200d-2642':0, '1f487-1f3fd-200d-2642':0, '1f487-1f3fe-200d-2642':0, '1f487-1f3ff-200d-2642':0, '1f487-1f3fb':0, '1f487-1f3fc':0, '1f487-1f3fd':0, '1f487-1f3fe':0, '1f487-1f3ff':0, '1f48f-1f3fb':0, '1f48f-1f3fc':0, '1f48f-1f3fd':0, '1f48f-1f3fe':0, '1f48f-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f491-1f3fb':0, '1f491-1f3fc':0, '1f491-1f3fd':0, '1f491-1f3fe':0, '1f491-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe':0, '1f4aa-1f3fb':0, '1f4aa-1f3fc':0, '1f4aa-1f3fd':0, '1f4aa-1f3fe':0, '1f4aa-1f3ff':0, '1f574-1f3fb':0, '1f574-1f3fc':0, '1f574-1f3fd':0, '1f574-1f3fe':0, '1f574-1f3ff':0, '1f575-1f3fb-200d-2640':0, '1f575-1f3fc-200d-2640':0, '1f575-1f3fd-200d-2640':0, '1f575-1f3fe-200d-2640':0, '1f575-1f3ff-200d-2640':0, '1f575-1f3fb-200d-2642':0, '1f575-1f3fc-200d-2642':0, '1f575-1f3fd-200d-2642':0, '1f575-1f3fe-200d-2642':0, '1f575-1f3ff-200d-2642':0, '1f575-1f3fb':0, '1f575-1f3fc':0, '1f575-1f3fd':0, '1f575-1f3fe':0, '1f575-1f3ff':0, '1f57a-1f3fb':0, '1f57a-1f3fc':0, '1f57a-1f3fd':0, '1f57a-1f3fe':0, '1f57a-1f3ff':0, '1f590-1f3fb':0, '1f590-1f3fc':0, '1f590-1f3fd':0, '1f590-1f3fe':0, '1f590-1f3ff':0, '1f595-1f3fb':0, '1f595-1f3fc':0, '1f595-1f3fd':0, '1f595-1f3fe':0, '1f595-1f3ff':0, '1f596-1f3fb':0, '1f596-1f3fc':0, '1f596-1f3fd':0, '1f596-1f3fe':0, '1f596-1f3ff':0, '1f645-1f3fb-200d-2640':0, '1f645-1f3fc-200d-2640':0, '1f645-1f3fd-200d-2640':0, '1f645-1f3fe-200d-2640':0, '1f645-1f3ff-200d-2640':0, '1f645-1f3fb-200d-2642':0, '1f645-1f3fc-200d-2642':0, '1f645-1f3fd-200d-2642':0, '1f645-1f3fe-200d-2642':0, '1f645-1f3ff-200d-2642':0, '1f645-1f3fb':0, '1f645-1f3fc':0, '1f645-1f3fd':0, '1f645-1f3fe':0, '1f645-1f3ff':0, '1f646-1f3fb-200d-2640':0, '1f646-1f3fc-200d-2640':0, '1f646-1f3fd-200d-2640':0, '1f646-1f3fe-200d-2640':0, '1f646-1f3ff-200d-2640':0, '1f646-1f3fb-200d-2642':0, '1f646-1f3fc-200d-2642':0, '1f646-1f3fd-200d-2642':0, '1f646-1f3fe-200d-2642':0, '1f646-1f3ff-200d-2642':0, '1f646-1f3fb':0, '1f646-1f3fc':0, '1f646-1f3fd':0, '1f646-1f3fe':0, '1f646-1f3ff':0, '1f647-1f3fb-200d-2640':0, '1f647-1f3fc-200d-2640':0, '1f647-1f3fd-200d-2640':0, '1f647-1f3fe-200d-2640':0, '1f647-1f3ff-200d-2640':0, '1f647-1f3fb-200d-2642':0, '1f647-1f3fc-200d-2642':0, '1f647-1f3fd-200d-2642':0, '1f647-1f3fe-200d-2642':0, '1f647-1f3ff-200d-2642':0, '1f647-1f3fb':0, '1f647-1f3fc':0, '1f647-1f3fd':0, '1f647-1f3fe':0, '1f647-1f3ff':0, '1f64b-1f3fb-200d-2640':0, '1f64b-1f3fc-200d-2640':0, '1f64b-1f3fd-200d-2640':0, '1f64b-1f3fe-200d-2640':0, '1f64b-1f3ff-200d-2640':0, '1f64b-1f3fb-200d-2642':0, '1f64b-1f3fc-200d-2642':0, '1f64b-1f3fd-200d-2642':0, '1f64b-1f3fe-200d-2642':0, '1f64b-1f3ff-200d-2642':0, '1f64b-1f3fb':0, '1f64b-1f3fc':0, '1f64b-1f3fd':0, '1f64b-1f3fe':0, '1f64b-1f3ff':0, '1f64c-1f3fb':0, '1f64c-1f3fc':0, '1f64c-1f3fd':0, '1f64c-1f3fe':0, '1f64c-1f3ff':0, '1f64d-1f3fb-200d-2640':0, '1f64d-1f3fc-200d-2640':0, '1f64d-1f3fd-200d-2640':0, '1f64d-1f3fe-200d-2640':0, '1f64d-1f3ff-200d-2640':0, '1f64d-1f3fb-200d-2642':0, '1f64d-1f3fc-200d-2642':0, '1f64d-1f3fd-200d-2642':0, '1f64d-1f3fe-200d-2642':0, '1f64d-1f3ff-200d-2642':0, '1f64d-1f3fb':0, '1f64d-1f3fc':0, '1f64d-1f3fd':0, '1f64d-1f3fe':0, '1f64d-1f3ff':0, '1f64e-1f3fb-200d-2640':0, '1f64e-1f3fc-200d-2640':0, '1f64e-1f3fd-200d-2640':0, '1f64e-1f3fe-200d-2640':0, '1f64e-1f3ff-200d-2640':0, '1f64e-1f3fb-200d-2642':0, '1f64e-1f3fc-200d-2642':0, '1f64e-1f3fd-200d-2642':0, '1f64e-1f3fe-200d-2642':0, '1f64e-1f3ff-200d-2642':0, '1f64e-1f3fb':0, '1f64e-1f3fc':0, '1f64e-1f3fd':0, '1f64e-1f3fe':0, '1f64e-1f3ff':0, '1f64f-1f3fb':0, '1f64f-1f3fc':0, '1f64f-1f3fd':0, '1f64f-1f3fe':0, '1f64f-1f3ff':0, '1f6a3-1f3fb-200d-2640':0, '1f6a3-1f3fc-200d-2640':0, '1f6a3-1f3fd-200d-2640':0, '1f6a3-1f3fe-200d-2640':0, '1f6a3-1f3ff-200d-2640':0, '1f6a3-1f3fb-200d-2642':0, '1f6a3-1f3fc-200d-2642':0, '1f6a3-1f3fd-200d-2642':0, '1f6a3-1f3fe-200d-2642':0, '1f6a3-1f3ff-200d-2642':0, '1f6a3-1f3fb':0, '1f6a3-1f3fc':0, '1f6a3-1f3fd':0, '1f6a3-1f3fe':0, '1f6a3-1f3ff':0, '1f6b4-1f3fb-200d-2640':0, '1f6b4-1f3fc-200d-2640':0, '1f6b4-1f3fd-200d-2640':0, '1f6b4-1f3fe-200d-2640':0, '1f6b4-1f3ff-200d-2640':0, '1f6b4-1f3fb-200d-2642':0, '1f6b4-1f3fc-200d-2642':0, '1f6b4-1f3fd-200d-2642':0, '1f6b4-1f3fe-200d-2642':0, '1f6b4-1f3ff-200d-2642':0, '1f6b4-1f3fb':0, '1f6b4-1f3fc':0, '1f6b4-1f3fd':0, '1f6b4-1f3fe':0, '1f6b4-1f3ff':0, '1f6b5-1f3fb-200d-2640':0, '1f6b5-1f3fc-200d-2640':0, '1f6b5-1f3fd-200d-2640':0, '1f6b5-1f3fe-200d-2640':0, '1f6b5-1f3ff-200d-2640':0, '1f6b5-1f3fb-200d-2642':0, '1f6b5-1f3fc-200d-2642':0, '1f6b5-1f3fd-200d-2642':0, '1f6b5-1f3fe-200d-2642':0, '1f6b5-1f3ff-200d-2642':0, '1f6b5-1f3fb':0, '1f6b5-1f3fc':0, '1f6b5-1f3fd':0, '1f6b5-1f3fe':0, '1f6b5-1f3ff':0, '1f6b6-1f3fb-200d-2640':0, '1f6b6-1f3fc-200d-2640':0, '1f6b6-1f3fd-200d-2640':0, '1f6b6-1f3fe-200d-2640':0, '1f6b6-1f3ff-200d-2640':0, '1f6b6-1f3fb-200d-2642':0, '1f6b6-1f3fc-200d-2642':0, '1f6b6-1f3fd-200d-2642':0, '1f6b6-1f3fe-200d-2642':0, '1f6b6-1f3ff-200d-2642':0, '1f6b6-1f3fb':0, '1f6b6-1f3fc':0, '1f6b6-1f3fd':0, '1f6b6-1f3fe':0, '1f6b6-1f3ff':0, '1f6c0-1f3fb':0, '1f6c0-1f3fc':0, '1f6c0-1f3fd':0, '1f6c0-1f3fe':0, '1f6c0-1f3ff':0, '1f6cc-1f3fb':0, '1f6cc-1f3fc':0, '1f6cc-1f3fd':0, '1f6cc-1f3fe':0, '1f6cc-1f3ff':0, '1f90c-1f3fb':0, '1f90c-1f3fc':0, '1f90c-1f3fd':0, '1f90c-1f3fe':0, '1f90c-1f3ff':0, '1f90f-1f3fb':0, '1f90f-1f3fc':0, '1f90f-1f3fd':0, '1f90f-1f3fe':0, '1f90f-1f3ff':0, '1f918-1f3fb':0, '1f918-1f3fc':0, '1f918-1f3fd':0, '1f918-1f3fe':0, '1f918-1f3ff':0, '1f919-1f3fb':0, '1f919-1f3fc':0, '1f919-1f3fd':0, '1f919-1f3fe':0, '1f919-1f3ff':0, '1f91a-1f3fb':0, '1f91a-1f3fc':0, '1f91a-1f3fd':0, '1f91a-1f3fe':0, '1f91a-1f3ff':0, '1f91b-1f3fb':0, '1f91b-1f3fc':0, '1f91b-1f3fd':0, '1f91b-1f3fe':0, '1f91b-1f3ff':0, '1f91c-1f3fb':0, '1f91c-1f3fc':0, '1f91c-1f3fd':0, '1f91c-1f3fe':0, '1f91c-1f3ff':0, '1f91d-1f3fb':0, '1f91d-1f3fc':0, '1f91d-1f3fd':0, '1f91d-1f3fe':0, '1f91d-1f3ff':0, '1f91e-1f3fb':0, '1f91e-1f3fc':0, '1f91e-1f3fd':0, '1f91e-1f3fe':0, '1f91e-1f3ff':0, '1f91f-1f3fb':0, '1f91f-1f3fc':0, '1f91f-1f3fd':0, '1f91f-1f3fe':0, '1f91f-1f3ff':0, '1f926-1f3fb-200d-2640':0, '1f926-1f3fc-200d-2640':0, '1f926-1f3fd-200d-2640':0, '1f926-1f3fe-200d-2640':0, '1f926-1f3ff-200d-2640':0, '1f926-1f3fb-200d-2642':0, '1f926-1f3fc-200d-2642':0, '1f926-1f3fd-200d-2642':0, '1f926-1f3fe-200d-2642':0, '1f926-1f3ff-200d-2642':0, '1f926-1f3fb':0, '1f926-1f3fc':0, '1f926-1f3fd':0, '1f926-1f3fe':0, '1f926-1f3ff':0, '1f930-1f3fb':0, '1f930-1f3fc':0, '1f930-1f3fd':0, '1f930-1f3fe':0, '1f930-1f3ff':0, '1f931-1f3fb':0, '1f931-1f3fc':0, '1f931-1f3fd':0, '1f931-1f3fe':0, '1f931-1f3ff':0, '1f932-1f3fb':0, '1f932-1f3fc':0, '1f932-1f3fd':0, '1f932-1f3fe':0, '1f932-1f3ff':0, '1f933-1f3fb':0, '1f933-1f3fc':0, '1f933-1f3fd':0, '1f933-1f3fe':0, '1f933-1f3ff':0, '1f934-1f3fb':0, '1f934-1f3fc':0, '1f934-1f3fd':0, '1f934-1f3fe':0, '1f934-1f3ff':0, '1f935-1f3fb-200d-2640':0, '1f935-1f3fc-200d-2640':0, '1f935-1f3fd-200d-2640':0, '1f935-1f3fe-200d-2640':0, '1f935-1f3ff-200d-2640':0, '1f935-1f3fb-200d-2642':0, '1f935-1f3fc-200d-2642':0, '1f935-1f3fd-200d-2642':0, '1f935-1f3fe-200d-2642':0, '1f935-1f3ff-200d-2642':0, '1f935-1f3fb':0, '1f935-1f3fc':0, '1f935-1f3fd':0, '1f935-1f3fe':0, '1f935-1f3ff':0, '1f936-1f3fb':0, '1f936-1f3fc':0, '1f936-1f3fd':0, '1f936-1f3fe':0, '1f936-1f3ff':0, '1f937-1f3fb-200d-2640':0, '1f937-1f3fc-200d-2640':0, '1f937-1f3fd-200d-2640':0, '1f937-1f3fe-200d-2640':0, '1f937-1f3ff-200d-2640':0, '1f937-1f3fb-200d-2642':0, '1f937-1f3fc-200d-2642':0, '1f937-1f3fd-200d-2642':0, '1f937-1f3fe-200d-2642':0, '1f937-1f3ff-200d-2642':0, '1f937-1f3fb':0, '1f937-1f3fc':0, '1f937-1f3fd':0, '1f937-1f3fe':0, '1f937-1f3ff':0, '1f938-1f3fb-200d-2640':0, '1f938-1f3fc-200d-2640':0, '1f938-1f3fd-200d-2640':0, '1f938-1f3fe-200d-2640':0, '1f938-1f3ff-200d-2640':0, '1f938-1f3fb-200d-2642':0, '1f938-1f3fc-200d-2642':0, '1f938-1f3fd-200d-2642':0, '1f938-1f3fe-200d-2642':0, '1f938-1f3ff-200d-2642':0, '1f938-1f3fb':0, '1f938-1f3fc':0, '1f938-1f3fd':0, '1f938-1f3fe':0, '1f938-1f3ff':0, '1f939-1f3fb-200d-2640':0, '1f939-1f3fc-200d-2640':0, '1f939-1f3fd-200d-2640':0, '1f939-1f3fe-200d-2640':0, '1f939-1f3ff-200d-2640':0, '1f939-1f3fb-200d-2642':0, '1f939-1f3fc-200d-2642':0, '1f939-1f3fd-200d-2642':0, '1f939-1f3fe-200d-2642':0, '1f939-1f3ff-200d-2642':0, '1f939-1f3fb':0, '1f939-1f3fc':0, '1f939-1f3fd':0, '1f939-1f3fe':0, '1f939-1f3ff':0, '1f93d-1f3fb-200d-2640':0, '1f93d-1f3fc-200d-2640':0, '1f93d-1f3fd-200d-2640':0, '1f93d-1f3fe-200d-2640':0, '1f93d-1f3ff-200d-2640':0, '1f93d-1f3fb-200d-2642':0, '1f93d-1f3fc-200d-2642':0, '1f93d-1f3fd-200d-2642':0, '1f93d-1f3fe-200d-2642':0, '1f93d-1f3ff-200d-2642':0, '1f93d-1f3fb':0, '1f93d-1f3fc':0, '1f93d-1f3fd':0, '1f93d-1f3fe':0, '1f93d-1f3ff':0, '1f93e-1f3fb-200d-2640':0, '1f93e-1f3fc-200d-2640':0, '1f93e-1f3fd-200d-2640':0, '1f93e-1f3fe-200d-2640':0, '1f93e-1f3ff-200d-2640':0, '1f93e-1f3fb-200d-2642':0, '1f93e-1f3fc-200d-2642':0, '1f93e-1f3fd-200d-2642':0, '1f93e-1f3fe-200d-2642':0, '1f93e-1f3ff-200d-2642':0, '1f93e-1f3fb':0, '1f93e-1f3fc':0, '1f93e-1f3fd':0, '1f93e-1f3fe':0, '1f93e-1f3ff':0, '1f977-1f3fb':0, '1f977-1f3fc':0, '1f977-1f3fd':0, '1f977-1f3fe':0, '1f977-1f3ff':0, '1f9b5-1f3fb':0, '1f9b5-1f3fc':0, '1f9b5-1f3fd':0, '1f9b5-1f3fe':0, '1f9b5-1f3ff':0, '1f9b6-1f3fb':0, '1f9b6-1f3fc':0, '1f9b6-1f3fd':0, '1f9b6-1f3fe':0, '1f9b6-1f3ff':0, '1f9b8-1f3fb-200d-2640':0, '1f9b8-1f3fc-200d-2640':0, '1f9b8-1f3fd-200d-2640':0, '1f9b8-1f3fe-200d-2640':0, '1f9b8-1f3ff-200d-2640':0, '1f9b8-1f3fb-200d-2642':0, '1f9b8-1f3fc-200d-2642':0, '1f9b8-1f3fd-200d-2642':0, '1f9b8-1f3fe-200d-2642':0, '1f9b8-1f3ff-200d-2642':0, '1f9b8-1f3fb':0, '1f9b8-1f3fc':0, '1f9b8-1f3fd':0, '1f9b8-1f3fe':0, '1f9b8-1f3ff':0, '1f9b9-1f3fb-200d-2640':0, '1f9b9-1f3fc-200d-2640':0, '1f9b9-1f3fd-200d-2640':0, '1f9b9-1f3fe-200d-2640':0, '1f9b9-1f3ff-200d-2640':0, '1f9b9-1f3fb-200d-2642':0, '1f9b9-1f3fc-200d-2642':0, '1f9b9-1f3fd-200d-2642':0, '1f9b9-1f3fe-200d-2642':0, '1f9b9-1f3ff-200d-2642':0, '1f9b9-1f3fb':0, '1f9b9-1f3fc':0, '1f9b9-1f3fd':0, '1f9b9-1f3fe':0, '1f9b9-1f3ff':0, '1f9bb-1f3fb':0, '1f9bb-1f3fc':0, '1f9bb-1f3fd':0, '1f9bb-1f3fe':0, '1f9bb-1f3ff':0, '1f9cd-1f3fb-200d-2640':0, '1f9cd-1f3fc-200d-2640':0, '1f9cd-1f3fd-200d-2640':0, '1f9cd-1f3fe-200d-2640':0, '1f9cd-1f3ff-200d-2640':0, '1f9cd-1f3fb-200d-2642':0, '1f9cd-1f3fc-200d-2642':0, '1f9cd-1f3fd-200d-2642':0, '1f9cd-1f3fe-200d-2642':0, '1f9cd-1f3ff-200d-2642':0, '1f9cd-1f3fb':0, '1f9cd-1f3fc':0, '1f9cd-1f3fd':0, '1f9cd-1f3fe':0, '1f9cd-1f3ff':0, '1f9ce-1f3fb-200d-2640':0, '1f9ce-1f3fc-200d-2640':0, '1f9ce-1f3fd-200d-2640':0, '1f9ce-1f3fe-200d-2640':0, '1f9ce-1f3ff-200d-2640':0, '1f9ce-1f3fb-200d-2642':0, '1f9ce-1f3fc-200d-2642':0, '1f9ce-1f3fd-200d-2642':0, '1f9ce-1f3fe-200d-2642':0, '1f9ce-1f3ff-200d-2642':0, '1f9ce-1f3fb':0, '1f9ce-1f3fc':0, '1f9ce-1f3fd':0, '1f9ce-1f3fe':0, '1f9ce-1f3ff':0, '1f9cf-1f3fb-200d-2640':0, '1f9cf-1f3fc-200d-2640':0, '1f9cf-1f3fd-200d-2640':0, '1f9cf-1f3fe-200d-2640':0, '1f9cf-1f3ff-200d-2640':0, '1f9cf-1f3fb-200d-2642':0, '1f9cf-1f3fc-200d-2642':0, '1f9cf-1f3fd-200d-2642':0, '1f9cf-1f3fe-200d-2642':0, '1f9cf-1f3ff-200d-2642':0, '1f9cf-1f3fb':0, '1f9cf-1f3fc':0, '1f9cf-1f3fd':0, '1f9cf-1f3fe':0, '1f9cf-1f3ff':0, '1f9d1-1f3fb-200d-1f33e':0, '1f9d1-1f3fc-200d-1f33e':0, '1f9d1-1f3fd-200d-1f33e':0, '1f9d1-1f3fe-200d-1f33e':0, '1f9d1-1f3ff-200d-1f33e':0, '1f9d1-1f3fb-200d-1f373':0, '1f9d1-1f3fc-200d-1f373':0, '1f9d1-1f3fd-200d-1f373':0, '1f9d1-1f3fe-200d-1f373':0, '1f9d1-1f3ff-200d-1f373':0, '1f9d1-1f3fb-200d-1f37c':0, '1f9d1-1f3fc-200d-1f37c':0, '1f9d1-1f3fd-200d-1f37c':0, '1f9d1-1f3fe-200d-1f37c':0, '1f9d1-1f3ff-200d-1f37c':0, '1f9d1-1f3fb-200d-1f384':0, '1f9d1-1f3fc-200d-1f384':0, '1f9d1-1f3fd-200d-1f384':0, '1f9d1-1f3fe-200d-1f384':0, '1f9d1-1f3ff-200d-1f384':0, '1f9d1-1f3fb-200d-1f393':0, '1f9d1-1f3fc-200d-1f393':0, '1f9d1-1f3fd-200d-1f393':0, '1f9d1-1f3fe-200d-1f393':0, '1f9d1-1f3ff-200d-1f393':0, '1f9d1-1f3fb-200d-1f3a4':0, '1f9d1-1f3fc-200d-1f3a4':0, '1f9d1-1f3fd-200d-1f3a4':0, '1f9d1-1f3fe-200d-1f3a4':0, '1f9d1-1f3ff-200d-1f3a4':0, '1f9d1-1f3fb-200d-1f3a8':0, '1f9d1-1f3fc-200d-1f3a8':0, '1f9d1-1f3fd-200d-1f3a8':0, '1f9d1-1f3fe-200d-1f3a8':0, '1f9d1-1f3ff-200d-1f3a8':0, '1f9d1-1f3fb-200d-1f3eb':0, '1f9d1-1f3fc-200d-1f3eb':0, '1f9d1-1f3fd-200d-1f3eb':0, '1f9d1-1f3fe-200d-1f3eb':0, '1f9d1-1f3ff-200d-1f3eb':0, '1f9d1-1f3fb-200d-1f3ed':0, '1f9d1-1f3fc-200d-1f3ed':0, '1f9d1-1f3fd-200d-1f3ed':0, '1f9d1-1f3fe-200d-1f3ed':0, '1f9d1-1f3ff-200d-1f3ed':0, '1f9d1-1f3fb-200d-1f4bb':0, '1f9d1-1f3fc-200d-1f4bb':0, '1f9d1-1f3fd-200d-1f4bb':0, '1f9d1-1f3fe-200d-1f4bb':0, '1f9d1-1f3ff-200d-1f4bb':0, '1f9d1-1f3fb-200d-1f4bc':0, '1f9d1-1f3fc-200d-1f4bc':0, '1f9d1-1f3fd-200d-1f4bc':0, '1f9d1-1f3fe-200d-1f4bc':0, '1f9d1-1f3ff-200d-1f4bc':0, '1f9d1-1f3fb-200d-1f527':0, '1f9d1-1f3fc-200d-1f527':0, '1f9d1-1f3fd-200d-1f527':0, '1f9d1-1f3fe-200d-1f527':0, '1f9d1-1f3ff-200d-1f527':0, '1f9d1-1f3fb-200d-1f52c':0, '1f9d1-1f3fc-200d-1f52c':0, '1f9d1-1f3fd-200d-1f52c':0, '1f9d1-1f3fe-200d-1f52c':0, '1f9d1-1f3ff-200d-1f52c':0, '1f9d1-1f3fb-200d-1f680':0, '1f9d1-1f3fc-200d-1f680':0, '1f9d1-1f3fd-200d-1f680':0, '1f9d1-1f3fe-200d-1f680':0, '1f9d1-1f3ff-200d-1f680':0, '1f9d1-1f3fb-200d-1f692':0, '1f9d1-1f3fc-200d-1f692':0, '1f9d1-1f3fd-200d-1f692':0, '1f9d1-1f3fe-200d-1f692':0, '1f9d1-1f3ff-200d-1f692':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fb-200d-1f9af':0, '1f9d1-1f3fc-200d-1f9af':0, '1f9d1-1f3fd-200d-1f9af':0, '1f9d1-1f3fe-200d-1f9af':0, '1f9d1-1f3ff-200d-1f9af':0, '1f9d1-1f3fb-200d-1f9b0':0, '1f9d1-1f3fc-200d-1f9b0':0, '1f9d1-1f3fd-200d-1f9b0':0, '1f9d1-1f3fe-200d-1f9b0':0, '1f9d1-1f3ff-200d-1f9b0':0, '1f9d1-1f3fb-200d-1f9b1':0, '1f9d1-1f3fc-200d-1f9b1':0, '1f9d1-1f3fd-200d-1f9b1':0, '1f9d1-1f3fe-200d-1f9b1':0, '1f9d1-1f3ff-200d-1f9b1':0, '1f9d1-1f3fb-200d-1f9b2':0, '1f9d1-1f3fc-200d-1f9b2':0, '1f9d1-1f3fd-200d-1f9b2':0, '1f9d1-1f3fe-200d-1f9b2':0, '1f9d1-1f3ff-200d-1f9b2':0, '1f9d1-1f3fb-200d-1f9b3':0, '1f9d1-1f3fc-200d-1f9b3':0, '1f9d1-1f3fd-200d-1f9b3':0, '1f9d1-1f3fe-200d-1f9b3':0, '1f9d1-1f3ff-200d-1f9b3':0, '1f9d1-1f3fb-200d-1f9bc':0, '1f9d1-1f3fc-200d-1f9bc':0, '1f9d1-1f3fd-200d-1f9bc':0, '1f9d1-1f3fe-200d-1f9bc':0, '1f9d1-1f3ff-200d-1f9bc':0, '1f9d1-1f3fb-200d-1f9bd':0, '1f9d1-1f3fc-200d-1f9bd':0, '1f9d1-1f3fd-200d-1f9bd':0, '1f9d1-1f3fe-200d-1f9bd':0, '1f9d1-1f3ff-200d-1f9bd':0, '1f9d1-1f3fb-200d-2695':0, '1f9d1-1f3fc-200d-2695':0, '1f9d1-1f3fd-200d-2695':0, '1f9d1-1f3fe-200d-2695':0, '1f9d1-1f3ff-200d-2695':0, '1f9d1-1f3fb-200d-2696':0, '1f9d1-1f3fc-200d-2696':0, '1f9d1-1f3fd-200d-2696':0, '1f9d1-1f3fe-200d-2696':0, '1f9d1-1f3ff-200d-2696':0, '1f9d1-1f3fb-200d-2708':0, '1f9d1-1f3fc-200d-2708':0, '1f9d1-1f3fd-200d-2708':0, '1f9d1-1f3fe-200d-2708':0, '1f9d1-1f3ff-200d-2708':0, '1f9d1-1f3fb':0, '1f9d1-1f3fc':0, '1f9d1-1f3fd':0, '1f9d1-1f3fe':0, '1f9d1-1f3ff':0, '1f9d2-1f3fb':0, '1f9d2-1f3fc':0, '1f9d2-1f3fd':0, '1f9d2-1f3fe':0, '1f9d2-1f3ff':0, '1f9d3-1f3fb':0, '1f9d3-1f3fc':0, '1f9d3-1f3fd':0, '1f9d3-1f3fe':0, '1f9d3-1f3ff':0, '1f9d4-1f3fb-200d-2640':0, '1f9d4-1f3fc-200d-2640':0, '1f9d4-1f3fd-200d-2640':0, '1f9d4-1f3fe-200d-2640':0, '1f9d4-1f3ff-200d-2640':0, '1f9d4-1f3fb-200d-2642':0, '1f9d4-1f3fc-200d-2642':0, '1f9d4-1f3fd-200d-2642':0, '1f9d4-1f3fe-200d-2642':0, '1f9d4-1f3ff-200d-2642':0, '1f9d4-1f3fb':0, '1f9d4-1f3fc':0, '1f9d4-1f3fd':0, '1f9d4-1f3fe':0, '1f9d4-1f3ff':0, '1f9d5-1f3fb':0, '1f9d5-1f3fc':0, '1f9d5-1f3fd':0, '1f9d5-1f3fe':0, '1f9d5-1f3ff':0, '1f9d6-1f3fb-200d-2640':0, '1f9d6-1f3fc-200d-2640':0, '1f9d6-1f3fd-200d-2640':0, '1f9d6-1f3fe-200d-2640':0, '1f9d6-1f3ff-200d-2640':0, '1f9d6-1f3fb-200d-2642':0, '1f9d6-1f3fc-200d-2642':0, '1f9d6-1f3fd-200d-2642':0, '1f9d6-1f3fe-200d-2642':0, '1f9d6-1f3ff-200d-2642':0, '1f9d6-1f3fb':0, '1f9d6-1f3fc':0, '1f9d6-1f3fd':0, '1f9d6-1f3fe':0, '1f9d6-1f3ff':0, '1f9d7-1f3fb-200d-2640':0, '1f9d7-1f3fc-200d-2640':0, '1f9d7-1f3fd-200d-2640':0, '1f9d7-1f3fe-200d-2640':0, '1f9d7-1f3ff-200d-2640':0, '1f9d7-1f3fb-200d-2642':0, '1f9d7-1f3fc-200d-2642':0, '1f9d7-1f3fd-200d-2642':0, '1f9d7-1f3fe-200d-2642':0, '1f9d7-1f3ff-200d-2642':0, '1f9d7-1f3fb':0, '1f9d7-1f3fc':0, '1f9d7-1f3fd':0, '1f9d7-1f3fe':0, '1f9d7-1f3ff':0, '1f9d8-1f3fb-200d-2640':0, '1f9d8-1f3fc-200d-2640':0, '1f9d8-1f3fd-200d-2640':0, '1f9d8-1f3fe-200d-2640':0, '1f9d8-1f3ff-200d-2640':0, '1f9d8-1f3fb-200d-2642':0, '1f9d8-1f3fc-200d-2642':0, '1f9d8-1f3fd-200d-2642':0, '1f9d8-1f3fe-200d-2642':0, '1f9d8-1f3ff-200d-2642':0, '1f9d8-1f3fb':0, '1f9d8-1f3fc':0, '1f9d8-1f3fd':0, '1f9d8-1f3fe':0, '1f9d8-1f3ff':0, '1f9d9-1f3fb-200d-2640':0, '1f9d9-1f3fc-200d-2640':0, '1f9d9-1f3fd-200d-2640':0, '1f9d9-1f3fe-200d-2640':0, '1f9d9-1f3ff-200d-2640':0, '1f9d9-1f3fb-200d-2642':0, '1f9d9-1f3fc-200d-2642':0, '1f9d9-1f3fd-200d-2642':0, '1f9d9-1f3fe-200d-2642':0, '1f9d9-1f3ff-200d-2642':0, '1f9d9-1f3fb':0, '1f9d9-1f3fc':0, '1f9d9-1f3fd':0, '1f9d9-1f3fe':0, '1f9d9-1f3ff':0, '1f9da-1f3fb-200d-2640':0, '1f9da-1f3fc-200d-2640':0, '1f9da-1f3fd-200d-2640':0, '1f9da-1f3fe-200d-2640':0, '1f9da-1f3ff-200d-2640':0, '1f9da-1f3fb-200d-2642':0, '1f9da-1f3fc-200d-2642':0, '1f9da-1f3fd-200d-2642':0, '1f9da-1f3fe-200d-2642':0, '1f9da-1f3ff-200d-2642':0, '1f9da-1f3fb':0, '1f9da-1f3fc':0, '1f9da-1f3fd':0, '1f9da-1f3fe':0, '1f9da-1f3ff':0, '1f9db-1f3fb-200d-2640':0, '1f9db-1f3fc-200d-2640':0, '1f9db-1f3fd-200d-2640':0, '1f9db-1f3fe-200d-2640':0, '1f9db-1f3ff-200d-2640':0, '1f9db-1f3fb-200d-2642':0, '1f9db-1f3fc-200d-2642':0, '1f9db-1f3fd-200d-2642':0, '1f9db-1f3fe-200d-2642':0, '1f9db-1f3ff-200d-2642':0, '1f9db-1f3fb':0, '1f9db-1f3fc':0, '1f9db-1f3fd':0, '1f9db-1f3fe':0, '1f9db-1f3ff':0, '1f9dc-1f3fb-200d-2640':0, '1f9dc-1f3fc-200d-2640':0, '1f9dc-1f3fd-200d-2640':0, '1f9dc-1f3fe-200d-2640':0, '1f9dc-1f3ff-200d-2640':0, '1f9dc-1f3fb-200d-2642':0, '1f9dc-1f3fc-200d-2642':0, '1f9dc-1f3fd-200d-2642':0, '1f9dc-1f3fe-200d-2642':0, '1f9dc-1f3ff-200d-2642':0, '1f9dc-1f3fb':0, '1f9dc-1f3fc':0, '1f9dc-1f3fd':0, '1f9dc-1f3fe':0, '1f9dc-1f3ff':0, '1f9dd-1f3fb-200d-2640':0, '1f9dd-1f3fc-200d-2640':0, '1f9dd-1f3fd-200d-2640':0, '1f9dd-1f3fe-200d-2640':0, '1f9dd-1f3ff-200d-2640':0, '1f9dd-1f3fb-200d-2642':0, '1f9dd-1f3fc-200d-2642':0, '1f9dd-1f3fd-200d-2642':0, '1f9dd-1f3fe-200d-2642':0, '1f9dd-1f3ff-200d-2642':0, '1f9dd-1f3fb':0, '1f9dd-1f3fc':0, '1f9dd-1f3fd':0, '1f9dd-1f3fe':0, '1f9dd-1f3ff':0, '261d-1f3fb':0, '261d-1f3fc':0, '261d-1f3fd':0, '261d-1f3fe':0, '261d-1f3ff':0, '26f9-1f3fb-200d-2640':0, '26f9-1f3fc-200d-2640':0, '26f9-1f3fd-200d-2640':0, '26f9-1f3fe-200d-2640':0, '26f9-1f3ff-200d-2640':0, '26f9-1f3fb-200d-2642':0, '26f9-1f3fc-200d-2642':0, '26f9-1f3fd-200d-2642':0, '26f9-1f3fe-200d-2642':0, '26f9-1f3ff-200d-2642':0, '26f9-1f3fb':0, '26f9-1f3fc':0, '26f9-1f3fd':0, '26f9-1f3fe':0, '26f9-1f3ff':0, '270a-1f3fb':0, '270a-1f3fc':0, '270a-1f3fd':0, '270a-1f3fe':0, '270a-1f3ff':0, '270b-1f3fb':0, '270b-1f3fc':0, '270b-1f3fd':0, '270b-1f3fe':0, '270b-1f3ff':0, '270c-1f3fb':0, '270c-1f3fc':0, '270c-1f3fd':0, '270c-1f3fe':0, '270c-1f3ff':0, '270d-1f3fb':0, '270d-1f3fc':0, '270d-1f3fd':0, '270d-1f3fe':0, '270d-1f3ff':0}};\n\nconst Emoji: {[emoji: string]: number} = EmojiVersions[''];\nfor(const version in EmojiVersions) {\n if(version) {\n Object.assign(Emoji, EmojiVersions[version as EMOJI_VERSION]);\n }\n}\n\nexport default Emoji;\n\n/* Emoji[\"00a9-fe0f\"] = 6362;\nEmoji[\"00ae-fe0f\"] = 6363;\nEmoji[\"2122-fe0f\"] = 6364; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport const FontFamily = 'Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif';\nexport const FontSize = '16px';\nexport const FontWeight = '400';\n","const IS_IMAGE_BITMAP_SUPPORTED = typeof(ImageBitmap) !== 'undefined';\n\nexport default IS_IMAGE_BITMAP_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's animation.ts\n\nimport {fastRaf} from './schedulers';\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\n\ninterface AnimationInstance {\n isCancelled: boolean;\n deferred: CancellablePromise\n}\n\ntype AnimationInstanceKey = any;\nconst instances: Map = new Map();\n\nexport function createAnimationInstance(key: AnimationInstanceKey) {\n cancelAnimationByKey(key);\n\n const instance: AnimationInstance = {\n isCancelled: false,\n deferred: deferredPromise()\n };\n\n instances.set(key, instance);\n instance.deferred.then(() => {\n if(getAnimationInstance(key) === instance) {\n instances.delete(key);\n }\n });\n\n return instance;\n}\n\nexport function getAnimationInstance(key: AnimationInstanceKey) {\n return instances.get(key);\n}\n\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\n const instance = getAnimationInstance(key);\n if(instance) {\n instance.isCancelled = true;\n instance.deferred.resolve();\n }\n}\n\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\n if(!instance) {\n instance = createAnimationInstance(key);\n }\n\n fastRaf(() => {\n if(instance.isCancelled) {\n return;\n }\n\n if(tick()) {\n animateSingle(tick, key, instance);\n } else {\n instance.deferred.resolve();\n }\n });\n\n return instance.deferred;\n}\n\nexport function animate(tick: Function) {\n fastRaf(() => {\n if(tick()) {\n animate(tick);\n }\n });\n}\n","type K = boolean;\nexport default async function filterAsync(arr: T[], callback: (item: T, idx: number, arr: T[]) => Promise | K) {\n const promises = arr.map(async(item, idx, arr) => {\n if(await callback(item, idx, arr)) {\n return item;\n }\n });\n\n return (await Promise.all(promises)).filter(Boolean);\n}\n","export default function findAndSpliceAll(array: Array, verify: (value: T, index: number, arr: typeof array) => boolean) {\n const out: typeof array = [];\n let idx = -1;\n while((idx = array.findIndex(verify)) !== -1) {\n out.push(array.splice(idx, 1)[0]);\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst ASSETS_PATH = 'assets/audio/';\n\nexport default class AudioAssetPlayer {\n private audio: HTMLAudioElement;\n private tempId: number;\n private assetName: AssetName;\n\n constructor(private assets: AssetName[]) {\n this.tempId = 0;\n }\n\n public playSound(name: AssetName, loop = false) {\n ++this.tempId;\n this.assetName = name;\n\n try {\n const audio = this.createAudio();\n audio.autoplay = true;\n audio.src = ASSETS_PATH + name;\n audio.loop = loop;\n audio.play();\n } catch(e) {\n console.error('playSound', name, e);\n }\n }\n\n public playSoundIfDifferent(name: AssetName, loop?: boolean) {\n if(this.assetName !== name) {\n this.playSound(name, loop);\n }\n }\n\n public createAudio() {\n let {audio} = this;\n if(audio) {\n return audio;\n }\n\n audio = this.audio = new Audio();\n audio.play();\n return audio;\n }\n\n public stopSound() {\n if(!this.audio) {\n return;\n }\n\n this.audio.pause();\n }\n\n public cancelDelayedPlay() {\n ++this.tempId;\n }\n\n public playSoundWithTimeout(name: AssetName, loop: boolean, timeout: number) {\n // timeout = 0;\n const tempId = ++this.tempId;\n setTimeout(() => {\n if(this.tempId !== tempId) {\n return;\n }\n\n this.playSound(name, loop);\n }, timeout);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsDataURL(blob: Blob) {\n return readBlobAs(blob, 'readAsDataURL');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\nimport {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport {fastRaf} from './schedulers';\nimport {ArgumentTypes} from '../types';\n\ntype HeavyQueue> = {\n items: ArgumentTypes[],\n process: (...args: any[]) => ReturnType,\n context: any,\n promise?: CancellablePromise[]>\n};\nconst heavyQueue: HeavyQueue[] = [];\nlet processingQueue = false;\n\nexport default function addHeavyTask>(queue: T, method: 'push' | 'unshift' = 'push') {\n if(!queue.items.length) {\n return Promise.resolve([]) as typeof promise;\n }\n\n const promise = queue.promise = deferredPromise();\n heavyQueue[method](queue);\n processHeavyQueue();\n\n return promise;\n}\n\nfunction processHeavyQueue() {\n if(!processingQueue) {\n const queue = heavyQueue.shift();\n timedChunk(queue).finally(() => {\n processingQueue = false;\n if(heavyQueue.length) {\n processHeavyQueue();\n }\n });\n }\n}\n\nfunction timedChunk>(queue: HeavyQueue) {\n if(!queue.items.length) {\n queue.promise.resolve([] as any);\n return Promise.resolve([]);\n }\n\n const todo = queue.items.slice();\n const results: ReturnType[] = [];\n\n return new Promise((resolve, reject) => {\n const f = async() => {\n const start = performance.now();\n\n do {\n await getHeavyAnimationPromise();\n const possiblePromise = queue.process.apply(queue.context, todo.shift());\n let realResult: typeof results[0];\n // @ts-ignore\n if(possiblePromise instanceof Promise) {\n try {\n realResult = await possiblePromise;\n } catch(err) {\n reject(err);\n return;\n }\n } else {\n realResult = possiblePromise;\n }\n\n results.push(realResult);\n } while(todo.length > 0 && (performance.now() - start) < 6);\n\n if(todo.length > 0) {\n fastRaf(f);\n // setTimeout(f, 25);\n } else {\n resolve(results);\n }\n };\n\n fastRaf(f);\n // setTimeout(f, 25);\n }).then(queue.promise.resolve, queue.promise.reject);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type fastBlur from '../vendor/fastBlur';\nimport addHeavyTask from './heavyQueue';\nimport IS_CANVAS_FILTER_SUPPORTED from '../environment/canvasFilterSupport';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\n\nlet requireBlurPromise: Promise;\nlet fastBlurFunc: typeof fastBlur;\nif(!IS_CANVAS_FILTER_SUPPORTED) {\n requireBlurPromise = import('../vendor/fastBlur').then((m) => {\n fastBlurFunc = m.default;\n });\n} else {\n requireBlurPromise = Promise.resolve();\n}\n\nfunction processBlurNext(\n img: HTMLImageElement,\n radius: number,\n iterations: number,\n canvas: HTMLCanvasElement = document.createElement('canvas')\n) {\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d', {alpha: false});\n if(IS_CANVAS_FILTER_SUPPORTED) {\n ctx.filter = `blur(${radius}px)`;\n ctx.drawImage(img, -radius * 2, -radius * 2, canvas.width + radius * 4, canvas.height + radius * 4);\n } else {\n ctx.drawImage(img, 0, 0);\n fastBlurFunc(ctx, 0, 0, canvas.width, canvas.height, radius, iterations);\n }\n\n return canvas;\n}\n\ntype CacheValue = {canvas: HTMLCanvasElement, promise: Promise};\nconst cache: Map = new Map();\nconst CACHE_SIZE = 150;\n\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\n if(!dataUri) {\n throw 'no dataUri for blur: ' + dataUri;\n }\n\n if(cache.size > CACHE_SIZE) {\n cache.clear();\n }\n\n const canvas = document.createElement('canvas');\n canvas.className = 'canvas-thumbnail';\n\n let cached = cache.get(dataUri);\n if(!cached) {\n const promise: CacheValue['promise'] = new Promise((resolve) => {\n // return resolve(dataUri);\n requireBlurPromise.then(() => {\n const img = new Image();\n img.onload = () => {\n // if(IS_CANVAS_FILTER_SUPPORTED) {\n // resolve(processBlurNext(img, radius, iterations));\n // } else {\n const promise = addHeavyTask({\n items: [[img, radius, iterations, canvas]],\n context: null,\n process: processBlurNext\n }, 'unshift');\n\n promise.then(() => {\n resolve();\n });\n // }\n };\n img.src = dataUri;\n });\n });\n\n cache.set(dataUri, cached = {\n canvas,\n promise\n });\n } else {\n canvas.width = cached.canvas.width;\n canvas.height = cached.canvas.height;\n cached.promise.then(() => {\n canvas.getContext('2d').drawImage(cached.canvas, 0, 0, canvas.width, canvas.height);\n });\n }\n\n return {\n ...cached,\n canvas\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport bytesFromHex from './bytesFromHex';\nimport bytesToDataURL from './bytesToDataURL';\nimport convertToUint8Array from './convertToUint8Array';\n\nconst JPEG_HEADER_HEX = 'ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00';\n\nconst JPEG_HEADER = bytesFromHex(JPEG_HEADER_HEX);\nconst JPEG_TAIL = bytesFromHex('ffd9');\n\nexport function getPreviewBytesFromURL(url: string) {\n const needle = 'base64,';\n const sliced = url.slice(url.indexOf(needle) + needle.length);\n const jpegBytes = [...atob(sliced)].map((char) => char.charCodeAt(0));\n\n return new Uint8Array(jpegBytes);\n // console.log('getPreviewBytesFromURL', bytesToHex(jpegBytes));\n\n // const n = JPEG_HEADER_HEX.slice(-10);\n // const one = jpegBytes[164];\n // const two = jpegBytes[166];\n\n // const body = jpegBytes.slice(bytesToHex(jpegBytes).indexOf(n) / 2 + n.length / 2/* JPEG_HEADER.length */, jpegBytes.length - JPEG_TAIL.length);\n // const original = new Uint8Array([\n // 0xFF,\n // one,\n // two,\n // ...body\n // ]);\n\n // console.log(bytesToHex(body));\n\n // return original;\n}\n\nexport default function getPreviewURLFromBytes(bytes: Uint8Array | number[], isSticker = false) {\n let arr: Uint8Array;\n if(!isSticker && bytes[0] === 0x1) {\n arr = new Uint8Array(JPEG_HEADER.concat(Array.from(bytes.slice(3)), JPEG_TAIL));\n arr[164] = bytes[1];\n arr[166] = bytes[2];\n } else {\n arr = convertToUint8Array(bytes);\n }\n\n let mimeType: string;\n if(isSticker) {\n mimeType = IS_SAFARI ? 'image/png' : 'image/webp';\n } else {\n mimeType = 'image/jpeg';\n }\n\n const dataURL = bytesToDataURL(arr, mimeType);\n return dataURL;\n}\n","export default function bytesToDataURL(bytes: Uint8Array, mimeType: string = 'image/jpeg') {\n return `data:${mimeType};base64,${btoa(String.fromCharCode(...bytes))}`;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {makeMediaSize} from './mediaSize';\n\nexport default function calcImageInBox(imageW: number, imageH: number, boxW: number, boxH: number, noZoom = true) {\n if(imageW < boxW && imageH < boxH && noZoom) {\n return makeMediaSize(imageW, imageH);\n }\n\n let boxedImageW = boxW;\n let boxedImageH = boxH;\n\n if((imageW / imageH) > (boxW / boxH)) {\n boxedImageH = (imageH * boxW / imageW) | 0;\n } else {\n boxedImageW = (imageW * boxH / imageH) | 0;\n if(boxedImageW > boxW) {\n boxedImageH = (boxedImageH * boxW / boxedImageW) | 0;\n boxedImageW = boxW;\n }\n }\n\n // if (Config.Navigator.retina) {\n // imageW = Math.floor(imageW / 2)\n // imageH = Math.floor(imageH / 2)\n // }\n\n if(noZoom && boxedImageW >= imageW && boxedImageH >= imageH) {\n boxedImageW = imageW;\n boxedImageH = imageH;\n }\n\n return makeMediaSize(boxedImageW, boxedImageH);\n}\n\nMOUNT_CLASS_TO.calcImageInBox = calcImageInBox;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { MOUNT_CLASS_TO } from \"../../config/debug\";\n\nlet context: CanvasRenderingContext2D;\n/**\n * Get the text width\n * @param {string} text\n * @param {string} font\n */\nexport default function getTextWidth(text: string, font: string) {\n // const perf = performance.now();\n if(!context) {\n const canvas = document.createElement('canvas');\n context = canvas.getContext('2d', {alpha: false});\n }\n\n if(context.font !== font) {\n context.font = font;\n }\n\n // context.font = font;\n const metrics = context.measureText(text);\n // console.log('getTextWidth perf:', performance.now() - perf);\n return metrics.width;\n // return Math.round(metrics.width);\n}\n\n// MOUNT_CLASS_TO && (MOUNT_CLASS_TO.getTextWidth = getTextWidth);\n","import type {MediaSize} from '../mediaSize';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\n\nexport default function scaleMediaElement(options: T): Promise {\n return new Promise(async(resolve) => {\n const canvas = document.createElement('canvas');\n const size = options.size ?? options.mediaSize.aspectFitted(options.boxSize);\n const dpr = window.devicePixelRatio && 1;\n canvas.width = size.width * dpr;\n canvas.height = size.height * dpr;\n const ctx = canvas.getContext('2d');\n\n let source: CanvasImageSource;\n if(IS_IMAGE_BITMAP_SUPPORTED) {\n source = await createImageBitmap(options.media, {resizeWidth: size.width, resizeHeight: size.height});\n } else {\n source = options.media;\n }\n\n ctx.drawImage(source, 0, 0, canvas.width, canvas.height);\n\n if(IS_IMAGE_BITMAP_SUPPORTED) {\n (source as ImageBitmap)?.close();\n }\n\n const mimeType = options.mimeType ?? 'image/jpeg';\n const quality = options.quality ?? 1;\n if(options.toDataURL) {\n const url = canvas.toDataURL(mimeType, quality);\n resolve({url, size} as any);\n } else {\n canvas.toBlob((blob) => {\n resolve({blob, size} as any);\n }, mimeType, quality);\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport LatinizeMap from '../config/latinizeMap';\n\nexport const badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nconst C2L: {[k: string]: string} = {\n 'й': 'q',\n 'ц': 'w',\n 'у': 'e',\n 'к': 'r',\n 'е': 't',\n 'н': 'y',\n 'г': 'u',\n 'ш': 'i',\n 'щ': 'o',\n 'з': 'p',\n 'х': '[',\n 'ъ': ']',\n 'ф': 'a',\n 'ы': 's',\n 'в': 'd',\n 'а': 'f',\n 'п': 'g',\n 'р': 'h',\n 'о': 'j',\n 'л': 'k',\n 'д': 'l',\n 'ж': ';',\n 'э': '\\'',\n 'я': 'z',\n 'ч': 'x',\n 'с': 'c',\n 'м': 'v',\n 'и': 'b',\n 'т': 'n',\n 'ь': 'm',\n 'б': ',',\n 'ю': '.',\n '.': '/'\n};\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function fixCyrillic(text: string) {\n return text.toLowerCase().replace(/[\\wа-я]/g, (ch) => {\n const latinizeCh = C2L[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = LatinizeMap[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n return processSearchText(text, {\n clearBadChars: true,\n latinize,\n ignoreCase: true\n });\n}\n\nexport type ProcessSearchTextOptions = Partial<{\n clearBadChars: boolean,\n latinize: boolean,\n ignoreCase: boolean,\n includeTag: boolean\n}>;\n\nexport function processSearchText(text: string, options: ProcessSearchTextOptions = {}) {\n const hasTag = options.includeTag && text.charAt(0) === '%';\n const originalText = text;\n if(options.clearBadChars) text = clearBadCharsAndTrim(text);\n if(options.latinize) text = latinizeString(text);\n if(options.ignoreCase) text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n if(options.latinize) text += '\\x01' + fixCyrillic(originalText);\n return text;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// https://stackoverflow.com/a/30810322\nfunction fallbackCopyTextToClipboard(text: string) {\n var textArea = document.createElement('textarea');\n textArea.value = text;\n\n // Avoid scrolling to bottom\n textArea.style.top = '0';\n textArea.style.left = '0';\n textArea.style.position = 'fixed';\n\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n try {\n document.execCommand('copy');\n // const successful = document.execCommand('copy');\n // const msg = successful ? 'successful' : 'unsuccessful';\n // console.log('Fallback: Copying text command was ' + msg);\n } catch(err) {\n // console.error('Fallback: Oops, unable to copy', err);\n }\n\n document.body.removeChild(textArea);\n}\n\nexport function copyTextToClipboard(text: string) {\n if(!navigator.clipboard) {\n fallbackCopyTextToClipboard(text);\n return;\n }\n\n navigator.clipboard.writeText(text).catch((err) => {\n console.error('clipboard error', err);\n fallbackCopyTextToClipboard(text);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport mediaSizes from './mediaSizes';\nimport OverlayClickHandler from './overlayClickHandler';\n\nclass ContextMenuController extends OverlayClickHandler {\n constructor() {\n super('menu', true);\n\n mediaSizes.addEventListener('resize', () => {\n if(this.element) {\n this.close();\n }\n\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\n const rect = openedMenu.getBoundingClientRect();\n const {innerWidth, innerHeight} = window;\n\n console.log(innerWidth, innerHeight, rect);\n } */\n });\n }\n\n public isOpened() {\n return !!this.element;\n }\n\n private onMouseMove = (e: MouseEvent) => {\n const rect = this.element.getBoundingClientRect();\n const {clientX, clientY} = e;\n\n const diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\n const diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\n\n if(diffX >= 100 || diffY >= 100) {\n this.close();\n // openedMenu.parentElement.click();\n }\n // console.log('mousemove', diffX, diffY);\n };\n\n public close() {\n if(this.element) {\n this.element.classList.remove('active');\n this.element.parentElement.classList.remove('menu-open');\n }\n\n super.close();\n\n if(!IS_TOUCH_SUPPORTED) {\n window.removeEventListener('mousemove', this.onMouseMove);\n }\n }\n\n public openBtnMenu(element: HTMLElement, onClose?: () => void) {\n super.open(element);\n\n this.element.classList.add('active');\n this.element.parentElement.classList.add('menu-open');\n\n if(onClose) {\n this.addEventListener('toggle', onClose, {once: true});\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n window.addEventListener('mousemove', this.onMouseMove);\n }\n }\n}\n\nconst contextMenuController = new ContextMenuController();\nexport default contextMenuController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport I18n, {i18n} from '../lib/langPack';\n\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\nexport const ONE_DAY = 86400;\n\n// https://stackoverflow.com/a/6117889\nexport const getWeekNumber = (date: Date) => {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n const dayNum = d.getUTCDay() || 7;\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\n};\n\nexport function formatDateAccordingToTodayNew(time: Date) {\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n const timestamp = time.getTime() / 1000 | 0;\n\n const options: Intl.DateTimeFormatOptions = {};\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\n options.hour = options.minute = '2-digit';\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\n options.year = options.day = 'numeric';\n options.month = '2-digit';\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\n options.weekday = 'short';\n } else { // same year\n options.month = 'short';\n options.day = 'numeric';\n }\n\n return new I18n.IntlDateElement({\n date: time,\n options\n }).element;\n}\n\nexport function formatFullSentTimeRaw(timestamp: number, options: {\n capitalize?: boolean\n} = {}) {\n const date = new Date();\n const time = new Date(timestamp * 1000);\n const now = date.getTime() / 1000;\n\n const timeEl = formatTime(time);\n\n let dateEl: Node | string;\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\n\n if(options.capitalize) {\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\n }\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\n } else {\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\n }\n\n return {dateEl, timeEl};\n}\n\nexport function formatFullSentTime(timestamp: number) {\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\n capitalize: true\n });\n\n const fragment = document.createDocumentFragment();\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\n return fragment;\n}\n\nexport function formatTime(date: Date) {\n return new I18n.IntlDateElement({\n date,\n options: {\n hour: '2-digit',\n minute: '2-digit'\n }\n }).element;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\n\nexport const getFullDate = (date: Date, options: Partial<{\n noTime: true,\n noSeconds: true,\n monthAsNumber: true,\n leadingZero: true\n}> = {}) => {\n const joiner = options.monthAsNumber ? '.' : ' ';\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\n\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) +\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) +\n joiner + date.getFullYear() +\n (options.noTime ? '' : ', ' + time);\n};\n\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\nconst minYear = 2013;\nconst yearPattern = new RegExp('20[0-9]{1,2}');\nconst monthYearOrDayPattern = new RegExp('(\\\\w{3,}) ([0-9]{0,4})', 'i');\nconst yearOrDayAndMonthPattern = new RegExp('([0-9]{0,4}) (\\\\w{2,})', 'i');\nconst shortDate = new RegExp('^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst longDate = new RegExp('^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nexport type DateData = {\n title: string,\n minDate: number,\n maxDate: number,\n};\nexport function fillTipDates(query: string, dates: DateData[]) {\n const q = query.trim().toLowerCase();\n\n if(q.length < 3) {\n return;\n }\n\n if('today'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: 'Today',\n minDate,\n maxDate\n });\n return;\n }\n\n if('yesterday'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime() - 86400000;\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 86400001;\n dates.push({\n title: 'Yesterday',\n minDate,\n maxDate\n });\n return;\n }\n\n const dayOfWeek = getDayOfWeek(q);\n if(dayOfWeek >= 0) {\n const date = new Date();\n const now = date.getTime();\n const currentDay = date.getDay();\n const distance = dayOfWeek - currentDay;\n date.setDate(date.getDate() + distance);\n if(date.getTime() > now) {\n date.setTime(date.getTime() - 604800000);\n }\n const year = date.getFullYear()\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatWeekLong(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n let matches: any[];\n if((matches = shortDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const k = parseInt(g1);\n const k1 = parseInt(g2);\n if(k > 0 && k <= 31) {\n if(k1 >= minYear && k <= 12) {\n const selectedYear = k1;\n const month = k - 1;\n createForMonthYear(dates, month, selectedYear);\n return;\n } else if(k1 <= 12) {\n const day = k - 1;\n const month = k1 - 1;\n createForDayMonth(dates, day, month);\n }\n } else if(k >= minYear && k1 <= 12) {\n const selectedYear = k;\n const month = k1 - 1;\n createForMonthYear(dates, month, selectedYear);\n }\n\n return;\n }\n\n if((matches = longDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const g3 = matches[5];\n if(!matches[2] === matches[4]) {\n return;\n }\n\n const day = parseInt(g1);\n const month = parseInt(g2) - 1;\n let year = parseInt(g3);\n if(year >= 10 && year <= 99) {\n year += 2000;\n }\n\n const currentYear = new Date().getFullYear();\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\n const date = new Date();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n return;\n }\n\n if((matches = yearPattern.exec(q)) !== null) {\n let selectedYear = +q;\n const currentYear = new Date().getFullYear();\n if(selectedYear < minYear) {\n selectedYear = minYear;\n for(let i = currentYear; i >= selectedYear; i--) {\n const date = new Date();\n date.setFullYear(i, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(i + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + i,\n minDate,\n maxDate\n });\n }\n } else if(selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(selectedYear + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + selectedYear,\n minDate,\n maxDate\n });\n }\n\n return;\n }\n\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g1);\n if(month >= 0) {\n const k = +g2;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n return;\n }\n }\n }\n\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g2);\n if(month >= 0) {\n const k = +g1;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n }\n }\n }\n}\n\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n if(selectedYear >= minYear && selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, month, 1);\n date.setHours(0, 0, 0);\n const minDate = date.getTime();\n if(minDate > today) {\n return;\n }\n date.setMonth(date.getMonth() + 1);\n const maxDate = date.getTime() - 1;\n\n dates.push({\n title: formatterMonthYear(minDate),\n minDate,\n maxDate\n });\n }\n}\n\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\n if(validDateForMonth(day, month)) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n\n for(let i = currentYear; i >= minYear; i--) {\n if(month === 1 && day === 28 && !isLeapYear(i)) {\n continue;\n }\n\n const date = new Date();\n date.setFullYear(i, month, day + 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n if(minDate > today) {\n continue;\n }\n\n date.setFullYear(i, month, day + 2);\n date.setHours(0, 0, 0);\n const maxDate = date.getTime() - 1;\n if(i === currentYear) {\n dates.push({\n title: formatterDayMonth(minDate),\n minDate,\n maxDate\n });\n } else {\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n }\n }\n }\n}\n\nfunction formatterMonthYear(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\n}\n\nfunction formatterDayMonth(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\n}\n\nfunction formatterYearMax(timestamp: number) {\n const date = new Date(timestamp);\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\n}\n\nfunction formatWeekLong(timestamp: number) {\n const date = new Date(timestamp);\n return days[date.getDay()];\n}\n\nfunction validDateForMonth(day: number, month: number) {\n if(month >= 0 && month < 12) {\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\n return true;\n }\n }\n return false;\n}\n\nfunction isLeapYear(year: number) {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\n}\n\nfunction getMonth(q: string) {\n /* String[] months = new String[]{\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\n }; */\n\n /* String[] monthsEng = new String[12];\n Calendar c = Calendar.getInstance();\n for (int i = 1; i <= 12; i++) {\n c.set(0, 0, 0, 0, 0, 0);\n c.set(Calendar.MONTH, i);\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\n } */\n\n q = q.toLowerCase();\n for(let i = 0; i < 12; i++) {\n const month = months[i].toLowerCase();\n if(month.indexOf(q) === 0) {\n return i;\n }\n }\n return -1;\n}\n\nfunction getDayOfWeek(q: string) {\n const c = new Date();\n if(q.length <= 3) {\n return -1;\n }\n\n for(let i = 0; i < 7; i++) {\n c.setDate(c.getDate() + 1);\n\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\n return c.getDay();\n }\n }\n return -1;\n}\n\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {toastNew} from '../../components/toast';\nimport {LangPackKey} from '../../lib/langPack';\nimport {copyTextToClipboard} from '../clipboard';\nimport cancelEvent from './cancelEvent';\nimport {attachClickEvent} from './clickEvent';\n\nconst T_ME = 'https://t.me/';\nexport default function anchorCopy(options: Partial<{\n // href: string,\n mePath: string,\n username: string\n}> = {}) {\n const anchor = document.createElement('a');\n anchor.classList.add('anchor-copy');\n\n let copyWhat: string, copyText: LangPackKey = 'LinkCopied';\n if(options.mePath) {\n const href = T_ME + options.mePath;\n copyWhat = anchor.href = anchor.innerText = href;\n }\n\n if(options.username) {\n const href = T_ME + options.username;\n anchor.href = href;\n copyWhat = anchor.innerText = '@' + options.username;\n copyText = 'UsernameCopied';\n }\n\n attachClickEvent(anchor, (e) => {\n cancelEvent(e);\n copyTextToClipboard(copyWhat ?? anchor.href);\n toastNew({langPackKey: copyText});\n });\n\n return anchor;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_APPLE} from '../../environment/userAgent';\nimport contextMenuController from '../contextMenuController';\nimport ListenerSetter from '../listenerSetter';\nimport cancelEvent from './cancelEvent';\n\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\nexport function cancelContextMenuOpening() {\n if(_cancelContextMenuOpeningTimeout) {\n clearTimeout(_cancelContextMenuOpeningTimeout);\n }\n\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\n _cancelContextMenuOpeningTimeout = 0;\n _cancelContextMenuOpening = false;\n }, .4e3);\n\n _cancelContextMenuOpening = true;\n}\n\nexport function attachContextMenuListener(\n element: HTMLElement,\n callback: (e: TouchEvent | MouseEvent) => void,\n listenerSetter?: ListenerSetter\n) {\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\n\n if(IS_APPLE && IS_TOUCH_SUPPORTED) {\n let timeout: number;\n\n const options: EventListenerOptions = {capture: true};\n\n const onCancel = () => {\n clearTimeout(timeout);\n // @ts-ignore\n remove('touchmove', onCancel, options);\n // @ts-ignore\n remove('touchend', onCancel, options);\n // @ts-ignore\n remove('touchcancel', onCancel, options);\n };\n\n add('touchstart', (e: TouchEvent) => {\n if(e.touches.length > 1) {\n onCancel();\n return;\n }\n\n add('touchmove', onCancel, options);\n add('touchend', onCancel, options);\n add('touchcancel', onCancel, options);\n\n timeout = window.setTimeout(() => {\n if(_cancelContextMenuOpening) {\n onCancel();\n return;\n }\n\n callback(e);\n onCancel();\n\n if(contextMenuController.isOpened()) {\n add('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n }, .4e3);\n });\n\n /* if(!isSafari) {\n add('contextmenu', (e: any) => {\n cancelEvent(e);\n }, {passive: false, capture: true});\n } */\n } else {\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\n callback(e);\n\n if(contextMenuController.isOpened()) {\n add('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n } : callback);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type GrabEvent = {x: number, y: number, isTouch?: boolean, event: TouchEvent | MouseEvent};\n\nexport default function attachGrabListeners(element: HTMLElement,\n onStart: (position: GrabEvent) => void,\n onMove: (position: GrabEvent) => void,\n onEnd?: (position: GrabEvent) => void) {\n // * Mouse\n const onMouseMove = (event: MouseEvent) => {\n onMove({x: event.pageX, y: event.pageY, event});\n };\n\n const onMouseUp = (event: MouseEvent) => {\n document.removeEventListener('mousemove', onMouseMove);\n element.addEventListener('mousedown', onMouseDown, {once: true});\n onEnd && onEnd({x: event.pageX, y: event.pageY, event});\n };\n\n const onMouseDown = (event: MouseEvent) => {\n if(event.button !== 0) {\n element.addEventListener('mousedown', onMouseDown, {once: true});\n return;\n }\n\n onStart({x: event.pageX, y: event.pageY, event});\n onMouseMove(event);\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp, {once: true});\n };\n\n element.addEventListener('mousedown', onMouseDown, {once: true});\n\n // * Touch\n const onTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n onMove({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\n };\n\n const onTouchEnd = (event: TouchEvent) => {\n document.removeEventListener('touchmove', onTouchMove);\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\n onEnd && onEnd({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\n };\n\n const onTouchStart = (event: TouchEvent) => {\n onStart({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\n onTouchMove(event);\n\n document.addEventListener('touchmove', onTouchMove, {passive: false});\n document.addEventListener('touchend', onTouchEnd, {passive: false, once: true});\n };\n\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\n\n return () => {\n element.removeEventListener('mousedown', onMouseDown);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n\n element.removeEventListener('touchstart', onTouchStart);\n document.removeEventListener('touchmove', onTouchMove);\n document.removeEventListener('touchend', onTouchEnd);\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function cancelSelection() {\n if(window.getSelection) {\n if(window.getSelection().empty) { // Chrome\n window.getSelection().empty();\n } else if(window.getSelection().removeAllRanges) { // Firefox\n window.getSelection().removeAllRanges();\n }\n // @ts-ignore\n } else if(document.selection) { // IE?\n // @ts-ignore\n document.selection.empty();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../listenerSetter';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport simulateEvent from './dispatchEvent';\n\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\n const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\n\n options.touchMouseDown = true;\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\n add('mousedown', callback, options);\n } else if(CLICK_EVENT_NAME === 'touchend') {\n const o = {...options, once: true};\n\n const onTouchStart = (e: TouchEvent) => {\n const onTouchMove = (e: TouchEvent) => {\n remove('touchmove', onTouchMove, o);\n remove('touchend', onTouchEnd, o);\n };\n\n const onTouchEnd = (e: TouchEvent) => {\n remove('touchmove', onTouchMove, o);\n callback(e);\n if(options.once) {\n remove('touchstart', onTouchStart);\n }\n };\n\n add('touchend', onTouchEnd, o);\n add('touchmove', onTouchMove, o);\n };\n\n add('touchstart', onTouchStart);\n } else {\n add(CLICK_EVENT_NAME, callback, options);\n } */\n add(CLICK_EVENT_NAME, callback, options);\n\n // @ts-ignore\n return () => remove(CLICK_EVENT_NAME, callback, options);\n}\n\nexport function detachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options?: AddEventListenerOptions) {\n // if(CLICK_EVENT_NAME === 'touchend') {\n // elem.removeEventListener('touchstart', callback, options);\n // } else {\n elem.removeEventListener(CLICK_EVENT_NAME, callback as any, options);\n // }\n}\n\nexport function simulateClickEvent(elem: HTMLElement) {\n simulateEvent(elem, CLICK_EVENT_NAME);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport EventListenerBase from '../eventListenerBase';\nimport ListenerSetter from '../listenerSetter';\nimport safeAssign from '../object/safeAssign';\nimport findUpClassName from './findUpClassName';\n\nexport default class ControlsHover extends EventListenerBase<{\n toggleControls: (show: boolean) => void\n}> {\n protected hideControlsTimeout: number;\n protected controlsLocked: boolean;\n\n protected canHideControls: () => boolean;\n protected element: HTMLElement;\n protected listenerSetter: ListenerSetter;\n protected showOnLeaveToClassName: string;\n protected ignoreClickClassName: string;\n\n constructor() {\n super(false);\n this.hideControlsTimeout = 0;\n }\n\n public setup(options: {\n element: HTMLElement,\n listenerSetter: ListenerSetter,\n canHideControls?: () => boolean,\n showOnLeaveToClassName?: string,\n ignoreClickClassName?: string\n }) {\n safeAssign(this, options);\n\n const {listenerSetter, element} = this;\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(element)('click', (e) => {\n if(this.ignoreClickClassName && findUpClassName(e.target, this.ignoreClickClassName)) {\n return;\n }\n\n this.toggleControls();\n });\n\n /* listenerSetter.add(player)('touchstart', () => {\n showControls(false);\n });\n\n listenerSetter.add(player)('touchend', () => {\n if(player.classList.contains('is-playing')) {\n showControls();\n }\n }); */\n } else {\n listenerSetter.add(element)('mousemove', () => {\n this.showControls();\n });\n\n listenerSetter.add(element)('mouseenter', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(element)('mouseleave', (e) => {\n if(e.relatedTarget && this.showOnLeaveToClassName && findUpClassName(e.relatedTarget, this.showOnLeaveToClassName)) {\n this.showControls(false);\n return;\n }\n\n this.hideControls();\n });\n }\n }\n\n public hideControls = (setHideTimeout = false) => {\n if(setHideTimeout) {\n if(!this.hideControlsTimeout) {\n this.hideControlsTimeout = window.setTimeout(this.hideControls, 3e3);\n }\n\n return;\n }\n\n clearTimeout(this.hideControlsTimeout);\n this.hideControlsTimeout = 0;\n\n const isShown = this.element.classList.contains('show-controls');\n if(this.controlsLocked !== false) {\n if((this.canHideControls ? !this.canHideControls() : false) || !isShown || this.controlsLocked) {\n return;\n }\n } else if(!isShown) {\n return;\n }\n\n this.dispatchEvent('toggleControls', false);\n this.element.classList.remove('show-controls');\n };\n\n public showControls = (setHideTimeout = true) => {\n if(this.hideControlsTimeout) {\n clearTimeout(this.hideControlsTimeout);\n this.hideControlsTimeout = 0;\n } else if(!this.element.classList.contains('show-controls') && this.controlsLocked !== false) {\n this.dispatchEvent('toggleControls', true);\n this.element.classList.add('show-controls');\n }\n\n if(!setHideTimeout || this.controlsLocked) {\n return;\n }\n\n this.hideControlsTimeout = window.setTimeout(this.hideControls, 3e3);\n };\n\n public toggleControls = (show?: boolean) => {\n const isShown = this.element.classList.contains('show-controls');\n\n if(show === undefined) {\n if(isShown) this.hideControls();\n else this.showControls();\n } else if(show === isShown) return;\n else if(show === false) this.hideControls();\n else this.showControls();\n };\n\n public lockControls(visible: boolean) {\n this.controlsLocked = visible;\n\n this.element.classList.toggle('disable-hover', visible === false);\n this.toggleControls(visible);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ButtonMenu, {ButtonMenuItemOptionsVerifiable} from '../../components/buttonMenu';\nimport filterAsync from '../array/filterAsync';\nimport contextMenuController from '../contextMenuController';\nimport ListenerSetter from '../listenerSetter';\nimport {getMiddleware} from '../middleware';\nimport positionMenu from '../positionMenu';\nimport {attachContextMenuListener} from './attachContextMenuListener';\n\nexport default function createContextMenu({\n buttons,\n findElement,\n listenTo,\n appendTo,\n filterButtons,\n onOpen,\n onClose,\n onBeforeOpen,\n listenerSetter: attachListenerSetter\n}: {\n buttons: T[],\n findElement?: (e: MouseEvent | TouchEvent) => HTMLElement,\n listenTo: HTMLElement,\n appendTo?: HTMLElement,\n filterButtons?: (buttons: T[]) => Promise,\n onOpen?: (target: HTMLElement) => any,\n onClose?: () => any,\n onBeforeOpen?: () => any,\n listenerSetter?: ListenerSetter\n}) {\n appendTo ??= document.body;\n\n attachListenerSetter ??= new ListenerSetter();\n const listenerSetter = new ListenerSetter();\n const middleware = getMiddleware();\n let element: HTMLElement;\n\n attachContextMenuListener(listenTo, (e) => {\n const target = findElement ? findElement(e as any) : listenTo;\n if(!target) {\n return;\n }\n\n let _element = element;\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\n if(_element && _element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\n\n const r = async() => {\n await onOpen?.(target);\n\n const initResult = await init();\n if(!initResult) {\n return;\n }\n\n _element = initResult.element;\n const {cleanup, destroy} = initResult;\n\n positionMenu(e, _element);\n contextMenuController.openBtnMenu(_element, () => {\n onClose?.();\n cleanup();\n\n setTimeout(() => {\n destroy();\n }, 300);\n });\n };\n\n r();\n }, attachListenerSetter);\n\n const cleanup = () => {\n listenerSetter.removeAll();\n middleware.clean();\n };\n\n const destroy = () => {\n cleanup();\n attachListenerSetter.removeAll();\n };\n\n const init = async() => {\n cleanup();\n\n buttons.forEach((button) => button.element = undefined);\n const f = filterButtons || ((buttons: T[]) => filterAsync(buttons, (button) => button?.verify?.() ?? true));\n\n const filteredButtons = await f(buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const _element = element = await ButtonMenu({\n buttons: filteredButtons,\n listenerSetter\n });\n _element.classList.add('contextmenu');\n\n await onBeforeOpen?.();\n\n appendTo.append(_element);\n\n return {\n element: _element,\n cleanup,\n destroy: () => {\n _element.remove();\n }\n };\n };\n\n return {element, destroy};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport PopupStickers from '../../components/popups/stickers';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport createContextMenu from './createContextMenu';\nimport findUpClassName from './findUpClassName';\nimport emoticonsDropdown, {EmoticonsDropdown} from '../../components/emoticonsDropdown';\n\nexport default function createStickersContextMenu(options: {\n listenTo: HTMLElement,\n isStickerPack?: boolean,\n verifyRecent?: (target: HTMLElement) => boolean,\n appendTo?: HTMLElement,\n onOpen?: () => any,\n onClose?: () => any,\n onSend?: () => any\n}) {\n const {listenTo, isStickerPack, verifyRecent, appendTo, onOpen, onClose, onSend} = options;\n let target: HTMLElement, doc: MyDocument;\n const verifyFavoriteSticker = async(toAdd: boolean) => {\n const favedStickers = await rootScope.managers.acknowledged.appStickersManager.getFavedStickersStickers();\n if(!favedStickers.cached) {\n return false;\n }\n\n const found = (await favedStickers.result).some((_doc) => _doc.id === doc.id);\n return toAdd ? !found : found;\n };\n\n return createContextMenu({\n listenTo: listenTo,\n appendTo,\n findElement: (e) => target = findUpClassName(e.target, 'media-sticker-wrapper'),\n onOpen: async() => {\n doc = await rootScope.managers.appDocsManager.getDoc(target.dataset.docId);\n return onOpen?.();\n },\n onClose,\n buttons: [{\n icon: 'stickers',\n text: 'Context.ViewStickerSet',\n onClick: () => new PopupStickers(doc.stickerSetInput).show(),\n verify: () => !isStickerPack\n }, {\n icon: 'favourites',\n text: 'AddToFavorites',\n onClick: () => rootScope.managers.appStickersManager.faveSticker(doc.id, false),\n verify: () => verifyFavoriteSticker(true)\n }, {\n icon: 'favourites',\n text: 'DeleteFromFavorites',\n onClick: () => rootScope.managers.appStickersManager.faveSticker(doc.id, true),\n verify: () => verifyFavoriteSticker(false)\n }, {\n icon: 'delete',\n text: 'DeleteFromRecent',\n onClick: () => rootScope.managers.appStickersManager.saveRecentSticker(doc.id, true),\n verify: () => verifyRecent?.(target) ?? false\n }, {\n icon: 'mute',\n text: 'Chat.Send.WithoutSound',\n onClick: () => {\n onSend?.();\n return EmoticonsDropdown.sendDocId(doc.id, false, true);\n },\n verify: () => !!(appImManager.chat.peerId && appImManager.chat.peerId !== rootScope.myId)\n }, {\n icon: 'schedule',\n text: 'Chat.Send.ScheduledMessage',\n onClick: () => appImManager.chat.input.scheduleSending(() => appImManager.chat.input.sendMessageWithDocument(doc)),\n verify: () => !!appImManager.chat.peerId\n }]\n });\n}\n","export default function createVideo(options: {\n pip?: boolean\n} = {}) {\n const video = document.createElement('video');\n if(!options.pip) video.disablePictureInPicture = true;\n video.setAttribute('playsinline', 'true');\n return video;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../lib/rootScope';\n\nexport type CustomProperty = string;\n\nexport class CustomProperties {\n private cache: {[k in CustomProperty]?: string};\n private computedStyle: CSSStyleDeclaration;\n\n constructor() {\n this.cache = {};\n\n rootScope.addEventListener('theme_change', () => {\n this.computedStyle = undefined;\n const cache = this.cache;\n this.cache = {};\n\n for(const i in cache) {\n this.getProperty(i);\n }\n });\n }\n\n public getProperty(name: CustomProperty) {\n let value = this.cache[name];\n if(value) {\n return value;\n }\n\n if(!this.computedStyle) {\n this.computedStyle = window.getComputedStyle(document.documentElement);\n }\n\n value = this.computedStyle.getPropertyValue('--' + name).trim();\n return this.cache[name] = value;\n }\n}\n\nconst customProperties = new CustomProperties();\nexport default customProperties;\n","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","import encodeEntities from '../string/encodeEntities';\n\nexport default function documentFragmentToHTML(fragment: DocumentFragment) {\n return Array.from(fragment.childNodes).map((node) => {\n return node.nodeType === node.TEXT_NODE ? encodeEntities(node.textContent) : (node as Element).outerHTML;\n }).join('');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function findUpAsChild(el: T, parent: HTMLElement): T {\n if(!el) return null;\n if(el.parentElement === parent) return el;\n\n while(el.parentElement) {\n el = el.parentElement as any;\n if(el.parentElement === parent) {\n return el;\n }\n }\n\n return null;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\n return el.closest(`[${attribute}]`);\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.getAttribute(attribute) !== null)\n return el;\n }\n return null; */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function findUpTag(el: any, tag: string): HTMLElement {\n return el.closest(tag);\n /* if(el.tagName === tag) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.tagName === tag)\n return el;\n }\n return null; */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../listenerSetter';\n\nexport function requestFullScreen(element: HTMLElement) {\n if(element.requestFullscreen) {\n element.requestFullscreen();\n // @ts-ignore\n } else if(element.mozRequestFullScreen) {\n // @ts-ignore\n element.mozRequestFullScreen(); // Firefox\n // @ts-ignore\n } else if(element.webkitRequestFullscreen) {\n // @ts-ignore\n element.webkitRequestFullscreen(); // Chrome and Safari\n // @ts-ignore\n } else if(element.msRequestFullscreen) {\n // @ts-ignore\n element.msRequestFullscreen();\n }\n}\n\nexport function cancelFullScreen() {\n // @ts-ignore\n if(document.cancelFullScreen) {\n // @ts-ignore\n document.cancelFullScreen();\n // @ts-ignore\n } else if(document.mozCancelFullScreen) {\n // @ts-ignore\n document.mozCancelFullScreen();\n // @ts-ignore\n } else if(document.webkitCancelFullScreen) {\n // @ts-ignore\n document.webkitCancelFullScreen();\n // @ts-ignore\n } else if(document.msExitFullscreen) {\n // @ts-ignore\n document.msExitFullscreen();\n }\n}\n\nexport function addFullScreenListener(element: HTMLElement, callback: (e: Event) => any, listenerSetter?: ListenerSetter) {\n const addListener = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n 'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange'.split(' ').forEach((eventName) => {\n addListener(eventName, callback, false);\n });\n}\n\nexport function getFullScreenElement(): HTMLElement {\n // @ts-ignore\n return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;\n}\n\nexport function isFullScreen() {\n return !!getFullScreenElement();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpAsChild from './findUpAsChild';\n\nexport default function getCaretPosNew(input: HTMLElement, anchor?: boolean): ReturnType & {selection: Selection} {\n const selection = document.getSelection();\n // let {focusNode: node, focusOffset: offset} = selection;\n const node = selection[anchor ? 'anchorNode' : 'focusNode'];\n const offset = selection[anchor ? 'anchorOffset' : 'focusOffset'];\n if(!findUpAsChild(node, input) && node !== input) {\n return {selection} as any;\n }\n\n return {...getCaretPosF(input, node, offset), selection};\n}\n\nexport function getCaretPosF(input: HTMLElement, node: Node, offset: number) {\n if(node === input) {\n const childNodes = input.childNodes;\n const childNodesLength = childNodes.length;\n if(childNodesLength && offset >= childNodesLength) {\n node = childNodes[childNodesLength - 1];\n offset = (node.textContent || (node as HTMLImageElement).alt || '').length;\n } else {\n node = childNodes[offset];\n offset = 0;\n }\n }\n\n return {node: node as ChildNode, offset};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport BOM from '../string/bom';\n\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler'/* | 'customEmoji' */;\nexport type MarkdownTag = {\n match: string,\n entityName: Extract;\n};\n\n// https://core.telegram.org/bots/api#html-style\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\n bold: {\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\n entityName: 'messageEntityBold'\n },\n underline: {\n match: '[style*=\"underline\"], u, ins',\n entityName: 'messageEntityUnderline'\n },\n italic: {\n match: '[style*=\"italic\"], i, em',\n entityName: 'messageEntityItalic'\n },\n monospace: {\n match: '[style*=\"monospace\"], [face*=\"monospace\"], pre',\n entityName: 'messageEntityCode'\n },\n strikethrough: {\n match: '[style*=\"line-through\"], [style*=\"strikethrough\"], strike, del, s',\n entityName: 'messageEntityStrike'\n },\n link: {\n match: 'A:not(.follow)',\n entityName: 'messageEntityTextUrl'\n },\n mentionName: {\n match: 'A.follow',\n entityName: 'messageEntityMentionName'\n },\n spoiler: {\n match: '[style*=\"spoiler\"]',\n entityName: 'messageEntitySpoiler'\n }\n // customEmoji: {\n // match: '.custom-emoji',\n // entityName: 'messageEntityCustomEmoji'\n // }\n};\n\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\n\n/* export function getDepth(child: Node, container?: Node) {\n let depth = 0;\n\n do {\n if(child === container) {\n return depth;\n }\n\n ++depth;\n } while((child = child.parentNode) !== null);\n\n return depth;\n} */\n\nconst BLOCK_TAGS = new Set([\n 'DIV',\n 'P',\n 'BR',\n 'LI',\n 'SECTION',\n 'H6',\n 'H5',\n 'H4',\n 'H3',\n 'H2',\n 'H1',\n 'TR',\n 'OL',\n 'UL'\n]);\n\nconst INSERT_NEW_LINE_TAGS = new Set([\n 'OL',\n 'UL'\n]);\n\nconst BOM_REG_EXP = new RegExp(BOM, 'g');\n\nfunction checkNodeForEntity(node: Node, value: string, entities: MessageEntity[], offset: {offset: number}) {\n const parentElement = node.parentElement;\n\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\n for(const type in markdownTags) {\n const tag = markdownTags[type as MarkdownType];\n const closest: HTMLElement = parentElement.closest(tag.match + ', [contenteditable=\"true\"]');\n if(closest?.getAttribute('contenteditable') !== null) {\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\n if(closestDepth > depth) {\n closestDepth = depth;\n closestTag = tag;\n closestElementByTag = closest;\n } */\n continue;\n }\n\n if(tag.entityName === 'messageEntityTextUrl') {\n entities.push({\n _: tag.entityName,\n url: (closest as HTMLAnchorElement).href,\n offset: offset.offset,\n length: value.length\n });\n } else if(tag.entityName === 'messageEntityMentionName') {\n entities.push({\n _: tag.entityName,\n offset: offset.offset,\n length: value.length,\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\n });\n }/* else if(tag.entityName === 'messageEntityCustomEmoji') {\n entities.push({\n _: tag.entityName,\n document_id: (closest as HTMLElement).dataset.docId,\n offset: offset.offset,\n length: emoji.length\n });\n } */ else {\n entities.push({\n _: tag.entityName,\n offset: offset.offset,\n length: value.length\n });\n }\n }\n}\n\nexport default function getRichElementValue(\n node: HTMLElement,\n lines: string[],\n line: string[],\n selNode?: Node,\n selOffset?: number,\n entities?: MessageEntity[],\n offset = {offset: 0}\n) {\n if(node.nodeType === node.TEXT_NODE) { // TEXT\n let nodeValue = node.nodeValue;\n // if(nodeValue[0] === BOM) {\n nodeValue = nodeValue.replace(BOM_REG_EXP, '');\n // }\n\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\n if(tabulation?.getAttribute('contenteditable') === null) {\n nodeValue += ' ';\n // line.push('\\t');\n // ++offset.offset;\n } */\n\n if(nodeValue) {\n if(selNode === node) {\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\n } else {\n line.push(nodeValue);\n }\n } else if(selNode === node) {\n line.push('\\x01');\n }\n\n if(entities && nodeValue.length && node.parentNode) {\n checkNodeForEntity(node, nodeValue, entities, offset);\n }\n\n offset.offset += nodeValue.length;\n return;\n }\n\n if(node.nodeType !== node.ELEMENT_NODE) { // NON-ELEMENT\n return;\n }\n\n const isSelected = selNode === node;\n const isBlock = BLOCK_TAGS.has(node.tagName);\n if(isBlock && (line.length || node.tagName === 'BR'/* || (BLOCK_TAGS.has(node.tagName) && lines.length) */)) {\n lines.push(line.join(''));\n line.length = 0;\n ++offset.offset;\n } else {\n const alt = node.dataset.stickerEmoji || (node as HTMLImageElement).alt;\n const stickerEmoji = node.dataset.stickerEmoji;\n\n if(alt && entities) {\n checkNodeForEntity(node, alt, entities, offset);\n }\n\n if(stickerEmoji && entities) {\n entities.push({\n _: 'messageEntityCustomEmoji',\n document_id: node.dataset.docId,\n offset: offset.offset,\n length: alt.length\n });\n }\n\n if(alt) {\n line.push(alt);\n offset.offset += alt.length;\n }\n }\n\n if(isSelected && !selOffset) {\n line.push('\\x01');\n }\n\n const isTableCell = node.matches(tabulationMatch);\n const wasEntitiesLength = entities?.length;\n\n let curChild = node.firstChild as HTMLElement;\n while(curChild) {\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\n curChild = curChild.nextSibling as any;\n }\n\n if(isSelected && selOffset) {\n line.push('\\x01');\n }\n\n if(isTableCell && node.nextSibling && line.length) {\n line.push(' ');\n ++offset.offset;\n\n // * combine entities such as url after adding space\n if(wasEntitiesLength !== undefined) {\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\n ++entities[i].length;\n }\n }\n }\n\n const wasLength = line.length;\n if(isBlock && wasLength) {\n lines.push(line.join(''));\n line.splice(0, wasLength);\n ++offset.offset;\n }\n\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\n lines.push('');\n ++offset.offset;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {MessageEntity} from '../../layer';\nimport combineSameEntities from '../../lib/richTextProcessor/combineSameEntities';\nimport sortEntities from '../../lib/richTextProcessor/sortEntities';\nimport getRichElementValue from './getRichElementValue';\n\nexport function getCaretPos(field: HTMLElement) {\n const sel = window.getSelection();\n let selNode: Node;\n let selOffset: number;\n if(sel?.rangeCount) {\n const range = sel.getRangeAt(0);\n const startOffset = range.startOffset;\n if(\n range.startContainer &&\n range.startContainer == range.endContainer &&\n startOffset == range.endOffset\n ) {\n // * if focused on img, or caret has been set via placeCaretAtEnd\n const possibleChildrenFocusOffset = startOffset - 1;\n const childNodes = field.childNodes;\n if(range.startContainer === field && childNodes[possibleChildrenFocusOffset]) {\n selNode = childNodes[possibleChildrenFocusOffset];\n selOffset = 0;\n\n for(let i = 0; i < range.endOffset; ++i) {\n const node = childNodes[i];\n const value = node.nodeValue || (node as HTMLImageElement).alt;\n\n if(value) {\n selOffset += value.length;\n }\n }\n } else {\n selNode = range.startContainer;\n selOffset = startOffset;\n }\n }\n }\n\n return {node: selNode, offset: selOffset};\n}\n\nexport default function getRichValueWithCaret(\n field: HTMLElement | DocumentFragment,\n withEntities = true,\n withCaret = true\n) {\n const lines: string[] = [];\n const line: string[] = [];\n\n const {node: selNode, offset: selOffset} = !(field instanceof DocumentFragment) && withCaret && getCaretPos(field);\n\n const entities: MessageEntity[] = withEntities ? [] : undefined;\n const offset = {offset: 0};\n if(field instanceof DocumentFragment) {\n let curChild = field.firstChild as HTMLElement;\n while(curChild) {\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\n curChild = curChild.nextSibling as any;\n }\n } else {\n getRichElementValue(field, lines, line, selNode, selOffset, entities, offset);\n }\n\n if(line.length) {\n lines.push(line.join(''));\n }\n\n let value = lines.join('\\n');\n const caretPos = value.indexOf('\\x01');\n if(caretPos !== -1) {\n value = value.substr(0, caretPos) + value.substr(caretPos + 1);\n }\n value = value.replace(/\\u00A0/g, ' ');\n\n if(entities?.length) {\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\n /* const entity = entities[entities.length - 1];\n const length = value.length;\n const trimmedLength = value.trimRight().length;\n if(length !== trimmedLength) {\n entity.length -= length - trimmedLength;\n } */\n\n combineSameEntities(entities);\n sortEntities(entities);\n }\n\n return {value, entities, caretPos};\n}\n\nMOUNT_CLASS_TO.getRichValueWithCaret = getRichValueWithCaret;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getVisibleRect from './getVisibleRect';\n\nexport type ViewportSlicePart = {element: HTMLElement, rect: DOMRect, visibleRect: ReturnType}[];\n\nexport default function getViewportSlice({overflowElement, overflowRect, selector, extraSize, elements}: {\n overflowElement: HTMLElement,\n overflowRect?: DOMRectMinified,\n extraSize?: number,\n selector?: string,\n elements?: HTMLElement[]\n}) {\n // const perf = performance.now();\n overflowRect ??= overflowElement.getBoundingClientRect();\n elements ??= Array.from(overflowElement.querySelectorAll(selector));\n\n if(extraSize) {\n overflowRect = {\n top: overflowRect.top - extraSize,\n right: overflowRect.right + extraSize,\n bottom: overflowRect.bottom + extraSize,\n left: overflowRect.left - extraSize\n };\n }\n\n const invisibleTop: ViewportSlicePart = [],\n visible: typeof invisibleTop = [],\n invisibleBottom: typeof invisibleTop = [];\n let foundVisible = false;\n for(const element of elements) {\n const rect = element.getBoundingClientRect();\n const visibleRect = getVisibleRect(element, overflowElement, false, rect, overflowRect);\n\n const isVisible = !!visibleRect;\n let array: typeof invisibleTop;\n if(isVisible) {\n foundVisible = true;\n array = visible;\n } else if(foundVisible) {\n array = invisibleBottom;\n } else {\n array = invisibleTop;\n }\n\n array.push({\n element,\n rect,\n visibleRect\n });\n }\n\n // if(extraSize && visible.length) {\n // const maxTop = visible[0].rect.top;\n // const minTop = maxTop - extraSize;\n // const minBottom = visible[visible.length - 1].rect.bottom;\n // const maxBottom = minBottom + extraSize;\n\n // for(let length = invisibleTop.length, i = length - 1; i >= 0; --i) {\n // const element = invisibleTop[i];\n // if(element.rect.top >= minTop) {\n // invisibleTop.splice(i, 1);\n // visible.unshift(element);\n // }\n // }\n\n // for(let i = 0, length = invisibleBottom.length; i < length; ++i) {\n // const element = invisibleBottom[i];\n // if(element.rect.bottom <= maxBottom) {\n // invisibleBottom.splice(i--, 1);\n // --length;\n // visible.push(element);\n // }\n // }\n // }\n\n // console.log('getViewportSlice time:', performance.now() - perf);\n\n return {invisibleTop, visible, invisibleBottom};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport windowSize from '../windowSize';\n\nexport default function getVisibleRect(\n element: HTMLElement,\n overflowElement: HTMLElement,\n lookForSticky?: boolean,\n rect: DOMRectMinified = element.getBoundingClientRect(),\n overflowRect: DOMRectMinified = overflowElement.getBoundingClientRect()\n) {\n let {top: overflowTop, right: overflowRight, bottom: overflowBottom, left: overflowLeft} = overflowRect;\n\n // * respect sticky headers\n if(lookForSticky) {\n const sticky = overflowElement.querySelector('.sticky');\n if(sticky) {\n const stickyRect = sticky.getBoundingClientRect();\n overflowTop = stickyRect.bottom;\n }\n }\n\n if(rect.top >= overflowBottom ||\n rect.bottom <= overflowTop ||\n rect.right <= overflowLeft ||\n rect.left >= overflowRight) {\n return null;\n }\n\n const overflow = {\n top: false,\n right: false,\n bottom: false,\n left: false,\n vertical: 0 as 0 | 1 | 2,\n horizontal: 0 as 0 | 1 | 2\n };\n\n const windowWidth = windowSize.width;\n const windowHeight = windowSize.height;\n\n return {\n rect: {\n top: rect.top < overflowTop && overflowTop !== 0 ? (overflow.top = true, ++overflow.vertical, overflowTop) : rect.top,\n right: rect.right > overflowRight && overflowRight !== windowWidth ? (overflow.right = true, ++overflow.horizontal, overflowRight) : rect.right,\n bottom: rect.bottom > overflowBottom && overflowBottom !== windowHeight ? (overflow.bottom = true, ++overflow.vertical, overflowBottom) : rect.bottom,\n left: rect.left < overflowLeft && overflowLeft !== 0 ? (overflow.left = true, ++overflow.horizontal, overflowLeft) : rect.left\n },\n overflow\n };\n}\n\n(window as any).getVisibleRect = getVisibleRect;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SwipeHandler, {SwipeHandlerOptions} from '../../components/swipeHandler';\nimport cancelEvent from './cancelEvent';\nimport findUpClassName from './findUpClassName';\nimport isSwipingBackSafari from './isSwipingBackSafari';\n\nexport type SwipeHandlerHorizontalOptions = SwipeHandlerOptions & {\n // xThreshold?: number\n};\n\nexport default function handleHorizontalSwipe(options: SwipeHandlerHorizontalOptions) {\n let cancelY = false;\n return new SwipeHandler({\n ...options,\n verifyTouchTarget: (e) => {\n return !findUpClassName(e.target, 'progress-line') &&\n !isSwipingBackSafari(e as any as TouchEvent) &&\n (options.verifyTouchTarget ? options.verifyTouchTarget(e) : true);\n },\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1;\n yDiff *= -1;\n\n if(!cancelY && Math.abs(yDiff) > 20) {\n return true;\n }\n\n if(Math.abs(xDiff) > Math.abs(yDiff)) {\n cancelEvent(e as any as Event);\n cancelY = true;\n } else if(!cancelY && Math.abs(yDiff) > Math.abs(xDiff)/* || Math.abs(yDiff) > 20 */) {\n return true;\n }\n\n /* if(!cancelY && options.xThreshold !== undefined && xDiff >= options.xThreshold) {\n cancelY = true;\n } */\n\n return options.onSwipe(xDiff, yDiff, e);\n },\n onReset: () => {\n cancelY = false;\n options.onReset && options.onReset();\n },\n cancelEvent: false // cannot use cancelEvent on Safari iOS because scroll will be canceled too\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {cancelContextMenuOpening} from './attachContextMenuListener';\nimport handleHorizontalSwipe, {SwipeHandlerHorizontalOptions} from './handleHorizontalSwipe';\n\nexport default function handleTabSwipe(options: SwipeHandlerHorizontalOptions) {\n return handleHorizontalSwipe({\n ...options,\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1;\n yDiff *= -1;\n\n if(Math.abs(xDiff) > 50) {\n options.onSwipe(xDiff, yDiff, e);\n cancelContextMenuOpening();\n\n return true;\n }\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function htmlToDocumentFragment(html: string | DocumentFragment) {\n if(html instanceof DocumentFragment) return html;\n const template = document.createElement('template');\n html = html.trim(); // Never return a text node of whitespace as the result\n template.innerHTML = html;\n return template.content;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function htmlToSpan(html: string | DocumentFragment) {\n const span = document.createElement('span');\n if(typeof(html) === 'string') span.innerHTML = html;\n else span.append(html);\n return span;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\n if(!element) {\n return false;\n }\n\n parentNode = parentNode || document.body;\n if(element === parentNode) {\n return true;\n }\n return isInDOM(element.parentNode as HTMLElement, parentNode);\n} */\nexport default function isInDOM(element: Element): boolean {\n return element?.isConnected;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function isInputEmpty(element: HTMLElement) {\n if(element.isContentEditable || element.tagName !== 'INPUT') {\n /* const value = element.innerText;\n\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\n // return !getRichValueWithCaret(element, false, false).value.trim();\n return !element.textContent.trim() && !element.querySelector('.emoji, .custom-emoji, .custom-emoji-placeholder');\n } else {\n return !(element as HTMLInputElement).value.trim();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../lib/rootScope';\nimport {IS_MOBILE, IS_APPLE} from '../../environment/userAgent';\n\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\n /* if(e.ctrlKey || e.metaKey) {\n this.messageInput.innerHTML += '
';\n placeCaretAtEnd(this.message)\n return;\n } */\n\n if(rootScope.settings.sendShortcut === 'enter') {\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\n return;\n }\n\n return true;\n } else {\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\n return;\n }\n\n if(secondaryKey) {\n return true;\n }\n }\n }\n\n return false;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false, focus = true) {\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || (document.activeElement.tagName !== 'INPUT' && !(document.activeElement as HTMLElement).isContentEditable))) {\n return;\n }\n\n focus && el.focus();\n if(el instanceof HTMLInputElement) {\n const length = el.value.length;\n el.selectionStart = length;\n el.selectionEnd = length;\n } else {\n const range = document.createRange();\n range.selectNodeContents(el);\n range.collapse(false);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n }\n}\n\n(window as any).placeCaretAtEnd = placeCaretAtEnd;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport whichChild from './whichChild';\n\nexport default function positionElementByIndex(element: HTMLElement, container: HTMLElement, pos: number, prevPos?: number) {\n if(prevPos === undefined) {\n prevPos = element.parentElement === container ? whichChild(element) : -1;\n }\n\n if(prevPos === pos) {\n return false;\n } else if(prevPos !== -1 && prevPos < pos) { // was higher\n pos += 1;\n }\n\n if(!pos) {\n container.prepend(element);\n } else if(container.childElementCount > pos) {\n container.insertBefore(element, container.children[pos]);\n } else {\n container.append(element);\n }\n\n return true;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport onMediaLoad from '../onMediaLoad';\n\n// import { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\n\nexport const loadedURLs: {[url: string]: boolean} = {};\nconst set = (elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, url: string) => {\n if(elem instanceof HTMLImageElement || elem instanceof HTMLVideoElement) elem.src = url;\n else if(elem instanceof SVGImageElement) elem.setAttributeNS(null, 'href', url);\n else elem.style.backgroundImage = 'url(' + url + ')';\n};\n\n// проблема функции в том, что она не подходит для ссылок, пригодна только для blob'ов, потому что обычным ссылкам нужен 'load' каждый раз.\nexport default function renderImageFromUrl(\n elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement,\n url: string,\n callback?: () => void,\n useCache = true\n) {\n if(!url) {\n console.error('renderImageFromUrl: no url?', elem, url);\n callback?.();\n return;\n }\n\n const isVideo = elem instanceof HTMLVideoElement;\n if(((loadedURLs[url]/* && false */) && useCache) || isVideo) {\n if(elem) {\n set(elem, url);\n }\n\n if(callback) {\n if(isVideo) {\n onMediaLoad(elem).then(callback);\n } else {\n callback?.();\n }\n // callback && getHeavyAnimationPromise().then(() => callback());\n }\n } else {\n const isImage = elem instanceof HTMLImageElement;\n const loader = isImage ? elem as HTMLImageElement : new Image();\n // const loader = new Image();\n loader.src = url;\n // let perf = performance.now();\n\n const onLoad = () => {\n if(!isImage && elem) {\n set(elem, url);\n }\n\n loadedURLs[url] = true;\n // console.log('onload:', url, performance.now() - perf);\n // TODO: переделать прогрузки аватаров до начала анимации, иначе с этим ожиданием они неприятно появляются\n // callback && getHeavyAnimationPromise().then(() => callback());\n callback?.();\n\n loader.removeEventListener('error', onError);\n };\n\n const onError = (err: ErrorEvent) => {\n console.error('Render image from url failed:', err, url, loader);\n loader.removeEventListener('load', onLoad);\n callback?.();\n };\n\n loader.addEventListener('load', onLoad, {once: true});\n loader.addEventListener('error', onError, {once: true});\n }\n}\n\nexport function renderImageFromUrlPromise(elem: Parameters[0], url: string, useCache?: boolean) {\n return new Promise((resolve) => {\n renderImageFromUrl(elem, url, resolve, useCache);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport sequentialDom from '../sequentialDom';\nimport {renderImageFromUrlPromise} from './renderImageFromUrl';\n\nexport default function renderMediaWithFadeIn(\n container: HTMLElement,\n media: Parameters[0],\n url: string,\n needFadeIn: boolean,\n aspecter = container,\n thumbImage?: HTMLElement\n) {\n if(needFadeIn) {\n media.classList.add('fade-in');\n }\n\n const promise = renderImageFromUrlPromise(media, url).then(() => {\n return sequentialDom.mutateElement(container, () => {\n aspecter.append(media);\n\n if(needFadeIn) {\n media.addEventListener('animationend', () => {\n sequentialDom.mutate(() => {\n media.classList.remove('fade-in');\n thumbImage?.remove();\n });\n }, {once: true});\n } else {\n thumbImage?.remove();\n }\n });\n });\n\n // recordPromise(promise, 'renderImageWithFadeIn');\n\n return promise;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\n if(typeof(node) === 'string') {\n elem.innerHTML = node;\n return;\n }\n\n // * children.length doesn't count text nodes\n const firstChild = elem.firstChild;\n if(firstChild) {\n if(elem.lastChild === firstChild) {\n firstChild.replaceWith(node);\n } else {\n elem.textContent = '';\n elem.append(node);\n }\n } else {\n elem.append(node);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport clamp from '../number/clamp';\nimport findUpAsChild from './findUpAsChild';\nimport whichChild from './whichChild';\n\nexport default function compareNodes(node1: ChildNode, node1Offset: number, node2: ChildNode, node2Offset: number) {\n let diff: number;\n if(node1 === node2) {\n diff = node1Offset - node2Offset;\n } else if(node1.parentElement === node2.parentElement) {\n diff = whichChild(node1, true) - whichChild(node2, true);\n } else {\n const parents: HTMLElement[] = [];\n let parentElement = node1.parentElement;\n do {\n parents.push(parentElement);\n } while(parentElement = parentElement.parentElement);\n\n parentElement = node2.parentElement;\n do {\n if(parents.includes(parentElement)) {\n break;\n }\n } while(parentElement = parentElement.parentElement);\n\n const commonAncestorContainer = parentElement;\n // const range = document.createRange();\n // range.setStart(node1, 0);\n // range.setEnd(node2, node2.textContent.length);\n // const {commonAncestorContainer} = range;\n node1 = findUpAsChild(node1 as HTMLElement, commonAncestorContainer as HTMLElement);\n node2 = findUpAsChild(node2 as HTMLElement, commonAncestorContainer as HTMLElement);\n diff = whichChild(node1, true) - whichChild(node2, true);\n }\n\n return clamp(diff, -1, 1);\n}\n\n(window as any).compareNodes = compareNodes;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport {logger} from '../../lib/logger';\nimport {isCustomFillerNeededBySiblingNode} from '../../lib/richTextProcessor/wrapRichText';\nimport ListenerSetter from '../listenerSetter';\nimport BOM from '../string/bom';\nimport compareNodes from './compareNodes';\nimport getCaretPosNew from './getCaretPosNew';\nimport placeCaretAtEnd from './placeCaretAtEnd';\nimport whichChild from './whichChild';\n\nconst NOT_ONLY_BOMS_REG_EXP = new RegExp(`[^${BOM}]`);\n\nexport const USING_BOMS = false;\n\nexport default class RichInputHandler {\n private static INSTANCE: RichInputHandler;\n\n private listenerSetter: ListenerSetter;\n\n private lastNode: Node;\n private lastOffset: number;\n private savedRanges: WeakMap;\n\n private log: ReturnType;\n\n private inputCaptureCallbacks: Function[];\n\n constructor() {\n this.log = logger('RICH-INPUT');\n this.listenerSetter = new ListenerSetter();\n this.savedRanges = new WeakMap();\n\n this.listenerSetter.add(document)('selectionchange', this.saveSelectionOnChange);\n if(USING_BOMS) {\n this.listenerSetter.add(document)('focusout', this.onFocusOut);\n this.listenerSetter.add(document)('selectionchange', this.onSelectionChange);\n this.listenerSetter.add(document)('beforeinput', this.onBeforeInput);\n this.listenerSetter.add(document)('keydown', this.onKeyDown, {capture: true});\n\n if(IS_FIREFOX) {\n this.inputCaptureCallbacks = [];\n this.listenerSetter.add(document)('input', () => {\n this.inputCaptureCallbacks.forEach((callback) => callback());\n this.inputCaptureCallbacks.length = 0;\n }, {capture: true});\n }\n }\n }\n\n private get input() {\n const selection = document.getSelection();\n const {anchorNode: node} = selection;\n if(!node) return;\n return ((node as HTMLElement).closest ? node as HTMLElement : node.parentElement).closest('[contenteditable=\"true\"]');\n }\n\n private saveRangeForElement(element: HTMLElement) {\n if(element && (element.isContentEditable || element.tagName === 'INPUT')) {\n const selection = document.getSelection();\n if(selection.rangeCount) {\n this.savedRanges.set(element as HTMLElement, document.getSelection().getRangeAt(0));\n }\n }\n }\n\n private saveSelectionOnChange = (e: Event) => {\n const element = document.activeElement as HTMLElement; // e.target as HTMLElement;\n this.saveRangeForElement(element);\n };\n\n private onFocusOut = (e: FocusEvent) => {\n this.lastNode = this.lastOffset = undefined;\n };\n\n private findPreviousSmthIndex(input: HTMLElement, node: ChildNode, something?: NodeListOf) {\n // node = this.getFiller(node);\n // const childNodes = Array.from(node.parentElement.childNodes);\n // fillerIndex = childNodes.indexOf(node);\n // let smthIndex = -1;\n // for(let i = fillerIndex; i >= 0; --i) {\n // const node = childNodes[i];\n // if((node as HTMLElement)?.classList?.contains('input-something')) {\n // smthIndex = i;\n // break;\n // }\n // }\n // return smthIndex;\n\n const elements = Array.from(something ?? input.querySelectorAll('.input-something'));\n const index = elements.findIndex((element) => compareNodes(element, 0, node, 0) >= 0);\n return index === -1 ? elements.length - 1 : Math.max(0, index - 1);\n }\n\n private superMove(\n input: HTMLElement,\n caret: ReturnType,\n toLeft: boolean,\n fromSelectionChange: boolean\n ) {\n const {node, offset, move} = caret;\n const something = input.querySelectorAll('.input-something');\n const smthIndex = this.findPreviousSmthIndex(input, node, something);\n const r = document.createRange();\n r[toLeft ? 'setEnd' : 'setStart'](node, offset);\n\n if(fromSelectionChange) {\n move(toLeft);\n }\n\n const c = this.getCaretPosN();\n if(c.node?.nodeValue === BOM && (!fromSelectionChange || node === this.lastNode)) {\n const idx = this.findPreviousSmthIndex(input, c.node, something);\n\n let moved = !fromSelectionChange;\n\n do {\n const c = this.getCaretPosN();\n const idxidx = this.findPreviousSmthIndex(input, c.node, something);\n r[toLeft ? 'setStart' : 'setEnd'](c.node, c.offset);\n const rangeString = r.toString();\n const onlyBOMs = !NOT_ONLY_BOMS_REG_EXP.test(rangeString);\n this.log('test cursor', rangeString, onlyBOMs, idx, idxidx);\n if(\n onlyBOMs &&\n c.node?.nodeValue === BOM &&\n idxidx === idx &&\n // (idxidx > 1 || c.offset) &&\n // (idxidx < (getFiller(c.node).parentElement.childNodes.length - 2) || c.offset < BOM.length)\n (idxidx || c.offset) &&\n (idxidx < (something.length - 1) || c.offset < BOM.length)\n ) {\n move(toLeft);\n moved = true;\n } else if(!moved) {\n break;\n } else {\n if((!this.getFiller(node as HTMLElement).classList.contains('input-filler-text') && idx !== smthIndex) || c.offset === BOM.length) {\n move(!toLeft);\n }\n\n break;\n }\n } while(true);\n }\n }\n\n private onSelectionChange = (e: Event) => {\n const {input} = this;\n if(!input) {\n this.setSelectionClassName(document.getSelection());\n return;\n }\n\n // return;\n\n // this.log('selectionchange', document.getSelection(), document.getSelection().rangeCount && document.getSelection().getRangeAt(0), getCaretPosN());\n // let {node, offset} = getCaretPos(this.messageInput);\n\n let caret = this.getCaretPosN();\n do {\n const {node, offset, selection, move} = caret;\n\n const nodeValue = node?.nodeValue;\n // if(!nodeValue?.includes(BOM)) {\n if(nodeValue !== BOM || !this.lastNode) {\n break;\n }\n\n // node = getFiller(node);\n\n // const childIndex = whichChild(getFiller(node), true);\n // let toLeft: boolean;\n // // if(node === lastNode) toLeft = lastOffset >= offset;\n // if(node === lastNode) toLeft = lastOffset > offset;\n // else {\n // // toLeft = whichChild(getFiller(lastNode)) > childIndex;\n // toLeft = (lastNode.nodeValue === BOM ? whichChild(getFiller(lastNode), true) : whichChild(findUpAsChild(lastNode as any, getFiller(node).parentElement), true)) > childIndex;\n // }\n\n const toLeft = compareNodes(node, offset, this.lastNode as ChildNode, this.lastOffset) < 0;\n\n // const childNodes = Array.from(node.parentElement.childNodes);\n // if(toLeft) {\n // for(let i = childIndex; i >= 0; --i) {\n // const sibling = childNodes[i];\n // const {textContent} = sibling;\n // for()\n // }\n // }\n\n // {\n // if(toLeft === undefined) {\n // return;\n // }\n\n // const selection = window.getSelection();\n // selection.modify(selection.isCollapsed ? 'move' : 'extend', toLeft ? 'backward' : 'forward', 'character');\n // return;\n // }\n\n // const parent = getFiller(node);\n if(toLeft !== undefined) {\n // let newNode = toLeft ? parent.previousSibling : parent.nextSibling;\n if(selection.isCollapsed) {\n this.superMove(input, caret, toLeft, true);\n\n // if(offset === BOM.length) {\n // newNode = toLeft ? newNode.nextSibling.nextSibling : parent.previousSibling.previousSibling;\n // }\n\n // setCaretAt(newNode);\n } else {\n selection.modify(selection.isCollapsed ? 'move' : 'extend', toLeft ? 'backward' : 'forward', 'character');\n // const range = selection.getRangeAt(0);\n\n // if(toLeft) {\n // newNode = parent.previousSibling.previousSibling.firstChild;\n // const value = newNode.nodeValue;\n // range.setStart(newNode, value?.length);\n // } else {\n // newNode = parent.nextSibling.nextSibling.firstChild;\n // range.setEnd(newNode, 0);\n // }\n }\n }\n\n this.log('selectionchange',\n node,\n offset,\n this.lastNode,\n this.lastOffset,\n node === this.lastNode,\n whichChild(this.getFiller(node)),\n whichChild(this.getFiller(this.lastNode)),\n toLeft,\n selection,\n document.getSelection(),\n document.getSelection().getRangeAt(0),\n node?.parentNode,\n this.lastNode?.parentNode\n );\n\n caret = this.getCaretPosN();\n this.lastNode = node;\n this.lastOffset = offset;\n\n break;\n\n // if(findPreviousSmthIndex(caret.node) !== smthIndex) {\n // break;\n // }\n } while(true);\n\n this.lastNode = this.lastOffset = undefined;\n\n // if(offset === BOM.length) {\n // setCaretAt(parent);\n // } else {\n // setCaretAt(parent.nextSibling);\n // }\n\n this.setSelectionClassName(caret.selection, input);\n };\n\n public restoreSavedRange(input: HTMLElement) {\n const range = this.getSavedRange(input);\n if(!range) {\n return false;\n }\n\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n return true;\n }\n\n public getSavedRange(input: HTMLElement) {\n return this.savedRanges.get(input);\n }\n\n public makeFocused(input: HTMLElement) {\n if(document.activeElement !== input && !this.restoreSavedRange(input)) {\n placeCaretAtEnd(input, false, false);\n }\n }\n\n private fixInsertedLineBreaks(input: HTMLElement) {\n input.querySelectorAll('br').forEach((br) => {\n br.classList.add('br-not-br');\n });\n }\n\n private fixBuggedCaret() {\n const selection = document.getSelection();\n const range = selection.getRangeAt(0);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n public onBeforeInput = (e: Pick) => {\n const {input, log} = this;\n if(!input) {\n return;\n }\n\n const addInputCallback = this.addInputCallback.bind(this, input);\n\n const caretPos = this.getCaretPosN();\n let {node, offset, selection, move} = caretPos;\n log('beforeinput', e, node, offset, selection, caretPos);\n this.lastNode = this.lastOffset = undefined;\n\n if(e.inputType.startsWith('delete')) { // delete current BOM\n addInputCallback(() => {\n this.processEmptiedFillers(input);\n this.removeExtraBOMs(input);\n this.fixInsertedLineBreaks(input);\n });\n\n if(node?.nodeValue === BOM && selection.isCollapsed && e.inputType.includes('deleteContent')) {\n const toLeft = e.inputType.includes('Backward');\n const moveFirst = (offset === BOM.length && toLeft) || (!offset && !toLeft);\n this.superMove(input, caretPos, toLeft, moveFirst);\n // if((offset === BOM.length && toLeft) || (!offset && !toLeft)) {\n // move(toLeft);\n // }\n\n // addInputCallback(() => {\n // removePossibleBOMSiblingsByNode(getFiller(node));\n // });\n\n // if(node.parentNode.childNodes.length === 1) {\n // (node.parentNode as HTMLElement).remove();\n // move(e.inputType.includes('Backward') ? false : true);\n // } else {\n // move(e.inputType.includes('Backward') ? true : false);\n // addInputCallback(() => {\n // move(e.inputType.includes('Backward') ? false : true);\n // });\n // }\n\n // for(let i = 0, length = BOM.length + (direction === 'backward' ? offset : BOM.length - offset); i < length; ++i) {\n // selection.modify('extend', direction, 'character');\n // }\n\n // selection.modify('extend', direction, 'character');\n // selection.modify('extend', direction, 'character');\n\n // selection.deleteFromDocument();\n // e.preventDefault();\n } else {\n // const filler = getFiller(node);\n // if(filler?.classList?.contains('input-filler-text')) {\n // const {previousSibling, nextSibling} = filler;\n // addInputCallback(() => {\n // if(!filler.isConnected) {\n // removePossibleBOMSiblings(previousSibling, nextSibling);\n // }\n // // removeExtraBOMs();\n // // processEmptiedFillers();\n // });\n // }\n // addInputCallback(() => {\n // this.fixInsertedLineBreaks(input);\n // });\n }\n } else if(e.inputType.startsWith('insert')) { // clear current BOM\n if((node as HTMLElement)?.classList?.contains('input-something')/* || (node.textContent === BOM && offset === BOM.length) */) {\n node = node.previousSibling.firstChild;\n const range = selection.getRangeAt(0);\n range.setStart(node, 0);\n range.setEnd(node, 0);\n range.collapse(true);\n // selection.modify('move', 'backward', 'character');\n\n const c = this.getCaretPosN();\n node = c.node;\n selection = c.selection;\n offset = c.offset;\n }\n if(node && node.textContent === BOM && offset === BOM.length) {\n // const range = selection.getRangeAt(0);\n // range.setStart(node, 0);\n // range.setEnd(node, 0);\n // range.collapse(true);\n selection.modify('move', 'backward', 'character');\n\n const c = this.getCaretPosN();\n node = c.node;\n selection = c.selection;\n offset = c.offset;\n }\n // if(node && node.textContent === BOM && offset === 0) {\n // selection.modify('move', 'forward', 'character');\n // offset = BOM.length;\n // }\n\n if(e.inputType === 'insertLineBreak' || true) {\n // const appendix = 'X';\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // selection.modify('move', 'forward', 'character');\n // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n /* if(node?.nodeValue === BOM) */ {\n // const parent = node.parentElement;\n // parent.contentEditable = 'false';\n // addInputCallback(() => {\n // parent.contentEditable = 'inherit';\n // });\n // node.parentElement.remove();\n\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // // selection.modify('move', 'forward', 'character');\n // // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n // fix case when focused somehow on span instead of text node\n if(node && node.nodeType === node.ELEMENT_NODE) {\n node = node.firstChild;\n log.warn('fixing focus on span');\n }\n\n const isBOM = node?.nodeValue === BOM;\n log('inserting line break', isBOM, node, `\"${node?.nodeValue}\"`, node?.parentElement ? Array.from(node.parentElement.childNodes).slice() : []);\n if(isBOM) {\n // (node as ChildNode).replaceWith(this.messageInput.querySelector('.lol'));\n\n const parentElement = node.parentElement;\n parentElement.classList.replace('input-filler', 'input-filler-text');\n const childNodesLength = parentElement.childNodes.length;\n addInputCallback(() => {\n const newChildNodesLength = parentElement.childNodes.length;\n if(newChildNodesLength > 1/* && newChildNodesLength !== childNodesLength */) {\n log('inserting line break, remove');\n node = Array.from(parentElement.childNodes).find((node) => node.nodeValue === BOM);\n (parentElement as any).t = node;\n // node?.remove();\n\n // const n = parentElement.firstChild;\n // const range = selection.getRangeAt(0);\n // range.setStart(n, n.nodeValue.length);\n // range.setEnd(n, n.nodeValue.length);\n } else if(node.nodeValue !== BOM) {\n log('inserting line break, deleteData');\n (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // node = document.createTextNode(BOM);\n }\n\n this.fixInsertedLineBreaks(input);\n // (parentElement as any).t = node;\n // node.remove();\n });\n // addInputCallback(() => {\n // node.parentElement.classList.replace('input-filler', 'input-filler3');\n // const s = document.createElement('span');\n // s.style.display = 'none';\n // node.replaceWith(s);\n // s.prepend(node);\n // });\n } else if(e.inputType === 'insertLineBreak') {\n addInputCallback(() => {\n this.fixInsertedLineBreaks(input);\n });\n // const range = selection.getRangeAt(0);\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n\n // addInputCallback(() => {\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'false';\n // });\n\n // selection.removeAllRanges();\n // selection.addRange(range);\n // }, false);\n }/* else if(node &&\n node.nodeType === node.TEXT_NODE &&\n node.nodeValue.length === offset) {\n\n } */\n\n // if(e.inputType === 'insertLineBreak') {\n // e.preventDefault();\n // document.execCommand('insertHTML', false, '\\n');\n\n // this.messageInputField.simulateInputEvent();\n // }\n\n // node.parentElement.replaceWith(node);\n // selection.removeAllRanges();\n // const range = new Range();\n // range.setStart(node, 0);\n // range.setEnd(node, node.nodeValue.length);\n // selection.addRange(range);\n // node.parentElement.classList.remove('input-filler');\n // node.parentElement\n }\n\n // document.execCommand('insertHTML', false, '\\n');\n // e.preventDefault();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // if(node?.nodeValue === BOM) {\n // addInputCallback(() => {\n // node.remove();\n // });\n // }\n // this.messageInputField.simulateInputEvent();\n\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n // addInputCallback(() => {\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'false';\n // });\n // });\n return;\n }\n\n if(node?.nodeValue === BOM) {\n // node.nodeValue = ''; // ! will move cursor forward\n // addInputCallback(() => {\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // });\n\n if(e.inputType === 'insertLineBreak') {\n if(offset === BOM.length) {\n selection.modify('move', 'backward', 'character');\n }\n\n // if(offset !== BOM.length) {\n // selection.modify('move', 'forward', 'character');\n // }\n\n addInputCallback(() => {\n node.remove();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // selection.modify('move', 'forward', 'character');\n\n setTimeout(() => {\n selection.modify('move', 'forward', 'character');\n }, 0);\n });\n }\n\n // node.parentElement.replaceWith(node);\n\n // node.parentElement.replaceWith(node);\n if(e.inputType === 'insertLineBreak') {\n // const previousParentSibling = node.parentNode.previousSibling;\n // addInputCallback(() => {\n // if(previousParentSibling.nextSibling.nodeValue === '\\n') {\n // previousParentSibling.nextSibling.remove();\n\n // setTimeout(() => {\n // // selection.modify('move', 'forward', 'character');\n // // selection.modify('move', 'forward', 'character');\n // }, 0);\n // } else {\n // previousParentSibling.nextSibling.nodeValue = previousParentSibling.nextSibling.nodeValue.replace('\\n\\n', '\\n');\n // }\n // });\n } else {\n // if(node.parentElement !== this.messageInput) {\n // node.parentElement.replaceWith(node);\n // }\n\n // setTimeout(() => {\n // this.log(JSON.stringify(node.parentElement.innerHTML));\n // node.nodeValue = node.nodeValue.replace(BOM, '');\n // // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // this.log(JSON.stringify(node.parentElement.innerHTML));\n // }, 1000);\n\n addInputCallback(() => {\n (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n if(!node.nodeValue) {\n node.remove();\n }\n\n // selection.modify('move', 'forward', 'character');\n });\n }\n\n if(selection.isCollapsed && false) {\n node.parentElement.replaceWith(node);\n // const textNode = document.createTextNode(BOM);\n // (node.parentNode as any as ChildNode).after(textNode);\n // setCaretAt(textNode.nextSibling);\n // selection.modify('move', 'forward', 'character');\n node.remove();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // selection.modify('move', 'forward', 'character');\n // selection.collapseToEnd();\n\n // addInputCallback(() => {\n // (textNode as CharacterData).deleteData(textNode.nodeValue.indexOf(BOM), BOM.length);\n // node.parentElement.remove();\n // });\n }\n } else if(e.inputType === 'insertLineBreak' &&\n node &&\n node.nodeType === node.TEXT_NODE &&\n node.nodeValue.length === offset) {\n log('inserting line break');\n // const appendix = '\\x01';\n\n input.querySelectorAll('.input-something').forEach((el) => {\n el.contentEditable = 'inherit';\n });\n addInputCallback(() => {\n input.querySelectorAll('.input-something').forEach((el) => {\n el.contentEditable = 'false';\n });\n });\n\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n // const offset = node.nodeValue.length;\n // (node as CharacterData).insertData(offset, appendix);\n // addInputCallback(() => {\n // selection.modify('move', 'forward', 'character');\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(appendix), appendix.length);\n // if(!node.nodeValue) {\n // node.remove();\n // }\n // });\n }\n } else if(e.inputType === 'historyUndo') { // have to remove extra BOMs\n addInputCallback(() => {\n this.processFilledFillers(input);\n this.processEmptiedFillers(input);\n this.removeExtraBOMs(input);\n this.removeEmptyTextNodes(input);\n\n // ! lol what, caret will be at the wrong position, have to set it to the same\n this.fixBuggedCaret();\n\n // lol\n // this.messageInput.querySelectorAll('.has-text').forEach((el) => {\n // if(el.textContent === BOM) {\n // el.firstElementChild.replaceWith(el.firstElementChild.firstChild);\n // el.classList.replace('input-filler3', 'input-filler');\n // }\n // });\n });\n } else if(e.inputType === 'historyRedo') {\n // if(node?.nodeValue === BOM && offset === BOM.length) {\n // selection.modify('move', 'backward', 'character');\n // }\n\n addInputCallback(() => {\n this.processFilledFillers(input);\n this.processEmptiedFillers(input);\n\n // fix contenteditable attribute\n input.querySelectorAll('.input-something:not([contenteditable])').forEach((el) => {\n el.contentEditable = 'false';\n });\n\n this.removeExtraBOMs(input);\n\n // ! lol what, caret will be at the wrong position, have to set it to the same\n this.fixBuggedCaret();\n });\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n\n // // have to ignore line up and down\n if(key === 'ArrowDown' || key === 'ArrowUp') {\n this.lastNode = this.lastOffset = undefined;\n } else {\n const {node, offset} = this.getCaretPosN();\n this.lastNode = node/* getFiller(node) */, this.lastOffset = offset;\n if(this.lastNode === this.input) {\n this.lastNode = this.lastOffset = undefined;\n }\n }\n\n this.log('keydown', this.lastNode, this.lastNode?.parentNode, this.lastOffset, this.getCaretPosN(), e);\n };\n\n private addInputCallback(input: HTMLElement, callback: () => void, capture = true) {\n const newCallback = () => {\n this.log('input modify callback');\n callback();\n };\n\n if(capture && IS_FIREFOX) this.inputCaptureCallbacks.push(newCallback);\n else this.listenerSetter.add(input)('input', newCallback, {once: true, capture});\n }\n\n public removeExtraBOMs(input: HTMLElement) {\n const c = (sibling: ChildNode) => {\n return (sibling as HTMLElement)?.classList?.contains('input-something');\n };\n\n input.querySelectorAll('.input-filler').forEach((el) => {\n const {previousSibling, nextSibling} = el;\n let needed = false;\n\n // if(!(previousSibling as HTMLElement)?.classList?.contains('input-filler') && isCustomFillerNeededBySiblingNode(previousSibling)) {\n if(!(nextSibling as HTMLElement)?.classList?.contains('input-filler') && isCustomFillerNeededBySiblingNode(nextSibling)) {\n needed = c(previousSibling) || c(nextSibling);\n }\n\n if(!needed) {\n this.log.warn('removing empty bom node', el);\n el.remove();\n }\n });\n }\n\n private getFiller(node: Node) {\n return node && node.nodeType === node.TEXT_NODE && node.parentElement !== this.input ? node.parentElement : node as HTMLElement;\n }\n\n private getCaretPosN() {\n const ret = getCaretPosNew(this.input);\n // const {node} = ret;\n // if((node as HTMLElement)?.classList?.contains('input-something')) {\n // ret.node = node.previousSibling;\n // ret.offset = ret.node.textContent.length;\n // }\n\n return {...ret, move: this.move.bind(this, ret.selection)};\n }\n\n private removeEmptyTextNodes(input: HTMLElement) {\n const {log} = this;\n // let i = -1;\n // remove empty text nodes\n const treeWalker = document.createTreeWalker(\n input,\n NodeFilter.SHOW_TEXT,\n {acceptNode: (node) => node.parentElement === input && !node.nodeValue/* && !++i */ ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT}\n );\n\n let textNode: Text;\n while(textNode = treeWalker.nextNode() as Text) {\n log.warn('removing empty text node', textNode);\n textNode.remove();\n }\n }\n\n private removePossibleBOMSiblings(previousSibling: ChildNode, nextSibling: ChildNode) {\n [previousSibling, nextSibling].forEach((sibling) => {\n if((sibling as HTMLElement)?.classList?.contains('input-filler')) {\n sibling.remove();\n }\n });\n }\n\n private removePossibleBOMSiblingsByNode(node: ChildNode) {\n const {previousSibling, nextSibling} = node;\n this.removePossibleBOMSiblings(previousSibling, nextSibling);\n };\n\n private processEmptiedFillers(input: HTMLElement) {\n input.querySelectorAll('.input-filler-text').forEach((el) => {\n this.removeExtraBOMs(el);\n\n let cleanSiblings = true;\n if(!el.textContent) {\n el.classList.replace('input-filler-text', 'input-filler');\n\n const textNode = Array.from(el.childNodes).find((node) => node.nodeType === node.TEXT_NODE);\n if(textNode) {\n (textNode as CharacterData).insertData(0, BOM);\n } else if(((el as any).t as ChildNode)?.nodeValue) {\n el.append((el as any).t);\n } else {\n el.append(document.createTextNode(BOM));\n }\n } else if(!NOT_ONLY_BOMS_REG_EXP.test(el.textContent) && !el.querySelector('.input-something')) {\n el.classList.replace('input-filler-text', 'input-filler');\n } else {\n cleanSiblings = false;\n }\n\n if(cleanSiblings) {\n this.removePossibleBOMSiblingsByNode(el);\n }\n });\n }\n\n private processFilledFillers(input: HTMLElement) {\n // remove the BOM when changing to text\n input.querySelectorAll('.input-filler').forEach((el) => {\n if(el.textContent !== BOM) {\n el.classList.replace('input-filler', 'input-filler-text');\n const t = (el as any).t as ChildNode;\n const bomNode = Array.from(el.childNodes).find((node) => node.nodeType === node.TEXT_NODE && node.nodeValue.includes(BOM));\n if(bomNode && !t?.nodeValue) {\n const idx = bomNode.nodeValue.indexOf(BOM);\n if(idx !== -1) {\n (bomNode as CharacterData).deleteData(idx, BOM.length);\n }\n }\n\n // t?.remove();\n }\n });\n }\n\n private setSelectionClassName(selection: Selection, input?: HTMLElement) {\n // Array.from(this.messageInput.querySelectorAll('.selection')).forEach((element) => {\n // element.classList.remove('selection');\n // });\n\n if(selection.rangeCount) {\n const range = selection.getRangeAt(0);\n\n if(input) {\n Array.from(input.querySelectorAll('.input-selectable')).forEach((element) => {\n element.classList.toggle('selection', !range.collapsed && range.intersectsNode(element));\n });\n } else {\n Array.from(document.querySelectorAll('.input-selectable.selection')).forEach((element) => element.classList.remove('selection'));\n }\n }\n }\n\n private move(selection: Selection, left: boolean) {\n const {focusNode: focusNodeBefore, focusOffset: focusOffsetBefore} = selection;\n selection.modify('extend', left ? 'backward' : 'forward', 'character');\n // if(offset === nodeValue.length) {\n // selection.modify('extend', !left ? 'backward' : 'forward', 'character');\n // }\n if(left) selection.collapseToStart();\n else selection.collapseToEnd();\n const {focusNode: focusNodeAfter, focusOffset: focusOffsetAfter} = selection;\n this.log(\n 'moving cursor',\n left,\n focusNodeBefore,\n focusNodeBefore.nodeType === focusNodeBefore.ELEMENT_NODE ? focusNodeBefore : focusNodeBefore.parentElement,\n focusOffsetBefore,\n focusNodeAfter,\n focusNodeAfter.nodeType === focusNodeAfter.ELEMENT_NODE ? focusNodeAfter : focusNodeAfter.parentElement,\n focusOffsetAfter\n );\n }\n\n public prepareApplyingMarkdown() {\n const {input} = this;\n\n // do not wrap fillers into spans\n const fillers = input.querySelectorAll('.input-filler');\n // fillers.forEach((el) => {\n // el.contentEditable = 'false';\n // });\n\n const smths = input.querySelectorAll('.input-something');\n smths.forEach((el) => {\n el.contentEditable = 'inherit';\n });\n\n return () => {\n fillers.forEach((el) => {\n el.contentEditable = 'inherit';\n });\n\n smths.forEach((el) => {\n el.contentEditable = 'false';\n });\n\n this.removeExtraBOMs(input);\n };\n }\n\n public static getInstance() {\n return this.INSTANCE ??= new RichInputHandler();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import I18n from '../../lib/langPack';\n\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment | Element) {\n setDirection(elem);\n if(typeof(html) === 'string') {\n if(!html) elem.replaceChildren();\n else elem.innerHTML = html;\n } else {\n elem.replaceChildren(html);\n }\n}\n\nexport function setDirection(elem: Element) {\n // if(!I18n.isRTL) {\n elem.setAttribute('dir', 'auto');\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {ScrollableBase} from '../../components/scrollable';\nimport SwipeHandler from '../../components/swipeHandler';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport rootScope from '../../lib/rootScope';\nimport {Middleware} from '../middleware';\nimport clamp from '../number/clamp';\nimport safeAssign from '../object/safeAssign';\nimport pause from '../schedulers/pause';\nimport cancelEvent from './cancelEvent';\nimport {attachClickEvent} from './clickEvent';\nimport findUpAsChild from './findUpAsChild';\nimport positionElementByIndex from './positionElementByIndex';\nimport whichChild from './whichChild';\n\nexport default class Sortable {\n private element: HTMLElement;\n private elementRect: DOMRect;\n private containerRect: DOMRect;\n private scrollableRect: DOMRect;\n private minY: number;\n private maxY: number;\n private siblings: HTMLElement[];\n private swipeHandler: SwipeHandler;\n private startScrollPos: number;\n private addScrollPos: number;\n\n private list: HTMLElement;\n private middleware: Middleware;\n private onSort: (prevIdx: number, newIdx: number) => void;\n private scrollable: ScrollableBase;\n\n constructor(options: {\n list: HTMLElement,\n middleware: Middleware,\n onSort: Sortable['onSort'],\n scrollable?: Sortable['scrollable']\n }) {\n safeAssign(this, options);\n\n this.swipeHandler = new SwipeHandler({\n element: this.list,\n onSwipe: this.onSwipe,\n verifyTouchTarget: this.verifyTouchTarget,\n onStart: this.onStart,\n onReset: this.onReset,\n setCursorTo: document.body,\n middleware: this.middleware,\n withDelay: true\n });\n }\n\n private onSwipe = (xDiff: number, yDiff: number) => {\n yDiff = clamp(yDiff, this.minY, this.maxY);\n this.element.style.transform = `translateY(${yDiff}px)`;\n const count = Math.round(Math.abs(yDiff) / this.elementRect.height);\n const lastSiblings = this.siblings;\n this.siblings = [];\n const property = yDiff < 0 ? 'previousElementSibling' : 'nextElementSibling';\n let sibling = this.element[property] as HTMLElement;\n for(let i = 0; i < count; ++i) {\n if(this.getSortableTarget(sibling)) {\n this.siblings.push(sibling);\n sibling = sibling[property] as HTMLElement;\n } else {\n break;\n }\n }\n\n (lastSiblings || []).forEach((sibling) => {\n if(!this.siblings.includes(sibling)) {\n sibling.style.transform = '';\n }\n });\n\n this.siblings.forEach((sibling) => {\n const y = this.elementRect.height * (yDiff < 0 ? 1 : -1);\n sibling.style.transform = `translateY(${y}px)`;\n });\n\n if(this.scrollableRect) {\n const diff = yDiff;\n const toEnd = diff > 0;\n const elementEndPos = toEnd ? this.elementRect.bottom : this.elementRect.top;\n const clientY = elementEndPos + diff - this.addScrollPos;\n // console.log(clientY, this.scrollableRect.top, elementEndPos, diff, this.addScrollPos, toEnd);\n let change = 2;\n if((clientY + (toEnd ? 0 : this.elementRect.height)) >= this.scrollableRect.bottom/* && diff < this.maxY */) {\n\n } else if((clientY - (toEnd ? this.elementRect.height : 0)) <= this.scrollableRect.top/* && diff > this.minY */) {\n change *= -1;\n } else {\n change = undefined;\n }\n\n if(change !== undefined) {\n this.scrollable.container[this.scrollable.scrollProperty] += change;\n }\n }\n };\n\n private verifyTouchTarget = (e: {target: EventTarget}) => {\n if(this.list.classList.contains('is-reordering')) {\n return false;\n }\n\n this.element = this.getSortableTarget(e.target as HTMLElement);\n return !!this.element/* && pause(150).then(() => true) */;\n };\n\n private onScroll = () => {\n const scrollPos = this.scrollable.container[this.scrollable.scrollProperty];\n const diff = this.addScrollPos = scrollPos - this.startScrollPos;\n const isVertical = this.scrollable.scrollProperty === 'scrollTop';\n this.swipeHandler.add(isVertical ? 0 : diff, isVertical ? diff : 0);\n };\n\n private onStart = () => {\n this.list.classList.add('is-reordering');\n this.element.classList.add('is-dragging', 'no-transition');\n this.swipeHandler.setCursor('grabbing');\n this.elementRect = this.element.getBoundingClientRect();\n this.containerRect = this.list.getBoundingClientRect();\n\n this.minY = this.containerRect.top - this.elementRect.top;\n this.maxY = this.containerRect.bottom - this.elementRect.bottom;\n this.addScrollPos = 0;\n\n if(this.scrollable) {\n this.startScrollPos = this.scrollable.container[this.scrollable.scrollProperty];\n this.scrollableRect = this.scrollable.container.getBoundingClientRect();\n this.scrollable.container.addEventListener('scroll', this.onScroll);\n }\n };\n\n private onReset = async() => {\n const length = this.siblings.length;\n const move = length && length * (this.siblings[0].previousElementSibling === this.element ? 1 : -1);\n const idx = whichChild(this.element);\n const newIdx = idx + move;\n\n this.element.classList.remove('no-transition');\n this.element.style.transform = move ? `translateY(${move * this.elementRect.height}px)` : '';\n this.swipeHandler.setCursor('');\n\n if(this.scrollable) {\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n attachClickEvent(document.body, cancelEvent, {capture: true, once: true});\n }\n\n if(rootScope.settings.animationsEnabled) {\n await pause(250);\n }\n\n this.list.classList.remove('is-reordering');\n this.element.classList.remove('is-dragging');\n positionElementByIndex(this.element, this.list, newIdx, idx);\n [this.element, ...this.siblings].forEach((element) => {\n element.style.transform = '';\n });\n\n this.element =\n this.siblings =\n this.elementRect =\n this.containerRect =\n this.minY =\n this.maxY =\n this.startScrollPos =\n this.addScrollPos =\n undefined;\n\n // cancelClick = true;\n\n if(!move) {\n return;\n }\n\n this.onSort(idx, newIdx);\n };\n\n private getSortableTarget(target: HTMLElement) {\n if(!target) {\n return;\n }\n\n let child = findUpAsChild(target as HTMLElement, this.list);\n if(child && child.classList.contains('cant-sort')) {\n child = undefined;\n }\n\n return child;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\n if(disable) {\n elements.forEach((el) => el.setAttribute('disabled', 'true'));\n } else {\n elements.forEach((el) => el.removeAttribute('disabled'));\n }\n\n return () => toggleDisability(elements, !disable);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function whichChild(elem: Node, countNonElements?: boolean) {\n if(!elem.parentNode) {\n return -1;\n }\n\n if(countNonElements) {\n return Array.from(elem.parentNode.childNodes).indexOf(elem as ChildNode);\n }\n\n let i = 0;\n // @ts-ignore\n while((elem = elem.previousElementSibling) !== null) ++i;\n return i;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent, detachClickEvent} from './dom/clickEvent';\nimport findUpAsChild from './dom/findUpAsChild';\nimport EventListenerBase from './eventListenerBase';\nimport ListenerSetter from './listenerSetter';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport safeAssign from './object/safeAssign';\nimport appNavigationController, {NavigationItem} from '../components/appNavigationController';\nimport findUpClassName from './dom/findUpClassName';\nimport rootScope from '../lib/rootScope';\n\nconst KEEP_OPEN = false;\nconst TOGGLE_TIMEOUT = 200;\nconst ANIMATION_DURATION = 200;\n\nexport type IgnoreMouseOutType = 'click' | 'menu' | 'popup';\ntype DropdownHoverTimeoutType = 'toggle' | 'done';\n\nexport default class DropdownHover extends EventListenerBase<{\n open: () => Promise | void,\n openAfterLayout: () => void,\n opened: () => any,\n close: () => any,\n closed: () => any\n}> {\n protected element: HTMLElement;\n protected forceClose: boolean;\n protected inited: boolean;\n protected ignoreMouseOut: Set;\n protected ignoreButtons: Set;\n protected navigationItem: NavigationItem;\n protected ignoreOutClickClassName: string;\n protected timeouts: {[type in DropdownHoverTimeoutType]?: number};\n\n constructor(options: {\n element: DropdownHover['element'],\n ignoreOutClickClassName?: string\n }) {\n super(false);\n safeAssign(this, options);\n this.forceClose = false;\n this.inited = false;\n this.ignoreMouseOut = new Set();\n this.ignoreButtons = new Set();\n this.timeouts = {};\n }\n\n public attachButtonListener(\n button: HTMLElement,\n listenerSetter: ListenerSetter\n ) {\n let firstTime = true;\n if(IS_TOUCH_SUPPORTED) {\n attachClickEvent(button, () => {\n if(firstTime) {\n firstTime = false;\n this.toggle(true);\n } else {\n this.toggle();\n }\n }, {listenerSetter});\n } else {\n listenerSetter.add(button)('mouseover', (e) => {\n if(firstTime) {\n listenerSetter.add(button)('mouseout', (e) => {\n this.clearTimeout('toggle');\n this.onMouseOut(e);\n });\n firstTime = false;\n }\n\n this.setTimeout('toggle', () => {\n this.toggle(true);\n }, TOGGLE_TIMEOUT);\n });\n\n attachClickEvent(button, () => {\n const type: IgnoreMouseOutType = 'click';\n const ignore = !this.ignoreMouseOut.has(type);\n\n if(ignore && !this.ignoreMouseOut.size) {\n this.ignoreButtons.add(button);\n setTimeout(() => {\n attachClickEvent(window, this.onClickOut, {capture: true});\n }, 0);\n }\n\n this.setIgnoreMouseOut(type, ignore);\n this.toggle(ignore);\n }, {listenerSetter});\n }\n }\n\n protected onClickOut = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if(\n !findUpAsChild(target, this.element) &&\n !Array.from(this.ignoreButtons).some((button) => findUpAsChild(target, button) || target === button) &&\n this.ignoreMouseOut.size <= 1 &&\n (!this.ignoreOutClickClassName || !findUpClassName(target, this.ignoreOutClickClassName))\n ) {\n this.toggle(false);\n }\n };\n\n protected onMouseOut = (e: MouseEvent) => {\n if(KEEP_OPEN || !this.isActive()) return;\n this.clearTimeout('toggle');\n\n if(this.ignoreMouseOut.size) {\n return;\n }\n\n const toElement = (e as any).toElement as HTMLElement;\n if(toElement && findUpAsChild(toElement, this.element)) {\n return;\n }\n\n this.setTimeout('toggle', () => {\n this.toggle(false);\n }, TOGGLE_TIMEOUT);\n };\n\n protected clearTimeout(type: DropdownHoverTimeoutType) {\n if(this.timeouts[type] !== undefined) {\n clearTimeout(this.timeouts[type]);\n delete this.timeouts[type];\n }\n }\n\n protected setTimeout(type: DropdownHoverTimeoutType, cb: () => void, timeout: number) {\n this.clearTimeout(type);\n this.timeouts[type] = window.setTimeout(() => {\n this.clearTimeout(type);\n cb();\n }, timeout);\n }\n\n public init() {\n if(!IS_TOUCH_SUPPORTED) {\n this.element.onmouseout = this.onMouseOut;\n this.element.onmouseover = (e) => {\n if(this.forceClose) {\n return;\n }\n\n // console.log('onmouseover element');\n this.clearTimeout('toggle');\n };\n }\n }\n\n public toggle = async(enable?: boolean) => {\n // if(!this.element) return;\n const willBeActive = (!!this.element.style.display && enable === undefined) || enable;\n if(this.init) {\n if(willBeActive) {\n this.init();\n this.init = null;\n } else {\n return;\n }\n }\n\n if(willBeActive === this.isActive()) {\n return;\n }\n\n const delay = IS_TOUCH_SUPPORTED || !rootScope.settings.animationsEnabled ? 0 : ANIMATION_DURATION;\n if((this.element.style.display && enable === undefined) || enable) {\n const res = this.dispatchResultableEvent('open');\n await Promise.all(res);\n\n this.element.style.display = '';\n void this.element.offsetLeft; // reflow\n this.element.classList.add('active');\n\n this.dispatchEvent('openAfterLayout');\n\n appNavigationController.pushItem(this.navigationItem = {\n type: 'dropdown',\n onPop: () => {\n this.toggle(false);\n }\n });\n\n this.clearTimeout('toggle');\n this.setTimeout('done', () => {\n this.forceClose = false;\n this.dispatchEvent('opened');\n }, delay);\n\n // ! can't use together with resizeObserver\n /* if(isTouchSupported) {\n const height = this.element.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\n console.log('[ESG]: toggle: enable height', height);\n appImManager.chat.bubbles.scrollable.scrollTop += height;\n } */\n\n /* if(touchSupport) {\n this.restoreScroll();\n } */\n } else {\n this.dispatchEvent('close');\n this.ignoreMouseOut.clear();\n this.ignoreButtons.clear();\n\n this.element.classList.remove('active');\n\n appNavigationController.removeItem(this.navigationItem);\n detachClickEvent(window, this.onClickOut, {capture: true});\n\n this.clearTimeout('toggle');\n this.setTimeout('done', () => {\n this.element.style.display = 'none';\n this.forceClose = false;\n this.dispatchEvent('closed');\n }, delay);\n\n /* if(isTouchSupported) {\n const scrollHeight = this.container.scrollHeight;\n if(scrollHeight) {\n const height = this.container.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\n appImManager.chat.bubbles.scrollable.scrollTop -= height;\n }\n } */\n\n /* if(touchSupport) {\n this.restoreScroll();\n } */\n }\n\n // animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\n };\n\n public isActive() {\n return this.element.classList.contains('active');\n }\n\n public setIgnoreMouseOut(type: IgnoreMouseOutType, ignore: boolean) {\n ignore ? this.ignoreMouseOut.add(type) : this.ignoreMouseOut.delete(type);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's fastSmoothScroll slightly patched\n\nimport {dispatchHeavyAnimationEvent} from '../hooks/useHeavyAnimationCheck';\nimport {fastRafPromise} from './schedulers';\nimport {animateSingle, cancelAnimationByKey} from './animation';\nimport rootScope from '../lib/rootScope';\nimport isInDOM from './dom/isInDOM';\n\nconst MIN_JS_DURATION = 250;\nconst MAX_JS_DURATION = 600;\nconst LONG_TRANSITION_MAX_DISTANCE = 1500;\nconst SHORT_TRANSITION_MAX_DISTANCE = 500;\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n};\n\nexport type ScrollGetNormalSizeCallback = (options: {rect: DOMRect}) => number;\nexport type ScrollGetElementPositionCallback = (options: {elementRect: DOMRect, containerRect: DOMRect, elementPosition: number}) => number;\nexport type ScrollStartCallbackDimensions = {\n scrollSize: number,\n scrollPosition: number,\n distanceToEnd: number,\n path: number,\n duration: number,\n containerRect: DOMRect,\n elementRect: DOMRect,\n getProgress: () => number\n};\n\nexport type ScrollOptions = {\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition,\n margin?: number,\n maxDistance?: number,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n axis?: 'x' | 'y',\n getNormalSize?: ScrollGetNormalSizeCallback,\n getElementPosition?: ScrollGetElementPositionCallback,\n fallbackToElementStartWhenCentering?: HTMLElement,\n startCallback?: (dimensions: ScrollStartCallbackDimensions) => void,\n transitionFunction?: (value: number) => number\n};\n\nexport default function fastSmoothScroll(options: ScrollOptions) {\n options.margin ??= 0;\n options.maxDistance ??= LONG_TRANSITION_MAX_DISTANCE;\n options.axis ??= 'y';\n // return;\n\n if(!rootScope.settings.animationsEnabled || options.forceDuration === 0) {\n options.forceDirection = FocusDirection.Static;\n }\n\n if(options.forceDirection === FocusDirection.Static) {\n options.forceDuration = 0;\n return scrollWithJs(options);\n /* return Promise.resolve();\n\n element.scrollIntoView({ block: position });\n\n cancelAnimationByKey(container);\n return Promise.resolve(); */\n }\n\n const promise = fastRafPromise().then(() => scrollWithJs(options));\n\n return options.axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\n}\n\nfunction scrollWithJs(options: ScrollOptions): Promise {\n const {element, container, getNormalSize, getElementPosition, transitionFunction, axis, margin, position, forceDirection, maxDistance, forceDuration} = options;\n if(!isInDOM(element)) {\n cancelAnimationByKey(container);\n return Promise.resolve();\n }\n\n const rectStartKey = axis === 'y' ? 'top' : 'left';\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\n const sizeKey = axis === 'y' ? 'height' : 'width';\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\n const elementScrollSizeKey = axis === 'y' ? 'scrollHeight' : 'offsetWidth'; // can use offsetWidth for X, since it's almost same as scrollWidth\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\n\n // const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const elementRect = element.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\n\n // const transformable = container.firstElementChild as HTMLElement;\n\n const possibleElementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\n const elementPosition = getElementPosition ? getElementPosition({elementRect, containerRect, elementPosition: possibleElementPosition}) : possibleElementPosition;\n const elementSize = element[elementScrollSizeKey]; // margin is exclusive in DOMRect\n\n const containerSize = getNormalSize ? getNormalSize({rect: containerRect}) : containerRect[sizeKey];\n\n let scrollPosition = container[scrollPositionKey];\n const scrollSize = container[scrollSizeKey];\n /* const elementPosition = element.offsetTop;\n const elementSize = element.offsetHeight;\n\n const scrollPosition = container[scrollPositionKey];\n const scrollSize = container[scrollSizeKey];\n const containerSize = container.offsetHeight; */\n\n let path!: number;\n\n switch(position) {\n case 'start':\n path = elementPosition - margin;\n break;\n case 'end':\n path = elementRect[rectEndKey] /* + (elementSize - elementRect[sizeKey]) */ - containerRect[rectEndKey] + margin;\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n if(elementSize < containerSize) {\n path = (elementPosition + elementSize / 2) - (containerSize / 2);\n } else {\n if(options.fallbackToElementStartWhenCentering && options.fallbackToElementStartWhenCentering !== element) {\n options.element = options.fallbackToElementStartWhenCentering;\n options.position = 'start';\n return scrollWithJs(options);\n }\n\n path = elementPosition - margin;\n }\n\n break;\n }\n /* switch (position) {\n case 'start':\n path = (elementPosition - margin) - scrollPosition;\n break;\n case 'end':\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n path = elementSize < containerSize\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\n : (elementPosition - margin) - scrollPosition;\n break;\n } */\n\n if(Math.abs(path - (margin || 0)) < 1) {\n cancelAnimationByKey(container);\n return Promise.resolve();\n }\n\n if(axis === 'y') {\n if(forceDirection === undefined) {\n if(path > maxDistance) {\n scrollPosition = container.scrollTop += path - maxDistance;\n path = maxDistance;\n } else if(path < -maxDistance) {\n scrollPosition = container.scrollTop += path + maxDistance;\n path = -maxDistance;\n }\n }/* else if(forceDirection === FocusDirection.Up) { // * not tested yet\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\n } */\n }\n\n // console.log('scrollWithJs: will scroll path:', path, element);\n\n /* let existsTransform = 0;\n const currentTransform = transformable.style.transform;\n if(currentTransform) {\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\n //path += existsTransform;\n } */\n\n if(path < 0) {\n const remainingPath = -scrollPosition;\n path = Math.max(path, remainingPath);\n } else if(path > 0) {\n const remainingPath = scrollSize - (scrollPosition + containerSize);\n path = Math.min(path, remainingPath);\n }\n\n const target = container[scrollPositionKey] + path;\n const absPath = Math.abs(path);\n const duration = forceDuration ?? (\n MIN_JS_DURATION + (absPath / LONG_TRANSITION_MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\n );\n const startAt = Date.now();\n\n /* transformable.classList.add('no-transition');\n\n const tickTransform = () => {\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\n const currentPath = path * transition(t);\n\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\n container.dataset.translate = '' + -currentPath;\n\n const willContinue = t < 1;\n if(!willContinue) {\n fastRaf(() => {\n delete container.dataset.transform;\n container.dataset.transform = '';\n transformable.style.transform = '';\n void transformable.offsetLeft; // reflow\n transformable.classList.remove('no-transition');\n void transformable.offsetLeft; // reflow\n container[scrollPositionKey] = Math.round(target);\n });\n }\n\n return willContinue;\n };\n\n return animateSingle(tickTransform, container); */\n\n /* return new Promise((resolve) => {\n fastRaf(() => {\n transformable.style.transform = '';\n transformable.style.transition = '';\n\n setTimeout(resolve, duration);\n });\n });\n\n const transformableHeight = transformable.scrollHeight;\n //transformable.style.minHeight = `${transformableHeight}px`;\n */\n\n const transition = transitionFunction ?? (absPath < SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition);\n const getProgress = () => duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\n const tick = () => {\n const t = getProgress();\n const value = transition(t);\n const currentPath = path * (1 - value);\n container[scrollPositionKey] = Math.round(target - currentPath);\n\n return t < 1;\n };\n\n if(!duration || !path) {\n cancelAnimationByKey(container);\n tick();\n return Promise.resolve();\n }\n\n /* return new Promise((resolve) => {\n setTimeout(resolve, duration);\n }).then(() => {\n transformable.classList.add('no-transition');\n void transformable.offsetLeft; // reflow\n transformable.style.transform = '';\n transformable.style.transition = '';\n void transformable.offsetLeft; // reflow\n transformable.classList.remove('no-transition');\n void transformable.offsetLeft; // reflow\n fastRaf(() => {\n\n container[scrollPositionKey] = Math.round(target);\n //transformable.style.minHeight = ``;\n });\n\n }); */\n\n if(options.startCallback) {\n const distanceToEnd = scrollSize - Math.round(target + container[axis === 'y' ? 'offsetHeight' : 'offsetWidth']);\n options.startCallback({\n scrollSize,\n scrollPosition,\n distanceToEnd,\n path,\n duration,\n containerRect,\n elementRect,\n getProgress\n });\n }\n\n return animateSingle(tick, container);\n}\n\nfunction longTransition(t: number) {\n return 1 - ((1 - t) ** 5);\n}\n\nfunction shortTransition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {InputFileLocation, InputStickerSet, InputWebFileLocation} from '../layer';\nimport type {DownloadOptions} from '../lib/mtproto/apiFileManager';\n\nconst FILENAME_JOINER = '_';\n\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\n fileName: string,\n downloadId: string\n}>) {\n const fileName = '';// (options?.fileName || '').split('.');\n const ext = fileName[fileName.length - 1] || '';\n\n let str: string;\n switch(location._) {\n case 'inputPhotoFileLocation': {\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputDocumentFileLocation': {\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputPeerPhotoFileLocation':\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\n break;\n\n case 'inputStickerSetThumb': {\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id ||\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name ||\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon ||\n location.stickerset._;\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputFileLocation': {\n str = location.volume_id + '_' + location.local_id;\n break;\n }\n\n case 'inputWebFileLocation': {\n str = ['webFile', location.url].join(FILENAME_JOINER);\n break;\n }\n\n default: {\n console.error('Unrecognized location:', location);\n str = '';\n break;\n }\n }\n\n return str + (options?.downloadId ? '_download' : '') + (ext ? '.' + ext : ext);\n}\n\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\n // console.log('getFileURL', location);\n // const perf = performance.now();\n const encoded = encodeURIComponent(JSON.stringify(options));\n // console.log('getFileURL encode:', performance.now() - perf, encoded);\n\n return /* '/' + */type + '/' + encoded;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Message, MessageAction} from '../layer';\nimport type {MyMessage} from '../lib/appManagers/appMessagesManager';\nimport forEachReverse from './array/forEachReverse';\n\nexport default function filterChatPhotosMessages(value: {\n count: number;\n next_rate: number;\n offset_id_offset: number;\n history: MyMessage[];\n}) {\n forEachReverse(value.history, (message, idx, arr) => {\n if(!((message as Message.messageService).action as MessageAction.messageActionChatEditPhoto).photo) {\n arr.splice(idx, 1);\n if(value.count !== undefined) {\n --value.count;\n }\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {i18n, LangPackKey} from '../lib/langPack';\n\nexport default function formatBytes(bytes: number, decimals: number | 'auto' = 'auto') {\n if(bytes === 0) return i18n('FileSize.B', [0]);\n\n const strictDecimals = decimals === 'auto';\n\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const _decimals = decimals === 'auto' ? Math.max(0, i - 1) : decimals;\n\n const dm = Math.max(0, _decimals);\n const sizes: LangPackKey[] = ['FileSize.B', 'FileSize.KB', 'FileSize.MB', 'FileSize.GB'];\n\n const fixed = (bytes / Math.pow(k, i)).toFixed(dm);\n return i18n(sizes[i], [strictDecimals ? fixed : parseFloat(fixed)]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport I18n, {i18n, join, LangPackKey} from '../lib/langPack';\nimport formatDuration, {DurationType} from './formatDuration';\n\nconst CALL_DURATION_LANG_KEYS: {[type in DurationType]: LangPackKey} = {\n s: 'Seconds',\n m: 'Minutes',\n h: 'Hours',\n d: 'Days',\n w: 'Weeks',\n mm: 'Months',\n y: 'Years'\n};\nexport default function formatCallDuration(duration: number, plain?: boolean) {\n const a = formatDuration(duration, 2);\n if(plain) {\n const strings = a.map((d) => I18n.format(CALL_DURATION_LANG_KEYS[d.type], true, [d.duration]));\n return join(strings, false, plain);\n }\n\n const elements = a.map((d) => i18n(CALL_DURATION_LANG_KEYS[d.type], [d.duration]));\n\n const fragment = document.createElement('span');\n fragment.append(...join(elements, false));\n\n return fragment;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type DurationType = 's' | 'm' | 'h' | 'd' | 'w' | 'mm' | 'y';\nexport default function formatDuration(duration: number, showLast = 2) {\n if(!duration) {\n duration = 1;\n }\n\n const d: {duration: number, type: DurationType}[] = [];\n const p = [\n {m: 1, t: 's'},\n {m: 60, t: 'm'},\n {m: 60, t: 'h'},\n {m: 24, t: 'd'},\n {m: 7, t: 'w'}\n ] as Array<{m?: number, t: DurationType}>\n const s = 1;\n let t = s;\n p.forEach((o, idx) => {\n t = Math.round(t * o.m);\n\n if(duration < t) {\n return;\n }\n\n let dd = duration / t;\n if(idx !== (p.length - 1)) {\n const modulus = p[idx === (p.length - 1) ? idx : idx + 1].m;\n dd %= modulus;\n }\n\n d.push({\n duration: dd | 0,\n type: o.t\n });\n });\n\n const out = d.slice(-showLast).reverse();\n for(let i = out.length - 1; i >= 0; --i) {\n if(out[i].duration === 0) {\n out.splice(i, 1);\n }\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {HelpCountry, HelpCountryCode} from '../layer';\nimport I18n from '../lib/langPack';\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n\n if(!prefixes.size) {\n I18n.countriesList.forEach((country) => {\n country.country_codes.forEach((code) => {\n if(code.prefixes) {\n code.prefixes.forEach((prefix) => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n const phoneCode = str.slice(0, maxPrefixLength);\n\n // //console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n\n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str,\n country: undefined,\n code: undefined,\n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n\n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k]) {\n patternMatches += 1.01;\n } else if(_pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n\n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n\n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {RLottieColor} from '../lib/rlottie/rlottiePlayer';\n\nexport type FramesCacheMap = Map;\nexport type FramesCacheMapNew = Map;\nexport type FramesCacheMapURLs = Map;\nexport type FramesCacheItem = {\n frames: FramesCacheMap,\n framesNew: FramesCacheMapNew,\n framesURLs: FramesCacheMapURLs,\n clearCache: () => void,\n counter: number\n};\n\nexport class FramesCache {\n private cache: Map;\n\n constructor() {\n this.cache = new Map();\n }\n\n public static createCache(): FramesCacheItem {\n const cache: FramesCacheItem = {\n frames: new Map(),\n framesNew: new Map(),\n framesURLs: new Map(),\n clearCache: () => {\n cache.framesNew.forEach((value) => {\n (value as ImageBitmap).close?.();\n });\n\n cache.frames.clear();\n cache.framesNew.clear();\n cache.framesURLs.clear();\n },\n counter: 0\n };\n\n return cache;\n }\n\n public getCache(name: string) {\n let cache = this.cache.get(name);\n if(!cache) {\n this.cache.set(name, cache = FramesCache.createCache());\n } else {\n // console.warn('[RLottieCache] cache will be reused', cache);\n }\n\n ++cache.counter;\n return cache;\n }\n\n public releaseCache(name: string) {\n const cache = this.cache.get(name);\n if(cache && !--cache.counter) {\n this.cache.delete(name);\n // console.warn('[RLottieCache] released cache', cache);\n }\n }\n\n public getCacheCounter(name: string) {\n const cache = this.cache.get(name);\n return cache?.counter;\n }\n\n public generateName(name: string, width: number, height: number, color: RLottieColor, toneIndex: number) {\n return [\n name,\n width,\n height,\n // color ? rgbaToHexa(color) : ''\n color ? 'colored' : '',\n toneIndex || ''\n ].filter(Boolean).join('-');\n }\n}\n\nconst framesCache = new FramesCache();\n\nexport default framesCache;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// generate a path's arc data parameter\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\n\n// http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\nfunction arcParameter(rx: number, ry: number, xAxisRotation: number, largeArcFlag: number, sweepFlag: number, x: number, y: number) {\n return [rx, ',', ry, ' ',\n xAxisRotation, ' ',\n largeArcFlag, ',',\n sweepFlag, ' ',\n x, ',', y].join('');\n}\n\nexport default function generatePathData(x: number, y: number, width: number, height: number, tl: number, tr: number, br: number, bl: number) {\n const data: string[] = [];\n\n // start point in top-middle of the rectangle\n data.push('M' + (x + width / 2) + ',' + y);\n\n // next we go to the right\n data.push('H' + (x + width - tr));\n\n if(tr > 0) {\n // now we draw the arc in the top-right corner\n data.push('A' + arcParameter(tr, tr, 0, 0, 1, (x + width), (y + tr)));\n }\n\n // next we go down\n data.push('V' + (y + height - br));\n\n if(br > 0) {\n // now we draw the arc in the lower-right corner\n data.push('A' + arcParameter(br, br, 0, 0, 1, (x + width - br), (y + height)));\n }\n\n // now we go to the left\n data.push('H' + (x + bl));\n\n if(bl > 0) {\n // now we draw the arc in the lower-left corner\n data.push('A' + arcParameter(bl, bl, 0, 0, 1, (x + 0), (y + height - bl)));\n }\n\n // next we go up\n data.push('V' + (y + tl));\n\n if(tl > 0) {\n // now we draw the arc in the top-left corner\n data.push('A' + arcParameter(tl, tl, 0, 0, 1, (x + tl), (y + 0)));\n }\n\n // and we close the path\n data.push('Z');\n\n return data.join(' ');\n}\n\nMOUNT_CLASS_TO.generatePathData = generatePathData;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PhotoSize} from '../layer';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {renderImageFromUrlPromise} from './dom/renderImageFromUrl';\nimport getPreviewURLFromThumb from './getPreviewURLFromThumb';\nimport blur from './blur';\n\nexport default function getImageFromStrippedThumb(\n photo: MyPhoto | MyDocument,\n thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize,\n useBlur: boolean\n) {\n const url = getPreviewURLFromThumb(photo, thumb, false);\n\n let element: HTMLImageElement | HTMLCanvasElement, loadPromise: Promise;\n if(!useBlur) {\n element = new Image();\n loadPromise = renderImageFromUrlPromise(element, url);\n } else {\n const result = blur(url);\n element = result.canvas;\n loadPromise = result.promise;\n }\n\n element.classList.add('thumbnail');\n\n return {image: element, loadPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {PhotoSize} from '../layer';\n// import appDownloadManager from \"../lib/appManagers/appDownloadManager\";\nimport getPreviewURLFromBytes from './bytes/getPreviewURLFromBytes';\n\nexport default function getPreviewURLFromThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, isSticker = false) {\n // const cacheContext = appDownloadManager.getCacheContext(photo, thumb.type);\n // return cacheContext.url || (cacheContext.url = getPreviewURLFromBytes(thumb.bytes, isSticker));\n return getPreviewURLFromBytes(thumb.bytes, isSticker);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {THUMB_TYPE_FULL} from '../lib/mtproto/mtproto_config';\nimport type {ThumbCache} from '../lib/storages/thumbs';\nimport getImageFromStrippedThumb from './getImageFromStrippedThumb';\n\nexport default function getStrippedThumbIfNeeded(photo: MyPhoto | MyDocument, cacheContext: ThumbCache, useBlur: boolean, ignoreCache = false) {\n const isVideo = (['video', 'gif'] as MyDocument['type'][]).includes((photo as MyDocument).type);\n if(!cacheContext.downloaded || isVideo || ignoreCache) {\n if(\n photo._ === 'document' &&\n cacheContext.downloaded &&\n !ignoreCache &&\n (!isVideo || cacheContext.type !== THUMB_TYPE_FULL)\n ) {\n return null;\n }\n\n const sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs;\n const thumb = sizes?.length ? sizes.find((size) => size._ === 'photoStrippedSize') : null;\n if(thumb && ('bytes' in thumb)) {\n return getImageFromStrippedThumb(photo, thumb as any, useBlur);\n }\n }\n\n return null;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from './array/forEachReverse';\nimport safeAssign from './object/safeAssign';\n\nexport type ListLoaderOptions = {\n loadMore: ListLoader['loadMore'],\n loadCount?: ListLoader['loadCount'],\n loadWhenLeft?: ListLoader['loadWhenLeft'],\n processItem?: ListLoader['processItem'],\n onJump?: ListLoader['onJump'],\n onLoadedMore?: ListLoader['onLoadedMore']\n};\n\nexport type ListLoaderResult = {count: number, items: any[]};\nexport default class ListLoader {\n public current: T;\n public previous: T[] = [];\n public next: T[] = [];\n public count: number;\n public reverse = false; // reverse means next = higher msgid\n\n protected loadMore: (anchor: T, older: boolean, loadCount: number) => Promise>;\n protected processItem: (item: P) => T | Promise;\n protected loadCount = 50;\n protected loadWhenLeft = 20;\n\n public onJump: (item: T, older: boolean) => void;\n public onLoadedMore: () => void;\n\n protected loadedAllUp = false;\n protected loadedAllDown = false;\n protected loadPromiseUp: Promise;\n protected loadPromiseDown: Promise;\n\n constructor(options: ListLoaderOptions) {\n safeAssign(this, options);\n }\n\n public setTargets(previous: T[], next: T[], reverse: boolean) {\n this.previous = previous;\n this.next = next;\n this.reverse = reverse;\n }\n\n public get index() {\n return this.count !== undefined ? this.previous.length : -1;\n }\n\n /* public filter(callback: (item: T, idx: number, arr: T[]) => boolean) {\n const filter = (item: T, idx: number, arr: T[]) => {\n if(!callback(item, idx, arr)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n } */\n\n public reset(loadedAll = false) {\n this.current = undefined;\n this.previous = [];\n this.next = [];\n this.setLoaded(true, loadedAll);\n this.setLoaded(false, loadedAll);\n }\n\n public go(length: number, dispatchJump = true) {\n let items: T[], item: T;\n if(length > 0) {\n items = this.next.splice(0, length);\n item = items.pop();\n if(!item) {\n return;\n }\n\n if(this.current !== undefined) items.unshift(this.current);\n this.previous.push(...items);\n } else {\n items = this.previous.splice(Math.max(0, this.previous.length + length), -length);\n item = items.shift();\n if(!item) {\n return;\n }\n\n if(this.current !== undefined) items.push(this.current);\n this.next.unshift(...items);\n }\n\n if(this.next.length < this.loadWhenLeft) {\n this.load(!this.reverse);\n }\n\n if(this.previous.length < this.loadWhenLeft) {\n this.load(this.reverse);\n }\n\n this.current = item;\n dispatchJump && this.onJump && this.onJump(item, length > 0);\n return this.current;\n }\n\n protected unsetCurrent(toPrevious: boolean) {\n if(toPrevious) this.previous.push(this.current);\n else this.next.unshift(this.current);\n\n this.current = undefined;\n }\n\n public goUnsafe(length: number, dispatchJump?: boolean) {\n const leftLength = length > 0 ? Math.max(0, length - this.next.length) : Math.min(0, length + this.previous.length);\n const item = this.go(length, leftLength ? false : dispatchJump);\n\n /* if(length > 0 ? this.loadedAllUp : this.loadedAllDown) {\n this.unsetCurrent(length > 0);\n } */\n\n return {\n item: !leftLength ? item : undefined,\n leftLength\n };\n }\n\n protected setLoaded(down: boolean, value: boolean) {\n const isChanged = (down ? this.loadedAllDown : this.loadedAllUp) !== value;\n if(!isChanged) {\n return false;\n }\n\n if(down) this.loadedAllDown = value;\n else this.loadedAllUp = value;\n\n if(!value) {\n if(down) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n }\n\n return true;\n }\n\n // нет смысла делать проверку для reverse и loadMediaPromise\n public load(older: boolean) {\n if(older ? this.loadedAllDown : this.loadedAllUp) return Promise.resolve();\n\n let promise = older ? this.loadPromiseDown : this.loadPromiseUp;\n if(promise) return promise;\n\n let anchor: T;\n if(older) {\n anchor = this.reverse ? this.previous[0] : this.next[this.next.length - 1];\n } else {\n anchor = this.reverse ? this.next[this.next.length - 1] : this.previous[0];\n }\n\n anchor ??= this.current;\n promise = this.loadMore(anchor, older, this.loadCount).then(async(result) => {\n if((older ? this.loadPromiseDown : this.loadPromiseUp) !== promise) {\n return;\n }\n\n if(result.items.length < this.loadCount) {\n this.setLoaded(older, true);\n }\n\n if(this.count === undefined) {\n this.count = result.count || result.items.length;\n }\n\n const processedArr: (Promise | any)[] = [];\n const method = older ? result.items.forEach.bind(result.items) : forEachReverse.bind(null, result.items);\n method((item: any) => {\n const processed = this.processItem ? this.processItem(item) : item;\n\n if(!processed) return;\n processedArr.push(processed);\n });\n\n const results = await Promise.all(processedArr);\n if(older) {\n if(this.reverse) this.previous.unshift(...results);\n else this.next.push(...results);\n } else {\n if(this.reverse) this.next.push(...results);\n else this.previous.unshift(...results);\n }\n\n this.onLoadedMore && this.onLoadedMore();\n }, () => {}).then(() => {\n if(older) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n });\n\n if(older) this.loadPromiseDown = promise;\n else this.loadPromiseUp = promise;\n\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type EventListenerBase from './eventListenerBase';\n\nexport type Listener = {\n element: ListenerElement,\n event: ListenerEvent,\n callback: ListenerCallback,\n options?: ListenerOptions,\n\n onceFired?: true, // will be set only when options.once is set\n onceCallback?: () => void,\n};\n\nexport type ListenerElement = Window | Document | HTMLElement | Element | EventListenerBase;\nexport type ListenerEvent = string;\nexport type ListenerCallback = Function;\nexport type ListenerOptions = AddEventListenerOptions;\n\n/* const originalAddEventListener = HTMLElement.prototype.addEventListener;\nHTMLElement.prototype.addEventListener = function(this, name: string, callback: EventListenerOrEventListenerObject, options: AddEventListenerOptions) {\n console.log('nu zdarova', name);\n originalAddEventListener.call(this, name, callback, options);\n\n if(options?.ls) {\n return options.ls.addFromElement(this, name, callback as any, options);\n }\n}; */\n\nexport default class ListenerSetter {\n private listeners: Set = new Set();\n\n public add(element: T): T['addEventListener'] {\n return ((event: string, callback: Function, options: ListenerOptions) => {\n const listener: Listener = {element, event, callback, options};\n this.addManual(listener);\n return listener;\n }) as any;\n }\n\n /* public addFromElement(element: T, event: ListenerEvent, callback: ListenerCallback, options: ListenerOptions) {\n const listener: Listener = {element, event, callback, options};\n this.addManual(listener);\n return listener;\n } */\n\n public addManual(listener: Listener) {\n // @ts-ignore\n listener.element.addEventListener(listener.event, listener.callback, listener.options);\n\n if(listener.options?.once) { // remove listener when its called\n listener.onceCallback = () => {\n this.remove(listener);\n listener.onceFired = true;\n };\n\n // @ts-ignore\n listener.element.addEventListener(listener.event, listener.onceCallback, listener.options);\n }\n\n this.listeners.add(listener);\n }\n\n public remove(listener: Listener) {\n if(!listener.onceFired) {\n // @ts-ignore\n listener.element.removeEventListener(listener.event, listener.callback, listener.options);\n\n if(listener.onceCallback) {\n // @ts-ignore\n listener.element.removeEventListener(listener.event, listener.onceCallback, listener.options);\n }\n }\n\n this.listeners.delete(listener);\n }\n\n public removeManual(\n element: T,\n event: ListenerEvent,\n callback: ListenerCallback,\n options?: ListenerOptions\n ) {\n let listener: Listener;\n for(const _listener of this.listeners) {\n if(_listener.element === element &&\n _listener.event === event &&\n _listener.callback === callback &&\n _listener.options === options) {\n listener = _listener;\n break;\n }\n }\n\n if(listener) {\n this.remove(listener);\n }\n }\n\n public removeAll() {\n this.listeners.forEach((listener) => {\n this.remove(listener);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport calcImageInBox from './calcImageInBox';\n\nexport class MediaSize {\n constructor(public width = 0, public height = width) {\n\n }\n\n public aspect(boxSize: MediaSize, fitted: boolean) {\n return calcImageInBox(this.width, this.height, boxSize.width, boxSize.height, fitted);\n }\n\n public aspectFitted(boxSize: MediaSize) {\n return this.aspect(boxSize, true);\n }\n\n public aspectCovered(boxSize: MediaSize) {\n return this.aspect(boxSize, false);\n }\n}\n\nexport function makeMediaSize(width?: number, height?: number): MediaSize {\n return new MediaSize(width, height);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport EventListenerBase from './eventListenerBase';\nimport {makeMediaSize, MediaSize} from './mediaSize';\n\ntype MediaTypeSizes = {\n regular: MediaSize,\n webpage: MediaSize,\n album: MediaSize,\n esgSticker: MediaSize,\n animatedSticker: MediaSize,\n staticSticker: MediaSize,\n emojiSticker: MediaSize,\n poll: MediaSize,\n round: MediaSize,\n documentName: MediaSize,\n invoice: MediaSize,\n extendedInvoice: MediaSize,\n customEmoji: MediaSize,\n esgCustomEmoji: MediaSize,\n emojiStatus: MediaSize,\n popupSticker: MediaSize\n};\n\nexport type MediaSizeType = keyof MediaTypeSizes;\n\nexport enum ScreenSize {\n mobile,\n medium,\n large\n}\n\nconst MOBILE_SIZE = 600;\nconst MEDIUM_SIZE = 1275;\nconst LARGE_SIZE = 1680;\n\nconst CUSTOM_EMOJI_SIZE = makeMediaSize(20, 20);\nconst ESG_CUSTOM_EMOJI_SIZE = makeMediaSize(36, 36);\nconst EMOJI_STATUS_SIZE = makeMediaSize(18, 18);\n\nclass MediaSizes extends EventListenerBase<{\n changeScreen: (from: ScreenSize, to: ScreenSize) => void,\n resize: () => void\n}> {\n private screenSizes: {key: ScreenSize, value: number}[] = [\n {key: ScreenSize.mobile, value: MOBILE_SIZE},\n {key: ScreenSize.medium, value: MEDIUM_SIZE},\n {key: ScreenSize.large, value: LARGE_SIZE}\n ];\n\n private sizes: {[k in 'desktop' | 'handhelds']: MediaTypeSizes} = {\n handhelds: {\n regular: makeMediaSize(270, 270),\n webpage: makeMediaSize(270, 200),\n album: makeMediaSize(270, 0),\n esgSticker: makeMediaSize(68, 68),\n animatedSticker: makeMediaSize(180, 180),\n staticSticker: makeMediaSize(180, 180),\n emojiSticker: makeMediaSize(112, 112),\n poll: makeMediaSize(240, 0),\n round: makeMediaSize(200, 200),\n documentName: makeMediaSize(200, 0),\n invoice: makeMediaSize(270, 270),\n extendedInvoice: makeMediaSize(270, 270),\n customEmoji: CUSTOM_EMOJI_SIZE,\n esgCustomEmoji: ESG_CUSTOM_EMOJI_SIZE,\n emojiStatus: EMOJI_STATUS_SIZE,\n popupSticker: makeMediaSize(68, 68)\n },\n desktop: {\n regular: makeMediaSize(420, 340),\n webpage: makeMediaSize(420, 340),\n album: makeMediaSize(420, 0),\n esgSticker: makeMediaSize(72, 72),\n animatedSticker: makeMediaSize(200, 200),\n staticSticker: makeMediaSize(200, 200),\n emojiSticker: makeMediaSize(112, 112),\n poll: makeMediaSize(330, 0),\n round: makeMediaSize(280, 280),\n documentName: makeMediaSize(240, 0),\n invoice: makeMediaSize(320, 320),\n extendedInvoice: makeMediaSize(420, 340),\n customEmoji: CUSTOM_EMOJI_SIZE,\n esgCustomEmoji: ESG_CUSTOM_EMOJI_SIZE,\n emojiStatus: EMOJI_STATUS_SIZE,\n popupSticker: makeMediaSize(80, 80)\n }\n };\n\n public isMobile = false;\n public active: MediaTypeSizes;\n public activeScreen: ScreenSize;\n private rAF: number;\n\n constructor() {\n super();\n\n window.addEventListener('resize', () => {\n if(this.rAF) window.cancelAnimationFrame(this.rAF);\n this.rAF = window.requestAnimationFrame(() => {\n this.handleResize();\n this.rAF = 0;\n });\n });\n this.handleResize();\n }\n\n private handleResize = () => {\n const innerWidth = window.innerWidth;\n // this.isMobile = innerWidth <= 720;\n\n let activeScreen = this.screenSizes[0].key;\n for(let i = this.screenSizes.length - 1; i >= 0; --i) {\n if(this.screenSizes[i].value < innerWidth) {\n activeScreen = (this.screenSizes[i + 1] || this.screenSizes[i]).key;\n break;\n }\n }\n\n const wasScreen = this.activeScreen;\n this.activeScreen = activeScreen;\n this.isMobile = this.activeScreen === ScreenSize.mobile;\n this.active = this.isMobile ? this.sizes.handhelds : this.sizes.desktop;\n\n // console.time('esg');\n // const computedStyle = window.getComputedStyle(document.documentElement);\n // this.active.esgSticker.width = parseFloat(computedStyle.getPropertyValue('--esg-sticker-size'));\n // console.timeEnd('esg');\n\n if(wasScreen !== activeScreen) {\n // console.log('changeScreen', this.activeScreen, activeScreen);\n\n if(wasScreen !== undefined) {\n this.dispatchEvent('changeScreen', wasScreen, activeScreen);\n }\n }\n\n if(wasScreen !== undefined) {\n this.dispatchEvent('resize');\n }\n\n /* if(this.isMobile) {\n for(let i in this.active) {\n // @ts-ignore\n let size = this.active[i];\n size.width = innerWidth\n }\n } */\n };\n}\n\nconst mediaSizes = new MediaSizes();\nMOUNT_CLASS_TO.mediaSizes = mediaSizes;\nexport default mediaSizes;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport makeError from './makeError';\n\nconst error = makeError('MIDDLEWARE');\nexport default function middlewarePromise(middleware: () => boolean, throwWhat: any = error) {\n return (promise: T): T => {\n if(!(promise instanceof Promise)) {\n if(promise instanceof Error) {\n throw promise;\n } else {\n return promise;\n }\n }\n\n return (promise as any as Promise).then((result) => {\n if(!middleware()) {\n throw throwWhat;\n }\n\n return result;\n }) as any;\n };\n}\n","export default function clamp(v: number, min: number, max: number): number {\n return v < min ? min : ((v > max) ? max : v);\n}\n","export default function formatNumber(bytes: number, decimals = 2) {\n if(bytes === 0) return '0';\n\n const k = 1000;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['', 'K', 'M', 'B', 'T'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + sizes[i];\n}\n","export default function numberThousandSplitter(x: number, joiner = ' ') {\n const parts = x.toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, joiner);\n return parts.join('.');\n}\n","import {IS_APPLE_MOBILE} from '../environment/userAgent';\n\nexport default function onMediaLoad(media: HTMLMediaElement, readyState = media.HAVE_METADATA, useCanplayOnIos?: boolean) {\n return new Promise((resolve, reject) => {\n if(media.readyState >= readyState) {\n resolve();\n return;\n }\n\n const loadEventName = IS_APPLE_MOBILE && !useCanplayOnIos ? 'loadeddata' : 'canplay';\n const errorEventName = 'error';\n const onLoad = () => {\n media.removeEventListener(errorEventName, onError);\n resolve();\n };\n const onError = (e: ErrorEvent) => {\n media.removeEventListener(loadEventName, onLoad);\n reject(e);\n };\n media.addEventListener(loadEventName, onLoad, {once: true});\n media.addEventListener(errorEventName, onError, {once: true});\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appNavigationController, {NavigationItem} from '../components/appNavigationController';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {IS_MOBILE_SAFARI} from '../environment/userAgent';\nimport cancelEvent from './dom/cancelEvent';\nimport {CLICK_EVENT_NAME} from './dom/clickEvent';\nimport findUpAsChild from './dom/findUpAsChild';\nimport EventListenerBase from './eventListenerBase';\n\nexport default class OverlayClickHandler extends EventListenerBase<{\n toggle: (open: boolean) => void\n}> {\n protected element: HTMLElement;\n protected overlay: HTMLElement;\n protected listenerOptions: AddEventListenerOptions;\n\n constructor(\n protected navigationType: NavigationItem['type'],\n protected withOverlay?: boolean\n ) {\n super(false);\n this.listenerOptions = withOverlay ? {} : {capture: true};\n }\n\n protected onClick = (e: MouseEvent | TouchEvent) => {\n if(this.element && findUpAsChild(e.target as HTMLElement, this.element)) {\n return;\n }\n\n if(this.listenerOptions?.capture) {\n cancelEvent(e);\n }\n\n this.close();\n };\n\n public close() {\n if(this.element) {\n this.overlay?.remove();\n this.element = undefined;\n this.dispatchEvent('toggle', false);\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n // window.removeEventListener('keydown', onKeyDown, {capture: true});\n window.removeEventListener('contextmenu', this.onClick, this.listenerOptions);\n }\n\n document.removeEventListener(CLICK_EVENT_NAME, this.onClick, this.listenerOptions);\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.removeByType(this.navigationType);\n }\n }\n\n public open(element: HTMLElement) {\n this.close();\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: (canAnimate) => {\n this.close();\n }\n });\n }\n\n this.element = element;\n\n if(!this.overlay && this.withOverlay) {\n this.overlay = document.createElement('div');\n this.overlay.classList.add('btn-menu-overlay');\n\n // ! because this event must be canceled, and can't cancel on menu click (below)\n this.overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n this.onClick(e);\n });\n }\n\n this.overlay && this.element.parentElement.insertBefore(this.overlay, this.element);\n\n // document.body.classList.add('disable-hover');\n\n if(!IS_TOUCH_SUPPORTED) {\n // window.addEventListener('keydown', onKeyDown, {capture: true});\n window.addEventListener('contextmenu', this.onClick, {...this.listenerOptions, once: true});\n }\n\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n onClick(e);\n }); */\n\n // ! safari iOS doesn't handle window click event on overlay, idk why\n document.addEventListener(CLICK_EVENT_NAME, this.onClick, this.listenerOptions);\n\n this.dispatchEvent('toggle', true);\n }\n}\n","import Currencies from '../config/currencies';\n\n// https://stackoverflow.com/a/34141813\nfunction number_format(number: any, decimals: any, dec_point: any, thousands_sep: any): string {\n // Strip all characters but numerical ones.\n number = (number + '').replace(/[^0-9+\\-Ee.]/g, '');\n var n = !isFinite(+number) ? 0 : +number,\n prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),\n sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,\n dec = (typeof dec_point === 'undefined') ? '.' : dec_point,\n s: any = '',\n toFixedFix = function(n: number, prec: number) {\n var k = Math.pow(10, prec);\n return '' + Math.round(n * k) / k;\n };\n // Fix for IE parseFloat(0.55).toFixed(0) = 0;\n s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');\n if(s[0].length > 3) {\n s[0] = s[0].replace(/\\B(?=(?:\\d{3})+(?!\\d))/g, sep);\n }\n if((s[1] || '').length < prec) {\n s[1] = s[1] || '';\n s[1] += new Array(prec - s[1].length + 1).join('0');\n }\n return s.join(dec);\n}\n\nexport default function paymentsWrapCurrencyAmount(amount: number | string, currency: string, skipSymbol?: boolean) {\n amount = +amount;\n\n const isNegative = amount < 0;\n\n const currencyData = Currencies[currency];\n if(!currencyData) {\n throw new Error('CURRENCY_WRAP_INVALID');\n }\n\n const amountExp = amount / Math.pow(10, currencyData.exp);\n\n let decimals = currencyData.exp;\n if(currency == 'IRR' && Math.floor(amountExp) == amountExp) {\n decimals = 0; // у иранцев копейки почти всегда = 0 и не показываются в UI\n }\n\n let formatted = number_format(amountExp, decimals, currencyData.decimal_sep, currencyData.thousands_sep);\n if(skipSymbol) {\n return formatted;\n }\n\n let symbol = currencyData.symbol;\n if(isNegative && !currencyData.space_between && currencyData.symbol_left) {\n symbol = '-' + symbol;\n formatted = formatted.replace('-', '');\n }\n\n let out: string;\n const splitter = currencyData.space_between ? ' ' : '';\n if(currencyData.symbol_left) {\n out = symbol + splitter + formatted;\n } else {\n out = formatted + splitter + symbol;\n }\n return out;\n}\n\n(window as any).p = paymentsWrapCurrencyAmount;\n\n// function paymentsGetCurrencyExp($currency: string) {\n// if($currency == 'CLF') {\n// return 4;\n// }\n// if(['BHD','IQD','JOD','KWD','LYD','OMR','TND'].includes($currency)) {\n// return 3;\n// }\n// if(['BIF','BYR','CLP','CVE','DJF','GNF','ISK','JPY','KMF','KRW','MGA', 'PYG','RWF','UGX','UYI','VND','VUV','XAF','XOF','XPF'].includes($currency)) {\n// return 0;\n// }\n// if($currency == 'MRO') {\n// return 1;\n// }\n// return 2;\n// }\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport mediaSizes from './mediaSizes';\n\nexport type MenuPositionPadding = {\n top?: number,\n right?: number,\n bottom?: number,\n left?: number\n};\n\nconst PADDING_TOP = 8;\nconst PADDING_BOTTOM = PADDING_TOP;\nconst PADDING_LEFT = 8;\nconst PADDING_RIGHT = PADDING_LEFT;\nexport default function positionMenu(e: MouseEvent | Touch | TouchEvent, elem: HTMLElement, side?: 'left' | 'right' | 'center', additionalPadding?: MenuPositionPadding) {\n if((e as TouchEvent).touches) {\n e = (e as TouchEvent).touches[0];\n }\n\n const {pageX, pageY} = e as Touch;\n // let {clientX, clientY} = e;\n\n // * side mean the OPEN side\n\n const getScrollWidthFromElement = (Array.from(elem.children) as HTMLElement[]).find((element) => element.classList.contains('btn-menu-item') && !element.classList.contains('hide')) || elem;\n\n let {scrollWidth: menuWidth} = getScrollWidthFromElement;\n const {scrollHeight: menuHeight} = elem;\n // let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\n const rect = document.body.getBoundingClientRect();\n const windowWidth = rect.width;\n const windowHeight = rect.height;\n\n menuWidth += getScrollWidthFromElement.offsetLeft * 2;\n\n let paddingTop = PADDING_TOP, paddingRight = PADDING_RIGHT, paddingBottom = PADDING_BOTTOM, paddingLeft = PADDING_LEFT;\n if(additionalPadding) {\n if(additionalPadding.top) paddingTop += additionalPadding.top;\n if(additionalPadding.right) paddingRight += additionalPadding.right;\n if(additionalPadding.bottom) paddingBottom += additionalPadding.bottom;\n if(additionalPadding.left) paddingLeft += additionalPadding.left;\n }\n\n side = mediaSizes.isMobile ? 'right' : 'left';\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\n\n const maxTop = windowHeight - menuHeight - paddingBottom;\n const maxLeft = windowWidth - menuWidth - paddingRight;\n const minTop = paddingTop;\n const minLeft = paddingLeft;\n\n const getSides = () => {\n return {\n x: {\n left: pageX,\n right: Math.min(maxLeft, pageX - menuWidth)\n },\n intermediateX: side === 'right' ? minLeft : maxLeft,\n // intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\n y: {\n top: pageY,\n bottom: pageY - menuHeight\n },\n // intermediateY: verticalSide === 'top' ? paddingTop : windowHeight - menuHeight - paddingTop,\n // intermediateY: pageY < (windowHeight / 2) ? paddingTop : windowHeight - menuHeight - paddingBottom,\n intermediateY: maxTop\n };\n };\n\n const sides = getSides();\n\n const possibleSides = {\n x: {\n left: (sides.x.left + menuWidth + paddingRight) <= windowWidth,\n right: sides.x.right >= paddingLeft\n },\n y: {\n top: (sides.y.top + menuHeight + paddingBottom) <= windowHeight,\n bottom: (sides.y.bottom - paddingBottom) >= paddingBottom\n }\n };\n\n /* if(side === undefined) {\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\n side = 'right';\n }\n } */\n\n {\n /* const x = sides.x;\n\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\n if(side) {\n s.findAndSplice((s) => s === side);\n s.unshift(side);\n }\n\n const possibleSide = s.find((s) => possibleSides.x[s]); */\n // let left: number;\n /* if(possibleSide) {\n left = x[possibleSide];\n side = possibleSide;\n } else {\n left = sides.intermediateX;\n side = undefined;\n } */\n const left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\n\n elem.style.left = left + 'px';\n }\n\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\n verticalSide = 'bottom';\n } else {\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\n verticalSide = 'top';\n } */\n\n {\n const top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\n\n elem.style.top = top + 'px';\n }\n\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\n elem.classList.add(\n // (verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\n (verticalSide === 'center' ? verticalSide : 'bottom') +\n '-' +\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\n\n return {\n width: menuWidth,\n height: menuHeight\n };\n}\n","import {RestrictionReason} from '../layer';\n\nconst platforms = new Set([\n 'all',\n 'web',\n 'webk'\n]);\n\nconst ignore = new Set();\n\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\n // return reasons[0];\n return reasons.find((reason) => platforms.has(reason.platform) && !ignore.has(reason.reason));\n}\n\nexport function isRestricted(reasons: RestrictionReason[]) {\n return !!getRestrictionReason(reasons);\n}\n\nexport function ignoreRestrictionReasons(reasons: string[]) {\n ignore.clear();\n reasons.forEach((reason) => {\n ignore.add(reason);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport rootScope from '../lib/rootScope';\n\nconst savingLottiePreview: {[docId: DocId]: {width: number, height: number}} = {};\n\nexport function isSavingLottiePreview(doc: MyDocument, toneIndex: number, width: number, height: number) {\n const key = doc.id + '-' + toneIndex;\n const saving = savingLottiePreview[key];\n return saving && saving.width >= width && saving.height >= height;\n}\n\nexport async function saveLottiePreview(doc: MyDocument, canvas: HTMLCanvasElement, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n const {width, height} = canvas;\n if(isSavingLottiePreview(doc, toneIndex, width, height)) {\n return;\n }\n\n const saving = savingLottiePreview[key] = {\n width,\n height\n };\n\n const thumb = await rootScope.managers.appDocsManager.getLottieCachedThumb(doc.id, toneIndex);\n if(savingLottiePreview[key] !== saving) {\n return;\n }\n\n if(thumb && thumb.w >= width && thumb.h >= height) {\n return;\n }\n\n const promise = new Promise((resolve) => {\n canvas.toBlob((blob) => resolve(blob));\n });\n\n const blob = await promise;\n if(savingLottiePreview[key] !== saving) {\n return;\n }\n\n // console.log('got lottie preview', doc, blob, URL.createObjectURL(blob));\n\n rootScope.managers.appDocsManager.saveLottiePreview(doc.id, blob, width, height, toneIndex);\n\n // delete savingLottiePreview[key];\n\n /* const reader = new FileReader();\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n const thumb: PhotoSize.photoStrippedSize = {\n _: 'photoStrippedSize',\n bytes: uint8,\n type: 'i'\n };\n\n doc.stickerSavedThumbWidth = canvas.width;\n doc.stickerSavedThumbHeight = canvas.width;\n\n defineNotNumerableProperties(thumb, ['url']);\n thumb.url = URL.createObjectURL(blob);\n doc.thumbs.findAndSplice((t) => t._ === thumb._);\n doc.thumbs.unshift(thumb);\n\n if(!webpWorkerController.isWebpSupported()) {\n doc.pFlags.stickerThumbConverted = true;\n }\n\n delete this.savingLottiePreview[doc.id];\n };\n reader.readAsArrayBuffer(blob); */\n}\n","// * Jolly Cobra's schedulers\n\nimport {AnyToVoidFunction} from '../../types';\nimport {fastRaf} from '../schedulers';\nimport throttleWith from './throttleWith';\n\nexport default function throttleWithRaf(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n","// * Jolly Cobra's schedulers\n\nimport {AnyToVoidFunction} from '../../types';\n\nexport default function throttleWith(schedulerFn: AnyToVoidFunction, fn: F) {\n let waiting = false;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n args = _args;\n\n if(!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n // @ts-ignore\n fn(...args);\n });\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Scrollable from '../components/scrollable';\nimport safeAssign from './object/safeAssign';\n\nexport default class ScrollableLoader {\n public loading = false;\n private scrollable: Scrollable;\n private getPromise: () => Promise;\n private promise: Promise;\n private loaded = false;\n\n constructor(options: {\n scrollable: ScrollableLoader['scrollable'],\n getPromise: ScrollableLoader['getPromise']\n }) {\n safeAssign(this, options);\n\n options.scrollable.onScrolledBottom = () => {\n this.load();\n };\n }\n\n public load() {\n if(this.loaded) {\n return Promise.resolve();\n }\n\n if(this.loading) {\n return this.promise;\n }\n\n this.loading = true;\n this.promise = this.getPromise().then((done) => {\n this.loading = false;\n this.promise = undefined;\n\n if(done) {\n this.loaded = true;\n this.scrollable.onScrolledBottom = null;\n } else {\n this.scrollable.checkForTriggers();\n }\n }, () => {\n this.promise = undefined;\n this.loading = false;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MediaSearchContext} from '../components/appMediaPlaybackController';\nimport type {SearchSuperContext} from '../components/appSearchSuper.';\nimport type {Message} from '../layer';\nimport type {MessagesStorageKey, MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport incrementMessageId from '../lib/appManagers/utils/messageId/incrementMessageId';\nimport rootScope from '../lib/rootScope';\nimport forEachReverse from './array/forEachReverse';\nimport filterChatPhotosMessages from './filterChatPhotosMessages';\nimport ListLoader, {ListLoaderOptions} from './listLoader';\n\nexport default class SearchListLoader extends ListLoader {\n public searchContext: MediaSearchContext;\n public onEmptied: () => void;\n\n private otherSideLoader: SearchListLoader;\n private managers: AppManagers;\n\n constructor(options: Omit, 'loadMore'> & {\n onEmptied?: () => void,\n isInner?: boolean,\n managers?: AppManagers\n } = {}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n const backLimit = older ? 0 : loadCount;\n let maxId = anchor?.mid;\n\n if(maxId === undefined) maxId = this.searchContext.maxId;\n if(!older) maxId = incrementMessageId(maxId, 1);\n\n return this.managers.appMessagesManager.getSearch({\n ...this.searchContext,\n peerId: this.searchContext.peerId || anchor?.peerId,\n maxId,\n limit: backLimit ? 0 : loadCount,\n backLimit\n }).then((value) => {\n /* if(DEBUG) {\n this.log('loaded more media by maxId:', maxId, value, older, this.reverse);\n } */\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n filterChatPhotosMessages(value);\n }\n\n if(value.next_rate) {\n this.searchContext.nextRate = value.next_rate;\n }\n\n return {count: value.count, items: value.history};\n });\n },\n processItem: async(message) => {\n const filtered = await this.filterMids([message.mid]);\n if(!filtered.length) {\n return;\n }\n\n return options.processItem(message);\n }\n });\n\n this.managers ??= rootScope.managers;\n rootScope.addEventListener('history_delete', this.onHistoryDelete);\n rootScope.addEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.addEventListener('message_sent', this.onMessageSent);\n\n if(!options.isInner) {\n this.otherSideLoader = new SearchListLoader({\n ...options,\n isInner: true\n });\n\n // this.otherSideLoader.onLoadedMore = () => {\n\n // };\n }\n }\n\n protected async filterMids(mids: number[]) {\n const storageKey: MessagesStorageKey = `${this.searchContext.peerId}_${this.searchContext.isScheduled ? 'scheduled' : 'history'}`;\n const filtered = (await this.managers.appMessagesManager.filterMessagesByInputFilterFromStorage(this.searchContext.inputFilter._, mids, storageKey, mids.length)) as Message.message[];\n return filtered;\n }\n\n protected onHistoryDelete = ({peerId, msgs}: {peerId: PeerId, msgs: Set}) => {\n const shouldBeDeleted = (item: Item) => item.peerId === peerId && msgs.has(item.mid);\n const filter = (item: Item, idx: number, arr: Item[]) => {\n if(shouldBeDeleted(item)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n\n if(this.current && shouldBeDeleted(this.current)) {\n this.current = undefined;\n /* if(this.go(1)) {\n this.previous.splice(this.previous.length - 1, 1);\n } else if(this.go(-1)) {\n this.next.splice(0, 1);\n } else */if(this.onEmptied) {\n this.onEmptied();\n }\n }\n };\n\n protected onHistoryMultiappend = async(message: Message.message | Message.messageService) => {\n if(this.searchContext.folderId !== undefined) {\n return;\n }\n\n // because it's reversed\n if(!this.loadedAllUp || this.loadPromiseUp) {\n return;\n }\n\n if(message.peerId !== this.searchContext.peerId) {\n return;\n }\n\n const filtered = await this.filterMids([message.mid]);\n const targets = (await Promise.all(filtered.map((message) => this.processItem(message)))).filter(Boolean);\n if(targets.length) {\n /* const {previous, current, next} = this;\n const targets = previous.concat(current, next);\n const currentIdx = targets.length;\n const mid = targets[0].mid;\n let i = 0, length = targets.length;\n for(; i < length; ++i) {\n const target = targets[i];\n if(!target || mid < target.mid) {\n break;\n }\n }\n\n if(i < currentIdx) previous.push(...targets);\n else next. */\n\n if(!this.current) {\n this.previous.push(...targets);\n } else {\n this.next.push(...targets);\n }\n }\n };\n\n protected onMessageSent = ({message}: {message: MyMessage}) => {\n this.onHistoryMultiappend(message);\n };\n\n public setSearchContext(context: SearchSuperContext) {\n this.searchContext = context;\n\n if(this.searchContext.folderId !== undefined) {\n this.loadedAllUp = true;\n\n if(this.searchContext.nextRate === undefined) {\n this.loadedAllDown = true;\n }\n }\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n this.loadedAllUp = true;\n }\n\n if(this.searchContext.useSearch === false) {\n this.loadedAllDown = this.loadedAllUp = true;\n }\n\n if(this.otherSideLoader) {\n this.otherSideLoader.setSearchContext(context);\n }\n }\n\n public reset() {\n super.reset();\n this.searchContext = undefined;\n\n if(this.otherSideLoader) {\n this.otherSideLoader.reset();\n }\n }\n\n public getPrevious(withOtherSide?: boolean) {\n let previous = this.previous;\n\n if(this.otherSideLoader && withOtherSide) {\n previous = previous.concat(this.otherSideLoader.previous);\n }\n\n return previous;\n }\n\n public getNext(withOtherSide?: boolean) {\n let next = this.next;\n\n if(this.otherSideLoader && withOtherSide) {\n next = next.concat(this.otherSideLoader.next);\n }\n\n return next;\n }\n\n public getCurrent() {\n return this.current || this.otherSideLoader?.current;\n }\n\n private goToOtherEnd(length: number) {\n if(length > 0) return this.go(-this.previous.length);\n else return this.go(this.next.length);\n }\n\n public goRound(length: number, dispatchJump?: boolean) {\n let ret: ReturnType['goUnsafe']>;\n\n if(this.otherSideLoader?.current) {\n ret = this.otherSideLoader.goUnsafe(length, dispatchJump);\n if(ret.item) {\n return ret.item;\n }\n\n length = ret.leftLength;\n if(!(length > 0 ? this.otherSideLoader.next : this.otherSideLoader.previous).length) {\n const loaded = length > 0 ? this.otherSideLoader.loadedAllUp : this.otherSideLoader.loadedAllDown;\n if(!loaded) { // do not reset anything until it's loaded\n return;\n }\n\n // if other side is loaded too will start from its begin\n if((length > 0 && (this.otherSideLoader.searchContext.maxId === 1 || this.otherSideLoader.loadedAllDown)) ||\n (length < 0 && (this.otherSideLoader.searchContext.maxId === 0 || this.otherSideLoader.loadedAllUp))) {\n return this.otherSideLoader.goToOtherEnd(length);\n }\n\n this.otherSideLoader.unsetCurrent(length > 0);\n }\n }\n\n ret = this.goUnsafe(length, dispatchJump);\n if(!ret.item) {\n if(this.loadedAllUp && this.loadedAllDown) { // just use the same loader if the list is too short\n return this.goToOtherEnd(length);\n } else if(this.otherSideLoader) {\n length = ret.leftLength;\n ret = this.otherSideLoader.goUnsafe(length, dispatchJump);\n\n if(ret.item) {\n this.unsetCurrent(length > 0);\n }\n }\n }\n\n return ret?.item;\n }\n\n // public setTargets(previous: Item[], next: Item[], reverse: boolean) {\n // super.setTargets(previous, next, reverse);\n // }\n\n protected setLoaded(down: boolean, value: boolean) {\n const changed = super.setLoaded(down, value);\n\n if(changed &&\n this.otherSideLoader &&\n value &&\n this.searchContext?.useSearch !== false/* &&\n (this.reverse ? this.loadedAllUp : this.loadedAllDown) */) {\n const reverse = this.loadedAllUp;\n this.otherSideLoader.setSearchContext({\n ...this.searchContext,\n maxId: reverse ? 1 : 0\n });\n\n // these 'reverse' are different, not a mistake here.\n this.otherSideLoader.reverse = this.reverse;\n this.otherSideLoader.setLoaded(reverse, true);\n this.otherSideLoader.load(!reverse);\n }\n\n return changed;\n }\n\n public cleanup() {\n this.reset();\n rootScope.removeEventListener('history_delete', this.onHistoryDelete);\n rootScope.removeEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.removeEventListener('message_sent', this.onMessageSent);\n this.onEmptied = undefined;\n\n if(this.otherSideLoader) {\n this.otherSideLoader.cleanup();\n this.otherSideLoader = undefined;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport generateMessageId from './generateMessageId';\nimport getServerMessageId from './getServerMessageId';\n\nexport default function incrementMessageId(messageId: number, increment: number) {\n return generateMessageId(getServerMessageId(messageId) + increment);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {fastRaf} from './schedulers';\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport isInDOM from './dom/isInDOM';\n\nclass SequentialDom {\n private promises: Partial<{\n read: CancellablePromise,\n write: CancellablePromise\n }> = {};\n private raf = fastRaf.bind(null);\n private scheduled = false;\n\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\n let promise = this.promises[kind];\n if(!promise) {\n this.scheduleFlush();\n promise = this.promises[kind] = deferredPromise();\n }\n\n if(callback !== undefined) {\n promise.then(() => callback());\n }\n\n return promise;\n }\n\n public measure(callback?: VoidFunction) {\n return this.do('read', callback);\n }\n\n public mutate(callback?: VoidFunction) {\n return this.do('write', callback);\n }\n\n /**\n * Will fire instantly if element is not connected\n * @param element\n * @param callback\n */\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\n const isConnected = isInDOM(element);\n const promise = isConnected ? this.mutate() : Promise.resolve();\n\n if(callback !== undefined) {\n if(!isConnected) {\n callback();\n } else {\n promise.then(() => callback());\n }\n }\n\n return promise;\n }\n\n private scheduleFlush() {\n if(!this.scheduled) {\n this.scheduled = true;\n\n this.raf(() => {\n this.promises.read && this.promises.read.resolve();\n this.promises.write && this.promises.write.resolve();\n\n this.scheduled = false;\n this.promises = {};\n });\n }\n }\n}\n\nconst sequentialDom = new SequentialDom();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\nexport default sequentialDom;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PhotoSize, WebDocument} from '../layer';\nimport {REPLIES_HIDDEN_CHANNEL_ID} from '../lib/mtproto/mtproto_config';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport {MediaSize, makeMediaSize} from './mediaSize';\nimport isWebDocument from '../lib/appManagers/utils/webDocs/isWebDocument';\n\nexport default function setAttachmentSize(\n photo: MyPhoto | MyDocument | WebDocument,\n element: HTMLElement | SVGForeignObjectElement,\n boxWidth: number,\n boxHeight: number,\n noZoom = true,\n message?: any,\n pushDocumentSize?: boolean,\n photoSize?: ReturnType\n) {\n const _isWebDocument = isWebDocument(photo);\n // if(_isWebDocument && pushDocumentSize === undefined) {\n // pushDocumentSize = true;\n // }\n\n if(!photoSize) {\n photoSize = choosePhotoSize(photo, boxWidth, boxHeight, undefined, pushDocumentSize);\n }\n // console.log('setAttachmentSize', photo, photo.sizes[0].bytes, div);\n\n let size: MediaSize;\n const isDocument = photo._ === 'document';\n if(isDocument || _isWebDocument) {\n size = makeMediaSize(photo.w || (photoSize as PhotoSize.photoSize).w || 512, photo.h || (photoSize as PhotoSize.photoSize).h || 512);\n } else {\n size = makeMediaSize((photoSize as PhotoSize.photoSize).w || 100, (photoSize as PhotoSize.photoSize).h || 100);\n }\n\n let boxSize = makeMediaSize(boxWidth, boxHeight);\n\n boxSize = size = size.aspect(boxSize, noZoom);\n\n let isFit = true;\n\n if(!isDocument || ['video', 'gif'].includes(photo.type) || _isWebDocument) {\n if(boxSize.width < 200 && boxSize.height < 200) { // make at least one side this big\n boxSize = size = size.aspectCovered(makeMediaSize(200, 200));\n }\n\n if(message &&\n (message.message ||\n message.reply_to_mid ||\n message.media.webpage ||\n (message.replies && message.replies.pFlags.comments && message.replies.channel_id.toChatId() !== REPLIES_HIDDEN_CHANNEL_ID)\n )\n ) { // make sure that bubble block is human-readable\n if(boxSize.width < 320) {\n boxSize = makeMediaSize(320, boxSize.height);\n isFit = false;\n }\n }\n\n if(isFit && boxSize.width < 120 && message) { // if image is too narrow\n boxSize = makeMediaSize(120, boxSize.height);\n isFit = false;\n }\n }\n\n // if(element instanceof SVGForeignObjectElement) {\n // element.setAttributeNS(null, 'width', '' + w);\n // element.setAttributeNS(null, 'height', '' + h);\n\n // //console.log('set dimensions to svg element:', element, w, h);\n // } else {\n element.style.width = boxSize.width + 'px';\n element.style.height = boxSize.height + 'px';\n // }\n\n return {photoSize, size, isFit};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {logger} from '../lib/logger';\nimport insertInDescendSortedArray from './array/insertInDescendSortedArray';\nimport {getMiddleware, MiddlewareHelper} from './middleware';\nimport middlewarePromise from './middlewarePromise';\nimport safeAssign from './object/safeAssign';\nimport pause from './schedulers/pause';\n\nexport type SortedElementBase = {\n id: T,\n index: number\n};\n\nlet id = 0;\n\nexport class BatchProcessor {\n protected queue: Promise[];\n protected promise: Promise;\n\n protected middlewareHelper: MiddlewareHelper;\n protected log: ReturnType;\n\n protected process: (batch: Item[], m: ReturnType, log: BatchProcessor['log']) => Promise;\n protected possibleError: any;\n\n constructor(options: {\n log?: BatchProcessor['log'],\n // middleware: MiddlewareHelper,\n process: BatchProcessor['process'],\n possibleError?: BatchProcessor['possibleError']\n }) {\n safeAssign(this, options);\n\n this.queue = [];\n this.middlewareHelper ??= getMiddleware();\n\n const prefix = 'BATCH-PROCESSOR-' + ++id;\n if(this.log) {\n this.log = this.log.bindPrefix(prefix);\n } else {\n this.log = logger(prefix);\n }\n }\n\n public get queuePromise() {\n return this.promise;\n }\n\n public clear() {\n this.log('clear');\n this.queue.length = 0;\n this.promise = undefined;\n this.middlewareHelper.clean();\n }\n\n public addToQueue(item: BatchProcessor['queue'][0]) {\n this.queue.push(item);\n return this.setQueue();\n }\n\n protected setQueue() {\n if(!this.queue.length) {\n return Promise.resolve();\n }\n\n if(this.promise) {\n return this.promise;\n }\n\n const middleware = this.middlewareHelper.get();\n const log = this.log.bindPrefix('queue');\n const m = middlewarePromise(middleware, this.possibleError);\n\n const processQueue = async(): Promise => {\n log('start', this.queue.length);\n\n const queue = this.queue.splice(0, this.queue.length);\n\n const perf = performance.now();\n const promises = queue.map((promise) => {\n promise.then((details) => {\n log('render item time', performance.now() - perf, details);\n });\n\n return promise;\n });\n\n const renderedQueue = await m(Promise.all(promises));\n await m(this.process(renderedQueue, m, log));\n\n log('queue rendered');\n\n if(this.queue.length) {\n log('have new items to render');\n return processQueue();\n } else {\n log('end');\n }\n };\n\n log('setting pause');\n const promise = this.promise = m(pause(0))\n .then(\n () => processQueue().catch((err: ApiError) => {\n if(err !== this.possibleError) {\n log.error('process queue error', err);\n }\n\n throw err;\n }),\n (err) => {\n log('pause has been cleared');\n throw err;\n }\n )\n .finally(() => {\n if(this.promise === promise) {\n this.promise = undefined;\n }\n });\n\n return promise;\n }\n}\n\nexport default class SortedList {\n protected elements: Map;\n protected sorted: Array;\n\n protected getIndex: (element: SortedElement) => PromiseLike | number;\n protected onDelete: (element: SortedElement) => void;\n protected onUpdate: (element: SortedElement) => void;\n protected onSort: (element: SortedElement, idx: number) => void;\n protected onElementCreate: (base: SortedElementBase) => PromiseLike | SortedElement;\n\n protected updateElementWith = (callback: () => void) => callback();\n protected updateListWith = (callback: (canUpdate: boolean | undefined) => void) => callback(true);\n\n protected middleware: MiddlewareHelper;\n\n protected batchProcessor: BatchProcessor;\n\n protected log: ReturnType;\n\n constructor(options: {\n getIndex: SortedList['getIndex'],\n onDelete?: SortedList['onDelete'],\n onUpdate?: SortedList['onUpdate'],\n onSort?: SortedList['onSort'],\n onElementCreate: SortedList['onElementCreate'],\n\n updateElementWith?: SortedList['updateElementWith'],\n updateListWith?: SortedList['updateListWith'],\n\n log?: SortedList['log']\n }) {\n safeAssign(this, options);\n\n this.elements = new Map();\n this.sorted = [];\n this.middleware = getMiddleware();\n\n this.batchProcessor = new BatchProcessor({\n log: this.log,\n process: async(batch, m, log) => {\n // const elements = await Promise.all(batch.map((element) => this.onElementCreate(element)));\n const elements = batch;\n const promises = elements.map((element) => this.update(element.id, element));\n await m(Promise.all(promises));\n }\n });\n }\n\n public clear() {\n this.batchProcessor.clear();\n this.middleware.clean();\n this.elements.clear();\n this.sorted.length = 0;\n }\n\n protected _updateList() {\n this.elements.forEach((element) => {\n this.update(element.id);\n });\n\n if(this.onSort) {\n this.sorted.forEach((element, idx) => {\n this.onSort(element, idx);\n });\n }\n }\n\n public updateList(callback?: (updated: boolean) => void) {\n const middleware = this.middleware.get();\n this.updateListWith((canUpdate) => {\n if(!middleware() || (canUpdate !== undefined && !canUpdate)) {\n callback?.(false);\n return;\n }\n\n this._updateList();\n\n callback?.(true);\n });\n }\n\n public has(id: SortedElementId) {\n return this.elements.has(id);\n }\n\n public get(id: SortedElementId) {\n return this.elements.get(id);\n }\n\n public getAll() {\n return this.elements;\n }\n\n public async add(id: SortedElementId) {\n const element = this.get(id);\n if(element) {\n return;\n // return element;\n }\n\n const base: SortedElementBase = {\n id,\n index: 0\n };\n\n this.elements.set(id, base as SortedElement);\n const createPromise = Promise.resolve(this.onElementCreate(base));\n return this.batchProcessor.addToQueue(createPromise);\n\n // return element;\n }\n\n public delete(id: SortedElementId, noScheduler?: boolean) {\n const element = this.elements.get(id);\n if(!element) {\n return false;\n }\n\n this.elements.delete(id);\n\n const idx = this.sorted.indexOf(element);\n if(idx !== -1) {\n this.sorted.splice(idx, 1);\n }\n\n if(this.onDelete) {\n if(noScheduler) {\n this.onDelete(element);\n } else {\n const middleware = this.middleware.get();\n this.updateElementWith(() => {\n if(!middleware()) {\n return;\n }\n\n this.onDelete(element);\n });\n }\n }\n\n return true;\n }\n\n public async update(id: SortedElementId, element = this.get(id)) {\n if(!element) {\n return;\n }\n\n element.index = await this.getIndex(element);\n if(this.get(id) !== element) {\n return;\n }\n\n this.onUpdate?.(element);\n\n const idx = insertInDescendSortedArray(this.sorted, element, 'index');\n this.onSort(element, idx);\n }\n}\n","const BOM = '';\n// const BOM = 'K';\nexport default BOM;\n","export default function encodeEntities(value: string) {\n return value.replace(/&/g, '&').replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, (value) => {\n const hi = value.charCodeAt(0);\n const low = value.charCodeAt(1);\n return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\n }).replace(/([^\\#-~| |!])/g, (value) => { // non-alphanumeric\n return '&#' + value.charCodeAt(0) + ';';\n }).replace(//g, '>');\n}\n","// credits to https://github.com/sindresorhus/escape-string-regexp/blob/master/index.js\nexport default function escapeRegExp(str: string) {\n return str\n .replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n .replace(/-/g, '\\\\x2d');\n}\n","export default function limitSymbols(str: string, length: number, limitFrom = length + 10) {\n str = str.trim();\n if(str.length > limitFrom) {\n str = str.slice(0, length)/* .replace(/\\s*$/, '') */ + '...';\n }\n\n return str;\n}\n","export default function toHHMMSS(str: string | number, leadZero = false) {\n const sec_num = parseInt(str + '', 10);\n const hours = Math.floor(sec_num / 3600);\n let minutes: any = Math.floor((sec_num - (hours * 3600)) / 60);\n let seconds: any = sec_num - (hours * 3600) - (minutes * 60);\n\n if(hours) leadZero = true;\n if(minutes < 10) minutes = leadZero ? '0' + minutes : minutes;\n if(seconds < 10) seconds = '0' + seconds;\n return (hours ? /* ('0' + hours).slice(-2) */hours + ':' : '') + minutes + ':' + seconds;\n}\n","export default function textToSvgURL(text: string) {\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\n\n // * because iOS Safari doesn't want to eat objectURL\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n resolve(e.target.result as string);\n };\n reader.readAsDataURL(blob);\n });\n // return URL.createObjectURL(blob);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_WORKER} from './context';\n\nexport class WindowSize {\n public width: number;\n public height: number;\n\n constructor() {\n if(IS_WORKER) {\n return;\n }\n\n // @ts-ignore\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\n const set = () => {\n this.width = w.width || w.innerWidth;\n this.height = w.height || w.innerHeight;\n };\n w.addEventListener('resize', set);\n set();\n }\n}\n\nconst windowSize = new WindowSize();\nexport default windowSize;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\n\nimport {AnyToVoidFunction} from '../types';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport DEBUG from '../config/debug';\nimport pause from '../helpers/schedulers/pause';\nimport EventListenerBase from '../helpers/eventListenerBase';\n\nconst eventListener = new EventListenerBase<{\n start: () => void,\n end: () => void\n}>();\nconst ANIMATION_START_EVENT = 'start';\nconst ANIMATION_END_EVENT = 'end';\n\nlet isAnimating = false;\nlet heavyAnimationPromise: CancellablePromise = deferredPromise();\nlet promisesInQueue = 0;\n\nheavyAnimationPromise.resolve();\n\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\n\nexport function dispatchHeavyAnimationEvent(promise: Promise, timeout?: number) {\n if(!isAnimating) {\n heavyAnimationPromise = deferredPromise();\n eventListener.dispatchEvent(ANIMATION_START_EVENT);\n isAnimating = true;\n DEBUG && log('start');\n }\n\n ++promisesInQueue;\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\n\n const promises = [\n timeout !== undefined ? pause(timeout) : undefined,\n promise.finally(() => {})\n ].filter(Boolean);\n\n const perf = performance.now();\n const _heavyAnimationPromise = heavyAnimationPromise;\n Promise.race(promises).then(() => {\n if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted\n return;\n }\n\n --promisesInQueue;\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\n if(promisesInQueue <= 0) {\n onHeavyAnimationEnd();\n }\n });\n\n return heavyAnimationPromise;\n}\n\n(window as any).dispatchHeavyAnimationEvent = dispatchHeavyAnimationEvent;\n\nfunction onHeavyAnimationEnd() {\n if(heavyAnimationPromise.isFulfilled) {\n return;\n }\n\n isAnimating = false;\n promisesInQueue = 0;\n eventListener.dispatchEvent(ANIMATION_END_EVENT);\n heavyAnimationPromise.resolve();\n\n DEBUG && log('end');\n}\n\nexport function interruptHeavyAnimation() {\n onHeavyAnimationEnd();\n}\n\nexport function getHeavyAnimationPromise() {\n return heavyAnimationPromise;\n}\n\nexport default function(\n handleAnimationStart: AnyToVoidFunction,\n handleAnimationEnd: AnyToVoidFunction,\n listenerSetter?: ListenerSetter\n) {\n // useEffect(() => {\n if(isAnimating) {\n handleAnimationStart();\n }\n\n const add = listenerSetter ? listenerSetter.add(eventListener) : eventListener.addEventListener.bind(eventListener);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, eventListener) : eventListener.removeEventListener.bind(eventListener);\n add(ANIMATION_START_EVENT, handleAnimationStart);\n add(ANIMATION_END_EVENT, handleAnimationEnd);\n\n return () => {\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\n remove(ANIMATION_START_EVENT, handleAnimationStart);\n };\n // }, [handleAnimationEnd, handleAnimationStart]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Dialog} from '../lib/appManagers/appMessagesManager';\nimport type {ApiLimitType} from '../lib/mtproto/api_methods';\nimport type {ForumTopic} from '../layer';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../lib/appManagers/appDialogsManager';\nimport rootScope from '../lib/rootScope';\nimport {ButtonMenuItemOptionsVerifiable, ButtonMenuSync} from './buttonMenu';\nimport PopupDeleteDialog from './popups/deleteDialog';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport {toastNew} from './toast';\nimport PopupMute from './popups/mute';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport positionMenu from '../helpers/positionMenu';\nimport contextMenuController from '../helpers/contextMenuController';\nimport {GENERAL_TOPIC_ID} from '../lib/mtproto/mtproto_config';\nimport showLimitPopup from './popups/limit';\n\nexport default class DialogsContextMenu {\n private element: HTMLElement;\n private buttons: ButtonMenuItemOptionsVerifiable[];\n\n private peerId: PeerId;\n private filterId: number;\n private threadId: number;\n private dialog: Dialog | ForumTopic.forumTopic;\n private canManageTopics: boolean;\n\n constructor(private managers: AppManagers) {\n\n }\n\n private init() {\n this.buttons = [{\n icon: 'unread',\n text: 'MarkAsUnread',\n onClick: this.onUnreadClick,\n verify: async() => !this.threadId && !(await this.managers.appMessagesManager.isDialogUnread(this.dialog))\n }, {\n icon: 'readchats',\n text: 'MarkAsRead',\n onClick: this.onUnreadClick,\n verify: () => this.managers.appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'pin',\n text: 'ChatList.Context.Pin',\n onClick: this.onPinClick,\n verify: async() => {\n if(this.threadId && !this.canManageTopics) {\n return false;\n }\n\n const isPinned = this.filterId !== undefined && this.filterId > 1 ?\n (await this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId) :\n !!this.dialog.pFlags?.pinned;\n return !isPinned;\n }\n }, {\n icon: 'unpin',\n text: 'ChatList.Context.Unpin',\n onClick: this.onPinClick,\n verify: async() => {\n if(this.threadId && !this.canManageTopics) {\n return false;\n }\n\n const isPinned = this.filterId !== undefined && this.filterId > 1 ?\n (await this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId) :\n !!this.dialog.pFlags?.pinned;\n return isPinned;\n }\n }, {\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: async() => {\n return this.peerId !== rootScope.myId && !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.dialog.peerId, threadId: this.threadId}));\n }\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: this.onUnmuteClick,\n verify: async() => {\n return this.peerId !== rootScope.myId && (await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.dialog.peerId, threadId: this.threadId}));\n }\n }, {\n icon: 'archive',\n text: 'Archive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 0 && this.peerId !== rootScope.myId\n }, {\n icon: 'unarchive',\n text: 'Unarchive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 1 && this.peerId !== rootScope.myId\n }, {\n icon: 'hide',\n text: 'Hide',\n onClick: this.hideTopic,\n verify: async() => {\n return this.canManageTopics && (this.dialog as ForumTopic.forumTopic).id === GENERAL_TOPIC_ID;\n }\n }, {\n icon: 'lock',\n text: 'CloseTopic',\n onClick: this.toggleTopic,\n verify: () => {\n return this.canManageTopics && !(this.dialog as ForumTopic.forumTopic).pFlags.closed;\n }\n }, {\n icon: 'lockoff',\n text: 'RestartTopic',\n onClick: this.toggleTopic,\n verify: () => {\n return this.canManageTopics && !!(this.dialog as ForumTopic.forumTopic).pFlags.closed;\n }\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: async() => {\n if(this.threadId) {\n if(!this.canManageTopics) {\n return false;\n }\n\n return (this.dialog as ForumTopic.forumTopic).id !== GENERAL_TOPIC_ID;\n }\n\n return true;\n }\n }];\n\n this.element = ButtonMenuSync({buttons: this.buttons});\n this.element.id = 'dialogs-contextmenu';\n this.element.classList.add('contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onArchiveClick = async() => {\n const dialog = await this.managers.appMessagesManager.getDialogOnly(this.peerId);\n if(dialog) {\n this.managers.appMessagesManager.editPeerFolders([dialog.peerId], +!dialog.folder_id);\n }\n };\n\n private hideTopic = () => {\n this.managers.appChatsManager.editForumTopic({\n chatId: this.peerId.toChatId(),\n topicId: this.threadId,\n hidden: true\n });\n };\n\n private toggleTopic = () => {\n this.managers.appChatsManager.editForumTopic({\n chatId: this.peerId.toChatId(),\n topicId: this.threadId,\n closed: !(this.dialog as ForumTopic.forumTopic).pFlags.closed\n });\n };\n\n private onPinClick = () => {\n const {peerId, filterId, threadId} = this;\n this.managers.appMessagesManager.toggleDialogPin({\n peerId,\n filterId,\n topicId: threadId\n }).catch(async(err: ApiError) => {\n if(err.type === 'PINNED_DIALOGS_TOO_MUCH' || err.type === 'PINNED_TOO_MUCH') {\n if(threadId) {\n this.managers.apiManager.getLimit('topicPin').then((limit) => {\n toastNew({langPackKey: 'LimitReachedPinnedTopics', langPackArguments: [limit]});\n });\n } else if(filterId >= 1) {\n toastNew({langPackKey: 'PinFolderLimitReached'});\n } else {\n showLimitPopup('pin');\n }\n }\n });\n };\n\n private onUnmuteClick = () => {\n this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, mute: false, threadId: this.threadId});\n };\n\n private onMuteClick = () => {\n new PopupMute(this.peerId, this.threadId);\n };\n\n private onUnreadClick = async() => {\n const {peerId, dialog} = this;\n if(dialog.unread_count) {\n this.managers.appMessagesManager.readHistory(peerId, dialog.top_message, this.threadId);\n\n if(!this.threadId) {\n this.managers.appMessagesManager.markDialogUnread(peerId, true);\n }\n } else if(!this.threadId) {\n this.managers.appMessagesManager.markDialogUnread(peerId);\n }\n };\n\n private onDeleteClick = () => {\n new PopupDeleteDialog(this.peerId, undefined, undefined, this.threadId);\n };\n\n onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let li: HTMLElement = null;\n\n try {\n li = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n } catch(e) {}\n\n if(!li) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n const r = async() => {\n this.peerId = li.dataset.peerId.toPeerId();\n this.threadId = +li.dataset.threadId || undefined;\n this.dialog = await this.managers.dialogsStorage.getDialogOrTopic(this.peerId, this.threadId);\n this.filterId = this.threadId ? undefined : appDialogsManager.filterId;\n this.canManageTopics = this.threadId ? await this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'manage_topics') : undefined;\n\n await Promise.all(this.buttons.map(async(button) => {\n const good = await button.verify();\n\n button.element.classList.toggle('hide', !good);\n }));\n\n const langPackKey: LangPackKey = this.threadId ? 'Delete' : await this.managers.appPeersManager.getDeleteButtonText(this.peerId);\n // delete button\n this.buttons[this.buttons.length - 1].element.lastChild.replaceWith(i18n(langPackKey));\n\n li.classList.add('menu-open');\n positionMenu(e, this.element);\n contextMenuController.openBtnMenu(this.element, () => {\n li.classList.remove('menu-open');\n this.peerId = this.dialog = this.filterId = this.threadId = this.canManageTopics = undefined;\n });\n };\n\n r();\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../config/app';\nimport DEBUG from '../config/debug';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {LangPackKey, i18n} from '../lib/langPack';\nimport {logger} from '../lib/logger';\nimport rootScope from '../lib/rootScope';\nimport Button from './button';\nimport ProgressivePreloader from './preloader';\nimport SetTransition from './singleTransition';\nimport sessionStorage from '../lib/sessionStorage';\nimport {ConnectionStatus} from '../lib/mtproto/connectionStatus';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport singleInstance from '../lib/mtproto/singleInstance';\n\nexport default class ConnectionStatusComponent {\n public static CHANGE_STATE_DELAY = 1000;\n\n private statusContainer: HTMLElement;\n private statusEl: HTMLElement;\n private statusPreloader: ProgressivePreloader;\n\n private currentLangPackKey: LangPackKey;\n\n private hadConnect = false;\n private retryAt: number;\n private connecting = false;\n private timedOut = false;\n private updating = false;\n\n private log: ReturnType;\n\n private setFirstConnectionTimeout: number;\n private setStateTimeout: number;\n\n constructor(private managers: AppManagers, chatsContainer: HTMLElement) {\n this.log = logger('CS', undefined, undefined);\n\n this.statusContainer = document.createElement('div');\n this.statusContainer.classList.add('connection-status'/* , 'hide' */);\n\n this.statusEl = Button('btn-primary bg-warning connection-status-button', {noRipple: true});\n this.statusPreloader = new ProgressivePreloader({cancelable: false});\n this.statusPreloader.constructContainer({color: 'transparent', bold: true});\n this.statusContainer.append(this.statusEl);\n\n chatsContainer.prepend(this.statusContainer);\n\n rootScope.addEventListener('connection_status_change', (status) => {\n // console.log(status);\n\n this.setConnectionStatus();\n });\n\n rootScope.addEventListener('state_synchronizing', (channelId) => {\n if(!channelId) {\n this.updating = true;\n DEBUG && this.log('updating', this.updating);\n this.setState();\n }\n });\n\n rootScope.addEventListener('state_synchronized', (channelId) => {\n DEBUG && this.log('state_synchronized', channelId);\n if(!channelId) {\n this.updating = false;\n DEBUG && this.log('updating', this.updating);\n this.setState();\n }\n });\n\n this.setFirstConnectionTimeout = window.setTimeout(this.setConnectionStatus, ConnectionStatusComponent.CHANGE_STATE_DELAY + 1e3);\n\n // let bool = true;\n // document.addEventListener('dblclick', () => {\n // this.setConnectionStatus(bool ? (bool = false, ConnectionStatus.Closed) : (bool = true, ConnectionStatus.Connected));\n // });\n }\n\n private setConnectionStatus = (overrideStatus?: ConnectionStatus) => {\n Promise.all([\n sessionStorage.get('dc'),\n rootScope.managers.rootScope.getConnectionStatus()\n ]).then(([baseDcId, connectionStatus]) => {\n if(!baseDcId) {\n baseDcId = App.baseDcId;\n }\n\n if(this.setFirstConnectionTimeout) {\n clearTimeout(this.setFirstConnectionTimeout);\n this.setFirstConnectionTimeout = 0;\n }\n\n const status = connectionStatus['NET-' + baseDcId];\n const online = status && (overrideStatus || status.status) === ConnectionStatus.Connected;\n\n if(this.connecting && online) {\n this.managers.apiUpdatesManager.forceGetDifference();\n }\n\n if(online && !this.hadConnect) {\n this.hadConnect = true;\n }\n\n this.timedOut = status && (overrideStatus || status.status) === ConnectionStatus.TimedOut;\n this.connecting = !online;\n this.retryAt = status && status.retryAt;\n DEBUG && this.log('connecting', this.connecting);\n this.setState();\n });\n };\n\n private setStatusText = (langPackKey: LangPackKey, args?: any[]) => {\n if(this.currentLangPackKey === langPackKey) return;\n this.currentLangPackKey = langPackKey;\n replaceContent(this.statusEl, i18n(langPackKey, args));\n this.statusPreloader.attach(this.statusEl);\n };\n\n private getA(langPackKey: LangPackKey, callback: () => void) {\n const a = document.createElement('a');\n a.classList.add('force-reconnect');\n a.append(i18n(langPackKey));\n attachClickEvent(a, (e) => {\n cancelEvent(e);\n callback();\n });\n\n return a;\n }\n\n private setState = () => {\n if(singleInstance.deactivatedReason) {\n return;\n }\n\n const timeout = ConnectionStatusComponent.CHANGE_STATE_DELAY;\n if(this.connecting) {\n if(this.timedOut) {\n const a = this.getA('ConnectionStatus.ForceReconnect', () => this.managers.networkerFactory.forceReconnect());\n this.setStatusText('ConnectionStatus.TimedOut', [a]);\n } else if(this.hadConnect) {\n if(this.retryAt !== undefined) {\n const timerSpan = document.createElement('span');\n const retryAt = this.retryAt;\n const setTime = () => {\n const now = Date.now();\n timerSpan.innerText = '' + Math.max(0, Math.round((retryAt - now) / 1000));\n if(now > retryAt) {\n clearInterval(interval);\n }\n };\n const interval = setInterval(setTime, 1e3);\n setTime();\n\n const a = this.getA('ConnectionStatus.Reconnect', () => this.managers.networkerFactory.forceReconnectTimeout());\n this.setStatusText('ConnectionStatus.ReconnectIn', [timerSpan, a]);\n } else {\n this.setStatusText('ConnectionStatus.Reconnecting');\n }\n } else {\n this.setStatusText('ConnectionStatus.Waiting');\n }\n } else if(this.updating) {\n this.setStatusText('Updating');\n }\n\n DEBUG && this.log('setState', this.connecting || this.updating);\n window.requestAnimationFrame(() => {\n if(this.setStateTimeout) clearTimeout(this.setStateTimeout);\n\n const cb = () => {\n SetTransition({\n element: this.statusContainer,\n className: 'is-shown',\n forwards: this.connecting || this.updating,\n duration: 200\n });\n this.setStateTimeout = 0;\n DEBUG && this.log('setState: isShown:', this.connecting || this.updating);\n };\n\n this.setStateTimeout = window.setTimeout(cb, timeout);\n // cb();\n /* if(timeout) this.setStateTimeout = window.setTimeout(cb, timeout);\n else cb(); */\n });\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message} from '../layer';\n/* import findUpClassName from \"../helpers/dom/findUpClassName\";\nimport rootScope from \"../lib/rootScope\";\nimport Transition from \"./transition\"; */\n\nexport enum SENDING_STATUS {\n Error = -1,\n Pending,\n Sent,\n Read\n}\n\nexport function getSendingStatus(message: Message.message | Message.messageService) {\n return message.pFlags.is_outgoing ?\n SENDING_STATUS.Pending : (\n message.pFlags.unread ?\n SENDING_STATUS.Sent :\n SENDING_STATUS.Read\n );\n}\n\ntype C = 'check' | 'checks' | 'sending' | 'sendingerror' | 'premium_lock';\nexport function setSendingStatus(\n container: HTMLElement,\n message?: C | Message.message | Message.messageService,\n disableAnimationIfRippleFound?: boolean\n) {\n let className: C;\n if(typeof(message) === 'string') {\n className = message;\n } else if(message?.pFlags.out) {\n if(message.error) {\n className = 'sendingerror';\n } else if(message.pFlags.is_outgoing) {\n className = 'sending';\n } else if(message.pFlags.unread) {\n className = 'check';\n } else {\n className = 'checks';\n }\n }\n\n if(!className) {\n container.textContent = '';\n return;\n }\n\n const iconClassName = 'tgico-' + className;\n const lastElement = container.lastElementChild as HTMLElement;\n if(lastElement && lastElement.classList.contains(iconClassName)) {\n return;\n }\n\n const element = document.createElement('i');\n element.classList.add('sending-status-icon', /* 'transition-item', */ iconClassName);\n container.append(element);\n\n if(lastElement) {\n lastElement.remove();\n }\n\n /* if(!lastElement) {\n element.classList.add('active');\n return;\n }\n\n const select = Transition(container, undefined, 350, () => {\n lastElement.remove();\n }, false, true, false);\n\n let animate = rootScope.settings.animationsEnabled && className !== 'sending' && !lastElement.classList.contains('tgico-sending');\n if(disableAnimationIfRippleFound && animate) {\n const parent = findUpClassName(container, 'rp');\n if(parent.querySelector('.c-ripple__circle') || parent.matches(':hover')) {\n animate = false;\n }\n }\n\n select(element, animate, lastElement); */\n\n /* SetTransition(lastElement, 'is-visible', false, 350, () => {\n // lastElement.remove();\n }, 2);\n SetTransition(element, 'is-visible', true, 350, undefined, 2); */\n}\n","// https://spicyyoghurt.com/tools/easing-functions\nexport default function easeInOutSine(t: number, b: number, c: number, d: number) {\n return t >= d ? b + c : easeInOutSineApply(t / d, c) + b;\n}\n\nexport function easeInOutSineApply(v: number, c: number) {\n return -c / 2 * (Math.cos(Math.PI * v) - 1);\n}\n","export default function roundRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n radius: {[k in 'tl' | 'tr' | 'br' | 'bl']?: number} | number,\n fill?: boolean,\n stroke?: boolean\n) {\n const dpr = ctx.canvas.dpr;\n if(dpr) {\n x *= dpr;\n y *= dpr;\n width *= dpr;\n height *= dpr;\n }\n\n if(typeof(radius) === 'number') {\n if(dpr) radius *= dpr;\n radius = {tl: radius, tr: radius, br: radius, bl: radius};\n } else {\n const defaultRadius = {tl: 0, tr: 0, br: 0, bl: 0};\n for(const side in defaultRadius) {\n // @ts-ignore\n radius[side] = radius[side] ? (dpr ? radius[side] * dpr : radius[side]) : defaultRadius[side];\n }\n }\n\n ctx.beginPath();\n ctx.moveTo(x + radius.tl, y);\n ctx.lineTo(x + width - radius.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\n ctx.lineTo(x + width, y + height - radius.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\n ctx.lineTo(x + radius.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\n ctx.lineTo(x, y + radius.tl);\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {animate} from '../helpers/animation';\nimport customProperties from '../helpers/dom/customProperties';\nimport easeInOutSine from '../helpers/easing/easeInOutSine';\nimport mediaSizes from '../helpers/mediaSizes';\nimport roundRect from '../helpers/canvas/roundRect';\n\nconst DPR = window.devicePixelRatio;\nconst SIZE = 20 * DPR;\nconst MARGIN = 2.5 * DPR;\nconst WIDTH = 2 * DPR;\nconst RADIUS = 1 * DPR;\nconst LENGTH = 3;\n\nconst MIN_HEIGHT = 4;\nconst MAX_HEIGHT = 12;\nconst DURATION = 1000;\n\nexport default function groupCallActiveIcon(isActive = false) {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = SIZE;\n const context = canvas.getContext('2d');\n\n const TOTAL_WIDTH = LENGTH * WIDTH + (LENGTH - 1) * MARGIN;\n const START_X = (SIZE - TOTAL_WIDTH) / 2;\n\n const startTime = Date.now();\n let wasMounted = false;\n // let hadRound = false;\n const renderFrame = () => {\n if(!canvas.isConnected) {\n if(wasMounted) {\n return false;\n }\n } else if(!wasMounted) {\n wasMounted = canvas.isConnected;\n }\n\n const time = Date.now();\n // if(((time - startTime) / DURATION) >= 1) {\n // hadRound = true;\n // }\n\n const progress = easeInOutSine((time - startTime) % DURATION, 0, 1, DURATION);\n\n context.clearRect(0, 0, SIZE, SIZE);\n context.fillStyle = isActive && !mediaSizes.isMobile ? customProperties.getProperty('primary-color') : '#fff';\n\n for(let i = 0; i < LENGTH; ++i) {\n const x = START_X + (i * WIDTH) + (i * MARGIN);\n\n let itemProgress: number;\n if(progress >= .5) {\n itemProgress = i % 2 ? 2 - progress * 2 : (progress - .5) * 2;\n } else {\n itemProgress = i % 2 ? progress * 2 : 1 - progress * 2;\n }\n\n let height = MIN_HEIGHT + (itemProgress * (MAX_HEIGHT - MIN_HEIGHT));\n /* if(!hadRound && i === 1) {\n console.log('call status animation', itemProgress, height, progress, progress >= .5);\n } */\n\n height *= DPR;\n const y = (SIZE - height) / 2;\n\n roundRect(context, x, y, WIDTH, height, RADIUS, true);\n }\n\n return true;\n };\n\n return {\n canvas,\n startAnimation: () => {\n animate(renderFrame);\n renderFrame();\n },\n setActive: (active: boolean) => {\n isActive = active;\n renderFrame();\n }\n };\n}\n","import customProperties from '../dom/customProperties';\nimport clamp from '../number/clamp';\n\nexport default class Shimmer {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private font = '30pt Helvetica';\n private currTime = Date.now();\n private diffTime = 0;\n private spread = 0;\n private paused = false;\n private pausedTime = 0;\n private pauseInterval = 850;\n private lightSource = 0;\n private inc = 0.032;\n private lightSpread = 0.55;\n private animations = ['slide', 'slide', 'slide', 'slide'];\n private currentAnimationIndex = 0;\n private text: string;\n private fillStyle: CanvasRenderingContext2D['fillStyle'];\n\n private keepTime() {\n this.diffTime = Date.now() - this.currTime;\n this.currTime = Date.now();\n }\n\n private cycleAnimation() {\n ++this.currentAnimationIndex;\n if(this.currentAnimationIndex >= this.animations.length) {\n this.currentAnimationIndex = 0;\n }\n }\n\n private animate() {\n const currentAnimation = this.animations[this.currentAnimationIndex];\n if(currentAnimation === 'glow') {\n return this.animateGlow(); // return glow style\n } else if(currentAnimation === 'slide') {\n return this.animateSlide(); // return slide gradient\n } else {\n console.log('unknown animation type: ' + String(currentAnimation));\n }\n }\n\n private animateGlow() {\n var glowEnd = 255,\n rgbStart = 68,\n r = rgbStart,\n g = r,\n b = r,\n increment = 10,\n interval = 800;\n\n return () => {\n var smartInc = increment * (this.diffTime / (1000 / 60));\n if(this.paused) {\n if((Date.now() - this.pausedTime) > interval) {\n r = rgbStart;\n this.cycleAnimation()\n this.paused = false;\n }\n } else {\n r = parseInt('' + (r + smartInc));\n if(r >= glowEnd) {\n this.paused = true;\n this.pausedTime = Date.now()\n }\n }\n return 'rgb('+ r + ',' + r + ',' + r + ')';\n };\n }\n\n private animateSlide(): CanvasGradient {\n var gradient = this.ctx.createLinearGradient(0, 0, this.canvas.width, 0),\n smartInc = this.inc * (this.diffTime / (1000 / 60)),\n lightLeft,\n lightRight,\n lightCenter;\n if(this.paused) {\n if((Date.now() - this.pausedTime) > this.pauseInterval) {\n this.lightSource = -0.6;\n this.cycleAnimation()\n this.paused = false;\n return this.animateSlide();\n }\n } else {\n this.lightSource += smartInc;\n if(this.lightSource > (1 + this.lightSpread)) {\n this.paused = true;\n this.pausedTime = Date.now();\n }\n }\n // lighting positions:\n lightCenter = clamp(this.lightSource, 0, 1);\n lightLeft = clamp(this.lightSource - this.lightSpread, 0, 1);\n lightRight = clamp(this.lightSource + this.lightSpread, 0, 1);\n\n const backgroundColor = customProperties.getProperty('background-color-true');\n const shimmerColor = customProperties.getProperty('surface-color');\n gradient.addColorStop(lightLeft, backgroundColor);\n gradient.addColorStop(lightCenter, shimmerColor);\n gradient.addColorStop(lightRight, backgroundColor);\n\n return gradient;\n }\n\n public settings(dict: Partial<{\n canvas: Shimmer['canvas'],\n fillStyle: Shimmer['fillStyle'],\n font: Shimmer['font'],\n lightSpread: Shimmer['lightSpread'],\n inc: Shimmer['inc'],\n animations: Shimmer['animations'],\n text: Shimmer['text']\n }> = {}) {\n this.canvas = dict.canvas ?? document.createElement('canvas');\n this.ctx = this.canvas.getContext('2d');\n this.font = dict.font ?? this.font;\n this.lightSpread = dict.lightSpread ?? this.lightSpread;\n this.inc = dict.inc ?? this.inc;\n this.animations = dict.animations ?? this.animations;\n this.text = dict.text ?? this.text;\n this.fillStyle = dict.fillStyle;\n\n this.canvas.classList.add('shimmer-canvas');\n }\n\n public on() {\n const {width, height} = this.canvas;\n // record the time we ran:\n this.keepTime();\n // clear and fill the canvas:\n this.ctx.clearRect(0, 0, width, height);\n\n if(this.font) {\n this.ctx.font = this.font;\n }\n\n this.ctx.fillStyle = this.animate() as any;\n this.ctx.fillRect(0, 0, width, height);\n\n if(this.fillStyle) {\n this.ctx.fillStyle = this.fillStyle;\n this.ctx.fillRect(0, 0, width, height);\n }\n\n if(this.text) {\n this.ctx.fillText(this.text, 50, 50);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Scrollable from '../components/scrollable';\nimport rootScope from '../lib/rootScope';\nimport {animate} from './animation';\nimport {drawCircleFromStart} from './canvas/drawCircle';\nimport roundRect from './canvas/roundRect';\nimport Shimmer from './canvas/shimmer';\nimport customProperties from './dom/customProperties';\nimport easeInOutSine from './easing/easeInOutSine';\nimport mediaSizes from './mediaSizes';\n\nexport default class DialogsPlaceholder {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private shimmer: Shimmer;\n private tempId: number;\n private detachTime: number;\n\n private length: number;\n private dialogHeight: number;\n private availableLength: number;\n\n private avatarSize: number;\n private marginVertical: number;\n private totalHeight: number;\n private lineHeight: number;\n private lineBorderRadius: number;\n private lineMarginVertical: number;\n private statusWidth: number;\n private generatedValues: {\n firstLineWidth: number,\n secondLineWidth: number,\n statusWidth: number\n }[];\n\n private getRectFrom: () => DOMRectEditable;\n private onRemove: () => void;\n private blockScrollable: Scrollable;\n\n constructor(sizes: Partial<{\n avatarSize: number,\n marginVertical: number,\n totalHeight: number\n }> = {}) {\n this.shimmer = new Shimmer();\n this.tempId = 0;\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('dialogs-placeholder-canvas');\n this.ctx = this.canvas.getContext('2d');\n\n this.generatedValues = [];\n this.avatarSize = sizes.avatarSize ?? 54;\n this.marginVertical = sizes.marginVertical ?? 9;\n this.totalHeight = sizes.totalHeight ?? (this.avatarSize + this.marginVertical * 2);\n this.lineHeight = 10;\n this.lineBorderRadius = 6;\n this.lineMarginVertical = 8;\n this.statusWidth = 24;\n }\n\n public attach({container, rect, getRectFrom, onRemove, blockScrollable}: {\n container: HTMLElement,\n rect?: ReturnType,\n getRectFrom?: HTMLElement | DialogsPlaceholder['getRectFrom'],\n onRemove?: DialogsPlaceholder['onRemove'],\n blockScrollable?: DialogsPlaceholder['blockScrollable']\n }) {\n const {canvas} = this;\n\n this.onRemove = onRemove;\n this.getRectFrom = typeof(getRectFrom) === 'function' ? getRectFrom : (getRectFrom || container).getBoundingClientRect.bind(getRectFrom || container);\n if(this.blockScrollable = blockScrollable) {\n blockScrollable.container.style.overflowY = 'hidden';\n }\n\n this.updateCanvasSize(rect);\n this.startAnimation();\n container.append(canvas);\n }\n\n public detach(availableLength: number) {\n if(this.detachTime) {\n return;\n }\n\n this.availableLength = availableLength;\n this.detachTime = Date.now();\n\n if(!rootScope.settings.animationsEnabled) {\n this.remove();\n }\n }\n\n public remove() {\n this.stopAnimation();\n\n if(this.canvas.parentElement) {\n this.canvas.remove();\n\n if(this.blockScrollable) {\n this.blockScrollable.container.style.overflowY = '';\n this.blockScrollable = undefined;\n }\n }\n\n this.onRemove?.();\n this.onRemove = undefined;\n }\n\n private updateCanvasSize(rect = this.getRectFrom()) {\n const {canvas} = this;\n const dpr = canvas.dpr = window.devicePixelRatio;\n canvas.width = rect.width * dpr;\n canvas.height = rect.height * dpr;\n canvas.style.width = rect.width + 'px';\n canvas.style.height = rect.height + 'px';\n }\n\n private renderDetachAnimationFrame() {\n const {\n canvas,\n ctx,\n detachTime,\n length,\n availableLength\n } = this;\n\n if(!detachTime) {\n return;\n } else if(!rootScope.settings.animationsEnabled) {\n this.remove();\n return;\n }\n\n const {width} = canvas;\n\n ctx.globalCompositeOperation = 'destination-out';\n\n // ctx.fillStyle = 'rgba(0, 0, 0, 0)';\n // ctx.fillRect(0, 0, width, height);\n\n // const DURATION = 500;\n // const DELAY = DURATION;\n const DURATION = 150;\n const DELAY = 15;\n const elapsedTime = Date.now() - detachTime;\n let completed = true;\n for(let i = 0; i < length; ++i) {\n const delay = availableLength < length && i >= availableLength ? DELAY * (availableLength - 1) : DELAY * i;\n const elapsedRowTime = elapsedTime - delay;\n if(elapsedRowTime <= 0) {\n completed = false;\n continue;\n }\n\n const progress = easeInOutSine(elapsedRowTime, 0, 1, DURATION);\n\n ctx.beginPath();\n ctx.rect(0, this.dialogHeight * i, width, this.dialogHeight);\n ctx.fillStyle = `rgba(0, 0, 0, ${progress})`;\n ctx.fill();\n\n if(progress < 1) {\n completed = false;\n }\n }\n\n // const totalRadius = Math.sqrt(width ** 2 + height ** 2);\n // const gradient = ctx.createRadialGradient(\n // 0, 0, 0,\n // 0, 0, totalRadius);\n // gradient.addColorStop(0, 'rgba(0, 0, 0, 1)');\n // gradient.addColorStop(progress, 'rgba(0, 0, 0, 0)');\n // gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');\n\n // const gradient = ctx.createLinearGradient(0, 0, 0, height);\n // gradient.addColorStop(0, 'rgba(0, 0, 0, 1)');\n // gradient.addColorStop(progress, 'rgba(0, 0, 0, 0)');\n // gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');\n\n // ctx.fillStyle = gradient;\n // ctx.fillRect(0, 0, width, height);\n\n ctx.globalCompositeOperation = 'source-over';\n\n if(completed) {\n this.remove();\n }\n }\n\n private renderFrame() {\n this.shimmer.on();\n this.renderDetachAnimationFrame();\n }\n\n private startAnimation() {\n const {canvas, shimmer} = this;\n const tempId = ++this.tempId;\n const pattern = this.createPattern();\n\n shimmer.settings({\n canvas,\n fillStyle: pattern\n });\n\n const middleware = () => {\n return this.tempId === tempId;\n };\n\n this.renderFrame();\n animate(() => {\n if(!middleware()) {\n return false;\n }\n\n // ! should've removed the loop if animations are disabled\n if(rootScope.settings.animationsEnabled) {\n this.renderFrame();\n }\n\n // ! tempId can be changed during renderFrame\n return middleware();\n });\n\n rootScope.addEventListener('theme_change', this.onThemeChange);\n mediaSizes.addEventListener('resize', this.onResize);\n }\n\n private stopAnimation() {\n ++this.tempId;\n rootScope.removeEventListener('theme_change', this.onThemeChange);\n mediaSizes.removeEventListener('resize', this.onResize);\n }\n\n private onThemeChange = () => {\n this.stopAnimation();\n this.startAnimation();\n };\n\n private onResize = () => {\n const {canvas} = this;\n const {width, height, dpr} = canvas;\n this.updateCanvasSize();\n if(canvas.width === width && canvas.height === height && canvas.dpr === dpr) {\n return;\n }\n\n this.stopAnimation();\n this.startAnimation();\n };\n\n private createPattern() {\n const {canvas, ctx} = this;\n\n const patternCanvas = document.createElement('canvas');\n const patternContext = patternCanvas.getContext('2d');\n const dpr = canvas.dpr;\n patternCanvas.dpr = dpr;\n patternCanvas.width = canvas.width;\n patternCanvas.height = canvas.height;\n\n patternContext.fillStyle = customProperties.getProperty('surface-color');\n patternContext.fillRect(0, 0, patternCanvas.width, patternCanvas.height);\n\n patternContext.fillStyle = '#000';\n patternContext.globalCompositeOperation = 'destination-out';\n\n const dialogHeight = this.dialogHeight = this.totalHeight * dpr;\n const length = this.length = Math.ceil(canvas.height / dialogHeight);\n for(let i = 0; i < length; ++i) {\n this.drawChat(patternContext, i, i * dialogHeight);\n }\n\n return ctx.createPattern(patternCanvas, 'no-repeat');\n }\n\n private drawChat(ctx: CanvasRenderingContext2D, i: number, y: number) {\n let generatedValues = this.generatedValues[i];\n if(!generatedValues) {\n generatedValues = this.generatedValues[i] = {\n firstLineWidth: 40 + Math.random() * 100, // 120\n secondLineWidth: 120 + Math.random() * 130, // 240\n statusWidth: 24 + Math.random() * 16\n };\n }\n\n const {\n firstLineWidth,\n secondLineWidth,\n statusWidth\n } = generatedValues;\n\n const {canvas} = ctx;\n const {dpr} = canvas;\n y /= dpr;\n\n const {\n avatarSize,\n marginVertical,\n lineHeight,\n lineBorderRadius,\n lineMarginVertical\n } = this;\n\n let marginLeft = 17;\n\n if(avatarSize) {\n drawCircleFromStart(ctx, marginLeft, y + marginVertical, avatarSize / 2, true);\n marginLeft += avatarSize + 10;\n }\n\n // 9 + 54 - 10 - 8 = 45 ........ 72 - 9 - 10 - 8\n roundRect(ctx, marginLeft, y + marginVertical + lineMarginVertical, firstLineWidth, lineHeight, lineBorderRadius, true);\n // roundRect(ctx, marginLeft, y + marginVertical + avatarSize - lineHeight - lineMarginVertical, secondLineWidth, lineHeight, lineBorderRadius, true);\n roundRect(ctx, marginLeft, y + this.totalHeight - marginVertical - lineHeight - lineMarginVertical, secondLineWidth, lineHeight, lineBorderRadius, true);\n\n roundRect(ctx, canvas.width / dpr - 24 - statusWidth, y + marginVertical + lineMarginVertical, statusWidth, lineHeight, lineBorderRadius, true);\n }\n}\n","export default function drawCircle(ctx: CanvasRenderingContext2D, x: number, y: number, radius: number, fill?: boolean, stroke?: boolean) {\n const dpr = ctx.canvas.dpr;\n if(dpr) {\n x *= dpr;\n y *= dpr;\n radius *= dpr;\n }\n\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, 2 * Math.PI, false);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\n\nexport function drawCircleFromStart(ctx: CanvasRenderingContext2D, x: number, y: number, radius: number, fill?: boolean, stroke?: boolean) {\n return drawCircle(ctx, x + radius, y + radius, radius, fill, stroke);\n}\n","import rootScope from '../../lib/rootScope';\n\nexport default function shake(element: HTMLElement) {\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n\n const keyframes: Keyframe[] = [\n {transform: 'translateX(0)'},\n {transform: 'translateX(.25rem)'},\n {transform: 'translateX(-.25rem)'},\n {transform: 'translateX(0)'}\n ];\n\n element.animate([...keyframes, ...keyframes, ...keyframes], {\n duration: 300,\n iterations: 1,\n easing: 'ease-in-out'\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDialogFilter as DialogFilter, MyDialogFilter} from '../storages/filters';\nimport type LazyLoadQueue from '../../components/lazyLoadQueue';\nimport type {Dialog, ForumTopic, MyMessage} from './appMessagesManager';\nimport type {MyPhoto} from './appPhotosManager';\nimport type {MyDocument} from './appDocsManager';\nimport type {State} from '../../config/state';\nimport AvatarElement from '../../components/avatar';\nimport DialogsContextMenu from '../../components/dialogsContextMenu';\nimport {horizontalMenu} from '../../components/horizontalMenu';\nimport ripple from '../../components/ripple';\nimport Scrollable, {ScrollableX, SliceSides} from '../../components/scrollable';\nimport {formatDateAccordingToTodayNew} from '../../helpers/date';\nimport {IS_MOBILE_SAFARI, IS_SAFARI} from '../../environment/userAgent';\nimport {logger, LogTypes} from '../logger';\nimport rootScope from '../rootScope';\nimport appImManager, {AppImManager} from './appImManager';\nimport Button from '../../components/button';\nimport SetTransition from '../../components/singleTransition';\nimport {MyDraftMessage} from './appDraftsManager';\nimport DEBUG, {MOUNT_CLASS_TO} from '../../config/debug';\nimport PeerTitle from '../../components/peerTitle';\nimport I18n, {FormatterArguments, i18n, LangPackKey, _i18n} from '../langPack';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport wrapPhoto from '../../components/wrappers/photo';\nimport AppEditFolderTab from '../../components/sidebarLeft/tabs/editFolder';\nimport appSidebarLeft from '../../components/sidebarLeft';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport ConnectionStatusComponent from '../../components/connectionStatus';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport {fastRafConventional, fastRafPromise} from '../../helpers/schedulers';\nimport SortedUserList from '../../components/sortedUserList';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport handleTabSwipe from '../../helpers/dom/handleTabSwipe';\nimport windowSize from '../../helpers/windowSize';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport {setSendingStatus} from '../../components/sendingStatus';\nimport SortedList, {SortedElementBase} from '../../helpers/sortedList';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, NULL_PEER_ID, REAL_FOLDERS, REAL_FOLDER_ID} from '../mtproto/mtproto_config';\nimport groupCallActiveIcon from '../../components/groupCallActiveIcon';\nimport {Chat, Message, NotifyPeer} from '../../layer';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport appNavigationController, {NavigationItem} from '../../components/appNavigationController';\nimport appMediaPlaybackController from '../../components/appMediaPlaybackController';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {AppManagers} from './managers';\nimport appSidebarRight from '../../components/sidebarRight';\nimport PopupElement from '../../components/popups';\nimport choosePhotoSize from './utils/photos/choosePhotoSize';\nimport wrapEmojiText from '../richTextProcessor/wrapEmojiText';\nimport wrapMessageForReply from '../../components/wrappers/messageForReply';\nimport isMessageRestricted from './utils/messages/isMessageRestricted';\nimport getMediaFromMessage from './utils/messages/getMediaFromMessage';\nimport getMessageSenderPeerIdOrName from './utils/messages/getMessageSenderPeerIdOrName';\nimport wrapStickerEmoji from '../../components/wrappers/stickerEmoji';\nimport getDialogIndexKey from './utils/dialogs/getDialogIndexKey';\nimport getProxiedManagers from './getProxiedManagers';\nimport getDialogIndex from './utils/dialogs/getDialogIndex';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport wrapPeerTitle from '../../components/wrappers/peerTitle';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport appDownloadManager from './appDownloadManager';\nimport groupCallsController from '../calls/groupCallsController';\nimport callsController from '../calls/callsController';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport noop from '../../helpers/noop';\nimport DialogsPlaceholder from '../../helpers/dialogsPlaceholder';\nimport pause from '../../helpers/schedulers/pause';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {getMiddleware, MiddlewareHelper} from '../../helpers/middleware';\nimport makeError from '../../helpers/makeError';\nimport getUnsafeRandomInt from '../../helpers/number/getUnsafeRandomInt';\nimport Row, {RowMediaSizeType} from '../../components/row'\nimport SettingSection from '../../components/settingSection';\nimport {SliderSuperTabEventable} from '../../components/sliderTab';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport ButtonMenuToggle from '../../components/buttonMenuToggle';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport AppSharedMediaTab from '../../components/sidebarRight/tabs/sharedMedia';\nimport {dispatchHeavyAnimationEvent} from '../../hooks/useHeavyAnimationCheck';\nimport AppArchivedTab from '../../components/sidebarLeft/tabs/archivedTab';\nimport shake from '../../helpers/dom/shake';\nimport AppEditTopicTab from '../../components/sidebarRight/tabs/editTopic';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport const DIALOG_LIST_ELEMENT_TAG = 'A';\n\nexport type DialogDom = {\n avatarEl: AvatarElement,\n captionDiv: HTMLElement,\n titleSpan: HTMLSpanElement,\n titleSpanContainer: HTMLSpanElement,\n statusSpan: HTMLSpanElement,\n lastTimeSpan: HTMLSpanElement,\n unreadBadge?: HTMLElement,\n unreadAvatarBadge?: HTMLElement,\n callIcon?: ReturnType,\n mentionsBadge?: HTMLElement,\n lastMessageSpan: HTMLSpanElement,\n containerEl: HTMLElement,\n listEl: HTMLElement,\n subtitleEl: HTMLElement,\n\n setLastMessagePromise?: CancellablePromise,\n setUnreadMessagePromise?: CancellablePromise\n};\n\ninterface SortedDialog extends SortedElementBase {\n dom: DialogDom,\n dialogElement: DialogElement\n}\n\nfunction setPromiseMiddleware}, K extends keyof T>(obj: T, key: K) {\n const oldPromise: CancellablePromise = obj[key] as any;\n oldPromise?.reject();\n\n // @ts-ignore\n const deferred = obj[key] = deferredPromise();\n deferred.catch(() => {}).finally(() => {\n if((obj[key] as any) === deferred) {\n delete obj[key];\n }\n });\n\n const middleware = middlewarePromise(() => (obj[key] as any) === deferred);\n return {deferred, middleware};\n}\n\nconst BADGE_SIZE = 22;\nconst BADGE_TRANSITION_TIME = 250;\n\nclass SortedDialogList extends SortedList {\n public managers: AppManagers;\n public log: ReturnType;\n public list: HTMLElement;\n public indexKey: ReturnType;\n public onListLengthChange: () => void;\n public forumPeerId: PeerId;\n\n constructor(options: {\n managers: SortedDialogList['managers'],\n log?: SortedDialogList['log'],\n list: SortedDialogList['list'],\n indexKey: SortedDialogList['indexKey'],\n onListLengthChange?: SortedDialogList['onListLengthChange'],\n forumPeerId?: SortedDialogList['forumPeerId']\n }) {\n super({\n getIndex: (element) => this.managers.dialogsStorage.getDialogIndex(this.forumPeerId ?? element.id, this.indexKey, this.forumPeerId ? element.id : undefined),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange?.();\n },\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength) {\n this.onListLengthChange?.();\n }\n },\n onElementCreate: async(base) => {\n const loadPromises: Promise[] = [];\n\n const dialogElement = appDialogsManager.addListDialog({\n peerId: this.forumPeerId ?? base.id,\n loadPromises,\n isBatch: true,\n threadId: this.forumPeerId ? base.id : undefined,\n isMainList: this.indexKey === 'index_0'\n });\n (base as SortedDialog).dom = dialogElement.dom;\n (base as SortedDialog).dialogElement = dialogElement;\n\n await Promise.all(loadPromises);\n return base as SortedDialog;\n },\n updateElementWith: fastRafConventional,\n log: options.log\n });\n\n safeAssign(this, options);\n }\n\n public clear() {\n this.list.replaceChildren();\n super.clear();\n }\n}\n\nexport type DialogElementSize = RowMediaSizeType;\ntype DialogElementOptions = {\n peerId: PeerId,\n rippleEnabled?: boolean,\n onlyFirstName?: boolean,\n meAsSaved?: boolean,\n avatarSize?: RowMediaSizeType,\n autonomous?: boolean,\n loadPromises?: Promise[],\n fromName?: string,\n noIcons?: boolean,\n threadId?: number,\n wrapOptions?: WrapSomethingOptions,\n isMainList?: boolean\n};\nclass DialogElement extends Row {\n public dom: DialogDom;\n\n constructor({\n peerId,\n rippleEnabled = true,\n onlyFirstName = false,\n meAsSaved = true,\n avatarSize = 'bigger',\n autonomous,\n loadPromises,\n fromName,\n noIcons,\n threadId,\n wrapOptions = {},\n isMainList\n }: DialogElementOptions) {\n super({\n clickable: true,\n noRipple: !rippleEnabled,\n havePadding: !threadId,\n title: true,\n titleRightSecondary: true,\n subtitle: true,\n subtitleRight: true,\n noWrap: true,\n asLink: true\n });\n\n this.subtitleRight.remove();\n\n const avatarEl = threadId ? undefined : new AvatarElement();\n if(avatarEl) {\n const avatarSizeMap: {[k in DialogElementSize]?: number} = {\n bigger: 54,\n abitbigger: 42,\n small: 32\n };\n const s = avatarSizeMap[avatarSize];\n avatarEl.classList.add('dialog-avatar', 'avatar-' + s);\n avatarEl.updateWithOptions({\n loadPromises,\n lazyLoadQueue: wrapOptions.lazyLoadQueue,\n isDialog: !!meAsSaved,\n peerId,\n peerTitle: fromName\n });\n\n this.applyMediaElement(avatarEl, avatarSize);\n }\n\n const captionDiv = this.container;\n\n const titleSpanContainer = this.title;\n titleSpanContainer.classList.add('user-title');\n\n this.titleRow.classList.add('dialog-title');\n\n const peerTitle = new PeerTitle();\n const peerTitlePromise = peerTitle.update({\n peerId,\n fromName,\n dialog: meAsSaved,\n onlyFirstName,\n withIcons: !noIcons,\n threadId: threadId\n });\n\n loadPromises?.push(peerTitlePromise);\n titleSpanContainer.append(peerTitle.element);\n\n // for muted icon\n titleSpanContainer.classList.add('tgico'); // * эта строка будет актуальна только для !container, но ладно\n\n // const titleIconsPromise = generateTitleIcons(peerId).then((elements) => {\n // titleSpanContainer.append(...elements);\n // });\n\n // if(loadPromises) {\n // loadPromises.push(titleIconsPromise);\n // }\n // }\n\n const span = this.subtitle;\n // span.classList.add('user-last-message');\n\n const li = this.container;\n li.classList.add('chatlist-chat', 'chatlist-chat-' + avatarSize);\n if(!autonomous) {\n (li as HTMLAnchorElement).href = '#' + peerId;\n }\n // if(rippleEnabled) {\n // ripple(li);\n // }\n\n if(avatarSize === 'bigger') {\n this.container.classList.add('row-big');\n } else if(avatarSize === 'small') {\n this.container.classList.add('row-small');\n }\n\n li.dataset.peerId = '' + peerId;\n if(threadId) {\n li.dataset.threadId = '' + threadId;\n }\n\n const statusSpan = document.createElement('span');\n statusSpan.classList.add('message-status', 'sending-status'/* , 'transition', 'reveal' */);\n\n const lastTimeSpan = document.createElement('span');\n lastTimeSpan.classList.add('message-time');\n\n const rightSpan = this.titleRight;\n rightSpan.classList.add('dialog-title-details');\n rightSpan.append(statusSpan, lastTimeSpan);\n\n this.subtitleRow.classList.add('dialog-subtitle');\n\n const dom: DialogDom = this.dom = {\n avatarEl,\n captionDiv,\n titleSpan: peerTitle.element,\n titleSpanContainer,\n statusSpan,\n lastTimeSpan,\n lastMessageSpan: span,\n containerEl: li,\n listEl: li,\n subtitleEl: this.subtitleRow\n };\n\n if(!autonomous) {\n (li as any).dialogDom = dom;\n\n const chat = appImManager.chat;\n if(chat && appImManager.isSamePeer(chat, {peerId, threadId: threadId, type: 'chat'})) {\n appDialogsManager.setDialogActive(li, true);\n }\n\n if(isMainList && appDialogsManager.forumTab?.peerId === peerId && !threadId) {\n li.classList.add('is-forum-open');\n }\n }\n }\n\n public createUnreadBadge() {\n if(this.dom.unreadBadge) return;\n const badge = this.dom.unreadBadge = document.createElement('div');\n badge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE}`;\n this.dom.subtitleEl.append(badge);\n }\n\n public createUnreadAvatarBadge() {\n if(this.dom.unreadAvatarBadge) return;\n const badge = this.dom.unreadAvatarBadge = document.createElement('div');\n badge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE} avatar-badge`;\n this.dom.listEl.append(badge);\n }\n\n public createMentionsBadge() {\n if(this.dom.mentionsBadge) return;\n const badge = this.dom.mentionsBadge = document.createElement('div');\n badge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE} mention mention-badge`;\n badge.innerText = '@';\n this.dom.lastMessageSpan.after(badge);\n }\n\n public toggleBadgeByKey(\n key: Extract,\n hasBadge: boolean,\n justCreated: boolean,\n batch?: boolean\n ) {\n SetTransition({\n element: this.dom[key],\n className: 'is-visible',\n forwards: hasBadge,\n duration: batch ? 0 : BADGE_TRANSITION_TIME,\n onTransitionEnd: hasBadge ? undefined : () => {\n this.dom[key].remove();\n delete this.dom[key];\n },\n useRafs: !justCreated || !isInDOM(this.dom[key]) ? 2 : 0\n });\n }\n}\n\nclass ForumTab extends SliderSuperTabEventable {\n private rows: HTMLElement;\n private subtitle: HTMLElement;\n\n public peerId: PeerId;\n private firstTime: boolean;\n\n private log: ReturnType;\n\n private xd: Some3;\n\n public async toggle(value: boolean) {\n if(this.init2) {\n await this.init2();\n }\n\n SetTransition({\n element: this.container,\n className: 'is-visible',\n forwards: value,\n duration: 300,\n onTransitionEnd: !value ? () => {\n this.onCloseAfterTimeout();\n } : undefined,\n useRafs: this.firstTime ? (this.firstTime = undefined, 2) : undefined\n });\n }\n\n public init(options: {\n peerId: PeerId,\n managers: AppManagers\n }) {\n safeAssign(this, options);\n\n this.log = logger('FORUM');\n this.firstTime = true;\n this.container.classList.add('topics-container');\n\n const isFloating = !this.slider;\n if(isFloating) {\n this.closeBtn.classList.replace('tgico-left', 'tgico-close');\n this.container.classList.add('active', 'is-floating');\n\n attachClickEvent(this.closeBtn, () => {\n appDialogsManager.toggleForumTab(undefined, this);\n }, {listenerSetter: this.listenerSetter});\n }\n\n this.rows = document.createElement('div');\n this.rows.classList.add('sidebar-header__rows');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('sidebar-header__subtitle');\n\n this.title.replaceWith(this.rows);\n this.rows.append(this.title, this.subtitle);\n\n const list = appDialogsManager.createChatList();\n appDialogsManager.setListClickListener(list, null, true);\n this.scrollable.append(list);\n\n this.xd = new Some3(this.peerId, isFloating ? 80 : 0);\n this.xd.scrollable = this.scrollable;\n this.xd.sortedList = new SortedDialogList({\n managers: this.managers,\n log: this.log,\n list,\n indexKey: 'index_0',\n forumPeerId: this.peerId\n });\n this.xd.bindScrollable();\n\n const getOptionsForMessages = (): Parameters[0] => {\n return {\n peerId: this.peerId,\n type: 'chat'\n };\n };\n\n const btnMenu = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [{\n icon: 'info',\n text: 'ForumTopic.Context.Info',\n onClick: async() => {\n const tab = appSidebarLeft.createTab(AppSharedMediaTab, true);\n tab.isFirst = true;\n tab.setPeer(this.peerId);\n (await tab.fillProfileElements())();\n tab.loadSidebarMedia(true);\n tab.open();\n }\n }, {\n icon: 'message',\n text: 'ForumTopic.Context.ShowAsMessages',\n onClick: () => {\n const chat = appImManager.chat;\n appImManager[chat?.peerId === this.peerId ? 'setPeer' : 'setInnerPeer'](getOptionsForMessages());\n },\n verify: () => {\n const chat = appImManager.chat;\n return !chat || !appImManager.isSamePeer(chat, getOptionsForMessages());\n }\n }, {\n icon: 'adduser',\n text: 'ForumTopic.Context.AddMember',\n onClick: () => {},\n verify: () => false && this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users')\n }, {\n icon: 'add',\n text: 'ForumTopic.Context.New',\n onClick: () => {\n appSidebarLeft.createTab(AppEditTopicTab).open(this.peerId);\n },\n separator: true,\n verify: () => this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'manage_topics')\n }]\n });\n\n this.listenerSetter.add(rootScope)('history_reload', (peerId) => {\n if(this.peerId !== peerId) {\n return;\n }\n\n this.xd.fullReset();\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.peerId !== chatId.toPeerId(true)) {\n return;\n }\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n if(!(chat as Chat.channel).pFlags.forum) {\n appDialogsManager.toggleForumTab(undefined, this);\n }\n });\n\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.container,\n onSwipe: () => {\n appDialogsManager.toggleForumTab(undefined, this);\n },\n middleware: this.middlewareHelper.get()\n });\n }\n\n this.header.append(btnMenu);\n\n if(!isFloating) {\n return this.init2();\n }\n }\n\n public async init2() {\n this.init2 = undefined;\n\n const middleware = this.middlewareHelper.get();\n const peerId = this.peerId;\n\n this.managers.apiUpdatesManager.subscribeToChannelUpdates(this.peerId.toChatId());\n middleware.onDestroy(() => {\n this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(this.peerId.toChatId());\n });\n\n const peerTitlePromise = wrapPeerTitle({\n peerId,\n dialog: true,\n wrapOptions: {middleware}\n });\n\n const setStatusPromise = appImManager.setPeerStatus({\n peerId,\n element: this.subtitle,\n needClear: true,\n useWhitespace: false,\n middleware,\n noTyping: true\n });\n\n // this.managers.dialogsStorage.getForumTopics(this.peerId).then((messagesForumTopics) => {\n // console.log(messagesForumTopics);\n\n // const promises = messagesForumTopics.topics.map((forumTopic) => {\n // return this.sortedDialogList.add(forumTopic.id);\n // });\n\n // return Promise.all(promises);\n // }).then(() => {\n // this.dialogsPlaceholder.detach(this.sortedDialogList.getAll().size);\n // });\n\n return Promise.all([\n peerTitlePromise,\n setStatusPromise,\n this.xd.onChatsScroll().then((loadResult) => {\n return loadResult.cached ? loadResult.renderPromise : undefined\n })\n ]).then(([\n peerTitle,\n setStatus,\n _\n ]) => {\n if(!middleware()) {\n return;\n }\n\n this.title.append(peerTitle);\n setStatus?.();\n });\n }\n\n public onCloseAfterTimeout() {\n super.onCloseAfterTimeout();\n this.xd.destroy();\n }\n}\n\nconst NOT_IMPLEMENTED_ERROR = new Error('not implemented');\n\ntype DialogKey = Parameters[0];\nclass Some {\n public sortedList: SortedDialogList;\n public scrollable: Scrollable;\n public loadedDialogsAtLeastOnce: boolean;\n public needPlaceholderAtFirstTime: boolean;\n protected offsets: {top: number, bottom: number};\n protected indexKey: ReturnType;\n protected sliceTimeout: number;\n protected managers: AppManagers;\n protected listenerSetter: ListenerSetter;\n protected loadDialogsPromise: Promise<{cached: boolean, renderPromise: Some2['loadDialogsRenderPromise']}>;\n protected loadDialogsRenderPromise: Promise;\n protected placeholder: DialogsPlaceholder;\n protected log: ReturnType;\n protected placeholderOptions: ConstructorParameters[0];\n\n constructor() {\n this.log = logger('CL');\n this.offsets = {top: 0, bottom: 0};\n this.managers = rootScope.managers;\n this.listenerSetter = new ListenerSetter();\n }\n\n public getOffsetIndex(side: 'top' | 'bottom') {\n return {index: this.scrollable.loadedAll[side] ? 0 : this.offsets[side]};\n }\n\n protected isDialogMustBeInViewport(dialog: T) {\n // return true;\n const topOffset = this.getOffsetIndex('top');\n const bottomOffset = this.getOffsetIndex('bottom');\n\n if(!topOffset.index && !bottomOffset.index) {\n return true;\n }\n\n const index = getDialogIndex(dialog, this.indexKey);\n return (!topOffset.index || index <= topOffset.index) &&\n (!bottomOffset.index || index >= bottomOffset.index);\n }\n\n public setIndexKey(indexKey: Some['indexKey']) {\n this.indexKey = indexKey;\n this.sortedList.indexKey = indexKey;\n }\n\n protected deleteDialogByKey(key: DialogKey) {\n this.sortedList.delete(key);\n }\n\n public deleteDialog(dialog: T) {\n return this.deleteDialogByKey(this.getDialogKey(dialog));\n }\n\n public updateDialog(dialog: T) {\n const key = this.getDialogKey(dialog);\n if(this.isDialogMustBeInViewport(dialog)) {\n if(!this.sortedList.has(key) && this.loadedDialogsAtLeastOnce) {\n this.sortedList.add(key);\n return;\n }\n } else {\n this.deleteDialog(dialog);\n return;\n }\n\n const dialogElement = this.getDialogElement(key);\n if(dialogElement) {\n appDialogsManager.setLastMessageN({\n dialog,\n dialogElement,\n setUnread: true\n });\n this.sortedList.update(key);\n }\n }\n\n public onChatsRegularScroll = () => {\n // return;\n\n if(this.sliceTimeout) clearTimeout(this.sliceTimeout);\n this.sliceTimeout = window.setTimeout(() => {\n this.sliceTimeout = undefined;\n\n if(!this.sortedList.list.childElementCount || appDialogsManager.processContact) {\n return;\n }\n\n /* const observer = new IntersectionObserver((entries) => {\n const\n });\n\n Array.from(this.chatList.children).forEach((el) => {\n observer.observe(el);\n }); */\n\n fastRafConventional(() => {\n const perf = performance.now();\n\n const scrollTopWas = this.scrollable.scrollTop;\n\n const firstElementChild = this.sortedList.list.firstElementChild;\n const rectContainer = this.scrollable.container.getBoundingClientRect();\n const rectTarget = firstElementChild.getBoundingClientRect();\n const children = Array.from(this.scrollable.splitUp.children) as HTMLElement[];\n\n // const padding = 8;\n // const offsetTop = this.folders.container.offsetTop;\n let offsetTop = this.scrollable.splitUp.offsetTop;\n if(offsetTop && scrollTopWas < offsetTop) offsetTop -= scrollTopWas;\n // const offsetTop = scrollTopWas < padding ? padding - scrollTopWas : 0;\n const firstY = rectContainer.y + offsetTop;\n const lastY = rectContainer.y/* - 8 */; // 8px - .chatlist padding-bottom\n\n const firstElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.ceil(firstY + 1)), firstElementChild.tagName) as HTMLElement;\n const lastElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.floor(lastY + rectContainer.height - 1)), firstElementChild.tagName) as HTMLElement;\n\n // alert('got element:' + rect.y);\n\n if(!firstElement || !lastElement) {\n return;\n }\n\n // alert('got element:' + !!firstElement);\n\n const firstElementRect = firstElement.getBoundingClientRect();\n const elementOverflow = firstElementRect.y - firstY;\n\n const sliced: HTMLElement[] = [];\n const firstIndex = children.indexOf(firstElement);\n const lastIndex = children.indexOf(lastElement);\n\n const saveLength = 10;\n\n const sliceFromStart = IS_SAFARI ? [] : children.slice(0, Math.max(0, firstIndex - saveLength));\n const sliceFromEnd = children.slice(lastIndex + saveLength);\n\n /* if(sliceFromStart.length !== sliceFromEnd.length) {\n console.log('not equal', sliceFromStart.length, sliceFromEnd.length);\n }\n\n if(sliceFromStart.length > sliceFromEnd.length) {\n const diff = sliceFromStart.length - sliceFromEnd.length;\n sliceFromStart.splice(0, diff);\n } else if(sliceFromEnd.length > sliceFromStart.length) {\n const diff = sliceFromEnd.length - sliceFromStart.length;\n sliceFromEnd.splice(sliceFromEnd.length - diff, diff);\n } */\n\n if(sliceFromStart.length) {\n this.scrollable.loadedAll.top = false;\n }\n\n if(sliceFromEnd.length) {\n this.scrollable.loadedAll.bottom = false;\n }\n\n sliced.push(...sliceFromStart);\n sliced.push(...sliceFromEnd);\n\n sliced.forEach((el) => {\n this.deleteDialogByKey(this.getDialogKeyFromElement(el));\n });\n\n this.setOffsets();\n\n // this.log('[slicer] elements', firstElement, lastElement, rect, sliced, sliceFromStart.length, sliceFromEnd.length);\n\n // this.log('[slicer] reset scrollTop', this.scroll.scrollTop, firstElement.offsetTop, firstElementRect.y, rect.y, elementOverflow);\n\n // alert('left length:' + children.length);\n\n this.scrollable.scrollTop = firstElement.offsetTop - elementOverflow;\n\n this.log('slice time', performance.now() - perf);\n /* const firstElementRect = firstElement.getBoundingClientRect();\n const scrollTop = */\n\n // this.scroll.scrollIntoView(firstElement, false);\n });\n }, 200);\n };\n\n public onChatsScrollTop() {\n return this.onChatsScroll('top');\n };\n\n public onChatsScroll(side: SliceSides = 'bottom') {\n return this.loadDialogs(side);\n };\n\n public createPlaceholder(): DialogsPlaceholder {\n const placeholder = this.placeholder = new DialogsPlaceholder(this.placeholderOptions);\n const getRectFrom = this.getRectFromForPlaceholder();\n placeholder.attach({\n container: this.sortedList.list.parentElement,\n getRectFrom,\n onRemove: () => {\n if(this.placeholder === placeholder) {\n this.placeholder = undefined;\n }\n },\n blockScrollable: this.scrollable\n });\n\n return placeholder;\n }\n\n public loadDialogs(side: SliceSides) {\n /* if(testScroll) {\n return;\n } */\n\n const log = this.log.bindPrefix('load-' + getUnsafeRandomInt(1000, 9999));\n log('try', side);\n\n if(this.loadDialogsPromise || this.loadDialogsRenderPromise/* || 1 === 1 */) return this.loadDialogsPromise;\n else if(this.scrollable.loadedAll[side]) {\n return Promise.resolve({\n cached: true,\n renderPromise: Promise.resolve()\n });\n }\n\n log.warn('start', side);\n const middlewareError = makeError('MIDDLEWARE');\n\n const cachedInfoPromise = deferredPromise();\n const renderPromise = new Promise(async(resolve, reject) => {\n const chatList = this.sortedList.list;\n\n let placeholder = this.placeholder;\n try {\n const getConversationsResult = this.loadDialogsInner(side);\n const a = await getConversationsResult;\n\n if(\n !chatList.childElementCount &&\n !placeholder &&\n (\n (!this.loadedDialogsAtLeastOnce && this.needPlaceholderAtFirstTime) ||\n !a.cached\n )\n ) {\n if(this.loadDialogsRenderPromise !== renderPromise) {\n throw middlewareError;\n }\n\n placeholder = this.createPlaceholder();\n\n cachedInfoPromise.resolve(false);\n }\n\n const result = await a.result;\n // await pause(5000);\n if(this.loadDialogsRenderPromise !== renderPromise) {\n throw middlewareError;\n }\n\n cachedInfoPromise.resolve(a.cached);\n\n // console.timeEnd('getDialogs time');\n\n // * loaded all\n // if(!result.dialogs.length || chatList.childElementCount === result.count) {\n // !result.dialogs.length не подходит, так как при супердревном диалоге getConversations его не выдаст.\n // if(chatList.childElementCount === result.count) {\n if(side === 'bottom') {\n if(result.isEnd) {\n this.scrollable.loadedAll[side] = true;\n }\n } else if(result.isTopEnd) {\n this.scrollable.loadedAll[side] = true;\n }\n\n const length = result.dialogs.length;\n log(`will render ${length} dialogs`);\n if(length) {\n const dialogs = side === 'top' ? result.dialogs.slice().reverse() : result.dialogs;\n\n const loadPromises = dialogs.map((dialog) => {\n return this.sortedList.add(this.getDialogKey(dialog as T));\n });\n\n await Promise.all(loadPromises).catch();\n if(this.loadDialogsRenderPromise !== renderPromise) {\n throw middlewareError;\n }\n }\n\n const offsetDialog = result.dialogs[side === 'top' ? 0 : length - 1];\n if(offsetDialog) {\n this.offsets[side] = getDialogIndex(offsetDialog, this.indexKey);\n }\n\n // don't set it before - no need to fire length change with every dialog\n this.loadedDialogsAtLeastOnce = true;\n appDialogsManager.onListLengthChange();\n\n log('getDialogs', result, chatList.childElementCount);\n\n setTimeout(() => {\n this.scrollable.onScroll();\n }, 0);\n\n if(placeholder) {\n // await pause(500);\n placeholder.detach(chatList.childElementCount);\n }\n } catch(err) {\n if((err as ApiError)?.type !== 'MIDDLEWARE') {\n log.error(err);\n }\n\n reject(err);\n cachedInfoPromise.reject(err);\n return;\n }\n\n resolve();\n }).finally(() => {\n if(this.loadDialogsRenderPromise === renderPromise) {\n log('end');\n this.loadDialogsRenderPromise = undefined;\n } else {\n log('has been cleared');\n }\n });\n\n this.loadDialogsRenderPromise = renderPromise;\n const loadDialogsPromise = this.loadDialogsPromise = cachedInfoPromise.then((cached) => {\n return {\n cached,\n renderPromise\n };\n }).finally(() => {\n if(this.loadDialogsPromise === loadDialogsPromise) {\n this.loadDialogsPromise = undefined;\n }\n });\n\n return loadDialogsPromise;\n }\n\n public async setOffsets() {\n const chatList = this.sortedList.list;\n const [firstDialog, lastDialog] = await Promise.all([\n this.getDialogFromElement(chatList.firstElementChild as HTMLElement),\n this.getDialogFromElement(chatList.lastElementChild as HTMLElement)\n ]);\n\n const {indexKey} = this;\n this.offsets.top = getDialogIndex(firstDialog, indexKey);\n this.offsets.bottom = getDialogIndex(lastDialog, indexKey);\n }\n\n public getDialogKey(dialog: T): DialogKey {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public getDialogKeyFromElement(element: HTMLElement): DialogKey {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public getRectFromForPlaceholder(): Parameters[0]['getRectFrom'] {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public getDialogFromElement(element: HTMLElement): Promise {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public loadDialogsInner(side: SliceSides): ReturnType {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public async setTyping(dialog: T) {\n const key = this.getDialogKey(dialog);\n const dom = this.getDialogDom(key);\n if(!dom) {\n return;\n }\n\n const oldTypingElement = dom.lastMessageSpan.querySelector('.peer-typing-container') as HTMLElement;\n const newTypingElement = await appImManager.getPeerTyping(\n dialog.peerId,\n oldTypingElement,\n dialog._ === 'forumTopic' ? dialog.id : undefined\n );\n if(!oldTypingElement && newTypingElement) {\n replaceContent(dom.lastMessageSpan, newTypingElement);\n dom.lastMessageSpan.classList.add('user-typing');\n }\n }\n\n public unsetTyping(dialog: T) {\n const key = this.getDialogKey(dialog);\n const dialogElement = this.getDialogElement(key);\n if(!dialogElement) {\n return;\n }\n\n dialogElement.dom.lastMessageSpan.classList.remove('user-typing');\n appDialogsManager.setLastMessageN({\n dialog,\n lastMessage: null,\n dialogElement,\n setUnread: null\n });\n }\n\n public getDialogDom(key: DialogKey) {\n // return this.doms[peerId];\n const element = this.sortedList.get(key);\n return element?.dom;\n }\n\n public getDialogElement(key: DialogKey) {\n const element = this.sortedList.get(key);\n return element?.dialogElement;\n }\n\n public bindScrollable() {\n this.scrollable.container.addEventListener('scroll', this.onChatsRegularScroll);\n this.scrollable.onScrolledTop = this.onChatsScrollTop.bind(this);\n this.scrollable.onScrolledBottom = this.onChatsScroll.bind(this);\n this.scrollable.setVirtualContainer(this.sortedList.list);\n }\n\n public clear() {\n this.sortedList.clear();\n this.placeholder?.remove();\n }\n\n public reset() {\n this.scrollable.loadedAll.top = true;\n this.scrollable.loadedAll.bottom = false;\n this.offsets.top = this.offsets.bottom = 0;\n this.loadDialogsRenderPromise = undefined;\n this.loadDialogsPromise = undefined;\n }\n\n public fullReset() {\n this.reset();\n this.clear();\n return this.onChatsScroll();\n }\n\n public destroy() {\n this.clear();\n this.scrollable.destroy();\n this.listenerSetter.removeAll();\n }\n}\n\nclass Some3 extends Some {\n constructor(public peerId: PeerId, public paddingX: number) {\n super();\n\n this.placeholderOptions = {\n avatarSize: 0,\n marginVertical: 5,\n totalHeight: 64\n };\n\n this.listenerSetter.add(rootScope)('peer_typings', async({peerId, threadId, typings}) => {\n if(!threadId || this.peerId !== peerId) {\n return;\n }\n\n const dialog = await this.managers.dialogsStorage.getForumTopic(peerId, threadId);\n\n if(!dialog) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n for(const [peerId, {dialog, topics}] of dialogs) {\n if(peerId !== this.peerId || !topics?.size) {\n continue;\n }\n\n topics.forEach((forumTopic) => {\n this.updateDialog(forumTopic);\n });\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_unread', ({dialog}) => {\n if(dialog?._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))});\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', async(dialog) => {\n if(dialog.peerId !== this.peerId) {\n return;\n }\n\n if(dialog._ === 'dialog') {\n const all = this.sortedList.getAll();\n const entries = [...all.entries()];\n const promises = entries.map(([id]) => this.managers.dialogsStorage.getForumTopic(this.peerId, id));\n const topics = await Promise.all(promises);\n entries.forEach(([id, element], idx) => {\n appDialogsManager.setUnreadMessagesN({dialog: topics[idx], dialogElement: element.dialogElement}); // возможно это не нужно, но нужно менять is-muted\n });\n\n return;\n }\n\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))}); // возможно это не нужно, но нужно менять is-muted\n });\n\n this.listenerSetter.add(rootScope)('dialog_drop', (dialog) => {\n if(dialog._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n this.deleteDialogByKey(this.getDialogKey(dialog));\n });\n\n this.listenerSetter.add(rootScope)('dialog_draft', ({dialog, drop, peerId}) => {\n if(dialog._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n if(drop) {\n this.deleteDialog(dialog);\n } else {\n this.updateDialog(dialog);\n }\n });\n }\n\n protected isDialogMustBeInViewport(dialog: ForumTopic) {\n if(dialog.pFlags.hidden) return false;\n return super.isDialogMustBeInViewport(dialog);\n }\n\n public getDialogKey(dialog: ForumTopic) {\n return dialog.id;\n }\n\n public getDialogKeyFromElement(element: HTMLElement) {\n return +element.dataset.threadId;\n }\n\n public getRectFromForPlaceholder() {\n return (): DOMRectEditable => {\n const sidebarRect = appSidebarLeft.rect;\n const paddingY = 56;\n return {\n top: paddingY,\n right: sidebarRect.right,\n bottom: 0,\n left: this.paddingX,\n width: sidebarRect.width - this.paddingX,\n height: sidebarRect.height - paddingY\n };\n };\n }\n\n public getDialogFromElement(element: HTMLElement) {\n return this.managers.dialogsStorage.getForumTopic(+element.dataset.peerId, +element.dataset.threadId);\n }\n\n public async loadDialogsInner(side: SliceSides) {\n const {indexKey} = this;\n let loadCount = windowSize.height / 64 * 1.25 | 0;\n let offsetIndex = 0;\n\n const filterId = this.peerId;\n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n offsetIndex = currentOffsetIndex;\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = await this.managers.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex((dialog) => getDialogIndex(dialog, indexKey) <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = getDialogIndex(storage[needIndex], indexKey) + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n\n return this.managers.acknowledged.dialogsStorage.getDialogs({\n offsetIndex,\n limit: loadCount,\n filterId,\n skipMigrated: true\n });\n }\n}\n\nclass Some2 extends Some {\n constructor(protected filterId: number) {\n super();\n\n this.needPlaceholderAtFirstTime = true;\n\n this.listenerSetter.add(rootScope)('peer_typings', async({peerId, typings}) => {\n const [dialog, isForum] = await Promise.all([\n this.managers.appMessagesManager.getDialogOnly(peerId),\n this.managers.appPeersManager.isForum(peerId)\n ]);\n\n if(!dialog || isForum) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n\n this.listenerSetter.add(rootScope)('user_update', async(userId) => {\n if(!this.isActive) {\n return;\n }\n\n const peerId = userId.toPeerId();\n const dom = this.getDialogDom(peerId);\n if(!dom) {\n return;\n }\n\n const status = await this.managers.appUsersManager.getUserStatus(userId);\n const online = status?._ === 'userStatusOnline';\n this.setOnlineStatus(dom.avatarEl, online);\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n const peerId = chatId.toPeerId(true);\n this.processDialogForCallStatus(peerId);\n });\n\n this.listenerSetter.add(rootScope)('dialog_flush', ({dialog}) => {\n if(!this.isActive || !dialog) {\n return;\n }\n\n appDialogsManager.setLastMessageN({\n dialog,\n setUnread: true\n });\n this.validateDialogForFilter(dialog);\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n if(!this.isActive) {\n return;\n }\n\n for(const [peerId, {dialog, topics}] of dialogs) {\n if(dialog?._ !== 'dialog') {\n continue;\n }\n\n this.updateDialog(dialog);\n\n appDialogsManager.processContact?.(peerId.toPeerId());\n\n this.validateDialogForFilter(dialog);\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_drop', (dialog) => {\n if(!this.isActive || dialog._ !== 'dialog') {\n return;\n }\n\n this.deleteDialogByKey(dialog.peerId);\n appDialogsManager.processContact?.(dialog.peerId);\n });\n\n this.listenerSetter.add(rootScope)('dialog_unread', ({dialog}) => {\n if(!this.isActive || dialog?._ !== 'dialog') {\n return;\n }\n\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))});\n this.validateDialogForFilter(dialog);\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(!this.isActive || dialog._ === 'forumTopic') {\n return;\n }\n\n this.validateDialogForFilter(dialog);\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))}); // возможно это не нужно, но нужно менять is-muted\n });\n\n this.listenerSetter.add(rootScope)('dialog_draft', ({dialog, drop, peerId}) => {\n if(!this.isActive || dialog._ === 'forumTopic') {\n return;\n }\n\n if(drop) {\n this.deleteDialog(dialog);\n } else {\n this.updateDialog(dialog);\n }\n\n appDialogsManager.processContact?.(peerId);\n });\n\n this.listenerSetter.add(rootScope)('filter_update', async(filter) => {\n if(this.isActive && filter.id === this.filterId && !REAL_FOLDERS.has(filter.id)) {\n const dialogs = await this.managers.dialogsStorage.getCachedDialogs(true);\n await this.validateListForFilter();\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n this.updateDialog(dialog);\n }\n }\n });\n }\n\n private get isActive() {\n return appDialogsManager.xd === this;\n }\n\n public getRectFromForPlaceholder() {\n return this.filterId === FOLDER_ID_ARCHIVE ? appDialogsManager.chatsContainer : appDialogsManager.folders.container;\n }\n\n public async loadDialogsInner(side: SliceSides) {\n const {filterId, indexKey} = this;\n let loadCount = windowSize.height / 72 * 1.25 | 0;\n let offsetIndex = 0;\n\n const doNotRenderChatList = appDialogsManager.doNotRenderChatList; // cache before awaits\n\n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = await this.managers.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex((dialog) => getDialogIndex(dialog, indexKey) <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = getDialogIndex(storage[needIndex], indexKey) + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n\n const promise = this.managers.acknowledged.dialogsStorage.getDialogs({\n offsetIndex,\n limit: loadCount,\n filterId,\n skipMigrated: true\n });\n\n const a = await promise;\n if(doNotRenderChatList) {\n a.result = Promise.reject(makeError('MIDDLEWARE'));\n }\n\n return a;\n }\n\n public setOnlineStatus(element: HTMLElement, online: boolean) {\n const className = 'is-online';\n const hasClassName = element.classList.contains(className);\n !hasClassName && online && element.classList.add(className);\n SetTransition({\n element: element,\n className: 'is-visible',\n forwards: online,\n duration: 250,\n onTransitionEnd: online ? undefined : () => {\n element.classList.remove(className);\n },\n useRafs: online && !hasClassName ? 2 : 0\n });\n }\n\n public generateScrollable(list: HTMLUListElement, filter: Parameters[0]) {\n const filterId = filter.id;\n const scrollable = new Scrollable(null, 'CL', 500);\n scrollable.container.dataset.filterId = '' + filterId;\n\n const indexKey = getDialogIndexKey(filter.localId);\n const sortedDialogList = new SortedDialogList({\n managers: rootScope.managers,\n log: this.log,\n list: list,\n indexKey,\n onListLengthChange: appDialogsManager.onListLengthChange\n });\n\n this.scrollable = scrollable;\n this.sortedList = sortedDialogList;\n this.setIndexKey(indexKey);\n this.bindScrollable();\n\n // list.classList.add('hide');\n // scrollable.container.style.backgroundColor = '#' + (Math.random() * (16 ** 6 - 1) | 0).toString(16);\n\n return scrollable;\n }\n\n public testDialogForFilter(dialog: Dialog) {\n if(!REAL_FOLDERS.has(this.filterId) ? getDialogIndex(dialog, this.indexKey) === undefined : this.filterId !== dialog.folder_id) {\n return false;\n }\n\n return true;\n }\n\n protected isDialogMustBeInViewport(dialog: Dialog) {\n if(dialog.migratedTo !== undefined || !this.testDialogForFilter(dialog)) return false;\n return super.isDialogMustBeInViewport(dialog);\n }\n\n /**\n * Удалит неподходящие чаты из списка, но не добавит их(!)\n */\n public async validateListForFilter() {\n this.sortedList.getAll().forEach(async(element) => {\n const dialog = await rootScope.managers.appMessagesManager.getDialogOnly(element.id);\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(dialog);\n }\n });\n }\n\n /**\n * Удалит неподходящий чат из списка, но не добавит его(!)\n */\n public validateDialogForFilter(dialog: Dialog) {\n if(!this.getDialogElement(dialog.peerId)) {\n return;\n }\n\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(dialog);\n }\n }\n\n public setCallStatus(dom: DialogDom, visible: boolean) {\n let {callIcon, listEl} = dom;\n if(!callIcon && visible) {\n const {canvas, startAnimation} = dom.callIcon = callIcon = groupCallActiveIcon(listEl.classList.contains('active'));\n canvas.classList.add('dialog-group-call-icon');\n listEl.append(canvas);\n startAnimation();\n }\n\n if(!callIcon) {\n return;\n }\n\n SetTransition({\n element: dom.callIcon.canvas,\n className: 'is-visible',\n forwards: visible,\n duration: BADGE_TRANSITION_TIME,\n onTransitionEnd: visible ? undefined : () => {\n dom.callIcon.canvas.remove();\n dom.callIcon = undefined;\n },\n useRafs: visible ? 2 : 0\n });\n }\n\n public async processDialogForCallStatus(peerId: PeerId, dom?: DialogDom) {\n if(!IS_GROUP_CALL_SUPPORTED) {\n return;\n }\n\n if(!dom) dom = this.getDialogDom(peerId);\n if(!dom) return;\n\n const chat = await rootScope.managers.appChatsManager.getChat(peerId.toChatId()) as Chat.chat | Chat.channel;\n this.setCallStatus(dom, !!(chat.pFlags.call_active && chat.pFlags.call_not_empty));\n }\n\n public onChatsScroll(side: SliceSides = 'bottom') {\n if(this.scrollable.loadedAll[side]) {\n appDialogsManager.loadContacts?.();\n }\n\n this.log('onChatsScroll', side);\n return super.onChatsScroll(side);\n }\n\n public toggleAvatarUnreadBadges(value: boolean, useRafs: number) {\n if(!value) {\n this.sortedList.getAll().forEach((sortedDialog) => {\n const {dom, dialogElement} = sortedDialog;\n if(!dom.unreadAvatarBadge) {\n return;\n }\n\n dialogElement.toggleBadgeByKey('unreadAvatarBadge', false, false, false);\n });\n\n return;\n }\n\n const reuseClassNames = ['unread', 'mention'];\n this.sortedList.getAll().forEach((sortedDialog) => {\n const {dom, dialogElement} = sortedDialog;\n const unreadContent = dom.unreadBadge?.textContent;\n if(!unreadContent || dom.unreadBadge.classList.contains('backwards')) {\n return;\n }\n\n const isUnreadAvatarBadgeMounted = !!dom.unreadAvatarBadge;\n dialogElement.createUnreadAvatarBadge();\n dialogElement.toggleBadgeByKey('unreadAvatarBadge', true, isUnreadAvatarBadgeMounted);\n dom.unreadAvatarBadge.textContent = unreadContent;\n const unreadAvatarBadgeClassList = dom.unreadAvatarBadge.classList;\n const unreadBadgeClassList = dom.unreadBadge.classList;\n reuseClassNames.forEach((className) => {\n unreadAvatarBadgeClassList.toggle(className, unreadBadgeClassList.contains(className));\n });\n });\n }\n\n public getDialogKey(dialog: Dialog) {\n return dialog.peerId;\n }\n\n public getDialogKeyFromElement(element: HTMLElement) {\n return +element.dataset.peerId;\n }\n\n public getDialogFromElement(element: HTMLElement) {\n return rootScope.managers.appMessagesManager.getDialogOnly(element.dataset.peerId.toPeerId());\n }\n}\n\n// const testScroll = false;\n// let testTopSlice = 1;\n\nexport class AppDialogsManager {\n public chatsContainer = document.getElementById('chatlist-container') as HTMLDivElement;\n\n private log = logger('DIALOGS', LogTypes.Log | LogTypes.Error | LogTypes.Warn | LogTypes.Debug);\n\n private contextMenu: DialogsContextMenu;\n\n public filterId: number;\n public folders: {[k in 'menu' | 'container' | 'menuScrollContainer']: HTMLElement} = {\n menu: document.getElementById('folders-tabs'),\n menuScrollContainer: null,\n container: document.getElementById('folders-container')\n };\n private filtersRendered: {\n [filterId: string]: {\n menu: HTMLElement,\n container: HTMLElement,\n unread: HTMLElement,\n title: HTMLElement\n }\n } = {};\n private showFiltersPromise: Promise;\n\n private lastActiveElements: Set = new Set();\n\n public loadContacts: () => void;\n public processContact: (peerId: PeerId) => void;\n\n private initedListeners = false;\n\n public onListLengthChange: () => Promise;\n private allChatsIntlElement: I18n.IntlElement;\n\n private emptyDialogsPlaceholderSubtitle: I18n.IntlElement;\n private updateContactsLengthPromise: Promise;\n\n private filtersNavigationItem: NavigationItem;\n\n private managers: AppManagers;\n private selectTab: ReturnType;\n\n public doNotRenderChatList: boolean;\n\n private stateMiddlewareHelper: MiddlewareHelper;\n\n private forumsTabs: Map;\n private forumsSlider: HTMLElement;\n public forumTab: ForumTab;\n private forumNavigationItem: NavigationItem;\n\n public xd: Some2;\n public xds: {[filterId: number]: Some2} = {};\n\n public start() {\n const managers = this.managers = getProxiedManagers();\n\n this.contextMenu = new DialogsContextMenu(managers);\n this.stateMiddlewareHelper = getMiddleware();\n\n this.folders.menuScrollContainer = this.folders.menu.parentElement;\n\n this.onListLengthChange = debounce(this._onListLengthChange, 100, false, true);\n\n const bottomPart = document.createElement('div');\n bottomPart.classList.add('connection-status-bottom');\n bottomPart.append(this.folders.container);\n\n this.forumsTabs = new Map();\n this.forumsSlider = document.createElement('div');\n this.forumsSlider.classList.add('topics-slider');\n this.chatsContainer.parentElement.parentElement.append(this.forumsSlider);\n // findUpClassName(this.chatsContainer, 'chatlist-container').append(this.forumsSlider);\n\n // appSidebarLeft.onOpenTab = () => {\n // return this.toggleForumTab();\n // };\n\n /* if(isTouchSupported && isSafari) {\n let allowUp: boolean, allowDown: boolean, slideBeginY: number;\n const container = this.scroll.container;\n container.addEventListener('touchstart', (event) => {\n allowUp = container.scrollTop > 0;\n allowDown = (container.scrollTop < container.scrollHeight - container.clientHeight);\n // @ts-ignore\n slideBeginY = event.pageY;\n });\n\n container.addEventListener('touchmove', (event: any) => {\n var up = (event.pageY > slideBeginY);\n var down = (event.pageY < slideBeginY);\n slideBeginY = event.pageY;\n if((up && allowUp) || (down && allowDown)) {\n event.stopPropagation();\n } else if(up || down) {\n event.preventDefault();\n }\n });\n } */\n\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.folders.container,\n onSwipe: (xDiff) => {\n const prevId = selectTab.prevId();\n selectTab(xDiff < 0 ? prevId + 1 : prevId - 1);\n },\n verifyTouchTarget: () => {\n return !this.forumTab;\n }\n });\n }\n\n this.allChatsIntlElement = new I18n.IntlElement({\n key: 'FilterAllChatsShort'\n });\n\n rootScope.addEventListener('premium_toggle', async(isPremium) => {\n if(isPremium) {\n return;\n }\n\n const isFolderAvailable = await this.managers.filtersStorage.isFilterIdAvailable(this.filterId);\n if(!isFolderAvailable) {\n selectTab(whichChild(this.filtersRendered[FOLDER_ID_ALL].menu), false);\n }\n });\n\n rootScope.addEventListener('state_cleared', () => {\n const clearCurrent = REAL_FOLDERS.has(this.filterId);\n // setTimeout(() =>\n apiManagerProxy.getState().then(async(state) => {\n this.xd.loadedDialogsAtLeastOnce = false;\n this.showFiltersPromise = undefined;\n\n /* const clearPromises: Promise[] = [];\n for(const name in this.managers.appStateManager.storagesResults) {\n const results = this.managers.appStateManager.storagesResults[name as keyof AppStateManager['storages']];\n const storage = this.managers.appStateManager.storages[name as keyof AppStateManager['storages']];\n results.length = 0;\n clearPromises.push(storage.clear());\n } */\n\n if(clearCurrent) {\n this.xd.clear();\n this.onTabChange();\n }\n\n this.onStateLoaded(state);\n })// , 5000);\n });\n\n this.setFilterId(FOLDER_ID_ALL, FOLDER_ID_ALL);\n this.addFilter({\n id: FOLDER_ID_ALL,\n title: '',\n localId: FOLDER_ID_ALL\n });\n\n const foldersScrollable = new ScrollableX(this.folders.menuScrollContainer);\n bottomPart.prepend(this.folders.menuScrollContainer);\n const selectTab = this.selectTab = horizontalMenu(this.folders.menu, this.folders.container, async(id, tabContent) => {\n /* if(id !== 0) {\n id += 1;\n } */\n\n const _id = id;\n id = +tabContent.dataset.filterId || FOLDER_ID_ALL;\n\n const isFilterAvailable = this.filterId === -1 || REAL_FOLDERS.has(id) || await this.managers.filtersStorage.isFilterIdAvailable(id);\n if(!isFilterAvailable) {\n return false;\n }\n\n const wasFilterId = this.filterId;\n if(!IS_MOBILE_SAFARI) {\n if(_id) {\n if(!this.filtersNavigationItem) {\n this.filtersNavigationItem = {\n type: 'filters',\n onPop: () => {\n selectTab(0);\n this.filtersNavigationItem = undefined;\n }\n };\n\n appNavigationController.spliceItems(1, 0, this.filtersNavigationItem);\n }\n } else if(this.filtersNavigationItem) {\n appNavigationController.removeItem(this.filtersNavigationItem);\n this.filtersNavigationItem = undefined;\n }\n }\n\n if(wasFilterId === id) return;\n\n this.xds[id].clear();\n const promise = this.setFilterIdAndChangeTab(id).then(({cached, renderPromise}) => {\n if(cached) {\n return renderPromise;\n }\n });\n\n if(wasFilterId !== -1) {\n return promise;\n }\n }, () => {\n for(const folderId in this.xds) {\n if(+folderId !== this.filterId) {\n this.xds[folderId].clear();\n }\n }\n }, undefined, foldersScrollable);\n\n apiManagerProxy.getState().then((state) => {\n // * it should've had a better place :(\n appMediaPlaybackController.setPlaybackParams(state.playbackParams);\n appMediaPlaybackController.addEventListener('playbackParams', (params) => {\n this.managers.appStateManager.pushToState('playbackParams', params);\n });\n\n return this.onStateLoaded(state);\n })/* .then(() => {\n const isLoadedMain = this.managers.appMessagesManager.dialogsStorage.isDialogsLoaded(0);\n const isLoadedArchive = this.managers.appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n const wasLoaded = isLoadedMain || isLoadedArchive;\n const a: Promise = isLoadedMain ? Promise.resolve() : this.managers.appMessagesManager.getConversationsAll('', 0);\n const b: Promise = isLoadedArchive ? Promise.resolve() : this.managers.appMessagesManager.getConversationsAll('', 1);\n a.finally(() => {\n b.then(() => {\n if(wasLoaded) {\n (apiUpdatesManager.updatesState.syncLoading || Promise.resolve()).then(() => {\n this.managers.appMessagesManager.refreshConversations();\n });\n }\n });\n });\n }) */;\n\n mediaSizes.addEventListener('resize', () => {\n this.changeFiltersAllChatsKey();\n });\n\n new ConnectionStatusComponent(this.managers, this.chatsContainer);\n this.chatsContainer.append(bottomPart);\n\n setTimeout(() => {\n lottieLoader.loadLottieWorkers();\n }, 200);\n\n PopupElement.MANAGERS = rootScope.managers = managers;\n appDownloadManager.construct(managers);\n appSidebarLeft.construct(managers);\n appSidebarRight.construct(managers);\n groupCallsController.construct(managers);\n callsController.construct(managers);\n appImManager.construct(managers);\n\n // start\n\n this.xd = this.xds[this.filterId];\n\n // selectTab(0, false);\n }\n\n public get chatList() {\n return this.xd.sortedList.list;\n }\n\n public setFilterId(filterId: number, localId: MyDialogFilter['localId']) {\n this.filterId = filterId;\n }\n\n public async setFilterIdAndChangeTab(filterId: number) {\n this.filterId = filterId;\n return this.onTabChange();\n }\n\n private initListeners() {\n rootScope.addEventListener('dialog_flush', ({dialog}) => {\n if(!dialog) {\n return;\n }\n\n this.setFiltersUnreadCount();\n });\n\n rootScope.addEventListener('folder_unread', async(folder) => {\n if(folder.id < 0) {\n const dialogElement = this.xd.getDialogElement(folder.id);\n if(!dialogElement) {\n return;\n }\n\n this.setUnreadMessagesN({\n dialog: await this.managers.dialogsStorage.getDialogOnly(folder.id),\n dialogElement\n });\n } else {\n this.setFilterUnreadCount(folder.id);\n }\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n this.processContact?.(userId.toPeerId());\n });\n\n appImManager.addEventListener('peer_changed', ({peerId, threadId, isForum}) => {\n const options: Parameters[0] = {peerId, threadId: isForum ? threadId : undefined};\n // const perf = performance.now();\n for(const element of this.lastActiveElements) {\n const elementThreadId = +element.dataset.threadId || undefined;\n const elementPeerId = element.dataset.peerId.toPeerId();\n if(!appImManager.isSamePeer({peerId: elementPeerId, threadId: elementThreadId}, options)) {\n this.setDialogActive(element, false);\n }\n }\n\n const elements = Array.from(document.querySelectorAll(`[data-autonomous=\"0\"] .chatlist-chat[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\n elements.forEach((element) => {\n const elementThreadId = +element.dataset.threadId || undefined;\n if(appImManager.isSamePeer({peerId, threadId: elementThreadId}, options)) {\n this.setDialogActive(element, true);\n }\n });\n // this.log('peer_changed total time:', performance.now() - perf);\n });\n\n rootScope.addEventListener('filter_update', async(filter) => {\n if(REAL_FOLDERS.has(filter.id)) {\n return;\n }\n\n if(!this.filtersRendered[filter.id]) {\n this.addFilter(filter);\n return;\n }\n\n const elements = this.filtersRendered[filter.id];\n setInnerHTML(elements.title, wrapEmojiText(filter.title));\n });\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const elements = this.filtersRendered[filter.id];\n if(!elements) return;\n\n // set tab\n // (this.folders.menu.firstElementChild.children[Math.max(0, filter.id - 2)] as HTMLElement).click();\n elements.container.remove();\n elements.menu.remove();\n\n this.xds[filter.id].destroy();\n delete this.xds[filter.id];\n delete this.filtersRendered[filter.id];\n\n this.onFiltersLengthChange();\n\n if(this.filterId === filter.id) {\n this.selectTab(0, false);\n }\n });\n\n rootScope.addEventListener('filter_order', async(order) => {\n order = order.slice();\n indexOfAndSplice(order, FOLDER_ID_ARCHIVE);\n\n const containerToAppend = this.folders.menu as HTMLElement;\n const r = await Promise.all(order.map(async(filterId) => {\n const [indexKey, filter] = await Promise.all([\n this.managers.dialogsStorage.getDialogIndexKeyByFilterId(filterId),\n this.managers.filtersStorage.getFilter(filterId)\n ]);\n\n return {indexKey, filter};\n }));\n\n order.forEach((filterId, idx) => {\n const {indexKey, filter} = r[idx];\n const renderedFilter = this.filtersRendered[filterId];\n\n this.xds[filterId].setIndexKey(indexKey);\n\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.localId);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.localId);\n });\n\n /* if(this.filterId) {\n const tabIndex = order.indexOf(this.filterId) + 1;\n selectTab.prevId = tabIndex;\n } */\n });\n }\n\n public setDialogActive(listEl: HTMLElement, active: boolean) {\n const dom = (listEl as any).dialogDom as DialogDom;\n listEl.classList.toggle('active', active);\n listEl.classList.toggle('is-forum-open', this.forumTab?.peerId === listEl.dataset.peerId.toPeerId() && !listEl.dataset.threadId);\n if(active) {\n this.lastActiveElements.add(listEl);\n } else {\n this.lastActiveElements.delete(listEl);\n }\n\n if(dom?.callIcon) {\n dom.callIcon.setActive(active);\n }\n }\n\n private async onStateLoaded(state: State) {\n this.stateMiddlewareHelper.clean();\n const middleware = this.stateMiddlewareHelper.get();\n const filtersArr = state.filtersArr;\n const haveFilters = filtersArr.length > REAL_FOLDERS.size;\n // const filter = filtersArr.find((filter) => filter.id !== FOLDER_ID_ARCHIVE);\n\n const addFilters = (filters: MyDialogFilter[]) => {\n for(const filter of filters) {\n this.addFilter(filter);\n }\n };\n\n let addFiltersPromise: Promise;\n if(haveFilters) {\n addFilters(filtersArr);\n } else {\n addFiltersPromise = this.managers.filtersStorage.getDialogFilters().then(addFilters);\n }\n\n this.doNotRenderChatList = true;\n const loadDialogsPromise = this.xd.onChatsScroll();\n const m = middlewarePromise(middleware);\n try {\n await m(loadDialogsPromise);\n } catch(err) {\n\n }\n\n // show the placeholder before the filters, and then will reset to the default tab again\n if(!haveFilters) {\n this.selectTab(0, false);\n }\n\n addFiltersPromise && await m(addFiltersPromise);\n // this.folders.menu.children[0].classList.add('active');\n\n this.doNotRenderChatList = undefined;\n\n this.filterId = -1;\n this.selectTab(0, false);\n\n if(!this.initedListeners) {\n this.initListeners();\n this.initedListeners = true;\n }\n\n haveFilters && this.showFiltersPromise && await m(this.showFiltersPromise);\n\n this.managers.appNotificationsManager.getNotifyPeerTypeSettings();\n\n await (await m(loadDialogsPromise)).renderPromise.catch(noop);\n this.managers.appMessagesManager.fillConversations();\n }\n\n /* private getOffset(side: 'top' | 'bottom'): {index: number, pos: number} {\n if(!this.scroll.loadedAll[side]) {\n const element = (side === 'top' ? this.chatList.firstElementChild : this.chatList.lastElementChild) as HTMLElement;\n if(element) {\n const peerId = element.dataset.peerId;\n const dialog = this.managers.appMessagesManager.getDialogByPeerId(peerId);\n return {index: dialog[0].index, pos: dialog[1]};\n }\n }\n\n return {index: 0, pos: -1};\n } */\n\n public onTabChange = () => {\n this.xd = this.xds[this.filterId];\n this.xd.reset();\n return this.xd.onChatsScroll();\n };\n\n private async setFilterUnreadCount(filterId: number) {\n // if(filterId === FOLDER_ID_ALL) {\n // return;\n // }\n\n const unreadSpan = this.filtersRendered[filterId]?.unread;\n if(!unreadSpan) {\n return;\n }\n\n const {unreadUnmutedCount, unreadCount} = await this.managers.dialogsStorage.getFolderUnreadCount(filterId);\n\n unreadSpan.classList.toggle('badge-gray', !unreadUnmutedCount);\n const count = filterId === FOLDER_ID_ALL ? unreadUnmutedCount : unreadCount;\n unreadSpan.innerText = count ? '' + count : '';\n }\n\n private setFiltersUnreadCount() {\n for(const filterId in this.filtersRendered) {\n this.setFilterUnreadCount(+filterId);\n }\n }\n\n public l(filter: Parameters[0]) {\n const ul = this.createChatList();\n const xd = this.xds[filter.id] = new Some2(filter.id);\n const scrollable = xd.generateScrollable(ul, filter);\n this.setListClickListener(ul, null, true);\n\n return {ul, xd, scrollable};\n }\n\n private addFilter(filter: Pick) {\n if(filter.id === FOLDER_ID_ARCHIVE) {\n return;\n }\n\n const containerToAppend = this.folders.menu as HTMLElement;\n const renderedFilter = this.filtersRendered[filter.id];\n if(renderedFilter) {\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.localId);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.localId);\n return;\n }\n\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const titleSpan = document.createElement('span');\n titleSpan.classList.add('text-super');\n if(filter.id === FOLDER_ID_ALL) titleSpan.append(this.allChatsIntlElement.element);\n else setInnerHTML(titleSpan, wrapEmojiText(filter.title));\n const unreadSpan = document.createElement('div');\n unreadSpan.classList.add('badge', 'badge-20', 'badge-primary');\n const i = document.createElement('i');\n span.append(titleSpan, unreadSpan, i);\n ripple(menuTab);\n menuTab.append(span);\n\n menuTab.dataset.filterId = '' + filter.id;\n\n positionElementByIndex(menuTab, containerToAppend, filter.localId);\n // containerToAppend.append(li);\n\n const {ul, scrollable} = this.l(filter);\n scrollable.container.classList.add('tabs-tab', 'chatlist-parts');\n\n /* const parts = document.createElement('div');\n parts.classList.add('chatlist-parts'); */\n\n const top = document.createElement('div');\n top.classList.add('chatlist-top');\n\n const bottom = document.createElement('div');\n bottom.classList.add('chatlist-bottom');\n\n top.append(ul);\n scrollable.container.append(top, bottom);\n /* parts.append(top, bottom);\n scrollable.container.append(parts); */\n\n const div = scrollable.container;\n // this.folders.container.append(div);\n positionElementByIndex(scrollable.container, this.folders.container, filter.localId);\n\n this.filtersRendered[filter.id] = {\n menu: menuTab,\n container: div,\n unread: unreadSpan,\n title: titleSpan\n };\n\n this.onFiltersLengthChange();\n }\n\n private changeFiltersAllChatsKey() {\n const scrollable = this.folders.menuScrollContainer.firstElementChild;\n const key: LangPackKey = scrollable.scrollWidth > scrollable.clientWidth ? 'FilterAllChatsShort' : 'FilterAllChats';\n this.allChatsIntlElement.compareAndUpdate({key});\n }\n\n private onFiltersLengthChange() {\n let promise = this.showFiltersPromise;\n return promise ??= this.showFiltersPromise = pause(0).then(() => {\n if(this.showFiltersPromise !== promise) {\n return;\n }\n\n const length = Object.keys(this.filtersRendered).length;\n const show = length > 1;\n const wasShowing = !this.folders.menuScrollContainer.classList.contains('hide');\n\n if(show !== wasShowing) {\n this.folders.menuScrollContainer.classList.toggle('hide', !show);\n if(show && !wasShowing) {\n this.setFiltersUnreadCount();\n }\n\n this.chatsContainer.classList.toggle('has-filters', show);\n }\n\n this.changeFiltersAllChatsKey();\n\n this.showFiltersPromise = undefined;\n });\n }\n\n private generateEmptyPlaceholder(options: {\n title: LangPackKey,\n subtitle?: LangPackKey,\n subtitleArgs?: FormatterArguments,\n classNameType: string\n }) {\n const BASE_CLASS = 'empty-placeholder';\n const container = document.createElement('div');\n container.classList.add(BASE_CLASS, BASE_CLASS + '-' + options.classNameType);\n\n const header = document.createElement('div');\n header.classList.add(BASE_CLASS + '-header');\n _i18n(header, options.title);\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(BASE_CLASS + '-subtitle');\n if(options.subtitle) {\n _i18n(subtitle, options.subtitle, options.subtitleArgs);\n }\n\n container.append(header, subtitle);\n\n return {container, header, subtitle};\n }\n\n private checkIfPlaceholderNeeded() {\n if(this.filterId === FOLDER_ID_ARCHIVE) {\n return;\n }\n\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n let placeholderContainer = (Array.from(part.children) as HTMLElement[]).find((el) => el.matches('.empty-placeholder'));\n const needPlaceholder = this.xd.scrollable.loadedAll.bottom && !chatList.childElementCount/* || true */;\n // chatList.style.display = 'none';\n\n if(needPlaceholder && placeholderContainer) {\n return;\n } else if(!needPlaceholder) {\n if(placeholderContainer) {\n part.classList.remove('with-placeholder');\n placeholderContainer.remove();\n }\n\n return;\n }\n\n let placeholder: ReturnType, type: 'dialogs' | 'folder';\n if(!this.filterId) {\n placeholder = this.generateEmptyPlaceholder({\n title: 'ChatList.Main.EmptyPlaceholder.Title',\n classNameType: type = 'dialogs'\n });\n\n placeholderContainer = placeholder.container;\n\n const img = document.createElement('img');\n img.classList.add('empty-placeholder-dialogs-icon');\n\n this.emptyDialogsPlaceholderSubtitle = new I18n.IntlElement({\n element: placeholder.subtitle\n });\n\n Promise.all([\n this.updateContactsLength(false),\n renderImageFromUrlPromise(img, 'assets/img/EmptyChats.svg'),\n fastRafPromise()\n ]).then(([usersLength]) => {\n placeholderContainer.classList.add('visible');\n part.classList.toggle('has-contacts', !!usersLength);\n });\n\n placeholderContainer.prepend(img);\n } else {\n placeholder = this.generateEmptyPlaceholder({\n title: 'FilterNoChatsToDisplay',\n subtitle: 'FilterNoChatsToDisplayInfo',\n classNameType: type = 'folder'\n });\n\n placeholderContainer = placeholder.container;\n\n const div = document.createElement('div');\n const emoji = '📂';\n const size = 128;\n wrapStickerEmoji({\n div,\n emoji: emoji,\n width: size,\n height: size\n });\n\n placeholderContainer.prepend(div);\n\n const button = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'FilterHeaderEdit',\n icon: 'settings'\n });\n\n attachClickEvent(button, async() => {\n appSidebarLeft.createTab(AppEditFolderTab).open(await this.managers.filtersStorage.getFilter(this.filterId));\n });\n\n placeholderContainer.append(button);\n }\n\n part.append(placeholderContainer);\n part.classList.add('with-placeholder');\n part.dataset.placeholderType = type;\n }\n\n private updateContactsLength(updatePartClassName: boolean) {\n return this.updateContactsLengthPromise ??= this.managers.appUsersManager.getContacts().then((users) => {\n const subtitle = this.emptyDialogsPlaceholderSubtitle;\n if(subtitle) {\n let key: LangPackKey, args: FormatterArguments;\n\n if(users.length/* && false */) {\n key = 'ChatList.Main.EmptyPlaceholder.Subtitle';\n args = [i18n('Contacts.Count', [users.length])];\n } else {\n key = 'ChatList.Main.EmptyPlaceholder.SubtitleNoContacts';\n args = [];\n }\n\n subtitle.compareAndUpdate({\n key,\n args\n });\n }\n\n if(updatePartClassName) {\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n part.classList.toggle('has-contacts', !!users.length);\n }\n\n this.updateContactsLengthPromise = undefined;\n\n return users.length;\n });\n }\n\n private removeContactsPlaceholder() {\n const chatList = this.chatList;\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n parts.classList.remove('with-contacts');\n bottom.replaceChildren();\n this.loadContacts = undefined;\n this.processContact = undefined;\n }\n\n private _onListLengthChange = () => {\n if(!this.xd.loadedDialogsAtLeastOnce) {\n return;\n }\n\n this.checkIfPlaceholderNeeded();\n\n if(this.filterId !== FOLDER_ID_ALL) return;\n\n const chatList = this.chatList;\n const count = chatList.childElementCount;\n\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n const hasContacts = !!bottom.childElementCount;\n if(count >= 10) {\n if(hasContacts) {\n this.removeContactsPlaceholder();\n }\n\n return;\n } else if(hasContacts) return;\n\n parts.classList.add('with-contacts');\n\n const section = new SettingSection({\n name: 'Contacts',\n noDelimiter: true,\n fakeGradientDelimiter: true\n });\n\n section.container.classList.add('hide');\n\n this.managers.appUsersManager.getContactsPeerIds(undefined, undefined, 'online').then((contacts) => {\n let ready = false;\n const onListLengthChange = () => {\n if(ready) {\n section.container.classList.toggle('hide', !sortedUserList.list.childElementCount);\n }\n\n this.updateContactsLength(true);\n };\n\n const sortedUserList = new SortedUserList({\n avatarSize: 'abitbigger',\n createChatListOptions: {\n dialogSize: 48,\n new: true\n },\n autonomous: false,\n onListLengthChange,\n managers: this.managers\n });\n\n this.loadContacts = () => {\n const pageCount = windowSize.height / 60 | 0;\n const promise = filterAsync(contacts.splice(0, pageCount), this.verifyPeerIdForContacts);\n\n promise.then((arr) => {\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n });\n\n if(!contacts.length) {\n this.loadContacts = undefined;\n }\n };\n\n this.loadContacts();\n\n this.processContact = async(peerId) => {\n if(peerId.isAnyChat()) {\n return;\n }\n\n const good = await this.verifyPeerIdForContacts(peerId);\n const added = sortedUserList.has(peerId);\n if(!added && good) sortedUserList.add(peerId);\n else if(added && !good) sortedUserList.delete(peerId);\n };\n\n const list = sortedUserList.list;\n list.classList.add('chatlist-new');\n this.setListClickListener(list);\n section.content.append(list);\n\n ready = true;\n onListLengthChange();\n });\n\n bottom.append(section.container);\n };\n\n private verifyPeerIdForContacts = async(peerId: PeerId) => {\n const [isContact, dialog] = await Promise.all([\n this.managers.appPeersManager.isContact(peerId),\n this.managers.appMessagesManager.getDialogOnly(peerId)\n ]);\n\n return isContact && !dialog;\n };\n\n public async toggleForumTab(newTab?: ForumTab, hideTab = this.forumTab) {\n if(!hideTab && !newTab) {\n return;\n }\n\n if(hideTab) {\n const dialogElement = this.xd.getDialogElement(hideTab.peerId);\n if(dialogElement) {\n dialogElement.dom.listEl.classList.remove('is-forum-open');\n }\n }\n\n if(hideTab === newTab) {\n newTab = undefined;\n }\n\n hideTab?.toggle(false);\n const promise = newTab?.toggle(true);\n if(hideTab === this.forumTab) {\n this.forumTab = newTab;\n }\n\n if(newTab) {\n const dialogElement = this.xd.getDialogElement(newTab.peerId);\n if(dialogElement) {\n dialogElement.dom.listEl.classList.add('is-forum-open');\n }\n }\n\n if(promise) {\n await promise;\n }\n\n if(newTab && !this.forumNavigationItem) {\n this.forumNavigationItem = {\n type: 'forum',\n onPop: () => {\n this.forumNavigationItem = undefined;\n this.toggleForumTab();\n }\n };\n\n appNavigationController.pushItem(this.forumNavigationItem);\n } else if(!newTab && this.forumNavigationItem) {\n appNavigationController.removeItem(this.forumNavigationItem);\n this.forumNavigationItem = undefined;\n }\n\n const forwards = !!newTab;\n const useRafs = promise ? 2 : undefined;\n this.xd.toggleAvatarUnreadBadges(forwards, useRafs);\n\n const deferred = deferredPromise();\n const duration = 300;\n SetTransition({\n element: this.forumsSlider.parentElement,\n className: 'is-forum-visible',\n duration,\n forwards,\n useRafs,\n onTransitionEnd: () => {\n deferred.resolve();\n }\n });\n\n dispatchHeavyAnimationEvent(deferred, duration).then(() => deferred.resolve());\n }\n\n public toggleForumTabByPeerId(peerId: PeerId, show?: boolean) {\n const {managers} = this;\n const history = appSidebarLeft.getHistory();\n const lastTab = history[history.length - 1];\n let forumTab: ForumTab;\n if(lastTab/* && !(lastTab instanceof AppArchivedTab) */) {\n if(lastTab instanceof ForumTab && lastTab.peerId === peerId && show) {\n shake(lastTab.container);\n return;\n }\n\n forumTab = appSidebarLeft.createTab(ForumTab);\n forumTab.open({peerId, managers});\n return;\n }\n\n forumTab = this.forumsTabs.get(peerId);\n const isSameTab = this.forumTab && this.forumTab === forumTab;\n show ??= !isSameTab;\n if(show === isSameTab) {\n if(show) {\n shake(forumTab.container);\n }\n\n return;\n }\n\n if(show && !forumTab) {\n forumTab = new ForumTab(undefined);\n forumTab.init({peerId, managers});\n\n this.forumsTabs.set(peerId, forumTab);\n this.forumsSlider.append(forumTab.container);\n\n forumTab.managers = this.managers;\n forumTab.eventListener.addEventListener('destroy', () => {\n this.forumsTabs.delete(peerId);\n });\n }\n\n return this.toggleForumTab(forumTab);\n }\n\n public setListClickListener(\n list: HTMLUListElement,\n onFound?: () => void,\n withContext = false,\n autonomous = false,\n openInner = false\n ) {\n let lastActiveListElement: HTMLElement;\n\n const setPeerFunc = (openInner ? appImManager.setInnerPeer : appImManager.setPeer).bind(appImManager);\n\n list.dataset.autonomous = '' + +autonomous;\n list.addEventListener('mousedown', (e) => {\n if(e.button !== 0) return;\n\n this.log('dialogs click list');\n const target = e.target as HTMLElement;\n const elem = findUpTag(target, DIALOG_LIST_ELEMENT_TAG);\n\n if(!elem) {\n return;\n }\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n const threadId = +elem.dataset.threadId || undefined;\n\n onFound?.();\n\n const isForum = !!elem.querySelector('.is-forum');\n if(isForum && !e.shiftKey && !lastMsgId) {\n this.toggleForumTabByPeerId(peerId);\n return;\n }\n\n if(e.ctrlKey || e.metaKey) {\n window.open((elem as HTMLAnchorElement).href || ('#' + peerId), '_blank');\n cancelEvent(e);\n return;\n }\n\n if(autonomous) {\n const sameElement = lastActiveListElement === elem;\n if(lastActiveListElement && !sameElement) {\n lastActiveListElement.classList.remove('active');\n }\n\n if(elem) {\n elem.classList.add('active');\n lastActiveListElement = elem;\n this.lastActiveElements.add(elem);\n }\n }\n\n if(\n (!threadId || lastMsgId) &&\n this.xd.sortedList.list === list &&\n this.xd !== this.xds[FOLDER_ID_ARCHIVE]\n ) {\n this.toggleForumTab();\n }\n\n setPeerFunc({\n peerId,\n lastMsgId,\n threadId: threadId\n });\n }, {capture: true});\n\n // cancel link click\n // ! do not change it to attachClickEvent\n list.addEventListener('click', (e) => {\n if(e.button === 0) {\n cancelEvent(e);\n }\n }, {capture: true});\n\n if(withContext) {\n attachContextMenuListener(list, this.contextMenu.onContextMenu);\n }\n }\n\n public createChatList(options: {\n // avatarSize?: number,\n // handheldsSize?: number,\n // size?: number,\n new?: boolean,\n dialogSize?: number,\n ignoreClick?: boolean\n } = {}) {\n const list = document.createElement('ul');\n list.classList.add('chatlist'/* ,\n 'chatlist-avatar-' + (options.avatarSize || 54) *//* , 'chatlist-' + (options.size || 72) */);\n\n if(options.new) {\n list.classList.add('chatlist-new');\n }\n\n if(options.dialogSize) {\n list.classList.add('chatlist-' + options.dialogSize);\n }\n\n // if(options.ignoreClick) {\n // list.classList.add('disable-hover');\n // }\n\n /* if(options.handheldsSize) {\n list.classList.add('chatlist-handhelds-' + options.handheldsSize);\n } */\n\n return list;\n }\n\n public setLastMessageN(options: Parameters[0]) {\n const promise = this.setLastMessage(options);\n return promise.catch((err: ApiError) => {\n if(err?.type !== 'MIDDLEWARE') {\n this.log.error('set last message error', err);\n }\n });\n }\n\n private async setLastMessage({\n dialog,\n lastMessage,\n dialogElement,\n highlightWord,\n isBatch = false,\n setUnread = false\n }: {\n dialog: Dialog | ForumTopic,\n lastMessage?: Message.message | Message.messageService,\n dialogElement?: DialogElement,\n highlightWord?: string,\n isBatch?: boolean,\n setUnread?: boolean\n }) {\n if(!dialogElement) {\n dialogElement = this.xd.getDialogElement(dialog.peerId);\n\n if(!dialogElement) {\n return;\n }\n }\n\n const {dom} = dialogElement;\n const {peerId} = dialog;\n\n const {deferred: promise, middleware} = setPromiseMiddleware(dom, 'setLastMessagePromise');\n\n let draftMessage: MyDraftMessage;\n if(!lastMessage) {\n if(\n dialog.draft?._ === 'draftMessage' && (\n !peerId.isAnyChat() ||\n dialog._ === 'forumTopic' ||\n !(await this.managers.appPeersManager.isForum(peerId))\n )\n ) {\n draftMessage = dialog.draft;\n }\n\n lastMessage = (dialog as Dialog).topMessage;\n if(lastMessage?.mid !== dialog.top_message) {\n const promise = this.managers.appMessagesManager.getMessageByPeer(peerId, dialog.top_message);\n lastMessage = await middleware(promise);\n }\n }\n\n // * do not uncomment next line - unsetTyping right after this call will interrupt setting unread badges\n // if(setUnread) {\n this.setUnreadMessagesN({dialog, dialogElement, isBatch, setLastMessagePromise: promise});\n // }\n\n if(!lastMessage/* || (lastMessage._ === 'messageService' && !lastMessage.rReply) */) {\n dom.lastMessageSpan.replaceChildren();\n dom.lastTimeSpan.replaceChildren();\n delete dom.listEl.dataset.mid;\n\n promise.resolve();\n return;\n }\n\n const isRestricted = lastMessage && isMessageRestricted(lastMessage as Message.message);\n\n /* if(!dom.lastMessageSpan.classList.contains('user-typing')) */ {\n let mediaContainer: HTMLElement;\n const willPrepend: (Promise | HTMLElement)[] = [];\n if(lastMessage && !draftMessage && !isRestricted) {\n const media: MyDocument | MyPhoto = getMediaFromMessage(lastMessage);\n const videoTypes: Set = new Set(['video', 'gif', 'round']);\n if(media && (media._ === 'photo' || videoTypes.has(media.type))) {\n const size = choosePhotoSize(media, 20, 20);\n\n if(size._ !== 'photoSizeEmpty') {\n mediaContainer = document.createElement('div');\n mediaContainer.classList.add('dialog-subtitle-media');\n\n if((media as MyDocument).type === 'round') {\n mediaContainer.classList.add('is-round');\n }\n\n willPrepend.push(wrapPhoto({\n photo: media,\n message: lastMessage,\n container: mediaContainer,\n withoutPreloader: true,\n size\n }).then(() => mediaContainer));\n\n if(videoTypes.has((media as MyDocument).type)) {\n const playIcon = document.createElement('span');\n playIcon.classList.add('tgico-play');\n\n mediaContainer.append(playIcon);\n }\n }\n }\n }\n\n /* if(lastMessage.from_id === auth.id) { // You: */\n if(draftMessage) {\n const span = document.createElement('span');\n span.classList.add('danger');\n span.append(i18n('Draft'), ': ');\n willPrepend.unshift(span);\n } else if(peerId.isAnyChat() && peerId !== lastMessage.fromId && !(lastMessage as Message.messageService).action) {\n const span = document.createElement('span');\n span.classList.add('primary-text');\n\n if(lastMessage.fromId === rootScope.myId) {\n span.append(i18n('FromYou'));\n willPrepend.unshift(span);\n } else {\n // str = sender.first_name || sender.last_name || sender.username;\n const p = middleware(wrapPeerTitle({\n peerId: lastMessage.fromId,\n onlyFirstName: true\n })).then((element) => {\n span.prepend(element);\n return span;\n }, noop);\n\n willPrepend.unshift(p);\n }\n\n span.append(': ');\n // console.log(sender, senderBold.innerText);\n }\n\n const withoutMediaType = !!mediaContainer && !!(lastMessage as Message.message)?.message;\n\n let fragment: DocumentFragment;\n if(highlightWord && (lastMessage as Message.message).message) {\n fragment = await middleware(wrapMessageForReply({message: lastMessage, highlightWord, withoutMediaType}));\n } else if(draftMessage) {\n fragment = await middleware(wrapMessageForReply({message: draftMessage}));\n } else if(lastMessage) {\n fragment = await middleware(wrapMessageForReply({message: lastMessage, withoutMediaType}));\n } else { // rare case\n fragment = document.createDocumentFragment();\n }\n\n if(willPrepend.length) {\n const elements = await middleware(Promise.all(willPrepend));\n fragment.prepend(...elements);\n }\n\n replaceContent(dom.lastMessageSpan, fragment);\n }\n\n if(lastMessage || draftMessage/* && lastMessage._ !== 'draftMessage' */) {\n const date = draftMessage ? Math.max(draftMessage.date, lastMessage.date || 0) : lastMessage.date;\n replaceContent(dom.lastTimeSpan, formatDateAccordingToTodayNew(new Date(date * 1000)));\n } else dom.lastTimeSpan.textContent = '';\n\n if(setUnread !== null && !setUnread) { // means search\n dom.listEl.dataset.mid = '' + lastMessage.mid;\n\n const replyTo = lastMessage.reply_to;\n if(replyTo?.pFlags?.forum_topic) {\n dom.listEl.dataset.threadId = '' + getMessageThreadId(lastMessage);\n }\n }\n\n promise.resolve();\n }\n\n public setUnreadMessagesN(options: Parameters[0]) {\n return this.setUnreadMessages(options).catch(() => {});\n }\n\n private async setUnreadMessages({\n dialog,\n dialogElement,\n isBatch = false,\n setLastMessagePromise\n }: {\n dialog: Dialog | ForumTopic,\n dialogElement: DialogElement,\n isBatch?: boolean,\n setLastMessagePromise?: Promise\n }) {\n const {dom} = dialogElement;\n if(!dom) {\n // this.log.error('setUnreadMessages no dom!', dialog);\n return;\n }\n\n const isTopic = dialog._ === 'forumTopic';\n\n const {deferred, middleware} = setPromiseMiddleware(dom, 'setUnreadMessagePromise');\n\n const {peerId} = dialog;\n const promises = Promise.all([\n this.managers.appNotificationsManager.isPeerLocalMuted({peerId: peerId, respectType: true, threadId: isTopic ? dialog.id : undefined}),\n dialog.draft?._ !== 'draftMessage' ? this.managers.appMessagesManager.getMessageByPeer(peerId, dialog.top_message) : undefined,\n isTopic ? !!dialog.pFlags.pinned : this.managers.dialogsStorage.isDialogPinned(peerId, this.filterId),\n this.managers.appMessagesManager.isDialogUnread(dialog),\n peerId.isAnyChat() && !isTopic ? this.managers.acknowledged.dialogsStorage.getForumUnreadCount(peerId).then((result) => {\n if(result.cached) {\n return result.result;\n } else {\n result.result.then(() => {\n this.setUnreadMessagesN({dialog, dialogElement});\n });\n\n return {count: 0, hasUnmuted: false};\n }\n }).catch(() => undefined as {count: number, hasUnmuted: boolean}) : undefined\n ]);\n\n let [isMuted, lastMessage, isPinned, isDialogUnread, forumUnreadCount] = await middleware(promises);\n const wasMuted = dom.listEl.classList.contains('is-muted');\n\n const {count: unreadTopicsCount, hasUnmuted: hasUnmutedTopic} = forumUnreadCount || {};\n\n let setStatusMessage: MyMessage;\n if(lastMessage && lastMessage.pFlags.out && lastMessage.peerId !== rootScope.myId) {\n setStatusMessage = lastMessage;\n }\n\n const unreadCount = unreadTopicsCount ?? dialog.unread_count;\n if(unreadTopicsCount !== undefined) {\n isDialogUnread = !!unreadCount;\n }\n\n if(isTopic && !isDialogUnread) {\n isDialogUnread = !getServerMessageId(dialog.read_inbox_max_id);\n }\n\n const hasUnreadBadge = isPinned || isDialogUnread;\n const hasUnreadAvatarBadge = this.xd !== this.xds[FOLDER_ID_ARCHIVE] && !isTopic && !!this.forumTab && this.xd.getDialogElement(peerId) === dialogElement && isDialogUnread;\n // dom.messageEl.classList.toggle('has-badge', hasBadge);\n\n // * have to await all promises before modifying something\n\n if(setLastMessagePromise) {\n try {\n await middleware(setLastMessagePromise);\n } catch(err) {\n return;\n }\n }\n\n const transitionDuration = isBatch ? 0 : BADGE_TRANSITION_TIME;\n\n dom.listEl.classList.toggle('no-unmuted-topic', !isMuted && hasUnmutedTopic !== undefined && !hasUnmutedTopic);\n\n if(isMuted !== wasMuted) {\n SetTransition({\n element: dom.listEl,\n className: 'is-muted',\n forwards: isMuted,\n duration: transitionDuration\n });\n }\n\n setSendingStatus(dom.statusSpan, isTopic && dialog.pFlags.closed ? 'premium_lock' : setStatusMessage, true);\n\n // if(isTopic) {\n // dom.statusSpan.parentElement.classList.toggle('is-closed', !!dialog.pFlags.closed);\n // }\n\n const isUnreadBadgeMounted = !!dom.unreadBadge;\n if(hasUnreadBadge) {\n dialogElement.createUnreadBadge();\n }\n\n const isUnreadAvatarBadgeMounted = !!dom.unreadAvatarBadge;\n if(hasUnreadAvatarBadge) {\n dialogElement.createUnreadAvatarBadge();\n }\n\n const hasMentionsBadge = dialog.unread_mentions_count && (dialog.unread_mentions_count > 1 || dialog.unread_count > 1);\n const isMentionsBadgeMounted = !!dom.mentionsBadge;\n if(hasMentionsBadge) {\n dialogElement.createMentionsBadge();\n }\n\n const a: [Parameters[0], boolean, boolean][] = [\n ['unreadBadge', hasUnreadBadge, isUnreadBadgeMounted],\n ['unreadAvatarBadge', hasUnreadAvatarBadge, isUnreadAvatarBadgeMounted],\n ['mentionsBadge', hasMentionsBadge, isMentionsBadgeMounted]\n ];\n\n a.forEach(([key, hasBadge, isBadgeMounted]) => {\n const badge = dom[key];\n if(!badge) {\n return;\n }\n\n dialogElement.toggleBadgeByKey(key, hasBadge, isBadgeMounted, isBatch);\n });\n\n if(!hasUnreadBadge) {\n deferred.resolve();\n return;\n }\n\n if(isPinned) {\n dom.unreadBadge.classList.add('tgico-chatspinned', 'tgico');\n } else if(dom.unreadBadge) {\n dom.unreadBadge.classList.remove('tgico-chatspinned', 'tgico');\n }\n\n let isUnread = true, isMention = false, unreadBadgeText: string;\n if(dialog.unread_mentions_count && unreadCount === 1) {\n unreadBadgeText = '@';\n isMention = true;\n // dom.unreadBadge.classList.add('tgico-mention', 'tgico');\n } else if(isDialogUnread) {\n // dom.unreadMessagesSpan.innerText = '' + (unreadCount ? formatNumber(unreadCount, 1) : ' ');\n unreadBadgeText = '' + (unreadCount ? formatNumber(unreadCount, 1) : ' ');\n } else {\n unreadBadgeText = '';\n isUnread = false;\n }\n\n if(isTopic) {\n const notVisited = isDialogUnread && unreadBadgeText === ' ';\n dom.unreadBadge.classList.toggle('not-visited', notVisited);\n }\n\n const b: Array<[HTMLElement, string]> = [\n [dom.unreadBadge, unreadBadgeText],\n [dom.unreadAvatarBadge, unreadBadgeText || undefined]\n ];\n\n b.filter(Boolean).forEach(([badge, text]) => {\n if(text !== undefined) {\n badge.innerText = unreadBadgeText;\n }\n\n badge.classList.toggle('unread', isUnread);\n badge.classList.toggle('mention', isMention);\n });\n\n deferred.resolve();\n }\n\n private async getDialog(dialog: Dialog | ForumTopic | PeerId, threadId?: number) {\n if(typeof(dialog) !== 'object') {\n let originalDialog: Dialog | ForumTopic;\n if(threadId) {\n originalDialog = await this.managers.dialogsStorage.getForumTopic(dialog, threadId);\n if(!originalDialog) {\n const peerId = dialog || NULL_PEER_ID;\n return {\n peerId,\n pFlags: {}\n } as any as ForumTopic;\n }\n } else {\n originalDialog = await this.managers.appMessagesManager.getDialogOnly(dialog);\n if(!originalDialog) {\n const peerId = dialog || NULL_PEER_ID;\n return {\n peerId,\n peer: await this.managers.appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } as any as Dialog;\n }\n }\n\n return originalDialog;\n }\n\n return dialog as Dialog | ForumTopic;\n }\n\n public addListDialog(options: Parameters[0] & {isBatch?: boolean}) {\n options.autonomous = false;\n\n const ret = this.addDialogNew(options);\n\n if(ret) {\n const {peerId} = options;\n const getDialogPromise = this.getDialog(peerId, options.threadId);\n const promise = getDialogPromise.then((dialog) => {\n const promises: Promise[] = [];\n const isUser = peerId.isUser();\n if(!isUser && dialog._ === 'dialog') {\n promises.push(this.xd.processDialogForCallStatus(peerId, ret.dom));\n }\n\n if(peerId !== rootScope.myId && isUser) {\n promises.push(this.managers.appUsersManager.getUserStatus(peerId.toUserId()).then((status) => {\n if(status?._ === 'userStatusOnline') {\n this.xd.setOnlineStatus(ret.dom.avatarEl, true);\n }\n }));\n }\n\n promises.push(this.setLastMessageN({\n dialog,\n dialogElement: ret,\n isBatch: options.isBatch,\n setUnread: true\n }));\n\n return Promise.all(promises);\n });\n\n options.loadPromises?.push(promise);\n }\n\n return ret;\n }\n\n /**\n * use for rendering search result\n */\n public addDialogAndSetLastMessage(options: Omit[0], 'dialog'> & {\n message: MyMessage,\n peerId: PeerId,\n query?: string\n }) {\n const {peerId, message, query} = options;\n const ret = this.addDialogNew({\n ...options,\n ...getMessageSenderPeerIdOrName(message),\n peerId\n });\n\n this.setLastMessageN({\n dialog: {_: 'dialog', peerId} as any,\n lastMessage: message,\n dialogElement: ret,\n highlightWord: query\n });\n\n if(message.peerId !== peerId) {\n ret.dom.listEl.dataset.peerId = '' + message.peerId;\n }\n\n return ret;\n }\n\n public addDialogNew(options: DialogElementOptions & {container?: HTMLElement | Scrollable | false, append?: boolean}) {\n const d = new DialogElement({\n autonomous: !!options.container,\n avatarSize: 'bigger',\n ...options\n // avatarSize: !options.avatarSize || options.avatarSize >= 54 ? 'bigger' : 'abitbigger',\n });\n\n if(options.container) {\n const method = !options.append ? 'append' : 'prepend';\n options.container[method](d.container);\n }\n\n return d;\n // return this.addDialog(options.peerId, options.container, options.rippleEnabled, options.onlyFirstName, options.meAsSaved, options.append, options.avatarSize, options.autonomous, options.lazyLoadQueue, options.loadPromises, options.fromName, options.noIcons);\n }\n}\n\nconst appDialogsManager = new AppDialogsManager();\nMOUNT_CLASS_TO.appDialogsManager = appDialogsManager;\nexport default appDialogsManager;\n","export default function getUnsafeRandomInt(min: number, max: number) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {DownloadMediaOptions, DownloadOptions} from '../mtproto/apiFileManager';\nimport type {AppMessagesManager} from './appMessagesManager';\nimport type {MyDocument} from './appDocsManager';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {InputFile, Photo, PhotoSize} from '../../layer';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport {AppManagers} from './managers';\nimport rootScope from '../rootScope';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport noop from '../../helpers/noop';\nimport getDownloadMediaDetails from './utils/download/getDownloadMediaDetails';\nimport getDownloadFileNameFromOptions from './utils/download/getDownloadFileNameFromOptions';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport makeError from '../../helpers/makeError';\nimport createDownloadAnchor from '../../helpers/dom/createDownloadAnchor';\nimport {getFileNameByLocation} from '../../helpers/fileName';\nimport getDocumentDownloadOptions from './utils/docs/getDocumentDownloadOptions';\nimport getPhotoDownloadOptions from './utils/photos/getPhotoDownloadOptions';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\n\nexport type ResponseMethodBlob = 'blob';\nexport type ResponseMethodJson = 'json';\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\n\n/* export type DownloadBlob = {promise: Promise, controller: AbortController};\nexport type DownloadJson = {promise: Promise, controller: AbortController}; */\nexport type DownloadBlob = CancellablePromise;\nexport type DownloadUrl = CancellablePromise;\nexport type DownloadJson = CancellablePromise;\n// export type Download = DownloadBlob/* | DownloadJson */;\nexport type Download = DownloadBlob | DownloadUrl/* | DownloadJson */;\n\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\nexport type ProgressCallback = (details: Progress) => void;\n\ntype DownloadType = 'url' | 'blob' | 'void' | 'disc';\n\nexport class AppDownloadManager {\n private downloads: {[fileName: string]: {main: Download} & {[type in DownloadType]?: Download}} = {};\n // private downloadsToDisc: {[fileName: string]: Download} = {};\n private progress: {[fileName: string]: Progress} = {};\n // private progressCallbacks: {[fileName: string]: Array} = {};\n private managers: AppManagers;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n rootScope.addEventListener('download_progress', (details) => {\n // const callbacks = this.progressCallbacks[details.fileName];\n // if(callbacks) {\n // callbacks.forEach((callback) => callback(details));\n // }\n\n const download = this.downloads[details.fileName];\n if(download?.main?.notifyAll) {\n this.progress[details.fileName] = details;\n download.main.notifyAll(details);\n }\n });\n }\n\n private getNewDeferred(fileName: string, type?: DownloadType) {\n const deferred = deferredPromise();\n\n let download = this.downloads[fileName];\n if(!download) {\n download = this.downloads[fileName] = {\n main: deferred as any\n };\n\n deferred.cancel = () => {\n const error = makeError('DOWNLOAD_CANCELED');\n\n this.managers.apiFileManager.cancelDownload(fileName);\n\n deferred.reject(error);\n deferred.cancel = noop;\n };\n\n deferred.catch(() => {\n this.clearDownload(fileName, type);\n }).finally(() => {\n delete this.progress[fileName];\n // delete this.progressCallbacks[fileName];\n });\n } else {\n const main = download.main;\n (['cancel', 'addNotifyListener', 'notify', 'notifyAll'] as (keyof CancellablePromise)[]).forEach((key) => {\n if(!main[key]) {\n return;\n }\n\n // @ts-ignore\n deferred[key] = main[key].bind(main);\n });\n }\n\n const haveToClear = type === 'disc';\n if(haveToClear) {\n deferred.catch(noop).finally(() => {\n this.clearDownload(fileName, type);\n });\n }\n\n return download[type] = deferred as any;\n }\n\n public getNewDeferredForUpload>(fileName: string, promise: T) {\n const deferred = this.getNewDeferred(fileName);\n promise.then(deferred.resolve, deferred.reject);\n\n deferred.finally(() => {\n this.clearDownload(fileName);\n });\n\n return deferred as CancellablePromise>;\n }\n\n private clearDownload(fileName: string, type?: DownloadType) {\n const downloads = this.downloads[fileName];\n if(!downloads) {\n return;\n }\n\n delete downloads[type];\n\n const length = Object.keys(downloads).length;\n if(!length || (downloads.main && length === 1)) {\n delete this.downloads[fileName];\n }\n }\n\n public getUpload(fileName: string): ReturnType['promise'] {\n let deferred: CancellablePromise = this.getDownload(fileName);\n if(deferred) {\n return deferred;\n }\n\n deferred = this.getNewDeferred(fileName);\n this.managers.appMessagesManager.getUploadPromise(fileName).then(deferred.resolve, deferred.reject);\n return deferred;\n }\n\n /* public fakeDownload(fileName: string, value: Blob | string) {\n const deferred = this.getNewDeferred(fileName);\n if(typeof(value) === 'string') {\n fetch(value)\n .then((response) => response.blob())\n .then((blob) => deferred.resolve(blob));\n } else {\n deferred.resolve(value);\n }\n\n return deferred;\n } */\n\n private d(fileName: string, getPromise: () => Promise, type?: DownloadType) {\n let deferred = this.getDownload(fileName, type);\n if(deferred) return deferred;\n\n deferred = this.getNewDeferred(fileName, type);\n getPromise().then(deferred.resolve, deferred.reject);\n return deferred;\n }\n\n public download(options: DownloadOptions): DownloadBlob {\n const fileName = getDownloadFileNameFromOptions(options);\n return this.d(fileName, () => this.managers.apiFileManager.download(options), 'blob') as any;\n }\n\n public downloadMedia(options: DownloadMediaOptions, type: DownloadType = 'blob', promiseBefore?: Promise): DownloadBlob {\n const {downloadOptions, fileName} = getDownloadMediaDetails(options);\n\n return this.d(fileName, () => {\n let cb: any;\n if(type === 'url') {\n cb = this.managers.apiFileManager.downloadMediaURL;\n } else if(type === 'void'/* || type === 'disc' */) {\n cb = this.managers.apiFileManager.downloadMediaVoid;\n } else /* if(type === 'blob') */ {\n cb = this.managers.apiFileManager.downloadMedia;\n }\n\n if(promiseBefore) {\n return promiseBefore.then(() => cb(options));\n }\n\n return cb(options);\n }, type) as any;\n }\n\n public downloadMediaURL(options: DownloadMediaOptions): DownloadUrl {\n return this.downloadMedia(options, 'url') as any;\n }\n\n public downloadMediaVoid(options: DownloadMediaOptions): DownloadBlob {\n return this.downloadMedia(options, 'void');\n }\n\n public upload(file: File | Blob, fileName?: string, promise?: Promise) {\n if(!fileName) {\n fileName = getFileNameForUpload(file);\n }\n\n if(!promise) {\n promise = this.managers.apiFileManager.upload({file, fileName});\n }\n\n const deferred = this.getNewDeferredForUpload(fileName, promise);\n return deferred as any as CancellablePromise;\n }\n\n public getDownload(fileName: string, type?: DownloadType) {\n const d = this.downloads[fileName];\n return d && d[type];\n }\n\n // public addProgressCallback(fileName: string, callback: ProgressCallback) {\n // const progress = this.progress[fileName];\n // (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\n\n // if(progress) {\n // callback(progress);\n // }\n // }\n\n public downloadToDisc(options: DownloadMediaOptions, justAttach?: boolean) {\n const media = options.media;\n const isDocument = media._ === 'document';\n if(!isDocument && !options.thumb) {\n options.thumb = (media as Photo.photo).sizes.slice().pop() as PhotoSize.photoSize;\n }\n\n // const {fileName: cacheFileName} = getDownloadMediaDetails(options);\n // if(justAttach) {\n // const promise = this.downloadsToDisc[cacheFileName];\n // if(promise) {\n // return promise;\n // }\n // }\n\n // const {downloadOptions, fileName} = getDownloadMediaDetails(options);\n // if(downloadOptions.size && downloadOptions.size > MAX_FILE_SAVE_SIZE) {\n const id = '' + (Math.random() * 0x7FFFFFFF | 0);\n // const id = 'test';\n const url = `download/${id}`;\n options.downloadId = id;\n\n const pingPromise = apiManagerProxy.pingServiceWorkerWithIframe();\n\n const promise = this.downloadMedia(options, 'disc', pingPromise);\n // this.downloadsToDisc[cacheFileName] = promise;\n\n if(justAttach) {\n return promise;\n }\n\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n\n pingPromise.then(() => {\n iframe.src = url;\n document.body.append(iframe);\n });\n\n // createDownloadAnchor(url, 'asd.txt');\n\n // const events = [\n // 'emptied',\n // 'abort',\n // 'suspend',\n // 'reset',\n // 'error',\n // 'ended',\n // 'load'\n // ].forEach((event) => {\n // iframe.addEventListener(event, () => alert(event));\n // iframe.contentWindow.addEventListener(event, () => alert(event));\n // });\n\n let element: HTMLElement, hadProgress = false;\n const onProgress = () => {\n if(hadProgress) {\n return;\n }\n\n hadProgress = true;\n element = iframe;\n\n indexOfAndSplice(promise.listeners, onProgress);\n };\n\n promise.addNotifyListener(onProgress);\n promise.then((blob) => {\n if(!blob) {\n return;\n }\n\n const url = URL.createObjectURL(blob);\n const downloadOptions = isDocument ?\n getDocumentDownloadOptions(media) :\n getPhotoDownloadOptions(media as any, options.thumb as PhotoSize.photoSize);\n const fileName = (options.media as MyDocument).file_name || getFileNameByLocation(downloadOptions.location);\n createDownloadAnchor(url, downloadOptions.fileName || fileName, () => {\n URL.revokeObjectURL(url);\n });\n }).catch(noop).finally(() => {\n if(!hadProgress) {\n onProgress();\n }\n\n setTimeout(() => {\n element?.remove();\n }, 1000);\n\n // if(this.downloadsToDisc[cacheFileName] === promise) {\n // delete this.downloadsToDisc[cacheFileName];\n // }\n });\n\n return promise;\n }\n}\n\nconst appDownloadManager = new AppDownloadManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\nexport default appDownloadManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function createDownloadAnchor(url: string, fileName: string, onRemove?: () => void) {\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName;\n a.target = '_blank';\n\n a.style.position = 'absolute';\n a.style.top = '1px';\n a.style.left = '1px';\n\n document.body.append(a);\n\n try {\n const clickEvent = document.createEvent('MouseEvents');\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n a.dispatchEvent(clickEvent);\n } catch(e) {\n console.error('Download click error', e);\n try {\n a.click();\n } catch(e) {\n window.open(url as string, '_blank');\n }\n }\n\n setTimeout(() => {\n a.remove();\n onRemove && onRemove();\n }, 100);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../lib/rootScope';\n// import { generatePathData } from \"../../helpers/dom\";\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport type Chat from './chat';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport AvatarElement from '../avatar';\nimport {Message} from '../../layer';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport {SERVICE_AS_REGULAR, STICKY_OFFSET} from './bubbles';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport partition from '../../helpers/array/partition';\nimport noop from '../../helpers/noop';\nimport getMessageThreadId from '../../lib/appManagers/utils/messages/getMessageThreadId';\n\ntype GroupItem = {\n bubble: HTMLElement,\n fromId: PeerId,\n mid: number,\n groupMid?: number,\n timestamp: number,\n dateTimestamp: number,\n mounted: boolean,\n single: boolean,\n group?: BubbleGroup,\n message: Message.message | Message.messageService // use it only to set avatar\n};\n\nclass BubbleGroup {\n container: HTMLElement;\n chat: Chat;\n groups: BubbleGroups;\n items: GroupItem[]; // descend sorted\n avatarContainer: HTMLElement;\n avatarLoadPromise: ReturnType;\n avatar: AvatarElement;\n mounted: boolean;\n dateTimestamp: number;\n offset: number;\n\n constructor(chat: Chat, groups: BubbleGroups, dateTimestamp: number) {\n this.container = document.createElement('div');\n this.container.classList.add('bubbles-group');\n this.chat = chat;\n this.groups = groups;\n this.items = [];\n this.dateTimestamp = dateTimestamp;\n this.offset = 0;\n }\n\n createAvatar(message: Message.message | Message.messageService) {\n if(this.avatarLoadPromise) {\n return this.avatarLoadPromise;\n } else if(message._ === 'messageService') {\n return;\n }\n\n this.avatarContainer = document.createElement('div');\n this.avatarContainer.classList.add('bubbles-group-avatar-container');\n ++this.offset;\n\n const fwdFrom = message.fwd_from;\n const fwdFromId = message.fwdFromId;\n const isForwardFromChannel = message.from_id && message.from_id._ === 'peerChannel' && message.fromId === fwdFromId;\n const currentPeerId = this.chat.peerId;\n const avatar = this.avatar = new AvatarElement();\n this.avatar.classList.add('bubbles-group-avatar', 'user-avatar', 'avatar-40'/* , 'can-zoom-fade' */);\n const peerId = ((fwdFrom && (currentPeerId === rootScope.myId || currentPeerId === REPLIES_PEER_ID)) || isForwardFromChannel ? fwdFromId : message.fromId) || NULL_PEER_ID;\n const avatarLoadPromise = this.avatar.updateWithOptions({\n lazyLoadQueue: this.chat.bubbles.lazyLoadQueue,\n peerId,\n peerTitle: !fwdFromId && fwdFrom && fwdFrom.from_name ? /* '🔥 FF 🔥' */fwdFrom.from_name : undefined\n });\n\n // this.avatarLoadPromise = Promise.all([\n // avatarLoadPromise,\n // peerId && peerId.isUser() ? this.chat.managers.appUsersManager.getUser(peerId.toUserId()) : undefined\n // ]).then(([result, user]) => {\n // if(user?.pFlags?.premium) {\n // avatar.classList.add('is-premium', 'tgico-star');\n // }\n\n // return result;\n // });\n this.avatarLoadPromise = avatarLoadPromise;\n\n this.avatarContainer.append(this.avatar);\n this.container.append(this.avatarContainer);\n\n return this.avatarLoadPromise;\n }\n\n get firstTimestamp() {\n return this.firstItem.timestamp;\n }\n\n get firstMid() {\n return this.firstItem.mid;\n }\n\n get firstItem() {\n return this.items[this.items.length - 1];\n }\n\n get lastTimestamp() {\n return this.lastItem.timestamp;\n }\n\n get lastMid() {\n return this.lastItem.mid;\n }\n\n get lastItem() {\n return this.items[0];\n }\n\n updateClassNames() {\n const items = this.items;\n const length = items.length;\n if(!length) {\n return;\n }\n\n // const elements = Array.from(this.container.children);\n // if(this.offset) elements.splice(0, this.offset);\n\n // const length = elements.length;\n // if(!length) {\n // return;\n // }\n\n const first = items[length - 1].bubble;\n\n if(items.length === 1) {\n first.classList.add('is-group-first', 'is-group-last');\n // this.setClipIfNeeded(first);\n return;\n } else {\n first.classList.remove('is-group-last');\n first.classList.add('is-group-first');\n // this.setClipIfNeeded(first, true);\n }\n\n for(let i = 1, _length = length - 1; i < _length; ++i) {\n const bubble = items[i].bubble;\n bubble.classList.remove('is-group-last', 'is-group-first');\n // this.setClipIfNeeded(bubble, true);\n }\n\n const last = items[0].bubble;\n last.classList.remove('is-group-first');\n last.classList.add('is-group-last');\n // this.setClipIfNeeded(last);\n }\n\n insertItem(item: GroupItem) {\n const {items} = this;\n insertInDescendSortedArray(items, item, this.groups.sortGroupItemsKey);\n\n item.group = this;\n if(items.length === 1) {\n this.groups.insertGroup(this);\n }\n }\n\n removeItem(item: GroupItem) {\n indexOfAndSplice(this.items, item);\n\n if(!this.items.length) {\n indexOfAndSplice(this.groups.groups, this);\n }\n\n item.group = undefined;\n }\n\n mount(updateClassNames?: boolean) {\n if(!this.groups.groups.includes(this) || !this.items.length) { // group can be already removed\n debugger;\n\n if(this.mounted) {\n this.onItemUnmount();\n }\n\n return;\n }\n\n const {offset, items} = this;\n const {length} = items;\n forEachReverse(items, (item, idx) => {\n this.mountItem(item, length - 1 - idx, offset);\n });\n\n if(updateClassNames) {\n this.updateClassNames();\n }\n\n this.onItemMount();\n }\n\n mountItem(item: GroupItem, idx = this.items.indexOf(item), offset = this.offset) {\n if(item.mounted) {\n return;\n }\n\n positionElementByIndex(item.bubble, this.container, offset + idx);\n item.mounted = true;\n }\n\n unmountItem(item: GroupItem) {\n if(!item.mounted) {\n return;\n }\n\n item.bubble.remove();\n item.mounted = false;\n this.onItemUnmount();\n }\n\n onItemMount() {\n if(this.mounted) {\n return;\n }\n\n const dateContainer = this.chat.bubbles.getDateContainerByTimestamp(this.dateTimestamp / 1000);\n // const idx = this.groups.indexOf(group);\n const dateGroups = this.groups.groups.filter((_group) => _group.dateTimestamp === this.dateTimestamp);\n const dateGroupsLength = dateGroups.length;\n const idx = dateGroups.indexOf(this);\n const unmountedLength = dateGroups.slice(idx + 1).reduce((acc, v) => acc + (v.mounted ? 0 : 1), 0);\n positionElementByIndex(this.container, dateContainer.container, STICKY_OFFSET + dateGroupsLength - 1 - idx - unmountedLength);\n this.mounted = true;\n }\n\n onItemUnmount() {\n if(!this.mounted) {\n return;\n }\n\n if(!this.items.length) {\n this.container.remove();\n this.chat.bubbles.deleteEmptyDateGroups();\n this.mounted = false;\n } else {\n this.updateClassNames();\n }\n }\n}\n\n// class BubbleGroupItem implements GroupItem {\n// bubble: HTMLElement;\n// fromId: PeerId;\n// mid: number;\n// timestamp: number;\n// dateTimestamp: number;\n// mounted: boolean;\n// single: boolean;\n// group: BubbleGroup;\n\n// constructor(details: GroupItem) {\n// Object.assign(this, details);\n// }\n// }\n\nexport default class BubbleGroups {\n public itemsArr: Array = []; // descend sorted\n private itemsMap: Map = new Map();\n public groups: Array = []; // descend sorted\n private newGroupDiff = 121; // * 121 in scheduled messages\n private sortItemsKey: Extract;\n private sortGroupsKey: Extract;\n public sortGroupItemsKey: Extract;\n\n constructor(private chat: Chat) {\n this.sortItemsKey = chat.type === 'scheduled' ? 'timestamp' : 'mid';\n this.sortGroupsKey = chat.type === 'scheduled' ? 'lastTimestamp' : 'lastMid';\n this.sortGroupItemsKey = /* chat.type === 'scheduled' ? 'timestamp' : */'groupMid';\n }\n\n removeItem(item: GroupItem) {\n item.group?.removeItem(item);\n this.removeItemFromCache(item);\n }\n\n removeAndUnmountBubble(bubble: HTMLElement) {\n const item = this.getItemByBubble(bubble);\n if(!item) {\n if(bubble.parentElement) {\n bubble.remove(); // * can be a placeholder\n }\n\n return false;\n }\n\n const items = this.itemsArr;\n const index = items.indexOf(item);\n const siblings = this.getSiblingsAtIndex(index, items);\n\n const group = item.group;\n this.removeItem(item);\n\n const modifiedGroups: Set = new Set();\n if(group) {\n group.unmountItem(item);\n modifiedGroups.add(group);\n }\n\n const [previousSibling, nextSibling] = siblings;\n if(\n previousSibling &&\n nextSibling &&\n this.canItemsBeGrouped(previousSibling, nextSibling) &&\n previousSibling.group !== nextSibling.group\n ) {\n const group = nextSibling.group;\n this.f(nextSibling.group.items);\n group.onItemUnmount();\n modifiedGroups.add(previousSibling.group);\n this.groupUngrouped();\n }\n\n this.mountUnmountGroups(Array.from(modifiedGroups));\n\n return true;\n }\n\n mountUnmountGroups(groups: BubbleGroup[]) {\n // groups.sort((a, b) => (b.lastItem?.mid ?? 0) - (a.lastItem?.mid ?? 0));\n\n const [toMount, toUnmount] = partition(groups, (group) => !!group.items.length);\n toUnmount.forEach((group) => {\n group.onItemUnmount();\n })\n\n toMount.forEach((group) => {\n group.mount(true);\n });\n\n // toMount.forEach((group) => {\n // group.updateClassNames();\n // });\n }\n\n f(items: GroupItem[], index: number = 0, length = items.length) {\n for(; index < length; ++index) {\n const item = items[index];\n item.mounted = false;\n item.group.removeItem(item);\n --length;\n --index;\n }\n }\n\n getItemByBubble(bubble: HTMLElement) {\n return this.itemsMap.get(bubble);\n }\n\n getLastGroup() {\n return this.groups[0];\n }\n\n changeBubbleMid(bubble: HTMLElement, mid: number) {\n const item = this.getItemByBubble(bubble);\n if(!item) {\n return;\n }\n\n item.mid = mid;\n\n // indexOfAndSplice(item.group.items, item);\n // // const canChangeGroupMid = !item.group.items.length || item.group.items.every((item) => item.groupMid === item.mid);\n // // if(canChangeGroupMid) item.groupMid = mid;\n // item.group.insertItem(item);\n\n indexOfAndSplice(this.itemsArr, item);\n this.insertItemToArray(item, this.itemsArr);\n }\n\n changeItemBubble(item: GroupItem, bubble: HTMLElement) {\n this.itemsMap.delete(item.bubble);\n item.bubble = bubble;\n this.itemsMap.set(bubble, item);\n }\n\n changeBubbleByBubble(from: HTMLElement, to: HTMLElement) {\n const item = this.getItemByBubble(from);\n if(!item) {\n return;\n }\n\n this.changeItemBubble(item, to);\n }\n\n canItemsBeGrouped(item1: GroupItem, item2: GroupItem) {\n return item2.fromId === item1.fromId &&\n Math.abs(item2.timestamp - item1.timestamp) <= this.newGroupDiff &&\n item1.dateTimestamp === item2.dateTimestamp &&\n !item1.single &&\n !item2.single &&\n item1.message.pFlags.out === item2.message.pFlags.out &&\n (!this.chat.isAllMessagesForum || getMessageThreadId(item1.message, true) === getMessageThreadId(item2.message, true));\n }\n\n getSiblingsAtIndex(itemIndex: number, items: GroupItem[]) {\n return [items[itemIndex - 1], items[itemIndex + 1]] as const;\n }\n\n // findGroupSiblingInSiblings(item: GroupItem, siblings: ReturnType) {\n // return siblings.find((sibling) => sibling && this.canItemsBeGrouped(item, sibling));\n // }\n\n findGroupSiblingByItem(item: GroupItem, items: GroupItem[]) {\n items = items.slice();\n const idx = this.insertItemToArray(item, items);\n // return this.findGroupSiblingInSiblings(item, this.getSiblingsAtIndex(idx, items));\n return this.findGroupSiblingInItems(item, items, idx);\n }\n\n findGroupSiblingInItems(item: GroupItem, items: GroupItem[], index = items.indexOf(item), length = items.length) {\n const previousItem = items[index - 1];\n let siblingGroupedItem: GroupItem;\n if(previousItem?.group && this.canItemsBeGrouped(item, previousItem)) {\n siblingGroupedItem = previousItem;\n } else {\n for(let k = index + 1; k < length; ++k) {\n const nextItem = items[k];\n if(this.canItemsBeGrouped(item, nextItem)) {\n if(nextItem.group) {\n siblingGroupedItem = nextItem;\n }\n } else {\n break;\n }\n }\n }\n\n return siblingGroupedItem;\n }\n\n addItemToGroup(item: GroupItem, group: BubbleGroup) {\n group.insertItem(item);\n this.addItemToCache(item);\n }\n\n insertItemToArray(item: GroupItem, array: GroupItem[]) {\n return insertInDescendSortedArray(array, item, this.sortItemsKey);\n }\n\n insertGroup(group: BubbleGroup) {\n return insertInDescendSortedArray(this.groups, group, this.sortGroupsKey);\n }\n\n addItemToCache(item: GroupItem) {\n this.insertItemToArray(item, this.itemsArr);\n this.itemsMap.set(item.bubble, item);\n }\n\n removeItemFromCache(item: GroupItem) {\n indexOfAndSplice(this.itemsArr, item);\n this.itemsMap.delete(item.bubble);\n }\n\n getMessageFromId(message: MyMessage) {\n let fromId = message.viaBotId || message.fromId;\n\n // fix for saved messages forward to self\n if(fromId === rootScope.myId && message.peerId === rootScope.myId && (message as Message.message).fwdFromId === fromId) {\n fromId = fromId.toPeerId(true);\n }\n\n return fromId;\n }\n\n createItem(bubble: HTMLElement, message: MyMessage) {\n const single = !(message._ === 'message' || (message.action && SERVICE_AS_REGULAR.has(message.action._)));\n const {mid, date: timestamp} = message;\n const {dateTimestamp} = this.chat.bubbles.getDateForDateContainer(timestamp);\n const item: GroupItem = {\n mid,\n groupMid: this.chat.type === 'scheduled' ? +`${(timestamp * 1000 - dateTimestamp) / 1000}.${mid}` : mid,\n fromId: this.getMessageFromId(message),\n bubble,\n // timestamp: this.chat.type === 'scheduled' ? +`${(timestamp * 1000 - dateTimestamp) / 1000}.${mid}` : timestamp,\n timestamp,\n dateTimestamp,\n mounted: false,\n single,\n message\n };\n\n return item;\n }\n\n splitSiblingsOnGrouping(siblings: ReturnType) {\n const [previousSibling, nextSibling] = siblings;\n const previousGroup = previousSibling?.group;\n const nextGroup = nextSibling?.group;\n\n if(!previousGroup) {\n return;\n }\n\n // will refresh group\n // if(previousGroup === nextGroup) {\n const items = previousGroup.items;\n const index = items.indexOf(previousSibling) + 1;\n const length = items.length;\n if(index === length) {\n return;\n }\n\n const modifiedGroups: BubbleGroup[] = [previousGroup];\n // if(previousGroup !== nextGroup && nextGroup) {\n // modifiedGroups.push(nextGroup);\n // }\n\n this.f(items, index, length);\n return modifiedGroups;\n // }\n }\n\n prepareForGrouping(bubble: HTMLElement, message: MyMessage) {\n const foundItem = this.getItemByBubble(bubble);\n if(foundItem) { // should happen only on edit\n // debugger;\n return;\n }\n\n const item = this.createItem(bubble, message);\n this.addItemToCache(item);\n }\n\n groupUngrouped() {\n const items = this.itemsArr;\n const length = items.length;\n const modifiedGroups: Set = new Set();\n // for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const item = items[i];\n if(item.group) {\n continue;\n }\n\n let hadGroup = true;\n const siblings = this.getSiblingsAtIndex(i, items);\n const siblingGroupedItem = this.findGroupSiblingInItems(item, items, i, length);\n\n // const foundItem = this.findGroupSiblingInSiblings(item, siblings);\n const foundItem = siblingGroupedItem;\n const group = foundItem?.group ?? (hadGroup = false, new BubbleGroup(this.chat, this, item.dateTimestamp));\n\n modifiedGroups.add(group);\n group.insertItem(item);\n\n if(!hadGroup) {\n const splittedGroups = this.splitSiblingsOnGrouping(siblings);\n if(splittedGroups) {\n splittedGroups.forEach((group) => modifiedGroups.add(group));\n }\n }\n }\n\n return modifiedGroups;\n }\n\n // addBubble(bubble: HTMLElement, message: MyMessage, unmountIfFound?: boolean) {\n // const oldItem = this.getItemByBubble(bubble);\n // if(unmountIfFound) { // updating position\n // this.removeAndUnmountBubble(bubble);\n // } else if(oldItem) { // editing\n // const group = oldItem.group;\n // this.changeItemBubble(oldItem, bubble);\n // oldItem.mounted = false;\n\n // return {item: oldItem, group};\n // }\n\n // const item = this.createItem(bubble, message);\n\n // const foundItem = this.findSameGroupItem(item, this.itemsArr);\n\n // const group = foundItem?.group ?? new BubbleGroup(this.chat, this, item.dateTimestamp);\n // this.addItemToGroup(item, group);\n\n // return {item, group};\n // }\n\n /* setClipIfNeeded(bubble: HTMLDivElement, remove = false) {\n //console.log('setClipIfNeeded', bubble, remove);\n const className = bubble.className;\n if(className.includes('is-message-empty') && (className.includes('photo') || className.includes('video'))) {\n let container = bubble.querySelector('.bubble__media-container') as SVGSVGElement;\n //console.log('setClipIfNeeded', bubble, remove, container);\n if(!container) return;\n\n try {\n Array.from(container.children).forEach((object) => {\n if(object instanceof SVGDefsElement) return;\n\n if(remove) {\n object.removeAttributeNS(null, 'clip-path');\n } else {\n let clipId = container.dataset.clipId;\n let path = container.firstElementChild.firstElementChild.lastElementChild as SVGPathElement;\n let width = +object.getAttributeNS(null, 'width');\n let height = +object.getAttributeNS(null, 'height');\n let isOut = className.includes('is-out');\n let isReply = className.includes('is-reply');\n let d = '';\n\n //console.log('setClipIfNeeded', object, width, height, isOut);\n\n let tr: number, tl: number;\n if(className.includes('forwarded') || isReply) {\n tr = tl = 0;\n } else if(isOut) {\n tr = className.includes('is-group-first') ? 12 : 6;\n tl = 12;\n } else {\n tr = 12;\n tl = className.includes('is-group-first') ? 12 : 6;\n }\n\n if(isOut) {\n d = generatePathData(0, 0, width - 9, height, tl, tr, 0, 12);\n } else {\n d = generatePathData(9, 0, width - 9, height, tl, tr, 12, 0);\n }\n\n path.setAttributeNS(null, 'd', d);\n object.setAttributeNS(null, 'clip-path', 'url(#' + clipId + ')');\n }\n });\n } catch(err) {}\n }\n } */\n\n // updateGroupByMessageId(mid: number) {\n // const item = this.itemsArr.find((g) => g.mid === mid);\n // if(item) {\n // item.group.updateGroup();\n // }\n // }\n\n cleanup() {\n this.itemsArr = [];\n this.groups = [];\n this.itemsMap.clear();\n }\n\n // findIncorrentPositions() {\n // var bubbles = Array.from(this.chat.bubbles.chatInner.querySelectorAll('.bubbles-group .bubble')).reverse();\n // var items = this.itemsArr;\n // for(var i = 0, length = items.length; i < length; ++i) {\n // const item = items[i];\n // const foundBubble = bubbles[i];\n // if(item.bubble !== foundBubble) {\n // console.log('incorrect position', i, item, foundBubble);\n // // debugger;\n // // break;\n // }\n // }\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function partition(arr: T[], callback: (item: T, idx: number, arr: T[]) => boolean) {\n const good: T[] = [], bad: T[] = [];\n for(let i = 0, length = arr.length; i < length; ++i) {\n const item = arr[i];\n (callback(item, i, arr) ? good : bad).push(item);\n }\n\n return [good, bad];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement, {PopupOptions} from '.';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport I18n, {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\nimport InputField from '../inputField';\n\nexport default class PopupDatePicker extends PopupElement {\n protected controlsDiv: HTMLElement;\n protected monthTitle: HTMLElement;\n protected prevBtn: HTMLElement;\n protected nextBtn: HTMLElement;\n\n protected monthsContainer: HTMLElement;\n protected month: HTMLElement;\n\n protected minMonth: Date;\n protected maxMonth: Date;\n protected minDate: Date;\n protected maxDate: Date;\n protected selectedDate: Date;\n protected selectedMonth: Date;\n protected selectedEl: HTMLElement;\n\n protected timeDiv: HTMLDivElement;\n protected hoursInputField: InputField;\n protected minutesInputField: InputField;\n\n constructor(initDate: Date, public onPick: (timestamp: number) => void, protected options: Partial<{\n noButtons: true,\n noTitle: true,\n minDate: Date,\n maxDate: Date\n withTime: true,\n showOverflowMonths: true\n }> & PopupOptions = {}) {\n super('popup-date-picker', {\n body: true,\n overlayClosable: true,\n buttons: options.noButtons ? [] : [{\n langKey: 'JumpToDate',\n callback: () => {\n if(this.onPick) {\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\n }\n }\n }, {\n langKey: 'Cancel',\n isCancel: true\n }],\n title: true,\n ...options\n });\n\n this.minDate = options.minDate || new Date('2013-08-01T00:00:00');\n\n if(initDate < this.minDate) {\n initDate.setFullYear(this.minDate.getFullYear(), this.minDate.getMonth(), this.minDate.getDate());\n }\n\n // Controls\n this.controlsDiv = document.createElement('div');\n this.controlsDiv.classList.add('date-picker-controls');\n\n this.prevBtn = document.createElement('button');\n this.prevBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-prev');\n attachClickEvent(this.prevBtn, this.onPrevClick, {listenerSetter: this.listenerSetter});\n\n this.nextBtn = document.createElement('button');\n this.nextBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-next');\n attachClickEvent(this.nextBtn, this.onNextClick, {listenerSetter: this.listenerSetter});\n\n this.monthTitle = document.createElement('div');\n this.monthTitle.classList.add('date-picker-month-title');\n\n this.controlsDiv.append(this.prevBtn, this.monthTitle, this.nextBtn);\n\n // Month\n this.monthsContainer = document.createElement('div');\n this.monthsContainer.classList.add('date-picker-months');\n attachClickEvent(this.monthsContainer, this.onDateClick, {listenerSetter: this.listenerSetter});\n\n this.body.append(this.controlsDiv, this.monthsContainer);\n\n // Time inputs\n if(options.withTime) {\n this.timeDiv = document.createElement('div');\n this.timeDiv.classList.add('date-picker-time');\n\n const delimiter = document.createElement('div');\n delimiter.classList.add('date-picker-time-delimiter');\n delimiter.append(':');\n\n const handleTimeInput = (max: number, inputField: InputField, onInput: (length: number) => void, onOverflow?: (number: number) => void) => {\n const maxString = '' + max;\n this.listenerSetter.add(inputField.input)('input', (e) => {\n let value = inputField.value.replace(/\\D/g, '');\n if(value.length > 2) {\n value = value.slice(0, 2);\n } else {\n if((value.length === 1 && +value[0] > +maxString[0]) || (value.length === 2 && +value > max)) {\n if(value.length === 2 && onOverflow) {\n onOverflow(+value[1]);\n }\n\n value = '0' + value[0];\n }\n }\n\n inputField.setValueSilently(value);\n onInput(value.length);\n });\n };\n\n this.hoursInputField = new InputField({plainText: true});\n this.minutesInputField = new InputField({plainText: true});\n\n handleTimeInput(23, this.hoursInputField, (length) => {\n if(length === 2) {\n this.minutesInputField.input.focus();\n }\n\n this.setTimeTitle();\n }, (number) => {\n this.minutesInputField.value = (number + this.minutesInputField.value).slice(0, 2);\n });\n handleTimeInput(59, this.minutesInputField, (length) => {\n if(!length) {\n this.hoursInputField.input.focus();\n }\n\n this.setTimeTitle();\n });\n\n this.selectedDate = initDate;\n\n initDate.setMinutes(initDate.getMinutes() + 10);\n\n this.hoursInputField.setValueSilently(('0' + initDate.getHours()).slice(-2));\n this.minutesInputField.setValueSilently(('0' + initDate.getMinutes()).slice(-2));\n\n initDate.setHours(0, 0, 0, 0);\n\n this.timeDiv.append(this.hoursInputField.container, delimiter, this.minutesInputField.container);\n\n attachClickEvent(this.btnConfirm, () => {\n if(this.onPick) {\n this.selectedDate.setHours(+this.hoursInputField.value || 0, +this.minutesInputField.value || 0, 0, 0);\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\n }\n\n this.hide();\n }, {listenerSetter: this.listenerSetter});\n\n this.body.append(this.timeDiv);\n\n this.prevBtn.classList.add('primary');\n this.nextBtn.classList.add('primary');\n }\n\n const popupCenterer = document.createElement('div');\n popupCenterer.classList.add('popup-centerer');\n popupCenterer.append(this.container);\n this.element.append(popupCenterer);\n\n // const passed = (initDate.getTime() - (initDate.getTimezoneOffset() * 60000)) % 86400000;\n // this.selectedDate = this.maxDate = new Date(initDate.getTime() - passed);\n initDate.setHours(0, 0, 0, 0);\n this.selectedDate = initDate;\n\n this.maxDate = options.maxDate || new Date();\n this.maxDate.setHours(0, 0, 0, 0);\n\n this.selectedMonth = new Date(this.selectedDate);\n this.selectedMonth.setDate(1);\n\n this.maxMonth = new Date(this.maxDate);\n this.maxMonth.setDate(1);\n\n this.minMonth = new Date(this.minDate);\n this.minMonth.setHours(0, 0, 0, 0);\n this.minMonth.setDate(1);\n\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\n this.prevBtn.setAttribute('disabled', 'true');\n }\n\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\n this.nextBtn.setAttribute('disabled', 'true');\n }\n\n if(options.noTitle) {\n this.setTitle = () => {};\n }\n\n this.setTimeTitle();\n this.setTitle();\n this.setMonth();\n }\n\n onPrevClick = (e: MouseEvent) => {\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() - 1);\n this.setMonth();\n\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\n this.prevBtn.setAttribute('disabled', 'true');\n }\n\n this.nextBtn.removeAttribute('disabled');\n };\n\n onNextClick = (e: MouseEvent) => {\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() + 1);\n this.setMonth();\n\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\n this.nextBtn.setAttribute('disabled', 'true');\n }\n\n this.prevBtn.removeAttribute('disabled');\n };\n\n onDateClick = (e: MouseEvent) => {\n // cancelEvent(e);\n const target = e.target as HTMLElement;\n\n if(!target.dataset.timestamp) return;\n\n if(this.selectedEl) {\n if(this.selectedEl === target) return;\n this.selectedEl.classList.remove('active');\n }\n\n this.selectedEl = target;\n\n target.classList.add('active');\n const timestamp = +target.dataset.timestamp;\n\n this.selectedDate = new Date(timestamp);\n\n this.setTitle();\n this.setTimeTitle();\n };\n\n public setTimeTitle() {\n if(this.btnConfirm && this.selectedDate) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n const date = new Date();\n date.setHours(0, 0, 0, 0);\n\n const timeOptions: Intl.DateTimeFormatOptions = {\n minute: '2-digit',\n hour: '2-digit'\n };\n\n const sendDate = new Date(this.selectedDate.getTime());\n sendDate.setHours(+this.hoursInputField.value, +this.minutesInputField.value);\n\n if(this.selectedDate.getTime() === date.getTime()) {\n key = 'Schedule.SendToday';\n }/* else if(this.selectedDate.getTime() === (date.getTime() + 86400e3)) {\n dayStr = 'Tomorrow';\n } */ else {\n key = 'Schedule.SendDate';\n\n const dateOptions: Intl.DateTimeFormatOptions = {\n month: 'short',\n day: 'numeric'\n };\n\n if(sendDate.getFullYear() !== date.getFullYear()) {\n dateOptions.year = 'numeric';\n }\n\n args.push(new I18n.IntlDateElement({\n date: sendDate,\n options: dateOptions\n }).element);\n }\n\n args.push(new I18n.IntlDateElement({\n date: sendDate,\n options: timeOptions\n }).element);\n\n this.btnConfirm.firstChild.replaceWith(i18n(key, args));\n }\n }\n\n public setTitle() {\n // const splitted = this.selectedDate.toString().split(' ', 3);\n // this.title.innerText = splitted[0] + ', ' + splitted[1] + ' ' + splitted[2];\n this.title.textContent = '';\n this.title.append(new I18n.IntlDateElement({\n date: this.selectedDate,\n options: {\n day: 'numeric',\n month: 'long',\n weekday: 'short'\n }\n }).element);\n }\n\n private renderElement(disabled: boolean, innerText: string | HTMLElement = '') {\n const el = document.createElement('button');\n el.classList.add('btn-icon', 'date-picker-month-date');\n\n if(disabled) {\n el.setAttribute('disabled', 'true');\n }\n\n if(innerText) {\n el.append(innerText);\n }\n\n return el;\n }\n\n public setMonth() {\n const firstDate = new Date(this.selectedMonth);\n\n const options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: this.timeDiv && mediaSizes.isMobile ? 'short' : 'long'\n };\n\n this.monthTitle.textContent = '';\n this.monthTitle.append(new I18n.IntlDateElement({date: firstDate, options}).element);\n // this.monthTitle.innerText = (this.timeDiv && mediaSizes.isMobile ? monthName.slice(0, 3) : monthName) + ' ' + this.selectedMonth.getFullYear();\n\n if(this.month) {\n this.month.remove();\n }\n\n this.month = document.createElement('div');\n this.month.classList.add('date-picker-month');\n\n const weekStartDate = new Date();\n const day = weekStartDate.getDay();\n if(day !== 1) {\n weekStartDate.setHours(-24 * (day - 1));\n }\n\n for(let i = 0; i < 7; ++i) {\n const el = this.renderElement(true, new I18n.IntlDateElement({date: weekStartDate, options: {weekday: 'narrow'}}).element);\n el.classList.remove('date-picker-month-date');\n el.classList.add('date-picker-month-day');\n this.month.append(el);\n weekStartDate.setDate(weekStartDate.getDate() + 1);\n }\n\n // 0 - sunday\n let dayIndex = firstDate.getDay() - 1;\n if(dayIndex === -1) dayIndex = 7 - 1;\n\n const clonedDate = new Date(firstDate.getTime());\n clonedDate.setDate(clonedDate.getDate() - dayIndex - 1);\n\n // Padding first week\n for(let i = 0; i < dayIndex; ++i) {\n if(this.options.showOverflowMonths) {\n clonedDate.setDate(clonedDate.getDate() + 1);\n this.month.append(this.renderElement(true, '' + clonedDate.getDate()));\n } else {\n this.month.append(this.renderElement(true));\n }\n }\n\n do {\n const date = firstDate.getDate();\n const el = this.renderElement(firstDate > this.maxDate || firstDate < this.minDate, '' + date);\n el.dataset.timestamp = '' + firstDate.getTime();\n\n if(firstDate.getTime() === this.selectedDate.getTime()) {\n this.selectedEl = el;\n el.classList.add('active');\n }\n\n this.month.append(el);\n\n firstDate.setDate(date + 1);\n } while(firstDate.getDate() !== 1);\n\n const remainder = this.month.childElementCount % 7;\n if(this.options.showOverflowMonths && remainder) {\n for(let i = remainder; i < 7; ++i) {\n this.month.append(this.renderElement(true, '' + firstDate.getDate()));\n firstDate.setDate(firstDate.getDate() + 1);\n }\n }\n\n const lines = Math.ceil(this.month.childElementCount / 7);\n this.container.dataset.lines = '' + lines;\n\n this.monthsContainer.append(this.month);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {setDirection} from '../helpers/dom/setInnerHTML';\n\nexport default class DivAndCaption {\n public container: HTMLElement;\n public border: HTMLElement;\n public content: HTMLElement;\n public title: HTMLElement;\n public subtitle: HTMLElement;\n\n constructor(protected className: string, public fill?: T) {\n this.container = document.createElement('div');\n this.container.className = className;\n\n this.border = document.createElement('div');\n this.border.classList.add(className + '-border');\n\n this.content = document.createElement('div');\n this.content.classList.add(className + '-content');\n\n this.title = document.createElement('div');\n this.title.classList.add(className + '-title');\n setDirection(this.title);\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add(className + '-subtitle');\n setDirection(this.subtitle);\n\n this.content.append(this.title, this.subtitle);\n this.container.append(this.border, this.content);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {Middleware} from '../../helpers/middleware';\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {Document, Message, MessageMedia, Photo, WebPage} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport DivAndCaption from '../divAndCaption';\nimport wrapMessageForReply from '../wrappers/messageForReply';\nimport wrapPhoto from '../wrappers/photo';\nimport wrapSticker from '../wrappers/sticker';\nimport wrapVideo from '../wrappers/video';\nimport {AnimationItemGroup} from '../animationIntersector';\n\nconst MEDIA_SIZE = 32;\n\nexport async function wrapReplyDivAndCaption(options: {\n title: string | HTMLElement | DocumentFragment,\n titleEl: HTMLElement,\n subtitle: string | HTMLElement | DocumentFragment,\n subtitleEl: HTMLElement,\n message: Message.message | Message.messageService,\n mediaEl: HTMLElement,\n loadPromises?: Promise[],\n animationGroup: AnimationItemGroup\n}) {\n let {title, titleEl, subtitle, subtitleEl, mediaEl, message, loadPromises, animationGroup} = options;\n if(title !== undefined) {\n if(typeof(title) === 'string') {\n title = limitSymbols(title, 140);\n title = wrapEmojiText(title);\n }\n\n replaceContent(titleEl, title);\n }\n\n if(!loadPromises) {\n loadPromises = [];\n }\n\n let messageMedia: MessageMedia | WebPage.webPage = (message as Message.message)?.media;\n let setMedia = false, isRound = false;\n const mediaChildren = mediaEl ? Array.from(mediaEl.children).slice() : [];\n let middleware: Middleware;\n if(messageMedia && mediaEl) {\n subtitleEl.textContent = '';\n subtitleEl.append(await wrapMessageForReply({message, animationGroup, withoutMediaType: true}));\n\n messageMedia = (messageMedia as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || messageMedia;\n const photo = (messageMedia as MessageMedia.messageMediaPhoto).photo as Photo.photo;\n const document = (messageMedia as MessageMedia.messageMediaDocument).document as Document.document;\n if(photo || (document && document.thumbs?.length)/* ['video', 'sticker', 'gif', 'round', 'photo', 'audio'].indexOf(document.type) !== -1) */) {\n middleware = appImManager.chat.bubbles.getMiddleware();\n const lazyLoadQueue = appImManager.chat.bubbles.lazyLoadQueue;\n\n if(document?.type === 'sticker') {\n await wrapSticker({\n doc: document,\n div: mediaEl,\n lazyLoadQueue,\n group: animationGroup,\n // onlyThumb: document.sticker === 2,\n width: MEDIA_SIZE,\n height: MEDIA_SIZE,\n middleware,\n loadPromises\n });\n setMedia = true;\n } else if(document?.type === 'gif' && document.video_thumbs) {\n setMedia = true;\n await wrapVideo({\n doc: document,\n container: mediaEl,\n boxWidth: MEDIA_SIZE,\n boxHeight: MEDIA_SIZE,\n lazyLoadQueue,\n noPlayButton: true,\n noInfo: true,\n middleware,\n loadPromises,\n withoutPreloader: true,\n videoSize: document.video_thumbs[0],\n group: animationGroup\n });\n } else {\n const m = photo || document;\n isRound = document?.type === 'round';\n\n try {\n await wrapPhoto({\n photo: m,\n container: mediaEl,\n boxWidth: MEDIA_SIZE,\n boxHeight: MEDIA_SIZE,\n size: choosePhotoSize(m, MEDIA_SIZE, MEDIA_SIZE),\n middleware,\n lazyLoadQueue,\n noBlur: true,\n withoutPreloader: true,\n loadPromises\n });\n setMedia = true;\n } catch(err) {\n\n }\n }\n }\n } else {\n if(message) {\n subtitleEl.textContent = '';\n subtitleEl.append(await wrapMessageForReply({message}));\n } else {\n if(typeof(subtitle) === 'string') {\n subtitle = limitSymbols(subtitle, 140);\n subtitle = wrapEmojiText(subtitle);\n }\n\n replaceContent(subtitleEl, subtitle || '');\n }\n }\n\n Promise.all(loadPromises).then(() => {\n if(middleware && !middleware()) return;\n mediaChildren.forEach((child) => child.remove());\n\n if(mediaEl) {\n mediaEl.classList.toggle('is-round', isRound);\n }\n });\n\n return setMedia;\n}\n\nexport default class ReplyContainer extends DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => Promise> {\n private mediaEl: HTMLElement;\n\n constructor(protected className: string, protected animationGroup: AnimationItemGroup) {\n super(className, async(title, subtitle = '', message?) => {\n if(!this.mediaEl) {\n this.mediaEl = document.createElement('div');\n this.mediaEl.classList.add(this.className + '-media');\n }\n\n const isMediaSet = await wrapReplyDivAndCaption({\n title,\n titleEl: this.title,\n subtitle,\n subtitleEl: this.subtitle,\n mediaEl: this.mediaEl,\n message,\n animationGroup\n });\n\n this.container.classList.toggle('is-media', isMediaSet);\n if(isMediaSet) {\n this.content.prepend(this.mediaEl);\n } else {\n this.mediaEl.remove();\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {hexToRgb} from '../../helpers/color';\nimport {Message} from '../../layer';\nimport getPeerColorById from '../../lib/appManagers/utils/peers/getPeerColorById';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport ReplyContainer from '../chat/replyContainer';\n\nexport default function wrapReply(\n title: Parameters[0],\n subtitle: Parameters[1],\n animationGroup: AnimationItemGroup,\n message?: Message.message | Message.messageService,\n setColorPeerId?: PeerId\n) {\n const replyContainer = new ReplyContainer('reply', animationGroup);\n const fillPromise = replyContainer.fill(title, subtitle, message);\n\n if(setColorPeerId) {\n const hex = getPeerColorById(setColorPeerId, false);\n const [r, g, b] = hexToRgb(hex);\n replyContainer.container.style.setProperty('--override-color', `${r}, ${g}, ${b}`);\n replyContainer.container.classList.add('is-overriding-color');\n // replyContainer.border.style.backgroundColor = hex;\n // replyContainer.title.style.color = hex;\n }\n\n return {container: replyContainer.container, fillPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarElement from './avatar';\nimport type LazyLoadQueue from './lazyLoadQueue';\n\nconst CLASS_NAME = 'stacked-avatars';\nconst AVATAR_CLASS_NAME = CLASS_NAME + '-avatar';\nconst AVATAR_CONTAINER_CLASS_NAME = AVATAR_CLASS_NAME + '-container';\n\nexport default class StackedAvatars {\n public container: HTMLElement;\n private lazyLoadQueue: LazyLoadQueue;\n private avatarSize: number;\n\n constructor(options: {\n lazyLoadQueue?: StackedAvatars['lazyLoadQueue'],\n avatarSize: StackedAvatars['avatarSize']\n }) {\n this.lazyLoadQueue = options.lazyLoadQueue;\n this.avatarSize = options.avatarSize;\n\n this.container = document.createElement('div');\n this.container.classList.add(CLASS_NAME);\n\n this.container.style.setProperty('--avatar-size', options.avatarSize + 'px');\n }\n /**\n * MACOS, ANDROID - без реверса\n * WINDOWS DESKTOP - реверс\n * все приложения накладывают аватарку первую на вторую, а в макете зато вторая на первую, ЛОЛ!\n */\n public render(peerIds: PeerId[], loadPromises?: Promise[]) {\n const children = this.container.children;\n peerIds = peerIds.slice().reverse();\n if(peerIds.length > 3) {\n peerIds = peerIds.slice(-3);\n }\n\n peerIds.forEach((peerId, idx) => {\n let avatarContainer = children[idx] as HTMLElement;\n if(!avatarContainer) {\n avatarContainer = document.createElement('div');\n avatarContainer.classList.add(AVATAR_CONTAINER_CLASS_NAME);\n }\n\n let avatarElem = avatarContainer.firstElementChild as AvatarElement;\n if(!avatarElem) {\n avatarElem = new AvatarElement();\n avatarElem.classList.add('avatar-' + this.avatarSize, AVATAR_CLASS_NAME);\n avatarElem.updateOptions({\n isDialog: false,\n loadPromises\n });\n }\n\n avatarElem.updateWithOptions({\n lazyLoadQueue: this.lazyLoadQueue,\n peerId: peerId\n });\n\n if(!avatarElem.parentNode) {\n avatarContainer.append(avatarElem);\n }\n\n if(!avatarContainer.parentNode) {\n this.container.append(avatarContainer);\n }\n });\n\n // if were 3 and became 2\n (Array.from(children) as HTMLElement[]).slice(peerIds.length).forEach((el) => el.remove());\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message} from '../../layer';\nimport rootScope from '../../lib/rootScope';\nimport ripple from '../ripple';\nimport I18n from '../../lib/langPack';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport StackedAvatars from '../stackedAvatars';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport type LazyLoadQueue from '../lazyLoadQueue';\n\nconst TAG_NAME = 'replies-element';\n\nrootScope.addEventListener('replies_updated', (message) => {\n (Array.from(document.querySelectorAll(TAG_NAME + `[data-post-key=\"${message.peerId}_${message.mid}\"]`)) as RepliesElement[]).forEach((element) => {\n element.message = message;\n element.render();\n });\n});\n\nexport default class RepliesElement extends HTMLElement {\n public message: Message.message;\n public type: 'footer' | 'beside';\n public loadPromises: Promise[];\n public lazyLoadQueue: LazyLoadQueue;\n public stackedAvatars: StackedAvatars;\n public text: I18n.IntlElement;\n public managers: AppManagers;\n\n private updated = false;\n\n constructor() {\n super();\n this.managers = rootScope.managers;\n }\n\n public init() {\n this.render();\n this.dataset.postKey = this.message.peerId + '_' + this.message.mid;\n this.classList.add('replies', 'replies-' + this.type);\n }\n\n public render() {\n const replies = this.message.replies;\n\n /* if(this.firstChild) {\n this.innerHTML = '';\n } */\n\n if(this.type === 'footer') {\n let leftPart: HTMLElement;\n if(this.firstElementChild) {\n leftPart = this.firstElementChild as HTMLElement;\n }\n\n if(replies?.recent_repliers) {\n if(leftPart && !leftPart.classList.contains('replies-footer-avatars')) {\n this.innerHTML = '';\n leftPart = null;\n }\n\n if(!this.stackedAvatars) {\n this.stackedAvatars = new StackedAvatars({\n lazyLoadQueue: this.lazyLoadQueue,\n avatarSize: 30\n });\n\n this.stackedAvatars.container.classList.add('replies-footer-avatars');\n }\n\n leftPart = this.stackedAvatars.container;\n\n this.stackedAvatars.render(replies.recent_repliers.map((peer) => getPeerId(peer)), this.loadPromises);\n } else {\n if(leftPart && !leftPart.classList.contains('tgico-comments')) {\n leftPart.remove();\n leftPart = null;\n }\n\n if(!leftPart) {\n leftPart = document.createElement('span');\n leftPart.classList.add('tgico-comments');\n }\n }\n\n if(!leftPart.parentElement) {\n this.prepend(leftPart);\n }\n\n if(!this.text) {\n this.text = new I18n.IntlElement();\n }\n\n const text = this.text;\n if(replies) {\n if(replies.replies) {\n text.compareAndUpdate({key: 'Comments', args: [replies.replies]});\n } else {\n text.compareAndUpdate({key: 'LeaveAComment'});\n }\n } else {\n text.compareAndUpdate({key: 'ViewInChat'});\n }\n\n if(replies) {\n // const historyStorage = appMessagesManager.getHistoryStorage(replies.channel_id.toPeerId(true));\n let isUnread = false;\n if(replies.replies) {\n if(replies.read_max_id !== undefined && replies.max_id !== undefined) {\n isUnread = replies.read_max_id < replies.max_id;\n }/* else {\n isUnread = !historyStorage.readMaxId || historyStorage.readMaxId < (replies.max_id || 0);\n } */\n }\n this.classList.toggle('is-unread', isUnread);\n }\n\n let textSpan = this.children[1] as HTMLElement;\n if(!textSpan) {\n textSpan = document.createElement('span');\n textSpan.classList.add('replies-footer-text');\n\n const iconSpan = document.createElement('span');\n iconSpan.classList.add('tgico-next');\n\n const rippleContainer = document.createElement('div');\n ripple(rippleContainer);\n\n this.append(textSpan, iconSpan, rippleContainer);\n }\n\n replaceContent(textSpan, text.element);\n } else {\n this.classList.add('bubble-beside-button');\n this.innerHTML = `${replies?.replies ? formatNumber(replies.replies, 0) : ''}`;\n }\n\n if(replies && !this.updated && !this.message.pFlags.is_outgoing) {\n this.managers.appMessagesManager.subscribeRepliesThread(this.message.peerId, this.message.mid);\n this.managers.appMessagesManager.updateMessage(this.message.peerId, this.message.mid, 'replies_updated');\n this.updated = true;\n }\n\n if(this.loadPromises) {\n this.loadPromises = undefined;\n }\n }\n}\n\ncustomElements.define(TAG_NAME, RepliesElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatTime, getFullDate} from '../../helpers/date';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {Message} from '../../layer';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {i18n, _i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../lib/rootScope';\nimport type LazyLoadQueue from '../lazyLoadQueue';\nimport PeerTitle from '../peerTitle';\nimport wrapReply from '../wrappers/reply';\nimport Chat, {ChatType} from './chat';\nimport RepliesElement from './replies';\n\nconst NBSP = ' ';\n\nconst makeEdited = () => {\n const edited = document.createElement('i');\n edited.classList.add('edited');\n _i18n(edited, 'EditedMessage');\n return edited;\n};\n\nconst makeSponsored = () => i18n('SponsoredMessage');\n\nexport namespace MessageRender {\n /* export const setText = () => {\n\n }; */\n\n export const setTime = (options: {\n chatType: ChatType,\n message: Message.message | Message.messageService,\n reactionsMessage?: Message.message\n }) => {\n const {chatType, message} = options;\n const date = new Date(message.date * 1000);\n const args: (HTMLElement | string)[] = [];\n\n let editedSpan: HTMLElement,\n sponsoredSpan: HTMLElement;\n // reactionsElement: ReactionsElement,\n // reactionsMessage: Message.message;\n\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\n const isMessage = !('action' in message) && !isSponsored;\n // let hasReactions: boolean;\n\n const time: HTMLElement = isSponsored ? undefined : formatTime(date);\n if(isMessage) {\n if(message.views) {\n const postAuthor = message.post_author || message.fwd_from?.post_author;\n\n const postViewsSpan = document.createElement('span');\n postViewsSpan.classList.add('post-views');\n postViewsSpan.innerHTML = formatNumber(message.views, 1);\n\n const channelViews = document.createElement('i');\n channelViews.classList.add('tgico-channelviews', 'time-icon');\n\n args.push(postViewsSpan, channelViews);\n if(postAuthor) {\n const span = document.createElement('span');\n setInnerHTML(span, wrapEmojiText(postAuthor));\n span.insertAdjacentHTML('beforeend', ',' + NBSP)\n args.push(span);\n }\n }\n\n if(message.edit_date && chatType !== 'scheduled' && !message.pFlags.edit_hide) {\n args.unshift(editedSpan = makeEdited());\n }\n\n if(chatType !== 'pinned' && message.pFlags.pinned) {\n const i = document.createElement('i');\n i.classList.add('tgico-pinnedchat', 'time-icon');\n args.unshift(i);\n }\n\n // if(USER_REACTIONS_INLINE && message.peer_id._ === 'peerUser'/* && message.reactions?.results?.length */) {\n // hasReactions = true;\n\n // reactionsMessage = options.reactionsMessage;\n // reactionsElement = new ReactionsElement();\n // reactionsElement.init(reactionsMessage, 'inline', true);\n // reactionsElement.render();\n // args.unshift(reactionsElement);\n // }\n } else if(isSponsored) {\n args.push(sponsoredSpan = makeSponsored());\n }\n\n if(time) {\n args.push(time);\n }\n\n let title = isSponsored ? undefined : getFullDate(date);\n if(isMessage) {\n title += (message.edit_date && !message.pFlags.edit_hide ? `\\nEdited: ${getFullDate(new Date(message.edit_date * 1000))}` : '') +\n (message.fwd_from ? `\\nOriginal: ${getFullDate(new Date(message.fwd_from.date * 1000))}` : '');\n }\n\n const timeSpan = document.createElement('span');\n timeSpan.classList.add('time', 'tgico');\n // if(title) timeSpan.title = title;\n timeSpan.append(...args);\n\n const inner = document.createElement('div');\n inner.classList.add('inner', 'tgico');\n if(title) inner.title = title;\n\n let clonedArgs = args;\n if(editedSpan) {\n clonedArgs[clonedArgs.indexOf(editedSpan)] = makeEdited();\n }\n if(sponsoredSpan) {\n clonedArgs[clonedArgs.indexOf(sponsoredSpan)] = makeSponsored();\n }\n // if(reactionsElement) {\n // const _reactionsElement = clonedArgs[clonedArgs.indexOf(reactionsElement)] = new ReactionsElement();\n // _reactionsElement.init(reactionsMessage, 'inline');\n // _reactionsElement.render();\n // }\n clonedArgs = clonedArgs.map((a) => a instanceof HTMLElement && !a.classList.contains('i18n') && !a.classList.contains('reactions') ? a.cloneNode(true) as HTMLElement : a);\n if(time) {\n clonedArgs[clonedArgs.length - 1] = formatTime(date); // clone time\n }\n inner.append(...clonedArgs);\n\n timeSpan.append(inner);\n\n return timeSpan;\n };\n\n export const renderReplies = ({bubble, bubbleContainer, message, messageDiv, loadPromises, lazyLoadQueue}: {\n bubble: HTMLElement,\n bubbleContainer: HTMLElement,\n message: Message.message,\n messageDiv: HTMLElement,\n loadPromises?: Promise[],\n lazyLoadQueue?: LazyLoadQueue\n }) => {\n const isFooter = !bubble.classList.contains('sticker') && !bubble.classList.contains('emoji-big') && !bubble.classList.contains('round');\n const repliesFooter = new RepliesElement();\n repliesFooter.message = message;\n repliesFooter.type = isFooter ? 'footer' : 'beside';\n repliesFooter.loadPromises = loadPromises;\n repliesFooter.lazyLoadQueue = lazyLoadQueue;\n repliesFooter.init();\n bubbleContainer.prepend(repliesFooter);\n return isFooter;\n };\n\n export const setReply = async({chat, bubble, bubbleContainer, message}: {\n chat: Chat,\n bubble: HTMLElement,\n bubbleContainer?: HTMLElement,\n message: Message.message\n }) => {\n const isReplacing = !bubbleContainer;\n if(isReplacing) {\n bubbleContainer = bubble.querySelector('.bubble-content');\n }\n\n const currentReplyDiv = isReplacing ? bubbleContainer.querySelector('.reply') : null;\n if(!message.reply_to_mid) {\n currentReplyDiv?.remove();\n\n bubble.classList.remove('is-reply');\n return;\n }\n\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : chat.peerId;\n\n const originalMessage = await rootScope.managers.appMessagesManager.getMessageByPeer(replyToPeerId, message.reply_to_mid);\n let originalPeerTitle: string | HTMLElement;\n\n // ///////this.log('message to render reply', originalMessage, originalPeerTitle, bubble, message);\n\n let titlePeerId: PeerId;\n // need to download separately\n if(!originalMessage) {\n // ////////this.log('message to render reply empty, need download', message, message.reply_to_mid);\n rootScope.managers.appMessagesManager.fetchMessageReplyTo(message);\n chat.bubbles.needUpdate.push({replyToPeerId, replyMid: message.reply_to_mid, mid: message.mid});\n\n originalPeerTitle = i18n('Loading');\n } else {\n const originalMessageFwdFromId = (originalMessage as Message.message).fwdFromId;\n titlePeerId = message.fwdFromId && message.fwdFromId === originalMessageFwdFromId ? message.fwdFromId : originalMessage.fromId || originalMessageFwdFromId;\n originalPeerTitle = new PeerTitle({\n peerId: titlePeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n }\n\n const {container, fillPromise} = wrapReply(originalPeerTitle, undefined, chat.animationGroup, originalMessage, chat.isAnyGroup ? titlePeerId : undefined);\n await fillPromise;\n if(currentReplyDiv) {\n if(currentReplyDiv.classList.contains('floating-part')) {\n container.classList.add('floating-part');\n }\n currentReplyDiv.replaceWith(container);\n } else {\n bubbleContainer.append(container);\n }\n // bubbleContainer.insertBefore(, nameContainer);\n bubble.classList.add('is-reply');\n\n return container;\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\n\nexport function getElementByPoint(container: HTMLElement, verticalSide: 'top' | 'bottom', horizontalSide: 'center' | 'left'): HTMLElement {\n // return null;\n const rect = container.getBoundingClientRect();\n const x = horizontalSide === 'center' ? Math.ceil(rect.left + ((rect.right - rect.left) / 2) + 1) : Math.ceil(rect.left + 1);\n const y = verticalSide === 'bottom' ? Math.floor(rect.top + rect.height - 1) : Math.ceil(rect.top + 1);\n return document.elementFromPoint(x, y) as any;\n};\n\nMOUNT_CLASS_TO.getElementByPoint = getElementByPoint;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function reflowScrollableElement(element: HTMLElement) {\n element.style.display = 'none';\n void element.offsetLeft; // reflow\n element.style.display = '';\n}\n","export const SEND_WHEN_ONLINE_TIMESTAMP = 0x7FFFFFFE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport enum INTERNAL_LINK_TYPE {\n MESSAGE,\n PRIVATE_POST,\n STICKER_SET,\n JOIN_CHAT,\n VOICE_CHAT,\n USER_PHONE_NUMBER,\n INVOICE,\n EMOJI_SET\n};\n\nexport type InternalLink = InternalLink.InternalLinkMessage | InternalLink.InternalLinkPrivatePost | InternalLink.InternalLinkStickerSet | InternalLink.InternalLinkJoinChat | InternalLink.InternalLinkVoiceChat | InternalLink.InternalLinkUserPhoneNumber | InternalLink.InternalLinkInvoice | InternalLink.InternalLinkEmojiSet;\n\nexport namespace InternalLink {\n export interface InternalLinkMessage {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: string,\n post?: string,\n comment?: string,\n thread?: string,\n start?: string,\n stack?: number // local\n }\n\n export interface InternalLinkPrivatePost {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: string,\n post: string,\n thread?: string,\n comment?: string,\n stack?: number // local\n }\n\n export interface InternalLinkStickerSet {\n _: INTERNAL_LINK_TYPE.STICKER_SET,\n set: string\n }\n\n export interface InternalLinkJoinChat {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: string\n }\n\n /**\n * LOCAL LINK\n */\n export interface InternalLinkVoiceChat {\n _: INTERNAL_LINK_TYPE.VOICE_CHAT,\n id: string,\n access_hash: string,\n chat_id: string\n }\n\n export interface InternalLinkUserPhoneNumber {\n _: INTERNAL_LINK_TYPE.USER_PHONE_NUMBER,\n phone: string\n }\n\n export interface InternalLinkInvoice {\n _: INTERNAL_LINK_TYPE.INVOICE,\n slug: string\n }\n\n export interface InternalLinkEmojiSet {\n _: INTERNAL_LINK_TYPE.EMOJI_SET,\n set: string\n }\n}\n\nexport type InternalLinkTypeMap = {\n [INTERNAL_LINK_TYPE.MESSAGE]: InternalLink.InternalLinkMessage,\n [INTERNAL_LINK_TYPE.PRIVATE_POST]: InternalLink.InternalLinkPrivatePost,\n [INTERNAL_LINK_TYPE.STICKER_SET]: InternalLink.InternalLinkStickerSet,\n [INTERNAL_LINK_TYPE.JOIN_CHAT]: InternalLink.InternalLinkJoinChat,\n [INTERNAL_LINK_TYPE.VOICE_CHAT]: InternalLink.InternalLinkVoiceChat,\n [INTERNAL_LINK_TYPE.USER_PHONE_NUMBER]: InternalLink.InternalLinkUserPhoneNumber,\n [INTERNAL_LINK_TYPE.INVOICE]: InternalLink.InternalLinkInvoice,\n [INTERNAL_LINK_TYPE.EMOJI_SET]: InternalLink.InternalLinkEmojiSet\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement, {addCancelButton} from '.';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport {ChatInvite} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {i18n, _i18n} from '../../lib/langPack';\nimport {NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport AvatarElement from '../avatar';\nimport putPhoto from '../putPhoto';\nimport {toastNew} from '../toast';\nimport wrapPhoto from '../wrappers/photo';\n\n// const FAKE_CHAT_ID = Number.MAX_SAFE_INTEGER - 0x1000;\n\nexport default class PopupJoinChatInvite extends PopupElement {\n constructor(\n private hash: string,\n private chatInvite: ChatInvite.chatInvite\n ) {\n super('popup-join-chat-invite', {\n closable: true,\n overlayClosable: true,\n body: true,\n buttons: addCancelButton([{\n langKey: chatInvite.pFlags.request_needed ? 'RequestJoin.Button' : (chatInvite.pFlags.broadcast ? 'JoinByPeekChannelTitle' : 'JoinByPeekGroupTitle'),\n callback: () => {\n this.managers.appChatsManager.importChatInvite(hash)\n .then((chatId) => {\n const peerId = chatId.toPeerId(true);\n appImManager.setInnerPeer({peerId});\n }, (error) => {\n if(error.type === 'INVITE_REQUEST_SENT') {\n toastNew({langPackKey: 'RequestToJoinSent'});\n }\n });\n }\n }])\n });\n\n this.construct();\n }\n\n private async construct() {\n this.header.remove();\n /* const fakeChat: Chat.channel | Chat.chat = {\n _: chatInvite.pFlags.channel ? 'channel' : 'chat',\n id: FAKE_CHAT_ID,\n title: chatInvite.title,\n photo: chatInvite.photo as any,\n date: Date.now() / 1000 | 0,\n version: 0,\n participants_count: chatInvite.participants_count,\n pFlags: chatInvite.pFlags as any\n };\n\n appChatsManager.saveApiChat(fakeChat); */\n\n const {chatInvite, managers, hash} = this;\n\n const avatarElem = new AvatarElement();\n avatarElem.classList.add('avatar-100');\n avatarElem.isDialog = false;\n if(chatInvite.photo._ === 'photo') {\n chatInvite.photo = await managers.appPhotosManager.savePhoto(chatInvite.photo);\n wrapPhoto({\n container: avatarElem,\n message: null,\n photo: chatInvite.photo,\n boxHeight: 100,\n boxWidth: 100,\n withoutPreloader: true\n });\n avatarElem.style.width = avatarElem.style.height = '';\n } else {\n putPhoto({\n div: avatarElem,\n peerId: NULL_PEER_ID,\n isDialog: false,\n title: chatInvite.title\n });\n }\n\n const title = document.createElement('div');\n title.classList.add('chat-title');\n setInnerHTML(title, wrapEmojiText(chatInvite.title));\n // avatarElem.setAttribute('peer', '' + -fakeChat.id);\n\n const isBroadcast = chatInvite.pFlags.broadcast;\n const peopleCount = i18n(isBroadcast ? 'Subscribers' : 'Members', [numberThousandSplitter(chatInvite.participants_count)]);\n peopleCount.classList.add('chat-participants-count');\n\n this.body.append(avatarElem, title, peopleCount);\n\n if(chatInvite.pFlags.request_needed) {\n const caption = document.createElement('div');\n _i18n(caption, isBroadcast ? 'RequestToJoinChannelDescription' : 'RequestToJoinGroupDescription');\n caption.classList.add('chat-participants-count', 'request-caption');\n\n this.body.append(caption);\n }\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport callbackify from '../../helpers/callbackify';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {Document, MessagePeerReaction, ReactionCount} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport rootScope from '../../lib/rootScope';\nimport SetTransition from '../singleTransition';\nimport StackedAvatars from '../stackedAvatars';\nimport {Awaited} from '../../types';\nimport wrapSticker from '../wrappers/sticker';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport wrapStickerAnimation from '../wrappers/stickerAnimation';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport {fastRaf} from '../../helpers/schedulers';\nimport noop from '../../helpers/noop';\nimport {Middleware} from '../../helpers/middleware';\n\nconst CLASS_NAME = 'reaction';\nconst TAG_NAME = CLASS_NAME + '-element';\nconst REACTION_INLINE_SIZE = 14;\nconst REACTION_BLOCK_SIZE = 22;\n\nexport const REACTION_DISPLAY_INLINE_COUNTER_AT = 2;\nexport const REACTION_DISPLAY_BLOCK_COUNTER_AT = 4;\n\nexport type ReactionLayoutType = 'block' | 'inline';\n\nexport default class ReactionElement extends HTMLElement {\n private type: ReactionLayoutType;\n private counter: HTMLElement;\n private stickerContainer: HTMLElement;\n private stackedAvatars: StackedAvatars;\n private canRenderAvatars: boolean;\n private _reactionCount: ReactionCount;\n private wrapStickerPromise: Awaited>['render'];\n private managers: AppManagers;\n private middleware: Middleware;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.managers = rootScope.managers;\n }\n\n public get reactionCount() {\n return this._reactionCount;\n }\n\n public set reactionCount(reactionCount: ReactionCount) {\n this._reactionCount = reactionCount;\n }\n\n public get count() {\n return this.reactionCount.count;\n }\n\n public init(type: ReactionLayoutType, middleware: Middleware) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n this.middleware = middleware;\n }\n\n public setCanRenderAvatars(canRenderAvatars: boolean) {\n this.canRenderAvatars = canRenderAvatars;\n }\n\n public render(doNotRenderSticker?: boolean) {\n const hadStickerContainer = !!this.stickerContainer;\n if(!hadStickerContainer) {\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add(CLASS_NAME + '-sticker');\n this.append(this.stickerContainer);\n }\n\n const reactionCount = this.reactionCount;\n if(!doNotRenderSticker && !hadStickerContainer) {\n const reaction = reactionCount.reaction;\n if(reaction._ === 'reactionEmoji') {\n const availableReaction = this.managers.appReactionsManager.getReaction(reaction.emoticon);\n callbackify(availableReaction, (availableReaction) => {\n if(!availableReaction.center_icon) {\n this.stickerContainer.classList.add('is-static');\n }\n\n if(availableReaction.pFlags.inactive) {\n this.classList.add('is-inactive');\n }\n\n this.renderDoc(availableReaction.center_icon ?? availableReaction.static_icon);\n });\n } else if(reaction._ === 'reactionCustomEmoji') {\n this.stickerContainer.classList.add('is-custom');\n const wrapped = wrapCustomEmoji({\n docIds: [reaction.document_id],\n customEmojiSize: makeMediaSize(REACTION_BLOCK_SIZE, REACTION_BLOCK_SIZE)\n });\n\n this.stickerContainer.append(wrapped);\n }\n }\n }\n\n private renderDoc(doc: Document.document) {\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE : REACTION_BLOCK_SIZE;\n const wrapPromise = this.wrapStickerPromise = wrapSticker({\n div: this.stickerContainer,\n doc,\n width: size,\n height: size,\n static: true,\n managers: this.managers,\n middleware: this.middleware\n }).then(({render}) => render).finally(() => {\n if(this.wrapStickerPromise === wrapPromise) {\n this.wrapStickerPromise = undefined;\n }\n });\n }\n\n public renderCounter() {\n const reactionCount = this.reactionCount;\n const displayOn = this.type === 'inline' ? REACTION_DISPLAY_INLINE_COUNTER_AT : REACTION_DISPLAY_BLOCK_COUNTER_AT;\n if(reactionCount.count >= displayOn || (this.type === 'block' && !this.canRenderAvatars)) {\n if(!this.counter) {\n this.counter = document.createElement(this.type === 'inline' ? 'i' : 'span');\n this.counter.classList.add(CLASS_NAME + '-counter');\n }\n\n const formatted = formatNumber(reactionCount.count);\n if(this.counter.textContent !== formatted) {\n this.counter.textContent = formatted;\n }\n\n if(!this.counter.parentElement) {\n this.append(this.counter);\n }\n } else if(this.counter?.parentElement) {\n this.counter.remove();\n this.counter = undefined;\n }\n }\n\n public renderAvatars(recentReactions: MessagePeerReaction[]) {\n if(this.type === 'inline') {\n return;\n }\n\n if(this.reactionCount.count >= REACTION_DISPLAY_BLOCK_COUNTER_AT || !this.canRenderAvatars) {\n if(this.stackedAvatars) {\n this.stackedAvatars.container.remove();\n this.stackedAvatars = undefined;\n }\n\n return;\n }\n\n if(!this.stackedAvatars) {\n this.stackedAvatars = new StackedAvatars({\n avatarSize: 24\n });\n\n this.append(this.stackedAvatars.container);\n }\n\n this.stackedAvatars.render(recentReactions.map((reaction) => getPeerId(reaction.peer_id)));\n }\n\n public setIsChosen(isChosen = this.reactionCount.chosen_order !== undefined) {\n if(this.type === 'inline') return;\n const wasChosen = this.classList.contains('is-chosen') && !this.classList.contains('backwards');\n if(wasChosen !== isChosen) {\n SetTransition({\n element: this,\n className: 'is-chosen',\n forwards: isChosen,\n duration: this.isConnected ? 300 : 0\n });\n }\n }\n\n public fireAroundAnimation() {\n const reaction = this.reactionCount.reaction;\n if(reaction._ !== 'reactionEmoji') return;\n callbackify(this.managers.appReactionsManager.getReaction(reaction.emoticon), (availableReaction) => {\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE + 14 : REACTION_BLOCK_SIZE + 18;\n const div = document.createElement('div');\n div.classList.add(CLASS_NAME + '-sticker-activate');\n\n Promise.all([\n wrapSticker({\n div: div,\n doc: availableReaction.center_icon,\n width: size,\n height: size,\n withThumb: false,\n needUpscale: true,\n play: false,\n skipRatio: 1,\n group: 'none',\n needFadeIn: false,\n managers: this.managers,\n middleware: this.middleware\n }).then(({render}) => render as Promise),\n\n wrapStickerAnimation({\n doc: availableReaction.around_animation,\n size: 80,\n target: this.stickerContainer,\n side: 'center',\n skipRatio: 1,\n play: false,\n managers: this.managers,\n middleware: this.middleware\n }).stickerPromise.catch(noop)\n ]).then(([iconPlayer, aroundPlayer]) => {\n const remove = () => {\n // if(!isInDOM(div)) return;\n iconPlayer.remove();\n div.remove();\n this.stickerContainer.classList.remove('has-animation');\n };\n\n if(!aroundPlayer) {\n remove();\n return;\n }\n\n const removeOnFrame = () => {\n // if(!isInDOM(div)) return;\n fastRaf(remove);\n };\n\n iconPlayer.addEventListener('enterFrame', (frameNo) => {\n if(frameNo === iconPlayer.maxFrame) {\n if(this.wrapStickerPromise) { // wait for fade in animation\n this.wrapStickerPromise.then(() => {\n setTimeout(removeOnFrame, 1e3);\n });\n } else {\n removeOnFrame();\n }\n }\n });\n\n iconPlayer.addEventListener('firstFrame', () => {\n this.stickerContainer.append(div);\n this.stickerContainer.classList.add('has-animation');\n iconPlayer.play();\n aroundPlayer.play();\n }, {once: true});\n });\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport {Middleware, MiddlewareHelper} from '../../helpers/middleware';\nimport {Message, ReactionCount} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport reactionsEqual from '../../lib/appManagers/utils/reactions/reactionsEqual';\nimport rootScope from '../../lib/rootScope';\nimport ReactionElement, {ReactionLayoutType, REACTION_DISPLAY_BLOCK_COUNTER_AT} from './reaction';\n\nconst CLASS_NAME = 'reactions';\nconst TAG_NAME = CLASS_NAME + '-element';\n\nconst REACTIONS_ELEMENTS: Map> = new Map();\nexport {REACTIONS_ELEMENTS};\n\nexport default class ReactionsElement extends HTMLElement {\n private message: Message.message;\n private key: string;\n private isPlaceholder: boolean;\n private type: ReactionLayoutType;\n private sorted: ReactionElement[];\n private onConnectCallback: () => void;\n private managers: AppManagers;\n private middleware: Middleware;\n private middlewareHelpers: Map;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.sorted = [];\n this.middlewareHelpers = new Map();\n this.managers = rootScope.managers;\n }\n\n connectedCallback() {\n let set = REACTIONS_ELEMENTS.get(this.key);\n if(!set) {\n REACTIONS_ELEMENTS.set(this.key, set = new Set());\n }\n\n set.add(this);\n\n if(this.onConnectCallback && this.isConnected) {\n this.onConnectCallback();\n this.onConnectCallback = undefined;\n }\n }\n\n disconnectedCallback() {\n const set = REACTIONS_ELEMENTS.get(this.key);\n set.delete(this);\n if(!set.size) {\n REACTIONS_ELEMENTS.delete(this.key);\n }\n }\n\n public getReactionCount(reactionElement: ReactionElement) {\n return this.sorted[this.sorted.indexOf(reactionElement)].reactionCount;\n }\n\n public getMessage() {\n return this.message;\n }\n\n public init(\n message: Message.message,\n type: ReactionLayoutType,\n middleware: Middleware,\n isPlaceholder = this.isPlaceholder\n ) {\n if(this.key !== undefined) {\n this.disconnectedCallback();\n }\n\n if(this.middleware !== middleware) {\n middleware.onDestroy(() => {\n this.middlewareHelpers.clear();\n });\n }\n\n this.message = message;\n this.key = this.message.peerId + '_' + this.message.mid;\n this.middleware = middleware;\n this.isPlaceholder = isPlaceholder;\n\n if(this.type !== type) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n }\n\n this.connectedCallback();\n }\n\n public changeMessage(message: Message.message) {\n return this.init(message, this.type, this.middleware);\n }\n\n public update(message: Message.message, changedResults?: ReactionCount[]) {\n this.message = message;\n this.render(changedResults);\n }\n\n public render(changedResults?: ReactionCount[]) {\n const reactions = this.message.reactions;\n const hasReactions = !!(reactions && reactions.results.length);\n this.classList.toggle('has-no-reactions', !hasReactions);\n if(!hasReactions && !this.sorted.length) return;\n\n const availableReactionsResult = this.managers.appReactionsManager.getAvailableReactions();\n // callbackify(availableReactionsResult, () => {\n const counts = hasReactions ? (\n reactions.results\n // availableReactionsResult instanceof Promise ?\n // reactions.results :\n // reactions.results.filter((reactionCount) => {\n // return this.managers.appReactionsManager.isReactionActive(reactionCount.reaction);\n // })\n ) : [];\n\n // if(this.message.peerId.isUser()) {\n // counts.sort((a, b) => (b.count - a.count) || ((b.chosen_order ?? 0) - (a.chosen_order ?? 0)));\n // } else {\n counts.sort((a, b) => (b.count - a.count) || ((a.chosen_order ?? 0) - (b.chosen_order ?? 0)));\n // }\n\n forEachReverse(this.sorted, (reactionElement, idx, arr) => {\n const reaction = reactionElement.reactionCount.reaction;\n const found = counts.some((reactionCount) => reactionsEqual(reactionCount.reaction, reaction));\n if(!found) {\n const middlewareHelper = this.middlewareHelpers.get(reactionElement);\n middlewareHelper.destroy();\n this.middlewareHelpers.delete(reactionElement);\n arr.splice(idx, 1);\n reactionElement.remove();\n }\n });\n\n const totalReactions = counts.reduce((acc, c) => acc + c.count, 0);\n const canRenderAvatars = reactions && (!!reactions.pFlags.can_see_list || this.message.peerId.isUser()) && totalReactions < REACTION_DISPLAY_BLOCK_COUNTER_AT;\n this.sorted = counts.map((reactionCount, idx) => {\n let reactionElement = this.sorted.find((reactionElement) => reactionsEqual(reactionElement.reactionCount.reaction, reactionCount.reaction));\n if(!reactionElement) {\n const middlewareHelper = this.middleware.create();\n reactionElement = new ReactionElement();\n reactionElement.init(this.type, middlewareHelper.get());\n this.middlewareHelpers.set(reactionElement, middlewareHelper);\n }\n\n positionElementByIndex(reactionElement, this, idx);\n\n const recentReactions = reactions.recent_reactions ? reactions.recent_reactions.filter((reaction) => reactionsEqual(reaction.reaction, reactionCount.reaction)) : [];\n reactionElement.reactionCount = {...reactionCount};\n reactionElement.setCanRenderAvatars(canRenderAvatars);\n reactionElement.render(this.isPlaceholder);\n reactionElement.renderCounter();\n reactionElement.renderAvatars(recentReactions);\n reactionElement.setIsChosen();\n\n return reactionElement;\n });\n\n // this.sorted.forEach((reactionElement, idx) => {\n // /* if(this.type === 'block' && this.childElementCount !== this.sorted.length) { // because of appended time\n // idx += 1;\n // } */\n\n // positionElementByIndex(reactionElement, this, idx);\n // });\n\n if(!this.isPlaceholder && changedResults?.length) {\n if(this.isConnected) {\n this.handleChangedResults(changedResults);\n } else {\n this.onConnectCallback = () => {\n this.handleChangedResults(changedResults);\n };\n }\n }\n // });\n\n // ! тут вообще не должно быть этого кода, но пока он побудет тут\n if(!this.sorted.length && this.type === 'block') {\n const parentElement = this.parentElement;\n this.remove();\n\n if(parentElement.classList.contains('document-message') && !parentElement.childNodes.length) {\n parentElement.remove();\n return;\n }\n\n const timeSpan = this.querySelector('.time');\n if(timeSpan) {\n parentElement.append(timeSpan);\n }\n }\n }\n\n private handleChangedResults(changedResults: ReactionCount[]) {\n // ! temp\n if(this.message.peerId !== appImManager.chat.peerId) return;\n\n changedResults.forEach((reactionCount) => {\n const reactionElement = this.sorted.find((reactionElement) => reactionsEqual(reactionElement.reactionCount.reaction, reactionCount.reaction));\n reactionElement?.fireAroundAnimation();\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionsElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Scrollable from '../components/scrollable';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport getVisibleRect from './dom/getVisibleRect';\nimport reflowScrollableElement from './dom/reflowScrollableElement';\n\nexport default class ScrollSaver {\n private scrollHeight: number;\n private scrollHeightMinusTop: number;\n private scrollTop: number;\n private clientHeight: number;\n private elements: {element: HTMLElement, rect: DOMRect}[];\n\n /**\n *\n * @param scrollable to reset scroll position and direction\n * @param reverse true means top\n */\n constructor(\n private scrollable: Scrollable,\n private query: string,\n private reverse: boolean\n ) {\n\n }\n\n private get container() {\n return this.scrollable.container;\n }\n\n public getSaved() {\n return {\n scrollHeight: this.scrollHeight,\n scrollTop: this.scrollTop,\n clientHeight: this.clientHeight\n };\n }\n\n public findElements() {\n if(!this.query) return [];\n\n const {container} = this;\n const containerRect = container.getBoundingClientRect();\n const bubbles = Array.from(container.querySelectorAll(this.query)) as HTMLElement[];\n const elements: ScrollSaver['elements'] = [];\n for(const bubble of bubbles) {\n const elementRect = bubble.getBoundingClientRect();\n const visibleRect = getVisibleRect(bubble, container, undefined, elementRect, containerRect);\n if(visibleRect) {\n elements.push({element: bubble, rect: elementRect});\n // break; // find first\n } else if(elements.length) { // find last\n break;\n }\n }\n\n if(!elements.length) {\n const bubble = bubbles[0];\n if(bubble) {\n elements.push({element: bubble, rect: bubble.getBoundingClientRect()});\n }\n }\n\n return elements;\n }\n\n public replaceSaved(from: HTMLElement, to: HTMLElement) {\n if(!this.elements) {\n return;\n }\n\n const idx = this.elements.findIndex(({element}) => from === element);\n if(idx !== -1) {\n this.elements[idx].element = to;\n }\n }\n\n public findAndSetElements() {\n this.elements = this.findElements();\n }\n\n public save() {\n this.findAndSetElements();\n // console.warn('scroll save', this.elements);\n this._save();\n }\n\n public _save() {\n const {scrollTop, scrollHeight, clientHeight} = this.container;\n\n // previousScrollHeight = scrollHeight;\n // previousScrollHeight = scrollHeight + padding;\n this.scrollHeight = scrollHeight;\n this.scrollTop = scrollTop;\n this.clientHeight = clientHeight;\n this.scrollHeightMinusTop = this.reverse ? scrollHeight - scrollTop : scrollTop;\n\n // this.chatInner.style.paddingTop = padding + 'px';\n /* if(reverse) {\n previousScrollHeightMinusTop = this.scrollable.scrollHeight - scrollTop;\n } else {\n previousScrollHeightMinusTop = scrollTop;\n } */\n }\n\n private onRestore(useReflow?: boolean) {\n if(IS_SAFARI && useReflow/* && !isAppleMobile */) { // * fix blinking and jumping\n reflowScrollableElement(this.container);\n }\n }\n\n private setScrollTop(newScrollTop: number, useReflow?: boolean) {\n // touchSupport for safari iOS\n // isTouchSupported && isApple && (container.container.style.overflow = 'hidden');\n this.scrollable.setScrollTopSilently(this.scrollTop = newScrollTop);\n // container.scrollTop = scrollHeight;\n // isTouchSupported && isApple && (container.container.style.overflow = '');\n\n this.onRestore(useReflow);\n }\n\n public restore(useReflow?: boolean) {\n const {scrollTop, scrollHeight} = this.scrollable;\n this.scrollHeight = scrollHeight;\n\n if(!this.elements.length) { // maybe all messages have been deleted\n this._restore(useReflow);\n return;\n }\n\n let anchor: ScrollSaver['elements'][0];\n // for(let i = this.elements.length - 1; i >= 0; --i) {\n // const _anchor = this.elements[i];\n // if(_anchor.element.parentElement) {\n // anchor = _anchor;\n // break;\n // }\n // }\n anchor = this.elements[this.elements.length - 1];\n\n if(!anchor?.element?.parentElement) { // try to find new anchor\n this.findAndSetElements();\n anchor = this.elements[this.elements.length - 1];\n\n if(!anchor) { // fallback to old method if smth is really strange\n this._restore(useReflow);\n return;\n }\n }\n\n const {element, rect} = anchor;\n const newRect = element.getBoundingClientRect();\n const diff = newRect.bottom - rect.bottom;\n this.setScrollTop(scrollTop + diff, useReflow);\n // if(diff) debugger;\n // console.warn('scroll restore', rect, diff, newRect);\n }\n\n public _restore(useReflow?: boolean) {\n const {scrollHeightMinusTop: previousScrollHeightMinusTop, scrollable} = this;\n // if(previousScrollHeightMinusTop === undefined) {\n // throw new Error('scroll was not saved');\n // }\n\n // const scrollHeight = container.scrollHeight;\n const scrollHeight = this.scrollHeight;\n // if(scrollHeight === this.scrollHeight) {\n // return;\n // }\n\n // this.scrollHeight = scrollHeight;\n\n /* const scrollHeight = container.scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n\n this.chatInner.style.paddingTop = (10000 - addedHeight) + 'px'; */\n /* const scrollHeight = scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n\n this.chatInner.style.paddingTop = (padding - addedHeight) + 'px';\n\n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = reverse ? scrollHeight - addedHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n this.log('performHistoryResult: will set scrollTop',\n previousScrollHeightMinusTop, scrollHeight,\n newScrollTop, container.container.clientHeight); */\n // const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = this.reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n\n /* if(DEBUG) {\n this.log('performHistoryResult: will set up scrollTop:', newScrollTop, this.isHeavyAnimationInProgress);\n } */\n\n this.setScrollTop(newScrollTop, useReflow);\n\n /* if(DEBUG) {\n this.log('performHistoryResult: have set up scrollTop:', newScrollTop, container.scrollTop, container.scrollHeight, this.isHeavyAnimationInProgress);\n } */\n }\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.ScrollSaver = ScrollSaver);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type IntersectionTarget = Element;\nexport type IntersectionCallback = (entry: IntersectionObserverEntry) => void;\n\nexport default class SuperIntersectionObserver {\n private observing: Map>;\n private observingQueue: SuperIntersectionObserver['observing'];\n private observer: IntersectionObserver;\n private freezedObservingNew: boolean;\n\n constructor(init?: IntersectionObserverInit) {\n this.observing = new Map();\n this.observingQueue = new Map();\n this.freezedObservingNew = false;\n\n this.observer = new IntersectionObserver((entries) => {\n const observing = this.observing;\n for(let i = 0, length = entries.length; i < length; ++i) {\n const entry = entries[i];\n const callbacks = observing.get(entry.target);\n if(!callbacks) {\n console.error('intersection process no callbacks:', entry);\n debugger;\n continue;\n }\n\n for(const callback of callbacks) {\n try {\n callback(entry);\n } catch(err) {\n console.error('intersection process callback error:', err);\n }\n }\n }\n }, init);\n }\n\n public disconnect() {\n this.observing.clear();\n this.observingQueue.clear();\n this.observer.disconnect();\n }\n\n public toggleObservingNew(value: boolean) {\n if(this.freezedObservingNew === value) {\n return;\n }\n\n this.freezedObservingNew = value;\n\n const queue = this.observingQueue;\n if(!value && queue.size) {\n for(const [target, callbacks] of queue) {\n for(const callback of callbacks) {\n this.observe(target, callback);\n }\n }\n\n queue.clear();\n }\n }\n\n public has(target: IntersectionTarget, callback: IntersectionCallback, observing = this.observing) {\n const callbacks = observing.get(target);\n return !!(callbacks && callbacks.has(callback));\n }\n\n public observe(target: IntersectionTarget, callback: IntersectionCallback) {\n if(this.freezedObservingNew && this.has(target, callback)) {\n return;\n }\n\n const observing = this.freezedObservingNew ? this.observingQueue : this.observing;\n let callbacks = observing.get(target);\n if(callbacks && callbacks.has(callback)) {\n return;\n }\n\n if(!callbacks) {\n callbacks = new Set();\n observing.set(target, callbacks);\n\n if(observing === this.observing) {\n this.observer.observe(target);\n }\n }\n\n callbacks.add(callback);\n }\n\n public unobserve(target: IntersectionTarget, callback: IntersectionCallback) {\n const observing = this.freezedObservingNew && !this.has(target, callback) ? this.observingQueue : this.observing;\n const callbacks = observing.get(target);\n if(!callbacks) {\n return;\n }\n\n callbacks.delete(callback);\n if(!callbacks.size) {\n observing.delete(target);\n this.observer.unobserve(target);\n }\n }\n}\n","import type {MyDocument} from '../../appDocsManager';\nimport type {MyMessage} from '../../appMessagesManager';\nimport {Message, MessageMedia} from '../../../../layer';\n\nexport default function isMentionUnread(message: MyMessage) {\n if(!message) {\n return false;\n }\n\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n return !!(\n message.pFlags.media_unread &&\n message.pFlags.mentioned &&\n (\n !doc ||\n !(['voice', 'round'] as MyDocument['type'][]).includes(doc.type)\n )\n );\n}\n","export default function accumulate(arr: number[], initialValue: number) {\n return arr.reduce((acc, value) => acc + value, initialValue);\n}\n","function cacheCallback(callback: (str: A) => T) {\n const stringResults: any = {}, numberResults: any = {};\n return (value: A): T => {\n const key = '_' + value;\n return (typeof(value) === 'string' ? stringResults : numberResults)[key] ??= callback(value);\n };\n}\n\nexport default cacheCallback;\n","export default function replaceNonNumber(str: string) {\n return str.replace(/\\D/g, '');\n}\n","import cacheCallback from '../cacheCallback';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nconst CARD_BRAND_REGEXP: {[brand: string]: RegExp} = {\n visa: /^4/,\n mastercard: /^(51|52|53|54|55|222|23|24|25|26|27)/,\n amex: /^(34|37)/,\n discover: /^(60|64|65)/,\n diners: /^(30|38|39)/,\n diners14: /^(36)/,\n jcb: /^(35)/,\n unionpay: /^(62[0-6,8-9]|627[0-6,8-9]|6277[0-7,9]|62778[1-9]|81)/,\n elo: /^(5067|509|636368|627780)/,\n mir: /^(220[0-4])/\n};\n\n// * taken from Stripe\nexport const CARD_BRANDS: {[b: string]: {\n minLength: number,\n maxLength: number,\n cvcMaxLength: number,\n cvcMinLength: number | null\n}} = {\n visa: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n mastercard: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n amex: {\n minLength: 15,\n maxLength: 15,\n cvcMaxLength: 4,\n cvcMinLength: 3\n },\n unionpay: {\n minLength: 13,\n maxLength: 19,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n diners: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n diners14: {\n minLength: 14,\n maxLength: 14,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n discover: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n jcb: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n elo: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n mir: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n unknown: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 4,\n cvcMinLength: 3\n }\n};\n\nexport const detectCardBrand = cacheCallback((card: string = '') => {\n const keys = Object.keys(CARD_BRAND_REGEXP);\n const sanitizedCard = replaceNonNumber(card);\n let brand: string;\n let last = 0;\n keys.forEach((key) => {\n const regExp = CARD_BRAND_REGEXP[key];\n const match = sanitizedCard.match(regExp);\n if(match) {\n const result = match[0];\n if(result && result.length > last) {\n brand = key;\n last = result.length;\n }\n }\n });\n\n return brand || 'unknown';\n});\n\nexport function cardBrandToUnifiedBrand(brand: string) {\n return brand === 'diners14' ? 'diners' : brand;\n}\n\nexport function detectUnifiedCardBrand(card = '') {\n const brand = detectCardBrand(card);\n return cardBrandToUnifiedBrand(brand);\n}\n","export default function createArray(length: number, fill?: T1, map?: any): T1[] {\n const arr = new Array(length);\n arr.fill(fill);\n return map ? arr.map(map) : arr;\n}\n","const delta = '0'.charCodeAt(0) - '0'.charCodeAt(0);\nconst buggedRegExp = /[0-9]/g;\n\n// function hasBuggedNumbers(str: string) {\n// return !!str.match(a);\n// }\n\nfunction getDistanceFromBuggedToNormal(char: string) {\n return String.fromCharCode(char.charCodeAt(0) - delta);\n}\n\nexport function fixBuggedNumbers(str: string) {\n return str.replace(buggedRegExp, getDistanceFromBuggedToNormal);\n}\n","import {fixBuggedNumbers} from '../string/buggedNumbers';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nexport type PatternCharacter = {\n type: 'optional',\n result: string,\n consumed: number\n} | {\n type: 'required',\n result: string,\n consumed: number,\n partial?: boolean\n} | {\n type: 'formatting',\n result: string,\n consumed: number\n};\n\nexport type PatternFunction = (str: string) => ((str: string) => PatternCharacter)[];\n\nfunction makeOptionalCharacter(result: string, consumed: number): PatternCharacter {\n return {type: 'optional', result, consumed};\n}\n\nfunction makeRequiredCharacter(result: string, consumed: number, partial?: boolean): PatternCharacter {\n return {type: 'required', result, consumed, partial};\n}\n\nfunction makeFormattingCharacter(result: string, consumed: number): PatternCharacter {\n return {type: 'formatting', result, consumed};\n}\n\nfunction wrapCharacterRegExpFactory(regExp: RegExp, optional?: boolean) {\n return (str: string) => {\n const _regExp = new RegExp('^'.concat(regExp.source.replace(/^\\^/, '')));\n const match = str.match(_regExp);\n const makeCharacter = optional ? makeOptionalCharacter : makeRequiredCharacter;\n if(match) {\n const result = match[0];\n return makeCharacter(result, match.index + result.length);\n }\n\n return makeCharacter('', str.length);\n };\n}\n\nfunction makeCapitalPatternCharacter(str: string) {\n const char = wrapCharacterRegExpFactory(/\\w/)(str);\n return char.result ? makeRequiredCharacter(char.result.toUpperCase(), char.consumed) : char;\n}\n\nconst makeMonthDigitPatternCharacter = wrapCharacterRegExpFactory(/1[0-2]|0?[1-9]|0/);\n\nfunction digit(str: string) {\n return wrapCharacterRegExpFactory(/[0-9]/)(fixBuggedNumbers(str));\n}\n\nconst patternCharacters = {\n digit,\n capitalCharacter: makeCapitalPatternCharacter,\n month: (str: string) => {\n const char = makeMonthDigitPatternCharacter(fixBuggedNumbers(str));\n const cleanedResult = replaceNonNumber(char.result);\n const isPartial = ['0', '1'].includes(char.result) && str.length === 1;\n if(isPartial || (char.result === '0' && str.length >= 2)) {\n return makeRequiredCharacter(char.result, str.length, true);\n }\n\n return makeRequiredCharacter(cleanedResult.length === 1 ? '0' + cleanedResult : cleanedResult, char.consumed);\n },\n formattingCharacter: (str: string) => {\n return (str1: string) => {\n const consumed = str === str1[0] ? 1 : 0;\n return makeFormattingCharacter(str, consumed);\n }\n },\n optionalPattern: (regExp: RegExp) => {\n return (str: string) => {\n const char = wrapCharacterRegExpFactory(regExp, true)(str);\n return char.result ? char : makeOptionalCharacter('', 0);\n };\n }\n};\n\nexport default patternCharacters;\n","import {IS_ANDROID} from '../../environment/userAgent';\nimport createArray from '../array/createArray';\nimport cacheCallback from '../cacheCallback';\nimport replaceNonNumber from '../string/replaceNonNumber';\nimport {CARD_BRANDS, detectCardBrand} from './cardBrands';\nimport patternCharacters from './patternCharacters';\n\nconst digit = patternCharacters.digit;\nconst capitalCharacter = patternCharacters.capitalCharacter;\nconst spaceCharacter = patternCharacters.formattingCharacter(' ');\nconst yearOptionalPattern = patternCharacters.optionalPattern(/\\d\\d/);\nconst sixteenPattern = [digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit];\nconst fifteenPattern = [digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit];\n\nconst requiredPostcodes = new Set(['DZ', 'AR', 'AM', 'AU', 'AT', 'AZ', 'PT', 'BD', 'BY', 'BE', 'BA', 'BR', 'BN', 'BG', 'CA', 'IC', 'CN', 'CO', 'HR', 'CY', 'CZ', 'DK', 'EC', 'GB', 'EE', 'FO', 'FI', 'FR', 'GE', 'DE', 'GR', 'GL', 'GU', 'GG', 'NL', 'HU', 'IN', 'ID', 'IL', 'IT', 'JP', 'JE', 'KZ', 'KR', 'FM', 'KG', 'LV', 'LI', 'LT', 'LU', 'MK', 'MG', 'PT', 'MY', 'MH', 'MQ', 'YT', 'MX', 'MN', 'ME', 'NL', 'NZ', 'GB', 'NO', 'PK', 'PH', 'PL', 'FM', 'PT', 'PR', 'RE', 'RU', 'SA', 'SF', 'RS', 'SG', 'SK', 'SI', 'ZA', 'ES', 'LK', 'SX', 'VI', 'VI', 'SE', 'CH', 'TW', 'TJ', 'TH', 'TU', 'TN', 'TR', 'TM', 'VI', 'UA', 'GB', 'US', 'UY', 'UZ', 'VA', 'VN', 'GB', 'FM']);\n\nconst generateFourPattern = cacheCallback((length: number) => {\n const out: Array = [];\n\n for(let i = 0, k = 0; i < length;) {\n if(k === 4) {\n out.push(spaceCharacter);\n k = 0;\n } else {\n out.push(digit);\n ++i;\n ++k;\n }\n }\n\n return out;\n});\n\nfunction generateCardNumberPattern(card: string) {\n const brand = detectCardBrand(card);\n if(brand === 'amex') return sixteenPattern;\n if(brand === 'diners14') return fifteenPattern;\n const {minLength, maxLength} = CARD_BRANDS[brand];\n const s = replaceNonNumber(card).length;\n const d = Math.min(Math.max(minLength, s), maxLength);\n return generateFourPattern(d);\n}\n\nconst cardFormattingPatterns = {\n cardNumber: generateCardNumberPattern,\n cardExpiry: () => [patternCharacters.month, patternCharacters.formattingCharacter('/'), digit, digit, yearOptionalPattern],\n cardCvc: (card?: string) => cardFormattingPatterns.cardCvcFromBrand(detectCardBrand(card)),\n cardCvcFromBrand: cacheCallback((brand: string) => {\n const info = CARD_BRANDS[brand];\n const {cvcMinLength, cvcMaxLength} = info;\n const pattern = createArray(cvcMinLength || cvcMaxLength, digit);\n if(cvcMinLength && cvcMinLength < cvcMaxLength) {\n const i = cvcMaxLength - cvcMinLength;\n const h = patternCharacters.optionalPattern(/\\d/);\n if(i) {\n pattern.push(...createArray(i, h));\n }\n }\n\n return pattern;\n }),\n postalCodeFromCountry: cacheCallback((iso2: string) => {\n switch(iso2) {\n case 'US':\n return createArray(5, digit);\n case 'CA':\n return IS_ANDROID ? null : [capitalCharacter, capitalCharacter, capitalCharacter, spaceCharacter, capitalCharacter, capitalCharacter, capitalCharacter];\n default:\n const optionalDigits = createArray(10, patternCharacters.optionalPattern(/\\d/));\n if(requiredPostcodes.has(iso2)) {\n optionalDigits[0] = digit;\n }\n return optionalDigits;\n }\n })\n};\n\nexport default cardFormattingPatterns;\n","import accumulate from '../array/accumulate';\nimport {PatternFunction} from './patternCharacters';\n\nfunction accumulateLengths(strs: string[]) {\n return accumulate(strs.map((str) => str.length), 0);\n}\n\nfunction formatValueByPattern(\n getPattern: PatternFunction,\n value: string,\n options: Partial<{\n selectionStart: number,\n selectionEnd: number\n }> = {},\n pushRest?: boolean\n) {\n const pattern = getPattern(value);\n\n if(!pattern) {\n return {\n value: value,\n selection: null as typeof options,\n autocorrectComplete: !!value\n };\n }\n\n const length = pattern.length;\n const c: string[] = [];\n const s: string[] = [];\n\n let l = 0;\n let i = 0;\n let f = options.selectionStart === 0 ? 0 : null;\n let d = options.selectionEnd === 0 ? 0 : null;\n const p = () => {\n if(f === null && (i + 1) >= options.selectionStart) f = accumulateLengths(c) + (pushRest ? s.length : 0);\n if(d === null && (i + 1) >= options.selectionEnd) d = accumulateLengths(c) + (pushRest ? s.length : 0);\n };\n const m = (e: number) => {\n if(e > 0) {\n p();\n i += e;\n }\n };\n\n for(; l < length;) {\n const getCharacter = pattern[l];\n const character = getCharacter(value.slice(i));\n const {type, result, consumed} = character;\n if(type === 'required') {\n if(result) {\n c.push(...s, result);\n s.length = 0;\n ++l;\n\n if(character.partial) {\n m(value.length - i);\n break;\n }\n\n m(consumed);\n } else {\n if(!consumed) {\n break;\n }\n\n m(1);\n }\n } else if(type === 'optional') {\n if(result) {\n c.push(...s, result);\n s.length = 0;\n m(consumed);\n }\n\n ++l;\n } else if(type === 'formatting') {\n if(!pushRest && i >= value.length) {\n break;\n }\n\n s.push(result);\n ++l;\n m(consumed);\n }\n }\n\n if(pushRest) {\n c.push(...s);\n }\n\n return {\n value: c.join(''),\n selection: {\n selectionStart: f === null || value.length && options.selectionStart === value.length ? accumulateLengths(c) : f,\n selectionEnd: d === null || value.length && options.selectionEnd === value.length ? accumulateLengths(c) : d\n },\n autocorrectComplete: l === length\n };\n}\n\nexport default formatValueByPattern;\n","import {CARD_BRANDS, detectCardBrand} from './cardBrands';\nimport formatInputValueByPattern from './formatInputValueByPattern';\nimport NBSP from '../string/nbsp';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nexport type PatternValidationOptions = Partial<{\n ignoreIncomplete: boolean\n}>;\n\nconst nbspRegExp = new RegExp(NBSP, 'g');\n\nfunction makeValidationError(code?: string) {\n return code ? {\n type: 'invalid',\n code\n } : null;\n}\n\n// Luhn algorithm\nfunction validateCompleteCardNumber(card: string) {\n const t = '0'.charCodeAt(0);\n const n = card.length % 2;\n let a = 0;\n for(let i = card.length - 1; i >= 0; --i) {\n const c = n === (i % 2);\n let o = card.charCodeAt(i) - t;\n if(c) o *= 2;\n if(o > 9) o -= 9;\n a += o;\n }\n return !(a % 10);\n}\n\nfunction validateExpiry(year: number, month: number, options?: PatternValidationOptions) {\n const date = new Date(Date.now());\n const _year = year < 100 ? date.getFullYear() % 100 : date.getFullYear();\n const nextMonth = date.getMonth() + 1;\n\n if(isNaN(year) || isNaN(month)) {\n return options?.ignoreIncomplete ? null : 'incomplete';\n }\n\n if((year - _year) < 0) {\n return 'invalid_expiry_year_past';\n }\n\n if((year - _year) > 50) {\n return 'invalid_expiry_year';\n }\n\n return !(year - _year) && month < nextMonth ? 'invalid_expiry_month_past' : null;\n}\n\nfunction getCardInfoByNumber(card: string) {\n const sanitized = replaceNonNumber(card);\n const brand = detectCardBrand(card);\n return {\n sanitized,\n brand,\n minLength: CARD_BRANDS[brand].minLength\n };\n}\n\nfunction makeCardNumberError(str: string, length: number, ignoreIncomplete: boolean) {\n if(str.length >= length) {\n return validateCompleteCardNumber(str) || detectCardBrand(str) === 'mir' ? null : makeValidationError('invalid');\n }\n\n return ignoreIncomplete ? null : makeValidationError('incomplete');\n}\n\nexport function validateCardNumber(str: string, options: PatternValidationOptions = {}) {\n const {sanitized, minLength} = getCardInfoByNumber(str);\n return makeCardNumberError(sanitized, minLength, options.ignoreIncomplete);\n}\n\nexport function validateCardExpiry(str: string, options: PatternValidationOptions = {}) {\n const sanitized = str.replace(nbspRegExp, '').split(/ ?\\/ ?/);\n const [monthStr, yearStr = ''] = sanitized;\n const [month, year] = [monthStr, yearStr].map((str) => +str);\n const s = yearStr.length === 2 ? year % 100 : year;\n return yearStr.length < 2 || yearStr.length === 3 ? (options.ignoreIncomplete ? null : makeValidationError('incomplete')) : makeValidationError(validateExpiry(s, month, options));\n}\n\nexport function validateAnyIncomplete(formatted: ReturnType, str: string, options: PatternValidationOptions = {}) {\n return formatted.meta.autocorrectComplete || options.ignoreIncomplete ? null : makeValidationError('incomplete');\n}\n","const NBSP = '‎';\nexport default NBSP;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {TelegramWebViewEvent, TelegramWebViewEventCallback, TelegramWebViewEventMap} from '../types';\n\nconst weakMap: WeakMap = new WeakMap();\nwindow.addEventListener('message', (e) => {\n const callback = weakMap.get(e.source as Window);\n if(!callback) {\n return;\n }\n\n callback(JSON.parse(e.data));\n});\n\nexport default class TelegramWebView extends EventListenerBase<{\n [type in keyof TelegramWebViewEventMap]: (data: TelegramWebViewEventMap[type]) => void\n}> {\n public iframe: HTMLIFrameElement;\n\n constructor({url, sandbox}: {\n url: string,\n sandbox?: string\n }) {\n super(false);\n\n const iframe = this.iframe = document.createElement('iframe');\n iframe.src = url;\n if(sandbox) iframe.setAttribute('sandbox', sandbox);\n }\n\n public onMount() {\n weakMap.set(this.iframe.contentWindow, this.onTelegramWebViewEvent);\n }\n\n public destroy() {\n this.cleanup();\n weakMap.delete(this.iframe.contentWindow);\n }\n\n private onTelegramWebViewEvent = ({eventType, eventData}: TelegramWebViewEvent) => {\n if((eventData as any) === '') {\n eventData = undefined;\n }\n\n console.log('onTelegramWebViewEvent', eventType, eventData);\n this.dispatchEvent(eventType, eventData as any);\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport TelegramWebView from '../telegramWebView';\n\nexport function createVerificationIframe(options: ConstructorParameters[0]) {\n const result = new TelegramWebView({\n ...options,\n sandbox: 'allow-forms allow-scripts allow-same-origin allow-modals'\n });\n const {iframe} = result;\n iframe.allow = 'payment';\n iframe.classList.add('payment-verification');\n return result;\n}\n\nexport default class PopupPaymentVerification extends PopupElement<{\n finish: () => void\n}> {\n private telegramWebView: TelegramWebView;\n\n constructor(private url: string, private openPathAfter?: boolean) {\n super('popup-payment popup-payment-verification', {\n closable: true,\n overlayClosable: true,\n body: true,\n title: 'Checkout.WebConfirmation.Title'\n });\n\n this.d();\n }\n\n private d() {\n const telegramWebView = this.telegramWebView = createVerificationIframe({\n url: this.url\n });\n\n telegramWebView.addEventListener('web_app_open_tg_link', (e) => {\n this.dispatchEvent('finish');\n this.hide();\n if(this.openPathAfter) {\n appImManager.openUrl('https://t.me' + e.path_full);\n }\n });\n\n this.body.append(telegramWebView.iframe);\n this.show();\n telegramWebView.onMount();\n }\n\n protected destroy() {\n this.telegramWebView.destroy();\n return super.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport cardFormattingPatterns from '../../helpers/cards/cardFormattingPatterns';\nimport {detectUnifiedCardBrand} from '../../helpers/cards/cardBrands';\nimport formatInputValueByPattern from '../../helpers/cards/formatInputValueByPattern';\nimport {validateAnyIncomplete, validateCardExpiry, validateCardNumber} from '../../helpers/cards/validateCard';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport noop from '../../helpers/noop';\nimport {PaymentsPaymentForm} from '../../layer';\nimport {LangPackKey, _i18n} from '../../lib/langPack';\nimport CheckboxField from '../checkboxField';\nimport confirmationPopup from '../confirmationPopup';\nimport CountryInputField from '../countryInputField';\nimport InputField, {InputFieldOptions, InputState} from '../inputField';\nimport Row from '../row';\nimport {getPaymentBrandIconPath, PaymentButton, PaymentsCredentialsToken} from './payment';\nimport {createVerificationIframe} from './paymentVerification';\nimport {PasswordInputHelpers} from '../passwordInputField';\nimport SettingSection from '../settingSection';\nimport TelegramWebView from '../telegramWebView';\n\nexport type PaymentCardDetails = {\n cardNumber: string;\n cardholderName: string;\n expiryFull: string;\n expiryMonth: string;\n expiryYear: string;\n cvc: string;\n country: string;\n zip: string;\n save?: boolean;\n};\n\nexport type PaymentCardDetailsShort = {\n title: string,\n save?: boolean;\n icon?: string;\n};\n\nexport type PaymentCardDetailsResult = PaymentCardDetails | PaymentCardDetailsShort;\n\nexport class InputFieldCorrected extends InputField {\n private lastKeyDown: string;\n private lastTransformed: ReturnType;\n\n constructor(public options: InputFieldOptions & {\n formatMethod: typeof cardFormattingPatterns['cardNumber'],\n validateMethod?: typeof validateCardNumber,\n errorKeys?: {[code: string]: LangPackKey},\n optional?: boolean,\n onChange?: (transformed: InputFieldCorrected['lastTransformed']) => void,\n onKeyDown?: (e: KeyboardEvent) => void\n }) {\n super(options);\n\n // const handleIncomplete = (t?: any) => {\n // if(\n // (!lastTransformed.value && t) ||\n // lastTransformed.meta.autocorrectComplete ||\n // lastTransformed.meta.error ||\n // optional\n // ) {\n // return;\n // }\n\n\n // };\n\n this.input.addEventListener('keydown', this.onKeyDown);\n this.input.addEventListener('input', this.onInput);\n this.input.addEventListener('blur', this.onBlur);\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n this.lastKeyDown = e.key;\n this.options.onKeyDown?.(e);\n };\n\n private onInput = () => {\n const value = this.value;\n const deleting = this.lastKeyDown === 'Backspace' && (((this.lastTransformed && this.lastTransformed.value.length) || 0) - value.length) === 1;\n const result = this.lastTransformed = formatInputValueByPattern({\n value: value,\n getPattern: this.options.formatMethod,\n deleting,\n input: this.input\n });\n\n const transformedValue = result.value;\n if(transformedValue !== value) {\n this.setValueSilently(transformedValue);\n\n if(result.selection) {\n (this.input as HTMLInputElement).selectionStart = result.selection.selectionStart;\n (this.input as HTMLInputElement).selectionEnd = result.selection.selectionEnd;\n }\n }\n\n this.validateNew(transformedValue, {ignoreIncomplete: true/* !result.meta.autocorrectComplete */});\n\n this.options.onChange?.(result);\n };\n\n private onBlur = () => {\n const value = this.lastTransformed?.value;\n if(value) {\n this.validateNew(value);\n }\n };\n\n public update() {\n this.onInput();\n }\n\n public validate = () => {\n return this.validateNew();\n };\n\n public validateNew(\n value = this.lastTransformed?.value ?? '',\n t: any = {},\n justReturn?: boolean\n ) {\n let result: ReturnType;\n if(this.options.validateMethod) {\n result = this.options.validateMethod?.(value, t);\n } else {\n result = validateAnyIncomplete(this.lastTransformed, value, t);\n }\n\n if(result?.code) {\n const langPackKey: LangPackKey = this.options.errorKeys?.[result.code];\n !justReturn && this.setState(InputState.Error, langPackKey);\n return false;\n }\n\n !justReturn && this.setState(InputState.Neutral);\n return true;\n }\n}\n\nexport function handleInputFieldsOnChange(inputFields: (CountryInputField | InputField | InputFieldCorrected)[], _onChange: (valid: boolean) => void) {\n const onChange = () => {\n const valid = inputFields.every((inputField) => {\n return 'validateNew' in inputField ? inputField.validateNew(undefined, undefined, true) : inputField.isValid();\n });\n\n _onChange(valid);\n };\n\n inputFields.forEach((inputField) => {\n if(inputField instanceof InputFieldCorrected) {\n const original = inputField.options.onChange;\n inputField.options.onChange = (...args: any[]) => {\n // @ts-ignore\n original?.(...args);\n onChange();\n };\n\n if('update' in inputField) {\n inputField.update();\n }\n } else {\n inputField.input.addEventListener('input', onChange);\n }\n });\n\n return {validate: onChange};\n}\n\nexport function createCountryZipFields(country?: boolean, zip?: boolean) {\n let countryInputField: CountryInputField, postcodeInputField: InputFieldCorrected;\n if(country || zip) {\n if(country) countryInputField = new CountryInputField({\n noPhoneCodes: true,\n onCountryChange: () => {\n postcodeInputField?.update();\n },\n required: true,\n autocomplete: 'country'\n });\n if(zip) postcodeInputField = new InputFieldCorrected({\n label: 'PaymentShippingZipPlaceholder',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'postal-code',\n formatMethod: (/* ...args */) => {\n const {country} = countryInputField.getSelected();\n const iso2 = country?.iso2;\n return cardFormattingPatterns.postalCodeFromCountry(iso2 && iso2.toUpperCase());\n }\n });\n }\n\n return {countryInputField, postcodeInputField};\n}\n\nexport type PaymentsNativeProvider = 'stripe' | 'smartglocal';\nexport type PaymentsNativeParams = {\n need_country?: boolean,\n need_zip?: boolean,\n need_cardholder_name?: boolean,\n publishable_key?: string, // stripe\n public_token?: string, // smartglocal\n gpay_params: string,\n};\nconst SUPPORTED_NATIVE_PROVIDERS: Set = new Set(['stripe', 'smartglocal']);\n\nexport default class PopupPaymentCard extends PopupElement<{\n finish: (obj: {token: any, card: PaymentCardDetailsResult}) => void\n}> {\n protected telegramWebView: TelegramWebView;\n\n constructor(private paymentForm: PaymentsPaymentForm, private savedCard?: PaymentCardDetails) {\n super('popup-payment popup-payment-card', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: SUPPORTED_NATIVE_PROVIDERS.has(paymentForm.native_provider as PaymentsNativeProvider),\n title: 'PaymentCardInfo'\n });\n\n if(SUPPORTED_NATIVE_PROVIDERS.has(paymentForm.native_provider as PaymentsNativeProvider)) {\n this.d();\n } else {\n const telegramWebView = this.telegramWebView = createVerificationIframe({\n url: paymentForm.url\n });\n\n telegramWebView.addEventListener('payment_form_submit', (data) => {\n const cardOut = {title: data.title, save: false} as any as PaymentCardDetails;\n this.dispatchEvent('finish', {\n token: data.credentials,\n card: cardOut\n });\n\n this.hide();\n\n if(paymentForm.pFlags.can_save_credentials) {\n confirmationPopup({\n titleLangKey: 'PaymentCardSavePaymentInformation',\n descriptionLangKey: 'PaymentCardSavePaymentInformationInfoLine1',\n button: {\n langKey: 'Save'\n }\n }).then(() => {\n cardOut.save = true;\n }, noop);\n }\n });\n\n // putPreloader(this.body, true);\n this.body.append(telegramWebView.iframe);\n this.show();\n telegramWebView.onMount();\n }\n }\n\n protected destroy() {\n this.telegramWebView.destroy();\n return super.destroy();\n }\n\n private d() {\n const savedCard = this.savedCard;\n const cardSection = new SettingSection({name: 'PaymentInfo.Card.Title', noDelimiter: true, noShadow: true});\n\n const nativeParams: PaymentsNativeParams = JSON.parse(this.paymentForm.native_params.data);\n\n let lastBrand: string, brandIconTempId = 0, lastBrandImg: HTMLImageElement;\n const setBrandIcon = (brand: string) => {\n if(lastBrand === brand) {\n return;\n }\n\n const tempId = ++brandIconTempId;\n lastBrand = brand;\n\n const path = getPaymentBrandIconPath(brand);\n if(!path) {\n if(lastBrandImg) {\n lastBrandImg.remove();\n lastBrandImg = undefined;\n }\n\n return;\n }\n\n const img = new Image();\n img.classList.add('input-field-icon');\n renderImageFromUrlPromise(img, path, false).then(() => {\n if(brandIconTempId !== tempId) {\n return;\n }\n\n if(lastBrandImg) {\n lastBrandImg.replaceWith(img);\n } else {\n cardInputField.container.append(img);\n }\n\n lastBrandImg = img;\n });\n };\n const cardInputField = new InputFieldCorrected({\n label: 'PaymentCardNumber',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-number',\n formatMethod: cardFormattingPatterns.cardNumber,\n validateMethod: validateCardNumber,\n errorKeys: {\n invalid: 'PaymentCard.Error.Invalid',\n incomplete: 'PaymentCard.Error.Incomplete'\n },\n onChange: (transformed) => {\n setBrandIcon(detectUnifiedCardBrand(transformed.value));\n cvcInputField.update(); // format cvc\n }\n });\n\n let nameInputField: InputField;\n if(nativeParams.need_cardholder_name) nameInputField = new InputField({\n label: 'Checkout.NewCard.CardholderNamePlaceholder',\n maxLength: 255,\n required: true,\n autocomplete: 'cc-name'\n });\n\n const expireInputField = new InputFieldCorrected({\n label: 'SecureId.Identity.Placeholder.ExpiryDate',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-exp',\n formatMethod: cardFormattingPatterns.cardExpiry,\n validateMethod: validateCardExpiry\n });\n\n // handle autocomplete: 01/2345 -> 01/45\n expireInputField.input.addEventListener('input', () => {\n let value = expireInputField.value;\n if(value.length < 5) {\n return;\n }\n\n const splitted = value.split('/');\n if(splitted[1].length !== 4) {\n return;\n }\n\n value = [splitted[0], splitted[1].slice(2)].join('/');\n expireInputField.setValueSilently(value);\n }, {capture: true});\n\n const cvcInputField = new InputFieldCorrected({\n labelText: 'CVC',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-csc',\n name: 'cvc',\n formatMethod: () => cardFormattingPatterns.cardCvc(cardInputField.value)\n // validateMethod: (...args) => _5AH3.a.cardCvc(cardInputField.value)(...args)\n });\n\n const passwordHelpers = new PasswordInputHelpers(cvcInputField.container, cvcInputField.input as HTMLInputElement);\n\n const switchFocusOrder: (InputFieldCorrected | InputField)[] = [\n cardInputField,\n expireInputField,\n cvcInputField,\n nameInputField\n ].filter(Boolean);\n switchFocusOrder.forEach((inputField) => {\n const onKeyDown = (e: KeyboardEvent) => {\n if(!inputField.value && e.key === 'Backspace') {\n const previousInputField = switchFocusOrder[switchFocusOrder.indexOf(inputField) - 1];\n if(previousInputField) {\n // previousInputField.value = previousInputField.value.slice(0, -1);\n placeCaretAtEnd(previousInputField.input, true);\n }\n }\n };\n\n if(inputField instanceof InputFieldCorrected) {\n inputField.options.onKeyDown = onKeyDown;\n\n const original = inputField.options.onChange;\n inputField.options.onChange = (transformed) => {\n original?.(transformed);\n\n if(document.activeElement === inputField.input && transformed.meta.autocorrectComplete) {\n for(let i = switchFocusOrder.indexOf(inputField), length = switchFocusOrder.length; i < length; ++i) {\n const nextInputField = switchFocusOrder[i];\n if(\n nextInputField instanceof InputFieldCorrected ?\n !nextInputField.validateNew(undefined, undefined, true) :\n !nextInputField.value\n ) {\n placeCaretAtEnd(nextInputField.input, true);\n break;\n }\n }\n }\n };\n } else {\n inputField.input.addEventListener('keydown', onKeyDown);\n }\n });\n\n const inputFieldsRow = document.createElement('div');\n inputFieldsRow.classList.add('input-fields-row');\n inputFieldsRow.append(expireInputField.container, cvcInputField.container);\n\n const form = document.createElement('form');\n form.append(...[\n cardInputField.container,\n inputFieldsRow,\n nameInputField?.container\n ].filter(Boolean))\n\n cardSection.content.append(form);\n\n let billingSection: SettingSection;\n // let saveCheckboxField: CheckboxField;\n const {countryInputField, postcodeInputField} = createCountryZipFields(nativeParams.need_country, nativeParams.need_zip);\n if(nativeParams.need_country || nativeParams.need_zip) {\n billingSection = new SettingSection({name: 'PaymentInfo.Billing.Title', noDelimiter: true, noShadow: true});\n\n // const inputFieldsRow2 = inputFieldsRow.cloneNode() as HTMLElement;\n // inputFieldsRow2.append(countryInputField.container, postcodeInputField.container);\n // billingSection.content.append(inputFieldsRow2);\n billingSection.content.append(...[countryInputField, postcodeInputField].filter(Boolean).map((i) => i.container));\n }\n\n const canSave = !!this.paymentForm.pFlags.can_save_credentials;\n const saveCheckboxField = new CheckboxField({\n text: 'PaymentCardSavePaymentInformation',\n checked: !!canSave\n });\n const saveRow = new Row({\n checkboxField: saveCheckboxField,\n subtitleLangKey: canSave ? 'PaymentCardSavePaymentInformationInfoLine1' : 'Checkout.2FA.Text'\n });\n\n if(!canSave) {\n saveRow.container.classList.add('is-disabled');\n }\n\n (billingSection || cardSection).content.append(saveRow.container);\n\n this.scrollable.append(...[cardSection, billingSection].filter(Boolean).map((s) => s.container));\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: async() => {\n const data: PaymentCardDetails = {\n cardNumber: cardInputField.value,\n expiryFull: expireInputField.value,\n expiryMonth: expireInputField.value.split('/')[0],\n expiryYear: expireInputField.value.split('/')[1],\n cvc: cvcInputField.value,\n\n cardholderName: nameInputField?.value,\n country: countryInputField?.value,\n zip: postcodeInputField?.value,\n\n save: saveCheckboxField?.checked\n };\n\n const nativeProvider: PaymentsNativeProvider = this.paymentForm.native_provider as any;\n let out: PaymentsCredentialsToken;\n if(nativeProvider === 'stripe') {\n const url = new URL('https://api.stripe.com/v1/tokens');\n url.search = new URLSearchParams({\n 'card[number]': data.cardNumber,\n 'card[exp_month]': data.expiryMonth,\n 'card[exp_year]': data.expiryYear,\n 'card[cvc]': data.cvc,\n 'card[address_zip]': data.zip,\n 'card[address_country]': data.country,\n 'card[name]': data.cardholderName\n }).toString();\n\n const response = await fetch(url.toString(), {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Authorization': `Bearer ${nativeParams.publishable_key}`\n }\n });\n\n out = await response.json();\n } else if(nativeProvider === 'smartglocal') {\n const params = {\n card: {\n number: data.cardNumber.replace(/[^\\d]+/g, ''),\n expiration_month: data.expiryMonth,\n expiration_year: data.expiryYear,\n security_code: data.cvc.replace(/[^\\d]+/g, '')\n }\n };\n\n const url = /* DEBUG_PAYMENT_SMART_GLOCAL */false ?\n 'https://tgb-playground.smart-glocal.com/cds/v1/tokenize/card' :\n 'https://tgb.smart-glocal.com/cds/v1/tokenize/card';\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'X-PUBLIC-TOKEN': nativeParams.public_token\n },\n body: JSON.stringify(params)\n });\n\n const json: { // smartglocal\n data: {\n info: {\n card_network: string,\n card_type: string,\n masked_card_number: string\n },\n token: string\n },\n status: 'ok'\n } = await response.json();\n\n out = {type: 'card', token: json.data.token}\n }\n\n this.dispatchEvent('finish', {token: out, card: data});\n this.hide();\n }\n });\n\n const inputFields = ([\n cardInputField,\n nameInputField,\n expireInputField,\n cvcInputField,\n countryInputField,\n postcodeInputField\n ] as const).filter(Boolean);\n handleInputFieldsOnChange(inputFields, (valid) => {\n payButton.disabled = !valid;\n // payButton.classList.toggle('btn-disabled', !valid);\n });\n\n if(savedCard) {\n cardInputField.value = savedCard.cardNumber;\n expireInputField.value = savedCard.expiryFull;\n cvcInputField.value = savedCard.cvc;\n nameInputField && (nameInputField.value = savedCard.cardholderName);\n countryInputField && (countryInputField.value = savedCard.country);\n postcodeInputField && (postcodeInputField.value = savedCard.zip);\n }\n\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.show();\n\n if(!cardInputField.validateNew(undefined, undefined, true)) {\n placeCaretAtEnd(cardInputField.input);\n }\n }\n}\n","import formatValueByPattern from './formatValueByPattern';\n\nexport default function formatInputValueByPattern(options: {\n value: string,\n getPattern: Parameters[0],\n deleting?: boolean,\n input?: HTMLElement\n}) {\n const {value: originalValue, getPattern, deleting, input} = options;\n const pushRest = !deleting && !!originalValue.length;\n const result = formatValueByPattern(getPattern, originalValue, {\n selectionStart: input ? (input as HTMLInputElement).selectionStart : 0,\n selectionEnd: input ? (input as HTMLInputElement).selectionEnd : 0\n }, pushRest)\n const {value, selection} = result;\n\n return {\n value,\n meta: {\n autocorrectComplete: result.autocorrectComplete,\n empty: !value\n },\n selection\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {AccountPassword, AccountTmpPassword} from '../../layer';\nimport {InputState} from '../inputField';\nimport PasswordInputField from '../passwordInputField';\nimport SettingSection from '../settingSection';\nimport {PaymentButton} from './payment';\n\nexport default class PopupPaymentCardConfirmation extends PopupElement<{\n finish: (tmpPassword: AccountTmpPassword) => void\n}> {\n constructor(card: string, passwordState: AccountPassword) {\n super('popup-payment popup-payment-card-confirmation', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'Checkout.PasswordEntry.Title'\n });\n\n const section = new SettingSection({noDelimiter: true, noShadow: true, caption: 'Checkout.PasswordEntry.Text', captionArgs: [card]});\n const passwordInputField = new PasswordInputField({labelText: passwordState.hint});\n section.content.append(passwordInputField.container);\n this.scrollable.append(section.container);\n\n const onInput = () => {\n payButton.disabled = !passwordInputField.value;\n passwordInputField.setState(InputState.Neutral);\n };\n\n passwordInputField.input.addEventListener('input', onInput);\n\n const payButton = PaymentButton({\n key: 'Checkout.PasswordEntry.Pay',\n onClick: async() => {\n try {\n const inputCheckPassword = await this.managers.passwordManager.getInputCheckPassword(passwordInputField.value, passwordState);\n const tmpPassword = await this.managers.apiManager.invokeApi('account.getTmpPassword', {\n password: inputCheckPassword,\n period: 60\n });\n\n this.dispatchEvent('finish', tmpPassword);\n this.hide();\n } catch(err) {\n if((err as ApiError).type === 'PASSWORD_HASH_INVALID') {\n (err as ApiError).handled = true;\n passwordInputField.setError('PASSWORD_HASH_INVALID');\n }\n\n throw err;\n }\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n onInput();\n\n this.show();\n\n placeCaretAtEnd(passwordInputField.input);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {InputInvoice, PaymentRequestedInfo, PaymentsPaymentForm, PaymentsValidatedRequestedInfo} from '../../layer';\nimport matchEmail from '../../lib/richTextProcessor/matchEmail';\nimport CheckboxField from '../checkboxField';\nimport CountryInputField from '../countryInputField';\nimport InputField from '../inputField';\nimport Row from '../row';\nimport SettingSection from '../settingSection';\nimport TelInputField from '../telInputField';\nimport {PaymentButton} from './payment';\nimport {createCountryZipFields, handleInputFieldsOnChange, InputFieldCorrected} from './paymentCard';\n\nexport type PaymentShippingAddress = PaymentRequestedInfo;\n\ntype ShippingFocusField = 'name' | 'email' | 'phone';\n\nexport default class PopupPaymentShipping extends PopupElement<{\n finish: (o: {shippingAddress: PaymentShippingAddress, requestedInfo: PaymentsValidatedRequestedInfo}) => void\n}> {\n constructor(\n private paymentForm: PaymentsPaymentForm,\n private inputInvoice: InputInvoice,\n private focus?: ShippingFocusField\n ) {\n super('popup-payment popup-payment-shipping', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'PaymentShippingInfo'\n });\n\n this.d();\n }\n\n private d() {\n const paymentForm = this.paymentForm;\n const invoice = paymentForm.invoice;\n const savedInfo = this.paymentForm.saved_info;\n\n let addressSection: SettingSection,\n address1InputField: InputField,\n address2InputField: InputField,\n cityInputField: InputField,\n stateInputField: InputField,\n countryInputField: CountryInputField,\n postcodeInputField: InputFieldCorrected;\n if(invoice.pFlags.shipping_address_requested) {\n addressSection = new SettingSection({name: 'PaymentShippingAddress', noDelimiter: true, noShadow: true});\n address1InputField = new InputField({label: 'PaymentShippingAddress1Placeholder', maxLength: 64, required: true});\n address2InputField = new InputField({label: 'PaymentShippingAddress2Placeholder', maxLength: 64});\n cityInputField = new InputField({label: 'PaymentShippingCityPlaceholder', maxLength: 64, required: true});\n stateInputField = new InputField({label: 'PaymentShippingStatePlaceholder', maxLength: 64});\n const res = createCountryZipFields(true, true);\n countryInputField = res.countryInputField;\n postcodeInputField = res.postcodeInputField;\n\n addressSection.content.append(...[\n address1InputField,\n address2InputField,\n cityInputField,\n stateInputField,\n countryInputField,\n postcodeInputField\n ].filter(Boolean).map((inputField) => inputField.container));\n }\n\n let receiverSection: SettingSection;\n let nameInputField: InputField, emailInputField: InputField, telInputField: TelInputField;\n if([invoice.pFlags.name_requested, invoice.pFlags.email_requested, invoice.pFlags.phone_requested].includes(true)) {\n receiverSection = new SettingSection({name: 'PaymentShippingReceiver', noDelimiter: true, noShadow: true});\n\n const validateEmail = () => {\n const value = emailInputField.value;\n const match = matchEmail(value);\n if(!match || match[0].length !== value.length) {\n return false;\n }\n\n return true;\n };\n\n const validatePhone = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n if(invoice.pFlags.name_requested) nameInputField = new InputField({label: 'PaymentShippingName', maxLength: 256, required: true});\n if(invoice.pFlags.email_requested) emailInputField = new InputField({label: 'PaymentShippingEmailPlaceholder', maxLength: 64, required: true, validate: validateEmail});\n if(invoice.pFlags.phone_requested) telInputField = new TelInputField({required: true, validate: validatePhone});\n\n receiverSection.content.append(...[\n nameInputField,\n emailInputField,\n telInputField\n ].filter(Boolean).map((inputField) => inputField.container));\n }\n\n const saveCheckboxField = new CheckboxField({\n text: 'PaymentShippingSave',\n checked: true\n });\n const saveRow = new Row({\n checkboxField: saveCheckboxField,\n subtitleLangKey: 'PaymentShippingSaveInfo'\n });\n\n (receiverSection || addressSection).content.append(saveRow.container);\n\n this.scrollable.append(...[addressSection, receiverSection].filter(Boolean).map((section) => section.container));\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: async() => {\n const selectedCountry = countryInputField && countryInputField.getSelected().country;\n const data: PaymentShippingAddress = {\n _: 'paymentRequestedInfo',\n shipping_address: selectedCountry && {\n _: 'postAddress',\n street_line1: address1InputField.value,\n street_line2: address2InputField.value,\n city: cityInputField.value,\n state: stateInputField.value,\n // country: countryInputField.value,\n country_iso2: selectedCountry?.iso2,\n post_code: postcodeInputField.value\n },\n name: nameInputField?.value,\n email: emailInputField?.value,\n phone: telInputField?.value\n };\n\n try {\n const requestedInfo = await this.managers.appPaymentsManager.validateRequestedInfo(this.inputInvoice, data, saveCheckboxField?.checked);\n\n this.dispatchEvent('finish', {\n shippingAddress: data,\n requestedInfo\n });\n\n this.hide();\n } catch(err: any) {\n const errorMap: {[err: string]: InputField} = {\n ADDRESS_STREET_LINE1_INVALID: address1InputField,\n ADDRESS_STREET_LINE2_INVALID: address2InputField,\n ADDRESS_COUNTRY_INVALID: countryInputField,\n ADDRESS_CITY_INVALID: cityInputField,\n ADDRESS_STATE_INVALID: stateInputField,\n ADDRESS_POSTCODE_INVALID: postcodeInputField,\n\n REQ_INFO_NAME_INVALID: nameInputField,\n REQ_INFO_EMAIL_INVALID: emailInputField,\n REQ_INFO_PHONE_INVALID: telInputField\n };\n\n const inputField = errorMap[(err as ApiError).type];\n if(inputField) {\n inputField.setError();\n (err as any).handled = true;\n }\n\n throw err;\n }\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n if(savedInfo) {\n const shippingAddress = savedInfo.shipping_address;\n if(shippingAddress) {\n address1InputField.value = shippingAddress.street_line1;\n address2InputField.value = shippingAddress.street_line2;\n cityInputField.value = shippingAddress.city;\n stateInputField.value = shippingAddress.state;\n countryInputField.selectCountryByIso2(shippingAddress.country_iso2);\n postcodeInputField.value = shippingAddress.post_code;\n }\n\n savedInfo.name && nameInputField && (nameInputField.value = savedInfo.name);\n savedInfo.email && emailInputField && (emailInputField.value = savedInfo.email);\n savedInfo.phone && telInputField && (telInputField.value = savedInfo.phone);\n }\n\n const {validate} = handleInputFieldsOnChange([\n address1InputField,\n address2InputField,\n cityInputField,\n stateInputField,\n countryInputField,\n postcodeInputField,\n nameInputField,\n emailInputField,\n telInputField\n ].filter(Boolean), (valid) => {\n payButton.disabled = !valid;\n });\n\n validate();\n\n this.show();\n\n let focusField: InputField;\n if(this.focus) {\n const focusMap: {[field in ShippingFocusField]?: InputField} = {\n name: nameInputField,\n email: emailInputField,\n phone: telInputField\n };\n\n focusField = focusMap[this.focus];\n } else {\n focusField = address1InputField;\n }\n\n if(focusField) {\n placeCaretAtEnd(focusField.input);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport accumulate from '../../helpers/array/accumulate';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport {PaymentsPaymentForm, PaymentsValidatedRequestedInfo, ShippingOption} from '../../layer';\nimport RadioField from '../radioField';\nimport Row, {RadioFormFromRows} from '../row';\nimport SettingSection from '../settingSection';\nimport {PaymentButton} from './payment';\n\nexport default class PopupPaymentShippingMethods extends PopupElement<{\n finish: (shippingOption: ShippingOption) => void\n}> {\n constructor(\n private paymentForm: PaymentsPaymentForm,\n private requestedInfo: PaymentsValidatedRequestedInfo,\n private shippingOption: ShippingOption\n ) {\n super('popup-payment popup-payment-shipping-methods', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'PaymentShippingMethod'\n });\n\n this.d();\n }\n\n private d() {\n const section = new SettingSection({name: 'PaymentCheckoutShippingMethod', noDelimiter: true, noShadow: true});\n\n const rows = this.requestedInfo.shipping_options.map((shippingOption) => {\n return new Row({\n radioField: new RadioField({\n text: shippingOption.title,\n name: 'shipping-method',\n value: shippingOption.id\n }),\n subtitle: paymentsWrapCurrencyAmount(\n accumulate(shippingOption.prices.map(({amount}) => +amount), 0),\n this.paymentForm.invoice.currency\n )\n });\n });\n\n let lastShippingId: string;\n const form = RadioFormFromRows(rows, (value) => {\n lastShippingId = value;\n });\n\n if(this.shippingOption) {\n rows.find((row) => row.radioField.input.value === this.shippingOption.id).radioField.checked = true;\n } else {\n rows[0].radioField.checked = true;\n }\n\n section.content.append(form);\n\n this.scrollable.append(section.container);\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: () => {\n this.dispatchEvent('finish', this.requestedInfo.shipping_options.find((option) => option.id === lastShippingId));\n this.hide();\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport Currencies from '../../config/currencies';\nimport {FontFamily, FontSize} from '../../config/font';\nimport accumulate from '../../helpers/array/accumulate';\nimport getTextWidth from '../../helpers/canvas/getTextWidth';\nimport {detectUnifiedCardBrand} from '../../helpers/cards/cardBrands';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport ScrollSaver from '../../helpers/scrollSaver';\nimport tsNow from '../../helpers/tsNow';\nimport {AccountTmpPassword, InputInvoice, InputPaymentCredentials, LabeledPrice, Message, MessageMedia, PaymentRequestedInfo, PaymentSavedCredentials, PaymentsPaymentForm, PaymentsPaymentReceipt, PaymentsValidatedRequestedInfo, PostAddress, ShippingOption} from '../../layer';\nimport I18n, {i18n, LangPackKey, _i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport AvatarElement from '../avatar';\nimport Button from '../button';\nimport CheckboxField from '../checkboxField';\nimport PeerTitle from '../peerTitle';\nimport {putPreloader} from '../putPreloader';\nimport Row from '../row';\nimport {toastNew} from '../toast';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport wrapPhoto from '../wrappers/photo';\nimport PopupPaymentCard, {PaymentCardDetails, PaymentCardDetailsResult} from './paymentCard';\nimport PopupPaymentCardConfirmation from './paymentCardConfirmation';\nimport PopupPaymentShipping, {PaymentShippingAddress} from './paymentShipping';\nimport PopupPaymentShippingMethods from './paymentShippingMethods';\nimport PopupPaymentVerification from './paymentVerification';\n\nconst iconPath = 'assets/img/';\nconst icons = [\n 'amex',\n 'card',\n 'diners',\n 'discover',\n 'jcb',\n 'mastercard',\n 'visa',\n 'unionpay',\n 'mir',\n 'logo'\n];\n\nexport function getPaymentBrandIconPath(brand: string) {\n if(!icons.includes(brand)) {\n return;\n }\n\n return `${iconPath}${brand}.svg`;\n}\n\nexport function PaymentButton(options: {\n onClick: () => Promise | void,\n key?: LangPackKey,\n textEl?: I18n.IntlElement\n}) {\n const textEl = options.textEl ?? new I18n.IntlElement({key: options.key ?? 'PaymentInfo.Done'});\n const key = textEl.key;\n const payButton = Button('btn-primary btn-color-primary payment-item-pay');\n payButton.append(textEl.element);\n attachClickEvent(payButton, async() => {\n const result = options.onClick();\n if(!(result instanceof Promise)) {\n return;\n }\n\n const d = putPreloader(payButton);\n const toggle = toggleDisability([payButton], true);\n textEl.compareAndUpdate({key: 'PleaseWait'});\n try {\n await result;\n } catch(err) {\n if(!(err as any).handled) {\n console.error('payment button error', err);\n }\n\n toggle();\n textEl.compareAndUpdate({key});\n d.remove();\n }\n });\n return payButton;\n}\n\nexport type PaymentsCredentialsToken = {type: 'card', token?: string, id?: string};\n\nexport default class PopupPayment extends PopupElement {\n private tipButtonsMap: Map;\n\n constructor(\n private message: Message.message,\n private inputInvoice: InputInvoice,\n private paymentForm?: PaymentsPaymentForm | PaymentsPaymentReceipt,\n private isReceipt?: boolean\n ) {\n super('popup-payment', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: true\n });\n\n this.tipButtonsMap = new Map();\n this.d().catch((err) => {\n console.error('payment popup error', err);\n this.hide();\n });\n }\n\n private async d() {\n this.element.classList.add('is-loading');\n this.show();\n\n let confirmed = false;\n const onConfirmed = () => {\n if(confirmed) {\n return;\n }\n\n confirmed = true;\n if(popupPaymentVerification) {\n popupPaymentVerification.hide();\n }\n\n this.hide();\n };\n\n let {paymentForm, message} = this;\n\n if(message) {\n this.listenerSetter.add(rootScope)('payment_sent', ({peerId, mid}) => {\n if(message.peerId === peerId && message.mid === mid) {\n onConfirmed();\n }\n });\n }\n\n const mediaInvoice = message?.media as MessageMedia.messageMediaInvoice;\n const isReceipt = this.isReceipt ??\n (\n mediaInvoice ?\n !!mediaInvoice.receipt_msg_id || mediaInvoice.extended_media?._ === 'messageExtendedMedia' :\n paymentForm._ === 'payments.paymentReceipt'\n );\n const isTest = mediaInvoice ? mediaInvoice.pFlags.test : paymentForm.invoice.pFlags.test;\n\n const photo = mediaInvoice ? mediaInvoice.photo : paymentForm.photo;\n const title = mediaInvoice ? mediaInvoice.title : paymentForm.title;\n const description = mediaInvoice ? mediaInvoice.description : paymentForm.description;\n\n _i18n(this.title, isReceipt ? 'PaymentReceipt' : 'PaymentCheckout');\n if(isTest) {\n this.title.append(' (Test)');\n }\n\n const className = 'payment-item';\n\n const itemEl = document.createElement('div');\n itemEl.classList.add(className);\n\n const detailsClassName = className + '-details';\n const details = document.createElement('div');\n details.classList.add(detailsClassName);\n\n let photoEl: HTMLElement;\n if(photo) {\n photoEl = document.createElement('div');\n photoEl.classList.add(detailsClassName + '-photo', 'media-container-contain');\n wrapPhoto({\n photo: photo,\n container: photoEl,\n boxWidth: 100,\n boxHeight: 100,\n size: {_: 'photoSizeEmpty', type: ''}\n });\n details.append(photoEl);\n }\n\n const linesClassName = detailsClassName + '-lines';\n const linesEl = document.createElement('div');\n linesEl.classList.add(linesClassName);\n\n const titleEl = document.createElement('div');\n titleEl.classList.add(linesClassName + '-title');\n\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add(linesClassName + '-description');\n\n const botName = document.createElement('div');\n botName.classList.add(linesClassName + '-bot-name');\n\n linesEl.append(titleEl, descriptionEl, botName);\n\n setInnerHTML(titleEl, wrapEmojiText(title));\n setInnerHTML(descriptionEl, wrapEmojiText(description));\n\n const peerTitle = new PeerTitle();\n botName.append(peerTitle.element);\n\n details.append(linesEl);\n itemEl.append(details);\n this.scrollable.append(itemEl);\n\n const preloaderContainer = document.createElement('div');\n preloaderContainer.classList.add(className + '-preloader-container');\n const preloader = putPreloader(preloaderContainer, true);\n this.scrollable.container.append(preloaderContainer);\n\n const inputInvoice = this.inputInvoice;\n if(!paymentForm) {\n if(isReceipt) paymentForm = await this.managers.appPaymentsManager.getPaymentReceipt(message.peerId, mediaInvoice.receipt_msg_id || (inputInvoice as InputInvoice.inputInvoiceMessage).msg_id);\n else paymentForm = await this.managers.appPaymentsManager.getPaymentForm(inputInvoice);\n this.paymentForm = paymentForm;\n }\n\n let savedInfo = (paymentForm as PaymentsPaymentForm).saved_info || (paymentForm as PaymentsPaymentReceipt).info;\n const savedCredentials = (paymentForm as PaymentsPaymentForm).saved_credentials?.[0];\n let [lastRequestedInfo, passwordState, providerPeerTitle] = await Promise.all([\n !isReceipt && savedInfo && this.managers.appPaymentsManager.validateRequestedInfo(inputInvoice, savedInfo),\n savedCredentials && this.managers.passwordManager.getState(),\n wrapPeerTitle({peerId: paymentForm.provider_id.toPeerId()})\n ]);\n\n // console.log(paymentForm, lastRequestedInfo);\n\n await peerTitle.update({peerId: paymentForm.bot_id.toPeerId()});\n preloaderContainer.remove();\n this.element.classList.remove('is-loading');\n\n const wrapAmount = (amount: string | number, skipSymbol?: boolean) => {\n return paymentsWrapCurrencyAmount(amount, currency, skipSymbol);\n };\n\n const {invoice} = paymentForm;\n const currency = invoice.currency;\n\n const isRecurring = invoice.pFlags.recurring && !isReceipt;\n\n await peerTitle.update({peerId: paymentForm.bot_id.toPeerId()});\n const peerTitle2 = isRecurring ? await wrapPeerTitle({peerId: paymentForm.bot_id.toPeerId()}) : undefined;\n preloaderContainer.remove();\n this.element.classList.remove('is-loading');\n\n const makeLabel = () => {\n const labelEl = document.createElement('div');\n labelEl.classList.add(pricesClassName + '-price');\n\n const left = document.createElement('span');\n const right = document.createElement('span');\n labelEl.append(left, right);\n return {label: labelEl, left, right};\n };\n\n const pricesClassName = className + '-prices';\n const prices = document.createElement('div');\n prices.classList.add(pricesClassName);\n const makePricesElements = (prices: LabeledPrice[]) => {\n return prices.map((price) => {\n const {amount, label} = price;\n\n const _label = makeLabel();\n _label.left.textContent = label;\n\n const wrappedAmount = wrapAmount(amount);\n _label.right.textContent = wrappedAmount;\n\n return _label.label;\n });\n };\n\n const pricesElements = makePricesElements(invoice.prices);\n\n let getTipsAmount = (): number => 0;\n let shippingAmount = 0;\n\n const getTotalTotal = () => totalAmount + getTipsAmount() + shippingAmount;\n const setTotal = () => {\n const wrapped = wrapAmount(getTotalTotal());\n totalLabel.right.textContent = wrapped;\n payI18n.compareAndUpdate({\n key: 'PaymentCheckoutPay',\n args: [wrapped]\n });\n };\n\n const payI18n = new I18n.IntlElement();\n\n const totalLabel = makeLabel();\n totalLabel.label.classList.add('is-total');\n _i18n(totalLabel.left, 'PaymentTransactionTotal');\n const totalAmount = accumulate(invoice.prices.map(({amount}) => +amount), 0);\n\n const canTip = (invoice.max_tip_amount !== undefined && !isReceipt) || !!(paymentForm as PaymentsPaymentReceipt).tip_amount;\n if(canTip) {\n const tipsClassName = className + '-tips';\n\n const currencyData = Currencies[currency];\n\n getTipsAmount = () => +getInputValue().replace(/\\D/g, '');\n\n const getInputValue = () => {\n // return input.textContent;\n return input.value;\n };\n\n const setInputWidth = () => {\n const width = getTextWidth(getInputValue(), `500 ${FontSize} ${FontFamily}`);\n input.style.width = width + 'px';\n };\n\n const setInputValue = (amount: string | number) => {\n amount = Math.min(+amount, +invoice.max_tip_amount);\n const wrapped = wrapAmount(amount, true);\n\n input.value = wrapped;\n // input.textContent = wrapped;\n if(document.activeElement === input) {\n placeCaretAtEnd(input);\n }\n\n unsetActiveTip && unsetActiveTip();\n const tipEl = this.tipButtonsMap.get(amount);\n if(tipEl) {\n tipEl.classList.add('active');\n }\n\n setInputWidth();\n setTotal();\n };\n\n const tipsLabel = makeLabel();\n _i18n(tipsLabel.left, isReceipt ? 'PaymentTip' : 'PaymentTipOptional');\n const input = document.createElement('input');\n input.type = 'tel';\n // const input: HTMLElement = document.createElement('div');\n // input.contentEditable = 'true';\n input.classList.add('input-clear', tipsClassName + '-input');\n tipsLabel.right.append(input);\n\n if(!isReceipt) {\n tipsLabel.label.style.cursor = 'text';\n } else {\n tipsLabel.label.classList.add('disable-hover');\n }\n\n tipsLabel.label.addEventListener('mousedown', (e) => {\n if(!findUpAsChild(e.target as HTMLElement, input)) {\n placeCaretAtEnd(input);\n }\n });\n\n const haveToIgnoreEvents = input instanceof HTMLInputElement ? 1 : 2;\n const onSelectionChange = () => {\n if(ignoreNextSelectionChange) {\n --ignoreNextSelectionChange;\n return;\n }\n\n // setTimeout(() => {\n ignoreNextSelectionChange = haveToIgnoreEvents;\n placeCaretAtEnd(input);\n // }, 0);\n };\n\n const onFocus = () => {\n // cancelEvent(e);\n setTimeout(() => {\n ignoreNextSelectionChange = haveToIgnoreEvents;\n placeCaretAtEnd(input);\n document.addEventListener('selectionchange', onSelectionChange);\n }, 0);\n };\n\n const onFocusOut = () => {\n input.addEventListener('focus', onFocus, {once: true});\n document.removeEventListener('selectionchange', onSelectionChange);\n };\n\n let ignoreNextSelectionChange: number;\n input.addEventListener('focusout', onFocusOut);\n onFocusOut();\n\n input.addEventListener('input', () => {\n setInputValue(getTipsAmount());\n });\n\n const s = [currencyData.symbol, currencyData.space_between ? ' ' : ''];\n if(!currencyData.symbol_left) s.reverse();\n tipsLabel.right[currencyData.symbol_left ? 'prepend' : 'append'](s.join(''));\n\n pricesElements.push(tipsLabel.label);\n\n //\n let unsetActiveTip: () => void;\n if(!isReceipt) {\n const tipsEl = document.createElement('div');\n tipsEl.classList.add(tipsClassName);\n\n const tipClassName = tipsClassName + '-tip';\n const tipButtons = invoice.suggested_tip_amounts.map((tipAmount) => {\n const button = Button(tipClassName, {noRipple: true});\n button.textContent = wrapAmount(tipAmount);\n\n this.tipButtonsMap.set(+tipAmount, button);\n return button;\n });\n\n unsetActiveTip = () => {\n const prevTipEl = tipsEl.querySelector('.active');\n if(prevTipEl) {\n prevTipEl.classList.remove('active');\n }\n };\n\n attachClickEvent(tipsEl, (e) => {\n const tipEl = findUpClassName(e.target, tipClassName);\n if(!tipEl) {\n return;\n }\n\n let tipAmount = 0;\n if(tipEl.classList.contains('active')) {\n tipEl.classList.remove('active');\n } else {\n unsetActiveTip();\n tipEl.classList.add('active');\n\n for(const [amount, el] of this.tipButtonsMap) {\n if(el === tipEl) {\n tipAmount = amount;\n break;\n }\n }\n }\n\n setInputValue(tipAmount);\n });\n\n setInputValue(0);\n\n tipsEl.append(...tipButtons);\n pricesElements.push(tipsEl);\n } else {\n setInputValue((paymentForm as PaymentsPaymentReceipt).tip_amount);\n }\n } else {\n setTotal();\n }\n\n pricesElements.push(totalLabel.label);\n\n prices.append(...pricesElements);\n itemEl.append(prices);\n\n // /\n\n const setRowIcon = async(row: Row, icon?: string) => {\n const img = document.createElement('img');\n img.classList.add('media-photo');\n await renderImageFromUrlPromise(img, getPaymentBrandIconPath(icon));\n let container = row.media;\n if(!container) {\n container = row.createMedia('small');\n container.classList.add('media-container-cover');\n container.append(img);\n } else {\n replaceContent(container, img);\n }\n\n row.container.classList.remove('row-with-icon');\n };\n\n const createRow = (options: ConstructorParameters[0]) => {\n if(options.titleLangKey) {\n options.subtitleLangKey = options.titleLangKey;\n }\n\n options.noWrap = true;\n const row = new Row(options);\n row.container.classList.add(className + '-row');\n\n if(options.titleLangKey) {\n row.subtitle.classList.add('hide');\n }\n\n return row;\n };\n\n const setRowTitle = (row: Row, textContent: string) => {\n row.title.textContent = textContent;\n if(!textContent) {\n const e = I18n.weakMap.get(row.subtitle.firstElementChild as HTMLElement) as I18n.IntlElement;\n row.title.append(i18n(e.key));\n }\n\n row.subtitle.classList.toggle('hide', !textContent);\n };\n\n const setCardSubtitle = (card: PaymentCardDetailsResult) => {\n let brand: string;\n let str: string;\n let icon: string;\n if('title' in card) {\n brand = card.title.split(' ').shift();\n str = card.title;\n icon = card.icon;\n } else {\n brand = detectUnifiedCardBrand(card.cardNumber);\n str = brand + ' *' + card.cardNumber.split(' ').pop();\n }\n\n methodRow.title.classList.remove('tgico', 'tgico-card_outline');\n setRowIcon(methodRow, icon || brand.toLowerCase());\n setRowTitle(methodRow, str);\n };\n\n const onMethodClick = () => {\n new PopupPaymentCard(paymentForm as PaymentsPaymentForm, previousCardDetails as PaymentCardDetails).addEventListener('finish', ({token, card}) => {\n previousToken = token, previousCardDetails = card;\n\n setCardSubtitle(card);\n });\n };\n\n let previousCardDetails: PaymentCardDetailsResult, previousToken: PaymentsCredentialsToken;\n const methodRow = createRow({\n titleLangKey: 'PaymentCheckoutMethod',\n clickable: isReceipt ? undefined : onMethodClick,\n icon: 'card_outline'\n });\n\n methodRow.container.classList.add(className + '-method-row');\n\n if(savedCredentials) {\n setCardSubtitle(savedCredentials);\n } else if((paymentForm as PaymentsPaymentReceipt).credentials_title) {\n setCardSubtitle({title: (paymentForm as PaymentsPaymentReceipt).credentials_title});\n }\n\n const providerRow = createRow({\n title: providerPeerTitle,\n subtitleLangKey: 'PaymentCheckoutProvider'\n });\n\n const providerAvatar = new AvatarElement();\n providerAvatar.classList.add('avatar-32');\n providerRow.createMedia('small').append(providerAvatar);\n /* await */ providerAvatar.updateWithOptions({peerId: paymentForm.provider_id.toPeerId()});\n\n let shippingAddressRow: Row, shippingNameRow: Row, shippingEmailRow: Row, shippingPhoneRow: Row, shippingMethodRow: Row;\n let lastShippingOption: ShippingOption, onShippingAddressClick: (focus?: ConstructorParameters[2]) => void, onShippingMethodClick: () => void;\n const setShippingTitle = invoice.pFlags.shipping_address_requested ? (shippingAddress?: PaymentShippingAddress) => {\n if(!shippingAddress) {\n shippingMethodRow.subtitle.classList.add('hide');\n replaceContent(shippingMethodRow.title, i18n('PaymentShippingAddress'));\n return;\n }\n\n const postAddress = shippingAddress.shipping_address;\n setRowTitle(shippingAddressRow, [postAddress.city, postAddress.street_line1, postAddress.street_line2].filter(Boolean).join(', '));\n\n shippingMethodRow.container.classList.toggle('hide', !lastRequestedInfo && !isReceipt);\n } : undefined;\n\n const setShippingInfo = (info: PaymentRequestedInfo) => {\n setShippingTitle && setShippingTitle(info);\n shippingNameRow && setRowTitle(shippingNameRow, info.name);\n shippingEmailRow && setRowTitle(shippingEmailRow, info.email);\n shippingPhoneRow && setRowTitle(shippingPhoneRow, info.phone && ('+' + formatPhoneNumber(info.phone).formatted));\n };\n\n if(!isReceipt) {\n onShippingAddressClick = (focus) => {\n new PopupPaymentShipping(paymentForm as PaymentsPaymentForm, inputInvoice, focus).addEventListener('finish', ({shippingAddress, requestedInfo}) => {\n lastRequestedInfo = requestedInfo;\n savedInfo = (paymentForm as PaymentsPaymentForm).saved_info = shippingAddress;\n setShippingInfo(shippingAddress);\n });\n };\n }\n\n if(invoice.pFlags.shipping_address_requested) {\n const setShippingOption = (shippingOption?: ShippingOption) => {\n const scrollSaver = new ScrollSaver(this.scrollable, undefined, true);\n scrollSaver.save();\n if(lastShippingPricesElements) {\n lastShippingPricesElements.forEach((node) => node.remove());\n }\n\n if(!shippingOption) {\n shippingAmount = 0;\n\n setTotal();\n scrollSaver.restore();\n this.onContentUpdate();\n return;\n }\n\n lastShippingOption = shippingOption;\n setRowTitle(shippingMethodRow, shippingOption.title);\n\n shippingAmount = accumulate(shippingOption.prices.map(({amount}) => +amount), 0);\n lastShippingPricesElements = makePricesElements(shippingOption.prices);\n let l = totalLabel.label;\n if(canTip) {\n l = l.previousElementSibling as any;\n if(!isReceipt) {\n l = l.previousElementSibling as any;\n }\n }\n\n lastShippingPricesElements.forEach((element) => l.parentElement.insertBefore(element, l));\n\n setTotal();\n scrollSaver.restore();\n this.onContentUpdate();\n };\n\n shippingAddressRow = createRow({\n icon: 'location',\n titleLangKey: 'PaymentShippingAddress',\n clickable: !isReceipt && onShippingAddressClick.bind(null, undefined)\n });\n\n let lastShippingPricesElements: HTMLElement[];\n shippingMethodRow = createRow({\n icon: 'shipping',\n titleLangKey: 'PaymentCheckoutShippingMethod',\n clickable: !isReceipt && (onShippingMethodClick = () => {\n new PopupPaymentShippingMethods(paymentForm as PaymentsPaymentForm, lastRequestedInfo, lastShippingOption).addEventListener('finish', (shippingOption) => {\n setShippingOption(shippingOption);\n });\n })\n });\n\n shippingMethodRow.container.classList.add('hide');\n\n const shippingOption = (paymentForm as PaymentsPaymentReceipt).shipping;\n if(shippingOption) {\n setShippingOption(shippingOption);\n }\n }\n\n if(invoice.pFlags.name_requested) {\n shippingNameRow = createRow({\n icon: 'newprivate',\n titleLangKey: 'PaymentCheckoutName',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'name')\n });\n }\n\n if(invoice.pFlags.email_requested) {\n shippingEmailRow = createRow({\n icon: 'mention',\n titleLangKey: 'PaymentShippingEmailPlaceholder',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'email')\n });\n }\n\n if(invoice.pFlags.phone_requested) {\n shippingPhoneRow = createRow({\n icon: 'phone',\n titleLangKey: 'PaymentCheckoutPhoneNumber',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'phone')\n });\n }\n\n if(savedInfo) {\n setShippingInfo(savedInfo);\n }\n\n const rows = [\n methodRow,\n providerRow,\n shippingAddressRow,\n shippingMethodRow,\n shippingNameRow,\n shippingEmailRow,\n shippingPhoneRow\n ].filter(Boolean);\n\n const acceptTermsCheckboxField = isRecurring && new CheckboxField({\n text: 'Payments.Recurrent.Accept',\n textArgs: [wrapRichText(invoice.recurring_terms_url), peerTitle2]\n });\n\n const acceptTermsRow = isRecurring && createRow({\n checkboxField: acceptTermsCheckboxField\n });\n\n const recurringElements = isRecurring ? [document.createElement('hr'), acceptTermsRow.container] : [];\n\n this.scrollable.append(...[\n document.createElement('hr'),\n ...rows.map((row) => row.container),\n ...recurringElements\n ].filter(Boolean));\n\n // /\n let popupPaymentVerification: PopupPaymentVerification, lastTmpPasword: AccountTmpPassword;\n const onClick = () => {\n const missingInfo = invoice.pFlags.name_requested && !savedInfo?.name ? 'name' : (invoice.pFlags.email_requested && !savedInfo?.email ? 'email' : (invoice.pFlags.phone_requested && !savedInfo?.phone ? 'phone' : undefined));\n if(invoice.pFlags.shipping_address_requested) {\n if(!lastRequestedInfo) {\n onShippingAddressClick();\n return;\n } else if(!lastShippingOption) {\n onShippingMethodClick();\n return;\n }\n } else if(missingInfo) {\n onShippingAddressClick(missingInfo);\n return;\n }\n\n if(!previousCardDetails && !lastTmpPasword) {\n if(!savedCredentials) {\n onMethodClick();\n return;\n }\n\n Promise.resolve(passwordState ?? this.managers.passwordManager.getState()).then((_passwordState) => {\n new PopupPaymentCardConfirmation(savedCredentials.title, _passwordState).addEventListener('finish', (tmpPassword) => {\n passwordState = undefined;\n lastTmpPasword = tmpPassword;\n simulateClickEvent(payButton);\n\n // * reserve 5 seconds\n const diff = tmpPassword.valid_until - tsNow(true) - 5;\n setTimeout(() => {\n if(lastTmpPasword === tmpPassword) {\n lastTmpPasword = undefined;\n }\n }, diff * 1000);\n });\n });\n\n return;\n }\n\n return Promise.resolve().then(async() => {\n const credentials: InputPaymentCredentials = lastTmpPasword ? {\n _: 'inputPaymentCredentialsSaved',\n id: savedCredentials.id,\n tmp_password: lastTmpPasword.tmp_password\n } : {\n _: 'inputPaymentCredentials',\n data: {\n _: 'dataJSON',\n data: JSON.stringify(previousToken.token ? previousToken : {type: previousToken.type, id: previousToken.id})\n },\n pFlags: {\n save: previousCardDetails.save || undefined\n }\n };\n\n try {\n const paymentResult = await this.managers.appPaymentsManager.sendPaymentForm(\n inputInvoice,\n (paymentForm as PaymentsPaymentForm).form_id,\n lastRequestedInfo?.id,\n lastShippingOption?.id,\n credentials,\n getTipsAmount()\n );\n\n if(paymentResult._ === 'payments.paymentResult') {\n onConfirmed();\n } else {\n popupPaymentVerification = new PopupPaymentVerification(paymentResult.url, !mediaInvoice.extended_media);\n popupPaymentVerification.addEventListener('finish', () => {\n popupPaymentVerification = undefined;\n\n onConfirmed();\n });\n await new Promise((resolve, reject) => {\n popupPaymentVerification.addEventListener('close', () => {\n popupPaymentVerification = undefined;\n if(confirmed) {\n resolve();\n } else {\n const err = new Error('payment not finished');\n (err as ApiError).handled = true;\n reject(err);\n }\n });\n });\n }\n } catch(err) {\n if((err as ApiError).type === 'BOT_PRECHECKOUT_TIMEOUT') {\n toastNew({langPackKey: 'Error.AnError'});\n (err as ApiError).handled = true;\n } else if((err as ApiError).type === 'TMP_PASSWORD_INVALID') {\n passwordState = lastTmpPasword = undefined;\n simulateClickEvent(payButton);\n (err as ApiError).handled = true;\n }\n\n throw err;\n }\n });\n };\n\n const onChange = () => {\n payButton.disabled = !!(acceptTermsCheckboxField && !acceptTermsCheckboxField.checked);\n };\n\n let payButton: HTMLButtonElement;\n if(isReceipt) {\n payButton = PaymentButton({\n onClick: () => this.hide(),\n key: 'Done'\n });\n } else {\n payButton = PaymentButton({\n onClick: onClick,\n textEl: payI18n\n });\n }\n\n onChange();\n if(acceptTermsCheckboxField) {\n acceptTermsCheckboxField.input.addEventListener('change', onChange);\n }\n\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.onContentUpdate();\n }\n}\n","/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\nFor license and copyright information please follow this link:\nhttps://github.com/telegramdesktop/tdesktop/blob/master/LEGAL\n*/\n\nimport accumulate from '../helpers/array/accumulate';\nimport clamp from '../helpers/number/clamp';\n\ntype Size = {w: number, h: number};\nexport type GroupMediaLayout = {\n geometry: {\n x: number,\n y: number,\n width: number,\n height: number\n },\n sides: number\n};\ntype Attempt = {\n lineCounts: number[],\n heights: number[]\n};\nexport const RectPart = {\n None: 0,\n Top: 1,\n Right: 2,\n Bottom: 4,\n Left: 8\n};\n\n// https://github.com/telegramdesktop/tdesktop/blob/4669c07dc5335cbf4795bbbe5b0ab7c007b9aee2/Telegram/SourceFiles/ui/grouped_layout.cpp\nexport class Layouter {\n private count: number;\n private ratios: number[];\n private proportions: string;\n private averageRatio: number;\n private maxSizeRatio: number;\n\n constructor(private sizes: Size[], private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth) {\n this.count = sizes.length;\n this.ratios = Layouter.countRatios(sizes);\n this.proportions = Layouter.countProportions(this.ratios);\n this.averageRatio = accumulate(this.ratios, 1) / this.count; // warn\n this.maxSizeRatio = maxWidth / this.maxHeight;\n }\n\n public layout(): GroupMediaLayout[] {\n if(!this.count) return [];\n // else if(this.count === 1) return this.layoutOne();\n\n if(this.count >= 5 || this.ratios.find((r) => r > 2)) {\n return new ComplexLayouter(this.ratios, this.averageRatio, this.maxWidth, this.minWidth, this.spacing).layout();\n }\n\n if(this.count === 2) return this.layoutTwo();\n else if(this.count === 3) return this.layoutThree();\n return this.layoutFour();\n }\n\n private layoutTwo(): ReturnType {\n if((this.proportions === 'ww') &&\n (this.averageRatio > 1.4 * this.maxSizeRatio) &&\n (this.ratios[1] - this.ratios[0] < 0.2)) {\n return this.layoutTwoTopBottom();\n } else if(this.proportions === 'ww' || this.proportions === 'qq') {\n return this.layoutTwoLeftRightEqual();\n }\n return this.layoutTwoLeftRight();\n }\n\n private layoutThree(): ReturnType {\n // console.log('layoutThree:', this);\n if(this.proportions[0] === 'n') {\n return this.layoutThreeLeftAndOther();\n }\n return this.layoutThreeTopAndOther();\n }\n\n private layoutFour(): ReturnType {\n if(this.proportions[0] === 'w') {\n return this.layoutFourTopAndOther();\n }\n return this.layoutFourLeftAndOther();\n }\n\n private layoutTwoTopBottom(): ReturnType {\n const width = this.maxWidth;\n const height = Math.round(Math.min(\n width / this.ratios[0],\n Math.min(\n width / this.ratios[1],\n (this.maxHeight - this.spacing) / 2)));\n\n return [\n {\n geometry: {x: 0, y: 0, width, height},\n sides: RectPart.Left | RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: 0, y: height + this.spacing, width, height},\n sides: RectPart.Left | RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private layoutTwoLeftRightEqual(): ReturnType {\n const width = (this.maxWidth - this.spacing) / 2;\n const height = Math.round(Math.min(\n width / this.ratios[0],\n Math.min(width / this.ratios[1], this.maxHeight * 1)));\n\n return [\n {\n geometry: {x: 0, y: 0, width, height},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: width + this.spacing, y: 0, width, height},\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\n }\n ];\n }\n\n private layoutTwoLeftRight(): ReturnType {\n const minimalWidth = Math.round(this.minWidth * 1.5);\n const secondWidth = Math.min(\n Math.round(Math.max(\n 0.4 * (this.maxWidth - this.spacing),\n (this.maxWidth - this.spacing) / this.ratios[0] /\n (1 / this.ratios[0] + 1 / this.ratios[1]))),\n this.maxWidth - this.spacing - minimalWidth);\n const firstWidth = this.maxWidth -\n secondWidth -\n this.spacing;\n const height = Math.min(\n this.maxHeight,\n Math.round(Math.min(\n firstWidth / this.ratios[0],\n secondWidth / this.ratios[1])));\n\n return [\n {\n geometry: {x: 0, y: 0, width: firstWidth, height},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: firstWidth + this.spacing, y: 0, width: secondWidth, height},\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\n }\n ];\n }\n\n private layoutThreeLeftAndOther(): ReturnType {\n const firstHeight = this.maxHeight;\n const thirdHeight = Math.round(Math.min(\n (this.maxHeight - this.spacing) / 2.,\n (this.ratios[1] * (this.maxWidth - this.spacing) /\n (this.ratios[2] + this.ratios[1]))));\n const secondHeight = firstHeight -\n thirdHeight -\n this.spacing;\n const rightWidth = Math.max(\n this.minWidth,\n Math.round(Math.min(\n (this.maxWidth - this.spacing) / 2.,\n Math.min(\n thirdHeight * this.ratios[2],\n secondHeight * this.ratios[1]))));\n const leftWidth = Math.min(\n Math.round(firstHeight * this.ratios[0]),\n this.maxWidth - this.spacing - rightWidth);\n\n return [\n {\n geometry: {x: 0, y: 0, width: leftWidth, height: firstHeight},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: leftWidth + this.spacing, y: 0, width: rightWidth, height: secondHeight},\n sides: RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: leftWidth + this.spacing, y: secondHeight + this.spacing, width: rightWidth, height: thirdHeight},\n sides: RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private layoutThreeTopAndOther(): ReturnType {\n const firstWidth = this.maxWidth;\n const firstHeight = Math.round(Math.min(\n firstWidth / this.ratios[0],\n (this.maxHeight - this.spacing) * 0.66));\n const secondWidth = (this.maxWidth - this.spacing) / 2;\n const secondHeight = Math.min(\n this.maxHeight - firstHeight - this.spacing,\n Math.round(Math.min(\n secondWidth / this.ratios[1],\n secondWidth / this.ratios[2])));\n const thirdWidth = firstWidth - secondWidth - this.spacing;\n\n return [\n {\n geometry: {x: 0, y: 0, width: firstWidth, height: firstHeight},\n sides: RectPart.Left | RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: 0, y: firstHeight + this.spacing, width: secondWidth, height: secondHeight},\n sides: RectPart.Bottom | RectPart.Left\n },\n {\n geometry: {x: secondWidth + this.spacing, y: firstHeight + this.spacing, width: thirdWidth, height: secondHeight},\n sides: RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private layoutFourTopAndOther(): ReturnType {\n const w = this.maxWidth;\n const h0 = Math.round(Math.min(\n w / this.ratios[0],\n (this.maxHeight - this.spacing) * 0.66));\n const h = Math.round(\n (this.maxWidth - 2 * this.spacing) /\n (this.ratios[1] + this.ratios[2] + this.ratios[3]));\n const w0 = Math.max(\n this.minWidth,\n Math.round(Math.min(\n (this.maxWidth - 2 * this.spacing) * 0.4,\n h * this.ratios[1])));\n const w2 = Math.round(Math.max(\n Math.max(\n this.minWidth * 1.,\n (this.maxWidth - 2 * this.spacing) * 0.33),\n h * this.ratios[3]));\n const w1 = w - w0 - w2 - 2 * this.spacing;\n const h1 = Math.min(\n this.maxHeight - h0 - this.spacing,\n h);\n\n return [\n {\n geometry: {x: 0, y: 0, width: w, height: h0},\n sides: RectPart.Left | RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: 0, y: h0 + this.spacing, width: w0, height: h1},\n sides: RectPart.Bottom | RectPart.Left\n },\n {\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\n sides: RectPart.Bottom\n },\n {\n geometry: {x: w0 + this.spacing + w1 + this.spacing, y: h0 + this.spacing, width: w2, height: h1},\n sides: RectPart.Right | RectPart.Bottom\n }\n ];\n }\n\n private layoutFourLeftAndOther(): ReturnType {\n const h = this.maxHeight;\n const w0 = Math.round(Math.min(\n h * this.ratios[0],\n (this.maxWidth - this.spacing) * 0.6));\n\n const w = Math.round(\n (this.maxHeight - 2 * this.spacing) /\n (1. / this.ratios[1] + 1. / this.ratios[2] + 1. / this.ratios[3])\n );\n const h0 = Math.round(w / this.ratios[1]);\n const h1 = Math.round(w / this.ratios[2]);\n const h2 = h - h0 - h1 - 2 * this.spacing;\n const w1 = Math.max(\n this.minWidth,\n Math.min(this.maxWidth - w0 - this.spacing, w));\n\n return [\n {\n geometry: {x: 0, y: 0, width: w0, height: h},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: w0 + this.spacing, y: 0, width: w1, height: h0},\n sides: RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\n sides: RectPart.Right\n },\n {\n geometry: {x: w0 + this.spacing, y: h0 + h1 + 2 * this.spacing, width: w1, height: h2},\n sides: RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private static countRatios(sizes: Size[]) {\n return sizes.map((size) => size.w / size.h);\n }\n\n private static countProportions(ratios: number[]) {\n return ratios.map((ratio) => (ratio > 1.2) ? 'w' : (ratio < 0.8) ? 'n' : 'q').join('');\n }\n}\n\nclass ComplexLayouter {\n private ratios: number[];\n private count: number;\n\n constructor(ratios: number[], private averageRatio: number, private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth * 4 / 3) {\n this.ratios = ComplexLayouter.cropRatios(ratios, averageRatio);\n this.count = ratios.length;\n }\n\n private static cropRatios(ratios: number[], averageRatio: number) {\n const kMaxRatio = 2.75;\n const kMinRatio = 0.6667;\n return ratios.map((ratio) => {\n return averageRatio > 1.1 ?\n clamp(ratio, 1., kMaxRatio) :\n clamp(ratio, kMinRatio, 1.);\n });\n }\n\n public layout(): GroupMediaLayout[] {\n const result = new Array(this.count);\n\n const attempts: Attempt[] = [];\n const multiHeight = (offset: number, count: number) => {\n const ratios = this.ratios.slice(offset, offset + count); // warn\n const sum = accumulate(ratios, 0);\n return (this.maxWidth - (count - 1) * this.spacing) / sum;\n };\n const pushAttempt = (lineCounts: number[]) => {\n const heights: number[] = [];\n let offset = 0;\n for(const count of lineCounts) {\n heights.push(multiHeight(offset, count));\n offset += count;\n }\n attempts.push({lineCounts, heights}); // warn\n };\n\n for(let first = 1; first !== this.count; ++first) {\n const second = this.count - first;\n if(first > 3 || second > 3) {\n continue;\n }\n pushAttempt([first, second]);\n }\n for(let first = 1; first !== this.count - 1; ++first) {\n for(let second = 1; second !== this.count - first; ++second) {\n const third = this.count - first - second;\n if((first > 3) ||\n (second > ((this.averageRatio < 0.85) ? 4 : 3)) ||\n (third > 3)) {\n continue;\n }\n pushAttempt([first, second, third]);\n }\n }\n for(let first = 1; first !== this.count - 1; ++first) {\n for(let second = 1; second !== this.count - first; ++second) {\n for(let third = 1; third !== this.count - first - second; ++third) {\n const fourth = this.count - first - second - third;\n if(first > 3 || second > 3 || third > 3 || fourth > 3) {\n continue;\n }\n pushAttempt([first, second, third, fourth]);\n }\n }\n }\n\n let optimalAttempt: Attempt = null;\n let optimalDiff = 0;\n for(const attempt of attempts) {\n const {heights, lineCounts: counts} = attempt;\n const lineCount = counts.length;\n const totalHeight = accumulate(heights, 0) +\n this.spacing * (lineCount - 1);\n const minLineHeight = Math.min(...heights);\n const maxLineHeight = Math.max(...heights);\n const bad1 = (minLineHeight < this.minWidth) ? 1.5 : 1;\n const bad2 = (() => {\n for(let line = 1; line !== lineCount; ++line) {\n if(counts[line - 1] > counts[line]) {\n return 1.5;\n }\n }\n return 1.;\n })();\n const diff = Math.abs(totalHeight - this.maxHeight) * bad1 * bad2;\n if(!optimalAttempt || diff < optimalDiff) {\n optimalAttempt = attempt;\n optimalDiff = diff;\n }\n }\n\n const optimalCounts = optimalAttempt.lineCounts;\n const optimalHeights = optimalAttempt.heights;\n const rowCount = optimalCounts.length;\n\n let index = 0;\n let y = 0;\n for(let row = 0; row !== rowCount; ++row) {\n const colCount = optimalCounts[row];\n const lineHeight = optimalHeights[row];\n const height = Math.round(lineHeight);\n\n let x = 0;\n for(let col = 0; col !== colCount; ++col) {\n const sides = RectPart.None |\n (row === 0 ? RectPart.Top : RectPart.None) |\n (row === rowCount - 1 ? RectPart.Bottom : RectPart.None) |\n (col === 0 ? RectPart.Left : RectPart.None) |\n (col === colCount - 1 ? RectPart.Right : RectPart.None);\n\n const ratio = this.ratios[index];\n const width = (col === colCount - 1) ?\n (this.maxWidth - x) :\n Math.round(ratio * lineHeight);\n result[index] = {\n geometry: {x, y, width, height},\n sides\n };\n\n x += width + this.spacing;\n ++index;\n }\n y += height + this.spacing;\n }\n\n return result;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Layouter, RectPart} from './groupedLayout';\n\nexport default function prepareAlbum(options: {\n container: HTMLElement,\n items: {w: number, h: number}[],\n maxWidth: number,\n minWidth: number,\n spacing: number,\n maxHeight?: number,\n forMedia?: true\n}) {\n const layouter = new Layouter(options.items, options.maxWidth, options.minWidth, options.spacing, options.maxHeight);\n const layout = layouter.layout();\n\n const widthItem = layout.find((item) => item.sides & RectPart.Right);\n const width = widthItem.geometry.width + widthItem.geometry.x;\n\n const heightItem = layout.find((item) => item.sides & RectPart.Bottom);\n const height = heightItem.geometry.height + heightItem.geometry.y;\n\n const container = options.container;\n container.style.width = width + 'px';\n container.style.height = height + 'px';\n const children = container.children;\n\n layout.forEach(({geometry, sides}, idx) => {\n let div: HTMLElement;\n div = children[idx] as HTMLElement;\n if(!div) {\n div = document.createElement('div');\n container.append(div);\n }\n\n div.classList.add('album-item', 'grouped-item');\n\n div.style.width = (geometry.width / width * 100) + '%';\n div.style.height = (geometry.height / height * 100) + '%';\n div.style.top = (geometry.y / height * 100) + '%';\n div.style.left = (geometry.x / width * 100) + '%';\n\n if(sides & RectPart.Left && sides & RectPart.Top) {\n div.style.borderTopLeftRadius = 'inherit';\n }\n\n if(sides & RectPart.Left && sides & RectPart.Bottom) {\n div.style.borderBottomLeftRadius = 'inherit';\n }\n\n if(sides & RectPart.Right && sides & RectPart.Top) {\n div.style.borderTopRightRadius = 'inherit';\n }\n\n if(sides & RectPart.Right && sides & RectPart.Bottom) {\n div.style.borderBottomRightRadius = 'inherit';\n }\n\n if(options.forMedia) {\n const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('album-item-media');\n\n div.append(mediaDiv);\n }\n\n // @ts-ignore\n // div.style.backgroundColor = '#' + Math.floor(Math.random() * (2 ** 24 - 1)).toString(16).padStart(6, '0');\n });\n\n /* if(options.forMedia) {\n layout.forEach((_, i) => {\n const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('album-item-media');\n\n options.container.children[i].append(mediaDiv);\n });\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport {Document, Message, MessageMedia, Photo, PhotoSize} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport rootScope from '../../lib/rootScope';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport Chat from '../chat/chat';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport prepareAlbum from '../prepareAlbum';\nimport wrapMediaSpoiler from './mediaSpoiler';\nimport wrapPhoto from './photo';\nimport wrapVideo from './video';\n\nexport default function wrapAlbum({messages, attachmentDiv, middleware, uploading, lazyLoadQueue, isOut, chat, loadPromises, autoDownload, managers = rootScope.managers, animationGroup}: {\n messages: Message.message[],\n attachmentDiv: HTMLElement,\n middleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n uploading?: boolean,\n isOut: boolean,\n chat: Chat,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n managers?: AppManagers,\n animationGroup?: AnimationItemGroup\n}) {\n const items: {size: PhotoSize.photoSize, media: Photo.photo | Document.document, message: Message.message}[] = [];\n\n // !lowest msgID will be the FIRST in album\n for(const message of messages) {\n const media: Photo.photo | Document.document = getMediaFromMessage(message);\n\n const size: any = media._ === 'photo' ? choosePhotoSize(media, 480, 480) : {w: media.w, h: media.h};\n items.push({size, media, message});\n }\n\n /* // * pending\n if(storage[0] < 0) {\n items.reverse();\n } */\n\n prepareAlbum({\n container: attachmentDiv,\n items: items.map((i) => ({w: i.size.w, h: i.size.h})),\n maxWidth: mediaSizes.active.album.width,\n minWidth: 100,\n spacing: 2,\n forMedia: true\n });\n\n const {width, height} = attachmentDiv.style;\n const containerWidth = parseInt(width);\n const containerHeight = parseInt(height);\n\n items.forEach((item, idx) => {\n const {size, media, message} = item;\n\n const messageMedia = message.media;\n const hasSpoiler = !!(messageMedia as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument).pFlags?.spoiler;\n\n const div = attachmentDiv.children[idx] as HTMLElement;\n div.dataset.mid = '' + message.mid;\n div.dataset.peerId = '' + message.peerId;\n const mediaDiv = div.firstElementChild as HTMLElement;\n const isPhoto = media._ === 'photo';\n let thumbPromise: Promise;\n if(isPhoto) {\n thumbPromise = wrapPhoto({\n photo: media,\n message,\n container: mediaDiv,\n boxWidth: 0,\n boxHeight: 0,\n isOut,\n lazyLoadQueue,\n middleware,\n size,\n loadPromises,\n autoDownloadSize: autoDownload.photo,\n managers\n });\n } else {\n thumbPromise = wrapVideo({\n doc: media,\n container: mediaDiv,\n message,\n boxWidth: 0,\n boxHeight: 0,\n withTail: false,\n isOut,\n lazyLoadQueue,\n middleware,\n loadPromises,\n autoDownload,\n managers,\n noAutoplayAttribute: hasSpoiler\n });\n }\n\n if(thumbPromise) {\n loadPromises?.push(thumbPromise);\n }\n\n if(hasSpoiler) {\n const promise = (thumbPromise || Promise.resolve()).then(async() => {\n if(!middleware()) {\n return;\n }\n\n const {width, height} = div.style;\n const itemWidth = +width.slice(0, -1) / 100 * containerWidth;\n const itemHeight = +height.slice(0, -1) / 100 * containerHeight;\n const container = await wrapMediaSpoiler({\n media,\n animationGroup,\n middleware,\n width: itemWidth,\n height: itemHeight\n });\n\n if(!middleware()) {\n return;\n }\n\n mediaDiv.append(container);\n });\n\n loadPromises?.push(promise);\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport appSidebarRight from '..';\nimport {roundPercents} from '../../poll';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {i18n} from '../../../lib/langPack';\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport Button from '../../button';\nimport {Message, MessageMedia} from '../../../layer';\n\nexport default class AppPollResultsTab extends SliderSuperTab {\n private resultsDiv: HTMLElement;\n\n public async init(message: Message.message) {\n this.container.id = 'poll-results-container';\n this.container.classList.add('chatlist-container');\n\n this.resultsDiv = document.createElement('div');\n this.resultsDiv.classList.add('poll-results');\n this.scrollable.append(this.resultsDiv);\n\n const poll = await this.managers.appPollsManager.getPoll((message.media as MessageMedia.messageMediaPoll).poll.id);\n\n this.setTitle(poll.poll.pFlags.quiz ? 'PollResults.Title.Quiz' : 'PollResults.Title.Poll');\n\n const title = document.createElement('h3');\n setInnerHTML(title, wrapEmojiText(poll.poll.question));\n\n const percents = poll.results.results.map((v) => v.voters / poll.results.total_voters * 100);\n roundPercents(percents);\n\n const fragment = document.createDocumentFragment();\n poll.results.results.forEach((result, idx) => {\n if(!result.voters) return;\n\n const hr = document.createElement('hr');\n\n const answer = poll.poll.answers[idx];\n\n // Head\n const answerEl = document.createElement('div');\n answerEl.classList.add('poll-results-answer');\n\n const answerTitle = document.createElement('div');\n setInnerHTML(answerTitle, wrapEmojiText(answer.text));\n\n const answerPercents = document.createElement('div');\n answerPercents.innerText = Math.round(percents[idx]) + '%';\n\n answerEl.append(answerTitle, answerPercents);\n\n // Humans\n const list = appDialogsManager.createChatList();\n list.classList.add('poll-results-voters');\n\n appDialogsManager.setListClickListener(list, () => {\n appSidebarRight.onCloseBtnClick();\n }, undefined, true);\n\n list.style.minHeight = Math.min(result.voters, 4) * 48 + 'px';\n\n fragment.append(hr, answerEl, list);\n\n let offset: string, limit = 4, loading = false, left = Math.max(0, result.voters - 4);\n const load = () => {\n if(loading) return;\n loading = true;\n\n this.managers.appPollsManager.getVotes(message, answer.option, offset, limit).then((votesList) => {\n votesList.votes.forEach((vote) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: vote.user_id.toPeerId(false),\n container: list,\n rippleEnabled: false,\n meAsSaved: false,\n avatarSize: 'small'\n });\n dom.lastMessageSpan.parentElement.remove();\n });\n\n if(offset) {\n left = Math.max(0, left - votesList.votes.length);\n\n if(left) {\n (showMore.lastElementChild as HTMLElement).replaceWith(i18n('PollResults.LoadMore', [Math.min(20, left)]));\n }\n }\n\n offset = votesList.next_offset;\n limit = 20;\n\n if(!left || !votesList.votes.length) {\n showMore.remove();\n }\n }).finally(() => {\n loading = false;\n });\n };\n\n const showMore = Button('poll-results-more btn btn-primary btn-transparent', {icon: 'down'});\n showMore.addEventListener('click', load);\n showMore.append(i18n('PollResults.LoadMore', [Math.min(20, left)]));\n\n fragment.append(showMore);\n\n load();\n });\n\n this.resultsDiv.append(title, fragment);\n\n appSidebarRight.toggleSidebar(true).then(() => {\n /* appPollsManager.getVotes(mid).then((votes) => {\n console.log('gOt VotEs', votes);\n }); */\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport mediaSizes from '../helpers/mediaSizes';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport appImManager from '../lib/appManagers/appImManager';\nimport rootScope from '../lib/rootScope';\nimport ripple from './ripple';\nimport appSidebarRight from './sidebarRight';\nimport AppPollResultsTab from './sidebarRight/tabs/pollResults';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\nimport {fastRaf} from '../helpers/schedulers';\nimport SetTransition from './singleTransition';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent, detachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport windowSize from '../helpers/windowSize';\nimport {Message, MessageMedia, Poll, PollResults} from '../layer';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport StackedAvatars from './stackedAvatars';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\n\nlet lineTotalLength = 0;\nconst tailLength = 9;\nconst times = 10;\nconst fullTime = 340;\nconst oneTime = fullTime / times;\n\nexport const roundPercents = (percents: number[]) => {\n // console.log('roundPercents before percents:', percents);\n\n const sum = percents.reduce((acc, p) => acc + Math.round(p), 0);\n if(sum > 100) {\n const diff = sum - 100;\n const length = percents.length;\n for(let i = 0; i < diff; ++i) {\n let minIndex = -1, minRemainder = 1;\n for(let k = 0; k < length; ++k) {\n const remainder = percents[k] % 1;\n if(remainder >= 0.5 && remainder < minRemainder) {\n minRemainder = remainder;\n minIndex = k;\n }\n }\n\n if(minIndex === -1) {\n // throw new Error('lol chto');\n return;\n }\n\n percents[minIndex] -= minRemainder;\n }\n } else if(sum < 100) {\n const diff = 100 - sum;\n const length = percents.length;\n for(let i = 0; i < diff; ++i) {\n let minIndex = -1, maxRemainder = 0;\n for(let k = 0; k < length; ++k) {\n const remainder = percents[k] % 1;\n if(remainder < 0.5 && remainder > maxRemainder) {\n maxRemainder = remainder;\n minIndex = k;\n }\n }\n\n if(minIndex === -1) {\n // throw new Error('lol chto');\n return;\n }\n\n percents[minIndex] += 1 - maxRemainder;\n }\n }\n\n // console.log('roundPercents after percents:', percents);\n};\n\n/* const connectedPolls: {id: string, element: PollElement}[] = [];\nrootScope.on('poll_update', (e) => {\n const {poll, results} = e as {poll: Poll, results: PollResults};\n\n //console.log('poll_update', poll, results);\n for(const connected of connectedPolls) {\n if(connected.id === poll.id) {\n const pollElement = connected.element;\n pollElement.isClosed = !!poll.pFlags.closed;\n pollElement.performResults(results, poll.chosenIndexes);\n }\n }\n}); */\n\nrootScope.addEventListener('poll_update', ({poll, results}) => {\n const pollElements = Array.from(document.querySelectorAll(`poll-element[poll-id=\"${poll.id}\"]`)) as PollElement[];\n pollElements.forEach((pollElement) => {\n // console.log('poll_update', poll, results);\n pollElement.isClosed = !!poll.pFlags.closed;\n pollElement.performResults(results, poll.chosenIndexes);\n });\n});\n\nmediaSizes.addEventListener('resize', () => {\n PollElement.setMaxLength();\n PollElement.resizePolls();\n});\n\nmediaSizes.addEventListener('changeScreen', () => {\n PollElement.setMaxLength();\n});\n\nconst hideQuizHint = (element: HTMLElement, onHide: () => void, timeout: number) => {\n element.classList.remove('active');\n\n clearTimeout(timeout);\n setTimeout(() => {\n onHide();\n element.remove();\n\n if(prevQuizHint === element && prevQuizHintOnHide === onHide && prevQuizHintTimeout === timeout) {\n prevQuizHint = prevQuizHintOnHide = null;\n prevQuizHintTimeout = 0;\n }\n }, 200);\n};\n\nlet prevQuizHint: HTMLElement, prevQuizHintOnHide: () => void, prevQuizHintTimeout: number;\nlet isListenerSet = false;\nconst setQuizHint = (solution: string, solution_entities: any[], onHide: () => void) => {\n if(prevQuizHint) {\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\n }\n\n const element = document.createElement('div');\n element.classList.add('quiz-hint');\n\n const container = document.createElement('div');\n container.classList.add('container', 'tgico');\n\n const textEl = document.createElement('div');\n textEl.classList.add('text');\n\n container.append(textEl);\n element.append(container);\n\n setInnerHTML(textEl, wrapRichText(solution, {entities: solution_entities}));\n appImManager.chat.bubbles.container.append(element);\n\n void element.offsetLeft; // reflow\n element.classList.add('active');\n\n prevQuizHint = element;\n prevQuizHintOnHide = onHide;\n prevQuizHintTimeout = window.setTimeout(() => {\n hideQuizHint(element, onHide, prevQuizHintTimeout);\n }, IS_TOUCH_SUPPORTED ? 5000 : 7000);\n\n if(!isListenerSet) {\n isListenerSet = true;\n appImManager.addEventListener('peer_changed', () => {\n if(prevQuizHint) {\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\n }\n });\n }\n};\n\nexport default class PollElement extends HTMLElement {\n public static MAX_OFFSET = -46.5;\n public static MAX_LENGTH = 0;\n public svgLines: SVGSVGElement[];\n private numberDivs: HTMLDivElement[];\n private answerDivs: HTMLDivElement[];\n private descDiv: HTMLElement;\n private typeDiv: HTMLElement;\n private avatarsDiv: HTMLElement;\n private viewResults: HTMLElement;\n private votersCountDiv: HTMLDivElement;\n\n // private maxLength: number;\n // private maxLengths: number[];\n private maxPercents: number[];\n\n public isClosed = false;\n private isQuiz = false;\n private isRetracted = false;\n private isPublic = false;\n private isMultiple = false;\n private chosenIndexes: number[] = [];\n private percents: number[];\n\n public message: Message.message;\n public managers: AppManagers;\n\n private quizInterval: number;\n private quizTimer: SVGSVGElement;\n\n private sendVoteBtn: HTMLElement;\n private chosingIndexes: number[] = [];\n\n private sendVotePromise: Promise;\n private sentVote = false;\n\n public static setMaxLength() {\n const width = windowSize.width <= 360 ? windowSize.width - 120 : mediaSizes.active.poll.width;\n this.MAX_LENGTH = width + tailLength + this.MAX_OFFSET + -13.7; // 13 - position left\n }\n\n public static resizePolls() {\n if(!this.MAX_LENGTH) return;\n const pollElements = Array.from(document.querySelectorAll('poll-element.is-voted')) as PollElement[];\n pollElements.forEach((pollElement) => {\n pollElement.svgLines.forEach((svg, idx) => {\n // void svg.getBoundingClientRect(); // reflow\n pollElement.setLineProgress(idx, 1);\n });\n });\n }\n\n public async render() {\n // браузер вызывает этот метод при добавлении элемента в документ\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\n\n if(!lineTotalLength) {\n lineTotalLength = (document.getElementById('poll-line') as any as SVGPathElement).getTotalLength();\n // console.log('line total length:', lineTotalLength);\n PollElement.setMaxLength();\n }\n\n // const {poll, results} = this.managers.appPollsManager.getPoll(pollId);\n const {poll, results} = this.message.media as MessageMedia.messageMediaPoll;\n\n /* const timestamp = Date.now() / 1000 | 0;\n if(timestamp < this.message.date) { */\n if(this.message.pFlags.is_scheduled) {\n this.classList.add('disable-hover');\n }\n\n // console.log('pollElement poll:', poll, results);\n\n let descKey: LangPackKey;\n if(poll.pFlags) {\n this.isPublic = !!poll.pFlags.public_voters;\n this.isQuiz = !!poll.pFlags.quiz;\n this.isClosed = !!poll.pFlags.closed;\n this.isMultiple = !!poll.pFlags.multiple_choice;\n\n if(this.isClosed) {\n descKey = 'Chat.Poll.Type.Closed';\n this.classList.add('is-closed');\n } else if(this.isQuiz) {\n descKey = this.isPublic ? 'Chat.Poll.Type.Quiz' : 'Chat.Poll.Type.AnonymousQuiz';\n } else {\n descKey = this.isPublic ? 'Chat.Poll.Type.Public' : 'Chat.Poll.Type.Anonymous';\n }\n }\n\n this.classList.toggle('is-multiple', this.isMultiple);\n\n const multipleSelect = this.isMultiple ? '' : '';\n const votes = poll.answers.map((answer, idx) => {\n return `\n
\n
\n
\n \n \n \n ${multipleSelect}\n
\n
\n
\n \n \n \n \n
\n `;\n }).join('');\n\n this.innerHTML = `\n
\n
\n
\n
\n
\n ${votes}`;\n\n setInnerHTML(this.firstElementChild, wrapEmojiText(poll.question));\n\n Array.from(this.querySelectorAll('.poll-answer-text')).forEach((el, idx) => {\n setInnerHTML(el, wrapEmojiText(poll.answers[idx].text));\n });\n\n this.descDiv = this.firstElementChild.nextElementSibling as HTMLElement;\n this.typeDiv = this.descDiv.firstElementChild as HTMLElement;\n this.avatarsDiv = this.descDiv.lastElementChild as HTMLElement;\n\n if(descKey) {\n this.typeDiv.append(i18n(descKey));\n }\n\n if(this.isQuiz) {\n this.classList.add('is-quiz');\n\n if(poll.close_period && poll.close_date) {\n const timeLeftDiv = document.createElement('div');\n timeLeftDiv.classList.add('poll-time');\n this.descDiv.append(timeLeftDiv);\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n // svg.setAttributeNS(null, 'viewBox', '0 0 15 15');\n svg.classList.add('poll-quiz-timer');\n\n this.quizTimer = svg;\n\n const strokeWidth = 2;\n const radius = 7;\n const circumference = 2 * Math.PI * radius;\n\n const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n circle.classList.add('poll-quiz-timer-circle');\n circle.setAttributeNS(null, 'cx', '16');\n circle.setAttributeNS(null, 'cy', '16');\n circle.setAttributeNS(null, 'r', '' + radius);\n circle.setAttributeNS(null, 'stroke-width', '' + strokeWidth);\n\n svg.append(circle);\n this.descDiv.append(svg);\n\n const period = poll.close_period * 1000;\n const closeTime = (poll.close_date - await rootScope.managers.timeManager.getServerTimeOffset()) * 1000;\n\n // console.log('closeTime:', poll.close_date, serverTimeManager.serverTimeOffset, Date.now() / 1000 | 0);\n\n // let time = Date.now();\n // let percents = (closeTime - time) / period;\n\n // timeLeftDiv.innerHTML = String((closeTime - time) / 1000 + 1 | 0).toHHMMSS();\n\n // // @ts-ignore\n // circle.style.strokeDashoffset = circumference + percents * circumference;\n // circle.style.strokeDasharray = ${circumference} ${circumference};\n\n this.quizInterval = window.setInterval(() => {\n const time = Date.now();\n const percents = (closeTime - time) / period;\n const timeLeft = (closeTime - time) / 1000 + 1 | 0;\n timeLeftDiv.innerHTML = toHHMMSS(timeLeft);\n\n if(timeLeft <= 5) {\n timeLeftDiv.style.color = '#ee545c';\n circle.style.stroke = '#ee545c';\n }\n // timeLeftDiv.style.visibility = 'visible';\n\n // @ts-ignore\n circle.style.strokeDashoffset = circumference + percents * circumference;\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\n\n if(time >= closeTime) {\n clearInterval(this.quizInterval);\n timeLeftDiv.innerHTML = '';\n // @ts-ignore\n circle.style.strokeDashoffset = circumference;\n this.quizInterval = 0;\n\n setTimeout(() => {\n // нужно запросить апдейт чтобы опрос обновился\n this.managers.appPollsManager.getResults(this.message);\n }, 3e3);\n }\n }, 1e3);\n }\n }\n\n this.answerDivs = Array.from(this.querySelectorAll('.poll-answer')) as HTMLDivElement[];\n this.svgLines = Array.from(this.querySelectorAll('.poll-line')) as SVGSVGElement[];\n this.numberDivs = Array.from(this.querySelectorAll('.poll-answer-percents')) as HTMLDivElement[];\n\n const footerDiv = document.createElement('div');\n footerDiv.classList.add('poll-footer');\n\n this.viewResults = document.createElement('div');\n this.viewResults.className = 'poll-footer-button poll-view-results hide';\n this.viewResults.append(i18n('Chat.Poll.ViewResults'));\n\n this.votersCountDiv = document.createElement('div');\n this.votersCountDiv.className = 'poll-votes-count';\n\n footerDiv.append(this.viewResults, this.votersCountDiv);\n this.append(footerDiv);\n\n this.viewResults.addEventListener('click', (e) => {\n cancelEvent(e);\n\n if(!appSidebarRight.isTabExists(AppPollResultsTab)) {\n appSidebarRight.createTab(AppPollResultsTab).open(this.message);\n }\n });\n ripple(this.viewResults);\n\n if(this.isMultiple) {\n this.sendVoteBtn = document.createElement('div');\n this.sendVoteBtn.classList.add('poll-footer-button', 'poll-send-vote');\n this.sendVoteBtn.append(i18n('Chat.Poll.SubmitVote'));\n ripple(this.sendVoteBtn);\n\n if(!poll.chosenIndexes.length) {\n this.votersCountDiv.classList.add('hide');\n }\n\n attachClickEvent(this.sendVoteBtn, (e) => {\n cancelEvent(e);\n /* const indexes = this.answerDivs.filter((el) => el.classList.contains('is-chosing')).map((el) => +el.dataset.index);\n if(indexes.length) {\n\n } */\n if(this.chosingIndexes.length) {\n this.sendVotes(this.chosingIndexes).then(() => {\n this.chosingIndexes.length = 0;\n this.answerDivs.forEach((el) => {\n el.classList.remove('is-chosing');\n });\n });\n }\n });\n\n footerDiv.append(this.sendVoteBtn);\n }\n\n // const width = this.getBoundingClientRect().width;\n // const width = mediaSizes.active.poll.width;\n // this.maxLength = width + tailLength + this.maxOffset + -13.7; // 13 - position left\n\n const canVote = !(poll.chosenIndexes.length || this.isClosed);\n if(!canVote || this.isPublic) {\n this.performResults(results, poll.chosenIndexes, false);\n }\n\n if(canVote) {\n this.setVotersCount(results);\n attachClickEvent(this, this.clickHandler);\n }\n }\n\n initQuizHint(results: PollResults) {\n if(results.solution && results.solution_entities) {\n const toggleHint = document.createElement('div');\n toggleHint.classList.add('tgico-tip', 'poll-hint');\n this.descDiv.append(toggleHint);\n\n // let active = false;\n attachClickEvent(toggleHint, (e) => {\n cancelEvent(e);\n\n // active = true;\n toggleHint.classList.add('active');\n setQuizHint(results.solution, results.solution_entities, () => {\n // active = false;\n toggleHint.classList.remove('active');\n });\n });\n\n if(this.sentVote) {\n const correctResult = results.results.find((r) => r.pFlags.correct);\n if(correctResult && !correctResult.pFlags.chosen) {\n simulateClickEvent(toggleHint);\n }\n }\n }\n }\n\n clickHandler(e: Event) {\n const target = findUpClassName(e.target, 'poll-answer') as HTMLElement;\n if(!target) {\n return;\n }\n\n cancelEvent(e);\n const answerIndex = +target.dataset.index;\n if(this.isMultiple) {\n target.classList.toggle('is-chosing');\n\n const foundIndex = this.chosingIndexes.indexOf(answerIndex);\n if(foundIndex !== -1) {\n this.chosingIndexes.splice(foundIndex, 1);\n } else {\n this.chosingIndexes.push(answerIndex);\n }\n } else {\n this.sendVotes([answerIndex]);\n }\n\n /* target.classList.add('is-voting');\n setTimeout(() => { // simulate\n this.setResults([100, 0], answerIndex);\n target.classList.remove('is-voting');\n }, 1000); */\n }\n\n sendVotes(indexes: number[]) {\n if(this.sendVotePromise) return this.sendVotePromise;\n\n const targets = this.answerDivs.filter((_, idx) => indexes.includes(idx));\n targets.forEach((target) => {\n target.classList.add('is-voting');\n });\n\n this.classList.add('disable-hover');\n this.sentVote = true;\n return this.sendVotePromise = this.managers.appPollsManager.sendVote(this.message, indexes).then(() => {\n targets.forEach((target) => {\n target.classList.remove('is-voting');\n });\n\n this.classList.remove('disable-hover');\n }).catch(() => {\n this.sentVote = false;\n }).finally(() => {\n this.sendVotePromise = null;\n });\n }\n\n performResults(results: PollResults, chosenIndexes: number[], animate = true) {\n if(!rootScope.settings.animationsEnabled) {\n animate = false;\n }\n\n if(this.isQuiz && (results.results?.length || this.isClosed)) {\n this.answerDivs.forEach((el, idx) => {\n el.classList.toggle('is-correct', !!results.results[idx].pFlags.correct);\n });\n\n if(this.initQuizHint) {\n this.initQuizHint(results);\n this.initQuizHint = null;\n }\n\n if(this.quizInterval) {\n clearInterval(this.quizInterval);\n this.quizInterval = 0;\n }\n\n if(this.quizTimer?.parentElement) {\n this.quizTimer.remove();\n }\n\n const timeEl = this.descDiv.querySelector('.poll-time');\n if(timeEl) {\n timeEl.remove();\n }\n }\n\n if(this.isClosed) {\n this.classList.add('is-closed');\n replaceContent(this.typeDiv, i18n('Chat.Poll.Type.Closed'));\n }\n\n // set chosen\n if(this.chosenIndexes.length !== chosenIndexes.length || this.isClosed) { // if we voted\n this.isRetracted = this.chosenIndexes.length && !chosenIndexes.length;\n this.chosenIndexes = chosenIndexes.slice();\n\n if(this.isRetracted) {\n attachClickEvent(this, this.clickHandler);\n } else {\n detachClickEvent(this, this.clickHandler);\n }\n }\n\n // is need update\n if(this.chosenIndexes.length || this.isRetracted || this.isClosed) {\n const percents = results.results.map((v) => results.total_voters ? v.voters / results.total_voters * 100 : 0);\n\n this.classList.toggle('no-transition', !animate);\n if(animate) {\n SetTransition({\n element: this,\n className: '',\n forwards: !this.isRetracted,\n duration: 340\n });\n }\n\n fastRaf(() => {\n this.setResults(this.isRetracted ? this.percents : percents, this.chosenIndexes, animate);\n this.percents = percents;\n this.isRetracted = false;\n });\n }\n\n this.setVotersCount(results);\n\n if(this.isPublic) {\n if(!this.isMultiple) {\n this.viewResults.classList.toggle('hide', !results.total_voters || !this.chosenIndexes.length);\n this.votersCountDiv.classList.toggle('hide', !!this.chosenIndexes.length);\n }\n\n const peerIds = (results.recent_voters || []).map((userId) => userId.toPeerId());\n const stackedAvatars = new StackedAvatars({avatarSize: 16});\n stackedAvatars.render(peerIds);\n replaceContent(this.avatarsDiv, stackedAvatars.container);\n }\n\n if(this.isMultiple) {\n const isVoted = !!this.chosenIndexes.length;\n\n const hideSendVoteBtn = this.isClosed || isVoted;\n const hideViewResultsBtn = !this.isPublic || !results.total_voters || (!isVoted && !this.isClosed);\n this.sendVoteBtn.classList.toggle('hide', hideSendVoteBtn);\n this.viewResults.classList.toggle('hide', hideViewResultsBtn);\n this.votersCountDiv.classList.toggle('hide', !hideSendVoteBtn || !hideViewResultsBtn);\n }\n }\n\n setResults(percents: number[], chosenIndexes: number[], animate: boolean) {\n this.svgLines.forEach((svg) => svg.style.display = '');\n\n this.answerDivs.forEach((el, idx) => {\n el.classList.toggle('is-chosen', chosenIndexes.includes(idx));\n });\n\n const maxValue = Math.max(...percents);\n // this.maxLengths = percents.map((p) => p / maxValue * this.maxLength);\n this.maxPercents = percents.map((p) => p / maxValue);\n\n // line\n if(this.isRetracted) {\n this.svgLines.forEach((svg, idx) => {\n this.setLineProgress(idx, -1);\n });\n } else {\n const cb = () => {\n this.svgLines.forEach((svg, idx) => {\n // void svg.getBoundingClientRect(); // reflow\n this.setLineProgress(idx, 1);\n });\n };\n\n animate ? fastRaf(cb) : cb();\n }\n\n percents = percents.slice();\n roundPercents(percents);\n let getPercentValue: (percents: number, index: number) => number;\n const iterate = (i: number) => {\n percents.forEach((percents, idx) => {\n const value = getPercentValue(percents, i);\n this.numberDivs[idx].innerText = value + '%';\n });\n };\n // numbers\n if(this.isRetracted) {\n getPercentValue = (percents, index) => Math.round(percents / times * index);\n\n if(animate) {\n for(let i = (times - 1), k = 0; i >= 0; --i, ++k) {\n setTimeout(() => {\n iterate(i);\n }, oneTime * k);\n }\n } else {\n iterate(0);\n }\n } else {\n getPercentValue = (percents, index) => Math.round(percents / times * (index + 1));\n\n if(animate) {\n for(let i = 0; i < times; ++i) {\n setTimeout(() => {\n iterate(i);\n }, oneTime * i);\n }\n } else {\n iterate(times - 1);\n }\n }\n\n if(this.isRetracted) {\n if(animate) {\n this.classList.add('is-retracting');\n }\n\n this.classList.remove('is-voted');\n const cb = () => {\n this.svgLines.forEach((svg) => svg.style.display = 'none');\n };\n\n if(animate) {\n setTimeout(() => {\n this.classList.remove('is-retracting');\n cb();\n }, fullTime);\n } else {\n cb();\n }\n } else {\n this.classList.add('is-voted');\n }\n }\n\n setVotersCount(results: PollResults) {\n const votersCount = results.total_voters || 0;\n let key: LangPackKey;\n const args: FormatterArguments = [votersCount];\n if(this.isClosed) {\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesResultEmpty';\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesResultEmpty';\n } else {\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesEmpty';\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesEmpty';\n }\n\n replaceContent(this.votersCountDiv, i18n(key, args));\n }\n\n setLineProgress(index: number, multiplier: number) {\n const svg = this.svgLines[index];\n\n if(multiplier === -1) {\n svg.style.strokeDasharray = '';\n svg.style.strokeDashoffset = '';\n } else {\n // svg.style.strokeDasharray = (multiplier * this.maxLengths[index]) + ', 485.9';\n svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * PollElement.MAX_LENGTH) + ', 485.9';\n // svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * 100) + '%, 485.9';\n svg.style.strokeDashoffset = '' + multiplier * PollElement.MAX_OFFSET;\n }\n }\n\n // у элемента могут быть ещё другие методы и свойства\n}\n\ncustomElements.define('poll-element', PollElement);\n","// https://stackoverflow.com/a/14824756/6758968\nconst ltrChars = 'A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF'+'\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF',\n rtlChars = '\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC',\n fullRtlDirCheck = new RegExp('^[^'+ltrChars+']*['+rtlChars+']'),\n justRtlDirCheck = new RegExp('['+rtlChars+']');\n\nexport default function isRTL(s: string, anyChar?: boolean) {\n return anyChar ? justRtlDirCheck.test(s) : fullRtlDirCheck.test(s);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppImManager, ChatSavedPosition, ChatSetPeerOptions} from '../../lib/appManagers/appImManager';\nimport type {HistoryResult, MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport type Chat from './chat';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {logger} from '../../lib/logger';\nimport rootScope from '../../lib/rootScope';\nimport BubbleGroups from './bubbleGroups';\nimport PopupDatePicker from '../popups/datePicker';\nimport PopupForward from '../popups/forward';\nimport PopupStickers from '../popups/stickers';\nimport ProgressivePreloader from '../preloader';\nimport Scrollable, {SliceSides} from '../scrollable';\nimport StickyIntersector from '../stickyIntersector';\nimport animationIntersector from '../animationIntersector';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {IS_ANDROID, IS_APPLE, IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\nimport I18n, {FormatterArguments, i18n, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n} from '../../lib/langPack';\nimport AvatarElement from '../avatar';\nimport ripple from '../ripple';\nimport {MessageRender} from './messageRender';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport PollElement from '../poll';\nimport AudioElement from '../audio';\nimport {Chat as MTChat, ChatInvite, Document, Message, MessageEntity, MessageMedia, MessageReplyHeader, Photo, PhotoSize, ReactionCount, ReplyMarkup, SponsoredMessage, Update, UrlAuthResult, User, WebPage} from '../../layer';\nimport {BOT_START_PARAM, NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport {FocusDirection, ScrollStartCallbackDimensions} from '../../helpers/fastSmoothScroll';\nimport useHeavyAnimationCheck, {getHeavyAnimationPromise, dispatchHeavyAnimationEvent, interruptHeavyAnimation} from '../../hooks/useHeavyAnimationCheck';\nimport {fastRaf, fastRafPromise} from '../../helpers/schedulers';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport RepliesElement from './replies';\nimport DEBUG from '../../config/debug';\nimport {SliceEnd} from '../../helpers/slicedArray';\nimport PeerTitle from '../peerTitle';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport {toast, toastNew} from '../toast';\nimport {getElementByPoint} from '../../helpers/dom/getElementByPoint';\nimport {getMiddleware, Middleware} from '../../helpers/middleware';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent, detachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport htmlToDocumentFragment from '../../helpers/dom/htmlToDocumentFragment';\nimport reflowScrollableElement from '../../helpers/dom/reflowScrollableElement';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {cancelAnimationByKey} from '../../helpers/animation';\nimport assumeType from '../../helpers/assumeType';\nimport debounce, {DebounceReturnType} from '../../helpers/schedulers/debounce';\nimport {SEND_WHEN_ONLINE_TIMESTAMP} from '../../lib/mtproto/constants';\nimport windowSize from '../../helpers/windowSize';\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\nimport AppMediaViewer from '../appMediaViewer';\nimport SetTransition from '../singleTransition';\nimport handleHorizontalSwipe from '../../helpers/dom/handleHorizontalSwipe';\nimport findUpAttribute from '../../helpers/dom/findUpAttribute';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport formatCallDuration from '../../helpers/formatCallDuration';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport Button from '../button';\nimport {CallType} from '../../lib/calls/types';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport PopupJoinChatInvite from '../popups/joinChatInvite';\nimport {InternalLink, INTERNAL_LINK_TYPE} from '../../lib/appManagers/internalLink';\nimport ReactionsElement, {REACTIONS_ELEMENTS} from './reactions';\nimport type ReactionElement from './reaction';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport pause from '../../helpers/schedulers/pause';\nimport ScrollSaver from '../../helpers/scrollSaver';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport getViewportSlice from '../../helpers/dom/getViewportSlice';\nimport SuperIntersectionObserver from '../../helpers/dom/superIntersectionObserver';\nimport generateFakeIcon from '../generateFakeIcon';\nimport copyFromElement from '../../helpers/dom/copyFromElement';\nimport PopupElement from '../popups';\nimport setAttachmentSize from '../../helpers/setAttachmentSize';\nimport wrapWebPageDescription from '../wrappers/webPageDescription';\nimport wrapWebPageTitle from '../wrappers/webPageTitle';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport wrapMessageActionTextNew from '../wrappers/messageActionTextNew';\nimport isMentionUnread from '../../lib/appManagers/utils/messages/isMentionUnread';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport getPeerColorById from '../../lib/appManagers/utils/peers/getPeerColorById';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport generateMessageId from '../../lib/appManagers/utils/messageId/generateMessageId';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {Awaited, SendMessageEmojiInteractionData} from '../../types';\nimport idleController from '../../helpers/idleController';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport {cancelContextMenuOpening} from '../../helpers/dom/attachContextMenuListener';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {AckedResult} from '../../lib/mtproto/superMessagePort';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport {EmoticonsDropdown} from '../emoticonsDropdown';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport noop from '../../helpers/noop';\nimport getAlbumText from '../../lib/appManagers/utils/messages/getAlbumText';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport PopupPayment from '../popups/payment';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport attachStickerViewerListeners from '../stickerViewer';\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\nimport wrapSticker, {onEmojiStickerClick} from '../wrappers/sticker';\nimport wrapAlbum from '../wrappers/album';\nimport wrapDocument from '../wrappers/document';\nimport wrapGroupedDocuments from '../wrappers/groupedDocuments';\nimport wrapPhoto from '../wrappers/photo';\nimport wrapPoll from '../wrappers/poll';\nimport wrapVideo from '../wrappers/video';\nimport isRTL from '../../helpers/string/isRTL';\nimport NBSP from '../../helpers/string/nbsp';\nimport DotRenderer from '../dotRenderer';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport {BatchProcessor} from '../../helpers/sortedList';\nimport wrapUrl from '../../lib/richTextProcessor/wrapUrl';\nimport getMessageThreadId from '../../lib/appManagers/utils/messages/getMessageThreadId';\nimport wrapTopicNameButton from '../wrappers/topicNameButton';\nimport wrapMediaSpoiler, {onMediaSpoilerClick, toggleMediaSpoiler} from '../wrappers/mediaSpoiler';\nimport confirmationPopup from '../confirmationPopup';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport {PopupPeerCheckboxOptions} from '../popups/peer';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\n\nexport const USER_REACTIONS_INLINE = false;\nconst USE_MEDIA_TAILS = false;\ntype MESSAGE_ACTION_TYPE = Message.messageService['action']['_'];\ntype IGNORE_ACTION_KEY = MESSAGE_ACTION_TYPE;\ntype IGNORE_ACTION_VALUE = true | ((message: Message.messageService) => boolean);\nconst IGNORE_ACTIONS: Map = new Map([\n ['messageActionHistoryClear', true],\n ['messageActionChatCreate', (message) => message.pFlags.out]\n // 'messageActionChannelMigrateFrom'\n] as [IGNORE_ACTION_KEY, IGNORE_ACTION_VALUE][]);\n\nexport const SERVICE_AS_REGULAR: Set = new Set();\n\nif(IS_CALL_SUPPORTED) {\n SERVICE_AS_REGULAR.add('messageActionPhoneCall');\n}\n\nconst TEST_SCROLL_TIMES: number = undefined;\nlet TEST_SCROLL = TEST_SCROLL_TIMES;\n\nlet queueId = 0;\n\ntype GenerateLocalMessageType = IsService extends true ? Message.messageService : Message.message;\n\nconst SPONSORED_MESSAGE_ID_OFFSET = 1;\nexport const STICKY_OFFSET = 3;\nconst SCROLLED_DOWN_THRESHOLD = 300;\nconst PEER_CHANGED_ERROR = new Error('peer changed');\n\nconst DO_NOT_SLICE_VIEWPORT = false;\nconst DO_NOT_SLICE_VIEWPORT_ON_RENDER = false;\nconst DO_NOT_UPDATE_MESSAGE_VIEWS = false;\nconst DO_NOT_UPDATE_MESSAGE_REACTIONS = false;\nconst DO_NOT_UPDATE_MESSAGE_REPLY = false;\n\nconst BIG_EMOJI_SIZES: {[size: number]: number} = {\n 1: 96,\n 2: 90,\n 3: 84,\n 4: 72,\n 5: 60,\n 6: 48,\n 7: 36\n};\nconst BIG_EMOJI_SIZES_LENGTH = Object.keys(BIG_EMOJI_SIZES).length;\n\ntype Bubble = {\n bubble: HTMLElement,\n mids: Set,\n groupedId?: string\n};\n\ntype MyHistoryResult = HistoryResult | {history: number[]};\n\nfunction getMainMidForGrouped(mids: number[]) {\n return Math.max(...mids);\n}\n\nexport default class ChatBubbles {\n public container: HTMLDivElement;\n public chatInner: HTMLDivElement;\n public scrollable: Scrollable;\n\n private getHistoryTopPromise: Promise;\n private getHistoryBottomPromise: Promise;\n\n // public messagesCount: number = -1;\n\n private unreadOut = new Set();\n public needUpdate: {replyToPeerId: PeerId, replyMid: number, mid: number}[] = []; // if need wrapSingleMessage\n\n public bubbles: {[mid: string]: HTMLElement} = {};\n public skippedMids: Set = new Set();\n public bubblesNewByGroupedId: {[groupId: string]: Bubble} = {};\n public bubblesNew: {[mid: string]: Bubble} = {};\n private dateMessages: {[timestamp: number]: {\n div: HTMLElement,\n firstTimestamp: number,\n container: HTMLElement,\n timeout?: number\n }} = {};\n\n private scrolledDown = true;\n private isScrollingTimeout = 0;\n\n private stickyIntersector: StickyIntersector;\n\n private unreaded: Map = new Map();\n private unreadedSeen: Set = new Set();\n private readPromise: Promise;\n\n private bubbleGroups: BubbleGroups;\n\n private preloader: ProgressivePreloader = null;\n\n // private messagesQueueOnRender: () => void = null;\n private messagesQueueOnRenderAdditional: () => void = null;\n\n private firstUnreadBubble: HTMLElement = null;\n private attachedUnreadBubble: boolean;\n\n public lazyLoadQueue: LazyLoadQueue;\n\n private middlewareHelper = getMiddleware();\n\n private log: ReturnType;\n\n public listenerSetter: ListenerSetter;\n\n private followStack: number[] = [];\n\n private isHeavyAnimationInProgress = false;\n private scrollingToBubble: HTMLElement;\n\n private isFirstLoad = true;\n private needReflowScroll: boolean;\n\n private fetchNewPromise: Promise;\n\n private passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }> = {};\n\n private onAnimateLadder: () => Promise | void;\n // private ladderDeferred: CancellablePromise;\n private resolveLadderAnimation: () => Promise;\n private emptyPlaceholderBubble: HTMLElement;\n\n private viewsMids: Set = new Set();\n private sendViewCountersDebounced: () => Promise;\n\n private isTopPaddingSet = false;\n\n private getSponsoredMessagePromise: Promise;\n\n private previousStickyDate: HTMLElement;\n private sponsoredMessage: SponsoredMessage.sponsoredMessage;\n\n private hoverBubble: HTMLElement;\n private hoverReaction: HTMLElement;\n private sliceViewportDebounced: DebounceReturnType;\n private resizeObserver: ResizeObserver;\n private willScrollOnLoad: boolean;\n public observer: SuperIntersectionObserver;\n\n private renderingMessages: Set = new Set();\n private setPeerCached: boolean;\n private attachPlaceholderOnRender: () => void;\n\n private bubblesToEject: Set = new Set();\n private bubblesToReplace: Map = new Map(); // TO -> FROM\n private updatePlaceholderPosition: () => void;\n private setPeerOptions: {lastMsgId: number; topMessage: number;};\n\n private setPeerTempId: number = 0;\n\n private renderNewPromises: Set> = new Set();\n private updateGradient: boolean;\n\n private extendedMediaMessages: Set = new Set();\n private pollExtendedMediaMessagesPromise: Promise;\n\n private batchProcessor: BatchProcessor>>;\n\n // private reactions: Map;\n\n constructor(\n private chat: Chat,\n private managers: AppManagers\n ) {\n this.log = this.chat.log;\n // this.chat.log.error('Bubbles construction');\n\n this.listenerSetter = new ListenerSetter();\n\n this.constructBubbles();\n\n // * constructor end\n\n this.batchProcessor = new BatchProcessor({\n log: this.log,\n process: this.processBatch,\n possibleError: PEER_CHANGED_ERROR\n });\n this.bubbleGroups = new BubbleGroups(this.chat);\n this.preloader = new ProgressivePreloader({\n cancelable: false\n });\n this.lazyLoadQueue = new LazyLoadQueue(undefined, true);\n this.lazyLoadQueue.queueId = ++queueId;\n\n // this.reactions = new Map();\n\n // * events\n\n // will call when sent for update pos\n this.listenerSetter.add(rootScope)('history_update', async({storageKey, sequential, message}) => {\n if(this.chat.messagesStorageKey !== storageKey || this.chat.type === 'scheduled') {\n return;\n }\n\n const {mid} = message;\n const log = false ? this.log.bindPrefix('history_update-' + mid) : undefined;\n log && log('start');\n\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n if(this.renderNewPromises.size) {\n log && log.error('will await new messages render');\n await Promise.all(Array.from(this.renderNewPromises));\n }\n\n if(this.messagesQueuePromise) {\n log && log.error('messages render in process');\n await this.messagesQueuePromise;\n }\n\n if(this.bubbles[mid] !== bubble) return;\n\n // await getHeavyAnimationPromise();\n\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(!item) { // probably a group item\n log && log.error('no item by bubble', bubble);\n return;\n } else if(item.mid === mid) {\n log && log.warn('wow what', item, mid);\n return;\n }\n\n if(sequential) {\n const group = item.group;\n const newItem = this.bubbleGroups.createItem(bubble, message);\n // newItem.mid = item.mid;\n const _items = this.bubbleGroups.itemsArr.slice();\n indexOfAndSplice(_items, item);\n const foundItem = this.bubbleGroups.findGroupSiblingByItem(newItem, _items);\n if(\n group === foundItem?.group ||\n (group === this.bubbleGroups.getLastGroup() && group.items.length === 1 && newItem.dateTimestamp === item.dateTimestamp) ||\n (this.peerId === rootScope.myId && sequential && newItem.dateTimestamp === item.dateTimestamp)\n ) {\n log && log('item has correct position', item);\n this.bubbleGroups.changeBubbleMid(bubble, mid);\n return;\n }\n }\n\n // return;\n\n // await fastRafPromise();\n // if(this.bubbles[mid] !== bubble) return;\n\n // const groupIndex = this.bubbleGroups.groups.indexOf(group);\n this.bubbleGroups.removeAndUnmountBubble(bubble);\n // if(!group.items.length) { // group has collapsed, next message can have higher mid so have to reposition them too\n // log && log('group has collapsed', item);\n\n // const siblingGroups = this.bubbleGroups.groups.slice(0, groupIndex + 1);\n // for(let length = siblingGroups.length, i = length - 2; i >= 0; --i) {\n // const siblingGroup = siblingGroups[i];\n // const siblingItems = siblingGroup.items;\n // const nextGroup = siblingGroups[i + 1];\n // const nextItems = nextGroup.items;\n\n // let _break = false, moved = false;\n // for(let j = siblingItems.length - 1; j >= 0; --j) {\n // const siblingItem = siblingItems[j];\n // const foundItem = this.bubbleGroups.findGroupSiblingByItem(siblingItem, nextItems);\n // if(!foundItem) {\n // _break = true;\n // break;\n // }\n\n // log('will move item', siblingItem, nextGroup);\n // this.bubbleGroups.removeAndUnmountBubble(siblingItem.bubble);\n // this.bubbleGroups.addItemToGroup(siblingItem, nextGroup);\n // moved = true;\n // }\n\n // if(moved) {\n // nextGroup.mount();\n // }\n\n // if(_break) {\n // break;\n // }\n // }\n // }\n\n const {groups} = this.groupBubbles([{bubble, message}]);\n this.bubbleGroups.mountUnmountGroups(groups);\n\n if(this.scrollingToBubble) {\n this.scrollToEnd();\n }\n\n log && log('end');\n\n // this.bubbleGroups.findIncorrentPositions();\n });\n\n this.listenerSetter.add(rootScope)('dialog_flush', ({peerId}) => {\n if(this.peerId === peerId) {\n this.deleteMessagesByIds(Object.keys(this.bubbles).map((m) => +m));\n }\n });\n\n // Calls when message successfully sent and we have an id\n this.listenerSetter.add(rootScope)('message_sent', async(e) => {\n const {storageKey, tempId, tempMessage, mid, message} = e;\n\n // ! can't use peerId to validate here, because id can be the same in 'scheduled' and 'chat' types\n if(this.chat.messagesStorageKey !== storageKey) {\n return;\n }\n\n const bubbles = this.bubbles;\n const _bubble = bubbles[tempId];\n if(_bubble) {\n const bubble = bubbles[tempId];\n bubbles[mid] = bubble;\n bubble.dataset.mid = '' + mid;\n delete bubbles[tempId];\n\n fastRaf(() => {\n const mid = +bubble.dataset.mid;\n if(bubbles[mid] === bubble && bubble.classList.contains('is-outgoing')) {\n bubble.classList.remove('is-sending', 'is-outgoing');\n bubble.classList.add((this.peerId === rootScope.myId && this.chat.type !== 'scheduled') || !this.unreadOut.has(mid) ? 'is-read' : 'is-sent');\n }\n });\n }\n\n if(this.unreadOut.has(tempId)) {\n this.unreadOut.delete(tempId);\n this.unreadOut.add(mid);\n }\n\n // * check timing of scheduled message\n if(this.chat.type === 'scheduled') {\n const timestamp = Date.now() / 1000 | 0;\n const maxTimestamp = tempMessage.date - 10;\n if(timestamp >= maxTimestamp) {\n this.deleteMessagesByIds([mid]);\n }\n }\n\n if(!_bubble) {\n return;\n }\n\n let messages: (Message.message | Message.messageService)[], tempIds: number[];\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n messages = await this.managers.appMessagesManager.getMessagesByAlbum(groupedId);\n const mids = messages.map(({mid}) => mid);\n if(!mids.length || getMainMidForGrouped(mids) !== mid || bubbles[mid] !== _bubble) {\n return;\n }\n\n if(bubbles[mid] !== _bubble) {\n return;\n }\n\n tempIds = (Array.from(_bubble.querySelectorAll('.grouped-item')) as HTMLElement[]).map((el) => +el.dataset.mid);\n } else {\n messages = [message];\n tempIds = [tempId];\n }\n\n const reactionsElements = Array.from(_bubble.querySelectorAll('reactions-element')) as ReactionsElement[];\n if(reactionsElements.length) {\n reactionsElements.forEach((reactionsElement) => {\n reactionsElement.changeMessage(message as Message.message);\n });\n }\n\n (messages as Message.message[]).forEach((message, idx) => {\n if(!message) {\n return;\n }\n\n const tempId = tempIds[idx];\n const mid = message.mid;\n const bubble: HTMLElement = _bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || _bubble;\n\n if(message._ !== 'message') {\n return;\n }\n\n if(message.replies) {\n const repliesElement = _bubble.querySelector('replies-element') as RepliesElement;\n if(repliesElement) {\n repliesElement.message = message;\n repliesElement.init();\n }\n }\n\n const media = message.media ?? {} as MessageMedia.messageMediaEmpty;\n const doc = (media as MessageMedia.messageMediaDocument).document as Document.document;\n const poll = (media as MessageMedia.messageMediaPoll).poll;\n const webPage = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage;\n if(doc) {\n const div = bubble.querySelector(`.document-container[data-mid=\"${tempId}\"] .document`);\n if(div) {\n const container = findUpClassName(div, 'document-container');\n\n if(!tempMessage.media?.document?.thumbs?.length && doc.thumbs?.length) {\n getHeavyAnimationPromise().then(async() => {\n const timeSpan = div.querySelector('.time');\n const newDiv = await wrapDocument({message, fontSize: rootScope.settings.messagesTextSize});\n div.replaceWith(newDiv);\n\n if(timeSpan) {\n (newDiv.querySelector('.document') || newDiv).append(timeSpan);\n }\n });\n }\n\n if(container) {\n container.dataset.mid = '' + mid;\n }\n }\n\n const element = bubble.querySelector(`audio-element[data-mid=\"${tempId}\"], .document[data-doc-id=\"${tempId}\"], .media-round[data-mid=\"${tempId}\"]`) as HTMLElement;\n if(element) {\n if(element instanceof AudioElement || element.classList.contains('media-round')) {\n element.dataset.mid = '' + message.mid;\n delete element.dataset.isOutgoing;\n (element as any).message = message;\n (element as any).onLoad(true);\n } else {\n element.dataset.docId = '' + doc.id;\n (element as any).doc = doc;\n }\n }\n } else if(poll) {\n const pollElement = bubble.querySelector('poll-element') as PollElement;\n if(pollElement) {\n pollElement.message = message;\n pollElement.setAttribute('poll-id', '' + poll.id);\n pollElement.setAttribute('message-id', '' + mid);\n }\n } else if(webPage && !bubble.querySelector('.web')) {\n getHeavyAnimationPromise().then(() => {\n this.safeRenderMessage(message, true, bubble);\n this.scrollToBubbleIfLast(bubble);\n });\n }\n\n // set new mids to album items for mediaViewer\n if(groupedId) {\n const item = (bubble.querySelector(`.grouped-item[data-mid=\"${tempId}\"]`) as HTMLElement) || bubble; // * it can be .document-container\n if(item) {\n item.dataset.mid = '' + mid;\n }\n }\n });\n });\n\n this.listenerSetter.add(rootScope)('message_edit', async({storageKey, message}) => {\n if(storageKey !== this.chat.messagesStorageKey) return;\n\n const bubble = this.bubbles[message.mid];\n if(!bubble) return;\n\n await getHeavyAnimationPromise();\n if(this.bubbles[message.mid] !== bubble) return;\n\n this.safeRenderMessage(message, true, bubble);\n });\n\n this.listenerSetter.add(rootScope)('message_error', async({storageKey, tempId}) => {\n if(storageKey !== this.chat.messagesStorageKey) return;\n\n const bubble = this.bubbles[tempId];\n if(!bubble) return;\n\n await getHeavyAnimationPromise();\n if(this.bubbles[tempId] !== bubble) return;\n\n bubble.classList.remove('is-outgoing');\n bubble.classList.add('is-error');\n });\n\n this.listenerSetter.add(rootScope)('album_edit', ({peerId, messages, deletedMids}) => {\n if(peerId !== this.peerId) return;\n\n const mids = messages.map(({mid}) => mid);\n const oldMids = mids.concat(Array.from(deletedMids));\n const wasMainMid = getMainMidForGrouped(oldMids);\n const bubble = this.bubbles[wasMainMid];\n if(!bubble) {\n return;\n }\n\n const mainMid = getMainMidForGrouped(mids);\n const message = messages.find((message) => message.mid === mainMid);\n this.safeRenderMessage(message, true, bubble);\n });\n\n // this.listenerSetter.add(rootScope)('peer_title_edit', async(peerId) => {\n // if(peerId.isUser()) {\n // const middleware = this.getMiddleware();\n // const user = await this.managers.appUsersManager.getUser(peerId.toUserId());\n // if(!middleware()) return;\n\n // const isPremium = user?.pFlags?.premium;\n // const groups = this.bubbleGroups.groups.filter((group) => group.avatar?.peerId === peerId);\n // groups.forEach((group) => {\n // group.avatar.classList.toggle('is-premium', isPremium);\n // group.avatar.classList.toggle('tgico-star', isPremium);\n // });\n // }\n // });\n\n if(!DO_NOT_UPDATE_MESSAGE_REACTIONS/* && false */) {\n this.listenerSetter.add(rootScope)('messages_reactions', async(arr) => {\n if(this.chat.type === 'scheduled') {\n return;\n }\n\n let scrollSaver: ScrollSaver;\n\n const a = arr.map(async({message, changedResults}) => {\n if(this.peerId !== message.peerId) {\n return;\n }\n\n const result = await this.getMountedBubble(message.mid, message);\n if(!result) {\n return;\n }\n\n return {bubble: result.bubble, message, changedResults};\n });\n\n let top: number;\n (await Promise.all(a)).filter(Boolean).forEach(({bubble, message, changedResults}) => {\n if(!scrollSaver) {\n scrollSaver = this.createScrollSaver(false);\n scrollSaver.save();\n }\n\n const key = message.peerId + '_' + message.mid;\n const set = REACTIONS_ELEMENTS.get(key);\n if(set) {\n for(const element of set) {\n element.update(message, changedResults);\n }\n } else if(!message.reactions || !message.reactions.results.length) {\n return;\n } else {\n this.appendReactionsElementToBubble(bubble, message, message, changedResults);\n }\n });\n\n if(scrollSaver) {\n scrollSaver.restore();\n }\n });\n }\n\n !DO_NOT_UPDATE_MESSAGE_REPLY && this.listenerSetter.add(rootScope)('messages_downloaded', async({peerId, mids}) => {\n const middleware = this.getMiddleware();\n await getHeavyAnimationPromise();\n if(!middleware()) return;\n\n (mids as number[]).forEach((mid) => {\n const needUpdate = this.needUpdate;\n const filtered: typeof needUpdate[0][] = [];\n forEachReverse(this.needUpdate, (obj, idx) => {\n if(obj.replyMid === mid && obj.replyToPeerId === peerId) {\n this.needUpdate.splice(idx, 1)[0];\n filtered.push(obj);\n }\n });\n\n filtered.forEach(async({mid, replyMid, replyToPeerId}) => {\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n const message = (await this.chat.getMessage(mid)) as Message.message;\n\n MessageRender.setReply({\n chat: this.chat,\n bubble,\n message\n });\n });\n });\n });\n\n attachStickerViewerListeners({\n listenTo: this.scrollable.container,\n listenerSetter: this.listenerSetter,\n findTarget: (e) => {\n const target = e.target as HTMLElement;\n const found = target.closest('.attachment.media-sticker-wrapper') || (findUpClassName(target, 'attachment') && target.closest('.custom-emoji'));\n return found as HTMLElement;\n }\n });\n attachClickEvent(this.scrollable.container, this.onBubblesClick, {listenerSetter: this.listenerSetter});\n // this.listenerSetter.add(this.bubblesContainer)('click', this.onBubblesClick/* , {capture: true, passive: false} */);\n\n this.listenerSetter.add(this.scrollable.container)('mousedown', (e) => {\n if(e.button !== 0) return;\n\n const code: HTMLElement = findUpTag(e.target, 'CODE');\n if(code) {\n cancelEvent(e);\n copyFromElement(code);\n\n const onClick = (e: MouseEvent) => {\n cancelEvent(e);\n toastNew({\n langPackKey: 'TextCopied',\n onClose: () => {\n detach();\n }\n });\n };\n\n const detach = attachClickEvent(window, onClick, {listenerSetter: this.listenerSetter, once: true, capture: true});\n return;\n }\n });\n\n /* if(false) */this.stickyIntersector = new StickyIntersector(this.scrollable.container, (stuck, target) => {\n for(const timestamp in this.dateMessages) {\n const dateMessage = this.dateMessages[timestamp];\n if(dateMessage.container === target) {\n const dateBubble = dateMessage.div;\n\n // dateMessage.container.classList.add('has-sticky-dates');\n\n // SetTransition(dateBubble, 'kek', stuck, this.previousStickyDate ? 300 : 0);\n // if(this.previousStickyDate) {\n // dateBubble.classList.add('kek');\n // }\n\n dateBubble.classList.toggle('is-sticky', stuck);\n if(stuck) {\n this.previousStickyDate = dateBubble;\n }\n\n break;\n }\n }\n\n if(this.previousStickyDate) {\n // fastRaf(() => {\n // this.bubblesContainer.classList.add('has-sticky-dates');\n // });\n }\n });\n\n if(!IS_SAFARI) {\n this.sliceViewportDebounced = debounce(this.sliceViewport.bind(this), 3000, false, true);\n }\n\n let middleware: ReturnType;\n useHeavyAnimationCheck(() => {\n this.isHeavyAnimationInProgress = true;\n this.lazyLoadQueue.lock();\n middleware = this.getMiddleware();\n\n // if(this.sliceViewportDebounced) {\n // this.sliceViewportDebounced.clearTimeout();\n // }\n }, () => {\n this.isHeavyAnimationInProgress = false;\n\n if(middleware?.()) {\n this.lazyLoadQueue.unlockAndRefresh();\n\n // if(this.sliceViewportDebounced) {\n // this.sliceViewportDebounced();\n // }\n }\n\n middleware = null;\n }, this.listenerSetter);\n }\n\n private constructBubbles() {\n const container = this.container = document.createElement('div');\n container.classList.add('bubbles', 'scrolled-down');\n\n const chatInner = this.chatInner = document.createElement('div');\n chatInner.classList.add('bubbles-inner');\n\n this.setScroll();\n\n container.append(this.scrollable.container);\n }\n\n public attachContainerListeners() {\n const container = this.container;\n\n this.chat.contextMenu.attachTo(container);\n this.chat.selection.attachListeners(container, new ListenerSetter());\n\n if(DEBUG) {\n this.listenerSetter.add(container)('dblclick', async(e) => {\n const bubble = findUpClassName(e.target, 'grouped-item') || findUpClassName(e.target, 'bubble');\n if(bubble) {\n const mid = +bubble.dataset.mid\n this.log('debug message:', await this.chat.getMessage(mid));\n this.highlightBubble(bubble);\n }\n });\n }\n\n if(!IS_MOBILE) {\n this.listenerSetter.add(container)('dblclick', async(e) => {\n if(this.chat.type === 'pinned' ||\n this.chat.selection.isSelecting ||\n !(await this.chat.canSend())) {\n return;\n }\n\n const target = e.target as HTMLElement;\n const bubble = target.classList.contains('bubble') ?\n target :\n (target.classList.contains('document-selection') ? target.parentElement : null);\n if(bubble && !bubble.classList.contains('bubble-first')) {\n const mid = +bubble.dataset.mid;\n const message = await this.chat.getMessage(mid);\n if(message.pFlags.is_outgoing) {\n return;\n }\n\n this.chat.input.initMessageReply(mid);\n }\n });\n } else if(IS_TOUCH_SUPPORTED) {\n const className = 'is-gesturing-reply';\n const MAX = 64;\n const replyAfter = MAX * .75;\n let shouldReply = false;\n let target: HTMLElement;\n let icon: HTMLElement;\n handleHorizontalSwipe({\n element: container,\n verifyTouchTarget: async(e) => {\n if(this.chat.type === 'pinned' || this.chat.selection.isSelecting || !(await this.chat.canSend())) {\n return false;\n }\n\n // cancelEvent(e);\n target = findUpClassName(e.target, 'bubble');\n if(target) {\n SetTransition({\n element: target,\n className,\n forwards: true,\n duration: 250\n });\n void target.offsetLeft; // reflow\n\n if(!icon) {\n icon = document.createElement('span');\n icon.classList.add('tgico-reply_filled', 'bubble-gesture-reply-icon');\n } else {\n icon.classList.remove('is-visible');\n icon.style.opacity = '';\n }\n\n target/* .querySelector('.bubble-content') */.append(icon);\n }\n\n return !!target;\n },\n onSwipe: (xDiff) => {\n shouldReply = xDiff >= replyAfter;\n\n if(shouldReply && !icon.classList.contains('is-visible')) {\n icon.classList.add('is-visible');\n }\n icon.style.opacity = '' + Math.min(1, xDiff / replyAfter);\n\n const x = -Math.max(0, Math.min(MAX, xDiff));\n target.style.transform = `translateX(${x}px)`;\n cancelContextMenuOpening();\n },\n onReset: () => {\n const _target = target;\n SetTransition({\n element: _target,\n className,\n forwards: false,\n duration: 250,\n onTransitionEnd: () => {\n if(icon.parentElement === _target) {\n icon.classList.remove('is-visible');\n icon.remove();\n }\n }\n });\n\n fastRaf(() => {\n _target.style.transform = ``;\n\n if(shouldReply) {\n const {mid} = _target.dataset;\n this.chat.input.initMessageReply(+mid);\n shouldReply = false;\n }\n });\n },\n listenerOptions: {capture: true}\n });\n }\n }\n\n public constructPeerHelpers() {\n // will call when message is sent (only 1)\n this.listenerSetter.add(rootScope)('history_append', async({storageKey, message}) => {\n if(storageKey !== this.chat.messagesStorageKey || this.chat.type === 'scheduled') return;\n\n if(rootScope.settings.animationsEnabled) {\n this.updateGradient = true;\n }\n\n if(!this.scrollable.loadedAll.bottom) {\n this.chat.setMessageId();\n } else {\n this.renderNewMessage(message, true);\n }\n });\n\n this.listenerSetter.add(rootScope)('history_multiappend', (message) => {\n if(this.peerId !== message.peerId || this.chat.type === 'scheduled') return;\n this.renderNewMessage(message);\n });\n\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\n if(peerId !== this.peerId || this.chat.type === 'scheduled') {\n return;\n }\n\n this.deleteMessagesByIds(Array.from(msgs));\n });\n\n this.listenerSetter.add(rootScope)('dialog_unread', ({peerId}) => {\n if(peerId === this.peerId) {\n this.chat.input.setUnreadCount();\n\n getHeavyAnimationPromise().then(() => {\n this.updateUnreadByDialog();\n });\n }\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n if(!dialogs.has(this.peerId) || this.chat.type === 'scheduled') {\n return;\n }\n\n this.chat.input.setUnreadCount();\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(this.peerId !== dialog.peerId || this.chat.type === 'scheduled') {\n return;\n }\n\n this.chat.input.setUnreadCount();\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n const {peerId} = this;\n if(peerId !== chatId.toPeerId(true)) {\n return;\n }\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n const hadRights = this.chatInner.classList.contains('has-rights');\n const hasRights = await this.chat.canSend();\n\n if(hadRights !== hasRights) {\n const callbacks = await Promise.all([\n this.finishPeerChange(),\n this.chat.input.finishPeerChange()\n ]);\n\n callbacks.forEach((callback) => callback());\n }\n\n if(!!(chat as MTChat.channel).pFlags.forum !== this.chat.isForum && this.chat.type === 'chat') {\n this.chat.peerId = 0;\n this.chat.appImManager.setPeer({peerId});\n }\n });\n\n this.listenerSetter.add(rootScope)('history_reload', (peerId) => {\n if(peerId !== this.peerId) {\n return;\n }\n\n const mids = getObjectKeysAndSort(this.bubbles, 'desc').filter((mid) => mid > 0);\n const middleware = this.getMiddleware();\n this.managers.appMessagesManager.reloadMessages(this.peerId, mids).then((messages) => {\n if(!middleware()) return;\n\n const toDelete: number[] = [];\n messages.forEach((message, idx) => {\n const mid = mids[idx];\n if(message) {\n const bubble = this.bubbles[message.mid];\n if(!bubble) return;\n\n this.safeRenderMessage(message, true, bubble);\n } else {\n toDelete.push(mid);\n }\n });\n\n this.deleteMessagesByIds(toDelete);\n\n this.setLoaded('top', false);\n this.setLoaded('bottom', false);\n this.scrollable.checkForTriggers();\n });\n });\n\n this.listenerSetter.add(rootScope)('settings_updated', async({key}) => {\n if(key === 'settings.emoji.big') {\n const middleware = this.getMiddleware();\n const mids = getObjectKeysAndSort(this.bubbles, 'desc');\n const m = mids.map(async(mid) => {\n const bubble = this.bubbles[mid];\n if(bubble.classList.contains('can-have-big-emoji')) {\n return {bubble, message: await this.chat.getMessage(mid)};\n }\n });\n\n const awaited = await Promise.all(m);\n if(!middleware()) {\n return;\n }\n\n awaited.filter(Boolean).forEach(({bubble, message}) => {\n if(this.bubbles[message.mid] !== bubble) {\n return;\n }\n\n this.safeRenderMessage(message, true, bubble);\n });\n }\n });\n\n !DO_NOT_UPDATE_MESSAGE_VIEWS && this.listenerSetter.add(rootScope)('messages_views', (arr) => {\n if(this.chat.type === 'scheduled') return;\n\n fastRaf(() => {\n let scrollSaver: ScrollSaver;\n for(const {peerId, views, mid} of arr) {\n if(this.peerId !== peerId) continue;\n\n const bubble = this.bubbles[mid];\n if(!bubble) continue;\n\n const postViewsElements = Array.from(bubble.querySelectorAll('.post-views')) as HTMLElement[];\n if(!postViewsElements.length) continue;\n\n const str = formatNumber(views, 1);\n let different = false;\n postViewsElements.forEach((postViews) => {\n if(different || postViews.textContent !== str) {\n if(!scrollSaver) {\n scrollSaver = this.createScrollSaver(true);\n scrollSaver.save();\n }\n\n different = true;\n postViews.textContent = str;\n }\n });\n }\n\n scrollSaver?.restore();\n });\n });\n\n this.observer = new SuperIntersectionObserver({root: this.scrollable.container});\n\n this.sendViewCountersDebounced = debounce(() => {\n const mids = [...this.viewsMids];\n this.viewsMids.clear();\n\n this.managers.appMessagesManager.incrementMessageViews(this.peerId, mids);\n }, 1000, false, true);\n\n // * pinned part start\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids, pinned}) => {\n if(this.chat.type !== 'pinned' || peerId !== this.peerId) {\n return;\n }\n\n if(mids) {\n if(!pinned) {\n this.deleteMessagesByIds(mids);\n }\n }\n });\n // * pinned part end\n\n // * scheduled part start\n const onUpdate = async() => {\n this.chat.topbar.setTitle((await this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size);\n };\n\n this.listenerSetter.add(rootScope)('scheduled_new', (message) => {\n if(this.chat.type !== 'scheduled' || message.peerId !== this.peerId) return;\n\n this.renderNewMessage(message);\n onUpdate();\n });\n\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\n if(this.chat.type !== 'scheduled' || peerId !== this.peerId) return;\n\n this.deleteMessagesByIds(mids);\n onUpdate();\n });\n // * scheduled part end\n }\n\n private get peerId() {\n return this.chat.peerId;\n }\n\n public get messagesQueuePromise() {\n return this.batchProcessor.queuePromise;\n }\n\n private createScrollSaver(reverse = true) {\n const scrollSaver = new ScrollSaver(this.scrollable, '.bubble:not(.is-date)', reverse);\n return scrollSaver;\n }\n\n private unreadedObserverCallback = (entry: IntersectionObserverEntry) => {\n if(entry.isIntersecting) {\n const target = entry.target as HTMLElement;\n const mid = this.unreaded.get(target as HTMLElement);\n this.onUnreadedInViewport(target, mid);\n }\n };\n\n private viewsObserverCallback = (entry: IntersectionObserverEntry) => {\n if(entry.isIntersecting) {\n const mid = +(entry.target as HTMLElement).dataset.mid;\n this.observer.unobserve(entry.target, this.viewsObserverCallback);\n\n if(mid) {\n this.viewsMids.add(mid);\n this.sendViewCountersDebounced();\n } else {\n const {sponsoredMessage} = this;\n const randomId = sponsoredMessage?.random_id;\n if(randomId) {\n this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(), randomId);\n delete sponsoredMessage.random_id;\n }\n }\n }\n };\n\n private stickerEffectObserverCallback = (entry: IntersectionObserverEntry) => {\n if(entry.isIntersecting) {\n this.observer.unobserve(entry.target, this.stickerEffectObserverCallback);\n\n const attachmentDiv: HTMLElement = entry.target.querySelector('.attachment');\n getHeavyAnimationPromise().then(() => {\n if(isInDOM(attachmentDiv)) {\n simulateClickEvent(attachmentDiv);\n }\n });\n }\n };\n\n private createResizeObserver() {\n if(!('ResizeObserver' in window) || this.resizeObserver) {\n return;\n }\n\n const container = this.scrollable.container;\n let wasHeight = 0/* container.offsetHeight */;\n let resizing = false;\n let skip = false;\n let scrolled = 0;\n let part = 0;\n let rAF = 0;\n // let skipNext = true;\n\n const onResizeEnd = () => {\n const height = container.offsetHeight;\n const isScrolledDown = this.scrollable.isScrolledDown;\n if(height !== wasHeight && (!skip || !isScrolledDown)) { // * fix opening keyboard while ESG is active, offsetHeight will change right between 'start' and this first frame\n part += wasHeight - height;\n }\n\n /* if(DEBUG) {\n this.log('resize end', scrolled, part, this.scrollable.scrollTop, height, wasHeight, this.scrollable.isScrolledDown);\n } */\n\n if(part) {\n this.scrollable.setScrollTopSilently(this.scrollable.scrollTop + Math.round(part));\n }\n\n wasHeight = height;\n scrolled = 0;\n rAF = 0;\n part = 0;\n resizing = false;\n skip = false;\n };\n\n const setEndRAF = (single: boolean) => {\n if(rAF) window.cancelAnimationFrame(rAF);\n rAF = window.requestAnimationFrame(single ? onResizeEnd : () => {\n rAF = window.requestAnimationFrame(onResizeEnd);\n // this.log('resize after RAF', part);\n });\n };\n\n const processEntries: ResizeObserverCallback = (entries) => {\n /* if(skipNext) {\n skipNext = false;\n return;\n } */\n\n if(skip) {\n setEndRAF(false);\n return;\n }\n\n const entry = entries[0];\n const height = entry.contentRect.height;/* Math.ceil(entry.contentRect.height); */\n\n if(!wasHeight) {\n wasHeight = height;\n return;\n }\n\n const realDiff = wasHeight - height;\n let diff = realDiff + part;\n const _part = diff % 1;\n diff -= _part;\n\n if(!resizing) {\n resizing = true;\n\n /* if(DEBUG) {\n this.log('resize start', realDiff, this.scrollable.scrollTop, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown);\n } */\n\n if(realDiff < 0 && this.scrollable.isScrolledDown) {\n // if(isSafari) { // * fix opening keyboard while ESG is active\n part = -realDiff;\n // }\n\n skip = true;\n setEndRAF(false);\n return;\n }\n }\n\n scrolled += diff;\n\n /* if(DEBUG) {\n this.log('resize', wasHeight - height, diff, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown, height, wasHeight);\n } */\n\n if(diff) {\n const needScrollTop = this.scrollable.scrollTop + diff;\n this.scrollable.setScrollTopSilently(needScrollTop);\n }\n\n setEndRAF(false);\n\n part = _part;\n wasHeight = height;\n };\n\n const resizeObserver = this.resizeObserver = new ResizeObserver(processEntries);\n resizeObserver.observe(container);\n }\n\n private destroyResizeObserver() {\n const resizeObserver = this.resizeObserver;\n if(!resizeObserver) {\n return;\n }\n\n resizeObserver.disconnect();\n this.resizeObserver = undefined;\n }\n\n private onBubblesMouseMove = async(e: MouseEvent) => {\n const content = findUpClassName(e.target, 'bubble-content');\n if(\n this.chat.type !== 'scheduled' &&\n content &&\n !this.chat.selection.isSelecting &&\n !findUpClassName(e.target, 'service') &&\n !findUpClassName(e.target, 'bubble-beside-button')\n ) {\n const bubble = findUpClassName(content, 'bubble');\n if(!this.chat.selection.canSelectBubble(bubble)) {\n this.unhoverPrevious();\n return;\n }\n\n let {hoverBubble, hoverReaction} = this;\n if(bubble === hoverBubble) {\n return;\n }\n\n this.unhoverPrevious();\n\n hoverBubble = this.hoverBubble = bubble;\n hoverReaction = this.hoverReaction;\n // hoverReaction = contentWrapper.querySelector('.bubble-hover-reaction');\n if(!hoverReaction) {\n hoverReaction = this.hoverReaction = document.createElement('div');\n hoverReaction.classList.add('bubble-hover-reaction');\n\n const stickerWrapper = document.createElement('div');\n stickerWrapper.classList.add('bubble-hover-reaction-sticker');\n hoverReaction.append(stickerWrapper);\n\n content.append(hoverReaction);\n\n let message = await this.chat.getMessage(+bubble.dataset.mid);\n if(message?._ !== 'message') {\n this.unhoverPrevious();\n return;\n }\n\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\n\n const middleware = this.getMiddleware(() => this.hoverReaction === hoverReaction);\n Promise.all([\n this.managers.appReactionsManager.getAvailableReactionsByMessage(message),\n pause(400)\n ]).then(([availableReactions]) => {\n const availableReaction = availableReactions[0];\n if(!availableReaction) {\n hoverReaction.remove();\n return;\n }\n\n wrapSticker({\n div: stickerWrapper,\n doc: availableReaction.select_animation,\n width: 18,\n height: 18,\n needUpscale: true,\n middleware,\n group: this.chat.animationGroup,\n withThumb: false,\n needFadeIn: false\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n player.addEventListener('firstFrame', () => {\n if(!middleware()) {\n // debugger;\n return;\n }\n\n hoverReaction.dataset.loaded = '1';\n this.setHoverVisible(hoverReaction, true);\n }, {once: true});\n\n attachClickEvent(hoverReaction, (e) => {\n cancelEvent(e); // cancel triggering selection\n\n this.managers.appReactionsManager.sendReaction(message as Message.message, availableReaction);\n this.unhoverPrevious();\n }, {listenerSetter: this.listenerSetter});\n }, noop);\n });\n } else if(hoverReaction.dataset.loaded) {\n this.setHoverVisible(hoverReaction, true);\n }\n } else {\n this.unhoverPrevious();\n }\n };\n\n public setReactionsHoverListeners() {\n this.listenerSetter.add(contextMenuController)('toggle', this.unhoverPrevious);\n this.listenerSetter.add(overlayCounter)('change', this.unhoverPrevious);\n this.listenerSetter.add(this.chat.selection)('toggle', this.unhoverPrevious);\n this.listenerSetter.add(this.container)('mousemove', this.onBubblesMouseMove);\n }\n\n private setHoverVisible(hoverReaction: HTMLElement, visible: boolean) {\n if(hoverReaction.parentElement) {\n hoverReaction.parentElement.classList.toggle('hover-reaction-visible', visible);\n }\n\n SetTransition({\n element: hoverReaction,\n className: 'is-visible',\n forwards: visible,\n duration: 200,\n onTransitionEnd: visible ? undefined : () => {\n hoverReaction.remove();\n },\n useRafs: 2\n });\n }\n\n private unhoverPrevious = () => {\n const {hoverBubble, hoverReaction} = this;\n if(hoverBubble) {\n this.setHoverVisible(hoverReaction, false);\n this.hoverBubble = undefined;\n this.hoverReaction = undefined;\n }\n };\n\n public setStickyDateManually() {\n return;\n\n const timestamps = Object.keys(this.dateMessages).map((k) => +k).sort((a, b) => b - a);\n let lastVisible: HTMLElement;\n\n // if(this.chatInner.classList.contains('is-scrolling')) {\n const {scrollTop} = this.scrollable.container;\n const isOverflown = scrollTop > 0;\n if(isOverflown) {\n for(const timestamp of timestamps) {\n const dateMessage = this.dateMessages[timestamp];\n const visibleRect = getVisibleRect(dateMessage.container, this.scrollable.container);\n if(visibleRect && visibleRect.overflow.top) {\n lastVisible = dateMessage.div;\n } else if(lastVisible) {\n break;\n }\n }\n }\n // }\n\n if(lastVisible === this.previousStickyDate) {\n return;\n }\n\n if(lastVisible) {\n const needReflow = /* !!this.chat.setPeerPromise || */!this.previousStickyDate;\n if(needReflow) {\n lastVisible.classList.add('no-transition');\n }\n\n lastVisible.classList.add('is-sticky');\n\n if(needReflow) {\n void lastVisible.offsetLeft; // reflow\n lastVisible.classList.remove('no-transition');\n }\n }\n\n if(this.previousStickyDate && this.previousStickyDate !== lastVisible) {\n this.previousStickyDate.classList.remove('is-sticky');\n }\n\n this.previousStickyDate = lastVisible;\n }\n\n public getRenderedLength() {\n return Object.keys(this.bubbles).length - this.skippedMids.size;\n }\n\n private onUnreadedInViewport(target: HTMLElement, mid: number) {\n this.unreadedSeen.add(mid);\n this.observer.unobserve(target, this.unreadedObserverCallback);\n this.unreaded.delete(target);\n this.readUnreaded();\n }\n\n private readUnreaded() {\n if(this.readPromise) return;\n\n const middleware = this.getMiddleware();\n this.readPromise = idleController.getFocusPromise().then(async() => {\n if(!middleware()) return;\n let maxId = Math.max(...Array.from(this.unreadedSeen));\n\n // ? if message with maxId is not rendered ?\n if(this.scrollable.loadedAll.bottom) {\n const bubblesMaxId = Math.max(...Object.keys(this.bubbles).map((i) => +i));\n if(maxId >= bubblesMaxId) {\n maxId = Math.max((await this.chat.getHistoryMaxId()) || 0, maxId);\n }\n }\n\n this.unreaded.forEach((mid, target) => {\n if(mid <= maxId) {\n this.onUnreadedInViewport(target, mid);\n }\n });\n\n const readContents: number[] = [];\n for(const mid of this.unreadedSeen) {\n const message: MyMessage = await this.chat.getMessage(mid);\n if(isMentionUnread(message)) {\n readContents.push(mid);\n }\n }\n\n this.managers.appMessagesManager.readMessages(this.peerId, readContents);\n\n this.unreadedSeen.clear();\n\n if(DEBUG) {\n this.log('will readHistory by maxId:', maxId);\n }\n\n // return;\n\n return this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId).catch((err: any) => {\n this.log.error('readHistory err:', err);\n this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId);\n }).finally(() => {\n if(!middleware()) return;\n this.readPromise = undefined;\n\n if(this.unreadedSeen.size) {\n this.readUnreaded();\n }\n });\n });\n }\n\n public onBubblesClick = async(e: Event) => {\n let target = e.target as HTMLElement;\n let bubble: HTMLElement = null;\n try {\n bubble = findUpClassName(target, 'bubble');\n } catch(err) {}\n\n if(!bubble && !this.chat.selection.isSelecting) {\n const avatar = findUpClassName(target, 'user-avatar');\n if(!avatar) {\n return;\n }\n\n const peerId = avatar.dataset.peerId.toPeerId();\n if(peerId !== NULL_PEER_ID) {\n this.chat.appImManager.setInnerPeer({peerId});\n } else {\n toast(I18n.format('HidAccount', true));\n }\n return;\n }\n\n if(bubble.classList.contains('is-date') && findUpClassName(target, 'bubble-content')) {\n if(bubble.classList.contains('is-fake')) {\n bubble = bubble.previousElementSibling as HTMLElement;\n }\n\n if(bubble.classList.contains('is-sticky') && !this.chatInner.classList.contains('is-scrolling')) {\n return;\n }\n\n for(const timestamp in this.dateMessages) {\n const d = this.dateMessages[timestamp];\n if(d.div === bubble) {\n PopupElement.createPopup(PopupDatePicker, new Date(+timestamp), this.onDatePick).show();\n break;\n }\n }\n\n return;\n }\n\n if(!IS_TOUCH_SUPPORTED && findUpClassName(target, 'time')) {\n this.chat.selection.toggleByElement(bubble);\n return;\n }\n\n // ! Trusted - due to audio autoclick\n if(this.chat.selection.isSelecting && e.isTrusted) {\n if(bubble.classList.contains('service') && bubble.dataset.mid === undefined) {\n return;\n }\n\n cancelEvent(e);\n // console.log('bubble click', e);\n\n if(IS_TOUCH_SUPPORTED && this.chat.selection.selectedText) {\n this.chat.selection.selectedText = undefined;\n return;\n }\n\n // this.chatSelection.toggleByBubble(bubble);\n this.chat.selection.toggleByElement(findUpClassName(target, 'grouped-item') || bubble);\n return;\n }\n\n const mediaSpoiler: HTMLElement = findUpClassName(target, 'media-spoiler-container');\n if(mediaSpoiler) {\n onMediaSpoilerClick({\n event: e,\n mediaSpoiler\n });\n return;\n }\n\n const contactDiv: HTMLElement = findUpClassName(target, 'contact');\n if(contactDiv) {\n this.chat.appImManager.setInnerPeer({\n peerId: contactDiv.dataset.peerId.toPeerId()\n });\n return;\n }\n\n const callDiv: HTMLElement = findUpClassName(target, 'bubble-call');\n if(callDiv) {\n this.chat.appImManager.callUser(this.peerId.toUserId(), callDiv.dataset.type as any);\n return;\n }\n\n const buyButton: HTMLElement = findUpClassName(target, 'is-buy');\n if(buyButton) {\n cancelEvent(e);\n\n const message = await this.chat.getMessage(+bubble.dataset.mid);\n if(!message) {\n return;\n }\n\n new PopupPayment(\n message as Message.message,\n await this.managers.appPaymentsManager.getInputInvoiceByPeerId(message.peerId, message.mid)\n );\n return;\n }\n\n const reactionElement = findUpTag(target, 'REACTION-ELEMENT') as ReactionElement;\n if(reactionElement) {\n cancelEvent(e);\n if(reactionElement.classList.contains('is-inactive')) {\n return;\n }\n\n const reactionsElement = reactionElement.parentElement as ReactionsElement;\n const reactionCount = reactionsElement.getReactionCount(reactionElement);\n\n const message = reactionsElement.getMessage();\n this.managers.appReactionsManager.sendReaction(message, reactionCount.reaction);\n\n return;\n }\n\n const stickerEmojiEl = findUpAttribute(target, 'data-sticker-emoji');\n if(stickerEmojiEl && stickerEmojiEl.parentElement.querySelectorAll('[data-sticker-emoji]').length === 1 && bubble.classList.contains('emoji-big')) {\n onEmojiStickerClick({\n event: e,\n container: stickerEmojiEl,\n managers: this.managers,\n middleware: this.getMiddleware(),\n peerId: this.peerId\n });\n\n return;\n }\n\n const commentsDiv: HTMLElement = findUpClassName(target, 'replies');\n if(commentsDiv) {\n const bubbleMid = +bubble.dataset.mid;\n if(this.peerId === REPLIES_PEER_ID) {\n const message = await this.chat.getMessage(bubbleMid) as Message.message;\n const peerId = getPeerId(message.reply_to.reply_to_peer_id);\n const threadId = message.reply_to.reply_to_top_id;\n const lastMsgId = message.fwd_from.saved_from_msg_id;\n this.chat.appImManager.openThread({\n peerId,\n lastMsgId,\n threadId\n });\n } else {\n const message1 = await this.chat.getMessage(bubbleMid);\n const message = await this.managers.appMessagesManager.getMessageWithReplies(message1 as Message.message);\n const replies = message.replies;\n if(replies) {\n this.managers.appMessagesManager.getDiscussionMessage(this.peerId, message.mid).then((message) => {\n this.chat.appImManager.setInnerPeer({\n peerId: replies.channel_id.toPeerId(true),\n type: 'discussion',\n threadId: (message as MyMessage).mid\n });\n });\n }\n }\n\n return;\n }\n\n const via = findUpClassName(target, 'is-via');\n if(via) {\n const el = via.querySelector('.peer-title') as HTMLElement;\n if(target === el || findUpAsChild(target, el)) {\n const message = el.innerText + ' ';\n this.managers.appDraftsManager.setDraft(this.peerId, this.chat.threadId, message);\n cancelEvent(e);\n\n return;\n }\n }\n\n const nameDiv = findUpClassName(target, 'peer-title') || findUpTag(target, 'AVATAR-ELEMENT') || findUpAttribute(target, 'data-saved-from');\n if(nameDiv && nameDiv !== bubble) {\n target = nameDiv || target;\n const peerIdStr = target.dataset.peerId || target.getAttribute('peer') || (target as AvatarElement).peerId;\n const savedFrom = target.dataset.savedFrom;\n if(typeof(peerIdStr) === 'string' || savedFrom) {\n if(savedFrom) {\n const [peerId, mid] = savedFrom.split('_');\n if(target.classList.contains('is-receipt-link')) {\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId.toPeerId(), +mid);\n if(message) {\n const inputInvoice = await this.managers.appPaymentsManager.getInputInvoiceByPeerId(this.peerId, +bubble.dataset.mid);\n new PopupPayment(message as Message.message, inputInvoice, undefined, true);\n }\n } else {\n this.chat.appImManager.setInnerPeer({\n peerId: peerId.toPeerId(),\n lastMsgId: +mid\n });\n }\n } else {\n const peerId = peerIdStr.toPeerId();\n if(peerId !== NULL_PEER_ID) {\n this.chat.appImManager.setInnerPeer({peerId});\n } else {\n toast(I18n.format('HidAccount', true));\n }\n }\n }\n\n return;\n }\n\n // this.log('chatInner click:', target);\n // const isVideoComponentElement = target.tagName === 'SPAN' && findUpClassName(target, 'media-container');\n /* if(isVideoComponentElement) {\n const video = target.parentElement.querySelector('video') as HTMLElement;\n if(video) {\n video.click(); // hot-fix for time and play button\n return;\n }\n } */\n\n if(bubble.classList.contains('sticker') && target.parentElement.classList.contains('attachment')) {\n const messageId = +bubble.dataset.mid;\n const message = await this.chat.getMessage(messageId);\n\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as Document.document;\n\n if(doc?.stickerSetInput) {\n new PopupStickers(doc.stickerSetInput).show();\n }\n\n return;\n }\n\n const documentDiv = findUpClassName(target, 'document-with-thumb');\n if((target.tagName === 'IMG' && !target.classList.contains('emoji') && !target.classList.contains('document-thumb')) ||\n target.classList.contains('album-item') ||\n // || isVideoComponentElement\n (target.tagName === 'VIDEO' && !bubble.classList.contains('round')) ||\n (documentDiv && !documentDiv.querySelector('.preloader-container')) ||\n target.classList.contains('canvas-thumbnail')) {\n const groupedItem = findUpClassName(target, 'album-item') || findUpClassName(target, 'document-container');\n const preloader = (groupedItem || bubble).querySelector('.preloader-container');\n if(preloader) {\n simulateClickEvent(preloader);\n cancelEvent(e);\n return;\n }\n\n cancelEvent(e);\n const messageId = +(groupedItem || bubble).dataset.mid;\n const message = await this.chat.getMessage(messageId);\n if(!message) {\n this.log.warn('no message by messageId:', messageId);\n return;\n }\n\n const SINGLE_MEDIA_CLASSNAME = 'webpage';\n const isSingleMedia = bubble.classList.contains(SINGLE_MEDIA_CLASSNAME);\n\n const f = documentDiv ? (media: any) => {\n return AppMediaViewer.isMediaCompatibleForDocumentViewer(media);\n } : (media: any) => {\n return media._ === 'photo' || ['video', 'gif'].includes(media.type);\n };\n\n const targets: {element: HTMLElement, mid: number, peerId: PeerId}[] = [];\n const ids = isSingleMedia ? [messageId] : (await Promise.all(Object.keys(this.bubbles).map((k) => +k).map(async(mid) => {\n /* if(isSingleMedia && !this.bubbles[id].classList.contains(SINGLE_MEDIA_CLASSNAME)) {\n return false;\n } */\n // if(!this.scrollable.visibleElements.find((e) => e.element === this.bubbles[id])) return false;\n\n const message = await this.chat.getMessage(mid);\n const media = getMediaFromMessage(message);\n\n return media && f(media) && mid;\n }))).filter(Boolean).sort((a, b) => a - b);\n\n ids.forEach((id) => {\n let selector: string;\n if(documentDiv) {\n selector = '.document-container';\n } else {\n const withTail = this.bubbles[id].classList.contains('with-media-tail');\n selector = '.album-item video, .album-item img, .preview video, .preview img, ';\n if(withTail) {\n selector += '.bubble__media-container';\n } else {\n selector += '.attachment video, .attachment img';\n }\n }\n\n const elements = Array.from(this.bubbles[id].querySelectorAll(selector)) as HTMLElement[];\n const parents: Set = new Set();\n if(documentDiv) {\n elements.forEach((element) => {\n targets.push({\n element: element.querySelector('.document-ico'),\n mid: +element.dataset.mid,\n peerId: this.peerId\n });\n });\n } else {\n const hasAspecter = !!this.bubbles[id].querySelector('.media-container-aspecter');\n elements.forEach((element) => {\n if(hasAspecter && !findUpClassName(element, 'media-container-aspecter')) return;\n const albumItem = findUpClassName(element, 'album-item');\n const parent = albumItem || element.parentElement;\n if(parents.has(parent)) return;\n parents.add(parent);\n targets.push({\n element,\n mid: albumItem ? +albumItem.dataset.mid : id,\n peerId: this.peerId\n });\n });\n }\n });\n\n targets.sort((a, b) => a.mid - b.mid);\n\n const idx = targets.findIndex((t) => t.mid === messageId);\n\n if(DEBUG) {\n this.log('open mediaViewer single with ids:', ids, idx, targets);\n }\n\n if(!targets[idx]) {\n this.log('no target for media viewer!', target);\n return;\n }\n\n new AppMediaViewer()\n .setSearchContext({\n threadId: this.chat.threadId,\n peerId: this.peerId,\n inputFilter: {_: documentDiv ? 'inputMessagesFilterDocument' : 'inputMessagesFilterPhotoVideo'},\n useSearch: this.chat.type !== 'scheduled' && !isSingleMedia,\n isScheduled: this.chat.type === 'scheduled'\n })\n .openMedia(message, targets[idx].element, 0, true, targets.slice(0, idx), targets.slice(idx + 1));\n\n // appMediaViewer.openMedia(message, target as HTMLImageElement);\n return;\n }\n\n if(['IMG', 'DIV', 'SPAN'/* , 'A' */].indexOf(target.tagName) === -1) target = findUpTag(target, 'DIV');\n\n if(['DIV', 'SPAN'].indexOf(target.tagName) !== -1/* || target.tagName === 'A' */) {\n if(target.classList.contains('goto-original')) {\n const savedFrom = bubble.dataset.savedFrom;\n const [peerId, mid] = savedFrom.split('_');\n // //this.log('savedFrom', peerId, msgID);\n this.chat.appImManager.setInnerPeer({\n peerId: peerId.toPeerId(),\n lastMsgId: +mid\n });\n return;\n } else if(target.classList.contains('forward')) {\n const mid = +bubble.dataset.mid;\n const message = await this.managers.appMessagesManager.getMessageByPeer(this.peerId, mid);\n new PopupForward({\n [this.peerId]: await this.managers.appMessagesManager.getMidsByMessage(message)\n });\n // appSidebarRight.forwardTab.open([mid]);\n return;\n }\n\n let isReplyClick = false;\n\n try {\n isReplyClick = !!findUpClassName(e.target, 'reply');\n } catch(err) {}\n\n if(isReplyClick && bubble.classList.contains('is-reply')/* || bubble.classList.contains('forwarded') */) {\n const bubbleMid = +bubble.dataset.mid;\n this.followStack.push(bubbleMid);\n\n const message = (await this.chat.getMessage(bubbleMid)) as Message.message;\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : this.peerId;\n const replyToMid = message.reply_to.reply_to_msg_id;\n\n this.chat.appImManager.setInnerPeer({\n peerId: replyToPeerId,\n lastMsgId: replyToMid,\n type: this.chat.type,\n threadId: this.chat.threadId\n });\n\n /* if(this.chat.type === 'discussion') {\n this.chat.appImManager.setMessageId(, originalMessageId);\n } else {\n this.chat.appImManager.setInnerPeer(this.peerId, originalMessageId);\n } */\n // this.chat.setMessageId(, originalMessageId);\n }\n }\n\n // console.log('chatInner click', e);\n };\n\n public async onGoDownClick() {\n if(!this.followStack.length) {\n // this.onScroll(true, undefined, true);\n this.chat.setMessageId(/* , dialog.top_message */);\n // const dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\n\n // if(dialog) {\n // this.chat.setPeer(this.peerId/* , dialog.top_message */);\n // } else {\n // this.log('will scroll down 3');\n // this.scroll.scrollTop = this.scroll.scrollHeight;\n // }\n\n return;\n }\n\n const middleware = this.getMiddleware();\n const slice = this.followStack.slice();\n const messages = await Promise.all(slice.map((mid) => this.chat.getMessage(mid)));\n if(!middleware()) return;\n\n slice.forEach((mid, idx) => {\n const message = messages[idx];\n\n const bubble = this.bubbles[mid];\n let bad = true;\n if(bubble) {\n const rect = bubble.getBoundingClientRect();\n bad = (windowSize.height / 2) > rect.top;\n } else if(message) {\n bad = false;\n }\n\n if(bad) {\n this.followStack.splice(this.followStack.indexOf(mid), 1);\n }\n });\n\n this.followStack.sort((a, b) => b - a);\n\n const mid = this.followStack.pop();\n this.chat.setMessageId(mid);\n }\n\n public getBubbleByPoint(verticalSide: 'top' | 'bottom') {\n let element = getElementByPoint(this.scrollable.container, verticalSide, 'center');\n /* if(element) {\n if(element.classList.contains('bubbles-date-group')) {\n const children = Array.from(element.children) as HTMLElement[];\n if(verticalSide === 'top') {\n element = children[this.stickyIntersector ? 2 : 1];\n } else {\n element = children[children.length - 1];\n }\n } else {\n element = findUpClassName(element, 'bubble');\n if(element && element.classList.contains('is-date')) {\n element = element.nextElementSibling as HTMLElement;\n }\n }\n } */\n if(element) element = findUpClassName(element, 'bubble');\n\n return element;\n }\n\n public async getGroupedBubble(groupId: string) {\n const mids = await this.managers.appMessagesManager.getMidsByAlbum(groupId);\n for(const mid of mids) {\n if(this.bubbles[mid] && !this.skippedMids.has(mid)) {\n // const maxId = Math.max(...mids); // * because in scheduled album can be rendered by lowest mid during sending\n return {\n bubble: this.bubbles[mid],\n mid: mid\n // message: await this.chat.getMessage(maxId) as Message.message\n };\n }\n }\n }\n\n public getBubbleGroupedItems(bubble: HTMLElement) {\n return Array.from(bubble.querySelectorAll('.grouped-item')) as HTMLElement[];\n }\n\n public async getMountedBubble(mid: number, message?: Message.message | Message.messageService) {\n if(message === undefined) {\n message = await this.chat.getMessage(mid);\n }\n\n if(!message) {\n return;\n }\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const a = await this.getGroupedBubble(groupedId);\n if(a) {\n a.bubble = a.bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || a.bubble;\n return a;\n }\n }\n\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n return {bubble, mid};\n }\n\n private findNextMountedBubbleByMsgId(mid: number, prev?: boolean) {\n const mids = getObjectKeysAndSort(this.bubbles, prev ? 'desc' : 'asc');\n\n let filterCallback: (_mid: number) => boolean;\n if(prev) filterCallback = (_mid) => _mid < mid;\n else filterCallback = (_mid) => mid < _mid;\n\n const foundMid = mids.find((_mid) => {\n if(!filterCallback(_mid)) return false;\n return !!this.bubbles[_mid]?.parentElement;\n });\n\n return this.bubbles[foundMid];\n }\n\n public loadMoreHistory(top: boolean, justLoad = false) {\n // this.log('loadMoreHistory', top);\n if(\n !this.peerId ||\n /* TEST_SCROLL || */\n this.chat.setPeerPromise ||\n this.isHeavyAnimationInProgress ||\n (top && (this.getHistoryTopPromise || this.scrollable.loadedAll.top)) ||\n (!top && (this.getHistoryBottomPromise || this.scrollable.loadedAll.bottom))\n ) {\n return;\n }\n\n // warning, если иды только отрицательные то вниз не попадёт (хотя мб и так не попадёт)\n // some messages can have negative id (such as sponsored message)\n const history = Object.keys(this.bubbles)\n .map((id) => +id)\n .filter((id) => id > 0 && !this.skippedMids.has(id))\n .sort((a, b) => a - b);\n\n if(!history.length) {\n history.push(0);\n }\n\n if(top) {\n if(DEBUG) {\n this.log('Will load more (up) history by id:', history[0], 'maxId:', history[history.length - 1], justLoad/* , history */);\n }\n\n this.getHistory1(history[0], true, undefined, undefined, justLoad);\n } else {\n // let dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\n // const historyMaxId = await this.chat.getHistoryMaxId();\n\n // // if scroll down after search\n // if(history.indexOf(historyMaxId) !== -1) {\n // this.setLoaded('bottom', true);\n // return;\n // }\n\n if(DEBUG) {\n this.log('Will load more (down) history by id:', history[history.length - 1], justLoad/* , history */);\n }\n\n this.getHistory1(history[history.length - 1], false, true, undefined, justLoad);\n }\n }\n\n public onScroll = (ignoreHeavyAnimation?: boolean, scrollDimensions?: ScrollStartCallbackDimensions, forceDown?: boolean) => {\n // return;\n\n if(this.isHeavyAnimationInProgress) {\n this.sliceViewportDebounced?.clearTimeout();\n\n // * В таком случае, кнопка не будет моргать если чат в самом низу, и правильно отработает случай написания нового сообщения и проскролла вниз\n if(this.scrolledDown && !ignoreHeavyAnimation) {\n return;\n }\n } else {\n this.chat.topbar.pinnedMessage?.setCorrectIndexThrottled(this.scrollable.lastScrollDirection);\n this.sliceViewportDebounced?.();\n this.setStickyDateManually();\n }\n\n // lottieLoader.checkAnimations(false, 'chat');\n\n if(scrollDimensions && scrollDimensions.distanceToEnd < SCROLLED_DOWN_THRESHOLD && this.scrolledDown) {\n return;\n }\n\n const distanceToEnd = forceDown ? 0 : scrollDimensions?.distanceToEnd ?? this.scrollable.getDistanceToEnd();\n if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 && distanceToEnd > 0) || scrollDimensions || forceDown) {\n // if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 || scrollDimensions) && distanceToEnd > 0) {\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\n this.chatInner.classList.add('is-scrolling');\n }\n\n this.isScrollingTimeout = window.setTimeout(() => {\n this.chatInner.classList.remove('is-scrolling');\n this.isScrollingTimeout = 0;\n }, 1350 + (scrollDimensions?.duration ?? 0));\n }\n\n if(distanceToEnd < SCROLLED_DOWN_THRESHOLD && (forceDown || this.scrollable.loadedAll.bottom || this.chat.setPeerPromise || !this.peerId)) {\n this.container.classList.add('scrolled-down');\n this.scrolledDown = true;\n } else if(this.container.classList.contains('scrolled-down')) {\n this.container.classList.remove('scrolled-down');\n this.scrolledDown = false;\n }\n };\n\n public setScroll() {\n if(this.scrollable) {\n this.destroyScrollable();\n }\n\n this.scrollable = new Scrollable(null, 'IM', /* 10300 */300);\n this.setLoaded('top', false, false);\n this.setLoaded('bottom', false, false);\n\n this.scrollable.container.append(this.chatInner);\n\n /* const getScrollOffset = () => {\n //return Math.round(Math.max(300, appPhotosManager.windowH / 1.5));\n return 300;\n };\n\n window.addEventListener('resize', () => {\n this.scrollable.onScrollOffset = getScrollOffset();\n });\n\n this.scrollable = new Scrollable(this.bubblesContainer, 'y', 'IM', this.chatInner, getScrollOffset()); */\n\n this.scrollable.onAdditionalScroll = this.onScroll;\n this.scrollable.onScrolledTop = () => this.loadMoreHistory(true);\n this.scrollable.onScrolledBottom = () => this.loadMoreHistory(false);\n // this.scrollable.attachSentinels(undefined, 300);\n\n if(IS_TOUCH_SUPPORTED && false) {\n this.scrollable.container.addEventListener('touchmove', () => {\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\n this.chatInner.classList.add('is-scrolling');\n }\n }, {passive: true});\n\n this.scrollable.container.addEventListener('touchend', () => {\n if(!this.chatInner.classList.contains('is-scrolling')) {\n return;\n }\n\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n }\n\n this.isScrollingTimeout = window.setTimeout(() => {\n this.chatInner.classList.remove('is-scrolling');\n this.isScrollingTimeout = 0;\n }, 1350);\n }, {passive: true});\n }\n }\n\n public async updateUnreadByDialog() {\n const historyStorage = await this.chat.getHistoryStorage();\n const maxId = this.peerId === rootScope.myId ? historyStorage.readMaxId : historyStorage.readOutboxMaxId;\n\n // /////this.log('updateUnreadByDialog', maxId, dialog, this.unreadOut);\n\n for(const msgId of this.unreadOut) {\n if(msgId > 0 && msgId <= maxId) {\n const bubble = this.bubbles[msgId];\n if(bubble) {\n this.unreadOut.delete(msgId);\n\n if(bubble.classList.contains('is-outgoing') || bubble.classList.contains('is-error')) {\n continue;\n }\n\n bubble.classList.remove('is-sent', 'is-sending', 'is-outgoing'); // is-sending can be when there are bulk of updates (e.g. sending command to Stickers bot)\n bubble.classList.add('is-read');\n }\n }\n }\n }\n\n public destroyBubble(bubble: HTMLElement, mid = +bubble.dataset.mid) {\n // this.log.warn('destroy bubble', bubble, mid);\n bubble.middlewareHelper.destroy();\n\n /* const mounted = this.getMountedBubble(mid);\n if(!mounted) return; */\n\n if(this.bubbles[mid] === bubble) { // have to check because can clear bubble with same id later\n delete this.bubbles[mid];\n }\n\n this.skippedMids.delete(mid);\n\n if(this.firstUnreadBubble === bubble) {\n this.firstUnreadBubble = null;\n }\n\n this.bubbleGroups.removeAndUnmountBubble(bubble);\n if(this.observer) {\n this.observer.unobserve(bubble, this.unreadedObserverCallback);\n this.unreaded.delete(bubble);\n\n this.observer.unobserve(bubble, this.viewsObserverCallback);\n this.viewsMids.delete(mid);\n\n this.observer.unobserve(bubble, this.stickerEffectObserverCallback);\n }\n\n // this.reactions.delete(mid);\n }\n\n public deleteMessagesByIds(mids: number[], permanent = true, ignoreOnScroll?: boolean) {\n let deleted = false;\n mids.forEach((mid) => {\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n this.destroyBubble(bubble, mid);\n\n deleted = true;\n });\n\n if(!deleted) {\n return;\n }\n\n this.scrollable.ignoreNextScrollEvent();\n if(permanent && this.chat.selection.isSelecting) {\n this.chat.selection.deleteSelectedMids(this.peerId, mids);\n }\n\n animationIntersector.checkAnimations(false, this.chat.animationGroup);\n this.deleteEmptyDateGroups();\n\n if(!ignoreOnScroll) {\n this.scrollable.onScroll();\n // this.onScroll();\n }\n }\n\n private pollExtendedMediaMessages() {\n const mids = Array.from(this.extendedMediaMessages);\n return this.managers.appMessagesManager.getExtendedMedia(this.peerId, mids);\n }\n\n private setExtendedMediaMessagesPollInterval() {\n if(this.pollExtendedMediaMessagesPromise || !this.extendedMediaMessages.size) {\n return;\n }\n\n this.pollExtendedMediaMessagesPromise = pause(30000)\n .then(() => this.pollExtendedMediaMessages())\n .then(() => this.setExtendedMediaMessagesPollInterval());\n }\n\n private setTopPadding(middleware = this.getMiddleware()) {\n let isPaddingNeeded = false;\n let setPaddingTo: HTMLElement;\n if(!this.isTopPaddingSet && this.chat.type !== 'scheduled') {\n const {clientHeight, scrollHeight} = this.scrollable.container;\n isPaddingNeeded = clientHeight === scrollHeight;\n /* const firstEl = this.chatInner.firstElementChild as HTMLElement;\n if(this.chatInner.firstElementChild) {\n const visibleRect = getVisibleRect(firstEl, this.scrollable.container);\n isPaddingNeeded = !visibleRect.overflow.top && (visibleRect.rect.top - firstEl.offsetTop) !== this.scrollable.container.getBoundingClientRect().top;\n } else {\n isPaddingNeeded = true;\n } */\n\n if(isPaddingNeeded) {\n /* const add = clientHeight - scrollHeight;\n this.chatInner.style.paddingTop = add + 'px';\n this.scrollable.scrollTop += add; */\n setPaddingTo = this.chatInner;\n setPaddingTo.style.paddingTop = clientHeight + 'px';\n this.scrollable.setScrollTopSilently(scrollHeight);\n this.isTopPaddingSet = true;\n }\n }\n\n return {\n isPaddingNeeded,\n unsetPadding: isPaddingNeeded ? () => {\n if(middleware() && isPaddingNeeded) {\n setPaddingTo.style.paddingTop = '';\n this.isTopPaddingSet = false;\n }\n } : undefined\n };\n }\n\n private renderNewMessage(message: MyMessage, scrolledDown?: boolean) {\n const promise = this._renderNewMessage(message, scrolledDown);\n this.renderNewPromises.add(promise);\n promise.catch(noop).finally(() => {\n this.renderNewPromises.delete(promise);\n });\n return promise;\n }\n\n private async _renderNewMessage(message: MyMessage, scrolledDown?: boolean) {\n if(!this.scrollable.loadedAll.bottom) { // seems search active or sliced\n // this.log('renderNewMessagesByIds: seems search is active, skipping render:', mids);\n const setPeerPromise = this.chat.setPeerPromise;\n if(setPeerPromise) {\n const middleware = this.getMiddleware();\n setPeerPromise.then(async() => {\n if(!middleware()) return;\n const newMessage = await this.chat.getMessage(message.mid);\n if(!middleware()) return;\n this.renderNewMessage(newMessage);\n });\n }\n\n return;\n }\n\n if(this.chat.threadId && getMessageThreadId(message, this.chat.isForum) !== this.chat.threadId) {\n return;\n }\n\n if(this.bubbles[message.mid]) {\n return;\n }\n // ! should scroll even without new messages\n /* if(!mids.length) {\n return;\n } */\n\n if(!scrolledDown) {\n scrolledDown = this.scrolledDown && (\n !this.scrollingToBubble ||\n this.scrollingToBubble === this.getLastBubble() ||\n this.scrollingToBubble === this.chatInner\n );\n }\n\n const middleware = this.getMiddleware();\n const {isPaddingNeeded, unsetPadding} = this.setTopPadding(middleware);\n\n const promise = this.performHistoryResult({history: [message]}, false);\n if(scrolledDown) {\n promise.then(() => {\n if(!middleware()) return;\n // this.log('renderNewMessagesByIDs: messagesQueuePromise after', this.scrollable.isScrolledDown);\n // this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true, 5000);\n // const bubble = this.bubbles[Math.max(...mids)];\n\n let bubble: HTMLElement;\n if(this.chat.type === 'scheduled') {\n bubble = this.bubbles[message.mid];\n }\n\n const promise = bubble ? this.scrollToBubbleEnd(bubble) : this.scrollToEnd();\n if(isPaddingNeeded) {\n // it will be called only once even if was set multiple times (that won't happen)\n promise.then(unsetPadding);\n }\n\n // this.scrollable.scrollIntoViewNew(this.chatInner, 'end');\n\n /* setTimeout(() => {\n this.log('messagesQueuePromise afterafter:', this.chatInner.childElementCount, this.scrollable.scrollHeight);\n }, 10); */\n });\n }\n\n return promise;\n }\n\n public getLastBubble() {\n const group = this.bubbleGroups.getLastGroup();\n return group?.lastItem?.bubble;\n }\n\n public scrollToBubble(\n element: HTMLElement,\n position: ScrollLogicalPosition,\n forceDirection?: FocusDirection,\n forceDuration?: number\n ) {\n const bubble = findUpClassName(element, 'bubble');\n\n if(!element.parentElement) {\n this.log.error('element is not connected', bubble);\n }\n\n let fallbackToElementStartWhenCentering: HTMLElement;\n // * if it's a start, then scroll to start of the group\n if(bubble && position !== 'end') {\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(item && item.group.firstItem === item && whichChild(item.group.container) === (this.stickyIntersector ? STICKY_OFFSET : 1)) {\n const dateGroup = item.group.container.parentElement;\n // if(whichChild(dateGroup) === 0) {\n fallbackToElementStartWhenCentering = dateGroup;\n // position = 'start';\n // element = dateGroup;\n // }\n }\n }\n\n // const isLastBubble = this.getLastBubble() === bubble;\n /* if(isLastBubble) {\n element = this.getLastDateGroup();\n } */\n\n const margin = 4; // * 4 = .25rem\n /* if(isLastBubble && this.chat.type === 'chat' && this.bubblesContainer.classList.contains('is-chat-input-hidden')) {\n margin = 20;\n } */\n\n const isChangingHeight = (this.chat.input.messageInput && this.chat.input.messageInput.classList.contains('is-changing-height')) || this.chat.container.classList.contains('is-toggling-helper');\n const promise = this.scrollable.scrollIntoViewNew({\n element,\n position,\n margin,\n forceDirection,\n forceDuration,\n axis: 'y',\n getNormalSize: isChangingHeight ? ({rect}) => {\n // return rect.height;\n\n let height = windowSize.height;\n // height -= this.chat.topbar.container.getBoundingClientRect().height;\n height -= this.container.offsetTop;\n height -= mediaSizes.isMobile || windowSize.height < 570 ? 58 : 78;\n return height;\n\n /* const rowsWrapperHeight = this.chat.input.rowsWrapper.getBoundingClientRect().height;\n const diff = rowsWrapperHeight - 54;\n return rect.height + diff; */\n } : undefined,\n fallbackToElementStartWhenCentering,\n startCallback: (dimensions) => {\n // this.onScroll(true, this.scrolledDown && dimensions.distanceToEnd <= SCROLLED_DOWN_THRESHOLD ? undefined : dimensions);\n this.onScroll(true, dimensions);\n\n if(this.updateGradient) {\n const {gradientRenderer} = this.chat;\n gradientRenderer?.toNextPosition(dimensions.getProgress);\n this.updateGradient = undefined;\n }\n }\n });\n\n // fix flickering date when opening unread chat and focusing message\n if(forceDirection === FocusDirection.Static) {\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\n }\n\n return promise;\n }\n\n public scrollToEnd() {\n return this.scrollToBubbleEnd(this.chatInner);\n }\n\n public async scrollToBubbleEnd(bubble: HTMLElement) {\n /* if(DEBUG) {\n this.log('scrollToNewLastBubble: will scroll into view:', bubble);\n } */\n\n if(bubble) {\n this.scrollingToBubble = bubble;\n const middleware = this.getMiddleware();\n await this.scrollToBubble(bubble, 'end', undefined, undefined);\n if(!middleware()) return;\n this.scrollingToBubble = undefined;\n }\n }\n\n // ! can't get it by chatInner.lastElementChild because placeholder can be the last...\n // private getLastDateGroup() {\n // let lastTime = 0, lastElem: HTMLElement;\n // for(const i in this.dateMessages) {\n // const dateMessage = this.dateMessages[i];\n // if(dateMessage.firstTimestamp > lastTime) {\n // lastElem = dateMessage.container;\n // lastTime = dateMessage.firstTimestamp;\n // }\n // }\n\n // return lastElem;\n // }\n\n public async scrollToBubbleIfLast(bubble: HTMLElement) {\n if(this.getLastBubble() === bubble) {\n // return this.scrollToBubbleEnd(bubble);\n return this.scrollToEnd();\n }\n }\n\n public highlightBubble(element: HTMLElement) {\n const datasetKey = 'highlightTimeout';\n if(element.dataset[datasetKey]) {\n clearTimeout(+element.dataset[datasetKey]);\n element.classList.remove('is-highlighted');\n void element.offsetWidth; // reflow\n }\n\n element.classList.add('is-highlighted');\n element.dataset[datasetKey] = '' + setTimeout(() => {\n element.classList.remove('is-highlighted');\n delete element.dataset[datasetKey];\n }, 2000);\n }\n\n private createDateBubble(timestamp: number, date: Date = new Date(timestamp * 1000)) {\n let dateElement: HTMLElement;\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n const isScheduled = this.chat.type === 'scheduled';\n\n if(today.getTime() === date.getTime()) {\n dateElement = i18n(isScheduled ? 'Chat.Date.ScheduledForToday' : 'Date.Today');\n } else if(isScheduled && timestamp === SEND_WHEN_ONLINE_TIMESTAMP) {\n dateElement = i18n('MessageScheduledUntilOnline');\n } else {\n const options: Intl.DateTimeFormatOptions = {\n day: 'numeric',\n month: 'long'\n };\n\n if(date.getFullYear() !== today.getFullYear()) {\n options.year = 'numeric';\n }\n\n dateElement = new I18n.IntlDateElement({\n date,\n options\n }).element;\n\n if(isScheduled) {\n dateElement = i18n('Chat.Date.ScheduledFor', [dateElement]);\n }\n }\n\n const bubble = document.createElement('div');\n bubble.className = 'bubble service is-date';\n const bubbleContent = document.createElement('div');\n bubbleContent.classList.add('bubble-content');\n const serviceMsg = document.createElement('div');\n serviceMsg.classList.add('service-msg');\n\n serviceMsg.append(dateElement);\n\n bubbleContent.append(serviceMsg);\n bubble.append(bubbleContent);\n\n return bubble;\n }\n\n public getDateForDateContainer(timestamp: number) {\n const date = new Date(timestamp * 1000);\n date.setHours(0, 0, 0);\n return {date, dateTimestamp: date.getTime()};\n }\n\n public getDateContainerByTimestamp(timestamp: number) {\n const {date, dateTimestamp} = this.getDateForDateContainer(timestamp);\n let ret = this.dateMessages[dateTimestamp];\n if(ret) {\n return ret;\n }\n\n const bubble = this.createDateBubble(timestamp, date);\n // bubble.classList.add('is-sticky');\n const fakeBubble = this.createDateBubble(timestamp, date);\n fakeBubble.classList.add('is-fake');\n\n const container = document.createElement('section');\n container.className = 'bubbles-date-group';\n container.append(bubble, fakeBubble);\n\n ret = this.dateMessages[dateTimestamp] = {\n div: bubble,\n container,\n firstTimestamp: date.getTime()\n };\n\n const haveTimestamps = getObjectKeysAndSort(this.dateMessages, 'asc');\n const length = haveTimestamps.length;\n let i = 0, insertBefore: HTMLElement; // there can be 'first bubble' (e.g. bot description) so can't insert by index\n for(; i < haveTimestamps.length; ++i) {\n const t = haveTimestamps[i];\n insertBefore = this.dateMessages[t].container;\n if(dateTimestamp < t) {\n break;\n }\n }\n\n if(i === length && insertBefore) {\n insertBefore = insertBefore.nextElementSibling as HTMLElement;\n }\n\n if(!insertBefore) {\n this.chatInner.append(container);\n } else {\n this.chatInner.insertBefore(container, insertBefore);\n }\n\n this.stickyIntersector?.observeStickyHeaderChanges(container);\n\n if(this.chatInner.parentElement) {\n this.container.classList.add('has-groups');\n }\n\n return ret;\n }\n\n private destroyScrollable() {\n this.scrollable.destroy();\n }\n\n public destroy() {\n // this.chat.log.error('Bubbles destroying');\n\n this.destroyScrollable();\n\n this.listenerSetter.removeAll();\n\n this.lazyLoadQueue.clear();\n this.observer && this.observer.disconnect();\n this.stickyIntersector && this.stickyIntersector.disconnect();\n\n delete this.lazyLoadQueue;\n this.observer && delete this.observer;\n this.stickyIntersector && delete this.stickyIntersector;\n }\n\n public cleanup(bubblesToo = false) {\n this.log('cleanup');\n\n this.bubbles = {}; // clean it before so sponsored message won't be deleted faster on peer changing\n // //console.time('appImManager cleanup');\n this.setLoaded('top', false, false);\n this.setLoaded('bottom', false, false);\n\n // cancel scroll\n cancelAnimationByKey(this.scrollable.container);\n\n // do not wait ending of previous scale animation\n interruptHeavyAnimation();\n\n if(TEST_SCROLL !== undefined) {\n TEST_SCROLL = TEST_SCROLL_TIMES;\n }\n\n this.skippedMids.clear();\n this.dateMessages = {};\n this.bubbleGroups.cleanup();\n this.unreadOut.clear();\n this.needUpdate.length = 0;\n this.lazyLoadQueue.clear();\n this.renderNewPromises.clear();\n\n // clear messages\n if(bubblesToo) {\n this.scrollable.container.textContent = '';\n this.chatInner.textContent = '';\n this.cleanupPlaceholders();\n }\n\n this.firstUnreadBubble = null;\n this.attachedUnreadBubble = false;\n\n this.batchProcessor.clear();\n\n this.getHistoryTopPromise = this.getHistoryBottomPromise = undefined;\n this.fetchNewPromise = undefined;\n this.getSponsoredMessagePromise = undefined;\n this.updateGradient = undefined;\n\n if(this.stickyIntersector) {\n this.stickyIntersector.disconnect();\n }\n\n if(this.observer) {\n this.observer.disconnect();\n\n this.unreaded.clear();\n this.unreadedSeen.clear();\n this.readPromise = undefined;\n\n this.viewsMids.clear();\n }\n\n this.middlewareHelper.clean();\n\n this.onAnimateLadder = undefined;\n this.resolveLadderAnimation = undefined;\n this.attachPlaceholderOnRender = undefined;\n this.emptyPlaceholderBubble = undefined;\n this.sponsoredMessage = undefined;\n this.previousStickyDate = undefined;\n\n this.scrollingToBubble = undefined;\n // //console.timeEnd('appImManager cleanup');\n\n this.isTopPaddingSet = false;\n\n this.renderingMessages.clear();\n this.bubblesToEject.clear();\n this.bubblesToReplace.clear();\n\n // this.reactions.clear();\n\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n this.isScrollingTimeout = 0;\n }\n\n this.container.classList.remove('has-sticky-dates');\n this.scrollable.cancelMeasure();\n }\n\n private cleanupPlaceholders(bubble = this.emptyPlaceholderBubble) {\n if(bubble) {\n this.destroyBubble(bubble);\n }\n }\n\n public async setPeer(options: ChatSetPeerOptions & {samePeer: boolean}): Promise<{cached?: boolean, promise: Chat['setPeerPromise']}> {\n const {samePeer, peerId, stack} = options;\n let {lastMsgId, startParam} = options;\n const tempId = ++this.setPeerTempId;\n\n if(!peerId) {\n this.cleanup(true);\n this.preloader.detach();\n return null;\n }\n\n const perf = performance.now();\n const log = this.log.bindPrefix('setPeer');\n log.warn('start');\n\n const middleware = () => {\n return this.setPeerTempId === tempId;\n };\n\n const m = middlewarePromise(middleware, PEER_CHANGED_ERROR);\n\n if(!samePeer) {\n await m(this.chat.onChangePeer(options, m));\n }\n\n /* if(samePeer && this.chat.setPeerPromise) {\n return {cached: true, promise: this.chat.setPeerPromise};\n } */\n\n const chatType = this.chat.type;\n\n if(chatType === 'scheduled' || this.chat.isRestricted) {\n lastMsgId = 0;\n }\n\n const historyStorage = await m(this.chat.getHistoryStorage());\n const topMessage = chatType === 'pinned' ? await m(this.managers.appMessagesManager.getPinnedMessagesMaxId(peerId, this.chat.threadId)) : historyStorage.maxId ?? 0;\n const isTarget = lastMsgId !== undefined;\n\n // * this one will fix topMessage for null message in history (e.g. channel comments with only 1 comment and it is a topMessage)\n /* if(chatType !== 'pinned' && topMessage && !historyStorage.history.slice.includes(topMessage)) {\n topMessage = 0;\n } */\n\n let followingUnread: boolean;\n let readMaxId = 0, savedPosition: ReturnType, overrideAdditionMsgId: number;\n if(!isTarget) {\n if(!samePeer) {\n savedPosition = this.chat.appImManager.getChatSavedPosition(this.chat);\n }\n\n if(savedPosition) {\n\n } else if(topMessage) {\n readMaxId = await m(this.managers.appMessagesManager.getReadMaxIdIfUnread(peerId, this.chat.threadId));\n const dialog = await m(this.chat.getDialogOrTopic());\n if(/* dialog.unread_count */readMaxId && !samePeer && (!dialog || dialog.unread_count !== 1)) {\n const foundSlice = historyStorage.history.findSliceOffset(readMaxId);\n if(foundSlice && foundSlice.slice.isEnd(SliceEnd.Bottom)) {\n overrideAdditionMsgId = foundSlice.slice[foundSlice.offset - 25] || foundSlice.slice[0] || readMaxId;\n }\n\n followingUnread = !isTarget;\n lastMsgId = readMaxId;\n } else {\n lastMsgId = topMessage;\n // lastMsgID = topMessage;\n }\n }\n }\n\n const isJump = lastMsgId !== topMessage/* && overrideAdditionMsgId === undefined */;\n\n if(startParam === undefined && await m(this.chat.isStartButtonNeeded())) {\n startParam = BOT_START_PARAM;\n }\n\n if(samePeer) {\n if(stack && lastMsgId) {\n this.followStack.push(stack);\n }\n\n const mounted = await m(this.getMountedBubble(lastMsgId));\n if(mounted) {\n if(isTarget) {\n this.scrollToBubble(mounted.bubble, 'center');\n this.highlightBubble(mounted.bubble);\n this.chat.dispatchEvent('setPeer', lastMsgId, false);\n } else if(topMessage && !isJump) {\n // log('will scroll down', this.scroll.scrollTop, this.scroll.scrollHeight);\n // scrollable.setScrollTopSilently(scrollable.scrollHeight);\n this.scrollToEnd();\n this.chat.dispatchEvent('setPeer', lastMsgId, true);\n }\n\n if(startParam !== undefined) {\n this.chat.input.setStartParam(startParam);\n }\n\n return null;\n }\n } else {\n if(this.peerId) { // * set new queue id if new peer (setting not from 0)\n this.lazyLoadQueue.queueId = ++queueId;\n this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }\n\n this.followStack.length = 0;\n\n this.passEntities = {\n messageEntityBotCommand: await m(this.managers.appPeersManager.isAnyGroup(peerId)) || this.chat.isBot\n };\n }\n\n if(DEBUG) {\n log('setPeer peerId:', peerId, historyStorage, lastMsgId, topMessage);\n }\n\n // add last message, bc in getHistory will load < max_id\n const additionMsgId = overrideAdditionMsgId ?? (isJump || chatType === 'scheduled' || this.chat.isRestricted ? 0 : topMessage);\n\n let maxBubbleId = 0;\n if(samePeer) {\n const el = this.getBubbleByPoint('bottom'); // ! this may not work if being called when chat is hidden\n // this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\n if(el) {\n maxBubbleId = +el.dataset.mid;\n }\n\n if(maxBubbleId <= 0) {\n maxBubbleId = Math.max(...Object.keys(this.bubbles).map((mid) => +mid));\n }\n } else {\n this.isFirstLoad = true;\n this.destroyResizeObserver();\n }\n\n const oldChatInner = this.chatInner;\n const oldPlaceholderBubble = this.emptyPlaceholderBubble;\n this.cleanup();\n const chatInner = this.chatInner = document.createElement('div');\n if(samePeer) {\n chatInner.className = oldChatInner.className;\n chatInner.classList.remove('disable-hover', 'is-scrolling');\n } else {\n chatInner.classList.add('bubbles-inner');\n }\n\n this.lazyLoadQueue.lock();\n\n // const haveToScrollToBubble = (topMessage && (isJump || samePeer)) || isTarget;\n const haveToScrollToBubble = samePeer || (topMessage && isJump) || isTarget;\n const fromUp = maxBubbleId > 0 && (!lastMsgId || maxBubbleId < lastMsgId || lastMsgId < 0);\n const scrollFromDown = !fromUp && samePeer;\n const scrollFromUp = !scrollFromDown && fromUp/* && (samePeer || forwardingUnread) */;\n this.willScrollOnLoad = scrollFromDown || scrollFromUp;\n\n this.setPeerOptions = {\n lastMsgId,\n topMessage\n };\n\n let result: Awaited>;\n if(!savedPosition) {\n result = await m(this.getHistory1(lastMsgId, true, isJump, additionMsgId));\n } else {\n result = {\n promise: getHeavyAnimationPromise().then(() => {\n return this.performHistoryResult({history: savedPosition.mids}, true);\n }) as any,\n cached: true,\n waitPromise: Promise.resolve()\n };\n }\n\n this.setPeerCached = result.cached;\n\n log.warn('got history');// warning\n\n const {promise, cached} = result;\n\n if(!cached && !samePeer) {\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam));\n this.scrollable.container.textContent = '';\n // oldContainer.textContent = '';\n // oldChatInner.remove();\n this.preloader.attach(this.container);\n }\n\n /* this.ladderDeferred && this.ladderDeferred.resolve();\n this.ladderDeferred = deferredPromise(); */\n\n animationIntersector.lockGroup(this.chat.animationGroup);\n const setPeerPromise = m(promise).then(async() => {\n log.warn('promise fulfilled');\n\n const mountedByLastMsgId = haveToScrollToBubble ? await m(lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()}) : undefined;\n if(cached && !samePeer) {\n log.warn('finishing peer change');\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam)); // * костыль\n log.warn('finished peer change');\n }\n\n this.preloader.detach();\n\n if(this.resolveLadderAnimation) {\n this.resolveLadderAnimation();\n this.resolveLadderAnimation = undefined;\n }\n\n this.setPeerCached = undefined;\n\n // this.ladderDeferred.resolve();\n\n const scrollable = this.scrollable;\n scrollable.lastScrollDirection = 0;\n scrollable.lastScrollPosition = 0;\n replaceContent(scrollable.container, chatInner);\n // this.chat.topbar.container.nextElementSibling.replaceWith(container);\n\n if(oldPlaceholderBubble) {\n this.cleanupPlaceholders(oldPlaceholderBubble);\n }\n\n if(this.attachPlaceholderOnRender) {\n this.attachPlaceholderOnRender();\n }\n\n if(!isTarget && this.chat.isPinnedMessagesNeeded()) {\n this.chat.topbar.pinnedMessage?.setCorrectIndex(0);\n }\n\n this.container.classList.toggle('has-groups', !!Object.keys(this.dateMessages).length);\n\n log.warn('mounted chat', this.chatInner === chatInner, this.chatInner.parentElement, performance.now() - perf);\n\n animationIntersector.unlockGroup(this.chat.animationGroup);\n animationIntersector.checkAnimations(false, this.chat.animationGroup/* , true */);\n\n // fastRaf(() => {\n this.lazyLoadQueue.unlock();\n // });\n\n // if(dialog && lastMsgID && lastMsgID !== topMessage && (this.bubbles[lastMsgID] || this.firstUnreadBubble)) {\n if(savedPosition) {\n scrollable.setScrollTopSilently(savedPosition.top);\n /* const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\n let bubble: HTMLElement = mountedByLastMsgId?.bubble;\n if(!bubble?.parentElement) {\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\n }\n\n if(bubble) {\n const top = bubble.getBoundingClientRect().top;\n const distance = savedPosition.top - top;\n scrollable.scrollTop += distance;\n } */\n } else if(haveToScrollToBubble) {\n let unsetPadding: () => void;\n if(scrollFromDown) {\n scrollable.setScrollTopSilently(99999);\n } else if(scrollFromUp) {\n const set = this.setTopPadding();\n if(set.isPaddingNeeded) {\n unsetPadding = set.unsetPadding;\n }\n\n scrollable.setScrollTopSilently(0);\n }\n\n // const mountedByLastMsgId = lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()};\n let bubble: HTMLElement = (followingUnread && this.firstUnreadBubble) || mountedByLastMsgId?.bubble;\n if(!bubble?.parentElement) {\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId, false) || this.findNextMountedBubbleByMsgId(lastMsgId, true);\n }\n\n let promise: Promise;\n // ! sometimes there can be no bubble\n if(bubble) {\n const lastBubble = this.getLastBubble();\n const position: ScrollLogicalPosition = followingUnread ? 'start' : (!isJump && !isTarget && lastBubble === bubble ? 'end' : 'center');\n\n if(position === 'end' && lastBubble === bubble && samePeer) {\n promise = this.scrollToEnd();\n } else {\n promise = this.scrollToBubble(bubble, position, !samePeer ? FocusDirection.Static : undefined);\n }\n\n if(!followingUnread && isTarget) {\n this.highlightBubble(bubble);\n }\n }\n\n if(unsetPadding) {\n (promise || Promise.resolve()).then(() => {\n unsetPadding();\n });\n }\n } else {\n scrollable.setScrollTopSilently(99999);\n }\n\n // if(!cached) {\n this.onRenderScrollSet();\n // }\n\n this.onScroll();\n\n const afterSetPromise = Promise.all([setPeerPromise, getHeavyAnimationPromise()]);\n afterSetPromise.then(() => { // check whether list isn't full\n scrollable.checkForTriggers();\n\n // if(cached) {\n // this.onRenderScrollSet();\n // }\n });\n\n this.chat.dispatchEvent('setPeer', lastMsgId, !isJump);\n\n Promise.all([\n this.setFetchReactionsInterval(afterSetPromise),\n this.setFetchHistoryInterval({\n afterSetPromise,\n lastMsgId,\n samePeer,\n savedPosition,\n topMessage\n })\n ]).then(() => {\n log('scrolledAllDown:', scrollable.loadedAll.bottom);\n // if(!this.unreaded.length && dialog) { // lol\n if(scrollable.loadedAll.bottom && topMessage && !this.unreaded.size) { // lol\n this.onScrolledAllDown();\n }\n });\n\n if(chatType === 'chat' && !this.chat.isForumTopic) {\n const dialog = await m(this.managers.appMessagesManager.getDialogOnly(peerId));\n if(dialog?.pFlags.unread_mark) {\n this.managers.appMessagesManager.markDialogUnread(peerId, true);\n }\n }\n\n // this.chatInner.classList.remove('disable-hover', 'is-scrolling'); // warning, performance!\n }).catch((err) => {\n log.error('setPeer promise error:', err);\n if(!middleware()) {\n this.preloader.detach();\n }\n\n throw err;\n });\n\n return {cached, promise: setPeerPromise};\n }\n\n private async setFetchReactionsInterval(afterSetPromise: Promise) {\n const middleware = this.getMiddleware();\n const needReactionsInterval = this.chat.isChannel;\n if(needReactionsInterval) {\n const fetchReactions = async() => {\n if(!middleware()) return;\n\n const mids: number[] = [];\n for(const mid in this.bubbles) {\n let message = await this.chat.getMessage(+mid);\n if(message?._ !== 'message') {\n continue;\n }\n\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\n mids.push(message.mid);\n }\n\n const promise = mids.length ? this.managers.appReactionsManager.getMessagesReactions(this.peerId, mids) : Promise.resolve();\n promise.then(() => {\n setTimeout(fetchReactions, 10e3);\n });\n };\n\n Promise.all([afterSetPromise, getHeavyAnimationPromise(), pause(500)]).then(() => {\n fetchReactions();\n });\n }\n }\n\n private async setFetchHistoryInterval({\n lastMsgId,\n topMessage,\n afterSetPromise,\n savedPosition,\n samePeer\n }: {\n lastMsgId: number,\n topMessage: number,\n afterSetPromise: Promise,\n savedPosition: ChatSavedPosition,\n samePeer: boolean\n }) {\n const middleware = this.getMiddleware();\n const peerId = this.peerId;\n\n const needFetchInterval = await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId);\n const needFetchNew = savedPosition || needFetchInterval;\n if(!needFetchNew) {\n return;\n }\n\n await afterSetPromise;\n if(!middleware()) {\n return;\n }\n\n const chatId = peerId.toChatId();\n middleware.onClean(() => {\n this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(chatId);\n });\n\n this.managers.apiUpdatesManager.subscribeToChannelUpdates(chatId);\n return;\n\n this.setLoaded('bottom', false);\n this.scrollable.checkForTriggers();\n\n if(!needFetchInterval) {\n return;\n }\n\n const f = () => {\n this.fetchNewPromise = new Promise(async(resolve) => {\n if(!middleware() || !(await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId))) {\n resolve();\n return;\n }\n\n this.managers.appMessagesManager.getNewHistory(peerId, this.chat.threadId).then((result) => {\n if(!middleware() || !result) {\n resolve();\n return;\n }\n\n const {isBottomEnd} = result;\n if(this.scrollable.loadedAll.bottom && this.scrollable.loadedAll.bottom !== isBottomEnd) {\n this.setLoaded('bottom', isBottomEnd);\n this.onScroll();\n }\n\n setTimeout(f, 30e3);\n resolve();\n });\n }).finally(() => {\n this.fetchNewPromise = undefined;\n });\n };\n\n if(samePeer) {\n setTimeout(f, 30e3);\n } else {\n f();\n }\n }\n\n public async onScrolledAllDown() {\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n const historyMaxId = await this.chat.getHistoryMaxId();\n this.managers.appMessagesManager.readHistory(this.peerId, historyMaxId, this.chat.threadId, true);\n }\n }\n\n public async finishPeerChange() {\n const [isChannel, canWrite, isAnyGroup] = await Promise.all([\n this.chat.isChannel,\n this.chat.canSend(),\n this.chat.isAnyGroup\n ]);\n\n return () => {\n this.chatInner.classList.toggle('has-rights', canWrite);\n this.container.classList.toggle('is-chat-input-hidden', !canWrite);\n\n this.chatInner.classList.toggle('is-chat', isAnyGroup);\n this.chatInner.classList.toggle('is-channel', isChannel);\n\n this.createResizeObserver();\n };\n }\n\n private processBatch = async(...args: Parameters) => {\n let [loadQueue, m, log] = args;\n\n const filterQueue = (queue: typeof loadQueue) => {\n return queue.filter((details) => {\n // message can be deleted during rendering\n return details && this.bubbles[details.bubble.dataset.mid] === details.bubble;\n });\n };\n\n loadQueue = filterQueue(loadQueue);\n\n log('messages rendered');\n\n const reverse = loadQueue[0]?.reverse;\n\n const {groups, avatarPromises} = this.groupBubbles(loadQueue.filter((details) => details.updatePosition));\n\n // if(groups.length > 2 && loadQueue.length === 1) {\n // debugger;\n // }\n\n const promises = loadQueue.reduce((acc, details) => {\n const perf = performance.now();\n\n const promises = details.promises.slice();\n const timePromises = promises.map(async(promise) => (await promise, performance.now() - perf));\n Promise.all(timePromises).then((times) => {\n log.groupCollapsed('media message time', performance.now() - perf, details, times);\n times.forEach((time, idx) => {\n log('media message time', time, idx, promises[idx]);\n });\n log.groupEnd();\n });\n\n // if(details.updatePosition) {\n // if(res) {\n // groups.add(res.group);\n // if(details.needAvatar) {\n // details.promises.push(res.group.createAvatar(details.message));\n // }\n // }\n // }\n\n acc.push(...details.promises);\n return acc;\n }, [] as Promise[]);\n\n promises.push(...avatarPromises);\n // promises.push(pause(200));\n\n // * это нужно для того, чтобы если захочет подгрузить reply или какое-либо сообщение, то скролл не прервался\n // * если добавить этот промис - в таком случае нужно сделать, чтобы скроллило к последнему сообщению после рендера\n // promises.push(getHeavyAnimationPromise());\n\n log('media promises to call', promises, loadQueue, this.isHeavyAnimationInProgress);\n await m(Promise.all([...promises, this.setUnreadDelimiter()]).catch(noop)); // не нашёл места лучше\n await m(fastRafPromise()); // have to be the last\n log('media promises end');\n\n loadQueue = filterQueue(loadQueue);\n\n const {restoreScroll, scrollSaver} = this.prepareToSaveScroll(reverse);\n // if(this.messagesQueueOnRender) {\n // this.messagesQueueOnRender();\n // }\n\n this.messagesQueueOnRenderAdditional?.();\n\n this.ejectBubbles();\n for(const [bubble, oldBubble] of this.bubblesToReplace) {\n if(scrollSaver) {\n scrollSaver.replaceSaved(oldBubble, bubble);\n }\n\n if(!loadQueue.find((details) => details.bubble === bubble)) {\n continue;\n }\n\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(!item) {\n this.log.error('NO ITEM BY BUBBLE', bubble);\n } else {\n item.mounted = false;\n if(!groups.includes(item.group)) {\n groups.push(item.group);\n }\n }\n\n this.bubblesToReplace.delete(bubble);\n }\n\n if(this.chat.selection.isSelecting) {\n loadQueue.forEach(({bubble}) => {\n this.chat.selection.toggleElementCheckbox(bubble, true);\n });\n }\n\n loadQueue.forEach(({message, bubble, updatePosition}) => {\n if(message.pFlags.local && updatePosition) {\n this.chatInner[(message as Message.message).pFlags.sponsored ? 'append' : 'prepend'](bubble);\n return;\n }\n });\n\n this.bubbleGroups.mountUnmountGroups(groups);\n // this.bubbleGroups.findIncorrentPositions();\n\n this.updatePlaceholderPosition?.();\n\n restoreScroll?.();\n\n // this.setStickyDateManually();\n };\n\n public renderMessagesQueue(options: ReturnType) {\n return this.batchProcessor.addToQueue(options);\n }\n\n private ejectBubbles() {\n for(const bubble of this.bubblesToEject) {\n bubble.remove();\n // this.bubbleGroups.removeAndUnmountBubble(bubble);\n }\n\n this.bubblesToEject.clear();\n }\n\n public groupBubbles(items: Array<{\n // Awaited> &\n bubble: HTMLElement,\n message: Message.message | Message.messageService\n }/* & {\n unmountIfFound?: boolean\n } */>) {\n let modifiedGroups: typeof groups;\n\n if(this.chat.type === 'scheduled') {\n modifiedGroups = new Set();\n items.forEach(({bubble, message}) => {\n const item = this.bubbleGroups.getItemByBubble(bubble);\n const group = item?.group;\n if(group && item.message.date !== message.date) {\n this.bubbleGroups.removeItem(item);\n modifiedGroups.add(group);\n }\n });\n }\n\n items.forEach(({bubble, message}) => {\n this.bubbleGroups.prepareForGrouping(bubble, message);\n });\n\n const groups = this.bubbleGroups.groupUngrouped();\n\n const avatarPromises = Array.from(groups).map((group) => {\n if(group.avatar) return;\n const firstItem = group.firstItem;\n if(firstItem && this.chat.isAvatarNeeded(firstItem.message)) {\n return group.createAvatar(firstItem.message);\n }\n }).filter(Boolean);\n\n if(modifiedGroups) {\n for(const group of modifiedGroups) {\n groups.add(group);\n }\n }\n\n return {\n groups: [...groups],\n avatarPromises\n };\n }\n\n public getMiddleware(additionalCallback?: () => boolean) {\n return this.middlewareHelper.get(additionalCallback);\n }\n\n private async wrapMediaSpoiler({\n media,\n promise,\n middleware,\n attachmentDiv\n }: {\n media: Photo.photo | MyDocument,\n promise: Promise,\n middleware: Middleware,\n attachmentDiv: HTMLElement\n }) {\n await promise;\n if(!middleware()) {\n return;\n }\n\n const {width, height} = attachmentDiv.style;\n const container = await wrapMediaSpoiler({\n media,\n width: parseInt(width),\n height: parseInt(height),\n middleware,\n animationGroup: this.chat.animationGroup\n });\n\n if(!middleware()) {\n return;\n }\n\n attachmentDiv.append(container);\n }\n\n private async safeRenderMessage(\n message: Message.message | Message.messageService,\n reverse?: boolean,\n bubble?: HTMLElement,\n updatePosition = true,\n processResult?: (result: ReturnType, bubble: HTMLElement) => typeof result\n ) {\n if(!message || this.renderingMessages.has(message.mid) || (this.bubbles[message.mid] && !bubble)) {\n return;\n }\n\n const middlewareHelper = this.getMiddleware().create();\n const middleware = middlewareHelper.get();\n\n let result: Awaited> & {updatePosition: typeof updatePosition};\n try {\n this.renderingMessages.add(message.mid);\n\n // const groupedId = (message as Message.message).grouped_id;\n const newBubble = document.createElement('div');\n newBubble.middlewareHelper = middlewareHelper;\n newBubble.dataset.mid = '' + message.mid;\n newBubble.dataset.peerId = '' + message.peerId;\n newBubble.dataset.timestamp = '' + message.date;\n\n // const bubbleNew: Bubble = this.bubblesNew[message.mid] ??= {\n // bubble: newBubble,\n // mids: new Set(),\n // groupedId\n // };\n\n // bubbleNew.mids.add(message.mid);\n\n if(bubble) {\n bubble.middlewareHelper.destroy();\n this.skippedMids.delete(message.mid);\n\n this.bubblesToEject.add(bubble);\n this.bubblesToReplace.delete(bubble);\n this.bubblesToReplace.set(newBubble, bubble);\n this.bubbleGroups.changeBubbleByBubble(bubble, newBubble);\n }\n\n bubble = this.bubbles[message.mid] = newBubble;\n let originalPromise = this.renderMessage(message, reverse, bubble, middleware);\n if(processResult) {\n originalPromise = processResult(originalPromise, bubble);\n }\n\n const promise = originalPromise.then((r) => ((r && middleware() ? {...r, updatePosition} : undefined) as typeof result));\n\n this.renderMessagesQueue(promise.catch(() => undefined));\n\n result = await promise;\n if(!middleware()) {\n return;\n }\n\n if(!result) {\n this.skippedMids.add(+message.mid);\n }\n } catch(err) {\n this.log.error('renderMessage error:', err);\n }\n\n if(!middleware()) {\n return;\n }\n\n this.renderingMessages.delete(message.mid);\n return result;\n }\n\n // reverse means top\n private async renderMessage(\n message: Message.message | Message.messageService,\n reverse = false,\n bubble: HTMLElement,\n middleware: Middleware\n ) {\n // if(DEBUG) {\n // this.log('message to render:', message);\n // }\n\n // if(!bubble && this.bubbles[message.mid]) {\n // return;\n // }\n\n // await pause(1000);\n\n const isMessage = message._ === 'message';\n const groupedId = isMessage && message.grouped_id;\n let albumMids: number[], reactionsMessage: Message.message;\n const albumMessages = groupedId ? await this.managers.appMessagesManager.getMessagesByAlbum(groupedId) : undefined;\n\n const albumMustBeRenderedFull = this.chat.type !== 'pinned';\n\n if(groupedId && albumMustBeRenderedFull) { // will render only last album's message\n albumMids = albumMessages.map((message) => message.mid);\n const mainMid = getMainMidForGrouped(albumMids);\n if(message.mid !== mainMid) {\n return;\n }\n }\n\n if(isMessage) {\n reactionsMessage = groupedId ? albumMessages[0] : message;\n }\n\n // * can't use 'message.pFlags.out' here because this check will be used to define side of message (left-right)\n const our = this.chat.isOurMessage(message);\n\n const messageDiv = document.createElement('div');\n messageDiv.classList.add('message', 'spoilers-container');\n\n const contentWrapper = document.createElement('div');\n contentWrapper.classList.add('bubble-content-wrapper');\n\n const bubbleContainer = document.createElement('div');\n bubbleContainer.classList.add('bubble-content');\n\n bubble.classList.add('bubble');\n contentWrapper.append(bubbleContainer);\n bubble.append(contentWrapper);\n\n let isInUnread = !our &&\n !message.pFlags.out &&\n (\n message.pFlags.unread ||\n isMentionUnread(message)\n );\n\n if(!isInUnread && this.chat.peerId.isAnyChat()) {\n const readMaxId = await this.managers.appMessagesManager.getReadMaxIdIfUnread(this.chat.peerId, this.chat.threadId);\n if(readMaxId !== undefined && readMaxId < message.mid) {\n isInUnread = true;\n }\n }\n\n if(isInUnread && this.observer) {\n // this.log('not our message', message, message.pFlags.unread);\n this.observer.observe(bubble, this.unreadedObserverCallback);\n this.unreaded.set(bubble, message.mid);\n }\n\n const loadPromises: Promise[] = [];\n const ret = {\n bubble,\n promises: loadPromises,\n message,\n reverse\n };\n\n const wrapOptions: WrapSomethingOptions = {\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n customEmojiSize: this.chat.appImManager.customEmojiSize,\n animationGroup: this.chat.animationGroup\n };\n\n if(message._ === 'messageService' && (!message.action || !SERVICE_AS_REGULAR.has(message.action._))) {\n const action = message.action;\n if(action) {\n const _ = action._;\n\n const ignoreAction = IGNORE_ACTIONS.get(_);\n if(ignoreAction && (ignoreAction === true || ignoreAction(message))) {\n return;\n }\n\n if(langPack.hasOwnProperty(_) && !langPack[_]) {\n return;\n }\n }\n\n bubble.className = 'bubble service';\n\n bubbleContainer.innerHTML = '';\n const s = document.createElement('div');\n s.classList.add('service-msg');\n if(action) {\n let promise: Promise;\n if(action._ === 'messageActionChannelMigrateFrom') {\n const peerTitle = new PeerTitle();\n promise = peerTitle.update({peerId: action.chat_id.toPeerId(true), wrapOptions});\n s.append(i18n('ChatMigration.From', [peerTitle.element]));\n } else if(action._ === 'messageActionChatMigrateTo') {\n const peerTitle = new PeerTitle();\n promise = peerTitle.update({peerId: action.channel_id.toPeerId(true), wrapOptions});\n s.append(i18n('ChatMigration.To', [peerTitle.element]));\n } else {\n s.append(await wrapMessageActionTextNew({\n message,\n ...wrapOptions\n }));\n }\n }\n bubbleContainer.append(s);\n\n if(message.pFlags.is_single) { // * Ignore 'Discussion started'\n bubble.classList.add('is-group-last');\n }\n\n return ret;\n }\n\n let messageMedia: MessageMedia = isMessage && message.media;\n let needToSetHTML = true;\n let messageMessage: string, totalEntities: MessageEntity[];\n if(isMessage) {\n if(groupedId && albumMustBeRenderedFull) {\n const t = getAlbumText(albumMessages);\n messageMessage = t?.message || '';\n // totalEntities = t.entities;\n totalEntities = t?.totalEntities || [];\n } else {\n messageMessage = message.message;\n // totalEntities = message.entities;\n totalEntities = message.totalEntities;\n }\n\n const document = (messageMedia as MessageMedia.messageMediaDocument)?.document as MyDocument;\n if(document) {\n if(document?.type === 'sticker') {\n messageMessage = totalEntities = undefined;\n } else if(!['video', 'gif'].includes(document.type)) {\n needToSetHTML = false;\n }\n }\n } else {\n if(message.action._ === 'messageActionPhoneCall') {\n messageMedia = {\n _: 'messageMediaCall',\n action: message.action\n };\n }\n }\n\n let bigEmojis = 0, customEmojiSize: MediaSize;\n if(totalEntities && !messageMedia) {\n const emojiEntities = totalEntities.filter((e) => e._ === 'messageEntityEmoji'/* || e._ === 'messageEntityCustomEmoji' */);\n const strLength = messageMessage.replace(/\\s/g, '').length;\n const emojiStrLength = emojiEntities.reduce((acc, curr) => acc + curr.length, 0);\n\n if(emojiStrLength === strLength /* && emojiEntities.length <= 3 *//* && totalEntities.length === emojiEntities.length */) {\n bigEmojis = Math.min(BIG_EMOJI_SIZES_LENGTH, emojiEntities.length);\n\n customEmojiSize = mediaSizes.active.customEmoji;\n\n const size = BIG_EMOJI_SIZES[bigEmojis];\n if(size) {\n customEmojiSize = makeMediaSize(size, size);\n bubble.style.setProperty('--emoji-size', size + 'px');\n }\n }\n }\n\n customEmojiSize ??= this.chat.appImManager.customEmojiSize;\n\n const richText = wrapRichText(messageMessage, {\n entities: totalEntities,\n passEntities: this.passEntities,\n loadPromises,\n lazyLoadQueue: this.lazyLoadQueue,\n customEmojiSize,\n middleware,\n animationGroup: this.chat.animationGroup\n });\n\n let canHaveTail = true;\n let isStandaloneMedia = false;\n let attachmentDiv: HTMLElement;\n if(bigEmojis) {\n if(rootScope.settings.emoji.big) {\n const sticker = bigEmojis === 1 &&\n !totalEntities.find((entity) => entity._ === 'messageEntityCustomEmoji') &&\n await this.managers.appStickersManager.getAnimatedEmojiSticker(messageMessage);\n if(bigEmojis === 1 && !messageMedia && sticker) {\n messageMedia = {\n _: 'messageMediaDocument',\n document: sticker\n };\n } else {\n attachmentDiv = document.createElement('div');\n attachmentDiv.classList.add('attachment', 'spoilers-container');\n\n setInnerHTML(attachmentDiv, richText);\n\n bubbleContainer.append(attachmentDiv);\n }\n\n bubble.classList.add('is-message-empty', 'emoji-big');\n isStandaloneMedia = true;\n canHaveTail = false;\n needToSetHTML = false;\n }\n\n bubble.classList.add('can-have-big-emoji');\n }\n\n if(needToSetHTML) {\n setInnerHTML(messageDiv, richText);\n }\n\n const haveRTLChar = isRTL(messageMessage, true);\n\n const timeSpan = MessageRender.setTime({\n chatType: this.chat.type,\n message,\n reactionsMessage\n });\n messageDiv.append(timeSpan);\n bubbleContainer.prepend(messageDiv);\n // bubble.prepend(timeSpan, messageDiv); // that's bad\n\n if(haveRTLChar) {\n timeSpan.classList.add('is-block');\n }\n\n let topicNameButtonContainer: HTMLElement;\n if(isMessage && this.chat.isAllMessagesForum) {\n const result = await wrapTopicNameButton({\n peerId: this.peerId,\n threadId: getMessageThreadId(message, this.chat.isForum),\n lastMsgId: message.mid,\n wrapOptions: {\n middleware\n },\n withIcons: true\n });\n\n const {element} = result;\n // if(isStandaloneMedia) {\n // element.classList.add('floating-part');\n // }\n\n topicNameButtonContainer = document.createElement('div');\n topicNameButtonContainer.classList.add(/* 'name', */'topic-name-button-container');\n topicNameButtonContainer.append(element);\n }\n\n if(isMessage && message.views) {\n bubble.classList.add('channel-post');\n\n if(!message.fwd_from?.saved_from_msg_id && this.chat.type !== 'pinned') {\n const forward = document.createElement('div');\n forward.classList.add('bubble-beside-button', 'forward', 'tgico-forward_filled');\n bubbleContainer.prepend(forward);\n bubble.classList.add('with-beside-button');\n }\n\n if(!message.pFlags.is_outgoing && this.observer) {\n this.observer.observe(bubble, this.viewsObserverCallback);\n }\n }\n\n const replyMarkup = isMessage && message.reply_markup;\n let replyMarkupRows = replyMarkup?._ === 'replyInlineMarkup' && replyMarkup.rows;\n if(replyMarkupRows) {\n replyMarkupRows = replyMarkupRows.filter((row) => row.buttons.length);\n }\n\n if(replyMarkupRows) {\n const containerDiv = document.createElement('div');\n containerDiv.classList.add('reply-markup');\n replyMarkupRows.forEach((row) => {\n const buttons = row.buttons;\n\n const rowDiv = document.createElement('div');\n rowDiv.classList.add('reply-markup-row');\n\n buttons.forEach((button) => {\n let text: DocumentFragment | HTMLElement | string = wrapRichText(button.text, {noLinks: true, noLinebreaks: true});\n\n let buttonEl: HTMLButtonElement | HTMLAnchorElement;\n\n switch(button._) {\n case 'keyboardButtonUrl': {\n const r = wrapRichText(' ', {\n entities: [{\n _: 'messageEntityTextUrl',\n length: 1,\n offset: 0,\n url: button.url\n }]\n });\n\n buttonEl = htmlToDocumentFragment(r).firstElementChild as HTMLAnchorElement;\n buttonEl.classList.add('is-link');\n\n break;\n }\n\n case 'keyboardButtonSwitchInline': {\n buttonEl = document.createElement('button');\n buttonEl.classList.add('is-switch-inline');\n attachClickEvent(buttonEl, (e) => {\n cancelEvent(e);\n\n const botId = message.viaBotId || message.fromId;\n let promise: Promise;\n if(button.pFlags.same_peer) promise = Promise.resolve(this.peerId);\n else promise = this.managers.appInlineBotsManager.checkSwitchReturn(botId).then((peerId) => {\n if(peerId) {\n return peerId;\n }\n\n return new Promise((resolve, reject) => {\n const popup = new PopupForward({\n [this.peerId]: []\n }, (peerId) => {\n resolve(peerId);\n }, true);\n\n popup.addEventListener('close', () => {\n reject();\n });\n });\n });\n\n promise.then((peerId) => {\n const threadId = this.peerId === peerId ? this.chat.threadId : undefined;\n this.chat.appImManager.setInnerPeer({peerId});\n this.managers.appInlineBotsManager.switchInlineQuery(peerId, threadId, botId, button.query);\n });\n });\n break;\n }\n\n case 'keyboardButtonBuy': {\n const mediaInvoice = messageMedia._ === 'messageMediaInvoice' ? messageMedia : undefined;\n if(mediaInvoice?.extended_media) {\n break;\n }\n\n buttonEl = document.createElement('button');\n buttonEl.classList.add('is-buy');\n\n if(mediaInvoice?.receipt_msg_id) {\n text = i18n('Message.ReplyActionButtonShowReceipt');\n }\n\n break;\n }\n\n case 'keyboardButtonUrlAuth': {\n buttonEl = document.createElement('button');\n buttonEl.classList.add('is-url-auth');\n\n const {peerId} = this;\n const {mid} = message;\n const {url, button_id} = button;\n\n attachClickEvent(buttonEl, () => {\n const toggle = toggleDisability([buttonEl], true);\n this.chat.appImManager.handleUrlAuth({\n peerId,\n mid,\n url,\n buttonId: button_id\n }).then(() => {\n toggle();\n });\n });\n break;\n }\n\n default: {\n buttonEl = document.createElement('button');\n break;\n }\n }\n\n if(!buttonEl) {\n return;\n }\n\n buttonEl.classList.add('reply-markup-button', 'rp', 'tgico');\n const t = document.createElement('span');\n t.classList.add('reply-markup-button-text');\n if(typeof(text) === 'string') {\n t.insertAdjacentHTML('beforeend', text);\n } else {\n t.append(text);\n }\n\n ripple(buttonEl);\n buttonEl.append(t);\n\n rowDiv.append(buttonEl);\n });\n\n if(!rowDiv.childElementCount) {\n return;\n }\n\n containerDiv.append(rowDiv);\n });\n\n const haveButtons = !!containerDiv.childElementCount;\n\n haveButtons && attachClickEvent(containerDiv, (e) => {\n let target = e.target as HTMLElement;\n\n if(!target.classList.contains('reply-markup-button')) target = findUpClassName(target, 'reply-markup-button');\n if(\n !target ||\n target.classList.contains('is-link') ||\n target.classList.contains('is-switch-inline') ||\n target.classList.contains('is-buy') ||\n target.classList.contains('is-url-auth')\n ) return;\n\n cancelEvent(e);\n\n const column = whichChild(target);\n const row = replyMarkupRows[whichChild(target.parentElement)];\n\n if(!row.buttons || !row.buttons[column]) {\n this.log.warn('no such button', row, column, message);\n return;\n }\n\n const button = row.buttons[column];\n this.managers.appInlineBotsManager.callbackButtonClick(this.peerId, message.mid, button).then((callbackAnswer) => {\n if(typeof callbackAnswer.message === 'string' && callbackAnswer.message.length) {\n toast(wrapRichText(callbackAnswer.message, {noLinks: true, noLinebreaks: true}));\n }\n\n // console.log('callbackButtonClick callbackAnswer:', callbackAnswer);\n });\n });\n\n if(haveButtons) {\n // canHaveTail = false;\n bubble.classList.add('with-reply-markup');\n contentWrapper.append(containerDiv);\n }\n }\n\n const isOutgoing = message.pFlags.is_outgoing/* && this.peerId !== rootScope.myId */;\n if(our) {\n if(message.pFlags.unread || isOutgoing) this.unreadOut.add(message.mid);\n let status = '';\n if(message.error) status = 'is-error';\n else if(isOutgoing) status = 'is-sending';\n else status = message.pFlags.unread || (message as Message.message).pFlags.is_scheduled ? 'is-sent' : 'is-read';\n bubble.classList.add(status);\n }\n\n if(isOutgoing && !message.error) {\n bubble.classList.add('is-outgoing');\n }\n\n const messageWithReplies = isMessage && await this.managers.appMessagesManager.getMessageWithCommentReplies(message);\n const withReplies = !!messageWithReplies && message.mid > 0;\n\n if(withReplies) {\n bubble.classList.add('with-replies');\n }\n\n const fwdFrom = isMessage && message.fwd_from;\n const fwdFromId = isMessage && message.fwdFromId;\n\n const isOut = this.chat.isOutMessage(message);\n let nameContainer: HTMLElement = bubbleContainer;\n\n const canHideNameIfMedia = !message.viaBotId && (message.fromId === rootScope.myId || !message.pFlags.out);\n\n const isMessageEmpty = !messageMessage/* && (!topicNameButtonContainer || isStandaloneMedia) */;\n\n let viewButton: HTMLAnchorElement;\n // media\n if(messageMedia/* && messageMedia._ === 'messageMediaPhoto' */) {\n attachmentDiv = document.createElement('div');\n attachmentDiv.classList.add('attachment');\n\n if(isMessageEmpty) {\n bubble.classList.add('is-message-empty');\n }\n\n let processingWebPage = false;\n\n /* if(isMessage) */switch(messageMedia._) {\n case 'messageMediaPhoto': {\n const photo = messageMedia.photo;\n // //////this.log('messageMediaPhoto', photo);\n\n if(isMessageEmpty) {\n canHaveTail = false;\n }\n\n if(canHideNameIfMedia) {\n bubble.classList.add('hide-name');\n }\n\n bubble.classList.add('photo');\n\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\n bubble.classList.add('is-album', 'is-grouped');\n wrapAlbum({\n messages: albumMessages,\n attachmentDiv,\n middleware: this.getMiddleware(),\n isOut: our,\n lazyLoadQueue: this.lazyLoadQueue,\n chat: this.chat,\n loadPromises,\n autoDownload: this.chat.autoDownload\n });\n\n break;\n }\n\n const withTail = !IS_ANDROID && canHaveTail && !withReplies && USE_MEDIA_TAILS;\n if(withTail) bubble.classList.add('with-media-tail');\n const p = wrapPhoto({\n photo: photo as Photo.photo,\n message,\n container: attachmentDiv,\n withTail,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware: this.getMiddleware(),\n loadPromises,\n autoDownloadSize: this.chat.autoDownload.photo\n });\n\n if(messageMedia.pFlags.spoiler) {\n loadPromises.push(this.wrapMediaSpoiler({\n media: photo as Photo.photo,\n promise: p,\n middleware,\n attachmentDiv\n }));\n }\n\n break;\n }\n\n case 'messageMediaWebPage': {\n processingWebPage = true;\n\n const webPage: WebPage = messageMedia.webpage;\n // //////this.log('messageMediaWebPage', webpage);\n if(webPage._ !== 'webPage') {\n break;\n }\n\n const wrapped = wrapUrl(webPage.url);\n if(wrapped?.onclick === 'im') {\n const map: {[type: string]: LangPackKey} = {\n telegram_channel: 'Chat.Message.ViewChannel',\n telegram_megagroup: 'OpenGroup',\n telegram_bot: 'Chat.Message.ViewBot'\n };\n\n const langPackKey = map[webPage.type] || 'OpenMessage';\n viewButton = this.makeViewButton({text: langPackKey, asLink: true});\n viewButton.href = wrapped.url;\n viewButton.setAttribute('onclick', `${wrapped.onclick}(this)`);\n }\n\n bubble.classList.add('webpage');\n\n const box = document.createElement('div');\n box.classList.add('web');\n\n const quote = document.createElement('div');\n quote.classList.add('quote');\n\n let previewResizer: HTMLDivElement, preview: HTMLDivElement;\n const photo: Photo.photo = webPage.photo as any;\n if(photo || webPage.document) {\n previewResizer = document.createElement('div');\n previewResizer.classList.add('preview-resizer');\n preview = document.createElement('div');\n preview.classList.add('preview');\n previewResizer.append(preview);\n }\n\n const quoteTextDiv = document.createElement('div');\n quoteTextDiv.classList.add('quote-text');\n\n const doc = webPage.document as MyDocument;\n if(doc) {\n if(doc.type === 'gif' || doc.type === 'video' || doc.type === 'round') {\n // if(doc.size <= 20e6) {\n const mediaSize = doc.type === 'round' ? mediaSizes.active.round : mediaSizes.active.webpage;\n if(doc.type === 'round') {\n bubble.classList.add('round');\n preview.classList.add('is-round');\n } else {\n bubble.classList.add('video');\n }\n wrapVideo({\n doc,\n container: preview,\n message: message as Message.message,\n boxWidth: mediaSize.width,\n boxHeight: mediaSize.height,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware: this.getMiddleware(),\n isOut,\n group: this.chat.animationGroup,\n loadPromises,\n autoDownload: this.chat.autoDownload,\n noInfo: message.mid < 0\n });\n // }\n } else {\n const docDiv = await wrapDocument({\n message: message as Message.message,\n autoDownloadSize: this.chat.autoDownload.file,\n lazyLoadQueue: this.lazyLoadQueue,\n loadPromises,\n sizeType: 'documentName',\n searchContext: {\n useSearch: false,\n peerId: this.peerId,\n inputFilter: {\n _: 'inputMessagesFilterEmpty'\n }\n },\n fontSize: rootScope.settings.messagesTextSize\n });\n preview.append(docDiv);\n preview.classList.add('preview-with-document');\n quoteTextDiv.classList.add('has-document');\n // messageDiv.classList.add((webpage.type || 'document') + '-message');\n // doc = null;\n }\n }\n\n if(previewResizer) {\n quoteTextDiv.append(previewResizer);\n }\n\n let t: HTMLElement;\n if(webPage.site_name) {\n const html = wrapRichText(webPage.url);\n const a: HTMLAnchorElement = htmlToDocumentFragment(html).firstElementChild as any;\n a.classList.add('webpage-name');\n const strong = document.createElement('strong');\n setInnerHTML(strong, wrapEmojiText(webPage.site_name));\n a.textContent = '';\n a.append(strong);\n quoteTextDiv.append(a);\n t = a;\n }\n\n const title = wrapWebPageTitle(webPage);\n if(title.textContent) {\n const titleDiv = document.createElement('div');\n titleDiv.classList.add('title');\n const strong = document.createElement('strong');\n setInnerHTML(strong, title);\n titleDiv.append(strong);\n quoteTextDiv.append(titleDiv);\n t = titleDiv;\n }\n\n const description = wrapWebPageDescription(webPage);\n if(description.textContent) {\n const textDiv = document.createElement('div');\n textDiv.classList.add('text');\n setInnerHTML(textDiv, description);\n quoteTextDiv.append(textDiv);\n t = textDiv;\n }\n\n /* if(t) {\n t.append(timeSpan);\n } else {\n box.classList.add('no-text');\n } */\n\n quote.append(quoteTextDiv);\n\n if(photo && !doc) {\n bubble.classList.add('photo');\n\n const size: PhotoSize.photoSize = photo.sizes[photo.sizes.length - 1] as any;\n let isSquare = false;\n if(size.w === size.h && t) {\n bubble.classList.add('is-square-photo');\n isSquare = true;\n setAttachmentSize(photo, preview, 48, 48, false);\n\n /* if(t) {\n t.append(timeSpan);\n } */\n } else if(size.h > size.w) {\n bubble.classList.add('is-vertical-photo');\n }\n\n wrapPhoto({\n photo,\n message,\n container: preview,\n boxWidth: isSquare ? 0 : mediaSizes.active.webpage.width,\n boxHeight: isSquare ? 0 : mediaSizes.active.webpage.height,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware: this.getMiddleware(),\n loadPromises,\n withoutPreloader: isSquare,\n autoDownloadSize: this.chat.autoDownload.photo\n });\n }\n\n box.append(quote);\n\n // bubble.prepend(box);\n // if(timeSpan.parentElement === messageDiv) {\n messageDiv.insertBefore(box, timeSpan);\n // } else {\n // messageDiv.append(box);\n // }\n\n // this.log('night running', bubble.scrollHeight);\n\n break;\n }\n\n case 'messageMediaDocument': {\n const doc = messageMedia.document as MyDocument;\n\n // this.log('messageMediaDocument', doc, bubble);\n\n if(doc.sticker/* && doc.size <= 1e6 */) {\n bubble.classList.add('sticker');\n canHaveTail = false;\n isStandaloneMedia = true;\n\n if(doc.animated) {\n bubble.classList.add('sticker-animated');\n }\n\n const sizes = mediaSizes.active;\n const isEmoji = bubble.classList.contains('emoji-big');\n const boxSize = isEmoji ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\n setAttachmentSize(doc, attachmentDiv, boxSize.width, boxSize.height);\n // let preloader = new ProgressivePreloader(attachmentDiv, false);\n bubbleContainer.style.minWidth = attachmentDiv.style.width;\n bubbleContainer.style.minHeight = attachmentDiv.style.height;\n // appPhotosManager.setAttachmentSize(doc, bubble);\n wrapSticker({\n doc,\n div: attachmentDiv,\n middleware,\n lazyLoadQueue: this.lazyLoadQueue,\n group: this.chat.animationGroup,\n // play: !!message.pending || !multipleRender,\n play: true,\n loop: true,\n emoji: isEmoji ? messageMessage : undefined,\n withThumb: true,\n loadPromises,\n isOut,\n noPremium: messageMedia?.pFlags?.nopremium\n });\n\n if((getStickerEffectThumb(doc) || isEmoji) && (isInUnread || isOutgoing)/* || true */) {\n this.observer.observe(bubble, this.stickerEffectObserverCallback);\n }\n } else if(doc.type === 'video' || doc.type === 'gif' || doc.type === 'round'/* && doc.size <= 20e6 */) {\n // this.log('never get free 2', doc);\n\n const isRound = doc.type === 'round';\n if(isRound) {\n isStandaloneMedia = true;\n }\n\n if(isRound || isMessageEmpty) {\n canHaveTail = false;\n }\n\n if(canHideNameIfMedia) {\n bubble.classList.add('hide-name');\n }\n\n bubble.classList.add(isRound ? 'round' : 'video');\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\n bubble.classList.add('is-album', 'is-grouped');\n\n wrapAlbum({\n messages: albumMessages,\n attachmentDiv,\n middleware,\n isOut: our,\n lazyLoadQueue: this.lazyLoadQueue,\n chat: this.chat,\n loadPromises,\n autoDownload: this.chat.autoDownload\n });\n } else {\n const withTail = !IS_ANDROID && !IS_APPLE && !isRound && canHaveTail && !withReplies && USE_MEDIA_TAILS;\n if(withTail) bubble.classList.add('with-media-tail');\n const p = wrapVideo({\n doc,\n container: attachmentDiv,\n message: message as Message.message,\n boxWidth: mediaSizes.active.regular.width,\n boxHeight: mediaSizes.active.regular.height,\n withTail,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n group: this.chat.animationGroup,\n loadPromises,\n autoDownload: this.chat.autoDownload,\n searchContext: isRound ? {\n peerId: this.peerId,\n inputFilter: {_: 'inputMessagesFilterRoundVoice'},\n threadId: this.chat.threadId,\n useSearch: !(message as Message.message).pFlags.is_scheduled,\n isScheduled: (message as Message.message).pFlags.is_scheduled\n } : undefined,\n noInfo: message.mid < 0,\n noAutoplayAttribute: !!messageMedia.pFlags.spoiler\n });\n\n if(messageMedia.pFlags.spoiler) {\n loadPromises.push(this.wrapMediaSpoiler({\n media: doc,\n promise: p,\n middleware,\n attachmentDiv\n }));\n }\n }\n } else {\n const newNameContainer = await wrapGroupedDocuments({\n albumMustBeRenderedFull,\n message,\n bubble,\n messageDiv,\n chat: this.chat,\n loadPromises,\n autoDownloadSize: this.chat.autoDownload.file,\n lazyLoadQueue: this.lazyLoadQueue,\n searchContext: doc.type === 'voice' || doc.type === 'audio' ? {\n peerId: this.peerId,\n inputFilter: {_: doc.type === 'voice' ? 'inputMessagesFilterRoundVoice' : 'inputMessagesFilterMusic'},\n threadId: this.chat.threadId,\n useSearch: !(message as Message.message).pFlags.is_scheduled,\n isScheduled: (message as Message.message).pFlags.is_scheduled\n } : undefined,\n sizeType: 'documentName',\n fontSize: rootScope.settings.messagesTextSize,\n richTextFragment: richText\n });\n\n if(newNameContainer) {\n nameContainer = newNameContainer;\n }\n\n const lastContainer = messageDiv.lastElementChild.querySelector('.document-message, .document, .audio');\n // lastContainer && lastContainer.append(timeSpan.cloneNode(true));\n lastContainer && lastContainer.append(timeSpan);\n\n bubble.classList.remove('is-message-empty');\n messageDiv.classList.add((!(['photo', 'pdf'] as MyDocument['type'][]).includes(doc.type) ? doc.type || 'document' : 'document') + '-message');\n processingWebPage = true;\n }\n\n break;\n }\n\n case 'messageMediaCall': {\n const action = messageMedia.action;\n const div = document.createElement('div');\n div.classList.add('bubble-call', action.pFlags.video ? 'tgico-videocamera' : 'tgico-phone');\n\n const type: CallType = action.pFlags.video ? 'video' : 'voice';\n div.dataset.type = type;\n\n const title = document.createElement('div');\n title.classList.add('bubble-call-title');\n\n _i18n(title, isOut ?\n (action.pFlags.video ? 'CallMessageVideoOutgoing' : 'CallMessageOutgoing') :\n (action.pFlags.video ? 'CallMessageVideoIncoming' : 'CallMessageIncoming'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('bubble-call-subtitle');\n\n if(action.duration !== undefined) {\n subtitle.append(formatCallDuration(action.duration));\n } else {\n let langPackKey: LangPackKey;\n switch(action.reason._) {\n case 'phoneCallDiscardReasonBusy':\n langPackKey = 'Call.StatusBusy';\n break;\n case 'phoneCallDiscardReasonMissed':\n langPackKey = 'Chat.Service.Call.Missed';\n break;\n // case 'phoneCallDiscardReasonHangup':\n default:\n langPackKey = 'Chat.Service.Call.Cancelled';\n break;\n }\n\n subtitle.classList.add('is-reason');\n _i18n(subtitle, langPackKey);\n }\n\n subtitle.classList.add('tgico', 'arrow-' + (action.duration !== undefined ? 'green' : 'red'));\n\n div.append(title, subtitle);\n\n processingWebPage = true;\n\n bubble.classList.remove('is-message-empty');\n messageDiv.classList.add('call-message');\n messageDiv.append(div);\n\n break;\n }\n\n case 'messageMediaContact': {\n // this.log('wrapping contact', message);\n\n const contact = messageMedia;\n const contactDiv = document.createElement('div');\n contactDiv.classList.add('contact');\n contactDiv.dataset.peerId = '' + contact.user_id;\n\n processingWebPage = true;\n\n const contactDetails = document.createElement('div');\n contactDetails.className = 'contact-details';\n const contactNameDiv = document.createElement('div');\n contactNameDiv.className = 'contact-name';\n contactNameDiv.append(\n wrapEmojiText([\n contact.first_name,\n contact.last_name\n ].filter(Boolean).join(' '))\n );\n\n const contactNumberDiv = document.createElement('div');\n contactNumberDiv.className = 'contact-number';\n contactNumberDiv.textContent = contact.phone_number ? '+' + formatPhoneNumber(contact.phone_number).formatted : 'Unknown phone number';\n\n contactDiv.append(contactDetails);\n contactDetails.append(contactNameDiv, contactNumberDiv);\n\n const avatarElem = new AvatarElement();\n avatarElem.updateWithOptions({\n lazyLoadQueue: this.lazyLoadQueue,\n peerId: contact.user_id.toPeerId()\n });\n avatarElem.classList.add('contact-avatar', 'avatar-54');\n\n contactDiv.prepend(avatarElem);\n\n bubble.classList.remove('is-message-empty');\n messageDiv.classList.add('contact-message');\n messageDiv.append(contactDiv);\n\n break;\n }\n\n case 'messageMediaPoll': {\n bubble.classList.remove('is-message-empty');\n\n const pollElement = wrapPoll(message);\n messageDiv.prepend(pollElement);\n messageDiv.classList.add('poll-message');\n\n break;\n }\n\n case 'messageMediaInvoice': {\n const isTest = messageMedia.pFlags.test;\n const extendedMedia = messageMedia.extended_media;\n const isAlreadyPaid = extendedMedia?._ === 'messageExtendedMedia';\n const isNotPaid = extendedMedia?._ === 'messageExtendedMediaPreview';\n let innerMedia = isAlreadyPaid ?\n (extendedMedia.media as MessageMedia.messageMediaPhoto).photo as Photo.photo ||\n (extendedMedia.media as MessageMedia.messageMediaDocument).document as Document.document :\n messageMedia.photo;\n\n const wrappedPrice = paymentsWrapCurrencyAmount(messageMedia.total_amount, messageMedia.currency);\n let priceEl: HTMLElement;\n if(!extendedMedia) {\n priceEl = document.createElement(innerMedia ? 'span' : 'div');\n const f = document.createDocumentFragment();\n const l = i18n(messageMedia.receipt_msg_id ? 'PaymentReceipt' : (isTest ? 'PaymentTestInvoice' : 'PaymentInvoice'));\n l.classList.add('text-uppercase');\n const joiner = ' ' + NBSP;\n const p = document.createElement('span');\n p.classList.add('text-bold');\n p.textContent = wrappedPrice + joiner;\n f.append(p, l);\n if(isTest && messageMedia.receipt_msg_id) {\n const a = document.createElement('span');\n a.classList.add('text-uppercase', 'pre-wrap');\n a.append(joiner + '(Test)');\n f.append(a);\n }\n setInnerHTML(priceEl, f);\n } else if(isNotPaid) {\n priceEl = document.createElement('span');\n priceEl.classList.add('extended-media-buy', 'tgico-premium_lock');\n attachmentDiv.classList.add('is-buy');\n _i18n(priceEl, 'Checkout.PayPrice', [wrappedPrice]);\n\n if(extendedMedia.video_duration !== undefined) {\n const videoTime = document.createElement('span');\n videoTime.classList.add('video-time');\n videoTime.textContent = toHHMMSS(extendedMedia.video_duration, false);\n attachmentDiv.append(videoTime);\n }\n }\n\n if(isNotPaid) {\n (extendedMedia.thumb as PhotoSize.photoStrippedSize).w = extendedMedia.w;\n (extendedMedia.thumb as PhotoSize.photoStrippedSize).h = extendedMedia.h;\n innerMedia = {\n _: 'photo',\n access_hash: '',\n pFlags: {},\n date: 0,\n dc_id: 0,\n file_reference: [],\n id: 0,\n sizes: [extendedMedia.thumb]\n };\n }\n\n if(innerMedia) {\n const mediaSize = extendedMedia ? mediaSizes.active.extendedInvoice : mediaSizes.active.invoice;\n if(innerMedia._ === 'document') {\n wrapVideo({\n doc: innerMedia,\n container: attachmentDiv,\n withTail: false,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n loadPromises,\n boxWidth: mediaSize.width,\n boxHeight: mediaSize.height,\n group: this.chat.animationGroup,\n message: message as Message.message\n });\n bubble.classList.add('video');\n } else {\n wrapPhoto({\n photo: innerMedia,\n container: attachmentDiv,\n withTail: false,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n loadPromises,\n boxWidth: mediaSize.width,\n boxHeight: mediaSize.height,\n message: isAlreadyPaid ? message : undefined\n });\n bubble.classList.add('photo');\n }\n\n if(priceEl) {\n if(!extendedMedia) {\n priceEl.classList.add('video-time');\n }\n\n attachmentDiv.append(priceEl);\n }\n } else {\n attachmentDiv = undefined;\n }\n\n if(isNotPaid) {\n const {mid} = message;\n this.extendedMediaMessages.add(mid);\n middleware.onClean(() => {\n this.extendedMediaMessages.delete(mid);\n });\n this.setExtendedMediaMessagesPollInterval();\n\n const {width, height} = attachmentDiv.style;\n const dotRenderer = DotRenderer.create({\n width: parseInt(width),\n height: parseInt(height),\n middleware,\n animationGroup: this.chat.animationGroup\n });\n attachmentDiv.append(dotRenderer.canvas);\n }\n\n let titleDiv: HTMLElement;\n if(!extendedMedia) {\n titleDiv = document.createElement('div');\n titleDiv.classList.add('bubble-primary-color');\n setInnerHTML(titleDiv, wrapEmojiText(messageMedia.title));\n }\n\n const richText = isAlreadyPaid ? undefined : wrapEmojiText(messageMedia.description);\n messageDiv.prepend(...[titleDiv, !innerMedia && priceEl, richText].filter(Boolean));\n\n if(!richText) canHaveTail = false;\n else bubble.classList.remove('is-message-empty');\n bubble.classList.add('is-invoice');\n\n break;\n }\n\n default:\n attachmentDiv = undefined;\n bubble.classList.remove('is-message-empty');\n messageDiv.append(i18n(UNSUPPORTED_LANG_PACK_KEY), timeSpan);\n this.log.warn('unrecognized media type:', messageMedia._, message);\n break;\n }\n\n if(!processingWebPage && attachmentDiv) {\n bubbleContainer.append(attachmentDiv);\n }\n\n /* if(bubble.classList.contains('is-message-empty') && (bubble.classList.contains('photo') || bubble.classList.contains('video'))) {\n bubble.classList.add('no-tail');\n\n if(!bubble.classList.contains('with-media-tail')) {\n bubble.classList.add('use-border-radius');\n }\n } */\n }\n\n if(isStandaloneMedia) {\n bubble.classList.add('just-media');\n }\n\n if(viewButton) {\n timeSpan.before(viewButton);\n // messageDiv.append(viewButton);\n }\n\n let savedFrom = '';\n\n // const needName = ((peerId.isAnyChat() && (peerId !== message.fromId || our)) && message.fromId !== rootScope.myId) || message.viaBotId;\n const needName = (message.fromId !== rootScope.myId && this.chat.isAnyGroup) || message.viaBotId || (message as Message.message).pFlags.sponsored;\n if(needName || fwdFrom || message.reply_to_mid || topicNameButtonContainer) { // chat\n let title: HTMLElement | DocumentFragment;\n let titleVia: typeof title;\n\n const isForwardFromChannel = message.from_id?._ === 'peerChannel' && message.fromId === fwdFromId;\n\n const mustHaveName = !!(message.viaBotId/* || topicNameButtonContainer */);\n const isHidden = fwdFrom && !fwdFrom.from_id;\n if(message.viaBotId) {\n titleVia = document.createElement('span');\n titleVia.innerText = '@' + (await this.managers.appPeersManager.getPeerUsername(message.viaBotId));\n titleVia.classList.add('peer-title');\n }\n\n if(mustHaveName) {\n bubble.classList.add('must-have-name');\n }\n\n const isForward = fwdFromId || fwdFrom;\n if(isHidden) {\n // /////this.log('message to render hidden', message);\n title = document.createElement('span');\n setInnerHTML(title, wrapEmojiText(fwdFrom.from_name));\n title.classList.add('peer-title');\n // title = fwdFrom.from_name;\n bubble.classList.add('hidden-profile');\n } else {\n title = new PeerTitle({peerId: fwdFromId || message.fromId, withPremiumIcon: !isForward, wrapOptions}).element;\n }\n\n let replyContainer: HTMLElement;\n if(\n isMessage &&\n message.reply_to_mid &&\n message.reply_to_mid !== this.chat.threadId &&\n (!this.chat.isAllMessagesForum || message.reply_to.reply_to_top_id)\n ) {\n replyContainer = await MessageRender.setReply({\n chat: this.chat,\n bubble,\n bubbleContainer,\n message\n });\n }\n\n // this.log(title);\n\n let nameDiv: HTMLElement;\n if(isForward) {\n if(this.peerId !== rootScope.myId && !isForwardFromChannel) {\n bubble.classList.add('forwarded');\n }\n\n if(message.savedFrom) {\n savedFrom = message.savedFrom;\n title.dataset.savedFrom = savedFrom;\n }\n\n nameDiv = document.createElement('div');\n title.dataset.peerId = '' + fwdFromId;\n\n if((this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || isForwardFromChannel) && !isStandaloneMedia) {\n nameDiv.style.color = getPeerColorById(fwdFromId, false);\n nameDiv.classList.add('colored-name');\n nameDiv.append(title);\n } else {\n /* const fromTitle = message.fromId === this.myID || appPeersManager.isBroadcast(fwdFromId || message.fromId) ? '' : `
${appPeersManager.getPeerTitle(message.fromId)}
`;\n nameDiv.innerHTML = fromTitle + 'Forwarded from ' + title; */\n const args: FormatterArguments = [title];\n if(isStandaloneMedia) {\n const br = document.createElement('br');\n br.classList.add('hide-ol');\n args.unshift(br);\n }\n nameDiv.append(i18n('ForwardedFrom', [args]));\n }\n } else if(!message.viaBotId) {\n if(!isStandaloneMedia && needName) {\n nameDiv = document.createElement('div');\n nameDiv.append(title);\n\n const peer = await this.managers.appPeersManager.getPeer(message.fromId);\n const pFlags = (peer as User.user)?.pFlags;\n if(pFlags && (pFlags.scam || pFlags.fake)) {\n nameDiv.append(generateFakeIcon(pFlags.scam));\n }\n\n if(!our) {\n nameDiv.style.color = getPeerColorById(message.fromId, false);\n nameDiv.classList.add('colored-name');\n }\n\n nameDiv.dataset.peerId = '' + message.fromId;\n } else /* if(!message.reply_to_mid) */ {\n bubble.classList.add('hide-name');\n }\n }\n\n if(message.viaBotId) {\n if(!nameDiv) {\n nameDiv = document.createElement('div');\n } else {\n nameDiv.append(' ');\n }\n\n const span = document.createElement('span');\n span.append(i18n('ViaBot'), ' ', titleVia);\n span.classList.add('is-via');\n\n nameDiv.append(span);\n }\n\n if(topicNameButtonContainer) {\n if(isStandaloneMedia) {\n topicNameButtonContainer.classList.add('floating-part');\n } else {\n if(!nameDiv) {\n nameDiv = document.createElement('div');\n }\n\n nameDiv.append(topicNameButtonContainer);\n\n bubble.classList.remove('hide-name');\n }\n }\n\n if(nameDiv) {\n nameDiv.classList.add('name');\n\n if(isStandaloneMedia) {\n nameContainer.append(nameContainer = document.createElement('div'));\n nameContainer.classList.add('name-with-reply', 'floating-part');\n } else {\n nameDiv.classList.add('floating-part');\n }\n\n nameContainer.append(nameDiv);\n\n if(isStandaloneMedia && replyContainer) {\n nameContainer.append(replyContainer);\n }\n } else if(isStandaloneMedia && replyContainer) {\n replyContainer.classList.add('floating-part');\n }\n\n if(topicNameButtonContainer && isStandaloneMedia) {\n if(!attachmentDiv) {\n this.log.error('no attachment div?', bubble, message);\n debugger;\n } else {\n attachmentDiv.after(topicNameButtonContainer);\n }\n }\n } else {\n bubble.classList.add('hide-name');\n }\n\n if(this.chat.type === 'pinned') {\n savedFrom = `${this.chat.peerId}_${message.mid}`;\n }\n\n const isThreadStarter = messageWithReplies && messageWithReplies.mid === this.chat.threadId;\n if(isThreadStarter) {\n bubble.classList.add('is-thread-starter', 'is-group-last');\n }\n\n if(savedFrom && (this.chat.type === 'pinned' || fwdFrom.saved_from_msg_id) && this.peerId !== REPLIES_PEER_ID) {\n const goto = document.createElement('div');\n goto.classList.add('bubble-beside-button', 'goto-original', 'tgico-arrow_next');\n bubbleContainer.append(goto);\n bubble.dataset.savedFrom = savedFrom;\n bubble.classList.add('with-beside-button');\n }\n\n bubble.classList.add(isOut ? 'is-out' : 'is-in');\n\n if(withReplies) {\n const isFooter = MessageRender.renderReplies({\n bubble,\n bubbleContainer,\n message: messageWithReplies,\n messageDiv,\n loadPromises,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n if(isFooter) {\n canHaveTail = true;\n } else {\n bubble.classList.add('with-beside-replies');\n }\n }\n\n if(isMessage) {\n this.appendReactionsElementToBubble(bubble, message, reactionsMessage);\n }\n\n /* if(isMessage) {\n const reactionHover = document.createElement('div');\n reactionHover.classList.add('bubble-reaction-hover');\n contentWrapper.append(reactionHover);\n } */\n\n if(canHaveTail) {\n bubble.classList.add('can-have-tail');\n\n bubbleContainer.append(generateTail());\n }\n\n return ret;\n }\n\n private appendReactionsElementToBubble(\n bubble: HTMLElement,\n message: Message.message,\n reactionsMessage: Message.message,\n changedResults?: ReactionCount[]\n ) {\n if(this.peerId.isUser() && USER_REACTIONS_INLINE/* || true */) {\n return;\n }\n\n if(!reactionsMessage?.reactions || !reactionsMessage.reactions.results.length) {\n return;\n }\n\n // message = this.appMessagesManager.getMessageWithReactions(message);\n\n const reactionsElement = new ReactionsElement();\n reactionsElement.init(reactionsMessage, 'block', bubble.middlewareHelper.get());\n reactionsElement.render(changedResults);\n\n if(bubble.classList.contains('is-message-empty')) {\n bubble.querySelector('.bubble-content-wrapper').append(reactionsElement);\n } else {\n const messageDiv = bubble.querySelector('.message');\n if(bubble.classList.contains('is-multiple-documents')) {\n const documentContainer = messageDiv.lastElementChild as HTMLElement;\n let documentMessageDiv = documentContainer.querySelector('.document-message');\n\n let timeSpan: HTMLElement = documentMessageDiv && documentMessageDiv.querySelector('.time');\n if(!timeSpan) {\n timeSpan = MessageRender.setTime({\n chatType: this.chat.type,\n message,\n reactionsMessage\n });\n }\n\n reactionsElement.append(timeSpan);\n\n if(!documentMessageDiv) {\n documentMessageDiv = document.createElement('div');\n documentMessageDiv.classList.add('document-message');\n documentContainer.querySelector('.document-wrapper').prepend(documentMessageDiv);\n }\n\n documentMessageDiv.append(reactionsElement);\n } else {\n const timeSpan = Array.from(bubble.querySelectorAll('.time')).pop();\n reactionsElement.append(timeSpan);\n\n messageDiv.append(reactionsElement);\n }\n }\n }\n\n private prepareToSaveScroll(reverse?: boolean) {\n const isMounted = !!this.chatInner.parentElement;\n if(!isMounted) {\n return {};\n }\n\n const log = this.log.bindPrefix('prepareToSaveScroll');\n log('save');\n const scrollSaver = this.createScrollSaver(reverse);\n scrollSaver.save(); // * let's save scroll position by point before the slicing, not after\n\n if(this.getRenderedLength() && !this.chat.setPeerPromise) {\n const viewportSlice = this.getViewportSlice();\n this.deleteViewportSlice(viewportSlice, true);\n }\n\n // scrollSaver.save(); // ! slicing will corrupt scroll position\n // const saved = scrollSaver.getSaved();\n // const hadScroll = saved.scrollHeight !== saved.clientHeight;\n\n return {\n restoreScroll: () => {\n log('restore');\n // scrollSaver.restore(_history.length === 1 && !reverse ? false : true);\n scrollSaver.restore(reverse);\n this.onRenderScrollSet(scrollSaver.getSaved());\n },\n scrollSaver\n };\n }\n\n public async performHistoryResult(\n historyResult: HistoryResult | {history: (Message.message | Message.messageService | number)[]},\n reverse: boolean\n ) {\n const log = false ? this.log.bindPrefix('perform-' + (Math.random() * 1000 | 0)) : undefined;\n log?.('start', this.chatInner.parentElement);\n\n let history = historyResult.history;\n history = history.slice(); // need\n\n if(this.needReflowScroll) {\n reflowScrollableElement(this.scrollable.container);\n this.needReflowScroll = false;\n }\n\n const cb = (message: Message.message | Message.messageService) => {\n if(!message) {\n return;\n } else if(message.pFlags.local) {\n return this.processLocalMessageRender(message);\n } else {\n return this.safeRenderMessage(message, reverse);\n }\n };\n\n const messages = await Promise.all(history.map((mid) => {\n return typeof(mid) === 'number' ? this.chat.getMessage(mid) : mid;\n }));\n\n const setLoadedPromises: Promise[] = [];\n if(!this.scrollable.loadedAll['bottom'] || !this.scrollable.loadedAll['top']) {\n let isEnd = (historyResult as HistoryResult).isEnd;\n if(!isEnd) {\n const historyStorage = await this.chat.getHistoryStorage();\n const firstSlice = historyStorage.history.first;\n const lastSlice = historyStorage.history.last;\n isEnd = {top: false, bottom: false, both: false};\n if(firstSlice.isEnd(SliceEnd.Bottom) && (!firstSlice.length || history.includes(firstSlice[0]))) {\n isEnd.bottom = true;\n }\n\n if(lastSlice.isEnd(SliceEnd.Top) && (!lastSlice.length || history.includes(lastSlice[lastSlice.length - 1]))) {\n isEnd.top = true;\n }\n }\n\n if(!isEnd.bottom && this.setPeerOptions) {\n const {lastMsgId, topMessage} = this.setPeerOptions;\n this.setPeerOptions = undefined;\n if(!lastMsgId || this.bubbles[topMessage] || lastMsgId === topMessage) {\n isEnd.bottom = true;\n }\n }\n\n if(isEnd.top) setLoadedPromises.push(this.setLoaded('top', true));\n if(isEnd.bottom) setLoadedPromises.push(this.setLoaded('bottom', true));\n }\n\n await Promise.all(setLoadedPromises);\n\n // ! it is important to insert bubbles to group reversed way\n // const length = history.length, promises: Promise[] = [];\n // if(reverse) for(let i = 0; i < length; ++i) promises.push(cb(messages[i]));\n // else for(let i = length - 1; i >= 0; --i) promises.push(cb(messages[i]));\n const promises = messages.map(cb);\n\n // cannot combine them into one promise\n await Promise.all(promises);\n await this.messagesQueuePromise;\n\n if(this.scrollable.loadedAll.top && this.messagesQueueOnRenderAdditional) {\n this.messagesQueueOnRenderAdditional();\n this.messagesQueueOnRenderAdditional?.(); // * can set it second time\n }\n\n log?.('performHistoryResult end');\n }\n\n private onRenderScrollSet(state?: {scrollHeight: number, clientHeight: number}) {\n const className = 'has-sticky-dates';\n if(!this.container.classList.contains(className)) {\n const isLoading = !this.preloader.detached;\n\n if(isLoading ||\n (\n state ??= {\n scrollHeight: this.scrollable.scrollHeight,\n clientHeight: this.scrollable.container.clientHeight\n },\n state.scrollHeight !== state.clientHeight\n )\n ) {\n /* for(const timestamp in this.dateMessages) {\n const dateMessage = this.dateMessages[timestamp];\n dateMessage.div.classList.add('is-sticky');\n } */\n\n const middleware = this.getMiddleware();\n const callback = () => {\n if(!middleware()) return;\n this.container.classList.add(className);\n };\n\n if(this.willScrollOnLoad) {\n callback();\n } else {\n setTimeout(callback, 600);\n }\n\n return;\n }\n }\n\n this.willScrollOnLoad = undefined;\n }\n\n public onDatePick = (timestamp: number) => {\n const peerId = this.peerId;\n this.managers.appMessagesManager.requestHistory(peerId, 0, 2, -1, timestamp, this.chat.threadId).then((history) => {\n if(!history?.messages?.length) {\n this.log.error('no history!');\n return;\n } else if(this.peerId !== peerId) {\n return;\n }\n\n this.chat.setMessageId((history.messages[0] as MyMessage).mid);\n // console.log('got history date:', history);\n });\n };\n\n public requestHistory(maxId: number, loadCount: number, backLimit: number) {\n // const middleware = this.getMiddleware();\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n return this.managers.acknowledged.appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit, this.chat.threadId);\n } else if(this.chat.type === 'pinned') {\n return this.managers.acknowledged.appMessagesManager.getSearch({\n peerId: this.peerId,\n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId,\n limit: loadCount,\n backLimit\n }).then((ackedResult) => {\n return {\n cached: ackedResult.cached,\n result: Promise.resolve(ackedResult.result).then((value) => {\n return {history: value.history.map((m) => m.mid)};\n })\n };\n });\n } else if(this.chat.type === 'scheduled') {\n return this.managers.acknowledged.appMessagesManager.getScheduledMessages(this.peerId).then((ackedResult) => {\n // this.setLoaded('top', true);\n // this.setLoaded('bottom', true);\n return {\n cached: ackedResult.cached,\n result: Promise.resolve(ackedResult.result).then((mids) => ({history: mids.slice().reverse()}))\n };\n });\n }\n }\n\n private async animateAsLadder(additionMsgId: number, additionMsgIds: number[], isAdditionRender: boolean, backLimit: number, maxId: number) {\n /* const middleware = this.getMiddleware();\n await this.ladderDeferred; */\n\n const log = this.log.bindPrefix('ladder');\n if(this.chat.setPeerPromise && !this.resolveLadderAnimation) {\n log.warn('will be delayed');\n // @ts-ignore\n this.resolveLadderAnimation = this.animateAsLadder.bind(this, additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\n return;\n }\n\n /* if(!middleware()) {\n return;\n } */\n\n if(!Object.keys(this.bubbles).length) {\n log.warn('no bubbles');\n return;\n }\n\n let sortedMids = getObjectKeysAndSort(this.bubbles, 'desc');\n\n if(isAdditionRender && additionMsgIds.length) {\n sortedMids = sortedMids.filter((mid) => !additionMsgIds.includes(mid));\n }\n\n let targetMid: number;\n if(backLimit) {\n targetMid = maxId || Math.max(...sortedMids); // * on discussion enter\n } else {\n if(additionMsgId) {\n targetMid = additionMsgId;\n } else { // * if maxId === 0\n targetMid = Math.max(...sortedMids);\n }\n }\n\n const topIds = sortedMids.slice(sortedMids.findIndex((mid) => targetMid > mid));\n const middleIds = isAdditionRender ? [] : [targetMid];\n const bottomIds = isAdditionRender ? [] : sortedMids.slice(0, sortedMids.findIndex((mid) => targetMid >= mid)).reverse();\n\n if(DEBUG) {\n log('targeting mid:', targetMid, maxId, additionMsgId,\n topIds.map((m) => getServerMessageId(m)),\n bottomIds.map((m) => getServerMessageId(m)));\n }\n\n const setBubbles: HTMLElement[] = [];\n\n this.chatInner.classList.add('zoom-fading');\n const delay = isAdditionRender ? 10 : 40;\n const offsetIndex = isAdditionRender ? 0 : 1;\n const animateAsLadder = (mids: number[], offsetIndex = 0) => {\n const animationPromise = deferredPromise();\n let lastMsDelay = 0;\n mids.forEach((mid, idx) => {\n const bubble = this.bubbles[mid];\n if(!bubble || this.skippedMids.has(mid)) {\n log.warn('no bubble by mid:', mid);\n return;\n }\n\n lastMsDelay = ((idx + offsetIndex) || 0.1) * delay;\n // lastMsDelay = (idx + offsetIndex) * delay;\n // lastMsDelay = (idx || 0.1) * 1000;\n\n const contentWrapper = bubble.lastElementChild as HTMLElement;\n const elementsToAnimate: HTMLElement[] = [contentWrapper];\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(item && item.group.avatar && item.group.lastItem === item) {\n elementsToAnimate.push(item.group.avatar);\n }\n\n elementsToAnimate.forEach((element) => {\n element.classList.add('zoom-fade', 'can-zoom-fade');\n element.style.transitionDelay = lastMsDelay + 'ms';\n });\n\n if(idx === (mids.length - 1)) {\n const onTransitionEnd = (e: TransitionEvent) => {\n if(e.target !== contentWrapper) {\n return;\n }\n\n animationPromise.resolve();\n contentWrapper.removeEventListener('transitionend', onTransitionEnd);\n };\n\n contentWrapper.addEventListener('transitionend', onTransitionEnd);\n }\n\n setBubbles.push(...elementsToAnimate);\n });\n\n if(!mids.length) {\n animationPromise.resolve();\n }\n\n return {lastMsDelay, animationPromise};\n };\n\n const topRes = animateAsLadder(topIds, offsetIndex);\n const middleRes = animateAsLadder(middleIds);\n const bottomRes = animateAsLadder(bottomIds, offsetIndex);\n const promises = [topRes.animationPromise, middleRes.animationPromise, bottomRes.animationPromise];\n const delays: number[] = [topRes.lastMsDelay, middleRes.lastMsDelay, bottomRes.lastMsDelay];\n\n if(this.onAnimateLadder) {\n await this.onAnimateLadder();\n }\n\n fastRaf(() => {\n this.setStickyDateManually(); // ! maybe it's not efficient\n\n setBubbles.forEach((element) => {\n element.classList.remove('zoom-fade');\n });\n });\n\n let promise: Promise;\n if(topIds.length || middleIds.length || bottomIds.length) {\n promise = Promise.all(promises);\n\n dispatchHeavyAnimationEvent(promise, Math.max(...delays) + 200) // * 200 - transition time\n .then(() => {\n fastRaf(() => {\n setBubbles.forEach((element) => {\n element.style.transitionDelay = '';\n element.classList.remove('can-zoom-fade');\n });\n\n this.chatInner.classList.remove('zoom-fading');\n });\n\n // ! в хроме, каким-то образом из-за zoom-fade класса начинает прыгать скролл при подгрузке сообщений вверх,\n // ! т.е. скролл не ставится, так же, как в сафари при translateZ на блок выше scrollable\n // if(!IS_SAFARI) {\n // this.needReflowScroll = true;\n // }\n });\n }\n\n return promise;\n }\n\n private async renderEmptyPlaceholder(\n type: 'group' | 'saved' | 'noMessages' | 'noScheduledMessages' | 'greeting' | 'restricted',\n bubble: HTMLElement,\n message: any,\n elements: (Node | string)[]\n ) {\n const BASE_CLASS = 'empty-bubble-placeholder';\n bubble.classList.add(BASE_CLASS, BASE_CLASS + '-' + type);\n\n let title: HTMLElement;\n if(type === 'group') title = i18n('GroupEmptyTitle1');\n else if(type === 'saved') title = i18n('ChatYourSelfTitle');\n else if(type === 'noMessages' || type === 'greeting') title = i18n('NoMessages');\n else if(type === 'noScheduledMessages') title = i18n('NoScheduledMessages');\n else if(type === 'restricted') {\n title = document.createElement('span');\n title.innerText = await this.managers.appPeersManager.getRestrictionReasonText(this.peerId);\n }\n title.classList.add('center', BASE_CLASS + '-title');\n\n elements.push(title);\n\n let listElements: HTMLElement[];\n if(type === 'group') {\n elements.push(i18n('GroupEmptyTitle2'));\n listElements = [\n i18n('GroupDescription1'),\n i18n('GroupDescription2'),\n i18n('GroupDescription3'),\n i18n('GroupDescription4')\n ];\n } else if(type === 'saved') {\n listElements = [\n i18n('ChatYourSelfDescription1'),\n i18n('ChatYourSelfDescription2'),\n i18n('ChatYourSelfDescription3'),\n i18n('ChatYourSelfDescription4')\n ];\n } else if(type === 'greeting') {\n const subtitle = i18n('NoMessagesGreetingsDescription');\n subtitle.classList.add('center', BASE_CLASS + '-subtitle');\n\n // findAndSplice(this.messagesQueue, q => q.bubble === bubble);\n\n const stickerDiv = document.createElement('div');\n stickerDiv.classList.add(BASE_CLASS + '-sticker');\n\n const middleware = this.getMiddleware();\n\n await this.managers.appStickersManager.getGreetingSticker().then(async(doc) => {\n if(!middleware()) return;\n\n const loadPromises: Promise[] = [];\n await wrapSticker({\n doc,\n // doc: appDocsManager.getDoc(\"5431607541660389336\"), // cubigator mockup\n div: stickerDiv,\n middleware,\n lazyLoadQueue: this.lazyLoadQueue,\n group: this.chat.animationGroup,\n // play: !!message.pending || !multipleRender,\n play: true,\n loop: true,\n withThumb: true,\n loadPromises\n });\n\n attachClickEvent(stickerDiv, (e) => {\n cancelEvent(e);\n EmoticonsDropdown.onMediaClick({target: e.target});\n });\n\n return Promise.all(loadPromises);\n });\n\n // this.renderMessagesQueue({\n // message,\n // bubble,\n // reverse: false,\n // promises: [loadPromise]\n // });\n\n elements.push(subtitle, stickerDiv);\n }\n\n if(listElements) {\n elements.push(\n ...listElements.map((elem) => {\n const span = document.createElement('span');\n span.classList.add(BASE_CLASS + '-list-item');\n span.append(elem);\n return span;\n })\n );\n\n if(type === 'group') {\n listElements.forEach((elem) => {\n const i = document.createElement('span');\n i.classList.add('tgico-check');\n elem.prepend(i);\n });\n } else if(type === 'saved') {\n listElements.forEach((elem) => {\n const i = document.createElement('span');\n i.classList.add(BASE_CLASS + '-list-bullet');\n i.innerText = '•';\n elem.prepend(i);\n });\n }\n }\n\n if(elements.length > 1) {\n bubble.classList.add('has-description');\n }\n\n elements.forEach((element: any) => element.classList.add(BASE_CLASS + '-line'));\n }\n\n private async processLocalMessageRender(\n message: Message.message | Message.messageService,\n animate?: boolean,\n middleware = this.getMiddleware()\n ) {\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\n const m = middlewarePromise(middleware);\n\n const p: Parameters[4] = async(result) => {\n const {bubble} = await m(result);\n if(!bubble) {\n return result;\n }\n\n (bubble as any).message = message;\n\n bubble.classList.add('is-group-last', 'is-group-first');\n\n const updatePosition = () => {\n if(this.updatePlaceholderPosition === updatePosition) {\n this.updatePlaceholderPosition = undefined;\n }\n\n appendTo[method](bubble);\n };\n\n if(!isSponsored) {\n bubble.classList.add('bubble-first');\n bubble.classList.remove('can-have-tail', 'is-in');\n }\n\n const elements: (Node | string)[] = [];\n const isBot = this.chat.isBot;\n let renderPromise: Promise, appendTo = this.container, method: 'append' | 'prepend' = 'append';\n if(this.chat.isRestricted) {\n renderPromise = this.renderEmptyPlaceholder('restricted', bubble, message, elements);\n } else if(isSponsored) {\n let text: LangPackKey, mid: number, startParam: string, callback: () => void;\n\n bubble.classList.add('avoid-selection');\n bubble.style.order = '999999';\n\n const sponsoredMessage = this.sponsoredMessage = (message as Message.message).sponsoredMessage;\n const peerId = getPeerId(sponsoredMessage.from_id);\n // const peer = this.appPeersManager.getPeer(peerId);\n if(sponsoredMessage.channel_post) {\n text = 'OpenChannelPost';\n mid = generateMessageId(sponsoredMessage.channel_post);\n } else if(sponsoredMessage.start_param || isBot) {\n text = 'Chat.Message.ViewBot';\n startParam = sponsoredMessage.start_param;\n } else {\n text = await this.managers.appPeersManager.isAnyGroup(peerId) ? 'Chat.Message.ViewGroup' : 'Chat.Message.ViewChannel';\n }\n\n if(sponsoredMessage.chat_invite) {\n callback = () => {\n new PopupJoinChatInvite(sponsoredMessage.chat_invite_hash, sponsoredMessage.chat_invite as ChatInvite.chatInvite);\n };\n } else if(sponsoredMessage.chat_invite_hash) {\n callback = () => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: sponsoredMessage.chat_invite_hash\n };\n\n this.chat.appImManager.processInternalLink(link);\n };\n } else {\n callback = () => {\n this.chat.appImManager.setInnerPeer({\n peerId,\n lastMsgId: mid,\n startParam\n });\n };\n }\n\n const button = this.makeViewButton({text});\n\n this.observer.observe(button, this.viewsObserverCallback);\n\n if(callback) {\n attachClickEvent(button, callback);\n }\n\n bubble.querySelector('.bubble-content').prepend(button);\n\n appendTo = this.chatInner;\n method = 'append';\n animate = false;\n\n // return result;\n } else if(isBot && message._ === 'message') {\n const b = document.createElement('b');\n b.append(i18n('BotInfoTitle'));\n elements.push(b, '\\n\\n');\n appendTo = this.chatInner;\n method = 'prepend';\n } else if(this.chat.isAnyGroup && ((await m(this.managers.appPeersManager.getPeer(this.peerId))) as MTChat.chat).pFlags.creator) {\n renderPromise = this.renderEmptyPlaceholder('group', bubble, message, elements);\n } else if(this.chat.type === 'scheduled') {\n renderPromise = this.renderEmptyPlaceholder('noScheduledMessages', bubble, message, elements);\n } else if(rootScope.myId === this.peerId) {\n renderPromise = this.renderEmptyPlaceholder('saved', bubble, message, elements);\n } else if(this.peerId.isUser() && !isBot && await m(this.chat.canSend()) && this.chat.type === 'chat') {\n renderPromise = this.renderEmptyPlaceholder('greeting', bubble, message, elements);\n } else {\n renderPromise = this.renderEmptyPlaceholder('noMessages', bubble, message, elements);\n }\n\n if(renderPromise) {\n await renderPromise;\n }\n\n if(elements.length) {\n const messageDiv = bubble.querySelector('.message, .service-msg');\n messageDiv.prepend(...elements);\n }\n\n const isWaitingForAnimation = !!this.messagesQueueOnRenderAdditional;\n const noTransition = this.setPeerCached && !isWaitingForAnimation;\n if(noTransition) {\n const setOn = bubble.firstElementChild;\n setOn.classList.add('no-transition');\n\n if(this.chat.setPeerPromise) {\n this.chat.setPeerPromise.catch(noop).finally(() => {\n setOn.classList.remove('no-transition');\n });\n }\n }\n\n if(animate === undefined && !noTransition) {\n animate = true;\n }\n\n if(isWaitingForAnimation || animate) {\n this.updatePlaceholderPosition = updatePosition;\n\n this.onAnimateLadder = () => {\n // appendTo[method](bubble);\n this.onAnimateLadder = undefined;\n\n // need raf here because animation won't fire if this message is single\n if(!this.messagesQueuePromise) {\n return fastRafPromise();\n }\n };\n } else if(this.chat.setPeerPromise) {\n this.attachPlaceholderOnRender = () => {\n this.attachPlaceholderOnRender = undefined;\n updatePosition();\n // appendTo[method](bubble);\n };\n } else {\n this.updatePlaceholderPosition = updatePosition;\n // appendTo[method](bubble);\n }\n\n if(!isWaitingForAnimation && animate) {\n await m(getHeavyAnimationPromise());\n const additionMsgIds = getObjectKeysAndSort(this.bubbles);\n indexOfAndSplice(additionMsgIds, message.mid);\n this.animateAsLadder(message.mid, additionMsgIds, false, 0, 0);\n }\n\n bubble.middlewareHelper.onDestroy(() => {\n if(this.emptyPlaceholderBubble === bubble) {\n this.emptyPlaceholderBubble = undefined;\n }\n });\n\n this.emptyPlaceholderBubble = bubble;\n\n return result;\n };\n\n return this.safeRenderMessage(\n message,\n !isSponsored,\n undefined,\n false,\n p\n );\n }\n\n private makeViewButton[1]>(options: T) {\n return Button('btn-primary btn-primary-transparent bubble-view-button', options);\n }\n\n private generateLocalMessageId(addOffset = 0) {\n // const INCREMENT = 0x10;\n const offset = (this.chat.type === 'scheduled' ? -1 : 0) + addOffset;\n // offset = generateMessageId(offset);\n // id: -Math.abs(+this.peerId * INCREMENT + offset),\n const id = -Math.abs(offset);\n const mid = -Math.abs(generateMessageId(id));\n return {id, mid};\n }\n\n private async generateLocalFirstMessage(service?: T, fill?: (message: GenerateLocalMessageType) => void, addOffset = 0): Promise> {\n const {id, mid} = this.generateLocalMessageId(addOffset);\n let message: Omit & {message?: string} = {\n _: service ? 'messageService' : 'message',\n date: 0,\n id,\n mid,\n peer_id: await this.managers.appPeersManager.getOutputPeer(this.peerId),\n pFlags: {\n local: true\n }\n };\n\n if(!service) {\n message.message = '';\n }/* else {\n (message as Message.messageService).action = {} as any;\n } */\n\n assumeType>(message);\n\n fill && fill(message);\n\n const savedMessages = await this.managers.appMessagesManager.saveMessages([message], {storage: new Map() as any});\n message = savedMessages[0];\n message.mid = mid;\n return message as any;\n }\n\n public getViewportSlice() {\n // this.log.trace('viewport slice');\n return getViewportSlice({\n overflowElement: this.scrollable.container,\n selector: '.bubbles-date-group .bubble:not(.is-date)',\n extraSize: Math.max(700, windowSize.height) * 2\n });\n }\n\n public deleteViewportSlice(slice: ReturnType, ignoreScrollSaving?: boolean) {\n if(DO_NOT_SLICE_VIEWPORT_ON_RENDER) {\n return;\n }\n\n const {invisibleTop, invisibleBottom} = slice;\n const invisible = invisibleTop.concat(invisibleBottom);\n if(!invisible.length) {\n return;\n }\n\n if(invisibleTop.length) {\n this.setLoaded('top', false);\n this.getHistoryTopPromise = undefined;\n }\n\n if(invisibleBottom.length) {\n this.setLoaded('bottom', false);\n this.getHistoryBottomPromise = undefined;\n }\n\n const mids = invisible.map(({element}) => +element.dataset.mid);\n\n let scrollSaver: ScrollSaver;\n if(/* !!invisibleTop.length !== !!invisibleBottom.length && */!ignoreScrollSaving) {\n scrollSaver = this.createScrollSaver(!!invisibleTop.length);\n scrollSaver.save();\n }\n\n this.deleteMessagesByIds(mids, false, true);\n\n if(scrollSaver) {\n scrollSaver.restore();\n } else if(invisibleTop.length) {\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\n }\n }\n\n public sliceViewport(ignoreHeavyAnimation?: boolean) {\n // Safari cannot reset the scroll.\n if(IS_SAFARI || (this.isHeavyAnimationInProgress && !ignoreHeavyAnimation) || DO_NOT_SLICE_VIEWPORT) {\n return;\n }\n\n // const scrollSaver = new ScrollSaver(this.scrollable, true);\n // scrollSaver.save();\n const slice = this.getViewportSlice();\n // if(IS_SAFARI) slice.invisibleTop = [];\n this.deleteViewportSlice(slice);\n // scrollSaver.restore();\n }\n\n private async setLoaded(side: SliceSides, value: boolean, checkPlaceholders = true) {\n const willChange = this.scrollable.loadedAll[side] !== value;\n if(!willChange) {\n return;\n }\n\n const log = this.log.bindPrefix('setLoaded');\n log('change', side, value);\n\n this.scrollable.loadedAll[side] = value;\n this.scrollable.onScroll(); // ! WARNING\n // return;\n\n if(!checkPlaceholders) {\n return;\n }\n\n if(!this.chat.isRestricted) {\n if(side === 'bottom' && this.chat.isBroadcast/* && false */) {\n this.toggleSponsoredMessage(value);\n }\n\n if(side === 'top' && value && this.chat.isBot) {\n return this.renderBotPlaceholder();\n }\n }\n\n return this.checkIfEmptyPlaceholderNeeded();\n }\n\n private async toggleSponsoredMessage(value: boolean) {\n const log = this.log.bindPrefix('sponsored');\n log('checking');\n const {mid} = this.generateLocalMessageId(SPONSORED_MESSAGE_ID_OFFSET);\n if(value) {\n const middleware = this.getMiddleware(() => {\n return this.scrollable.loadedAll.bottom && this.getSponsoredMessagePromise === promise;\n });\n\n const promise = this.getSponsoredMessagePromise = this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId())\n .then(async(sponsoredMessages) => {\n if(!middleware() || sponsoredMessages._ === 'messages.sponsoredMessagesEmpty') {\n return;\n }\n\n const sponsoredMessage = sponsoredMessages.messages[0];\n if(!sponsoredMessage) {\n log('no message');\n return;\n }\n\n const messagePromise = this.generateLocalFirstMessage(false, (message) => {\n message.message = sponsoredMessage.message;\n message.from_id = sponsoredMessage.from_id;\n message.entities = sponsoredMessage.entities;\n message.pFlags.sponsored = true;\n message.sponsoredMessage = sponsoredMessage;\n }, SPONSORED_MESSAGE_ID_OFFSET);\n\n return Promise.all([\n messagePromise,\n this.getHistoryTopPromise, // wait for top load and execute rendering after or with it\n this.messagesQueuePromise\n ]).then(([message]) => {\n if(!middleware()) return;\n // this.processLocalMessageRender(message);\n log('rendering', message);\n return this.performHistoryResult({history: [message]}, false);\n });\n }).finally(() => {\n if(this.getSponsoredMessagePromise === promise) {\n this.getSponsoredMessagePromise = undefined;\n }\n });\n } else {\n log('clearing rendered', mid);\n this.getSponsoredMessagePromise = undefined;\n this.deleteMessagesByIds([mid]);\n }\n }\n\n private async renderBotPlaceholder() {\n const _log = this.log.bindPrefix('bot placeholder');\n\n const middleware = this.getMiddleware();\n const result = await this.managers.acknowledged.appProfileManager.getProfile(this.peerId.toUserId());\n _log('getting profile, cached:', result.cached);\n const processPromise = result.result.then(async(userFull) => {\n if(!middleware()) {\n return;\n }\n\n if(!userFull.bot_info?.description) {\n _log.warn('no description');\n return this.checkIfEmptyPlaceholderNeeded();\n }\n\n const message = await this.generateLocalFirstMessage(false, (message) => {\n const botInfo = userFull.bot_info;\n message.message = botInfo.description;\n if(botInfo.description_document) message.media = {_: 'messageMediaDocument', document: botInfo.description_document, pFlags: {}};\n if(botInfo.description_photo) message.media = {_: 'messageMediaPhoto', photo: botInfo.description_photo, pFlags: {}};\n });\n\n if(!middleware()) {\n return;\n }\n\n _log('rendering');\n const renderPromise = this.processLocalMessageRender(message, !result.cached).then(() => {\n _log('done');\n });\n\n return {renderPromise};\n });\n\n if(!result.cached) {\n return;\n }\n\n return processPromise;\n }\n\n public async checkIfEmptyPlaceholderNeeded() {\n if(this.scrollable.loadedAll.top &&\n this.scrollable.loadedAll.bottom &&\n this.emptyPlaceholderBubble === undefined &&\n (\n this.chat.isRestricted ||\n !(await this.chat.getHistoryStorage()).count ||\n (\n // !Object.keys(this.bubbles).length ||\n // ! WARNING ! ! ! ! ! ! REPLACE LINE ABOVE WITH THESE\n Object.keys(this.bubbles).length &&\n !this.getRenderedLength()\n ) ||\n (this.chat.type === 'scheduled' && !Object.keys(this.bubbles).length)\n )\n ) {\n this.log('inject empty peer placeholder');\n\n const message = await this.generateLocalFirstMessage(true);\n return {renderPromise: this.processLocalMessageRender(message)};\n }\n }\n\n public getHistory1(maxId?: number, reverse?: boolean, isBackLimit?: boolean, additionMsgId?: number, justLoad?: boolean) {\n const middleware = this.getMiddleware(justLoad ? undefined : () => {\n return (reverse ? this.getHistoryTopPromise : this.getHistoryBottomPromise) === waitPromise;\n });\n\n const result = this.getHistory(maxId, reverse, isBackLimit, additionMsgId, justLoad, middleware);\n const waitPromise = result.then((res) => res && (res.waitPromise || res.promise));\n\n (reverse ? this.getHistoryTopPromise = waitPromise : this.getHistoryBottomPromise = waitPromise);\n waitPromise.then(() => {\n if(!middleware()) {\n return;\n }\n\n (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined);\n\n if(!justLoad) {\n // preload more\n // if(!isFirstMessageRender) {\n if(this.chat.type === 'chat'/* || this.chat.type === 'discussion' */) {\n /* const storage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\n const isMaxIdInHistory = storage.history.indexOf(maxId) !== -1;\n if(isMaxIdInHistory || true) { // * otherwise it is a search or jump */\n setTimeout(() => {\n if(reverse) {\n this.loadMoreHistory(true, true);\n } else {\n this.loadMoreHistory(false, true);\n }\n }, 0);\n // }\n }\n // }\n\n // this.scrollable.onScroll();\n }\n });\n\n return result;\n }\n\n /**\n * Load and render history\n * @param maxId max message id\n * @param reverse 'true' means up\n * @param isBackLimit is search\n * @param additionMsgId for the last message\n * @param justLoad do not render\n */\n public async getHistory(\n maxId = 0,\n reverse = false,\n isBackLimit = false,\n additionMsgId = 0,\n justLoad = false,\n middleware?: () => boolean\n ): Promise<{cached: boolean, promise: Promise, waitPromise: Promise}> {\n const peerId = this.peerId;\n\n const isBroadcast = this.chat.isBroadcast;\n // console.time('appImManager call getHistory');\n const pageCount = Math.min(30, windowSize.height / 40/* * 1.25 */ | 0);\n // const loadCount = Object.keys(this.bubbles).length > 0 ? 50 : pageCount;\n const realLoadCount = isBroadcast ? 20 : (Object.keys(this.bubbles).length > 0 ? Math.max(35, pageCount) : pageCount);\n // const realLoadCount = pageCount;//const realLoadCount = 50;\n let loadCount = realLoadCount;\n\n /* if(TEST_SCROLL) {\n //loadCount = 1;\n if(Object.keys(this.bubbles).length > 0)\n return {cached: false, promise: Promise.resolve(true)};\n } */\n if(TEST_SCROLL !== undefined) {\n if(TEST_SCROLL) {\n if(Object.keys(this.bubbles).length > 0) {\n --TEST_SCROLL;\n }\n } else {\n return {cached: false, promise: Promise.resolve(), waitPromise: Promise.resolve()};\n }\n }\n\n // //console.time('render history total');\n\n let backLimit = 0;\n if(isBackLimit) {\n backLimit = loadCount;\n\n if(!reverse) { // if not jump\n loadCount = 0;\n // maxId = this.appMessagesManager.incrementMessageId(maxId, 1);\n }\n }\n\n let additionMsgIds: number[];\n if(additionMsgId && !isBackLimit) {\n if(this.chat.type === 'pinned') {\n additionMsgIds = [additionMsgId];\n } else {\n const historyStorage = await this.chat.getHistoryStorage();\n const slice = historyStorage.history.slice;\n if(slice.length < loadCount && !slice.isEnd(SliceEnd.Both)) {\n additionMsgIds = slice.slice();\n\n // * filter last album, because we don't know is it the last item\n for(let i = additionMsgIds.length - 1; i >= 0; --i) {\n const message = await this.chat.getMessage(additionMsgIds[i]);\n if((message as Message.message)?.grouped_id) additionMsgIds.splice(i, 1);\n else break;\n }\n\n maxId = additionMsgIds[additionMsgIds.length - 1] || maxId;\n }\n }\n }\n\n /* const result = additionMsgID ?\n {history: [additionMsgID]} :\n appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit); */\n let result: AckedResult = await this.requestHistory(maxId, loadCount, backLimit) as any;\n let resultPromise: typeof result['result'];\n\n this.log('i vin brehnya', result, maxId, loadCount, backLimit);\n\n // const isFirstMessageRender = !!additionMsgID && result.cached && !appMessagesManager.getMessage(additionMsgID).grouped_id;\n const isAdditionRender = additionMsgIds?.length && !result.cached;\n const isFirstMessageRender = (this.isFirstLoad && backLimit && !result.cached) || isAdditionRender;\n if(isAdditionRender) {\n resultPromise = result.result;\n\n result = {\n cached: true,\n result: Promise.resolve({history: additionMsgIds})\n };\n\n // additionMsgID = 0;\n }\n\n this.isFirstLoad = false;\n\n const processResult = async(historyResult: Awaited) => {\n if((historyResult as HistoryResult).isEnd?.top) {\n if(this.chat.type === 'discussion') { // * inject discussion start\n const serviceStartMessageId = await this.managers.appMessagesManager.getThreadServiceMessageId(this.peerId, this.chat.threadId);\n if(serviceStartMessageId) historyResult.history.push(serviceStartMessageId);\n const mids = await this.chat.getMidsByMid(this.chat.threadId);\n historyResult.history.push(...mids.reverse());\n }\n\n // synchronize bot placeholder appearance\n await this.managers.appProfileManager.getProfileByPeerId(peerId);\n\n // await this.setLoaded('top', true);\n }\n };\n\n const sup = (historyResult: Awaited) => {\n return getHeavyAnimationPromise().then(() => {\n return processResult(historyResult);\n }).then(() => {\n if(!isAdditionRender && additionMsgId) {\n historyResult.history.unshift(additionMsgId);\n }\n\n return this.performHistoryResult(historyResult, reverse);\n });\n };\n\n const processPromise = (_promise: typeof result['result']) => {\n const promise = Promise.resolve(_promise).then((result) => {\n if(middleware && !middleware()) {\n throw PEER_CHANGED_ERROR;\n }\n\n if(justLoad) {\n // нужно делать из-за ранней прогрузки\n this.scrollable.onScroll();\n // fastRaf(() => {\n // this.scrollable.checkForTriggers();\n // });\n return;\n }\n\n return sup(result);\n }, (err) => {\n this.log.error('getHistory error:', err);\n throw err;\n });\n\n return promise;\n };\n\n let promise: Promise, cached: boolean;\n if(!result.cached) {\n cached = false;\n promise = processPromise(result.result);\n } else if(justLoad) {\n // нужно делать из-за ранней прогрузки\n this.scrollable.onScroll();\n return null;\n } else {\n cached = true;\n promise = sup(await result.result);\n }\n\n const waitPromise = isAdditionRender ? processPromise(resultPromise) : promise;\n\n if(isFirstMessageRender && rootScope.settings.animationsEnabled/* && false */) {\n let times = isAdditionRender ? 2 : 1;\n this.messagesQueueOnRenderAdditional = () => {\n this.log('messagesQueueOnRenderAdditional');\n\n if(--times) return;\n\n this.messagesQueueOnRenderAdditional = undefined;\n\n const promise = this.animateAsLadder(additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\n promise.then(() => {\n setTimeout(() => { // preload messages\n this.loadMoreHistory(reverse, true);\n }, 0);\n });\n };\n } else {\n this.messagesQueueOnRenderAdditional = undefined;\n }\n\n if(justLoad) {\n return null;\n }\n\n return {cached, promise, waitPromise};\n }\n\n public async setUnreadDelimiter() {\n if(!(this.chat.type === 'chat' || this.chat.type === 'discussion')) {\n return;\n }\n\n if(this.attachedUnreadBubble) {\n return;\n }\n\n const historyMaxId = await this.chat.getHistoryMaxId();\n let readMaxId = await this.managers.appMessagesManager.getReadMaxIdIfUnread(this.peerId, this.chat.threadId);\n if(!readMaxId) return;\n\n readMaxId = Object.keys(this.bubbles)\n .filter((mid) => !this.bubbles[mid].classList.contains('is-out'))\n .map((i) => +i)\n .sort((a, b) => a - b)\n .find((i) => i > readMaxId);\n\n if(readMaxId && this.bubbles[readMaxId]) {\n const bubble = this.bubbles[readMaxId];\n if(this.firstUnreadBubble && this.firstUnreadBubble !== bubble) {\n this.firstUnreadBubble.classList.remove('is-first-unread');\n this.firstUnreadBubble = null;\n }\n\n if(readMaxId !== historyMaxId) {\n bubble.classList.add('is-first-unread');\n }\n\n this.firstUnreadBubble = bubble;\n this.attachedUnreadBubble = true;\n }\n }\n\n public deleteEmptyDateGroups() {\n const mustBeCount = this.stickyIntersector ? STICKY_OFFSET : 1;\n let deleted = false;\n for(const i in this.dateMessages) {\n const dateMessage = this.dateMessages[i];\n\n if(dateMessage.container.childElementCount === mustBeCount) { // only date div + sentinel div\n dateMessage.container.remove();\n if(this.stickyIntersector) {\n this.stickyIntersector.unobserve(dateMessage.container, dateMessage.div);\n }\n delete this.dateMessages[i];\n deleted = true;\n\n // * no sense in it\n /* if(dateMessage.div === this.previousStickyDate) {\n this.previousStickyDate = undefined;\n } */\n }\n }\n\n if(!deleted) {\n return;\n }\n\n if(!Object.keys(this.dateMessages).length) {\n this.container.classList.remove('has-groups');\n }\n\n this.checkIfEmptyPlaceholderNeeded();\n this.setStickyDateManually();\n }\n}\n\nexport function generateTail() {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', '0 0 11 20');\n svg.setAttributeNS(null, 'width', '11');\n svg.setAttributeNS(null, 'height', '20');\n svg.classList.add('bubble-tail');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#message-tail-filled');\n\n svg.append(use);\n\n return svg;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {copyTextToClipboard} from '../clipboard';\n// import SelectionSaver from \"../selectionSaver\";\n// import selectElementContents from \"./selectElementContents\";\n\nexport default function copyFromElement(element: HTMLElement) {\n copyTextToClipboard(element.textContent);\n // const saver = new SelectionSaver();\n // saver.save();\n // selectElementContents(element);\n // document.execCommand('copy');\n // saver.restore();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {MediaSizeType} from '../../helpers/mediaSizes';\nimport {Message} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {MediaSearchContext} from '../appMediaPlaybackController';\nimport Chat from '../chat/chat';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport wrapDocument from './document';\n\nexport default async function wrapGroupedDocuments({albumMustBeRenderedFull, message, bubble, messageDiv, chat, loadPromises, autoDownloadSize, lazyLoadQueue, searchContext, useSearch, sizeType, managers, fontWeight, fontSize, richTextFragment}: {\n albumMustBeRenderedFull: boolean,\n message: any,\n messageDiv: HTMLElement,\n bubble: HTMLElement,\n uploading?: boolean,\n chat: Chat,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n lazyLoadQueue?: LazyLoadQueue,\n searchContext?: MediaSearchContext,\n useSearch?: boolean,\n sizeType?: MediaSizeType,\n managers?: AppManagers,\n fontWeight?: number,\n fontSize?: number,\n richTextFragment?: DocumentFragment\n}) {\n let nameContainer: HTMLElement;\n const mids = albumMustBeRenderedFull ? await chat.getMidsByMid(message.mid) : [message.mid];\n /* if(isPending) {\n mids.reverse();\n } */\n\n const promises = mids.map(async(mid, idx) => {\n const message = (await chat.getMessage(mid)) as Message.message;\n const div = await wrapDocument({\n message,\n loadPromises,\n autoDownloadSize,\n lazyLoadQueue,\n searchContext,\n sizeType,\n managers,\n fontWeight,\n fontSize\n });\n\n const container = document.createElement('div');\n container.classList.add('document-container');\n container.dataset.mid = '' + mid;\n container.dataset.peerId = '' + message.peerId;\n\n const wrapper = document.createElement('div');\n wrapper.classList.add('document-wrapper');\n\n if(message.message) {\n const messageDiv = document.createElement('div');\n messageDiv.classList.add('document-message');\n\n setInnerHTML(messageDiv, richTextFragment);\n wrapper.append(messageDiv);\n }\n\n if(mids.length > 1) {\n const selection = document.createElement('div');\n selection.classList.add('document-selection');\n container.append(selection);\n\n container.classList.add('grouped-item');\n\n if(idx === 0) {\n nameContainer = wrapper;\n }\n }\n\n wrapper.append(div);\n container.append(wrapper);\n return container;\n });\n\n const containers = await Promise.all(promises);\n messageDiv.append(...containers);\n\n if(mids.length > 1) {\n bubble.classList.add('is-multiple-documents', 'is-grouped');\n }\n\n return nameContainer;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport rootScope from '../../lib/rootScope';\nimport PollElement from '../poll';\n\nexport default function wrapPoll(message: any, managers: AppManagers = rootScope.managers) {\n const elem = new PollElement();\n elem.message = message;\n elem.managers = managers;\n elem.setAttribute('peer-id', '' + message.peerId);\n elem.setAttribute('poll-id', message.media.poll.id);\n elem.setAttribute('message-id', '' + message.mid);\n elem.render();\n return elem;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement, {addCancelButton} from '.';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\nimport rootScope from '../../lib/rootScope';\nimport {FormatterArguments, LangPackKey} from '../../lib/langPack';\nimport wrapPeerTitle from '../wrappers/peerTitle';\n\nexport default class PopupPinMessage {\n constructor(private peerId: PeerId, private mid: number, private unpin?: true, private onConfirm?: () => void) {\n this.construct();\n }\n\n private async construct() {\n const {peerId, mid, unpin, onConfirm} = this;\n let title: LangPackKey, description: LangPackKey, descriptionArgs: FormatterArguments;\n const buttons: PopupPeerOptions['buttons'] = [], checkboxes: PopupPeerOptions['checkboxes'] = [];\n\n const managers = PopupElement.MANAGERS;\n\n const canUnpin = await managers.appPeersManager.canPinMessage(peerId);\n\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, oneSide?: boolean, silent?: boolean) => {\n setTimeout(() => { // * костыль, потому что document.elementFromPoint вернёт popup-peer пока он будет закрываться\n let promise: Promise;\n if(unpin && !mid) {\n if(canUnpin) {\n promise = managers.appMessagesManager.unpinAllMessages(peerId);\n } else {\n promise = managers.appMessagesManager.hidePinnedMessages(peerId);\n }\n } else {\n promise = managers.appMessagesManager.updatePinnedMessage(peerId, mid, unpin, silent, oneSide);\n }\n\n if(onConfirm) {\n promise.then(onConfirm);\n }\n }, 300);\n };\n\n if(unpin) {\n let buttonText: LangPackKey = 'UnpinMessage';\n if(!mid) {\n if(canUnpin) {\n title = 'Popup.Unpin.AllTitle';\n description = 'Chat.UnpinAllMessagesConfirmation';\n descriptionArgs = ['' + ((await managers.appMessagesManager.getPinnedMessagesCount(peerId)) || 1)];\n } else {\n title = 'Popup.Unpin.HideTitle';\n description = 'Popup.Unpin.HideDescription';\n buttonText = 'Popup.Unpin.Hide';\n }\n } else {\n title = 'UnpinMessageAlertTitle';\n description = 'Chat.Confirm.Unpin';\n }\n\n buttons.push({\n langKey: buttonText,\n isDanger: true,\n callback\n });\n } else {\n title = 'PinMessageAlertTitle';\n const pinButtonText: LangPackKey = 'PinMessage';\n\n if(peerId.isAnyChat()) {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, false, !checked.size)\n });\n\n if(await managers.appChatsManager.isBroadcast(peerId.toChatId())) {\n description = 'PinMessageAlertChannel';\n } else {\n description = 'PinMessageAlert';\n\n checkboxes.push({\n text: 'PinNotify',\n checked: true\n });\n }\n } else {\n description = 'PinMessageAlertChat';\n\n if(peerId === rootScope.myId) {\n buttons.push({\n langKey: pinButtonText,\n callback\n });\n } else {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, !checked.size)\n });\n\n checkboxes.push({\n text: 'PinAlsoFor',\n textArgs: [await wrapPeerTitle({peerId})],\n checked: true\n });\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function isSelectionEmpty(selection = window.getSelection()) {\n if(!selection?.rangeCount) {\n return true;\n }\n\n const selectionRange = selection.getRangeAt(0);\n if(selectionRange.collapsed || !selectionRange.START_TO_END) {\n return true;\n }\n\n return false;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport rootScope from '../lib/rootScope';\nimport {getEmojiToneIndex} from '../vendor/emoji';\nimport mediaSizes from './mediaSizes';\nimport {saveLottiePreview} from './saveLottiePreview';\n\nexport default function preloadAnimatedEmojiSticker(emoji: string, width?: number, height?: number) {\n return rootScope.managers.appStickersManager.preloadAnimatedEmojiSticker(emoji).then(({doc}) => {\n if(!doc) {\n return;\n }\n\n return appDownloadManager.downloadMedia({media: doc})\n .then(async(blob) => {\n const mediaSize = mediaSizes.active.emojiSticker;\n const toneIndex = getEmojiToneIndex(emoji);\n const animation = await lottieLoader.loadAnimationWorker({\n container: undefined,\n animationData: blob,\n width: width ?? mediaSize.width,\n height: height ?? mediaSize.height,\n name: 'doc' + doc.id,\n autoplay: false,\n loop: false,\n toneIndex\n }, 'none');\n\n animation.addEventListener('firstFrame', () => {\n saveLottiePreview(doc, animation.canvas[0], toneIndex);\n animation.remove();\n }, {once: true});\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {ReportReason} from '../../layer';\nimport InputField from '../inputField';\nimport {toastNew} from '../toast';\nimport wrapStickerEmoji from '../wrappers/stickerEmoji';\nimport PopupPeer from './peer';\n\nexport default class PopupReportMessagesConfirm extends PopupPeer {\n public static STICKER_EMOJI = '👮‍♀️';\n constructor(peerId: PeerId, mids: number[], reason: ReportReason['_'], onConfirm?: () => void) {\n super('popup-report-messages-confirm', {\n noTitle: true,\n descriptionLangKey: 'ReportInfo',\n buttons: [{\n langKey: 'ReportChat',\n callback: () => {\n if(!inputField.isValid()) {\n return;\n }\n\n onConfirm && onConfirm();\n this.managers.appMessagesManager.reportMessages(peerId, mids, reason, inputField.value).then((bool) => {\n if(!bool) return;\n\n toastNew({\n langPackKey: 'ReportSentInfo'\n });\n });\n }\n }],\n body: true\n });\n\n const div = document.createElement('div');\n const size = 100;\n wrapStickerEmoji({\n div,\n emoji: PopupReportMessagesConfirm.STICKER_EMOJI,\n width: size,\n height: size\n }).then(({render}) => render).finally(() => {\n this.show();\n });\n\n this.header.append(div);\n\n const inputField = new InputField({\n label: 'ReportHint',\n maxLength: 512,\n placeholder: 'ReportChatDescription'\n });\n\n inputField.input.addEventListener('input', () => {\n this.buttons[0].element.toggleAttribute('disabled', !inputField.isValid());\n });\n\n this.body.append(inputField.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport whichChild from '../../helpers/dom/whichChild';\nimport preloadAnimatedEmojiSticker from '../../helpers/preloadAnimatedEmojiSticker';\nimport {ReportReason} from '../../layer';\nimport {LangPackKey} from '../../lib/langPack';\nimport Button from '../button';\nimport PopupPeer from './peer';\nimport PopupReportMessagesConfirm from './reportMessagesConfirm';\n\nexport default class PopupReportMessages extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-report-messages', {titleLangKey: 'ChatTitle.ReportMessages', buttons: [], body: true});\n\n mids = mids.slice();\n\n const buttons: [LangPackKey, ReportReason['_']][] = [\n ['ReportChatSpam', 'inputReportReasonSpam'],\n ['ReportChatViolence', 'inputReportReasonViolence'],\n ['ReportChatChild', 'inputReportReasonChildAbuse'],\n ['ReportChatPornography', 'inputReportReasonPornography'],\n ['ReportChatOther', 'inputReportReasonOther'],\n ['ReportChatPersonalDetails', 'inputReportReasonPersonalDetails'],\n ['ReportChatIllegalDrugs', 'inputReportReasonIllegalDrugs']\n ];\n\n const className = 'btn-primary btn-transparent';\n buttons.forEach((b) => {\n const button = Button(className, {/* icon: 'edit', */text: b[0]});\n this.body.append(button);\n });\n\n const preloadStickerPromise = preloadAnimatedEmojiSticker(PopupReportMessagesConfirm.STICKER_EMOJI);\n\n attachClickEvent(this.body, (e) => {\n const target = findUpClassName(e.target, 'btn-primary');\n const reason = buttons[whichChild(target)][1];\n\n preloadStickerPromise.then(() => {\n this.hide();\n\n new PopupReportMessagesConfirm(peerId, mids, reason, onConfirm);\n });\n }, {listenerSetter: this.listenerSetter});\n\n // this.body.style.margin = '0 -1rem';\n this.buttonsEl.style.marginTop = '.5rem';\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport I18n, {i18n} from '../../lib/langPack';\nimport PopupPeer from './peer';\n\nexport default class PopupSponsored extends PopupPeer {\n constructor() {\n super('popup-sponsored', {\n titleLangKey: 'Chat.Message.Sponsored.What',\n descriptionLangKey: 'Chat.Message.Ad.Text',\n descriptionLangArgs: [i18n('Chat.Message.Sponsored.Link')],\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'Chat.Message.Ad.ReadMore',\n callback: () => {\n window.open(I18n.format('Chat.Message.Sponsored.Link', true));\n },\n isCancel: true\n }],\n scrollable: true\n });\n\n this.scrollable.append(this.description);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport {Message, Reaction} from '../../layer';\nimport ReactionsElement from '../chat/reactions';\nimport {horizontalMenu} from '../horizontalMenu';\nimport Scrollable from '../scrollable';\nimport ScrollableLoader from '../../helpers/scrollableLoader';\nimport appDialogsManager from '../../lib/appManagers/appDialogsManager';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport wrapSticker from '../wrappers/sticker';\nimport ReactionElement from '../chat/reaction';\nimport getUserStatusString from '../wrappers/getUserStatusString';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport SettingSection from '../settingSection';\n\nexport default class PopupReactedList extends PopupElement {\n constructor(\n private message: Message.message\n ) {\n super('popup-reacted-list', {closable: true, overlayClosable: true, body: true});\n\n this.init();\n }\n\n private async init() {\n const middleware = this.middlewareHelper.get();\n const message = await this.managers.appMessagesManager.getGroupsFirstMessage(this.message);\n if(!middleware()) return;\n const canViewReadParticipants = await this.managers.appMessagesManager.canViewMessageReadParticipants(message);\n if(!middleware()) return;\n // this.body.append(generateDelimiter());\n\n const reactionsElement = new ReactionsElement();\n const newMessage: Message.message = {\n ...message,\n mid: 0,\n id: 0,\n reactions: {\n _: 'messageReactions',\n results: [],\n\n ...message.reactions,\n\n pFlags: {},\n recent_reactions: []\n }\n };\n\n newMessage.reactions.results = newMessage.reactions.results.map((reactionCount) => {\n return {\n ...reactionCount,\n chosen_order: undefined,\n pFlags: {}\n };\n });\n\n reactionsElement.init(newMessage, 'block', this.middlewareHelper.get());\n reactionsElement.render();\n reactionsElement.classList.add('no-stripe');\n reactionsElement.classList.remove('has-no-reactions');\n\n reactionsElement.append(this.btnClose);\n\n this.header.append(reactionsElement);\n\n const tabsContainer = document.createElement('div');\n tabsContainer.classList.add('tabs-container');\n tabsContainer.dataset.animation = 'tabs';\n\n const loaders: Map = new Map();\n\n let hasAllReactions = false;\n if(newMessage.reactions.results.length) {\n const reaction = this.createFakeReaction('reactions', newMessage.reactions.results.reduce((acc, r) => acc + r.count, 0));\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasAllReactions = true;\n }\n\n let hasReadParticipants = false;\n if(canViewReadParticipants) {\n try {\n const readUserIds = await this.managers.appMessagesManager.getMessageReadParticipants(message.peerId, message.mid);\n if(!middleware()) return;\n if(!readUserIds.length) {\n throw '';\n }\n\n const reaction = this.createFakeReaction('checks', readUserIds.length);\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasReadParticipants = true;\n } catch(err) {\n\n }\n }\n\n newMessage.reactions.results.forEach((reactionCount) => {\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add('tabs-tab');\n\n const section = new SettingSection({\n noShadow: true,\n noDelimiter: true\n });\n\n const chatlist = appDialogsManager.createChatList({\n dialogSize: 72\n });\n\n appDialogsManager.setListClickListener(chatlist, () => {\n this.hide();\n }, undefined, false, true);\n\n section.content.append(chatlist);\n scrollable.container.append(section.container);\n\n const skipReadParticipants = (reactionCount.reaction as any) !== 'checks';\n const skipReactionsList = (reactionCount.reaction as any) === 'checks';\n if(['checks', 'reactions'].includes(reactionCount.reaction as any)) {\n reactionCount.reaction = undefined;\n }\n\n const size = 24;\n const mediaSize = makeMediaSize(size, size);\n\n let nextOffset: string;\n const loader = new ScrollableLoader({\n scrollable,\n getPromise: async() => {\n const result = await this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(message, undefined, reactionCount.reaction, nextOffset, skipReadParticipants, skipReactionsList);\n nextOffset = result.nextOffset;\n\n await Promise.all(result.combined.map(async({peerId, reaction}) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n autonomous: true,\n container: chatlist,\n avatarSize: 'abitbigger',\n rippleEnabled: false,\n meAsSaved: false\n });\n\n if(reaction) {\n const stickerContainer = document.createElement('div');\n stickerContainer.classList.add('reacted-list-reaction-icon');\n\n if(reaction._ === 'reactionEmoji') {\n const availableReaction = await this.managers.appReactionsManager.getReactionCached(reaction.emoticon);\n\n wrapSticker({\n doc: availableReaction.static_icon,\n div: stickerContainer,\n width: 24,\n height: 24,\n middleware\n });\n } else if(reaction._ === 'reactionCustomEmoji') {\n stickerContainer.append(wrapCustomEmoji({\n docIds: [reaction.document_id],\n customEmojiSize: mediaSize,\n middleware\n }));\n }\n\n dom.listEl.append(stickerContainer);\n }\n\n replaceContent(dom.lastMessageSpan, getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId())));\n }));\n\n return !nextOffset;\n }\n });\n\n loaders.set(scrollable.container, loader);\n\n tabsContainer.append(scrollable.container);\n });\n\n this.body.append(tabsContainer);\n\n const selectTab = horizontalMenu(reactionsElement, tabsContainer, (id, tabContent) => {\n if(id === (reactionsElement.childElementCount - 1)) {\n return false;\n }\n\n const reaction = reactionsElement.children[id] as ReactionElement;\n const prevId = selectTab.prevId();\n if(prevId !== -1) {\n (reactionsElement.children[prevId] as ReactionElement).setIsChosen(false);\n }\n\n reaction.setIsChosen(true);\n\n const loader = loaders.get(tabContent);\n loader.load();\n }, undefined, undefined, undefined, this.listenerSetter);\n\n // selectTab(hasAllReactions && hasReadParticipants ? 1 : 0, false);\n selectTab(0, false);\n\n this.show();\n }\n\n private createFakeReaction(icon: string, count: number) {\n const reaction = new ReactionElement();\n reaction.init('block', this.middlewareHelper.get());\n reaction.reactionCount = {\n _: 'reactionCount',\n count: count,\n reaction: icon as any\n };\n reaction.setCanRenderAvatars(false);\n reaction.renderCounter();\n\n const allReactionsSticker = document.createElement('div');\n allReactionsSticker.classList.add('reaction-counter', 'reaction-sticker-icon', 'tgico-' + icon);\n reaction.prepend(allReactionsSticker);\n\n return reaction;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\nimport assumeType from '../../helpers/assumeType';\nimport callbackify from '../../helpers/callbackify';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport {getMiddleware} from '../../helpers/middleware';\nimport noop from '../../helpers/noop';\nimport {fastRaf} from '../../helpers/schedulers';\nimport {Message, AvailableReaction, Reaction} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport Scrollable, {ScrollableBase, ScrollableX} from '../scrollable';\nimport wrapSticker from '../wrappers/sticker';\n\nconst REACTIONS_CLASS_NAME = 'btn-menu-reactions';\nconst REACTION_CLASS_NAME = REACTIONS_CLASS_NAME + '-reaction';\n\nconst REACTION_SIZE = 26;\nconst PADDING = 4;\nexport const REACTION_CONTAINER_SIZE = REACTION_SIZE + PADDING * 2;\n\nconst CAN_USE_TRANSFORM = !IS_SAFARI;\n\ntype ChatReactionsMenuPlayers = {\n select?: RLottiePlayer,\n appear?: RLottiePlayer,\n selectWrapper: HTMLElement,\n appearWrapper: HTMLElement,\n reaction: Reaction\n};\nexport class ChatReactionsMenu {\n public widthContainer: HTMLElement;\n public container: HTMLElement;\n private reactionsMap: Map;\n public scrollable: ScrollableBase;\n private animationGroup: AnimationItemGroup;\n private middleware: ReturnType;\n private message: Message.message;\n\n constructor(\n private managers: AppManagers,\n private type: 'horizontal' | 'vertical',\n middleware: ChatReactionsMenu['middleware']\n ) {\n const widthContainer = this.widthContainer = document.createElement('div');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container-' + type);\n\n const reactionsContainer = this.container = document.createElement('div');\n reactionsContainer.classList.add(REACTIONS_CLASS_NAME);\n\n const reactionsScrollable = this.scrollable = type === 'vertical' ? new Scrollable(undefined) : new ScrollableX(undefined);\n reactionsContainer.append(reactionsScrollable.container);\n reactionsScrollable.onAdditionalScroll = this.onScroll;\n reactionsScrollable.setListeners();\n\n reactionsScrollable.container.classList.add('no-scrollbar');\n\n // ['big'].forEach((type) => {\n // const bubble = document.createElement('div');\n // bubble.classList.add(REACTIONS_CLASS_NAME + '-bubble', REACTIONS_CLASS_NAME + '-bubble-' + type);\n // reactionsContainer.append(bubble);\n // });\n\n this.reactionsMap = new Map();\n this.animationGroup = `CHAT-MENU-REACTIONS-${Date.now()}`;\n animationIntersector.setOverrideIdleGroup(this.animationGroup, true);\n\n if(!IS_TOUCH_SUPPORTED) {\n reactionsContainer.addEventListener('mousemove', this.onMouseMove);\n }\n\n attachClickEvent(reactionsContainer, (e) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) return;\n\n const players = this.reactionsMap.get(reactionDiv);\n if(!players) return;\n\n this.managers.appReactionsManager.sendReaction(this.message, players.reaction);\n });\n\n widthContainer.append(reactionsContainer);\n\n this.middleware = middleware ?? getMiddleware();\n }\n\n public init(message: Message.message) {\n this.message = message;\n\n const middleware = this.middleware.get();\n // const result = Promise.resolve(this.appReactionsManager.getAvailableReactionsForPeer(message.peerId)).then((res) => pause(1000).then(() => res));\n const result = this.managers.appReactionsManager.getAvailableReactionsByMessage(message);\n callbackify(result, (reactions) => {\n if(!middleware() || !reactions.length) return;\n reactions.forEach((reaction) => {\n if(reaction.pFlags.premium && !rootScope.premium) return;\n this.renderReaction(reaction);\n });\n\n const setVisible = () => {\n this.container.classList.add('is-visible');\n };\n\n if(result instanceof Promise) {\n fastRaf(setVisible);\n } else {\n setVisible();\n }\n });\n }\n\n public cleanup() {\n this.middleware.clean();\n this.scrollable.removeListeners();\n this.reactionsMap.clear();\n animationIntersector.setOverrideIdleGroup(this.animationGroup, false);\n animationIntersector.checkAnimations(true, this.animationGroup, true);\n }\n\n private onScroll = () => {\n this.reactionsMap.forEach((players, div) => {\n this.onScrollProcessItem(div, players);\n });\n };\n\n private canUseAnimations() {\n return rootScope.settings.animationsEnabled && !IS_MOBILE;\n }\n\n private renderReaction(reaction: AvailableReaction) {\n const reactionDiv = document.createElement('div');\n reactionDiv.classList.add(REACTION_CLASS_NAME);\n\n const scaleContainer = document.createElement('div');\n scaleContainer.classList.add(REACTION_CLASS_NAME + '-scale');\n\n const appearWrapper = document.createElement('div');\n let selectWrapper: HTMLElement;;\n appearWrapper.classList.add(REACTION_CLASS_NAME + '-appear');\n\n if(this.canUseAnimations()) {\n selectWrapper = document.createElement('div');\n selectWrapper.classList.add(REACTION_CLASS_NAME + '-select', 'hide');\n }\n\n const players: ChatReactionsMenuPlayers = {\n selectWrapper,\n appearWrapper,\n reaction: {_: 'reactionEmoji', emoticon: reaction.reaction}\n };\n this.reactionsMap.set(reactionDiv, players);\n\n const middleware = this.middleware.get();\n\n const hoverScale = IS_TOUCH_SUPPORTED ? 1 : 1.25;\n const size = REACTION_SIZE * hoverScale;\n\n const options = {\n width: size,\n height: size,\n skipRatio: 1,\n needFadeIn: false,\n withThumb: false,\n group: this.animationGroup,\n middleware\n };\n\n if(!this.canUseAnimations()) {\n delete options.needFadeIn;\n delete options.withThumb;\n\n wrapSticker({\n doc: reaction.static_icon,\n div: appearWrapper,\n ...options\n });\n } else {\n let isFirst = true;\n wrapSticker({\n doc: reaction.appear_animation,\n div: appearWrapper,\n play: true,\n ...options\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n players.appear = player;\n\n player.addEventListener('enterFrame', (frameNo) => {\n if(player.maxFrame === frameNo) {\n selectLoadPromise.then((selectPlayer) => {\n assumeType(selectPlayer);\n appearWrapper.classList.add('hide');\n selectWrapper.classList.remove('hide');\n\n if(isFirst) {\n players.select = selectPlayer;\n isFirst = false;\n }\n }, noop);\n }\n });\n }, noop);\n\n const selectLoadPromise = wrapSticker({\n doc: reaction.select_animation,\n div: selectWrapper,\n ...options\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n return lottieLoader.waitForFirstFrame(player);\n }).catch(noop);\n }\n\n scaleContainer.append(appearWrapper);\n selectWrapper && scaleContainer.append(selectWrapper);\n reactionDiv.append(scaleContainer);\n this.scrollable.append(reactionDiv);\n }\n\n private onScrollProcessItem(div: HTMLElement, players: ChatReactionsMenuPlayers) {\n // return;\n\n const scaleContainer = div.firstElementChild as HTMLElement;\n const visibleRect = getVisibleRect(div, this.scrollable.container);\n let transform: string;\n if(!visibleRect) {\n if(!players.appearWrapper.classList.contains('hide') || !players.appear) {\n return;\n }\n\n if(players.select) {\n players.select.stop();\n }\n\n players.appear.stop();\n players.appear.autoplay = true;\n players.appearWrapper.classList.remove('hide');\n players.selectWrapper.classList.add('hide');\n\n transform = '';\n } else if(visibleRect.overflow.left || visibleRect.overflow.right) {\n const diff = Math.abs(visibleRect.rect.left - visibleRect.rect.right);\n const scale = Math.min(diff ** 2 / REACTION_CONTAINER_SIZE ** 2, 1);\n\n transform = 'scale(' + scale + ')';\n } else {\n transform = '';\n }\n\n if(CAN_USE_TRANSFORM) {\n scaleContainer.style.transform = transform;\n }\n }\n\n private onMouseMove = (e: MouseEvent) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) {\n return;\n }\n\n const players = this.reactionsMap.get(reactionDiv);\n if(!players) {\n return;\n }\n\n // do not play select animation when appearing\n if(!players.appear?.paused) {\n return;\n }\n\n const player = players.select;\n if(!player) {\n return;\n }\n\n if(player.paused) {\n player.autoplay = true;\n player.restart();\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport type Chat from './chat';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport ButtonMenu, {ButtonMenuItemOptions} from '../buttonMenu';\nimport PopupDeleteMessages from '../popups/deleteMessages';\nimport PopupForward from '../popups/forward';\nimport PopupPinMessage from '../popups/unpinMessage';\nimport {copyTextToClipboard} from '../../helpers/clipboard';\nimport PopupSendNow from '../popups/sendNow';\nimport {toast} from '../toast';\nimport I18n, {i18n, LangPackKey} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\nimport {Message, Poll, Chat as MTChat, MessageMedia, AvailableReaction, MessageEntity, InputStickerSet, StickerSet, Document, Reaction} from '../../layer';\nimport PopupReportMessages from '../popups/reportMessages';\nimport assumeType from '../../helpers/assumeType';\nimport PopupSponsored from '../popups/sponsored';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {getMiddleware} from '../../helpers/middleware';\nimport PeerTitle from '../peerTitle';\nimport StackedAvatars from '../stackedAvatars';\nimport {IS_APPLE} from '../../environment/userAgent';\nimport PopupReactedList from '../popups/reactedList';\nimport {ChatReactionsMenu, REACTION_CONTAINER_SIZE} from './reactionsMenu';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport positionMenu, {MenuPositionPadding} from '../../helpers/positionMenu';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {SERVICE_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport {MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport PopupStickers from '../popups/stickers';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport canSaveMessageMedia from '../../lib/appManagers/utils/messages/canSaveMessageMedia';\nimport getAlbumText from '../../lib/appManagers/utils/messages/getAlbumText';\n\nexport default class ChatContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean | Promise, notDirect?: () => boolean, withSelection?: true, isSponsored?: true, localName?: 'views' | 'emojis'})[];\n private element: HTMLElement;\n\n private isSelectable: boolean;\n private isSelected: boolean;\n private target: HTMLElement;\n private isTargetAGroupedItem: boolean;\n private isTextSelected: boolean;\n private isAnchorTarget: boolean;\n private isUsernameTarget: boolean;\n private isSponsored: boolean;\n private isOverBubble: boolean;\n private peerId: PeerId;\n private mid: number;\n private message: Message.message | Message.messageService;\n private noForwards: boolean;\n\n private reactionsMenu: ChatReactionsMenu;\n private listenerSetter: ListenerSetter;\n private attachListenerSetter: ListenerSetter;\n\n private viewerPeerId: PeerId;\n private middleware: ReturnType;\n private canOpenReactedList: boolean;\n\n private emojiInputsPromise: CancellablePromise;\n private albumMessages: Message.message[];\n private linkToMessage: Awaited>;\n private selectedMessagesText: string;\n\n constructor(\n private chat: Chat,\n private managers: AppManagers\n ) {\n this.listenerSetter = new ListenerSetter();\n this.attachListenerSetter = new ListenerSetter();\n this.middleware = getMiddleware();\n }\n\n public attachTo(element: HTMLElement) {\n this.attachListenerSetter.removeAll();\n\n if(IS_TOUCH_SUPPORTED/* && false */) {\n attachClickEvent(element, (e) => {\n if(this.chat.selection.isSelecting) {\n return;\n }\n\n this.chat.log('touchend', e);\n\n const badSelectors = [\n '.name',\n '.peer-title',\n '.reply',\n '.document',\n 'audio-element',\n 'avatar-element',\n 'a',\n '.bubble-beside-button',\n 'replies-element',\n '[data-saved-from]:not(.bubble)',\n 'poll-element',\n '.attachment',\n '.reply-markup-button'\n ];\n const good = !(e.target as HTMLElement).closest(badSelectors.join(', '));\n if(good) {\n cancelEvent(e);\n // onContextMenu((e as TouchEvent).changedTouches[0]);\n // onContextMenu((e as TouchEvent).changedTouches ? (e as TouchEvent).changedTouches[0] : e as MouseEvent);\n this.onContextMenu(e);\n }\n }, {listenerSetter: this.attachListenerSetter});\n } else attachContextMenuListener(element, this.onContextMenu, this.attachListenerSetter);\n }\n\n private onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\n let bubble: HTMLElement, contentWrapper: HTMLElement;\n\n try {\n contentWrapper = findUpClassName(e.target, 'bubble-content-wrapper');\n bubble = contentWrapper ? contentWrapper.parentElement : findUpClassName(e.target, 'bubble');\n } catch(e) {}\n\n // ! context menu click by date bubble (there is no pointer-events)\n if(!bubble || bubble.classList.contains('bubble-first')) return;\n\n let element = this.element;\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\n if(element && element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\n\n let mid = +bubble.dataset.mid;\n if(!mid) return;\n\n const r = async() => {\n const isSponsored = this.isSponsored = mid < 0;\n this.isSelectable = this.chat.selection.canSelectBubble(bubble);\n this.peerId = this.chat.peerId;\n // this.msgID = msgID;\n this.target = e.target as HTMLElement;\n this.isTextSelected = !isSelectionEmpty();\n this.isAnchorTarget = this.target.tagName === 'A' && (\n (this.target as HTMLAnchorElement).target === '_blank' ||\n this.target.classList.contains('anchor-url')\n );\n this.isUsernameTarget = this.target.tagName === 'A' && this.target.classList.contains('mention');\n\n const mids = await this.chat.getMidsByMid(mid);\n // * если открыть контекстное меню для альбома не по бабблу, и последний элемент не выбран, чтобы показать остальные пункты\n if(this.chat.selection.isSelecting && !contentWrapper) {\n if(isSponsored) {\n return;\n }\n\n if(mids.length > 1) {\n const selectedMid = this.chat.selection.isMidSelected(this.peerId, mid) ?\n mid :\n mids.find((mid) => this.chat.selection.isMidSelected(this.peerId, mid));\n if(selectedMid) {\n mid = selectedMid;\n }\n }\n }\n\n this.isOverBubble = !!contentWrapper;\n\n const groupedItem = findUpClassName(this.target, 'grouped-item');\n this.isTargetAGroupedItem = !!groupedItem;\n if(groupedItem) {\n this.mid = +groupedItem.dataset.mid;\n } else {\n this.mid = mid;\n }\n\n this.isSelected = this.chat.selection.isMidSelected(this.peerId, this.mid);\n this.message = (bubble as any).message || await this.chat.getMessage(this.mid);\n this.albumMessages = (this.message as Message.message).grouped_id ? await this.managers.appMessagesManager.getMessagesByAlbum((this.message as Message.message).grouped_id) : undefined;\n this.noForwards = !isSponsored && !(await this.managers.appMessagesManager.canForward(this.message));\n this.viewerPeerId = undefined;\n this.canOpenReactedList = undefined;\n this.linkToMessage = await this.getUrlToMessage();\n this.selectedMessagesText = await this.getSelectedMessagesText();\n\n const initResult = await this.init();\n if(!initResult) {\n return;\n }\n\n element = initResult.element;\n const {cleanup, destroy, menuPadding, reactionsMenu, reactionsMenuPosition} = initResult;\n let isReactionsMenuVisible = false;\n if(reactionsMenu) {\n const className = 'is-visible';\n isReactionsMenuVisible = reactionsMenu.container.classList.contains(className);\n if(isReactionsMenuVisible) reactionsMenu.container.classList.remove(className);\n\n if(reactionsMenuPosition === 'horizontal') {\n const offsetSize = element[/* reactionsMenuPosition === 'vertical' ? 'offsetHeight' : */'offsetWidth'];\n // if(reactionsMenu.scrollable.container.scrollWidth > offsetWidth) {\n const INNER_CONTAINER_PADDING = 8;\n const visibleLength = (offsetSize - INNER_CONTAINER_PADDING) / REACTION_CONTAINER_SIZE;\n const nextVisiblePart = visibleLength % 1;\n const MIN_NEXT_VISIBLE_PART = 0.65;\n if(nextVisiblePart < MIN_NEXT_VISIBLE_PART) {\n const minSize = (offsetSize + (MIN_NEXT_VISIBLE_PART - nextVisiblePart) * REACTION_CONTAINER_SIZE) | 0;\n element.style[/* reactionsMenuPosition === 'vertical' ? 'minHeight' : */'minWidth'] = minSize + 'px';\n }\n // }\n }\n }\n\n const side: 'left' | 'right' = bubble.classList.contains('is-in') ? 'left' : 'right';\n // bubble.parentElement.append(element);\n // appImManager.log('contextmenu', e, bubble, side);\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, element, side, menuPadding);\n\n if(reactionsMenu) {\n reactionsMenu.widthContainer.style.top = element.style.top;\n reactionsMenu.widthContainer.style.left = element.style.left;\n reactionsMenu.widthContainer.style.setProperty('--menu-width', element[reactionsMenuPosition === 'vertical' ? 'offsetHeight' : 'offsetWidth'] + 'px');\n element.parentElement.append(reactionsMenu.widthContainer);\n if(isReactionsMenuVisible) void reactionsMenu.container.offsetLeft; // reflow\n }\n\n contextMenuController.openBtnMenu(element, () => {\n if(reactionsMenu) {\n reactionsMenu.container.classList.remove('is-visible');\n }\n\n this.mid = 0;\n this.peerId = undefined;\n this.target = null;\n this.viewerPeerId = undefined;\n this.canOpenReactedList = undefined;\n cleanup();\n\n setTimeout(() => {\n destroy();\n }, 300);\n });\n\n if(isReactionsMenuVisible) {\n reactionsMenu.container.classList.add('is-visible');\n }\n };\n\n r();\n };\n\n public cleanup() {\n this.listenerSetter.removeAll();\n this.reactionsMenu && this.reactionsMenu.cleanup();\n this.middleware.clean();\n }\n\n public destroy() {\n this.cleanup();\n this.attachListenerSetter.removeAll();\n }\n\n private async filterButtons(buttons: ChatContextMenu['buttons']) {\n if(this.isSponsored) {\n return buttons.filter((button) => {\n return button.isSponsored;\n });\n } else {\n return filterAsync(buttons, async(button) => {\n let good: boolean;\n\n // if((appImManager.chatSelection.isSelecting && !button.withSelection) || (button.withSelection && !appImManager.chatSelection.isSelecting)) {\n if(this.chat.selection.isSelecting && !button.withSelection) {\n good = false;\n } else {\n good = this.isOverBubble || IS_TOUCH_SUPPORTED || true ?\n await button.verify() :\n button.notDirect && await button.verify() && button.notDirect();\n }\n\n return !!good;\n });\n }\n }\n\n private setButtons() {\n const verifyFavoriteSticker = async(toAdd: boolean) => {\n const doc = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document;\n if(!(doc as MyDocument)?.sticker) {\n return false;\n }\n\n const favedStickers = await this.managers.acknowledged.appStickersManager.getFavedStickersStickers();\n if(!favedStickers.cached) {\n return false;\n }\n\n const found = (await favedStickers.result).some((_doc) => _doc.id === doc.id);\n return toAdd ? !found : found;\n };\n\n this.buttons = [{\n icon: 'send2',\n text: 'MessageScheduleSend',\n onClick: this.onSendScheduledClick,\n verify: () => this.chat.type === 'scheduled' && !this.message.pFlags.is_outgoing\n }, {\n icon: 'send2',\n text: 'Message.Context.Selection.SendNow',\n onClick: this.onSendScheduledClick,\n verify: () => this.chat.type === 'scheduled' && this.isSelected && !this.chat.selection.selectionSendNowBtn.hasAttribute('disabled'),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'schedule',\n text: 'MessageScheduleEditTime',\n onClick: () => {\n this.chat.input.scheduleSending(() => {\n assumeType(this.message);\n this.managers.appMessagesManager.editMessage(this.message, this.message.message, {\n scheduleDate: this.chat.input.scheduleDate,\n entities: this.message.entities\n });\n\n this.chat.input.onMessageSent(false, false);\n }, new Date(this.message.date * 1000));\n },\n verify: () => this.chat.type === 'scheduled'\n }, {\n icon: 'reply',\n text: 'Reply',\n onClick: this.onReplyClick,\n verify: async() => await this.chat.canSend() &&\n !this.message.pFlags.is_outgoing &&\n !!this.chat.input.messageInput &&\n this.chat.type !== 'scheduled'/* ,\n cancelEvent: true */\n }, {\n icon: 'favourites',\n text: 'AddToFavorites',\n onClick: this.onFaveStickerClick.bind(this, false),\n verify: () => verifyFavoriteSticker(true)\n }, {\n icon: 'favourites',\n text: 'DeleteFromFavorites',\n onClick: this.onFaveStickerClick.bind(this, true),\n verify: () => verifyFavoriteSticker(false)\n }, {\n icon: 'edit',\n text: 'Edit',\n onClick: this.onEditClick,\n verify: async() => (await this.managers.appMessagesManager.canEditMessage(this.message, 'text')) && !!this.chat.input.messageInput\n }, {\n icon: 'copy',\n text: 'Copy',\n onClick: this.onCopyClick,\n verify: () => !this.noForwards && !!(this.message as Message.message).message && !this.isTextSelected && (!this.isAnchorTarget || (this.message as Message.message).message !== this.target.innerText)\n }, {\n icon: 'copy',\n text: 'Chat.CopySelectedText',\n onClick: this.onCopyClick,\n verify: () => !this.noForwards && !!(this.message as Message.message).message && this.isTextSelected\n }, {\n icon: 'copy',\n text: 'Message.Context.Selection.Copy',\n onClick: this.onCopyClick,\n verify: async() => {\n if(!this.isSelected || this.noForwards) {\n return false;\n }\n\n for(const [peerId, mids] of this.chat.selection.selectedMids) {\n const storageKey: MessagesStorageKey = `${peerId}_${this.chat.type === 'scheduled' ? 'scheduled' : 'history'}`;\n for(const mid of mids) {\n const message = (await this.managers.appMessagesManager.getMessageFromStorage(storageKey, mid)) as Message.message;\n if(!!message.message) {\n return true;\n }\n }\n }\n\n return false;\n },\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'copy',\n text: 'CopyLink',\n onClick: this.onCopyAnchorLinkClick,\n verify: () => this.isAnchorTarget,\n withSelection: true\n }, {\n icon: 'copy',\n text: 'Text.Context.Copy.Username',\n onClick: () => {\n copyTextToClipboard(this.target.innerHTML);\n },\n verify: () => this.isUsernameTarget,\n withSelection: true\n }, {\n icon: 'copy',\n text: 'Text.Context.Copy.Hashtag',\n onClick: () => {\n copyTextToClipboard(this.target.innerHTML);\n },\n verify: () => this.target.classList.contains('anchor-hashtag'),\n withSelection: true\n }, {\n icon: 'link',\n text: 'MessageContext.CopyMessageLink1',\n onClick: this.onCopyLinkClick,\n verify: async() => await this.managers.appPeersManager.isChannel(this.peerId) && !this.message.pFlags.is_outgoing\n }, {\n icon: 'pin',\n text: 'Message.Context.Pin',\n onClick: this.onPinClick,\n verify: async() => !this.message.pFlags.is_outgoing &&\n this.message._ !== 'messageService' &&\n !this.message.pFlags.pinned &&\n await this.managers.appPeersManager.canPinMessage(this.peerId) &&\n this.chat.type !== 'scheduled'\n }, {\n icon: 'unpin',\n text: 'Message.Context.Unpin',\n onClick: this.onUnpinClick,\n verify: async() => (this.message as Message.message).pFlags.pinned && await this.managers.appPeersManager.canPinMessage(this.peerId)\n }, {\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: () => {\n appDownloadManager.downloadToDisc({media: getMediaFromMessage(this.message)});\n },\n verify: () => {\n if(!canSaveMessageMedia(this.message) || this.noForwards) {\n return false;\n }\n\n const isPhoto: boolean = !!((this.message as Message.message).media as MessageMedia.messageMediaPhoto)?.photo;\n let isGoodType = false\n\n if(isPhoto) {\n isGoodType = true;\n } else {\n const doc: MyDocument = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document as any;\n if(!doc) return false;\n // isGoodType = doc.type && (['gif', 'video', 'audio', 'voice', 'sticker'] as MyDocument['type'][]).includes(doc.type)\n isGoodType = true;\n }\n\n let hasTarget = !!IS_TOUCH_SUPPORTED;\n\n if(isGoodType) hasTarget ||= !!findUpClassName(this.target, 'document') || !!findUpClassName(this.target, 'audio') || !!findUpClassName(this.target, 'media-sticker-wrapper') || !!findUpClassName(this.target, 'media-photo') || !!findUpClassName(this.target, 'media-video');\n\n return isGoodType && hasTarget;\n }\n }, {\n icon: 'checkretract',\n text: 'Chat.Poll.Unvote',\n onClick: this.onRetractVote,\n verify: () => {\n const poll = (this.message as any).media?.poll as Poll;\n return poll && poll.chosenIndexes.length && !poll.pFlags.closed && !poll.pFlags.quiz;\n }/* ,\n cancelEvent: true */\n }, {\n icon: 'stop',\n text: 'Chat.Poll.Stop',\n onClick: this.onStopPoll,\n verify: async() => {\n const poll = (this.message as any).media?.poll;\n return await this.managers.appMessagesManager.canEditMessage(this.message, 'poll') && poll && !poll.pFlags.closed && !this.message.pFlags.is_outgoing;\n }/* ,\n cancelEvent: true */\n }, {\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick, // let forward the message if it's outgoing but not ours (like a changelog)\n verify: () => !this.noForwards && this.chat.type !== 'scheduled' && (!this.message.pFlags.is_outgoing || this.message.fromId === SERVICE_PEER_ID) && this.message._ !== 'messageService'\n }, {\n icon: 'forward',\n text: 'Message.Context.Selection.Forward',\n onClick: this.onForwardClick,\n verify: () => this.chat.selection.selectionForwardBtn &&\n this.isSelected &&\n !this.chat.selection.selectionForwardBtn.hasAttribute('disabled'),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'flag',\n text: 'ReportChat',\n onClick: () => {\n new PopupReportMessages(this.peerId, [this.mid]);\n },\n verify: async() => !this.message.pFlags.out && this.message._ === 'message' && !this.message.pFlags.is_outgoing && await this.managers.appPeersManager.isChannel(this.peerId),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Select',\n onClick: this.onSelectClick,\n verify: () => !(this.message as Message.messageService).action && !this.isSelected && this.isSelectable,\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Selection.Clear',\n onClick: this.onClearSelectionClick,\n verify: () => this.isSelected,\n notDirect: () => true,\n withSelection: true\n }, {\n onClick: () => {\n if(this.viewerPeerId) {\n this.chat.appImManager.setInnerPeer({\n peerId: this.viewerPeerId\n });\n } else if(this.canOpenReactedList) {\n new PopupReactedList(this.message as Message.message);\n } else {\n return false;\n }\n },\n verify: async() => !this.peerId.isUser() && (!!(this.message as Message.message).reactions?.recent_reactions?.length || await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message)),\n notDirect: () => true,\n localName: 'views'\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: async() => this.managers.appMessagesManager.canDeleteMessage(this.message)\n }, {\n icon: 'delete danger',\n text: 'Message.Context.Selection.Delete',\n onClick: this.onDeleteClick,\n verify: () => this.isSelected && !this.chat.selection.selectionDeleteBtn.hasAttribute('disabled'),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'info',\n text: 'Chat.Message.Sponsored.What',\n onClick: () => {\n new PopupSponsored();\n },\n verify: () => false,\n isSponsored: true\n }, {\n // icon: 'smile',\n text: 'Loading',\n onClick: () => {\n this.emojiInputsPromise.then((inputs) => {\n new PopupStickers(inputs, true).show();\n });\n },\n verify: () => !!this.getUniqueCustomEmojisFromMessage().length,\n notDirect: () => true,\n localName: 'emojis'\n }];\n }\n\n private getUniqueCustomEmojisFromMessage() {\n const docIds: DocId[] = [];\n\n const message = this.albumMessages ? getAlbumText(this.albumMessages) || this.message : this.message;\n\n const entities = (message as Message.message).entities;\n if(entities) {\n const filtered = entities.filter((entity) => entity._ === 'messageEntityCustomEmoji') as MessageEntity.messageEntityCustomEmoji[];\n docIds.push(...filtered.map((entity) => entity.document_id));\n }\n\n const reactions = (message as Message.message).reactions;\n if(reactions) {\n const results = reactions.results.filter((reactionCount) => reactionCount.reaction._ === 'reactionCustomEmoji');\n docIds.push(...results.map((reactionCount) => (reactionCount.reaction as Reaction.reactionCustomEmoji).document_id));\n }\n\n return filterUnique(docIds);\n }\n\n private async init() {\n this.cleanup();\n this.setButtons();\n\n const filteredButtons = await this.filterButtons(this.buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const element = this.element = await ButtonMenu({\n buttons: filteredButtons,\n listenerSetter: this.listenerSetter\n });\n element.id = 'bubble-contextmenu';\n element.classList.add('contextmenu');\n\n const viewsButton = filteredButtons.find((button) => button.localName === 'views');\n if(viewsButton) {\n const reactions = (this.message as Message.message).reactions;\n const recentReactions = reactions?.recent_reactions;\n const isViewingReactions = !!recentReactions?.length;\n const participantsCount = await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message) ?\n ((await this.managers.appPeersManager.getPeer(this.peerId)) as MTChat.chat).participants_count :\n undefined;\n const reactedLength = reactions ? reactions.results.reduce((acc, r) => acc + r.count, 0) : undefined;\n\n viewsButton.element.classList.add('tgico-' + (isViewingReactions ? 'reactions' : 'checks'));\n const i18nElem = new I18n.IntlElement({\n key: isViewingReactions ? (\n participantsCount === undefined ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted'\n ) : 'NobodyViewed',\n args: isViewingReactions ? (\n participantsCount === undefined ? [reactedLength] : [participantsCount, participantsCount]\n ) : undefined,\n element: viewsButton.textElement\n });\n\n let fakeText: HTMLElement;\n if(isViewingReactions) {\n if(participantsCount === undefined) {\n fakeText = i18n('Chat.Context.ReactedFast', [reactedLength]);\n } else {\n fakeText = i18n(\n recentReactions.length === participantsCount ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted',\n [recentReactions.length, participantsCount]\n );\n }\n } else {\n fakeText = i18n('Loading');\n }\n\n fakeText.classList.add('btn-menu-item-text-fake');\n viewsButton.element.append(fakeText);\n\n const AVATAR_SIZE = 22;\n const MAX_AVATARS = 3;\n const PADDING_PER_AVATAR = 1.125;\n i18nElem.element.style.visibility = 'hidden';\n i18nElem.element.style.paddingRight = isViewingReactions ? PADDING_PER_AVATAR * Math.min(MAX_AVATARS, recentReactions.length) + 'rem' : '1rem';\n const middleware = this.middleware.get();\n this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message as Message.message).then((result) => {\n if(!middleware()) {\n return;\n }\n\n if(fakeText) {\n fakeText.remove();\n }\n\n const reactions = result.combined;\n const reactedLength = participantsCount === undefined ?\n result.reactionsCount :\n (\n isViewingReactions ?\n reactions.filter((reaction) => reaction.reaction).length :\n reactions.length\n );\n\n let fakeElem: HTMLElement;\n if(reactions.length === 1) {\n fakeElem = new PeerTitle({\n peerId: reactions[0].peerId,\n onlyFirstName: true,\n dialog: false\n }).element;\n\n if(!isViewingReactions || result.readParticipants.length <= 1) {\n this.viewerPeerId = reactions[0].peerId;\n }\n } else if(isViewingReactions) {\n const isFull = reactedLength === reactions.length || participantsCount === undefined;\n fakeElem = i18n(\n isFull ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted',\n isFull ? [reactedLength] : [reactedLength, reactions.length]\n );\n } else {\n if(!reactions.length) {\n i18nElem.element.style.visibility = '';\n } else {\n fakeElem = i18n('MessageSeen', [reactions.length]);\n }\n }\n\n if(fakeElem) {\n fakeElem.style.paddingRight = PADDING_PER_AVATAR * Math.min(MAX_AVATARS, reactedLength) + 'rem';\n fakeElem.classList.add('btn-menu-item-text-fake');\n viewsButton.element.append(fakeElem);\n }\n\n if(reactions.length) {\n const avatars = new StackedAvatars({avatarSize: AVATAR_SIZE});\n avatars.render(recentReactions ? recentReactions.map((r) => getPeerId(r.peer_id)) : reactions.map((reaction) => reaction.peerId));\n viewsButton.element.append(avatars.container);\n\n // if(reactions.length > 1) {\n // if(isViewingReactions) {\n this.canOpenReactedList = true;\n // }\n }\n });\n }\n\n let menuPadding: MenuPositionPadding;\n let reactionsMenu: ChatReactionsMenu;\n let reactionsMenuPosition: 'horizontal' | 'vertical';\n if(\n this.message._ === 'message' &&\n !this.chat.selection.isSelecting &&\n !this.message.pFlags.is_outgoing &&\n !this.message.pFlags.is_scheduled &&\n !this.message.pFlags.local\n ) {\n reactionsMenuPosition = (IS_APPLE || IS_TOUCH_SUPPORTED)/* && false */ ? 'horizontal' : 'vertical';\n reactionsMenu = this.reactionsMenu = new ChatReactionsMenu(this.managers, reactionsMenuPosition, this.middleware);\n reactionsMenu.init(await this.managers.appMessagesManager.getGroupsFirstMessage(this.message));\n // element.prepend(reactionsMenu.widthContainer);\n\n const size = 36;\n const margin = 8;\n const totalSize = size + margin;\n const paddingLeft = 0, paddingRight = 0;\n if(reactionsMenuPosition === 'vertical') {\n menuPadding = {\n top: paddingLeft,\n // bottom: 36, // positionMenu will detect it itself somehow\n left: totalSize\n };\n } else {\n menuPadding = {\n top: totalSize,\n right: paddingRight,\n left: paddingLeft\n };\n }\n }\n\n const emojisButton = filteredButtons.find((button) => button.localName === 'emojis');\n if(emojisButton) {\n emojisButton.element.classList.add('is-multiline');\n emojisButton.element.parentElement.insertBefore(document.createElement('hr'), emojisButton.element);\n\n const setPadding = () => {\n menuPadding ??= {};\n menuPadding.bottom = 24;\n };\n\n const docIds = this.getUniqueCustomEmojisFromMessage();\n const inputsPromise = this.emojiInputsPromise = deferredPromise();\n\n await this.managers.appEmojiManager.getCachedCustomEmojiDocuments(docIds).then(async(docs) => {\n const p = async(docs: Document.document[]) => {\n const s: Map = new Map();\n docs.forEach((doc) => {\n if(!doc || s.has(doc.stickerSetInput.id)) {\n return;\n }\n\n s.set(doc.stickerSetInput.id, doc.stickerSetInput);\n });\n\n const inputs = [...s.values()];\n inputsPromise.resolve(inputs);\n if(s.size === 1) {\n const result = await this.managers.acknowledged.appStickersManager.getStickerSet(inputs[0]);\n const promise = result.result.then((set) => {\n const el = i18n('MessageContainsEmojiPack', [wrapEmojiText(set.set.title)]);\n replaceContent(emojisButton.textElement, el);\n });\n\n return result.cached ? promise : (setPadding(), undefined);\n }\n\n replaceContent(emojisButton.textElement, i18n('MessageContainsEmojiPacks', [s.size]));\n };\n\n if(docs.some((doc) => !doc)) {\n setPadding();\n this.managers.appEmojiManager.getCustomEmojiDocuments(docIds).then(p);\n } else {\n return p(docs);\n }\n });\n // emojisButton.element.append(i18n('Loading'));\n }\n\n this.chat.container.append(element);\n\n return {\n element,\n cleanup: () => {\n this.cleanup();\n reactionsMenu && reactionsMenu.cleanup();\n },\n destroy: () => {\n element.remove();\n reactionsMenu && reactionsMenu.widthContainer.remove();\n },\n menuPadding,\n reactionsMenu,\n reactionsMenuPosition\n };\n }\n\n private async getUrlToMessage() {\n if(this.peerId.isUser()) {\n return;\n }\n\n let threadMessage: Message.message;\n const {peerId, mid} = this;\n const threadId = this.chat.threadId;\n if(this.chat.type === 'discussion') {\n threadMessage = (await this.managers.appMessagesManager.getMessageByPeer(peerId, threadId)) as Message.message;\n }\n\n const username = await this.managers.appPeersManager.getPeerUsername(threadMessage ? threadMessage.fromId : peerId);\n const msgId = getServerMessageId(mid);\n let url = 'https://t.me/';\n if(username) {\n url += username;\n if(threadMessage) url += `/${getServerMessageId(threadMessage.fwd_from.channel_post)}?comment=${msgId}`;\n else if(threadId) url += `/${getServerMessageId(threadId)}/${msgId}`;\n else url += '/' + msgId;\n } else {\n url += 'c/' + peerId.toChatId();\n if(threadMessage) url += `/${msgId}?thread=${getServerMessageId(threadMessage.mid)}`;\n else if(threadId) url += `/${getServerMessageId(threadId)}/${msgId}`;\n else url += '/' + msgId;\n }\n\n return {url, isPrivate: !username};\n }\n\n private async getSelectedMessagesText() {\n if(!isSelectionEmpty()) {\n return '';\n }\n\n const mids = this.chat.selection.isSelecting ?\n [...this.chat.selection.selectedMids.get(this.peerId)].sort((a, b) => a - b) :\n [this.mid];\n\n const parts: string[] = await Promise.all(mids.map(async(mid) => {\n const message = (await this.chat.getMessage(mid)) as Message.message;\n return message?.message ? message.message + '\\n' : '';\n }));\n\n return parts.join('');\n }\n\n private onSendScheduledClick = async() => {\n if(this.chat.selection.isSelecting) {\n simulateClickEvent(this.chat.selection.selectionSendNowBtn);\n } else {\n new PopupSendNow(this.peerId, await this.chat.getMidsByMid(this.mid));\n }\n };\n\n private onReplyClick = () => {\n this.chat.input.initMessageReply(this.mid);\n };\n\n private onFaveStickerClick = (unfave?: boolean) => {\n const docId = ((this.message as Message.message).media as MessageMedia.messageMediaDocument).document.id;\n this.managers.appStickersManager.faveSticker(docId, unfave);\n };\n\n private onEditClick = () => {\n this.chat.input.initMessageEditing(this.mid);\n };\n\n private onCopyClick = async() => {\n if(isSelectionEmpty()) {\n copyTextToClipboard(this.selectedMessagesText);\n } else {\n document.execCommand('copy');\n // cancelSelection();\n }\n };\n\n private onCopyAnchorLinkClick = () => {\n copyTextToClipboard((this.target as HTMLAnchorElement).href);\n };\n\n private onCopyLinkClick = () => {\n const {url, isPrivate} = this.linkToMessage;\n const key: LangPackKey = isPrivate ? 'LinkCopiedPrivateInfo' : 'LinkCopied';\n toast(I18n.format(key, true));\n copyTextToClipboard(url);\n };\n\n private onPinClick = () => {\n new PopupPinMessage(this.peerId, this.mid);\n };\n\n private onUnpinClick = () => {\n new PopupPinMessage(this.peerId, this.mid, true);\n };\n\n private onRetractVote = () => {\n this.managers.appPollsManager.sendVote(this.message as Message.message, []);\n };\n\n private onStopPoll = () => {\n this.managers.appPollsManager.stopPoll(this.message as Message.message);\n };\n\n private onForwardClick = async() => {\n if(this.chat.selection.isSelecting) {\n simulateClickEvent(this.chat.selection.selectionForwardBtn);\n } else {\n const peerId = this.peerId;\n const mids = this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid);\n new PopupForward({\n [peerId]: mids\n });\n }\n };\n\n private onSelectClick = () => {\n this.chat.selection.toggleByElement(findUpClassName(this.target, 'grouped-item') || findUpClassName(this.target, 'bubble'));\n };\n\n private onClearSelectionClick = () => {\n this.chat.selection.cancelSelection();\n };\n\n private onDeleteClick = async() => {\n if(this.chat.selection.isSelecting) {\n simulateClickEvent(this.chat.selection.selectionDeleteBtn);\n } else {\n new PopupDeleteMessages(this.peerId, this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid), this.chat.type);\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport rootScope from '../../lib/rootScope';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from '../buttonMenu';\n\nexport default class SendMenu {\n public sendMenu: HTMLElement;\n private sendMenuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\n private type: 'schedule' | 'reminder';\n\n constructor(options: {\n onSilentClick: () => void,\n onScheduleClick: () => void,\n listenerSetter?: ListenerSetter,\n openSide: string,\n onContextElement: HTMLElement,\n onOpen?: () => boolean\n }) {\n this.sendMenuButtons = [{\n icon: 'mute',\n text: 'Chat.Send.WithoutSound',\n onClick: options.onSilentClick,\n verify: () => this.type === 'schedule'\n }, {\n icon: 'schedule',\n text: 'Chat.Send.ScheduledMessage',\n onClick: options.onScheduleClick,\n verify: () => this.type === 'schedule'\n }, {\n icon: 'schedule',\n text: 'Chat.Send.SetReminder',\n onClick: options.onScheduleClick,\n verify: () => this.type === 'reminder'\n }];\n\n this.sendMenu = ButtonMenuSync({buttons: this.sendMenuButtons, listenerSetter: options.listenerSetter});\n this.sendMenu.classList.add('menu-send', options.openSide);\n\n attachContextMenuListener(options.onContextElement, (e) => {\n if(options.onOpen && !options.onOpen()) {\n return;\n }\n\n this.sendMenuButtons.forEach((button) => {\n button.element.classList.toggle('hide', !button.verify());\n });\n\n cancelEvent(e);\n contextMenuController.openBtnMenu(this.sendMenu);\n }, options.listenerSetter);\n }\n\n public setPeerId(peerId: PeerId) {\n this.type = peerId === rootScope.myId ? 'reminder' : 'schedule';\n }\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from '../chat/chat';\nimport PopupElement from '.';\nimport CheckboxField from '../checkboxField';\nimport InputField from '../inputField';\nimport RadioField from '../radioField';\nimport Scrollable from '../scrollable';\nimport SendContextMenu from '../chat/sendContextMenu';\nimport I18n, {_i18n} from '../../lib/langPack';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {Poll} from '../../layer';\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\n\nconst MAX_LENGTH_QUESTION = 255;\nconst MAX_LENGTH_OPTION = 100;\nconst MAX_LENGTH_SOLUTION = 200;\n\nexport default class PopupCreatePoll extends PopupElement {\n private questionInputField: InputField;\n private questions: HTMLElement;\n protected scrollable: Scrollable;\n private tempId = 0;\n\n private anonymousCheckboxField: CheckboxField;\n private multipleCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\n private quizCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\n\n private correctAnswers: Uint8Array[];\n private quizSolutionField: InputField;\n private optionInputFields: InputField[];\n\n constructor(private chat: Chat) {\n super('popup-create-poll popup-new-media', {closable: true, withConfirm: 'Create', body: true, title: 'NewPoll'});\n this.construct();\n }\n\n private async construct() {\n this.questionInputField = new InputField({\n placeholder: 'AskAQuestion',\n label: 'AskAQuestion',\n name: 'question',\n maxLength: MAX_LENGTH_QUESTION\n });\n\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\n this.handleChange();\n });\n\n this.optionInputFields = [];\n\n if(this.chat.type !== 'scheduled') {\n const sendMenu = new SendContextMenu({\n onSilentClick: () => {\n this.chat.input.sendSilent = true;\n this.send();\n },\n onScheduleClick: () => {\n this.chat.input.scheduleSending(() => {\n this.send();\n });\n },\n openSide: 'bottom-left',\n onContextElement: this.btnConfirm\n });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.header.append(sendMenu.sendMenu);\n }\n\n this.header.append(this.questionInputField.container);\n\n const hr = document.createElement('hr');\n const d = document.createElement('div');\n d.classList.add('caption');\n _i18n(d, 'PollOptions');\n\n this.questions = document.createElement('form');\n this.questions.classList.add('poll-create-questions');\n\n const dd = document.createElement('div');\n dd.classList.add('poll-create-settings');\n\n const settingsCaption = document.createElement('div');\n settingsCaption.classList.add('caption');\n _i18n(settingsCaption, 'Settings');\n\n if(!(await this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))) {\n this.anonymousCheckboxField = new CheckboxField({\n text: 'NewPoll.Anonymous',\n name: 'anonymous'\n });\n this.anonymousCheckboxField.input.checked = true;\n dd.append(this.anonymousCheckboxField.label);\n }\n\n this.multipleCheckboxField = new CheckboxField({\n text: 'NewPoll.MultipleChoice',\n name: 'multiple'\n });\n this.quizCheckboxField = new CheckboxField({\n text: 'NewPoll.Quiz',\n name: 'quiz'\n });\n\n this.listenerSetter.add(this.multipleCheckboxField.input)('change', () => {\n const checked = this.multipleCheckboxField.input.checked;\n this.quizCheckboxField.input.toggleAttribute('disabled', checked);\n });\n\n this.listenerSetter.add(this.quizCheckboxField.input)('change', () => {\n const checked = this.quizCheckboxField.input.checked;\n\n (Array.from(this.questions.children) as HTMLElement[]).map((el) => {\n el.classList.toggle('radio-field', checked);\n });\n\n if(!checked) {\n this.correctAnswers = undefined;\n this.quizSolutionField.setValueSilently('');\n }\n\n quizElements.forEach((el) => el.classList.toggle('hide', !checked));\n\n this.multipleCheckboxField.input.toggleAttribute('disabled', checked);\n this.handleChange();\n });\n\n dd.append(this.multipleCheckboxField.label, this.quizCheckboxField.label);\n\n const quizElements: HTMLElement[] = [];\n\n const quizSolutionCaption = document.createElement('div');\n quizSolutionCaption.classList.add('caption');\n _i18n(quizSolutionCaption, 'AccDescrQuizExplanation');\n\n const quizHr = document.createElement('hr');\n\n const quizSolutionContainer = document.createElement('div');\n quizSolutionContainer.classList.add('poll-create-questions');\n\n this.quizSolutionField = new InputField({\n placeholder: 'NewPoll.Explanation.Placeholder',\n label: 'NewPoll.Explanation.Placeholder',\n name: 'solution',\n maxLength: MAX_LENGTH_SOLUTION\n });\n\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\n this.handleChange();\n });\n\n const quizSolutionSubtitle = document.createElement('div');\n quizSolutionSubtitle.classList.add('subtitle');\n _i18n(quizSolutionSubtitle, 'AddAnExplanationInfo');\n\n quizSolutionContainer.append(this.quizSolutionField.container, quizSolutionSubtitle);\n\n quizElements.push(quizHr, quizSolutionCaption, quizSolutionContainer);\n quizElements.forEach((el) => el.classList.add('hide'));\n\n this.body.parentElement.insertBefore(hr, this.body);\n this.body.append(d, this.questions, document.createElement('hr'), settingsCaption, dd, ...quizElements);\n\n attachClickEvent(this.btnConfirm, this.onSubmitClick, {listenerSetter: this.listenerSetter});\n\n this.scrollable = new Scrollable(this.body);\n this.appendMoreField();\n\n this.onEscape = () => {\n return !this.getFilledAnswers().length;\n };\n\n this.handleChange();\n }\n\n private getFilledAnswers() {\n const answers = Array.from(this.questions.children).map((el, idx) => {\n const input = el.querySelector('.input-field-input') as HTMLElement;\n return input instanceof HTMLInputElement ? input.value : getRichValueWithCaret(input, false, false).value;\n }).filter((v) => !!v.trim());\n\n return answers;\n }\n\n private onSubmitClick = () => {\n this.send();\n };\n\n private validate() {\n const question = this.questionInputField.value;\n if(!question) {\n return false;\n }\n\n if(question.length > MAX_LENGTH_QUESTION) {\n return false;\n }\n\n if(this.quizCheckboxField.input.checked && !this.correctAnswers?.length) {\n return false;\n }\n\n const answers = this.getFilledAnswers();\n if(answers.length < 2) {\n return false;\n }\n\n const tooLongOption = answers.find((a) => a.length > MAX_LENGTH_OPTION);\n if(tooLongOption) {\n return false;\n }\n\n const {value: quizSolution} = getRichValueWithCaret(this.quizSolutionField.input, false, false);\n if(quizSolution.length > MAX_LENGTH_SOLUTION) {\n return false;\n }\n\n return true;\n }\n\n private handleChange() {\n const valid = this.validate();\n this.btnConfirm.toggleAttribute('disabled', !valid);\n }\n\n public async send(force = false) {\n const question = this.questionInputField.value;\n\n const answers = this.getFilledAnswers();\n\n const {value: quizSolution, entities: quizSolutionEntities} = getRichValueWithCaret(this.quizSolutionField.input, true, false);\n\n if(this.chat.type === 'scheduled' && !force) {\n this.chat.input.scheduleSending(() => {\n this.send(true);\n });\n\n return;\n }\n\n this.hide();\n\n // const randomID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)];\n // const randomIDS = bigint(randomID[0]).shiftLeft(32).add(bigint(randomID[1])).toString();\n\n const pFlags: Poll['pFlags'] = {};\n\n if(this.anonymousCheckboxField && !this.anonymousCheckboxField.input.checked) {\n pFlags.public_voters = true;\n }\n\n if(this.multipleCheckboxField.input.checked) {\n pFlags.multiple_choice = true;\n }\n\n if(this.quizCheckboxField.input.checked) {\n pFlags.quiz = true;\n }\n\n const poll: Poll = {\n _: 'poll',\n pFlags,\n question,\n answers: answers.map((value, idx) => {\n return {\n _: 'pollAnswer',\n text: value,\n option: new Uint8Array([idx])\n };\n }),\n id: undefined\n };\n // poll.id = randomIDS;\n\n const inputMediaPoll = await this.chat.managers.appPollsManager.getInputMediaPoll(poll, this.correctAnswers, quizSolution, quizSolutionEntities);\n\n // console.log('Will try to create poll:', inputMediaPoll);\n\n this.chat.managers.appMessagesManager.sendOther(this.chat.peerId, inputMediaPoll, {\n ...this.chat.getMessageSendingParams()\n });\n\n if(this.chat.input.helperType === 'reply') {\n this.chat.input.clearHelper();\n }\n\n this.chat.input.onMessageSent(false, false);\n }\n\n onInput = (e: Event) => {\n const target = e.target as HTMLInputElement;\n\n const radioLabel = findUpTag(target, 'LABEL');\n const isEmpty = isInputEmpty(target);\n if(!isEmpty) {\n target.parentElement.classList.add('is-filled');\n radioLabel.classList.remove('hidden-widget');\n radioLabel.firstElementChild.removeAttribute('disabled');\n }\n\n const isLast = !radioLabel.nextElementSibling;\n if(isLast && !isEmpty && this.questions.childElementCount < 10) {\n this.appendMoreField();\n }\n\n this.handleChange();\n };\n\n onDeleteClick = (e: MouseEvent) => {\n const target = e.target as HTMLSpanElement;\n const label = findUpTag(target, 'LABEL');\n const idx = whichChild(label);\n\n if(this.correctAnswers && this.correctAnswers[0][0] === idx) {\n this.correctAnswers = undefined;\n }\n\n label.remove();\n this.optionInputFields.splice(idx, 1);\n\n this.optionInputFields.forEach((inputField, idx) => {\n inputField.options.labelOptions.length = 0;\n inputField.options.labelOptions.push(idx + 1);\n const i18nElement = I18n.weakMap.get(inputField.label.firstElementChild as HTMLElement);\n i18nElement.update();\n });\n\n this.handleChange();\n };\n\n private appendMoreField() {\n const tempId = this.tempId++;\n const idx = this.questions.childElementCount + 1;\n const questionField = new InputField({\n placeholder: 'NewPoll.OptionsAddOption',\n label: 'NewPoll.OptionLabel',\n labelOptions: [idx],\n name: 'question-' + tempId,\n maxLength: MAX_LENGTH_OPTION\n });\n this.listenerSetter.add(questionField.input)('input', this.onInput);\n\n const radioField = new RadioField({\n text: '',\n name: 'question'\n });\n radioField.main.append(questionField.container);\n attachClickEvent(questionField.input, cancelEvent, {listenerSetter: this.listenerSetter});\n radioField.label.classList.add('hidden-widget');\n radioField.input.disabled = true;\n if(!this.quizCheckboxField.input.checked) {\n radioField.label.classList.remove('radio-field');\n }\n this.listenerSetter.add(radioField.input)('change', () => {\n const checked = radioField.input.checked;\n if(checked) {\n const idx = whichChild(radioField.label);\n this.correctAnswers = [new Uint8Array([idx])];\n this.handleChange();\n }\n });\n\n const deleteBtn = document.createElement('span');\n deleteBtn.classList.add('btn-icon', 'tgico-close');\n questionField.container.append(deleteBtn);\n\n attachClickEvent(deleteBtn, this.onDeleteClick, {listenerSetter: this.listenerSetter, once: true});\n\n this.questions.append(radioField.label);\n\n this.scrollable.scrollIntoViewNew({\n element: this.questions.lastElementChild as HTMLElement,\n position: 'center'\n });\n // this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true);\n\n this.optionInputFields.push(questionField);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pause from './schedulers/pause';\nimport {makeMediaSize} from './mediaSize';\nimport scaleMediaElement from './canvas/scaleMediaElement';\nimport preloadVideo from './preloadVideo';\n\nexport function createPosterFromMedia(media: HTMLVideoElement | HTMLImageElement) {\n let width: number, height: number;\n if(media instanceof HTMLVideoElement) {\n width = media.videoWidth;\n height = media.videoHeight;\n } else {\n width = media.naturalWidth;\n height = media.naturalHeight;\n }\n\n return scaleMediaElement({\n media,\n mediaSize: makeMediaSize(width, height),\n boxSize: makeMediaSize(320, 240),\n quality: .9\n });\n}\n\nexport function createPosterFromVideo(video: HTMLVideoElement): ReturnType {\n return new Promise((resolve, reject) => {\n video.onseeked = () => {\n video.onseeked = () => {\n createPosterFromMedia(video).then(resolve);\n\n video.onseeked = undefined;\n };\n\n video.currentTime = 0;\n };\n\n video.onerror = reject;\n video.currentTime = Math.min(video.duration, 1);\n });\n}\n\nexport async function createPosterForVideo(url: string) {\n const video = await preloadVideo(url);\n\n return Promise.race([\n pause(2000) as Promise,\n createPosterFromVideo(video)\n ]);\n}\n\n\n","/**\n * @returns duration in ms\n */\nexport default function getGifDuration(image: HTMLImageElement) {\n const src = image.src;\n\n return fetch(src)\n .then((response) => response.arrayBuffer())\n .then((arrayBuffer) => {\n const d = new Uint8Array(arrayBuffer);\n // Thanks to http://justinsomnia.org/2006/10/gif-animation-duration-calculation/\n // And http://www.w3.org/Graphics/GIF/spec-gif89a.txt\n let duration = 0;\n for(let i = 0, length = d.length; i < length; ++i) {\n // Find a Graphic Control Extension hex(21F904__ ____ __00)\n if(d[i] == 0x21 &&\n d[i + 1] == 0xF9 &&\n d[i + 2] == 0x04 &&\n d[i + 7] == 0x00) {\n // Swap 5th and 6th bytes to get the delay per frame\n const delay = (d[i + 5] << 8) | (d[i + 4] & 0xFF);\n\n // Should be aware browsers have a minimum frame delay\n // e.g. 6ms for IE, 2ms modern browsers (50fps)\n duration += delay < 2 ? 10 : delay;\n }\n }\n\n return duration / 1000;\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from '../chat/chat';\nimport type {SendFileDetails} from '../../lib/appManagers/appMessagesManager';\nimport InputField from '../inputField';\nimport PopupElement from '.';\nimport Scrollable from '../scrollable';\nimport {toast} from '../toast';\nimport CheckboxField from '../checkboxField';\nimport SendContextMenu from '../chat/sendContextMenu';\nimport {createPosterFromMedia, createPosterFromVideo} from '../../helpers/createPoster';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport I18n, {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\nimport calcImageInBox from '../../helpers/calcImageInBox';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport getGifDuration from '../../helpers/getGifDuration';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport prepareAlbum from '../prepareAlbum';\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\nimport {ThumbCache} from '../../lib/storages/thumbs';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport {THUMB_TYPE_FULL} from '../../lib/mtproto/mtproto_config';\nimport wrapDocument from '../wrappers/document';\nimport createContextMenu from '../../helpers/dom/createContextMenu';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport wrapMediaSpoiler, {toggleMediaSpoiler} from '../wrappers/mediaSpoiler';\nimport {MiddlewareHelper} from '../../helpers/middleware';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport scaleMediaElement from '../../helpers/canvas/scaleMediaElement';\nimport {doubleRaf} from '../../helpers/schedulers';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport {Photo, PhotoSize} from '../../layer';\nimport {getPreviewBytesFromURL} from '../../helpers/bytes/getPreviewURLFromBytes';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\n\ntype SendFileParams = SendFileDetails & {\n file?: File,\n scaledBlob?: Blob,\n noSound?: boolean,\n itemDiv: HTMLElement,\n mediaSpoiler?: HTMLElement,\n middlewareHelper: MiddlewareHelper\n // strippedBytes?: PhotoSize.photoStrippedSize['bytes']\n};\n\nlet currentPopup: PopupNewMedia;\n\nexport function getCurrentNewMediaPopup() {\n return currentPopup;\n}\n\nexport default class PopupNewMedia extends PopupElement {\n private input: HTMLElement;\n private mediaContainer: HTMLElement;\n private groupCheckboxField: CheckboxField;\n private mediaCheckboxField: CheckboxField;\n private wasInputValue: string;\n\n private willAttach: Partial<{\n type: 'media' | 'document',\n isMedia: true,\n group: boolean,\n sendFileDetails: SendFileParams[]\n }>;\n private inputField: InputField;\n private captionLengthMax: number;\n\n private animationGroup: AnimationItemGroup;\n\n constructor(\n private chat: Chat,\n private files: File[],\n willAttachType: PopupNewMedia['willAttach']['type']\n ) {\n super('popup-send-photo popup-new-media', {\n closable: true,\n withConfirm: 'Modal.Send',\n confirmShortcutIsSendShortcut: true,\n body: true,\n title: true\n });\n\n this.animationGroup = '';\n this.construct(willAttachType);\n }\n\n private async construct(willAttachType: PopupNewMedia['willAttach']['type']) {\n this.willAttach = {\n type: willAttachType,\n sendFileDetails: [],\n group: false\n };\n\n const captionMaxLength = await this.managers.apiManager.getLimit('caption');\n this.captionLengthMax = captionMaxLength;\n\n attachClickEvent(this.btnConfirm, () => this.send(), {listenerSetter: this.listenerSetter});\n\n if(this.chat.type !== 'scheduled') {\n const sendMenu = new SendContextMenu({\n onSilentClick: () => {\n this.chat.input.sendSilent = true;\n this.send();\n },\n onScheduleClick: () => {\n this.chat.input.scheduleSending(() => {\n this.send();\n });\n },\n openSide: 'bottom-left',\n onContextElement: this.btnConfirm,\n listenerSetter: this.listenerSetter\n });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.header.append(sendMenu.sendMenu);\n }\n\n this.mediaContainer = document.createElement('div');\n this.mediaContainer.classList.add('popup-photo');\n const scrollable = new Scrollable(null);\n scrollable.container.append(this.mediaContainer);\n\n this.inputField = new InputField({\n placeholder: 'PreviewSender.CaptionPlaceholder',\n label: 'Caption',\n name: 'photo-caption',\n maxLength: this.captionLengthMax,\n withLinebreaks: true\n });\n this.input = this.inputField.input;\n\n this.inputField.value = this.wasInputValue = this.chat.input.messageInputField.input.innerHTML;\n this.chat.input.messageInputField.value = '';\n\n this.body.append(scrollable.container);\n this.container.append(this.inputField.container);\n\n this.attachFiles();\n\n this.addEventListener('close', () => {\n this.files.length = 0;\n this.willAttach.sendFileDetails.length = 0;\n\n if(currentPopup === this) {\n currentPopup = undefined;\n }\n });\n\n let target: HTMLElement, isMedia: boolean, item: SendFileParams;\n createContextMenu({\n buttons: [{\n icon: 'mediaspoiler',\n text: 'EnablePhotoSpoiler',\n onClick: () => {\n this.applyMediaSpoiler(item);\n },\n verify: () => isMedia && !item.mediaSpoiler\n }, {\n icon: 'mediaspoileroff',\n text: 'DisablePhotoSpoiler',\n onClick: () => {\n toggleMediaSpoiler({\n mediaSpoiler: item.mediaSpoiler,\n reveal: true,\n destroyAfter: true\n });\n\n item.mediaSpoiler = undefined;\n },\n verify: () => !!(isMedia && item.mediaSpoiler)\n }],\n listenTo: this.mediaContainer,\n listenerSetter: this.listenerSetter,\n findElement: (e) => {\n target = findUpClassName(e.target, 'popup-item');\n isMedia = target.classList.contains('popup-item-media');\n item = this.willAttach.sendFileDetails.find((i) => i.itemDiv === target);\n return target;\n }\n });\n\n currentPopup = this;\n }\n\n private async applyMediaSpoiler(item: SendFileParams, noAnimation?: boolean) {\n const middleware = item.middlewareHelper.get();\n const {width: widthStr, height: heightStr} = item.itemDiv.style;\n\n let width: number, height: number;\n if(item.itemDiv.classList.contains('album-item')) {\n const {width: containerWidthStr, height: containerHeightStr} = item.itemDiv.parentElement.style;\n const containerWidth = parseInt(containerWidthStr);\n const containerHeight = parseInt(containerHeightStr);\n\n width = +widthStr.slice(0, -1) / 100 * containerWidth;\n height = +heightStr.slice(0, -1) / 100 * containerHeight;\n } else {\n width = parseInt(widthStr);\n height = parseInt(heightStr);\n }\n\n const {url} = await scaleMediaElement({\n media: item.itemDiv.firstElementChild as HTMLImageElement,\n boxSize: makeMediaSize(40, 40),\n mediaSize: makeMediaSize(width, height),\n toDataURL: true,\n quality: 0.2\n });\n\n const strippedBytes = getPreviewBytesFromURL(url);\n const photoSize: PhotoSize.photoStrippedSize = {\n _: 'photoStrippedSize',\n bytes: strippedBytes,\n type: 'i'\n };\n\n item.strippedBytes = strippedBytes;\n\n const photo: Photo.photo = {\n _: 'photo',\n sizes: [\n photoSize\n ],\n id: 0,\n access_hash: 0,\n date: 0,\n dc_id: 0,\n file_reference: []\n };\n\n const mediaSpoiler = await wrapMediaSpoiler({\n middleware,\n width,\n height,\n animationGroup: this.animationGroup,\n media: photo\n });\n\n if(!middleware()) {\n return;\n }\n\n if(!noAnimation) {\n mediaSpoiler.classList.add('is-revealing');\n }\n\n item.mediaSpoiler = mediaSpoiler;\n item.itemDiv.append(mediaSpoiler);\n\n await doubleRaf();\n if(!middleware()) {\n return;\n }\n\n toggleMediaSpoiler({\n mediaSpoiler,\n reveal: false\n });\n }\n\n public appendDrops(element: HTMLElement) {\n this.body.append(element);\n }\n\n get type() {\n return this.willAttach.type;\n }\n\n set type(type: PopupNewMedia['willAttach']['type']) {\n this.willAttach.type = type;\n }\n\n private appendGroupCheckboxField() {\n const good = this.files.length > 1;\n if(good && !this.groupCheckboxField) {\n this.groupCheckboxField = new CheckboxField({\n text: 'PreviewSender.GroupItems',\n name: 'group-items'\n });\n this.container.append(...[\n this.groupCheckboxField.label,\n this.mediaCheckboxField?.label,\n this.inputField.container\n ].filter(Boolean));\n\n this.willAttach.group = true;\n this.groupCheckboxField.setValueSilently(this.willAttach.group);\n\n this.listenerSetter.add(this.groupCheckboxField.input)('change', () => {\n const checked = this.groupCheckboxField.checked;\n\n this.willAttach.group = checked;\n\n this.attachFiles();\n });\n } else if(this.groupCheckboxField) {\n this.groupCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n private appendMediaCheckboxField() {\n const good = !!this.files.find((file) => MEDIA_MIME_TYPES_SUPPORTED.has(file.type));\n if(good && !this.mediaCheckboxField) {\n this.mediaCheckboxField = new CheckboxField({\n text: 'PreviewSender.CompressFile',\n name: 'compress-items'\n });\n this.container.append(...[\n this.groupCheckboxField?.label,\n this.mediaCheckboxField.label,\n this.inputField.container\n ].filter(Boolean));\n\n this.mediaCheckboxField.setValueSilently(this.willAttach.type === 'media');\n\n this.listenerSetter.add(this.mediaCheckboxField.input)('change', () => {\n const checked = this.mediaCheckboxField.checked;\n\n this.willAttach.type = checked ? 'media' : 'document';\n\n this.attachFiles();\n });\n } else if(this.mediaCheckboxField) {\n this.mediaCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n public addFiles(files: File[]) {\n const toPush = files.filter((file) => {\n const found = this.files.find((_file) => {\n return _file.lastModified === file.lastModified && _file.name === file.name && _file.size === file.size;\n });\n\n return !found;\n });\n\n if(toPush.length) {\n this.files.push(...toPush);\n this.attachFiles();\n }\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n if(target !== this.input) {\n if(target.tagName === 'INPUT' || target.isContentEditable) {\n return;\n }\n\n this.input.focus();\n placeCaretAtEnd(this.input);\n }\n };\n\n private send(force = false) {\n if(this.chat.type === 'scheduled' && !force) {\n this.chat.input.scheduleSending(() => {\n this.send(true);\n });\n\n return;\n }\n\n let caption = this.inputField.value;\n if(caption.length > this.captionLengthMax) {\n toast(I18n.format('Error.PreviewSender.CaptionTooLong', true));\n return;\n }\n\n const willAttach = this.willAttach;\n willAttach.isMedia = willAttach.type === 'media' || undefined;\n const {sendFileDetails, isMedia} = willAttach;\n\n const {peerId, input} = this.chat;\n\n const {length} = sendFileDetails;\n const sendingParams = this.chat.getMessageSendingParams();\n this.iterate((sendFileParams) => {\n if(caption && sendFileParams.length !== length) {\n this.managers.appMessagesManager.sendText(peerId, caption, {\n ...sendingParams,\n clearDraft: true\n });\n\n caption = undefined;\n }\n\n const d: SendFileDetails[] = sendFileParams.map((params) => {\n return {\n ...params,\n file: params.scaledBlob || params.file,\n spoiler: !!params.mediaSpoiler\n };\n });\n\n const w = {\n ...willAttach,\n sendFileDetails: d\n };\n\n this.managers.appMessagesManager.sendAlbum(peerId, Object.assign({\n ...sendingParams,\n caption,\n isMedia,\n clearDraft: true\n }, w));\n\n caption = undefined;\n });\n\n input.replyToMsgId = this.chat.threadId;\n input.onMessageSent();\n\n this.hide();\n }\n\n private async scaleImageForTelegram(image: HTMLImageElement, params: SendFileParams) {\n const PHOTO_SIDE_LIMIT = 2560;\n const mimeType = params.file.type;\n let url = image.src, scaledBlob: Blob;\n if(mimeType !== 'image/gif' && Math.max(image.naturalWidth, image.naturalHeight) > PHOTO_SIDE_LIMIT) {\n const {blob} = await scaleMediaElement({\n media: image,\n boxSize: makeMediaSize(PHOTO_SIDE_LIMIT, PHOTO_SIDE_LIMIT),\n mediaSize: makeMediaSize(image.naturalWidth, image.naturalHeight),\n mimeType: mimeType as any\n });\n\n scaledBlob = blob;\n URL.revokeObjectURL(url);\n url = await apiManagerProxy.invoke('createObjectURL', blob);\n await renderImageFromUrlPromise(image, url);\n }\n\n params.objectURL = url;\n params.scaledBlob = scaledBlob;\n }\n\n private async attachMedia(params: SendFileParams) {\n const {itemDiv} = params;\n itemDiv.classList.add('popup-item-media');\n\n const file = params.file;\n const isVideo = file.type.startsWith('video/');\n\n let promise: Promise;\n if(isVideo) {\n const video = createVideo();\n const source = document.createElement('source');\n source.src = params.objectURL = await apiManagerProxy.invoke('createObjectURL', file);\n video.autoplay = true;\n video.controls = false;\n video.muted = true;\n\n video.addEventListener('timeupdate', () => {\n video.pause();\n }, {once: true});\n\n promise = onMediaLoad(video).then(async() => {\n params.width = video.videoWidth;\n params.height = video.videoHeight;\n params.duration = Math.floor(video.duration);\n\n const audioDecodedByteCount = (video as any).webkitAudioDecodedByteCount;\n if(audioDecodedByteCount !== undefined) {\n params.noSound = !audioDecodedByteCount;\n }\n\n itemDiv.append(video);\n const thumb = await createPosterFromVideo(video);\n params.thumb = {\n url: await apiManagerProxy.invoke('createObjectURL', thumb.blob),\n ...thumb\n };\n });\n\n video.append(source);\n } else {\n const img = new Image();\n const url = await apiManagerProxy.invoke('createObjectURL', file);\n await renderImageFromUrlPromise(img, url);\n\n await this.scaleImageForTelegram(img, params);\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n\n itemDiv.append(img);\n\n if(file.type === 'image/gif') {\n params.noSound = true;\n\n return Promise.all([\n getGifDuration(img).then((duration) => {\n params.duration = Math.ceil(duration);\n }),\n\n createPosterFromMedia(img).then(async(thumb) => {\n params.thumb = {\n url: await apiManagerProxy.invoke('createObjectURL', thumb.blob),\n ...thumb\n };\n })\n ]);\n }\n }\n\n return promise;\n }\n\n private async attachDocument(params: SendFileParams): ReturnType {\n const {itemDiv} = params;\n itemDiv.classList.add('popup-item-document');\n const file = params.file;\n\n const isPhoto = file.type.startsWith('image/');\n const isAudio = file.type.startsWith('audio/');\n if(isPhoto || isAudio || file.size < 20e6) {\n params.objectURL ||= await apiManagerProxy.invoke('createObjectURL', file);\n }\n\n let img: HTMLImageElement;\n if(isPhoto) {\n img = new Image();\n await renderImageFromUrlPromise(img, params.objectURL);\n await this.scaleImageForTelegram(img, params);\n params.scaledBlob = undefined;\n }\n\n const doc = {\n _: 'document',\n file: file,\n file_name: file.name || '',\n size: file.size,\n type: isPhoto ? 'photo' : 'doc'\n } as MyDocument;\n\n let cacheContext: ThumbCache;\n if(params.objectURL) {\n cacheContext = {\n url: params.objectURL,\n downloaded: file.size,\n type: THUMB_TYPE_FULL\n };\n }\n\n const docDiv = await wrapDocument({\n message: {\n _: 'message',\n pFlags: {\n is_outgoing: true\n },\n mid: 0,\n peerId: 0,\n media: {\n _: 'messageMediaDocument',\n document: doc\n }\n } as any,\n cacheContext\n });\n\n if(isPhoto) {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n }\n\n itemDiv.append(docDiv);\n }\n\n private attachFile = (file: File) => {\n const willAttach = this.willAttach;\n const shouldCompress = this.shouldCompress(file.type);\n\n const itemDiv = document.createElement('div');\n itemDiv.classList.add('popup-item');\n\n const params: SendFileParams = {\n file\n } as any;\n\n // do not pass these properties to worker\n defineNotNumerableProperties(params, ['scaledBlob', 'middlewareHelper', 'itemDiv', 'mediaSpoiler']);\n\n params.middlewareHelper = this.middlewareHelper.get().create();\n params.itemDiv = itemDiv;\n\n const promise = shouldCompress ? this.attachMedia(params) : this.attachDocument(params);\n willAttach.sendFileDetails.push(params);\n return promise;\n };\n\n private shouldCompress(mimeType: string) {\n return this.willAttach.type === 'media' && MEDIA_MIME_TYPES_SUPPORTED.has(mimeType);\n }\n\n private onRender() {\n // show now\n if(!this.element.classList.contains('active')) {\n this.listenerSetter.add(document.body)('keydown', this.onKeyDown);\n this.addEventListener('close', () => {\n if(this.wasInputValue) {\n this.chat.input.messageInputField.value = this.wasInputValue;\n }\n });\n this.show();\n }\n }\n\n private setTitle() {\n const {willAttach, title, files} = this;\n let key: LangPackKey;\n const args: FormatterArguments = [];\n if(willAttach.type === 'document') {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else {\n let foundPhotos = 0, foundVideos = 0, foundFiles = 0;\n files.forEach((file) => {\n if(file.type.startsWith('image/')) ++foundPhotos;\n else if(file.type.startsWith('video/')) ++foundVideos;\n else ++foundFiles;\n });\n\n if([foundPhotos, foundVideos, foundFiles].filter((n) => n > 0).length > 1) {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else\n\n /* const sum = foundPhotos + foundVideos;\n if(sum > 1 && willAttach.group) {\n key = 'PreviewSender.SendAlbum';\n const albumsLength = Math.ceil(sum / 10);\n args.push(albumsLength);\n } else */if(foundPhotos) {\n key = 'PreviewSender.SendPhoto';\n args.push(foundPhotos);\n } else if(foundVideos) {\n key = 'PreviewSender.SendVideo';\n args.push(foundVideos);\n }\n }\n\n replaceContent(title, i18n(key, args));\n }\n\n private appendMediaToContainer(params: SendFileParams) {\n if(this.shouldCompress(params.file.type)) {\n const size = calcImageInBox(params.width, params.height, 380, 320);\n params.itemDiv.style.width = size.width + 'px';\n params.itemDiv.style.height = size.height + 'px';\n }\n\n this.mediaContainer.append(params.itemDiv);\n }\n\n private iterate(cb: (sendFileDetails: SendFileParams[]) => void) {\n const {sendFileDetails} = this.willAttach;\n if(!this.willAttach.group) {\n sendFileDetails.forEach((p) => cb([p]));\n return;\n }\n\n const length = sendFileDetails.length;\n for(let i = 0; i < length;) {\n const firstType = sendFileDetails[i].file.type;\n let k = 0;\n for(; k < 10 && i < length; ++i, ++k) {\n const type = sendFileDetails[i].file.type;\n if(this.shouldCompress(firstType) !== this.shouldCompress(type)) {\n break;\n }\n }\n\n cb(sendFileDetails.slice(i - k, i));\n }\n }\n\n private attachFiles() {\n const {files, willAttach, mediaContainer} = this;\n\n const oldSendFileDetails = willAttach.sendFileDetails.splice(0, willAttach.sendFileDetails.length);\n oldSendFileDetails.forEach((params) => {\n params.middlewareHelper.destroy();\n });\n\n this.appendGroupCheckboxField();\n this.appendMediaCheckboxField();\n\n const promises = files.map((file) => this.attachFile(file));\n\n Promise.all(promises).then(() => {\n mediaContainer.replaceChildren();\n\n if(!files.length) {\n return;\n }\n\n this.setTitle();\n\n this.iterate((sendFileDetails) => {\n const shouldCompress = this.shouldCompress(sendFileDetails[0].file.type);\n if(shouldCompress && sendFileDetails.length > 1) {\n const albumContainer = document.createElement('div');\n albumContainer.classList.add('popup-item-album', 'popup-item');\n albumContainer.append(...sendFileDetails.map((s) => s.itemDiv));\n\n prepareAlbum({\n container: albumContainer,\n items: sendFileDetails.map((o) => ({w: o.width, h: o.height})),\n maxWidth: 380,\n minWidth: 100,\n spacing: 4\n });\n\n mediaContainer.append(albumContainer);\n } else {\n sendFileDetails.forEach((params) => {\n this.appendMediaToContainer(params);\n });\n }\n\n if(!shouldCompress) {\n return;\n }\n\n sendFileDetails.forEach((params) => {\n const oldParams = oldSendFileDetails.find((o) => o.file === params.file);\n if(!oldParams) {\n return;\n }\n\n if(oldParams.mediaSpoiler) {\n this.applyMediaSpoiler(params, true);\n }\n });\n });\n }).then(() => {\n this.onRender();\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport fastSmoothScroll from '../fastSmoothScroll';\nimport cancelEvent from './cancelEvent';\nimport {attachClickEvent, detachClickEvent} from './clickEvent';\nimport findUpAsChild from './findUpAsChild';\nimport findUpClassName from './findUpClassName';\n\ntype ArrowKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight';\nconst HANDLE_EVENT = 'keydown';\nconst ACTIVE_CLASS_NAME = 'active';\n\nconst AXIS_Y_KEYS: ArrowKey[] = ['ArrowUp', 'ArrowDown'];\nconst AXIS_X_KEYS: ArrowKey[] = ['ArrowLeft', 'ArrowRight'];\n\nexport type ListNavigationOptions = {\n list: HTMLElement,\n type: 'xy' | 'x' | 'y',\n onSelect: (target: Element) => void | boolean | Promise,\n once: boolean,\n waitForKey?: string[]\n};\n\nexport default function attachListNavigation({list, type, onSelect, once, waitForKey}: ListNavigationOptions) {\n let waitForKeySet = waitForKey?.length ? new Set(waitForKey) : undefined;\n const keyNames = new Set(type === 'xy' ? AXIS_Y_KEYS.concat(AXIS_X_KEYS) : (type === 'x' ? AXIS_X_KEYS : AXIS_Y_KEYS));\n\n let target: Element;\n const getCurrentTarget = () => {\n return target || list.querySelector('.' + ACTIVE_CLASS_NAME) || list.firstElementChild;\n };\n\n const setCurrentTarget = (_target: Element, scrollTo: boolean) => {\n if(target === _target) {\n return;\n }\n\n let hadTarget = false;\n if(target) {\n hadTarget = true;\n target.classList.remove(ACTIVE_CLASS_NAME);\n }\n\n target = _target;\n if(!target) return;\n target.classList.add(ACTIVE_CLASS_NAME);\n\n if(hadTarget && scrollable && scrollTo) {\n fastSmoothScroll({\n container: scrollable,\n element: target as HTMLElement,\n position: 'center',\n forceDuration: 100,\n axis: type === 'x' ? 'x' : 'y'\n });\n }\n };\n\n const getNextTargetX = (currentTarget: Element, isNext: boolean) => {\n let nextTarget: Element;\n if(isNext) nextTarget = currentTarget.nextElementSibling || list.firstElementChild;\n else nextTarget = currentTarget.previousElementSibling || list.lastElementChild;\n\n return nextTarget;\n };\n\n const getNextTargetY = (currentTarget: Element, isNext: boolean) => {\n const property = isNext ? 'nextElementSibling' : 'previousElementSibling';\n const endProperty = isNext ? 'firstElementChild' : 'lastElementChild';\n const currentRect = currentTarget.getBoundingClientRect();\n\n let nextTarget = currentTarget[property] || list[endProperty];\n while(nextTarget !== currentTarget) {\n const targetRect = nextTarget.getBoundingClientRect();\n if(targetRect.x === currentRect.x && targetRect.y !== currentRect.y) {\n break;\n }\n\n nextTarget = nextTarget[property] || list[endProperty];\n }\n\n return nextTarget;\n };\n\n let handleArrowKey: (currentTarget: Element, key: ArrowKey) => Element;\n if(type === 'xy') { // flex-direction: row; flex-wrap: wrap;\n handleArrowKey = (currentTarget, key) => {\n if(key === 'ArrowUp' || key === 'ArrowDown') return getNextTargetY(currentTarget, key === 'ArrowDown');\n else return getNextTargetX(currentTarget, key === 'ArrowRight');\n };\n } else { // flex-direction: row | column;\n handleArrowKey = (currentTarget, key) => getNextTargetX(currentTarget, key === 'ArrowRight' || key === 'ArrowDown');\n }\n\n let onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n if(!keyNames.has(key as any)) {\n if(key === 'Enter' || (type !== 'xy' && key === 'Tab')) {\n cancelEvent(e);\n fireSelect(getCurrentTarget());\n }\n\n return;\n }\n\n cancelEvent(e);\n\n if(list.childElementCount > 1) {\n let currentTarget = getCurrentTarget();\n currentTarget = handleArrowKey(currentTarget, key as any);\n setCurrentTarget(currentTarget, true);\n }\n };\n\n const scrollable = findUpClassName(list, 'scrollable');\n list.classList.add('navigable-list');\n\n const onMouseMove = (e: MouseEvent) => {\n const target = findUpAsChild(e.target as HTMLElement, list) as HTMLElement;\n if(!target) {\n return;\n }\n\n setCurrentTarget(target, false);\n };\n\n const onClick = (e: Event) => {\n cancelEvent(e); // cancel keyboard closening\n\n const target = findUpAsChild(e.target as HTMLElement, list) as HTMLElement;\n if(!target) {\n return;\n }\n\n setCurrentTarget(target, false);\n fireSelect(getCurrentTarget());\n };\n\n const fireSelect = async(target: Element) => {\n const canContinue = await onSelect(target);\n if(canContinue !== undefined ? !canContinue : once) {\n detach();\n }\n };\n\n let attached = false;\n const attach = () => {\n if(attached) return;\n attached = true;\n // const input = document.activeElement as HTMLElement;\n // input.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\n list.addEventListener('mousemove', onMouseMove, {passive: true});\n attachClickEvent(list, onClick);\n };\n\n const detach = () => {\n if(!attached) return;\n attached = false;\n // input.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\n list.removeEventListener('mousemove', onMouseMove);\n detachClickEvent(list, onClick);\n };\n\n const resetTarget = () => {\n if(waitForKeySet) return;\n setCurrentTarget(list.firstElementChild, false);\n };\n\n if(waitForKeySet) {\n const _onKeyDown = onKeyDown;\n onKeyDown = (e) => {\n if(waitForKeySet.has(e.key)) {\n cancelEvent(e);\n\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\n onKeyDown = _onKeyDown;\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\n\n waitForKeySet = undefined;\n resetTarget();\n }\n };\n } else {\n resetTarget();\n }\n\n attach();\n\n return {\n attach,\n detach,\n resetTarget\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport attachListNavigation, {ListNavigationOptions} from '../../helpers/dom/attachListNavigation';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport rootScope from '../../lib/rootScope';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport SetTransition from '../singleTransition';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport safeAssign from '../../helpers/object/safeAssign';\n\nexport default class AutocompleteHelper extends EventListenerBase<{\n hidden: () => void,\n visible: () => void,\n hiding: () => void\n}> {\n protected hidden = true;\n protected container: HTMLElement;\n protected list: HTMLElement;\n protected resetTarget: () => void;\n protected attach: () => void;\n protected detach: () => void;\n protected init?(): void;\n\n protected controller: AutocompleteHelperController;\n protected listType: 'xy' | 'x' | 'y';\n protected onSelect: ListNavigationOptions['onSelect'];\n protected waitForKey?: string[];\n\n protected navigationItem: NavigationItem;\n\n constructor(options: {\n appendTo: HTMLElement,\n controller?: AutocompleteHelper['controller'],\n listType: AutocompleteHelper['listType'],\n onSelect: AutocompleteHelper['onSelect'],\n waitForKey?: AutocompleteHelper['waitForKey']\n }) {\n super(false);\n\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('autocomplete-helper', 'z-depth-1');\n\n options.appendTo.append(this.container);\n\n this.attachNavigation();\n\n this.controller && this.controller.addHelper(this);\n }\n\n public toggleListNavigation(enabled: boolean) {\n if(enabled) {\n this.attach && this.attach();\n } else {\n this.detach && this.detach();\n }\n }\n\n protected onVisible = () => {\n if(this.detach) { // it can be so because 'visible' calls before animation's end\n this.detach();\n }\n\n const list = this.list;\n const {attach, detach, resetTarget} = attachListNavigation({\n list,\n type: this.listType,\n onSelect: this.onSelect,\n once: true,\n waitForKey: this.waitForKey\n });\n\n this.attach = attach;\n this.detach = detach;\n this.resetTarget = resetTarget;\n if(!IS_MOBILE && !this.navigationItem) {\n this.navigationItem = {\n type: 'autocomplete-helper',\n onPop: () => {\n this.navigationItem = undefined;\n this.toggle(true);\n },\n noBlurOnPop: true\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n\n this.addEventListener('hidden', () => {\n this.resetTarget = undefined;\n this.attach = undefined;\n this.detach = undefined;\n\n list.innerHTML = '';\n detach();\n\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n }\n }, {once: true});\n };\n\n protected attachNavigation() {\n this.addEventListener('visible', this.onVisible);\n }\n\n public toggle(hide?: boolean, fromController = false, skipAnimation?: boolean) {\n if(this.init) {\n return;\n }\n\n if(hide === undefined) {\n hide = this.container.classList.contains('is-visible') && !this.container.classList.contains('backwards');\n }\n\n if(this.hidden === hide) {\n if(!hide) {\n this.dispatchEvent('visible'); // reset target and listener\n }\n\n return;\n }\n\n this.hidden = hide;\n\n if(!hide) {\n this.controller && this.controller.hideOtherHelpers(this);\n this.dispatchEvent('visible'); // fire it before so target will be set\n } else {\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n }\n\n if(!fromController && this.controller) {\n this.controller.hideOtherHelpers();\n }\n\n if(this.detach) { // force detach here\n this.detach();\n }\n }\n\n const useRafs = this.controller || hide ? 0 : 2;\n\n if(hide) {\n this.dispatchEvent('hiding');\n }\n\n SetTransition({\n element: this.container,\n className: 'is-visible',\n forwards: !hide,\n duration: rootScope.settings.animationsEnabled && !skipAnimation ? 300 : 0,\n onTransitionEnd: () => {\n this.hidden && this.dispatchEvent('hidden');\n },\n useRafs\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from './chat';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport preloadAnimatedEmojiSticker from '../../helpers/preloadAnimatedEmojiSticker';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport rootScope from '../../lib/rootScope';\nimport {EmoticonsDropdown} from '../emoticonsDropdown';\nimport {SuperStickerRenderer} from '../emoticonsDropdown/tabs/stickers';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport Scrollable from '../scrollable';\nimport attachStickerViewerListeners from '../stickerViewer';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\n\nexport default class StickersHelper extends AutocompleteHelper {\n private scrollable: Scrollable;\n private superStickerRenderer: SuperStickerRenderer;\n private lazyLoadQueue: LazyLoadQueue;\n private onChangeScreen: () => void;\n private listenerSetter: ListenerSetter;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n private chat: Chat,\n private managers: AppManagers\n ) {\n super({\n appendTo,\n controller,\n listType: 'xy',\n onSelect: async(target) => {\n return !(await EmoticonsDropdown.onMediaClick({target}, true));\n },\n waitForKey: ['ArrowUp', 'ArrowDown']\n });\n\n this.container.classList.add('stickers-helper');\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollTop = 0;\n }, 0);\n\n rootScope.dispatchEvent('choosing_sticker', true);\n });\n\n this.addEventListener('hidden', () => {\n if(this.onChangeScreen) {\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\n this.onChangeScreen = undefined;\n\n this.listenerSetter.removeAll();\n this.listenerSetter = undefined;\n }\n\n rootScope.dispatchEvent('choosing_sticker', false);\n });\n }\n\n public checkEmoticon(emoticon: string) {\n const middleware = this.controller.getMiddleware();\n\n if(this.lazyLoadQueue) {\n this.lazyLoadQueue.clear();\n }\n\n preloadAnimatedEmojiSticker(emoticon);\n this.managers.appStickersManager.getStickersByEmoticon(emoticon)\n .then((stickers) => {\n if(!middleware()) {\n return;\n }\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n const container = this.list.cloneNode() as HTMLElement;\n\n let ready: Promise;\n\n this.lazyLoadQueue.clear();\n if(stickers.length) {\n ready = new Promise((resolve) => {\n const promises: Promise[] = [];\n stickers.forEach((sticker) => {\n container.append(this.superStickerRenderer.renderSticker(sticker as MyDocument, undefined, promises));\n });\n\n (Promise.all(promises) as Promise).finally(resolve);\n });\n } else {\n ready = Promise.resolve();\n }\n\n ready.then(() => {\n this.list.replaceWith(container);\n this.list = container;\n\n if(!this.onChangeScreen) {\n this.onChangeScreen = () => {\n const width = (this.list.childElementCount * mediaSizes.active.popupSticker.width) + (this.list.childElementCount - 1 * 1);\n this.list.style.width = width + 'px';\n };\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\n\n this.listenerSetter = new ListenerSetter();\n attachStickerViewerListeners({listenTo: this.container, listenerSetter: this.listenerSetter});\n }\n\n this.onChangeScreen();\n\n this.toggle(!stickers.length);\n this.scrollable.scrollTop = 0;\n });\n });\n }\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add('stickers-helper-stickers', 'super-stickers');\n\n this.container.append(this.list);\n\n this.scrollable = new Scrollable(this.container);\n this.lazyLoadQueue = new LazyLoadQueue();\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, this.chat.animationGroup, this.managers);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {SEND_WHEN_ONLINE_TIMESTAMP} from '../../lib/mtproto/constants';\nimport Button from '../button';\nimport PopupDatePicker from './datePicker';\n\nconst getMinDate = () => {\n const date = new Date();\n // date.setDate(date.getDate() - 1);\n date.setHours(0, 0, 0, 0);\n return date;\n};\n\nconst getMaxDate = () => {\n const date = new Date();\n date.setFullYear(date.getFullYear() + 1);\n date.setDate(date.getDate() - 1);\n return date;\n};\n\nconst checkDate = (date: Date) => {\n return date.getTime() > getMaxDate().getTime() ? new Date() : date;\n};\n\nexport default class PopupSchedule extends PopupDatePicker {\n constructor(initDate: Date, onPick: (timestamp: number) => void, canSendWhenOnline: boolean) {\n super(checkDate(initDate), onPick, {\n noButtons: true,\n noTitle: true,\n closable: true,\n withConfirm: true,\n minDate: getMinDate(),\n maxDate: getMaxDate(),\n withTime: true,\n showOverflowMonths: true,\n confirmShortcutIsSendShortcut: true,\n title: true\n });\n\n this.element.classList.add('popup-schedule');\n this.header.append(this.controlsDiv);\n this.title.replaceWith(this.monthTitle);\n this.body.append(this.btnConfirm);\n\n if(canSendWhenOnline) {\n const btnSendWhenOnline = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Schedule.SendWhenOnline'});\n this.body.append(btnSendWhenOnline);\n\n attachClickEvent(btnSendWhenOnline, () => {\n onPick(SEND_WHEN_ONLINE_TIMESTAMP);\n this.hide();\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport {appendEmoji, getEmojiFromElement} from '../emoticonsDropdown/tabs/emoji';\nimport {ScrollableX} from '../scrollable';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport default class EmojiHelper extends AutocompleteHelper {\n private scrollable: ScrollableX;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super({\n appendTo,\n controller,\n listType: 'x',\n onSelect: (target) => {\n chatInput.onEmojiSelected(getEmojiFromElement(target as any), true);\n }\n });\n\n this.container.classList.add('emoji-helper');\n }\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add('emoji-helper-emojis', 'super-emojis');\n\n this.container.append(this.list);\n\n this.scrollable = new ScrollableX(this.container);\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollLeft = 0;\n }, 0);\n });\n }\n\n public render(emojis: string[], waitForKey: boolean) {\n if(this.init) {\n if(!emojis.length) {\n return;\n }\n\n this.init();\n this.init = null;\n }\n\n emojis = emojis.slice(0, 80);\n\n if(emojis.length) {\n this.list.innerHTML = '';\n emojis.forEach((emoji) => {\n appendEmoji(emoji, this.list, false, true);\n });\n }\n\n this.waitForKey = waitForKey ? ['ArrowUp', 'ArrowDown'] : undefined;\n this.toggle(!emojis.length);\n\n /* window.requestAnimationFrame(() => {\n this.container.style.width = (3 * 2) + (emojis.length * 44) + 'px';\n }); */\n }\n\n public checkQuery(query: string, firstChar: string) {\n const middleware = this.controller.getMiddleware();\n this.managers.appEmojiManager.getBothEmojiKeywords().then(async() => {\n if(!middleware()) {\n return;\n }\n\n const q = query.replace(/^:/, '');\n const emojis = await this.managers.appEmojiManager.searchEmojis(q);\n if(!middleware()) {\n return;\n }\n\n this.render(emojis, firstChar !== ':');\n // console.log(emojis);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport AvatarElement from '../avatar';\nimport PeerTitle from '../peerTitle';\nimport Scrollable from '../scrollable';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\n\nexport default class AutocompletePeerHelper extends AutocompleteHelper {\n protected static BASE_CLASS = 'autocomplete-peer-helper';\n protected static BASE_CLASS_LIST_ELEMENT = AutocompletePeerHelper.BASE_CLASS + '-list-element';\n private scrollable: Scrollable;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n protected className: string,\n onSelect: (target: Element) => boolean | void\n ) {\n super({\n appendTo,\n controller,\n listType: 'y',\n onSelect\n });\n\n this.container.classList.add(AutocompletePeerHelper.BASE_CLASS, className);\n }\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add(AutocompletePeerHelper.BASE_CLASS + '-list', this.className + '-list');\n\n this.container.append(this.list);\n\n this.scrollable = new Scrollable(this.container);\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollTop = 0;\n }, 0);\n });\n }\n\n public render(data: {peerId: PeerId, name?: string, description?: string}[], doNotShow?: boolean) {\n if(this.init) {\n if(!data.length) {\n return;\n }\n\n this.init();\n this.init = null;\n }\n\n if(data.length) {\n this.list.innerHTML = '';\n data.forEach((d) => {\n const div = AutocompletePeerHelper.listElement({\n className: this.className,\n peerId: d.peerId,\n name: d.name,\n description: d.description\n });\n\n this.list.append(div);\n });\n }\n\n if(!doNotShow) {\n this.toggle(!data.length);\n }\n }\n\n public static listElement(options: {\n className: string,\n peerId: PeerId,\n name?: string,\n description?: string\n }) {\n const BASE = AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT;\n options.className += '-list-element';\n\n const div = document.createElement('div');\n div.classList.add(BASE, options.className);\n div.dataset.peerId = '' + options.peerId;\n\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-30', BASE + '-avatar', options.className + '-avatar');\n avatar.updateWithOptions({\n isDialog: false,\n peerId: options.peerId\n });\n\n const name = document.createElement('div');\n name.classList.add(BASE + '-name', options.className + '-name');\n if(!options.name) {\n name.append(new PeerTitle({\n peerId: options.peerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element);\n } else {\n setInnerHTML(name, wrapEmojiText(options.name));\n }\n\n div.append(avatar, name);\n\n if(options.description) {\n const description = document.createElement('div');\n description.classList.add(BASE + '-description', options.className + '-description');\n setInnerHTML(description, wrapEmojiText(options.description));\n div.append(description);\n }\n\n return div;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport type {BotInfo, ChatFull, UserFull} from '../../layer';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport SearchIndex from '../../lib/searchIndex';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport function processPeerFullForCommands(peerId: PeerId, full: ChatFull.chatFull | ChatFull.channelFull | UserFull.userFull, query?: string) {\n const botInfos: BotInfo.botInfo[] = [].concat(full.bot_info);\n let index: SearchIndex;\n\n if(query !== undefined) {\n index = new SearchIndex({\n ignoreCase: true\n });\n }\n\n type T = {peerId: PeerId, name: string, description: string, index: number, command: string};\n const commands: Map = new Map();\n botInfos.forEach((botInfo) => {\n if(!botInfo.commands) {\n return;\n }\n\n botInfo.commands.forEach(({command, description}, idx) => {\n const c = '/' + command;\n commands.set(command, {\n peerId: botInfo.user_id ? botInfo.user_id.toPeerId(false) : peerId,\n command: command,\n name: c,\n description: description,\n index: idx\n });\n\n if(index) {\n index.indexObject(command, c);\n }\n });\n });\n\n let out: T[];\n if(!index) {\n out = [...commands.values()];\n } else {\n const found = index.search(query);\n out = Array.from(found).map((command) => commands.get(command));\n }\n\n out = out.sort((a, b) => commands.get(a.command).index - commands.get(b.command).index);\n\n return out;\n}\n\nexport default class CommandsHelper extends AutocompletePeerHelper {\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(appendTo,\n controller,\n 'commands-helper',\n (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n });\n }\n );\n }\n\n public async checkQuery(query: string, peerId: PeerId) {\n if(!(await this.managers.appUsersManager.isBot(peerId))) {\n return false;\n }\n\n const middleware = this.controller.getMiddleware();\n this.managers.appProfileManager.getProfileByPeerId(peerId).then((full) => {\n if(!middleware()) {\n return;\n }\n\n const filtered = processPeerFullForCommands(peerId, full, query);\n this.render(filtered);\n // console.log('found commands', found, filtered);\n });\n\n return true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getMiddleware} from '../../helpers/middleware';\nimport AutocompleteHelper from './autocompleteHelper';\n\nexport default class AutocompleteHelperController {\n private helpers: Set = new Set();\n private middleware = getMiddleware();\n /* private tempId = 0;\n\n public incrementToggleCount() {\n return ++this.tempId;\n }\n\n public getToggleCount() {\n return this.tempId;\n } */\n\n public toggleListNavigation(enabled: boolean) {\n for(const helper of this.helpers) {\n helper.toggleListNavigation(enabled);\n }\n }\n\n public getMiddleware() {\n this.middleware.clean();\n return this.middleware.get();\n }\n\n public addHelper(helper: AutocompleteHelper) {\n this.helpers.add(helper);\n }\n\n public hideOtherHelpers(preserveHelper?: AutocompleteHelper) {\n this.helpers.forEach((helper) => {\n if(helper !== preserveHelper) {\n helper.toggle(true, true);\n }\n });\n\n if(!preserveHelper) {\n this.middleware.clean();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport type {MessageEntity} from '../../layer';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerActiveUsernames from '../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport rootScope from '../../lib/rootScope';\n\nexport default class MentionsHelper extends AutocompletePeerHelper {\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(\n appendTo,\n controller,\n 'mentions-helper',\n (target) => {\n const userId = (target as HTMLElement).dataset.peerId.toUserId();\n const user = Promise.resolve(managers.appUsersManager.getUser(userId)).then((user) => {\n let str = '', entity: MessageEntity;\n const usernames = getPeerActiveUsernames(user);\n if(usernames[0]) {\n str = '@' + usernames[0];\n } else {\n str = user.first_name || user.last_name;\n entity = {\n _: 'messageEntityMentionName',\n length: str.length,\n offset: 0,\n user_id: user.id\n };\n }\n\n str += ' ';\n chatInput.insertAtCaret(str, entity);\n });\n }\n );\n }\n\n public checkQuery(query: string, peerId: PeerId, topMsgId: number) {\n const trimmed = query.trim(); // check that there is no whitespace\n if(query.length !== trimmed.length) return false;\n\n const middleware = this.controller.getMiddleware();\n this.managers.appProfileManager.getMentions(peerId && peerId.toChatId(), trimmed, topMsgId).then(async(peerIds) => {\n if(!middleware()) return;\n\n peerIds = peerIds.filter((peerId) => peerId !== rootScope.myId);\n\n // const username = trimmed.slice(1).toLowerCase();\n\n const p = peerIds.map(async(peerId) => {\n const user = await this.managers.appUsersManager.getUser(peerId);\n const usernames = getPeerActiveUsernames(user);\n // if(usernames.length && usernames.some((_username) => _username.toLowerCase() === username)) { // hide full matched suggestion\n // return;\n // }\n\n return {\n peerId,\n description: usernames[0] ? '@' + usernames[0] : undefined\n };\n });\n\n this.render((await Promise.all(p)).filter(Boolean));\n });\n\n return true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport DropdownHover from '../../helpers/dropdownHover';\nimport {KeyboardButton, ReplyMarkup} from '../../layer';\nimport rootScope from '../../lib/rootScope';\nimport ListenerSetter, {Listener} from '../../helpers/listenerSetter';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {getHeavyAnimationPromise} from '../../hooks/useHeavyAnimationCheck';\nimport confirmationPopup from '../confirmationPopup';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport Scrollable from '../scrollable';\n\nexport default class ReplyKeyboard extends DropdownHover {\n private static BASE_CLASS = 'reply-keyboard';\n private appendTo: HTMLElement;\n private listenerSetter: ListenerSetter;\n private managers: AppManagers;\n private btnHover: HTMLElement;\n private peerId: PeerId;\n private touchListener: Listener;\n private chatInput: ChatInput;\n private scrollable: Scrollable;\n\n constructor(options: {\n listenerSetter: ListenerSetter,\n managers: AppManagers,\n appendTo: HTMLElement,\n btnHover: HTMLElement,\n chatInput: ChatInput\n }) {\n super({\n element: document.createElement('div')\n });\n\n safeAssign(this, options);\n\n this.element.classList.add(ReplyKeyboard.BASE_CLASS);\n this.element.style.display = 'none';\n\n this.scrollable = new Scrollable();\n this.element.append(this.scrollable.container);\n\n this.attachButtonListener(this.btnHover, this.listenerSetter);\n this.listenerSetter.add(rootScope)('history_reply_markup', async({peerId}) => {\n if(this.peerId === peerId) {\n if(this.checkAvailability() && this.isActive()) {\n await this.render();\n }\n\n getHeavyAnimationPromise().then(() => {\n this.checkForceReply();\n });\n }\n });\n }\n\n public init() {\n this.appendTo.append(this.element);\n\n this.listenerSetter.add(this)('open', async() => {\n await this.render();\n\n if(IS_TOUCH_SUPPORTED) {\n this.touchListener = this.listenerSetter.add(document.body)('touchstart', this.onBodyTouchStart, {passive: false, capture: true}) as any as Listener;\n this.listenerSetter.add(this)('close', () => {\n this.listenerSetter.remove(this.touchListener);\n }, {once: true});\n }\n });\n\n attachClickEvent(this.element, (e) => {\n const target = findUpClassName(e.target, 'btn');\n if(!target) {\n return;\n }\n\n const type = target.dataset.type as KeyboardButton['_'];\n const {peerId} = this;\n switch(type) {\n case 'keyboardButtonRequestPhone': {\n confirmationPopup({\n titleLangKey: 'ShareYouPhoneNumberTitle',\n button: {\n langKey: 'OK'\n },\n descriptionLangKey: 'AreYouSureShareMyContactInfoBot'\n }).then(() => {\n this.managers.appMessagesManager.sendContact(peerId, rootScope.myId);\n });\n break;\n }\n\n default: {\n this.managers.appMessagesManager.sendText(peerId, target.dataset.text);\n break;\n }\n }\n\n this.toggle(false);\n }, {listenerSetter: this.listenerSetter});\n\n return super.init();\n }\n\n private onBodyTouchStart = (e: TouchEvent) => {\n const target = e.touches[0].target as HTMLElement;\n if(!findUpAsChild(target, this.element) && target !== this.btnHover) {\n cancelEvent(e);\n this.toggle(false);\n }\n };\n\n public async checkForceReply() {\n const replyMarkup = await this.getReplyMarkup();\n if(replyMarkup._ === 'replyKeyboardForceReply' &&\n !replyMarkup.pFlags.hidden &&\n !replyMarkup.pFlags.used) {\n replyMarkup.pFlags.used = true;\n this.chatInput.initMessageReply(replyMarkup.mid);\n }\n }\n\n private async getReplyMarkup() {\n return (await this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId)).replyMarkup ?? {\n _: 'replyKeyboardHide'\n };\n }\n\n public async render(replyMarkup?: ReplyMarkup.replyKeyboardMarkup) {\n if(replyMarkup === undefined) {\n replyMarkup = await this.getReplyMarkup() as any;\n }\n\n this.scrollable.container.replaceChildren();\n\n for(const row of replyMarkup.rows) {\n const div = document.createElement('div');\n div.classList.add(ReplyKeyboard.BASE_CLASS + '-row');\n\n for(const button of row.buttons) {\n const btn = document.createElement('button');\n btn.classList.add(ReplyKeyboard.BASE_CLASS + '-button', 'btn');\n setInnerHTML(btn, wrapEmojiText(button.text));\n btn.dataset.text = button.text;\n btn.dataset.type = button._;\n div.append(btn);\n }\n\n this.scrollable.container.append(div);\n }\n }\n\n public async checkAvailability(replyMarkup?: ReplyMarkup) {\n if(replyMarkup === undefined) {\n replyMarkup = await this.getReplyMarkup();\n }\n\n const hide = replyMarkup._ === 'replyKeyboardHide' || !(replyMarkup as ReplyMarkup.replyInlineMarkup).rows?.length;\n this.btnHover.classList.toggle('hide', hide);\n\n if(hide) {\n this.toggle(false);\n }\n\n return !hide;\n }\n\n public setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n this.checkAvailability();\n this.checkForceReply();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from './chat';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {WebDocument} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport Scrollable from '../scrollable';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport Button from '../button';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {MyPhoto} from '../../lib/appManagers/appPhotosManager';\nimport assumeType from '../../helpers/assumeType';\nimport GifsMasonry from '../gifsMasonry';\nimport {SuperStickerRenderer} from '../emoticonsDropdown/tabs/stickers';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport readBlobAsDataURL from '../../helpers/blob/readBlobAsDataURL';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport renderMediaWithFadeIn from '../../helpers/dom/renderMediaWithFadeIn';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport generateQId from '../../lib/appManagers/utils/inlineBots/generateQId';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport wrapPhoto from '../wrappers/photo';\n\nconst ANIMATION_GROUP: AnimationItemGroup = 'INLINE-HELPER';\n// const GRID_ITEMS = 5;\n\nexport default class InlineHelper extends AutocompleteHelper {\n private scrollable: Scrollable;\n private lazyLoadQueue: LazyLoadQueue;\n private gifsMasonry: GifsMasonry;\n private superStickerRenderer: SuperStickerRenderer;\n private onChangeScreen: () => void;\n public checkQuery: (peerId: PeerId, username: string, query: string) => ReturnType;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n private chat: Chat,\n private managers: AppManagers\n ) {\n super({\n appendTo,\n controller,\n listType: 'xy',\n waitForKey: ['ArrowUp', 'ArrowDown'],\n onSelect: (target) => {\n if(!target) return false; // can happen when there is only button\n const {peerId, botId, queryId} = this.list.dataset;\n return this.chat.input.getReadyToSend(() => {\n const queryAndResultIds = generateQId(queryId, (target as HTMLElement).dataset.resultId);\n this.managers.appInlineBotsManager.sendInlineResult(peerId.toPeerId(), botId, queryAndResultIds, {\n ...this.chat.getMessageSendingParams(),\n clearDraft: true\n });\n\n this.chat.input.onMessageSent(true, true);\n });\n }\n });\n\n this.container.classList.add('inline-helper');\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollTop = 0;\n }, 0);\n });\n\n this.checkQuery = debounce(this._checkQuery, 200, true, true);\n\n this.addEventListener('hidden', () => {\n if(this.onChangeScreen) {\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\n this.onChangeScreen = undefined;\n }\n });\n }\n\n public _checkQuery = async(peerId: PeerId, username: string, query: string) => {\n const middleware = this.controller.getMiddleware();\n\n const peer = await this.managers.appUsersManager.resolveUsername(username);\n if(!middleware()) {\n throw 'PEER_CHANGED';\n }\n\n if(peer._ !== 'user' || !peer.pFlags.bot) {\n throw 'NOT_A_BOT';\n }\n\n const renderPromise = this.managers.appInlineBotsManager.getInlineResults(peerId, peer.id, query).then((botResults) => {\n if(!middleware()) {\n throw 'PEER_CHANGED';\n }\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n const list = this.list.cloneNode() as HTMLElement;\n list.dataset.peerId = '' + peerId;\n list.dataset.botId = '' + peer.id;\n list.dataset.queryId = '' + botResults.query_id;\n\n const gifsMasonry = new GifsMasonry(null, ANIMATION_GROUP, this.scrollable, false);\n\n this.lazyLoadQueue.clear();\n this.superStickerRenderer.clear();\n\n const loadPromises: Promise[] = [];\n const isGallery = !!botResults.pFlags.gallery;\n // botResults.results.length = 3;\n for(const item of botResults.results) {\n const container = document.createElement('div');\n container.classList.add('inline-helper-result');\n container.dataset.resultId = item.id;\n\n const preview = isGallery ? undefined : document.createElement('div');\n if(preview) {\n preview.classList.add('inline-helper-result-preview');\n\n container.append(preview);\n }\n\n list.append(container);\n\n if(!isGallery) {\n preview.classList.add('empty');\n setInnerHTML(preview, wrapEmojiText([...item.title.trim()][0]));\n\n const title = document.createElement('div');\n title.classList.add('inline-helper-result-title');\n setInnerHTML(title, wrapEmojiText(item.title));\n\n const description = document.createElement('div');\n description.classList.add('inline-helper-result-description');\n setInnerHTML(description, wrapRichText(item.description, {\n noCommands: true,\n noLinks: true\n }));\n\n container.append(title, description);\n\n const separator = document.createElement('div');\n separator.classList.add('inline-helper-separator');\n\n list.append(separator);\n } else {\n container.classList.add('grid-item');\n }\n\n if(item._ === 'botInlineResult') {\n if(item.thumb && item.thumb.mime_type.indexOf('image/') === 0) {\n let mediaContainer: HTMLElement;\n if(preview) {\n mediaContainer = document.createElement('div');\n preview.append(mediaContainer);\n } else {\n mediaContainer = container;\n }\n\n mediaContainer.classList.add('media-container');\n isGallery && mediaContainer.classList.add('no-border-radius');\n\n this.lazyLoadQueue.push({\n div: container,\n load: () => {\n return appDownloadManager.download({\n dcId: 4,\n location: {\n _: 'inputWebFileLocation',\n access_hash: (item.thumb as WebDocument.webDocument).access_hash,\n url: item.thumb.url\n },\n size: item.thumb.size,\n mimeType: item.thumb.mime_type\n }).then((blob) => {\n const image = new Image();\n image.classList.add('media-photo');\n readBlobAsDataURL(blob).then((dataURL) => {\n renderMediaWithFadeIn(mediaContainer, image, dataURL, true);\n });\n });\n }\n });\n }\n } else {\n const media = item.document as MyDocument || item.photo as MyPhoto;\n if((['sticker', 'gif'] as MyDocument['type'][]).includes((media as MyDocument)?.type) && isGallery) {\n assumeType(media);\n\n if(media.type === 'gif') {\n gifsMasonry.add(media, container);\n } else if(media.type === 'sticker') {\n container.classList.add('super-sticker');\n this.superStickerRenderer.renderSticker(media, container, loadPromises);\n if(media.animated) {\n this.superStickerRenderer.observeAnimated(container);\n }\n }\n } else if(media) {\n const size = isGallery ? 48 : undefined;\n isGallery && container.classList.add('no-border-radius');\n wrapPhoto({\n photo: media,\n container: isGallery ? container : preview,\n boxWidth: size,\n boxHeight: size,\n middleware,\n lazyLoadQueue: this.lazyLoadQueue,\n loadPromises\n });\n }\n }\n }\n\n return Promise.all(loadPromises).then(() => {\n if(!middleware()) {\n gifsMasonry.clear();\n return;\n }\n\n list.classList.toggle('is-gallery', isGallery);\n list.classList.toggle('super-stickers', isGallery);\n this.container.classList.toggle('is-gallery', isGallery);\n\n /* if(isGallery) {\n list.style.gridTemplateColumns = `repeat(${Math.min(botResults.results.length, 4)}, 1fr)`;\n }\n\n this.container.style.setProperty('width', isGallery ? `${Math.min(botResults.results.length, 4) * 25}%` : '', 'important'); */\n\n const parent = this.list.parentElement;\n parent.textContent = '';\n if(botResults.switch_pm) {\n const btnSwitchToPM = Button('btn-primary btn-secondary btn-primary-transparent primary');\n setInnerHTML(btnSwitchToPM, wrapEmojiText(botResults.switch_pm.text));\n attachClickEvent(btnSwitchToPM, (e) => {\n this.chat.appImManager.setInnerPeer({peerId});\n this.managers.appInlineBotsManager.switchToPM(peerId, peer.id, botResults.switch_pm.start_param);\n });\n parent.append(btnSwitchToPM);\n }\n parent.append(this.list = list);\n\n if(this.gifsMasonry) {\n this.gifsMasonry.detach();\n }\n this.gifsMasonry = gifsMasonry;\n gifsMasonry.attach();\n\n if(!this.onChangeScreen) {\n this.onChangeScreen = () => {\n if(this.list.classList.contains('is-gallery')) {\n const width = (this.list.childElementCount * mediaSizes.active.popupSticker.width) + (this.list.childElementCount - 1 * 1);\n this.list.style.width = width + 'px';\n } else {\n this.list.style.width = '';\n }\n };\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\n }\n\n this.onChangeScreen();\n\n this.toggle(!botResults.results.length && !botResults.switch_pm);\n this.scrollable.scrollTop = 0;\n });\n });\n\n return {user: peer, renderPromise};\n };\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add('inline-helper-results');\n\n this.container.append(this.list);\n\n this.scrollable = new Scrollable(this.container);\n this.lazyLoadQueue = new LazyLoadQueue();\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, ANIMATION_GROUP, this.managers);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport callbackify from '../../helpers/callbackify';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport {processPeerFullForCommands} from './commandsHelper';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nconst CLASS_NAME = 'bot-commands';\nexport default class ChatBotCommands extends AutocompletePeerHelper {\n private userId: UserId;\n\n constructor(\n appendTo: HTMLElement,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(appendTo, undefined, CLASS_NAME, (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n this.toggle(true);\n });\n });\n }\n\n public setUserId(userId: UserId, middleware: () => boolean) {\n if(this.userId === userId && this.list?.childElementCount) {\n this.toggle(false);\n return;\n }\n\n this.userId = userId;\n return callbackify(this.managers.appProfileManager.getProfile(userId), (full) => {\n if(!middleware()) return;\n const filtered = processPeerFullForCommands(userId.toPeerId(false), full);\n\n const PADDING_TOP = 8;\n // const PADDING_BOTTOM = 8;\n const PADDING_BOTTOM = 24;\n const height = filtered.length * 50 + PADDING_TOP + PADDING_BOTTOM;\n this.container.style.setProperty('--height', height + 'px');\n\n this.render(filtered);\n\n // this.container.style.top =\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AckedResult} from '../lib/mtproto/superMessagePort';\nimport {Modify} from '../types';\n\nexport default async function modifyAckedResult(acked: AckedResult): Promise, {result: T | Promise}>> {\n return {\n cached: acked.cached,\n result: acked.cached ? await acked.result : acked.result\n };\n}\n\nexport function modifyAckedPromise(promise: Promise>) {\n return promise.then(modifyAckedResult);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport callbackify from '../../helpers/callbackify';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {getMiddleware} from '../../helpers/middleware';\nimport {modifyAckedPromise} from '../../helpers/modifyAckedResult';\nimport {ChatFull} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {i18n} from '../../lib/langPack';\nimport {AckedResult} from '../../lib/mtproto/superMessagePort';\nimport rootScope from '../../lib/rootScope';\nimport AvatarElement from '../avatar';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from '../buttonMenu';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport PeerTitle from '../peerTitle';\nimport SetTransition from '../singleTransition';\nimport getChatMembersString from '../wrappers/getChatMembersString';\n\nconst SEND_AS_ANIMATION_DURATION = 300;\n\nexport default class ChatSendAs {\n private avatar: AvatarElement;\n private container: HTMLElement;\n private closeBtn: HTMLElement;\n private btnMenu: HTMLElement;\n private sendAsPeerIds: PeerId[];\n private sendAsPeerId: PeerId;\n private updatingPromise: ReturnType;\n private middleware: ReturnType;\n private listenerSetter: ListenerSetter;\n private peerId: PeerId;\n private addedListener: boolean;\n private buttons: ButtonMenuItemOptions[];\n\n constructor(\n private managers: AppManagers,\n private onReady: (container: HTMLElement, skipAnimation?: boolean) => void,\n private onChange: (sendAsPeerId: PeerId) => void\n ) {\n this.middleware = getMiddleware();\n this.listenerSetter = new ListenerSetter();\n this.construct();\n }\n\n private construct() {\n this.container = document.createElement('div');\n this.container.classList.add('new-message-send-as-container');\n\n this.closeBtn = document.createElement('div');\n this.closeBtn.classList.add('new-message-send-as-close', 'new-message-send-as-avatar', 'tgico-close');\n\n const sendAsButtons: ButtonMenuItemOptions[] = [{\n text: 'SendMessageAsTitle',\n onClick: undefined\n }];\n\n this.buttons = [];\n\n let previousAvatar: HTMLElement;\n const onSendAsMenuToggle = (visible: boolean) => {\n if(visible) {\n previousAvatar = this.avatar;\n }\n\n const isChanged = this.avatar !== previousAvatar;\n const useRafs = !visible && isChanged ? 2 : 0;\n\n SetTransition({\n element: this.closeBtn,\n className: 'is-visible',\n forwards: visible,\n duration: SEND_AS_ANIMATION_DURATION,\n useRafs\n });\n if(!isChanged) {\n SetTransition({\n element: previousAvatar,\n className: 'is-visible',\n forwards: !visible,\n duration: SEND_AS_ANIMATION_DURATION,\n useRafs\n });\n }\n };\n\n ButtonMenuToggle({\n buttonOptions: {noRipple: true},\n listenerSetter: this.listenerSetter,\n container: this.container,\n direction: 'top-right',\n buttons: sendAsButtons,\n onOpenBefore: () => {\n onSendAsMenuToggle(true);\n },\n onOpen: (e, btnMenu) => {\n sendAsButtons[0].element.classList.add('btn-menu-item-header');\n this.btnMenu = btnMenu as any;\n this.btnMenu.classList.add('scrollable', 'scrollable-y');\n this.btnMenu.append(...this.buttons.map((button) => button.element));\n },\n onClose: () => {\n onSendAsMenuToggle(false);\n },\n onCloseAfter: () => {\n this.btnMenu = undefined;\n }\n });\n\n this.container.append(this.closeBtn);\n }\n\n private async updateButtons(peerIds: PeerId[]) {\n const promises: Promise[] = peerIds.map(async(sendAsPeerId, idx) => {\n const textElement = document.createElement('div');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('btn-menu-item-subtitle');\n if(sendAsPeerId.isUser()) {\n subtitle.append(i18n('Chat.SendAs.PersonalAccount'));\n } else if(sendAsPeerId === this.peerId) {\n subtitle.append(i18n('VoiceChat.DiscussionGroup'));\n } else {\n subtitle.append(await getChatMembersString(sendAsPeerId.toChatId()));\n }\n\n textElement.append(\n new PeerTitle({peerId: sendAsPeerId}).element,\n subtitle\n );\n\n return {\n onClick: idx ? async() => {\n const currentPeerId = this.peerId;\n this.changeSendAsPeerId(sendAsPeerId);\n\n const middleware = this.middleware.get();\n const executeButtonsUpdate = () => {\n if(this.sendAsPeerId !== sendAsPeerId || !middleware()) return;\n const peerIds = this.sendAsPeerIds.slice();\n indexOfAndSplice(peerIds, sendAsPeerId);\n peerIds.unshift(sendAsPeerId);\n this.updateButtons(peerIds);\n };\n\n if(rootScope.settings.animationsEnabled) {\n setTimeout(executeButtonsUpdate, 250);\n } else {\n executeButtonsUpdate();\n }\n\n // return;\n this.managers.appMessagesManager.saveDefaultSendAs(currentPeerId, sendAsPeerId);\n } : undefined,\n textElement\n };\n });\n\n const buttons = await Promise.all(promises);\n const btnMenu = ButtonMenuSync({buttons}/* , this.listenerSetter */);\n buttons.forEach((button, idx) => {\n const peerId = peerIds[idx];\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-26', 'btn-menu-item-icon');\n avatar.updateWithOptions({peerId});\n\n if(!idx) {\n avatar.classList.add('active');\n }\n\n button.element.prepend(avatar);\n });\n\n this.buttons = buttons;\n\n // if already opened\n this.btnMenu?.append(...this.buttons.map((button) => button.element));\n }\n\n private async updateAvatar(sendAsPeerId: PeerId, skipAnimation?: boolean) {\n const previousAvatar = this.avatar;\n if(previousAvatar) {\n if(previousAvatar.peerId === sendAsPeerId) {\n return;\n }\n }\n\n if(!previousAvatar) {\n skipAnimation = true;\n }\n\n const useRafs = skipAnimation ? 0 : 2;\n const duration = skipAnimation ? 0 : SEND_AS_ANIMATION_DURATION;\n const avatar = this.avatar = new AvatarElement();\n avatar.classList.add('new-message-send-as-avatar', 'avatar-30');\n await avatar.updateWithOptions({\n isDialog: false,\n peerId: sendAsPeerId\n });\n\n SetTransition({\n element: avatar,\n className: 'is-visible',\n forwards: true,\n duration,\n useRafs\n });\n if(previousAvatar) {\n SetTransition({\n element: previousAvatar,\n className: 'is-visible',\n forwards: false,\n duration,\n onTransitionEnd: () => {\n previousAvatar.remove();\n },\n useRafs\n });\n }\n\n this.container.append(avatar);\n }\n\n private changeSendAsPeerId(sendAsPeerId: PeerId, skipAnimation?: boolean) {\n this.sendAsPeerId = sendAsPeerId;\n this.onChange(sendAsPeerId);\n return this.updateAvatar(sendAsPeerId, skipAnimation);\n }\n\n private getDefaultSendAs(): Promise> {\n // return rootScope.myId;\n return this.managers.acknowledged.appProfileManager.getChannelFull(this.peerId.toChatId()).then((acked) => {\n return {\n cached: acked.cached,\n result: acked.result.then((channelFull) => {\n return channelFull.default_send_as ? getPeerId(channelFull.default_send_as) : undefined\n })\n };\n });\n }\n\n public async updateManual(skipAnimation?: boolean): Promise<() => void> {\n const peerId = this.peerId;\n if(this.updatingPromise || !(await this.managers.appPeersManager.isChannel(peerId))) {\n return;\n }\n\n const middleware = this.middleware.get(() => {\n return !this.updatingPromise || this.updatingPromise === updatingPromise;\n });\n\n const {container} = this;\n const chatId = peerId.toChatId();\n const result = (await modifyAckedPromise(this.getDefaultSendAs())).result;\n // const result = Promise.resolve(this.getDefaultSendAs());\n\n const wasSkippingAnimation = skipAnimation;\n if(result instanceof Promise) {\n skipAnimation = undefined;\n }\n\n const auto = wasSkippingAnimation && !skipAnimation;\n\n const updatingPromise = this.updatingPromise = callbackify(result, async(sendAsPeerId) => {\n if(!middleware() || sendAsPeerId === undefined) return;\n\n await this.changeSendAsPeerId(sendAsPeerId, skipAnimation);\n if(!middleware()) return;\n\n this.managers.appChatsManager.getSendAs(chatId).then((sendAsPeers) => {\n if(!middleware()) return;\n\n const peers = sendAsPeers.filter((sendAsPeer) => !sendAsPeer.pFlags.premium_required).map((sendAsPeer) => sendAsPeer.peer);\n const peerIds = peers.map((peer) => getPeerId(peer));\n this.sendAsPeerIds = peerIds.slice();\n\n indexOfAndSplice(peerIds, sendAsPeerId);\n peerIds.unshift(sendAsPeerId);\n this.updateButtons(peerIds);\n });\n\n const callback = () => {\n this.onReady(container, skipAnimation);\n\n if(!this.addedListener) {\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\n if(this.peerId === peerId) {\n this.update();\n }\n });\n\n this.addedListener = true;\n }\n };\n\n if(auto) {\n callback();\n return;\n }\n\n return callback;\n });\n\n updatingPromise.finally(() => {\n if(this.updatingPromise === updatingPromise) {\n this.updatingPromise = undefined;\n }\n });\n\n if(!auto) {\n return updatingPromise;\n }\n }\n\n public update(skipAnimation?: boolean) {\n return this.updateManual(skipAnimation).then((callback) => callback?.());\n }\n\n public setPeerId(peerId?: PeerId) {\n /* if(this.avatar) {\n this.avatar.remove();\n this.avatar = undefined;\n } */\n\n this.middleware.clean();\n this.updatingPromise = undefined;\n this.peerId = peerId;\n }\n\n public destroy() {\n this.container.remove();\n this.setPeerId();\n this.listenerSetter.removeAll();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {USING_BOMS} from '../helpers/dom/richInputHandler';\nimport BOM from '../helpers/string/bom';\nimport {_i18n} from '../lib/langPack';\nimport InputField, {InputFieldOptions} from './inputField';\nimport SetTransition from './singleTransition';\n\nconst USELESS_REG_EXP = new RegExp(`(${BOM})|()`, 'g');\n\nexport default class InputFieldAnimated extends InputField {\n public inputFake: HTMLElement;\n\n // public onLengthChange: (length: number, isOverflow: boolean) => void;\n // protected wasInputFakeClientHeight: number;\n // protected showScrollDebounced: () => void;\n\n constructor(options?: InputFieldOptions) {\n super(options);\n\n this.input.addEventListener('input', () => {\n this.updateInnerHTML();\n this.onFakeInput();\n });\n\n if(options.placeholder) {\n _i18n(this.inputFake, options.placeholder, undefined, 'placeholder');\n }\n\n this.input.classList.add('scrollable', 'scrollable-y');\n // this.wasInputFakeClientHeight = 0;\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\n this.inputFake = document.createElement('div');\n // this.inputFake.contentEditable = 'true';\n this.inputFake.contentEditable = 'true';\n this.inputFake.tabIndex = -1;\n this.inputFake.className = this.input.className + ' input-field-input-fake';\n }\n\n public onFakeInput(setHeight = true) {\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\n this.showScrollDebounced();\n } */\n\n const currentHeight = +this.input.style.height.replace('px', '');\n if(currentHeight === newHeight) {\n return;\n }\n\n const TRANSITION_DURATION_FACTOR = 50;\n const transitionDuration = Math.round(\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight))\n );\n\n // this.wasInputFakeClientHeight = clientHeight;\n this.input.style.transitionDuration = `${transitionDuration}ms`;\n\n if(setHeight) {\n this.input.style.height = newHeight ? newHeight + 'px' : '';\n }\n\n const className = 'is-changing-height';\n SetTransition({\n element: this.input,\n className,\n forwards: true,\n duration: transitionDuration,\n onTransitionEnd: () => {\n this.input.classList.remove(className);\n }\n });\n }\n\n protected updateInnerHTML(innerHTML = this.input.innerHTML) {\n innerHTML = innerHTML.replace(//, '')\n .replace(/().+?\\/custom-emoji-element>/g, '$1')\n\n if(USING_BOMS) {\n innerHTML = innerHTML.replace(USELESS_REG_EXP, '');\n }\n\n this.inputFake.innerHTML = innerHTML;\n }\n\n public setValueSilently(value: Parameters[0], fromSet?: boolean) {\n super.setValueSilently(value, fromSet);\n\n this.updateInnerHTML();\n if(!fromSet) {\n this.onFakeInput();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {markdownTags, MarkdownType} from './getRichElementValue';\n\nexport default function hasMarkupInSelection(types: T[]) {\n const result: Record = {} as any;\n types.forEach((tag) => result[tag] = false);\n const selection = window.getSelection();\n if(!selection.isCollapsed) {\n const range = selection.getRangeAt(0);\n const commonAncestor = range.commonAncestorContainer;\n const treeWalker = document.createTreeWalker(\n (commonAncestor.nodeType === commonAncestor.ELEMENT_NODE ? commonAncestor as HTMLElement : (commonAncestor as ChildNode).parentElement).closest('[contenteditable=\"true\"]'),\n NodeFilter.SHOW_ELEMENT,\n {acceptNode: (node) => range.intersectsNode(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT}\n );\n\n let element: HTMLElement;\n while(element = treeWalker.nextNode() as HTMLElement) {\n for(const type of types) {\n if(result[type]) {\n continue;\n }\n\n const tag = markdownTags[type];\n if(element.matches(tag.match)) {\n result[type] = true;\n }\n }\n }\n }\n\n return result;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport type {AppImManager} from '../../lib/appManagers/appImManager';\nimport type {MyDraftMessage} from '../../lib/appManagers/appDraftsManager';\nimport type Chat from './chat';\nimport Recorder from '../../../public/recorder.min';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n// import Recorder from '../opus-recorder/dist/recorder.min';\nimport opusDecodeController from '../../lib/opusDecodeController';\nimport {ButtonMenuItemOptions, ButtonMenuItemOptionsVerifiable, ButtonMenuSync} from '../buttonMenu';\nimport emoticonsDropdown from '../emoticonsDropdown';\nimport PopupCreatePoll from '../popups/createPoll';\nimport PopupForward from '../popups/forward';\nimport PopupNewMedia from '../popups/newMedia';\nimport {toast, toastNew} from '../toast';\nimport {MessageEntity, DraftMessage, WebPage, Message, UserFull, AttachMenuPeerType} from '../../layer';\nimport StickersHelper from './stickersHelper';\nimport ButtonIcon from '../buttonIcon';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport ListenerSetter, {Listener} from '../../helpers/listenerSetter';\nimport Button from '../button';\nimport PopupSchedule from '../popups/schedule';\nimport SendMenu from './sendContextMenu';\nimport rootScope from '../../lib/rootScope';\nimport PopupPinMessage from '../popups/unpinMessage';\nimport tsNow from '../../helpers/tsNow';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {IS_MOBILE, IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport I18n, {i18n, join, LangPackKey} from '../../lib/langPack';\nimport {generateTail} from './bubbles';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport ButtonCorner from '../buttonCorner';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport cancelSelection from '../../helpers/dom/cancelSelection';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {MarkdownType} from '../../helpers/dom/getRichElementValue';\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\nimport EmojiHelper from './emojiHelper';\nimport CommandsHelper from './commandsHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompleteHelper from './autocompleteHelper';\nimport MentionsHelper from './mentionsHelper';\nimport fixSafariStickyInput from '../../helpers/dom/fixSafariStickyInput';\nimport ReplyKeyboard from './replyKeyboard';\nimport InlineHelper from './inlineHelper';\nimport debounce from '../../helpers/schedulers/debounce';\nimport noop from '../../helpers/noop';\nimport {putPreloader} from '../putPreloader';\nimport SetTransition from '../singleTransition';\nimport PeerTitle from '../peerTitle';\nimport {fastRaf} from '../../helpers/schedulers';\nimport PopupDeleteMessages from '../popups/deleteMessages';\nimport fixSafariStickyInputFocusing, {IS_STICKY_INPUT_BUGGED} from '../../helpers/dom/fixSafariStickyInputFocusing';\nimport PopupPeer from '../popups/peer';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport appMediaPlaybackController from '../appMediaPlaybackController';\nimport {BOT_START_PARAM, NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport setCaretAt from '../../helpers/dom/setCaretAt';\nimport CheckboxField from '../checkboxField';\nimport DropdownHover from '../../helpers/dropdownHover';\nimport RadioForm from '../radioForm';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport callbackify from '../../helpers/callbackify';\nimport ChatBotCommands from './botCommands';\nimport copy from '../../helpers/object/copy';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport documentFragmentToHTML from '../../helpers/dom/documentFragmentToHTML';\nimport PopupElement from '../popups';\nimport getEmojiEntityFromEmoji from '../../lib/richTextProcessor/getEmojiEntityFromEmoji';\nimport mergeEntities from '../../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../../lib/richTextProcessor/parseEntities';\nimport parseMarkdown from '../../lib/richTextProcessor/parseMarkdown';\nimport wrapDraftText from '../../lib/richTextProcessor/wrapDraftText';\nimport wrapDraft from '../wrappers/draft';\nimport wrapMessageForReply from '../wrappers/messageForReply';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {emojiFromCodePoints} from '../../vendor/emoji';\nimport {modifyAckedPromise} from '../../helpers/modifyAckedResult';\nimport ChatSendAs from './sendAs';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport InputFieldAnimated from '../inputFieldAnimated';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport PopupStickers from '../popups/stickers';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport wrapReply from '../wrappers/reply';\nimport {getEmojiFromElement} from '../emoticonsDropdown/tabs/emoji';\nimport hasMarkupInSelection from '../../helpers/dom/hasMarkupInSelection';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport RichInputHandler from '../../helpers/dom/richInputHandler';\nimport {insertRichTextAsHTML} from '../inputField';\nimport getCaretPosNew from '../../helpers/dom/getCaretPosNew';\nimport draftsAreEqual from '../../lib/appManagers/utils/drafts/draftsAreEqual';\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport getAttachMenuBotIcon from '../../lib/appManagers/utils/attachMenuBots/getAttachMenuBotIcon';\nimport TelegramWebView from '../telegramWebView';\n\nconst RECORD_MIN_TIME = 500;\nconst POSTING_MEDIA_NOT_ALLOWED = 'Posting media content isn\\'t allowed in this group.';\n\ntype ChatInputHelperType = 'edit' | 'webpage' | 'forward' | 'reply';\n\nexport default class ChatInput {\n // private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?::|.)(?!.*[:@]).*|(?:[@\\/]\\S*))$/;\n private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?:(?:@|^\\/)\\S*)|(?::|^[^:@\\/])(?!.*[:@\\/]).*)$/;\n public messageInput: HTMLElement;\n public messageInputField: InputFieldAnimated;\n private fileInput: HTMLInputElement;\n private inputMessageContainer: HTMLDivElement;\n private btnSend: HTMLButtonElement;\n private btnCancelRecord: HTMLButtonElement;\n private lastUrl = '';\n private lastTimeType = 0;\n\n public chatInput: HTMLElement;\n public inputContainer: HTMLElement;\n public rowsWrapper: HTMLDivElement;\n private newMessageWrapper: HTMLDivElement;\n private btnToggleEmoticons: HTMLButtonElement;\n private btnToggleReplyMarkup: HTMLButtonElement;\n private btnSendContainer: HTMLDivElement;\n\n private replyKeyboard: ReplyKeyboard;\n\n private attachMenu: HTMLElement;\n private attachMenuButtons: ButtonMenuItemOptionsVerifiable[];\n\n private sendMenu: SendMenu;\n\n private replyElements: {\n container: HTMLElement,\n cancelBtn: HTMLButtonElement,\n iconBtn: HTMLButtonElement\n } = {} as any;\n\n private forwardElements: {\n changePeer: ButtonMenuItemOptions,\n showSender: ButtonMenuItemOptions,\n hideSender: ButtonMenuItemOptions,\n showCaption: ButtonMenuItemOptions,\n hideCaption: ButtonMenuItemOptions,\n container: HTMLElement,\n modifyArgs?: ButtonMenuItemOptions[]\n };\n private forwardHover: DropdownHover;\n private forwardWasDroppingAuthor: boolean;\n\n private getWebPagePromise: Promise;\n private willSendWebPage: WebPage = null;\n private forwarding: {[fromPeerId: PeerId]: number[]};\n public replyToMsgId: number;\n public editMsgId: number;\n public editMessage: Message.message;\n private noWebPage: true;\n public scheduleDate: number;\n public sendSilent: true;\n public startParam: string;\n\n private recorder: any;\n public recording = false;\n private recordCanceled = false;\n private recordTimeEl: HTMLElement;\n private recordRippleEl: HTMLElement;\n private recordStartTime = 0;\n private recordingOverlayListener: Listener;\n private recordingNavigationItem: NavigationItem;\n\n // private scrollTop = 0;\n // private scrollOffsetTop = 0;\n // private scrollDiff = 0;\n\n public helperType: Exclude;\n private helperFunc: () => void | Promise;\n private helperWaitingForward: boolean;\n\n public willAttachType: 'document' | 'media';\n\n private lockRedo = false;\n private canRedoFromHTML = '';\n private readonly undoHistory: string[] = [];\n private readonly executedHistory: string[] = [];\n private canUndoFromHTML = '';\n\n private autocompleteHelperController: AutocompleteHelperController;\n private stickersHelper: StickersHelper;\n private emojiHelper: EmojiHelper;\n private commandsHelper: CommandsHelper;\n private mentionsHelper: MentionsHelper;\n private inlineHelper: InlineHelper;\n private listenerSetter: ListenerSetter;\n\n private pinnedControlBtn: HTMLButtonElement;\n\n private goDownBtn: HTMLButtonElement;\n private goDownUnreadBadge: HTMLElement;\n private goMentionBtn: HTMLButtonElement;\n private goMentionUnreadBadge: HTMLSpanElement;\n private btnScheduled: HTMLButtonElement;\n\n private btnPreloader: HTMLButtonElement;\n\n private saveDraftDebounced: () => void;\n\n private fakeRowsWrapper: HTMLDivElement;\n\n private previousQuery: string;\n\n private releaseMediaPlayback: () => void;\n\n private botStartBtn: HTMLButtonElement;\n private rowsWrapperWrapper: HTMLDivElement;\n private controlContainer: HTMLElement;\n private fakeSelectionWrapper: HTMLDivElement;\n\n private fakeWrapperTo: HTMLElement;\n private toggleBotStartBtnDisability: () => void;\n\n private botCommandsToggle: HTMLElement;\n private botCommands: ChatBotCommands;\n private botCommandsIcon: HTMLDivElement;\n private hasBotCommands: boolean;\n\n // private activeContainer: HTMLElement;\n\n private sendAs: ChatSendAs;\n public sendAsPeerId: PeerId;\n\n private replyInTopicOverlay: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private appImManager: AppImManager,\n private managers: AppManagers\n ) {\n this.listenerSetter = new ListenerSetter();\n }\n\n public construct() {\n this.chatInput = document.createElement('div');\n this.chatInput.classList.add('chat-input', 'hide');\n\n this.inputContainer = document.createElement('div');\n this.inputContainer.classList.add('chat-input-container');\n\n this.rowsWrapperWrapper = document.createElement('div');\n this.rowsWrapperWrapper.classList.add('rows-wrapper-wrapper');\n\n this.rowsWrapper = document.createElement('div');\n this.rowsWrapper.classList.add('rows-wrapper', 'chat-input-wrapper');\n\n this.rowsWrapperWrapper.append(this.rowsWrapper);\n\n const tail = generateTail();\n this.rowsWrapper.append(tail);\n\n const fakeRowsWrapper = this.fakeRowsWrapper = document.createElement('div');\n fakeRowsWrapper.classList.add('fake-wrapper', 'fake-rows-wrapper');\n\n const fakeSelectionWrapper = this.fakeSelectionWrapper = document.createElement('div');\n fakeSelectionWrapper.classList.add('fake-wrapper', 'fake-selection-wrapper');\n\n this.inputContainer.append(this.rowsWrapperWrapper, fakeRowsWrapper, fakeSelectionWrapper);\n this.chatInput.append(this.inputContainer);\n\n this.goDownBtn = ButtonCorner({icon: 'arrow_down', className: 'bubbles-corner-button chat-secondary-button bubbles-go-down hide'});\n this.inputContainer.append(this.goDownBtn);\n\n attachClickEvent(this.goDownBtn, (e) => {\n cancelEvent(e);\n this.chat.bubbles.onGoDownClick();\n }, {listenerSetter: this.listenerSetter});\n\n // * constructor end\n\n /* let setScrollTopTimeout: number;\n // @ts-ignore\n let height = window.visualViewport.height; */\n // @ts-ignore\n // this.listenerSetter.add(window.visualViewport)('resize', () => {\n // const scrollable = this.chat.bubbles.scrollable;\n // const wasScrolledDown = scrollable.isScrolledDown;\n\n // /* if(wasScrolledDown) {\n // this.saveScroll();\n // } */\n\n // // @ts-ignore\n // let newHeight = window.visualViewport.height;\n // const diff = height - newHeight;\n // const scrollTop = scrollable.scrollTop;\n // const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\n\n // console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\n\n // scrollable.scrollTop = needScrollTop;\n\n // if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\n // setScrollTopTimeout = window.setTimeout(() => {\n // const diff = height - newHeight;\n // const isScrolledDown = scrollable.scrollHeight - Math.round(scrollable.scrollTop + scrollable.container.offsetHeight + diff) <= 1;\n // height = newHeight;\n\n // scrollable.scrollTop = needScrollTop;\n\n // console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\n\n // /* if(isScrolledDown) {\n // scrollable.scrollTop = scrollable.scrollHeight;\n // } */\n\n // //scrollable.scrollTop += diff;\n // setScrollTopTimeout = 0;\n // }, 0);\n // });\n\n // ! Can't use it with resizeObserver\n /* this.listenerSetter.add(window.visualViewport)('resize', () => {\n const scrollable = this.chat.bubbles.scrollable;\n const wasScrolledDown = scrollable.isScrolledDown;\n\n // @ts-ignore\n let newHeight = window.visualViewport.height;\n const diff = height - newHeight;\n const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollable.scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\n\n //console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\n\n scrollable.scrollTop = needScrollTop;\n height = newHeight;\n\n if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\n setScrollTopTimeout = window.setTimeout(() => { // * try again for scrolled down Android Chrome\n scrollable.scrollTop = needScrollTop;\n\n //console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\n setScrollTopTimeout = 0;\n }, 0);\n }); */\n\n const c = this.controlContainer = document.createElement('div');\n c.classList.add('chat-input-control', 'chat-input-wrapper');\n this.inputContainer.append(c);\n }\n\n public constructPeerHelpers() {\n this.replyElements.container = document.createElement('div');\n this.replyElements.container.classList.add('reply-wrapper');\n\n this.replyElements.iconBtn = ButtonIcon('');\n this.replyElements.cancelBtn = ButtonIcon('close reply-cancel', {noRipple: true});\n\n this.replyElements.container.append(this.replyElements.iconBtn, this.replyElements.cancelBtn);\n\n //\n\n const onHideAuthorClick = () => {\n isChangingAuthor = true;\n return this.canToggleHideAuthor();\n };\n\n const onHideCaptionClick = () => {\n isChangingAuthor = false;\n };\n\n const forwardElements: ChatInput['forwardElements'] = this.forwardElements = {} as any;\n let isChangingAuthor = false;\n const forwardButtons: ButtonMenuItemOptions[] = [\n forwardElements.showSender = {\n text: 'Chat.Alert.Forward.Action.Show1',\n onClick: onHideAuthorClick,\n checkboxField: new CheckboxField({checked: true})\n },\n forwardElements.hideSender = {\n text: 'Chat.Alert.Forward.Action.Hide1',\n onClick: onHideAuthorClick,\n checkboxField: new CheckboxField({checked: false})\n },\n forwardElements.showCaption = {\n text: 'Chat.Alert.Forward.Action.ShowCaption',\n onClick: onHideCaptionClick,\n checkboxField: new CheckboxField({checked: true})\n },\n forwardElements.hideCaption = {\n text: 'Chat.Alert.Forward.Action.HideCaption',\n onClick: onHideCaptionClick,\n checkboxField: new CheckboxField({checked: false})\n },\n forwardElements.changePeer = {\n text: 'Chat.Alert.Forward.Action.Another',\n onClick: () => {\n this.changeForwardRecipient();\n },\n icon: 'replace'\n }\n ];\n const forwardBtnMenu = forwardElements.container = ButtonMenuSync({\n buttons: forwardButtons,\n listenerSetter: this.listenerSetter\n });\n // forwardBtnMenu.classList.add('top-center');\n\n const children = Array.from(forwardBtnMenu.children) as HTMLElement[];\n const groups: {\n elements: HTMLElement[],\n onChange: (value: string, event: Event) => void\n }[] = [{\n elements: children.slice(0, 2),\n onChange: (value, e) => {\n const checked = !!+value;\n if(isChangingAuthor) {\n this.forwardWasDroppingAuthor = !checked;\n }\n\n const replyTitle = this.replyElements.container.querySelector('.reply-title');\n if(replyTitle) {\n const el = replyTitle.firstElementChild as HTMLElement;\n const i = I18n.weakMap.get(el) as I18n.IntlElement;\n const langPackKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\n i.key = langPackKey;\n i.update();\n }\n }\n }, {\n elements: children.slice(2, 4),\n onChange: (value) => {\n const checked = !!+value;\n let b: ButtonMenuItemOptions;\n if(checked && this.forwardWasDroppingAuthor !== undefined) {\n b = this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender;\n } else {\n b = checked ? forwardElements.showSender : forwardElements.hideSender;\n }\n\n b.checkboxField.checked = true;\n }\n }];\n groups.forEach((group) => {\n const container = RadioForm(group.elements.map((e) => {\n return {\n container: e,\n input: e.querySelector('input')\n };\n }), group.onChange);\n\n const hr = document.createElement('hr');\n container.append(hr);\n forwardBtnMenu.append(container);\n });\n\n forwardBtnMenu.append(forwardElements.changePeer.element);\n\n if(!IS_TOUCH_SUPPORTED) {\n const forwardHover = this.forwardHover = new DropdownHover({\n element: forwardBtnMenu\n });\n }\n\n forwardElements.modifyArgs = forwardButtons.slice(0, -1);\n this.replyElements.container.append(forwardBtnMenu);\n\n forwardElements.modifyArgs.forEach((b, idx) => {\n const {input} = b.checkboxField;\n input.type = 'radio';\n input.name = idx < 2 ? 'author' : 'caption';\n input.value = '' + +!(idx % 2);\n });\n\n //\n\n this.newMessageWrapper = document.createElement('div');\n this.newMessageWrapper.classList.add('new-message-wrapper');\n\n this.replyInTopicOverlay = document.createElement('div');\n this.replyInTopicOverlay.classList.add('reply-in-topic-overlay', 'hide');\n this.replyInTopicOverlay.append(i18n('Chat.Input.ReplyToAnswer'));\n\n this.btnToggleEmoticons = ButtonIcon('none toggle-emoticons', {noRipple: true});\n\n this.inputMessageContainer = document.createElement('div');\n this.inputMessageContainer.classList.add('input-message-container');\n\n this.goDownUnreadBadge = document.createElement('span');\n this.goDownUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\n this.goDownBtn.append(this.goDownUnreadBadge);\n\n this.goMentionBtn = ButtonCorner({icon: 'mention', className: 'bubbles-corner-button chat-secondary-button bubbles-go-mention'});\n this.goMentionUnreadBadge = document.createElement('span');\n this.goMentionUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\n this.goMentionBtn.append(this.goMentionUnreadBadge);\n this.inputContainer.append(this.goMentionBtn);\n\n attachClickEvent(this.goMentionBtn, (e) => {\n cancelEvent(e);\n const middleware = this.chat.bubbles.getMiddleware();\n this.managers.appMessagesManager.goToNextMention(this.chat.peerId, this.chat.threadId).then((mid) => {\n if(!middleware()) {\n return;\n }\n\n if(mid) {\n this.chat.setMessageId(mid);\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.btnScheduled = ButtonIcon('scheduled btn-scheduled float hide', {noRipple: true});\n\n attachClickEvent(this.btnScheduled, (e) => {\n this.appImManager.openScheduled(this.chat.peerId);\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId}) => {\n if(this.chat.peerId !== peerId) {\n return;\n }\n\n this.btnScheduled.classList.remove('hide');\n });\n\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId}) => {\n if(this.chat.peerId !== peerId) {\n return;\n }\n\n this.managers.appMessagesManager.getScheduledMessages(this.chat.peerId).then((value) => {\n this.btnScheduled.classList.toggle('hide', !value.length);\n });\n });\n\n this.btnToggleReplyMarkup = ButtonIcon('botcom toggle-reply-markup float hide', {noRipple: true});\n this.replyKeyboard = new ReplyKeyboard({\n appendTo: this.rowsWrapper,\n listenerSetter: this.listenerSetter,\n managers: this.managers,\n btnHover: this.btnToggleReplyMarkup,\n chatInput: this\n });\n this.listenerSetter.add(this.replyKeyboard)('open', () => this.btnToggleReplyMarkup.classList.add('active'));\n this.listenerSetter.add(this.replyKeyboard)('close', () => this.btnToggleReplyMarkup.classList.remove('active'));\n\n this.botCommands = new ChatBotCommands(this.rowsWrapper, this, this.managers);\n this.botCommandsToggle = document.createElement('div');\n this.botCommandsToggle.classList.add('new-message-bot-commands');\n\n const scaler = document.createElement('div');\n scaler.classList.add('new-message-bot-commands-icon-scale');\n\n const icon = this.botCommandsIcon = document.createElement('div');\n icon.classList.add('animated-menu-icon', 'animated-menu-close-icon');\n scaler.append(icon);\n this.botCommandsToggle.append(scaler);\n\n attachClickEvent(this.botCommandsToggle, (e) => {\n cancelEvent(e);\n const isShown = icon.classList.contains('state-back');\n if(isShown) {\n this.botCommands.toggle(true);\n icon.classList.remove('state-back');\n } else {\n this.botCommands.setUserId(this.chat.peerId.toUserId(), this.chat.bubbles.getMiddleware());\n icon.classList.add('state-back');\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.botCommands.addEventListener('visible', () => {\n icon.classList.add('state-back');\n });\n\n this.botCommands.addEventListener('hiding', () => {\n icon.classList.remove('state-back');\n });\n\n this.attachMenuButtons = [{\n icon: 'image',\n text: 'Chat.Input.Attach.PhotoOrVideo',\n onClick: () => {\n this.fileInput.value = '';\n const accept = [...MEDIA_MIME_TYPES_SUPPORTED].join(', ');\n this.fileInput.setAttribute('accept', accept);\n this.willAttachType = 'media';\n this.fileInput.click();\n },\n verify: () => this.chat.canSend('send_media')\n }, {\n icon: 'document',\n text: 'Chat.Input.Attach.Document',\n onClick: () => {\n this.fileInput.value = '';\n this.fileInput.removeAttribute('accept');\n this.willAttachType = 'document';\n this.fileInput.click();\n },\n verify: () => this.chat.canSend('send_media')\n }, {\n icon: 'poll',\n text: 'Poll',\n onClick: () => {\n PopupElement.createPopup(PopupCreatePoll, this.chat).show();\n },\n verify: () => (this.chat.peerId.isAnyChat() || this.chat.isBot) && this.chat.canSend('send_polls')\n }];\n\n const attachMenuButtons = this.attachMenuButtons.slice();\n this.attachMenu = ButtonMenuToggle({\n buttonOptions: {noRipple: true},\n listenerSetter: this.listenerSetter,\n direction: 'top-left',\n buttons: this.attachMenuButtons,\n onOpenBefore: async() => {\n const attachMenuBots = await this.managers.appAttachMenuBotsManager.getAttachMenuBots();\n const buttons = attachMenuButtons.slice();\n const attachMenuBotsButtons = attachMenuBots.filter((attachMenuBot) => {\n return !attachMenuBot.pFlags.inactive;\n }).map((attachMenuBot) => {\n const icon = getAttachMenuBotIcon(attachMenuBot);\n const button: typeof buttons[0] = {\n regularText: wrapEmojiText(attachMenuBot.short_name),\n onClick: () => {\n this.managers.appAttachMenuBotsManager.requestWebView({\n botId: attachMenuBot.bot_id,\n peerId: this.chat.peerId,\n ...this.chat.getMessageSendingParams()\n }).then((webViewResultUrl) => {\n const SANDBOX_ATTRIBUTES = [\n 'allow-scripts',\n 'allow-same-origin',\n 'allow-popups',\n 'allow-forms',\n 'allow-modals',\n 'allow-storage-access-by-user-activation'\n ].join(' ');\n\n class P extends PopupElement<{\n finish: () => void\n }> {\n private telegramWebView: TelegramWebView;\n\n constructor(private url: string) {\n super('popup-payment popup-payment-verification', {\n closable: true,\n overlayClosable: true,\n body: true,\n titleRaw: attachMenuBot.short_name\n });\n\n this.d();\n }\n\n protected destroy() {\n this.telegramWebView.destroy();\n return super.destroy();\n }\n\n private d() {\n const telegramWebView = this.telegramWebView = new TelegramWebView({\n url: this.url,\n sandbox: SANDBOX_ATTRIBUTES\n });\n\n telegramWebView.iframe.classList.add('payment-verification');\n\n this.body.append(telegramWebView.iframe);\n this.show();\n telegramWebView.onMount();\n }\n }\n\n new P(webViewResultUrl.url);\n });\n },\n iconDoc: icon?.icon as MyDocument,\n verify: async() => {\n let found = false;\n\n const verifyMap: {\n [type in AttachMenuPeerType['_']]: () => boolean | Promise\n } = {\n attachMenuPeerTypeSameBotPM: () => this.chat.peerId.toUserId() === attachMenuBot.bot_id,\n attachMenuPeerTypeBotPM: () => this.chat.isBot,\n attachMenuPeerTypePM: () => this.chat.peerId.isUser(),\n attachMenuPeerTypeChat: () => this.chat.isAnyGroup,\n attachMenuPeerTypeBroadcast: () => this.chat.isBroadcast\n };\n\n for(const peerType of attachMenuBot.peer_types) {\n const verify = verifyMap[peerType._];\n found = await verify();\n if(found) {\n break;\n }\n }\n\n return found;\n }\n };\n\n return button;\n });\n\n buttons.splice(buttons.length, 0, ...attachMenuBotsButtons);\n this.attachMenuButtons.splice(0, this.attachMenuButtons.length, ...buttons);\n }\n });\n this.attachMenu.classList.add('attach-file', 'tgico-attach');\n this.attachMenu.classList.remove('tgico-more');\n\n // this.inputContainer.append(this.sendMenu);\n\n this.recordTimeEl = document.createElement('div');\n this.recordTimeEl.classList.add('record-time');\n\n this.fileInput = document.createElement('input');\n this.fileInput.type = 'file';\n this.fileInput.multiple = true;\n this.fileInput.style.display = 'none';\n\n this.newMessageWrapper.append(...[this.botCommandsToggle, this.btnToggleEmoticons, this.inputMessageContainer, this.btnScheduled, this.btnToggleReplyMarkup, this.attachMenu, this.recordTimeEl, this.fileInput].filter(Boolean));\n\n this.rowsWrapper.append(this.replyElements.container);\n this.autocompleteHelperController = new AutocompleteHelperController();\n this.stickersHelper = new StickersHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.managers);\n this.emojiHelper = new EmojiHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\n this.commandsHelper = new CommandsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\n this.mentionsHelper = new MentionsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\n this.inlineHelper = new InlineHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.managers);\n this.rowsWrapper.append(this.newMessageWrapper);\n\n this.btnCancelRecord = ButtonIcon('binfilled btn-circle btn-record-cancel chat-secondary-button');\n\n this.btnSendContainer = document.createElement('div');\n this.btnSendContainer.classList.add('btn-send-container');\n\n this.recordRippleEl = document.createElement('div');\n this.recordRippleEl.classList.add('record-ripple');\n\n this.btnSend = ButtonIcon('none btn-circle btn-send animated-button-icon');\n this.btnSend.insertAdjacentHTML('afterbegin', `\n \n \n \n \n `);\n\n this.btnSendContainer.append(this.recordRippleEl, this.btnSend);\n\n this.sendMenu = new SendMenu({\n onSilentClick: () => {\n this.sendSilent = true;\n this.sendMessage();\n },\n onScheduleClick: () => {\n this.scheduleSending(undefined);\n },\n listenerSetter: this.listenerSetter,\n openSide: 'top-left',\n onContextElement: this.btnSend,\n onOpen: () => {\n return this.chat.type !== 'scheduled' && (!this.isInputEmpty() || !!Object.keys(this.forwarding).length);\n }\n });\n\n this.btnSendContainer.append(this.sendMenu.sendMenu);\n\n this.inputContainer.append(this.btnCancelRecord, this.btnSendContainer);\n\n emoticonsDropdown.attachButtonListener(this.btnToggleEmoticons, this.listenerSetter);\n this.listenerSetter.add(emoticonsDropdown)('open', this.onEmoticonsOpen);\n this.listenerSetter.add(emoticonsDropdown)('close', this.onEmoticonsClose);\n\n this.attachMessageInputField();\n\n /* this.attachMenu.addEventListener('mousedown', (e) => {\n const hidden = this.attachMenu.querySelectorAll('.hide');\n if(hidden.length === this.attachMenuButtons.length) {\n toast(POSTING_MEDIA_NOT_ALLOWED);\n cancelEvent(e);\n return false;\n }\n }, {passive: false, capture: true}); */\n\n this.listenerSetter.add(rootScope)('settings_updated', () => {\n if(this.stickersHelper || this.emojiHelper) {\n // this.previousQuery = undefined;\n this.previousQuery = '';\n this.checkAutocomplete();\n /* if(!rootScope.settings.stickers.suggest) {\n this.stickersHelper.checkEmoticon('');\n } else {\n this.onMessageInput();\n } */\n }\n\n this.messageInputField?.onFakeInput();\n });\n\n this.listenerSetter.add(rootScope)('draft_updated', ({peerId, threadId, draft, force}) => {\n if(this.chat.threadId !== threadId || this.chat.peerId !== peerId || this.chat.type === 'scheduled') return;\n this.setDraft(draft, true, force);\n });\n\n this.listenerSetter.add(this.appImManager)('peer_changing', (chat) => {\n if(this.chat === chat && (this.chat.type === 'chat' || this.chat.type === 'discussion')) {\n this.saveDraft();\n }\n });\n\n this.listenerSetter.add(this.appImManager)('chat_changing', ({from, to}) => {\n if(this.chat === from) {\n this.autocompleteHelperController.toggleListNavigation(false);\n } else if(this.chat === to) {\n this.autocompleteHelperController.toggleListNavigation(true);\n }\n });\n\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\n if(this.chat.type === 'scheduled' && this.chat.peerId === peerId && mids.includes(this.editMsgId)) {\n this.onMessageSent();\n }\n });\n\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\n if(this.chat.peerId === peerId && this.chat.type !== 'scheduled') {\n if(msgs.has(this.editMsgId)) {\n this.onMessageSent();\n }\n\n if(this.replyToMsgId && msgs.has(this.replyToMsgId)) {\n this.clearHelper('reply');\n }\n\n /* if(this.chat.isStartButtonNeeded()) {\n this.setStartParam(BOT_START_PARAM);\n } */\n }\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n if(dialogs.has(this.chat.peerId) && (this.chat.type === 'chat' || this.chat.type === 'discussion')) {\n if(this.startParam === BOT_START_PARAM) {\n this.setStartParam();\n } else { // updateNewMessage comes earlier than dialog appers\n this.center(true);\n }\n }\n });\n\n try {\n this.recorder = new Recorder({\n // encoderBitRate: 32,\n // encoderPath: \"../dist/encoderWorker.min.js\",\n encoderSampleRate: 48000,\n monitorGain: 0,\n numberOfChannels: 1,\n recordingGain: 1,\n reuseWorker: true\n });\n } catch(err) {\n console.error('Recorder constructor error:', err);\n }\n\n this.updateSendBtn();\n\n this.listenerSetter.add(this.fileInput)('change', (e) => {\n const files = (e.target as HTMLInputElement & EventTarget).files;\n if(!files.length) {\n return;\n }\n\n PopupElement.createPopup(PopupNewMedia, this.chat, Array.from(files).slice(), this.willAttachType);\n this.fileInput.value = '';\n }, false);\n\n /* let time = Date.now();\n this.btnSend.addEventListener('touchstart', (e) => {\n time = Date.now();\n });\n\n let eventName1 = 'touchend';\n this.btnSend.addEventListener(eventName1, (e: Event) => {\n //cancelEvent(e);\n console.log(eventName1 + ', time: ' + (Date.now() - time));\n });\n\n let eventName = 'mousedown';\n this.btnSend.addEventListener(eventName, (e: Event) => {\n cancelEvent(e);\n console.log(eventName + ', time: ' + (Date.now() - time));\n }); */\n attachClickEvent(this.btnSend, this.onBtnSendClick, {listenerSetter: this.listenerSetter, touchMouseDown: true});\n\n if(this.recorder) {\n attachClickEvent(this.btnCancelRecord, this.onCancelRecordClick, {listenerSetter: this.listenerSetter});\n\n this.recorder.onstop = () => {\n this.setRecording(false);\n this.chatInput.classList.remove('is-locked');\n this.recordRippleEl.style.transform = '';\n };\n\n this.recorder.ondataavailable = (typedArray: Uint8Array) => {\n if(this.releaseMediaPlayback) {\n this.releaseMediaPlayback();\n this.releaseMediaPlayback = undefined;\n }\n\n if(this.recordingOverlayListener) {\n this.listenerSetter.remove(this.recordingOverlayListener);\n this.recordingOverlayListener = undefined;\n }\n\n if(this.recordingNavigationItem) {\n appNavigationController.removeItem(this.recordingNavigationItem);\n this.recordingNavigationItem = undefined;\n }\n\n if(this.recordCanceled) {\n return;\n }\n\n const {peerId, threadId} = this.chat;\n const replyToMsgId = this.replyToMsgId;\n\n const duration = (Date.now() - this.recordStartTime) / 1000 | 0;\n const dataBlob = new Blob([typedArray], {type: 'audio/ogg'});\n /* const fileName = new Date().toISOString() + \".opus\";\n console.log('Recorder data received', typedArray, dataBlob); */\n\n // let perf = performance.now();\n opusDecodeController.decode(typedArray, true).then((result) => {\n // console.log('WAVEFORM!:', /* waveform, */performance.now() - perf);\n\n opusDecodeController.setKeepAlive(false);\n\n // тут objectURL ставится уже с audio/wav\n this.managers.appMessagesManager.sendFile(peerId, {\n file: dataBlob,\n isVoiceMessage: true,\n isMedia: true,\n duration,\n waveform: result.waveform,\n objectURL: result.url,\n replyToMsgId,\n threadId,\n clearDraft: true\n });\n\n this.onMessageSent(false, true);\n });\n };\n }\n\n attachClickEvent(this.replyElements.cancelBtn, this.onHelperCancel, {listenerSetter: this.listenerSetter});\n attachClickEvent(this.replyElements.container, this.onHelperClick, {listenerSetter: this.listenerSetter});\n\n this.saveDraftDebounced = debounce(() => this.saveDraft(), 2500, false, true);\n\n this.botStartBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button');\n this.botStartBtn.append(i18n('BotStart'));\n\n attachClickEvent(this.botStartBtn, () => {\n const {startParam} = this;\n if(startParam === undefined) {\n return;\n }\n\n const toggle = this.toggleBotStartBtnDisability = toggleDisability([this.botStartBtn], true);\n const peerId = this.chat.peerId;\n const middleware = this.chat.bubbles.getMiddleware(() => {\n return this.chat.peerId === peerId && this.startParam === startParam && this.toggleBotStartBtnDisability === toggle;\n });\n\n this.managers.appMessagesManager.startBot(peerId.toUserId(), undefined, startParam).then(() => {\n if(middleware()) {\n toggle();\n this.toggleBotStartBtnDisability = undefined;\n this.setStartParam();\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.controlContainer.append(this.botStartBtn, this.replyInTopicOverlay);\n\n // * pinned part start\n this.pinnedControlBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button', {icon: 'unpin'});\n this.controlContainer.append(this.pinnedControlBtn);\n\n this.listenerSetter.add(this.pinnedControlBtn)('click', () => {\n const peerId = this.chat.peerId;\n\n new PopupPinMessage(peerId, 0, true, () => {\n this.chat.appImManager.setPeer(); // * close tab\n\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\n const originalChat = this.chat.appImManager.chat;\n if(originalChat.topbar.pinnedMessage) {\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\n }\n });\n });\n // * pinned part end\n }\n\n public _center(neededFakeContainer: HTMLElement, animate?: boolean) {\n if(!neededFakeContainer && !this.inputContainer.classList.contains('is-centering')) {\n return;\n }\n\n if(neededFakeContainer === this.fakeWrapperTo) {\n return;\n }\n\n /* if(neededFakeContainer === this.botStartContainer && this.fakeWrapperTo === this.fakeSelectionWrapper) {\n this.inputContainer.classList.remove('is-centering');\n void this.rowsWrapper.offsetLeft; // reflow\n // this.inputContainer.classList.add('is-centering');\n // void this.rowsWrapper.offsetLeft; // reflow\n } */\n\n const fakeSelectionWrapper = neededFakeContainer || this.fakeWrapperTo;\n const forwards = !!neededFakeContainer;\n const oldFakeWrapperTo = this.fakeWrapperTo;\n let transform = '', borderRadius = '', needTranslateX: number;\n // if(forwards) {]\n const fakeSelectionRect = fakeSelectionWrapper.getBoundingClientRect();\n const fakeRowsRect = this.fakeRowsWrapper.getBoundingClientRect();\n const widthFrom = fakeRowsRect.width;\n const widthTo = fakeSelectionRect.width;\n\n if(widthFrom !== widthTo) {\n const scale = (widthTo/* - 8 */) / widthFrom;\n const initTranslateX = (widthFrom - widthTo) / 2;\n needTranslateX = fakeSelectionRect.left - fakeRowsRect.left - initTranslateX;\n\n if(forwards) {\n transform = `translateX(${needTranslateX}px) scaleX(${scale})`;\n // transform = `translateX(0px) scaleX(${scale})`;\n\n if(scale < 1) {\n const br = 16;\n borderRadius = '' + (br + br * (1 - scale)) + 'px';\n }\n }\n // scale = widthTo / widthFrom;\n }\n // }\n\n this.fakeWrapperTo = neededFakeContainer;\n\n const duration = animate ? 200 : 0;\n SetTransition({\n element: this.inputContainer,\n className: 'is-centering',\n forwards,\n duration\n });\n SetTransition({\n element: this.rowsWrapperWrapper,\n className: 'is-centering-to-control',\n forwards: !!(forwards && neededFakeContainer && neededFakeContainer.classList.contains('chat-input-control')),\n duration\n });\n this.rowsWrapper.style.transform = transform;\n this.rowsWrapper.style.borderRadius = borderRadius;\n\n return {\n transform,\n borderRadius,\n needTranslateX: oldFakeWrapperTo && (\n (\n neededFakeContainer &&\n neededFakeContainer.classList.contains('chat-input-control') &&\n oldFakeWrapperTo === this.fakeSelectionWrapper\n ) || oldFakeWrapperTo.classList.contains('chat-input-control')\n ) ? needTranslateX * -.5 : needTranslateX,\n widthFrom,\n widthTo\n };\n }\n\n public async center(animate = false) {\n return this._center(await this.getNeededFakeContainer(), animate);\n }\n\n public setStartParam(startParam?: string) {\n if(this.startParam === startParam) {\n return;\n }\n\n this.startParam = startParam;\n this.center(true);\n }\n\n public isReplyInTopicOverlayNeeded() {\n return this.chat.isForum &&\n !this.chat.isForumTopic &&\n !this.replyToMsgId &&\n this.chat.type === 'chat';\n }\n\n public async getNeededFakeContainer(startParam = this.startParam) {\n if(this.chat.selection.isSelecting) {\n return this.fakeSelectionWrapper;\n } else if(\n startParam !== undefined ||\n !(await this.chat.canSend()) ||\n this.chat.type === 'pinned' ||\n await this.chat.isStartButtonNeeded() ||\n this.isReplyInTopicOverlayNeeded()\n ) {\n return this.controlContainer;\n }\n }\n\n // public getActiveContainer() {\n // if(this.chat.selection.isSelecting) {\n // return this.chat\n // }\n // return this.startParam !== undefined ? this.botStartContainer : this.rowsWrapper;\n // }\n\n // public setActiveContainer() {\n // const container = this.activeContainer;\n // const newContainer = this.getActiveContainer();\n // if(newContainer === container) {\n // return;\n // }\n\n\n // }\n\n private onCancelRecordClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n this.recordCanceled = true;\n this.recorder.stop();\n opusDecodeController.setKeepAlive(false);\n };\n\n private onEmoticonsOpen = () => {\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\n this.btnToggleEmoticons.classList.toggle(toggleClass, true);\n };\n\n private onEmoticonsClose = () => {\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\n this.btnToggleEmoticons.classList.toggle(toggleClass, false);\n };\n\n public getReadyToSend(callback: () => void) {\n return this.chat.type === 'scheduled' ? (this.scheduleSending(callback), true) : (callback(), false);\n }\n\n public scheduleSending = async(callback: () => void = this.sendMessage.bind(this, true), initDate = new Date()) => {\n const {peerId} = this.chat;\n const middleware = this.chat.bubbles.getMiddleware();\n const canSendWhenOnline = rootScope.myId !== peerId && peerId.isUser() && await this.managers.appUsersManager.isUserOnlineVisible(peerId);\n\n new PopupSchedule(initDate, (timestamp) => {\n if(!middleware()) {\n return;\n }\n\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\n if(timestamp <= minTimestamp) {\n timestamp = undefined;\n }\n\n this.scheduleDate = timestamp;\n callback();\n\n if(this.chat.type !== 'scheduled' && timestamp) {\n setTimeout(() => { // ! need timeout here because .forwardMessages will be called after timeout\n if(!middleware()) {\n return;\n }\n\n const popups = PopupElement.getPopups(PopupStickers);\n popups.forEach((popup) => popup.hide());\n\n this.appImManager.openScheduled(peerId);\n }, 0);\n }\n }, canSendWhenOnline).show();\n };\n\n public async setUnreadCount() {\n if(!this.goDownUnreadBadge) {\n return;\n }\n\n const dialog = await this.managers.dialogsStorage.getDialogOrTopic(this.chat.peerId, this.chat.type === 'discussion' ? undefined : this.chat.threadId);\n const count = dialog?.unread_count;\n this.goDownUnreadBadge.innerText = '' + (count || '');\n this.goDownUnreadBadge.classList.toggle('badge-gray', await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.chat.peerId, respectType: true, threadId: this.chat.threadId}));\n\n if(this.goMentionUnreadBadge && this.chat.type === 'chat') {\n const hasMentions = !!(dialog?.unread_mentions_count && dialog.unread_count);\n this.goMentionUnreadBadge.innerText = hasMentions ? '' + (dialog.unread_mentions_count) : '';\n this.goMentionBtn.classList.toggle('is-visible', hasMentions);\n }\n }\n\n public getCurrentInputAsDraft() {\n const {value, entities} = getRichValueWithCaret(this.messageInputField.input, true, false);\n\n let draft: DraftMessage.draftMessage;\n if(value.length || this.replyToMsgId) {\n draft = {\n _: 'draftMessage',\n date: tsNow(true),\n message: value,\n entities: entities.length ? entities : undefined,\n pFlags: {\n no_webpage: this.noWebPage\n },\n reply_to_msg_id: this.replyToMsgId\n };\n }\n\n return draft;\n }\n\n public saveDraft() {\n if(!this.chat.peerId || this.editMsgId || this.chat.type === 'scheduled') return;\n const draft = this.getCurrentInputAsDraft();\n this.managers.appDraftsManager.syncDraft(this.chat.peerId, this.chat.threadId, draft);\n }\n\n public destroy() {\n // this.chat.log.error('Input destroying');\n\n this.listenerSetter.removeAll();\n }\n\n public cleanup(helperToo = true) {\n if(!this.chat.peerId) {\n this.chatInput.classList.add('hide');\n this.goDownBtn.classList.add('hide');\n }\n\n cancelSelection();\n\n this.lastTimeType = 0;\n this.startParam = undefined;\n\n if(this.toggleBotStartBtnDisability) {\n this.toggleBotStartBtnDisability();\n this.toggleBotStartBtnDisability = undefined;\n }\n\n if(this.messageInput) {\n this.clearInput();\n helperToo && this.clearHelper();\n }\n }\n\n public async setDraft(draft?: MyDraftMessage, fromUpdate = true, force = false) {\n if((!force && !isInputEmpty(this.messageInput)) || this.chat.type === 'scheduled') return false;\n\n if(!draft) {\n draft = await this.managers.appDraftsManager.getDraft(this.chat.peerId, this.chat.threadId);\n\n if(!draft) {\n if(force) { // this situation can only happen when sending message with clearDraft\n /* const height = this.chatInput.getBoundingClientRect().height;\n const willChangeHeight = 78 - height;\n this.willChangeHeight = willChangeHeight; */\n if(this.chat.container.classList.contains('is-helper-active')) {\n this.t();\n }\n\n this.messageInputField.inputFake.textContent = '';\n this.messageInputField.onFakeInput(false);\n\n ((this.chat.bubbles.messagesQueuePromise || Promise.resolve()) as Promise).then(() => {\n fastRaf(() => {\n this.onMessageSent();\n });\n });\n }\n\n return false;\n }\n }\n\n const wrappedDraft = wrapDraft(draft, this.chat.peerId);\n const currentDraft = this.getCurrentInputAsDraft();\n\n if(draftsAreEqual(draft, currentDraft) &&/* this.messageInputField.value === wrappedDraft && */this.replyToMsgId === draft.reply_to_msg_id) return false;\n\n if(fromUpdate) {\n this.clearHelper();\n }\n\n this.noWebPage = draft.pFlags.no_webpage;\n if(draft.reply_to_msg_id) {\n this.initMessageReply(draft.reply_to_msg_id);\n }\n\n this.setInputValue(wrappedDraft, fromUpdate, fromUpdate);\n return true;\n }\n\n private createSendAs() {\n this.sendAsPeerId = undefined;\n\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n let firstChange = true;\n this.sendAs = new ChatSendAs(\n this.managers,\n (container, skipAnimation) => {\n let useRafs = 0;\n if(!container.parentElement) {\n this.newMessageWrapper.prepend(container);\n useRafs = 2;\n }\n\n this.updateOffset('as', true, skipAnimation, useRafs);\n },\n (sendAsPeerId) => {\n this.sendAsPeerId = sendAsPeerId;\n\n // do not change placeholder earlier than finishPeerChange does\n if(firstChange) {\n firstChange = false;\n return;\n }\n\n this.getPlaceholderKey().then((key) => {\n this.updateMessageInputPlaceholder(key);\n });\n }\n );\n } else {\n this.sendAs = undefined;\n }\n\n return this.sendAs;\n }\n\n public async finishPeerChange(startParam?: string) {\n const peerId = this.chat.peerId;\n\n const {forwardElements, btnScheduled, replyKeyboard, sendMenu, goDownBtn, chatInput, botCommandsToggle} = this;\n\n const previousSendAs = this.sendAs;\n const sendAs = this.createSendAs();\n\n const [\n isBroadcast,\n canPinMessage,\n isBot,\n canSend,\n neededFakeContainer,\n ackedPeerFull,\n ackedScheduledMids,\n setSendAsCallback,\n filteredAttachMenuButtons\n ] = await Promise.all([\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.canPinMessage(peerId),\n this.managers.appPeersManager.isBot(peerId),\n this.chat.canSend(),\n this.getNeededFakeContainer(startParam),\n modifyAckedPromise(this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId)),\n btnScheduled ? modifyAckedPromise(this.managers.acknowledged.appMessagesManager.getScheduledMessages(peerId)) : undefined,\n sendAs ? (sendAs.setPeerId(this.chat.peerId), sendAs.updateManual(true)) : undefined,\n this.filterAttachMenuButtons()\n ]);\n\n const placeholderKey = this.messageInput ? await this.getPlaceholderKey() : undefined;\n\n return () => {\n // console.warn('[input] finishpeerchange start');\n\n chatInput.classList.remove('hide');\n goDownBtn.classList.toggle('is-broadcast', isBroadcast);\n goDownBtn.classList.remove('hide');\n\n this.messageInputField?.onFakeInput();\n\n if(this.goDownUnreadBadge) {\n this.setUnreadCount();\n }\n\n if(this.chat.type === 'pinned') {\n chatInput.classList.toggle('can-pin', canPinMessage);\n }/* else if(this.chat.type === 'chat') {\n } */\n\n if(forwardElements) {\n this.forwardWasDroppingAuthor = false;\n forwardElements.showCaption.checkboxField.setValueSilently(true);\n forwardElements.showSender.checkboxField.setValueSilently(true);\n }\n\n if(btnScheduled && ackedScheduledMids) {\n btnScheduled.classList.add('hide');\n const middleware = this.chat.bubbles.getMiddleware();\n callbackify(ackedScheduledMids.result, (mids) => {\n if(!middleware() || !mids) return;\n btnScheduled.classList.toggle('hide', !mids.length);\n });\n }\n\n if(this.newMessageWrapper) {\n this.updateOffset(null, false, true);\n }\n\n if(botCommandsToggle) {\n this.hasBotCommands = undefined;\n this.botCommands.toggle(true, undefined, true);\n this.updateBotCommandsToggle(true);\n botCommandsToggle.remove();\n if(isBot) {\n const middleware = this.chat.bubbles.getMiddleware();\n const result = ackedPeerFull.result;\n callbackify(result, (userFull) => {\n if(!middleware()) return;\n this.updateBotCommands(userFull as UserFull.userFull, !(result instanceof Promise));\n });\n }\n }\n\n if(previousSendAs) {\n previousSendAs.destroy();\n }\n\n if(setSendAsCallback) {\n setSendAsCallback();\n }\n\n if(replyKeyboard) {\n replyKeyboard.setPeer(peerId);\n }\n\n if(sendMenu) {\n sendMenu.setPeerId(peerId);\n }\n\n if(this.messageInput) {\n this.updateMessageInput(canSend, placeholderKey, filteredAttachMenuButtons);\n this.messageInput.dataset.peerId = '' + peerId;\n }\n\n let haveSomethingInControl = false;\n if(this.pinnedControlBtn) {\n const good = this.chat.type === 'pinned';\n haveSomethingInControl ||= good;\n this.pinnedControlBtn.classList.toggle('hide', !good);\n this.pinnedControlBtn.replaceChildren(i18n(canPinMessage ? 'Chat.Input.UnpinAll' : 'Chat.Pinned.DontShow'));\n }\n\n {\n const good = this.chat.isForum && !this.chat.isForumTopic && this.chat.type === 'chat';\n haveSomethingInControl ||= good;\n this.replyInTopicOverlay.classList.toggle('hide', !good);\n }\n\n this.botStartBtn.classList.toggle('hide', haveSomethingInControl);\n\n // * testing\n // this.startParam = this.appPeersManager.isBot(peerId) ? '123' : undefined;\n\n this.startParam = startParam;\n\n this._center(neededFakeContainer, false);\n\n // console.warn('[input] finishpeerchange ends');\n };\n }\n\n private updateOffset(type: 'commands' | 'as', forwards: boolean, skipAnimation?: boolean, useRafs?: number) {\n if(type) {\n this.newMessageWrapper.dataset.offset = type;\n } else {\n delete this.newMessageWrapper.dataset.offset;\n }\n\n SetTransition({\n element: this.newMessageWrapper,\n className: 'has-offset',\n forwards,\n duration: skipAnimation ? 0 : 300,\n useRafs\n });\n }\n\n private updateBotCommands(userFull: UserFull.userFull, skipAnimation?: boolean) {\n this.hasBotCommands = !!userFull.bot_info?.commands?.length;\n this.updateBotCommandsToggle(skipAnimation);\n }\n\n private updateBotCommandsToggle(skipAnimation?: boolean) {\n const {botCommandsToggle, hasBotCommands} = this;\n\n const show = !!hasBotCommands && this.isInputEmpty();\n if(!hasBotCommands) {\n if(!botCommandsToggle.parentElement) {\n return;\n }\n\n botCommandsToggle.remove();\n }\n\n const forwards = show;\n const useRafs = botCommandsToggle.parentElement ? 0 : 2;\n\n if(!botCommandsToggle.parentElement) {\n this.newMessageWrapper.prepend(botCommandsToggle);\n }\n\n this.updateOffset('commands', forwards, skipAnimation, useRafs);\n }\n\n private async getPlaceholderKey() {\n const {peerId, threadId, isForum} = this.chat;\n let key: LangPackKey;\n if(threadId && !isForum) {\n key = 'Comment';\n } else if(await this.managers.appPeersManager.isBroadcast(peerId)) {\n key = 'ChannelBroadcast';\n } else if(\n (this.sendAsPeerId !== undefined && this.sendAsPeerId !== rootScope.myId) ||\n await this.managers.appMessagesManager.isAnonymousSending(peerId)\n ) {\n key = 'SendAnonymously';\n } else {\n key = 'Message';\n }\n\n return key;\n }\n\n private updateMessageInputPlaceholder(key: LangPackKey) {\n // console.warn('[input] update placeholder');\n const i = I18n.weakMap.get(this.messageInput) as I18n.IntlElement;\n if(!i) {\n return;\n }\n\n i.compareAndUpdate({key});\n }\n\n private filterAttachMenuButtons() {\n if(!this.attachMenuButtons) return;\n return filterAsync(this.attachMenuButtons, (button) => {\n return button.verify();\n });\n }\n\n public updateMessageInput(canSend: boolean, placeholderKey: LangPackKey, visible: ChatInput['attachMenuButtons']) {\n const {chatInput, attachMenu, messageInput} = this;\n const {peerId, threadId} = this.chat;\n const isHidden = chatInput.classList.contains('is-hidden');\n const willBeHidden = !canSend;\n if(isHidden !== willBeHidden) {\n chatInput.classList.add('no-transition');\n chatInput.classList.toggle('is-hidden', !canSend);\n void chatInput.offsetLeft; // reflow\n chatInput.classList.remove('no-transition');\n }\n\n this.updateMessageInputPlaceholder(placeholderKey);\n\n if(!canSend) {\n messageInput.contentEditable = 'inherit';\n } else {\n messageInput.contentEditable = 'true';\n this.setDraft(undefined, false);\n\n if(!messageInput.innerHTML) {\n this.messageInputField.onFakeInput();\n }\n }\n\n if(attachMenu) {\n attachMenu.toggleAttribute('disabled', !visible.length);\n attachMenu.classList.toggle('btn-disabled', !visible.length);\n }\n\n this.updateSendBtn();\n }\n\n private attachMessageInputField() {\n const oldInputField = this.messageInputField;\n this.messageInputField = new InputFieldAnimated({\n placeholder: 'Message',\n name: 'message',\n withLinebreaks: true\n });\n\n this.messageInputField.input.classList.replace('input-field-input', 'input-message-input');\n this.messageInputField.inputFake.classList.replace('input-field-input', 'input-message-input');\n this.messageInput = this.messageInputField.input;\n this.messageInput.classList.add('no-scrollbar');\n this.attachMessageInputListeners();\n\n if(IS_STICKY_INPUT_BUGGED) {\n fixSafariStickyInputFocusing(this.messageInput);\n }\n\n if(oldInputField) {\n oldInputField.input.replaceWith(this.messageInputField.input);\n oldInputField.inputFake.replaceWith(this.messageInputField.inputFake);\n } else {\n this.inputMessageContainer.append(this.messageInputField.input, this.messageInputField.inputFake);\n }\n }\n\n private attachMessageInputListeners() {\n this.listenerSetter.add(this.messageInput)('keydown', (e) => {\n const key = e.key;\n\n if(isSendShortcutPressed(e)) {\n cancelEvent(e);\n this.sendMessage();\n } else if(e.ctrlKey || e.metaKey) {\n this.handleMarkdownShortcut(e);\n } else if((key === 'PageUp' || key === 'PageDown') && !e.shiftKey) { // * fix pushing page to left (Chrome Windows)\n e.preventDefault();\n\n if(key === 'PageUp') {\n const range = document.createRange();\n const sel = window.getSelection();\n\n range.setStart(this.messageInput.childNodes[0] || this.messageInput, 0);\n range.collapse(true);\n\n sel.removeAllRanges();\n sel.addRange(range);\n } else {\n placeCaretAtEnd(this.messageInput);\n }\n }\n });\n\n if(IS_TOUCH_SUPPORTED) {\n attachClickEvent(this.messageInput, (e) => {\n if(emoticonsDropdown.isActive()) {\n emoticonsDropdown.toggle(false);\n blurActiveElement();\n cancelEvent(e);\n // this.messageInput.focus();\n return;\n }\n\n this.appImManager.selectTab(1); // * set chat tab for album orientation\n // this.saveScroll();\n }, {listenerSetter: this.listenerSetter});\n\n /* this.listenerSetter.add(window)('resize', () => {\n this.restoreScroll();\n }); */\n\n /* if(isSafari) {\n this.listenerSetter.add(this.messageInput)('mousedown', () => {\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => {\n emoticonsDropdown.toggle(false);\n });\n });\n });\n } */\n }\n\n /* this.listenerSetter.add(this.messageInput)('beforeinput', (e: Event) => {\n // * validate due to manual formatting through browser's context menu\n const inputType = (e as InputEvent).inputType;\n //console.log('message beforeinput event', e);\n\n if(inputType.indexOf('format') === 0) {\n //console.log('message beforeinput format', e, inputType, this.messageInput.innerHTML);\n const markdownType = inputType.split('format')[1].toLowerCase() as MarkdownType;\n if(this.applyMarkdown(markdownType)) {\n cancelEvent(e); // * cancel legacy markdown event\n }\n }\n }); */\n this.listenerSetter.add(this.messageInput)('input', this.onMessageInput);\n this.listenerSetter.add(this.messageInput)('keyup', () => {\n this.checkAutocomplete();\n });\n\n this.listenerSetter.add(this.messageInput)('focusin', () => {\n if((this.chat.type === 'chat' || this.chat.type === 'discussion') &&\n this.chat.bubbles.scrollable.loadedAll.bottom) {\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId);\n }\n });\n }\n\n private prepareDocumentExecute = () => {\n this.executedHistory.push(this.messageInput.innerHTML);\n return () => this.canUndoFromHTML = this.messageInput.innerHTML;\n };\n\n private undoRedo = (e: Event, type: 'undo' | 'redo', needHTML: string) => {\n cancelEvent(e); // cancel legacy event\n\n let html = this.messageInput.innerHTML;\n if(html && html !== needHTML) {\n this.lockRedo = true;\n\n let sameHTMLTimes = 0;\n do {\n document.execCommand(type, false, null);\n const currentHTML = this.messageInput.innerHTML;\n if(html === currentHTML) {\n if(++sameHTMLTimes > 2) { // * unlink, removeFormat (а может и нет, случай: заболдить подчёркнутый текст (выделить ровно его), попробовать отменить)\n break;\n }\n } else {\n sameHTMLTimes = 0;\n }\n\n html = currentHTML;\n } while(html !== needHTML);\n\n this.lockRedo = false;\n }\n };\n\n public applyMarkdown(type: MarkdownType, href?: string) {\n // const MONOSPACE_FONT = 'var(--font-monospace)';\n // const SPOILER_FONT = 'spoiler';\n const commandsMap: Partial<{[key in typeof type]: string | (() => void)}> = {\n // bold: 'Bold',\n // italic: 'Italic',\n // underline: 'Underline',\n // strikethrough: 'Strikethrough',\n // monospace: () => document.execCommand('fontName', false, MONOSPACE_FONT),\n link: href ? () => document.execCommand('createLink', false, href) : () => document.execCommand('unlink', false, null)\n // spoiler: () => document.execCommand('fontName', false, SPOILER_FONT)\n };\n\n const c = (type: MarkdownType) => {\n commandsMap[type] = () => {\n const k = (canCombine.includes(type) ? canCombine : [type]).filter((type) => hasMarkup[type]);\n if(!indexOfAndSplice(k, type)) {\n k.push(type);\n }\n\n if(!k.length) {\n return this.resetCurrentFontFormatting();\n } else {\n return document.execCommand('fontName', false, 'markup-' + k.join('-'));\n }\n };\n };\n\n const canCombine = ['bold', 'italic', 'underline', 'strikethrough', 'spoiler'] as (typeof type)[];\n canCombine.forEach((type) => {\n c(type);\n });\n\n c('monospace');\n\n if(!commandsMap[type]) {\n return false;\n }\n\n const command = commandsMap[type];\n\n // type = 'monospace';\n\n // const saveExecuted = this.prepareDocumentExecute();\n const executed: any[] = [];\n /**\n * * clear previous formatting, due to Telegram's inability to handle several entities\n */\n /* const checkForSingle = () => {\n const nodes = getSelectedNodes();\n //console.log('Using formatting:', commandsMap[type], nodes, this.executedHistory);\n\n const parents = [...new Set(nodes.map((node) => node.parentNode))];\n //const differentParents = !!nodes.find((node) => node.parentNode !== firstParent);\n const differentParents = parents.length > 1;\n\n let notSingle = false;\n if(differentParents) {\n notSingle = true;\n } else {\n const node = nodes[0];\n if(node && (node.parentNode as HTMLElement) !== this.messageInput && (node.parentNode.parentNode as HTMLElement) !== this.messageInput) {\n notSingle = true;\n }\n }\n\n if(notSingle) {\n //if(type === 'monospace') {\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\n //}\n\n executed.push(document.execCommand('unlink', false, null));\n executed.push(document.execCommand('removeFormat', false, null));\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\n\n //if(type === 'monospace') {\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\n //}\n }\n }; */\n\n // fix applying markdown when range starts from contenteditable=\"false\"\n let textNode: Text;\n // do {\n // // const {node, offset, selection} = getCaretPosNew(this.messageInput, true);\n // const selection = document.getSelection();\n // const range = selection.getRangeAt(0);\n // const {node, offset} = getCaretPosF(this.messageInput, range.startContainer, range.startOffset);\n // // const node = range.startContainer as ChildNode;\n // if(node?.textContent === BOM || (node as HTMLElement)?.isContentEditable === false) {\n // // selection.modify('extend', 'backward', 'character');\n // textNode = document.createTextNode(BOM);\n // (node.nodeType === node.ELEMENT_NODE ? node : node.parentElement).before(textNode);\n // range.setStart(textNode, 0);\n // }/* else {\n // break;\n // } */\n\n // break;\n // } while(true);\n\n const richInputHandler = RichInputHandler.getInstance();\n const restore = richInputHandler.prepareApplyingMarkdown();\n\n const listener = this.listenerSetter.add(this.messageInput)('input', cancelEvent, {capture: true, passive: false}) as any as Listener;\n\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\n\n const hasMarkup = hasMarkupInSelection(Object.keys(commandsMap) as (typeof type)[]);\n\n // * monospace can't be combined with different types\n /* if(type === 'monospace' || type === 'spoiler') {\n // executed.push(document.execCommand('styleWithCSS', false, 'true'));\n\n const haveThisType = hasMarkup[type];\n // executed.push(document.execCommand('removeFormat', false, null));\n\n if(haveThisType) {\n executed.push(this.resetCurrentFontFormatting());\n } else {\n // if(type === 'monospace' || hasMarkup['monospace']) {\n // executed.push(this.resetCurrentFormatting());\n // }\n\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\n }\n } else */{\n if(hasMarkup['monospace'] && type === 'link') {\n executed.push(this.resetCurrentFormatting());\n }\n\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\n }\n\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\n\n restore();\n\n // checkForSingle();\n // saveExecuted();\n if(this.appImManager.markupTooltip) {\n this.appImManager.markupTooltip.setActiveMarkupButton();\n }\n\n if(textNode) {\n (textNode.parentElement === this.messageInput ? textNode : textNode.parentElement).remove();\n textNode.nodeValue = '';\n }\n\n this.listenerSetter.remove(listener);\n this.messageInputField.simulateInputEvent();\n\n return true;\n }\n\n private resetCurrentFormatting() {\n return document.execCommand('removeFormat', false, null);\n }\n\n private resetCurrentFontFormatting() {\n return document.execCommand('fontName', false, 'Roboto');\n }\n\n private handleMarkdownShortcut = (e: KeyboardEvent) => {\n // console.log('handleMarkdownShortcut', e);\n const formatKeys: {[key: string]: MarkdownType} = {\n 'KeyB': 'bold',\n 'KeyI': 'italic',\n 'KeyU': 'underline',\n 'KeyS': 'strikethrough',\n 'KeyM': 'monospace',\n 'KeyP': 'spoiler'\n };\n\n if(this.appImManager.markupTooltip) {\n formatKeys['KeyK'] = 'link';\n }\n\n const code = e.code;\n const applyMarkdown = formatKeys[code];\n\n const selection = document.getSelection();\n if(!isSelectionEmpty(selection) && applyMarkdown) {\n // * костыльчик\n if(code === 'KeyK') {\n this.appImManager.markupTooltip.showLinkEditor();\n } else {\n this.applyMarkdown(applyMarkdown);\n }\n\n cancelEvent(e); // cancel legacy event\n }\n\n // return;\n if(code === 'KeyZ') {\n let html = this.messageInput.innerHTML;\n\n if(e.shiftKey) {\n if(this.undoHistory.length) {\n this.executedHistory.push(html);\n html = this.undoHistory.pop();\n this.undoRedo(e, 'redo', html);\n html = this.messageInput.innerHTML;\n this.canRedoFromHTML = this.undoHistory.length ? html : '';\n this.canUndoFromHTML = html;\n }\n } else {\n // * подождём, когда пользователь сам восстановит поле до нужного состояния, которое стало сразу после saveExecuted\n if(this.executedHistory.length && (!this.canUndoFromHTML || html === this.canUndoFromHTML)) {\n this.undoHistory.push(html);\n html = this.executedHistory.pop();\n this.undoRedo(e, 'undo', html);\n\n // * поставим новое состояние чтобы снова подождать, если пользователь изменит что-то, и потом попробует откатить до предыдущего состояния\n this.canUndoFromHTML = this.canRedoFromHTML = this.messageInput.innerHTML;\n }\n }\n }\n };\n\n private onMessageInput = (e?: Event) => {\n // * validate due to manual formatting through browser's context menu\n /* const inputType = (e as InputEvent).inputType;\n console.log('message input event', e);\n if(inputType === 'formatBold') {\n console.log('message input format', this.messageInput.innerHTML);\n cancelEvent(e);\n }\n\n if(!isSelectionSingle()) {\n alert('not single');\n } */\n\n // console.log('messageInput input', this.messageInput.innerText);\n // const value = this.messageInput.innerText;\n const {value: richValue, entities: markdownEntities, caretPos} = getRichValueWithCaret(this.messageInputField.input);\n\n // const entities = parseEntities(value);\n const value = parseMarkdown(richValue, markdownEntities, true);\n const entities = mergeEntities(markdownEntities, parseEntities(value));\n\n // this.chat.log('messageInput entities', richValue, value, markdownEntities, caretPos);\n\n if(this.canRedoFromHTML && !this.lockRedo && this.messageInput.innerHTML !== this.canRedoFromHTML) {\n this.canRedoFromHTML = '';\n this.undoHistory.length = 0;\n }\n\n const urlEntities: Array = (!this.editMessage?.media || this.editMessage.media._ === 'messageMediaWebPage') && entities.filter((e) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') as any;\n if(urlEntities.length) {\n for(const entity of urlEntities) {\n let url: string;\n if(entity._ === 'messageEntityTextUrl') {\n url = entity.url;\n } else {\n url = richValue.slice(entity.offset, entity.offset + entity.length);\n\n if(!(url.includes('http://') || url.includes('https://'))) {\n continue;\n }\n }\n\n // console.log('messageInput url:', url);\n\n if(this.lastUrl !== url) {\n this.lastUrl = url;\n // this.willSendWebPage = null;\n const promise = this.getWebPagePromise = this.managers.appWebPagesManager.getWebPage(url).then((webpage) => {\n if(this.getWebPagePromise === promise) this.getWebPagePromise = undefined;\n if(this.lastUrl !== url) return;\n if(webpage._ === 'webPage') {\n // console.log('got webpage: ', webpage);\n\n this.setTopInfo('webpage', () => {}, webpage.site_name || webpage.title || 'Webpage', webpage.description || webpage.url || '');\n delete this.noWebPage;\n this.willSendWebPage = webpage;\n } else if(this.willSendWebPage) {\n this.onHelperCancel();\n }\n });\n }\n\n break;\n }\n } else if(this.lastUrl) {\n this.lastUrl = '';\n delete this.noWebPage;\n this.willSendWebPage = null;\n\n if(this.helperType) {\n this.helperFunc();\n } else {\n this.clearHelper();\n }\n }\n\n const isEmpty = !richValue.trim();\n if(isEmpty) {\n if(this.lastTimeType) {\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageCancelAction'}, undefined, this.chat.threadId);\n }\n\n if(this.appImManager.markupTooltip) {\n this.appImManager.markupTooltip.hide();\n }\n\n // * Chrome has a bug - it will preserve the formatting if the input with monospace text is cleared\n // * so have to reset formatting\n if(document.activeElement === this.messageInput) {\n // document.execCommand('styleWithCSS', false, 'true');\n setTimeout(() => {\n if(document.activeElement === this.messageInput) {\n this.resetCurrentFontFormatting();\n }\n }, 0);\n // document.execCommand('styleWithCSS', false, 'false');\n }\n } else {\n const time = Date.now();\n if((time - this.lastTimeType) >= 6000) {\n this.lastTimeType = time;\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageTypingAction'}, undefined, this.chat.threadId);\n }\n\n if(this.botCommands) {\n this.botCommands.toggle(true);\n }\n }\n\n if(this.botCommands) {\n this.updateBotCommandsToggle();\n }\n\n if(!this.editMsgId) {\n this.saveDraftDebounced();\n }\n\n this.checkAutocomplete(richValue, caretPos, entities);\n\n this.updateSendBtn();\n };\n\n public insertAtCaret(insertText: string, insertEntity?: MessageEntity, isHelper = true) {\n RichInputHandler.getInstance().makeFocused(this.messageInput);\n\n const {value: fullValue, caretPos, entities} = getRichValueWithCaret(this.messageInput);\n const pos = caretPos >= 0 ? caretPos : fullValue.length;\n const prefix = fullValue.substr(0, pos);\n const suffix = fullValue.substr(pos);\n\n const matches = isHelper ? prefix.match(ChatInput.AUTO_COMPLETE_REG_EXP) : null;\n\n const matchIndex = matches ? matches.index + (matches[0].length - matches[2].length) : prefix.length;\n const newPrefix = prefix.slice(0, matchIndex);\n const newValue = newPrefix + insertText + suffix;\n\n if(isHelper && caretPos !== -1) {\n const match = matches[2];\n // const {node, selection} = getCaretPosNew(this.messageInput);\n\n const selection = document.getSelection();\n // const range = document.createRange();\n let counter = 0;\n while(selection.toString() !== match) {\n if(++counter >= 10000) {\n throw new Error('lolwhat');\n }\n\n // for(let i = 0; i < match.length; ++i) {\n selection.modify('extend', 'backward', 'character');\n }\n }\n\n {\n // const fragment = wrapDraftText(insertText, {entities: insertEntity ? [insertEntity] : undefined, wrappingForPeerId: this.chat.peerId});\n insertRichTextAsHTML(this.messageInput, insertText, insertEntity ? [insertEntity] : undefined, this.chat.peerId);\n // const {node, offset} = getCaretPos(this.messageInput);\n // const fragmentLastChild = fragment.lastChild;\n // if(node?.nodeType === node.TEXT_NODE) {\n // const prefix = node.nodeValue.slice(0, offset);\n // const suffix = node.nodeValue.slice(offset);\n\n // const suffixNode = document.createTextNode(suffix);\n\n // node.nodeValue = prefix;\n // node.parentNode.insertBefore(suffixNode, node.nextSibling);\n // node.parentNode.insertBefore(fragment, suffixNode);\n\n // setCaretAt(fragmentLastChild.nextSibling);\n\n // this.messageInputField.simulateInputEvent();\n // }\n }\n return;\n\n // merge emojis\n const hadEntities = parseEntities(fullValue);\n mergeEntities(entities, hadEntities);\n\n // max for additional whitespace\n const insertLength = insertEntity ? Math.max(insertEntity.length, insertText.length) : insertText.length;\n const addEntities: MessageEntity[] = [];\n if(insertEntity) {\n addEntities.push(insertEntity);\n insertEntity.offset = matchIndex;\n }\n\n // add offset to entities next to emoji\n const diff = matches ? insertLength - matches[2].length : insertLength;\n entities.forEach((entity) => {\n if(entity.offset >= matchIndex) {\n entity.offset += diff;\n }\n });\n\n mergeEntities(entities, addEntities);\n\n if(/* caretPos !== -1 && caretPos !== fullValue.length */true) {\n const caretEntity: MessageEntity.messageEntityCaret = {\n _: 'messageEntityCaret',\n offset: matchIndex + insertLength,\n length: 0\n };\n\n let insertCaretAtIndex = 0;\n for(let length = entities.length; insertCaretAtIndex < length; ++insertCaretAtIndex) {\n const entity = entities[insertCaretAtIndex];\n if(entity.offset > caretEntity.offset) {\n break;\n }\n }\n\n entities.splice(insertCaretAtIndex, 0, caretEntity);\n }\n\n // const saveExecuted = this.prepareDocumentExecute();\n // can't exec .value here because it will instantly check for autocomplete\n const value = documentFragmentToHTML(wrapDraftText(newValue, {entities}));\n this.messageInputField.setValueSilently(value);\n\n const caret = this.messageInput.querySelector('.composer-sel');\n if(caret) {\n setCaretAt(caret);\n caret.remove();\n }\n\n // but it's needed to be checked only here\n this.onMessageInput();\n\n // saveExecuted();\n\n // document.execCommand('insertHTML', true, wrapEmojiText(emoji));\n }\n\n public onEmojiSelected = (emoji: ReturnType, autocomplete: boolean) => {\n const entity: MessageEntity = emoji.docId ? {_: 'messageEntityCustomEmoji', document_id: emoji.docId, length: emoji.emoji.length, offset: 0} : getEmojiEntityFromEmoji(emoji.emoji);\n this.insertAtCaret(emoji.emoji, entity, autocomplete);\n };\n\n private async checkAutocomplete(value?: string, caretPos?: number, entities?: MessageEntity[]) {\n // return;\n\n if(value === undefined) {\n const r = getRichValueWithCaret(this.messageInputField.input, true, true);\n value = r.value;\n caretPos = r.caretPos;\n entities = r.entities;\n }\n\n if(caretPos === -1) {\n caretPos = value.length;\n }\n\n if(entities === undefined) {\n const _value = parseMarkdown(value, entities, true);\n entities = mergeEntities(entities, parseEntities(_value));\n }\n\n value = value.slice(0, caretPos);\n\n if(this.previousQuery === value) {\n return;\n }\n\n this.previousQuery = value;\n\n const matches = value.match(ChatInput.AUTO_COMPLETE_REG_EXP);\n let foundHelper: AutocompleteHelper;\n if(matches) {\n const entity = entities[0];\n\n let query = matches[2];\n const firstChar = query[0];\n\n if(this.stickersHelper &&\n rootScope.settings.stickers.suggest &&\n await this.chat.canSend('send_stickers') &&\n entity?._ === 'messageEntityEmoji' && entity.length === value.length && !entity.offset) {\n foundHelper = this.stickersHelper;\n this.stickersHelper.checkEmoticon(value);\n } else if(firstChar === '@') { // mentions\n const topMsgId = this.chat.threadId ? getServerMessageId(this.chat.threadId) : undefined;\n if(await this.mentionsHelper.checkQuery(query, this.chat.peerId.isUser() ? NULL_PEER_ID : this.chat.peerId, topMsgId)) {\n foundHelper = this.mentionsHelper;\n }\n } else if(!matches[1] && firstChar === '/') { // commands\n if(await this.commandsHelper.checkQuery(query, this.chat.peerId)) {\n foundHelper = this.commandsHelper;\n }\n } else if(rootScope.settings.emoji.suggest) { // emoji\n query = query.replace(/^\\s*/, '');\n if(!value.match(/^\\s*:(.+):\\s*$/) && !value.match(/:[;!@#$%^&*()-=|]/) && query) {\n foundHelper = this.emojiHelper;\n this.emojiHelper.checkQuery(query, firstChar);\n }\n }\n }\n\n foundHelper = this.checkInlineAutocomplete(value, foundHelper);\n\n this.autocompleteHelperController.hideOtherHelpers(foundHelper);\n }\n\n private checkInlineAutocomplete(value: string, foundHelper?: AutocompleteHelper): AutocompleteHelper {\n let needPlaceholder = false;\n\n const setPreloaderShow = (show: boolean) => {\n if(!this.btnPreloader) {\n return;\n }\n\n SetTransition({\n element: this.btnPreloader,\n className: 'show',\n forwards: show,\n duration: 400\n });\n };\n\n if(!foundHelper) {\n const inlineMatch = value.match(/^@([a-zA-Z\\\\d_]{3,32})\\s/);\n if(inlineMatch) {\n const username = inlineMatch[1];\n const query = value.slice(inlineMatch[0].length);\n needPlaceholder = inlineMatch[0].length === value.length;\n\n foundHelper = this.inlineHelper;\n\n if(!this.btnPreloader) {\n this.btnPreloader = ButtonIcon('none btn-preloader float show disable-hover', {noRipple: true});\n putPreloader(this.btnPreloader, true);\n this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader, this.inputMessageContainer.nextSibling);\n } else {\n setPreloaderShow(true);\n }\n\n this.inlineHelper.checkQuery(this.chat.peerId, username, query).then(({user, renderPromise}) => {\n if(needPlaceholder && user.bot_inline_placeholder) {\n this.messageInput.dataset.inlinePlaceholder = user.bot_inline_placeholder;\n }\n\n renderPromise.then(() => {\n setPreloaderShow(false);\n });\n }).catch((err: ApiError) => {\n setPreloaderShow(false);\n });\n }\n }\n\n if(!needPlaceholder) {\n delete this.messageInput.dataset.inlinePlaceholder;\n }\n\n if(foundHelper !== this.inlineHelper) {\n setPreloaderShow(false);\n }\n\n return foundHelper;\n }\n\n private setRecording(value: boolean) {\n if(this.recording === value) {\n return;\n }\n\n SetTransition({\n element: this.chatInput,\n className: 'is-recording',\n forwards: value,\n duration: 200\n });\n this.recording = value;\n this.updateSendBtn();\n }\n\n private onBtnSendClick = async(e: Event) => {\n cancelEvent(e);\n\n if(!this.recorder || this.recording || !this.isInputEmpty() || this.forwarding || this.editMsgId) {\n if(this.recording) {\n if((Date.now() - this.recordStartTime) < RECORD_MIN_TIME) {\n this.onCancelRecordClick();\n } else {\n this.recorder.stop();\n }\n } else {\n this.sendMessage();\n }\n } else {\n const isAnyChat = this.chat.peerId.isAnyChat();\n if(isAnyChat && !(await this.chat.canSend('send_media'))) {\n toast(POSTING_MEDIA_NOT_ALLOWED);\n return;\n }\n\n this.chatInput.classList.add('is-locked');\n blurActiveElement();\n\n let restricted = false;\n if(!isAnyChat) {\n const userFull = await this.managers.appProfileManager.getProfile(this.chat.peerId.toUserId());\n if(userFull?.pFlags.voice_messages_forbidden) {\n toastNew({\n langPackKey: 'Chat.SendVoice.PrivacyError',\n langPackArguments: [await wrapPeerTitle({peerId: this.chat.peerId})]\n });\n restricted = true;\n }\n }\n\n if(restricted) {\n this.chatInput.classList.remove('is-locked');\n return;\n }\n\n this.recorder.start().then(() => {\n this.releaseMediaPlayback = appMediaPlaybackController.setSingleMedia();\n this.recordCanceled = false;\n\n this.setRecording(true);\n opusDecodeController.setKeepAlive(true);\n\n const showDiscardPopup = () => {\n new PopupPeer('popup-cancel-record', {\n titleLangKey: 'DiscardVoiceMessageTitle',\n descriptionLangKey: 'DiscardVoiceMessageDescription',\n buttons: [{\n langKey: 'DiscardVoiceMessageAction',\n callback: () => {\n simulateClickEvent(this.btnCancelRecord);\n }\n }, {\n langKey: 'Continue',\n isCancel: true\n }]\n }).show();\n };\n\n this.recordingOverlayListener = this.listenerSetter.add(document.body)('mousedown', (e) => {\n if(!findUpClassName(e.target, 'chat-input') && !findUpClassName(e.target, 'popup-cancel-record')) {\n cancelEvent(e);\n showDiscardPopup();\n }\n }, {capture: true, passive: false}) as any;\n\n appNavigationController.pushItem(this.recordingNavigationItem = {\n type: 'voice',\n onPop: () => {\n setTimeout(() => {\n showDiscardPopup();\n }, 0);\n\n return false;\n }\n });\n\n this.recordStartTime = Date.now();\n\n const sourceNode: MediaStreamAudioSourceNode = this.recorder.sourceNode;\n const context = sourceNode.context;\n\n const analyser = context.createAnalyser();\n sourceNode.connect(analyser);\n // analyser.connect(context.destination);\n analyser.fftSize = 32;\n\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\n const max = frequencyData.length * 255;\n const min = 54 / 150;\n const r = () => {\n if(!this.recording) return;\n\n analyser.getByteFrequencyData(frequencyData);\n\n let sum = 0;\n frequencyData.forEach((value) => {\n sum += value;\n });\n\n const percents = Math.min(1, (sum / max) + min);\n // console.log('frequencyData', frequencyData, percents);\n\n this.recordRippleEl.style.transform = `scale(${percents})`;\n\n const diff = Date.now() - this.recordStartTime;\n const ms = diff % 1000;\n\n const formatted = toHHMMSS(diff / 1000) + ',' + ('00' + Math.round(ms / 10)).slice(-2);\n\n this.recordTimeEl.innerText = formatted;\n\n fastRaf(r);\n };\n\n r();\n }).catch((e: Error) => {\n switch(e.name as string) {\n case 'NotAllowedError': {\n toast('Please allow access to your microphone');\n break;\n }\n\n case 'NotReadableError': {\n toast(e.message);\n break;\n }\n\n default:\n console.error('Recorder start error:', e, e.name, e.message);\n toast(e.message);\n break;\n }\n\n this.setRecording(false);\n this.chatInput.classList.remove('is-locked');\n });\n }\n };\n\n private onHelperCancel = async(e?: Event, force?: boolean) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.willSendWebPage) {\n const lastUrl = this.lastUrl;\n let needReturn = false;\n if(this.helperType) {\n // if(this.helperFunc) {\n await this.helperFunc();\n // }\n\n needReturn = true;\n }\n\n // * restore values\n this.lastUrl = lastUrl;\n this.noWebPage = true;\n this.willSendWebPage = null;\n\n if(needReturn) return;\n }\n\n if(this.helperType === 'edit' && !force) {\n const message = this.editMessage;\n const draft = this.getCurrentInputAsDraft();\n if(draft) {\n delete draft.pFlags.no_webpage;\n }\n // const value = parseMarkdown(this.messageInputField.value, []);\n // if(message.message !== value) {\n if(!draftsAreEqual(draft, {...message, _: 'draftMessage'} as any)) {\n new PopupPeer('discard-editing', {\n buttons: [{\n langKey: 'Alert.Confirm.Discard',\n callback: () => {\n this.onHelperCancel(undefined, true);\n }\n }],\n descriptionLangKey: 'Chat.Edit.Cancel.Text'\n }).show();\n\n return;\n }\n }\n\n this.clearHelper();\n this.updateSendBtn();\n };\n\n private onHelperClick = (e: Event) => {\n cancelEvent(e);\n\n if(!findUpClassName(e.target, 'reply')) return;\n if(this.helperType === 'forward') {\n const {forwardElements} = this;\n if(forwardElements && IS_TOUCH_SUPPORTED && !forwardElements.container.classList.contains('active')) {\n contextMenuController.openBtnMenu(forwardElements.container);\n }\n } else if(this.helperType === 'reply') {\n this.chat.setMessageId(this.replyToMsgId);\n } else if(this.helperType === 'edit') {\n this.chat.setMessageId(this.editMsgId);\n }\n };\n\n private changeForwardRecipient() {\n if(this.helperWaitingForward) return;\n this.helperWaitingForward = true;\n\n const forwarding = copy(this.forwarding);\n const helperFunc = this.helperFunc;\n this.clearHelper();\n this.updateSendBtn();\n let selected = false;\n const popup = new PopupForward(forwarding, () => {\n selected = true;\n });\n\n popup.addEventListener('close', () => {\n this.helperWaitingForward = false;\n\n if(!selected) {\n helperFunc();\n }\n });\n }\n\n public async clearInput(canSetDraft = true, fireEvent = true, clearValue = '') {\n if(document.activeElement === this.messageInput && IS_MOBILE_SAFARI) { // fix first char uppercase\n const i = document.createElement('input');\n document.body.append(i);\n fixSafariStickyInput(i);\n this.messageInputField.setValueSilently(clearValue);\n fixSafariStickyInput(this.messageInput);\n i.remove();\n } else {\n this.messageInputField.setValueSilently(clearValue);\n }\n\n if(IS_TOUCH_SUPPORTED) {\n // this.messageInput.innerText = '';\n } else {\n // this.attachMessageInputField();\n // this.messageInput.innerText = '';\n\n // clear executions\n this.canRedoFromHTML = '';\n this.undoHistory.length = 0;\n this.executedHistory.length = 0;\n this.canUndoFromHTML = '';\n }\n\n let set = false;\n if(canSetDraft) {\n set = await this.setDraft(undefined, false);\n }\n\n if(!set && fireEvent) {\n this.onMessageInput();\n }\n }\n\n public isInputEmpty() {\n return isInputEmpty(this.messageInput);\n }\n\n public updateSendBtn() {\n let icon: 'send' | 'record' | 'edit' | 'schedule';\n\n const isInputEmpty = this.isInputEmpty();\n\n if(this.editMsgId) icon = 'edit';\n else if(!this.recorder || this.recording || !isInputEmpty || this.forwarding) icon = this.chat.type === 'scheduled' ? 'schedule' : 'send';\n else icon = 'record';\n\n ['send', 'record', 'edit', 'schedule'].forEach((i) => {\n this.btnSend.classList.toggle(i, icon === i);\n });\n\n if(this.btnScheduled) {\n this.btnScheduled.classList.toggle('show', isInputEmpty && this.chat.type !== 'scheduled');\n }\n\n if(this.btnToggleReplyMarkup) {\n this.btnToggleReplyMarkup.classList.toggle('show', isInputEmpty && this.chat.type !== 'scheduled');\n }\n }\n\n private getValueAndEntities(input: HTMLElement) {\n const {entities: apiEntities, value} = getRichValueWithCaret(this.messageInput, true, false);\n const myEntities = parseEntities(value);\n const totalEntities = mergeEntities(apiEntities, myEntities);\n\n return {value, totalEntities};\n }\n\n public onMessageSent(clearInput = true, clearReply?: boolean) {\n if(this.chat.type !== 'scheduled') {\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId, true);\n }\n\n this.scheduleDate = undefined;\n this.sendSilent = undefined;\n\n const {totalEntities} = this.getValueAndEntities(this.messageInput);\n let nextOffset = 0;\n const emojiEntities: (MessageEntity.messageEntityEmoji | MessageEntity.messageEntityCustomEmoji)[] = totalEntities.filter((entity) => {\n if(entity._ === 'messageEntityEmoji' || entity._ === 'messageEntityCustomEmoji') {\n const endOffset = entity.offset + entity.length;\n return endOffset <= nextOffset ? false : (nextOffset = endOffset, true);\n }\n\n return false;\n }) as any;\n emojiEntities.forEach((entity) => {\n const emoji: AppEmoji = entity._ === 'messageEntityEmoji' ? {emoji: emojiFromCodePoints(entity.unicode)} : {docId: entity.document_id, emoji: ''};\n this.managers.appEmojiManager.pushRecentEmoji(emoji);\n });\n\n if(clearInput) {\n this.lastUrl = '';\n delete this.noWebPage;\n this.willSendWebPage = null;\n this.clearInput();\n }\n\n if(clearReply || clearInput) {\n this.clearHelper();\n }\n\n this.updateSendBtn();\n }\n\n public sendMessage(force = false) {\n const {editMsgId, chat} = this;\n if(chat.type === 'scheduled' && !force && !editMsgId) {\n this.scheduleSending();\n return;\n }\n\n const {peerId} = chat;\n const {noWebPage} = this;\n const sendingParams = this.chat.getMessageSendingParams();\n\n const {value, entities} = getRichValueWithCaret(this.messageInputField.input, true, false);\n\n // return;\n if(editMsgId) {\n const message = this.editMessage;\n if(value.trim() || message.media) {\n this.managers.appMessagesManager.editMessage(message, value, {\n entities,\n noWebPage: noWebPage\n });\n\n this.onMessageSent();\n } else {\n new PopupDeleteMessages(peerId, [editMsgId], chat.type);\n\n return;\n }\n } else if(value.trim()) {\n this.managers.appMessagesManager.sendText(peerId, value, {\n entities,\n ...sendingParams,\n noWebPage: noWebPage,\n webPage: this.getWebPagePromise ? undefined : this.willSendWebPage,\n clearDraft: true\n });\n\n if(this.chat.type === 'scheduled') {\n this.onMessageSent(true);\n } else {\n this.onMessageSent(false, false);\n }\n // this.onMessageSent();\n }\n\n // * wait for sendText set messageId for invokeAfterMsg\n if(this.forwarding) {\n const forwarding = copy(this.forwarding);\n // setTimeout(() => {\n for(const fromPeerId in forwarding) {\n this.managers.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), forwarding[fromPeerId], {\n ...sendingParams,\n dropAuthor: this.forwardElements && this.forwardElements.hideSender.checkboxField.checked,\n dropCaptions: this.isDroppingCaptions()\n }).catch(async(err: ApiError) => {\n if(err.type === 'VOICE_MESSAGES_FORBIDDEN') {\n toastNew({\n langPackKey: 'Chat.SendVoice.PrivacyError',\n langPackArguments: [await wrapPeerTitle({peerId})]\n });\n }\n });\n }\n\n if(!value) {\n this.onMessageSent();\n }\n // }, 0);\n }\n\n // this.onMessageSent();\n }\n\n public async sendMessageWithDocument(\n document: MyDocument | DocId,\n force = false,\n clearDraft = false,\n silent = false\n ) {\n document = await this.managers.appDocsManager.getDoc(document);\n\n const flag = document.type === 'sticker' ? 'send_stickers' : (document.type === 'gif' ? 'send_gifs' : 'send_media');\n if(this.chat.peerId.isAnyChat() && !(await this.chat.canSend(flag))) {\n toast(POSTING_MEDIA_NOT_ALLOWED);\n return false;\n }\n\n if(this.chat.type === 'scheduled' && !force) {\n this.scheduleSending(() => this.sendMessageWithDocument(document, true, clearDraft, silent));\n return false;\n }\n\n if(!document) {\n return false;\n }\n\n if(document.sticker && getStickerEffectThumb(document) && !rootScope.premium) {\n return false;\n }\n\n this.managers.appMessagesManager.sendFile(this.chat.peerId, {\n ...this.chat.getMessageSendingParams(),\n file: document,\n isMedia: true,\n clearDraft,\n silent\n });\n this.onMessageSent(clearDraft, true);\n\n if(document.type === 'sticker') {\n this.managers.appStickersManager.saveRecentSticker(document.id);\n }\n\n return true;\n }\n\n private canToggleHideAuthor() {\n const {forwardElements} = this;\n if(!forwardElements) return false;\n const hideCaptionCheckboxField = forwardElements.hideCaption.checkboxField;\n return !hideCaptionCheckboxField.checked ||\n findUpTag(hideCaptionCheckboxField.label, 'FORM').classList.contains('hide');\n }\n\n private isDroppingCaptions() {\n return !this.canToggleHideAuthor();\n }\n\n /* public sendSomething(callback: () => void, force = false) {\n if(this.chat.type === 'scheduled' && !force) {\n this.scheduleSending(() => this.sendSomething(callback, true));\n return false;\n }\n\n callback();\n this.onMessageSent(false, true);\n\n return true;\n } */\n\n public async initMessageEditing(mid: number) {\n const message = (await this.chat.getMessage(mid)) as Message.message;\n\n let input = wrapDraftText(message.message, {entities: message.totalEntities, wrappingForPeerId: this.chat.peerId});\n const f = async() => {\n const replyFragment = await wrapMessageForReply({message, usingMids: [message.mid]});\n this.setTopInfo('edit', f, i18n('AccDescrEditing'), replyFragment, input, message);\n\n this.editMsgId = mid;\n this.editMessage = message;\n input = undefined;\n };\n f();\n }\n\n public initMessagesForward(fromPeerIdsMids: {[fromPeerId: PeerId]: number[]}) {\n const f = async() => {\n // const peerTitles: string[]\n const fromPeerIds = Object.keys(fromPeerIdsMids).map((fromPeerId) => fromPeerId.toPeerId());\n const smth: Set = new Set();\n let length = 0, messagesWithCaptionsLength = 0;\n\n const p = fromPeerIds.map(async(fromPeerId) => {\n const mids = fromPeerIdsMids[fromPeerId];\n const promises = mids.map(async(mid) => {\n const message = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mid)) as Message.message;\n if(message.fwd_from?.from_name && !message.fromId && !message.fwdFromId) {\n smth.add('N' + message.fwd_from.from_name);\n } else {\n smth.add('P' + message.fromId);\n }\n\n if(message.media && message.message) {\n ++messagesWithCaptionsLength;\n }\n });\n\n await Promise.all(promises);\n\n length += mids.length;\n });\n\n await Promise.all(p);\n\n const onlyFirstName = smth.size > 2;\n const peerTitles = [...smth].map((smth) => {\n const type = smth[0];\n smth = smth.slice(1);\n if(type === 'P') {\n const peerId = smth.toPeerId();\n return peerId === rootScope.myId ? i18n('Chat.Accessory.Forward.You') : new PeerTitle({peerId, dialog: false, onlyFirstName}).element;\n } else {\n return onlyFirstName ? smth.split(' ')[0] : smth;\n }\n });\n\n const {forwardElements} = this;\n const form = findUpTag(forwardElements.showCaption.checkboxField.label, 'FORM');\n form.classList.toggle('hide', !messagesWithCaptionsLength);\n const hideCaption = forwardElements.hideCaption.checkboxField.checked;\n if(messagesWithCaptionsLength && hideCaption) {\n forwardElements.hideSender.checkboxField.setValueSilently(true);\n } else if(this.forwardWasDroppingAuthor !== undefined) {\n (this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender).checkboxField.setValueSilently(true);\n }\n\n const titleKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\n const title = i18n(titleKey, [length]);\n\n const senderTitles = document.createDocumentFragment();\n if(peerTitles.length < 3) {\n senderTitles.append(...join(peerTitles, false));\n } else {\n senderTitles.append(peerTitles[0], i18n('AndOther', [peerTitles.length - 1]));\n }\n\n let firstMessage: Message.message, usingFullAlbum: boolean;\n if(fromPeerIds.length === 1) {\n const fromPeerId = fromPeerIds[0];\n const mids = fromPeerIdsMids[fromPeerId];\n firstMessage = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mids[0])) as Message.message;\n\n usingFullAlbum = !!firstMessage.grouped_id;\n if(usingFullAlbum) {\n const albumMids = await this.managers.appMessagesManager.getMidsByMessage(firstMessage);\n if(albumMids.length !== length || albumMids.find((mid) => !mids.includes(mid))) {\n usingFullAlbum = false;\n }\n }\n }\n\n const subtitleFragment = document.createDocumentFragment();\n const delimiter = ': ';\n if(usingFullAlbum || length === 1) {\n const mids = fromPeerIdsMids[fromPeerIds[0]];\n const replyFragment = await wrapMessageForReply({message: firstMessage, usingMids: mids});\n subtitleFragment.append(\n senderTitles,\n delimiter,\n replyFragment\n );\n } else {\n subtitleFragment.append(\n i18n('Chat.Accessory.Forward.From'),\n delimiter,\n senderTitles\n );\n }\n\n const newReply = this.setTopInfo('forward', f, title, subtitleFragment);\n\n forwardElements.modifyArgs.forEach((b, idx) => {\n const text = b.textElement;\n const intl: I18n.IntlElement = I18n.weakMap.get(text) as any;\n intl.args = [idx < 2 ? fromPeerIds.length : messagesWithCaptionsLength];\n intl.update();\n });\n\n if(this.forwardHover) {\n this.forwardHover.attachButtonListener(newReply, this.listenerSetter);\n }\n\n this.forwarding = fromPeerIdsMids;\n };\n\n f();\n }\n\n public async initMessageReply(mid: number) {\n if(this.replyToMsgId === mid) {\n return;\n }\n\n let message = await this.chat.getMessage(mid);\n const f = () => {\n let peerTitleEl: HTMLElement;\n if(!message) { // load missing replying message\n peerTitleEl = i18n('Loading');\n\n this.managers.appMessagesManager.reloadMessages(this.chat.peerId, mid).then((_message) => {\n if(this.replyToMsgId !== mid) {\n return;\n }\n\n message = _message;\n if(!message) {\n this.clearHelper('reply');\n } else {\n f();\n }\n });\n } else {\n peerTitleEl = new PeerTitle({\n peerId: message.fromId,\n dialog: false\n }).element;\n }\n\n this.setTopInfo('reply', f, peerTitleEl, message && (message as Message.message).message, undefined, message);\n this.setReplyToMsgId(mid)\n };\n f();\n }\n\n public setReplyToMsgId(mid: number) {\n this.replyToMsgId = mid;\n this.center(true);\n }\n\n public clearHelper(type?: ChatInputHelperType) {\n if(this.helperType === 'edit' && type !== 'edit') {\n this.clearInput();\n }\n\n if(type) {\n this.lastUrl = '';\n delete this.noWebPage;\n this.willSendWebPage = null;\n }\n\n if(type !== 'reply') {\n this.setReplyToMsgId(undefined);\n this.forwarding = undefined;\n }\n\n this.editMsgId = this.editMessage = undefined;\n this.helperType = this.helperFunc = undefined;\n\n if(this.chat.container.classList.contains('is-helper-active')) {\n appNavigationController.removeByType('input-helper');\n this.chat.container.classList.remove('is-helper-active');\n this.t();\n }\n }\n\n private t() {\n const className = 'is-toggling-helper';\n SetTransition({\n element: this.chat.container,\n className,\n forwards: true,\n duration: 150,\n onTransitionEnd: () => {\n this.chat.container.classList.remove(className);\n }\n });\n }\n\n public setInputValue(value: Parameters[0], clear = true, focus = true) {\n if(!value) value = '';\n\n if(clear) this.clearInput(false, false, value as string);\n else this.messageInputField.setValueSilently(value);\n\n fastRaf(() => {\n focus && placeCaretAtEnd(this.messageInput);\n this.onMessageInput();\n this.messageInput.scrollTop = this.messageInput.scrollHeight;\n });\n }\n\n public setTopInfo(\n type: ChatInputHelperType,\n callerFunc: () => void,\n title: Parameters[0] = '',\n subtitle: Parameters[1] = '',\n input?: Parameters[0],\n message?: any\n ) {\n if(this.willSendWebPage && type === 'reply') {\n return;\n }\n\n if(type !== 'webpage') {\n this.clearHelper(type);\n this.helperType = type;\n this.helperFunc = callerFunc;\n }\n\n const replyParent = this.replyElements.container;\n const oldReply = replyParent.lastElementChild.previousElementSibling;\n const haveReply = oldReply.classList.contains('reply');\n\n this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn = ButtonIcon((type === 'webpage' ? 'link' : type) + ' active reply-icon', {noRipple: true}));\n const {container} = wrapReply(title, subtitle, this.chat.animationGroup, message);\n if(haveReply) {\n oldReply.replaceWith(container);\n } else {\n replyParent.insertBefore(container, replyParent.lastElementChild);\n }\n\n if(type === 'webpage') {\n container.style.cursor = 'default';\n }\n\n if(!this.chat.container.classList.contains('is-helper-active')) {\n this.chat.container.classList.add('is-helper-active');\n this.t();\n }\n\n /* const scroll = appImManager.scrollable;\n if(scroll.isScrolledDown && !scroll.scrollLocked && !appImManager.messagesQueuePromise && !appImManager.setPeerPromise) {\n scroll.scrollTo(scroll.scrollHeight, 'top', true, true, 200);\n } */\n\n if(!IS_MOBILE) {\n appNavigationController.pushItem({\n type: 'input-helper',\n onPop: () => {\n this.onHelperCancel();\n }\n });\n }\n\n if(input !== undefined) {\n this.setInputValue(input);\n }\n\n setTimeout(() => {\n this.updateSendBtn();\n }, 0);\n\n return container;\n }\n\n // public saveScroll() {\n // this.scrollTop = this.chat.bubbles.scrollable.container.scrollTop;\n // this.scrollOffsetTop = this.chatInput.offsetTop;\n // }\n\n // public restoreScroll() {\n // if(this.chatInput.style.display) return;\n // //console.log('input resize', offsetTop, this.chatInput.offsetTop);\n // let newOffsetTop = this.chatInput.offsetTop;\n // let container = this.chat.bubbles.scrollable.container;\n // let scrollTop = container.scrollTop;\n // let clientHeight = container.clientHeight;\n // let maxScrollTop = container.scrollHeight;\n\n // if(newOffsetTop < this.scrollOffsetTop) {\n // this.scrollDiff = this.scrollOffsetTop - newOffsetTop;\n // container.scrollTop += this.scrollDiff;\n // } else if(scrollTop !== this.scrollTop) {\n // let endDiff = maxScrollTop - (scrollTop + clientHeight);\n // if(endDiff < this.scrollDiff/* && false */) {\n // //container.scrollTop -= endDiff;\n // } else {\n // container.scrollTop -= this.scrollDiff;\n // }\n // }\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {DraftMessage} from '../../layer';\nimport mergeEntities from '../../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../../lib/richTextProcessor/parseEntities';\nimport wrapDraftText from '../../lib/richTextProcessor/wrapDraftText';\n\nexport default function wrapDraft(draft: DraftMessage.draftMessage, wrappingForPeerId: PeerId, loadPromises?: Promise[]) {\n const myEntities = parseEntities(draft.message);\n const apiEntities = draft.entities || [];\n const totalEntities = mergeEntities(apiEntities.slice(), myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n\n return wrapDraftText(draft.message, {entities: totalEntities, wrappingForPeerId, loadPromises});\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from './chat';\nimport type ChatTopbar from './topbar';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport DivAndCaption from '../divAndCaption';\nimport ripple from '../ripple';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {Message} from '../../layer';\nimport safeAssign from '../../helpers/object/safeAssign';\n\nconst classNames: string[] = ['is-pinned-message-shown', 'is-pinned-audio-shown'];\nconst CLASSNAME_BASE = 'pinned-container';\nconst HEIGHT = 52;\n\nexport default class PinnedContainer {\n public wrapperUtils: HTMLElement;\n public btnClose: HTMLElement;\n protected wrapper: HTMLElement;\n\n protected topbar: ChatTopbar;\n protected chat: Chat;\n protected listenerSetter: ListenerSetter;\n public className: string;\n public divAndCaption: DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void>;\n\n protected floating = false;\n\n public onClose?: () => void | Promise;\n\n constructor(options: {\n topbar: PinnedContainer['topbar'],\n chat: PinnedContainer['chat'],\n listenerSetter: PinnedContainer['listenerSetter'],\n className: PinnedContainer['className'],\n divAndCaption: PinnedContainer['divAndCaption'],\n onClose?: PinnedContainer['onClose'],\n floating?: PinnedContainer['floating']\n }) {\n safeAssign(this, options);\n\n const {divAndCaption, className} = this;\n divAndCaption.container.classList.add(CLASSNAME_BASE, 'hide');\n divAndCaption.title.classList.add(CLASSNAME_BASE + '-title');\n divAndCaption.subtitle.classList.add(CLASSNAME_BASE + '-subtitle');\n divAndCaption.content.classList.add(CLASSNAME_BASE + '-content');\n\n this.btnClose = document.createElement('button');\n this.btnClose.classList.add(CLASSNAME_BASE + '-close', `pinned-${className}-close`, 'btn-icon', 'tgico-close');\n\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add(CLASSNAME_BASE + '-wrapper');\n ripple(this.wrapper);\n\n this.wrapperUtils = document.createElement('div');\n this.wrapperUtils.classList.add(CLASSNAME_BASE + '-wrapper-utils');\n this.wrapperUtils.append(this.btnClose);\n\n this.wrapper.append(...Array.from(divAndCaption.container.children), this.wrapperUtils);\n\n divAndCaption.container.append(this.wrapper/* , this.close */);\n\n this.attachOnCloseEvent(this.btnClose);\n }\n\n public attachOnCloseEvent(elem: HTMLElement) {\n attachClickEvent(elem, (e) => {\n cancelEvent(e);\n\n ((this.onClose ? this.onClose() : null) || Promise.resolve(true)).then((needClose) => {\n if(needClose) {\n this.toggle(true);\n }\n });\n }, {listenerSetter: this.listenerSetter});\n }\n\n public toggle(hide?: boolean) {\n const isHidden = this.divAndCaption.container.classList.contains('hide');\n if(hide === undefined) {\n hide = !isHidden;\n } else if(hide === isHidden) {\n return;\n }\n\n // const scrollable = this.chat.bubbles.scrollable;\n\n const isFloating = (this.floating || mediaSizes.isMobile) && !hide;\n // const scrollTop = isFloating || this.divAndCaption.container.classList.contains('is-floating') ? scrollable.scrollTop : undefined;\n\n this.divAndCaption.container.classList.toggle('is-floating', isFloating);\n this.divAndCaption.container.classList.toggle('hide', hide);\n\n this.topbar.container.classList.toggle('is-pinned-floating', isFloating);\n this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`, !hide);\n\n // const active = classNames.filter((className) => this.topbar.container.classList.contains(className));\n // const maxActive = hide ? 0 : 1;\n\n // * not sure when it became unneeded\n // if(scrollTop !== undefined && active.length <= maxActive/* && !scrollable.isScrolledDown */) {\n // scrollable.scrollTop = scrollTop + ((hide ? -1 : 1) * HEIGHT);\n // }\n\n this.topbar.setFloating();\n this.topbar.setUtilsWidth();\n }\n\n public isVisible() {\n return !this.divAndCaption.container.classList.contains('hide');\n }\n\n public isFloating() {\n return this.divAndCaption.container.classList.contains('is-floating');\n }\n\n public fill(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message: Message.message) {\n this.divAndCaption.container.dataset.peerId = '' + message.peerId;\n this.divAndCaption.container.dataset.mid = '' + message.mid;\n this.divAndCaption.fill(title, subtitle, message);\n this.topbar.setUtilsWidth();\n }\n}\n","// https://github.com/evgeny-nadymov/telegram-react/blob/master/src/Components/ColumnMiddle/PinnedMessageBorder.js\n\nenum BAR_HEIGHTS {\n ONE = 32,\n TWO = 15,\n THREE = 10,\n FOUR = 8,\n MORE = 8\n};\n\nconst GAP = 1;\nconst WIDTH = 2;\nconst BASE_CLASS = 'pinned-message-border';\n\nexport default class PinnedMessageBorder {\n private border: HTMLElement;\n private wrapper: HTMLElement;\n private svg: SVGSVGElement;\n private defs: SVGDefsElement;\n private clipPath: SVGClipPathElement;\n private path: SVGPathElement;\n private mark: HTMLElement;\n\n private count: number;\n private index: number;\n\n private drawRect = (x: number, y: number, width: number, height: number, radius: number) => {\n return `M${x},${y + radius}a${radius},${radius},0,0,1,${width},0v${height - 2 * radius}a${radius},${radius},0,0,1,${-width},0Z`;\n };\n\n private getClipPath = (id: string, barHeight: number, count: number) => {\n const radius = 1;\n\n let d = '';\n /* if(count === 3) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius)\n + this.drawRect(0, barHeight + GAP, WIDTH, barHeight + 1, radius)\n + this.drawRect(0, barHeight * 2 + GAP * 2 + 1, WIDTH, barHeight, radius);\n } */if(count === 2) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius) + this.drawRect(0, barHeight + GAP * 2, WIDTH, barHeight, radius);\n } else {\n for(let i = 0; i < count; ++i) {\n d += this.drawRect(0, (barHeight + GAP) * i, WIDTH, barHeight, radius);\n }\n }\n\n if(!this.clipPath) {\n this.clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\n this.clipPath.append(this.path);\n }\n\n this.clipPath.id = id;\n this.path.setAttributeNS(null, 'd', d);\n\n return this.clipPath;\n };\n\n private getBarHeight = (count: number, index: number) => {\n let barHeight: number;\n if(count <= 1) {\n barHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n barHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n barHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n barHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n barHeight = BAR_HEIGHTS.MORE;\n }\n\n return barHeight;\n };\n\n private getMarkHeight = (count: number, index: number) => {\n let markHeight: number;\n if(count <= 1) {\n markHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n markHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n markHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n markHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n markHeight = BAR_HEIGHTS.MORE;\n }\n\n return markHeight;\n };\n\n private getMarkTranslateY = (index: number, barHeight: number, count: number) => {\n if(count === 1) {\n return 0;\n } else if(count === 2) {\n return !index ? 0 : barHeight + GAP;\n }\n\n if(count === 3) {\n if(!index) {\n return 0;\n } else if(index === 1) {\n return barHeight + GAP;\n }\n\n return barHeight * 2 + GAP * 2 + 1;\n } else {\n return (barHeight + GAP) * index;\n }\n };\n\n private getTrackTranslateY = (index: number, count: number, barHeight: number, trackHeight: number) => {\n if(count <= 4) {\n return 0;\n }\n\n if(index <= 1) {\n return 0;\n } else if(index >= (count - 2)) {\n return trackHeight - BAR_HEIGHTS.ONE - barHeight;\n }\n\n // return (index + 1) * barHeight + index * GAP;\n return (index - 2) * barHeight + index * GAP;\n // return (barHeight + GAP * 2) / 2 + (index - 2) * (barHeight + GAP);\n };\n\n private getTrackHeight = (count: number, barHeight: number) => {\n return count <= 3 ? BAR_HEIGHTS.ONE : barHeight * count + GAP * (count - 1);\n };\n\n public render(count: number, index: number) {\n if(!this.border) {\n this.border = document.createElement('div');\n this.border.classList.add(BASE_CLASS);\n\n this.wrapper = document.createElement('div');\n this.border.append(this.wrapper);\n }\n\n if(count === 1) {\n if(this.count !== count) {\n this.wrapper.className = BASE_CLASS + '-wrapper-1';\n this.border.classList.remove(BASE_CLASS + '-mask');\n this.wrapper.innerHTML = this.wrapper.style.cssText = '';\n }\n\n return this.border;\n }\n\n const barHeight = this.getBarHeight(count, index);\n const markHeight = this.getMarkHeight(count, index);\n const trackHeight = this.getTrackHeight(count, barHeight);\n\n const clipPathId = `clipPath_${count}`;\n const clipPath = this.getClipPath(clipPathId, barHeight, count);\n\n const markTranslateY = this.getMarkTranslateY(index, barHeight, count);\n const trackTranslateY = this.getTrackTranslateY(index, count, barHeight, trackHeight);\n\n this.border.classList.toggle(BASE_CLASS + '-mask', count > 4);\n\n if(index <= 1) {\n this.border.classList.add('mask-bottom');\n this.border.classList.remove('mask-top');\n } else if(index >= (count - 2)) {\n this.border.classList.add('mask-top');\n this.border.classList.remove('mask-bottom');\n } else {\n this.border.classList.add('mask-top', 'mask-bottom');\n }\n\n this.wrapper.className = BASE_CLASS + '-wrapper';\n this.wrapper.style.cssText = `clip-path: url(#${clipPathId}); width: 2px; height: ${trackHeight}px; transform: translateY(-${trackTranslateY}px);`;\n\n if(!this.svg) {\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.svg.setAttributeNS(null, 'height', '0');\n this.svg.setAttributeNS(null, 'width', '0');\n\n this.defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n this.defs.append(clipPath);\n\n this.svg.append(this.defs);\n\n this.mark = document.createElement('div');\n this.mark.classList.add(BASE_CLASS + '-mark');\n }\n\n if(!this.svg.parentElement) {\n this.wrapper.append(this.svg, this.mark);\n }\n\n this.mark.style.cssText = `height: ${markHeight}px; transform: translateY(${markTranslateY}px);`;\n\n this.count = count;\n this.index = index;\n\n return this.border;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppMessagesManager} from '../../lib/appManagers/appMessagesManager';\nimport type ChatTopbar from './topbar';\nimport rootScope from '../../lib/rootScope';\nimport appMediaPlaybackController, {AppMediaPlaybackController} from '../appMediaPlaybackController';\nimport DivAndCaption from '../divAndCaption';\nimport PinnedContainer from './pinnedContainer';\nimport Chat from './chat';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport PeerTitle from '../peerTitle';\nimport {i18n} from '../../lib/langPack';\nimport {formatFullSentTime} from '../../helpers/date';\nimport ButtonIcon from '../buttonIcon';\nimport {DocumentAttribute} from '../../layer';\nimport MediaProgressLine from '../mediaProgressLine';\nimport VolumeSelector from '../volumeSelector';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport default class ChatAudio extends PinnedContainer {\n private toggleEl: HTMLElement;\n private progressLine: MediaProgressLine;\n private volumeSelector: VolumeSelector;\n private fasterEl: HTMLElement;\n private repeatEl: HTMLButtonElement;\n\n constructor(protected topbar: ChatTopbar, protected chat: Chat, protected managers: AppManagers) {\n super({\n topbar,\n chat,\n listenerSetter: topbar.listenerSetter,\n className: 'audio',\n divAndCaption: new DivAndCaption(\n 'pinned-audio',\n (title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment) => {\n replaceContent(this.divAndCaption.title, title);\n replaceContent(this.divAndCaption.subtitle, subtitle);\n }\n ),\n onClose: () => {\n appMediaPlaybackController.stop();\n },\n floating: true\n });\n\n this.divAndCaption.border.remove();\n\n const prevEl = ButtonIcon('fast_rewind active', {noRipple: true});\n const nextEl = ButtonIcon('fast_forward active', {noRipple: true});\n\n const attachClick = (elem: HTMLElement, callback: () => void) => {\n attachClickEvent(elem, (e) => {\n cancelEvent(e);\n callback();\n }, {listenerSetter: this.topbar.listenerSetter});\n };\n\n attachClick(prevEl, () => {\n appMediaPlaybackController.previous();\n });\n\n attachClick(nextEl, () => {\n appMediaPlaybackController.next();\n });\n\n this.toggleEl = ButtonIcon('', {noRipple: true});\n this.toggleEl.classList.add('active', 'pinned-audio-ico', 'tgico');\n attachClick(this.toggleEl, () => {\n appMediaPlaybackController.toggle();\n });\n this.wrapper.prepend(this.wrapper.firstElementChild, prevEl, this.toggleEl, nextEl);\n\n this.volumeSelector = new VolumeSelector(this.listenerSetter, true);\n const volumeProgressLineContainer = document.createElement('div');\n volumeProgressLineContainer.classList.add('progress-line-container');\n volumeProgressLineContainer.append(this.volumeSelector.container);\n const tunnel = document.createElement('div');\n tunnel.classList.add('pinned-audio-volume-tunnel');\n this.volumeSelector.btn.classList.add('pinned-audio-volume', 'active');\n this.volumeSelector.btn.prepend(tunnel);\n this.volumeSelector.btn.append(volumeProgressLineContainer);\n\n this.repeatEl = ButtonIcon('audio_repeat', {noRipple: true});\n attachClick(this.repeatEl, () => {\n const params = appMediaPlaybackController.getPlaybackParams();\n if(!params.round) {\n appMediaPlaybackController.round = true;\n } else if(params.loop) {\n appMediaPlaybackController.round = false;\n appMediaPlaybackController.loop = false;\n } else {\n appMediaPlaybackController.loop = !appMediaPlaybackController.loop;\n }\n });\n\n const fasterEl = this.fasterEl = ButtonIcon('playback_2x', {noRipple: true});\n attachClick(fasterEl, () => {\n appMediaPlaybackController.playbackRate = fasterEl.classList.contains('active') ? 1 : 1.75;\n });\n\n this.wrapperUtils.prepend(this.volumeSelector.btn, fasterEl, this.repeatEl);\n\n const progressWrapper = document.createElement('div');\n progressWrapper.classList.add('pinned-audio-progress-wrapper');\n\n this.progressLine = new MediaProgressLine(undefined, undefined, true, true);\n this.progressLine.container.classList.add('pinned-audio-progress');\n progressWrapper.append(this.progressLine.container);\n this.wrapper.insertBefore(progressWrapper, this.wrapperUtils);\n\n this.topbar.listenerSetter.add(appMediaPlaybackController)('play', this.onMediaPlay);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('pause', this.onPause);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('stop', this.onStop);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('playbackParams', this.onPlaybackParams);\n\n const playingDetails = appMediaPlaybackController.getPlayingDetails();\n if(playingDetails) {\n this.onMediaPlay(playingDetails);\n this.onPlaybackParams(playingDetails.playbackParams);\n }\n }\n\n public destroy() {\n if(this.progressLine) {\n this.progressLine.removeListeners();\n }\n }\n\n private onPlaybackParams = (playbackParams: ReturnType) => {\n this.fasterEl.classList.toggle('active', playbackParams.playbackRate > 1);\n\n this.repeatEl.classList.remove('tgico-audio_repeat', 'tgico-audio_repeat_single');\n this.repeatEl.classList.add(playbackParams.loop ? 'tgico-audio_repeat_single' : 'tgico-audio_repeat');\n this.repeatEl.classList.toggle('active', playbackParams.loop || playbackParams.round);\n };\n\n private onPause = () => {\n this.toggleEl.classList.remove('flip-icon');\n };\n\n private onStop = () => {\n this.toggle(true);\n };\n\n private onMediaPlay = ({doc, message, media, playbackParams}: ReturnType) => {\n let title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment;\n const isMusic = doc.type !== 'voice' && doc.type !== 'round';\n if(!isMusic) {\n title = new PeerTitle({peerId: message.fromId, fromName: message.fwd_from?.from_name}).element;\n\n // subtitle = 'Voice message';\n subtitle = formatFullSentTime(message.date);\n } else {\n const audioAttribute = doc.attributes.find((attr) => attr._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n title = wrapEmojiText(audioAttribute?.title ?? doc.file_name);\n subtitle = audioAttribute?.performer ? wrapEmojiText(audioAttribute.performer) : i18n('AudioUnknownArtist');\n }\n\n this.fasterEl.classList.toggle('hide', isMusic);\n this.repeatEl.classList.toggle('hide', !isMusic);\n\n this.onPlaybackParams(playbackParams);\n this.volumeSelector.setVolume();\n\n this.progressLine.setMedia(media);\n\n this.fill(title, subtitle, message);\n // this.toggleEl.classList.add('flip-icon');\n this.toggleEl.classList.toggle('flip-icon', !media.paused);\n this.toggle(false);\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatTopbar from './topbar';\nimport PopupPinMessage from '../popups/unpinMessage';\nimport PinnedContainer from './pinnedContainer';\nimport PinnedMessageBorder from './pinnedMessageBorder';\nimport ReplyContainer, {wrapReplyDivAndCaption} from './replyContainer';\nimport rootScope from '../../lib/rootScope';\nimport Chat from './chat';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport ButtonIcon from '../buttonIcon';\nimport {getHeavyAnimationPromise} from '../../hooks/useHeavyAnimationCheck';\nimport {i18n} from '../../lib/langPack';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport handleScrollSideEvent from '../../helpers/dom/handleScrollSideEvent';\nimport debounce from '../../helpers/schedulers/debounce';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {Message} from '../../layer';\nimport {logger} from '../../lib/logger';\n\nclass AnimatedSuper {\n static DURATION = 200;\n static BASE_CLASS = 'animated-super';\n container: HTMLDivElement;\n rows: {[index: string]: {element: HTMLElement, timeout?: number, new?: true}} = {};\n clearTimeout: number;\n\n constructor() {\n this.container = document.createElement('div');\n this.container.className = AnimatedSuper.BASE_CLASS;\n }\n\n public getRow(index: number, animateFirst = false) {\n if(this.rows[index]) return this.rows[index].element;\n const row = document.createElement('div');\n const isFirst = !Object.keys(this.rows).length && !animateFirst;\n row.className = AnimatedSuper.BASE_CLASS + '-row' + (isFirst ? '' : ' is-hiding hide');\n this.rows[index] = {element: row, new: true};\n this.container.append(row);\n return row;\n }\n\n public clearRow(index: number) {\n if(!this.rows[index]) return;\n this.rows[index].element.remove();\n delete this.rows[index];\n }\n\n public clearRows(currentIndex?: number) {\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\n this.clearTimeout = window.setTimeout(() => {\n for(const i in this.rows) {\n if(+i === currentIndex) continue;\n this.clearRow(+i);\n }\n }, AnimatedSuper.DURATION);\n }\n\n public setNewRow(index: number, reflow = false) {\n const row = this.rows[index];\n if(row.new) {\n if(reflow) {\n row.element.classList.remove('hide');\n void row.element.offsetLeft; // reflow\n } else {\n row.element.classList.remove('is-hiding', 'hide');\n }\n\n delete row.new;\n }\n\n this.clearRows(index);\n }\n\n public animate(index: number, previousIndex: number, fromTop = index > previousIndex, ignorePrevious = false) {\n if(index === previousIndex) { // * handle if set index 0 and previousIndex 0\n return this.setNewRow(index);\n }\n\n const row = this.rows[index];\n const previousRow = this.rows[previousIndex];\n if(!previousRow && !ignorePrevious) {\n return this.setNewRow(index);\n }\n\n const sides = ['from-top', 'from-bottom'];\n if(!fromTop) sides.reverse();\n\n row.element.classList.add(sides[0]);\n row.element.classList.remove(sides[1]);\n if(previousRow) {\n previousRow.element.classList.add(sides[1]);\n previousRow.element.classList.remove(sides[0]);\n }\n\n if(row.new) {\n this.setNewRow(index, true);\n }\n\n row.element.classList.toggle('is-hiding', false);\n previousRow && previousRow.element.classList.toggle('is-hiding', true);\n\n /* const height = row.element.getBoundingClientRect().height;\n row.element.style.transform = `translateY(${fromTop ? height * -1 : height}px)`;\n if(previousRow) {\n previousRow.element.style.transform = `translateY(${fromTop ? height : height * -1}px)`;\n } */\n\n /* row.element.style.setProperty('--height', row.element.getBoundingClientRect().height + 'px');\n if(previousRow) {\n previousRow.element.style.setProperty('--height', previousRow.element.getBoundingClientRect().height + 'px');\n } */\n\n this.clearRows(index);\n }\n}\n\nclass AnimatedCounter {\n static EMPTY_INDEX = -1;\n static BASE_CLASS = 'animated-counter';\n container: HTMLElement;\n decimals: {\n container: HTMLElement,\n placeholder: HTMLElement,\n animatedSuper: AnimatedSuper\n }[] = [];\n previousNumber = 0;\n clearTimeout: number;\n\n constructor(private reverse = false) {\n this.container = document.createElement('div');\n this.container.className = AnimatedCounter.BASE_CLASS;\n }\n\n getDecimal(index: number) {\n if(this.decimals[index]) return this.decimals[index];\n const item = document.createElement('div');\n item.className = AnimatedCounter.BASE_CLASS + '-decimal';\n\n const placeholder = document.createElement('div');\n placeholder.className = AnimatedCounter.BASE_CLASS + '-decimal-placeholder';\n\n const animatedSuper = new AnimatedSuper();\n animatedSuper.container.className = AnimatedCounter.BASE_CLASS + '-decimal-wrapper';\n\n item.append(placeholder, animatedSuper.container);\n\n this.container.append(item);\n\n return this.decimals[index] = {container: item, placeholder, animatedSuper};\n }\n\n clear(number: number) {\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\n\n const decimals = ('' + number).length;\n if(decimals >= this.decimals.length) {\n return;\n }\n\n this.clearTimeout = window.setTimeout(() => {\n const byDecimal = this.decimals.splice(decimals, this.decimals.length - decimals);\n byDecimal.forEach((decimal) => {\n decimal.container.remove();\n });\n }, AnimatedSuper.DURATION);\n }\n\n /* prepareNumber(number: number) {\n const decimals = ('' + number).length;\n if(this.decimals.length < decimals) {\n for(let i = this.decimals.length; i < decimals; ++i) {\n this.getDecimal(i);\n }\n }\n } */\n\n hideLeft(number: number) {\n const decimals = ('' + number).length;\n const byDecimal = this.decimals.slice(decimals);// this.decimals.splice(deleteCount, this.decimals.length - deleteCount);\n byDecimal.forEach((decimal) => {\n const previousDecimalNumber = +decimal.placeholder.innerText || 0;\n const row = decimal.animatedSuper.getRow(AnimatedCounter.EMPTY_INDEX, true);\n decimal.animatedSuper.animate(AnimatedCounter.EMPTY_INDEX, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\n });\n\n this.clear(number);\n }\n\n setCount(number: number) {\n // this.prepareNumber(number);\n\n const previousByDecimal = Array.from('' + this.previousNumber).map((n) => +n);\n const byDecimal = Array.from('' + number).map((n) => +n);\n byDecimal.forEach((decimalNumber, idx) => {\n const decimal = this.getDecimal(idx);\n // const row = decimal.animatedSuper.getRow(number, true);\n const row = decimal.animatedSuper.getRow(decimalNumber, true);\n const previousDecimalNumber = previousByDecimal[idx] ?? AnimatedCounter.EMPTY_INDEX;\n row.innerText = decimal.placeholder.innerText = '' + decimalNumber;\n // decimal.animatedSuper.animate(number, this.previousNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\n decimal.animatedSuper.animate(decimalNumber, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\n });\n\n this.hideLeft(number);\n // this.clear(number);\n this.previousNumber = number;\n }\n}\n\nexport default class ChatPinnedMessage {\n private static LOAD_COUNT = 50;\n private static LOAD_OFFSET = 5;\n\n public pinnedMessageContainer: PinnedContainer;\n private pinnedMessageBorder: PinnedMessageBorder;\n\n private pinnedMaxMid = 0;\n public pinnedMid = 0;\n public pinnedIndex = -1;\n private wasPinnedIndex = 0;\n private wasPinnedMediaIndex = 0;\n\n public locked = false;\n private waitForScrollBottom = false;\n\n public count = 0;\n private mids: number[] = [];\n private offsetIndex = 0;\n\n private loading = false;\n private loadedBottom = false;\n private loadedTop = false;\n\n private animatedSubtitle: AnimatedSuper;\n private animatedMedia: AnimatedSuper;\n private animatedCounter: AnimatedCounter;\n\n private listenerSetter: ListenerSetter;\n private scrollDownListenerSetter: ListenerSetter = null;\n\n public hidden = false;\n\n private getCurrentIndexPromise: Promise = null;\n private btnOpen: HTMLButtonElement;\n\n private setPinnedMessage: () => void;\n\n private isStatic: boolean;\n\n private debug: boolean;\n\n public setCorrectIndexThrottled: (lastScrollDirection?: number) => void;\n\n private log: ReturnType;\n\n constructor(private topbar: ChatTopbar, private chat: Chat, private managers: AppManagers) {\n this.listenerSetter = new ListenerSetter();\n this.log = logger('PM');\n this.debug = true;\n this.isStatic = false;\n\n const dAC = new ReplyContainer('pinned-message', chat.animationGroup);\n this.pinnedMessageContainer = new PinnedContainer({\n topbar,\n chat,\n listenerSetter: this.listenerSetter,\n className: 'message',\n divAndCaption: dAC,\n onClose: async() => {\n if(await managers.appPeersManager.canPinMessage(this.chat.peerId)) {\n new PopupPinMessage(this.chat.peerId, this.pinnedMid, true);\n } else {\n new PopupPinMessage(this.chat.peerId, 0, true);\n }\n\n return false;\n }\n });\n\n this.pinnedMessageBorder = new PinnedMessageBorder();\n dAC.border.replaceWith(this.pinnedMessageBorder.render(1, 0));\n\n this.animatedSubtitle = new AnimatedSuper();\n dAC.subtitle.append(this.animatedSubtitle.container);\n\n this.animatedMedia = new AnimatedSuper();\n this.animatedMedia.container.classList.add('pinned-message-media-container');\n dAC.content.prepend(this.animatedMedia.container);\n\n this.animatedCounter = new AnimatedCounter(true);\n dAC.title.append(i18n('PinnedMessage'), ' ', this.animatedCounter.container);\n\n const btnClose = this.pinnedMessageContainer.btnClose.cloneNode(true) as HTMLElement;\n this.pinnedMessageContainer.attachOnCloseEvent(btnClose);\n dAC.container.prepend(btnClose);\n\n this.btnOpen = ButtonIcon('pinlist pinned-container-close pinned-message-pinlist', {noRipple: true});\n\n this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen);\n\n attachClickEvent(this.btnOpen, (e) => {\n cancelEvent(e);\n this.topbar.openPinned(true);\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId}) => {\n if(peerId === this.chat.peerId) {\n // this.wasPinnedIndex = 0;\n // setTimeout(() => {\n if(this.hidden) {\n this.pinnedMessageContainer.toggle(this.hidden = false);\n }\n\n this.loadedTop = this.loadedBottom = false;\n this.pinnedIndex = -1;\n this.pinnedMid = 0;\n this.count = 0;\n this.mids = [];\n this.offsetIndex = 0;\n this.pinnedMaxMid = 0;\n this.setCorrectIndex(0);\n // }, 300);\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_pinned_hidden', ({peerId}) => {\n if(peerId === this.chat.peerId) {\n this.pinnedMessageContainer.toggle(this.hidden = true);\n }\n });\n\n // * 200 - no lags\n // * 100 - need test\n this.setPinnedMessage = debounce(() => this._setPinnedMessage(), 100, true, true);\n this.setCorrectIndexThrottled = throttle(this.setCorrectIndex.bind(this), 100, false);\n\n this.isStatic = !this.chat.isPinnedMessagesNeeded();\n }\n\n public destroy() {\n this.pinnedMessageContainer.divAndCaption.container.remove();\n this.pinnedMessageContainer.toggle(true);\n this.listenerSetter.removeAll();\n this.unsetScrollDownListener(false);\n }\n\n public setCorrectIndex(lastScrollDirection?: number) {\n if(this.isStatic) return;\n // return;\n\n if(this.locked || this.hidden/* || this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise */) {\n return;\n }\n\n if((this.loadedBottom || this.loadedTop) && !this.count) {\n return;\n }\n\n // const perf = performance.now();\n const el = this.chat.bubbles.getBubbleByPoint('bottom');\n // this.log('setCorrectIndex: get last element perf:', performance.now() - perf, el);\n if(!el) return;\n\n // return;\n\n const mid = el.dataset.mid;\n if(el && mid !== undefined) {\n // this.log('setCorrectIndex will test mid:', mid);\n this.testMid(+mid, lastScrollDirection);\n }\n }\n\n public testMid(mid: number, lastScrollDirection?: number) {\n if(this.isStatic) return;\n\n // if(lastScrollDirection !== undefined) return;\n if(this.hidden) return;\n\n // this.log('testMid', mid);\n\n let currentIndex: number = this.mids.findIndex((_mid) => _mid <= mid);\n if(currentIndex !== -1 && !this.isNeededMore(currentIndex)) {\n currentIndex += this.offsetIndex;\n } else if(this.loadedTop && mid < this.mids[this.mids.length - 1]) {\n // currentIndex = 0;\n currentIndex = this.mids.length - 1 + this.offsetIndex;\n } else {\n if(!this.getCurrentIndexPromise) {\n this.getCurrentIndexPromise = this.getCurrentIndex(mid, lastScrollDirection !== undefined);\n }\n\n return;\n }\n\n // const idx = Math.max(0, this.mids.indexOf(mid));\n\n /* if(currentIndex === this.count) {\n currentIndex = 0;\n } */\n\n // this.log('testMid: pinned currentIndex', currentIndex, mid);\n\n const changed = this.pinnedIndex !== currentIndex;\n if(changed) {\n if(this.waitForScrollBottom && lastScrollDirection !== undefined) {\n if(this.pinnedIndex === 0 || this.pinnedIndex > currentIndex) { // если не скроллил вниз и пытается поставить нижний пиннед - выйти\n return;\n }\n }\n\n this.pinnedIndex = currentIndex;\n this.pinnedMid = this.mids.find((_mid) => _mid <= mid) || this.mids[this.mids.length - 1];\n this.setPinnedMessage();\n }\n }\n\n private isNeededMore(currentIndex: number) {\n return (this.count > ChatPinnedMessage.LOAD_COUNT &&\n (\n (!this.loadedBottom && currentIndex <= ChatPinnedMessage.LOAD_OFFSET) ||\n (!this.loadedTop && (this.count - 1 - currentIndex) <= ChatPinnedMessage.LOAD_OFFSET)\n )\n );\n }\n\n private async getCurrentIndex(mid: number, correctAfter = true) {\n if(this.loading) return;\n this.loading = true;\n\n try {\n const log = this.debug ? this.log.bindPrefix('getCurrentIndex') : undefined;\n log && log('start', mid, correctAfter);\n\n let gotRest = false;\n const promises = [\n this.managers.appMessagesManager.getSearch({\n peerId: this.chat.peerId,\n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId: mid,\n limit: ChatPinnedMessage.LOAD_COUNT,\n backLimit: ChatPinnedMessage.LOAD_COUNT,\n threadId: this.chat.threadId\n })\n .then((r) => {\n gotRest = true;\n return r;\n })\n ];\n\n if(!this.pinnedMaxMid) {\n const promise = this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId, this.chat.threadId).then((p) => {\n if(!p.maxId) return;\n this.pinnedMaxMid = p.maxId;\n\n if(!gotRest && correctAfter) {\n this.mids = [this.pinnedMaxMid];\n this.count = p.count;\n this.pinnedIndex = 0;\n this.pinnedMid = this.mids[0];\n this.setPinnedMessage();\n // this.pinnedMessageContainer.toggle(false);\n }\n });\n\n promises.push(promise as any);\n }\n\n const result = (await Promise.all(promises))[0];\n\n let backLimited = result.history.findIndex((message) => message.mid <= mid);\n if(backLimited === -1) {\n backLimited = result.history.length;\n }/* else {\n backLimited -= 1;\n } */\n\n this.offsetIndex = result.offset_id_offset ? result.offset_id_offset - backLimited : 0;\n this.mids = result.history.map((message) => message.mid).slice();\n this.count = result.count;\n\n if(!this.count) {\n this.pinnedMessageContainer.toggle(true);\n }\n\n this.loadedTop = (this.offsetIndex + this.mids.length) === this.count;\n this.loadedBottom = !this.offsetIndex;\n\n log && log('result', mid, result, backLimited, this.offsetIndex, this.loadedTop, this.loadedBottom);\n } catch(err) {\n this.log.error('getCurrentIndex error', err);\n }\n\n this.loading = false;\n\n if(this.locked) {\n this.testMid(mid);\n } else if(correctAfter) {\n this.setCorrectIndex(0);\n }\n\n this.getCurrentIndexPromise = null;\n // return result.offset_id_offset || 0;\n }\n\n public setScrollDownListener() {\n this.waitForScrollBottom = true;\n\n if(!this.scrollDownListenerSetter) {\n this.scrollDownListenerSetter = new ListenerSetter();\n handleScrollSideEvent(this.chat.bubbles.scrollable.container, 'bottom', () => {\n this.unsetScrollDownListener();\n }, this.scrollDownListenerSetter);\n }\n }\n\n public unsetScrollDownListener(refreshPosition = true) {\n this.waitForScrollBottom = false;\n\n if(this.scrollDownListenerSetter) {\n this.scrollDownListenerSetter.removeAll();\n this.scrollDownListenerSetter = null;\n }\n\n if(refreshPosition) {\n this.setCorrectIndex(0);\n }\n }\n\n public async handleFollowingPinnedMessage() {\n this.locked = true;\n\n this.debug && this.log('handleFollowingPinnedMessage');\n try {\n this.setScrollDownListener();\n\n const setPeerPromise = this.chat.setPeerPromise;\n if(setPeerPromise instanceof Promise) {\n await setPeerPromise;\n }\n\n // await this.chat.bubbles.scrollable.scrollLockedPromise;\n await getHeavyAnimationPromise();\n\n if(this.getCurrentIndexPromise) {\n await this.getCurrentIndexPromise;\n }\n\n this.debug && this.log('handleFollowingPinnedMessage: unlock');\n this.locked = false;\n\n /* // подождём, пока скролл остановится\n setTimeout(() => {\n this.log('handleFollowingPinnedMessage: unlock');\n this.locked = false;\n }, 50); */\n } catch(err) {\n this.log.error('handleFollowingPinnedMessage error:', err);\n\n this.locked = false;\n this.waitForScrollBottom = false;\n this.setCorrectIndex(0);\n }\n }\n\n public async followPinnedMessage(mid: number) {\n const message = await this.chat.getMessage(mid);\n if(!message) {\n return;\n }\n\n this.chat.setMessageId(mid);\n (this.chat.setPeerPromise || Promise.resolve()).then(() => { // * debounce fast clicker\n this.handleFollowingPinnedMessage();\n this.testMid(this.pinnedIndex >= (this.count - 1) ? this.pinnedMaxMid : mid - 1);\n });\n }\n\n public async _setPinnedMessage() {\n // ///this.log('setting pinned message', message);\n // return;\n /* const promise: Promise = this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise || Promise.resolve();\n Promise.all([\n promise\n ]).then(() => { */\n // const mids = results[0];\n const count = this.count;\n if(count) {\n const pinnedIndex = this.pinnedIndex;\n const message = await this.chat.getMessage(this.pinnedMid);\n\n // this.animatedCounter.prepareNumber(count);\n\n // setTimeout(() => {\n const isLast = pinnedIndex === 0;\n this.animatedCounter.container.classList.toggle('is-last', isLast);\n // SetTransition(this.animatedCounter.container, 'is-last', isLast, AnimatedSuper.DURATION);\n if(!isLast) {\n this.animatedCounter.setCount(count - pinnedIndex);\n }\n // }, 100);\n\n // this.pinnedMessageContainer.fill(undefined, message.message, message);\n this.pinnedMessageContainer.toggle(false);\n\n const fromTop = pinnedIndex > this.wasPinnedIndex;\n\n this.debug && this.log('setPinnedMessage: fromTop', fromTop, pinnedIndex, this.wasPinnedIndex);\n\n const writeTo = this.animatedSubtitle.getRow(pinnedIndex);\n const writeMediaTo = this.animatedMedia.getRow(pinnedIndex);\n writeMediaTo.classList.add('pinned-message-media');\n // writeMediaTo.innerHTML = writeMediaTo.style.cssText = writeMediaTo.dataset.docId = '';\n const loadPromises: Promise[] = [];\n const isMediaSet = await wrapReplyDivAndCaption({\n title: undefined,\n titleEl: null,\n subtitle: (message as Message.message).message,\n subtitleEl: writeTo,\n message,\n mediaEl: writeMediaTo,\n loadPromises,\n animationGroup: this.chat.animationGroup\n });\n\n await Promise.all(loadPromises);\n\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-media', isMediaSet);\n\n // if(this.wasPinnedIndex !== this.pinnedIndex) {\n this.animatedSubtitle.animate(pinnedIndex, this.wasPinnedIndex);\n if(isMediaSet) {\n this.animatedMedia.animate(pinnedIndex, this.wasPinnedMediaIndex); // * wasPinnedMediaIndex из-за того, что блок меняется с другим алгоритмом\n this.wasPinnedMediaIndex = pinnedIndex;\n } else {\n this.animatedMedia.clearRows();\n }\n // }\n\n this.pinnedMessageBorder.render(count, count - pinnedIndex - 1);\n this.wasPinnedIndex = pinnedIndex;\n this.pinnedMessageContainer.divAndCaption.container.dataset.mid = '' + message.mid;\n } else {\n this.pinnedMessageContainer.toggle(true);\n this.wasPinnedIndex = 0;\n }\n\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-many', this.count > 1);\n // });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../listenerSetter';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n\nexport default function handleScrollSideEvent(elem: HTMLElement, side: 'top' | 'bottom', callback: () => void, listenerSetter: ListenerSetter) {\n if(IS_TOUCH_SUPPORTED) {\n let lastY: number;\n const options = {passive: true};\n listenerSetter.add(elem)('touchstart', (e) => {\n if(e.touches.length > 1) {\n onTouchEnd();\n return;\n }\n\n lastY = e.touches[0].clientY;\n\n listenerSetter.add(elem)('touchmove', onTouchMove, options);\n listenerSetter.add(elem)('touchend', onTouchEnd, options);\n }, options);\n\n const onTouchMove = (e: TouchEvent) => {\n const clientY = e.touches[0].clientY;\n\n const isDown = clientY < lastY;\n if(side === 'bottom' && isDown) callback();\n else if(side === 'top' && !isDown) callback();\n lastY = clientY;\n // alert('isDown: ' + !!isDown);\n };\n\n const onTouchEnd = () => {\n listenerSetter.removeManual(elem, 'touchmove', onTouchMove, options);\n listenerSetter.removeManual(elem, 'touchend', onTouchEnd, options);\n };\n } else {\n listenerSetter.add(elem)('wheel', (e) => {\n const isDown = e.deltaY > 0;\n // this.log('wheel', e, isDown);\n if(side === 'bottom' && isDown) callback();\n else if(side === 'top' && !isDown) callback();\n }, {passive: true});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Channel} from '../../lib/appManagers/appChatsManager';\nimport type {AppSidebarRight} from '../sidebarRight';\nimport type Chat from './chat';\nimport {RIGHT_COLUMN_ACTIVE_CLASSNAME} from '../sidebarRight';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport rootScope from '../../lib/rootScope';\nimport AvatarElement from '../avatar';\nimport Button from '../button';\nimport ButtonIcon from '../buttonIcon';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport ChatAudio from './audio';\nimport ChatPinnedMessage from './pinnedMessage';\nimport {ButtonMenuItemOptions} from '../buttonMenu';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport PopupDeleteDialog from '../popups/deleteDialog';\nimport appNavigationController from '../appNavigationController';\nimport {LEFT_COLUMN_ACTIVE_CLASSNAME} from '../sidebarLeft';\nimport PeerTitle from '../peerTitle';\nimport {i18n} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport {toast, toastNew} from '../toast';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {ChatFull, Chat as MTChat, GroupCall} from '../../layer';\nimport PopupPickUser from '../popups/pickUser';\nimport PopupPeer from '../popups/peer';\nimport AppEditContactTab from '../sidebarRight/tabs/editContact';\nimport appMediaPlaybackController from '../appMediaPlaybackController';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport {CallType} from '../../lib/calls/types';\nimport PopupMute from '../popups/mute';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport hasRights from '../../lib/appManagers/utils/chats/hasRights';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport groupCallsController from '../../lib/calls/groupCallsController';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport {makeMediaSize} from '../../helpers/mediaSize';\n\ntype ButtonToVerify = {element?: HTMLElement, verify: () => boolean | Promise};\n\nexport default class ChatTopbar {\n public container: HTMLDivElement;\n private btnBack: HTMLButtonElement;\n private chatInfo: HTMLDivElement;\n private avatarElement: AvatarElement;\n private title: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private chatUtils: HTMLDivElement;\n private btnJoin: HTMLButtonElement;\n private btnPinned: HTMLButtonElement;\n private btnCall: HTMLButtonElement;\n private btnGroupCall: HTMLButtonElement;\n private btnMute: HTMLButtonElement;\n private btnSearch: HTMLButtonElement;\n private btnMore: HTMLElement;\n\n private chatAudio: ChatAudio;\n public pinnedMessage: ChatPinnedMessage;\n\n private setUtilsRAF: number;\n private setPeerStatusInterval: number;\n\n public listenerSetter: ListenerSetter;\n\n private menuButtons: Parameters[0]['buttons'];\n private buttonsToVerify: ButtonToVerify[];\n private chatInfoContainer: HTMLDivElement;\n private person: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private appSidebarRight: AppSidebarRight,\n private managers: AppManagers\n ) {\n this.listenerSetter = new ListenerSetter();\n\n this.menuButtons = [];\n this.buttonsToVerify = [];\n }\n\n public construct() {\n // this.chat.log.error('Topbar construction');\n\n this.container = document.createElement('div');\n this.container.classList.add('sidebar-header', 'topbar', 'hide');\n this.container.dataset.floating = '0';\n\n this.btnBack = ButtonIcon('left sidebar-close-button', {noRipple: true});\n\n // * chat info section\n this.chatInfoContainer = document.createElement('div');\n this.chatInfoContainer.classList.add('chat-info-container');\n\n this.chatInfo = document.createElement('div');\n this.chatInfo.classList.add('chat-info');\n\n const person = this.person = document.createElement('div');\n person.classList.add('person');\n\n const content = document.createElement('div');\n content.classList.add('content');\n\n const top = document.createElement('div');\n top.classList.add('top');\n\n this.title = document.createElement('div');\n this.title.classList.add('user-title');\n\n top.append(this.title);\n\n const bottom = document.createElement('div');\n bottom.classList.add('bottom');\n\n if(this.subtitle) {\n bottom.append(this.subtitle);\n }\n\n content.append(top, bottom);\n if(this.avatarElement) {\n person.append(this.avatarElement);\n }\n\n person.append(content);\n this.chatInfo.append(person);\n\n // * chat utils section\n this.chatUtils = document.createElement('div');\n this.chatUtils.classList.add('chat-utils');\n\n this.chatAudio = new ChatAudio(this, this.chat, this.managers);\n\n if(this.menuButtons.length) {\n this.btnMore = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: this.menuButtons,\n onOpen: async(e, element) => {\n const deleteButton = this.menuButtons[this.menuButtons.length - 1];\n if(deleteButton?.element) {\n const deleteButtonText = await this.managers.appPeersManager.getDeleteButtonText(this.peerId);\n deleteButton.element.lastChild.replaceWith(i18n(deleteButtonText));\n }\n }\n });\n }\n\n this.chatUtils.append(...[\n // this.chatAudio ? this.chatAudio.divAndCaption.container : null,\n this.pinnedMessage ? this.pinnedMessage.pinnedMessageContainer.divAndCaption.container : null,\n this.btnJoin,\n this.btnPinned,\n this.btnCall,\n this.btnGroupCall,\n this.btnMute,\n this.btnSearch,\n this.btnMore\n ].filter(Boolean));\n\n this.pushButtonToVerify(this.btnCall, this.verifyCallButton.bind(this, 'voice'));\n this.pushButtonToVerify(this.btnGroupCall, this.verifyVideoChatButton);\n\n this.chatInfoContainer.append(this.btnBack, this.chatInfo, this.chatUtils);\n this.container.append(this.chatInfoContainer);\n\n if(this.chatAudio) {\n // this.container.append(this.chatAudio.divAndCaption.container, this.chatUtils);\n this.container.append(this.chatAudio.divAndCaption.container);\n }\n\n // * construction end\n\n // * fix topbar overflow section\n\n this.listenerSetter.add(window)('resize', this.onResize);\n this.listenerSetter.add(mediaSizes)('changeScreen', this.onChangeScreen);\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'pinned-container');\n blurActiveElement();\n if(container) {\n cancelEvent(e);\n\n if(findUpClassName(e.target, 'progress-line')) {\n return;\n }\n\n const mid = +container.dataset.mid;\n if(container.classList.contains('pinned-message')) {\n // if(!this.pinnedMessage.locked) {\n this.pinnedMessage.followPinnedMessage(mid);\n // }\n } else {\n const peerId = container.dataset.peerId.toPeerId();\n const searchContext = appMediaPlaybackController.getSearchContext();\n this.chat.appImManager.setInnerPeer({\n peerId,\n lastMsgId: mid,\n type: searchContext.isScheduled ? 'scheduled' : (searchContext.threadId ? 'discussion' : undefined),\n threadId: searchContext.threadId\n });\n }\n } else {\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n onBtnBackClick();\n } else if(findUpTag(e.target, 'AVATAR-ELEMENT')) {\n this.appSidebarRight.toggleSidebar(!document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME));\n } else {\n this.appSidebarRight.toggleSidebar(true);\n }\n }\n }, {listenerSetter: this.listenerSetter});\n\n const onBtnBackClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n // const item = appNavigationController.findItemByType('chat');\n // * return manually to chat by arrow, since can't get back to\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.chat.appImManager.setPeer({peerId: this.peerId});\n } else {\n const isFirstChat = this.chat.appImManager.chats.indexOf(this.chat) === 0;\n appNavigationController.back(isFirstChat ? 'im' : 'chat');\n /* return;\n\n if(mediaSizes.activeScreen === ScreenSize.medium && !appNavigationController.findItemByType('chat')) {\n this.chat.appImManager.setPeer(0);\n blurActiveElement();\n } else {\n appNavigationController.back('chat');\n } */\n }\n };\n\n attachClickEvent(this.btnBack, onBtnBackClick, {listenerSetter: this.listenerSetter});\n }\n\n private pushButtonToVerify(element: HTMLElement, verify: ButtonToVerify['verify']) {\n if(!element) {\n return;\n }\n\n this.buttonsToVerify.push({element, verify});\n }\n\n private verifyButtons = (e?: Event) => {\n const isMenuOpen = !!e || !!(this.btnMore && this.btnMore.classList.contains('menu-open'));\n\n e && cancelEvent(e);\n\n const r = async() => {\n const buttons = this.buttonsToVerify.concat(isMenuOpen ? this.menuButtons as any : []);\n const results = await Promise.all(buttons.map(async(button) => {\n return {\n result: await button.verify(),\n button\n }\n }));\n\n results.forEach(({button, result}) => {\n button.element.classList.toggle('hide', !result);\n });\n };\n\n r();\n };\n\n private verifyVideoChatButton = async(type?: 'group' | 'broadcast') => {\n if(!IS_GROUP_CALL_SUPPORTED || this.peerId.isUser() || this.chat.type !== 'chat' || this.chat.threadId) return false;\n\n const currentGroupCall = groupCallsController.groupCall;\n const chatId = this.peerId.toChatId();\n if(currentGroupCall?.chatId === chatId) {\n return false;\n }\n\n if(type) {\n if(((await this.managers.appPeersManager.isBroadcast(this.peerId)) && type === 'group') ||\n ((await this.managers.appPeersManager.isAnyGroup(this.peerId)) && type === 'broadcast')) {\n return false;\n }\n }\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n return (chat as MTChat.chat).pFlags?.call_active || hasRights(chat, 'manage_call');\n };\n\n private verifyCallButton = async(type?: CallType) => {\n if(!IS_CALL_SUPPORTED || !this.peerId.isUser()) return false;\n const userId = this.peerId.toUserId();\n const userFull = await this.managers.appProfileManager.getCachedFullUser(userId);\n\n return !!userFull && !!(type === 'voice' ? userFull.pFlags.phone_calls_available : userFull.pFlags.video_calls_available);\n };\n\n public constructUtils() {\n this.menuButtons = [{\n icon: 'search',\n text: 'Search',\n onClick: () => {\n this.chat.initSearch();\n },\n verify: () => mediaSizes.isMobile\n }, /* {\n icon: 'pinlist',\n text: 'Pinned Messages',\n onClick: () => this.openPinned(false),\n verify: () => mediaSizes.isMobile\n }, */{\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: async() => this.chat.type === 'chat' && rootScope.myId !== this.peerId && !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.chat.threadId}))\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: () => {\n this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, threadId: this.chat.threadId});\n },\n verify: async() => this.chat.type === 'chat' && rootScope.myId !== this.peerId && (await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.chat.threadId}))\n }, {\n icon: 'comments',\n text: 'ViewDiscussion',\n onClick: () => {\n const middleware = this.chat.bubbles.getMiddleware();\n Promise.resolve(this.managers.appProfileManager.getChannelFull(this.peerId.toChatId())).then((channelFull) => {\n if(middleware() && channelFull.linked_chat_id) {\n this.chat.appImManager.setInnerPeer({\n peerId: channelFull.linked_chat_id.toPeerId(true)\n });\n }\n });\n },\n verify: async() => {\n const chatFull = await this.managers.appProfileManager.getCachedFullChat(this.peerId.toChatId());\n return this.chat.type === 'chat' && !!(chatFull as ChatFull.channelFull)?.linked_chat_id;\n }\n }, {\n icon: 'phone',\n text: 'Call',\n onClick: this.onCallClick.bind(this, 'voice'),\n verify: this.verifyCallButton.bind(this, 'voice')\n }, {\n icon: 'videocamera',\n text: 'VideoCall',\n onClick: this.onCallClick.bind(this, 'video'),\n verify: this.verifyCallButton.bind(this, 'video')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.LiveStream',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'broadcast')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.VoiceChat',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'group')\n }, {\n icon: 'select',\n text: 'Chat.Menu.SelectMessages',\n onClick: () => {\n const selection = this.chat.selection;\n selection.toggleSelection(true, true);\n apiManagerProxy.getState().then((state) => {\n if(state.chatContextMenuHintWasShown) {\n return;\n }\n\n const original = selection.toggleByElement.bind(selection);\n selection.toggleByElement = async(bubble) => {\n this.managers.appStateManager.pushToState('chatContextMenuHintWasShown', true);\n toast(i18n('Chat.Menu.Hint'));\n\n selection.toggleByElement = original;\n selection.toggleByElement(bubble);\n };\n });\n },\n verify: () => !this.chat.selection.isSelecting && !!this.chat.bubbles.getRenderedLength()\n }, {\n icon: 'select',\n text: 'Chat.Menu.ClearSelection',\n onClick: () => {\n this.chat.selection.cancelSelection();\n },\n verify: () => this.chat.selection.isSelecting\n }, {\n icon: 'adduser',\n text: 'AddContact',\n onClick: () => {\n if(!this.appSidebarRight.isTabExists(AppEditContactTab)) {\n const tab = this.appSidebarRight.createTab(AppEditContactTab);\n tab.peerId = this.peerId;\n tab.open();\n\n this.appSidebarRight.toggleSidebar(true);\n }\n },\n verify: async() => this.peerId.isUser() && !(await this.managers.appPeersManager.isContact(this.peerId))\n }, {\n icon: 'forward',\n text: 'ShareContact',\n onClick: () => {\n const contactPeerId = this.peerId;\n new PopupPickUser({\n peerTypes: ['dialogs', 'contacts'],\n onSelect: (peerId) => {\n return new Promise((resolve, reject) => {\n new PopupPeer('', {\n titleLangKey: 'SendMessageTitle',\n descriptionLangKey: 'SendContactToGroupText',\n descriptionLangArgs: [new PeerTitle({peerId, dialog: true}).element],\n buttons: [{\n langKey: 'Send',\n callback: () => {\n resolve();\n\n this.managers.appMessagesManager.sendContact(peerId, contactPeerId);\n this.chat.appImManager.setInnerPeer({peerId});\n }\n }, {\n langKey: 'Cancel',\n callback: () => {\n reject();\n },\n isCancel: true\n }],\n peerId,\n overlayClosable: true\n }).show();\n });\n },\n placeholder: 'ShareModal.Search.Placeholder',\n chatRightsAction: 'send_messages',\n selfPresence: 'ChatYourSelf'\n });\n },\n verify: async() => rootScope.myId !== this.peerId && this.peerId.isUser() && (await this.managers.appPeersManager.isContact(this.peerId)) && !!(await this.managers.appUsersManager.getUser(this.peerId.toUserId())).phone\n }, {\n icon: 'bots',\n text: 'Settings',\n onClick: () => {\n this.managers.appMessagesManager.sendText(this.peerId, '/settings');\n },\n verify: async() => {\n try {\n const attachMenuBot = await this.managers.appAttachMenuBotsManager.getAttachMenuBot(this.peerId.toUserId());\n return !!attachMenuBot?.pFlags?.has_settings;\n } catch(err) {\n return false;\n }\n }\n }, {\n icon: 'lock',\n text: 'BlockUser',\n onClick: () => {\n new PopupPeer('', {\n peerId: this.peerId,\n titleLangKey: 'BlockUser',\n descriptionLangKey: 'AreYouSureBlockContact2',\n descriptionLangArgs: [new PeerTitle({peerId: this.peerId}).element],\n buttons: [{\n langKey: 'BlockUser',\n isDanger: true,\n callback: () => {\n this.managers.appUsersManager.toggleBlock(this.peerId, true).then((value) => {\n if(value) {\n toastNew({langPackKey: 'UserBlocked'});\n }\n });\n }\n }]\n }).show();\n },\n verify: async() => {\n if(!this.peerId.isUser()) return false;\n const userFull = await this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return this.peerId !== rootScope.myId && userFull && !userFull.pFlags?.blocked;\n }\n }, {\n icon: 'lockoff',\n text: 'Unblock',\n onClick: () => {\n this.managers.appUsersManager.toggleBlock(this.peerId, false).then((value) => {\n if(value) {\n toastNew({langPackKey: 'UserUnblocked'});\n }\n });\n },\n verify: async() => {\n const userFull = await this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return !!userFull?.pFlags?.blocked;\n }\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: () => {\n new PopupDeleteDialog(this.peerId/* , 'leave' */);\n },\n verify: async() => this.chat.type === 'chat' && !!(await this.managers.appMessagesManager.getDialogOnly(this.peerId))\n }];\n\n this.btnSearch = ButtonIcon('search');\n this.attachClickEvent(this.btnSearch, (e) => {\n this.chat.initSearch();\n }, true);\n }\n\n public attachClickEvent(el: HTMLElement, cb: (e: MouseEvent) => void, noBlur?: boolean) {\n attachClickEvent(el, (e) => {\n cancelEvent(e);\n !noBlur && blurActiveElement();\n cb(e);\n }, {listenerSetter: this.listenerSetter});\n }\n\n private onCallClick(type: CallType) {\n this.chat.appImManager.callUser(this.peerId.toUserId(), type);\n }\n\n private onJoinGroupCallClick = () => {\n this.chat.appImManager.joinGroupCall(this.peerId);\n };\n\n private constructAvatar() {\n const avatarElement = new AvatarElement();\n avatarElement.isDialog = true;\n avatarElement.classList.add('avatar-42', 'person-avatar');\n return avatarElement;\n }\n\n private get peerId() {\n return this.chat.peerId;\n }\n\n public constructPeerHelpers() {\n this.avatarElement = this.constructAvatar();\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('info');\n\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\n\n this.btnJoin = Button('btn-primary btn-color-primary chat-join hide');\n this.btnCall = ButtonIcon('phone');\n this.btnGroupCall = ButtonIcon('videochat');\n this.btnPinned = ButtonIcon('pinlist');\n this.btnMute = ButtonIcon('mute');\n\n this.attachClickEvent(this.btnCall, this.onCallClick.bind(this, 'voice'));\n this.attachClickEvent(this.btnGroupCall, this.onJoinGroupCallClick);\n\n this.attachClickEvent(this.btnPinned, () => {\n this.openPinned(true);\n });\n\n this.attachClickEvent(this.btnMute, this.onMuteClick);\n\n this.attachClickEvent(this.btnJoin, async() => {\n const middleware = this.chat.bubbles.getMiddleware();\n this.btnJoin.setAttribute('disabled', 'true');\n\n const chatId = this.peerId.toChatId();\n let promise: Promise;\n if(await this.managers.appChatsManager.isChannel(chatId)) {\n promise = this.managers.appChatsManager.joinChannel(chatId);\n } else {\n promise = this.managers.appChatsManager.addChatUser(chatId, rootScope.myId);\n }\n\n promise.finally(() => {\n if(!middleware()) {\n return;\n }\n\n this.btnJoin.removeAttribute('disabled');\n });\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n const chat = await this.managers.appChatsManager.getChat(chatId) as Channel/* | Chat */;\n\n this.btnJoin.classList.toggle('hide', !(chat as Channel)?.pFlags?.left);\n this.setUtilsWidth();\n this.verifyButtons();\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(dialog.peerId === this.peerId) {\n this.setMutedState();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\n if(this.peerId === peerId) {\n this.verifyButtons();\n }\n });\n\n this.chat.addEventListener('setPeer', (mid, isTopMessage) => {\n const middleware = this.chat.bubbles.getMiddleware();\n apiManagerProxy.getState().then((state) => {\n if(!middleware() || !this.pinnedMessage) return;\n\n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[this.chat.peerId];\n\n if(isTopMessage) {\n this.pinnedMessage.unsetScrollDownListener();\n this.pinnedMessage.testMid(mid, 0); // * because slider will not let get bubble by document.elementFromPoint\n } else if(!this.pinnedMessage.locked) {\n this.pinnedMessage.handleFollowingPinnedMessage();\n this.pinnedMessage.testMid(mid);\n }\n });\n });\n\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids}) => {\n if(this.chat.type !== 'pinned' || peerId !== this.peerId) {\n return;\n }\n\n if(mids) {\n this.setTitle();\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n\n return this;\n }\n\n public openPinned(byCurrent: boolean) {\n this.chat.appImManager.setInnerPeer({\n peerId: this.peerId,\n lastMsgId: byCurrent ? +this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid : 0,\n type: 'pinned'\n });\n }\n\n private onMuteClick = () => {\n new PopupMute(this.peerId);\n };\n\n private onResize = () => {\n this.setUtilsWidth(true);\n this.setFloating();\n };\n\n private onChangeScreen = (from: ScreenSize, to: ScreenSize) => {\n this.container.classList.toggle('is-pinned-floating', mediaSizes.isMobile);\n // this.chatAudio && this.chatAudio.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.pinnedMessage && this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.onResize();\n };\n\n public destroy() {\n // this.chat.log.error('Topbar destroying');\n this.listenerSetter.removeAll();\n window.clearInterval(this.setPeerStatusInterval);\n\n this.pinnedMessage?.destroy(); // * возможно это можно не делать\n this.chatAudio?.destroy();\n\n delete this.chatAudio;\n delete this.pinnedMessage;\n }\n\n public cleanup() {\n if(!this.chat.peerId) {\n this.container.classList.add('hide');\n }\n }\n\n public async finishPeerChange(isTarget: boolean) {\n const {peerId, threadId} = this.chat;\n\n let newAvatar: AvatarElement;\n if(this.chat.type === 'chat') {\n if(this.avatarElement?.peerId !== this.peerId || this.avatarElement.threadId !== this.chat.threadId) {\n newAvatar = this.constructAvatar();\n } else {\n newAvatar = this.avatarElement;\n }\n }\n\n const [isBroadcast, isAnyChat, chat, _, setTitleCallback, setStatusCallback, state] = await Promise.all([\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.isAnyChat(peerId),\n peerId.isAnyChat() ? this.managers.appChatsManager.getChat(peerId.toChatId()) : undefined,\n newAvatar ? newAvatar.updateWithOptions({peerId, threadId, wrapOptions: {customEmojiSize: makeMediaSize(32, 32)}}) : undefined,\n this.setTitleManual(),\n this.setPeerStatusManual(true),\n apiManagerProxy.getState()\n ]);\n\n return () => {\n const canHaveSomeButtons = !(this.chat.type === 'pinned' || this.chat.type === 'scheduled');\n this.btnMute && this.btnMute.classList.toggle('hide', !isBroadcast || !canHaveSomeButtons);\n if(this.btnJoin) {\n if(isAnyChat && !this.chat.isRestricted && canHaveSomeButtons) {\n replaceContent(this.btnJoin, i18n(isBroadcast ? 'Chat.Subscribe' : 'ChannelJoin'));\n this.btnJoin.classList.toggle('hide', !(chat as MTChat.chat)?.pFlags?.left);\n } else {\n this.btnJoin.classList.add('hide');\n }\n }\n\n if(this.btnSearch) {\n this.btnSearch.classList.toggle('hide', !canHaveSomeButtons);\n }\n\n if(this.btnPinned) {\n this.btnPinned.classList.toggle('hide', !canHaveSomeButtons);\n }\n\n if(this.avatarElement !== newAvatar) {\n if(newAvatar) {\n if(this.avatarElement) {\n this.avatarElement.replaceWith(newAvatar);\n } else {\n this.person.prepend(newAvatar);\n }\n }\n\n this.avatarElement?.remove();\n this.avatarElement = newAvatar;\n }\n\n this.setUtilsWidth();\n\n this.verifyButtons();\n\n if(this.btnMore) {\n this.btnMore.classList.toggle('hide', !canHaveSomeButtons);\n }\n\n const isPinnedMessagesNeeded = this.chat.isPinnedMessagesNeeded();\n if(isPinnedMessagesNeeded || this.chat.type === 'discussion') {\n if(this.chat.wasAlreadyUsed || !this.pinnedMessage) { // * change\n const newPinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\n if(this.pinnedMessage) {\n this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(newPinnedMessage.pinnedMessageContainer.divAndCaption.container);\n this.pinnedMessage.destroy();\n // this.pinnedMessage.pinnedMessageContainer.toggle(true);\n } else {\n this.chatUtils.prepend(this.pinnedMessage.pinnedMessageContainer.divAndCaption.container);\n }\n\n this.pinnedMessage = newPinnedMessage;\n }\n\n if(isPinnedMessagesNeeded) {\n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[peerId];\n } else if(this.chat.type === 'discussion') {\n this.pinnedMessage.pinnedMid = this.chat.threadId;\n this.pinnedMessage.count = 1;\n this.pinnedMessage.pinnedIndex = 0;\n this.pinnedMessage._setPinnedMessage();\n }\n } else if(this.pinnedMessage) {\n this.pinnedMessage.destroy();\n this.pinnedMessage = undefined;\n }\n\n setTitleCallback();\n setStatusCallback?.();\n this.subtitle.classList.toggle('hide', !setStatusCallback);\n this.setMutedState();\n\n this.container.classList.remove('hide');\n };\n }\n\n public async setTitleManual(count?: number) {\n const {peerId, threadId} = this.chat;\n const middleware = () => this.chat.bubbles.getMiddleware();\n let titleEl: HTMLElement, icons: Element[];\n if(this.chat.type === 'pinned') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('PinnedMessagesCount', [count]);\n\n if(count === undefined) {\n this.managers.appMessagesManager.getSearchCounters(peerId, [{_: 'inputMessagesFilterPinned'}], false).then((result) => {\n if(!middleware()) return;\n const count = result[0].count;\n this.setTitle(count);\n\n // ! костыль х2, это нужно делать в другом месте\n if(!count) {\n this.chat.appImManager.setPeer(); // * close tab\n\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\n const originalChat = this.chat.appImManager.chat;\n if(originalChat.topbar.pinnedMessage) {\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\n }\n }\n });\n }\n } else if(this.chat.type === 'scheduled') {\n titleEl = i18n(peerId === rootScope.myId ? 'Reminders' : 'ScheduledMessages');\n } else if(this.chat.type === 'discussion') {\n if(count === undefined) {\n const result = await this.managers.acknowledged.appMessagesManager.getHistory(peerId, 0, 1, 0, threadId);\n if(!middleware()) return;\n if(result.cached) {\n const historyResult = await result.result;\n if(!middleware()) return;\n count = historyResult.count;\n } else result.result.then((historyResult) => {\n if(!middleware()) return;\n this.setTitle(historyResult.count);\n });\n }\n\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('Chat.Title.Comments', [count]);\n } else if(this.chat.type === 'chat') {\n [titleEl/* , icons */] = await Promise.all([\n wrapPeerTitle({\n peerId,\n dialog: true,\n withIcons: !threadId,\n threadId: threadId\n })\n // generateTitleIcons(peerId)\n ]);\n\n if(!middleware()) {\n return;\n }\n }\n\n return () => {\n replaceContent(this.title, titleEl);\n // if(icons) {\n // this.title.append(...icons);\n // }\n };\n }\n\n public setTitle(count?: number) {\n this.setTitleManual(count).then((setTitleCallback) => setTitleCallback());\n }\n\n public async setMutedState() {\n if(!this.btnMute) return;\n\n const peerId = this.peerId;\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted({peerId, respectType: false, threadId: this.chat.threadId});\n if(await this.managers.appPeersManager.isBroadcast(peerId)) { // not human\n this.btnMute.classList.remove('tgico-mute', 'tgico-unmute');\n this.btnMute.classList.add(muted ? 'tgico-unmute' : 'tgico-mute');\n this.btnMute.style.display = '';\n } else {\n this.btnMute.style.display = 'none';\n }\n }\n\n // ! У МЕНЯ ПРОСТО СГОРЕЛО, САФАРИ КОНЧЕННЫЙ БРАУЗЕР - ЕСЛИ НЕ СКРЫВАТЬ БЛОК, ТО ПРИ ПЕРЕВОРОТЕ ЭКРАНА НА АЙФОНЕ БЛОК БУДЕТ НЕПРАВИЛЬНО ШИРИНЫ, ДАЖЕ БЕЗ ЭТОЙ ФУНКЦИИ!\n public setUtilsWidth = (resize = false) => {\n // return;\n if(this.setUtilsRAF) window.cancelAnimationFrame(this.setUtilsRAF);\n\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.add('hide');\n }\n\n // mutationObserver.disconnect();\n this.setUtilsRAF = window.requestAnimationFrame(() => {\n // mutationRAF = window.requestAnimationFrame(() => {\n\n // setTimeout(() => {\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.remove('hide');\n }\n /* this.chatInfo.style.removeProperty('--utils-width');\n void this.chatInfo.offsetLeft; // reflow */\n const width = /* chatUtils.scrollWidth */this.chatUtils.getBoundingClientRect().width;\n this.chat.log('utils width:', width);\n this.container.style.setProperty('--utils-width', width + 'px');\n // this.chatInfo.classList.toggle('have-utils-width', !!width);\n // }, 0);\n\n this.setUtilsRAF = 0;\n\n // mutationObserver.observe(chatUtils, observeOptions);\n // });\n });\n };\n\n public setFloating = () => {\n const containers = [this.chatAudio, this.pinnedMessage?.pinnedMessageContainer].filter(Boolean);\n const count = containers.reduce((acc, container) => {\n const isFloating = container.isFloating();\n this.container.classList.toggle(`is-pinned-${container.className}-floating`, isFloating);\n\n if(!container.isVisible()) {\n return acc;\n }\n\n return acc + +isFloating;\n }, 0);\n this.container.dataset.floating = '' + count;\n };\n\n public setPeerStatusManual = async(needClear = false) => {\n if(!this.subtitle || this.chat.type !== 'chat') return;\n\n if(this.chat.threadId) {\n const title = await wrapPeerTitle({peerId: this.peerId, dialog: true});\n const span = i18n('TopicProfileStatus', [title]);\n return () => replaceContent(this.subtitle, span);\n }\n\n const peerId = this.peerId;\n return this.chat.appImManager.setPeerStatus({\n peerId,\n element: this.subtitle,\n needClear,\n useWhitespace: false,\n middleware: () => peerId === this.peerId\n });\n };\n\n public setPeerStatus = (needClear?: boolean) => {\n return this.setPeerStatusManual(needClear).then((callback) => {\n callback?.();\n });\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appSidebarRight from '..';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport AppSearch, {SearchGroup} from '../../appSearch';\nimport ButtonIcon from '../../buttonIcon';\nimport InputSearch from '../../inputSearch';\nimport PopupElement from '../../popups';\nimport PopupDatePicker from '../../popups/datePicker';\nimport {SliderSuperTab} from '../../slider';\n\nexport default class AppPrivateSearchTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private appSearch: AppSearch;\n private btnPickDate: HTMLElement;\n\n private peerId: PeerId;\n private threadId = 0;\n private query = '';\n private onDatePick: (timestamp: number) => void;\n\n onOpenAfterTimeout() {\n this.appSearch.beginSearch(this.peerId, this.threadId, this.query);\n }\n\n public init(\n peerId: PeerId,\n threadId?: number,\n onDatePick?: AppPrivateSearchTab['onDatePick'],\n query?: string\n ) {\n this.container.id = 'search-private-container';\n this.container.classList.add('chatlist-container');\n this.inputSearch = new InputSearch('Search');\n this.title.replaceWith(this.inputSearch.container);\n\n this.btnPickDate = ButtonIcon('calendar sidebar-header-right');\n this.header.append(this.btnPickDate);\n\n const c = document.createElement('div');\n c.classList.add('chatlist-container');\n this.scrollable.container.replaceWith(c);\n this.appSearch = new AppSearch(c, this.inputSearch, {\n messages: new SearchGroup('Chat.Search.PrivateSearch', 'messages')\n });\n\n if(!this.peerId) {\n this.query = query;\n this.peerId = peerId;\n this.threadId = threadId;\n this.onDatePick = onDatePick;\n\n this.btnPickDate.classList.toggle('hide', !this.onDatePick);\n if(this.onDatePick) {\n attachClickEvent(this.btnPickDate, () => {\n PopupElement.createPopup(PopupDatePicker, new Date(), this.onDatePick).show();\n });\n }\n\n query && this.appSearch.searchInput.inputField.setValueSilently(query);\n\n appSidebarRight.toggleSidebar(true);\n } else {\n this.appSearch.beginSearch(this.peerId, this.threadId, query);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatTopbar from './topbar';\nimport AppSearch, {SearchGroup} from '../appSearch';\nimport PopupDatePicker from '../popups/datePicker';\nimport ripple from '../ripple';\nimport InputSearch from '../inputSearch';\nimport type Chat from './chat';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport whichChild from '../../helpers/dom/whichChild';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {i18n} from '../../lib/langPack';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport PopupElement from '../popups';\nimport {DIALOG_LIST_ELEMENT_TAG} from '../../lib/appManagers/appDialogsManager';\n\nexport default class ChatSearch {\n private element: HTMLElement;\n private backBtn: HTMLElement;\n private inputSearch: InputSearch;\n\n private results: HTMLElement;\n\n private footer: HTMLElement;\n private dateBtn: HTMLElement;\n private foundCountEl: HTMLElement;\n private controls: HTMLElement;\n private downBtn: HTMLElement;\n private upBtn: HTMLElement;\n\n private appSearch: AppSearch;\n private searchGroup: SearchGroup;\n\n private foundCount = 0;\n private selectedIndex = 0;\n private setPeerPromise: Promise;\n private listenerSetter: ListenerSetter;\n private navigationItem: NavigationItem;\n\n constructor(private topbar: ChatTopbar, private chat: Chat, query?: string) {\n this.element = document.createElement('div');\n this.element.classList.add('sidebar-header', 'chat-search', 'chatlist-container');\n\n this.backBtn = document.createElement('button');\n this.backBtn.classList.add('btn-icon', 'tgico-left', 'sidebar-close-button');\n ripple(this.backBtn);\n\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n const attachClick = (element: HTMLElement, callback: (e: MouseEvent) => void) => {\n attachClickEvent(element, callback, {listenerSetter});\n };\n\n attachClick(this.backBtn, () => {\n this.destroy();\n });\n\n this.inputSearch = new InputSearch('Search');\n\n // Results\n this.results = document.createElement('div');\n this.results.classList.add('chat-search-results', 'chatlist-container');\n\n this.searchGroup = new SearchGroup(false, 'messages', undefined, '', false);\n attachClick(this.searchGroup.list, this.onResultsClick);\n\n this.appSearch = new AppSearch(this.results, this.inputSearch, {\n messages: this.searchGroup\n }, (count) => {\n this.foundCount = count;\n\n if(!this.foundCount) {\n replaceContent(this.foundCountEl, this.inputSearch.value ? i18n('NoResult') : '');\n this.results.classList.remove('active');\n this.chat.bubbles.container.classList.remove('search-results-active');\n this.upBtn.setAttribute('disabled', 'true');\n this.downBtn.setAttribute('disabled', 'true');\n } else {\n this.selectResult(this.searchGroup.list.children[0] as HTMLElement);\n }\n });\n this.appSearch.beginSearch(this.chat.peerId, this.chat.threadId);\n\n // appImManager.topbar.parentElement.insertBefore(this.results, appImManager.bubblesContainer);\n this.chat.bubbles.container.append(this.results);\n\n // Footer\n this.footer = document.createElement('div');\n this.footer.classList.add('chat-search-footer');\n\n attachClick(this.footer, this.onFooterClick);\n ripple(this.footer);\n\n this.foundCountEl = document.createElement('span');\n this.foundCountEl.classList.add('chat-search-count');\n\n this.dateBtn = document.createElement('button');\n this.dateBtn.classList.add('btn-icon', 'tgico-calendar');\n\n this.controls = document.createElement('div');\n this.controls.classList.add('chat-search-controls');\n\n this.upBtn = document.createElement('button');\n this.upBtn.classList.add('btn-icon', 'tgico-up');\n this.downBtn = document.createElement('button');\n this.downBtn.classList.add('btn-icon', 'tgico-down');\n\n this.upBtn.setAttribute('disabled', 'true');\n this.downBtn.setAttribute('disabled', 'true');\n\n attachClick(this.dateBtn, this.onDateClick);\n attachClick(this.upBtn, this.onUpClick);\n attachClick(this.downBtn, this.onDownClick);\n this.controls.append(this.upBtn, this.downBtn);\n\n this.footer.append(this.foundCountEl, this.dateBtn, this.controls);\n\n this.topbar.container.parentElement.insertBefore(this.footer, chat.input.chatInput);\n\n // Append container\n this.element.append(this.backBtn, this.inputSearch.container);\n\n this.topbar.container.classList.add('hide-pinned');\n this.topbar.container.parentElement.append(this.element);\n\n this.inputSearch.input.focus();\n\n if(query) {\n this.setQuery(query);\n }\n\n if(!IS_MOBILE_SAFARI) {\n this.navigationItem = {\n type: 'mobile-search',\n onPop: () => {\n this.destroy();\n }\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n }\n\n public destroy() {\n this.topbar.container.classList.remove('hide-pinned');\n this.element.remove();\n this.inputSearch.remove();\n this.results.remove();\n this.footer.remove();\n this.listenerSetter.removeAll();\n this.chat.bubbles.container.classList.remove('search-results-active');\n this.chat.search = undefined;\n appNavigationController.removeItem(this.navigationItem);\n }\n\n public setQuery(query: string) {\n this.inputSearch.inputField.value = query;\n }\n\n private onDateClick = (e: MouseEvent) => {\n cancelEvent(e);\n PopupElement.createPopup(PopupDatePicker, new Date(), this.chat.bubbles.onDatePick).show();\n };\n\n private selectResult(elem: HTMLElement) {\n if(this.setPeerPromise) return this.setPeerPromise;\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n\n const index = whichChild(elem);\n\n if(index === (this.foundCount - 1)) {\n this.upBtn.setAttribute('disabled', 'true');\n } else {\n this.upBtn.removeAttribute('disabled');\n }\n\n if(!index) {\n this.downBtn.setAttribute('disabled', 'true');\n } else {\n this.downBtn.removeAttribute('disabled');\n }\n\n this.results.classList.remove('active');\n this.chat.bubbles.container.classList.remove('search-results-active');\n\n const res = this.chat.setPeer({peerId, lastMsgId});\n this.setPeerPromise = ((res instanceof Promise ? res : Promise.resolve(res)) as Promise).then(() => {\n this.selectedIndex = index;\n replaceContent(this.foundCountEl, i18n('Of', [index + 1, this.foundCount]));\n\n const renderedCount = this.searchGroup.list.childElementCount;\n if(this.selectedIndex >= (renderedCount - 6)) {\n this.appSearch.searchMore();\n }\n }).finally(() => {\n this.setPeerPromise = null;\n });\n }\n\n private onResultsClick = (e: MouseEvent) => {\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(target) {\n this.selectResult(target);\n }\n };\n\n private onFooterClick = (e: MouseEvent) => {\n if(this.foundCount) {\n this.chat.bubbles.container.classList.toggle('search-results-active');\n this.results.classList.toggle('active');\n }\n };\n\n private onUpClick = (e: MouseEvent) => {\n cancelEvent(e);\n this.selectResult(this.searchGroup.list.children[this.selectedIndex + 1] as HTMLElement);\n };\n\n private onDownClick = (e: MouseEvent) => {\n cancelEvent(e);\n this.selectResult(this.searchGroup.list.children[this.selectedIndex - 1] as HTMLElement);\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport windowSize from '../../helpers/windowSize';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\n\ntype ChatBackgroundPatternRendererInitOptions = {\n url: string,\n width: number,\n height: number,\n mask?: boolean\n};\n\nexport default class ChatBackgroundPatternRenderer {\n private static INSTANCES: ChatBackgroundPatternRenderer[] = [];\n\n // private pattern: CanvasPattern;\n private objectUrl: string;\n private options: ChatBackgroundPatternRendererInitOptions;\n private canvases: Set;\n // private createCanvasPatternPromise: Promise;\n // private exportCanvasPatternToImagePromise: Promise;\n private renderImageFromUrlPromise: Promise;\n private image: HTMLImageElement;\n private imageBitmap: ImageBitmap;\n\n constructor() {\n this.canvases = new Set();\n }\n\n public static getInstance(options: ChatBackgroundPatternRendererInitOptions) {\n let instance = this.INSTANCES.find((instance) => {\n return deepEqual(instance.options, options);\n });\n\n if(!instance) {\n instance = new ChatBackgroundPatternRenderer();\n instance.init(options);\n this.INSTANCES.push(instance);\n }\n\n return instance;\n }\n\n public init(options: ChatBackgroundPatternRendererInitOptions) {\n // if(this.options) {\n // if(this.options.width !== options.width || this.options.height !== options.height) {\n // this.createCanvasPatternPromise =\n // this.pattern =\n // this.exportCanvasPatternToImagePromise =\n // undefined;\n // }\n // }\n\n this.options = options;\n }\n\n public renderToCanvas(canvas: HTMLCanvasElement) {\n // return this.createCanvasPattern(canvas).then(() => {\n // return this.fillCanvas(canvas);\n // });\n\n return this.renderImageFromUrl(this.options.url).then(() => {\n return this.fillCanvas(canvas);\n });\n }\n\n private renderImageFromUrl(url: string) {\n if(this.renderImageFromUrlPromise) return this.renderImageFromUrlPromise;\n const img = this.image = document.createElement('img');\n img.crossOrigin = 'anonymous';\n return this.renderImageFromUrlPromise = renderImageFromUrlPromise(img, url, false).then(() => {\n if(!IS_IMAGE_BITMAP_SUPPORTED) {\n return img;\n }\n\n return createImageBitmap(img, {\n resizeWidth: 1440,\n resizeHeight: 2960\n }).then((imageBitmap) => {\n this.imageBitmap = imageBitmap;\n return img;\n });\n });\n }\n\n /* private createCanvasPattern(canvas: HTMLCanvasElement) {\n if(this.createCanvasPatternPromise) return this.createCanvasPatternPromise;\n return this.createCanvasPatternPromise = this.renderImageFromUrl(this.options.url).then((img) => {\n let createPatternFrom: HTMLImageElement | HTMLCanvasElement;\n if(IS_SAFARI) {\n const canvas = createPatternFrom = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n } else {\n createPatternFrom = img;\n }\n\n const perf = performance.now();\n this.pattern = canvas.getContext('2d').createPattern(createPatternFrom, 'repeat-x');\n console.warn('creating pattern time:', performance.now() - perf);\n\n return this.pattern;\n });\n }\n\n public exportCanvasPatternToImage(canvas: HTMLCanvasElement) {\n if(this.exportCanvasPatternToImagePromise) return this.exportCanvasPatternToImagePromise;\n return this.exportCanvasPatternToImagePromise = new Promise((resolve) => {\n canvas.toBlob((blob) => {\n const newUrl = this.objectUrl = URL.createObjectURL(blob);\n resolve(newUrl);\n }, 'image/png');\n });\n } */\n\n public cleanup(canvas: HTMLCanvasElement) {\n this.canvases.delete(canvas);\n\n if(!this.canvases.size) {\n indexOfAndSplice(ChatBackgroundPatternRenderer.INSTANCES, this);\n\n if(this.objectUrl) {\n this.imageBitmap?.close();\n URL.revokeObjectURL(this.objectUrl);\n }\n }\n }\n\n public fillCanvas(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n const {width, height} = canvas;\n // const perf = performance.now();\n // if(context.fillStyle instanceof CanvasPattern) {\n // context.clearRect(0, 0, width, height);\n // }\n\n const source = this.imageBitmap || this.image;\n\n let imageWidth = source.width, imageHeight = source.height;\n // let patternHeight = 1480 * canvas.dpr;\n // if(+canvas.dataset.originalHeight !== height) patternHeight *= .6875;\n const patternHeight = (500 + (windowSize.height / 2.5)) * canvas.dpr;\n const ratio = patternHeight / imageHeight;\n imageWidth *= ratio;\n imageHeight = patternHeight;\n\n if(this.options.mask) {\n context.fillStyle = '#000';\n context.fillRect(0, 0, width, height);\n context.globalCompositeOperation = 'destination-out';\n } else {\n context.globalCompositeOperation = 'source-over';\n }\n\n const d = (y: number) => {\n for(let x = 0; x < width; x += imageWidth) {\n context.drawImage(source, x, y, imageWidth, imageHeight);\n }\n };\n\n const centerY = (height - imageHeight) / 2;\n d(centerY);\n\n if(centerY > 0) {\n let topY = centerY;\n do {\n d(topY -= imageHeight);\n } while(topY >= 0);\n }\n\n const endY = height - 1;\n for(let bottomY = centerY + imageHeight; bottomY < endY; bottomY += imageHeight) {\n d(bottomY);\n }\n\n // for(let x = 0; x < width; x += imageWidth) {\n // for(let y = 0; y < height; y += imageHeight) {\n // context.drawImage(img, x, y, imageWidth, imageHeight);\n // }\n // }\n // context.fillStyle = this.pattern;\n // context.fillRect(0, 0, width, height);\n // console.warn('fill canvas time', performance.now() - perf);\n }\n\n public setCanvasDimensions(canvas: HTMLCanvasElement) {\n const devicePixelRatio = Math.min(2, window.devicePixelRatio);\n const width = this.options.width * devicePixelRatio;\n let height = this.options.height * devicePixelRatio;\n\n canvas.dpr = devicePixelRatio;\n canvas.dataset.originalHeight = '' + height;\n if(mediaSizes.activeScreen === ScreenSize.large) height *= 1.5;\n canvas.width = width;\n canvas.height = height;\n }\n\n public createCanvas() {\n const canvas = document.createElement('canvas');\n this.canvases.add(canvas);\n this.setCanvasDimensions(canvas);\n return canvas;\n }\n\n public resize(width: number, height: number) {\n this.init({\n ...this.options,\n width,\n height\n });\n\n const promises: Promise[] = [];\n for(const canvas of this.canvases) {\n this.setCanvasDimensions(canvas);\n promises.push(this.renderToCanvas(canvas));\n }\n\n return Promise.all(promises);\n }\n\n public static resizeInstances(width: number, height: number) {\n return Promise.all(this.INSTANCES.map((instance) => instance.resize(width, height)));\n }\n\n /* public setResizeMode(resizing: boolean) {\n const canvases = Array.from(this.canvases);\n const canvas = canvases[canvases.length - 1];\n canvas.style.display = resizing ? 'none' : '';\n const img = this.img;\n img.style.display = resizing ? '' : 'none';\n\n return {img, canvas};\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ChatRights} from '../../lib/appManagers/appChatsManager';\nimport type {AppImManager, ChatSetPeerOptions} from '../../lib/appManagers/appImManager';\nimport type {MessageSendingParams, MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {logger, LogTypes} from '../../lib/logger';\nimport rootScope from '../../lib/rootScope';\nimport appSidebarRight from '../sidebarRight';\nimport ChatBubbles from './bubbles';\nimport ChatContextMenu from './contextMenu';\nimport ChatInput from './input';\nimport ChatSelection from './selection';\nimport ChatTopbar from './topbar';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport SetTransition from '../singleTransition';\nimport AppPrivateSearchTab from '../sidebarRight/tabs/search';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport ChatSearch from './search';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport getAutoDownloadSettingsByPeerId, {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport ChatBackgroundGradientRenderer from './gradientRenderer';\nimport ChatBackgroundPatternRenderer from './patternRenderer';\nimport pause from '../../helpers/schedulers/pause';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport SlicedArray from '../../helpers/slicedArray';\nimport themeController from '../../helpers/themeController';\nimport AppSharedMediaTab from '../sidebarRight/tabs/sharedMedia';\nimport noop from '../../helpers/noop';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {Message} from '../../layer';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\n\nexport type ChatType = 'chat' | 'pinned' | 'discussion' | 'scheduled';\n\nexport default class Chat extends EventListenerBase<{\n setPeer: (mid: number, isTopMessage: boolean) => void\n}> {\n public container: HTMLElement;\n public backgroundEl: HTMLElement;\n\n public topbar: ChatTopbar;\n public bubbles: ChatBubbles;\n public input: ChatInput;\n public selection: ChatSelection;\n public contextMenu: ChatContextMenu;\n public search: ChatSearch;\n\n public wasAlreadyUsed: boolean;\n // public initPeerId = 0;\n public peerId: PeerId;\n public threadId: number;\n public setPeerPromise: Promise;\n public peerChanged: boolean;\n\n public log: ReturnType;\n\n public type: ChatType;\n public messagesStorageKey: MessagesStorageKey;\n\n public noForwards: boolean;\n\n public inited: boolean;\n\n public isRestricted: boolean;\n public autoDownload: ChatAutoDownloadSettings;\n\n public gradientRenderer: ChatBackgroundGradientRenderer;\n public patternRenderer: ChatBackgroundPatternRenderer;\n public gradientCanvas: HTMLCanvasElement;\n public patternCanvas: HTMLCanvasElement;\n public backgroundTempId: number;\n public setBackgroundPromise: Promise;\n public sharedMediaTab: AppSharedMediaTab;\n public sharedMediaTabs: AppSharedMediaTab[];\n // public renderDarkPattern: () => Promise;\n\n public isBot: boolean;\n public isChannel: boolean;\n public isBroadcast: boolean;\n public isAnyGroup: boolean;\n public isMegagroup: boolean;\n public isForum: boolean;\n public isAllMessagesForum: boolean;\n\n public animationGroup: AnimationItemGroup;\n\n constructor(\n public appImManager: AppImManager,\n public managers: AppManagers\n ) {\n super();\n\n this.type = 'chat';\n this.animationGroup = `chat-${Math.round(Math.random() * 65535)}`;\n\n this.container = document.createElement('div');\n this.container.classList.add('chat', 'tabs-tab');\n\n this.backgroundEl = document.createElement('div');\n this.backgroundEl.classList.add('chat-background');\n\n // * constructor end\n\n this.log = logger('CHAT', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n this.log.warn('constructor');\n\n this.peerId = NULL_PEER_ID;\n\n this.container.append(this.backgroundEl);\n this.appImManager.chatsContainer.append(this.container);\n\n this.backgroundTempId = 0;\n this.sharedMediaTabs = [];\n }\n\n public setBackground(url: string, skipAnimation?: boolean): Promise {\n const theme = themeController.getTheme();\n\n let item: HTMLElement;\n const isColorBackground = !!theme.background.color && !theme.background.slug && !theme.background.intensity;\n if(\n isColorBackground &&\n document.documentElement.style.cursor === 'grabbing' &&\n this.gradientRenderer &&\n !this.patternRenderer\n ) {\n this.gradientCanvas.dataset.colors = theme.background.color;\n this.gradientRenderer.init(this.gradientCanvas);\n return Promise.resolve();\n }\n\n const tempId = ++this.backgroundTempId;\n\n const previousGradientRenderer = this.gradientRenderer;\n const previousPatternRenderer = this.patternRenderer;\n const previousGradientCanvas = this.gradientCanvas;\n const previousPatternCanvas = this.patternCanvas;\n\n this.gradientRenderer =\n this.patternRenderer =\n this.gradientCanvas =\n this.patternCanvas =\n // this.renderDarkPattern =\n undefined;\n\n const intensity = theme.background.intensity && theme.background.intensity / 100;\n const isDarkPattern = !!intensity && intensity < 0;\n\n let patternRenderer: ChatBackgroundPatternRenderer;\n let patternCanvas = item?.firstElementChild as HTMLCanvasElement;\n let gradientCanvas: HTMLCanvasElement;\n if(!item) {\n item = document.createElement('div');\n item.classList.add('chat-background-item');\n\n if(url) {\n if(intensity) {\n item.classList.add('is-pattern');\n\n const rect = this.appImManager.chatsContainer.getBoundingClientRect();\n patternRenderer = this.patternRenderer = ChatBackgroundPatternRenderer.getInstance({\n url,\n width: rect.width,\n height: rect.height,\n mask: isDarkPattern\n });\n\n patternCanvas = this.patternCanvas = patternRenderer.createCanvas();\n patternCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-pattern-canvas');\n\n if(isDarkPattern) {\n item.classList.add('is-dark');\n }\n\n // if(isDarkPattern) {\n // this.renderDarkPattern = () => {\n // return patternRenderer.exportCanvasPatternToImage(patternCanvas).then((url) => {\n // if(this.backgroundTempId !== tempId) {\n // return;\n // }\n\n // gradientCanvas.style.webkitMaskImage = `url(${url})`;\n // });\n // };\n // }\n } else if(theme.background.slug) {\n item.classList.add('is-image');\n }\n } else if(theme.background.color) {\n item.classList.add('is-color');\n }\n }\n\n let gradientRenderer: ChatBackgroundGradientRenderer;\n const color = theme.background.color;\n if(color) {\n // if(color.includes(',')) {\n const {canvas, gradientRenderer: _gradientRenderer} = ChatBackgroundGradientRenderer.create(color);\n gradientRenderer = this.gradientRenderer = _gradientRenderer;\n gradientCanvas = this.gradientCanvas = canvas;\n gradientCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-color-canvas');\n\n if(rootScope.settings.animationsEnabled) {\n gradientRenderer.scrollAnimate(true);\n }\n // } else {\n // item.style.backgroundColor = color;\n // item.style.backgroundImage = 'none';\n // }\n }\n\n if(patternRenderer) {\n const setOpacityTo = isDarkPattern ? gradientCanvas : patternCanvas;\n setOpacityTo.style.setProperty('--opacity-max', '' + (Math.abs(intensity) * (isDarkPattern ? .5 : 1)));\n }\n\n const promise = new Promise((resolve) => {\n const cb = () => {\n if(this.backgroundTempId !== tempId) {\n if(patternRenderer) {\n patternRenderer.cleanup(patternCanvas);\n }\n\n if(gradientRenderer) {\n gradientRenderer.cleanup();\n }\n\n return;\n }\n\n const prev = this.backgroundEl.lastElementChild as HTMLElement;\n\n if(prev === item) {\n resolve();\n return;\n }\n\n const append = [\n gradientCanvas,\n // isDarkPattern && this.renderDarkPattern ? undefined : patternCanvas\n patternCanvas\n ].filter(Boolean);\n if(append.length) {\n item.append(...append);\n }\n\n this.backgroundEl.append(item);\n\n SetTransition({\n element: item,\n className: 'is-visible',\n forwards: true,\n duration: !skipAnimation ? 200 : 0,\n onTransitionEnd: prev ? () => {\n previousPatternRenderer?.cleanup(previousPatternCanvas);\n previousGradientRenderer?.cleanup();\n\n prev.remove();\n } : null,\n useRafs: 2\n });\n\n resolve();\n };\n\n if(patternRenderer) {\n const renderPatternPromise = patternRenderer.renderToCanvas(patternCanvas);\n renderPatternPromise.then(() => {\n if(this.backgroundTempId !== tempId) {\n return;\n }\n\n // let promise: Promise;\n // if(isDarkPattern && this.renderDarkPattern) {\n // promise = this.renderDarkPattern();\n // } else {\n // const promise = Promise.resolve();\n // }\n\n // promise.then(cb);\n cb();\n });\n } else if(url) {\n renderImageFromUrl(item, url, cb);\n } else {\n cb();\n }\n });\n\n return this.setBackgroundPromise = Promise.race([\n pause(500),\n promise\n ]);\n }\n\n public setType(type: ChatType) {\n this.type = type;\n }\n\n public init(/* peerId: PeerId */) {\n // this.initPeerId = peerId;\n\n this.topbar = new ChatTopbar(this, appSidebarRight, this.managers);\n this.bubbles = new ChatBubbles(this, this.managers);\n this.input = new ChatInput(this, this.appImManager, this.managers);\n this.contextMenu = new ChatContextMenu(this, this.managers);\n this.selection = new ChatSelection(this, this.bubbles, this.input, this.managers);\n\n this.topbar.constructUtils();\n this.topbar.constructPeerHelpers();\n\n this.topbar.construct();\n this.input.construct();\n\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n\n if(!IS_TOUCH_SUPPORTED) {\n this.bubbles.setReactionsHoverListeners();\n }\n\n this.bubbles.attachContainerListeners();\n\n this.container.append(this.topbar.container, this.bubbles.container, this.input.chatInput);\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.peerId === migrateFrom) {\n this.setPeer({peerId: migrateTo});\n }\n });\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_drop', (dialog) => {\n if(dialog.peerId === this.peerId && (dialog._ === 'dialog' || this.threadId === dialog.id)) {\n this.appImManager.setPeer();\n }\n });\n\n this.bubbles.listenerSetter.add(this.appImManager)('chat_changing', ({to}) => {\n const freeze = to !== this;\n\n const cb = () => {\n this.bubbles.observer?.toggleObservingNew(freeze);\n animationIntersector.toggleIntersectionGroup(this.animationGroup, freeze);\n if(freeze) {\n animationIntersector.checkAnimations(freeze, this.animationGroup);\n }\n };\n\n if(!freeze) {\n setTimeout(() => {\n cb();\n }, 400);\n } else {\n cb();\n }\n });\n }\n\n public beforeDestroy() {\n this.bubbles.cleanup();\n }\n\n private cleanupBackground() {\n ++this.backgroundTempId;\n if(this.patternRenderer) {\n this.patternRenderer.cleanup(this.patternCanvas);\n this.patternRenderer = undefined;\n }\n\n if(this.gradientRenderer) {\n this.gradientRenderer.cleanup();\n this.gradientRenderer = undefined;\n }\n }\n\n public destroy() {\n // const perf = performance.now();\n\n this.destroySharedMediaTab();\n this.topbar.destroy();\n this.bubbles.destroy();\n this.input.destroy();\n this.contextMenu && this.contextMenu.destroy();\n this.selection && this.selection.attachListeners(undefined, undefined);\n\n this.cleanupBackground();\n\n delete this.topbar;\n delete this.bubbles;\n delete this.input;\n delete this.selection;\n delete this.contextMenu;\n\n this.container.remove();\n\n // this.log.error('Chat destroy time:', performance.now() - perf);\n }\n\n public cleanup(helperToo = true) {\n this.input.cleanup(helperToo);\n this.topbar.cleanup();\n this.selection.cleanup();\n }\n\n public get isForumTopic() {\n return !!(this.isForum && this.threadId);\n }\n\n public async onChangePeer(options: ChatSetPeerOptions, m: ReturnType) {\n const {peerId, threadId} = this;\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n searchTab?.close();\n\n const [\n noForwards,\n isRestricted,\n isAnyGroup,\n _,\n isMegagroup,\n isBroadcast,\n isChannel,\n isBot,\n isForum\n ] = await m(Promise.all([\n this.managers.appPeersManager.noForwards(peerId),\n this.managers.appPeersManager.isPeerRestricted(peerId),\n this._isAnyGroup(peerId),\n this.setAutoDownloadMedia(),\n this.managers.appPeersManager.isMegagroup(peerId),\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.isChannel(peerId),\n this.managers.appPeersManager.isBot(peerId),\n this.managers.appPeersManager.isForum(peerId)\n ]));\n\n // ! WARNING: TEMPORARY, HAVE TO GET TOPIC\n if(isForum && threadId) {\n await m(this.managers.dialogsStorage.getForumTopicOrReload(peerId, threadId));\n }\n\n this.noForwards = noForwards;\n this.isRestricted = isRestricted;\n this.isAnyGroup = isAnyGroup;\n this.isMegagroup = isMegagroup;\n this.isBroadcast = isBroadcast;\n this.isChannel = isChannel;\n this.isBot = isBot;\n this.isForum = isForum;\n this.isAllMessagesForum = isForum && !threadId;\n\n if(threadId && !this.isForum) {\n options.type = 'discussion';\n }\n\n const type = options.type ?? 'chat';\n this.setType(type);\n\n this.messagesStorageKey = `${this.peerId}_${this.type === 'scheduled' ? 'scheduled' : 'history'}`;\n\n this.container.classList.toggle('no-forwards', this.noForwards);\n\n this.sharedMediaTab = appSidebarRight.createSharedMediaTab();\n this.sharedMediaTabs.push(this.sharedMediaTab);\n\n this.sharedMediaTab.setPeer(peerId, threadId);\n this.input.clearHelper(); // костыль\n this.selection.cleanup(); // TODO: REFACTOR !!!!!!\n }\n\n public setPeer(options: ChatSetPeerOptions) {\n const {peerId, threadId} = options;\n if(!peerId) {\n this.inited = undefined;\n } else if(!this.inited) {\n if(this.init) {\n this.init(/* peerId */);\n this.init = null;\n }\n\n this.inited = true;\n }\n\n // const appMediaViewer = (window as any).appMediaViewer as AppMediaViewerBase;\n // if(appMediaViewer) {\n // appMediaViewer.close();\n // }\n\n const samePeer = this.appImManager.isSamePeer(this, options);\n if(!samePeer) {\n this.appImManager.dispatchEvent('peer_changing', this);\n this.peerId = peerId || NULL_PEER_ID;\n this.threadId = threadId;\n } else if(this.setPeerPromise) {\n return;\n }\n\n if(!peerId) {\n appSidebarRight.toggleSidebar(false);\n this.cleanup(true);\n this.bubbles.setPeer({samePeer: false, peerId});\n this.peerId = 0;\n this.appImManager.dispatchEvent('peer_changed', this);\n\n appSidebarRight.replaceSharedMediaTab();\n this.destroySharedMediaTab();\n this.sharedMediaTab = undefined;\n\n return;\n }\n\n this.peerChanged = samePeer;\n\n const bubblesSetPeerPromise = this.bubbles.setPeer({...options, samePeer});\n const setPeerPromise = this.setPeerPromise = bubblesSetPeerPromise.then((result) => {\n return result.promise;\n }).catch(noop).finally(() => {\n if(this.setPeerPromise === setPeerPromise) {\n this.setPeerPromise = null;\n }\n });\n\n return bubblesSetPeerPromise;\n }\n\n public destroySharedMediaTab(tab = this.sharedMediaTab) {\n if(!tab) {\n return;\n }\n\n indexOfAndSplice(this.sharedMediaTabs, tab);\n tab.destroy();\n }\n\n public async setAutoDownloadMedia() {\n this.autoDownload = await getAutoDownloadSettingsByPeerId(this.peerId);\n }\n\n public setMessageId(messageId?: number) {\n return this.setPeer({\n peerId: this.peerId,\n threadId: this.threadId,\n lastMsgId: messageId\n });\n }\n\n public async finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number, startParam?: string) {\n if(this.peerChanged) return;\n\n const peerId = this.peerId;\n this.peerChanged = true;\n this.wasAlreadyUsed = true;\n\n const middleware = this.bubbles.getMiddleware();\n\n this.cleanup(false);\n\n const sharedMediaTab = this.sharedMediaTab;\n\n const callbacksPromise = Promise.all([\n this.topbar.finishPeerChange(isTarget),\n this.bubbles.finishPeerChange(),\n this.input.finishPeerChange(startParam),\n sharedMediaTab.fillProfileElements()\n ]);\n\n const callbacks = await callbacksPromise;\n sharedMediaTab.loadSidebarMedia(true);\n\n if(!middleware()) {\n return;\n }\n\n callbacks.forEach((callback) => {\n callback?.();\n });\n\n appSidebarRight.replaceSharedMediaTab(sharedMediaTab);\n\n this.sharedMediaTabs.filter((tab) => tab !== sharedMediaTab).forEach((tab) => this.destroySharedMediaTab(tab));\n\n this.container.dataset.type = this.type;\n this.log.setPrefix('CHAT-' + peerId + '-' + this.type);\n\n this.appImManager.dispatchEvent('peer_changed', this);\n }\n\n public getMessage(mid: number) {\n return this.managers.appMessagesManager.getMessageFromStorage(this.messagesStorageKey, mid);\n }\n\n public async getMidsByMid(mid: number) {\n return this.managers.appMessagesManager.getMidsByMessage(await this.getMessage(mid));\n }\n\n public getHistoryStorage(ignoreThreadId?: boolean) {\n return this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId, ignoreThreadId ? undefined : this.threadId)\n .then((historyStorageTransferable) => {\n return {\n ...historyStorageTransferable,\n history: SlicedArray.fromJSON(historyStorageTransferable.historySerialized)\n }\n });\n }\n\n public getDialogOrTopic() {\n return this.isForum && this.threadId ? this.managers.dialogsStorage.getForumTopic(this.peerId, this.threadId) : this.managers.dialogsStorage.getDialogOnly(this.peerId);\n }\n\n public getHistoryMaxId() {\n return this.getHistoryStorage().then((historyStorage) => historyStorage.maxId);\n }\n\n public async _isAnyGroup(peerId: PeerId) {\n return peerId === rootScope.myId || peerId === REPLIES_PEER_ID || (await this.managers.appPeersManager.isAnyGroup(peerId));\n }\n\n public initSearch(query?: string) {\n if(!this.peerId) return;\n\n if(mediaSizes.isMobile) {\n if(!this.search) {\n this.search = new ChatSearch(this.topbar, this, query);\n } else {\n this.search.setQuery(query);\n }\n } else {\n let tab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(!tab) {\n tab = appSidebarRight.createTab(AppPrivateSearchTab);\n }\n\n tab.open(this.peerId, this.threadId, this.bubbles.onDatePick, query);\n }\n }\n\n public canSend(action?: ChatRights) {\n return this.managers.appMessagesManager.canSendToPeer(this.peerId, this.threadId, action);\n }\n\n public isStartButtonNeeded() {\n return Promise.all([\n this.managers.appPeersManager.isBot(this.peerId),\n this.managers.appMessagesManager.getDialogOnly(this.peerId),\n this.getHistoryStorage(true)\n ]).then(([isBot, dialog, historyStorage]) => {\n return isBot && !dialog && !historyStorage.history.length;\n });\n }\n\n public getMessageSendingParams(): MessageSendingParams {\n return {\n threadId: this.threadId,\n replyToMsgId: this.input.replyToMsgId,\n scheduleDate: this.input.scheduleDate,\n silent: this.input.sendSilent,\n sendAsPeerId: this.input.sendAsPeerId\n };\n }\n\n public isOurMessage(message: Message.message | Message.messageService) {\n return message.fromId === rootScope.myId || (!!message.pFlags.out && this.isMegagroup);\n }\n\n public isOutMessage(message: Message.message | Message.messageService) {\n const fwdFrom = (message as Message.message).fwd_from;\n const isOut = this.isOurMessage(message) && (!fwdFrom || this.peerId !== rootScope.myId);\n return !!isOut;\n }\n\n public isAvatarNeeded(message: Message.message | Message.messageService) {\n return this.isAnyGroup && !this.isOutMessage(message);\n }\n\n public isPinnedMessagesNeeded() {\n return this.type === 'chat' || this.isForum;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {State} from '../config/state';\nimport rootScope from '../lib/rootScope';\n\nexport type ChatAutoDownloadSettings = {\n photo: number,\n video: number,\n file: number\n};\n\nexport default async function getAutoDownloadSettingsByPeerId(peerId: PeerId): Promise {\n let type: keyof State['settings']['autoDownload'];\n\n let photoSizeMax = 0, videoSizeMax = 0, fileSizeMax = 0;\n const settings = rootScope.settings;\n const appPeersManager = rootScope.managers.appPeersManager;\n if(!settings.autoDownloadNew.pFlags.disabled && peerId) {\n if(peerId.isUser()) {\n if(await appPeersManager.isContact(peerId)) {\n type = 'contacts';\n } else {\n type = 'private';\n }\n } else if(await appPeersManager.isBroadcast(peerId)) {\n type = 'channels';\n } else {\n type = 'groups';\n }\n\n if(settings.autoDownload.photo[type]) photoSizeMax = settings.autoDownloadNew.photo_size_max;\n if(settings.autoDownload.video[type]) videoSizeMax = settings.autoDownloadNew.video_size_max;\n if(settings.autoDownload.file[type]) fileSizeMax = settings.autoDownloadNew.file_size_max;\n }\n\n return {\n photo: photoSizeMax,\n video: videoSizeMax,\n file: fileSizeMax\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppImManager} from '../../lib/appManagers/appImManager';\nimport ButtonIcon from '../buttonIcon';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_APPLE, IS_MOBILE} from '../../environment/userAgent';\nimport appNavigationController from '../appNavigationController';\nimport {_i18n} from '../../lib/langPack';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\nimport {MarkdownType} from '../../helpers/dom/getRichElementValue';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport clamp from '../../helpers/number/clamp';\nimport matchUrl from '../../lib/richTextProcessor/matchUrl';\nimport matchUrlProtocol from '../../lib/richTextProcessor/matchUrlProtocol';\nimport hasMarkupInSelection from '../../helpers/dom/hasMarkupInSelection';\n\nexport default class MarkupTooltip {\n public container: HTMLElement;\n private wrapper: HTMLElement;\n private buttons: {[type in MarkdownType]: HTMLElement} = {} as any;\n private linkBackButton: HTMLElement;\n private linkApplyButton: HTMLButtonElement;\n private hideTimeout: number;\n private addedListener = false;\n private waitingForMouseUp = false;\n private linkInput: HTMLInputElement;\n private savedRange: Range;\n private mouseUpCounter: number = 0;\n // private log: ReturnType;\n\n constructor(private appImManager: AppImManager) {\n // this.log = logger('MARKUP');\n }\n\n private init() {\n this.container = document.createElement('div');\n this.container.classList.add('markup-tooltip', 'z-depth-1', 'hide');\n\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('markup-tooltip-wrapper');\n\n const tools1 = document.createElement('div');\n const tools2 = document.createElement('div');\n tools1.classList.add('markup-tooltip-tools');\n tools2.classList.add('markup-tooltip-tools');\n\n const arr = ['bold', 'italic', 'underline', 'strikethrough', 'monospace', 'spoiler', 'link'] as (keyof MarkupTooltip['buttons'])[];\n arr.forEach((c) => {\n const button = ButtonIcon(c, {noRipple: true});\n tools1.append(this.buttons[c] = button);\n\n if(c !== 'link') {\n button.addEventListener('mousedown', (e) => {\n cancelEvent(e);\n this.appImManager.chat.input.applyMarkdown(c);\n this.cancelClosening();\n\n /* this.mouseUpCounter = 0;\n this.setMouseUpEvent(); */\n // this.hide();\n });\n } else {\n attachClickEvent(button, (e) => {\n cancelEvent(e);\n this.showLinkEditor();\n this.cancelClosening();\n });\n }\n });\n\n this.linkBackButton = ButtonIcon('left', {noRipple: true});\n this.linkInput = document.createElement('input');\n _i18n(this.linkInput, 'MarkupTooltip.LinkPlaceholder', undefined, 'placeholder');\n this.linkInput.classList.add('input-clear');\n this.linkInput.addEventListener('keydown', (e) => {\n const valid = !this.linkInput.value.length || !!matchUrl(this.linkInput.value);// /^(http)|(https):\\/\\//i.test(this.linkInput.value);\n\n if(e.key === 'Enter') {\n if(!valid) {\n if(this.linkInput.classList.contains('error')) {\n this.linkInput.classList.remove('error');\n void this.linkInput.offsetLeft; // reflow\n }\n\n this.linkInput.classList.add('error');\n } else {\n this.applyLink(e);\n }\n }\n });\n\n this.linkInput.addEventListener('input', (e) => {\n const valid = this.isLinkValid();\n\n this.linkInput.classList.toggle('is-valid', valid);\n this.linkInput.classList.remove('error');\n });\n\n this.linkBackButton.addEventListener('mousedown', (e) => {\n // this.log('linkBackButton click');\n cancelEvent(e);\n this.container.classList.remove('is-link');\n // input.value = '';\n this.resetSelection();\n this.setTooltipPosition();\n this.cancelClosening();\n });\n\n this.linkApplyButton = ButtonIcon('check markup-tooltip-link-apply', {noRipple: true});\n this.linkApplyButton.addEventListener('mousedown', (e) => {\n // this.log('linkApplyButton click');\n this.applyLink(e);\n });\n\n const applyDiv = document.createElement('div');\n applyDiv.classList.add('markup-tooltip-link-apply-container');\n\n const delimiter1 = document.createElement('span');\n const delimiter2 = document.createElement('span');\n const delimiter3 = document.createElement('span');\n delimiter1.classList.add('markup-tooltip-delimiter');\n delimiter2.classList.add('markup-tooltip-delimiter');\n delimiter3.classList.add('markup-tooltip-delimiter');\n tools1.insertBefore(delimiter1, this.buttons.link);\n applyDiv.append(delimiter3, this.linkApplyButton);\n tools2.append(this.linkBackButton, delimiter2, this.linkInput, applyDiv);\n // tools1.insertBefore(delimiter2, this.buttons.link.nextSibling);\n\n this.wrapper.append(tools1, tools2);\n this.container.append(this.wrapper);\n document.body.append(this.container);\n\n window.addEventListener('resize', () => {\n this.hide();\n });\n }\n\n public showLinkEditor() {\n if(!this.container || !this.container.classList.contains('is-visible')) { // * if not inited yet (Ctrl+A + Ctrl+K)\n this.show();\n }\n\n const button = this.buttons.link;\n this.container.classList.add('is-link');\n\n const selection = document.getSelection();\n this.savedRange = selection.getRangeAt(0);\n\n if(button.classList.contains('active')) {\n const startContainer = this.savedRange.startContainer;\n const anchor = startContainer.parentElement as HTMLAnchorElement;\n this.linkInput.value = anchor.href;\n } else {\n this.linkInput.value = '';\n }\n\n this.setTooltipPosition(true);\n\n setTimeout(() => {\n this.linkInput.focus(); // !!! instant focus will break animation\n }, 200);\n this.linkInput.classList.toggle('is-valid', this.isLinkValid());\n }\n\n private applyLink(e: Event) {\n cancelEvent(e);\n this.resetSelection();\n let url = this.linkInput.value;\n if(url && !matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n this.appImManager.chat.input.applyMarkdown('link', url);\n setTimeout(() => {\n this.hide();\n }, 0);\n }\n\n private isLinkValid() {\n return !this.linkInput.value.length || !!matchUrl(this.linkInput.value);\n }\n\n private resetSelection(range: Range = this.savedRange) {\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n this.appImManager.chat.input.messageInput.focus();\n }\n\n public hide() {\n // return;\n\n if(this.init) return;\n\n this.container.classList.remove('is-visible');\n // document.removeEventListener('mouseup', this.onMouseUp);\n document.removeEventListener('mouseup', this.onMouseUpSingle);\n this.waitingForMouseUp = false;\n\n appNavigationController.removeByType('markup');\n\n if(this.hideTimeout) clearTimeout(this.hideTimeout);\n this.hideTimeout = window.setTimeout(() => {\n this.hideTimeout = undefined;\n this.container.classList.add('hide');\n this.container.classList.remove('is-link');\n }, 200);\n }\n\n public getActiveMarkupButton() {\n const currentMarkups: Set = new Set();\n\n // const nodes = getSelectedNodes();\n // const parents = [...new Set(nodes.map((node) => node.parentNode))];\n // // if(parents.length > 1 && parents) return [];\n\n // (parents as HTMLElement[]).forEach((node) => {\n // for(const type in markdownTags) {\n // const tag = markdownTags[type as MarkdownType];\n // const closest = node.closest(tag.match + ', [contenteditable=\"true\"]');\n // if(closest !== this.appImManager.chat.input.messageInput) {\n // currentMarkups.add(this.buttons[type as MarkdownType]);\n // }\n // }\n // });\n\n const types = Object.keys(this.buttons) as MarkdownType[];\n const markup = hasMarkupInSelection(types);\n types.forEach((type) => {\n if(markup[type]) {\n currentMarkups.add(this.buttons[type as MarkdownType]);\n }\n });\n\n return [...currentMarkups];\n }\n\n public setActiveMarkupButton() {\n const activeButtons = this.getActiveMarkupButton();\n\n for(const i in this.buttons) {\n // @ts-ignore\n const button = this.buttons[i];\n button.classList.toggle('active', activeButtons.includes(button));\n }\n }\n\n private setTooltipPosition(isLinkToggle = false) {\n const selection = document.getSelection();\n const range = selection.getRangeAt(0);\n\n const bodyRect = document.body.getBoundingClientRect();\n const selectionRect = range.getBoundingClientRect();\n const inputRect = this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();\n\n this.container.style.maxWidth = inputRect.width + 'px';\n\n const visibleRect = getVisibleRect(undefined, this.appImManager.chat.input.messageInput, false, selectionRect);\n\n const selectionTop = visibleRect.rect.top/* selectionRect.top */ + (bodyRect.top * -1);\n\n const currentTools = this.container.classList.contains('is-link') ? this.wrapper.lastElementChild : this.wrapper.firstElementChild;\n\n const sizesRect = currentTools.getBoundingClientRect();\n const top = selectionTop - sizesRect.height - 8;\n\n const minX = inputRect.left;\n const maxX = (inputRect.left + inputRect.width) - Math.min(inputRect.width, sizesRect.width);\n let left: number;\n if(isLinkToggle) {\n const containerRect = this.container.getBoundingClientRect();\n left = clamp(containerRect.left, minX, maxX);\n } else {\n const x = selectionRect.left + (selectionRect.width - sizesRect.width) / 2;\n left = clamp(x, minX, maxX);\n }\n\n /* const isClamped = x !== minX && x !== maxX && (left === minX || left === maxX || this.container.getBoundingClientRect().left >= maxX);\n\n if(isLinkToggle && this.container.classList.contains('is-link') && !isClamped) return; */\n\n this.container.style.transform = `translate3d(${left}px, ${top}px, 0)`;\n }\n\n public show() {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n if(isSelectionEmpty()) {\n this.hide();\n return;\n }\n\n if(this.hideTimeout !== undefined) {\n clearTimeout(this.hideTimeout);\n }\n\n if(this.container.classList.contains('is-visible')) {\n return;\n }\n\n this.setActiveMarkupButton();\n\n this.container.classList.remove('is-link');\n const isFirstShow = this.container.classList.contains('hide');\n if(isFirstShow) {\n this.container.classList.remove('hide');\n this.container.classList.add('no-transition');\n }\n\n this.setTooltipPosition();\n\n if(isFirstShow) {\n void this.container.offsetLeft; // reflow\n this.container.classList.remove('no-transition');\n }\n\n this.container.classList.add('is-visible');\n\n if(!IS_MOBILE) {\n appNavigationController.pushItem({\n type: 'markup',\n onPop: () => {\n this.hide();\n }\n });\n }\n\n // this.log('selection', selectionRect, activeButton);\n }\n\n /* private onMouseUp = (e: Event) => {\n this.log('onMouseUp');\n if(findUpClassName(e.target, 'markup-tooltip')) return;\n\n this.hide();\n //document.removeEventListener('mouseup', this.onMouseUp);\n }; */\n\n private onMouseUpSingle = (e?: Event) => {\n // this.log('onMouseUpSingle');\n this.waitingForMouseUp = false;\n\n if(IS_TOUCH_SUPPORTED) {\n e && cancelEvent(e);\n if(this.mouseUpCounter++ === 0) {\n this.resetSelection(this.savedRange);\n } else {\n this.hide();\n return;\n }\n }\n\n this.show();\n\n /* !isTouchSupported && document.addEventListener('mouseup', this.onMouseUp); */\n };\n\n public setMouseUpEvent() {\n if(this.waitingForMouseUp) return;\n this.waitingForMouseUp = true;\n\n // this.log('setMouseUpEvent');\n\n document.addEventListener('mouseup', this.onMouseUpSingle, {once: true});\n }\n\n public cancelClosening() {\n if(IS_TOUCH_SUPPORTED && !IS_APPLE) {\n document.removeEventListener('mouseup', this.onMouseUpSingle);\n document.addEventListener('mouseup', (e) => {\n cancelEvent(e);\n this.mouseUpCounter = 1;\n this.waitingForMouseUp = false;\n this.setMouseUpEvent();\n }, {once: true});\n }\n }\n\n public handleSelection() {\n if(this.addedListener) return;\n this.addedListener = true;\n document.addEventListener('selectionchange', (e) => {\n // this.log('selectionchange');\n\n if(document.activeElement === this.linkInput) {\n return;\n }\n\n const messageInput = this.appImManager.chat.input.messageInput;\n if(document.activeElement !== messageInput) {\n this.hide();\n return;\n }\n\n const selection = document.getSelection();\n if(isSelectionEmpty(selection)) {\n this.hide();\n return;\n }\n\n if(IS_TOUCH_SUPPORTED) {\n if(IS_APPLE) {\n this.show();\n this.setTooltipPosition(); // * because can skip this in .show();\n } else {\n if(this.mouseUpCounter === 2) {\n this.mouseUpCounter = 0;\n return;\n }\n\n this.savedRange = selection.getRangeAt(0);\n this.setMouseUpEvent();\n /* document.addEventListener('touchend', (e) => {\n cancelEvent(e);\n this.resetSelection(range);\n this.show();\n }, {once: true, passive: false}); */\n }\n } else if(this.container && this.container.classList.contains('is-visible')) {\n this.setTooltipPosition();\n } else if(messageInput.matches(':active')) {\n this.setMouseUpEvent();\n } else {\n this.show();\n }\n });\n\n document.addEventListener('beforeinput', (e) => {\n if(e.inputType === 'historyRedo' || e.inputType === 'historyUndo') {\n e.target.addEventListener('input', () => this.setActiveMarkupButton(), {once: true});\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport generatePathData from '../../helpers/generatePathData';\nimport {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\n\nexport default class ChatDragAndDrop {\n container: HTMLDivElement;\n svg: SVGSVGElement;\n outlineWrapper: HTMLDivElement;\n path: SVGPathElement;\n\n constructor(appendTo: HTMLElement, private options: {\n icon?: string,\n header: LangPackKey,\n headerArgs?: FormatterArguments,\n subtitle?: LangPackKey,\n onDrop: (e: DragEvent) => void\n }) {\n this.container = document.createElement('div');\n this.container.classList.add('drop', 'z-depth-1');\n\n this.outlineWrapper = document.createElement('div');\n this.outlineWrapper.classList.add('drop-outline-wrapper');\n\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.svg.classList.add('drop-outline');\n\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n this.path.classList.add('drop-outline-path');\n\n let dropIcon: HTMLElement;\n if(options.icon) {\n dropIcon = document.createElement('div');\n dropIcon.classList.add('drop-icon', 'tgico-' + options.icon);\n }\n\n const dropHeader = document.createElement('div');\n dropHeader.classList.add('drop-header');\n dropHeader.append(i18n(options.header, options.headerArgs));\n\n let dropSubtitle: HTMLElement;\n if(options.subtitle) {\n dropSubtitle = document.createElement('div');\n dropSubtitle.classList.add('drop-subtitle');\n dropSubtitle.append(i18n(options.subtitle));\n }\n\n this.svg.append(this.path);\n this.outlineWrapper.append(this.svg);\n\n this.container.append(...[this.outlineWrapper, dropIcon, dropHeader, dropSubtitle].filter(Boolean));\n appendTo.append(this.container);\n\n this.container.addEventListener('dragover', this.onDragOver);\n this.container.addEventListener('dragleave', this.onDragLeave);\n this.container.addEventListener('drop', this.onDrop);\n }\n\n onDragOver = (e: DragEvent) => {\n this.container.classList.add('is-dragover');\n // SetTransition(this.container, 'is-dragover', true, 500);\n };\n\n onDragLeave = (e: DragEvent) => {\n this.container.classList.remove('is-dragover');\n // SetTransition(this.container, 'is-dragover', false, 500);\n };\n\n onDrop = (e: DragEvent) => {\n this.options.onDrop(e);\n };\n\n destroy() {\n delete this.options;\n this.container.remove();\n this.container.removeEventListener('dragover', this.onDragOver);\n this.container.removeEventListener('dragleave', this.onDragLeave);\n this.container.removeEventListener('drop', this.onDrop);\n }\n\n setPath() {\n const rect = this.outlineWrapper.getBoundingClientRect();\n this.svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\n this.svg.setAttributeNS(null, 'viewBox', `0 0 ${rect.width} ${rect.height}`);\n this.svg.setAttributeNS(null, 'width', `${rect.width}`);\n this.svg.setAttributeNS(null, 'height', `${rect.height}`);\n\n const radius = 10;\n // const strokeWidth = 2;\n const sizeX = rect.width - radius;\n const sizeY = rect.height - radius;\n const pos = radius / 2;\n const d = generatePathData(pos, pos, sizeX, sizeY, radius, radius, radius, radius);\n this.path.setAttributeNS(null, 'd', d);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {doubleRaf} from '../schedulers';\n\nexport default function disableTransition(elements: HTMLElement[]) {\n elements.forEach((el) => el.classList.add('no-transition'));\n\n doubleRaf().then(() => {\n elements.forEach((el) => el.classList.remove('no-transition'));\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport const MAX_SPEED = 8.2;\nexport const MIN_SPEED = 0.8;\n\n// import { MIN_SPEED, MAX_SPEED } from './BlobDrawable';\n\ntype Radius = number[];\n\nexport default class LineBlobDrawable {\n public maxRadius: number;\n public minRadius: number;\n private N: number;\n private radius: Radius;\n private radiusNext: Radius;\n private progress: number[];\n private speed: number[];\n\n constructor(n: number) {\n this.maxRadius = 10;\n this.minRadius = 0;\n\n this.N = n;\n this.radius = new Array(n + 1);\n\n this.radiusNext = new Array(n + 1);\n this.progress = new Array(n + 1);\n this.speed = new Array(n + 1);\n\n for(let i = 0; i <= n; i++) {\n this.generateBlob(this.radius, i);\n this.generateBlob(this.radiusNext, i);\n this.progress[i] = 0;\n }\n }\n\n private generateBlob(radius: Radius, i: number) {\n const {maxRadius, minRadius, speed} = this;\n\n const radDif = maxRadius - minRadius;\n radius[i] = minRadius + Math.random() * radDif;\n speed[i] = 0.017 + 0.003 * Math.random();\n }\n\n private generateNextBlob() {\n const {radius, radiusNext, progress, N} = this;\n for(let i = 0; i < N; i++) {\n this.generateBlob(radius, i);\n this.generateBlob(radiusNext, i);\n progress[i] = 0.0;\n }\n }\n\n public update(amplitude: number, speedScale: number) {\n const {N, progress, speed, radius, radiusNext} = this;\n for(let i = 0; i <= N; i++) {\n progress[i] += (speed[i] * MIN_SPEED) + amplitude * speed[i] * MAX_SPEED * speedScale;\n if(progress[i] >= 1.0) {\n progress[i] = 0.0;\n radius[i] = radiusNext[i];\n this.generateBlob(radiusNext, i);\n }\n }\n }\n\n public draw(left: number, top: number, right: number, bottom: number, canvas: HTMLCanvasElement, paint: (ctx: CanvasRenderingContext2D) => void, pinnedTop: number, progressToPinned: number) {\n if(canvas.getContext) {\n const ctx = canvas.getContext('2d');\n // ctx.globalAlpha = 0.5;\n // ctx.lineWidth = 1;\n\n ctx.beginPath();\n ctx.moveTo(right, bottom);\n ctx.lineTo(left, bottom);\n\n const {radius, radiusNext, N} = this;\n for(let i = 0; i <= N; i++) {\n if(i === 0) {\n const progress = this.progress[i];\n const r1 = radius[i] * (1.0 - progress) + radiusNext[i] * progress;\n const y = (top - r1) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n ctx.lineTo(left, y);\n } else {\n const progress = this.progress[i - 1];\n const r1 = radius[i - 1] * (1.0 - progress) + radiusNext[i - 1] * progress;\n const progressNext = this.progress[i];\n const r2 = radius[i] * (1.0 - progressNext) + radiusNext[i] * progressNext;\n const x1 = (right - left) / N * (i - 1);\n const x2 = (right - left) / N * i;\n const cx = x1 + (x2 - x1) / 2;\n\n const y1 = (top - r1) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n const y2 = (top - r2) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n ctx.bezierCurveTo(cx, y1, cx, y2, x2, y2);\n if(i === N) {\n ctx.lineTo(right, bottom);\n }\n }\n }\n\n // ctx.scale(1.0, 1.0);\n paint(ctx);\n ctx.fill();\n ctx.closePath();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport GROUP_CALL_STATE from '../lib/calls/groupCallState';\nimport LineBlobDrawable from './lineBlobDrawable';\n\nexport class WeavingState {\n public shader: (ctx: CanvasRenderingContext2D, left: number, top: number, right: number, bottom: number) => void;\n\n constructor(public stateId: GROUP_CALL_STATE) {\n this.createGradient(stateId);\n }\n\n public createGradient(stateId: GROUP_CALL_STATE) {\n this.shader = (ctx, left, top, right, bottom) => {\n ctx.fillStyle = WeavingState.getGradientFromType(ctx, stateId, left, top, right, bottom);\n };\n }\n\n // Android colors\n static getGradientFromType(ctx: CanvasRenderingContext2D, type: GROUP_CALL_STATE, x0: number, y0: number, x1: number, y1: number) {\n const gradient = ctx.createLinearGradient(x0, y0, x1, y1);\n if(type === GROUP_CALL_STATE.MUTED_BY_ADMIN) {\n gradient.addColorStop(0, '#F05459');\n gradient.addColorStop(.4, '#766EE9');\n gradient.addColorStop(1, '#57A4FE');\n } else if(type === GROUP_CALL_STATE.UNMUTED) {\n gradient.addColorStop(0, '#52CE5D');\n gradient.addColorStop(1, '#00B1C0');\n } else if(type === GROUP_CALL_STATE.MUTED) {\n gradient.addColorStop(0, '#0976E3');\n gradient.addColorStop(1, '#2BCEFF');\n } else if(type === GROUP_CALL_STATE.CONNECTING) {\n gradient.addColorStop(0, '#8599aa');\n gradient.addColorStop(1, '#8599aa');\n }\n\n return gradient;\n }\n\n update(height: number, width: number, dt: number, amplitude: number) {\n // TODO: move gradient here\n }\n}\n\nexport default class TopbarWeave {\n private focused: boolean;\n private resizing: boolean;\n private lastUpdateTime: number;\n private amplitude: number;\n private amplitude2: number;\n\n private states: Map;\n private previousState: WeavingState;\n private currentState: WeavingState;\n private progressToState: number;\n\n private scale: number;\n private left: number;\n private top: number;\n private right: number;\n private bottom: number;\n\n private mounted: boolean;\n private media: MediaQueryList;\n\n private container: HTMLDivElement;\n private canvas: HTMLCanvasElement;\n\n private resizeHandler: number;\n private raf: number;\n\n private lbd: LineBlobDrawable;\n private lbd1: LineBlobDrawable;\n private lbd2: LineBlobDrawable;\n\n private animateToAmplitude: number;\n private animateAmplitudeDiff: number;\n private animateAmplitudeDiff2: number;\n\n constructor() {\n this.focused = true;\n this.resizing = false;\n this.lastUpdateTime = Date.now();\n this.amplitude = 0.0;\n this.amplitude2 = 0.0;\n\n this.states = new Map([\n [GROUP_CALL_STATE.UNMUTED, new WeavingState(GROUP_CALL_STATE.UNMUTED)],\n [GROUP_CALL_STATE.MUTED, new WeavingState(GROUP_CALL_STATE.MUTED)],\n [GROUP_CALL_STATE.MUTED_BY_ADMIN, new WeavingState(GROUP_CALL_STATE.MUTED_BY_ADMIN)],\n [GROUP_CALL_STATE.CONNECTING, new WeavingState(GROUP_CALL_STATE.CONNECTING)]\n ]);\n this.previousState = null;\n this.currentState = this.states.get(GROUP_CALL_STATE.CONNECTING);\n this.progressToState = 1.0;\n }\n\n public componentDidMount() {\n if(this.mounted) {\n return;\n }\n\n this.mounted = true;\n // window.addEventListener('blur', this.handleBlur);\n // window.addEventListener('focus', this.handleFocus);\n window.addEventListener('resize', this.handleResize);\n this.media = window.matchMedia('screen and (min-resolution: 2dppx)');\n this.media.addEventListener('change', this.handleDevicePixelRatioChanged);\n\n this.setSize();\n this.forceUpdate();\n\n this.lbd = new LineBlobDrawable(3);\n this.lbd1 = new LineBlobDrawable(7);\n this.lbd2 = new LineBlobDrawable(8);\n this.setAmplitude(this.amplitude);\n\n this.draw();\n }\n\n public componentWillUnmount() {\n this.mounted = false;\n // window.removeEventListener('blur', this.handleBlur);\n // window.removeEventListener('focus', this.handleFocus);\n window.removeEventListener('resize', this.handleResize);\n this.media.addEventListener('change', this.handleDevicePixelRatioChanged);\n\n const {canvas} = this;\n const ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n private setSize() {\n this.scale = window.devicePixelRatio;\n this.top = 20 * this.scale;\n this.right = (this.mounted ? this.container.offsetWidth : 1261) * this.scale;\n this.bottom = (this.mounted ? this.container.offsetHeight : 68) * this.scale;\n this.left = 0 * this.scale;\n this.setCanvasSize();\n }\n\n private setCanvasSize() {\n this.canvas.width = this.right;\n this.canvas.height = this.bottom;\n }\n\n private handleDevicePixelRatioChanged = (e: Event) => {\n this.setSize();\n this.forceUpdate();\n }\n\n private handleResize = () => {\n if(this.resizeHandler) {\n clearTimeout(this.resizeHandler);\n this.resizeHandler = null;\n }\n\n this.resizing = true;\n this.resizeCanvas();\n this.resizeHandler = window.setTimeout(() => {\n this.resizing = false;\n this.invokeDraw();\n }, 250);\n }\n\n private resizeCanvas() {\n this.scale = window.devicePixelRatio;\n this.right = this.container.offsetWidth * this.scale;\n\n this.forceUpdate();\n this.invokeDraw();\n }\n\n public handleFocus = () => {\n this.focused = true;\n this.invokeDraw();\n }\n\n public handleBlur = () => {\n this.focused = false;\n }\n\n private invokeDraw = () => {\n if(this.raf) return;\n\n this.draw();\n }\n\n private draw = (force = false) => {\n this.raf = null;\n if(!this.mounted) {\n return;\n }\n const {lbd, lbd1, lbd2, scale, left, top, right, bottom, currentState, previousState, focused, resizing, canvas} = this;\n if(!focused && !resizing && this.progressToState >= 1.0) {\n return;\n }\n\n // console.log('[top] draw', [focused, resizing, this.mounted]);\n\n const newTime = Date.now();\n let dt = (newTime - this.lastUpdateTime);\n if(dt > 20) {\n dt = 17;\n }\n\n // console.log('draw start', this.amplitude, this.animateToAmplitude);\n if(this.animateToAmplitude !== this.amplitude) {\n this.amplitude += this.animateAmplitudeDiff * dt;\n if(this.animateAmplitudeDiff > 0) {\n if(this.amplitude > this.animateToAmplitude) {\n this.amplitude = this.animateToAmplitude;\n }\n } else {\n if(this.amplitude < this.animateToAmplitude) {\n this.amplitude = this.animateToAmplitude;\n }\n }\n }\n\n if(this.animateToAmplitude !== this.amplitude2) {\n this.amplitude2 += this.animateAmplitudeDiff2 * dt;\n if(this.animateAmplitudeDiff2 > 0) {\n if(this.amplitude2 > this.animateToAmplitude) {\n this.amplitude2 = this.animateToAmplitude;\n }\n } else {\n if(this.amplitude2 < this.animateToAmplitude) {\n this.amplitude2 = this.animateToAmplitude;\n }\n }\n }\n\n if(previousState) {\n this.progressToState += dt / 250;\n if(this.progressToState > 1) {\n this.progressToState = 1;\n this.previousState = null;\n }\n }\n\n const {amplitude, amplitude2, progressToState} = this;\n\n const top1 = 6 * amplitude2 * scale;\n const top2 = 6 * amplitude2 * scale;\n\n const ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n lbd.minRadius = 0;\n lbd.maxRadius = (2 + 2 * amplitude) * scale;\n lbd1.minRadius = 0;\n lbd1.maxRadius = (3 + 9 * amplitude) * scale;\n lbd2.minRadius = 0;\n lbd2.maxRadius = (3 + 9 * amplitude) * scale;\n\n lbd.update(amplitude, 0.3);\n lbd1.update(amplitude, 0.7);\n lbd2.update(amplitude, 0.7);\n\n for(let i = 0; i < 2; i++) {\n if(i === 0 && !previousState) {\n continue;\n }\n\n let alpha = 1;\n let state: WeavingState = null;\n if(i === 0) {\n alpha = 1 - progressToState;\n state = previousState;\n // previousState.setToPaint(paint);\n } else {\n alpha = previousState ? progressToState : 1;\n currentState.update(bottom - top, right - left, dt, amplitude);\n state = currentState;\n // currentState.setToPaint(paint);\n }\n\n const paint1 = (ctx: CanvasRenderingContext2D) => {\n ctx.globalAlpha = 0.3 * alpha;\n state.shader(ctx, left, top, right, bottom);\n };\n const paint = (ctx: CanvasRenderingContext2D) => {\n ctx.globalAlpha = i === 0 ? 1 : alpha;\n state.shader(ctx, left, top, right, bottom);\n };\n\n lbd1.draw(left, top - top1, right, bottom, canvas, paint1, top, 1.0);\n lbd2.draw(left, top - top2, right, bottom, canvas, paint1, top, 1.0);\n lbd.draw(left, top, right, bottom, canvas, paint, top, 1.0);\n }\n\n if(!force) {\n this.raf = requestAnimationFrame(() => this.draw());\n }\n };\n\n public setCurrentState = (stateId: GROUP_CALL_STATE, animated: boolean) => {\n const {currentState, states} = this;\n\n if(currentState?.stateId === stateId) {\n return;\n }\n\n this.previousState = animated ? currentState : null;\n this.currentState = states.get(stateId);\n this.progressToState = this.previousState ? 0.0 : 1.0;\n };\n\n public setAmplitude(value: number) {\n const {amplitude} = this;\n this.animateToAmplitude = value;\n this.animateAmplitudeDiff = (value - amplitude) / 250;\n this.animateAmplitudeDiff2 = (value - amplitude) / 120;\n }\n\n private forceUpdate() {\n this.setCanvasSize();\n }\n\n public render(className: string) {\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add(className + '-canvas');\n\n container.append(canvas);\n\n return container;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from '../../helpers/noop';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport rootScope from '../rootScope';\nimport lottieLoader, {LottieAssetName} from './lottieLoader';\nimport type RLottiePlayer from './rlottiePlayer';\nimport {RLottieColor} from './rlottiePlayer';\n\nexport type RLottieIconOptions = {\n width: number,\n height: number,\n container?: HTMLElement,\n skipAnimation?: boolean\n};\n\nexport type RLottieIconItemPartOptions = {\n startFrame: number,\n endFrame: number,\n name?: string\n};\n\nexport type RLottieIconItemOptions = {\n name: LottieAssetName,\n parts: RLottieIconItemPartOptions[],\n initFrame?: number,\n player?: RLottiePlayer,\n autoplay?: boolean,\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n};\n\nexport class RLottieIconItemPart implements RLottieIconItemPartOptions {\n public startFrame: number;\n public endFrame: number;\n public name?: string;\n\n constructor(public item: RLottieIconItem, options: RLottieIconItemPartOptions) {\n safeAssign(this, options);\n }\n\n public play(callback?: () => void) {\n return this.item.playPart(this, callback);\n }\n}\n\n// export type RLottieIconItemPart = RLottieIconItemPartOptions;\n\nexport class RLottieIconItem implements RLottieIconItemOptions {\n public name: LottieAssetName;\n public parts: RLottieIconItemPart[];\n public player: RLottiePlayer;\n public initFrame: number;\n public autoplay: boolean;\n public color: RLottieColor;\n public inverseColor: RLottieColor;\n public loadPromise: Promise;\n public onLoadForPart: () => void;\n public onLoadForColor: () => void;\n\n constructor(public icon: RLottieIcon, options: RLottieIconItemOptions) {\n this.autoplay = false;\n\n safeAssign(this, options);\n\n this.parts = this.parts.map((options) => this.createPart(options));\n }\n\n public load() {\n let loadPromise = this.loadPromise;\n if(loadPromise) {\n return loadPromise;\n }\n\n const {container, canvas, width, height} = this.icon;\n loadPromise = lottieLoader.loadAnimationAsAsset({\n container,\n canvas,\n width,\n height,\n group: 'none',\n loop: false,\n autoplay: this.autoplay ?? false,\n initFrame: this.initFrame,\n skipFirstFrameRendering: this.initFrame === undefined,\n color: this.color,\n inverseColor: this.inverseColor\n }, this.name).then((player) => {\n return lottieLoader.waitForFirstFrame(player);\n }).then((player) => {\n this.player = player;\n\n if(this.onLoadForColor) {\n this.onLoadForColor();\n this.onLoadForColor = undefined;\n }\n\n if(this.onLoadForPart) {\n this.onLoadForPart();\n this.onLoadForPart = undefined;\n }\n });\n\n this.loadPromise = loadPromise;\n this.icon.loadPromises.set(this.name, loadPromise);\n return loadPromise;\n }\n\n public createPart(options: RLottieIconItemPartOptions) {\n return new RLottieIconItemPart(this, options);\n }\n\n public getPart(index: string | number | RLottieIconItemPart) {\n if(index instanceof RLottieIconItemPart) return index;\n else if(typeof(index) === 'string') return this.parts.find((part) => part.name === index);\n else return this.parts[index];\n }\n\n public playPart(part: RLottieIconItemPart, callback?: () => void) {\n return this.icon.playPart(this, part, callback);\n }\n}\n\nexport default class RLottieIcon {\n public container: HTMLElement;\n public canvas: HTMLCanvasElement;\n public width: number;\n public height: number;\n\n protected items: Map;\n public loadPromises: Map>;\n\n protected skipAnimation: boolean;\n\n constructor(options: RLottieIconOptions) {\n safeAssign(this, options);\n\n if(!this.container) this.container = document.createElement('div');\n this.container.classList.add('rlottie-icon');\n\n const {width, height} = this;\n this.container.style.width = width + 'px';\n this.container.style.height = height + 'px';\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add('rlottie');\n canvas.width = width;\n canvas.height = height;\n\n this.items = new Map();\n this.loadPromises = new Map();\n }\n\n public get loadPromise() {\n return Promise.all([...this.loadPromises.values()]).then(noop);\n }\n\n public getItem(name?: LottieAssetName): RLottieIconItem {\n return !name && this.items.size === 1 ? this.items.values().next().value : this.items.get(name);\n }\n\n public add(options: Omit) {\n const item = new RLottieIconItem(this, options);\n this.items.set(options.name, item);\n\n return item;\n }\n\n public playPart(item: RLottieIconItem, index: Parameters[0], callback?: () => void) {\n if(!item.player) {\n item.onLoadForPart = () => {\n this.playPart(item, index, callback);\n };\n\n return;\n }\n\n const part = item.getPart(index);\n item.player.playPart({\n from: rootScope.settings.animationsEnabled && !this.skipAnimation ? part.startFrame : part.endFrame,\n to: part.endFrame,\n callback\n });\n }\n\n /* public playToPart(item: RLottieIconItem, index: Parameters[0], toEnd: boolean) {\n if(!item.player) return;\n const part = item.getPart(index);\n const toFrame = toEnd ? part.endFrame : part.startFrame;\n item.player.playToFrame({\n frame: toFrame\n });\n } */\n\n public static generateEqualParts(length: number, frameCount: number): RLottieIconItemPartOptions[] {\n return new Array(length).fill(0).map((_, idx) => {\n const startFrame = idx * frameCount;\n return {startFrame, endFrame: startFrame + frameCount - 1};\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from '../helpers/noop';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {LottieAssetName} from '../lib/rlottie/lottieLoader';\nimport RLottieIcon, {RLottieIconItemPartOptions, RLottieIconItemPart} from '../lib/rlottie/rlottieIcon';\nimport {RLottieColor} from '../lib/rlottie/rlottiePlayer';\n\nexport type SuperRLottieIconAddItemOptions = {name: LottieAssetName, parts: RLottieIconItemPartOptions};\nexport type SuperRLottieIconGetInfoResult = RLottieIconItemPart;\nexport class SuperRLottieIcon extends RLottieIcon {\n protected getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult;\n protected getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor;\n\n protected partState: Options['PartState'];\n protected colorState: Options['ColorState'];\n protected loaded: boolean;\n\n constructor(options: {\n width: number,\n height: number,\n skipAnimation?: boolean,\n getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult,\n getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor,\n }) {\n super({\n width: options.width,\n height: options.height\n });\n\n safeAssign(this, options);\n\n // hook the first call\n /* const originalFunction = this.setState.bind(this);\n this.setState = (partState, colorState) => {\n this.setState = originalFunction;\n this.load(partState, colorState);\n return originalFunction(partState, colorState);\n }; */\n }\n\n public load(partState: Options['PartState'], colorState?: Options['ColorState']) {\n if(this.loaded) {\n return this.loadPromise;\n }\n\n this.loaded = true;\n this.partState = partState;\n this.colorState = colorState;\n\n const part = this.getPart(partState);\n const color = colorState !== undefined && this.getColor && this.getColor(colorState);\n\n const item = part.item;\n item.initFrame = part.endFrame;\n item.color = color;\n\n const promises = [...this.items.values()].map((item) => item.load());\n return Promise.all(promises).then(noop);\n }\n\n /**\n * Will redirect setting color state to part callback to synchronize the rendering\n */\n public setState(partState: Options['PartState'], colorState?: Options['ColorState'], partCallback?: () => void) {\n if(!this.loaded) this.load(partState, colorState);\n\n let changedPartState = false, changedColorState = false;\n if(partState !== undefined) changedPartState = this.setPartState(partState, colorState, partCallback);\n else if(colorState !== undefined) changedColorState = this.setColorState(colorState);\n\n return changedPartState || changedColorState;\n }\n\n public setPartState(state: Options['PartState'], colorState?: Options['ColorState'], callback?: () => void) {\n const {partState: prevState} = this;\n if(prevState === state) {\n return colorState !== undefined ? this.setColorState(colorState) : false;\n }\n\n if(colorState !== undefined) {\n this.setColorState(colorState, false);\n }\n\n this.partState = state;\n\n const part = this.getPart(state, prevState);\n part.play(callback);\n\n return true;\n }\n\n public setColorState(state: Options['ColorState'], renderIfPaused = true) {\n const {colorState: prevState} = this;\n if(prevState === state || !this.getColor) {\n return false;\n }\n\n this.colorState = state;\n\n const item = this.getItem();\n const color = this.getColor(state, prevState);\n const invoke = () => {\n item.player.setColor(color, renderIfPaused);\n };\n\n if(item.player) {\n invoke();\n } else {\n item.onLoadForColor = invoke;\n }\n\n return true;\n }\n\n public destroy() {\n this.items.forEach((item) => {\n item.loadPromise.then(() => {\n item.player.remove();\n });\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {RLottieIconItemPartOptions} from '../../lib/rlottie/rlottieIcon';\nimport {GROUP_CALL_MICROPHONE_BUTTON_STATE} from '.';\nimport {SuperRLottieIcon} from '../superIcon';\n\nexport default class GroupCallMicrophoneIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_MICROPHONE_BUTTON_STATE\n}> {\n constructor() {\n super({\n width: 36,\n height: 36,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n let partName: string;\n switch(state) {\n case states.HAND:\n partName = prevState === states.MUTED ? 'muted-to-hand' : 'unmuted-to-hand';\n break;\n case states.MUTED:\n partName = prevState === states.HAND ? 'hand-to-muted' : 'mute';\n break;\n case states.UNMUTED:\n partName = 'unmute';\n break;\n }\n\n return this.getItem().getPart(partName);\n }\n });\n\n const className = 'group-call-microphone-icon';\n this.container.classList.add(className + '-container');\n\n const parts: RLottieIconItemPartOptions[] = [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 172,\n name: 'unmuted-to-hand'\n }, {\n startFrame: 173,\n endFrame: 201,\n name: 'scheduled-crossing'\n }, {\n startFrame: 202,\n endFrame: 236,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 237,\n endFrame: 273,\n name: 'scheduled-to-hand'\n }, {\n startFrame: 274,\n endFrame: 310,\n name: 'scheduled-crossed-to-hand'\n }, {\n startFrame: 311,\n endFrame: 343,\n name: 'scheduled-uncrossing'\n }, {\n startFrame: 344,\n endFrame: 375,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 376,\n endFrame: 403,\n name: 'play-to-muted'\n }];\n\n this.add({\n name: 'voip_filled',\n parts\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport RLottieIcon from '../../lib/rlottie/rlottieIcon';\nimport {GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE, GROUP_CALL_PARTICIPANT_MUTED_STATE, getColorByMutedState, clearMutedStateModifier} from '.';\nimport {SuperRLottieIcon} from '../superIcon';\n\nexport default class GroupCallParticipantMutedIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE,\n ColorState: GROUP_CALL_PARTICIPANT_MUTED_STATE\n}> {\n constructor(private colored: boolean) {\n super({\n width: 32,\n height: 32,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n\n let index: number;\n switch(state) {\n case states.HAND:\n index = 3;\n break;\n case states.MUTED:\n index = prevState === states.HAND ? 0 : 2;\n break;\n case states.UNMUTED:\n index = 1;\n break;\n }\n\n return this.getItem().getPart(index);\n },\n getColor: colored ? (state, prevState) => {\n return getColorByMutedState(state);\n } : undefined\n });\n\n const className = 'group-call-participant-muted-icon';\n this.container.classList.add(className + '-container');\n\n const parts = RLottieIcon.generateEqualParts(4, 21);\n this.add({\n name: 'voice_outlined2',\n parts\n });\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n return super.setState(clearMutedStateModifier(state), state);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '../popups';\nimport {hexToRgb} from '../../helpers/color';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport customProperties from '../../helpers/dom/customProperties';\nimport {GroupCall, GroupCallParticipant} from '../../layer';\nimport type {AppChatsManager} from '../../lib/appManagers/appChatsManager';\nimport type {AppGroupCallsManager} from '../../lib/appManagers/appGroupCallsManager';\nimport type {AppPeersManager} from '../../lib/appManagers/appPeersManager';\nimport GROUP_CALL_STATE from '../../lib/calls/groupCallState';\nimport {RLottieColor} from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport ButtonIcon from '../buttonIcon';\nimport GroupCallMicrophoneIcon from './microphoneIcon';\nimport GroupCallParticipantsElement from './participants';\nimport GroupCallParticipantsVideoElement from './participantVideos';\nimport PopupPeer from '../popups/peer';\nimport GroupCallDescriptionElement from './description';\nimport GroupCallTitleElement from './title';\nimport {addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen} from '../../helpers/dom/fullScreen';\nimport Scrollable from '../scrollable';\nimport {MovableState} from '../movableElement';\nimport animationIntersector from '../animationIntersector';\nimport {IS_APPLE_MOBILE} from '../../environment/userAgent';\nimport throttle from '../../helpers/schedulers/throttle';\nimport IS_SCREEN_SHARING_SUPPORTED from '../../environment/screenSharingSupport';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport makeButton from '../call/button';\nimport MovablePanel from '../../helpers/movablePanel';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport toggleClassName from '../../helpers/toggleClassName';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport themeController from '../../helpers/themeController';\nimport groupCallsController from '../../lib/calls/groupCallsController';\n\nexport enum GROUP_CALL_PARTICIPANT_MUTED_STATE {\n UNMUTED,\n MUTED,\n MUTED_FOR_ME,\n MUTED_BY_ADMIN,\n HAND\n}\n\nexport type GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE = Exclude;\n\nexport function getGroupCallParticipantMutedState(participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n if(participant.pFlags.muted_by_you) {\n return states.MUTED_FOR_ME;\n } else if(participant.raise_hand_rating !== undefined) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return participant.pFlags.can_self_unmute ? states.MUTED : states.MUTED_BY_ADMIN;\n } else {\n return states.UNMUTED;\n }\n}\n\nexport function clearMutedStateModifier(state: GROUP_CALL_PARTICIPANT_MUTED_STATE): GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n switch(state) {\n case states.MUTED_BY_ADMIN:\n case states.MUTED_FOR_ME:\n return states.MUTED;\n default:\n return state;\n }\n}\n\nexport function getColorByMutedState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n let colorStr: 'blue' | 'green' | 'secondary' | 'red';\n switch(state) {\n case states.HAND:\n colorStr = 'blue';\n break;\n case states.MUTED:\n case states.MUTED_FOR_ME:\n case states.MUTED_BY_ADMIN:\n colorStr = state === states.MUTED ? 'secondary' : 'red';\n break;\n case states.UNMUTED:\n colorStr = 'green';\n break;\n }\n\n const propertyValue = customProperties.getProperty('gc-' + colorStr + '-text-color');\n const color: RLottieColor = hexToRgb(propertyValue);\n\n return color;\n}\n\nexport enum GROUP_CALL_MICROPHONE_BUTTON_STATE {\n HAND,\n MUTED,\n UNMUTED,\n}\n\nexport function getGroupCallMicrophoneButtonState(groupCall: GroupCall.groupCall, participant: GroupCallParticipant) {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n if(!participant.pFlags.can_self_unmute) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return states.MUTED\n } else {\n return states.UNMUTED;\n }\n}\n\nlet previousState: MovableState = {\n width: 420,\n height: 640\n};\n\nconst className = 'group-call';\n\nexport default class PopupGroupCall extends PopupElement {\n private instance: GroupCallInstance;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallBodyHeaderDescription: GroupCallDescriptionElement;\n private groupCallParticipants: GroupCallParticipantsElement;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private groupCallMicrophoneIcon: GroupCallMicrophoneIcon;\n private videosCount: number;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n private btnInvite: HTMLButtonElement;\n private btnShowColumn: HTMLButtonElement;\n private movablePanel: MovablePanel;\n private buttonsContainer: HTMLDivElement;\n private btnFullScreen2: HTMLButtonElement;\n private btnVideo: HTMLDivElement;\n private btnScreen: HTMLDivElement;\n\n constructor() {\n super('popup-group-call', {\n body: true,\n withoutOverlay: true,\n closable: true,\n title: true\n });\n\n this.videosCount = 0;\n this.container.classList.add(className, 'night');\n\n const instance = this.instance = groupCallsController.groupCall;\n const {listenerSetter} = this;\n\n if(!IS_APPLE_MOBILE) {\n const btnFullScreen = this.btnFullScreen = ButtonIcon('fullscreen');\n const btnFullScreen2 = this.btnFullScreen2 = ButtonIcon('fullscreen ' + className + '-cfs');\n const btnExitFullScreen = this.btnExitFullScreen = ButtonIcon('smallscreen');\n\n attachClickEvent(btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(btnFullScreen2, this.onFullScreenClick, {listenerSetter});\n\n attachClickEvent(btnExitFullScreen, () => {\n cancelFullScreen();\n }, {listenerSetter});\n\n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n }\n\n const btnInvite = this.btnInvite = ButtonIcon('adduser');\n const btnShowColumn = this.btnShowColumn = ButtonIcon('rightpanel ' + className + '-only-big');\n\n attachClickEvent(btnShowColumn, this.toggleRightColumn, {listenerSetter});\n\n const headerInfo = document.createElement('div');\n headerInfo.classList.add(className + '-header-info');\n\n this.title.classList.add(className + '-header-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-header-subtitle');\n\n headerInfo.append(this.title, subtitle);\n\n this.header.classList.add(className + '-header');\n this.header.append(...[this.btnExitFullScreen, headerInfo/* , btnInvite */, this.btnFullScreen, btnShowColumn].filter(Boolean));\n\n const newHeader = this.header.cloneNode(false) as HTMLElement;\n const newHeaderInfo = headerInfo.cloneNode(false) as HTMLElement;\n const newHeaderTitle = this.title.cloneNode(false) as HTMLElement;\n\n newHeaderInfo.append(newHeaderTitle);\n\n const btnHideColumn = ButtonIcon('rightpanel');\n newHeader.append(...[btnHideColumn, newHeaderInfo, this.btnFullScreen2].filter(Boolean));\n\n attachClickEvent(btnHideColumn, this.toggleRightColumn, {listenerSetter});\n\n this.body.prepend(newHeader);\n\n const videosScrollable = new Scrollable(undefined);\n videosScrollable.container.classList.add('group-call-big-video-container');\n this.container.append(videosScrollable.container);\n\n this.groupCallTitle = new GroupCallTitleElement(this.title);\n this.groupCallDescription = new GroupCallDescriptionElement(subtitle);\n this.groupCallBodyHeaderDescription = new GroupCallDescriptionElement(newHeaderTitle);\n this.constructButtons();\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n appendTo: videosScrollable.container,\n instance,\n listenerSetter,\n displayPinned: true,\n onLengthChange: (length) => {\n this.videosCount = length;\n this.toggleBigLayout();\n },\n managers: this.managers\n });\n this.groupCallParticipants = new GroupCallParticipantsElement({\n appendTo: this.body,\n instance,\n listenerSetter,\n managers: this.managers\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: 400,\n minHeight: 480,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'chatlist') ||\n findUpClassName(target, 'group-call-button') ||\n findUpClassName(target, 'btn-icon') ||\n findUpClassName(target, 'group-call-participants-video-container') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n onResize: () => this.toggleBigLayout(),\n previousState\n });\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n if(this.instance?.id === groupCall.id) {\n this.updateInstance();\n }\n });\n\n listenerSetter.add(instance)('pinned', () => {\n this.setHasPinned();\n });\n\n listenerSetter.add(this.groupCallParticipantsVideo)('toggleControls', this.onToggleControls);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.groupCallParticipantsVideo.destroy();\n this.groupCallParticipants.destroy();\n this.groupCallMicrophoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.toggleRightColumn();\n this.onFullScreenChange();\n\n this.updateInstance();\n }\n\n private constructButtons() {\n const buttons = this.buttonsContainer = document.createElement('div');\n buttons.classList.add(className + '-buttons');\n\n const _makeButton = makeButton.bind(null, className, this.listenerSetter);\n\n const btnVideo = this.btnVideo = _makeButton({\n // text: 'VoiceChat.Video.Stream.Video',\n callback: this.onVideoClick,\n icon: 'videocamera_filled'\n });\n\n const btnScreen = this.btnScreen = _makeButton({\n // text: 'VoiceChat.Video.Stream.Screencast',\n callback: this.onScreenClick,\n icon: 'sharescreen_filled'\n });\n\n btnScreen.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnMute = _makeButton({\n noRipple: true,\n callback: throttle(this.onMuteClick, 600, true)\n });\n btnMute.classList.add(className + '-microphone-button');\n\n const microphoneIcon = this.groupCallMicrophoneIcon = new GroupCallMicrophoneIcon();\n btnMute.append(microphoneIcon.container);\n\n const btnMore = _makeButton({\n // text: 'VoiceChat.Video.Stream.More'\n icon: 'settings_filled'\n });\n\n btnMore.classList.add('btn-disabled');\n btnMore.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnLeave = _makeButton({\n // text: 'VoiceChat.Leave',\n isDanger: true,\n callback: this.onLeaveClick,\n icon: 'close'\n });\n\n buttons.append(btnVideo, btnScreen, btnMute, btnMore, btnLeave);\n\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onToggleControls = (show: boolean) => {\n this.container.classList.toggle('show-controls', show);\n this.buttonsContainer.classList.toggle('show-controls', show);\n };\n\n private toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n\n private onVideoClick = () => {\n const toggle = this.toggleDisability([this.btnVideo], true);\n this.instance.toggleVideoSharing().finally(() => {\n toggle();\n });\n };\n\n private onScreenClick = () => {\n const toggle = this.toggleDisability([this.btnScreen], true);\n this.instance.toggleScreenSharing().finally(() => {\n toggle();\n });\n };\n\n private onMuteClick = () => {\n const participant = this.instance.participant;\n if(!participant.pFlags.can_self_unmute) {\n if(participant.raise_hand_rating === undefined) {\n this.instance.changeRaiseHand(true);\n }\n } else {\n this.instance.toggleMuted();\n }\n };\n\n private onLeaveClick = async() => {\n const hangUp = (discard: boolean) => {\n this.instance.hangUp(discard);\n };\n\n if(await this.managers.appChatsManager.hasRights(this.instance.chatId, 'manage_call')) {\n new PopupPeer('popup-end-video-chat', {\n titleLangKey: 'VoiceChat.End.Title',\n descriptionLangKey: 'VoiceChat.End.Text',\n checkboxes: [{\n text: 'VoiceChat.End.Third'\n }],\n buttons: [{\n langKey: 'VoiceChat.End.OK',\n callback: (checkboxes) => {\n hangUp(!!checkboxes.size);\n },\n isDanger: true\n }]\n }).show();\n } else {\n hangUp(false);\n }\n };\n\n public getContainer() {\n return this.container;\n }\n\n private onFullScreenChange = () => {\n this.toggleBigLayout();\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations2(isFull);\n\n themeController.setThemeColor(isFull ? '#000000' : undefined);\n }\n };\n\n private toggleBigLayout = () => {\n const isFull = isFullScreen();\n const movable = this.movablePanel?.movable;\n const isBig = (isFull || !!(movable && movable.width >= 680)) && !!this.videosCount;\n\n /* if(!isBig && isFull) {\n cancelFullScreen();\n return;\n } */\n\n const wasBig = this.container.classList.contains('is-big-layout');\n let buttons: HTMLElement[];\n if(isBig && !wasBig) { // fix buttons transition to 0 opacity\n buttons = Array.from(this.buttonsContainer.children) as HTMLElement[];\n buttons.forEach((element) => {\n element.style.opacity = '0';\n });\n\n void this.buttonsContainer.offsetLeft;\n }\n\n this.container.classList.toggle('is-big-layout', isBig);\n this.btnInvite.classList.toggle('hide', isBig);\n this.btnShowColumn.classList.toggle('hide', !isBig);\n\n if(buttons) {\n // window.requestAnimationFrame(() => {\n buttons.forEach((element) => {\n element.style.opacity = '';\n });\n // });\n }\n };\n\n private toggleRightColumn = () => {\n this.container.classList.toggle('is-right-column-shown');\n };\n\n private setHasPinned() {\n this.container.classList.toggle('has-pinned', !!this.instance.pinnedSource);\n }\n\n private updateInstance() {\n if(this.instance.state === GROUP_CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.hide();\n return;\n }\n\n const {participant, groupCall} = this.instance;\n if(!participant) {\n return;\n }\n\n this.setTitle();\n this.setDescription();\n this.setHasPinned();\n\n const microphoneButtonState = getGroupCallMicrophoneButtonState(groupCall as any, participant);\n this.container.dataset.micState = microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.HAND ? 'hand' : (microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.MUTED ? 'muted' : 'unmuted');\n this.groupCallMicrophoneIcon.setState(microphoneButtonState);\n }\n\n private setTitle() {\n this.groupCallTitle.update(this.instance);\n }\n\n private setDescription() {\n this.groupCallDescription.update(this.instance);\n this.groupCallBodyHeaderDescription.update(this.instance);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {GroupCallParticipant} from '../../layer';\nimport {i18n} from '../../lib/langPack';\nimport {GROUP_CALL_PARTICIPANT_MUTED_STATE} from '.';\nimport {GroupCallParticipantVideoType} from './participantVideo';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\n\nconst className = 'group-call-participant-status';\nexport default class GroupCallParticipantStatusElement {\n public container: HTMLElement;\n\n constructor(private withIcons: GroupCallParticipantVideoType[]) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE, participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n const icons = this.withIcons.filter((type) => !!participant[type]).map((type) => {\n const iconClassName = `tgico-${type === 'presentation' ? 'listscreenshare' : 'videocamera_filled'}`;\n const i = document.createElement('i');\n i.classList.add(className + '-icon', className + '-icon-' + type, iconClassName);\n return i;\n });\n\n let element2: HTMLElement, actionClassName: string;\n if(state === states.MUTED_FOR_ME) {\n element2 = i18n('VoiceChat.Status.MutedForYou');\n actionClassName = 'is-muted';\n } else if(state === states.UNMUTED) {\n element2 = i18n('VoiceChat.Status.Speaking');\n actionClassName = 'is-speaking';\n } else if(state === states.HAND) {\n element2 = i18n('VoiceChat.Status.WantsSpeak');\n actionClassName = 'is-waiting';\n } else if(participant.about && !icons.length) {\n setInnerHTML(this.container, wrapEmojiText(participant.about));\n return;\n } else {\n element2 = i18n('VoiceChat.Status.Listening');\n actionClassName = 'is-listening';\n }\n\n const span = document.createElement('span');\n span.classList.add(className, actionClassName);\n span.append(...icons, element2);\n\n replaceContent(this.container, span);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {fastRaf} from '../../helpers/schedulers';\nimport SortedList, {SortedElementBase} from '../../helpers/sortedList';\nimport appDialogsManager, {DialogDom, AppDialogsManager, DialogElementSize} from '../../lib/appManagers/appDialogsManager';\nimport {getGroupCallParticipantMutedState} from '.';\nimport GroupCallParticipantMutedIcon from './participantMutedIcon';\nimport GroupCallParticipantStatusElement from './participantStatus';\nimport type GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport type LazyLoadQueue from '../lazyLoadQueue';\n\ninterface SortedParticipant extends SortedElementBase {\n dom: DialogDom,\n mutedIcon: GroupCallParticipantMutedIcon,\n status: GroupCallParticipantStatusElement\n}\n\nexport default class GroupCallParticipantsList extends SortedList {\n public list: HTMLUListElement;\n\n protected lazyLoadQueue: LazyLoadQueue;\n protected avatarSize: DialogElementSize = 'abitbigger';\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0] = {/* new: true, */dialogSize: 72};\n\n constructor(private instance: GroupCallInstance) {\n super({\n getIndex: async(element) => (await this.instance.getParticipantByPeerId(element.id)).date,\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onElementDestroy(element);\n },\n onUpdate: async(element) => {\n const participant = await this.instance.getParticipantByPeerId(element.id);\n const state = getGroupCallParticipantMutedState(participant);\n\n element.mutedIcon.setState(state);\n element.status.setState(state, participant);\n },\n onSort: (element, idx) => {\n positionElementByIndex(element.dom.listEl, this.list, idx);\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: base.id,\n container: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n wrapOptions: {\n lazyLoadQueue: this.lazyLoadQueue\n }\n });\n\n const className = 'group-call-participant';\n dom.listEl.classList.add(className);\n\n const mutedIcon = new GroupCallParticipantMutedIcon(true);\n const status = new GroupCallParticipantStatusElement(['presentation', 'video']);\n replaceContent(dom.lastMessageSpan, status.container);\n dom.listEl.append(mutedIcon.container);\n (base as SortedParticipant).mutedIcon = mutedIcon;\n (base as SortedParticipant).status = status;\n\n /* instance.getParticipantByPeerId(base.id).then((participant) => {\n const mutedState = getGroupCallParticipantMutedState(participant);\n\n mutedIcon.setState(mutedState);\n status.setState(mutedState, participant);\n }); */\n\n (base as SortedParticipant).dom = dom;\n\n return base as SortedParticipant;\n },\n updateElementWith: fastRaf\n });\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n }\n\n public destroy() {\n this.elements.forEach((element) => {\n this.onElementDestroy(element);\n });\n }\n\n protected onElementDestroy(element: SortedParticipant) {\n element.mutedIcon.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {animate} from '../../helpers/animation';\n\nexport default function callVideoCanvasBlur(video: HTMLVideoElement) {\n const canvas = document.createElement('canvas');\n canvas.classList.add('call-video-blur');\n const size = 16;\n canvas.width = size;\n canvas.height = size;\n\n const ctx = canvas.getContext('2d', {alpha: false});\n ctx.filter = 'blur(2px)';\n const renderFrame = () => {\n ctx.drawImage(video, 0, 0, video.videoWidth, video.videoHeight, 0, 0, canvas.width, canvas.height);\n };\n\n animate(() => {\n renderFrame();\n return canvas.isConnected;\n });\n\n renderFrame();\n\n return canvas;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GroupCallParticipant} from '../../layer';\nimport type {GroupCallOutputSource} from '../../lib/appManagers/appGroupCallsManager';\nimport {i18n} from '../../lib/langPack';\nimport PeerTitle from '../peerTitle';\nimport {getGroupCallParticipantMutedState} from '.';\nimport GroupCallParticipantMutedIcon from './participantMutedIcon';\nimport GroupCallParticipantStatusElement from './participantStatus';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport callVideoCanvasBlur from '../call/videoCanvasBlur';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nconst className = 'group-call-participant-video';\n\nexport type GroupCallParticipantVideoType = 'video' | 'presentation';\nexport default class GroupCallParticipantVideoElement {\n public container: HTMLElement;\n private peerTitle: PeerTitle;\n private subtitle: HTMLElement;\n private info: HTMLElement;\n private left: HTMLElement;\n private right: HTMLElement;\n private header: HTMLElement;\n private groupCallParticipantMutedIcon: GroupCallParticipantMutedIcon;\n private groupCallParticipantStatus: GroupCallParticipantStatusElement;\n\n constructor(private managers: AppManagers, private instance: GroupCallInstance, public source: GroupCallOutputSource) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n\n this.info = document.createElement('div');\n this.info.classList.add(className + '-info');\n\n this.left = document.createElement('div');\n this.left.classList.add(className + '-info-left');\n\n this.right = document.createElement('div');\n this.right.classList.add(className + '-info-right');\n\n this.info.append(this.left, this.right);\n\n this.container.append(this.info);\n }\n\n public setPinned(value: boolean) {\n if(!value) {\n if(this.header) {\n this.header.remove();\n this.header = undefined;\n }\n\n return;\n } else if(this.header) {\n return;\n }\n\n // if(!this.header) {\n this.header = document.createElement('div');\n this.header.classList.add(className + '-header');\n\n const icon = document.createElement('i');\n icon.classList.add('group-call-pin-icon', 'tgico-pin');\n this.header.append(icon);\n\n this.container.append(this.header);\n // }\n\n // this.container.classList.toggle('is-pinned', value);\n }\n\n public setParticipant(participant: GroupCallParticipant, type: GroupCallParticipantVideoType, video: HTMLVideoElement) {\n let peerTitleElement: HTMLElement;\n if(participant.pFlags.self) {\n peerTitleElement = i18n('VoiceChat.Status.You');\n peerTitleElement.classList.add('peer-title');\n } else {\n this.peerTitle = new PeerTitle({\n peerId: getPeerId(participant.peer)\n });\n\n peerTitleElement = this.peerTitle.element;\n }\n\n this.groupCallParticipantMutedIcon = new GroupCallParticipantMutedIcon(false);\n this.groupCallParticipantStatus = new GroupCallParticipantStatusElement([type]);\n\n this.left.append(peerTitleElement, this.groupCallParticipantStatus.container);\n\n this.right.append(this.groupCallParticipantMutedIcon.container);\n\n video.classList.add(className, 'call-video');\n\n if(video.paused) {\n video.play();\n }\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(className + '-blur');\n\n this.container.prepend(canvas, video);\n\n this.updateParticipant(participant);\n }\n\n public updateParticipant(participant: GroupCallParticipant) {\n const state = getGroupCallParticipantMutedState(participant);\n\n this.groupCallParticipantMutedIcon.setState(state);\n this.groupCallParticipantStatus.setState(state, participant);\n }\n\n public destroy() {\n this.groupCallParticipantMutedIcon.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport ControlsHover from '../../helpers/dom/controlsHover';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {GroupCallParticipant} from '../../layer';\nimport {GroupCallOutputSource} from '../../lib/appManagers/appGroupCallsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport rootScope from '../../lib/rootScope';\nimport GroupCallParticipantVideoElement, {GroupCallParticipantVideoType} from './participantVideo';\n\nexport default class GroupCallParticipantsVideoElement extends ControlsHover {\n private container: HTMLDivElement;\n private instance: GroupCallInstance;\n private participantsElements: Map>;\n private displayPinned: boolean;\n private containers: Map;\n private onLengthChange: (length: number) => void;\n private managers: AppManagers;\n\n constructor(options: {\n appendTo: HTMLElement,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n displayPinned: boolean,\n onLengthChange?: GroupCallParticipantsVideoElement['onLengthChange'],\n managers: AppManagers\n }) {\n super();\n safeAssign(this, options);\n\n const className = 'group-call-participants-video';\n const container = this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n\n options.appendTo.append(container);\n\n this.participantsElements = new Map();\n this.containers = new Map();\n\n const {listenerSetter} = this;\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n listenerSetter.add(this.instance)('pinned', (source) => {\n this.participantsElements.forEach((map) => {\n map.forEach((element) => {\n this.setElementDisplay(element, source);\n });\n });\n });\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'group-call-participant-video-container');\n if(!container) {\n return;\n }\n\n const element = this.containers.get(container);\n if(this.instance.pinnedSource === element.source) {\n this.instance.unpinAll();\n return;\n }\n\n this.instance.pinSource(element.source);\n }, {listenerSetter});\n\n this.setInstance(this.instance);\n\n this.setup({\n element: container,\n listenerSetter: listenerSetter,\n showOnLeaveToClassName: 'group-call-buttons'\n });\n }\n\n private shouldDisplayElement(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n return this.displayPinned ? !pinnedSource || element.source === pinnedSource : pinnedSource && element.source !== pinnedSource;\n }\n\n private setElementDisplay(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n const shouldDisplay = this.shouldDisplayElement(element, pinnedSource);\n element.container.classList.toggle('video-hidden', !shouldDisplay);\n\n const isPinned = element.source === pinnedSource;\n element.setPinned(isPinned);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = getPeerId(participant.peer);\n const types: GroupCallParticipantVideoType[] = ['video', 'presentation'];\n const hasAnyVideo = types.some((type) => !!participant[type]);\n let participantElements = this.participantsElements.get(peerId);\n if(!hasAnyVideo && !participantElements) {\n return;\n }\n\n if(!participantElements) {\n this.participantsElements.set(peerId, participantElements = new Map());\n }\n\n types.forEach((type) => {\n let element = participantElements.get(type);\n const participantVideo = participant[type];\n if(!!participantVideo === !!element) {\n if(element) {\n element.updateParticipant(participant);\n }\n\n return;\n }\n\n if(participantVideo) {\n const result = this.instance.getVideoElementFromParticipantByType(participant, type);\n if(!result) {\n return;\n }\n\n const {video, source} = result;\n\n element = new GroupCallParticipantVideoElement(this.managers, this.instance, source);\n\n this.containers.set(element.container, element);\n\n this.setElementDisplay(element, this.instance.pinnedSource);\n participantElements.set(type, element);\n element.setParticipant(participant, type, video);\n\n this.container.prepend(element.container);\n } else {\n participantElements.delete(type);\n element.container.remove();\n\n if(!participantElements.size) {\n this.participantsElements.delete(peerId);\n this.containers.delete(element.container);\n element.destroy();\n }\n }\n\n this._onLengthChange();\n });\n }\n\n private _onLengthChange() {\n const length = this.container.childElementCount;\n this.container.dataset.length = '' + length;\n this.container.dataset.layout = length <= 2 ? '1' : (length === 3 ? '3' : '4');\n\n this.onLengthChange && this.onLengthChange(length);\n }\n\n public async setInstance(instance: GroupCallInstance) {\n (await instance.participants).forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n\n public destroy() {\n this.containers.forEach((element) => {\n element.destroy();\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupGroupCall from '.';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport {addFullScreenListener, isFullScreen} from '../../helpers/dom/fullScreen';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport noop from '../../helpers/noop';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport positionMenu from '../../helpers/positionMenu';\nimport ScrollableLoader from '../../helpers/scrollableLoader';\nimport {GroupCallParticipant} from '../../layer';\nimport type {AppChatsManager} from '../../lib/appManagers/appChatsManager';\nimport type {AppGroupCallsManager} from '../../lib/appManagers/appGroupCallsManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport type {AppPeersManager} from '../../lib/appManagers/appPeersManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport rootScope from '../../lib/rootScope';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from '../buttonMenu';\nimport confirmationPopup from '../confirmationPopup';\nimport PeerTitle from '../peerTitle';\nimport PopupElement from '../popups';\nimport Scrollable from '../scrollable';\nimport GroupCallParticipantsList from './participantsList';\nimport GroupCallParticipantsVideoElement from './participantVideos';\n\nexport class GroupCallParticipantContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify: (peerId: PeerId) => boolean | Promise})[];\n private element: HTMLElement;\n private chatId: ChatId;\n private targetPeerId: PeerId;\n private participant: GroupCallParticipant;\n private instance: GroupCallInstance;\n private canManageCall: boolean;\n private managers: AppManagers;\n\n constructor(options: {\n listenerSetter: ListenerSetter,\n onContextElement: HTMLElement,\n managers: AppManagers,\n instance: GroupCallInstance,\n }) {\n this.buttons = [{\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MutePeer',\n verify: () => this.canManageCall && this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmutePeer',\n verify: () => this.canManageCall && !this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MuteForMe',\n verify: () => !this.canManageCall && !this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmuteForMe',\n verify: () => !this.canManageCall && this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'newprivate',\n text: 'VoiceChat.OpenProfile',\n verify: () => true,\n onClick: this.onOpenProfileClick\n }, {\n icon: 'deleteuser danger',\n text: 'VoiceChat.RemovePeer',\n verify: () => this.managers.appChatsManager.hasRights(this.chatId, 'ban_users'),\n onClick: async() => {\n confirmationPopup({\n peerId: this.targetPeerId,\n title: new PeerTitle({peerId: this.targetPeerId}).element,\n descriptionLangKey: await this.managers.appChatsManager.isBroadcast(this.chatId) ? 'VoiceChat.RemovePeer.Confirm.Channel' : 'VoiceChat.RemovePeer.Confirm',\n descriptionLangArgs: [new PeerTitle({peerId: this.targetPeerId}).element],\n button: {\n langKey: 'VoiceChat.RemovePeer.Confirm.OK',\n isDanger: true\n }\n }).then(() => {\n this.managers.appChatsManager.kickFromChat(this.chatId, this.targetPeerId);\n }, noop);\n }\n }];\n\n const {listenerSetter} = options;\n this.managers = options.managers;\n this.instance = options.instance;\n this.chatId = this.instance.chatId;\n\n this.element = ButtonMenuSync({buttons: this.buttons, listenerSetter});\n this.element.classList.add('group-call-participant-menu', 'night');\n\n attachContextMenuListener(options.onContextElement, async(e) => {\n const li = findUpClassName(e.target, 'group-call-participant');\n if(!li) {\n return;\n }\n\n if(this.element.parentElement !== appendTo) {\n appendTo.append(this.element);\n }\n\n cancelEvent(e);\n\n const peerId = this.targetPeerId = li.dataset.peerId.toPeerId();\n this.participant = await this.instance.getParticipantByPeerId(peerId);\n if(this.participant.pFlags.self) {\n return;\n }\n\n this.canManageCall = await this.managers.appChatsManager.hasRights(this.chatId, 'manage_call');\n\n await filterAsync(this.buttons, async(button) => {\n const good = await button.verify(peerId);\n button.element.classList.toggle('hide', !good);\n return good;\n });\n\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, this.element, 'right');\n contextMenuController.openBtnMenu(this.element);\n }, listenerSetter);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n const peerId = getPeerId(participant.peer);\n if(this.targetPeerId === peerId) {\n contextMenuController.close();\n }\n }\n });\n\n let appendTo: HTMLElement = document.body;\n addFullScreenListener(document.body, () => {\n const isFull = isFullScreen();\n appendTo = isFull ? PopupElement.getPopups(PopupGroupCall)[0].getContainer(): document.body;\n\n if(!isFull) {\n contextMenuController.close();\n }\n }, listenerSetter);\n }\n\n private onOpenProfileClick = () => {\n const popup = PopupElement.getPopups(PopupGroupCall)[0];\n if(popup) {\n popup.hide();\n }\n\n appImManager.setInnerPeer({peerId: this.targetPeerId});\n };\n\n private toggleParticipantMuted = (muted: boolean) => {\n this.instance.editParticipant(this.participant, {\n muted\n });\n };\n};\n\nexport default class GroupCallParticipantsElement {\n private container: HTMLDivElement;\n private sortedList: GroupCallParticipantsList;\n private instance: GroupCallInstance;\n private listenerSetter: ListenerSetter;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private contextMenu: GroupCallParticipantContextMenu;\n private managers: AppManagers;\n\n constructor(options: {\n appendTo: HTMLElement,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n managers: AppManagers\n }) {\n safeAssign(this, options);\n\n const className = 'group-call-participants';\n\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add(className + '-scrollable');\n\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n // const invite = Button(`btn-primary btn-transparent ${className}-invite`, {icon: 'adduser', text: 'VoiceChat.Invite.InviteMembers'});\n\n const sortedList = this.sortedList = new GroupCallParticipantsList(this.instance);\n\n const {instance, listenerSetter} = this;\n this.contextMenu = new GroupCallParticipantContextMenu({\n ...options,\n onContextElement: sortedList.list,\n listenerSetter,\n instance\n });\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n ...options,\n appendTo: scrollable.container,\n displayPinned: false\n });\n\n scrollable.append(/* invite, */sortedList.list);\n container.append(scrollable.container);\n\n options.appendTo.append(container);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n const scrollableLoader = new ScrollableLoader({\n scrollable,\n getPromise: () => {\n return this.managers.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then(({participants, isEnd}) => {\n participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n\n return isEnd;\n });\n }\n });\n\n this.setInstance(instance);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = getPeerId(participant.peer);\n const has = this.sortedList.has(peerId);\n if(participant.pFlags.left) {\n if(has) {\n this.sortedList.delete(peerId);\n }\n\n return;\n }\n\n if(!has) {\n this.sortedList.add(peerId);\n return;\n }\n\n this.sortedList.update(peerId);\n }\n\n public async setInstance(instance: GroupCallInstance) {\n // @ts-ignore\n /* const users = appUsersManager.users;\n for(const userId in users) {\n const participant: GroupCallParticipant = {\n _: 'groupCallParticipant',\n date: 0,\n peer: {_: 'peerUser', user_id: userId.toPeerId()},\n pFlags: {\n muted: true\n },\n source: 1\n };\n\n instance.participants.set(userId.toPeerId(), participant);\n this.updateParticipant(participant);\n } */\n const participants = await instance.participants;\n participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n\n public destroy() {\n this.sortedList.destroy();\n this.groupCallParticipantsVideo.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GroupCall} from '../../layer';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport GROUP_CALL_STATE from '../../lib/calls/groupCallState';\nimport I18n, {LangPackKey, FormatterArguments} from '../../lib/langPack';\n\nexport default class GroupCallDescriptionElement {\n private descriptionIntl: I18n.IntlElement;\n\n constructor(private appendTo: HTMLElement) {\n this.descriptionIntl = new I18n.IntlElement({\n key: 'VoiceChat.Status.Connecting'\n });\n\n this.descriptionIntl.element.classList.add('group-call-description');\n }\n\n public detach() {\n this.descriptionIntl.element.remove();\n }\n\n public update(instance: GroupCallInstance) {\n const {state} = instance;\n\n let key: LangPackKey, args: FormatterArguments;\n if(state === GROUP_CALL_STATE.CONNECTING) {\n key = 'VoiceChat.Status.Connecting';\n } else {\n key = 'VoiceChat.Status.Members';\n args = [(instance.groupCall as GroupCall.groupCall).participants_count];\n }\n\n const {descriptionIntl} = this;\n descriptionIntl.compareAndUpdate({\n key,\n args\n });\n\n if(!this.descriptionIntl.element.parentElement) {\n this.appendTo.append(this.descriptionIntl.element);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {GroupCall} from '../../layer';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport PeerTitle from '../peerTitle';\n\nexport default class GroupCallTitleElement {\n private peerTitle: PeerTitle;\n\n constructor(private appendTo: HTMLElement) {\n this.peerTitle = new PeerTitle({peerId: 0});\n }\n\n public update(instance: GroupCallInstance) {\n const {peerTitle, appendTo} = this;\n const groupCall = instance.groupCall as GroupCall.groupCall;\n const peerId = instance.chatId.toPeerId(true);\n if(groupCall.title) {\n setInnerHTML(appendTo, wrapEmojiText(groupCall.title));\n } else {\n if(peerTitle.options.peerId !== peerId) {\n peerTitle.options.peerId = peerId;\n peerTitle.update();\n }\n\n if(peerTitle.element.parentElement !== appendTo) {\n appendTo.append(peerTitle.element);\n }\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport ripple from '../ripple';\n\nexport default function makeButton(className: string, listenerSetter: ListenerSetter, options: {\n text?: LangPackKey | HTMLElement,\n isDanger?: boolean,\n noRipple?: boolean,\n callback?: () => void,\n icon?: string,\n isConfirm?: boolean,\n}) {\n const _className = className + '-button';\n const buttonDiv = document.createElement('div');\n buttonDiv.classList.add(_className, 'call-button', 'rp-overflow');\n\n if(options.icon) {\n buttonDiv.classList.add('tgico-' + options.icon);\n }\n\n if(!options.noRipple) {\n ripple(buttonDiv);\n }\n\n if(options.isDanger) {\n buttonDiv.classList.add(_className + '-red');\n }\n\n if(options.isConfirm) {\n buttonDiv.classList.add(_className + '-green');\n }\n\n if(options.callback) {\n attachClickEvent(buttonDiv, options.callback, {listenerSetter});\n }\n\n let ret = buttonDiv;\n if(options.text) {\n const div = document.createElement('div');\n div.classList.add(_className + '-container', 'call-button-container');\n\n const textEl = typeof(options.text) === 'string' ? i18n(options.text) : options.text;\n textEl.classList.add(_className + '-text', 'call-button-text');\n\n div.append(buttonDiv, textEl);\n\n ret = div;\n }\n\n return ret;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport mediaSizes from '../helpers/mediaSizes';\nimport clamp from '../helpers/number/clamp';\nimport safeAssign from '../helpers/object/safeAssign';\nimport windowSize from '../helpers/windowSize';\nimport SwipeHandler from './swipeHandler';\n\ntype ResizeSide = 'n' | 'e' | 's' | 'w' | 'ne' | 'se' | 'sw' | 'nw';\nexport type MovableState = {\n top?: number;\n left?: number;\n width: number;\n height: number;\n};\n\nconst className = 'movable-element';\nconst resizeHandlerClassName = className + '-resize-handler';\n\nexport type MovableElementOptions = {\n minWidth: MovableElement['minWidth'],\n minHeight: MovableElement['minHeight'],\n element: MovableElement['element'],\n verifyTouchTarget?: MovableElement['verifyTouchTarget']\n};\n\nexport default class MovableElement extends EventListenerBase<{\n resize: () => void\n}> {\n private minWidth: number;\n private minHeight: number;\n private element: HTMLElement;\n private verifyTouchTarget: SwipeHandler['verifyTouchTarget'];\n\n private top: number;\n private left: number;\n private _width: number;\n private _height: number;\n\n private swipeHandler: SwipeHandler;\n private handlers: HTMLElement[];\n\n constructor(options: MovableElementOptions) {\n super(true);\n safeAssign(this, options);\n\n this.top = this.left = this.width = this.height = 0;\n this.element.classList.add(className);\n\n this.addResizeHandlers();\n this.setSwipeHandler();\n\n mediaSizes.addEventListener('resize', this.onResize);\n }\n\n private onResize = () => {\n this.fixDimensions();\n this.fixPosition();\n this.setPosition();\n };\n\n public destroyElements() {\n this.element.classList.remove(className);\n\n if(this.handlers) {\n this.handlers.forEach((handler) => {\n handler.remove();\n });\n }\n }\n\n public destroy() {\n mediaSizes.removeEventListener('resize', this.onResize);\n this.swipeHandler.removeListeners();\n }\n\n private addResizeHandlers() {\n const sides: ResizeSide[] = ['n', 'e', 's', 'w', 'ne', 'se', 'sw', 'nw'];\n this.handlers = sides.map((side) => {\n const div = document.createElement('div');\n div.dataset.side = side;\n div.classList.add(resizeHandlerClassName, resizeHandlerClassName + '-side-' + side);\n this.element.append(div);\n return div;\n });\n }\n\n private setSwipeHandler() {\n let startTop: number, startLeft: number, startWidth: number, startHeight: number, resizingSide: ResizeSide;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.element,\n onSwipe: (xDiff, yDiff, e) => {\n // console.log(xDiff, yDiff, e);\n\n if(resizingSide) {\n if(resizingSide.includes('e') || resizingSide.includes('w')) {\n const isEnlarging = resizingSide.includes('e') && xDiff > 0 || resizingSide.includes('w') && xDiff < 0;\n const resizeDiff = Math.abs(xDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('e') ? windowSize.width - startLeft : startWidth + startLeft;\n this.width = Math.min(maxPossible, startWidth + resizeDiff);\n }\n\n if(resizingSide.includes('n') || resizingSide.includes('s')) {\n const isEnlarging = resizingSide.includes('s') && yDiff > 0 || resizingSide.includes('n') && yDiff < 0;\n const resizeDiff = Math.abs(yDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('s') ? windowSize.height - startTop : startHeight + startTop;\n this.height = Math.min(maxPossible, startHeight + resizeDiff);\n }\n\n this.fixDimensions();\n\n if(resizingSide.includes('w')) {\n this.left = Math.min(startLeft + startWidth - this.minWidth, startLeft + xDiff);\n }\n\n if(resizingSide.includes('n')) {\n this.top = Math.min(startTop + startHeight - this.minHeight, startTop + yDiff);\n }\n } else {\n this.top = startTop + yDiff;\n this.left = startLeft + xDiff;\n }\n\n this.fixPosition();\n this.setPosition();\n },\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(this.verifyTouchTarget && !this.verifyTouchTarget(e)) {\n return false;\n }\n\n const resizeHandler = findUpClassName(target, resizeHandlerClassName);\n if(resizeHandler) {\n resizingSide = resizeHandler.dataset.side as ResizeSide;\n swipeHandler.setCursor('');\n } else {\n resizingSide = undefined;\n swipeHandler.setCursor('grabbing');\n }\n\n return true;\n },\n onFirstSwipe: () => {\n startTop = this.top;\n startLeft = this.left;\n startWidth = this.width;\n startHeight = this.height;\n }\n });\n }\n\n public setPositionToCenter() {\n this.top = (windowSize.height / 2) - (this.height / 2);\n this.left = (windowSize.width / 2) - (this.width / 2);\n this.setPosition();\n }\n\n private fixDimensions() {\n this.width = clamp(this.width, this.minWidth, windowSize.width);\n this.height = clamp(this.height, this.minHeight, windowSize.height);\n }\n\n private fixPosition() {\n this.top = clamp(this.top, 0, windowSize.height - this.height);\n this.left = clamp(this.left, 0, windowSize.width - this.width);\n }\n\n private setPosition() {\n this.element.style.top = this.top + 'px';\n this.element.style.left = this.left + 'px';\n this.element.style.right = 'auto';\n this.element.style.bottom = 'auto';\n this.element.style.width = this.width + 'px';\n this.element.style.height = this.height + 'px';\n\n this.dispatchEvent('resize');\n }\n\n public get width() {\n return this._width;\n }\n\n public get height() {\n return this._height;\n }\n\n private set width(value: number) {\n this._width = value;\n }\n\n private set height(value: number) {\n this._height = value;\n }\n\n public get state(): MovableState {\n const {top, left, width, height} = this;\n return {\n top,\n left,\n width,\n height\n };\n }\n\n public set state(state: MovableState) {\n const {top, left, width, height} = state;\n this.top = top;\n this.left = left;\n this.width = width;\n this.height = height;\n this.onResize();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MovableElement, {MovableElementOptions, MovableState} from '../components/movableElement';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport ListenerSetter from './listenerSetter';\nimport mediaSizes, {ScreenSize} from './mediaSizes';\nimport safeAssign from './object/safeAssign';\n\nexport default class MovablePanel {\n #movable: MovableElement;\n private listenerSetter: ListenerSetter;\n private previousState: MovableState;\n private onResize: () => void;\n private movableOptions: MovableElementOptions;\n\n constructor(options: {\n listenerSetter: ListenerSetter,\n previousState: MovableState,\n onResize?: () => void,\n movableOptions: MovableElementOptions\n }) {\n safeAssign(this, options);\n\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n\n this.listenerSetter.add(mediaSizes)('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n }\n });\n }\n\n public destroy() {\n const movable = this.movable;\n if(movable) {\n movable.destroy();\n }\n }\n\n public get movable() {\n return this.#movable;\n }\n\n public get state() {\n return this.movable ? this.movable.state : this.previousState;\n }\n\n public set state(state: MovableState) {\n this.previousState = state;\n }\n\n private toggleMovable(enabled: boolean) {\n let {movable} = this;\n if(enabled) {\n if(movable) {\n return;\n }\n\n movable = this.#movable = new MovableElement(this.movableOptions);\n\n movable.state = this.previousState;\n if(this.previousState.top === undefined) {\n movable.setPositionToCenter();\n }\n\n if(this.onResize) {\n this.listenerSetter.add(movable)('resize', this.onResize);\n }\n } else {\n if(!movable) {\n return;\n }\n\n this.previousState = movable.state;\n movable.destroyElements();\n movable.destroy();\n this.#movable = undefined;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function toggleClassName(className: string, elements: HTMLElement[], disable: boolean) {\n elements.forEach((element) => {\n element.classList.toggle(className, disable);\n });\n\n return () => toggleClassName(className, elements, !disable);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport CALL_STATE from '../../lib/calls/callState';\nimport {i18n, LangPackKey} from '../../lib/langPack';\n\nexport default class CallDescriptionElement {\n private container: HTMLElement;\n private state: CALL_STATE;\n private interval: number;\n\n constructor(private appendTo: HTMLElement) {\n this.container = document.createElement('div');\n this.container.classList.add('call-description');\n }\n\n public detach() {\n if(this.interval !== undefined) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n\n this.container.remove();\n this.state = undefined;\n }\n\n public update(instance: any) {\n const {connectionState} = instance;\n\n if(this.state === connectionState) {\n return;\n }\n\n this.state = connectionState;\n\n let element: HTMLElement;\n if(connectionState === CALL_STATE.CONNECTED) {\n element = document.createElement('span');\n element.classList.add('call-description-duration');\n\n const setTime = () => {\n element.innerText = toHHMMSS(instance.duration, true);\n };\n\n this.interval = window.setInterval(setTime, 1000);\n setTime();\n } else {\n let langPackKey: LangPackKey;\n switch(connectionState) {\n case CALL_STATE.PENDING:\n langPackKey = instance.isOutgoing ? 'Call.StatusRinging' : 'Call.StatusCalling';\n break;\n case CALL_STATE.REQUESTING:\n langPackKey = 'Call.StatusRequesting';\n break;\n case CALL_STATE.EXCHANGING_KEYS:\n langPackKey = 'VoipExchangingKeys';\n break;\n case CALL_STATE.CLOSED:\n langPackKey = instance.connectedAt !== undefined ? 'Call.StatusEnded' : 'Call.StatusFailed';\n break;\n default:\n langPackKey = 'Call.StatusConnecting';\n break;\n }\n\n element = i18n(langPackKey);\n if(this.interval !== undefined) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n }\n\n this.container.classList.toggle('has-duration', connectionState === CALL_STATE.CONNECTED);\n replaceContent(this.container, element);\n\n if(!this.container.parentElement) {\n this.appendTo.append(this.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SuperRLottieIcon} from '../superIcon';\n\nexport default class GroupCallMicrophoneIconMini extends SuperRLottieIcon<{\n PartState: boolean,\n ColorState: boolean,\n Items: {\n name: 'voice_mini'\n }[]\n}> {\n constructor(colored?: boolean, skipAnimation?: boolean) {\n super({\n width: 36,\n height: 36,\n getPart: (state) => {\n return this.getItem().getPart(state ? 'unmute' : 'mute');\n },\n getColor: colored ? (state) => {\n return state ? [255, 255, 255] : [158, 158, 158];\n } : undefined,\n skipAnimation\n });\n\n this.add({\n name: 'voice_mini',\n parts: [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 171,\n name: 'unmuted-to-hand'\n }]\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_SCREEN_SHARING_SUPPORTED from '../../environment/screenSharingSupport';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport ControlsHover from '../../helpers/dom/controlsHover';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport {addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen} from '../../helpers/dom/fullScreen';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport MovablePanel from '../../helpers/movablePanel';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport themeController from '../../helpers/themeController';\nimport toggleClassName from '../../helpers/toggleClassName';\nimport CallInstance from '../../lib/calls/callInstance';\nimport CALL_STATE from '../../lib/calls/callState';\nimport I18n, {i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport animationIntersector from '../animationIntersector';\nimport AvatarElement from '../avatar';\nimport ButtonIcon from '../buttonIcon';\nimport GroupCallMicrophoneIconMini from '../groupCall/microphoneIconMini';\nimport {MovableState} from '../movableElement';\nimport PeerTitle from '../peerTitle';\nimport PopupElement from '../popups';\nimport SetTransition from '../singleTransition';\nimport makeButton from './button';\nimport CallDescriptionElement from './description';\nimport callVideoCanvasBlur from './videoCanvasBlur';\n\nconst className = 'call';\n\nconst MIN_WIDTH = 400;\nconst MIN_HEIGHT = 580;\n\nconst INIT_STATE: MovableState = {\n width: MIN_WIDTH,\n height: MIN_HEIGHT\n};\n\nlet previousState: MovableState = {...INIT_STATE};\n\nexport default class PopupCall extends PopupElement {\n private peerId: PeerId;\n\n private description: CallDescriptionElement;\n private emojisSubtitle: HTMLElement;\n\n private partyStates: HTMLElement;\n private partyMutedState: HTMLElement;\n\n private firstButtonsRow: HTMLElement;\n private secondButtonsRow: HTMLElement;\n\n private declineI18nElement: I18n.IntlElement;\n\n private makeButton: (options: Parameters[2]) => HTMLElement;\n private btnAccept: HTMLElement;\n private btnDecline: HTMLElement;\n private btnVideo: HTMLElement;\n private btnScreen: HTMLElement;\n private btnMute: HTMLElement;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n\n private movablePanel: MovablePanel;\n private microphoneIcon: GroupCallMicrophoneIconMini;\n private muteI18nElement: I18n.IntlElement;\n\n private videoContainers: {\n input?: HTMLElement,\n output?: HTMLElement\n };\n\n private controlsHover: ControlsHover;\n\n constructor(private instance: CallInstance) {\n super('popup-call', {\n withoutOverlay: true,\n closable: true\n });\n\n this.videoContainers = {};\n\n const {container, listenerSetter} = this;\n container.classList.add(className, 'night');\n\n const avatarContainer = document.createElement('div');\n avatarContainer.classList.add(className + '-avatar');\n\n const peerId = this.peerId = this.instance.interlocutorUserId.toPeerId();\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-full');\n avatar.updateWithOptions({\n isBig: true,\n peerId: peerId\n });\n avatarContainer.append(avatar);\n\n const title = new PeerTitle({\n peerId\n }).element;\n\n title.classList.add(className + '-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-subtitle');\n\n const description = this.description = new CallDescriptionElement(subtitle);\n\n const emojisSubtitle = this.emojisSubtitle = document.createElement('div');\n emojisSubtitle.classList.add(className + '-emojis');\n\n container.append(avatarContainer, title, subtitle);\n\n if(!IS_MOBILE) {\n this.btnFullScreen = ButtonIcon('fullscreen');\n this.btnExitFullScreen = ButtonIcon('smallscreen hide');\n attachClickEvent(this.btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(this.btnExitFullScreen, () => cancelFullScreen(), {listenerSetter});\n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n this.header.prepend(this.btnExitFullScreen);\n this.header.append(this.btnFullScreen);\n\n container.append(emojisSubtitle);\n } else {\n this.header.append(emojisSubtitle);\n }\n\n this.partyStates = document.createElement('div');\n this.partyStates.classList.add(className + '-party-states');\n\n this.partyMutedState = document.createElement('div');\n this.partyMutedState.classList.add(className + '-party-state');\n const stateText = i18n('VoipUserMicrophoneIsOff', [new PeerTitle({peerId, onlyFirstName: true, limitSymbols: 18}).element]);\n stateText.classList.add(className + '-party-state-text');\n const mutedIcon = new GroupCallMicrophoneIconMini(false, true);\n mutedIcon.setState(false, false);\n this.partyMutedState.append(\n mutedIcon.container,\n stateText\n );\n\n this.partyStates.append(this.partyMutedState);\n this.container.append(this.partyStates);\n\n this.makeButton = makeButton.bind(null, className, this.listenerSetter);\n this.constructFirstButtons();\n this.constructSecondButtons();\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(instance)('mediaState', () => {\n this.updateInstance();\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: MIN_WIDTH,\n minHeight: MIN_HEIGHT,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'call-button') ||\n findUpClassName(target, 'btn-icon') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n // onResize: () => this.toggleBigLayout(),\n previousState: !this.instance.wasTryingToJoin && !this.instance.isOutgoing ? {...INIT_STATE} : previousState\n });\n\n const movableElement = this.movablePanel.movable;\n if(movableElement) {\n this.listenerSetter.add(movableElement)('resize', () => {\n this.resizeVideoContainers();\n });\n }\n\n const controlsHover = this.controlsHover = new ControlsHover();\n controlsHover.setup({\n element: this.container,\n listenerSetter: this.listenerSetter,\n showOnLeaveToClassName: 'call-buttons'\n });\n controlsHover.showControls(false);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.microphoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.updateInstance();\n }\n\n public getCallInstance() {\n return this.instance;\n }\n\n private constructFirstButtons() {\n const buttons = this.firstButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-first');\n\n const toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n\n const btnVideo = this.btnVideo = this.makeButton({\n text: 'Call.Camera',\n icon: 'videocamera_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleVideoSharing().finally(toggle);\n }\n });\n\n const btnScreen = this.btnScreen = this.makeButton({\n text: 'Call.Screen',\n icon: 'sharescreen_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleScreenSharing().finally(toggle);\n }\n });\n\n if(!IS_SCREEN_SHARING_SUPPORTED) {\n btnScreen.classList.add('hide');\n this.container.classList.add('no-screen');\n }\n\n this.muteI18nElement = new I18n.IntlElement({\n key: 'Call.Mute'\n });\n const btnMute = this.btnMute = this.makeButton({\n text: this.muteI18nElement.element,\n callback: () => {\n this.instance.toggleMuted();\n }\n });\n\n const microphoneIcon = this.microphoneIcon = new GroupCallMicrophoneIconMini(true, true);\n btnMute.firstElementChild.append(microphoneIcon.container);\n\n // btnVideo.classList.add('disabled');\n // btnScreen.classList.add('disabled');\n\n buttons.append(btnVideo, btnScreen, btnMute);\n this.container.append(buttons);\n }\n\n private constructSecondButtons() {\n const buttons = this.secondButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-second');\n\n this.declineI18nElement = new I18n.IntlElement({\n key: 'Call.Decline'\n });\n const btnDecline = this.btnDecline = this.makeButton({\n text: this.declineI18nElement.element,\n icon: 'endcall_filled',\n callback: () => {\n this.instance.hangUp('phoneCallDiscardReasonHangup');\n },\n isDanger: true\n });\n\n const btnAccept = this.btnAccept = this.makeButton({\n text: 'Call.Accept',\n icon: 'phone_filled',\n callback: () => {\n this.instance.acceptCall();\n },\n isConfirm: true\n });\n\n buttons.append(btnDecline, btnAccept);\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onFullScreenChange = () => {\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations(isFull);\n\n themeController.setThemeColor(isFull ? '#000000' : undefined);\n\n this.resizeVideoContainers();\n }\n };\n\n private createVideoContainer(video: HTMLVideoElement) {\n const _className = className + '-video';\n const container = document.createElement('div');\n container.classList.add(_className + '-container');\n\n video.classList.add(_className);\n if(video.paused) {\n video.play();\n }\n\n attachClickEvent(container, () => {\n if(!container.classList.contains('small')) {\n return;\n }\n\n const big = Object.values(this.videoContainers).find((container) => !container.classList.contains('small'));\n big.classList.add('small');\n big.style.cssText = container.style.cssText;\n container.classList.remove('small');\n container.style.cssText = '';\n\n this.resizeVideoContainers();\n });\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(_className + '-blur');\n\n container.append(canvas, video);\n\n return container;\n }\n\n private updateInstance() {\n const {instance} = this;\n const {connectionState} = instance;\n if(connectionState === CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.btnVideo.classList.add('disabled');\n\n this.hide();\n return;\n }\n\n const isPendingIncoming = !instance.isOutgoing && connectionState === CALL_STATE.PENDING;\n this.declineI18nElement.compareAndUpdate({\n key: connectionState === CALL_STATE.PENDING ? 'Call.Decline' : 'Call.End'\n });\n this.btnAccept.classList.toggle('disable', !isPendingIncoming);\n this.btnAccept.classList.toggle('hide-me', !isPendingIncoming);\n this.container.classList.toggle('two-button-rows', isPendingIncoming);\n\n const isMuted = instance.isMuted;\n const onFrame = () => {\n this.btnMute.firstElementChild.classList.toggle('active', isMuted);\n };\n\n const player = this.microphoneIcon.getItem().player;\n this.microphoneIcon.setState(!isMuted, !isMuted, onFrame);\n if(!player) {\n onFrame();\n }\n\n this.muteI18nElement.compareAndUpdate({\n key: isMuted ? 'VoipUnmute' : 'Call.Mute'\n });\n\n const isSharingVideo = instance.isSharingVideo;\n this.btnVideo.firstElementChild.classList.toggle('active', isSharingVideo);\n\n const isSharingScreen = instance.isSharingScreen;\n this.btnScreen.firstElementChild.classList.toggle('active', isSharingScreen);\n\n const outputState = instance.getMediaState('output');\n\n SetTransition({\n element: this.partyMutedState,\n className: 'is-visible',\n forwards: !!outputState?.muted,\n duration: 300\n });\n\n const containers = this.videoContainers;\n const oldContainers = {...containers};\n ['input' as const, 'output' as const].forEach((type) => {\n const mediaState = instance.getMediaState(type);\n const video = instance.getVideoElement(type) as HTMLVideoElement;\n\n const hasFrame = !!(video && video.videoWidth && video.videoHeight);\n if(video && !hasFrame && !video.dataset.hasPromise) {\n video.dataset.hasPromise = '1';\n // container.classList.add('hide');\n onMediaLoad(video).then(() => {\n delete video.dataset.hasPromise;\n this.updateInstance();\n // this.resizeVideoContainers();\n // container.classList.remove('hide');\n });\n }\n\n const isActive = !!video && hasFrame && !!(mediaState && (mediaState.videoState === 'active' || mediaState.screencastState === 'active'));\n let videoContainer = containers[type];\n\n if(isActive && video && !videoContainer) {\n videoContainer = containers[type] = this.createVideoContainer(video);\n this.container.append(videoContainer);\n }\n\n if(!isActive && videoContainer) {\n videoContainer.remove();\n delete containers[type];\n }\n });\n\n {\n const input = containers.input;\n const output = containers.output;\n if(Object.keys(oldContainers).length !== Object.keys(containers).length && input) {\n input.classList.toggle('small', !!output);\n }\n\n if(output && !input) {\n output.classList.remove('small');\n }\n }\n\n this.resizeVideoContainers();\n\n this.container.classList.toggle('no-video', !Object.keys(containers).length);\n\n if(!this.emojisSubtitle.textContent && connectionState < CALL_STATE.EXCHANGING_KEYS) {\n Promise.resolve(instance.getEmojisFingerprint()).then((emojis) => {\n replaceContent(this.emojisSubtitle, wrapEmojiText(emojis.join('')));\n });\n }\n\n this.setDescription();\n }\n\n private resizeVideoContainers() {\n Object.values(this.videoContainers).forEach((container) => {\n const isSmall = container.classList.contains('small');\n if(isSmall) {\n const video = container.querySelector('video');\n const popupWidth = this.movablePanel.state;\n const MAX_WIDTH_PX = 240;\n const MAX_HEIGHT_PX = 240;\n\n const isVertical = video.videoHeight > video.videoWidth;\n const MAX_SIZE = isVertical ? MAX_HEIGHT_PX : MAX_WIDTH_PX;\n\n const biggestSideSize = 1 / 3 * (isFullScreen() ? 0xFFFF : (isVertical ? popupWidth.height : popupWidth.width));\n const widthRatio = isVertical ? video.videoWidth / video.videoHeight : 1;\n const heightRatio = isVertical ? 1 : video.videoHeight / video.videoWidth;\n container.style.width = biggestSideSize * widthRatio + 'px';\n container.style.height = biggestSideSize * heightRatio + 'px';\n container.style.maxWidth = MAX_SIZE * widthRatio + 'px';\n container.style.maxHeight = MAX_SIZE * heightRatio + 'px';\n } else {\n container.style.cssText = '';\n }\n });\n }\n\n private setDescription() {\n this.description.update(this.instance);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport GROUP_CALL_STATE from '../lib/calls/groupCallState';\nimport rootScope from '../lib/rootScope';\nimport ButtonIcon from './buttonIcon';\nimport TopbarWeave from './topbarWeave';\nimport SetTransition from './singleTransition';\nimport PopupGroupCall from './groupCall';\nimport GroupCallDescriptionElement from './groupCall/description';\nimport GroupCallTitleElement from './groupCall/title';\nimport PopupElement from './popups';\nimport throttle from '../helpers/schedulers/throttle';\nimport GroupCallInstance from '../lib/calls/groupCallInstance';\nimport CALL_STATE from '../lib/calls/callState';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport PeerTitle from './peerTitle';\nimport CallDescriptionElement from './call/description';\nimport PopupCall from './call';\nimport GroupCallMicrophoneIconMini from './groupCall/microphoneIconMini';\nimport CallInstance from '../lib/calls/callInstance';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport groupCallsController from '../lib/calls/groupCallsController';\nimport StreamManager from '../lib/calls/streamManager';\nimport callsController from '../lib/calls/callsController';\n\nfunction convertCallStateToGroupState(state: CALL_STATE, isMuted: boolean) {\n switch(state) {\n case CALL_STATE.CLOSING:\n case CALL_STATE.CLOSED:\n return GROUP_CALL_STATE.CLOSED;\n case CALL_STATE.CONNECTED:\n return isMuted ? GROUP_CALL_STATE.MUTED : GROUP_CALL_STATE.UNMUTED;\n default:\n return GROUP_CALL_STATE.CONNECTING;\n }\n}\n\nconst CLASS_NAME = 'topbar-call';\n\nexport default class TopbarCall {\n public container: HTMLElement;\n private listenerSetter: ListenerSetter;\n private weave: TopbarWeave;\n private center: HTMLDivElement;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallMicrophoneIconMini: GroupCallMicrophoneIconMini;\n private callDescription: CallDescriptionElement;\n\n private currentDescription: GroupCallDescriptionElement | CallDescriptionElement;\n\n private instance: GroupCallInstance | any/* CallInstance */;\n private instanceListenerSetter: ListenerSetter;\n\n constructor(\n private managers: AppManagers\n ) {\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n listenerSetter.add(callsController)('instance', ({instance}) => {\n if(!this.instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(callsController)('accepting', (instance) => {\n if(this.instance !== instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(groupCallsController)('instance', (instance) => {\n this.updateInstance(instance);\n });\n\n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n const instance = groupCallsController.groupCall;\n if(instance?.id === groupCall.id) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(StreamManager.ANALYSER_LISTENER)('amplitude', ({amplitudes, type}) => {\n const {weave} = this;\n if(!amplitudes.length || !weave/* || type !== 'input' */) return;\n\n let max = 0;\n for(let i = 0; i < amplitudes.length; ++i) {\n const {type, value} = amplitudes[i];\n max = value > max ? value : max;\n }\n\n weave.setAmplitude(max);\n });\n }\n\n private onState = () => {\n this.updateInstance(this.instance);\n };\n\n private clearCurrentInstance() {\n if(!this.instance) return;\n this.center.textContent = '';\n\n if(this.currentDescription) {\n this.currentDescription.detach();\n this.currentDescription = undefined;\n }\n\n this.instance = undefined;\n this.instanceListenerSetter.removeAll();\n }\n\n private updateInstance(instance: TopbarCall['instance']) {\n if(this.construct) {\n this.construct();\n this.construct = undefined;\n }\n\n const isChangingInstance = this.instance !== instance;\n if(isChangingInstance) {\n this.clearCurrentInstance();\n\n this.instance = instance;\n this.instanceListenerSetter = new ListenerSetter();\n\n this.instanceListenerSetter.add(instance as GroupCallInstance)('state', this.onState);\n\n if(instance instanceof GroupCallInstance) {\n this.currentDescription = this.groupCallDescription;\n } else {\n this.currentDescription = this.callDescription;\n this.instanceListenerSetter.add(instance)('muted', this.onState);\n }\n\n this.container.classList.toggle('is-call', !(instance instanceof GroupCallInstance));\n }\n\n const isMuted = this.instance.isMuted;\n const state = instance instanceof GroupCallInstance ? instance.state : convertCallStateToGroupState(instance.connectionState, isMuted);\n\n const {weave} = this;\n\n weave.componentDidMount();\n\n const isClosed = state === GROUP_CALL_STATE.CLOSED;\n if((!document.body.classList.contains('is-calling') || isChangingInstance) || isClosed) {\n if(isClosed) {\n weave.setAmplitude(0);\n }\n\n SetTransition({\n element: document.body,\n className: 'is-calling',\n forwards: !isClosed,\n duration: 250,\n onTransitionEnd: isClosed ? () => {\n weave.componentWillUnmount();\n\n this.clearCurrentInstance();\n } : undefined\n });\n }\n\n if(isClosed) {\n return;\n }\n\n weave.setCurrentState(state, true);\n // if(state === GROUP_CALL_STATE.CONNECTING) {\n // weave.setCurrentState(state, true);\n // } else {\n // /* var a = 0;\n // animate(() => {\n // a += 0.1;\n // if(a > 1) a = 0;\n // weave.setAmplitude(a);\n // return true;\n // });\n // weave.setAmplitude(1); */\n // weave.setCurrentState(state, true);\n // }\n\n this.setTitle(instance);\n this.setDescription(instance);\n this.groupCallMicrophoneIconMini.setState(!isMuted);\n }\n\n private setDescription(instance: TopbarCall['instance']) {\n return this.currentDescription.update(instance as any);\n }\n\n private setTitle(instance: TopbarCall['instance']) {\n if(instance instanceof GroupCallInstance) {\n return this.groupCallTitle.update(instance);\n } else {\n replaceContent(this.center, new PeerTitle({peerId: instance.interlocutorUserId.toPeerId()}).element);\n }\n }\n\n private construct() {\n const {listenerSetter} = this;\n const container = this.container = document.createElement('div');\n container.classList.add('sidebar-header', CLASS_NAME + '-container');\n\n const left = document.createElement('div');\n left.classList.add(CLASS_NAME + '-left');\n\n const groupCallMicrophoneIconMini = this.groupCallMicrophoneIconMini = new GroupCallMicrophoneIconMini();\n\n const mute = ButtonIcon();\n mute.append(groupCallMicrophoneIconMini.container);\n left.append(mute);\n\n const throttledMuteClick = throttle(() => {\n this.instance.toggleMuted();\n }, 600, true);\n\n attachClickEvent(mute, (e) => {\n cancelEvent(e);\n throttledMuteClick();\n }, {listenerSetter});\n\n const center = this.center = document.createElement('div');\n center.classList.add(CLASS_NAME + '-center');\n\n this.groupCallTitle = new GroupCallTitleElement(center);\n this.groupCallDescription = new GroupCallDescriptionElement(left);\n\n this.callDescription = new CallDescriptionElement(left);\n\n const right = document.createElement('div');\n right.classList.add(CLASS_NAME + '-right');\n\n const end = ButtonIcon('endcall_filled');\n right.append(end);\n\n attachClickEvent(end, (e) => {\n cancelEvent(e);\n\n const {instance} = this;\n if(!instance) {\n return;\n }\n\n if(instance instanceof GroupCallInstance) {\n instance.hangUp();\n } else {\n instance.hangUp('phoneCallDiscardReasonHangup');\n }\n }, {listenerSetter});\n\n attachClickEvent(container, () => {\n if(this.instance instanceof GroupCallInstance) {\n if(PopupElement.getPopups(PopupGroupCall).length) {\n return;\n }\n\n new PopupGroupCall().show();\n } else if(this.instance instanceof CallInstance) {\n const popups = PopupElement.getPopups(PopupCall);\n if(popups.find((popup) => popup.getCallInstance() === this.instance)) {\n return;\n }\n\n new PopupCall(this.instance).show();\n }\n }, {listenerSetter});\n\n container.append(left, center, right);\n\n const weave = this.weave = new TopbarWeave();\n const weaveContainer = weave.render(CLASS_NAME + '-weave');\n container.prepend(weaveContainer);\n\n document.getElementById('column-center').prepend(container);\n weave.componentDidMount();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getPeerTitle from '../../components/wrappers/getPeerTitle';\nimport wrapMessageForReply from '../../components/wrappers/messageForReply';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {FontFamily} from '../../config/font';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport IS_VIBRATE_SUPPORTED from '../../environment/vibrateSupport';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport idleController from '../../helpers/idleController';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport tsNow from '../../helpers/tsNow';\nimport {Message, MessagePeerReaction, PeerNotifySettings} from '../../layer';\nimport I18n, {FormatterArguments, LangPackKey} from '../langPack';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport singleInstance from '../mtproto/singleInstance';\nimport webPushApiManager, {PushSubscriptionNotify} from '../mtproto/webPushApiManager';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport wrapPlainText from '../richTextProcessor/wrapPlainText';\nimport rootScope from '../rootScope';\nimport appImManager from './appImManager';\nimport appRuntimeManager from './appRuntimeManager';\nimport {AppManagers} from './managers';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\nimport getPeerId from './utils/peers/getPeerId';\n\ntype MyNotification = Notification & {\n hidden?: boolean,\n show?: () => void,\n};\n\nexport type NotifyOptions = Partial<{\n tag: string;\n image: string;\n key: string;\n title: string;\n message: string;\n silent: boolean;\n onclick: () => void;\n noIncrement: boolean;\n}>;\n\nexport type NotificationSettings = {\n nodesktop: boolean,\n volume: number,\n novibrate: boolean,\n nopreview: boolean,\n nopush: boolean,\n nosound: boolean\n};\n\nexport class UiNotificationsManager {\n private notificationsUiSupport: boolean;\n private notificationsShown: {[key: string]: MyNotification | true} = {};\n private notificationIndex = 0;\n private notificationsCount = 0;\n private soundsPlayed: {[tag: string]: number} = {};\n private vibrateSupport = IS_VIBRATE_SUPPORTED;\n private nextSoundAt: number;\n private prevSoundVolume: number;\n\n private faviconElements = Array.from(document.head.querySelectorAll('link[rel=\"icon\"], link[rel=\"alternate icon\"]'));\n\n private titleBackup = document.title;\n private titleChanged = false;\n private titleInterval: number;\n private prevFavicon: string;\n\n private notifySoundEl: HTMLElement;\n\n private stopped = false;\n\n private topMessagesDeferred: CancellablePromise;\n\n private settings: NotificationSettings = {} as any;\n\n private registeredDevice: any;\n private pushInited = false;\n\n private managers: AppManagers;\n private setAppBadge: (contents?: any) => Promise;\n\n construct(managers: AppManagers) {\n this.managers = managers;\n\n navigator.vibrate = navigator.vibrate || (navigator as any).mozVibrate || (navigator as any).webkitVibrate;\n this.setAppBadge = (navigator as any).setAppBadge && (navigator as any).setAppBadge.bind(navigator);\n this.setAppBadge && this.setAppBadge(0);\n\n this.notificationsUiSupport = ('Notification' in window) || ('mozNotification' in navigator);\n\n this.notifySoundEl = document.createElement('div');\n this.notifySoundEl.id = 'notify-sound';\n document.body.append(this.notifySoundEl);\n\n this.topMessagesDeferred = deferredPromise();\n\n singleInstance.addEventListener('deactivated', () => {\n this.stop();\n });\n\n singleInstance.addEventListener('activated', () => {\n if(this.stopped) {\n this.start();\n }\n });\n\n idleController.addEventListener('change', (idle) => {\n if(this.stopped) {\n return;\n }\n\n if(!idle) {\n this.clear();\n }\n\n this.toggleToggler();\n });\n\n rootScope.addEventListener('notification_reset', (peerString) => {\n this.soundReset(peerString);\n });\n\n rootScope.addEventListener('notification_cancel', (str) => {\n this.cancel(str);\n });\n\n if(this.setAppBadge) {\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === 0) {\n this.setAppBadge(folder.unreadUnmutedPeerIds.size);\n }\n });\n }\n\n webPushApiManager.addEventListener('push_init', (tokenData) => {\n this.pushInited = true;\n if(!this.settings.nodesktop && !this.settings.nopush) {\n if(tokenData) {\n this.registerDevice(tokenData);\n } else {\n webPushApiManager.subscribe();\n }\n } else {\n this.unregisterDevice(tokenData);\n }\n });\n webPushApiManager.addEventListener('push_subscribe', (tokenData) => {\n this.registerDevice(tokenData);\n });\n webPushApiManager.addEventListener('push_unsubscribe', (tokenData) => {\n this.unregisterDevice(tokenData);\n });\n\n rootScope.addEventListener('dialogs_multiupdate', () => {\n // unregisterTopMsgs()\n this.topMessagesDeferred.resolve();\n }, {once: true});\n\n webPushApiManager.addEventListener('push_notification_click', (notificationData) => {\n if(notificationData.action === 'push_settings') {\n /* this.topMessagesDeferred.then(() => {\n $modal.open({\n templateUrl: templateUrl('settings_modal'),\n controller: 'SettingsModalController',\n windowClass: 'settings_modal_window mobile_modal',\n backdrop: 'single'\n })\n }); */\n return;\n }\n\n if(notificationData.action === 'mute1d') {\n this.managers.apiManager.invokeApi('account.updateDeviceLocked', {\n period: 86400\n }).then(() => {\n // var toastData = toaster.pop({\n // type: 'info',\n // body: _('push_action_mute1d_success'),\n // bodyOutputType: 'trustedHtml',\n // clickHandler: () => {\n // toaster.clear(toastData)\n // },\n // showCloseButton: false\n // })\n });\n\n return;\n }\n\n const peerId = notificationData.custom && notificationData.custom.peerId.toPeerId();\n console.log('click', notificationData, peerId);\n if(peerId) {\n this.topMessagesDeferred.then(async() => {\n if(notificationData.custom.channel_id &&\n !(await this.managers.appChatsManager.hasChat(notificationData.custom.channel_id))) {\n return;\n }\n\n if(peerId.isUser() && !(await this.managers.appUsersManager.hasUser(peerId))) {\n return;\n }\n\n appImManager.setInnerPeer({\n peerId,\n lastMsgId: generateMessageId(+notificationData.custom.msg_id)\n });\n });\n }\n });\n }\n\n public async buildNotification({\n message,\n fwdCount,\n peerReaction,\n peerTypeNotifySettings\n }: {\n message: Message.message | Message.messageService,\n fwdCount?: number,\n peerReaction?: MessagePeerReaction,\n peerTypeNotifySettings?: PeerNotifySettings\n }) {\n const peerId = message.peerId;\n const isAnyChat = peerId.isAnyChat();\n const notification: NotifyOptions = {};\n const [peerString, isForum = false] = await Promise.all([\n this.managers.appPeersManager.getPeerString(peerId),\n isAnyChat && this.managers.appPeersManager.isForum(peerId)\n ]);\n let notificationMessage: string;\n let wrappedMessage = false;\n\n if(peerTypeNotifySettings.show_previews) {\n if(message._ === 'message' && message.fwd_from && fwdCount > 1) {\n notificationMessage = I18n.format('Notifications.Forwarded', true, [fwdCount]);\n } else {\n notificationMessage = await wrapMessageForReply({message, plain: true});\n\n const reaction = peerReaction?.reaction;\n if(reaction?._ === 'reactionEmoji') {\n const langPackKey: LangPackKey = /* isAnyChat ? 'Notification.Group.Reacted' : */'Notification.Contact.Reacted';\n const args: FormatterArguments = [\n fixEmoji(reaction.emoticon), // can be plain heart\n notificationMessage\n ];\n\n /* if(isAnyChat) {\n args.unshift(appPeersManager.getPeerTitle(message.fromId, true));\n } */\n\n notificationMessage = I18n.format(langPackKey, true, args);\n } else {\n wrappedMessage = true;\n }\n }\n } else {\n notificationMessage = I18n.format('Notifications.New', true);\n }\n\n if(peerReaction) {\n notification.noIncrement = true;\n notification.silent = true;\n }\n\n const threadId = isForum ? getMessageThreadId(message, isForum) : undefined;\n const notificationFromPeerId = peerReaction ? getPeerId(peerReaction.peer_id) : message.fromId;\n notification.title = await getPeerTitle({peerId, plainText: true, managers: this.managers, threadId: threadId});\n if(isForum) {\n const peerTitle = await getPeerTitle({peerId, plainText: true, managers: this.managers});\n notification.title += ` (${peerTitle})`;\n\n if(wrappedMessage && notificationFromPeerId !== message.peerId) {\n notificationMessage = await getPeerTitle({peerId: notificationFromPeerId, plainText: true, managers: this.managers}) +\n ': ' + notificationMessage;\n }\n } else if(isAnyChat && notificationFromPeerId !== message.peerId) {\n notification.title = await getPeerTitle({peerId: notificationFromPeerId, plainText: true, managers: this.managers}) +\n ' @ ' +\n notification.title;\n }\n\n notification.title = wrapPlainText(notification.title);\n\n notification.onclick = () => {\n appImManager.setInnerPeer({peerId, lastMsgId: message.mid, threadId});\n };\n\n notification.message = notificationMessage;\n notification.key = 'msg' + message.mid;\n notification.tag = peerString;\n notification.silent = true;// message.pFlags.silent || false;\n\n const peerPhoto = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n this.managers.appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small').then((url) => {\n // ! WARNING, message can be already read\n if(message.pFlags.unread || peerReaction) {\n notification.image = url;\n this.notify(notification);\n }\n });\n } else {\n this.notify(notification);\n }\n }\n\n private toggleToggler(enable = idleController.isIdle) {\n if(IS_MOBILE) return;\n\n const resetTitle = (isBlink?: boolean) => {\n this.titleChanged = false;\n document.title = this.titleBackup;\n this.setFavicon();\n };\n\n window.clearInterval(this.titleInterval);\n this.titleInterval = 0;\n\n if(!enable) {\n resetTitle();\n } else {\n this.titleInterval = window.setInterval(() => {\n const count = this.notificationsCount;\n if(!count) {\n this.toggleToggler(false);\n } else if(this.titleChanged) {\n resetTitle(true);\n } else {\n this.titleChanged = true;\n document.title = I18n.format('Notifications.Count', true, [count]);\n // this.setFavicon('assets/img/favicon_unread.ico');\n\n // fetch('assets/img/favicon.ico')\n // .then((res) => res.blob())\n // .then((blob) => {\n // const img = document.createElement('img');\n // img.src = URL.createObjectURL(blob);\n\n const canvas = document.createElement('canvas');\n canvas.width = 32 * window.devicePixelRatio;\n canvas.height = canvas.width;\n\n const ctx = canvas.getContext('2d');\n ctx.beginPath();\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, 2 * Math.PI, false);\n ctx.fillStyle = '#3390ec';\n ctx.fill();\n\n let fontSize = 24;\n let str = '' + count;\n if(count < 10) {\n fontSize = 22;\n } else if(count < 100) {\n fontSize = 20;\n } else {\n str = '99+';\n fontSize = 16;\n }\n\n fontSize *= window.devicePixelRatio;\n\n ctx.font = `700 ${fontSize}px ${FontFamily}`;\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n ctx.fillStyle = 'white';\n ctx.fillText(str, canvas.width / 2, canvas.height * .5625);\n\n /* const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height); */\n\n this.setFavicon(canvas.toDataURL());\n // });\n }\n }, 1000);\n }\n }\n\n private setFavicon(href?: string) {\n if(this.prevFavicon === href) {\n return;\n }\n\n this.prevFavicon = href;\n this.faviconElements.forEach((element, idx, arr) => {\n const link = element.cloneNode() as HTMLLinkElement;\n\n if(!link.dataset.href) {\n link.dataset.href = link.href;\n }\n\n href ??= link.dataset.href;\n link.href = href;\n element.replaceWith(arr[idx] = link);\n });\n }\n\n public notify(data: NotifyOptions) {\n // console.log('notify', data, rootScope.idle.isIDLE, this.notificationsUiSupport, this.stopped);\n\n if(this.stopped) {\n return;\n }\n\n // FFOS Notification blob src bug workaround\n /* if(Config.Navigator.ffos && !Config.Navigator.ffos2p) {\n data.image = 'https://telegram.org/img/t_logo.png'\n }\n else if (data.image && !angular.isString(data.image)) {\n if (Config.Navigator.ffos2p) {\n FileManager.getDataUrl(data.image, 'image/jpeg').then(function (url) {\n data.image = url\n notify(data)\n })\n return false\n } else {\n data.image = FileManager.getUrl(data.image, 'image/jpeg')\n }\n }\n else */ if(!data.image) {\n data.image = 'assets/img/logo_filled_rounded.png';\n }\n // console.log('notify image', data.image)\n\n if(!data.noIncrement) {\n ++this.notificationsCount;\n }\n\n if(!this.titleInterval) {\n this.toggleToggler();\n }\n\n const idx = ++this.notificationIndex;\n const key = data.key || 'k' + idx;\n this.notificationsShown[key] = true;\n\n const now = tsNow();\n if(this.settings.volume > 0 && !this.settings.nosound/* &&\n (\n !data.tag ||\n !this.soundsPlayed[data.tag] ||\n now > this.soundsPlayed[data.tag] + 60000\n ) */\n ) {\n this.testSound(this.settings.volume);\n this.soundsPlayed[data.tag] = now;\n }\n\n if(!this.notificationsUiSupport ||\n 'Notification' in window && Notification.permission !== 'granted') {\n return false;\n }\n\n if(this.settings.nodesktop) {\n if(this.vibrateSupport && !this.settings.novibrate) {\n navigator.vibrate([200, 100, 200]);\n return;\n }\n\n return;\n }\n\n let notification: MyNotification;\n\n if('Notification' in window) {\n try {\n if(data.tag) {\n for(const i in this.notificationsShown) {\n const notification = this.notificationsShown[i];\n if(typeof(notification) !== 'boolean' && notification.tag === data.tag) {\n notification.hidden = true;\n }\n }\n }\n\n notification = new Notification(data.title, {\n icon: data.image || '',\n body: data.message || '',\n tag: data.tag || '',\n silent: data.silent || false\n });\n\n // console.log('notify constructed notification');\n } catch(e) {\n this.notificationsUiSupport = false;\n webPushApiManager.setLocalNotificationsDisabled();\n return;\n }\n } /* else if('mozNotification' in navigator) {\n notification = navigator.mozNotification.createNotification(data.title, data.message || '', data.image || '')\n } else if(notificationsMsSiteMode) {\n window.external.msSiteModeClearIconOverlay()\n window.external.msSiteModeSetIconOverlay('img/icons/icon16.png', data.title)\n window.external.msSiteModeActivate()\n notification = {\n index: idx\n }\n } */ else {\n return;\n }\n\n notification.onclick = () => {\n notification.close();\n appRuntimeManager.focus();\n this.clear();\n if(data.onclick) {\n data.onclick();\n }\n };\n\n notification.onclose = () => {\n if(!notification.hidden) {\n delete this.notificationsShown[key];\n this.clear();\n }\n };\n\n if(notification.show) {\n notification.show();\n }\n this.notificationsShown[key] = notification;\n\n if(!IS_MOBILE) {\n setTimeout(() => {\n this.hide(key);\n }, 8000);\n }\n }\n\n public updateLocalSettings = () => {\n const keys = ['notify_nodesktop', 'notify_volume', 'notify_novibrate', 'notify_nopreview', 'notify_nopush'];\n const promises = keys.map(() => undefined);\n // const promises = keys.map((k) => stateStorage.get(k as any));\n Promise.all(promises)\n .then((updSettings) => {\n this.settings.nodesktop = updSettings[0];\n this.settings.volume = updSettings[1] === undefined ? 0.5 : updSettings[1];\n this.settings.novibrate = updSettings[2];\n this.settings.nopreview = updSettings[3];\n this.settings.nopush = updSettings[4];\n\n if(this.pushInited) {\n const needPush = !this.settings.nopush && !this.settings.nodesktop && webPushApiManager.isAvailable || false;\n const hasPush = this.registeredDevice !== false;\n if(needPush !== hasPush) {\n if(needPush) {\n webPushApiManager.subscribe();\n } else {\n webPushApiManager.unsubscribe();\n }\n }\n }\n\n webPushApiManager.setSettings(this.settings);\n });\n\n apiManagerProxy.getState().then((state) => {\n this.settings.nosound = !state.settings.notifications.sound;\n });\n }\n\n public getLocalSettings() {\n return this.settings;\n }\n\n private hide(key: string) {\n const notification = this.notificationsShown[key];\n if(notification && typeof(notification) !== 'boolean') {\n try {\n if(notification.close) {\n notification.hidden = true;\n notification.close();\n }\n } catch(e) {}\n }\n }\n\n public soundReset(tag: string) {\n delete this.soundsPlayed[tag];\n }\n\n private requestPermission = () => {\n Notification.requestPermission();\n window.removeEventListener('click', this.requestPermission);\n };\n\n public testSound(volume: number) {\n const now = tsNow();\n if(this.nextSoundAt && now < this.nextSoundAt && this.prevSoundVolume === volume) {\n return;\n }\n\n this.nextSoundAt = now + 1000;\n this.prevSoundVolume = volume;\n const filename = 'assets/audio/notification.mp3';\n const audio = document.createElement('audio');\n audio.autoplay = true;\n audio.setAttribute('mozaudiochannel', 'notification');\n audio.volume = volume;\n audio.innerHTML = `\n \n \n `;\n this.notifySoundEl.append(audio);\n\n audio.addEventListener('ended', () => {\n audio.remove();\n }, {once: true});\n }\n\n public cancel(key: string) {\n const notification = this.notificationsShown[key];\n if(notification) {\n if(this.notificationsCount > 0) {\n --this.notificationsCount;\n }\n\n try {\n if(typeof(notification) !== 'boolean' && notification.close) {\n notification.hidden = true;\n notification.close();\n }/* else if(notificationsMsSiteMode &&\n notification.index === notificationIndex) {\n window.external.msSiteModeClearIconOverlay()\n } */\n } catch(e) {}\n\n delete this.notificationsShown[key];\n }\n }\n\n public clear() {\n /* if(notificationsMsSiteMode) {\n window.external.msSiteModeClearIconOverlay()\n } else { */\n for(const i in this.notificationsShown) {\n const notification = this.notificationsShown[i];\n try {\n if(typeof(notification) !== 'boolean' && notification.close) {\n notification.close();\n }\n } catch(e) {}\n }\n /* } */\n this.notificationsShown = {};\n this.notificationsCount = 0;\n\n webPushApiManager.hidePushNotifications();\n }\n\n public start() {\n this.updateLocalSettings();\n rootScope.addEventListener('settings_updated', this.updateLocalSettings);\n webPushApiManager.start();\n\n if(!this.notificationsUiSupport) {\n return false;\n }\n\n if('Notification' in window && Notification.permission !== 'granted' && Notification.permission !== 'denied') {\n window.addEventListener('click', this.requestPermission);\n }\n\n try {\n if('onbeforeunload' in window) {\n window.addEventListener('beforeunload', this.clear);\n }\n } catch(e) {}\n }\n\n private stop() {\n this.clear();\n window.clearInterval(this.titleInterval);\n this.titleInterval = 0;\n this.setFavicon();\n this.stopped = true;\n }\n\n private registerDevice(tokenData: PushSubscriptionNotify) {\n if(this.registeredDevice && deepEqual(this.registeredDevice, tokenData)) {\n return false;\n }\n\n this.managers.apiManager.invokeApi('account.registerDevice', {\n token_type: tokenData.tokenType,\n token: tokenData.tokenValue,\n other_uids: [],\n app_sandbox: false,\n secret: new Uint8Array()\n }).then(() => {\n this.registeredDevice = tokenData;\n }, (error) => {\n error.handled = true;\n });\n }\n\n private unregisterDevice(tokenData: PushSubscriptionNotify) {\n if(!this.registeredDevice) {\n return false;\n }\n\n this.managers.apiManager.invokeApi('account.unregisterDevice', {\n token_type: tokenData.tokenType,\n token: tokenData.tokenValue,\n other_uids: []\n }).then(() => {\n this.registeredDevice = false;\n }, (error) => {\n error.handled = true;\n });\n }\n}\n\nconst uiNotificationsManager = new UiNotificationsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.uiNotificationsManager = uiNotificationsManager);\nexport default uiNotificationsManager;\n","export default async function getFilesFromEvent(e: ClipboardEvent | DragEvent, onlyTypes = false): Promise {\n const files: any[] = [];\n\n const scanFiles = async(entry: any, item: DataTransferItem) => {\n if(entry.isDirectory) {\n const directoryReader = entry.createReader();\n await new Promise((resolve, reject) => {\n directoryReader.readEntries(async(entries: any) => {\n for(const entry of entries) {\n await scanFiles(entry, item);\n }\n\n resolve();\n });\n });\n } else if(entry) {\n if(onlyTypes) {\n files.push(entry.type);\n } else {\n const itemFile = item.getAsFile(); // * Safari can't handle entry.file with pasting\n const file = entry instanceof File ?\n entry :\n (\n entry instanceof DataTransferItem ?\n entry.getAsFile() :\n await new Promise((resolve, reject) => entry.file(resolve, (err: any) => resolve(itemFile)))\n );\n\n /* if(!onlyTypes) {\n console.log('getFilesFromEvent: got file', item, file);\n } */\n\n if(!file) return;\n files.push(file);\n }\n }\n };\n\n if(e instanceof DragEvent && e.dataTransfer.files && !e.dataTransfer.items) {\n for(let i = 0; i < e.dataTransfer.files.length; i++) {\n const file = e.dataTransfer.files[i];\n files.push(onlyTypes ? file.type : file);\n }\n } else {\n // @ts-ignore\n const items = (e.dataTransfer || e.clipboardData || e.originalEvent.clipboardData).items;\n\n const promises: Promise[] = [];\n for(let i = 0; i < items.length; ++i) {\n const item: DataTransferItem = items[i];\n if(item.kind === 'file') {\n const entry = (onlyTypes ? item : item.webkitGetAsEntry()) || item.getAsFile();\n promises.push(scanFiles(entry, item));\n }\n }\n\n await Promise.all(promises);\n }\n\n /* if(!onlyTypes) {\n console.log('getFilesFromEvent: got files:', e, files);\n } */\n\n return files;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {T_ME_PREFIXES} from '../lib/mtproto/mtproto_config';\nimport cancelEvent from './dom/cancelEvent';\nimport parseUriParams from './string/parseUriParams';\n\nexport default function addAnchorListener(options: {\n name: 'showMaskedAlert' | 'execBotCommand' | 'searchByHashtag' | 'addstickers' | 'im' |\n 'resolve' | 'privatepost' | 'addstickers' | 'voicechat' | 'joinchat' | 'join' | 'invoice' |\n 'addemoji',\n protocol?: 'tg',\n callback: (params: Params, element?: HTMLAnchorElement) => boolean | any,\n noPathnameParams?: boolean,\n noUriParams?: boolean,\n noCancelEvent?: boolean\n}) {\n (window as any)[(options.protocol ? options.protocol + '_' : '') + options.name] = (element?: HTMLAnchorElement/* , e: Event */) => {\n !options.noCancelEvent && cancelEvent(null);\n\n let href = element.href;\n let pathnameParams: any[];\n let uriParams: any;\n\n const u = new URL(href);\n const match = u.host.match(/(.+?)\\.t(?:elegram)?\\.me/);\n if(match && !T_ME_PREFIXES.has(match[1])) {\n u.pathname = match[1] + (u.pathname === '/' ? '' : u.pathname);\n href = u.toString();\n }\n\n if(!options.noPathnameParams) pathnameParams = new URL(href).pathname.split('/').slice(1);\n if(!options.noUriParams) uriParams = parseUriParams(href);\n\n const res = options.callback({pathnameParams, uriParams} as Params, element);\n return res === undefined ? res : false;\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {GroupCallId, MyGroupCall} from './appGroupCallsManager';\nimport type GroupCallInstance from '../calls/groupCallInstance';\nimport type CallInstance from '../calls/callInstance';\nimport animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport appSidebarLeft, {LEFT_COLUMN_ACTIVE_CLASSNAME} from '../../components/sidebarLeft';\nimport appSidebarRight, {RIGHT_COLUMN_ACTIVE_CLASSNAME} from '../../components/sidebarRight';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport {logger, LogTypes} from '../logger';\nimport rootScope from '../rootScope';\nimport Chat, {ChatType} from '../../components/chat/chat';\nimport PopupNewMedia, {getCurrentNewMediaPopup} from '../../components/popups/newMedia';\nimport MarkupTooltip from '../../components/chat/markupTooltip';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport SetTransition from '../../components/singleTransition';\nimport ChatDragAndDrop from '../../components/chat/dragAndDrop';\nimport {doubleRaf} from '../../helpers/schedulers';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport useHeavyAnimationCheck, {dispatchHeavyAnimationEvent} from '../../hooks/useHeavyAnimationCheck';\nimport stateStorage from '../stateStorage';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport appNavigationController from '../../components/appNavigationController';\nimport AppPrivateSearchTab from '../../components/sidebarRight/tabs/search';\nimport I18n, {i18n, join, LangPackKey} from '../langPack';\nimport {ChatFull, ChatInvite, ChatParticipant, ChatParticipants, Message, MessageAction, MessageMedia, SendMessageAction, User, Chat as MTChat, UrlAuthResult} from '../../layer';\nimport PeerTitle from '../../components/peerTitle';\nimport PopupPeer, {PopupPeerCheckboxOptions} from '../../components/popups/peer';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport disableTransition from '../../helpers/dom/disableTransition';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport whichChild from '../../helpers/dom/whichChild';\nimport PopupElement from '../../components/popups';\nimport singleInstance, {InstanceDeactivateReason, SingleInstance} from '../mtproto/singleInstance';\nimport PopupStickers from '../../components/popups/stickers';\nimport PopupJoinChatInvite from '../../components/popups/joinChatInvite';\nimport {toast, toastNew} from '../../components/toast';\nimport debounce from '../../helpers/schedulers/debounce';\nimport pause from '../../helpers/schedulers/pause';\nimport {InternalLink, InternalLinkTypeMap, INTERNAL_LINK_TYPE} from './internalLink';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport {ONE_DAY} from '../../helpers/date';\nimport TopbarCall from '../../components/topbarCall';\nimport confirmationPopup from '../../components/confirmationPopup';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport {CallType} from '../calls/types';\nimport {Modify, SendMessageEmojiInteractionData} from '../../types';\nimport htmlToSpan from '../../helpers/dom/htmlToSpan';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport {simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport PopupCall from '../../components/call';\nimport copy from '../../helpers/object/copy';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport ChatBackgroundPatternRenderer from '../../components/chat/patternRenderer';\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport compareVersion from '../../helpers/compareVersion';\nimport {AppManagers} from './managers';\nimport uiNotificationsManager from './uiNotificationsManager';\nimport appMediaPlaybackController from '../../components/appMediaPlaybackController';\nimport {PHONE_NUMBER_REG_EXP} from '../richTextProcessor';\nimport wrapEmojiText from '../richTextProcessor/wrapEmojiText';\nimport wrapRichText, {CustomEmojiRendererElement, renderEmojis} from '../richTextProcessor/wrapRichText';\nimport wrapUrl from '../richTextProcessor/wrapUrl';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getUserStatusString from '../../components/wrappers/getUserStatusString';\nimport getChatMembersString from '../../components/wrappers/getChatMembersString';\nimport {STATE_INIT} from '../../config/state';\nimport CacheStorageController from '../files/cacheStorage';\nimport themeController from '../../helpers/themeController';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport appDialogsManager from './appDialogsManager';\nimport idleController from '../../helpers/idleController';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport groupCallsController from '../calls/groupCallsController';\nimport callsController from '../calls/callsController';\nimport getFilesFromEvent from '../../helpers/files/getFilesFromEvent';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport appRuntimeManager from './appRuntimeManager';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport {CLICK_EVENT_NAME} from '../../helpers/dom/clickEvent';\nimport PopupPayment from '../../components/popups/payment';\nimport wrapPeerTitle from '../../components/wrappers/peerTitle';\nimport NBSP from '../../helpers/string/nbsp';\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\nimport {MiddleEllipsisElement} from '../../components/middleEllipsis';\nimport addAnchorListener from '../../helpers/addAnchorListener';\nimport parseUriParams from '../../helpers/string/parseUriParams';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport {MTAppConfig} from '../mtproto/appConfig';\n\nexport type ChatSavedPosition = {\n mids: number[],\n top: number\n};\n\nexport type ChatSetPeerOptions = {\n peerId: PeerId,\n lastMsgId?: number,\n threadId?: number,\n startParam?: string,\n stack?: number,\n commentId?: number,\n type?: ChatType\n};\n\nexport type ChatSetInnerPeerOptions = Modify;\n\nexport class AppImManager extends EventListenerBase<{\n chat_changing: (details: {from: Chat, to: Chat}) => void,\n peer_changed: (chat: Chat) => void,\n peer_changing: (chat: Chat) => void,\n}> {\n public columnEl = document.getElementById('column-center') as HTMLDivElement;\n public chatsContainer: HTMLElement;\n\n public offline = false;\n public updateStatusInterval = 0;\n\n public log: ReturnType;\n\n public setPeerPromise: Promise = null;\n\n public tabId = -1;\n\n public chats: Chat[] = [];\n private prevTab: HTMLElement;\n private chatsSelectTabDebounced: () => void;\n\n public markupTooltip: MarkupTooltip;\n private backgroundPromises: {[slug: string]: Promise};\n\n private topbarCall: TopbarCall;\n public emojiAnimationContainer: HTMLDivElement;\n\n private lastBackgroundUrl: string;\n\n public managers: AppManagers;\n\n public cacheStorage = new CacheStorageController('cachedFiles');\n public customEmojiSize: MediaSize;\n\n get myId() {\n return rootScope.myId;\n }\n\n get chat(): Chat {\n return this.chats[this.chats.length - 1];\n }\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n\n const {\n apiUpdatesManager\n } = managers;\n apiUpdatesManager.attach(I18n.lastRequestedLangCode);\n\n appMediaPlaybackController.construct(managers);\n uiNotificationsManager.construct(managers);\n uiNotificationsManager.start();\n\n this.log = logger('IM', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n\n this.backgroundPromises = {};\n STATE_INIT.settings.themes.forEach((theme) => {\n if(theme.background.slug) {\n const url = 'assets/img/' + theme.background.slug + '.svg' + (IS_FIREFOX ? '?1' : '');\n this.backgroundPromises[theme.background.slug] = Promise.resolve(url);\n }\n });\n\n this.selectTab(0);\n\n idleController.addEventListener('change', (idle) => {\n this.offline = idle;\n this.updateStatus();\n if(idle) {\n clearInterval(this.updateStatusInterval);\n } else {\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n }\n });\n\n this.chatsContainer = document.createElement('div');\n this.chatsContainer.classList.add('chats-container', 'tabs-container');\n this.chatsContainer.dataset.animation = 'navigation';\n\n this.emojiAnimationContainer = document.createElement('div');\n this.emojiAnimationContainer.classList.add('emoji-animation-container');\n this.appendEmojiAnimationContainer(mediaSizes.activeScreen);\n\n this.columnEl.append(this.chatsContainer);\n\n this.createNewChat();\n this.chatsSelectTab(this.chat.container);\n\n appNavigationController.onHashChange = this.onHashChange;\n // window.addEventListener('hashchange', this.onHashChange);\n\n this.setSettings();\n rootScope.addEventListener('settings_updated', this.setSettings);\n\n const onPremiumToggle = (isPremium: boolean) => {\n document.body.classList.toggle('is-premium', isPremium);\n };\n rootScope.addEventListener('premium_toggle', onPremiumToggle);\n onPremiumToggle(rootScope.premium);\n this.managers.rootScope.getPremium().then(onPremiumToggle);\n\n useHeavyAnimationCheck(() => {\n animationIntersector.setOnlyOnePlayableGroup('lock');\n animationIntersector.checkAnimations2(true);\n }, () => {\n animationIntersector.setOnlyOnePlayableGroup();\n animationIntersector.checkAnimations2(false);\n });\n\n if(IS_FIREFOX && apiManagerProxy.oldVersion && compareVersion(apiManagerProxy.oldVersion, '1.4.3') === -1) {\n this.deleteFilesIterative((response) => {\n return response.headers.get('Content-Type') === 'image/svg+xml';\n }).then(() => {\n this.applyCurrentTheme();\n });\n } else {\n this.applyCurrentTheme();\n }\n\n // * fix simultaneous opened both sidebars, can happen when floating sidebar is opened with left sidebar\n mediaSizes.addEventListener('changeScreen', (from, to) => {\n if(document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME) &&\n document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME)) {\n appSidebarRight.toggleSidebar(false);\n }\n\n this.appendEmojiAnimationContainer(to);\n });\n\n mediaSizes.addEventListener('resize', () => {\n // const perf = performance.now();\n const rect = this.chatsContainer.getBoundingClientRect();\n ChatBackgroundPatternRenderer.resizeInstances(rect.width, rect.height).then(() => {\n // this.log.warn('resize bg time:', performance.now() - perf);\n // for(const chat of this.chats) {\n // if(chat.renderDarkPattern) {\n // chat.renderDarkPattern();\n // }\n // }\n });\n });\n\n this.addEventListener('peer_changing', (chat) => {\n this.saveChatPosition(chat);\n });\n\n rootScope.addEventListener('theme_change', () => {\n this.applyCurrentTheme();\n });\n\n rootScope.addEventListener('choosing_sticker', (choosing) => {\n this.setChoosingStickerTyping(!choosing);\n });\n\n rootScope.addEventListener('peer_title_edit', ({peerId, threadId}) => {\n if(this.chat?.peerId === peerId && !threadId && this.tabId !== -1) {\n this.overrideHash(peerId);\n }\n });\n\n rootScope.addEventListener('peer_typings', ({peerId, typings}) => {\n const chat = this.chat;\n if(\n !chat ||\n chat.peerId !== peerId ||\n overlayCounter.isOverlayActive || (\n mediaSizes.activeScreen === ScreenSize.mobile &&\n this.tabId !== 1\n )\n ) {\n return;\n }\n\n const typing = typings.find((typing) => typing.action._ === 'sendMessageEmojiInteraction');\n if(typing?.action?._ === 'sendMessageEmojiInteraction') {\n const action = typing.action;\n const bubble = chat.bubbles.bubbles[generateMessageId(typing.action.msg_id)];\n if(bubble && bubble.classList.contains('emoji-big') && getVisibleRect(bubble, chat.bubbles.scrollable.container)) {\n const stickerWrapper: HTMLElement = bubble.querySelector('.media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)');\n\n const data: SendMessageEmojiInteractionData = JSON.parse(action.interaction.data);\n data.a.forEach((a) => {\n setTimeout(() => {\n simulateClickEvent(stickerWrapper);\n }, a.t * 1000);\n });\n\n this.managers.appMessagesManager.setTyping(peerId, {\n _: 'sendMessageEmojiInteractionSeen',\n emoticon: action.emoticon\n });\n }\n }\n });\n\n const onInstanceDeactivated = (reason: InstanceDeactivateReason) => {\n const isUpdated = reason === 'version';\n const popup = new PopupElement('popup-instance-deactivated', {overlayClosable: true});\n const c = document.createElement('div');\n c.classList.add('instance-deactivated-container');\n (popup as any).container.replaceWith(c);\n\n const header = document.createElement('div');\n header.classList.add('header');\n header.append(i18n(isUpdated ? 'Deactivated.Version.Title' : 'Deactivated.Title'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('subtitle');\n subtitle.append(i18n(isUpdated ? 'Deactivated.Version.Subtitle' : 'Deactivated.Subtitle'));\n\n c.append(header, subtitle);\n\n document.body.classList.add('deactivated');\n\n const onClose = isUpdated ? () => {\n appRuntimeManager.reload();\n } : () => {\n document.body.classList.add('deactivated-backwards');\n\n singleInstance.activateInstance();\n\n setTimeout(() => {\n document.body.classList.remove('deactivated', 'deactivated-backwards');\n }, 333);\n };\n\n popup.addEventListener('close', onClose);\n popup.show();\n };\n\n singleInstance.addEventListener('deactivated', onInstanceDeactivated);\n if(singleInstance.deactivatedReason) {\n onInstanceDeactivated(singleInstance.deactivatedReason);\n }\n\n // remove scroll listener when setting chat to tray\n this.addEventListener('chat_changing', ({to}) => {\n this.toggleChatGradientAnimation(to);\n });\n\n rootScope.addEventListener('service_notification', (update) => {\n confirmationPopup({\n button: {langKey: 'OK', isCancel: true},\n description: wrapRichText(update.message)\n });\n });\n\n rootScope.addEventListener('payment_sent', async({peerId, mid, receiptMessage}) => {\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n if(!message) {\n return;\n }\n\n const action = receiptMessage.action as MessageAction.messageActionPaymentSent;\n toastNew({\n langPackKey: 'PaymentInfoHint',\n langPackArguments: [\n paymentsWrapCurrencyAmount(action.total_amount, action.currency),\n wrapEmojiText(((message as Message.message).media as MessageMedia.messageMediaInvoice).title)\n ]\n });\n });\n\n (window as any).onSpoilerClick = (e: MouseEvent) => {\n const spoiler = findUpClassName(e.target, 'spoiler');\n const parentElement = findUpClassName(spoiler, 'spoilers-container') || spoiler.parentElement;\n\n const className = 'is-spoiler-visible';\n const isVisible = parentElement.classList.contains(className);\n if(!isVisible) {\n cancelEvent(e);\n\n if(CLICK_EVENT_NAME !== 'click') {\n window.addEventListener('click', cancelEvent, {capture: true, once: true});\n }\n }\n\n const duration = 400 / 2;\n const showDuration = 5000;\n const useRafs = !isVisible ? 2 : 0;\n if(useRafs) {\n parentElement.classList.add('will-change');\n }\n\n const spoilerTimeout = parentElement.dataset.spoilerTimeout;\n if(spoilerTimeout !== null) {\n clearTimeout(+spoilerTimeout);\n delete parentElement.dataset.spoilerTimeout;\n }\n\n SetTransition({\n element: parentElement,\n className,\n forwards: true,\n duration,\n onTransitionEnd: () => {\n parentElement.dataset.spoilerTimeout = '' + window.setTimeout(() => {\n SetTransition({\n element: parentElement,\n className,\n forwards: false,\n duration,\n onTransitionEnd: () => {\n parentElement.classList.remove('will-change');\n delete parentElement.dataset.spoilerTimeout;\n }\n });\n }, showDuration);\n },\n useRafs\n });\n };\n\n rootScope.addEventListener('sticker_updated', ({type, faved}) => {\n if(type === 'faved') {\n toastNew({\n langPackKey: faved ? 'AddedToFavorites' : 'RemovedFromFavorites'\n });\n } else if(!faved) {\n toastNew({\n langPackKey: 'RemovedFromRecent'\n });\n }\n });\n\n apiManagerProxy.addEventListener('notificationBuild', async(options) => {\n const isForum = await this.managers.appPeersManager.isForum(options.message.peerId);\n const threadId = getMessageThreadId(options.message, isForum);\n if(this.chat.peerId === options.message.peerId && this.chat.threadId === threadId && !idleController.isIdle) {\n return;\n }\n\n uiNotificationsManager.buildNotification(options);\n });\n\n this.addEventListener('peer_changed', async({peerId}) => {\n document.body.classList.toggle('has-chat', !!peerId);\n\n this.emojiAnimationContainer.textContent = '';\n\n this.overrideHash(peerId);\n\n apiManagerProxy.updateTabState('chatPeerIds', this.chats.map((chat) => chat.peerId).filter(Boolean));\n });\n\n // stateStorage.get('chatPositions').then((c) => {\n stateStorage.setToCache('chatPositions', /* c || */{});\n // });\n\n if(IS_CALL_SUPPORTED || IS_GROUP_CALL_SUPPORTED) {\n this.topbarCall = new TopbarCall(managers);\n }\n\n if(IS_CALL_SUPPORTED) {\n callsController.addEventListener('instance', ({instance/* , hasCurrent */}) => {\n // if(hasCurrent) {\n // return;\n // }\n\n const popup = new PopupCall(instance);\n\n instance.addEventListener('acceptCallOverride', () => {\n return this.discardCurrentCall(instance.interlocutorUserId.toPeerId(), undefined, instance)\n .then(() => {\n callsController.dispatchEvent('accepting', instance);\n return true;\n })\n .catch(() => false);\n });\n\n popup.addEventListener('close', () => {\n const currentCall = callsController.currentCall;\n if(currentCall && currentCall !== instance && !instance.wasTryingToJoin) {\n instance.hangUp('phoneCallDiscardReasonBusy');\n }\n }, {once: true});\n\n popup.show();\n });\n\n callsController.addEventListener('incompatible', async(userId) => {\n toastNew({\n langPackKey: 'VoipPeerIncompatible',\n langPackArguments: [\n await wrapPeerTitle({peerId: userId.toPeerId()})\n ]\n });\n });\n }\n\n // ! do not remove this line\n // ! instance can be deactivated before the UI starts, because it waits in background for RAF that is delayed\n singleInstance.activateInstance();\n\n const setAuthorized = () => {\n telegramMeWebManager.setAuthorized(true);\n };\n\n setInterval(setAuthorized, ONE_DAY);\n setAuthorized();\n\n addAnchorListener<{}>({\n name: 'showMaskedAlert',\n callback: (params, element) => {\n const href = element.href;\n\n const a = element.cloneNode(true) as HTMLAnchorElement;\n a.className = 'anchor-url';\n a.innerText = href;\n a.removeAttribute('onclick');\n\n new PopupPeer('popup-masked-url', {\n titleLangKey: 'OpenUrlTitle',\n descriptionLangKey: 'OpenUrlAlert2',\n descriptionLangArgs: [a],\n buttons: [{\n langKey: 'Open',\n callback: () => {\n a.click();\n }\n }]\n }).show();\n }\n });\n\n addAnchorListener<{uriParams: {command: string, bot: string}}>({\n name: 'execBotCommand',\n callback: ({uriParams}) => {\n const {command, bot} = uriParams;\n\n /* const promise = bot ? this.openUsername(bot).then(() => this.chat.peerId) : Promise.resolve(this.chat.peerId);\n promise.then((peerId) => {\n this.managers.appMessagesManager.sendText(peerId, '/' + command);\n }); */\n\n this.managers.appMessagesManager.sendText(this.chat.peerId, '/' + command + (bot ? '@' + bot : ''));\n\n // console.log(command, bot);\n }\n });\n\n addAnchorListener<{uriParams: {hashtag: string}}>({\n name: 'searchByHashtag',\n callback: ({uriParams}) => {\n const {hashtag} = uriParams;\n if(!hashtag) {\n return;\n }\n\n this.chat.initSearch('#' + hashtag + ' ');\n }\n });\n\n ([\n ['addstickers', INTERNAL_LINK_TYPE.STICKER_SET],\n ['addemoji', INTERNAL_LINK_TYPE.EMOJI_SET]\n ] as [\n 'addstickers' | 'addemoji',\n INTERNAL_LINK_TYPE.STICKER_SET | INTERNAL_LINK_TYPE.EMOJI_SET\n ][]).forEach(([name, type]) => {\n addAnchorListener<{pathnameParams: [typeof name, string]}>({\n name,\n callback: ({pathnameParams}) => {\n if(!pathnameParams[1]) {\n return;\n }\n\n const link: InternalLink = {\n _: type,\n set: pathnameParams[1]\n };\n\n this.processInternalLink(link);\n }\n });\n\n addAnchorListener<{\n uriParams: {\n set: string\n }\n }>({\n name,\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(type, uriParams);\n this.processInternalLink(link);\n }\n });\n });\n\n // * t.me/invoice/asdasdad\n // * t.me/$asdasdad\n addAnchorListener<{pathnameParams: ['invoice', string] | string}>({\n name: 'invoice',\n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.INVOICE,\n slug: pathnameParams.length > 1 ? pathnameParams[1] : pathnameParams[0].slice(1)\n };\n\n this.processInternalLink(link);\n }\n });\n\n // Support old t.me/joinchat/asd and new t.me/+asd\n addAnchorListener<{pathnameParams: ['joinchat', string]}>({\n name: 'joinchat',\n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: pathnameParams[1] || decodeURIComponent(pathnameParams[0]).slice(1)\n };\n\n this.processInternalLink(link);\n }\n });\n\n if(IS_GROUP_CALL_SUPPORTED) {\n addAnchorListener<{\n uriParams: Omit\n }>({\n name: 'voicechat',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.VOICE_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n }\n\n addAnchorListener<{\n // pathnameParams: ['c', string, string],\n // uriParams: {thread?: number}\n // } | {\n // pathnameParams: [string, string?],\n // uriParams: {comment?: number}\n pathnameParams: ['c', string, string] | [string, string?],\n uriParams: {thread?: string, comment?: string} | {comment?: string, start?: string}\n }>({\n name: 'im',\n callback: async({pathnameParams, uriParams}, element) => {\n let link: InternalLink;\n if(PHONE_NUMBER_REG_EXP.test(pathnameParams[0])) {\n link = {\n _: INTERNAL_LINK_TYPE.USER_PHONE_NUMBER,\n phone: pathnameParams[0].slice(1)\n };\n } else if(pathnameParams[0] === 'c') {\n pathnameParams.shift();\n const thread = 'thread' in uriParams ? uriParams.thread : pathnameParams[2] && pathnameParams[1];\n link = {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: pathnameParams[0],\n post: pathnameParams[2] || pathnameParams[1],\n thread,\n comment: uriParams.comment,\n stack: this.getStackFromElement(element)\n };\n } else {\n const thread = 'thread' in uriParams ? uriParams.thread : pathnameParams[2] && pathnameParams[1];\n link = {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: pathnameParams[0],\n post: pathnameParams[2] || pathnameParams[1],\n thread,\n comment: uriParams.comment,\n start: 'start' in uriParams ? uriParams.start : undefined,\n stack: this.getStackFromElement(element)\n };\n }\n\n this.processInternalLink(link);\n }\n });\n\n addAnchorListener<{\n uriParams: {\n domain: string,\n\n // telegrampassport\n scope?: string,\n nonce?: string,\n payload?: string,\n bot_id?: string,\n public_key?: string,\n callback_url?: string,\n\n // regular\n start?: string,\n startgroup?: string,\n game?: string,\n voicechat?: string,\n post?: string,\n thread?: string,\n comment?: string,\n phone?: string\n }\n }>({\n name: 'resolve',\n protocol: 'tg',\n callback: ({uriParams}, element) => {\n let link: InternalLink;\n if(uriParams.phone) {\n link = this.makeLink(INTERNAL_LINK_TYPE.USER_PHONE_NUMBER, uriParams as Required);\n } else if(uriParams.domain === 'telegrampassport') {\n\n } else {\n link = this.makeLink(INTERNAL_LINK_TYPE.MESSAGE, {\n ...uriParams,\n stack: this.getStackFromElement(element)\n });\n }\n\n this.processInternalLink(link);\n }\n });\n\n addAnchorListener<{\n uriParams: {\n channel: string,\n post: string,\n thread?: string,\n comment?: string\n }\n }>({\n name: 'privatepost',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.PRIVATE_POST, uriParams);\n this.processInternalLink(link);\n }\n });\n\n addAnchorListener<{\n uriParams: {\n slug: string\n }\n }>({\n name: 'invoice',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.INVOICE, uriParams);\n this.processInternalLink(link);\n }\n });\n\n ['joinchat' as const, 'join' as const].forEach((name) => {\n addAnchorListener<{\n uriParams: {\n invite: string\n }\n }>({\n name,\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.JOIN_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n });\n\n this.onHashChange(true);\n this.attachKeydownListener();\n this.handleAutologinDomains();\n }\n\n public handleUrlAuth(options: {\n peerId?: PeerId,\n mid?: number,\n buttonId?: number,\n url: string\n }) {\n const {peerId, mid, buttonId, url} = options;\n\n const openWindow = (url: string) => {\n window.open(url, '_blank');\n };\n\n const onUrlAuthResultAccepted = (urlAuthResult: UrlAuthResult.urlAuthResultAccepted) => {\n openWindow(urlAuthResult.url);\n };\n\n const onUrlAuthResult = async(urlAuthResult: UrlAuthResult): Promise => {\n if(urlAuthResult._ === 'urlAuthResultRequest') {\n const b = document.createElement('b');\n b.append(urlAuthResult.domain);\n const peerTitle = await wrapPeerTitle({peerId: rootScope.myId});\n const botPeerTitle = await wrapPeerTitle({peerId: urlAuthResult.bot.id.toPeerId()});\n\n const logInCheckbox: PopupPeerCheckboxOptions = {\n text: 'OpenUrlOption1',\n textArgs: [b.cloneNode(true), peerTitle],\n checked: true\n };\n\n const allowMessagesCheckbox: PopupPeerCheckboxOptions = urlAuthResult.pFlags.request_write_access ? {\n text: 'OpenUrlOption2',\n textArgs: [botPeerTitle],\n checked: true\n } : undefined;\n\n const checkboxes: PopupPeerCheckboxOptions[] = [\n logInCheckbox,\n allowMessagesCheckbox\n ];\n\n const confirmationPromise = confirmationPopup({\n titleLangKey: 'OpenUrlTitle',\n button: {\n langKey: 'Open'\n },\n descriptionLangKey: 'OpenUrlAlert2',\n descriptionLangArgs: [b],\n checkboxes: checkboxes.filter(Boolean)\n });\n\n if(allowMessagesCheckbox) {\n logInCheckbox.checkboxField.input.addEventListener('change', () => {\n const disabled = !logInCheckbox.checkboxField.checked;\n allowMessagesCheckbox.checkboxField.toggleDisability(disabled);\n\n if(disabled) {\n allowMessagesCheckbox.checkboxField.checked = false;\n }\n });\n }\n\n const [logInChecked, allowMessagesChecked] = await confirmationPromise;\n\n if(!logInChecked) {\n openWindow(url);\n return;\n }\n\n const result = await this.managers.appSeamlessLoginManager.acceptUrlAuth(\n url,\n peerId,\n mid,\n buttonId,\n allowMessagesChecked\n );\n\n return onUrlAuthResult(result);\n } else if(urlAuthResult._ === 'urlAuthResultAccepted') {\n onUrlAuthResultAccepted(urlAuthResult);\n } else {\n openWindow(url);\n }\n };\n\n return this.managers.appSeamlessLoginManager.requestUrlAuth(\n url,\n peerId,\n mid,\n buttonId\n ).then((urlAuthResult) => {\n onUrlAuthResult(urlAuthResult);\n });\n }\n\n private handleAutologinDomains() {\n let appConfig: MTAppConfig;\n rootScope.addEventListener('app_config', (_appConfig) => {\n appConfig = _appConfig;\n });\n\n const onAnchorClick = (element: HTMLAnchorElement) => {\n const url = new URL(element.href);\n if(appConfig.url_auth_domains.includes(url.hostname)) {\n this.handleUrlAuth({url: element.href});\n cancelEvent();\n return;\n }\n\n if(!appConfig.autologin_token || !appConfig.autologin_domains) {\n return;\n }\n\n const originalUrl = element.dataset.originalUrl ??= element.href;\n if(appConfig.autologin_domains.includes(url.hostname)) {\n url.searchParams.set('autologin_token', appConfig.autologin_token);\n element.href = url.toString();\n\n setTimeout(() => {\n element.href = originalUrl;\n delete element.dataset.originalUrl;\n }, 0);\n }\n };\n\n document.addEventListener('click', (e) => {\n const anchor = findUpTag(e.target as HTMLElement, 'A') as HTMLAnchorElement;\n if(anchor?.href) {\n onAnchorClick(anchor);\n }\n });\n\n // addAnchorListener({\n // name: 'handleUrlClick',\n // callback: (_, element) => {\n // onAnchorClick(element);\n // },\n // noCancelEvent: true,\n // noPathnameParams: true,\n // noUriParams: true\n // });\n }\n\n private getStackFromElement(element: HTMLElement) {\n const possibleBubble = findUpClassName(element, 'bubble');\n return possibleBubble ? +possibleBubble.dataset.mid : undefined;\n }\n\n private deleteFilesIterative(callback: (response: Response) => boolean) {\n return this.cacheStorage.timeoutOperation((cache) => {\n const perf = performance.now();\n return cache.keys().then((requests) => {\n const promises = requests.map((request) => {\n return cache.match(request).then((response) => {\n return callback(response);\n });\n });\n\n return Promise.all(promises).then((values) => {\n values.map((isBad, idx) => {\n if(!isBad) {\n return;\n }\n\n const request = requests[idx];\n return cache.delete(request);\n });\n\n return Promise.all(values.filter(Boolean));\n });\n }).then(() => {\n this.log('deleted files', performance.now() - perf);\n });\n });\n }\n\n private toggleChatGradientAnimation(activatingChat: Chat) {\n this.chats.forEach((chat) => {\n if(chat.gradientRenderer) {\n chat.gradientRenderer.scrollAnimate(rootScope.settings.animationsEnabled && chat === activatingChat);\n }\n });\n }\n\n private appendEmojiAnimationContainer(screen: ScreenSize) {\n const appendTo = screen === ScreenSize.mobile ? this.columnEl : document.body;\n if(this.emojiAnimationContainer.parentElement !== appendTo) {\n appendTo.append(this.emojiAnimationContainer)\n }\n }\n\n private attachKeydownListener() {\n const IGNORE_KEYS = new Set(['PageUp', 'PageDown', 'Meta', 'Control']);\n const onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n const isSelectionCollapsed = document.getSelection().isCollapsed;\n if(overlayCounter.isOverlayActive || IGNORE_KEYS.has(key)) return;\n\n const target = e.target as HTMLElement;\n\n // if(target.tagName === 'INPUT') return;\n\n // this.log('onkeydown', e, document.activeElement);\n\n const chat = this.chat;\n\n if((key.startsWith('Arrow') || (e.shiftKey && key === 'Shift')) && !isSelectionCollapsed) {\n return;\n } else if(e.code === 'KeyC' && (e.ctrlKey || e.metaKey) && target.tagName !== 'INPUT') {\n return;\n } else if(e.altKey && (key === 'ArrowUp' || key === 'ArrowDown')) {\n cancelEvent(e);\n this.managers.dialogsStorage.getNextDialog(this.chat.peerId, key === 'ArrowDown', appDialogsManager.filterId).then((dialog) => {\n if(dialog) {\n this.setPeer({peerId: dialog.peerId});\n }\n });\n } else if(key === 'ArrowUp' && this.chat.type !== 'scheduled') {\n if(!chat.input.editMsgId && chat.input.isInputEmpty()) {\n this.managers.appMessagesManager.getFirstMessageToEdit(chat.peerId, chat.threadId).then((message) => {\n if(message) {\n chat.input.initMessageEditing(message.mid);\n cancelEvent(e); // * prevent from scrolling\n }\n });\n } else {\n return;\n }\n } else if(key === 'ArrowDown') {\n return;\n }\n\n if(\n chat?.input?.messageInput &&\n e.target !== chat.input.messageInput &&\n target.tagName !== 'INPUT' &&\n !target.isContentEditable &&\n !IS_TOUCH_SUPPORTED &&\n (!mediaSizes.isMobile || this.tabId === 1) &&\n !chat.selection.isSelecting &&\n !chat.input.recording\n ) {\n chat.input.messageInput.focus();\n placeCaretAtEnd(chat.input.messageInput);\n\n // clone and dispatch same event to new input. it is needed for sending message if input was blurred\n const newEvent = new KeyboardEvent(e.type, e);\n chat.input.messageInput.dispatchEvent(newEvent);\n }\n };\n\n document.body.addEventListener('keydown', onKeyDown);\n }\n\n private makeLink(type: T, uriParams: Omit) {\n return {\n _: type,\n ...uriParams\n } as any as InternalLinkTypeMap[T];\n }\n\n public async processInternalLink(link: InternalLink) {\n switch(link?._) {\n case INTERNAL_LINK_TYPE.MESSAGE: {\n const postId = link.post ? generateMessageId(+link.post) : undefined;\n const commentId = link.comment ? generateMessageId(+link.comment) : undefined;\n const threadId = link.thread ? generateMessageId(+link.thread) : undefined;\n\n this.openUsername({\n userName: link.domain,\n lastMsgId: postId,\n commentId,\n startParam: link.start,\n stack: link.stack,\n threadId\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.PRIVATE_POST: {\n const chatId = link.channel.toChatId();\n const peerId = chatId.toPeerId(true);\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n if(!chat) {\n try {\n await this.managers.appChatsManager.resolveChannel(chatId);\n } catch(err) {\n toastNew({langPackKey: 'LinkNotFound'});\n throw err;\n }\n }\n\n const postId = generateMessageId(+link.post);\n const threadId = link.thread ? generateMessageId(+link.thread) : undefined;\n\n this.op({\n peer: chat,\n lastMsgId: postId,\n threadId,\n stack: link.stack\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.EMOJI_SET:\n case INTERNAL_LINK_TYPE.STICKER_SET: {\n new PopupStickers({id: link.set}, link._ === INTERNAL_LINK_TYPE.EMOJI_SET).show();\n break;\n }\n\n case INTERNAL_LINK_TYPE.JOIN_CHAT: {\n this.managers.appChatsManager.checkChatInvite(link.invite).then((chatInvite) => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n this.managers.appChatsManager.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n // console.log(chatInvite);\n\n if(chatInvite._ === 'chatInviteAlready' ||\n chatInvite._ === 'chatInvitePeek'/* && chatInvite.expires > tsNow(true) */) {\n this.setInnerPeer({\n peerId: chatInvite.chat.id.toPeerId(true)\n });\n return;\n }\n\n new PopupJoinChatInvite(link.invite, chatInvite);\n }, (err) => {\n if(err.type === 'INVITE_HASH_EXPIRED') {\n toast(i18n('InviteExpired'));\n }\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.VOICE_CHAT: {\n if(IS_GROUP_CALL_SUPPORTED) {\n this.joinGroupCall(link.chat_id.toPeerId(true), link.id);\n }\n\n break;\n }\n\n case INTERNAL_LINK_TYPE.USER_PHONE_NUMBER: {\n this.managers.appUsersManager.resolvePhone(link.phone).then((user) => {\n this.setInnerPeer({\n peerId: user.id.toPeerId(false)\n });\n }).catch((err) => {\n if(err.type === 'PHONE_NOT_OCCUPIED') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n\n break;\n }\n\n case INTERNAL_LINK_TYPE.INVOICE: {\n this.managers.appPaymentsManager.getInputInvoiceBySlug(link.slug).then((inputInvoice) => {\n this.managers.appPaymentsManager.getPaymentForm(inputInvoice).then((paymentForm) => {\n // const message: Message.message = {\n // _: 'message',\n // date: 0,\n // id: 0,\n // peerId: 0,\n // peer_id: undefined,\n // message: '',\n // media: {\n // _: 'messageMediaInvoice',\n // currency: paymentForm.invoice.currency,\n // description: paymentForm.description,\n\n // }\n // };\n new PopupPayment(undefined, inputInvoice, paymentForm);\n });\n });\n break;\n }\n\n default: {\n this.log.warn('Not supported internal link:', link);\n break;\n }\n }\n }\n\n public openUrl(url: string) {\n const {url: wrappedUrl, onclick} = wrapUrl(url);\n if(!onclick) {\n return;\n }\n\n const a = document.createElement('a');\n a.href = wrappedUrl;\n (window as any)[onclick](a);\n }\n\n private onHashChange = (saveState?: boolean) => {\n try {\n this.onHashChangeUnsafe(saveState);\n } catch(err) {\n this.log.error('hash change error', err);\n }\n };\n\n private onHashChangeUnsafe = (saveState?: boolean) => {\n const hash = location.hash;\n if(!saveState) {\n appNavigationController.replaceState();\n }\n\n const splitted = hash.split('?');\n const params = parseUriParams(hash, splitted);\n this.log('hashchange', hash, splitted[0], params);\n if(!hash) {\n return;\n }\n\n if(params.tgaddr) {\n this.openUrl(params.tgaddr);\n return;\n }\n\n switch(splitted[0]) {\n default: {\n params.p = splitted[0].slice(1);\n }\n\n case '#/im': {\n if(!Object.keys(params).length) {\n break;\n }\n\n const p: string = params.p;\n const postId = params.post !== undefined ? generateMessageId(+params.post) : undefined;\n\n switch(p[0]) {\n case '@': {\n this.openUsername({\n userName: p,\n lastMsgId: postId\n });\n break;\n }\n\n default: { // peerId\n this.setInnerPeer({\n peerId: postId ? p.toPeerId(true) : p.toPeerId(),\n lastMsgId: postId\n });\n break;\n }\n }\n }\n }\n\n // appNavigationController.replaceState();\n // location.hash = '';\n };\n\n private async op(options: {\n peer: User.user | MTChat\n } & Omit) {\n let {peer, commentId, threadId, lastMsgId} = options;\n const isUser = peer._ === 'user';\n const peerId = peer.id.toPeerId(!isUser);\n\n const isForum = peer._ === 'channel' && peer.pFlags.forum;\n // open forum tab\n if(!commentId && !threadId && !lastMsgId && isForum) {\n appDialogsManager.toggleForumTabByPeerId(peerId, true);\n return;\n }\n\n // handle t.me/username/thread or t.me/username/messageId\n if(isForum && lastMsgId && !threadId) {\n const message = await this.managers.appMessagesManager.reloadMessages(peerId, lastMsgId);\n if(message) {\n threadId = options.threadId = getMessageThreadId(message, isForum);\n } else {\n threadId = options.threadId = lastMsgId;\n lastMsgId = options.lastMsgId = undefined;\n }\n }\n\n if(threadId) {\n return this.openThread({\n ...(options as any as Parameters[0]),\n peerId\n });\n } else if(commentId) {\n return this.openComment({\n peerId,\n msgId: lastMsgId,\n commentId\n });\n }\n\n return this.setInnerPeer({\n ...options,\n peerId\n });\n }\n\n public openPremiumBot() {\n return this.managers.apiManager.getAppConfig().then((appConfig) => {\n return this.openUsername({userName: appConfig.premium_bot_username});\n });\n }\n\n public openUsername(options: {\n userName: string\n } & Omit) {\n const {userName} = options;\n return this.managers.appUsersManager.resolveUsername(userName).then((peer) => {\n return this.op({\n peer,\n ...options\n });\n }, (err: ApiError) => {\n if(err.type === 'USERNAME_NOT_OCCUPIED') {\n toastNew({langPackKey: 'NoUsernameFound'});\n } else if(err.type === 'USERNAME_INVALID') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n }\n\n /**\n * Opens thread when peerId of discussion group is known\n */\n public async openThread(options: {\n peerId: PeerId,\n lastMsgId: number,\n threadId: number,\n stack?: number\n }) {\n if(await this.managers.appChatsManager.isForum(options.peerId.toChatId())) {\n await this.managers.dialogsStorage.getForumTopicOrReload(options.peerId, options.threadId);\n return this.setInnerPeer(options);\n }\n\n return this.managers.appMessagesManager.reloadMessages(options.peerId, options.threadId).then((message) => {\n if(!message) {\n options.lastMsgId = undefined;\n } else {\n this.managers.appMessagesManager.generateThreadServiceStartMessage(message);\n }\n\n return this.setInnerPeer({\n ...options,\n type: 'discussion'\n });\n });\n }\n\n /**\n * Opens comment directly from original channel\n */\n public openComment(options: {\n peerId: PeerId,\n msgId: number,\n commentId: number\n }) {\n return this.managers.appMessagesManager.getDiscussionMessage(options.peerId, options.msgId).then((message) => {\n return this.openThread({\n peerId: message.peerId,\n lastMsgId: options.commentId,\n threadId: message.mid\n });\n });\n }\n\n public async callUser(userId: UserId, type: CallType) {\n const call = callsController.getCallByUserId(userId);\n if(call) {\n return;\n }\n\n const userFull = await this.managers.appProfileManager.getProfile(userId);\n if(userFull.pFlags.phone_calls_private) {\n wrapPeerTitle({peerId: userId.toPeerId()}).then((element) => {\n return confirmationPopup({\n descriptionLangKey: 'Call.PrivacyErrorMessage',\n descriptionLangArgs: [element],\n button: {\n langKey: 'OK',\n isCancel: true\n }\n });\n });\n\n return;\n }\n\n await this.discardCurrentCall(userId.toPeerId());\n\n callsController.startCallInternal(userId, type === 'video');\n }\n\n private discardCurrentCall(toPeerId: PeerId, ignoreGroupCall?: GroupCallInstance, ignoreCall?: CallInstance) {\n if(groupCallsController.groupCall && groupCallsController.groupCall !== ignoreGroupCall) return this.discardGroupCallConfirmation(toPeerId);\n else if(callsController.currentCall && callsController.currentCall !== ignoreCall) return this.discardCallConfirmation(toPeerId);\n else return Promise.resolve();\n }\n\n private async discardCallConfirmation(toPeerId: PeerId) {\n const currentCall = callsController.currentCall;\n if(currentCall) {\n await Promise.all([\n wrapPeerTitle({peerId: currentCall.interlocutorUserId.toPeerId(false)}),\n wrapPeerTitle({peerId: toPeerId})\n ]).then(([title1, title2]) => {\n return confirmationPopup({\n titleLangKey: 'Call.Confirm.Discard.Call.Header',\n descriptionLangKey: toPeerId.isUser() ? 'Call.Confirm.Discard.Call.ToCall.Text' : 'Call.Confirm.Discard.Call.ToVoice.Text',\n descriptionLangArgs: [title1, title2],\n button: {\n langKey: 'OK'\n }\n });\n });\n\n if(!currentCall.isClosing) {\n await currentCall.hangUp('phoneCallDiscardReasonDisconnect');\n }\n }\n }\n\n private async discardGroupCallConfirmation(toPeerId: PeerId) {\n const currentGroupCall = groupCallsController.groupCall;\n if(currentGroupCall) {\n await Promise.all([\n wrapPeerTitle({peerId: currentGroupCall.chatId.toPeerId(true)}),\n wrapPeerTitle({peerId: toPeerId})\n ]).then(([title1, title2]) => {\n return confirmationPopup({\n titleLangKey: 'Call.Confirm.Discard.Voice.Header',\n descriptionLangKey: toPeerId.isUser() ? 'Call.Confirm.Discard.Voice.ToCall.Text' : 'Call.Confirm.Discard.Voice.ToVoice.Text',\n descriptionLangArgs: [title1, title2],\n button: {\n langKey: 'OK'\n }\n });\n });\n\n if(groupCallsController.groupCall === currentGroupCall) {\n await currentGroupCall.hangUp();\n }\n }\n }\n\n public async joinGroupCall(peerId: PeerId, groupCallId?: GroupCallId) {\n const chatId = peerId.toChatId();\n const hasRights = this.managers.appChatsManager.hasRights(chatId, 'manage_call');\n const next = async() => {\n const chatFull = await this.managers.appProfileManager.getChatFull(chatId);\n let call: MyGroupCall;\n if(!chatFull.call) {\n if(!hasRights) {\n return;\n }\n\n call = await this.managers.appGroupCallsManager.createGroupCall(chatId);\n } else {\n call = chatFull.call;\n }\n\n groupCallsController.joinGroupCall(chatId, call.id, true, false);\n };\n\n if(groupCallId) {\n const groupCall = await this.managers.appGroupCallsManager.getGroupCallFull(groupCallId);\n if(groupCall._ === 'groupCallDiscarded') {\n if(!hasRights) {\n toastNew({\n langPackKey: 'VoiceChat.Chat.Ended'\n });\n\n return;\n }\n\n await confirmationPopup({\n descriptionLangKey: 'VoiceChat.Chat.StartNew',\n button: {\n langKey: 'VoiceChat.Chat.StartNew.OK'\n }\n });\n }\n }\n\n // await this.discardCurrentCall(peerId);\n\n next();\n };\n\n public setCurrentBackground(broadcastEvent = false): ReturnType {\n const theme = themeController.getTheme();\n\n if(theme.background.slug) {\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === theme.name);\n // const isDefaultBackground = theme.background.blur === defaultTheme.background.blur &&\n // theme.background.slug === defaultTheme.background.slug;\n\n // if(!isDefaultBackground) {\n return this.getBackground(theme.background.slug).then((url) => {\n return this.setBackground(url, broadcastEvent);\n }, () => { // * if NO_ENTRY_FOUND\n theme.background = copy(defaultTheme.background); // * reset background\n return this.setCurrentBackground(true);\n });\n // }\n }\n\n return this.setBackground('', broadcastEvent);\n }\n\n private getBackground(slug: string) {\n if(this.backgroundPromises[slug]) return this.backgroundPromises[slug];\n return this.backgroundPromises[slug] = this.cacheStorage.getFile('backgrounds/' + slug).then((blob) => {\n return URL.createObjectURL(blob);\n });\n }\n\n public setBackground(url: string, broadcastEvent = true): Promise {\n this.lastBackgroundUrl = url;\n const promises = this.chats.map((chat) => chat.setBackground(url));\n return promises[promises.length - 1].then(() => {\n if(broadcastEvent) {\n rootScope.dispatchEvent('background_change');\n }\n });\n }\n\n public saveChatPosition(chat: Chat) {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n\n // const bubble = chat.bubbles.getBubbleByPoint('top');\n // if(bubble) {\n // const top = bubble.getBoundingClientRect().top;\n const chatBubbles = chat.bubbles;\n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const chatPositions = stateStorage.getFromCache('chatPositions');\n if(!(chatBubbles.scrollable.getDistanceToEnd() <= 16 && chatBubbles.scrollable.loadedAll.bottom) && chatBubbles.getRenderedLength()) {\n chatBubbles.sliceViewport(true);\n const top = chatBubbles.scrollable.scrollTop;\n\n const position = {\n mids: getObjectKeysAndSort(chatBubbles.bubbles, 'desc').filter((mid) => mid > 0 && !chatBubbles.skippedMids.has(mid)),\n top\n };\n\n chatPositions[key] = position;\n\n this.log('saved chat position:', position);\n } else {\n delete chatPositions[key];\n\n this.log('deleted chat position');\n }\n\n stateStorage.set({chatPositions}, true);\n // }\n }\n\n public getChatSavedPosition(chat: Chat): ChatSavedPosition {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n\n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const cache = stateStorage.getFromCache('chatPositions');\n return cache && cache[key];\n }\n\n public applyCurrentTheme(slug?: string, backgroundUrl?: string, broadcastEvent?: boolean) {\n if(backgroundUrl) {\n this.backgroundPromises[slug] = Promise.resolve(backgroundUrl);\n }\n\n themeController.setTheme();\n\n return this.setCurrentBackground(broadcastEvent === undefined ? !!slug : broadcastEvent);\n }\n\n private setSettings = () => {\n const {messagesTextSize} = rootScope.settings;\n\n this.customEmojiSize = makeMediaSize(messagesTextSize + 4, messagesTextSize + 4);\n document.documentElement.style.setProperty('--messages-text-size', messagesTextSize + 'px');\n\n const firstTime = !this.customEmojiSize;\n if(!firstTime) {\n const ellipsisElements = document.querySelectorAll('middle-ellipsis-element');\n ellipsisElements.forEach((element) => {\n element.disconnectedCallback();\n element.dataset.fontSize = '' + messagesTextSize;\n if(element.title) element.textContent = element.title;\n element.connectedCallback();\n });\n\n const renderers = document.querySelectorAll('.chat custom-emoji-renderer-element');\n renderers.forEach((renderer) => {\n renderer.forceRenderAfterSize = true;\n });\n }\n\n document.body.classList.toggle('animation-level-0', !rootScope.settings.animationsEnabled);\n document.body.classList.toggle('animation-level-1', false);\n document.body.classList.toggle('animation-level-2', rootScope.settings.animationsEnabled);\n\n this.chatsSelectTabDebounced = debounce(() => {\n const topbar = this.chat.topbar;\n topbar.pinnedMessage?.setCorrectIndex(0); // * буду молиться богам, чтобы это ничего не сломало, но это исправляет получение пиннеда после анимации\n\n this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }, rootScope.settings.animationsEnabled ? 250 : 0, false, true);\n\n lottieLoader.setLoop(rootScope.settings.stickers.loop);\n animationIntersector.checkAnimations2(false);\n\n for(const chat of this.chats) {\n chat.setAutoDownloadMedia();\n }\n\n I18n.setTimeFormat(rootScope.settings.timeFormat);\n\n this.toggleChatGradientAnimation(this.chat);\n };\n\n // * не могу использовать тут TransitionSlider, так как мне нужен отрисованный блок рядом\n // * (или под текущим чатом) чтобы правильно отрендерить чат (напр. scrollTop)\n private chatsSelectTab(tab: HTMLElement, animate?: boolean) {\n if(this.prevTab === tab) {\n return;\n }\n\n if(animate === false && this.prevTab) { // * will be used for Safari iOS history swipe\n disableTransition([tab, this.prevTab].filter(Boolean));\n }\n\n if(this.prevTab) {\n this.prevTab.classList.remove('active');\n this.chatsSelectTabDebounced();\n\n // ! нужно переделать на animation, так как при лаге анимация будет длиться не 250мс\n if(rootScope.settings.animationsEnabled && animate !== false) {\n dispatchHeavyAnimationEvent(pause(250 + 150), 250 + 150);\n }\n\n const prevIdx = whichChild(this.prevTab);\n const idx = whichChild(tab);\n if(idx > prevIdx) {\n appNavigationController.pushItem({\n type: 'chat',\n onPop: (canAnimate) => {\n this.setPeer({}, canAnimate);\n blurActiveElement();\n }\n });\n }\n }\n\n tab.classList.add('active');\n this.prevTab = tab;\n }\n\n private init() {\n document.addEventListener('paste', this.onDocumentPaste, true);\n\n if(!IS_TOUCH_SUPPORTED) {\n this.attachDragAndDropListeners();\n }\n\n // if(!isTouchSupported) {\n this.markupTooltip = new MarkupTooltip(this);\n this.markupTooltip.handleSelection();\n // }\n }\n\n private attachDragAndDropListeners() {\n const drops: ChatDragAndDrop[] = [];\n const mediaDrops: ChatDragAndDrop[] = [];\n let mounted = false;\n const toggle = async(e: DragEvent, mount: boolean) => {\n if(mount === mounted) return;\n\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n\n const newMediaPopup = getCurrentNewMediaPopup();\n const types: string[] = await getFilesFromEvent(e, true);\n if(!isFiles || (!(await this.canDrag()) && !newMediaPopup)) { // * skip dragging text case\n counter = 0;\n return;\n }\n\n const _dropsContainer = newMediaPopup ? mediaDropsContainer : dropsContainer;\n const _drops = newMediaPopup ? mediaDrops : drops;\n\n if(mount && !_drops.length) {\n const force = isFiles && !types.length; // * can't get file items not from 'drop' on Safari\n\n const foundMedia = types.filter((t) => MEDIA_MIME_TYPES_SUPPORTED.has(t)).length;\n // const foundDocuments = types.length - foundMedia;\n\n this.log('drag files', types);\n\n if(newMediaPopup) {\n newMediaPopup.appendDrops(_dropsContainer);\n\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n header: 'Preview.Dragging.AddItems',\n headerArgs: [types.length],\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n this.log('drop', e);\n this.onDocumentPaste(e, 'document');\n }\n }));\n }\n } else {\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragfiles',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropAsFilesDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n this.log('drop', e);\n this.onDocumentPaste(e, 'document');\n }\n }));\n }\n\n // if((foundMedia && !foundDocuments) || force) {\n if(foundMedia || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragmedia',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropQuickDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n this.log('drop', e);\n this.onDocumentPaste(e, 'media');\n }\n }));\n }\n\n this.chat.container.append(_dropsContainer);\n }\n }\n\n // if(!mount) return;\n\n SetTransition({\n element: _dropsContainer,\n className: 'is-visible',\n forwards: mount,\n duration: 200,\n onTransitionEnd: () => {\n if(!mount) {\n _drops.forEach((drop) => {\n drop.destroy();\n });\n\n _drops.length = 0;\n }\n }\n });\n\n if(mount) {\n _drops.forEach((drop) => {\n drop.setPath();\n });\n } else {\n counter = 0;\n }\n\n document.body.classList.toggle('is-dragging', mount);\n mounted = mount;\n };\n\n /* document.body.addEventListener('dragover', (e) => {\n cancelEvent(e);\n }); */\n\n let counter = 0;\n document.body.addEventListener('dragenter', (e) => {\n counter++;\n });\n\n document.body.addEventListener('dragover', (e) => {\n // this.log('dragover', e/* , e.dataTransfer.types[0] */);\n toggle(e, true);\n cancelEvent(e);\n });\n\n document.body.addEventListener('dragleave', (e) => {\n // this.log('dragleave', e, counter);\n // if((e.pageX <= 0 || e.pageX >= this.managers.appPhotosManager.windowW) || (e.pageY <= 0 || e.pageY >= this.managers.appPhotosManager.windowH)) {\n counter--;\n if(counter === 0) {\n // if(!findUpClassName(e.target, 'drops-container')) {\n toggle(e, false);\n }\n });\n\n const dropsContainer = document.createElement('div');\n dropsContainer.classList.add('drops-container');\n\n const mediaDropsContainer = dropsContainer.cloneNode(true) as HTMLElement;\n }\n\n private async canDrag() {\n const chat = this.chat;\n const peerId = chat?.peerId;\n return !(!peerId || overlayCounter.isOverlayActive || !(await chat.canSend('send_media')));\n }\n\n private onDocumentPaste = async(e: ClipboardEvent | DragEvent, attachType?: 'media' | 'document') => {\n const newMediaPopup = getCurrentNewMediaPopup();\n\n // console.log('document paste');\n // console.log('item', event.clipboardData.getData());\n\n if(e instanceof DragEvent) {\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n if(isFiles) {\n cancelEvent(e);\n }\n }\n\n const files = await getFilesFromEvent(e);\n if(!(await this.canDrag()) && !newMediaPopup) return;\n if(files.length) {\n if(newMediaPopup) {\n newMediaPopup.addFiles(files);\n return;\n }\n\n const chatInput = this.chat.input;\n chatInput.willAttachType = attachType || (MEDIA_MIME_TYPES_SUPPORTED.has(files[0].type) ? 'media' : 'document');\n PopupElement.createPopup(PopupNewMedia, this.chat, files, chatInput.willAttachType);\n }\n };\n\n private async overrideHash(peerId?: PeerId) {\n let str: string;\n if(peerId) {\n const username = await this.managers.appPeersManager.getPeerUsername(peerId);\n str = username ? '@' + username : '' + peerId;\n }\n\n appNavigationController.overrideHash(str);\n }\n\n public selectTab(id: number, animate?: boolean) {\n if(animate === false) { // * will be used for Safari iOS history swipe\n disableTransition([appSidebarLeft.sidebarEl, this.columnEl, appSidebarRight.sidebarEl]);\n }\n\n document.body.classList.toggle(LEFT_COLUMN_ACTIVE_CLASSNAME, id === 0);\n\n const prevTabId = this.tabId;\n if(prevTabId !== -1) {\n this.overrideHash(id > 0 ? this.chat?.peerId : undefined);\n }\n\n this.log('selectTab', id, prevTabId);\n\n let animationPromise: Promise = rootScope.settings.animationsEnabled ? doubleRaf() : Promise.resolve();\n if(\n prevTabId !== -1 &&\n prevTabId !== id &&\n rootScope.settings.animationsEnabled &&\n animate !== false/* &&\n mediaSizes.activeScreen !== ScreenSize.large */\n ) {\n const transitionTime = (mediaSizes.isMobile ? 250 : 200) + 100; // * cause transition time could be > 250ms\n animationPromise = pause(transitionTime);\n dispatchHeavyAnimationEvent(animationPromise, transitionTime);\n\n // ! it's very heavy operation. will blink in firefox\n /* this.columnEl.classList.add('disable-hover');\n animationPromise.finally(() => {\n this.columnEl.classList.remove('disable-hover');\n }); */\n }\n\n this.tabId = id;\n blurActiveElement();\n if(mediaSizes.isMobile && prevTabId === 2 && id < 2) {\n document.body.classList.remove(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n }\n\n if(prevTabId !== -1 && id > prevTabId) {\n if(id < 2 || !appNavigationController.findItemByType('im')) {\n appNavigationController.pushItem({\n type: 'im',\n onPop: (canAnimate) => {\n // this.selectTab(prevTabId, !isSafari);\n this.setPeer({}, canAnimate);\n }\n });\n }\n }\n\n const onImTabChange = (window as any).onImTabChange;\n onImTabChange && onImTabChange(id);\n\n // this._selectTab(id, mediaSizes.isMobile);\n // document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, id === 2);\n\n return animationPromise;\n }\n\n public updateStatus() {\n return this.managers.appUsersManager.updateMyOnlineStatus(this.offline);\n }\n\n private createNewChat() {\n const chat = new Chat(\n this,\n this.managers\n );\n\n if(this.chats.length) {\n chat.setBackground(this.lastBackgroundUrl, true);\n }\n\n this.chats.push(chat);\n\n return chat;\n }\n\n private spliceChats(fromIndex: number, justReturn = true, animate?: boolean, spliced?: Chat[]) {\n if(fromIndex >= this.chats.length) return;\n\n const chatFrom = this.chat;\n if(this.chats.length > 1 && justReturn) {\n this.dispatchEvent('peer_changing', this.chat);\n }\n\n if(!spliced) {\n spliced = this.chats.splice(fromIndex, this.chats.length - fromIndex);\n }\n\n const chatTo = this.chat;\n this.dispatchEvent('chat_changing', {from: chatFrom, to: chatTo});\n\n // * -1 because one item is being sliced when closing the chat by calling .removeByType\n for(let i = 0; i < spliced.length - 1; ++i) {\n appNavigationController.removeByType('chat', true);\n }\n\n // * fix middle chat z-index on animation\n if(spliced.length > 1) {\n spliced.slice(0, -1).forEach((chat) => {\n chat.container.remove();\n });\n }\n\n this.chatsSelectTab(chatTo.container, animate);\n\n if(justReturn) {\n this.dispatchEvent('peer_changed', chatTo);\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n searchTab?.close();\n\n appSidebarRight.replaceSharedMediaTab(chatTo.sharedMediaTab);\n }\n\n spliced.forEach((chat) => {\n chat.beforeDestroy();\n });\n\n setTimeout(() => {\n // chat.setPeer(0);\n spliced.forEach((chat) => {\n chat.destroy();\n });\n }, 250 + 100);\n }\n\n public async setPeer(options: Partial = {}, animate?: boolean): Promise {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n options.peerId ??= NULL_PEER_ID;\n\n const {peerId, lastMsgId, threadId} = options;\n\n const chat = this.chat;\n const chatIndex = this.chats.indexOf(chat);\n\n if(!peerId) {\n if(chatIndex > 0) {\n this.spliceChats(chatIndex, undefined, animate);\n return;\n } else if(mediaSizes.activeScreen === ScreenSize.medium) { // * floating sidebar case\n this.selectTab(+!this.tabId, animate);\n return;\n }\n } else if(chatIndex > 0 && chat.peerId && !this.isSamePeer(chat, options as any)) {\n // const firstChat = this.chats[0];\n // if(firstChat.peerId !== chat.peerId) {\n /* // * slice idx > 0, set background and slice first, so new one will be the first\n const spliced = this.chats.splice(1, this.chats.length - 1);\n this.createNewChat();\n this.chats.splice(0, 1); */\n const spliced = this.chats.splice(1, this.chats.length - 1);\n if(this.chat.peerId === peerId) {\n this.spliceChats(0, true, true, spliced);\n return;\n } else {\n const ret = this.setPeer(options);\n this.spliceChats(0, false, false, spliced);\n return ret;\n }\n // } else {\n // this.spliceChats(1, false, animate);\n // }\n\n // return ret;\n }\n\n // * don't reset peer if returning\n if(peerId === chat.peerId && mediaSizes.activeScreen <= ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.selectTab(1, animate);\n return false;\n }\n\n if(peerId || mediaSizes.activeScreen !== ScreenSize.mobile) {\n const result = await chat.setPeer(options as any as Parameters[0]);\n\n // * wait for cached render\n const promise = result?.cached ? result.promise : Promise.resolve();\n if(peerId) {\n Promise.all([\n promise,\n chat.setBackgroundPromise\n ]).then(() => {\n // window.requestAnimationFrame(() => {\n setTimeout(() => { // * setTimeout is better here\n setTimeout(() => {\n this.chatsSelectTab(this.chat.container);\n }, 0);\n this.selectTab(1, animate);\n }, 0);\n });\n }\n }\n\n if(!peerId) {\n this.selectTab(0, animate);\n return false;\n }\n }\n\n public async setInnerPeer(options: ChatSetInnerPeerOptions) {\n const {peerId} = options;\n if(peerId === NULL_PEER_ID || !peerId) {\n return;\n }\n\n if(!options.type) {\n if(options.threadId && !(await this.managers.appPeersManager.isForum(options.peerId))) {\n options.type = 'discussion';\n }\n\n options.type ??= 'chat';\n }\n\n // * prevent opening already opened peer\n const existingIndex = this.chats.findIndex((chat) => this.isSamePeer(chat, options));\n if(existingIndex !== -1) {\n this.spliceChats(existingIndex + 1);\n return this.setPeer(options);\n }\n\n const oldChat = this.chat;\n let chat = oldChat;\n if(oldChat.inited) { // * use first not inited chat\n chat = this.createNewChat();\n }\n\n this.dispatchEvent('chat_changing', {from: oldChat, to: chat});\n\n // this.chatsSelectTab(chat.container);\n\n return this.setPeer(options);\n }\n\n public openScheduled(peerId: PeerId) {\n this.setInnerPeer({\n peerId,\n type: 'scheduled'\n });\n }\n\n private getTypingElement(action: SendMessageAction) {\n const el = document.createElement('span');\n let c = 'peer-typing';\n el.classList.add(c);\n el.dataset.action = action._;\n switch(action._) {\n case 'sendMessageTypingAction': {\n // default: {\n c += '-text';\n for(let i = 0; i < 3; ++i) {\n const dot = document.createElement('span');\n dot.className = c + '-dot';\n el.append(dot);\n }\n break;\n }\n\n case 'sendMessageUploadAudioAction':\n case 'sendMessageUploadDocumentAction':\n case 'sendMessageUploadRoundAction':\n case 'sendMessageUploadVideoAction':\n case 'sendMessageUploadPhotoAction': {\n c += '-upload';\n /* const trail = document.createElement('span');\n trail.className = c + '-trail';\n el.append(trail); */\n break;\n }\n\n case 'sendMessageRecordAudioAction':\n case 'sendMessageRecordRoundAction':\n case 'sendMessageRecordVideoAction': {\n c += '-record';\n break;\n }\n\n case 'sendMessageEmojiInteractionSeen':\n case 'sendMessageChooseStickerAction': {\n c += '-choosing-sticker';\n for(let i = 0; i < 2; ++i) {\n const eye = document.createElement('div');\n eye.className = c + '-eye';\n el.append(eye);\n }\n break;\n }\n }\n\n el.classList.add(c);\n\n return el;\n }\n\n public async getPeerTyping(peerId: PeerId, container?: HTMLElement, threadId?: number) {\n // const log = this.log.bindPrefix('getPeerTyping-' + peerId);\n // log('getting peer typing');\n\n const isUser = peerId.isUser();\n if(isUser && await this.managers.appUsersManager.isBot(peerId)) {\n // log('a bot');\n return;\n }\n\n const typings = await this.managers.appProfileManager.getPeerTypings(peerId, threadId);\n if(!typings?.length) {\n // log('have no typing');\n return;\n }\n\n const typing = typings[0];\n\n const langPackKeys: {\n [peerType in 'private' | 'chat' | 'multi']?: Partial<{[action in SendMessageAction['_']]: LangPackKey}>\n } = {\n private: {\n 'sendMessageTypingAction': 'Peer.Activity.User.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.User.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.User.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.User.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.User.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.User.EnjoyingAnimations'\n },\n chat: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.Chat.EnjoyingAnimations'\n },\n multi: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.Multi.TypingText1',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.Multi.SendingPhoto1',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.Multi.RecordingAudio1',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.Multi.PlayingGame1',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.Multi.ChoosingSticker1'\n }\n };\n\n const mapa = isUser ? langPackKeys.private : (typings.length > 1 ? langPackKeys.multi : langPackKeys.chat);\n let action = typing.action;\n\n if(typings.length > 1) {\n const s: any = {};\n typings.forEach((typing) => {\n const type = typing.action._;\n if(s[type] === undefined) s[type] = 0;\n ++s[type];\n });\n\n if(Object.keys(s).length > 1) {\n action = {\n _: 'sendMessageTypingAction'\n };\n }\n }\n\n const langPackKey = mapa[action._];\n if(!langPackKey) {\n // log('no langPackKey');\n return;\n }\n\n let peerTitlePromise: Promise;\n let args: any[];\n if(peerId.isAnyChat()) {\n const peerTitle = new PeerTitle();\n peerTitlePromise = peerTitle.update({peerId: typing.userId.toPeerId(false), onlyFirstName: true});\n args = [\n peerTitle.element,\n typings.length - 1\n ];\n\n await peerTitlePromise;\n }\n\n if(!container) {\n container = document.createElement('span');\n container.classList.add('online', 'peer-typing-container');\n }\n\n container.classList.toggle('peer-typing-flex', action._ === 'sendMessageChooseStickerAction' || action._ === 'sendMessageEmojiInteractionSeen');\n\n let typingElement = container.firstElementChild as HTMLElement;\n if(!typingElement) {\n typingElement = this.getTypingElement(action);\n container.prepend(typingElement);\n } else {\n if(typingElement.dataset.action !== action._) {\n typingElement.replaceWith(this.getTypingElement(action));\n }\n }\n\n if(action._ === 'sendMessageEmojiInteractionSeen') {\n if(args) {\n args.pop();\n } else {\n args = [];\n }\n\n const span = htmlToSpan(wrapEmojiText(action.emoticon));\n args.push(span);\n }\n\n const descriptionElement = i18n(langPackKey, args);\n descriptionElement.classList.add('peer-typing-description');\n\n if(container.childElementCount > 1) container.lastElementChild.replaceWith(descriptionElement);\n else container.append(descriptionElement);\n\n // log('returning typing');\n return container;\n }\n\n private async getChatStatus(chatId: ChatId, noTyping?: boolean): Promise> {\n const typingEl = noTyping ? undefined : await this.getPeerTyping(chatId.toPeerId(true));\n if(typingEl) {\n return {cached: true, result: Promise.resolve(typingEl)};\n }\n\n const result = await this.managers.acknowledged.appProfileManager.getChatFull(chatId);\n const dooo = async(chatInfo: ChatFull) => {\n // this.chat.log('chatInfo res:', chatInfo);\n\n const participants_count = (chatInfo as ChatFull.channelFull).participants_count ||\n ((chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants)?.participants?.length ||\n 1;\n // if(participants_count) {\n let subtitle = await getChatMembersString(chatId);\n\n if(participants_count < 2) {\n return subtitle;\n }\n\n const onlines = await this.managers.appProfileManager.getOnlines(chatId);\n if(onlines > 1) {\n const span = document.createElement('span');\n\n span.append(...join([subtitle, i18n('OnlineCount', [numberThousandSplitter(onlines)])], false));\n subtitle = span;\n }\n\n return subtitle;\n // }\n };\n\n const promise = Promise.resolve(result.result).then(dooo);\n return {\n cached: result.cached,\n result: promise\n };\n }\n\n private async getUserStatus(userId: UserId, ignoreSelf?: boolean) {\n const result: AckedResult = {\n cached: true,\n result: Promise.resolve(undefined as HTMLElement)\n };\n\n const user = await this.managers.appUsersManager.getUser(userId);\n if(!user || (user.pFlags.self && !ignoreSelf)) {\n return result;\n }\n\n const subtitle = getUserStatusString(user);\n\n if(!user.pFlags.bot && !user.pFlags.support) {\n let typingEl = await this.getPeerTyping(userId.toPeerId());\n if(!typingEl && user.status?._ === 'userStatusOnline') {\n typingEl = document.createElement('span');\n typingEl.classList.add('online');\n typingEl.append(subtitle);\n }\n\n if(typingEl) {\n result.result = Promise.resolve(typingEl);\n return result;\n }\n }\n\n result.result = Promise.resolve(subtitle);\n return result;\n }\n\n private async getPeerStatus(peerId: PeerId, ignoreSelf?: boolean, noTyping?: boolean) {\n if(!peerId) return;\n let promise: Promise>;\n if(peerId.isAnyChat()) {\n promise = this.getChatStatus(peerId.toChatId(), noTyping);\n } else {\n promise = this.getUserStatus(peerId.toUserId(), ignoreSelf);\n }\n\n return promise;\n }\n\n public async setPeerStatus(options: {\n peerId: PeerId,\n element: HTMLElement,\n needClear: boolean,\n useWhitespace: boolean,\n middleware: () => boolean,\n ignoreSelf?: boolean,\n noTyping?: boolean\n }) {\n // const log = this.log.bindPrefix('status-' + peerId);\n // log('setting status', element);\n\n const {peerId, element, needClear, useWhitespace, middleware, ignoreSelf, noTyping} = options;\n\n if(!needClear) {\n // * good good good\n const typingContainer = element.querySelector('.peer-typing-container') as HTMLElement;\n if(typingContainer && await this.getPeerTyping(peerId, typingContainer)) {\n // log('already have a status');\n return;\n }\n }\n\n const result = await this.getPeerStatus(peerId, ignoreSelf, noTyping);\n // log('getPeerStatus result', result);\n if(!middleware()) {\n // log.warn('middleware');\n return;\n }\n\n const set = async() => {\n const subtitle = result && await result.result;\n if(!middleware()) {\n return;\n }\n\n return () => replaceContent(element, subtitle || placeholder);\n };\n\n const placeholder = useWhitespace ? NBSP : ''; // ! HERE U CAN FIND WHITESPACE\n if(!result || result.cached || needClear === undefined) {\n return await set();\n } else if(needClear) {\n return () => {\n element.textContent = placeholder;\n return set().then((callback) => callback?.());\n };\n }\n }\n\n public setChoosingStickerTyping(cancel: boolean) {\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: cancel ? 'sendMessageCancelAction' : 'sendMessageChooseStickerAction'}, undefined, this.chat.threadId);\n }\n\n public isSamePeer(options1: {peerId: PeerId, threadId?: number, type?: ChatType}, options2: typeof options1) {\n return options1.peerId === options2.peerId &&\n options1.threadId === options2.threadId &&\n (typeof(options1.type) !== typeof(options2.type) || options1.type === options2.type);\n }\n}\n\nconst appImManager = new AppImManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appImManager = appImManager);\nexport default appImManager;\n","import {Message, MessageMedia} from '../../../../layer';\n\nexport default function canSaveMessageMedia(message: Message.message | Message.messageService) {\n return message &&\n !message.pFlags.is_outgoing &&\n !(message as Message.message).pFlags.noforwards &&\n !((message as Message.message).media as MessageMedia.messageMediaInvoice)?.extended_media\n}\n","import {Document, Message, MessageAction, MessageExtendedMedia, MessageMedia, Photo, WebPage} from '../../../../layer';\n\nexport default function getMediaFromMessage(message: Message) {\n if(!message) return;\n\n let media: any;\n if((message as Message.messageService).action) {\n media = ((message as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo;\n } else if((message as Message.message).media) {\n let messageMedia = (message as Message.message).media;\n if((messageMedia as MessageMedia.messageMediaWebPage).webpage) {\n messageMedia = (messageMedia as MessageMedia.messageMediaWebPage).webpage as any as MessageMedia;\n } else if((messageMedia as MessageMedia.messageMediaInvoice).extended_media?._ === 'messageExtendedMedia') {\n messageMedia = ((messageMedia as MessageMedia.messageMediaInvoice).extended_media as MessageExtendedMedia.messageExtendedMedia).media;\n }\n\n media = (messageMedia as MessageMedia.messageMediaDocument).document ||\n (messageMedia as MessageMedia.messageMediaPhoto).photo;\n }\n\n return media as Photo.photo | Document.document;\n}\n","import {Message} from '../../../../layer';\nimport type {MyMessage} from '../../appMessagesManager';\n\nexport default function getMessageSenderPeerIdOrName(message: MyMessage) {\n if(message.fromId) {\n return {\n peerId: message.fromId\n };\n } else {\n return {\n fromName: (message as Message.message).fwd_from?.from_name\n };\n }\n}\n","import {isRestricted} from '../../../../helpers/restrictions';\nimport {Message} from '../../../../layer';\n\nexport default function isMessageRestricted(message: Message.message) {\n return !!(message.restriction_reason && isRestricted(message.restriction_reason));\n}\n","// https://github.com/eelcohn/Telegram-API/wiki/Calculating-color-for-a-Telegram-user-on-IRC\n/*\n HTML-color IRC-color Description\n #c03d33 4 red\n #4fad2d 3 green\n #d09306 7 yellow\n #168acd 10 blue\n #8544d6 6 purple\n #cd4073 13 pink\n #2996ad 11 sea\n #ce671b 5 orange\n*/\nconst DialogColorsFg = ['#fc5c51', '#0fb297', '#d09306', '#3d72ed', '#895dd5', '#cd4073', '#00c1a6', '#fa790f'];\nconst DialogColors = ['red', 'green', 'yellow', 'blue', 'violet', 'pink', 'cyan', 'orange'];\nconst DialogColorsMap = [0, 7, 4, 1, 6, 3, 5];\n\nexport default function getPeerColorById(peerId: PeerId, pic = true) {\n if(!peerId) return '';\n\n const idx = DialogColorsMap[Math.abs(+peerId) % 7];\n const color = (pic ? DialogColors : DialogColorsFg)[idx];\n return color;\n}\n","import {Chat, User} from '../../../../layer';\n\nexport default function getPeerEditableUsername(peer: User.user | Chat.channel) {\n if(peer.username) {\n return peer.username;\n }\n\n const usernames = peer.usernames;\n const username = usernames?.find((username) => username.pFlags.editable);\n return username?.username;\n}\n","import isObject from '../../../../helpers/object/isObject';\nimport {InputChannel, InputPeer, Peer} from '../../../../layer';\nimport {NULL_PEER_ID} from '../../../mtproto/mtproto_config';\n\nexport default function getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | InputChannel | PeerId | string): PeerId {\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\n // if(typeof(peerId) === 'number') return peerId;\n else if(isObject(peerId)) {\n const userId = (peerId as Peer.peerUser).user_id;\n if(userId !== undefined) {\n return userId.toPeerId(false);\n }\n\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\n if(chatId !== undefined) {\n return chatId.toPeerId(true);\n }\n\n return NULL_PEER_ID; // maybe it is an inputPeerSelf\n // } else if(!peerId) return 'u0';\n } else if(!peerId) return NULL_PEER_ID;\n\n const isUser = (peerId as string).charAt(0) === 'u';\n const peerParams = (peerId as string).substr(1).split('_');\n\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../appDocsManager';\nimport type {MyPhoto} from '../../appPhotosManager';\nimport type {PhotoSize, VideoSize, WebDocument} from '../../../../layer';\nimport calcImageInBox from '../../../../helpers/calcImageInBox';\nimport {THUMB_TYPE_FULL} from '../../../mtproto/mtproto_config';\n\nexport default function choosePhotoSize(\n photo: MyPhoto | MyDocument | WebDocument,\n boxWidth = 0,\n boxHeight = 0,\n useBytes = false,\n pushDocumentSize = false\n) {\n if(window.devicePixelRatio > 1) {\n boxWidth *= 2;\n boxHeight *= 2;\n }\n\n /*\n s box 100x100\n m box 320x320\n x box 800x800\n y box 1280x1280\n w box 2560x2560\n a crop 160x160\n b crop 320x320\n c crop 640x640\n d crop 1280x1280 */\n\n let sizes: PhotoSize[] = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs as PhotoSize[];\n let bestPhotoSize: typeof sizes[0] = {_: 'photoSizeEmpty', type: THUMB_TYPE_FULL};\n if(pushDocumentSize && sizes && photo._ !== 'photo') {\n sizes = sizes.concat({\n _: 'photoSize',\n w: photo.w,\n h: photo.h,\n size: photo.size,\n type: THUMB_TYPE_FULL\n });\n }\n\n if(sizes?.length) {\n for(let i = 0, length = sizes.length; i < length; ++i) {\n const photoSize = sizes[i];\n if(!('w' in photoSize) && !('h' in photoSize)) continue;\n\n bestPhotoSize = photoSize;\n\n const size = calcImageInBox(photoSize.w, photoSize.h, boxWidth, boxHeight);\n if(size.width >= boxWidth || size.height >= boxHeight) {\n break;\n }\n }\n\n if(useBytes && bestPhotoSize._ === 'photoSizeEmpty' && sizes[0]._ === 'photoStrippedSize') {\n bestPhotoSize = sizes[0];\n }\n }\n\n return bestPhotoSize;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\nimport createDataChannel from './helpers/createDataChannel';\nimport createPeerConnection from './helpers/createPeerConnection';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport StreamManager from './streamManager';\nimport {Ssrc} from './types';\n\nexport type CallConnectionInstanceOptions = {\n streamManager: StreamManager,\n connection?: RTCPeerConnection,\n log?: ReturnType\n};\n\nexport default abstract class CallConnectionInstanceBase {\n public connection: RTCPeerConnection;\n public streamManager: StreamManager;\n public dataChannel: RTCDataChannel;\n public description: LocalConferenceDescription;\n public sources: {\n audio: Ssrc,\n video?: Ssrc,\n };\n protected negotiating: Promise;\n protected log: ReturnType;\n\n constructor(options: CallConnectionInstanceOptions) {\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = this.connection?.log || logger('CALL-CONNECTION-BASE');\n }\n\n this.sources = {} as any;\n }\n\n public createPeerConnection(config?: RTCConfiguration) {\n return this.connection || (this.connection = createPeerConnection(config, this.log.bindPrefix('connection')).connection);\n }\n\n public createDataChannel(dict?: RTCDataChannelInit) {\n return this.dataChannel || (this.dataChannel = createDataChannel(this.connection, dict, this.log.bindPrefix('data')));\n }\n\n public createDescription() {\n return this.description || (this.description = new LocalConferenceDescription(this.connection));\n }\n\n public appendStreamToConference() {\n return this.streamManager.appendToConference(this.description);\n }\n\n public closeConnection() {\n const {connection} = this;\n if(!connection) {\n return;\n }\n\n try {\n connection.log('close');\n connection.close();\n } catch(e) {\n this.log.error(e);\n }\n }\n\n public closeConnectionAndStream(stopStream: boolean) {\n this.closeConnection();\n stopStream && this.streamManager.stop();\n }\n\n protected abstract negotiateInternal(): CallConnectionInstanceBase['negotiating'];\n\n public negotiate() {\n const promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n return this.negotiating = this.negotiateInternal().finally(() => {\n this.negotiating = undefined;\n });\n }\n\n public sendDataChannelData(data: any) {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.dataChannel.send(JSON.stringify(data));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Logger, logger} from '../../logger';\n\nexport default function createPeerConnection(config: RTCConfiguration, log?: Logger) {\n if(!log) {\n log = logger('RTCPeerConnection');\n }\n\n log('constructor');\n\n // @ts-ignore\n const connection = new RTCPeerConnection(config);\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n });\n connection.addEventListener('signalingstatechange', () => {\n log('onsignalingstatechange', connection.signalingState);\n });\n connection.addEventListener('connectionstatechange', () => {\n log('onconnectionstatechange', connection.connectionState);\n });\n connection.addEventListener('negotiationneeded', () => { // * will be fired every time input device changes\n log('onnegotiationneeded', connection.signalingState);\n });\n connection.addEventListener('icecandidate', (event) => {\n log('onicecandidate', event);\n });\n connection.addEventListener('iceconnectionstatechange', () => {\n log('oniceconnectionstatechange', connection.iceConnectionState);\n });\n connection.addEventListener('datachannel', () => {\n log('ondatachannel');\n });\n\n connection.log = log;\n\n return {connection};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Logger, logger} from '../../logger';\n\nexport default function createDataChannel(connection: RTCPeerConnection, dict?: RTCDataChannelInit, log?: Logger) {\n // return;\n\n if(!log) {\n log = logger('RTCDataChannel');\n }\n\n const channel = connection.createDataChannel('data', dict);\n\n channel.addEventListener('message', (e) => {\n log('onmessage', e);\n });\n channel.addEventListener('open', () => {\n log('onopen');\n });\n channel.addEventListener('close', () => {\n log('onclose');\n });\n\n channel.log = log;\n\n return channel;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from '../sdp';\nimport {CallSignalingData, P2PVideoCodec} from '../types';\nimport parseMediaSectionInfo from './parseMediaSectionInfo';\n\nexport default function parseSignalingData(sdp: SDP) {\n const info = parseMediaSectionInfo(sdp, sdp.media[0]);\n\n const data: CallSignalingData.initialSetup = {\n '@type': 'InitialSetup',\n 'fingerprints': [info.fingerprint],\n 'ufrag': info.ufrag,\n 'pwd': info.pwd,\n 'audio': undefined,\n 'video': undefined,\n 'screencast': undefined\n };\n\n const convertNumber = (number: number) => '' + number;\n\n for(const section of sdp.media) {\n const mediaType = section.mediaType;\n if(mediaType === 'application' || !section.isSending) {\n continue;\n }\n\n const codec: P2PVideoCodec = data[mediaType === 'video' && data['video'] ? 'screencast' : mediaType] = {} as any;\n const info = parseMediaSectionInfo(sdp, section);\n codec.ssrc = convertNumber(info.source);\n\n if(info.sourceGroups) {\n codec.ssrcGroups = info.sourceGroups.map((sourceGroup) => ({semantics: sourceGroup.semantics, ssrcs: sourceGroup.sources.map(convertNumber)}));\n }\n\n const rtpExtensions: P2PVideoCodec['rtpExtensions'] = codec.rtpExtensions = [];\n section.attributes.get('extmap').forEach((attribute) => {\n rtpExtensions.push({\n id: +attribute.key,\n uri: attribute.value\n });\n });\n\n const payloadTypesMap: Map = new Map();\n\n const getPayloadType = (id: number) => {\n let payloadType = payloadTypesMap.get(id);\n if(!payloadType) {\n payloadTypesMap.set(id, payloadType = {\n id\n } as any);\n }\n\n return payloadType;\n };\n\n section.attributes.get('rtpmap').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n const splitted = attribute.value.split('/');\n const [name, clockrate, channels] = splitted;\n payloadType.name = name;\n payloadType.clockrate = +clockrate;\n payloadType.channels = channels ? +channels : 0;\n });\n\n section.attributes.get('rtcp-fb').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n payloadType.feedbackTypes = attribute.lines.map((line) => {\n const splitted = line.split(' ');\n const [type, subtype] = splitted;\n return {\n type,\n subtype: subtype || ''\n };\n });\n });\n\n section.attributes.get('fmtp').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n const parameters: P2PVideoCodec['payloadTypes'][0]['parameters'] = payloadType.parameters = {};\n const splitted = attribute.value.split(';');\n for(const str of splitted) {\n const [key, value] = str.split('=');\n parameters[key] = value;\n }\n });\n\n codec.payloadTypes = Array.from(payloadTypesMap.values());\n\n /* if(codec.payloadTypes.length > 5) {\n codec.payloadTypes.length = Math.min(codec.payloadTypes.length, 5);\n } */\n }\n\n return data;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CallConnectionInstanceBase, {CallConnectionInstanceOptions} from './callConnectionInstanceBase';\nimport CallInstance from './callInstance';\nimport parseSignalingData from './helpers/parseSignalingData';\nimport {parseSdp} from './sdp/utils';\n\nexport default class CallConnectionInstance extends CallConnectionInstanceBase {\n private call: CallInstance;\n\n constructor(options: CallConnectionInstanceOptions & {\n call: CallConnectionInstance['call']\n }) {\n super(options);\n }\n\n protected async negotiateInternal() {\n const {connection, call} = this;\n\n if(!connection.localDescription && !connection.remoteDescription && !call.isOutgoing) {\n return;\n }\n\n let descriptionInit: RTCSessionDescriptionInit;\n if(call.offerReceived) {\n call.offerReceived = false;\n\n const answer = descriptionInit = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n this.log('[InitialSetup] send 2');\n } else {\n const offer = descriptionInit = await connection.createOffer();\n\n this.log('[sdp] local', offer.sdp);\n await connection.setLocalDescription(offer);\n\n call.offerSent = true;\n\n this.log('[InitialSetup] send 0');\n }\n\n const initialSetup = parseSignalingData(parseSdp(descriptionInit.sdp));\n call.sendCallSignalingData(initialSetup);\n }\n}\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport bufferConcats from '../../../helpers/bytes/bufferConcats';\nimport subtle from '../../crypto/subtle';\nimport sha256 from '../../crypto/utils/sha256';\n\nconst kMaxIncomingPacketSize = 128 * 1024 * 1024;\n\nexport default class P2PEncryptor {\n private type: 'Signaling';\n private counter: number;\n private seqMap: Map;\n\n constructor(private isOutgoing: boolean, private p2pKey: Uint8Array) {\n this.type = 'Signaling';\n this.counter = 0;\n this.seqMap = new Map();\n }\n\n private concatSHA256(parts: Uint8Array[]) {\n return sha256(bufferConcats(...parts));\n }\n\n private async encryptPrepared(buffer: Uint8Array) {\n const result = {\n counter: 0, // this.counterFromSeq(this.readSeq(buffer)),\n bytes: new Uint8Array(16 + buffer.length)\n };\n\n const x = (this.isOutgoing ? 0 : 8) + (this.type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n\n const msgKeyLarge = await this.concatSHA256([key.subarray(x + 88, x + 88 + 32), buffer]);\n const msgKey = result.bytes;\n for(let i = 0; i < 16; ++i) {\n msgKey[i] = msgKeyLarge[i + 8];\n }\n\n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n\n const bytes = await this.aesProcessCtr(buffer, buffer.length, aesKeyIv, true);\n\n result.bytes = new Uint8Array([...result.bytes.subarray(0, 16), ...bytes]);\n\n return result;\n }\n\n public encryptRawPacket(buffer: Uint8Array) {\n const seq = ++this.counter;\n const arr = new ArrayBuffer(4);\n const view = new DataView(arr);\n view.setUint32(0, seq >>> 0, false); // byteOffset = 0; litteEndian = false\n\n const result = new Uint8Array([...new Uint8Array(arr), ...buffer]);\n\n return this.encryptPrepared(result);\n }\n\n private async prepareAesKeyIv(key: Uint8Array, msgKey: Uint8Array, x: number) {\n const [sha256a, sha256b] = await Promise.all([\n this.concatSHA256([\n msgKey.subarray(0, 16),\n key.subarray(x, x + 36)\n ]),\n\n this.concatSHA256([\n key.subarray(40 + x, 40 + x + 36),\n msgKey.subarray(0, 16)\n ])\n ]);\n\n return {\n key: new Uint8Array([\n ...sha256a.subarray(0, 8),\n ...sha256b.subarray(8, 8 + 16),\n ...sha256a.subarray(24, 24 + 8)\n ]),\n iv: new Uint8Array([\n ...sha256b.subarray(0, 4),\n ...sha256a.subarray(8, 8 + 8),\n ...sha256b.subarray(24, 24 + 4)\n ])\n };\n }\n\n private async aesProcessCtr(encryptedData: Uint8Array, dataSize: number, aesKeyIv: {key: Uint8Array, iv: Uint8Array}, encrypt = true) {\n const cryptoKey = await subtle.importKey(\n 'raw',\n aesKeyIv.key,\n {name: 'AES-CTR'},\n false,\n [encrypt ? 'encrypt' : 'decrypt']\n );\n\n const buffer: ArrayBuffer = await subtle[encrypt ? 'encrypt' : 'decrypt']({\n name: 'AES-CTR',\n counter: aesKeyIv.iv,\n length: aesKeyIv.iv.length * 8\n },\n cryptoKey,\n encryptedData\n );\n\n return new Uint8Array(buffer);\n }\n\n private constTimeIsDifferent(a: Uint8Array, b: Uint8Array, count: number) {\n let msgKeyEquals = true;\n for(let i = 0; i < count; ++i) {\n if(a[i] !== b[i]) {\n msgKeyEquals = false;\n }\n }\n\n return !msgKeyEquals;\n }\n\n public async decryptRawPacket(buffer: Uint8Array) {\n if(buffer.length < 21 || buffer.length > kMaxIncomingPacketSize) {\n return;\n }\n\n const {isOutgoing, type} = this;\n\n const x = (isOutgoing ? 8 : 0) + (type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n\n const msgKey = buffer.subarray(0, 16);\n const encryptedData = buffer.subarray(16);\n const encryptedDataSize = buffer.length - 16;\n\n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n\n const decryptionBuffer = await this.aesProcessCtr(encryptedData, encryptedDataSize, aesKeyIv, false);\n\n const msgKeyLarge = await this.concatSHA256([\n key.subarray(88 + x, 88 + x + 32),\n decryptionBuffer\n ]);\n\n if(this.constTimeIsDifferent(msgKeyLarge.subarray(8), msgKey, 16)) {\n return;\n }\n\n const dataView = new DataView(decryptionBuffer.buffer);\n const seq = dataView.getUint32(0);\n if(this.seqMap.has(seq)) {\n return;\n }\n this.seqMap.set(seq, seq);\n\n return decryptionBuffer.slice(4);\n }\n}\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha256 from '@cryptography/sha256';\n\nexport default function sha256(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then((b) => {\n // console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n\n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport StringFromLineBuilder from '../stringFromLineBuilder';\nimport {addDataChannel, addExtmap, addPayloadTypes, addSsrc} from './p2PSdpBuilder';\n\nexport default class ChromeP2PSdpBuilder {\n static generateOffer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0',\n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0'\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`,\n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2',\n 'a=extmap-allow-mixed',\n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map((x) => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n\n static generateAnswer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0',\n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0'\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`,\n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2',\n 'a=extmap-allow-mixed',\n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map((x) => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n\n stringBuilder.add(\n 'a=rtcp-mux',\n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n}\n","/*\n* Copyright (c) 2018-present, Evgeny Nadymov\n*\n* This source code is licensed under the GPL v.3.0 license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\nimport ChromeP2PSdpBuilder from './chromeP2PSdpBuilder';\nimport { FirefoxP2PSdpBuilder } from './firefoxP2PSdpBuilder';\nimport { SafariP2PSdpBuilder } from './safariP2PSdpBuilder';\n// import { TG_CALLS_SDP_STRING } from '../../Stores/CallStore';\n\nexport function p2pParseCandidate(candidate) {\n if(!candidate || !candidate.startsWith('candidate:')) {\n return;\n }\n \n const sdpString = candidate;\n candidate = candidate.substr('candidate:'.length);\n \n const [foundation, component, protocol, priority, ip, port, ...other] = candidate.split(' ');\n const c = {\n sdpString,\n foundation,\n component,\n protocol,\n priority,\n address: { ip, port }\n };\n \n for(let i = 0; i < other.length; i += 2) {\n switch(other[i]) {\n case 'typ': {\n c.type = other[i + 1];\n break;\n }\n case 'raddr': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.ip = other[i + 1];\n break;\n }\n case 'rport': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.port = other[i + 1];\n break;\n }\n case 'generation': {\n c.generation = other[i + 1];\n break;\n }\n case 'tcptype': {\n c.tcpType = other[i + 1];\n break;\n }\n case 'network-id': {\n c.networkId = other[i + 1];\n break;\n }\n case 'network-cost': {\n c.networkCost = other[i + 1];\n break;\n }\n case 'ufrag': {\n c.username = other[i + 1];\n break;\n }\n }\n }\n \n return c;\n}\n\nexport function p2pParseSdp(sdp) {\n const lines = sdp.split('\\r\\n');\n const lookup = (prefix, force = true, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return line.substr(prefix.length);\n }\n }\n \n if (force) {\n console.error(\"Can't find prefix\", prefix);\n }\n \n return null;\n };\n const findIndex = (prefix, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return i;\n }\n }\n \n return -1;\n };\n \n const pwdIndex = findIndex('a=ice-pwd:');\n const ufragIndex = findIndex('a=ice-ufrag:');\n if (pwdIndex === -1 && ufragIndex === -1) {\n return {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n }\n \n const info = {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n \n let mediaIndex = findIndex('m=');\n const fingerprint = lookup('a=fingerprint:', false);\n const setup = lookup('a=setup:', false);\n if (fingerprint && setup) {\n info.fingerprints.push({\n hash: fingerprint.split(' ')[0],\n fingerprint: fingerprint.split(' ')[1],\n setup\n });\n }\n \n const ufrag = lookup('a=ice-ufrag:', false);\n const pwd = lookup('a=ice-pwd:', false);\n if (ufrag && pwd) {\n info.ufrag = ufrag;\n info.pwd = pwd;\n }\n \n while (mediaIndex !== -1) {\n let nextMediaIndex = findIndex('m=', mediaIndex + 1);\n \n const extmap = [];\n const types = [];\n const mediaType = lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0];\n const media = {\n // type: lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0],\n // mid: lookup('a=mid:', true, mediaIndex, nextMediaIndex),\n // dir: findDirection(mediaIndex, nextMediaIndex),\n rtpExtensions: extmap,\n payloadTypes: types\n }\n \n const lineTo = nextMediaIndex === -1 ? lines.length : nextMediaIndex;\n const fmtp = new Map();\n const rtcpFb = new Map();\n for (let i = mediaIndex; i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith('a=extmap:')) {\n const [ id, uri ] = line.substr('a=extmap:'.length).split(' ');\n extmap.push({ id: parseInt(id), uri });\n } else if (line.startsWith('a=fmtp:')) {\n const [ id, str ] = line.substr('a=fmtp:'.length).split(' ');\n const obj = { };\n const arr = str.split(';').map(x => {\n const [ key, value ] = x.split('=');\n obj[key] = value;\n return { [key]: value };\n });\n fmtp.set(parseInt(id), obj);\n } else if (line.startsWith('a=rtcp-fb:')) {\n const [ id, type = '', subtype = '' ] = line.substr('a=rtcp-fb:'.length).split(' ');\n if (rtcpFb.has(parseInt(id))) {\n rtcpFb.get(parseInt(id)).push({ type, subtype });\n } else {\n rtcpFb.set(parseInt(id), [{ type, subtype }])\n }\n } else if (line.startsWith('a=rtpmap')) {\n const [ id, str ] = line.substr('a=rtpmap:'.length).split(' ');\n const [ name, clockrate, channels = '0' ] = str.split('/');\n const obj = { id: parseInt(id), name, clockrate: parseInt(clockrate), channels: parseInt(channels) };\n \n types.push(obj);\n }\n }\n \n for (let i = 0; i < types.length; i++) {\n const { id } = types[i];\n if (rtcpFb.has(id)) {\n types[i].feedbackTypes = rtcpFb.get(id);\n }\n if (fmtp.has(id)) {\n types[i].parameters = fmtp.get(id);\n }\n }\n \n const ssrc = lookup('a=ssrc:', false, mediaIndex, nextMediaIndex);\n if (ssrc) {\n media.ssrc = ssrc.split(' ')[0];\n }\n \n const ssrcGroup = lookup('a=ssrc-group:', false, mediaIndex, nextMediaIndex);\n if (ssrcGroup) {\n const [ semantics, ...ssrcs ] = ssrcGroup.split(' ');\n media.ssrcGroups = [{\n semantics,\n ssrcs\n }]\n }\n \n switch (mediaType) {\n case 'audio': {\n info.audio = media;\n break;\n }\n case 'video': {\n info.video = media;\n break;\n }\n }\n \n mediaIndex = nextMediaIndex;\n }\n\n if(!info.video.ssrcGroups) {\n info.video.ssrcGroups = [];\n }\n\n info['@type'] = 'InitialSetup';\n \n // console.log('[p2pParseSdp]', sdp, info);\n return info;\n}\n\nexport function isFirefox() {\n return navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n}\n\nfunction isSafari() {\n return navigator.userAgent.toLowerCase().indexOf('safari') > -1 && navigator.userAgent.toLowerCase().indexOf('chrome') === -1;\n}\n\nexport function addExtmap(extmap) {\n let sdp = [];\n // return sdp;\n for (let j = 0; j < extmap.length; j++) {\n const ext = extmap[j];\n const { id, uri } = ext;\n // if (isFirefox() && uri.indexOf(''))\n console.log('[extmap] add', id, uri);\n sdp.push(`a=extmap:${id} ${uri}`);\n }\n \n return sdp.join('\\n');\n}\n\nexport function addPayloadTypes(types) {\n let sdp = [];\n console.log('[SDP] addPayloadTypes', types);\n for (let i = 0; i < types.length; i++) {\n const type = types[i];\n const { id, name, clockrate, channels, feedbackTypes, parameters } = type;\n sdp.push(`a=rtpmap:${id} ${name}/${clockrate}${channels ? '/' + channels : ''}`);\n if (feedbackTypes) {\n feedbackTypes.forEach(x => {\n const { type, subtype } = x;\n sdp.push(`a=rtcp-fb:${id} ${[type, subtype].join(' ')}`);\n });\n }\n if (parameters) {\n const fmtp = [];\n Object.getOwnPropertyNames(parameters).forEach(pName => {\n fmtp.push(`${pName}=${parameters[pName]}`);\n });\n \n sdp.push(`a=fmtp:${id} ${fmtp.join(';')}`);\n }\n }\n \n return sdp.join('\\n');\n}\n\nexport function addSsrc(type, ssrc, ssrcGroups, streamName) {\n let sdp = [];\n \n if (ssrcGroups && ssrcGroups.length > 0) {\n ssrcGroups.forEach(ssrcGroup => {\n if (ssrcGroup && ssrcGroup.ssrcs.length > 0) {\n sdp.push(`a=ssrc-group:${ssrcGroup.semantics} ${ssrcGroup.ssrcs.join(' ')}`);\n ssrcGroup.ssrcs.forEach(ssrc => {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n });\n }\n });\n } else if (ssrc) {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n }\n \n return sdp.join('\\n');\n}\n\nexport function addDataChannel(mid) {\n return `m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144`;\n}\n\nexport class P2PSdpBuilder {\n static generateCandidate(info) {\n if (!info) return null;\n \n const { sdpString, sdpMLineIndex, sdpMid, foundation, component, protocol, priority, address, type, relAddress, generation, tcpType, networkId, networkCost, username } = info;\n if (/* TG_CALLS_SDP_STRING */true) {\n if (sdpString) {\n return {\n candidate: sdpString,\n sdpMLineIndex,\n sdpMid\n };\n }\n }\n throw 'no sdpString';\n \n let candidate = `candidate:${foundation} ${component} ${protocol} ${priority} ${address.ip} ${address.port}`;\n const attrs = []\n if (type) {\n attrs.push(`typ ${type}`);\n }\n if (relAddress) {\n attrs.push(`raddr ${relAddress.ip}`);\n attrs.push(`rport ${relAddress.port}`);\n }\n if (tcpType) {\n attrs.push(`tcptype ${tcpType}`);\n }\n if (generation) {\n attrs.push(`generation ${generation}`);\n }\n if (username) {\n attrs.push(`ufrag ${username}`);\n }\n if (networkId) {\n attrs.push(`network-id ${networkId}`);\n }\n if (networkCost) {\n attrs.push(`network-cost ${networkCost}`);\n }\n if (attrs.length > 0) {\n candidate += ` ${attrs.join(' ')}`;\n }\n \n return { candidate, sdpMid, sdpMLineIndex };\n }\n \n static generateOffer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateOffer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateOffer(info);\n }\n \n return ChromeP2PSdpBuilder.generateOffer(info);\n }\n \n static generateAnswer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateAnswer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateAnswer(info);\n }\n \n return ChromeP2PSdpBuilder.generateAnswer(info);\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class FirefoxP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, mid, ssrc, ssrcGroups, payloadTypes, dir, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class SafariP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from '../../environment/ctx';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {GroupCallParticipantVideoSourceGroup, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, Update} from '../../layer';\nimport {emojiFromCodePoints} from '../../vendor/emoji';\nimport type {CallId} from '../appManagers/appCallsManager';\nimport type {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport CallConnectionInstance from './callConnectionInstance';\nimport CallInstanceBase from './callInstanceBase';\nimport callsController from './callsController';\nimport CALL_STATE from './callState';\nimport {GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS} from './constants';\nimport parseSignalingData from './helpers/parseSignalingData';\nimport stopTrack from './helpers/stopTrack';\nimport localConferenceDescription, {ConferenceEntry, generateSsrc} from './localConferenceDescription';\nimport getCallProtocol from './p2P/getCallProtocol';\nimport getRtcConfiguration from './p2P/getRtcConfiguration';\nimport P2PEncryptor from './p2P/p2PEncryptor';\nimport {p2pParseCandidate, P2PSdpBuilder} from './p2P/p2PSdpBuilder';\nimport {parseSdp} from './sdp/utils';\nimport {WebRTCLineType} from './sdpBuilder';\nimport StreamManager from './streamManager';\nimport {AudioCodec, CallMediaState, CallSignalingData, DiffieHellmanInfo, P2PAudioCodec, P2PVideoCodec, VideoCodec} from './types';\n\nexport default class CallInstance extends CallInstanceBase<{\n state: (state: CALL_STATE) => void,\n id: (id: CallId, prevId: CallId) => void,\n muted: (muted: boolean) => void,\n mediaState: (mediaState: CallMediaState) => void,\n acceptCallOverride: () => Promise,\n}> {\n public dh: Partial;\n public id: CallId;\n public call: PhoneCall;\n public interlocutorUserId: UserId;\n public protocol: PhoneCallProtocol;\n public isOutgoing: boolean;\n public encryptionKey: Uint8Array;\n public connectionInstance: CallConnectionInstance;\n public encryptor: P2PEncryptor;\n public decryptor: P2PEncryptor;\n public candidates: RTCIceCandidate[];\n\n public offerReceived: boolean;\n public offerSent: boolean;\n\n public createdParticipantEntries: boolean;\n public release: () => Promise;\n public _connectionState: CALL_STATE;\n\n public createdAt: number;\n public connectedAt: number;\n public discardReason: string;\n\n private managers: AppManagers;\n\n private hangUpTimeout: number;\n\n private mediaStates: {\n input: CallMediaState,\n output?: CallMediaState\n };\n\n private sendMediaState: () => Promise;\n\n private decryptQueue: Uint8Array[];\n\n private getEmojisFingerprintPromise: Promise;\n private emojisFingerprint: [string, string, string, string];\n\n private wasStartingScreen: boolean;\n private wasStartingVideo: boolean;\n public wasTryingToJoin: boolean;\n\n public streamManager: StreamManager;\n\n constructor(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n managers: CallInstance['managers'],\n protocol?: PhoneCallProtocol\n }) {\n super();\n\n this.log = logger('CALL');\n\n if(!this.protocol) {\n this.protocol = getCallProtocol();\n }\n\n safeAssign(this, options);\n\n this.createdAt = Date.now();\n this.offerReceived = false;\n this.offerSent = false;\n this.decryptQueue = [];\n this.candidates = [];\n\n this.addEventListener('state', (state) => {\n this.log('state', CALL_STATE[state]);\n\n if(state === CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n\n const streamManager = this.streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n streamManager.direction = 'sendrecv';\n streamManager.types.push('screencast');\n if(!this.isOutgoing) {\n streamManager.locked = true;\n streamManager.canCreateConferenceEntry = false;\n }\n\n let mediaState: CallMediaState = {\n '@type': 'MediaState',\n 'type': 'input',\n 'lowBattery': false,\n 'muted': true,\n 'screencastState': 'inactive',\n 'videoRotation': 0,\n 'videoState': 'inactive'\n };\n\n const self = this;\n mediaState = new Proxy(mediaState, {\n set: function(target, key, value) {\n // @ts-ignore\n target[key] = value;\n self.setMediaState(mediaState);\n self.sendMediaState();\n return true;\n }\n });\n\n this.mediaStates = {\n input: mediaState\n };\n\n this.sendMediaState = debounce(this._sendMediaState.bind(this), 0, false, true);\n }\n\n get connectionState() {\n const {_connectionState, connectionInstance} = this;\n if(_connectionState !== undefined) {\n return _connectionState;\n } else if(!connectionInstance) {\n return CALL_STATE.CONNECTING;\n } else {\n const {iceConnectionState} = connectionInstance.connection;\n if(iceConnectionState === 'closed') {\n return CALL_STATE.CLOSED;\n } else if(iceConnectionState !== 'connected' && (!IS_SAFARI || iceConnectionState !== 'completed')) {\n return CALL_STATE.CONNECTING;\n } else {\n return CALL_STATE.CONNECTED;\n }\n }\n }\n\n get sortIndex() {\n const connectionState = this.connectionState;\n const state = CALL_STATE.CLOSED - connectionState + 1;\n let index = state * 10000000000000;\n index += 2147483647000 - (connectionState === CALL_STATE.PENDING && this.isOutgoing ? 0 : this.createdAt);\n return index;\n }\n\n public getVideoElement(type: CallMediaState['type']) {\n if(type === 'input') return this.elements.get('main');\n else {\n const mediaState = this.getMediaState('output');\n if(!mediaState) {\n return;\n }\n\n const type: WebRTCLineType = mediaState.videoState === 'active' ? 'video' : (mediaState.screencastState === 'active' ? 'screencast' : undefined);\n if(!type) {\n return;\n }\n\n const entry = this.description.findEntry((entry) => entry.type === type);\n if(!entry) {\n return;\n }\n\n return this.elements.get('' + entry.recvEntry.source);\n }\n }\n\n public async startScreenSharingInternal() {\n try {\n this.wasStartingScreen = true;\n this.wasStartingVideo = false;\n this.streamManager.types = ['audio', 'screencast'];\n await this.requestScreen();\n } catch(err) {\n this.log.error('startScreenSharing error', err);\n }\n }\n\n public async toggleScreenSharing() {\n if(this.isSharingVideo) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingScreen) {\n return this.stopVideoSharing();\n } else {\n return this.startScreenSharingInternal();\n }\n }\n\n public async startVideoSharingInternal() {\n try {\n this.wasStartingScreen = false;\n this.wasStartingVideo = true;\n this.streamManager.types = ['audio', 'video'];\n await this.requestInputSource(false, true, false);\n } catch(err) {\n this.log.error('startVideoSharing error', err);\n }\n }\n\n public async stopVideoSharing() {\n const mediaState = this.getMediaState('input');\n mediaState.videoState = mediaState.screencastState = 'inactive';\n\n const {streamManager, description} = this;\n const track = streamManager.inputStream.getVideoTracks()[0];\n if(track) {\n stopTrack(track);\n streamManager.appendToConference(description); // clear sender track\n }\n }\n\n public async toggleVideoSharing() {\n if(this.isSharingScreen) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharingInternal();\n }\n }\n\n public getMediaState(type: CallMediaState['type']) {\n return this.mediaStates[type];\n }\n\n public setMediaState(mediaState: CallMediaState) {\n this.mediaStates[mediaState.type] = mediaState;\n this.dispatchEvent('mediaState', mediaState);\n }\n\n public isSharingVideoType(type: 'video' | 'screencast') {\n try {\n const hasVideoTrack = super.isSharingVideo;\n return hasVideoTrack && !!((this.wasStartingScreen && type === 'screencast') || (this.wasStartingVideo && type === 'video'));\n\n // ! it will be used before the track appears\n // return !!this.description.entries.find((entry) => entry.type === type && entry.transceiver.sender.track.enabled);\n } catch(err) {\n return false;\n }\n }\n\n public get isSharingVideo() {\n return this.isSharingVideoType('video');\n }\n\n public get isSharingScreen() {\n return this.isSharingVideoType('screencast');\n }\n\n public get isMuted() {\n const audioTrack = this.streamManager.inputStream.getAudioTracks()[0];\n return !audioTrack?.enabled;\n }\n\n public get isClosing() {\n const {connectionState} = this;\n return connectionState === CALL_STATE.CLOSING || connectionState === CALL_STATE.CLOSED;\n }\n\n public get description(): localConferenceDescription {\n return this.connectionInstance?.description;\n }\n\n public setHangUpTimeout(timeout: number, reason: PhoneCallDiscardReason['_']) {\n this.clearHangUpTimeout();\n this.hangUpTimeout = ctx.setTimeout(() => {\n this.hangUpTimeout = undefined;\n this.hangUp(reason);\n }, timeout);\n }\n\n public clearHangUpTimeout() {\n if(this.hangUpTimeout !== undefined) {\n clearTimeout(this.hangUpTimeout);\n this.hangUpTimeout = undefined;\n }\n }\n\n public setPhoneCall(phoneCall: PhoneCall) {\n this.call = phoneCall;\n\n const {id} = phoneCall;\n if(this.id !== id) {\n const prevId = this.id;\n this.id = id;\n this.dispatchEvent('id', id, prevId);\n }\n }\n\n public async acceptCall() {\n const canAccept = (await Promise.all(this.dispatchResultableEvent('acceptCallOverride')))[0] ?? true;\n if(this.isClosing || !canAccept) {\n return;\n }\n\n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n\n const call = this.call as PhoneCall.phoneCallRequested;\n this.requestInputSource(true, !!call.pFlags.video, false);\n\n const g_a_hash = call.g_a_hash;\n this.managers.appCallsManager.generateDh().then(async(dh) => {\n this.dh = { // ! it is correct\n g_a_hash,\n b: dh.a,\n g_b: dh.g_a,\n g_b_hash: dh.g_a_hash,\n p: dh.p\n };\n\n return this.managers.apiManager.invokeApi('phone.acceptCall', {\n peer: await this.managers.appCallsManager.getCallInput(this.id),\n protocol: this.protocol,\n g_b: this.dh.g_b\n });\n }).then(async(phonePhoneCall) => {\n await this.managers.appCallsManager.savePhonePhoneCall(phonePhoneCall);\n }).catch((err) => {\n this.log.error('accept call error', err);\n // if(err.type === 'CALL_PROTOCOL_COMPAT_LAYER_INVALID') {\n\n // }\n\n this.hangUp('phoneCallDiscardReasonHangup');\n });\n }\n\n public joinCall() {\n this.log('joinCall');\n\n this.getEmojisFingerprint();\n\n this.overrideConnectionState();\n\n const {isOutgoing, encryptionKey, streamManager} = this;\n\n const configuration = getRtcConfiguration(this.call as PhoneCall.phoneCall);\n this.log('joinCall configuration', configuration);\n if(!configuration) return;\n\n const connectionInstance = this.connectionInstance = new CallConnectionInstance({\n call: this,\n streamManager,\n log: this.log.bindPrefix('connection')\n });\n\n const connection = connectionInstance.createPeerConnection(configuration);\n connection.addEventListener('iceconnectionstatechange', () => {\n const state = this.connectionState;\n if(this.connectedAt === undefined && state === CALL_STATE.CONNECTED) {\n this.connectedAt = Date.now();\n }\n\n this.dispatchEvent('state', state);\n });\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n connection.addEventListener('icecandidate', (event) => {\n const {candidate} = event;\n connection.log('onicecandidate', candidate);\n if(candidate?.candidate) {\n this.sendIceCandidate(candidate);\n }\n });\n connection.addEventListener('track', (event) => {\n const {track} = event;\n connection.log('ontrack', track);\n this.onTrack(event);\n });\n\n const description = connectionInstance.createDescription();\n\n this.encryptor = new P2PEncryptor(isOutgoing, encryptionKey);\n this.decryptor = new P2PEncryptor(!isOutgoing, encryptionKey);\n\n this.log('currentCall', this);\n\n if(isOutgoing) {\n connectionInstance.appendStreamToConference();\n }\n\n this.createDataChannel();\n\n this.processDecryptQueue();\n }\n\n private createDataChannelEntry() {\n const dataChannelEntry = this.description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n dataChannelEntry.sendEntry = dataChannelEntry.recvEntry = dataChannelEntry;\n }\n\n private createDataChannel() {\n if(this.connectionInstance.dataChannel) {\n return;\n }\n\n const channel = this.connectionInstance.createDataChannel({\n id: 0,\n negotiated: true\n });\n channel.addEventListener('message', (e) => {\n this.applyDataChannelData(JSON.parse(e.data));\n });\n channel.addEventListener('open', () => {\n this.sendMediaState();\n });\n }\n\n private applyDataChannelData(data: CallMediaState) {\n switch(data['@type']) {\n case 'MediaState': {\n data.type = 'output';\n this.log('got output media state', data);\n this.setMediaState(data);\n break;\n }\n\n default:\n this.log.error('unknown data channel data:', data);\n break;\n }\n }\n\n private _sendMediaState() {\n const {connectionInstance} = this;\n if(!connectionInstance) return;\n\n const mediaState = {...this.getMediaState('input')};\n // mediaState.videoRotation = 90;\n delete mediaState.type;\n this.log('sendMediaState', mediaState);\n\n connectionInstance.sendDataChannelData(mediaState);\n }\n\n public async sendCallSignalingData(data: CallSignalingData) {\n /* if(data['@type'] === 'InitialSetup') {\n this.filterNotVP8(data);\n } */\n\n const json = JSON.stringify(data);\n const arr = new TextEncoder().encode(json);\n const {bytes} = await this.encryptor.encryptRawPacket(arr);\n\n this.log('sendCallSignalingData', this.id, json);\n await this.managers.apiManager.invokeApi('phone.sendSignalingData', {\n peer: await this.managers.appCallsManager.getCallInput(this.id),\n data: bytes\n });\n }\n\n public sendIceCandidate(iceCandidate: RTCIceCandidate) {\n this.log('sendIceCandidate', iceCandidate);\n const {candidate, sdpMLineIndex} = iceCandidate;\n if(sdpMLineIndex !== 0) {\n return;\n }\n\n const parsed = p2pParseCandidate(candidate);\n // const parsed = {sdpString: candidate};\n /* if(parsed.address.ip !== '') {\n return;\n } */\n\n this.sendCallSignalingData({\n '@type': 'Candidates',\n 'candidates': [parsed]\n });\n }\n\n public async confirmCall() {\n const {protocol, id, call} = this;\n const dh = this.dh as DiffieHellmanInfo.a;\n\n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n const {key, key_fingerprint} = await this.managers.appCallsManager.computeKey((call as PhoneCall.phoneCallAccepted).g_b, dh.a, dh.p);\n\n const phonePhoneCall = await this.managers.apiManager.invokeApi('phone.confirmCall', {\n peer: await this.managers.appCallsManager.getCallInput(id),\n protocol: protocol,\n g_a: dh.g_a,\n key_fingerprint: key_fingerprint\n });\n\n this.encryptionKey = key;\n await this.managers.appCallsManager.savePhonePhoneCall(phonePhoneCall);\n this.joinCall();\n }\n\n public getEmojisFingerprint() {\n if(this.emojisFingerprint) return this.emojisFingerprint;\n if(this.getEmojisFingerprintPromise) return this.getEmojisFingerprintPromise;\n return this.getEmojisFingerprintPromise = apiManagerProxy.invokeCrypto('get-emojis-fingerprint', this.encryptionKey, this.dh.g_a).then((codePoints) => {\n this.getEmojisFingerprintPromise = undefined;\n return this.emojisFingerprint = codePoints.map((codePoints) => emojiFromCodePoints(codePoints)) as [string, string, string, string];\n });\n }\n\n private unlockStreamManager() {\n this.connectionInstance.streamManager.locked = false;\n this.connectionInstance.appendStreamToConference();\n }\n\n private async doTheMagic() {\n this.connectionInstance.appendStreamToConference();\n\n const connection = this.connectionInstance.connection;\n\n let answer = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n connection.getTransceivers().filter((transceiver) => transceiver.direction === 'recvonly').forEach((transceiver) => {\n const entry = this.connectionInstance.description.getEntryByMid(transceiver.mid);\n entry.transceiver = entry.recvEntry.transceiver = transceiver;\n transceiver.direction = 'sendrecv';\n });\n\n const isAnswer = false;\n\n const description = this.description;\n const bundle = description.entries.map((entry) => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter((entry) => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n await connection.setRemoteDescription(sdpDescription);\n\n answer = await connection.createAnswer();\n\n await connection.setLocalDescription(answer);\n\n const initialSetup = parseSignalingData(parseSdp(answer.sdp));\n this.log('[InitialSetup] send 1');\n this.sendCallSignalingData(initialSetup);\n\n this.unlockStreamManager();\n }\n\n public overrideConnectionState(state?: CALL_STATE) {\n this._connectionState = state;\n this.dispatchEvent('state', this.connectionState);\n }\n\n public get duration() {\n return this.connectedAt !== undefined ? (Date.now() - this.connectedAt) / 1000 | 0 : 0;\n }\n\n protected onInputStream(stream: MediaStream): void {\n super.onInputStream(stream);\n\n const videoTrack = stream.getVideoTracks()[0];\n if(videoTrack) {\n const state = this.getMediaState('input');\n\n // handle starting camera\n if(!this.wasStartingScreen && !this.wasStartingVideo) {\n this.wasStartingVideo = true;\n }\n\n if(this.isSharingVideo) {\n state.videoState = 'active';\n } else if(this.isSharingScreen) {\n state.screencastState = 'active';\n }\n\n videoTrack.addEventListener('ended', () => {\n this.stopVideoSharing();\n }, {once: true});\n }\n\n if(stream.getAudioTracks().length) {\n this.onMutedChange();\n }\n }\n\n private onMutedChange() {\n const isMuted = this.isMuted;\n this.dispatchEvent('muted', isMuted);\n\n const state = this.getMediaState('input');\n state.muted = isMuted;\n }\n\n public toggleMuted(): Promise {\n return this.requestAudioSource(true).then(() => {\n this.setMuted();\n this.onMutedChange();\n });\n }\n\n public async hangUp(discardReason?: PhoneCallDiscardReason['_'], discardedByOtherParty?: boolean) {\n if(this.isClosing) {\n return;\n }\n\n this.discardReason = discardReason;\n this.log('hangUp', discardReason);\n this.overrideConnectionState(CALL_STATE.CLOSED);\n\n if(this.connectionInstance) {\n this.connectionInstance.closeConnectionAndStream(true);\n }\n\n if(discardReason && !discardedByOtherParty) {\n let hasVideo = false;\n for(const type in this.mediaStates) {\n const mediaState = this.mediaStates[type as 'input' | 'output'];\n hasVideo = mediaState.videoState === 'active' || mediaState.screencastState === 'active' || hasVideo;\n }\n\n await this.managers.appCallsManager.discardCall(this.id, this.duration, discardReason, hasVideo);\n }\n }\n\n private performCodec(_codec: P2PAudioCodec | P2PVideoCodec) {\n const payloadTypes: AudioCodec['payload-types'] = _codec.payloadTypes.map((payloadType) => {\n return {\n ...payloadType,\n 'rtcp-fbs': payloadType.feedbackTypes\n }\n });\n\n const codec: AudioCodec = {\n 'rtp-hdrexts': _codec.rtpExtensions,\n 'payload-types': payloadTypes\n };\n\n return codec;\n }\n\n private setDataToDescription(data: CallSignalingData.initialSetup) {\n this.description.setData({\n transport: {\n 'pwd': data.pwd,\n 'ufrag': data.ufrag,\n 'fingerprints': data.fingerprints,\n 'rtcp-mux': true\n },\n audio: this.performCodec(data.audio),\n video: data.video ? this.performCodec(data.video) as VideoCodec : undefined,\n screencast: data.screencast ? this.performCodec(data.screencast) as VideoCodec : undefined\n });\n }\n\n private filterNotVP8(initialSetup: CallSignalingData.initialSetup) {\n if(!this.isOutgoing) { // only VP8 works now\n [initialSetup.video, initialSetup.screencast].filter(Boolean).forEach((codec) => {\n const payloadTypes = codec.payloadTypes;\n const idx = payloadTypes.findIndex((payloadType) => payloadType.name === 'VP8');\n const vp8PayloadType = payloadTypes[idx];\n const rtxIdx = payloadTypes.findIndex((payloadType) => +payloadType.parameters?.apt === vp8PayloadType.id);\n codec.payloadTypes = [payloadTypes[idx], payloadTypes[rtxIdx]];\n });\n }\n }\n\n public async applyCallSignalingData(data: CallSignalingData) {\n this.log('applyCallSignalingData', this, data);\n\n const {connection, description} = this.connectionInstance;\n\n switch(data['@type']) {\n case 'InitialSetup': {\n this.log('[sdp] InitialSetup', data);\n\n this.filterNotVP8(data);\n this.setDataToDescription(data);\n\n const performSsrcGroups = (ssrcGroups: P2PVideoCodec['ssrcGroups']): GroupCallParticipantVideoSourceGroup[] => {\n return ssrcGroups.map((ssrcGroup) => {\n return {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics: ssrcGroup.semantics,\n sources: ssrcGroup.ssrcs.map((source) => +source)\n };\n });\n };\n\n const ssrcs = [\n generateSsrc('audio', +data.audio.ssrc),\n data.video ? generateSsrc('video', performSsrcGroups(data.video.ssrcGroups)) : undefined,\n data.screencast ? generateSsrc('screencast', performSsrcGroups(data.screencast.ssrcGroups)) : undefined\n ].filter(Boolean);\n\n ssrcs.forEach((ssrc) => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n return;\n }\n\n const sendRecvEntry = description.findFreeSendRecvEntry(ssrc.type, false);\n entry = new ConferenceEntry(sendRecvEntry.mid, ssrc.type);\n entry.setDirection('sendrecv');\n sendRecvEntry.recvEntry = entry;\n\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n });\n\n this.createDataChannelEntry();\n\n const isAnswer = this.offerSent;\n this.offerSent = false;\n\n const bundle = description.entries.map((entry) => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter((entry) => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n this.log('[sdp] remote', sdpDescription.sdp);\n\n await connection.setRemoteDescription(sdpDescription);\n\n await this.tryToReleaseCandidates();\n\n if(!isAnswer) {\n await this.doTheMagic();\n }\n\n break;\n }\n\n case 'Candidates': {\n for(const candidate of data.candidates) {\n const init: RTCIceCandidateInit = P2PSdpBuilder.generateCandidate(candidate);\n init.sdpMLineIndex = 0;\n const iceCandidate = new RTCIceCandidate(init);\n this.candidates.push(iceCandidate);\n }\n\n await this.tryToReleaseCandidates();\n break;\n }\n\n default: {\n this.log.error('unrecognized signaling data', data);\n }\n }\n }\n\n public async tryToReleaseCandidates() {\n const {connectionInstance} = this;\n if(!connectionInstance) {\n return;\n }\n\n const {connection} = connectionInstance;\n if(connection.remoteDescription) {\n const promises: Promise[] = this.candidates.map((candidate) => this.addIceCandidate(connection, candidate));\n this.candidates.length = 0;\n\n await Promise.all(promises);\n } else {\n this.log('[candidates] postpone');\n }\n }\n\n private async addIceCandidate(connection: RTCPeerConnection, candidate: RTCIceCandidate) {\n this.log('[candidate] start', candidate);\n try {\n // if(!candidate.address) return;\n await connection.addIceCandidate(candidate);\n this.log('[candidate] add', candidate);\n } catch(e) {\n this.log.error('[candidate] error', candidate, e);\n }\n }\n\n private async processDecryptQueue() {\n const {encryptor} = this;\n if(!encryptor) {\n this.log.warn('got encrypted signaling data before the encryption key');\n return;\n }\n\n const length = this.decryptQueue.length;\n if(!length) {\n return;\n }\n\n const queue = this.decryptQueue.slice();\n this.decryptQueue.length = 0;\n\n for(const data of queue) {\n const decryptedData = await encryptor.decryptRawPacket(data);\n if(!decryptedData) {\n continue;\n }\n\n // this.log('[update] updateNewCallSignalingData', update, decryptedData);\n\n const str = new TextDecoder().decode(decryptedData);\n try {\n const signalingData: CallSignalingData = JSON.parse(str);\n this.log('[update] updateNewCallSignalingData', signalingData);\n this.applyCallSignalingData(signalingData);\n } catch(err) {\n this.log.error('wrong signaling data', str);\n this.hangUp('phoneCallDiscardReasonDisconnect');\n callsController.dispatchEvent('incompatible', this.interlocutorUserId);\n }\n }\n }\n\n public onUpdatePhoneCallSignalingData(data: Uint8Array) {\n this.decryptQueue.push(data);\n this.processDecryptQueue();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport {PhoneCallProtocol} from '../../../layer';\n\nexport default function getCallProtocol(): PhoneCallProtocol {\n return {\n _: 'phoneCallProtocol',\n pFlags: {\n udp_p2p: true,\n udp_reflector: true\n },\n min_layer: 92,\n max_layer: 92,\n library_versions: ['4.0.0']\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport {PhoneCall} from '../../../layer';\n\nexport default function getRtcConfiguration(call: PhoneCall.phoneCall): RTCConfiguration {\n const iceServers: RTCIceServer[] = [];\n call.connections.forEach((connection) => {\n switch(connection._) {\n /* case 'callServerTypeTelegramReflector': {\n break;\n } */\n case 'phoneConnectionWebrtc': {\n const {ip, ipv6, port, username, password} = connection;\n const urls: string[] = [];\n if(connection.pFlags.turn) {\n if(ip) {\n urls.push(`turn:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`turn:[${ipv6}]:${port}`);\n }\n } else if(connection.pFlags.stun) {\n if(ip) {\n urls.push(`stun:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`stun:[${ipv6}]:${port}`);\n }\n }\n\n if(urls.length > 0) {\n iceServers.push({\n urls,\n username,\n credential: password\n });\n }\n break;\n }\n }\n });\n\n return {\n iceServers,\n iceTransportPolicy: call.pFlags.p2p_allowed ? 'all' : 'relay'\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getScreenStream from './getScreenStream';\nimport getStream from './getStream';\n\n/**\n * ! Use multiple constraints together only with first invoke\n */\nexport default function getStreamCached() {\n const _cache: {\n main: Partial<{\n audio: Promise,\n video: Promise\n }>,\n screen: Partial<{\n audio: Promise,\n video: Promise\n }>\n } = {\n main: {},\n screen: {}\n };\n\n return async(options: {\n isScreen: true,\n constraints: DisplayMediaStreamOptions,\n } | {\n isScreen?: false,\n constraints: MediaStreamConstraints,\n muted: boolean\n }) => {\n const {isScreen, constraints} = options;\n const cache = _cache[isScreen ? 'screen' : 'main'];\n let promise: Promise = cache[constraints.audio ? 'audio' : 'video'];\n\n if(!promise) {\n promise = (isScreen ? getScreenStream : getStream)(constraints, (options as any).muted);\n if(constraints.audio && !cache.audio) cache.audio = promise.finally(() => cache.audio = undefined);\n if(constraints.video && !cache.video) cache.video = promise.finally(() => cache.video = undefined);\n }\n\n try {\n return await promise;\n /* let out: Partial<{\n audio: MediaStream,\n video: MediaStream\n }> = {};\n\n await Promise.all([\n constraints.audio && cache.audio.then((stream) => out.audio = stream),\n constraints.video && cache.video.then((stream) => out.video = stream)\n ].filter(Boolean));\n\n return out; */\n } catch(err) {\n throw err;\n }\n };\n}\n\n(window as any).getStreamCached = getStreamCached;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase, {EventListenerListeners} from '../../helpers/eventListenerBase';\nimport noop from '../../helpers/noop';\nimport {logger} from '../logger';\nimport getAudioConstraints from './helpers/getAudioConstraints';\nimport getScreenConstraints from './helpers/getScreenConstraints';\nimport getStreamCached from './helpers/getStreamCached';\nimport getVideoConstraints from './helpers/getVideoConstraints';\nimport stopTrack from './helpers/stopTrack';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport StreamManager, {StreamItem} from './streamManager';\n\nexport type TryAddTrackOptions = {\n stream: MediaStream,\n track: MediaStreamTrack,\n type: StreamItem['type'],\n source?: string\n};\n\nexport default abstract class CallInstanceBase extends EventListenerBase {\n protected log: ReturnType;\n protected outputDeviceId: string;\n\n protected player: HTMLElement;\n protected elements: Map;\n\n protected audio: HTMLAudioElement;\n // protected fixedSafariAudio: boolean;\n\n protected getStream: ReturnType;\n\n constructor() {\n super(false);\n\n const player = this.player = document.createElement('div');\n player.classList.add('call-player');\n player.style.display = 'none';\n document.body.append(player);\n\n this.elements = new Map();\n\n // possible Safari fix\n const audio = this.audio = new Audio();\n audio.autoplay = true;\n audio.volume = 1.0;\n this.player.append(audio);\n this.elements.set('audio', audio);\n\n this.fixSafariAudio();\n\n this.getStream = getStreamCached();\n }\n\n public get isSharingAudio() {\n return !!this.streamManager.hasInputTrackKind('audio');\n }\n\n public get isSharingVideo() {\n return !!this.streamManager.hasInputTrackKind('video');\n }\n\n public abstract get isMuted(): boolean;\n public abstract get isClosing(): boolean;\n\n public fixSafariAudio() {\n // if(this.fixedSafariAudio) return;\n this.audio.play().catch(noop);\n // this.fixedSafariAudio = true;\n }\n\n public requestAudioSource(muted: boolean) {\n return this.requestInputSource(true, false, muted);\n }\n\n public requestInputSource(audio: boolean, video: boolean, muted: boolean) {\n const {streamManager} = this;\n if(streamManager) {\n const isAudioGood = !audio || this.isSharingAudio;\n const isVideoGood = !video || this.isSharingVideo;\n if(isAudioGood && isVideoGood) {\n return Promise.resolve();\n }\n }\n\n const constraints: MediaStreamConstraints = {\n audio: audio && getAudioConstraints(),\n video: video && getVideoConstraints()\n };\n\n return this.getStream({\n constraints,\n muted\n }).then((stream) => {\n this.onInputStream(stream);\n });\n }\n\n public requestScreen() {\n return this.getStream({\n isScreen: true,\n constraints: getScreenConstraints(true)\n }).then((stream) => {\n this.onInputStream(stream);\n });\n }\n\n public getElement(endpoint: number | string) {\n return this.elements.get('' + endpoint);\n }\n\n public abstract get streamManager(): StreamManager;\n public abstract get description(): LocalConferenceDescription;\n public abstract toggleMuted(): Promise;\n\n public cleanup() {\n this.player.textContent = '';\n this.player.remove();\n this.elements.clear();\n\n // can have no connectionInstance but streamManager with input stream\n this.streamManager.stop();\n\n super.cleanup();\n }\n\n public onTrack(event: RTCTrackEvent) {\n this.tryAddTrack({\n stream: event.streams[0],\n track: event.track,\n type: 'output'\n });\n }\n\n public saveInputVideoStream(stream: MediaStream, type?: string) {\n const track = stream.getVideoTracks()[0];\n this.tryAddTrack({\n stream,\n track,\n type: 'input',\n source: type || 'main'\n });\n }\n\n public tryAddTrack({stream, track, type, source}: TryAddTrackOptions) {\n if(!source) {\n source = StreamManager.getSource(stream, type);\n }\n\n this.log('tryAddTrack', stream, track, type, source);\n\n const isOutput = type === 'output';\n\n const {player, elements, streamManager} = this;\n\n const tagName = track.kind as StreamItem['kind'];\n const isVideo = tagName === 'video';\n\n const elementEndpoint = isVideo ? source : tagName;\n let element = elements.get(elementEndpoint);\n\n if(isVideo) {\n track.addEventListener('ended', () => {\n this.log('[track] onended');\n elements.delete(elementEndpoint);\n // element.remove();\n }, {once: true});\n }\n\n if(isOutput) {\n streamManager.addTrack(stream, track, type);\n }\n\n const useStream = isVideo ? stream : streamManager.outputStream;\n if(!element) {\n element = document.createElement(tagName);\n element.autoplay = true;\n element.srcObject = useStream;\n element.volume = 1.0;\n\n if((element as any).sinkId !== 'undefined') {\n const {outputDeviceId} = this;\n if(outputDeviceId) {\n (element as any).setSinkId(outputDeviceId);\n }\n }\n\n if(!isVideo) {\n player.appendChild(element);\n } else {\n element.setAttribute('playsinline', 'true');\n element.muted = true;\n }\n // audio.play();\n\n elements.set(elementEndpoint, element);\n } else {\n if(element.paused) {\n element.play().catch(noop);\n }\n\n // ! EVEN IF MEDIASTREAM IS THE SAME NEW TRACK WON'T PLAY WITHOUT REPLACING IT WHEN NEW PARTICIPANT IS ENTERING !\n // if(element.srcObject !== useStream) {\n element.srcObject = useStream;\n // }\n }\n\n return source;\n }\n\n public setMuted(muted?: boolean) {\n this.streamManager.inputStream.getAudioTracks().forEach((track) => {\n if(track?.kind === 'audio') {\n track.enabled = muted === undefined ? !track.enabled : !muted;\n }\n });\n }\n\n protected onInputStream(stream: MediaStream): void {\n if(!this.isClosing) {\n const videoTracks = stream.getVideoTracks();\n if(videoTracks.length) {\n this.saveInputVideoStream(stream, 'main');\n }\n\n const {streamManager, description} = this;\n streamManager.addStream(stream, 'input');\n\n if(description) {\n streamManager.appendToConference(description);\n }\n } else { // if call is declined earlier than stream appears\n stream.getTracks().forEach((track) => {\n stopTrack(track);\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nenum CALL_STATE {\n CONNECTED,\n CONNECTING,\n EXCHANGING_KEYS,\n PENDING,\n REQUESTING,\n CLOSING,\n CLOSED\n}\n\nexport default CALL_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\n\nexport type CallAudioAssetName = 'call_busy.mp3' | 'call_connect.mp3' | 'call_end.mp3' | 'call_incoming.mp3' | 'call_outgoing.mp3' | 'voip_failed.mp3' | 'voip_connecting.mp3';\n\nlet audioAsset: AudioAssetPlayer;\nexport default function getCallAudioAsset() {\n return audioAsset ??= new AudioAssetPlayer([\n 'call_busy.mp3',\n 'call_connect.mp3',\n 'call_end.mp3',\n 'call_incoming.mp3',\n 'call_outgoing.mp3',\n 'voip_failed.mp3'\n ]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getCallAudioAsset, {CallAudioAssetName} from '../../components/call/getAudioAsset';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport tsNow from '../../helpers/tsNow';\nimport {PhoneCallProtocol} from '../../layer';\nimport {CallId} from '../appManagers/appCallsManager';\nimport {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport rootScope from '../rootScope';\nimport CallInstance from './callInstance';\nimport CALL_STATE from './callState';\n\nconst CALL_REQUEST_TIMEOUT = 45e3;\n\nexport class CallsController extends EventListenerBase<{\n instance: (details: {hasCurrent: boolean, instance: CallInstance}) => void,\n accepting: (instance: CallInstance) => void, // это костыль. используется при параллельном вызове, чтобы заменить звонок в topbarCall\n incompatible: (userId: UserId) => void,\n}> {\n private log: ReturnType;\n private managers: AppManagers;\n private audioAsset: AudioAssetPlayer;\n private instances: Map;\n private sortedInstances: Array;\n private tempId: number;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n this.log = logger('CC');\n\n if(!IS_CALL_SUPPORTED) {\n return;\n }\n\n this.audioAsset = getCallAudioAsset();\n this.tempId = 0;\n this.instances = new Map();\n this.sortedInstances = [];\n\n rootScope.addEventListener('call_update', async(call) => {\n let instance = this.instances.get(call.id);\n\n if(instance) {\n instance.setPhoneCall(call);\n }\n\n switch(call._) {\n case 'phoneCallDiscarded': {\n if(instance) {\n instance.hangUp(call.reason?._, true);\n }\n\n break;\n }\n\n case 'phoneCallAccepted': {\n if(instance) {\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\n instance.hangUp('phoneCallDiscardReasonDisconnect');\n rootScope.dispatchEvent('call_incompatible', instance.interlocutorUserId);\n break;\n } */\n\n instance.confirmCall();\n }\n\n break;\n }\n\n case 'phoneCallRequested': {\n if(!instance) {\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\n rootScope.dispatchEvent('call_incompatible', call.admin_id);\n break;\n } */\n\n instance = this.createCallInstance({\n isOutgoing: false,\n interlocutorUserId: call.admin_id\n });\n\n instance.overrideConnectionState(CALL_STATE.PENDING);\n instance.setPhoneCall(call);\n instance.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonMissed');\n }\n\n break;\n }\n\n case 'phoneCall': {\n if(!instance || instance.encryptionKey) {\n break;\n }\n\n const g_a = instance.dh.g_a = call.g_a_or_b;\n const dh = instance.dh;\n const g_a_hash = await apiManagerProxy.invokeCrypto('sha256', g_a);\n if(!bytesCmp(dh.g_a_hash, g_a_hash)) {\n this.log.error('Incorrect g_a_hash', dh.g_a_hash, g_a_hash);\n break;\n }\n\n const {key, key_fingerprint} = await this.managers.appCallsManager.computeKey(g_a, dh.b, dh.p);\n if(call.key_fingerprint !== key_fingerprint) {\n this.log.error('Incorrect key fingerprint', call.key_fingerprint, key_fingerprint, g_a, dh);\n instance.hangUp('phoneCallDiscardReasonDisconnect');\n break;\n }\n\n instance.encryptionKey = key;\n instance.joinCall();\n\n break;\n }\n }\n });\n\n rootScope.addEventListener('call_signaling', ({callId, data}) => {\n const instance = this.instances.get(callId);\n if(instance?.id !== callId) {\n return;\n }\n\n instance.onUpdatePhoneCallSignalingData(data);\n });\n }\n\n public get currentCall() {\n return this.sortedInstances[0];\n }\n\n public getCallByUserId(userId: UserId) {\n for(const [callId, instance] of this.instances) {\n if(instance.interlocutorUserId === userId) {\n return instance;\n }\n }\n }\n\n private createCallInstance(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n protocol?: PhoneCallProtocol\n }) {\n const call = new CallInstance({\n managers: this.managers,\n ...options\n });\n\n call.addEventListener('state', (state) => {\n const currentCall = this.currentCall;\n if(state === CALL_STATE.CLOSED) {\n this.instances.delete(call.id);\n indexOfAndSplice(this.sortedInstances, call);\n } else {\n insertInDescendSortedArray(this.sortedInstances, call, 'sortIndex');\n }\n\n if(state === CALL_STATE.EXCHANGING_KEYS) {\n call.wasTryingToJoin = true;\n }\n\n const hasConnected = call.connectedAt !== undefined;\n if(state === CALL_STATE.EXCHANGING_KEYS || (state === CALL_STATE.CONNECTING && hasConnected)) {\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonDisconnect');\n } else {\n call.clearHangUpTimeout();\n }\n\n if(currentCall === call || !currentCall) {\n if(state === CALL_STATE.CLOSED) {\n if(!call.isOutgoing && !call.wasTryingToJoin) { // incoming call has been accepted on other device or ended\n this.audioAsset.stopSound();\n } else if(call.wasTryingToJoin && !hasConnected) { // something has happened during the key exchanging\n this.audioAsset.playSound('voip_failed.mp3');\n } else {\n this.audioAsset.playSound(call.discardReason === 'phoneCallDiscardReasonBusy' ? 'call_busy.mp3' : 'call_end.mp3');\n }\n } else if(state === CALL_STATE.PENDING) {\n this.audioAsset.playSound(call.isOutgoing ? 'call_outgoing.mp3' : 'call_incoming.mp3', true);\n } else if(state === CALL_STATE.EXCHANGING_KEYS) {\n this.audioAsset.playSoundIfDifferent('call_connect.mp3');\n } else if(state === CALL_STATE.CONNECTING) {\n if(call.duration) {\n this.audioAsset.playSound('voip_connecting.mp3', true);\n }\n } else {\n this.audioAsset.stopSound();\n }\n }\n });\n\n call.addEventListener('id', (id, prevId) => {\n if(prevId !== undefined) {\n this.instances.delete(prevId);\n }\n\n const hasCurrent = !!this.currentCall;\n this.instances.set(id, call);\n\n if(prevId === undefined) {\n this.dispatchEvent('instance', {instance: call, hasCurrent: hasCurrent});\n }\n });\n\n return call;\n }\n\n public async startCallInternal(userId: UserId, isVideo: boolean) {\n this.log('p2pStartCallInternal', userId, isVideo);\n\n const fullInfo = await this.managers.appProfileManager.getProfile(userId);\n if(!fullInfo) return;\n\n const {video_calls_available} = fullInfo.pFlags;\n\n const call = this.createCallInstance({\n isOutgoing: true,\n interlocutorUserId: userId\n });\n\n call.requestInputSource(true, !!(isVideo && video_calls_available), false);\n\n call.overrideConnectionState(CALL_STATE.REQUESTING);\n call.setPhoneCall({\n _: 'phoneCallWaiting',\n access_hash: '',\n admin_id: NULL_PEER_ID,\n date: tsNow(true),\n id: --this.tempId,\n participant_id: userId,\n protocol: call.protocol,\n pFlags: {\n video: isVideo || undefined\n }\n });\n\n // return;\n this.managers.appCallsManager.generateDh().then(async(dh) => {\n call.dh = dh;\n\n return this.managers.appCallsManager.requestCall(userId, call.protocol, call.dh.g_a_hash, isVideo && video_calls_available);\n }).then((phoneCall) => {\n call.overrideConnectionState(CALL_STATE.PENDING);\n call.setPhoneCall(phoneCall);\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonHangup');\n });\n }\n}\n\nconst callsController = new CallsController();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.callsController = callsController);\nexport default callsController;\n","export const GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX = 50;\nexport const GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS = 100;\nexport const GROUP_CALL_PARTICIPANTS_LOAD_LIMIT = 100;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {GroupCallConnectionType, JoinGroupCallJsonPayload} from '../appManagers/appGroupCallsManager';\nimport {AppManagers} from '../appManagers/managers';\nimport rootScope from '../rootScope';\nimport CallConnectionInstanceBase, {CallConnectionInstanceOptions} from './callConnectionInstanceBase';\nimport GroupCallInstance from './groupCallInstance';\nimport filterServerCodecs from './helpers/filterServerCodecs';\nimport fixLocalOffer from './helpers/fixLocalOffer';\nimport processMediaSection from './helpers/processMediaSection';\nimport {ConferenceEntry} from './localConferenceDescription';\nimport SDP from './sdp';\nimport SDPMediaSection from './sdp/mediaSection';\nimport {WebRTCLineType} from './sdpBuilder';\nimport {UpdateGroupCallConnectionData} from './types';\n\nexport default class GroupCallConnectionInstance extends CallConnectionInstanceBase {\n private groupCall: GroupCallInstance;\n public updateConstraints?: boolean;\n private type: GroupCallConnectionType;\n private options: {\n type: Extract,\n isMuted?: boolean,\n joinVideo?: boolean,\n rejoin?: boolean\n } | {\n type: Extract,\n };\n\n private updateConstraintsInterval: number;\n public negotiateThrottled: () => void;\n\n private managers: AppManagers;\n\n constructor(options: CallConnectionInstanceOptions & {\n groupCall: GroupCallConnectionInstance['groupCall'],\n type: GroupCallConnectionInstance['type'],\n options: GroupCallConnectionInstance['options'],\n managers: AppManagers\n }) {\n super(options);\n\n this.negotiateThrottled = throttle(this.negotiate.bind(this), 0, false);\n }\n\n public createPeerConnection() {\n return this.connection || super.createPeerConnection({\n iceServers: [],\n iceTransportPolicy: 'all',\n bundlePolicy: 'max-bundle',\n rtcpMuxPolicy: 'require',\n iceCandidatePoolSize: 0\n // sdpSemantics: \"unified-plan\",\n // extmapAllowMixed: true,\n });\n }\n\n public createDataChannel() {\n if(this.dataChannel) {\n return this.dataChannel;\n }\n\n const dataChannel = super.createDataChannel();\n\n dataChannel.addEventListener('open', () => {\n this.maybeUpdateRemoteVideoConstraints();\n });\n\n dataChannel.addEventListener('close', () => {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n });\n\n return dataChannel;\n }\n\n public createDescription() {\n if(this.description) {\n return this.description;\n }\n\n const description = super.createDescription();\n\n /* const perType = 0;\n const types = ['audio' as const, 'video' as const];\n const count = types.length * perType;\n const init: RTCRtpTransceiverInit = {direction: 'recvonly'};\n types.forEach((type) => {\n for(let i = 0; i < perType; ++i) {\n description.createEntry(type).createTransceiver(connection, init);\n }\n }); */\n\n return description;\n }\n\n public appendStreamToConference() {\n super.appendStreamToConference();/* .then(() => {\n currentGroupCall.connections.main.negotiating = false;\n this.startNegotiation({\n type: type,\n isMuted: muted,\n rejoin\n });\n }); */\n }\n\n private async invokeJoinGroupCall(localSdp: SDP, mainChannels: SDPMediaSection[], options: GroupCallConnectionInstance['options']) {\n const {groupCall, description} = this;\n const groupCallId = groupCall.id;\n\n const processedChannels = mainChannels.map((section) => {\n const processed = processMediaSection(localSdp, section);\n\n this.sources[processed.entry.type as 'video' | 'audio'] = processed.entry;\n\n return processed;\n });\n\n const audioChannel = processedChannels.find((channel) => channel.media.mediaType === 'audio');\n const videoChannel = processedChannels.find((channel) => channel.media.mediaType === 'video');\n let {source, params} = audioChannel || {};\n const useChannel = videoChannel || audioChannel;\n\n const channels: {[type in WebRTCLineType]?: typeof audioChannel} = {\n audio: audioChannel,\n video: videoChannel\n };\n\n description.entries.forEach((entry) => {\n if(entry.direction === 'sendonly') {\n const channel = channels[entry.type];\n if(!channel) return;\n\n description.setEntrySource(entry, channel.sourceGroups || channel.source);\n description.setEntryPeerId(entry, rootScope.myId);\n }\n });\n\n // overwrite ssrc with audio in video params\n if(params !== useChannel.params) {\n const data: JoinGroupCallJsonPayload = JSON.parse(useChannel.params.data);\n // data.ssrc = source || data.ssrc - 1; // audio channel can be missed in screensharing\n if(source) data.ssrc = source;\n else delete data.ssrc;\n params = {\n _: 'dataJSON',\n data: JSON.stringify(data)\n };\n }\n\n const update = await this.managers.appGroupCallsManager.joinGroupCall(groupCallId, params, options);\n\n const data: UpdateGroupCallConnectionData = JSON.parse(update.params.data);\n\n data.audio = data.audio || groupCall.connections.main.description.audio;\n description.setData(data);\n filterServerCodecs(mainChannels, data);\n\n return data;\n }\n\n protected async negotiateInternal() {\n const {connection, description} = this;\n const isNewConnection = connection.iceConnectionState === 'new' && !description.getEntryByMid('0').source;\n const log = this.log.bindPrefix('startNegotiation');\n log('start');\n\n const originalOffer = await connection.createOffer({iceRestart: false});\n\n if(isNewConnection && this.dataChannel) {\n const dataChannelEntry = description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n }\n\n const {sdp: localSdp, offer} = fixLocalOffer({\n offer: originalOffer,\n data: description\n });\n\n log('[sdp] setLocalDescription', offer.sdp);\n await connection.setLocalDescription(offer);\n\n const mainChannels = localSdp.media.filter((media) => {\n return media.mediaType !== 'application' && media.isSending;\n });\n\n if(isNewConnection) {\n try {\n await this.invokeJoinGroupCall(localSdp, mainChannels, this.options);\n } catch(e) {\n this.log.error('[tdweb] joinGroupCall error', e);\n }\n }\n\n /* if(!data) {\n log('abort 0');\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n\n /* if(connection.iceConnectionState !== 'new') {\n log(`abort 1 connectionState=${connection.iceConnectionState}`);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n /* if(this.currentGroupCall !== currentGroupCall || connectionHandler.connection !== connection) {\n log('abort', this.currentGroupCall, currentGroupCall);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n\n const isAnswer = true;\n // const _bundleMids = bundleMids.slice();\n const entriesToDelete: ConferenceEntry[] = [];\n const bundle = localSdp.bundle;\n forEachReverse(bundle, (mid, idx, arr) => {\n const entry = description.getEntryByMid(mid);\n if(entry.shouldBeSkipped(isAnswer)) {\n arr.splice(idx, 1);\n entriesToDelete.push(entry);\n }\n });\n\n /* forEachReverse(description.entries, (entry, idx, arr) => {\n const mediaSection = _parsedSdp.media.find((section) => section.oa.get('mid').oa === entry.mid);\n const deleted = !mediaSection;\n // const deleted = !_bundleMids.includes(entry.mid); // ! can't use it because certain mid can be missed in bundle\n if(deleted) {\n arr.splice(idx, 1);\n }\n }); */\n\n const entries = localSdp.media.map((section) => {\n const mid = section.mid;\n let entry = description.getEntryByMid(mid);\n if(!entry) {\n entry = new ConferenceEntry(mid, section.mediaType);\n entry.setDirection('inactive');\n }\n\n return entry;\n });\n\n const answerDescription: RTCSessionDescriptionInit = {\n type: 'answer',\n sdp: description.generateSdp({\n bundle,\n entries,\n isAnswer\n })\n };\n\n entriesToDelete.forEach((entry) => {\n description.deleteEntry(entry);\n });\n\n log(`[sdp] setRemoteDescription signaling=${connection.signalingState} ice=${connection.iceConnectionState} gathering=${connection.iceGatheringState} connection=${connection.connectionState}`, answerDescription.sdp);\n await connection.setRemoteDescription(answerDescription);\n\n log('end');\n }\n\n public negotiate() {\n let promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n promise = super.negotiate();\n\n if(this.updateConstraints) {\n promise.then(() => {\n this.maybeUpdateRemoteVideoConstraints();\n this.updateConstraints = false;\n });\n }\n\n if(this.options.type === 'presentation') {\n promise.then(() => {\n this.connection.getTransceivers().find((transceiver) => {\n if(transceiver.sender?.track?.kind === 'video') {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n }\n });\n });\n }\n\n return promise;\n }\n\n public maybeUpdateRemoteVideoConstraints() {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.log('maybeUpdateRemoteVideoConstraints');\n\n // * https://github.com/TelegramMessenger/tgcalls/blob/6f2746e04c9b040f8c8dfc64d916a1853d09c4ce/tgcalls/group/GroupInstanceCustomImpl.cpp#L2549\n type VideoConstraints = {minHeight?: number, maxHeight: number};\n const obj: {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {[endpoint: string]: VideoConstraints},\n defaultConstraints: VideoConstraints,\n onStageEndpoints: string[]\n } = {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {},\n defaultConstraints: {maxHeight: 0},\n onStageEndpoints: []\n };\n\n for(const entry of this.description.entries) {\n if(entry.direction !== 'recvonly' || entry.type !== 'video') {\n continue;\n }\n\n const {endpoint} = entry;\n obj.onStageEndpoints.push(endpoint);\n obj.constraints[endpoint] = {\n minHeight: 180,\n maxHeight: 720\n };\n }\n\n this.sendDataChannelData(obj);\n\n if(!obj.onStageEndpoints.length) {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n } else if(!this.updateConstraintsInterval) {\n this.updateConstraintsInterval = window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this), 5000);\n }\n }\n\n public addInputVideoStream(stream: MediaStream) {\n // const {sources} = this;\n // if(sources?.video) {\n // const source = this.sources.video.source;\n // stream.source = '' + source;\n this.groupCall.saveInputVideoStream(stream, this.type);\n // }\n\n this.streamManager.addStream(stream, 'input');\n this.appendStreamToConference(); // replace sender track\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {DataJSON} from '../../../layer';\nimport {JoinGroupCallJsonPayload} from '../../appManagers/appGroupCallsManager';\nimport SDP from '../sdp';\nimport {Ssrc} from '../types';\nimport parseMediaSectionInfo from './parseMediaSectionInfo';\n\nexport default function processMediaSection(sdp: SDP, media: SDP['media'][0]) {\n const sectionInfo = parseMediaSectionInfo(sdp, media);\n\n const mediaType: Exclude = media.mediaType as any;\n const entry: Ssrc = {\n source: sectionInfo.source,\n sourceGroups: sectionInfo.sourceGroups,\n type: mediaType\n };\n\n // do not change this value, otherwise onconnectionstatechange won't fire\n sectionInfo.fingerprint.setup = 'active';\n const payload: JoinGroupCallJsonPayload = {\n 'fingerprints': [sectionInfo.fingerprint],\n 'pwd': sectionInfo.pwd,\n 'ssrc': sectionInfo.source,\n 'ssrc-groups': sectionInfo.sourceGroups || [],\n 'ufrag': sectionInfo.ufrag\n };\n const paramsDataJson = JSON.stringify(payload);\n\n const params: DataJSON = {\n _: 'dataJSON',\n data: paramsDataJson\n };\n\n return {\n params,\n source: sectionInfo.source,\n media,\n sourceGroups: sectionInfo.sourceGroups,\n entry\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport SDPMediaSection from '../sdp/mediaSection';\nimport {UpdateGroupCallConnectionData, Codec} from '../types';\n\nexport default function filterServerCodecs(mainChannels: SDPMediaSection[], data: UpdateGroupCallConnectionData) {\n // ! Need to filter server's extmap for Firefox\n const performExtmap = (channel: typeof mainChannels[0]) => {\n const out: {[id: string]: string} = {};\n const extmap = channel.attributes.get('extmap');\n extmap.forEach((extmap) => {\n const id = extmap.key.split('/', 1)[0];\n out[id] = extmap.value;\n });\n\n return out;\n };\n\n const codecsToPerform: [Codec, 'audio' | 'video'][] = /* flatten([data, dataPresentation].filter(Boolean).map((data) => {\n return */['audio' as const, 'video' as const].filter((type) => data[type]).map((type) => ([data[type], type]));\n // }));\n\n codecsToPerform.forEach(([codec, type]) => {\n const channel = mainChannels.find((line) => line.mediaType === type);\n if(!channel) {\n return;\n }\n\n const extmap = performExtmap(channel);\n forEachReverse(codec['rtp-hdrexts'], (value, index, arr) => {\n if(extmap[value.id] !== value.uri) {\n arr.splice(index, 1);\n console.log(`[sdp] filtered extmap:`, value, index, type);\n }\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport copy from '../../../helpers/object/copy';\nimport {ConferenceEntry} from '../localConferenceDescription';\nimport {parseSdp, addSimulcast} from '../sdp/utils';\nimport {generateMediaFirstLine, SDPBuilder} from '../sdpBuilder';\nimport {UpdateGroupCallConnectionData} from '../types';\nimport parseMediaSectionInfo from './parseMediaSectionInfo';\n\nexport default function fixLocalOffer(options: {\n offer: RTCSessionDescriptionInit,\n data: UpdateGroupCallConnectionData,\n skipAddingMulticast?: boolean\n // mids?: string[]\n}) {\n const {offer, data} = options;\n const sdp = parseSdp(offer.sdp);\n let hasMunged = false;\n\n if(!options.skipAddingMulticast) {\n hasMunged = addSimulcast(sdp) || hasMunged;\n }\n\n // const bundleLine = parsedSdp.session.lines.find((line) => line.Ha?.key === 'group');\n // const bundleMids = bundleLine.value.split(' ').slice(1);\n\n forEachReverse(sdp.media, (section, idx, arr) => {\n // const mid = section.oa.get('mid').oa;\n\n // это может случиться при выключении и включении видео. почему-то появится секция уже удалённая\n // ! нельзя тут модифицировать локальное описание, будет критовать\n /* if(mids && !mids.includes(mid) && !bundleMids.includes(mid)) {\n console.error('wtf');\n hasMunged = true;\n arr.splice(idx, 1);\n return;\n } */\n\n if(/* section.mediaType !== 'video' || */section.isSending) {\n return;\n }\n\n if(section.mediaType === 'application') {\n return;\n }\n\n const mediaLine = section.mediaLine;\n const mediaLineParts = mediaLine.mediaLineParts;\n const mediaCodecIds = mediaLineParts.ids;\n const localMLine = mediaLine.toString();\n\n const codec = data[section.mediaType];\n const payloadTypes = codec['payload-types'];\n\n /* forEachReverse(payloadTypes, (payloadType, idx, arr) => {\n if(!mediaCodecIds.includes('' + payloadType.id) && section.mediaType === 'video') {\n // if(payloadType.name === 'H265') {\n console.warn('[sdp] filtered unsupported codec', payloadType, mediaCodecIds, section.mediaType);\n arr.splice(idx, 1);\n }\n }); */\n\n const codecIds = payloadTypes.map((payload) => '' + payload.id);\n const correctMLine = generateMediaFirstLine(section.mediaType, undefined, codecIds);\n\n if(localMLine !== correctMLine) {\n const sectionInfo = parseMediaSectionInfo(sdp, section);\n\n const newData = {...data};\n newData.transport = copy(newData.transport);\n newData.transport.ufrag = sectionInfo.ufrag;\n newData.transport.pwd = sectionInfo.pwd;\n newData.transport.fingerprints = [sectionInfo.fingerprint];\n newData.transport.candidates = [];\n\n const entry = new ConferenceEntry(sectionInfo.mid, mediaLineParts.type);\n entry.setPort(mediaLineParts.port);\n sectionInfo.source && entry.setSource(sectionInfo.sourceGroups || sectionInfo.source);\n entry.setDirection(section.direction);\n\n const newSdp = new SDPBuilder().addSsrcEntry(entry, newData).finalize();\n\n const newChannel = parseSdp(newSdp).media[0];\n arr[idx] = newChannel;\n\n hasMunged = true;\n }\n });\n\n if(hasMunged) {\n const mungedSdp = sdp.toString();\n offer.sdp = mungedSdp;\n }\n\n return {offer, sdp/* , bundleMids */};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {GroupCallConnectionType, GroupCallId, GroupCallOutputSource} from '../appManagers/appGroupCallsManager';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {GroupCall, GroupCallParticipant} from '../../layer';\nimport {logger} from '../logger';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport rootScope from '../rootScope';\nimport CallInstanceBase, {TryAddTrackOptions} from './callInstanceBase';\nimport GroupCallConnectionInstance from './groupCallConnectionInstance';\nimport GROUP_CALL_STATE from './groupCallState';\nimport getScreenConstraints from './helpers/getScreenConstraints';\nimport getScreenStream from './helpers/getScreenStream';\nimport getStream from './helpers/getStream';\nimport getVideoConstraints from './helpers/getVideoConstraints';\nimport stopTrack from './helpers/stopTrack';\nimport localConferenceDescription from './localConferenceDescription';\nimport {WebRTCLineType} from './sdpBuilder';\nimport StreamManager from './streamManager';\nimport {Ssrc} from './types';\nimport getPeerId from '../appManagers/utils/peers/getPeerId';\nimport {AppManagers} from '../appManagers/managers';\nimport {generateSelfVideo, makeSsrcFromParticipant, makeSsrcsFromParticipant} from './groupCallsController';\n\nexport default class GroupCallInstance extends CallInstanceBase<{\n state: (state: GROUP_CALL_STATE) => void,\n pinned: (source?: GroupCallOutputSource) => void,\n}> {\n public id: GroupCallId;\n public chatId: ChatId;\n public handleUpdateGroupCallParticipants: boolean;\n public updatingSdp: boolean;\n public isSpeakingMap: Map;\n public connections: {[k in GroupCallConnectionType]?: GroupCallConnectionInstance};\n public groupCall: GroupCall;\n public participant: GroupCallParticipant;\n\n // will be set with negotiation\n public joined: boolean;\n\n private pinnedSources: Array;\n private participantsSsrcs: Map;\n private hadAutoPinnedSources: Set;\n private dispatchPinnedThrottled: () => void;\n private startVideoSharingPromise: Promise;\n private startScreenSharingPromise: Promise;\n\n private managers: AppManagers;\n\n constructor(options: {\n id: GroupCallInstance['id'],\n chatId: GroupCallInstance['chatId'],\n isSpeakingMap?: GroupCallInstance['isSpeakingMap'],\n connections?: GroupCallInstance['connections'],\n managers: AppManagers\n }) {\n super();\n\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = logger('GROUP-CALL');\n }\n\n if(!this.connections) {\n this.connections = {};\n }\n\n if(!this.isSpeakingMap) {\n this.isSpeakingMap = new Map();\n }\n\n this.pinnedSources = [];\n this.participantsSsrcs = new Map();\n this.hadAutoPinnedSources = new Set();\n this.dispatchPinnedThrottled = throttle(() => {\n this.dispatchEvent('pinned', this.pinnedSource);\n }, 0, false);\n\n this.addEventListener('state', (state) => {\n if(state === GROUP_CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n }\n\n get connectionState() {\n return this.connections.main.connection.iceConnectionState;\n }\n\n get state() {\n const {connectionState} = this;\n if(connectionState === 'closed') {\n return GROUP_CALL_STATE.CLOSED;\n } else if(connectionState !== 'connected' && (!IS_SAFARI || connectionState !== 'completed')) {\n return GROUP_CALL_STATE.CONNECTING;\n } else {\n const {participant} = this;\n if(!participant.pFlags.can_self_unmute) {\n return GROUP_CALL_STATE.MUTED_BY_ADMIN;\n } else if(participant.pFlags.muted) {\n return GROUP_CALL_STATE.MUTED;\n } else {\n return GROUP_CALL_STATE.UNMUTED;\n }\n }\n }\n\n get participants() {\n return this.managers.appGroupCallsManager.getCachedParticipants(this.id);\n }\n\n get isSharingScreen() {\n return !!this.connections.presentation;\n }\n\n get pinnedSource() {\n return this.pinnedSources[this.pinnedSources.length - 1];\n }\n\n public get isMuted() {\n return this.state !== GROUP_CALL_STATE.UNMUTED;\n }\n\n public get isClosing() {\n const {state} = this;\n return state === GROUP_CALL_STATE.CLOSED;\n }\n\n public get streamManager(): StreamManager {\n return this.connections.main.streamManager;\n }\n\n public get description(): localConferenceDescription {\n return this.connections.main.description;\n }\n\n public pinSource(source: GroupCallOutputSource) {\n indexOfAndSplice(this.pinnedSources, source);\n this.pinnedSources.push(source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinSource(source: GroupCallOutputSource) {\n this.hadAutoPinnedSources.delete(source);\n indexOfAndSplice(this.pinnedSources, source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinAll() {\n this.pinnedSources.length = 0;\n this.dispatchPinnedThrottled();\n }\n\n public async getParticipantByPeerId(peerId: PeerId) {\n return NULL_PEER_ID === peerId ? this.participant : (await this.participants).get(peerId);\n }\n\n public toggleMuted() {\n return this.requestAudioSource(true).then(() => this.changeUserMuted(NULL_PEER_ID));\n }\n\n public async changeUserMuted(peerId: PeerId, muted?: boolean) {\n const participant = await this.getParticipantByPeerId(peerId);\n if(NULL_PEER_ID === peerId && participant.pFlags.can_self_unmute) {\n muted = muted === undefined ? !participant.pFlags.muted : muted;\n }\n\n return this.editParticipant(participant, {muted});\n }\n\n public getElement(endpoint: GroupCallOutputSource) {\n return super.getElement(endpoint);\n }\n\n public getVideoElementFromParticipantByType(participant: GroupCallParticipant, type: 'video' | 'presentation') {\n let source: GroupCallOutputSource;\n if(participant.pFlags.self) {\n const connectionType: GroupCallConnectionType = type === 'video' ? 'main' : 'presentation';\n source = connectionType;\n } else {\n const codec = participant[type];\n source = codec.source_groups[0].sources[0];\n }\n\n const element = this.getElement(source) as HTMLVideoElement;\n if(!element) return;\n\n const clone = element.cloneNode() as typeof element;\n clone.srcObject = element.srcObject;\n return {video: clone, source};\n }\n\n public createConnectionInstance(options: {\n streamManager: StreamManager,\n type: GroupCallConnectionType,\n options: GroupCallConnectionInstance['options'],\n }) {\n return this.connections[options.type] = new GroupCallConnectionInstance({\n groupCall: this,\n log: this.log.bindPrefix(options.type),\n managers: this.managers,\n ...options\n });\n }\n\n public changeRaiseHand(raise: boolean) {\n return this.editParticipant(this.participant, {raiseHand: raise});\n }\n\n public async startScreenSharingInternal() {\n try {\n const type: GroupCallConnectionType = 'presentation';\n\n const stream = await getScreenStream(getScreenConstraints());\n const streamManager = new StreamManager();\n\n const connectionInstance = this.createConnectionInstance({\n streamManager,\n type,\n options: {\n type\n }\n });\n\n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n stream.getVideoTracks()[0].addEventListener('ended', () => {\n if(this.connections.presentation) { // maybe user has stopped screensharing through browser's ui\n this.stopScreenSharing();\n }\n }, {once: true});\n\n connectionInstance.createDescription();\n connectionInstance.addInputVideoStream(stream);\n } catch(err) {\n this.log.error('start screen sharing error', err);\n }\n }\n\n public startScreenSharing() {\n return this.startScreenSharingPromise ??= this.startScreenSharingInternal().finally(() => {\n this.startScreenSharingPromise = undefined;\n });\n }\n\n public stopScreenSharing() {\n const connectionInstance = this.connections.presentation;\n if(!connectionInstance) {\n return Promise.resolve();\n }\n\n delete this.connections.presentation;\n this.unpinSource('presentation');\n connectionInstance.closeConnectionAndStream(true);\n\n delete this.participant.presentation;\n this.managers.appGroupCallsManager.saveApiParticipant(this.id, this.participant);\n\n return this.managers.appGroupCallsManager.leaveGroupCallPresentation(this.id);\n }\n\n public toggleScreenSharing() {\n if(this.isSharingScreen) {\n return this.stopScreenSharing();\n } else {\n return this.startScreenSharing();\n }\n }\n\n public async startVideoSharingInternal() {\n const constraints: MediaStreamConstraints = {\n video: getVideoConstraints()\n };\n\n try {\n const stream = await getStream(constraints, false);\n const connectionInstance = this.connections.main;\n connectionInstance.addInputVideoStream(stream);\n\n await this.editParticipant(this.participant, {\n videoPaused: false,\n videoStopped: false\n });\n } catch(err) {\n this.log.error('startVideoSharing error', err, constraints);\n }\n }\n\n public startVideoSharing() {\n return this.startVideoSharingPromise ??= this.startVideoSharingInternal().finally(() => {\n this.startVideoSharingPromise = undefined;\n });\n }\n\n public async stopVideoSharing() {\n const connectionInstance = this.connections.main;\n const track = connectionInstance.streamManager.inputStream.getVideoTracks()[0];\n if(!track) {\n return;\n }\n\n stopTrack(track);\n connectionInstance.streamManager.appendToConference(connectionInstance.description); // clear sender track\n\n await this.editParticipant(this.participant, {\n videoStopped: true\n });\n }\n\n public toggleVideoSharing() {\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharing();\n }\n }\n\n public async hangUp(discard = false, rejoin = false, isDiscarded = false) {\n for(const type in this.connections) {\n const connection = this.connections[type as GroupCallConnectionType];\n connection.closeConnectionAndStream(!rejoin);\n }\n\n this.dispatchEvent('state', this.state);\n\n if(isDiscarded) {\n return;\n }\n\n if(!rejoin) {\n const d = discard || (this.joined ? this.connections.main.sources.audio.source : undefined);\n this.managers.appGroupCallsManager.hangUp(this.id, d);\n }\n }\n\n public tryAddTrack(options: Omit) {\n const {description} = this;\n const source = super.tryAddTrack(options);\n\n if(options.type === 'output') {\n const entry = description.getEntryBySource(+source);\n this.getParticipantByPeerId(entry.peerId).then((participant) => {\n if(participant) {\n rootScope.dispatchEvent('group_call_participant', {groupCallId: this.id, participant});\n }\n });\n }\n\n return source;\n }\n\n public async editParticipant(participant: GroupCallParticipant, options: Partial<{\n muted: boolean,\n volume: number,\n raiseHand: boolean,\n videoStopped: boolean,\n videoPaused: boolean,\n presentationPaused: boolean\n }>) {\n if(!Object.keys(options).length) {\n return;\n }\n\n // let processUpdate = true;\n if(participant) {\n // const {currentGroupCall} = this;\n // const isCurrentCall = currentGroupCall?.id === groupCallId;\n const isCurrentCall = true;\n const isUpdatingMeInCurrentCall = isCurrentCall && participant.pFlags.self;\n\n if(isUpdatingMeInCurrentCall) {\n if(options.muted !== undefined && !this.isSharingAudio) {\n delete options.muted;\n\n if(!Object.keys(options).length) {\n return;\n }\n }\n }\n\n // if(isCurrentCall) {\n const muted = options.muted;\n if(muted !== undefined) {\n /* const isAdmin = appChatsManager.hasRights(currentGroupCall.chatId, 'manage_call');\n if(isAdmin) {\n if(muted) {\n participant.pFlags.muted = true;\n delete participant.pFlags.can_self_unmute;\n } else {\n participant.pFlags.can_self_unmute = true;\n }\n } else */if(participant.pFlags.self) {\n if(muted) {\n participant.pFlags.muted = true;\n } else if(participant.pFlags.can_self_unmute) {\n delete participant.pFlags.muted;\n }\n }/* else {\n if(muted) {\n participant.pFlags.muted_by_you = true;\n } else {\n delete participant.pFlags.muted_by_you;\n }\n } */\n }\n // }\n\n /* const a: [keyof GroupCallParticipant['pFlags'], keyof typeof options][] = [\n ['muted', 'muted']\n ];\n\n a.forEach(([key, optionKey]) => {\n const value = options[optionKey];\n if(value === undefined) {\n return;\n }\n\n if(value) {\n participant.pFlags[key] = true;\n } else {\n delete participant.pFlags[key];\n }\n }); */\n\n if(options.raiseHand !== undefined) {\n if(options.raiseHand) participant.raise_hand_rating = '1';\n else delete participant.raise_hand_rating;\n }\n\n if(isUpdatingMeInCurrentCall) {\n if(options.videoStopped !== undefined) {\n if(options.videoStopped) delete participant.video;\n else participant.video = generateSelfVideo(this.connections.main.sources.video);\n }\n\n if(!participant.pFlags.muted && participant.pFlags.can_self_unmute) {\n this.setMuted(false);\n }\n\n this.dispatchEvent('state', this.state);\n }\n\n // rootScope.dispatchEvent('group_call_participant', {groupCallId, participant});\n\n /* if(participant.pFlags.self) {\n processUpdate = false;\n } */\n }\n\n return this.managers.appGroupCallsManager.editParticipant(this.id, participant, options);\n }\n\n public onParticipantUpdate(participant: GroupCallParticipant, doNotDispatchParticipantUpdate?: PeerId) {\n const connectionInstance = this.connections.main;\n const {connection, description} = connectionInstance;\n\n const peerId = getPeerId(participant.peer);\n const hasLeft = !!participant.pFlags.left;\n const oldSsrcs = this.participantsSsrcs.get(peerId) || [];\n\n if(participant.presentation && !hasLeft) {\n const {source} = makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint);\n if(!this.hadAutoPinnedSources.has(source)) {\n this.hadAutoPinnedSources.add(source);\n this.pinSource(participant.pFlags.self ? 'presentation' : source);\n }\n }\n\n if(participant.pFlags.self) {\n this.participant = participant;\n\n if(connectionInstance.sources.audio.source !== participant.source) {\n this.hangUp();\n }\n\n let mute = false;\n if(!participant.pFlags.can_self_unmute) {\n this.stopScreenSharing();\n this.stopVideoSharing();\n mute = true;\n } else if(participant.pFlags.muted) {\n mute = true;\n }\n\n if(mute) {\n this.setMuted(true);\n }\n\n if(doNotDispatchParticipantUpdate !== peerId) {\n this.dispatchEvent('state', this.state);\n }\n\n return;\n }\n\n const ssrcs = hasLeft ? [] : makeSsrcsFromParticipant(participant);\n\n if(!hasLeft) {\n this.participantsSsrcs.set(peerId, ssrcs);\n } else {\n this.participantsSsrcs.delete(peerId);\n }\n\n // const TEST_OLD = false;\n\n const modifiedTypes: Set = new Set();\n oldSsrcs.forEach((oldSsrc) => {\n const oldSource = oldSsrc.source;\n const newSsrc = ssrcs.find((ssrc) => ssrc.source === oldSource);\n if(!newSsrc) {\n this.unpinSource(oldSource);\n\n const oldEntry = description.getEntryBySource(oldSource);\n if(oldEntry && oldEntry.direction !== 'inactive') {\n oldEntry.setDirection('inactive');\n modifiedTypes.add(oldEntry.type);\n }\n }\n });\n\n ssrcs.forEach((ssrc) => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n if(entry.direction === 'inactive') {\n entry.setDirection(entry.originalDirection);\n modifiedTypes.add(entry.type);\n }\n\n return;\n }\n\n entry = description.createEntry(ssrc.type);\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n description.setEntryPeerId(entry, peerId);\n\n // if(TEST_OLD) {\n // description.bundleMids.push(entry.mid);\n // entry.setDirection('recvonly');\n // } else {\n ssrc.type === 'video' && entry.setEndpoint(ssrc.endpoint);\n entry.createTransceiver(connection, {direction: 'recvonly'});\n // }\n\n modifiedTypes.add(entry.type);\n });\n\n /* if(TEST_OLD) {\n this.setRemoteOffer({\n connection,\n description,\n ssrcs\n });\n } else */if(modifiedTypes.size) {\n if(modifiedTypes.has('video')) {\n connectionInstance.updateConstraints = true;\n }\n\n connectionInstance.negotiateThrottled();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nenum GROUP_CALL_STATE {\n UNMUTED,\n MUTED,\n MUTED_BY_ADMIN,\n CONNECTING,\n CLOSED\n}\n\nexport default GROUP_CALL_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\n\nexport type GroupCallAudioAssetName = 'group_call_connect.mp3' | 'group_call_end.mp3' | 'group_call_start.mp3' | 'voip_onallowtalk.mp3';\n\nlet audioAsset: AudioAssetPlayer;\nexport default function getGroupCallAudioAsset() {\n return audioAsset ??= new AudioAssetPlayer([\n 'group_call_connect.mp3',\n 'group_call_end.mp3',\n 'group_call_start.mp3',\n 'voip_onallowtalk.mp3'\n ]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getGroupCallAudioAsset from '../../components/groupCall/getAudioAsset';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {GroupCallParticipant, GroupCallParticipantVideo, GroupCallParticipantVideoSourceGroup} from '../../layer';\nimport {GroupCallId, GroupCallConnectionType} from '../appManagers/appGroupCallsManager';\nimport {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport GroupCallInstance from './groupCallInstance';\nimport GROUP_CALL_STATE from './groupCallState';\nimport createMainStreamManager from './helpers/createMainStreamManager';\nimport {generateSsrc} from './localConferenceDescription';\nimport {WebRTCLineType} from './sdpBuilder';\nimport StreamManager from './streamManager';\nimport {Ssrc} from './types';\n\nconst IS_MUTED = true;\n\nexport function makeSsrcsFromParticipant(participant: GroupCallParticipant) {\n return [\n makeSsrcFromParticipant(participant, 'audio', participant.source),\n participant.video?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.video.audio_source),\n participant.video && makeSsrcFromParticipant(participant, 'video', participant.video.source_groups, participant.video.endpoint),\n participant.presentation?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.presentation.audio_source),\n participant.presentation && makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint)\n ].filter(Boolean);\n};\n\nexport function makeSsrcFromParticipant(participant: GroupCallParticipant, type: WebRTCLineType, source?: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n return generateSsrc(type, source, endpoint);\n}\n\nexport function generateSelfVideo(source: Ssrc, audioSource?: number): GroupCallParticipantVideo {\n return source && {\n _: 'groupCallParticipantVideo',\n pFlags: {},\n endpoint: '',\n source_groups: source.sourceGroups,\n audio_source: audioSource\n };\n}\n\nexport class GroupCallsController extends EventListenerBase<{\n instance: (instance: GroupCallInstance) => void\n}> {\n private audioAsset: ReturnType;\n private log: ReturnType;\n private currentGroupCall: GroupCallInstance;\n private managers: AppManagers;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n this.audioAsset = getGroupCallAudioAsset();\n this.log = logger('GCC');\n\n rootScope.addEventListener('group_call_update', (groupCall) => {\n const {currentGroupCall} = this;\n if(currentGroupCall?.id === groupCall.id) {\n currentGroupCall.groupCall = groupCall;\n\n if(groupCall._ === 'groupCallDiscarded') {\n currentGroupCall.hangUp(false, false, true);\n }\n }\n });\n\n rootScope.addEventListener('group_call_participant', ({groupCallId, participant}) => {\n const {currentGroupCall} = this;\n if(currentGroupCall?.id === groupCallId) {\n currentGroupCall.onParticipantUpdate(participant/* , this.doNotDispatchParticipantUpdate */);\n }\n });\n }\n\n get groupCall() {\n return this.currentGroupCall;\n }\n\n public setCurrentGroupCall(groupCall: GroupCallInstance) {\n this.currentGroupCall = groupCall;\n\n if(groupCall) {\n this.dispatchEvent('instance', groupCall);\n }\n }\n\n public startConnectingSound() {\n this.stopConnectingSound();\n this.audioAsset.playSoundWithTimeout('group_call_connect.mp3', true, 2500);\n }\n\n public stopConnectingSound() {\n this.audioAsset.stopSound();\n this.audioAsset.cancelDelayedPlay();\n }\n\n public async joinGroupCall(chatId: ChatId, groupCallId: GroupCallId, muted = IS_MUTED, rejoin?: boolean, joinVideo?: boolean) {\n this.audioAsset.createAudio();\n\n this.log(`joinGroupCall chatId=${chatId} id=${groupCallId} muted=${muted} rejoin=${rejoin}`);\n\n let streamManager: StreamManager;\n if(rejoin) {\n streamManager = this.currentGroupCall.connections.main.streamManager;\n } else {\n streamManager = await createMainStreamManager(muted, joinVideo);\n }\n\n return this.joinGroupCallInternal(chatId, groupCallId, streamManager, muted, rejoin, joinVideo)\n .then(() => {\n // have to refresh participants because of the new connection\n const {currentGroupCall} = this;\n currentGroupCall.participants.then((participants) => {\n if(this.currentGroupCall !== currentGroupCall || currentGroupCall.state === GROUP_CALL_STATE.CLOSED) {\n return;\n }\n\n participants.forEach((participant) => {\n if(!participant.pFlags.self) {\n currentGroupCall.onParticipantUpdate(participant);\n }\n });\n });\n });\n }\n\n private async joinGroupCallInternal(chatId: ChatId, groupCallId: GroupCallId, streamManager: StreamManager, muted: boolean, rejoin = false, joinVideo?: boolean) {\n const log = this.log.bindPrefix('joinGroupCallInternal');\n log('start', groupCallId);\n\n const type: GroupCallConnectionType = 'main';\n\n let {currentGroupCall} = this;\n if(currentGroupCall && rejoin) {\n // currentGroupCall.connections.main.connection = connection;\n currentGroupCall.handleUpdateGroupCallParticipants = false;\n currentGroupCall.updatingSdp = false;\n log('update currentGroupCall', groupCallId, currentGroupCall);\n } else {\n currentGroupCall = new GroupCallInstance({\n chatId,\n id: groupCallId,\n managers: this.managers\n });\n\n currentGroupCall.fixSafariAudio();\n\n currentGroupCall.addEventListener('state', (state) => {\n if(this.currentGroupCall === currentGroupCall && state === GROUP_CALL_STATE.CLOSED) {\n this.setCurrentGroupCall(null);\n this.stopConnectingSound();\n this.audioAsset.playSound('group_call_end.mp3');\n rootScope.dispatchEvent('chat_update', currentGroupCall.chatId);\n }\n });\n\n currentGroupCall.groupCall = await this.managers.appGroupCallsManager.getGroupCallFull(groupCallId);\n\n const connectionInstance = currentGroupCall.createConnectionInstance({\n streamManager,\n type,\n options: {\n type,\n isMuted: muted,\n joinVideo,\n rejoin\n }\n });\n\n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n currentGroupCall.onTrack(event);\n });\n\n connection.addEventListener('iceconnectionstatechange', () => {\n currentGroupCall.dispatchEvent('state', currentGroupCall.state);\n\n const {iceConnectionState} = connection;\n if(iceConnectionState === 'disconnected' || iceConnectionState === 'checking' || iceConnectionState === 'new') {\n this.startConnectingSound();\n } else {\n this.stopConnectingSound();\n }\n\n switch(iceConnectionState) {\n case 'checking': {\n break;\n }\n\n case 'closed': {\n currentGroupCall.hangUp();\n break;\n }\n\n case 'completed': {\n break;\n }\n\n case 'connected': {\n if(!currentGroupCall.joined) {\n currentGroupCall.joined = true;\n this.audioAsset.playSound('group_call_start.mp3');\n this.managers.appGroupCallsManager.getGroupCallParticipants(groupCallId);\n }\n\n break;\n }\n\n case 'disconnected': {\n break;\n }\n\n case 'failed': {\n // TODO: replace with ICE restart\n currentGroupCall.hangUp();\n // connection.restartIce();\n break;\n }\n\n case 'new': {\n break;\n }\n }\n });\n\n connectionInstance.createDescription();\n connectionInstance.createDataChannel();\n\n connectionInstance.appendStreamToConference();\n\n this.setCurrentGroupCall(currentGroupCall);\n log('set currentGroupCall', groupCallId, currentGroupCall);\n\n this.startConnectingSound();\n\n return connectionInstance.negotiate();\n }\n }\n}\n\nconst groupCallsController = new GroupCallsController();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.groupCallController = groupCallsController);\nexport default groupCallsController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS} from '../constants';\nimport StreamManager from '../streamManager';\nimport getAudioConstraints from './getAudioConstraints';\nimport getStream from './getStream';\nimport getVideoConstraints from './getVideoConstraints';\n\nexport default async function createMainStreamManager(muted?: boolean, joinVideo?: boolean) {\n const constraints: MediaStreamConstraints = {\n audio: getAudioConstraints(),\n video: joinVideo && getVideoConstraints()\n };\n\n const streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n\n try {\n const stream = await getStream(constraints, muted);\n streamManager.addStream(stream, 'input');\n } catch(err) {\n console.error('joinGroupCall getStream error', err, constraints);\n streamManager.inputStream = new MediaStream();\n }\n\n return streamManager;\n}\n","import constraintSupported, {MyMediaTrackSupportedConstraints} from '../../../environment/constraintSupport';\n\nexport default function getAudioConstraints(): MediaTrackConstraints {\n const constraints: MediaTrackConstraints = {\n channelCount: 2\n };\n\n const desirable: (keyof MyMediaTrackSupportedConstraints)[] = [\n 'noiseSuppression',\n 'echoCancellation',\n 'autoGainControl'\n ];\n\n desirable.forEach((constraint) => {\n if(constraintSupported(constraint)) {\n // @ts-ignore\n constraints[constraint] = true;\n }\n });\n\n return constraints;\n}\n","export type MyMediaTrackSupportedConstraints = MediaTrackSupportedConstraints & {\n noiseSuppression?: boolean,\n autoGainControl?: boolean\n};\n\nexport default function constraintSupported(constraint: keyof MyMediaTrackSupportedConstraints) {\n return (!!navigator?.mediaDevices?.getSupportedConstraints() as any as MyMediaTrackSupportedConstraints)[constraint];\n}\n","export default function getScreenConstraints(skipAudio?: boolean) {\n const constraints: DisplayMediaStreamOptions = {\n video: {\n // @ts-ignore\n // cursor: 'always',\n width: {max: 1920},\n height: {max: 1080},\n frameRate: {max: 30}\n }\n };\n\n if(!skipAudio) {\n constraints.audio = true;\n }\n\n return constraints;\n}\n","export default async function getScreenStream(constraints: DisplayMediaStreamOptions) {\n const screenStream = await navigator.mediaDevices.getDisplayMedia(constraints);\n const track = screenStream.getVideoTracks()[0];\n track.contentHint = 'text';\n return screenStream;\n}\n","export default async function getStream(constraints: MediaStreamConstraints, muted: boolean) {\n // console.log('getStream', constraints);\n\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n stream.getTracks().forEach((x) => {\n x.enabled = !muted;\n });\n\n // console.log('getStream result', stream);\n return stream;\n}\n\n(window as any).getStream = getStream;\n","export default function getVideoConstraints(): MediaTrackConstraints {\n return {\n width: {min: 1280, max: 1920/* , ideal: 1920 */},\n height: {min: 720, max: 1080/* , ideal: 1080 */},\n frameRate: {min: 24, max: 30}\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from '../sdp';\nimport SDPMediaSection from '../sdp/mediaSection';\nimport {toTelegramSource} from '../utils';\nimport {parseSourceGroups} from './parseSourceGroups';\n\nexport default function parseMediaSectionInfo(sdp: SDP, channel: SDPMediaSection) {\n const clientInfo = channel.lookupAttributeKeys({\n 'ice-ufrag': true,\n 'ice-pwd': true,\n 'fingerprint': true,\n 'setup': true,\n 'ssrc': true,\n 'mid': true,\n 'ssrc-group': false\n });\n\n if(!clientInfo.fingerprint) { // support Firefox\n const line = sdp.session.lines.find((line) => line.parsed?.key === 'fingerprint');\n clientInfo.fingerprint = line.parsed.value;\n }\n\n const telegramSourceGroups = parseSourceGroups(clientInfo['ssrc-group']);\n const [hash, fingerprint] = clientInfo.fingerprint.split(' ', 2);\n const ssrc = clientInfo.ssrc && toTelegramSource(+clientInfo.ssrc.split(' ', 1)[0]);\n // ssrc = telegramSourceGroups ? telegramSourceGroups[0].sources[0] : ssrc;\n\n return {\n raw: clientInfo,\n ufrag: clientInfo['ice-ufrag'],\n pwd: clientInfo['ice-pwd'],\n fingerprint: {\n fingerprint,\n setup: clientInfo.setup,\n hash\n },\n source: ssrc,\n sourceGroups: telegramSourceGroups,\n mid: clientInfo.mid\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GroupCallParticipantVideoSourceGroup} from '../../../layer';\nimport {toTelegramSource} from '../utils';\n\nexport function parseSourceGroups(sdpLines: string[]) {\n const telegramSourceGroups = sdpLines.map((str) => {\n const [semantics, ...rest] = str.split(' ');\n\n const sourceGroup: GroupCallParticipantVideoSourceGroup = {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics,\n // sources: rest.map((ssrc) => +ssrc)\n sources: rest.map((ssrc) => toTelegramSource(+ssrc))\n };\n\n return sourceGroup;\n });\n\n /* const simIndex = telegramSourceGroups.findIndex((g) => g.semantics === 'SIM');\n if(simIndex !== -1) {\n const sourceGroup = telegramSourceGroups.splice(simIndex, 1)[0];\n telegramSourceGroups.unshift(sourceGroup);\n } */\n\n return telegramSourceGroups.length ? telegramSourceGroups : undefined;\n}\n","import simulateEvent from '../../../helpers/dom/dispatchEvent';\n\nexport default function stopTrack(track: MediaStreamTrack) {\n track.stop();\n simulateEvent(track, 'ended');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {GroupCallParticipantVideoSourceGroup} from '../../layer';\nimport {fixMediaLineType, SDPBuilder, WebRTCLineType, WEBRTC_MEDIA_PORT} from './sdpBuilder';\nimport {AudioCodec, GroupCallConnectionTransport, Ssrc, UpdateGroupCallConnectionData, VideoCodec} from './types';\n\nexport class ConferenceEntry {\n public source: number;\n public sourceGroups: GroupCallParticipantVideoSourceGroup[];\n public transceiver: RTCRtpTransceiver;\n public originalDirection: RTCRtpTransceiverDirection;\n public direction: RTCRtpTransceiverDirection;\n public port: string;\n public endpoint: string;\n public peerId: PeerId;\n\n public sendEntry: ConferenceEntry;\n public recvEntry: ConferenceEntry;\n\n constructor(public mid: string, public type: WebRTCLineType) {\n this.port = WEBRTC_MEDIA_PORT;\n }\n\n public setDirection(direction: RTCRtpTransceiverDirection) {\n if(!this.originalDirection) {\n this.originalDirection = direction;\n }\n\n return this.direction = direction;\n }\n\n public setPort(port: string) {\n return this.port = port;\n }\n\n public setEndpoint(endpoint: string) {\n return this.endpoint = endpoint;\n }\n\n public setPeerId(peerId: PeerId) {\n return this.peerId = peerId;\n }\n\n public createTransceiver(connection: RTCPeerConnection, init?: RTCRtpTransceiverInit) {\n if(init?.direction) {\n this.setDirection(init.direction);\n }\n\n return this.transceiver = connection.addTransceiver(fixMediaLineType(this.type), init);\n }\n\n public setSource(source: number | GroupCallParticipantVideoSourceGroup[]) {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n\n this.sourceGroups = sourceGroups;\n return this.source = source;\n }\n\n public shouldBeSkipped(isAnswer?: boolean) {\n return isAnswer && this.direction === 'inactive';\n }\n}\n\nexport function generateSsrc(type: WebRTCLineType, source: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n\n return {\n endpoint,\n type,\n source,\n sourceGroups\n };\n}\n\nexport default class LocalConferenceDescription implements UpdateGroupCallConnectionData {\n public readonly sessionId: string;\n // public ssrcs: Ssrc[];\n public readonly transport: GroupCallConnectionTransport;\n public readonly audio?: AudioCodec;\n public readonly video: VideoCodec;\n public readonly screencast?: VideoCodec;\n\n private maxSeenId: number;\n public readonly entries: ConferenceEntry[];\n private entriesByMid: Map;\n private entriesBySource: Map;\n private entriesByPeerId: Map>;\n\n constructor(public connection: RTCPeerConnection) {\n this.sessionId = '' + Date.now();\n // this.ssrcs = [];\n this.maxSeenId = -1;\n this.entries = [];\n this.entriesByMid = new Map();\n this.entriesBySource = new Map();\n this.entriesByPeerId = new Map();\n }\n\n public setData(data: UpdateGroupCallConnectionData) {\n return safeAssign(this, data);\n }\n\n public createEntry(type: WebRTCLineType) {\n const mid = '' + ++this.maxSeenId;\n const entry = new ConferenceEntry(mid, type);\n this.entries.push(entry);\n this.entriesByMid.set(mid, entry);\n return entry;\n }\n\n public deleteEntry(entry: ConferenceEntry) {\n indexOfAndSplice(this.entries, entry);\n this.entriesByMid.delete(entry.mid);\n this.entriesBySource.delete(entry.source);\n\n const set = this.entriesByPeerId.get(entry.peerId);\n if(set) {\n set.delete(entry);\n if(!set.size) {\n this.entriesByPeerId.delete(entry.peerId);\n }\n }\n }\n\n public setEntrySource(entry: ConferenceEntry, source: Parameters[0]) {\n entry.setSource(source);\n this.entriesBySource.set(entry.source, entry);\n }\n\n public setEntryPeerId(entry: ConferenceEntry, peerId: ConferenceEntry['peerId']) {\n entry.setPeerId(peerId);\n let set = this.entriesByPeerId.get(peerId);\n if(!set) {\n this.entriesByPeerId.set(peerId, set = new Set());\n }\n\n set.add(entry);\n }\n\n public findEntry(verify: Parameters[0]) {\n return this.entries.find(verify);\n }\n\n public findFreeSendRecvEntry(type: WebRTCLineType, isSending: boolean) {\n let entry = this.entries.find((entry) => {\n return entry.direction === 'sendrecv' && entry.type === type && !(isSending ? entry.sendEntry : entry.recvEntry);\n });\n\n if(!entry) {\n entry = this.createEntry(type);\n entry.setDirection('sendrecv');\n }\n\n return entry;\n }\n\n public getEntryByMid(mid: ConferenceEntry['mid']) {\n return this.entriesByMid.get(mid);\n }\n\n public getEntryBySource(source: ConferenceEntry['source']) {\n return this.entriesBySource.get(source);\n }\n\n public getEntriesByPeerId(peerId: ConferenceEntry['peerId']) {\n return this.entriesByPeerId.get(peerId);\n }\n\n public generateSdp(options: Omit[0], 'conference'>) {\n return SDPBuilder.fromConference({\n conference: this,\n ...options\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPMediaSection from './mediaSection';\nimport SDPSessionSection from './sessionSection';\n\nexport type AttributeKey = 'group' | 'rtcp' | 'ice-ufrag' |\n 'ice-pwd' | 'ice-options' | 'fingerprint' | 'setup' |\n 'mid' | 'extmap' | 'sendonly' | 'msid' | 'rtcp-mux' |\n 'rtpmap' | 'rtcp-fb' | 'fmtp' | 'ssrc' | 'ssrc-group' |\n 'extmap-allow-mixed' | 'msid-semantic';\n\nexport type AttributeMap = {[k in AttributeKey]?: boolean};\n\nexport default class SDP {\n #session: SDPSessionSection;\n #media: SDPMediaSection[];\n\n constructor(session: SDP['session'], mediaSections: SDP['media']) {\n this.#session = session;\n this.#media = mediaSections;\n }\n\n public get session() {\n return this.#session;\n }\n\n public get media() {\n return this.#media;\n }\n\n public get bundle() {\n const bundleLine = this.session.lines.find((line) => line.parsed?.key === 'group');\n return bundleLine.value.split(' ').slice(1);\n }\n\n toString() {\n return this.session.lines\n .concat(...this.media.map((section) => section.lines))\n .map((line) => line.toString()).join('\\r\\n') + '\\r\\n';\n }\n\n /* get buggedMedia() {\n const bundle = this.bundle;\n type A = {\n mid: SDPMediaSection['mid'],\n mediaType: SDPMediaSection['mediaType'],\n direction: SDPMediaSection['direction']\n };\n const out: A[] = [];\n for(let i = 0, length = this.media.length; i < length; ++i) {\n const section = this.media[i];\n const mid = section.mid;\n if(!bundle.includes(mid)) {\n out.push(section);\n }\n }\n\n return out;\n } */\n\n /* get mediaTypes() {\n return this.media.map((section) => {\n return {mid: section.oa.get('mid').oa, type: section.mediaType, direction: section.direction};\n });\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function splitStringByLimitWithRest(str: string, separator: string, limit: number) {\n const splitted = str.split(separator);\n const out: string[] = [];\n\n while(limit > 0 && splitted.length) {\n out.push(splitted.shift());\n --limit;\n }\n\n if(splitted.length) {\n out.push(splitted.join(separator));\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class UniqueNumberGenerator {\n #set: Set;\n #min: number;\n #max: number;\n\n constructor(min: number, max: number) {\n this.#set = new Set();\n this.#min = min;\n this.#max = max;\n }\n\n public generate() {\n const min = this.#min;\n const max = this.#max;\n const set = this.#set;\n\n const maxTries = max - min + 1;\n let value = Math.floor(min + maxTries * Math.random()), _try = 0;\n while(set.has(value)) {\n if(value < max) {\n ++value;\n } else {\n value = min;\n }\n\n if(++_try >= maxTries) {\n return null;\n }\n }\n\n set.add(value);\n return value;\n }\n\n public add(value: number) {\n this.#set.add(value);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AttributeKey} from '.';\n\nexport default class SDPAttributeSplitted {\n #key: AttributeKey;\n #value: string;\n\n // key = 'ssrc-group', value = 'SIM 1 2 3'\n constructor(key: AttributeKey, value: string) {\n this.#key = key;\n this.#value = value;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class SDPMediaLineParts {\n #type: 'audio' | 'video' | 'application';\n #port: string;\n #protocol: string;\n #ids: string[];\n\n constructor(\n type: SDPMediaLineParts['type'],\n port: SDPMediaLineParts['port'],\n protocol: SDPMediaLineParts['protocol'],\n ids: SDPMediaLineParts['ids']\n ) {\n this.#type = type;\n this.#port = port;\n this.#protocol = protocol;\n this.#ids = ids;\n }\n\n public get type() {\n return this.#type;\n }\n\n public get port() {\n return this.#port;\n }\n\n public get protocol() {\n return this.#protocol;\n }\n\n public get ids() {\n return this.#ids;\n }\n\n toString() {\n return this.type + ' ' + this.port + ' ' + this.protocol + ' ' + this.ids.join(' ');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport splitStringByLimitWithRest from '../../../helpers/string/splitStringByLimitWithRest';\nimport SDPAttributeSplitted from './attributeSplitted';\nimport SDPMediaLineParts from './mediaLineParts';\n\nexport default class SDPLine {\n #key: 'm' | 'a' | 'o' | 'v' | 's' | 't' | 'c';\n #value: string;\n #mediaLineParts: SDPMediaLineParts;\n #parsed?: SDPAttributeSplitted;\n\n // key = 'a', value = 'ssrc-group:SIM 1 2 3'\n constructor(key: SDPLine['key'], value: string | SDPMediaLineParts | SDPAttributeSplitted) {\n this.#key = key;\n\n if(typeof(value) === 'string') {\n this.#value = value;\n\n if(key === 'm') {\n const splitted = value.split(' ');\n this.#mediaLineParts = new SDPMediaLineParts(splitted[0] as any, splitted[1], splitted[2], splitted.slice(3));\n } else {\n if(key === 'a') {\n const result = splitStringByLimitWithRest(value, ':', 1);\n value = result[0];\n this.#parsed = result.length === 1 ? new SDPAttributeSplitted(value as any, null) : new SDPAttributeSplitted(value as any, result[1]);\n }\n }\n } else {\n if(value instanceof SDPMediaLineParts) {\n this.#mediaLineParts = value;\n this.#value = value.toString();\n } else if(value instanceof SDPAttributeSplitted) {\n this.#parsed = value;\n this.#value = value.value ? `${value.key}:${value.value}` : value.key;\n }\n }\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n\n public get parsed() {\n return this.#parsed;\n }\n\n public get mediaLineParts() {\n return this.#mediaLineParts;\n }\n\n toString() {\n return `${this.key}=${this.value}`;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport splitStringByLimitWithRest from '../../../helpers/string/splitStringByLimitWithRest';\n\nexport default class SDPAttributeInner {\n #key: string;\n #lines: Array;\n #prefix: string;\n #nestedMap: Map;\n #missed: boolean;\n #keys: Array;\n\n constructor(key: SDPAttributeInner['key'], lines: SDPAttributeInner['lines'], prefix: string = ':', missed = false) {\n this.#key = key;\n this.#lines = lines;\n this.#prefix = prefix;\n this.#missed = missed;\n this.#nestedMap = missed ? new Map() : null;\n this.#keys = missed ? [] : null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get value() {\n return this.#missed || !this.lines.length ? null : this.lines[0];\n }\n\n public get exists() {\n return !this.#missed;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get keys() {\n SDPAttributeInner.fill(this);\n return this.#keys;\n }\n\n public forEach(callback: Parameters['forEach']>[0]) {\n SDPAttributeInner.fill(this);\n this.#nestedMap.forEach(callback);\n }\n\n public get(key: string) {\n SDPAttributeInner.fill(this);\n return this.#nestedMap.get(key) || new SDPAttributeInner(key, [], ':', true);\n }\n\n private static fill(attribute: SDPAttributeInner) {\n if(attribute.#nestedMap !== null) {\n return;\n }\n\n const map: Map> = new Map();\n attribute.lines.forEach((str) => {\n const [key, rest] = splitStringByLimitWithRest(str, attribute.#prefix, 1);\n const values = map.get(key) || [];\n map.set(key, [...values, rest || '']);\n });\n\n const nestedMap = attribute.#nestedMap = SDPAttributeInner.makeAttributes(map);\n attribute.#keys = Array.from(nestedMap.keys());\n }\n\n private static makeAttributes(innerParts: Map>) {\n const out: Map = new Map();\n\n innerParts.forEach((lines, key) => {\n out.set(key, new SDPAttributeInner(key, lines));\n });\n\n return out;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPAttributeInner from './attributeInner';\nimport SDPLine from './line';\n\nexport default class SDPAttributes {\n #lines: SDPLine[];\n #attributes: Map;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#attributes = new Map();\n SDPAttributes.fillAttributes(this);\n }\n\n public get(key: string) {\n return this.#attributes.get(key) || new SDPAttributeInner(key, [], ' ', true);\n }\n\n private static fillAttributes(attributes: SDPAttributes) {\n const attributesMap: Map> = new Map();\n attributes.#lines.forEach((line) => {\n if(line.key === 'a') {\n const {key, value} = line.parsed;\n\n let linesArray = attributesMap.get(key);\n if(!linesArray) {\n linesArray = [];\n attributesMap.set(key, linesArray);\n }\n\n linesArray.push(value || '');\n }\n });\n\n attributesMap.forEach((linesArray, key) => {\n attributes.#attributes.set(key, new SDPAttributeInner(key, linesArray, ' ', false));\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AttributeMap} from '.';\nimport {NoExtraProperties} from '../../../types';\nimport SDPAttributes from './attributes';\nimport SDPLine from './line';\n\nexport type SDPMediaDirection = 'sendonly' | 'recvonly' | 'inactive' | 'sendrecv';\nexport default class SDPMediaSection {\n #lines: Array;\n #mediaLine: SDPLine;\n #attributes: SDPAttributes;\n #direction: SDPMediaDirection;\n\n constructor(lines: Array) {\n this.#lines = lines;\n this.#mediaLine = lines[0];\n this.#attributes = this.#direction = null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get mediaLine() {\n return this.#mediaLine;\n }\n\n public get mediaLineParts() {\n return this.#mediaLine.mediaLineParts;\n }\n\n public get mediaType() {\n return this.mediaLineParts.type;\n }\n\n public get direction() {\n if(!this.#direction) {\n const attributes = this.attributes;\n\n let direction: SDPMediaDirection;\n if(attributes.get('sendonly').exists) direction = 'sendonly';\n else if(attributes.get('recvonly').exists) direction = 'recvonly';\n else if(attributes.get('inactive').exists) direction = 'inactive';\n else direction = 'sendrecv';\n\n this.#direction = direction;\n }\n\n return this.#direction;\n }\n\n public get isSending() {\n return this.direction === 'sendrecv' || this.direction === 'sendonly';\n }\n\n public get isReceiving() {\n return this.direction === 'sendrecv' || this.direction === 'recvonly';\n }\n\n public get attributes() {\n this.#attributes || (this.#attributes = new SDPAttributes(this.lines));\n return this.#attributes;\n }\n\n public get mid() {\n return this.attributes.get('mid').value;\n }\n\n public lookupAttributeKeys(keys: NoExtraProperties): {[k in keyof T]: T[k] extends true ? string : string[]} {\n const out: any = {};\n\n for(const key in keys) {\n const result = this.attributes.get(key);\n // @ts-ignore\n const resultShouldBeArray = !keys[key];\n if(!result) {\n out[key] = resultShouldBeArray ? [] : undefined;\n } else {\n out[key] = resultShouldBeArray ? result.lines : result.value;\n }\n }\n\n return out;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPLine from './line';\n\nexport default class SDPSessionSection {\n #lines: SDPLine[];\n #sessionId: string;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#sessionId = lines.filter((line) => line.key === 'o').map((line) => line.value.split(' ')[1])[0];\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get sessionId() {\n return this.#sessionId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from '.';\nimport splitStringByLimitWithRest from '../../../helpers/string/splitStringByLimitWithRest';\nimport UniqueNumberGenerator from '../../../helpers/uniqueNumberGenerator';\nimport SDPLine from './line';\nimport SDPMediaSection from './mediaSection';\nimport SDPSessionSection from './sessionSection';\n\nexport function parseSdp(str: string) {\n function createSection() {\n if(sessionSection) {\n mediaSections.push(new SDPMediaSection(lines));\n } else {\n sessionSection = new SDPSessionSection(lines);\n }\n }\n\n let sessionSection: SDPSessionSection = null, lines: SDPLine[] = [];\n const mediaSections: SDPMediaSection[] = [];\n str.split(/\\r?\\n/).forEach((lineStr) => {\n if(!isIncorrectSdpLine(lineStr)) {\n const line = parseSdpLine(lineStr);\n if(line.key === 'm') {\n createSection();\n lines = [];\n }\n\n lines.push(line);\n }\n });\n\n createSection();\n return new SDP(sessionSection, mediaSections);\n}\n\nexport function isIncorrectSdpLine(str: string) {\n return /^[\\s\\xa0]*$/.test(str);\n}\n\nexport function parseSdpLine(str: string) {\n const splitted = splitStringByLimitWithRest(str, '=', 1);\n return new SDPLine(splitted[0] as any, splitted[1]);\n}\n\nexport function addSimulcast(sdp: SDP) {\n let generator: UniqueNumberGenerator;\n sdp.media.forEach((section, idx) => {\n if(section.mediaType === 'video' && section.isSending && !section.attributes.get('ssrc-group').get('SIM').exists) {\n if(!generator) {\n generator = new UniqueNumberGenerator(2, 4294967295);\n }\n\n const originalSsrcs = section.attributes.get('ssrc-group').get('FID').value.split(' ');\n const lines = section.lines;\n originalSsrcs.forEach((ssrc) => generator.add(+ssrc)); // fix possible duplicates\n const ssrcs = [originalSsrcs[0], generator.generate(), generator.generate()];\n const ssrcs2 = [originalSsrcs[1], generator.generate(), generator.generate()];\n\n lines.push(parseSdpLine('a=ssrc-group:SIM ' + ssrcs.join(' ')));\n\n const ssrcsStrLines = section.attributes.get('ssrc').get(originalSsrcs[0]).lines;\n\n ssrcs.forEach((ssrc, idx) => {\n const ssrc2 = ssrcs2[idx];\n if(idx > 0) {\n lines.push(parseSdpLine('a=ssrc-group:FID ' + ssrc + ' ' + ssrc2));\n\n ssrcsStrLines.forEach((v) => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc + ' ' + v));\n });\n\n ssrcsStrLines.forEach((v) => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc2 + ' ' + v));\n });\n }\n });\n\n sdp.media[idx] = new SDPMediaSection(lines);\n }\n });\n\n return !!generator;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport LocalConferenceDescription, {ConferenceEntry} from './localConferenceDescription';\nimport StringFromLineBuilder from './stringFromLineBuilder';\nimport {GroupCallConnectionTransport, PayloadType, UpdateGroupCallConnectionData} from './types';\nimport {fromTelegramSource} from './utils';\n\n// screencast is for Peer-to-Peer only\nexport type WebRTCLineTypeTrue = 'video' | 'audio' | 'application';\nexport type WebRTCLineType = WebRTCLineTypeTrue | 'screencast';\n\nexport const WEBRTC_MEDIA_PORT = '9';\n\nexport function fixMediaLineType(mediaType: WebRTCLineType) {\n return mediaType === 'screencast' ? 'video' : mediaType;\n}\n\nexport function performCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n const arr: string[] = [];\n arr.push('a=candidate:');\n arr.push(`${c.foundation} ${c.component} ${c.protocol.toUpperCase()} ${c.priority} ${c.ip} ${c.port} typ ${c.type}`);\n if(c['rel-addr'] !== undefined) {\n arr.push(` raddr ${c['rel-addr']} rport ${c['rel-port']}`);\n }\n arr.push(` generation ${c.generation}`);\n return arr.join('');\n}\n\nexport function getConnectionTypeForMediaType(mediaType: WebRTCLineType) {\n // return mediaType === 'application' ? 'DTLS/SCTP' : 'RTP/SAVPF';\n return mediaType === 'application' ? 'DTLS/SCTP' : 'UDP/TLS/RTP/SAVPF';\n}\n\nexport function generateMediaFirstLine(mediaType: WebRTCLineType, port = WEBRTC_MEDIA_PORT, payloadIds: (string | number)[]) {\n const connectionType = getConnectionTypeForMediaType(mediaType);\n return `m=${fixMediaLineType(mediaType)} ${port} ${connectionType} ${payloadIds.join(' ')}`;\n}\n\ntype ConferenceData = UpdateGroupCallConnectionData | LocalConferenceDescription;\n\n// https://tools.ietf.org/id/draft-ietf-rtcweb-sdp-08.html\n// https://datatracker.ietf.org/doc/html/draft-roach-mmusic-unified-plan-00\nexport class SDPBuilder extends StringFromLineBuilder {\n public addCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n return this.add(performCandidate(c));\n }\n\n /* public addDataChannel(mid: string, transport: GroupCallConnectionTransport, isAnswer?: boolean) {\n this.add(\n 'm=application 9 UDP/DTLS/SCTP webrtc-datachannel',\n 'c=IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${mid}`\n );\n\n // if(!isAnswer) {\n this.add('a=sendrecv');\n // }\n\n this.addTransport(transport, isAnswer);\n\n return this.add(\n 'a=sctp-port:5000',\n 'a=max-message-size:262144'\n );\n } */\n\n public addHeader(sId: string, bundleMids: string[]) {\n const bundle = bundleMids.join(' ');\n return this.add(\n 'v=0', // version\n `o=- ${sId} 2 IN IP4 0.0.0.0`, // sessionId, 2=sessionVersion\n 's=-', // name of the session\n 't=0 0', // time when session is valid\n 'a=extmap-allow-mixed',\n `a=group:BUNDLE ${bundle}`,\n 'a=ice-options:trickle',\n // 'a=ice-lite', // ice-lite: is a minimal version of the ICE specification, intended for servers running on a public IP address.\n 'a=msid-semantic:WMS *'\n );\n }\n\n public addTransport(transport: GroupCallConnectionTransport, skipCandidates?: boolean) {\n this.add(\n `a=ice-ufrag:${transport.ufrag}`,\n `a=ice-pwd:${transport.pwd}`,\n 'a=ice-options:trickle' // ! test\n );\n\n for(const fingerprint of transport.fingerprints) {\n this.add(\n `a=fingerprint:${fingerprint.hash} ${fingerprint.fingerprint}`,\n `a=setup:${fingerprint.setup}`\n );\n }\n\n if(!skipCandidates && transport.candidates) {\n for(const candidate of transport.candidates) {\n this.addCandidate(candidate);\n }\n }\n\n return this;\n }\n\n public addSsrc(entry: ConferenceEntry) {\n let streamName = 'stream';\n let {type, sourceGroups} = entry;\n\n // let source = ssrc.source ?? ssrc.sourceGroups[0].sources[0];\n // source = fromTelegramSource(source);\n const source = fromTelegramSource(entry.source);\n\n streamName += source;\n type += source as any;\n\n // streamName += mid;\n // type += mid as any;\n\n // streamName = type = entry.transceiver.receiver.track.id as any;\n\n const addMsid = () => {\n this.add(`a=msid:${streamName} ${type}`);\n };\n\n const addSource = (ssrc: number) => {\n this.add(\n `a=ssrc:${ssrc} cname:${streamName}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}`,\n `a=ssrc:${ssrc} mslabel:${streamName}`,\n `a=ssrc:${ssrc} label:${type}`\n );\n };\n\n addMsid();\n if(sourceGroups?.length) {\n sourceGroups.forEach((ssrcGroup) => {\n if(ssrcGroup.sources.length) {\n const sources = ssrcGroup.sources.map(fromTelegramSource);\n this.add(`a=ssrc-group:${ssrcGroup.semantics} ${sources.join(' ')}`);\n sources.forEach(addSource);\n }\n });\n } else {\n addSource(source);\n }\n\n return this;\n }\n\n public addSsrcEntry(entry: ConferenceEntry, data: ConferenceData, isAnswer?: boolean) {\n const add = (...x: string[]) => this.add(...x);\n\n const {type, mid, direction, port} = entry;\n const transport = data.transport;\n\n /* if(type === 'application') {\n return this.addDataChannel(mid, transport, isAnswer);\n } */\n\n const isApplication = type === 'application';\n const codec = isApplication ? undefined : data[type];\n\n const isInactive = direction === 'inactive';\n if(entry.shouldBeSkipped(isAnswer)) {\n return add(\n `m=${fixMediaLineType(type)} 0 ${getConnectionTypeForMediaType(type)} 0`,\n `c=IN IP4 0.0.0.0`,\n `a=inactive`,\n `a=mid:${mid}`\n );\n }\n\n const payloadTypes = !isApplication ? codec['payload-types'] : [{id: 5000} as PayloadType];\n const ids = payloadTypes.map((type) => type.id);\n add(\n generateMediaFirstLine(type, port, ids),\n 'c=IN IP4 0.0.0.0',\n `a=rtcp:${port} IN IP4 0.0.0.0`\n );\n\n if(transport['rtcp-mux']) {\n add('a=rtcp-mux');\n }\n\n add(`a=mid:${mid}`);\n /* if(type === 'video') {\n add('b=AS:2500');\n } */\n\n let setDirection = direction;\n if(direction !== 'sendrecv' && isAnswer && !(isInactive || isApplication)) {\n setDirection = direction === 'sendonly' ? 'recvonly' : 'sendonly';\n }\n\n // a=bundle-only\n add(`a=${setDirection}`);\n\n // this.addTransport(transport, isAnswer);\n this.addTransport(transport);\n\n if(!isApplication) {\n const hdrexts = codec['rtp-hdrexts'];\n if(hdrexts?.length) {\n hdrexts.forEach((hdrext) => {\n add(`a=extmap:${hdrext.id} ${hdrext.uri}`);\n });\n }\n\n payloadTypes.forEach((type) => {\n add(`a=rtpmap:${type.id} ${type.name}/${type.clockrate}${type.channels && type.channels > 1 ? `/${type.channels}` : ''}`);\n\n const parameters = type.parameters;\n if(Array.isArray(parameters)) {\n if(parameters.length) {\n console.error('parameters is array???', parameters);\n }\n } else if(parameters && Object.keys(parameters).length) {\n const p: string[] = [];\n for(const i in parameters) {\n p.push(`${i}=${parameters[i]}`);\n }\n add(`a=fmtp:${type.id} ${p.join(';')}`);\n }\n\n const fbs = type['rtcp-fbs'];\n if(fbs?.length) {\n fbs.forEach((fb) => {\n add(`a=rtcp-fb:${type.id} ${fb.type}${fb.subtype ? ' ' + fb.subtype : ''}`);\n });\n }\n });\n } else {\n add(`a=sctpmap:${payloadTypes[0].id} webrtc-datachannel 256`);\n }\n\n if(entry.source && (setDirection === 'sendonly' || setDirection === 'sendrecv')) {\n this.addSsrc(entry);\n }\n\n return this;\n }\n\n public addConference(options: {\n conference: LocalConferenceDescription,\n bundle: string[],\n entries: ConferenceEntry[],\n isAnswer?: boolean,\n }) {\n const {conference, entries, bundle, isAnswer} = options;\n this.addHeader(conference.sessionId, bundle);\n\n if(IS_FIREFOX) {\n this.addTransport(conference.transport); // support Firefox\n }\n\n for(const entry of entries) {\n // this.addSsrcEntry(entry, conference, isAnswer);\n this.addSsrcEntry((isAnswer ? entry.recvEntry || entry.sendEntry : entry.sendEntry || entry.recvEntry) || entry, conference, isAnswer);\n }\n\n return this;\n }\n\n public static fromConference(options: Parameters[0]) {\n return new SDPBuilder().addConference(options).finalize();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport {GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX} from './constants';\nimport stopTrack from './helpers/stopTrack';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport {fixMediaLineType, WebRTCLineType} from './sdpBuilder';\nimport {getAmplitude, toTelegramSource} from './utils';\n\nexport type StreamItemBase = {\n type: 'input' | 'output',\n track: MediaStreamTrack,\n source: string,\n stream: MediaStream\n};\n\nexport type StreamItem = StreamAudioItem | StreamVideoItem;\n\nexport type StreamAudioItem = StreamItemBase & {kind: 'audio', streamAnalyser: AudioStreamAnalyser};\nexport type StreamVideoItem = StreamItemBase & {kind: 'video'};\n\nexport type StreamAmplitude = {\n type: 'input' | 'output';\n source: string;\n stream: MediaStream;\n track: MediaStreamTrack;\n value: number;\n};\n\nclass AudioStreamAnalyser {\n public analyser: AnalyserNode;\n public gain: GainNode;\n public streamSource: MediaStreamAudioSourceNode;\n\n constructor(context: AudioContext, stream: MediaStream) {\n const streamSource = this.streamSource = context.createMediaStreamSource(stream);\n const analyser = this.analyser = context.createAnalyser();\n const gain = this.gain = context.createGain();\n // const streamDestination = context.createMediaStreamDestination();\n\n analyser.minDecibels = -100;\n analyser.maxDecibels = -30;\n analyser.smoothingTimeConstant = 0.05;\n analyser.fftSize = 1024;\n\n // connect Web Audio API\n streamSource.connect(analyser);\n // analyser.connect(context.destination);\n }\n}\n\nexport default class StreamManager {\n public static ANALYSER_LISTENER = new EventListenerBase<{amplitude: (details: {amplitudes: StreamAmplitude[], type: 'all' | 'input'}) => void}>();\n private context: AudioContext;\n public outputStream: MediaStream;\n public inputStream: MediaStream;\n\n private timer: number;\n private counter: number;\n\n private items: StreamItem[];\n\n private log: ReturnType;\n\n public direction: RTCRtpTransceiver['direction'];\n public canCreateConferenceEntry: boolean;\n public locked: boolean;\n public types: WebRTCLineType[];\n\n constructor(private interval?: number) {\n this.context = new (window.AudioContext || (window as any).webkitAudioContext)();\n this.items = [];\n this.outputStream = new MediaStream();\n this.inputStream = new MediaStream();\n this.counter = 0;\n this.log = logger('SM');\n this.direction = 'sendonly';\n this.canCreateConferenceEntry = true;\n // this.lol = true;\n this.types = ['audio', 'video'];\n }\n\n public addStream(stream: MediaStream, type: StreamItem['type']) {\n stream.getTracks().forEach((track) => {\n this.addTrack(stream, track, type);\n });\n }\n\n public addTrack(stream: MediaStream, track: MediaStreamTrack, type: StreamItem['type']) {\n this.log('addTrack', type, track, stream);\n\n const {context, items, inputStream, outputStream} = this;\n const kind: StreamItem['kind'] = track.kind as any;\n const source = StreamManager.getSource(stream, type);\n\n // this.removeTrack(track);\n switch(type) {\n case 'input': {\n if(!inputStream) {\n this.inputStream = stream;\n } else {\n inputStream.addTrack(track);\n }\n\n break;\n }\n\n case 'output': {\n for(let i = 0; i < items.length; ++i) {\n const {track: t, type, source: itemSource} = items[i];\n if(itemSource === source && type === 'input') {\n items.splice(i, 1);\n outputStream.removeTrack(t);\n break;\n }\n }\n\n if(kind !== 'video') {\n outputStream.addTrack(track);\n }\n\n break;\n }\n }\n\n this.finalizeAddingTrack({\n type,\n source,\n stream,\n track,\n kind,\n streamAnalyser: kind === 'audio' ? new AudioStreamAnalyser(context, stream) : undefined\n });\n\n if(kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n\n private finalizeAddingTrack(item: StreamItem) {\n const {track} = item;\n track.addEventListener('ended', () => {\n this.removeTrack(track);\n }, {once: true});\n\n this.items.push(item);\n }\n\n public hasInputTrackKind(kind: StreamItem['kind']) {\n return this.items.find((item) => item.type === 'input' && item.kind === kind);\n }\n\n public static getSource(stream: MediaStream, type: StreamItem['type']) {\n return type === 'input' ? (stream.source || stream.id) : '' + toTelegramSource(+stream.id.substring(6));\n }\n\n public removeTrack(track: MediaStreamTrack) {\n this.log('removeTrack', track);\n\n const {items} = this;\n\n let handled = false;\n for(let i = 0, length = items.length; !handled && i < length; ++i) {\n const {track: t, type} = items[i];\n switch(type) {\n case 'output': {\n if(t === track) {\n items.splice(i, 1);\n this.outputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n\n case 'input': {\n if(t === track) {\n items.splice(i, 1);\n this.inputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n }\n }\n\n if(track.kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n\n public replaceInputAudio(stream: MediaStream, oldTrack: MediaStreamTrack) {\n this.removeTrack(oldTrack);\n this.addStream(stream, 'input');\n }\n\n private changeTimer() {\n if(this.timer !== undefined) {\n clearInterval(this.timer);\n }\n\n if(this.items.length) {\n this.timer = window.setInterval(this.analyse, this.interval);\n }\n }\n\n public getAmplitude = (item: StreamAudioItem): StreamAmplitude => {\n const {streamAnalyser, stream, track, source, type} = item;\n const analyser = streamAnalyser.analyser;\n if(!analyser) return;\n\n const array = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(array);\n const value = getAmplitude(array);\n\n return {\n type,\n source,\n stream,\n track,\n value\n };\n };\n\n public analyse = () => {\n const all = this.counter % 3 === 0;\n const filteredItems = all ? this.items : this.items.filter((x) => x.type === 'input');\n const audioItems = filteredItems.filter((x) => x.kind === 'audio') as StreamAudioItem[];\n const amplitudes = audioItems.slice(0, GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX).map(this.getAmplitude);\n if(++this.counter >= 1000) {\n this.counter = 0;\n }\n\n StreamManager.ANALYSER_LISTENER.dispatchEvent('amplitude', {\n amplitudes,\n type: all ? 'all' : 'input'\n });\n };\n\n /* public appendToConnection(connection: RTCPeerConnection) {\n if(this.inputStream) {\n this.inputStream.getTracks().forEach((track) => {\n connection.log('addTrack', track);\n connection.addTrack(track, this.inputStream);\n\n if(track.kind === 'video') {\n track.enabled = true;\n }\n });\n }\n } */\n\n public appendToConference(conference: LocalConferenceDescription) {\n if(this.locked) {\n return;\n }\n\n const {inputStream, direction, canCreateConferenceEntry} = this;\n const transceiverInit: RTCRtpTransceiverInit = {direction, streams: [inputStream]};\n const types = this.types.map((type) => {\n return [\n type,\n /* type === 'video' || type === 'screencast' ?\n {sendEncodings: [{maxBitrate: 2500000}], ...transceiverInit} : */\n transceiverInit\n ] as const;\n });\n\n const tracks = inputStream.getTracks();\n // const transceivers = conference.connection.getTransceivers();\n for(const [type, transceiverInit] of types) {\n let entry = conference.findEntry((entry) => entry.direction === direction && entry.type === type);\n if(!entry) {\n if(!canCreateConferenceEntry) {\n continue;\n }\n\n entry = conference.createEntry(type);\n }\n /* const entry = conference.findFreeSendRecvEntry(type, true);\n if(!entry.transceiver) {\n entry.transceiver = transceivers.find((transceiver) => transceiver.mid === entry.mid);\n } */\n\n let {transceiver} = entry;\n if(!transceiver) {\n transceiver = entry.createTransceiver(conference.connection, transceiverInit);\n\n /* if(this.isScreenSharingManager) {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n } */\n }\n\n if(entry.direction !== transceiver.direction) {\n transceiver.direction = entry.direction;\n }\n\n const mediaTrackType = fixMediaLineType(type);\n const trackIdx = tracks.findIndex((track) => track.kind === mediaTrackType);\n const track = trackIdx !== -1 ? tracks.splice(trackIdx, 1)[0] : undefined;\n const sender = transceiver.sender;\n if(sender.track === track) {\n continue;\n }\n\n // try { // ! don't use await here. it will wait for adding track and fake one won't be visible in startNegotiation.\n /* await */sender.replaceTrack(track).catch((err) => {\n this.log.error(err);\n });\n // } catch(err) {\n\n // }\n }\n }\n\n public stop() {\n try {\n const tracks = this.inputStream.getTracks().concat(this.outputStream.getTracks());\n tracks.forEach((track) => {\n stopTrack(track);\n });\n } catch(e) {\n this.log.error(e);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport default class StringFromLineBuilder {\n private lines: string[];\n private newLine: string[];\n\n constructor(private joiner = '\\r\\n') {\n this.lines = [];\n this.newLine = [];\n }\n\n public add(...strs: string[]) {\n this.lines.push(...strs);\n return this;\n }\n\n public push(word: string) {\n this.newLine.push(word);\n return this;\n }\n\n public addJoined(separator = '') {\n this.add(this.newLine.join(separator));\n this.newLine = [];\n return this;\n }\n\n public join() {\n return this.lines.join(this.joiner);\n }\n\n public finalize() {\n return this.join() + this.joiner;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\n// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n// unsign => sign\nexport function toTelegramSource(source: number) {\n return source << 0;\n}\n\n// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n// sign => unsign\nexport function fromTelegramSource(source: number) {\n return source >>> 0;\n}\n\nexport function getAmplitude(array: Uint8Array, scale = 3) {\n if(!array) return 0;\n\n const {length} = array;\n let total = 0;\n for(let i = 0; i < length; ++i) {\n total += array[i] * array[i];\n }\n const rms = Math.sqrt(total / length) / 255;\n\n return Math.min(1, rms * scale);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport getEmojiEntityFromEmoji from './getEmojiEntityFromEmoji';\nimport emojiRegExp from '../../vendor/emoji/regex';\n\nconst EMOJI_REG_EXP = new RegExp(`(^${emojiRegExp})`);\n\nexport default function getAbbreviation(str: string, onlyFirst = false): {\n text: string,\n entities: MessageEntity[]\n} {\n const splitted = (str || '').trim().split(' ');\n if(!splitted[0]) return {text: '', entities: []};\n\n const entities: MessageEntity.messageEntityEmoji[] = [];\n\n const firstEmojiMatch = splitted[0].match(EMOJI_REG_EXP);\n const first = firstEmojiMatch?.[0] || splitted[0][0];\n if(firstEmojiMatch) {\n entities.push(getEmojiEntityFromEmoji(first));\n }\n\n const length = splitted.length;\n if(onlyFirst || length === 1) return {text: first, entities};\n\n const lastEmojiMatch = splitted[length - 1].match(EMOJI_REG_EXP);\n const last = lastEmojiMatch?.[0] || splitted[length - 1][0];\n if(lastEmojiMatch) {\n entities.push({\n ...getEmojiEntityFromEmoji(last),\n offset: first.length\n });\n }\n\n return {text: first + last, entities};\n}\n","import {MessageEntity} from '../../layer';\nimport {toCodePoints} from '../../vendor/emoji';\n\nexport default function getEmojiEntityFromEmoji(emoji: string): MessageEntity.messageEntityEmoji {\n return {\n _: 'messageEntityEmoji',\n offset: 0,\n length: emoji.length,\n unicode: toCodePoints(emoji).join('-').replace(/-?fe0f/g, '')\n };\n}\n","import {EMAIL_REG_EXP} from '.';\n\nexport default function matchEmail(text: string) {\n return !text ? null : text.match(EMAIL_REG_EXP);\n}\n","export default function setBlankToAnchor(anchor: HTMLAnchorElement) {\n anchor.target = '_blank';\n anchor.rel = 'noopener noreferrer';\n return anchor;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport wrapEmojiText from './wrapEmojiText';\nimport getAbbreviation from './getAbbreviation';\n\nexport default function wrapAbbreviation(str: string, onlyFirst?: boolean) {\n const {text, entities} = getAbbreviation(str, onlyFirst);\n return wrapEmojiText(text, undefined, entities);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../rootScope';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapDraftText(text: string, options: Partial<{\n wrappingForPeerId: PeerId\n}> & Parameters[1] = {}) {\n if(!text) {\n return wrapRichText('');\n }\n\n let entities = options.entities;\n if(entities && !rootScope.premium && options.wrappingForPeerId !== rootScope.myId) {\n entities = entities.filter((entity) => entity._ !== 'messageEntityCustomEmoji');\n }\n\n const fragment = wrapRichText(text, {\n ...options,\n entities,\n noLinks: true,\n wrappingDraft: true,\n passEntities: {\n messageEntityTextUrl: true,\n messageEntityMentionName: true\n }\n });\n\n return fragment;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport parseEntities from './parseEntities';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapEmojiText(text: string, isDraft = false, entities?: MessageEntity[]) {\n if(!text) return wrapRichText('');\n\n entities ??= parseEntities(text).filter((e) => e._ === 'messageEntityEmoji');\n return wrapRichText(text, {entities, wrappingDraft: isDraft});\n}\n","import IS_EMOJI_SUPPORTED from './emojiSupport';\n\nexport type EMOJI_VERSION = '' | '14';\n\nconst EMOJI_VERSIONS_SUPPORTED: {\n [v in EMOJI_VERSION]: boolean\n} = {} as any;\n\n// Thanks to WebZ for the detect\nfunction isEmojiSupported(emoji: string) {\n const ALLOWABLE_CALCULATION_ERROR_SIZE = 5;\n const inlineEl = document.createElement('span');\n inlineEl.classList.add('emoji');\n document.body.appendChild(inlineEl);\n\n inlineEl.innerText = emoji; // Emoji from 14.0 version\n const newEmojiWidth = inlineEl.offsetWidth;\n inlineEl.innerText = '❤️'; // Emoji from 1.0 version\n const legacyEmojiWidth = inlineEl.offsetWidth;\n\n document.body.removeChild(inlineEl);\n\n return Math.abs(newEmojiWidth - legacyEmojiWidth) < ALLOWABLE_CALCULATION_ERROR_SIZE;\n}\n\nif(IS_EMOJI_SUPPORTED) {\n EMOJI_VERSIONS_SUPPORTED[''] = true;\n\n const a: [keyof typeof EMOJI_VERSIONS_SUPPORTED, string][] = [\n ['14', '🫱🏻']\n ];\n\n a.forEach(([version, emoji]) => {\n EMOJI_VERSIONS_SUPPORTED[version] = isEmojiSupported(emoji);\n });\n}\n\nexport default EMOJI_VERSIONS_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {EMOJI_VERSION} from '../../environment/emojiVersionsSupport';\nimport {SITE_HASHTAGS} from '.';\nimport {EmojiVersions} from '../../config/emoji';\nimport IS_EMOJI_SUPPORTED from '../../environment/emojiSupport';\nimport buildURLHash from '../../helpers/buildURLHash';\nimport copy from '../../helpers/object/copy';\nimport encodeEntities from '../../helpers/string/encodeEntities';\nimport {MessageEntity} from '../../layer';\nimport encodeSpoiler from './encodeSpoiler';\nimport parseEntities from './parseEntities';\nimport setBlankToAnchor from './setBlankToAnchor';\nimport wrapUrl from './wrapUrl';\nimport EMOJI_VERSIONS_SUPPORTED from '../../environment/emojiVersionsSupport';\nimport {CLICK_EVENT_NAME} from '../../helpers/dom/clickEvent';\nimport IS_CUSTOM_EMOJI_SUPPORTED from '../../environment/customEmojiSupport';\nimport rootScope from '../rootScope';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport wrapSticker, {videosCache} from '../../components/wrappers/sticker';\nimport RLottiePlayer, {getLottiePixelRatio} from '../rlottie/rlottiePlayer';\nimport animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport type {MyDocument} from '../appManagers/appDocsManager';\nimport LazyLoadQueue from '../../components/lazyLoadQueue';\nimport {Awaited} from '../../types';\nimport {MediaSize} from '../../helpers/mediaSize';\nimport IS_WEBM_SUPPORTED from '../../environment/webmSupport';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport getViewportSlice from '../../helpers/dom/getViewportSlice';\nimport {getMiddleware, Middleware, MiddlewareHelper} from '../../helpers/middleware';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport BOM from '../../helpers/string/bom';\nimport framesCache from '../../helpers/framesCache';\nimport wrapTelegramUrlToAnchor from './wrapTelegramUrlToAnchor';\n\nconst resizeObserver = new ResizeObserver((entries) => {\n for(const entry of entries) {\n const renderer = entry.target.parentElement as CustomEmojiRendererElement;\n renderer.setDimensionsFromRect(entry.contentRect);\n }\n});\n\nconst globalLazyLoadQueue = new LazyLoadQueue();\n\nexport class CustomEmojiElement extends HTMLElement {\n public elements: CustomEmojiElements;\n public renderer: CustomEmojiRendererElement;\n public player: RLottiePlayer | HTMLVideoElement;\n public paused: boolean;\n public syncedPlayer: SyncedPlayer;\n public clean: boolean;\n public lastChildWas: Node;\n // public docId: DocId;\n public placeholder: HTMLImageElement;\n public middlewareHelper: MiddlewareHelper;\n\n constructor() {\n super();\n this.paused = true;\n this.classList.add('custom-emoji');\n }\n\n public get docId() {\n return this.dataset.docId;\n }\n\n public static create(docId: DocId) {\n const element = new CustomEmojiElement();\n // element.docId = docId;\n element.dataset.docId = '' + docId;\n return element;\n }\n\n public get isConnected() {\n return this.placeholder?.isConnected ?? super.isConnected;\n }\n\n public connectedCallback() {\n // if(this.isConnected) {\n // return;\n // }\n\n if(this.player) {\n animationIntersector.addAnimation(this, this.renderer.animationGroup, undefined, true);\n }\n\n // this.connectedCallback = undefined;\n }\n\n public disconnectedCallback() {\n if(this.isConnected || !this.renderer?.isSelectable) { // prepend on sibling can invoke disconnectedCallback\n return;\n }\n\n this.clear();\n }\n\n public destroy() {\n this.clear();\n }\n\n public clear(replaceChildren = true) {\n if(this.clean) {\n return;\n }\n\n // if(this.docId === '5399836826758290421') {\n // console.log('clear', this, this.isConnected);\n // }\n\n this.clean = true;\n this.pause();\n\n const {syncedPlayer} = this;\n if(syncedPlayer) {\n syncedPlayer.pausedElements.delete(this);\n }\n\n this.middlewareHelper?.clean();\n\n if(this.renderer) {\n const elements = this.renderer.customEmojis.get(this.docId);\n if(elements?.delete(this) && !elements.size) {\n this.renderer.customEmojis.delete(this.docId);\n this.renderer.playersSynced.delete(elements);\n }\n\n if(replaceChildren) {\n if(this.renderer.isSelectable) {\n this.replaceChildren(createCustomFiller(true));\n } else {\n // otherwise https://bugs.chromium.org/p/chromium/issues/detail?id=1144736#c27 will happen\n this.replaceChildren();\n }\n }\n }\n\n if(this.player) {\n animationIntersector.removeAnimationByPlayer(this);\n }\n\n if(globalLazyLoadQueue) {\n globalLazyLoadQueue.delete({div: this});\n }\n\n /* this.disconnectedCallback = */this.elements =\n this.renderer =\n this.player =\n this.syncedPlayer =\n undefined;\n }\n\n public pause() {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n\n if(this.player instanceof HTMLVideoElement && !this.syncedPlayer) {\n this.renderer.lastPausedVideo = this.player;\n this.player.pause();\n }\n\n if(this.syncedPlayer && !this.syncedPlayer.pausedElements.has(this)) {\n this.syncedPlayer.pausedElements.add(this);\n\n if(this.syncedPlayer.player && this.syncedPlayer.pausedElements.size === this.syncedPlayer.middlewares.size) {\n this.syncedPlayer.player.pause();\n }\n }\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n\n if(this.player instanceof HTMLVideoElement) {\n this.player.currentTime = this.renderer.lastPausedVideo?.currentTime || this.player.currentTime;\n this.player.play().catch(noop);\n }\n\n if(this.syncedPlayer && this.syncedPlayer.pausedElements.has(this)) {\n this.syncedPlayer.pausedElements.delete(this);\n\n if(this.syncedPlayer.pausedElements.size !== this.syncedPlayer.middlewares.size) {\n this.player.play();\n }\n }\n }\n\n public remove() {\n this.clear();\n // this.elements = this.renderer = this.player = undefined;\n }\n\n public get autoplay() {\n return true;\n }\n}\n\ntype CustomEmojiElements = Set;\n\nexport class CustomEmojiRendererElement extends HTMLElement {\n public canvas: HTMLCanvasElement;\n public context: CanvasRenderingContext2D;\n\n public playersSynced: Map;\n public clearedElements: WeakSet;\n public customEmojis: Parameters[1]['customEmojis'];\n public lastPausedVideo: HTMLVideoElement;\n\n public lastRect: DOMRect;\n public isDimensionsSet: boolean;\n\n public animationGroup: AnimationItemGroup;\n public size: MediaSize;\n\n public isSelectable: boolean;\n public isCanvasClean: boolean;\n\n public ignoreSettingDimensions: boolean;\n\n public forceRenderAfterSize: boolean;\n\n public middlewareHelper: MiddlewareHelper;\n\n public auto: boolean;\n\n constructor() {\n super();\n\n this.classList.add('custom-emoji-renderer');\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('custom-emoji-canvas');\n this.context = this.canvas.getContext('2d');\n this.append(this.canvas);\n\n this.playersSynced = new Map();\n this.clearedElements = new WeakSet();\n this.customEmojis = new Map();\n\n this.animationGroup = 'EMOJI';\n this.isCanvasClean = false;\n }\n\n public connectedCallback() {\n if(emojiRenderers.has(this)) {\n return;\n }\n\n // this.setDimensions();\n // animationIntersector.addAnimation(this, this.animationGroup);\n resizeObserver.observe(this.canvas);\n emojiRenderers.add(this);\n\n this.connectedCallback = undefined;\n }\n\n public disconnectedCallback() {\n if(this.isConnected || !this.auto) {\n return;\n }\n\n this.destroy?.();\n\n this.disconnectedCallback = undefined;\n }\n\n public destroy() {\n // if(this.isConnected) {\n // return;\n // }\n\n resizeObserver.unobserve(this.canvas);\n\n this.customEmojis.forEach((elements) => {\n elements.forEach((element) => {\n element.clear();\n });\n });\n\n emojiRenderers.delete(this);\n this.playersSynced.clear();\n this.middlewareHelper?.clean();\n this.customEmojis.clear();\n\n this.destroy =\n this.lastPausedVideo =\n undefined;\n }\n\n public getOffsets(offsetsMap: Map = new Map()) {\n if(!this.playersSynced.size) {\n return offsetsMap;\n }\n\n const overflowElement = findUpClassName(this, 'scrollable') || this.offsetParent as HTMLElement;\n if(!overflowElement) {\n return offsetsMap;\n }\n\n const overflowRect = overflowElement.getBoundingClientRect();\n const rect = this.getBoundingClientRect();\n\n for(const elements of this.playersSynced.keys()) {\n const elementsArr = Array.from(elements);\n const placeholders = this.isSelectable ? elementsArr.map((element) => element.placeholder) : elementsArr;\n const {visible} = getViewportSlice({\n overflowElement,\n overflowRect,\n elements: placeholders,\n extraSize: this.size.height * 2.5 // let's add some margin\n });\n\n const offsets = visible.map(({rect: elementRect}) => {\n const top = elementRect.top - rect.top;\n const left = elementRect.left - rect.left;\n return {top, left, width: elementRect.width};\n });\n\n if(offsets.length) {\n offsetsMap.set(elements, offsets);\n }\n }\n\n // const rect = this.getBoundingClientRect();\n // const visibleRect = getVisibleRect(this, overflowElement, undefined, rect);\n // const minTop = visibleRect ? visibleRect.rect.top - this.size.height : 0;\n // const maxTop = Infinity;\n // for(const elements of this.playersSynced.keys()) {\n // const offsets = elements.map((element) => {\n // const elementRect = element.getBoundingClientRect();\n // const top = elementRect.top - rect.top;\n // const left = elementRect.left - rect.left;\n // return top >= minTop && (top + elementRect.height) <= maxTop ? {top, left} : undefined;\n // }).filter(Boolean);\n\n // if(offsets.length) {\n // offsetsMap.set(elements, offsets);\n // }\n // }\n\n return offsetsMap;\n }\n\n public clearCanvas() {\n if(this.isCanvasClean) {\n return;\n }\n\n const {context, canvas} = this;\n context.clearRect(0, 0, canvas.width, canvas.height);\n this.isCanvasClean = true;\n }\n\n public render(offsetsMap: ReturnType) {\n const {context, canvas, isDimensionsSet} = this;\n if(!isDimensionsSet) {\n this.setDimensionsFromRect(undefined, false);\n }\n\n this.isCanvasClean = false;\n\n const {width, height, dpr} = canvas;\n for(const [elements, offsets] of offsetsMap) {\n const player = this.playersSynced.get(elements);\n const frame = syncedPlayersFrames.get(player) || (player instanceof HTMLVideoElement ? player : undefined);\n if(!frame) {\n continue;\n }\n\n const isImageData = frame instanceof ImageData;\n let frameWidth: number, frameHeight: number;\n if(player instanceof HTMLVideoElement) {\n frameWidth = this.size.width * dpr;\n frameHeight = this.size.height * dpr;\n } else {\n frameWidth = frame.width;\n frameHeight = frame.height;\n }\n\n // ! check performance of scaling\n const elementWidth = Math.round(offsets[0].width * dpr);\n if(elementWidth !== frameWidth) {\n // if(this.size.width === 36) {\n // console.warn('different width', elementWidth, frameWidth, this);\n // }\n\n frameWidth = elementWidth;\n frameHeight = elementWidth;\n }\n\n const maxTop = height - frameHeight;\n const maxLeft = width - frameWidth;\n\n if(!this.clearedElements.has(elements) && !this.isSelectable) {\n if(this.isSelectable/* && false */) {\n elements.forEach((element) => {\n element.lastChildWas ??= element.lastChild;\n replaceContent(element, element.firstChild);\n });\n } else {\n elements.forEach((element) => {\n element.replaceChildren();\n });\n }\n\n this.clearedElements.add(elements);\n }\n\n offsets.forEach(({top, left}) => {\n top = Math.round(top * dpr), left = Math.round(left * dpr);\n if(left < 0 ||/* top > maxTop || */left > maxLeft) {\n return;\n }\n\n if(isImageData) {\n context.putImageData(frame, left, top);\n } else {\n // context.clearRect(left, top, width, height);\n context.drawImage(frame, left, top, frameWidth, frameHeight);\n }\n });\n }\n }\n\n public checkForAnyFrame() {\n for(const player of this.playersSynced.values()) {\n if(syncedPlayersFrames.has(player) || player instanceof HTMLVideoElement) {\n return true;\n }\n }\n\n return false;\n }\n\n public remove() {\n super.remove();\n // this.canvas.remove();\n }\n\n // public setDimensions() {\n // const {canvas} = this;\n // sequentialDom.mutateElement(canvas, () => {\n // const rect = canvas.getBoundingClientRect();\n // this.setDimensionsFromRect(rect);\n // });\n // }\n\n public setDimensionsFromRect(rect: DOMRect = this.lastRect, forceRenderAfter = true) {\n const {canvas} = this;\n const {dpr} = canvas;\n\n if(this.lastRect !== rect) {\n this.lastRect = rect;\n }\n\n if(!rect || !dpr || this.ignoreSettingDimensions) {\n return;\n }\n\n const {width, height} = rect;\n // if(this.isSelectable) {\n // height = this.parentElement.scrollHeight || height;\n\n // this.style.width = width + 'px';\n // this.style.height = height + 'px';\n // }\n\n const newWidth = Math.floor(Math.round(width * dpr));\n const newHeight = Math.floor(Math.round(height * dpr));\n if(canvas.width === newWidth && canvas.height === newHeight) {\n return;\n }\n\n canvas.width = newWidth;\n canvas.height = newHeight;\n this.isDimensionsSet = true;\n this.isCanvasClean = true;\n\n if(this.forceRenderAfterSize || (this.isSelectable && forceRenderAfter)) {\n this.forceRenderAfterSize = undefined;\n this.forceRender();\n }\n }\n\n public forceRender() {\n if(!this.isDimensionsSet) {\n return;\n }\n\n if(!renderEmojis(new Set([this]))) {\n this.clearCanvas();\n }\n }\n\n public add(\n addCustomEmojis: Parameters[1]['customEmojis'],\n lazyLoadQueue?: LazyLoadQueue | false,\n onlyThumb?: boolean,\n withThumb?: boolean\n ) {\n const renderer = this;\n\n addCustomEmojis.forEach((addElements, docId) => { // prevent adding old elements\n let elements = this.customEmojis.get(docId);\n if(!elements) this.customEmojis.set(docId, elements = new Set());\n else this.clearedElements.delete(elements);\n\n for(const el of addElements) {\n if(elements.has(el)) {\n addElements.delete(el);\n } else {\n el.clean = false;\n el.renderer = renderer;\n el.elements = elements;\n el.middlewareHelper = this.middlewareHelper.get().create();\n elements.add(el);\n\n if(el.lastChildWas && !el.lastChildWas.parentNode) {\n el.append(el.lastChildWas);\n }\n }\n }\n\n if(!addElements.size) {\n addCustomEmojis.delete(docId);\n }\n });\n\n if(!addCustomEmojis.size) {\n return;\n }\n\n const usingOwnQueue = !!(!lazyLoadQueue && lazyLoadQueue !== false && globalLazyLoadQueue);\n\n const docIds = Array.from(addCustomEmojis.keys());\n\n const managers = rootScope.managers;\n const middleware = this.middlewareHelper.get();\n const size = this.size;\n\n const loadPromise = managers.appEmojiManager.getCachedCustomEmojiDocuments(docIds).then((docs) => {\n if(middleware && !middleware()) return;\n\n const loadPromises: Promise[] = [];\n const wrap = (doc: MyDocument, _loadPromises?: Promise[]) => {\n const docId = doc.id;\n const newElements = addCustomEmojis.get(docId);\n const customEmojis = renderer.customEmojis.get(docId);\n const isLottie = doc.sticker === 2;\n const isStatic = doc.mime_type === 'video/webm' && !IS_WEBM_SUPPORTED;\n const willHaveSyncedPlayer = (isLottie || (doc.sticker === 3 && this.isSelectable)) && !onlyThumb && !isStatic;\n\n const loadPromises: Promise[] = [];\n const newElementsArray = Array.from(newElements);\n const promise = wrapSticker({\n div: newElementsArray,\n doc,\n width: size.width,\n height: size.height,\n loop: true,\n play: CUSTOM_EMOJI_INSTANT_PLAY,\n managers,\n isCustomEmoji: true,\n group: 'none',\n loadPromises,\n middleware,\n exportLoad: usingOwnQueue || lazyLoadQueue === false ? 2 : 1, // 2 - export load always, 1 - do not export load if cached static\n needFadeIn: false,\n loadStickerMiddleware: willHaveSyncedPlayer && middleware ? middleware.create().get(() => {\n // if(syncedPlayers.get(key) !== syncedPlayer) {\n // return false;\n // }\n\n // let good = false;\n // for(const middleware of syncedPlayer.middlewares) {\n // if(middleware()) {\n // good = true;\n // break;\n // }\n // }\n\n // return good;\n return !!syncedPlayer.middlewares.size;\n }) : undefined,\n static: isStatic,\n onlyThumb,\n withThumb: withThumb ?? (renderer.clearedElements.has(customEmojis) ? false : undefined),\n syncedVideo: this.isSelectable\n });\n\n if(_loadPromises) {\n promise.then(() => _loadPromises.push(...loadPromises));\n }\n\n const addition: {\n onRender?: (_p: Awaited['render']>) => Promise,\n elements: typeof newElements\n } = {\n elements: newElements\n };\n\n if(doc.sticker === 1 || onlyThumb || isStatic) {\n if(this.isSelectable) {\n addition.onRender = () => Promise.all(loadPromises).then(() => {\n if(middleware && !middleware()) return;\n newElementsArray.forEach((element) => {\n const {placeholder} = element;\n placeholder.src = (element.firstElementChild as HTMLImageElement).src;\n });\n });\n }\n\n return promise.then((res) => ({...res, ...addition}));\n }\n\n // eslint-disable-next-line prefer-const\n addition.onRender = (_p) => Promise.all(loadPromises).then(() => {\n if((middleware && !middleware()) || !doc.animated) {\n return;\n }\n\n const players = Array.isArray(_p) ? _p as HTMLVideoElement[] : [_p as RLottiePlayer];\n const player = Array.isArray(players) ? players[0] : players;\n assumeType(player);\n newElementsArray.forEach((element, idx) => {\n const player = players[idx] || players[0];\n element.player = player;\n\n if(syncedPlayer) {\n element.syncedPlayer = syncedPlayer;\n if(element.paused) {\n element.syncedPlayer.pausedElements.add(element);\n } else if(player.paused) {\n player.play();\n }\n }\n\n if(element.isConnected) {\n animationIntersector.addAnimation(element, element.renderer.animationGroup, undefined, true);\n }\n });\n\n if(player instanceof RLottiePlayer || (player instanceof HTMLVideoElement && this.isSelectable)) {\n syncedPlayer.player = player;\n renderer.playersSynced.set(customEmojis, player);\n }\n\n if(player instanceof RLottiePlayer) {\n player.group = renderer.animationGroup;\n\n player.overrideRender ??= (frame) => {\n syncedPlayersFrames.set(player, frame);\n // frames.set(containers, frame);\n };\n } else if(player instanceof HTMLVideoElement) {\n // player.play();\n\n // const cache = framesCache.getCache(key);\n // let {width, height} = renderer.size;\n // width *= dpr;\n // height *= dpr;\n\n // const onFrame = (frame: ImageBitmap | HTMLCanvasElement) => {\n // topFrames.set(player, frame);\n // player.requestVideoFrameCallback(callback);\n // };\n\n // let frameNo = -1, lastTime = 0;\n // const callback: VideoFrameRequestCallback = (now, metadata) => {\n // const time = player.currentTime;\n // if(lastTime > time) {\n // frameNo = -1;\n // }\n\n // const _frameNo = ++frameNo;\n // lastTime = time;\n // // const frameNo = Math.floor(player.currentTime * 1000 / CUSTOM_EMOJI_FRAME_INTERVAL);\n // // const frameNo = metadata.presentedFrames;\n // const imageBitmap = cache.framesNew.get(_frameNo);\n\n // if(imageBitmap) {\n // onFrame(imageBitmap);\n // } else if(IS_IMAGE_BITMAP_SUPPORTED) {\n // createImageBitmap(player, {resizeWidth: width, resizeHeight: height}).then((imageBitmap) => {\n // cache.framesNew.set(_frameNo, imageBitmap);\n // if(frameNo === _frameNo) onFrame(imageBitmap);\n // });\n // } else {\n // const canvas = document.createElement('canvas');\n // const context = canvas.getContext('2d');\n // canvas.width = width;\n // canvas.height = height;\n // context.drawImage(player, 0, 0);\n // cache.framesNew.set(_frameNo, canvas);\n // onFrame(canvas);\n // }\n // };\n\n // // player.requestVideoFrameCallback(callback);\n // // setInterval(callback, CUSTOM_EMOJI_FRAME_INTERVAL);\n }\n\n if(willHaveSyncedPlayer) {\n const dpr = getLottiePixelRatio(this.size.width, this.size.height);\n renderer.canvas.dpr = dpr;\n setRenderInterval();\n }\n });\n\n let syncedPlayer: SyncedPlayer;\n const key = [docId, size.width, size.height].join('-');\n if(willHaveSyncedPlayer) {\n syncedPlayer = syncedPlayers.get(key);\n if(!syncedPlayer) {\n syncedPlayer = {\n player: undefined,\n middlewares: new Set(),\n pausedElements: new Set(),\n key\n };\n\n syncedPlayers.set(key, syncedPlayer);\n }\n\n for(const element of newElements) {\n const middleware = element.middlewareHelper.get();\n syncedPlayer.middlewares.add(middleware);\n middleware.onClean(() => {\n syncedPlayer.middlewares.delete(middleware);\n\n if(!syncedPlayer.middlewares.size) {\n if(syncedPlayer.player) {\n const frame = syncedPlayersFrames.get(syncedPlayer.player);\n if(frame) {\n (frame as ImageBitmap).close?.();\n syncedPlayersFrames.delete(syncedPlayer.player);\n }\n\n syncedPlayersFrames.delete(syncedPlayer.player);\n if(syncedPlayer.player instanceof RLottiePlayer) {\n syncedPlayer.player.overrideRender = noop;\n syncedPlayer.player.remove();\n } else if(syncedPlayer.player instanceof HTMLVideoElement) {\n const cacheName = framesCache.generateName('' + element.docId, 0, 0, undefined, undefined);\n delete videosCache[cacheName];\n }\n\n syncedPlayer.player = undefined;\n }\n\n if(syncedPlayers.get(syncedPlayer.key) === syncedPlayer && syncedPlayers.delete(syncedPlayer.key) && !syncedPlayers.size) {\n clearRenderInterval();\n }\n }\n });\n }\n }\n\n return promise.then((res) => ({...res, ...addition}));\n };\n\n const missing: DocId[] = [];\n const cachedPromises = docs.map((doc, idx) => {\n if(!doc) {\n missing.push(docIds[idx]);\n return;\n }\n\n return wrap(doc, loadPromises);\n }).filter(Boolean);\n\n const uncachedPromisesPromise = !missing.length ?\n Promise.resolve([] as typeof cachedPromises) :\n managers.appEmojiManager.getCustomEmojiDocuments(missing).then((docs) => {\n if(middleware && !middleware()) return [];\n return docs.filter(Boolean).map((doc) => wrap(doc));\n });\n\n const loadFromPromises = (promises: typeof cachedPromises) => {\n return Promise.all(promises).then((arr) => {\n const promises = arr.map(({load, onRender, elements}) => {\n if(!load) {\n return;\n }\n\n const l = () => load().then(onRender);\n\n if(usingOwnQueue) {\n elements.forEach((element) => {\n globalLazyLoadQueue.push({\n div: element,\n load: () => {\n elements.forEach((element) => {\n globalLazyLoadQueue.delete({div: element});\n });\n\n return l();\n }\n });\n });\n } else {\n return l();\n }\n });\n\n return Promise.all(promises);\n });\n };\n\n const load = () => {\n if(middleware && !middleware()) return;\n const cached = loadFromPromises(cachedPromises);\n const uncached = uncachedPromisesPromise.then((promises) => loadFromPromises(promises));\n return Promise.all([cached, uncached]);\n };\n\n if(lazyLoadQueue) {\n lazyLoadQueue.push({\n div: renderer.canvas,\n load\n });\n } else {\n load();\n }\n\n return Promise.all(cachedPromises).then(() => Promise.all(loadPromises)).then(() => {});\n });\n\n // recordPromise(loadPromise, 'render emojis: ' + docIds.length);\n\n return loadPromise;\n }\n\n public static create(options: CustomEmojiRendererElementOptions) {\n const renderer = new CustomEmojiRendererElement();\n renderer.animationGroup = options.animationGroup;\n renderer.size = options.customEmojiSize || mediaSizes.active.customEmoji;\n renderer.isSelectable = options.isSelectable;\n if(options.wrappingDraft) {\n renderer.contentEditable = 'false';\n renderer.style.height = 'inherit';\n }\n // const middleware = () => !!renderer.disconnectedCallback && (!options.middleware || options.middleware());\n let middleware = options.middleware;\n if(middleware) {\n renderer.middlewareHelper = middleware.create();\n middleware = renderer.middlewareHelper.get();\n middleware.onDestroy(() => {\n renderer.destroy?.();\n });\n } else {\n // console.error('no middleware', this, options);\n renderer.auto = true;\n renderer.middlewareHelper = getMiddleware();\n }\n\n return renderer;\n }\n}\n\ntype CustomEmojiRenderer = CustomEmojiRendererElement;\ntype SyncedPlayer = {\n player: RLottiePlayer | HTMLVideoElement,\n middlewares: Set,\n pausedElements: Set,\n key: string\n};\ntype CustomEmojiFrame = Parameters[0] | HTMLVideoElement;\n\nconst CUSTOM_EMOJI_INSTANT_PLAY = true; // do not wait for animationIntersector\nlet emojiRenderInterval: number;\nconst emojiRenderers: Set = new Set();\nconst syncedPlayers: Map = new Map();\nconst syncedPlayersFrames: Map = new Map();\nexport const renderEmojis = (renderers = emojiRenderers) => {\n const r = Array.from(renderers);\n const t = r.filter((r) => r.isConnected && r.checkForAnyFrame() && !r.ignoreSettingDimensions);\n if(!t.length) {\n return false;\n }\n\n const o = t.map((renderer) => {\n const paused = [...renderer.playersSynced.values()].reduce((acc, v) => acc + +!!v.paused, 0);\n if(renderer.playersSynced.size === paused) {\n return;\n }\n\n const offsets = renderer.getOffsets();\n if(offsets.size) {\n return [renderer, offsets] as const;\n }\n }).filter(Boolean);\n\n for(const [renderer] of o) {\n renderer.clearCanvas();\n }\n\n for(const [renderer, offsets] of o) {\n renderer.render(offsets);\n }\n\n return true;\n};\nconst CUSTOM_EMOJI_FPS = 60;\nconst CUSTOM_EMOJI_FRAME_INTERVAL = 1000 / CUSTOM_EMOJI_FPS;\nconst setRenderInterval = () => {\n if(emojiRenderInterval) {\n return;\n }\n\n emojiRenderInterval = window.setInterval(renderEmojis, CUSTOM_EMOJI_FRAME_INTERVAL);\n renderEmojis();\n};\nconst clearRenderInterval = () => {\n if(!emojiRenderInterval) {\n return;\n }\n\n clearInterval(emojiRenderInterval);\n emojiRenderInterval = undefined;\n};\n\n(window as any).syncedPlayers = syncedPlayers;\n(window as any).emojiRenderers = emojiRenderers;\n\ncustomElements.define('custom-emoji-element', CustomEmojiElement);\ncustomElements.define('custom-emoji-renderer-element', CustomEmojiRendererElement);\n\ntype CustomEmojiRendererElementOptions = Partial<{\n loadPromises: Promise[],\n customEmojiRenderer: CustomEmojiRendererElement,\n\n isSelectable: boolean,\n wrappingDraft: boolean\n}> & WrapSomethingOptions;\n\n/**\n * * Expecting correctly sorted nested entities (RichTextProcessor.sortEntities)\n */\nexport default function wrapRichText(text: string, options: Partial<{\n entities: MessageEntity[],\n contextSite: string,\n highlightUsername: string,\n noLinks: boolean,\n noLinebreaks: boolean,\n noCommands: boolean,\n wrappingDraft: boolean,\n // mustWrapEmoji: boolean,\n fromBot: boolean,\n noTextFormat: boolean,\n passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }>,\n noEncoding: boolean,\n isSelectable: boolean,\n\n contextHashtag?: string,\n\n // ! recursive, do not provide\n nasty?: {\n i: number,\n usedLength: number,\n text: string,\n lastEntity?: MessageEntity\n },\n voodoo?: boolean,\n customEmojis?: Map,\n customWraps?: Set,\n}> & CustomEmojiRendererElementOptions = {}) {\n const fragment = document.createDocumentFragment();\n if(!text) {\n return fragment;\n }\n\n const nasty = options.nasty ??= {\n i: 0,\n usedLength: 0,\n text\n };\n\n const wrapSomething = (wrapElement: HTMLElement, noFiller?: boolean) => {\n const element = document.createElement('span');\n // element.append(BOM, a, BOM);\n if(options.wrappingDraft) {\n element.contentEditable = 'false';\n }\n // element.style.display = 'inline-block';\n element.classList.add('input-something');\n element.append(/* BOM, */wrapElement);\n\n (lastElement || fragment).append(element);\n\n wrapElement.classList.add('input-selectable');\n // if(wrapElement instanceof HTMLImageElement) {\n // element.prepend(f());\n // } else {\n !noFiller && wrapElement.append(createCustomFiller(true));\n // }\n\n customWraps.add(element);\n\n return element;\n };\n\n options.isSelectable ||= options.wrappingDraft;\n\n const customEmojis = options.customEmojis ??= new Map() as Map;\n const customWraps = options.customWraps ??= new Set();\n\n const entities = options.entities ??= parseEntities(nasty.text);\n\n const passEntities = options.passEntities ??= {};\n const contextSite = options.contextSite ??= 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const textLength = nasty.text.length;\n const length = entities.length;\n let lastElement: HTMLElement | DocumentFragment;\n for(; nasty.i < length; ++nasty.i) {\n let entity = entities[nasty.i];\n\n // * check whether text was sliced\n // TODO: consider about moving it to other function\n if(entity.offset >= textLength) {\n if(entity._ !== 'messageEntityCaret') { // * can set caret to the end\n continue;\n }\n } else if((entity.offset + entity.length) > textLength) {\n entity = copy(entity);\n // entity.length = entity.offset + entity.length - textLength;\n entity.length = textLength - entity.offset;\n }\n\n if(entity.length) {\n nasty.lastEntity = entity;\n }\n\n let nextEntity = entities[nasty.i + 1];\n\n const startOffset = entity.offset;\n const endOffset = startOffset + entity.length;\n const endPartOffset = Math.min(endOffset, nextEntity?.offset ?? 0xFFFF);\n const fullEntityText = nasty.text.slice(startOffset, endOffset);\n const sliced = nasty.text.slice(startOffset, endPartOffset);\n let partText = sliced;\n\n if(nasty.usedLength < startOffset) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength, startOffset));\n }\n\n if(lastElement) {\n lastElement = fragment;\n }\n\n nasty.usedLength = endPartOffset;\n\n let element: HTMLElement,\n property: 'textContent' | 'alt' = 'textContent',\n usedText = false;\n switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontWeight = 'bold';\n element.style.fontFamily = 'markup-bold';\n } else {\n element = document.createElement('strong');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontStyle = 'italic';\n element.style.fontFamily = 'markup-italic';\n } else {\n element = document.createElement('em');\n }\n }\n\n break;\n }\n\n case 'messageEntityStrike': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n // element.style.cssText = `${styleName}: line-through;`;\n element.style.fontFamily = 'markup-strikethrough';\n } else/* if(!options.noTextFormat) */ {\n element = document.createElement('del');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n // element.style.cssText = `${styleName}: underline;`;\n element.style.fontFamily = 'markup-underline';\n } else if(!options.noTextFormat) {\n element = document.createElement('u');\n }\n\n break;\n }\n\n case 'messageEntityPre':\n case 'messageEntityCode': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n element.style.fontFamily = 'markup-monospace';\n } else if(!options.noTextFormat) {\n element = document.createElement('code');\n }\n\n break;\n }\n\n // case 'messageEntityPre': {\n // if(options.wrappingDraft) {\n // element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n // } else if(!options.noTextFormat) {\n // element = document.createElement('pre');\n // const inner = document.createElement('code');\n // if(entity.language) {\n // inner.className = 'language-' + entity.language;\n // inner.textContent = entityText;\n // usedText = true;\n // }\n // }\n\n // break;\n // }\n\n case 'messageEntityHighlight': {\n element = document.createElement('i');\n element.className = 'text-highlight';\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n let command = fullEntityText.slice(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.slice(atPos + 1);\n command = command.slice(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('tg://bot_command?command=' + encodeURIComponent(command) + (bot ? '&bot=' + encodeURIComponent(bot) : ''));\n if(!contextExternal) {\n element.setAttribute('onclick', 'execBotCommand(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityCustomEmoji': {\n if(!IS_CUSTOM_EMOJI_SUPPORTED) {\n break;\n }\n\n while(nextEntity?._ === 'messageEntityEmoji' && nextEntity.offset < endOffset) {\n ++nasty.i;\n nasty.lastEntity = nextEntity;\n nasty.usedLength += nextEntity.length;\n nextEntity = entities[nasty.i + 1];\n }\n\n const customEmojiElement = element = CustomEmojiElement.create(entity.document_id);\n const {docId} = customEmojiElement;\n let set = customEmojis.get(docId);\n if(!set) customEmojis.set(docId, set = new Set());\n set.add(customEmojiElement);\n customEmojiElement.dataset.stickerEmoji = fullEntityText;\n\n if(options.wrappingDraft) {\n element = document.createElement('img');\n (element as HTMLImageElement).alt = fullEntityText;\n for(const i in customEmojiElement.dataset) {\n element.dataset[i] = customEmojiElement.dataset[i];\n }\n (element as any).customEmojiElement = customEmojiElement;\n customEmojiElement.placeholder = element as HTMLImageElement;\n element.classList.add('custom-emoji-placeholder');\n (element as HTMLImageElement).src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAAtJREFUGFdjYAACAAAFAAGq1chRAAAAAElFTkSuQmCC';\n property = 'alt';\n break;\n }\n\n if(options.isSelectable) {\n // const s = document.createElement('span');\n // s.append(fullEntityText);\n // element.append(s);\n // element.textContent = fullEntityText;\n // element.textContent = 'a';\n // element.contentEditable = 'false';\n\n // const x = f();\n // x.style.display = 'inline-block';\n // x.contentEditable = 'false';\n // (lastElement || fragment).append(BOM);\n // (lastElement || fragment).append(x);\n\n element = wrapSomething(element, !!options.customEmojiRenderer);\n\n // const a = element;\n // element = document.createElement('span');\n // element.append(BOM, a, BOM);\n // element.contentEditable = 'false';\n }\n\n property = 'alt';\n break;\n }\n\n case 'messageEntityEmoji': {\n let isSupported = IS_EMOJI_SUPPORTED;\n if(isSupported) {\n for(const version in EmojiVersions) {\n if(version) {\n const emojiData = EmojiVersions[version as EMOJI_VERSION];\n if(emojiData.hasOwnProperty(entity.unicode) && !EMOJI_VERSIONS_SUPPORTED[version as EMOJI_VERSION]) {\n isSupported = false;\n break;\n }\n }\n }\n }\n\n // if(!(options.wrappingDraft && isSupported)) { // * fix safari emoji\n if(!isSupported) { // no wrapping needed\n // if(isSupported) { // ! contenteditable=\"false\" нужен для поля ввода, иначе там будет меняться шрифт в Safari, или же рендерить смайлик напрямую, без контейнера\n // insertPart(entity, '', '');\n // } else {\n element = document.createElement('img');\n (element as HTMLImageElement).src = `assets/img/emoji/${entity.unicode}.png`;\n property = 'alt';\n element.className = 'emoji';\n\n // if(options.isSelectable) {\n // usedText = true;\n // (element as HTMLImageElement).alt = partText;\n // element = wrapSomething(element);\n // }\n\n // const a = element;\n // a.contentEditable = 'false';\n // element = document.createElement('span');\n // element.append(a);\n // element.contentEditable = 'false';\n // }\n // } else if(options.mustWrapEmoji) {\n } else if(!options.wrappingDraft) {\n element = document.createElement('span');\n element.className = 'emoji';\n }/* else if(!IS_SAFARI) {\n insertPart(entity, '', '');\n } */\n /* if(!isSupported) {\n insertPart(entity, `\"`,`);\n } */\n\n break;\n }\n\n case 'messageEntityCaret': {\n element = document.createElement('span');\n element.className = 'composer-sel';\n break;\n }\n\n // case 'messageEntityLinebreak': {\n // if(options.noLinebreaks) {\n // insertPart(entity, ' ');\n // } else {\n // insertPart(entity, '
');\n // }\n\n // break;\n // }\n\n case 'messageEntityUrl':\n case 'messageEntityTextUrl': {\n if(!(options.noLinks && !passEntities[entity._])) {\n // let inner: string;\n let url: string = (entity as MessageEntity.messageEntityTextUrl).url || fullEntityText;\n let masked = false;\n let onclick: string;\n\n const wrapped = wrapUrl(url, true);\n url = wrapped.url;\n onclick = wrapped.onclick;\n\n if(entity._ === 'messageEntityTextUrl') {\n if(nextEntity?._ === 'messageEntityUrl' &&\n nextEntity.length === entity.length &&\n nextEntity.offset === entity.offset) {\n nasty.lastEntity = nextEntity;\n ++nasty.i;\n }\n\n if(url !== fullEntityText) {\n masked = true;\n }\n } else {\n // inner = encodeEntities(replaceUrlEncodings(entityText));\n }\n\n const currentContext = !!onclick;\n if(!onclick && masked && !currentContext) {\n onclick = 'showMaskedAlert';\n }\n\n if(options.wrappingDraft) {\n onclick = undefined;\n }\n\n const href = (currentContext || typeof electronHelpers === 'undefined') ?\n url :\n `javascript:electronHelpers.openExternal('${url}');`;\n\n element = document.createElement('a');\n element.className = 'anchor-url';\n (element as HTMLAnchorElement).href = href;\n\n if(!(currentContext || typeof electronHelpers !== 'undefined')) {\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n if(onclick) {\n element.setAttribute('onclick', onclick + '(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityEmail': {\n if(!options.noLinks) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('mailto:' + fullEntityText);\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n break;\n }\n\n case 'messageEntityHashtag': {\n const contextUrl = !options.noLinks && SITE_HASHTAGS[contextSite];\n if(contextUrl) {\n const hashtag = fullEntityText.slice(1);\n element = document.createElement('a');\n element.className = 'anchor-hashtag';\n (element as HTMLAnchorElement).href = contextUrl.replace('{1}', encodeURIComponent(hashtag));\n if(contextExternal) {\n setBlankToAnchor(element as HTMLAnchorElement);\n } else {\n element.setAttribute('onclick', 'searchByHashtag(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityMentionName': {\n if(!(options.noLinks && !passEntities[entity._])) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = buildURLHash('' + entity.user_id);\n element.className = 'follow';\n element.dataset.follow = '' + entity.user_id;\n }\n\n break;\n }\n\n case 'messageEntityMention': {\n // const contextUrl = !options.noLinks && siteMentions[contextSite];\n if(!options.noLinks) {\n const username = fullEntityText.slice(1);\n\n element = wrapTelegramUrlToAnchor('t.me/' + username);\n element.className = 'mention';\n\n // insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntitySpoiler': {\n if(options.noTextFormat) {\n const encoded = encodeSpoiler(nasty.text, entity);\n nasty.text = encoded.text;\n partText = encoded.entityText;\n if(endPartOffset !== endOffset) {\n nasty.usedLength += endOffset - endPartOffset;\n }\n let n: MessageEntity;\n for(; n = entities[nasty.i + 1], n && n.offset < endOffset;) {\n // nasty.usedLength += n.length;\n ++nasty.i;\n nasty.lastEntity = n;\n nextEntity = entities[nasty.i + 1];\n }\n } else if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontFamily = 'spoiler';\n element.style.fontFamily = 'markup-spoiler';\n } else {\n const container = document.createElement('span');\n container.className = 'spoiler';\n element = document.createElement('span');\n element.className = 'spoiler-text';\n element.textContent = partText;\n usedText = true;\n container.append(element);\n fragment.append(container);\n\n container[`on${CLICK_EVENT_NAME}`] = (window as any).onSpoilerClick;\n }\n\n break;\n }\n }\n\n if(!usedText && partText) {\n if(element) {\n // @ts-ignore\n element[property] = partText;\n } else {\n (element || fragment).append(partText);\n }\n }\n\n if(element && !element.parentNode) {\n (lastElement || fragment).append(element);\n }\n\n while(nextEntity && nextEntity.offset < endOffset) {\n ++nasty.i;\n\n (element || fragment).append(wrapRichText(nasty.text, {\n ...options,\n voodoo: true\n }));\n\n nextEntity = entities[nasty.i + 1];\n }\n\n // if(!element?.parentNode) {\n // (lastElement || fragment).append(element ?? partText);\n // }\n\n if(nasty.usedLength <= endOffset) {\n if(nasty.usedLength < endOffset) {\n (element || fragment).append(nasty.text.slice(nasty.usedLength, endOffset));\n nasty.usedLength = endOffset;\n }\n\n lastElement = fragment;\n nasty.lastEntity = undefined;\n } else if(entity.length > partText.length && element) {\n lastElement = element;\n } else {\n lastElement = fragment;\n }\n\n if(options.voodoo) {\n return fragment;\n }\n }\n\n if(nasty.lastEntity) {\n nasty.usedLength = nasty.lastEntity.offset + nasty.lastEntity.length;\n }\n\n if(nasty.usedLength < textLength) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength));\n }\n\n if((!options.wrappingDraft || options.customEmojiRenderer) && customEmojis.size) {\n let renderer = options.customEmojiRenderer;\n if(!renderer) {\n renderer = CustomEmojiRendererElement.create(options);\n fragment.prepend(renderer);\n }\n\n const loadPromise = renderer.add(customEmojis, options.lazyLoadQueue, options.wrappingDraft);\n options.loadPromises?.push(loadPromise);\n // recordPromise(loadPromise, 'render emojis: ' + docIds.length);\n }\n\n if(customWraps.size) {\n insertCustomFillers(customWraps);\n }\n\n return fragment;\n}\n\nexport const createCustomFiller = (notFiller?: boolean) => {\n const x = document.createElement('span');\n x.classList.add(notFiller ? 'input-filler2' : 'input-filler');\n x.textContent = BOM;\n return x;\n};\n\nexport function isCustomFillerNeededBySiblingNode(node: ChildNode) {\n if(\n // !node?.textContent ||\n // node.textContent.endsWith('\\n') ||\n node?.textContent !== BOM ||\n (node as HTMLElement)?.getAttribute?.('contenteditable') === 'false'\n ) {\n // if(!node || (node as HTMLElement).firstElementChild || node.textContent.endsWith('\\n')) {\n if(!node || node.textContent !== BOM || (node as HTMLElement).firstElementChild) {\n return 2;\n } else if(node.nodeType === node.ELEMENT_NODE) {\n return 1;\n }/* else if(node.nodeType === node.TEXT_NODE && !node.nodeValue) {\n (node as CharacterData).insertData(0, BOM);\n } */\n }\n\n return 0;\n}\n\nexport function insertCustomFillers(elements: Iterable) {\n const check = (element: HTMLElement, node: ChildNode, method: 'before' | 'after') => {\n const needed = isCustomFillerNeededBySiblingNode(node);\n if(needed === 2) {\n element[method](createCustomFiller());\n } else if(needed === 1) {\n node.appendChild(document.createTextNode(BOM));\n }\n };\n\n for(const element of elements) {\n const {previousSibling, nextSibling} = element;\n check(element, previousSibling, 'before');\n check(element, nextSibling, 'after');\n }\n}\n\n(window as any).wrapRichText = wrapRichText;\n","// just for the future\nexport default function buildURLHash(str: string) {\n return '#' + encodeURIComponent(str);\n}\n","import wrapUrl from './wrapUrl';\n\nexport default function wrapTelegramUrlToAnchor(url1: string) {\n const {url, onclick} = wrapUrl(url1);\n const element = document.createElement('a');\n (element as HTMLAnchorElement).href = url;\n if(onclick) {\n element.setAttribute('onclick', `${onclick}(this)`);\n }\n\n return element;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport EventListenerBase from '../../helpers/eventListenerBase';\n\nexport default class QueryableWorker extends EventListenerBase<{\n ready: () => void,\n frame: (reqId: number, frameNo: number, frame: Uint8ClampedArray | ImageBitmap) => void,\n loaded: (reqId: number, frameCount: number, fps: number) => void,\n error: (reqId: number, error: Error) => void,\n workerError: (error: ErrorEvent) => void\n}> {\n constructor(private worker: Worker) {\n super();\n\n this.worker.onerror = (error) => {\n try {\n this.dispatchEvent('workerError', error);\n this.cleanup();\n this.terminate();\n } catch(err) {\n\n }\n };\n\n this.worker.onmessage = (event) => {\n this.dispatchEvent(event.data.queryMethodListener, ...event.data.queryMethodArguments);\n };\n }\n\n public postMessage(message: any) {\n this.worker.postMessage(message);\n }\n\n public terminate() {\n this.worker.terminate();\n }\n\n public sendQuery(args: any[], transfer?: Transferable[]) {\n this.worker.postMessage({\n queryMethod: args.shift(),\n queryMethodArguments: args\n }, CAN_USE_TRANSFERABLES ? transfer: undefined);\n }\n}\n","const IS_WEB_ASSEMBLY_SUPPORTED = typeof(WebAssembly) !== 'undefined';\n\nexport default IS_WEB_ASSEMBLY_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport pause from '../../helpers/schedulers/pause';\nimport {logger, LogTypes} from '../logger';\nimport RLottiePlayer, {RLottieOptions} from './rlottiePlayer';\nimport QueryableWorker from './queryableWorker';\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport IS_WEB_ASSEMBLY_SUPPORTED from '../../environment/webAssemblySupport';\nimport makeError from '../../helpers/makeError';\nimport App from '../../config/app';\n\nexport type LottieAssetName = 'EmptyFolder' | 'Folders_1' | 'Folders_2' |\n 'TwoFactorSetupMonkeyClose' | 'TwoFactorSetupMonkeyCloseAndPeek' |\n 'TwoFactorSetupMonkeyCloseAndPeekToIdle' | 'TwoFactorSetupMonkeyIdle' |\n 'TwoFactorSetupMonkeyPeek' | 'TwoFactorSetupMonkeyTracking' |\n 'voice_outlined2' | 'voip_filled' | 'voice_mini' | 'jolly_roger';\n\nexport class LottieLoader {\n private loadPromise: Promise = !IS_WEB_ASSEMBLY_SUPPORTED ? Promise.reject() : undefined;\n private loaded = false;\n\n private workersLimit = App.threads;\n private players: {[reqId: number]: RLottiePlayer} = {};\n private playersByCacheName: {[cacheName: string]: Set} = {};\n\n private workers: QueryableWorker[] = [];\n private curWorkerNum = 0;\n\n private log = logger('LOTTIE', LogTypes.Error);\n\n public getAnimation(element: HTMLElement) {\n for(const i in this.players) {\n if(this.players[i].el.includes(element)) {\n return this.players[i];\n }\n }\n\n return null;\n }\n\n public setLoop(loop: boolean) {\n for(const i in this.players) {\n const player = this.players[i];\n player.loop = loop;\n player.autoplay = player._autoplay;\n }\n }\n\n public loadLottieWorkers() {\n if(this.loadPromise) {\n return this.loadPromise;\n }\n\n return this.loadPromise = new Promise((resolve, reject) => {\n let remain = this.workersLimit;\n for(let i = 0; i < this.workersLimit; ++i) {\n const worker = new Worker(new URL('./rlottie.worker.ts', import.meta.url));\n const queryableWorker = this.workers[i] = new QueryableWorker(worker);\n\n queryableWorker.addEventListener('ready', () => {\n this.log('worker #' + i + ' ready');\n\n queryableWorker.addEventListener('frame', this.onFrame);\n queryableWorker.addEventListener('loaded', this.onPlayerLoaded);\n queryableWorker.addEventListener('error', this.onPlayerError);\n\n --remain;\n if(!remain) {\n this.log('workers ready');\n resolve();\n this.loaded = true;\n }\n }, {once: true});\n\n queryableWorker.addEventListener('workerError', (error) => {\n reject('rlottie load error: ' + error.message);\n this.loaded = false;\n }, {once: true});\n }\n });\n }\n\n private makeAssetUrl(name: LottieAssetName) {\n return 'assets/tgs/' + name + '.json';\n }\n\n public loadAnimationAsAsset(params: Omit, name: LottieAssetName) {\n // (params as RLottieOptions).name = name;\n return this.loadAnimationFromURL(params, this.makeAssetUrl(name));\n }\n\n public loadAnimationDataFromURL(url: string): Promise {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return this.loadPromise as any;\n }\n\n this.loadLottieWorkers();\n\n return fetch(url)\n .then((res) => {\n if(!res.headers || res.headers.get('content-type') === 'application/octet-stream') {\n return res.arrayBuffer()\n .then((data) => apiManagerProxy.invokeCrypto('gzipUncompress', data))\n .then((arr) => blobConstruct(arr as Uint8Array, ''));\n } else {\n return res.blob();\n }\n });\n /* .then((str) => {\n return new Promise((resolve) => setTimeout(() => resolve(str), 2e3));\n }) */\n }\n\n public loadAnimationFromURLManually(name: LottieAssetName) {\n const url = this.makeAssetUrl(name);\n return this.loadAnimationDataFromURL(url).then((blob) => {\n return (params: Omit) => this.loadAnimationFromURLNext(blob, params, url);\n });\n }\n\n public loadAnimationFromURL(params: Omit, url: string) {\n return this.loadAnimationDataFromURL(url).then((blob) => {\n return this.loadAnimationFromURLNext(blob, params, url);\n });\n }\n\n public loadAnimationFromURLNext(blob: Blob, params: Omit, url: string) {\n const newParams = Object.assign(params, {animationData: blob, needUpscale: true});\n newParams.name ||= url;\n return this.loadAnimationWorker(newParams);\n }\n\n public waitForFirstFrame(player: RLottiePlayer) {\n return Promise.race([\n /* new Promise((resolve) => {\n player.addEventListener('firstFrame', () => {\n setTimeout(() => resolve(), 1500);\n }, true);\n }) */\n new Promise((resolve) => {\n player.addEventListener('firstFrame', resolve, {once: true});\n }),\n pause(2500)\n ]).then(() => player);\n }\n\n public async loadAnimationWorker(\n params: RLottieOptions,\n group: AnimationItemGroup = params.group || '',\n middleware?: () => boolean\n ): Promise {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return this.loadPromise as any;\n }\n\n if(!this.loaded) {\n await this.loadLottieWorkers();\n }\n\n if(middleware && !middleware()) {\n throw makeError('MIDDLEWARE');\n }\n\n if(params.sync) {\n const cacheName = RLottiePlayer.CACHE.generateName(params.name, params.width, params.height, params.color, params.toneIndex);\n const players = this.playersByCacheName[cacheName];\n if(players?.size) {\n return Promise.resolve(players.entries().next().value[0]);\n }\n }\n\n const containers = Array.isArray(params.container) ? params.container : [params.container];\n if(!params.width || !params.height) {\n params.width = parseInt(containers[0].style.width);\n params.height = parseInt(containers[0].style.height);\n }\n\n if(!params.width || !params.height) {\n throw new Error('No size for sticker!');\n }\n\n params.group = group;\n\n const player = this.initPlayer(containers, params);\n\n animationIntersector.addAnimation(player, group);\n\n return player;\n }\n\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\n const player = this.players[reqId];\n if(!player) {\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\n return;\n }\n\n this.log.debug('onPlayerLoaded');\n player.onLoad(frameCount, fps);\n };\n\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray | ImageBitmap) => {\n const player = this.players[reqId];\n if(!player) {\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\n return;\n }\n\n if(player.clamped !== undefined && frame instanceof Uint8ClampedArray) {\n player.clamped = frame;\n }\n\n player.renderFrame(frame, frameNo);\n };\n\n private onPlayerError = (reqId: number, error: Error) => {\n const player = this.players[reqId];\n if(!player) {\n return;\n }\n\n // ! will need refactoring later, this is not the best way to remove the animation\n const animations = animationIntersector.getAnimations(player.el[0]);\n animations.forEach((animation) => {\n animationIntersector.removeAnimation(animation);\n });\n };\n\n public onDestroy(reqId: number) {\n delete this.players[reqId];\n }\n\n public destroyWorkers() {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return;\n }\n\n this.workers.forEach((worker, idx) => {\n worker.terminate();\n this.log('worker #' + idx + ' terminated');\n });\n\n this.log('workers destroyed');\n this.workers.length = 0;\n this.curWorkerNum = 0;\n this.loaded = false;\n this.loadPromise = undefined;\n }\n\n private initPlayer(el: RLottiePlayer['el'], options: RLottieOptions) {\n const player = new RLottiePlayer({\n el,\n worker: this.workers[this.curWorkerNum++],\n options\n });\n\n const {reqId, cacheName} = player;\n this.players[reqId] = player;\n\n const playersByCacheName = cacheName ? this.playersByCacheName[cacheName] ??= new Set() : undefined;\n if(cacheName) {\n playersByCacheName.add(player);\n }\n\n if(this.curWorkerNum >= this.workers.length) {\n this.curWorkerNum = 0;\n }\n\n player.addEventListener('destroy', () => {\n this.onDestroy(reqId);\n if(playersByCacheName.delete(player) && !playersByCacheName.size) {\n delete this.playersByCacheName[cacheName];\n }\n });\n\n player.loadFromData(options.animationData);\n\n return player;\n }\n}\n\nconst lottieLoader = new LottieLoader();\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\nexport default lottieLoader;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AnimationItemGroup, AnimationItemWrapper} from '../../components/animationIntersector';\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport IS_APPLE_MX from '../../environment/appleMx';\nimport {IS_ANDROID, IS_APPLE_MOBILE, IS_APPLE, IS_SAFARI} from '../../environment/userAgent';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport clamp from '../../helpers/number/clamp';\nimport QueryableWorker from './queryableWorker';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\nimport framesCache, {FramesCache, FramesCacheItem} from '../../helpers/framesCache';\n\nexport type RLottieOptions = {\n container: HTMLElement | HTMLElement[],\n canvas?: HTMLCanvasElement,\n autoplay?: boolean,\n animationData: Blob,\n loop?: RLottiePlayer['loop'],\n width?: number,\n height?: number,\n group?: AnimationItemGroup,\n noCache?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n initFrame?: number, // index\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n name?: string,\n skipFirstFrameRendering?: boolean,\n toneIndex?: number,\n sync?: boolean\n};\n\nexport type RLottieColor = [number, number, number];\n\nexport function getLottiePixelRatio(width: number, height: number, needUpscale?: boolean) {\n let pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1 && !needUpscale) {\n if(width > 90 && height > 90) {\n if(!IS_APPLE && mediaSizes.isMobile) {\n pixelRatio = 1;\n }\n } else if((width > 60 && height > 60) || IS_ANDROID) {\n pixelRatio = Math.max(1.5, pixelRatio - 1.5);\n }\n }\n\n return pixelRatio;\n}\n\nexport default class RLottiePlayer extends EventListenerBase<{\n enterFrame: (frameNo: number) => void,\n ready: () => void,\n firstFrame: () => void,\n cached: () => void,\n destroy: () => void\n}> implements AnimationItemWrapper {\n public static CACHE = framesCache;\n private static reqId = 0;\n\n public reqId = 0;\n public curFrame: number;\n private frameCount: number;\n private fps: number;\n private skipDelta: number;\n public name: string;\n public cacheName: string;\n private toneIndex: number;\n\n private worker: QueryableWorker;\n\n private width = 0;\n private height = 0;\n\n public el: HTMLElement[];\n public canvas: HTMLCanvasElement[];\n private contexts: CanvasRenderingContext2D[];\n\n public paused = true;\n // public paused = false;\n public direction = 1;\n private speed = 1;\n public autoplay = true;\n public _autoplay: boolean; // ! will be used to store original value for settings.stickers.loop\n public loop: number | boolean = true;\n private _loop: RLottiePlayer['loop']; // ! will be used to store original value for settings.stickers.loop\n public group: AnimationItemGroup = '';\n\n private frInterval: number;\n private frThen: number;\n private rafId: number;\n\n // private caching = false;\n // private removed = false;\n\n private cache: FramesCacheItem;\n private imageData: ImageData;\n public clamped: Uint8ClampedArray;\n private cachingDelta = 0;\n\n private initFrame: number;\n private color: RLottieColor;\n private inverseColor: RLottieColor;\n\n public minFrame: number;\n public maxFrame: number;\n\n private playedTimes = 0;\n\n private currentMethod: RLottiePlayer['mainLoopForwards'] | RLottiePlayer['mainLoopBackwards'];\n private frameListener: (currentFrame: number) => void;\n private skipFirstFrameRendering: boolean;\n private playToFrameOnFrameCallback: (frameNo: number) => void;\n\n public overrideRender: (frame: ImageData | HTMLCanvasElement | ImageBitmap) => void;\n private renderedFirstFrame: boolean;\n\n private raw: boolean;\n\n constructor({el, worker, options}: {\n el: RLottiePlayer['el'],\n worker: QueryableWorker,\n options: RLottieOptions\n }) {\n super(true);\n\n this.reqId = ++RLottiePlayer['reqId'];\n this.el = el;\n this.worker = worker;\n\n for(const i in options) {\n if(this.hasOwnProperty(i)) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n this._loop = this.loop;\n this._autoplay = this.autoplay;\n\n // ! :(\n this.initFrame = options.initFrame;\n this.color = options.color;\n this.inverseColor = options.inverseColor;\n this.name = options.name;\n this.skipFirstFrameRendering = options.skipFirstFrameRendering;\n this.toneIndex = options.toneIndex;\n this.raw = this.color !== undefined;\n\n if(this.name) {\n this.cacheName = RLottiePlayer.CACHE.generateName(this.name, this.width, this.height, this.color, this.toneIndex);\n }\n\n // * Skip ratio (30fps)\n let skipRatio: number;\n if(options.skipRatio !== undefined) skipRatio = options.skipRatio;\n else if((IS_ANDROID || IS_APPLE_MOBILE || (IS_APPLE && !IS_SAFARI && !IS_APPLE_MX)) && this.width < 100 && this.height < 100 && !options.needUpscale) {\n skipRatio = 0.5;\n }\n\n this.skipDelta = skipRatio !== undefined ? 1 / skipRatio | 0 : 1;\n\n // options.needUpscale = true;\n\n // * Pixel ratio\n const pixelRatio = getLottiePixelRatio(this.width, this.height, options.needUpscale);\n\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n\n // options.noCache = true;\n\n // * Cache frames params\n if(!options.noCache/* && false */) {\n // проверка на размер уже после скейлинга, сделано для попапа и сайдбара, где стикеры 80х80 и 68х68, туда нужно 75%\n if(IS_APPLE && this.width > 100 && this.height > 100) {\n this.cachingDelta = 2; // 2 // 50%\n } else if(this.width < 100 && this.height < 100) {\n this.cachingDelta = Infinity; // 100%\n } else {\n this.cachingDelta = 4; // 75%\n }\n }\n\n // this.cachingDelta = Infinity;\n // this.cachingDelta = 0;\n // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n if(!this.canvas) {\n this.canvas = this.el.map(() => {\n const canvas = document.createElement('canvas');\n canvas.classList.add('rlottie');\n canvas.width = this.width;\n canvas.height = this.height;\n canvas.dpr = pixelRatio;\n return canvas;\n });\n }\n\n this.contexts = this.canvas.map((canvas) => canvas.getContext('2d'));\n\n if(!IS_IMAGE_BITMAP_SUPPORTED || this.raw) {\n this.imageData = new ImageData(this.width, this.height);\n\n if(CAN_USE_TRANSFERABLES) {\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n }\n\n if(this.name) {\n this.cache = RLottiePlayer.CACHE.getCache(this.cacheName);\n } else {\n this.cache = FramesCache.createCache();\n }\n }\n\n public clearCache() {\n if(this.cachingDelta === Infinity) {\n return;\n }\n\n if(this.cacheName && this.cache.counter > 1) { // skip clearing because same sticker can be still visible\n return;\n }\n\n this.cache.clearCache();\n }\n\n public sendQuery(args: any[], transfer?: Transferable[]) {\n this.worker.sendQuery([args.shift(), this.reqId, ...args], transfer);\n }\n\n public loadFromData(data: RLottieOptions['animationData']) {\n this.sendQuery(['loadFromData', data, this.width, this.height, this.toneIndex, this.color !== undefined/* , this.canvas.transferControlToOffscreen() */]);\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n this.setMainLoop();\n }\n\n public pause(clearPendingRAF = true) {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n if(clearPendingRAF) {\n clearTimeout(this.rafId);\n this.rafId = undefined;\n }\n // window.cancelAnimationFrame(this.rafId);\n }\n\n private resetCurrentFrame() {\n return this.curFrame = this.initFrame ?? (this.direction === 1 ? this.minFrame : this.maxFrame);\n }\n\n public stop(renderFirstFrame = true) {\n this.pause();\n\n const curFrame = this.resetCurrentFrame();\n if(renderFirstFrame) {\n this.requestFrame(curFrame);\n // this.sendQuery('renderFrame', this.curFrame);\n }\n }\n\n public restart() {\n this.stop(false);\n this.play();\n }\n\n public setSpeed(speed: number) {\n if(this.speed === speed) {\n return;\n }\n\n this.speed = speed;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public setDirection(direction: number) {\n if(this.direction === direction) {\n return;\n }\n\n this.direction = direction;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public remove() {\n this.pause();\n this.sendQuery(['destroy']);\n if(this.cacheName) RLottiePlayer.CACHE.releaseCache(this.cacheName);\n this.dispatchEvent('destroy');\n this.cleanup();\n }\n\n private applyColor(frame: Uint8ClampedArray) {\n const [r, g, b] = this.color;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] !== 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n }\n }\n }\n\n private applyInversing(frame: Uint8ClampedArray) {\n const [r, g, b] = this.inverseColor;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] === 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n frame[i + 3] = 255;\n } else {\n frame[i + 3] = 0;\n }\n }\n }\n\n public renderFrame2(frame: Uint8ClampedArray | HTMLCanvasElement | ImageBitmap, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\n if(frame instanceof Uint8ClampedArray) {\n if(this.color) {\n this.applyColor(frame);\n }\n\n if(this.inverseColor) {\n this.applyInversing(frame);\n }\n\n this.imageData.data.set(frame);\n }\n\n // this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n this.contexts.forEach((context, idx) => {\n let cachedSource: HTMLCanvasElement | ImageBitmap = this.cache.framesNew.get(frameNo);\n if(!(frame instanceof Uint8ClampedArray)) {\n cachedSource = frame;\n } else if(idx > 0) {\n cachedSource = this.canvas[0];\n }\n\n if(!cachedSource) {\n // console.log('drawing from data');\n const c = document.createElement('canvas');\n c.width = context.canvas.width;\n c.height = context.canvas.height;\n c.getContext('2d').putImageData(this.imageData, 0, 0);\n this.cache.framesNew.set(frameNo, c);\n cachedSource = c;\n }\n\n if(this.overrideRender && this.renderedFirstFrame) {\n this.overrideRender(cachedSource || this.imageData);\n } else if(cachedSource) {\n // console.log('drawing from canvas');\n context.clearRect(0, 0, cachedSource.width, cachedSource.height);\n context.drawImage(cachedSource, 0, 0);\n } else {\n context.putImageData(this.imageData, 0, 0);\n }\n\n if(!this.renderedFirstFrame) {\n this.renderedFirstFrame = true;\n }\n });\n\n this.dispatchEvent('enterFrame', frameNo);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n }\n }\n\n public renderFrame(frame: Parameters[0], frameNo: number) {\n const canCacheFrame = this.cachingDelta && (frameNo % this.cachingDelta || !frameNo);\n if(canCacheFrame) {\n if(frame instanceof Uint8ClampedArray && !this.cache.frames.has(frameNo)) {\n this.cache.frames.set(frameNo, new Uint8ClampedArray(frame));// frame;\n } else if(IS_IMAGE_BITMAP_SUPPORTED && frame instanceof ImageBitmap && !this.cache.framesNew.has(frameNo)) {\n this.cache.framesNew.set(frameNo, frame);\n }\n }\n\n /* if(!this.listenerResults.hasOwnProperty('cached')) {\n this.setListenerResult('enterFrame', frameNo);\n if(frameNo === (this.frameCount - 1)) {\n this.setListenerResult('cached');\n }\n\n return;\n } */\n\n if(this.frInterval) {\n const now = Date.now(), delta = now - this.frThen;\n\n if(delta < 0) {\n const timeout = this.frInterval > -delta ? -delta % this.frInterval : this.frInterval;\n if(this.rafId) clearTimeout(this.rafId);\n this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, timeout);\n // await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n return;\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n const frame = this.cache.frames.get(frameNo);\n const frameNew = this.cache.framesNew.get(frameNo);\n if(frameNew) {\n this.renderFrame(frameNew, frameNo);\n } else if(frame) {\n this.renderFrame(frame, frameNo);\n } else {\n if(this.clamped && !this.clamped.length) { // fix detached\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n\n this.sendQuery(['renderFrame', frameNo], this.clamped ? [this.clamped.buffer] : undefined);\n }\n }\n\n private onLap() {\n if(++this.playedTimes === this.loop) {\n this.loop = false;\n }\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\n\n return true;\n }\n\n private mainLoopForwards() {\n const {skipDelta, maxFrame} = this;\n const frame = (this.curFrame + skipDelta) > maxFrame ? this.curFrame = (this.loop ? this.minFrame : this.maxFrame) : this.curFrame += skipDelta;\n // console.log('mainLoopForwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame + skipDelta) > maxFrame) {\n return this.onLap();\n }\n\n return true;\n }\n\n private mainLoopBackwards() {\n const {skipDelta, minFrame} = this;\n const frame = (this.curFrame - skipDelta) < minFrame ? this.curFrame = (this.loop ? this.maxFrame : this.minFrame) : this.curFrame -= skipDelta;\n // console.log('mainLoopBackwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame - skipDelta) < minFrame) {\n return this.onLap();\n }\n\n return true;\n }\n\n public setMainLoop() {\n // window.cancelAnimationFrame(this.rafId);\n clearTimeout(this.rafId);\n this.rafId = undefined;\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n\n // console.trace('setMainLoop', this.frInterval, this.direction, this, JSON.stringify(this.listenerResults), this.listenerResults);\n\n const method = (this.direction === 1 ? this.mainLoopForwards : this.mainLoopBackwards).bind(this);\n this.currentMethod = method;\n // this.frameListener && this.removeListener('enterFrame', this.frameListener);\n\n // setTimeout(() => {\n // this.addListener('enterFrame', this.frameListener);\n // }, 0);\n\n if(this.frameListener) {\n const lastResult = this.listenerResults.enterFrame;\n if(lastResult !== undefined) {\n this.frameListener(this.curFrame);\n }\n }\n\n // this.mainLoop(method);\n // this.r(method);\n // method();\n }\n\n public playPart(options: {\n from: number,\n to: number,\n callback?: () => void\n }) {\n this.pause();\n\n const {from, to, callback} = options;\n this.curFrame = from - 1;\n\n return this.playToFrame({\n frame: to,\n direction: to > from ? 1 : -1,\n callback\n });\n }\n\n public playToFrame(options: {\n frame: number,\n speed?: number,\n direction?: number,\n callback?: () => void\n }) {\n this.pause();\n\n const {frame, speed, callback, direction} = options;\n this.setDirection(direction === undefined ? this.curFrame > frame ? -1 : 1 : direction);\n speed !== undefined && this.setSpeed(speed);\n\n const bounds = [this.curFrame, frame];\n if(this.direction === -1) bounds.reverse();\n\n this.loop = false;\n this.setMinMax(bounds[0], bounds[1]);\n\n if(this.playToFrameOnFrameCallback) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n if(callback) {\n this.playToFrameOnFrameCallback = (frameNo: number) => {\n if(frameNo === frame) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n callback();\n }\n };\n\n this.addEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n this.play();\n }\n\n public setColor(color: RLottieColor, renderIfPaused: boolean) {\n this.color = color;\n\n if(renderIfPaused && this.paused) {\n this.renderFrame2(this.imageData.data, this.curFrame);\n }\n }\n\n public setInverseColor(color: RLottieColor) {\n this.inverseColor = color;\n }\n\n private setMinMax(minFrame = 0, maxFrame = this.frameCount - 1) {\n this.minFrame = minFrame;\n this.maxFrame = maxFrame;\n }\n\n public async onLoad(frameCount: number, fps: number) {\n this.frameCount = frameCount;\n this.fps = fps;\n this.setMinMax();\n if(this.initFrame !== undefined) {\n this.initFrame = clamp(this.initFrame, this.minFrame, this.maxFrame);\n }\n\n const curFrame = this.resetCurrentFrame();\n\n // * Handle 30fps stickers if 30fps set\n if(this.fps < 60 && this.skipDelta !== 1) {\n const diff = 60 / fps;\n this.skipDelta = this.skipDelta / diff | 0;\n }\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n // this.sendQuery('renderFrame', 0);\n\n // Кешировать сразу не получится, рендер стикера (тайгер) занимает 519мс,\n // если рендерить 75% с получением каждого кадра из воркера, будет 475мс, т.е. при 100% было бы 593мс, потеря на передаче 84мс.\n\n /* console.time('cache' + this.reqId);\n for(let i = 0; i < frameCount; ++i) {\n //if(this.removed) return;\n\n if(i % 4) {\n await new Promise((resolve) => {\n delete this.listenerResults.enterFrame;\n this.addListener('enterFrame', resolve, true);\n this.requestFrame(i);\n });\n }\n }\n\n console.timeEnd('cache' + this.reqId); */\n // console.log('cached');\n /* this.el.innerHTML = '';\n this.el.append(this.canvas);\n return; */\n\n !this.skipFirstFrameRendering && this.requestFrame(curFrame);\n this.dispatchEvent('ready');\n this.addEventListener('enterFrame', () => {\n this.dispatchEvent('firstFrame');\n\n if(!this.canvas[0].parentNode && this.el && !this.overrideRender) {\n this.el.forEach((container, idx) => container.append(this.canvas[idx]));\n }\n\n // console.log('enterFrame firstFrame');\n\n // let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused || !this.currentMethod) {\n return;\n }\n\n const time = Date.now();\n // console.log(`enterFrame handle${this.reqId}`, time, (time - lastTime), this.frInterval);\n /* if(Math.round(time - lastTime + this.frInterval * 0.25) < Math.round(this.frInterval)) {\n return;\n } */\n\n // lastTime = time;\n\n this.frThen = time + this.frInterval;\n const canContinue = this.currentMethod();\n if(!canContinue && !this.loop && this.autoplay) {\n this.autoplay = false;\n }\n };\n\n this.addEventListener('enterFrame', this.frameListener);\n // setInterval(this.frameListener, this.frInterval);\n\n // ! fix autoplaying since there will be no animationIntersector for it\n if(this.group === 'none' && this.autoplay) {\n this.play();\n }\n }, {once: true});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Page from './page';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport {horizontalMenu} from '../components/horizontalMenu';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport fastSmoothScroll from '../helpers/fastSmoothScroll';\nimport whichChild from '../helpers/dom/whichChild';\n\nclass PagesManager {\n private pageId = -1;\n private page: Page;\n\n private selectTab: ReturnType;\n public pagesDiv: HTMLDivElement;\n public scrollableDiv: HTMLElement;\n\n constructor() {\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\n if(this.page?.onShown) {\n this.page.onShown();\n }\n });\n }\n\n public setPage(page: Page) {\n if(page.isAuthPage) {\n this.pagesDiv.style.display = '';\n\n const id = whichChild(page.pageEl);\n if(this.pageId === id) return;\n\n this.selectTab(id);\n\n if(this.pageId !== -1 && id > 1) {\n lottieLoader.loadLottieWorkers();\n }\n\n\n this.pageId = id;\n\n if(this.scrollableDiv) {\n fastSmoothScroll({\n container: this.scrollableDiv,\n element: this.scrollableDiv.firstElementChild as HTMLElement,\n position: 'start'\n });\n }\n } else {\n this.pagesDiv.style.display = 'none';\n page.pageEl.style.display = '';\n\n this.pageId = -1;\n }\n\n this.page = page;\n }\n}\n\nconst pagesManager = new PagesManager();\nMOUNT_CLASS_TO.pagesManager = pagesManager;\nexport default pagesManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pagesManager from './pagesManager';\n\nexport default class Page {\n public pageEl: HTMLDivElement;\n private installed = false;\n\n constructor(\n className: string,\n public isAuthPage: boolean,\n private onFirstMount?: (...args: any[]) => Promise | void,\n private onMount?: (...args: any[]) => Promise | void,\n public onShown?: () => void\n ) {\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\n }\n\n public async mount(...args: any[]) {\n // this.pageEl.style.display = '';\n\n if(this.onMount) {\n const res = this.onMount(...args);\n if(res instanceof Promise) {\n await res;\n }\n }\n\n if(!this.installed) {\n if(this.onFirstMount) {\n try {\n const res = this.onFirstMount(...args);\n if(res instanceof Promise) {\n await res;\n }\n } catch(err) {\n console.error('PAGE MOUNT ERROR:', err);\n }\n }\n\n this.installed = true;\n }\n\n pagesManager.setPage(this);\n }\n}\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\n\nexport function encodeEmoji(emojiText: string) {\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\n return codepoints;\n}\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\n\nexport function toCodePoints(unicodeSurrogates: string): Array {\n const points = [];\n let char = 0;\n let previous = 0;\n let i = 0;\n while(i < unicodeSurrogates.length) {\n char = unicodeSurrogates.charCodeAt(i++);\n if(previous) {\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\n previous = 0;\n } else if(char > 0xd800 && char <= 0xdbff) {\n previous = char;\n } else {\n points.push(char.toString(16));\n }\n }\n\n if(points.length && points[0].length === 2) {\n points[0] = '00' + points[0];\n }\n\n return points;\n}\n\nexport function getEmojiToneIndex(input: string) {\n const match = input.match(/[\\uDFFB-\\uDFFF]/);\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\n}\n\nconst VIRTUAL_COUNTRIES_EMOJIS: Map = new Map([\n ['FT', '🏴‍☠']\n]);\n\nexport function getCountryEmoji(iso2: string) {\n return VIRTUAL_COUNTRIES_EMOJIS.get(iso2) ??\n String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\n}\n\nexport function emojiFromCodePoints(codePoints: string) {\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n}\n","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.Recorder=t():e.Recorder=t()}(\"undefined\"!=typeof self?self:this,(function(){return function(e){var t={};function o(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var n in e)o.d(i,n,function(t){return e[t]}.bind(null,n));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\"a\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\"\",o(o.s=0)}([function(e,t,o){\"use strict\";(function(t){var o=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error(\"Recording is not supported in this browser\");e||(e={}),this.state=\"inactive\",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:\"encoderWorker.min.js\",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return o&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if(\"recording\"===this.state){for(var t=[],o=0;o{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,o)=>{var i=o=>{switch(o.data.message){case\"ready\":t();break;case\"page\":this.encodedSamplePosition=o.data.samplePosition,e(o.data.page);break;case\"done\":this.encoder.removeEventListener(\"message\",i),this.finish()}};this.encoder.addEventListener(\"message\",i),this.encoder.postMessage(Object.assign({command:\"init\",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if(\"recording\"===this.state){if(this.state=\"paused\",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,o)=>{var i=o=>{\"flushed\"===o.data.message&&(t.removeEventListener(\"message\",i),this.onpause(),e())};t.addEventListener(\"message\",i),t.postMessage({command:\"flush\"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){\"paused\"===this.state&&(this.state=\"recording\",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if(\"inactive\"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then(()=>this.initSourceNode(e)).then(e=>{this.sourceNode=e,this.state=\"recording\",this.onstart(),this.encoder.postMessage({command:\"getHeaderPages\"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if(\"inactive\"!==this.state){this.state=\"inactive\",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var o=i=>{\"done\"===i.data.message&&(e.removeEventListener(\"message\",o),t())};e.addEventListener(\"message\",o),e.postMessage({command:\"done\"}),this.config.reuseWorker||e.postMessage({command:\"close\"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){\"inactive\"===this.state&&this.encoder&&(this.encoder.postMessage({command:\"close\"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function(\"return this\")()}catch(e){\"object\"==typeof window&&(o=window)}e.exports=o}])}));","/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\n */\n\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\nvar NEWTON_ITERATIONS = 4;\nvar NEWTON_MIN_SLOPE = 0.001;\nvar SUBDIVISION_PRECISION = 0.0000001;\nvar SUBDIVISION_MAX_ITERATIONS = 10;\n\nvar kSplineTableSize = 11;\nvar kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\nvar float32ArraySupported = typeof Float32Array === 'function';\n\nfunction A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }\nfunction B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }\nfunction C (aA1) { return 3.0 * aA1; }\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }\n\nfunction binarySubdivide (aX, aA, aB, mX1, mX2) {\n var currentX, currentT, i = 0;\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) {\n aB = currentT;\n } else {\n aA = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n return currentT;\n}\n\nfunction newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {\n for (var i = 0; i < NEWTON_ITERATIONS; ++i) {\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n if (currentSlope === 0.0) {\n return aGuessT;\n }\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n}\n\nfunction LinearEasing (x) {\n return x;\n}\n\nmodule.exports = function bezier (mX1, mY1, mX2, mY2) {\n if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range');\n }\n\n if (mX1 === mY1 && mX2 === mY2) {\n return LinearEasing;\n }\n\n // Precompute samples table\n var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n for (var i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n }\n\n function getTForX (aX) {\n var intervalStart = 0.0;\n var currentSample = 1;\n var lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n --currentSample;\n\n // Interpolate to provide an initial guess for t\n var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n var guessForT = intervalStart + dist * kSampleStepSize;\n\n var initialSlope = getSlope(guessForT, mX1, mX2);\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n } else if (initialSlope === 0.0) {\n return guessForT;\n } else {\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n }\n }\n\n return function BezierEasing (x) {\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n if (x === 0 || x === 1) {\n return x;\n }\n return calcBezier(getTForX(x), mY1, mY2);\n };\n};\n"],"names":["animationIntersector","constructor","this","observer","IntersectionObserver","entries","entry","target","group","byGroups","intersectionLockedGroups","animation","find","p","el","isIntersecting","visible","add","checkAnimation","delete","_animation","clearCache","Set","overrideIdleGroups","byPlayer","Map","lockedGroups","onlyOnePlayableGroup","videosLocked","doc","type","checkAnimations2","idle","setOverrideIdleGroup","override","getAnimations","element","found","player","push","removeAnimation","remove","HTMLVideoElement","IS_SAFARI","setTimeout","src","load","length","unobserve","removeAnimationByPlayer","item","get","addAnimation","observeElement","controlled","has","canvas","placeholder","HTMLElement","loop","observe","set","checkAnimations","blurred","destroy","imitateIntersection","undefined","groups","Object","keys","animations","paused","pause","autoplay","play","getOnlyOnePlayableGroup","setOnlyOnePlayableGroup","lockGroup","unlockGroup","refreshGroup","forEach","lockIntersectionGroup","unlockIntersectionGroup","toggleIntersectionGroup","lock","SHOULD_USE_SAFARI_FIX","navigator","userAgent","match","err","AppMediaPlaybackController","media","scheduled","mediaDetails","waitingMediaForLoad","waitingScheduledMediaForLoad","waitingDocumentsForLoad","playbackRates","voice","video","audio","seekBackward","details","playingMedia","currentTime","Math","max","seekOffset","seekForward","min","duration","seekTo","seekTime","onMediaDocumentLoad","managers","appDocsManager","getDoc","docId","supportsStreaming","handleSafariStreamable","cacheContext","thumbsStorage","getCacheContext","url","playbackRate","id","size","onPlay","e","peerId","mid","pip","message","getMessageByMedia","stop","setMedia","verify","listLoader","current","getCurrent","jumpLength","withOtherSide","previous","getPrevious","idx","findIndex","getNext","go","setTargets","dispatchEvent","getPlayingDetails","pauseMediaInOtherTabs","onPause","onEnded","isTrusted","lockedSwitchers","round","next","toggle","clean","s","isScheduled","storage","playingMediaType","playItem","searchContext","getMedia","resolveWaitingForLoadMedia","dispatchJump","goRound","browserPlay","bindBrowserCallback","browserPause","browserStop","browserSeekBackward","browserSeekForward","browserSeekTo","browserNext","browserPrevious","seekToStart","construct","container","document","createElement","style","cssText","body","append","mediaSession","actions","seekbackward","seekforward","seekto","previoustrack","nexttrack","action","setActionHandler","console","warn","skipMediaPlayEvent","properties","key","_key","value","dispatchPlaybackParams","defineProperties","getPlaybackParams","volume","muted","setPlaybackParams","params","_volume","_muted","_playbackRate","_loop","_round","addMedia","autoload","pFlags","is_scheduled","setAttribute","addEventListener","media_unread","fromId","appMessagesManager","readMessages","once","deferred","resolve","w","waitingStorage","then","promise","isSafariBuffering","safariBuffering","setSafariBuffering","setNewMediadata","pictureInPictureElement","artwork","isVoice","title","artist","thumbs","bytes","sizes","h","thumb","appPeersManager","getPeerPhoto","plainText","onlyFirstName","attribute","attributes","_","file_name","performer","IS_APPLE","metadata","MediaMetadata","setCurrentMediadata","playbackParams","cb","willBePlayed","willBePlayedMedia","setSearchContext","context","getSearchContext","prev","reset","loadCount","loadWhenLeft","processItem","onJump","older","onEmptied","reverse","folderId","getPlaybackMediaTypeFromMessage","mediaType","setSingleMedia","wasPlaying","toggleSwitchers","playPaused","removeEventListener","enabled","setPictureInPicture","listenerSetter","removeAll","appMediaPlaybackController","AppMediaViewer","captionTimeout","super","isForDocument","inputFilter","isMediaCompatibleForDocumentViewer","onPrevClick","openMedia","getMessageByPeer","onNextClick","onDeleteClick","content","close","onForwardClick","onAuthorClick","Number","MAX_SAFE_INTEGER","threadId","tab","lastMsgId","onDownloadClick","queueId","caption","classList","setCaptionTimeout","clearTimeout","window","onAdditionalScroll","wholeDiv","buttons","btnMenuForward","icon","text","onClick","btnMenuDownload","btnMenuDelete","setBtnMenuToggle","setListeners","forward","author","onCaptionClick","a","spoiler","HTMLAnchorElement","contains","onclick","getAttribute","includes","capture","click","getScheduledMessageByPeer","setCaption","html","entities","totalEntities","firstElementChild","fromRight","prevTargets","nextTargets","setMoverPromise","fwd_from","from_name","noForwards","isServiceMessage","cantForwardMessage","canForward","cantDownloadMessage","download","canDeleteMessage","hide","button","_openMedia","date","static","mime_type","VideoPlayer","streamable","onPlaybackRackMenuToggle","onPip","onPipClose","wrapper","setup","canHideControls","playbackRateButton","showOnLeaveToClassName","ignoreClickClassName","parentNode","insertBefore","appendChild","skin","stylePlayer","controls","querySelector","progress","prepend","catch","name","finally","initDuration","buildControls","timeDuration","insertAdjacentHTML","pipButton","querySelectorAll","fullScreenButton","timeElapsed","textContent","toHHMMSS","volumeSelector","leftControls","btn","parentElement","Array","from","togglePlay","requestPictureInPicture","visibility","debounceTime","debouncedPip","debounce","listener","timeout","overlayCounter","code","good","toggleFullScreen","altKey","nextIdx","PLAYBACK_RATES","indexOf","cancelEvent","onFullScreen","bind","hideControls","showControls","setPlaybackRateIcon","onMediaLoad","IS_MOBILE","pictureInPictureEnabled","map","rate","regularText","btnMenu","onOpen","onClose","PLAYBACK_RATES_ICONS","className","IS_APPLE_MOBILE","webkitEnterFullscreen","enterFullscreen","isFull","cleanup","removeListeners","MEDIA_VIEWER_CLASSNAME","AppMediaViewerBase","topButtons","tempId","preloader","preloaderStreamable","isFirstOpen","pageEl","getElementById","zoomElements","zoomSwipeStartX","zoomSwipeStartY","zoomSwipeX","zoomSwipeY","setZoomValue","rangeSelector","moversContainer","transform","btnOut","btnIn","toggleZoom","setMoverAnimationPromise","tagName","highlightSwitchersTimeout","isZooming","mover","classNames","findUpClassName","onKeyDown","ctrlKeyDown","changeZoom","ctrlKey","metaKey","onKeyUp","onWheel","scrollingUp","deltaY","rootScope","log","logger","cancelable","lazyLoadQueue","overlaysDiv","mainDiv","topbar","topbarLeft","onlyMobile","authorRight","avatarEl","nameEl","buttonsDiv","concat","noRipple","zoom","step","withTransition","setHandlers","onScrub","onMouseUp","main","innerHTML","onLoadedMore","setNewMover","moveLength","onSwipe","xDiff","yDiff","abs","windowSize","verifyTouchTarget","evt","enable","isVisible","mousedown","zoomValue","setProgress","videoPlayer","lockControls","zoomSwipeHandler","lastDiffX","lastDiffY","multiplier","onFirstSwipe","onReset","cursor","addProgress","btnMenuToggle","buttonOptions","direction","Promise","reject","navigationItem","appNavigationController","clear","setMoverToTarget","onAnimationEnd","appMediaViewer","removeGlobalListeners","toggleOverlay","active","toggleGlobalListeners","setGlobalListeners","passive","closing","removeCenterFromMover","wasActive","delay","realParent","rect","getBoundingClientRect","SVGImageElement","SVGForeignObjectElement","left","needOpacity","overflowElement","visibleRect","getVisibleRect","overflow","vertical","horizontal","containerRect","top","aspecter","width","HTMLImageElement","setFullAspect","offsetLeft","height","scaleX","scaleY","borderRadius","getComputedStyle","getPropertyValue","brSplitted","str","splitted","split","i","fillPropertyValue","r","parseInt","join","willBeLeft","willBeTop","path","opacity","isOut","ret","isFulfilled","isRejected","SVGSVGElement","sizeTailPath","toggleWholeActive","mediaElement","selector","queryFrom","matches","elements","pop","getContext","naturalWidth","naturalHeight","videoWidth","videoHeight","HTMLCanvasElement","drawImage","image","Image","createVideo","clipId","dataset","newClipId","newSvg","createElementNS","setAttributeNS","outerHTML","replace","lastElementChild","defs","use","SVGUseElement","d","getAttributeNS","x","y","sX","sY","br","v","generatePathData","foreignObject","renderImageFromUrl","display","proportion","upscale","start","Date","now","diff","_br","moveTheMover","toLeft","windowW","newTransform","p1","newMover","updateMediaSource","toLowerCase","setAuthorInfo","timestamp","isPeerId","wrapTitlePromise","dialog","wrapEmojiText","oldAvatar","newAvatar","cloneNode","all","updateWithOptions","peerTitle","replaceContent","replaceWith","setAuthorPromise","isDocument","isVideo","useContainerAsTarget","IS_MOBILE_SAFARI","onPop","canAnimate","maxWidth","padding","windowH","mediaSizes","maxHeight","thumbPromise","setAttachmentSize","photoSize","img","downloaded","gotThumb","getStrippedThumbIfNeeded","loadPromise","useController","div","moverVideo","canPlayThrough","createPlayer","ckin","overlay","open","otherMediaViewer","releaseSingleMedia","show","readyState","HAVE_FUTURE_DATA","attach","attachCanPlay","detach","loading","networkState","NETWORK_LOADING","isntEnoughData","unshift","appDownloadManager","toast","langPackKey","error","cancellablePromise","attachPromise","imgs","haveImage","setManual","onPopState","hash","location","state","debug","isPossibleSwipe","currentHash","overriddenHash","overrideHash","onHashChange","pushState","navigations","manual","handleItem","onEscape","back","onTouchStart","touches","options","history","scrollRestoration","replaceState","pushItem","noBlurOnPop","findItemByType","index","backByItem","splice","onItemAdded","noHistory","unshiftItem","spliceItems","items","origin","pathname","search","removeItem","removeByType","single","SearchGroup","clearable","clickable","autonomous","onFound","noIcons","list","setActive","childElementCount","AppSearch","searchInput","searchGroups","onSearch","minMsgId","loadedCount","foundCount","searchPromise","searchTimeout","query","listsContainer","scrollable","messages","setVirtualContainer","onChange","searchMore","onScrolledBottom","trim","beginSearch","inputField","input","focus","maxId","limit","res","count","shift","searchGroup","avatarSize","meAsSaved","SearchContextMenu","attachTo","searchSuper","onGotoClick","appImManager","selection","isSelecting","selectionForwardBtn","onSelectClick","toggleByElement","onClearSelectionClick","cancelSelection","selectionDeleteBtn","attachContextMenuListener","init","MouseEvent","preventDefault","cancelBubble","toPeerId","isSelected","isMidSelected","withSelection","positionMenu","contextMenuController","AppSearchSuper","tabs","prevTabId","middleware","historyStorage","usedFromHistory","loadMutex","nextRates","loadPromises","loaded","loadedChats","firstLoad","monthContainers","mediaTabsMap","asChatList","groupByMonth","hideEmptyTabs","showSender","onTransitionStart","onTransitionEnd","safeAssign","searchContextMenu","navScrollableContainer","navScrollable","nav","tabsMenu","mediaTab","mediaTabs","menuTab","span","ripple","unlockScroll","tabsContainer","swipeHandler","handleTabSwipe","prevId","selectTab","children","onTouchMove","lockers","lockTouchScroll","contentTab","searchGroupMedia","canLoadMediaTab","horizontalMenu","tabContent","animate","skipScroll","scrollIntoViewNew","position","startCallback","scrollStartCallback","newMediaTab","onChangeTab","fromMediaTab","offsetTop","scrollTop","scroll","scrollHeight","rect2","onScroll","onMediaClick","targetClassName","mediaSpoiler","event","targets","containerEl","copySearchContext","slice","inputMessagesFilterPhotoVideo","inputMessagesFilterDocument","useHeavyAnimationCheck","unlockAndRefresh","filterMessagesByType","filterMessagesByInputFilter","processEmptyFilter","dialogElement","appDialogsManager","setLastMessagePromise","lastMessage","highlightWord","noop","processPhotoVideoFilter","promises","getMediaFromMessage","wrapped","choosePhotoSize","boxWidth","boxHeight","onlyPreview","withoutPreloader","noPlayButton","photo","noBlur","animationGroup","multiply","images","full","filter","Boolean","processDocumentFilter","withTime","fontWeight","voiceAsMusic","autoDownloadSize","processUrlFilter","webPage","webpage","entity","display_url","sliced","offset","matchUrl","same","URL","hostname","description","previewDiv","setInnerHTML","wrapAbbreviation","subtitleFragment","htmlToDocumentFragment","wrapRichText","innerText","decodeURIComponent","href","firstChild","wrapPlainText","row","titleRight","subtitle","havePadding","applyMediaElement","performSearchResult","elemsToAppend","sharedMediaDiv","processCallback","results","awaited","method","monthContainer","getMonthContainerByTimestamp","toggleElementCheckbox","afterPerforming","parent","child","loadChats","renderedPeerIds","inputMessagesFilterEmpty","setResults","showMembersCount","dom","peer","getPeer","participants_count","participants","regExp","RegExp","escapeRegExp","cleanSearchText","titleSpan","lastMessageSpan","getChatMembersString","toChatId","username","getPeerUsername","user","appUsersManager","getUser","phone","formatPhoneNumber","formatted","onLoad","arg","getContactsPeerIds","contacts","searchContacts","my_results","globalContacts","showMore","intlElement","isShort","update","dialogsStorage","getDialogs","offsetIndex","filterId","dialogs","minDate","renderRecentSearch","recent","replaceChildren","recentSearch","isUser","getUserStatusString","toUserId","getTopPeers","peers","people","subtitleEl","loadMembers","renderParticipants","membersList","rippleEnabled","li","findUpTag","DIALOG_LIST_ELEMENT_TAG","participant","getParticipantPeerId","isAnyChat","deleted","appChatsManager","isChannel","LOAD_COUNT","appProfileManager","getChannelParticipants","getChatFull","chatFull","loadType","justLoad","used","slicedLength","ids","notFilteredMessages","m","checkForTriggers","getSearch","nextRate","next_rate","loadFirstTime","filters","counters","canViewMembers","getSearchCounters","firstMediaTab","counter","c","membersTab","loadFirstTimePromise","toLoad","t","findAndSplice","setHours","setDate","dateTimestamp","getTime","containers","month","getFullYear","year","dateElement","haveTimestamps","getObjectKeysAndSort","positionElementByIndex","chatId","isBroadcast","hasRights","isForum","cleanScrollPositions","cleanupHTML","goFirst","putPreloader","empty","newInputFilter","copy","setQuery","maxDate","AppSelectPeers","chatsContainer","selected","freezed","loadedWhat","peerType","multiSelect","exceptSelf","tempIds","selfPresence","needSwitchList","design","onInput","cachedContacts","getMoreResults","f","renderResultsFunc","renderResults","peerIds","splitUp","notRendered","filterPeerTypeBy","section","innerContainer","topContainer","selectedContainer","selectedScrollable","sectionNameLangPackKey","noShadow","checkbox","checked","debouncedInput","appendTo","getResultsPromise","onFirstRender","renderSaved","testSelfSearch","getTempId","getMoreDialogs","archived","pageCount","skipMigrated","newOffsetIndex","chatRightsAction","filterByRights","isEnd","getMoreContacts","isGlobalSearch","searchResult","resultPeerIds","arr","getMoreChannelParticipants","channelParticipants","q","getMoreSomething","call","isNonContactUser","checkboxField","label","isDialog","insertAdjacentElement","offsetWidth","getSelected","addInitial","values","requestAnimationFrame","forceDirection","constructDownloadPreloader","tryAgainOnFail","circle","totalLength","mids","attr","elem","findMediaTargets","anchor","anchorMid","isBubbles","justAudioSelector","selectors","prefix","mediaItems","AudioElement","render","isRealVoice","isOutgoing","is_outgoing","uploadingFileName","durationStr","downloadDiv","onTypeLoad","audioEl","out","waveform","Uint8Array","valueCount","result","dataView","DataView","buffer","byteIndex","bitShift","getUint16","decodeWaveform","svg","svgContainer","availW","barHeightMax","minW","maxW","normValue","wfSize","barCount","maxValue","maxDelta","barX","sumI","bar_value","barWidth","createWaveformBars","fakeSvgContainer","waveformContainer","timeDiv","onTimeUpdate","throttledTimeUpdate","addAudioListener","readyPromise","mousemove","scrub","offsetX","targetTouches","pageX","scrubTime","wrapVoiceMessage","descriptionEl","audioAttribute","parts","titleEl","middleEllipsisEl","fontSize","sizeType","subtitleDiv","launched","progressLine","lastChild","wrapAudio","audioTimeDiv","HAVE_CURRENT_DATA","onTypeDisconnect","getTimeStr","hadSearchContext","useSearch","autoDownload","shouldPlay","onDownloadInit","pauseListener","notifyAll","done","total","cancel","Error","playListener","setDownloadFunction","disconnectedCallback","isConnected","customElements","define","AvatarListLoader","loadMore","photoId","appPhotosManager","getUserPhotos","photos","loadedAllUp","AppMediaViewerAvatar","getPhoto","onAvatarUpdate","openAvatarViewer","getTarget","hadMessage","isObject","data","believeMe","seen","getAvatarQueueKey","AvatarElement","addedToQueue","middlewareHelper","attachClickEvent","updateOptions","wasPeerId","wasThreadId","newPeerId","wrapOptions","create","onlyThumb","putPhoto","isBig","AvatarEdit","clearRect","Button","asLink","asDiv","rippleSquare","disabled","ButtonMenuItem","separator","iconDoc","noCheckboxClickListener","textElement","textArgs","iconElement","noFadeIn","processUrl","fetch","response","color","DOMParser","parseFromString","stroke","strokeWidth","keepOpen","menu","multiline","ButtonMenuSync","b","ButtonMenu","ButtonMenuToggleHandler","openedMenu","ButtonMenuToggle","attachListenerSetter","onOpenBefore","onCloseAfter","closeTimeout","filteredButtons","_element","ChatBackgroundGradientRenderer","_width","_height","_tails","_scrollTails","_curve","_positions","_phases","_animatingToNextPosition","_scrollDelta","_onWheelRAF","drawOnWheel","floor","ceil","changeTailAndDraw","drawNextPositionAnimated","getProgress","transitionValue","nextPositionTail","_nextPositionTail","_nextPositionTails","_nextPositionLeft","frames","_frames","drawImageData","_incrementalCurve","hexToRgb","hex","g","getPositions","positions","getNextPositions","phase","curveMax","curve","pos","distances","nextPos","distance","curPosition","tail","changeTail","_tail","_phase","curPos","drawGradient","getGradientImageData","_hctx","createImageData","pixels","centerDistanceY","centerDistanceY2","centerDistanceX","swirlFactor","sqrt","theta","sinTheta","sin","cosTheta","cos","pixelX","pixelY","distanceSum","_colors","distanceX","distanceY","putImageData","_ctx","_hc","cancelAnimationFrame","colors","alpha","_canvas","fillStyle","fillRect","toNextPosition","tails","nextPhaseOnIdx","inc","toFixed","curves","last","scrollAnimate","createCanvas","gradientRenderer","accumulateMapSet","reduce","acc","AppSelection","selectedMids","onMouseDown","targetLookupClassName","verifyTarget","selecting","firstTarget","processElement","checkBetween","isInDOM","seenSet","seenLength","findUpAsChild","elementsBetween","getElementsBetween","toggleByMid","canceledSelection","onMouseMove","getElementFromTarget","verifyMouseMoveTarget","removeManual","listenElement","documentListenerOptions","first","firstRect","lastRect","isHigher","lookupBetweenParentClassName","lookupBetweenElementsQuery","firstIndex","lastIndex","doNotAnimate","onCancelSelection","toggleSelection","navigationType","random","attachListeners","selectedText","getSelection","toString","createRange","verifyTouchLongPress","isElementShouldBeSelected","appendCheckbox","hasCheckbox","getCheckboxInputFromElement","forwards","updateContainer","forceSelection","cantForward","cantDelete","cantSend","storageKey","cantForwardDeleteMids","onUpdateContainer","toggleCheckboxes","wasSelecting","blurActiveElement","toggleResult","onToggleSelection","updateElementSelection","toggleMid","unselect","deleteSelectedMids","SearchSelection","selectionCountEl","selectionGotoBtn","selectionContainer","BASE_CLASS","btnCancel","attachClickOptions","obj","fromPeerId","sort","isPrivate","transitionElement","ChatSelection","chat","bubbles","recording","bubble","canSelectBubble","isGroupedBubbleSelected","getMidsFromGroupContainer","getBubbleGroupedItems","groupContainer","isGroupedSelected","isGroupedMidsSelected","mounted","getMountedBubble","needTranslateX","widthFrom","widthTo","center","selectionInputWrapper","selectionSendNowBtn","selectionLeft","selectionRight","translateButtonsX","right","inputContainer","toggleAttribute","skippedMids","isGrouped","groupedCheckboxInput","CheckboxField","restriction","toggleDisability","stateKey","stateValues","stateValue","setValueSilently","box","checkSvg","bg","border","withRipple","withHover","Event","disable","CodeInputField","assign","autocomplete","lastLength","setLabel","onFill","confirmationPopup","callback","checkboxes","cancelButton","isCancel","countries","setCountries","country","hidden","default_name","localeCompare","VIRTUAL_COUNTRIES","CountryInputField","hidePicker","hideTimeout","selectWrapper","selectCountryByTarget","defaultName","phoneCodeEl","phoneCode","countryCode","simulateInputEvent","lastCountrySelected","lastCountryCodeSelected","country_codes","_countryCode","country_code","onCountryChange","liMap","arrowDown","selectList","initSelect","noPhoneCodes","iso2","emoji","liArr","Infinity","spanEmoji","select","margin","mouseDownHandlerAttached","onKeyPress","_value","names","abbr","word","test","blur","selectCountryByIso2","countryName","DotRenderer","dpr","devicePixelRatio","prepare","dots","generateDot","adding","radius","Path2D","arc","PI","mOpacity","draw","dot","addOpacity","easedOpacity","globalAlpha","fill","renderFirstFrame","onClean","dotRenderer","EditPeer","_disabled","isChanged","uploadAvatar","changedLength","requiredLength","requiredValidLength","inputFields","isValid","required","handleChange","nextBtn","withoutAvatar","avatarElem","doNotEditAvatar","avatarEdit","_upload","popupOptions","lockWithPromise","unlockOnSuccess","GifsTab","gifsContainer","EmoticonsDropdown","masonry","EMOTICONSSTICKERGROUP","getGifs","docs","processInvisibleDiv","ANIMATIONGROUP","AppGifsTab","nextOffset","loadedAll","onGifsClick","fileId","inputSearch","gifsDiv","onCloseAfterTimeout","newSearch","gifBotPeerId","resolveUsername","appInlineBotsManager","getInlineResults","next_offset","AppStickersTab","setsDiv","listenTo","sticker","stickerSet","access_hash","appStickersManager","getStickerSet","toggleStickerSet","changed","installed_date","removeAttribute","renderFeatured","renderSet","header","countDiv","stickersDiv","stickerDiv","documents","withLock","getFeaturedStickers","coveredSets","filterRendered","forEachReverse","covered","searchStickerSets","scrollOptions","forceDuration","transitionFunction","ignoreOutClickClassName","tabId","onSelectTabClick","searchButton","emojiTab","deleteBtn","scrollTo","checkRights","tabsEl","tabsElements","canSendStickers","canSendGifs","canSendToPeer","stickersTab","gifsTab","whichChild","savedRange","getGoodRange","onOpened","unlock","refresh","onClosed","range","getSavedRange","setStartAfter","newRange","cloneRange","collapsed","node","endContainer","endOffset","newStartNode","previousSibling","nodeType","TEXT_NODE","nodeValue","ELEMENT_NODE","isContentEditable","selectNode","newOffset","setStart","deleteContents","HIDE_EMOJI_TAB","INIT_TAB_ID","lastMouseMoveEvent","mouseMoveEventAttached","isActive","onMouseOut","getElement","axis","clearDraft","silent","emoticonsDropdown","forceClose","addLazyLoadQueueRepeat","divs","intersector","getVisible","clearVisible","sel","rangeCount","activeElement","getRangeAt","menuOnClick","emoticons","menuScroll","prevTab","jumpedTo","getElementPosition","elementPosition","scrollToTab","scrollingToContent","stickyIntersector","stuck","getCategoryByContainer","which","getCategoryByMenuTab","additionalOffset","setActiveStatic","local","scrollLeft","clientWidth","sendDocId","loadedURLs","appendEmoji","unify","kek","getEmojiEntityFromEmoji","wrapSingleEmoji","fixEmoji","getEmojiFromElement","superEmoji","stickerEmoji","EMOJI_RECENT_ID","EMOJI_RECENT_CATEGORY","CUSTOM_EMOJI_RECENT_CATEGORY","EMOJI_CATEGORIES","sorted","category","order","EMOJI_ELEMENT_SIZE","EmojiTab","onCategoryVisibility","categoriesMap","renderer","newChildren","customEmojis","customEmojiElement","clearCanvas","onContentClick","isStandalone","langPackArguments","activeElements","menuInnerScroll","intersectionOptions","root","categoriesIntersector","menuOnClickResult","innerScrollWrapper","preparedMap","noRegularEmoji","emojis","titleLangPackKey","createLocalCategory","unified","addEmojiToCategory","batch","appEmojiManager","getRecentEmojis","stickerSetId","getLocalStickerSet","getCustomEmojis","recentCustom","mainSet","sets","recentCategory","categories","recentCustomCategory","CUSTOM_EMOJI_RECENT_ID","createRendererForCategory","paddingTop","toggleLocalCategory","resizeCategories","after","renderStickerSet","toggleCustomCategory","postponedEvent","positionCategory","toggleRenderers","ignore","ignoreSettingDimensions","setDimensionsFromRect","deleteCategory","isCategoryVisible","forceRender","closeScrollTop","createCategory","menuTabPadding","stickerEmojiRaw","setCategoryItemsHeight","getCustomCategory","hasPremium","canSeeCustomCategory","customEmojiSize","activeEmoji","spliceExceed","onLocalCategoryUpdate","LazyLoadQueueRepeat","parallelLimit","onVisibilityChange","elementsMap","queueItem","wasSeen","queue","indexOfAndSplice","setProcessQueueTimeout","SuperStickerRenderer","regularLazyLoadQueue","animated","checkAnimationContainer","processVisible","processInvisible","renderSticker","observeAnimated","unobserveAnimated","StickersTabCategory","noMenuTab","getContainerSize","getElementMediaSize","gapX","gapY","containerWidth","elementSize","itemsPerRow","rows","minHeight","EmoticonsTabC","categoryItemsClassName","args","postponedEvents","categoriesByMenuTabMap","localCategories","menuWrapper","isLocal","observeStickyHeaderChanges","posItems","foundMenuScroll","posMenu","notMountedItems","notMountedMenus","itemsIdx","menuIdx","disconnect","StickersTab","setTyping","setFavedLimit","categoryAppendStickers","superStickerRenderer","clearCategoryItems","onCategoryStickers","stickers","deleteSticker","unshiftSticker","favedCategory","clearButton","titleLangKey","descriptionLangKey","langKey","clearRecentStickers","premiumCategory","apiManager","getLimit","getFavedStickersStickers","getRecentStickersStickers","getAllStickers","getPremiumStickers","isPremium","race","rendererLazyLoadQueue","faved","createStickersContextMenu","verifyRecent","unshiftRecentSticker","saveRecentSticker","deleteRecentSticker","generateDelimiter","delimiter","generateFakeIcon","isScam","LazyLoadQueueRepeat2","spliced","findAndSpliceAll","GifsMasonry","scrollPromise","processVisibleDiv","noInfo","noPreview","transitionTime","scrollableX","proxy","Proxy","apply","that","selectTarget","result1","canChange","mutateCallback","useStripe","indicator","currentIndicator","shiftLeft","scaleFactor","insertRichTextAsHTML","wrappingForPeerId","some","createCustomEmojiRendererForInput","fragment","wrapDraftText","customEmojiRenderer","contentEditable","richInputHandler","customEmojiElements","ces","documentFragmentToHTML","pre","getCaretPosNew","createTextNode","collapse","removeAllRanges","addRange","onBeforeInput","inputType","execCommand","removeExtraBOMs","findUpAttribute","noLinebreaks","originalEvent","clipboardData","getData","usePlainText","filterEntity","curChild","nextSibling","richValue","getRichValueWithCaret","lines","textLength","line","correctedText","entities2","parseEntities","mergeEntities","InputState","wrappingDraft","isSelectable","processCustomEmojisInInput","hasSet","connectedCallback","InputField","validate","maxLength","showLengthOn","canBeEdited","labelText","onInputCallbacks","isCollapsed","centerX","focusOnNext","clientX","isInputEmpty","inputMode","labelEl","showingLength","wasError","inputLength","isError","withLinebreaks","selectNodeContents","selectElementContents","labelOptions","fromSet","originalValue","isValidToChange","setDraftValue","setOriginalValue","setState","Valid","setError","InputSearch","prevValue","onClearClick","onClear","searchIcon","clearBtn","LazyLoadQueue","ignoreHeavyAnimation","getItem","addElement","LazyLoadQueueIntersector","inProcess","loadItem","intersectorTimeout","processQueue","MediaProgressLine","useTransform","progressRAF","onLoadedData","seek","setLoadProgress","onProgress","filledLoad","setSeekMax","buf","buffered","numRanges","nearestStart","end","percents","testQueue","pendingTest","setTestQueue","testElement","getElementWidth","mapped","firstTime","font","textWidth","elementWidth","newElementWidth","widthChanged","smallerText","smallerWidth","smallerTextLength","half","half1","substr","half2","MiddleEllipsisElement","PasswordMonkey","passwordInputField","needFrame","noCache","currentFrame","setSpeed","helpers","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","TrackingMonkey","playAnimation","frame","idleAnimation","PasswordInputHelpers","onVisibilityClick","toggleVisible","stealthy","tabIndex","PasswordInputField","PeerProfileAvatars","avatar","avatars","draggable","loadCallback","intersectionObserver","loadCallbacks","addTab","gradient","info","arrowPrevious","arrowNext","checkScrollTop","SWITCH_ZONE","freeze","_e","clickX","toRight","cancelNextClick","minX","lastX","SCALE","TRANSLATE_TEMPLATE","addIndex","loadNearestToTarget","setPeer","backLimit","filterChatPhotosMessages","chat_photo","generateFakeAvatarMessage","activeTab","photo_id","setText","PeerProfile","noDelimiter","bio","contextMenu","subtitleLangKey","isAnonymous","getUserPhone","link","notifications","togglePeerMute","appNotificationsManager","isPeerLocalMuted","respectType","setPeerStatus","setMoreDetails","n","fillUsername","userId","self","fillUserPhone","setAvatar","setPeerStatusInterval","setInterval","needClear","callbacks","useWhitespace","ignoreSelf","clearSetMoreDetailsTimeout","canBeDetailed","createAvatar","_setAvatar","isTopic","oldAvatars","getUsernamesAlso","usernames","also","anchorCopy","getPeerActiveUsernames","formatUserPhone","fillNotifications","notificationsRow","fillName","withIcons","fillRows","fillProfileElements","cleaned","_setMoreDetails","peerFull","getMiddlewarePromise","getServerMessageId","about","getChat","exportedInvite","exported_invite","address","setMoreDetailsTimeout","isPeerRestricted","acknowledged","getProfileByPeerId","setPromise","cached","middlewarePromise","makeError","clearInterval","generateTitleIcons","noVerifiedIcon","noFakeIcon","noPremiumIcon","verified","use2","generateVerifiedIcon","fake","scam","premium","emojiStatus","emoji_status","generatePremiumIcon","weakMap","WeakMap","PeerTitle","setOptions","setHasInner","hasInner","fromName","limitSymbols","topic","forumTopic","getTopicIconPromise","icons","topicIcon","getPeerTitle","withPremiumIcon","inner","createDocumentFragment","PopupAvatar","closable","withConfirm","cropper","crop","removeHandlers","h6","btnClose","cropContainer","file","files","readBlobAsDataURL","contents","onload","originalImage","cropComponent","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","overlayColor","CROPWIDTH","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","startMoving","resizing","keyHandler","imgZoom","bottom","newWidth","newHeight","clientHeight","String","fromCharCode","charCode","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","currentTouch","complete","btnConfirm","toBlob","blob","darkenCanvas","onCrop","postCanvas","ctx","PopupDeleteDialog","onSelect","peerTitleElement","getDialogType","callbackLeave","flush","leave","flushHistory","callbackDelete","titleArgs","descriptionArgs","isDanger","titleLangArgs","descriptionLangArgs","PopupDeleteMessages","onConfirm","revoke","deleteScheduledMessages","deleteMessages","isMegagroup","_hasRights","canRevoke","PopupForward","peerIdMids","overrideOnSelect","peerTypes","DEFAULT_APPEND_TO","appendPopupTo","onFullScreenChange","PopupElement","reAppend","titleRaw","MANAGERS","confirmShortcutIsSendShortcut","withoutOverlay","overlayClosable","attachScrollableListeners","btnConfirmOnEnter","buttonsEl","buttonsElements","langArgs","POPUPS","setClassOn","attachBorderListeners","onContentUpdate","popup","popupConstructor","ctor","addCancelButton","pin","descriptionPremium","descriptionLocked","folders","P","_a","limitPremium","isLocked","limitContainer","hint","free","setHintActive","showLimitPopup","appConfig","premium_purchase_blocked","times","ONE_HOUR","PopupMute","time","mutePeer","muteUntil","radioForm","PopupPeer","noTitle","o","original","nextElementSibling","PopupPickUser","PopupSendNow","sendScheduledMessages","ANIMATION_GROUP","PopupStickers","stickerSetInput","isEmojis","onStickersClick","updateAdded","stickersFooter","onStickerSetUpdate","_set","updateButton","loadStickerSet","createStickerSetElements","headerRow","buttonRight","added","itemsContainer","setsPromises","isArray","firstSet","isStickerPack","onSend","containersPromises","docIds","toggleStickerSets","isAdd","buttonAppend","installed","ProgressivePreloader","detached","isUpload","attachMethod","loadFunc","constructContainer","bold","constructDownloadIcon","downloadSvg","cancelSvg","previousElementSibling","func","startTime","onEnd","notify","elapsedTime","TRANSITION_TIME","addNotifyListener","useRafs","getTotalLength","strokeDasharray","putAvatar","renderThumbPromise","thumbImage","isFullLoaded","loadThumbPromise","stripped_thumb","getPreviewURLFromBytes","sequentialDom","renderPromise","myId","getForumTopic","setProperty","getPeerColorById","forum","avatarAvailable","avatarRendered","appAvatarsManager","isAvatarCached","first_name","last_name","getPeerInitials","returnDiv","setButtonLoader","RadioField","alignRight","RadioForm","radios","form","RangeSelector","events","setFilled","filled","stepStr","decimals","_removeListeners","rectMax","offsetAxisValue","rippleClickId","attachListenerTo","handler","drawRipple","clickId","_handler","touchStartFired","clickY","isRippleUnneeded","touchEnd","setContent","Row","checkboxFieldOptions","radioField","noWrap","subtitleRight","subtitleRow","createRow","subtitleLangArgs","isToggle","withCheckboxSubtitle","titleRightContent","titleRightSecondary","titleRow","createTitle","navigationTab","buttonRightLangKey","_subtitle","createSubtitle","midtitle","_midtitle","createMidtitle","createMedia","disableWithPromise","makeSortable","sortIcon","toggleSorting","CreateRowFromCheckboxField","RadioFormFromRows","RadioFormFromValues","checkedRadioField","ScrollableBase","logPrefix","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","cancelMeasure","onScrolledTop","scrollPosition","scrollProperty","addScrollListener","addedScrollListener","removeScrollListener","removeHeavyAnimationListener","Scrollable","onScrollOffset","withPaddingContainer","maxScrollTop","isScrolledDown","getDistanceToEnd","setScrollTopSilently","ignoreNextScrollEvent","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","SettingSection","fakeGradientDelimiter","hr","generateContentElement","nameArgs","captionOld","captionArgs","generateSection","AppNewGroupTab","isGeoChat","setTitle","inputWrapper","groupNameInputField","groupLocationInputField","valueCheck","userLocationCoords","userLocationAddress","createChannel","geo_point","megagroup","inputFile","editPhoto","inviteToChannel","createChat","chatsSection","new","startLocating","geolocation","getCurrentPosition","lat","coords","latitude","long","longitude","uri","json","display_name","GeolocationPositionError","PrivacyType","getPrivacyRulesDetails","rules","types","allowPeers","users","chats","disallowPeers","rule","PrivacySection","onRadioChange","captions","captionElement","radioSection","exceptions","radioRows","skipTypes","noExceptions","exceptionTexts","exception","_peerIds","slider","createTab","skippable","takeOut","newPeerIds","generateStr","splitPeersByType","selectedPeerIds","appPrivacyManager","getPrivacy","inputKey","setRadio","k","eventListener","chatKey","usersKey","getUserInput","setPrivacy","AppPrivacyPhoneNumberTab","getSelf","captionEl","mePath","phoneSection","sCaption","AppTwoStepVerificationSetTab","stickerContainer","inputContent","btnReturn","sliceTabsUntilTab","AppSettingsTab","canFocus","isFirstInput","AppTwoStepVerificationEmailConfirmationTab","isFirst","email","codeInputField","passwordManager","confirmPasswordEmail","goNext","btnChange","btnResend","cancelPasswordEmail","AppTwoStepVerificationEmailTab","resendPasswordEmail","onOpenAfterTimeout","onContinueClick","btnContinue","btnSkip","matchEmail","toggleButtons","updateSettings","currentPassword","plainPassword","newPassword","symbols","AppTwoStepVerificationHintTab","onSkipClick","saveHint","AppTwoStepVerificationReEnterPasswordTab","monkey","verifyInput","AppTwoStepVerificationEnterPasswordTab","isNew","has_password","textEl","getStateInterval","getState","_state","check","auth","AppTwoStepVerificationTab","removeTabFromHistory","btnChangePassword","btnDisablePassword","btnSetRecoveryEmail","has_recovery","btnSetPassword","AppPrivacyLastSeenTab","AppPrivacyProfilePhotoTab","AppPrivacyForwardMessagesTab","AppPrivacyAddToGroupsTab","AppPrivacyCallsTab","AppActiveSessionsTab","Session","app_name","app_version","ip","date_active","date_created","device_model","system_version","platform","authorizations","session","btnTerminate","invokeApi","otherSection","onError","onTerminateClick","menuElement","AppBlockedUsersTab","btnAdd","toggleBlock","bot","blocked","getBlocked","convertKeyToInputKey","toUpperCase","AppPrivacyVoicesTab","AppActiveWebSessionsTab","sessions","bot_id","region","domain","browser","appSeamlessLoginManager","resetWebAuthorizations","leftLength","resetWebAuthorization","AppPrivacyAndSecurityTab","fromTab","getAppConfig","globalPrivacy","getGlobalPrivacySettings","contentSettings","webAuthorizations","getWebAuthorizations","SUBTITLE","blockedPeerIds","blockedUsersRow","passwordState","twoFactorRowOptions","email_unconfirmed_pattern","twoFactorRow","activeSessionsRow","updateActiveSessions","websitesRow","updateActiveWebsites","websites","setBlockedCount","updateBlocked","rowsByKeys","numberVisibilityRow","lastSeenTimeRow","photoVisibilityRow","callRow","linkAccountRow","groupChatsAddRow","voicesRow","updatePrivacyRow","disallowLength","allowLength","destroyed","setGlobalPrivacySettings","archive_and_mute_new_noncontact_peers","settings","onPremiumToggle","autoarchive_setting_available","_enabled","sensitive_enabled","sensitive_can_change","payment","appPaymentsManager","clearSavedInfo","deleteButton","appDraftsManager","clearAllDrafts","auths","averageColorFromCanvas","pixel","getImageData","pixelsLength","outPixel","Uint8ClampedArray","highlightningColor","rgba","l","ColorPicker","hue","saturation","lightness","onGrabStart","documentElement","boxDragger","onGrabEnd","sliders","hueDragger","hexInputField","rgbInputField","inputs","valid","setColor","rgbRegExp","attachBoxListeners","attachHueListeners","attachGrabListeners","boxRect","saturationHandler","hueRect","hueHandler","updateHexInput","updateRgbInput","rgb","boxX","percentY","boxY","percentHue","hueX","updatePicker","getCurrentColor","rgbaArray","hexa","hsl","hsla","clamp","maxX","maxY","posX","posY","lightnessX","lightnessY","AppBackgroundColorTab","_applyColor","updateColorPicker","colorPicker","background","theme","intensity","slug","appStateManager","pushToState","onColorChange","applyColor","themeController","gridSection","grid","backgroundColor","throttle","isColored","AppBackgroundTab","clicked","wallPapersByElement","elementsByKey","onUploadClick","accept","requestFile","endsWith","createObjectURL","mimeType","scaleMediaElement","File","wallPaper","prepareWallPaperUpload","uploadPromise","uploadWallPaper","uploadDeferred","newKey","getWallPaperKey","setBackgroundDocument","addWallPaper","onResetClick","defaultTheme","blurCheckboxField","onGridClick","wallpaper","saveToCache","_tempId","onReady","getPixelPromise","getColorsFromWallPaper","imageUrl","imageSource","ratio","averageColorFromImageSource","averageColor","toDataURL","getWallPaperKeyFromTheme","uploadButton","colorButton","resetButton","pattern","getWallPapers","wallPapers","gridContainer","background_color","second_background_color","third_background_color","fourth_background_color","hasFile","isDark","dark","webkitMaskImage","AppQuickReactionTab","appReactionsManager","getQuickReaction","getAvailableReactions","quickReaction","availableReactions","reaction","inactive","availableReaction","static_icon","setDefaultReaction","emoticon","RangeSettingSelector","initialValue","minValue","writeValue","nameDiv","valueDiv","valueContainer","AppGeneralSettingsTab","chatBackgroundButton","animationsCheckboxField","enterRow","ctrlEnterRow","kilometersRow","milesRow","formats","format","runFirst","getNextTimeout","_callback","run","eachTimeout","getSeconds","eachMinute","toLocaleTimeString","hour","minute","suggestCheckboxField","bigCheckboxField","reactionsRow","renderQuickReaction","getCustomEmojiDocument","document_id","loopCheckboxField","stickerSets","stickersContent","allStickers","assumeType","AppChatFoldersTab","filtersRendered","lottieLoader","renderFolder","dialogFilter","non_contacts","broadcasts","bots","folder","getFolderDialogs","channels","isAnyGroup","filtersStorage","getFilter","localId","getInitArgs","createFolderBtn","foldersSection","suggestedSection","canCreateFolder","onFiltersContainerUpdate","getDialogFilters","toggleAllChats","getSuggestedFilters","loadAnimationPromise","onSort","prevIdx","newIdx","updateDialogFiltersOrder","getSuggestedDialogsFilters","suggestedFilters","includePeerIds","excludePeerIds","pinnedPeerIds","createDialogFilter","AppNotificationsTab","NotifySection","enabledRow","typeText","previewEnabledRow","inputNotifyPeer","getNotifySettings","notifySettings","applySettings","isMuted","show_previews","mute","showPreviews","inputSettings","mute_until","updateNotifySettings","notify_settings","contactsSignUpRow","soundRow","sound","getContactSignUpNotification","setContactSignUpNotification","AppLanguageTab","languages1","lang_pack","languages2","rendered","webLangCodes","language","lang_code","native_name","langPack","autoDownloadPeerTypeSection","contactsCheckboxField","privateCheckboxField","groupsCheckboxField","channelsCheckboxField","AppAutoDownloadPhotoTab","AppAutoDownloadFileTab","debouncedSave","sizeMax","setByKey","MIN","MAX_RANGE","MAX","upTo","formatBytes","compareAndUpdate","AppAutoDownloadVideoTab","AUTO_DOWNLOAD_FOR_KEYS","private","AppDataAndStorageTab","autoCheckboxField","autoDownloadNew","autoRow","deepEqual","setSubtitles","setAutoDownloadSubtitle","photoRow","videoRow","fileRow","file_size_max","openTab","tabConstructor","onDisabledChange","peerKeys","enabledKeys","isAll","logOut","edit","profile","fillPromise","changeAvatarBtn","upload","uploadProfilePhoto","updateChangeAvatarBtn","languageArgs","devicesRow","languageRow","buttonsSection","getEditProfileArgs","editProfileArgs","getAuthorizations","overwrite","getAuthorizationsPromise","AppNewChannelTab","channelNameInputField","channelDescriptionInputField","onLengthChange","broadcast","channelId","PopupCreateContact","importContact","nameInputField","lastNameInputField","telInputField","editPeer","AppContactsTab","openContacts","isContact","sortedUserList","createList","renderPage","AppArchivedTab","wasFilterId","ul","AppPeopleNearbyTab","isLocationWatched","parseDistance","startWatching","latestLocationSaved","getLocated","accuracy","watchPosition","isLongitudeDifferent","isLatitudeDifferent","distanceCheck","calculateDistance","stopWatching","lat1","long1","lat2","long2","asin","LEFT_COLUMN_ACTIVE_CLASSNAME","AppSidebarLeft","sidebarEl","sidebarHeader","onContactsClick","backBtn","btnArchive","isDialogsLoaded","themeCheckboxField","sessionStorage","kz_version","toolsBtn","btnMenuFooter","rel","archivedCount","newBtnMenu","updateBtn","reload","initSearch","unreadPeerIds","formatNumber","checkUpdateInterval","cache","status","ok","hasUpdate","onResize","searchContainer","pickedElements","selectedPeerId","selectedMinDate","selectedMaxDate","updatePicked","removeProperty","helper","unselectEntity","renderEntity","dates","dateData","pushRecentSearch","peopleContainer","hideNewBtnMenuTimeout","transition","activeClassName","onFocus","clearRecentSearchBtn","clearRecentSearch","appSidebarLeft","AppAddMembersTab","attachToPromise","isPrivacy","removeLoader","AppIncludedChatsTab","getContacts","foundInFilters","dialogsByFilters","onSelectChange","confirmBtn","editFolderTab","originalFilter","cmp","pinned_peers","other","otherLegacy","getInputPeerById","setFilter","onAppConfig","dialog_filters_chats_limit_premium","dialog_filters_chats_limit_default","categoriesSection","exclude_muted","ico","exclude_archived","exclude_read","selectedPeers","addedInitial","_add","flag","hasOwnProperty","AppEditFolderTab","flags","deleteFolderButton","updateDialogFilter","bool","menuBtn","inputSection","generateList","h2Text","to","includedFlagsContainer","excludedFlagsContainer","include","include_peers","editCheckForChange","reloadMissingPromises","reloadMissingPeerIds","onCreateOpen","onEditOpen","ignoreClick","hasPeer","getDialogOnly","filtered","filterAsync","renderMore","_length","exclude_peers","purchaseUsernameCaption","purchaseText","setUsername","AppEditProfileTab","bioMaxLength","userFull","firstNameInputField","bioInputField","usernameInputField","isPurchase","availableText","takenText","invalidText","profilePromise","updateProfile","updateUsername","RIGHT_COLUMN_ACTIVE_CLASSNAME","AppSidebarRight","canHideFirst","isColumnProportionSet","toggleSidebar","setColumnProportion","createSharedMediaTab","replaceSharedMediaTab","previousTab","sharedMediaTab","historyTabIds","_selectTab","getFrom","setFrom","onCloseTab","isNavigation","willChange","animationPromise","appSidebarRight","AppEditContactTab","privacy","notificationsCheckboxField","profileNameDiv","profileSubtitleDiv","phoneRow","privacyRule","sharePhoneCheckboxField","btnDelete","deleteContacts","addContact","mediaSize","AppEditTopicTab","colorIndex","isGeneral","originalTopic","iconDiv","icon_emoji_id","setIcon","editForumTopic","topicId","iconEmojiId","createForumTopic","iconColor","onDestroy","emojiElement","icon_color","force","isMainIcon","newTopic","oldTopic","oldEl","applyFadeAnimation","fadeIn","iterations","easing","AppChatTypeTab","privateRow","publicRow","privateSection","publicContainer","linkRow","btnRevoke","getChatInviteLink","publicSection","linkInputField","applyBtn","getValue","head","usernamesSection","getPeerEditableUsername","wasUsername","migrateChat","makeChannelPrivate","toggleNoForwards","onChatUpdate","noforwards","AppUserPermissionsTab","destroyListener","ChatPermissions","rights","banned_rights","editBanned","btnDeleteException","clearChannelParticipantBannedRights","kickFromChannel","exceptionText","toggleWith","defaultBannedRights","default_banned_rights","defaultRights","combineParticipantBannedRights","restrictionText","mainFlag","until_date","AppGroupPermissionsTab","chatPermissions","editChatDefaultBannedRights","addExceptionRow","openPermissions","getChannelParticipant","setSubtitle","bannedRights","cantWhat","getPeerId","setLength","exceptionsCount","loader","setLoader","getPromise","migrateFrom","migrateTo","AppChatReactionsTab","getActiveAvailableReactions","_chatReactions","available_reactions","chatReactions","reactions","makeReactionFromEmoticons","getCaptionLangPackKey","toggleSection","reactionsSection","toggleCheckboxFieldsByEmoticons","checkboxFieldsByEmoticon","toggleCheckboxField","toggleRow","save","checkboxFields","every","saveReactionsDebounced","allow_custom","saveReactions","setChatAvailableReactions","isDebounced","AppEditChatTab","_init","canChangeType","canChangePermissions","canManageTopics","chatUpdateListeners","basic","addChatUpdateListener","getCachedFullChat","chatNameInputField","descriptionInputField","chatTypeRow","setChatTypeSubtitle","availableReactionsLength","setReactionsLength","chatAvailableReactions","permissionsRow","setPermissionsLength","forum_upgrade_participants_min","topicsRow","setTopics","toggleForum","editTitle","editAbout","signMessagesCheckboxField","signatures","toggleSignatures","showChatHistoryCheckboxField","togglePreHistoryHidden","hidden_prehistory","historiesStorage","AppSharedMediaTab","newCloseBtn","closeBtn","animatedCloseIcon","transitionContainer","transitionFirstItem","titleI18n","editBtn","transitionLastItem","secondTitle","setIsSharedMedia","isSharedMedia","isHeavy","onCloseBtnClick","toggleEditBtn","renderNewMessage","msgs","deleteDeletedMessages","btnAddMembers","showConfirmation","addChatUser","_renderNewMessage","getMessageThreadId","_deleteDeletedMessages","setLoadMutex","peerChanged","changeTitleKey","loadSidebarMedia","destroyable","SetTransition","raf","afterTimeout","SidebarSlider","closeTab","closingId","getMiddleware","onOpenTab","preserveTab","getTab","getHistory","isTabExists","deleteTab","doNotAppend","SliderSuperTab","_constructor","SliderSuperTabEventable","dispatchResultableEvent","SortedUserList","getIndex","getUserStatusForSort","onDelete","listEl","onListLengthChange","onUpdate","willChangeLength","onElementCreate","base","updateElementWith","updateListWith","createChatListOptions","doTimeout","updateList","SORT_INTERVAL","hasViewer","attachStickerViewerListeners","findTarget","originalFindTarget","checkForParent","closest","mediaContainer","previousGroup","_middleware","previousTransformer","doThatSticker","lockGroups","isSwitching","effectThumb","mediaRect","boxSize","fitted","aspectFitted","transformer","transformX","transformY","needFadeIn","withThumb","relativeEffect","loopEffect","firstFramePromise","prevPlayer","ready","onMousePreMove","newMediaContainer","_previousTransformer","StickyIntersector","observeHeaders","observeElements","headersObserver","targetInfo","boundingClientRect","stickyTarget","rootBoundsInfo","rootBounds","threshold","elementsObserver","addSentinel","sentinel","headerSentinel","getEvent","attachGlobalListenerTo","RESET_GLOBAL","TOUCH_MOVE_OPTIONS","MOUSE_MOVE_OPTIONS","SwipeHandler","listenerOptions","handleMove","setCursorTo","hadMove","resetValues","handleStart","isMouseDown","withDelay","xDown","yDown","eventUp","onStart","xUp","yUp","xAdded","yAdded","onSwipeResult","setCursor","TelInputField","pasted","lastValue","telEl","HTMLInputElement","pixelRatio","letterSpacing","IS_ANDROID","originalFunc","formattedPhoneNumber","leftPattern","shiftKey","toastEl","hideToast","toastNew","transitions","navigation","prevTabContent","animateFirst","withAnimationListener","animationFunction","_animateFirst","onTransitionEndCallbacks","animationDeferred","listenerName","onEndEvent","overrideFrom","onTransitionEndCallback","transitionTimeout","_from","isUsernameValid","UsernameInputField","checkUsernameDebounced","checkUsername","checkUsernamePromise","checkPromise","available","UsernamesSection","CLASS_NAME","_usernames","sortedList","editable","changeActive","applyUsernames","getAll","_peerId","cancelClick","newActive","toggleUsername","reorderUsernames","VisibilityIntersector","locked","change","refreshVisible","VolumeSelector","onMuteClick","setVolume","iconIndex","ICONS","wrapCustomEmoji","repeat","wrapCustomEmojiAwaited","wrapDocument","noAutoDownload","uploadFileName","audioElement","extSplitted","ext","docDiv","icoDiv","icoTextEl","hadContext","hasThumb","performance","fileName","bytesContainer","descriptionParts","bytesMaxEl","sizeDiv","_downloadDiv","addByteProgress","sizeContainer","_bytesContainer","_d","canOpenAfter","downloadFileName","downloadId","apiFileManager","isDownloading","support","was_online","today","getDate","dateEl","timeEl","toggleMediaSpoiler","reveal","destroyAfter","onMediaSpoilerClick","wrapMediaSpoiler","wrapMediaSpoilerWithImage","wrapMessageActionTextNew","plain","hadColors","wrapJoinVoiceChatAnchor","wrapUrl","wrapLinkToMessage","savedFrom","dir","wrapSomeText","htmlToSpan","wrapTopicIcon","ns","contentSpan","gradientId","strokeColor","clone","topicAvatar","wrapMessageActionTopicIcon","wrapMessageActionTopicIconAndName","wrapMessageActionTextNewUnsafe","unsafeMessage","getNameDivHTML","formatCallDuration","post","schedule_date","daysToStart","tomorrowDate","_args","day","pinnedMessage","reply_to_mid","fetchMessageReplyTo","user_id","joined","anchorHTML","isRecurringInit","recurring_init","isRecurringUsed","recurring_used","paymentsWrapCurrencyAmount","total_amount","currency","invoiceMessage","reply_to","reply_to_peer_id","period","titleElement","authorElement","isMe","isIconChanged","isIconRemoved","isTitleChanged","isHiddenChanged","closed","waited","wrapMessageForReply","usingMids","withoutMediaType","hasAlbumKey","addPart","part","isRestricted","usingFullAlbum","grouped_id","getMidsByMessage","albumText","getAlbumText","poll","question","game","extended_media","actionWrapped","restriction_reason","exec","messageWrapped","noLinks","noTextFormat","wrapPeerTitle","wrapPhoto","withTail","noThumb","blurAfter","isImageFromDocument","startsWith","isWebDoc","isFit","renderOnLoad","canAttachPreloader","haveToDownload","onlyCache","getDownloadPromise","wrapSenderToPeer","senderTitle","fromMe","wrapSentTime","STICKER_EFFECT_MULTIPLIER","locksUrls","videosCache","wrapSticker","loadStickerMiddleware","exportLoad","needUpscale","skipRatio","asStatic","fullThumb","noPremium","isCustomEmoji","syncedVideo","stickerType","emojiSticker","animatedSticker","staticSticker","isAnimated","getStickerEffectThumb","willHaveLock","lockUrl","toneIndex","isThumbNeededForType","lottieCachedThumb","getLottieCachedThumb","haveThumbCached","afterRender","num","getPathFromBytes","getPreviewURLFromThumb","stickerThumbConverted","webpWorkerController","saveWebPConvertedStrippedThumb","getImageFromStrippedThumb","middlewareError","animationData","sync","setLockColor","skipx","skipy","imageData","sr","sg","sb","sa","outCanvas","outContext","computeLockColor","saveLottiePreview","onFirstFrame","preloadAnimatedEmojiStickerAnimation","isSingleVideo","cacheName","framesCache","cachePromise","previousTime","playedTimes","onTimeupdate","mediaLength","lastPromise","_media","preloadSticker","playing","animationDiv","stickerPromise","side","attachStickerEffectHandler","onEmojiStickerClick","getAnimatedEmojiSoundDocument","restart","getAnimatedEmojiSticker","emojiData","sendInteractionThrottled","msg_id","interaction","JSON","stringify","withRandomOffset","wrapStickerAnimation","unmountAnimation","frameNo","maxFrame","vibrate","generateRandomSigned","randomOffsetX","randomOffsetY","setPosition","factor","stableOffsetX","stableOffsetY","rectX","rectY","addOffsetX","addOffsetY","wrapStickerEmoji","wrapStickerSetThumb","downloadOptions","getStickerSetThumbDownloadOptions","videos","getDocPromise","thumb_document_id","wrapStickerToRow","previousMedia","_size","wrapTopicNameButton","roundVideoCircumference","wrapVideo","videoSize","noAutoplayAttribute","isAlbumItem","canAutoplay","spanTime","spanPlay","needPlayButton","photoRes","divRound","halfSize","strokeDashoffset","globalVideo","onPaused","onFrame","renderDeferred","loadPhotoThumbFunc","wrapWebPageDescription","shortDescriptionText","wrapWebPageTitle","shortTitle","site_name","EmojiVersions","Emoji","version","FontFamily","FontSize","FontWeight","instances","getAnimationInstance","cancelAnimationByKey","instance","isCancelled","animateSingle","tick","createAnimationInstance","array","AudioAssetPlayer","assets","playSound","assetName","createAudio","playSoundIfDifferent","Audio","stopSound","cancelDelayedPlay","playSoundWithTimeout","heavyQueue","processingQueue","addHeavyTask","processHeavyQueue","todo","possiblePromise","process","realResult","timedChunk","requireBlurPromise","fastBlurFunc","processBlurNext","default","dataUri","JPEG_HEADER","bytesFromHex","JPEG_TAIL","getPreviewBytesFromURL","needle","jpegBytes","atob","char","charCodeAt","isSticker","convertToUint8Array","dataURL","btoa","bytesToDataURL","calcImageInBox","imageW","imageH","boxW","boxH","noZoom","boxedImageW","boxedImageH","getTextWidth","measureText","source","createImageBitmap","resizeWidth","resizeHeight","quality","badCharsRe","trimRe","C2L","clearBadCharsAndTrim","latinize","processSearchText","clearBadChars","ignoreCase","hasTag","includeTag","charAt","originalText","ch","latinizeCh","latinizeString","fixCyrillic","fallbackCopyTextToClipboard","textArea","removeChild","copyTextToClipboard","clipboard","writeText","ContextMenuController","diffX","diffY","isOpened","openBtnMenu","months","days","ONE_DAY","getWeekNumber","UTC","getMonth","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","formatDateAccordingToTodayNew","weekday","formatFullSentTimeRaw","formatTime","capitalize","textTransform","formatFullSentTime","getFullDate","joiner","monthAsNumber","getHours","getMinutes","noSeconds","leadingZero","noTime","minYear","yearPattern","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","setFullYear","dayOfWeek","formatWeekLong","getDay","getDayOfWeek","setTime","g1","g2","createForDayMonth","createForMonthYear","selectedYear","currentYear","g3","validDateForMonth","formatterYearMax","k1","setMonth","formatterMonthYear","formatterDayMonth","T_ME","copyWhat","copyText","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","onCancel","onMove","isTouch","onTouchEnd","CLICK_EVENT_NAME","touchMouseDown","detachClickEvent","simulateClickEvent","ControlsHover","setHideTimeout","hideControlsTimeout","isShown","controlsLocked","toggleControls","relatedTarget","createContextMenu","findElement","filterButtons","onBeforeOpen","initResult","verifyFavoriteSticker","toAdd","favedStickers","_doc","disablePictureInPicture","computedStyle","getProperty","simulateEvent","childNodes","tag","requestFullScreen","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","addListener","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","getCaretPosF","childNodesLength","alt","markdownTags","entityName","underline","italic","monospace","strikethrough","mentionName","BLOCK_TAGS","BOM_REG_EXP","checkNodeForEntity","follow","getRichElementValue","selNode","selOffset","isBlock","isTableCell","wasEntitiesLength","wasLength","field","withEntities","withCaret","DocumentFragment","startOffset","startContainer","possibleChildrenFocusOffset","getCaretPos","caretPos","getViewportSlice","overflowRect","extraSize","invisibleTop","invisibleBottom","foundVisible","lookForSticky","overflowTop","overflowRight","overflowBottom","overflowLeft","sticky","windowWidth","windowHeight","handleHorizontalSwipe","cancelY","template","isSendShortcutPressed","isComposing","secondaryKey","isSwipingBackSafari","TouchEvent","placeCaretAtEnd","ignoreTouchCheck","selectionStart","selectionEnd","prevPos","backgroundImage","useCache","isImage","renderImageFromUrlPromise","renderMediaWithFadeIn","compareNodes","node1","node1Offset","node2","node2Offset","parents","commonAncestorContainer","NOT_ONLY_BOMS_REG_EXP","USING_BOMS","RichInputHandler","saveSelectionOnChange","saveRangeForElement","onFocusOut","lastNode","lastOffset","onSelectionChange","setSelectionClassName","caret","getCaretPosN","move","superMove","modify","getFiller","addInputCallback","processEmptiedFillers","fixInsertedLineBreaks","moveFirst","setEnd","isBOM","deleteData","processFilledFillers","removeEmptyTextNodes","fixBuggedCaret","savedRanges","IS_FIREFOX","inputCaptureCallbacks","anchorNode","findPreviousSmthIndex","something","fromSelectionChange","smthIndex","moved","idxidx","rangeString","onlyBOMs","restoreSavedRange","makeFocused","newCallback","sibling","needed","treeWalker","createTreeWalker","NodeFilter","SHOW_TEXT","acceptNode","FILTER_REJECT","FILTER_ACCEPT","textNode","nextNode","removePossibleBOMSiblings","removePossibleBOMSiblingsByNode","cleanSiblings","insertData","bomNode","intersectsNode","focusNode","focusNodeBefore","focusOffset","focusOffsetBefore","collapseToStart","collapseToEnd","focusNodeAfter","focusOffsetAfter","prepareApplyingMarkdown","fillers","smths","INSTANCE","Sortable","minY","elementRect","lastSiblings","siblings","property","getSortableTarget","scrollableRect","toEnd","addScrollPos","scrollPos","startScrollPos","isVertical","countNonElements","DropdownHover","onClickOut","ignoreButtons","ignoreMouseOut","toElement","willBeActive","inited","timeouts","attachButtonListener","setIgnoreMouseOut","onmouseout","onmouseover","FocusDirection","fastSmoothScroll","maxDistance","Static","scrollWithJs","getNormalSize","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","elementScrollSizeKey","scrollPositionKey","possibleElementPosition","containerSize","scrollSize","fallbackToElementStartWhenCentering","remainingPath","absPath","startAt","shortTransition","longTransition","currentPath","distanceToEnd","FILENAME_JOINER","getFileNameByLocation","thumb_size","big","stickerset","short_name","thumb_version","volume_id","local_id","strictDecimals","_decimals","dm","fixed","pow","parseFloat","CALL_DURATION_LANG_KEYS","mm","showLast","dd","formatDuration","strings","prefixes","maxPrefixLength","setPrefix","originalStr","prefixCountry","patterns","searchForPattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","symbol","FramesCache","framesNew","framesURLs","getCache","createCache","releaseCache","getCacheCounter","generateName","arcParameter","rx","ry","xAxisRotation","largeArcFlag","sweepFlag","tl","tr","bl","useBlur","ignoreCache","ListLoader","loadedAllDown","setLoaded","unsetCurrent","toPrevious","goUnsafe","down","loadPromiseDown","loadPromiseUp","processedArr","processed","ListenerSetter","listeners","addManual","onceCallback","onceFired","_listener","MediaSize","aspect","aspectCovered","makeMediaSize","ScreenSize","CUSTOM_EMOJI_SIZE","ESG_CUSTOM_EMOJI_SIZE","EMOJI_STATUS_SIZE","MediaSizes","screenSizes","mobile","medium","large","handhelds","regular","album","esgSticker","documentName","invoice","extendedInvoice","customEmoji","esgCustomEmoji","popupSticker","desktop","isMobile","handleResize","innerWidth","activeScreen","wasScreen","rAF","throwWhat","numberThousandSplitter","HAVE_METADATA","useCanplayOnIos","loadEventName","errorEventName","OverlayClickHandler","withOverlay","amount","skipSymbol","isNegative","currencyData","amountExp","exp","number","dec_point","thousands_sep","isFinite","prec","sep","dec","toFixedFix","number_format","decimal_sep","space_between","symbol_left","splitter","additionalPadding","getScrollWidthFromElement","menuWidth","menuHeight","paddingRight","paddingBottom","paddingLeft","verticalSide","maxTop","maxLeft","minLeft","sides","intermediateX","intermediateY","possibleSides","platforms","getRestrictionReason","reasons","reason","savingLottiePreview","isSavingLottiePreview","saving","throttleWithRaf","fn","schedulerFn","waiting","throttleWith","ScrollableLoader","SearchListLoader","messageId","generateMessageId","filterMids","onHistoryDelete","shouldBeDeleted","onHistoryMultiappend","onMessageSent","isInner","otherSideLoader","filterMessagesByInputFilterFromStorage","goToOtherEnd","do","kind","scheduleFlush","measure","mutate","mutateElement","read","write","pushDocumentSize","_isWebDocument","replies","comments","channel_id","BatchProcessor","bindPrefix","queuePromise","addToQueue","setQueue","possibleError","perf","renderedQueue","SortedList","batchProcessor","_updateList","canUpdate","createPromise","noScheduler","encodeEntities","limitFrom","leadZero","sec_num","hours","minutes","seconds","textToSvgURL","Blob","reader","FileReader","readAsDataURL","visualViewport","innerHeight","ANIMATION_START_EVENT","ANIMATION_END_EVENT","isAnimating","heavyAnimationPromise","promisesInQueue","dispatchHeavyAnimationEvent","_heavyAnimationPromise","onHeavyAnimationEnd","interruptHeavyAnimation","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","DialogsContextMenu","onArchiveClick","editPeerFolders","folder_id","hideTopic","toggleTopic","onPinClick","toggleDialogPin","onUnmuteClick","onUnreadClick","unread_count","readHistory","top_message","markDialogUnread","onContextMenu","getDialogOrTopic","getDeleteButtonText","isDialogUnread","pinned","ConnectionStatusComponent","hadConnect","connecting","timedOut","updating","setConnectionStatus","overrideStatus","baseDcId","connectionStatus","setFirstConnectionTimeout","online","apiUpdatesManager","forceGetDifference","retryAt","setStatusText","currentLangPackKey","statusEl","statusPreloader","singleInstance","CHANGE_STATE_DELAY","getA","networkerFactory","forceReconnect","timerSpan","interval","forceReconnectTimeout","setStateTimeout","statusContainer","SENDING_STATUS","easeInOutSine","easeInOutSineApply","roundRect","defaultRadius","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","DPR","SIZE","MARGIN","WIDTH","RADIUS","Shimmer","currTime","diffTime","spread","pausedTime","pauseInterval","lightSource","lightSpread","currentAnimationIndex","keepTime","cycleAnimation","currentAnimation","animateGlow","animateSlide","smartInc","lightLeft","lightRight","lightCenter","createLinearGradient","customProperties","shimmerColor","addColorStop","dict","on","fillText","DialogsPlaceholder","onThemeChange","stopAnimation","startAnimation","updateCanvasSize","shimmer","generatedValues","marginVertical","totalHeight","lineHeight","lineBorderRadius","lineMarginVertical","statusWidth","getRectFrom","onRemove","blockScrollable","overflowY","availableLength","detachTime","renderDetachAnimationFrame","globalCompositeOperation","completed","elapsedRowTime","dialogHeight","renderFrame","createPattern","patternCanvas","patternContext","drawChat","firstLineWidth","secondLineWidth","marginLeft","drawCircle","drawCircleFromStart","shake","keyframes","setPromiseMiddleware","oldPromise","SortedDialogList","getDialogIndex","forumPeerId","indexKey","addListDialog","isBatch","isMainList","DialogElement","bigger","abitbigger","small","captionDiv","titleSpanContainer","peerTitlePromise","statusSpan","lastTimeSpan","rightSpan","dialogDom","setDialogActive","forumTab","createUnreadBadge","unreadBadge","badge","createUnreadAvatarBadge","unreadAvatarBadge","createMentionsBadge","mentionsBadge","toggleBadgeByKey","hasBadge","justCreated","ForumTab","init2","isFloating","toggleForumTab","createChatList","setListClickListener","xd","Some3","bindScrollable","getOptionsForMessages","fullReset","subscribeToChannelUpdates","unsubscribeFromChannelUpdates","setStatusPromise","noTyping","onChatsScroll","loadResult","setStatus","NOT_IMPLEMENTED_ERROR","Some","onChatsRegularScroll","sliceTimeout","processContact","scrollTopWas","rectContainer","rectTarget","firstY","lastY","firstElement","elementFromPoint","lastElement","elementOverflow","sliceFromStart","sliceFromEnd","deleteDialogByKey","getDialogKeyFromElement","setOffsets","offsets","getOffsetIndex","isDialogMustBeInViewport","topOffset","bottomOffset","setIndexKey","deleteDialog","getDialogKey","updateDialog","loadedDialogsAtLeastOnce","getDialogElement","setLastMessageN","setUnread","onChatsScrollTop","loadDialogs","createPlaceholder","placeholderOptions","getRectFromForPlaceholder","loadDialogsPromise","loadDialogsRenderPromise","cachedInfoPromise","chatList","getConversationsResult","loadDialogsInner","needPlaceholderAtFirstTime","isTopEnd","offsetDialog","firstDialog","lastDialog","getDialogFromElement","getDialogDom","oldTypingElement","newTypingElement","unsetTyping","paddingX","typings","topics","setUnreadMessagesN","drop","sidebarRect","currentOffsetIndex","needIndex","Some2","getUserStatus","setOnlineStatus","processDialogForCallStatus","validateDialogForFilter","getCachedDialogs","validateListForFilter","doNotRenderChatList","hasClassName","generateScrollable","getDialogIndexKey","sortedDialogList","testDialogForFilter","migratedTo","setCallStatus","callIcon","START_X","wasMounted","itemProgress","groupCallActiveIcon","call_active","call_not_empty","loadContacts","toggleAvatarUnreadBadges","sortedDialog","reuseClassNames","unreadContent","isUnreadAvatarBadgeMounted","unreadAvatarBadgeClassList","unreadBadgeClassList","AppDialogsManager","Log","menuScrollContainer","lastActiveElements","initedListeners","xds","onTabChange","_onListLengthChange","checkIfPlaceholderNeeded","hasContacts","removeContactsPlaceholder","updateContactsLength","dialogSize","verifyPeerIdForContacts","getProxiedManagers","stateMiddlewareHelper","bottomPart","forumsTabs","forumsSlider","allChatsIntlElement","isFilterIdAvailable","clearCurrent","showFiltersPromise","onStateLoaded","setFilterId","addFilter","foldersScrollable","_id","filtersNavigationItem","setFilterIdAndChangeTab","changeFiltersAllChatsKey","groupCallsController","callsController","initListeners","setFiltersUnreadCount","setFilterUnreadCount","elementThreadId","elementPeerId","onFiltersLengthChange","containerToAppend","getDialogIndexKeyByFilterId","renderedFilter","filtersArr","haveFilters","addFilters","addFiltersPromise","getNotifyPeerTypeSettings","fillConversations","unreadSpan","unread","unreadUnmutedCount","unreadCount","getFolderUnreadCount","wasShowing","generateEmptyPlaceholder","classNameType","subtitleArgs","placeholderContainer","needPlaceholder","emptyDialogsPlaceholderSubtitle","usersLength","placeholderType","updatePartClassName","updateContactsLengthPromise","newTab","hideTab","forumNavigationItem","toggleForumTabByPeerId","lastTab","isSameTab","withContext","openInner","lastActiveListElement","setPeerFunc","setLastMessage","draftMessage","draft","topMessage","isMessageRestricted","willPrepend","videoTypes","playIcon","replyTo","forum_topic","setUnreadMessages","isDialogPinned","getForumUnreadCount","hasUnmuted","isPinned","forumUnreadCount","wasMuted","unreadTopicsCount","hasUnmutedTopic","setStatusMessage","read_inbox_max_id","hasUnreadBadge","hasUnreadAvatarBadge","transitionDuration","disableAnimationIfRippleFound","iconClassName","setSendingStatus","isUnreadBadgeMounted","hasMentionsBadge","unread_mentions_count","isMentionsBadgeMounted","isBadgeMounted","unreadBadgeText","isUnread","isMention","notVisited","getDialog","originalDialog","getOutputPeer","addDialogNew","addDialogAndSetLastMessage","getMessageSenderPeerIdOrName","downloads","getNewDeferred","cancelDownload","clearDownload","getNewDeferredForUpload","getUpload","getDownload","getUploadPromise","getDownloadFileNameFromOptions","downloadMedia","promiseBefore","getDownloadMediaDetails","downloadMediaURL","downloadMediaVoid","getFileNameForUpload","downloadToDisc","justAttach","pingPromise","iframe","hadProgress","getDocumentDownloadOptions","getPhotoDownloadOptions","clickEvent","createEvent","initMouseEvent","createDownloadAnchor","revokeObjectURL","BubbleGroup","avatarLoadPromise","avatarContainer","fwdFrom","fwdFromId","isForwardFromChannel","from_id","currentPeerId","firstTimestamp","firstItem","firstMid","lastTimestamp","lastItem","lastMid","updateClassNames","insertItem","insertInDescendSortedArray","sortGroupItemsKey","insertGroup","mount","onItemUnmount","mountItem","onItemMount","unmountItem","dateContainer","getDateContainerByTimestamp","dateGroups","_group","dateGroupsLength","unmountedLength","STICKY_OFFSET","deleteEmptyDateGroups","BubbleGroups","itemsArr","itemsMap","newGroupDiff","sortItemsKey","sortGroupsKey","removeItemFromCache","removeAndUnmountBubble","getItemByBubble","getSiblingsAtIndex","modifiedGroups","canItemsBeGrouped","groupUngrouped","mountUnmountGroups","toMount","toUnmount","bad","partition","getLastGroup","changeBubbleMid","insertItemToArray","changeItemBubble","changeBubbleByBubble","item1","item2","isAllMessagesForum","itemIndex","findGroupSiblingByItem","findGroupSiblingInItems","previousItem","siblingGroupedItem","nextItem","addItemToGroup","addItemToCache","getMessageFromId","viaBotId","createItem","SERVICE_AS_REGULAR","getDateForDateContainer","groupMid","splitSiblingsOnGrouping","prepareForGrouping","hadGroup","foundItem","splittedGroups","PopupDatePicker","initDate","onPick","noButtons","selectedDate","selectedMonth","minMonth","prevBtn","maxMonth","onDateClick","selectedEl","setTimeTitle","controlsDiv","monthTitle","monthsContainer","handleTimeInput","onOverflow","maxString","hoursInputField","minutesInputField","setMinutes","popupCenterer","timeOptions","sendDate","dateOptions","renderElement","firstDate","weekStartDate","dayIndex","clonedDate","showOverflowMonths","remainder","DivAndCaption","MEDIA_SIZE","wrapReplyDivAndCaption","mediaEl","messageMedia","isRound","mediaChildren","video_thumbs","ReplyContainer","isMediaSet","wrapReply","setColorPeerId","replyContainer","AVATAR_CLASS_NAME","AVATAR_CONTAINER_CLASS_NAME","StackedAvatars","TAG_NAME","RepliesElement","updated","postKey","leftPart","recent_repliers","stackedAvatars","read_max_id","max_id","textSpan","iconSpan","rippleContainer","subscribeRepliesThread","updateMessage","makeEdited","edited","makeSponsored","MessageRender","chatType","editedSpan","sponsoredSpan","isSponsored","sponsored","isMessage","views","postAuthor","post_author","postViewsSpan","channelViews","edit_date","edit_hide","timeSpan","clonedArgs","renderReplies","bubbleContainer","messageDiv","isFooter","repliesFooter","setReply","isReplacing","currentReplyDiv","replyToPeerId","originalMessage","originalPeerTitle","titlePeerId","originalMessageFwdFromId","needUpdate","replyMid","getElementByPoint","horizontalSide","reflowScrollableElement","SEND_WHEN_ONLINE_TIMESTAMP","INTERNAL_LINK_TYPE","PopupJoinChatInvite","chatInvite","request_needed","importChatInvite","savePhoto","peopleCount","ReactionElement","reactionCount","_reactionCount","setCanRenderAvatars","canRenderAvatars","doNotRenderSticker","hadStickerContainer","getReaction","callbackify","center_icon","renderDoc","wrapPromise","wrapStickerPromise","renderCounter","displayOn","renderAvatars","recentReactions","peer_id","setIsChosen","isChosen","chosen_order","fireAroundAnimation","REACTION_INLINE_SIZE","REACTION_BLOCK_SIZE","around_animation","iconPlayer","aroundPlayer","removeOnFrame","REACTIONS_ELEMENTS","ReactionsElement","middlewareHelpers","onConnectCallback","getReactionCount","reactionElement","getMessage","isPlaceholder","changeMessage","changedResults","hasReactions","counts","reactionsEqual","totalReactions","can_see_list","recent_reactions","handleChangedResults","ScrollSaver","getSaved","findElements","replaceSaved","findAndSetElements","_save","scrollHeightMinusTop","onRestore","useReflow","setScrollTop","newScrollTop","restore","_restore","previousScrollHeightMinusTop","SuperIntersectionObserver","observing","observingQueue","freezedObservingNew","toggleObservingNew","isMentionUnread","mentioned","accumulate","stringResults","numberResults","replaceNonNumber","CARD_BRAND_REGEXP","visa","mastercard","amex","discover","diners","diners14","jcb","unionpay","elo","mir","CARD_BRANDS","minLength","cvcMaxLength","cvcMinLength","unknown","detectCardBrand","card","sanitizedCard","brand","detectUnifiedCardBrand","createArray","delta","buggedRegExp","getDistanceFromBuggedToNormal","fixBuggedNumbers","makeOptionalCharacter","consumed","makeRequiredCharacter","partial","wrapCharacterRegExpFactory","optional","_regExp","makeCharacter","makeMonthDigitPatternCharacter","digit","capitalCharacter","cleanedResult","formattingCharacter","str1","makeFormattingCharacter","optionalPattern","spaceCharacter","yearOptionalPattern","sixteenPattern","fifteenPattern","requiredPostcodes","generateFourPattern","cardFormattingPatterns","cardNumber","cardExpiry","cardCvc","cardCvcFromBrand","postalCodeFromCountry","optionalDigits","accumulateLengths","strs","nbspRegExp","makeValidationError","validateCardNumber","sanitized","getCardInfoByNumber","ignoreIncomplete","validateCompleteCardNumber","makeCardNumberError","validateCardExpiry","monthStr","yearStr","_year","nextMonth","isNaN","validateExpiry","parse","TelegramWebView","sandbox","onTelegramWebViewEvent","eventType","eventData","onMount","contentWindow","createVerificationIframe","allow","PopupPaymentVerification","openPathAfter","telegramWebView","path_full","InputFieldCorrected","lastKeyDown","deleting","lastTransformed","getPattern","pushRest","autocorrectComplete","character","getCharacter","meta","formatInputValueByPattern","formatMethod","transformedValue","validateNew","onBlur","justReturn","validateMethod","validateAnyIncomplete","errorKeys","handleInputFieldsOnChange","_onChange","createCountryZipFields","zip","countryInputField","postcodeInputField","SUPPORTED_NATIVE_PROVIDERS","PopupPaymentCard","paymentForm","savedCard","native_provider","cardOut","token","credentials","can_save_credentials","cardSection","nativeParams","native_params","lastBrand","lastBrandImg","brandIconTempId","cardInputField","invalid","incomplete","transformed","getPaymentBrandIconPath","setBrandIcon","cvcInputField","need_cardholder_name","expireInputField","switchFocusOrder","previousInputField","nextInputField","inputFieldsRow","billingSection","need_country","need_zip","canSave","saveCheckboxField","saveRow","payButton","PaymentButton","expiryFull","expiryMonth","expiryYear","cvc","cardholderName","nativeProvider","URLSearchParams","headers","publishable_key","expiration_month","expiration_year","security_code","public_token","PopupPaymentCardConfirmation","inputCheckPassword","getInputCheckPassword","tmpPassword","password","handled","PopupPaymentShipping","inputInvoice","savedInfo","saved_info","addressSection","address1InputField","address2InputField","cityInputField","stateInputField","receiverSection","emailInputField","shipping_address_requested","name_requested","email_requested","phone_requested","validateEmail","validatePhone","selectedCountry","shipping_address","street_line1","street_line2","city","country_iso2","post_code","requestedInfo","validateRequestedInfo","shippingAddress","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_CITY_INVALID","ADDRESS_STATE_INVALID","ADDRESS_POSTCODE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_EMAIL_INVALID","REQ_INFO_PHONE_INVALID","focusField","PopupPaymentShippingMethods","shippingOption","shipping_options","prices","lastShippingId","option","PopupPayment","isReceipt","tipButtonsMap","confirmed","onConfirmed","popupPaymentVerification","mediaInvoice","receipt_msg_id","isTest","itemEl","detailsClassName","photoEl","linesClassName","linesEl","botName","preloaderContainer","getPaymentReceipt","getPaymentForm","savedCredentials","saved_credentials","lastRequestedInfo","providerPeerTitle","provider_id","wrapAmount","isRecurring","recurring","peerTitle2","makeLabel","pricesClassName","makePricesElements","price","_label","wrappedAmount","pricesElements","getTipsAmount","shippingAmount","setTotal","totalAmount","totalLabel","payI18n","canTip","max_tip_amount","tip_amount","tipsClassName","getInputValue","setInputWidth","setInputValue","unsetActiveTip","tipEl","tipsLabel","haveToIgnoreEvents","ignoreNextSelectionChange","tipsEl","tipClassName","tipButtons","suggested_tip_amounts","tipAmount","prevTipEl","setRowIcon","setRowTitle","setCardSubtitle","methodRow","onMethodClick","previousCardDetails","previousToken","credentials_title","providerRow","providerAvatar","shippingAddressRow","shippingNameRow","shippingEmailRow","shippingPhoneRow","shippingMethodRow","lastShippingOption","onShippingAddressClick","onShippingMethodClick","setShippingTitle","postAddress","setShippingInfo","setShippingOption","scrollSaver","lastShippingPricesElements","shipping","acceptTermsCheckboxField","recurring_terms_url","acceptTermsRow","recurringElements","lastTmpPasword","missingInfo","tmp_password","paymentResult","sendPaymentForm","form_id","_passwordState","valid_until","tsNow","Layouter","minWidth","spacing","ratios","countRatios","proportions","countProportions","averageRatio","maxSizeRatio","layout","ComplexLayouter","layoutTwo","layoutThree","layoutFour","layoutTwoTopBottom","layoutTwoLeftRightEqual","layoutTwoLeftRight","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutFourTopAndOther","layoutFourLeftAndOther","geometry","RectPart","minimalWidth","secondWidth","firstWidth","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","thirdWidth","h0","w0","w2","w1","h1","h2","cropRatios","attempts","multiHeight","sum","pushAttempt","lineCounts","heights","second","third","fourth","optimalAttempt","optimalDiff","attempt","lineCount","minLineHeight","bad1","bad2","optimalCounts","optimalHeights","rowCount","colCount","col","prepareAlbum","widthItem","heightItem","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","forMedia","mediaDiv","wrapAlbum","attachmentDiv","uploading","containerHeight","hasSpoiler","itemWidth","itemHeight","AppPollResultsTab","resultsDiv","appPollsManager","getPoll","quiz","voters","total_voters","roundPercents","answer","answers","answerEl","answerTitle","answerPercents","getVotes","votesList","votes","vote","lineTotalLength","minIndex","minRemainder","maxRemainder","pollElement","isClosed","performResults","chosenIndexes","PollElement","setMaxLength","resizePolls","hideQuizHint","onHide","prevQuizHint","prevQuizHintOnHide","prevQuizHintTimeout","isListenerSet","isQuiz","isRetracted","isPublic","isMultiple","chosingIndexes","sentVote","MAX_LENGTH","MAX_OFFSET","svgLines","setLineProgress","descKey","public_voters","multiple_choice","multipleSelect","descDiv","typeDiv","avatarsDiv","close_period","close_date","timeLeftDiv","quizTimer","circumference","closeTime","quizInterval","timeLeft","getResults","answerDivs","numberDivs","footerDiv","viewResults","votersCountDiv","sendVoteBtn","sendVotes","canVote","setVotersCount","clickHandler","initQuizHint","solution","solution_entities","toggleHint","setQuizHint","correctResult","correct","chosen","answerIndex","foundIndex","indexes","sendVotePromise","sendVote","recent_voters","isVoted","hideSendVoteBtn","hideViewResultsBtn","maxPercents","getPercentValue","iterate","fullTime","votersCount","rtlChars","justRtlDirCheck","IGNORE_ACTIONS","TEST_SCROLL_TIMES","TEST_SCROLL","PEER_CHANGED_ERROR","BIG_EMOJI_SIZES","BIG_EMOJI_SIZES_LENGTH","getMainMidForGrouped","ChatBubbles","unreadOut","bubblesNewByGroupedId","bubblesNew","dateMessages","scrolledDown","isScrollingTimeout","unreaded","unreadedSeen","messagesQueueOnRenderAdditional","firstUnreadBubble","followStack","isFirstLoad","passEntities","viewsMids","isTopPaddingSet","renderingMessages","bubblesToEject","bubblesToReplace","setPeerTempId","renderNewPromises","extendedMediaMessages","unreadedObserverCallback","onUnreadedInViewport","viewsObserverCallback","sendViewCountersDebounced","sponsoredMessage","randomId","random_id","viewSponsoredMessage","stickerEffectObserverCallback","onBubblesMouseMove","unhoverPrevious","hoverBubble","hoverReaction","setHoverVisible","stickerWrapper","getGroupsFirstMessage","getAvailableReactionsByMessage","select_animation","sendReaction","onBubblesClick","setInnerPeer","chatInner","onDatePick","contactDiv","callDiv","callUser","getInputInvoiceByPeerId","reactionsElement","stickerEmojiEl","bubbleMid","reply_to_top_id","saved_from_msg_id","openThread","message1","getMessageWithReplies","getDiscussionMessage","via","setDraft","peerIdStr","documentDiv","groupedItem","SINGLE_MEDIA_CLASSNAME","isSingleMedia","hasAspecter","albumItem","isReplyClick","replyToMid","reply_to_msg_id","scrollDimensions","forceDown","sliceViewportDebounced","setCorrectIndexThrottled","setStickyDateManually","setPeerPromise","processBatch","loadQueue","filterQueue","avatarPromises","groupBubbles","updatePosition","timePromises","groupCollapsed","groupEnd","setUnreadDelimiter","restoreScroll","prepareToSaveScroll","ejectBubbles","oldBubble","bubbleGroups","updatePlaceholderPosition","requestHistory","setMessageId","constructBubbles","sequential","messagesStorageKey","messagesQueuePromise","newItem","_items","scrollingToBubble","scrollToEnd","deleteMessagesByIds","tempMessage","_bubble","groupedId","getMessagesByAlbum","reactionsElements","repliesElement","newDiv","safeRenderMessage","scrollToBubbleIfLast","deletedMids","wasMainMid","mainMid","createScrollSaver","appendReactionsElementToBubble","dateMessage","dateBubble","previousStickyDate","sliceViewport","setScroll","attachContainerListeners","highlightBubble","replyAfter","shouldReply","canSend","_target","initMessageReply","constructPeerHelpers","updateGradient","setUnreadCount","updateUnreadByDialog","finishPeerChange","reloadMessages","toDelete","postViewsElements","different","postViews","incrementMessageViews","getScheduledMessagesStorage","createResizeObserver","resizeObserver","wasHeight","skip","scrolled","onResizeEnd","setEndRAF","ResizeObserver","contentRect","realDiff","_part","needScrollTop","destroyResizeObserver","setReactionsHoverListeners","getRenderedLength","readUnreaded","readPromise","idleController","bubblesMaxId","getHistoryMaxId","readContents","onGoDownClick","getBubbleByPoint","getGroupedBubble","groupId","getMidsByAlbum","findNextMountedBubbleByMsgId","filterCallback","_mid","foundMid","loadMoreHistory","getHistoryTopPromise","getHistoryBottomPromise","getHistory1","destroyScrollable","getHistoryStorage","readMaxId","readOutboxMaxId","msgId","destroyBubble","permanent","ignoreOnScroll","pollExtendedMediaMessages","getExtendedMedia","setExtendedMediaMessagesPollInterval","pollExtendedMediaMessagesPromise","setTopPadding","setPaddingTo","isPaddingNeeded","unsetPadding","newMessage","getLastBubble","performHistoryResult","scrollToBubbleEnd","scrollToBubble","isChangingHeight","messageInput","dimensions","datasetKey","createDateBubble","bubbleContent","serviceMsg","fakeBubble","bubblesToo","cleanupPlaceholders","attachedUnreadBubble","fetchNewPromise","getSponsoredMessagePromise","onAnimateLadder","resolveLadderAnimation","attachPlaceholderOnRender","emptyPlaceholderBubble","samePeer","stack","startParam","onChangePeer","getPinnedMessagesMaxId","isTarget","followingUnread","savedPosition","overrideAdditionMsgId","getChatSavedPosition","getReadMaxIdIfUnread","foundSlice","findSliceOffset","isJump","isStartButtonNeeded","setStartParam","setQueueId","messageEntityBotCommand","isBot","additionMsgId","maxBubbleId","oldChatInner","oldPlaceholderBubble","haveToScrollToBubble","fromUp","scrollFromDown","scrollFromUp","willScrollOnLoad","setPeerOptions","waitPromise","setPeerCached","mountedByLastMsgId","isPinnedMessagesNeeded","setCorrectIndex","lastBubble","onRenderScrollSet","afterSetPromise","setFetchReactionsInterval","setFetchHistoryInterval","onScrolledAllDown","isForumTopic","unread_mark","fetchReactions","getMessagesReactions","needFetchInterval","isFetchIntervalNeeded","historyMaxId","canWrite","renderMessagesQueue","isAvatarNeeded","additionalCallback","processResult","newBubble","originalPromise","renderMessage","albumMids","reactionsMessage","albumMessages","albumMustBeRenderedFull","our","isOurMessage","contentWrapper","isInUnread","ignoreAction","chat_id","is_single","messageMessage","needToSetHTML","bigEmojis","emojiEntities","strLength","curr","richText","canHaveTail","isStandaloneMedia","haveRTLChar","topicNameButtonContainer","replyMarkup","reply_markup","replyMarkupRows","containerDiv","rowDiv","buttonEl","botId","same_peer","checkSwitchReturn","switchInlineQuery","button_id","handleUrlAuth","buttonId","haveButtons","column","callbackButtonClick","callbackAnswer","messageWithReplies","getMessageWithCommentReplies","withReplies","isOutMessage","nameContainer","canHideNameIfMedia","isMessageEmpty","viewButton","processingWebPage","telegram_channel","telegram_megagroup","telegram_bot","makeViewButton","quote","previewResizer","preview","quoteTextDiv","strong","titleDiv","textDiv","isSquare","isEmoji","nopremium","newNameContainer","richTextFragment","getMidsByMid","wrapGroupedDocuments","lastContainer","contact","contactDetails","contactNameDiv","contactNumberDiv","phone_number","wrapPoll","extendedMedia","isAlreadyPaid","isNotPaid","innerMedia","wrappedPrice","priceEl","video_duration","videoTime","dc_id","file_reference","before","needName","titleVia","mustHaveName","isHidden","isForward","goto","generateTail","documentContainer","documentMessageDiv","viewportSlice","deleteViewportSlice","historyResult","needReflowScroll","setLoadedPromises","firstSlice","lastSlice","both","processLocalMessageRender","ackedResult","getScheduledMessages","animateAsLadder","additionMsgIds","isAdditionRender","targetMid","sortedMids","topIds","middleIds","bottomIds","setBubbles","lastMsDelay","elementsToAnimate","transitionDelay","topRes","middleRes","bottomRes","delays","renderEmptyPlaceholder","listElements","getRestrictionReasonText","getGreetingSticker","channel_post","start_param","chat_invite","chat_invite_hash","JOIN_CHAT","invite","processInternalLink","creator","isWaitingForAnimation","noTransition","setOn","generateLocalMessageId","addOffset","generateLocalFirstMessage","service","saveMessages","ignoreScrollSaving","invisible","checkPlaceholders","toggleSponsoredMessage","renderBotPlaceholder","checkIfEmptyPlaceholderNeeded","getSponsoredMessage","sponsoredMessages","messagePromise","_log","getProfile","processPromise","bot_info","botInfo","description_document","description_photo","isBackLimit","resultPromise","isFirstMessageRender","serviceStartMessageId","getThreadServiceMessageId","sup","_promise","mustBeCount","PopupPinMessage","unpin","canUnpin","canPinMessage","oneSide","unpinAllMessages","hidePinnedMessages","updatePinnedMessage","buttonText","getPinnedMessagesCount","pinButtonText","isSelectionEmpty","selectionRange","START_TO_END","preloadAnimatedEmojiSticker","PopupReportMessagesConfirm","reportMessages","STICKER_EMOJI","PopupReportMessages","preloadStickerPromise","marginTop","PopupSponsored","PopupReactedList","canViewReadParticipants","canViewMessageReadParticipants","loaders","hasAllReactions","createFakeReaction","hasReadParticipants","readUserIds","getMessageReadParticipants","chatlist","skipReadParticipants","skipReactionsList","getMessageReactionsListAndReadParticipants","combined","getReactionCached","allReactionsSticker","REACTIONS_CLASS_NAME","REACTION_CLASS_NAME","CAN_USE_TRANSFORM","ChatReactionsMenu","reactionsMap","players","onScrollProcessItem","reactionDiv","appear","widthContainer","reactionsContainer","reactionsScrollable","renderReaction","setVisible","canUseAnimations","scaleContainer","appearWrapper","appear_animation","selectLoadPromise","selectPlayer","REACTION_SIZE","ChatContextMenu","isTextSelected","isAnchorTarget","isUsernameTarget","selectedMid","isOverBubble","isTargetAGroupedItem","viewerPeerId","canOpenReactedList","linkToMessage","getUrlToMessage","selectedMessagesText","getSelectedMessagesText","menuPadding","reactionsMenu","reactionsMenuPosition","isReactionsMenuVisible","offsetSize","nextVisiblePart","MIN_NEXT_VISIBLE_PART","minSize","onSendScheduledClick","onReplyClick","onFaveStickerClick","unfave","faveSticker","onEditClick","initMessageEditing","onCopyClick","onCopyAnchorLinkClick","onCopyLinkClick","onUnpinClick","onRetractVote","onStopPoll","stopPoll","setButtons","hasAttribute","notDirect","scheduleSending","editMessage","scheduleDate","canEditMessage","getMessageFromStorage","canSaveMessageMedia","isGoodType","hasTarget","localName","emojiInputsPromise","getUniqueCustomEmojisFromMessage","filterUnique","viewsButton","isViewingReactions","participantsCount","reactedLength","i18nElem","fakeText","AVATAR_SIZE","MAX_AVATARS","PADDING_PER_AVATAR","reactionsCount","fakeElem","readParticipants","totalSize","emojisButton","setPadding","inputsPromise","getCachedCustomEmojiDocuments","getCustomEmojiDocuments","threadMessage","SendMenu","sendMenuButtons","onSilentClick","onScheduleClick","sendMenu","openSide","onContextElement","setPeerId","PopupCreatePoll","onSubmitClick","send","radioLabel","isEmpty","questions","appendMoreField","correctAnswers","optionInputFields","questionInputField","sendSilent","settingsCaption","anonymousCheckboxField","multipleCheckboxField","quizCheckboxField","quizSolutionField","quizElements","quizSolutionCaption","quizHr","quizSolutionContainer","quizSolutionSubtitle","getFilledAnswers","quizSolution","quizSolutionEntities","inputMediaPoll","getInputMediaPoll","sendOther","getMessageSendingParams","helperType","clearHelper","questionField","createPosterFromMedia","getGifDuration","arrayBuffer","currentPopup","getCurrentNewMediaPopup","PopupNewMedia","willAttachType","attachFile","willAttach","shouldCompress","itemDiv","defineNotNumerableProperties","attachMedia","attachDocument","sendFileDetails","captionMaxLength","captionLengthMax","isMedia","wasInputValue","messageInputField","attachFiles","applyMediaSpoiler","noAnimation","widthStr","heightStr","containerWidthStr","containerHeightStr","strippedBytes","appendDrops","appendGroupCheckboxField","groupCheckboxField","mediaCheckboxField","appendMediaCheckboxField","addFiles","toPush","_file","lastModified","sendingParams","sendFileParams","sendText","scaledBlob","sendAlbum","replyToMsgId","scaleImageForTelegram","PHOTO_SIDE_LIMIT","objectURL","audioDecodedByteCount","webkitAudioDecodedByteCount","noSound","onseeked","onerror","createPosterFromVideo","isPhoto","isAudio","onRender","foundPhotos","foundVideos","foundFiles","appendMediaToContainer","firstType","oldSendFileDetails","albumContainer","oldParams","HANDLE_EVENT","ACTIVE_CLASS_NAME","AXIS_Y_KEYS","AXIS_X_KEYS","attachListNavigation","waitForKey","waitForKeySet","keyNames","getCurrentTarget","setCurrentTarget","hadTarget","getNextTargetX","currentTarget","isNext","nextTarget","handleArrowKey","endProperty","currentRect","targetRect","getNextTargetY","fireSelect","canContinue","attached","resetTarget","_onKeyDown","AutocompleteHelper","onVisible","listType","attachNavigation","controller","addHelper","toggleListNavigation","fromController","skipAnimation","hideOtherHelpers","StickersHelper","onChangeScreen","checkEmoticon","getStickersByEmoticon","getMinDate","getMaxDate","PopupSchedule","canSendWhenOnline","btnSendWhenOnline","EmojiHelper","chatInput","onEmojiSelected","checkQuery","firstChar","getBothEmojiKeywords","searchEmojis","AutocompletePeerHelper","doNotShow","listElement","BASE","BASE_CLASS_LIST_ELEMENT","processPeerFullForCommands","botInfos","commands","command","indexObject","CommandsHelper","getReadyToSend","sendMessage","AutocompleteHelperController","preserveHelper","MentionsHelper","insertAtCaret","topMsgId","trimmed","getMentions","ReplyKeyboard","onBodyTouchStart","btnHover","checkAvailability","checkForceReply","touchListener","sendContact","getReplyMarkup","getHistoryStorageTransferable","InlineHelper","queryId","queryAndResultIds","generateQId","resultId","sendInlineResult","_checkQuery","botResults","query_id","gifsMasonry","isGallery","gallery","noCommands","dcId","switch_pm","btnSwitchToPM","switchToPM","ChatBotCommands","setUserId","modifyAckedResult","acked","modifyAckedPromise","ChatSendAs","sendAsButtons","previousAvatar","onSendAsMenuToggle","updateButtons","sendAsPeerId","changeSendAsPeerId","executeButtonsUpdate","sendAsPeerIds","saveDefaultSendAs","updateAvatar","getDefaultSendAs","getChannelFull","channelFull","default_send_as","updateManual","updatingPromise","wasSkippingAnimation","auto","getSendAs","sendAsPeers","sendAsPeer","premium_required","addedListener","USELESS_REG_EXP","InputFieldAnimated","updateInnerHTML","onFakeInput","inputFake","setHeight","currentHeight","hasMarkupInSelection","commonAncestor","SHOW_ELEMENT","POSTING_MEDIA_NOT_ALLOWED","ChatInput","lastUrl","lastTimeType","replyElements","willSendWebPage","recordCanceled","recordStartTime","lockRedo","canRedoFromHTML","undoHistory","executedHistory","canUndoFromHTML","onCancelRecordClick","recorder","opusDecodeController","onEmoticonsOpen","toggleClass","btnToggleEmoticons","onEmoticonsClose","isUserOnlineVisible","openScheduled","prepareDocumentExecute","undoRedo","needHTML","sameHTMLTimes","currentHTML","handleMarkdownShortcut","formatKeys","markupTooltip","applyMarkdown","showLinkEditor","onMessageInput","markdownEntities","parseMarkdown","urlEntities","getWebPagePromise","appWebPagesManager","getWebPage","setTopInfo","noWebPage","onHelperCancel","helperFunc","botCommands","resetCurrentFontFormatting","updateBotCommandsToggle","editMsgId","saveDraftDebounced","checkAutocomplete","updateSendBtn","onBtnSendClick","forwarding","restricted","voice_messages_forbidden","releaseMediaPlayback","setRecording","showDiscardPopup","btnCancelRecord","recordingOverlayListener","recordingNavigationItem","sourceNode","analyser","createAnalyser","connect","fftSize","frequencyData","frequencyBinCount","getByteFrequencyData","recordRippleEl","ms","recordTimeEl","needReturn","getCurrentInputAsDraft","no_webpage","draftsAreEqual","onHelperClick","forwardElements","rowsWrapperWrapper","rowsWrapper","fakeRowsWrapper","fakeSelectionWrapper","goDownBtn","controlContainer","iconBtn","cancelBtn","onHideAuthorClick","isChangingAuthor","canToggleHideAuthor","onHideCaptionClick","forwardButtons","hideSender","showCaption","hideCaption","changePeer","changeForwardRecipient","forwardBtnMenu","forwardWasDroppingAuthor","replyTitle","forwardHover","modifyArgs","newMessageWrapper","replyInTopicOverlay","inputMessageContainer","goDownUnreadBadge","goMentionBtn","goMentionUnreadBadge","goToNextMention","btnScheduled","btnToggleReplyMarkup","replyKeyboard","botCommandsToggle","scaler","botCommandsIcon","attachMenuButtons","fileInput","attachMenu","attachMenuBots","appAttachMenuBotsManager","getAttachMenuBots","attachMenuBotsButtons","attachMenuBot","getAttachMenuBotIcon","requestWebView","webViewResultUrl","SANDBOX_ATTRIBUTES","verifyMap","attachMenuPeerTypeSameBotPM","attachMenuPeerTypeBotPM","attachMenuPeerTypePM","attachMenuPeerTypeChat","attachMenuPeerTypeBroadcast","peer_types","multiple","autocompleteHelperController","stickersHelper","emojiHelper","commandsHelper","mentionsHelper","inlineHelper","btnSendContainer","btnSend","attachMessageInputField","previousQuery","saveDraft","encoderSampleRate","monitorGain","numberOfChannels","recordingGain","reuseWorker","onstop","ondataavailable","typedArray","dataBlob","sendFile","isVoiceMessage","botStartBtn","toggleBotStartBtnDisability","startBot","pinnedControlBtn","originalChat","pinnedMessageContainer","_center","neededFakeContainer","fakeWrapperTo","oldFakeWrapperTo","fakeSelectionRect","fakeRowsRect","scale","initTranslateX","getNeededFakeContainer","isReplyInTopicOverlayNeeded","hasMentions","syncDraft","helperToo","clearInput","fromUpdate","getDraft","wrappedDraft","myEntities","apiEntities","wrapDraft","currentDraft","createSendAs","firstChange","sendAs","updateOffset","getPlaceholderKey","updateMessageInputPlaceholder","previousSendAs","ackedPeerFull","ackedScheduledMids","setSendAsCallback","filteredAttachMenuButtons","filterAttachMenuButtons","placeholderKey","hasBotCommands","updateBotCommands","updateMessageInput","haveSomethingInControl","isAnonymousSending","oldInputField","attachMessageInputListeners","fixSafariStickyInputFocusing","readAllHistory","commandsMap","canCombine","hasMarkup","executed","resetCurrentFormatting","setActiveMarkupButton","insertText","insertEntity","isHelper","fullValue","AUTO_COMPLETE_REG_EXP","matchIndex","foundHelper","checkInlineAutocomplete","setPreloaderShow","btnPreloader","inlineMatch","bot_inline_placeholder","inlinePlaceholder","helperWaitingForward","canSetDraft","fireEvent","clearValue","fixSafariStickyInput","getValueAndEntities","clearReply","unicode","pushRecentEmoji","forwardMessages","dropAuthor","dropCaptions","isDroppingCaptions","sendMessageWithDocument","hideCaptionCheckboxField","replyFragment","initMessagesForward","fromPeerIdsMids","fromPeerIds","smth","messagesWithCaptionsLength","peerTitles","titleKey","senderTitles","firstMessage","newReply","intl","peerTitleEl","_message","setReplyToMsgId","callerFunc","replyParent","oldReply","haveReply","CLASSNAME_BASE","PinnedContainer","floating","divAndCaption","wrapperUtils","attachOnCloseEvent","needClose","setFloating","setUtilsWidth","BAR_HEIGHTS","ChatAudio","onPlaybackParams","fasterEl","repeatEl","toggleEl","onStop","onMediaPlay","isMusic","prevEl","nextEl","attachClick","volumeProgressLineContainer","tunnel","progressWrapper","playingDetails","PinnedMessageBorder","drawRect","getClipPath","barHeight","GAP","clipPath","getBarHeight","ONE","TWO","THREE","FOUR","MORE","getMarkHeight","markHeight","getMarkTranslateY","getTrackTranslateY","trackHeight","getTrackHeight","clipPathId","markTranslateY","trackTranslateY","mark","AnimatedSuper","getRow","clearRow","clearRows","currentIndex","DURATION","setNewRow","reflow","previousIndex","fromTop","ignorePrevious","previousRow","AnimatedCounter","previousNumber","getDecimal","animatedSuper","decimal","hideLeft","previousDecimalNumber","EMPTY_INDEX","setCount","previousByDecimal","decimalNumber","ChatPinnedMessage","pinnedMaxMid","pinnedMid","pinnedIndex","wasPinnedIndex","wasPinnedMediaIndex","waitForScrollBottom","loadedBottom","loadedTop","scrollDownListenerSetter","getCurrentIndexPromise","isStatic","dAC","pinnedMessageBorder","animatedSubtitle","animatedMedia","animatedCounter","btnOpen","openPinned","setPinnedMessage","_setPinnedMessage","unsetScrollDownListener","testMid","isNeededMore","getCurrentIndex","LOAD_OFFSET","correctAfter","gotRest","getPinnedMessage","backLimited","offset_id_offset","setScrollDownListener","isDown","handleScrollSideEvent","refreshPosition","handleFollowingPinnedMessage","followPinnedMessage","isLast","writeTo","writeMediaTo","ChatTopbar","verifyButtons","isMenuOpen","btnMore","buttonsToVerify","menuButtons","verifyVideoChatButton","currentGroupCall","groupCall","verifyCallButton","getCachedFullUser","phone_calls_available","video_calls_available","onJoinGroupCallClick","joinGroupCall","resize","setUtilsRAF","chatUtils","chatAudio","setPeerStatusManual","btnBack","chatInfoContainer","chatInfo","person","avatarElement","deleteButtonText","btnJoin","btnPinned","btnCall","btnGroupCall","btnMute","btnSearch","pushButtonToVerify","onBtnBackClick","isFirstChat","constructUtils","linked_chat_id","onCallClick","chatContextMenuHintWasShown","contactPeerId","getAttachMenuBot","has_settings","constructAvatar","joinChannel","setMutedState","isTopMessage","hiddenPinnedMessages","byCurrent","setTitleCallback","setStatusCallback","setTitleManual","canHaveSomeButtons","wasAlreadyUsed","newPinnedMessage","AppPrivateSearchTab","appSearch","btnPickDate","ChatSearch","selectedIndex","onResultsClick","selectResult","onFooterClick","onUpClick","onDownClick","foundCountEl","upBtn","downBtn","footer","dateBtn","renderedCount","ChatBackgroundPatternRenderer","canvases","INSTANCES","renderToCanvas","fillCanvas","crossOrigin","imageBitmap","objectUrl","imageWidth","imageHeight","patternHeight","mask","centerY","topY","endY","bottomY","setCanvasDimensions","originalHeight","Chat","backgroundEl","backgroundTempId","sharedMediaTabs","setBackground","patternRenderer","gradientCanvas","previousGradientRenderer","previousPatternRenderer","previousPatternCanvas","isDarkPattern","getInstance","_gradientRenderer","setBackgroundPromise","setType","beforeDestroy","cleanupBackground","destroySharedMediaTab","searchTab","_isAnyGroup","setAutoDownloadMedia","getForumTopicOrReload","isSamePeer","bubblesSetPeerPromise","photoSizeMax","videoSizeMax","fileSizeMax","photo_size_max","video_size_max","getAutoDownloadSettingsByPeerId","callbacksPromise","ignoreThreadId","historyStorageTransferable","historySerialized","MarkupTooltip","waitingForMouseUp","mouseUpCounter","onMouseUpSingle","resetSelection","tools1","tools2","cancelClosening","linkBackButton","linkInput","applyLink","isLinkValid","setTooltipPosition","linkApplyButton","applyDiv","delimiter1","delimiter2","delimiter3","matchUrlProtocol","getActiveMarkupButton","currentMarkups","markup","activeButtons","isLinkToggle","bodyRect","selectionRect","inputRect","selectionTop","sizesRect","isFirstShow","setMouseUpEvent","handleSelection","ChatDragAndDrop","dropIcon","onDragOver","onDragLeave","onDrop","outlineWrapper","dropHeader","dropSubtitle","headerArgs","setPath","sizeX","sizeY","disableTransition","LineBlobDrawable","maxRadius","minRadius","N","radiusNext","speed","generateBlob","radDif","generateNextBlob","amplitude","speedScale","paint","pinnedTop","progressToPinned","r1","progressNext","x1","x2","cx","y1","y2","bezierCurveTo","WeavingState","stateId","createGradient","shader","getGradientFromType","x0","y0","dt","TopbarWeave","handleDevicePixelRatioChanged","setSize","forceUpdate","resizeHandler","resizeCanvas","invokeDraw","handleFocus","focused","handleBlur","lbd","lbd1","lbd2","currentState","previousState","progressToState","lastUpdateTime","animateToAmplitude","animateAmplitudeDiff","amplitude2","animateAmplitudeDiff2","top1","top2","paint1","setCurrentState","states","componentDidMount","matchMedia","setAmplitude","componentWillUnmount","setCanvasSize","RLottieIconItemPart","playPart","RLottieIconItem","createPart","initFrame","skipFirstFrameRendering","inverseColor","onLoadForColor","onLoadForPart","getPart","RLottieIcon","startFrame","endFrame","frameCount","SuperRLottieIcon","partState","colorState","getColor","partCallback","changedPartState","changedColorState","setPartState","setColorState","prevState","renderIfPaused","invoke","GroupCallMicrophoneIcon","GROUP_CALL_MICROPHONE_BUTTON_STATE","partName","HAND","MUTED","UNMUTED","GroupCallParticipantMutedIcon","colored","GROUP_CALL_PARTICIPANT_MUTED_STATE","colorStr","MUTED_FOR_ME","MUTED_BY_ADMIN","propertyValue","getColorByMutedState","generateEqualParts","clearMutedStateModifier","GroupCallParticipantStatusElement","element2","actionClassName","GroupCallParticipantsList","getParticipantByPeerId","onElementDestroy","getGroupCallParticipantMutedState","mutedIcon","callVideoCanvasBlur","GroupCallParticipantVideoElement","setPinned","setParticipant","groupCallParticipantMutedIcon","groupCallParticipantStatus","updateParticipant","GroupCallParticipantsVideoElement","participantsElements","groupCallId","setElementDisplay","pinnedSource","pinSource","unpinAll","setInstance","shouldDisplayElement","displayPinned","shouldDisplay","hasAnyVideo","participantElements","participantVideo","getVideoElementFromParticipantByType","_onLengthChange","GroupCallParticipantContextMenu","onOpenProfileClick","PopupGroupCall","targetPeerId","toggleParticipantMuted","editParticipant","canManageCall","can_self_unmute","muted_by_you","kickFromChat","getContainer","GroupCallParticipantsElement","groupCallParticipantsVideo","appGroupCallsManager","getGroupCallParticipants","GroupCallDescriptionElement","descriptionIntl","GroupCallTitleElement","makeButton","_className","buttonDiv","isConfirm","resizeHandlerClassName","MovableElement","fixDimensions","fixPosition","addResizeHandlers","setSwipeHandler","destroyElements","handlers","startTop","startLeft","startWidth","startHeight","resizingSide","isEnlarging","resizeDiff","maxPossible","setPositionToCenter","MovablePanel","toggleMovable","movable","movableOptions","toggleClassName","raise_hand_rating","onFullScreenClick","onToggleControls","buttonsContainer","onVideoClick","btnVideo","toggleVideoSharing","onScreenClick","btnScreen","toggleScreenSharing","toggleMuted","changeRaiseHand","onLeaveClick","hangUp","discard","toggleBigLayout","btnFullScreen","btnExitFullScreen","wasFullScreen","movablePanel","videosCount","wasBig","btnInvite","btnShowColumn","toggleRightColumn","btnFullScreen2","headerInfo","newHeader","newHeaderInfo","newHeaderTitle","btnHideColumn","videosScrollable","groupCallTitle","groupCallDescription","groupCallBodyHeaderDescription","constructButtons","groupCallParticipants","updateInstance","setHasPinned","groupCallMicrophoneIcon","_makeButton","microphoneIcon","btnLeave","setDescription","microphoneButtonState","getGroupCallMicrophoneButtonState","micState","CallDescriptionElement","connectionState","connectedAt","GroupCallMicrophoneIconMini","INIT_STATE","PopupCall","resizeVideoContainers","videoContainers","interlocutorUserId","emojisSubtitle","partyStates","partyMutedState","stateText","constructFirstButtons","constructSecondButtons","wasTryingToJoin","movableElement","controlsHover","getCallInstance","firstButtonsRow","muteI18nElement","secondButtonsRow","declineI18nElement","btnDecline","btnAccept","acceptCall","createVideoContainer","isPendingIncoming","isSharingVideo","isSharingScreen","outputState","getMediaState","oldContainers","mediaState","getVideoElement","hasFrame","hasPromise","videoState","screencastState","videoContainer","output","getEmojisFingerprint","popupWidth","MAX_WIDTH_PX","MAX_HEIGHT_PX","MAX_SIZE","biggestSideSize","widthRatio","heightRatio","TopbarCall","onState","amplitudes","weave","clearCurrentInstance","currentDescription","instanceListenerSetter","isChangingInstance","callDescription","convertCallStateToGroupState","groupCallMicrophoneIconMini","throttledMuteClick","weaveContainer","uiNotificationsManager","notificationsShown","notificationIndex","notificationsCount","soundsPlayed","vibrateSupport","faviconElements","titleBackup","titleChanged","stopped","pushInited","updateLocalSettings","updSettings","nodesktop","novibrate","nopreview","nopush","needPush","webPushApiManager","registeredDevice","nosound","requestPermission","Notification","mozVibrate","webkitVibrate","setAppBadge","notificationsUiSupport","notifySoundEl","topMessagesDeferred","toggleToggler","peerString","soundReset","unreadUnmutedPeerIds","tokenData","unregisterDevice","registerDevice","notificationData","custom","hasChat","hasUser","buildNotification","fwdCount","peerReaction","peerTypeNotifySettings","notification","getPeerString","notificationMessage","wrappedMessage","noIncrement","notificationFromPeerId","peerPhoto","loadAvatar","resetTitle","isBlink","setFavicon","titleInterval","textBaseline","textAlign","prevFavicon","testSound","permission","appRuntimeManager","onclose","getLocalSettings","nextSoundAt","prevSoundVolume","filename","token_type","tokenType","tokenValue","other_uids","app_sandbox","secret","getFilesFromEvent","onlyTypes","scanFiles","isDirectory","directoryReader","createReader","readEntries","itemFile","getAsFile","DataTransferItem","DragEvent","dataTransfer","webkitGetAsEntry","addAnchorListener","protocol","noCancelEvent","pathnameParams","uriParams","u","host","noPathnameParams","noUriParams","parseUriParams","AppImManager","columnEl","offline","updateStatusInterval","cacheStorage","saveState","onHashChangeUnsafe","tgaddr","openUrl","postId","openUsername","userName","setSettings","messagesTextSize","forceRenderAfterSize","chatsSelectTabDebounced","toggleChatGradientAnimation","onDocumentPaste","attachType","newMediaPopup","_types","canDrag","backgroundPromises","updateStatus","emojiAnimationContainer","appendEmojiAnimationContainer","createNewChat","chatsSelectTab","getPremium","compareVersion","deleteFilesIterative","applyCurrentTheme","resizeInstances","saveChatPosition","choosing","setChoosingStickerTyping","typing","onInstanceDeactivated","isUpdated","receiptMessage","onSpoilerClick","spoilerTimeout","stateStorage","topbarCall","discardCurrentCall","currentCall","setAuthorized","telegramMeWebManager","hashtag","STICKER_SET","EMOJI_SET","makeLink","INVOICE","VOICE_CHAT","USER_PHONE_NUMBER","thread","PRIVATE_POST","channel","comment","getStackFromElement","MESSAGE","attachKeydownListener","handleAutologinDomains","openWindow","onUrlAuthResult","urlAuthResult","botPeerTitle","logInCheckbox","allowMessagesCheckbox","request_write_access","confirmationPromise","logInChecked","allowMessagesChecked","acceptUrlAuth","onUrlAuthResultAccepted","requestUrlAuth","_appConfig","onAnchorClick","url_auth_domains","autologin_token","autologin_domains","originalUrl","searchParams","possibleBubble","timeoutOperation","requests","request","isBad","activatingChat","screen","IGNORE_KEYS","isSelectionCollapsed","getFirstMessageToEdit","getNextDialog","newEvent","KeyboardEvent","commentId","resolveChannel","op","checkChatInvite","saveApiChat","resolvePhone","getInputInvoiceBySlug","wrappedUrl","openComment","openPremiumBot","premium_bot_username","generateThreadServiceStartMessage","phone_calls_private","ignoreGroupCall","ignoreCall","discardGroupCallConfirmation","discardCallConfirmation","title1","title2","isClosing","getGroupCallFull","createGroupCall","setCurrentBackground","broadcastEvent","getBackground","getFile","lastBackgroundUrl","chatBubbles","chatPositions","backgroundUrl","attachDragAndDropListeners","drops","mediaDrops","isFiles","_dropsContainer","mediaDropsContainer","dropsContainer","_drops","foundMedia","onImTabChange","updateMyOnlineStatus","spliceChats","fromIndex","chatFrom","chatTo","chatIndex","existingIndex","oldChat","getTypingElement","eye","getPeerTyping","getPeerTypings","langPackKeys","multi","mapa","typingElement","descriptionElement","getChatStatus","typingEl","onlines","getOnlines","getPeerStatus","typingContainer","options1","options2","DialogColorsFg","DialogColors","DialogColorsMap","pic","peerParams","useBytes","bestPhotoSize","CallConnectionInstanceBase","connection","sources","createPeerConnection","config","RTCPeerConnection","signalingState","iceConnectionState","createDataChannel","dataChannel","createDescription","appendStreamToConference","streamManager","appendToConference","closeConnection","closeConnectionAndStream","stopStream","negotiate","negotiating","negotiateInternal","sendDataChannelData","parseSignalingData","sdp","parseMediaSectionInfo","fingerprint","ufrag","pwd","convertNumber","isSending","codec","ssrc","sourceGroups","ssrcGroups","sourceGroup","semantics","ssrcs","rtpExtensions","payloadTypesMap","getPayloadType","payloadType","clockrate","feedbackTypes","subtype","parameters","payloadTypes","CallConnectionInstance","localDescription","remoteDescription","descriptionInit","offerReceived","createAnswer","setLocalDescription","offer","createOffer","offerSent","initialSetup","sendCallSignalingData","crypto","subtle","P2PEncryptor","p2pKey","seqMap","concatSHA256","bufferConcats","encryptPrepared","msgKeyLarge","subarray","msgKey","aesKeyIv","prepareAesKeyIv","aesProcessCtr","encryptRawPacket","seq","ArrayBuffer","setUint32","sha256a","sha256b","iv","encryptedData","dataSize","encrypt","cryptoKey","constTimeIsDifferent","msgKeyEquals","decryptRawPacket","encryptedDataSize","decryptionBuffer","getUint32","ChromeP2PSdpBuilder","fingerprints","stringBuilder","streamName","addExtmap","addPayloadTypes","addSsrc","finalize","FirefoxP2PSdpBuilder","SafariP2PSdpBuilder","isFirefox","isSafari","extmap","j","fmtp","getOwnPropertyNames","pName","ssrcGroup","P2PSdpBuilder","sdpString","sdpMLineIndex","sdpMid","foundation","component","priority","relAddress","generation","tcpType","networkId","networkCost","candidate","generateOffer","generateAnswer","CallInstance","udp_p2p","udp_reflector","min_layer","max_layer","library_versions","createdAt","decryptQueue","candidates","canCreateConferenceEntry","setMediaState","sendMediaState","mediaStates","_sendMediaState","_connectionState","connectionInstance","sortIndex","findEntry","recvEntry","startScreenSharingInternal","wasStartingScreen","wasStartingVideo","requestScreen","stopVideoSharing","startVideoSharingInternal","requestInputSource","track","inputStream","getVideoTracks","stopTrack","isSharingVideoType","audioTrack","getAudioTracks","setHangUpTimeout","clearHangUpTimeout","hangUpTimeout","setPhoneCall","phoneCall","canAccept","overrideConnectionState","g_a_hash","appCallsManager","generateDh","dh","g_b","g_a","g_b_hash","getCallInput","phonePhoneCall","savePhonePhoneCall","joinCall","encryptionKey","configuration","iceServers","connections","ipv6","port","urls","turn","stun","credential","iceTransportPolicy","p2p_allowed","getRtcConfiguration","sendIceCandidate","onTrack","encryptor","decryptor","processDecryptQueue","createDataChannelEntry","dataChannelEntry","createEntry","sendEntry","negotiated","applyDataChannelData","TextEncoder","encode","iceCandidate","parsed","p2pParseCandidate","confirmCall","key_fingerprint","computeKey","emojisFingerprint","getEmojisFingerprintPromise","codePoints","unlockStreamManager","doTheMagic","getTransceivers","transceiver","getEntryByMid","bundle","sdpDescription","generateSdp","isAnswer","setRemoteDescription","onInputStream","stream","videoTrack","onMutedChange","requestAudioSource","setMuted","discardReason","discardedByOtherParty","hasVideo","discardCall","performCodec","_codec","setDataToDescription","setData","transport","screencast","filterNotVP8","vp8PayloadType","rtxIdx","apt","applyCallSignalingData","performSsrcGroups","getEntryBySource","sendRecvEntry","findFreeSendRecvEntry","setEntrySource","tryToReleaseCandidates","generateCandidate","RTCIceCandidate","addIceCandidate","decryptedData","TextDecoder","decode","signalingData","onUpdatePhoneCallSignalingData","getStreamCached","_cache","isScreen","constraints","getScreenStream","getStream","CallInstanceBase","fixSafariAudio","isSharingAudio","hasInputTrackKind","isAudioGood","isVideoGood","getAudioConstraints","getVideoConstraints","getScreenConstraints","endpoint","tryAddTrack","streams","saveInputVideoStream","isOutput","elementEndpoint","addTrack","useStream","outputStream","srcObject","sinkId","outputDeviceId","setSinkId","getTracks","addStream","CALL_STATE","audioAsset","CALL_REQUEST_TIMEOUT","CallsController","sortedInstances","createCallInstance","admin_id","g_a_or_b","bytesCmp","callId","getCallByUserId","hasConnected","hasCurrent","startCallInternal","fullInfo","participant_id","requestCall","GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX","GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS","GroupCallConnectionInstance","negotiateThrottled","bundlePolicy","rtcpMuxPolicy","iceCandidatePoolSize","maybeUpdateRemoteVideoConstraints","updateConstraintsInterval","invokeJoinGroupCall","localSdp","mainChannels","processedChannels","sectionInfo","payload","processMediaSection","audioChannel","videoChannel","useChannel","setEntryPeerId","performExtmap","filterServerCodecs","isNewConnection","originalOffer","iceRestart","hasMunged","skipAddingMulticast","mediaLine","mediaLineParts","localMLine","codecIds","newData","setPort","setSource","newSdp","addSsrcEntry","newChannel","mungedSdp","fixLocalOffer","entriesToDelete","shouldBeSkipped","answerDescription","deleteEntry","iceGatheringState","updateConstraints","sender","setParameters","getParameters","degradationPreference","colibriClass","defaultConstraints","onStageEndpoints","addInputVideoStream","GroupCallInstance","isSpeakingMap","pinnedSources","participantsSsrcs","hadAutoPinnedSources","dispatchPinnedThrottled","getCachedParticipants","presentation","unpinSource","changeUserMuted","source_groups","createConnectionInstance","raise","raiseHand","stopScreenSharing","startScreenSharing","startScreenSharingPromise","saveApiParticipant","leaveGroupCallPresentation","videoPaused","videoStopped","startVideoSharing","startVideoSharingPromise","rejoin","isDiscarded","isUpdatingMeInCurrentCall","onParticipantUpdate","doNotDispatchParticipantUpdate","hasLeft","oldSsrcs","modifiedTypes","oldSsrc","oldSource","oldEntry","originalDirection","setEndpoint","createTransceiver","GROUP_CALL_STATE","makeSsrcsFromParticipant","makeSsrcFromParticipant","audio_source","generateSelfVideo","audioSource","GroupCallsController","setCurrentGroupCall","startConnectingSound","stopConnectingSound","joinVideo","MediaStream","createMainStreamManager","joinGroupCallInternal","handleUpdateGroupCallParticipants","updatingSdp","channelCount","constraint","mediaDevices","getSupportedConstraints","constraintSupported","skipAudio","frameRate","screenStream","getDisplayMedia","contentHint","getUserMedia","clientInfo","lookupAttributeKeys","telegramSourceGroups","sdpLines","rest","parseSourceGroups","raw","ConferenceEntry","addTransceiver","generateSsrc","LocalConferenceDescription","sessionId","maxSeenId","entriesByMid","entriesBySource","entriesByPeerId","getEntriesByPeerId","conference","SDP","mediaSections","splitStringByLimitWithRest","UniqueNumberGenerator","generate","maxTries","_try","SDPAttributeSplitted","SDPMediaLineParts","SDPLine","SDPAttributeInner","missed","exists","nestedMap","makeAttributes","innerParts","SDPAttributes","fillAttributes","attributesMap","linesArray","SDPMediaSection","isReceiving","resultShouldBeArray","SDPSessionSection","parseSdp","createSection","sessionSection","lineStr","isIncorrectSdpLine","parseSdpLine","addSimulcast","generator","originalSsrcs","ssrcs2","ssrcsStrLines","ssrc2","WEBRTC_MEDIA_PORT","fixMediaLineType","getConnectionTypeForMediaType","generateMediaFirstLine","payloadIds","connectionType","SDPBuilder","addCandidate","performCandidate","addHeader","sId","bundleMids","addTransport","skipCandidates","addSource","addMsid","isApplication","isInactive","hdrexts","hdrext","fbs","fb","addConference","AudioStreamAnalyser","streamSource","createMediaStreamSource","gain","createGain","minDecibels","maxDecibels","smoothingTimeConstant","StreamManager","getAmplitude","streamAnalyser","analyse","ANALYSER_LISTENER","AudioContext","webkitAudioContext","getSource","itemSource","removeTrack","finalizeAddingTrack","changeTimer","substring","replaceInputAudio","oldTrack","timer","transceiverInit","tracks","mediaTrackType","trackIdx","replaceTrack","StringFromLineBuilder","newLine","addJoined","toTelegramSource","fromTelegramSource","rms","EMOJI_REG_EXP","getAbbreviation","onlyFirst","firstEmojiMatch","lastEmojiMatch","E","setBlankToAnchor","messageEntityTextUrl","messageEntityMentionName","isDraft","EMOJI_VERSIONS_SUPPORTED","inlineEl","newEmojiWidth","legacyEmojiWidth","isEmojiSupported","globalLazyLoadQueue","CustomEmojiElement","syncedPlayer","pausedElements","playersSynced","createCustomFiller","lastPausedVideo","middlewares","CustomEmojiRendererElement","clearedElements","WeakSet","isCanvasClean","emojiRenderers","getOffsets","offsetsMap","offsetParent","elementsArr","placeholders","isDimensionsSet","syncedPlayersFrames","isImageData","ImageData","frameWidth","frameHeight","lastChildWas","checkForAnyFrame","forceRenderAfter","renderEmojis","addCustomEmojis","addElements","usingOwnQueue","wrap","_loadPromises","newElements","isLottie","willHaveSyncedPlayer","newElementsArray","CUSTOM_EMOJI_INSTANT_PLAY","addition","_p","overrideRender","setRenderInterval","syncedPlayers","clearRenderInterval","missing","cachedPromises","uncachedPromisesPromise","loadFromPromises","uncached","emojiRenderInterval","renderers","nasty","usedLength","wrapSomething","wrapElement","noFiller","customWraps","contextSite","contextExternal","lastEntity","nextEntity","endPartOffset","fullEntityText","partText","usedText","fontFamily","atPos","fromBot","encodeURIComponent","isSupported","masked","currentContext","electronHelpers","contextUrl","wrapTelegramUrlToAnchor","encoded","encodeSpoiler","entityText","voodoo","insertCustomFillers","notFiller","isCustomFillerNeededBySiblingNode","url1","QueryableWorker","worker","terminate","onmessage","queryMethodListener","queryMethodArguments","postMessage","sendQuery","transfer","queryMethod","workersLimit","playersByCacheName","workers","curWorkerNum","onPlayerLoaded","reqId","fps","clamped","onPlayerError","getAnimation","setLoop","_autoplay","loadLottieWorkers","remain","Worker","queryableWorker","makeAssetUrl","loadAnimationAsAsset","loadAnimationFromURL","loadAnimationDataFromURL","blobConstruct","loadAnimationFromURLManually","loadAnimationFromURLNext","newParams","loadAnimationWorker","waitForFirstFrame","initPlayer","destroyWorkers","loadFromData","getLottiePixelRatio","RLottiePlayer","cachingDelta","CACHE","skipDelta","contexts","setMainLoop","clearPendingRAF","rafId","resetCurrentFrame","minFrame","requestFrame","applyInversing","renderFrame2","cachedSource","renderedFirstFrame","ImageBitmap","frInterval","frThen","frameNew","onLap","mainLoopForwards","mainLoopBackwards","currentMethod","frameListener","listenerResults","enterFrame","playToFrame","bounds","setMinMax","playToFrameOnFrameCallback","setInverseColor","pagesManager","pageId","pagesDiv","scrollableDiv","page","onShown","setPage","isAuthPage","Page","onFirstMount","encodeEmoji","emojiText","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","rawEmoji","unicodeSurrogates","points","getEmojiToneIndex","VIRTUAL_COUNTRIES_EMOJIS","getCountryEmoji","emojiFromCodePoints","fromCodePoint","module","exports","defineProperty","enumerable","Symbol","toStringTag","__esModule","prototype","isRecordingSupported","bufferLength","encoderApplication","encoderFrameSize","encoderPath","maxFramesPerPage","mediaTrackConstraints","resampleQuality","streamPages","wavBitDepth","encodedSamplePosition","WebAssembly","clearStream","audioContext","closeAudioContext","encodeBuffers","getChannelData","encoder","buffers","initAudioContext","initAudioGraph","scriptProcessorNode","createScriptProcessor","destination","onaudioprocess","inputBuffer","monitorGainNode","setMonitorGain","recordingGainNode","setRecordingGain","initSourceNode","loadWorker","initWorker","streamPage","storePage","recordedPages","samplePosition","finish","originalSampleRate","sampleRate","wavSampleRate","onpause","resume","onresume","setTargetAtTime","onstart","destroyWorker","Function","kSampleStepSize","float32ArraySupported","Float32Array","A","aA1","aA2","B","C","calcBezier","aT","getSlope","LinearEasing","mX1","mY1","mX2","mY2","sampleValues","aX","intervalStart","currentSample","kSplineTableSize","guessForT","initialSlope","aGuessT","currentSlope","newtonRaphsonIterate","aA","aB","currentX","currentT","binarySubdivide","getTForX"],"sourceRoot":""} \ No newline at end of file diff --git a/public/460.67f684b92b25fc4ed361.chunk.js b/public/460.67f684b92b25fc4ed361.chunk.js new file mode 100644 index 000000000..6f3eacf1a --- /dev/null +++ b/public/460.67f684b92b25fc4ed361.chunk.js @@ -0,0 +1,2 @@ +(this.webpackChunktweb=this.webpackChunktweb||[]).push([[460],{5814:(e,t,i)=>{"use strict";i.d(t,{Z:()=>m});var s=i(5400),n=i(3512),a=i(4762),o=i(410),r=i(8487),d=i(3772),l=i(1655),c=i(7625),h=i(2586),u=i(3013),p=i(3035);const f=new class{constructor(){this.observer=new IntersectionObserver((e=>{for(const t of e){const e=t.target;for(const i in this.byGroups){if(this.intersectionLockedGroups[i])continue;const s=this.byGroups[i].find((t=>t.el===e));if(s){if(t.isIntersecting)this.visible.add(s),this.checkAnimation(s,!1);else{this.visible.delete(s),this.checkAnimation(s,!0);const e=s.animation;e instanceof d.Z&&e.clearCache()}break}}}})),this.visible=new Set,this.overrideIdleGroups=new Set,this.byGroups={},this.byPlayer=new Map,this.lockedGroups={},this.onlyOnePlayableGroup="",this.intersectionLockedGroups={},this.videosLocked=!1,u.Z.addEventListener("play",(({doc:e})=>{"round"===e.type&&(this.videosLocked=!0,this.checkAnimations2())})),u.Z.addEventListener("pause",(()=>{this.videosLocked&&(this.videosLocked=!1,this.checkAnimations2())})),h.Z.addEventListener("change",(e=>{this.checkAnimations2(e)}))}setOverrideIdleGroup(e,t){t?this.overrideIdleGroups.add(e):this.overrideIdleGroups.delete(e)}getAnimations(e){const t=[];for(const i in this.byGroups)for(const s of this.byGroups[i])s.el===e&&t.push(s);return t}removeAnimation(e){const{el:t,animation:i}=e;i.remove(),i instanceof HTMLVideoElement&&a.IS_SAFARI&&setTimeout((()=>{i.src="",i.load()}),1e3);const s=this.byGroups[e.group];s&&((0,l.Z)(s,e),s.length||delete this.byGroups[e.group]),this.observer.unobserve(t),this.visible.delete(e),this.byPlayer.delete(i)}removeAnimationByPlayer(e){const t=this.byPlayer.get(e);t&&this.removeAnimation(t)}addAnimation(e,t="",i,a){var o,r,l,c;if("none"===t||this.byPlayer.has(e))return;i||(e instanceof d.Z?i=e.el[0]:e instanceof s.KZ?i=e.canvas:e instanceof s.LD?i=null!==(o=e.placeholder)&&void 0!==o?o:e:e instanceof HTMLElement&&(i=e));const h={el:i,animation:e,group:t,controlled:a};e instanceof d.Z&&!n.Z.settings.stickers.loop&&e.loop&&(e.loop=n.Z.settings.stickers.loop),(null!==(r=(l=this.byGroups)[c=t])&&void 0!==r?r:l[c]=[]).push(h),this.observer.observe(h.el),this.byPlayer.set(e,h)}checkAnimations(e,t,i,s){if(void 0!==t&&!this.byGroups[t])return;const n=void 0!==t?[t]:Object.keys(this.byGroups);for(const t of n){if(s&&this.intersectionLockedGroups[t])continue;const n=this.byGroups[t];(0,c.Z)(n,(t=>{this.checkAnimation(t,e,i)}))}}checkAnimations2(e){this.checkAnimations(e,void 0,void 0,!0)}checkAnimation(e,t,i){const{el:s,animation:n,group:a}=e;i||!this.lockedGroups[a]&&!(0,r.Z)(s)?e.controlled&&!i||this.removeAnimation(e):t||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||n instanceof HTMLVideoElement&&this.videosLocked?n.paused||n.pause():!(n.paused&&this.visible.has(e)&&n.autoplay)||this.onlyOnePlayableGroup&&this.onlyOnePlayableGroup!==a||h.Z.isIdle&&!this.overrideIdleGroups.has(e.group)||n.play()}getOnlyOnePlayableGroup(){return this.onlyOnePlayableGroup}setOnlyOnePlayableGroup(e=""){this.onlyOnePlayableGroup=e}lockGroup(e){this.lockedGroups[e]=!0}unlockGroup(e){delete this.lockedGroups[e],this.checkAnimations(void 0,e)}refreshGroup(e){const t=this.byGroups[e];(null==t?void 0:t.length)&&(t.forEach((e=>{this.observer.unobserve(e.el)})),(0,p.T2)((()=>{t.forEach((e=>{this.observer.observe(e.el)}))})))}lockIntersectionGroup(e){this.intersectionLockedGroups[e]=!0}unlockIntersectionGroup(e){delete this.intersectionLockedGroups[e],this.refreshGroup(e)}toggleIntersectionGroup(e,t){t?this.lockIntersectionGroup(e):this.unlockIntersectionGroup(e)}};o.GO&&(o.GO.animationIntersector=f);const m=f},3013:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L});var s=i(3512),n=i(3725),a=i(4762),o=i(410),r=i(6669),d=i(5432),l=i(2325),c=i(3719),h=i(8479),u=i(6848),p=i(3699),f=i(7530),m=i(493),g=i(2312),v=i(925),b=i(3241),y=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const w=(()=>{try{return a.IS_SAFARI&&+navigator.userAgent.match(/ Version\/(\d+)/)[1]<14}catch(e){return!1}})();class S extends b.Z{constructor(){super(...arguments),this.media=new Map,this.scheduled=new Map,this.mediaDetails=new Map,this.waitingMediaForLoad=new Map,this.waitingScheduledMediaForLoad=new Map,this.waitingDocumentsForLoad={},this.playbackRates={voice:1,video:1,audio:1},this.seekBackward=(e,t=this.playingMedia)=>{t&&(t.currentTime=Math.max(0,t.currentTime-(e.seekOffset||10)))},this.seekForward=(e,t=this.playingMedia)=>{t&&(t.currentTime=Math.min(t.duration,t.currentTime+(e.seekOffset||10)))},this.seekTo=(e,t=this.playingMedia)=>{t&&(t.currentTime=e.seekTime)},this.onMediaDocumentLoad=e=>y(this,void 0,void 0,(function*(){const t=this.mediaDetails.get(e),i=yield this.managers.appDocsManager.getDoc(t.docId);"audio"===i.type&&i.supportsStreaming&&w&&this.handleSafariStreamable(e);const s=yield this.managers.thumbsStorage.getCacheContext(i);e.src=s.url,this.playingMedia===e&&(e.playbackRate=this.playbackRate,"audio"===i.type&&(e.loop=this.loop));const n=this.waitingDocumentsForLoad[i.id];n&&(n.delete(e),n.size||delete this.waitingDocumentsForLoad[i.id])})),this.onPlay=e=>{const t=e.target,i=this.mediaDetails.get(t),{peerId:s,mid:n}=i,a=this.pip;a&&a.pause();const o=this.getMessageByMedia(t);if(this.playingMedia!==t){this.stop(),this.setMedia(t,o);const e=e=>e.mid===n&&e.peerId===s,i=this.listLoader,a=i.getCurrent();if(!a||!e(a)){let t;for(const s of[!1,!0]){const n=i.getPrevious(s);let a=n.findIndex(e);if(-1!==a?t=-(n.length-a):(a=i.getNext(s).findIndex(e),-1!==a&&(t=a+1)),void 0!==t)break}t?this.go(t,!1):this.setTargets({peerId:s,mid:n})}}setTimeout((()=>{this.playingMedia===t&&(this.dispatchEvent("play",this.getPlayingDetails()),this.pauseMediaInOtherTabs())}),0)},this.onPause=e=>{this.dispatchEvent("pause")},this.onEnded=e=>{if(!e.isTrusted)return;this.onPause(e);const t=this.listLoader;!this.lockedSwitchers&&(this.round||!t.current||t.next.length)&&t.getNext(!0).length&&this.next()||(this.stop(),this.dispatchEvent("stop"))},this.play=()=>this.toggle(!0),this.pause=()=>this.toggle(!1),this.stop=(e=this.playingMedia)=>{if(!e)return!1;if(e.paused||e.pause(),e.currentTime=0,(0,r.Z)(e,"ended"),e===this.playingMedia){const t=this.mediaDetails.get(e);if(null==t?void 0:t.clean){e.src="";const i=t.peerId,s=t.isScheduled?this.scheduled:this.media,n=s.get(i);n&&(n.delete(t.mid),n.size||s.delete(i)),e.remove(),this.mediaDetails.delete(e)}this.playingMedia=void 0,this.playingMediaType=void 0}return!0},this.playItem=e=>{const{peerId:t,mid:i}=e,s=this.searchContext.isScheduled;this.getMedia(t,i,s).play(),setTimeout((()=>{this.resolveWaitingForLoadMedia(t,i,s)}),0)},this.go=(e,t)=>{const i=this.listLoader;if(!this.lockedSwitchers&&i)return"audio"===this.playingMediaType?i.goRound(e,t):i.go(e,t)},this.browserPlay=this.bindBrowserCallback((e=>this.toggle(!0,e))),this.browserPause=this.bindBrowserCallback((e=>this.toggle(!1,e))),this.browserStop=this.bindBrowserCallback((e=>this.stop(e))),this.browserSeekBackward=this.bindBrowserCallback(((e,t)=>this.seekBackward(t,e))),this.browserSeekForward=this.bindBrowserCallback(((e,t)=>this.seekForward(t,e))),this.browserSeekTo=this.bindBrowserCallback(((e,t)=>this.seekTo(t,e))),this.browserNext=this.bindBrowserCallback((e=>e||this.next())),this.browserPrevious=this.bindBrowserCallback((e=>e?this.seekToStart(e):this.previous())),this.next=()=>this.go(1),this.previous=()=>{if(!this.seekToStart(this.playingMedia))return this.go(-1)}}construct(e){if(this.managers=e,this.container=document.createElement("div"),this.container.style.cssText="display: none;",document.body.append(this.container),navigator.mediaSession){const e={play:this.browserPlay,pause:this.browserPause,stop:this.browserStop,seekbackward:this.browserSeekBackward,seekforward:this.browserSeekForward,seekto:this.browserSeekTo,previoustrack:this.browserPrevious,nexttrack:this.browserNext};for(const t in e)try{navigator.mediaSession.setActionHandler(t,e[t])}catch(e){console.warn("MediaSession action is not supported:",t)}}s.Z.addEventListener("document_downloaded",(e=>{const t=this.waitingDocumentsForLoad[e];if(t)for(const e of t)this.onMediaDocumentLoad(e)})),s.Z.addEventListener("media_play",(()=>{this.skipMediaPlayEvent?this.skipMediaPlayEvent=!1:!this.pause()&&this.pip&&this.pip.pause()}));const t={};["volume","muted","playbackRate","loop","round"].forEach((e=>{const i="_"+e;t[e]={get:()=>this[i],set:t=>{this[i]!==t&&(this[i]=t,!this.playingMedia||"loop"===e&&"audio"!==this.playingMediaType||"round"===e||(this.playingMedia[e]=t),"playbackRate"===e&&void 0!==this.playingMediaType&&(this.playbackRates[this.playingMediaType]=t),this.dispatchPlaybackParams())}}})),Object.defineProperties(this,t)}dispatchPlaybackParams(){this.dispatchEvent("playbackParams",this.getPlaybackParams())}getPlaybackParams(){const{volume:e,muted:t,playbackRate:i,playbackRates:s,loop:n,round:a}=this;return{volume:e,muted:t,playbackRate:i,playbackRates:s,loop:n,round:a}}setPlaybackParams(e){this.playbackRates=e.playbackRates,this._volume=e.volume,this._muted=e.muted,this._playbackRate=e.playbackRate,this._loop=e.loop,this._round=e.round}addMedia(e,t,i){const{peerId:a,mid:o}=e,r=e.pFlags.is_scheduled?this.scheduled:this.media;let d=r.get(e.peerId);d||r.set(e.peerId,d=new Map);let l=d.get(o);if(l)return l;const c=(0,f.Z)(e);d.set(o,l=document.createElement("round"===c.type||"video"===c.type?"video":"audio")),"round"===c.type&&l.setAttribute("playsinline","true");const h={peerId:a,mid:o,docId:c.id,doc:c,message:e,clean:i,isScheduled:e.pFlags.is_scheduled};this.mediaDetails.set(l,h),l.volume=1,this.container.append(l),l.addEventListener("play",this.onPlay),l.addEventListener("pause",this.onPause),l.addEventListener("ended",this.onEnded),"audio"!==c.type&&(null==e?void 0:e.pFlags.media_unread)&&e.fromId!==s.Z.myId&&l.addEventListener("timeupdate",(()=>{this.managers.appMessagesManager.readMessages(a,[o])}),{once:!0});const u=(0,n.Z)();if(t)u.resolve();else{const t=e.pFlags.is_scheduled?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad;let i=t.get(a);i||t.set(a,i=new Map),i.set(o,u)}return u.then((()=>y(this,void 0,void 0,(function*(){if(c.supportsStreaming||(yield this.managers.thumbsStorage.getCacheContext(c)).url)this.onMediaDocumentLoad(l);else{let e=this.waitingDocumentsForLoad[c.id];e||(e=this.waitingDocumentsForLoad[c.id]=new Set),e.add(l),g.Z.downloadMediaURL({media:c})}})))),l}getMedia(e,t,i){const s=(i?this.scheduled:this.media).get(e);return null==s?void 0:s.get(t)}handleSafariStreamable(e){e.addEventListener("play",(()=>{const t=e.currentTime;e.addEventListener("progress",(()=>{e.currentTime=e.duration-1,e.addEventListener("progress",(()=>{e.currentTime=t,e.paused||e.play()}),{once:!0})}),{once:!0})}))}resolveWaitingForLoadMedia(e,t,i){const s=i?this.waitingScheduledMediaForLoad:this.waitingMediaForLoad,n=s.get(e);if(!n)return;const a=n.get(t);a&&(a.resolve(),n.delete(t),n.size||s.delete(e))}isSafariBuffering(e){return!!e.safariBuffering}setSafariBuffering(e,t){e.safariBuffering=t}setNewMediadata(e,t=this.playingMedia){var i,s;return y(this,void 0,void 0,(function*(){if(document.pictureInPictureElement)return;yield(0,v.Z)(t,void 0,!1);const n=(0,f.Z)(e),o=[],r="voice"===n.type||"round"===n.type;let c="",h="";if(null===(i=n.thumbs)||void 0===i?void 0:i.length){const i=n.thumbs[n.thumbs.length-1];if(!i.bytes){const s=yield this.managers.thumbsStorage.getCacheContext(n,i.type);s.url?o.push({src:s.url,sizes:`${i.w}x${i.h}`,type:"image/jpeg"}):g.Z.downloadMediaURL({media:n,thumb:i}).then((()=>{this.playingMedia===t&&s.url&&this.setNewMediadata(e)}))}}else if(r){const t=e.fromId||e.peerId;yield this.managers.appPeersManager.getPeerPhoto(t),c=yield(0,m.Z)({peerId:t,plainText:!0,onlyFirstName:!1}),h=l.ZP.format("voice"===n.type?"AttachAudio":"AttachRound",!0)}if(!r){const e=n.attributes.find((e=>"documentAttributeAudio"===e._));c=null!==(s=null==e?void 0:e.title)&&void 0!==s?s:n.file_name,h=null==e?void 0:e.performer}o.length||(a.IS_APPLE?d.Z?o.push({src:"assets/img/apple-touch-icon-precomposed.png",sizes:"180x180",type:"image/png"}):o.push({src:"assets/img/apple-touch-icon.png",sizes:"180x180",type:"image/png"}):[72,96,144,192,256,384,512].forEach((e=>{const t=`${e}x${e}`;o.push({src:`assets/img/android-chrome-${t}.png`,sizes:t,type:"image/png"})})));const u=new MediaMetadata({title:c,artist:h,artwork:o});navigator.mediaSession.metadata=u}))}setCurrentMediadata(){const{playingMedia:e}=this;if(!e)return;const t=this.getMessageByMedia(e);this.setNewMediadata(t,e)}getMessageByMedia(e){return this.mediaDetails.get(e).message}getPlayingDetails(){const{playingMedia:e}=this;if(!e)return;const t=this.getMessageByMedia(e);return{doc:(0,f.Z)(t),message:t,media:e,playbackParams:this.getPlaybackParams()}}pauseMediaInOtherTabs(){this.skipMediaPlayEvent=!0,s.Z.dispatchEvent("media_play")}toggle(e,t=this.playingMedia){return!!t&&(void 0===e&&(e=t.paused),t.paused===e&&(e?t.play():t.pause(),!0))}bindBrowserCallback(e){return t=>{e(this.pip,t)}}seekToStart(e){return(null==e?void 0:e.currentTime)>5&&(e.currentTime=0,this.toggle(!0,e),!0)}willBePlayed(e){this.willBePlayedMedia=e}setSearchContext(e){return!(0,u.Z)(this.searchContext,e)&&(this.searchContext=(0,h.Z)(e),!0)}getSearchContext(){return this.searchContext}setTargets(e,t,i){let s=this.listLoader;s?s.reset():s=this.listLoader=new c.Z({loadCount:10,loadWhenLeft:5,processItem:e=>(this.addMedia(e,!1),{peerId:e.peerId,mid:e.mid}),onJump:(e,t)=>{this.playItem(e)},onEmptied:()=>{this.dispatchEvent("stop"),this.stop()}});const n=void 0===this.searchContext.folderId;t?s.setTargets(t,i,n):s.reverse=n,s.setSearchContext(this.searchContext),s.current=e,s.load(!0),s.load(!1)}getPlaybackMediaTypeFromMessage(e){const t=(0,f.Z)(e);let i="audio";return(null==t?void 0:t.type)&&("voice"===t.type||"round"===t.type?i="voice":"video"===t.type&&(i="video")),i}setMedia(e,t){const i=this.getPlaybackMediaTypeFromMessage(t);this._playbackRate=this.playbackRates[i],this.playingMedia=e,this.playingMediaType=i,this.playingMedia.volume=this.volume,this.playingMedia.muted=this.muted,this.playingMedia.playbackRate=this.playbackRate,"audio"===i&&(this.playingMedia.loop=this.loop),"mediaSession"in navigator&&this.setNewMediadata(t)}setSingleMedia(e,t){const i=this.playingMedia,s=this.pause();let n;return e?(n=()=>{const e=this.pip;e&&e.pause(),this.pauseMediaInOtherTabs()},e.paused||n(),e.addEventListener("play",n)):this.pauseMediaInOtherTabs(),this.willBePlayed(void 0),e?this.setMedia(e,t):this.playingMedia=void 0,this.toggleSwitchers(!1),(t=s)=>{this.toggleSwitchers(!0),i&&(this.mediaDetails.get(i)?this.setMedia(i,this.getMessageByMedia(i)):this.next()||this.previous()),this.playingMedia===e&&(this.playingMedia=void 0,this.playingMediaType=void 0),e&&e.removeEventListener("play",n),t&&this.play()}}toggleSwitchers(e){this.lockedSwitchers=!e}setPictureInPicture(e){this.pip=e;const t=new p.Z;t.add(e)("leavepictureinpicture",(()=>{this.pip===e&&(this.pip=void 0,t.removeAll())}),{once:!0}),t.add(e)("play",(t=>{this.playingMedia!==e&&this.pause(),this.pauseMediaInOtherTabs()}))}}const C=new S;o.GO.appMediaPlaybackController=C;const L=C},1784:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L});var s=i(2341),n=i(3910),a=i(2738),o=i(8497),r=i(4668),d=i(130),l=i(4755),c=i(3719),h=i(2312),u=i(4271),p=i(3709),f=i(7530),m=i(5400),g=i(5824),v=i(5128),b=i(4524),y=i(8805),w=i(4332),S=i(1669),C=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class L extends g.Z{get searchContext(){return this.listLoader.searchContext}constructor(){let e;super(new c.Z({processItem:e=>{const t="inputMessagesFilterDocument"===this.searchContext.inputFilter._,{mid:i,peerId:s}=e,n=(0,f.Z)(e);if(n&&(!t||L.isMediaCompatibleForDocumentViewer(n)))return{element:null,mid:i,peerId:s}}}),["delete","forward"]),this.onPrevClick=e=>C(this,void 0,void 0,(function*(){this.openMedia(yield this.getMessageByPeer(e.peerId,e.mid),e.element,-1)})),this.onNextClick=e=>C(this,void 0,void 0,(function*(){this.openMedia(yield this.getMessageByPeer(e.peerId,e.mid),e.element,1)})),this.onDeleteClick=()=>{const e=this.target;new v.Z(e.peerId,[e.mid],"chat",(()=>{this.target={element:this.content.media},this.close()}))},this.onForwardClick=()=>{const e=this.target;e.mid&&new b.Z({[e.peerId]:[e.mid]},(()=>this.close()))},this.onAuthorClick=e=>C(this,void 0,void 0,(function*(){const{mid:t,peerId:i}=this.target;if(t&&t!==Number.MAX_SAFE_INTEGER){const s=this.searchContext.threadId,n=yield this.getMessageByPeer(i,t);this.close(e).then((()=>C(this,void 0,void 0,(function*(){if(l.Z.isMobile){const e=w.ZP.getTab(S.Z);e&&e.close()}u.ZP.setInnerPeer({peerId:n.peerId,lastMsgId:t,type:s?"discussion":void 0,threadId:s})}))))}})),this.onDownloadClick=()=>C(this,void 0,void 0,(function*(){const{peerId:e,mid:t}=this.target,i=yield this.getMessageByPeer(e,t),s=(0,f.Z)(i);s&&h.Z.downloadToDisc({media:s,queueId:u.ZP.chat.bubbles.lazyLoadQueue.queueId})})),this.listLoader.onEmptied=()=>{this.close()},this.content.caption=document.createElement("div"),this.content.caption.classList.add(g.x+"-caption","spoilers-container");const t=()=>{e&&clearTimeout(e),e=window.setTimeout((()=>{e=void 0,this.content.caption.classList.remove("is-focused")}),800)};this.content.caption.addEventListener("touchstart",(()=>{l.Z.isMobile&&(this.content.caption.classList.add("is-focused"),e&&(clearTimeout(e),e=void 0),document.addEventListener("touchend",t,{once:!0}))})),new y.ZP(this.content.caption).onAdditionalScroll=t,this.wholeDiv.append(this.content.caption),(0,a.fc)(this.buttons.delete,this.onDeleteClick);const i=[this.btnMenuForward={icon:"forward",text:"Forward",onClick:this.onForwardClick},this.btnMenuDownload={icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick},this.btnMenuDelete={icon:"delete danger",text:"Delete",onClick:this.onDeleteClick}];this.setBtnMenuToggle(i),this.setListeners()}setListeners(){super.setListeners(),(0,a.fc)(this.buttons.forward,this.onForwardClick),(0,a.fc)(this.author.container,this.onAuthorClick);const e=t=>{const i=(0,r.Z)(t.target,"A"),s=(0,o.Z)(t.target,"spoiler");if(i instanceof HTMLAnchorElement&&(!s||this.content.caption.classList.contains("is-spoiler-visible"))){const s=i.getAttribute("onclick");if(!s||s.includes("showMaskedAlert"))return;return(0,n.Z)(t),this.close().then((()=>{this.content.caption.removeEventListener("click",e,{capture:!0}),i.click()})),!1}};this.content.caption.addEventListener("click",e,{capture:!0})}getMessageByPeer(e,t){return this.searchContext.isScheduled?this.managers.appMessagesManager.getScheduledMessageByPeer(e,t):this.managers.appMessagesManager.getMessageByPeer(e,t)}setCaption(e){const t=e.message;let i="";t&&(i=(0,m.ZP)(t,{entities:e.totalEntities})),(0,d.Z)(this.content.caption.firstElementChild,i),this.content.caption.classList.toggle("hide",!t)}setSearchContext(e){return this.listLoader.setSearchContext(e),this}openMedia(e,t,i=0,s=!1,n=[],a=[]){const o=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return C(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const r=e.mid,d=e.fwd_from&&!e.fromId?e.fwd_from.from_name:e.fromId,l=(0,f.Z)(e),c=yield this.managers.appPeersManager.noForwards(e.peerId),h="messageService"===e._,u=h||!(yield this.managers.appMessagesManager.canForward(e)),m=(h?c:u)||!(0,p.Z)(e);[[[this.buttons.forward,this.btnMenuForward],u],[[this.buttons.download,this.btnMenuDownload],m],[[this.buttons.delete,this.btnMenuDelete],!(yield this.managers.appMessagesManager.canDeleteMessage(e))]].forEach((([e,t])=>{e.forEach((e=>{e instanceof HTMLElement?e.classList.toggle("hide",t):e.verify=()=>!t}))})),this.wholeDiv.classList.toggle("no-forwards",m),this.setCaption(e);const g=o._openMedia.call(this,l,e.date,d,i,t,s,n,a,e);return this.target.mid=r,this.target.peerId=e.peerId,g}))}static isMediaCompatibleForDocumentViewer(e){return"photo"===e._||s.Z.has(e.mime_type)}}},5824:(e,t,i)=>{"use strict";i.d(t,{x:()=>Q,Z:()=>Y});var s=i(3725),n=i(4755),a=i(5432),o=i(4762),r=i(5003),d=i(3013),l=i(3910),c=i(3699),h=i(3003),u=i(5322),p=i(7529),f=i(6733),m=i(5157),g=i(7207),v=i(8427),b=i(5701),y=i(3815),w=i(925),S=i(2738);class C extends p.Z{constructor({video:e,play:t=!1,streamable:i=!1,duration:s,onPlaybackRackMenuToggle:n,onPip:a,onPipClose:o}){if(super(),this.video=e,this.wrapper=document.createElement("div"),this.wrapper.classList.add("ckin__player"),this.onPlaybackRackMenuToggle=n,this.onPip=a,this.onPipClose=o,this.listenerSetter=new c.Z,this.setup({element:this.wrapper,listenerSetter:this.listenerSetter,canHideControls:()=>!(this.video.paused||this.playbackRateButton&&this.playbackRateButton.classList.contains("menu-open")),showOnLeaveToClassName:"media-viewer-caption",ignoreClickClassName:"ckin__controls"}),e.parentNode.insertBefore(this.wrapper,e),this.wrapper.appendChild(e),this.skin="default",this.stylePlayer(s),this.setBtnMenuToggle(),"default"===this.skin){const t=this.wrapper.querySelector(".default__controls.ckin__controls");this.progress=new g.Z(e,i),t.prepend(this.progress.container)}t&&e.play().catch((t=>{"NotAllowedError"===t.name&&(e.muted=!0,e.autoplay=!0,e.play())})).finally((()=>{this.wrapper.classList.toggle("is-playing",!this.video.paused)}))}stylePlayer(e){const{wrapper:t,video:i,skin:s,listenerSetter:n}=this;t.classList.add(s);const o=this.buildControls();let r;if(t.insertAdjacentHTML("beforeend",o),"default"===s){this.playbackRateButton=this.wrapper.querySelector(".playback-rate"),this.pipButton=this.wrapper.querySelector(".pip");const e=t.querySelectorAll(".toggle"),s=t.querySelector(".fullscreen"),o=t.querySelector("#time-elapsed");r=t.querySelector("#time-duration"),r.textContent=(0,m.Z)(0|i.duration);const c=new v.Z(n),h=t.querySelector(".left-controls");if(c.btn.classList.remove("btn-icon"),h.insertBefore(c.btn,o.parentElement),Array.from(e).forEach((e=>{(0,S.fc)(e,(()=>{this.togglePlay()}),{listenerSetter:this.listenerSetter})})),this.pipButton){(0,S.fc)(this.pipButton,(()=>{this.video.requestPictureInPicture()}),{listenerSetter:this.listenerSetter});const e=e=>{this.wrapper.style.visibility=e?"hidden":"",this.onPip&&this.onPip(e)},t=20,s=(0,b.Z)(e,t,!1,!0);n.add(i)("enterpictureinpicture",(()=>{s(!0),n.add(i)("leavepictureinpicture",(()=>{const e=n.add(i)("pause",(()=>{clearTimeout(s),this.onPipClose&&this.onPipClose()}),{once:!0}),s=setTimeout((()=>{n.remove(e)}),t)}),{once:!0})})),n.add(i)("leavepictureinpicture",(()=>{s(!1)}))}a.Z||((0,S.fc)(i,(()=>{this.togglePlay()}),{listenerSetter:this.listenerSetter}),n.add(document)("keydown",(e=>{if(y.Z.overlaysActive>1||document.pictureInPictureElement===i)return;const{key:s,code:n}=e;let a=!0;if("KeyF"===n)this.toggleFullScreen();else if("KeyM"===n)d.Z.muted=!d.Z.muted;else if("Space"===n)this.togglePlay();else if(!e.altKey||"Equal"!==n&&"Minus"!==n)!t.classList.contains("ckin__fullscreen")||"ArrowLeft"!==s&&"ArrowRight"!==s?a=!1:"ArrowLeft"===s?d.Z.seekBackward({action:"seekbackward"}):d.Z.seekForward({action:"seekforward"});else{const e="Equal"===n?1:-1,t=d.Z.playbackRate,i=C.PLAYBACK_RATES.indexOf(t)+e;i>=0&&i{a.Z||this.toggleFullScreen()})),(0,S.fc)(s,(()=>{this.toggleFullScreen()}),{listenerSetter:this.listenerSetter}),(0,f.Ms)(t,this.onFullScreen.bind(this,s),n),n.add(i)("timeupdate",(()=>{o.textContent=(0,m.Z)(0|i.currentTime)})),n.add(i)("play",(()=>{t.classList.add("played"),a.Z||n.add(i)("play",(()=>{this.hideControls(!0)}))}),{once:!0}),n.add(i)("pause",(()=>{this.showControls(!1)})),n.add(d.Z)("playbackParams",(()=>{this.setPlaybackRateIcon()}))}n.add(i)("play",(()=>{t.classList.add("is-playing")})),n.add(i)("pause",(()=>{t.classList.remove("is-playing")})),i.duration||e?r.textContent=(0,m.Z)(Math.round(i.duration||e)):(0,w.Z)(i).then((()=>{r.textContent=(0,m.Z)(Math.round(i.duration))}))}togglePlay(){this.video[this.video.paused?"play":"pause"]()}buildControls(){const e=this.skin;if("default"===e)return`\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n ${!o.IS_MOBILE&&document.pictureInPictureEnabled?``:""}\n \n
\n
\n
`}setBtnMenuToggle(){const e=C.PLAYBACK_RATES.map(((e,t)=>({regularText:e+"x",onClick:()=>{d.Z.playbackRate=e}}))),t=(0,h.b)({buttons:e});t.classList.add("top-left"),(0,u.v)({el:this.playbackRateButton,onOpen:this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!0)}:void 0,onClose:this.onPlaybackRackMenuToggle?()=>{this.onPlaybackRackMenuToggle(!1)}:void 0}),this.playbackRateButton.append(t),this.setPlaybackRateIcon()}setPlaybackRateIcon(){const e=this.playbackRateButton;C.PLAYBACK_RATES_ICONS.forEach((t=>{t="tgico-"+t,e.classList.remove(t)}));let t=C.PLAYBACK_RATES.indexOf(d.Z.playbackRate);-1===t&&(t=C.PLAYBACK_RATES.indexOf(1)),e.classList.add("tgico-"+C.PLAYBACK_RATES_ICONS[t])}toggleFullScreen(){const e=this.wrapper;if(o.IS_APPLE_MOBILE){const e=this.video;return e.webkitEnterFullscreen(),void e.enterFullscreen()}(0,f.rB)()?(0,f.C8)():(0,f.Dj)(e)}onFullScreen(e){const t=(0,f.rB)();this.wrapper.classList.toggle("ckin__fullscreen",t),t?(e.classList.remove("tgico-fullscreen"),e.classList.add("tgico-smallscreen"),e.setAttribute("title","Exit Full Screen")):(e.classList.remove("tgico-smallscreen"),e.classList.add("tgico-fullscreen"),e.setAttribute("title","Full Screen"))}cleanup(){super.cleanup(),this.listenerSetter.removeAll(),this.progress.removeListeners(),this.onPlaybackRackMenuToggle=this.onPip=void 0}}C.PLAYBACK_RATES=[.5,1,1.5,2],C.PLAYBACK_RATES_ICONS=["playback_05","playback_1x","playback_15","playback_2x"];var L=i(3512),E=i(5814),I=i(9331),M=i(2230),P=i(3442),Z=i(3757),k=i(632),T=i(6385),x=i(8497),A=i(6740),_=i(8204),F=i(9171),D=i(5565),R=i(3035),B=i(65),N=i(241),O=i(3241),U=i(1507),H=i(7660),z=i(8580),j=i(1713),G=i(8115),V=i(4421),K=i(2312),W=i(7362),$=i(2796),q=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Q="media-viewer";class Y extends O.Z{get target(){return this.listLoader.current}set target(e){this.listLoader.current=e}constructor(e,t){super(!1),this.listLoader=e,this.author={},this.content={},this.buttons={},this.tempId=0,this.preloader=null,this.preloaderStreamable=null,this.isFirstOpen=!0,this.pageEl=document.getElementById("page-chats"),this.zoomElements={},this.zoomSwipeStartX=0,this.zoomSwipeStartY=0,this.zoomSwipeX=0,this.zoomSwipeY=0,this.setZoomValue=(e=this.zoomElements.rangeSelector.value)=>{1===e&&(this.zoomSwipeX=0,this.zoomSwipeY=0),this.moversContainer.style.transform=`matrix(${e}, 0, 0, ${e}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`,this.zoomElements.btnOut.classList.toggle("inactive",.5===e),this.zoomElements.btnIn.classList.toggle("inactive",4===e),this.toggleZoom(1!==e)},this.onClick=e=>{if(this.setMoverAnimationPromise)return;const t=e.target;if("A"===t.tagName)return;if((0,l.Z)(e),a.Z)return this.highlightSwitchersTimeout?clearTimeout(this.highlightSwitchersTimeout):this.wholeDiv.classList.add("highlight-switchers"),void(this.highlightSwitchersTimeout=window.setTimeout((()=>{this.wholeDiv.classList.remove("highlight-switchers"),this.highlightSwitchersTimeout=0}),3e3));const i=this.isZooming();let s=null;const n=["ckin__player","media-viewer-buttons","media-viewer-author","media-viewer-caption","zoom-container"];i&&n.push("media-viewer-movers"),n.find((e=>{try{if(s=(0,x.Z)(t,e),s)return!0}catch(e){return!1}})),s&&(i||"IMG"!==t.tagName&&"image"!==t.tagName)||this.close()},this.onKeyDown=e=>{if(y.Z.overlaysActive>1)return;const t=e.key;let i=!0;"ArrowRight"===t?this.buttons.next.click():"ArrowLeft"===t?this.buttons.prev.click():"-"===t||"="===t?this.ctrlKeyDown&&this.changeZoom("="===t):i=!1,(e.ctrlKey||e.metaKey)&&(this.ctrlKeyDown=!0),i&&(0,l.Z)(e)},this.onKeyUp=e=>{y.Z.overlaysActive>1||e.ctrlKey||e.metaKey||(this.ctrlKeyDown=!1,this.isZooming()&&this.setZoomValue())},this.onWheel=e=>{if(!(y.Z.overlaysActive>1||(0,x.Z)(e.target,"media-viewer-caption")&&!this.ctrlKeyDown)&&((0,l.Z)(e),this.ctrlKeyDown)){const t=e.deltaY<0;this.changeZoom(!!t)}},this.managers=L.Z.managers,this.log=(0,r.kg)("AMV"),this.preloader=new P.Z,this.preloaderStreamable=new P.Z({cancelable:!1,streamable:!0}),this.preloader.construct(),this.preloaderStreamable.construct(),this.lazyLoadQueue=new V.Z,this.wholeDiv=document.createElement("div"),this.wholeDiv.classList.add(Q+"-whole"),this.overlaysDiv=document.createElement("div"),this.overlaysDiv.classList.add("overlays");const i=document.createElement("div");i.classList.add(Q);const s=this.topbar=document.createElement("div");s.classList.add(Q+"-topbar",Q+"-appear");const n=document.createElement("div");n.classList.add(Q+"-topbar-left"),this.buttons["mobile-close"]=(0,M.Z)("close",{onlyMobile:!0}),this.author.container=document.createElement("div"),this.author.container.classList.add(Q+"-author","no-select");const o=document.createElement("div");this.author.avatarEl=new I.Z,this.author.avatarEl.classList.add(Q+"-userpic","avatar-44"),this.author.nameEl=document.createElement("div"),this.author.nameEl.classList.add(Q+"-name"),this.author.date=document.createElement("div"),this.author.date.classList.add(Q+"-date"),o.append(this.author.nameEl,this.author.date),this.author.container.append(this.author.avatarEl,o);const d=document.createElement("div");d.classList.add(Q+"-buttons"),t.concat(["download","zoom","close"]).forEach((e=>{const t=(0,M.Z)(e,{noRipple:!0});this.buttons[e]=t,d.append(t)})),this.buttons.zoom.classList.add("zoom-in"),this.zoomElements.container=document.createElement("div"),this.zoomElements.container.classList.add("zoom-container"),this.zoomElements.btnOut=(0,M.Z)("zoomout",{noRipple:!0}),(0,S.fc)(this.zoomElements.btnOut,(()=>this.changeZoom(!1))),this.zoomElements.btnIn=(0,M.Z)("zoomin",{noRipple:!0}),(0,S.fc)(this.zoomElements.btnIn,(()=>this.changeZoom(!0))),this.zoomElements.rangeSelector=new B.Z({step:.5,min:.5,max:4,withTransition:!0},1),this.zoomElements.rangeSelector.setListeners(),this.zoomElements.rangeSelector.setHandlers({onScrub:this.setZoomValue,onMouseUp:()=>this.setZoomValue()}),this.zoomElements.container.append(this.zoomElements.btnOut,this.zoomElements.rangeSelector.container,this.zoomElements.btnIn),this.wholeDiv.append(this.zoomElements.container),this.content.main=document.createElement("div"),this.content.main.classList.add(Q+"-content"),this.content.container=document.createElement("div"),this.content.container.classList.add(Q+"-container"),this.content.media=document.createElement("div"),this.content.media.classList.add(Q+"-media"),this.content.container.append(this.content.media),this.content.main.append(this.content.container),i.append(this.content.main),this.overlaysDiv.append(i),n.append(this.buttons["mobile-close"],this.author.container),s.append(n,d),this.buttons.prev=document.createElement("div"),this.buttons.prev.className=`${Q}-switcher ${Q}-switcher-left`,this.buttons.prev.innerHTML=``,this.buttons.next=document.createElement("div"),this.buttons.next.className=`${Q}-switcher ${Q}-switcher-right`,this.buttons.next.innerHTML=``,this.moversContainer=document.createElement("div"),this.moversContainer.classList.add(Q+"-movers"),this.wholeDiv.append(this.overlaysDiv,this.buttons.prev,this.buttons.next,this.topbar,this.moversContainer),this.listLoader.onLoadedMore=()=>{this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length)},this.setNewMover()}setListeners(){(0,S.fc)(this.buttons.download,this.onDownloadClick),[this.buttons.close,this.buttons["mobile-close"],this.preloaderStreamable.preloader].forEach((e=>{(0,S.fc)(e,this.close.bind(this))})),[[-1,this.buttons.prev],[1,this.buttons.next]].forEach((([e,t])=>{t.addEventListener("click",(t=>{(0,l.Z)(t),this.setMoverPromise||this.listLoader.go(e)}))})),(0,S.fc)(this.buttons.zoom,(()=>{this.isZooming()?this.toggleZoom(!1):this.changeZoom(!0)})),this.wholeDiv.addEventListener("click",this.onClick),this.listLoader.onJump=(e,t)=>{t?this.onNextClick(e):this.onPrevClick(e)},a.Z&&new Z.Z({element:this.wholeDiv,onSwipe:(e,t)=>{if(!(0,f.rB)())return Math.abs(e)/N.Z.width>.2||e>125?(e>0?this.buttons.prev.click():this.buttons.next.click(),!0):(Math.abs(t)/N.Z.height>.2||t>125)&&(this.close(),!0)},verifyTouchTarget:e=>(console.log("verify"),"INPUT"!==e.target.tagName&&!(0,x.Z)(e.target,"media-viewer-caption"))})}toggleZoom(e){const t=this.isZooming();if((this.zoomElements.rangeSelector.mousedown||this.ctrlKeyDown)&&(e=!0),t===e)return;void 0===e&&(e=!t),this.buttons.zoom.classList.toggle("zoom-in",!e),this.zoomElements.container.classList.toggle("is-visible",e);const i=e?this.zoomElements.rangeSelector.value:1;if(this.setZoomValue(i),this.zoomElements.rangeSelector.setProgress(i),this.videoPlayer&&this.videoPlayer.lockControls(!e&&void 0),e){if(this.zoomSwipeHandler)this.zoomSwipeHandler.setListeners();else{let e,t;const i=1;this.zoomSwipeHandler=new Z.Z({element:this.moversContainer,onFirstSwipe:()=>{e=t=0,this.moversContainer.classList.add("no-transition")},onSwipe:(s,n)=>{[s,n]=[s*i,n*i],this.zoomSwipeX+=s-e,this.zoomSwipeY+=n-t,[e,t]=[s,n],this.setZoomValue()},onReset:()=>{this.moversContainer.classList.remove("no-transition")},cursor:"move"})}this.zoomElements.rangeSelector.setProgress(i)}else e||this.zoomSwipeHandler.removeListeners()}changeZoom(e){this.zoomElements.rangeSelector.addProgress(.5*(e?1:-1)),this.setZoomValue()}isZooming(){return this.zoomElements.container.classList.contains("is-visible")}setBtnMenuToggle(e){const t=(0,u.Z)({buttonOptions:{onlyMobile:!0},direction:"bottom-left",buttons:e});this.topbar.append(t)}close(e){var t;if(e&&(0,l.Z)(e),this.setMoverAnimationPromise)return Promise.reject();this.navigationItem&&T.Z.removeItem(this.navigationItem),this.lazyLoadQueue.clear();const i=this.setMoverToTarget(null===(t=this.target)||void 0===t?void 0:t.element,!0).then((({onAnimationEnd:e})=>e));return this.listLoader.reset(),this.listLoader.cleanup&&this.listLoader.cleanup(),this.setMoverPromise=null,this.tempId=-1,window.appMediaViewer===this&&(window.appMediaViewer=void 0),this.removeGlobalListeners(),this.zoomSwipeHandler=void 0,i.finally((()=>{this.wholeDiv.remove(),this.toggleOverlay(!1)})),i}toggleOverlay(e){y.Z.isOverlayActive=e,E.Z.checkAnimations2(e)}toggleGlobalListeners(e){e?this.setGlobalListeners():this.removeGlobalListeners()}removeGlobalListeners(){this.zoomSwipeHandler&&this.zoomSwipeHandler.removeListeners(),window.removeEventListener("keydown",this.onKeyDown),window.removeEventListener("keyup",this.onKeyUp),window.removeEventListener("wheel",this.onWheel,{capture:!0})}setGlobalListeners(){this.isZooming()&&this.zoomSwipeHandler.setListeners(),window.addEventListener("keydown",this.onKeyDown),window.addEventListener("keyup",this.onKeyUp),a.Z||window.addEventListener("wheel",this.onWheel,{passive:!1,capture:!0})}setMoverToTarget(e,t=!1,i=0){return q(this,void 0,void 0,(function*(){this.dispatchEvent("setMoverBefore");const n=this.content.mover;t||(n.innerHTML="");const a=this.isZooming()&&t?this.zoomElements.rangeSelector.value:1;this.removeCenterFromMover(n);const o=0!==i,r=L.Z.settings.animationsEnabled?o?350:200:0;let d,l;e&&(e instanceof I.Z||e.classList.contains("grid-item")?(d=e,l=e.getBoundingClientRect()):e instanceof SVGImageElement||e.parentElement instanceof SVGForeignObjectElement?(d=(0,x.Z)(e,"attachment"),l=d.getBoundingClientRect()):e.classList.contains("profile-avatars-avatar")&&(d=(0,x.Z)(e,"profile-avatars-container"),l=d.getBoundingClientRect(),t&&e.getBoundingClientRect().left!==l.left&&(e=d=l=void 0))),e||(e=this.content.media),l||(d=e.parentElement,l=e.getBoundingClientRect());let c=!1;if(e!==this.content.media&&!e.classList.contains("profile-avatars-avatar")){const i=(0,x.Z)(d,"scrollable"),s=(0,_.Z)(d,i,!0);!t||s&&2!==s.overflow.vertical&&2!==s.overflow.horizontal?!s||1!==s.overflow.vertical&&1!==s.overflow.horizontal||(c=!0):(d=(e=this.content.media).parentElement,l=e.getBoundingClientRect())}const h=this.content.media.getBoundingClientRect();let u,p,f,m="";if(o?(u=1===i?N.Z.width:-h.width,p=h.top):(u=l.left,p=l.top),m+=`translate3d(${u}px,${p}px,0) `,e instanceof HTMLImageElement||e instanceof HTMLVideoElement||"DIV"===e.tagName){if(n.firstElementChild&&n.firstElementChild.classList.contains("media-viewer-aspecter")){f=n.firstElementChild;const e=f.querySelector(".ckin__player");if(e){const t=e.firstElementChild;f.append(t),e.remove()}f.style.cssText||(n.classList.remove("active"),this.setFullAspect(f,h,l),n.offsetLeft,n.classList.add("active"))}else f=document.createElement("div"),f.classList.add("media-viewer-aspecter"),n.prepend(f);f.style.cssText=`width: ${l.width}px; height: ${l.height}px; transform: scale3d(${h.width/l.width}, ${h.height/l.height}, 1);`}n.style.width=h.width+"px",n.style.height=h.height+"px";const g=l.width/h.width,v=l.height/h.height;o||(m+=`scale3d(${g},${v},1) `);let b=window.getComputedStyle(d).getPropertyValue("border-radius");const y=function(e){const t=e.split(" ");if(4!==t.length){t[0]||(t[0]="0px");for(let e=t.length;e<4;++e)t[e]=t[e%2]||t[0]||"0px"}return t}(b);if(b=y.map((e=>parseInt(e)/g+"px")).join(" "),o||(n.style.borderRadius=b),t&&1!==a){const e=N.Z.width/2-l.width/2,t=N.Z.height/2-l.height/2,i=l.left-e,s=l.top-t;this.moversContainer.style.transform=`matrix(${g}, 0, 0, ${v}, ${i}, ${s})`}else n.style.transform=m;let w;c&&(n.style.opacity="0");const S=e.classList.contains("is-out"),C=this.setMoverAnimationPromise=(0,s.Z)(),E={onAnimationEnd:C},M=setTimeout((()=>{C.isFulfilled||C.isRejected||C.resolve()}),1e3);if(C.finally((()=>{this.dispatchEvent("setMoverAfter"),this.setMoverAnimationPromise===C&&(this.setMoverAnimationPromise=null),clearTimeout(M)})),t)return e instanceof SVGSVGElement&&(w=n.querySelector("path"),w&&this.sizeTailPath(w,h,g,r,!1,S,b)),e.classList.contains("media-viewer-media")&&n.classList.add("hiding"),this.toggleWholeActive(!1),setTimeout((()=>{n.style.borderRadius=b,n.firstElementChild&&(n.firstElementChild.style.borderRadius=b)}),r/2),setTimeout((()=>{n.innerHTML="",n.classList.remove("moving","active","hiding"),n.style.cssText="display: none;",C.resolve()}),r),n.classList.remove("opening"),E;{let t,i;const s="video, img, .canvas-thumbnail",a=e.matches(s)?e.parentElement:e,r=Array.from(a.querySelectorAll(s));if(r.length){e=r.pop();const t=document.createElement("canvas"),i=t.getContext("2d");e instanceof HTMLImageElement?(t.width=e.naturalWidth,t.height=e.naturalHeight):e instanceof HTMLVideoElement?(t.width=e.videoWidth,t.height=e.videoHeight):e instanceof HTMLCanvasElement&&(t.width=e.width,t.height=e.height),t.className="canvas-thumbnail thumbnail media-photo",i.drawImage(e,0,0),e=t}if("DIV"===e.tagName||"AVATAR-ELEMENT"===e.tagName){const s=Array.from(e.querySelectorAll("img")).pop();s&&(t=new Image,i=s.src,n.append(t))}else if(e instanceof HTMLImageElement)t=new Image,i=e.src;else if(e instanceof HTMLVideoElement)t=(0,H.Z)(),t.src=e.src;else if(e instanceof SVGSVGElement){const t=e.dataset.clipId,i=t+"-mv",{width:s,height:a}=h,o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.setAttributeNS(null,"width",""+s),o.setAttributeNS(null,"height",""+a),o.setAttributeNS(null,"viewBox",`0 0 ${s} ${a}`),o.setAttributeNS(null,"preserveAspectRatio","xMidYMid meet"),o.insertAdjacentHTML("beforeend",e.firstElementChild.outerHTML.replace(t,i)),o.insertAdjacentHTML("beforeend",e.lastElementChild.outerHTML.replace(t,i));const r=o.firstElementChild,d=r.firstElementChild.firstElementChild;if(d instanceof SVGUseElement){let e,t=d.getAttributeNS(null,"transform");t=t.replace(/translate\((.+?), (.+?)\) scale\((.+?), (.+?)\)/,((e,t,i,n,o)=>`translate(${t=2!=(t=+t)?s-2/g:2/g}, ${a}) scale(${+n/g}, ${+o/v})`)),d.setAttributeNS(null,"transform",t),w=r.firstElementChild.lastElementChild;const i=b.split(" ").map((e=>parseInt(e)));e=S?(0,F.Z)(0,0,s-9/g,a,...i):(0,F.Z)(9/g,0,s-9/g,a,...i),w.setAttributeNS(null,"d",e)}const l=o.lastElementChild;l.setAttributeNS(null,"width",""+h.width),l.setAttributeNS(null,"height",""+h.height),n.prepend(o)}else e instanceof HTMLCanvasElement&&(t=e);f&&(f.style.borderRadius=b,t&&f.append(t)),t=n.querySelector("video, img"),t instanceof HTMLImageElement&&(t.classList.add("thumbnail"),f||(t.style.width=h.width+"px",t.style.height=h.height+"px"),i&&(yield(0,A.cj)(t,i))),n.style.display="",(0,R.T2)((()=>{n.classList.add(o?"moving":"active")}))}return n.classList.add("opening"),yield(0,R.d1)(),n.style.transform=`translate3d(${h.left}px,${h.top}px,0) scale3d(1,1,1)`,c&&(n.style.opacity=""),f&&this.setFullAspect(f,h,l),setTimeout((()=>{n.style.borderRadius="",n.firstElementChild&&(n.firstElementChild.style.borderRadius="")}),0),n.dataset.timeout=""+setTimeout((()=>{n.classList.remove("moving","opening"),f&&(n.querySelector("video"),n.classList.remove("active"),f.style.cssText="",n.offsetLeft),n.classList.add("center","no-transition"),n.classList.add("active"),delete n.dataset.timeout,C.resolve()}),r),w&&this.sizeTailPath(w,h,g,r,!0,S,b),E}))}toggleWholeActive(e){e?this.wholeDiv.classList.add("active"):(this.wholeDiv.classList.add("backwards"),setTimeout((()=>{this.wholeDiv.classList.remove("active")}),0))}setFullAspect(e,t,i){const s=t.width/t.height;let{width:n,height:a}=i;s>0?n=a*s:a=n*s,e.style.cssText=`width: ${n}px; height: ${a}px; transform: scale3d(${t.width/n}, ${t.height/a}, 1);`}sizeTailPath(e,t,i,s,n,a,o){const r=Date.now(),{width:d,height:l}=t;s/=2;const c=o.split(" ").map((e=>parseInt(e))),h=()=>{const t=Date.now()-r;let o=s?t/s:1;o>1&&(o=1),n&&(o=1-o);const u=c.map((e=>e*o));let p;p=a?(0,F.Z)(0,0,d-9/i*o,l,...u):(0,F.Z)(9/i*o,0,d,l,...u),e.setAttributeNS(null,"d",p),t{const a=t?-s.width:i;return e.replace(n,a+"px")}));e.style.transform=n,setTimeout((()=>{e.remove()}),350)}setNewMover(){const e=document.createElement("div");return e.classList.add("media-viewer-mover"),e.style.display="none",this.content.mover?this.content.mover.parentElement.append(e):this.moversContainer.append(e),this.content.mover=e}updateMediaSource(e,t,i){const s=e.tagName.toLowerCase()===i?e:e.querySelector(i);if(s&&!(0,x.Z)(e,"document")){if((0,x.Z)(e,"attachment")){const t=e.parentElement.parentElement.querySelector(".preloader-container");if(t){if("video"===i)return void(t.classList.contains("manual")&&t.click());t.remove()}}s.src!==t&&(0,A.ZP)(s,t),s.classList.contains("thumbnail")&&s.parentElement.classList.contains("media-container-aspecter")&&s.classList.remove("thumbnail")}}setAuthorInfo(e,t){const i=e.isPeerId();let s;if(i)s=(0,W.Z)({peerId:e,dialog:!1,onlyFirstName:!1,plainText:!1});else{const t=s=document.createElement("span");t.append((0,G.Z)(e)),t.classList.add("peer-title")}const n=this.author.avatarEl,a=this.author.avatarEl=n.cloneNode();return Promise.all([this.author.avatarEl.updateWithOptions({peerId:e||U.NM,peerTitle:i?void 0:""+e}),s]).then((([e,i])=>{this.author.avatarEl===a&&((0,D.Z)(this.author.date,(0,k.OD)(t)),(0,D.Z)(this.author.nameEl,i),n.replaceWith(this.author.avatarEl))}))}_openMedia(e,t,i,s,a,r=!1,c=[],h=[],u){return q(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const p=this.setAuthorInfo(i,t),f="document"===e._,m=f&&e.mime_type&&(["video","gif"].includes(e.type)||0===e.mime_type.indexOf("video/"));this.isFirstOpen&&(this.isFirstOpen=!1,this.listLoader.setTargets(c,h,r),window.appMediaViewer=this),this.listLoader.next.length<10&&setTimeout((()=>{this.listLoader.load(!0)}),0),this.buttons.prev.classList.toggle("hide",!this.listLoader.previous.length),this.buttons.next.classList.toggle("hide",!this.listLoader.next.length);const g=this.content.media,v=!a||a===g;v&&(a=g),this.target={element:a};const b=++this.tempId;g.firstElementChild&&(g.innerHTML=""),0!==s?(this.moveTheMover(this.content.mover,1===s),this.setNewMover()):(this.toggleOverlay(!0),this.setGlobalListeners(),yield p,this.wholeDiv.parentElement||(this.pageEl.insertBefore(this.wholeDiv,document.getElementById("main-columns")),this.wholeDiv.offsetLeft),this.toggleWholeActive(!0),o.IS_MOBILE_SAFARI||(this.navigationItem={type:"media",onPop:e=>{if(this.setMoverAnimationPromise)return!1;this.close()}},T.Z.pushItem(this.navigationItem)));const y=this.content.mover,w=N.Z.width;let S=0;const L=N.Z.height;L<1e6&&!n.Z.isMobile&&(S=120);const E=L-120-S;let I=Promise.resolve();const M=(0,j.Z)(e,g,w,E,!n.Z.isMobile,void 0,!!(f&&e.w&&e.h)).photoSize;if(v){const t=yield this.managers.thumbsStorage.getCacheContext(e,M.type);let i;if(t.downloaded)i=new Image,i.src=t.url;else{const s=(0,z.Z)(e,t,!0);s&&(I=s.loadPromise,i=s.image)}i&&(i.classList.add("thumbnail"),g.append(i))}const P=!(!f||!e.supportsStreaming),Z=P?this.preloaderStreamable:this.preloader,k=()=>this.managers.thumbsStorage.getCacheContext(e,null==M?void 0:M.type);let x;if(m){const t=u&&"gif"!==e.type,i=(0,H.Z)({pip:t});this.wholeDiv.classList.contains("no-forwards")&&i.addEventListener("contextmenu",l.Z);const n=()=>this.setMoverToTarget(a,!1,s).then((({onAnimationEnd:s})=>{const n=y.firstElementChild&&y.firstElementChild.classList.contains("media-viewer-aspecter")?y.firstElementChild:y,r=y.querySelector("video");r&&r.remove(),i.setAttribute("playsinline","true"),i.addEventListener("timeupdate",(()=>{this.tempId!==b&&i.pause()})),this.addEventListener("setMoverAfter",(()=>{i.src="",i.load()}),{once:!0}),o.IS_SAFARI&&(i.autoplay=!0),"gif"===e.type?(i.muted=!0,i.autoplay=!0,i.loop=!0):e.duration<60&&(i.loop=!0),n.append(i);const c=new Promise((e=>{i.addEventListener("canplay",e,{once:!0})})),h=()=>{"gif"!==e.type&&(i.dataset.ckin="default",i.dataset.overlay="1",Promise.all([c,s]).then((()=>{this.tempId===b&&((this.videoPlayer=new C({video:i,play:!0,streamable:P,onPlaybackRackMenuToggle:e=>{this.wholeDiv.classList.toggle("hide-caption",!!e)},onPip:e=>{const s=window.appMediaViewer;if(!e&&s&&s!==this)return this.releaseSingleMedia=void 0,void this.close();this.moversContainer.lastElementChild.classList.toggle("hiding",e),this.toggleWholeActive(!e),this.toggleOverlay(!e),this.toggleGlobalListeners(!e),this.navigationItem&&(e?T.Z.removeItem(this.navigationItem):T.Z.pushItem(this.navigationItem)),t&&(e?(this.releaseSingleMedia(!1),this.releaseSingleMedia=void 0,d.Z.setPictureInPicture(i)):this.releaseSingleMedia=d.Z.setSingleMedia(i,u))},onPipClose:()=>{this.close()}})).addEventListener("toggleControls",(e=>{this.wholeDiv.classList.toggle("has-video-controls",e)})),this.addEventListener("setMoverBefore",(()=>{this.wholeDiv.classList.remove("has-video-controls"),this.videoPlayer.cleanup(),this.videoPlayer=void 0}),{once:!0}),this.isZooming()&&this.videoPlayer.lockControls(!1))})))};if(P){s.then((()=>{i.readyState{i.addEventListener("canplay",(()=>{Z.detach(),i.parentElement.classList.remove("is-buffering")}),{once:!0})};i.addEventListener("waiting",(()=>{const t=i.networkState===i.NETWORK_LOADING,s=i.readyState{(0,l.Z)(e)})),e()}this.lazyLoadQueue.unshift({load:()=>q(this,void 0,void 0,(function*(){const r=P?Promise.resolve():K.Z.downloadMediaURL({media:e});return P||s.then((()=>q(this,void 0,void 0,(function*(){(yield k()).url||Z.attach(y,!0,r)})))),Promise.all([r,s]).then((()=>q(this,void 0,void 0,(function*(){if(this.tempId!==b)return void this.log.warn("media viewer changed video");const e=(yield k()).url;i.addEventListener("error",(()=>{(0,$.bC)({langPackKey:o.IS_MOBILE?"Video.Unsupported.Mobile":"Video.Unsupported.Desktop"}),4!==i.error.code&&this.log.error("Error "+i.error.code+"; details: "+i.error.message),null==Z||Z.detach()}),{once:!0}),a instanceof SVGSVGElement?n.firstElementChild.lastElementChild.append(i):(0,A.ZP)(i,e),t&&(this.releaseSingleMedia=d.Z.setSingleMedia(i,u),this.addEventListener("setMoverBefore",(()=>{this.releaseSingleMedia&&(this.releaseSingleMedia(),this.releaseSingleMedia=void 0)}),{once:!0})),this.updateMediaSource(a,e,"video"),h()})))),r}))})}));x=I.then(n)}else{const t=()=>this.setMoverToTarget(a,!1,s).then((({onAnimationEnd:t})=>{this.lazyLoadQueue.unshift({load:()=>q(this,void 0,void 0,(function*(){const i=f?K.Z.downloadMediaURL({media:e}):K.Z.downloadMediaURL({media:e,thumb:M});return t.then((()=>q(this,void 0,void 0,(function*(){(yield k()).url||this.preloader.attachPromise(i)})))),Promise.all([t,i]).then((()=>q(this,void 0,void 0,(function*(){var e;if(this.tempId!==b)return void this.log.warn("media viewer changed photo");const t=(yield k()).url;if(a instanceof SVGSVGElement){if(this.updateMediaSource(a,t,"img"),this.updateMediaSource(y,t,"img"),n.Z.isMobile){const e=y.querySelectorAll("img");e&&e.length&&e.forEach((e=>{e.classList.remove("thumbnail")}))}}else{const i=y.firstElementChild&&y.firstElementChild.classList.contains("media-viewer-aspecter")?y.firstElementChild:y,s="IMG"===(null===(e=i.firstElementChild)||void 0===e?void 0:e.tagName)?i.firstElementChild:null;if(!s||s.src!==t){const e=new Image;e.classList.add("thumbnail"),(0,A.ZP)(e,t,(()=>{this.updateMediaSource(a,t,"img"),s&&(0,R.T2)((()=>{s.remove()})),i.append(e)}))}}})))).catch((e=>{this.log.error(e),this.preloader.attach(y),this.preloader.setManual()})),i}))})}));x=I.then(t)}return this.setMoverPromise=x.catch((()=>{this.setMoverAnimationPromise=null})).finally((()=>{this.setMoverPromise=null}))}))}}},6385:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(410),n=i(4762),a=i(5003),o=i(8799),r=i(3910),d=i(3444),l=i(1655);const c=new class{constructor(){if(this.onPopState=e=>{const t=window.location.hash,i=e.state;if(this.debug&&this.log("popstate",e,this.isPossibleSwipe,t),t!==this.currentHash)if(this.debug&&this.log.warn(`hash changed, new=${t}, current=${this.currentHash}, overridden=${this.overriddenHash}`),i===this.id&&this.overriddenHash&&this.overriddenHash!==t)this.overrideHash(this.overriddenHash);else{if(!i||this.overriddenHash||!t)return this.currentHash=t,void(this.onHashChange&&this.onHashChange());this.overrideHash()}if(i!==this.id&&(this.pushState(),!this.navigations.length))return;const s=this.navigations.pop();s?(this.manual=!this.isPossibleSwipe,this.handleItem(s)):this.pushState()},this.onKeyDown=e=>{const t=this.navigations[this.navigations.length-1];t&&("Escape"!==e.key||t.onEscape&&!t.onEscape()||((0,r.Z)(e),this.back(t.type)))},this.onTouchStart=e=>{e.touches.length>1||(this.debug&&this.log("touchstart"),(0,d.Z)(e)&&(this.isPossibleSwipe=!0,window.addEventListener("touchend",(()=>{setTimeout((()=>{this.isPossibleSwipe=!1}),100)}),{passive:!0,once:!0})))},this.navigations=[],this.id=Date.now(),this.manual=!1,this.log=(0,a.kg)("NC"),this.debug=!0,this.currentHash=window.location.hash,this.overriddenHash="",this.isPossibleSwipe=!1,window.addEventListener("popstate",this.onPopState),window.addEventListener("keydown",this.onKeyDown,{capture:!0,passive:!1}),n.IS_MOBILE_SAFARI){const e={passive:!0};window.addEventListener("touchstart",this.onTouchStart,e)}history.scrollRestoration="manual",this.pushState()}overrideHash(e=""){e&&"#"!==e[0]?e="#"+e:"#"===e&&(e=""),this.currentHash!==e&&(this.overriddenHash=this.currentHash=e,this.replaceState(),this.pushState())}handleItem(e){const t=e.onPop(!!this.manual&&void 0);this.debug&&this.log("popstate, navigation:",e,this.navigations),!1===t?this.pushItem(e):e.noBlurOnPop||(0,o.Z)(),this.manual=!1}findItemByType(e){for(let t=this.navigations.length-1;t>=0;--t){const i=this.navigations[t];if(i.type===e)return{item:i,index:t}}}back(e){if(e){const t=this.findItemByType(e);if(t)return void this.backByItem(t.item,t.index)}history.back()}backByItem(e,t=this.navigations.indexOf(e)){this.manual=!0,this.navigations.splice(t,1),this.handleItem(e)}onItemAdded(e){this.debug&&this.log("onItemAdded",e,this.navigations),e.noHistory||this.pushState()}pushItem(e){this.navigations.push(e),this.onItemAdded(e)}unshiftItem(e){this.navigations.unshift(e),this.onItemAdded(e)}spliceItems(e,t,...i){this.navigations.splice(e,t,...i),i.forEach((e=>{this.onItemAdded(e)}))}pushState(){this.debug&&this.log("push"),this.manual=!1,history.pushState(this.id,"")}replaceState(){this.debug&&this.log.warn("replace");const e=location.origin+location.pathname+location.search+this.overriddenHash;history.replaceState(this.id,"",e)}removeItem(e){e&&(0,l.Z)(this.navigations,e)}removeByType(e,t=!1){for(let i=this.navigations.length-1;i>=0&&(this.navigations[i].type!==e||(this.navigations.splice(i,1),!t));--i);}};s.GO.appNavigationController=c;const h=c},5884:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,z:()=>d});var s=i(8130),n=i(8805),a=i(5565),o=i(2325),r=i(3512);class d{constructor(e,t,i=!0,n,a=!0,r=!0,d,l){this.name=e,this.type=t,this.clearable=i,this.autonomous=r,this.onFound=d,this.noIcons=l,this.list=s.default.createChatList(),this.container=document.createElement("div"),n&&(this.container.className=n),e&&(this.nameEl=document.createElement("div"),this.nameEl.classList.add("search-group__name"),"string"==typeof e&&this.nameEl.append((0,o.ag)(e)),this.container.append(this.nameEl)),this.container.classList.add("search-group","search-group-"+t),this.container.append(this.list),this.container.style.display="none",a&&s.default.setListClickListener(this.list,d,void 0,r)}clear(){this.container.style.display="none",this.clearable&&(this.list.innerHTML="")}setActive(){this.container.style.display=""}toggle(){this.list.childElementCount?this.setActive():this.clear()}}class l{constructor(e,t,i,s,a){this.container=e,this.searchInput=t,this.searchGroups=i,this.onSearch=s,this.noIcons=a,this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1,this.searchPromise=null,this.searchTimeout=0,this.query="",this.listsContainer=null,this.threadId=0,this.scrollable=new n.ZP(this.container),this.listsContainer=this.scrollable.container;for(const e in this.searchGroups)this.listsContainer.append(this.searchGroups[e].container);this.searchGroups.messages&&this.scrollable.setVirtualContainer(this.searchGroups.messages.list),this.searchInput.onChange=e=>{this.query=e,this.reset(!1),this.searchMore()},this.scrollable.onScrolledBottom=()=>{this.query.trim()&&(this.searchTimeout||(this.searchTimeout=window.setTimeout((()=>{this.searchMore(),this.searchTimeout=0}),0)))}}reset(e=!0){e&&(this.searchInput.value="",this.query="",this.peerId=void 0,this.threadId=0),this.minMsgId=0,this.loadedCount=-1,this.foundCount=-1;for(const e in this.searchGroups)this.searchGroups[e].clear();this.searchPromise=null}beginSearch(e,t=0,i=""){this.peerId=e,this.threadId=t,this.query!==i&&(this.searchInput.inputField.value=i),this.searchInput.input.focus()}searchMore(){if(this.searchPromise)return this.searchPromise;const e=this.query;if(!e.trim())return void(this.onSearch&&this.onSearch(0));if(-1!==this.foundCount&&this.loadedCount>=this.foundCount)return Promise.resolve();const t=this.minMsgId||0;return this.searchPromise=r.Z.managers.appMessagesManager.getSearch({peerId:this.peerId,query:e,inputFilter:{_:"inputMessagesFilterEmpty"},maxId:t,limit:20,threadId:this.threadId}).then((t=>{if(this.searchPromise=null,this.searchInput.value!==e)return;const{count:i,history:n}=t;n.length&&n[0].mid===this.minMsgId&&n.shift();const r=this.searchGroups.messages;n.forEach((t=>{try{const i=this.peerId?t.fromId:t.peerId;s.default.addDialogAndSetLastMessage({peerId:i,container:this.scrollable,avatarSize:"bigger",meAsSaved:!1,message:t,query:e,noIcons:this.noIcons})}catch(e){console.error("[appSearch] render search result",e)}})),r.toggle(),this.minMsgId=n.length&&n[n.length-1].mid,-1===this.loadedCount&&(this.loadedCount=0),this.loadedCount+=n.length,-1===this.foundCount&&(this.foundCount=i,r.nameEl&&(0,a.Z)(r.nameEl,(0,o.ag)(i?"Chat.Search.MessagesFound":"Chat.Search.NoMessagesFound",[i])),this.onSearch&&this.onSearch(this.foundCount))})).catch((e=>{console.error("search error",e),this.searchPromise=null}))}}},6360:(e,t,i)=>{"use strict";i.d(t,{Z:()=>fe});var s=i(8130),n=i(5003),a=i(3512),o=i(5884),r=i(6008),d=i(2153),l=i(279),c=i(1405),h=i(8805),u=i(8594),p=i(2325),f=i(8497),m=i(3624),g=i(2894),v=i(4668),b=i(4332),y=i(4755),w=i(4271),S=i(4484),C=i(467),L=i(5432),E=i(1154),I=i(241),M=i(6272),P=i(3003),Z=i(4524),k=i(5128),T=i(7479),x=i(5705),A=i(6054),_=i(3910),F=i(2738),D=i(1784),R=i(8479),B=i(7401),N=i(5953),O=i(3738),U=i(4064),H=i(130),z=i(7030),j=i(2498),G=i(1336),V=i(5798),K=i(2342),W=i(2491),$=i(5400),q=i(5671),Q=i(1604),Y=i(7530),X=i(6566),J=i(177),ee=i(3061),te=i(2566),ie=i(6976),se=i(3416),ne=i(1483),ae=i(3855),oe=i(3699),re=i(296),de=i(9492),le=i(2887),ce=i(319),he=i(6131),ue=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class pe{constructor(e,t,i){this.attachTo=e,this.searchSuper=t,this.listenerSetter=i,this.onGotoClick=()=>{w.ZP.setInnerPeer({peerId:this.peerId,lastMsgId:this.mid,threadId:this.searchSuper.searchContext.threadId})},this.onForwardClick=()=>{this.searchSuper.selection.isSelecting?(0,F.tH)(this.searchSuper.selection.selectionForwardBtn):new Z.Z({[this.peerId]:[this.mid]})},this.onSelectClick=()=>{this.searchSuper.selection.toggleByElement(this.target)},this.onClearSelectionClick=()=>{this.searchSuper.selection.cancelSelection()},this.onDeleteClick=()=>{this.searchSuper.selection.isSelecting?(0,F.tH)(this.searchSuper.selection.selectionDeleteBtn):new k.Z(this.peerId,[this.mid],"chat")},this.managers=t.managers;L.Z||(0,ie.E)({element:e,callback:e=>{let i;this.init&&(this.init(),this.init=null);try{i=(0,f.Z)(e.target,"search-super-item")}catch(e){}if(i){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),(()=>{ue(this,void 0,void 0,(function*(){this.target=i,this.peerId=i.dataset.peerId.toPeerId(),this.mid=+i.dataset.mid,this.isSelected=t.selection.isMidSelected(this.peerId,this.mid),yield Promise.all(this.buttons.map((e=>ue(this,void 0,void 0,(function*(){let t;t=!(this.isSelected&&!e.withSelection)&&(!e.verify||(yield e.verify())),e.element.classList.toggle("hide",!t)}))))),i.classList.add("menu-open"),(0,ne.Z)(e,this.element),se.Z.openBtnMenu(this.element,(()=>{i.classList.remove("menu-open")}))}))})()}},listenerSetter:i})}init(){this.buttons=[{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>ue(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canForward(yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,this.mid))}))},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionForwardBtn.classList.contains("hide"),withSelection:!0},{icon:"message",text:"Message.Context.Goto",onClick:this.onGotoClick,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,withSelection:!0},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>ue(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canDeleteMessage(yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,this.mid))}))},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.searchSuper.selection.selectionDeleteBtn.classList.contains("hide"),withSelection:!0}],this.element=(0,P.b)({buttons:this.buttons,listenerSetter:this.listenerSetter}),this.element.classList.add("search-contextmenu","contextmenu"),document.getElementById("page-chats").append(this.element)}}class fe{constructor(e){this.tabs={},this.prevTabId=-1,this.lazyLoadQueue=new d.Z,this.middleware=(0,m.k)(),this.historyStorage={},this.usedFromHistory={},this.loadMutex=Promise.resolve(),this.nextRates={},this.loadPromises={},this.loaded={},this.loadedChats=!1,this.firstLoad=!0,this.log=(0,n.kg)("SEARCH-SUPER"),this.monthContainers={},this.mediaTabsMap=new Map,this.asChatList=!1,this.groupByMonth=!0,this.hideEmptyTabs=!0,this.showSender=!1,this.onTransitionStart=()=>{this.container.classList.add("sliding")},this.onTransitionEnd=()=>{this.container.classList.remove("sliding")},(0,N.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("search-super"),this.listenerSetter=new oe.Z,this.searchContextMenu=new pe(this.container,this,this.listenerSetter),this.selection=new A.e(this,this.managers,this.listenerSetter);const t=this.navScrollableContainer=document.createElement("div");t.classList.add("search-super-tabs-scrollable","menu-horizontal-scrollable","sticky");const i=this.navScrollable=new h.v7(t);i.container.classList.add("search-super-nav-scrollable");const s=this.nav=document.createElement("nav");s.classList.add("search-super-tabs","menu-horizontal-div"),this.tabsMenu=s,i.container.append(s);for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("menu-horizontal-div-item");const i=document.createElement("span"),s=document.createElement("i");i.append((0,p.ag)(e.name)),i.append(s),t.append(i),(0,c.Z)(t),this.tabsMenu.append(t),this.mediaTabsMap.set(e.type,e),e.menuTab=t}let a;this.tabsContainer=document.createElement("div"),this.tabsContainer.classList.add("search-super-tabs-container","tabs-container"),L.Z&&(this.swipeHandler=(0,E.Z)({element:this.tabsContainer,onSwipe:(e,t,i)=>{e*=-1;const s=this.selectTab.prevId(),n=Array.from(this.tabsMenu.children);let o;if(e>0){for(let e=s+1;e=0;--e)if(!n[e].classList.contains("hide")){o=e;break}void 0!==o&&(a=function(e){const t=e=>{(0,_.Z)(e)};let i=2;const s=()=>{--i||e.removeEventListener("touchmove",t,{capture:!0})};return e.addEventListener("touchmove",t,{capture:!0,passive:!1}),e.addEventListener("touchend",s,{once:!0}),s}(this.tabsContainer),this.selectTab(o))}}));for(const e of this.mediaTabs){const t=document.createElement("div");t.classList.add("search-super-container-"+e.type,"tabs-tab");const i=document.createElement("div");i.classList.add("search-super-content-"+e.type),t.append(i),this.tabsContainer.append(t),this.tabs[e.inputFilter]=i,e.contentTab=i}this.container.append(t,this.tabsContainer),this.searchGroupMedia=new o.z(!1,"messages",!0),this.scrollable.onScrolledBottom=()=>{this.mediaTab.contentTab&&this.canLoadMediaTab(this.mediaTab)&&this.load(!0)},this.selectTab=(0,r.X)(this.tabsMenu,this.tabsContainer,((e,t,i)=>{if(this.prevTabId===e&&!this.skipScroll)return void this.scrollable.scrollIntoViewNew({element:this.container,position:"start",startCallback:this.scrollStartCallback});const s=this.mediaTabs[e];this.onChangeTab&&this.onChangeTab(s);const n=this.mediaTab;if(this.mediaTab=s,-1!==this.prevTabId&&i&&this.onTransitionStart(),this.skipScroll)this.skipScroll=!1;else{const e=this.container.offsetTop;let t=this.scrollable.scrollTop;if(tn&&(s.scroll={scrollTop:n,scrollHeight:0})}if(s.scroll){const e=n.scroll.scrollTop-s.scroll.scrollTop;e&&(s.contentTab.style.transform=`translateY(${e}px)`)}}-1===this.prevTabId||s.contentTab.childElementCount||this.load(!0),this.prevTabId=e}),(()=>{this.scrollable.onScroll(),void 0!==this.mediaTab.scroll&&(this.mediaTab.contentTab.style.transform="",this.scrollable.scrollTop=this.mediaTab.scroll.scrollTop),a&&(a(),a=void 0),this.onTransitionEnd()}),void 0,i,this.listenerSetter),(0,F.fc)(this.tabsContainer,(e=>{this.selection.isSelecting&&((0,_.Z)(e),this.selection.toggleByElement((0,f.Z)(e.target,"search-super-item")))}),{capture:!0,passive:!1,listenerSetter:this.listenerSetter});const l=(e,t,i,s)=>ue(this,void 0,void 0,(function*(){const n=(0,f.Z)(s.target,e);if(!n)return;const a=+n.dataset.mid;if(!a)return void this.log.warn("no messageId by click on target:",n);const o=n.querySelector(".media-spoiler-container");if(o)return void(0,he.kN)({event:s,mediaSpoiler:o});const r=n.dataset.peerId.toPeerId(),d=Array.from(this.tabs[i].querySelectorAll("."+t)).map((t=>{const i=(0,f.Z)(t,e);return{element:t,mid:+i.dataset.mid,peerId:i.dataset.peerId.toPeerId()}})),l=d.findIndex((e=>e.mid===a&&e.peerId===r)),c=yield this.managers.appMessagesManager.getMessageByPeer(r,a);(new D.Z).setSearchContext(this.copySearchContext(i)).openMedia(c,d[l].element,0,!1,d.slice(0,l),d.slice(l+1))}));(0,F.fc)(this.tabs.inputMessagesFilterPhotoVideo,l.bind(null,"grid-item","grid-item","inputMessagesFilterPhotoVideo"),{listenerSetter:this.listenerSetter}),(0,F.fc)(this.tabs.inputMessagesFilterDocument,l.bind(null,"document-with-thumb","media-container","inputMessagesFilterDocument"),{listenerSetter:this.listenerSetter}),this.mediaTab=this.mediaTabs[0],(0,u.ZP)((()=>{this.lazyLoadQueue.lock()}),(()=>{this.lazyLoadQueue.unlockAndRefresh()}),this.listenerSetter)}filterMessagesByType(e,t){return(0,X.Z)(t,e,e.length)}processEmptyFilter({message:e,searchGroup:t}){const i=[],n=s.default.addDialogNew({peerId:e.peerId,container:t.list,avatarSize:"bigger",loadPromises:i}),a=s.default.setLastMessageN({dialog:{_:"dialog",peerId:e.peerId},lastMessage:e,dialogElement:n,highlightWord:this.searchContext.query});return i.push(a),Promise.all(i).then(ce.Z)}processPhotoVideoFilter({message:e,promises:t,middleware:i}){return ue(this,void 0,void 0,(function*(){const s=(0,Y.Z)(e),n=document.createElement("div");let a;n.classList.add("grid-item");const o=(0,z.Z)(s,200,200);if(a="photo"!==s._?yield(yield(0,le.Z)({doc:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,onlyPreview:!0,withoutPreloader:!0,noPlayButton:!0,photoSize:o})).thumb:yield(0,de.Z)({photo:s,message:e,container:n,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,withoutPreloader:!0,noBlur:!0,size:o}),e.media.pFlags.spoiler){const e=yield(0,he.ZP)({animationGroup:"chat",media:s,middleware:i,width:140,height:140,multiply:.3});n.append(e)}return[a.images.thumb,a.images.full].filter(Boolean).forEach((e=>{e.classList.add("grid-item-media")})),t.push(a.loadPromises.thumb),{element:n,message:e}}))}processDocumentFilter({message:e,inputFilter:t}){return ue(this,void 0,void 0,(function*(){const i=(0,Y.Z)(e),s=this.showSender||["voice","round"].includes(i.type),n=yield(0,re.Z)({message:e,withTime:!s,fontWeight:400,voiceAsMusic:!0,showSender:s,searchContext:this.copySearchContext(t),lazyLoadQueue:this.lazyLoadQueue,autoDownloadSize:0});return["audio","voice","round"].includes(i.type)&&n.classList.add("audio-48"),{message:e,element:n}}))}processUrlFilter({message:e,promises:t,middleware:i}){var s;return ue(this,void 0,void 0,(function*(){let n=null===(s=e.media)||void 0===s?void 0:s.webpage;if(!n){const t=e.totalEntities?e.totalEntities.find((e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._)):null;let i,s,a;if(t)a=e.message.slice(t.offset,t.offset+t.length);else{const t=(0,K.Z)(e.message);if(!t)return;i=t[0]}i="messageEntityTextUrl"===(null==t?void 0:t._)?t.url:i||a,s=i;const o=e.message===i;i.match(/^(ftp|http|https):\/\//)||(s="https://"+i,i=i.includes("@")?i:"https://"+i),s=new URL(s).hostname,n={_:"webPage",url:i,display_url:s,id:"",hash:0},o||(n.description=e.message)}if("webPageEmpty"===n._)return;const a=document.createElement("div");a.classList.add("preview"),n.photo?(0,de.Z)({container:a,message:null,photo:n.photo,boxWidth:0,boxHeight:0,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue,middleware:i,size:(0,z.Z)(n.photo,60,60,!1),loadPromises:t,noBlur:!0}):(a.classList.add("empty"),(0,H.Z)(a,(0,V.Z)(n.title||n.display_url||n.description||n.url,!0)));const o=(0,G.Z)(n),r=(0,j.Z)(n),d=(0,x.Z)((0,$.ZP)(n.url||"")).firstElementChild;if(d instanceof HTMLAnchorElement)try{d.innerText=decodeURIComponent(d.href)}catch(e){}r.firstChild&&r.append("\n"),r.append(d),this.showSender&&r.append("\n",yield(0,q.Z)(e)),o.textContent||o.append((0,W.Z)(n.display_url.split("/",1)[0]));const l=new T.ZP({title:o,titleRight:(0,Q.Z)(e),subtitle:r,havePadding:!0,clickable:!0,noRipple:!0});return l.applyMediaElement(a,"big"),l.container.innerText.trim().length?{message:e,element:l.container}:void 0}))}performSearchResult(e,t,i=!0){return ue(this,void 0,void 0,(function*(){const s=[],n=t.contentTab,a=[],o=this.middleware.get();let r,d=t.inputFilter;yield(0,u.e9)(),"inputMessagesFilterPhotoVideo"===d&&this.searchContext.query.trim()?(d="inputMessagesFilterEmpty",r=this.searchGroupMedia,n.append(r.container)):"inputMessagesFilterEmpty"===d&&(r=this.searchGroups.messages);const l={elemsToAppend:s,inputFilter:d,message:void 0,middleware:o,promises:a,searchGroup:r};let c;switch(d){case"inputMessagesFilterEmpty":c=this.processEmptyFilter;break;case"inputMessagesFilterPhotoVideo":c=this.processPhotoVideoFilter;break;case"inputMessagesFilterVoice":case"inputMessagesFilterRoundVoice":case"inputMessagesFilterMusic":case"inputMessagesFilterDocument":c=this.processDocumentFilter;break;case"inputMessagesFilterUrl":c=this.processUrlFilter}if(c){c=c.bind(this);const t=e.map((e=>ue(this,void 0,void 0,(function*(){try{return l.message=e,yield c(l)}catch(t){this.log.error("error rendering filter",d,l,e,t)}})))),i=(yield Promise.all(t)).filter(Boolean);s.push(...i)}if(r&&r.list.childElementCount&&r.setActive(),this.loadMutex&&a.push(this.loadMutex),!a.length||(yield Promise.all(a),o())){if(s.length){const e=i?"append":"prepend";s.forEach((t=>{var i;const{element:s,message:n}=t,a=this.getMonthContainerByTimestamp(this.groupByMonth?n.date:0,d);s.classList.add("search-super-item"),s.dataset.mid=""+n.mid,s.dataset.peerId=""+n.peerId,a.items[e](s),(null===(i=this.selection)||void 0===i?void 0:i.isSelecting)&&this.selection.toggleElementCheckbox(s,!0)}))}this.afterPerforming("inputMessagesFilterEmpty"===d?1:s.length,n)}}))}afterPerforming(e,t){if(t){const i=t.parentElement;if(Array.from(i.children).slice(1).forEach((e=>{e.remove()})),!e&&!t.childElementCount){const e=document.createElement("div");e.innerText="Nothing interesting here yet...",e.classList.add("position-center","text-center","content-empty","no-select"),i.append(e)}}}loadChats(){const e=new Set,t=this.middleware.get();for(const e in this.searchGroups){const t=this.searchGroups[e];this.tabs.inputMessagesFilterEmpty.append(t.container),t.clear()}const i=this.searchContext.query;if(i){const n=(t,n,o=!1)=>{t.map((t=>{if(e.has(t))return;e.add(t);const{dom:i}=s.default.addDialogNew({peerId:t,container:n.list,avatarSize:"abitbigger",autonomous:n.autonomous});return{dom:i,peerId:t}})).filter(Boolean).forEach((({dom:e,peerId:t})=>ue(this,void 0,void 0,(function*(){const s=yield this.managers.appPeersManager.getPeer(t);if(o&&(s.participants_count||s.participants)){const s=new RegExp(`(${(0,O.Z)(i)}|${(0,O.Z)((0,C.ZP)(i))})`,"gi");e.titleSpan.innerHTML=e.titleSpan.innerHTML.replace(s,"$1"),e.lastMessageSpan.append(yield(0,J.Z)(t.toChatId()))}else if(t===a.Z.myId)e.lastMessageSpan.append((0,p.ag)("Presence.YourChat"));else{let i=yield this.managers.appPeersManager.getPeerUsername(t);if(i)i="@"+i;else{const e=yield this.managers.appUsersManager.getUser(t);e&&e.phone&&(i="+"+(0,M.u)(e.phone).formatted)}e.lastMessageSpan.textContent=i}})))),n.toggle()},o=e=>{if(t())return e};return Promise.all([this.managers.appUsersManager.getContactsPeerIds(i,!0,void 0,10).then(o).then((e=>{e&&n(e,this.searchGroups.contacts,!0)})),this.managers.appUsersManager.searchContacts(i,20).then(o).then((e=>{if(e&&(n(e.my_results,this.searchGroups.contacts,!0),n(e.results,this.searchGroups.globalContacts),this.searchGroups.globalContacts.container.classList.add("is-short"),this.searchGroups.globalContacts.nameEl.lastElementChild!==this.searchGroups.globalContacts.nameEl.firstElementChild&&this.searchGroups.globalContacts.nameEl.lastElementChild.remove(),this.searchGroups.globalContacts.list.childElementCount>3)){const e=document.createElement("div");e.classList.add("search-group__show-more");const t=new p.ZP.IntlElement({key:"Separator.ShowMore"});e.append(t.element),this.searchGroups.globalContacts.nameEl.append(e),(0,F.fc)(e,(()=>{const e=this.searchGroups.globalContacts.container.classList.toggle("is-short");t.key=e?"Separator.ShowMore":"Separator.ShowLess",t.update()}))}})),this.managers.dialogsStorage.getDialogs({query:i,offsetIndex:0,limit:20,filterId:0}).then(o).then((e=>{e&&n(e.dialogs.map((e=>e.peerId)),this.searchGroups.contacts,!0)}))])}if(this.searchContext.peerId||this.searchContext.minDate)return Promise.resolve();{const e=(e=!0)=>ae.Z.getState().then((i=>{t()&&(this.searchGroups.recent.list.replaceChildren(),i.recentSearch.slice(0,20).forEach((e=>ue(this,void 0,void 0,(function*(){const{dom:t}=s.default.addDialogNew({peerId:e,container:this.searchGroups.recent.list,meAsSaved:!0,avatarSize:"abitbigger",autonomous:!0});t.lastMessageSpan.append(yield e.isUser()?(0,ee.Z)(yield this.managers.appUsersManager.getUser(e.toUserId())):(0,J.Z)(e.toChatId()))})))),i.recentSearch.length?e&&this.searchGroups.recent.setActive():this.searchGroups.recent.clear())}));return Promise.all([this.managers.appUsersManager.getTopPeers("correspondents").then((e=>{if(!t())return;const i=e.findIndex((e=>e.id===a.Z.myId));-1!==i&&(e=e.slice()).splice(i,1),e.forEach((e=>{const{dom:t}=s.default.addDialogNew({peerId:e.id,container:this.searchGroups.people.list,onlyFirstName:!0,avatarSize:"bigger",autonomous:!1,noIcons:this.searchGroups.people.noIcons});t.subtitleEl.remove()})),this.searchGroups.people.toggle()})),e()])}}loadMembers(e){return ue(this,void 0,void 0,(function*(){const t=this.searchContext.peerId.toChatId(),i=this.middleware.get();let n;const a=t=>ue(this,void 0,void 0,(function*(){if(!this.loadMutex||(yield this.loadMutex,i())){this.membersList||(this.membersList=new g.Z({lazyLoadQueue:this.lazyLoadQueue,rippleEnabled:!1,managers:this.managers}),(0,F.fc)(this.membersList.list,(e=>{const t=(0,v.Z)(e.target,s.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=t.dataset.peerId.toPeerId();let n=Promise.resolve();y.Z.isMobile&&(n=b.ZP.toggleSidebar(!1)),n.then((()=>{w.ZP.setInnerPeer({peerId:i})}))})),e.contentTab.append(this.membersList.list),this.afterPerforming(1,e.contentTab));for(const e of t){const t=(0,te.Z)(e);t.isAnyChat()||((yield this.managers.appUsersManager.getUser(t)).pFlags.deleted||this.membersList.add(t))}}}));if(yield this.managers.appChatsManager.isChannel(t)){const s=this.membersList?200:50;n=this.managers.appProfileManager.getChannelParticipants(t,void 0,s,this.nextRates[e.inputFilter]).then((t=>{if(!i())return;const n=e.contentTab.firstElementChild;return this.nextRates[e.inputFilter]=(n?n.childElementCount:0)+t.participants.length,t.participants.length{if(!i())return;this.loaded[e.inputFilter]=!0;const s=t.participants;return"chatParticipantsForbidden"!==s._?a(s.participants):void 0}));return this.loadPromises[e.inputFilter]=n.finally((()=>{i()&&(this.loadPromises[e.inputFilter]=null)}))}))}loadType(e,t,i,s){var n,a;const o=e.inputFilter;if(this.loadPromises[o])return this.loadPromises[o];if("members"===e.type)return this.loadMembers(e);const r=null!==(n=(a=this.historyStorage)[o])&&void 0!==n?n:a[o]=[];if(!("inputMessagesFilterEmpty"!==o||r.length||(this.loadedChats||(this.loadChats(),this.loadedChats=!0),this.searchContext.query.trim()||this.searchContext.peerId||this.searchContext.minDate)))return this.loaded[o]=!0,Promise.resolve();const d=this.loadPromises[o]=Promise.resolve().then((()=>ue(this,void 0,void 0,(function*(){var n,a;if(r.length&&this.usedFromHistory[o]this.managers.appMessagesManager.getMessageByPeer(e.peerId,e.mid))));t.push(...this.filterMessagesByType(a,o))}while(n{setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}const l=r.length?r[r.length-1].mid:0,c=yield this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{inputFilter:{_:o},maxId:l,limit:i,nextRate:null!==(n=(a=this.nextRates)[o])&&void 0!==n?n:a[o]=0}));if(r.push(...c.history.map((e=>({mid:e.mid,peerId:e.peerId})))),s()&&((c.history.length{setTimeout((()=>{if(s()&&this.mediaTab===e){const e=this.load(!0,!0);e&&e.then((()=>{s()&&setTimeout((()=>{this.scrollable.checkForTriggers()}),0)}))}}),0)})),this.performSearchResult(this.filterMessagesByType(c.history,o),e)})))).catch((e=>{this.log.error("load error:",e)})).finally((()=>{this.loadPromises[o]=null}));return d}canLoadMediaTab(e){const t=e.inputFilter;return!this.loaded[t]||this.historyStorage[t]&&this.usedFromHistory[t]"inputMessagesFilterEmpty"!==e.inputFilter)),n=s.map((e=>({_:e.inputFilter}))),[a,o]=yield Promise.all([this.managers.appMessagesManager.getSearchCounters(t,n,void 0,i),this.canViewMembers()]);if(!e())return;if(this.loadMutex&&(yield this.loadMutex,!e()))return;let r,d=0;s.forEach((e=>{const t=a.find((t=>t.filter._===e.inputFilter));e.menuTab.classList.toggle("hide",!t.count),e.menuTab.classList.remove("active"),t.count&&(void 0===r&&(r=e),++d)}));const l=this.mediaTabsMap.get("members");l.menuTab.classList.toggle("hide",!o),o&&(r=l,++d),this.container.classList.toggle("hide",!r),this.container.parentElement.classList.toggle("search-empty",!r),r&&(this.skipScroll=!0,this.selectTab(this.mediaTabs.indexOf(r),!1),this.navScrollableContainer.classList.toggle("hide",d<=1))}))}load(e=!1,t=!1){var i;return ue(this,void 0,void 0,(function*(){const s=this.searchContext.peerId;this.log("load",e,s,this.loadPromises);const n=this.middleware.get();if(this.firstLoad){if(yield null!==(i=this.loadFirstTimePromise)&&void 0!==i?i:this.loadFirstTimePromise=this.loadFirstTime(),!n())return;this.loadFirstTimePromise=void 0,this.firstLoad=!1}let a=e?[this.mediaTab]:this.mediaTabs.filter((e=>e!==this.mediaTab));if(a=a.filter((e=>this.canLoadMediaTab(e))),s.isUser()&&(0,U.Z)(a,(e=>"members"===e.type)),!a.length)return;const o=t?50:Math.round(3*(I.Z.height/130|0)*1.25),r=a.map((e=>this.loadType(e,t,o,n)));return Promise.all(r).catch((e=>{this.log.error("Load error all promises:",e)}))}))}getMonthContainerByTimestamp(e,t){var i;const s=new Date(1e3*e);s.setHours(0,0,0),s.setDate(1);const n=s.getTime(),a=null!==(i=this.monthContainers[t])&&void 0!==i?i:this.monthContainers[t]={};if(!(n in a)){const e=document.createElement("div");e.className="search-super-month";const i=document.createElement("div");i.classList.add("search-super-month-name");const o={month:"long"};s.getFullYear()!==(new Date).getFullYear()&&(o.year="numeric");const r=new p.ZP.IntlDateElement({date:s,options:o}).element;i.append(r),e.append(i);const d=document.createElement("div");d.classList.add("search-super-month-items"),e.append(i,d);const l=(0,B.Z)(a,"desc");let c=0;for(;cl[c]);++c);a[n]={container:e,items:d},(0,S.Z)(e,this.tabs[t],c)}return a[n]}canViewMembers(){const{peerId:e}=this.searchContext;if(!e.isAnyChat())return Promise.resolve(!1);const t=e.toChatId();return Promise.all([this.managers.appChatsManager.isBroadcast(t),this.managers.appChatsManager.hasRights(t,"view_participants"),this.managers.appChatsManager.isForum(t)]).then((([e,t,i])=>!e&&t&&(!this.searchContext.threadId||!i)))}cleanup(){var e;this.loadPromises={},this.loaded={},this.loadedChats=!1,this.nextRates={},this.firstLoad=!0,this.prevTabId=-1,this.lazyLoadQueue.clear(),this.mediaTabs.forEach((e=>{this.usedFromHistory[e.inputFilter]=-1})),(null===(e=this.selection)||void 0===e?void 0:e.isSelecting)&&this.selection.cancelSelection(),this.middleware.clean(),this.loadFirstTimePromise=void 0,this.cleanScrollPositions(),this.membersList=void 0}cleanScrollPositions(){this.mediaTabs.forEach((e=>{e.scroll=void 0}))}cleanupHTML(e=!1){this.mediaTabs.forEach((e=>{if(e.contentTab.replaceChildren(),this.hideEmptyTabs&&(this.container.classList.add("hide"),this.container.parentElement.classList.add("search-empty")),"chats"!==e.type&&!this.historyStorage[e.inputFilter]){const t=e.contentTab.parentElement;t.querySelector(".preloader")||(0,l.y)(t,!0);const i=t.querySelector(".content-empty");i&&i.remove()}})),this.monthContainers={},this.searchGroupMedia.clear(),this.scrollable.scrollTop=0}copySearchContext(e){const t=(0,R.Z)(this.searchContext);return t.inputFilter={_:e},t.nextRate=this.nextRates[e],t}setQuery({peerId:e,query:t,threadId:i,historyStorage:s,folderId:n,minDate:a,maxDate:o}){this.searchContext={peerId:e,query:t||"",inputFilter:{_:this.mediaTab.inputFilter},threadId:i,folderId:n,minDate:a,maxDate:o},this.historyStorage=null!=s?s:{},this.cleanup()}destroy(){var e,t;this.cleanup(),this.listenerSetter.removeAll(),this.scrollable.destroy(),null===(e=this.swipeHandler)||void 0===e||e.removeListeners(),null===(t=this.selection)||void 0===t||t.cleanup(),this.scrollStartCallback=void 0,this.onChangeTab=void 0,this.selectTab=void 0,this.searchContextMenu=void 0,this.swipeHandler=void 0,this.selection=void 0}}},5644:(e,t,i)=>{"use strict";i.d(t,{Z:()=>A});var s=i(8130),n=i(3512),a=i(8805),o=i(4789),r=i(9807),d=i(2325),l=i(8763),c=i(8497),h=i(8842),u=i(3910),p=i(5565),f=i(5701),m=i(241),g=i(2738),v=i(6690),b=i(1655),y=i(5953),w=i(4064),S=i(9331),C=i(2353),L=i(2566),E=i(177),I=i(3061),M=i(8493),P=i(7120),Z=i(8050),k=i(36),T=i(5029),x=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class A{constructor(e){this.container=document.createElement("div"),this.list=s.default.createChatList(),this.chatsContainer=document.createElement("div"),this.selected=new Set,this.freezed=!1,this.folderId=0,this.offsetIndex=0,this.query="",this.loadedWhat={},this.renderedPeerIds=new Set,this.peerType=["dialogs"],this.multiSelect=!0,this.rippleEnabled=!0,this.avatarSize="abitbigger",this.exceptSelf=!1,this.tempIds={},this.selfPresence="Presence.YourChat",this.needSwitchList=!1,this.design="round",this.onInput=()=>{const e=this.input.value;if(this.query!==e){(this.peerType.includes("contacts")||this.peerType.includes("dialogs"))&&(this.cachedContacts=void 0),this.peerType.includes("dialogs")&&(this.folderId=0,this.offsetIndex=0);for(const e in this.tempIds)++this.tempIds[e];this.list=s.default.createChatList(),this.promise=void 0,this.loadedWhat={},this.query=e,this.renderedPeerIds.clear(),this.needSwitchList=!0,this.getMoreResults()}},this.checkForTriggers=()=>{this.scrollable.checkForTriggers()},(0,y.Z)(this,e),this.container.classList.add("selector","selector-"+this.design);const t=(this.renderResultsFunc||this.renderResults).bind(this);if(this.renderResultsFunc=e=>x(this,void 0,void 0,(function*(){return this.needSwitchList&&(this.scrollable.splitUp.replaceWith(this.list),this.scrollable.setVirtualContainer(this.list),this.needSwitchList=!1),e=e.filter((e=>{const t=!this.renderedPeerIds.has(e);return t&&this.renderedPeerIds.add(e),t})),this.filterPeerTypeBy&&(e=yield(0,C.Z)(e,(e=>x(this,void 0,void 0,(function*(){if(e.isPeerId()&&(yield this.managers.appPeersManager.getPeer(e)))for(const t of this.filterPeerTypeBy)if(yield this.managers.appPeersManager[t](e))return!0;return!0}))))),t(e)})),this.input=document.createElement("input"),this.input.classList.add("selector-search-input"),this.placeholder?(0,d.$d)(this.input,this.placeholder,void 0,"placeholder"):(0,d.$d)(this.input,"SendMessageTo",void 0,"placeholder"),this.input.type="text",this.multiSelect){const e=new T.Z({});e.innerContainer.classList.add("selector-search-section");const t=document.createElement("div");t.classList.add("selector-search-container"),this.selectedContainer=document.createElement("div"),this.selectedContainer.classList.add("selector-search"),this.selectedContainer.append(this.input),t.append(this.selectedContainer),this.selectedScrollable=new a.ZP(t),(0,g.fc)(this.selectedContainer,(e=>{if(this.freezed)return;let t=e.target;if(t=(0,c.Z)(t,"selector-user"),!t)return;const i=t.dataset.key,s=this.chatsContainer.querySelector('[data-peer-id="'+i+'"]');s?(0,g.tH)(s):this.remove(i.toPeerId())})),e.content.append(t),this.container.append(e.container)}this.chatsContainer.classList.add("chatlist-container");const i=new T.Z({name:this.sectionNameLangPackKey,noShadow:!0});i.content.append(this.list),this.chatsContainer.append(i.container),this.scrollable=new a.ZP(this.chatsContainer),this.scrollable.setVirtualContainer(this.list),(0,g.fc)(this.chatsContainer,(e=>{const t=(0,l.Z)(e.target,"data-peer-id");if((0,u.Z)(e),!t)return;if(this.freezed)return;let i=t.dataset.peerId;if(i=i.isPeerId()?i.toPeerId():i,!this.multiSelect)return void this.add(i);this.selected.has(i)?this.remove(i):this.add(i);const s=t.querySelector("input");s.checked=!s.checked}));const n=(0,f.Z)(this.onInput,200,!1,!0);this.input.addEventListener("input",n),this.scrollable.onScrolledBottom=()=>{this.getMoreResults()},this.scrollable.container.prepend((0,k.G)()),this.container.append(this.chatsContainer),this.appendTo.append(this.container),setTimeout((()=>{const t=this.getMoreResults();e.onFirstRender&&t.then((()=>{e.onFirstRender()}))}),0)}renderSaved(){return x(this,void 0,void 0,(function*(){this.exceptSelf||this.offsetIndex||0!==this.folderId||!this.peerType.includes("dialogs")||this.query&&!(yield this.managers.appUsersManager.testSelfSearch(this.query))||(yield this.renderResultsFunc([n.Z.myId]))}))}getTempId(e){var t,i;null!==(t=(i=this.tempIds)[e])&&void 0!==t||(i[e]=0);const s=++this.tempIds[e];return{tempId:s,middleware:()=>this.tempIds[e]===s}}getMoreDialogs(){return x(this,void 0,void 0,(function*(){if(this.loadedWhat.dialogs&&this.loadedWhat.archived)return;const e=m.Z.height/56*1.25|0,{middleware:t}=this.getTempId("dialogs"),i=this.managers.dialogsStorage.getDialogs({query:this.query,offsetIndex:this.offsetIndex,limit:e,filterId:this.folderId,skipMigrated:!0});i.catch((()=>{t()&&(this.loadedWhat[this.loadedWhat.dialogs?"archived":"dialogs"]=!0)}));const s=yield i;if(!t())return;let a=s.dialogs;if(a.length){const e=(0,Z.Z)(a[a.length-1])||0;if(a=a.slice(),(0,w.Z)(a,(e=>e.peerId===n.Z.myId)),this.chatRightsAction&&(a=yield(0,C.Z)(a,(e=>this.filterByRights(e.peerId))),!t()))return;if(yield this.renderSaved(),!t())return;this.offsetIndex=e}if(this.renderResultsFunc(a.map((e=>e.peerId))),s.isEnd){if(!this.loadedWhat.dialogs){if(yield this.renderSaved(),!t())return;return this.loadedWhat.dialogs=!0,this.offsetIndex=0,this.folderId=1,this.getMoreDialogs()}if(this.loadedWhat.archived=!0,!this.loadedWhat.contacts)return this.getMoreContacts()}}))}filterByRights(e){return x(this,void 0,void 0,(function*(){const t=yield this.managers.appPeersManager.getPeer(e);return e.isUser()?"send_messages"!==this.chatRightsAction||(0,M.Z)(t):!!(0,P.Z)(t,this.chatRightsAction)||void 0}))}getMoreContacts(){return x(this,void 0,void 0,(function*(){if(this.loadedWhat.contacts)return;const e=this.peerType.includes("contacts");if(!this.cachedContacts){const{middleware:t}=this.getTempId("contacts"),i=Promise.all([e?this.managers.appUsersManager.getContactsPeerIds(this.query):[],this.query?this.managers.appUsersManager.searchContacts(this.query):void 0]);i.catch((()=>{t()&&(this.loadedWhat.contacts=!0)}));const[s,a]=yield i;if(!t())return;if(a){let i=e?a.my_results.concat(a.results):a.my_results;if(this.chatRightsAction&&(i=yield(0,C.Z)(i,(e=>this.filterByRights(e))),!t()))return;this.peerType.includes("dialogs")||(i=i.filter((e=>e.isUser()))),this.cachedContacts=(0,v.Z)(s.concat(i))}else this.cachedContacts=s.slice();(0,b.Z)(this.cachedContacts,n.Z.myId)}const t=m.Z.height/56*1.25|0,i=this.cachedContacts.splice(0,t);this.renderResultsFunc(i),this.cachedContacts.length||(this.loadedWhat.contacts=!0)}))}getMoreChannelParticipants(){return x(this,void 0,void 0,(function*(){if(this.loadedWhat.channelParticipants)return;const{middleware:e}=this.getTempId("channelParticipants"),t=this.managers.appProfileManager.getChannelParticipants(this.peerId.toChatId(),{_:"channelParticipantsSearch",q:this.query},50,this.list.childElementCount);t.catch((()=>{e()&&(this.loadedWhat.channelParticipants=!0)}));const i=yield t;if(!e())return;const s=i.participants.map((e=>(0,L.Z)(e)));(0,b.Z)(s,n.Z.myId),this.renderResultsFunc(s),(this.list.childElementCount>=i.count||i.participants.length<50)&&(this.loadedWhat.channelParticipants=!0)}))}getMoreResults(){if(this.promise)return this.promise;const e=(()=>this.peerType.includes("dialogs")&&!this.loadedWhat.archived?this.getMoreSomething("dialogs"):!this.peerType.includes("contacts")&&!this.peerType.includes("dialogs")||this.loadedWhat.contacts?this.peerType.includes("channelParticipants")&&!this.loadedWhat.channelParticipants?this.getMoreSomething("channelParticipants"):void 0:this.getMoreSomething("contacts"))();if(!e)return Promise.resolve();const t=this.promise=e.catch((e=>{console.error("get more result error",e)})).finally((()=>{this.promise===t&&(this.promise=void 0),this.checkForTriggers()}));return t}getMoreSomething(e){return{dialogs:this.getMoreDialogs,contacts:this.getMoreContacts,channelParticipants:this.getMoreChannelParticipants}[e].call(this)}renderResults(e){return x(this,void 0,void 0,(function*(){!this.peerType.includes("dialogs")&&this.loadedWhat.contacts&&(e=yield(0,C.Z)(e,(e=>this.managers.appUsersManager.isNonContactUser(e)))),e.forEach((e=>x(this,void 0,void 0,(function*(){const{dom:t}=s.default.addDialogNew({peerId:e,container:this.scrollable,rippleEnabled:this.rippleEnabled,avatarSize:this.avatarSize});if(this.multiSelect){const i=this.selected.has(e),s=new r.Z;i&&(s.input.checked=!0),t.containerEl.prepend(s.label)}let i;i=e.isAnyChat()?yield(0,E.Z)(e.toChatId()):e===n.Z.myId?(0,d.ag)(this.selfPresence):(0,I.Z)(yield this.managers.appUsersManager.getUser(e.toUserId())),t.lastMessageSpan.append(i)}))))}))}add(e,t,i=!0){var s;if(this.selected.add(e),!this.multiSelect)return void this.onChange(this.selected.size);this.query.trim()&&(this.input.value="",this.onInput());const n=document.createElement("div");n.classList.add("selector-user","scale-in");const a=new S.Z;if(a.classList.add("selector-user-avatar","tgico","avatar-32"),a.isDialog=!0,n.dataset.key=""+e,e.isPeerId()){if(void 0===t){const i=new h.Z;i.update({peerId:e.toPeerId(),dialog:!0}),t=i.element}a.updateWithOptions({peerId:e})}return t&&("string"==typeof t?n.innerHTML=t:((0,p.Z)(n,t),n.append(t))),n.insertAdjacentElement("afterbegin",a),this.selectedContainer.insertBefore(n,this.input),null===(s=this.onChange)||void 0===s||s.call(this,this.selected.size),i&&this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center"}),n}remove(e){if(!this.multiSelect)return;const t=this.selectedContainer.querySelector(`[data-key="${e}"]`);t.classList.remove("scale-in"),t.offsetWidth,t.classList.add("scale-out");const i=()=>{this.selected.delete(e),t.remove(),this.onChange&&this.onChange(this.selected.size)};n.Z.settings.animationsEnabled?t.addEventListener("animationend",i,{once:!0}):i()}getSelected(){return[...this.selected]}addInitial(e){e.forEach((e=>{this.add(e,void 0,!1)})),window.requestAnimationFrame((()=>{this.selectedScrollable.scrollIntoViewNew({element:this.input,position:"center",forceDirection:o.f.Static})}))}}},8448:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>F,ns:()=>_});var s=i(3442),n=i(3013),a=i(4755),o=i(4762),r=i(3512),d=i(3910),l=i(2738),c=i(3725),h=i(3699),u=i(319),p=i(8497),f=i(2325),m=i(3251),g=i(632),v=i(9966),b=i(1507),y=i(4081),w=i(5296),S=i(3228),C=i(5157),L=i(7207),E=i(130),I=i(8115),M=i(5671),P=i(1604),Z=i(7530),k=i(2312),T=i(9492),x=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function A(e=!0){const t=new s.Z({cancelable:!0,tryAgainOnFail:e});return t.construct(),e||(t.circle.setAttributeNS(null,"r","23"),t.totalLength=143.58203125),t}r.Z.addEventListener("messages_media_read",(({mids:e,peerId:t})=>{e.forEach((e=>{const i=`[data-mid="${e}"][data-peer-id="${t}"]`;Array.from(document.querySelectorAll(`audio-element.is-unread${i}, .media-round.is-unread${i}`)).forEach((e=>{e.classList.remove("is-unread")}))}))}));const _=(e,t)=>{let i,s;const n=!e.classList.contains("search-super-item"),a=(0,p.Z)(e,n?"bubbles-inner":"tabs-tab");if(a){const t=':not([data-is-outgoing="1"])',o=`.audio:not(.is-voice)${t}`;let r;if(r=e.matches(o)?[o]:[`.audio.is-voice${t}`,`.media-round${t}`],n){const e=".bubble:not(.webpage) ";r=r.map((t=>e+t))}const d=r.join(", "),l=Array.from(a.querySelectorAll(d)),c=l.indexOf(e),h=l.map((e=>({peerId:e.dataset.peerId.toPeerId(),mid:+e.dataset.mid})));i=h.slice(0,c),s=h.slice(c+1)}return(s.length&&s[0].midt)&&([i,s]=[s.reverse(),i.reverse()]),[i,s]};class F extends HTMLElement{constructor(){super(...arguments),this.withTime=!1,this.voiceAsMusic=!1,this.showSender=!1,this.listenerSetter=new h.Z}render(){var e,t,i;return x(this,void 0,void 0,(function*(){this.classList.add("audio"),this.managers=r.Z.managers,this.dataset.mid=""+this.message.mid,this.dataset.peerId=""+this.message.peerId;const s=(0,Z.Z)(this.message),h="voice"===s.type,p=!this.voiceAsMusic&&h,F=this.message.pFlags.is_outgoing,D=null===(e=this.message)||void 0===e?void 0:e.uploadingFileName,R=(0,C.Z)(0|s.duration);this.innerHTML='\n
\n
\n
\n
\n
\n
';const B=this.firstElementChild,N=document.createElement("div");N.classList.add("audio-download"),"audio"!==s.type&&this.message&&this.message.pFlags.media_unread&&this.classList.add("is-unread"),D&&(this.classList.add("is-outgoing"),this.append(N));const O=yield p?function(e){return x(this,void 0,void 0,(function*(){e.classList.add("is-voice");const t=e.message,i=(0,Z.Z)(t);t.pFlags.out&&e.classList.add("is-out");let s=i.attributes.find((e=>"documentAttributeAudio"===e._)).waveform||new Uint8Array([]);s=function(e){e instanceof Uint8Array||(e=new Uint8Array(e));const t=8*e.length/5|0;if(!t)return new Uint8Array([]);let i;try{const s=new DataView(e.buffer);i=new Uint8Array(t);for(let e=0;e>n&31}}catch(e){i=new Uint8Array([])}return i}(s.slice(0,63));const{svg:n,container:o,availW:r}=function(e,t){const i=a.Z.isMobile?16:23,s=a.Z.isMobile?152:190,n=a.Z.isMobile?190:256,o=(0,S.Z)(t/60*n,s,n),r=document.createElementNS("http://www.w3.org/2000/svg","svg");r.classList.add("audio-waveform-bars"),r.setAttributeNS(null,"width",""+o),r.setAttributeNS(null,"height",""+i),r.setAttributeNS(null,"viewBox",`0 0 ${o} ${i}`);const d=Math.max(...e),l=e.length?e.length:100,c=Math.min(o/4|0,l);let h=0;const u=i-4;let p="";for(let t=0,s=0,n=0;t=l){n=n+c-l,n<(c+1)/2&&h\n `,s+=4,h=n<(c+1)/2?0:a}else h{let t=e.audio;const i=()=>{c.style.width=t.currentTime/t.duration*100+"%"};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&i();const s=(0,v.Z)(i);return e.addAudioListener("timeupdate",s),e.addAudioListener("ended",s),e.addAudioListener("play",(()=>{(0,w.cK)((()=>!!t&&(i(),!t.paused)),e)})),e.readyPromise.then((()=>{let e=!1,i=!1;function s(e){let i;if(e instanceof MouseEvent)i=e.offsetX;else{const t=e.target.getBoundingClientRect();i=e.targetTouches[0].pageX-t.left}const s=i/r*t.duration;t.currentTime=s}f.addEventListener("mouseleave",(s=>{e&&(t.play(),e=!1),i=!1})),f.addEventListener("mousemove",(t=>{i=!0,e&&s(t)})),f.addEventListener("mousedown",(i=>{i.preventDefault(),0===i.button&&(t.paused||t.pause(),s(i),e=!0)})),f.addEventListener("mouseup",(s=>{i&&e&&(t.play(),e=!1)})),(0,l.fc)(f,(e=>{(0,d.Z)(e),t.paused||s(e)}))}),u.Z),()=>{f.remove(),f=null,t=null}}}))}(this):function(e){var t;return x(this,void 0,void 0,(function*(){const i=e.withTime,s=e.message,n=(0,Z.Z)(s),a="voice"===n.type||"round"===n.type,o=document.createElement("div");o.classList.add("audio-description");const r=n.attributes.find((e=>"documentAttributeAudio"===e._));if(!a){const t=[];(null==r?void 0:r.performer)&&t.push((0,I.Z)(r.performer)),i?t.push((0,g.OD)(s.date)):t.length||t.push((0,y.Z)(n.size)),e.showSender&&t.push(yield(0,M.Z)(s)),o.append(...(0,f.A1)(t," • "))}e.insertAdjacentHTML("beforeend",'\n
\n
\n
\n
');const d=e.querySelector(".audio-title"),l=new m.I;l.dataset.fontWeight=e.dataset.fontWeight,l.dataset.fontSize=e.dataset.fontSize,l.dataset.sizeType=e.dataset.sizeType,a?l.append(yield(0,M.Z)(s)):(0,E.Z)(l,(0,I.Z)(null!==(t=null==r?void 0:r.title)&&void 0!==t?t:n.file_name)),d.append(l),e.showSender&&d.append((0,P.Z)(s));const c=e.querySelector(".audio-subtitle");return c.append(o),()=>{let t=!1,i=new L.Z(e.audio,n.supportsStreaming);e.addAudioListener("ended",(()=>{e.classList.remove("audio-show-progress"),c.lastChild.replaceWith(o),t=!1}));const s=()=>{t||(e.classList.add("audio-show-progress"),t=!0,i&&c.lastChild.replaceWith(i.container))};return e.addAudioListener("play",s),(!e.audio.paused||e.audio.currentTime>0)&&s(),()=>{i.removeListeners(),i.container.remove(),i=null}}}))}(this),U=this.querySelector(".audio-time");U.innerHTML=R;const H=this.onLoad=e=>{this.onLoad=void 0;const t=this.audio=n.Z.addMedia(this.message,e),i=this.readyPromise=(0,c.Z)();this.audio.readyState>=this.audio.HAVE_CURRENT_DATA?i.resolve():this.addAudioListener("canplay",(()=>i.resolve()),{once:!0}),this.onTypeDisconnect=O();const s=()=>(0,C.Z)(0|t.currentTime)+(p?" / "+R:""),a=()=>{U.innerText=s(),B.classList.toggle("playing",!t.paused)};(!t.paused||t.currentTime>0&&t.currentTime!==t.duration)&&a();const o=(e,i=t.paused)=>{if(e&&(0,d.Z)(e),i){const e=!!this.searchContext;if(n.Z.setSearchContext(this.searchContext||{peerId:b.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,i]=e?_(this,this.message.mid):[];n.Z.setTargets({peerId:this.message.peerId,mid:this.message.mid},t,i)}t.play().catch((()=>{}))}else t.pause()};return(0,l.fc)(B,(e=>o(e)),{listenerSetter:this.listenerSetter}),this.addAudioListener("ended",(()=>{B.classList.remove("playing"),U.innerText=R})),this.addAudioListener("timeupdate",(()=>{!t.currentTime&&t.paused||n.Z.isSafariBuffering(t)||(U.innerText=s())})),this.addAudioListener("pause",(()=>{B.classList.remove("playing")})),this.addAudioListener("play",a),o};if(null===(t=s.thumbs)||void 0===t?void 0:t.length){const e=[],t=yield(0,T.Z)({photo:s,message:null,container:B,boxWidth:48,boxHeight:48,loadPromises:this.loadPromises,withoutPreloader:!0,lazyLoadQueue:this.lazyLoadQueue});B.style.width=B.style.height="",t.images.thumb&&e.push(t.images.thumb),t.images.full&&e.push(t.images.full),this.classList.add("audio-with-thumb"),e.forEach((e=>e.classList.add("audio-thumb")))}if(F)D&&(this.preloader=A(!1),this.preloader.attachPromise(k.Z.getUpload(D)),this.dataset.isOutgoing="1",this.preloader.attach(N,!1));else{let e=this.preloader;const t="audio"!==s.type;H(t);const a=t=>{if(this.audio.src)return;n.Z.resolveWaitingForLoadMedia(this.message.peerId,this.message.mid,this.message.pFlags.is_scheduled);const i=()=>{t&&(n.Z.willBePlayed(this.audio),o.IS_SAFARI&&!this.audio.autoplay&&(this.audio.autoplay=!0))};if(i(),!e)if(s.supportsStreaming){let e;this.classList.add("corner-download");const t=()=>{const t=A(!1),s=(0,c.Z)();s.notifyAll({done:75,total:100}),s.catch((()=>{this.audio.pause(),n.Z.willBePlayed(void 0)})),s.cancel=()=>{s.cancel=u.Z;const e=new Error;e.type="CANCELED",s.reject(e)},t.attach(N,!1,s),e=this.addAudioListener("pause",(()=>{s.cancel()}),{once:!0}),i()},s=this.addAudioListener("play",t);this.readyPromise.then((()=>{this.listenerSetter.remove(s),this.listenerSetter.remove(e)}))}else{e=A(),t||(this.readyPromise=(0,c.Z)());const n=()=>{i();const n=k.Z.downloadMediaURL({media:s});return t||n.then((()=>{this.readyPromise.resolve()})),e.attach(N,!1,n),{download:n}};e.setDownloadFunction(n),n()}this.classList.contains("corner-download")?B.append(N):this.append(N),this.classList.add("downloading"),this.readyPromise.then((()=>{this.classList.remove("downloading"),N.classList.add("downloaded"),setTimeout((()=>{N.remove()}),200),n.Z.willBePlayedMedia===this.audio&&(this.audio.play(),n.Z.willBePlayed(void 0))}))};(null===(i=this.audio)||void 0===i?void 0:i.src)||(t?a(!1):(0,l.fc)(B,(()=>{a(!0)}),{once:!0,capture:!0,passive:!1,listenerSetter:this.listenerSetter}))}}))}get addAudioListener(){return this.listenerSetter.add(this.audio)}disconnectedCallback(){setTimeout((()=>{this.isConnected||(this.onTypeDisconnect&&(this.onTypeDisconnect(),this.onTypeDisconnect=null),this.readyPromise&&this.readyPromise.reject(),this.listenerSetter&&(this.listenerSetter.removeAll(),this.listenerSetter=null),this.preloader&&(this.preloader=null))}),100)}}customElements.define("audio-element",F)},9331:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L,C:()=>y});var s=i(3512),n=i(2738),a=i(3910),o=i(1784),r=i(6074);class d extends r.Z{constructor(e){super(Object.assign(Object.assign({},e),{loadMore:(e,t,i)=>{if(this.peerId.isAnyChat()||!t)return Promise.resolve({count:0,items:[]});const s=null==e?void 0:e.photoId;return this.managers.appPhotosManager.getUserPhotos(this.peerId,s,i).then((e=>{const t=e.photos.map((e=>({element:null,photoId:e})));return{count:e.count,items:t}}))}})),this.loadedAllUp=!0,this.peerId=e.peerId}}var l=i(2312),c=i(4271),h=i(5824),u=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class p extends h.Z{constructor(e){super(new d({peerId:e,managers:s.Z.managers}),[]),this.onPrevClick=e=>{this.openMedia(e.photoId,e.element,-1)},this.onNextClick=e=>{this.openMedia(e.photoId,e.element,1)},this.onDownloadClick=()=>u(this,void 0,void 0,(function*(){l.Z.downloadToDisc({media:yield this.managers.appPhotosManager.getPhoto(this.target.photoId),queueId:c.ZP.chat.bubbles.lazyLoadQueue.queueId})})),this.peerId=e,this.setBtnMenuToggle([{icon:"download",text:"MediaViewer.Context.Download",onClick:this.onDownloadClick}]),this.setListeners()}openMedia(e,t,i=0,s,n){const a=Object.create(null,{_openMedia:{get:()=>super._openMedia}});return u(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;const o=yield this.managers.appPhotosManager.getPhoto(e),r=a._openMedia.call(this,o,o.date,this.peerId,i,t,!1,s,n);return this.target.photoId=o.id,r}))}}var f=i(5880),m=i(9931),g=i(3624),v=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const b=({peerId:e,threadId:t})=>{let i='avatar-element[data-peer-id="'+e+'"]';t&&(i+='[data-thread-id="'+t+'"]'),Array.from(document.querySelectorAll(i)).forEach((e=>{e.update()}))};function y(e,t,i,n,a,r){return v(this,void 0,void 0,(function*(){let d=yield s.Z.managers.appProfileManager.getFullPhoto(t);if(!i()||!d)return;const l=()=>Array.from(e.querySelectorAll("img")).find((e=>!e.classList.contains("emoji")))?e:null;if(t.isAnyChat()){const e=!!n,c="inputMessagesFilterChatPhotos";if(!n&&(n=yield s.Z.managers.appMessagesManager.getSearch({peerId:t,inputFilter:{_:c},maxId:0,limit:1}).then((e=>e.history[0])),!i()))return;if(n){n.action.photo.id!==d.id&&(e||(n=s.Z.managers.appMessagesManager.generateFakeAvatarMessage(t,d)));const i=e=>e.map((e=>({element:e.element,mid:e.item.mid,peerId:e.item.peerId})));return void(new o.Z).setSearchContext({peerId:t,inputFilter:{_:c}}).openMedia(n,l(),void 0,void 0,a?i(a):void 0,r?i(r):void 0)}}if(d){!(0,f.Z)(n)&&n&&(d=yield s.Z.managers.appPhotosManager.getPhoto(n));const e=e=>e.map((e=>({element:e.element,photoId:e.item})));new p(t).openMedia(d.id,l(),void 0,a?e(a):void 0,r?e(r):void 0)}}))}s.Z.addEventListener("avatar_update",b),s.Z.addEventListener("peer_title_edit",(e=>v(void 0,void 0,void 0,(function*(){(yield s.Z.managers.appAvatarsManager.isAvatarCached(e.peerId))||b(e)}))));const w=new Map,S=new Set;function C(e,t){return e+(t?"_"+t:"")}class L extends HTMLElement{constructor(){super(),this.addedToQueue=!1,this.classList.add("avatar-like"),this.middlewareHelper=(0,g.k)()}disconnectedCallback(){var e;const t=C(this.peerId,this.threadId),i=w.get(t);(null==i?void 0:i.has(this))&&(i.delete(this),i.size||w.delete(t)),null===(e=this.lazyLoadQueue)||void 0===e||e.delete({div:this})}attachClickEvent(){let e=!1;(0,n.fc)(this,(t=>v(this,void 0,void 0,(function*(){if((0,a.Z)(t),e)return;const i=this.peerId;e=!0,yield y(this,this.peerId,(()=>this.peerId===i)),e=!1}))))}updateOptions(e){for(const t in e)this[t]=e[t]}updateWithOptions(e){var t;const i=this.peerId,s=this.threadId;this.updateOptions(e);const n=this.peerId,a=this.threadId;if(i===n&&s===a)return;if(this.dataset.peerId=""+n,a?this.dataset.threadId=""+a:s&&delete this.dataset.threadId,i){const e=C(i,s),t=w.get(e);t&&(t.delete(this),t.size||w.delete(e))}const o=null===(t=e.wrapOptions)||void 0===t?void 0:t.middleware;return this.middlewareHelper.destroy(),o?this.middlewareHelper=o.create():this.middlewareHelper.destroy(),this.update()}remove(){this.middlewareHelper.destroy(),super.remove()}r(e=!1){const t=(0,m.Z)({div:this,peerId:this.peerId,isDialog:this.isDialog,title:this.peerTitle,onlyThumb:e,isBig:this.isBig,threadId:this.threadId,wrapOptions:Object.assign({middleware:this.middlewareHelper.get()},this.wrapOptions||{})});return this.loadPromises&&(this.loadPromises.push(t),t.finally((()=>{this.loadPromises=void 0}))),t}update(){if(this.lazyLoadQueue){if(!S.has(this.peerId)){if(this.addedToQueue)return;this.addedToQueue=!0;const e=C(this.peerId,this.threadId);let t=w.get(e);return t||w.set(e,t=new Set),t.add(this),this.lazyLoadQueue.push({div:this,load:()=>(S.add(this.peerId),this.update())}),this.r(!0)}this.addedToQueue&&this.lazyLoadQueue.delete({div:this})}S.add(this.peerId);const e=this.r();this.addedToQueue&&e.finally((()=>{this.addedToQueue=!1}));const t=C(this.peerId,this.threadId),i=w.get(t);if(i){i.delete(this);const e=Array.from(i);w.delete(t);for(let t=0,i=e.length;t{"use strict";i.d(t,{Z:()=>o});var s=i(2738),n=i(1168),a=i(6765);class o{constructor(e,t){this.container=document.createElement("div"),this.container.classList.add("avatar-edit"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("avatar-edit-canvas"),this.icon=document.createElement("span"),this.icon.classList.add("tgico","tgico-cameraadd"),this.container.append(this.canvas,this.icon),(0,s.fc)(this.container,(()=>{n.Z.createPopup(a.Z,t).open(this.canvas,e)}))}clear(){this.canvas.getContext("2d").clearRect(0,0,this.canvas.width,this.canvas.height)}}},4494:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(2325),n=i(1405);function a(e,t={}){const i=document.createElement(t.asLink?"a":t.asDiv?"div":"button");return i.className=e+(t.icon?" tgico-"+t.icon:""),t.noRipple||(t.rippleSquare&&i.classList.add("rp-square"),(0,n.Z)(i)),t.onlyMobile&&i.classList.add("only-handhelds"),t.disabled&&i.setAttribute("disabled","true"),t.text&&i.append((0,s.ag)(t.text)),i}},8119:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4494);const n=(e={})=>(0,s.Z)("btn-circle btn-corner z-depth-1"+(e.className?" "+e.className:""),e)},2230:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4494);const n=(e,t={})=>(0,s.Z)("btn-icon",Object.assign({icon:e||void 0},t))},3003:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v,b:()=>g});var s=i(7238),n=i(3416),a=i(3910),o=i(2738),r=i(8497),d=i(130),l=i(2325),c=i(9492),h=i(8812),u=i(8222),p=i(4762),f=i(1405);function m(e){if(e.element)return[e.separator,e.element].filter(Boolean);const{icon:t,iconDoc:i,text:s,onClick:m,checkboxField:g,noCheckboxClickListener:v}=e,b=document.createElement("div");b.className="btn-menu-item rp-overflow"+(t?" tgico-"+t:""),p.IS_MOBILE&&(0,f.Z)(b);let y=e.textElement;if(y||(y=e.textElement=s?(0,l.ag)(s,e.textArgs):document.createElement("span"),e.regularText&&(0,d.Z)(y,e.regularText)),i){const t=document.createElement("span");t.classList.add("btn-menu-item-icon"),b.append(t),e.loadPromise=(0,c.Z)({container:t,photo:i,boxWidth:24,boxHeight:24,withoutPreloader:!0,noFadeIn:!0,noBlur:!0,processUrl:e=>fetch(e).then((e=>e.text())).then((e=>{const t=u.Z.getProperty("primary-text-color"),i=(new DOMParser).parseFromString(e,"image/svg+xml").firstElementChild;return i.querySelectorAll("path").forEach((e=>{e.setAttributeNS(null,"fill",t),e.style.stroke=t,e.style.strokeWidth=".25px"})),(0,h.Z)(i.outerHTML)}))}).then((e=>e.loadPromises.thumb))}y.classList.add("btn-menu-item-text"),b.append(y);const w=!!g||!!e.keepOpen;return m&&(0,o.fc)(b,(t=>{var i;(0,a.Z)(t);const s=(0,r.Z)(t.target,"btn-menu");s&&!s.classList.contains("active")||(m(t),!1!==(null===(i=e.checkForClose)||void 0===i?void 0:i.call(e))&&(w||n.Z.close(),g&&!v&&(g.checked="radio"===g.input.type||!g.checked)))}),e.options),g&&b.append(g.label),!0===e.separator&&(e.separator=document.createElement("hr")),e.multiline&&b.classList.add("is-multiline"),[e.separator,e.element=b].filter(Boolean)}function g({listenerSetter:e,buttons:t}){const i=document.createElement("div");i.classList.add("btn-menu"),e&&t.forEach((t=>{t.options?t.options.listenerSetter=e:t.options={listenerSetter:e}}));const n=t.map(m);return i.append(...(0,s.Z)(n)),i}function v(e){return t=this,i=void 0,n=function*(){const t=g(e);return yield Promise.all(e.buttons.map((({loadPromise:e})=>e))),t},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}},5322:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,v:()=>h});var s=i(3416),n=i(3910),a=i(2738),o=i(3699),r=i(2230),d=i(3003),l=i(2353),c=i(3035);function h({el:e,onOpen:t,options:i,onClose:o}){((null==i?void 0:i.listenerSetter)?i.listenerSetter.add(e):e.addEventListener.bind(e))(a.pf,(i=>{if(!e.classList.contains("btn-menu-toggle"))return!1;if((0,n.Z)(i),e.classList.contains("menu-open"))s.Z.close();else{const n=null==t?void 0:t(i),a=()=>{const t=e.querySelector(".btn-menu");s.Z.openBtnMenu(t,o)};n instanceof Promise?n.then(a):a()}}))}function u({buttonOptions:e,listenerSetter:t,container:i,direction:s,buttons:n,onOpenBefore:a,onOpen:u,onClose:p,onCloseAfter:f}){e&&(e.asDiv=!0);const m=null!=i?i:(0,r.Z)("more",e);m.classList.add("btn-menu-toggle");const g=new o.Z;let v,b;return h({el:m,onOpen:e=>{return t=this,i=void 0,r=function*(){if(yield null==a?void 0:a(e),b)return clearTimeout(b),void(b=void 0);const t=yield(i=n,(0,l.Z)(i,(e=>{var t,i;return null===(i=null===(t=null==e?void 0:e.verify)||void 0===t?void 0:t.call(e))||void 0===i||i})));var i;if(!t.length)return;const o=v=yield(0,d.Z)({buttons:t,listenerSetter:g});o.classList.add(s),yield null==u?void 0:u(e,o),m.append(o),yield(0,c.d1)()},new((o=void 0)||(o=Promise))((function(e,s){function n(e){try{d(r.next(e))}catch(e){s(e)}}function a(e){try{d(r.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,a)}d((r=r.apply(t,i||[])).next())}));var t,i,o,r},options:{listenerSetter:t},onClose:()=>{null==p||p(),b=window.setTimeout((()=>{null==f||f(),b=void 0,g.removeAll(),n.forEach((e=>e.element=void 0)),v.remove()}),300)}}),m}},1571:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(5296),n=i(2064);class a{constructor(){this._width=50,this._height=50,this._tails=90,this._scrollTails=50,this._curve=[0,.25,.5,.75,1,1.5,2,2.5,3,3.5,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,18.3,18.6,18.9,19.2,19.5,19.8,20.1,20.4,20.7,21,21.3,21.6,21.9,22.2,22.5,22.8,23.1,23.4,23.7,24,24.3,24.6,24.9,25.2,25.5,25.8,26.1,26.3,26.4,26.5,26.6,26.7,26.8,26.9,27],this._positions=[{x:.8,y:.1},{x:.6,y:.2},{x:.35,y:.25},{x:.25,y:.6},{x:.2,y:.9},{x:.4,y:.8},{x:.65,y:.75},{x:.75,y:.4}],this._phases=this._positions.length,this.onWheel=e=>{this._animatingToNextPosition||(this._scrollDelta+=e.deltaY,void 0===this._onWheelRAF&&(this._onWheelRAF=requestAnimationFrame(this.drawOnWheel)))},this.drawOnWheel=()=>{const e=this._scrollDelta/this._scrollTails;this._scrollDelta%=this._scrollTails;const t=e>0?Math.floor(e):Math.ceil(e);t&&this.changeTailAndDraw(t),this._onWheelRAF=void 0},this.drawNextPositionAnimated=e=>{var t;let i,s;if(e){const s=e();i=s>=1;const a=-1*(n=s)*(n-2),o=null!==(t=this._nextPositionTail)&&void 0!==t?t:0,r=(this._nextPositionTail=this._nextPositionTails*a)-o;r&&(this._nextPositionLeft-=r,this.changeTailAndDraw(r))}else{const e=this._frames;s=e.shift(),i=!e.length}var n;return s&&this.drawImageData(s),i&&(this._nextPositionLeft=void 0,this._nextPositionTails=void 0,this._nextPositionTail=void 0,this._animatingToNextPosition=void 0),!i};const e=this._tails/this._curve[this._curve.length-1];for(let t=0,i=this._curve.length;t{var s;return e-(null!==(s=i[t-1])&&void 0!==s?s:0)}))}hexToRgb(e){const t=(0,n.oo)(e);return{r:t[0],g:t[1],b:t[2]}}getPositions(e){const t=this._positions.slice();t.push(...t.splice(0,e));const i=[];for(let e=0;e({x:(e.x-s[i].x)/t,y:(e.y-s[i].y)/t})));return i.map((e=>n.map(((t,i)=>({x:s[i].x+t.x*e,y:s[i].y+t.y*e})))))}curPosition(e,t){return this.getNextPositions(e,this._tails,[t])[0]}changeTail(e){for(this._tail+=e;this._tail>=this._tails;)this._tail-=this._tails,++this._phase>=this._phases&&(this._phase-=this._phases);for(;this._tail<0;)this._tail+=this._tails,--this._phase<0&&(this._phase+=this._phases)}changeTailAndDraw(e){this.changeTail(e);const t=this.curPosition(this._phase,this._tail);this.drawGradient(t)}getGradientImageData(e){const t=this._hctx.createImageData(this._width,this._height),i=t.data;let s=0;for(let t=0;tthis.hexToRgb(e))),this._hc||(this._hc=document.createElement("canvas"),this._hc.width=this._width,this._hc.height=this._height,this._hctx=this._hc.getContext("2d",{alpha:!1})),this._canvas=e,this._ctx=this._canvas.getContext("2d",{alpha:!1}),this.update()}update(){if(this._colors.length<2){const e=this._colors[0];return this._ctx.fillStyle=`rgb(${e.r}, ${e.g}, ${e.b})`,void this._ctx.fillRect(0,0,this._width,this._height)}const e=this.curPosition(this._phase,this._tail);this.drawGradient(e)}toNextPosition(e){var t,i;if(this._colors.length<2)return;if(e)return this._nextPositionLeft=this._tails+(null!==(t=this._nextPositionLeft)&&void 0!==t?t:0),this._nextPositionTails=this._nextPositionLeft,this._nextPositionTail=void 0,this._animatingToNextPosition=!0,void(0,s.cK)(this.drawNextPositionAnimated.bind(this,e),this);const n=this._tail,a=this._tails;let o;const r=[];for(let e=0,t=this._incrementalCurve.length;ea&&void 0===o&&(o=e,s%=a),r.push(s)}[r.slice(0,o),void 0!==o?r.slice(o):[]].forEach(((e,t,i)=>{const s=e[e.length-1];if(void 0!==s&&s>a&&(e[e.length-1]=+s.toFixed(2)),this._tail=null!=s?s:0,!e.length)return;const n=this.getNextPositions(this._phase,a,e);t!==i.length-1&&++this._phase>=this._phases&&(this._phase-=this._phases);const o=n.map((e=>this.getGradientImageData(e)));this._frames.push(...o)})),this._animatingToNextPosition=!0,(0,s.cK)(this.drawNextPositionAnimated,this)}scrollAnimate(e){}cleanup(){this.scrollAnimate(!1)}static createCanvas(e){const t=document.createElement("canvas");return t.width=50,t.height=50,void 0!==e&&(t.dataset.colors=e),t}static create(e){const t=this.createCanvas(e),i=new a;return i.init(t),{gradientRenderer:i,canvas:t}}}},6054:(e,t,i)=>{"use strict";i.d(t,{e:()=>T,Z:()=>x});var s=i(5432),n=i(4494),a=i(2230),o=i(9807),r=i(5128),d=i(4524),l=i(9099),c=i(1962),h=i(6385),u=i(4762),p=i(2325),f=i(8497),m=i(8799),g=i(3910),v=i(6760),b=i(5565),y=i(8487),w=i(144),S=i(2738),C=i(5975),L=i(3241),E=i(5953),I=i(6976),M=(i(6690),i(4271)),P=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Z=e=>[...e.values()].reduce(((e,t)=>e+t.size),0);class k extends L.Z{constructor(e){super(!1),this.selectedMids=new Map,this.isSelecting=!1,this.onMouseDown=e=>{const t=(0,f.Z)(e.target,this.targetLookupClassName);if(0!==e.button)return;if(this.verifyTarget&&!this.verifyTarget(e,t))return;const i=new Map;let s,n=t;const a=(e,t=!0)=>{const o=+e.dataset.mid;if(!o||!e.dataset.peerId)return;const r=e.dataset.peerId.toPeerId();(0,y.Z)(n)||(n=e);let d=i.get(r);if(d||i.set(r,d=new Set),d.has(o))return;const l=this.isMidSelected(r,o);if(void 0===s&&(s=!l),d.add(o),s&&!l||!s&&l){const s=Z(i);if(this.toggleByElement&&t){s<2&&(0,C.Z)(e,n)&&(n=e);const t=this.getElementsBetween(n,e);t.length&&t.forEach((e=>{a(e,!1)}))}if(this.selectedMids.size)this.toggleByElement&&this.toggleByElement(e);else if(2===s&&this.toggleByMid)for(const[e,t]of i)for(const i of t)this.toggleByMid(e,i)}};let o=!1;const r=e=>{o||((0,v.Z)(),o=!0);const t=this.getElementFromTarget(e.target);if(t)return this.verifyMouseMoveTarget&&!this.verifyMouseMoveTarget(e,t,s)?(this.listenerSetter.removeManual(this.listenElement,"mousemove",r),void this.listenerSetter.removeManual(document,"mouseup",d,l)):void a(t)},d=e=>{i.size&&(0,S.fc)(window,g.Z,{capture:!0,once:!0,passive:!1}),this.listenerSetter.removeManual(this.listenElement,"mousemove",r),(0,v.Z)()},l={once:!0};this.listenerSetter.add(this.listenElement)("mousemove",r),this.listenerSetter.add(document)("mouseup",d,l)},this.getElementsBetween=(e,t)=>{if(e===t)return[];const i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),n=(i.top-s.top||i.left-s.left)<0,a=(0,f.Z)(e,this.lookupBetweenParentClassName);if(!a)return[];const o=Array.from(a.querySelectorAll(this.lookupBetweenElementsQuery));let r=o.indexOf(e),d=o.indexOf(t);return n||([d,r]=[r,d]),o.slice(r+1,d)},this.cancelSelection=e=>P(this,void 0,void 0,(function*(){e&&(this.doNotAnimate=!0),this.onCancelSelection&&(yield this.onCancelSelection()),this.selectedMids.clear(),this.toggleSelection(),(0,v.Z)(),e&&(this.doNotAnimate=void 0)})),(0,E.Z)(this,e),this.navigationType="multiselect-"+(0,w.a)()}attachListeners(e,t){if(this.listenElement&&this.listenerSetter.removeAll(),this.listenElement=e,this.listenerSetter=t,e)return s.Z?(t.add(e)("touchend",(()=>{this.isSelecting&&(this.selectedText=window.getSelection?window.getSelection().toString():document.selection?document.selection.createRange().text:"")})),void(0,I.E)({element:e,callback:t=>{if(this.isSelecting||this.verifyTouchLongPress&&!this.verifyTouchLongPress())return;document.body.classList.add("no-select"),e.addEventListener("touchend",(e=>{(0,g.Z)(e),document.body.classList.remove("no-select")}),{once:!0,capture:!0}),(0,v.Z)();const i=this.getElementFromTarget(t.target);i&&this.toggleByElement(i)},listenerSetter:t})):void t.add(e)("mousedown",this.onMouseDown)}isElementShouldBeSelected(e){return this.isMidSelected(e.dataset.peerId.toPeerId(),+e.dataset.mid)}appendCheckbox(e,t){e.prepend(t.label)}toggleElementCheckbox(e,t){const i=!!this.getCheckboxInputFromElement(e);if(t){if(i)return!1;const t=new o.Z({name:e.dataset.mid,round:!0});this.isSelecting&&this.isElementShouldBeSelected(e)&&(t.input.checked=!0,e.classList.add("is-selected")),this.appendCheckbox(e,t)}else i&&(this.getCheckboxInputFromElement(e).parentElement.remove(),(0,l.Z)({element:e,className:"is-selected",forwards:!1,duration:200}));return!0}getCheckboxInputFromElement(e){var t;return"LABEL"===(null===(t=e.firstElementChild)||void 0===t?void 0:t.tagName)&&e.firstElementChild.firstElementChild}updateContainer(e=!1){var t;return P(this,void 0,void 0,(function*(){const i=this.selectedMids.size;if(!i&&!e)return;let s=!i,n=!i;const a=!i;for(const[e,t]of this.selectedMids){const i=`${e}_${this.isScheduled?"scheduled":"history"}`,a=yield this.managers.appMessagesManager.cantForwardDeleteMids(i,Array.from(t));if(s=a.cantForward,n=a.cantDelete,s&&n)break}null===(t=this.onUpdateContainer)||void 0===t||t.call(this,s,n,a)}))}toggleSelection(e=!0,t=!1){var i;const n=this.isSelecting,a=this.selectedMids.size;if(this.isSelecting=!!a||t,n===this.isSelecting)return!1;this.dispatchEvent("toggle",this.isSelecting),s.Z||(this.listenElement.classList.toggle("no-select",this.isSelecting),n&&(0,v.Z)()),(0,m.Z)();const o=!!a||t,r=null===(i=this.onToggleSelection)||void 0===i?void 0:i.call(this,o,!this.doNotAnimate);return u.IS_MOBILE_SAFARI||(o?h.Z.pushItem({type:this.navigationType,onPop:()=>{this.cancelSelection()}}):h.Z.removeByType(this.navigationType)),t&&(r||Promise.resolve()).then((()=>this.updateContainer(t))),!0}cleanup(){this.doNotAnimate=!0,this.selectedMids.clear(),this.toggleSelection(!1),this.doNotAnimate=void 0}updateElementSelection(e,t){this.toggleElementCheckbox(e,!0),this.getCheckboxInputFromElement(e).checked=t,this.toggleSelection(),this.updateContainer(),(0,l.Z)({element:e,className:"is-selected",forwards:t,duration:200})}isMidSelected(e,t){const i=this.selectedMids.get(e);return null==i?void 0:i.has(t)}length(){return Z(this.selectedMids)}toggleMid(e,t,i){let s=this.selectedMids.get(e);return i||void 0===i&&(null==s?void 0:s.has(t))?s&&(s.delete(t),s.size||this.selectedMids.delete(e)):(s||(s=new Set,this.selectedMids.set(e,s)),s.add(t)),!0}deleteSelectedMids(e,t){const i=this.selectedMids.get(e);i&&(t.forEach((e=>{i.delete(e)})),i.size||this.selectedMids.delete(e),this.updateContainer(),this.toggleSelection())}}class T extends k{constructor(e,t,i){super({managers:t,verifyTarget:(e,t)=>!!t&&this.isSelecting,getElementFromTarget:e=>(0,f.Z)(e,"search-super-item"),targetLookupClassName:"search-super-item",lookupBetweenParentClassName:"tabs-tab",lookupBetweenElementsQuery:".search-super-item"}),this.searchSuper=e,this.toggleByElement=e=>{const t=+e.dataset.mid,i=e.dataset.peerId.toPeerId();this.toggleMid(i,t)&&this.updateElementSelection(e,this.isMidSelected(i,t))},this.toggleByMid=(e,t)=>{const i=this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id="${e}"][data-mid="${t}"]`);this.toggleByElement(i)},this.onUpdateContainer=(e,t,i)=>{const s=this.length();(0,b.Z)(this.selectionCountEl,(0,p.ag)("messages",[s])),this.selectionGotoBtn.classList.toggle("hide",1!==s),this.selectionForwardBtn.classList.toggle("hide",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.classList.toggle("hide",t)},this.onToggleSelection=(e,t)=>{if((0,l.Z)({element:this.searchSuper.navScrollableContainer,className:"is-selecting",forwards:e,duration:t?200:0,onTransitionEnd:()=>{this.isSelecting||(this.selectionContainer.remove(),this.selectionContainer=this.selectionForwardBtn=this.selectionDeleteBtn=null,this.selectedText=void 0)}}),(0,l.Z)({element:this.searchSuper.container,className:"is-selecting",forwards:e,duration:200}),this.isSelecting&&!this.selectionContainer){const e="search-super-selection";this.selectionContainer=document.createElement("div"),this.selectionContainer.classList.add(e+"-container");const t=(0,a.Z)(`close ${e}-cancel`,{noRipple:!0});(0,S.fc)(t,(()=>this.cancelSelection()),{listenerSetter:this.listenerSetter,once:!0}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add(e+"-count"),this.selectionGotoBtn=(0,a.Z)(`message ${e}-goto`);const i={listenerSetter:this.listenerSetter};(0,S.fc)(this.selectionGotoBtn,(()=>{const e=[...this.selectedMids.keys()][0],t=[...this.selectedMids.get(e)][0];this.cancelSelection(),M.ZP.setInnerPeer({peerId:e,lastMsgId:t})}),i),this.selectionForwardBtn=(0,a.Z)(`forward ${e}-forward`),(0,S.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new d.Z(e,(()=>{this.cancelSelection()}))}),i),this.isPrivate&&(this.selectionDeleteBtn=(0,a.Z)(`delete danger ${e}-delete`),(0,S.fc)(this.selectionDeleteBtn,(()=>{const e=[...this.selectedMids.keys()][0];new r.Z(e,[...this.selectedMids.get(e)],"chat",(()=>{this.cancelSelection()}))}),i)),this.selectionContainer.append(...[t,this.selectionCountEl,this.selectionGotoBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean));const s=this.selectionContainer;s.style.opacity="0",this.searchSuper.navScrollableContainer.append(s),s.offsetLeft,s.style.opacity=""}},this.isPrivate=!e.showSender,this.attachListeners(e.container,i)}toggleSelection(e=!0,t=!1){const i=super.toggleSelection(e,t);return i&&e&&Array.from(this.searchSuper.tabsContainer.querySelectorAll(".search-super-item")).forEach((e=>{this.toggleElementCheckbox(e,this.isSelecting)})),i}}class x extends k{constructor(e,t,i,s){super({managers:s,getElementFromTarget:e=>(0,f.Z)(e,"grouped-item")||(0,f.Z)(e,"bubble"),verifyTarget:(e,t)=>!(!this.selectedMids.size&&!e.target.classList.contains("bubble")&&!e.target.classList.contains("document-selection")&&t),verifyMouseMoveTarget:(e,t,i)=>!(e.target!==t&&!e.target.classList.contains("document-selection")&&void 0===i&&!this.selectedMids.size),verifyTouchLongPress:()=>!this.chat.input.recording,targetLookupClassName:"bubble",lookupBetweenParentClassName:"bubbles-inner",lookupBetweenElementsQuery:".bubble:not(.is-multiple-documents), .grouped-item",isScheduled:"scheduled"===e.type}),this.chat=e,this.bubbles=t,this.input=i,this.toggleByElement=e=>{if(!this.canSelectBubble(e))return;const t=+e.dataset.mid;if(e.classList.contains("is-grouped")){if(!this.isGroupedBubbleSelected(e)){const t=this.selectedMids.get(this.chat.peerId);t&&this.getMidsFromGroupContainer(e).forEach((e=>t.delete(e)))}this.bubbles.getBubbleGroupedItems(e).map(this.toggleByElement)}else if(this.toggleMid(this.chat.peerId,t)){if(e.classList.contains("grouped-item")){const t=(0,f.Z)(e,"bubble"),i=this.isGroupedBubbleSelected(t),s=this.isGroupedMidsSelected(t);(s||i)&&this.updateElementSelection(t,s)}this.updateElementSelection(e,this.isMidSelected(this.chat.peerId,t))}},this.toggleByMid=(e,t)=>P(this,void 0,void 0,(function*(){const e=yield this.bubbles.getMountedBubble(t);e&&this.toggleByElement(e.bubble)})),this.onToggleSelection=(e,t)=>P(this,void 0,void 0,(function*(){const{needTranslateX:i,widthFrom:s,widthTo:o}=yield this.chat.input.center(t);(0,l.Z)({element:this.listenElement,className:"is-selecting",forwards:e,duration:t?200:0,onTransitionEnd:()=>{this.isSelecting||(this.selectionInputWrapper.remove(),this.selectionInputWrapper=this.selectionContainer=this.selectionSendNowBtn=this.selectionForwardBtn=this.selectionDeleteBtn=this.selectionLeft=this.selectionRight=null,this.selectedText=void 0)}});const h=sthis.cancelSelection()),{once:!0,listenerSetter:this.listenerSetter}),this.selectionCountEl=document.createElement("div"),this.selectionCountEl.classList.add("selection-container-count"),"scheduled"===this.chat.type?(this.selectionSendNowBtn=(0,n.Z)("btn-primary btn-transparent btn-short text-bold selection-container-send",{icon:"send2"}),this.selectionSendNowBtn.append((0,p.ag)("MessageScheduleSend")),(0,S.fc)(this.selectionSendNowBtn,(()=>{new c.Z(this.chat.peerId,[...this.selectedMids.get(this.chat.peerId)],(()=>{this.cancelSelection()}))}),e)):(this.selectionForwardBtn=(0,n.Z)("btn-primary btn-transparent text-bold selection-container-forward",{icon:"forward"}),this.selectionForwardBtn.append((0,p.ag)("Forward")),(0,S.fc)(this.selectionForwardBtn,(()=>{const e={};for(const[t,i]of this.selectedMids)e[t]=Array.from(i).sort(((e,t)=>e-t));new d.Z(e,(()=>{this.cancelSelection()}))}),e)),this.selectionDeleteBtn=(0,n.Z)("btn-primary btn-transparent danger text-bold selection-container-delete",{icon:"delete"}),this.selectionDeleteBtn.append((0,p.ag)("Delete")),(0,S.fc)(this.selectionDeleteBtn,(()=>{new r.Z(this.chat.peerId,[...this.selectedMids.get(this.chat.peerId)],this.chat.type,(()=>{this.cancelSelection()}))}),e);const i=this.selectionLeft=document.createElement("div");i.classList.add("selection-container-left"),i.append(t,this.selectionCountEl);const s=this.selectionRight=document.createElement("div");s.classList.add("selection-container-right"),s.append(...[this.selectionSendNowBtn,this.selectionForwardBtn,this.selectionDeleteBtn].filter(Boolean)),void 0!==h&&(i.style.transform=`translateX(${-h}px)`,s.style.transform=`translateX(${h}px)`),this.selectionContainer.append(i,s),this.selectionInputWrapper.style.opacity="0",this.selectionInputWrapper.append(this.selectionContainer),this.input.inputContainer.append(this.selectionInputWrapper),this.selectionInputWrapper.offsetLeft,this.selectionInputWrapper.style.opacity="",i.style.transform="",s.style.transform=""}}else this.selectionLeft&&void 0!==h&&(this.selectionLeft.style.transform=`translateX(-${h}px)`,this.selectionRight.style.transform=`translateX(${h}px)`)})),this.onUpdateContainer=(e,t,i)=>{(0,b.Z)(this.selectionCountEl,(0,p.ag)("messages",[this.length()])),this.selectionSendNowBtn&&this.selectionSendNowBtn.toggleAttribute("disabled",i),this.selectionForwardBtn&&this.selectionForwardBtn.toggleAttribute("disabled",e),this.selectionDeleteBtn&&this.selectionDeleteBtn.toggleAttribute("disabled",t)},this.onCancelSelection=()=>P(this,void 0,void 0,(function*(){}))}appendCheckbox(e,t){t.label.classList.add("bubble-select-checkbox"),e.classList.contains("document-container")?e.querySelector(".document, audio-element").append(t.label):super.appendCheckbox(e,t)}toggleSelection(e=!0,t=!1){const i=super.toggleSelection(e,t);if(i&&e)for(const e in this.bubbles.bubbles){if(this.bubbles.skippedMids.has(+e))continue;const t=this.bubbles.bubbles[e];this.toggleElementCheckbox(t,this.isSelecting)}return i}toggleElementCheckbox(e,t){if(!this.canSelectBubble(e))return;const i=super.toggleElementCheckbox(e,t);return i&&e.classList.contains("is-grouped")&&this.bubbles.getBubbleGroupedItems(e).forEach((e=>this.toggleElementCheckbox(e,t))),i}isElementShouldBeSelected(e){const t=e.classList.contains("is-grouped");return super.isElementShouldBeSelected(e)&&(!t||this.isGroupedMidsSelected(e))}isGroupedBubbleSelected(e){const t=this.getCheckboxInputFromElement(e);return null==t?void 0:t.checked}getMidsFromGroupContainer(e){const t=this.chat.bubbles.getBubbleGroupedItems(e);return t.length||t.push(e),t.map((e=>+e.dataset.mid))}isGroupedMidsSelected(e){const t=this.getMidsFromGroupContainer(e),i=t.filter((e=>this.isMidSelected(this.chat.peerId,e)));return t.length===i.length}getCheckboxInputFromElement(e){return e.classList.contains("document-container")?e.querySelector("label input"):super.getCheckboxInputFromElement(e)}canSelectBubble(e){return!(e.classList.contains("service")||e.classList.contains("is-outgoing")||e.classList.contains("is-error")||e.classList.contains("bubble-first")||e.classList.contains("avoid-selection"))}}},9807:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(1405),n=i(2325),a=i(9750),o=i(3512),r=i(3855);class d{constructor(e={}){const t=this.label=document.createElement("label");t.classList.add("checkbox-field"),e.restriction&&t.classList.add("checkbox-field-restriction"),e.round&&t.classList.add("checkbox-field-round"),e.disabled&&this.toggleDisability(!0),this.listenerSetter=e.listenerSetter;const i=this.input=document.createElement("input");if(i.classList.add("checkbox-field-input"),i.type="checkbox",e.name&&(i.id="input-"+e.name),e.checked&&(i.checked=!0),e.stateKey){let t=!1;const s=()=>{if(!t)return;let s;s=e.stateValues?e.stateValues[i.checked?1:0]:i.checked,o.Z.managers.appStateManager.setByKey(e.stateKey,s)};r.Z.getState().then((i=>{t=!0;const s=(0,a.Z)(i,e.stateKey);let n;n=e.stateValues?1===e.stateValues.indexOf(s):s,this.setValueSilently(n)})),e.listenerSetter?e.listenerSetter.add(i)("change",s):i.addEventListener("change",s)}let d;if(e.text?(d=this.span=document.createElement("span"),d.classList.add("checkbox-caption"),(0,n.$d)(d,e.text,e.textArgs)):t.classList.add("checkbox-without-caption"),t.append(i),e.toggle){t.classList.add("checkbox-field-toggle");const e=document.createElement("div");e.classList.add("checkbox-toggle"),t.append(e)}else{const e=document.createElement("div");e.classList.add("checkbox-box");const i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.classList.add("checkbox-box-check"),i.setAttributeNS(null,"viewBox","0 0 24 24");const s=document.createElementNS("http://www.w3.org/2000/svg","use");s.setAttributeNS(null,"href","#check"),s.setAttributeNS(null,"x","-1"),i.append(s);const n=document.createElement("div");n.classList.add("checkbox-box-background");const a=document.createElement("div");a.classList.add("checkbox-box-border"),e.append(a,n,i),t.append(e)}d&&t.append(d),e.withRipple?(t.classList.add("checkbox-ripple","hover-effect"),(0,s.Z)(t,void 0,void 0,!0)):e.withHover&&t.classList.add("hover-effect")}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}toggleDisability(e){return this.label.classList.toggle("checkbox-disabled",e),()=>this.toggleDisability(!e)}}},4489:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(503);class n extends s.ZP{constructor(e){super(Object.assign(e,{plainText:!0})),this.options=e;const t=this.input;t.type="tel",t.setAttribute("required",""),t.autocomplete="off";let i=0;this.input.addEventListener("input",(t=>{this.input.classList.remove("error"),this.setLabel();const s=this.value.replace(/\D/g,"").slice(0,e.length);this.setValueSilently(s);const n=this.value.length;if(n===e.length)e.onFill(this.value);else if(n===i)return;i=n}))}}},5592:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(1168),n=i(8127);function a(e){return new Promise(((t,i)=>{var a;const{button:o,checkbox:r}=e;o.callback=i=>{t(r||!i?i?!!i.size:void 0:e.checkboxes.map((e=>i.has(e.text))))};const d=(0,s.x)(e.buttons||[o]),l=d.find((e=>e.isCancel));l.callback=()=>{i()},e.buttons=d,null!==(a=e.checkboxes)&&void 0!==a||(e.checkboxes=r&&[r]),new n.Z("popup-confirmation",e).show()}))}},5431:(e,t,i)=>{"use strict";i.d(t,{Z:()=>S});var s=i(9976),n=i(3910),a=i(8497),o=i(4668),r=i(5565),d=i(130),l=i(4789),c=i(144),h=i(2325),u=i(8115),p=i(3512),f=i(671),m=i(503),g=i(8805);let v;const b=()=>{v=h.ZP.countriesList.filter((e=>{var t;return!(null===(t=e.pFlags)||void 0===t?void 0:t.hidden)})).sort(((e,t)=>(e.name||e.default_name).localeCompare(t.name||t.default_name)))};let y=()=>{b(),p.Z.addEventListener("language_change",(()=>{b()}))};const w=new Set(["FT"]);class S extends m.ZP{constructor(e={}){super(Object.assign({label:"Country",name:(0,c.a)()},e)),this.options=e,this.hidePicker=()=>{void 0===this.hideTimeout&&(this.selectWrapper.classList.remove("active"),this.hideTimeout=window.setTimeout((()=>{this.selectWrapper.classList.add("hide"),this.hideTimeout=void 0}),200))},this.selectCountryByTarget=e=>{var t,i;const s=e.querySelector("[data-default-name]").dataset.defaultName,n=e.querySelector(".phone-code"),a=null==n?void 0:n.innerText,o=a&&a.replace(/\D/g,"");(0,r.Z)(this.input,(0,h.ag)(s)),this.simulateInputEvent(),this.lastCountrySelected=v.find((e=>e.default_name===s)),this.lastCountryCodeSelected=o&&this.lastCountrySelected.country_codes.find((e=>e.country_code===o)),null===(i=(t=this.options).onCountryChange)||void 0===i||i.call(t,this.lastCountrySelected,this.lastCountryCodeSelected),this.hidePicker()},y&&(y(),y=void 0),this.liMap=new Map,this.container.classList.add("input-select");const t=this.selectWrapper=document.createElement("div");t.classList.add("select-wrapper","z-depth-3","hide");const i=document.createElement("span");i.classList.add("arrow","arrow-down"),this.container.append(i);const p=document.createElement("ul");t.appendChild(p),new g.ZP(t);let m=()=>{m=null,v.forEach((t=>{if(e.noPhoneCodes&&w.has(t.iso2))return;const i=(0,f.Ml)(t.iso2),n=[];for(let a=0,o=Math.min(t.country_codes.length,e.noPhoneCodes?1:1/0);a{if(0!==e.button)return;const t=(0,o.Z)(e.target,"LI");this.selectCountryByTarget(t)})),this.container.appendChild(t)};m(),this.input.addEventListener("focus",(e=>{m?m():v.forEach((e=>{const t=this.liMap.get(e.iso2);t&&t.forEach((e=>e.style.display=""))})),clearTimeout(this.hideTimeout),this.hideTimeout=void 0,t.classList.remove("hide"),t.offsetWidth,t.classList.add("active"),this.select(),(0,l.Z)({container:(0,a.Z)(this.container,"scrollable-y"),element:this.input,position:"start",margin:4}),setTimeout((()=>{b||(document.addEventListener("mousedown",S,{capture:!0}),b=!0)}),0)}));let b=!1;const S=e=>{(0,a.Z)(e.target,"input-select")||e.target!==this.input&&(this.hidePicker(),document.removeEventListener("mousedown",S,{capture:!0}),b=!1)},C=e=>{const t=e.key;if(e.ctrlKey||"Control"===t)return!1;const i=this.value.toLowerCase(),s=[];v.forEach((e=>{const t=this.liMap.get(e.iso2);if(!t)return;const n=[e.name,e.default_name,e.iso2];n.filter(Boolean).forEach((e=>{const t=e.split(" ").filter((e=>/\w/.test(e))).map((e=>e[0])).join("");t.length>1&&n.push(t)}));const a=!!n.filter(Boolean).find((e=>-1!==e.toLowerCase().indexOf(i)));t.forEach((e=>e.style.display=a?"":"none")),a&&s.push(e)})),0===s.length?v.forEach((e=>{const t=this.liMap.get(e.iso2);t&&t.forEach((e=>e.style.display=""))})):1===s.length&&"Enter"===t&&((0,n.Z)(e),this.selectCountryByTarget(this.liMap.get(s[0].iso2)[0]))};this.input.addEventListener("keyup",C),this.input.addEventListener("keydown",(e=>{"Enter"===e.key&&C(e)})),i.addEventListener("mousedown",(e=>{this.input.matches(":focus")?(this.hidePicker(),this.input.blur()):(e.cancelBubble=!0,e.preventDefault(),this.input.focus())}))}getSelected(){return{country:this.lastCountrySelected,code:this.lastCountryCodeSelected}}selectCountryByIso2(e){this.selectCountryByTarget(this.liMap.get(e)[0])}override(e,t,i){var s,n;(0,r.Z)(this.input,e?(0,h.ag)(e.default_name):i),this.lastCountrySelected=e,this.lastCountryCodeSelected=t,null===(n=(s=this.options).onCountryChange)||void 0===n||n.call(s,this.lastCountrySelected,this.lastCountryCodeSelected)}}},6628:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(4762),n=i(5296),a=i(3228),o=i(5814);class r{constructor(e,t,i){this.width=e,this.height=t,this.multiply=i;const s=this.canvas=document.createElement("canvas"),n=this.dpr=window.devicePixelRatio;s.width=e*n,s.height=t*n,s.classList.add("canvas-thumbnail","canvas-dots"),this.paused=!0,this.autoplay=!0,this.tempId=0,this.context=s.getContext("2d")}prepare(){let e=Math.round(this.width*this.height/(35*(s.IS_MOBILE?2:1)));e*=this.multiply||1,e=Math.min(s.IS_MOBILE?1e3:2200,e),e=Math.round(e);const t=this.dots=new Array(e);for(let i=0;i=.8?1:.5)*this.dpr,a=new Path2D;return a.arc(t,i,n,0,2*Math.PI,!1),{x:t,y:i,opacity:s,radius:n,mOpacity:s,adding:null!=e?e:Math.random()>=.5,counter:0,path:a}}draw(){const{context:e,canvas:t,dots:i}=this;e.clearRect(0,0,t.width,t.height),e.fillStyle="#fff";for(let t=0,s=i.length;t=1&&(i[t]=this.generateDot(s.adding))):s.mOpacity>=1&&(s.adding=!1)}}remove(){this.pause()}pause(){this.paused||(this.paused=!0,++this.tempId)}renderFirstFrame(){this.dots||this.prepare(),this.draw()}play(){if(!this.paused)return;this.paused=!1;const e=++this.tempId;this.dots||this.prepare(),(0,n.jt)((()=>this.tempId===e&&!this.paused&&(this.draw(),!0)))}static create({width:e,height:t,middleware:i,animationGroup:s,multiply:n}){i.onClean((()=>{o.Z.removeAnimationByPlayer(a)}));const a=new r(e,t,n);return a.renderFirstFrame(),o.Z.addAnimation(a,s,a.canvas,!0),a}}},2621:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(187),n=i(9331),a=i(8119),o=i(5953),r=i(1507);class d{constructor(e){this._disabled=!1,this.avatarSize=120,this.isChanged=()=>{if(this.uploadAvatar)return!0;let e=0,t=0,i=0;return this.inputFields.forEach((s=>{s.isValid()&&(s.isChanged()&&++e,s.required&&++i),s.required&&++t})),t===i&&e>0},this.handleChange=()=>{this.nextBtn.classList.toggle("is-visible",this.isChanged())},(0,o.Z)(this,e),this.peerId||(this.peerId=r.NM),this.nextBtn?this.nextBtn.classList.contains("btn-corner")||(this.handleChange=()=>{this.nextBtn.toggleAttribute("disabled",!this.isChanged()||this.disabled)}):this.nextBtn=(0,a.Z)({icon:"check"}),e.withoutAvatar||(this.avatarElem=new n.Z,this.avatarElem.classList.add("avatar-placeholder","avatar-"+this.avatarSize),this.avatarElem.updateWithOptions({peerId:this.peerId}),e.doNotEditAvatar||(this.avatarEdit=new s.Z((e=>{this.uploadAvatar=e,this.handleChange(),this.avatarElem.remove()}),e.popupOptions),this.avatarEdit.container.append(this.avatarElem))),this.inputFields.forEach((e=>{this.listenerSetter.add(e.input)("input",this.handleChange)})),this.handleChange()}get disabled(){return this._disabled}set disabled(e){this._disabled=e,this.inputFields.forEach((t=>t.input.toggleAttribute("disabled",e))),this.handleChange()}lockWithPromise(e,t=!1){this.disabled=!0,e.then((()=>{t&&(this.disabled=!1)}),(()=>{this.disabled=!1}))}}},3173:(e,t,i)=>{"use strict";i.d(t,{Yd:()=>Y,Jo:()=>J,ZP:()=>te});var s=i(5432),n=i(4271),a=i(3512),o=i(5814),r=i(6008),d=i(2153),l=i(4332),c=i(5117),h=i(6039),u=i(1080),p=i(8805),f=i(279),m=i(2738);class g{constructor(e){this.managers=e}init(){this.content=document.getElementById("content-gifs");const e=this.content.firstElementChild;(0,m.fc)(e,J.onMediaClick);const t=this.scrollable=new p.ZP(this.content,"GIFS"),i=new u.Z(e,Y,t),s=(0,f.y)(this.content,!0);this.managers.appDocsManager.getGifs().then((e=>{e.forEach((e=>{i.add(e)})),s.remove()})),te.addLazyLoadQueueRepeat(i.lazyLoadQueue,i.processInvisibleDiv),this.init=null}onClose(){}}var v=i(6057),b=i(410),y=i(3552),w=i(3607),S=i(4755),C=i(8497),L=i(1507),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const I="GIFS-SEARCH";class M extends y._{constructor(){super(...arguments),this.nextOffset="",this.loadedAll=!1,this.onGifsClick=e=>E(this,void 0,void 0,(function*(){const t=(0,C.Z)(e.target,"gif");if(!t)return;const i=t.dataset.docId;(yield n.ZP.chat.input.sendMessageWithDocument(i))?S.Z.isMobile&&l.ZP.onCloseBtnClick():console.warn("got no doc by id:",i)}))}init(){this.container.id="search-gifs-container",this.inputSearch=new w.Z("SearchGifsTitle",(e=>{this.reset(),this.search(e)})),this.title.replaceWith(this.inputSearch.container),this.gifsDiv=document.createElement("div"),this.gifsDiv.classList.add("gifs-masonry"),(0,m.fc)(this.gifsDiv,this.onGifsClick,{listenerSetter:this.listenerSetter}),this.scrollable.append(this.gifsDiv),this.masonry=new u.Z(this.gifsDiv,I,this.scrollable),l.ZP.toggleSidebar(!0).then((()=>{this.search("",!0),this.scrollable.onScrolledBottom=()=>{this.search(this.inputSearch.value,!1)}}))}onClose(){this.scrollable.onScrolledBottom=()=>{}}onCloseAfterTimeout(){return this.reset(),this.gifsDiv.innerHTML="",o.Z.checkAnimations(void 0,I),this.inputSearch.remove(),super.onCloseAfterTimeout()}reset(){this.searchPromise=null,this.nextOffset="",this.loadedAll=!1,this.masonry.clear()}search(e,t=!0){return E(this,void 0,void 0,(function*(){if(!this.searchPromise&&!this.loadedAll){this.gifBotPeerId||(this.gifBotPeerId=(yield this.managers.appUsersManager.resolveUsername("gif")).id.toPeerId(!1));try{this.searchPromise=this.managers.appInlineBotsManager.getInlineResults(L.NM,this.gifBotPeerId,e,this.nextOffset);const{results:i,next_offset:s}=yield this.searchPromise;if(this.inputSearch.value!==e)return;this.searchPromise=null,this.nextOffset=s,t&&(this.gifsDiv.innerHTML=""),i.length?i.forEach((e=>{"botInlineMediaResult"===e._&&e.document&&this.masonry.add(e.document)})):this.loadedAll=!0,this.scrollable.onScroll()}catch(e){throw this.searchPromise=null,console.error("gifs loading error:",e),e}}}))}}var P=i(6787),Z=i(2325),k=i(7625),T=i(130),x=i(8115),A=i(9259),_=i(3541);class F extends y._{init(){this.container.id="stickers-container",this.container.classList.add("chatlist-container"),this.lazyLoadQueue=new d.Z,this.inputSearch=new w.Z("StickersTab.SearchPlaceholder",(e=>{this.search(e)})),this.title.replaceWith(this.inputSearch.container),this.setsDiv=document.createElement("div"),this.setsDiv.classList.add("sticker-sets"),this.scrollable.append(this.setsDiv),(0,A.Z)({listenTo:this.setsDiv,listenerSetter:this.listenerSetter}),(0,m.fc)(this.setsDiv,(e=>{const t=(0,C.Z)(e.target,"sticker-set-sticker");if(t){const e=t.dataset.docId;return void n.ZP.chat.input.sendMessageWithDocument(e)}const i=(0,C.Z)(e.target,"sticker-set");if(!i)return;const s=i.dataset.stickerSet,a=i.dataset.access_hash,o=(0,C.Z)(e.target,"sticker-set-button");o?(e.preventDefault(),e.cancelBubble=!0,o.setAttribute("disabled","true"),this.managers.appStickersManager.getStickerSet({id:s,access_hash:a}).then((e=>{this.managers.appStickersManager.toggleStickerSet(e.set).then((t=>{t&&(o.textContent="",o.append((0,Z.ag)(e.set.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),o.classList.toggle("gray",!!e.set.installed_date))})).finally((()=>{o.removeAttribute("disabled")}))}))):this.managers.appStickersManager.getStickerSet({id:s,access_hash:a}).then((e=>{new P.Z(e.set).show()}))}),{listenerSetter:this.listenerSetter}),l.ZP.toggleSidebar(!0).then((()=>{this.renderFeatured()}))}onCloseAfterTimeout(){return this.setsDiv.innerHTML="",o.Z.checkAnimations(void 0,"STICKERS-SEARCH"),super.onCloseAfterTimeout()}renderSet(e){const t=document.createElement("div");t.classList.add("sticker-set");const i=document.createElement("div");i.classList.add("sticker-set-header");const s=document.createElement("div");s.classList.add("sticker-set-details"),s.innerHTML='
',(0,T.Z)(s.firstElementChild,(0,x.Z)(e.title));const n=document.createElement("div");n.classList.add("sticker-set-count"),n.append((0,Z.ag)("Stickers",[e.count])),s.append(n);const a=document.createElement("button");a.classList.add("btn-primary","btn-color-primary","sticker-set-button"),a.append((0,Z.ag)(e.installed_date?"Stickers.SearchAdded":"Stickers.SearchAdd")),e.installed_date&&a.classList.add("gray"),i.append(s,a);const o=document.createElement("div");o.classList.add("sticker-set-stickers");const r=Math.min(5,e.count);for(let e=0;e{for(let t=0;t{this.inputSearch.value||(e=this.filterRendered("",e)).forEach((e=>{this.renderSet(e.set)}))}))}filterRendered(e,t){t=t.slice();const i=Array.from(this.setsDiv.children);return(0,k.Z)(i,(i=>{const s=i.dataset.stickerSet,n=t.findIndex((e=>e.set.id===s));-1!==n?t.splice(n,1):e&&i.dataset.title.toLowerCase().includes(e.toLowerCase())||i.remove()})),o.Z.checkAnimations(void 0,"STICKERS-SEARCH"),t}search(e){return e?this.managers.appStickersManager.searchStickerSets(e,!1).then((t=>{this.inputSearch.value===e&&(t=this.filterRendered(e,t)).forEach((e=>{this.renderSet(e.set)}))})):this.renderFeatured()}}var D,R=i(4668),B=i(8799),N=i(2648),O=i(3910),U=i(6339),H=i(5418),z=i(4762),j=i(3815),G=i(319),V=i(4789),K=i(6802),W=i.n(K),$=i(669),q=i(3299),Q=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Y="emoticons-dropdown",X={forceDuration:200,transitionFunction:W()(.42,0,.58,1)};class J extends U.Z{constructor(){super({element:document.getElementById("emoji-dropdown"),ignoreOutClickClassName:"input-message-input"}),this.tabId=-1,this.onSelectTabClick=e=>{if(this.tabId!==e)o.Z.checkAnimations(!0,Y),this.tabId=e,this.searchButton.classList.toggle("hide",this.tabId===this.emojiTab.tabId),this.deleteBtn.classList.toggle("hide",this.tabId!==this.emojiTab.tabId);else{const{tab:e}=this;this.scrollTo(e,e.scrollable.container.firstElementChild)}},this.checkRights=()=>Q(this,void 0,void 0,(function*(){const{peerId:e,threadId:t}=n.ZP.chat,i=this.tabsEl.children,s=Array.from(i),[a,o]=yield Promise.all([this.managers.appMessagesManager.canSendToPeer(e,t,"send_stickers"),this.managers.appMessagesManager.canSendToPeer(e,t,"send_gifs")]);s[this.stickersTab.tabId+1].toggleAttribute("disabled",!a),s[this.gifsTab.tabId+1].toggleAttribute("disabled",!o);const r=this.tabsEl.querySelector(".active");!r||(0,N.Z)(r)===this.emojiTab.tabId+1||a&&o||this.selectTab(this.emojiTab.tabId,!1)})),this.addEventListener("open",(()=>Q(this,void 0,void 0,(function*(){var e;s.Z&&(0,B.Z)()&&(yield(0,H.Z)(100)),this.element.parentElement!==n.ZP.chat.input.chatInput&&n.ZP.chat.input.chatInput.append(this.element),this.savedRange=this.getGoodRange(),J.lazyLoadQueue.lock(),o.Z.lockIntersectionGroup(Y);const t=this.tab;null===(e=t.onOpen)||void 0===e||e.call(t)})))),this.addEventListener("opened",(()=>{var e;o.Z.unlockIntersectionGroup(Y),J.lazyLoadQueue.unlockAndRefresh();const t=this.tab;null===(e=t.onOpened)||void 0===e||e.call(t)})),this.addEventListener("close",(()=>{var e;J.lazyLoadQueue.lock(),o.Z.lockIntersectionGroup(Y),o.Z.checkAnimations(!0,Y);const t=this.tab;null===(e=t.onClose)||void 0===e||e.call(t)})),this.addEventListener("closed",(()=>{var e;o.Z.unlockIntersectionGroup(Y),J.lazyLoadQueue.unlock(),J.lazyLoadQueue.refresh(),this.savedRange=void 0;const t=this.tab;null===(e=t.onClosed)||void 0===e||e.call(t)}))}get tab(){return this.tabs[this.tabId]}init(){this.managers=a.Z.managers,this.emojiTab=new h.ZP({managers:this.managers}),this.stickersTab=new v.ZP(this.managers),this.gifsTab=new g(this.managers),this.tabs={},[this.emojiTab,this.stickersTab,this.gifsTab].forEach(((e,t)=>{e.tabId=t,this.tabs[t]=e})),this.container=this.element.querySelector(".emoji-container .tabs-container"),this.container.prepend(this.emojiTab.container,this.stickersTab.container),this.tabsEl=this.element.querySelector(".emoji-tabs"),this.selectTab=(0,r.X)(this.tabsEl,this.container,this.onSelectTabClick,(()=>{var e;const{tab:t}=this;null===(e=t.init)||void 0===e||e.call(t),o.Z.checkAnimations(!1,Y)})),this.searchButton=this.element.querySelector(".emoji-tabs-search"),this.searchButton.addEventListener("click",(()=>{this.tabId===this.stickersTab.tabId?l.ZP.isTabExists(F)||l.ZP.createTab(F).open():l.ZP.isTabExists(M)||l.ZP.createTab(M).open()})),this.deleteBtn=this.element.querySelector(".emoji-tabs-delete"),(0,m.fc)(this.deleteBtn,(e=>{(0,O.Z)(e);const t=n.ZP.chat.input.messageInput;let i=$.Z.getInstance().getSavedRange(t);i||(i=document.createRange(),i.setStartAfter(t.lastChild));const s=i.cloneRange();if(i.collapsed){const{node:e,offset:n}=(0,q.q)(t,i.endContainer,i.endOffset);let a;if(n)a=e;else{if(a=e.previousSibling,!a)return;for(;a.nodeType===a.TEXT_NODE&&!a.nodeValue&&(a=a.previousSibling););if(a.nodeType===a.ELEMENT_NODE&&!a.isContentEditable)return}if(a.nodeType===a.ELEMENT_NODE&&"IMG"===a.tagName)s.selectNode(a);else{const e=[...a.textContent];let t;if(n){let i=0;t=e.find((e=>(i+=e.length,i>=n)))}else t=e.pop()||"";const i=n?n-t.length:a.textContent.length-t.length;s.setStart(a,i)}}s.deleteContents(),n.ZP.chat.input.messageInputField.simulateInputEvent()}));const e=z.IS_APPLE_MOBILE&&!1,t=e?this.stickersTab.tabId:this.emojiTab.tabId;if(e&&this.tabsEl.children[1].classList.add("hide"),(0,m.tH)(this.tabsEl.children[t+1]),this.tabs[t].init&&this.tabs[t].init(),!s.Z){let e,t=!1;const i=t=>{e=t};j.Z.addEventListener("change",(s=>{s?t||(document.body.addEventListener("mousemove",i),t=!0):t&&(document.body.removeEventListener("mousemove",i),e&&this.onMouseOut(e))}))}return n.ZP.addEventListener("peer_changing",(()=>{this.toggle(!1)})),n.ZP.addEventListener("peer_changed",this.checkRights),this.checkRights(),super.init()}getElement(){return this.element}scrollTo(e,t){e.scrollable.scrollIntoViewNew(Object.assign({element:t,axis:"y",position:"start"},X))}static sendDocId(e,t,i){return Q(this,void 0,void 0,(function*(){return(yield n.ZP.chat.input.sendMessageWithDocument(e,void 0,t,i))?(ee.container&&(ee.forceClose=!0,ee.toggle(!1)),!0):(console.warn("got no doc by id:",e),!1)}))}addLazyLoadQueueRepeat(e,t){this.addEventListener("close",(()=>{e.lock()})),this.addEventListener("closed",(()=>{const i=e.intersector.getVisible();for(const e of i)t(e);e.intersector.clearVisible()})),this.addEventListener("opened",(()=>{e.unlockAndRefresh()}))}getSavedRange(){return this.getGoodRange()||this.savedRange}getGoodRange(){const e=document.getSelection();if(e.rangeCount&&document.activeElement===n.ZP.chat.input.messageInput)return e.getRangeAt(0)}}D=J,J.lazyLoadQueue=new d.Z(1),J.menuOnClick=(e,t,i,s,n,a)=>{let o=-1;const r=(e,t=!0)=>{if(e===n)return!1;let i=!1;return n&&(n.elements.menuTab.classList.remove("active"),n.menuScroll&&n.menuScroll!==e.menuScroll&&(i=!0,n.menuScroll.container.parentElement.classList.remove("active"),n.menuScroll.scrollIntoViewNew(Object.assign({element:n.menuScroll.container.firstElementChild,forceDirection:t?void 0:V.f.Static,position:"center",axis:"x"},X)))),e.elements.menuTab.classList.add("active"),e.menuScroll&&(e.menuScroll.container.parentElement.classList.add("active"),t&&s.scrollIntoViewNew(Object.assign({element:e.menuScroll.container.parentElement,position:"center",axis:"x"},X))),n&&((e,t)=>{const i=e.menuScroll||s;i&&i.scrollIntoViewNew(Object.assign({element:e.elements.menuTab,position:"center",axis:"x",getElementPosition:t?({elementPosition:e})=>e-106:void 0},X))})(e,i),n=e,!0};let d=!1;const l=new c.Z(i.container,((t,s)=>{if(d)return;if(Math.abs(o-i.container.scrollTop)<=1)return;o=-1;const n=e.getCategoryByContainer(s),a=(0,N.Z)(s);(t||!a&&!n.menuScroll)&&r(n)}));(0,m.fc)(t,(t=>{let s=(0,C.Z)(t.target,"menu-horizontal-div-item");if(!s){if(s=(0,C.Z)(t.target,"menu-horizontal-inner"),!s||s.classList.contains("active"))return;s=s.firstElementChild.firstElementChild}const n=(0,N.Z)(s),a=e.getCategoryByMenuTab(s);r(a);let l=0,c=0;if(n>0||a.menuScroll){const e=a.elements.container;c=1,l=e.offsetTop+c}o=l,d=!0,i.scrollIntoViewNew(Object.assign({element:l?a.elements.container:i.container.firstElementChild,position:"start",axis:"y",getElementPosition:l?({elementPosition:e})=>e+c:void 0},X)).finally((()=>{r(a),d=!1}))}),{listenerSetter:a});const h=i.onAdditionalScroll?i.onAdditionalScroll.bind(i):G.Z;return i.onAdditionalScroll=()=>{e.content.parentElement.classList.toggle("scrolled-top",!i.scrollTop),h()},{stickyIntersector:l,setActive:r,setActiveStatic:t=>{if(null==n?void 0:n.local)return;e.scrollable.scrollTop=t.elements.container.offsetTop+1;const i=e.menuScroll.container,s=t.elements.menuTab;i.scrollLeft=s.offsetLeft-i.clientWidth/2+s.offsetWidth/2,r(t,!1)}}},J.onMediaClick=(e,t=!1,i)=>Q(void 0,void 0,void 0,(function*(){const s=(0,R.Z)(e.target,"DIV");if(!s)return!1;const n=s.dataset.docId;return!!n&&D.sendDocId(n,t,i)}));const ee=new J;b.GO.emoticonsDropdown=ee;const te=ee},6039:(e,t,i)=>{"use strict";i.d(t,{IA:()=>F,ZP:()=>j,xG:()=>D});var s=i(3173),n=i(3910),a=i(8497),o=i(3035),r=i(5418),d=i(4271),l=i(3512),c=i(671),h=i(279),u=i(8805),p=i(9976),f=i(5432),m=i(8799),g=i(3447),v=i(7746),b=i(8115),y=i(7197),w=i(5400),S=i(2738),C=i(6057),L=i(9405),E=i(2940),I=i(4755),M=i(1273),P=i(9259),Z=i(4064),k=i(4484),T=i(6787),x=i(2796),A=i(5953);const _=new Set;function F(e,t,i=!1,s=!1){var n;const a=document.createElement("span");let r;if(a.classList.add("super-emoji"),s&&!p.Z?r=function(e){return(0,w.ZP)(e,{entities:[(0,y.Z)(e)]})}(e):(e=(0,v.Z)(e),r=(0,b.Z)(e)),a.append(r),a.children.length>1){const e=a.firstElementChild;a.innerHTML="",a.append(e)}if("IMG"===(null===(n=a.firstElementChild)||void 0===n?void 0:n.tagName)){const e=a.firstElementChild,t=e.src;if(!_.has(t)){e.setAttribute("loading","lazy");const i=document.createElement("span");i.classList.add("emoji-placeholder"),l.Z.settings.animationsEnabled&&(e.style.opacity="0",i.style.opacity="1"),e.addEventListener("load",(()=>{(0,o.T2)((()=>{l.Z.settings.animationsEnabled&&(e.style.opacity="",i.style.opacity=""),a.classList.remove("empty"),_.add(t)}))}),{once:!0}),a.append(i)}}return t&&(i?t.prepend(a):t.appendChild(a)),a}function D(e){const t=(0,a.Z)(e,"super-emoji");if(!t)return;const i=t.firstElementChild;return i&&i.classList.contains("custom-emoji")?{emoji:i.dataset.stickerEmoji,docId:i.dataset.docId}:e.nodeType===e.TEXT_NODE?{emoji:e.nodeValue}:("SPAN"===e.tagName&&!e.classList.contains("emoji")&&e.firstElementChild&&(e=e.firstElementChild),{emoji:e.getAttribute("alt")||e.innerText})}const R="Emoji.Recent",B=[R,"recent"],N=["",""],O=[["Emoji.SmilesAndPeople","smile"],["Emoji.AnimalsAndNature","animals"],["Emoji.FoodAndDrink","eats"],["Emoji.TravelAndPlaces","car"],["Emoji.ActivityAndSport","sport"],["Emoji.Objects","lamp"],["Emoji.Flags","flag"],["Skin Tones",""]];let U;function H(){if(U)return U;U=new Map([[N,[]],[B,[]]]);for(const e in g.Z){const t=""+g.Z[e],i=O[+t[0]-1];if(!i)continue;let s=U.get(i);s||(s=[],U.set(i,s)),s[+t.slice(1)||0]=e}U.delete(O.pop()),O.unshift(N,B);const e=O.map((([e])=>e)),t=[...U.entries()].sort(((t,i)=>e.indexOf(t[0][0])-e.indexOf(i[0][0])));return U=new Map(t),U}const z=(0,L.C)(42,42);class j extends C.pw{constructor(e){super(e.managers,"super-emojis",(()=>z),16,4,0),this.onCategoryVisibility=({target:e,visible:t})=>{const i=this.categoriesMap.get(e),s=i.elements.renderer,n=[];if(s){n.push(s);const e=new Map;t?(n.push(...i.items.map((({docId:t,element:i})=>{if(!t)return i;const s=i.firstElementChild;return s.clear(!1),e.set(s.docId,new Set([s])),i}))),s.add(e,void 0,void 0,!1)):(s.clearCanvas(),s.middlewareHelper.clean())}else t&&n.push(...i.items.map((({element:e})=>e)));if(i.elements.items.replaceChildren(...n),s&&!t){const e=new Map;i.items.forEach((({docId:t,element:i})=>{if(!t)return;const s=i.firstElementChild;s.clear(),e.set(s.docId,new Set([s]))})),s.add(e,void 0,!0)}},this.onContentClick=e=>{(0,n.Z)(e);const{target:t}=e,i=(0,a.Z)(t,"emoji-category"),s=this.categoriesMap.get(i);if((0,a.Z)(t,"category-title")){if(s.local)return;return void new T.Z({id:s.set.id,access_hash:s.set.access_hash},!0).show()}const o=D(t);if(o){if(o.docId&&!l.Z.premium&&(this.isStandalone?""!==s.id:this.peerId!==l.Z.myId)){const e=document.createElement("a");return e.onclick=()=>{d.ZP.openPremiumBot(),(0,x.PE)()},void(0,x.bC)({langPackKey:"CustomEmoji.PremiumAlert",langPackArguments:[e]})}this.onClick?this.onClick(Object.assign(Object.assign({},o),{element:(0,a.Z)(t,"super-emoji").firstElementChild})):d.ZP.chat.input.onEmojiSelected(o,!1),f.Z&&(0,m.Z)()}},(0,A.Z)(this,e),this.container.classList.add("emoji-padding"),this.content.id="content-emoji",this.activeElements=[]}destroy(){var e;super.destroy(),null===(e=this.menuInnerScroll)||void 0===e||e.destroy()}init(){super.init(),this.init=void 0;const e={root:this.isStandalone?this.content:s.ZP.getElement()};this.categoriesIntersector=new E.Z(this.onCategoryVisibility,e),this.menuOnClickResult=s.Jo.menuOnClick(this,this.menu,this.scrollable,this.menuScroll,void 0,this.listenerSetter);const t=(0,h.y)(this.content,!0);let i,n;if(!this.isStandalone){const e=this.menuInnerScroll=new u.v7(void 0);e.container.classList.add("menu-horizontal-inner-scroll"),i=document.createElement("div"),i.classList.add("menu-horizontal-inner"),i.append(e.container)}H(),n=this.noRegularEmoji?new Map([[[N[0],"recent"],[]]]):H(),n.forEach(((e,[t,i])=>{const s=this.createLocalCategory(t,t,i,!i);s.elements.container.classList.remove("hide"),s.elements.items.classList.add(i&&!this.isStandalone?"is-local":"not-local"),e.forEach((e=>{const t=(0,c.zu)(e);this.addEmojiToCategory({category:s,emoji:{emoji:t},batch:!0})}))}));const a=Promise.all([this.isStandalone?void 0:(0,r.Z)(200),!this.noRegularEmoji&&this.managers.appEmojiManager.getRecentEmojis("native"),!this.isStandalone&&this.managers.appEmojiManager.getRecentEmojis("custom"),this.stickerSetId&&this.managers.appStickersManager.getLocalStickerSet(this.stickerSetId),this.managers.appEmojiManager.getCustomEmojis()]).then((([e,n,a,o,r])=>{t.remove(),o&&(a=o.documents.map((e=>e.id)));const c=this.categories[R],h=this.categories[""];if(this.isStandalone||[c&&[c,n],h&&[h,a]].filter(Boolean).forEach((([e,t])=>{e.limit=32,t.splice(32,t.length-32)})),c&&n)for(const e of n)this.addEmojiToCategory({category:c,emoji:{emoji:e},batch:!0});if(h){if(this.createRendererForCategory(h),a)for(const e of a)this.addEmojiToCategory({category:h,emoji:{emoji:"",docId:e},batch:!0});h.elements.container.style.paddingTop=".5rem"}O.forEach((([e])=>{const t=this.categories[e];t&&(this.toggleLocalCategory(t,!0),e!==R&&""!==e&&(t.menuScroll=this.menuInnerScroll,this.menuInnerScroll.container.append(t.elements.menuTab)))})),this.resizeCategories(),c&&i&&c.elements.menuTab.after(i),r.sets.forEach((e=>{this.renderStickerSet(e)})),this.listenerSetter.add(l.Z)("premium_toggle",(()=>{this.toggleCustomCategory()})),this.listenerSetter.add(l.Z)("stickers_top",this.postponedEvent((e=>{const t=this.categories[e];t&&(this.positionCategory(t,!0),this.listenerSetter.add(s.ZP)("openAfterLayout",(()=>{this.menuOnClickResult.setActiveStatic(t)}),{once:!0}))})));const u=e=>{for(const t in this.categories){const i=this.categories[t].elements.renderer;i&&(i.ignoreSettingDimensions=e,e||i.setDimensionsFromRect(void 0,!0))}};!this.isStandalone&&this.listenerSetter.add(s.ZP)("opened",(()=>{u(!1)})),!this.isStandalone&&this.listenerSetter.add(s.ZP)("close",(()=>{u(!0)})),this.listenerSetter.add(l.Z)("stickers_installed",(e=>{!this.categories[e.id]&&e.pFlags.emojis&&this.renderStickerSet(e,!0)})),this.listenerSetter.add(l.Z)("stickers_deleted",(e=>{const t=this.categories[e.id];if(this.deleteCategory(t)){const{renderer:e}=t.elements;e&&e.middlewareHelper.clean()}})),!this.isStandalone&&this.listenerSetter.add(l.Z)("emoji_recent",this.postponedEvent((e=>{const t=this.categories[e.docId?"":R];if(!t)return;const i=e.docId?t=>t.docId===e.docId:t=>t.emoji===e.emoji,s=(0,Z.Z)(t.items,i);if(s){if(t.items.unshift(s),this.isCategoryVisible(t)){const{renderer:e}=t.elements;(0,k.Z)(s.element,t.elements.items,e?1:0,-1),null==e||e.forceRender()}}else this.addEmojiToCategory({category:t,emoji:e,batch:!1,prepend:!0});0===this.closeScrollTop&&this.menuOnClickResult.setActive(e.docId?this.categories[R]:t)}))),!this.isStandalone&&this.listenerSetter.add(d.ZP)("peer_changed",(()=>{this.toggleCustomCategory()})),this.toggleCustomCategory(),this.menuOnClickResult.setActive(null!=c?c:h)}));return(0,S.fc)(this.content,this.onContentClick,{listenerSetter:this.listenerSetter}),(0,P.Z)({listenTo:this.content,listenerSetter:this.listenerSetter}),a}renderStickerSet(e,t){const i=this.createCategory(e,(0,b.Z)(e.title));this.positionCategory(i,t);const{container:n,menuTabPadding:a}=i.elements;i.elements.items.classList.add("not-local"),i.elements.container.classList.add("is-premium-set"),i.elements.title.classList.add("tgico"),this.createRendererForCategory(i),this.managers.appStickersManager.getStickerSet(e).then((({documents:e})=>{e.forEach((e=>{this.addEmojiToCategory({category:i,emoji:{docId:e.id,emoji:e.stickerEmojiRaw},batch:!0})})),this.onCategoryVisibility({target:i.elements.container,visible:this.isCategoryVisible(i)}),i.setCategoryItemsHeight(),n.classList.remove("hide")})),(0,M.Z)({set:e,container:a,group:s.Yd,lazyLoadQueue:s.Jo.lazyLoadQueue,width:32,height:32,autoplay:!1})}get peerId(){return d.ZP.chat.peerId}getCustomCategory(){return this.categories[""]}toggleCustomCategory(){const e=this.categories[""],t=l.Z.premium||this.peerId===l.Z.myId,i=t||this.isStandalone;super.toggleLocalCategory(e,!!e.items.length&&i),this.content.classList.toggle("has-premium",t)}toggleLocalCategory(e,t){""!==e.id?super.toggleLocalCategory(e,t):this.toggleCustomCategory()}createRendererForCategory(e){const t=w.KZ.create({animationGroup:s.Yd,customEmojiSize:I.Z.active.esgCustomEmoji});e.elements.renderer=t,e.elements.items.append(t)}addEmojiToCategory(e){const{category:t,emoji:i,batch:s,prepend:n}=e;let a=e.element;if(a){const e=document.createElement("span");e.classList.add("super-emoji"),e.append(a),a=e}else if(i.docId){const e=w.LD.create(i.docId),t=document.createElement("span");t.classList.add("super-emoji"),t.append(e),a=t}else a=F(i.emoji,void 0,!1);const o=Object.assign(Object.assign({},i||{emoji:void 0}),{element:a});(e.active||this.activeEmoji&&(o.docId?this.activeEmoji.docId===o.docId:this.activeEmoji.emoji===o.emoji))&&(this.activeEmoji,this.activeElements.push(o),a.classList.add("active")),t.items[n?"unshift":"push"](o),s||this.spliceExceed(t)||this.onLocalCategoryUpdate(t)}setActive(e){var t,i;(e===this.activeEmoji||(null==e?void 0:e.docId)?e.docId!==(null===(t=this.activeEmoji)||void 0===t?void 0:t.docId):(null==e?void 0:e.emoji)!==(null===(i=this.activeEmoji)||void 0===i?void 0:i.emoji))&&(this.activeEmoji=e,this.activeElements.forEach((e=>{e.element.classList.remove("active")})),this.activeElements.length=0,this.categoriesMap.forEach((t=>{t.items.forEach((t=>{(e.docId?t.docId===e.docId:t.emoji===e.emoji)&&(t.element.classList.add("active"),this.activeElements.push(t))}))})))}onClose(){this.closeScrollTop=this.scrollable.scrollTop}}},6057:(e,t,i)=>{"use strict";i.d(t,{pw:()=>_,vT:()=>x,ZP:()=>F});var s=i(3173),n=i(8497),a=i(4755),o=i(2325),r=i(8115),d=i(3512),l=i(5814),c=i(1655),h=i(7009),u=i(2940);class p extends h.Z{constructor(e,t,i){super(e),this.onVisibilityChange=t,this.elementsMap=new Map,this.intersector=new u.Z((e=>{var t;const{target:i,visible:s}=e,n=this.elementsMap.get(i);n.visible=s,s?(n.wasSeen=!0,this.queue.includes(n)||this.queue.push(n)):(0,c.Z)(this.queue,n),null===(t=this.onVisibilityChange)||void 0===t||t.call(this,e),this.setProcessQueueTimeout()}),i)}clear(){super.clear(),this.elementsMap.clear()}observe(e){this.elementsMap.set(e.div,e),super.observe(e)}unobserve(e){this.elementsMap.delete(e.div),super.unobserve(e)}}var f=i(279),m=i(6787),g=i(8805),v=i(4064),b=i(2738),y=i(4484),w=i(319),S=i(2230),C=i(5592),L=i(3163),E=i(5975),I=i(7625),M=i(9259),P=i(3699),Z=i(3541),k=i(1273),T=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class x{constructor(e,t,i,s){this.regularLazyLoadQueue=e,this.group=t,this.managers=i,this.options=s,this.animated=new Set,this.checkAnimationContainer=(e,t)=>{l.Z.getAnimations(e).forEach((e=>{t?l.Z.checkAnimation(e,!1):l.Z.removeAnimation(e)}))},this.processVisible=e=>T(this,void 0,void 0,(function*(){const t=e.dataset.docId,i=yield this.managers.appDocsManager.getDoc(t),s=a.Z.active.esgSticker.width,n=(0,Z.ZP)({doc:i,div:e,width:s,height:s,lazyLoadQueue:null,group:this.group,onlyThumb:!1,play:!0,loop:!0,withLock:!0}).then((({render:e})=>e));return n.then((()=>{this.checkAnimationContainer(e,this.lazyLoadQueue.intersector.isVisible(e))})),n})),this.processInvisible=e=>T(this,void 0,void 0,(function*(){const t=e.dataset.docId,i=yield this.managers.appDocsManager.getDoc(t);this.checkAnimationContainer(e,!1),e.textContent="",this.renderSticker(i,e)})),this.lazyLoadQueue=new p(void 0,(({target:e,visible:t})=>{t||this.processInvisible(e)}),s)}clear(){this.lazyLoadQueue.clear()}renderSticker(e,t,i){return t||((t=document.createElement("div")).classList.add("grid-item","super-sticker"),t.dataset.docId=""+e.id,e.animated&&this.observeAnimated(t)),(0,Z.ZP)({doc:e,div:t,lazyLoadQueue:this.regularLazyLoadQueue,group:this.group,onlyThumb:e.animated,loadPromises:i}),t}observeAnimated(e){this.animated.add(e),this.lazyLoadQueue.observe({div:e,load:this.processVisible})}unobserveAnimated(e){this.animated.delete(e),this.lazyLoadQueue.delete({div:e})}}class A{constructor(e){var t,i;const s=document.createElement("div");s.classList.add("emoji-category");const n=document.createElement("div");let a,o,r;n.classList.add("category-items"),e.title&&(a=document.createElement("div"),a.classList.add("category-title"),a.append(e.title)),e.noMenuTab||(o=(0,S.Z)(void 0,{noRipple:!0}),o.classList.add("menu-horizontal-div-item"),r=document.createElement("div"),r.classList.add("menu-horizontal-div-item-padding"),o.append(r)),a&&s.append(a),s.append(n),this.elements={container:s,title:a,items:n,menuTab:o,menuTabPadding:r},this.id=e.id,this.items=[],this.getContainerSize=e.getContainerSize,this.getElementMediaSize=e.getElementMediaSize,this.gapX=null!==(t=e.gapX)&&void 0!==t?t:0,this.gapY=null!==(i=e.gapY)&&void 0!==i?i:0}setCategoryItemsHeight(){const{width:e}=this.getContainerSize(),t=this.getElementMediaSize().width;let i=e/t;this.gapX&&(i-=Math.floor(i-1)*this.gapX/t),i=Math.floor(i);const s=Math.ceil(this.items.length/i);let n=s*t;this.gapY&&(n+=(s-1)*this.gapY),this.elements.items.style.minHeight=n+"px"}}class _{constructor(e,t,i,n,a,o){this.managers=e,this.categoryItemsClassName=t,this.getElementMediaSize=i,this.padding=n,this.gapX=a,this.gapY=o,this.mounted=!1,this.resizeCategories=()=>{for(const[e,t]of this.categoriesMap)t.setCategoryItemsHeight()},this.postponedEvent=e=>(...t)=>{s.ZP.isActive()?this.postponedEvents.push({cb:e,args:t}):e(...t)},this.categories={},this.categoriesMap=new Map,this.categoriesByMenuTabMap=new Map,this.localCategories=[],this.postponedEvents=[],this.listenerSetter=new P.Z,this.container=document.createElement("div"),this.container.classList.add("tabs-tab","emoticons-container"),this.menuWrapper=document.createElement("div"),this.menuWrapper.classList.add("menu-wrapper","emoticons-menu-wrapper"),this.menu=document.createElement("nav"),this.menu.className="menu-horizontal-div no-stripe justify-start emoticons-menu",this.menuWrapper.append(this.menu),this.menuScroll=new g.v7(this.menuWrapper),this.content=document.createElement("div"),this.content.classList.add("emoticons-content"),this.container.append(this.menuWrapper,this.content),this.scrollable=new g.ZP(this.content,"STICKERS")}getCategoryByContainer(e){return this.categoriesMap.get(e)}getCategoryByMenuTab(e){return this.categoriesByMenuTabMap.get(e)}createCategory(e,t,i,s){const n=new A({id:""+e.id,title:t,overflowElement:this.content,getContainerSize:()=>{var e,t;const{width:i,height:s}=null!==(t=null===(e=this.getContainerSize)||void 0===e?void 0:e.call(this))&&void 0!==t?t:this.content.getBoundingClientRect();return{width:i-this.padding,height:s}},getElementMediaSize:this.getElementMediaSize,gapX:this.gapX,gapY:this.gapY,noMenuTab:s});this.categoryItemsClassName&&n.elements.items.classList.add(this.categoryItemsClassName);const a=n.elements.container;return a.classList.add("hide"),n.set=e,this.categories[e.id]=n,this.categoriesMap.set(a,n),!s&&this.categoriesByMenuTabMap.set(n.elements.menuTab,n),this.categoriesIntersector.observe(a),!s&&this.menuOnClickResult.stickyIntersector.observeStickyHeaderChanges(a),i||!s&&n.elements.menuTab.classList.add("not-local"),n}positionCategory(e,t){const{menuTab:i,container:s}=e.elements,n=t?this.localCategories.filter((e=>e.mounted)).length:65535;let a=!1;const o=t?this.localCategories.filter((e=>e.menuScroll&&!a?(a=!0,!0):e.mounted&&!e.menuScroll&&e.elements.menuTab)).length:65535;(0,y.Z)(s,this.scrollable.container,n),(0,y.Z)(i,this.menu,o)}isCategoryVisible(e){return this.categoriesIntersector.getVisible().includes(e.elements.container)}toggleLocalCategory(e,t){var i;if(t){const t=this.localCategories.indexOf(e),i=this.localCategories.slice(0,t);let s=0,n=0;i.forEach((e=>{e.mounted?e.elements.menuTab&&!e.menuScroll||++n:(++s,++n)}));const a=t-s,o=t-n;e.elements.menuTab&&(0,y.Z)(e.elements.menuTab,this.menu,o),(0,y.Z)(e.elements.container,this.scrollable.container,a)}else null===(i=e.elements.menuTab)||void 0===i||i.remove(),e.elements.container.remove();e.mounted=t}createLocalCategory(e,t,i,s){const n=this.createCategory({id:e},t&&(0,o.ag)(t),!0,s);return n.local=!0,this.localCategories.push(n),n.elements.title&&n.elements.title.classList.add("disable-hover"),s||(i&&n.elements.menuTab.classList.add("tgico","tgico-"+i),n.elements.menuTabPadding.remove()),this.toggleLocalCategory(n,!1),n}onLocalCategoryUpdate(e){e.setCategoryItemsHeight(),this.toggleLocalCategory(e,!!e.items.length)}deleteCategory(e){return!!e&&(e.elements.container.remove(),e.elements.menuTab.remove(),this.categoriesIntersector.unobserve(e.elements.container),delete this.categories[e.id],this.categoriesMap.delete(e.elements.container),this.categoriesByMenuTabMap.delete(e.elements.menuTab),!0)}spliceExceed(e){if(void 0===e.limit)return!1;const{items:t,limit:i}=e;return t.splice(i,t.length-i).forEach((({element:e})=>{e.remove()})),this.onLocalCategoryUpdate(e),!0}init(){this.listenerSetter.add(s.ZP)("closed",(()=>{this.postponedEvents.forEach((({cb:e,args:t})=>{e(...t)})),this.postponedEvents.length=0}))}destroy(){var e,t,i,s;this.getContainerSize=void 0,this.postponedEvents.length=0,null===(e=this.categoriesIntersector)||void 0===e||e.disconnect(),this.listenerSetter.removeAll(),this.scrollable.destroy(),null===(t=this.menuScroll)||void 0===t||t.destroy(),null===(s=null===(i=this.menuOnClickResult)||void 0===i?void 0:i.stickyIntersector)||void 0===s||s.disconnect()}}class F extends _{constructor(e){super(e,"super-stickers",(()=>a.Z.active.esgSticker),6,4,4),this.onCategoryVisibility=({target:e,visible:t,entry:i})=>{const s=this.categoriesMap.get(e);s.elements.items.replaceChildren(...t?s.items.map((({element:e})=>e)):[])},this.setTyping=(e=!1)=>{(e||s.ZP.isActive()&&s.ZP.tab===this)&&d.Z.dispatchEvent("choosing_sticker",!e)},this.container.classList.add("stickers-padding"),this.content.id="content-stickers"}setFavedLimit(e){this.categories.faved.limit=e}categoryAppendStickers(e,t){const{container:i}=e.elements;t.then((t=>{const s=this.isCategoryVisible(e);t.forEach((t=>{const i=this.superStickerRenderer.renderSticker(t);e.items.push({document:t,element:i}),s&&e.elements.items.append(i)})),e.setCategoryItemsHeight(),i.classList.remove("hide")}))}renderStickerSet(e,t=!1){return T(this,void 0,void 0,(function*(){const i=this.createCategory(e,(0,r.Z)(e.title)),{menuTabPadding:n}=i.elements,a=this.managers.appStickersManager.getStickerSet(e);this.categoryAppendStickers(i,a.then((e=>e.documents))),this.positionCategory(i,t),(0,k.Z)({set:e,container:n,group:s.Yd,lazyLoadQueue:s.Jo.lazyLoadQueue,width:32,height:32,autoplay:!1})}))}init(){super.init(),this.scrollable.onAdditionalScroll=()=>{this.setTyping()};const e={root:s.ZP.getElement()};this.categoriesIntersector=new u.Z(this.onCategoryVisibility,e);const t=e=>{e.elements.items.replaceChildren(),e.items.forEach((({element:e})=>this.superStickerRenderer.unobserveAnimated(e))),e.items.length=0};this.scrollable.container.addEventListener("click",(e=>{const t=e.target;if((0,n.Z)(t,"category-title")){const e=(0,n.Z)(t,"emoji-category"),i=this.categoriesMap.get(e);if(i.local)return;new m.Z({id:i.set.id,access_hash:i.set.access_hash}).show()}else s.Jo.onMediaClick(e)})),this.menuOnClickResult=s.Jo.menuOnClick(this,this.menu,this.scrollable,this.menuScroll);const i=(0,f.y)(this.content,!0),o=(e,t)=>{e.limit&&(t=t.slice(0,e.limit));const i=new Set(t.map((e=>e.id)));(0,I.Z)(e.items,(t=>{i.has(t.document.id)||this.deleteSticker(e,t.document,!0)})),this.toggleLocalCategory(e,!!t.length),(0,I.Z)(t,((t,i)=>{this.unshiftSticker(e,t,!0,i)})),this.spliceExceed(e),e.elements.container.classList.remove("hide")},r=this.createLocalCategory("faved","FavoriteStickers","savedmessages"),l=this.createLocalCategory("recent","Stickers.Recent","recent");l.limit=20;const c=(0,S.Z)("close",{noRipple:!0});l.elements.title.append(c),(0,b.fc)(c,(()=>{(0,C.Z)({titleLangKey:"ClearRecentStickersAlertTitle",descriptionLangKey:"ClearRecentStickersAlertMessage",button:{langKey:"Clear"}}).then((()=>{this.managers.appStickersManager.clearRecentStickers()}),w.Z)}));const h=this.createLocalCategory("premium","PremiumStickersShort"),p=document.createElement("span");p.classList.add("tgico-star","color-premium"),h.elements.menuTab.append(p);const g=[Promise.all([this.managers.apiManager.getLimit("favedStickers"),this.managers.appStickersManager.getFavedStickersStickers()]).then((([e,t])=>{this.setFavedLimit(e),o(r,t)})),this.managers.appStickersManager.getRecentStickersStickers().then((e=>{o(l,e)})),this.managers.appStickersManager.getAllStickers().then((e=>{for(const t of e.sets)this.renderStickerSet(t)})),this.managers.appStickersManager.getPremiumStickers().then((e=>{const t=e.length;this.toggleLocalCategory(h,d.Z.premium&&!!t),this.categoryAppendStickers(h,Promise.resolve(e)),d.Z.addEventListener("premium_toggle",(e=>{this.toggleLocalCategory(this.categories.premium,e&&!!t)}))}))];Promise.race(g).finally((()=>{i.remove()})),Promise.all(g).finally((()=>{this.mounted=!0,this.setTyping();const e=this.categories.faved,t=this.categories.recent;this.menuOnClickResult.setActive(e.items.length?e:t),d.Z.addEventListener("stickers_installed",(e=>{this.categories[e.id]||this.renderStickerSet(e,!0)}))})),this.superStickerRenderer=new x(s.Jo.lazyLoadQueue,s.Yd,this.managers,e);const v=this.superStickerRenderer.lazyLoadQueue;s.ZP.addLazyLoadQueueRepeat(v,this.superStickerRenderer.processInvisible),d.Z.addEventListener("sticker_updated",(({type:e,document:t,faved:i})=>{const s=this.categories["faved"===e?"faved":"recent"];s&&(i?this.unshiftSticker(s,t):this.deleteSticker(s,t))})),d.Z.addEventListener("stickers_deleted",(({id:e})=>{const i=this.categories[e];this.deleteCategory(i)&&t(i)})),d.Z.addEventListener("stickers_top",this.postponedEvent((e=>{const t=this.categories[e];t&&(this.positionCategory(t,!0),s.ZP.addEventListener("openAfterLayout",(()=>{this.menuOnClickResult.setActiveStatic(t)}),{once:!0}))}))),d.Z.addEventListener("stickers_updated",(({type:e,stickers:t})=>{const i=this.categories["faved"===e?"faved":"recent"];i&&o(i,t)})),d.Z.addEventListener("app_config",(()=>{this.managers.apiManager.getLimit("favedStickers").then((e=>{this.setFavedLimit(e)}))})),a.Z.addEventListener("resize",this.resizeCategories),(0,M.Z)({listenTo:this.content,listenerSetter:new P.Z});const y="menu";(0,L.Z)({listenTo:this.content,verifyRecent:e=>!!(0,E.Z)(e,this.categories.recent.elements.items),onOpen:()=>{s.ZP.setIgnoreMouseOut(y,!0)},onClose:()=>{s.ZP.setIgnoreMouseOut(y,!1)}}),this.init=null}deleteSticker(e,t,i){const s=(0,v.Z)(e.items,(e=>e.document.id===t.id));s&&(s.element.remove(),i||this.onLocalCategoryUpdate(e))}unshiftSticker(e,t,i,s){if(void 0!==s){const i=e.items[s];if(i&&i.document.id===t.id)return}let n=(0,v.Z)(e.items,(e=>e.document.id===t.id));n||(n={element:this.superStickerRenderer.renderSticker(t),document:t}),e.items.unshift(n),e.elements.items.prepend(n.element),i||this.spliceExceed(e)}unshiftRecentSticker(e){this.managers.appStickersManager.saveRecentSticker(e.id)}deleteRecentSticker(e){this.managers.appStickersManager.saveRecentSticker(e.id,!0)}onClosed(){this.setTyping(!0)}onOpened(){this.setTyping(),this.resizeCategories()}}},36:(e,t,i)=>{"use strict";i.d(t,{G:()=>s});const s=()=>{const e=document.createElement("div");return e.classList.add("gradient-delimiter"),e}},5948:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2325);function n(e){const t=document.createElement("span");return t.classList.add("badge-fake"),(0,s.$d)(t,e?"ScamMessage":"FakeMessage"),t}},1080:(e,t,i)=>{"use strict";i.d(t,{Z:()=>f});var s=i(5814),n=i(3725),a=i(3035),o=i(3512),r=i(8847),d=i(7009),l=i(2940);class c extends d.Z{constructor(e,t){super(e),this.onVisibilityChange=t,this.intersector=new l.Z((e=>{const{target:t,visible:i}=e,s=(0,r.Z)(this.queue,(e=>e.div===t));i&&s.length&&s.forEach((e=>{this.queue.unshift(e)})),this.onVisibilityChange&&this.onVisibilityChange(e),this.setProcessQueueTimeout()}))}observe(e){super.observe(e)}}var h=i(2887),u=i(319),p=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class f{constructor(e,t,i,r=!0){this.element=e,this.group=t,this.scrollable=i,this.scrollPromise=Promise.resolve(),this.timeout=0,this.onScroll=()=>{this.timeout?clearTimeout(this.timeout):this.scrollPromise=(0,n.Z)(),this.timeout=window.setTimeout((()=>{this.timeout=0,this.scrollPromise.resolve()}),150)},this.processInvisibleDiv=e=>this.scrollPromise.then((()=>p(this,void 0,void 0,(function*(){if(this.lazyLoadQueue.intersector.isVisible(e))return;const t=e.querySelector("video"),i=e.querySelector("img, canvas");i&&(i.classList.remove("hide"),yield(0,a.d1)()),!this.lazyLoadQueue.intersector.isVisible(e)&&t&&(t.remove(),t.src="",t.load(),s.Z.getAnimations(t).forEach((e=>{s.Z.removeAnimation(e)})))})))),this.managers=o.Z.managers,this.lazyLoadQueue=new c(void 0,(({target:e,visible:t})=>{t?this.processVisibleDiv(e):this.processInvisibleDiv(e)})),r&&this.attach()}attach(){this.scrollable.container.addEventListener("scroll",this.onScroll)}detach(){this.clear(),this.scrollable.container.removeEventListener("scroll",this.onScroll)}clear(){this.lazyLoadQueue.clear()}processVisibleDiv(e){e.querySelector("video")||this.lazyLoadQueue.push({div:e,load:()=>{const t=e.dataset.docId;return Promise.all([this.managers.appDocsManager.getDoc(t),this.scrollPromise]).then((([t])=>p(this,void 0,void 0,(function*(){const i=(yield(0,h.Z)({doc:t,container:e,lazyLoadQueue:null,group:this.group,noInfo:!0,noPreview:!0})).loadPromise;return i.finally((()=>{const t=e.querySelector("video"),i=e.querySelector("img, canvas");i&&i.classList.add("hide"),t&&!t.parentElement&&setTimeout((()=>{t.src="",t.load(),s.Z.getAnimations(t).forEach((e=>{s.Z.removeAnimation(e)}))}),0),this.lazyLoadQueue.intersector.isVisible(e)||this.processInvisibleDiv(e)})),i}))))}})}add(e,t=this.element){const i=document.createElement("div");i.classList.add("gif","grid-item"),i.dataset.docId=""+e.id,t.append(i),this.lazyLoadQueue.observe({div:i,load:u.Z}),(0,h.Z)({doc:e,container:i,lazyLoadQueue:null,noInfo:!0,onlyPreview:!0})}}},6008:(e,t,i)=>{"use strict";i.d(t,{X:()=>c});var s=i(426),n=i(3512),a=i(3035),o=i(4789),r=i(5975),d=i(2648),l=i(2738);function c(e,t,i,c,h=200,u,p){const f=(0,s.Z)({content:t,type:e||"tabs"===t.dataset.animation?"tabs":"navigation",transitionTime:h,onTransitionEnd:c,listenerSetter:p});if(!e)return f;const m=new Proxy(f,{apply:(t,i,s)=>{const n=+s[0],a=void 0===s[1]||s[1],o=e.querySelector(`[data-tab="${n}"]`)||e.children[n];g(o,n,a)}}),g=(s,r,d=!0)=>{return l=this,c=void 0,m=function*(){const l=t.children[r];if(i){const e=i(r,l,d),t=e instanceof Promise?yield e:e;if(void 0!==t&&!t)return}u&&u.scrollIntoViewNew({element:s.parentElement.children[r],position:"center",forceDirection:d?void 0:o.f.Static,forceDuration:h,axis:"x"}),n.Z.settings.animationsEnabled||(d=!1);const c=f.prevId();if(s.classList.contains("active")||r===c)return!1;const p=d?a.T2:e=>e(),m=e.querySelector(b.toLowerCase()+".active");m&&p((()=>{m.classList.remove("active")})),v&&-1!==c&&d&&p((()=>{const e=s.querySelector("i"),t=s.parentElement.children[c].querySelector("i");t.classList.remove("animate"),e.classList.remove("animate");const i=t.parentElement.parentElement.offsetLeft-e.parentElement.parentElement.offsetLeft,n=t.clientWidth/e.clientWidth;e.style.transform=`translate3d(${i}px, 0, 0) scale3d(${n}, 1, 1)`,(0,a.T2)((()=>{e.classList.add("animate"),e.style.transform="none"}))})),p((()=>{s.classList.add("active")})),f(r,d)},new((p=void 0)||(p=Promise))((function(e,t){function i(e){try{n(m.next(e))}catch(e){t(e)}}function s(e){try{n(m.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof p?n:new p((function(e){e(n)}))).then(i,s)}n((m=m.apply(l,c||[])).next())}));var l,c,p,m},v=!e.classList.contains("no-stripe"),b=e.firstElementChild.tagName;return(0,l.fc)(e,(t=>{let i,s=t.target;if(s=(0,r.Z)(s,e),!s)return!1;if(s.dataset.tab){if(i=+s.dataset.tab,-1===i)return!1}else i=(0,d.Z)(s);g(s,i)}),{listenerSetter:p}),m}},503:(e,t,i)=>{"use strict";i.d(t,{I1:()=>C,ZP:()=>I,rf:()=>w});var s=i(3910),n=i(6669),a=i(1544),o=i(8763),r=i(4668),d=i(3299),l=i(9336),c=i(1293),h=i(5565),u=i(669),p=i(130),f=i(2325),m=i(1507),g=i(6241),v=i(6535),b=i(3066),y=i(5400);function w(e,t,i,o){return r=this,l=void 0,h=function*(){const r=[],l=(null==i?void 0:i.some((e=>"messageEntityCustomEmoji"===e._)))?L():void 0,c=(0,b.Z)(t,{entities:i,wrappingForPeerId:o,loadPromises:r,customEmojiRenderer:l});c.querySelectorAll('[contenteditable="false"]').forEach((e=>{e.contentEditable="inherit",e.classList.add("pc")})),r.length&&(yield Promise.all(r)),c.querySelectorAll(".input-selectable").forEach((e=>{e.prepend((0,y.SZ)(!0))}));const h=u.Y?u.Z.getInstance():void 0,p=Array.from(c.querySelectorAll(".custom-emoji-placeholder")).map((e=>(e.dataset.ces="1",e.customEmojiElement))),f=(0,a.Z)(c);null==l||l.destroy();const m=(0,d.Z)(e);if(m.node);else{const t=document.createRange();let i=e.lastChild;i||e.append(i=document.createTextNode("")),t.setStartAfter(i),t.collapse(!0),m.selection.removeAllRanges(),m.selection.addRange(t)}e.addEventListener("input",s.Z,{capture:!0,once:!0}),null==h||h.onBeforeInput({inputType:"insertContent"}),window.document.execCommand("insertHTML",!1,f),Array.from(e.querySelectorAll("[data-ces]")).forEach(((e,t)=>{delete e.dataset.ces;const i=p[t];e.customEmojiElement=i,i.placeholder=e})),e.querySelectorAll(".pc").forEach((e=>{e.contentEditable="false"})),null==h||h.removeExtraBOMs(e),(0,n.Z)(e,"input")},new((c=void 0)||(c=Promise))((function(e,t){function i(e){try{n(h.next(e))}catch(e){t(e)}}function s(e){try{n(h.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof c?n:new c((function(e){e(n)}))).then(i,s)}n((h=h.apply(r,l||[])).next())}));var r,l,c,h}let S=()=>{document.addEventListener("paste",(e=>{const t=(0,o.Z)(e.target,'contenteditable="true"');if(!t)return;const i=!!t.dataset.noLinebreaks;let s,n;e.preventDefault();let a=(e.originalEvent||e).clipboardData.getData("text/plain"),r=!0,d=(e.originalEvent||e).clipboardData.getData("text/html");const c=e=>"messageEntityEmoji"===e._||"messageEntityLinebreak"===e._&&!i;if(i){const e=/[\r\n]/g;a=a.replace(e,""),d=d.replace(e,"")}const h=(t.dataset.peerId||m.NM).toPeerId();if(d.trim()){d=d.replace(//,""),d=d.replace(//,""),d=d.replace('
',"");const e=d.match(/([\s\S]*)<\/body>/);e&&(d=e[1].trim());const t=(new DOMParser).parseFromString(d,"text/html").body||document.createElement("body");let i=t.firstChild;for(;i;){const e=i.nextSibling;i.nodeType===i.TEXT_NODE&&(i.nodeValue.trim()||i.remove()),i=e}const o=(0,l.Z)(t,!0,!1);h||(o.entities=o.entities.filter((e=>"messageEntityCustomEmoji"!==e._)));{const e=o.value.split("\n");let t=0;for(let i=0;i"messageEntityCustomEmoji"===e._))){s=o.value,n=o.entities,r=!1;let e=(0,v.Z)(s);e=e.filter(c),(0,g.Z)(n,e)}}r&&(s=a,n=(0,v.Z)(s),n=n.filter(c)),w(t,s,n,h)})),S=null};var C;function L(){return y.KZ.create({wrappingDraft:!0,isSelectable:!0})}function E(e){const t=Array.from(e.querySelectorAll(".custom-emoji, .custom-emoji-placeholder"));let i=e.querySelector(".custom-emoji-renderer");if(!i&&t.length)i=L(),e.prepend(i);else if(i&&!t.length)return void i.remove();if(!i)return;const s=new Map;t.forEach((e=>{const t=e instanceof y.LD?e:e.customEmojiElement,{docId:i}=t;let n=s.get(i);n||s.set(i,n=new Set),n.add(t)}));for(const[e,t]of s){let s=i.customEmojis.get(e);if(s)for(const e of s)t.has(e)||e.destroy();else s=new Set;for(const e of t)s.has(e)||e.connectedCallback()}i.add(s,!1),i.forceRender()}!function(e){e[e.Neutral=0]="Neutral",e[e.Valid=1]="Valid",e[e.Error=2]="Error"}(C||(C={}));class I{constructor(e={}){this.options=e,this.container=document.createElement("div"),this.container.classList.add("input-field"),this.required=e.required,this.validate=e.validate,void 0!==e.maxLength&&void 0===e.showLengthOn&&(e.showLengthOn=Math.min(40,Math.round(e.maxLength/3)));const{placeholder:t,maxLength:i,showLengthOn:s,name:n,plainText:a,canBeEdited:o=!0,autocomplete:d}=e,h=e.label||e.labelText,m=[];let g;if(a?(this.container.innerHTML=`\n \n `,g=this.container.firstElementChild):(S&&S(),this.container.innerHTML='
',g=this.container.firstElementChild,g.contentEditable=""+!!o,u.Z.getInstance(),g.addEventListener("mousedown",(e=>{var t;const i=document.getSelection();if(!i.isCollapsed)return;const s=(0,r.Z)(e.target,"IMG");if(!s)return;const n=s.getBoundingClientRect(),a=n.left+n.width/2,o=e.clientX>=a,d=document.createRange();d.setStartAfter(o?s:null!==(t=s.previousSibling)&&void 0!==t?t:s),i.removeAllRanges(),i.addRange(d)})),m.push((()=>{(0,c.Z)(g)&&g.replaceChildren(),u.Y&&Array.from(g.querySelectorAll("br:not(.br-not-br)")).forEach((e=>{e.remove()})),(0,y.Cx)(Array.from(g.querySelectorAll(".input-something"))),E(g)}))),(0,p.m)(g),e.inputMode&&(g.inputMode=e.inputMode),t&&(0,f.$d)(g,t,void 0,"placeholder"),h||t){const e=document.createElement("div");e.classList.add("input-field-border"),this.container.append(e)}if(h&&(this.label=document.createElement("label"),this.setLabel(),this.container.append(this.label)),i){const e=this.container.lastElementChild;let t=!1;const n=()=>{const n=g.classList.contains("error"),o=a?g.value.length:[...(0,l.Z)(g,!1,!1).value].length,r=i-o,d=r<0;g.classList.toggle("error",d),d||r<=s?(this.setLabel(),e.append(` (${i-o})`),t||(t=!0)):(n&&!d||t)&&(this.setLabel(),t=!1)};m.push(n)}!e.withLinebreaks&&!a&&(g.dataset.noLinebreaks="1",g.addEventListener("keypress",(e=>{if("Enter"===e.key)return e.preventDefault(),!1}))),m.length&&g.addEventListener("input",(()=>{m.forEach((e=>e()))})),this.input=g}select(){this.value&&(this.options.plainText?this.input.select():function(e){const t=document.createRange();t.selectNodeContents(e);const i=window.getSelection();i.removeAllRanges(),i.addRange(t)}(this.input))}setLabel(){this.label.textContent="",this.options.labelText?(0,p.Z)(this.label,this.options.labelText):this.label.append((0,f.ag)(this.options.label,this.options.labelOptions))}get value(){return this.options.plainText?this.input.value:(0,l.Z)(this.input,!1,!1).value}set value(e){this.setValueSilently(e,!0),this.simulateInputEvent()}simulateInputEvent(){(0,n.Z)(this.input,"input")}setValueSilently(e,t){this.options.plainText?this.input.value=e:((0,h.Z)(this.input,e),E(this.input))}isChanged(){return this.value!==this.originalValue}isValid(){return!this.input.classList.contains("error")&&(!this.validate||this.validate())&&(!this.required||!(0,c.Z)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(e="",t){this.options.plainText||(e=(0,a.Z)((0,b.Z)(e))),t?this.setValueSilently(e,!1):this.value=e}setOriginalValue(e="",t){this.originalValue=e,this.setDraftValue(e,t)}setState(e,t){t?(this.label.textContent="",this.label.append((0,f.ag)(t,this.options.labelOptions))):this.setLabel(),this.input.classList.toggle("error",!!(e&C.Error)),this.input.classList.toggle("valid",!!(e&C.Valid))}setError(e){this.setState(C.Error,e)}}},3607:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(503);class n{constructor(e,t){this.prevValue="",this.timeout=0,this.onInput=()=>{if(!this.onChange)return;const e=this.value;e!==this.prevValue&&(this.prevValue=e,clearTimeout(this.timeout),this.timeout=window.setTimeout((()=>{this.onChange(e)}),200))},this.onClearClick=()=>{this.value="",this.onChange&&this.onChange(""),this.onClear&&this.onClear()},this.inputField=new s.ZP({placeholder:e,plainText:!0}),this.container=this.inputField.container,this.container.classList.remove("input-field"),this.container.classList.add("input-search"),this.onChange=t,this.input=this.inputField.input,this.input.classList.add("input-search-input");const i=document.createElement("i");i.classList.add("tgico","tgico-search"),this.clearBtn=document.createElement("i"),this.clearBtn.classList.add("tgico","btn-icon","tgico-close"),this.input.addEventListener("input",this.onInput),this.clearBtn.addEventListener("click",this.onClearClick),this.container.append(i,this.clearBtn)}get value(){return this.inputField.value}set value(e){this.prevValue=e,clearTimeout(this.timeout),this.inputField.value=e}remove(){clearTimeout(this.timeout),this.input.removeEventListener("input",this.onInput),this.clearBtn.removeEventListener("click",this.onClearClick)}}},2153:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(2940),n=i(8847),a=i(4064),o=i(7009),r=i(8594);class d extends o.Z{constructor(e,t){super(e),this.onVisibilityChange=({target:e,visible:t})=>{(0,n.Z)(this.queue,(t=>t.div===e)).forEach((e=>{t&&(e.wasSeen=!0),e.visible=t;const i=this.queue.findIndex((e=>!e.visible));this.queue.splice(Math.max(0,i),0,e)})),this.setProcessQueueTimeout()},this.intersector=new s.Z(this.onVisibilityChange),!t&&(0,r.ZP)((()=>{this.lock()}),(()=>{this.unlockAndRefresh()}))}getItem(){return(0,a.Z)(this.queue,(e=>e.wasSeen))}processItem(e){const t=Object.create(null,{processItem:{get:()=>super.processItem}});return i=this,s=void 0,a=function*(){yield t.processItem.call(this,e),this.intersector.unobserve(e.div)},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}addElement(e,t){var i;return!!super.addElement(e,t)&&(this.observe(t),null!==(i=t.wasSeen)&&void 0!==i||(t.wasSeen=!1),!0)}}},7009:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8847),n=i(4421);class a extends n.Z{constructor(e){super(e),this.queue=[],this.inProcess=new Set}lock(){super.lock(),this.intersector.lock()}unlock(){super.unlock(),this.intersector.unlock()}unlockAndRefresh(){super.unlock(),this.intersector.unlockAndRefresh()}clear(){super.clear(),this.intersector.disconnect()}refresh(){this.intersector.refresh()}loadItem(e){return e.load(e.div)}addElement(e,t){if(this.queue.find((e=>e.div===t.div&&e.load===t.load)))return!1;for(const e of this.inProcess)if(e.div===t.div&&e.load===t.load)return!1;return this.queue[e](t),!0}setProcessQueueTimeout(){var e;null!==(e=this.intersectorTimeout)&&void 0!==e||(this.intersectorTimeout=window.setTimeout((()=>{this.intersectorTimeout=void 0,this.processQueue()}),0))}push(e){super.push(e)}unshift(e){super.unshift(e)}delete(e){(0,s.Z)(this.queue,(t=>t.div===e.div)),this.unobserve(e)}observe(e){this.intersector.observe(e.div)}unobserve(e){this.intersector.unobserve(e.div)}}},7207:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3013),n=i(65);class a extends n.Z{constructor(e,t,i,s){super({step:1e3/60/1e3,min:0,max:1,withTransition:i,useTransform:s},0),this.progressRAF=0,this.onLoadedData=()=>{this.max=this.media.duration,this.seek.setAttribute("max",""+this.max)},this.onEnded=()=>{this.setProgress()},this.onPlay=()=>{const e=()=>{this.setProgress(),this.progressRAF=this.media.paused?0:window.requestAnimationFrame(e)};this.progressRAF&&window.cancelAnimationFrame(this.progressRAF),this.streamable&&this.setLoadProgress(),this.progressRAF=window.requestAnimationFrame(e)},this.onTimeUpdate=()=>{this.media.paused&&(this.setProgress(),this.streamable&&this.setLoadProgress())},this.onProgress=e=>{this.setLoadProgress()},e&&this.setMedia(e,t)}setMedia(e,t=!1){this.media&&this.removeListeners(),t&&!this.filledLoad?(this.filledLoad=document.createElement("div"),this.filledLoad.classList.add("progress-line__filled","progress-line__loaded"),this.container.prepend(this.filledLoad)):this.filledLoad&&this.filledLoad.classList.toggle("hide",!t),this.media=e,this.streamable=t,(!e.paused||e.currentTime>0)&&this.onPlay();let i=!1;this.setSeekMax(),this.setListeners(),this.setHandlers({onMouseDown:()=>{i=!this.media.paused,i&&this.media.pause()},onMouseUp:e=>{i&&this.media.play()}})}scrub(e){const t=super.scrub(e);return this.media.currentTime=t,t}setLoadProgress(){if(s.Z.isSafariBuffering(this.media))return;const e=this.media.buffered,t=e.length,i=this.media.currentTime;let n=0,a=0;for(let s=0;s=t&&t>=n&&(n=t,a=e.end(s))}const o=this.media.duration?a/this.media.duration:0;this.filledLoad.style.width=100*o+"%"}setSeekMax(){this.max=this.media.duration||0,this.max>0?this.onLoadedData():this.media.addEventListener("loadeddata",this.onLoadedData)}setProgress(){if(s.Z.isSafariBuffering(this.media))return;const e=this.media.currentTime;super.setProgress(e)}setListeners(){super.setListeners(),this.media.addEventListener("ended",this.onEnded),this.media.addEventListener("play",this.onPlay),this.media.addEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.addEventListener("progress",this.onProgress)}removeListeners(){super.removeListeners(),this.media&&(this.media.removeEventListener("loadeddata",this.onLoadedData),this.media.removeEventListener("ended",this.onEnded),this.media.removeEventListener("play",this.onPlay),this.media.removeEventListener("timeupdate",this.onTimeUpdate),this.streamable&&this.media.removeEventListener("progress",this.onProgress)),this.progressRAF&&(window.cancelAnimationFrame(this.progressRAF),this.progressRAF=0)}}},3251:(e,t,i)=>{"use strict";i.d(t,{I:()=>f});var s=i(3189),n=i(8097),a=i(4755),o=i(3228),r=i(3035);const d=new Map,l=new Set;let c=!1;function h(){c||(c=!0,(0,r.T2)((()=>{c=!1,l.forEach(p),l.clear()})))}function u(e){const t=e.dataset.sizeType;return t?a.Z.active[t].width:e.getBoundingClientRect().width}function p(e){let t=d.get(e);const i=!t;let{text:a,textLength:r,from:l,multiplier:c,font:h,textWidth:p,elementWidth:f}=t||{};if(i){a=e.textContent,r=a.length,l=50,c=l>0&&l/100;let i=e.dataset.fontSize;i&&+i&&(i+="px"),h=`${e.dataset.fontWeight||s.U9} ${i||s.Bf} ${s.bt}`,p=(0,n.Z)(a,h),f=u(e),t={text:a,textLength:r,from:l,multiplier:c,font:h,textWidth:p,elementWidth:f},d.set(e,t)}const m=u(e),g=i||f!==m;if(!i&&g&&(t.elementWidth=f=m),g)if(p>f){e.setAttribute("title",a);let i=a,s=f;for(;i.length>3;){const t=i.length,a=c&&(0,o.Z)(c*t<<0,1,t-2)||Math.max(t+l-1,1),r=i.substr(0,a).replace(/\s*$/,""),d=i.substr(a+1).replace(/^\s*/,"");if(i=r+d,s=(0,n.Z)(i+"…",h),s{for(const[e]of d)l.add(e);h()}),{capture:!0,passive:!0});class f extends HTMLElement{connectedCallback(){d.set(this,null),this.dataset.sizeType?p(this):(l.add(this),h())}disconnectedCallback(){d.delete(this),l.delete(this)}}customElements.define("middle-ellipsis-element",f)},4425:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1447);class n{constructor(e,t){this.passwordInputField=e,this.size=t,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper")}load(){return this.loadPromise?this.loadPromise:this.loadPromise=s.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size,noCache:!0},"TwoFactorSetupMonkeyPeek").then((e=>(this.animation=e,this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause())})),this.passwordInputField.helpers.onVisibilityClickAdditional=()=>{this.passwordInputField.helpers.passwordVisible?(this.animation.setDirection(1),this.animation.curFrame=0,this.needFrame=16,this.animation.play()):(this.animation.setDirection(-1),this.animation.curFrame=16,this.needFrame=0,this.animation.play())},s.Z.waitForFirstFrame(e))))}remove(){this.animation&&this.animation.remove()}}},3083:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1447);class n{constructor(e,t){this.inputField=e,this.size=t,this.max=45,this.needFrame=0,this.container=document.createElement("div"),this.container.classList.add("media-sticker-wrapper");const i=e.input;i.addEventListener("blur",(()=>{this.playAnimation(0)})),i.addEventListener("input",(t=>{this.playAnimation(e.value.length)}))}playAnimation(e){if(!this.animation)return;let t;(e=Math.min(e,30))?(t=Math.round(Math.min(this.max,e)*(165/this.max)+11.33),this.idleAnimation&&(this.idleAnimation.stop(!0),this.idleAnimation.canvas[0].style.display="none"),this.animation.canvas[0].style.display=""):t=0;const i=this.needFrame>t?-1:1;this.animation.setDirection(i),0!==this.needFrame&&0===t&&this.animation.setSpeed(7),this.needFrame=t,this.animation.play()}load(){return this.loadPromise?this.loadPromise:this.loadPromise=Promise.all([s.Z.loadAnimationAsAsset({container:this.container,loop:!0,autoplay:!0,width:this.size,height:this.size},"TwoFactorSetupMonkeyIdle").then((e=>(this.idleAnimation=e,this.inputField.value.length||e.play(),s.Z.waitForFirstFrame(e)))),s.Z.loadAnimationAsAsset({container:this.container,loop:!1,autoplay:!1,width:this.size,height:this.size},"TwoFactorSetupMonkeyTracking").then((e=>(this.animation=e,this.inputField.value.length||(this.animation.canvas[0].style.display="none"),this.animation.addEventListener("enterFrame",(e=>{(1===this.animation.direction&&e>=this.needFrame||-1===this.animation.direction&&e<=this.needFrame)&&(this.animation.setSpeed(1),this.animation.pause()),0===e&&0===this.needFrame&&this.idleAnimation&&(this.idleAnimation.canvas[0].style.display="",this.idleAnimation.play(),this.animation.canvas[0].style.display="none")})),s.Z.waitForFirstFrame(e))))])}remove(){this.animation&&this.animation.remove(),this.idleAnimation&&this.idleAnimation.remove()}}},6830:(e,t,i)=>{"use strict";i.d(t,{T:()=>a,Z:()=>o});var s=i(3910),n=i(503);class a{constructor(e,t){this.container=e,this.input=t,this.passwordVisible=!1,this.onVisibilityClick=e=>{(0,s.Z)(e),this.passwordVisible=!this.passwordVisible,this.toggleVisible.classList.toggle("eye-hidden",this.passwordVisible),this.input.type=this.passwordVisible?"text":"password",this.onVisibilityClickAdditional&&this.onVisibilityClickAdditional()},t.type="password",t.setAttribute("required",""),t.name="notsearch_password",t.autocomplete="off";const i=document.createElement("input");i.classList.add("stealthy"),i.tabIndex=-1,i.type="password",t.parentElement.prepend(i),t.parentElement.insertBefore(i.cloneNode(),t.nextSibling);const n=this.toggleVisible=document.createElement("span");n.classList.add("toggle-visible","tgico"),e.classList.add("input-field-password"),e.append(n),n.addEventListener("click",this.onVisibilityClick),n.addEventListener("touchend",this.onVisibilityClick)}}class o extends n.ZP{constructor(e={}){super(Object.assign({plainText:!0},e)),this.helpers=new a(this.container,this.input)}}},8261:(e,t,i)=>{"use strict";i.d(t,{Z:()=>G});var s=i(2365),n=i(3725),a=i(2166),o=i(3532),r=i(2738),d=i(5565),l=i(130),c=i(3699),h=i(5471),u=i(9405),p=i(3624),f=i(8631),m=i(4271),g=i(2790),v=i(5102),b=i(2325),y=i(5400),w=i(3512),S=i(9331),C=i(9807),L=i(36),E=i(5432),I=i(4064),M=i(3910),P=i(1708),Z=i(6074),k=i(3035),T=i(7030),x=i(9931),A=i(3757),_=i(9492),F=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class D{constructor(e,t){this.scrollable=e,this.managers=t,this.processItem=e=>F(this,void 0,void 0,(function*(){const t=document.createElement("div");let i;t.classList.add(D.BASE_CLASS+"-avatar","media-container","hide"),this.avatars.append(t),e&&(i="object"!=typeof e?yield this.managers.appPhotosManager.getPhoto(e):e.action.photo);const s=new Image;s.classList.add("avatar-photo"),s.draggable=!1;const n=()=>F(this,void 0,void 0,(function*(){if(i){const e=yield(0,_.Z)({container:t,photo:i,size:(0,T.Z)(i,420,420,!1),withoutPreloader:!0});[e.images.thumb,e.images.full].filter(Boolean).forEach((e=>{e.classList.add("avatar-photo")}))}else{const e=yield this.managers.appPeersManager.getPeerPhoto(this.peerId);yield(0,x.Y)(t,this.peerId,e,"photo_big",s)}t.classList.remove("hide")}));return this.avatars.childElementCount<=3?yield n():(this.intersectionObserver.observe(t),this.loadCallbacks.set(t,n)),this.addTab(),e})),this.container=document.createElement("div"),this.container.classList.add(D.BASE_CLASS+"-container"),this.avatars=document.createElement("div"),this.avatars.classList.add(D.BASE_CLASS+"-avatars"),this.gradient=document.createElement("div"),this.gradient.classList.add(D.BASE_CLASS+"-gradient"),this.info=document.createElement("div"),this.info.classList.add(D.BASE_CLASS+"-info"),this.tabs=document.createElement("div"),this.tabs.classList.add(D.BASE_CLASS+"-tabs"),this.arrowPrevious=document.createElement("div"),this.arrowPrevious.classList.add(D.BASE_CLASS+"-arrow","tgico-avatarprevious"),this.arrowNext=document.createElement("div"),this.arrowNext.classList.add(D.BASE_CLASS+"-arrow",D.BASE_CLASS+"-arrow-next","tgico-avatarnext"),this.container.append(this.avatars,this.gradient,this.info,this.tabs,this.arrowPrevious,this.arrowNext),this.loadCallbacks=new Map,this.listenerSetter=new c.Z;const i=()=>0===this.scrollable.scrollTop||(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),!1),s=1/3;let n=!1,a=!1;(0,r.fc)(this.container,(e=>F(this,void 0,void 0,(function*(){if(a)return void(0,M.Z)(e);if(n)return void(n=!1);if(!i())return;const t=this.container.getBoundingClientRect(),o=e.pageX,r=o-t.left;if(!this.listLoader.previous.length&&!this.listLoader.next.length||r>t.width*s&&r{t.push({element:this.avatars.children[i],item:e})}));const i=t.slice(0,this.listLoader.previous.length),s=t.slice(this.listLoader.previous.length+1),n=this.avatars.children[this.listLoader.previous.length];a=!0,(0,S.C)(n,e,(()=>e===this.peerId),this.listLoader.current,i,s),a=!1}else{const e=o>t.right-t.width/2;let i;this.avatars.classList.add("no-transition"),this.avatars.offsetLeft,i=0!==this.listLoader.index||e?this.listLoader.index===this.listLoader.count-1&&e?-(this.listLoader.count-1):e?1:-1:this.listLoader.count-1,this.listLoader.go(i),(0,k.T2)((()=>{this.avatars.classList.remove("no-transition")}))}}))),{listenerSetter:this.listenerSetter});const o=()=>{n=!0,document.body.addEventListener(E.Z?"touchend":"click",(e=>{n=!1}),{once:!0})};let d=0,l=0,h=0,u=0;this.swipeHandler=new A.Z({element:this.avatars,onSwipe:(e,t)=>{h=e*=-1;let i=l+e*-D.SCALE;return i>0?i=0:ii()?!this.container.classList.contains("is-single")&&!a:(o(),(0,M.Z)(e),!1),onFirstSwipe:()=>{const e=this.avatars.getBoundingClientRect();d=e.width,u=-d*(this.tabs.childElementCount-1),l=e.left-this.container.getBoundingClientRect().left,this.avatars.style.transform=D.TRANSLATE_TEMPLATE.replace("{x}",l+"px"),this.container.classList.add("is-swiping"),this.avatars.classList.add("no-transition"),this.avatars.offsetLeft},onReset:()=>{const e=Math.ceil(Math.abs(h)/(d/D.SCALE))*(h>=0?1:-1);o(),this.avatars.classList.remove("no-transition"),(0,k.T2)((()=>{this.listLoader.go(e),this.container.classList.remove("is-swiping")}))}}),this.intersectionObserver=new IntersectionObserver((e=>{e.forEach((e=>{e.isIntersecting&&this.loadNearestToTarget(e.target)}))}))}setPeer(e){return F(this,void 0,void 0,(function*(){this.peerId=e;const t=yield this.managers.appPeersManager.getPeerPhoto(e);if(!t)return;const i=this.listLoader=new Z.Z({loadCount:50,loadMore:(t,s,n)=>{if(!s)return Promise.resolve({count:void 0,items:[]});if(e.isUser()){const i=t;return this.managers.appPhotosManager.getUserPhotos(e,i,n).then((e=>({count:e.count,items:e.photos})))}{const t=[];return i.current||t.push(this.managers.appProfileManager.getChatFull(e.toChatId())),t.push(this.managers.appMessagesManager.getSearch({peerId:e,maxId:Number.MAX_SAFE_INTEGER,inputFilter:{_:"inputMessagesFilterChatPhotos"},limit:n,backLimit:0})),Promise.all(t).then((e=>F(this,void 0,void 0,(function*(){const t=e.pop();if((0,P.Z)(t),!i.current){const s=e[0],n=(0,I.Z)(t.history,(e=>e.action.photo.id===s.chat_photo.id));i.current=n||(yield this.managers.appMessagesManager.generateFakeAvatarMessage(this.peerId,s.chat_photo))}return{count:t.count,items:t.history}}))))}},processItem:this.processItem,onJump:(e,t)=>{const i=this.listLoader.index,s=100*D.SCALE*i;this.avatars.style.transform=D.TRANSLATE_TEMPLATE.replace("{x}",`-${s}%`);const n=this.tabs.querySelector(".active");n&&n.classList.remove("active"),this.tabs.children[i].classList.add("active"),this.loadNearestToTarget(this.avatars.children[i])}});"userProfilePhoto"===t._&&(i.current=t.photo_id),yield this.processItem(i.current),i.load(!0)}))}addTab(){const e=document.createElement("div");e.classList.add(D.BASE_CLASS+"-tab"),this.tabs.append(e),1===this.tabs.childElementCount&&e.classList.add("active"),this.container.classList.toggle("is-single",this.tabs.childElementCount<=1)}loadNearestToTarget(e){const t=Array.from(e.parentElement.children),i=t.indexOf(e);t.slice(Math.max(0,i-3),Math.min(t.length,i+3)).forEach((e=>{const t=this.loadCallbacks.get(e);t&&(t(),this.loadCallbacks.delete(e),this.intersectionObserver.unobserve(e))}))}cleanup(){var e;this.listenerSetter.removeAll(),this.swipeHandler.removeListeners(),null===(e=this.intersectionObserver)||void 0===e||e.disconnect()}}D.BASE_CLASS="profile-avatars",D.SCALE=s.Z?2:1,D.TRANSLATE_TEMPLATE=s.Z?`translate3d({x}, 0, -1px) scale(${D.SCALE})`:"translate({x}, 0)";var R=i(7479),B=i(5029),N=i(2796),O=i(8210),U=i(7362),H=i(9102),z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const j=(e,t)=>{(0,l.Z)(t.title,e||""),t.container.style.display=e?"":"none"};class G{constructor(e,t,i,n=!0){this.managers=e,this.scrollable=t,this.listenerSetter=i,this.isDialog=n,s.Z||this.scrollable.container.classList.add("no-parallax"),i||(this.listenerSetter=new c.Z),this.middlewareHelper=(0,p.k)()}init(){this.init=null,this.element=document.createElement("div"),this.element.classList.add("profile-content"),this.section=new B.Z({noDelimiter:!0}),this.name=document.createElement("div"),this.name.classList.add("profile-name"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("profile-subtitle"),this.bio=new R.ZP({title:" ",subtitle:!0,icon:"info",clickable:e=>{"A"!==e.target.tagName&&((0,a.T)(this.bio.title.textContent),(0,N.Am)(b.ZP.format("BioCopied",!0)))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_About",onClick:()=>{(0,r.tH)(this.bio.container)},verify:()=>!this.peerId.isUser()},{icon:"copy",text:"Text.CopyLabel_Bio",onClick:()=>{(0,r.tH)(this.bio.container)},verify:()=>this.peerId.isUser()}]}}),this.bio.title.classList.add("pre-wrap"),this.username=new R.ZP({title:" ",subtitleLangKey:"Username",icon:"username",clickable:()=>{(0,a.T)("@"+this.username.title.textContent),(0,N.Am)(b.ZP.format("UsernameCopied",!0))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_Username",onClick:()=>{(0,r.tH)(this.username.container)}}]}}),this.phone=new R.ZP({title:" ",subtitle:!0,icon:"phone",clickable:()=>{(0,a.T)(this.phone.title.textContent.replace(/\s/g,"")),(0,N.Am)(b.ZP.format("PhoneCopied",!0))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_PhoneNumber",onClick:()=>{(0,r.tH)(this.phone.container)}},{icon:"info",text:"PeerInfo.Phone.AnonymousInfo",textArgs:[document.createElement("a")],onClick:()=>{window.open("https://fragment.com/numbers","_blank")},separator:!0,multiline:!0,verify:()=>z(this,void 0,void 0,(function*(){const{isAnonymous:e}=(yield this.managers.appUsersManager.getUserPhone(this.peerId.toUserId()))||{};return e}))}]}}),this.link=new R.ZP({title:" ",subtitleLangKey:"SetUrlPlaceholder",icon:"link",clickable:()=>{const e=this.link.title.textContent;(0,a.T)(e);const t=e.includes("/c/");(0,N.Am)(b.ZP.format(t?"LinkCopiedPrivateInfo":"LinkCopied",!0))},listenerSetter:this.listenerSetter,contextMenu:{buttons:[{icon:"copy",text:"Text.CopyLabel_ShareLink",onClick:()=>{(0,r.tH)(this.link.container)}}]}}),this.location=new R.ZP({title:" ",subtitleLangKey:"ChatLocation",icon:"location"}),this.section.content.append(this.phone.container,this.username.container,this.location.container,this.bio.container,this.link.container);const{listenerSetter:e}=this;this.isDialog&&(this.notifications=new R.ZP({checkboxField:new C.Z({toggle:!0}),titleLangKey:"Notifications",icon:"unmute",listenerSetter:this.listenerSetter}),e.add(this.notifications.checkboxField.input)("change",(e=>{e.isTrusted&&this.managers.appMessagesManager.togglePeerMute({peerId:this.peerId,threadId:this.threadId})})),e.add(w.Z)("dialog_notify_settings",(e=>z(this,void 0,void 0,(function*(){if(this.peerId===e.peerId){const e=yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.threadId});this.notifications.checkboxField.checked=!e}})))),this.section.content.append(this.notifications.container)),this.element.append(this.section.container),s.Z&&this.element.append((0,L.G)()),e.add(w.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),e.add(w.Z)("peer_bio_edit",(e=>{e===this.peerId&&this.setMoreDetails(!0)}));const t=({peerId:e,threadId:t})=>z(this,void 0,void 0,(function*(){return this.peerId===e&&(!(yield this.managers.appPeersManager.isForum(this.peerId))||!this.threadId||this.threadId===t)}));e.add(w.Z)("peer_title_edit",(e=>z(this,void 0,void 0,(function*(){(yield t(e))&&(this.fillUsername(),this.setMoreDetails(!0))})))),e.add(w.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),e.add(w.Z)("contacts_update",(e=>z(this,void 0,void 0,(function*(){this.peerId===e.toPeerId()&&((yield this.managers.appUsersManager.getUser(e)).pFlags.self&&this.isDialog||this.fillUserPhone())})))),e.add(w.Z)("avatar_update",(e=>z(this,void 0,void 0,(function*(){(yield t(e))&&this.setAvatar()})))),this.setPeerStatusInterval=window.setInterval((()=>this.setPeerStatus()),6e4)}setPeerStatus(e=!1,t){return z(this,void 0,void 0,(function*(){const i=this.peerId,s=[];s.push((()=>{this.element.classList.toggle("is-me",i===w.Z.myId)}));let n=Promise.resolve();if(i&&(w.Z.myId!==i||!this.isDialog)){const t=yield this.managers.appPeersManager.isForum(this.peerId),a=this.middlewareHelper.get();n=t&&this.threadId?(0,H.Z)({peerId:i,wrapOptions:{middleware:a}}).then((({element:e})=>{this.subtitle.replaceChildren(e)})):m.ZP.setPeerStatus({peerId:i,element:this.subtitle,needClear:e,useWhitespace:!0,middleware:a,ignoreSelf:!this.isDialog}),n.then((e=>e&&s.push(e)))}const a=()=>s.forEach((e=>e()));return n.then((()=>{if(t)return a;a()}))}))}cleanupHTML(){[this.bio,this.phone,this.username,this.location,this.link].forEach((e=>{e.container.style.display="none"})),this.notifications&&(this.notifications.container.style.display="",this.notifications.checkboxField.checked=!0),this.clearSetMoreDetailsTimeout()}canBeDetailed(){return this.peerId!==w.Z.myId||!this.isDialog}createAvatar(){const e=new S.Z;return e.classList.add("profile-avatar","avatar-120"),e.isDialog=this.isDialog,e.attachClickEvent(),e}_setAvatar(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this,t=!(!this.threadId||!(yield this.managers.appPeersManager.isForum(e)));if(this.canBeDetailed()&&!t&&(yield this.managers.appPeersManager.getPeerPhoto(e))){const t=this.avatars;return this.avatars=new D(this.scrollable,this.managers),yield this.avatars.setPeer(e),()=>{var e;this.avatars.info.append(this.name,this.subtitle),null===(e=this.avatar)||void 0===e||e.remove(),this.avatar=void 0,t?t.container.replaceWith(this.avatars.container):this.element.prepend(this.avatars.container),s.Z&&this.scrollable.container.classList.add("parallax")}}const i=this.createAvatar();return yield i.updateWithOptions({peerId:e,threadId:t?this.threadId:void 0,wrapOptions:{customEmojiSize:(0,u.C)(120,120),middleware:this.middlewareHelper.get()}}),()=>{var e;s.Z&&this.scrollable.container.classList.remove("parallax"),this.avatars&&(this.avatars.container.remove(),this.avatars.cleanup(),this.avatars=void 0),null===(e=this.avatar)||void 0===e||e.remove(),this.avatar=i,this.section.content.prepend(this.avatar,this.name,this.subtitle)}}))}setAvatar(e){const t=this._setAvatar();return e?t:t.then((e=>e()))}getUsernamesAlso(e){const t=e.slice(1);if(t.length){const e=t.map((e=>(0,o.Z)({username:e})));return(0,b.ag)("UsernameAlso",[(0,b.v_)(e,!1)])}}fillUsername(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=yield this.managers.appPeersManager.getPeerActiveUsernames(e),i=this.getUsernamesAlso(t);return()=>{this.username.subtitle.replaceChildren(i||(0,b.ag)("Username")),j(t[0],this.username)}}}))}fillUserPhone(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const{phone:t,isAnonymous:i}=(yield this.managers.appUsersManager.getUserPhone(e.toUserId()))||{};return()=>{this.phone.subtitle.replaceChildren((0,b.ag)(i?"AnonymousNumber":"Phone")),j(t?(0,O.Z)(t):void 0,this.phone)}}}))}fillNotifications(){return z(this,void 0,void 0,(function*(){const e=this.notifications;if(e){if(this.canBeDetailed()){const t=yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.threadId});return()=>{e.checkboxField.checked=!t}}return()=>{e.container.style.display="none"}}}))}fillName(){return z(this,void 0,void 0,(function*(){const{peerId:e}=this,[t]=yield Promise.all([(0,U.Z)({peerId:e,dialog:this.isDialog,withIcons:!this.threadId,threadId:this.threadId})]);return()=>{(0,d.Z)(this.name,t)}}))}fillRows(e){return z(this,void 0,void 0,(function*(){return Promise.all([this.fillName(),this.fillUsername(),this.fillUserPhone(),this.fillNotifications(),this.setMoreDetails(void 0,e),this.setPeerStatus(!0,!0)]).then((e=>()=>{e.forEach((e=>null==e?void 0:e()))}))}))}fillProfileElements(){return z(this,void 0,void 0,(function*(){if(!this.cleaned)return;this.cleaned=!1,this.cleanupHTML();const e=(0,n.Z)();this.middlewareHelper.get().onClean((()=>{e.reject()}));const t=yield Promise.all([this.setAvatar(!0),this.fillRows(e)]);return()=>{e.resolve(),t.forEach((e=>null==e?void 0:e()))}}))}_setMoreDetails(e,t){return z(this,void 0,void 0,(function*(){const i=this.getMiddlewarePromise();if(this.threadId&&(yield i(this.managers.appPeersManager.isForum(e)))){let t="https://t.me/";const s=(0,g.Z)(this.threadId),n=yield i(this.managers.appPeersManager.getPeerUsername(e));return t+=n?`${n}/${s}`:`c/${e.toChatId()}/${s}`,()=>{j(t,this.link)}}const s=[];if(s.push((()=>{this.bio.subtitle.replaceChildren((0,b.ag)(e.isUser()?"UserBio":"Info")),j(t.about?(0,y.ZP)(t.about):void 0,this.bio)})),!e.isUser()){const n=yield i(this.managers.appChatsManager.getChat(e.toChatId())),a=(0,v.Z)(n);let o;if(a.length)o=this.getUsernamesAlso(a),s.push((()=>j("https://t.me/"+a[0],this.link)));else{const e=t.exported_invite;"chatInviteExported"===(null==e?void 0:e._)&&s.push((()=>j(e.link,this.link)))}s.push((()=>this.link.subtitle.replaceChildren(o||(0,b.ag)("SetUrlPlaceholder"))))}const n=t.location;return"channelLocation"==(null==n?void 0:n._)&&s.push((()=>j(n.address,this.location))),this.setMoreDetailsTimeout=window.setTimeout((()=>this.setMoreDetails(!0)),6e4),()=>{s.forEach((e=>e()))}}))}setMoreDetails(e,t){return z(this,void 0,void 0,(function*(){this.clearSetMoreDetailsTimeout();const{peerId:i}=this,s=this.getMiddlewarePromise();if(!i||!this.canBeDetailed()||(yield s(this.managers.appPeersManager.isPeerRestricted(i))))return;const n=yield s(this.managers.acknowledged.appProfileManager.getProfileByPeerId(i,e)),a=s(n.result).then((e=>z(this,void 0,void 0,(function*(){if(!(yield s(this.managers.appPeersManager.isPeerRestricted(i))))return yield s(this._setMoreDetails(i,e))}))));if(n.cached&&t)return a;(t||Promise.resolve()).then((()=>a)).then((e=>{null==e||e()}))}))}getMiddlewarePromise(){return(0,f.Z)(this.middlewareHelper.get(),(0,h.Z)("MIDDLEWARE"))}setPeer(e,t){var i;this.peerId===e&&this.threadId===t||(null===(i=this.init)||void 0===i||i.call(this),this.peerId=e,this.threadId=t,this.middlewareHelper.clean(),this.cleaned=!0)}clearSetMoreDetailsTimeout(){void 0!==this.setMoreDetailsTimeout&&(clearTimeout(this.setMoreDetailsTimeout),this.setMoreDetailsTimeout=void 0)}destroy(){var e;this.peerId=this.threadId=void 0,this.clearSetMoreDetailsTimeout(),clearInterval(this.setPeerStatusInterval),null===(e=this.avatars)||void 0===e||e.cleanup(),this.middlewareHelper.destroy()}}},8842:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(3512),n=i(2325),a=i(5565),o=i(1507),r=i(8456),d=i(130),l=i(5953),c=i(8115),h=i(493),u=(i(4755),i(5948));i(3541);function p(e,t,i,n,a){return o=this,r=void 0,l=function*(){const t=[],o=yield s.Z.managers.appPeersManager.getPeer(e);if(o.pFlags.verified&&!i&&t.push(function(){const e=document.createElement("span");e.classList.add("verified-icon","tgico");const t=document.createElementNS("http://www.w3.org/2000/svg","svg");t.setAttributeNS(null,"viewBox","0 0 26 26"),t.setAttributeNS(null,"width","26"),t.setAttributeNS(null,"height","26"),t.classList.add("verified-icon-svg");const i=document.createElementNS("http://www.w3.org/2000/svg","use");i.setAttributeNS(null,"href","#verified-icon-background"),i.classList.add("verified-icon-background");const s=document.createElementNS("http://www.w3.org/2000/svg","use");return s.setAttributeNS(null,"href","#verified-icon-check"),s.classList.add("verified-icon-check"),t.append(s,i),e.append(t),e}()),!o.pFlags.fake&&!o.pFlags.scam||n||t.push((0,u.Z)(o.pFlags.scam)),o.pFlags.premium&&!a){const e=o.emoji_status;e&&e._,t.push(function(){const e=document.createElement("span");return e.classList.add("premium-icon","tgico-star"),e}())}return t},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l}var f=i(9345);const m=new WeakMap;s.Z.addEventListener("peer_title_edit",(({peerId:e,threadId:t})=>{let i=`.peer-title[data-peer-id="${e}"]`;t&&(i+=`[data-thread-id="${t}"]`),Array.from(document.querySelectorAll(i)).forEach((e=>{const t=m.get(e);null==t||t.update()}))}));class g{constructor(e){this.element=document.createElement("span"),this.element.classList.add("peer-title"),(0,d.m)(this.element),this.options={},e&&this.update(e),m.set(this.element,this)}setOptions(e){if(e){(0,l.Z)(this.options,e);for(const t in e){const i=e[t];"object"!=typeof i&&"function"!=typeof i&&(this.element.dataset[t]=i?""+("boolean"==typeof i?+i:i):"0")}}}setHasInner(e){this.hasInner!==e&&(this.hasInner=e,this.element.classList.toggle("with-icons",e))}update(e){var t,i,l,u,m,g,v,b;return m=this,g=void 0,b=function*(){this.setOptions(e);let m,g=this.options.fromName;if(void 0!==g)return void 0!==this.options.limitSymbols&&(g=(0,r.Z)(g,this.options.limitSymbols,this.options.limitSymbols)),void(0,d.Z)(this.element,(0,c.Z)(g));null!==(t=(u=this.options).peerId)&&void 0!==t||(u.peerId=o.NM);const{peerId:v,threadId:b}=this.options;if(v===s.Z.myId&&this.options.dialog)(0,a.Z)(this.element,(0,n.ag)(this.options.onlyFirstName?"Saved":"SavedMessages"));else{if(b){const[e,t]=yield Promise.all([s.Z.managers.dialogsStorage.getForumTopic(v,b),s.Z.managers.appPeersManager.isForum(v)]);if(!e&&t)return s.Z.managers.dialogsStorage.getForumTopicById(v,b).then((e=>{if(!e&&this.options.threadId===b)return this.options.threadId=void 0,void this.update({threadId:void 0});this.update()}),(()=>{this.options.threadId===b&&(this.options.threadId=void 0,this.update({threadId:void 0}))})),(0,d.Z)(this.element,(0,n.ag)("Loading")),void this.setHasInner(!1)}const e=b&&this.options.withIcons?s.Z.managers.dialogsStorage.getForumTopic(v,b).then((e=>{var t;return(0,f.e)(Object.assign(Object.assign({},null!==(t=this.options.wrapOptions)&&void 0!==t?t:{}),{topic:e}))})):void 0,[t,a,o]=yield Promise.all([(0,h.Z)(this.options),this.options.withIcons&&p(v,null===(i=this.options.wrapOptions)||void 0===i||i.middleware)||this.options.withPremiumIcon&&p(v,null===(l=this.options.wrapOptions)||void 0===l||l.middleware,!0,!0),e]);if((null==a?void 0:a.length)||o){const e=document.createElement("span");e.classList.add("peer-title-inner"),m=!0,(0,d.Z)(e,t);const i=document.createDocumentFragment();i.append(...[o,e,...null!=a?a:[]].filter(Boolean)),(0,d.Z)(this.element,i)}else(0,d.Z)(this.element,t)}this.setHasInner(m)},new((v=void 0)||(v=Promise))((function(e,t){function i(e){try{n(b.next(e))}catch(e){t(e)}}function s(e){try{n(b.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof v?n:new v((function(e){e(n)}))).then(i,s)}n((b=b.apply(m,g||[])).next())}))}}},6765:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(1168),n=i(2325),a=i(2738),o=i(8678),r=i(2312);class d extends s.Z{constructor(e={}){super("popup-avatar",{closable:!0,withConfirm:!0}),this.image=new Image,this.cropper={crop:()=>{},removeHandlers:()=>{}},this.h6=document.createElement("h6"),(0,n.$d)(this.h6,"Popup.Avatar.Title"),this.btnClose.classList.remove("btn-icon"),this.header.append(this.h6),this.cropContainer=document.createElement("div"),this.cropContainer.classList.add("crop"),this.cropContainer.append(this.image),e.isForum&&this.cropContainer.classList.add("is-forum"),this.input=document.createElement("input"),this.input.type="file",this.input.style.display="none",this.listenerSetter.add(this.input)("change",(e=>{const t=e.target.files[0];t&&(0,o.Z)(t).then((e=>{this.image=new Image,this.cropContainer.append(this.image),this.image.src=e,this.image.onload=()=>{this.show(),this.cropper=function(e,t){let i,s,n,a={},o=0,r=0,d=0,l=0,c=0;function h(){e.classList.add("crop-blur"),e.draggable=!1,n=new Image,n.src=e.src,n.draggable=!1,n.classList.add("crop-overlay-image"),t||(t=document.createElement("canvas")),i=document.createElement("div"),i.classList.add("crop-component"),s=document.createElement("div"),s.classList.add("crop-overlay");const a=document.createElement("div");a.classList.add("crop-overlay-color"),i.appendChild(s),e.parentNode.appendChild(i),i.appendChild(n),i.appendChild(e),i.appendChild(a),s.appendChild(n),n.style.maxWidth=e.width+"px",c=e.naturalWidth/e.offsetWidth;const o=e.offsetWidth/2-100,r=e.offsetHeight/2-100;u(200,200),p(o,r),f(o,r),s.addEventListener("mousedown",b,!1),s.addEventListener("touchstart",b,!1),s.addEventListener("wheel",v,!1),document.addEventListener("keypress",g,!1)}function u(e,t){d=e*c,l=t*c,s.style.width=e+"px",s.style.height=t+"px"}function p(e,t){r=t*c,o=e*c,n.style.top=-t+"px",n.style.left=-e+"px"}function f(e,t){s.style.top=t+"px",s.style.left=e+"px"}function m(e){e=e*Math.PI*2;let t,i,a,o,r=Math.floor(s.clientWidth+e),d=Math.floor(s.clientHeight+e),l=n.clientWidth,c=n.clientHeight;r<50||r>l||(t=s.offsetLeft-e/2,i=s.offsetTop-e/2,a=t+r,o=i+d,t<0&&(t=0),i<0&&(i=0),a>l||o>c||(u(r,r),p(t,i),f(t,i)))}function g(e){switch(e.preventDefault(),String.fromCharCode(e.charCode)){case"+":m(4);break;case"-":m(-4)}}function v(e){e.preventDefault(),m(e.deltaY>0?1:-1)}function b(e){e.preventDefault(),e.stopPropagation(),function(e){a.container_width=s.offsetWidth,a.container_height=s.offsetHeight,a.container_left=s.offsetLeft,a.container_top=s.offsetTop,a.mouse_x=(e.clientX||e.pageX||e.touches&&e.touches[0].clientX)+window.scrollX,a.mouse_y=(e.clientY||e.pageY||e.touches&&e.touches[0].clientY)+window.scrollY}(e),document.addEventListener("mousemove",w),document.addEventListener("touchmove",w),document.addEventListener("mouseup",y),document.addEventListener("touchend",y)}function y(e){e.preventDefault(),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",w),document.removeEventListener("touchmove",w)}function w(e){let t,i,o,r,d={x:0,y:0};e.preventDefault(),e.stopPropagation(),d.x=e.pageX||e.touches&&e.touches[0].pageX,d.y=e.pageY||e.touches&&e.touches[0].pageY,t=d.x-(a.mouse_x-a.container_left),i=d.y-(a.mouse_y-a.container_top),o=s.offsetWidth,r=s.offsetHeight,t<0?t=0:t>n.offsetWidth-o&&(t=n.offsetWidth-o),i<0?i=0:i>n.offsetHeight-r&&(i=n.offsetHeight-r),p(t,i),f(t,i)}return e.complete?h():e.onload=h,{crop:function(){t.width=d,t.height=l,t.getContext("2d").drawImage(e,o,r,d,l,0,0,d,l)},removeHandlers:function(){s.removeEventListener("mousedown",b),s.removeEventListener("touchstart",b),s.removeEventListener("wheel",v),document.removeEventListener("mouseup",y),document.removeEventListener("touchend",y),document.removeEventListener("mousemove",w),document.removeEventListener("touchmove",w),document.removeEventListener("keypress",g),i.remove(),s.remove(),n.remove()}}}(this.image,this.canvas),this.input.value=""}}))}),!1),this.btnConfirm.className="btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1",(0,a.fc)(this.btnConfirm,(()=>{this.cropper.crop(),this.hide(),this.canvas.toBlob((e=>{this.blob=e,this.darkenCanvas(),this.resolve()}),"image/jpeg",1)}),{listenerSetter:this.listenerSetter}),this.container.append(this.cropContainer,this.btnConfirm,this.input),this.addEventListener("closeAfterTimeout",(()=>{this.cropper.removeHandlers(),this.image&&this.image.remove()}))}resolve(){this.onCrop((()=>r.Z.upload(this.blob)))}open(e,t){this.canvas=e,this.onCrop=t,this.input.click()}darkenCanvas(){const e=this.canvas.getContext("2d");e.fillStyle="rgba(0, 0, 0, 0.3)",e.fillRect(0,0,this.canvas.width,this.canvas.height)}}},6194:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(1168),n=i(7362),a=i(8127);class o{constructor(e,t,i,s){this.peerId=e,this.peerType=t,this.onSelect=i,this.threadId=s,this.construct()}construct(){return e=this,t=void 0,o=function*(){let{peerId:e,peerType:t,onSelect:i,threadId:o}=this;const r=yield(0,n.Z)({peerId:e,threadId:o}),d=s.Z.MANAGERS;void 0===t&&(t=yield d.appPeersManager.getDialogType(e));const l=(t,s=g&&!!t.size)=>{let n=d.appChatsManager.leave(e.toChatId());s&&(n=n.then((()=>d.appMessagesManager.flushHistory(e)))),null==i||i(n)},c=t=>{let s;if(o)s=d.appMessagesManager.flushHistory(e,!1,!0,o);else if(e.isUser())s=d.appMessagesManager.flushHistory(e,!1,g?!!t.size:void 0);else{if(!t.size)return l(t);s=d.appChatsManager.delete(e.toChatId())}null==i||i(s)};let h,u,p,f,m,g;switch(t){case"channel":(yield d.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(h="ChannelDeleteMenu",p="AreYouSureDeleteAndExitChannel",m=[{langKey:"ChannelDeleteMenu",isDanger:!0,callback:c}],g=[{text:"DeleteChannelForAll"}]):(h="LeaveChannelMenu",p="ChannelLeaveAlertWithName",f=[r],m=[{langKey:"LeaveChannel",isDanger:!0,callback:l}]);break;case"chat":h="DeleteChatUser",p="AreYouSureDeleteThisChatWithUser",f=[r],m=[{langKey:"DeleteChatUser",isDanger:!0,callback:c}],g=[{text:"DeleteMessagesOptionAlso",textArgs:[yield(0,n.Z)({peerId:e})]}];break;case"saved":h="DeleteChatUser",p="AreYouSureDeleteThisChatSavedMessages",m=[{langKey:"DeleteChatUser",isDanger:!0,callback:c}];break;case"megagroup":case"group":o?(h="DeleteTopics",u=[1],p="DeleteSelectedTopic",f=[r],m=[{langKey:"Delete",isDanger:!0,callback:c}]):(yield d.appChatsManager.hasRights(e.toChatId(),"delete_chat"))?(h="DeleteMegaMenu",p="AreYouSureDeleteAndExit",m=[{langKey:"DeleteMegaMenu",isDanger:!0,callback:c}],g=[{text:"DeleteChat.DeleteGroupForAll"}]):(h="LeaveMegaMenu",p="AreYouSureDeleteAndExitName",f=[r],m=[{langKey:"DeleteChatUser",isDanger:!0,callback:e=>l(e,!0)}])}new a.Z("popup-delete-chat",{peerId:e,threadId:o,titleLangKey:h,titleLangArgs:u,descriptionLangKey:p,descriptionLangArgs:f,buttons:m,checkboxes:g}).show()},new((i=void 0)||(i=Promise))((function(s,n){function a(e){try{d(o.next(e))}catch(e){n(e)}}function r(e){try{d(o.throw(e))}catch(e){n(e)}}function d(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,r)}d((o=o.apply(e,t||[])).next())}));var e,t,i,o}}},5128:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(3512),n=i(1168),a=i(8127),o=i(2325),r=i(7120),d=i(2353),l=i(7362),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class h{constructor(e,t,i,s,n){this.peerId=e,this.mids=t,this.type=i,this.onConfirm=s,this.threadId=n,this.construct()}construct(){return c(this,void 0,void 0,(function*(){let{peerId:e,mids:t,type:i,onConfirm:h,threadId:u}=this;const p=yield(0,l.Z)({peerId:e,threadId:u}),f=n.Z.MANAGERS;t=t.slice();const m=(s,n)=>{h&&h(),"scheduled"===i?f.appMessagesManager.deleteScheduledMessages(e,t):f.appMessagesManager.deleteMessages(e,t,!!s.size||n)},g=[{langKey:"Delete",isDanger:!0,callback:m}],v=[];let b,y,w,S;if(1===t.length?b="DeleteSingleMessagesTitle":(b="DeleteMessagesTitle",y=[(0,o.ag)("messages",[t.length])]),w=(yield f.appPeersManager.isMegagroup(e))?1===t.length?"AreYouSureDeleteSingleMessageMega":"AreYouSureDeleteFewMessagesMega":1===t.length?"AreYouSureDeleteSingleMessage":"AreYouSureDeleteFewMessages",e===s.Z.myId||"scheduled"===i);else if(e.isUser())v.push({text:"DeleteMessagesOptionAlso",textArgs:[p]});else{const i=yield f.appChatsManager.getChat(e.toChatId()),n=(0,r.Z)(i,"delete_messages");if("chat"===i._){const i=n?t.slice():yield(0,d.Z)(t,(t=>c(this,void 0,void 0,(function*(){return(yield f.appMessagesManager.getMessageByPeer(e,t)).fromId===s.Z.myId}))));i.length&&(i.length===t.length?v.push({text:"DeleteForAll"}):(v.push({text:"DeleteMessagesOption"}),w="DeleteMessagesTextGroup",S=[(0,o.ag)("messages",[i.length])]))}else g[0].callback=e=>m(e,!0)}(0,n.x)(g),new a.Z("popup-delete-chat",{peerId:e,threadId:u,titleLangKey:b,titleLangArgs:y,descriptionLangKey:w,descriptionLangArgs:S,buttons:g,checkboxes:v}).show()}))}}},4524:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(4271),n=i(3512),a=i(2796),o=i(2995);class r extends o.Z{constructor(e,t,i=!1){super({peerTypes:["dialogs","contacts"],onSelect:i?t:i=>{return o=this,r=void 0,l=function*(){if(t){const e=t(i);e instanceof Promise&&(yield e)}if(i!==n.Z.myId)s.ZP.setInnerPeer({peerId:i}),s.ZP.chat.input.initMessagesForward(e);else{let t=0;for(const s in e){const n=e[s];t+=n.length,this.managers.appMessagesManager.forwardMessages(i,s.toPeerId(),n)}(0,a.bC)({langPackKey:t>0?"FwdMessagesToSavedMessages":"FwdMessageToSavedMessages"})}},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l},placeholder:"ShareModal.Search.ForwardPlaceholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})}}},1168:(e,t,i)=>{"use strict";i.d(t,{Z:()=>L,x:()=>E});var s=i(1405),n=i(5814),a=i(6385),o=i(2325),r=i(8497),d=i(8799),l=i(3699),c=i(2738),h=i(6299),u=i(3910),p=i(3241),f=i(6733),m=i(1655),g=i(3815),v=i(8805),b=i(3624),y=i(8115);const w=document.body;let S=w;const C=()=>{S=(0,f.W7)()||w,L.reAppend()};(0,f.Ms)(w,C);class L extends p.Z{constructor(e,t={}){if(super(!1),this.element=document.createElement("div"),this.container=document.createElement("div"),this.header=document.createElement("div"),this.title=document.createElement("div"),this.onEscape=()=>!0,this.hide=()=>{a.Z.backByItem(this.navigationItem)},this.element.classList.add("popup"),this.element.className="popup"+(e?" "+e:""),this.container.classList.add("popup-container","z-depth-1"),this.header.classList.add("popup-header"),(t.title||t.titleRaw)&&(this.title.classList.add("popup-title"),"string"==typeof t.title?(0,o.$d)(this.title,t.title):t.titleRaw&&this.title.append((0,y.Z)(t.titleRaw)),this.header.append(this.title)),this.middlewareHelper=(0,b.k)(),this.listenerSetter=new l.Z,this.managers=L.MANAGERS,this.confirmShortcutIsSendShortcut=t.confirmShortcutIsSendShortcut,t.closable&&(this.btnClose=document.createElement("span"),this.btnClose.classList.add("btn-icon","popup-close","tgico-close"),this.header.prepend(this.btnClose),(0,c.fc)(this.btnClose,this.hide,{listenerSetter:this.listenerSetter,once:!0})),this.withoutOverlay=t.withoutOverlay,this.withoutOverlay&&this.element.classList.add("no-overlay"),t.overlayClosable&&(0,c.fc)(this.element,(e=>{(0,r.Z)(e.target,"popup-container")||this.hide()}),{listenerSetter:this.listenerSetter}),t.withConfirm&&(this.btnConfirm=document.createElement("button"),this.btnConfirm.classList.add("btn-primary","btn-color-primary"),!0!==t.withConfirm&&this.btnConfirm.append((0,o.ag)(t.withConfirm)),this.header.append(this.btnConfirm),(0,s.Z)(this.btnConfirm)),this.container.append(this.header),t.body&&(this.body=document.createElement("div"),this.body.classList.add("popup-body"),this.container.append(this.body)),t.scrollable){const e=this.scrollable=new v.ZP(this.body);this.attachScrollableListeners(),this.body||this.container.insertBefore(e.container,this.header.nextSibling)}let i=this.btnConfirm;const n=this.buttons=t.buttons;if(null==n?void 0:n.length){const e=this.buttonsEl=document.createElement("div");e.classList.add("popup-buttons");const t=n.map((e=>{const t=document.createElement("button");return t.className="btn"+(e.isDanger?" danger":" primary"),e.noRipple||(0,s.Z)(t),e.text?t.textContent=e.text:t.append((0,o.ag)(e.langKey,e.langArgs)),(0,c.fc)(t,(()=>{var t;null===(t=e.callback)||void 0===t||t.call(e),this.destroy()}),{listenerSetter:this.listenerSetter,once:!0}),e.element=t}));if(!i&&2===n.length){const e=n.find((e=>!e.isCancel));e&&(i=e.element)}e.append(...t),this.container.append(e)}this.btnConfirmOnEnter=i,this.element.append(this.container),L.POPUPS.push(this)}attachScrollableListeners(e){return this.scrollable.attachBorderListeners(e)}onContentUpdate(){this.scrollable&&this.scrollable.onAdditionalScroll()}show(){this.navigationItem={type:"popup",onPop:()=>this.destroy(),onEscape:this.onEscape},a.Z.pushItem(this.navigationItem),(0,d.Z)(),S.append(this.element),this.element.offsetWidth,this.element.classList.add("active"),this.onContentUpdate(),this.withoutOverlay||(g.Z.isOverlayActive=!0,n.Z.checkAnimations2(!0)),setTimeout((()=>{this.element.classList.contains("active")&&this.listenerSetter.add(document.body)("keydown",(e=>{L.POPUPS[L.POPUPS.length-1]===this&&(this.confirmShortcutIsSendShortcut?(0,h.Z)(e):"Enter"===e.key)&&((0,c.tH)(this.btnConfirmOnEnter),(0,u.Z)(e))}))}),0)}destroy(){this.dispatchEvent("close"),this.element.classList.add("hiding"),this.element.classList.remove("active"),this.listenerSetter.removeAll(),this.middlewareHelper.destroy(),this.withoutOverlay||(g.Z.isOverlayActive=!1),a.Z.removeItem(this.navigationItem),this.navigationItem=void 0,(0,m.Z)(L.POPUPS,this),C(),setTimeout((()=>{var e;this.element.remove(),this.dispatchEvent("closeAfterTimeout"),this.cleanup(),null===(e=this.scrollable)||void 0===e||e.destroy(),this.withoutOverlay||n.Z.checkAnimations2(!1)}),150)}static reAppend(){this.POPUPS.forEach((e=>{const{element:t,container:i}=e,s=t.parentElement;s&&s!==S&&S!==i&&S.append(t)}))}static getPopups(e){return this.POPUPS.filter((t=>t instanceof e))}static createPopup(e,...t){return new e(...t)}}L.POPUPS=[];const E=e=>(e.find((e=>e.isCancel))||e.push({langKey:"Cancel",isCancel:!0}),e)},3186:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3035),n=i(4271),a=i(2325),o=i(3512),r=i(8127);const d={pin:{title:"LimitReached",description:"LimitReachedPinDialogs",descriptionPremium:"LimitReachedPinDialogsPremium",descriptionLocked:"LimitReachedPinDialogsLocked",icon:"limit_pin"},folders:{title:"LimitReached",description:"LimitReachedFolders",descriptionPremium:"LimitReachedFoldersPremium",descriptionLocked:"LimitReachedFoldersLocked",icon:"limit_folders"}};class l extends r.Z{constructor(e,t){super("popup-limit",{buttons:void 0===e.isPremium?[{langKey:"LimitReached.Ok",isCancel:!0}]:e.isPremium?[{langKey:"OK",isCancel:!0}]:[{langKey:"IncreaseLimit",callback:()=>{n.ZP.openPremiumBot()},noRipple:!0},{langKey:"Cancel",isCancel:!0}],descriptionLangKey:void 0===e.isPremium?t.descriptionLocked:e.isPremium?t.descriptionPremium:t.description,descriptionLangArgs:e.isPremium?[e.limitPremium]:[e.limit,e.limitPremium],titleLangKey:t.title});const i=void 0===e.isPremium;if(i)this.element.classList.add("is-locked");else if(e.isPremium)this.element.classList.add("is-premium");else{const e=this.buttons.find((e=>!e.isCancel));e.element.classList.add("popup-limit-button");const t=document.createElement("i");t.classList.add("popup-limit-button-icon","tgico-premium_double"),e.element.append(t)}const r=document.createElement("div");r.classList.add("popup-limit-line");const d=document.createElement("div");d.classList.add("popup-limit-hint");const l=document.createElement("span");if(l.classList.add("popup-limit-hint-icon","tgico-"+t.icon),d.append(l,""+(e.isPremium?e.limitPremium:e.limit)),r.append(d),!i){const t=document.createElement("div");t.classList.add("limit-line");const i=document.createElement("div");i.classList.add("limit-line-free");const s=document.createElement("div");s.classList.add("limit-line-premium"),t.append(i,s),(0,a.$d)(i,"LimitFree"),s.append((0,a.ag)("LimitPremium"),""+e.limitPremium),r.append(t)}this.container.insertBefore(r,this.description);const c=()=>{d.classList.add("active")};o.Z.settings.animationsEnabled?(0,s.d1)().then(c):c()}}function c(e){return function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))}(this,void 0,void 0,(function*(){const t=d[e],[i,s,n]=yield Promise.all([o.Z.managers.apiManager.getAppConfig(),...[!1,!0].map((t=>o.Z.managers.apiManager.getLimit(e,t)))]),a=i.premium_purchase_blocked;new l({isPremium:a?void 0:o.Z.premium,limit:s,limitPremium:n},t).show()}))}},3897:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(7298),n=i(1507),a=i(7479),o=i(8127);const r=[{value:3600,langPackKey:"ChatList.Mute.1Hour"},{value:14400,langPackKey:"ChatList.Mute.4Hours"},{value:28800,langPackKey:"ChatList.Mute.8Hours"},{value:86400,langPackKey:"ChatList.Mute.1Day"},{value:259200,langPackKey:"ChatList.Mute.3Days"},{value:-1,langPackKey:"ChatList.Mute.Forever",checked:!0}];class d extends o.Z{constructor(e,t){let i;super("popup-mute",{peerId:e,titleLangKey:"Notifications",buttons:[{langKey:"ChatList.Context.Mute",callback:()=>{this.managers.appMessagesManager.mutePeer({peerId:e,muteUntil:-1===i?n.rU:(0,s.Z)(!0)+i,threadId:t})}}],body:!0});const o=(0,a.ZC)(r,(e=>{i=+e}));this.body.append(o),this.show()}}},8127:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(9331),n=i(1168),a=i(2325),o=i(9807),r=i(130);class d extends n.Z{constructor(e,t={}){if(super("popup-peer"+(e?" "+e:""),Object.assign(Object.assign({overlayClosable:!0},t),{title:!0,buttons:t.buttons&&(0,n.x)(t.buttons)})),this.className=e,t.peerId){const e=new s.Z;e.classList.add("avatar-32"),e.updateWithOptions({isDialog:!0,peerId:t.peerId,threadId:t.threadId,wrapOptions:{middleware:this.middlewareHelper.get()}}),this.header.prepend(e)}t.noTitle||(t.titleLangKey||!t.title?this.title.append((0,a.ag)(t.titleLangKey||"AppName",t.titleLangArgs)):t.title instanceof HTMLElement?this.title.append(t.title):this.title.innerText=t.title||"");const i=document.createDocumentFragment();if(t.descriptionLangKey||t.description){const e=this.description=document.createElement("p");e.classList.add("popup-description"),t.descriptionLangKey?e.append((0,a.ag)(t.descriptionLangKey,t.descriptionLangArgs)):t.description&&(0,r.Z)(e,t.description),i.append(e)}t.checkboxes&&(this.container.classList.add("have-checkbox"),t.checkboxes.forEach((e=>{e.withRipple=!0;const t=new o.Z(e);e.checkboxField=t,i.append(t.label)})),t.buttons.forEach((e=>{if(e.callback){const i=e.callback;e.callback=()=>{const e=new Set;t.checkboxes.forEach((t=>{t.checkboxField.checked&&e.add(t.text)})),i(e)}}}))),this.container.insertBefore(i,this.header.nextElementSibling)}}},2995:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5432),n=i(5644),a=i(1168);class o extends a.Z{constructor(e){super("popup-forward",{closable:!0,overlayClosable:!0,body:!0,title:!0}),this.selector=new n.Z({appendTo:this.body,onChange:()=>{return t=this,i=void 0,n=function*(){const t=this.selector.getSelected(),i=t[t.length-1].toPeerId();if(e.onSelect){const t=e.onSelect(i);if(t instanceof Promise)try{yield t}catch(e){return}}this.selector=null,this.hide()},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n},peerType:e.peerTypes,onFirstRender:()=>{this.show(),this.selector.checkForTriggers(),s.Z||this.selector.input.focus()},chatRightsAction:e.chatRightsAction,multiSelect:!1,rippleEnabled:!1,avatarSize:"abitbigger",peerId:e.peerId,placeholder:e.placeholder,selfPresence:e.selfPresence,managers:this.managers}),this.scrollable=this.selector.scrollable,this.attachScrollableListeners(),this.title.append(this.selector.input)}}},1962:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(8127);class n extends s.Z{constructor(e,t,i){super("popup-delete-chat",{title:`Send Message${t.length>1?"s":""} Now`,description:t.length>1?"Send "+t.length+" messages now?":"Send message now?",buttons:[{langKey:"Send",callback:()=>{i&&i(),this.managers.appMessagesManager.sendScheduledMessages(e,t)}}]}),this.show()}}},6787:(e,t,i)=>{"use strict";i.d(t,{Z:()=>P});var s=i(1168),n=i(3541),a=i(2153),o=i(279),r=i(5814),d=i(4271),l=i(4755),c=i(2325),h=i(4494),u=i(8497),p=i(1656),f=i(2738),m=i(2796),g=i(130),v=i(8115),b=i(3163),y=i(9259),w=i(7479),S=i(5565),C=i(3512),L=i(9083),E=i(3173),I=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const M="STICKERS-POPUP";class P extends s.Z{constructor(e,t){super("popup-stickers",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:!0}),this.stickerSetInput=e,this.isEmojis=t,this.onStickersClick=e=>I(this,void 0,void 0,(function*(){const t=(0,u.Z)(e.target,"sticker-set-sticker");if(!t)return;const i=t.dataset.docId;(yield d.ZP.chat.input.sendMessageWithDocument(i))&&this.hide()})),this.title.append((0,c.ag)("Loading")),this.updateAdded={},E.ZP.setIgnoreMouseOut("popup",!0),this.addEventListener("close",(()=>{E.ZP.setIgnoreMouseOut("popup",!1),r.Z.setOnlyOnePlayableGroup()})),this.appendTo=this.scrollable.container,this.appendTo.classList.add("is-loading"),(0,o.y)(this.appendTo,!0),this.stickersFooter=document.createElement("div"),this.stickersFooter.classList.add("sticker-set-footer");const i=(0,h.Z)("btn-primary btn-primary-transparent disable-hover",{noRipple:!0,text:"Loading"});this.stickersFooter.append(i),this.body.append(this.stickersFooter),(0,y.Z)({listenTo:this.appendTo,listenerSetter:this.listenerSetter});const s=e=>{const t=this.sets.findIndex((t=>t.id===e.id));if(-1===t)return;this.sets[t]=e;const i=this.updateAdded[e.id];null==i||i(!!e.installed_date),this.updateButton()};this.listenerSetter.add(C.Z)("stickers_installed",s),this.listenerSetter.add(C.Z)("stickers_deleted",s),this.loadStickerSet()}createStickerSetElements(e){const t=document.createElement("div");let i,s;t.classList.add("sticker-set"),e&&(i=new w.ZP({title:(0,v.Z)(e.title),subtitle:(0,c.ag)(e.pFlags.emojis?"EmojiCount":"Stickers",[e.count]),buttonRight:!0}),s=e=>{(0,S.Z)(i.buttonRight,(0,c.ag)(e?"Stickers.SearchAdded":"Stickers.SearchAdd")),i.buttonRight.classList.toggle("active",e)},s(!!e.installed_date),t.append(i.container));const n=document.createElement("div");return n.classList.add("sticker-set-stickers"),t.append(n),{container:t,headerRow:i,updateAdded:s,itemsContainer:n}}loadStickerSet(){var e;return I(this,void 0,void 0,(function*(){const t=this.middlewareHelper.get(),i=(Array.isArray(this.stickerSetInput)?this.stickerSetInput:[this.stickerSetInput]).map((e=>this.managers.appStickersManager.getStickerSet(e)));let s=yield Promise.all(i);if(!t())return;let o=s[0];if(1===s.length&&!o)return(0,m.bC)({langPackKey:this.isEmojis?"AddEmojiNotFound":"StickerSet.DontExist"}),void this.hide();s=s.filter(Boolean),o=s[0],this.sets=s.map((e=>e.set));const d=null!==(e=this.isEmojis)&&void 0!==e?e:this.isEmojis=!!o.set.pFlags.emojis;if(!d){(0,f.fc)(this.appendTo,this.onStickersClick,{listenerSetter:this.listenerSetter});const{destroy:e}=(0,b.Z)({listenTo:this.appendTo,isStickerPack:!0,onSend:()=>this.hide()});this.addEventListener("close",e)}r.Z.setOnlyOnePlayableGroup(M);const u=new a.Z,y=[],w=s.map((e=>I(this,void 0,void 0,(function*(){const{container:i,itemsContainer:a,headerRow:o,updateAdded:r}=this.createStickerSetElements(s.length>1?e.set:void 0);let c;o&&(0,f.fc)(o.buttonRight,(()=>{this.managers.appStickersManager.toggleStickerSet(e.set)}),{listenerSetter:this.listenerSetter}),this.updateAdded[e.set.id]=r;const h=e.documents.filter((e=>"document"===(null==e?void 0:e._)));if(d){const e=(0,L.Z)({docIds:h.map((e=>e.id)),loadPromises:y,animationGroup:M,customEmojiSize:l.Z.active.esgCustomEmoji,middleware:t});Array.from(e.children).slice(1).forEach((e=>{const t=document.createElement("span");t.classList.add("super-emoji"),e.replaceWith(t),t.append(e)})),c=[e],a.classList.replace("sticker-set-stickers","super-emojis"),a.classList.add("is-emojis","not-local")}else c=yield Promise.all(h.map((e=>I(this,void 0,void 0,(function*(){const i=document.createElement("div");i.classList.add("sticker-set-sticker");const s=l.Z.active.popupSticker.width;return yield(0,n.ZP)({doc:e,div:i,lazyLoadQueue:u,group:M,play:!0,loop:!0,width:s,height:s,withLock:!0,loadPromises:y,middleware:t}),i})))));return a.append(...c.filter(Boolean)),i})))),S=yield Promise.all(w);yield Promise.all(y);const C=this.button=(0,h.Z)("",{noRipple:!0});this.updateButton(),(0,f.fc)(C,(()=>{const e=(0,p.Z)([C],!0);this.managers.appStickersManager.toggleStickerSets(s.map((e=>e.set))).then((()=>{this.hide()})).catch((()=>{e()}))}),{listenerSetter:this.listenerSetter}),1===s.length?(0,g.Z)(this.title,(0,v.Z)(o.set.title)):(0,g.Z)(this.title,(0,c.ag)("Emoji")),this.stickersFooter.textContent="",this.stickersFooter.append(C),this.appendTo.classList.remove("is-loading"),this.appendTo.textContent="",this.appendTo.append(...S),this.scrollable.onAdditionalScroll()}))}updateButton(){const{sets:e,isEmojis:t}=this;let i,s;if(1===e.length){const n=e[0];s=(0,c.ag)(t?"EmojiCount":"Stickers",[n.count]),i=!n.installed_date}else{const t=e.filter((e=>e.installed_date));let n;e.length===t.length?(i=!1,n=e.length):(i=!0,n=e.length-t.length),s=(0,c.ag)("EmojiPackCount",[n])}this.button.className=i?"btn-primary btn-color-primary":"btn-primary btn-primary-transparent danger",(0,S.Z)(this.button,(0,c.ag)(i?"AddStickersCount":"RemoveStickersCount",[s]))}}},3442:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l});var s=i(9099),n=i(3035),a=i(3910),o=i(2738),r=i(8487),d=i(5953);class l{constructor(e){this.tempId=0,this.detached=!0,this.promise=null,this.isUpload=!1,this.cancelable=!0,this.streamable=!1,this.tryAgainOnFail=!0,this.attachMethod="append",this.onClick=e=>{e&&(0,a.Z)(e),this.preloader.classList.contains("manual")?this.loadFunc&&this.loadFunc(e):this.promise&&this.promise.cancel&&this.promise.cancel()},e&&(0,d.Z)(this,e),this.isUpload&&(this.tryAgainOnFail=!1)}constructContainer(e={}){this.preloader||(this.preloader=document.createElement("div"),this.preloader.classList.add("preloader-container"),e.color&&this.preloader.classList.add("preloader-"+e.color),e.bold&&this.preloader.classList.add("preloader-bold"),this.streamable&&this.preloader.classList.add("preloader-streamable"))}constructDownloadIcon(){this.constructContainer()}construct(){this.construct=null,this.constructContainer(),this.preloader.innerHTML=`\n
\n \n \n \n
`,this.streamable?this.totalLength=118.61124420166016:this.totalLength=149.82473754882812,this.cancelable?(this.preloader.innerHTML+='\n \n \n \n \n \n \n \n \n \n \n \n ',this.downloadSvg=this.preloader.lastElementChild,this.cancelSvg=this.downloadSvg.previousElementSibling):this.preloader.classList.add("preloader-swing"),this.circle=this.preloader.firstElementChild.firstElementChild.firstElementChild,this.cancelable&&(0,o.fc)(this.preloader,this.onClick)}setDownloadFunction(e){this.loadFunc=e}setManual(){this.preloader.classList.add("manual"),this.setProgress(0)}attachPromise(e){if(this.isUpload&&this.promise)return;this.promise=e;const t=--this.tempId,i=Date.now(),s=s=>{if(e.notify=e.notifyAll=null,t!==this.tempId)return;const a=Date.now()-i;if(!s&&this.cancelable){this.setProgress(100);const e=150;a{t===this.tempId&&this.detach()}),e)}else this.tryAgainOnFail?(this.attach(this.preloader.parentElement),(0,n.T2)((()=>{this.setManual()}))):this.detach();this.promise=e=null};e.then((()=>s(null))).catch((e=>s(e))),e.addNotifyListener&&e.addNotifyListener((e=>{if(t!==this.tempId)return;const i=e.done/e.total*100;this.setProgress(i)}))}attach(e,t=!1,i){this.construct&&this.construct(),this.preloader.parentElement&&this.preloader.classList.remove("manual"),this.detached=!1,i&&this.attachPromise(i);let n=0;(this.detached||this.preloader.parentElement!==e)&&(n=(0,r.Z)(this.preloader)?1:2,this.preloader.parentElement!==e&&e[this.attachMethod](this.preloader)),(0,s.Z)({element:this.preloader,className:"is-visible",forwards:!0,duration:200,useRafs:n}),this.cancelable&&t&&this.setProgress(0)}detach(){var e;this.detached||(this.detached=!0,(null===(e=this.preloader)||void 0===e?void 0:e.parentElement)&&(0,s.Z)({element:this.preloader,className:"is-visible",forwards:!1,duration:200,onTransitionEnd:()=>{this.preloader.remove()},useRafs:1}))}setProgress(e){if(this.totalLength||(0,r.Z)(this.circle))if(0!==e)try{this.totalLength||(this.totalLength=this.circle.getTotalLength()),this.circle.style.strokeDasharray=Math.max(5,e/100*this.totalLength)+", "+this.totalLength}catch(e){}else this.circle.style.strokeDasharray=""}}},9931:(e,t,i)=>{"use strict";i.d(t,{Z:()=>b,Y:()=>g});var s=i(4059),n=i(6740),a=i(5565),o=i(130),r=i(9674),d=i(5990),l=i(7256),c=i(1507),h=i(5798),u=i(3512),p=i(9345),f=i(319),m=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function g(e,t,i,o,d=new Image,l=!1){return m(this,void 0,void 0,(function*(){const l=yield u.Z.managers.acknowledged.appAvatarsManager.loadAvatar(t,i,o),c=l.result,h=l.cached;let p,m,v;if(d.classList.add("avatar-photo"),h)m=()=>{(0,a.Z)(e,d),e.dataset.color=""};else{const l=u.Z.settings.animationsEnabled;l&&d.classList.add("fade-in");let c=!1;if("photo_big"===o){const s=yield g(e,t,i,"photo_small");p=s.loadThumbPromise||s.loadPromise,v=s.thumbImage}else if(i.stripped_thumb){v=new Image,e.classList.add("avatar-relative"),v.classList.add("avatar-photo","avatar-photo-thumbnail");const t=(0,s.Z)(i.stripped_thumb);p=(0,n.cj)(v,t).then((()=>{c||(0,a.Z)(e,v)}))}m=()=>{c=!0,v?e.append(d):(0,a.Z)(e,d),setTimeout((()=>{e.childElementCount&&r.Z.mutateElement(d,(()=>{e.dataset.color="",l&&d.classList.remove("fade-in"),null==v||v.remove()}))}),l?200:0)}}const b=c.then((e=>(0,n.cj)(d,e))).then(m);return p&&(yield p.catch(f.Z)),{cached:h,loadPromise:b,loadThumbPromise:h?b:p||Promise.resolve(),thumbImage:v}}))}function v(e,t,i,s,n,a){(0,o.Z)(e,t),e.dataset.color=i,e.classList.remove("tgico-saved","tgico-deletedaccount","tgico-reply_filled","is-forum","is-topic"),s&&e.classList.add(s),n&&e.classList.add("is-forum"),a&&e.classList.add("is-topic")}function b({div:e,peerId:t,isDialog:i=!1,title:s="",onlyThumb:n=!1,isBig:a,threadId:o,wrapOptions:r={}}){var f,b;return m(this,void 0,void 0,(function*(){const m=u.Z.myId;if(t===m&&i)return void v(e,"","","tgico-saved");const y=u.Z.managers;if(o){const i=yield y.dialogsStorage.getForumTopic(t,o);return v(e,"","",void 0,void 0,!0),r.customEmojiSize&&e.style.setProperty("--size",r.customEmojiSize.width+"px"),(0,p.e)(Object.assign(Object.assign({},r),{topic:i,lazyLoadQueue:!1})).then((t=>{e.replaceChildren(t)}))}const w=yield y.appPeersManager.getPeer(t);if(t!==c.NM&&t.isUser()&&(null===(f=null==w?void 0:w.pFlags)||void 0===f?void 0:f.deleted))return void v(e,"",(0,d.Z)(t),"tgico-deletedaccount");const S=!!(null===(b=null==w?void 0:w.pFlags)||void 0===b?void 0:b.forum),C=a?"photo_big":"photo_small",L=(0,l.Z)(w),E=!!L,I=!!e.firstElementChild&&!e.firstElementChild.classList.contains("emoji");if(!E||!I||!(yield y.appAvatarsManager.isAvatarCached(t,C))){let n="";if(!t||t===m&&i||(n=(0,d.Z)(t)),t===c.hj)return void v(e,"",n,"tgico-reply_filled");const a=s?(0,h.Z)(s):function(e){var t;let i="";return e&&(i=null!==(t=e.title)&&void 0!==t?t:[e.first_name,e.last_name].filter(Boolean).join(" ")),(0,h.Z)(i)}(w);v(e,a,n,"",S)}return E?g(e,t,L,C,void 0,n):void 0}))}},279:(e,t,i)=>{"use strict";function s(e,t=!1){const i='\n \n \n ';if(t){const t=document.createElement("div");return t.classList.add("preloader"),t.innerHTML=i,e&&e.appendChild(t),t}return e.insertAdjacentHTML("beforeend",i),e.lastElementChild}function n(e,t="check"){return e.classList.remove("tgico-"+t),e.disabled=!0,s(e),()=>{e.innerHTML="",e.classList.add("tgico-"+t),e.removeAttribute("disabled")}}i.d(t,{p:()=>n,y:()=>s}),i(410).GO.putPreloader=s},1218:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(9750),n=i(2325),a=i(3855),o=i(3512);class r{constructor(e){const t=this.label=document.createElement("label");t.classList.add("radio-field"),e.alignRight&&t.classList.add("radio-field-right");const i=this.input=document.createElement("input");i.type="radio",i.name="input-radio-"+e.name,e.value&&(i.value=e.value,e.stateKey&&(a.Z.getState().then((t=>{i.checked=(0,s.Z)(t,e.stateKey)===e.value})),i.addEventListener("change",(()=>{o.Z.managers.appStateManager.setByKey(e.stateKey,e.value)}))));const r=this.main=document.createElement("div");r.classList.add("radio-field-main"),e.text?r.innerHTML=e.text:e.langKey&&(0,n.$d)(r,e.langKey),t.append(i,r)}get checked(){return this.input.checked}set checked(e){this.setValueSilently(e);const t=new Event("change",{bubbles:!0,cancelable:!0});this.input.dispatchEvent(t)}setValueSilently(e){this.input.checked=e}}},5133:(e,t,i)=>{"use strict";function s(e,t){const i=document.createElement("form");return e.forEach((e=>{const{container:s,input:n}=e;i.append(s),n.addEventListener("change",(e=>{n.checked&&t(n.value,e)}))})),i}i.d(t,{Z:()=>s})},65:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5077),n=i(3228),a=i(5953);class o{constructor(e,t=0){this.mousedown=!1,this.events={},this.withTransition=!1,this.useTransform=!1,this.vertical=!1,this.onMouseMove=e=>{this.scrub(e)},this.onMouseDown=e=>{var t;this.rect=this.container.getBoundingClientRect(),this.mousedown=!0,this.scrub(e),this.container.classList.add("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseDown)&&this.events.onMouseDown(e)},this.onMouseUp=e=>{var t;this.mousedown=!1,this.container.classList.remove("is-focused"),(null===(t=this.events)||void 0===t?void 0:t.onMouseUp)&&this.events.onMouseUp(e)},this.onInput=()=>{var e;const t=+this.seek.value;this.setFilled(t),(null===(e=this.events)||void 0===e?void 0:e.onScrub)&&this.events.onScrub(t)},(0,a.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("progress-line"),this.useTransform?this.container.classList.add("use-transform"):this.withTransition&&this.container.classList.add("with-transition"),this.filled=document.createElement("div"),this.filled.classList.add("progress-line__filled");const i=this.seek=document.createElement("input");i.classList.add("progress-line__seek"),i.type="range",i.step=""+this.step,i.min=""+this.min,i.max=""+this.max,i.value=""+t,t&&this.setProgress(t);const s=""+this.step,n=s.indexOf(".");this.decimals=-1===n?0:s.length-n-1,this.container.append(this.filled,i)}get value(){return+this.seek.value}setHandlers(e){this.events=e}setListeners(){this.seek.addEventListener("input",this.onInput),this._removeListeners=(0,s.Z)(this.container,this.onMouseDown,this.onMouseMove,this.onMouseUp)}setProgress(e){this.seek.value=""+e,this.setFilled(+this.seek.value)}addProgress(e){this.seek.value=""+(+this.seek.value+e),this.setFilled(+this.seek.value)}setFilled(e){let t=(e-this.min)/(this.max-this.min);t=(0,n.Z)(t,0,1),this.useTransform?this.filled.style.transform=`scaleX(${t})`:this.filled.style.width=100*t+"%"}scrub(e){var t;const i=this.vertical?this.rect.height:this.rect.width,s=(0,n.Z)(this.vertical?-(e.y-this.rect.bottom):e.x-this.rect.left,0,i);let a=this.min+s/i*(this.max-this.min);return a-this.min<(this.max-this.min)/2&&(a-=this.step/10),a=+a.toFixed(this.decimals),a=(0,n.Z)(a,this.min,this.max),this.setProgress(a),(null===(t=this.events)||void 0===t?void 0:t.onScrub)&&this.events.onScrub(a),a}removeListeners(){this._removeListeners&&(this._removeListeners(),this._removeListeners=null),this.seek.removeEventListener("input",this.onInput),this.events={}}}},1405:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(8497),n=i(9674),a=i(5432),o=i(3512),r=i(5975),d=i(3035);let l=0;function c(e,t=(()=>Promise.resolve()),i=null,c=!1,h=e){if(e.querySelector(".c-ripple"))return;e.classList.add("rp");const u=document.createElement("div");let p;u.classList.add("c-ripple"),e.classList.contains("rp-square")&&u.classList.add("is-square"),e[c?"prepend":"append"](u);const f=(e,s)=>{const o=Date.now(),r=document.createElement("div"),c=l++,h=1e3*+window.getComputedStyle(u).getPropertyValue("--ripple-duration").replace("s",""),f=p=()=>{const e=Date.now()-o,t=()=>{n.Z.mutate((()=>{r.remove()})),null==i||i(c)};if(er.classList.add("hiding")),Math.max(i-h/2,0)),setTimeout(t,i)}else r.classList.add("hiding"),setTimeout(t,h/2);a.Z||(window.removeEventListener("contextmenu",p),window.removeEventListener("mousemove",p)),p=null,g=!1};null==t||t(c),(0,d.T2)((()=>{if(f!==p)return;const t=u.getBoundingClientRect();r.classList.add("c-ripple__circle");const i=e-t.left,n=s-t.top,a=Math.sqrt(Math.pow(Math.abs(n-t.height/2)+t.height/2,2)+Math.pow(Math.abs(i-t.width/2)+t.width/2,2)),o=i-a/2,d=n-a/2;r.style.width=r.style.height=a+"px",r.style.left=o+"px",r.style.top=d+"px",u.append(r)}))},m=t=>t.target!==e&&(["BUTTON","A"].includes(t.target.tagName)||(0,s.Z)(t.target,"c-ripple")!==u)&&(h===e||!(0,r.Z)(t.target,h));let g=!1;if(a.Z){const e=()=>{null==p||p()};h.addEventListener("touchstart",(t=>{if(!o.Z.settings.animationsEnabled)return;if(t.touches.length>1||g||m(t))return;g=!0;const{clientX:i,clientY:s}=t.touches[0];f(i,s),h.addEventListener("touchend",e,{once:!0}),window.addEventListener("touchmove",(t=>{t.cancelBubble=!0,t.stopPropagation(),e(),h.removeEventListener("touchend",e)}),{once:!0})}),{passive:!0})}else h.addEventListener("mousedown",(e=>{if(![0,2].includes(e.button))return;if(!o.Z.settings.animationsEnabled)return;if("0"===h.dataset.ripple||m(e))return;if(g)return void(g=!1);const{clientX:t,clientY:i}=e;f(t,i),window.addEventListener("mouseup",p,{once:!0,passive:!0}),window.addEventListener("contextmenu",p,{once:!0,passive:!0})}),{passive:!0})}},7479:(e,t,i)=>{"use strict";i.d(t,{De:()=>g,ZC:()=>v,ZP:()=>f,tG:()=>m});var s=i(9807),n=i(1218),a=i(1405),o=i(5133),r=i(2325),d=i(5565),l=i(130),c=i(2738),h=i(4494),u=i(4531);const p=(e,t)=>{!0===t||("string"==typeof t?(0,l.Z)(e,t):e.append(t))};class f{constructor(e={}){this.freezed=!1,e.checkboxFieldOptions&&(e.checkboxField=new s.Z(Object.assign({listenerSetter:e.listenerSetter},e.checkboxFieldOptions)));const t=e.asLink?"a":e.radioField||e.checkboxField?"label":"div";if(this.container=document.createElement(t),this.container.classList.add("row","no-subtitle"),e.noWrap&&this.container.classList.add("no-wrap"),e.subtitle){const t=this.subtitle;if(p(t,e.subtitle),e.noWrap&&t.classList.add("no-wrap"),e.subtitleRight){this.container.append(this.subtitleRow=this.createRow()),this.subtitleRow.classList.add("row-subtitle-row");const i=this.subtitleRight=document.createElement("div");i.classList.add("row-subtitle","row-subtitle-right"),p(i,e.subtitleRight),this.subtitleRow.append(t,i)}}else e.subtitleLangKey&&this.subtitle.append((0,r.ag)(e.subtitleLangKey,e.subtitleLangArgs));let i=!!e.havePadding;if(e.radioField||e.checkboxField){if(e.radioField&&(this.radioField=e.radioField,this.container.append(this.radioField.label),i=!0),e.checkboxField){this.checkboxField=e.checkboxField;const t=e.checkboxField.label.classList.contains("checkbox-field-toggle");if(t?(this.container.classList.add("row-with-toggle"),e.titleRight=this.checkboxField.label):(i=!0,this.container.append(this.checkboxField.label)),e.withCheckboxSubtitle&&!t){const t=()=>{(0,d.Z)(this.subtitle,(0,r.ag)(this.checkboxField.input.checked?"Checkbox.Enabled":"Checkbox.Disabled"))};e.listenerSetter?e.listenerSetter.add(this.checkboxField.input)("change",t):this.checkboxField.input.addEventListener("change",t)}}(e.radioField||e.checkboxField).label.classList.add("disable-hover")}if(e.title||e.titleLangKey){let t;const i=e.titleRight||e.titleRightSecondary;if(i?(this.container.append(t=this.titleRow=this.createRow()),this.titleRow.classList.add("row-title-row")):t=this.container,this.title=this.createTitle(),e.noWrap&&this.title.classList.add("no-wrap"),e.title?p(this.title,e.title):e.titleLangKey&&this.title.append((0,r.ag)(e.titleLangKey)),t.append(this.title),i){const s=this.titleRight=document.createElement("div");s.classList.add("row-title","row-title-right"),e.titleRightSecondary&&s.classList.add("row-title-right-secondary"),p(s,i),t.append(s)}}e.icon&&(i=!0,this.container.classList.add("tgico","tgico-"+e.icon),this.container.classList.add("row-with-icon")),i&&this.container.classList.add("row-with-padding"),e.navigationTab&&(e.clickable=()=>e.navigationTab.open()),(e.clickable||e.radioField||e.checkboxField)&&("function"==typeof e.clickable&&(0,c.fc)(this.container,(t=>{this.freezed||e.clickable(t)}),{listenerSetter:e.listenerSetter}),this.container.classList.add("row-clickable","hover-effect"),e.noRipple||(0,a.Z)(this.container,void 0,void 0,!0)),(e.buttonRight||e.buttonRightLangKey)&&(this.buttonRight=e.buttonRight instanceof HTMLElement?e.buttonRight:(0,h.Z)("btn-primary btn-color-primary",{text:e.buttonRightLangKey}),this.container.append(this.buttonRight)),e.contextMenu&&(0,u.Z)(Object.assign(Object.assign({},e.contextMenu),{listenTo:this.container,listenerSetter:e.listenerSetter}))}get subtitle(){var e;return null!==(e=this._subtitle)&&void 0!==e?e:this._subtitle=this.createSubtitle()}get midtitle(){var e;return null!==(e=this._midtitle)&&void 0!==e?e:this._midtitle=this.createMidtitle()}createRow(){const e=document.createElement("div");return e.classList.add("row-row"),e}createTitle(){const e=document.createElement("div");return e.classList.add("row-title"),(0,l.m)(e),e}createSubtitle(){const e=document.createElement("div");return e.classList.add("row-subtitle"),(0,l.m)(e),this.title?this.title.after(e):this.container.prepend(e),this.container.classList.remove("no-subtitle"),e}createMidtitle(){const e=document.createElement("div");return e.classList.add("row-midtitle"),this.subtitle.parentElement.insertBefore(e,this.subtitle),e}createMedia(e){const t=document.createElement("div");return this.applyMediaElement(t,e)}applyMediaElement(e,t){return this.container.classList.add("row-with-padding"),this.media=e,e.classList.add("row-media"),t&&e.classList.add("row-media-"+t),this.container.append(e),e}disableWithPromise(e){this.container.classList.add("is-disabled"),e.finally((()=>{this.container.classList.remove("is-disabled")}))}makeSortable(){const e=document.createElement("span");this.container.classList.add("row-sortable","tgico"),e.classList.add("row-sortable-icon","tgico-menu"),this.container.append(e)}toggleSorting(e){this.container.classList.toggle("cant-sort",!e)}}const m=e=>new f({checkboxField:e,listenerSetter:e.listenerSetter}),g=(e,t)=>(0,o.Z)(e.map((e=>({container:e.container,input:e.radioField.input}))),t),v=(e,t)=>{const i="name-"+(8388607*Math.random()|0);let s;const a=e.map((({langPackKey:e,value:t,checked:a})=>{const o=new f({radioField:new n.Z({langKey:e,name:i,value:""+t})});return a&&(s=o.radioField),o})),o=g(a,t);return s&&(s.checked=!0),o}},8805:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>l,v7:()=>c});var s=i(5432),n=i(5003),a=i(4789),o=i(8594),r=i(3910);class d{constructor(e,t="",i=document.createElement("div")){this.el=e,this.container=i,this.onScrollMeasure=0,this.lastScrollPosition=0,this.lastScrollDirection=0,this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation=!1,this.onScroll=()=>{if(this.isHeavyAnimationInProgress)return this.cancelMeasure(),void(this.needCheckAfterAnimation=!0);(this.onScrolledTop||this.onScrolledBottom||this.splitUp||this.onAdditionalScroll)&&(this.onScrollMeasure||(this.onScrollMeasure=window.setTimeout((()=>{this.onScrollMeasure=0;const e=this.container[this.scrollProperty];this.lastScrollDirection=this.lastScrollPosition===e?0:this.lastScrollPositionthis.container.append(e))),e.append(this.container))}addScrollListener(){this.addedScrollListener||(this.addedScrollListener=!0,this.container.addEventListener("scroll",this.onScroll,{passive:!0,capture:!0}))}removeScrollListener(){this.addedScrollListener&&(this.addedScrollListener=!1,this.container.removeEventListener("scroll",this.onScroll,{capture:!0}))}setListeners(){this.removeHeavyAnimationListener||(window.addEventListener("resize",this.onScroll,{passive:!0}),this.addScrollListener(),this.removeHeavyAnimationListener=(0,o.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.onScrollMeasure&&(this.cancelMeasure(),this.needCheckAfterAnimation=!0)}),(()=>{this.isHeavyAnimationInProgress=!1,this.needCheckAfterAnimation&&(this.onScroll(),this.needCheckAfterAnimation=!1)})))}removeListeners(){this.removeHeavyAnimationListener&&(window.removeEventListener("resize",this.onScroll),this.removeScrollListener(),this.removeHeavyAnimationListener(),this.removeHeavyAnimationListener=void 0)}destroy(){this.removeListeners(),this.onAdditionalScroll=void 0,this.onScrolledTop=void 0,this.onScrolledBottom=void 0}append(e){this.container.append(e)}scrollIntoViewNew(e){return(0,a.Z)(Object.assign(Object.assign({},e),{container:this.container}))}cancelMeasure(){this.onScrollMeasure&&(clearTimeout(this.onScrollMeasure),this.onScrollMeasure=0)}}class l extends d{constructor(e,t="",i=300,s){super(e,t),this.onScrollOffset=i,this.loadedAll={top:!0,bottom:!1},this.checkForTriggers=()=>{if(!this.onScrolledTop&&!this.onScrolledBottom)return;if(this.isHeavyAnimationInProgress)return void this.onScroll();const e=this.container.scrollHeight;if(!e)return;const t=e-this.container.clientHeight,i=this.lastScrollPosition;this.onScrolledTop&&i<=this.onScrollOffset&&this.lastScrollDirection<=0&&this.onScrolledTop(),this.onScrolledBottom&&t-i<=this.onScrollOffset&&this.lastScrollDirection>=0&&this.onScrolledBottom()},this.container.classList.add("scrollable-y"),this.setListeners(),this.scrollProperty="scrollTop"}attachBorderListeners(e=this.container){const t=this.onAdditionalScroll;this.onAdditionalScroll=()=>{null==t||t(),e.classList.toggle("scrolled-top",!this.scrollTop),e.classList.toggle("scrolled-bottom",this.isScrolledDown)},e.classList.add("scrolled-top","scrolled-bottom","scrollable-y-bordered")}setVirtualContainer(e){this.splitUp=e,this.log("setVirtualContainer:",e,this)}prepend(...e){(this.splitUp||this.padding||this.container).prepend(...e)}append(...e){(this.splitUp||this.padding||this.container).append(...e)}getDistanceToEnd(){return this.scrollHeight-Math.round(this.scrollTop+this.container.offsetHeight)}get isScrolledDown(){return this.getDistanceToEnd()<=1}set scrollTop(e){this.container.scrollTop=e}get scrollTop(){return this.container.scrollTop}setScrollTopSilently(e){this.lastScrollPosition=e,this.ignoreNextScrollEvent(),this.scrollTop=e}ignoreNextScrollEvent(){this.removeHeavyAnimationListener&&(this.removeScrollListener(),this.container.addEventListener("scroll",(e=>{(0,r.Z)(e),this.addScrollListener()}),{capture:!0,passive:!1,once:!0}))}get scrollHeight(){return this.container.scrollHeight}}class c extends d{constructor(e,t="",i=300,n=15,a=document.createElement("div")){if(super(e,t,a),this.onScrollOffset=i,this.splitCount=n,this.container=a,this.container.classList.add("scrollable-x"),!s.Z){const e=e=>{!e.deltaX&&this.container.scrollWidth>this.container.clientWidth&&(this.container.scrollLeft+=e.deltaY/4,(0,r.Z)(e))};this.container.addEventListener("wheel",e,{passive:!1})}this.scrollProperty="scrollLeft"}}},5029:(e,t,i)=>{"use strict";i.d(t,{R:()=>r,Z:()=>o});var s=i(2325),n=i(36);const a="sidebar-left-section";class o{constructor(e={}){var t;const i=this.container=document.createElement("div");i.classList.add(a+"-container");const o=this.innerContainer=document.createElement("div");if(o.classList.add(a),e.noShadow&&o.classList.add("no-shadow"),e.fakeGradientDelimiter)o.append((0,n.G)()),o.classList.add("with-fake-delimiter");else if(e.noDelimiter)o.classList.add("no-delimiter");else{const e=document.createElement("hr");o.append(e)}const r=this.content=this.generateContentElement();if(e.name){const t=this.title=document.createElement("div");t.classList.add("sidebar-left-h2",a+"-name"),(0,s.XZ)({element:t,key:e.name,args:e.nameArgs}),r.append(t)}i.append(o);const d=null!==(t=e.caption)&&void 0!==t?t:e.captionOld;if(d){const t=this.caption=this.generateContentElement();t.classList.add(a+"-caption"),e.captionOld||i.append(t),!0!==d&&(0,s.XZ)({element:t,key:d,args:e.captionArgs})}}generateContentElement(){const e=document.createElement("div");return e.classList.add(a+"-content"),this.innerContainer.append(e),e}}const r=(e,t,i)=>{const s=new o({name:t,caption:i});return e.append(s.container),s.content}},4273:(e,t,i)=>{"use strict";i.d(t,{ir:()=>di,ZP:()=>hi});var s=i(4271),n=i(3512),a=i(5884),o=i(9331),r=i(8805),d=i(3607),l=i(3552),c=i(426),h=i(8130),u=i(503),p=i(187),f=i(2325),m=i(8119),g=i(3061),v=i(2738),b=i(5029);class y extends l._{constructor(){super(...arguments),this.uploadAvatar=null,this.isGeoChat=!1}init(e,t=!1){this.isGeoChat=t,this.peerIds=e,this.container.classList.add("new-group-container"),this.setTitle("NewGroup"),this.avatarEdit=new p.Z((e=>{this.uploadAvatar=e}));const i=new b.Z({}),n=document.createElement("div");n.classList.add("input-wrapper"),this.groupNameInputField=new u.ZP({label:"CreateGroup.NameHolder",maxLength:128}),this.groupLocationInputField=new u.ZP({label:"ChatLocation",name:"location",canBeEdited:!1}),n.append(this.groupNameInputField.container,this.groupLocationInputField.container),this.listenerSetter.add(this.groupNameInputField.input)("input",(()=>{let e=!!this.groupNameInputField.value.length&&!this.groupNameInputField.input.classList.contains("error");this.isGeoChat&&(e=e&&!!this.userLocationCoords&&!!this.userLocationAddress),this.nextBtn.classList.toggle("is-visible",!!e)})),this.nextBtn=(0,m.Z)({icon:"arrow_next"}),(0,v.fc)(this.nextBtn,(()=>{const e=this.groupNameInputField.value;let t;if(this.isGeoChat){if(!this.userLocationAddress||!this.userLocationCoords)return;t=this.managers.appChatsManager.createChannel({title:e,about:"",geo_point:Object.assign({_:"inputGeoPoint"},this.userLocationCoords),address:this.userLocationAddress,megagroup:!0}).then((e=>(this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),this.peerIds.length&&this.managers.appChatsManager.inviteToChannel(e,this.peerIds),e)))}else this.nextBtn.disabled=!0,t=this.managers.appChatsManager.createChat(e,this.peerIds.map((e=>e.toUserId()))).then((e=>(this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),e)));t&&t.then((e=>{this.close(),s.ZP.setInnerPeer({peerId:e.toPeerId(!0)})}))}),{listenerSetter:this.listenerSetter});const a=new b.Z({name:"Members",nameArgs:[this.peerIds.length]}),o=this.list=h.default.createChatList({new:!0});return a.content.append(o),i.content.append(this.avatarEdit.container,n),this.content.append(this.nextBtn),this.scrollable.append(i.container,a.container),t?(this.setTitle("NearbyCreateGroup"),this.groupLocationInputField.container.classList.remove("hide"),this.groupLocationInputField.setValueSilently(f.ZP.format("Loading",!0)),this.startLocating()):this.groupLocationInputField.container.classList.add("hide"),Promise.all(this.peerIds.map((e=>{return t=this,i=void 0,n=function*(){const{dom:t}=h.default.addDialogNew({peerId:e,container:this.list,rippleEnabled:!1,avatarSize:"abitbigger"});t.lastMessageSpan.append((0,g.Z)(yield this.managers.appUsersManager.getUser(e)))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n})))}onCloseAfterTimeout(){this.avatarEdit.clear(),this.uploadAvatar=null,this.groupNameInputField.value="",this.groupLocationInputField.container.classList.add("hide"),this.nextBtn.disabled=!1}startLocating(){navigator.geolocation.getCurrentPosition((e=>{this.userLocationCoords={lat:e.coords.latitude,long:e.coords.longitude};let t="https://nominatim.openstreetmap.org/reverse";t+="?lat="+e.coords.latitude,t+="&lon="+e.coords.longitude,t+="&format=json",t+="&addressdetails=1",t+="&accept-language=en",fetch(t).then((e=>e.json())).then((e=>{this.userLocationAddress=e.display_name,this.groupLocationInputField.setValueSilently(e.display_name)}))}),(e=>{e instanceof GeolocationPositionError?this.groupLocationInputField.setValueSilently("Location permission denied. Please retry later."):this.groupLocationInputField.setValueSilently("An error has occurred. Please retry later.")}))}}var w,S=i(6360),C=i(632),L=i(410),E=i(5322),I=i(4494),M=i(6024),P=i(7479),Z=i(5565),k=i(144);function T(e){const t=[],i={users:[],chats:[]},s={users:[],chats:[]};return e.forEach((e=>{switch(e._){case"privacyValueAllowAll":t.push(2);break;case"privacyValueDisallowAll":t.push(0);break;case"privacyValueAllowContacts":t.push(1);break;case"privacyValueAllowChatParticipants":i.chats.push(...e.chats);break;case"privacyValueAllowUsers":i.users.push(...e.users);break;case"privacyValueDisallowChatParticipants":s.chats.push(...e.chats);break;case"privacyValueDisallowUsers":s.users.push(...e.users)}})),{type:t[0],disallowPeers:s,allowPeers:i}}!function(e){e[e.Everybody=2]="Everybody",e[e.Contacts=1]="Contacts",e[e.Nobody=0]="Nobody"}(w||(w={}));const x=w;var A=i(1218),_=i(5670);class F{constructor(e){this.options=e,this.onRadioChange=e=>{e=+e,this.type=e;const t=this.options.captions[this.type],i=this.radioSection.caption;t?t instanceof HTMLElement?(0,Z.Z)(i,t):(0,f.$d)(i,t):i.innerHTML="",i.classList.toggle("hide",!t),this.exceptions&&(this.exceptions.get("allow").row.container.classList.toggle("hide",this.type===x.Everybody),this.exceptions.get("disallow").row.container.classList.toggle("hide",this.type===x.Nobody)),this.options.onRadioChange&&this.options.onRadioChange(e)},e.captions&&e.captions.reverse();const t=e.managers;this.radioSection=new b.Z({name:e.title,caption:!0}),this.radioRows=new Map;let i=[{type:x.Everybody,langKey:"PrivacySettingsController.Everbody"},{type:x.Contacts,langKey:"PrivacySettingsController.MyContacts"},{type:x.Nobody,langKey:"PrivacySettingsController.Nobody"}];e.skipTypes&&(i=i.filter((t=>!e.skipTypes.includes(t.type))));const s=(0,k.a)();i.forEach((({type:e,langKey:t})=>{const i=new P.ZP({radioField:new A.Z({langKey:t,name:s,value:""+e})});this.radioRows.set(e,i)}));const n=(0,P.De)([...this.radioRows.values()],this.onRadioChange);if(this.radioSection.content.append(n),e.appendTo&&e.appendTo.append(this.radioSection.container),!e.noExceptions){const t=(0,b.R)(e.appendTo,"PrivacyExceptions","PrivacySettingsController.PeerInfo");this.exceptions=new Map([["disallow",{titleLangKey:e.exceptionTexts[0],key:"disallow",row:null,icon:"deleteuser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}],["allow",{titleLangKey:e.exceptionTexts[1],key:"allow",row:null,icon:"adduser",subtitleLangKey:"PrivacySettingsController.AddUsers",clickable:!0}]]),this.exceptions.forEach((i=>{i.row=new P.ZP(i),i.row.container.addEventListener("click",(()=>{a.then((()=>{const t=this.peerIds[i.key];e.tab.slider.createTab(_.Z).open({type:"privacy",skippable:!0,title:i.titleLangKey,placeholder:"PrivacyModal.Search.Placeholder",takeOut:e=>{t.length=0,t.push(...e),i.row.subtitle.innerHTML="",i.row.subtitle.append(...this.generateStr(this.splitPeersByType(e)))},selectedPeerIds:t})}))})),t.append(i.row.container)}))}const a=t.appPrivacyManager.getPrivacy(e.inputKey).then((i=>{const s=T(i);this.setRadio(s.type),this.exceptions&&(this.peerIds={},["allow","disallow"].forEach((e=>{const t=[],i="allow"===e?s.allowPeers:s.disallowPeers;t.push(...i.users.map((e=>e.toPeerId()))),t.push(...i.chats.map((e=>e.toPeerId(!0)))),this.peerIds[e]=t;const n=this.exceptions.get(e).row.subtitle;n.innerHTML="",n.append(...this.generateStr(i))}))),e.tab.eventListener.addEventListener("destroy",(()=>{return i=this,s=void 0,a=function*(){const i=[];switch(this.type){case x.Everybody:i.push({_:"inputPrivacyValueAllowAll"});break;case x.Contacts:i.push({_:"inputPrivacyValueAllowContacts"});break;case x.Nobody:i.push({_:"inputPrivacyValueDisallowAll"})}if(this.exceptions){const e=[["allow","inputPrivacyValueAllowChatParticipants","inputPrivacyValueAllowUsers"],["disallow","inputPrivacyValueDisallowChatParticipants","inputPrivacyValueDisallowUsers"]];for(const[s,n,a]of e){if(this.exceptions.get(s).row.container.classList.contains("hide"))continue;const e=this.peerIds[s];if(e){const s=this.splitPeersByType(e);s.chats.length&&i.push({_:n,chats:s.chats}),s.users.length&&i.push({_:a,users:yield Promise.all(s.users.map((e=>t.appUsersManager.getUserInput(e))))})}}}t.appPrivacyManager.setPrivacy(e.inputKey,i)},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}),{once:!0})}))}setRadio(e){const t=this.radioRows.get(e);this.onRadioChange(e),t.radioField.input.checked=!0}splitPeersByType(e){const t={users:[],chats:[]};return e.forEach((e=>{t[e.isAnyChat()?"chats":"users"].push(e.isAnyChat()?e.toChatId():e)})),t}generateStr(e){return e.users.length||e.chats.length?(0,f.v_)([e.users.length?(0,f.ag)("Users",[e.users.length]):null,e.chats.length?(0,f.ag)("Chats",[e.chats.length]):null].filter(Boolean),!1):[(0,f.ag)("PrivacySettingsController.AddUsers")]}}var D=i(3532);class R extends M.h{init(){return e=this,t=void 0,s=function*(){this.container.classList.add("privacy-tab","privacy-phone-number"),this.setTitle("PrivacyPhone");const e="+"+(yield this.managers.appUsersManager.getSelf()).phone,t=document.createElement("div");t.append((0,f.ag)("PrivacyPhoneInfo"),document.createElement("br"),document.createElement("br"),(0,f.ag)("PrivacyPhoneInfo4"),document.createElement("br"),(0,D.Z)({mePath:e}));const i=new F({tab:this,title:"PrivacyPhoneTitle",inputKey:"inputPrivacyKeyPhoneNumber",captions:[t,t,""],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,onRadioChange:e=>{n.setRadio(x.Everybody),n.radioSection.container.classList.toggle("hide",e!==x.Nobody)},managers:this.managers}),s="PrivacyPhoneInfo3",n=new F({tab:this,title:"PrivacyPhoneTitle2",inputKey:"inputPrivacyKeyAddedByPhone",captions:[s,s,""],noExceptions:!0,skipTypes:[x.Nobody],managers:this.managers});this.scrollable.container.insertBefore(n.radioSection.container,i.radioSection.container.nextSibling)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var B=i(8127),N=i(5772),O=i(279);class U extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-set"),this.setTitle("TwoStepVerificationPasswordSet");const e=new b.Z({captionOld:"TwoStepVerificationPasswordSetInfo",noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({emoji:"🥳",div:t,width:160,height:160}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=(0,I.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationPasswordReturnSettings"});(0,v.fc)(n,(e=>{this.close()})),this.slider.sliceTabsUntilTab(Ht,this),s.append(n),i.append(s),this.scrollable.container.append(e.container)}}var H=i(4489),z=i(4762);function j(e){return!z.IS_MOBILE_SAFARI||!e}var G=i(1656);class V extends l._{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email-confirmation"),this.setTitle("TwoStepAuth.RecoveryTitle");const e=new b.Z({captionOld:!0,noDelimiter:!0});(0,f.$d)(e.caption,"TwoStepAuth.ConfirmEmailCodeDesc",[this.email]);const t=document.createElement("div");(0,N.Z)({div:t,width:160,height:160,emoji:"📬"}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=this.codeInputField=new H.Z({name:"recovery-email-code",label:"TwoStepAuth.RecoveryCode",length:this.length,onFill:e=>{d(!0),this.managers.passwordManager.confirmPasswordEmail(""+e).then((e=>{r()})).catch((e=>{switch(e.type){case"CODE_INVALID":n.input.classList.add("error"),(0,Z.Z)(n.label,(0,f.ag)("TwoStepAuth.RecoveryCodeInvalid"));break;case"EMAIL_HASH_EXPIRED":n.input.classList.add("error"),(0,Z.Z)(n.label,(0,f.ag)("TwoStepAuth.RecoveryCodeExpired"));break;default:console.error("confirm error",e)}d(!1)}))}}),a=(0,I.Z)("btn-primary btn-primary-transparent primary",{text:"TwoStepAuth.EmailCodeChangeEmail"}),o=(0,I.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"ResendCode"}),r=()=>{this.slider.createTab(U).open()},d=e=>{(0,G.Z)([n.input,a,o],e)};(0,v.fc)(a,(e=>{d(!0),this.managers.passwordManager.cancelPasswordEmail().then((e=>{this.slider.sliceTabsUntilTab($,this),this.close()}),(()=>{d(!1)}))})),(0,v.fc)(o,(e=>{d(!0);const t=(0,O.y)(o);this.managers.passwordManager.resendPasswordEmail().then((e=>{t.remove(),d(!1)}))})),s.append(n.container,a,o),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){j(this.isFirst)&&this.codeInputField.input.focus()}}var K=i(3910),W=i(1171);class $ extends l._{constructor(){super(...arguments),this.isFirst=!1}init(){this.container.classList.add("two-step-verification","two-step-verification-email"),this.setTitle("RecoveryEmailTitle");const e=new b.Z({captionOld:!0,noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({div:t,width:160,height:160,emoji:"💌"}),e.content.append(t);const i=e.generateContentElement(),s=document.createElement("div");s.classList.add("input-wrapper");const n=this.inputField=new u.ZP({name:"recovery-email",label:"RecoveryEmail",plainText:!0});n.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,K.Z)(e),d()})),n.input.addEventListener("input",(e=>{n.input.classList.remove("error")}));const a=(0,I.Z)("btn-primary btn-color-primary",{text:"Continue"}),o=(0,I.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),r=()=>{this.slider.createTab(U).open()},d=()=>{const e=n.value.trim(),t=(0,W.Z)(e);if(!t||t[0].length!==e.length)return void n.input.classList.add("error");l(!0);const i=(0,O.y)(a);this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:e}).then((e=>{r()}),(t=>{if(t.type.includes("EMAIL_UNCONFIRMED")){const i=+t.type.match(/^EMAIL_UNCONFIRMED_(\d+)/)[1],s=this.slider.createTab(V);s.state=this.state,s.email=e,s.length=i,s.open()}else console.log("password set error",t);l(!1),i.remove()}))};(0,v.fc)(a,d);const l=e=>{e?(a.setAttribute("disabled","true"),o.setAttribute("disabled","true")):(a.removeAttribute("disabled"),o.removeAttribute("disabled"))};(0,v.fc)(o,(e=>{new B.Z("popup-skip-email",{buttons:[{langKey:"Cancel",isCancel:!0},{langKey:"YourEmailSkip",callback:()=>{l(!0),(0,O.y)(o),this.managers.passwordManager.updateSettings({hint:this.hint,currentPassword:this.plainPassword,newPassword:this.newPassword,email:""}).then((()=>{r()}),(e=>{l(!1)}))},isDanger:!0}],titleLangKey:"YourEmailSkipWarning",descriptionLangKey:"YourEmailSkipWarningText"}).show()})),s.append(n.container,a,o),i.append(s),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){j(this.isFirst)&&this.inputField.input.focus()}}var q=i(130),Q=i(8115),Y=i(4425),X=i(6830),J=i(3083),ee=i(2796);class te extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-hint"),this.setTitle("TwoStepAuth.SetupHintTitle");const e=new b.Z({noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({div:t,width:160,height:160,emoji:"💡"}),e.content.append(t);const i=document.createElement("div");i.classList.add("input-wrapper");const s=this.inputField=new u.ZP({name:"hint",label:"TwoStepAuth.SetupHintPlaceholder"});s.input.addEventListener("keypress",(e=>{if("Enter"===e.key)return(0,K.Z)(e),s.value?r():d()}));const n=(e,t)=>{e&&(0,K.Z)(e);const i=t?s.value:void 0;if(i&&this.newPassword===i)return void(0,ee.Am)(f.ZP.format("PasswordAsHintError",!0));const n=this.slider.createTab($);n.state=this.state,n.plainPassword=this.plainPassword,n.newPassword=this.newPassword,n.hint=i,n.open()},a=(0,I.Z)("btn-primary btn-color-primary",{text:"Continue"}),o=(0,I.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"YourEmailSkip"}),r=e=>n(e,!0),d=e=>n(e,!1);(0,v.fc)(a,r),(0,v.fc)(o,d),i.append(s.container,a,o),e.content.append(i),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){this.inputField.input.focus()}}class ie extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-enter-password","two-step-verification-re-enter-password"),this.setTitle("PleaseReEnterPassword");const e=new b.Z({noDelimiter:!0}),t=document.createElement("div");t.classList.add("input-wrapper");const i=this.passwordInputField=new X.Z({name:"re-enter-password",label:"PleaseReEnterPassword"}),s=new J.Z(i,157),n=(0,I.Z)("btn-primary btn-color-primary",{text:"Continue"});t.append(i.container,n),e.content.append(s.container,t),this.scrollable.container.append(e.container),i.input.addEventListener("keypress",(e=>{if(i.input.classList.contains("error")&&i.setState(u.I1.Neutral),"Enter"===e.key)return o()}));const a=()=>this.newPassword===i.value||(i.setError(),!1),o=e=>{if(e&&(0,K.Z)(e),!a())return;const t=this.slider.createTab(te);t.state=this.state,t.plainPassword=this.plainPassword,t.newPassword=this.newPassword,t.open()};return(0,v.fc)(n,o),s.load()}onOpenAfterTimeout(){this.passwordInputField.input.focus()}}class se extends l._{constructor(){super(...arguments),this.isFirst=!0}init(){const e=!this.state.pFlags.has_password||this.plainPassword;this.container.classList.add("two-step-verification","two-step-verification-enter-password"),this.setTitle(e?"PleaseEnterFirstPassword":"PleaseEnterCurrentPassword");const t=new b.Z({noDelimiter:!0}),i=document.createElement("div");i.classList.add("input-wrapper");const s=this.passwordInputField=new X.Z({name:"enter-password",label:e?"PleaseEnterFirstPassword":this.state.hint?void 0:"LoginPassword",labelText:!e&&this.state.hint?(0,Q.Z)(this.state.hint):void 0}),n=new Y.Z(s,157),a=(0,I.Z)("btn-primary btn-color-primary"),o=new f.ZP.IntlElement({key:"Continue"});a.append(o.element),i.append(s.container,a),t.content.append(n.container,i),this.scrollable.container.append(t.container),s.input.addEventListener("keypress",(e=>{if(s.input.classList.contains("error")&&(s.input.classList.remove("error"),o.key="Continue",o.update()),"Enter"===e.key)return d()}));const r=()=>!!s.value.length||(s.input.classList.add("error"),!1);let d;if(e)d=e=>{if(e&&(0,K.Z)(e),!r())return;const t=this.slider.createTab(ie);t.state=this.state,t.newPassword=s.value,t.plainPassword=this.plainPassword,t.open()};else{let e;const t=()=>(e||(e=window.setInterval(t,1e4)),this.managers.passwordManager.getState().then((e=>{this.state=e,this.state.hint?(0,q.Z)(s.label,(0,Q.Z)(this.state.hint)):(0,Z.Z)(s.label,(0,f.ag)("LoginPassword"))})));d=i=>{if(!r())return void(0,K.Z)(i);a.setAttribute("disabled","true"),o.key="PleaseWait",o.update();const d=(0,O.y)(a),l=s.value;this.managers.passwordManager.check(s.value,this.state).then((t=>{if(console.log(t),"auth.authorization"===t._){clearInterval(e),n&&n.remove();const t=this.slider.createTab(ne);t.state=this.state,t.plainPassword=l,t.open(),this.slider.removeTabFromHistory(this)}}),(e=>{a.removeAttribute("disabled"),s.input.classList.add("error"),e.type,o.key="PASSWORD_HASH_INVALID",o.update(),d.remove(),s.select(),t()}))},t()}return(0,v.fc)(a,d),n.load()}onOpenAfterTimeout(){j(this.isFirst)&&this.passwordInputField.input.focus()}}class ne extends l._{init(){this.container.classList.add("two-step-verification","two-step-verification-main"),this.setTitle("TwoStepVerificationTitle");const e=new b.Z({captionOld:!0,noDelimiter:!0}),t=document.createElement("div");(0,N.Z)({div:t,width:168,height:168,emoji:"🔐"}),e.content.append(t);const i=e.generateContentElement();if(this.state.pFlags.has_password){(0,f.$d)(e.caption,"TwoStepAuth.GenericHelp");const t=(0,I.Z)("btn-primary btn-transparent",{icon:"edit",text:"TwoStepAuth.ChangePassword"}),s=(0,I.Z)("btn-primary btn-transparent",{icon:"passwordoff",text:"TwoStepAuth.RemovePassword"}),n=(0,I.Z)("btn-primary btn-transparent",{icon:"email",text:this.state.pFlags.has_recovery?"TwoStepAuth.ChangeEmail":"TwoStepAuth.SetupEmail"});(0,v.fc)(t,(()=>{const e=this.slider.createTab(se);e.state=this.state,e.plainPassword=this.plainPassword,e.open()})),(0,v.fc)(s,(()=>{new B.Z("popup-disable-password",{buttons:[{langKey:"Disable",callback:()=>{this.managers.passwordManager.updateSettings({currentPassword:this.plainPassword}).then((()=>{this.slider.sliceTabsUntilTab(Ht,this),this.close()}))},isDanger:!0}],titleLangKey:"TurnPasswordOffQuestionTitle",descriptionLangKey:"TurnPasswordOffQuestion"}).show()})),(0,v.fc)(n,(()=>{const e=this.slider.createTab($);e.state=this.state,e.hint=this.state.hint,e.plainPassword=this.plainPassword,e.newPassword=this.plainPassword,e.isFirst=!0,e.open()})),i.append(t,s,n)}else{(0,f.$d)(e.caption,"TwoStepAuth.SetPasswordHelp");const t=document.createElement("div");t.classList.add("input-wrapper");const s=(0,I.Z)("btn-primary btn-color-primary",{text:"TwoStepVerificationSetPassword"});t.append(s),i.append(t),(0,v.fc)(s,(e=>{const t=this.slider.createTab(se);t.state=this.state,t.open()}))}this.scrollable.container.append(e.container)}}class ae extends M.h{init(){this.container.classList.add("privacy-tab","privacy-last-seen"),this.setTitle("PrivacyLastSeen");const e="PrivacySettingsController.LastSeenDescription";new F({tab:this,title:"LastSeenTitle",inputKey:"inputPrivacyKeyStatusTimestamp",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,managers:this.managers})}}class oe extends M.h{init(){this.container.classList.add("privacy-tab","privacy-profile-photo"),this.setTitle("PrivacyProfilePhoto");const e="PrivacySettingsController.ProfilePhoto.CustomHelp";new F({tab:this,title:"PrivacyProfilePhotoTitle",inputKey:"inputPrivacyKeyProfilePhoto",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,skipTypes:[x.Nobody],managers:this.managers})}}class re extends M.h{init(){this.container.classList.add("privacy-tab","privacy-forward-messages"),this.setTitle("PrivacySettings.Forwards");const e="PrivacySettingsController.Forwards.CustomHelp";new F({tab:this,title:"PrivacyForwardsTitle",inputKey:"inputPrivacyKeyForwards",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}class de extends M.h{init(){this.container.classList.add("privacy-tab","privacy-add-to-groups"),this.setTitle("PrivacySettings.Groups");const e="PrivacySettingsController.GroupDescription";new F({tab:this,title:"WhoCanAddMe",inputKey:"inputPrivacyKeyChatInvite",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,skipTypes:[x.Nobody],managers:this.managers})}}class le extends M.h{init(){this.container.classList.add("privacy-tab","privacy-calls"),this.setTitle("PrivacySettings.VoiceCalls");const e="PrivacySettingsController.PhoneCallDescription";new F({tab:this,title:"WhoCanCallMe",inputKey:"inputPrivacyKeyPhoneCall",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers});{const e="PrivacySettingsController.P2p.Desc";new F({tab:this,title:"PrivacyP2PHeader",inputKey:"inputPrivacyKeyPhoneP2P",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}}var ce=i(3003),he=i(8497),ue=i(4064),pe=i(6976),fe=i(1483),me=i(3416);class ge extends M.h{init(){this.container.classList.add("active-sessions-container"),this.setTitle("SessionsTitle");const e=e=>{const t=new P.ZP({title:[e.app_name,e.app_version].join(" "),subtitle:[e.ip,e.country].join(" - "),clickable:!0,titleRight:e.pFlags.current?void 0:(0,C.zM)(new Date(1e3*Math.max(e.date_active,e.date_created)))});return t.container.dataset.hash=""+e.hash,t.midtitle.textContent=[e.device_model,e.system_version||e.platform].filter(Boolean).join(", "),t},t=this.authorizations.slice();{const n=new b.Z({name:"CurrentSession",caption:"ClearOtherSessionsHelp"}),a=(0,ue.Z)(t,(e=>e.pFlags.current)),o=e(a);if(n.content.append(o.container),t.length){const e=(0,I.Z)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllSessions"});(0,v.fc)(e,(t=>{new B.Z("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{const t=(0,G.Z)([e],!0);this.managers.apiManager.invokeApi("auth.resetAuthorizations").then((t=>{e.remove(),i.container.remove()}),s).finally((()=>{t()}))}}],titleLangKey:"AreYouSureSessionsTitle",descriptionLangKey:"AreYouSureSessions"}).show()}),{listenerSetter:this.listenerSetter}),n.content.append(e)}this.scrollable.append(n.container)}if(!t.length)return;const i=new b.Z({name:"OtherSessions",caption:"SessionsListInfo"});t.forEach((t=>{i.content.append(e(t).container)})),this.scrollable.append(i.container);const s=e=>{"FRESH_RESET_AUTHORISATION_FORBIDDEN"===e.type&&(0,ee.Am)(f.ZP.format("RecentSessions.Error.FreshReset",!0))};let n;const a=()=>{const e=n.dataset.hash;new B.Z("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{this.managers.apiManager.invokeApi("account.resetAuthorization",{hash:e}).then((e=>{e&&n.remove()}),s)}}],titleLangKey:"AreYouSureSessionTitle",descriptionLangKey:"TerminateSessionText"}).show()},o=this.menuElement=(0,ce.b)({buttons:[{icon:"stop",text:"Terminate",onClick:a}]});o.id="active-sessions-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),(0,pe.E)({element:this.scrollable.container,callback:e=>{n=(0,he.Z)(e.target,"row"),n&&"0"!==n.dataset.hash&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),(0,fe.Z)(e,o),me.Z.openBtnMenu(o))},listenerSetter:this.listenerSetter}),(0,v.fc)(this.scrollable.container,(e=>{n=(0,he.Z)(e.target,"row"),n&&"0"!==n.dataset.hash&&a()}),{listenerSetter:this.listenerSetter})}onCloseAfterTimeout(){var e;return null===(e=this.menuElement)||void 0===e||e.remove(),super.onCloseAfterTimeout()}}var ve=i(2995),be=i(4668),ye=i(8210),we=i(5102);class Se extends l._{init(){this.container.classList.add("blocked-users-container"),this.setTitle("BlockedUsers");const e=new b.Z({caption:"BlockedUsersInfo"});e.caption.parentElement.prepend(e.caption),this.scrollable.append(e.container);const t=(0,m.Z)({icon:"add",className:"is-visible"});this.content.append(t),(0,v.fc)(t,(e=>{new ve.Z({peerTypes:["contacts"],placeholder:"BlockModal.Search.Placeholder",onSelect:e=>{this.managers.appUsersManager.toggleBlock(e,!0)}})}),{listenerSetter:this.listenerSetter});const i=h.default.createChatList();this.scrollable.container.classList.add("chatlist-container"),e.content.append(i);const s=(e,t)=>{return s=this,n=void 0,o=function*(){const{dom:s}=h.default.addDialogNew({peerId:e,container:i,rippleEnabled:!0,avatarSize:"abitbigger",append:t}),n=yield this.managers.appUsersManager.getUser(e.toUserId());if(!n)return;const a=(0,we.Z)(n)[0];n.pFlags.bot?s.lastMessageSpan.append("@"+a):n.phone?s.lastMessageSpan.innerHTML=(0,ye.Z)(n.phone):s.lastMessageSpan.append(a?"@"+a:(0,g.Z)(n))},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}d((o=o.apply(s,n||[])).next())}));var s,n,a,o};for(const e of this.peerIds)s(e,!0);let a;const o=this.menuElement=(0,ce.b)({buttons:[{icon:"lockoff",text:"Unblock",onClick:()=>{const e=a.dataset.peerId.toPeerId();this.managers.appUsersManager.toggleBlock(e,!1)},options:{listenerSetter:this.listenerSetter}}]});o.id="blocked-users-contextmenu",o.classList.add("contextmenu"),document.getElementById("page-chats").append(o),(0,pe.E)({element:this.scrollable.container,callback:e=>{a=(0,be.Z)(e.target,h.DIALOG_LIST_ELEMENT_TAG),a&&(e instanceof MouseEvent&&e.preventDefault(),e instanceof MouseEvent&&(e.cancelBubble=!0),(0,fe.Z)(e,o),me.Z.openBtnMenu(o))},listenerSetter:this.listenerSetter}),this.listenerSetter.add(n.Z)("peer_block",(e=>{const{peerId:t,blocked:n}=e,a=i.querySelector(`[data-peer-id="${t}"]`);n?a||s(t,!1):a&&a.remove()}));let r=!1;this.scrollable.onScrolledBottom=()=>{r||(r=!0,this.managers.appUsersManager.getBlocked(i.childElementCount,50).then((e=>{for(const t of e.peerIds)s(t,!0);(e.peerIds.length<50||i.childElementCount===e.count)&&(this.scrollable.onScrolledBottom=null),this.scrollable.checkForTriggers()})).finally((()=>{r=!1})))}}onOpenAfterTimeout(){this.scrollable.onScroll()}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}var Ce=i(9807);function Le(e){return"input"+(e[0].toUpperCase()+e.slice(1))}var Ee=i(5592),Ie=i(319);class Me extends M.h{init(){this.container.classList.add("privacy-tab","privacy-voices"),this.setTitle("PrivacyVoiceMessages");const e="PrivacyVoiceMessagesInfo";new F({tab:this,title:"PrivacyVoiceMessagesTitle",inputKey:"inputPrivacyKeyVoiceMessages",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,managers:this.managers})}}var Pe=i(7362),Ze=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class ke extends M.h{init(e){return Ze(this,void 0,void 0,(function*(){this.container.classList.add("active-sessions-container"),this.setTitle("WebSessionsTitle");const t=e=>Ze(this,void 0,void 0,(function*(){const t=e.bot_id.toPeerId(),i=new P.ZP({title:yield(0,Pe.Z)({peerId:t}),subtitle:[e.ip,e.region].join(" - "),clickable:!0,titleRight:(0,C.zM)(new Date(1e3*Math.max(e.date_active,e.date_created)))}),s=i.createMedia("big"),n=new o.Z;return n.classList.add("avatar-48"),yield n.updateWithOptions({peerId:t}),s.append(n),i.container.dataset.hash=""+e.hash,i.container.dataset.peerId=""+t,i.midtitle.textContent=[e.domain,e.browser,e.platform].filter(Boolean).join(", "),i}));{const e=new b.Z({caption:"ClearOtherWebSessionsHelp"}),t=(0,I.Z)("btn-primary btn-transparent danger",{icon:"stop",text:"TerminateAllWebSessions"});(0,v.fc)(t,(()=>Ze(this,void 0,void 0,(function*(){yield(0,Ee.Z)({descriptionLangKey:"AreYouSureWebSessions",button:{langKey:"Disconnect",isDanger:!0}}),(0,G.Z)([t],!0),this.managers.appSeamlessLoginManager.resetWebAuthorizations().then((()=>{this.close()}))}))),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}{const i=new b.Z({name:"OtherWebSessions",caption:"TerminateWebSessionInfo"}),s=yield Promise.all(e.map(t));i.content.append(...s.map((e=>e.container)));let n=s.length;(0,v.fc)(i.content,(e=>Ze(this,void 0,void 0,(function*(){const t=(0,he.Z)(e.target,"row");if(!t)return;yield(0,Ee.Z)({descriptionLangKey:"TerminateWebSessionText",descriptionLangArgs:[yield(0,Pe.Z)({peerId:t.dataset.peerId.toPeerId()})],button:{langKey:"Disconnect",isDanger:!0}});const i=t.dataset.hash;t.classList.add("is-disabled"),this.managers.appSeamlessLoginManager.resetWebAuthorization(i).then((()=>{--n?t.remove():this.close()}))}))),{listenerSetter:this.listenerSetter}),this.scrollable.append(i.container)}}))}}class Te extends M.h{static getInitArgs(e){return{appConfig:e.managers.apiManager.getAppConfig(),globalPrivacy:e.managers.appPrivacyManager.getGlobalPrivacySettings(),contentSettings:e.managers.apiManager.invokeApi("account.getContentSettings"),webAuthorizations:e.managers.appSeamlessLoginManager.getWebAuthorizations()}}init(e){this.container.classList.add("dont-u-dare-block-me"),this.setTitle("PrivacySettings");const t="Loading",i=[];{const s=new b.Z({noDelimiter:!0,caption:"SessionsInfo"});let a;const o=new P.ZP({icon:"deleteuser",titleLangKey:"BlockedUsers",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(Se);e.peerIds=a,e.open()},listenerSetter:this.listenerSetter});let r;o.freezed=!0;const d={icon:"lock",titleLangKey:"TwoStepVerification",subtitleLangKey:t,clickable:e=>{let t;r.pFlags.has_password?t=this.slider.createTab(se):r.email_unconfirmed_pattern?(t=this.slider.createTab(V),t.email=r.email_unconfirmed_pattern,t.length=6,t.isFirst=!0,this.managers.passwordManager.resendPasswordEmail()):t=this.slider.createTab(ne),t.state=r,t.open()},listenerSetter:this.listenerSetter},l=new P.ZP(d);l.freezed=!0;const c=this.activeSessionsRow=new P.ZP({icon:"activesessions",titleLangKey:"SessionsTitle",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(ge);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.updateActiveSessions()}),{once:!0}),e.open()},listenerSetter:this.listenerSetter});c.freezed=!0;const h=this.websitesRow=new P.ZP({icon:"mention",titleLangKey:"OtherWebSessions",subtitleLangKey:t,clickable:()=>{const e=this.slider.createTab(ke);e.eventListener.addEventListener("destroy",(()=>{this.updateActiveWebsites()})),e.open(this.websites)},listenerSetter:this.listenerSetter});h.freezed=!0,s.content.append(o.container,l.container,c.container,h.container),this.scrollable.append(s.container);const u=e=>{e?(0,Z.Z)(o.subtitle,(0,f.ag)("PrivacySettingsController.UserCount",[e])):(0,Z.Z)(o.subtitle,(0,f.ag)("BlockedEmpty",[e]))};this.listenerSetter.add(n.Z)("peer_block",(()=>{p()}));const p=()=>{this.managers.appUsersManager.getBlocked().then((e=>{o.freezed=!1,u(e.count),a=e.peerIds}))};p(),this.managers.passwordManager.getState().then((e=>{r=e,(0,Z.Z)(l.subtitle,(0,f.ag)(e.pFlags.has_password?"PrivacyAndSecurity.Item.On":"PrivacyAndSecurity.Item.Off")),l.freezed=!1})),this.updateActiveSessions(),i.push(this.updateActiveWebsites(e.webAuthorizations))}{const e=new b.Z({name:"PrivacyTitle",caption:"GroupsAndChannelsHelp"});e.content.classList.add("privacy-navigation-container");const i={},s=i.inputPrivacyKeyPhoneNumber=new P.ZP({titleLangKey:"PrivacyPhoneTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(R).open()},listenerSetter:this.listenerSetter}),a=i.inputPrivacyKeyStatusTimestamp=new P.ZP({titleLangKey:"LastSeenTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(ae).open()},listenerSetter:this.listenerSetter}),o=i.inputPrivacyKeyProfilePhoto=new P.ZP({titleLangKey:"PrivacyProfilePhotoTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(oe).open()},listenerSetter:this.listenerSetter}),r=i.inputPrivacyKeyPhoneCall=new P.ZP({titleLangKey:"WhoCanCallMe",subtitleLangKey:t,clickable:()=>{this.slider.createTab(le).open()},listenerSetter:this.listenerSetter}),d=i.inputPrivacyKeyForwards=new P.ZP({titleLangKey:"PrivacyForwardsTitle",subtitleLangKey:t,clickable:()=>{this.slider.createTab(re).open()},listenerSetter:this.listenerSetter}),l=i.inputPrivacyKeyChatInvite=new P.ZP({titleLangKey:"WhoCanAddMe",subtitleLangKey:t,clickable:()=>{this.slider.createTab(de).open()},listenerSetter:this.listenerSetter}),c=i.inputPrivacyKeyVoiceMessages=new P.ZP({titleLangKey:"PrivacyVoiceMessagesTitle",subtitleLangKey:t,clickable:()=>{n.Z.premium?this.slider.createTab(Me).open():(0,ee.bC)({langPackKey:"PrivacyVoiceMessagesPremiumOnly"})},listenerSetter:this.listenerSetter}),h=e=>{const t=i[e];t&&this.managers.appPrivacyManager.getPrivacy(e).then((e=>{const i=T(e),s=i.type===x.Everybody?"PrivacySettingsController.Everbody":i.type===x.Contacts?"PrivacySettingsController.MyContacts":"PrivacySettingsController.Nobody",n=i.disallowPeers.users.length+i.disallowPeers.chats.length,a=i.allowPeers.users.length+i.allowPeers.chats.length;t.subtitle.innerHTML="";const o=(0,f.ag)(s);t.subtitle.append(o),(n||a)&&t.subtitle.append(` (${[-n,a?"+"+a:0].filter(Boolean).join(", ")})`)}))};e.content.append(s.container,a.container,o.container,r.container,d.container,l.container,c.container),this.scrollable.append(e.container);for(const e in i)h(e);n.Z.addEventListener("privacy_update",(e=>{h(Le(e.key._))}))}{const t=new b.Z({name:"NewChatsFromNonContacts",caption:"ArchiveAndMuteInfo"}),s=new Ce.Z({text:"ArchiveAndMute"}),a=new P.ZP({checkboxField:s});let o,r;t.content.append(a.container),this.eventListener.addEventListener("destroy",(()=>{if(r=!0,void 0!==o&&o!==s.checked)return this.managers.appPrivacyManager.setGlobalPrivacySettings({_:"globalPrivacySettings",archive_and_mute_new_noncontact_peers:s.checked})}),{once:!0});const d=Promise.all([e.appConfig,e.globalPrivacy]).then((([e,i])=>{if(r)return;const a=i=>{t.container.classList.toggle("hide",!i&&!e.autoarchive_setting_available)};this.listenerSetter.add(n.Z)("premium_toggle",a),a(n.Z.premium),o=!!i.archive_and_mute_new_noncontact_peers,s.setValueSilently(o)}));i.push(d),this.scrollable.append(t.container)}{const t=new b.Z({name:"Privacy.SensitiveContent",caption:"PrivacyAndSecurity.SensitiveDesc"});t.container.classList.add("hide");const s=new Ce.Z({text:"PrivacyAndSecurity.SensitiveText"}),n=new P.ZP({checkboxField:s});let a;t.content.append(n.container),this.eventListener.addEventListener("destroy",(()=>{if(void 0===a)return;const e=n.checkboxField.checked;return e!==a?this.managers.apiManager.invokeApi("account.setContentSettings",{sensitive_enabled:e}):void 0}),{once:!0});const o=e.contentSettings.then((e=>{e.pFlags.sensitive_can_change&&(a=!!e.pFlags.sensitive_enabled,s.setValueSilently(a),t.container.classList.remove("hide"))}));i.push(o),this.scrollable.append(t.container)}{const e=new b.Z({name:"PrivacyPayments",caption:"PrivacyPaymentsClearInfo"}),t=()=>{const e={titleLangKey:"PrivacyPaymentsClearAlertTitle",descriptionLangKey:"PrivacyPaymentsClearAlertText",button:{langKey:"Clear"},checkboxes:[{text:"PrivacyClearShipping",checked:!0},{text:"PrivacyClearPayment",checked:!0}]};(0,Ee.Z)(e).then((()=>{const[t,s]=e.checkboxes.map((e=>e.checkboxField.checked)),n=(0,G.Z)([i],!0);this.managers.appPaymentsManager.clearSavedInfo(t,s).then((()=>{(t||s)&&(n(),(0,ee.bC)({langPackKey:t&&s?"PrivacyPaymentsPaymentShippingCleared":t?"PrivacyPaymentsShippingInfoCleared":"PrivacyPaymentsPaymentInfoCleared"}))}))}),Ie.Z)},i=(0,I.Z)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyPaymentsClear"});this.listenerSetter.add(i)("click",t),e.content.append(i),this.scrollable.append(e.container)}{const e=new b.Z({name:"FilterChats"}),t=()=>{new B.Z("popup-delete-drafts",{buttons:[{langKey:"Delete",callback:()=>{const e=(0,G.Z)([i],!0);this.managers.appDraftsManager.clearAllDrafts().then((()=>{e()}))},isDanger:!0}],titleLangKey:"AreYouSureClearDraftsTitle",descriptionLangKey:"AreYouSureClearDrafts"}).show()},i=(0,I.Z)("btn-primary btn-transparent",{icon:"delete",text:"PrivacyDeleteCloudDrafts"});this.listenerSetter.add(i)("click",t),e.content.append(i),this.scrollable.append(e.container)}return Promise.all(i)}updateActiveSessions(){return this.managers.apiManager.invokeApi("account.getAuthorizations").then((e=>{this.activeSessionsRow.freezed=!1,this.authorizations=e.authorizations,(0,f.$d)(this.activeSessionsRow.subtitle,"Privacy.Devices",[this.authorizations.length])}))}updateActiveWebsites(e=this.managers.appSeamlessLoginManager.getWebAuthorizations()){return e.then((e=>{this.websitesRow.freezed=!1,this.websites=e,(0,f.$d)(this.websitesRow.subtitle,"Privacy.Websites",[this.websites.length]),this.websitesRow.container.classList.toggle("hide",!this.websites.length)}))}}var xe=i(65),Ae=i(6740);function _e(e){const t=e.getContext("2d"),i=new Array(4).fill(0),s=t.getImageData(0,0,e.width,e.height).data,n=s.length/4;for(let e=0;e0&&(i=Math.min(100,i+5+.1*(100-i))),s=Math.max(0,.65*s),`hsla(${t}, ${i}%, ${s}%, .4)`}var Ne=i(8479),Oe=i(9674),Ue=i(1571),He=i(2312),ze=i(3442),je=i(6724),Ge=i(6714),Ve=i(5077),Ke=i(3228);class We{constructor(){this.hue=0,this.saturation=100,this.lightness=50,this.alpha=1,this.elements={},this.onGrabStart=()=>{document.documentElement.style.cursor=this.elements.boxDragger.style.cursor="grabbing"},this.onGrabEnd=()=>{document.documentElement.style.cursor=this.elements.boxDragger.style.cursor=""},this.container=document.createElement("div"),this.container.classList.add(We.BASE_CLASS);const e=`\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n `;this.container.innerHTML=e,this.elements.box=this.container.firstElementChild,this.elements.boxDragger=this.elements.box.lastElementChild,this.elements.saturation=this.elements.box.firstElementChild.firstElementChild,this.elements.sliders=this.elements.box.nextElementSibling,this.elements.hue=this.elements.sliders.firstElementChild,this.elements.hueDragger=this.elements.hue.lastElementChild,this.hexInputField=new u.ZP({plainText:!0,label:"Appearance.Color.Hex"}),this.rgbInputField=new u.ZP({plainText:!0,label:"Appearance.Color.RGB"});const t=document.createElement("div");t.className=We.BASE_CLASS+"-inputs",t.append(this.hexInputField.container,this.rgbInputField.container),this.container.append(t),this.hexInputField.input.addEventListener("input",(()=>{let e=this.hexInputField.value.replace(/#/g,"").slice(0,6);const t=e.match(/([a-fA-F\d]+)/),i=t&&t[0].length===e.length&&[6].includes(e.length);this.hexInputField.setState(i?u.I1.Neutral:u.I1.Error),e="#"+e,this.hexInputField.setValueSilently(e),i&&this.setColor(e,!1,!0)}));const i=/^(?:rgb)?\(?([01]?\d\d?|2[0-4]\d|25[0-5])(?:\W+)([01]?\d\d?|2[0-4]\d|25[0-5])\W+(?:([01]?\d\d?|2[0-4]\d|25[0-5])\)?)$/;this.rgbInputField.input.addEventListener("input",(()=>{const e=this.rgbInputField.value.match(i);this.rgbInputField.setState(e?u.I1.Neutral:u.I1.Error),e&&this.setColor((0,Re.dI)(+e[1],+e[2],+e[3]),!0,!1)})),this.attachBoxListeners(),this.attachHueListeners()}attachBoxListeners(){(0,Ve.Z)(this.elements.box,(()=>{this.onGrabStart(),this.boxRect=this.elements.box.getBoundingClientRect()}),(e=>{this.saturationHandler(e.x,e.y)}),(()=>{this.onGrabEnd()}))}attachHueListeners(){(0,Ve.Z)(this.elements.hue,(()=>{this.onGrabStart(),this.hueRect=this.elements.hue.getBoundingClientRect()}),(e=>{this.hueHandler(e.x)}),(()=>{this.onGrabEnd()}))}setColor(e,t=!0,i=!0){if(void 0===e)e={h:0,s:100,l:50,a:1};else if("string"==typeof e)if("#"===e[0])e=(0,Re.cw)(e);else{const t=e.match(/[.?\d]+/g);e=(0,Re.dI)(+t[0],+t[1],+t[2],void 0===t[3]?1:+t[3])}this.boxRect=this.elements.box.getBoundingClientRect();const s=this.boxRect.width/100*e.s,n=100-e.l/(100-e.s/2)*100,a=this.boxRect.height/100*n;this.saturationHandler(this.boxRect.left+s,this.boxRect.top+a,!1),this.hueRect=this.elements.hue.getBoundingClientRect();const o=e.h/360,r=this.hueRect.left+this.hueRect.width*o;this.hueHandler(r,!1),this.hue=e.h,this.saturation=e.s,this.lightness=e.l,this.alpha=e.a,this.updatePicker(t,i)}getCurrentColor(){const e=(0,Re.Y6)(this.hue,this.saturation,this.lightness,this.alpha),t=(0,Re.t1)(e),i=t.slice(0,-2);return{hsl:`hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,rgb:`rgb(${e[0]}, ${e[1]}, ${e[2]})`,hex:i,hsla:`hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,rgba:`rgba(${e[0]}, ${e[1]}, ${e[2]}, ${e[3]})`,hexa:t,rgbaArray:e}}updatePicker(e=!0,t=!0){const i=this.getCurrentColor();this.elements.boxDragger.setAttributeNS(null,"fill",i.hex),e&&(this.hexInputField.setValueSilently(i.hex),this.hexInputField.setState(u.I1.Neutral)),t&&(this.rgbInputField.setValueSilently(i.rgbaArray.slice(0,-1).join(", ")),this.rgbInputField.setState(u.I1.Neutral)),this.onChange&&this.onChange(i)}hueHandler(e,t=!0){const i=(0,Ke.Z)(e-this.hueRect.left,0,this.hueRect.width)/this.hueRect.width;this.hue=Math.round(360*i);const s=`hsla(${this.hue}, 100%, 50%, ${this.alpha})`;this.elements.hueDragger.setAttributeNS(null,"x",100*i+"%"),this.elements.hueDragger.setAttributeNS(null,"fill",s),this.elements.saturation.lastElementChild.setAttributeNS(null,"stop-color",s),t&&this.updatePicker()}saturationHandler(e,t,i=!0){const s=this.boxRect.width,n=this.boxRect.height,a=(0,Ke.Z)(e-this.boxRect.left,0,s)/s*100,o=(0,Ke.Z)(t-this.boxRect.top,0,n)/n*100,r=this.elements.boxDragger;r.setAttributeNS(null,"x",a+"%"),r.setAttributeNS(null,"y",o+"%");const d=(0,Ke.Z)(a,0,100),l=100-d/2,c=100-(0,Ke.Z)(o,0,100),h=(0,Ke.Z)(c/100*l,0,100);this.saturation=d,this.lightness=h,i&&this.updatePicker()}}We.BASE_CLASS="color-picker";class $e extends l._{constructor(){super(...arguments),this._applyColor=(e,t=!0)=>{if(t)this.colorPicker.setColor(e);else{const t=(0,Re.Pi)(e),i=this.theme.background,a=Be(t);i.id="2",i.intensity=0,i.slug="",i.color=e.toLowerCase(),i.highlightningColor=a,this.managers.appStateManager.pushToState("settings",n.Z.settings),s.ZP.applyCurrentTheme(void 0,void 0,!0),this.setActive()}},this.onColorChange=e=>{this.applyColor(e.hex,!1)}}init(){this.container.classList.add("background-container","background-color-container"),this.setTitle("SetColor"),this.theme=Ge.Z.getTheme();const e=new b.Z({});this.colorPicker=new We,e.content.append(this.colorPicker.container),this.scrollable.append(e.container);const t=new b.Z({}),i=this.grid=document.createElement("div");i.classList.add("grid"),["#E6EBEE","#B2CEE1","#008DD0","#C6E7CB","#C4E1A6","#60B16E","#CCD0AF","#A6A997","#7A7072","#FDD7AF","#FDB76E","#DD8851"].forEach((e=>{const t=document.createElement("div");t.classList.add("grid-item"),t.dataset.color=e.toLowerCase();const s=document.createElement("div");s.classList.add("grid-item-media"),s.style.backgroundColor=e,t.append(s),i.append(t)})),(0,v.fc)(i,(e=>{const t=(0,he.Z)(e.target,"grid-item");if(!t||t.classList.contains("active"))return;const i=t.dataset.color;i&&this.applyColor(i)}),{listenerSetter:this.listenerSetter}),t.content.append(i),this.scrollable.append(t.container),this.applyColor=(0,je.Z)(this._applyColor,16,!0)}setActive(){const e=this.grid.querySelector(".active"),t=this.theme.background,i=t.color?this.grid.querySelector(`.grid-item[data-color="${t.color}"]`):null;e!==i&&(e&&e.classList.remove("active"),i&&i.classList.add("active"))}onOpen(){setTimeout((()=>{const e=this.theme.background,t=(e.color||"").split(",")[0],i=!!t&&!e.slug;i&&(this.colorPicker.onChange=this.onColorChange),this.colorPicker.setColor(t||"#cccccc"),i||(this.colorPicker.onChange=this.onColorChange)}),0)}onCloseAfterTimeout(){return this.colorPicker.onChange=void 0,this.colorPicker=void 0,super.onCloseAfterTimeout()}}var qe=i(7030),Qe=i(236),Ye=i(7814),Xe=i(9405),Je=i(9492),et=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class tt extends l._{constructor(){super(...arguments),this.tempId=0,this.clicked=new Set,this.wallPapersByElement=new Map,this.elementsByKey=new Map,this.onUploadClick=()=>{(function(e){const t=document.createElement("input");t.type="file",t.style.display="none",e&&(t.accept=e),document.body.append(t);const i=new Promise(((e,i)=>{t.addEventListener("change",(t=>{const s=t.target.files[0];s?e(s):i("NO_FILE_SELECTED")}),{once:!0})})).finally((()=>{t.remove()}));return t.click(),i})("image/x-png,image/png,image/jpeg").then((e=>et(this,void 0,void 0,(function*(){if(e.name.endsWith(".png")){const t=document.createElement("img"),i=URL.createObjectURL(e);yield(0,Ae.cj)(t,i,!1);const s="image/jpeg",{blob:n}=yield(0,Ye.Z)({media:t,size:new Xe.c(t.naturalWidth,t.naturalHeight),mimeType:s});e=new File([n],e.name.replace(/\.png$/,".jpg"),{type:s})}const t=yield this.managers.appDocsManager.prepareWallPaperUpload(e),i=this.managers.appDocsManager.uploadWallPaper(t.id),s=He.Z.getNewDeferredForUpload(e.name,i),n=(0,De.Z)();n.addNotifyListener=s.addNotifyListener,n.cancel=s.cancel,s.then((e=>{this.clicked.delete(a),this.elementsByKey.delete(a),this.wallPapersByElement.set(r,e);const t=this.getWallPaperKey(e);this.elementsByKey.set(t,r),this.setBackgroundDocument(e).then(n.resolve,n.reject)}),n.reject);const a=this.getWallPaperKey(t);n.catch((()=>{r.remove()}));const o=new ze.Z({isUpload:!0,cancelable:!0,tryAgainOnFail:!1}),r=yield this.addWallPaper(t,!1);this.clicked.add(a),o.attach(r,!1,n)}))))},this.onResetClick=()=>{const e=Qe.h.settings.themes.find((e=>e.name===this.theme.name));e&&(++this.tempId,this.theme.background=(0,Ne.Z)(e.background),this.managers.appStateManager.pushToState("settings",n.Z.settings),s.ZP.applyCurrentTheme(void 0,void 0,!0),this.blurCheckboxField.setValueSilently(this.theme.background.blur))},this.onGridClick=e=>{const t=(0,he.Z)(e.target,"grid-item");if(!t)return;const i=this.wallPapersByElement.get(t);if("wallPaperNoFile"===i._)return void this.setBackgroundDocument(i);const s=this.getWallPaperKey(i);if(this.clicked.has(s))return;this.clicked.add(s);const n=i.document,a=new ze.Z({cancelable:!0,tryAgainOnFail:!1}),o=()=>et(this,void 0,void 0,(function*(){const e=this.setBackgroundDocument(i);(yield this.managers.thumbsStorage.getCacheContext(n)).url&&!this.theme.background.blur||a.attach(t,!0,e)}));a.construct(),(0,v.fc)(t,(e=>{a.preloader.parentElement?(a.onClick(e),a.detach()):o()}),{listenerSetter:this.listenerSetter}),o()},this.saveToCache=(e,t)=>{fetch(t).then((t=>{s.ZP.cacheStorage.save("backgrounds/"+e,t)}))},this.setBackgroundDocument=e=>{const t=++this.tempId,i=()=>t===this.tempId,a=e.document,o=(0,De.Z)();let r;return a?(r=He.Z.downloadMediaURL({media:a,queueId:s.ZP.chat.bubbles?s.ZP.chat.bubbles.lazyLoadQueue.queueId:0}),o.addNotifyListener=r.addNotifyListener,o.cancel=r.cancel):r=Promise.resolve(),r.then((()=>et(this,void 0,void 0,(function*(){if(!i())return void o.resolve();const t=this.theme.background,r=a=>{let r;const d=this.getColorsFromWallPaper(e);if(a&&!d)r=function(e){const t=document.createElement("img");return(0,Ae.cj)(t,e,!1).then((()=>function(e,t,i){const s=document.createElement("canvas"),n=t/i;return 1===n?(s.width=50,s.height=s.width/n):n>1?(s.height=50,s.width=s.height/n):s.width=s.height=50,s.getContext("2d").drawImage(e,0,0,t,i,0,0,s.width,s.height),_e(s)}(t,t.naturalWidth,t.naturalHeight)))}(a);else{const{canvas:e}=Ue.Z.create(d);r=Promise.resolve(_e(e))}r.then((r=>{var l,c,h;if(!i())return void o.resolve();const u=Be(Array.from(r)),p=null!==(l=e.slug)&&void 0!==l?l:"";t.id=e.id,t.intensity=null!==(h=null===(c=e.settings)||void 0===c?void 0:c.intensity)&&void 0!==h?h:0,t.color=d,t.slug=p,t.highlightningColor=u,this.managers.appStateManager.pushToState("settings",n.Z.settings),p&&this.saveToCache(p,a),s.ZP.applyCurrentTheme(p,a,!0).then(o.resolve)}))};if(!a)return void r();const d=yield this.managers.thumbsStorage.getCacheContext(a);t.blur?setTimeout((()=>{const{canvas:e,promise:t}=(0,Fe.Z)(d.url,12,4);t.then((()=>{i()?r(e.toDataURL()):o.resolve()}))}),200):r(d.url)})))),o},this.setActive=()=>{const e=this.grid.querySelector(".active"),t=this.elementsByKey.get(this.getWallPaperKeyFromTheme(this.theme));e!==t&&(e&&e.classList.remove("active"),t&&t.classList.add("active"))}}static getInitArgs(){return{backgrounds:n.Z.managers.appDocsManager.getWallPapers()}}get theme(){return Ge.Z.getTheme()}init(e=tt.getInitArgs()){this.container.classList.add("background-container","background-image-container"),this.setTitle("ChatBackground");{const e=(0,b.R)(this.scrollable),t=(0,I.Z)("btn-primary btn-transparent",{icon:"cameraadd",text:"ChatBackground.UploadWallpaper"}),i=(0,I.Z)("btn-primary btn-transparent",{icon:"colorize",text:"SetColor"}),a=(0,I.Z)("btn-primary btn-transparent",{icon:"favourites",text:"Appearance.Reset"});(0,v.fc)(t,this.onUploadClick,{listenerSetter:this.listenerSetter}),(0,v.fc)(i,(()=>{this.slider.createTab($e).open()}),{listenerSetter:this.listenerSetter}),(0,v.fc)(a,this.onResetClick,{listenerSetter:this.listenerSetter});const o=this.blurCheckboxField=new Ce.Z({text:"ChatBackground.Blur",name:"blur",checked:this.theme.background.blur});this.listenerSetter.add(o.input)("change",(()=>et(this,void 0,void 0,(function*(){this.theme.background.blur=o.input.checked,yield this.managers.appStateManager.pushToState("settings",n.Z.settings),setTimeout((()=>{const e=s.querySelector(".active");if(!e)return;const t=this.wallPapersByElement.get(e);t.pFlags.pattern||"wallPaperNoFile"===t._||this.setBackgroundDocument(t)}),100)})))),e.append(t,i,a,(0,P.tG)(o).container)}n.Z.addEventListener("background_change",this.setActive);const t=e.backgrounds.then((e=>{const t=e.map((e=>this.addWallPaper(e)));return Promise.all(t)})),i=(0,b.R)(this.scrollable),s=this.grid=document.createElement("div");return s.classList.add("grid"),(0,v.fc)(s,this.onGridClick,{listenerSetter:this.listenerSetter}),i.append(s),t}getColorsFromWallPaper(e){return e.settings?[e.settings.background_color,e.settings.second_background_color,e.settings.third_background_color,e.settings.fourth_background_color].filter(Boolean).map((e=>"#"+e.toString(16))).join(","):""}getWallPaperKey(e){return""+e.id}getWallPaperKeyFromTheme(e){return""+e.background.id}addWallPaper(e,t=!0){const i=this.getColorsFromWallPaper(e),s="wallPaper"===e._;if(s&&e.pFlags.pattern&&!i)return;const n=!!e.pFlags.dark,a=s?e.document:void 0,o=document.createElement("div");o.classList.add("grid-item"),o.dataset.id=""+e.id;const r=this.getWallPaperKey(e);this.wallPapersByElement.set(o,e),this.elementsByKey.set(r,o);const d=document.createElement("div");d.classList.add("grid-item-media");const l=[];let c,h;if(s){h=(0,qe.Z)(a,200,200),c=(0,Je.Z)({photo:a,message:null,container:d,withoutPreloader:!0,size:h,noFadeIn:e.pFlags.pattern}),e.pFlags.pattern&&d.classList.add("is-pattern");const t=c.then((({loadPromises:e,images:t})=>et(this,void 0,void 0,(function*(){return(yield e.thumb)||e.full,t})))).then((t=>{var i;return e.pFlags.pattern&&(n?(t.full.style.display="none",t.thumb&&(t.thumb.style.display="none")):(null===(i=e.settings)||void 0===i?void 0:i.intensity)&&(t.full.style.opacity=""+Math.abs(e.settings.intensity)/100)),Oe.Z.mutate((()=>{o.append(d)}))}));l.push(t)}else o.append(d);if(e.settings&&void 0!==e.settings.background_color){const{canvas:t}=Ue.Z.create(i);if(t.classList.add("background-colors-canvas"),n&&s){const i=c.then((({loadPromises:i})=>i.full.then((()=>et(this,void 0,void 0,(function*(){const i=yield this.managers.thumbsStorage.getCacheContext(a,h.type);t.style.webkitMaskImage=`url(${i.url})`,t.style.opacity=""+(e.pFlags.dark?100+e.settings.intensity:e.settings.intensity)/100,d.append(t)}))))));l.push(i)}else d.append(t)}return this.getWallPaperKeyFromTheme(this.theme)===r&&o.classList.add("active"),this.grid[t?"append":"prepend"](o),Promise.all(l).then((()=>o))}}var it=i(8938),st=i(2153),nt=i(6787),at=i(6761);var ot=i(3731),rt=i(62);class dt extends M.Z{init(){return this.setTitle("DoubleTapSetting"),this.container.classList.add("quick-reaction-container"),Promise.all([this.managers.appReactionsManager.getQuickReaction(),this.managers.appReactionsManager.getAvailableReactions()]).then((([e,t])=>{t=t.filter((e=>!e.pFlags.inactive));const i=new b.Z,s=t.map((t=>{const i=new A.Z({name:"quick-reaction",text:t.title,value:t.reaction,alignRight:!0}),s=new P.ZP({radioField:i,havePadding:!0});return i.main.classList.add("quick-reaction-title"),(0,rt.Z)({row:s,doc:t.static_icon,size:"small"}),t.reaction===e.reaction&&i.setValueSilently(!0),s})),n=(0,P.De)(s,(e=>{this.managers.appReactionsManager.setDefaultReaction({_:"reactionEmoji",emoticon:e})}));i.content.append(n),this.scrollable.append(i.container)}))}}var lt=i(1273);class ct{constructor(e,t,i,s,n,a=!0){const o="range-setting-selector";this.container=document.createElement("div"),this.container.classList.add(o);const r=document.createElement("div");r.classList.add(o+"-details");const d=document.createElement("div");d.classList.add(o+"-name"),(0,f.$d)(d,e);const l=this.valueContainer=document.createElement("div");l.classList.add(o+"-value"),a&&(l.innerHTML=""+i),r.append(d,l),this.range=new xe.Z({step:t,min:s,max:n},i),this.range.setListeners(),this.range.setHandlers({onScrub:e=>{this.onChange&&this.onChange(e),a&&(l.innerText=""+e)}}),this.container.append(r,this.range.container)}}class ht extends M.h{init(){this.container.classList.add("general-settings-container"),this.setTitle("General");const e=b.R.bind(null,this.scrollable);{const t=e("Settings"),i=new ct("TextSize",1,n.Z.settings.messagesTextSize,12,20);i.onChange=e=>{n.Z.managers.appStateManager.setByKey("settings.messagesTextSize",e)};const s=(0,I.Z)("btn-primary btn-transparent",{icon:"image",text:"ChatBackground"}),a=tt.getInitArgs();(0,v.fc)(s,(()=>{this.slider.createTab(tt).open(a)}));const o=new Ce.Z({text:"EnableAnimations",name:"animations",stateKey:"settings.animationsEnabled",listenerSetter:this.listenerSetter});t.append(i.container,s,(0,P.tG)(o).container)}{const t=e("General.Keyboard"),i=document.createElement("form"),s="send-shortcut",n="settings.sendShortcut",a=new P.ZP({radioField:new A.Z({langKey:"General.SendShortcut.Enter",name:s,value:"enter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.ShiftEnter"}),o=new P.ZP({radioField:new A.Z({name:s,value:"ctrlEnter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.Enter"});(0,f.$d)(o.radioField.main,"General.SendShortcut.CtrlEnter",[z.IS_APPLE?"⌘":"Ctrl"]),i.append(a.container,o.container),t.append(i)}if(ot.Z){const t=e("DistanceUnitsTitle"),i=document.createElement("form"),s="distance-unit",n="settings.distanceUnit",a=new P.ZP({radioField:new A.Z({langKey:"DistanceUnitsKilometers",name:s,value:"kilometers",stateKey:n})}),o=new P.ZP({radioField:new A.Z({langKey:"DistanceUnitsMiles",name:s,value:"miles",stateKey:n})});i.append(a.container,o.container),t.append(i)}{const t=e("General.TimeFormat"),i=document.createElement("form"),s="time-format",n="settings.timeFormat",a=[["h12","General.TimeFormat.h12"],["h23","General.TimeFormat.h23"]],o=a.map((([e,t])=>new P.ZP({radioField:new A.Z({langKey:t,name:s,value:e,stateKey:n})}))),r=function(e,t=!0){return function(e,t,i=!0){const s=e;let n;return i||(e=Ie.Z),function i(){e(),n=at.Z.setTimeout(i,t())}(),e=s,()=>{clearTimeout(n)}}(e,(()=>1e3*(60-(new Date).getSeconds())),t)}((()=>{const e=new Date;a.forEach((([t],i)=>{const s=e.toLocaleTimeString("en-us-u-hc-"+t,{hour:"2-digit",minute:"2-digit"});o[i].subtitle.textContent=s}))}));this.eventListener.addEventListener("destroy",r),i.append(...o.map((e=>e.container))),t.append(i)}{const t=e("Emoji"),i=new Ce.Z({text:"GeneralSettings.EmojiPrediction",name:"suggest-emoji",stateKey:"settings.emoji.suggest",listenerSetter:this.listenerSetter}),s=new Ce.Z({text:"GeneralSettings.BigEmoji",name:"emoji-big",stateKey:"settings.emoji.big",listenerSetter:this.listenerSetter});t.append((0,P.tG)(i).container,(0,P.tG)(s).container)}{const e=new b.Z({name:"Telegram.InstalledStickerPacksController",caption:"StickersBotInfo"}),t=new P.ZP({titleLangKey:"DoubleTapSetting",havePadding:!0,clickable:()=>{this.slider.createTab(dt).open()},listenerSetter:this.listenerSetter}),i=()=>{this.managers.appReactionsManager.getQuickReaction().then((e=>"availableReaction"===e._?e.static_icon:this.managers.appEmojiManager.getCustomEmojiDocument(e.document_id))).then((e=>{(0,rt.Z)({row:t,doc:e,size:"small"})}))};i(),this.listenerSetter.add(n.Z)("quick_reaction",i);const s=new Ce.Z({text:"Stickers.SuggestStickers",name:"suggest",stateKey:"settings.stickers.suggest",listenerSetter:this.listenerSetter}),a=new Ce.Z({text:"InstalledStickers.LoopAnimated",name:"loop",stateKey:"settings.stickers.loop",listenerSetter:this.listenerSetter}),o={},r=e.generateContentElement(),d=new st.Z,l=(e,t="append")=>{const i=new P.ZP({title:(0,Q.Z)(e.title),subtitleLangKey:"Stickers",subtitleLangArgs:[e.count],havePadding:!0,clickable:()=>{new nt.Z({id:e.id,access_hash:e.access_hash}).show()},listenerSetter:this.listenerSetter});o[e.id]=i;const s=document.createElement("div");s.classList.add("row-media"),(0,lt.Z)({set:e,container:s,group:"GENERAL-SETTINGS",lazyLoadQueue:d,width:36,height:36,autoplay:!0}),i.container.append(s),r[t](i.container)};this.managers.appStickersManager.getAllStickers().then((e=>{(0,it.Z)(e);for(const t of e.sets)l(t)})),this.listenerSetter.add(n.Z)("stickers_installed",(e=>{o[e.id]||l(e,"prepend")})),this.listenerSetter.add(n.Z)("stickers_deleted",(e=>{o[e.id]&&(o[e.id].container.remove(),delete o[e.id])})),e.content.append(t.container,(0,P.tG)(s).container,(0,P.tG)(a).container),this.scrollable.append(e.container)}}onOpen(){this.init&&(this.init(),this.init=null)}}var ut=i(2010),pt=i(1447),ft=i(534),mt=i(4484),gt=i(1507),vt=i(2914),bt=i(2648),yt=i(1655),wt=i(3186),St=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Ct extends l._{constructor(){super(...arguments),this.filtersRendered={}}static getInitArgs(){return{animationData:pt.Z.loadAnimationFromURLManually("Folders_1"),filters:n.Z.managers.filtersStorage.getDialogFilters()}}renderFolder(e,t,i,s){return St(this,void 0,void 0,(function*(){let n,a="";const o=[];if("dialogFilterSuggested"===e._)n=e.filter,a=e.description;else{if(n=e,1===Object.keys(n.pFlags).length){const e=n.pFlags;let t;e.contacts?t="FilterAllContacts":e.non_contacts?t="FilterAllNonContacts":e.groups?t="FilterAllGroups":e.broadcasts?t="FilterAllChannels":e.bots&&(t="FilterAllBots"),t&&o.push((0,f.ag)(t))}if(!o.length){const e=yield this.managers.dialogsStorage.getFolderDialogs(n.id);let t=0,i=0,s=0;yield Promise.all(e.map((e=>St(this,void 0,void 0,(function*(){(yield this.managers.appPeersManager.isAnyGroup(e.peerId))?s++:(yield this.managers.appPeersManager.isBroadcast(e.peerId))?i++:t++}))))),t&&o.push((0,f.ag)("Chats",[t])),i&&o.push((0,f.ag)("Channels",[i])),s&&o.push((0,f.ag)("Groups",[s]))}}if(i)n.id!==gt.J$&&(0,Z.Z)(i.title,(0,Q.Z)(n.title)),i.subtitle.textContent="",i.subtitle.append(...(0,f.v_)(o));else if(i=new P.ZP({title:n.id===gt.J$?(0,f.ag)("FilterAllChats"):(0,Q.Z)(n.title),subtitle:a,clickable:!0,buttonRightLangKey:"dialogFilterSuggested"===e._?"Add":void 0}),o.length&&i.subtitle.append(...(0,f.v_)(o)),"dialogFilter"===e._){const e=n.id;if(!this.filtersRendered[n.id]&&n.id!==gt.J$){const t=ft.Z.getInitArgs();(0,v.fc)(i.container,(()=>St(this,void 0,void 0,(function*(){const i=yield this.managers.filtersStorage.getFilter(e),s=this.slider.createTab(ft.Z);s.setInitFilter(i),s.open(t)}))),{listenerSetter:this.listenerSetter})}this.filtersRendered[n.id]=i,i.makeSortable()}const r=i.container;if(s){const e=n.localId;void 0!==e?(0,mt.Z)(r,r.parentElement||t,e):t&&t.append(r)}return i}))}init(e=Ct.getInitArgs()){this.container.classList.add("chat-folders-container"),this.setTitle("ChatList.Filter.List.Title"),this.scrollable.container.classList.add("chat-folders"),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container");const t=document.createElement("div");t.classList.add("caption"),(0,f.XZ)({element:t,key:"ChatList.Filter.Header"}),this.createFolderBtn=(0,I.Z)("btn-primary btn-color-primary btn-control tgico",{text:"ChatList.Filter.NewTitle",icon:"add"}),this.foldersSection=new b.Z({name:"Filters"}),this.foldersSection.container.classList.add("hide"),this.list=document.createElement("div"),this.foldersSection.content.append(this.list),this.suggestedSection=new b.Z({name:"FilterRecommended"}),this.suggestedSection.container.classList.add("hide"),this.scrollable.append(this.stickerContainer,t,this.createFolderBtn,this.foldersSection.container,this.suggestedSection.container),(0,v.fc)(this.createFolderBtn,(()=>St(this,void 0,void 0,(function*(){(yield this.canCreateFolder())?this.slider.createTab(ft.Z).open():(0,wt.Z)("folders")}))),{listenerSetter:this.listenerSetter});const i=()=>{this.foldersSection.container.classList.toggle("hide",!Object.keys(this.filtersRendered).length)},s=[],a=e.filters.then((e=>St(this,void 0,void 0,(function*(){for(const t of e)t.id!==gt.Zi&&(yield this.renderFolder(t,this.list,void 0,!0));this.toggleAllChats(),i()}))));return s.push(a),this.listenerSetter.add(n.Z)("filter_update",(e=>St(this,void 0,void 0,(function*(){const t=this.filtersRendered[e.id];t?yield this.renderFolder(e,null,t):e.id!==gt.Zi&&(yield this.renderFolder(e,this.list,void 0,!0)),i(),this.getSuggestedFilters()})))),this.listenerSetter.add(n.Z)("filter_delete",(e=>{const t=this.filtersRendered[e.id];t&&(this.getSuggestedFilters(),t.container.remove(),delete this.filtersRendered[e.id]),i()})),this.listenerSetter.add(n.Z)("filter_order",(e=>{e.filter((e=>!!this.filtersRendered[e])).forEach(((e,t)=>{const i=this.filtersRendered[e].container;(0,mt.Z)(i,i.parentElement,t+1)}))})),this.listenerSetter.add(n.Z)("premium_toggle",(()=>{this.toggleAllChats()})),this.loadAnimationPromise=e.animationData.then((e=>St(this,void 0,void 0,(function*(){const t=yield e({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86});return this.animation=t,pt.Z.waitForFirstFrame(t)})))),s.push(this.loadAnimationPromise),new vt.Z({list:this.list,middleware:this.middlewareHelper.get(),onSort:(e,t)=>{let i=[];for(const e in this.filtersRendered){const t=this.filtersRendered[e];i[(0,bt.Z)(t.container)]=+e}i=i.filter((e=>void 0!==e)),n.Z.premium||(0,yt.Z)(i,gt.J$),this.managers.filtersStorage.updateDialogFiltersOrder(i)},scrollable:this.scrollable}),this.getSuggestedFilters(),Promise.all(s)}onOpenAfterTimeout(){return this.loadAnimationPromise.then((()=>{this.animation.autoplay=!0,this.animation.play()})),super.onOpenAfterTimeout()}toggleAllChats(){this.filtersRendered[gt.J$].container.classList.toggle("hide",!n.Z.premium)}canCreateFolder(){return St(this,void 0,void 0,(function*(){const[e,t]=yield Promise.all([this.managers.apiManager.getLimit("folders"),this.managers.filtersStorage.getDialogFilters()]);return t.filter((e=>!gt.DZ.has(e.id))).lengthSt(this,void 0,void 0,(function*(){this.suggestedSection.container.classList.toggle("hide",!e.length),Array.from(this.suggestedSection.content.children).slice(1).forEach((e=>e.remove()));for(const t of e){const e=yield this.renderFolder(t);this.suggestedSection.content.append(e.container);const i=e.buttonRight;(0,v.fc)(i,(s=>St(this,void 0,void 0,(function*(){if((0,K.Z)(s),!(yield this.canCreateFolder()))return void(0,wt.Z)("folders");i.setAttribute("disabled","true");const n=t.filter;n.includePeerIds=[],n.excludePeerIds=[],n.pinnedPeerIds=[],this.managers.filtersStorage.createDialogFilter(n,!0).then((()=>{e.container.remove(),this.suggestedSection.container.classList.toggle("hide",1===this.suggestedSection.content.childElementCount)})).finally((()=>{i.removeAttribute("disabled")}))}))),{listenerSetter:this.listenerSetter})}}))))}}var Lt=i(3855),Et=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class It extends M.h{init(){this.container.classList.add("notifications-container"),this.setTitle("Telegram.NotificationSettingsViewController");const e=e=>{const t=new b.Z({name:e.name}),i=new P.ZP({checkboxField:new Ce.Z({text:e.typeText,checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0}),s=new P.ZP({checkboxField:new Ce.Z({text:"MessagePreview",checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0});t.content.append(i.container,s.container),this.scrollable.append(t.container);const a={_:e.inputKey},o=this.managers.appNotificationsManager.getNotifySettings(a);(o instanceof Promise?o:Promise.resolve(o)).then((t=>{const o=()=>Et(this,void 0,void 0,(function*(){const e=yield this.managers.appNotificationsManager.isMuted(t);return i.checkboxField.checked=!e,s.checkboxField.checked=t.show_previews,e}));o(),this.eventListener.addEventListener("destroy",(()=>Et(this,void 0,void 0,(function*(){const e=!i.checkboxField.checked,n=s.checkboxField.checked;if(e===(yield this.managers.appNotificationsManager.isMuted(t))&&n===t.show_previews)return;const o=(0,Ne.Z)(t);o._="inputPeerNotifySettings",o.mute_until=e?gt.rU:0,o.show_previews=n,this.managers.appNotificationsManager.updateNotifySettings(a,o)}))),{once:!0}),this.listenerSetter.add(n.Z)("notify_settings",(i=>{const s=Le(i.peer._);e.inputKey===s&&(t=i.notify_settings,o())}))}))};e({name:"NotificationsPrivateChats",typeText:"NotificationsForPrivateChats",inputKey:"inputNotifyUsers"}),e({name:"NotificationsGroups",typeText:"NotificationsForGroups",inputKey:"inputNotifyChats"}),e({name:"NotificationsChannels",typeText:"NotificationsForChannels",inputKey:"inputNotifyBroadcasts"});{const e=new b.Z({name:"NotificationsOther"}),t=new P.ZP({checkboxField:new Ce.Z({text:"ContactJoined",checked:!0}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0}),i=new P.ZP({checkboxField:new Ce.Z({text:"Notifications.Sound",checked:!0,stateKey:"settings.notifications.sound",listenerSetter:this.listenerSetter}),subtitleLangKey:"Loading",listenerSetter:this.listenerSetter,withCheckboxSubtitle:!0});Lt.Z.getState().then((e=>{i.checkboxField.checked=e.settings.notifications.sound})),e.content.append(t.container,i.container),this.scrollable.append(e.container),this.managers.appNotificationsManager.getContactSignUpNotification().then((e=>{t.checkboxField.checked=e,this.eventListener.addEventListener("destroy",(()=>{const i=t.checkboxField.checked;e!==i&&this.managers.appNotificationsManager.setContactSignUpNotification(!i)}),{once:!0})}))}}}class Mt extends l._{static getInitArgs(){return{languages1:n.Z.managers.apiManager.invokeApiCacheable("langpack.getLanguages",{lang_pack:"web"}),languages2:Promise.resolve([])}}init(e){this.header.classList.add("with-border"),this.container.classList.add("language-container"),this.setTitle("Telegram.LanguageViewController");const t=new b.Z({}),i=new Map,s=Promise.all([e.languages1,e.languages2]).then((([e,s])=>{const n=new Set,a=e.map((e=>e.lang_code)),o=(0,k.a)();e.concat(s).forEach((e=>{if(n.has(e.lang_code))return;n.add(e.lang_code);const t=new P.ZP({radioField:new A.Z({text:e.name,name:o,value:e.lang_code}),subtitle:e.native_name});i.set(e.lang_code,t)}));const r=(0,P.De)([...i.values()],(e=>{f.ZP.getLangPack(e,a.includes(e))}));f.ZP.getCacheLangPack().then((e=>{const t=i.get(e.lang_code);t?t.radioField.setValueSilently(!0):console.error("no row",t,e)})),t.content.append(r)}));return this.scrollable.append(t.container),s}}var Pt=i(4081),Zt=i(6848),kt=i(5701);function Tt(e,t,i){const s=new b.Z({name:t}),n="settings.autoDownload."+e+".",a=new Ce.Z({text:"AutodownloadContacts",name:"contacts",stateKey:n+"contacts",listenerSetter:i}),o=new Ce.Z({text:"AutodownloadPrivateChats",name:"private",stateKey:n+"private",listenerSetter:i}),r=new Ce.Z({text:"AutodownloadGroupChats",name:"groups",stateKey:n+"groups",listenerSetter:i}),d=new Ce.Z({text:"AutodownloadChannels",name:"channels",stateKey:n+"channels",listenerSetter:i});return s.content.append((0,P.tG)(a).container,(0,P.tG)(o).container,(0,P.tG)(r).container,(0,P.tG)(d).container),s}class xt extends M.h{init(){this.setTitle("AutoDownloadPhotos");const e=Tt("photo","AutoDownloadPhotosTitle",this.listenerSetter);this.scrollable.append(e.container)}}class At extends M.h{init(){this.setTitle("AutoDownloadFiles");const e=(0,kt.Z)((e=>{this.managers.appStateManager.setByKey("settings.autoDownloadNew.file_size_max",e)}),200,!1,!0),t=Tt("file","AutoDownloadFilesTitle",this.listenerSetter),i=524288,s=20447232,a=n.Z.settings.autoDownloadNew.file_size_max,o=Math.sqrt(Math.sqrt((a-i)/s)),r=new f.ZP.IntlElement({key:"AutodownloadSizeLimitUpTo",args:[(0,Pt.Z)(a)]}),d=new ct("AutoDownloadMaxFileSize",.01,o,0,1,!1);d.onChange=t=>{const n=Math.pow(t,4)*s+i|0;r.compareAndUpdate({args:[(0,Pt.Z)(n)]}),e(n)},d.valueContainer.append(r.element),t.content.append(d.container),this.scrollable.append(t.container)}}class _t extends M.h{init(){this.setTitle("AutoDownloadVideos");const e=Tt("video","AutoDownloadVideosTitle",this.listenerSetter);this.scrollable.append(e.container)}}const Ft={contacts:"AutoDownloadContacts",private:"AutoDownloadPm",groups:"AutoDownloadGroups",channels:"AutoDownloadChannels"};class Dt extends M.h{init(){return e=this,t=void 0,s=function*(){this.setTitle("DataSettings");{const e=new b.Z({name:"AutomaticMediaDownload",caption:"AutoDownloadAudioInfo"}),t=yield Lt.Z.getState(),i=new Ce.Z({text:"AutoDownloadMedia",name:"auto",checked:!t.settings.autoDownloadNew.pFlags.disabled,listenerSetter:this.listenerSetter}),s=new P.ZP({checkboxField:i,listenerSetter:this.listenerSetter}),a=()=>{(0,G.Z)([h],(0,Zt.Z)(t.settings.autoDownload,Qe.h.settings.autoDownload)&&(0,Zt.Z)(t.settings.autoDownloadNew,Qe.h.settings.autoDownloadNew))},o=()=>{this.setAutoDownloadSubtitle(d,t.settings.autoDownload.photo),this.setAutoDownloadSubtitle(l,t.settings.autoDownload.video),this.setAutoDownloadSubtitle(c,t.settings.autoDownload.file,t.settings.autoDownloadNew.file_size_max)},r=e=>{const t=this.slider.createTab(e);t.open(),this.listenerSetter.add(t.eventListener)("destroy",(()=>{o(),a()}),{once:!0})},d=new P.ZP({titleLangKey:"AutoDownloadPhotos",subtitle:"",clickable:()=>{r(xt)},listenerSetter:this.listenerSetter}),l=new P.ZP({titleLangKey:"AutoDownloadVideos",subtitle:"",clickable:()=>{r(_t)},listenerSetter:this.listenerSetter}),c=new P.ZP({titleLangKey:"AutoDownloadFiles",subtitle:"",clickable:()=>{r(At)},listenerSetter:this.listenerSetter}),h=(0,I.Z)("btn-primary btn-transparent primary",{icon:"delete",text:"ResetAutomaticMediaDownload"});(0,v.fc)(h,(()=>{(0,Ee.Z)({titleLangKey:"ResetAutomaticMediaDownloadAlertTitle",descriptionLangKey:"ResetAutomaticMediaDownloadAlert",button:{langKey:"Reset"}}).then((()=>{const e=n.Z.settings;e.autoDownloadNew=(0,Ne.Z)(Qe.h.settings.autoDownloadNew),e.autoDownload=(0,Ne.Z)(Qe.h.settings.autoDownload),t.settings=e,this.managers.appStateManager.setByKey("settings",e),o(),i.checked=!t.settings.autoDownloadNew.pFlags.disabled}))}));const u=()=>{const e=!i.checked,t=n.Z.settings;e?t.autoDownloadNew.pFlags.disabled=!0:delete t.autoDownloadNew.pFlags.disabled,[d,l,c].forEach((t=>{t.container.classList.toggle("is-disabled",e)})),this.managers.appStateManager.setByKey("settings",t),a()};i.input.addEventListener("change",u),u(),o(),e.content.append(s.container,d.container,l.container,c.container,h),this.scrollable.append(e.container)}{const e=new b.Z({name:"AutoplayMedia"});e.content.append(new P.ZP({checkboxField:new Ce.Z({text:"AutoplayGIF",name:"gifs",stateKey:"settings.autoPlay.gifs",listenerSetter:this.listenerSetter}),listenerSetter:this.listenerSetter}).container,new P.ZP({checkboxField:new Ce.Z({text:"AutoplayVideo",name:"videos",stateKey:"settings.autoPlay.videos",listenerSetter:this.listenerSetter}),listenerSetter:this.listenerSetter}).container),this.scrollable.append(e.container)}},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}setAutoDownloadSubtitle(e,t,i){let s;const n=[],a=Object.keys(t),o=a.map((e=>t[e]?Ft[e]:void 0)).filter(Boolean);if(o.length&&0!==i){const e=o.length===a.length;if(void 0!==i?(s=e?"AutoDownloadUpToOnAllChats":"AutoDownloadOnUpToFor",n.push((0,Pt.Z)(i))):s=e?"AutoDownloadOnAllChats":"AutoDownloadOnFor",!e){const e=document.createElement("span");e.append(...(0,f.v_)(o.map((e=>(0,f.ag)(e))),!0,!1)),n.push(e)}}else s="AutoDownloadOff";(0,Z.Z)(e.subtitle,(0,f.ag)(s,n))}}var Rt=i(2230),Bt=i(8261),Nt=i(6765),Ot=i(1168),Ut=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Ht extends l._{constructor(){super(...arguments),this.buttons={}}init(){return Ut(this,void 0,void 0,(function*(){this.container.classList.add("settings-container"),this.setTitle("Settings");const e=(0,E.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[{icon:"logout",text:"EditAccount.Logout",onClick:()=>{new B.Z("logout",{titleLangKey:"LogOut",descriptionLangKey:"LogOut.Description",buttons:[{langKey:"LogOut",callback:()=>{this.managers.apiManager.logOut()},isDanger:!0}]}).show()}}]});this.buttons.edit=(0,Rt.Z)("edit"),this.header.append(this.buttons.edit,e),this.profile=new Bt.Z(this.managers,this.scrollable,this.listenerSetter,!1),this.profile.init(),this.profile.setPeer(n.Z.myId);const t=this.profile.fillProfileElements(),i=(0,I.Z)("btn-circle btn-corner z-depth-1 profile-change-avatar",{icon:"cameraadd"});(0,v.fc)(i,(()=>{const e=document.createElement("canvas");Ot.Z.createPopup(Nt.Z).open(e,(e=>{e().then((e=>this.managers.appProfileManager.uploadProfilePhoto(e)))}))}),{listenerSetter:this.listenerSetter}),this.profile.element.lastElementChild.firstElementChild.append(i);const s=()=>Ut(this,void 0,void 0,(function*(){var e;const t=yield this.managers.appUsersManager.getSelf();i.classList.toggle("hide","userProfilePhoto"!==(null===(e=t.photo)||void 0===e?void 0:e._))}));s(),this.listenerSetter.add(n.Z)("avatar_update",(({peerId:e})=>{n.Z.myId===e&&s()}));const a=document.createElement("div");a.classList.add("profile-buttons");const o=(e,t,i,s)=>{if(!s){const e=i.getInitArgs;e&&(s=()=>[e(this)])}return{icon:e,text:t,tabConstructor:i,getInitArgs:s,args:null==s?void 0:s()}},r=[o("unmute","AccountSettings.Notifications",It),o("data","DataSettings",Dt),o("lock","AccountSettings.PrivacyAndSecurity",Te),o("settings","Telegram.GeneralSettingsViewController",ht),o("folder","AccountSettings.Filters",Ct)].map((e=>{const{icon:t,text:i,tabConstructor:s,getInitArgs:n}=e;return new P.ZP({titleLangKey:i,icon:t,clickable:()=>Ut(this,void 0,void 0,(function*(){const t=e.args?yield e.args:[],i=this.slider.createTab(s);i.open(...t),i instanceof M.h&&n&&i.eventListener.addEventListener("destroyAfter",(t=>{e.args=t.then((()=>n()))}))})),listenerSetter:this.listenerSetter})})),d=Mt.getInitArgs();r.push(this.devicesRow=new P.ZP({titleLangKey:"Devices",titleRightSecondary:" ",icon:"activesessions",clickable:()=>Ut(this,void 0,void 0,(function*(){this.authorizations||(yield this.updateActiveSessions());const e=this.slider.createTab(ge);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",(()=>{this.authorizations=void 0,this.updateActiveSessions(!0)}),{once:!0}),e.open()})),listenerSetter:this.listenerSetter}),this.languageRow=new P.ZP({titleLangKey:"AccountSettings.Language",titleRightSecondary:(0,f.ag)("LanguageName"),icon:"language",clickable:()=>{this.slider.createTab(Mt).open(d)},listenerSetter:this.listenerSetter})),a.append(...r.map((e=>e.container)));const l=new b.Z;l.content.append(a),this.scrollable.append(this.profile.element,l.container);const c=()=>{h=ut.Z.getInitArgs()};let h;(0,v.fc)(this.buttons.edit,(()=>{this.slider.createTab(ut.Z).open(h)}),{listenerSetter:this.listenerSetter}),c(),this.listenerSetter.add(n.Z)("user_update",(e=>{n.Z.myId.toUserId()===e&&c()})),pt.Z.loadLottieWorkers(),this.updateActiveSessions(),(yield t)()}))}getAuthorizations(e){if(this.getAuthorizationsPromise&&!e)return this.getAuthorizationsPromise;const t=this.getAuthorizationsPromise=this.managers.apiManager.invokeApi("account.getAuthorizations").finally((()=>{this.getAuthorizationsPromise===t&&(this.getAuthorizationsPromise=void 0)}));return t}updateActiveSessions(e){return this.getAuthorizations(e).then((e=>{this.authorizations=e.authorizations,this.devicesRow.titleRight.textContent=""+this.authorizations.length}))}onCloseAfterTimeout(){return this.profile.destroy(),super.onCloseAfterTimeout()}}class zt extends l._{constructor(){super(...arguments),this.uploadAvatar=null}init(){this.container.classList.add("new-channel-container"),this.setTitle("NewChannel"),this.avatarEdit=new p.Z((e=>{this.uploadAvatar=e}));const e=new b.Z({caption:"Channel.DescriptionHolderDescrpiton"}),t=document.createElement("div");t.classList.add("input-wrapper"),this.channelNameInputField=new u.ZP({label:"EnterChannelName",maxLength:128}),this.channelDescriptionInputField=new u.ZP({label:"DescriptionOptionalPlaceholder",maxLength:255}),t.append(this.channelNameInputField.container,this.channelDescriptionInputField.container);const i=()=>{this.nextBtn.classList.toggle("is-visible",!!this.channelNameInputField.value.length&&!this.channelNameInputField.input.classList.contains("error")&&!this.channelDescriptionInputField.input.classList.contains("error"))};this.channelNameInputField.input.addEventListener("input",i),this.channelDescriptionInputField.input.addEventListener("input",i),this.nextBtn=(0,m.Z)({icon:"arrow_next"}),(0,v.fc)(this.nextBtn,(()=>{const e=this.channelNameInputField.value,t=this.channelDescriptionInputField.value;this.nextBtn.disabled=!0,this.managers.appChatsManager.createChannel({title:e,about:t,broadcast:!0}).then((e=>{this.uploadAvatar&&this.uploadAvatar().then((t=>{this.managers.appChatsManager.editPhoto(e,t)})),s.ZP.setInnerPeer({peerId:e.toPeerId(!0)}),hi.removeTabFromHistory(this),this.slider.createTab(_.Z).open({type:"channel",skippable:!0,title:"GroupAddMembers",placeholder:"SendMessageTo",takeOut:t=>this.managers.appChatsManager.inviteToChannel(e,t)})}))}),{listenerSetter:this.listenerSetter}),this.content.append(this.nextBtn),e.content.append(this.avatarEdit.container,t),this.scrollable.append(e.container)}onCloseAfterTimeout(){return this.avatarEdit.clear(),this.uploadAvatar=null,this.channelNameInputField.value="",this.channelDescriptionInputField.value="",this.nextBtn.disabled=!1,super.onCloseAfterTimeout()}}var jt=i(241),Gt=i(2621),Vt=i(709),Kt=i(6272);class Wt extends Ot.Z{constructor(){super("popup-create-contact popup-send-photo popup-new-media",{closable:!0,withConfirm:"Add",title:"AddContactTitle"}),this.construct()}construct(){return e=this,t=void 0,s=function*(){(0,v.fc)(this.btnConfirm,(()=>{const e=this.managers.appUsersManager.importContact(i.value,s.value,n.value);e.then((()=>{this.hide()}),(e=>{"NO_USER"===e.type&&((0,ee.bC)({langPackKey:"Contacts.PhoneNumber.NotRegistred"}),d.disabled=!1)})),d.lockWithPromise(e)}),{listenerSetter:this.listenerSetter});const e=[],t=document.createElement("div");t.classList.add("name-fields");const i=new u.ZP({label:"FirstName",name:"create-contact-name",maxLength:70,required:!0}),s=new u.ZP({label:"LastName",name:"create-contact-lastname",maxLength:70}),n=new Vt.Z({required:!0});e.push(i,s,n);const a=()=>{const e=i.value+" "+s.value;d.avatarElem.peerTitle=e,d.avatarElem.update()};this.listenerSetter.add(i.input)("input",a),this.listenerSetter.add(s.input)("input",a),n.validate=()=>!!n.value.match(/\d/);const o=yield this.managers.appUsersManager.getSelf(),r=(0,Kt.u)(o.phone);r.code&&(n.value="+"+r.code.country_code);const d=new Gt.Z({inputFields:e,listenerSetter:this.listenerSetter,doNotEditAvatar:!0,nextBtn:this.btnConfirm,avatarSize:100});t.append(i.container,s.container,d.avatarElem),this.container.append(t,n.container),this.show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var $t=i(2894),qt=i(3624);class Qt extends l._{init(){this.container.id="contacts-container";const e=(0,m.Z)({icon:"add",className:"is-visible"});this.content.append(e),(0,v.fc)(e,(()=>{Ot.Z.createPopup(Wt)}),{listenerSetter:this.listenerSetter}),this.inputSearch=new d.Z("Search",(e=>{this.openContacts(e)})),this.listenerSetter.add(n.Z)("contacts_update",(e=>{return t=this,i=void 0,n=function*(){const t=yield this.managers.appUsersManager.isContact(e),i=e.toPeerId();t?this.sortedUserList.add(i):this.sortedUserList.delete(i)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n})),this.title.replaceWith(this.inputSearch.container),this.middleware=(0,qt.k)(),this.openContacts()}createList(){const e=new $t.Z({managers:this.managers}),t=e.list;return t.id="contacts",t.classList.add("contacts-container"),h.default.setListClickListener(t,(()=>{this.close()}),void 0,!0),e}onClose(){this.middleware.clean()}onOpenAfterTimeout(){!z.IS_MOBILE&&j(!0)&&this.inputSearch.input.focus()}openContacts(e){this.middleware.clean();const t=this.middleware.get();this.scrollable.onScrolledBottom=null,this.scrollable.container.textContent="",this.managers.appUsersManager.getContactsPeerIds(e,void 0,"online").then((e=>{if(!t())return;const i=this.sortedUserList=this.createList();let s=()=>{const t=jt.Z.height/56*1.25|0;e.splice(0,t).forEach((e=>{i.add(e)})),e.length||(s=void 0,this.scrollable.onScrolledBottom=null)};s(),this.scrollable.onScrolledBottom=()=>{s?s():this.scrollable.onScrolledBottom=null},(0,Z.Z)(this.scrollable.container,i.list)}))}}class Yt extends l._{init(){if(this.wasFilterId=h.default.filterId,this.container.id="chats-archived-container",this.setTitle("ArchivedChats"),this.header.classList.add("can-have-forum"),this.content.classList.add("can-have-forum"),!h.default.xds[Yt.filterId]){const{ul:e,scrollable:t}=h.default.l({title:void 0,id:Yt.filterId,localId:gt.Zi});t.container.append(e)}const e=h.default.xds[Yt.filterId].scrollable;return this.scrollable.container.replaceWith(e.container),e.attachBorderListeners(this.container),h.default.setFilterIdAndChangeTab(Yt.filterId).then((({cached:e,renderPromise:t})=>{if(e)return t}))}onOpenAfterTimeout(){h.default.xds[this.wasFilterId].clear()}onClose(){this.scrollable.onAdditionalScroll=void 0,h.default.setFilterIdAndChangeTab(this.wasFilterId)}onCloseAfterTimeout(){return h.default.xds[Yt.filterId].clear(),super.onCloseAfterTimeout()}}Yt.filterId=gt.Zi;class Xt extends l._{constructor(){super(...arguments),this.isLocationWatched=!1}parseDistance(e){return"miles"===n.Z.settings.distanceUnit?e>1609.34?(0,f.ag)("MilesAway",[Math.round(e/1609)]):(0,f.ag)("FootsAway",[Math.round(3.281*e)]):e>=1e3?(0,f.ag)("KMetersAway2",[e/1e3]):(0,f.ag)("MetersAway2",[e])}startWatching(){this.latestLocationSaved&&!this.isLocationWatched&&(this.isLocationWatched=!0,(0,ee.Am)("Your position is now being shared. Do not close the page or it will be suspended."),this.managers.appUsersManager.getLocated(this.latestLocationSaved.latitude,this.latestLocationSaved.longitude,this.latestLocationSaved.accuracy,!0,2147483647),navigator.geolocation.watchPosition((e=>{const t=e.coords.longitude!==this.latestLocationSaved.longitude,i=e.coords.latitude!==this.latestLocationSaved.latitude,s=this.calculateDistance(e.coords.latitude,e.coords.longitude,this.latestLocationSaved.latitude,this.latestLocationSaved.longitude)>100;(i||t)&&s&&(this.managers.appUsersManager.getLocated(e.coords.latitude,e.coords.longitude,e.coords.accuracy,!0,2147483647),this.latestLocationSaved={latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy})})))}stopWatching(){this.isLocationWatched&&(this.isLocationWatched=!1,(0,ee.Am)("The sharing of your position has been stopped. You will no longer be visible to other users."),this.managers.appUsersManager.getLocated(0,0,0,!1,0))}calculateDistance(e,t,i,s){const n=.017453292519943295;return 12742*Math.asin(Math.sqrt(.5-Math.cos((i-e)*n)+Math.cos(e*n)*Math.cos(i*n)*(1-Math.cos((s-t)*n)/2)))}}var Jt=i(6385),ei=i(8842),ti=i(4159),ii=i(7487),si=i(1405),ni=i(2559),ai=i(4755),oi=i(3035),ri=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const di="is-left-column-shown";class li extends l.Z{constructor(){super({sidebarEl:document.getElementById("column-left"),navigationType:"left"}),this.searchGroups={}}construct(e){this.managers=e,this.inputSearch=new d.Z("Search");const t=this.sidebarEl.querySelector(".item-main .sidebar-header");t.append(this.inputSearch.container);const i=()=>{this.createTab(Qt).open()};this.backBtn=this.sidebarEl.querySelector(".sidebar-back-button");const a={icon:"archive",text:"ArchivedChats",onClick:()=>{this.createTab(Yt).open()},verify:()=>ri(this,void 0,void 0,(function*(){return!!(yield this.managers.dialogsStorage.getFolderDialogs(gt.Zi,!1)).length||!(yield this.managers.dialogsStorage.isDialogsLoaded(gt.Zi))}))},o=new Ce.Z({toggle:!0,checked:"night"===Ge.Z.getTheme().name});o.input.addEventListener("change",(()=>ri(this,void 0,void 0,(function*(){yield this.managers.appStateManager.setByKey("settings.theme",o.input.checked?"night":"day"),n.Z.dispatchEvent("theme_change")})))),n.Z.addEventListener("theme_change",(()=>{o.setValueSilently("night"===Ge.Z.getTheme().name)}));const r=[{icon:"savedmessages",text:"SavedMessages",onClick:()=>{setTimeout((()=>{s.ZP.setPeer({peerId:s.ZP.myId})}),0)}},a,{icon:"user",text:"Contacts",onClick:i},ot.Z?{icon:"group",text:"PeopleNearby",onClick:()=>{this.createTab(Xt).open()}}:void 0,{icon:"settings",text:"Settings",onClick:()=>{this.createTab(Ht).open()}},{icon:"darkmode",text:"DarkMode",onClick:()=>{},checkboxField:o},{icon:"animations",text:"Animations",onClick:()=>{},checkboxField:new Ce.Z({toggle:!0,checked:!0,stateKey:"settings.animationsEnabled"})},{icon:"help",text:"TelegramFeatures",onClick:()=>{const e=f.ZP.format("TelegramFeaturesUrl",!0);s.ZP.openUrl(e)}},{icon:"bug",text:"ReportBug",onClick:()=>{const e=document.createElement("a");e.target="_blank",e.href="https://bugs.telegram.org/?tag_ids=40&sort=time",document.body.append(e),e.click(),setTimeout((()=>{e.remove()}),0)}},{icon:"char z",text:"ChatList.Menu.SwitchTo.Z",onClick:()=>{Promise.all([ii.Z.set({kz_version:"Z"}),ii.Z.delete("tgme_sync")]).then((()=>{location.href="https://web.telegram.org/z/"}))},verify:()=>ti.Z.isMainDomain},{icon:"char w",text:"ChatList.Menu.SwitchTo.Webogram",onClick:()=>{ii.Z.delete("tgme_sync").then((()=>{location.href="https://web.telegram.org/?legacy=1"}))},verify:()=>ti.Z.isMainDomain}].filter(Boolean);this.toolsBtn=(0,E.Z)({direction:"bottom-right",buttons:r,onOpen:(e,t)=>{var i;const s=document.createElement("a");s.href="https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md",s.target="_blank",s.rel="noopener noreferrer",s.classList.add("btn-menu-footer"),s.addEventListener(v.pf,(e=>{e.stopPropagation(),me.Z.close()}));const n=document.createElement("span");n.classList.add("btn-menu-footer-text"),n.innerHTML="Telegram Web"+ti.Z.suffix+" "+ti.Z.versionFull,s.append(n),t.classList.add("has-footer"),t.append(s),null===(i=a.element)||void 0===i||i.append(this.archivedCount)}}),this.toolsBtn.classList.remove("tgico-more"),this.toolsBtn.classList.add("sidebar-tools-button","is-visible"),this.backBtn.parentElement.insertBefore(this.toolsBtn,this.backBtn),this.newBtnMenu=(0,E.Z)({direction:"top-left",buttons:[{icon:"newchannel",text:"NewChannel",onClick:()=>{this.createTab(zt).open()}},{icon:"newgroup",text:"NewGroup",onClick:()=>{this.createTab(_.Z).open({type:"chat",skippable:!1,takeOut:e=>this.createTab(y).open(e),title:"GroupAddMembers",placeholder:"SendMessageTo"})}},{icon:"newprivate",text:"NewPrivateChat",onClick:i}]}),this.newBtnMenu.className="btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon",this.newBtnMenu.insertAdjacentHTML("afterbegin",'\n \n \n '),this.newBtnMenu.id="new-menu",t.nextElementSibling.append(this.newBtnMenu),this.updateBtn=document.createElement("div"),this.updateBtn.className="btn-circle rp btn-corner z-depth-1 btn-update is-hidden",(0,si.Z)(this.updateBtn),this.updateBtn.append((0,f.ag)("Update")),(0,v.fc)(this.updateBtn,(()=>{this.updateBtn.classList.contains("is-hidden")||location.reload()})),t.nextElementSibling.append(this.updateBtn),this.inputSearch.input.addEventListener("focus",(()=>this.initSearch()),{once:!0}),this.archivedCount=document.createElement("span"),this.archivedCount.className="archived-count badge badge-24 badge-gray",n.Z.addEventListener("folder_unread",(e=>{if(e.id===gt.Zi){const t=e.unreadPeerIds.size;this.archivedCount.textContent=""+(0,ni.Z)(t,1),this.archivedCount.classList.toggle("hide",!t)}})),this.managers.appUsersManager.getTopPeers("correspondents");const l={type:"global-search-focus",onPop:()=>(setTimeout((()=>{this.inputSearch.input.focus()}),0),!1),noHistory:!0};Jt.Z.pushItem(l),Lt.Z.getState().then((()=>{const e=setInterval((()=>{fetch("version",{cache:"no-cache"}).then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((t=>{t!==ti.Z.versionFull&&(this.hasUpdate=!0,clearInterval(e),this.newBtnMenu.classList.contains("is-hidden")||this.updateBtn.classList.remove("is-hidden"))})).catch(Ie.Z)}),18e5)}));const c=()=>{const e=this.rect=this.tabsContainer.getBoundingClientRect();document.documentElement.style.setProperty("--left-column-width",e.width+"px")};(0,oi.T2)(c),ai.Z.addEventListener("resize",c)}initSearch(){const e=this.sidebarEl.querySelector("#search-container"),t=new r.ZP(e),i=()=>{(0,v.tH)(this.backBtn)};this.searchGroups={contacts:new a.z("SearchAllChatsShort","contacts",void 0,void 0,void 0,void 0,i),globalContacts:new a.z("GlobalSearch","contacts",void 0,void 0,void 0,void 0,i),messages:new a.z("SearchMessages","messages"),people:new a.z(!1,"contacts",!0,"search-group-people",!0,!1,i,!0),recent:new a.z("Recent","contacts",!0,"search-group-recent",!0,!0,i)};const s=this.searchSuper=new S.Z({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"FilterChats",type:"chats"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:t,searchGroups:this.searchGroups,asChatList:!0,hideEmptyTabs:!1,showSender:!0,managers:this.managers});e.prepend(s.nav.parentElement.parentElement),t.container.append(s.container),s.setQuery({peerId:"".toPeerId(),folderId:0}),s.selectTab(0),s.load(!0);const n=[];let d="".toPeerId(),l=0,u=0;const p=()=>{this.inputSearch.container.classList.toggle("is-picked-twice",2===n.length),this.inputSearch.container.classList.toggle("is-picked",!!n.length),n.length?this.inputSearch.input.style.setProperty("--paddingLeft",n[n.length-1].getBoundingClientRect().right-this.inputSearch.input.getBoundingClientRect().left+"px"):this.inputSearch.input.style.removeProperty("--paddingLeft")},f=document.createElement("div");f.classList.add("search-helper"),f.addEventListener("click",(e=>{const t=(0,he.Z)(e.target,"selector-user");if(!t)return;const i=t.dataset.key;if(0===i.indexOf("date_")){const[e,t,s]=i.split("_");l=+t,u=+s}else d=i.toPeerId();t.addEventListener("click",(()=>{g(t)})),this.inputSearch.container.append(t),this.inputSearch.onChange(this.inputSearch.value=""),n.push(t),p()})),s.nav.parentElement.append(f);const m=(e,t)=>{const i=document.createElement("div");i.classList.add("selector-user");const s=new o.Z;return s.classList.add("selector-user-avatar","tgico","avatar-32"),s.isDialog=!0,i.dataset.key=""+e,e.isPeerId()?(void 0===t&&(t=new ei.Z({peerId:e.toPeerId()}).element),s.updateWithOptions({peerId:e})):s.classList.add("tgico-calendarfilter"),t&&("string"==typeof t?i.innerHTML=t:((0,Z.Z)(i,t),i.append(t))),i.insertAdjacentElement("afterbegin",s),i},g=e=>{0===e.dataset.key.indexOf("date_")?l=u=0:d="".toPeerId(),e.remove(),(0,yt.Z)(n,e),setTimeout((()=>{p(),this.inputSearch.onChange(this.inputSearch.value)}),0)};this.inputSearch.onClear=()=>{n.forEach((e=>{g(e)}))},this.inputSearch.onChange=e=>{if(s.cleanupHTML(),s.setQuery({peerId:d,folderId:d?void 0:0,query:e,minDate:l,maxDate:u}),s.load(!0),f.innerHTML="",s.nav.classList.remove("hide"),!d&&e.trim()){const t=s.middleware.get();Promise.all([this.managers.dialogsStorage.getDialogs({query:e}).then((({dialogs:e})=>e.map((e=>e.peerId)))),this.managers.appUsersManager.getContactsPeerIds(e,!0)]).then((e=>{t()&&(new Set(e[0].concat(e[1])).forEach((e=>{f.append(m(e))})),s.nav.classList.toggle("hide",!!f.innerHTML))}))}if(!l&&e.trim()){const t=[];(0,C.fl)(e,t),t.forEach((e=>{f.append(m("date_"+e.minDate+"_"+e.maxDate,e.title))})),s.nav.classList.toggle("hide",!!f.innerHTML)}},s.tabs.inputMessagesFilterEmpty.addEventListener("mousedown",(e=>{const t=(0,be.Z)(e.target,h.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=(0,he.Z)(t,"search-group");if(!i||i.classList.contains("search-group-recent")||i.classList.contains("search-group-people"))return;const s=t.getAttribute("data-peer-id").toPeerId();this.managers.appUsersManager.pushRecentSearch(s)}),{capture:!0});const b=document.createElement("div");b.classList.add("search-group-scrollable"),b.append(this.searchGroups.people.list),this.searchGroups.people.container.append(b),new r.v7(b);let y,w=!0;const L=(0,c.Z)({content:e.parentElement,type:"zoom-fade",transitionTime:150,onTransitionEnd:e=>{y&&clearTimeout(y),0!==e||w||(s.selectTab(0,!1),this.inputSearch.onClearClick(),y=window.setTimeout((()=>{y=0,this.newBtnMenu.classList.remove("is-hidden"),this.hasUpdate&&this.updateBtn.classList.remove("is-hidden")}),150)),w=!1}});L(0);const E="is-visible",I=()=>{this.toolsBtn.classList.remove(E),this.backBtn.classList.add(E),this.newBtnMenu.classList.add("is-hidden"),this.updateBtn.classList.add("is-hidden"),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!0);const e="global-search";z.IS_MOBILE_SAFARI||Jt.Z.findItemByType(e)||Jt.Z.pushItem({onPop:()=>{i()},type:e}),L(1)};this.inputSearch.input.addEventListener("focus",I),I(),(0,v.fc)(this.backBtn,(e=>{this.toolsBtn.classList.add(E),this.backBtn.classList.remove(E),this.toolsBtn.parentElement.firstElementChild.classList.toggle("state-back",!1),Jt.Z.removeByType("global-search"),L(0)}));const M=(0,Rt.Z)("close");this.searchGroups.recent.nameEl.append(M),M.addEventListener("click",(()=>{(0,Ee.Z)({descriptionLangKey:"Search.Confirm.ClearHistory",button:{langKey:"ClearButton",isDanger:!0}}).then((()=>this.managers.appUsersManager.clearRecentSearch().then((()=>{this.searchGroups.recent.clear()}))))}))}}const ci=new li;L.GO.appSidebarLeft=ci;const hi=ci},5670:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(3552),n=i(5644),a=i(279),o=i(8119);class r extends s._{init(e){this.container.classList.add("add-members-container"),this.nextBtn=(0,o.Z)({icon:"arrow_next"}),this.content.append(this.nextBtn),this.scrollable.container.remove(),this.nextBtn.addEventListener("click",(()=>{const e=this.selector.getSelected().map((e=>e.toPeerId())),t=this.takeOut(e);this.skippable?this.close():t instanceof Promise?this.attachToPromise(t):void 0===t&&this.close()})),this.setTitle(e.title),this.peerType=e.type,this.takeOut=e.takeOut,this.skippable=e.skippable;const t="privacy"===this.peerType;this.selector=new n.Z({appendTo:this.content,onChange:this.skippable?null:e=>{this.nextBtn.classList.toggle("is-visible",!!e)},peerType:[t?"dialogs":"contacts"],placeholder:e.placeholder,exceptSelf:t,filterPeerTypeBy:t?["isAnyGroup","isUser"]:void 0,managers:this.managers,design:"square"}),e.selectedPeerIds&&this.selector.addInitial(e.selectedPeerIds),this.nextBtn.classList.add("tgico-arrow_next"),this.nextBtn.innerHTML="",this.nextBtn.disabled=!1,this.nextBtn.classList.toggle("is-visible",this.skippable)}attachToPromise(e){const t=(0,a.p)(this.nextBtn,"arrow_next");e.then((()=>{this.close()}),(()=>{t()}))}}},534:(e,t,i)=>{"use strict";i.d(t,{Z:()=>k});var s=i(8130),n=i(1447),a=i(3552),o=i(2796),r=i(503),d=i(2230),l=i(5322),c=i(4494),h=i(5644),u=i(9807),p=i(2325),f=i(8479),m=i(7625),g=i(130),v=i(8115),b=i(1507),y=i(3512),w=i(2738),S=i(5029),C=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class L extends a._{constructor(){super(...arguments),this.renderResults=e=>C(this,void 0,void 0,(function*(){yield this.managers.appUsersManager.getContacts(),e.forEach((e=>{const{dom:t}=s.default.addDialogNew({peerId:e,container:this.selector.scrollable,rippleEnabled:!0,avatarSize:"abitbigger"}),i=this.selector.selected.has(e);t.containerEl.append(this.checkbox(i));const n=[];this.dialogsByFilters.forEach(((t,i)=>{if(t.has(e)){const e=document.createElement("span");(0,g.Z)(e,(0,v.Z)(i.title)),n.push(e)}})),(0,p.v_)(n,!1).forEach((e=>{t.lastMessageSpan.append(e)}))}))})),this.onSelectChange=e=>{"included"===this.type&&(this.confirmBtn.style.display=e?"":"none")}}init(e,t,i){this.originalFilter=e,this.filter=(0,f.Z)(this.originalFilter),this.type=t,this.editFolderTab=i,this.content.remove(),this.container.classList.add("included-chatlist-container"),this.confirmBtn=(0,d.Z)("check btn-confirm blue",{noRipple:!0}),this.confirmBtn.style.display="none",this.header.append(this.confirmBtn),(0,w.fc)(this.confirmBtn,(()=>C(this,void 0,void 0,(function*(){const e=this.selector.getSelected();if("included"===this.type)for(const e in this.filter.pFlags)0!==e.indexOf("exclude_")&&delete this.filter.pFlags[e];else for(const e in this.filter.pFlags)0===e.indexOf("exclude_")&&delete this.filter.pFlags[e];const t=[];for(const i of e)i.isPeerId()?t.push(i.toPeerId()):this.filter.pFlags[i]=!0;let i;i="included"===this.type?e=>t.includes(e):e=>!t.includes(e),(0,m.Z)(this.filter.pinnedPeerIds,((e,t)=>{i(e)||(this.filter.pinnedPeerIds.splice(t,1),this.filter.pinned_peers.splice(t,1))}));const s="included"===this.type?"excludePeerIds":"includePeerIds",n="included"===this.type?"exclude_peers":"include_peers";(0,m.Z)(this.filter[s],((e,i)=>{t.includes(e)&&(this.filter[s].splice(i,1),this.filter[n].splice(i,1))})),this.filter["included"===this.type?"includePeerIds":"excludePeerIds"]=t,this.filter["included"===this.type?"include_peers":"exclude_peers"]=yield Promise.all(t.map((e=>this.managers.appPeersManager.getInputPeerById(e)))),this.editFolderTab.setFilter(this.filter,!1),this.close()}))),{listenerSetter:this.listenerSetter});const s=e=>{this.limit=y.Z.premium?e.dialog_filters_chats_limit_premium:e.dialog_filters_chats_limit_default};return this.listenerSetter.add(y.Z)("app_config",s),this.dialogsByFilters=new Map,Promise.all([this.managers.filtersStorage.getDialogFilters().then((e=>C(this,void 0,void 0,(function*(){yield Promise.all(e.filter((e=>!b.DZ.has(e.id))).map((e=>C(this,void 0,void 0,(function*(){const t=(yield this.managers.dialogsStorage.getFolderDialogs(e.id)).map((e=>e.peerId));this.dialogsByFilters.set(e,new Set(t))})))))})))),this.managers.apiManager.getAppConfig().then((e=>{s(e)}))])}checkbox(e){const t=new u.Z({round:!0});return e&&(t.input.checked=e),t.label}onOpen(){this.confirmBtn.style.display="excluded"===this.type?"":"none",this.setTitle("included"===this.type?"FilterAlwaysShow":"FilterNeverShow");const e=this.filter,t=new S.Z({noDelimiter:!0,name:"FilterChatTypes"});let i;t.container.classList.add("folder-categories"),i="excluded"===this.type?{exclude_muted:{ico:"mute",text:"ChatList.Filter.MutedChats"},exclude_archived:{ico:"archive",text:"ChatList.Filter.Archive"},exclude_read:{ico:"readchats",text:"ChatList.Filter.ReadChats"}}:{contacts:{ico:"newprivate",text:"ChatList.Filter.Contacts"},non_contacts:{ico:"noncontacts",text:"ChatList.Filter.NonContacts"},groups:{ico:"group",text:"ChatList.Filter.Groups"},broadcasts:{ico:"newchannel",text:"ChatList.Filter.Channels"},bots:{ico:"bots",text:"ChatList.Filter.Bots"}};const s=document.createDocumentFragment();for(const e in i){const t=(0,c.Z)("btn-primary btn-transparent folder-category-button",{icon:i[e].ico,text:i[e].text});t.dataset.peerId=e,t.append(this.checkbox()),s.append(t)}t.content.append(s);const n=("included"===this.type?e.includePeerIds:e.excludePeerIds).slice();this.selector=new h.Z({appendTo:this.container,onChange:this.onSelectChange,peerType:["dialogs"],renderResultsFunc:this.renderResults,placeholder:"Search",sectionNameLangPackKey:"FilterChats",managers:this.managers}),this.selector.selected=new Set(n);let a=!1;const r=this.selector.add.bind(this.selector);this.selector.add=(e,t,s)=>{if(this.selector.selected.size>=this.limit&&a&&!i[e]){const t=this.selector.list.querySelector(`[data-peer-id="${e}"] [type="checkbox"]`);t&&setTimeout((()=>{t.checked=!1}),0);const i=p.ZP.format("excluded"===this.type?"ChatList.Filter.Exclude.LimitReached":"ChatList.Filter.Include.LimitReached",!0);return void(0,o.Am)(i)}const n=r(e,i[e]?(0,p.ag)(i[e].text):void 0,s);return i[e]&&n.querySelector("avatar-element").classList.add("tgico-"+i[e].ico),n},this.selector.scrollable.container.append(t.container,this.selector.scrollable.container.lastElementChild),this.selector.addInitial(n),a=!0;for(const s in e.pFlags)i.hasOwnProperty(s)&&e.pFlags[s]&&(0,w.tH)(t.content.querySelector(`[data-peer-id="${s}"]`))}onCloseAfterTimeout(){return this.selector&&(this.selector.container.remove(),this.selector=null),super.onCloseAfterTimeout()}}var E=i(8127),I=i(6848),M=i(3066),P=i(2353),Z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class k extends a._{constructor(){super(...arguments),this.flags={}}static getInitArgs(){return{animationData:n.Z.loadAnimationFromURLManually("Folders_2")}}init(e=k.getInitArgs()){this.container.classList.add("edit-folder-container"),this.caption=document.createElement("div"),this.caption.classList.add("caption"),this.caption.append((0,p.ag)("FilterIncludeExcludeInfo")),this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add("sticker-container"),this.confirmBtn=(0,d.Z)("check btn-confirm hide blue");const t={icon:"delete danger",text:"FilterMenuDelete",onClick:()=>{new E.Z("filter-delete",{titleLangKey:"ChatList.Filter.Confirm.Remove.Header",descriptionLangKey:"ChatList.Filter.Confirm.Remove.Text",buttons:[{langKey:"Delete",callback:()=>{t.element.setAttribute("disabled","true"),this.managers.filtersStorage.updateDialogFilter(this.filter,!0).then((e=>{e&&this.close()})).finally((()=>{t.element.removeAttribute("disabled")}))},isDanger:!0}]}).show()}};this.menuBtn=(0,l.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[t]}),this.menuBtn.classList.add("hide"),this.header.append(this.confirmBtn,this.menuBtn);const i=new S.Z({}),s=document.createElement("div");s.classList.add("input-wrapper"),this.nameInputField=new r.ZP({label:"FilterNameHint",maxLength:12}),s.append(this.nameInputField.container),i.content.append(s);const a=(e,t,i,s)=>{const n=new S.Z({name:t,noDelimiter:!0});n.container.classList.add("folder-list",e);const a=n.generateContentElement();return a.classList.add("folder-categories"),i.forEach((e=>{const t=(0,c.Z)("folder-category-button btn btn-primary btn-transparent",{icon:e.icon,text:e.text,noRipple:!e.withRipple||void 0});e.name&&(s[e.name]=t),a.append(t)})),n};this.includePeerIds=a("folder-list-included","FilterInclude",[{icon:"add primary",text:"ChatList.Filter.Include.AddChat",withRipple:!0},{text:"ChatList.Filter.Contacts",icon:"newprivate",name:"contacts"},{text:"ChatList.Filter.NonContacts",icon:"noncontacts",name:"non_contacts"},{text:"ChatList.Filter.Groups",icon:"group",name:"groups"},{text:"ChatList.Filter.Channels",icon:"channel",name:"broadcasts"},{text:"ChatList.Filter.Bots",icon:"bots",name:"bots"}],this.flags),this.excludePeerIds=a("folder-list-excluded","FilterExclude",[{icon:"minus primary",text:"ChatList.Filter.Exclude.AddChat",withRipple:!0},{text:"ChatList.Filter.MutedChats",icon:"mute",name:"exclude_muted"},{text:"ChatList.Filter.Archive",icon:"archive",name:"exclude_archived"},{text:"ChatList.Filter.ReadChats",icon:"readchats",name:"exclude_read"}],this.flags),this.scrollable.append(this.stickerContainer,this.caption,i.container,this.includePeerIds.container,this.excludePeerIds.container);const h=this.includePeerIds.container.querySelector(".folder-categories"),u=this.excludePeerIds.container.querySelector(".folder-categories");(0,w.fc)(h.querySelector(".btn"),(()=>{this.slider.createTab(L).open(this.filter,"included",this)}),{listenerSetter:this.listenerSetter}),(0,w.fc)(u.querySelector(".btn"),(()=>{this.slider.createTab(L).open(this.filter,"excluded",this)}),{listenerSetter:this.listenerSetter}),(0,w.fc)(this.confirmBtn,(()=>{if(this.nameInputField.input.classList.contains("error"))return;if(!this.nameInputField.value.trim())return void this.nameInputField.input.classList.add("error");let e,t=Array.from(h.children).slice(1).reduce(((e,t)=>e+ +!t.style.display),0);t+=this.filter.include_peers.length,t?(this.confirmBtn.setAttribute("disabled","true"),e=this.filter.id?this.managers.filtersStorage.updateDialogFilter(this.filter):this.managers.filtersStorage.createDialogFilter(this.filter),e.then((e=>{e&&this.close()})).catch((e=>{"DIALOG_FILTERS_TOO_MUCH"===e.type?(0,o.Am)("Sorry, you can't create more folders."):console.error("updateDialogFilter error:",e)})).finally((()=>{this.confirmBtn.removeAttribute("disabled")}))):(0,o.Am)("Please choose at least one chat for this folder.")}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.nameInputField.input)("input",(()=>{this.filter.title=this.nameInputField.value,this.editCheckForChange()}));const f="edit"===this.type?[this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"pinned_peers"),this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"include_peers"),this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id,"exclude_peers")]:[];return Promise.all([this.loadAnimationPromise=e.animationData.then((e=>Z(this,void 0,void 0,(function*(){const t=yield e({container:this.stickerContainer,loop:!1,autoplay:!1,width:86,height:86});return this.animation=t,n.Z.waitForFirstFrame(t)})))),...f]).then((()=>{"edit"===this.type?(this.setFilter(this.originalFilter,!0),this.onEditOpen()):this.onCreateOpen()}))}onOpenAfterTimeout(){this.loadAnimationPromise.then((()=>{this.animation.autoplay=!0,this.animation.play()}))}onCreateOpen(){this.setTitle("FilterNew"),this.menuBtn.classList.add("hide"),this.confirmBtn.classList.remove("hide"),this.nameInputField.value="";for(const e in this.flags)this.flags[e].style.display="none"}onEditOpen(){this.setTitle("create"===this.type?"FilterNew":"FilterHeaderEdit"),"edit"===this.type&&(this.menuBtn.classList.remove("hide"),this.confirmBtn.classList.add("hide"));const e=this.filter;this.nameInputField.value=(0,M.Z)(e.title);for(const t in this.flags)this.flags[t].style.display=e.pFlags[t]?"":"none";["includePeerIds","excludePeerIds"].forEach((t=>Z(this,void 0,void 0,(function*(){const i=this[t],n=s.default.createChatList({ignoreClick:!0});let a=e[t];const o=e=>Z(this,void 0,void 0,(function*(){return!!(yield this.managers.appMessagesManager.getDialogOnly(e))||!!e.isUser()&&"user"===(yield this.managers.appUsersManager.getUser(e.toUserId()))._})),r=yield(0,P.Z)(a,(e=>o(e)));a.length=0,a.push(...r),a=a.slice();const d=e=>Z(this,void 0,void 0,(function*(){for(let t=0,i=Math.min(a.length,e);td(20)),{listenerSetter:this.listenerSetter}),l.append((0,p.ag)("FilterShowMoreChats",[a.length])),e.append(l)}d(4)}))))}editCheckForChange(){if("edit"===this.type){const e=!(0,I.Z)(this.originalFilter,this.filter);this.confirmBtn.classList.toggle("hide",!e),this.menuBtn.classList.toggle("hide",e)}}setFilter(e,t){this.container&&Array.from(this.container.querySelectorAll("ul, .load-more")).forEach((e=>e.remove())),t?(this.originalFilter=e,this.filter=(0,f.Z)(e)):(this.filter=e,this.onEditOpen(),this.editCheckForChange())}setInitFilter(e){void 0===e?(this.setFilter({_:"dialogFilter",id:0,title:"",pFlags:{},pinned_peers:[],include_peers:[],exclude_peers:[],pinnedPeerIds:[],includePeerIds:[],excludePeerIds:[]},!0),this.type="create"):(this.setFilter(e,!0),this.type="edit")}}},2010:(e,t,i)=>{"use strict";i.d(t,{J:()=>f,Z:()=>m});var s=i(503),n=i(3552),a=i(2621),o=i(6726),r=i(2325),d=i(2738),l=i(3512),c=i(2521),h=i(6082),u=i(5029),p=i(9522);function f(){const e=document.createElement("div"),t=(0,c.Z)(document.createElement("a")),i=(0,r.ag)("Username.Purchase",[t]);return i.classList.add("username-purchase-help"),e.append(i,document.createElement("br"),document.createElement("br")),e.classList.add("hide"),{element:e,setUsername:i=>{i&&(t.href="https://fragment.com/username/"+i),e.classList.toggle("hide",!i)}}}class m extends n._{static getInitArgs(){return{bioMaxLength:l.Z.managers.apiManager.getLimit("bio"),user:l.Z.managers.appUsersManager.getSelf(),userFull:l.Z.managers.appProfileManager.getProfile(l.Z.myId.toUserId())}}init(e){return t=this,i=void 0,c=function*(){this.container.classList.add("edit-profile-container"),this.setTitle("EditAccount.Title");const t=[],[i,n,c]=yield Promise.all([e.bioMaxLength,e.user,e.userFull]);{const e=(0,u.R)(this.scrollable,void 0,"Bio.Description"),n=document.createElement("div");n.classList.add("input-wrapper"),this.firstNameInputField=new s.ZP({label:"EditProfile.FirstNameLabel",name:"first-name",maxLength:70}),this.lastNameInputField=new s.ZP({label:"Login.Register.LastName.Placeholder",name:"last-name",maxLength:64}),this.bioInputField=new s.ZP({label:"EditProfile.BioLabel",name:"bio",maxLength:i}),n.append(this.firstNameInputField.container,this.lastNameInputField.container,this.bioInputField.container);const o=document.createElement("div");o.classList.add("caption"),(0,r.XZ)({element:o,key:"Bio.Description"}),t.push(this.firstNameInputField,this.lastNameInputField,this.bioInputField),this.editPeer=new a.Z({peerId:l.Z.myId,inputFields:t,listenerSetter:this.listenerSetter}),this.content.append(this.editPeer.nextBtn),e.append(this.editPeer.avatarEdit.container,n)}{const e=new u.Z({name:"EditAccount.Username",caption:!0}),i=document.createElement("div");i.classList.add("input-wrapper"),this.usernameInputField=new o.l({label:"EditProfile.Username.Label",name:"username",plainText:!0,listenerSetter:this.listenerSetter,onChange:()=>{this.editPeer.handleChange();const{error:e}=this.usernameInputField,t="USERNAME_PURCHASE_AVAILABLE"===(null==e?void 0:e.type);n(t?this.usernameInputField.value:void 0)},availableText:"EditProfile.Username.Available",takenText:"EditProfile.Username.Taken",invalidText:"EditProfile.Username.Invalid"},this.managers),i.append(this.usernameInputField.container);const s=e.caption,{setUsername:n,element:a}=f();s.append(a,(0,r.ag)("UsernameHelp")),t.push(this.usernameInputField),e.content.append(i),this.scrollable.append(e.container)}{const e=new p.Z({peerId:l.Z.myId,peer:n,listenerSetter:this.listenerSetter,usernameInputField:this.usernameInputField,middleware:this.middlewareHelper.get()});this.scrollable.append(e.container)}(0,d.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;const e=[],t=this.managers.appProfileManager.updateProfile(this.firstNameInputField.value,this.lastNameInputField.value,this.bioInputField.value);e.push(t.then((()=>{this.close()}),(e=>{console.error("updateProfile error:",e)}))),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then((e=>this.managers.appProfileManager.uploadProfilePhoto(e)))),this.usernameInputField.isValidToChange()&&e.push(this.managers.appUsersManager.updateUsername(this.usernameInputField.value)),Promise.race(e).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled")}))}),{listenerSetter:this.listenerSetter}),this.firstNameInputField.setOriginalValue(n.first_name,!0),this.lastNameInputField.setOriginalValue(n.last_name,!0),this.bioInputField.setOriginalValue(c.about,!0),this.usernameInputField.setOriginalValue((0,h.Z)(n),!0),this.editPeer.handleChange()},new((n=void 0)||(n=Promise))((function(e,s){function a(e){try{r(c.next(e))}catch(e){s(e)}}function o(e){try{r(c.throw(e))}catch(e){s(e)}}function r(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(a,o)}r((c=c.apply(t,i||[])).next())}));var t,i,n,c}}},4332:(e,t,i)=>{"use strict";i.d(t,{HQ:()=>d,ZP:()=>h});var s=i(4271),n=i(3552),a=i(4755),o=i(1669),r=i(410);const d="is-right-column-shown";class l extends n.Z{constructor(){super({sidebarEl:document.getElementById("column-right"),canHideFirst:!0,navigationType:"right"}),this.isColumnProportionSet=!1}construct(e){this.managers=e,a.Z.addEventListener("changeScreen",((e,t)=>{t===a._.medium&&e!==a._.mobile&&this.toggleSidebar(!1)})),a.Z.addEventListener("resize",(()=>{this.setColumnProportion()}))}createSharedMediaTab(){const e=this.createTab(o.Z,!1,!0);return e.slider=this,e}replaceSharedMediaTab(e){const t=this.sharedMediaTab;if(t){const i=this.historyTabIds.indexOf(t);this._selectTab.getFrom()===t.container&&this._selectTab.setFrom(null==e?void 0:e.container),e?(-1!==i&&(this.historyTabIds[i]=e),t.container.classList.contains("active")&&e.container.classList.add("active"),t.container.replaceWith(e.container)):(-1!==i&&this.historyTabIds.splice(i,1),t.container.remove())}else this.tabsContainer.prepend(e.container);this.sharedMediaTab=e}onCloseTab(e,t,i){this.historyTabIds.length||this.toggleSidebar(!1,t),super.onCloseTab(e,t,i)}setColumnProportion(){const e=this.sidebarEl.scrollWidth/this.sidebarEl.previousElementSibling.scrollWidth;document.documentElement.style.setProperty("--right-column-proportion",""+e)}toggleSidebar(e,t){const i=document.body.classList.contains(d);let n;if(void 0!==e?e?i||(n=!0):i&&(n=!0):n=!0,!n)return Promise.resolve();i||this.historyTabIds.length||this.sharedMediaTab.open(),this.isColumnProportionSet||(this.setColumnProportion(),this.isColumnProportionSet=!0);const a=s.ZP.selectTab(i?s.oo.CHAT:s.oo.PROFILE,t);return document.body.classList.toggle(d,e),a}}const c=new l;r.GO.appSidebarRight=c;const h=c},4240:(e,t,i)=>{"use strict";i.d(t,{Z:()=>S});var s=i(3552),n=i(503),a=i(2621),o=i(7479),r=i(9807),d=i(4494),l=i(8842),c=i(3512),h=i(8127),u=i(1168),p=i(2325),f=i(2738),m=i(1656),g=i(2946),v=i(8210),b=i(5029),y=i(7362),w=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class S extends s._{init(){return w(this,void 0,void 0,(function*(){const{peerId:e}=this,t=e.toUserId();this.container.classList.add("edit-peer-container","edit-contact-container");const[i,s]=yield Promise.all([this.managers.appUsersManager.isContact(t),this.managers.appPrivacyManager.getPrivacy("inputPrivacyKeyPhoneNumber")]),S=!i;this.setTitle(S?"AddContactTitle":"Edit");{const i=new b.Z({noDelimiter:!0}),s=[],d=document.createElement("div");if(d.classList.add("input-wrapper"),this.nameInputField=new n.ZP({label:"FirstName",name:"contact-name",maxLength:70,required:!0}),this.lastNameInputField=new n.ZP({label:"LastName",name:"contact-lastname",maxLength:70}),t){const e=yield this.managers.appUsersManager.getUser(t);S?(this.nameInputField.setDraftValue(e.first_name),this.lastNameInputField.setDraftValue(e.last_name)):(this.nameInputField.setOriginalValue(e.first_name),this.lastNameInputField.setOriginalValue(e.last_name))}if(d.append(this.nameInputField.container,this.lastNameInputField.container),s.push(this.nameInputField,this.lastNameInputField),this.editPeer=new a.Z({peerId:e,inputFields:s,listenerSetter:this.listenerSetter,doNotEditAvatar:!0}),this.content.append(this.editPeer.nextBtn),e){const s=document.createElement("div");s.classList.add("avatar-edit"),s.append(this.editPeer.avatarElem);const n=new r.Z({text:"Notifications"});n.input.addEventListener("change",(t=>{t.isTrusted&&this.managers.appMessagesManager.togglePeerMute({peerId:e})})),this.listenerSetter.add(c.Z)("notify_settings",(e=>w(this,void 0,void 0,(function*(){if("notifyPeer"!==e.peer._)return;const t=(0,g.Z)(e.peer.peer);if(t==t){const t=!(yield this.managers.appNotificationsManager.isMuted(e.notify_settings));t!==n.checked&&(n.checked=t)}}))));const a=document.createElement("div");a.classList.add("profile-name"),a.append(new l.Z({peerId:e}).element);const h=document.createElement("div");if(h.classList.add("profile-subtitle"),h.append((0,p.ag)("EditContact.OriginalName")),i.content.append(s,a,h,d),S){const s=yield this.managers.appUsersManager.getUser(t),n=new o.ZP({icon:"phone",titleLangKey:s.phone?void 0:"MobileHidden",title:s.phone?(0,v.Z)(s.phone):void 0,subtitleLangKey:s.phone?"Phone":"MobileHiddenExceptionInfo",subtitleLangArgs:s.phone?void 0:[new l.Z({peerId:e}).element]});i.content.append(n.container)}else{const t=new o.ZP({checkboxField:n,withCheckboxSubtitle:!0,listenerSetter:this.listenerSetter}),s=!(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!1}));n.checked=s,i.content.append(t.container)}}else i.content.append(d);this.scrollable.append(i.container)}if(S){if(s.some((e=>"privacyValueDisallowAll"===e._))&&!s.some((e=>"privacyValueAllowUsers"===e._&&e.users.includes(t)))){const e=new b.Z({caption:"NewContact.Exception.ShareMyPhoneNumber.Desc",captionArgs:[yield(0,y.Z)({peerId:this.peerId})]}),t=this.sharePhoneCheckboxField=new r.Z({text:"NewContact.Exception.ShareMyPhoneNumber",checked:!0}),i=(0,o.tG)(t);e.content.append(i.container),this.scrollable.append(e.container)}}else{const i=new b.Z,s=(0,d.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"PeerInfo.DeleteContact"});(0,f.fc)(s,(()=>{new h.Z("popup-delete-contact",{peerId:e,titleLangKey:"DeleteContact",descriptionLangKey:"AreYouSureDeleteContact",buttons:(0,u.x)([{langKey:"Delete",callback:()=>{const e=(0,m.Z)([s],!0);this.managers.appUsersManager.deleteContacts([t]).then((()=>{this.close()}),(()=>{e()}))},isDanger:!0}])}).show()}),{listenerSetter:this.listenerSetter}),i.content.append(s),this.scrollable.append(i.container)}(0,f.fc)(this.editPeer.nextBtn,(()=>w(this,void 0,void 0,(function*(){var e;this.editPeer.nextBtn.disabled=!0,this.managers.appUsersManager.addContact(t,this.nameInputField.value,this.lastNameInputField.value,(yield this.managers.appUsersManager.getUser(t)).phone,null===(e=this.sharePhoneCheckboxField)||void 0===e?void 0:e.checked).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}))),{listenerSetter:this.listenerSetter})}))}}},730:(e,t,i)=>{"use strict";i.d(t,{Z:()=>C});var s=i(2738),n=i(1656),a=i(9405),o=i(8479),r=i(6848),d=i(4271),l=i(1507),c=i(3785),h=i(2230),u=i(9807),p=i(6039),f=i(503),m=i(7479),g=i(5029),v=i(4273),b=i(6024),y=i(9345),w=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const S=(0,a.C)(64,64);class C extends b.Z{init(e,t){return w(this,void 0,void 0,(function*(){this.colorIndex=0;const i=!t,a=t===l.Ox;this.container.classList.add("edit-topic-container"),this.setTitle(i?"NewTopic":"ForumTopic.Title.Edit");const r=e.toChatId();t&&(this.topic=this.originalTopic=(0,o.Z)(yield this.managers.dialogsStorage.getForumTopic(e,t)));{const i=new g.Z({name:a?"CreateGeneralTopicTitle":"CreateTopicTitle"}),o=this.iconDiv=document.createElement("div");o.classList.add("edit-topic-icon-container"),!t&&(0,s.fc)(o,(()=>{this.topic.icon_emoji_id||(this.colorIndex=(this.colorIndex+1)%l.OS.length,this.setIcon())}),{listenerSetter:this.listenerSetter}),t&&o.classList.add("disable-hover");const c=document.createElement("div");c.classList.add("input-wrapper");const u=this.nameInputField=new f.ZP({label:"ForumTopic.Name.Placeholder",withLinebreaks:!1,name:"topic-name",maxLength:70,required:!0});this.topic&&u.setOriginalValue(this.topic.title,!0);const p=this.confirmBtn=(0,h.Z)("check btn-confirm blue hide",{noRipple:!0});this.header.append(p),(0,s.fc)(p,(()=>{const i=(0,n.Z)([p],!0);t?this.managers.appChatsManager.editForumTopic({chatId:r,topicId:t,title:u.value,iconEmojiId:this.topic.icon_emoji_id||0}).then((()=>{this.close()})).catch((e=>{console.error("edit topic error",e),i()})):this.managers.appChatsManager.createForumTopic({chatId:r,iconColor:l.OS[this.colorIndex],iconEmojiId:this.topic.icon_emoji_id,title:u.value}).then((t=>{this.close(),d.ZP.setInnerPeer({peerId:e,threadId:t})})).catch((e=>{console.error("create topic error",e),i()}))}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(u.input)("input",(()=>{var e;this.validate(),this.setIcon(null===(e=this.topic)||void 0===e?void 0:e.icon_emoji_id)})),c.append(u.container),i.content.append(o,c),this.scrollable.append(i.container)}const c=[];if(a){const e=new g.Z({caption:"EditTopicHideInfo"}),i=new u.Z({checked:!this.topic.pFlags.hidden,text:"EditTopicHide"});this.listenerSetter.add(i.input)("change",(()=>{const e=this.managers.appChatsManager.editForumTopic({chatId:r,topicId:t,hidden:!i.checked});s.disableWithPromise(e)}));const s=new m.ZP({checkboxField:i});e.content.append(s.container),this.scrollable.append(e.container)}else{const e=new g.Z({});e.container.classList.add("edit-topic-emoticons-container");const t=new p.ZP({managers:this.managers,isStandalone:!0,noRegularEmoji:!0,stickerSetId:"inputStickerSetEmojiDefaultTopicIcons",onClick:e=>{t.setActive(e.docId?e:{emoji:void 0,docId:void 0}),this.setIcon(e.docId)}});t.getContainerSize=()=>({width:v.ZP.rect.width,height:400}),this.middlewareHelper.onDestroy((()=>{t.destroy()})),t.container.classList.remove("tabs-tab"),this.emojiElement=document.createElement("span"),this.emojiElement.classList.add("super-emoji-topic-icon");const i=t.init().then((()=>w(this,void 0,void 0,(function*(){var e;const i=t.getCustomCategory(),s=null===(e=this.topic)||void 0===e?void 0:e.icon_emoji_id;t.addEmojiToCategory({category:i,element:this.emojiElement,batch:!1,prepend:!0,active:!s}),s&&t.setActive({docId:s,emoji:""})}))));c.push(i),e.content.replaceWith(t.container),this.scrollable.append(e.container)}return Promise.all(c).then((()=>this.s()))}))}validate(){let e=this.nameInputField.isValidToChange();!e&&this.originalTopic&&(e=this.topic.icon_emoji_id!==this.originalTopic.icon_emoji_id),this.confirmBtn.classList.toggle("hide",!e)}s(){var e,t;return(null===(e=this.topic)||void 0===e?void 0:e.icon_color)&&(this.colorIndex=l.OS.indexOf(this.topic.icon_color)),this.setIcon(null===(t=this.topic)||void 0===t?void 0:t.icon_emoji_id,void 0,!0)}setIcon(e,t=this.iconDiv,i){var s;return w(this,void 0,void 0,(function*(){const n=this.nameInputField.value,a=t===this.iconDiv;if(a){const t={id:null===(s=this.topic)||void 0===s?void 0:s.id,icon_color:l.OS[this.colorIndex],title:(0,c.Z)(n,!0).text||"A",icon_emoji_id:e},a=this.topic;if(this.topic=t,!i&&a&&a.icon_color===t.icon_color&&a.title===t.title||this.setIcon(void 0,this.emojiElement),(0,r.Z)(a,t)&&!i)return;this.validate()}const o=yield(0,y.e)({topic:a?this.topic:Object.assign(Object.assign({},this.topic),{icon_emoji_id:void 0}),customEmojiSize:S,middleware:this.middlewareHelper.get()}),d=document.createElement("div");d.classList.add("edit-topic-icon"),d.append(o);const h=t.lastElementChild;t.append(d);const u=(e,t)=>{const i=e.animate([{opacity:"0",transform:"scale(0.8)"},{opacity:"1",transform:"scale(1)"}],{duration:200,iterations:1,easing:"ease-in-out",fill:"forwards",direction:t?"normal":"reverse"});return new Promise((e=>{i.addEventListener("finish",(()=>{e()}),{once:!0})}))};h&&u(h,!1).then((()=>h.remove())),u(d,!0)}))}}},1669:(e,t,i)=>{"use strict";i.d(t,{Z:()=>de});var s=i(3512),n=i(6360),a=i(3552),o=i(426),r=i(503),d=i(2621),l=i(7479),c=i(4494),h=i(2166),u=i(144),p=i(279),f=i(1218),m=i(2796),g=i(6726),v=i(6024),b=i(2325),y=i(8127),w=i(8119),S=i(2738),C=i(1656),L=i(9807),E=i(5029),I=i(9522),M=i(6082),P=i(5102),Z=i(2010),k=i(5592),T=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class x extends v.h{init(){return T(this,void 0,void 0,(function*(){this.container.classList.add("edit-peer-container","group-type-container");const e=yield this.managers.appChatsManager.isBroadcast(this.chatId);this.setTitle(e?"ChannelType":"GroupType");const t=new E.Z({name:e?"ChannelType":"GroupType"}),i=(0,u.a)(),n=new l.ZP({radioField:new f.Z({langKey:e?"ChannelPrivate":"MegaPrivate",name:i,value:"private"}),subtitleLangKey:e?"ChannelPrivateInfo":"MegaPrivateInfo"}),a=new l.ZP({radioField:new f.Z({langKey:e?"ChannelPublic":"MegaPublic",name:i,value:"public"}),subtitleLangKey:e?"ChannelPublicInfo":"MegaPublicInfo"}),o=(0,l.De)([n,a],(e=>{const t=[[v.container],[H]];"public"===e&&t.reverse(),t[0].forEach((e=>e.classList.remove("hide"))),t[1].forEach((e=>e.classList.add("hide"))),R()}));let r=yield this.managers.appChatsManager.getChat(this.chatId);const d={basic:[]};this.listenerSetter.add(s.Z)("chat_update",(e=>T(this,void 0,void 0,(function*(){this.chatId===e&&(r=yield this.managers.appChatsManager.getChat(this.chatId),d.basic.forEach((e=>e())))})))),t.content.append(o);const v=new E.Z({}),x=new l.ZP({title:this.chatFull.exported_invite.link,subtitleLangKey:e?"ChannelPrivateLinkHelp":"MegaPrivateLinkHelp",clickable:()=>{(0,h.T)(this.chatFull.exported_invite.link),(0,m.Am)(b.ZP.format("LinkCopied",!0))},listenerSetter:this.listenerSetter}),A=(0,c.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"RevokeLink"});(0,S.fc)(A,(()=>{new y.Z("revoke-link",{buttons:[{langKey:"RevokeButton",callback:()=>{const e=(0,C.Z)([A],!0);this.managers.appProfileManager.getChatInviteLink(this.chatId,!0).then((t=>{e(),x.title.innerHTML=t}))}}],titleLangKey:"RevokeLink",descriptionLangKey:"RevokeAlert"}).show()}),{listenerSetter:this.listenerSetter}),v.content.append(x.container,A);const _=new E.Z({caption:!0,noDelimiter:!0}),F=document.createElement("div");F.classList.add("input-wrapper");const D="t.me/",R=()=>{const e=n.radioField.checked&&z!==D||B.isValidToChange()&&B.input.classList.contains("valid");j.classList.toggle("is-visible",e);const{error:t}=B,i="USERNAME_PURCHASE_AVAILABLE"===(null==t?void 0:t.type);N(i?B.getValue():void 0)},B=new g.l({label:"SetUrlPlaceholder",name:"group-public-link",plainText:!0,listenerSetter:this.listenerSetter,availableText:"Link.Available",invalidText:"Link.Invalid",takenText:"Link.Taken",onChange:R,peerId:this.chatId.toPeerId(!0),head:D},this.managers),{setUsername:N,element:O}=(0,Z.J)();_.caption.append(O,(0,b.ag)(e?"Channel.UsernameAboutChannel":"Channel.UsernameAboutGroup"));const U=new I.Z({peerId:this.chatId.toPeerId(!0),peer:r,listenerSetter:this.listenerSetter,usernameInputField:B,middleware:this.middlewareHelper.get()}),H=document.createElement("div");H.append(_.container,U.container);const z=D+((0,M.Z)(r)||"");F.append(B.container),_.content.append(F);const j=(0,w.Z)({icon:"check",className:"is-visible"});this.content.append(j),(0,S.fc)(j,(()=>T(this,void 0,void 0,(function*(){const t=a.radioField.checked?B.getValue():"";if(!t){const t=yield this.managers.appChatsManager.getChat(this.chatId),i=(0,M.Z)(t);i&&(yield(0,k.Z)({descriptionLangKey:e?"ChannelVisibility.Confirm.MakePrivate.Channel":"ChannelVisibility.Confirm.MakePrivate.Group",descriptionLangArgs:[i],button:{langKey:"OK"}}))}(0,p.p)(j),this.managers.appChatsManager.migrateChat(this.chatId).then((e=>t?this.managers.appChatsManager.updateUsername(e,t):this.managers.appChatsManager.makeChannelPrivate(e))).then((()=>{this.close()}))}))),{listenerSetter:this.listenerSetter}),(z!==D||(0,P.Z)(r).length?a:n).radioField.checked=!0,B.setOriginalValue(z,!0),this.scrollable.append(t.container,v.container,H);{const t=new E.Z({name:"SavingContentTitle",caption:e?"RestrictSavingContentInfoChannel":"RestrictSavingContentInfoGroup"}),i=new L.Z({text:"RestrictSavingContent",withRipple:!0});this.listenerSetter.add(i.input)("change",(()=>{const e=i.toggleDisability(!0);this.managers.appChatsManager.toggleNoForwards(this.chatId,i.checked).then((()=>{e()}))}));const s=()=>{i.setValueSilently(!!r.pFlags.noforwards)};((e,t="basic")=>{d[t].push(e)})(s),s(),t.content.append(i.label),this.scrollable.append(t.container)}}))}}var A=i(4668),_=i(5565),F=i(8936),D=i(8130),R=i(8479),B=i(7120),N=i(2946),O=i(2995),U=i(6848),H=i(3061);class z extends v.h{init(){return e=this,t=void 0,s=function*(){let e;this.container.classList.add("edit-peer-container","user-permissions-container"),this.setTitle("UserRestrictions");{const t=new E.Z({name:"UserRestrictionsCanDo"}),i=document.createElement("div");i.classList.add("chatlist-container"),t.content.insertBefore(i,t.title);const s=D.default.createChatList({new:!0});i.append(s);const{dom:n}=D.default.addDialogNew({peerId:this.userId.toPeerId(!1),container:s,rippleEnabled:!0,avatarSize:"abitbigger"});n.lastMessageSpan.append((0,H.Z)(yield this.managers.appUsersManager.getUser(this.userId)));const a=new G({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content,participant:"channelParticipantBanned"===this.participant._?this.participant:void 0},this.managers);e=()=>{const e=a.takeOut();"channelParticipantBanned"===this.participant._&&(0,U.Z)(this.participant.banned_rights.pFlags,e.pFlags)||this.managers.appChatsManager.editBanned(this.chatId,this.participant,e)},this.eventListener.addEventListener("destroy",e,{once:!0}),this.scrollable.append(t.container)}{const t=new E.Z({});if("channelParticipantBanned"===this.participant._){const i=(0,c.Z)("btn-primary btn-transparent danger",{icon:"delete",text:"GroupPermission.Delete"});(0,S.fc)(i,(()=>{const t=(0,C.Z)([i],!0);this.managers.appChatsManager.clearChannelParticipantBannedRights(this.chatId,this.participant).then((()=>{this.eventListener.removeEventListener("destroy",e),this.close()}),(()=>{t()}))}),{listenerSetter:this.listenerSetter}),t.content.append(i)}const i=(0,c.Z)("btn-primary btn-transparent danger",{icon:"deleteuser",text:"UserRestrictionsBlock"});(0,S.fc)(i,(()=>{(0,C.Z)([i],!0),this.managers.appChatsManager.kickFromChannel(this.chatId,this.participant).then((()=>{this.eventListener.removeEventListener("destroy",e),this.close()}))}),{listenerSetter:this.listenerSetter}),t.content.append(i),this.scrollable.append(t.container)}},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var j=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class G{constructor(e,t){this.options=e,this.managers=t,this.construct()}construct(){return j(this,void 0,void 0,(function*(){this.v=[{flags:["send_messages"],text:"UserRestrictionsSend",exceptionText:"UserRestrictionsNoSend"},{flags:["send_media"],text:"UserRestrictionsSendMedia",exceptionText:"UserRestrictionsNoSendMedia"},{flags:["send_stickers","send_gifs"],text:"UserRestrictionsSendStickers",exceptionText:"UserRestrictionsNoSendStickers"},{flags:["send_polls"],text:"UserRestrictionsSendPolls",exceptionText:"UserRestrictionsNoSendPolls"},{flags:["embed_links"],text:"UserRestrictionsEmbedLinks",exceptionText:"UserRestrictionsNoEmbedLinks"},{flags:["invite_users"],text:"UserRestrictionsInviteUsers",exceptionText:"UserRestrictionsNoInviteUsers"},{flags:["pin_messages"],text:"UserRestrictionsPinMessages",exceptionText:"UserRestrictionsNoPinMessages"},{flags:["change_info"],text:"UserRestrictionsChangeInfo",exceptionText:"UserRestrictionsNoChangeInfo"}],this.toggleWith={send_messages:["send_media","send_stickers","send_polls","embed_links"]};const e=this.options,t=yield this.managers.appChatsManager.getChat(e.chatId),i=t.default_banned_rights,s=e.participant?function(e,t){if(e.default_banned_rights){t=(0,R.Z)(t);const i=e.default_banned_rights.pFlags;for(const e in i)t.pFlags[e]=i[e]}return t}(t,e.participant.banned_rights):i,n=e.participant?"UserRestrictionsDisabled":"EditCantEditPermissionsPublic";for(const a of this.v){const o=a.flags[0],r=(0,l.tG)(a.checkboxField=new L.Z({text:a.text,checked:(0,B.Z)(t,o,s),restriction:!0,listenerSetter:e.listenerSetter}));(e.participant&&i.pFlags[o]||(0,P.Z)(t)[0]&&(a.flags.includes("pin_messages")||a.flags.includes("change_info")))&&(a.checkboxField.input.disabled=!0,(0,S.fc)(a.checkboxField.label,(e=>{(0,m.Am)(b.ZP.format(n,!0))}),{listenerSetter:e.listenerSetter})),this.toggleWith[o]&&e.listenerSetter.add(a.checkboxField.input)("change",(()=>{a.checkboxField.checked||this.v.filter((e=>this.toggleWith[o].includes(e.flags[0]))).forEach((e=>{e.checkboxField.checked=!1}))})),e.appendTo.append(r.container)}}))}takeOut(){const e={_:"chatBannedRights",until_date:2147483647,pFlags:{}};for(const t of this.v)!t.checkboxField.checked&&t.flags.forEach((t=>{e.pFlags[t]=!0}));return e}}class V extends v.h{init(){return j(this,void 0,void 0,(function*(){let e;this.container.classList.add("edit-peer-container","group-permissions-container"),this.setTitle("ChannelPermissions");{const t=new E.Z({name:"ChannelPermissionsHeader"});e=new G({chatId:this.chatId,listenerSetter:this.listenerSetter,appendTo:t.content},this.managers),this.eventListener.addEventListener("destroy",(()=>{this.managers.appChatsManager.editChatDefaultBannedRights(this.chatId,e.takeOut())}),{once:!0}),this.scrollable.append(t.container)}{const t=new E.Z({name:"PrivacyExceptions"}),i=new l.ZP({titleLangKey:"ChannelAddException",subtitleLangKey:"Loading",icon:"adduser",clickable:()=>{new O.Z({peerTypes:["channelParticipants"],onSelect:e=>{setTimeout((()=>{n(e)}),0)},placeholder:"ExceptionModal.Search.Placeholder",peerId:-this.chatId})},listenerSetter:this.listenerSetter}),n=e=>j(this,void 0,void 0,(function*(){let t;try{t=yield this.managers.appProfileManager.getChannelParticipant(this.chatId,e)}catch(e){return void(0,m.Am)("User is no longer participant")}const i=this.slider.createTab(z);i.participant=t,i.chatId=this.chatId,i.userId=e,i.open()}));t.content.append(i.container);const a=t.generateContentElement();a.classList.add("chatlist-container");const o=D.default.createChatList({new:!0});a.append(o),(0,S.fc)(o,(e=>{const t=(0,A.Z)(e.target,D.DIALOG_LIST_ELEMENT_TAG);if(!t)return;const i=t.dataset.peerId.toPeerId();n(i)}),{listenerSetter:this.listenerSetter});const r=(t,i)=>j(this,void 0,void 0,(function*(){const s=i.banned_rights,n=(yield this.managers.appChatsManager.getChat(this.chatId)).default_banned_rights,a=[];e.v.forEach((e=>{const t=e.flags[0];s.pFlags[t]&&!n.pFlags[t]&&a.push(e.exceptionText)}));const o=t.lastMessageSpan;a.length&&o.replaceChildren(...(0,b.v_)(a.map((e=>(0,b.ag)(e))),!1)),o.classList.toggle("hide",!a.length)})),d=(e,t)=>{const{dom:i}=D.default.addDialogNew({peerId:(0,N.Z)(e.peer),container:o,rippleEnabled:!0,avatarSize:"abitbigger",append:t});r(i,e)},c=()=>{(0,_.Z)(i.subtitle,(0,b.ag)(u?"Permissions.ExceptionsCount":"Permissions.NoExceptions",[u]))};let h,u=0;const p=()=>(h=new F.Z({scrollable:this.scrollable,getPromise:()=>this.managers.appProfileManager.getChannelParticipants(this.chatId,{_:"channelParticipantsBanned",q:""},50,o.childElementCount).then((e=>{for(const t of e.participants)d(t,!0);return u=e.count,c(),e.participants.length<50||e.count===o.childElementCount}))}),h.load());this.scrollable.append(t.container),(yield this.managers.appChatsManager.isChannel(this.chatId))?yield p():(c(),this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.chatId===e&&(this.chatId=t,p())})))}}))}onOpenAfterTimeout(){this.scrollable.onScroll()}}var K=i(6194),W=i(5701),$=i(62),q=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Q extends v.h{init(){var e;return q(this,void 0,void 0,(function*(){this.setTitle("Reactions");const t=yield this.managers.appReactionsManager.getActiveAvailableReactions(),i=yield this.managers.appProfileManager.getChatFull(this.chatId),s=yield this.managers.appChatsManager.isBroadcast(this.chatId);let n=null!==(e=i.available_reactions)&&void 0!==e?e:{_:"chatReactionsNone"},a=n,o=new Set("chatReactionsSome"===n._?n.reactions.map((e=>e.emoticon)):[]);const r=e=>e.map((e=>({_:"reactionEmoji",emoticon:e}))),d=()=>s?"EnableReactionsChannelInfo":"chatReactionsAll"===a._?"EnableAllReactionsInfo":"chatReactionsNone"===a._?"DisableReactionsInfo":"EnableSomeReactionsInfo",c=new E.Z({name:s?void 0:"AvailableReactions",caption:d()}),h=new E.Z({name:"OnlyAllowThisReactions"}),u=()=>{var e;const t=null!==(e=a.reactions)&&void 0!==e?e:[];o=new Set(t.map((({emoticon:e})=>e))),f.forEach(((e,t)=>{e.setValueSilently(o.has(t))}))};let p;if(s){p=new L.Z({toggle:!0,checked:"chatReactionsSome"===n._});const e=new l.ZP({checkboxField:p,titleLangKey:"EnableReactions",listenerSetter:this.listenerSetter});c.content.append(e.container),this.listenerSetter.add(p.input)("change",(()=>{let e=!0;p.checked?m.every((e=>!e.checked))?a={_:"chatReactionsSome",reactions:r(t.map((({reaction:e})=>e)))}:"chatReactionsSome"!==a._?a={_:"chatReactionsSome",reactions:r(Array.from(o))}:e=!1:a={_:"chatReactionsNone"},e&&(u(),v())}))}else{const e=[["chatReactionsAll","AllReactions"],["chatReactionsSome","SomeReactions"],["chatReactionsNone","NoReactions"]],t=()=>{h.container.classList.toggle("hide","chatReactionsSome"!==a._)};let i=n._;const s=(0,l.ZC)(e.map((([e,t])=>({langPackKey:t,value:e,checked:n._===e}))),(e=>{i=e,a="chatReactionsAll"===i?{_:i,pFlags:{allow_custom:!0}}:"chatReactionsNone"===i?{_:i}:{_:i,reactions:r(["👍","👎"])},(0,_.Z)(c.caption,(0,b.ag)(d())),u(),v(),t()}));c.content.append(s),t()}const f=new Map,m=t.map((e=>{const t=e.reaction,i=new L.Z({toggle:!0,checked:o.has(t)});f.set(t,i),this.listenerSetter.add(i.input)("change",(()=>{i.checked?(o.add(t),p&&!p.checked&&(p.checked=!0)):(o.delete(t),(null==p?void 0:p.checked)&&!o.size&&(p.checked=!1)),v()}));const s=new l.ZP({checkboxField:i,title:e.title,havePadding:!0,listenerSetter:this.listenerSetter});return(0,$.Z)({row:s,doc:e.static_icon,size:"small"}),h.content.append(s.container),i})),g=()=>q(this,void 0,void 0,(function*(){v.clearTimeout(),"chatReactionsSome"===a._&&(a.reactions=r(Array.from(o))),this.managers.appChatsManager.setChatAvailableReactions(this.chatId,a),n=a})),v=(0,W.Z)(g,3e3,!1,!0);this.eventListener.addEventListener("destroy",(()=>{v.isDebounced()&&g()}),{once:!0}),this.scrollable.append(c.container,h.container)}))}}var Y=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class X extends a._{_init(){return Y(this,void 0,void 0,(function*(){this.listenerSetter.removeAll(),this.scrollable.container.replaceChildren(),this.container.classList.add("edit-peer-container","edit-group-container"),this.setTitle("Edit");let[e,t,i,n,a,o,h,u]=yield Promise.all([this.managers.appProfileManager.getChatFull(this.chatId,!0),this.managers.appChatsManager.getChat(this.chatId),this.managers.appChatsManager.isBroadcast(this.chatId),this.managers.appChatsManager.isChannel(this.chatId),this.managers.appChatsManager.hasRights(this.chatId,"change_type"),this.managers.appChatsManager.hasRights(this.chatId,"change_permissions"),this.managers.appChatsManager.hasRights(this.chatId,"manage_topics"),this.managers.apiManager.getAppConfig()]);const p={full:[],basic:[]},f=(e,t="basic")=>{p[t].push(e)};this.listenerSetter.add(s.Z)("chat_update",(e=>Y(this,void 0,void 0,(function*(){this.chatId===e&&(t=yield this.managers.appChatsManager.getChat(this.chatId),p.basic.forEach((e=>e())))})))),this.listenerSetter.add(s.Z)("chat_full_update",(t=>Y(this,void 0,void 0,(function*(){this.chatId===t&&(e=(yield this.managers.appProfileManager.getCachedFullChat(t))||e,p.full.forEach((e=>e())))}))));const m=this.chatId.toPeerId(!0);{const s=new E.Z({noDelimiter:!0,caption:!0}),n=[],c=document.createElement("div");if(c.classList.add("input-wrapper"),this.chatNameInputField=new r.ZP({label:i?"EnterChannelName":"CreateGroup.NameHolder",name:"chat-name",maxLength:255,required:!0}),this.descriptionInputField=new r.ZP({label:"DescriptionPlaceholder",name:"chat-description",maxLength:255}),this.chatNameInputField.setOriginalValue(t.title),this.descriptionInputField.setOriginalValue(e.about),c.append(this.chatNameInputField.container,this.descriptionInputField.container),n.push(this.chatNameInputField,this.descriptionInputField),this.editPeer=new d.Z({peerId:m,inputFields:n,listenerSetter:this.listenerSetter,popupOptions:{isForum:t.pFlags.forum}}),this.content.append(this.editPeer.nextBtn),s.content.append(this.editPeer.avatarEdit.container,c),a){const n=new l.ZP({titleLangKey:i?"ChannelType":"GroupType",clickable:()=>{const t=this.slider.createTab(x);t.chatId=this.chatId,t.chatFull=e,t.open()},icon:"lock",listenerSetter:this.listenerSetter}),a=()=>{let e;const s=(0,P.Z)(t)[0];e=i?s?"TypePublic":"TypePrivate":s?"TypePublicGroup":"TypePrivateGroup",n.subtitle.replaceChildren((0,b.ag)(e))};a(),f(a),s.content.append(n.container)}if(a||o){const t=new l.ZP({titleLangKey:"Reactions",icon:"reactions",clickable:()=>{const e=this.slider.createTab(Q);e.chatId=this.chatId,e.open()},listenerSetter:this.listenerSetter}),i=(yield this.managers.appReactionsManager.getAvailableReactions()).filter((e=>!e.pFlags.inactive)).length,n=()=>{var s;const n=null!==(s=e.available_reactions)&&void 0!==s?s:{_:"chatReactionsNone"};if("chatReactionsSome"===n._){const e=n.reactions.length;e===i?(0,_.Z)(t.subtitle,(0,b.ag)("ReactionsAll")):t.subtitle.textContent=e+"/"+i}else(0,_.Z)(t.subtitle,(0,b.ag)("chatReactionsAll"===n._?"ReactionsAll":"Checkbox.Disabled"))};n(),f(n,"full"),s.content.append(t.container)}if(o&&!i){const e=["send_messages","send_media","send_stickers","send_polls","embed_links","invite_users","pin_messages","change_info"],i=new l.ZP({titleLangKey:"ChannelPermissions",clickable:()=>{const e=this.slider.createTab(V);e.chatId=this.chatId,e.open()},icon:"permissions",listenerSetter:this.listenerSetter}),n=()=>{i.subtitle.textContent=e.reduce(((e,i)=>e+ +(0,B.Z)(t,i,t.default_banned_rights)),0)+"/"+e.length};n(),f(n),s.content.append(i.container)}if(h&&(t.participants_count>=u.forum_upgrade_participants_min||t.pFlags.forum)&&!i){const e=new l.ZP({checkboxField:new L.Z({toggle:!0}),titleLangKey:"Topics",clickable:()=>{},icon:"topics",listenerSetter:this.listenerSetter}),i=()=>{const i=!!t.pFlags.forum;this.editPeer.avatarElem.parentElement.classList.toggle("is-forum",i),e.checkboxField.setValueSilently(i)};this.listenerSetter.add(e.checkboxField.input)("change",(t=>{if(!t.isTrusted)return;const i=this.managers.appChatsManager.toggleForum(this.chatId,e.checkboxField.checked);e.disableWithPromise(i)})),i(),f(i),s.caption.replaceChildren((0,b.ag)("ForumToggleDescription")),s.content.append(e.container)}if(s.caption.classList.toggle("hide",!s.caption.childElementCount),this.scrollable.append(s.container),(0,S.fc)(this.editPeer.nextBtn,(()=>{this.editPeer.nextBtn.disabled=!0;const e=[],t=this.chatId;this.chatNameInputField.isValidToChange()&&e.push(this.managers.appChatsManager.editTitle(t,this.chatNameInputField.value)),this.descriptionInputField.isValidToChange()&&e.push(this.managers.appChatsManager.editAbout(t,this.descriptionInputField.value)),this.editPeer.uploadAvatar&&e.push(this.editPeer.uploadAvatar().then((e=>this.managers.appChatsManager.editPhoto(t,e)))),Promise.race(e).finally((()=>{this.editPeer.nextBtn.removeAttribute("disabled"),this.close()}))}),{listenerSetter:this.listenerSetter}),i&&(yield this.managers.appChatsManager.hasRights(this.chatId,"change_info"))){const e=new L.Z({text:"ChannelSignMessages",checked:!!t.pFlags.signatures});this.listenerSetter.add(e.input)("change",(()=>{const t=e.toggleDisability(!0);this.managers.appChatsManager.toggleSignatures(this.chatId,e.checked).then((()=>{t()}))})),f((()=>{e.setValueSilently(!!t.pFlags.signatures)})),s.content.append((0,l.tG)(e).container)}}if(!i){const t=new E.Z({});if(!i&&a){const i=new L.Z({text:"ChatHistory"});this.listenerSetter.add(i.input)("change",(()=>{const e=i.toggleDisability(!0);this.managers.appChatsManager.togglePreHistoryHidden(this.chatId,!i.checked).then((()=>{e()}))}));const s=()=>{i.setValueSilently(n&&!e.pFlags.hidden_prehistory)};s(),f(s),t.content.append((0,l.tG)(i).container)}t.content.childElementCount&&this.scrollable.append(t.container)}if(yield this.managers.appChatsManager.hasRights(this.chatId,"delete_chat")){const e=new E.Z({}),t=(0,c.Z)("btn-primary btn-transparent danger",{icon:"delete",text:i?"PeerInfo.DeleteChannel":"DeleteAndExitButton"});(0,S.fc)(t,(()=>{new K.Z(m,void 0,(e=>{const i=(0,C.Z)([t],!0);e.then((()=>{this.close()}),(()=>{i()}))}))}),{listenerSetter:this.listenerSetter}),e.content.append(t),this.scrollable.append(e.container)}n||this.listenerSetter.add(s.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{m===e&&(this.chatId=t.toChatId(),this._init())}))}))}init(){return this._init()}}var J=i(8842),ee=i(4240),te=i(2230),ie=i(5670),se=i(8261),ne=i(4993),ae=i(730),oe=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const re={};class de extends a._{init(){this.container.classList.add("shared-media-container","profile-container");const e=(0,c.Z)("btn-icon sidebar-close-button",{noRipple:!0});this.closeBtn.replaceWith(e),this.closeBtn=e;const t=document.createElement("div");t.classList.add("animated-close-icon"),e.append(t),this.isFirst&&t.classList.add("state-back");const i=document.createElement("div");i.className="transition slide-fade";const a=document.createElement("div");a.classList.add("transition-item"),this.titleI18n=new b.ZP.IntlElement,this.title.append(this.titleI18n.element),this.editBtn=(0,te.Z)("edit"),a.append(this.title,this.editBtn);const r=document.createElement("div");r.classList.add("transition-item");const d=this.title.cloneNode();d.append((0,b.ag)("PeerInfo.SharedMedia")),r.append(d),i.append(a,r),this.header.append(i),this.profile=new se.Z(this.managers,this.scrollable,this.listenerSetter),this.profile.init(),this.scrollable.append(this.profile.element),this.scrollable.onAdditionalScroll=()=>{const e=this.searchSuper.nav.getBoundingClientRect();if(!e.width)return;const t=e.top-1;l(t<=56)};const l=e=>{t.classList.toggle("state-back",this.isFirst||e),this.searchSuper.container.classList.toggle("is-full-viewport",e),h(+e),e||this.searchSuper.cleanScrollPositions()},h=(0,o.Z)({content:i,type:"slide-fade",transitionTime:400,isHeavy:!1});h(0),(0,S.fc)(this.closeBtn,(e=>{h.prevId()?(this.scrollable.scrollIntoViewNew({element:this.scrollable.container.firstElementChild,position:"start"}),h(0),this.isFirst||t.classList.remove("state-back")):this.scrollable.isHeavyAnimationInProgress||this.slider.onCloseBtnClick()}),{listenerSetter:this.listenerSetter}),(0,S.fc)(this.editBtn,(()=>oe(this,void 0,void 0,(function*(){let e;const{peerId:t,threadId:i}=this;e=i&&(yield this.managers.appPeersManager.isForum(t))?this.slider.createTab(ae.Z):t.isAnyChat()?this.slider.createTab(X):this.slider.createTab(ee.Z),e&&(e instanceof ae.Z?e.open(t,this.threadId):(e instanceof X?e.chatId=t.toChatId():e.peerId=t,e.open()))}))),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(s.Z)("contacts_update",(e=>{this.peerId===e&&this.toggleEditBtn()})),this.listenerSetter.add(s.Z)("chat_update",(e=>{this.peerId===e.toPeerId(!0)&&this.toggleEditBtn()})),this.listenerSetter.add(s.Z)("history_multiappend",(e=>{this.renderNewMessage(e)})),this.listenerSetter.add(s.Z)("history_delete",(({peerId:e,msgs:t})=>{this.deleteDeletedMessages(e,Array.from(t))})),this.listenerSetter.add(s.Z)("message_sent",(({message:e})=>{this.renderNewMessage(e)})),this.searchSuper=new n.Z({mediaTabs:[{inputFilter:"inputMessagesFilterEmpty",name:"PeerMedia.Members",type:"members"},{inputFilter:"inputMessagesFilterPhotoVideo",name:"SharedMediaTab2",type:"media"},{inputFilter:"inputMessagesFilterDocument",name:"SharedFilesTab2",type:"files"},{inputFilter:"inputMessagesFilterUrl",name:"SharedLinksTab2",type:"links"},{inputFilter:"inputMessagesFilterMusic",name:"SharedMusicTab2",type:"music"},{inputFilter:"inputMessagesFilterRoundVoice",name:"SharedVoiceTab2",type:"voice"}],scrollable:this.scrollable,onChangeTab:e=>{const t="members"===e.type&&s.Z.settings.animationsEnabled?250:0;setTimeout((()=>{u.classList.toggle("is-hidden","members"!==e.type)}),t)},managers:this.managers}),this.searchSuper.scrollStartCallback=()=>{l(!0)},this.profile.element.append(this.searchSuper.container);const u=(0,w.Z)({icon:"addmember_filled"});this.content.append(u),(0,S.fc)(u,(()=>oe(this,void 0,void 0,(function*(){const e=this.peerId,t=this.peerId.toChatId(),i=yield this.managers.appChatsManager.isChannel(t),s=(t,s)=>{let n,a,o,r,d;if(t.length>1)n="AddMembersAlertTitle",a=[(0,b.ag)("Members",[t.length])],o="AddMembersAlertCountText",r=t.map((e=>{const t=document.createElement("b");return t.append(new J.Z({peerId:e}).element),t})),i||(d=[{text:"AddMembersForwardMessages",checked:!0}]);else{n="AddOneMemberAlertTitle",o="AddMembersAlertNamesText";const e=document.createElement("b");e.append(new J.Z({peerId:t[0]}).element),r=[e],i||(d=[{text:"AddOneMemberForwardMessages",textArgs:[new J.Z({peerId:t[0]}).element],checked:!0}])}r.push(new J.Z({peerId:e}).element),new y.Z("popup-add-members",{peerId:e,titleLangKey:n,descriptionLangKey:o,descriptionLangArgs:r,buttons:[{langKey:"Add",callback:s}],checkboxes:d}).show()},n=e=>{"USER_PRIVACY_RESTRICTED"===e.type&&(0,m.bC)({langPackKey:"InviteToGroupError"})};if(i){const e=this.slider.createTab(ie.Z);e.open({type:"channel",skippable:!1,takeOut:i=>(s(i,(()=>{const s=this.managers.appChatsManager.inviteToChannel(t,i);s.catch(n),e.attachToPromise(s)})),!1),title:"GroupAddMembers",placeholder:"SendMessageTo"})}else new O.Z({peerTypes:["contacts"],placeholder:"Search",onSelect:e=>{setTimeout((()=>{s([e],(i=>{this.managers.appChatsManager.addChatUser(t,e,i.size?void 0:0).catch(n)}))}),0)}})}))),{listenerSetter:this.listenerSetter})}_renderNewMessage(e,t){var i;const s=null===(i=re[e.peerId])||void 0===i?void 0:i[t];if(s)for(const t of this.searchSuper.mediaTabs){const i=t.inputFilter,n=s[i];if(!n)continue;const a=this.searchSuper.filterMessagesByType([e],i).filter((e=>!n.find((t=>t.mid===e.mid&&t.peerId===e.peerId))));a.length&&(n.unshift(...a.map((e=>({mid:e.mid,peerId:e.peerId})))),this.peerId===e.peerId&&-1!==this.searchSuper.usedFromHistory[i]&&(this.searchSuper.usedFromHistory[i]+=a.length,this.searchSuper.performSearchResult(a,t,!1)))}}renderNewMessage(e){return oe(this,void 0,void 0,(function*(){if(this.init)return;const{peerId:t}=e,i=yield this.managers.appPeersManager.isForum(t),s=(0,ne.Z)(e,i);this._renderNewMessage(e),s&&this._renderNewMessage(e,s)}))}_deleteDeletedMessages(e,t,i){for(const s of i)for(const i of this.searchSuper.mediaTabs){const n=i.inputFilter,a=e[n];if(!a)continue;const o=a.findIndex((e=>e.mid===s));if(-1!==o&&(a.splice(o,1),this.peerId===t)){const e=this.searchSuper.tabs[n].querySelector(`[data-mid="${s}"][data-peer-id="${t}"]`);e&&(this.searchSuper.selection.isSelecting&&this.searchSuper.selection.toggleByElement(e),e.remove()),this.searchSuper.usedFromHistory[n]>=o+1&&--this.searchSuper.usedFromHistory[n]}}}deleteDeletedMessages(e,t){if(this.init)return;const i=re[e];if(i){for(const s in i)this._deleteDeletedMessages(i[s],e,t);this.scrollable.onScroll()}}cleanupHTML(){return oe(this,void 0,void 0,(function*(){const e=this.peerId.isAnyChat(),[t,i]=yield Promise.all([!!e&&this.searchSuper.canViewMembers(),!!e&&this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"invite_users")]);return()=>{this.profile.cleanupHTML(),this.editBtn.classList.add("hide"),this.searchSuper.cleanupHTML(!0),this.container.classList.toggle("can-add-members",t&&i)}}))}setLoadMutex(e){this.searchSuper.loadMutex=e}setPeer(e,t){var i,s,n;return(this.peerId!==e||this.threadId!==t)&&(this.peerId=e,this.threadId=t,this.peerChanged=!0,this.init&&(this.init(),this.init=null),this.searchSuper.setQuery({peerId:e,threadId:t,historyStorage:null!==(s=(n=null!==(i=re[e])&&void 0!==i?i:re[e]={})[t])&&void 0!==s?s:n[t]={}}),this.profile.setPeer(e,t),!0)}changeTitleKey(){return oe(this,void 0,void 0,(function*(){const e=this.managers.appPeersManager.isForum(this.peerId);return()=>{this.titleI18n.compareAndUpdate({key:this.threadId&&e?"AccDescrTopic":"Profile"})}}))}fillProfileElements(){return oe(this,void 0,void 0,(function*(){if(!this.peerChanged)return;this.peerChanged=!1;const e=yield Promise.all([this.cleanupHTML(),this.toggleEditBtn(!0),this.profile.fillProfileElements(),this.changeTitleKey()]);return()=>{e.forEach((e=>{null==e||e()}))}}))}toggleEditBtn(e){return oe(this,void 0,void 0,(function*(){let t;if(this.peerId.isUser())t=this.peerId!==s.Z.myId&&(yield this.managers.appUsersManager.isContact(this.peerId.toUserId()));else{const e=this.peerId.toChatId(),i=this.threadId&&(yield this.managers.appChatsManager.isForum(e));t=yield this.managers.appChatsManager.hasRights(e,i?"manage_topics":"change_info")}const i=()=>{this.editBtn.classList.toggle("hide",!t)};return e?i:i()}))}loadSidebarMedia(e,t){this.searchSuper.load(e,t)}onOpenAfterTimeout(){super.onOpenAfterTimeout(),this.scrollable.onScroll()}onCloseAfterTimeout(){super.onCloseAfterTimeout(),this.destroyable&&(this.profile.destroy(),this.searchSuper.destroy())}destroy(){this.destroyable=!0,this.onCloseAfterTimeout()}}},9099:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512);const n=e=>{const{element:t,className:i,forwards:a,duration:o,onTransitionEnd:r,onTransitionStart:d,useRafs:l}=e,{timeout:c,raf:h}=t.dataset;if(void 0!==c&&clearTimeout(+c),void 0!==h&&(window.cancelAnimationFrame(+h),l||delete t.dataset.raf),l&&s.Z.settings.animationsEnabled&&o)return void(t.dataset.raf=""+window.requestAnimationFrame((()=>{delete t.dataset.raf,n(Object.assign(Object.assign({},e),{useRafs:l-1}))})));a&&i&&t.classList.add(i);const u=()=>{delete t.dataset.timeout,!a&&i&&t.classList.remove("backwards",i),t.classList.remove("animating"),null==r||r()};if(null==d||d(),!s.Z.settings.animationsEnabled||!o)return t.classList.remove("animating","backwards"),void u();t.classList.add("animating"),t.classList.toggle("backwards",!a),t.dataset.timeout=""+setTimeout(u,o)},a=n},3552:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,_:()=>a.Z});var s=i(426),n=i(6385),a=i(6024),o=i(1655),r=i(5953),d=i(3624);class l{constructor(e){var t;this.historyTabIds=[],this.canHideFirst=!1,this.onCloseBtnClick=()=>{n.Z.findItemByType(this.navigationType)?n.Z.back(this.navigationType):this.historyTabIds.length&&this.closeTab(this.historyTabIds[this.historyTabIds.length-1])},this.closeTab=(e,t,i)=>{if(void 0!==e&&this.historyTabIds[this.historyTabIds.length-1]!==e)return this.removeTabFromHistory(e),!1;const s=this.historyTabIds.pop();this.onCloseTab(s,t,i);const n=this.historyTabIds[this.historyTabIds.length-1];return this._selectTab(void 0!==n?n instanceof a.Z?n.container:n:this.canHideFirst?-1:0,t),!0},(0,r.Z)(this,e),null!==(t=this.tabs)&&void 0!==t||(this.tabs=new Map),this.tabsContainer=this.sidebarEl.querySelector(".sidebar-slider"),this._selectTab=(0,s.Z)({content:this.tabsContainer,type:"navigation",transitionTime:250}),this.canHideFirst||this._selectTab(0),this.middlewareHelper=(0,d.k)()}getMiddleware(){return this.middlewareHelper.get()}selectTab(e){var t,i,s,o,r;return i=this,s=void 0,r=function*(){if(this.historyTabIds[this.historyTabIds.length-1]===e)return!1;const i=e instanceof a.Z?e:this.tabs.get(e);return this.onOpenTab&&(yield this.onOpenTab()),i&&(null===(t=i.onOpen)||void 0===t||t.call(i),i.onOpenAfterTimeout&&setTimeout((()=>{i.onOpenAfterTimeout()}),250)),n.Z.pushItem({type:this.navigationType,onPop:e=>(this.closeTab(void 0,e,!0),!0)}),this.historyTabIds.push(e),this._selectTab(e instanceof a.Z?e.container:e),!0},new((o=void 0)||(o=Promise))((function(e,t){function n(e){try{d(r.next(e))}catch(e){t(e)}}function a(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,a)}d((r=r.apply(i,s||[])).next())}))}removeTabFromHistory(e){(0,o.Z)(this.historyTabIds,e),this.onCloseTab(e,void 0)}sliceTabsUntilTab(e,t){for(let i=this.historyTabIds.length-1;i>=0;--i){const s=this.historyTabIds[i];if(s!==t){if(s instanceof e)break;this.removeTabFromHistory(s)}}}getTab(e){return this.historyTabIds.find((t=>t instanceof e))}getHistory(){return this.historyTabIds}isTabExists(e){return!!this.getTab(e)}onCloseTab(e,t,i){var s;i||n.Z.removeByType(this.navigationType,!0);const o=e instanceof a.Z?e:this.tabs.get(e);if(o){try{null===(s=o.onClose)||void 0===s||s.call(o)}catch(e){console.error("tab onClose error",o)}o.onCloseAfterTimeout&&setTimeout((()=>{o.onCloseAfterTimeout()}),280)}}addTab(e){e.container.parentElement||(this.tabsContainer.append(e.container),e.closeBtn&&e.closeBtn.addEventListener("click",this.onCloseBtnClick))}deleteTab(e){this.tabs.delete(e)}createTab(e,t=!0,i){const s=new e(i?void 0:this,t);return s.managers=this.managers,s}}},6024:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c,h:()=>h});var s=i(3241),n=i(3699),a=i(3624),o=i(319),r=i(2325),d=i(2230),l=i(8805);class c{constructor(e,t){this._constructor(e,t)}_constructor(e,t=!0){var i;this.slider=e,this.middlewareHelper=e?e.getMiddleware().create():(0,a.k)(),this.destroyable=t,this.container=document.createElement("div"),this.container.classList.add("tabs-tab","sidebar-slider-item"),this.header=document.createElement("div"),this.header.classList.add("sidebar-header"),this.closeBtn=(0,d.Z)("left sidebar-close-button",{noRipple:!0}),this.title=document.createElement("div"),this.title.classList.add("sidebar-header__title"),this.header.append(this.closeBtn,this.title),this.content=document.createElement("div"),this.content.classList.add("sidebar-content"),this.scrollable=new l.ZP(this.content,void 0,void 0,!0),this.scrollable.attachBorderListeners(this.container),this.container.append(this.header,this.content),null===(i=this.slider)||void 0===i||i.addTab(this),this.listenerSetter=new n.Z}close(){return this.slider.closeTab(this)}open(...e){return t=this,i=void 0,n=function*(){if(this.init)try{const t=this.init(...e);this.init=null,t instanceof Promise&&(yield t)}catch(e){console.error("open tab error",e)}this.slider.selectTab(this)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}init(...e){}onOpen(){}onOpenAfterTimeout(){}onClose(){}onCloseAfterTimeout(){var e,t,i;this.destroyable&&(null===(e=this.slider)||void 0===e||e.deleteTab(this),this.container.remove(),this.scrollable.destroy(),null===(t=this.listenerSetter)||void 0===t||t.removeAll(),null===(i=this.middlewareHelper)||void 0===i||i.destroy())}setTitle(e){this.title.replaceChildren((0,r.ag)(e))}}class h extends c{constructor(e){super(e),this.eventListener=new s.Z}onClose(){this.eventListener.dispatchEvent("close")}onCloseAfterTimeout(){const e=this.eventListener.dispatchResultableEvent("destroy");return this.eventListener.dispatchEvent("destroyAfter",Promise.all(e).then(o.Z,o.Z)),this.eventListener.cleanup(),super.onCloseAfterTimeout()}}},2894:(e,t,i)=>{"use strict";i.d(t,{Z:()=>p});var s=i(8130),n=i(8594),a=i(8487),o=i(4484),r=i(5565),d=i(3035),l=i(5345),c=i(5953),h=i(3061),u=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class p extends l.Z{constructor(e){let t;super({getIndex:e.getIndex||(e=>this.managers.appUsersManager.getUserStatusForSort(e.id)),onDelete:e=>{e.dom.listEl.remove(),this.onListLengthChange&&this.onListLengthChange()},onUpdate:e.onUpdate||(e=>u(this,void 0,void 0,(function*(){const t=(0,h.Z)(yield this.managers.appUsersManager.getUser(e.id));(0,r.Z)(e.dom.lastMessageSpan,t)}))),onSort:(e,t)=>{const i=e.dom.listEl.parentElement!==this.list;(0,o.Z)(e.dom.listEl,this.list,t),i&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:e=>{const{dom:t}=s.default.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,wrapOptions:{lazyLoadQueue:this.lazyLoadQueue}});return e.dom=t,e},updateElementWith:d.T2,updateListWith:e=>u(this,void 0,void 0,(function*(){return(0,a.Z)(this.list)?(yield(0,n.e9)(),(0,a.Z)(this.list)?void e(!0):e(!1)):e(!1)}))}),this.avatarSize="abitbigger",this.rippleEnabled=!0,this.autonomous=!0,(0,c.Z)(this,e),this.list=s.default.createChatList(this.createChatListOptions);const i=()=>{t=window.setTimeout((()=>{this.updateList((e=>{e&&i()}))}),p.SORT_INTERVAL)};i()}}p.SORT_INTERVAL=3e4},9259:(e,t,i)=>{"use strict";i.d(t,{Z:()=>I});var s=i(5432),n=i(3910),a=i(2738),o=i(5975),r=i(8497),d=i(8204),l=i(9405),c=i(3624),h=i(3035),u=i(5418),p=i(241),f=i(13),m=i(8115),g=i(5400),v=i(1447),b=i(3772),y=i(3512),w=i(5814),S=i(9099),C=i(3541),L=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let E=!1;function I({listenTo:e,listenerSetter:t,selector:i,findTarget:I}){if(s.Z)return;const M=(t,s)=>{let n;if(I)n=I(t);else{const e=i||".media-sticker-wrapper";n=t.target.closest(e)}return!n||s&&!(0,o.Z)(n,e)?void 0:n},P=y.Z.managers;t.add(e)("mousedown",(e=>{if(E||e.buttons>1||0!==e.button)return;let t=M(e);if(!t)return;const i=t.dataset.docId;if(!i)return;const s="sticker-viewer",y="STICKER-VIEWER",I=w.Z.getOnlyOnePlayableGroup(),Z=(0,c.k)();let k,T;const x=({mediaContainer:e,doc:t,middleware:i,lockGroups:n,isSwitching:o})=>L(this,void 0,void 0,(function*(){const c=(0,f.Z)(t),S=e.getBoundingClientRect(),L=(0,l.C)(t.w,t.h),E=c?280:360,I=(0,l.C)(E,E),M=S.width===S.height?I:L.aspectFitted(I),Z=(0,r.Z)(e,"bubble"),T=!Z||Z.classList.contains("is-out"),x=document.createElement("div");x.classList.add(s+"-transformer");const A=document.createElement("div");A.classList.add(s+"-sticker"),A.style.width=M.width+"px",A.style.height=M.height+"px";const _=document.createElement("div");if(_.classList.add(s+"-emoji"),_.append((0,m.Z)(t.stickerEmojiRaw)),c){const e=(E*C.Vp-E)/3*(T?1:-1);x.classList.add("has-effect"),x.style.setProperty("--translateX",`${e}px`),_.style.setProperty("--translateX",-e+"px")}const F=(0,r.Z)(e,"scrollable"),D=(0,d.Z)(e,F,!0,S);(D.overflow.vertical||D.overflow.horizontal)&&A.classList.add("is-overflow");const R=e.getBoundingClientRect(),B=R.width/M.width,N=R.height/M.height,O=R.left-(p.Z.width-R.width)/2,U=R.top-(p.Z.height-R.height)/2;x.style.transform=`translate(${O}px, ${U}px) scale(${B}, ${N})`,o&&x.classList.add("is-switching"),x.append(A,_),k.append(x);const H=yield(0,C.ZP)({doc:t,div:A,group:y,width:M.width,height:M.height,play:!1,loop:!0,middleware:i,managers:P,needFadeIn:!1,isOut:T,withThumb:!1,relativeEffect:!0,loopEffect:!0}).then((({render:e})=>e));if(!i())return;k.parentElement||document.body.append(k);const z=Array.isArray(H)?H[0]:H,j=z instanceof b.Z?new Promise((e=>z.addEventListener("firstFrame",e,{once:!0}))):Promise.resolve();if(yield Promise.all([j,(0,h.d1)()]),yield(0,u.Z)(0),i()){if(n&&(w.Z.setOnlyOnePlayableGroup(y),w.Z.checkAnimations2(!0)),z instanceof b.Z){const t=e instanceof g.LD?e.player:v.Z.getAnimation(e);if(t){if(z.curFrame=t.curFrame,z.play(),yield new Promise((e=>{let t=0;const i=()=>{2==++t&&(e(),z.removeEventListener("enterFrame",i))};z.addEventListener("enterFrame",i)})),!i())return;z.pause()}}else if(z instanceof HTMLVideoElement){const t=e.querySelector("video");t&&(z.currentTime=t.currentTime)}return{ready:()=>{(z instanceof b.Z||z instanceof HTMLVideoElement)&&z.play(),c&&(0,a.tH)(A)},transformer:x}}})),A=window.setTimeout((()=>L(this,void 0,void 0,(function*(){document.removeEventListener("mousemove",F),k=document.createElement("div"),k.classList.add(s),E=!0;const e=Z.get(),n=yield P.appDocsManager.getDoc(i);if(!e())return;let a;try{if(a=yield x({doc:n,mediaContainer:t,middleware:e,lockGroups:!0}),!a)return}catch(e){return}const{ready:o,transformer:r}=a;T=r,(0,S.Z)({element:k,className:"is-visible",forwards:!0,duration:200,onTransitionEnd:()=>{e()&&o()}}),document.addEventListener("mousemove",_)}))),125),_=e=>L(this,void 0,void 0,(function*(){const i=M(e,!0);if(!i||t===i)return;const s=i.dataset.docId;if(!s)return;t=i,Z.clean();const n=Z.get(),a=yield P.appDocsManager.getDoc(s);if(!n())return;let o;try{if(o=yield x({doc:a,mediaContainer:t,middleware:n,isSwitching:!0}),!o)return}catch(e){return void console.error("sticker viewer error",e)}const{ready:r,transformer:d}=o,l=T;(0,S.Z)({element:l,className:"is-switching",forwards:!0,duration:200,onTransitionEnd:()=>{l.remove()}}),T=d,(0,S.Z)({element:d,className:"is-switching",forwards:!1,duration:200,onTransitionEnd:()=>{n()&&r()}})})),F=e=>{(0,o.Z)(e.target,t)||D()},D=()=>{clearTimeout(A),Z.clean(),k&&((0,S.Z)({element:k,className:"is-visible",forwards:!1,duration:200,onTransitionEnd:()=>{k.remove(),w.Z.setOnlyOnePlayableGroup(I),w.Z.checkAnimations2(!1),E=!1}}),(0,a.fc)(document.body,n.Z,{capture:!0,once:!0})),document.removeEventListener("mousemove",F),document.removeEventListener("mousemove",_),document.removeEventListener("mouseup",D,{capture:!0})};document.addEventListener("mousemove",F),document.addEventListener("mouseup",D,{once:!0,capture:!0})}))}},5117:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e,t){this.container=e,this.handler=t,this.observeHeaders(),this.observeElements()}observeHeaders(){this.headersObserver=new IntersectionObserver((e=>{for(const t of e){const e=t.boundingClientRect,i=t.target.parentElement,s=t.rootBounds;e.bottom=s.top&&e.bottom{const t=e.filter((e=>e.boundingClientRect.tope.boundingClientRect.top-t.boundingClientRect.top))[0];if(!t)return;const i=t.isIntersecting?t.target:t.target.nextElementSibling;this.handler(!0,i)}),{root:this.container})}addSentinel(e,t){const i=document.createElement("div");return i.classList.add("sticky_sentinel",t),e.appendChild(i)}observeStickyHeaderChanges(e){const t=this.addSentinel(e,"sticky_sentinel--top");this.headersObserver.observe(t),this.elementsObserver.observe(e)}disconnect(){this.headersObserver.disconnect(),this.elementsObserver.disconnect()}unobserve(e,t){this.elementsObserver.unobserve(e),this.headersObserver.unobserve(t)}}},3757:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(3910),n=i(5432),a=i(5953),o=i(3416),r=i(3699),d=i(6976),l=i(5418),c=i(3725);const h=e=>"touches"in e?e.touches[0]:e,u=document;let p=!1;o.Z.addEventListener("toggle",(e=>{p=e}));const f={passive:!1},m=!1;class g{constructor(e){var t,i,o,d,g;this.reset=e=>{var t;n.Z?this.listenerSetter.removeManual(u,"touchmove",this.handleMove,f):(this.listenerSetter.removeManual(u,"mousemove",this.handleMove,m),this.setCursorTo.style.cursor=""),this.hadMove&&(null===(t=this.onReset)||void 0===t||t.call(this)),this.resetValues()},this.handleStart=e=>{return t=this,i=void 0,a=function*(){var t;if(this.isMouseDown)return;const i=h(e);if(0!==Math.max(0,null!==(t=i.button)&&void 0!==t?t:0))return;if(this.verifyTouchTarget&&!(yield this.verifyTouchTarget(e)))return this.reset();const s=++this.tempId;if(this.isMouseDown=!0,this.withDelay&&!n.Z){const e=Object.assign(Object.assign({},m),{once:!0}),t=(0,c.Z)(),i=()=>t.resolve(),n=this.listenerSetter.add(u)("mousemove",i,e);if(yield Promise.race([(0,l.Z)(300),t]),t.resolve(),this.listenerSetter.remove(n),this.tempId!==s)return}this.xDown=i.clientX,this.yDown=i.clientY,this.eventUp=i,n.Z?this.listenerSetter.add(u)("touchmove",this.handleMove,f):this.listenerSetter.add(u)("mousemove",this.handleMove,m),this.onStart&&(this.onStart(),this.hadMove=!0,this.handleMove(i))},new((s=void 0)||(s=Promise))((function(e,n){function o(e){try{d(a.next(e))}catch(e){n(e)}}function r(e){try{d(a.throw(e))}catch(e){n(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,s,a},this.handleMove=e=>{var t;if(void 0===this.xDown||void 0===this.yDown||p)return void this.reset();this.cancelEvent&&(0,s.Z)(e);const i=this.eventUp=h(e),a=i.clientX,o=i.clientY,r=a-this.xDown+this.xAdded,d=o-this.yDown+this.yAdded;if(!this.hadMove){if(!r&&!d)return;this.hadMove=!0,n.Z||this.setCursorTo.style.setProperty("cursor",this.cursor,"important"),null===(t=this.onFirstSwipe)||void 0===t||t.call(this,e)}const l=this.onSwipe(r,d,e);void 0!==l&&l&&this.reset()},(0,a.Z)(this,e),null!==(t=this.cursor)&&void 0!==t||(this.cursor="grabbing"),null!==(i=this.cancelEvent)&&void 0!==i||(this.cancelEvent=!0),null!==(o=this.listenerOptions)&&void 0!==o||(this.listenerOptions=f),null!==(d=this.setCursorTo)&&void 0!==d||(this.setCursorTo=this.element),this.listenerSetter=new r.Z,this.setListeners(),this.resetValues(),this.tempId=0,null===(g=e.middleware)||void 0===g||g.onDestroy((()=>{this.reset(),this.removeListeners()}))}setListeners(){n.Z?(this.withDelay?(0,d.E)({element:this.element,callback:e=>{(0,s.Z)(e),this.handleStart(e)},listenerSetter:this.listenerSetter,listenerOptions:this.listenerOptions}):this.listenerSetter.add(this.element)("touchstart",this.handleStart,this.listenerOptions),this.listenerSetter.add(u)("touchend",this.reset)):(this.listenerSetter.add(this.element)("mousedown",this.handleStart,this.listenerOptions),this.listenerSetter.add(u)("mouseup",this.reset))}removeListeners(){this.listenerSetter.removeAll()}setCursor(e=""){this.cursor=e,!n.Z&&this.hadMove&&this.setCursorTo.style.setProperty("cursor",this.cursor,"important")}add(e,t){this.xAdded=e,this.yAdded=t,this.handleMove({clientX:this.eventUp.clientX,clientY:this.eventUp.clientY,target:this.eventUp.target})}resetValues(){++this.tempId,this.hadMove=!1,this.xAdded=this.yAdded=0,this.xDown=this.yDown=this.eventUp=this.isMouseDown=void 0}}},709:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(2398),n=i(6272),a=i(4762),o=i(503);class r extends o.ZP{constructor(e={}){super(Object.assign({label:"Contacts.PhoneNumber.Placeholder",name:"phone"},e)),this.pasted=!1,this.lastValue="",this.container.classList.add("input-field-phone");const t=this.input;if(t instanceof HTMLInputElement)t.type="tel",t.autocomplete="rr55RandomRR55";else{t.inputMode="decimal";const e=window.devicePixelRatio;if(e>1){let i;a.IS_APPLE?i=-.16*e:a.IS_ANDROID&&(i=0),t.style.setProperty("--letter-spacing",i+"px")}const i=this.setValueSilently.bind(this);this.setValueSilently=e=>{i(e),(0,s.Z)(this.input,!0)}}t.addEventListener("input",(()=>{t.classList.remove("error");const i=this.value;let s;Math.abs(i.length-this.lastValue.length)>1&&!this.pasted&&a.IS_APPLE_MOBILE&&this.setValueSilently(this.lastValue+i),this.pasted=!1,this.setLabel();let o,r,d,l="";"+"===this.value.replace(/\++/,"+")?this.setValueSilently("+"):(s=(0,n.u)(this.value),o=s.formatted,r=s.country,l=s.leftPattern,d=s.code,this.setValueSilently(this.lastValue=o?"+"+o:"")),t.dataset.leftPattern=l,e.onInput&&e.onInput(s)})),t.addEventListener("paste",(()=>{this.pasted=!0})),t.addEventListener("keypress",(e=>{const t=e.key;if(/\D/.test(t)&&!e.metaKey&&!e.ctrlKey&&"Backspace"!==t&&("+"!==t||!e.shiftKey))return e.preventDefault(),!1}))}}},2796:(e,t,i)=>{"use strict";i.d(t,{Am:()=>c,PE:()=>l,bC:()=>h});var s=i(5565),n=i(2296),a=i(2325);const o=document.createElement("div");let r;o.classList.add("toast");const d=new n.Z("toast");function l(){d.close(),o.classList.remove("is-visible"),r&&clearTimeout(+r),r=window.setTimeout((()=>{o.remove(),r=void 0}),200)}function c(e,t){d.close(),(0,s.Z)(o,e),o.parentElement||(document.body.append(o),o.offsetLeft),o.classList.add("is-visible"),r&&clearTimeout(+r),d.open(o),r=window.setTimeout(l,3e3),t&&d.addEventListener("toggle",t,{once:!0})}function h(e){c((0,a.ag)(e.langPackKey,e.langPackArguments),e.onClose)}d.addEventListener("toggle",(e=>{e||l()}))},426:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l});var s=i(3512),n=i(3725),a=i(8594),o=i(2648),r=i(3910);const d={navigation:{callback:(e,t,i)=>{const s=t.getBoundingClientRect().width,n=[e,t];return i&&n.reverse(),n[0].style.filter="brightness(80%)",n[0].style.transform=`translate3d(${.25*-s}px, 0, 0)`,n[1].style.transform=`translate3d(${s}px, 0, 0)`,e.classList.add("active"),e.offsetWidth,e.style.transform="",e.style.filter="",()=>{t.style.transform=t.style.filter=""}},animateFirst:!1},tabs:{callback:(e,t,i)=>{const s=t.getBoundingClientRect().width,n=[e,t];return i&&n.reverse(),n[0].style.transform=`translate3d(${-s}px, 0, 0)`,n[1].style.transform=`translate3d(${s}px, 0, 0)`,e.classList.add("active"),e.offsetWidth,e.style.transform="",()=>{t.style.transform=""}},animateFirst:!1}},l=e=>{let{content:t,type:i,transitionTime:l,onTransitionEnd:c,isHeavy:h=!0,once:u=!1,withAnimationListener:p=!0,listenerSetter:f,animateFirst:m=!1}=e;const{callback:g,animateFirst:v}=d[i]||{};t.dataset.animation=i,void 0!==v&&(m=v);const b=new Map;let y,w=null;if(p){const e=g?"transitionend":"animationend",i=s=>{if((0,r.Z)(s),s.target.parentElement!==t)return;const n=b.get(s.target);null==n||n(),s.target===w&&(!y&&h||(y&&(y.resolve(),y=void 0),null==c||c(S.prevId()),t.classList.remove("animating","backwards","disable-hover"),u&&(f?f.removeManual(t,e,i):t.removeEventListener(e,i),w=y=void 0,b.clear())))};f?f.add(t)(e,i):t.addEventListener(e,i)}function S(e,i=!0,r){r&&(w=r),e instanceof HTMLElement&&(e=(0,o.Z)(e));const d=S.prevId();if(e===d)return!1;const u=t.children[e];if(s.Z.settings.animationsEnabled&&(-1!==d||m)||(i=!1),!p){const e=t.dataset.timeout;void 0!==e&&clearTimeout(+e),delete t.dataset.timeout}if(!i){if(w)w.classList.remove("active","to","from");else if(u){const e=b.get(u);null==e||e()}return u&&(u.classList.remove("to","from"),u.classList.add("active")),t.classList.remove("animating","backwards","disable-hover"),w=u,void(null==c||c(e))}p||(t.dataset.timeout=""+window.setTimeout((()=>{u.classList.remove("to"),w&&w.classList.remove("from"),t.classList.remove("animating","backwards","disable-hover"),delete t.dataset.timeout}),l)),w&&(w.classList.remove("to"),w.classList.add("from")),t.classList.add("animating");const f=d{u.classList.remove("to"),b.delete(u)}))}if(w){let e;const t=w,i=()=>{clearTimeout(e),t.classList.remove("active","from"),null==v||v(),b.delete(t)};u?(e=window.setTimeout(i,l+100),b.set(t,i)):(e=window.setTimeout(i,l),b.set(t,(()=>{clearTimeout(e),b.delete(t)}))),t.dataset.transitionTimeout=""+e,h&&(y||(y=(0,n.Z)()),(0,a.YW)(y,2*l))}w=u}return S.prevId=()=>w?(0,o.Z)(w):-1,S.getFrom=()=>w,S.setFrom=e=>w=e,S}},6726:(e,t,i)=>{"use strict";i.d(t,{l:()=>o});var s=i(5701),n=i(503);function a(e){return(e.length>=3&&e.length<=32||!e.length)&&/^[a-zA-Z0-9_]*$/.test(e)}class o extends n.ZP{constructor(e,t){super(e),this.managers=t,this.checkUsernameDebounced=(0,s.Z)(this.checkUsername.bind(this),150,!1,!0),e.listenerSetter.add(this.input)("input",(()=>{var e,t,i,s;const o=this.getValue();if(this.error=void 0,o===this.originalValue||!o.length)return this.setState(n.I1.Neutral),void(null===(t=(e=this.options).onChange)||void 0===t||t.call(e));a(o)?this.setState(n.I1.Neutral):this.setError(this.options.invalidText),this.input.classList.contains("error")?null===(s=(i=this.options).onChange)||void 0===s||s.call(i):this.checkUsernameDebounced(o)}))}getValue(){let e=this.value;return this.options.head&&(e=e.slice(this.options.head.length),this.setValueSilently(this.options.head+e)),e}checkUsername(e){if(this.checkUsernamePromise)return;let t;this.error=void 0,t=this.options.peerId?this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(),e):this.managers.appUsersManager.checkUsername(e);const i=this.checkUsernamePromise=t.then((t=>{this.getValue()===e&&(t?this.setState(n.I1.Valid,this.options.availableText):this.setError(this.options.takenText))}),(t=>{this.getValue()===e&&(this.error=t,"USERNAME_PURCHASE_AVAILABLE"===t.type?this.setError(this.options.takenText):this.setError(this.options.invalidText))})).then((()=>{var t,s;this.checkUsernamePromise===i&&(this.checkUsernamePromise=void 0),null===(s=(t=this.options).onChange)||void 0===s||s.call(t);const n=this.getValue();n!==e&&this.isValidToChange()&&a(n)&&this.checkUsername(n)}))}}},9522:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(2738),n=i(5975),a=i(2398),o=i(4484),r=i(2914),d=i(319),l=i(5345),c=i(2325),h=i(3512),u=i(5592),p=i(7479),f=i(5029),m=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class g extends f.Z{constructor(e){super({name:"UsernamesProfileHeader",caption:e.peerId.isUser()?"UsernamesProfileHelp":"UsernamesChannelHelp"});const{peerId:t,peer:i,usernameInputField:f,listenerSetter:g,middleware:v}=e,b=h.Z.managers,y=t.isUser()?void 0:t.toChatId(),w=this,S="usernames",C=document.createElement("div");let L;C.classList.add(S);const E=new l.Z({getIndex:e=>L.length-L.findIndex((t=>t.username===e.id)),onDelete:e=>{e.row.container.remove()},onSort:(e,t)=>{(0,o.Z)(e.row.container,C,t)},onElementCreate:e=>{const t=L.find((t=>t.username===e.id)),i=new p.ZP({title:"@"+t.username,subtitle:!0,clickable:!0}),s=!!t.pFlags.editable,n=!!t.pFlags.active;return s&&(i.container.dataset.editable="1"),i.container.dataset.username=t.username,i.container.classList.add(S+"-username"),i.subtitle.classList.add(S+"-username-status"),i.createMedia("medium").classList.add(S+"-username-icon","tgico"),i.makeSortable(),I(i,n),e.row=i,e}}),I=(e,t)=>{e.subtitle.replaceChildren((0,c.ag)(e.container.dataset.editable?"UsernameLinkEditable":t?"UsernameLinkActive":"UsernameLinkInactive")),e.container.classList.toggle("active",t),e.toggleSorting(t)},M=(e=[])=>{L=e,E.getAll().forEach((t=>{e.some((e=>e.username===t.id))||E.delete(t.id)})),e.forEach((e=>{if(E.has(e.username)){const t=E.get(e.username);E.update(e.username,t),I(t.row,!!e.pFlags.active)}else E.add(e.username)})),w.container.classList.toggle("hide",!E.getAll().size)};M(i.usernames),g.add(h.Z)("peer_title_edit",(({peerId:e})=>m(this,void 0,void 0,(function*(){if(e!==t)return;const i=yield b.appPeersManager.getPeer(t);M(i.usernames)}))));let P=!1;(0,s.fc)(C,(e=>m(this,void 0,void 0,(function*(){if(P)return void(P=!1);const t=(0,n.Z)(e.target,C);if(!t)return;if(t.dataset.editable)return void(0,a.Z)(f.input,!0,!0);const i=t.dataset.username,s=t.classList.contains("active");let o,r;s?(o="UsernameDeactivateLink",r=y?"UsernameDeactivateLinkChannelMessage":"UsernameDeactivateLinkProfileMessage"):(o="UsernameActivateLink",r=y?"UsernameActivateLinkChannelMessage":"UsernameActivateLinkProfileMessage");try{yield(0,u.Z)({titleLangKey:o,descriptionLangKey:r,button:{langKey:s?"Hide":"Show"}})}catch(e){return}const l=!s;let c;c=y?b.appChatsManager.toggleUsername(y,i,l):b.appUsersManager.toggleUsername(i,l),c.catch((e=>{"USERNAMES_ACTIVE_TOO_MUCH"===e.type?(0,u.Z)({titleLangKey:"UsernameActivateErrorTitle",descriptionLangKey:"UsernameActivateErrorMessage",button:{langKey:"OK",isCancel:!0}}).catch(d.Z):console.error("turn username error",e)}))})))),new r.Z({list:C,middleware:v,onSort:(e,t)=>{const i=L.splice(e,1)[0];L.splice(t,0,i),E.updateList();const s=L.filter((e=>e.pFlags.active)).map((e=>e.username));y?b.appChatsManager.reorderUsernames(y,s):b.appUsersManager.reorderUsernames(s)}}),w.content.append(C)}}},2940:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e,t){this.items=new Map,this.locked=!1,this.observer=new IntersectionObserver((t=>{if(this.locked)return;const i=[];t.forEach(((e,t)=>{const s=e.target;if(this.items.get(s)===e.isIntersecting)return;this.items.set(s,e.isIntersecting);const n={target:s,visible:e.isIntersecting,entry:e,index:t};i.push(n)})),i.forEach((t=>{e(t)}))}),t)}getVisible(){const e=[];return this.items.forEach(((t,i)=>{t&&e.push(i)})),e}clearVisible(){const e=this.getVisible();for(const t of e)this.items.set(t,!1)}isVisible(e){return this.items.get(e)}disconnect(){this.observer.disconnect(),this.items.clear()}refresh(){this.observer.disconnect();const e=[...this.items.keys()];for(const t of e)this.observer.observe(t)}refreshVisible(){const e=this.getVisible();for(const t of e)this.observer.unobserve(t);for(const t of e)this.observer.observe(t)}observe(e){this.items.set(e,!1),this.observer.observe(e)}unobserve(e){this.observer.unobserve(e),this.items.delete(e)}unlock(){this.locked=!1}unlockAndRefresh(){this.unlock(),this.refresh()}lock(){this.locked=!0}}},8427:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(3910),n=i(2738),a=i(3013),o=i(65);class r extends o.Z{constructor(e,t=!1){super({step:.01,min:0,max:1,vertical:t},1),this.listenerSetter=e,this.vertical=t,this.onMuteClick=e=>{e&&(0,s.Z)(e),a.Z.muted=!a.Z.muted},this.setVolume=()=>{const{volume:e,muted:t}=a.Z;let i;i=!e||t?0:e>.5?3:e>0&&e<.25?1:2,r.ICONS.forEach((e=>this.icon.classList.remove("tgico-"+e))),this.icon.classList.add("tgico-"+r.ICONS[i]),this.mousedown||this.setProgress(t?0:e)},this.setListeners(),this.setHandlers({onScrub:e=>{const t=Math.max(Math.min(e,1),0);a.Z.muted=!1,a.Z.volume=t}});const i="player-volume",o=this.btn=document.createElement("div");o.classList.add("btn-icon",i);const d=this.icon=document.createElement("span");d.classList.add(i+"__icon"),o.append(d,this.container),(0,n.fc)(d,this.onMuteClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(a.Z)("playbackParams",this.setVolume),this.setVolume()}}r.ICONS=["volume_off","volume_mute","volume_down","volume_up"]},9083:(e,t,i)=>{"use strict";i.d(t,{N:()=>a,Z:()=>n});var s=i(5400);function n({docIds:e,loadPromises:t,middleware:i,lazyLoadQueue:n,customEmojiSize:a,animationGroup:o}){const r=" ".repeat(e.length),d=[];return e.forEach(((e,t)=>{d.push({_:"messageEntityCustomEmoji",offset:t,length:1,document_id:e})})),(0,s.ZP)(r,{entities:d,loadPromises:t,animationGroup:o,customEmojiSize:a,middleware:i,lazyLoadQueue:n})}function a(e){var t;const i=null!==(t=e.loadPromises)&&void 0!==t?t:e.loadPromises=[],s=n(e);return Promise.all(i).then((()=>s))}},296:(e,t,i)=>{"use strict";i.d(t,{Z:()=>I});var s=i(2341),n=i(467),a=i(632),o=i(2738),r=i(8497),d=i(4081),l=i(319),c=i(2312),h=i(4271),u=i(1243),p=i(7030),f=i(2325),m=i(1507),g=i(2491),v=i(3512),b=i(8448),y=i(3251),w=i(3442),S=i(9492),C=i(5671),L=i(1604),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function I({message:e,withTime:t,fontWeight:i,voiceAsMusic:I,showSender:M,searchContext:P,loadPromises:Z,autoDownloadSize:k,lazyLoadQueue:T,sizeType:x,managers:A=v.Z.managers,cacheContext:_,fontSize:F}){var D;return E(this,void 0,void 0,(function*(){null!=i||(i=500),null!=x||(x=""),null!=F||(F=0);const R=0===k,B=e.media.document||e.media.webpage.document,N=null==e?void 0:e.uploadingFileName;if("audio"===B.type||"voice"===B.type||"round"===B.type){const s=new b.ZP;return s.withTime=t,s.message=e,s.noAutoDownload=R,s.lazyLoadQueue=T,s.loadPromises=Z,I&&(s.voiceAsMusic=I),P&&(s.searchContext=P),M&&(s.showSender=M),s.dataset.fontWeight=""+i,s.dataset.fontSize=""+F,s.dataset.sizeType=x,yield s.render(),s}const O=B.file_name?B.file_name.split("."):"";let U="";U=O.length>1&&Array.isArray(O)?(0,n.ST)(O.pop().split(" ",1)[0].toLowerCase()):"file";const H=document.createElement("div");H.classList.add("document",`ext-${U}`),H.dataset.docId=""+B.id,H.doc=B;const z=document.createElement("div");let j;z.classList.add("document-ico");const G=!!_,V=()=>G?_:A.thumbsStorage.getCacheContext(B);_=yield V();let K=!1;if((null===(D=B.thumbs)||void 0===D?void 0:D.length)||e.pFlags.is_outgoing&&_.url&&"photo"===B.type){H.classList.add("document-with-thumb"),K=!0;const t=[];if(e.pFlags.is_outgoing&&["photo","video"].includes(B.type)&&_.url)z.innerHTML=``,t.push(z.firstElementChild);else{performance.now();const e=yield(0,S.Z)({photo:B,message:null,container:z,boxWidth:54,boxHeight:54,loadPromises:Z,withoutPreloader:!0,lazyLoadQueue:T,size:(0,p.Z)(B,54,54,!0),managers:A});z.style.width=z.style.height="",e.images.thumb&&t.push(e.images.thumb),e.images.full&&t.push(e.images.full)}t.forEach((e=>e.classList.add("document-thumb")))}else j=document.createElement("span"),j.classList.add("document-ico-text"),j.innerText=U,z.append(j);const W=B.file_name?(0,g.Z)(B.file_name):"Unknown.file";document.createElement("div").classList.add("document-description");const $=document.createElement("span"),q=[(0,d.Z)(B.size)];if(t&&q.push((0,a.OD)(e.date)),M&&q.push(yield(0,C.Z)(e)),!t&&!M){const e=document.createElement("span"),t=(0,d.Z)(B.size);e.append(" / ",t),e.style.visibility="hidden",q.push(e)}H.innerHTML=`\n ${_.downloaded&&!N||!e.mid||!K?"":'
'}\n
\n
\n `;const Q=H.querySelector(".document-name"),Y=new y.I;Y.dataset.fontWeight=""+i,Y.dataset.fontSize=""+F,Y.dataset.sizeType=x,Y.textContent=W,e.mid||H.classList.add("downloaded"),Q.append(Y),M&&Q.append((0,L.Z)(e));const X=H.querySelector(".document-size");if($.append(...(0,f.A1)(q," · ")),X.append($),H.prepend(z),!N&&e.pFlags.is_outgoing&&!e.mid)return H;let J,ee=null;const te=()=>{if(H.classList.remove("downloading"),B.size>m.Iw&&!N)return ee.setManual(),ee.attach(J),ee.preloader.classList.add("manual"),void ee.setDownloadFunction(se);if(B.size<=m.Iw&&H.classList.add("downloaded"),J){if(J!==z){const e=J;setTimeout((()=>{e.remove()}),200)}J=null}ee&&(ee=null)},ie=e=>{H.classList.add("downloading");const t=document.createElement("span"),i=(0,d.Z)(B.size);t.style.position="absolute",t.style.left="0",e.then(te,l.Z).finally((()=>{$.style.visibility="",t.remove()}));const s=e=>(0,d.Z)(e);let n=s(0);$.style.visibility="hidden",t.append(n," / ",i),$.parentElement.append(t),e.addNotifyListener((e=>{const t=s(e.done);n.replaceWith(t),n=t}))},se=e=>{var t;const i=!e||e.isTrusted,n=H.doc;let a;const o=h.ZP.chat.bubbles?h.ZP.chat.bubbles.lazyLoadQueue.queueId:void 0;if(i)if("pdf"===n.type){const e=!ee||ee.detached;a=c.Z.downloadMediaURL({media:n,queueId:o}),e&&a.then((()=>{setTimeout((()=>E(this,void 0,void 0,(function*(){const e=(yield V()).url;window.open(e)}))),v.Z.settings.animationsEnabled?250:0)}))}else a=s.Z.has(n.mime_type)&&(null===(t=n.thumbs)||void 0===t?void 0:t.length)?c.Z.downloadMediaURL({media:n,queueId:o}):c.Z.downloadToDisc({media:n,queueId:o});else a=c.Z.downloadToDisc({media:n,queueId:o},!0);a.catch((()=>{H.classList.remove("downloading")})),J&&(ee.attach(J,!0,a),ie(a))},{fileName:ne}=(0,u.Z)({media:B,downloadId:"1"});if(yield A.apiFileManager.isDownloading(ne)){J=H.querySelector(".document-download")||z;const e=c.Z.downloadToDisc({media:B},!0);ee=new w.Z,ee.attach(J,!1,e),ee.setDownloadFunction(se),ie(e)}else if(!_.downloaded||N)if(J=H.querySelector(".document-download")||z,ee=new w.Z({isUpload:!!N}),N){const e=c.Z.getUpload(N);ee.attachPromise(e),ee.attach(J),ie(e)}else ee.construct(),ee.setManual(),ee.attach(J),ee.setDownloadFunction(se),void 0!==k&&k>=B.size&&(0,o.tH)(ee.preloader);return(0,o.fc)(H,(e=>{(0,r.Z)(e.target,"time")||(ee?ee.onClick(e):se(e))})),H}))}v.Z.addEventListener("document_downloading",(e=>{Array.from(document.querySelectorAll(`.document[data-doc-id="${e}"]`)).forEach((e=>{e.querySelector(".preloader-container.manual")&&(0,o.tH)(e)}))}))},8210:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(6272);function n(e){return"+"+(0,s.u)(e).formatted}},177:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(2575),n=i(2325),a=i(3512);function o(e,t=a.Z.managers){var i,o,r,d,l,c;return r=this,d=void 0,c=function*(){const a=yield t.appChatsManager.getChat(e);if("chatForbidden"===a._)return(0,n.ag)("YouWereKicked");const r=yield t.appProfileManager.getCachedFullChat(e);let d;d=r?"channelFull"===r._?r.participants_count:null===(i=r.participants.participants)||void 0===i?void 0:i.length:a.participants_count||(null===(o=a.participants)||void 0===o?void 0:o.participants.length),d=d||1;const l=a.pFlags.broadcast?"Peer.Status.Subscribers":"Peer.Status.Member";return(0,n.ag)(l,[(0,s.Z)(d)])},new((l=void 0)||(l=Promise))((function(e,t){function i(e){try{n(c.next(e))}catch(e){t(e)}}function s(e){try{n(c.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof l?n:new l((function(e){e(n)}))).then(i,s)}n((c=c.apply(r,d||[])).next())}))}},493:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(8456),n=i(5102),a=i(2325),o=i(8115),r=i(3512);function d(e){return t=this,i=void 0,l=function*(){const{peerId:t=r.Z.myId,plainText:i,onlyFirstName:d,limitSymbols:l,managers:c=r.Z.managers,threadId:h}=e;let u="";if(t.isUser()){const e=yield c.appUsersManager.getUser(t.toUserId());e&&(e.first_name&&(u+=e.first_name),!e.last_name||d&&u||(u+=" "+e.last_name)),u=u?u.trim():!e||e.pFlags.deleted?a.ZP.format(d?"Deleted":"HiddenName",!0):(0,n.Z)(e)[0]||""}else{if(h){const e=yield c.dialogsStorage.getForumTopic(t,h);u=(null==e?void 0:e.title)||""}if(!u){const e=yield c.appChatsManager.getChat(t.toChatId());u=(null==e?void 0:e.title)||""}d&&(u=u.split(" ")[0])}return void 0!==l&&(u=(0,s.Z)(u,l,l)),i?u:(0,o.Z)(u)},new((d=void 0)||(d=Promise))((function(e,s){function n(e){try{o(l.next(e))}catch(e){s(e)}}function a(e){try{o(l.throw(e))}catch(e){s(e)}}function o(t){var i;t.done?e(t.value):(i=t.value,i instanceof d?i:new d((function(e){e(i)}))).then(n,a)}o((l=l.apply(t,i||[])).next())}));var t,i,d,l}},3061:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(632),n=i(2325),a=i(1507);function o(e){var t;if(!e)return document.createElement("span");let i,o;switch(e.id){case a.hj.toUserId():i="Peer.RepliesNotifications";break;case a.yF.toUserId():i="Peer.ServiceNotifications";break;default:if(e.pFlags.bot){i="Bot";break}if(e.pFlags.support){i="SupportStatus";break}switch(null===(t=e.status)||void 0===t?void 0:t._){case"userStatusRecently":i="Lately";break;case"userStatusLastWeek":i="WithinAWeek";break;case"userStatusLastMonth":i="WithinAMonth";break;case"userStatusOffline":{const t=e.status.was_online,n=new Date,a=(n.getTime()/1e3|0)-t;if(a<60)i="Peer.Status.justNow";else if(a<3600)i="Peer.Status.minAgo",o=[a/60|0];else if(a<86400&&n.getDate()===new Date(1e3*t).getDate())i="LastSeen.HoursAgo",o=[a/3600|0];else{i="Peer.Status.LastSeenAt";const{dateEl:e,timeEl:n}=(0,s.rz)(t);o=[e,n]}break}case"userStatusOnline":i="Online";break;default:i="ALongTimeAgo"}}return(0,n.ag)(i,o)}},6131:(e,t,i)=>{"use strict";i.d(t,{MR:()=>d,ZP:()=>c,kN:()=>l});var s=i(3910),n=i(1046),a=i(319),o=i(6628),r=i(9099);function d(e){const{mediaSpoiler:t,reveal:i,destroyAfter:s}=e;(0,r.Z)({element:t,forwards:i,className:"is-revealing",duration:250,onTransitionEnd:()=>{i&&s&&(t.remove(),t.middlewareHelper.destroy())}})}function l(e){const{mediaSpoiler:t,event:i}=e;if((0,s.Z)(i),t.classList.contains("is-revealing"))return;const n=t.parentElement.querySelector("video");n&&!t.parentElement.querySelector(".video-play")&&(n.autoplay=!0,n.play().catch(a.Z)),d({mediaSpoiler:t,reveal:!0,destroyAfter:!0})}function c(e){return t=this,i=void 0,a=function*(){const{media:t}=e,i=(t.sizes||t.thumbs).find((e=>"photoStrippedSize"===e._));if(!i)return;const{image:s,loadPromise:a}=(0,n.Z)(t,i,!0);return yield a,function(e){const{middleware:t,image:i}=e;if(!t())return;i.classList.add("media-spoiler-thumbnail");const s=document.createElement("div");s.classList.add("media-spoiler-container"),s.middlewareHelper=t.create();const n=o.Z.create(Object.assign(Object.assign({},e),{middleware:s.middlewareHelper.get()}));return s.append(i,n.canvas),s}(Object.assign(Object.assign({},e),{image:s}))},new((s=void 0)||(s=Promise))((function(e,n){function o(e){try{d(a.next(e))}catch(e){n(e)}}function r(e){try{d(a.throw(e))}catch(e){n(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,s,a}},6239:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(9345);function n(e){return t=this,i=void 0,a=function*(){try{return yield(0,s.Z)(e)}catch(t){return console.error("wrapMessageActionTextNewUnsafe error:",t),e.plain?"":document.createElement("span")}},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a}},9345:(e,t,i)=>{"use strict";i.d(t,{Z:()=>F,e:()=>x});var s=i(1655),n=i(632),a=i(2614),o=i(130),r=i(8939),d=i(5180),l=i(2946),c=i(2325),h=i(1507),u=i(8115),p=i(2491),f=i(5400),m=i(3512),g=i(2064),v=i(5798);let b,y,w;const S=new Map;var C=i(9083),L=i(493),E=i(3591);function I(e){const t=e.action,{onclick:i,url:s}=(0,E.Z)(`tg://voicechat?chat_id=${e.peerId.toChatId()}&id=${t.call.id}&access_hash=${t.call.access_hash}`);if(!i)return document.createElement("span");const n=document.createElement("a");return n.href=s,n.setAttribute("onclick",i+"(this)"),n}var M=i(496),P=i(7362),Z=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function k(e){return Z(this,void 0,void 0,(function*(){const t=yield(0,M.Z)(e);if(e.plain)return t;const i=document.createElement("i");return i.dataset.savedFrom=e.message.peerId+"_"+e.message.mid,i.dir="auto",i.append(t),i}))}function T(e,t){return t?e:(0,a.Z)((0,u.Z)(e))}function x(e){return Z(this,void 0,void 0,(function*(){const t=e.topic;let i=null==t?void 0:t.icon_emoji_id;return(null==t?void 0:t.id)===h.Ox&&(i="5390854796011906616"),i?e.plain?m.Z.managers.appEmojiManager.getCustomEmojiDocument(i).then((e=>e.stickerEmojiRaw)):(0,C.N)(Object.assign(Object.assign({},e),{docIds:[i]})).then((e=>(e.lastElementChild.classList.add("topic-icon"),e))):e.plain?"":function(e,t){if(!b){w=document.getElementById("svg-defs");const e="http://www.w3.org/2000/svg";b=document.createElementNS(e,"svg"),b.setAttributeNS(null,"width","26"),b.setAttributeNS(null,"height","26"),b.setAttributeNS(null,"viewBox","0 0 26 26"),b.classList.add("topic-icon-svg");const t=document.createElementNS(e,"use");t.setAttributeNS(null,"href","#topic-icon"),b.append(t),y=document.createElement("span"),y.classList.add("topic-icon","avatar-like");const i=document.createElement("span");i.classList.add("topic-icon-content"),y.append(b,i)}e||(console.error("NO TOPIC ICON COLOR!"),e=h.OS[0]),t||(console.error("NO TOPIC NAME!"),t="");const i=e.toString(16),s=`topic-icon-gradient-${e}`;let n=S.get(e);if(!n){const{h:t,s:a,l:o,a:r}=(0,g.cw)("#"+i);w.insertAdjacentHTML("beforeend",`\n \n \n \n \n `),S.set(e,n=`hsla(${t}, ${a}%, ${Math.max(0,o-40)}%, ${r})`)}const a=y.cloneNode(!0);return a.firstElementChild.style.fill=`url(#${s})`,a.firstElementChild.style.stroke=n,a.lastElementChild.append((0,v.Z)(t,!0)),a}(null==t?void 0:t.icon_color,null==t?void 0:t.title)}))}function A(e){const t=e.message.action;return x(Object.assign(Object.assign({},e),{topic:t}))}function _(e){return Z(this,void 0,void 0,(function*(){const t=e.message.action,i=document.createElement("span");return i.classList.add("topic-name"),i.append(yield A(e),T(t.title,e.plain)),i}))}function F(e){var t;return Z(this,void 0,void 0,(function*(){const{plain:i,message:h,middleware:u,lazyLoadQueue:g,customEmojiSize:v,animationGroup:b}=e,y=i?void 0:document.createElement("span"),w="action"in h&&h.action;if(w.message){const e=w.message;return i?(0,p.Z)(e):((0,o.Z)(y,(0,f.ZP)(e,{noLinebreaks:!0})),y)}{let o,u,p=w._;const g=m.Z.managers,v=(e,t)=>t?(0,L.Z)({peerId:e,plainText:t}):(0,P.Z)({peerId:e});switch(w._){case"messageActionPhoneCall":p+="."+w.type,u=[(0,r.Z)(w.duration,i)];break;case"messageActionGroupCall":p+="."+w.type,u=[],p.endsWith("You")||h.pFlags.post||u.push(v(h.fromId,i)),void 0!==w.duration?u.push((0,r.Z)(w.duration,i)):u.push(I(h));break;case"messageActionInviteToGroupCall":{const e=[h.fromId,w.users[0].toPeerId()];let t="Chat.Service.VoiceChatInvitation";const n=m.Z.myId;e[0]===n?t+="ByYou":e[1]===n&&(t+="ForYou"),(0,s.Z)(e,n),o=t,u=e.map((e=>v(e,i))),u.push(I(h));break}case"messageActionGroupCallScheduled":{const e=new Date,t=new Date(1e3*w.schedule_date),s=(t.getTime()-e.getTime())/864e5,a=new Date(e);a.setDate(a.getDate()+1);const r=yield g.appPeersManager.isBroadcast(h.peerId);o=r?"ChatList.Service.VoiceChatScheduled.Channel":"ChatList.Service.VoiceChatScheduled",u=[];const d=m.Z.myId;let l;h.fromId===d?o+="You":r||u.push(v(h.fromId,i));const p=[];s<1&&t.getDate()===e.getDate()?l="TodayAtFormattedWithToday":s<2&&t.getDate()===a.getDate()?l="Time.TomorrowAt":(l="formatDateAtTime",p.push(new c.ZP.IntlDateElement({date:t,options:{day:"2-digit",month:"2-digit",year:"2-digit"}}).element)),p.push((0,n.mr)(t));const f=(0,c.ag)(l,p);u.push(f);break}case"messageActionChatCreate":{const e=m.Z.myId;h.fromId===e?p+="You":u=[v(h.fromId,i)];break}case"messageActionPinMessage":{const t=h.peerId,s=yield g.appMessagesManager.getMessageByPeer(t,h.reply_to_mid);u=[v(h.fromId,i)],s?u.push(k(Object.assign(Object.assign({},e),{message:s}))):(o="ActionPinnedNoText",h.reply_to_mid&&g.appMessagesManager.fetchMessageReplyTo(h));break}case"messageActionChatJoinedByRequest":{const e=yield g.appPeersManager.isBroadcast(h.peerId);h.pFlags.out?o=e?"RequestToJoinChannelApproved":"RequestToJoinGroupApproved":(o=e?"ChatService.UserJoinedChannelByRequest":"ChatService.UserJoinedGroupByRequest",u=[v(h.fromId,i)]);break}case"messageActionContactSignUp":case"messageActionChatReturn":case"messageActionChatLeave":case"messageActionChatJoined":case"messageActionChatEditPhoto":case"messageActionChatDeletePhoto":case"messageActionChatEditVideo":case"messageActionChatJoinedByLink":case"messageActionChannelEditVideo":case"messageActionChannelDeletePhoto":u=[v(h.fromId,i)];break;case"messageActionChannelEditTitle":case"messageActionChatEditTitle":u=[],"messageActionChatEditTitle"===w._&&u.push(v(h.fromId,i)),u.push(T(w.title));break;case"messageActionChatDeleteUser":case"messageActionChatAddUsers":case"messageActionChatAddUser":{const e=w.users||[w.user_id];if(u=[v(h.fromId,i)],e.length>1){const t=(0,c.v_)(yield Promise.all(e.map((e=>v(e.toPeerId(),i)))),!1,i);if(i)u.push(...t);else{const e=document.createElement("span");e.append(...t),u.push(e)}}else u.push(v(e[0].toPeerId(),i));break}case"messageActionBotAllowed":{const e=(0,f.ZP)(w.domain,{entities:[{_:"messageEntityUrl",length:w.domain.length,offset:0}]});u=[(0,a.Z)(e)];break}case"messageActionPaymentSent":{const s=w.pFlags.recurring_init,n=w.pFlags.recurring_used;if(o=n?"Chat.Service.PaymentSentRecurringUsedNoTitle":s?"Chat.Service.PaymentSentRecurringInitNoTitle":"Chat.Service.PaymentSent1NoTitle",u=[(0,d.Z)(w.total_amount,w.currency),v(h.peerId,i)],h.reply_to_mid){const i=yield g.appMessagesManager.getMessageByPeer((null===(t=h.reply_to)||void 0===t?void 0:t.reply_to_peer_id)?(0,l.Z)(h.reply_to.reply_to_peer_id):h.peerId,h.reply_to_mid);i?(o=n?"Chat.Service.PaymentSentRecurringUsed":s?"Chat.Service.PaymentSentRecurringInit":"Chat.Service.PaymentSent1",u.push(k(Object.assign(Object.assign({},e),{message:i})).then((e=>(e instanceof HTMLElement&&e.classList.add("is-receipt-link"),e))))):g.appMessagesManager.fetchMessageReplyTo(h)}break}case"messageActionSetMessagesTTL":{u=[];const e=yield g.appPeersManager.isBroadcast(h.peerId);if(w.period){let t;if(e?o="ActionTTLChannelChanged":h.fromId===m.Z.myId?o="ActionTTLYouChanged":(o="ActionTTLChanged",u.push(v(h.fromId,i))),w.period>1814400){let e;const s=[],a=31536e3;w.period>=a?(e="Years",s.push(w.period/a|0)):(e="Months",s.push(w.period/(30*n.s2)|0)),t=i?c.ZP.format(e,!0,s):(0,c.ag)(e,s)}else t=(0,r.Z)(w.period,i);u.push(t)}else e?o="ActionTTLChannelDisabled":h.fromId===m.Z.myId?o="ActionTTLYouDisabled":(o="ActionTTLDisabled",u.push(v(h.fromId,i)));break}case"messageActionTopicEdit":{let t,s,n;const a=!!h.pFlags.out,r=void 0!==w.icon_emoji_id,d=r&&!+w.icon_emoji_id,l=void 0!==w.title,c=void 0!==w.hidden;a||(n=v(h.fromId,i)),l&&(s=T(w.title)),r&&!d&&(t=A(e)),u=n?[n]:[],w.closed?o=a?"Chat.Service.Group.TopicEdited.You.Paused":"Chat.Service.Group.TopicEdited.Paused":!1===w.closed?o=a?"Chat.Service.Group.TopicEdited.You.Resumed":"Chat.Service.Group.TopicEdited.Resumed":d&&l?(o=a?"Chat.Service.TopicEdited.You.Mixed.IconRemoved":"Chat.Service.TopicEdited.Mixed.IconRemoved",u.push(s)):r&&l?(o=a?"Chat.Service.TopicEdited.You.Mixed":"Chat.Service.TopicEdited.Mixed",u.push(_(e))):d?o=a?"Chat.Service.Group.TopicEdited.You.Icon.Removed":"Chat.Service.Group.TopicEdited.Icon.Removed":l?(o=a?"Chat.Service.Group.TopicEdited.You.Title":"Chat.Service.Group.TopicEdited.Title",u.push(s)):r?(o=a?"Chat.Service.Group.TopicEdited.You.Icon":"Chat.Service.Group.TopicEdited.Icon",u.push(t)):c&&(o=a?w.hidden?"Chat.Service.Group.TopicEdited.You.Hided":"Chat.Service.Group.TopicEdited.You.Unhided":w.hidden?"Chat.Service.Group.TopicEdited.Hided":"Chat.Service.Group.TopicEdited.Unhided");break}case"messageActionTopicCreate":u=[_(e)],o="TopicWasCreatedAction";break;default:o=c.Hz[p]||`[${w._}]`}o||(o=c.Hz[p],void 0===o&&(o="["+p+"]"));const b=u&&(yield Promise.all(u));return i?c.ZP.format(o,!0,b):(0,c.$d)(y,o,b)}}))}},496:(e,t,i)=>{"use strict";i.d(t,{Z:()=>g});var s=i(8938),n=i(5705),a=i(677),o=i(3738),r=i(8456),d=i(5381),l=i(2325),c=i(1346),h=i(8115),u=i(2491),p=i(5400),f=i(3512),m=i(6239);function g(e){var t,i,g,v,b,y;return g=this,v=void 0,y=function*(){let{message:g,text:v,usingMids:b,plain:y,highlightWord:w,withoutMediaType:S}=e;null!=v||(v=g.message);const C=[];let L=!1;const E=(e,t)=>{if(e){if(void 0===t&&L)return;t=y?l.ZP.format(e,!0):(0,l.ag)(e)}if(y)C.push(t);else{const e=document.createElement("span");"string"==typeof t?e.innerHTML=t:e.append(t),C.push(e)}},I=f.Z.managers.appMessagesManager,M=(0,d.Z)(g);let P=null!==(t=g.totalEntities)&&void 0!==t?t:g.entities;if(g.media&&!M){(0,s.Z)(g);let e=!0;if(g.grouped_id){if(b){const t=yield I.getMidsByMessage(g);if(b.length===t.length){for(const i of t)if(!b.includes(i)){e=!1;break}}else e=!1}if(e){const e=yield I.getAlbumText(g.grouped_id);v=(null==e?void 0:e.message)||"",P=(null==e?void 0:e.totalEntities)||[],S||(E("AttachAlbum"),L=!0)}}else e=!1;if(!e&&!S||!v){const e=g.media;switch(e._){case"messageMediaPhoto":E("AttachPhoto");break;case"messageMediaDice":E(void 0,y?e.emoticon:(0,h.Z)(e.emoticon));break;case"messageMediaVenue":v=e.title,E("AttachLocation");break;case"messageMediaGeo":E("AttachLocation");break;case"messageMediaGeoLive":E("AttachLiveLocation");break;case"messageMediaPoll":const t="📊 "+(e.poll.question||"poll");E(void 0,y?t:(0,h.Z)(t));break;case"messageMediaContact":E("AttachContact");break;case"messageMediaGame":{const t="🎮 "+e.game.title;E(void 0,y?t:(0,h.Z)(t));break}case"messageMediaDocument":{const t=e.document;if("video"===t.type)E("AttachVideo");else if("voice"===t.type)E("AttachAudio");else if("gif"===t.type)E("AttachGif");else if("round"===t.type)E("AttachRound");else if("sticker"===t.type){const e=C.length;if(t.stickerEmojiRaw){const e=t.stickerEmojiRaw+" ";E(void 0,y?e:(0,h.Z)(e))}E("AttachSticker");const i=C.splice(e,2);if(y)C.push(i[0]+(i[1]?i[1]:""));else{const e=window.document.createElement("span");e.append(...i),C.push(e)}v=""}else if("audio"===t.type){const e=t.attributes.find((e=>"documentAttributeAudio"===e._&&(e.title||e.performer))),i="🎵 "+(e?[e.title,e.performer].filter(Boolean).join(" - "):t.file_name);E(void 0,y?i:(0,h.Z)(i))}else E(void 0,y?t.file_name:(0,h.Z)(t.file_name));break}case"messageMediaInvoice":"messageExtendedMediaPreview"===(null===(i=e.extended_media)||void 0===i?void 0:i._)?E(void 0,y?e.description:(0,h.Z)(e.description)):E(void 0,y?e.title:(0,h.Z)(e.title));break;case"messageMediaUnsupported":E(l.nK)}}const t=C.length;for(let e=1;e{"use strict";i.d(t,{Z:()=>n});var s=i(8842);function n(e){return t=this,i=void 0,a=function*(){const t=new s.Z;return yield t.update(e),t.element},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a}},9492:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(2830),n=i(4755),a=i(3512),o=i(3442),r=i(6705),d=i(8580),l=i(1713),c=i(7030),h=i(2312),u=i(3114),p=i(7660),f=i(319),m=i(1507),g=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function v({photo:e,message:t,container:i,boxWidth:b,boxHeight:y,withTail:w,isOut:S,lazyLoadQueue:C,middleware:L,size:E,withoutPreloader:I,loadPromises:M,autoDownloadSize:P,noBlur:Z,noThumb:k,noFadeIn:T,blurAfter:x,managers:A=a.Z.managers,processUrl:_}){return g(this,void 0,void 0,(function*(){const F={loadPromises:{thumb:Promise.resolve(),full:Promise.resolve()},images:{thumb:null,full:null},preloader:null,aspecter:null},D="document"===e._,R=D&&e.mime_type.startsWith("image/")&&!E,B=(0,u.Z)(e);if(!(e.sizes||e.thumbs||B||R))return b&&y&&!E&&D&&(0,l.Z)(e,i,b,y,void 0,t),F;let N=0===P;E||(void 0===b&&(b=n.Z.active.regular.width),void 0===y&&(y=n.Z.active.regular.height)),i.classList.add("media-container");let O,U,H,z=i,j=!0,G=Promise.resolve();if(b&&y&&!E){const s=(0,l.Z)(e,i,b,y,void 0,t,void 0,R?{_:"photoSize",w:e.w,h:e.h,size:e.size,type:m.Pt}:void 0);if(E=s.photoSize,j=s.isFit,U=yield A.thumbsStorage.getCacheContext(e,E.type),!j&&!B){z=document.createElement("div"),z.classList.add("media-container-aspecter"),z.style.width=s.size.width+"px",z.style.height=s.size.height+"px";const n=(0,d.Z)(e,U,!Z,!0);if(n){G=n.loadPromise;const e=n.image;e.classList.add("media-photo"),i.append(e)}else(yield v({container:i,message:t,photo:e,boxWidth:0,boxHeight:0,size:E,lazyLoadQueue:C,isOut:S,loadPromises:M,middleware:L,withoutPreloader:I,withTail:w,autoDownloadSize:P,noBlur:Z,noThumb:!0,blurAfter:!0,managers:A})).images.full.classList.add("media-photo","thumbnail");i.classList.add("media-container-fitted"),i.append(z)}}else E||(E=(0,c.Z)(e,b,y,!0)),U=yield A.thumbsStorage.getCacheContext(e,null==E?void 0:E.type);if(!k&&!B){const t=(0,d.Z)(e,U,!Z);t&&(G=Promise.all([G,t.loadPromise]),F.loadPromises.thumb=F.loadPromises.full=G,O=F.images.thumb=t.image,O.classList.add("media-photo"),z.append(O))}if(F.aspecter=z,"photoSizeEmpty"===(null==E?void 0:E._)&&D||(null==E?void 0:E.bytes))return F;"videoSize"===(null==E?void 0:E._)?(H=F.images.full=(0,p.Z)(),H.autoplay=!0,H.loop=!0,H.muted=!0,H.classList.add("media-photo")):(H=F.images.full=new Image,H.classList.add("media-photo"));const V=(O||!U.downloaded)&&a.Z.settings.animationsEnabled&&!T;let K;const W=null==t?void 0:t.uploadingFileName;I||(U.downloaded&&!W||(K=new o.Z({attachMethod:"prepend",isUpload:!!W})),W&&(K.attachPromise(h.Z.getUpload(W)),K.attach(i),N=void 0));const $=e=>(0,s.Z)(i,H,e,V,z,O),q=e=>g(this,void 0,void 0,(function*(){if(!L||L()){if(_&&(e=yield _(e)),x){const t=(0,r.Z)(e,12);return t.promise.then((()=>$(t.canvas.toDataURL())))}return $(e)}}));let Q;const Y=E.w>=150&&E.h>=150||N,X=()=>g(this,void 0,void 0,(function*(){N&&!I&&K&&(K.construct(),K.setManual());const t=(()=>{const t=R&&!E;return h.Z.downloadMediaURL({media:e,thumb:E,queueId:null==C?void 0:C.queueId,onlyCache:t?void 0:N})})(),s=yield A.thumbsStorage.getCacheContext(e,null==E?void 0:E.type);K&&!s.downloaded&&!I&&Y&&K.attach(i,!1,t),N=void 0;const n=t.then(q);return n.catch(f.Z),{download:t,render:n}}));return K&&K.setDownloadFunction(X),U.downloaded?G=Q=(yield X()).render:C?C.push({div:i,load:()=>X().then((({download:e})=>e))}):Q=(yield X()).render,M&&G&&M.push(G),yield G,F.loadPromises.thumb=G,F.loadPromises.full=Q||Promise.resolve(),F.preloader=K,F}))}},5671:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(2291),n=i(2325),a=i(3512),o=i(7362);function r(e){return t=this,i=void 0,d=function*(){const t=document.createElement("span");t.classList.add("sender-title");const i=e.fromId===a.Z.myId&&e.peerId!==a.Z.myId;if(t.append(i?(0,n.ag)("FromYou"):yield(0,o.Z)(Object.assign(Object.assign({},(0,s.Z)(e)),{dialog:e.peerId===a.Z.myId}))),(yield a.Z.managers.appPeersManager.isAnyGroup(e.peerId))||i){const i=yield(0,o.Z)({peerId:e.peerId});t.append(" ➝ ",i)}return t},new((r=void 0)||(r=Promise))((function(e,s){function n(e){try{o(d.next(e))}catch(e){s(e)}}function a(e){try{o(d.throw(e))}catch(e){s(e)}}function o(t){var i;t.done?e(t.value):(i=t.value,i instanceof r?i:new r((function(e){e(i)}))).then(n,a)}o((d=d.apply(t,i||[])).next())}));var t,i,r,d}},1604:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(632);function n(e){const t=document.createElement("span");return t.classList.add("sent-time"),t.append((0,s.zM)(new Date(1e3*e.date))),t}},3541:(e,t,i)=>{"use strict";i.d(t,{Vp:()=>F,ZP:()=>B,_2:()=>N,_i:()=>R});var s=i(5269),n=i(3725),a=i(3910),o=i(2738),r=i(7660),d=i(8497),l=i(6740),c=i(1046),h=i(1185),u=i(5471),p=i(9405),f=i(4755),m=i(925),g=i(3174),v=i(6724),b=i(9674),y=i(2312),w=i(4271),S=i(2790),C=i(7030),L=i(13),E=i(1447),I=i(3512),M=i(7730),P=i(671),Z=i(5814),k=i(6787),T=i(2796),x=i(6775),A=i(645),_=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const F=1.49,D={},R={};function B({doc:e,div:t,middleware:i,loadStickerMiddleware:d,lazyLoadQueue:m,exportLoad:v,group:w,play:S,onlyThumb:B,emoji:N,width:O,height:U,withThumb:H,loop:z,loadPromises:j,needFadeIn:G,needUpscale:V,skipRatio:K,static:W,managers:$=I.Z.managers,fullThumb:q,isOut:Q,noPremium:Y,withLock:X,relativeEffect:J,loopEffect:ee,isCustomEmoji:te,syncedVideo:ie}){var se;return _(this,void 0,void 0,(function*(){t=Array.isArray(t)?t:[t],te&&(N=e.stickerEmojiRaw);const ne=e.sticker;if(1===ne&&(W=!0),!O&&!U){const t=f.Z.active,i=N?t.emojiSticker:e.animated?t.animatedSticker:t.staticSticker,s=(0,p.C)(e.w,e.h).aspectFitted(i);O=s.width,U=s.height}let ae;2===ne&&E.Z.loadLottieWorkers(),t.forEach((t=>{t.dataset.docId=""+e.id,N&&(t.dataset.stickerEmoji=N),t.classList.add("media-sticker-wrapper")}));const oe=(t=(null==ae?void 0:ae.type))=>_(this,void 0,void 0,(function*(){return ae=yield $.thumbsStorage.getCacheContext(e,t)})),re=!W&&(2===ne||3===ne),de=(0,L.Z)(e);void 0!==Q&&de&&!Q&&t.forEach((e=>e.classList.add("reflect-x")));const le=de&&X;if(le){const i=D[e.id];t.forEach((e=>{e.classList.add("is-premium-sticker","tgico-premium_lock"),i&&e.style.setProperty("--lock-url",`url(${i})`)}))}if(W&&1!==ne){const t=(0,C.Z)(e,O,U,!1);yield oe(t.type)}else yield oe(null==q?void 0:q.type);const ce=N&&!te?(0,P.tB)(N):-1,he=ae.downloaded&&!G,ue=re,pe=2===ne||3===ne?yield $.appDocsManager.getLottieCachedThumb(e.id,ce):void 0,fe={render:void 0,load:void 0};let me=(0,n.Z)(),ge=!1;if(((null===(se=e.thumbs)||void 0===se?void 0:se.length)||pe)&&!t[0].firstElementChild&&(!he||ue||B)&&!1!==H){let n=pe||e.thumbs[0];const a=(e,t)=>{e.childElementCount?me.resolve():(t.classList.add("media-sticker","thumbnail"),b.Z.mutateElement(e,(()=>{e.append(t),me.resolve()})))};if("url"in n)ge=!0,t.forEach((e=>{const t=new Image;(0,l.ZP)(t,n.url,(()=>a(e,t)))}));else if("bytes"in n){if("photoPathSize"===n._){n.bytes.length||(n=e.thumbs.find((e=>{var t;return null===(t=e.bytes)||void 0===t?void 0:t.length}))||n);const i=function(e){let t="M";for(let i=0,s=e.length;i=192?t+="AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,"[s-128-64]:(s>=128?t+=",":s>=64&&(t+="-"),t+=""+(63&s))}return t+="z",t}(n.bytes),s="http://www.w3.org/2000/svg",a=document.createElementNS(s,"svg");a.classList.add("rlottie-vector","media-sticker","thumbnail"),a.setAttributeNS(null,"viewBox",`0 0 ${e.w||512} ${e.h||512}`);const o=document.createElementNS(s,"path");o.setAttributeNS(null,"d",i),I.Z.settings.animationsEnabled&&!te&&o.setAttributeNS(null,"fill","url(#g)"),a.append(o),t.forEach(((e,t)=>e.append(t>0?a.cloneNode(!0):a))),ge=!0,me.resolve()}else if(ce<=0){const o=()=>{t.forEach((t=>{const i=new Image,s=(0,h.Z)(e,n,!0);(0,l.ZP)(i,s,(()=>a(t,i)))}))};s.Z||e.pFlags.stickerThumbConverted||ae.url?(ge=!0,o()):(ge=!0,M.Z.convert("main-"+e.id,n.bytes).then((s=>{$.appDocsManager.saveWebPConvertedStrippedThumb(e.id,s),n.bytes=s,e.pFlags.stickerThumbConverted=!0,i&&!i()||t[0].childElementCount?me.resolve():o()})).catch((()=>me.resolve())))}}else if((2===ne&&ce<=0||3===ne)&&(H||B)){const s=()=>_(this,void 0,void 0,(function*(){if(t[0].childElementCount||i&&!i())return void me.resolve();const s=(e,t,s)=>{e.childElementCount||i&&!i()?me.resolve():s?(0,l.ZP)(t,s,(()=>a(e,t))):a(e,t)};yield oe(),t.forEach((t=>{if(ae.url)s(t,new Image,ae.url);else if("bytes"in n){const i=(0,c.Z)(e,n,!0);i.loadPromise.then((()=>s(t,i.image,"")))}else y.Z.downloadMediaURL({media:e,thumb:n}).then((e=>_(this,void 0,void 0,(function*(){return s(t,new Image,e)}))))}))}));if(m&&B)return m.push({div:t[0],load:s}),me.resolve(),fe;s(),n.url&&(ge=!0)}}if(j&&ge&&j.push(me),B)return fe;const ve=(0,u.Z)("MIDDLEWARE"),be=()=>_(this,void 0,void 0,(function*(){if(i&&!i())throw ve;if(2===ne&&!W)return y.Z.downloadMedia({media:e,queueId:null==m?void 0:m.queueId,thumb:q}).then((s=>_(this,void 0,void 0,(function*(){if(i&&!i())throw ve;const n=yield E.Z.loadAnimationWorker({container:t[0],loop:!(N&&!te)&&z,autoplay:S,animationData:s,width:O,height:U,name:"doc"+e.id,needUpscale:V,skipRatio:K,toneIndex:ce,sync:te},w,null!=d?d:i),a=le?()=>{var i,s;const a=null!==(i=D[s=e.id])&&void 0!==i?i:D[s]=function(e){var t;const i=e.getContext("2d"),s=20*(null!==(t=e.dpr)&&void 0!==t?t:1),n=s,a=s,o=(e.width-n)/2,r=e.height-a-0,d=i.getImageData(o,r,n,a).data;let l=0,c=0,h=0,u=0;for(let e=0;ee.style.setProperty("--lock-url",`url(${a})`)))}:void 0;return n.addEventListener("firstFrame",(()=>{const i=n.canvas[0];(!1!==H||te)&&(0,g.O)(e,i,ce),le&&a(),te||t.forEach(((e,t)=>{((e,t)=>{const i=e.firstElementChild;!1!==G&&(G=(G||!i||"svg"===i.tagName)&&I.Z.settings.animationsEnabled);const s=()=>{i&&i!==t&&"DIV"!==i.tagName&&i.remove()};G?b.Z.mutate((()=>{t&&t.classList.add("fade-in"),i&&i.classList.add("fade-out"),(t||i).addEventListener("animationend",(()=>{b.Z.mutate((()=>{t&&t.classList.remove("fade-in"),s()}))}),{once:!0})})):i&&b.Z.mutate(s)})(e,n.canvas[t])}))}),{once:!0}),N&&$.appStickersManager.preloadAnimatedEmojiStickerAnimation(N),n}))));if(W||3===ne){const s=re&&ie,n=s?A.Z.generateName(""+e.id,0,0,void 0,void 0):void 0,a=R[n];if(a)return a;const o=(s?t.slice(0,1):t).map((()=>{let e;if(W)e=new Image;else{const t=e=(0,r.Z)();if(t.muted=!0,S&&(t.autoplay=!0),z&&(t.loop=!0),z&&"number"==typeof z){let i=0,s=0;function n(){i>this.currentTime&&++s===z&&(this.autoplay=!1,this.loop=!1,this.pause(),t.removeEventListener("timeupdate",n)),i=this.currentTime}t.addEventListener("timeupdate",n)}}return e.classList.add("media-sticker"),e})),c=t.map(((e,t)=>e.firstElementChild!==o[t]&&e.firstElementChild));!1!==G&&(G=(G||!he||(W?c[0]:!c[0]||"svg"===c[0].tagName))&&I.Z.settings.animationsEnabled),G&&o.forEach((e=>e.classList.add("fade-in")));const h=new Promise(((n,a)=>_(this,void 0,void 0,(function*(){const r=()=>_(this,void 0,void 0,(function*(){if(i&&!i())return void a(ve);const r=o.length,d=[];let h;yield oe(),t.forEach(((t,u)=>{const p=o[u];p&&(h=(0,l.cj)(p,ae.url)),h.then((()=>((t,o,l)=>{b.Z.mutateElement(t,(()=>{if(!i||i())if(o){if(o){const t=O*window.devicePixelRatio,i=U*window.devicePixelRatio;if(!(0,g.k)(e,ce,t,i)){const s=document.createElement("canvas");s.width=t,s.height=i,s.getContext("2d").drawImage(o,0,0,s.width,s.height),(0,g.O)(e,s,ce)}}s?n(o):(t.append(o),G?(l&&l.classList.add("fade-out"),o.addEventListener("animationend",(()=>{o.classList.remove("fade-in"),null==l||l.remove()}),{once:!0})):null==l||l.remove(),re&&Z.Z.addAnimation(o,w),d.push(o)===r&&n(d))}else s&&re||null==l||l.remove();else a(ve)}))})(t,p,c[u])))}))}));if(yield oe(),ae.url)r();else{let t;if(1!==ne&&W){const i=(0,C.Z)(e,O,U,!1);t=y.Z.downloadMediaURL({media:e,thumb:i,queueId:null==m?void 0:m.queueId})}else t=y.Z.downloadMediaURL({media:e,queueId:null==m?void 0:m.queueId});t.then(r,a)}}))));return n&&(R[n]=h,d&&h.finally((()=>{d()||delete R[n]}))),h}}));if(v&&(1===v&&(!he||re)||2===v))return fe.load=be,fe;const ye=!m||he&&!re?be():(m.push({div:t[0],load:be}),Promise.resolve());return he&&W&&(me=ye,j&&j.push(me)),2===ne&&de&&void 0!==Q&&!Y&&function({container:e,doc:t,managers:i,middleware:s,isOut:n,width:r,loadPromise:d,relativeEffect:l,loopEffect:c}){i.appStickersManager.preloadSticker(t.id,!0);let h=!1;(0,o.fc)(e,(i=>_(this,void 0,void 0,(function*(){if((0,a.Z)(i),h){const e=document.createElement("a");return e.onclick=()=>{(0,T.PE)(),new k.Z(t.stickerSetInput).show()},void(0,T.bC)({langPackKey:"Sticker.Premium.Click.Info",langPackArguments:[e]})}h=!0,yield d;const{animationDiv:o,stickerPromise:u}=(0,x.Z)({doc:t,middleware:s,side:n?"right":"left",size:r*F,target:e,play:!0,fullThumb:(0,L.Z)(t),relativeEffect:l,loopEffect:c});void 0===n||n||o.classList.add("reflect-x"),u.then((e=>{e.addEventListener("destroy",(()=>{h=!1}))}))}))))}({container:t[0],doc:e,managers:$,middleware:i,isOut:Q,width:O,loadPromise:ye,relativeEffect:J,loopEffect:ee}),fe.render=ye,fe}))}function N({event:e,container:t,managers:i,peerId:s,middleware:n}){var o,r;return _(this,void 0,void 0,(function*(){(0,a.Z)(e);const l=(0,d.Z)(t,"bubble"),c=t.dataset.stickerEmoji,h=t.classList.contains("custom-emoji")?void 0:E.Z.getAnimation(t);if(null==h?void 0:h.paused){const e=yield i.appStickersManager.getAnimatedEmojiSoundDocument(c);if(e){const i=document.createElement("audio");i.style.display="none",t.parentElement.append(i);try{const t=yield y.Z.downloadMediaURL({media:e});i.src=t,i.play(),yield(0,m.Z)(i,void 0,!0),i.addEventListener("ended",(()=>{i.src="",i.remove()}),{once:!0})}catch(e){}}h.autoplay=!0,h.restart()}if(!s.isUser())return;const u=yield i.appStickersManager.getAnimatedEmojiSticker(c,!0);if(!u)return;const p=null!==(o=(r=t).emojiData)&&void 0!==o?o:r.emojiData={a:[],v:1},f=t.sendInteractionThrottled=(0,v.Z)((()=>{if(!p.a.length)return;const e=p.a[0].t;p.a.forEach((t=>{t.t=(t.t-e)/1e3}));const s=(0,d.Z)(t,"bubble");i.appMessagesManager.setTyping(w.ZP.chat.peerId,{_:"sendMessageEmojiInteraction",msg_id:(0,S.Z)(+s.dataset.mid),emoticon:c,interaction:{_:"dataJSON",data:JSON.stringify(p)}},!0,w.ZP.chat.threadId),p.a.length=0}),1e3,!1),g=l?l.classList.contains("is-out"):void 0,{animationDiv:b}=(0,x.Z)({doc:u,middleware:n,side:g?"right":"left",size:360,target:t,play:!0,withRandomOffset:!0});void 0===g||g||b.classList.add("reflect-x"),e.isTrusted&&(p.a.push({i:1,t:Date.now()}),f())}))}},6775:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u});var s=i(2131),n=i(8938),a=i(8487),o=i(5471),r=i(3624),d=i(9966),l=i(241),c=i(4271),h=i(3541);function u({size:e,doc:t,middleware:i,target:u,side:p,skipRatio:f,play:m,managers:g,fullThumb:v,withRandomOffset:b,relativeEffect:y,loopEffect:w}){var S;const C=document.createElement("div");let L;C.classList.add("emoji-animation"),C.style.width=e+"px",C.style.height=e+"px";const E=()=>{I.clean(),null==L||L.remove(),C.remove(),c.ZP.chat.bubbles.scrollable.container.removeEventListener("scroll",x)},I=null!==(S=null==i?void 0:i.create())&&void 0!==S?S:(0,r.k)();i=I.get();const M=(0,h.ZP)({div:C,doc:t,middleware:i,withThumb:!1,needFadeIn:!1,loop:!!w,width:e,height:e,play:m,group:"none",skipRatio:f,managers:g,fullThumb:v}).then((({render:e})=>e)).then((e=>{if((0,n.Z)(e),!i())throw e.remove(),(0,o.Z)("MIDDLEWARE");return L=e,L.addEventListener("enterFrame",(e=>{(w||e!==L.maxFrame)&&(0,a.Z)(u)||E()})),s.Z&&L.addEventListener("firstFrame",(()=>{navigator.vibrate(100)}),{once:!0}),L})),P=e=>{const t=Math.random()*e*2;return t>e?-t%e:t},Z=b?P(16):0,k=b?P(4):0,T=()=>{if(!(0,a.Z)(u))return void E();const t=u.getBoundingClientRect(),i=t.width/200,s="center"===p?0:16*("right"===p?1:-1)*i,n="center"===p?0:0*i,o="right"===p?t.right:t.left,r=t.top,d=("center"===p?(t.width-e)/2:"right"===p?-e:0)+s+Z,c=(t.height-e)/2+n+k,h=o+d,f=r+c;f<=-e||f>=l.Z.height?E():y?("center"!==p?C.style[p]=-1*Math.abs(s)+"px":C.style.left=d+"px",C.style.top=c+"px"):(C.style.top=f+"px",C.style.left=h+"px")},x=(0,d.Z)(T);return c.ZP.chat.bubbles.scrollable.container.addEventListener("scroll",x),T(),y?(C.classList.add("is-relative"),u.parentElement.append(C)):c.ZP.emojiAnimationContainer.append(C),{animationDiv:C,stickerPromise:M}}},5772:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(3541);function a({emoji:e,div:t,width:i,height:a,managers:o=s.Z.managers}){return r=this,d=void 0,c=function*(){const s=yield o.appStickersManager.getAnimatedEmojiSticker(e);if(!s)throw t.classList.add("media-sticker-wrapper"),new Error("no sticker");return(0,n.ZP)({doc:s,div:t,emoji:e,width:i,height:a,loop:!1,play:!0})},new((l=void 0)||(l=Promise))((function(e,t){function i(e){try{n(c.next(e))}catch(e){t(e)}}function s(e){try{n(c.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof l?n:new l((function(e){e(n)}))).then(i,s)}n((c=c.apply(r,d||[])).next())}));var r,d,l,c}},1273:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(7660),n=i(6740),a=i(2312),o=i(1447),r=i(3512),d=i(5814),l=i(3541),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function h({set:e,lazyLoadQueue:t,container:i,group:h,autoplay:u,width:p,height:f,managers:m=r.Z.managers}){var g;return c(this,void 0,void 0,(function*(){if(null===(g=e.thumbs)||void 0===g?void 0:g.length)return i.classList.add("media-sticker-wrapper"),void t.push({div:i,load:()=>c(this,void 0,void 0,(function*(){const t=yield m.appStickersManager.getStickerSetThumbDownloadOptions(e),r=a.Z.download(t);if(e.pFlags.animated&&!e.pFlags.videos)return r.then((t=>{o.Z.loadAnimationWorker({container:i,loop:!0,autoplay:u,animationData:t,width:p,height:f,needUpscale:!0,name:"setThumb"+e.id},h)}));{let t;return e.pFlags.videos?(t=(0,s.Z)(),t.autoplay=!0,t.muted=!0,t.loop=!0):t=new Image,t.classList.add("media-sticker"),r.then((s=>{(0,n.ZP)(t,URL.createObjectURL(s),(()=>{i.append(t),e.pFlags.videos&&d.Z.addAnimation(t,h)}))}))}}))});let r;r=e.thumb_document_id?m.appEmojiManager.getCustomEmojiDocument(e.thumb_document_id):m.appStickersManager.getStickerSet(e).then((e=>e.documents[0]));const v=yield r;"documentEmpty"!==v._&&(0,l.ZP)({doc:v,div:i,group:h,lazyLoadQueue:t,managers:m,width:p,height:f})}))}},62:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3541);function n({doc:e,row:t,size:i,managers:n}){const a=t.media,o=t.createMedia("small");a&&o.classList.add("hide");const r=a?[]:void 0,d="small"===i?32:48,l=(0,s.ZP)({div:o,doc:e,width:d,height:d,loadPromises:r,managers:n}).then((({render:e})=>e));return r&&Promise.all(r).then((()=>{o.classList.remove("hide"),a.remove()})),l}},9102:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(2790),n=i(4497),a=i(7362);function o(e){return t=this,i=void 0,r=function*(){const{peerId:t,threadId:i,lastMsgId:o}=e,r=Promise.resolve(),d=(0,n.Z)("t.me/c/"+t.toChatId()+(i?"/"+(0,s.Z)(i):"")+(o?"/"+(0,s.Z)(o):""));return d.classList.add("topic-name","topic-name-button"),d.append(yield(0,a.Z)(e)),{cached:!0,element:d,loadPromise:r}},new((o=void 0)||(o=Promise))((function(e,s){function n(e){try{d(r.next(e))}catch(e){s(e)}}function a(e){try{d(r.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof o?i:new o((function(e){e(i)}))).then(n,a)}d((r=r.apply(t,i||[])).next())}));var t,i,o,r}},2887:(e,t,i)=>{"use strict";i.d(t,{Z:()=>x});var s=i(4762),n=i(5296),a=i(3725),o=i(3910),r=i(2738),d=i(7660),l=i(8487),c=i(6740),h=i(8580),u=i(5471),p=i(4755),f=i(319),m=i(925),g=i(3035),v=i(6724),b=i(9674),y=i(5157),w=i(2312),S=i(4271),C=i(1507),L=i(3512),E=i(5814),I=i(3013),M=i(8448),P=i(3442),Z=i(9492),k=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let T=0;function x({doc:e,container:t,message:i,boxWidth:x,boxHeight:A,withTail:_,isOut:F,middleware:D,lazyLoadQueue:R,noInfo:B,group:N,onlyPreview:O,noPreview:U,withoutPreloader:H,loadPromises:z,noPlayButton:j,photoSize:G,videoSize:V,searchContext:K,autoDownload:W,managers:$=L.Z.managers,noAutoplayAttribute:q}){var Q;return k(this,void 0,void 0,(function*(){const Y=null==W?void 0:W.video;let X=0===Y;const J=!(x&&A),ee=("video"!==e.type||e.size<=52428800&&!J)&&("gif"===e.type?L.Z.settings.autoPlay.gifs:L.Z.settings.autoPlay.videos);let te,ie;if(!B){te=document.createElement("span"),te.classList.add("video-time"),t.append(te);let i=!1;"gif"!==e.type?(te.innerText=(0,y.Z)(e.duration,!1),j||"round"===e.type||(ee&&!X?te.classList.add("tgico","can-autoplay"):i=!0)):(te.innerText="GIF",ee||j||(i=!0,X=void 0)),i&&(ie=document.createElement("span"),ie.classList.add("video-play","tgico-largeplay","btn-circle","position-center"),t.append(ie))}const se={};if("image/gif"===e.mime_type){const s=yield(0,Z.Z)({photo:e,message:i,container:t,boxWidth:x,boxHeight:A,withTail:_,isOut:F,lazyLoadQueue:R,middleware:D,withoutPreloader:H,loadPromises:z,autoDownloadSize:Y,size:G,managers:$});return se.thumb=s,se.loadPromise=s.loadPromises.full,se}let ne;const ae=(0,d.Z)();if(ae.classList.add("media-video"),ae.muted=!0,"round"===e.type){const s=document.createElement("div");s.classList.add("media-round","z-depth-1"),s.dataset.mid=""+i.mid,s.dataset.peerId=""+i.peerId,s.message=i;const a=p.Z.active.round,d=a.width/2,c=3.5,h=d-2*c;s.innerHTML=`\n \n `;const u=s.firstElementChild.firstElementChild;T||(T=2*Math.PI*h),u.style.strokeDasharray=T+" "+T,u.style.strokeDashoffset=""+T,te.classList.add("tgico"),i.pFlags.media_unread&&s.classList.add("is-unread");const f=document.createElement("canvas");f.width=f.height=e.w,s.prepend(f,te),s.append(ae),t.append(s);const m=f.getContext("2d"),b=()=>{const e=s.message,t=I.Z.addMedia(e,!X),i=()=>{(S.ZP.chat.setPeerPromise||Promise.resolve()).finally((()=>{(0,l.Z)(t)||(t.removeEventListener("play",h),t.removeEventListener("timeupdate",c),t.removeEventListener("pause",p),t.removeEventListener("ended",b))}))},a=()=>{m.drawImage(t,0,0);const e=T-t.currentTime/t.duration*T;return u.style.strokeDashoffset=""+e,!t.paused},d=()=>{t.duration&&((0,l.Z)(t)?(t.paused&&a(),te.innerText=(0,y.Z)(t.duration-t.currentTime,!1)):i())},c=(0,v.Z)((()=>{(0,g.T2)(d)}),1e3,!1),h=()=>{ae.classList.add("hide"),s.classList.remove("is-paused"),(0,n.cK)(a,f),ne&&ne.preloader&&ne.preloader.classList.contains("manual")&&ne.onClick()},p=()=>{(0,l.Z)(t)?s.classList.add("is-paused"):i()},b=()=>{ae.classList.remove("hide"),s.classList.add("is-paused"),ae.currentTime=0,te.innerText=(0,y.Z)(t.duration,!1),t.currentTime&&(t.currentTime=0)};t.addEventListener("play",h),t.addEventListener("timeupdate",c),t.addEventListener("pause",p),t.addEventListener("ended",b),(0,r.fc)(f,(i=>{if((0,o.Z)(i),ne&&!ne.detached&&ne.onClick(),t.paused){const i=!!K;if(I.Z.setSearchContext(K||{peerId:C.NM,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,n]=i?(0,M.ns)(s,e.mid):[];I.Z.setTargets({peerId:e.peerId,mid:e.mid},t,n)}t.play()}else t.pause()})),t.paused?t.duration&&t.currentTime!==t.duration&&t.currentTime>0?(a(),d(),ae.classList.add("hide")):p():h()};i.pFlags.is_outgoing?(s.onLoad=b,s.dataset.isOutgoing="1"):b()}else q||(ae.autoplay=!0);let oe,re;if(i){if(oe=yield(0,Z.Z)({photo:e,message:i,container:t,boxWidth:x,boxHeight:A,withTail:_,isOut:F,lazyLoadQueue:R,middleware:D,withoutPreloader:!0,loadPromises:z,autoDownloadSize:null==W?void 0:W.photo,size:G,managers:$}),se.thumb=oe,!ee&&"gif"!==e.type||O)return se.loadPromise=oe.loadPromises.full,se;if(_){const e=(oe.images.thumb||oe.images.full).parentElement;ae.width=+e.getAttributeNS(null,"width"),ae.height=+e.getAttributeNS(null,"height"),e.append(ae)}}else if(!U){const i=(0,h.Z)(e,{},!0);if(i){const e=i.image;e.classList.add("media-poster"),t.append(e),se.thumb={loadPromises:{thumb:i.loadPromise,full:Promise.resolve()},images:{thumb:e,full:null},preloader:null,aspecter:null},null==z||z.push(i.loadPromise),se.loadPromise=i.loadPromise}}if(O)return se;!ae.parentElement&&t&&((null==oe?void 0:oe.aspecter)||t).append(ae);const de=()=>k(this,void 0,void 0,(function*(){return re=yield $.thumbsStorage.getCacheContext(e,null==V?void 0:V.type)}));yield de();const le=null==i?void 0:i.uploadingFileName;le?(ne=new P.Z({attachMethod:"prepend",isUpload:!0}),ne.attachPromise(w.Z.getUpload(le)),ne.attach(t,!1),X=void 0):re.downloaded||e.supportsStreaming||H?e.supportsStreaming&&(ne=new P.Z({cancelable:!1,attachMethod:"prepend"})):ne=new P.Z({attachMethod:"prepend"});const ce=(0,a.Z)();if(ae.addEventListener("error",(e=>{4!==ae.error.code&&console.error("Error "+ae.error.code+"; details: "+ae.error.message),ne&&!le&&ne.detach(),ce.isFulfilled||ce.resolve()}),{once:!0}),"video"===e.type){const e=()=>{ae.duration&&(te.innerText=(0,y.Z)(ae.duration-ae.currentTime,!1))},t=(0,v.Z)((()=>{(0,g.T2)(e)}),1e3,!1);ae.addEventListener("timeupdate",t),ie&&ae.addEventListener("timeupdate",(()=>{b.Z.mutateElement(ie,(()=>{ie.remove()}))}),{once:!0})}ae.muted=!0,ae.loop=!0,q||(ae.autoplay=!0);let he=X&&(null===(Q=null==oe?void 0:oe.preloader)||void 0===Q?void 0:Q.loadFunc);const ue=()=>k(this,void 0,void 0,(function*(){ne&&X&&!H&&(ne.construct(),ne.setManual()),yield de();let n=Promise.resolve();if(ne&&!le||H)if(re.downloaded||e.supportsStreaming)e.supportsStreaming&&(X?n=Promise.reject((0,u.Z)("NO_AUTO_DOWNLOAD")):!re.downloaded&&ne&&(ne.attach(t,!1,null),ae.addEventListener(s.IS_SAFARI?"timeupdate":"canplay",(()=>{ne.detach()}),{once:!0})));else{const i=n=w.Z.downloadMediaURL({media:e,queueId:null==R?void 0:R.queueId,onlyCache:X,thumb:V});ne&&ne.attach(t,!1,i)}return!X&&he&&(he(),he=null),X=void 0,n.then((()=>k(this,void 0,void 0,(function*(){!D||D()?("round"===e.type&&I.Z.resolveWaitingForLoadMedia(i.peerId,i.mid,i.pFlags.is_scheduled),yield de(),(0,m.Z)(ae).then((()=>{N&&E.Z.addAnimation(ae,N),ne&&!le&&ne.detach(),ce.resolve()}),(e=>{console.error("video load error",e),te&&te.classList.add("is-error"),ce.reject(e)})),(0,c.ZP)(ae,re.url)):ce.resolve()}))),f.Z),{download:n,render:Promise.all([n,ce])}}));return ne&&!le&&ne.setDownloadFunction(ue),"gif"!==e.type||ee?se.loadPromise=R?(R.push({div:t,load:()=>ue().then((({render:e})=>e))}),Promise.resolve()):(yield ue()).render:(0,r.fc)(t,(e=>{(0,o.Z)(e),ie.remove(),ue()}),{capture:!0,once:!0}),se.thumb&&(yield se.thumb.loadPromises.thumb),se}))}p.Z.addEventListener("changeScreen",((e,t)=>{if(t===p._.mobile||e===p._.mobile){const e=Array.from(document.querySelectorAll(".media-round .progress-ring")),t=p.Z.active.round.width,i=t/2,s=i-7;T=2*Math.PI*s,e.forEach((e=>{e.setAttributeNS(null,"width",""+t),e.setAttributeNS(null,"height",""+t);const n=e.firstElementChild;n.setAttributeNS(null,"cx",""+i),n.setAttributeNS(null,"cy",""+i),n.setAttributeNS(null,"r",""+s),n.style.strokeDasharray=T+" "+T,n.style.strokeDashoffset=""+T}))}}))},2498:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8456),n=i(5400);function a(e){const t=(0,s.Z)(e.description||"",150,180);return(0,n.ZP)(t)}},1336:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8456),n=i(5400);function a(e){let t=e.title||e.author||e.site_name||"";return t=(0,s.Z)(t,80,100),(0,n.ZP)(t,{noLinks:!0,noLinebreaks:!0})}},7445:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s={AED:{code:"AED",title:"United Arab Emirates Dirham",symbol:"AED",native:"د.إ.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"367",max_amount:"3673030"},AFN:{code:"AFN",title:"Afghan Afghani",symbol:"AFN",native:"؋",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"8729",max_amount:"87299487"},ALL:{code:"ALL",title:"Albanian Lek",symbol:"ALL",native:"Lek",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!1,exp:2,min_amount:"11842",max_amount:"118421187"},AMD:{code:"AMD",title:"Armenian Dram",symbol:"AMD",native:"դր.",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"40943",max_amount:"409436718"},ARS:{code:"ARS",title:"Argentine Peso",symbol:"ARS",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"14705",max_amount:"147059002"},AUD:{code:"AUD",title:"Australian Dollar",symbol:"AU$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"153",max_amount:"1536825"},AZN:{code:"AZN",title:"Azerbaijani Manat",symbol:"AZN",native:"ман.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"169",max_amount:"1699858"},BAM:{code:"BAM",title:"Bosnia & Herzegovina Convertible Mark",symbol:"BAM",native:"KM",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"199",max_amount:"1990677"},BDT:{code:"BDT",title:"Bangladeshi Taka",symbol:"BDT",native:"৳",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"10009",max_amount:"100094046"},BGN:{code:"BGN",title:"Bulgarian Lev",symbol:"BGN",native:"лв.",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"199",max_amount:"1993315"},BND:{code:"BND",title:"Brunei Dollar",symbol:"BND",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"142",max_amount:"1421883"},BOB:{code:"BOB",title:"Bolivian Boliviano",symbol:"BOB",native:"Bs",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"683",max_amount:"6832607"},BRL:{code:"BRL",title:"Brazilian Real",symbol:"R$",native:"R$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"539",max_amount:"5397799"},BYN:{code:"BYN",title:"Belarusian ruble",symbol:"BYN",native:"BYN",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"249",max_amount:"2495801"},CAD:{code:"CAD",title:"Canadian Dollar",symbol:"CA$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"136",max_amount:"1366860"},CHF:{code:"CHF",title:"Swiss Franc",symbol:"CHF",native:"CHF",thousands_sep:"'",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"97",max_amount:"976705"},CLP:{code:"CLP",title:"Chilean Peso",symbol:"CLP",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:0,min_amount:"963",max_amount:"9637495"},CNY:{code:"CNY",title:"Chinese Renminbi Yuan",symbol:"CN¥",native:"CN¥",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"709",max_amount:"7094102"},COP:{code:"COP",title:"Colombian Peso",symbol:"COP",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"452870",max_amount:"4528700000"},CRC:{code:"CRC",title:"Costa Rican Colón",symbol:"CRC",native:"₡",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"62506",max_amount:"625061070"},CZK:{code:"CZK",title:"Czech Koruna",symbol:"CZK",native:"Kč",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"2497",max_amount:"24975029"},DKK:{code:"DKK",title:"Danish Krone",symbol:"DKK",native:"kr",thousands_sep:"",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"755",max_amount:"7555990"},DOP:{code:"DOP",title:"Dominican Peso",symbol:"DOP",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5275",max_amount:"52757308"},DZD:{code:"DZD",title:"Algerian Dinar",symbol:"DZD",native:"د.ج.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"14035",max_amount:"140353307"},EGP:{code:"EGP",title:"Egyptian Pound",symbol:"EGP",native:"ج.م.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1953",max_amount:"19537405"},ETB:{code:"ETB",title:"Ethiopian Birr",symbol:"ETB",native:"ብር",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5224",max_amount:"52247069"},EUR:{code:"EUR",title:"Euro",symbol:"€",native:"€",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"101",max_amount:"1016045"},GBP:{code:"GBP",title:"British Pound",symbol:"£",native:"£",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"89",max_amount:"894445"},GEL:{code:"GEL",title:"Georgian Lari",symbol:"GEL",native:"GEL",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"283",max_amount:"2830234"},GTQ:{code:"GTQ",title:"Guatemalan Quetzal",symbol:"GTQ",native:"Q",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"778",max_amount:"7781323"},HKD:{code:"HKD",title:"Hong Kong Dollar",symbol:"HK$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"784",max_amount:"7849750"},HNL:{code:"HNL",title:"Honduran Lempira",symbol:"HNL",native:"L",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"2441",max_amount:"24413729"},HRK:{code:"HRK",title:"Croatian Kuna",symbol:"HRK",native:"kn",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"764",max_amount:"7648805"},HUF:{code:"HUF",title:"Hungarian Forint",symbol:"HUF",native:"Ft",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"42685",max_amount:"426850229"},IDR:{code:"IDR",title:"Indonesian Rupiah",symbol:"IDR",native:"Rp",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"1523370",max_amount:"15233700000"},ILS:{code:"ILS",title:"Israeli New Sheqel",symbol:"₪",native:"₪",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"354",max_amount:"3543350"},INR:{code:"INR",title:"Indian Rupee",symbol:"₹",native:"₹",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"8155",max_amount:"81555550"},ISK:{code:"ISK",title:"Icelandic Króna",symbol:"ISK",native:"kr",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:0,min_amount:"142",max_amount:"1425603"},JMD:{code:"JMD",title:"Jamaican Dollar",symbol:"JMD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"15013",max_amount:"150131044"},JPY:{code:"JPY",title:"Japanese Yen",symbol:"¥",native:"¥",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"144",max_amount:"1443065"},KES:{code:"KES",title:"Kenyan Shilling",symbol:"KES",native:"Ksh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"12075",max_amount:"120750271"},KGS:{code:"KGS",title:"Kyrgyzstani Som",symbol:"KGS",native:"KGS",thousands_sep:" ",decimal_sep:"-",symbol_left:!1,space_between:!0,exp:2,min_amount:"8018",max_amount:"80182898"},KRW:{code:"KRW",title:"South Korean Won",symbol:"₩",native:"₩",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"1431",max_amount:"14315201"},KZT:{code:"KZT",title:"Kazakhstani Tenge",symbol:"KZT",native:"₸",thousands_sep:" ",decimal_sep:"-",symbol_left:!0,space_between:!1,exp:2,min_amount:"47186",max_amount:"471867112"},LBP:{code:"LBP",title:"Lebanese Pound",symbol:"LBP",native:"ل.ل.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"150999",max_amount:"1509998778"},LKR:{code:"LKR",title:"Sri Lankan Rupee",symbol:"LKR",native:"රු.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"35546",max_amount:"355469651"},MAD:{code:"MAD",title:"Moroccan Dirham",symbol:"MAD",native:"د.م.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1093",max_amount:"10938136"},MDL:{code:"MDL",title:"Moldovan Leu",symbol:"MDL",native:"MDL",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"1926",max_amount:"19264439"},MNT:{code:"MNT",title:"Mongolian Tögrög",symbol:"MNT",native:"MNT",thousands_sep:" ",decimal_sep:",",symbol_left:!0,space_between:!1,exp:2,min_amount:"322444",max_amount:"3224442056"},MUR:{code:"MUR",title:"Mauritian Rupee",symbol:"MUR",native:"MUR",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"4453",max_amount:"44535174"},MVR:{code:"MVR",title:"Maldivian Rufiyaa",symbol:"MVR",native:"MVR",thousands_sep:",",decimal_sep:".",symbol_left:!1,space_between:!0,exp:2,min_amount:"1546",max_amount:"15460397"},MXN:{code:"MXN",title:"Mexican Peso",symbol:"MX$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"2012",max_amount:"20122860"},MYR:{code:"MYR",title:"Malaysian Ringgit",symbol:"MYR",native:"RM",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"463",max_amount:"4632502"},MZN:{code:"MZN",title:"Mozambican Metical",symbol:"MZN",native:"MTn",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"6382",max_amount:"63829729"},NGN:{code:"NGN",title:"Nigerian Naira",symbol:"NGN",native:"₦",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"43203",max_amount:"432039828"},NIO:{code:"NIO",title:"Nicaraguan Córdoba",symbol:"NIO",native:"C$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"3556",max_amount:"35566412"},NOK:{code:"NOK",title:"Norwegian Krone",symbol:"NOK",native:"kr",thousands_sep:" ",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"1069",max_amount:"10690975"},NPR:{code:"NPR",title:"Nepalese Rupee",symbol:"NPR",native:"नेरू",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"12954",max_amount:"129546657"},NZD:{code:"NZD",title:"New Zealand Dollar",symbol:"NZ$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"174",max_amount:"1746220"},PAB:{code:"PAB",title:"Panamanian Balboa",symbol:"PAB",native:"B/.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"98",max_amount:"988722"},PEN:{code:"PEN",title:"Peruvian Nuevo Sol",symbol:"PEN",native:"S/.",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"390",max_amount:"3902208"},PHP:{code:"PHP",title:"Philippine Peso",symbol:"PHP",native:"₱",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"5862",max_amount:"58627496"},PKR:{code:"PKR",title:"Pakistani Rupee",symbol:"PKR",native:"₨",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"22642",max_amount:"226426805"},PLN:{code:"PLN",title:"Polish Złoty",symbol:"PLN",native:"zł",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"493",max_amount:"4932350"},PYG:{code:"PYG",title:"Paraguayan Guaraní",symbol:"PYG",native:"₲",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:0,min_amount:"6977",max_amount:"69772317"},QAR:{code:"QAR",title:"Qatari Riyal",symbol:"QAR",native:"ر.ق.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"364",max_amount:"3640989"},RON:{code:"RON",title:"Romanian Leu",symbol:"RON",native:"RON",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"502",max_amount:"5028645"},RSD:{code:"RSD",title:"Serbian Dinar",symbol:"RSD",native:"дин.",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"11918",max_amount:"119184990"},RUB:{code:"RUB",title:"Russian Ruble",symbol:"RUB",native:"₽",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"7128",max_amount:"71281218"},SAR:{code:"SAR",title:"Saudi Riyal",symbol:"SAR",native:"ر.س.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"375",max_amount:"3756546"},SEK:{code:"SEK",title:"Swedish Krona",symbol:"SEK",native:"kr",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1109",max_amount:"11094972"},SGD:{code:"SGD",title:"Singapore Dollar",symbol:"SGD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"143",max_amount:"1430495"},THB:{code:"THB",title:"Thai Baht",symbol:"฿",native:"฿",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"3780",max_amount:"37800497"},TJS:{code:"TJS",title:"Tajikistani Somoni",symbol:"TJS",native:"TJS",thousands_sep:" ",decimal_sep:";",symbol_left:!1,space_between:!0,exp:2,min_amount:"975",max_amount:"9753854"},TRY:{code:"TRY",title:"Turkish Lira",symbol:"TRY",native:"TL",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1854",max_amount:"18543598"},TTD:{code:"TTD",title:"Trinidad and Tobago Dollar",symbol:"TTD",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"672",max_amount:"6722681"},TWD:{code:"TWD",title:"New Taiwan Dollar",symbol:"NT$",native:"NT$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"3173",max_amount:"31738502"},TZS:{code:"TZS",title:"Tanzanian Shilling",symbol:"TZS",native:"TSh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"233199",max_amount:"2331999890"},UAH:{code:"UAH",title:"Ukrainian Hryvnia",symbol:"UAH",native:"₴",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!1,exp:2,min_amount:"3633",max_amount:"36338830"},UGX:{code:"UGX",title:"Ugandan Shilling",symbol:"UGX",native:"USh",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:0,min_amount:"3816",max_amount:"38166726"},USD:{code:"USD",title:"United States Dollar",symbol:"$",native:"$",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!1,exp:2,min_amount:"100",max_amount:1e6},UYU:{code:"UYU",title:"Uruguayan Peso",symbol:"UYU",native:"$",thousands_sep:".",decimal_sep:",",symbol_left:!0,space_between:!0,exp:2,min_amount:"4080",max_amount:"40801205"},UZS:{code:"UZS",title:"Uzbekistani Som",symbol:"UZS",native:"UZS",thousands_sep:" ",decimal_sep:",",symbol_left:!1,space_between:!0,exp:2,min_amount:"1089058",max_amount:"10890583014"},VND:{code:"VND",title:"Vietnamese Đồng",symbol:"₫",native:"₫",thousands_sep:".",decimal_sep:",",symbol_left:!1,space_between:!0,exp:0,min_amount:"23862",max_amount:"238625000"},YER:{code:"YER",title:"Yemeni Rial",symbol:"YER",native:"ر.ي.‏",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"25030",max_amount:"250300677"},ZAR:{code:"ZAR",title:"South African Rand",symbol:"ZAR",native:"R",thousands_sep:",",decimal_sep:".",symbol_left:!0,space_between:!0,exp:2,min_amount:"1789",max_amount:"17894299"}}},3447:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a,i:()=>s});const s={14:{"1f6dd":4867,"1f6de":4916,"1f6df":4923,"1f7f0":62832,"1f979":183,"1f9cc":1557,"1fa7b":61332,"1fa7c":61330,"1faa9":51093,"1faaa":61364,"1faab":61189,"1faac":51085,"1fab7":2651,"1fab8":2631,"1fab9":2672,"1faba":2673,"1fac3":1520,"1fac4":1521,"1fac5":1505,"1fad7":3793,"1fad8":3707,"1fad9":3804,"1fae0":111,"1fae1":136,"1fae2":132,"1fae3":133,"1fae4":174,"1fae5":142,"1fae6":1385,"1fae7":61353,"1faf0":1341,"1faf1":1332,"1faf2":1333,"1faf3":1334,"1faf4":1335,"1faf5":1351,"1faf6":1360,"1faf1-1f3fb-200d-1faf2-1f3fc":0,"1faf1-1f3fb-200d-1faf2-1f3fd":0,"1faf1-1f3fb-200d-1faf2-1f3fe":0,"1faf1-1f3fb-200d-1faf2-1f3ff":0,"1faf1-1f3fc-200d-1faf2-1f3fb":0,"1faf1-1f3fc-200d-1faf2-1f3fd":0,"1faf1-1f3fc-200d-1faf2-1f3fe":0,"1faf1-1f3fc-200d-1faf2-1f3ff":0,"1faf1-1f3fd-200d-1faf2-1f3fb":0,"1faf1-1f3fd-200d-1faf2-1f3fc":0,"1faf1-1f3fd-200d-1faf2-1f3fe":0,"1faf1-1f3fd-200d-1faf2-1f3ff":0,"1faf1-1f3fe-200d-1faf2-1f3fb":0,"1faf1-1f3fe-200d-1faf2-1f3fc":0,"1faf1-1f3fe-200d-1faf2-1f3fd":0,"1faf1-1f3fe-200d-1faf2-1f3ff":0,"1faf1-1f3ff-200d-1faf2-1f3fb":0,"1faf1-1f3ff-200d-1faf2-1f3fc":0,"1faf1-1f3ff-200d-1faf2-1f3fd":0,"1faf1-1f3ff-200d-1faf2-1f3fe":0,"1fac3-1f3fb":0,"1fac3-1f3fc":0,"1fac3-1f3fd":0,"1fac3-1f3fe":0,"1fac3-1f3ff":0,"1fac4-1f3fb":0,"1fac4-1f3fc":0,"1fac4-1f3fd":0,"1fac4-1f3fe":0,"1fac4-1f3ff":0,"1fac5-1f3fb":0,"1fac5-1f3fc":0,"1fac5-1f3fd":0,"1fac5-1f3fe":0,"1fac5-1f3ff":0,"1faf0-1f3fb":0,"1faf0-1f3fc":0,"1faf0-1f3fd":0,"1faf0-1f3fe":0,"1faf0-1f3ff":0,"1faf1-1f3fb":0,"1faf1-1f3fc":0,"1faf1-1f3fd":0,"1faf1-1f3fe":0,"1faf1-1f3ff":0,"1faf2-1f3fb":0,"1faf2-1f3fc":0,"1faf2-1f3fd":0,"1faf2-1f3fe":0,"1faf2-1f3ff":0,"1faf3-1f3fb":0,"1faf3-1f3fc":0,"1faf3-1f3fd":0,"1faf3-1f3fe":0,"1faf3-1f3ff":0,"1faf4-1f3fb":0,"1faf4-1f3fc":0,"1faf4-1f3fd":0,"1faf4-1f3fe":0,"1faf4-1f3ff":0,"1faf5-1f3fb":0,"1faf5-1f3fc":0,"1faf5-1f3fd":0,"1faf5-1f3fe":0,"1faf5-1f3ff":0,"1faf6-1f3fb":0,"1faf6-1f3fc":0,"1faf6-1f3fd":0,"1faf6-1f3fe":0,"1faf6-1f3ff":0},"":{2049:62835,2122:62863,2139:62888,2194:62764,2195:62763,2196:62762,2197:62756,2198:62758,2199:62760,2328:61194,2600:4990,2601:4998,2602:41013,2603:41018,2604:41020,2611:62851,2614:41014,2615:3781,2618:2667,2620:1106,2622:62753,2623:62754,2626:62783,2638:62780,2639:177,2648:62788,2649:62789,2650:62796,2651:62797,2652:62798,2653:62799,2660:51095,2663:51098,2665:51096,2666:51097,2668:4865,2692:61297,2693:4922,2694:61300,2696:61311,2697:61319,2699:61309,2702:61284,2705:62850,2708:4931,2709:61245,2712:61259,2714:62852,2716:62828,2721:62779,2728:51029,2733:62858,2734:62859,2744:41017,2747:62860,2753:62836,2754:62837,2755:62838,2757:62839,2763:1137,2764:1141,2795:62829,2796:62830,2797:62831,2934:62767,2935:62768,3030:62840,3297:62912,3299:62913,"0023-20e3":62864,"002a-20e3":62865,"0030-20e3":62866,"0031-20e3":62867,"0032-20e3":62868,"0033-20e3":62869,"0034-20e3":62870,"0035-20e3":62871,"0036-20e3":62872,"0037-20e3":62873,"0038-20e3":62874,"0039-20e3":62875,"00a9":62861,"00ae":62862,"1f004":51101,"1f0cf":51100,"1f170":62882,"1f171":62884,"1f17e":62893,"1f17f":62895,"1f18e":62883,"1f191":62885,"1f192":62886,"1f193":62887,"1f194":62889,"1f195":62891,"1f196":62892,"1f197":62894,"1f198":62896,"1f199":62897,"1f19a":62898,"1f1e6-1f1e8":71594,"1f1e6-1f1e9":71595,"1f1e6-1f1ea":71596,"1f1e6-1f1eb":71597,"1f1e6-1f1ec":71598,"1f1e6-1f1ee":71599,"1f1e6-1f1f1":71600,"1f1e6-1f1f2":71601,"1f1e6-1f1f4":71602,"1f1e6-1f1f6":71603,"1f1e6-1f1f7":71604,"1f1e6-1f1f8":71605,"1f1e6-1f1f9":71606,"1f1e6-1f1fa":71607,"1f1e6-1f1fc":71608,"1f1e6-1f1fd":71609,"1f1e6-1f1ff":71610,"1f1e7-1f1e6":71611,"1f1e7-1f1e7":71612,"1f1e7-1f1e9":71613,"1f1e7-1f1ea":71614,"1f1e7-1f1eb":71615,"1f1e7-1f1ec":71616,"1f1e7-1f1ed":71617,"1f1e7-1f1ee":71618,"1f1e7-1f1ef":71619,"1f1e7-1f1f1":71620,"1f1e7-1f1f2":71621,"1f1e7-1f1f3":71622,"1f1e7-1f1f4":71623,"1f1e7-1f1f6":71624,"1f1e7-1f1f7":71625,"1f1e7-1f1f8":71626,"1f1e7-1f1f9":71627,"1f1e7-1f1fb":71628,"1f1e7-1f1fc":71629,"1f1e7-1f1fe":71630,"1f1e7-1f1ff":71631,"1f1e8-1f1e6":71632,"1f1e8-1f1e8":71633,"1f1e8-1f1e9":71634,"1f1e8-1f1eb":71635,"1f1e8-1f1ec":71636,"1f1e8-1f1ed":71637,"1f1e8-1f1ee":71638,"1f1e8-1f1f0":71639,"1f1e8-1f1f1":71640,"1f1e8-1f1f2":71641,"1f1e8-1f1f3":71642,"1f1e8-1f1f4":71643,"1f1e8-1f1f5":71644,"1f1e8-1f1f7":71645,"1f1e8-1f1fa":71646,"1f1e8-1f1fb":71647,"1f1e8-1f1fc":71648,"1f1e8-1f1fd":71649,"1f1e8-1f1fe":71650,"1f1e8-1f1ff":71651,"1f1e9-1f1ea":71652,"1f1e9-1f1ec":71653,"1f1e9-1f1ef":71654,"1f1e9-1f1f0":71655,"1f1e9-1f1f2":71656,"1f1e9-1f1f4":71657,"1f1e9-1f1ff":71658,"1f1ea-1f1e6":71659,"1f1ea-1f1e8":71660,"1f1ea-1f1ea":71661,"1f1ea-1f1ec":71662,"1f1ea-1f1ed":71663,"1f1ea-1f1f7":71664,"1f1ea-1f1f8":71665,"1f1ea-1f1f9":71666,"1f1ea-1f1fa":71667,"1f1eb-1f1ee":71668,"1f1eb-1f1ef":71669,"1f1eb-1f1f0":71670,"1f1eb-1f1f2":71671,"1f1eb-1f1f4":71672,"1f1eb-1f1f7":71673,"1f1ec-1f1e6":71674,"1f1ec-1f1e7":71675,"1f1ec-1f1e9":71676,"1f1ec-1f1ea":71677,"1f1ec-1f1eb":71678,"1f1ec-1f1ec":71679,"1f1ec-1f1ed":71680,"1f1ec-1f1ee":71681,"1f1ec-1f1f1":71682,"1f1ec-1f1f2":71683,"1f1ec-1f1f3":71684,"1f1ec-1f1f5":71685,"1f1ec-1f1f6":71686,"1f1ec-1f1f7":71687,"1f1ec-1f1f8":71688,"1f1ec-1f1f9":71689,"1f1ec-1f1fa":71690,"1f1ec-1f1fc":71691,"1f1ec-1f1fe":71692,"1f1ed-1f1f0":71693,"1f1ed-1f1f2":71694,"1f1ed-1f1f3":71695,"1f1ed-1f1f7":71696,"1f1ed-1f1f9":71697,"1f1ed-1f1fa":71698,"1f1ee-1f1e8":71699,"1f1ee-1f1e9":71700,"1f1ee-1f1ea":71701,"1f1ee-1f1f1":71702,"1f1ee-1f1f2":71703,"1f1ee-1f1f3":71704,"1f1ee-1f1f4":71705,"1f1ee-1f1f6":71706,"1f1ee-1f1f7":71707,"1f1ee-1f1f8":71708,"1f1ee-1f1f9":71709,"1f1ef-1f1ea":71710,"1f1ef-1f1f2":71711,"1f1ef-1f1f4":71712,"1f1ef-1f1f5":71713,"1f1f0-1f1ea":71714,"1f1f0-1f1ec":71715,"1f1f0-1f1ed":71716,"1f1f0-1f1ee":71717,"1f1f0-1f1f2":71718,"1f1f0-1f1f3":71719,"1f1f0-1f1f5":71720,"1f1f0-1f1f7":71721,"1f1f0-1f1fc":71722,"1f1f0-1f1fe":71723,"1f1f0-1f1ff":71724,"1f1f1-1f1e6":71725,"1f1f1-1f1e7":71726,"1f1f1-1f1e8":71727,"1f1f1-1f1ee":71728,"1f1f1-1f1f0":71729,"1f1f1-1f1f7":71730,"1f1f1-1f1f8":71731,"1f1f1-1f1f9":71732,"1f1f1-1f1fa":71733,"1f1f1-1f1fb":71734,"1f1f1-1f1fe":71735,"1f1f2-1f1e6":71736,"1f1f2-1f1e8":71737,"1f1f2-1f1e9":71738,"1f1f2-1f1ea":71739,"1f1f2-1f1eb":71740,"1f1f2-1f1ec":71741,"1f1f2-1f1ed":71742,"1f1f2-1f1f0":71743,"1f1f2-1f1f1":71744,"1f1f2-1f1f2":71745,"1f1f2-1f1f3":71746,"1f1f2-1f1f4":71747,"1f1f2-1f1f5":71748,"1f1f2-1f1f6":71749,"1f1f2-1f1f7":71750,"1f1f2-1f1f8":71751,"1f1f2-1f1f9":71752,"1f1f2-1f1fa":71753,"1f1f2-1f1fb":71754,"1f1f2-1f1fc":71755,"1f1f2-1f1fd":71756,"1f1f2-1f1fe":71757,"1f1f2-1f1ff":71758,"1f1f3-1f1e6":71759,"1f1f3-1f1e8":71760,"1f1f3-1f1ea":71761,"1f1f3-1f1eb":71762,"1f1f3-1f1ec":71763,"1f1f3-1f1ee":71764,"1f1f3-1f1f1":71765,"1f1f3-1f1f4":71766,"1f1f3-1f1f5":71767,"1f1f3-1f1f7":71768,"1f1f3-1f1fa":71769,"1f1f3-1f1ff":71770,"1f1f4-1f1f2":71771,"1f1f5-1f1e6":71772,"1f1f5-1f1ea":71773,"1f1f5-1f1eb":71774,"1f1f5-1f1ec":71775,"1f1f5-1f1ed":71776,"1f1f5-1f1f0":71777,"1f1f5-1f1f1":71778,"1f1f5-1f1f2":71779,"1f1f5-1f1f3":71780,"1f1f5-1f1f7":71781,"1f1f5-1f1f8":71782,"1f1f5-1f1f9":71783,"1f1f5-1f1fc":71784,"1f1f5-1f1fe":71785,"1f1f6-1f1e6":71786,"1f1f7-1f1ea":71787,"1f1f7-1f1f4":71788,"1f1f7-1f1f8":71789,"1f1f7-1f1fa":71790,"1f1f7-1f1fc":71791,"1f1f8-1f1e6":71792,"1f1f8-1f1e7":71793,"1f1f8-1f1e8":71794,"1f1f8-1f1e9":71795,"1f1f8-1f1ea":71796,"1f1f8-1f1ec":71797,"1f1f8-1f1ed":71798,"1f1f8-1f1ee":71799,"1f1f8-1f1ef":71800,"1f1f8-1f1f0":71801,"1f1f8-1f1f1":71802,"1f1f8-1f1f2":71803,"1f1f8-1f1f3":71804,"1f1f8-1f1f4":71805,"1f1f8-1f1f7":71806,"1f1f8-1f1f8":71807,"1f1f8-1f1f9":71808,"1f1f8-1f1fb":71809,"1f1f8-1f1fd":71810,"1f1f8-1f1fe":71811,"1f1f8-1f1ff":71812,"1f1f9-1f1e6":71813,"1f1f9-1f1e8":71814,"1f1f9-1f1e9":71815,"1f1f9-1f1eb":71816,"1f1f9-1f1ec":71817,"1f1f9-1f1ed":71818,"1f1f9-1f1ef":71819,"1f1f9-1f1f0":71820,"1f1f9-1f1f1":71821,"1f1f9-1f1f2":71822,"1f1f9-1f1f3":71823,"1f1f9-1f1f4":71824,"1f1f9-1f1f7":71825,"1f1f9-1f1f9":71826,"1f1f9-1f1fb":71827,"1f1f9-1f1fc":71828,"1f1f9-1f1ff":71829,"1f1fa-1f1e6":71830,"1f1fa-1f1ec":71831,"1f1fa-1f1f2":71832,"1f1fa-1f1f3":71833,"1f1fa-1f1f8":71834,"1f1fa-1f1fe":71835,"1f1fa-1f1ff":71836,"1f1fb-1f1e6":71837,"1f1fb-1f1e8":71838,"1f1fb-1f1ea":71839,"1f1fb-1f1ec":71840,"1f1fb-1f1ee":71841,"1f1fb-1f1f3":71842,"1f1fb-1f1fa":71843,"1f1fc-1f1eb":71844,"1f1fc-1f1f8":71845,"1f1fd-1f1f0":71846,"1f1fe-1f1ea":71847,"1f1fe-1f1f9":71848,"1f1ff-1f1e6":71849,"1f1ff-1f1f2":71850,"1f1ff-1f1fc":71851,"1f201":62899,"1f202":62900,"1f21a":62906,"1f22f":62903,"1f232":62907,"1f233":62911,"1f234":62910,"1f235":62915,"1f236":62902,"1f237":62901,"1f238":62909,"1f239":62905,"1f23a":62914,"1f250":62904,"1f251":62908,"1f300":41010,"1f301":4857,"1f302":41012,"1f303":4858,"1f304":4860,"1f305":4861,"1f306":4862,"1f307":4863,"1f308":41011,"1f309":4864,"1f30a":41023,"1f30b":4815,"1f30c":4997,"1f30d":4806,"1f30e":4807,"1f30f":4808,"1f310":4809,"1f311":4977,"1f312":4978,"1f313":4979,"1f314":4980,"1f315":4981,"1f316":4982,"1f317":4983,"1f318":4984,"1f319":4985,"1f31a":4986,"1f31b":4987,"1f31c":4988,"1f31d":4991,"1f31e":4992,"1f31f":4995,"1f320":4996,"1f321":4989,"1f324":41001,"1f325":41002,"1f326":41003,"1f327":41004,"1f328":41005,"1f329":41006,"1f32a":41007,"1f32b":41008,"1f32c":41009,"1f32d":3725,"1f32e":3727,"1f32f":3728,"1f330":3708,"1f331":2659,"1f332":2661,"1f333":2662,"1f334":2663,"1f335":2664,"1f336":3698,"1f337":2658,"1f338":2649,"1f339":2653,"1f33a":2655,"1f33b":2656,"1f33c":2657,"1f33d":3697,"1f33e":2665,"1f33f":2666,"1f340":2668,"1f341":2669,"1f342":2670,"1f343":2671,"1f344":3705,"1f345":3690,"1f346":3694,"1f347":3674,"1f348":3675,"1f349":3676,"1f34a":3677,"1f34b":3678,"1f34c":3679,"1f34d":3680,"1f34e":3682,"1f34f":3683,"1f350":3684,"1f351":3685,"1f352":3686,"1f353":3687,"1f354":3722,"1f355":3724,"1f356":3718,"1f357":3719,"1f358":3744,"1f359":3745,"1f35a":3746,"1f35b":3747,"1f35c":3748,"1f35d":3749,"1f35e":3709,"1f35f":3723,"1f360":3750,"1f361":3756,"1f362":3751,"1f363":3752,"1f364":3753,"1f365":3754,"1f366":3765,"1f367":3766,"1f368":3767,"1f369":3768,"1f36a":3769,"1f36b":3774,"1f36c":3775,"1f36d":3776,"1f36e":3777,"1f36f":3778,"1f370":3771,"1f371":3743,"1f372":3735,"1f373":3733,"1f374":3801,"1f375":3783,"1f376":3784,"1f377":3786,"1f378":3787,"1f379":3788,"1f37a":3789,"1f37b":3790,"1f37c":3779,"1f37d":3800,"1f37e":3785,"1f37f":3739,"1f380":51040,"1f381":51041,"1f382":3770,"1f383":51024,"1f384":51025,"1f385":1527,"1f386":51026,"1f387":51027,"1f388":51030,"1f389":51031,"1f38a":51032,"1f38b":51033,"1f38c":71588,"1f38d":51034,"1f38e":51035,"1f38f":51036,"1f390":51037,"1f391":51038,"1f392":61134,"1f393":61147,"1f396":51045,"1f397":51042,"1f399":61167,"1f39a":61168,"1f39b":61169,"1f39e":61203,"1f39f":51043,"1f3a0":4866,"1f3a1":4868,"1f3a2":4869,"1f3a3":51072,"1f3a4":61170,"1f3a5":61202,"1f3a6":62819,"1f3a7":61171,"1f3a8":51105,"1f3a9":61146,"1f3aa":4871,"1f3ab":51044,"1f3ac":61205,"1f3ad":51103,"1f3ae":51086,"1f3af":51078,"1f3b0":51088,"1f3b1":51081,"1f3b2":51089,"1f3b3":51060,"1f3b4":51102,"1f3b5":61165,"1f3b6":61166,"1f3b7":61173,"1f3b8":61175,"1f3b9":61176,"1f3ba":61177,"1f3bb":61178,"1f3bc":61164,"1f3bd":51074,"1f3be":51058,"1f3bf":51075,"1f3c0":51054,"1f3c1":71586,"1f3c2":1600,"1f3c3-200d-2640":1584,"1f3c3-200d-2642":1583,"1f3c3":1582,"1f3c4-200d-2640":1606,"1f3c4-200d-2642":1605,"1f3c4":1604,"1f3c5":51047,"1f3c6":51046,"1f3c7":1598,"1f3c8":51056,"1f3c9":51057,"1f3ca-200d-2640":1612,"1f3ca-200d-2642":1611,"1f3ca":1610,"1f3cb-200d-2640":1618,"1f3cb-200d-2642":1617,"1f3cb":1616,"1f3cc-200d-2640":1603,"1f3cc-200d-2642":1602,"1f3cc":1601,"1f3cd":4902,"1f3ce":4901,"1f3cf":51061,"1f3d0":51055,"1f3d1":51062,"1f3d2":51063,"1f3d3":51065,"1f3d4":4813,"1f3d5":4817,"1f3d6":4818,"1f3d7":4824,"1f3d8":4829,"1f3d9":4859,"1f3da":4830,"1f3db":4823,"1f3dc":4819,"1f3dd":4820,"1f3de":4821,"1f3df":4822,"1f3e0":4831,"1f3e1":4832,"1f3e2":4833,"1f3e3":4834,"1f3e4":4835,"1f3e5":4836,"1f3e6":4837,"1f3e7":62729,"1f3e8":4838,"1f3e9":4839,"1f3ea":4840,"1f3eb":4841,"1f3ec":4842,"1f3ed":4843,"1f3ee":61216,"1f3ef":4844,"1f3f0":4845,"1f3f3-200d-1f308":71591,"1f3f3-200d-26a7":71592,"1f3f3":71590,"1f3f4-200d-2620":71593,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71852,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71853,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71854,"1f3f4":71589,"1f3f5":2652,"1f3f7":61234,"1f3f8":51066,"1f3f9":61303,"1f3fa":3805,"1f3fb":9525,"1f3fc":9526,"1f3fd":9527,"1f3fe":9528,"1f3ff":9529,"1f400":2576,"1f401":2575,"1f402":2556,"1f403":2557,"1f404":2558,"1f405":2547,"1f406":2548,"1f407":2579,"1f408-200d-2b1b":2544,"1f408":2543,"1f409":2618,"1f40a":2613,"1f40b":2622,"1f40c":2632,"1f40d":2616,"1f40e":2550,"1f40f":2563,"1f410":2565,"1f411":2564,"1f412":2531,"1f413":2596,"1f414":2595,"1f415-200d-1f9ba":2537,"1f415":2535,"1f416":2560,"1f417":2561,"1f418":2570,"1f419":2629,"1f41a":2630,"1f41b":2634,"1f41c":2635,"1f41d":2636,"1f41e":2638,"1f41f":2625,"1f420":2626,"1f421":2627,"1f422":2614,"1f423":2597,"1f424":2598,"1f425":2599,"1f426":2600,"1f427":2601,"1f428":2586,"1f429":2538,"1f42a":2566,"1f42b":2567,"1f42c":2623,"1f42d":2574,"1f42e":2555,"1f42f":2546,"1f430":2578,"1f431":2542,"1f432":2617,"1f433":2621,"1f434":2549,"1f435":2530,"1f436":2534,"1f437":2559,"1f438":2612,"1f439":2577,"1f43a":2539,"1f43b-200d-2744":2585,"1f43b":2584,"1f43c":2587,"1f43d":2562,"1f43e":2593,"1f43f":2580,"1f440":1381,"1f441-200d-1f5e8":1159,"1f441":1382,"1f442":1373,"1f443":1375,"1f444":1384,"1f445":1383,"1f446":1347,"1f447":1349,"1f448":1345,"1f449":1346,"1f44a":1355,"1f44b":1327,"1f44c":1336,"1f44d":1352,"1f44e":1353,"1f44f":1358,"1f450":1361,"1f451":61144,"1f452":61145,"1f453":61110,"1f454":61115,"1f455":61116,"1f456":61117,"1f457":61122,"1f458":61123,"1f459":61128,"1f45a":61129,"1f45b":61130,"1f45c":61131,"1f45d":61132,"1f45e":61136,"1f45f":61137,"1f460":61140,"1f461":61141,"1f462":61143,"1f463":1687,"1f464":1684,"1f465":1685,"1f466":1388,"1f467":1389,"1f468-200d-1f33e":1457,"1f468-200d-1f373":1460,"1f468-200d-1f37c":1524,"1f468-200d-1f393":1448,"1f468-200d-1f3a4":1478,"1f468-200d-1f3a8":1481,"1f468-200d-1f3eb":1451,"1f468-200d-1f3ed":1466,"1f468-200d-1f466-200d-1f466":1674,"1f468-200d-1f466":1673,"1f468-200d-1f467-200d-1f466":1676,"1f468-200d-1f467-200d-1f467":1677,"1f468-200d-1f467":1675,"1f468-200d-1f468-200d-1f466":1663,"1f468-200d-1f468-200d-1f466-200d-1f466":1666,"1f468-200d-1f468-200d-1f467":1664,"1f468-200d-1f468-200d-1f467-200d-1f466":1665,"1f468-200d-1f468-200d-1f467-200d-1f467":1667,"1f468-200d-1f469-200d-1f466":1658,"1f468-200d-1f469-200d-1f466-200d-1f466":1661,"1f468-200d-1f469-200d-1f467":1659,"1f468-200d-1f469-200d-1f467-200d-1f466":1660,"1f468-200d-1f469-200d-1f467-200d-1f467":1662,"1f468-200d-1f4bb":1475,"1f468-200d-1f4bc":1469,"1f468-200d-1f527":1463,"1f468-200d-1f52c":1472,"1f468-200d-1f680":1487,"1f468-200d-1f692":1490,"1f468-200d-1f9af":1574,"1f468-200d-1f9b0":1396,"1f468-200d-1f9b1":1397,"1f468-200d-1f9b2":1399,"1f468-200d-1f9b3":1398,"1f468-200d-1f9bc":1577,"1f468-200d-1f9bd":1580,"1f468-200d-2695":1445,"1f468-200d-2696":1454,"1f468-200d-2708":1484,"1f468-200d-2764-200d-1f468":1655,"1f468-200d-2764-200d-1f48b-200d-1f468":1651,"1f468":1392,"1f469-200d-1f33e":1458,"1f469-200d-1f373":1461,"1f469-200d-1f37c":1523,"1f469-200d-1f393":1449,"1f469-200d-1f3a4":1479,"1f469-200d-1f3a8":1482,"1f469-200d-1f3eb":1452,"1f469-200d-1f3ed":1467,"1f469-200d-1f466-200d-1f466":1679,"1f469-200d-1f466":1678,"1f469-200d-1f467-200d-1f466":1681,"1f469-200d-1f467-200d-1f467":1682,"1f469-200d-1f467":1680,"1f469-200d-1f469-200d-1f466":1668,"1f469-200d-1f469-200d-1f466-200d-1f466":1671,"1f469-200d-1f469-200d-1f467":1669,"1f469-200d-1f469-200d-1f467-200d-1f466":1670,"1f469-200d-1f469-200d-1f467-200d-1f467":1672,"1f469-200d-1f4bb":1476,"1f469-200d-1f4bc":1470,"1f469-200d-1f527":1464,"1f469-200d-1f52c":1473,"1f469-200d-1f680":1488,"1f469-200d-1f692":1491,"1f469-200d-1f9af":1575,"1f469-200d-1f9b0":1401,"1f469-200d-1f9b1":1403,"1f469-200d-1f9b2":1407,"1f469-200d-1f9b3":1405,"1f469-200d-1f9bc":1578,"1f469-200d-1f9bd":1581,"1f469-200d-2695":1446,"1f469-200d-2696":1455,"1f469-200d-2708":1485,"1f469-200d-2764-200d-1f468":1654,"1f469-200d-2764-200d-1f469":1656,"1f469-200d-2764-200d-1f48b-200d-1f468":1650,"1f469-200d-2764-200d-1f48b-200d-1f469":1652,"1f469":1400,"1f46a":1657,"1f46b":1647,"1f46c":1648,"1f46d":1646,"1f46e-200d-2640":1494,"1f46e-200d-2642":1493,"1f46e":1492,"1f46f-200d-2640":1590,"1f46f-200d-2642":1589,"1f46f":1588,"1f470-200d-2640":1518,"1f470-200d-2642":1517,"1f470":1516,"1f471-200d-2640":1409,"1f471-200d-2642":1410,"1f471":1391,"1f472":1511,"1f473-200d-2640":1510,"1f473-200d-2642":1509,"1f473":1508,"1f474":1412,"1f475":1413,"1f476":1386,"1f477-200d-2640":1504,"1f477-200d-2642":1503,"1f477":1502,"1f478":1507,"1f479":1109,"1f47a":1110,"1f47b":1111,"1f47c":1526,"1f47d":1112,"1f47e":1113,"1f47f":1104,"1f480":1105,"1f481-200d-2640":1428,"1f481-200d-2642":1427,"1f481":1426,"1f482-200d-2640":1500,"1f482-200d-2642":1499,"1f482":1498,"1f483":1585,"1f484":61152,"1f485":1366,"1f486-200d-2640":1560,"1f486-200d-2642":1559,"1f486":1558,"1f487-200d-2640":1563,"1f487-200d-2642":1562,"1f487":1561,"1f488":4870,"1f489":61326,"1f48a":61328,"1f48b":1127,"1f48c":1128,"1f48d":61153,"1f48e":61154,"1f48f":1649,"1f490":2648,"1f491":1653,"1f492":4846,"1f493":1133,"1f494":1138,"1f495":1135,"1f496":1131,"1f497":1132,"1f498":1129,"1f499":1145,"1f49a":1144,"1f49b":1143,"1f49c":1146,"1f49d":1130,"1f49e":1134,"1f49f":1136,"1f4a0":62946,"1f4a1":61214,"1f4a2":1151,"1f4a3":1157,"1f4a4":1163,"1f4a5":1152,"1f4a6":1154,"1f4a7":41022,"1f4a8":1155,"1f4a9":1107,"1f4aa":1368,"1f4ab":1153,"1f4ac":1158,"1f4ad":1162,"1f4ae":2650,"1f4af":1150,"1f4b0":61235,"1f4b1":62841,"1f4b2":62842,"1f4b3":61242,"1f4b4":61237,"1f4b5":61238,"1f4b6":61239,"1f4b7":61240,"1f4b8":61241,"1f4b9":61244,"1f4ba":4936,"1f4bb":61191,"1f4bc":61265,"1f4bd":61197,"1f4be":61198,"1f4bf":61199,"1f4c0":61200,"1f4c1":61266,"1f4c2":61267,"1f4c3":61227,"1f4c4":61229,"1f4c5":61269,"1f4c6":61270,"1f4c7":61273,"1f4c8":61274,"1f4c9":61275,"1f4ca":61276,"1f4cb":61277,"1f4cc":61278,"1f4cd":61279,"1f4ce":61280,"1f4cf":61282,"1f4d0":61283,"1f4d1":61232,"1f4d2":61226,"1f4d3":61225,"1f4d4":61218,"1f4d5":61219,"1f4d6":61220,"1f4d7":61221,"1f4d8":61222,"1f4d9":61223,"1f4da":61224,"1f4db":62847,"1f4dc":61228,"1f4dd":61264,"1f4de":61185,"1f4df":61186,"1f4e0":61187,"1f4e1":61325,"1f4e2":61159,"1f4e3":61160,"1f4e4":61249,"1f4e5":61250,"1f4e6":61251,"1f4e7":61246,"1f4e8":61247,"1f4e9":61248,"1f4ea":61253,"1f4eb":61252,"1f4ec":61254,"1f4ed":61255,"1f4ee":61256,"1f4ef":61161,"1f4f0":61230,"1f4f1":61182,"1f4f2":61183,"1f4f3":62823,"1f4f4":62824,"1f4f5":62751,"1f4f6":62822,"1f4f7":61207,"1f4f8":61208,"1f4f9":61209,"1f4fa":61206,"1f4fb":61172,"1f4fc":61210,"1f4fd":61204,"1f4ff":61151,"1f500":62801,"1f501":62802,"1f502":62803,"1f503":62769,"1f504":62770,"1f505":62820,"1f506":62821,"1f507":61155,"1f508":61156,"1f509":61157,"1f50a":61158,"1f50b":61188,"1f50c":61190,"1f50d":61211,"1f50e":61212,"1f50f":61290,"1f510":61291,"1f511":61292,"1f512":61288,"1f513":61289,"1f514":61162,"1f515":61163,"1f516":61233,"1f517":61313,"1f518":62947,"1f519":62771,"1f51a":62772,"1f51b":62773,"1f51c":62774,"1f51d":62775,"1f51e":62752,"1f51f":62876,"1f520":62877,"1f521":62878,"1f522":62879,"1f523":62880,"1f524":62881,"1f525":41021,"1f526":61215,"1f527":61306,"1f528":61294,"1f529":61308,"1f52a":3803,"1f52b":61301,"1f52c":61323,"1f52d":61324,"1f52e":51082,"1f52f":62787,"1f530":62848,"1f531":62846,"1f532":62949,"1f533":62948,"1f534":62916,"1f535":62920,"1f536":62940,"1f537":62941,"1f538":62942,"1f539":62943,"1f53a":62944,"1f53b":62945,"1f53c":62811,"1f53d":62813,"1f549":62778,"1f54a":2602,"1f54b":4854,"1f54c":4850,"1f54d":4852,"1f54e":62786,"1f550":4955,"1f551":4957,"1f552":4959,"1f553":4961,"1f554":4963,"1f555":4965,"1f556":4967,"1f557":4969,"1f558":4971,"1f559":4973,"1f55a":4975,"1f55b":4953,"1f55c":4956,"1f55d":4958,"1f55e":4960,"1f55f":4962,"1f560":4964,"1f561":4966,"1f562":4968,"1f563":4970,"1f564":4972,"1f565":4974,"1f566":4976,"1f567":4954,"1f56f":61213,"1f570":4952,"1f573":1156,"1f574":1587,"1f575-200d-2640":1497,"1f575-200d-2642":1496,"1f575":1495,"1f576":61111,"1f577":2641,"1f578":2642,"1f579":51087,"1f57a":1586,"1f587":61281,"1f58a":61261,"1f58b":61260,"1f58c":61262,"1f58d":61263,"1f590":1329,"1f595":1348,"1f596":1331,"1f5a4":1148,"1f5a5":61192,"1f5a8":61193,"1f5b1":61195,"1f5b2":61196,"1f5bc":51104,"1f5c2":61268,"1f5c3":61285,"1f5c4":61286,"1f5d1":61287,"1f5d2":61271,"1f5d3":61272,"1f5dc":61310,"1f5dd":61293,"1f5de":61231,"1f5e1":61299,"1f5e3":1683,"1f5e8":1160,"1f5ef":1161,"1f5f3":61257,"1f5fa":4810,"1f5fb":4816,"1f5fc":4847,"1f5fd":4848,"1f5fe":4811,"1f5ff":61362,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":114,"1f608":1103,"1f609":112,"1f60a":113,"1f60b":124,"1f60c":150,"1f60d":116,"1f60e":170,"1f60f":144,"1f610":139,"1f611":140,"1f612":145,"1f613":195,"1f614":151,"1f615":173,"1f616":192,"1f617":119,"1f618":118,"1f619":122,"1f61a":121,"1f61b":125,"1f61c":126,"1f61d":128,"1f61e":194,"1f61f":175,"1f620":1101,"1f621":1100,"1f622":189,"1f623":193,"1f624":199,"1f625":188,"1f626":184,"1f627":185,"1f628":186,"1f629":196,"1f62a":152,"1f62b":197,"1f62c":147,"1f62d":190,"1f62e-200d-1f4a8":148,"1f62e":178,"1f62f":179,"1f630":187,"1f631":191,"1f632":180,"1f633":181,"1f634":154,"1f635-200d-1f4ab":165,"1f635":164,"1f636-200d-1f32b":143,"1f636":141,"1f637":155,"1f638":1116,"1f639":1117,"1f63a":1115,"1f63b":1118,"1f63c":1119,"1f63d":1120,"1f63e":1123,"1f63f":1122,"1f640":1121,"1f641":176,"1f642":19,"1f643":110,"1f644":146,"1f645-200d-2640":1422,"1f645-200d-2642":1421,"1f645":1420,"1f646-200d-2640":1425,"1f646-200d-2642":1424,"1f646":1423,"1f647-200d-2640":1437,"1f647-200d-2642":1436,"1f647":1435,"1f648":1124,"1f649":1125,"1f64a":1126,"1f64b-200d-2640":1431,"1f64b-200d-2642":1430,"1f64b":1429,"1f64c":1359,"1f64d-200d-2640":1416,"1f64d-200d-2642":1415,"1f64d":1414,"1f64e-200d-2640":1419,"1f64e-200d-2642":1418,"1f64e":1417,"1f64f":1364,"1f680":4942,"1f681":4937,"1f682":4872,"1f683":4873,"1f684":4874,"1f685":4875,"1f686":4876,"1f687":4877,"1f688":4878,"1f689":4879,"1f68a":4880,"1f68b":4883,"1f68c":4884,"1f68d":4885,"1f68e":4886,"1f68f":4911,"1f690":4887,"1f691":4888,"1f692":4889,"1f693":4890,"1f694":4891,"1f695":4892,"1f696":4893,"1f697":4894,"1f698":4895,"1f699":4896,"1f69a":4898,"1f69b":4899,"1f69c":4900,"1f69d":4881,"1f69e":4882,"1f69f":4938,"1f6a0":4939,"1f6a1":4940,"1f6a2":4930,"1f6a3-200d-2640":1609,"1f6a3-200d-2642":1608,"1f6a3":1607,"1f6a4":4926,"1f6a5":4918,"1f6a6":4919,"1f6a7":4921,"1f6a8":4917,"1f6a9":71587,"1f6aa":61333,"1f6ab":62745,"1f6ac":61358,"1f6ad":62747,"1f6ae":62730,"1f6af":62748,"1f6b0":62731,"1f6b1":62749,"1f6b2":4907,"1f6b3":62746,"1f6b4-200d-2640":1621,"1f6b4-200d-2642":1620,"1f6b4":1619,"1f6b5-200d-2640":1624,"1f6b5-200d-2642":1623,"1f6b5":1622,"1f6b6-200d-2640":1566,"1f6b6-200d-2642":1565,"1f6b6":1564,"1f6b7":62750,"1f6b8":62743,"1f6b9":62733,"1f6ba":62734,"1f6bb":62735,"1f6bc":62736,"1f6bd":61340,"1f6be":62737,"1f6bf":61342,"1f6c0":1643,"1f6c1":61343,"1f6c2":62738,"1f6c3":62739,"1f6c4":62740,"1f6c5":62741,"1f6cb":61338,"1f6cc":1644,"1f6cd":61133,"1f6ce":4944,"1f6cf":61337,"1f6d0":62776,"1f6d1":4920,"1f6d2":61357,"1f6d5":4851,"1f6d6":4828,"1f6d7":61334,"1f6e0":61298,"1f6e1":61304,"1f6e2":4914,"1f6e3":4912,"1f6e4":4913,"1f6e5":4929,"1f6e9":4932,"1f6eb":4933,"1f6ec":4934,"1f6f0":4941,"1f6f3":4927,"1f6f4":4908,"1f6f5":4903,"1f6f6":4925,"1f6f7":51076,"1f6f8":4943,"1f6f9":4909,"1f6fa":4906,"1f6fb":4897,"1f6fc":4910,"1f7e0":62917,"1f7e1":62918,"1f7e2":62919,"1f7e3":62921,"1f7e4":62922,"1f7e5":62925,"1f7e6":62929,"1f7e7":62926,"1f7e8":62927,"1f7e9":62928,"1f7ea":62930,"1f7eb":62931,"1f90c":1337,"1f90d":1149,"1f90e":1147,"1f90f":1338,"1f910":137,"1f911":129,"1f912":156,"1f913":171,"1f914":135,"1f915":157,"1f916":1114,"1f917":130,"1f918":1343,"1f919":1344,"1f91a":1328,"1f91b":1356,"1f91c":1357,"1f91d":1363,"1f91e":1340,"1f91f":1342,"1f920":167,"1f921":1108,"1f922":158,"1f923":17,"1f924":153,"1f925":149,"1f926-200d-2640":1440,"1f926-200d-2642":1439,"1f926":1438,"1f927":160,"1f928":138,"1f929":117,"1f92a":127,"1f92b":134,"1f92c":1102,"1f92d":131,"1f92e":159,"1f92f":166,"1f930":1519,"1f931":1522,"1f932":1362,"1f933":1367,"1f934":1506,"1f935-200d-2640":1515,"1f935-200d-2642":1514,"1f935":1513,"1f936":1528,"1f937-200d-2640":1443,"1f937-200d-2642":1442,"1f937":1441,"1f938-200d-2640":1627,"1f938-200d-2642":1626,"1f938":1625,"1f939-200d-2640":1639,"1f939-200d-2642":1638,"1f939":1637,"1f93a":1597,"1f93c-200d-2640":1630,"1f93c-200d-2642":1629,"1f93c":1628,"1f93d-200d-2640":1633,"1f93d-200d-2642":1632,"1f93d":1631,"1f93e-200d-2640":1636,"1f93e-200d-2642":1635,"1f93e":1634,"1f93f":51073,"1f940":2654,"1f941":61180,"1f942":3791,"1f943":3792,"1f944":3802,"1f945":51069,"1f947":51048,"1f948":51049,"1f949":51050,"1f94a":51067,"1f94b":51068,"1f94c":51077,"1f94d":51064,"1f94e":51053,"1f94f":51059,"1f950":3710,"1f951":3693,"1f952":3700,"1f953":3721,"1f954":3695,"1f955":3696,"1f956":3711,"1f957":3738,"1f958":3734,"1f959":3730,"1f95a":3732,"1f95b":3780,"1f95c":3706,"1f95d":3689,"1f95e":3715,"1f95f":3757,"1f960":3758,"1f961":3759,"1f962":3799,"1f963":3737,"1f964":3794,"1f965":3692,"1f966":3702,"1f967":3773,"1f968":3713,"1f969":3720,"1f96a":3726,"1f96b":3742,"1f96c":3701,"1f96d":3681,"1f96e":3755,"1f96f":3714,"1f970":115,"1f971":198,"1f972":123,"1f973":168,"1f974":163,"1f975":161,"1f976":162,"1f977":1501,"1f978":169,"1f97a":182,"1f97b":61124,"1f97c":61113,"1f97d":61112,"1f97e":61138,"1f97f":61139,"1f980":3760,"1f981":2545,"1f982":2643,"1f983":2594,"1f984":2551,"1f985":2603,"1f986":2604,"1f987":2583,"1f988":2628,"1f989":2606,"1f98a":2540,"1f98b":2633,"1f98c":2553,"1f98d":2532,"1f98e":2615,"1f98f":2572,"1f990":3762,"1f991":3763,"1f992":2569,"1f993":2552,"1f994":2582,"1f995":2619,"1f996":2620,"1f997":2639,"1f998":2591,"1f999":2568,"1f99a":2610,"1f99b":2573,"1f99c":2611,"1f99d":2541,"1f99e":3761,"1f99f":2644,"1f9a0":2647,"1f9a1":2592,"1f9a2":2605,"1f9a3":2571,"1f9a4":2607,"1f9a5":2588,"1f9a6":2589,"1f9a7":2533,"1f9a8":2590,"1f9a9":2609,"1f9aa":3764,"1f9ab":2581,"1f9ac":2554,"1f9ad":2624,"1f9ae":2536,"1f9af":61312,"1f9b4":1380,"1f9b5":1371,"1f9b6":1372,"1f9b7":1379,"1f9b8-200d-2640":1532,"1f9b8-200d-2642":1531,"1f9b8":1530,"1f9b9-200d-2640":1535,"1f9b9-200d-2642":1534,"1f9b9":1533,"1f9ba":61114,"1f9bb":1374,"1f9bc":4905,"1f9bd":4904,"1f9be":1369,"1f9bf":1370,"1f9c0":3717,"1f9c1":3772,"1f9c2":3741,"1f9c3":3796,"1f9c4":3703,"1f9c5":3704,"1f9c6":3731,"1f9c7":3716,"1f9c8":3740,"1f9c9":3797,"1f9ca":3798,"1f9cb":3795,"1f9cd-200d-2640":1569,"1f9cd-200d-2642":1568,"1f9cd":1567,"1f9ce-200d-2640":1572,"1f9ce-200d-2642":1571,"1f9ce":1570,"1f9cf-200d-2640":1434,"1f9cf-200d-2642":1433,"1f9cf":1432,"1f9d0":172,"1f9d1-200d-1f33e":1456,"1f9d1-200d-1f373":1459,"1f9d1-200d-1f37c":1525,"1f9d1-200d-1f384":1529,"1f9d1-200d-1f393":1447,"1f9d1-200d-1f3a4":1477,"1f9d1-200d-1f3a8":1480,"1f9d1-200d-1f3eb":1450,"1f9d1-200d-1f3ed":1465,"1f9d1-200d-1f4bb":1474,"1f9d1-200d-1f4bc":1468,"1f9d1-200d-1f527":1462,"1f9d1-200d-1f52c":1471,"1f9d1-200d-1f680":1486,"1f9d1-200d-1f692":1489,"1f9d1-200d-1f91d-200d-1f9d1":1645,"1f9d1-200d-1f9af":1573,"1f9d1-200d-1f9b0":1402,"1f9d1-200d-1f9b1":1404,"1f9d1-200d-1f9b2":1408,"1f9d1-200d-1f9b3":1406,"1f9d1-200d-1f9bc":1576,"1f9d1-200d-1f9bd":1579,"1f9d1-200d-2695":1444,"1f9d1-200d-2696":1453,"1f9d1-200d-2708":1483,"1f9d1":1390,"1f9d2":1387,"1f9d3":1411,"1f9d4-200d-2640":1395,"1f9d4-200d-2642":1394,"1f9d4":1393,"1f9d5":1512,"1f9d6-200d-2640":1593,"1f9d6-200d-2642":1592,"1f9d6":1591,"1f9d7-200d-2640":1596,"1f9d7-200d-2642":1595,"1f9d7":1594,"1f9d8-200d-2640":1642,"1f9d8-200d-2642":1641,"1f9d8":1640,"1f9d9-200d-2640":1538,"1f9d9-200d-2642":1537,"1f9d9":1536,"1f9da-200d-2640":1541,"1f9da-200d-2642":1540,"1f9da":1539,"1f9db-200d-2640":1544,"1f9db-200d-2642":1543,"1f9db":1542,"1f9dc-200d-2640":1547,"1f9dc-200d-2642":1546,"1f9dc":1545,"1f9dd-200d-2640":1550,"1f9dd-200d-2642":1549,"1f9dd":1548,"1f9de-200d-2640":1553,"1f9de-200d-2642":1552,"1f9de":1551,"1f9df-200d-2640":1556,"1f9df-200d-2642":1555,"1f9df":1554,"1f9e0":1376,"1f9e1":1142,"1f9e2":61148,"1f9e3":61118,"1f9e4":61119,"1f9e5":61120,"1f9e6":61121,"1f9e7":51039,"1f9e8":51028,"1f9e9":51090,"1f9ea":61320,"1f9eb":61321,"1f9ec":61322,"1f9ed":4812,"1f9ee":61201,"1f9ef":61356,"1f9f0":61316,"1f9f1":4825,"1f9f2":61317,"1f9f3":4945,"1f9f4":61346,"1f9f5":51106,"1f9f6":51108,"1f9f7":61347,"1f9f8":51091,"1f9f9":61348,"1f9fa":61349,"1f9fb":61350,"1f9fc":61352,"1f9fd":61355,"1f9fe":61243,"1f9ff":51084,"1fa70":61142,"1fa71":61125,"1fa72":61126,"1fa73":61127,"1fa74":61135,"1fa78":61327,"1fa79":61329,"1fa7a":61331,"1fa80":51079,"1fa81":51080,"1fa82":4935,"1fa83":61302,"1fa84":51083,"1fa85":51092,"1fa86":51094,"1fa90":4993,"1fa91":61339,"1fa92":61345,"1fa93":61295,"1fa94":61217,"1fa95":61179,"1fa96":61149,"1fa97":61174,"1fa98":61181,"1fa99":61236,"1fa9a":61305,"1fa9b":61307,"1fa9c":61318,"1fa9d":61315,"1fa9e":61335,"1fa9f":61336,"1faa0":61341,"1faa1":51107,"1faa2":51109,"1faa3":61351,"1faa4":61344,"1faa5":61354,"1faa6":61360,"1faa7":61363,"1faa8":4826,"1fab0":2645,"1fab1":2646,"1fab2":2637,"1fab3":2640,"1fab4":2660,"1fab5":4827,"1fab6":2608,"1fac0":1377,"1fac1":1378,"1fac2":1686,"1fad0":3688,"1fad1":3699,"1fad2":3691,"1fad3":3712,"1fad4":3729,"1fad5":3736,"1fad6":3782,"203c":62834,"21a9":62765,"21aa":62766,"231a":4948,"231b":4946,"23cf":62818,"23e9":62805,"23ea":62809,"23eb":62812,"23ec":62814,"23ed":62806,"23ee":62810,"23ef":62807,"23f0":4949,"23f1":4950,"23f2":4951,"23f3":4947,"23f8":62815,"23f9":62816,"23fa":62817,"24c2":62890,"25aa":62938,"25ab":62939,"25b6":62804,"25c0":62808,"25fb":62935,"25fc":62934,"25fd":62937,"25fe":62936,"260e":61184,"261d":1350,"262a":62784,"262e":62785,"262f":62781,"263a":120,"264a":62790,"264b":62791,"264c":62792,"264d":62793,"264e":62794,"264f":62795,"265f":51099,"267b":62844,"267e":62833,"267f":62732,"269b":62777,"269c":62845,"26a0":62742,"26a1":41016,"26a7":62827,"26aa":62924,"26ab":62923,"26b0":61359,"26b1":61361,"26bd":51051,"26be":51052,"26c4":41019,"26c5":4999,"26c8":41e3,"26ce":62800,"26cf":61296,"26d1":61150,"26d3":61314,"26d4":62744,"26e9":4853,"26ea":4849,"26f0":4814,"26f1":41015,"26f2":4855,"26f3":51070,"26f4":4928,"26f5":4924,"26f7":1599,"26f8":51071,"26f9-200d-2640":1615,"26f9-200d-2642":1614,"26f9":1613,"26fa":4856,"26fd":4915,"270a":1354,"270b":1330,"270c":1339,"270d":1365,"270f":61258,"271d":62782,"274c":62853,"274e":62854,"2764-200d-1f525":1139,"2764-200d-1fa79":1140,"27a1":62757,"27b0":62855,"27bf":62856,"2b05":62761,"2b06":62755,"2b07":62759,"2b1b":62932,"2b1c":62933,"2b50":4994,"2b55":62849,"303d":62857,"1f385-1f3fb":0,"1f385-1f3fc":0,"1f385-1f3fd":0,"1f385-1f3fe":0,"1f385-1f3ff":0,"1f3c2-1f3fb":0,"1f3c2-1f3fc":0,"1f3c2-1f3fd":0,"1f3c2-1f3fe":0,"1f3c2-1f3ff":0,"1f3c3-1f3fb-200d-2640":0,"1f3c3-1f3fc-200d-2640":0,"1f3c3-1f3fd-200d-2640":0,"1f3c3-1f3fe-200d-2640":0,"1f3c3-1f3ff-200d-2640":0,"1f3c3-1f3fb-200d-2642":0,"1f3c3-1f3fc-200d-2642":0,"1f3c3-1f3fd-200d-2642":0,"1f3c3-1f3fe-200d-2642":0,"1f3c3-1f3ff-200d-2642":0,"1f3c3-1f3fb":0,"1f3c3-1f3fc":0,"1f3c3-1f3fd":0,"1f3c3-1f3fe":0,"1f3c3-1f3ff":0,"1f3c4-1f3fb-200d-2640":0,"1f3c4-1f3fc-200d-2640":0,"1f3c4-1f3fd-200d-2640":0,"1f3c4-1f3fe-200d-2640":0,"1f3c4-1f3ff-200d-2640":0,"1f3c4-1f3fb-200d-2642":0,"1f3c4-1f3fc-200d-2642":0,"1f3c4-1f3fd-200d-2642":0,"1f3c4-1f3fe-200d-2642":0,"1f3c4-1f3ff-200d-2642":0,"1f3c4-1f3fb":0,"1f3c4-1f3fc":0,"1f3c4-1f3fd":0,"1f3c4-1f3fe":0,"1f3c4-1f3ff":0,"1f3c7-1f3fb":0,"1f3c7-1f3fc":0,"1f3c7-1f3fd":0,"1f3c7-1f3fe":0,"1f3c7-1f3ff":0,"1f3ca-1f3fb-200d-2640":0,"1f3ca-1f3fc-200d-2640":0,"1f3ca-1f3fd-200d-2640":0,"1f3ca-1f3fe-200d-2640":0,"1f3ca-1f3ff-200d-2640":0,"1f3ca-1f3fb-200d-2642":0,"1f3ca-1f3fc-200d-2642":0,"1f3ca-1f3fd-200d-2642":0,"1f3ca-1f3fe-200d-2642":0,"1f3ca-1f3ff-200d-2642":0,"1f3ca-1f3fb":0,"1f3ca-1f3fc":0,"1f3ca-1f3fd":0,"1f3ca-1f3fe":0,"1f3ca-1f3ff":0,"1f3cb-1f3fb-200d-2640":0,"1f3cb-1f3fc-200d-2640":0,"1f3cb-1f3fd-200d-2640":0,"1f3cb-1f3fe-200d-2640":0,"1f3cb-1f3ff-200d-2640":0,"1f3cb-1f3fb-200d-2642":0,"1f3cb-1f3fc-200d-2642":0,"1f3cb-1f3fd-200d-2642":0,"1f3cb-1f3fe-200d-2642":0,"1f3cb-1f3ff-200d-2642":0,"1f3cb-1f3fb":0,"1f3cb-1f3fc":0,"1f3cb-1f3fd":0,"1f3cb-1f3fe":0,"1f3cb-1f3ff":0,"1f3cc-1f3fb-200d-2640":0,"1f3cc-1f3fc-200d-2640":0,"1f3cc-1f3fd-200d-2640":0,"1f3cc-1f3fe-200d-2640":0,"1f3cc-1f3ff-200d-2640":0,"1f3cc-1f3fb-200d-2642":0,"1f3cc-1f3fc-200d-2642":0,"1f3cc-1f3fd-200d-2642":0,"1f3cc-1f3fe-200d-2642":0,"1f3cc-1f3ff-200d-2642":0,"1f3cc-1f3fb":0,"1f3cc-1f3fc":0,"1f3cc-1f3fd":0,"1f3cc-1f3fe":0,"1f3cc-1f3ff":0,"1f442-1f3fb":0,"1f442-1f3fc":0,"1f442-1f3fd":0,"1f442-1f3fe":0,"1f442-1f3ff":0,"1f443-1f3fb":0,"1f443-1f3fc":0,"1f443-1f3fd":0,"1f443-1f3fe":0,"1f443-1f3ff":0,"1f446-1f3fb":0,"1f446-1f3fc":0,"1f446-1f3fd":0,"1f446-1f3fe":0,"1f446-1f3ff":0,"1f447-1f3fb":0,"1f447-1f3fc":0,"1f447-1f3fd":0,"1f447-1f3fe":0,"1f447-1f3ff":0,"1f448-1f3fb":0,"1f448-1f3fc":0,"1f448-1f3fd":0,"1f448-1f3fe":0,"1f448-1f3ff":0,"1f449-1f3fb":0,"1f449-1f3fc":0,"1f449-1f3fd":0,"1f449-1f3fe":0,"1f449-1f3ff":0,"1f44a-1f3fb":0,"1f44a-1f3fc":0,"1f44a-1f3fd":0,"1f44a-1f3fe":0,"1f44a-1f3ff":0,"1f44b-1f3fb":0,"1f44b-1f3fc":0,"1f44b-1f3fd":0,"1f44b-1f3fe":0,"1f44b-1f3ff":0,"1f44c-1f3fb":0,"1f44c-1f3fc":0,"1f44c-1f3fd":0,"1f44c-1f3fe":0,"1f44c-1f3ff":0,"1f44d-1f3fb":0,"1f44d-1f3fc":0,"1f44d-1f3fd":0,"1f44d-1f3fe":0,"1f44d-1f3ff":0,"1f44e-1f3fb":0,"1f44e-1f3fc":0,"1f44e-1f3fd":0,"1f44e-1f3fe":0,"1f44e-1f3ff":0,"1f44f-1f3fb":0,"1f44f-1f3fc":0,"1f44f-1f3fd":0,"1f44f-1f3fe":0,"1f44f-1f3ff":0,"1f450-1f3fb":0,"1f450-1f3fc":0,"1f450-1f3fd":0,"1f450-1f3fe":0,"1f450-1f3ff":0,"1f466-1f3fb":0,"1f466-1f3fc":0,"1f466-1f3fd":0,"1f466-1f3fe":0,"1f466-1f3ff":0,"1f467-1f3fb":0,"1f467-1f3fc":0,"1f467-1f3fd":0,"1f467-1f3fe":0,"1f467-1f3ff":0,"1f468-1f3fb-200d-1f33e":0,"1f468-1f3fc-200d-1f33e":0,"1f468-1f3fd-200d-1f33e":0,"1f468-1f3fe-200d-1f33e":0,"1f468-1f3ff-200d-1f33e":0,"1f468-1f3fb-200d-1f373":0,"1f468-1f3fc-200d-1f373":0,"1f468-1f3fd-200d-1f373":0,"1f468-1f3fe-200d-1f373":0,"1f468-1f3ff-200d-1f373":0,"1f468-1f3fb-200d-1f37c":0,"1f468-1f3fc-200d-1f37c":0,"1f468-1f3fd-200d-1f37c":0,"1f468-1f3fe-200d-1f37c":0,"1f468-1f3ff-200d-1f37c":0,"1f468-1f3fb-200d-1f393":0,"1f468-1f3fc-200d-1f393":0,"1f468-1f3fd-200d-1f393":0,"1f468-1f3fe-200d-1f393":0,"1f468-1f3ff-200d-1f393":0,"1f468-1f3fb-200d-1f3a4":0,"1f468-1f3fc-200d-1f3a4":0,"1f468-1f3fd-200d-1f3a4":0,"1f468-1f3fe-200d-1f3a4":0,"1f468-1f3ff-200d-1f3a4":0,"1f468-1f3fb-200d-1f3a8":0,"1f468-1f3fc-200d-1f3a8":0,"1f468-1f3fd-200d-1f3a8":0,"1f468-1f3fe-200d-1f3a8":0,"1f468-1f3ff-200d-1f3a8":0,"1f468-1f3fb-200d-1f3eb":0,"1f468-1f3fc-200d-1f3eb":0,"1f468-1f3fd-200d-1f3eb":0,"1f468-1f3fe-200d-1f3eb":0,"1f468-1f3ff-200d-1f3eb":0,"1f468-1f3fb-200d-1f3ed":0,"1f468-1f3fc-200d-1f3ed":0,"1f468-1f3fd-200d-1f3ed":0,"1f468-1f3fe-200d-1f3ed":0,"1f468-1f3ff-200d-1f3ed":0,"1f468-1f3fb-200d-1f4bb":0,"1f468-1f3fc-200d-1f4bb":0,"1f468-1f3fd-200d-1f4bb":0,"1f468-1f3fe-200d-1f4bb":0,"1f468-1f3ff-200d-1f4bb":0,"1f468-1f3fb-200d-1f4bc":0,"1f468-1f3fc-200d-1f4bc":0,"1f468-1f3fd-200d-1f4bc":0,"1f468-1f3fe-200d-1f4bc":0,"1f468-1f3ff-200d-1f4bc":0,"1f468-1f3fb-200d-1f527":0,"1f468-1f3fc-200d-1f527":0,"1f468-1f3fd-200d-1f527":0,"1f468-1f3fe-200d-1f527":0,"1f468-1f3ff-200d-1f527":0,"1f468-1f3fb-200d-1f52c":0,"1f468-1f3fc-200d-1f52c":0,"1f468-1f3fd-200d-1f52c":0,"1f468-1f3fe-200d-1f52c":0,"1f468-1f3ff-200d-1f52c":0,"1f468-1f3fb-200d-1f680":0,"1f468-1f3fc-200d-1f680":0,"1f468-1f3fd-200d-1f680":0,"1f468-1f3fe-200d-1f680":0,"1f468-1f3ff-200d-1f680":0,"1f468-1f3fb-200d-1f692":0,"1f468-1f3fc-200d-1f692":0,"1f468-1f3fd-200d-1f692":0,"1f468-1f3fe-200d-1f692":0,"1f468-1f3ff-200d-1f692":0,"1f468-1f3fb-200d-1f9af":0,"1f468-1f3fc-200d-1f9af":0,"1f468-1f3fd-200d-1f9af":0,"1f468-1f3fe-200d-1f9af":0,"1f468-1f3ff-200d-1f9af":0,"1f468-1f3fb-200d-1f9b0":0,"1f468-1f3fc-200d-1f9b0":0,"1f468-1f3fd-200d-1f9b0":0,"1f468-1f3fe-200d-1f9b0":0,"1f468-1f3ff-200d-1f9b0":0,"1f468-1f3fb-200d-1f9b1":0,"1f468-1f3fc-200d-1f9b1":0,"1f468-1f3fd-200d-1f9b1":0,"1f468-1f3fe-200d-1f9b1":0,"1f468-1f3ff-200d-1f9b1":0,"1f468-1f3fb-200d-1f9b2":0,"1f468-1f3fc-200d-1f9b2":0,"1f468-1f3fd-200d-1f9b2":0,"1f468-1f3fe-200d-1f9b2":0,"1f468-1f3ff-200d-1f9b2":0,"1f468-1f3fb-200d-1f9b3":0,"1f468-1f3fc-200d-1f9b3":0,"1f468-1f3fd-200d-1f9b3":0,"1f468-1f3fe-200d-1f9b3":0,"1f468-1f3ff-200d-1f9b3":0,"1f468-1f3fb-200d-1f9bc":0,"1f468-1f3fc-200d-1f9bc":0,"1f468-1f3fd-200d-1f9bc":0,"1f468-1f3fe-200d-1f9bc":0,"1f468-1f3ff-200d-1f9bc":0,"1f468-1f3fb-200d-1f9bd":0,"1f468-1f3fc-200d-1f9bd":0,"1f468-1f3fd-200d-1f9bd":0,"1f468-1f3fe-200d-1f9bd":0,"1f468-1f3ff-200d-1f9bd":0,"1f468-1f3fb-200d-2695":0,"1f468-1f3fc-200d-2695":0,"1f468-1f3fd-200d-2695":0,"1f468-1f3fe-200d-2695":0,"1f468-1f3ff-200d-2695":0,"1f468-1f3fb-200d-2696":0,"1f468-1f3fc-200d-2696":0,"1f468-1f3fd-200d-2696":0,"1f468-1f3fe-200d-2696":0,"1f468-1f3ff-200d-2696":0,"1f468-1f3fb-200d-2708":0,"1f468-1f3fc-200d-2708":0,"1f468-1f3fd-200d-2708":0,"1f468-1f3fe-200d-2708":0,"1f468-1f3ff-200d-2708":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fb":0,"1f468-1f3fc":0,"1f468-1f3fd":0,"1f468-1f3fe":0,"1f468-1f3ff":0,"1f469-1f3fb-200d-1f33e":0,"1f469-1f3fc-200d-1f33e":0,"1f469-1f3fd-200d-1f33e":0,"1f469-1f3fe-200d-1f33e":0,"1f469-1f3ff-200d-1f33e":0,"1f469-1f3fb-200d-1f373":0,"1f469-1f3fc-200d-1f373":0,"1f469-1f3fd-200d-1f373":0,"1f469-1f3fe-200d-1f373":0,"1f469-1f3ff-200d-1f373":0,"1f469-1f3fb-200d-1f37c":0,"1f469-1f3fc-200d-1f37c":0,"1f469-1f3fd-200d-1f37c":0,"1f469-1f3fe-200d-1f37c":0,"1f469-1f3ff-200d-1f37c":0,"1f469-1f3fb-200d-1f393":0,"1f469-1f3fc-200d-1f393":0,"1f469-1f3fd-200d-1f393":0,"1f469-1f3fe-200d-1f393":0,"1f469-1f3ff-200d-1f393":0,"1f469-1f3fb-200d-1f3a4":0,"1f469-1f3fc-200d-1f3a4":0,"1f469-1f3fd-200d-1f3a4":0,"1f469-1f3fe-200d-1f3a4":0,"1f469-1f3ff-200d-1f3a4":0,"1f469-1f3fb-200d-1f3a8":0,"1f469-1f3fc-200d-1f3a8":0,"1f469-1f3fd-200d-1f3a8":0,"1f469-1f3fe-200d-1f3a8":0,"1f469-1f3ff-200d-1f3a8":0,"1f469-1f3fb-200d-1f3eb":0,"1f469-1f3fc-200d-1f3eb":0,"1f469-1f3fd-200d-1f3eb":0,"1f469-1f3fe-200d-1f3eb":0,"1f469-1f3ff-200d-1f3eb":0,"1f469-1f3fb-200d-1f3ed":0,"1f469-1f3fc-200d-1f3ed":0,"1f469-1f3fd-200d-1f3ed":0,"1f469-1f3fe-200d-1f3ed":0,"1f469-1f3ff-200d-1f3ed":0,"1f469-1f3fb-200d-1f4bb":0,"1f469-1f3fc-200d-1f4bb":0,"1f469-1f3fd-200d-1f4bb":0,"1f469-1f3fe-200d-1f4bb":0,"1f469-1f3ff-200d-1f4bb":0,"1f469-1f3fb-200d-1f4bc":0,"1f469-1f3fc-200d-1f4bc":0,"1f469-1f3fd-200d-1f4bc":0,"1f469-1f3fe-200d-1f4bc":0,"1f469-1f3ff-200d-1f4bc":0,"1f469-1f3fb-200d-1f527":0,"1f469-1f3fc-200d-1f527":0,"1f469-1f3fd-200d-1f527":0,"1f469-1f3fe-200d-1f527":0,"1f469-1f3ff-200d-1f527":0,"1f469-1f3fb-200d-1f52c":0,"1f469-1f3fc-200d-1f52c":0,"1f469-1f3fd-200d-1f52c":0,"1f469-1f3fe-200d-1f52c":0,"1f469-1f3ff-200d-1f52c":0,"1f469-1f3fb-200d-1f680":0,"1f469-1f3fc-200d-1f680":0,"1f469-1f3fd-200d-1f680":0,"1f469-1f3fe-200d-1f680":0,"1f469-1f3ff-200d-1f680":0,"1f469-1f3fb-200d-1f692":0,"1f469-1f3fc-200d-1f692":0,"1f469-1f3fd-200d-1f692":0,"1f469-1f3fe-200d-1f692":0,"1f469-1f3ff-200d-1f692":0,"1f469-1f3fb-200d-1f9af":0,"1f469-1f3fc-200d-1f9af":0,"1f469-1f3fd-200d-1f9af":0,"1f469-1f3fe-200d-1f9af":0,"1f469-1f3ff-200d-1f9af":0,"1f469-1f3fb-200d-1f9b0":0,"1f469-1f3fc-200d-1f9b0":0,"1f469-1f3fd-200d-1f9b0":0,"1f469-1f3fe-200d-1f9b0":0,"1f469-1f3ff-200d-1f9b0":0,"1f469-1f3fb-200d-1f9b1":0,"1f469-1f3fc-200d-1f9b1":0,"1f469-1f3fd-200d-1f9b1":0,"1f469-1f3fe-200d-1f9b1":0,"1f469-1f3ff-200d-1f9b1":0,"1f469-1f3fb-200d-1f9b2":0,"1f469-1f3fc-200d-1f9b2":0,"1f469-1f3fd-200d-1f9b2":0,"1f469-1f3fe-200d-1f9b2":0,"1f469-1f3ff-200d-1f9b2":0,"1f469-1f3fb-200d-1f9b3":0,"1f469-1f3fc-200d-1f9b3":0,"1f469-1f3fd-200d-1f9b3":0,"1f469-1f3fe-200d-1f9b3":0,"1f469-1f3ff-200d-1f9b3":0,"1f469-1f3fb-200d-1f9bc":0,"1f469-1f3fc-200d-1f9bc":0,"1f469-1f3fd-200d-1f9bc":0,"1f469-1f3fe-200d-1f9bc":0,"1f469-1f3ff-200d-1f9bc":0,"1f469-1f3fb-200d-1f9bd":0,"1f469-1f3fc-200d-1f9bd":0,"1f469-1f3fd-200d-1f9bd":0,"1f469-1f3fe-200d-1f9bd":0,"1f469-1f3ff-200d-1f9bd":0,"1f469-1f3fb-200d-2695":0,"1f469-1f3fc-200d-2695":0,"1f469-1f3fd-200d-2695":0,"1f469-1f3fe-200d-2695":0,"1f469-1f3ff-200d-2695":0,"1f469-1f3fb-200d-2696":0,"1f469-1f3fc-200d-2696":0,"1f469-1f3fd-200d-2696":0,"1f469-1f3fe-200d-2696":0,"1f469-1f3ff-200d-2696":0,"1f469-1f3fb-200d-2708":0,"1f469-1f3fc-200d-2708":0,"1f469-1f3fd-200d-2708":0,"1f469-1f3fe-200d-2708":0,"1f469-1f3ff-200d-2708":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fb":0,"1f469-1f3fc":0,"1f469-1f3fd":0,"1f469-1f3fe":0,"1f469-1f3ff":0,"1f46b-1f3fb":0,"1f46b-1f3fc":0,"1f46b-1f3fd":0,"1f46b-1f3fe":0,"1f46b-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46c-1f3fb":0,"1f46c-1f3fc":0,"1f46c-1f3fd":0,"1f46c-1f3fe":0,"1f46c-1f3ff":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46d-1f3fb":0,"1f46d-1f3fc":0,"1f46d-1f3fd":0,"1f46d-1f3fe":0,"1f46d-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe":0,"1f46e-1f3fb-200d-2640":0,"1f46e-1f3fc-200d-2640":0,"1f46e-1f3fd-200d-2640":0,"1f46e-1f3fe-200d-2640":0,"1f46e-1f3ff-200d-2640":0,"1f46e-1f3fb-200d-2642":0,"1f46e-1f3fc-200d-2642":0,"1f46e-1f3fd-200d-2642":0,"1f46e-1f3fe-200d-2642":0,"1f46e-1f3ff-200d-2642":0,"1f46e-1f3fb":0,"1f46e-1f3fc":0,"1f46e-1f3fd":0,"1f46e-1f3fe":0,"1f46e-1f3ff":0,"1f470-1f3fb-200d-2640":0,"1f470-1f3fc-200d-2640":0,"1f470-1f3fd-200d-2640":0,"1f470-1f3fe-200d-2640":0,"1f470-1f3ff-200d-2640":0,"1f470-1f3fb-200d-2642":0,"1f470-1f3fc-200d-2642":0,"1f470-1f3fd-200d-2642":0,"1f470-1f3fe-200d-2642":0,"1f470-1f3ff-200d-2642":0,"1f470-1f3fb":0,"1f470-1f3fc":0,"1f470-1f3fd":0,"1f470-1f3fe":0,"1f470-1f3ff":0,"1f471-1f3fb-200d-2640":0,"1f471-1f3fc-200d-2640":0,"1f471-1f3fd-200d-2640":0,"1f471-1f3fe-200d-2640":0,"1f471-1f3ff-200d-2640":0,"1f471-1f3fb-200d-2642":0,"1f471-1f3fc-200d-2642":0,"1f471-1f3fd-200d-2642":0,"1f471-1f3fe-200d-2642":0,"1f471-1f3ff-200d-2642":0,"1f471-1f3fb":0,"1f471-1f3fc":0,"1f471-1f3fd":0,"1f471-1f3fe":0,"1f471-1f3ff":0,"1f472-1f3fb":0,"1f472-1f3fc":0,"1f472-1f3fd":0,"1f472-1f3fe":0,"1f472-1f3ff":0,"1f473-1f3fb-200d-2640":0,"1f473-1f3fc-200d-2640":0,"1f473-1f3fd-200d-2640":0,"1f473-1f3fe-200d-2640":0,"1f473-1f3ff-200d-2640":0,"1f473-1f3fb-200d-2642":0,"1f473-1f3fc-200d-2642":0,"1f473-1f3fd-200d-2642":0,"1f473-1f3fe-200d-2642":0,"1f473-1f3ff-200d-2642":0,"1f473-1f3fb":0,"1f473-1f3fc":0,"1f473-1f3fd":0,"1f473-1f3fe":0,"1f473-1f3ff":0,"1f474-1f3fb":0,"1f474-1f3fc":0,"1f474-1f3fd":0,"1f474-1f3fe":0,"1f474-1f3ff":0,"1f475-1f3fb":0,"1f475-1f3fc":0,"1f475-1f3fd":0,"1f475-1f3fe":0,"1f475-1f3ff":0,"1f476-1f3fb":0,"1f476-1f3fc":0,"1f476-1f3fd":0,"1f476-1f3fe":0,"1f476-1f3ff":0,"1f477-1f3fb-200d-2640":0,"1f477-1f3fc-200d-2640":0,"1f477-1f3fd-200d-2640":0,"1f477-1f3fe-200d-2640":0,"1f477-1f3ff-200d-2640":0,"1f477-1f3fb-200d-2642":0,"1f477-1f3fc-200d-2642":0,"1f477-1f3fd-200d-2642":0,"1f477-1f3fe-200d-2642":0,"1f477-1f3ff-200d-2642":0,"1f477-1f3fb":0,"1f477-1f3fc":0,"1f477-1f3fd":0,"1f477-1f3fe":0,"1f477-1f3ff":0,"1f478-1f3fb":0,"1f478-1f3fc":0,"1f478-1f3fd":0,"1f478-1f3fe":0,"1f478-1f3ff":0,"1f47c-1f3fb":0,"1f47c-1f3fc":0,"1f47c-1f3fd":0,"1f47c-1f3fe":0,"1f47c-1f3ff":0,"1f481-1f3fb-200d-2640":0,"1f481-1f3fc-200d-2640":0,"1f481-1f3fd-200d-2640":0,"1f481-1f3fe-200d-2640":0,"1f481-1f3ff-200d-2640":0,"1f481-1f3fb-200d-2642":0,"1f481-1f3fc-200d-2642":0,"1f481-1f3fd-200d-2642":0,"1f481-1f3fe-200d-2642":0,"1f481-1f3ff-200d-2642":0,"1f481-1f3fb":0,"1f481-1f3fc":0,"1f481-1f3fd":0,"1f481-1f3fe":0,"1f481-1f3ff":0,"1f482-1f3fb-200d-2640":0,"1f482-1f3fc-200d-2640":0,"1f482-1f3fd-200d-2640":0,"1f482-1f3fe-200d-2640":0,"1f482-1f3ff-200d-2640":0,"1f482-1f3fb-200d-2642":0,"1f482-1f3fc-200d-2642":0,"1f482-1f3fd-200d-2642":0,"1f482-1f3fe-200d-2642":0,"1f482-1f3ff-200d-2642":0,"1f482-1f3fb":0,"1f482-1f3fc":0,"1f482-1f3fd":0,"1f482-1f3fe":0,"1f482-1f3ff":0,"1f483-1f3fb":0,"1f483-1f3fc":0,"1f483-1f3fd":0,"1f483-1f3fe":0,"1f483-1f3ff":0,"1f485-1f3fb":0,"1f485-1f3fc":0,"1f485-1f3fd":0,"1f485-1f3fe":0,"1f485-1f3ff":0,"1f486-1f3fb-200d-2640":0,"1f486-1f3fc-200d-2640":0,"1f486-1f3fd-200d-2640":0,"1f486-1f3fe-200d-2640":0,"1f486-1f3ff-200d-2640":0,"1f486-1f3fb-200d-2642":0,"1f486-1f3fc-200d-2642":0,"1f486-1f3fd-200d-2642":0,"1f486-1f3fe-200d-2642":0,"1f486-1f3ff-200d-2642":0,"1f486-1f3fb":0,"1f486-1f3fc":0,"1f486-1f3fd":0,"1f486-1f3fe":0,"1f486-1f3ff":0,"1f487-1f3fb-200d-2640":0,"1f487-1f3fc-200d-2640":0,"1f487-1f3fd-200d-2640":0,"1f487-1f3fe-200d-2640":0,"1f487-1f3ff-200d-2640":0,"1f487-1f3fb-200d-2642":0,"1f487-1f3fc-200d-2642":0,"1f487-1f3fd-200d-2642":0,"1f487-1f3fe-200d-2642":0,"1f487-1f3ff-200d-2642":0,"1f487-1f3fb":0,"1f487-1f3fc":0,"1f487-1f3fd":0,"1f487-1f3fe":0,"1f487-1f3ff":0,"1f48f-1f3fb":0,"1f48f-1f3fc":0,"1f48f-1f3fd":0,"1f48f-1f3fe":0,"1f48f-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f491-1f3fb":0,"1f491-1f3fc":0,"1f491-1f3fd":0,"1f491-1f3fe":0,"1f491-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe":0,"1f4aa-1f3fb":0,"1f4aa-1f3fc":0,"1f4aa-1f3fd":0,"1f4aa-1f3fe":0,"1f4aa-1f3ff":0,"1f574-1f3fb":0,"1f574-1f3fc":0,"1f574-1f3fd":0,"1f574-1f3fe":0,"1f574-1f3ff":0,"1f575-1f3fb-200d-2640":0,"1f575-1f3fc-200d-2640":0,"1f575-1f3fd-200d-2640":0,"1f575-1f3fe-200d-2640":0,"1f575-1f3ff-200d-2640":0,"1f575-1f3fb-200d-2642":0,"1f575-1f3fc-200d-2642":0,"1f575-1f3fd-200d-2642":0,"1f575-1f3fe-200d-2642":0,"1f575-1f3ff-200d-2642":0,"1f575-1f3fb":0,"1f575-1f3fc":0,"1f575-1f3fd":0,"1f575-1f3fe":0,"1f575-1f3ff":0,"1f57a-1f3fb":0,"1f57a-1f3fc":0,"1f57a-1f3fd":0,"1f57a-1f3fe":0,"1f57a-1f3ff":0,"1f590-1f3fb":0,"1f590-1f3fc":0,"1f590-1f3fd":0,"1f590-1f3fe":0,"1f590-1f3ff":0,"1f595-1f3fb":0,"1f595-1f3fc":0,"1f595-1f3fd":0,"1f595-1f3fe":0,"1f595-1f3ff":0,"1f596-1f3fb":0,"1f596-1f3fc":0,"1f596-1f3fd":0,"1f596-1f3fe":0,"1f596-1f3ff":0,"1f645-1f3fb-200d-2640":0,"1f645-1f3fc-200d-2640":0,"1f645-1f3fd-200d-2640":0,"1f645-1f3fe-200d-2640":0,"1f645-1f3ff-200d-2640":0,"1f645-1f3fb-200d-2642":0,"1f645-1f3fc-200d-2642":0,"1f645-1f3fd-200d-2642":0,"1f645-1f3fe-200d-2642":0,"1f645-1f3ff-200d-2642":0,"1f645-1f3fb":0,"1f645-1f3fc":0,"1f645-1f3fd":0,"1f645-1f3fe":0,"1f645-1f3ff":0,"1f646-1f3fb-200d-2640":0,"1f646-1f3fc-200d-2640":0,"1f646-1f3fd-200d-2640":0,"1f646-1f3fe-200d-2640":0,"1f646-1f3ff-200d-2640":0,"1f646-1f3fb-200d-2642":0,"1f646-1f3fc-200d-2642":0,"1f646-1f3fd-200d-2642":0,"1f646-1f3fe-200d-2642":0,"1f646-1f3ff-200d-2642":0,"1f646-1f3fb":0,"1f646-1f3fc":0,"1f646-1f3fd":0,"1f646-1f3fe":0,"1f646-1f3ff":0,"1f647-1f3fb-200d-2640":0,"1f647-1f3fc-200d-2640":0,"1f647-1f3fd-200d-2640":0,"1f647-1f3fe-200d-2640":0,"1f647-1f3ff-200d-2640":0,"1f647-1f3fb-200d-2642":0,"1f647-1f3fc-200d-2642":0,"1f647-1f3fd-200d-2642":0,"1f647-1f3fe-200d-2642":0,"1f647-1f3ff-200d-2642":0,"1f647-1f3fb":0,"1f647-1f3fc":0,"1f647-1f3fd":0,"1f647-1f3fe":0,"1f647-1f3ff":0,"1f64b-1f3fb-200d-2640":0,"1f64b-1f3fc-200d-2640":0,"1f64b-1f3fd-200d-2640":0,"1f64b-1f3fe-200d-2640":0,"1f64b-1f3ff-200d-2640":0,"1f64b-1f3fb-200d-2642":0,"1f64b-1f3fc-200d-2642":0,"1f64b-1f3fd-200d-2642":0,"1f64b-1f3fe-200d-2642":0,"1f64b-1f3ff-200d-2642":0,"1f64b-1f3fb":0,"1f64b-1f3fc":0,"1f64b-1f3fd":0,"1f64b-1f3fe":0,"1f64b-1f3ff":0,"1f64c-1f3fb":0,"1f64c-1f3fc":0,"1f64c-1f3fd":0,"1f64c-1f3fe":0,"1f64c-1f3ff":0,"1f64d-1f3fb-200d-2640":0,"1f64d-1f3fc-200d-2640":0,"1f64d-1f3fd-200d-2640":0,"1f64d-1f3fe-200d-2640":0,"1f64d-1f3ff-200d-2640":0,"1f64d-1f3fb-200d-2642":0,"1f64d-1f3fc-200d-2642":0,"1f64d-1f3fd-200d-2642":0,"1f64d-1f3fe-200d-2642":0,"1f64d-1f3ff-200d-2642":0,"1f64d-1f3fb":0,"1f64d-1f3fc":0,"1f64d-1f3fd":0,"1f64d-1f3fe":0,"1f64d-1f3ff":0,"1f64e-1f3fb-200d-2640":0,"1f64e-1f3fc-200d-2640":0,"1f64e-1f3fd-200d-2640":0,"1f64e-1f3fe-200d-2640":0,"1f64e-1f3ff-200d-2640":0,"1f64e-1f3fb-200d-2642":0,"1f64e-1f3fc-200d-2642":0,"1f64e-1f3fd-200d-2642":0,"1f64e-1f3fe-200d-2642":0,"1f64e-1f3ff-200d-2642":0,"1f64e-1f3fb":0,"1f64e-1f3fc":0,"1f64e-1f3fd":0,"1f64e-1f3fe":0,"1f64e-1f3ff":0,"1f64f-1f3fb":0,"1f64f-1f3fc":0,"1f64f-1f3fd":0,"1f64f-1f3fe":0,"1f64f-1f3ff":0,"1f6a3-1f3fb-200d-2640":0,"1f6a3-1f3fc-200d-2640":0,"1f6a3-1f3fd-200d-2640":0,"1f6a3-1f3fe-200d-2640":0,"1f6a3-1f3ff-200d-2640":0,"1f6a3-1f3fb-200d-2642":0,"1f6a3-1f3fc-200d-2642":0,"1f6a3-1f3fd-200d-2642":0,"1f6a3-1f3fe-200d-2642":0,"1f6a3-1f3ff-200d-2642":0,"1f6a3-1f3fb":0,"1f6a3-1f3fc":0,"1f6a3-1f3fd":0,"1f6a3-1f3fe":0,"1f6a3-1f3ff":0,"1f6b4-1f3fb-200d-2640":0,"1f6b4-1f3fc-200d-2640":0,"1f6b4-1f3fd-200d-2640":0,"1f6b4-1f3fe-200d-2640":0,"1f6b4-1f3ff-200d-2640":0,"1f6b4-1f3fb-200d-2642":0,"1f6b4-1f3fc-200d-2642":0,"1f6b4-1f3fd-200d-2642":0,"1f6b4-1f3fe-200d-2642":0,"1f6b4-1f3ff-200d-2642":0,"1f6b4-1f3fb":0,"1f6b4-1f3fc":0,"1f6b4-1f3fd":0,"1f6b4-1f3fe":0,"1f6b4-1f3ff":0,"1f6b5-1f3fb-200d-2640":0,"1f6b5-1f3fc-200d-2640":0,"1f6b5-1f3fd-200d-2640":0,"1f6b5-1f3fe-200d-2640":0,"1f6b5-1f3ff-200d-2640":0,"1f6b5-1f3fb-200d-2642":0,"1f6b5-1f3fc-200d-2642":0,"1f6b5-1f3fd-200d-2642":0,"1f6b5-1f3fe-200d-2642":0,"1f6b5-1f3ff-200d-2642":0,"1f6b5-1f3fb":0,"1f6b5-1f3fc":0,"1f6b5-1f3fd":0,"1f6b5-1f3fe":0,"1f6b5-1f3ff":0,"1f6b6-1f3fb-200d-2640":0,"1f6b6-1f3fc-200d-2640":0,"1f6b6-1f3fd-200d-2640":0,"1f6b6-1f3fe-200d-2640":0,"1f6b6-1f3ff-200d-2640":0,"1f6b6-1f3fb-200d-2642":0,"1f6b6-1f3fc-200d-2642":0,"1f6b6-1f3fd-200d-2642":0,"1f6b6-1f3fe-200d-2642":0,"1f6b6-1f3ff-200d-2642":0,"1f6b6-1f3fb":0,"1f6b6-1f3fc":0,"1f6b6-1f3fd":0,"1f6b6-1f3fe":0,"1f6b6-1f3ff":0,"1f6c0-1f3fb":0,"1f6c0-1f3fc":0,"1f6c0-1f3fd":0,"1f6c0-1f3fe":0,"1f6c0-1f3ff":0,"1f6cc-1f3fb":0,"1f6cc-1f3fc":0,"1f6cc-1f3fd":0,"1f6cc-1f3fe":0,"1f6cc-1f3ff":0,"1f90c-1f3fb":0,"1f90c-1f3fc":0,"1f90c-1f3fd":0,"1f90c-1f3fe":0,"1f90c-1f3ff":0,"1f90f-1f3fb":0,"1f90f-1f3fc":0,"1f90f-1f3fd":0,"1f90f-1f3fe":0,"1f90f-1f3ff":0,"1f918-1f3fb":0,"1f918-1f3fc":0,"1f918-1f3fd":0,"1f918-1f3fe":0,"1f918-1f3ff":0,"1f919-1f3fb":0,"1f919-1f3fc":0,"1f919-1f3fd":0,"1f919-1f3fe":0,"1f919-1f3ff":0,"1f91a-1f3fb":0,"1f91a-1f3fc":0,"1f91a-1f3fd":0,"1f91a-1f3fe":0,"1f91a-1f3ff":0,"1f91b-1f3fb":0,"1f91b-1f3fc":0,"1f91b-1f3fd":0,"1f91b-1f3fe":0,"1f91b-1f3ff":0,"1f91c-1f3fb":0,"1f91c-1f3fc":0,"1f91c-1f3fd":0,"1f91c-1f3fe":0,"1f91c-1f3ff":0,"1f91d-1f3fb":0,"1f91d-1f3fc":0,"1f91d-1f3fd":0,"1f91d-1f3fe":0,"1f91d-1f3ff":0,"1f91e-1f3fb":0,"1f91e-1f3fc":0,"1f91e-1f3fd":0,"1f91e-1f3fe":0,"1f91e-1f3ff":0,"1f91f-1f3fb":0,"1f91f-1f3fc":0,"1f91f-1f3fd":0,"1f91f-1f3fe":0,"1f91f-1f3ff":0,"1f926-1f3fb-200d-2640":0,"1f926-1f3fc-200d-2640":0,"1f926-1f3fd-200d-2640":0,"1f926-1f3fe-200d-2640":0,"1f926-1f3ff-200d-2640":0,"1f926-1f3fb-200d-2642":0,"1f926-1f3fc-200d-2642":0,"1f926-1f3fd-200d-2642":0,"1f926-1f3fe-200d-2642":0,"1f926-1f3ff-200d-2642":0,"1f926-1f3fb":0,"1f926-1f3fc":0,"1f926-1f3fd":0,"1f926-1f3fe":0,"1f926-1f3ff":0,"1f930-1f3fb":0,"1f930-1f3fc":0,"1f930-1f3fd":0,"1f930-1f3fe":0,"1f930-1f3ff":0,"1f931-1f3fb":0,"1f931-1f3fc":0,"1f931-1f3fd":0,"1f931-1f3fe":0,"1f931-1f3ff":0,"1f932-1f3fb":0,"1f932-1f3fc":0,"1f932-1f3fd":0,"1f932-1f3fe":0,"1f932-1f3ff":0,"1f933-1f3fb":0,"1f933-1f3fc":0,"1f933-1f3fd":0,"1f933-1f3fe":0,"1f933-1f3ff":0,"1f934-1f3fb":0,"1f934-1f3fc":0,"1f934-1f3fd":0,"1f934-1f3fe":0,"1f934-1f3ff":0,"1f935-1f3fb-200d-2640":0,"1f935-1f3fc-200d-2640":0,"1f935-1f3fd-200d-2640":0,"1f935-1f3fe-200d-2640":0,"1f935-1f3ff-200d-2640":0,"1f935-1f3fb-200d-2642":0,"1f935-1f3fc-200d-2642":0,"1f935-1f3fd-200d-2642":0,"1f935-1f3fe-200d-2642":0,"1f935-1f3ff-200d-2642":0,"1f935-1f3fb":0,"1f935-1f3fc":0,"1f935-1f3fd":0,"1f935-1f3fe":0,"1f935-1f3ff":0,"1f936-1f3fb":0,"1f936-1f3fc":0,"1f936-1f3fd":0,"1f936-1f3fe":0,"1f936-1f3ff":0,"1f937-1f3fb-200d-2640":0,"1f937-1f3fc-200d-2640":0,"1f937-1f3fd-200d-2640":0,"1f937-1f3fe-200d-2640":0,"1f937-1f3ff-200d-2640":0,"1f937-1f3fb-200d-2642":0,"1f937-1f3fc-200d-2642":0,"1f937-1f3fd-200d-2642":0,"1f937-1f3fe-200d-2642":0,"1f937-1f3ff-200d-2642":0,"1f937-1f3fb":0,"1f937-1f3fc":0,"1f937-1f3fd":0,"1f937-1f3fe":0,"1f937-1f3ff":0,"1f938-1f3fb-200d-2640":0,"1f938-1f3fc-200d-2640":0,"1f938-1f3fd-200d-2640":0,"1f938-1f3fe-200d-2640":0,"1f938-1f3ff-200d-2640":0,"1f938-1f3fb-200d-2642":0,"1f938-1f3fc-200d-2642":0,"1f938-1f3fd-200d-2642":0,"1f938-1f3fe-200d-2642":0,"1f938-1f3ff-200d-2642":0,"1f938-1f3fb":0,"1f938-1f3fc":0,"1f938-1f3fd":0,"1f938-1f3fe":0,"1f938-1f3ff":0,"1f939-1f3fb-200d-2640":0,"1f939-1f3fc-200d-2640":0,"1f939-1f3fd-200d-2640":0,"1f939-1f3fe-200d-2640":0,"1f939-1f3ff-200d-2640":0,"1f939-1f3fb-200d-2642":0,"1f939-1f3fc-200d-2642":0,"1f939-1f3fd-200d-2642":0,"1f939-1f3fe-200d-2642":0,"1f939-1f3ff-200d-2642":0,"1f939-1f3fb":0,"1f939-1f3fc":0,"1f939-1f3fd":0,"1f939-1f3fe":0,"1f939-1f3ff":0,"1f93d-1f3fb-200d-2640":0,"1f93d-1f3fc-200d-2640":0,"1f93d-1f3fd-200d-2640":0,"1f93d-1f3fe-200d-2640":0,"1f93d-1f3ff-200d-2640":0,"1f93d-1f3fb-200d-2642":0,"1f93d-1f3fc-200d-2642":0,"1f93d-1f3fd-200d-2642":0,"1f93d-1f3fe-200d-2642":0,"1f93d-1f3ff-200d-2642":0,"1f93d-1f3fb":0,"1f93d-1f3fc":0,"1f93d-1f3fd":0,"1f93d-1f3fe":0,"1f93d-1f3ff":0,"1f93e-1f3fb-200d-2640":0,"1f93e-1f3fc-200d-2640":0,"1f93e-1f3fd-200d-2640":0,"1f93e-1f3fe-200d-2640":0,"1f93e-1f3ff-200d-2640":0,"1f93e-1f3fb-200d-2642":0,"1f93e-1f3fc-200d-2642":0,"1f93e-1f3fd-200d-2642":0,"1f93e-1f3fe-200d-2642":0,"1f93e-1f3ff-200d-2642":0,"1f93e-1f3fb":0,"1f93e-1f3fc":0,"1f93e-1f3fd":0,"1f93e-1f3fe":0,"1f93e-1f3ff":0,"1f977-1f3fb":0,"1f977-1f3fc":0,"1f977-1f3fd":0,"1f977-1f3fe":0,"1f977-1f3ff":0,"1f9b5-1f3fb":0,"1f9b5-1f3fc":0,"1f9b5-1f3fd":0,"1f9b5-1f3fe":0,"1f9b5-1f3ff":0,"1f9b6-1f3fb":0,"1f9b6-1f3fc":0,"1f9b6-1f3fd":0,"1f9b6-1f3fe":0,"1f9b6-1f3ff":0,"1f9b8-1f3fb-200d-2640":0,"1f9b8-1f3fc-200d-2640":0,"1f9b8-1f3fd-200d-2640":0,"1f9b8-1f3fe-200d-2640":0,"1f9b8-1f3ff-200d-2640":0,"1f9b8-1f3fb-200d-2642":0,"1f9b8-1f3fc-200d-2642":0,"1f9b8-1f3fd-200d-2642":0,"1f9b8-1f3fe-200d-2642":0,"1f9b8-1f3ff-200d-2642":0,"1f9b8-1f3fb":0,"1f9b8-1f3fc":0,"1f9b8-1f3fd":0,"1f9b8-1f3fe":0,"1f9b8-1f3ff":0,"1f9b9-1f3fb-200d-2640":0,"1f9b9-1f3fc-200d-2640":0,"1f9b9-1f3fd-200d-2640":0,"1f9b9-1f3fe-200d-2640":0,"1f9b9-1f3ff-200d-2640":0,"1f9b9-1f3fb-200d-2642":0,"1f9b9-1f3fc-200d-2642":0,"1f9b9-1f3fd-200d-2642":0,"1f9b9-1f3fe-200d-2642":0,"1f9b9-1f3ff-200d-2642":0,"1f9b9-1f3fb":0,"1f9b9-1f3fc":0,"1f9b9-1f3fd":0,"1f9b9-1f3fe":0,"1f9b9-1f3ff":0,"1f9bb-1f3fb":0,"1f9bb-1f3fc":0,"1f9bb-1f3fd":0,"1f9bb-1f3fe":0,"1f9bb-1f3ff":0,"1f9cd-1f3fb-200d-2640":0,"1f9cd-1f3fc-200d-2640":0,"1f9cd-1f3fd-200d-2640":0,"1f9cd-1f3fe-200d-2640":0,"1f9cd-1f3ff-200d-2640":0,"1f9cd-1f3fb-200d-2642":0,"1f9cd-1f3fc-200d-2642":0,"1f9cd-1f3fd-200d-2642":0,"1f9cd-1f3fe-200d-2642":0,"1f9cd-1f3ff-200d-2642":0,"1f9cd-1f3fb":0,"1f9cd-1f3fc":0,"1f9cd-1f3fd":0,"1f9cd-1f3fe":0,"1f9cd-1f3ff":0,"1f9ce-1f3fb-200d-2640":0,"1f9ce-1f3fc-200d-2640":0,"1f9ce-1f3fd-200d-2640":0,"1f9ce-1f3fe-200d-2640":0,"1f9ce-1f3ff-200d-2640":0,"1f9ce-1f3fb-200d-2642":0,"1f9ce-1f3fc-200d-2642":0,"1f9ce-1f3fd-200d-2642":0,"1f9ce-1f3fe-200d-2642":0,"1f9ce-1f3ff-200d-2642":0,"1f9ce-1f3fb":0,"1f9ce-1f3fc":0,"1f9ce-1f3fd":0,"1f9ce-1f3fe":0,"1f9ce-1f3ff":0,"1f9cf-1f3fb-200d-2640":0,"1f9cf-1f3fc-200d-2640":0,"1f9cf-1f3fd-200d-2640":0,"1f9cf-1f3fe-200d-2640":0,"1f9cf-1f3ff-200d-2640":0,"1f9cf-1f3fb-200d-2642":0,"1f9cf-1f3fc-200d-2642":0,"1f9cf-1f3fd-200d-2642":0,"1f9cf-1f3fe-200d-2642":0,"1f9cf-1f3ff-200d-2642":0,"1f9cf-1f3fb":0,"1f9cf-1f3fc":0,"1f9cf-1f3fd":0,"1f9cf-1f3fe":0,"1f9cf-1f3ff":0,"1f9d1-1f3fb-200d-1f33e":0,"1f9d1-1f3fc-200d-1f33e":0,"1f9d1-1f3fd-200d-1f33e":0,"1f9d1-1f3fe-200d-1f33e":0,"1f9d1-1f3ff-200d-1f33e":0,"1f9d1-1f3fb-200d-1f373":0,"1f9d1-1f3fc-200d-1f373":0,"1f9d1-1f3fd-200d-1f373":0,"1f9d1-1f3fe-200d-1f373":0,"1f9d1-1f3ff-200d-1f373":0,"1f9d1-1f3fb-200d-1f37c":0,"1f9d1-1f3fc-200d-1f37c":0,"1f9d1-1f3fd-200d-1f37c":0,"1f9d1-1f3fe-200d-1f37c":0,"1f9d1-1f3ff-200d-1f37c":0,"1f9d1-1f3fb-200d-1f384":0,"1f9d1-1f3fc-200d-1f384":0,"1f9d1-1f3fd-200d-1f384":0,"1f9d1-1f3fe-200d-1f384":0,"1f9d1-1f3ff-200d-1f384":0,"1f9d1-1f3fb-200d-1f393":0,"1f9d1-1f3fc-200d-1f393":0,"1f9d1-1f3fd-200d-1f393":0,"1f9d1-1f3fe-200d-1f393":0,"1f9d1-1f3ff-200d-1f393":0,"1f9d1-1f3fb-200d-1f3a4":0,"1f9d1-1f3fc-200d-1f3a4":0,"1f9d1-1f3fd-200d-1f3a4":0,"1f9d1-1f3fe-200d-1f3a4":0,"1f9d1-1f3ff-200d-1f3a4":0,"1f9d1-1f3fb-200d-1f3a8":0,"1f9d1-1f3fc-200d-1f3a8":0,"1f9d1-1f3fd-200d-1f3a8":0,"1f9d1-1f3fe-200d-1f3a8":0,"1f9d1-1f3ff-200d-1f3a8":0,"1f9d1-1f3fb-200d-1f3eb":0,"1f9d1-1f3fc-200d-1f3eb":0,"1f9d1-1f3fd-200d-1f3eb":0,"1f9d1-1f3fe-200d-1f3eb":0,"1f9d1-1f3ff-200d-1f3eb":0,"1f9d1-1f3fb-200d-1f3ed":0,"1f9d1-1f3fc-200d-1f3ed":0,"1f9d1-1f3fd-200d-1f3ed":0,"1f9d1-1f3fe-200d-1f3ed":0,"1f9d1-1f3ff-200d-1f3ed":0,"1f9d1-1f3fb-200d-1f4bb":0,"1f9d1-1f3fc-200d-1f4bb":0,"1f9d1-1f3fd-200d-1f4bb":0,"1f9d1-1f3fe-200d-1f4bb":0,"1f9d1-1f3ff-200d-1f4bb":0,"1f9d1-1f3fb-200d-1f4bc":0,"1f9d1-1f3fc-200d-1f4bc":0,"1f9d1-1f3fd-200d-1f4bc":0,"1f9d1-1f3fe-200d-1f4bc":0,"1f9d1-1f3ff-200d-1f4bc":0,"1f9d1-1f3fb-200d-1f527":0,"1f9d1-1f3fc-200d-1f527":0,"1f9d1-1f3fd-200d-1f527":0,"1f9d1-1f3fe-200d-1f527":0,"1f9d1-1f3ff-200d-1f527":0,"1f9d1-1f3fb-200d-1f52c":0,"1f9d1-1f3fc-200d-1f52c":0,"1f9d1-1f3fd-200d-1f52c":0,"1f9d1-1f3fe-200d-1f52c":0,"1f9d1-1f3ff-200d-1f52c":0,"1f9d1-1f3fb-200d-1f680":0,"1f9d1-1f3fc-200d-1f680":0,"1f9d1-1f3fd-200d-1f680":0,"1f9d1-1f3fe-200d-1f680":0,"1f9d1-1f3ff-200d-1f680":0,"1f9d1-1f3fb-200d-1f692":0,"1f9d1-1f3fc-200d-1f692":0,"1f9d1-1f3fd-200d-1f692":0,"1f9d1-1f3fe-200d-1f692":0,"1f9d1-1f3ff-200d-1f692":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fb-200d-1f9af":0,"1f9d1-1f3fc-200d-1f9af":0,"1f9d1-1f3fd-200d-1f9af":0,"1f9d1-1f3fe-200d-1f9af":0,"1f9d1-1f3ff-200d-1f9af":0,"1f9d1-1f3fb-200d-1f9b0":0,"1f9d1-1f3fc-200d-1f9b0":0,"1f9d1-1f3fd-200d-1f9b0":0,"1f9d1-1f3fe-200d-1f9b0":0,"1f9d1-1f3ff-200d-1f9b0":0,"1f9d1-1f3fb-200d-1f9b1":0,"1f9d1-1f3fc-200d-1f9b1":0,"1f9d1-1f3fd-200d-1f9b1":0,"1f9d1-1f3fe-200d-1f9b1":0,"1f9d1-1f3ff-200d-1f9b1":0,"1f9d1-1f3fb-200d-1f9b2":0,"1f9d1-1f3fc-200d-1f9b2":0,"1f9d1-1f3fd-200d-1f9b2":0,"1f9d1-1f3fe-200d-1f9b2":0,"1f9d1-1f3ff-200d-1f9b2":0,"1f9d1-1f3fb-200d-1f9b3":0,"1f9d1-1f3fc-200d-1f9b3":0,"1f9d1-1f3fd-200d-1f9b3":0,"1f9d1-1f3fe-200d-1f9b3":0,"1f9d1-1f3ff-200d-1f9b3":0,"1f9d1-1f3fb-200d-1f9bc":0,"1f9d1-1f3fc-200d-1f9bc":0,"1f9d1-1f3fd-200d-1f9bc":0,"1f9d1-1f3fe-200d-1f9bc":0,"1f9d1-1f3ff-200d-1f9bc":0,"1f9d1-1f3fb-200d-1f9bd":0,"1f9d1-1f3fc-200d-1f9bd":0,"1f9d1-1f3fd-200d-1f9bd":0,"1f9d1-1f3fe-200d-1f9bd":0,"1f9d1-1f3ff-200d-1f9bd":0,"1f9d1-1f3fb-200d-2695":0,"1f9d1-1f3fc-200d-2695":0,"1f9d1-1f3fd-200d-2695":0,"1f9d1-1f3fe-200d-2695":0,"1f9d1-1f3ff-200d-2695":0,"1f9d1-1f3fb-200d-2696":0,"1f9d1-1f3fc-200d-2696":0,"1f9d1-1f3fd-200d-2696":0,"1f9d1-1f3fe-200d-2696":0,"1f9d1-1f3ff-200d-2696":0,"1f9d1-1f3fb-200d-2708":0,"1f9d1-1f3fc-200d-2708":0,"1f9d1-1f3fd-200d-2708":0,"1f9d1-1f3fe-200d-2708":0,"1f9d1-1f3ff-200d-2708":0,"1f9d1-1f3fb":0,"1f9d1-1f3fc":0,"1f9d1-1f3fd":0,"1f9d1-1f3fe":0,"1f9d1-1f3ff":0,"1f9d2-1f3fb":0,"1f9d2-1f3fc":0,"1f9d2-1f3fd":0,"1f9d2-1f3fe":0,"1f9d2-1f3ff":0,"1f9d3-1f3fb":0,"1f9d3-1f3fc":0,"1f9d3-1f3fd":0,"1f9d3-1f3fe":0,"1f9d3-1f3ff":0,"1f9d4-1f3fb-200d-2640":0,"1f9d4-1f3fc-200d-2640":0,"1f9d4-1f3fd-200d-2640":0,"1f9d4-1f3fe-200d-2640":0,"1f9d4-1f3ff-200d-2640":0,"1f9d4-1f3fb-200d-2642":0,"1f9d4-1f3fc-200d-2642":0,"1f9d4-1f3fd-200d-2642":0,"1f9d4-1f3fe-200d-2642":0,"1f9d4-1f3ff-200d-2642":0,"1f9d4-1f3fb":0,"1f9d4-1f3fc":0,"1f9d4-1f3fd":0,"1f9d4-1f3fe":0,"1f9d4-1f3ff":0,"1f9d5-1f3fb":0,"1f9d5-1f3fc":0,"1f9d5-1f3fd":0,"1f9d5-1f3fe":0,"1f9d5-1f3ff":0,"1f9d6-1f3fb-200d-2640":0,"1f9d6-1f3fc-200d-2640":0,"1f9d6-1f3fd-200d-2640":0,"1f9d6-1f3fe-200d-2640":0,"1f9d6-1f3ff-200d-2640":0,"1f9d6-1f3fb-200d-2642":0,"1f9d6-1f3fc-200d-2642":0,"1f9d6-1f3fd-200d-2642":0,"1f9d6-1f3fe-200d-2642":0,"1f9d6-1f3ff-200d-2642":0,"1f9d6-1f3fb":0,"1f9d6-1f3fc":0,"1f9d6-1f3fd":0,"1f9d6-1f3fe":0,"1f9d6-1f3ff":0,"1f9d7-1f3fb-200d-2640":0,"1f9d7-1f3fc-200d-2640":0,"1f9d7-1f3fd-200d-2640":0,"1f9d7-1f3fe-200d-2640":0,"1f9d7-1f3ff-200d-2640":0,"1f9d7-1f3fb-200d-2642":0,"1f9d7-1f3fc-200d-2642":0,"1f9d7-1f3fd-200d-2642":0,"1f9d7-1f3fe-200d-2642":0,"1f9d7-1f3ff-200d-2642":0,"1f9d7-1f3fb":0,"1f9d7-1f3fc":0,"1f9d7-1f3fd":0,"1f9d7-1f3fe":0,"1f9d7-1f3ff":0,"1f9d8-1f3fb-200d-2640":0,"1f9d8-1f3fc-200d-2640":0,"1f9d8-1f3fd-200d-2640":0,"1f9d8-1f3fe-200d-2640":0,"1f9d8-1f3ff-200d-2640":0,"1f9d8-1f3fb-200d-2642":0,"1f9d8-1f3fc-200d-2642":0,"1f9d8-1f3fd-200d-2642":0,"1f9d8-1f3fe-200d-2642":0,"1f9d8-1f3ff-200d-2642":0,"1f9d8-1f3fb":0,"1f9d8-1f3fc":0,"1f9d8-1f3fd":0,"1f9d8-1f3fe":0,"1f9d8-1f3ff":0,"1f9d9-1f3fb-200d-2640":0,"1f9d9-1f3fc-200d-2640":0,"1f9d9-1f3fd-200d-2640":0,"1f9d9-1f3fe-200d-2640":0,"1f9d9-1f3ff-200d-2640":0,"1f9d9-1f3fb-200d-2642":0,"1f9d9-1f3fc-200d-2642":0,"1f9d9-1f3fd-200d-2642":0,"1f9d9-1f3fe-200d-2642":0,"1f9d9-1f3ff-200d-2642":0,"1f9d9-1f3fb":0,"1f9d9-1f3fc":0,"1f9d9-1f3fd":0,"1f9d9-1f3fe":0,"1f9d9-1f3ff":0,"1f9da-1f3fb-200d-2640":0,"1f9da-1f3fc-200d-2640":0,"1f9da-1f3fd-200d-2640":0,"1f9da-1f3fe-200d-2640":0,"1f9da-1f3ff-200d-2640":0,"1f9da-1f3fb-200d-2642":0,"1f9da-1f3fc-200d-2642":0,"1f9da-1f3fd-200d-2642":0,"1f9da-1f3fe-200d-2642":0,"1f9da-1f3ff-200d-2642":0,"1f9da-1f3fb":0,"1f9da-1f3fc":0,"1f9da-1f3fd":0,"1f9da-1f3fe":0,"1f9da-1f3ff":0,"1f9db-1f3fb-200d-2640":0,"1f9db-1f3fc-200d-2640":0,"1f9db-1f3fd-200d-2640":0,"1f9db-1f3fe-200d-2640":0,"1f9db-1f3ff-200d-2640":0,"1f9db-1f3fb-200d-2642":0,"1f9db-1f3fc-200d-2642":0,"1f9db-1f3fd-200d-2642":0,"1f9db-1f3fe-200d-2642":0,"1f9db-1f3ff-200d-2642":0,"1f9db-1f3fb":0,"1f9db-1f3fc":0,"1f9db-1f3fd":0,"1f9db-1f3fe":0,"1f9db-1f3ff":0,"1f9dc-1f3fb-200d-2640":0,"1f9dc-1f3fc-200d-2640":0,"1f9dc-1f3fd-200d-2640":0,"1f9dc-1f3fe-200d-2640":0,"1f9dc-1f3ff-200d-2640":0,"1f9dc-1f3fb-200d-2642":0,"1f9dc-1f3fc-200d-2642":0,"1f9dc-1f3fd-200d-2642":0,"1f9dc-1f3fe-200d-2642":0,"1f9dc-1f3ff-200d-2642":0,"1f9dc-1f3fb":0,"1f9dc-1f3fc":0,"1f9dc-1f3fd":0,"1f9dc-1f3fe":0,"1f9dc-1f3ff":0,"1f9dd-1f3fb-200d-2640":0,"1f9dd-1f3fc-200d-2640":0,"1f9dd-1f3fd-200d-2640":0,"1f9dd-1f3fe-200d-2640":0,"1f9dd-1f3ff-200d-2640":0,"1f9dd-1f3fb-200d-2642":0,"1f9dd-1f3fc-200d-2642":0,"1f9dd-1f3fd-200d-2642":0,"1f9dd-1f3fe-200d-2642":0,"1f9dd-1f3ff-200d-2642":0,"1f9dd-1f3fb":0,"1f9dd-1f3fc":0,"1f9dd-1f3fd":0,"1f9dd-1f3fe":0,"1f9dd-1f3ff":0,"261d-1f3fb":0,"261d-1f3fc":0,"261d-1f3fd":0,"261d-1f3fe":0,"261d-1f3ff":0,"26f9-1f3fb-200d-2640":0,"26f9-1f3fc-200d-2640":0,"26f9-1f3fd-200d-2640":0,"26f9-1f3fe-200d-2640":0,"26f9-1f3ff-200d-2640":0,"26f9-1f3fb-200d-2642":0,"26f9-1f3fc-200d-2642":0,"26f9-1f3fd-200d-2642":0,"26f9-1f3fe-200d-2642":0,"26f9-1f3ff-200d-2642":0,"26f9-1f3fb":0,"26f9-1f3fc":0,"26f9-1f3fd":0,"26f9-1f3fe":0,"26f9-1f3ff":0,"270a-1f3fb":0,"270a-1f3fc":0,"270a-1f3fd":0,"270a-1f3fe":0,"270a-1f3ff":0,"270b-1f3fb":0,"270b-1f3fc":0,"270b-1f3fd":0,"270b-1f3fe":0,"270b-1f3ff":0,"270c-1f3fb":0,"270c-1f3fc":0,"270c-1f3fd":0,"270c-1f3fe":0,"270c-1f3ff":0,"270d-1f3fb":0,"270d-1f3fc":0,"270d-1f3fd":0,"270d-1f3fe":0,"270d-1f3ff":0}},n=s[""];for(const e in s)e&&Object.assign(n,s[e]);const a=n},3189:(e,t,i)=>{"use strict";i.d(t,{Bf:()=>n,U9:()=>a,bt:()=>s});const s='Roboto, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif',n="16px",a="400"},356:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s="undefined"!=typeof ImageBitmap},5296:(e,t,i)=>{"use strict";i.d(t,{Kx:()=>r,cK:()=>d,jt:()=>l});var s=i(3035),n=i(3725);const a=new Map;function o(e){return a.get(e)}function r(e){const t=o(e);t&&(t.isCancelled=!0,t.deferred.resolve())}function d(e,t,i){return i||(i=function(e){r(e);const t={isCancelled:!1,deferred:(0,n.Z)()};return a.set(e,t),t.deferred.then((()=>{o(e)===t&&a.delete(e)})),t}(t)),(0,s.T2)((()=>{i.isCancelled||(e()?d(e,t,i):i.deferred.resolve())})),i.deferred}function l(e){(0,s.T2)((()=>{e()&&l(e)}))}},2353:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function n(e,t){return s(this,void 0,void 0,(function*(){const i=e.map(((e,i,n)=>s(this,void 0,void 0,(function*(){if(yield t(e,i,n))return e}))));return(yield Promise.all(i)).filter(Boolean)}))}},8847:(e,t,i)=>{"use strict";function s(e,t){const i=[];let s=-1;for(;-1!==(s=e.findIndex(t));)i.push(e.splice(s,1)[0]);return i}i.d(t,{Z:()=>s})},5916:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e){this.assets=e,this.tempId=0}playSound(e,t=!1){++this.tempId,this.assetName=e;try{const i=this.createAudio();i.autoplay=!0,i.src="assets/audio/"+e,i.loop=t,i.play()}catch(t){console.error("playSound",e,t)}}playSoundIfDifferent(e,t){this.assetName!==e&&this.playSound(e,t)}createAudio(){let{audio:e}=this;return e||(e=this.audio=new Audio,e.play(),e)}stopSound(){this.audio&&this.audio.pause()}cancelDelayedPlay(){++this.tempId}playSoundWithTimeout(e,t,i){const s=++this.tempId;setTimeout((()=>{this.tempId===s&&this.playSound(e,t)}),i)}}},8678:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3019);function n(e){return(0,s.Z)(e,"readAsDataURL")}},6705:(e,t,i)=>{"use strict";i.d(t,{Z:()=>m});var s=i(3725),n=i(8594),a=i(3035);const o=[];let r=!1;function d(e,t="push"){if(!e.items.length)return Promise.resolve([]);const i=e.promise=(0,s.Z)();return o[t](e),l(),i}function l(){r||function(e){if(!e.items.length)return e.promise.resolve([]),Promise.resolve([]);const t=e.items.slice(),i=[];return new Promise(((s,o)=>{const r=()=>{return d=this,l=void 0,h=function*(){const d=performance.now();do{yield(0,n.e9)();const s=e.process.apply(e.context,t.shift());let a;if(s instanceof Promise)try{a=yield s}catch(e){return void o(e)}else a=s;i.push(a)}while(t.length>0&&performance.now()-d<6);t.length>0?(0,a.T2)(r):s(i)},new((c=void 0)||(c=Promise))((function(e,t){function i(e){try{n(h.next(e))}catch(e){t(e)}}function s(e){try{n(h.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof c?n:new c((function(e){e(n)}))).then(i,s)}n((h=h.apply(d,l||[])).next())}));var d,l,c,h};(0,a.T2)(r)})).then(e.promise.resolve,e.promise.reject)}(o.shift()).finally((()=>{r=!1,o.length&&l()}))}var c=i(6663);let h,u;function p(e,t,i,s=document.createElement("canvas")){s.width=e.width,s.height=e.height;const n=s.getContext("2d",{alpha:!1});return c.Z?(n.filter=`blur(${t}px)`,n.drawImage(e,2*-t,2*-t,s.width+4*t,s.height+4*t)):(n.drawImage(e,0,0),u(n,0,0,s.width,s.height,t,i)),s}h=c.Z?Promise.resolve():i.e(77).then(i.bind(i,7077)).then((e=>{u=e.default}));const f=new Map;function m(e,t=2,i=2){if(!e)throw"no dataUri for blur: "+e;f.size>150&&f.clear();const s=document.createElement("canvas");s.className="canvas-thumbnail";let n=f.get(e);if(n)s.width=n.canvas.width,s.height=n.canvas.height,n.promise.then((()=>{s.getContext("2d").drawImage(n.canvas,0,0,s.width,s.height)}));else{const a=new Promise((n=>{h.then((()=>{const a=new Image;a.onload=()=>{d({items:[[a,t,i,s]],context:null,process:p},"unshift").then((()=>{n()}))},a.src=e}))}));f.set(e,n={canvas:s,promise:a})}return Object.assign(Object.assign({},n),{canvas:s})}},4059:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,o:()=>d});var s=i(4762),n=i(3306),a=i(9818);const o=(0,n.Z)("ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00"),r=(0,n.Z)("ffd9");function d(e){const t="base64,",i=e.slice(e.indexOf(t)+t.length),s=[...atob(i)].map((e=>e.charCodeAt(0)));return new Uint8Array(s)}function l(e,t=!1){let i,n;t||1!==e[0]?i=(0,a.Z)(e):(i=new Uint8Array(o.concat(Array.from(e.slice(3)),r)),i[164]=e[1],i[166]=e[2]),n=t?s.IS_SAFARI?"image/png":"image/webp":"image/jpeg";const d=function(e,t="image/jpeg"){return`data:${t};base64,${btoa(String.fromCharCode(...e))}`}(i,n);return d}},9897:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(410),n=i(9405);function a(e,t,i,s,a=!0){if(ei/s?r=t*i/e|0:(o=e*s/t|0,o>i&&(r=r*i/o|0,o=i)),a&&o>=e&&r>=t&&(o=e,r=t),(0,n.C)(o,r)}s.GO.calcImageInBox=a},8097:(e,t,i)=>{"use strict";let s;function n(e,t){if(!s){const e=document.createElement("canvas");s=e.getContext("2d",{alpha:!1})}return s.font!==t&&(s.font=t),s.measureText(e).width}i.d(t,{Z:()=>n})},7814:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(356);function n(e){return new Promise((t=>{return i=this,n=void 0,o=function*(){var i,n,a;const o=document.createElement("canvas"),r=null!==(i=e.size)&&void 0!==i?i:e.mediaSize.aspectFitted(e.boxSize),d=window.devicePixelRatio&&1;o.width=r.width*d,o.height=r.height*d;const l=o.getContext("2d");let c;c=s.Z?yield createImageBitmap(e.media,{resizeWidth:r.width,resizeHeight:r.height}):e.media,l.drawImage(c,0,0,o.width,o.height),s.Z&&(null==c||c.close());const h=null!==(n=e.mimeType)&&void 0!==n?n:"image/jpeg",u=null!==(a=e.quality)&&void 0!==a?a:1;if(e.toDataURL){const e=o.toDataURL(h,u);t({url:e,size:r})}else o.toBlob((e=>{t({blob:e,size:r})}),h,u)},new((a=void 0)||(a=Promise))((function(e,t){function s(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}d((o=o.apply(i,n||[])).next())}));var i,n,a,o}))}},467:(e,t,i)=>{"use strict";i.d(t,{ST:()=>r,ZP:()=>d,gV:()=>l});var s=i(5813);const n=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,a=/^\s+|\s$/g,o={й:"q",ц:"w",у:"e",к:"r",е:"t",н:"y",г:"u",ш:"i",щ:"o",з:"p",х:"[",ъ:"]",ф:"a",ы:"s",в:"d",а:"f",п:"g",р:"h",о:"j",л:"k",д:"l",ж:";",э:"'",я:"z",ч:"x",с:"c",м:"v",и:"b",т:"n",ь:"m",б:",",ю:".",".":"/"};function r(e){return e.replace(n,"").replace(a,"")}function d(e,t=!0){return l(e,{clearBadChars:!0,latinize:t,ignoreCase:!0})}function l(e,t={}){const i=t.includeTag&&"%"===e.charAt(0),n=e;return t.clearBadChars&&(e=r(e)),t.latinize&&(e=function(e){return e.replace(/[^A-Za-z0-9]/g,(e=>{const t=s.Z[e];return null!=t?t:e}))}(e)),t.ignoreCase&&(e=e.toLowerCase()),i&&(e="%"+e),t.latinize&&(e+=""+function(e){return e.toLowerCase().replace(/[\wа-я]/g,(e=>{const t=o[e];return null!=t?t:e}))}(n)),e}},2166:(e,t,i)=>{"use strict";function s(e){var t=document.createElement("textarea");t.value=e,t.style.top="0",t.style.left="0",t.style.position="fixed",document.body.appendChild(t),t.focus(),t.select();try{document.execCommand("copy")}catch(e){}document.body.removeChild(t)}function n(e){navigator.clipboard?navigator.clipboard.writeText(e).catch((t=>{console.error("clipboard error",t),s(e)})):s(e)}i.d(t,{T:()=>n})},3416:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(5432),n=i(4755),a=i(2296);class o extends a.Z{constructor(){super("menu",!0),this.onMouseMove=e=>{const t=this.element.getBoundingClientRect(),{clientX:i,clientY:s}=e,n=i>=t.right?i-t.right:t.left-i,a=s>=t.bottom?s-t.bottom:t.top-s;(n>=100||a>=100)&&this.close()},n.Z.addEventListener("resize",(()=>{this.element&&this.close()}))}isOpened(){return!!this.element}close(){this.element&&(this.element.classList.remove("active"),this.element.parentElement.classList.remove("menu-open")),super.close(),s.Z||window.removeEventListener("mousemove",this.onMouseMove)}openBtnMenu(e,t){super.open(e),this.element.classList.add("active","was-open"),this.element.parentElement.classList.add("menu-open"),t&&this.addEventListener("toggle",t,{once:!0}),s.Z||window.addEventListener("mousemove",this.onMouseMove)}}const r=new o},632:(e,t,i)=>{"use strict";i.d(t,{OD:()=>h,fl:()=>S,mr:()=>u,rz:()=>c,s2:()=>r,xE:()=>p,zM:()=>l});var s=i(410),n=i(2325);const a=["January","February","March","April","May","June","July","August","September","October","November","December"],o=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],r=86400,d=e=>{const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),i=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-i);const s=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-s.getTime())/r+1)/7)};function l(e){const t=new Date,i=t.getTime()/1e3|0,s=e.getTime()/1e3|0,a={};return i-s{const i=t.monthAsNumber?".":" ",s=("0"+e.getHours()).slice(-2)+":"+("0"+e.getMinutes()).slice(-2)+(t.noSeconds?"":":"+("0"+e.getSeconds()).slice(-2));return(t.leadingZero?("0"+e.getDate()).slice(-2):e.getDate())+i+(t.monthAsNumber?("0"+(e.getMonth()+1)).slice(-2):a[e.getMonth()])+i+e.getFullYear()+(t.noTime?"":", "+s)},f=2013,m=new RegExp("20[0-9]{1,2}"),g=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),v=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),b=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),y=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),w=[31,29,31,30,31,30,31,31,30,31,30,31];function S(e,t){const i=e.trim().toLowerCase();if(i.length<3)return;if(0==="today".indexOf(i)){const e=new Date,i=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(i,s,n),e.setHours(0,0,0);const a=e.getTime();e.setFullYear(i,s,n+1),e.setHours(0,0,0);const o=e.getTime()-1;return void t.push({title:"Today",minDate:a,maxDate:o})}if(0==="yesterday".indexOf(i)){const e=new Date,i=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(i,s,n),e.setHours(0,0,0);const a=e.getTime()-864e5;e.setFullYear(i,s,n+1),e.setHours(0,0,0);const o=e.getTime()-86400001;return void t.push({title:"Yesterday",minDate:a,maxDate:o})}const s=function(e){const t=new Date;if(e.length<=3)return-1;for(let i=0;i<7;i++)if(t.setDate(t.getDate()+1),0===P(t.getTime()).toLowerCase().indexOf(e))return t.getDay();return-1}(i);if(s>=0){const e=new Date,i=e.getTime(),n=s-e.getDay();e.setDate(e.getDate()+n),e.getTime()>i&&e.setTime(e.getTime()-6048e5);const a=e.getFullYear(),o=e.getMonth(),r=e.getDate();e.setFullYear(a,o,r),e.setHours(0,0,0);const d=e.getTime();e.setFullYear(a,o,r+1),e.setHours(0,0,0);const l=e.getTime()-1;return void t.push({title:P(d),minDate:d,maxDate:l})}let n;if(null===(n=b.exec(i)))if(null===(n=y.exec(i)))if(null===(n=m.exec(i))){if(null!==(n=g.exec(i))){const e=n[1],i=n[2],s=k(e);if(s>=0){const e=+i;if(e>0&&e<=31)return void L(t,e-1,s);if(e>=f)return void C(t,s,e)}}if(null!==(n=v.exec(i))){const e=n[1],i=k(n[2]);if(i>=0){const s=+e;if(s>0&&s<=31)return void L(t,s-1,i);s>=f&&C(t,i,s)}}}else{let e=+i;const s=(new Date).getFullYear();if(e=e;i--){const e=new Date;e.setFullYear(i,0,1),e.setHours(0,0,0);const s=e.getTime();e.setFullYear(i+1,0,1),e.setHours(0,0,0);const n=e.getTime()-1;t.push({title:""+i,minDate:s,maxDate:n})}}else if(e<=s){const i=new Date;i.setFullYear(e,0,1),i.setHours(0,0,0);const s=i.getTime();i.setFullYear(e+1,0,1),i.setHours(0,0,0);const n=i.getTime()-1;t.push({title:""+e,minDate:s,maxDate:n})}}else{const e=n[1],i=n[3],s=n[5];if(!n[2]===n[4])return;const a=parseInt(e),o=parseInt(i)-1;let r=parseInt(s);r>=10&&r<=99&&(r+=2e3);const d=(new Date).getFullYear();if(Z(a-1,o)&&r>=f&&r<=d){const e=new Date;e.setFullYear(r,o,a),e.setHours(0,0,0);const i=e.getTime();e.setFullYear(r,o,a+1),e.setHours(0,0,0);const s=e.getTime()-1;return void t.push({title:M(i),minDate:i,maxDate:s})}}else{const e=n[1],i=n[3],s=parseInt(e),a=parseInt(i);if(s>0&&s<=31){if(a>=f&&s<=12)return void C(t,s-1,a);a<=12&&L(t,s-1,a-1)}else s>=f&&a<=12&&C(t,a-1,s)}}function C(e,t,i){const s=(new Date).getFullYear(),n=Date.now();if(i>=f&&i<=s){const s=new Date;s.setFullYear(i,t,1),s.setHours(0,0,0);const a=s.getTime();if(a>n)return;s.setMonth(s.getMonth()+1);const o=s.getTime()-1;e.push({title:E(a),minDate:a,maxDate:o})}}function L(e,t,i){if(Z(t,i)){const n=(new Date).getFullYear(),a=Date.now();for(let o=n;o>=f;o--){if(1===i&&28===t&&((s=o)%4!=0||s%100==0)&&s%400!=0)continue;const r=new Date;r.setFullYear(o,i,t+1),r.setHours(0,0,0);const d=r.getTime();if(d>a)continue;r.setFullYear(o,i,t+2),r.setHours(0,0,0);const l=r.getTime()-1;o===n?e.push({title:I(d),minDate:d,maxDate:l}):e.push({title:M(d),minDate:d,maxDate:l})}}var s}function E(e){const t=new Date(e);return a[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function I(e){const t=new Date(e);return a[t.getMonth()].slice(0,3)+" "+t.getDate()}function M(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function P(e){const t=new Date(e);return o[t.getDay()]}function Z(e,t){return t>=0&&t<12&&e>=0&&e{"use strict";i.d(t,{Z:()=>d});var s=i(2796),n=i(2166),a=i(3910),o=i(2738);const r="https://t.me/";function d(e={}){const t=document.createElement("a");t.classList.add("anchor-copy");let i,d="LinkCopied";if(e.mePath){const s=r+e.mePath;i=t.href=t.innerText=s}if(e.username){const s=r+e.username;t.href=s,i=t.innerText="@"+e.username,d="UsernameCopied"}return(0,o.fc)(t,(e=>{(0,a.Z)(e),(0,n.T)(null!=i?i:t.href),(0,s.bC)({langPackKey:d})})),t}},6976:(e,t,i)=>{"use strict";i.d(t,{E:()=>c,s:()=>l});var s=i(5432),n=i(4762),a=i(3416),o=i(3910);let r=!1,d=0;function l(){d&&clearTimeout(d),d=window.setTimeout((()=>{d=0,r=!1}),400),r=!0}function c({element:e,callback:t,listenerSetter:i,listenerOptions:d}){const l=i?i.add(e):e.addEventListener.bind(e),c=i?i.removeManual.bind(i,e):e.removeEventListener.bind(e);if(n.IS_APPLE&&s.Z||d){let e;const i=Object.assign(Object.assign({},d||{}),{capture:!0}),s=()=>{clearTimeout(e),c("touchmove",s,i),c("touchend",s,i),c("touchcancel",s,i)};l("touchstart",(n=>{n.touches.length>1?s():(l("touchmove",s,i),l("touchend",s,i),l("touchcancel",s,i),e=window.setTimeout((()=>{r?s():(t(n),s(),a.Z.isOpened()&&l("touchend",o.Z,{once:!0}))}),400))}),d)}else l("contextmenu",s.Z?e=>{t(e),a.Z.isOpened()&&l("touchend",o.Z,{once:!0})}:t,d)}},5077:(e,t,i)=>{"use strict";function s(e,t,i,s){const n=e=>{i({x:e.pageX,y:e.pageY,event:e})},a=t=>{document.removeEventListener("mousemove",n),e.addEventListener("mousedown",o,{once:!0}),s&&s({x:t.pageX,y:t.pageY,event:t})},o=i=>{0===i.button?(t({x:i.pageX,y:i.pageY,event:i}),n(i),document.addEventListener("mousemove",n),document.addEventListener("mouseup",a,{once:!0})):e.addEventListener("mousedown",o,{once:!0})};e.addEventListener("mousedown",o,{once:!0});const r=e=>{e.preventDefault(),i({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e})},d=t=>{document.removeEventListener("touchmove",r),e.addEventListener("touchstart",l,{passive:!1,once:!0}),s&&s({x:t.touches[0].clientX,y:t.touches[0].clientY,isTouch:!0,event:t})},l=e=>{t({x:e.touches[0].clientX,y:e.touches[0].clientY,isTouch:!0,event:e}),r(e),document.addEventListener("touchmove",r,{passive:!1}),document.addEventListener("touchend",d,{passive:!1,once:!0})};return e.addEventListener("touchstart",l,{passive:!1,once:!0}),()=>{e.removeEventListener("mousedown",o),document.removeEventListener("mousemove",n),document.removeEventListener("mouseup",a),e.removeEventListener("touchstart",l),document.removeEventListener("touchmove",r),document.removeEventListener("touchend",d)}}i.d(t,{Z:()=>s})},6760:(e,t,i)=>{"use strict";function s(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()}i.d(t,{Z:()=>s})},2738:(e,t,i)=>{"use strict";i.d(t,{EN:()=>r,fc:()=>o,pf:()=>a,tH:()=>d});var s=i(5432),n=i(6669);const a=s.Z?"mousedown":"click";function o(e,t,i={}){const s=i.listenerSetter?i.listenerSetter.add(e):e.addEventListener.bind(e),n=i.listenerSetter?i.listenerSetter.removeManual.bind(i.listenerSetter,e):e.removeEventListener.bind(e);return i.touchMouseDown=!0,s(a,t,i),()=>n(a,t,i)}function r(e,t,i){e.removeEventListener(a,t,i)}function d(e){(0,n.Z)(e,a)}},7529:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(5432),n=i(3241),a=i(5953),o=i(8497);class r extends n.Z{constructor(){super(!1),this.hideControls=(e=!1)=>{if(e)return void(this.hideControlsTimeout||(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3)));clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0;const t=this.element.classList.contains("show-controls");if(!1!==this.controlsLocked){if(this.canHideControls&&!this.canHideControls()||!t||this.controlsLocked)return}else if(!t)return;this.dispatchEvent("toggleControls",!1),this.element.classList.remove("show-controls")},this.showControls=(e=!0)=>{this.hideControlsTimeout?(clearTimeout(this.hideControlsTimeout),this.hideControlsTimeout=0):this.element.classList.contains("show-controls")||!1===this.controlsLocked||(this.dispatchEvent("toggleControls",!0),this.element.classList.add("show-controls")),e&&!this.controlsLocked&&(this.hideControlsTimeout=window.setTimeout(this.hideControls,3e3))},this.toggleControls=e=>{const t=this.element.classList.contains("show-controls");if(void 0===e)t?this.hideControls():this.showControls();else{if(e===t)return;!1===e?this.hideControls():this.showControls()}},this.hideControlsTimeout=0}setup(e){(0,a.Z)(this,e);const{listenerSetter:t,element:i}=this;s.Z?t.add(i)("click",(e=>{this.ignoreClickClassName&&(0,o.Z)(e.target,this.ignoreClickClassName)||this.toggleControls()})):(t.add(i)("mousemove",(()=>{this.showControls()})),t.add(i)("mouseenter",(()=>{this.showControls(!1)})),t.add(i)("mouseleave",(e=>{e.relatedTarget&&this.showOnLeaveToClassName&&(0,o.Z)(e.relatedTarget,this.showOnLeaveToClassName)?this.showControls(!1):this.hideControls()})))}lockControls(e){this.controlsLocked=e,this.element.classList.toggle("disable-hover",!1===e),this.toggleControls(e)}}},4531:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(3003),n=i(2353),a=i(3416),o=i(3699),r=i(3624),d=i(1483),l=i(6976),c=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function h({buttons:e,findElement:t,listenTo:i,appendTo:h,filterButtons:u,onOpen:p,onClose:f,onBeforeOpen:m,listenerSetter:g}){null!=h||(h=document.body),null!=g||(g=new o.Z);const v=new o.Z,b=(0,r.k)();let y;(0,l.E)({element:i,callback:e=>{const s=t?t(e):i;if(!s)return;let n=y;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),n&&n.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0),(()=>{c(this,void 0,void 0,(function*(){yield null==p?void 0:p(s);const t=yield S();if(!t)return;n=t.element;const{cleanup:i,destroy:o}=t;(0,d.Z)(e,n),a.Z.openBtnMenu(n,(()=>{null==f||f(),i(),setTimeout((()=>{o()}),300)}))}))})()},listenerSetter:g});const w=()=>{v.removeAll(),b.clean()},S=()=>c(this,void 0,void 0,(function*(){w(),e.forEach((e=>e.element=void 0));const t=u||(e=>(0,n.Z)(e,(e=>{var t,i;return null===(i=null===(t=null==e?void 0:e.verify)||void 0===t?void 0:t.call(e))||void 0===i||i}))),i=yield t(e);if(!i.length)return;const a=y=yield(0,s.Z)({buttons:i,listenerSetter:v});return a.classList.add("contextmenu"),yield null==m?void 0:m(),h.append(a),{element:a,cleanup:w,destroy:()=>{a.remove()}}}));return{element:y,destroy:()=>{w(),g.removeAll()}}}},3163:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(6787),n=i(4271),a=i(3512),o=i(4531),r=i(8497),d=i(3173),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function c(e){const{listenTo:t,isStickerPack:i,verifyRecent:c,appendTo:h,onOpen:u,onClose:p,onSend:f}=e;let m,g;const v=e=>l(this,void 0,void 0,(function*(){const t=yield a.Z.managers.acknowledged.appStickersManager.getFavedStickersStickers();if(!t.cached)return!1;const i=(yield t.result).some((e=>e.id===g.id));return e?!i:i}));return(0,o.Z)({listenTo:t,appendTo:h,findElement:e=>m=(0,r.Z)(e.target,"media-sticker-wrapper"),onOpen:()=>l(this,void 0,void 0,(function*(){return g=yield a.Z.managers.appDocsManager.getDoc(m.dataset.docId),null==u?void 0:u()})),onClose:p,buttons:[{icon:"stickers",text:"Context.ViewStickerSet",onClick:()=>new s.Z(g.stickerSetInput).show(),verify:()=>!i},{icon:"favourites",text:"AddToFavorites",onClick:()=>a.Z.managers.appStickersManager.faveSticker(g.id,!1),verify:()=>v(!0)},{icon:"favourites",text:"DeleteFromFavorites",onClick:()=>a.Z.managers.appStickersManager.faveSticker(g.id,!0),verify:()=>v(!1)},{icon:"delete",text:"DeleteFromRecent",onClick:()=>a.Z.managers.appStickersManager.saveRecentSticker(g.id,!0),verify:()=>{var e;return null!==(e=null==c?void 0:c(m))&&void 0!==e&&e}},{icon:"mute",text:"Chat.Send.WithoutSound",onClick:()=>(null==f||f(),d.Jo.sendDocId(g.id,!1,!0)),verify:()=>!(!n.ZP.chat.peerId||n.ZP.chat.peerId===a.Z.myId)},{icon:"schedule",text:"Chat.Send.ScheduledMessage",onClick:()=>n.ZP.chat.input.scheduleSending((()=>n.ZP.chat.input.sendMessageWithDocument(g))),verify:()=>!!n.ZP.chat.peerId}]})}},7660:(e,t,i)=>{"use strict";function s(e={}){const t=document.createElement("video");return e.pip||(t.disablePictureInPicture=!0),t.setAttribute("playsinline","true"),t}i.d(t,{Z:()=>s})},8222:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3512);const n=new class{constructor(){this.cache={},s.Z.addEventListener("theme_change",(()=>{this.computedStyle=void 0;const e=this.cache;this.cache={};for(const t in e)this.getProperty(t)}))}getProperty(e){let t=this.cache[e];return t||(this.computedStyle||(this.computedStyle=window.getComputedStyle(document.documentElement)),t=this.computedStyle.getPropertyValue("--"+e).trim(),this.cache[e]=t)}}},6669:(e,t,i)=>{"use strict";function s(e,t){const i=new Event(t,{bubbles:!0,cancelable:!0});e.dispatchEvent(i)}i.d(t,{Z:()=>s})},1544:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4056);function n(e){return Array.from(e.childNodes).map((e=>e.nodeType===e.TEXT_NODE?(0,s.Z)(e.textContent):e.outerHTML)).join("")}},5975:(e,t,i)=>{"use strict";function s(e,t){if(!e)return null;if(e.parentElement===t)return e;for(;e.parentElement;)if((e=e.parentElement).parentElement===t)return e;return null}i.d(t,{Z:()=>s})},8763:(e,t,i)=>{"use strict";function s(e,t){return e.closest(`[${t}]`)}i.d(t,{Z:()=>s})},4668:(e,t,i)=>{"use strict";function s(e,t){return e.closest(t)}i.d(t,{Z:()=>s})},6733:(e,t,i)=>{"use strict";function s(e){e.requestFullscreen?e.requestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen?e.webkitRequestFullscreen():e.msRequestFullscreen&&e.msRequestFullscreen()}function n(){document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen()}function a(e,t,i){const s=i?i.add(e):e.addEventListener.bind(e);"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange".split(" ").forEach((e=>{s(e,t,!1)}))}function o(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement}function r(){return!!o()}i.d(t,{C8:()=>n,Dj:()=>s,Ms:()=>a,W7:()=>o,rB:()=>r})},3299:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n,q:()=>a});var s=i(5975);function n(e,t){const i=document.getSelection(),n=i[t?"anchorNode":"focusNode"],o=i[t?"anchorOffset":"focusOffset"];return(0,s.Z)(n,e)||n===e?Object.assign(Object.assign({},a(e,n,o)),{selection:i}):{selection:i}}function a(e,t,i){if(t===e){const s=e.childNodes,n=s.length;n&&i>=n?i=((t=s[n-1]).textContent||t.alt||"").length:(t=s[i],i=0)}return{node:t,offset:i}}},9041:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d,o:()=>n});var s=i(6854);const n={bold:{match:'[style*="bold"], [style*="font-weight: 700"], [style*="font-weight: 600"], [style*="font-weight:700"], [style*="font-weight:600"], b, strong',entityName:"messageEntityBold"},underline:{match:'[style*="underline"], u, ins',entityName:"messageEntityUnderline"},italic:{match:'[style*="italic"], i, em',entityName:"messageEntityItalic"},monospace:{match:'[style*="monospace"], [face*="monospace"], pre',entityName:"messageEntityCode"},strikethrough:{match:'[style*="line-through"], [style*="strikethrough"], strike, del, s',entityName:"messageEntityStrike"},link:{match:"A:not(.follow)",entityName:"messageEntityTextUrl"},mentionName:{match:"A.follow",entityName:"messageEntityMentionName"},spoiler:{match:'[style*="spoiler"]',entityName:"messageEntitySpoiler"}},a=new Set(["DIV","P","BR","LI","SECTION","H6","H5","H4","H3","H2","H1","TR","OL","UL"]),o=(new Set(["OL","UL"]),new RegExp(s.Z,"g"));function r(e,t,i,s){const a=e.parentElement;for(const e in n){const o=n[e],r=a.closest(o.match+', [contenteditable="true"]');null===(null==r?void 0:r.getAttribute("contenteditable"))&&("messageEntityTextUrl"===o.entityName?i.push({_:o.entityName,url:r.href,offset:s.offset,length:t.length}):"messageEntityMentionName"===o.entityName?i.push({_:o.entityName,offset:s.offset,length:t.length,user_id:r.dataset.follow.toUserId()}):i.push({_:o.entityName,offset:s.offset,length:t.length}))}}function d(e,t,i,s,n,l,c={offset:0}){if(e.nodeType===e.TEXT_NODE){let t=e.nodeValue;return t=t.replace(o,""),t?s===e?i.push(t.substr(0,n)+""+t.substr(n)):i.push(t):s===e&&i.push(""),l&&t.length&&e.parentNode&&r(e,t,l,c),void(c.offset+=t.length)}if(e.nodeType!==e.ELEMENT_NODE)return;const h=s===e,u=a.has(e.tagName);if(u&&(i.length||"BR"===e.tagName))t.push(i.join("")),i.length=0,++c.offset;else{const t=e.dataset.stickerEmoji||e.alt,s=e.dataset.stickerEmoji;t&&l&&r(e,t,l,c),s&&l&&l.push({_:"messageEntityCustomEmoji",document_id:e.dataset.docId,offset:c.offset,length:t.length}),t&&(i.push(t),c.offset+=t.length)}h&&!n&&i.push("");const p=e.matches('[style*="table-cell"], th, td'),f=null==l?void 0:l.length;let m=e.firstChild;for(;m;)d(m,t,i,s,n,l,c),m=m.nextSibling;if(h&&n&&i.push(""),p&&e.nextSibling&&i.length&&(i.push(" "),++c.offset,void 0!==f))for(let e=f,t=l.length;e{"use strict";i.d(t,{Z:()=>r});var s=i(410),n=i(6875),a=i(1346),o=i(9041);function r(e,t=!0,i=!0){const s=[],r=[],{node:d,offset:l}=!(e instanceof DocumentFragment)&&i&&function(e){const t=window.getSelection();let i,s;if(null==t?void 0:t.rangeCount){const n=t.getRangeAt(0),a=n.startOffset;if(n.startContainer&&n.startContainer==n.endContainer&&a==n.endOffset){const t=a-1,o=e.childNodes;if(n.startContainer===e&&o[t]){i=o[t],s=0;for(let e=0;e{"use strict";i.d(t,{Z:()=>n});var s=i(8204);function n({overflowElement:e,overflowRect:t,selector:i,extraSize:n,elements:a}){null!=t||(t=e.getBoundingClientRect()),null!=a||(a=Array.from(e.querySelectorAll(i))),n&&(t={top:t.top-n,right:t.right+n,bottom:t.bottom+n,left:t.left-n});const o=[],r=[],d=[];let l=!1;for(const i of a){const n=i.getBoundingClientRect(),a=(0,s.Z)(i,e,!1,n,t);let c;a?(l=!0,c=r):c=l?d:o,c.push({element:i,rect:n,visibleRect:a})}return{invisibleTop:o,visible:r,invisibleBottom:d}}},8204:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(241);function n(e,t,i,n=e.getBoundingClientRect(),a=t.getBoundingClientRect()){let{top:o,right:r,bottom:d,left:l}=a;if(i){const e=t.querySelector(".sticky");e&&(o=e.getBoundingClientRect().bottom)}if(n.top>=d||n.bottom<=o||n.right<=l||n.left>=r)return null;const c={top:!1,right:!1,bottom:!1,left:!1,vertical:0,horizontal:0},h=s.Z.width,u=s.Z.height;return{rect:{top:n.topr&&r!==h?(c.right=!0,++c.horizontal,r):n.right,bottom:n.bottom>d&&d!==u?(c.bottom=!0,++c.vertical,d):n.bottom,left:n.left{"use strict";i.d(t,{Z:()=>r});var s=i(3757),n=i(3910),a=i(8497),o=i(3444);function r(e){let t=!1;return new s.Z(Object.assign(Object.assign({},e),{verifyTouchTarget:t=>!(0,a.Z)(t.target,"progress-line")&&!(0,o.Z)(t)&&(!e.verifyTouchTarget||e.verifyTouchTarget(t)),onSwipe:(i,s,a)=>{if(i*=-1,s*=-1,!t&&Math.abs(s)>20)return!0;if(Math.abs(i)>Math.abs(s))(0,n.Z)(a),t=!0;else if(!t&&Math.abs(s)>Math.abs(i))return!0;return e.onSwipe(i,s,a)},onReset:()=>{t=!1,e.onReset&&e.onReset()},cancelEvent:!1}))}},1154:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(6976),n=i(2416);function a(e){return(0,n.Z)(Object.assign(Object.assign({},e),{onSwipe:(t,i,n)=>{if(t*=-1,i*=-1,Math.abs(t)>50)return e.onSwipe(t,i,n),(0,s.s)(),!0}}))}},5705:(e,t,i)=>{"use strict";function s(e){if(e instanceof DocumentFragment)return e;const t=document.createElement("template");return e=e.trim(),t.innerHTML=e,t.content}i.d(t,{Z:()=>s})},2614:(e,t,i)=>{"use strict";function s(e){const t=document.createElement("span");return"string"==typeof e?t.innerHTML=e:t.append(e),t}i.d(t,{Z:()=>s})},8487:(e,t,i)=>{"use strict";function s(e){return null==e?void 0:e.isConnected}i.d(t,{Z:()=>s})},1293:(e,t,i)=>{"use strict";function s(e){return e.isContentEditable||"INPUT"!==e.tagName?!e.textContent.trim()&&!e.querySelector(".emoji, .custom-emoji, .custom-emoji-placeholder"):!e.value.trim()}i.d(t,{Z:()=>s})},6299:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(4762);function a(e){if("Enter"===e.key&&!n.IS_MOBILE&&!e.isComposing){if("enter"===s.Z.settings.sendShortcut){if(e.shiftKey||e.ctrlKey||e.metaKey)return;return!0}{const t=n.IS_APPLE?e.metaKey:e.ctrlKey;if(e.shiftKey||(n.IS_APPLE?e.ctrlKey:e.metaKey))return;if(t)return!0}}return!1}},3444:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4762);function n(e){return s.IS_MOBILE_SAFARI&&e instanceof TouchEvent&&e.touches[0].clientX<30}},2398:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(5432);function n(e,t=!1,i=!0){if(!s.Z||t&&("INPUT"===document.activeElement.tagName||document.activeElement.isContentEditable))if(i&&e.focus(),e instanceof HTMLInputElement){const t=e.value.length;e.selectionStart=t,e.selectionEnd=t}else{const t=document.createRange();t.selectNodeContents(e),t.collapse(!1);const i=window.getSelection();i.removeAllRanges(),i.addRange(t)}}window.placeCaretAtEnd=n},4484:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2648);function n(e,t,i,n){return void 0===n&&(n=e.parentElement===t?(0,s.Z)(e):-1),n!==i&&(-1!==n&&ni?t.insertBefore(e,t.children[i]):t.append(e):t.prepend(e),!0)}},6740:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>o,cj:()=>r});var s=i(925);const n={},a=(e,t)=>{e instanceof HTMLImageElement||e instanceof HTMLVideoElement?e.src=t:e instanceof SVGImageElement?e.setAttributeNS(null,"href",t):e.style.backgroundImage="url("+t+")"};function o(e,t,i,o=!0){if(!t)return console.error("renderImageFromUrl: no url?",e,t),void(null==i||i());const r=e instanceof HTMLVideoElement;if(n[t]&&o||r)e&&a(e,t),i&&(r?(0,s.Z)(e).then(i):null==i||i());else{const s=e instanceof HTMLImageElement,o=s?e:new Image;o.src=t;const r=()=>{!s&&e&&a(e,t),n[t]=!0,null==i||i(),o.removeEventListener("error",d)},d=e=>{console.error("Render image from url failed:",e,t,o),o.removeEventListener("load",r),null==i||i()};o.addEventListener("load",r,{once:!0}),o.addEventListener("error",d,{once:!0})}}function r(e,t,i){return new Promise((s=>{o(e,t,s,i)}))}},2830:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(9674),n=i(6740);function a(e,t,i,a,o=e,r){return a&&t.classList.add("fade-in"),(0,n.cj)(t,i).then((()=>s.Z.mutateElement(e,(()=>{o.append(t),a?t.addEventListener("animationend",(()=>{s.Z.mutate((()=>{t.classList.remove("fade-in"),null==r||r.remove()}))}),{once:!0}):null==r||r.remove()}))))}},5565:(e,t,i)=>{"use strict";function s(e,t){if("string"==typeof t)return void(e.innerHTML=t);const i=e.firstChild;i?e.lastChild===i?i.replaceWith(t):(e.textContent="",e.append(t)):e.append(t)}i.d(t,{Z:()=>s})},669:(e,t,i)=>{"use strict";i.d(t,{Y:()=>m,Z:()=>g});var s=i(4762),n=i(5003),a=i(5400),o=i(3699),r=i(6854),d=i(3228),l=i(5975),c=i(2648);function h(e,t,i,s){let n;if(e===i)n=t-s;else if(e.parentElement===i.parentElement)n=(0,c.Z)(e,!0)-(0,c.Z)(i,!0);else{const t=[];let s=e.parentElement;do{t.push(s)}while(s=s.parentElement);s=i.parentElement;do{if(t.includes(s))break}while(s=s.parentElement);const a=s;e=(0,l.Z)(e,a),i=(0,l.Z)(i,a),n=(0,c.Z)(e,!0)-(0,c.Z)(i,!0)}return(0,d.Z)(n,-1,1)}window.compareNodes=h;var u=i(3299),p=i(2398);const f=new RegExp(`[^${r.Z}]`),m=!1;class g{constructor(){this.saveSelectionOnChange=e=>{const t=document.activeElement;this.saveRangeForElement(t)},this.onFocusOut=e=>{this.lastNode=this.lastOffset=void 0},this.onSelectionChange=e=>{var t;const{input:i}=this;if(!i)return void this.setSelectionClassName(document.getSelection());let s=this.getCaretPosN();for(;;){const{node:e,offset:n,selection:a,move:o}=s;if((null==e?void 0:e.nodeValue)!==r.Z||!this.lastNode)break;const d=h(e,n,this.lastNode,this.lastOffset)<0;void 0!==d&&(a.isCollapsed?this.superMove(i,s,d,!0):a.modify(a.isCollapsed?"move":"extend",d?"backward":"forward","character")),this.log("selectionchange",e,n,this.lastNode,this.lastOffset,e===this.lastNode,(0,c.Z)(this.getFiller(e)),(0,c.Z)(this.getFiller(this.lastNode)),d,a,document.getSelection(),document.getSelection().getRangeAt(0),null==e?void 0:e.parentNode,null===(t=this.lastNode)||void 0===t?void 0:t.parentNode),s=this.getCaretPosN(),this.lastNode=e,this.lastOffset=n;break}this.lastNode=this.lastOffset=void 0,this.setSelectionClassName(s.selection,i)},this.onBeforeInput=e=>{var t;const{input:i,log:s}=this;if(!i)return;const n=this.addInputCallback.bind(this,i),a=this.getCaretPosN();let{node:o,offset:d,selection:l,move:c}=a;if(s("beforeinput",e,o,d,l,a),this.lastNode=this.lastOffset=void 0,e.inputType.startsWith("delete")){if(n((()=>{this.processEmptiedFillers(i),this.removeExtraBOMs(i),this.fixInsertedLineBreaks(i)})),(null==o?void 0:o.nodeValue)===r.Z&&l.isCollapsed&&e.inputType.includes("deleteContent")){const t=e.inputType.includes("Backward"),s=d===r.Z.length&&t||!d&&!t;this.superMove(i,a,t,s)}}else{if(e.inputType.startsWith("insert")){if(null===(t=null==o?void 0:o.classList)||void 0===t?void 0:t.contains("input-something")){o=o.previousSibling.firstChild;const e=l.getRangeAt(0);e.setStart(o,0),e.setEnd(o,0),e.collapse(!0);const t=this.getCaretPosN();o=t.node,l=t.selection,d=t.offset}if(o&&o.textContent===r.Z&&d===r.Z.length){l.modify("move","backward","character");const e=this.getCaretPosN();o=e.node,l=e.selection,d=e.offset}e.inputType;{o&&o.nodeType===o.ELEMENT_NODE&&(o=o.firstChild,s.warn("fixing focus on span"));const t=(null==o?void 0:o.nodeValue)===r.Z;if(s("inserting line break",t,o,`"${null==o?void 0:o.nodeValue}"`,(null==o?void 0:o.parentElement)?Array.from(o.parentElement.childNodes).slice():[]),t){const e=o.parentElement;e.classList.replace("input-filler","input-filler-text"),e.childNodes.length,n((()=>{e.childNodes.length>1?(s("inserting line break, remove"),o=Array.from(e.childNodes).find((e=>e.nodeValue===r.Z)),e.t=o):o.nodeValue!==r.Z&&(s("inserting line break, deleteData"),o.deleteData(o.nodeValue.indexOf(r.Z),r.Z.length)),this.fixInsertedLineBreaks(i)}))}else"insertLineBreak"===e.inputType&&n((()=>{this.fixInsertedLineBreaks(i)}))}return}"historyUndo"===e.inputType?n((()=>{this.processFilledFillers(i),this.processEmptiedFillers(i),this.removeExtraBOMs(i),this.removeEmptyTextNodes(i),this.fixBuggedCaret()})):"historyRedo"===e.inputType&&n((()=>{this.processFilledFillers(i),this.processEmptiedFillers(i),i.querySelectorAll(".input-something:not([contenteditable])").forEach((e=>{e.contentEditable="false"})),this.removeExtraBOMs(i),this.fixBuggedCaret()}))}},this.onKeyDown=e=>{var t;const i=e.key;if("ArrowDown"===i||"ArrowUp"===i)this.lastNode=this.lastOffset=void 0;else{const{node:e,offset:t}=this.getCaretPosN();this.lastNode=e,this.lastOffset=t,this.lastNode===this.input&&(this.lastNode=this.lastOffset=void 0)}this.log("keydown",this.lastNode,null===(t=this.lastNode)||void 0===t?void 0:t.parentNode,this.lastOffset,this.getCaretPosN(),e)},this.log=(0,n.kg)("RICH-INPUT"),this.listenerSetter=new o.Z,this.savedRanges=new WeakMap,this.listenerSetter.add(document)("selectionchange",this.saveSelectionOnChange),m&&(this.listenerSetter.add(document)("focusout",this.onFocusOut),this.listenerSetter.add(document)("selectionchange",this.onSelectionChange),this.listenerSetter.add(document)("beforeinput",this.onBeforeInput),this.listenerSetter.add(document)("keydown",this.onKeyDown,{capture:!0}),s.IS_FIREFOX&&(this.inputCaptureCallbacks=[],this.listenerSetter.add(document)("input",(()=>{this.inputCaptureCallbacks.forEach((e=>e())),this.inputCaptureCallbacks.length=0}),{capture:!0})))}get input(){const e=document.getSelection(),{anchorNode:t}=e;if(t)return(t.closest?t:t.parentElement).closest('[contenteditable="true"]')}saveRangeForElement(e){e&&(e.isContentEditable||"INPUT"===e.tagName)&&document.getSelection().rangeCount&&this.savedRanges.set(e,document.getSelection().getRangeAt(0))}findPreviousSmthIndex(e,t,i){const s=Array.from(null!=i?i:e.querySelectorAll(".input-something")),n=s.findIndex((e=>h(e,0,t,0)>=0));return-1===n?s.length-1:Math.max(0,n-1)}superMove(e,t,i,s){var n,a;const{node:o,offset:d,move:l}=t,c=e.querySelectorAll(".input-something"),h=this.findPreviousSmthIndex(e,o,c),u=document.createRange();u[i?"setEnd":"setStart"](o,d),s&&l(i);const p=this.getCaretPosN();if((null===(n=p.node)||void 0===n?void 0:n.nodeValue)===r.Z&&(!s||o===this.lastNode)){const t=this.findPreviousSmthIndex(e,p.node,c);let n=!s;for(;;){const s=this.getCaretPosN(),d=this.findPreviousSmthIndex(e,s.node,c);u[i?"setStart":"setEnd"](s.node,s.offset);const p=u.toString(),m=!f.test(p);if(this.log("test cursor",p,m,t,d),!m||(null===(a=s.node)||void 0===a?void 0:a.nodeValue)!==r.Z||d!==t||!d&&!s.offset||!(d{e.classList.add("br-not-br")}))}fixBuggedCaret(){const e=document.getSelection(),t=e.getRangeAt(0);e.removeAllRanges(),e.addRange(t)}addInputCallback(e,t,i=!0){const n=()=>{this.log("input modify callback"),t()};i&&s.IS_FIREFOX?this.inputCaptureCallbacks.push(n):this.listenerSetter.add(e)("input",n,{once:!0,capture:i})}removeExtraBOMs(e){const t=e=>{var t;return null===(t=null==e?void 0:e.classList)||void 0===t?void 0:t.contains("input-something")};e.querySelectorAll(".input-filler").forEach((e=>{var i;const{previousSibling:s,nextSibling:n}=e;let o=!1;!(null===(i=null==n?void 0:n.classList)||void 0===i?void 0:i.contains("input-filler"))&&(0,a.Hc)(n)&&(o=t(s)||t(n)),o||(this.log.warn("removing empty bom node",e),e.remove())}))}getFiller(e){return e&&e.nodeType===e.TEXT_NODE&&e.parentElement!==this.input?e.parentElement:e}getCaretPosN(){const e=(0,u.Z)(this.input);return Object.assign(Object.assign({},e),{move:this.move.bind(this,e.selection)})}removeEmptyTextNodes(e){const{log:t}=this,i=document.createTreeWalker(e,NodeFilter.SHOW_TEXT,{acceptNode:t=>t.parentElement!==e||t.nodeValue?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT});let s;for(;s=i.nextNode();)t.warn("removing empty text node",s),s.remove()}removePossibleBOMSiblings(e,t){[e,t].forEach((e=>{var t;(null===(t=null==e?void 0:e.classList)||void 0===t?void 0:t.contains("input-filler"))&&e.remove()}))}removePossibleBOMSiblingsByNode(e){const{previousSibling:t,nextSibling:i}=e;this.removePossibleBOMSiblings(t,i)}processEmptiedFillers(e){e.querySelectorAll(".input-filler-text").forEach((e=>{var t;this.removeExtraBOMs(e);let i=!0;if(e.textContent)f.test(e.textContent)||e.querySelector(".input-something")?i=!1:e.classList.replace("input-filler-text","input-filler");else{e.classList.replace("input-filler-text","input-filler");const i=Array.from(e.childNodes).find((e=>e.nodeType===e.TEXT_NODE));i?i.insertData(0,r.Z):(null===(t=e.t)||void 0===t?void 0:t.nodeValue)?e.append(e.t):e.append(document.createTextNode(r.Z))}i&&this.removePossibleBOMSiblingsByNode(e)}))}processFilledFillers(e){e.querySelectorAll(".input-filler").forEach((e=>{if(e.textContent!==r.Z){e.classList.replace("input-filler","input-filler-text");const t=e.t,i=Array.from(e.childNodes).find((e=>e.nodeType===e.TEXT_NODE&&e.nodeValue.includes(r.Z)));if(i&&!(null==t?void 0:t.nodeValue)){const e=i.nodeValue.indexOf(r.Z);-1!==e&&i.deleteData(e,r.Z.length)}}}))}setSelectionClassName(e,t){if(e.rangeCount){const i=e.getRangeAt(0);t?Array.from(t.querySelectorAll(".input-selectable")).forEach((e=>{e.classList.toggle("selection",!i.collapsed&&i.intersectsNode(e))})):Array.from(document.querySelectorAll(".input-selectable.selection")).forEach((e=>e.classList.remove("selection")))}}move(e,t){const{focusNode:i,focusOffset:s}=e;e.modify("extend",t?"backward":"forward","character"),t?e.collapseToStart():e.collapseToEnd();const{focusNode:n,focusOffset:a}=e;this.log("moving cursor",t,i,i.nodeType===i.ELEMENT_NODE?i:i.parentElement,s,n,n.nodeType===n.ELEMENT_NODE?n:n.parentElement,a)}prepareApplyingMarkdown(){const{input:e}=this,t=e.querySelectorAll(".input-filler"),i=e.querySelectorAll(".input-something");return i.forEach((e=>{e.contentEditable="inherit"})),()=>{t.forEach((e=>{e.contentEditable="inherit"})),i.forEach((e=>{e.contentEditable="false"})),this.removeExtraBOMs(e)}}static getInstance(){var e;return null!==(e=this.INSTANCE)&&void 0!==e?e:this.INSTANCE=new g}}},2914:(e,t,i)=>{"use strict";i.d(t,{Z:()=>f});var s=i(3757),n=i(5432),a=i(3512),o=i(3228),r=i(5953),d=i(5418),l=i(3910),c=i(2738),h=i(5975),u=i(4484),p=i(2648);class f{constructor(e){this.onSwipe=(e,t)=>{t=(0,o.Z)(t,this.minY,this.maxY),this.element.style.transform=`translateY(${t}px)`;const i=Math.round(Math.abs(t)/this.elementRect.height),s=this.siblings;this.siblings=[];const n=t<0?"previousElementSibling":"nextElementSibling";let a=this.element[n];for(let e=0;e{this.siblings.includes(e)||(e.style.transform="")})),this.siblings.forEach((e=>{const i=this.elementRect.height*(t<0?1:-1);e.style.transform=`translateY(${i}px)`})),this.scrollableRect){const e=t,i=e>0,s=(i?this.elementRect.bottom:this.elementRect.top)+e-this.addScrollPos;let n=2;s+(i?0:this.elementRect.height)>=this.scrollableRect.bottom||(s-(i?this.elementRect.height:0)<=this.scrollableRect.top?n*=-1:n=void 0),void 0!==n&&(this.scrollable.container[this.scrollable.scrollProperty]+=n)}},this.verifyTouchTarget=e=>!this.list.classList.contains("is-reordering")&&(this.element=this.getSortableTarget(e.target),!!this.element),this.onScroll=()=>{const e=this.scrollable.container[this.scrollable.scrollProperty],t=this.addScrollPos=e-this.startScrollPos,i="scrollTop"===this.scrollable.scrollProperty;this.swipeHandler.add(i?0:t,i?t:0)},this.onStart=()=>{this.list.classList.add("is-reordering"),this.element.classList.add("is-dragging","no-transition"),this.swipeHandler.setCursor("grabbing"),this.elementRect=this.element.getBoundingClientRect(),this.containerRect=this.list.getBoundingClientRect(),this.minY=this.containerRect.top-this.elementRect.top,this.maxY=this.containerRect.bottom-this.elementRect.bottom,this.addScrollPos=0,this.scrollable&&(this.startScrollPos=this.scrollable.container[this.scrollable.scrollProperty],this.scrollableRect=this.scrollable.container.getBoundingClientRect(),this.scrollable.container.addEventListener("scroll",this.onScroll))},this.onReset=()=>{return e=this,t=void 0,s=function*(){const e=this.siblings.length,t=e&&e*(this.siblings[0].previousElementSibling===this.element?1:-1),i=(0,p.Z)(this.element),s=i+t;this.element.classList.remove("no-transition"),this.element.style.transform=t?`translateY(${t*this.elementRect.height}px)`:"",this.swipeHandler.setCursor(""),this.scrollable&&this.scrollable.container.removeEventListener("scroll",this.onScroll),n.Z||(0,c.fc)(document.body,l.Z,{capture:!0,once:!0}),a.Z.settings.animationsEnabled&&(yield(0,d.Z)(250)),this.list.classList.remove("is-reordering"),this.element.classList.remove("is-dragging"),(0,u.Z)(this.element,this.list,s,i),[this.element,...this.siblings].forEach((e=>{e.style.transform=""})),this.element=this.siblings=this.elementRect=this.containerRect=this.minY=this.maxY=this.startScrollPos=this.addScrollPos=void 0,t&&this.onSort(i,s)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s},(0,r.Z)(this,e),this.swipeHandler=new s.Z({element:this.list,onSwipe:this.onSwipe,verifyTouchTarget:this.verifyTouchTarget,onStart:this.onStart,onReset:this.onReset,setCursorTo:document.body,middleware:this.middleware,withDelay:!0})}getSortableTarget(e){if(!e)return;let t=(0,h.Z)(e,this.list);return t&&t.classList.contains("cant-sort")&&(t=void 0),t}}},1656:(e,t,i)=>{"use strict";function s(e,t){return t?e.forEach((e=>e.setAttribute("disabled","true"))):e.forEach((e=>e.removeAttribute("disabled"))),()=>s(e,!t)}i.d(t,{Z:()=>s})},2648:(e,t,i)=>{"use strict";function s(e,t){if(!e.parentNode)return-1;if(t)return Array.from(e.parentNode.childNodes).indexOf(e);let i=0;for(;null!==(e=e.previousElementSibling);)++i;return i}i.d(t,{Z:()=>s})},6339:(e,t,i)=>{"use strict";i.d(t,{Z:()=>h});var s=i(2738),n=i(5975),a=i(3241),o=i(5432),r=i(5953),d=i(6385),l=i(8497),c=i(3512);class h extends a.Z{constructor(e){super(!1),this.onClickOut=e=>{const t=e.target;(0,n.Z)(t,this.element)||Array.from(this.ignoreButtons).some((e=>(0,n.Z)(t,e)||t===e))||!(this.ignoreMouseOut.size<=1)||this.ignoreOutClickClassName&&(0,l.Z)(t,this.ignoreOutClickClassName)||this.toggle(!1)},this.onMouseOut=e=>{if(!this.isActive())return;if(this.clearTimeout("toggle"),this.ignoreMouseOut.size)return;const t=e.toElement;t&&(0,n.Z)(t,this.element)||this.setTimeout("toggle",(()=>{this.toggle(!1)}),200)},this.toggle=e=>{return t=this,i=void 0,a=function*(){const t=!!this.element.style.display&&void 0===e||e;if(this.init){if(!t)return;this.init(),this.init=null}if(t===this.isActive())return;const i=o.Z||!c.Z.settings.animationsEnabled?0:200;if(this.element.style.display&&void 0===e||e){const e=this.dispatchResultableEvent("open");yield Promise.all(e),this.element.style.display="",this.element.offsetLeft,this.element.classList.add("active"),this.dispatchEvent("openAfterLayout"),d.Z.pushItem(this.navigationItem={type:"dropdown",onPop:()=>{this.toggle(!1)}}),this.clearTimeout("toggle"),this.setTimeout("done",(()=>{this.forceClose=!1,this.dispatchEvent("opened")}),i)}else this.dispatchEvent("close"),this.ignoreMouseOut.clear(),this.ignoreButtons.clear(),this.element.classList.remove("active"),d.Z.removeItem(this.navigationItem),(0,s.EN)(window,this.onClickOut,{capture:!0}),this.clearTimeout("toggle"),this.setTimeout("done",(()=>{this.element.style.display="none",this.forceClose=!1,this.dispatchEvent("closed")}),i)},new((n=void 0)||(n=Promise))((function(e,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(t,i||[])).next())}));var t,i,n,a},(0,r.Z)(this,e),this.forceClose=!1,this.inited=!1,this.ignoreMouseOut=new Set,this.ignoreButtons=new Set,this.timeouts={}}attachButtonListener(e,t){let i=!0;o.Z?(0,s.fc)(e,(()=>{i?(i=!1,this.toggle(!0)):this.toggle()}),{listenerSetter:t}):(t.add(e)("mouseover",(s=>{i&&(t.add(e)("mouseout",(e=>{this.clearTimeout("toggle"),this.onMouseOut(e)})),i=!1),this.setTimeout("toggle",(()=>{this.toggle(!0)}),200)})),(0,s.fc)(e,(()=>{const t="click",i=!this.ignoreMouseOut.has(t);i&&!this.ignoreMouseOut.size&&(this.ignoreButtons.add(e),setTimeout((()=>{(0,s.fc)(window,this.onClickOut,{capture:!0})}),0)),this.setIgnoreMouseOut(t,i),this.toggle(i)}),{listenerSetter:t}))}clearTimeout(e){void 0!==this.timeouts[e]&&(clearTimeout(this.timeouts[e]),delete this.timeouts[e])}setTimeout(e,t,i){this.clearTimeout(e),this.timeouts[e]=window.setTimeout((()=>{this.clearTimeout(e),t()}),i)}init(){o.Z||(this.element.onmouseout=this.onMouseOut,this.element.onmouseover=e=>{this.forceClose||this.clearTimeout("toggle")})}isActive(){return this.element.classList.contains("active")}setIgnoreMouseOut(e,t){t?this.ignoreMouseOut.add(e):this.ignoreMouseOut.delete(e)}}},4789:(e,t,i)=>{"use strict";i.d(t,{Z:()=>l,f:()=>s});var s,n=i(8594),a=i(3035),o=i(5296),r=i(3512),d=i(8487);function l(e){var t,i,o;if(null!==(t=e.margin)&&void 0!==t||(e.margin=0),null!==(i=e.maxDistance)&&void 0!==i||(e.maxDistance=1500),null!==(o=e.axis)&&void 0!==o||(e.axis="y"),r.Z.settings.animationsEnabled&&0!==e.forceDuration||(e.forceDirection=s.Static),e.forceDirection===s.Static)return e.forceDuration=0,c(e);const d=(0,a.AD)().then((()=>c(e)));return"y"===e.axis?(0,n.YW)(d):d}function c(e){const{element:t,container:i,getNormalSize:s,getElementPosition:n,transitionFunction:a,axis:r,margin:l,position:p,forceDirection:f,maxDistance:m,forceDuration:g}=e;if(!(0,d.Z)(t))return(0,o.Kx)(i),Promise.resolve();const v="y"===r?"top":"left",b="y"===r?"bottom":"right",y="y"===r?"height":"width",w="y"===r?"scrollHeight":"scrollWidth",S="y"===r?"scrollHeight":"offsetWidth",C="y"===r?"scrollTop":"scrollLeft",L=t.getBoundingClientRect(),E=i.getBoundingClientRect?i.getBoundingClientRect():document.body.getBoundingClientRect(),I=L[v]-E[v],M=n?n({elementRect:L,containerRect:E,elementPosition:I}):I,P=t[S],Z=s?s({rect:E}):E[y];let k=i[C];const T=i[w];let x;switch(p){case"start":x=M-l;break;case"end":x=L[b]-E[b]+l;break;case"nearest":case"center":if(Pm?(k=i.scrollTop+=x-m,x=m):x<-m&&(k=i.scrollTop+=x+m,x=-m)),x<0){const e=-k;x=Math.max(x,e)}else if(x>0){const e=T-(k+Z);x=Math.min(x,e)}const A=i[C]+x,_=Math.abs(x),F=null!=g?g:250+_/1500*350,D=Date.now(),R=null!=a?a:_<500?u:h,B=()=>F?Math.min((Date.now()-D)/F,1):1,N=()=>{const e=B(),t=R(e),s=x*(1-t);return i[C]=Math.round(A-s),e<1};if(!F||!x)return(0,o.Kx)(i),N(),Promise.resolve();if(e.startCallback){const t=T-Math.round(A+i["y"===r?"offsetHeight":"offsetWidth"]);e.startCallback({scrollSize:T,scrollPosition:k,distanceToEnd:t,path:x,duration:F,containerRect:E,elementRect:L,getProgress:B})}return(0,o.cK)(N,i)}function h(e){return 1-Math.pow(1-e,5)}function u(e){return 1-Math.pow(1-e,3.5)}!function(e){e[e.Up=0]="Up",e[e.Down=1]="Down",e[e.Static=2]="Static"}(s||(s={}))},8801:(e,t,i)=>{"use strict";i.d(t,{P:()=>n});const s="_";function n(e,t){const i=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join(s);break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join(s);break;case"inputFileLocation":n=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":n=["webFile",e.url].join(s);break;default:console.error("Unrecognized location:",e),n=""}return n+((null==t?void 0:t.downloadId)?"_download":"")+(i?"."+i:i)}},1708:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(7625);function n(e){(0,s.Z)(e.history,((t,i,s)=>{t.action.photo||(s.splice(i,1),void 0!==e.count&&--e.count)}))}},4081:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2325);function n(e,t="auto"){if(0===e)return(0,s.ag)("FileSize.B",[0]);const i="auto"===t,n=Math.floor(Math.log(e)/Math.log(1024)),a="auto"===t?Math.max(0,n-1):t,o=Math.max(0,a),r=(e/Math.pow(1024,n)).toFixed(o);return(0,s.ag)(["FileSize.B","FileSize.KB","FileSize.MB","FileSize.GB"][n],[i?r:parseFloat(r)])}},8939:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(2325);const n={s:"Seconds",m:"Minutes",h:"Hours",d:"Days",w:"Weeks",mm:"Months",y:"Years"};function a(e,t){const i=function(e,t=2){e||(e=1);const i=[],s=[{m:1,t:"s"},{m:60,t:"m"},{m:60,t:"h"},{m:24,t:"d"},{m:7,t:"w"}];let n=1;s.forEach(((t,a)=>{if(n=Math.round(n*t.m),e=0;--e)0===a[e].duration&&a.splice(e,1);return a}(e,2);if(t){const e=i.map((e=>s.ZP.format(n[e.type],!0,[e.duration])));return(0,s.v_)(e,!1,t)}const a=i.map((e=>(0,s.ag)(n[e.type],[e.duration]))),o=document.createElement("span");return o.append(...(0,s.v_)(a,!1)),o}},6272:(e,t,i)=>{"use strict";i.d(t,{u:()=>r});var s=i(2325);const n=new Map;let a=0;const o=(e,t,i="")=>{i=t.country_code+i,a=Math.max(a,i.length),n.set(i,{country:e,code:t})};function r(e){e=e||"",n.size||s.ZP.countriesList.forEach((e=>{e.country_codes.forEach((t=>{t.prefixes?t.prefixes.forEach((i=>{o(e,t,i)})):o(e,t)}))}));let t=e.replace(/\D/g,"");const i=t.slice(0,a);let r;for(let e=i.length-1;e>=0&&(r=n.get(i.slice(0,e+1)),!r);--e);if(!r)return{formatted:t,country:void 0,code:void 0,leftPattern:""};const d=r.country,l=r.code.patterns||[],c=t.slice(r.code.country_code.length);let h="",u=0,p="";for(let e=l.length-1;e>=0;--e){h=l[e];const t=h.replace(/ /g,"");let i=0;for(let e=0,s=Math.min(c.length,t.length);eu&&(u=i,p=h)}h=p||h,h=h.replace(/\d/g,"X"),h=r.code.country_code+" "+h,h.split("").forEach(((e,i)=>{" "===e&&" "!==t[i]&&t.length>i&&(t=t.slice(0,i)+" "+t.slice(i))}));let f=h&&h.length>t.length?h.slice(t.length):"";return f&&(f=f.replace(/X/g,"‒")),{formatted:t,country:d,code:r.code,leftPattern:f}}},645:(e,t,i)=>{"use strict";i.d(t,{M:()=>s,Z:()=>n});class s{constructor(){this.cache=new Map}static createCache(){const e={frames:new Map,framesNew:new Map,framesURLs:new Map,clearCache:()=>{e.framesNew.forEach((e=>{var t,i;null===(i=(t=e).close)||void 0===i||i.call(t)})),e.frames.clear(),e.framesNew.clear(),e.framesURLs.clear()},counter:0};return e}getCache(e){let t=this.cache.get(e);return t||this.cache.set(e,t=s.createCache()),++t.counter,t}releaseCache(e){const t=this.cache.get(e);t&&!--t.counter&&this.cache.delete(e)}getCacheCounter(e){const t=this.cache.get(e);return null==t?void 0:t.counter}generateName(e,t,i,s,n){return[e,t,i,s?"colored":"",n||""].filter(Boolean).join("-")}}const n=new s},9171:(e,t,i)=>{"use strict";function s(e,t,i,s,n,a,o){return[e,",",t," ",i," ",s,",",n," ",a,",",o].join("")}function n(e,t,i,n,a,o,r,d){const l=[];return l.push("M"+(e+i/2)+","+t),l.push("H"+(e+i-o)),o>0&&l.push("A"+s(o,o,0,0,1,e+i,t+o)),l.push("V"+(t+n-r)),r>0&&l.push("A"+s(r,r,0,0,1,e+i-r,t+n)),l.push("H"+(e+d)),d>0&&l.push("A"+s(d,d,0,0,1,e+0,t+n-d)),l.push("V"+(t+a)),a>0&&l.push("A"+s(a,a,0,0,1,e+a,t+0)),l.push("Z"),l.join(" ")}i.d(t,{Z:()=>n}),i(410).GO.generatePathData=n},1046:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(6740),n=i(1185),a=i(6705);function o(e,t,i){const o=(0,n.Z)(e,t,!1);let r,d;if(i){const e=(0,a.Z)(o);r=e.canvas,d=e.promise}else r=new Image,d=(0,s.cj)(r,o);return r.classList.add("thumbnail"),{image:r,loadPromise:d}}},1185:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4059);function n(e,t,i=!1){return(0,s.Z)(t.bytes,i)}},8580:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(1507),n=i(1046);function a(e,t,i,a=!1){const o=["video","gif"].includes(e.type);if(!t.downloaded||o||a){if("document"===e._&&t.downloaded&&!a&&(!o||t.type!==s.Pt))return null;const r=e.sizes||e.thumbs,d=(null==r?void 0:r.length)?r.find((e=>"photoStrippedSize"===e._)):null;if(d&&"bytes"in d)return(0,n.Z)(e,d,i)}return null}},6074:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(7625),n=i(5953);class a{constructor(e){this.previous=[],this.next=[],this.reverse=!1,this.loadCount=50,this.loadWhenLeft=20,this.loadedAllUp=!1,this.loadedAllDown=!1,(0,n.Z)(this,e)}setTargets(e,t,i){this.previous=e,this.next=t,this.reverse=i}get index(){return void 0!==this.count?this.previous.length:-1}reset(e=!1){this.current=void 0,this.previous=[],this.next=[],this.setLoaded(!0,e),this.setLoaded(!1,e)}go(e,t=!0){let i,s;if(e>0){if(i=this.next.splice(0,e),s=i.pop(),!s)return;void 0!==this.current&&i.unshift(this.current),this.previous.push(...i)}else{if(i=this.previous.splice(Math.max(0,this.previous.length+e),-e),s=i.shift(),!s)return;void 0!==this.current&&i.push(this.current),this.next.unshift(...i)}return this.next.length0),this.current}unsetCurrent(e){e?this.previous.push(this.current):this.next.unshift(this.current),this.current=void 0}goUnsafe(e,t){const i=e>0?Math.max(0,e-this.next.length):Math.min(0,e+this.previous.length),s=this.go(e,!i&&t);return{item:i?void 0:s,leftLength:i}}setLoaded(e,t){return(e?this.loadedAllDown:this.loadedAllUp)!==t&&(e?this.loadedAllDown=t:this.loadedAllUp=t,t||(e?this.loadPromiseDown=null:this.loadPromiseUp=null),!0)}load(e){if(e?this.loadedAllDown:this.loadedAllUp)return Promise.resolve();let t,i=e?this.loadPromiseDown:this.loadPromiseUp;return i||(t=e?this.reverse?this.previous[0]:this.next[this.next.length-1]:this.reverse?this.next[this.next.length-1]:this.previous[0],null!=t||(t=this.current),i=this.loadMore(t,e,this.loadCount).then((t=>{return n=this,a=void 0,r=function*(){if((e?this.loadPromiseDown:this.loadPromiseUp)!==i)return;t.items.length{const t=this.processItem?this.processItem(e):e;t&&n.push(t)}));const a=yield Promise.all(n);e?this.reverse?this.previous.unshift(...a):this.next.push(...a):this.reverse?this.next.push(...a):this.previous.unshift(...a),this.onLoadedMore&&this.onLoadedMore()},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}d((r=r.apply(n,a||[])).next())}));var n,a,o,r}),(()=>{})).then((()=>{e?this.loadPromiseDown=null:this.loadPromiseUp=null})),e?this.loadPromiseDown=i:this.loadPromiseUp=i,i)}}},3699:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(){this.listeners=new Set}add(e){return(t,i,s)=>{const n={element:e,event:t,callback:i,options:s};return this.addManual(n),n}}addManual(e){var t;e.element.addEventListener(e.event,e.callback,e.options),(null===(t=e.options)||void 0===t?void 0:t.once)&&(e.onceCallback=()=>{this.remove(e),e.onceFired=!0},e.element.addEventListener(e.event,e.onceCallback,e.options)),this.listeners.add(e)}remove(e){e.onceFired||(e.element.removeEventListener(e.event,e.callback,e.options),e.onceCallback&&e.element.removeEventListener(e.event,e.onceCallback,e.options)),this.listeners.delete(e)}removeManual(e,t,i,s){let n;for(const a of this.listeners)if(a.element===e&&a.event===t&&a.callback===i&&a.options===s){n=a;break}n&&this.remove(n)}removeAll(){this.listeners.forEach((e=>{this.remove(e)}))}}},9405:(e,t,i)=>{"use strict";i.d(t,{C:()=>a,c:()=>n});var s=i(9897);class n{constructor(e=0,t=e){this.width=e,this.height=t}aspect(e,t){return(0,s.Z)(this.width,this.height,e.width,e.height,t)}aspectFitted(e){return this.aspect(e,!0)}aspectCovered(e){return this.aspect(e,!1)}}function a(e,t){return new n(e,t)}},4755:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,_:()=>s});var s,n=i(410),a=i(3241),o=i(9405);!function(e){e[e.mobile=0]="mobile",e[e.medium=1]="medium",e[e.large=2]="large"}(s||(s={}));const r=(0,o.C)(20,20),d=(0,o.C)(36,36),l=(0,o.C)(18,18);class c extends a.Z{constructor(){super(),this.screenSizes=[{key:s.mobile,value:600},{key:s.medium,value:1275},{key:s.large,value:1680}],this.sizes={handhelds:{regular:(0,o.C)(270,270),webpage:(0,o.C)(270,200),album:(0,o.C)(270,0),esgSticker:(0,o.C)(68,68),animatedSticker:(0,o.C)(180,180),staticSticker:(0,o.C)(180,180),emojiSticker:(0,o.C)(112,112),poll:(0,o.C)(240,0),round:(0,o.C)(200,200),documentName:(0,o.C)(200,0),invoice:(0,o.C)(270,270),extendedInvoice:(0,o.C)(270,270),customEmoji:r,esgCustomEmoji:d,emojiStatus:l,popupSticker:(0,o.C)(68,68)},desktop:{regular:(0,o.C)(420,340),webpage:(0,o.C)(420,340),album:(0,o.C)(420,0),esgSticker:(0,o.C)(72,72),animatedSticker:(0,o.C)(200,200),staticSticker:(0,o.C)(200,200),emojiSticker:(0,o.C)(112,112),poll:(0,o.C)(330,0),round:(0,o.C)(280,280),documentName:(0,o.C)(240,0),invoice:(0,o.C)(320,320),extendedInvoice:(0,o.C)(420,340),customEmoji:r,esgCustomEmoji:d,emojiStatus:l,popupSticker:(0,o.C)(80,80)}},this.isMobile=!1,this.handleResize=()=>{const e=window.innerWidth;let t=this.screenSizes[0].key;for(let i=this.screenSizes.length-1;i>=0;--i)if(this.screenSizes[i].value{this.rAF&&window.cancelAnimationFrame(this.rAF),this.rAF=window.requestAnimationFrame((()=>{this.handleResize(),this.rAF=0}))})),this.handleResize()}}const h=new c;n.GO.mediaSizes=h;const u=h},8631:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});const s=(0,i(5471).Z)("MIDDLEWARE");function n(e,t=s){return i=>{if(!(i instanceof Promise)){if(i instanceof Error)throw i;return i}return i.then((i=>{if(!e())throw t;return i}))}}},3228:(e,t,i)=>{"use strict";function s(e,t,i){return ei?i:e}i.d(t,{Z:()=>s})},2559:(e,t,i)=>{"use strict";function s(e,t=2){if(0===e)return"0";const i=t<0?0:t,s=Math.floor(Math.log(e)/Math.log(1e3));return parseFloat((e/Math.pow(1e3,s)).toFixed(i))+["","K","M","B","T"][s]}i.d(t,{Z:()=>s})},2575:(e,t,i)=>{"use strict";function s(e,t=" "){const i=e.toString().split(".");return i[0]=i[0].replace(/\B(?=(\d{3})+(?!\d))/g,t),i.join(".")}i.d(t,{Z:()=>s})},925:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(4762);function n(e,t=e.HAVE_METADATA,i){return new Promise(((n,a)=>{if(e.readyState>=t)return void n();const o=s.IS_APPLE_MOBILE&&!i?"loadeddata":"canplay",r="error",d=()=>{e.removeEventListener(r,l),n()},l=t=>{e.removeEventListener(o,d),a(t)};e.addEventListener(o,d,{once:!0}),e.addEventListener(r,l,{once:!0})}))}},2296:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(6385),n=i(5432),a=i(4762),o=i(3910),r=i(2738),d=i(5975),l=i(3241);class c extends l.Z{constructor(e,t){super(!1),this.navigationType=e,this.withOverlay=t,this.onClick=e=>{var t;this.element&&(0,d.Z)(e.target,this.element)||((null===(t=this.listenerOptions)||void 0===t?void 0:t.capture)&&(0,o.Z)(e),this.close())},this.listenerOptions=t?{}:{capture:!0}}close(){var e;this.element&&(null===(e=this.overlay)||void 0===e||e.remove(),this.element=void 0,this.dispatchEvent("toggle",!1)),n.Z||window.removeEventListener("contextmenu",this.onClick,this.listenerOptions),document.removeEventListener(r.pf,this.onClick,this.listenerOptions),a.IS_MOBILE_SAFARI||s.Z.removeByType(this.navigationType)}open(e){this.close(),a.IS_MOBILE_SAFARI||s.Z.pushItem({type:this.navigationType,onPop:e=>{this.close()}}),this.element=e,!this.overlay&&this.withOverlay&&(this.overlay=document.createElement("div"),this.overlay.classList.add("btn-menu-overlay"),this.overlay.addEventListener(r.pf,(e=>{(0,o.Z)(e),this.onClick(e)}))),this.overlay&&this.element.parentElement.insertBefore(this.overlay,this.element),n.Z||window.addEventListener("contextmenu",this.onClick,Object.assign(Object.assign({},this.listenerOptions),{once:!0})),document.addEventListener(r.pf,this.onClick,this.listenerOptions),this.dispatchEvent("toggle",!0)}}},5180:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(7445);function n(e,t,i){const n=(e=+e)<0,a=s.Z[t];if(!a)throw new Error("CURRENCY_WRAP_INVALID");const o=e/Math.pow(10,a.exp);let r=a.exp;"IRR"==t&&Math.floor(o)==o&&(r=0);let d=function(e,t,i,s){e=(e+"").replace(/[^0-9+\-Ee.]/g,"");var n=isFinite(+e)?+e:0,a=isFinite(+t)?Math.abs(t):0,o=void 0===s?",":s,r=void 0===i?".":i,d="";return(d=(a?function(e,t){var i=Math.pow(10,t);return""+Math.round(e*i)/i}(n,a):""+Math.round(n)).split("."))[0].length>3&&(d[0]=d[0].replace(/\B(?=(?:\d{3})+(?!\d))/g,o)),(d[1]||"").length{"use strict";i.d(t,{Z:()=>n});var s=i(4755);function n(e,t,i,n){e.touches&&(e=e.touches[0]);const{pageX:a,pageY:o}=e,r=Array.from(t.children).find((e=>e.classList.contains("btn-menu-item")&&!e.classList.contains("hide")))||t;let{scrollWidth:d}=r;const{scrollHeight:l}=t,c=document.body.getBoundingClientRect(),h=c.width,u=c.height;d+=2*r.offsetLeft;let p=8,f=8,m=8,g=8;n&&(n.top&&n.top,n.right&&(f+=n.right),n.bottom&&(m+=n.bottom),n.left&&(g+=n.left)),i=s.Z.isMobile?"right":"left";let v="top";const b=u-l-m,y=h-d-f,w=g,S={x:{left:a,right:Math.min(y,a-d)},intermediateX:"right"===i?w:y,y:{top:o,bottom:o-l},intermediateY:b},C={left:S.x.left+d+f<=h,right:S.x.right>=g},L={top:S.y.top+l+m<=u,bottom:S.y.bottom-m>=m};{const e=C[i]?S.x[i]:(i="center",S.intermediateX);t.style.left=e+"px"}{const e=L[v]?S.y[v]:(v="center",S.intermediateY);t.style.top=e+"px"}return t.className=t.className.replace(/(top|center|bottom)-(left|center|right)/g,""),t.classList.add(("center"===v?v:"bottom")+"-"+("center"===i?i:"left"===i?"right":"left")),{width:d,height:l}}},677:(e,t,i)=>{"use strict";i.d(t,{RP:()=>a,X:()=>o});const s=new Set(["all","web","webk"]),n=new Set;function a(e){return e.find((e=>s.has(e.platform)&&!n.has(e.reason)))}function o(e){return!!a(e)}},3174:(e,t,i)=>{"use strict";i.d(t,{O:()=>o,k:()=>a});var s=i(3512);const n={};function a(e,t,i,s){const a=e.id+"-"+t,o=n[a];return o&&o.width>=i&&o.height>=s}function o(e,t,i){return o=this,r=void 0,l=function*(){const o=e.id+"-"+i,{width:r,height:d}=t;if(a(e,i,r,d))return;const l=n[o]={width:r,height:d},c=yield s.Z.managers.appDocsManager.getLottieCachedThumb(e.id,i);if(n[o]!==l)return;if(c&&c.w>=r&&c.h>=d)return;const h=new Promise((e=>{t.toBlob((t=>e(t)))})),u=yield h;n[o]===l&&s.Z.managers.appDocsManager.saveLottiePreview(e.id,u,r,d,i)},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(o,r||[])).next())}));var o,r,d,l}},9966:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3035);function n(e){return function(e,t){let i,s=!1;return(...n)=>{i=n,s||(s=!0,e((()=>{s=!1,t(...i)})))}}(s.T2,e)}},8936:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(5953);class n{constructor(e){this.loading=!1,this.loaded=!1,(0,s.Z)(this,e),e.scrollable.onScrolledBottom=()=>{this.load()}}load(){return this.loaded?Promise.resolve():this.loading?this.promise:(this.loading=!0,void(this.promise=this.getPromise().then((e=>{this.loading=!1,this.promise=void 0,e?(this.loaded=!0,this.scrollable.onScrolledBottom=null):this.scrollable.checkForTriggers()}),(()=>{this.promise=void 0,this.loading=!1}))))}}},3719:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3781),n=i(2790),a=i(3512),o=i(7625),r=i(1708),d=i(6074),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class c extends d.Z{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{loadMore:(e,t,i)=>{const a=t?0:i;let o=null==e?void 0:e.mid;var d;return void 0===o&&(o=this.searchContext.maxId),t||(d=o,1,o=(0,s.Z)((0,n.Z)(d)+1)),this.managers.appMessagesManager.getSearch(Object.assign(Object.assign({},this.searchContext),{peerId:this.searchContext.peerId||(null==e?void 0:e.peerId),maxId:o,limit:a?0:i,backLimit:a})).then((e=>("inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(0,r.Z)(e),e.next_rate&&(this.searchContext.nextRate=e.next_rate),{count:e.count,items:e.history})))},processItem:t=>l(this,void 0,void 0,(function*(){if((yield this.filterMids([t.mid])).length)return e.processItem(t)}))})),this.onHistoryDelete=({peerId:e,msgs:t})=>{const i=i=>i.peerId===e&&t.has(i.mid),s=(e,t,s)=>{i(e)&&s.splice(t,1)};(0,o.Z)(this.previous,s),(0,o.Z)(this.next,s),this.current&&i(this.current)&&(this.current=void 0,this.onEmptied&&this.onEmptied())},this.onHistoryMultiappend=e=>l(this,void 0,void 0,(function*(){if(void 0!==this.searchContext.folderId)return;if(!this.loadedAllUp||this.loadPromiseUp)return;if(e.peerId!==this.searchContext.peerId)return;const t=yield this.filterMids([e.mid]),i=(yield Promise.all(t.map((e=>this.processItem(e))))).filter(Boolean);i.length&&(this.current?this.next.push(...i):this.previous.push(...i))})),this.onMessageSent=({message:e})=>{this.onHistoryMultiappend(e)},null!==(t=this.managers)&&void 0!==t||(this.managers=a.Z.managers),a.Z.addEventListener("history_delete",this.onHistoryDelete),a.Z.addEventListener("history_multiappend",this.onHistoryMultiappend),a.Z.addEventListener("message_sent",this.onMessageSent),e.isInner||(this.otherSideLoader=new c(Object.assign(Object.assign({},e),{isInner:!0})))}filterMids(e){return l(this,void 0,void 0,(function*(){const t=`${this.searchContext.peerId}_${this.searchContext.isScheduled?"scheduled":"history"}`;return yield this.managers.appMessagesManager.filterMessagesByInputFilterFromStorage(this.searchContext.inputFilter._,e,t,e.length)}))}setSearchContext(e){this.searchContext=e,void 0!==this.searchContext.folderId&&(this.loadedAllUp=!0,void 0===this.searchContext.nextRate&&(this.loadedAllDown=!0)),"inputMessagesFilterChatPhotos"===this.searchContext.inputFilter._&&(this.loadedAllUp=!0),!1===this.searchContext.useSearch&&(this.loadedAllDown=this.loadedAllUp=!0),this.otherSideLoader&&this.otherSideLoader.setSearchContext(e)}reset(){super.reset(),this.searchContext=void 0,this.otherSideLoader&&this.otherSideLoader.reset()}getPrevious(e){let t=this.previous;return this.otherSideLoader&&e&&(t=t.concat(this.otherSideLoader.previous)),t}getNext(e){let t=this.next;return this.otherSideLoader&&e&&(t=t.concat(this.otherSideLoader.next)),t}getCurrent(){var e;return this.current||(null===(e=this.otherSideLoader)||void 0===e?void 0:e.current)}goToOtherEnd(e){return e>0?this.go(-this.previous.length):this.go(this.next.length)}goRound(e,t){var i;let s;if(null===(i=this.otherSideLoader)||void 0===i?void 0:i.current){if(s=this.otherSideLoader.goUnsafe(e,t),s.item)return s.item;if(!((e=s.leftLength)>0?this.otherSideLoader.next:this.otherSideLoader.previous).length){if(!(e>0?this.otherSideLoader.loadedAllUp:this.otherSideLoader.loadedAllDown))return;if(e>0&&(1===this.otherSideLoader.searchContext.maxId||this.otherSideLoader.loadedAllDown)||e<0&&(0===this.otherSideLoader.searchContext.maxId||this.otherSideLoader.loadedAllUp))return this.otherSideLoader.goToOtherEnd(e);this.otherSideLoader.unsetCurrent(e>0)}}if(s=this.goUnsafe(e,t),!s.item){if(this.loadedAllUp&&this.loadedAllDown)return this.goToOtherEnd(e);this.otherSideLoader&&(e=s.leftLength,s=this.otherSideLoader.goUnsafe(e,t),s.item&&this.unsetCurrent(e>0))}return null==s?void 0:s.item}setLoaded(e,t){var i;const s=super.setLoaded(e,t);if(s&&this.otherSideLoader&&t&&!1!==(null===(i=this.searchContext)||void 0===i?void 0:i.useSearch)){const e=this.loadedAllUp;this.otherSideLoader.setSearchContext(Object.assign(Object.assign({},this.searchContext),{maxId:e?1:0})),this.otherSideLoader.reverse=this.reverse,this.otherSideLoader.setLoaded(e,!0),this.otherSideLoader.load(!e)}return s}cleanup(){this.reset(),a.Z.removeEventListener("history_delete",this.onHistoryDelete),a.Z.removeEventListener("history_multiappend",this.onHistoryMultiappend),a.Z.removeEventListener("message_sent",this.onMessageSent),this.onEmptied=void 0,this.otherSideLoader&&(this.otherSideLoader.cleanup(),this.otherSideLoader=void 0)}}},9674:(e,t,i)=>{"use strict";i.d(t,{Z:()=>d});var s=i(3035),n=i(3725),a=i(410),o=i(8487);const r=new class{constructor(){this.promises={},this.raf=s.T2.bind(null),this.scheduled=!1}do(e,t){let i=this.promises[e];return i||(this.scheduleFlush(),i=this.promises[e]=(0,n.Z)()),void 0!==t&&i.then((()=>t())),i}measure(e){return this.do("read",e)}mutate(e){return this.do("write",e)}mutateElement(e,t){const i=(0,o.Z)(e),s=i?this.mutate():Promise.resolve();return void 0!==t&&(i?s.then((()=>t())):t()),s}scheduleFlush(){this.scheduled||(this.scheduled=!0,this.raf((()=>{this.promises.read&&this.promises.read.resolve(),this.promises.write&&this.promises.write.resolve(),this.scheduled=!1,this.promises={}})))}};a.GO&&(a.GO.sequentialDom=r);const d=r},1713:(e,t,i)=>{"use strict";i.d(t,{Z:()=>r});var s=i(1507),n=i(7030),a=i(9405),o=i(3114);function r(e,t,i,r,d=!0,l,c,h){const u=(0,o.Z)(e);let p;h||(h=(0,n.Z)(e,i,r,void 0,c));const f="document"===e._;p=f||u?(0,a.C)(e.w||h.w||512,e.h||h.h||512):(0,a.C)(h.w||100,h.h||100);let m=(0,a.C)(i,r);m=p=p.aspect(m,d);let g=!0;return(!f||["video","gif"].includes(e.type)||u)&&(m.width<200&&m.height<200&&(m=p=p.aspectCovered((0,a.C)(200,200))),l&&(l.message||l.reply_to_mid||l.media.webpage||l.replies&&l.replies.pFlags.comments&&l.replies.channel_id.toChatId()!==s.IA)&&m.width<320&&(m=(0,a.C)(320,m.height),g=!1),g&&m.width<120&&l&&(m=(0,a.C)(120,m.height),g=!1)),t.style.width=m.width+"px",t.style.height=m.height+"px",{photoSize:h,size:p,isFit:g}}},5345:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,s:()=>h});var s=i(5003),n=i(6519),a=i(3624),o=i(8631),r=i(5953),d=i(5418),l=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};let c=0;class h{constructor(e){var t;(0,r.Z)(this,e),this.queue=[],null!==(t=this.middlewareHelper)&&void 0!==t||(this.middlewareHelper=(0,a.k)());const i="BATCH-PROCESSOR-"+ ++c;this.log?this.log=this.log.bindPrefix(i):this.log=(0,s.kg)(i)}get queuePromise(){return this.promise}clear(){this.log("clear"),this.queue.length=0,this.promise=void 0,this.middlewareHelper.clean()}addToQueue(e){return this.queue.push(e),this.setQueue()}setQueue(){if(!this.queue.length)return Promise.resolve();if(this.promise)return this.promise;const e=this.middlewareHelper.get(),t=this.log.bindPrefix("queue"),i=(0,o.Z)(e,this.possibleError),s=()=>l(this,void 0,void 0,(function*(){t("start",this.queue.length);const e=this.queue.splice(0,this.queue.length),n=performance.now(),a=e.map((e=>(e.then((e=>{t("render item time",performance.now()-n,e)})),e))),o=yield i(Promise.all(a));if(yield i(this.process(o,i,t)),t("queue rendered"),this.queue.length)return t("have new items to render"),s();t("end")}));t("setting pause");const n=this.promise=i((0,d.Z)(0)).then((()=>s().catch((e=>{throw e!==this.possibleError&&t.error("process queue error",e),e}))),(e=>{throw t("pause has been cleared"),e})).finally((()=>{this.promise===n&&(this.promise=void 0)}));return n}}class u{constructor(e){this.updateElementWith=e=>e(),this.updateListWith=e=>e(!0),(0,r.Z)(this,e),this.elements=new Map,this.sorted=[],this.middleware=(0,a.k)(),this.batchProcessor=new h({log:this.log,process:(e,t,i)=>l(this,void 0,void 0,(function*(){const i=e.map((e=>this.update(e.id,e)));yield t(Promise.all(i))}))})}clear(){this.batchProcessor.clear(),this.middleware.clean(),this.elements.clear(),this.sorted.length=0}_updateList(){this.elements.forEach((e=>{this.update(e.id)})),this.onSort&&this.sorted.forEach(((e,t)=>{this.onSort(e,t)}))}updateList(e){const t=this.middleware.get();this.updateListWith((i=>{t()&&(void 0===i||i)?(this._updateList(),null==e||e(!0)):null==e||e(!1)}))}has(e){return this.elements.has(e)}get(e){return this.elements.get(e)}getAll(){return this.elements}add(e){return l(this,void 0,void 0,(function*(){if(this.get(e))return;const t={id:e,index:0};this.elements.set(e,t);const i=Promise.resolve(this.onElementCreate(t));return this.batchProcessor.addToQueue(i)}))}delete(e,t){const i=this.elements.get(e);if(!i)return!1;this.elements.delete(e);const s=this.sorted.indexOf(i);if(-1!==s&&this.sorted.splice(s,1),this.onDelete)if(t)this.onDelete(i);else{const e=this.middleware.get();this.updateElementWith((()=>{e()&&this.onDelete(i)}))}return!0}update(e,t=this.get(e)){var i;return l(this,void 0,void 0,(function*(){if(!t)return;if(t.index=yield this.getIndex(t),this.get(e)!==t)return;null===(i=this.onUpdate)||void 0===i||i.call(this,t);const s=(0,n.Z)(this.sorted,t,"index");this.onSort(t,s)}))}}},6854:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});const s="\ufeff"},4056:(e,t,i)=>{"use strict";function s(e){return e.replace(/&/g,"&").replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,(e=>"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";")).replace(/([^\#-~| |!])/g,(e=>"&#"+e.charCodeAt(0)+";")).replace(//g,">")}i.d(t,{Z:()=>s})},3738:(e,t,i)=>{"use strict";function s(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}i.d(t,{Z:()=>s})},8456:(e,t,i)=>{"use strict";function s(e,t,i=t+10){return(e=e.trim()).length>i&&(e=e.slice(0,t)+"..."),e}i.d(t,{Z:()=>s})},5157:(e,t,i)=>{"use strict";function s(e,t=!1){const i=parseInt(e+"",10),s=Math.floor(i/3600);let n=Math.floor((i-3600*s)/60),a=i-3600*s-60*n;return s&&(t=!0),n<10&&(n=t?"0"+n:n),a<10&&(a="0"+a),(s?s+":":"")+n+":"+a}i.d(t,{Z:()=>s})},8812:(e,t,i)=>{"use strict";function s(e){const t=new Blob([e],{type:"image/svg+xml;charset=utf-8"});return new Promise((e=>{const i=new FileReader;i.onload=t=>{e(t.target.result)},i.readAsDataURL(t)}))}i.d(t,{Z:()=>s})},241:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(1352);const n=new class{constructor(){if(s.kC)return;const e="visualViewport"in window?window.visualViewport:window,t=()=>{this.width=e.width||e.innerWidth,this.height=e.height||e.innerHeight};e.addEventListener("resize",t),t()}}},8594:(e,t,i)=>{"use strict";i.d(t,{YW:()=>p,ZP:()=>v,e9:()=>g,gp:()=>m});var s=i(3725),n=i(410),a=i(5418);const o=new(i(3241).Z),r="start",d="end";let l=!1,c=(0,s.Z)(),h=0;c.resolve();const u=console.log.bind(console.log,"[HEAVY-ANIMATION]:");function p(e,t){l||(c=(0,s.Z)(),o.dispatchEvent(r),l=!0,n.ZP&&u("start")),++h,n.ZP&&u("attach promise, length:",h,t);const i=[void 0!==t?(0,a.Z)(t):void 0,e.finally((()=>{}))].filter(Boolean),d=performance.now(),p=c;return Promise.race(i).then((()=>{c!==p||c.isFulfilled||(--h,n.ZP&&u("promise end, length:",h,performance.now()-d),h<=0&&f())})),c}function f(){c.isFulfilled||(l=!1,h=0,o.dispatchEvent(d),c.resolve(),n.ZP&&u("end"))}function m(){f()}function g(){return c}function v(e,t,i){l&&e();const s=i?i.add(o):o.addEventListener.bind(o),n=i?i.removeManual.bind(i,o):o.removeEventListener.bind(o);return s(r,e),s(d,t),()=>{n(d,t),n(r,e)}}window.dispatchHeavyAnimationEvent=p},8130:(e,t,i)=>{"use strict";i.r(t),i.d(t,{AppDialogsManager:()=>ht,DIALOG_LIST_ELEMENT_TAG:()=>it,default:()=>pt});var s=i(9331),n=i(3512),a=i(3003),o=i(6194),r=i(2325),d=i(4668),l=i(2796),c=i(3897),h=i(1483),u=i(3416),p=i(1507),f=i(3186),m=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class g{constructor(e){this.managers=e,this.onArchiveClick=()=>m(this,void 0,void 0,(function*(){const e=yield this.managers.appMessagesManager.getDialogOnly(this.peerId);e&&this.managers.appMessagesManager.editPeerFolders([e.peerId],+!e.folder_id)})),this.hideTopic=()=>{this.managers.appChatsManager.editForumTopic({chatId:this.peerId.toChatId(),topicId:this.threadId,hidden:!0})},this.toggleTopic=()=>{this.managers.appChatsManager.editForumTopic({chatId:this.peerId.toChatId(),topicId:this.threadId,closed:!this.dialog.pFlags.closed})},this.onPinClick=()=>{const{peerId:e,filterId:t,threadId:i}=this;this.managers.appMessagesManager.toggleDialogPin({peerId:e,filterId:t,topicId:i}).catch((e=>m(this,void 0,void 0,(function*(){"PINNED_DIALOGS_TOO_MUCH"!==e.type&&"PINNED_TOO_MUCH"!==e.type||(i?this.managers.apiManager.getLimit("topicPin").then((e=>{(0,l.bC)({langPackKey:"LimitReachedPinnedTopics",langPackArguments:[e]})})):t>=1?(0,l.bC)({langPackKey:"PinFolderLimitReached"}):(0,f.Z)("pin"))}))))},this.onUnmuteClick=()=>{this.managers.appMessagesManager.togglePeerMute({peerId:this.peerId,mute:!1,threadId:this.threadId})},this.onMuteClick=()=>{new c.Z(this.peerId,this.threadId)},this.onUnreadClick=()=>m(this,void 0,void 0,(function*(){const{peerId:e,dialog:t}=this;t.unread_count?(this.managers.appMessagesManager.readHistory(e,t.top_message,this.threadId),this.threadId||this.managers.appMessagesManager.markDialogUnread(e,!0)):this.threadId||this.managers.appMessagesManager.markDialogUnread(e)})),this.onDeleteClick=()=>{new o.Z(this.peerId,void 0,void 0,this.threadId)},this.onContextMenu=e=>{this.init&&(this.init(),this.init=null);let t=null;try{t=(0,d.Z)(e.target,it)}catch(e){}if(t){if(e instanceof MouseEvent&&e.preventDefault(),this.element.classList.contains("active"))return!1;e instanceof MouseEvent&&(e.cancelBubble=!0),(()=>{m(this,void 0,void 0,(function*(){this.peerId=t.dataset.peerId.toPeerId(),this.threadId=+t.dataset.threadId||void 0,this.dialog=yield this.managers.dialogsStorage.getDialogOrTopic(this.peerId,this.threadId),this.filterId=this.threadId?void 0:pt.filterId,this.canManageTopics=this.threadId?yield this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"manage_topics"):void 0,yield Promise.all(this.buttons.map((e=>m(this,void 0,void 0,(function*(){const t=yield e.verify();e.element.classList.toggle("hide",!t)})))));const i=this.threadId?"Delete":yield this.managers.appPeersManager.getDeleteButtonText(this.peerId);this.buttons[this.buttons.length-1].element.lastChild.replaceWith((0,r.ag)(i)),t.classList.add("menu-open"),(0,h.Z)(e,this.element),u.Z.openBtnMenu(this.element,(()=>{t.classList.remove("menu-open"),this.peerId=this.dialog=this.filterId=this.threadId=this.canManageTopics=void 0}))}))})()}}}init(){this.buttons=[{icon:"unread",text:"MarkAsUnread",onClick:this.onUnreadClick,verify:()=>m(this,void 0,void 0,(function*(){return!this.threadId&&!(yield this.managers.appMessagesManager.isDialogUnread(this.dialog))}))},{icon:"readchats",text:"MarkAsRead",onClick:this.onUnreadClick,verify:()=>this.managers.appMessagesManager.isDialogUnread(this.dialog)},{icon:"pin",text:"ChatList.Context.Pin",onClick:this.onPinClick,verify:()=>m(this,void 0,void 0,(function*(){var e;return!(this.threadId&&!this.canManageTopics)&&!(void 0!==this.filterId&&this.filterId>1?(yield this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId):null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned)}))},{icon:"unpin",text:"ChatList.Context.Unpin",onClick:this.onPinClick,verify:()=>m(this,void 0,void 0,(function*(){var e;return!(this.threadId&&!this.canManageTopics)&&(void 0!==this.filterId&&this.filterId>1?(yield this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId):!!(null===(e=this.dialog.pFlags)||void 0===e?void 0:e.pinned))}))},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>m(this,void 0,void 0,(function*(){return this.peerId!==n.Z.myId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.dialog.peerId,threadId:this.threadId}))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:this.onUnmuteClick,verify:()=>m(this,void 0,void 0,(function*(){return this.peerId!==n.Z.myId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.dialog.peerId,threadId:this.threadId}))}))},{icon:"archive",text:"Archive",onClick:this.onArchiveClick,verify:()=>0===this.filterId&&this.peerId!==n.Z.myId},{icon:"unarchive",text:"Unarchive",onClick:this.onArchiveClick,verify:()=>1===this.filterId&&this.peerId!==n.Z.myId},{icon:"hide",text:"Hide",onClick:this.hideTopic,verify:()=>m(this,void 0,void 0,(function*(){return this.canManageTopics&&this.dialog.id===p.Ox}))},{icon:"lock",text:"CloseTopic",onClick:this.toggleTopic,verify:()=>this.canManageTopics&&!this.dialog.pFlags.closed},{icon:"lockoff",text:"RestartTopic",onClick:this.toggleTopic,verify:()=>this.canManageTopics&&!!this.dialog.pFlags.closed},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>m(this,void 0,void 0,(function*(){return!this.threadId||!!this.canManageTopics&&this.dialog.id!==p.Ox}))}],this.element=(0,a.b)({buttons:this.buttons}),this.element.id="dialogs-contextmenu",this.element.classList.add("contextmenu"),document.getElementById("page-chats").append(this.element)}}var v=i(6008),b=i(1405),y=i(8805),w=i(632),S=i(4762),C=i(5003),L=i(4271),E=i(4494),I=i(9099),M=i(410),P=i(8842),Z=i(1447),k=i(9492),T=i(534),x=i(4273),A=i(2738),_=i(4484),F=i(5565),D=i(4159),R=i(3442),B=i(7487),N=i(9174),O=i(3910),U=i(490);class H{constructor(e,t){this.managers=e,this.hadConnect=!1,this.connecting=!1,this.timedOut=!1,this.updating=!1,this.setConnectionStatus=e=>{Promise.all([B.Z.get("dc"),n.Z.managers.rootScope.getConnectionStatus()]).then((([t,i])=>{t||(t=D.Z.baseDcId),this.setFirstConnectionTimeout&&(clearTimeout(this.setFirstConnectionTimeout),this.setFirstConnectionTimeout=0);const s=i["NET-"+t],n=s&&(e||s.status)===N.Q.Connected;this.connecting&&n&&this.managers.apiUpdatesManager.forceGetDifference(),n&&!this.hadConnect&&(this.hadConnect=!0),this.timedOut=s&&(e||s.status)===N.Q.TimedOut,this.connecting=!n,this.retryAt=s&&s.retryAt,M.ZP&&this.log("connecting",this.connecting),this.setState()}))},this.setStatusText=(e,t)=>{this.currentLangPackKey!==e&&(this.currentLangPackKey=e,(0,F.Z)(this.statusEl,(0,r.ag)(e,t)),this.statusPreloader.attach(this.statusEl))},this.setState=()=>{if(U.Z.deactivatedReason)return;const e=H.CHANGE_STATE_DELAY;if(this.connecting)if(this.timedOut){const e=this.getA("ConnectionStatus.ForceReconnect",(()=>this.managers.networkerFactory.forceReconnect()));this.setStatusText("ConnectionStatus.TimedOut",[e])}else if(this.hadConnect)if(void 0!==this.retryAt){const e=document.createElement("span"),t=this.retryAt,i=()=>{const i=Date.now();e.innerText=""+Math.max(0,Math.round((t-i)/1e3)),i>t&&clearInterval(s)},s=setInterval(i,1e3);i();const n=this.getA("ConnectionStatus.Reconnect",(()=>this.managers.networkerFactory.forceReconnectTimeout()));this.setStatusText("ConnectionStatus.ReconnectIn",[e,n])}else this.setStatusText("ConnectionStatus.Reconnecting");else this.setStatusText("ConnectionStatus.Waiting");else this.updating&&this.setStatusText("Updating");M.ZP&&this.log("setState",this.connecting||this.updating),window.requestAnimationFrame((()=>{this.setStateTimeout&&clearTimeout(this.setStateTimeout),this.setStateTimeout=window.setTimeout((()=>{(0,I.Z)({element:this.statusContainer,className:"is-shown",forwards:this.connecting||this.updating,duration:200}),this.setStateTimeout=0,M.ZP&&this.log("setState: isShown:",this.connecting||this.updating)}),e)}))},this.log=(0,C.kg)("CS",void 0,void 0),this.statusContainer=document.createElement("div"),this.statusContainer.classList.add("connection-status"),this.statusEl=(0,E.Z)("btn-primary bg-warning connection-status-button",{noRipple:!0}),this.statusPreloader=new R.Z({cancelable:!1}),this.statusPreloader.constructContainer({color:"transparent",bold:!0}),this.statusContainer.append(this.statusEl),t.prepend(this.statusContainer),n.Z.addEventListener("connection_status_change",(e=>{this.setConnectionStatus()})),n.Z.addEventListener("state_synchronizing",(e=>{e||(this.updating=!0,M.ZP&&this.log("updating",this.updating),this.setState())})),n.Z.addEventListener("state_synchronized",(e=>{M.ZP&&this.log("state_synchronized",e),e||(this.updating=!1,M.ZP&&this.log("updating",this.updating),this.setState())})),this.setFirstConnectionTimeout=window.setTimeout(this.setConnectionStatus,H.CHANGE_STATE_DELAY+1e3)}getA(e,t){const i=document.createElement("a");return i.classList.add("force-reconnect"),i.append((0,r.ag)(e)),(0,A.fc)(i,(e=>{(0,O.Z)(e),t()})),i}}H.CHANGE_STATE_DELAY=1e3;var z,j=i(6740),G=i(3035),V=i(2894),K=i(5432),W=i(1154),$=i(241),q=i(8487);!function(e){e[e.Error=-1]="Error",e[e.Pending=0]="Pending",e[e.Sent=1]="Sent",e[e.Read=2]="Read"}(z||(z={}));var Q=i(5345),Y=i(5701),X=i(5296),J=i(8222);function ee(e,t,i,s){return e>=s?t+i:function(e,t){return-t/2*(Math.cos(Math.PI*e)-1)}(e/s,i)+t}var te=i(4755);function ie(e,t,i,s,n,a,o,r){const d=e.canvas.dpr;if(d&&(t*=d,i*=d,s*=d,n*=d),"number"==typeof a)d&&(a*=d),a={tl:a,tr:a,br:a,bl:a};else{const e={tl:0,tr:0,br:0,bl:0};for(const t in e)a[t]=a[t]?d?a[t]*d:a[t]:e[t]}e.beginPath(),e.moveTo(t+a.tl,i),e.lineTo(t+s-a.tr,i),e.quadraticCurveTo(t+s,i,t+s,i+a.tr),e.lineTo(t+s,i+n-a.br),e.quadraticCurveTo(t+s,i+n,t+s-a.br,i+n),e.lineTo(t+a.bl,i+n),e.quadraticCurveTo(t,i+n,t,i+n-a.bl),e.lineTo(t,i+a.tl),e.quadraticCurveTo(t,i,t+a.tl,i),e.closePath(),o&&e.fill(),r&&e.stroke()}const se=window.devicePixelRatio,ne=20*se,ae=2.5*se,oe=2*se,re=1*se;var de=i(6818),le=i(6385),ce=i(3013),he=i(130),ue=i(4332),pe=i(1168),fe=i(7030),me=i(8115),ge=i(496),ve=i(5381),be=i(7530),ye=i(2291),we=i(5772),Se=i(3385),Ce=i(2554),Le=i(8050),Ee=i(6976),Ie=i(3725),Me=i(7362),Pe=i(8631),Ze=i(2312),ke=i(2059),Te=i(2493),xe=i(319);var Ae=i(3228);class _e{constructor(){this.font="30pt Helvetica",this.currTime=Date.now(),this.diffTime=0,this.spread=0,this.paused=!1,this.pausedTime=0,this.pauseInterval=850,this.lightSource=0,this.inc=.032,this.lightSpread=.55,this.animations=["slide","slide","slide","slide"],this.currentAnimationIndex=0}keepTime(){this.diffTime=Date.now()-this.currTime,this.currTime=Date.now()}cycleAnimation(){++this.currentAnimationIndex,this.currentAnimationIndex>=this.animations.length&&(this.currentAnimationIndex=0)}animate(){const e=this.animations[this.currentAnimationIndex];return"glow"===e?this.animateGlow():"slide"===e?this.animateSlide():void console.log("unknown animation type: "+String(e))}animateGlow(){var e=68;return()=>{var t=this.diffTime/(1e3/60)*10;return this.paused?Date.now()-this.pausedTime>800&&(e=68,this.cycleAnimation(),this.paused=!1):(e=parseInt(""+(e+t)))>=255&&(this.paused=!0,this.pausedTime=Date.now()),"rgb("+e+","+e+","+e+")"}}animateSlide(){var e,t,i,s=this.ctx.createLinearGradient(0,0,this.canvas.width,0),n=this.inc*(this.diffTime/(1e3/60));if(this.paused){if(Date.now()-this.pausedTime>this.pauseInterval)return this.lightSource=-.6,this.cycleAnimation(),this.paused=!1,this.animateSlide()}else this.lightSource+=n,this.lightSource>1+this.lightSpread&&(this.paused=!0,this.pausedTime=Date.now());i=(0,Ae.Z)(this.lightSource,0,1),e=(0,Ae.Z)(this.lightSource-this.lightSpread,0,1),t=(0,Ae.Z)(this.lightSource+this.lightSpread,0,1);const a=J.Z.getProperty("background-color-true"),o=J.Z.getProperty("surface-color");return s.addColorStop(e,a),s.addColorStop(i,o),s.addColorStop(t,a),s}settings(e={}){var t,i,s,n,a,o;this.canvas=null!==(t=e.canvas)&&void 0!==t?t:document.createElement("canvas"),this.ctx=this.canvas.getContext("2d"),this.font=null!==(i=e.font)&&void 0!==i?i:this.font,this.lightSpread=null!==(s=e.lightSpread)&&void 0!==s?s:this.lightSpread,this.inc=null!==(n=e.inc)&&void 0!==n?n:this.inc,this.animations=null!==(a=e.animations)&&void 0!==a?a:this.animations,this.text=null!==(o=e.text)&&void 0!==o?o:this.text,this.fillStyle=e.fillStyle,this.canvas.classList.add("shimmer-canvas")}on(){const{width:e,height:t}=this.canvas;this.keepTime(),this.ctx.clearRect(0,0,e,t),this.font&&(this.ctx.font=this.font),this.ctx.fillStyle=this.animate(),this.ctx.fillRect(0,0,e,t),this.fillStyle&&(this.ctx.fillStyle=this.fillStyle,this.ctx.fillRect(0,0,e,t)),this.text&&this.ctx.fillText(this.text,50,50)}}class Fe{constructor(e={}){var t,i,s;this.onThemeChange=()=>{this.stopAnimation(),this.startAnimation()},this.onResize=()=>{const{canvas:e}=this,{width:t,height:i,dpr:s}=e;this.updateCanvasSize(),e.width===t&&e.height===i&&e.dpr===s||(this.stopAnimation(),this.startAnimation())},this.shimmer=new _e,this.tempId=0,this.canvas=document.createElement("canvas"),this.canvas.classList.add("dialogs-placeholder-canvas"),this.ctx=this.canvas.getContext("2d"),this.generatedValues=[],this.avatarSize=null!==(t=e.avatarSize)&&void 0!==t?t:54,this.marginVertical=null!==(i=e.marginVertical)&&void 0!==i?i:9,this.totalHeight=null!==(s=e.totalHeight)&&void 0!==s?s:this.avatarSize+2*this.marginVertical,this.lineHeight=10,this.lineBorderRadius=6,this.lineMarginVertical=8,this.statusWidth=24}attach({container:e,rect:t,getRectFrom:i,onRemove:s,blockScrollable:n}){const{canvas:a}=this;this.onRemove=s,this.getRectFrom="function"==typeof i?i:(i||e).getBoundingClientRect.bind(i||e),(this.blockScrollable=n)&&(n.container.style.overflowY="hidden"),this.updateCanvasSize(t),this.startAnimation(),e.append(a)}detach(e){this.detachTime||(this.availableLength=e,this.detachTime=Date.now(),n.Z.settings.animationsEnabled||this.remove())}remove(){var e;this.stopAnimation(),this.canvas.parentElement&&(this.canvas.remove(),this.blockScrollable&&(this.blockScrollable.container.style.overflowY="",this.blockScrollable=void 0)),null===(e=this.onRemove)||void 0===e||e.call(this),this.onRemove=void 0}updateCanvasSize(e=this.getRectFrom()){const{canvas:t}=this,i=t.dpr=window.devicePixelRatio;t.width=e.width*i,t.height=e.height*i,t.style.width=e.width+"px",t.style.height=e.height+"px"}renderDetachAnimationFrame(){const{canvas:e,ctx:t,detachTime:i,length:s,availableLength:a}=this;if(!i)return;if(!n.Z.settings.animationsEnabled)return void this.remove();const{width:o}=e;t.globalCompositeOperation="destination-out";const r=Date.now()-i;let d=!0;for(let e=0;e=a?15*(a-1):15*e);if(i<=0){d=!1;continue}const n=ee(i,0,1,150);t.beginPath(),t.rect(0,this.dialogHeight*e,o,this.dialogHeight),t.fillStyle=`rgba(0, 0, 0, ${n})`,t.fill(),n<1&&(d=!1)}t.globalCompositeOperation="source-over",d&&this.remove()}renderFrame(){this.shimmer.on(),this.renderDetachAnimationFrame()}startAnimation(){const{canvas:e,shimmer:t}=this,i=++this.tempId,s=this.createPattern();t.settings({canvas:e,fillStyle:s});const a=()=>this.tempId===i;this.renderFrame(),(0,X.jt)((()=>!!a()&&(n.Z.settings.animationsEnabled&&this.renderFrame(),a()))),n.Z.addEventListener("theme_change",this.onThemeChange),te.Z.addEventListener("resize",this.onResize)}stopAnimation(){++this.tempId,n.Z.removeEventListener("theme_change",this.onThemeChange),te.Z.removeEventListener("resize",this.onResize)}createPattern(){const{canvas:e,ctx:t}=this,i=document.createElement("canvas"),s=i.getContext("2d"),n=e.dpr;i.dpr=n,i.width=e.width,i.height=e.height,s.fillStyle=J.Z.getProperty("surface-color"),s.fillRect(0,0,i.width,i.height),s.fillStyle="#000",s.globalCompositeOperation="destination-out";const a=this.dialogHeight=this.totalHeight*n,o=this.length=Math.ceil(e.height/a);for(let e=0;e{})).finally((()=>{e[t]===s&&delete e[t]}));const n=(0,Pe.Z)((()=>e[t]===s));return{deferred:s,middleware:n}}class nt extends Q.Z{constructor(e){super({getIndex:e=>{var t;return this.managers.dialogsStorage.getDialogIndex(null!==(t=this.forumPeerId)&&void 0!==t?t:e.id,this.indexKey,this.forumPeerId?e.id:void 0)},onDelete:e=>{var t;e.dom.listEl.remove(),null===(t=this.onListLengthChange)||void 0===t||t.call(this)},onSort:(e,t)=>{var i;const s=e.dom.listEl.parentElement!==this.list;(0,_.Z)(e.dom.listEl,this.list,t),s&&(null===(i=this.onListLengthChange)||void 0===i||i.call(this))},onElementCreate:e=>tt(this,void 0,void 0,(function*(){var t;const i=[],s=ut.addListDialog({peerId:null!==(t=this.forumPeerId)&&void 0!==t?t:e.id,loadPromises:i,isBatch:!0,threadId:this.forumPeerId?e.id:void 0,isMainList:"index_0"===this.indexKey});return e.dom=s.dom,e.dialogElement=s,yield Promise.all(i),e})),updateElementWith:G.TR,log:e.log}),(0,Ve.Z)(this,e)}clear(){this.list.replaceChildren(),super.clear()}}class at extends ze.ZP{constructor({peerId:e,rippleEnabled:t=!0,onlyFirstName:i=!1,meAsSaved:n=!0,avatarSize:a="bigger",autonomous:o,loadPromises:r,fromName:d,noIcons:l,threadId:c,wrapOptions:h={},isMainList:u}){var p;super({clickable:!0,noRipple:!t,havePadding:!c,title:!0,titleRightSecondary:!0,subtitle:!0,subtitleRight:!0,noWrap:!0,asLink:!0}),this.subtitleRight.remove();const f=c?void 0:new s.Z;if(f){const t={bigger:54,abitbigger:42,small:32}[a];f.classList.add("dialog-avatar","avatar-"+t),f.updateWithOptions({loadPromises:r,lazyLoadQueue:h.lazyLoadQueue,isDialog:!!n,peerId:e,peerTitle:d}),this.applyMediaElement(f,a)}const m=this.container,g=this.title;g.classList.add("user-title"),this.titleRow.classList.add("dialog-title");const v=new P.Z,b=v.update({peerId:e,fromName:d,dialog:n,onlyFirstName:i,withIcons:!l,threadId:c});null==r||r.push(b),g.append(v.element),g.classList.add("tgico");const y=this.subtitle,w=this.container;w.classList.add("chatlist-chat","chatlist-chat-"+a),o||(w.href="#"+e),"bigger"===a?this.container.classList.add("row-big"):"small"===a&&this.container.classList.add("row-small"),w.dataset.peerId=""+e,c&&(w.dataset.threadId=""+c);const S=document.createElement("span");S.classList.add("message-status","sending-status");const C=document.createElement("span");C.classList.add("message-time");const E=this.titleRight;E.classList.add("dialog-title-details"),E.append(S,C),this.subtitleRow.classList.add("dialog-subtitle");const I=this.dom={avatarEl:f,captionDiv:m,titleSpan:v.element,titleSpanContainer:g,statusSpan:S,lastTimeSpan:C,lastMessageSpan:y,containerEl:w,listEl:w,subtitleEl:this.subtitleRow};if(!o){w.dialogDom=I;const t=L.ZP.chat;t&&L.ZP.isSamePeer(t,{peerId:e,threadId:c,type:"chat"})&&ut.setDialogActive(w,!0),u&&(null===(p=ut.forumTab)||void 0===p?void 0:p.peerId)===e&&!c&&w.classList.add("is-forum-open")}}createUnreadBadge(){if(this.dom.unreadBadge)return;const e=this.dom.unreadBadge=document.createElement("div");e.className="dialog-subtitle-badge badge badge-22",this.dom.subtitleEl.append(e)}createUnreadAvatarBadge(){if(this.dom.unreadAvatarBadge)return;const e=this.dom.unreadAvatarBadge=document.createElement("div");e.className="dialog-subtitle-badge badge badge-22 avatar-badge",this.dom.listEl.append(e)}createMentionsBadge(){if(this.dom.mentionsBadge)return;const e=this.dom.mentionsBadge=document.createElement("div");e.className="dialog-subtitle-badge badge badge-22 mention mention-badge",e.innerText="@",this.dom.lastMessageSpan.after(e)}toggleBadgeByKey(e,t,i,s){(0,I.Z)({element:this.dom[e],className:"is-visible",forwards:t,duration:s?0:250,onTransitionEnd:t?void 0:()=>{this.dom[e].remove(),delete this.dom[e]},useRafs:i&&(0,q.Z)(this.dom[e])?0:2})}}class ot extends Ge.h{toggle(e){return tt(this,void 0,void 0,(function*(){this.init2&&(yield this.init2()),(0,I.Z)({element:this.container,className:"is-visible",forwards:e,duration:300,onTransitionEnd:e?void 0:()=>{this.onCloseAfterTimeout()},useRafs:this.firstTime?(this.firstTime=void 0,2):void 0})}))}init(e){(0,Ve.Z)(this,e),this.log=(0,C.kg)("FORUM"),this.firstTime=!0,this.container.classList.add("topics-container");const t=!this.slider;t&&(this.closeBtn.classList.replace("tgico-left","tgico-close"),this.container.classList.add("active","is-floating"),(0,A.fc)(this.closeBtn,(()=>{ut.toggleForumTab(void 0,this)}),{listenerSetter:this.listenerSetter})),this.rows=document.createElement("div"),this.rows.classList.add("sidebar-header__rows"),this.subtitle=document.createElement("div"),this.subtitle.classList.add("sidebar-header__subtitle"),this.title.replaceWith(this.rows),this.rows.append(this.title,this.subtitle);const i=ut.createChatList();ut.setListClickListener(i,null,!0),this.scrollable.append(i),this.xd=new lt(this.peerId,t?80:0),this.xd.scrollable=this.scrollable,this.xd.sortedList=new nt({managers:this.managers,log:this.log,list:i,indexKey:"index_0",forumPeerId:this.peerId}),this.xd.bindScrollable();const s=()=>({peerId:this.peerId,type:"chat"}),a=(0,We.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:[{icon:"info",text:"ForumTopic.Context.Info",onClick:()=>tt(this,void 0,void 0,(function*(){const e=x.ZP.createTab(Qe.Z,!0);e.isFirst=!0,e.setPeer(this.peerId),(yield e.fillProfileElements())(),e.loadSidebarMedia(!0),e.open()}))},{icon:"message",text:"ForumTopic.Context.ShowAsMessages",onClick:()=>{const e=L.ZP.chat;L.ZP[(null==e?void 0:e.peerId)===this.peerId?"setPeer":"setInnerPeer"](s())},verify:()=>{const e=L.ZP.chat;return!e||!L.ZP.isSamePeer(e,s())}},{icon:"adduser",text:"ForumTopic.Context.AddMember",onClick:()=>{},verify:()=>!1},{icon:"add",text:"ForumTopic.Context.New",onClick:()=>{x.ZP.createTab(Je.Z).open(this.peerId)},separator:!0,verify:()=>this.managers.appChatsManager.hasRights(this.peerId.toChatId(),"manage_topics")}]});if(this.listenerSetter.add(n.Z)("history_reload",(e=>{this.peerId===e&&this.xd.fullReset()})),this.listenerSetter.add(n.Z)("chat_update",(e=>tt(this,void 0,void 0,(function*(){this.peerId===e.toPeerId(!0)&&((yield this.managers.appChatsManager.getChat(e)).pFlags.forum||ut.toggleForumTab(void 0,this))})))),K.Z&&(0,W.Z)({element:this.container,onSwipe:()=>{ut.toggleForumTab(void 0,this)},middleware:this.middlewareHelper.get()}),this.header.append(a),!t)return this.init2()}init2(){return tt(this,void 0,void 0,(function*(){this.init2=void 0;const e=this.middlewareHelper.get(),t=this.peerId;this.managers.apiUpdatesManager.subscribeToChannelUpdates(this.peerId.toChatId()),e.onDestroy((()=>{this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(this.peerId.toChatId())}));const i=(0,Me.Z)({peerId:t,dialog:!0,wrapOptions:{middleware:e}}),s=L.ZP.setPeerStatus({peerId:t,element:this.subtitle,needClear:!0,useWhitespace:!1,middleware:e,noTyping:!0});return Promise.all([i,s,this.xd.onChatsScroll().then((e=>e.cached?e.renderPromise:void 0))]).then((([t,i,s])=>{e()&&(this.title.append(t),null==i||i())}))}))}onCloseAfterTimeout(){super.onCloseAfterTimeout(),this.xd.destroy()}}const rt=new Error("not implemented");class dt{constructor(){this.onChatsRegularScroll=()=>{this.sliceTimeout&&clearTimeout(this.sliceTimeout),this.sliceTimeout=window.setTimeout((()=>{this.sliceTimeout=void 0,this.sortedList.list.childElementCount&&!ut.processContact&&(0,G.TR)((()=>{const e=performance.now(),t=this.scrollable.scrollTop,i=this.sortedList.list.firstElementChild,s=this.scrollable.container.getBoundingClientRect(),n=i.getBoundingClientRect(),a=Array.from(this.scrollable.splitUp.children);let o=this.scrollable.splitUp.offsetTop;o&&t{this.deleteDialogByKey(this.getDialogKeyFromElement(e))})),this.setOffsets(),this.scrollable.scrollTop=c.offsetTop-u,this.log("slice time",performance.now()-e)}))}),200)},this.log=(0,C.kg)("CL"),this.offsets={top:0,bottom:0},this.managers=n.Z.managers,this.listenerSetter=new Ke.Z}getOffsetIndex(e){return{index:this.scrollable.loadedAll[e]?0:this.offsets[e]}}isDialogMustBeInViewport(e){const t=this.getOffsetIndex("top"),i=this.getOffsetIndex("bottom");if(!t.index&&!i.index)return!0;const s=(0,Le.Z)(e,this.indexKey);return(!t.index||s<=t.index)&&(!i.index||s>=i.index)}setIndexKey(e){this.indexKey=e,this.sortedList.indexKey=e}deleteDialogByKey(e){this.sortedList.delete(e)}deleteDialog(e){return this.deleteDialogByKey(this.getDialogKey(e))}updateDialog(e){const t=this.getDialogKey(e);if(!this.isDialogMustBeInViewport(e))return void this.deleteDialog(e);if(!this.sortedList.has(t)&&this.loadedDialogsAtLeastOnce)return void this.sortedList.add(t);const i=this.getDialogElement(t);i&&(ut.setLastMessageN({dialog:e,dialogElement:i,setUnread:!0}),this.sortedList.update(t))}onChatsScrollTop(){return this.onChatsScroll("top")}onChatsScroll(e="bottom"){return this.loadDialogs(e)}createPlaceholder(){const e=this.placeholder=new Fe(this.placeholderOptions),t=this.getRectFromForPlaceholder();return e.attach({container:this.sortedList.list.parentElement,getRectFrom:t,onRemove:()=>{this.placeholder===e&&(this.placeholder=void 0)},blockScrollable:this.scrollable}),e}loadDialogs(e){const t=this.log.bindPrefix("load-"+(i=1e3,s=9999,i=Math.ceil(i),s=Math.floor(s),Math.floor(Math.random()*(s-i+1))+i));var i,s;if(t("try",e),this.loadDialogsPromise||this.loadDialogsRenderPromise)return this.loadDialogsPromise;if(this.scrollable.loadedAll[e])return Promise.resolve({cached:!0,renderPromise:Promise.resolve()});t.warn("start",e);const n=(0,He.Z)("MIDDLEWARE"),a=(0,Ie.Z)(),o=new Promise(((i,s)=>tt(this,void 0,void 0,(function*(){const r=this.sortedList.list;let d=this.placeholder;try{const i=this.loadDialogsInner(e),s=yield i;if(!r.childElementCount&&!d&&(!this.loadedDialogsAtLeastOnce&&this.needPlaceholderAtFirstTime||!s.cached)){if(this.loadDialogsRenderPromise!==o)throw n;d=this.createPlaceholder(),a.resolve(!1)}const l=yield s.result;if(this.loadDialogsRenderPromise!==o)throw n;a.resolve(s.cached),"bottom"===e?l.isEnd&&(this.scrollable.loadedAll[e]=!0):l.isTopEnd&&(this.scrollable.loadedAll[e]=!0);const c=l.dialogs.length;if(t(`will render ${c} dialogs`),c){const t=("top"===e?l.dialogs.slice().reverse():l.dialogs).map((e=>this.sortedList.add(this.getDialogKey(e))));if(yield Promise.all(t).catch(),this.loadDialogsRenderPromise!==o)throw n}const h=l.dialogs["top"===e?0:c-1];h&&(this.offsets[e]=(0,Le.Z)(h,this.indexKey)),this.loadedDialogsAtLeastOnce=!0,ut.onListLengthChange(),t("getDialogs",l,r.childElementCount),setTimeout((()=>{this.scrollable.onScroll()}),0),d&&d.detach(r.childElementCount)}catch(e){return"MIDDLEWARE"!==(null==e?void 0:e.type)&&t.error(e),s(e),void a.reject(e)}i()})))).finally((()=>{this.loadDialogsRenderPromise===o?(t("end"),this.loadDialogsRenderPromise=void 0):t("has been cleared")}));this.loadDialogsRenderPromise=o;const r=this.loadDialogsPromise=a.then((e=>({cached:e,renderPromise:o}))).finally((()=>{this.loadDialogsPromise===r&&(this.loadDialogsPromise=void 0)}));return r}setOffsets(){return tt(this,void 0,void 0,(function*(){const e=this.sortedList.list,[t,i]=yield Promise.all([this.getDialogFromElement(e.firstElementChild),this.getDialogFromElement(e.lastElementChild)]),{indexKey:s}=this;this.offsets.top=(0,Le.Z)(t,s),this.offsets.bottom=(0,Le.Z)(i,s)}))}getDialogKey(e){throw rt}getDialogKeyFromElement(e){throw rt}getRectFromForPlaceholder(){throw rt}getDialogFromElement(e){throw rt}loadDialogsInner(e){throw rt}setTyping(e){return tt(this,void 0,void 0,(function*(){const t=this.getDialogKey(e),i=this.getDialogDom(t);if(!i)return;const s=i.lastMessageSpan.querySelector(".peer-typing-container"),n=yield L.ZP.getPeerTyping(e.peerId,s,"forumTopic"===e._?e.id:void 0);!s&&n&&((0,F.Z)(i.lastMessageSpan,n),i.lastMessageSpan.classList.add("user-typing"))}))}unsetTyping(e){const t=this.getDialogKey(e),i=this.getDialogElement(t);i&&(i.dom.lastMessageSpan.classList.remove("user-typing"),ut.setLastMessageN({dialog:e,lastMessage:null,dialogElement:i,setUnread:null}))}getDialogDom(e){const t=this.sortedList.get(e);return null==t?void 0:t.dom}getDialogElement(e){const t=this.sortedList.get(e);return null==t?void 0:t.dialogElement}bindScrollable(){this.scrollable.container.addEventListener("scroll",this.onChatsRegularScroll),this.scrollable.onScrolledTop=this.onChatsScrollTop.bind(this),this.scrollable.onScrolledBottom=this.onChatsScroll.bind(this),this.scrollable.setVirtualContainer(this.sortedList.list)}clear(){var e;this.sortedList.clear(),null===(e=this.placeholder)||void 0===e||e.remove()}reset(){this.scrollable.loadedAll.top=!0,this.scrollable.loadedAll.bottom=!1,this.offsets.top=this.offsets.bottom=0,this.loadDialogsRenderPromise=void 0,this.loadDialogsPromise=void 0}fullReset(){return this.reset(),this.clear(),this.onChatsScroll()}destroy(){this.clear(),this.scrollable.destroy(),this.listenerSetter.removeAll()}}class lt extends dt{constructor(e,t){super(),this.peerId=e,this.paddingX=t,this.placeholderOptions={avatarSize:0,marginVertical:5,totalHeight:64},this.listenerSetter.add(n.Z)("peer_typings",(({peerId:e,threadId:t,typings:i})=>tt(this,void 0,void 0,(function*(){if(!t||this.peerId!==e)return;const s=yield this.managers.dialogsStorage.getForumTopic(e,t);s&&(i.length?this.setTyping(s):this.unsetTyping(s))})))),this.listenerSetter.add(n.Z)("dialogs_multiupdate",(e=>{for(const[t,{dialog:i,topics:s}]of e)t===this.peerId&&(null==s?void 0:s.size)&&s.forEach((e=>{this.updateDialog(e)}))})),this.listenerSetter.add(n.Z)("dialog_unread",(({dialog:e})=>{"forumTopic"===(null==e?void 0:e._)&&e.peerId===this.peerId&&ut.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))})})),this.listenerSetter.add(n.Z)("dialog_notify_settings",(e=>tt(this,void 0,void 0,(function*(){if(e.peerId===this.peerId)if("dialog"!==e._)ut.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))});else{const e=[...this.sortedList.getAll().entries()],t=e.map((([e])=>this.managers.dialogsStorage.getForumTopic(this.peerId,e))),i=yield Promise.all(t);e.forEach((([e,t],s)=>{ut.setUnreadMessagesN({dialog:i[s],dialogElement:t.dialogElement})}))}})))),this.listenerSetter.add(n.Z)("dialog_drop",(e=>{"forumTopic"===e._&&e.peerId===this.peerId&&this.deleteDialogByKey(this.getDialogKey(e))})),this.listenerSetter.add(n.Z)("dialog_draft",(({dialog:e,drop:t,peerId:i})=>{"forumTopic"===e._&&e.peerId===this.peerId&&(t?this.deleteDialog(e):this.updateDialog(e))}))}isDialogMustBeInViewport(e){return!e.pFlags.hidden&&super.isDialogMustBeInViewport(e)}getDialogKey(e){return e.id}getDialogKeyFromElement(e){return+e.dataset.threadId}getRectFromForPlaceholder(){return()=>{const e=x.ZP.rect;return{top:56,right:e.right,bottom:0,left:this.paddingX,width:e.width-this.paddingX,height:e.height-56}}}getDialogFromElement(e){return this.managers.dialogsStorage.getForumTopic(+e.dataset.peerId,+e.dataset.threadId)}loadDialogsInner(e){return tt(this,void 0,void 0,(function*(){const{indexKey:t}=this;let i=$.Z.height/64*1.25|0,s=0;const n=this.peerId,{index:a}=this.getOffsetIndex(e);if(s=a,a)if("top"===e){const e=yield this.managers.dialogsStorage.getFolderDialogs(n,!0),o=e.findIndex((e=>(0,Le.Z)(e,t)<=a)),r=Math.max(0,o-i);i=o-r,s=(0,Le.Z)(e[r],t)+1}else s=a;return this.managers.acknowledged.dialogsStorage.getDialogs({offsetIndex:s,limit:i,filterId:n,skipMigrated:!0})}))}}class ct extends dt{constructor(e){super(),this.filterId=e,this.needPlaceholderAtFirstTime=!0,this.listenerSetter.add(n.Z)("peer_typings",(({peerId:e,typings:t})=>tt(this,void 0,void 0,(function*(){const[i,s]=yield Promise.all([this.managers.appMessagesManager.getDialogOnly(e),this.managers.appPeersManager.isForum(e)]);i&&!s&&(t.length?this.setTyping(i):this.unsetTyping(i))})))),this.listenerSetter.add(n.Z)("user_update",(e=>tt(this,void 0,void 0,(function*(){if(!this.isActive)return;const t=e.toPeerId(),i=this.getDialogDom(t);if(!i)return;const s=yield this.managers.appUsersManager.getUserStatus(e),n="userStatusOnline"===(null==s?void 0:s._);this.setOnlineStatus(i.avatarEl,n)})))),this.listenerSetter.add(n.Z)("chat_update",(e=>tt(this,void 0,void 0,(function*(){const t=e.toPeerId(!0);this.processDialogForCallStatus(t)})))),this.listenerSetter.add(n.Z)("dialog_flush",(({dialog:e})=>{this.isActive&&e&&(ut.setLastMessageN({dialog:e,setUnread:!0}),this.validateDialogForFilter(e))})),this.listenerSetter.add(n.Z)("dialogs_multiupdate",(e=>{var t;if(this.isActive)for(const[i,{dialog:s,topics:n}]of e)"dialog"===(null==s?void 0:s._)&&(this.updateDialog(s),null===(t=ut.processContact)||void 0===t||t.call(ut,i.toPeerId()),this.validateDialogForFilter(s))})),this.listenerSetter.add(n.Z)("dialog_drop",(e=>{var t;this.isActive&&"dialog"===e._&&(this.deleteDialogByKey(e.peerId),null===(t=ut.processContact)||void 0===t||t.call(ut,e.peerId))})),this.listenerSetter.add(n.Z)("dialog_unread",(({dialog:e})=>{this.isActive&&"dialog"===(null==e?void 0:e._)&&(ut.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))}),this.validateDialogForFilter(e))})),this.listenerSetter.add(n.Z)("dialog_notify_settings",(e=>{this.isActive&&"forumTopic"!==e._&&(this.validateDialogForFilter(e),ut.setUnreadMessagesN({dialog:e,dialogElement:this.getDialogElement(this.getDialogKey(e))}))})),this.listenerSetter.add(n.Z)("dialog_draft",(({dialog:e,drop:t,peerId:i})=>{var s;this.isActive&&"forumTopic"!==e._&&(t?this.deleteDialog(e):this.updateDialog(e),null===(s=ut.processContact)||void 0===s||s.call(ut,i))})),this.listenerSetter.add(n.Z)("filter_update",(e=>tt(this,void 0,void 0,(function*(){if(this.isActive&&e.id===this.filterId&&!p.DZ.has(e.id)){const e=yield this.managers.dialogsStorage.getCachedDialogs(!0);yield this.validateListForFilter();for(let t=0,i=e.length;t(0,Le.Z)(e,i)<=o)),r=Math.max(0,a-s);s=a-r,n=(0,Le.Z)(e[r],i)+1}else n=o;const r=this.managers.acknowledged.dialogsStorage.getDialogs({offsetIndex:n,limit:s,filterId:t,skipMigrated:!0}),d=yield r;return a&&(d.result=Promise.reject((0,He.Z)("MIDDLEWARE"))),d}))}setOnlineStatus(e,t){const i="is-online",s=e.classList.contains(i);!s&&t&&e.classList.add(i),(0,I.Z)({element:e,className:"is-visible",forwards:t,duration:250,onTransitionEnd:t?void 0:()=>{e.classList.remove(i)},useRafs:t&&!s?2:0})}generateScrollable(e,t){const i=t.id,s=new y.ZP(null,"CL",500);s.container.dataset.filterId=""+i;const a=(0,Se.Z)(t.localId),o=new nt({managers:n.Z.managers,log:this.log,list:e,indexKey:a,onListLengthChange:ut.onListLengthChange});return this.scrollable=s,this.sortedList=o,this.setIndexKey(a),this.bindScrollable(),s}testDialogForFilter(e){return p.DZ.has(this.filterId)?this.filterId===e.folder_id:void 0!==(0,Le.Z)(e,this.indexKey)}isDialogMustBeInViewport(e){return!(void 0!==e.migratedTo||!this.testDialogForFilter(e))&&super.isDialogMustBeInViewport(e)}validateListForFilter(){return tt(this,void 0,void 0,(function*(){this.sortedList.getAll().forEach((e=>tt(this,void 0,void 0,(function*(){const t=yield n.Z.managers.appMessagesManager.getDialogOnly(e.id);this.testDialogForFilter(t)||this.deleteDialog(t)}))))}))}validateDialogForFilter(e){this.getDialogElement(e.peerId)&&(this.testDialogForFilter(e)||this.deleteDialog(e))}setCallStatus(e,t){let{callIcon:i,listEl:s}=e;if(!i&&t){const{canvas:t,startAnimation:n}=e.callIcon=i=function(e=!1){const t=document.createElement("canvas");t.width=t.height=ne;const i=t.getContext("2d"),s=(ne-(3*oe+2*ae))/2,n=Date.now();let a=!1;const o=()=>{if(t.isConnected)a||(a=t.isConnected);else if(a)return!1;const o=ee((Date.now()-n)%1e3,0,1,1e3);i.clearRect(0,0,ne,ne),i.fillStyle=e&&!te.Z.isMobile?J.Z.getProperty("primary-color"):"#fff";for(let e=0;e<3;++e){let t;t=o>=.5?e%2?2-2*o:2*(o-.5):e%2?2*o:1-2*o;let n=4+8*t;n*=se,ie(i,s+e*oe+e*ae,(ne-n)/2,oe,n,re,!0)}return!0};return{canvas:t,startAnimation:()=>{(0,X.jt)(o),o()},setActive:t=>{e=t,o()}}}(s.classList.contains("active"));t.classList.add("dialog-group-call-icon"),s.append(t),n()}i&&(0,I.Z)({element:e.callIcon.canvas,className:"is-visible",forwards:t,duration:250,onTransitionEnd:t?void 0:()=>{e.callIcon.canvas.remove(),e.callIcon=void 0},useRafs:t?2:0})}processDialogForCallStatus(e,t){return tt(this,void 0,void 0,(function*(){if(!de.Z)return;if(t||(t=this.getDialogDom(e)),!t)return;const i=yield n.Z.managers.appChatsManager.getChat(e.toChatId());this.setCallStatus(t,!(!i.pFlags.call_active||!i.pFlags.call_not_empty))}))}onChatsScroll(e="bottom"){var t;return this.scrollable.loadedAll[e]&&(null===(t=ut.loadContacts)||void 0===t||t.call(ut)),this.log("onChatsScroll",e),super.onChatsScroll(e)}toggleAvatarUnreadBadges(e,t){if(!e)return void this.sortedList.getAll().forEach((e=>{const{dom:t,dialogElement:i}=e;t.unreadAvatarBadge&&i.toggleBadgeByKey("unreadAvatarBadge",!1,!1,!1)}));const i=["unread","mention"];this.sortedList.getAll().forEach((e=>{var t;const{dom:s,dialogElement:n}=e,a=null===(t=s.unreadBadge)||void 0===t?void 0:t.textContent;if(!a||s.unreadBadge.classList.contains("backwards"))return;const o=!!s.unreadAvatarBadge;n.createUnreadAvatarBadge(),n.toggleBadgeByKey("unreadAvatarBadge",!0,o),s.unreadAvatarBadge.textContent=a;const r=s.unreadAvatarBadge.classList,d=s.unreadBadge.classList;i.forEach((e=>{r.toggle(e,d.contains(e))}))}))}getDialogKey(e){return e.peerId}getDialogKeyFromElement(e){return+e.dataset.peerId}getDialogFromElement(e){return n.Z.managers.appMessagesManager.getDialogOnly(e.dataset.peerId.toPeerId())}}class ht{constructor(){this.chatsContainer=document.getElementById("chatlist-container"),this.log=(0,C.kg)("DIALOGS",C.v9.Log|C.v9.Error|C.v9.Warn|C.v9.Debug),this.folders={menu:document.getElementById("folders-tabs"),menuScrollContainer:null,container:document.getElementById("folders-container")},this.filtersRendered={},this.lastActiveElements=new Set,this.initedListeners=!1,this.xds={},this.onTabChange=()=>(this.xd=this.xds[this.filterId],this.xd.reset(),this.xd.onChatsScroll()),this._onListLengthChange=()=>{if(!this.xd.loadedDialogsAtLeastOnce)return;if(this.checkIfPlaceholderNeeded(),this.filterId!==p.J$)return;const e=this.chatList,t=e.childElementCount,i=e.parentElement.parentElement,s=e.parentElement.nextElementSibling,n=!!s.childElementCount;if(t>=10)return void(n&&this.removeContactsPlaceholder());if(n)return;i.classList.add("with-contacts");const a=new je.Z({name:"Contacts",noDelimiter:!0,fakeGradientDelimiter:!0});a.container.classList.add("hide"),this.managers.appUsersManager.getContactsPeerIds(void 0,void 0,"online").then((e=>{let t=!1;const i=()=>{t&&a.container.classList.toggle("hide",!s.list.childElementCount),this.updateContactsLength(!0)},s=new V.Z({avatarSize:"abitbigger",createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onListLengthChange:i,managers:this.managers});this.loadContacts=()=>{const t=$.Z.height/60|0;(0,Be.Z)(e.splice(0,t),this.verifyPeerIdForContacts).then((e=>{e.forEach((e=>{s.add(e)}))})),e.length||(this.loadContacts=void 0)},this.loadContacts(),this.processContact=e=>tt(this,void 0,void 0,(function*(){if(e.isAnyChat())return;const t=yield this.verifyPeerIdForContacts(e),i=s.has(e);!i&&t?s.add(e):i&&!t&&s.delete(e)}));const n=s.list;n.classList.add("chatlist-new"),this.setListClickListener(n),a.content.append(n),t=!0,i()})),s.append(a.container)},this.verifyPeerIdForContacts=e=>tt(this,void 0,void 0,(function*(){const[t,i]=yield Promise.all([this.managers.appPeersManager.isContact(e),this.managers.appMessagesManager.getDialogOnly(e)]);return t&&!i}))}start(){const e=this.managers=(0,Ce.Z)();this.contextMenu=new g(e),this.stateMiddlewareHelper=(0,Ue.k)(),this.folders.menuScrollContainer=this.folders.menu.parentElement,this.onListLengthChange=(0,Y.Z)(this._onListLengthChange,100,!1,!0);const t=document.createElement("div");t.classList.add("connection-status-bottom"),t.append(this.folders.container),this.forumsTabs=new Map,this.forumsSlider=document.createElement("div"),this.forumsSlider.classList.add("topics-slider"),this.chatsContainer.parentElement.parentElement.append(this.forumsSlider),K.Z&&(0,W.Z)({element:this.folders.container,onSwipe:e=>{const t=s.prevId();s(e<0?t+1:t-1)},verifyTouchTarget:()=>!this.forumTab}),this.allChatsIntlElement=new r.ZP.IntlElement({key:"FilterAllChatsShort"}),n.Z.addEventListener("premium_toggle",(e=>tt(this,void 0,void 0,(function*(){e||(yield this.managers.filtersStorage.isFilterIdAvailable(this.filterId))||s((0,Oe.Z)(this.filtersRendered[p.J$].menu),!1)})))),n.Z.addEventListener("state_cleared",(()=>{const e=p.DZ.has(this.filterId);Re.Z.getState().then((t=>tt(this,void 0,void 0,(function*(){this.xd.loadedDialogsAtLeastOnce=!1,this.showFiltersPromise=void 0,e&&(this.xd.clear(),this.onTabChange()),this.onStateLoaded(t)}))))})),this.setFilterId(p.J$,p.J$),this.addFilter({id:p.J$,title:"",localId:p.J$});const i=new y.v7(this.folders.menuScrollContainer);t.prepend(this.folders.menuScrollContainer);const s=this.selectTab=(0,v.X)(this.folders.menu,this.folders.container,((e,t)=>tt(this,void 0,void 0,(function*(){const i=e;if(e=+t.dataset.filterId||p.J$,-1!==this.filterId&&!p.DZ.has(e)&&!(yield this.managers.filtersStorage.isFilterIdAvailable(e)))return!1;const n=this.filterId;if(S.IS_MOBILE_SAFARI||(i?this.filtersNavigationItem||(this.filtersNavigationItem={type:"filters",onPop:()=>{s(0),this.filtersNavigationItem=void 0}},le.Z.spliceItems(1,0,this.filtersNavigationItem)):this.filtersNavigationItem&&(le.Z.removeItem(this.filtersNavigationItem),this.filtersNavigationItem=void 0)),n===e)return;this.xds[e].clear();const a=this.setFilterIdAndChangeTab(e).then((({cached:e,renderPromise:t})=>{if(e)return t}));return-1!==n?a:void 0}))),(()=>{for(const e in this.xds)+e!==this.filterId&&this.xds[e].clear()}),void 0,i);Re.Z.getState().then((e=>(ce.Z.setPlaybackParams(e.playbackParams),ce.Z.addEventListener("playbackParams",(e=>{this.managers.appStateManager.pushToState("playbackParams",e)})),this.onStateLoaded(e)))),te.Z.addEventListener("resize",(()=>{this.changeFiltersAllChatsKey()})),new H(this.managers,this.chatsContainer),this.chatsContainer.append(t),setTimeout((()=>{Z.Z.loadLottieWorkers()}),200),pe.Z.MANAGERS=n.Z.managers=e,Ze.Z.construct(e),x.ZP.construct(e),ue.ZP.construct(e),ke.ZP.construct(e),Te.Z.construct(e),L.ZP.construct(e),this.xd=this.xds[this.filterId]}get chatList(){return this.xd.sortedList.list}setFilterId(e,t){this.filterId=e}setFilterIdAndChangeTab(e){return tt(this,void 0,void 0,(function*(){return this.filterId=e,this.onTabChange()}))}initListeners(){n.Z.addEventListener("dialog_flush",(({dialog:e})=>{e&&this.setFiltersUnreadCount()})),n.Z.addEventListener("folder_unread",(e=>tt(this,void 0,void 0,(function*(){if(e.id<0){const t=this.xd.getDialogElement(e.id);if(!t)return;this.setUnreadMessagesN({dialog:yield this.managers.dialogsStorage.getDialogOnly(e.id),dialogElement:t})}else this.setFilterUnreadCount(e.id)})))),n.Z.addEventListener("contacts_update",(e=>{var t;null===(t=this.processContact)||void 0===t||t.call(this,e.toPeerId())})),L.ZP.addEventListener("peer_changed",(({peerId:e,threadId:t,isForum:i})=>{const s={peerId:e,threadId:i?t:void 0};for(const e of this.lastActiveElements){const t=+e.dataset.threadId||void 0,i=e.dataset.peerId.toPeerId();L.ZP.isSamePeer({peerId:i,threadId:t},s)||this.setDialogActive(e,!1)}Array.from(document.querySelectorAll(`[data-autonomous="0"] .chatlist-chat[data-peer-id="${e}"]`)).forEach((t=>{const i=+t.dataset.threadId||void 0;L.ZP.isSamePeer({peerId:e,threadId:i},s)&&this.setDialogActive(t,!0)}))})),n.Z.addEventListener("filter_update",(e=>tt(this,void 0,void 0,(function*(){if(p.DZ.has(e.id))return;if(!this.filtersRendered[e.id])return void this.addFilter(e);const t=this.filtersRendered[e.id];(0,he.Z)(t.title,(0,me.Z)(e.title))})))),n.Z.addEventListener("filter_delete",(e=>{const t=this.filtersRendered[e.id];t&&(t.container.remove(),t.menu.remove(),this.xds[e.id].destroy(),delete this.xds[e.id],delete this.filtersRendered[e.id],this.onFiltersLengthChange(),this.filterId===e.id&&this.selectTab(0,!1))})),n.Z.addEventListener("filter_order",(e=>tt(this,void 0,void 0,(function*(){e=e.slice(),(0,Ne.Z)(e,p.Zi);const t=this.folders.menu,i=yield Promise.all(e.map((e=>tt(this,void 0,void 0,(function*(){const[t,i]=yield Promise.all([this.managers.dialogsStorage.getDialogIndexKeyByFilterId(e),this.managers.filtersStorage.getFilter(e)]);return{indexKey:t,filter:i}})))));e.forEach(((e,s)=>{const{indexKey:n,filter:a}=i[s],o=this.filtersRendered[e];this.xds[e].setIndexKey(n),(0,_.Z)(o.menu,t,a.localId),(0,_.Z)(o.container,this.folders.container,a.localId)}))}))))}setDialogActive(e,t){var i;const s=e.dialogDom;e.classList.toggle("active",t),e.classList.toggle("is-forum-open",(null===(i=this.forumTab)||void 0===i?void 0:i.peerId)===e.dataset.peerId.toPeerId()&&!e.dataset.threadId),t?this.lastActiveElements.add(e):this.lastActiveElements.delete(e),(null==s?void 0:s.callIcon)&&s.callIcon.setActive(t)}onStateLoaded(e){return tt(this,void 0,void 0,(function*(){this.stateMiddlewareHelper.clean();const t=this.stateMiddlewareHelper.get(),i=e.filtersArr,s=i.length>p.DZ.size,n=e=>{for(const t of e)this.addFilter(t)};let a;s?n(i):a=this.managers.filtersStorage.getDialogFilters().then(n),this.doNotRenderChatList=!0;const o=this.xd.onChatsScroll(),r=(0,Pe.Z)(t);try{yield r(o)}catch(e){}s||this.selectTab(0,!1),a&&(yield r(a)),this.doNotRenderChatList=void 0,this.filterId=-1,this.selectTab(0,!1),this.initedListeners||(this.initListeners(),this.initedListeners=!0),s&&this.showFiltersPromise&&(yield r(this.showFiltersPromise)),this.managers.appNotificationsManager.getNotifyPeerTypeSettings(),yield(yield r(o)).renderPromise.catch(xe.Z),this.managers.appMessagesManager.fillConversations()}))}setFilterUnreadCount(e){var t;return tt(this,void 0,void 0,(function*(){const i=null===(t=this.filtersRendered[e])||void 0===t?void 0:t.unread;if(!i)return;const{unreadUnmutedCount:s,unreadCount:n}=yield this.managers.dialogsStorage.getFolderUnreadCount(e);i.classList.toggle("badge-gray",!s);const a=e===p.J$?s:n;i.innerText=a?""+a:""}))}setFiltersUnreadCount(){for(const e in this.filtersRendered)this.setFilterUnreadCount(+e)}l(e){const t=this.createChatList(),i=this.xds[e.id]=new ct(e.id),s=i.generateScrollable(t,e);return this.setListClickListener(t,null,!0),{ul:t,xd:i,scrollable:s}}addFilter(e){if(e.id===p.Zi)return;const t=this.folders.menu,i=this.filtersRendered[e.id];if(i)return(0,_.Z)(i.menu,t,e.localId),void(0,_.Z)(i.container,this.folders.container,e.localId);const s=document.createElement("div");s.classList.add("menu-horizontal-div-item");const n=document.createElement("span"),a=document.createElement("span");a.classList.add("text-super"),e.id===p.J$?a.append(this.allChatsIntlElement.element):(0,he.Z)(a,(0,me.Z)(e.title));const o=document.createElement("div");o.classList.add("badge","badge-20","badge-primary");const r=document.createElement("i");n.append(a,o,r),(0,b.Z)(s),s.append(n),s.dataset.filterId=""+e.id,(0,_.Z)(s,t,e.localId);const{ul:d,scrollable:l}=this.l(e);l.container.classList.add("tabs-tab","chatlist-parts");const c=document.createElement("div");c.classList.add("chatlist-top");const h=document.createElement("div");h.classList.add("chatlist-bottom"),c.append(d),l.container.append(c,h);const u=l.container;(0,_.Z)(l.container,this.folders.container,e.localId),this.filtersRendered[e.id]={menu:s,container:u,unread:o,title:a},this.onFiltersLengthChange()}changeFiltersAllChatsKey(){const e=this.folders.menuScrollContainer.firstElementChild,t=e.scrollWidth>e.clientWidth?"FilterAllChatsShort":"FilterAllChats";this.allChatsIntlElement.compareAndUpdate({key:t})}onFiltersLengthChange(){let e=this.showFiltersPromise;return null!=e?e:e=this.showFiltersPromise=(0,De.Z)(0).then((()=>{if(this.showFiltersPromise!==e)return;const t=Object.keys(this.filtersRendered).length>1,i=!this.folders.menuScrollContainer.classList.contains("hide");t!==i&&(this.folders.menuScrollContainer.classList.toggle("hide",!t),t&&!i&&this.setFiltersUnreadCount(),this.chatsContainer.classList.toggle("has-filters",t)),this.changeFiltersAllChatsKey(),this.showFiltersPromise=void 0}))}generateEmptyPlaceholder(e){const t="empty-placeholder",i=document.createElement("div");i.classList.add(t,t+"-"+e.classNameType);const s=document.createElement("div");s.classList.add(t+"-header"),(0,r.$d)(s,e.title);const n=document.createElement("div");return n.classList.add(t+"-subtitle"),e.subtitle&&(0,r.$d)(n,e.subtitle,e.subtitleArgs),i.append(s,n),{container:i,header:s,subtitle:n}}checkIfPlaceholderNeeded(){if(this.filterId===p.Zi)return;const e=this.chatList,t=e.parentElement;let i=Array.from(t.children).find((e=>e.matches(".empty-placeholder")));const s=this.xd.scrollable.loadedAll.bottom&&!e.childElementCount;if(s&&i)return;if(!s)return void(i&&(t.classList.remove("with-placeholder"),i.remove()));let n,a;if(this.filterId){n=this.generateEmptyPlaceholder({title:"FilterNoChatsToDisplay",subtitle:"FilterNoChatsToDisplayInfo",classNameType:a="folder"}),i=n.container;const e=document.createElement("div"),t="📂",s=128;(0,we.Z)({div:e,emoji:t,width:s,height:s}),i.prepend(e);const o=(0,E.Z)("btn-primary btn-color-primary btn-control tgico",{text:"FilterHeaderEdit",icon:"settings"});(0,A.fc)(o,(()=>tt(this,void 0,void 0,(function*(){const e=x.ZP.createTab(T.Z);e.setInitFilter(yield this.managers.filtersStorage.getFilter(this.filterId)),e.open()})))),i.append(o)}else{n=this.generateEmptyPlaceholder({title:"ChatList.Main.EmptyPlaceholder.Title",classNameType:a="dialogs"}),i=n.container;const e=document.createElement("img");e.classList.add("empty-placeholder-dialogs-icon"),this.emptyDialogsPlaceholderSubtitle=new r.ZP.IntlElement({element:n.subtitle}),Promise.all([this.updateContactsLength(!1),(0,j.cj)(e,"assets/img/EmptyChats.svg"),(0,G.AD)()]).then((([e])=>{i.classList.add("visible"),t.classList.toggle("has-contacts",!!e)})),i.prepend(e)}t.append(i),t.classList.add("with-placeholder"),t.dataset.placeholderType=a}updateContactsLength(e){var t;return null!==(t=this.updateContactsLengthPromise)&&void 0!==t?t:this.updateContactsLengthPromise=this.managers.appUsersManager.getContacts().then((t=>{const i=this.emptyDialogsPlaceholderSubtitle;if(i){let e,s;t.length?(e="ChatList.Main.EmptyPlaceholder.Subtitle",s=[(0,r.ag)("Contacts.Count",[t.length])]):(e="ChatList.Main.EmptyPlaceholder.SubtitleNoContacts",s=[]),i.compareAndUpdate({key:e,args:s})}return e&&this.chatList.parentElement.classList.toggle("has-contacts",!!t.length),this.updateContactsLengthPromise=void 0,t.length}))}removeContactsPlaceholder(){const e=this.chatList,t=e.parentElement.parentElement,i=e.parentElement.nextElementSibling;t.classList.remove("with-contacts"),i.replaceChildren(),this.loadContacts=void 0,this.processContact=void 0}toggleForumTab(e,t=this.forumTab){return tt(this,void 0,void 0,(function*(){if(!t&&!e)return;if(t){const e=this.xd.getDialogElement(t.peerId);e&&e.dom.listEl.classList.remove("is-forum-open")}t===e&&(e=void 0),null==t||t.toggle(!1);const i=null==e?void 0:e.toggle(!0);if(t===this.forumTab&&(this.forumTab=e),e){const t=this.xd.getDialogElement(e.peerId);t&&t.dom.listEl.classList.add("is-forum-open"),L.ZP.selectTab(L.oo.CHATLIST)}i&&(yield i),e&&!this.forumNavigationItem?(this.forumNavigationItem={type:"forum",onPop:()=>{this.forumNavigationItem=void 0,this.toggleForumTab()}},le.Z.pushItem(this.forumNavigationItem)):!e&&this.forumNavigationItem&&(le.Z.removeItem(this.forumNavigationItem),this.forumNavigationItem=void 0);const s=!!e,n=i?2:void 0;this.xd.toggleAvatarUnreadBadges(s,n);const a=(0,Ie.Z)();(0,I.Z)({element:this.forumsSlider.parentElement,className:"is-forum-visible",duration:300,forwards:s,useRafs:n,onTransitionEnd:()=>{a.resolve()}}),(0,Ye.YW)(a,300).then((()=>a.resolve()))}))}toggleForumTabByPeerId(e,t){const{managers:i}=this,s=x.ZP.getHistory(),n=s[s.length-1];let a;if(n)return n instanceof ot&&n.peerId===e&&t?void Xe(n.container):(a=x.ZP.createTab(ot),void a.open({peerId:e,managers:i}));a=this.forumsTabs.get(e);const o=this.forumTab&&this.forumTab===a;if(null!=t||(t=!o),t!==o)return t&&!a&&(a=new ot(void 0),a.init({peerId:e,managers:i}),this.forumsTabs.set(e,a),this.forumsSlider.append(a.container),a.managers=this.managers,a.eventListener.addEventListener("destroy",(()=>{this.forumsTabs.delete(e)}))),this.toggleForumTab(a);t&&Xe(a.container)}setListClickListener(e,t,i=!1,s=!1,n=!1){let a;const o=(n?L.ZP.setInnerPeer:L.ZP.setPeer).bind(L.ZP);e.dataset.autonomous=""+ +s,e.addEventListener("mousedown",(i=>{if(0!==i.button)return;this.log("dialogs click list");const n=i.target,r=(0,d.Z)(n,it);if(!r)return;const l=r.dataset.peerId.toPeerId(),c=+r.dataset.mid||void 0,h=+r.dataset.threadId||void 0;if(null==t||t(),!r.querySelector(".is-forum")||i.shiftKey||c){if(i.ctrlKey||i.metaKey)return window.open(r.href||"#"+l,"_blank"),void(0,O.Z)(i);s&&(a&&!(a===r)&&a.classList.remove("active"),r&&(r.classList.add("active"),a=r,this.lastActiveElements.add(r))),h&&!c||this.xd.sortedList.list!==e||this.xd===this.xds[p.Zi]||this.toggleForumTab(),o({peerId:l,lastMsgId:c,threadId:h})}else this.toggleForumTabByPeerId(l)}),{capture:!0}),e.addEventListener("click",(e=>{0===e.button&&(0,O.Z)(e)}),{capture:!0}),i&&(0,Ee.E)({element:e,callback:this.contextMenu.onContextMenu})}createChatList(e={}){const t=document.createElement("ul");return t.classList.add("chatlist"),e.new&&t.classList.add("chatlist-new"),e.dialogSize&&t.classList.add("chatlist-"+e.dialogSize),t}setLastMessageN(e){return this.setLastMessage(e).catch((e=>{"MIDDLEWARE"!==(null==e?void 0:e.type)&&this.log.error("set last message error",e)}))}setLastMessage({dialog:e,lastMessage:t,dialogElement:i,highlightWord:s,isBatch:a=!1,setUnread:o=!1}){var d,l;return tt(this,void 0,void 0,(function*(){if(!i&&!(i=this.xd.getDialogElement(e.peerId)))return;const{dom:c}=i,{peerId:h}=e,{deferred:u,middleware:p}=st(c,"setLastMessagePromise");let f;if(!t&&("draftMessage"!==(null===(d=e.draft)||void 0===d?void 0:d._)||h.isAnyChat()&&"forumTopic"!==e._&&(yield this.managers.appPeersManager.isForum(h))||(f=e.draft),(null==(t=e.topMessage)?void 0:t.mid)!==e.top_message)){const i=this.managers.appMessagesManager.getMessageByPeer(h,e.top_message);t=yield p(i)}if(this.setUnreadMessagesN({dialog:e,dialogElement:i,isBatch:a,setLastMessagePromise:u}),!t)return c.lastMessageSpan.replaceChildren(),c.lastTimeSpan.replaceChildren(),delete c.listEl.dataset.mid,void u.resolve();const m=t&&(0,ve.Z)(t);{let e;const i=[];if(t&&!f&&!m){const s=(0,be.Z)(t),n=new Set(["video","gif","round"]);if(s&&("photo"===s._||n.has(s.type))){const a=(0,fe.Z)(s,20,20);if("photoSizeEmpty"!==a._&&(e=document.createElement("div"),e.classList.add("dialog-subtitle-media"),"round"===s.type&&e.classList.add("is-round"),i.push((0,k.Z)({photo:s,message:t,container:e,withoutPreloader:!0,size:a}).then((()=>e))),n.has(s.type))){const t=document.createElement("span");t.classList.add("tgico-play"),e.append(t)}}}if(f){const e=document.createElement("span");e.classList.add("danger"),e.append((0,r.ag)("Draft"),": "),i.unshift(e)}else if(h.isAnyChat()&&h!==t.fromId&&!t.action){const e=document.createElement("span");if(e.classList.add("primary-text"),t.fromId===n.Z.myId)e.append((0,r.ag)("FromYou")),i.unshift(e);else{const s=p((0,Me.Z)({peerId:t.fromId,onlyFirstName:!0})).then((t=>(e.prepend(t),e)),xe.Z);i.unshift(s)}e.append(": ")}const a=!!e&&!!(null==t?void 0:t.message);let o;if(o=s&&t.message?yield p((0,ge.Z)({message:t,highlightWord:s,withoutMediaType:a})):f?yield p((0,ge.Z)({message:f})):t?yield p((0,ge.Z)({message:t,withoutMediaType:a})):document.createDocumentFragment(),i.length){const e=yield p(Promise.all(i));o.prepend(...e)}(0,F.Z)(c.lastMessageSpan,o)}if(t||f){const e=f?Math.max(f.date,t.date||0):t.date;(0,F.Z)(c.lastTimeSpan,(0,w.zM)(new Date(1e3*e)))}else c.lastTimeSpan.textContent="";if(null!==o&&!o){c.listEl.dataset.mid=""+t.mid;const e=t.reply_to;(null===(l=null==e?void 0:e.pFlags)||void 0===l?void 0:l.forum_topic)&&(c.listEl.dataset.threadId=""+(0,$e.Z)(t))}u.resolve()}))}setUnreadMessagesN(e){return this.setUnreadMessages(e).catch((()=>{}))}setUnreadMessages({dialog:e,dialogElement:t,isBatch:i=!1,setLastMessagePromise:s}){var a;return tt(this,void 0,void 0,(function*(){const{dom:o}=t;if(!o)return;const r="forumTopic"===e._,{deferred:d,middleware:l}=st(o,"setUnreadMessagePromise"),{peerId:c}=e,h=Promise.all([this.managers.appNotificationsManager.isPeerLocalMuted({peerId:c,respectType:!0,threadId:r?e.id:void 0}),"draftMessage"!==(null===(a=e.draft)||void 0===a?void 0:a._)?this.managers.appMessagesManager.getMessageByPeer(c,e.top_message):void 0,r?!!e.pFlags.pinned:this.managers.dialogsStorage.isDialogPinned(c,this.filterId),this.managers.appMessagesManager.isDialogUnread(e),c.isAnyChat()&&!r?this.managers.acknowledged.dialogsStorage.getForumUnreadCount(c).then((i=>i.cached?i.result:(i.result.then((()=>{this.setUnreadMessagesN({dialog:e,dialogElement:t})})),{count:0,hasUnmuted:!1}))).catch((()=>{})):void 0]);let[u,f,m,g,v]=yield l(h);const b=o.listEl.classList.contains("is-muted"),{count:y,hasUnmuted:w}=v||{};let S;f&&f.pFlags.out&&f.peerId!==n.Z.myId&&(S=f);const C=null!=y?y:e.unread_count;void 0!==y&&(g=!!C),r&&!g&&(g=!(0,et.Z)(e.read_inbox_max_id));const L=m||g,E=this.xd!==this.xds[p.Zi]&&!r&&!!this.forumTab&&this.xd.getDialogElement(c)===t&&g;if(s)try{yield l(s)}catch(e){return}const M=i?0:250;o.listEl.classList.toggle("no-unmuted-topic",!u&&void 0!==w&&!w),u!==b&&(0,I.Z)({element:o.listEl,className:"is-muted",forwards:u,duration:M}),function(e,t,i){let s;if("string"==typeof t?s=t:(null==t?void 0:t.pFlags.out)&&(s=t.error?"sendingerror":t.pFlags.is_outgoing?"sending":t.pFlags.unread?"check":"checks"),!s)return void(e.textContent="");const n="tgico-"+s,a=e.lastElementChild;if(a&&a.classList.contains(n))return;const o=document.createElement("i");o.classList.add("sending-status-icon",n),e.append(o),a&&a.remove()}(o.statusSpan,r&&e.pFlags.closed?"premium_lock":S);const P=!!o.unreadBadge;L&&t.createUnreadBadge();const Z=!!o.unreadAvatarBadge;E&&t.createUnreadAvatarBadge();const k=e.unread_mentions_count&&(e.unread_mentions_count>1||e.unread_count>1),T=!!o.mentionsBadge;if(k&&t.createMentionsBadge(),[["unreadBadge",L,P],["unreadAvatarBadge",E,Z],["mentionsBadge",k,T]].forEach((([e,s,n])=>{o[e]&&t.toggleBadgeByKey(e,s,n,i)})),!L)return void d.resolve();m?o.unreadBadge.classList.add("tgico-chatspinned","tgico"):o.unreadBadge&&o.unreadBadge.classList.remove("tgico-chatspinned","tgico");let x,A=!0,_=!1;if(e.unread_mentions_count&&1===C?(x="@",_=!0):g?x=""+(C?(0,qe.Z)(C,1):" "):(x="",A=!1),r){const e=g&&" "===x;o.unreadBadge.classList.toggle("not-visited",e)}[[o.unreadBadge,x],[o.unreadAvatarBadge,x||void 0]].filter(Boolean).forEach((([e,t])=>{void 0!==t&&(e.innerText=x),e.classList.toggle("unread",A),e.classList.toggle("mention",_)})),d.resolve()}))}getDialog(e,t){return tt(this,void 0,void 0,(function*(){if("object"!=typeof e){let i;if(t){if(i=yield this.managers.dialogsStorage.getForumTopic(e,t),!i)return{peerId:e||p.NM,pFlags:{}}}else if(i=yield this.managers.appMessagesManager.getDialogOnly(e),!i){const t=e||p.NM;return{peerId:t,peer:yield this.managers.appPeersManager.getOutputPeer(t),pFlags:{}}}return i}return e}))}addListDialog(e){var t;e.autonomous=!1;const i=this.addDialogNew(e);if(i){const{peerId:s}=e,a=this.getDialog(s,e.threadId).then((t=>{const a=[],o=s.isUser();return o||"dialog"!==t._||a.push(this.xd.processDialogForCallStatus(s,i.dom)),s!==n.Z.myId&&o&&a.push(this.managers.appUsersManager.getUserStatus(s.toUserId()).then((e=>{"userStatusOnline"===(null==e?void 0:e._)&&this.xd.setOnlineStatus(i.dom.avatarEl,!0)}))),a.push(this.setLastMessageN({dialog:t,dialogElement:i,isBatch:e.isBatch,setUnread:!0})),Promise.all(a)}));null===(t=e.loadPromises)||void 0===t||t.push(a)}return i}addDialogAndSetLastMessage(e){const{peerId:t,message:i,query:s}=e,n=this.addDialogNew(Object.assign(Object.assign(Object.assign({},e),(0,ye.Z)(i)),{peerId:t}));return this.setLastMessageN({dialog:{_:"dialog",peerId:t},lastMessage:i,dialogElement:n,highlightWord:s}),i.peerId!==t&&(n.dom.listEl.dataset.peerId=""+i.peerId),n}addDialogNew(e){const t=new at(Object.assign({autonomous:!!e.container,avatarSize:"bigger"},e));if(e.container){const i=e.append?"prepend":"append";e.container[i](t.container)}return t}}const ut=new ht;M.GO.appDialogsManager=ut;const pt=ut},2312:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(3725),n=i(2202),a=i(3512),o=i(410),r=i(319),d=i(1243),l=i(7086),c=i(1655),h=i(5471),u=i(8801),p=i(6658),f=i(7667),m=i(3855);const g=new class{constructor(){this.downloads={},this.progress={}}construct(e){this.managers=e,a.Z.addEventListener("download_progress",(e=>{var t;const i=this.downloads[e.fileName];(null===(t=null==i?void 0:i.main)||void 0===t?void 0:t.notifyAll)&&(this.progress[e.fileName]=e,i.main.notifyAll(e))}))}getNewDeferred(e,t){const i=(0,s.Z)();let n=this.downloads[e];if(n){const e=n.main;["cancel","addNotifyListener","notify","notifyAll"].forEach((t=>{e[t]&&(i[t]=e[t].bind(e))}))}else n=this.downloads[e]={main:i},i.cancel=()=>{const t=(0,h.Z)("DOWNLOAD_CANCELED");this.managers.apiFileManager.cancelDownload(e),i.reject(t),i.cancel=r.Z},i.catch((()=>{this.clearDownload(e,t)})).finally((()=>{delete this.progress[e]}));return"disc"===t&&i.catch(r.Z).finally((()=>{this.clearDownload(e,t)})),n[t]=i}getNewDeferredForUpload(e,t){const i=this.getNewDeferred(e);return t.then(i.resolve,i.reject),i.finally((()=>{this.clearDownload(e)})),i}clearDownload(e,t){const i=this.downloads[e];if(!i)return;delete i[t];const s=Object.keys(i).length;(!s||i.main&&1===s)&&delete this.downloads[e]}getUpload(e){let t=this.getDownload(e);return t||(t=this.getNewDeferred(e),this.managers.appMessagesManager.getUploadPromise(e).then(t.resolve,t.reject),t)}d(e,t,i){let s=this.getDownload(e,i);return s||(s=this.getNewDeferred(e,i),t().then(s.resolve,s.reject),s)}download(e){const t=(0,l.Z)(e);return this.d(t,(()=>this.managers.apiFileManager.download(e)),"blob")}downloadMedia(e,t="blob",i){const{downloadOptions:s,fileName:n}=(0,d.Z)(e);return this.d(n,(()=>{let s;return s="url"===t?this.managers.apiFileManager.downloadMediaURL:"void"===t?this.managers.apiFileManager.downloadMediaVoid:this.managers.apiFileManager.downloadMedia,i?i.then((()=>s(e))):s(e)}),t)}downloadMediaURL(e){return this.downloadMedia(e,"url")}downloadMediaVoid(e){return this.downloadMedia(e,"void")}upload(e,t,i){return t||(t=(0,n.Z)(e)),i||(i=this.managers.apiFileManager.upload({file:e,fileName:t})),this.getNewDeferredForUpload(t,i)}getDownload(e,t){const i=this.downloads[e];return i&&i[t]}downloadToDisc(e,t){const i=e.media,s="document"===i._;s||e.thumb||(e.thumb=i.sizes.slice().pop());const n=""+(2147483647*Math.random()|0),a=`download/${n}`;e.downloadId=n;const o=m.Z.pingServiceWorkerWithIframe(),d=this.downloadMedia(e,"disc",o);if(t)return d;const l=document.createElement("iframe");l.hidden=!0,o.then((()=>{l.src=a,document.body.append(l)}));let h,g=!1;const v=()=>{g||(g=!0,h=l,(0,c.Z)(d.listeners,v))};return d.addNotifyListener(v),d.then((t=>{if(!t)return;const n=URL.createObjectURL(t),a=s?(0,p.Z)(i):(0,f.Z)(i,e.thumb),o=e.media.file_name||(0,u.P)(a.location);!function(e,t,i){const s=document.createElement("a");s.href=e,s.download=t,s.target="_blank",s.style.position="absolute",s.style.top="1px",s.style.left="1px",document.body.append(s);try{const e=document.createEvent("MouseEvents");e.initMouseEvent("click",!0,!1,window,0,0,0,0,0,!1,!1,!1,!1,0,null),s.dispatchEvent(e)}catch(t){console.error("Download click error",t);try{s.click()}catch(t){window.open(e,"_blank")}}setTimeout((()=>{s.remove(),i&&i()}),100)}(n,a.fileName||o,(()=>{URL.revokeObjectURL(n)}))})).catch(r.Z).finally((()=>{g||v(),setTimeout((()=>{null==h||h.remove()}),1e3)})),d}};o.GO&&(o.GO.appDownloadManager=g);const v=g},4271:(e,t,i)=>{"use strict";i.d(t,{oo:()=>qr,ZP:()=>Jr});var s=i(5814),n=i(4273),a=i(4332),o=i(4755),r=i(5003),d=i(3512),l=i(3241),c=i(5432),h=i(1655),u=i(6519),p=i(4484),f=i(9331),m=i(1507),g=i(7625),v=i(4993);class b{constructor(e,t,i){this.container=document.createElement("div"),this.container.classList.add("bubbles-group"),this.chat=e,this.groups=t,this.items=[],this.dateTimestamp=i,this.offset=0}createAvatar(e){if(this.avatarLoadPromise)return this.avatarLoadPromise;if("messageService"===e._)return;this.avatarContainer=document.createElement("div"),this.avatarContainer.classList.add("bubbles-group-avatar-container"),++this.offset;const t=e.fwd_from,i=e.fwdFromId,s=e.from_id&&"peerChannel"===e.from_id._&&e.fromId===i,n=this.chat.peerId;this.avatar=new f.Z,this.avatar.classList.add("bubbles-group-avatar","user-avatar","avatar-40");const a=(t&&(n===d.Z.myId||n===m.hj)||s?i:e.fromId)||m.NM,o=this.avatar.updateWithOptions({lazyLoadQueue:this.chat.bubbles.lazyLoadQueue,peerId:a,peerTitle:!i&&t&&t.from_name?t.from_name:void 0});return this.avatarLoadPromise=o,this.avatarContainer.append(this.avatar),this.container.append(this.avatarContainer),this.avatarLoadPromise}get firstTimestamp(){return this.firstItem.timestamp}get firstMid(){return this.firstItem.mid}get firstItem(){return this.items[this.items.length-1]}get lastTimestamp(){return this.lastItem.timestamp}get lastMid(){return this.lastItem.mid}get lastItem(){return this.items[0]}updateClassNames(){const e=this.items,t=e.length;if(!t)return;const i=e[t-1].bubble;if(1===e.length)return void i.classList.add("is-group-first","is-group-last");i.classList.remove("is-group-last"),i.classList.add("is-group-first");for(let i=1,s=t-1;i{this.mountItem(e,s-1-i,t)})),e&&this.updateClassNames(),this.onItemMount()}mountItem(e,t=this.items.indexOf(e),i=this.offset){e.mounted||((0,p.Z)(e.bubble,this.container,i+t),e.mounted=!0)}unmountItem(e){e.mounted&&(e.bubble.remove(),e.mounted=!1,this.onItemUnmount())}onItemMount(){if(this.mounted)return;const e=this.chat.bubbles.getDateContainerByTimestamp(this.dateTimestamp/1e3),t=this.groups.groups.filter((e=>e.dateTimestamp===this.dateTimestamp)),i=t.length,s=t.indexOf(this),n=t.slice(s+1).reduce(((e,t)=>e+(t.mounted?0:1)),0);(0,p.Z)(this.container,e.container,Cs+i-1-s-n),this.mounted=!0}onItemUnmount(){this.mounted&&(this.items.length?this.updateClassNames():(this.container.remove(),this.chat.bubbles.deleteEmptyDateGroups(),this.mounted=!1))}}class y{constructor(e){this.chat=e,this.itemsArr=[],this.itemsMap=new Map,this.groups=[],this.newGroupDiff=121,this.sortItemsKey="scheduled"===e.type?"timestamp":"mid",this.sortGroupsKey="scheduled"===e.type?"lastTimestamp":"lastMid",this.sortGroupItemsKey="groupMid"}removeItem(e){var t;null===(t=e.group)||void 0===t||t.removeItem(e),this.removeItemFromCache(e)}removeAndUnmountBubble(e){const t=this.getItemByBubble(e);if(!t)return e.parentElement&&e.remove(),!1;const i=this.itemsArr,s=i.indexOf(t),n=this.getSiblingsAtIndex(s,i),a=t.group;this.removeItem(t);const o=new Set;a&&(a.unmountItem(t),o.add(a));const[r,d]=n;if(r&&d&&this.canItemsBeGrouped(r,d)&&r.group!==d.group){const e=d.group;this.f(d.group.items),e.onItemUnmount(),o.add(r.group),this.groupUngrouped()}return this.mountUnmountGroups(Array.from(o)),!0}mountUnmountGroups(e){const[t,i]=function(e,t){const i=[],s=[];for(let t=0,a=e.length;t{e.onItemUnmount()})),t.forEach((e=>{e.mount(!0)}))}f(e,t=0,i=e.length){for(;ts.add(e)))}}return s}cleanup(){this.itemsArr=[],this.groups=[],this.itemsMap.clear()}}var w=i(1168),S=i(2738),C=i(2325),L=i(503);class E extends w.Z{constructor(e,t,i={}){if(super("popup-date-picker",Object.assign({body:!0,overlayClosable:!0,buttons:i.noButtons?[]:[{langKey:"JumpToDate",callback:()=>{this.onPick&&this.onPick(this.selectedDate.getTime()/1e3|0)}},{langKey:"Cancel",isCancel:!0}],title:!0},i)),this.onPick=t,this.options=i,this.onPrevClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()-1),this.setMonth(),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.nextBtn.removeAttribute("disabled")},this.onNextClick=e=>{this.selectedMonth.setMonth(this.selectedMonth.getMonth()+1),this.setMonth(),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),this.prevBtn.removeAttribute("disabled")},this.onDateClick=e=>{const t=e.target;if(!t.dataset.timestamp)return;if(this.selectedEl){if(this.selectedEl===t)return;this.selectedEl.classList.remove("active")}this.selectedEl=t,t.classList.add("active");const i=+t.dataset.timestamp;this.selectedDate=new Date(i),this.setTitle(),this.setTimeTitle()},this.minDate=i.minDate||new Date("2013-08-01T00:00:00"),e{const n=""+e;this.listenerSetter.add(t.input)("input",(a=>{let o=t.value.replace(/\D/g,"");o.length>2?o=o.slice(0,2):(1===o.length&&+o[0]>+n[0]||2===o.length&&+o>e)&&(2===o.length&&s&&s(+o[1]),o="0"+o[0]),t.setValueSilently(o),i(o.length)}))};this.hoursInputField=new L.ZP({plainText:!0}),this.minutesInputField=new L.ZP({plainText:!0}),i(23,this.hoursInputField,(e=>{2===e&&this.minutesInputField.input.focus(),this.setTimeTitle()}),(e=>{this.minutesInputField.value=(e+this.minutesInputField.value).slice(0,2)})),i(59,this.minutesInputField,(e=>{e||this.hoursInputField.input.focus(),this.setTimeTitle()})),this.selectedDate=e,e.setMinutes(e.getMinutes()+10),this.hoursInputField.setValueSilently(("0"+e.getHours()).slice(-2)),this.minutesInputField.setValueSilently(("0"+e.getMinutes()).slice(-2)),e.setHours(0,0,0,0),this.timeDiv.append(this.hoursInputField.container,t,this.minutesInputField.container),(0,S.fc)(this.btnConfirm,(()=>{this.onPick&&(this.selectedDate.setHours(+this.hoursInputField.value||0,+this.minutesInputField.value||0,0,0),this.onPick(this.selectedDate.getTime()/1e3|0)),this.hide()}),{listenerSetter:this.listenerSetter}),this.body.append(this.timeDiv),this.prevBtn.classList.add("primary"),this.nextBtn.classList.add("primary")}const s=document.createElement("div");s.classList.add("popup-centerer"),s.append(this.container),this.element.append(s),e.setHours(0,0,0,0),this.selectedDate=e,this.maxDate=i.maxDate||new Date,this.maxDate.setHours(0,0,0,0),this.selectedMonth=new Date(this.selectedDate),this.selectedMonth.setDate(1),this.maxMonth=new Date(this.maxDate),this.maxMonth.setDate(1),this.minMonth=new Date(this.minDate),this.minMonth.setHours(0,0,0,0),this.minMonth.setDate(1),this.selectedMonth.getTime()===this.minMonth.getTime()&&this.prevBtn.setAttribute("disabled","true"),this.selectedMonth.getTime()===this.maxMonth.getTime()&&this.nextBtn.setAttribute("disabled","true"),i.noTitle&&(this.setTitle=()=>{}),this.setTimeTitle(),this.setTitle(),this.setMonth()}setTimeTitle(){if(this.btnConfirm&&this.selectedDate){let e;const t=[],i=new Date;i.setHours(0,0,0,0);const s={minute:"2-digit",hour:"2-digit"},n=new Date(this.selectedDate.getTime());if(n.setHours(+this.hoursInputField.value,+this.minutesInputField.value),this.selectedDate.getTime()===i.getTime())e="Schedule.SendToday";else{e="Schedule.SendDate";const s={month:"short",day:"numeric"};n.getFullYear()!==i.getFullYear()&&(s.year="numeric"),t.push(new C.ZP.IntlDateElement({date:n,options:s}).element)}t.push(new C.ZP.IntlDateElement({date:n,options:s}).element),this.btnConfirm.firstChild.replaceWith((0,C.ag)(e,t))}}setTitle(){this.title.textContent="",this.title.append(new C.ZP.IntlDateElement({date:this.selectedDate,options:{day:"numeric",month:"long",weekday:"short"}}).element)}renderElement(e,t=""){const i=document.createElement("button");return i.classList.add("btn-icon","date-picker-month-date"),e&&i.setAttribute("disabled","true"),t&&i.append(t),i}setMonth(){const e=new Date(this.selectedMonth),t={year:"numeric",month:this.timeDiv&&o.Z.isMobile?"short":"long"};this.monthTitle.textContent="",this.monthTitle.append(new C.ZP.IntlDateElement({date:e,options:t}).element),this.month&&this.month.remove(),this.month=document.createElement("div"),this.month.classList.add("date-picker-month");const i=new Date,s=i.getDay();1!==s&&i.setHours(-24*(s-1));for(let e=0;e<7;++e){const e=this.renderElement(!0,new C.ZP.IntlDateElement({date:i,options:{weekday:"narrow"}}).element);e.classList.remove("date-picker-month-date"),e.classList.add("date-picker-month-day"),this.month.append(e),i.setDate(i.getDate()+1)}let n=e.getDay()-1;-1===n&&(n=6);const a=new Date(e.getTime());a.setDate(a.getDate()-n-1);for(let e=0;ethis.maxDate||e{f&&!f()||(p.forEach((e=>e.remove())),o&&o.classList.toggle("is-round",u))})),h}))}class Y extends j{constructor(e,t){super(e,((e,i="",s)=>$(this,void 0,void 0,(function*(){this.mediaEl||(this.mediaEl=document.createElement("div"),this.mediaEl.classList.add(this.className+"-media"));const n=yield Q({title:e,titleEl:this.title,subtitle:i,subtitleEl:this.subtitle,mediaEl:this.mediaEl,message:s,animationGroup:t});this.container.classList.toggle("is-media",n),n?this.content.prepend(this.mediaEl):this.mediaEl.remove()})))),this.className=e,this.animationGroup=t}}function X(e,t,i,s,n){const a=new Y("reply",i),o=a.fill(e,t,s);if(n){const e=(0,O.Z)(n,!1),[t,i,s]=(0,N.oo)(e);a.container.style.setProperty("--override-color",`${t}, ${i}, ${s}`),a.container.classList.add("is-overriding-color")}return{container:a.container,fillPromise:o}}const J="stacked-avatars",ee=J+"-avatar",te=ee+"-container";class ie{constructor(e){this.lazyLoadQueue=e.lazyLoadQueue,this.avatarSize=e.avatarSize,this.container=document.createElement("div"),this.container.classList.add(J),this.container.style.setProperty("--avatar-size",e.avatarSize+"px")}render(e,t){const i=this.container.children;(e=e.slice().reverse()).length>3&&(e=e.slice(-3)),e.forEach(((e,s)=>{let n=i[s];n||(n=document.createElement("div"),n.classList.add(te));let a=n.firstElementChild;a||(a=new f.Z,a.classList.add("avatar-"+this.avatarSize,ee),a.updateOptions({isDialog:!1,loadPromises:t})),a.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e}),a.parentNode||n.append(a),n.parentNode||this.container.append(n)})),Array.from(i).slice(e.length).forEach((e=>e.remove()))}}const se="replies-element";d.Z.addEventListener("replies_updated",(e=>{Array.from(document.querySelectorAll(se+`[data-post-key="${e.peerId}_${e.mid}"]`)).forEach((t=>{t.message=e,t.render()}))}));class ne extends HTMLElement{constructor(){super(),this.updated=!1,this.managers=d.Z.managers}init(){this.render(),this.dataset.postKey=this.message.peerId+"_"+this.message.mid,this.classList.add("replies","replies-"+this.type)}render(){const e=this.message.replies;if("footer"===this.type){let t;this.firstElementChild&&(t=this.firstElementChild),(null==e?void 0:e.recent_repliers)?(t&&!t.classList.contains("replies-footer-avatars")&&(this.innerHTML="",t=null),this.stackedAvatars||(this.stackedAvatars=new ie({lazyLoadQueue:this.lazyLoadQueue,avatarSize:30}),this.stackedAvatars.container.classList.add("replies-footer-avatars")),t=this.stackedAvatars.container,this.stackedAvatars.render(e.recent_repliers.map((e=>(0,D.Z)(e))),this.loadPromises)):(t&&!t.classList.contains("tgico-comments")&&(t.remove(),t=null),t||(t=document.createElement("span"),t.classList.add("tgico-comments"))),t.parentElement||this.prepend(t),this.text||(this.text=new C.ZP.IntlElement);const i=this.text;if(e?e.replies?i.compareAndUpdate({key:"Comments",args:[e.replies]}):i.compareAndUpdate({key:"LeaveAComment"}):i.compareAndUpdate({key:"ViewInChat"}),e){let t=!1;e.replies&&void 0!==e.read_max_id&&void 0!==e.max_id&&(t=e.read_max_id${(null==e?void 0:e.replies)?(0,F.Z)(e.replies,0):""}`;!e||this.updated||this.message.pFlags.is_outgoing||(this.managers.appMessagesManager.subscribeRepliesThread(this.message.peerId,this.message.mid),this.managers.appMessagesManager.updateMessage(this.message.peerId,this.message.mid,"replies_updated"),this.updated=!0),this.loadPromises&&(this.loadPromises=void 0)}}customElements.define(se,ne);const ae=()=>{const e=document.createElement("i");return e.classList.add("edited"),(0,C.$d)(e,"EditedMessage"),e},oe=()=>(0,C.ag)("SponsoredMessage");var re;!function(e){e.setTime=e=>{var t;const{chatType:i,message:s}=e,n=new Date(1e3*s.date),a=[];let o,r;const d=!!s.pFlags.sponsored,l=!("action"in s)&&!d,c=d?void 0:(0,A.mr)(n);if(l){if(s.views){const e=s.post_author||(null===(t=s.fwd_from)||void 0===t?void 0:t.post_author),i=document.createElement("span");i.classList.add("post-views"),i.innerHTML=(0,F.Z)(s.views,1);const n=document.createElement("i");if(n.classList.add("tgico-channelviews","time-icon"),a.push(i,n),e){const t=document.createElement("span");(0,_.Z)(t,(0,R.Z)(e)),t.insertAdjacentHTML("beforeend",", "),a.push(t)}}if(s.edit_date&&"scheduled"!==i&&!s.pFlags.edit_hide&&a.unshift(o=ae()),"pinned"!==i&&s.pFlags.pinned){const e=document.createElement("i");e.classList.add("tgico-pinnedchat","time-icon"),a.unshift(e)}}else d&&a.push(r=oe());c&&a.push(c);let h=d?void 0:(0,A.xE)(n);l&&(h+=(s.edit_date&&!s.pFlags.edit_hide?`\nEdited: ${(0,A.xE)(new Date(1e3*s.edit_date))}`:"")+(s.fwd_from?`\nOriginal: ${(0,A.xE)(new Date(1e3*s.fwd_from.date))}`:""));const u=document.createElement("span");u.classList.add("time","tgico"),u.append(...a);const p=document.createElement("div");p.classList.add("inner","tgico"),h&&(p.title=h);let f=a;return o&&(f[f.indexOf(o)]=ae()),r&&(f[f.indexOf(r)]=oe()),f=f.map((e=>e instanceof HTMLElement&&!e.classList.contains("i18n")&&!e.classList.contains("reactions")?e.cloneNode(!0):e)),c&&(f[f.length-1]=(0,A.mr)(n)),p.append(...f),u.append(p),u},e.renderReplies=({bubble:e,bubbleContainer:t,message:i,messageDiv:s,loadPromises:n,lazyLoadQueue:a})=>{const o=!e.classList.contains("sticker")&&!e.classList.contains("emoji-big")&&!e.classList.contains("round"),r=new ne;return r.message=i,r.type=o?"footer":"beside",r.loadPromises=n,r.lazyLoadQueue=a,r.init(),t.prepend(r),o},e.setReply=({chat:e,bubble:t,bubbleContainer:i,message:s})=>{return n=this,a=void 0,r=function*(){const n=!i;n&&(i=t.querySelector(".bubble-content"));const a=n?i.querySelector(".reply"):null;if(!s.reply_to_mid)return null==a||a.remove(),void t.classList.remove("is-reply");const o=s.reply_to.reply_to_peer_id?(0,D.Z)(s.reply_to.reply_to_peer_id):e.peerId,r=yield d.Z.managers.appMessagesManager.getMessageByPeer(o,s.reply_to_mid);let l,c;if(r){const e=r.fwdFromId;c=s.fwdFromId&&s.fwdFromId===e?s.fwdFromId:r.fromId||e,l=new B.Z({peerId:c,dialog:!1,onlyFirstName:!1,plainText:!1}).element}else d.Z.managers.appMessagesManager.fetchMessageReplyTo(s),e.bubbles.needUpdate.push({replyToPeerId:o,replyMid:s.reply_to_mid,mid:s.mid}),l=(0,C.ag)("Loading");const{container:h,fillPromise:u}=X(l,void 0,e.animationGroup,r,e.isAnyGroup?c:void 0);return yield u,a?(a.classList.contains("floating-part")&&h.classList.add("floating-part"),a.replaceWith(h)):i.append(h),t.classList.add("is-reply"),h},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function s(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}d((r=r.apply(n,a||[])).next())}));var n,a,o,r}}(re||(re={}));var de=i(2153),le=i(3699),ce=i(8448),he=i(4789),ue=i(8594),pe=i(3035),fe=i(3725),me=i(410),ge=i(252),ve=i(8497),be=i(4668),ye=i(2796);function we(e,t,i){const s=e.getBoundingClientRect(),n="center"===i?Math.ceil(s.left+(s.right-s.left)/2+1):Math.ceil(s.left+1),a="bottom"===t?Math.floor(s.top+s.height-1):Math.ceil(s.top+1);return document.elementFromPoint(n,a)}me.GO.getElementByPoint=we;var Se=i(3624),Ce=i(3910),Le=i(5705);function Ee(e){e.style.display="none",e.offsetLeft,e.style.display=""}var Ie=i(2648),Me=i(5296),Pe=i(8938),Ze=i(5701);const ke=2147483646;var Te,xe=i(241),Ae=i(6272),_e=i(1784),Fe=i(9099),De=i(2416),Re=i(8763),Be=i(5975),Ne=i(8939),Oe=i(993),Ue=i(4494),He=i(8204),ze=i(2575),je=i(9931);class Ge extends w.Z{constructor(e,t){super("popup-join-chat-invite",{closable:!0,overlayClosable:!0,body:!0,buttons:(0,w.x)([{langKey:t.pFlags.request_needed?"RequestJoin.Button":t.pFlags.broadcast?"JoinByPeekChannelTitle":"JoinByPeekGroupTitle",callback:()=>{this.managers.appChatsManager.importChatInvite(e).then((e=>{const t=e.toPeerId(!0);Jr.setInnerPeer({peerId:t})}),(e=>{"INVITE_REQUEST_SENT"===e.type&&(0,ye.bC)({langPackKey:"RequestToJoinSent"})}))}}])}),this.hash=e,this.chatInvite=t,this.construct()}construct(){return e=this,t=void 0,s=function*(){this.header.remove();const{chatInvite:e,managers:t,hash:i}=this,s=new f.Z;s.classList.add("avatar-100"),s.isDialog=!1,"photo"===e.photo._?(e.photo=yield t.appPhotosManager.savePhoto(e.photo),(0,V.Z)({container:s,message:null,photo:e.photo,boxHeight:100,boxWidth:100,withoutPreloader:!0}),s.style.width=s.style.height=""):(0,je.Z)({div:s,peerId:m.NM,isDialog:!1,title:e.title});const n=document.createElement("div");n.classList.add("chat-title"),(0,_.Z)(n,(0,R.Z)(e.title));const a=e.pFlags.broadcast,o=(0,C.ag)(a?"Subscribers":"Members",[(0,ze.Z)(e.participants_count)]);if(o.classList.add("chat-participants-count"),this.body.append(s,n,o),e.pFlags.request_needed){const e=document.createElement("div");(0,C.$d)(e,a?"RequestToJoinChannelDescription":"RequestToJoinGroupDescription"),e.classList.add("chat-participants-count","request-caption"),this.body.append(e)}this.show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}!function(e){e[e.MESSAGE=0]="MESSAGE",e[e.PRIVATE_POST=1]="PRIVATE_POST",e[e.STICKER_SET=2]="STICKER_SET",e[e.JOIN_CHAT=3]="JOIN_CHAT",e[e.VOICE_CHAT=4]="VOICE_CHAT",e[e.USER_PHONE_NUMBER=5]="USER_PHONE_NUMBER",e[e.INVOICE=6]="INVOICE",e[e.EMOJI_SET=7]="EMOJI_SET"}(Te||(Te={}));var Ve=i(5285),Ke=i(6654),We=i(9083),$e=i(6775),qe=i(9405),Qe=i(319);const Ye="reaction",Xe=Ye+"-element";class Je extends HTMLElement{constructor(){super(),this.classList.add(Ye),this.managers=d.Z.managers}get reactionCount(){return this._reactionCount}set reactionCount(e){this._reactionCount=e}get count(){return this.reactionCount.count}init(e,t){this.type=e,this.classList.add(Ye+"-"+e),this.middleware=t}setCanRenderAvatars(e){this.canRenderAvatars=e}render(e){const t=!!this.stickerContainer;t||(this.stickerContainer=document.createElement("div"),this.stickerContainer.classList.add(Ye+"-sticker"),this.append(this.stickerContainer));const i=this.reactionCount;if(!e&&!t){const e=i.reaction;if("reactionEmoji"===e._){const t=this.managers.appReactionsManager.getReaction(e.emoticon);(0,Ke.Z)(t,(e=>{var t;e.center_icon||this.stickerContainer.classList.add("is-static"),e.pFlags.inactive&&this.classList.add("is-inactive"),this.renderDoc(null!==(t=e.center_icon)&&void 0!==t?t:e.static_icon)}))}else if("reactionCustomEmoji"===e._){this.stickerContainer.classList.add("is-custom");const t=(0,We.Z)({docIds:[e.document_id],customEmojiSize:(0,qe.C)(22,22)});this.stickerContainer.append(t)}}}renderDoc(e){const t="inline"===this.type?14:22,i=this.wrapStickerPromise=(0,K.ZP)({div:this.stickerContainer,doc:e,width:t,height:t,static:!0,managers:this.managers,middleware:this.middleware}).then((({render:e})=>e)).finally((()=>{this.wrapStickerPromise===i&&(this.wrapStickerPromise=void 0)}))}renderCounter(){var e;const t=this.reactionCount,i="inline"===this.type?2:4;if(t.count>=i||"block"===this.type&&!this.canRenderAvatars){this.counter||(this.counter=document.createElement("inline"===this.type?"i":"span"),this.counter.classList.add(Ye+"-counter"));const e=(0,F.Z)(t.count);this.counter.textContent!==e&&(this.counter.textContent=e),this.counter.parentElement||this.append(this.counter)}else(null===(e=this.counter)||void 0===e?void 0:e.parentElement)&&(this.counter.remove(),this.counter=void 0)}renderAvatars(e){"inline"!==this.type&&(this.reactionCount.count>=4||!this.canRenderAvatars?this.stackedAvatars&&(this.stackedAvatars.container.remove(),this.stackedAvatars=void 0):(this.stackedAvatars||(this.stackedAvatars=new ie({avatarSize:24}),this.append(this.stackedAvatars.container)),this.stackedAvatars.render(e.map((e=>(0,D.Z)(e.peer_id))))))}setIsChosen(e=void 0!==this.reactionCount.chosen_order){"inline"!==this.type&&(this.classList.contains("is-chosen")&&!this.classList.contains("backwards"))!==e&&(0,Fe.Z)({element:this,className:"is-chosen",forwards:e,duration:this.isConnected?300:0})}fireAroundAnimation(){const e=this.reactionCount.reaction;"reactionEmoji"===e._&&(0,Ke.Z)(this.managers.appReactionsManager.getReaction(e.emoticon),(e=>{const t="inline"===this.type?28:40,i=document.createElement("div");i.classList.add(Ye+"-sticker-activate"),Promise.all([(0,K.ZP)({div:i,doc:e.center_icon,width:t,height:t,withThumb:!1,needUpscale:!0,play:!1,skipRatio:1,group:"none",needFadeIn:!1,managers:this.managers,middleware:this.middleware}).then((({render:e})=>e)),(0,$e.Z)({doc:e.around_animation,size:80,target:this.stickerContainer,side:"center",skipRatio:1,play:!1,managers:this.managers,middleware:this.middleware}).stickerPromise.catch(Qe.Z)]).then((([e,t])=>{const s=()=>{e.remove(),i.remove(),this.stickerContainer.classList.remove("has-animation")};if(!t)return void s();const n=()=>{(0,pe.T2)(s)};e.addEventListener("enterFrame",(t=>{t===e.maxFrame&&(this.wrapStickerPromise?this.wrapStickerPromise.then((()=>{setTimeout(n,1e3)})):n())})),e.addEventListener("firstFrame",(()=>{this.stickerContainer.append(i),this.stickerContainer.classList.add("has-animation"),e.play(),t.play()}),{once:!0})}))}))}}customElements.define(Xe,Je);const et="reactions",tt=et+"-element",it=new Map;class st extends HTMLElement{constructor(){super(),this.classList.add(et),this.sorted=[],this.middlewareHelpers=new Map,this.managers=d.Z.managers}connectedCallback(){let e=it.get(this.key);e||it.set(this.key,e=new Set),e.add(this),this.onConnectCallback&&this.isConnected&&(this.onConnectCallback(),this.onConnectCallback=void 0)}disconnectedCallback(){const e=it.get(this.key);e.delete(this),e.size||it.delete(this.key)}getReactionCount(e){return this.sorted[this.sorted.indexOf(e)].reactionCount}getMessage(){return this.message}init(e,t,i,s=this.isPlaceholder){void 0!==this.key&&this.disconnectedCallback(),this.middleware!==i&&i.onDestroy((()=>{this.middlewareHelpers.clear()})),this.message=e,this.key=this.message.peerId+"_"+this.message.mid,this.middleware=i,this.isPlaceholder=s,this.type!==t&&(this.type=t,this.classList.add(et+"-"+t)),this.connectedCallback()}changeMessage(e){return this.init(e,this.type,this.middleware)}update(e,t){this.message=e,this.render(t)}render(e){const t=this.message.reactions,i=!(!t||!t.results.length);if(this.classList.toggle("has-no-reactions",!i),!i&&!this.sorted.length)return;this.managers.appReactionsManager.getAvailableReactions();const s=i?t.results:[];s.sort(((e,t)=>{var i,s;return t.count-e.count||(null!==(i=e.chosen_order)&&void 0!==i?i:0)-(null!==(s=t.chosen_order)&&void 0!==s?s:0)})),(0,g.Z)(this.sorted,((e,t,i)=>{const n=e.reactionCount.reaction;s.some((e=>(0,Ve.Z)(e.reaction,n)))||(this.middlewareHelpers.get(e).destroy(),this.middlewareHelpers.delete(e),i.splice(t,1),e.remove())}));const n=s.reduce(((e,t)=>e+t.count),0),a=t&&(!!t.pFlags.can_see_list||this.message.peerId.isUser())&&n<4;if(this.sorted=s.map(((e,i)=>{let s=this.sorted.find((t=>(0,Ve.Z)(t.reactionCount.reaction,e.reaction)));if(!s){const e=this.middleware.create();s=new Je,s.init(this.type,e.get()),this.middlewareHelpers.set(s,e)}(0,p.Z)(s,this,i);const n=t.recent_reactions?t.recent_reactions.filter((t=>(0,Ve.Z)(t.reaction,e.reaction))):[];return s.reactionCount=Object.assign({},e),s.setCanRenderAvatars(a),s.render(this.isPlaceholder),s.renderCounter(),s.renderAvatars(n),s.setIsChosen(),s})),!this.isPlaceholder&&(null==e?void 0:e.length)&&(this.isConnected?this.handleChangedResults(e):this.onConnectCallback=()=>{this.handleChangedResults(e)}),!this.sorted.length&&"block"===this.type){const e=this.parentElement;if(this.remove(),e.classList.contains("document-message")&&!e.childNodes.length)return void e.remove();const t=this.querySelector(".time");t&&e.append(t)}}handleChangedResults(e){this.message.peerId===Jr.chat.peerId&&e.forEach((e=>{const t=this.sorted.find((t=>(0,Ve.Z)(t.reactionCount.reaction,e.reaction)));null==t||t.fireAroundAnimation()}))}}customElements.define(tt,st);var nt=i(5418);class at{constructor(e,t,i){this.scrollable=e,this.query=t,this.reverse=i}get container(){return this.scrollable.container}getSaved(){return{scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,clientHeight:this.clientHeight}}findElements(){if(!this.query)return[];const{container:e}=this,t=e.getBoundingClientRect(),i=Array.from(e.querySelectorAll(this.query)),s=[];for(const n of i){const i=n.getBoundingClientRect();if((0,He.Z)(n,e,void 0,i,t))s.push({element:n,rect:i});else if(s.length)break}if(!s.length){const e=i[0];e&&s.push({element:e,rect:e.getBoundingClientRect()})}return s}replaceSaved(e,t){if(!this.elements)return;const i=this.elements.findIndex((({element:t})=>e===t));-1!==i&&(this.elements[i].element=t)}findAndSetElements(){this.elements=this.findElements()}save(){this.findAndSetElements(),this._save()}_save(){const{scrollTop:e,scrollHeight:t,clientHeight:i}=this.container;this.scrollHeight=t,this.scrollTop=e,this.clientHeight=i,this.scrollHeightMinusTop=this.reverse?t-e:e}onRestore(e){T.IS_SAFARI&&e&&Ee(this.container)}setScrollTop(e,t){this.scrollable.setScrollTopSilently(this.scrollTop=e),this.onRestore(t)}restore(e){var t;const{scrollTop:i,scrollHeight:s}=this.scrollable;if(this.scrollHeight=s,!this.elements.length)return void this._restore(e);let n;if(n=this.elements[this.elements.length-1],!(null===(t=null==n?void 0:n.element)||void 0===t?void 0:t.parentElement)&&(this.findAndSetElements(),n=this.elements[this.elements.length-1],!n))return void this._restore(e);const{element:a,rect:o}=n,r=a.getBoundingClientRect().bottom-o.bottom;this.setScrollTop(i+r,e)}_restore(e){const{scrollHeightMinusTop:t,scrollable:i}=this,s=this.scrollHeight,n=this.reverse?s-t:t;this.setScrollTop(n,e)}}me.GO&&(me.GO.ScrollSaver=at);var ot=i(7401),rt=i(4881);class dt{constructor(e){this.observing=new Map,this.observingQueue=new Map,this.freezedObservingNew=!1,this.observer=new IntersectionObserver((e=>{const t=this.observing;for(let i=0,s=e.length;ie+t),t)}var xt=i(8097);const At=function(e){const t={},i={};return s=>{var n,a;const o="_"+s;return null!==(n=(a="string"==typeof s?t:i)[o])&&void 0!==n?n:a[o]=e(s)}};function _t(e){return e.replace(/\D/g,"")}const Ft={visa:/^4/,mastercard:/^(51|52|53|54|55|222|23|24|25|26|27)/,amex:/^(34|37)/,discover:/^(60|64|65)/,diners:/^(30|38|39)/,diners14:/^(36)/,jcb:/^(35)/,unionpay:/^(62[0-6,8-9]|627[0-6,8-9]|6277[0-7,9]|62778[1-9]|81)/,elo:/^(5067|509|636368|627780)/,mir:/^(220[0-4])/},Dt={visa:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},mastercard:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},amex:{minLength:15,maxLength:15,cvcMaxLength:4,cvcMinLength:3},unionpay:{minLength:13,maxLength:19,cvcMaxLength:3,cvcMinLength:null},diners:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},diners14:{minLength:14,maxLength:14,cvcMaxLength:3,cvcMinLength:null},discover:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},jcb:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},elo:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},mir:{minLength:16,maxLength:16,cvcMaxLength:3,cvcMinLength:null},unknown:{minLength:16,maxLength:16,cvcMaxLength:4,cvcMinLength:3}},Rt=At(((e="")=>{const t=Object.keys(Ft),i=_t(e);let s,n=0;return t.forEach((e=>{const t=Ft[e],a=i.match(t);if(a){const t=a[0];t&&t.length>n&&(s=e,n=t.length)}})),s||"unknown"}));function Bt(e=""){return"diners14"===(t=Rt(e))?"diners":t;var t}var Nt=i(2398),Ot=i(6740),Ut=i(1656),Ht=i(7298),zt=i(9807),jt=i(279),Gt=i(7479),Vt=i(7362);function Kt(e,t,i){const s=new Array(e);return s.fill(t),i?s.map(i):s}const Wt="0".charCodeAt(0)-"0".charCodeAt(0),$t=/[0-9]/g;function qt(e){return String.fromCharCode(e.charCodeAt(0)-Wt)}function Qt(e){return e.replace($t,qt)}function Yt(e,t){return{type:"optional",result:e,consumed:t}}function Xt(e,t,i){return{type:"required",result:e,consumed:t,partial:i}}function Jt(e,t){return i=>{const s=new RegExp("^".concat(e.source.replace(/^\^/,""))),n=i.match(s),a=t?Yt:Xt;if(n){const e=n[0];return a(e,n.index+e.length)}return a("",i.length)}}const ei=Jt(/1[0-2]|0?[1-9]|0/),ti={digit:function(e){return Jt(/[0-9]/)(Qt(e))},capitalCharacter:function(e){const t=Jt(/\w/)(e);return t.result?Xt(t.result.toUpperCase(),t.consumed):t},month:e=>{const t=ei(Qt(e)),i=_t(t.result);return["0","1"].includes(t.result)&&1===e.length||"0"===t.result&&e.length>=2?Xt(t.result,e.length,!0):Xt(1===i.length?"0"+i:i,t.consumed)},formattingCharacter:e=>t=>{const i=e===t[0]?1:0;return function(e,t){return{type:"formatting",result:e,consumed:t}}(e,i)},optionalPattern:e=>t=>{const i=Jt(e,!0)(t);return i.result?i:Yt("",0)}},ii=ti.digit,si=ti.capitalCharacter,ni=ti.formattingCharacter(" "),ai=ti.optionalPattern(/\d\d/),oi=[ii,ii,ii,ii,ni,ii,ii,ii,ii,ii,ii,ni,ii,ii,ii,ii,ii],ri=[ii,ii,ii,ii,ni,ii,ii,ii,ii,ii,ii,ni,ii,ii,ii,ii],di=new Set(["DZ","AR","AM","AU","AT","AZ","PT","BD","BY","BE","BA","BR","BN","BG","CA","IC","CN","CO","HR","CY","CZ","DK","EC","GB","EE","FO","FI","FR","GE","DE","GR","GL","GU","GG","NL","HU","IN","ID","IL","IT","JP","JE","KZ","KR","FM","KG","LV","LI","LT","LU","MK","MG","PT","MY","MH","MQ","YT","MX","MN","ME","NL","NZ","GB","NO","PK","PH","PL","FM","PT","PR","RE","RU","SA","SF","RS","SG","SK","SI","ZA","ES","LK","SX","VI","VI","SE","CH","TW","TJ","TH","TU","TN","TR","TM","VI","UA","GB","US","UY","UZ","VA","VN","GB","FM"]),li=At((e=>{const t=[];for(let i=0,s=0;i[ti.month,ti.formattingCharacter("/"),ii,ii,ai],cardCvc:e=>ci.cardCvcFromBrand(Rt(e)),cardCvcFromBrand:At((e=>{const t=Dt[e],{cvcMinLength:i,cvcMaxLength:s}=t,n=Kt(i||s,ii);if(i&&i{switch(e){case"US":return Kt(5,ii);case"CA":return T.IS_ANDROID?null:[si,si,si,ni,si,si,si];default:const t=Kt(10,ti.optionalPattern(/\d/));return di.has(e)&&(t[0]=ii),t}}))},hi=ci;function ui(e){return Tt(e.map((e=>e.length)),0)}const pi=new RegExp("‎","g");function fi(e){return e?{type:"invalid",code:e}:null}function mi(e,t={}){const{sanitized:i,minLength:s}=function(e){const t=_t(e),i=Rt(e);return{sanitized:t,brand:i,minLength:Dt[i].minLength}}(e);return function(e,t,i){return e.length>=t?function(e){const t="0".charCodeAt(0),i=e.length%2;let s=0;for(let n=e.length-1;n>=0;--n){const a=i===n%2;let o=e.charCodeAt(n)-t;a&&(o*=2),o>9&&(o-=9),s+=o}return!(s%10)}(e)||"mir"===Rt(e)?null:fi("invalid"):i?null:fi("incomplete")}(i,s,t.ignoreIncomplete)}function gi(e,t={}){const i=e.replace(pi,"").split(/ ?\/ ?/),[s,n=""]=i,[a,o]=[s,n].map((e=>+e)),r=2===n.length?o%100:o;return n.length<2||3===n.length?t.ignoreIncomplete?null:fi("incomplete"):fi(function(e,t,i){const s=new Date(Date.now()),n=e<100?s.getFullYear()%100:s.getFullYear(),a=s.getMonth()+1;return isNaN(e)||isNaN(t)?(null==i?void 0:i.ignoreIncomplete)?null:"incomplete":e-n<0?"invalid_expiry_year_past":e-n>50?"invalid_expiry_year":!(e-n)&&t{const t=yi.get(e.source);t&&t(JSON.parse(e.data))}));class wi extends l.Z{constructor({url:e,sandbox:t}){super(!1),this.onTelegramWebViewEvent=({eventType:e,eventData:t})=>{""===t&&(t=void 0),console.log("onTelegramWebViewEvent",e,t),this.dispatchEvent(e,t)};const i=this.iframe=document.createElement("iframe");i.src=e,t&&i.setAttribute("sandbox",t)}onMount(){yi.set(this.iframe.contentWindow,this.onTelegramWebViewEvent)}destroy(){this.cleanup(),yi.delete(this.iframe.contentWindow)}}function Si(e){const t=new wi(Object.assign(Object.assign({},e),{sandbox:"allow-forms allow-scripts allow-same-origin allow-modals"})),{iframe:i}=t;return i.allow="payment",i.classList.add("payment-verification"),t}class Ci extends w.Z{constructor(e,t){super("popup-payment popup-payment-verification",{closable:!0,overlayClosable:!0,body:!0,title:"Checkout.WebConfirmation.Title"}),this.url=e,this.openPathAfter=t,this.d()}d(){const e=this.telegramWebView=Si({url:this.url});e.addEventListener("web_app_open_tg_link",(e=>{this.dispatchEvent("finish"),this.hide(),this.openPathAfter&&Jr.openUrl("https://t.me"+e.path_full)})),this.body.append(e.iframe),this.show(),e.onMount()}destroy(){return this.telegramWebView.destroy(),super.destroy()}}var Li=i(6830),Ei=i(5029);class Ii extends L.ZP{constructor(e){super(e),this.options=e,this.onKeyDown=e=>{var t,i;this.lastKeyDown=e.key,null===(i=(t=this.options).onKeyDown)||void 0===i||i.call(t,e)},this.onInput=()=>{var e,t;const i=this.value,s="Backspace"===this.lastKeyDown&&(this.lastTransformed&&this.lastTransformed.value.length||0)-i.length==1,n=this.lastTransformed=function(e){const{value:t,getPattern:i,deleting:s,input:n}=e,a=!s&&!!t.length,o=function(e,t,i={},s){const n=e(t);if(!n)return{value:t,selection:null,autocorrectComplete:!!t};const a=n.length,o=[],r=[];let d=0,l=0,c=0===i.selectionStart?0:null,h=0===i.selectionEnd?0:null;const u=e=>{e>0&&(null===c&&l+1>=i.selectionStart&&(c=ui(o)+(s?r.length:0)),null===h&&l+1>=i.selectionEnd&&(h=ui(o)+(s?r.length:0)),l+=e)};for(;d=t.length)break;r.push(a),++d,u(c)}}return s&&o.push(...r),{value:o.join(""),selection:{selectionStart:null===c||t.length&&i.selectionStart===t.length?ui(o):c,selectionEnd:null===h||t.length&&i.selectionEnd===t.length?ui(o):h},autocorrectComplete:d===a}}(i,t,{selectionStart:n?n.selectionStart:0,selectionEnd:n?n.selectionEnd:0},a),{value:r,selection:d}=o;return{value:r,meta:{autocorrectComplete:o.autocorrectComplete,empty:!r},selection:d}}({value:i,getPattern:this.options.formatMethod,deleting:s,input:this.input}),a=n.value;a!==i&&(this.setValueSilently(a),n.selection&&(this.input.selectionStart=n.selection.selectionStart,this.input.selectionEnd=n.selection.selectionEnd)),this.validateNew(a,{ignoreIncomplete:!0}),null===(t=(e=this.options).onChange)||void 0===t||t.call(e,n)},this.onBlur=()=>{var e;const t=null===(e=this.lastTransformed)||void 0===e?void 0:e.value;t&&this.validateNew(t)},this.validate=()=>this.validateNew(),this.input.addEventListener("keydown",this.onKeyDown),this.input.addEventListener("input",this.onInput),this.input.addEventListener("blur",this.onBlur)}update(){this.onInput()}validateNew(e,t,i){var s,n,a,o,r;let d;if(void 0===e&&(e=null!==(n=null===(s=this.lastTransformed)||void 0===s?void 0:s.value)&&void 0!==n?n:""),void 0===t&&(t={}),d=this.options.validateMethod?null===(o=(a=this.options).validateMethod)||void 0===o?void 0:o.call(a,e,t):function(e,t,i={}){return e.meta.autocorrectComplete||i.ignoreIncomplete?null:fi("incomplete")}(this.lastTransformed,0,t),null==d?void 0:d.code){const e=null===(r=this.options.errorKeys)||void 0===r?void 0:r[d.code];return!i&&this.setState(L.I1.Error,e),!1}return!i&&this.setState(L.I1.Neutral),!0}}function Mi(e,t){const i=()=>{const i=e.every((e=>"validateNew"in e?e.validateNew(void 0,void 0,!0):e.isValid()));t(i)};return e.forEach((e=>{if(e instanceof Ii){const t=e.options.onChange;e.options.onChange=(...e)=>{null==t||t(...e),i()},"update"in e&&e.update()}else e.input.addEventListener("input",i)})),{validate:i}}function Pi(e,t){let i,s;return(e||t)&&(e&&(i=new bi.Z({noPhoneCodes:!0,onCountryChange:()=>{null==s||s.update()},required:!0,autocomplete:"country"})),t&&(s=new Ii({label:"PaymentShippingZipPlaceholder",plainText:!0,inputMode:"numeric",autocomplete:"postal-code",formatMethod:()=>{const{country:e}=i.getSelected(),t=null==e?void 0:e.iso2;return hi.postalCodeFromCountry(t&&t.toUpperCase())}}))),{countryInputField:i,postcodeInputField:s}}const Zi=new Set(["stripe","smartglocal"]);class ki extends w.Z{constructor(e,t){if(super("popup-payment popup-payment-card",{closable:!0,overlayClosable:!0,body:!0,scrollable:Zi.has(e.native_provider),title:"PaymentCardInfo"}),this.paymentForm=e,this.savedCard=t,Zi.has(e.native_provider))this.d();else{const t=this.telegramWebView=Si({url:e.url});t.addEventListener("payment_form_submit",(t=>{const i={title:t.title,save:!1};this.dispatchEvent("finish",{token:t.credentials,card:i}),this.hide(),e.pFlags.can_save_credentials&&(0,vi.Z)({titleLangKey:"PaymentCardSavePaymentInformation",descriptionLangKey:"PaymentCardSavePaymentInformationInfoLine1",button:{langKey:"Save"}}).then((()=>{i.save=!0}),Qe.Z)})),this.body.append(t.iframe),this.show(),t.onMount()}}destroy(){var e;return null===(e=this.telegramWebView)||void 0===e||e.destroy(),super.destroy()}d(){const e=this.savedCard,t=new Ei.Z({name:"PaymentInfo.Card.Title",noDelimiter:!0,noShadow:!0}),i=JSON.parse(this.paymentForm.native_params.data);let s,n,a=0;const o=new Ii({label:"PaymentCardNumber",plainText:!0,inputMode:"numeric",autocomplete:"cc-number",formatMethod:hi.cardNumber,validateMethod:mi,errorKeys:{invalid:"PaymentCard.Error.Invalid",incomplete:"PaymentCard.Error.Incomplete"},onChange:e=>{(e=>{if(s===e)return;const t=++a;s=e;const i=Ni(e);if(!i)return void(n&&(n.remove(),n=void 0));const r=new Image;r.classList.add("input-field-icon"),(0,Ot.cj)(r,i,!1).then((()=>{a===t&&(n?n.replaceWith(r):o.container.append(r),n=r)}))})(Bt(e.value)),l.update()}});let r;i.need_cardholder_name&&(r=new L.ZP({label:"Checkout.NewCard.CardholderNamePlaceholder",maxLength:255,required:!0,autocomplete:"cc-name"}));const d=new Ii({label:"SecureId.Identity.Placeholder.ExpiryDate",plainText:!0,inputMode:"numeric",autocomplete:"cc-exp",formatMethod:hi.cardExpiry,validateMethod:gi});d.input.addEventListener("input",(()=>{let e=d.value;if(e.length<5)return;const t=e.split("/");4===t[1].length&&(e=[t[0],t[1].slice(2)].join("/"),d.setValueSilently(e))}),{capture:!0});const l=new Ii({labelText:"CVC",plainText:!0,inputMode:"numeric",autocomplete:"cc-csc",name:"cvc",formatMethod:()=>hi.cardCvc(o.value)}),c=(new Li.T(l.container,l.input),[o,d,l,r].filter(Boolean));c.forEach((e=>{const t=t=>{if(!e.value&&"Backspace"===t.key){const t=c[c.indexOf(e)-1];t&&(0,Nt.Z)(t.input,!0)}};if(e instanceof Ii){e.options.onKeyDown=t;const i=e.options.onChange;e.options.onChange=t=>{if(null==i||i(t),document.activeElement===e.input&&t.meta.autocorrectComplete)for(let t=c.indexOf(e),i=c.length;te.container))));const g=!!this.paymentForm.pFlags.can_save_credentials,v=new zt.Z({text:"PaymentCardSavePaymentInformation",checked:!!g}),b=new Gt.ZP({checkboxField:v,subtitleLangKey:g?"PaymentCardSavePaymentInformationInfoLine1":"Checkout.2FA.Text"});g||b.container.classList.add("is-disabled"),(p||t).content.append(b.container),this.scrollable.append(...[t,p].filter(Boolean).map((e=>e.container)));const y=Oi({key:"PaymentInfo.Done",onClick:()=>{return e=this,t=void 0,n=function*(){const e={cardNumber:o.value,expiryFull:d.value,expiryMonth:d.value.split("/")[0],expiryYear:d.value.split("/")[1],cvc:l.value,cardholderName:null==r?void 0:r.value,country:null==f?void 0:f.value,zip:null==m?void 0:m.value,save:null==v?void 0:v.checked},t=this.paymentForm.native_provider;let s;if("stripe"===t){const t=new URL("https://api.stripe.com/v1/tokens");t.search=new URLSearchParams({"card[number]":e.cardNumber,"card[exp_month]":e.expiryMonth,"card[exp_year]":e.expiryYear,"card[cvc]":e.cvc,"card[address_zip]":e.zip,"card[address_country]":e.country,"card[name]":e.cardholderName}).toString();const n=yield fetch(t.toString(),{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:`Bearer ${i.publishable_key}`}});s=yield n.json()}else if("smartglocal"===t){const t={card:{number:e.cardNumber.replace(/[^\d]+/g,""),expiration_month:e.expiryMonth,expiration_year:e.expiryYear,security_code:e.cvc.replace(/[^\d]+/g,"")}},n="https://tgb.smart-glocal.com/cds/v1/tokenize/card",a=yield fetch(n,{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","X-PUBLIC-TOKEN":i.public_token},body:JSON.stringify(t)});s={type:"card",token:(yield a.json()).data.token}}this.dispatchEvent("finish",{token:s,card:e}),this.hide()},new((s=void 0)||(s=Promise))((function(i,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}d((n=n.apply(e,t||[])).next())}));var e,t,s,n}});Mi([o,r,d,l,f,m].filter(Boolean),(e=>{y.disabled=!e})),e&&(o.value=e.cardNumber,d.value=e.expiryFull,l.value=e.cvc,r&&(r.value=e.cardholderName),f&&(f.value=e.country),m&&(m.value=e.zip)),this.body.append(this.btnConfirmOnEnter=y),this.show(),o.validateNew(void 0,void 0,!0)||(0,Nt.Z)(o.input)}}class Ti extends w.Z{constructor(e,t){super("popup-payment popup-payment-card-confirmation",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"Checkout.PasswordEntry.Title"});const i=new Ei.Z({noDelimiter:!0,noShadow:!0,caption:"Checkout.PasswordEntry.Text",captionArgs:[e]}),s=new Li.Z({labelText:t.hint});i.content.append(s.container),this.scrollable.append(i.container);const n=()=>{a.disabled=!s.value,s.setState(L.I1.Neutral)};s.input.addEventListener("input",n);const a=Oi({key:"Checkout.PasswordEntry.Pay",onClick:()=>{return e=this,i=void 0,a=function*(){try{const e=yield this.managers.passwordManager.getInputCheckPassword(s.value,t),i=yield this.managers.apiManager.invokeApi("account.getTmpPassword",{password:e,period:60});this.dispatchEvent("finish",i),this.hide()}catch(e){throw"PASSWORD_HASH_INVALID"===e.type&&(e.handled=!0,s.setError("PASSWORD_HASH_INVALID")),e}},new((n=void 0)||(n=Promise))((function(t,s){function o(e){try{d(a.next(e))}catch(e){s(e)}}function r(e){try{d(a.throw(e))}catch(e){s(e)}}function d(e){var i;e.done?t(e.value):(i=e.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(e,i||[])).next())}));var e,i,n,a}});this.body.append(this.btnConfirmOnEnter=a),n(),this.show(),(0,Nt.Z)(s.input)}}var xi=i(1171),Ai=i(709);class _i extends w.Z{constructor(e,t,i){super("popup-payment popup-payment-shipping",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"PaymentShippingInfo"}),this.paymentForm=e,this.inputInvoice=t,this.focus=i,this.d()}d(){const e=this.paymentForm.invoice,t=this.paymentForm.saved_info;let i,s,n,a,o,r,d,l,c,h,u;if(e.pFlags.shipping_address_requested){i=new Ei.Z({name:"PaymentShippingAddress",noDelimiter:!0,noShadow:!0}),s=new L.ZP({label:"PaymentShippingAddress1Placeholder",maxLength:64,required:!0}),n=new L.ZP({label:"PaymentShippingAddress2Placeholder",maxLength:64}),a=new L.ZP({label:"PaymentShippingCityPlaceholder",maxLength:64,required:!0}),o=new L.ZP({label:"PaymentShippingStatePlaceholder",maxLength:64});const e=Pi(!0,!0);r=e.countryInputField,d=e.postcodeInputField,i.content.append(...[s,n,a,o,r,d].filter(Boolean).map((e=>e.container)))}if([e.pFlags.name_requested,e.pFlags.email_requested,e.pFlags.phone_requested].includes(!0)){l=new Ei.Z({name:"PaymentShippingReceiver",noDelimiter:!0,noShadow:!0});const t=()=>{const e=h.value,t=(0,xi.Z)(e);return!(!t||t[0].length!==e.length)},i=()=>!!u.value.match(/\d/);e.pFlags.name_requested&&(c=new L.ZP({label:"PaymentShippingName",maxLength:256,required:!0})),e.pFlags.email_requested&&(h=new L.ZP({label:"PaymentShippingEmailPlaceholder",maxLength:64,required:!0,validate:t})),e.pFlags.phone_requested&&(u=new Ai.Z({required:!0,validate:i})),l.content.append(...[c,h,u].filter(Boolean).map((e=>e.container)))}const p=new zt.Z({text:"PaymentShippingSave",checked:!0}),f=new Gt.ZP({checkboxField:p,subtitleLangKey:"PaymentShippingSaveInfo"});(l||i).content.append(f.container),this.scrollable.append(...[i,l].filter(Boolean).map((e=>e.container)));const m=Oi({key:"PaymentInfo.Done",onClick:()=>{return e=this,t=void 0,l=function*(){const e=r&&r.getSelected().country,t={_:"paymentRequestedInfo",shipping_address:e&&{_:"postAddress",street_line1:s.value,street_line2:n.value,city:a.value,state:o.value,country_iso2:null==e?void 0:e.iso2,post_code:d.value},name:null==c?void 0:c.value,email:null==h?void 0:h.value,phone:null==u?void 0:u.value};try{const e=yield this.managers.appPaymentsManager.validateRequestedInfo(this.inputInvoice,t,null==p?void 0:p.checked);this.dispatchEvent("finish",{shippingAddress:t,requestedInfo:e}),this.hide()}catch(e){const t={ADDRESS_STREET_LINE1_INVALID:s,ADDRESS_STREET_LINE2_INVALID:n,ADDRESS_COUNTRY_INVALID:r,ADDRESS_CITY_INVALID:a,ADDRESS_STATE_INVALID:o,ADDRESS_POSTCODE_INVALID:d,REQ_INFO_NAME_INVALID:c,REQ_INFO_EMAIL_INVALID:h,REQ_INFO_PHONE_INVALID:u}[e.type];throw t&&(t.setError(),e.handled=!0),e}},new((i=void 0)||(i=Promise))((function(s,n){function a(e){try{r(l.next(e))}catch(e){n(e)}}function o(e){try{r(l.throw(e))}catch(e){n(e)}}function r(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,o)}r((l=l.apply(e,t||[])).next())}));var e,t,i,l}});if(this.body.append(this.btnConfirmOnEnter=m),t){const e=t.shipping_address;e&&(s.value=e.street_line1,n.value=e.street_line2,a.value=e.city,o.value=e.state,r.selectCountryByIso2(e.country_iso2),d.value=e.post_code),t.name&&c&&(c.value=t.name),t.email&&h&&(h.value=t.email),t.phone&&u&&(u.value=t.phone)}const{validate:g}=Mi([s,n,a,o,r,d,c,h,u].filter(Boolean),(e=>{m.disabled=!e}));let v;g(),this.show(),v=this.focus?{name:c,email:h,phone:u}[this.focus]:s,v&&(0,Nt.Z)(v.input)}}var Fi=i(1218);class Di extends w.Z{constructor(e,t,i){super("popup-payment popup-payment-shipping-methods",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:"PaymentShippingMethod"}),this.paymentForm=e,this.requestedInfo=t,this.shippingOption=i,this.d()}d(){const e=new Ei.Z({name:"PaymentCheckoutShippingMethod",noDelimiter:!0,noShadow:!0}),t=this.requestedInfo.shipping_options.map((e=>new Gt.ZP({radioField:new Fi.Z({text:e.title,name:"shipping-method",value:e.id}),subtitle:(0,Pt.Z)(Tt(e.prices.map((({amount:e})=>+e)),0),this.paymentForm.invoice.currency)})));let i;const s=(0,Gt.De)(t,(e=>{i=e}));this.shippingOption?t.find((e=>e.radioField.input.value===this.shippingOption.id)).radioField.checked=!0:t[0].radioField.checked=!0,e.content.append(s),this.scrollable.append(e.container);const n=Oi({key:"PaymentInfo.Done",onClick:()=>{this.dispatchEvent("finish",this.requestedInfo.shipping_options.find((e=>e.id===i))),this.hide()}});this.body.append(this.btnConfirmOnEnter=n),this.show()}}var Ri=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Bi=["amex","card","diners","discover","jcb","mastercard","visa","unionpay","mir","logo"];function Ni(e){if(Bi.includes(e))return`assets/img/${e}.svg`}function Oi(e){var t,i;const s=null!==(t=e.textEl)&&void 0!==t?t:new C.ZP.IntlElement({key:null!==(i=e.key)&&void 0!==i?i:"PaymentInfo.Done"}),n=s.key,a=(0,Ue.Z)("btn-primary btn-color-primary payment-item-pay");return a.append(s.element),(0,S.fc)(a,(()=>Ri(this,void 0,void 0,(function*(){const t=e.onClick();if(!(t instanceof Promise))return;const i=(0,jt.y)(a),o=(0,Ut.Z)([a],!0);s.compareAndUpdate({key:"PleaseWait"});try{yield t}catch(e){e.handled||console.error("payment button error",e),o(),s.compareAndUpdate({key:n}),i.remove()}})))),a}class Ui extends w.Z{constructor(e,t,i,s){super("popup-payment",{closable:!0,overlayClosable:!0,body:!0,scrollable:!0,title:!0}),this.message=e,this.inputInvoice=t,this.paymentForm=i,this.isReceipt=s,this.tipButtonsMap=new Map,this.d().catch((e=>{console.error("payment popup error",e),this.hide()}))}d(){var e,t,i;return Ri(this,void 0,void 0,(function*(){this.element.classList.add("is-loading"),this.show();let s=!1;const n=()=>{s||(s=!0,ke&&ke.hide(),this.hide())};let{paymentForm:a,message:o}=this;o&&this.listenerSetter.add(d.Z)("payment_sent",(({peerId:e,mid:t})=>{o.peerId===e&&o.mid===t&&n()}));const r=null==o?void 0:o.media,l=null!==(e=this.isReceipt)&&void 0!==e?e:r?!!r.receipt_msg_id||"messageExtendedMedia"===(null===(t=r.extended_media)||void 0===t?void 0:t._):"payments.paymentReceipt"===a._,c=r?r.pFlags.test:a.invoice.pFlags.test,h=r?r.photo:a.photo,u=r?r.title:a.title,p=r?r.description:a.description;(0,C.$d)(this.title,l?"PaymentReceipt":"PaymentCheckout"),c&&this.title.append(" (Test)");const m="payment-item",g=document.createElement("div");g.classList.add(m);const v=m+"-details",b=document.createElement("div");let y;b.classList.add(v),h&&(y=document.createElement("div"),y.classList.add(v+"-photo","media-container-contain"),(0,V.Z)({photo:h,container:y,boxWidth:100,boxHeight:100,size:{_:"photoSizeEmpty",type:""}}),b.append(y));const w=v+"-lines",L=document.createElement("div");L.classList.add(w);const E=document.createElement("div");E.classList.add(w+"-title");const I=document.createElement("div");I.classList.add(w+"-description");const M=document.createElement("div");M.classList.add(w+"-bot-name"),L.append(E,I,M),(0,_.Z)(E,(0,R.Z)(u)),(0,_.Z)(I,(0,R.Z)(p));const P=new B.Z;M.append(P.element),b.append(L),g.append(b),this.scrollable.append(g);const Z=document.createElement("div");Z.classList.add(m+"-preloader-container"),(0,jt.y)(Z,!0),this.scrollable.container.append(Z);const k=this.inputInvoice;a||(a=l?yield this.managers.appPaymentsManager.getPaymentReceipt(o.peerId,r.receipt_msg_id||k.msg_id):yield this.managers.appPaymentsManager.getPaymentForm(k),this.paymentForm=a);let T=a.saved_info||a.info;const x=null===(i=a.saved_credentials)||void 0===i?void 0:i[0];let[A,F,D]=yield Promise.all([!l&&T&&this.managers.appPaymentsManager.validateRequestedInfo(k,T),x&&this.managers.passwordManager.getState(),(0,Vt.Z)({peerId:a.provider_id.toPeerId()})]);yield P.update({peerId:a.bot_id.toPeerId()}),Z.remove(),this.element.classList.remove("is-loading");const N=(e,t)=>(0,Pt.Z)(e,H,t),{invoice:O}=a,H=O.currency,z=O.pFlags.recurring&&!l;yield P.update({peerId:a.bot_id.toPeerId()});const j=z?yield(0,Vt.Z)({peerId:a.bot_id.toPeerId()}):void 0;Z.remove(),this.element.classList.remove("is-loading");const G=()=>{const e=document.createElement("div");e.classList.add(K+"-price");const t=document.createElement("span"),i=document.createElement("span");return e.append(t,i),{label:e,left:t,right:i}},K=m+"-prices",W=document.createElement("div");W.classList.add(K);const $=e=>e.map((e=>{const{amount:t,label:i}=e,s=G();s.left.textContent=i;const n=N(t);return s.right.textContent=n,s.label})),q=$(O.prices);let Q=()=>0,Y=0;const X=()=>{const e=N(te+Q()+Y);ee.right.textContent=e,J.compareAndUpdate({key:"PaymentCheckoutPay",args:[e]})},J=new C.ZP.IntlElement,ee=G();ee.label.classList.add("is-total"),(0,C.$d)(ee.left,"PaymentTransactionTotal");const te=Tt(O.prices.map((({amount:e})=>+e)),0),ie=void 0!==O.max_tip_amount&&!l||!!a.tip_amount;if(ie){const e=m+"-tips",t=Zt.Z[H];Q=()=>+i().replace(/\D/g,"");const i=()=>r.value,s=()=>{const e=(0,xt.Z)(i(),`500 ${kt.Bf} ${kt.bt}`);r.style.width=e+"px"},n=e=>{e=Math.min(+e,+O.max_tip_amount);const t=N(e,!0);r.value=t,document.activeElement===r&&(0,Nt.Z)(r),g&&g();const i=this.tipButtonsMap.get(e);i&&i.classList.add("active"),s(),X()},o=G();(0,C.$d)(o.left,l?"PaymentTip":"PaymentTipOptional");const r=document.createElement("input");r.type="tel",r.classList.add("input-clear",e+"-input"),o.right.append(r),l?o.label.classList.add("disable-hover"):o.label.style.cursor="text",o.label.addEventListener("mousedown",(e=>{(0,Be.Z)(e.target,r)||(0,Nt.Z)(r)}));const d=r instanceof HTMLInputElement?1:2,c=()=>{p?--p:(p=d,(0,Nt.Z)(r))},h=()=>{setTimeout((()=>{p=d,(0,Nt.Z)(r),document.addEventListener("selectionchange",c)}),0)},u=()=>{r.addEventListener("focus",h,{once:!0}),document.removeEventListener("selectionchange",c)};let p;r.addEventListener("focusout",u),u(),r.addEventListener("input",(()=>{n(Q())}));const f=[t.symbol,t.space_between?" ":""];let g;if(t.symbol_left||f.reverse(),o.right[t.symbol_left?"prepend":"append"](f.join("")),q.push(o.label),l)n(a.tip_amount);else{const t=document.createElement("div");t.classList.add(e);const i=e+"-tip",s=O.suggested_tip_amounts.map((e=>{const t=(0,Ue.Z)(i,{noRipple:!0});return t.textContent=N(e),this.tipButtonsMap.set(+e,t),t}));g=()=>{const e=t.querySelector(".active");e&&e.classList.remove("active")},(0,S.fc)(t,(e=>{const t=(0,ve.Z)(e.target,i);if(!t)return;let s=0;if(t.classList.contains("active"))t.classList.remove("active");else{g(),t.classList.add("active");for(const[e,i]of this.tipButtonsMap)if(i===t){s=e;break}}n(s)})),n(0),t.append(...s),q.push(t)}}else X();q.push(ee.label),W.append(...q),g.append(W);const se=(e,t)=>Ri(this,void 0,void 0,(function*(){const i=document.createElement("img");i.classList.add("media-photo"),yield(0,Ot.cj)(i,Ni(t));let s=e.media;s?(0,U.Z)(s,i):(s=e.createMedia("small"),s.classList.add("media-container-cover"),s.append(i)),e.container.classList.remove("row-with-icon")})),ne=e=>{e.titleLangKey&&(e.subtitleLangKey=e.titleLangKey),e.noWrap=!0;const t=new Gt.ZP(e);return t.container.classList.add(m+"-row"),e.titleLangKey&&t.subtitle.classList.add("hide"),t},ae=(e,t)=>{if(e.title.textContent=t,!t){const t=C.ZP.weakMap.get(e.subtitle.firstElementChild);e.title.append((0,C.ag)(t.key))}e.subtitle.classList.toggle("hide",!t)},oe=e=>{let t,i,s;"title"in e?(t=e.title.split(" ").shift(),i=e.title,s=e.icon):(t=Bt(e.cardNumber),i=t+" *"+e.cardNumber.split(" ").pop()),ce.title.classList.remove("tgico","tgico-card_outline"),se(ce,s||t.toLowerCase()),ae(ce,i)},re=()=>{new ki(a,de).addEventListener("finish",(({token:e,card:t})=>{le=e,de=t,oe(t)}))};let de,le;const ce=ne({titleLangKey:"PaymentCheckoutMethod",clickable:l?void 0:re,icon:"card_outline"});ce.container.classList.add(m+"-method-row"),x?oe(x):a.credentials_title&&oe({title:a.credentials_title});const he=ne({title:D,subtitleLangKey:"PaymentCheckoutProvider"}),ue=new f.Z;let pe,fe,me,ge,be,we,Se,Ce;ue.classList.add("avatar-32"),he.createMedia("small").append(ue),ue.updateWithOptions({peerId:a.provider_id.toPeerId()});const Le=O.pFlags.shipping_address_requested?e=>{if(!e)return be.subtitle.classList.add("hide"),void(0,U.Z)(be.title,(0,C.ag)("PaymentShippingAddress"));const t=e.shipping_address;ae(pe,[t.city,t.street_line1,t.street_line2].filter(Boolean).join(", ")),be.container.classList.toggle("hide",!A&&!l)}:void 0,Ee=e=>{Le&&Le(e),fe&&ae(fe,e.name),me&&ae(me,e.email),ge&&ae(ge,e.phone&&"+"+(0,Ae.u)(e.phone).formatted)};if(l||(Se=e=>{new _i(a,k,e).addEventListener("finish",(({shippingAddress:e,requestedInfo:t})=>{A=t,T=a.saved_info=e,Ee(e)}))}),O.pFlags.shipping_address_requested){const e=e=>{const i=new at(this.scrollable,void 0,!0);if(i.save(),t&&t.forEach((e=>e.remove())),!e)return Y=0,X(),i.restore(),void this.onContentUpdate();we=e,ae(be,e.title),Y=Tt(e.prices.map((({amount:e})=>+e)),0),t=$(e.prices);let s=ee.label;ie&&(s=s.previousElementSibling,l||(s=s.previousElementSibling)),t.forEach((e=>s.parentElement.insertBefore(e,s))),X(),i.restore(),this.onContentUpdate()};let t;pe=ne({icon:"location",titleLangKey:"PaymentShippingAddress",clickable:!l&&Se.bind(null,void 0)}),be=ne({icon:"shipping",titleLangKey:"PaymentCheckoutShippingMethod",clickable:!l&&(Ce=()=>{new Di(a,A,we).addEventListener("finish",(t=>{e(t)}))})}),be.container.classList.add("hide");const i=a.shipping;i&&e(i)}O.pFlags.name_requested&&(fe=ne({icon:"newprivate",titleLangKey:"PaymentCheckoutName",clickable:!l&&Se.bind(null,"name")})),O.pFlags.email_requested&&(me=ne({icon:"mention",titleLangKey:"PaymentShippingEmailPlaceholder",clickable:!l&&Se.bind(null,"email")})),O.pFlags.phone_requested&&(ge=ne({icon:"phone",titleLangKey:"PaymentCheckoutPhoneNumber",clickable:!l&&Se.bind(null,"phone")})),T&&Ee(T);const Ie=[ce,he,pe,be,fe,me,ge].filter(Boolean),Me=z&&new zt.Z({text:"Payments.Recurrent.Accept",textArgs:[(0,ft.ZP)(O.recurring_terms_url),j]}),Pe=z&&ne({checkboxField:Me}),Ze=z?[document.createElement("hr"),Pe.container]:[];let ke,Te;this.scrollable.append(...[document.createElement("hr"),...Ie.map((e=>e.container)),...Ze].filter(Boolean));const xe=()=>{_e.disabled=!(!Me||Me.checked)};let _e;_e=Oi(l?{onClick:()=>this.hide(),key:"Done"}:{onClick:()=>{const e=O.pFlags.name_requested&&!(null==T?void 0:T.name)?"name":O.pFlags.email_requested&&!(null==T?void 0:T.email)?"email":O.pFlags.phone_requested&&!(null==T?void 0:T.phone)?"phone":void 0;if(O.pFlags.shipping_address_requested){if(!A)return void Se();if(!we)return void Ce()}else if(e)return void Se(e);return de||Te?Promise.resolve().then((()=>Ri(this,void 0,void 0,(function*(){const e=Te?{_:"inputPaymentCredentialsSaved",id:x.id,tmp_password:Te.tmp_password}:{_:"inputPaymentCredentials",data:{_:"dataJSON",data:JSON.stringify(le.token?le:{type:le.type,id:le.id})},pFlags:{save:de.save||void 0}};try{const t=yield this.managers.appPaymentsManager.sendPaymentForm(k,a.form_id,null==A?void 0:A.id,null==we?void 0:we.id,e,Q());"payments.paymentResult"===t._?n():(ke=new Ci(t.url,!r.extended_media),ke.addEventListener("finish",(()=>{ke=void 0,n()})),yield new Promise(((e,t)=>{ke.addEventListener("close",(()=>{if(ke=void 0,s)e();else{const e=new Error("payment not finished");e.handled=!0,t(e)}}))})))}catch(e){throw"BOT_PRECHECKOUT_TIMEOUT"===e.type?((0,ye.bC)({langPackKey:"Error.AnError"}),e.handled=!0):"TMP_PASSWORD_INVALID"===e.type&&(F=Te=void 0,(0,S.tH)(_e),e.handled=!0),e}})))):x?void Promise.resolve(null!=F?F:this.managers.passwordManager.getState()).then((e=>{new Ti(x.title,e).addEventListener("finish",(e=>{F=void 0,Te=e,(0,S.tH)(_e);const t=e.valid_until-(0,Ht.Z)(!0)-5;setTimeout((()=>{Te===e&&(Te=void 0)}),1e3*t)}))})):void re()},textEl:J}),xe(),Me&&Me.input.addEventListener("change",xe),this.body.append(this.btnConfirmOnEnter=_e),this.onContentUpdate()}))}}var Hi=i(8487),zi=i(13),ji=i(9259),Gi=i(3228);class Vi{constructor(e,t,i,s,n=t){this.sizes=e,this.maxWidth=t,this.minWidth=i,this.spacing=s,this.maxHeight=n,this.count=e.length,this.ratios=Vi.countRatios(e),this.proportions=Vi.countProportions(this.ratios),this.averageRatio=Tt(this.ratios,1)/this.count,this.maxSizeRatio=t/this.maxHeight}layout(){return this.count?this.count>=5||this.ratios.find((e=>e>2))?new Ki(this.ratios,this.averageRatio,this.maxWidth,this.minWidth,this.spacing).layout():2===this.count?this.layoutTwo():3===this.count?this.layoutThree():this.layoutFour():[]}layoutTwo(){return"ww"===this.proportions&&this.averageRatio>1.4*this.maxSizeRatio&&this.ratios[1]-this.ratios[0]<.2?this.layoutTwoTopBottom():"ww"===this.proportions||"qq"===this.proportions?this.layoutTwoLeftRightEqual():this.layoutTwoLeftRight()}layoutThree(){return"n"===this.proportions[0]?this.layoutThreeLeftAndOther():this.layoutThreeTopAndOther()}layoutFour(){return"w"===this.proportions[0]?this.layoutFourTopAndOther():this.layoutFourLeftAndOther()}layoutTwoTopBottom(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],(this.maxHeight-this.spacing)/2)));return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:e,height:t},sides:14}]}layoutTwoLeftRightEqual(){const e=(this.maxWidth-this.spacing)/2,t=Math.round(Math.min(e/this.ratios[0],Math.min(e/this.ratios[1],1*this.maxHeight)));return[{geometry:{x:0,y:0,width:e,height:t},sides:13},{geometry:{x:e+this.spacing,y:0,width:e,height:t},sides:7}]}layoutTwoLeftRight(){const e=Math.round(1.5*this.minWidth),t=Math.min(Math.round(Math.max(.4*(this.maxWidth-this.spacing),(this.maxWidth-this.spacing)/this.ratios[0]/(1/this.ratios[0]+1/this.ratios[1]))),this.maxWidth-this.spacing-e),i=this.maxWidth-t-this.spacing,s=Math.min(this.maxHeight,Math.round(Math.min(i/this.ratios[0],t/this.ratios[1])));return[{geometry:{x:0,y:0,width:i,height:s},sides:13},{geometry:{x:i+this.spacing,y:0,width:t,height:s},sides:7}]}layoutThreeLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min((this.maxHeight-this.spacing)/2,this.ratios[1]*(this.maxWidth-this.spacing)/(this.ratios[2]+this.ratios[1]))),i=e-t-this.spacing,s=Math.max(this.minWidth,Math.round(Math.min((this.maxWidth-this.spacing)/2,Math.min(t*this.ratios[2],i*this.ratios[1])))),n=Math.min(Math.round(e*this.ratios[0]),this.maxWidth-this.spacing-s);return[{geometry:{x:0,y:0,width:n,height:e},sides:13},{geometry:{x:n+this.spacing,y:0,width:s,height:i},sides:3},{geometry:{x:n+this.spacing,y:i+this.spacing,width:s,height:t},sides:6}]}layoutThreeTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),i=(this.maxWidth-this.spacing)/2,s=Math.min(this.maxHeight-t-this.spacing,Math.round(Math.min(i/this.ratios[1],i/this.ratios[2]))),n=e-i-this.spacing;return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:i,height:s},sides:12},{geometry:{x:i+this.spacing,y:t+this.spacing,width:n,height:s},sides:6}]}layoutFourTopAndOther(){const e=this.maxWidth,t=Math.round(Math.min(e/this.ratios[0],.66*(this.maxHeight-this.spacing))),i=Math.round((this.maxWidth-2*this.spacing)/(this.ratios[1]+this.ratios[2]+this.ratios[3])),s=Math.max(this.minWidth,Math.round(Math.min(.4*(this.maxWidth-2*this.spacing),i*this.ratios[1]))),n=Math.round(Math.max(Math.max(1*this.minWidth,.33*(this.maxWidth-2*this.spacing)),i*this.ratios[3])),a=e-s-n-2*this.spacing,o=Math.min(this.maxHeight-t-this.spacing,i);return[{geometry:{x:0,y:0,width:e,height:t},sides:11},{geometry:{x:0,y:t+this.spacing,width:s,height:o},sides:12},{geometry:{x:s+this.spacing,y:t+this.spacing,width:a,height:o},sides:4},{geometry:{x:s+this.spacing+a+this.spacing,y:t+this.spacing,width:n,height:o},sides:6}]}layoutFourLeftAndOther(){const e=this.maxHeight,t=Math.round(Math.min(e*this.ratios[0],.6*(this.maxWidth-this.spacing))),i=Math.round((this.maxHeight-2*this.spacing)/(1/this.ratios[1]+1/this.ratios[2]+1/this.ratios[3])),s=Math.round(i/this.ratios[1]),n=Math.round(i/this.ratios[2]),a=e-s-n-2*this.spacing,o=Math.max(this.minWidth,Math.min(this.maxWidth-t-this.spacing,i));return[{geometry:{x:0,y:0,width:t,height:e},sides:13},{geometry:{x:t+this.spacing,y:0,width:o,height:s},sides:3},{geometry:{x:t+this.spacing,y:s+this.spacing,width:o,height:n},sides:2},{geometry:{x:t+this.spacing,y:s+n+2*this.spacing,width:o,height:a},sides:6}]}static countRatios(e){return e.map((e=>e.w/e.h))}static countProportions(e){return e.map((e=>e>1.2?"w":e<.8?"n":"q")).join("")}}class Ki{constructor(e,t,i,s,n,a=4*i/3){this.averageRatio=t,this.maxWidth=i,this.minWidth=s,this.spacing=n,this.maxHeight=a,this.ratios=Ki.cropRatios(e,t),this.count=e.length}static cropRatios(e,t){return e.map((e=>t>1.1?(0,Gi.Z)(e,1,2.75):(0,Gi.Z)(e,.6667,1)))}layout(){const e=new Array(this.count),t=[],i=(e,t)=>{const i=Tt(this.ratios.slice(e,e+t),0);return(this.maxWidth-(t-1)*this.spacing)/i},s=e=>{const s=[];let n=0;for(const t of e)s.push(i(n,t)),n+=t;t.push({lineCounts:e,heights:s})};for(let e=1;e!==this.count;++e){const t=this.count-e;e>3||t>3||s([e,t])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t){const i=this.count-e-t;e>3||t>(this.averageRatio<.85?4:3)||i>3||s([e,t,i])}for(let e=1;e!==this.count-1;++e)for(let t=1;t!==this.count-e;++t)for(let i=1;i!==this.count-e-t;++i){const n=this.count-e-t-i;e>3||t>3||i>3||n>3||s([e,t,i,n])}let n=null,a=0;for(const e of t){const{heights:t,lineCounts:i}=e,s=i.length,o=Tt(t,0)+this.spacing*(s-1),r=Math.min(...t),d=(Math.max(...t),r{for(let e=1;e!==s;++e)if(i[e-1]>i[e])return 1.5;return 1})(),c=Math.abs(o-this.maxHeight)*d*l;(!n||c2&e.sides)),s=i.geometry.width+i.geometry.x,n=t.find((e=>4&e.sides)),a=n.geometry.height+n.geometry.y,o=e.container;o.style.width=s+"px",o.style.height=a+"px";const r=o.children;t.forEach((({geometry:t,sides:i},n)=>{let d;if(d=r[n],d||(d=document.createElement("div"),o.append(d)),d.classList.add("album-item","grouped-item"),d.style.width=t.width/s*100+"%",d.style.height=t.height/a*100+"%",d.style.top=t.y/a*100+"%",d.style.left=t.x/s*100+"%",8&i&&1&i&&(d.style.borderTopLeftRadius="inherit"),8&i&&4&i&&(d.style.borderBottomLeftRadius="inherit"),2&i&&1&i&&(d.style.borderTopRightRadius="inherit"),2&i&&4&i&&(d.style.borderBottomRightRadius="inherit"),e.forMedia){const e=document.createElement("div");e.classList.add("album-item-media"),d.append(e)}}))}var $i=i(6131);function qi({messages:e,attachmentDiv:t,middleware:i,uploading:s,lazyLoadQueue:n,isOut:a,chat:r,loadPromises:l,autoDownload:c,managers:h=d.Z.managers,animationGroup:u}){const p=[];for(const t of e){const e=(0,vt.Z)(t),i="photo"===e._?(0,z.Z)(e,480,480):{w:e.w,h:e.h};p.push({size:i,media:e,message:t})}Wi({container:t,items:p.map((e=>({w:e.size.w,h:e.size.h}))),maxWidth:o.Z.active.album.width,minWidth:100,spacing:2,forMedia:!0});const{width:f,height:m}=t.style,g=parseInt(f),v=parseInt(m);p.forEach(((e,s)=>{var o;const{size:r,media:d,message:p}=e,f=!!(null===(o=p.media.pFlags)||void 0===o?void 0:o.spoiler),m=t.children[s];m.dataset.mid=""+p.mid,m.dataset.peerId=""+p.peerId;const b=m.firstElementChild;let y;if(y="photo"===d._?(0,V.Z)({photo:d,message:p,container:b,boxWidth:0,boxHeight:0,isOut:a,lazyLoadQueue:n,middleware:i,size:r,loadPromises:l,autoDownloadSize:c.photo,managers:h}):(0,W.Z)({doc:d,container:b,message:p,boxWidth:0,boxHeight:0,withTail:!1,isOut:a,lazyLoadQueue:n,middleware:i,loadPromises:l,autoDownload:c,managers:h,noAutoplayAttribute:f}),y&&(null==l||l.push(y)),f){const e=(y||Promise.resolve()).then((()=>{return e=this,t=void 0,n=function*(){if(!i())return;const{width:e,height:t}=m.style,s=+e.slice(0,-1)/100*g,n=+t.slice(0,-1)/100*v,a=yield(0,$i.ZP)({media:d,animationGroup:u,middleware:i,width:s,height:n});i()&&b.append(a)},new((s=void 0)||(s=Promise))((function(i,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(o,r)}d((n=n.apply(e,t||[])).next())}));var e,t,s,n}));null==l||l.push(e)}}))}var Qi=i(296),Yi=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))},Xi=i(3552),Ji=i(8130);class es extends Xi._{init(e){return t=this,i=void 0,n=function*(){this.container.id="poll-results-container",this.container.classList.add("chatlist-container"),this.resultsDiv=document.createElement("div"),this.resultsDiv.classList.add("poll-results"),this.scrollable.append(this.resultsDiv);const t=yield this.managers.appPollsManager.getPoll(e.media.poll.id);this.setTitle(t.poll.pFlags.quiz?"PollResults.Title.Quiz":"PollResults.Title.Poll");const i=document.createElement("h3");(0,_.Z)(i,(0,R.Z)(t.poll.question));const s=t.results.results.map((e=>e.voters/t.results.total_voters*100));ss(s);const n=document.createDocumentFragment();t.results.results.forEach(((i,o)=>{if(!i.voters)return;const r=document.createElement("hr"),d=t.poll.answers[o],l=document.createElement("div");l.classList.add("poll-results-answer");const c=document.createElement("div");(0,_.Z)(c,(0,R.Z)(d.text));const h=document.createElement("div");h.innerText=Math.round(s[o])+"%",l.append(c,h);const u=Ji.default.createChatList();u.classList.add("poll-results-voters"),Ji.default.setListClickListener(u,(()=>{a.ZP.onCloseBtnClick()}),void 0,!0),u.style.minHeight=48*Math.min(i.voters,4)+"px",n.append(r,l,u);let p,f=4,m=!1,g=Math.max(0,i.voters-4);const v=()=>{m||(m=!0,this.managers.appPollsManager.getVotes(e,d.option,p,f).then((e=>{e.votes.forEach((e=>{const{dom:t}=Ji.default.addDialogNew({peerId:e.user_id.toPeerId(!1),container:u,rippleEnabled:!1,meAsSaved:!1,avatarSize:"small"});t.lastMessageSpan.parentElement.remove()})),p&&(g=Math.max(0,g-e.votes.length),g&&b.lastElementChild.replaceWith((0,C.ag)("PollResults.LoadMore",[Math.min(20,g)]))),p=e.next_offset,f=20,g&&e.votes.length||b.remove()})).finally((()=>{m=!1})))},b=(0,Ue.Z)("poll-results-more btn btn-primary btn-transparent",{icon:"down"});b.addEventListener("click",v),b.append((0,C.ag)("PollResults.LoadMore",[Math.min(20,g)])),n.append(b),v()})),this.resultsDiv.append(i,n),a.ZP.toggleSidebar(!0).then((()=>{}))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}}var ts=i(5157);let is=0;const ss=e=>{const t=e.reduce(((e,t)=>e+Math.round(t)),0);if(t>100){const i=t-100,s=e.length;for(let t=0;t=.5&&si&&(i=s,t=n)}if(-1===t)return;e[t]+=1-i}}};d.Z.addEventListener("poll_update",(({poll:e,results:t})=>{Array.from(document.querySelectorAll(`poll-element[poll-id="${e.id}"]`)).forEach((i=>{i.isClosed=!!e.pFlags.closed,i.performResults(t,e.chosenIndexes)}))})),o.Z.addEventListener("resize",(()=>{ls.setMaxLength(),ls.resizePolls()})),o.Z.addEventListener("changeScreen",(()=>{ls.setMaxLength()}));const ns=(e,t,i)=>{e.classList.remove("active"),clearTimeout(i),setTimeout((()=>{t(),e.remove(),as===e&&os===t&&rs===i&&(as=os=null,rs=0)}),200)};let as,os,rs,ds=!1;class ls extends HTMLElement{constructor(){super(...arguments),this.isClosed=!1,this.isQuiz=!1,this.isRetracted=!1,this.isPublic=!1,this.isMultiple=!1,this.chosenIndexes=[],this.chosingIndexes=[],this.sentVote=!1}static setMaxLength(){const e=xe.Z.width<=360?xe.Z.width-120:o.Z.active.poll.width;this.MAX_LENGTH=e+9+this.MAX_OFFSET+-13.7}static resizePolls(){this.MAX_LENGTH&&Array.from(document.querySelectorAll("poll-element.is-voted")).forEach((e=>{e.svgLines.forEach(((t,i)=>{e.setLineProgress(i,1)}))}))}render(){return e=this,t=void 0,s=function*(){is||(is=document.getElementById("poll-line").getTotalLength(),ls.setMaxLength());const{poll:e,results:t}=this.message.media;let i;this.message.pFlags.is_scheduled&&this.classList.add("disable-hover"),e.pFlags&&(this.isPublic=!!e.pFlags.public_voters,this.isQuiz=!!e.pFlags.quiz,this.isClosed=!!e.pFlags.closed,this.isMultiple=!!e.pFlags.multiple_choice,this.isClosed?(i="Chat.Poll.Type.Closed",this.classList.add("is-closed")):i=this.isQuiz?this.isPublic?"Chat.Poll.Type.Quiz":"Chat.Poll.Type.AnonymousQuiz":this.isPublic?"Chat.Poll.Type.Public":"Chat.Poll.Type.Anonymous"),this.classList.toggle("is-multiple",this.isMultiple);const s=this.isMultiple?'':"",n=e.answers.map(((e,t)=>`\n
\n
\n
\n \n \n \n ${s}\n
\n
\n
\n \n \n
\n `)).join("");if(this.innerHTML=`\n
\n
\n
\n
\n
\n ${n}`,(0,_.Z)(this.firstElementChild,(0,R.Z)(e.question)),Array.from(this.querySelectorAll(".poll-answer-text")).forEach(((t,i)=>{(0,_.Z)(t,(0,R.Z)(e.answers[i].text))})),this.descDiv=this.firstElementChild.nextElementSibling,this.typeDiv=this.descDiv.firstElementChild,this.avatarsDiv=this.descDiv.lastElementChild,i&&this.typeDiv.append((0,C.ag)(i)),this.isQuiz&&(this.classList.add("is-quiz"),e.close_period&&e.close_date)){const t=document.createElement("div");t.classList.add("poll-time"),this.descDiv.append(t);const i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.classList.add("poll-quiz-timer"),this.quizTimer=i;const s=2,n=7,a=2*Math.PI*n,o=document.createElementNS("http://www.w3.org/2000/svg","circle");o.classList.add("poll-quiz-timer-circle"),o.setAttributeNS(null,"cx","16"),o.setAttributeNS(null,"cy","16"),o.setAttributeNS(null,"r",""+n),o.setAttributeNS(null,"stroke-width",""+s),i.append(o),this.descDiv.append(i);const r=1e3*e.close_period,l=1e3*(e.close_date-(yield d.Z.managers.timeManager.getServerTimeOffset()));this.quizInterval=window.setInterval((()=>{const e=Date.now(),i=(l-e)/r,s=(l-e)/1e3+1|0;t.innerHTML=(0,ts.Z)(s),s<=5&&(t.style.color="#ee545c",o.style.stroke="#ee545c"),o.style.strokeDashoffset=a+i*a,o.style.strokeDasharray=`${a} ${a}`,e>=l&&(clearInterval(this.quizInterval),t.innerHTML="",o.style.strokeDashoffset=a,this.quizInterval=0,setTimeout((()=>{this.managers.appPollsManager.getResults(this.message)}),3e3))}),1e3)}this.answerDivs=Array.from(this.querySelectorAll(".poll-answer")),this.svgLines=Array.from(this.querySelectorAll(".poll-line")),this.numberDivs=Array.from(this.querySelectorAll(".poll-answer-percents"));const o=document.createElement("div");o.classList.add("poll-footer"),this.viewResults=document.createElement("div"),this.viewResults.className="poll-footer-button poll-view-results hide",this.viewResults.append((0,C.ag)("Chat.Poll.ViewResults")),this.votersCountDiv=document.createElement("div"),this.votersCountDiv.className="poll-votes-count",o.append(this.viewResults,this.votersCountDiv),this.append(o),this.viewResults.addEventListener("click",(e=>{(0,Ce.Z)(e),a.ZP.isTabExists(es)||a.ZP.createTab(es).open(this.message)})),(0,x.Z)(this.viewResults),this.isMultiple&&(this.sendVoteBtn=document.createElement("div"),this.sendVoteBtn.classList.add("poll-footer-button","poll-send-vote"),this.sendVoteBtn.append((0,C.ag)("Chat.Poll.SubmitVote")),(0,x.Z)(this.sendVoteBtn),e.chosenIndexes.length||this.votersCountDiv.classList.add("hide"),(0,S.fc)(this.sendVoteBtn,(e=>{(0,Ce.Z)(e),this.chosingIndexes.length&&this.sendVotes(this.chosingIndexes).then((()=>{this.chosingIndexes.length=0,this.answerDivs.forEach((e=>{e.classList.remove("is-chosing")}))}))})),o.append(this.sendVoteBtn));const r=!(e.chosenIndexes.length||this.isClosed);r&&!this.isPublic||this.performResults(t,e.chosenIndexes,!1),r&&(this.setVotersCount(t),(0,S.fc)(this,this.clickHandler))},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}initQuizHint(e){if(e.solution&&e.solution_entities){const t=document.createElement("div");if(t.classList.add("tgico-tip","poll-hint"),this.descDiv.append(t),(0,S.fc)(t,(i=>{(0,Ce.Z)(i),t.classList.add("active"),((e,t,i)=>{as&&ns(as,os,rs);const s=document.createElement("div");s.classList.add("quiz-hint");const n=document.createElement("div");n.classList.add("container","tgico");const a=document.createElement("div");a.classList.add("text"),n.append(a),s.append(n),(0,_.Z)(a,(0,ft.ZP)(e,{entities:t})),Jr.chat.bubbles.container.append(s),s.offsetLeft,s.classList.add("active"),as=s,os=i,rs=window.setTimeout((()=>{ns(s,i,rs)}),c.Z?5e3:7e3),ds||(ds=!0,Jr.addEventListener("peer_changed",(()=>{as&&ns(as,os,rs)})))})(e.solution,e.solution_entities,(()=>{t.classList.remove("active")}))})),this.sentVote){const i=e.results.find((e=>e.pFlags.correct));i&&!i.pFlags.chosen&&(0,S.tH)(t)}}}clickHandler(e){const t=(0,ve.Z)(e.target,"poll-answer");if(!t)return;(0,Ce.Z)(e);const i=+t.dataset.index;if(this.isMultiple){t.classList.toggle("is-chosing");const e=this.chosingIndexes.indexOf(i);-1!==e?this.chosingIndexes.splice(e,1):this.chosingIndexes.push(i)}else this.sendVotes([i])}sendVotes(e){if(this.sendVotePromise)return this.sendVotePromise;const t=this.answerDivs.filter(((t,i)=>e.includes(i)));return t.forEach((e=>{e.classList.add("is-voting")})),this.classList.add("disable-hover"),this.sentVote=!0,this.sendVotePromise=this.managers.appPollsManager.sendVote(this.message,e).then((()=>{t.forEach((e=>{e.classList.remove("is-voting")})),this.classList.remove("disable-hover")})).catch((()=>{this.sentVote=!1})).finally((()=>{this.sendVotePromise=null}))}performResults(e,t,i=!0){var s,n;if(d.Z.settings.animationsEnabled||(i=!1),this.isQuiz&&((null===(s=e.results)||void 0===s?void 0:s.length)||this.isClosed)){this.answerDivs.forEach(((t,i)=>{t.classList.toggle("is-correct",!!e.results[i].pFlags.correct)})),this.initQuizHint&&(this.initQuizHint(e),this.initQuizHint=null),this.quizInterval&&(clearInterval(this.quizInterval),this.quizInterval=0),(null===(n=this.quizTimer)||void 0===n?void 0:n.parentElement)&&this.quizTimer.remove();const t=this.descDiv.querySelector(".poll-time");t&&t.remove()}if(this.isClosed&&(this.classList.add("is-closed"),(0,U.Z)(this.typeDiv,(0,C.ag)("Chat.Poll.Type.Closed"))),(this.chosenIndexes.length!==t.length||this.isClosed)&&(this.isRetracted=this.chosenIndexes.length&&!t.length,this.chosenIndexes=t.slice(),this.isRetracted?(0,S.fc)(this,this.clickHandler):(0,S.EN)(this,this.clickHandler)),this.chosenIndexes.length||this.isRetracted||this.isClosed){const t=e.results.map((t=>e.total_voters?t.voters/e.total_voters*100:0));this.classList.toggle("no-transition",!i),i&&(0,Fe.Z)({element:this,className:"",forwards:!this.isRetracted,duration:340}),(0,pe.T2)((()=>{this.setResults(this.isRetracted?this.percents:t,this.chosenIndexes,i),this.percents=t,this.isRetracted=!1}))}if(this.setVotersCount(e),this.isPublic){this.isMultiple||(this.viewResults.classList.toggle("hide",!e.total_voters||!this.chosenIndexes.length),this.votersCountDiv.classList.toggle("hide",!!this.chosenIndexes.length));const t=(e.recent_voters||[]).map((e=>e.toPeerId())),i=new ie({avatarSize:16});i.render(t),(0,U.Z)(this.avatarsDiv,i.container)}if(this.isMultiple){const t=!!this.chosenIndexes.length,i=this.isClosed||t,s=!this.isPublic||!e.total_voters||!t&&!this.isClosed;this.sendVoteBtn.classList.toggle("hide",i),this.viewResults.classList.toggle("hide",s),this.votersCountDiv.classList.toggle("hide",!i||!s)}}setResults(e,t,i){this.svgLines.forEach((e=>e.style.display="")),this.answerDivs.forEach(((e,i)=>{e.classList.toggle("is-chosen",t.includes(i))}));const s=Math.max(...e);if(this.maxPercents=e.map((e=>e/s)),this.isRetracted)this.svgLines.forEach(((e,t)=>{this.setLineProgress(t,-1)}));else{const e=()=>{this.svgLines.forEach(((e,t)=>{this.setLineProgress(t,1)}))};i?(0,pe.T2)(e):e()}let n;e=e.slice(),ss(e);const a=t=>{e.forEach(((e,i)=>{const s=n(e,t);this.numberDivs[i].innerText=s+"%"}))};if(this.isRetracted)if(n=(e,t)=>Math.round(e/10*t),i)for(let e=9,t=0;e>=0;--e,++t)setTimeout((()=>{a(e)}),34*t);else a(0);else if(n=(e,t)=>Math.round(e/10*(t+1)),i)for(let e=0;e<10;++e)setTimeout((()=>{a(e)}),34*e);else a(9);if(this.isRetracted){i&&this.classList.add("is-retracting"),this.classList.remove("is-voted");const e=()=>{this.svgLines.forEach((e=>e.style.display="none"))};i?setTimeout((()=>{this.classList.remove("is-retracting"),e()}),340):e()}else this.classList.add("is-voted")}setVotersCount(e){const t=e.total_voters||0;let i;const s=[t];i=this.isClosed?this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesResultEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesResultEmpty":this.isQuiz?t?"Chat.Quiz.TotalVotes":"Chat.Quiz.TotalVotesEmpty":t?"Chat.Poll.TotalVotes1":"Chat.Poll.TotalVotesEmpty",(0,U.Z)(this.votersCountDiv,(0,C.ag)(i,s))}setLineProgress(e,t){const i=this.svgLines[e];-1===t?(i.style.strokeDasharray="",i.style.strokeDashoffset=""):(i.style.strokeDasharray=t*this.maxPercents[e]*ls.MAX_LENGTH+", 485.9",i.style.strokeDashoffset=""+t*ls.MAX_OFFSET)}}ls.MAX_OFFSET=-46.5,ls.MAX_LENGTH=0,customElements.define("poll-element",ls);const cs="֑-߿יִ-﷽ﹰ-ﻼ",hs=(new RegExp("^[^A-Za-zÀ-ÖØ-öø-ʸ̀-֐ࠀ-῿Ⰰ-﬜﷾-﹯﻽-￿]*["+cs+"]"),new RegExp("["+cs+"]"));var us=i(6628),ps=i(5345),fs=i(3591),ms=i(9102),gs=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const vs=new Map([["messageActionHistoryClear",!0],["messageActionChatCreate",e=>e.pFlags.out]]),bs=new Set;Oe.Z&&bs.add("messageActionPhoneCall");const ys=void 0;let ws=ys,Ss=0;const Cs=3,Ls=new Error("peer changed"),Es={1:96,2:90,3:84,4:72,5:60,6:48,7:36},Is=Object.keys(Es).length;function Ms(e){return Math.max(...e)}class Ps{constructor(e,t){let i;this.chat=e,this.managers=t,this.unreadOut=new Set,this.needUpdate=[],this.bubbles={},this.skippedMids=new Set,this.bubblesNewByGroupedId={},this.bubblesNew={},this.dateMessages={},this.scrolledDown=!0,this.isScrollingTimeout=0,this.unreaded=new Map,this.unreadedSeen=new Set,this.preloader=null,this.messagesQueueOnRenderAdditional=null,this.firstUnreadBubble=null,this.middlewareHelper=(0,Se.k)(),this.followStack=[],this.isHeavyAnimationInProgress=!1,this.isFirstLoad=!0,this.passEntities={},this.viewsMids=new Set,this.isTopPaddingSet=!1,this.renderingMessages=new Set,this.bubblesToEject=new Set,this.bubblesToReplace=new Map,this.setPeerTempId=0,this.renderNewPromises=new Set,this.extendedMediaMessages=new Set,this.unreadedObserverCallback=e=>{if(e.isIntersecting){const t=e.target,i=this.unreaded.get(t);this.onUnreadedInViewport(t,i)}},this.viewsObserverCallback=e=>{if(e.isIntersecting){const t=+e.target.dataset.mid;if(this.observer.unobserve(e.target,this.viewsObserverCallback),t)this.viewsMids.add(t),this.sendViewCountersDebounced();else{const{sponsoredMessage:e}=this,t=null==e?void 0:e.random_id;t&&(this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(),t),delete e.random_id)}}},this.stickerEffectObserverCallback=e=>{if(e.isIntersecting){this.observer.unobserve(e.target,this.stickerEffectObserverCallback);const t=e.target.querySelector(".attachment");(0,ue.e9)().then((()=>{(0,Hi.Z)(t)&&(0,S.tH)(t)}))}},this.onBubblesMouseMove=e=>gs(this,void 0,void 0,(function*(){const t=(0,ve.Z)(e.target,"bubble-content");if("scheduled"===this.chat.type||!t||this.chat.selection.isSelecting||(0,ve.Z)(e.target,"service")||(0,ve.Z)(e.target,"bubble-beside-button"))this.unhoverPrevious();else{const e=(0,ve.Z)(t,"bubble");if(!this.chat.selection.canSelectBubble(e))return void this.unhoverPrevious();let{hoverBubble:i,hoverReaction:s}=this;if(e===i)return;if(this.unhoverPrevious(),i=this.hoverBubble=e,s=this.hoverReaction,s)s.dataset.loaded&&this.setHoverVisible(s,!0);else{s=this.hoverReaction=document.createElement("div"),s.classList.add("bubble-hover-reaction");const i=document.createElement("div");i.classList.add("bubble-hover-reaction-sticker"),s.append(i),t.append(s);let n=yield this.chat.getMessage(+e.dataset.mid);if("message"!==(null==n?void 0:n._))return void this.unhoverPrevious();n=yield this.managers.appMessagesManager.getGroupsFirstMessage(n);const a=this.getMiddleware((()=>this.hoverReaction===s));Promise.all([this.managers.appReactionsManager.getAvailableReactionsByMessage(n),(0,nt.Z)(400)]).then((([e])=>{const t=e[0];t?(0,K.ZP)({div:i,doc:t.select_animation,width:18,height:18,needUpscale:!0,middleware:a,group:this.chat.animationGroup,withThumb:!1,needFadeIn:!1}).then((({render:e})=>e)).then((e=>{(0,Pe.Z)(e),e.addEventListener("firstFrame",(()=>{a()&&(s.dataset.loaded="1",this.setHoverVisible(s,!0))}),{once:!0}),(0,S.fc)(s,(e=>{(0,Ce.Z)(e),this.managers.appReactionsManager.sendReaction(n,t),this.unhoverPrevious()}),{listenerSetter:this.listenerSetter})}),Qe.Z):s.remove()}))}}})),this.unhoverPrevious=()=>{const{hoverBubble:e,hoverReaction:t}=this;e&&(this.setHoverVisible(t,!1),this.hoverBubble=void 0,this.hoverReaction=void 0)},this.onBubblesClick=e=>gs(this,void 0,void 0,(function*(){var t;let i=e.target,s=null;try{s=(0,ve.Z)(i,"bubble")}catch(e){}if(!s&&!this.chat.selection.isSelecting){const e=(0,ve.Z)(i,"user-avatar");if(!e)return;const t=e.dataset.peerId.toPeerId();return void(t!==m.NM?this.chat.appImManager.setInnerPeer({peerId:t}):(0,ye.Am)(C.ZP.format("HidAccount",!0)))}if(s.classList.contains("is-date")&&(0,ve.Z)(i,"bubble-content")){if(s.classList.contains("is-fake")&&(s=s.previousElementSibling),s.classList.contains("is-sticky")&&!this.chatInner.classList.contains("is-scrolling"))return;for(const e in this.dateMessages)if(this.dateMessages[e].div===s){w.Z.createPopup(E,new Date(+e),this.onDatePick).show();break}return}if(!c.Z&&(0,ve.Z)(i,"time"))return void this.chat.selection.toggleByElement(s);if(this.chat.selection.isSelecting&&e.isTrusted){if(s.classList.contains("service")&&void 0===s.dataset.mid)return;return(0,Ce.Z)(e),c.Z&&this.chat.selection.selectedText?void(this.chat.selection.selectedText=void 0):void this.chat.selection.toggleByElement((0,ve.Z)(i,"grouped-item")||s)}const n=(0,ve.Z)(i,"media-spoiler-container");if(n)return void(0,$i.kN)({event:e,mediaSpoiler:n});const a=(0,ve.Z)(i,"contact");if(a)return void this.chat.appImManager.setInnerPeer({peerId:a.dataset.peerId.toPeerId()});const o=(0,ve.Z)(i,"bubble-call");if(o)return void this.chat.appImManager.callUser(this.peerId.toUserId(),o.dataset.type);if((0,ve.Z)(i,"is-buy")){(0,Ce.Z)(e);const t=yield this.chat.getMessage(+s.dataset.mid);if(!t)return;return void new Ui(t,yield this.managers.appPaymentsManager.getInputInvoiceByPeerId(t.peerId,t.mid))}const r=(0,be.Z)(i,"REACTION-ELEMENT");if(r){if((0,Ce.Z)(e),r.classList.contains("is-inactive"))return;const t=r.parentElement,i=t.getReactionCount(r),s=t.getMessage();return void this.managers.appReactionsManager.sendReaction(s,i.reaction)}const d=(0,Re.Z)(i,"data-sticker-emoji");if(d&&1===d.parentElement.querySelectorAll("[data-sticker-emoji]").length&&s.classList.contains("emoji-big"))return void(0,K._2)({event:e,container:d,managers:this.managers,middleware:this.getMiddleware(),peerId:this.peerId});if((0,ve.Z)(i,"replies")){const e=+s.dataset.mid;if(this.peerId===m.hj){const t=yield this.chat.getMessage(e),i=(0,D.Z)(t.reply_to.reply_to_peer_id),s=t.reply_to.reply_to_top_id,n=t.fwd_from.saved_from_msg_id;this.chat.appImManager.openThread({peerId:i,lastMsgId:n,threadId:s})}else{const t=yield this.chat.getMessage(e),i=yield this.managers.appMessagesManager.getMessageWithReplies(t),s=i.replies;s&&this.managers.appMessagesManager.getDiscussionMessage(this.peerId,i.mid).then((e=>{this.chat.appImManager.setInnerPeer({peerId:s.channel_id.toPeerId(!0),type:"discussion",threadId:e.mid})}))}return}const l=(0,ve.Z)(i,"is-via");if(l){const t=l.querySelector(".peer-title");if(i===t||(0,Be.Z)(i,t)){const i=t.innerText+" ";return this.managers.appDraftsManager.setDraft(this.peerId,this.chat.threadId,i),void(0,Ce.Z)(e)}}const h=(0,ve.Z)(i,"peer-title")||(0,be.Z)(i,"AVATAR-ELEMENT")||(0,Re.Z)(i,"data-saved-from");if(h&&h!==s){i=h||i;const e=i.dataset.peerId||i.getAttribute("peer")||i.peerId,t=i.dataset.savedFrom;if("string"==typeof e||t)if(t){const[e,n]=t.split("_");if(i.classList.contains("is-receipt-link")){const t=yield this.managers.appMessagesManager.getMessageByPeer(e.toPeerId(),+n);if(t){const e=yield this.managers.appPaymentsManager.getInputInvoiceByPeerId(this.peerId,+s.dataset.mid);new Ui(t,e,void 0,!0)}}else this.chat.appImManager.setInnerPeer({peerId:e.toPeerId(),lastMsgId:+n})}else{const t=e.toPeerId();t!==m.NM?this.chat.appImManager.setInnerPeer({peerId:t}):(0,ye.Am)(C.ZP.format("HidAccount",!0))}return}if(s.classList.contains("sticker")&&i.parentElement.classList.contains("attachment")){const e=+s.dataset.mid,i=null===(t=(yield this.chat.getMessage(e)).media)||void 0===t?void 0:t.document;return void((null==i?void 0:i.stickerSetInput)&&new M.Z(i.stickerSetInput).show())}const u=(0,ve.Z)(i,"document-with-thumb");if("IMG"===i.tagName&&!i.classList.contains("emoji")&&!i.classList.contains("document-thumb")||i.classList.contains("album-item")||"VIDEO"===i.tagName&&!s.classList.contains("round")||u&&!u.querySelector(".preloader-container")||i.classList.contains("canvas-thumbnail")){const t=(0,ve.Z)(i,"album-item")||(0,ve.Z)(i,"document-container"),n=(t||s).querySelector(".preloader-container");if(n)return(0,S.tH)(n),void(0,Ce.Z)(e);(0,Ce.Z)(e);const a=+(t||s).dataset.mid,o=yield this.chat.getMessage(a);if(!o)return void this.log.warn("no message by messageId:",a);const r="webpage",d=s.classList.contains(r),l=u?e=>_e.Z.isMediaCompatibleForDocumentViewer(e):e=>"photo"===e._||["video","gif"].includes(e.type),c=[],h=d?[a]:(yield Promise.all(Object.keys(this.bubbles).map((e=>+e)).map((e=>gs(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e),i=(0,vt.Z)(t);return i&&l(i)&&e})))))).filter(Boolean).sort(((e,t)=>e-t));h.forEach((e=>{let t;u?t=".document-container":(t=".album-item video, .album-item img, .preview video, .preview img, ",t+=this.bubbles[e].classList.contains("with-media-tail")?".bubble__media-container":".attachment video, .attachment img");const i=Array.from(this.bubbles[e].querySelectorAll(t)),s=new Set;if(u)i.forEach((e=>{c.push({element:e.querySelector(".document-ico"),mid:+e.dataset.mid,peerId:this.peerId})}));else{const t=!!this.bubbles[e].querySelector(".media-container-aspecter");i.forEach((i=>{if(t&&!(0,ve.Z)(i,"media-container-aspecter"))return;const n=(0,ve.Z)(i,"album-item"),a=n||i.parentElement;s.has(a)||(s.add(a),c.push({element:i,mid:n?+n.dataset.mid:e,peerId:this.peerId}))}))}})),c.sort(((e,t)=>e.mid-t.mid));const p=c.findIndex((e=>e.mid===a));return me.ZP&&this.log("open mediaViewer single with ids:",h,p,c),c[p]?void(new _e.Z).setSearchContext({threadId:this.chat.threadId,peerId:this.peerId,inputFilter:{_:u?"inputMessagesFilterDocument":"inputMessagesFilterPhotoVideo"},useSearch:"scheduled"!==this.chat.type&&!d,isScheduled:"scheduled"===this.chat.type}).openMedia(o,c[p].element,0,!0,c.slice(0,p),c.slice(p+1)):void this.log("no target for media viewer!",i)}if(-1===["IMG","DIV","SPAN"].indexOf(i.tagName)&&(i=(0,be.Z)(i,"DIV")),-1!==["DIV","SPAN"].indexOf(i.tagName)){if(i.classList.contains("goto-original")){const e=s.dataset.savedFrom,[t,i]=e.split("_");return void this.chat.appImManager.setInnerPeer({peerId:t.toPeerId(),lastMsgId:+i})}if(i.classList.contains("forward")){const e=+s.dataset.mid,t=yield this.managers.appMessagesManager.getMessageByPeer(this.peerId,e);return void new I.Z({[this.peerId]:yield this.managers.appMessagesManager.getMidsByMessage(t)})}let t=!1;try{t=!!(0,ve.Z)(e.target,"reply")}catch(e){}if(t&&s.classList.contains("is-reply")){const e=+s.dataset.mid;this.followStack.push(e);const t=yield this.chat.getMessage(e),i=t.reply_to.reply_to_peer_id?(0,D.Z)(t.reply_to.reply_to_peer_id):this.peerId,n=t.reply_to.reply_to_msg_id;this.chat.appImManager.setInnerPeer({peerId:i,lastMsgId:n,type:this.chat.type,threadId:this.chat.threadId})}}})),this.onScroll=(e,t,i)=>{var s,n,a,o,r;if(this.isHeavyAnimationInProgress){if(null===(s=this.sliceViewportDebounced)||void 0===s||s.clearTimeout(),this.scrolledDown&&!e)return}else null===(n=this.chat.topbar.pinnedMessage)||void 0===n||n.setCorrectIndexThrottled(this.scrollable.lastScrollDirection),null===(a=this.sliceViewportDebounced)||void 0===a||a.call(this),this.setStickyDateManually();if(t&&t.distanceToEnd<300&&this.scrolledDown)return;const d=i?0:null!==(o=null==t?void 0:t.distanceToEnd)&&void 0!==o?o:this.scrollable.getDistanceToEnd();(0!==this.scrollable.lastScrollDirection&&d>0||t||i)&&(this.isScrollingTimeout?clearTimeout(this.isScrollingTimeout):this.chatInner.classList.contains("is-scrolling")||this.chatInner.classList.add("is-scrolling"),this.isScrollingTimeout=window.setTimeout((()=>{this.chatInner.classList.remove("is-scrolling"),this.isScrollingTimeout=0}),1350+(null!==(r=null==t?void 0:t.duration)&&void 0!==r?r:0))),d<300&&(i||this.scrollable.loadedAll.bottom||this.chat.setPeerPromise||!this.peerId)?(this.container.classList.add("scrolled-down"),this.scrolledDown=!0):this.container.classList.contains("scrolled-down")&&(this.container.classList.remove("scrolled-down"),this.scrolledDown=!1)},this.processBatch=(...e)=>gs(this,void 0,void 0,(function*(){var t,i,s;let[n,a,o]=e;const r=e=>e.filter((e=>e&&this.bubbles[e.bubble.dataset.mid]===e.bubble));n=r(n),o("messages rendered");const d=null===(t=n[0])||void 0===t?void 0:t.reverse,{groups:l,avatarPromises:c}=this.groupBubbles(n.filter((e=>e.updatePosition))),h=n.reduce(((e,t)=>{const i=performance.now(),s=t.promises.slice(),n=s.map((e=>gs(this,void 0,void 0,(function*(){return yield e,performance.now()-i}))));return Promise.all(n).then((e=>{o.groupCollapsed("media message time",performance.now()-i,t,e),e.forEach(((e,t)=>{o("media message time",e,t,s[t])})),o.groupEnd()})),e.push(...t.promises),e}),[]);h.push(...c),o("media promises to call",h,n,this.isHeavyAnimationInProgress),yield a(Promise.all([...h,this.setUnreadDelimiter()]).catch(Qe.Z)),yield a((0,pe.AD)()),o("media promises end"),n=r(n);const{restoreScroll:u,scrollSaver:p}=this.prepareToSaveScroll(d);null===(i=this.messagesQueueOnRenderAdditional)||void 0===i||i.call(this),this.ejectBubbles();for(const[e,t]of this.bubblesToReplace){if(p&&p.replaceSaved(t,e),!n.find((t=>t.bubble===e)))continue;const i=this.bubbleGroups.getItemByBubble(e);i?(i.mounted=!1,l.includes(i.group)||l.push(i.group)):this.log.error("NO ITEM BY BUBBLE",e),this.bubblesToReplace.delete(e)}this.chat.selection.isSelecting&&n.forEach((({bubble:e})=>{this.chat.selection.toggleElementCheckbox(e,!0)})),n.forEach((({message:e,bubble:t,updatePosition:i})=>{e.pFlags.local&&i&&this.chatInner[e.pFlags.sponsored?"append":"prepend"](t)})),this.bubbleGroups.mountUnmountGroups(l),null===(s=this.updatePlaceholderPosition)||void 0===s||s.call(this),null==u||u()})),this.onDatePick=e=>{const t=this.peerId;this.managers.appMessagesManager.requestHistory(t,0,2,-1,e,this.chat.threadId).then((e=>{var i;(null===(i=null==e?void 0:e.messages)||void 0===i?void 0:i.length)?this.peerId===t&&this.chat.setMessageId(e.messages[0].mid):this.log.error("no history!")}))},this.log=this.chat.log,this.listenerSetter=new le.Z,this.constructBubbles(),this.batchProcessor=new ps.s({log:this.log,process:this.processBatch,possibleError:Ls}),this.bubbleGroups=new y(this.chat),this.preloader=new P.Z({cancelable:!1}),this.lazyLoadQueue=new de.Z(void 0,!0),this.lazyLoadQueue.queueId=++Ss,this.listenerSetter.add(d.Z)("history_update",(({storageKey:e,sequential:t,message:i})=>gs(this,void 0,void 0,(function*(){if(this.chat.messagesStorageKey!==e||"scheduled"===this.chat.type)return;const{mid:s}=i,n=this.bubbles[s];if(!n)return;if(this.renderNewPromises.size&&(yield Promise.all(Array.from(this.renderNewPromises))),this.messagesQueuePromise&&(yield this.messagesQueuePromise),this.bubbles[s]!==n)return;const a=this.bubbleGroups.getItemByBubble(n);if(!a)return;if(a.mid===s)return;if(t){const e=a.group,o=this.bubbleGroups.createItem(n,i),r=this.bubbleGroups.itemsArr.slice();(0,h.Z)(r,a);const l=this.bubbleGroups.findGroupSiblingByItem(o,r);if(e===(null==l?void 0:l.group)||e===this.bubbleGroups.getLastGroup()&&1===e.items.length&&o.dateTimestamp===a.dateTimestamp||this.peerId===d.Z.myId&&t&&o.dateTimestamp===a.dateTimestamp)return void this.bubbleGroups.changeBubbleMid(n,s)}this.bubbleGroups.removeAndUnmountBubble(n);const{groups:o}=this.groupBubbles([{bubble:n,message:i}]);this.bubbleGroups.mountUnmountGroups(o),this.scrollingToBubble&&this.scrollToEnd()})))),this.listenerSetter.add(d.Z)("dialog_flush",(({peerId:e})=>{this.peerId===e&&this.deleteMessagesByIds(Object.keys(this.bubbles).map((e=>+e)))})),this.listenerSetter.add(d.Z)("message_sent",(e=>gs(this,void 0,void 0,(function*(){const{storageKey:t,tempId:i,tempMessage:s,mid:n,message:a}=e;if(this.chat.messagesStorageKey!==t)return;const o=this.bubbles,r=o[i];if(r){const e=o[i];o[n]=e,e.dataset.mid=""+n,delete o[i],(0,pe.T2)((()=>{const t=+e.dataset.mid;o[t]===e&&e.classList.contains("is-outgoing")&&(e.classList.remove("is-sending","is-outgoing"),e.classList.add(this.peerId===d.Z.myId&&"scheduled"!==this.chat.type||!this.unreadOut.has(t)?"is-read":"is-sent"))}))}if(this.unreadOut.has(i)&&(this.unreadOut.delete(i),this.unreadOut.add(n)),"scheduled"===this.chat.type&&(Date.now()/1e3|0)>=s.date-10&&this.deleteMessagesByIds([n]),!r)return;let l,c;const h=a.grouped_id;if(h){l=yield this.managers.appMessagesManager.getMessagesByAlbum(h);const e=l.map((({mid:e})=>e));if(!e.length||Ms(e)!==n||o[n]!==r)return;if(o[n]!==r)return;c=Array.from(r.querySelectorAll(".grouped-item")).map((e=>+e.dataset.mid))}else l=[a],c=[i];const u=Array.from(r.querySelectorAll("reactions-element"));u.length&&u.forEach((e=>{e.changeMessage(a)})),l.forEach(((e,t)=>{var i,n,a,o,l;if(!e)return;const u=c[t],p=e.mid,f=r.querySelector(`.document-container[data-mid="${p}"]`)||r;if("message"!==e._)return;if(e.replies){const t=r.querySelector("replies-element");t&&(t.message=e,t.init())}const m=null!==(i=e.media)&&void 0!==i?i:{},g=m.document,v=m.poll,b=m.webpage;if(g){const t=f.querySelector(`.document-container[data-mid="${u}"] .document`);if(t){const i=(0,ve.Z)(t,"document-container");!(null===(o=null===(a=null===(n=s.media)||void 0===n?void 0:n.document)||void 0===a?void 0:a.thumbs)||void 0===o?void 0:o.length)&&(null===(l=g.thumbs)||void 0===l?void 0:l.length)&&(0,ue.e9)().then((()=>gs(this,void 0,void 0,(function*(){const i=t.querySelector(".time"),s=yield(0,Qi.Z)({message:e,fontSize:d.Z.settings.messagesTextSize});t.replaceWith(s),i&&(s.querySelector(".document")||s).append(i)})))),i&&(i.dataset.mid=""+p)}const i=f.querySelector(`audio-element[data-mid="${u}"], .document[data-doc-id="${u}"], .media-round[data-mid="${u}"]`);i&&(i instanceof ce.ZP||i.classList.contains("media-round")?(i.dataset.mid=""+e.mid,delete i.dataset.isOutgoing,i.message=e,i.onLoad(!0)):(i.dataset.docId=""+g.id,i.doc=g))}else if(v){const t=f.querySelector("poll-element");t&&(t.message=e,t.setAttribute("poll-id",""+v.id),t.setAttribute("message-id",""+p))}else b&&!f.querySelector(".web")&&(0,ue.e9)().then((()=>{this.safeRenderMessage(e,!0,f),this.scrollToBubbleIfLast(f)}));if(h){const e=f.querySelector(`.grouped-item[data-mid="${u}"]`)||f;e&&(e.dataset.mid=""+p)}}))})))),this.listenerSetter.add(d.Z)("message_edit",(({storageKey:e,message:t})=>gs(this,void 0,void 0,(function*(){if(e!==this.chat.messagesStorageKey)return;const i=this.bubbles[t.mid];i&&(yield(0,ue.e9)(),this.bubbles[t.mid]===i&&this.safeRenderMessage(t,!0,i))})))),this.listenerSetter.add(d.Z)("message_error",(({storageKey:e,tempId:t})=>gs(this,void 0,void 0,(function*(){if(e!==this.chat.messagesStorageKey)return;const i=this.bubbles[t];i&&(yield(0,ue.e9)(),this.bubbles[t]===i&&(i.classList.remove("is-outgoing"),i.classList.add("is-error")))})))),this.listenerSetter.add(d.Z)("album_edit",(({peerId:e,messages:t,deletedMids:i})=>{if(e!==this.peerId)return;const s=t.map((({mid:e})=>e)),n=Ms(s.concat(Array.from(i))),a=this.bubbles[n];if(!a)return;const o=Ms(s),r=t.find((e=>e.mid===o));this.safeRenderMessage(r,!0,a)})),this.listenerSetter.add(d.Z)("messages_reactions",(e=>gs(this,void 0,void 0,(function*(){if("scheduled"===this.chat.type)return;let t;const i=e.map((({message:e,changedResults:t})=>gs(this,void 0,void 0,(function*(){if(this.peerId!==e.peerId)return;const i=yield this.getMountedBubble(e.mid,e);return i?{bubble:i.bubble,message:e,changedResults:t}:void 0}))));(yield Promise.all(i)).filter(Boolean).forEach((({bubble:e,message:i,changedResults:s})=>{t||(t=this.createScrollSaver(!1),t.save());const n=i.peerId+"_"+i.mid,a=it.get(n);if(a)for(const e of a)e.update(i,s);else{if(!i.reactions||!i.reactions.results.length)return;this.appendReactionsElementToBubble(e,i,i,s)}})),t&&t.restore()})))),this.listenerSetter.add(d.Z)("messages_downloaded",(({peerId:e,mids:t})=>gs(this,void 0,void 0,(function*(){const i=this.getMiddleware();yield(0,ue.e9)(),i()&&t.forEach((t=>{this.needUpdate;const i=[];(0,g.Z)(this.needUpdate,((s,n)=>{s.replyMid===t&&s.replyToPeerId===e&&(this.needUpdate.splice(n,1)[0],i.push(s))})),i.forEach((({mid:e,replyMid:t,replyToPeerId:i})=>gs(this,void 0,void 0,(function*(){const t=this.bubbles[e];if(!t)return;const i=yield this.chat.getMessage(e);re.setReply({chat:this.chat,bubble:t,message:i})}))))}))})))),(0,ji.Z)({listenTo:this.scrollable.container,listenerSetter:this.listenerSetter,findTarget:e=>{const t=e.target;return t.closest(".attachment.media-sticker-wrapper")||(0,ve.Z)(t,"attachment")&&t.closest(".custom-emoji")}}),(0,S.fc)(this.scrollable.container,this.onBubblesClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.scrollable.container)("mousedown",(e=>{if(0!==e.button)return;const t=(0,be.Z)(e.target,"CODE");if(t){(0,Ce.Z)(e),i=t,(0,ct.T)(i.textContent);const s=e=>{(0,Ce.Z)(e),(0,ye.bC)({langPackKey:"TextCopied",onClose:()=>{n()}})},n=(0,S.fc)(window,s,{listenerSetter:this.listenerSetter,once:!0,capture:!0})}else var i})),this.stickyIntersector=new k.Z(this.scrollable.container,((e,t)=>{for(const i in this.dateMessages){const s=this.dateMessages[i];if(s.container===t){const t=s.div;t.classList.toggle("is-sticky",e),e&&(this.previousStickyDate=t);break}}this.previousStickyDate})),T.IS_SAFARI||(this.sliceViewportDebounced=(0,Ze.Z)(this.sliceViewport.bind(this),3e3,!1,!0)),(0,ue.ZP)((()=>{this.isHeavyAnimationInProgress=!0,this.lazyLoadQueue.lock(),i=this.getMiddleware()}),(()=>{this.isHeavyAnimationInProgress=!1,(null==i?void 0:i())&&this.lazyLoadQueue.unlockAndRefresh(),i=null}),this.listenerSetter)}constructBubbles(){const e=this.container=document.createElement("div");e.classList.add("bubbles","scrolled-down"),(this.chatInner=document.createElement("div")).classList.add("bubbles-inner"),this.setScroll(),e.append(this.scrollable.container)}attachContainerListeners(){const e=this.container;if(this.chat.contextMenu.attachTo(e),this.chat.selection.attachListeners(e,new le.Z),me.ZP&&this.listenerSetter.add(e)("dblclick",(e=>gs(this,void 0,void 0,(function*(){const t=(0,ve.Z)(e.target,"grouped-item")||(0,ve.Z)(e.target,"bubble");if(t){const e=+t.dataset.mid;this.log("debug message:",yield this.chat.getMessage(e)),this.highlightBubble(t)}})))),T.IS_MOBILE){if(c.Z){const t="is-gesturing-reply",i=64,s=.75*i;let n,a,o,r=!1;(0,De.Z)({element:e,verifyTouchTarget:e=>gs(this,void 0,void 0,(function*(){if("pinned"===this.chat.type||this.chat.selection.isSelecting||!(yield this.chat.canSend()))return!1;if(n=(0,ve.Z)(e.target,"bubble"),n){try{const e=n.parentElement.querySelector(".bubbles-group-avatar");e&&(0,He.Z)(e,n)&&(o=e)}catch(e){}(0,Fe.Z)({element:n,className:t,forwards:!0,duration:250}),n.offsetLeft,a?(a.classList.remove("is-visible"),a.style.opacity=""):(a=document.createElement("span"),a.classList.add("tgico-reply_filled","bubble-gesture-reply-icon")),n.append(a)}return!!n})),onSwipe:e=>{r=e>=s,r&&!a.classList.contains("is-visible")&&a.classList.add("is-visible"),a.style.opacity=""+Math.min(1,e/s);const t=`translateX(${-Math.max(0,Math.min(i,e))}px)`;n.style.transform=t,o&&(o.style.transform=t),(0,Ct.s)()},onReset:()=>{const e=n,i=o;n=o=void 0,(0,Fe.Z)({element:e,className:t,forwards:!1,duration:250,onTransitionEnd:()=>{a.parentElement===e&&(a.classList.remove("is-visible"),a.remove())}}),(0,pe.T2)((()=>{if(e.style.transform="",i&&(i.style.transform=""),r){const{mid:t}=e.dataset;this.chat.input.initMessageReply(+t),r=!1}}))},listenerOptions:{capture:!0}})}}else this.listenerSetter.add(e)("dblclick",(e=>gs(this,void 0,void 0,(function*(){if("pinned"===this.chat.type||this.chat.selection.isSelecting||!(yield this.chat.canSend()))return;const t=e.target,i=t.classList.contains("bubble")?t:t.classList.contains("document-selection")?t.parentElement:null;if(i&&!i.classList.contains("bubble-first")){const e=+i.dataset.mid;if((yield this.chat.getMessage(e)).pFlags.is_outgoing)return;this.chat.input.initMessageReply(e)}}))))}constructPeerHelpers(){this.listenerSetter.add(d.Z)("history_append",(({storageKey:e,message:t})=>gs(this,void 0,void 0,(function*(){e===this.chat.messagesStorageKey&&"scheduled"!==this.chat.type&&(d.Z.settings.animationsEnabled&&(this.updateGradient=!0),this.scrollable.loadedAll.bottom?this.renderNewMessage(t,!0):this.chat.setMessageId())})))),this.listenerSetter.add(d.Z)("history_multiappend",(e=>{this.peerId===e.peerId&&"scheduled"!==this.chat.type&&this.renderNewMessage(e)})),this.listenerSetter.add(d.Z)("history_delete",(({peerId:e,msgs:t})=>{e===this.peerId&&"scheduled"!==this.chat.type&&this.deleteMessagesByIds(Array.from(t))})),this.listenerSetter.add(d.Z)("dialog_unread",(({peerId:e})=>{e===this.peerId&&(this.chat.input.setUnreadCount(),(0,ue.e9)().then((()=>{this.updateUnreadByDialog()})))})),this.listenerSetter.add(d.Z)("dialogs_multiupdate",(e=>{e.has(this.peerId)&&"scheduled"!==this.chat.type&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(d.Z)("dialog_notify_settings",(e=>{this.peerId===e.peerId&&"scheduled"!==this.chat.type&&this.chat.input.setUnreadCount()})),this.listenerSetter.add(d.Z)("chat_update",(e=>gs(this,void 0,void 0,(function*(){const{peerId:t}=this;if(t!==e.toPeerId(!0))return;const i=yield this.managers.appChatsManager.getChat(e);this.chatInner.classList.contains("has-rights")!==(yield this.chat.canSend())&&(yield Promise.all([this.finishPeerChange(),this.chat.input.finishPeerChange()])).forEach((e=>e())),!!i.pFlags.forum!==this.chat.isForum&&"chat"===this.chat.type&&(this.chat.peerId=0,this.chat.appImManager.setPeer({peerId:t}))})))),this.listenerSetter.add(d.Z)("history_reload",(e=>{if(e!==this.peerId)return;const t=(0,ot.Z)(this.bubbles,"desc").filter((e=>e>0)),i=this.getMiddleware();this.managers.appMessagesManager.reloadMessages(this.peerId,t).then((e=>{if(!i())return;const s=[];e.forEach(((e,i)=>{const n=t[i];if(e){const t=this.bubbles[e.mid];if(!t)return;this.safeRenderMessage(e,!0,t)}else s.push(n)})),this.deleteMessagesByIds(s),this.setLoaded("top",!1),this.setLoaded("bottom",!1),this.scrollable.checkForTriggers()}))})),this.listenerSetter.add(d.Z)("settings_updated",(({key:e})=>gs(this,void 0,void 0,(function*(){if("settings.emoji.big"===e){const e=this.getMiddleware(),t=(0,ot.Z)(this.bubbles,"desc").map((e=>gs(this,void 0,void 0,(function*(){const t=this.bubbles[e];if(t.classList.contains("can-have-big-emoji"))return{bubble:t,message:yield this.chat.getMessage(e)}})))),i=yield Promise.all(t);if(!e())return;i.filter(Boolean).forEach((({bubble:e,message:t})=>{this.bubbles[t.mid]===e&&this.safeRenderMessage(t,!0,e)}))}})))),this.listenerSetter.add(d.Z)("messages_views",(e=>{"scheduled"!==this.chat.type&&(0,pe.T2)((()=>{let t;for(const{peerId:i,views:s,mid:n}of e){if(this.peerId!==i)continue;const e=this.bubbles[n];if(!e)continue;const a=Array.from(e.querySelectorAll(".post-views"));if(!a.length)continue;const o=(0,F.Z)(s,1);let r=!1;a.forEach((e=>{(r||e.textContent!==o)&&(t||(t=this.createScrollSaver(!0),t.save()),r=!0,e.textContent=o)}))}null==t||t.restore()}))})),this.observer=new dt({root:this.scrollable.container}),this.sendViewCountersDebounced=(0,Ze.Z)((()=>{const e=[...this.viewsMids];this.viewsMids.clear(),this.managers.appMessagesManager.incrementMessageViews(this.peerId,e)}),1e3,!1,!0),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e,mids:t,pinned:i})=>{"pinned"===this.chat.type&&e===this.peerId&&t&&(i||this.deleteMessagesByIds(t))}));const e=()=>gs(this,void 0,void 0,(function*(){this.chat.topbar.setTitle((yield this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size)}));this.listenerSetter.add(d.Z)("scheduled_new",(t=>{"scheduled"===this.chat.type&&t.peerId===this.peerId&&(this.renderNewMessage(t),e())})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:t,mids:i})=>{"scheduled"===this.chat.type&&t===this.peerId&&(this.deleteMessagesByIds(i),e())}))}get peerId(){return this.chat.peerId}get messagesQueuePromise(){return this.batchProcessor.queuePromise}createScrollSaver(e=!0){return new at(this.scrollable,".bubble:not(.is-date)",e)}createResizeObserver(){if(!("ResizeObserver"in window)||this.resizeObserver)return;const e=this.scrollable.container;let t=0,i=!1,s=!1,n=0,a=0,o=0;const r=()=>{const r=e.offsetHeight,d=this.scrollable.isScrolledDown;r===t||s&&d||(a+=t-r),a&&this.scrollable.setScrollTopSilently(this.scrollable.scrollTop+Math.round(a)),t=r,n=0,o=0,a=0,i=!1,s=!1},d=e=>{o&&window.cancelAnimationFrame(o),o=window.requestAnimationFrame(e?r:()=>{o=window.requestAnimationFrame(r)})};(this.resizeObserver=new ResizeObserver((e=>{if(s)return void d(!1);const o=e[0].contentRect.height;if(!t)return void(t=o);const r=t-o;let l=r+a;const c=l%1;if(l-=c,!i&&(i=!0,r<0&&this.scrollable.isScrolledDown))return a=-r,s=!0,void d(!1);if(n+=l,l){const e=this.scrollable.scrollTop+l;this.scrollable.setScrollTopSilently(e)}d(!1),a=c,t=o}))).observe(e)}destroyResizeObserver(){const e=this.resizeObserver;e&&(e.disconnect(),this.resizeObserver=void 0)}setReactionsHoverListeners(){this.listenerSetter.add(Lt.Z)("toggle",this.unhoverPrevious),this.listenerSetter.add(St.Z)("change",this.unhoverPrevious),this.listenerSetter.add(this.chat.selection)("toggle",this.unhoverPrevious),this.listenerSetter.add(this.container)("mousemove",this.onBubblesMouseMove)}setHoverVisible(e,t){e.parentElement&&e.parentElement.classList.toggle("hover-reaction-visible",t),(0,Fe.Z)({element:e,className:"is-visible",forwards:t,duration:200,onTransitionEnd:t?void 0:()=>{e.remove()},useRafs:2})}setStickyDateManually(){}getRenderedLength(){return Object.keys(this.bubbles).length-this.skippedMids.size}onUnreadedInViewport(e,t){this.unreadedSeen.add(t),this.observer.unobserve(e,this.unreadedObserverCallback),this.unreaded.delete(e),this.readUnreaded()}readUnreaded(){if(this.readPromise)return;const e=this.getMiddleware();this.readPromise=wt.Z.getFocusPromise().then((()=>gs(this,void 0,void 0,(function*(){if(!e())return;let t=Math.max(...Array.from(this.unreadedSeen));if(this.scrollable.loadedAll.bottom){const e=Math.max(...Object.keys(this.bubbles).map((e=>+e)));t>=e&&(t=Math.max((yield this.chat.getHistoryMaxId())||0,t))}this.unreaded.forEach(((e,i)=>{e<=t&&this.onUnreadedInViewport(i,e)}));const i=[];for(const e of this.unreadedSeen)gt(yield this.chat.getMessage(e))&&i.push(e);return this.managers.appMessagesManager.readMessages(this.peerId,i),this.unreadedSeen.clear(),me.ZP&&this.log("will readHistory by maxId:",t),this.managers.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId).catch((e=>{this.log.error("readHistory err:",e),this.managers.appMessagesManager.readHistory(this.peerId,t,this.chat.threadId)})).finally((()=>{e()&&(this.readPromise=void 0,this.unreadedSeen.size&&this.readUnreaded())}))}))))}onGoDownClick(){return gs(this,void 0,void 0,(function*(){if(!this.followStack.length)return void this.chat.setMessageId();const e=this.getMiddleware(),t=this.followStack.slice(),i=yield Promise.all(t.map((e=>this.chat.getMessage(e))));if(!e())return;t.forEach(((e,t)=>{const s=i[t],n=this.bubbles[e];let a=!0;if(n){const e=n.getBoundingClientRect();a=xe.Z.height/2>e.top}else s&&(a=!1);a&&this.followStack.splice(this.followStack.indexOf(e),1)})),this.followStack.sort(((e,t)=>t-e));const s=this.followStack.pop();this.chat.setMessageId(s)}))}getBubbleByPoint(e){let t=we(this.scrollable.container,e,"center");return t&&(t=(0,ve.Z)(t,"bubble")),t}getGroupedBubble(e){return gs(this,void 0,void 0,(function*(){const t=yield this.managers.appMessagesManager.getMidsByAlbum(e);for(const e of t)if(this.bubbles[e]&&!this.skippedMids.has(e))return{bubble:this.bubbles[e],mid:e}}))}getBubbleGroupedItems(e){return Array.from(e.querySelectorAll(".grouped-item"))}getMountedBubble(e,t){return gs(this,void 0,void 0,(function*(){if(void 0===t&&(t=yield this.chat.getMessage(e)),!t)return;const i=t.grouped_id;if(i){const t=yield this.getGroupedBubble(i);if(t)return t.bubble=t.bubble.querySelector(`.document-container[data-mid="${e}"]`)||t.bubble,t}const s=this.bubbles[e];return s?{bubble:s,mid:e}:void 0}))}findNextMountedBubbleByMsgId(e,t){const i=(0,ot.Z)(this.bubbles,t?"desc":"asc");let s;s=t?t=>te{var t;return!!s(e)&&!!(null===(t=this.bubbles[e])||void 0===t?void 0:t.parentElement)}));return this.bubbles[n]}loadMoreHistory(e,t=!1){if(!this.peerId||this.chat.setPeerPromise||this.isHeavyAnimationInProgress||e&&(this.getHistoryTopPromise||this.scrollable.loadedAll.top)||!e&&(this.getHistoryBottomPromise||this.scrollable.loadedAll.bottom))return;const i=Object.keys(this.bubbles).map((e=>+e)).filter((e=>e>0&&!this.skippedMids.has(e))).sort(((e,t)=>e-t));i.length||i.push(0),e?(me.ZP&&this.log("Will load more (up) history by id:",i[0],"maxId:",i[i.length-1],t),this.getHistory1(i[0],!0,void 0,void 0,t)):(me.ZP&&this.log("Will load more (down) history by id:",i[i.length-1],t),this.getHistory1(i[i.length-1],!1,!0,void 0,t))}setScroll(){this.scrollable&&this.destroyScrollable(),this.scrollable=new Z.ZP(null,"IM",300),this.setLoaded("top",!1,!1),this.setLoaded("bottom",!1,!1),this.scrollable.container.append(this.chatInner),this.scrollable.onAdditionalScroll=this.onScroll,this.scrollable.onScrolledTop=()=>this.loadMoreHistory(!0),this.scrollable.onScrolledBottom=()=>this.loadMoreHistory(!1),c.Z}updateUnreadByDialog(){return gs(this,void 0,void 0,(function*(){const e=yield this.chat.getHistoryStorage(),t=this.peerId===d.Z.myId?e.readMaxId:e.readOutboxMaxId;for(const e of this.unreadOut)if(e>0&&e<=t){const t=this.bubbles[e];if(t){if(this.unreadOut.delete(e),t.classList.contains("is-outgoing")||t.classList.contains("is-error"))continue;t.classList.remove("is-sent","is-sending","is-outgoing"),t.classList.add("is-read")}}}))}destroyBubble(e,t=+e.dataset.mid){e.middlewareHelper.destroy(),this.bubbles[t]===e&&delete this.bubbles[t],this.skippedMids.delete(t),this.firstUnreadBubble===e&&(this.firstUnreadBubble=null),this.bubbleGroups.removeAndUnmountBubble(e),this.observer&&(this.observer.unobserve(e,this.unreadedObserverCallback),this.unreaded.delete(e),this.observer.unobserve(e,this.viewsObserverCallback),this.viewsMids.delete(t),this.observer.unobserve(e,this.stickerEffectObserverCallback))}deleteMessagesByIds(e,t=!0,i){let n=!1;e.forEach((e=>{const t=this.bubbles[e];t&&(this.destroyBubble(t,e),n=!0)})),n&&(this.scrollable.ignoreNextScrollEvent(),t&&this.chat.selection.isSelecting&&this.chat.selection.deleteSelectedMids(this.peerId,e),s.Z.checkAnimations(!1,this.chat.animationGroup),this.deleteEmptyDateGroups(),i||this.scrollable.onScroll())}pollExtendedMediaMessages(){const e=Array.from(this.extendedMediaMessages);return this.managers.appMessagesManager.getExtendedMedia(this.peerId,e)}setExtendedMediaMessagesPollInterval(){!this.pollExtendedMediaMessagesPromise&&this.extendedMediaMessages.size&&(this.pollExtendedMediaMessagesPromise=(0,nt.Z)(3e4).then((()=>this.pollExtendedMediaMessages())).then((()=>this.setExtendedMediaMessagesPollInterval())))}setTopPadding(e=this.getMiddleware()){let t,i=!1;if(!this.isTopPaddingSet&&"scheduled"!==this.chat.type){const{clientHeight:e,scrollHeight:s}=this.scrollable.container;i=e===s,i&&(t=this.chatInner,t.style.paddingTop=e+"px",this.scrollable.setScrollTopSilently(s),this.isTopPaddingSet=!0)}return{isPaddingNeeded:i,unsetPadding:i?()=>{e()&&i&&(t.style.paddingTop="",this.isTopPaddingSet=!1)}:void 0}}renderNewMessage(e,t){const i=this._renderNewMessage(e,t);return this.renderNewPromises.add(i),i.catch(Qe.Z).finally((()=>{this.renderNewPromises.delete(i)})),i}_renderNewMessage(e,t){return gs(this,void 0,void 0,(function*(){if(!this.scrollable.loadedAll.bottom){const t=this.chat.setPeerPromise;if(t){const i=this.getMiddleware();t.then((()=>gs(this,void 0,void 0,(function*(){if(!i())return;const t=yield this.chat.getMessage(e.mid);i()&&this.renderNewMessage(t)}))))}return}if(this.chat.threadId&&(0,v.Z)(e,this.chat.isForum)!==this.chat.threadId)return;if(this.bubbles[e.mid])return;t||(t=this.scrolledDown&&(!this.scrollingToBubble||this.scrollingToBubble===this.getLastBubble()||this.scrollingToBubble===this.chatInner));const i=this.getMiddleware(),{isPaddingNeeded:s,unsetPadding:n}=this.setTopPadding(i),a=this.performHistoryResult({history:[e]},!1);return t&&a.then((()=>{if(!i())return;let t;"scheduled"===this.chat.type&&(t=this.bubbles[e.mid]);const a=t?this.scrollToBubbleEnd(t):this.scrollToEnd();s&&a.then(n)})),a}))}getLastBubble(){var e;const t=this.bubbleGroups.getLastGroup();return null===(e=null==t?void 0:t.lastItem)||void 0===e?void 0:e.bubble}scrollToBubble(e,t,i,s){const n=(0,ve.Z)(e,"bubble");let a;if(e.parentElement||this.log.error("element is not connected",n),n&&"end"!==t){const e=this.bubbleGroups.getItemByBubble(n);e&&e.group.firstItem===e&&(0,Ie.Z)(e.group.container)===(this.stickyIntersector?Cs:1)&&(a=e.group.container.parentElement)}const r=this.chat.input.messageInput&&this.chat.input.messageInput.classList.contains("is-changing-height")||this.chat.container.classList.contains("is-toggling-helper"),d=this.scrollable.scrollIntoViewNew({element:e,position:t,margin:4,forceDirection:i,forceDuration:s,axis:"y",getNormalSize:r?({rect:e})=>{let t=xe.Z.height;return t-=this.container.offsetTop,t-=o.Z.isMobile||xe.Z.height<570?58:78,t}:void 0,fallbackToElementStartWhenCentering:a,startCallback:e=>{if(this.onScroll(!0,e),this.updateGradient){const{gradientRenderer:t}=this.chat;null==t||t.toNextPosition(e.getProgress),this.updateGradient=void 0}}});return i===he.f.Static&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop),d}scrollToEnd(){return this.scrollToBubbleEnd(this.chatInner)}scrollToBubbleEnd(e){return gs(this,void 0,void 0,(function*(){if(e){this.scrollingToBubble=e;const t=this.getMiddleware();if(yield this.scrollToBubble(e,"end",void 0,void 0),!t())return;this.scrollingToBubble=void 0}}))}scrollToBubbleIfLast(e){return gs(this,void 0,void 0,(function*(){if(this.getLastBubble()===e)return this.scrollToEnd()}))}highlightBubble(e){const t="highlightTimeout";e.dataset[t]&&(clearTimeout(+e.dataset[t]),e.classList.remove("is-highlighted"),e.offsetWidth),e.classList.add("is-highlighted"),e.dataset[t]=""+setTimeout((()=>{e.classList.remove("is-highlighted"),delete e.dataset[t]}),2e3)}createDateBubble(e,t=new Date(1e3*e)){let i;const s=new Date;s.setHours(0,0,0,0);const n="scheduled"===this.chat.type;if(s.getTime()===t.getTime())i=(0,C.ag)(n?"Chat.Date.ScheduledForToday":"Date.Today");else if(n&&e===ke)i=(0,C.ag)("MessageScheduledUntilOnline");else{const e={day:"numeric",month:"long"};t.getFullYear()!==s.getFullYear()&&(e.year="numeric"),i=new C.ZP.IntlDateElement({date:t,options:e}).element,n&&(i=(0,C.ag)("Chat.Date.ScheduledFor",[i]))}const a=document.createElement("div");a.className="bubble service is-date";const o=document.createElement("div");o.classList.add("bubble-content");const r=document.createElement("div");return r.classList.add("service-msg"),r.append(i),o.append(r),a.append(o),a}getDateForDateContainer(e){const t=new Date(1e3*e);return t.setHours(0,0,0),{date:t,dateTimestamp:t.getTime()}}getDateContainerByTimestamp(e){var t;const{date:i,dateTimestamp:s}=this.getDateForDateContainer(e);let n=this.dateMessages[s];if(n)return n;const a=this.createDateBubble(e,i),o=this.createDateBubble(e,i);o.classList.add("is-fake");const r=document.createElement("section");r.className="bubbles-date-group",r.append(a,o),n=this.dateMessages[s]={div:a,container:r,firstTimestamp:i.getTime()};const d=(0,ot.Z)(this.dateMessages,"asc"),l=d.length;let c,h=0;for(;hthis.setPeerTempId===d,u=(0,Et.Z)(h,Ls);i||(yield u(this.chat.onChangePeer(e,u)));const p=this.chat.type;("scheduled"===p||this.chat.isRestricted)&&(o=0);const f=yield u(this.chat.getHistoryStorage()),g="pinned"===p?yield u(this.managers.appMessagesManager.getPinnedMessagesMaxId(n,this.chat.threadId)):null!==(t=f.maxId)&&void 0!==t?t:0,v=void 0!==o;let b,y,w,S=0;if(!v)if(i||(y=this.chat.appImManager.getChatSavedPosition(this.chat)),y);else if(g){S=yield u(this.managers.appMessagesManager.getReadMaxIdIfUnread(n,this.chat.threadId));const e=yield u(this.chat.getDialogOrTopic());if(!S||i||e&&1===e.unread_count)o=g;else{const e=f.history.findSliceOffset(S);e&&e.slice.isEnd(ge.D.Bottom)&&(w=e.slice[e.offset-25]||e.slice[0]||S),b=!v,o=S}}const C=o!==g;if(void 0===r&&(yield u(this.chat.isStartButtonNeeded()))&&(r=m.gZ),i){a&&o&&this.followStack.push(a);const e=yield u(this.getMountedBubble(o));if(e)return v?(this.scrollToBubble(e.bubble,"center"),this.highlightBubble(e.bubble),this.chat.dispatchEvent("setPeer",o,!1)):g&&!C&&(this.scrollToEnd(),this.chat.dispatchEvent("setPeer",o,!0)),void 0!==r&&this.chat.input.setStartParam(r),null}else this.peerId&&(this.lazyLoadQueue.queueId=++Ss,this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)),this.followStack.length=0,this.passEntities={messageEntityBotCommand:(yield u(this.managers.appPeersManager.isAnyGroup(n)))||this.chat.isBot};me.ZP&&c("setPeer peerId:",n,f,o,g);const L=null!=w?w:C||"scheduled"===p||this.chat.isRestricted?0:g;let E=0;if(i){const e=this.getBubbleByPoint("bottom");e&&(E=+e.dataset.mid),E<=0&&(E=Math.max(...Object.keys(this.bubbles).map((e=>+e))))}else this.isFirstLoad=!0,this.destroyResizeObserver();const I=this.chatInner,M=this.emptyPlaceholderBubble;this.cleanup();const P=this.chatInner=document.createElement("div");i?(P.className=I.className,P.classList.remove("disable-hover","is-scrolling")):P.classList.add("bubbles-inner"),this.lazyLoadQueue.lock();const Z=i||g&&C||v,k=E>0&&(!o||Ethis.performHistoryResult({history:y.mids},!0))),cached:!0,waitPromise:Promise.resolve()}:yield u(this.getHistory1(o,!0,C,L)),this.setPeerCached=A.cached,c.warn("got history");const{promise:_,cached:F}=A;F||i||(yield u(this.chat.finishPeerChange(v,C,o,r)),this.scrollable.container.textContent="",this.preloader.attach(this.container)),s.Z.lockGroup(this.chat.animationGroup);const D=u(_).then((()=>gs(this,void 0,void 0,(function*(){var e;c.warn("promise fulfilled");const t=Z?yield u(o?this.getMountedBubble(o):{bubble:this.getLastBubble()}):void 0;F&&!i&&(c.warn("finishing peer change"),yield u(this.chat.finishPeerChange(v,C,o,r)),c.warn("finished peer change")),this.preloader.detach(),this.resolveLadderAnimation&&(this.resolveLadderAnimation(),this.resolveLadderAnimation=void 0),this.setPeerCached=void 0;const a=this.scrollable;if(a.lastScrollDirection=0,a.lastScrollPosition=0,(0,U.Z)(a.container,P),M&&this.cleanupPlaceholders(M),this.attachPlaceholderOnRender&&this.attachPlaceholderOnRender(),!v&&this.chat.isPinnedMessagesNeeded()&&(null===(e=this.chat.topbar.pinnedMessage)||void 0===e||e.setCorrectIndex(0)),this.container.classList.toggle("has-groups",!!Object.keys(this.dateMessages).length),c.warn("mounted chat",this.chatInner===P,this.chatInner.parentElement,performance.now()-l),s.Z.unlockGroup(this.chat.animationGroup),s.Z.checkAnimations(!1,this.chat.animationGroup),this.lazyLoadQueue.unlock(),y)a.setScrollTopSilently(y.top);else if(Z){let e;if(T)a.setScrollTopSilently(99999);else if(x){const t=this.setTopPadding();t.isPaddingNeeded&&(e=t.unsetPadding),a.setScrollTopSilently(0)}let s,n=b&&this.firstUnreadBubble||(null==t?void 0:t.bubble);if((null==n?void 0:n.parentElement)||(n=this.findNextMountedBubbleByMsgId(o,!1)||this.findNextMountedBubbleByMsgId(o,!0)),n){const e=this.getLastBubble(),t=b?"start":C||v||e!==n?"center":"end";s="end"===t&&e===n&&i?this.scrollToEnd():this.scrollToBubble(n,t,i?void 0:he.f.Static),!b&&v&&this.highlightBubble(n)}e&&(s||Promise.resolve()).then((()=>{e()}))}else a.setScrollTopSilently(99999);this.onRenderScrollSet(),this.onScroll();const d=Promise.all([D,(0,ue.e9)()]);if(d.then((()=>{a.checkForTriggers()})),this.chat.dispatchEvent("setPeer",o,!C),Promise.all([this.setFetchReactionsInterval(d),this.setFetchHistoryInterval({afterSetPromise:d,lastMsgId:o,samePeer:i,savedPosition:y,topMessage:g})]).then((()=>{c("scrolledAllDown:",a.loadedAll.bottom),a.loadedAll.bottom&&g&&!this.unreaded.size&&this.onScrolledAllDown()})),"chat"===p&&!this.chat.isForumTopic){const e=yield u(this.managers.appMessagesManager.getDialogOnly(n));(null==e?void 0:e.pFlags.unread_mark)&&this.managers.appMessagesManager.markDialogUnread(n,!0)}})))).catch((e=>{throw c.error("setPeer promise error:",e),h()||this.preloader.detach(),e}));return{cached:F,promise:D}}))}setFetchReactionsInterval(e){return gs(this,void 0,void 0,(function*(){const t=this.getMiddleware();if(this.chat.isChannel){const i=()=>gs(this,void 0,void 0,(function*(){if(!t())return;const e=[];for(const t in this.bubbles){let i=yield this.chat.getMessage(+t);"message"===(null==i?void 0:i._)&&(i=yield this.managers.appMessagesManager.getGroupsFirstMessage(i),e.push(i.mid))}(e.length?this.managers.appReactionsManager.getMessagesReactions(this.peerId,e):Promise.resolve()).then((()=>{setTimeout(i,1e4)}))}));Promise.all([e,(0,ue.e9)(),(0,nt.Z)(500)]).then((()=>{i()}))}}))}setFetchHistoryInterval({lastMsgId:e,topMessage:t,afterSetPromise:i,savedPosition:s,samePeer:n}){return gs(this,void 0,void 0,(function*(){const e=this.getMiddleware(),t=this.peerId,n=yield this.managers.appMessagesManager.isFetchIntervalNeeded(t);if(!s&&!n)return;if(yield i,!e())return;const a=t.toChatId();e.onClean((()=>{this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(a)})),this.managers.apiUpdatesManager.subscribeToChannelUpdates(a)}))}onScrolledAllDown(){return gs(this,void 0,void 0,(function*(){if("chat"===this.chat.type||"discussion"===this.chat.type){const e=yield this.chat.getHistoryMaxId();this.managers.appMessagesManager.readHistory(this.peerId,e,this.chat.threadId,!0)}}))}finishPeerChange(){return gs(this,void 0,void 0,(function*(){const[e,t,i]=yield Promise.all([this.chat.isChannel,this.chat.canSend(),this.chat.isAnyGroup]);return()=>{this.chatInner.classList.toggle("has-rights",t),this.container.classList.toggle("is-chat-input-hidden",!t),this.chatInner.classList.toggle("is-chat",i),this.chatInner.classList.toggle("is-channel",e),this.createResizeObserver()}}))}renderMessagesQueue(e){return this.batchProcessor.addToQueue(e)}ejectBubbles(){for(const e of this.bubblesToEject)e.remove();this.bubblesToEject.clear()}groupBubbles(e){let t;"scheduled"===this.chat.type&&(t=new Set,e.forEach((({bubble:e,message:i})=>{const s=this.bubbleGroups.getItemByBubble(e),n=null==s?void 0:s.group;n&&s.message.date!==i.date&&(this.bubbleGroups.removeItem(s),t.add(n))}))),e.forEach((({bubble:e,message:t})=>{this.bubbleGroups.prepareForGrouping(e,t)}));const i=this.bubbleGroups.groupUngrouped(),s=Array.from(i).map((e=>{if(e.avatar)return;const t=e.firstItem;return t&&this.chat.isAvatarNeeded(t.message)?e.createAvatar(t.message):void 0})).filter(Boolean);if(t)for(const e of t)i.add(e);return{groups:[...i],avatarPromises:s}}getMiddleware(e){return this.middlewareHelper.get(e)}wrapMediaSpoiler({media:e,promise:t,middleware:i,attachmentDiv:s}){return gs(this,void 0,void 0,(function*(){if(yield t,!i())return;const{width:n,height:a}=s.style,o=yield(0,$i.ZP)({media:e,width:parseInt(n),height:parseInt(a),middleware:i,animationGroup:this.chat.animationGroup});i()&&s.append(o)}))}safeRenderMessage(e,t,i,s=!0,n){return gs(this,void 0,void 0,(function*(){if(!e||this.renderingMessages.has(e.mid)||this.bubbles[e.mid]&&!i)return;const a=this.getMiddleware().create(),o=a.get();let r;try{this.renderingMessages.add(e.mid);const d=document.createElement("div");d.middlewareHelper=a,d.dataset.mid=""+e.mid,d.dataset.peerId=""+e.peerId,d.dataset.timestamp=""+e.date,i&&(i.middlewareHelper.destroy(),this.skippedMids.delete(e.mid),this.bubblesToEject.add(i),this.bubblesToReplace.delete(i),this.bubblesToReplace.set(d,i),this.bubbleGroups.changeBubbleByBubble(i,d)),i=this.bubbles[e.mid]=d;let l=this.renderMessage(e,t,i,o);n&&(l=n(l,i));const c=l.then((e=>e&&o()?Object.assign(Object.assign({},e),{updatePosition:s}):void 0));if(this.renderMessagesQueue(c.catch((()=>{}))),r=yield c,!o())return;r||this.skippedMids.add(+e.mid)}catch(e){this.log.error("renderMessage error:",e)}return o()?(this.renderingMessages.delete(e.mid),r):void 0}))}renderMessage(e,t=!1,i,s){var n,a,r;return gs(this,void 0,void 0,(function*(){const l="message"===e._,c=l&&e.grouped_id;let h,u;const p=c?yield this.managers.appMessagesManager.getMessagesByAlbum(c):void 0,g="pinned"!==this.chat.type;if(c&&g){h=p.map((e=>e.mid));const t=Ms(h);if(e.mid!==t)return}l&&(u=c?p[0]:e);const b=this.chat.isOurMessage(e),y=document.createElement("div");y.classList.add("message","spoilers-container");const w=document.createElement("div");w.classList.add("bubble-content-wrapper");const L=document.createElement("div");L.classList.add("bubble-content"),i.classList.add("bubble"),w.append(L),i.append(w);let E=!b&&!e.pFlags.out&&(e.pFlags.unread||gt(e));if(!E&&this.chat.peerId.isAnyChat()){const t=yield this.managers.appMessagesManager.getReadMaxIdIfUnread(this.chat.peerId,this.chat.threadId);void 0!==t&&t"messageEntityEmoji"===e._)),t=k.replace(/\s/g,"").length;if(e.reduce(((e,t)=>e+t.length),0)===t){U=Math.min(Is,e.length),N=o.Z.active.customEmoji;const t=Es[U];t&&(N=(0,qe.C)(t,t),i.style.setProperty("--emoji-size",t+"px"))}}null!=N||(N=this.chat.appImManager.customEmojiSize);const H=(0,ft.ZP)(k,{entities:A,passEntities:this.passEntities,loadPromises:M,lazyLoadQueue:this.lazyLoadQueue,customEmojiSize:N,middleware:s,animationGroup:this.chat.animationGroup});let z,j=!0,G=!1;if(U){if(d.Z.settings.emoji.big){const e=1===U&&!A.find((e=>"messageEntityCustomEmoji"===e._))&&(yield this.managers.appStickersManager.getAnimatedEmojiSticker(k));1===U&&!F&&e?F={_:"messageMediaDocument",document:e}:(z=document.createElement("div"),z.classList.add("attachment","spoilers-container"),(0,_.Z)(z,H),L.append(z)),i.classList.add("is-message-empty","emoji-big"),G=!0,j=!1,D=!1}i.classList.add("can-have-big-emoji")}D&&(0,_.Z)(y,H);const $=(q=k,hs.test(q));var q;const Q=re.setTime({chatType:this.chat.type,message:e,reactionsMessage:u});let Y;if(y.append(Q),L.prepend(y),$&&Q.classList.add("is-block"),l&&this.chat.isAllMessagesForum){const t=yield(0,ms.Z)({peerId:this.peerId,threadId:(0,v.Z)(e,this.chat.isForum),lastMsgId:e.mid,wrapOptions:{middleware:s},withIcons:!0}),{element:i}=t;Y=document.createElement("div"),Y.classList.add("topic-name-button-container"),Y.append(i)}if(l&&e.views){if(i.classList.add("channel-post"),!(null===(n=e.fwd_from)||void 0===n?void 0:n.saved_from_msg_id)&&"pinned"!==this.chat.type){const e=document.createElement("div");e.classList.add("bubble-beside-button","forward","tgico-forward_filled"),L.prepend(e),i.classList.add("with-beside-button")}!e.pFlags.is_outgoing&&this.observer&&this.observer.observe(i,this.viewsObserverCallback)}const X=l&&e.reply_markup;let J="replyInlineMarkup"===(null==X?void 0:X._)&&X.rows;if(J&&(J=J.filter((e=>e.buttons.length))),J){const t=document.createElement("div");t.classList.add("reply-markup"),J.forEach((i=>{const s=i.buttons,n=document.createElement("div");n.classList.add("reply-markup-row"),s.forEach((t=>{let i,s=(0,ft.ZP)(t.text,{noLinks:!0,noLinebreaks:!0});switch(t._){case"keyboardButtonUrl":{const e=(0,ft.ZP)(" ",{entities:[{_:"messageEntityTextUrl",length:1,offset:0,url:t.url}]});i=(0,Le.Z)(e).firstElementChild,i.classList.add("is-link");break}case"keyboardButtonSwitchInline":i=document.createElement("button"),i.classList.add("is-switch-inline"),(0,S.fc)(i,(i=>{(0,Ce.Z)(i);const s=e.viaBotId||e.fromId;let n;n=t.pFlags.same_peer?Promise.resolve(this.peerId):this.managers.appInlineBotsManager.checkSwitchReturn(s).then((e=>e||new Promise(((e,t)=>{const i=new I.Z({[this.peerId]:[]},(t=>{e(t)}),!0);i.addEventListener("close",(()=>{t()}))})))),n.then((e=>{const i=this.peerId===e?this.chat.threadId:void 0;this.chat.appImManager.setInnerPeer({peerId:e}),this.managers.appInlineBotsManager.switchInlineQuery(e,i,s,t.query)}))}));break;case"keyboardButtonBuy":{const e="messageMediaInvoice"===F._?F:void 0;if(null==e?void 0:e.extended_media)break;i=document.createElement("button"),i.classList.add("is-buy"),(null==e?void 0:e.receipt_msg_id)&&(s=(0,C.ag)("Message.ReplyActionButtonShowReceipt"));break}case"keyboardButtonUrlAuth":{i=document.createElement("button"),i.classList.add("is-url-auth");const{peerId:s}=this,{mid:n}=e,{url:a,button_id:o}=t;(0,S.fc)(i,(()=>{const e=(0,Ut.Z)([i],!0);this.chat.appImManager.handleUrlAuth({peerId:s,mid:n,url:a,buttonId:o}).then((()=>{e()}))}));break}default:i=document.createElement("button")}if(!i)return;i.classList.add("reply-markup-button","rp","tgico");const a=document.createElement("span");a.classList.add("reply-markup-button-text"),"string"==typeof s?a.insertAdjacentHTML("beforeend",s):a.append(s),(0,x.Z)(i),i.append(a),n.append(i)})),n.childElementCount&&t.append(n)}));const s=!!t.childElementCount;s&&(0,S.fc)(t,(t=>{let i=t.target;if(i.classList.contains("reply-markup-button")||(i=(0,ve.Z)(i,"reply-markup-button")),!i||i.classList.contains("is-link")||i.classList.contains("is-switch-inline")||i.classList.contains("is-buy")||i.classList.contains("is-url-auth"))return;(0,Ce.Z)(t);const s=(0,Ie.Z)(i),n=J[(0,Ie.Z)(i.parentElement)];if(!n.buttons||!n.buttons[s])return void this.log.warn("no such button",n,s,e);const a=n.buttons[s];this.managers.appInlineBotsManager.callbackButtonClick(this.peerId,e.mid,a).then((e=>{"string"==typeof e.message&&e.message.length&&(0,ye.Am)((0,ft.ZP)(e.message,{noLinks:!0,noLinebreaks:!0}))}))})),s&&(i.classList.add("with-reply-markup"),w.append(t))}const ee=e.pFlags.is_outgoing;if(b){(e.pFlags.unread||ee)&&this.unreadOut.add(e.mid);let t="";t=e.error?"is-error":ee?"is-sending":e.pFlags.unread||e.pFlags.is_scheduled?"is-sent":"is-read",i.classList.add(t)}ee&&!e.error&&i.classList.add("is-outgoing");const te=l&&(yield this.managers.appMessagesManager.getMessageWithCommentReplies(e)),ie=!!te&&e.mid>0;ie&&i.classList.add("with-replies");const se=l&&e.fwd_from,ne=l&&e.fwdFromId,ae=this.chat.isOutMessage(e);let oe=L;const de=!(e.viaBotId||e.fromId!==d.Z.myId&&e.pFlags.out),le=!k;let ce;if(F){z=document.createElement("div"),z.classList.add("attachment"),le&&i.classList.add("is-message-empty");let t=!1;switch(F._){case"messageMediaPhoto":{const t=F.photo;if(le&&(j=!1),de&&i.classList.add("hide-name"),i.classList.add("photo"),g&&c&&1!==h.length){i.classList.add("is-album","is-grouped"),qi({messages:p,attachmentDiv:z,middleware:this.getMiddleware(),isOut:b,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:M,autoDownload:this.chat.autoDownload});break}const n=!T.IS_ANDROID&&j&&!ie&&!1;n&&i.classList.add("with-media-tail");const a=(0,V.Z)({photo:t,message:e,container:z,withTail:n,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:M,autoDownloadSize:this.chat.autoDownload.photo});F.pFlags.spoiler&&M.push(this.wrapMediaSpoiler({media:t,promise:a,middleware:s,attachmentDiv:z}));break}case"messageMediaWebPage":{t=!0;const s=F.webpage;if("webPage"!==s._)break;const n=(0,fs.Z)(s.url);if("im"===(null==n?void 0:n.onclick)){const e={telegram_channel:"Chat.Message.ViewChannel",telegram_megagroup:"OpenGroup",telegram_bot:"Chat.Message.ViewBot"}[s.type]||"OpenMessage";ce=this.makeViewButton({text:e,asLink:!0}),ce.href=n.url,ce.setAttribute("onclick",`${n.onclick}(this)`)}i.classList.add("webpage");const a=document.createElement("div");a.classList.add("web");const r=document.createElement("div");let l,c;r.classList.add("quote");const h=s.photo;(h||s.document)&&(l=document.createElement("div"),l.classList.add("preview-resizer"),c=document.createElement("div"),c.classList.add("preview"),l.append(c));const u=document.createElement("div");u.classList.add("quote-text");const p=s.document;if(p)if("gif"===p.type||"video"===p.type||"round"===p.type){const t="round"===p.type?o.Z.active.round:o.Z.active.webpage;"round"===p.type?(i.classList.add("round"),c.classList.add("is-round")):i.classList.add("video"),(0,W.Z)({doc:p,container:c,message:e,boxWidth:t.width,boxHeight:t.height,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),isOut:ae,group:this.chat.animationGroup,loadPromises:M,autoDownload:this.chat.autoDownload,noInfo:e.mid<0})}else{const t=yield(0,Qi.Z)({message:e,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,loadPromises:M,sizeType:"documentName",searchContext:{useSearch:!1,peerId:this.peerId,inputFilter:{_:"inputMessagesFilterEmpty"}},fontSize:d.Z.settings.messagesTextSize});c.append(t),c.classList.add("preview-with-document"),u.classList.add("has-document")}let f;if(l&&u.append(l),s.site_name){const e=(0,ft.ZP)(s.url),t=(0,Le.Z)(e).firstElementChild;t.classList.add("webpage-name");const i=document.createElement("strong");(0,_.Z)(i,(0,R.Z)(s.site_name)),t.textContent="",t.append(i),u.append(t),f=t}const m=(0,pt.Z)(s);if(m.textContent){const e=document.createElement("div");e.classList.add("title");const t=document.createElement("strong");(0,_.Z)(t,m),e.append(t),u.append(e),f=e}const g=(0,ut.Z)(s);if(g.textContent){const e=document.createElement("div");e.classList.add("text"),(0,_.Z)(e,g),u.append(e),f=e}if(r.append(u),h&&!p){i.classList.add("photo");const t=h.sizes[h.sizes.length-1];let s=!1;t.w===t.h&&f?(i.classList.add("is-square-photo"),s=!0,(0,ht.Z)(h,c,48,48,!1)):t.h>t.w&&i.classList.add("is-vertical-photo"),(0,V.Z)({photo:h,message:e,container:c,boxWidth:s?0:o.Z.active.webpage.width,boxHeight:s?0:o.Z.active.webpage.height,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:M,withoutPreloader:s,autoDownloadSize:this.chat.autoDownload.photo})}a.append(r),y.insertBefore(a,Q);break}case"messageMediaDocument":{const n=F.document;if(n.sticker){i.classList.add("sticker"),j=!1,G=!0,n.animated&&i.classList.add("sticker-animated");const e=o.Z.active,t=i.classList.contains("emoji-big"),r=t?e.emojiSticker:n.animated?e.animatedSticker:e.staticSticker;(0,ht.Z)(n,z,r.width,r.height),L.style.minWidth=z.style.width,L.style.minHeight=z.style.height,(0,K.ZP)({doc:n,div:z,middleware:s,lazyLoadQueue:this.lazyLoadQueue,group:this.chat.animationGroup,play:!0,loop:!0,emoji:t?k:void 0,withThumb:!0,loadPromises:M,isOut:ae,noPremium:null===(a=null==F?void 0:F.pFlags)||void 0===a?void 0:a.nopremium}),((0,zi.Z)(n)||t)&&(E||ee)&&this.observer.observe(i,this.stickerEffectObserverCallback)}else if("video"===n.type||"gif"===n.type||"round"===n.type){const t="round"===n.type;if(t&&(G=!0),(t||le)&&(j=!1),de&&i.classList.add("hide-name"),i.classList.add(t?"round":"video"),g&&c&&1!==h.length)i.classList.add("is-album","is-grouped"),qi({messages:p,attachmentDiv:z,middleware:s,isOut:b,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:M,autoDownload:this.chat.autoDownload});else{const a=!T.IS_ANDROID&&!T.IS_APPLE&&!t&&j&&!ie&&!1;a&&i.classList.add("with-media-tail");const r=(0,W.Z)({doc:n,container:z,message:e,boxWidth:o.Z.active.regular.width,boxHeight:o.Z.active.regular.height,withTail:a,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:s,group:this.chat.animationGroup,loadPromises:M,autoDownload:this.chat.autoDownload,searchContext:t?{peerId:this.peerId,inputFilter:{_:"inputMessagesFilterRoundVoice"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0,noInfo:e.mid<0,noAutoplayAttribute:!!F.pFlags.spoiler});F.pFlags.spoiler&&M.push(this.wrapMediaSpoiler({media:n,promise:r,middleware:s,attachmentDiv:z}))}}else{const s=yield function({albumMustBeRenderedFull:e,message:t,bubble:i,messageDiv:s,chat:n,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:d,useSearch:l,sizeType:c,managers:h,fontWeight:u,fontSize:p,richTextFragment:f}){return Yi(this,void 0,void 0,(function*(){let l;const m=e?yield n.getMidsByMid(t.mid):[t.mid],g=m.map(((e,t)=>Yi(this,void 0,void 0,(function*(){const i=yield n.getMessage(e),s=yield(0,Qi.Z)({message:i,loadPromises:a,autoDownloadSize:o,lazyLoadQueue:r,searchContext:d,sizeType:c,managers:h,fontWeight:u,fontSize:p}),g=document.createElement("div");g.classList.add("document-container"),g.dataset.mid=""+e,g.dataset.peerId=""+i.peerId;const v=document.createElement("div");if(v.classList.add("document-wrapper"),i.message){const e=document.createElement("div");e.classList.add("document-message"),(0,_.Z)(e,f),v.append(e)}if(m.length>1){const e=document.createElement("div");e.classList.add("document-selection"),g.append(e),g.classList.add("grouped-item"),0===t&&(l=v)}return v.append(s),g.append(v),g})))),v=yield Promise.all(g);return s.append(...v),m.length>1&&i.classList.add("is-multiple-documents","is-grouped"),l}))}({albumMustBeRenderedFull:g,message:e,bubble:i,messageDiv:y,chat:this.chat,loadPromises:M,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,searchContext:"voice"===n.type||"audio"===n.type?{peerId:this.peerId,inputFilter:{_:"voice"===n.type?"inputMessagesFilterRoundVoice":"inputMessagesFilterMusic"},threadId:this.chat.threadId,useSearch:!e.pFlags.is_scheduled,isScheduled:e.pFlags.is_scheduled}:void 0,sizeType:"documentName",fontSize:d.Z.settings.messagesTextSize,richTextFragment:H});s&&(oe=s);const a=y.lastElementChild.querySelector(".document-message, .document, .audio");a&&a.append(Q),i.classList.remove("is-message-empty"),y.classList.add((["photo","pdf"].includes(n.type)?"document":n.type||"document")+"-message"),t=!0}break}case"messageMediaCall":{const e=F.action,s=document.createElement("div");s.classList.add("bubble-call",e.pFlags.video?"tgico-videocamera":"tgico-phone");const n=e.pFlags.video?"video":"voice";s.dataset.type=n;const a=document.createElement("div");a.classList.add("bubble-call-title"),(0,C.$d)(a,ae?e.pFlags.video?"CallMessageVideoOutgoing":"CallMessageOutgoing":e.pFlags.video?"CallMessageVideoIncoming":"CallMessageIncoming");const o=document.createElement("div");if(o.classList.add("bubble-call-subtitle"),void 0!==e.duration)o.append((0,Ne.Z)(e.duration));else{let t;switch(e.reason._){case"phoneCallDiscardReasonBusy":t="Call.StatusBusy";break;case"phoneCallDiscardReasonMissed":t="Chat.Service.Call.Missed";break;default:t="Chat.Service.Call.Cancelled"}o.classList.add("is-reason"),(0,C.$d)(o,t)}o.classList.add("tgico","arrow-"+(void 0!==e.duration?"green":"red")),s.append(a,o),t=!0,i.classList.remove("is-message-empty"),y.classList.add("call-message"),y.append(s);break}case"messageMediaContact":{const e=F,s=document.createElement("div");s.classList.add("contact"),s.dataset.peerId=""+e.user_id,t=!0;const n=document.createElement("div");n.className="contact-details";const a=document.createElement("div");a.className="contact-name",a.append((0,R.Z)([e.first_name,e.last_name].filter(Boolean).join(" ")));const o=document.createElement("div");o.className="contact-number",o.textContent=e.phone_number?"+"+(0,Ae.u)(e.phone_number).formatted:"Unknown phone number",s.append(n),n.append(a,o);const r=new f.Z;r.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e.user_id.toPeerId()}),r.classList.add("contact-avatar","avatar-54"),s.prepend(r),i.classList.remove("is-message-empty"),y.classList.add("contact-message"),y.append(s);break}case"messageMediaPoll":{i.classList.remove("is-message-empty");const t=function(e,t=d.Z.managers){const i=new ls;return i.message=e,i.managers=t,i.setAttribute("peer-id",""+e.peerId),i.setAttribute("poll-id",e.media.poll.id),i.setAttribute("message-id",""+e.mid),i.render(),i}(e);y.prepend(t),y.classList.add("poll-message");break}case"messageMediaInvoice":{const t=F.pFlags.test,n=F.extended_media,a="messageExtendedMedia"===(null==n?void 0:n._),r="messageExtendedMediaPreview"===(null==n?void 0:n._);let d=a?n.media.photo||n.media.document:F.photo;const l=(0,Pt.Z)(F.total_amount,F.currency);let c,h;if(n){if(r&&(c=document.createElement("span"),c.classList.add("extended-media-buy","tgico-premium_lock"),z.classList.add("is-buy"),(0,C.$d)(c,"Checkout.PayPrice",[l]),void 0!==n.video_duration)){const e=document.createElement("span");e.classList.add("video-time"),e.textContent=(0,ts.Z)(n.video_duration,!1),z.append(e)}}else{c=document.createElement(d?"span":"div");const e=document.createDocumentFragment(),i=(0,C.ag)(F.receipt_msg_id?"PaymentReceipt":t?"PaymentTestInvoice":"PaymentInvoice");i.classList.add("text-uppercase");const s=" ‎",n=document.createElement("span");if(n.classList.add("text-bold"),n.textContent=l+s,e.append(n,i),t&&F.receipt_msg_id){const t=document.createElement("span");t.classList.add("text-uppercase","pre-wrap"),t.append(s+"(Test)"),e.append(t)}(0,_.Z)(c,e)}if(r&&(n.thumb.w=n.w,n.thumb.h=n.h,d={_:"photo",access_hash:"",pFlags:{},date:0,dc_id:0,file_reference:[],id:0,sizes:[n.thumb]}),d){const t=n?o.Z.active.extendedInvoice:o.Z.active.invoice;"document"===d._?((0,W.Z)({doc:d,container:z,withTail:!1,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:s,loadPromises:M,boxWidth:t.width,boxHeight:t.height,group:this.chat.animationGroup,message:e}),i.classList.add("video")):((0,V.Z)({photo:d,container:z,withTail:!1,isOut:ae,lazyLoadQueue:this.lazyLoadQueue,middleware:s,loadPromises:M,boxWidth:t.width,boxHeight:t.height,message:a?e:void 0}),i.classList.add("photo")),c&&(n||c.classList.add("video-time"),z.append(c))}else z=void 0;if(r){const{mid:t}=e;this.extendedMediaMessages.add(t),s.onClean((()=>{this.extendedMediaMessages.delete(t)})),this.setExtendedMediaMessagesPollInterval();const{width:i,height:n}=z.style,a=us.Z.create({width:parseInt(i),height:parseInt(n),middleware:s,animationGroup:this.chat.animationGroup});z.append(a.canvas)}n||(h=document.createElement("div"),h.classList.add("bubble-primary-color"),(0,_.Z)(h,(0,R.Z)(F.title)));const u=a?void 0:(0,R.Z)(F.description);y.prepend(...[h,!d&&c,u].filter(Boolean)),u?i.classList.remove("is-message-empty"):j=!1,i.classList.add("is-invoice");break}default:z=void 0,i.classList.remove("is-message-empty"),y.append((0,C.ag)(C.nK),Q),this.log.warn("unrecognized media type:",F._,e)}!t&&z&&L.append(z)}G&&i.classList.add("just-media"),ce&&Q.before(ce);let he="";const ue=e.fromId!==d.Z.myId&&this.chat.isAnyGroup||e.viaBotId||e.pFlags.sponsored;if(ue||se||e.reply_to_mid||Y){let t,s;const n="peerChannel"===(null===(r=e.from_id)||void 0===r?void 0:r._)&&e.fromId===ne,a=!!e.viaBotId,o=se&&!se.from_id;e.viaBotId&&(s=document.createElement("span"),s.innerText="@"+(yield this.managers.appPeersManager.getPeerUsername(e.viaBotId)),s.classList.add("peer-title")),a&&i.classList.add("must-have-name");const c=ne||se;let h,u;if(o?(t=document.createElement("span"),(0,_.Z)(t,(0,R.Z)(se.from_name)),t.classList.add("peer-title"),i.classList.add("hidden-profile")):t=new B.Z({peerId:ne||e.fromId,withPremiumIcon:!c,wrapOptions:Z}).element,l&&e.reply_to_mid&&e.reply_to_mid!==this.chat.threadId&&(!this.chat.isAllMessagesForum||e.reply_to.reply_to_top_id)&&(h=yield re.setReply({chat:this.chat,bubble:i,bubbleContainer:L,message:e})),c)if(this.peerId===d.Z.myId||n||i.classList.add("forwarded"),e.savedFrom&&(he=e.savedFrom,t.dataset.savedFrom=he),u=document.createElement("div"),t.dataset.peerId=""+ne,this.peerId!==d.Z.myId&&this.peerId!==m.hj&&!n||G){const e=[t];if(G){const t=document.createElement("br");t.classList.add("hide-ol"),e.unshift(t)}u.append((0,C.ag)("ForwardedFrom",[e]))}else u.style.color=(0,O.Z)(ne,!1),u.classList.add("colored-name"),u.append(t);else if(!e.viaBotId)if(!G&&ue){u=document.createElement("div"),u.append(t);const i=yield this.managers.appPeersManager.getPeer(e.fromId),s=null==i?void 0:i.pFlags;s&&(s.scam||s.fake)&&u.append((0,lt.Z)(s.scam)),b||(u.style.color=(0,O.Z)(e.fromId,!1),u.classList.add("colored-name")),u.dataset.peerId=""+e.fromId}else i.classList.add("hide-name");if(e.viaBotId){u?u.append(" "):u=document.createElement("div");const e=document.createElement("span");e.append((0,C.ag)("ViaBot")," ",s),e.classList.add("is-via"),u.append(e)}Y&&(G?Y.classList.add("floating-part"):(u||(u=document.createElement("div")),u.append(Y),i.classList.remove("hide-name"))),u?(u.classList.add("name"),G?(oe.append(oe=document.createElement("div")),oe.classList.add("name-with-reply","floating-part")):u.classList.add("floating-part"),oe.append(u),G&&h&&oe.append(h)):G&&h&&h.classList.add("floating-part"),Y&&G&&(z?z.after(Y):this.log.error("no attachment div?",i,e))}else i.classList.add("hide-name");if("pinned"===this.chat.type&&(he=`${this.chat.peerId}_${e.mid}`),te&&te.mid===this.chat.threadId&&i.classList.add("is-thread-starter","is-group-last"),he&&("pinned"===this.chat.type||se.saved_from_msg_id)&&this.peerId!==m.hj){const e=document.createElement("div");e.classList.add("bubble-beside-button","goto-original","tgico-arrow_next"),L.append(e),i.dataset.savedFrom=he,i.classList.add("with-beside-button")}return i.classList.add(ae?"is-out":"is-in"),ie&&(re.renderReplies({bubble:i,bubbleContainer:L,message:te,messageDiv:y,loadPromises:M,lazyLoadQueue:this.lazyLoadQueue})?j=!0:i.classList.add("with-beside-replies")),l&&this.appendReactionsElementToBubble(i,e,u),j&&(i.classList.add("can-have-tail"),L.append(Zs())),P}))}appendReactionsElementToBubble(e,t,i,s){if(this.peerId.isUser(),!(null==i?void 0:i.reactions)||!i.reactions.results.length)return;const n=new st;if(n.init(i,"block",e.middlewareHelper.get()),n.render(s),e.classList.contains("is-message-empty"))e.querySelector(".bubble-content-wrapper").append(n);else{const s=e.querySelector(".message");if(e.classList.contains("is-multiple-documents")){const e=s.lastElementChild;let a=e.querySelector(".document-message"),o=a&&a.querySelector(".time");o||(o=re.setTime({chatType:this.chat.type,message:t,reactionsMessage:i})),n.append(o),a||(a=document.createElement("div"),a.classList.add("document-message"),e.querySelector(".document-wrapper").prepend(a)),a.append(n)}else{const t=Array.from(e.querySelectorAll(".time")).pop();n.append(t),s.append(n)}}}prepareToSaveScroll(e){if(!this.chatInner.parentElement)return{};const t=this.log.bindPrefix("prepareToSaveScroll");t("save");const i=this.createScrollSaver(e);if(i.save(),this.getRenderedLength()&&!this.chat.setPeerPromise){const e=this.getViewportSlice();this.deleteViewportSlice(e,!0)}return{restoreScroll:()=>{t("restore"),i.restore(e),this.onRenderScrollSet(i.getSaved())},scrollSaver:i}}performHistoryResult(e,t){var i;return gs(this,void 0,void 0,(function*(){let s=e.history;s=s.slice(),this.needReflowScroll&&(Ee(this.scrollable.container),this.needReflowScroll=!1);const n=yield Promise.all(s.map((e=>"number"==typeof e?this.chat.getMessage(e):e))),a=[];if(!this.scrollable.loadedAll.bottom||!this.scrollable.loadedAll.top){let t=e.isEnd;if(!t){const e=yield this.chat.getHistoryStorage(),i=e.history.first,n=e.history.last;t={top:!1,bottom:!1,both:!1},!i.isEnd(ge.D.Bottom)||i.length&&!s.includes(i[0])||(t.bottom=!0),!n.isEnd(ge.D.Top)||n.length&&!s.includes(n[n.length-1])||(t.top=!0)}if(!t.bottom&&this.setPeerOptions){const{lastMsgId:e,topMessage:i,savedPosition:s}=this.setPeerOptions;this.setPeerOptions=void 0,(!e&&!s||this.bubbles[i]||e===i)&&(t.bottom=!0)}t.top&&a.push(this.setLoaded("top",!0)),t.bottom&&a.push(this.setLoaded("bottom",!0))}yield Promise.all(a);const o=n.map((e=>e?e.pFlags.local?this.processLocalMessageRender(e):this.safeRenderMessage(e,t):void 0));yield Promise.all(o),yield this.messagesQueuePromise,this.scrollable.loadedAll.top&&this.messagesQueueOnRenderAdditional&&(this.messagesQueueOnRenderAdditional(),null===(i=this.messagesQueueOnRenderAdditional)||void 0===i||i.call(this))}))}onRenderScrollSet(e){const t="has-sticky-dates";if(this.container.classList.contains(t)||this.preloader.detached&&(null!=e||(e={scrollHeight:this.scrollable.scrollHeight,clientHeight:this.scrollable.container.clientHeight}),e.scrollHeight===e.clientHeight))this.willScrollOnLoad=void 0;else{const e=this.getMiddleware(),i=()=>{e()&&this.container.classList.add(t)};this.willScrollOnLoad?i():setTimeout(i,600)}}requestHistory(e,t,i){return"chat"===this.chat.type||"discussion"===this.chat.type?this.managers.acknowledged.appMessagesManager.getHistory(this.peerId,e,t,i,this.chat.threadId):"pinned"===this.chat.type?this.managers.acknowledged.appMessagesManager.getSearch({peerId:this.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:t,backLimit:i}).then((e=>({cached:e.cached,result:Promise.resolve(e.result).then((e=>({history:e.history.map((e=>e.mid))})))}))):"scheduled"===this.chat.type?this.managers.acknowledged.appMessagesManager.getScheduledMessages(this.peerId).then((e=>({cached:e.cached,result:Promise.resolve(e.result).then((e=>({history:e.slice().reverse()})))}))):void 0}animateAsLadder(e,t,i,s,n){return gs(this,void 0,void 0,(function*(){const a=this.log.bindPrefix("ladder");if(this.chat.setPeerPromise&&!this.resolveLadderAnimation)return a.warn("will be delayed"),void(this.resolveLadderAnimation=this.animateAsLadder.bind(this,e,t,i,s,n));if(!Object.keys(this.bubbles).length)return void a.warn("no bubbles");let o,r=(0,ot.Z)(this.bubbles,"desc");i&&t.length&&(r=r.filter((e=>!t.includes(e)))),o=s?n||Math.max(...r):e||Math.max(...r);const d=r.slice(r.findIndex((e=>o>e))),l=i?[]:[o],c=i?[]:r.slice(0,r.findIndex((e=>o>=e))).reverse();me.ZP&&a("targeting mid:",o,n,e,d.map((e=>(0,bt.Z)(e))),c.map((e=>(0,bt.Z)(e))));const h=[];this.chatInner.classList.add("zoom-fading");const u=i?10:40,p=i?0:1,f=(e,t=0)=>{const i=(0,fe.Z)();let s=0;return e.forEach(((n,o)=>{const r=this.bubbles[n];if(!r||this.skippedMids.has(n))return void a.warn("no bubble by mid:",n);s=(o+t||.1)*u;const d=r.lastElementChild,l=[d],c=this.bubbleGroups.getItemByBubble(r);if(c&&c.group.avatar&&c.group.lastItem===c&&l.push(c.group.avatar),l.forEach((e=>{e.classList.add("zoom-fade","can-zoom-fade"),e.style.transitionDelay=s+"ms"})),o===e.length-1){const e=t=>{t.target===d&&(i.resolve(),d.removeEventListener("transitionend",e))};d.addEventListener("transitionend",e)}h.push(...l)})),e.length||i.resolve(),{lastMsDelay:s,animationPromise:i}},m=f(d,p),g=f(l),v=f(c,p),b=[m.animationPromise,g.animationPromise,v.animationPromise],y=[m.lastMsDelay,g.lastMsDelay,v.lastMsDelay];let w;return this.onAnimateLadder&&(yield this.onAnimateLadder()),(0,pe.T2)((()=>{this.setStickyDateManually(),h.forEach((e=>{e.classList.remove("zoom-fade")}))})),(d.length||l.length||c.length)&&(w=Promise.all(b),(0,ue.YW)(w,Math.max(...y)+200).then((()=>{(0,pe.T2)((()=>{h.forEach((e=>{e.style.transitionDelay="",e.classList.remove("can-zoom-fade")})),this.chatInner.classList.remove("zoom-fading")}))}))),w}))}renderEmptyPlaceholder(e,t,i,s){return gs(this,void 0,void 0,(function*(){const i="empty-bubble-placeholder";let n,a;if(t.classList.add(i,i+"-"+e),"group"===e?n=(0,C.ag)("GroupEmptyTitle1"):"saved"===e?n=(0,C.ag)("ChatYourSelfTitle"):"noMessages"===e||"greeting"===e?n=(0,C.ag)("NoMessages"):"noScheduledMessages"===e?n=(0,C.ag)("NoScheduledMessages"):"restricted"===e&&(n=document.createElement("span"),n.innerText=yield this.managers.appPeersManager.getRestrictionReasonText(this.peerId)),n.classList.add("center",i+"-title"),s.push(n),"group"===e)s.push((0,C.ag)("GroupEmptyTitle2")),a=[(0,C.ag)("GroupDescription1"),(0,C.ag)("GroupDescription2"),(0,C.ag)("GroupDescription3"),(0,C.ag)("GroupDescription4")];else if("saved"===e)a=[(0,C.ag)("ChatYourSelfDescription1"),(0,C.ag)("ChatYourSelfDescription2"),(0,C.ag)("ChatYourSelfDescription3"),(0,C.ag)("ChatYourSelfDescription4")];else if("greeting"===e){const e=(0,C.ag)("NoMessagesGreetingsDescription");e.classList.add("center",i+"-subtitle");const t=document.createElement("div");t.classList.add(i+"-sticker");const n=this.getMiddleware();yield this.managers.appStickersManager.getGreetingSticker().then((e=>gs(this,void 0,void 0,(function*(){if(!n())return;const i=[];return yield(0,K.ZP)({doc:e,div:t,middleware:n,lazyLoadQueue:this.lazyLoadQueue,group:this.chat.animationGroup,play:!0,loop:!0,withThumb:!0,loadPromises:i}),(0,S.fc)(t,(e=>{(0,Ce.Z)(e),It.Jo.onMediaClick({target:e.target})})),Promise.all(i)})))),s.push(e,t)}a&&(s.push(...a.map((e=>{const t=document.createElement("span");return t.classList.add(i+"-list-item"),t.append(e),t}))),"group"===e?a.forEach((e=>{const t=document.createElement("span");t.classList.add("tgico-check"),e.prepend(t)})):"saved"===e&&a.forEach((e=>{const t=document.createElement("span");t.classList.add(i+"-list-bullet"),t.innerText="•",e.prepend(t)}))),s.length>1&&t.classList.add("has-description"),s.forEach((e=>e.classList.add(i+"-line")))}))}processLocalMessageRender(e,t,i=this.getMiddleware()){return gs(this,void 0,void 0,(function*(){const s=!!e.pFlags.sponsored,n=(0,Et.Z)(i);return this.safeRenderMessage(e,!s,void 0,!1,(i=>gs(this,void 0,void 0,(function*(){const{bubble:a}=yield n(i);if(!a)return i;a.message=e,a.classList.add("is-group-last","is-group-first");const o=()=>{this.updatePlaceholderPosition===o&&(this.updatePlaceholderPosition=void 0),u[p](a)};s||(a.classList.add("bubble-first"),a.classList.remove("can-have-tail","is-in"));const r=[],l=this.chat.isBot;let c,u=this.container,p="append";if(this.chat.isRestricted)c=this.renderEmptyPlaceholder("restricted",a,e,r);else if(s){let i,s,n,o;a.classList.add("avoid-selection"),a.style.order="999999";const r=this.sponsoredMessage=e.sponsoredMessage,d=(0,D.Z)(r.from_id);r.channel_post?(i="OpenChannelPost",s=(0,yt.Z)(r.channel_post)):r.start_param||l?(i="Chat.Message.ViewBot",n=r.start_param):i=(yield this.managers.appPeersManager.isAnyGroup(d))?"Chat.Message.ViewGroup":"Chat.Message.ViewChannel",o=r.chat_invite?()=>{new Ge(r.chat_invite_hash,r.chat_invite)}:r.chat_invite_hash?()=>{const e={_:Te.JOIN_CHAT,invite:r.chat_invite_hash};this.chat.appImManager.processInternalLink(e)}:()=>{this.chat.appImManager.setInnerPeer({peerId:d,lastMsgId:s,startParam:n})};const c=this.makeViewButton({text:i});this.observer.observe(c,this.viewsObserverCallback),o&&(0,S.fc)(c,o),a.querySelector(".bubble-content").prepend(c),u=this.chatInner,p="append",t=!1}else if(l&&"message"===e._){const e=document.createElement("b");e.append((0,C.ag)("BotInfoTitle")),r.push(e,"\n\n"),u=this.chatInner,p="prepend"}else c=this.chat.isAnyGroup&&(yield n(this.managers.appPeersManager.getPeer(this.peerId))).pFlags.creator?this.renderEmptyPlaceholder("group",a,e,r):"scheduled"===this.chat.type?this.renderEmptyPlaceholder("noScheduledMessages",a,e,r):d.Z.myId===this.peerId?this.renderEmptyPlaceholder("saved",a,e,r):this.peerId.isUser()&&!l&&(yield n(this.chat.canSend()))&&"chat"===this.chat.type?this.renderEmptyPlaceholder("greeting",a,e,r):this.renderEmptyPlaceholder("noMessages",a,e,r);c&&(yield c),r.length&&a.querySelector(".message, .service-msg").prepend(...r);const f=!!this.messagesQueueOnRenderAdditional,m=this.setPeerCached&&!f;if(m){const e=a.firstElementChild;e.classList.add("no-transition"),this.chat.setPeerPromise&&this.chat.setPeerPromise.catch(Qe.Z).finally((()=>{e.classList.remove("no-transition")}))}if(void 0!==t||m||(t=!0),f||t?(this.updatePlaceholderPosition=o,this.onAnimateLadder=()=>{if(this.onAnimateLadder=void 0,!this.messagesQueuePromise)return(0,pe.AD)()}):this.chat.setPeerPromise?this.attachPlaceholderOnRender=()=>{this.attachPlaceholderOnRender=void 0,o()}:this.updatePlaceholderPosition=o,!f&&t){yield n((0,ue.e9)());const t=(0,ot.Z)(this.bubbles);(0,h.Z)(t,e.mid),this.animateAsLadder(e.mid,t,!1,0,0)}return a.middlewareHelper.onDestroy((()=>{this.emptyPlaceholderBubble===a&&(this.emptyPlaceholderBubble=void 0)})),this.emptyPlaceholderBubble=a,i}))))}))}makeViewButton(e){return(0,Ue.Z)("btn-primary btn-primary-transparent bubble-view-button",e)}generateLocalMessageId(e=0){const t=("scheduled"===this.chat.type?-1:0)+e,i=-Math.abs(t);return{id:i,mid:-Math.abs((0,yt.Z)(i))}}generateLocalFirstMessage(e,t,i=0){return gs(this,void 0,void 0,(function*(){const{id:s,mid:n}=this.generateLocalMessageId(i);let a={_:e?"messageService":"message",date:0,id:s,mid:n,peer_id:yield this.managers.appPeersManager.getOutputPeer(this.peerId),pFlags:{local:!0}};return e||(a.message=""),(0,Pe.Z)(a),t&&t(a),a=(yield this.managers.appMessagesManager.saveMessages([a],{storage:new Map}))[0],a.mid=n,a}))}getViewportSlice(){return(0,rt.Z)({overflowElement:this.scrollable.container,selector:".bubbles-date-group .bubble:not(.is-date)",extraSize:2*Math.max(700,xe.Z.height)})}deleteViewportSlice(e,t){const{invisibleTop:i,invisibleBottom:s}=e,n=i.concat(s);if(!n.length)return;i.length&&(this.setLoaded("top",!1),this.getHistoryTopPromise=void 0),s.length&&(this.setLoaded("bottom",!1),this.getHistoryBottomPromise=void 0);const a=n.map((({element:e})=>+e.dataset.mid));let o;t||(o=this.createScrollSaver(!!i.length),o.save()),this.deleteMessagesByIds(a,!1,!0),o?o.restore():i.length&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop)}sliceViewport(e){if(T.IS_SAFARI||this.isHeavyAnimationInProgress&&!e)return;const t=this.getViewportSlice();this.deleteViewportSlice(t)}setLoaded(e,t,i=!0){return gs(this,void 0,void 0,(function*(){if(this.scrollable.loadedAll[e]!==t)return this.log.bindPrefix("setLoaded")("change",e,t),this.scrollable.loadedAll[e]=t,this.scrollable.onScroll(),i?!this.chat.isRestricted&&("bottom"===e&&this.chat.isBroadcast&&this.toggleSponsoredMessage(t),"top"===e&&t&&this.chat.isBot)?this.renderBotPlaceholder():this.checkIfEmptyPlaceholderNeeded():void 0}))}toggleSponsoredMessage(e){return gs(this,void 0,void 0,(function*(){const t=this.log.bindPrefix("sponsored");t("checking");const{mid:i}=this.generateLocalMessageId(1);if(e){const e=this.getMiddleware((()=>this.scrollable.loadedAll.bottom&&this.getSponsoredMessagePromise===i)),i=this.getSponsoredMessagePromise=this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId()).then((i=>gs(this,void 0,void 0,(function*(){if(!e()||"messages.sponsoredMessagesEmpty"===i._)return;const s=i.messages[0];if(!s)return void t("no message");const n=this.generateLocalFirstMessage(!1,(e=>{e.message=s.message,e.from_id=s.from_id,e.entities=s.entities,e.pFlags.sponsored=!0,e.sponsoredMessage=s}),1);return Promise.all([n,this.getHistoryTopPromise,this.messagesQueuePromise]).then((([i])=>{if(e())return t("rendering",i),this.performHistoryResult({history:[i]},!1)}))})))).finally((()=>{this.getSponsoredMessagePromise===i&&(this.getSponsoredMessagePromise=void 0)}))}else t("clearing rendered",i),this.getSponsoredMessagePromise=void 0,this.deleteMessagesByIds([i])}))}renderBotPlaceholder(){return gs(this,void 0,void 0,(function*(){const e=this.log.bindPrefix("bot placeholder"),t=this.getMiddleware(),i=yield this.managers.acknowledged.appProfileManager.getProfile(this.peerId.toUserId());e("getting profile, cached:",i.cached);const s=i.result.then((s=>gs(this,void 0,void 0,(function*(){var n;if(!t())return;if(!(null===(n=s.bot_info)||void 0===n?void 0:n.description))return e.warn("no description"),this.checkIfEmptyPlaceholderNeeded();const a=yield this.generateLocalFirstMessage(!1,(e=>{const t=s.bot_info;e.message=t.description,t.description_document&&(e.media={_:"messageMediaDocument",document:t.description_document,pFlags:{}}),t.description_photo&&(e.media={_:"messageMediaPhoto",photo:t.description_photo,pFlags:{}})}));return t()?(e("rendering"),{renderPromise:this.processLocalMessageRender(a,!i.cached).then((()=>{e("done")}))}):void 0}))));if(i.cached)return s}))}checkIfEmptyPlaceholderNeeded(){return gs(this,void 0,void 0,(function*(){if(this.scrollable.loadedAll.top&&this.scrollable.loadedAll.bottom&&void 0===this.emptyPlaceholderBubble&&(this.chat.isRestricted||!(yield this.chat.getHistoryStorage()).count||Object.keys(this.bubbles).length&&!this.getRenderedLength()||"scheduled"===this.chat.type&&!Object.keys(this.bubbles).length)){this.log("inject empty peer placeholder");const e=yield this.generateLocalFirstMessage(!0);return{renderPromise:this.processLocalMessageRender(e)}}}))}getHistory1(e,t,i,s,n){const a=this.getMiddleware(n?void 0:()=>(t?this.getHistoryTopPromise:this.getHistoryBottomPromise)===r),o=this.getHistory(e,t,i,s,n,a),r=o.then((e=>e&&(e.waitPromise||e.promise)));return t?this.getHistoryTopPromise=r:this.getHistoryBottomPromise=r,r.then((()=>{a()&&(t?this.getHistoryTopPromise=void 0:this.getHistoryBottomPromise=void 0,n||"chat"===this.chat.type&&setTimeout((()=>{t?this.loadMoreHistory(!0,!0):this.loadMoreHistory(!1,!0)}),0))})),o}getHistory(e=0,t=!1,i=!1,s=0,n=!1,a){return gs(this,void 0,void 0,(function*(){const o=this.peerId,r=this.chat.isBroadcast,l=Math.min(30,xe.Z.height/40|0);let c=r?20:Object.keys(this.bubbles).length>0?Math.max(35,l):l;if(void 0!==ws){if(!ws)return{cached:!1,promise:Promise.resolve(),waitPromise:Promise.resolve()};Object.keys(this.bubbles).length>0&&--ws}let h,u=0;if(i&&(u=c,t||(c=0)),s&&!i)if("pinned"===this.chat.type)h=[s];else{const t=(yield this.chat.getHistoryStorage()).history.slice;if(t.length=0;--e){const t=yield this.chat.getMessage(h[e]);if(!(null==t?void 0:t.grouped_id))break;h.splice(e,1)}e=h[h.length-1]||e}}let p,f=yield this.requestHistory(e,c,u);this.log("i vin brehnya",f,e,c,u);const m=(null==h?void 0:h.length)&&!f.cached,g=this.isFirstLoad&&u&&!f.cached||m;m&&(p=f.result,f={cached:!0,result:Promise.resolve({history:h})}),this.isFirstLoad=!1;const v=e=>gs(this,void 0,void 0,(function*(){var t;if(null===(t=e.isEnd)||void 0===t?void 0:t.top){if("discussion"===this.chat.type){const t=yield this.managers.appMessagesManager.getThreadServiceMessageId(this.peerId,this.chat.threadId);t&&e.history.push(t);const i=yield this.chat.getMidsByMid(this.chat.threadId);e.history.push(...i.reverse())}yield this.managers.appProfileManager.getProfileByPeerId(o)}})),b=e=>(0,ue.e9)().then((()=>v(e))).then((()=>(!m&&s&&e.history.unshift(s),this.performHistoryResult(e,t)))),y=e=>{const t=Promise.resolve(e).then((e=>{if(a&&!a())throw Ls;if(!n)return b(e);this.scrollable.onScroll()}),(e=>{throw this.log.error("getHistory error:",e),e}));return t};let w,S;if(f.cached){if(n)return this.scrollable.onScroll(),null;S=!0,w=b(yield f.result)}else S=!1,w=y(f.result);const C=m?y(p):w;if(g&&d.Z.settings.animationsEnabled){let i=m?2:1;this.messagesQueueOnRenderAdditional=()=>{this.log("messagesQueueOnRenderAdditional"),--i||(this.messagesQueueOnRenderAdditional=void 0,this.animateAsLadder(s,h,m,u,e).then((()=>{setTimeout((()=>{this.loadMoreHistory(t,!0)}),0)})))}}else this.messagesQueueOnRenderAdditional=void 0;return n?null:{cached:S,promise:w,waitPromise:C}}))}setUnreadDelimiter(){return gs(this,void 0,void 0,(function*(){if("chat"!==this.chat.type&&"discussion"!==this.chat.type)return;if(this.attachedUnreadBubble)return;const e=yield this.chat.getHistoryMaxId();let t=yield this.managers.appMessagesManager.getReadMaxIdIfUnread(this.peerId,this.chat.threadId);if(t&&(t=Object.keys(this.bubbles).filter((e=>!this.bubbles[e].classList.contains("is-out"))).map((e=>+e)).sort(((e,t)=>e-t)).find((e=>e>t)),t&&this.bubbles[t])){const i=this.bubbles[t];this.firstUnreadBubble&&this.firstUnreadBubble!==i&&(this.firstUnreadBubble.classList.remove("is-first-unread"),this.firstUnreadBubble=null),t!==e&&i.classList.add("is-first-unread"),this.firstUnreadBubble=i,this.attachedUnreadBubble=!0}}))}deleteEmptyDateGroups(){const e=this.stickyIntersector?Cs:1;let t=!1;for(const i in this.dateMessages){const s=this.dateMessages[i];s.container.childElementCount===e&&(s.container.remove(),this.stickyIntersector&&this.stickyIntersector.unobserve(s.container,s.div),delete this.dateMessages[i],t=!0)}t&&(Object.keys(this.dateMessages).length||this.container.classList.remove("has-groups"),this.checkIfEmptyPlaceholderNeeded(),this.setStickyDateManually())}}function Zs(){const e=document.createElementNS("http://www.w3.org/2000/svg","svg");e.setAttributeNS(null,"viewBox","0 0 11 20"),e.setAttributeNS(null,"width","11"),e.setAttributeNS(null,"height","20"),e.classList.add("bubble-tail");const t=document.createElementNS("http://www.w3.org/2000/svg","use");return t.setAttributeNS(null,"href","#message-tail-filled"),e.append(t),e}var ks=i(3003),Ts=i(5128),xs=i(8127);class As{constructor(e,t,i,s){this.peerId=e,this.mid=t,this.unpin=i,this.onConfirm=s,this.construct()}construct(){return e=this,t=void 0,s=function*(){const{peerId:e,mid:t,unpin:i,onConfirm:s}=this;let n,a,o;const r=[],l=[],c=w.Z.MANAGERS,h=yield c.appPeersManager.canPinMessage(e),u=(n,a,o)=>{setTimeout((()=>{let n;n=i&&!t?h?c.appMessagesManager.unpinAllMessages(e):c.appMessagesManager.hidePinnedMessages(e):c.appMessagesManager.updatePinnedMessage(e,t,i,o,a),s&&n.then(s)}),300)};if(i){let i="UnpinMessage";t?(n="UnpinMessageAlertTitle",a="Chat.Confirm.Unpin"):h?(n="Popup.Unpin.AllTitle",a="Chat.UnpinAllMessagesConfirmation",o=[""+((yield c.appMessagesManager.getPinnedMessagesCount(e))||1)]):(n="Popup.Unpin.HideTitle",a="Popup.Unpin.HideDescription",i="Popup.Unpin.Hide"),r.push({langKey:i,isDanger:!0,callback:u})}else{n="PinMessageAlertTitle";const t="PinMessage";e.isAnyChat()?(r.push({langKey:t,callback:e=>u(0,!1,!e.size)}),(yield c.appChatsManager.isBroadcast(e.toChatId()))?a="PinMessageAlertChannel":(a="PinMessageAlert",l.push({text:"PinNotify",checked:!0}))):(a="PinMessageAlertChat",e===d.Z.myId?r.push({langKey:t,callback:u}):(r.push({langKey:t,callback:e=>u(0,!e.size)}),l.push({text:"PinAlsoFor",textArgs:[yield(0,Vt.Z)({peerId:e})],checked:!0})))}(0,w.x)(r),new xs.Z("popup-delete-chat",{peerId:e,titleLangKey:n,descriptionLangKey:a,descriptionLangArgs:o,buttons:r,checkboxes:l}).show()},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var _s=i(1962);function Fs(e=window.getSelection()){if(!(null==e?void 0:e.rangeCount))return!0;const t=e.getRangeAt(0);return!(!t.collapsed&&t.START_TO_END)}var Ds=i(2312),Rs=i(1447),Bs=i(671),Ns=i(3174);function Os(e,t,i){return d.Z.managers.appStickersManager.preloadAnimatedEmojiSticker(e).then((({doc:s})=>{if(s)return Ds.Z.downloadMedia({media:s}).then((n=>{return a=this,r=void 0,l=function*(){const a=o.Z.active.emojiSticker,r=(0,Bs.tB)(e),d=yield Rs.Z.loadAnimationWorker({container:void 0,animationData:n,width:null!=t?t:a.width,height:null!=i?i:a.height,name:"doc"+s.id,autoplay:!1,loop:!1,toneIndex:r},"none");d.addEventListener("firstFrame",(()=>{(0,Ns.O)(s,d.canvas[0],r),d.remove()}),{once:!0})},new((d=void 0)||(d=Promise))((function(e,t){function i(e){try{n(l.next(e))}catch(e){t(e)}}function s(e){try{n(l.throw(e))}catch(e){t(e)}}function n(t){var n;t.done?e(t.value):(n=t.value,n instanceof d?n:new d((function(e){e(n)}))).then(i,s)}n((l=l.apply(a,r||[])).next())}));var a,r,d,l}))}))}var Us=i(5772);class Hs extends xs.Z{constructor(e,t,i,s){super("popup-report-messages-confirm",{noTitle:!0,descriptionLangKey:"ReportInfo",buttons:[{langKey:"ReportChat",callback:()=>{a.isValid()&&(s&&s(),this.managers.appMessagesManager.reportMessages(e,t,i,a.value).then((e=>{e&&(0,ye.bC)({langPackKey:"ReportSentInfo"})})))}}],body:!0});const n=document.createElement("div");(0,Us.Z)({div:n,emoji:Hs.STICKER_EMOJI,width:100,height:100}).then((({render:e})=>e)).finally((()=>{this.show()})),this.header.append(n);const a=new L.ZP({label:"ReportHint",maxLength:512,placeholder:"ReportChatDescription"});a.input.addEventListener("input",(()=>{this.buttons[0].element.toggleAttribute("disabled",!a.isValid())})),this.body.append(a.container)}}Hs.STICKER_EMOJI="👮‍♀️";class zs extends xs.Z{constructor(e,t,i){super("popup-report-messages",{titleLangKey:"ChatTitle.ReportMessages",buttons:[],body:!0}),t=t.slice();const s=[["ReportChatSpam","inputReportReasonSpam"],["ReportChatViolence","inputReportReasonViolence"],["ReportChatChild","inputReportReasonChildAbuse"],["ReportChatPornography","inputReportReasonPornography"],["ReportChatOther","inputReportReasonOther"],["ReportChatPersonalDetails","inputReportReasonPersonalDetails"],["ReportChatIllegalDrugs","inputReportReasonIllegalDrugs"]];s.forEach((e=>{const t=(0,Ue.Z)("btn-primary btn-transparent",{text:e[0]});this.body.append(t)}));const n=Os(Hs.STICKER_EMOJI);(0,S.fc)(this.body,(a=>{const o=(0,ve.Z)(a.target,"btn-primary"),r=s[(0,Ie.Z)(o)][1];n.then((()=>{this.hide(),new Hs(e,t,r,i)}))}),{listenerSetter:this.listenerSetter}),this.buttonsEl.style.marginTop=".5rem",this.show()}}class js extends xs.Z{constructor(){super("popup-sponsored",{titleLangKey:"Chat.Message.Sponsored.What",descriptionLangKey:"Chat.Message.Ad.Text",descriptionLangArgs:[(0,C.ag)("Chat.Message.Sponsored.Link")],buttons:[{langKey:"OK",isCancel:!0},{langKey:"Chat.Message.Ad.ReadMore",callback:()=>{window.open(C.ZP.format("Chat.Message.Sponsored.Link",!0))},isCancel:!0}],scrollable:!0}),this.scrollable.append(this.description),this.show()}}var Gs=i(6008),Vs=i(8936),Ks=i(3061),Ws=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class $s extends w.Z{constructor(e){super("popup-reacted-list",{closable:!0,overlayClosable:!0,body:!0}),this.message=e,this.init()}init(){return Ws(this,void 0,void 0,(function*(){const e=this.middlewareHelper.get(),t=yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message);if(!e())return;const i=yield this.managers.appMessagesManager.canViewMessageReadParticipants(t);if(!e())return;const s=new st,n=Object.assign(Object.assign({},t),{mid:0,id:0,reactions:Object.assign(Object.assign({_:"messageReactions",results:[]},t.reactions),{pFlags:{},recent_reactions:[]})});n.reactions.results=n.reactions.results.map((e=>Object.assign(Object.assign({},e),{chosen_order:void 0,pFlags:{}}))),s.init(n,"block",this.middlewareHelper.get()),s.render(),s.classList.add("no-stripe"),s.classList.remove("has-no-reactions"),s.append(this.btnClose),this.header.append(s);const a=document.createElement("div");a.classList.add("tabs-container"),a.dataset.animation="tabs";const o=new Map;let r=!1;if(n.reactions.results.length){const e=this.createFakeReaction("reactions",n.reactions.results.reduce(((e,t)=>e+t.count),0));s.prepend(e),n.reactions.results.unshift(e.reactionCount),r=!0}let d=!1;if(i)try{const i=yield this.managers.appMessagesManager.getMessageReadParticipants(t.peerId,t.mid);if(!e())return;if(!i.length)throw"";const a=this.createFakeReaction("checks",i.length);s.prepend(a),n.reactions.results.unshift(a.reactionCount),d=!0}catch(e){}n.reactions.results.forEach((i=>{const s=new Z.ZP(void 0);s.container.classList.add("tabs-tab");const n=new Ei.Z({noShadow:!0,noDelimiter:!0}),r=Ji.default.createChatList({dialogSize:72});Ji.default.setListClickListener(r,(()=>{this.hide()}),void 0,!1,!0),n.content.append(r),s.container.append(n.container);const d="checks"!==i.reaction,l="checks"===i.reaction;["checks","reactions"].includes(i.reaction)&&(i.reaction=void 0);const c=(0,qe.C)(24,24);let h;const u=new Vs.Z({scrollable:s,getPromise:()=>Ws(this,void 0,void 0,(function*(){const s=yield this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(t,void 0,i.reaction,h,d,l);return h=s.nextOffset,yield Promise.all(s.combined.map((({peerId:t,reaction:i})=>Ws(this,void 0,void 0,(function*(){const{dom:s}=Ji.default.addDialogNew({peerId:t,autonomous:!0,container:r,avatarSize:"abitbigger",rippleEnabled:!1,meAsSaved:!1});if(i){const t=document.createElement("div");if(t.classList.add("reacted-list-reaction-icon"),"reactionEmoji"===i._){const s=yield this.managers.appReactionsManager.getReactionCached(i.emoticon);(0,K.ZP)({doc:s.static_icon,div:t,width:24,height:24,middleware:e})}else"reactionCustomEmoji"===i._&&t.append((0,We.Z)({docIds:[i.document_id],customEmojiSize:c,middleware:e}));s.listEl.append(t)}(0,U.Z)(s.lastMessageSpan,(0,Ks.Z)(yield this.managers.appUsersManager.getUser(t.toUserId())))}))))),!h}))});o.set(s.container,u),a.append(s.container)})),this.body.append(a);const l=(0,Gs.X)(s,a,((e,t)=>{if(e===s.childElementCount-1)return!1;const i=s.children[e],n=l.prevId();-1!==n&&s.children[n].setIsChosen(!1),i.setIsChosen(!0),o.get(t).load()}),void 0,void 0,void 0,this.listenerSetter);l(0,!1),this.show()}))}createFakeReaction(e,t){const i=new Je;i.init("block",this.middlewareHelper.get()),i.reactionCount={_:"reactionCount",count:t,reaction:e},i.setCanRenderAvatars(!1),i.renderCounter();const s=document.createElement("div");return s.classList.add("reaction-counter","reaction-sticker-icon","tgico-"+e),i.prepend(s),i}}const qs="btn-menu-reactions",Qs=qs+"-reaction",Ys=!T.IS_SAFARI;class Xs{constructor(e,t,i){this.managers=e,this.type=t,this.onScroll=()=>{this.reactionsMap.forEach(((e,t)=>{this.onScrollProcessItem(t,e)}))},this.onMouseMove=e=>{var t;const i=(0,ve.Z)(e.target,Qs);if(!i)return;const s=this.reactionsMap.get(i);if(!s)return;if(!(null===(t=s.appear)||void 0===t?void 0:t.paused))return;const n=s.select;n&&n.paused&&(n.autoplay=!0,n.restart())};const n=this.widthContainer=document.createElement("div");n.classList.add(qs+"-container"),n.classList.add(qs+"-container-"+t);const a=this.container=document.createElement("div");a.classList.add(qs);const o=this.scrollable="vertical"===t?new Z.ZP(void 0):new Z.v7(void 0);a.append(o.container),o.onAdditionalScroll=this.onScroll,o.setListeners(),o.container.classList.add("no-scrollbar"),this.reactionsMap=new Map,this.animationGroup=`CHAT-MENU-REACTIONS-${Date.now()}`,s.Z.setOverrideIdleGroup(this.animationGroup,!0),c.Z||a.addEventListener("mousemove",this.onMouseMove),(0,S.fc)(a,(e=>{const t=(0,ve.Z)(e.target,Qs);if(!t)return;const i=this.reactionsMap.get(t);i&&this.managers.appReactionsManager.sendReaction(this.message,i.reaction)})),n.append(a),this.middleware=null!=i?i:(0,Se.k)()}init(e){this.message=e;const t=this.middleware.get(),i=this.managers.appReactionsManager.getAvailableReactionsByMessage(e);(0,Ke.Z)(i,(e=>{if(!t()||!e.length)return;e.forEach((e=>{e.pFlags.premium&&!d.Z.premium||this.renderReaction(e)}));const s=()=>{this.container.classList.add("is-visible")};i instanceof Promise?(0,pe.T2)(s):s()}))}cleanup(){this.middleware.clean(),this.scrollable.removeListeners(),this.reactionsMap.clear(),s.Z.setOverrideIdleGroup(this.animationGroup,!1),s.Z.checkAnimations(!0,this.animationGroup,!0)}canUseAnimations(){return d.Z.settings.animationsEnabled&&!T.IS_MOBILE}renderReaction(e){const t=document.createElement("div");t.classList.add(Qs);const i=document.createElement("div");i.classList.add(Qs+"-scale");const s=document.createElement("div");let n;s.classList.add(Qs+"-appear"),this.canUseAnimations()&&(n=document.createElement("div"),n.classList.add(Qs+"-select","hide"));const a={selectWrapper:n,appearWrapper:s,reaction:{_:"reactionEmoji",emoticon:e.reaction}};this.reactionsMap.set(t,a);const o=this.middleware.get(),r=26*(c.Z?1:1.25),d={width:r,height:r,skipRatio:1,needFadeIn:!1,withThumb:!1,group:this.animationGroup,middleware:o};if(this.canUseAnimations()){let t=!0;(0,K.ZP)(Object.assign({doc:e.appear_animation,div:s,play:!0},d)).then((({render:e})=>e)).then((e=>{(0,Pe.Z)(e),a.appear=e,e.addEventListener("enterFrame",(o=>{e.maxFrame===o&&i.then((e=>{(0,Pe.Z)(e),s.classList.add("hide"),n.classList.remove("hide"),t&&(a.select=e,t=!1)}),Qe.Z)}))}),Qe.Z);const i=(0,K.ZP)(Object.assign({doc:e.select_animation,div:n},d)).then((({render:e})=>e)).then((e=>((0,Pe.Z)(e),Rs.Z.waitForFirstFrame(e)))).catch(Qe.Z)}else delete d.needFadeIn,delete d.withThumb,(0,K.ZP)(Object.assign({doc:e.static_icon,div:s},d));i.append(s),n&&i.append(n),t.append(i),this.scrollable.append(t)}onScrollProcessItem(e,t){const i=e.firstElementChild,s=(0,He.Z)(e,this.scrollable.container);let n;if(s)if(s.overflow.left||s.overflow.right){const e=Math.abs(s.rect.left-s.rect.right);n="scale("+Math.min(Math.pow(e,2)/Math.pow(34,2),1)+")"}else n="";else{if(!t.appearWrapper.classList.contains("hide")||!t.appear)return;t.select&&t.select.stop(),t.appear.stop(),t.appear.autoplay=!0,t.appearWrapper.classList.remove("hide"),t.selectWrapper.classList.add("hide"),n=""}Ys&&(i.style.transform=n)}}var Js=i(1483),en=i(2353),tn=i(6690),sn=i(3709),nn=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class an{constructor(e,t){this.chat=e,this.managers=t,this.onContextMenu=e=>{let t,i;try{i=(0,ve.Z)(e.target,"bubble-content-wrapper"),t=i?i.parentElement:(0,ve.Z)(e.target,"bubble")}catch(e){}if(!t||t.classList.contains("bubble-first"))return;let s=this.element;if((e instanceof MouseEvent||e.hasOwnProperty("preventDefault"))&&e.preventDefault(),s&&s.classList.contains("active"))return!1;(e instanceof MouseEvent||e.hasOwnProperty("cancelBubble"))&&(e.cancelBubble=!0);let n=+t.dataset.mid;n&&(()=>{nn(this,void 0,void 0,(function*(){const a=this.isSponsored=n<0;this.isSelectable=this.chat.selection.canSelectBubble(t),this.peerId=this.chat.peerId,this.target=e.target,this.isTextSelected=!Fs(),this.isAnchorTarget="A"===this.target.tagName&&("_blank"===this.target.target||this.target.classList.contains("anchor-url")),this.isUsernameTarget="A"===this.target.tagName&&this.target.classList.contains("mention");const o=yield this.chat.getMidsByMid(n);if(this.chat.selection.isSelecting&&!i){if(a)return;if(o.length>1){const e=this.chat.selection.isMidSelected(this.peerId,n)?n:o.find((e=>this.chat.selection.isMidSelected(this.peerId,e)));e&&(n=e)}}this.isOverBubble=!!i;const r=(0,ve.Z)(this.target,"grouped-item");this.isTargetAGroupedItem=!!r,this.mid=r?+r.dataset.mid:n,this.isSelected=this.chat.selection.isMidSelected(this.peerId,this.mid),this.message=t.message||(yield this.chat.getMessage(this.mid)),this.albumMessages=this.message.grouped_id?yield this.managers.appMessagesManager.getMessagesByAlbum(this.message.grouped_id):void 0,this.noForwards=!a&&!(yield this.managers.appMessagesManager.canForward(this.message)),this.viewerPeerId=void 0,this.canOpenReactedList=void 0,this.linkToMessage=yield this.getUrlToMessage(),this.selectedMessagesText=yield this.getSelectedMessagesText();const d=yield this.init();if(!d)return;s=d.element;const{cleanup:l,destroy:c,menuPadding:h,reactionsMenu:u,reactionsMenuPosition:p}=d;let f=!1;if(u){const e="is-visible";if(f=u.container.classList.contains(e),f&&u.container.classList.remove(e),"horizontal"===p){const e=s.offsetWidth,t=(e-8)/34%1,i=.65;if(t{u&&u.container.classList.remove("is-visible"),this.mid=0,this.peerId=void 0,this.target=null,this.viewerPeerId=void 0,this.canOpenReactedList=void 0,l(),setTimeout((()=>{c()}),300)})),f&&u.container.classList.add("is-visible")}))})()},this.onSendScheduledClick=()=>nn(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,S.tH)(this.chat.selection.selectionSendNowBtn):new _s.Z(this.peerId,yield this.chat.getMidsByMid(this.mid))})),this.onReplyClick=()=>{this.chat.input.initMessageReply(this.mid)},this.onFaveStickerClick=e=>{const t=this.message.media.document.id;this.managers.appStickersManager.faveSticker(t,e)},this.onEditClick=()=>{this.chat.input.initMessageEditing(this.mid)},this.onCopyClick=()=>nn(this,void 0,void 0,(function*(){Fs()?(0,ct.T)(this.selectedMessagesText):document.execCommand("copy")})),this.onCopyAnchorLinkClick=()=>{(0,ct.T)(this.target.href)},this.onCopyLinkClick=()=>{const{url:e,isPrivate:t}=this.linkToMessage,i=t?"LinkCopiedPrivateInfo":"LinkCopied";(0,ye.Am)(C.ZP.format(i,!0)),(0,ct.T)(e)},this.onPinClick=()=>{new As(this.peerId,this.mid)},this.onUnpinClick=()=>{new As(this.peerId,this.mid,!0)},this.onRetractVote=()=>{this.managers.appPollsManager.sendVote(this.message,[])},this.onStopPoll=()=>{this.managers.appPollsManager.stopPoll(this.message)},this.onForwardClick=()=>nn(this,void 0,void 0,(function*(){if(this.chat.selection.isSelecting)(0,S.tH)(this.chat.selection.selectionForwardBtn);else{const e=this.peerId,t=this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid);new I.Z({[e]:t})}})),this.onSelectClick=()=>{this.chat.selection.toggleByElement((0,ve.Z)(this.target,"grouped-item")||(0,ve.Z)(this.target,"bubble"))},this.onClearSelectionClick=()=>{this.chat.selection.cancelSelection()},this.onDeleteClick=()=>nn(this,void 0,void 0,(function*(){this.chat.selection.isSelecting?(0,S.tH)(this.chat.selection.selectionDeleteBtn):new Ts.Z(this.peerId,this.isTargetAGroupedItem?[this.mid]:yield this.chat.getMidsByMid(this.mid),this.chat.type)})),this.listenerSetter=new le.Z,this.attachListenerSetter=new le.Z,this.middleware=(0,Se.k)()}attachTo(e){this.attachListenerSetter.removeAll(),c.Z?(0,S.fc)(e,(e=>{this.chat.selection.isSelecting||(this.chat.log("touchend",e),!e.target.closest([".name",".peer-title",".reply",".document","audio-element","avatar-element","a",".bubble-beside-button","replies-element","[data-saved-from]:not(.bubble)","poll-element",".attachment",".reply-markup-button"].join(", "))&&((0,Ce.Z)(e),this.onContextMenu(e)))}),{listenerSetter:this.attachListenerSetter}):(0,Ct.E)({element:e,callback:this.onContextMenu,listenerSetter:this.attachListenerSetter})}cleanup(){this.listenerSetter.removeAll(),this.reactionsMenu&&this.reactionsMenu.cleanup(),this.middleware.clean()}destroy(){this.cleanup(),this.attachListenerSetter.removeAll()}filterButtons(e){return nn(this,void 0,void 0,(function*(){return this.isSponsored?e.filter((e=>e.isSponsored)):(0,en.Z)(e,(e=>nn(this,void 0,void 0,(function*(){let t;return this.chat.selection.isSelecting&&!e.withSelection?t=!1:(this.isOverBubble||c.Z,t=yield e.verify()),!!t}))))}))}setButtons(){const e=e=>nn(this,void 0,void 0,(function*(){var t;const i=null===(t=this.message.media)||void 0===t?void 0:t.document;if(!(null==i?void 0:i.sticker))return!1;const s=yield this.managers.acknowledged.appStickersManager.getFavedStickersStickers();if(!s.cached)return!1;const n=(yield s.result).some((e=>e.id===i.id));return e?!n:n}));this.buttons=[{icon:"send2",text:"MessageScheduleSend",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&!this.message.pFlags.is_outgoing},{icon:"send2",text:"Message.Context.Selection.SendNow",onClick:this.onSendScheduledClick,verify:()=>"scheduled"===this.chat.type&&this.isSelected&&!this.chat.selection.selectionSendNowBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"schedule",text:"MessageScheduleEditTime",onClick:()=>{this.chat.input.scheduleSending((()=>{(0,Pe.Z)(this.message),this.managers.appMessagesManager.editMessage(this.message,this.message.message,{scheduleDate:this.chat.input.scheduleDate,entities:this.message.entities}),this.chat.input.onMessageSent(!1,!1)}),new Date(1e3*this.message.date))},verify:()=>"scheduled"===this.chat.type},{icon:"reply",text:"Reply",onClick:this.onReplyClick,verify:()=>nn(this,void 0,void 0,(function*(){return(yield this.chat.canSend())&&!this.message.pFlags.is_outgoing&&!!this.chat.input.messageInput&&"scheduled"!==this.chat.type}))},{icon:"favourites",text:"AddToFavorites",onClick:this.onFaveStickerClick.bind(this,!1),verify:()=>e(!0)},{icon:"favourites",text:"DeleteFromFavorites",onClick:this.onFaveStickerClick.bind(this,!0),verify:()=>e(!1)},{icon:"edit",text:"Edit",onClick:this.onEditClick,verify:()=>nn(this,void 0,void 0,(function*(){return(yield this.managers.appMessagesManager.canEditMessage(this.message,"text"))&&!!this.chat.input.messageInput}))},{icon:"copy",text:"Copy",onClick:this.onCopyClick,verify:()=>!(this.noForwards||!this.message.message||this.isTextSelected||this.isAnchorTarget&&this.message.message===this.target.innerText)},{icon:"copy",text:"Chat.CopySelectedText",onClick:this.onCopyClick,verify:()=>!this.noForwards&&!!this.message.message&&this.isTextSelected},{icon:"copy",text:"Message.Context.Selection.Copy",onClick:this.onCopyClick,verify:()=>nn(this,void 0,void 0,(function*(){if(!this.isSelected||this.noForwards)return!1;for(const[e,t]of this.chat.selection.selectedMids){const i=`${e}_${"scheduled"===this.chat.type?"scheduled":"history"}`;for(const e of t)if((yield this.managers.appMessagesManager.getMessageFromStorage(i,e)).message)return!0}return!1})),notDirect:()=>!0,withSelection:!0},{icon:"copy",text:"CopyLink",onClick:this.onCopyAnchorLinkClick,verify:()=>this.isAnchorTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Username",onClick:()=>{(0,ct.T)(this.target.innerHTML)},verify:()=>this.isUsernameTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Hashtag",onClick:()=>{(0,ct.T)(this.target.innerHTML)},verify:()=>this.target.classList.contains("anchor-hashtag"),withSelection:!0},{icon:"link",text:"MessageContext.CopyMessageLink1",onClick:this.onCopyLinkClick,verify:()=>nn(this,void 0,void 0,(function*(){return(yield this.managers.appPeersManager.isChannel(this.peerId))&&!this.message.pFlags.is_outgoing}))},{icon:"pin",text:"Message.Context.Pin",onClick:this.onPinClick,verify:()=>nn(this,void 0,void 0,(function*(){return!this.message.pFlags.is_outgoing&&"messageService"!==this.message._&&!this.message.pFlags.pinned&&(yield this.managers.appPeersManager.canPinMessage(this.peerId))&&"scheduled"!==this.chat.type}))},{icon:"unpin",text:"Message.Context.Unpin",onClick:this.onUnpinClick,verify:()=>nn(this,void 0,void 0,(function*(){return this.message.pFlags.pinned&&(yield this.managers.appPeersManager.canPinMessage(this.peerId))}))},{icon:"download",text:"MediaViewer.Context.Download",onClick:()=>{Ds.Z.downloadToDisc({media:(0,vt.Z)(this.message)})},verify:()=>{var e,t;if(!(0,sn.Z)(this.message)||this.noForwards)return!1;let i=!1;if(null===(e=this.message.media)||void 0===e?void 0:e.photo)i=!0;else{if(!(null===(t=this.message.media)||void 0===t?void 0:t.document))return!1;i=!0}let s=!!c.Z;return i&&(s||(s=!!((0,ve.Z)(this.target,"document")||(0,ve.Z)(this.target,"audio")||(0,ve.Z)(this.target,"media-sticker-wrapper")||(0,ve.Z)(this.target,"media-photo")||(0,ve.Z)(this.target,"media-video")))),i&&s}},{icon:"checkretract",text:"Chat.Poll.Unvote",onClick:this.onRetractVote,verify:()=>{var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return t&&t.chosenIndexes.length&&!t.pFlags.closed&&!t.pFlags.quiz}},{icon:"stop",text:"Chat.Poll.Stop",onClick:this.onStopPoll,verify:()=>nn(this,void 0,void 0,(function*(){var e;const t=null===(e=this.message.media)||void 0===e?void 0:e.poll;return(yield this.managers.appMessagesManager.canEditMessage(this.message,"poll"))&&t&&!t.pFlags.closed&&!this.message.pFlags.is_outgoing}))},{icon:"forward",text:"Forward",onClick:this.onForwardClick,verify:()=>!(this.noForwards||"scheduled"===this.chat.type||this.message.pFlags.is_outgoing&&this.message.fromId!==m.yF||"messageService"===this.message._)},{icon:"forward",text:"Message.Context.Selection.Forward",onClick:this.onForwardClick,verify:()=>this.chat.selection.selectionForwardBtn&&this.isSelected&&!this.chat.selection.selectionForwardBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"flag",text:"ReportChat",onClick:()=>{new zs(this.peerId,[this.mid])},verify:()=>nn(this,void 0,void 0,(function*(){return!this.message.pFlags.out&&"message"===this.message._&&!this.message.pFlags.is_outgoing&&(yield this.managers.appPeersManager.isChannel(this.peerId))})),notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Select",onClick:this.onSelectClick,verify:()=>!this.message.action&&!this.isSelected&&this.isSelectable,notDirect:()=>!0,withSelection:!0},{icon:"select",text:"Message.Context.Selection.Clear",onClick:this.onClearSelectionClick,verify:()=>this.isSelected,notDirect:()=>!0,withSelection:!0},{onClick:()=>{if(this.viewerPeerId)this.chat.appImManager.setInnerPeer({peerId:this.viewerPeerId});else{if(!this.canOpenReactedList)return!1;new $s(this.message)}},verify:()=>nn(this,void 0,void 0,(function*(){var e,t;return!this.peerId.isUser()&&(!!(null===(t=null===(e=this.message.reactions)||void 0===e?void 0:e.recent_reactions)||void 0===t?void 0:t.length)||(yield this.managers.appMessagesManager.canViewMessageReadParticipants(this.message)))})),notDirect:()=>!0,localName:"views"},{icon:"delete danger",text:"Delete",onClick:this.onDeleteClick,verify:()=>nn(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.canDeleteMessage(this.message)}))},{icon:"delete danger",text:"Message.Context.Selection.Delete",onClick:this.onDeleteClick,verify:()=>this.isSelected&&!this.chat.selection.selectionDeleteBtn.hasAttribute("disabled"),notDirect:()=>!0,withSelection:!0},{icon:"info",text:"Chat.Message.Sponsored.What",onClick:()=>{new js},verify:()=>!1,isSponsored:!0},{text:"Loading",onClick:()=>{this.emojiInputsPromise.then((e=>{new M.Z(e,!0).show()}))},verify:()=>!!this.getUniqueCustomEmojisFromMessage().length,notDirect:()=>!0,localName:"emojis"}]}getUniqueCustomEmojisFromMessage(){const e=[],t=this.albumMessages&&(0,Mt.Z)(this.albumMessages)||this.message,i=t.entities;if(i){const t=i.filter((e=>"messageEntityCustomEmoji"===e._));e.push(...t.map((e=>e.document_id)))}const s=t.reactions;if(s){const t=s.results.filter((e=>"reactionCustomEmoji"===e.reaction._));e.push(...t.map((e=>e.reaction.document_id)))}return(0,tn.Z)(e)}init(){return nn(this,void 0,void 0,(function*(){this.cleanup(),this.setButtons();const e=yield this.filterButtons(this.buttons);if(!e.length)return;const t=this.element=yield(0,ks.Z)({buttons:e,listenerSetter:this.listenerSetter});t.id="bubble-contextmenu",t.classList.add("contextmenu");const i=e.find((e=>"views"===e.localName));if(i){const e=this.message.reactions,t=null==e?void 0:e.recent_reactions,s=!!(null==t?void 0:t.length),n=(yield this.managers.appMessagesManager.canViewMessageReadParticipants(this.message))?(yield this.managers.appPeersManager.getPeer(this.peerId)).participants_count:void 0,a=e?e.results.reduce(((e,t)=>e+t.count),0):void 0;i.element.classList.add("tgico-"+(s?"reactions":"checks"));const o=new C.ZP.IntlElement({key:s?void 0===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted":"NobodyViewed",args:s?void 0===n?[a]:[n,n]:void 0,element:i.textElement});let r;r=s?void 0===n?(0,C.ag)("Chat.Context.ReactedFast",[a]):(0,C.ag)(t.length===n?"Chat.Context.ReactedFast":"Chat.Context.Reacted",[t.length,n]):(0,C.ag)("Loading"),r.classList.add("btn-menu-item-text-fake"),i.element.append(r);const d=22,l=3,c=1.125;o.element.style.visibility="hidden",o.element.style.paddingRight=s?c*Math.min(l,t.length)+"rem":"1rem";const h=this.middleware.get();this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message).then((e=>{if(!h())return;r&&r.remove();const a=e.combined,u=void 0===n?e.reactionsCount:s?a.filter((e=>e.reaction)).length:a.length;let p;if(1===a.length)p=new B.Z({peerId:a[0].peerId,onlyFirstName:!0,dialog:!1}).element,(!s||e.readParticipants.length<=1)&&(this.viewerPeerId=a[0].peerId);else if(s){const e=u===a.length||void 0===n;p=(0,C.ag)(e?"Chat.Context.ReactedFast":"Chat.Context.Reacted",e?[u]:[u,a.length])}else a.length?p=(0,C.ag)("MessageSeen",[a.length]):o.element.style.visibility="";if(p&&(p.style.paddingRight=c*Math.min(l,u)+"rem",p.classList.add("btn-menu-item-text-fake"),i.element.append(p)),a.length){const e=new ie({avatarSize:d});e.render(t?t.map((e=>(0,D.Z)(e.peer_id))):a.map((e=>e.peerId))),i.element.append(e.container),this.canOpenReactedList=!0}}))}let s,n,a;if(!("message"!==this.message._||this.chat.selection.isSelecting||this.message.pFlags.is_outgoing||this.message.pFlags.is_scheduled||this.message.pFlags.local)){a=T.IS_APPLE||c.Z?"horizontal":"vertical",n=this.reactionsMenu=new Xs(this.managers,a,this.middleware),n.init(yield this.managers.appMessagesManager.getGroupsFirstMessage(this.message));const e=44,t=0;s="vertical"===a?{top:t,left:e}:{top:e,right:0,left:t}}const o=e.find((e=>"emojis"===e.localName));if(o){o.element.classList.add("is-multiline"),o.element.parentElement.insertBefore(document.createElement("hr"),o.element);const e=()=>{null!=s||(s={}),s.bottom=24},t=this.getUniqueCustomEmojisFromMessage(),i=this.emojiInputsPromise=(0,fe.Z)();yield this.managers.appEmojiManager.getCachedCustomEmojiDocuments(t).then((s=>nn(this,void 0,void 0,(function*(){const n=t=>nn(this,void 0,void 0,(function*(){const s=new Map;t.forEach((e=>{e&&!s.has(e.stickerSetInput.id)&&s.set(e.stickerSetInput.id,e.stickerSetInput)}));const n=[...s.values()];if(i.resolve(n),1===s.size){const t=yield this.managers.acknowledged.appStickersManager.getStickerSet(n[0]),i=t.result.then((e=>{const t=(0,C.ag)("MessageContainsEmojiPack",[(0,R.Z)(e.set.title)]);(0,U.Z)(o.textElement,t)}));return t.cached?i:void e()}(0,U.Z)(o.textElement,(0,C.ag)("MessageContainsEmojiPacks",[s.size]))}));if(!s.some((e=>!e)))return n(s);e(),this.managers.appEmojiManager.getCustomEmojiDocuments(t).then(n)}))))}return this.chat.container.append(t),{element:t,cleanup:()=>{this.cleanup(),n&&n.cleanup()},destroy:()=>{t.remove(),n&&n.widthContainer.remove()},menuPadding:s,reactionsMenu:n,reactionsMenuPosition:a}}))}getUrlToMessage(){return nn(this,void 0,void 0,(function*(){if(this.peerId.isUser())return;let e;const{peerId:t,mid:i}=this,s=this.chat.threadId;"discussion"===this.chat.type&&(e=yield this.managers.appMessagesManager.getMessageByPeer(t,s));const n=yield this.managers.appPeersManager.getPeerUsername(e?e.fromId:t),a=(0,bt.Z)(i);let o="https://t.me/";return n?(o+=n,o+=e?`/${(0,bt.Z)(e.fwd_from.channel_post)}?comment=${a}`:s?`/${(0,bt.Z)(s)}/${a}`:"/"+a):(o+="c/"+t.toChatId(),o+=e?`/${a}?thread=${(0,bt.Z)(e.mid)}`:s?`/${(0,bt.Z)(s)}/${a}`:"/"+a),{url:o,isPrivate:!n}}))}getSelectedMessagesText(){return nn(this,void 0,void 0,(function*(){if(!Fs())return"";const e=this.chat.selection.isSelecting?[...this.chat.selection.selectedMids.get(this.peerId)].sort(((e,t)=>e-t)):[this.mid];return(yield Promise.all(e.map((e=>nn(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);return(null==t?void 0:t.message)?t.message+"\n":""})))))).join("")}))}}var on=i(4329),rn=i.n(on),dn=i(9043);class ln{constructor(e){this.sendMenuButtons=[{icon:"mute",text:"Chat.Send.WithoutSound",onClick:e.onSilentClick,verify:()=>"schedule"===this.type},{icon:"schedule",text:"Chat.Send.ScheduledMessage",onClick:e.onScheduleClick,verify:()=>"schedule"===this.type},{icon:"schedule",text:"Chat.Send.SetReminder",onClick:e.onScheduleClick,verify:()=>"reminder"===this.type}],this.sendMenu=(0,ks.b)({buttons:this.sendMenuButtons,listenerSetter:e.listenerSetter}),this.sendMenu.classList.add("menu-send",e.openSide),(0,Ct.E)({element:e.onContextElement,callback:t=>{e.onOpen&&!e.onOpen()||(this.sendMenuButtons.forEach((e=>{e.element.classList.toggle("hide",!e.verify())})),(0,Ce.Z)(t),Lt.Z.openBtnMenu(this.sendMenu))},listenerSetter:e.listenerSetter})}setPeerId(e){this.type=e===d.Z.myId?"reminder":"schedule"}}var cn=i(1293),hn=i(9336),un=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class pn extends w.Z{constructor(e){super("popup-create-poll popup-new-media",{closable:!0,withConfirm:"Create",body:!0,title:"NewPoll"}),this.chat=e,this.tempId=0,this.onSubmitClick=()=>{this.send()},this.onInput=e=>{const t=e.target,i=(0,be.Z)(t,"LABEL"),s=(0,cn.Z)(t);s||(t.parentElement.classList.add("is-filled"),i.classList.remove("hidden-widget"),i.firstElementChild.removeAttribute("disabled")),!i.nextElementSibling&&!s&&this.questions.childElementCount<10&&this.appendMoreField(),this.handleChange()},this.onDeleteClick=e=>{const t=e.target,i=(0,be.Z)(t,"LABEL"),s=(0,Ie.Z)(i);this.correctAnswers&&this.correctAnswers[0][0]===s&&(this.correctAnswers=void 0),i.remove(),this.optionInputFields.splice(s,1),this.optionInputFields.forEach(((e,t)=>{e.options.labelOptions.length=0,e.options.labelOptions.push(t+1),C.ZP.weakMap.get(e.label.firstElementChild).update()})),this.handleChange()},this.construct()}construct(){return un(this,void 0,void 0,(function*(){if(this.questionInputField=new L.ZP({placeholder:"AskAQuestion",label:"AskAQuestion",name:"question",maxLength:255}),this.listenerSetter.add(this.questionInputField.input)("input",(()=>{this.handleChange()})),this.optionInputFields=[],"scheduled"!==this.chat.type){const e=new ln({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending((()=>{this.send()}))},openSide:"bottom-left",onContextElement:this.btnConfirm});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.header.append(this.questionInputField.container);const e=document.createElement("hr"),t=document.createElement("div");t.classList.add("caption"),(0,C.$d)(t,"PollOptions"),this.questions=document.createElement("form"),this.questions.classList.add("poll-create-questions");const i=document.createElement("div");i.classList.add("poll-create-settings");const s=document.createElement("div");s.classList.add("caption"),(0,C.$d)(s,"Settings"),(yield this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))||(this.anonymousCheckboxField=new zt.Z({text:"NewPoll.Anonymous",name:"anonymous"}),this.anonymousCheckboxField.input.checked=!0,i.append(this.anonymousCheckboxField.label)),this.multipleCheckboxField=new zt.Z({text:"NewPoll.MultipleChoice",name:"multiple"}),this.quizCheckboxField=new zt.Z({text:"NewPoll.Quiz",name:"quiz"}),this.listenerSetter.add(this.multipleCheckboxField.input)("change",(()=>{const e=this.multipleCheckboxField.input.checked;this.quizCheckboxField.input.toggleAttribute("disabled",e)})),this.listenerSetter.add(this.quizCheckboxField.input)("change",(()=>{const e=this.quizCheckboxField.input.checked;Array.from(this.questions.children).map((t=>{t.classList.toggle("radio-field",e)})),e||(this.correctAnswers=void 0,this.quizSolutionField.setValueSilently("")),n.forEach((t=>t.classList.toggle("hide",!e))),this.multipleCheckboxField.input.toggleAttribute("disabled",e),this.handleChange()})),i.append(this.multipleCheckboxField.label,this.quizCheckboxField.label);const n=[],a=document.createElement("div");a.classList.add("caption"),(0,C.$d)(a,"AccDescrQuizExplanation");const o=document.createElement("hr"),r=document.createElement("div");r.classList.add("poll-create-questions"),this.quizSolutionField=new L.ZP({placeholder:"NewPoll.Explanation.Placeholder",label:"NewPoll.Explanation.Placeholder",name:"solution",maxLength:200}),this.listenerSetter.add(this.questionInputField.input)("input",(()=>{this.handleChange()}));const d=document.createElement("div");d.classList.add("subtitle"),(0,C.$d)(d,"AddAnExplanationInfo"),r.append(this.quizSolutionField.container,d),n.push(o,a,r),n.forEach((e=>e.classList.add("hide"))),this.body.parentElement.insertBefore(e,this.body),this.body.append(t,this.questions,document.createElement("hr"),s,i,...n),(0,S.fc)(this.btnConfirm,this.onSubmitClick,{listenerSetter:this.listenerSetter}),this.scrollable=new Z.ZP(this.body),this.appendMoreField(),this.onEscape=()=>!this.getFilledAnswers().length,this.handleChange()}))}getFilledAnswers(){return Array.from(this.questions.children).map(((e,t)=>{const i=e.querySelector(".input-field-input");return i instanceof HTMLInputElement?i.value:(0,hn.Z)(i,!1,!1).value})).filter((e=>!!e.trim()))}validate(){var e;const t=this.questionInputField.value;if(!t)return!1;if(t.length>255)return!1;if(this.quizCheckboxField.input.checked&&!(null===(e=this.correctAnswers)||void 0===e?void 0:e.length))return!1;const i=this.getFilledAnswers();if(i.length<2)return!1;if(i.find((e=>e.length>100)))return!1;const{value:s}=(0,hn.Z)(this.quizSolutionField.input,!1,!1);return!(s.length>200)}handleChange(){const e=this.validate();this.btnConfirm.toggleAttribute("disabled",!e)}send(e=!1){return un(this,void 0,void 0,(function*(){const t=this.questionInputField.value,i=this.getFilledAnswers(),{value:s,entities:n}=(0,hn.Z)(this.quizSolutionField.input,!0,!1);if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending((()=>{this.send(!0)}));this.hide();const a={};this.anonymousCheckboxField&&!this.anonymousCheckboxField.input.checked&&(a.public_voters=!0),this.multipleCheckboxField.input.checked&&(a.multiple_choice=!0),this.quizCheckboxField.input.checked&&(a.quiz=!0);const o={_:"poll",pFlags:a,question:t,answers:i.map(((e,t)=>({_:"pollAnswer",text:e,option:new Uint8Array([t])}))),id:void 0},r=yield this.chat.managers.appPollsManager.getInputMediaPoll(o,this.correctAnswers,s,n);this.chat.managers.appMessagesManager.sendOther(this.chat.peerId,r,Object.assign({},this.chat.getMessageSendingParams())),"reply"===this.chat.input.helperType&&this.chat.input.clearHelper(),this.chat.input.onMessageSent(!1,!1)}))}appendMoreField(){const e=this.tempId++,t=this.questions.childElementCount+1,i=new L.ZP({placeholder:"NewPoll.OptionsAddOption",label:"NewPoll.OptionLabel",labelOptions:[t],name:"question-"+e,maxLength:100});this.listenerSetter.add(i.input)("input",this.onInput);const s=new Fi.Z({text:"",name:"question"});s.main.append(i.container),(0,S.fc)(i.input,Ce.Z,{listenerSetter:this.listenerSetter}),s.label.classList.add("hidden-widget"),s.input.disabled=!0,this.quizCheckboxField.input.checked||s.label.classList.remove("radio-field"),this.listenerSetter.add(s.input)("change",(()=>{if(s.input.checked){const e=(0,Ie.Z)(s.label);this.correctAnswers=[new Uint8Array([e])],this.handleChange()}}));const n=document.createElement("span");n.classList.add("btn-icon","tgico-close"),i.container.append(n),(0,S.fc)(n,this.onDeleteClick,{listenerSetter:this.listenerSetter,once:!0}),this.questions.append(s.label),this.scrollable.scrollIntoViewNew({element:this.questions.lastElementChild,position:"center"}),this.optionInputFields.push(i)}}var fn=i(7814);function mn(e){let t,i;return e instanceof HTMLVideoElement?(t=e.videoWidth,i=e.videoHeight):(t=e.naturalWidth,i=e.naturalHeight),(0,fn.Z)({media:e,mediaSize:(0,qe.C)(t,i),boxSize:(0,qe.C)(320,240),quality:.9})}var gn=i(9897),vn=i(2341);function bn(e){const t=e.src;return fetch(t).then((e=>e.arrayBuffer())).then((e=>{const t=new Uint8Array(e);let i=0;for(let e=0,s=t.length;e{const t=e.target;if(t!==this.input){if("INPUT"===t.tagName||t.isContentEditable)return;this.input.focus(),(0,Nt.Z)(this.input)}},this.attachFile=e=>{const t=this.willAttach,i=this.shouldCompress(e.type),s=document.createElement("div");s.classList.add("popup-item");const n={file:e};(0,Ln.Z)(n,["scaledBlob","middlewareHelper","itemDiv","mediaSpoiler"]),n.middlewareHelper=this.middlewareHelper.get().create(),n.itemDiv=s;const a=i?this.attachMedia(n):this.attachDocument(n);return t.sendFileDetails.push(n),a},this.animationGroup="",this.construct(i)}construct(e){return In(this,void 0,void 0,(function*(){this.willAttach={type:e,sendFileDetails:[],group:!1};const t=yield this.managers.apiManager.getLimit("caption");if(this.captionLengthMax=t,(0,S.fc)(this.btnConfirm,(()=>this.send()),{listenerSetter:this.listenerSetter}),"scheduled"!==this.chat.type){const e=new ln({onSilentClick:()=>{this.chat.input.sendSilent=!0,this.send()},onScheduleClick:()=>{this.chat.input.scheduleSending((()=>{this.send()}))},openSide:"bottom-left",onContextElement:this.btnConfirm,listenerSetter:this.listenerSetter});e.setPeerId(this.chat.peerId),this.header.append(e.sendMenu)}this.mediaContainer=document.createElement("div"),this.mediaContainer.classList.add("popup-photo");const i=new Z.ZP(null);let s,n,a;i.container.append(this.mediaContainer),this.inputField=new L.ZP({placeholder:"PreviewSender.CaptionPlaceholder",label:"Caption",name:"photo-caption",maxLength:this.captionLengthMax,withLinebreaks:!0}),this.input=this.inputField.input,this.inputField.value=this.wasInputValue=this.chat.input.messageInputField.input.innerHTML,this.chat.input.messageInputField.value="",this.body.append(i.container),this.container.append(this.inputField.container),this.attachFiles(),this.addEventListener("close",(()=>{this.files.length=0,this.willAttach.sendFileDetails.length=0,Mn===this&&(Mn=void 0)})),(0,Cn.Z)({buttons:[{icon:"mediaspoiler",text:"EnablePhotoSpoiler",onClick:()=>{this.applyMediaSpoiler(a)},verify:()=>n&&!a.mediaSpoiler},{icon:"mediaspoileroff",text:"DisablePhotoSpoiler",onClick:()=>{(0,$i.MR)({mediaSpoiler:a.mediaSpoiler,reveal:!0,destroyAfter:!0}),a.mediaSpoiler=void 0},verify:()=>!(!n||!a.mediaSpoiler)}],listenTo:this.mediaContainer,listenerSetter:this.listenerSetter,findElement:e=>(s=(0,ve.Z)(e.target,"popup-item"),n=s.classList.contains("popup-item-media"),a=this.willAttach.sendFileDetails.find((e=>e.itemDiv===s)),s)}),Mn=this}))}applyMediaSpoiler(e,t){return In(this,void 0,void 0,(function*(){const i=e.middlewareHelper.get(),{width:s,height:n}=e.itemDiv.style;let a,o;if(e.itemDiv.classList.contains("album-item")){const{width:t,height:i}=e.itemDiv.parentElement.style,r=parseInt(t),d=parseInt(i);a=+s.slice(0,-1)/100*r,o=+n.slice(0,-1)/100*d}else a=parseInt(s),o=parseInt(n);const{url:r}=yield(0,fn.Z)({media:e.itemDiv.firstElementChild,boxSize:(0,qe.C)(40,40),mediaSize:(0,qe.C)(a,o),toDataURL:!0,quality:.2}),d=(0,En.o)(r),l={_:"photoStrippedSize",bytes:d,type:"i"};e.strippedBytes=d;const c={_:"photo",sizes:[l],id:0,access_hash:0,date:0,dc_id:0,file_reference:[]},h=yield(0,$i.ZP)({middleware:i,width:a,height:o,animationGroup:this.animationGroup,media:c});i()&&(t||h.classList.add("is-revealing"),e.mediaSpoiler=h,e.itemDiv.append(h),yield(0,pe.d1)(),i()&&(0,$i.MR)({mediaSpoiler:h,reveal:!1}))}))}appendDrops(e){this.body.append(e)}get type(){return this.willAttach.type}set type(e){this.willAttach.type=e}appendGroupCheckboxField(){var e;const t=this.files.length>1;t&&!this.groupCheckboxField?(this.groupCheckboxField=new zt.Z({text:"PreviewSender.GroupItems",name:"group-items"}),this.container.append(...[this.groupCheckboxField.label,null===(e=this.mediaCheckboxField)||void 0===e?void 0:e.label,this.inputField.container].filter(Boolean)),this.willAttach.group=!0,this.groupCheckboxField.setValueSilently(this.willAttach.group),this.listenerSetter.add(this.groupCheckboxField.input)("change",(()=>{const e=this.groupCheckboxField.checked;this.willAttach.group=e,this.attachFiles()}))):this.groupCheckboxField&&this.groupCheckboxField.label.classList.toggle("hide",!t)}appendMediaCheckboxField(){var e;const t=!!this.files.find((e=>vn.Z.has(e.type)));t&&!this.mediaCheckboxField?(this.mediaCheckboxField=new zt.Z({text:"PreviewSender.CompressFile",name:"compress-items"}),this.container.append(...[null===(e=this.groupCheckboxField)||void 0===e?void 0:e.label,this.mediaCheckboxField.label,this.inputField.container].filter(Boolean)),this.mediaCheckboxField.setValueSilently("media"===this.willAttach.type),this.listenerSetter.add(this.mediaCheckboxField.input)("change",(()=>{const e=this.mediaCheckboxField.checked;this.willAttach.type=e?"media":"document",this.attachFiles()}))):this.mediaCheckboxField&&this.mediaCheckboxField.label.classList.toggle("hide",!t)}addFiles(e){const t=e.filter((e=>!this.files.find((t=>t.lastModified===e.lastModified&&t.name===e.name&&t.size===e.size))));t.length&&(this.files.push(...t),this.attachFiles())}send(e=!1){if("scheduled"===this.chat.type&&!e)return void this.chat.input.scheduleSending((()=>{this.send(!0)}));let t=this.inputField.value;if(t.length>this.captionLengthMax)return void(0,ye.Am)(C.ZP.format("Error.PreviewSender.CaptionTooLong",!0));const i=this.willAttach;i.isMedia="media"===i.type||void 0;const{sendFileDetails:s,isMedia:n}=i,{peerId:a,input:o}=this.chat,{length:r}=s,d=this.chat.getMessageSendingParams();this.iterate((e=>{t&&e.length!==r&&(this.managers.appMessagesManager.sendText(a,t,Object.assign(Object.assign({},d),{clearDraft:!0})),t=void 0);const s=e.map((e=>Object.assign(Object.assign({},e),{file:e.scaledBlob||e.file,spoiler:!!e.mediaSpoiler}))),o=Object.assign(Object.assign({},i),{sendFileDetails:s});this.managers.appMessagesManager.sendAlbum(a,Object.assign(Object.assign(Object.assign({},d),{caption:t,isMedia:n,clearDraft:!0}),o)),t=void 0})),o.replyToMsgId=this.chat.threadId,o.onMessageSent(),this.hide()}scaleImageForTelegram(e,t){return In(this,void 0,void 0,(function*(){const i=2560,s=t.file.type;let n,a=e.src;if("image/gif"!==s&&Math.max(e.naturalWidth,e.naturalHeight)>i){const{blob:t}=yield(0,fn.Z)({media:e,boxSize:(0,qe.C)(i,i),mediaSize:(0,qe.C)(e.naturalWidth,e.naturalHeight),mimeType:s});n=t,URL.revokeObjectURL(a),a=yield Sn.Z.invoke("createObjectURL",t),yield(0,Ot.cj)(e,a)}t.objectURL=a,t.scaledBlob=n}))}attachMedia(e){return In(this,void 0,void 0,(function*(){const{itemDiv:t}=e;t.classList.add("popup-item-media");const i=e.file;let s;if(i.type.startsWith("video/")){const n=(0,yn.Z)(),a=document.createElement("source");a.src=e.objectURL=yield Sn.Z.invoke("createObjectURL",i),n.autoplay=!0,n.controls=!1,n.muted=!0,n.addEventListener("timeupdate",(()=>{n.pause()}),{once:!0}),s=(0,wn.Z)(n).then((()=>In(this,void 0,void 0,(function*(){e.width=n.videoWidth,e.height=n.videoHeight,e.duration=Math.floor(n.duration);const i=n.webkitAudioDecodedByteCount;void 0!==i&&(e.noSound=!i),t.append(n);const s=yield function(e){return new Promise(((t,i)=>{e.onseeked=()=>{e.onseeked=()=>{mn(e).then(t),e.onseeked=void 0},e.currentTime=0},e.onerror=i,e.currentTime=Math.min(e.duration,1)}))}(n);e.thumb=Object.assign({url:yield Sn.Z.invoke("createObjectURL",s.blob)},s)})))),n.append(a)}else{const s=new Image,n=yield Sn.Z.invoke("createObjectURL",i);if(yield(0,Ot.cj)(s,n),yield this.scaleImageForTelegram(s,e),e.width=s.naturalWidth,e.height=s.naturalHeight,t.append(s),"image/gif"===i.type)return e.noSound=!0,Promise.all([bn(s).then((t=>{e.duration=Math.ceil(t)})),mn(s).then((t=>In(this,void 0,void 0,(function*(){e.thumb=Object.assign({url:yield Sn.Z.invoke("createObjectURL",t.blob)},t)}))))])}return s}))}attachDocument(e){return In(this,void 0,void 0,(function*(){const{itemDiv:t}=e;t.classList.add("popup-item-document");const i=e.file,s=i.type.startsWith("image/"),n=i.type.startsWith("audio/");let a;(s||n||i.size<2e7)&&(e.objectURL||(e.objectURL=yield Sn.Z.invoke("createObjectURL",i))),s&&(a=new Image,yield(0,Ot.cj)(a,e.objectURL),yield this.scaleImageForTelegram(a,e),e.scaledBlob=void 0);const o={_:"document",file:i,file_name:i.name||"",size:i.size,type:s?"photo":"doc"};let r;e.objectURL&&(r={url:e.objectURL,downloaded:i.size,type:m.Pt});const d=yield(0,Qi.Z)({message:{_:"message",pFlags:{is_outgoing:!0},mid:0,peerId:0,media:{_:"messageMediaDocument",document:o}},cacheContext:r});s&&(e.width=a.naturalWidth,e.height=a.naturalHeight),t.append(d)}))}shouldCompress(e){return"media"===this.willAttach.type&&vn.Z.has(e)}onRender(){this.element.classList.contains("active")||(this.listenerSetter.add(document.body)("keydown",this.onKeyDown),this.addEventListener("close",(()=>{this.wasInputValue&&(this.chat.input.messageInputField.value=this.wasInputValue)})),this.show())}setTitle(){const{willAttach:e,title:t,files:i}=this;let s;const n=[];if("document"===e.type)s="PreviewSender.SendFile",n.push(i.length);else{let e=0,t=0,a=0;i.forEach((i=>{i.type.startsWith("image/")?++e:i.type.startsWith("video/")?++t:++a})),[e,t,a].filter((e=>e>0)).length>1?(s="PreviewSender.SendFile",n.push(i.length)):e?(s="PreviewSender.SendPhoto",n.push(e)):t&&(s="PreviewSender.SendVideo",n.push(t))}(0,U.Z)(t,(0,C.ag)(s,n))}appendMediaToContainer(e){if(this.shouldCompress(e.file.type)){const t=(0,gn.Z)(e.width,e.height,380,320);e.itemDiv.style.width=t.width+"px",e.itemDiv.style.height=t.height+"px"}this.mediaContainer.append(e.itemDiv)}iterate(e){const{sendFileDetails:t}=this.willAttach;if(!this.willAttach.group)return void t.forEach((t=>e([t])));const i=t.length;for(let s=0;s{e.middlewareHelper.destroy()})),this.appendGroupCheckboxField(),this.appendMediaCheckboxField();const n=e.map((e=>this.attachFile(e)));Promise.all(n).then((()=>{i.replaceChildren(),e.length&&(this.setTitle(),this.iterate((e=>{const t=this.shouldCompress(e[0].file.type);if(t&&e.length>1){const t=document.createElement("div");t.classList.add("popup-item-album","popup-item"),t.append(...e.map((e=>e.itemDiv))),Wi({container:t,items:e.map((e=>({w:e.width,h:e.height}))),maxWidth:380,minWidth:100,spacing:4}),i.append(t)}else e.forEach((e=>{this.appendMediaToContainer(e)}));t&&e.forEach((e=>{const t=s.find((t=>t.file===e.file));t&&t.mediaSpoiler&&this.applyMediaSpoiler(e,!0)}))})))})).then((()=>{this.onRender()}))}}var kn=i(6057);const Tn="keydown",xn="active",An=["ArrowUp","ArrowDown"],_n=["ArrowLeft","ArrowRight"];function Fn({list:e,type:t,onSelect:i,once:s,waitForKey:n}){let a=(null==n?void 0:n.length)?new Set(n):void 0;const o=new Set("xy"===t?An.concat(_n):"x"===t?_n:An);let r;const d=()=>r||e.querySelector("."+xn)||e.firstElementChild,l=(e,i)=>{if(r===e)return;let s=!1;r&&(s=!0,r.classList.remove(xn)),r=e,r&&(r.classList.add(xn),s&&p&&i&&(0,he.Z)({container:p,element:r,position:"center",forceDuration:100,axis:"x"===t?"x":"y"}))},c=(t,i)=>{let s;return s=i?t.nextElementSibling||e.firstElementChild:t.previousElementSibling||e.lastElementChild,s};let h;h="xy"===t?(t,i)=>"ArrowUp"===i||"ArrowDown"===i?((t,i)=>{const s=i?"nextElementSibling":"previousElementSibling",n=i?"firstElementChild":"lastElementChild",a=t.getBoundingClientRect();let o=t[s]||e[n];for(;o!==t;){const t=o.getBoundingClientRect();if(t.x===a.x&&t.y!==a.y)break;o=o[s]||e[n]}return o})(t,"ArrowDown"===i):c(t,"ArrowRight"===i):(e,t)=>c(e,"ArrowRight"===t||"ArrowDown"===t);let u=i=>{const s=i.key;if(o.has(s)){if((0,Ce.Z)(i),e.childElementCount>1){let e=d();e=h(e,s),l(e,!0)}}else("Enter"===s||"xy"!==t&&"Tab"===s)&&((0,Ce.Z)(i),g(d()))};const p=(0,ve.Z)(e,"scrollable");e.classList.add("navigable-list");const f=t=>{const i=(0,Be.Z)(t.target,e);i&&l(i,!1)},m=t=>{(0,Ce.Z)(t);const i=(0,Be.Z)(t.target,e);i&&(l(i,!1),g(d()))},g=e=>{return t=this,n=void 0,o=function*(){const t=yield i(e);(void 0!==t?!t:s)&&y()},new((a=void 0)||(a=Promise))((function(e,i){function s(e){try{d(o.next(e))}catch(e){i(e)}}function r(e){try{d(o.throw(e))}catch(e){i(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof a?i:new a((function(e){e(i)}))).then(s,r)}d((o=o.apply(t,n||[])).next())}));var t,n,a,o};let v=!1;const b=()=>{v||(v=!0,document.addEventListener(Tn,u,{capture:!0,passive:!1}),e.addEventListener("mousemove",f,{passive:!0}),(0,S.fc)(e,m))},y=()=>{v&&(v=!1,document.removeEventListener(Tn,u,{capture:!0}),e.removeEventListener("mousemove",f),(0,S.EN)(e,m))},w=()=>{a||l(e.firstElementChild,!1)};if(a){const e=u;u=t=>{a.has(t.key)&&((0,Ce.Z)(t),document.removeEventListener(Tn,u,{capture:!0}),u=e,document.addEventListener(Tn,u,{capture:!0,passive:!1}),a=void 0,w())}}else w();return b(),{attach:b,detach:y,resetTarget:w}}var Dn=i(6385),Rn=i(5953);class Bn extends l.Z{constructor(e){super(!1),this.hidden=!0,this.onVisible=()=>{this.detach&&this.detach();const e=this.list,{attach:t,detach:i,resetTarget:s}=Fn({list:e,type:this.listType,onSelect:this.onSelect,once:!0,waitForKey:this.waitForKey});this.attach=t,this.detach=i,this.resetTarget=s,T.IS_MOBILE||this.navigationItem||(this.navigationItem={type:"autocomplete-helper",onPop:()=>{this.navigationItem=void 0,this.toggle(!0)},noBlurOnPop:!0},Dn.Z.pushItem(this.navigationItem)),this.addEventListener("hidden",(()=>{this.resetTarget=void 0,this.attach=void 0,this.detach=void 0,e.innerHTML="",i(),this.navigationItem&&(Dn.Z.removeItem(this.navigationItem),this.navigationItem=void 0)}),{once:!0})},(0,Rn.Z)(this,e),this.container=document.createElement("div"),this.container.classList.add("autocomplete-helper","z-depth-1"),e.appendTo.append(this.container),this.attachNavigation(),this.controller&&this.controller.addHelper(this)}toggleListNavigation(e){e?this.attach&&this.attach():this.detach&&this.detach()}attachNavigation(){this.addEventListener("visible",this.onVisible)}toggle(e,t=!1,i){if(this.init)return;if(void 0===e&&(e=this.container.classList.contains("is-visible")&&!this.container.classList.contains("backwards")),this.hidden===e)return void(e||this.dispatchEvent("visible"));this.hidden=e,e?(this.navigationItem&&(Dn.Z.removeItem(this.navigationItem),this.navigationItem=void 0),!t&&this.controller&&this.controller.hideOtherHelpers(),this.detach&&this.detach()):(this.controller&&this.controller.hideOtherHelpers(this),this.dispatchEvent("visible"));const s=this.controller||e?0:2;e&&this.dispatchEvent("hiding"),(0,Fe.Z)({element:this.container,className:"is-visible",forwards:!e,duration:d.Z.settings.animationsEnabled&&!i?300:0,onTransitionEnd:()=>{this.hidden&&this.dispatchEvent("hidden")},useRafs:s})}}class Nn extends Bn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"xy",onSelect:e=>{return t=this,i=void 0,n=function*(){return!(yield It.Jo.onMediaClick({target:e},!0))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n},waitForKey:["ArrowUp","ArrowDown"]}),this.chat=i,this.managers=s,this.container.classList.add("stickers-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0),d.Z.dispatchEvent("choosing_sticker",!0)})),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(o.Z.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0,this.listenerSetter.removeAll(),this.listenerSetter=void 0),d.Z.dispatchEvent("choosing_sticker",!1)}))}checkEmoticon(e){const t=this.controller.getMiddleware();this.lazyLoadQueue&&this.lazyLoadQueue.clear(),Os(e),this.managers.appStickersManager.getStickersByEmoticon(e).then((e=>{if(!t())return;this.init&&(this.init(),this.init=null);const i=this.list.cloneNode();let s;this.lazyLoadQueue.clear(),s=e.length?new Promise((t=>{const s=[];e.forEach((e=>{i.append(this.superStickerRenderer.renderSticker(e,void 0,s))})),Promise.all(s).finally(t)})):Promise.resolve(),s.then((()=>{this.list.replaceWith(i),this.list=i,this.onChangeScreen||(this.onChangeScreen=()=>{const e=this.list.childElementCount*o.Z.active.popupSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"},o.Z.addEventListener("changeScreen",this.onChangeScreen),this.listenerSetter=new le.Z,(0,ji.Z)({listenTo:this.container,listenerSetter:this.listenerSetter})),this.onChangeScreen(),this.toggle(!e.length),this.scrollable.scrollTop=0}))}))}init(){this.list=document.createElement("div"),this.list.classList.add("stickers-helper-stickers","super-stickers"),this.container.append(this.list),this.scrollable=new Z.ZP(this.container),this.lazyLoadQueue=new de.Z,this.superStickerRenderer=new kn.vT(this.lazyLoadQueue,this.chat.animationGroup,this.managers)}}var On=i(2230),Un=i(5322);const Hn=()=>{const e=new Date;return e.setHours(0,0,0,0),e},zn=()=>{const e=new Date;return e.setFullYear(e.getFullYear()+1),e.setDate(e.getDate()-1),e};class jn extends E{constructor(e,t,i){var s;if(super((s=e).getTime()>zn().getTime()?new Date:s,t,{noButtons:!0,noTitle:!0,closable:!0,withConfirm:!0,minDate:Hn(),maxDate:zn(),withTime:!0,showOverflowMonths:!0,confirmShortcutIsSendShortcut:!0,title:!0}),this.element.classList.add("popup-schedule"),this.header.append(this.controlsDiv),this.title.replaceWith(this.monthTitle),this.body.append(this.btnConfirm),i){const e=(0,Ue.Z)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Schedule.SendWhenOnline"});this.body.append(e),(0,S.fc)(e,(()=>{t(ke),this.hide()}))}}}var Gn=i(8119),Vn=i(8799),Kn=i(6760),Wn=i(6299),$n=i(6039);class qn extends Bn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"x",onSelect:e=>{i.onEmojiSelected((0,$n.xG)(e),!0)}}),this.managers=s,this.container.classList.add("emoji-helper")}init(){this.list=document.createElement("div"),this.list.classList.add("emoji-helper-emojis","super-emojis"),this.container.append(this.list),this.scrollable=new Z.v7(this.container),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollLeft=0}),0)}))}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}(e=e.slice(0,80)).length&&(this.list.innerHTML="",e.forEach((e=>{(0,$n.IA)(e,this.list,!1,!0)}))),this.waitForKey=t?["ArrowUp","ArrowDown"]:void 0,this.toggle(!e.length)}checkQuery(e,t){const i=this.controller.getMiddleware();this.managers.appEmojiManager.getBothEmojiKeywords().then((()=>{return s=this,n=void 0,o=function*(){if(!i())return;const s=e.replace(/^:/,""),n=yield this.managers.appEmojiManager.searchEmojis(s);i()&&this.render(n,":"!==t)},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(o.next(e))}catch(e){t(e)}}function r(e){try{d(o.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,r)}d((o=o.apply(s,n||[])).next())}));var s,n,a,o}))}}class Qn extends Bn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"y",onSelect:s}),this.className=i,this.container.classList.add(Qn.BASE_CLASS,i)}init(){this.list=document.createElement("div"),this.list.classList.add(Qn.BASE_CLASS+"-list",this.className+"-list"),this.container.append(this.list),this.scrollable=new Z.ZP(this.container),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)}))}render(e,t){if(this.init){if(!e.length)return;this.init(),this.init=null}e.length&&(this.list.innerHTML="",e.forEach((e=>{const t=Qn.listElement({className:this.className,peerId:e.peerId,name:e.name,description:e.description});this.list.append(t)}))),t||this.toggle(!e.length)}static listElement(e){const t=Qn.BASE_CLASS_LIST_ELEMENT;e.className+="-list-element";const i=document.createElement("div");i.classList.add(t,e.className),i.dataset.peerId=""+e.peerId;const s=new f.Z;s.classList.add("avatar-30",t+"-avatar",e.className+"-avatar"),s.updateWithOptions({isDialog:!1,peerId:e.peerId});const n=document.createElement("div");if(n.classList.add(t+"-name",e.className+"-name"),e.name?(0,_.Z)(n,(0,R.Z)(e.name)):n.append(new B.Z({peerId:e.peerId,dialog:!1,onlyFirstName:!1,plainText:!1}).element),i.append(s,n),e.description){const s=document.createElement("div");s.classList.add(t+"-description",e.className+"-description"),(0,_.Z)(s,(0,R.Z)(e.description)),i.append(s)}return i}}Qn.BASE_CLASS="autocomplete-peer-helper",Qn.BASE_CLASS_LIST_ELEMENT=Qn.BASE_CLASS+"-list-element";var Yn=i(7381);function Xn(e,t,i){const s=[].concat(t.bot_info);let n;void 0!==i&&(n=new Yn.Z({ignoreCase:!0}));const a=new Map;let o;if(s.forEach((t=>{t.commands&&t.commands.forEach((({command:i,description:s},o)=>{const r="/"+i;a.set(i,{peerId:t.user_id?t.user_id.toPeerId(!1):e,command:i,name:r,description:s,index:o}),n&&n.indexObject(i,r)}))})),n){const e=n.search(i);o=Array.from(e).map((e=>a.get(e)))}else o=[...a.values()];return o=o.sort(((e,t)=>a.get(e.command).index-a.get(t.command).index)),o}class Jn extends Qn{constructor(e,t,i,s){super(e,t,"commands-helper",(e=>{const t=e.querySelector(`.${Qn.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return i.getReadyToSend((()=>{i.messageInput.innerHTML=t,i.sendMessage(!0)}))})),this.managers=s}checkQuery(e,t){return i=this,s=void 0,a=function*(){if(!(yield this.managers.appUsersManager.isBot(t)))return!1;const i=this.controller.getMiddleware();return this.managers.appProfileManager.getProfileByPeerId(t).then((s=>{if(!i())return;const n=Xn(t,s,e);this.render(n)})),!0},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}class ea{constructor(){this.helpers=new Set,this.middleware=(0,Se.k)()}toggleListNavigation(e){for(const t of this.helpers)t.toggleListNavigation(e)}getMiddleware(){return this.middleware.clean(),this.middleware.get()}addHelper(e){this.helpers.add(e)}hideOtherHelpers(e){this.helpers.forEach((t=>{t!==e&&t.toggle(!0,!0)})),e||this.middleware.clean()}}var ta=i(5102),ia=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class sa extends Qn{constructor(e,t,i,s){super(e,t,"mentions-helper",(e=>{const t=e.dataset.peerId.toUserId();Promise.resolve(s.appUsersManager.getUser(t)).then((e=>{let t,s="";const n=(0,ta.Z)(e);n[0]?s="@"+n[0]:(s=e.first_name||e.last_name,t={_:"messageEntityMentionName",length:s.length,offset:0,user_id:e.id}),s+=" ",i.insertAtCaret(s,t)}))})),this.managers=s}checkQuery(e,t,i){const s=e.trim();if(e.length!==s.length)return!1;const n=this.controller.getMiddleware();return this.managers.appProfileManager.getMentions(t&&t.toChatId(),s,i).then((e=>ia(this,void 0,void 0,(function*(){if(!n())return;e=e.filter((e=>e!==d.Z.myId));const t=e.map((e=>ia(this,void 0,void 0,(function*(){const t=yield this.managers.appUsersManager.getUser(e),i=(0,ta.Z)(t);return{peerId:e,description:i[0]?"@"+i[0]:void 0}}))));this.render((yield Promise.all(t)).filter(Boolean))})))),!0}}var na=i(5494),aa=i(6339),oa=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class ra extends aa.Z{constructor(e){super({element:document.createElement("div")}),this.onBodyTouchStart=e=>{const t=e.touches[0].target;(0,Be.Z)(t,this.element)||t===this.btnHover||((0,Ce.Z)(e),this.toggle(!1))},(0,Rn.Z)(this,e),this.element.classList.add(ra.BASE_CLASS),this.element.style.display="none",this.scrollable=new Z.ZP,this.element.append(this.scrollable.container),this.attachButtonListener(this.btnHover,this.listenerSetter),this.listenerSetter.add(d.Z)("history_reply_markup",(({peerId:e})=>oa(this,void 0,void 0,(function*(){this.peerId===e&&(this.checkAvailability()&&this.isActive()&&(yield this.render()),(0,ue.e9)().then((()=>{this.checkForceReply()})))}))))}init(){return this.appendTo.append(this.element),this.listenerSetter.add(this)("open",(()=>oa(this,void 0,void 0,(function*(){yield this.render(),c.Z&&(this.touchListener=this.listenerSetter.add(document.body)("touchstart",this.onBodyTouchStart,{passive:!1,capture:!0}),this.listenerSetter.add(this)("close",(()=>{this.listenerSetter.remove(this.touchListener)}),{once:!0}))})))),(0,S.fc)(this.element,(e=>{const t=(0,ve.Z)(e.target,"btn");if(!t)return;const i=t.dataset.type,{peerId:s}=this;"keyboardButtonRequestPhone"===i?(0,vi.Z)({titleLangKey:"ShareYouPhoneNumberTitle",button:{langKey:"OK"},descriptionLangKey:"AreYouSureShareMyContactInfoBot"}).then((()=>{this.managers.appMessagesManager.sendContact(s,d.Z.myId)})):this.managers.appMessagesManager.sendText(s,t.dataset.text),this.toggle(!1)}),{listenerSetter:this.listenerSetter}),super.init()}checkForceReply(){return oa(this,void 0,void 0,(function*(){const e=yield this.getReplyMarkup();"replyKeyboardForceReply"!==e._||e.pFlags.hidden||e.pFlags.used||(e.pFlags.used=!0,this.chatInput.initMessageReply(e.mid))}))}getReplyMarkup(){var e;return oa(this,void 0,void 0,(function*(){return null!==(e=(yield this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId)).replyMarkup)&&void 0!==e?e:{_:"replyKeyboardHide"}}))}render(e){return oa(this,void 0,void 0,(function*(){void 0===e&&(e=yield this.getReplyMarkup()),this.scrollable.container.replaceChildren();for(const t of e.rows){const e=document.createElement("div");e.classList.add(ra.BASE_CLASS+"-row");for(const i of t.buttons){const t=document.createElement("button");t.classList.add(ra.BASE_CLASS+"-button","btn"),(0,_.Z)(t,(0,R.Z)(i.text)),t.dataset.text=i.text,t.dataset.type=i._,e.append(t)}this.scrollable.container.append(e)}}))}checkAvailability(e){var t;return oa(this,void 0,void 0,(function*(){void 0===e&&(e=yield this.getReplyMarkup());const i="replyKeyboardHide"===e._||!(null===(t=e.rows)||void 0===t?void 0:t.length);return this.btnHover.classList.toggle("hide",i),i&&this.toggle(!1),!i}))}setPeer(e){this.peerId=e,this.checkAvailability(),this.checkForceReply()}}ra.BASE_CLASS="reply-keyboard";var da=i(1080),la=i(8678),ca=i(2830),ha=i(515);const ua="INLINE-HELPER";class pa extends Bn{constructor(e,t,i,s){super({appendTo:e,controller:t,listType:"xy",waitForKey:["ArrowUp","ArrowDown"],onSelect:e=>{if(!e)return!1;const{peerId:t,botId:i,queryId:s}=this.list.dataset;return this.chat.input.getReadyToSend((()=>{const n=(0,ha.Z)(s,e.dataset.resultId);this.managers.appInlineBotsManager.sendInlineResult(t.toPeerId(),i,n,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{clearDraft:!0})),this.chat.input.onMessageSent(!0,!0)}))}}),this.chat=i,this.managers=s,this._checkQuery=(e,t,i)=>{return s=this,n=void 0,r=function*(){const s=this.controller.getMiddleware(),n=yield this.managers.appUsersManager.resolveUsername(t);if(!s())throw"PEER_CHANGED";if("user"!==n._||!n.pFlags.bot)throw"NOT_A_BOT";const a=this.managers.appInlineBotsManager.getInlineResults(e,n.id,i).then((t=>{if(!s())throw"PEER_CHANGED";this.init&&(this.init(),this.init=null);const i=this.list.cloneNode();i.dataset.peerId=""+e,i.dataset.botId=""+n.id,i.dataset.queryId=""+t.query_id;const a=new da.Z(null,ua,this.scrollable,!1);this.lazyLoadQueue.clear(),this.superStickerRenderer.clear();const r=[],d=!!t.pFlags.gallery;for(const e of t.results){const t=document.createElement("div");t.classList.add("inline-helper-result"),t.dataset.resultId=e.id;const n=d?void 0:document.createElement("div");if(n&&(n.classList.add("inline-helper-result-preview"),t.append(n)),i.append(t),d)t.classList.add("grid-item");else{n.classList.add("empty"),(0,_.Z)(n,(0,R.Z)([...e.title.trim()][0]));const s=document.createElement("div");s.classList.add("inline-helper-result-title"),(0,_.Z)(s,(0,R.Z)(e.title));const a=document.createElement("div");a.classList.add("inline-helper-result-description"),(0,_.Z)(a,(0,ft.ZP)(e.description,{noCommands:!0,noLinks:!0})),t.append(s,a);const o=document.createElement("div");o.classList.add("inline-helper-separator"),i.append(o)}if("botInlineResult"===e._){if(e.thumb&&0===e.thumb.mime_type.indexOf("image/")){let i;n?(i=document.createElement("div"),n.append(i)):i=t,i.classList.add("media-container"),d&&i.classList.add("no-border-radius"),this.lazyLoadQueue.push({div:t,load:()=>Ds.Z.download({dcId:4,location:{_:"inputWebFileLocation",access_hash:e.thumb.access_hash,url:e.thumb.url},size:e.thumb.size,mimeType:e.thumb.mime_type}).then((e=>{const t=new Image;t.classList.add("media-photo"),(0,la.Z)(e).then((e=>{(0,ca.Z)(i,t,e,!0)}))}))})}}else{const i=e.document||e.photo;if(["sticker","gif"].includes(null==i?void 0:i.type)&&d)(0,Pe.Z)(i),"gif"===i.type?a.add(i,t):"sticker"===i.type&&(t.classList.add("super-sticker"),this.superStickerRenderer.renderSticker(i,t,r),i.animated&&this.superStickerRenderer.observeAnimated(t));else if(i){const e=d?48:void 0;d&&t.classList.add("no-border-radius"),(0,V.Z)({photo:i,container:d?t:n,boxWidth:e,boxHeight:e,middleware:s,lazyLoadQueue:this.lazyLoadQueue,loadPromises:r})}}}return Promise.all(r).then((()=>{if(!s())return void a.clear();i.classList.toggle("is-gallery",d),i.classList.toggle("super-stickers",d),this.container.classList.toggle("is-gallery",d);const r=this.list.parentElement;if(r.textContent="",t.switch_pm){const i=(0,Ue.Z)("btn-primary btn-secondary btn-primary-transparent primary");(0,_.Z)(i,(0,R.Z)(t.switch_pm.text)),(0,S.fc)(i,(i=>{this.chat.appImManager.setInnerPeer({peerId:e}),this.managers.appInlineBotsManager.switchToPM(e,n.id,t.switch_pm.start_param)})),r.append(i)}r.append(this.list=i),this.gifsMasonry&&this.gifsMasonry.detach(),this.gifsMasonry=a,a.attach(),this.onChangeScreen||(this.onChangeScreen=()=>{if(this.list.classList.contains("is-gallery")){const e=this.list.childElementCount*o.Z.active.popupSticker.width+(this.list.childElementCount-1);this.list.style.width=e+"px"}else this.list.style.width=""},o.Z.addEventListener("changeScreen",this.onChangeScreen)),this.onChangeScreen(),this.toggle(!t.results.length&&!t.switch_pm),this.scrollable.scrollTop=0}))}));return{user:n,renderPromise:a}},new((a=void 0)||(a=Promise))((function(e,t){function i(e){try{d(r.next(e))}catch(e){t(e)}}function o(e){try{d(r.throw(e))}catch(e){t(e)}}function d(t){var s;t.done?e(t.value):(s=t.value,s instanceof a?s:new a((function(e){e(s)}))).then(i,o)}d((r=r.apply(s,n||[])).next())}));var s,n,a,r},this.container.classList.add("inline-helper"),this.addEventListener("visible",(()=>{setTimeout((()=>{this.scrollable.container.scrollTop=0}),0)})),this.checkQuery=(0,Ze.Z)(this._checkQuery,200,!0,!0),this.addEventListener("hidden",(()=>{this.onChangeScreen&&(o.Z.removeEventListener("changeScreen",this.onChangeScreen),this.onChangeScreen=void 0)}))}init(){this.list=document.createElement("div"),this.list.classList.add("inline-helper-results"),this.container.append(this.list),this.scrollable=new Z.ZP(this.container),this.lazyLoadQueue=new de.Z,this.superStickerRenderer=new kn.vT(this.lazyLoadQueue,ua,this.managers)}}var fa=i(8090),ma=i(3013),ga=i(5133);class va extends Qn{constructor(e,t,i){super(e,void 0,"bot-commands",(e=>{const i=e.querySelector(`.${Qn.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;return t.getReadyToSend((()=>{t.messageInput.innerHTML=i,t.sendMessage(!0),this.toggle(!0)}))})),this.managers=i}setUserId(e,t){var i;if(this.userId!==e||!(null===(i=this.list)||void 0===i?void 0:i.childElementCount))return this.userId=e,(0,Ke.Z)(this.managers.appProfileManager.getProfile(e),(i=>{if(!t())return;const s=Xn(e.toPeerId(!1),i),n=50*s.length+8+24;this.container.style.setProperty("--height",n+"px"),this.render(s)}));this.toggle(!1)}}var ba=i(8479),ya=(i(1544),i(7197)),wa=i(6241),Sa=i(6535),Ca=i(2821),La=i(3066);function Ea(e){return t=this,i=void 0,n=function*(){return{cached:e.cached,result:e.cached?yield e.result:e.result}},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}function Ia(e){return e.then(Ea)}var Ma=i(177),Pa=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Za{constructor(e,t,i){this.managers=e,this.onReady=t,this.onChange=i,this.middleware=(0,Se.k)(),this.listenerSetter=new le.Z,this.construct()}construct(){this.container=document.createElement("div"),this.container.classList.add("new-message-send-as-container"),this.closeBtn=document.createElement("div"),this.closeBtn.classList.add("new-message-send-as-close","new-message-send-as-avatar","tgico-close");const e=[{text:"SendMessageAsTitle",onClick:void 0}];let t;this.buttons=[];const i=e=>{e&&(t=this.avatar);const i=this.avatar!==t,s=!e&&i?2:0;(0,Fe.Z)({element:this.closeBtn,className:"is-visible",forwards:e,duration:300,useRafs:s}),i||(0,Fe.Z)({element:t,className:"is-visible",forwards:!e,duration:300,useRafs:s})};(0,Un.Z)({buttonOptions:{noRipple:!0},listenerSetter:this.listenerSetter,container:this.container,direction:"top-right",buttons:e,onOpenBefore:()=>{i(!0)},onOpen:(t,i)=>{e[0].element.classList.add("btn-menu-item-header"),this.btnMenu=i,this.btnMenu.classList.add("scrollable","scrollable-y"),this.btnMenu.append(...this.buttons.map((e=>e.element)))},onClose:()=>{i(!1)},onCloseAfter:()=>{this.btnMenu=void 0}}),this.container.append(this.closeBtn)}updateButtons(e){var t;return Pa(this,void 0,void 0,(function*(){const i=e.map(((e,t)=>Pa(this,void 0,void 0,(function*(){const i=document.createElement("div"),s=document.createElement("div");return s.classList.add("btn-menu-item-subtitle"),e.isUser()?s.append((0,C.ag)("Chat.SendAs.PersonalAccount")):e===this.peerId?s.append((0,C.ag)("VoiceChat.DiscussionGroup")):s.append(yield(0,Ma.Z)(e.toChatId())),i.append(new B.Z({peerId:e}).element,s),{onClick:t?()=>Pa(this,void 0,void 0,(function*(){const t=this.peerId;this.changeSendAsPeerId(e);const i=this.middleware.get(),s=()=>{if(this.sendAsPeerId!==e||!i())return;const t=this.sendAsPeerIds.slice();(0,h.Z)(t,e),t.unshift(e),this.updateButtons(t)};d.Z.settings.animationsEnabled?setTimeout(s,250):s(),this.managers.appMessagesManager.saveDefaultSendAs(t,e)})):void 0,textElement:i}})))),s=yield Promise.all(i);(0,ks.b)({buttons:s}),s.forEach(((t,i)=>{const s=e[i],n=new f.Z;n.classList.add("avatar-26","btn-menu-item-icon"),n.updateWithOptions({peerId:s}),i||n.classList.add("active"),t.element.prepend(n)})),this.buttons=s,null===(t=this.btnMenu)||void 0===t||t.append(...this.buttons.map((e=>e.element)))}))}updateAvatar(e,t){return Pa(this,void 0,void 0,(function*(){const i=this.avatar;if(i&&i.peerId===e)return;i||(t=!0);const s=t?0:2,n=t?0:300,a=this.avatar=new f.Z;a.classList.add("new-message-send-as-avatar","avatar-30"),yield a.updateWithOptions({isDialog:!1,peerId:e}),(0,Fe.Z)({element:a,className:"is-visible",forwards:!0,duration:n,useRafs:s}),i&&(0,Fe.Z)({element:i,className:"is-visible",forwards:!1,duration:n,onTransitionEnd:()=>{i.remove()},useRafs:s}),this.container.append(a)}))}changeSendAsPeerId(e,t){return this.sendAsPeerId=e,this.onChange(e),this.updateAvatar(e,t)}getDefaultSendAs(){return this.managers.acknowledged.appProfileManager.getChannelFull(this.peerId.toChatId()).then((e=>({cached:e.cached,result:e.result.then((e=>e.default_send_as?(0,D.Z)(e.default_send_as):void 0))})))}updateManual(e){return Pa(this,void 0,void 0,(function*(){const t=this.peerId;if(this.updatingPromise||!(yield this.managers.appPeersManager.isChannel(t)))return;const i=this.middleware.get((()=>!this.updatingPromise||this.updatingPromise===l)),{container:s}=this,n=t.toChatId(),a=(yield Ia(this.getDefaultSendAs())).result,o=e;a instanceof Promise&&(e=void 0);const r=o&&!e,l=this.updatingPromise=(0,Ke.Z)(a,(t=>Pa(this,void 0,void 0,(function*(){if(!i()||void 0===t)return;if(yield this.changeSendAsPeerId(t,e),!i())return;this.managers.appChatsManager.getSendAs(n).then((e=>{if(!i())return;const s=e.filter((e=>!e.pFlags.premium_required)).map((e=>e.peer)).map((e=>(0,D.Z)(e)));this.sendAsPeerIds=s.slice(),(0,h.Z)(s,t),s.unshift(t),this.updateButtons(s)}));const a=()=>{this.onReady(s,e),this.addedListener||(this.listenerSetter.add(d.Z)("peer_full_update",(e=>{this.peerId===e&&this.update()})),this.addedListener=!0)};if(!r)return a;a()}))));return l.finally((()=>{this.updatingPromise===l&&(this.updatingPromise=void 0)})),r?void 0:l}))}update(e){return this.updateManual(e).then((e=>null==e?void 0:e()))}setPeerId(e){this.middleware.clean(),this.updatingPromise=void 0,this.peerId=e}destroy(){this.container.remove(),this.setPeerId(),this.listenerSetter.removeAll()}}var ka=i(669),Ta=i(6854);const xa=new RegExp(`(${Ta.Z})|(
)`,"g");class Aa extends L.ZP{constructor(e){super(e),this.input.addEventListener("input",(()=>{this.updateInnerHTML(),this.onFakeInput()})),e.placeholder&&(0,C.$d)(this.inputFake,e.placeholder,void 0,"placeholder"),this.input.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.contentEditable="true",this.inputFake.tabIndex=-1,this.inputFake.className=this.input.className+" input-field-input-fake"}onFakeInput(e=!0){const{scrollHeight:t}=this.inputFake,i=+this.input.style.height.replace("px","");if(i===t)return;const s=Math.round(50*Math.log(Math.abs(t-i)));this.input.style.transitionDuration=`${s}ms`,e&&(this.input.style.height=t?t+"px":"");const n="is-changing-height";(0,Fe.Z)({element:this.input,className:n,forwards:!0,duration:s,onTransitionEnd:()=>{this.input.classList.remove(n)}})}updateInnerHTML(e=this.input.innerHTML){e=e.replace(//,"").replace(/().+?\/custom-emoji-element>/g,"$1"),ka.Y&&(e=e.replace(xa,"")),this.inputFake.innerHTML=e}setValueSilently(e,t){super.setValueSilently(e,t),this.updateInnerHTML(),t||this.onFakeInput()}}var _a=i(9041);function Fa(e){const t={};e.forEach((e=>t[e]=!1));const i=window.getSelection();if(!i.isCollapsed){const s=i.getRangeAt(0),n=s.commonAncestorContainer,a=document.createTreeWalker((n.nodeType===n.ELEMENT_NODE?n:n.parentElement).closest('[contenteditable="true"]'),NodeFilter.SHOW_ELEMENT,{acceptNode:e=>s.intersectsNode(e)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});let o;for(;o=a.nextNode();)for(const i of e){if(t[i])continue;const e=_a.o[i];o.matches(e.match)&&(t[i]=!0)}}return t}var Da=i(6034),Ra=i(8794),Ba=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Na="Posting media content isn't allowed in this group.";class Oa{constructor(e,t,i){this.chat=e,this.appImManager=t,this.managers=i,this.lastUrl="",this.lastTimeType=0,this.replyElements={},this.willSendWebPage=null,this.recording=!1,this.recordCanceled=!1,this.recordStartTime=0,this.lockRedo=!1,this.canRedoFromHTML="",this.undoHistory=[],this.executedHistory=[],this.canUndoFromHTML="",this.onCancelRecordClick=e=>{e&&(0,Ce.Z)(e),this.recordCanceled=!0,this.recorder.stop(),dn.Z.setKeepAlive(!1)},this.onEmoticonsOpen=()=>{const e=c.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!0)},this.onEmoticonsClose=()=>{const e=c.Z?"flip-icon":"active";this.btnToggleEmoticons.classList.toggle(e,!1)},this.scheduleSending=(e=this.sendMessage.bind(this,!0),t=new Date)=>Ba(this,void 0,void 0,(function*(){const{peerId:i}=this.chat,s=this.chat.bubbles.getMiddleware(),n=d.Z.myId!==i&&i.isUser()&&(yield this.managers.appUsersManager.isUserOnlineVisible(i));new jn(t,(t=>{s()&&(t<=10+(Date.now()/1e3|0)&&(t=void 0),this.scheduleDate=t,e(),"scheduled"!==this.chat.type&&t&&setTimeout((()=>{s()&&(w.Z.getPopups(M.Z).forEach((e=>e.hide())),this.appImManager.openScheduled(i))}),0))}),n).show()})),this.prepareDocumentExecute=()=>(this.executedHistory.push(this.messageInput.innerHTML),()=>this.canUndoFromHTML=this.messageInput.innerHTML),this.undoRedo=(e,t,i)=>{(0,Ce.Z)(e);let s=this.messageInput.innerHTML;if(s&&s!==i){this.lockRedo=!0;let e=0;do{document.execCommand(t,!1,null);const i=this.messageInput.innerHTML;if(s===i){if(++e>2)break}else e=0;s=i}while(s!==i);this.lockRedo=!1}},this.handleMarkdownShortcut=e=>{const t={KeyB:"bold",KeyI:"italic",KeyU:"underline",KeyS:"strikethrough",KeyM:"monospace",KeyP:"spoiler"};this.appImManager.markupTooltip&&(t.KeyK="link");const i=e.code,s=t[i];if(!Fs(document.getSelection())&&s&&("KeyK"===i?this.appImManager.markupTooltip.showLinkEditor():this.applyMarkdown(s),(0,Ce.Z)(e)),"KeyZ"===i){let t=this.messageInput.innerHTML;e.shiftKey?this.undoHistory.length&&(this.executedHistory.push(t),t=this.undoHistory.pop(),this.undoRedo(e,"redo",t),t=this.messageInput.innerHTML,this.canRedoFromHTML=this.undoHistory.length?t:"",this.canUndoFromHTML=t):!this.executedHistory.length||this.canUndoFromHTML&&t!==this.canUndoFromHTML||(this.undoHistory.push(t),t=this.executedHistory.pop(),this.undoRedo(e,"undo",t),this.canUndoFromHTML=this.canRedoFromHTML=this.messageInput.innerHTML)}},this.onMessageInput=e=>{var t;const{value:i,entities:s,caretPos:n}=(0,hn.Z)(this.messageInputField.input),a=(0,Ca.Z)(i,s,!0),o=(0,wa.Z)(s,(0,Sa.Z)(a));this.canRedoFromHTML&&!this.lockRedo&&this.messageInput.innerHTML!==this.canRedoFromHTML&&(this.canRedoFromHTML="",this.undoHistory.length=0);const r=(!(null===(t=this.editMessage)||void 0===t?void 0:t.media)||"messageMediaWebPage"===this.editMessage.media._)&&o.filter((e=>"messageEntityUrl"===e._||"messageEntityTextUrl"===e._));if(r.length)for(const e of r){let t;if("messageEntityTextUrl"===e._)t=e.url;else if(t=i.slice(e.offset,e.offset+e.length),!t.includes("http://")&&!t.includes("https://"))continue;if(this.lastUrl!==t){this.lastUrl=t;const e=this.getWebPagePromise=this.managers.appWebPagesManager.getWebPage(t).then((i=>{this.getWebPagePromise===e&&(this.getWebPagePromise=void 0),this.lastUrl===t&&("webPage"===i._?(this.setTopInfo("webpage",(()=>{}),i.site_name||i.title||"Webpage",i.description||i.url||""),delete this.noWebPage,this.willSendWebPage=i):this.willSendWebPage&&this.onHelperCancel())}))}break}else this.lastUrl&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.helperType?this.helperFunc():this.clearHelper());if(i.trim()){const e=Date.now();e-this.lastTimeType>=6e3&&(this.lastTimeType=e,this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageTypingAction"},void 0,this.chat.threadId)),this.botCommands&&this.botCommands.toggle(!0)}else this.lastTimeType&&this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:"sendMessageCancelAction"},void 0,this.chat.threadId),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.hide(),document.activeElement===this.messageInput&&setTimeout((()=>{document.activeElement===this.messageInput&&this.resetCurrentFontFormatting()}),0);this.botCommands&&this.updateBotCommandsToggle(),this.editMsgId||this.saveDraftDebounced(),this.checkAutocomplete(i,n,o),this.updateSendBtn()},this.onEmojiSelected=(e,t)=>{const i=e.docId?{_:"messageEntityCustomEmoji",document_id:e.docId,length:e.emoji.length,offset:0}:(0,ya.Z)(e.emoji);this.insertAtCaret(e.emoji,i,t)},this.onBtnSendClick=e=>Ba(this,void 0,void 0,(function*(){if((0,Ce.Z)(e),!this.recorder||this.recording||!this.isInputEmpty()||this.forwarding||this.editMsgId)this.recording?Date.now()-this.recordStartTime<500?this.onCancelRecordClick():this.recorder.stop():this.sendMessage();else{const e=this.chat.peerId.isAnyChat();if(e&&!(yield this.chat.canSend("send_media")))return void(0,ye.Am)(Na);this.chatInput.classList.add("is-locked"),(0,Vn.Z)();let t=!1;if(!e){const e=yield this.managers.appProfileManager.getProfile(this.chat.peerId.toUserId());(null==e?void 0:e.pFlags.voice_messages_forbidden)&&((0,ye.bC)({langPackKey:"Chat.SendVoice.PrivacyError",langPackArguments:[yield(0,Vt.Z)({peerId:this.chat.peerId})]}),t=!0)}if(t)return void this.chatInput.classList.remove("is-locked");this.recorder.start().then((()=>{this.releaseMediaPlayback=ma.Z.setSingleMedia(),this.recordCanceled=!1,this.setRecording(!0),dn.Z.setKeepAlive(!0);const e=()=>{new xs.Z("popup-cancel-record",{titleLangKey:"DiscardVoiceMessageTitle",descriptionLangKey:"DiscardVoiceMessageDescription",buttons:[{langKey:"DiscardVoiceMessageAction",callback:()=>{(0,S.tH)(this.btnCancelRecord)}},{langKey:"Continue",isCancel:!0}]}).show()};this.recordingOverlayListener=this.listenerSetter.add(document.body)("mousedown",(t=>{(0,ve.Z)(t.target,"chat-input")||(0,ve.Z)(t.target,"popup-cancel-record")||((0,Ce.Z)(t),e())}),{capture:!0,passive:!1}),Dn.Z.pushItem(this.recordingNavigationItem={type:"voice",onPop:()=>(setTimeout((()=>{e()}),0),!1)}),this.recordStartTime=Date.now();const t=this.recorder.sourceNode,i=t.context.createAnalyser();t.connect(i),i.fftSize=32;const s=new Uint8Array(i.frequencyBinCount),n=255*s.length,a=()=>{if(!this.recording)return;i.getByteFrequencyData(s);let e=0;s.forEach((t=>{e+=t}));const t=Math.min(1,e/n+.36);this.recordRippleEl.style.transform=`scale(${t})`;const o=Date.now()-this.recordStartTime,r=o%1e3,d=(0,ts.Z)(o/1e3)+","+("00"+Math.round(r/10)).slice(-2);this.recordTimeEl.innerText=d,(0,pe.T2)(a)};a()})).catch((e=>{switch(e.name){case"NotAllowedError":(0,ye.Am)("Please allow access to your microphone");break;case"NotReadableError":(0,ye.Am)(e.message);break;default:console.error("Recorder start error:",e,e.name,e.message),(0,ye.Am)(e.message)}this.setRecording(!1),this.chatInput.classList.remove("is-locked")}))}})),this.onHelperCancel=(e,t)=>Ba(this,void 0,void 0,(function*(){if(e&&(0,Ce.Z)(e),this.willSendWebPage){const e=this.lastUrl;let t=!1;if(this.helperType&&(yield this.helperFunc(),t=!0),this.lastUrl=e,this.noWebPage=!0,this.willSendWebPage=null,t)return}if("edit"===this.helperType&&!t){const e=this.editMessage,t=this.getCurrentInputAsDraft();if(t&&delete t.pFlags.no_webpage,!(0,Da.Z)(t,Object.assign(Object.assign({},e),{_:"draftMessage"})))return void new xs.Z("discard-editing",{buttons:[{langKey:"Alert.Confirm.Discard",callback:()=>{this.onHelperCancel(void 0,!0)}}],descriptionLangKey:"Chat.Edit.Cancel.Text"}).show()}this.clearHelper(),this.updateSendBtn()})),this.onHelperClick=e=>{if((0,Ce.Z)(e),(0,ve.Z)(e.target,"reply"))if("forward"===this.helperType){const{forwardElements:e}=this;e&&c.Z&&!e.container.classList.contains("active")&&Lt.Z.openBtnMenu(e.container)}else"reply"===this.helperType?this.chat.setMessageId(this.replyToMsgId):"edit"===this.helperType&&this.chat.setMessageId(this.editMsgId)},this.listenerSetter=new le.Z}construct(){this.chatInput=document.createElement("div"),this.chatInput.classList.add("chat-input","hide"),this.inputContainer=document.createElement("div"),this.inputContainer.classList.add("chat-input-container"),this.rowsWrapperWrapper=document.createElement("div"),this.rowsWrapperWrapper.classList.add("rows-wrapper-wrapper"),this.rowsWrapper=document.createElement("div"),this.rowsWrapper.classList.add("rows-wrapper","chat-input-wrapper"),this.rowsWrapperWrapper.append(this.rowsWrapper);const e=Zs();this.rowsWrapper.append(e);const t=this.fakeRowsWrapper=document.createElement("div");t.classList.add("fake-wrapper","fake-rows-wrapper");const i=this.fakeSelectionWrapper=document.createElement("div");i.classList.add("fake-wrapper","fake-selection-wrapper"),this.inputContainer.append(this.rowsWrapperWrapper,t,i),this.chatInput.append(this.inputContainer),this.goDownBtn=(0,Gn.Z)({icon:"arrow_down",className:"bubbles-corner-button chat-secondary-button bubbles-go-down hide"}),this.inputContainer.append(this.goDownBtn),(0,S.fc)(this.goDownBtn,(e=>{(0,Ce.Z)(e),this.chat.bubbles.onGoDownClick()}),{listenerSetter:this.listenerSetter});const s=this.controlContainer=document.createElement("div");s.classList.add("chat-input-control","chat-input-wrapper"),this.inputContainer.append(s)}constructPeerHelpers(){this.replyElements.container=document.createElement("div"),this.replyElements.container.classList.add("reply-wrapper"),this.replyElements.iconBtn=(0,On.Z)(""),this.replyElements.cancelBtn=(0,On.Z)("close reply-cancel",{noRipple:!0}),this.replyElements.container.append(this.replyElements.iconBtn,this.replyElements.cancelBtn);const e=()=>{s=!0},t=()=>{s=!1},i=this.forwardElements={};let s=!1;const n=[i.showSender={text:"Chat.Alert.Forward.Action.Show1",onClick:e,checkForClose:()=>this.canToggleHideAuthor(),checkboxField:new zt.Z({checked:!0})},i.hideSender={text:"Chat.Alert.Forward.Action.Hide1",onClick:e,checkForClose:()=>this.canToggleHideAuthor(),checkboxField:new zt.Z({checked:!1})},i.showCaption={text:"Chat.Alert.Forward.Action.ShowCaption",onClick:t,checkboxField:new zt.Z({checked:!0})},i.hideCaption={text:"Chat.Alert.Forward.Action.HideCaption",onClick:t,checkboxField:new zt.Z({checked:!1})},i.changePeer={text:"Chat.Alert.Forward.Action.Another",onClick:()=>{this.changeForwardRecipient()},icon:"replace"}],a=i.container=(0,ks.b)({buttons:n,listenerSetter:this.listenerSetter}),o=Array.from(a.children);[{elements:o.slice(0,2),onChange:(e,t)=>{const n=!!+e;s&&(this.forwardWasDroppingAuthor=!n);const a=this.replyElements.container.querySelector(".reply-title");if(a){const e=a.firstElementChild,t=C.ZP.weakMap.get(e),s=i.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden";t.key=s,t.update()}}},{elements:o.slice(2,4),onChange:e=>{const t=!!+e;let s;s=t&&void 0!==this.forwardWasDroppingAuthor?this.forwardWasDroppingAuthor?i.hideSender:i.showSender:t?i.showSender:i.hideSender,s.checkboxField.checked=!0}}].forEach((e=>{const t=(0,ga.Z)(e.elements.map((e=>({container:e,input:e.querySelector("input")}))),e.onChange),i=document.createElement("hr");t.append(i),a.append(t)})),a.append(i.changePeer.element),c.Z||(this.forwardHover=new aa.Z({element:a})),i.modifyArgs=n.slice(0,-1),this.replyElements.container.append(a),i.modifyArgs.forEach(((e,t)=>{const{input:i}=e.checkboxField;i.type="radio",i.name=t<2?"author":"caption",i.value=""+ +!(t%2)})),this.newMessageWrapper=document.createElement("div"),this.newMessageWrapper.classList.add("new-message-wrapper"),this.replyInTopicOverlay=document.createElement("div"),this.replyInTopicOverlay.classList.add("reply-in-topic-overlay","hide"),this.replyInTopicOverlay.append((0,C.ag)("Chat.Input.ReplyToAnswer")),this.btnToggleEmoticons=(0,On.Z)("none toggle-emoticons",{noRipple:!0}),this.inputMessageContainer=document.createElement("div"),this.inputMessageContainer.classList.add("input-message-container"),this.goDownUnreadBadge=document.createElement("span"),this.goDownUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goDownBtn.append(this.goDownUnreadBadge),this.goMentionBtn=(0,Gn.Z)({icon:"mention",className:"bubbles-corner-button chat-secondary-button bubbles-go-mention"}),this.goMentionUnreadBadge=document.createElement("span"),this.goMentionUnreadBadge.classList.add("badge","badge-24","badge-primary"),this.goMentionBtn.append(this.goMentionUnreadBadge),this.inputContainer.append(this.goMentionBtn),(0,S.fc)(this.goMentionBtn,(e=>{(0,Ce.Z)(e);const t=this.chat.bubbles.getMiddleware();this.managers.appMessagesManager.goToNextMention(this.chat.peerId,this.chat.threadId).then((e=>{t()&&e&&this.chat.setMessageId(e)}))}),{listenerSetter:this.listenerSetter}),this.btnScheduled=(0,On.Z)("scheduled btn-scheduled float hide",{noRipple:!0}),(0,S.fc)(this.btnScheduled,(e=>{this.appImManager.openScheduled(this.chat.peerId)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(d.Z)("scheduled_new",(({peerId:e})=>{this.chat.peerId===e&&this.btnScheduled.classList.remove("hide")})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:e})=>{this.chat.peerId===e&&this.managers.appMessagesManager.getScheduledMessages(this.chat.peerId).then((e=>{this.btnScheduled.classList.toggle("hide",!e.length)}))})),this.btnToggleReplyMarkup=(0,On.Z)("botcom toggle-reply-markup float hide",{noRipple:!0}),this.replyKeyboard=new ra({appendTo:this.rowsWrapper,listenerSetter:this.listenerSetter,managers:this.managers,btnHover:this.btnToggleReplyMarkup,chatInput:this}),this.listenerSetter.add(this.replyKeyboard)("open",(()=>this.btnToggleReplyMarkup.classList.add("active"))),this.listenerSetter.add(this.replyKeyboard)("close",(()=>this.btnToggleReplyMarkup.classList.remove("active"))),this.botCommands=new va(this.rowsWrapper,this,this.managers),this.botCommandsToggle=document.createElement("div"),this.botCommandsToggle.classList.add("new-message-bot-commands");const r=document.createElement("div");r.classList.add("new-message-bot-commands-icon-scale");const l=this.botCommandsIcon=document.createElement("div");l.classList.add("animated-menu-icon","animated-menu-close-icon"),r.append(l),this.botCommandsToggle.append(r),(0,S.fc)(this.botCommandsToggle,(e=>{(0,Ce.Z)(e),l.classList.contains("state-back")?(this.botCommands.toggle(!0),l.classList.remove("state-back")):(this.botCommands.setUserId(this.chat.peerId.toUserId(),this.chat.bubbles.getMiddleware()),l.classList.add("state-back"))}),{listenerSetter:this.listenerSetter}),this.botCommands.addEventListener("visible",(()=>{l.classList.add("state-back")})),this.botCommands.addEventListener("hiding",(()=>{l.classList.remove("state-back")})),this.attachMenuButtons=[{icon:"image",text:"Chat.Input.Attach.PhotoOrVideo",onClick:()=>{this.fileInput.value="";const e=[...vn.Z].join(", ");this.fileInput.setAttribute("accept",e),this.willAttachType="media",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"document",text:"Chat.Input.Attach.Document",onClick:()=>{this.fileInput.value="",this.fileInput.removeAttribute("accept"),this.willAttachType="document",this.fileInput.click()},verify:()=>this.chat.canSend("send_media")},{icon:"poll",text:"Poll",onClick:()=>{w.Z.createPopup(pn,this.chat).show()},verify:()=>(this.chat.peerId.isAnyChat()||this.chat.isBot)&&this.chat.canSend("send_polls")}];const h=this.attachMenuButtons.slice();this.attachMenu=(0,Un.Z)({buttonOptions:{noRipple:!0},listenerSetter:this.listenerSetter,direction:"top-left",buttons:this.attachMenuButtons,onOpenBefore:()=>Ba(this,void 0,void 0,(function*(){const e=yield this.managers.appAttachMenuBotsManager.getAttachMenuBots(),t=h.slice(),i=e.filter((e=>!e.pFlags.inactive)).map((e=>{const t=(0,Ra.Z)(e);return{regularText:(0,R.Z)(e.short_name),onClick:()=>{this.managers.appAttachMenuBotsManager.requestWebView(Object.assign({botId:e.bot_id,peerId:this.chat.peerId},this.chat.getMessageSendingParams())).then((t=>{const i=["allow-scripts","allow-same-origin","allow-popups","allow-forms","allow-modals","allow-storage-access-by-user-activation"].join(" ");class s extends w.Z{constructor(t){super("popup-payment popup-payment-verification",{closable:!0,overlayClosable:!0,body:!0,titleRaw:e.short_name}),this.url=t,this.d()}destroy(){return this.telegramWebView.destroy(),super.destroy()}d(){const e=this.telegramWebView=new wi({url:this.url,sandbox:i});e.iframe.classList.add("payment-verification"),this.body.append(e.iframe),this.show(),e.onMount()}}new s(t.url)}))},iconDoc:null==t?void 0:t.icon,verify:()=>Ba(this,void 0,void 0,(function*(){let t=!1;const i={attachMenuPeerTypeSameBotPM:()=>this.chat.peerId.toUserId()===e.bot_id,attachMenuPeerTypeBotPM:()=>this.chat.isBot,attachMenuPeerTypePM:()=>this.chat.peerId.isUser(),attachMenuPeerTypeChat:()=>this.chat.isAnyGroup,attachMenuPeerTypeBroadcast:()=>this.chat.isBroadcast};for(const s of e.peer_types){const e=i[s._];if(t=yield e(),t)break}return t}))}}));t.splice(t.length,0,...i),this.attachMenuButtons.splice(0,this.attachMenuButtons.length,...t)}))}),this.attachMenu.classList.add("attach-file","tgico-attach"),this.attachMenu.classList.remove("tgico-more"),this.recordTimeEl=document.createElement("div"),this.recordTimeEl.classList.add("record-time"),this.fileInput=document.createElement("input"),this.fileInput.type="file",this.fileInput.multiple=!0,this.fileInput.style.display="none",this.newMessageWrapper.append(...[this.botCommandsToggle,this.btnToggleEmoticons,this.inputMessageContainer,this.btnScheduled,this.btnToggleReplyMarkup,this.attachMenu,this.recordTimeEl,this.fileInput].filter(Boolean)),this.rowsWrapper.append(this.replyElements.container),this.autocompleteHelperController=new ea,this.stickersHelper=new Nn(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.managers),this.emojiHelper=new qn(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.commandsHelper=new Jn(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.mentionsHelper=new sa(this.rowsWrapper,this.autocompleteHelperController,this,this.managers),this.inlineHelper=new pa(this.rowsWrapper,this.autocompleteHelperController,this.chat,this.managers),this.rowsWrapper.append(this.newMessageWrapper),this.btnCancelRecord=(0,On.Z)("binfilled btn-circle btn-record-cancel chat-secondary-button"),this.btnSendContainer=document.createElement("div"),this.btnSendContainer.classList.add("btn-send-container"),this.recordRippleEl=document.createElement("div"),this.recordRippleEl.classList.add("record-ripple"),this.btnSend=(0,On.Z)("none btn-circle btn-send animated-button-icon"),this.btnSend.insertAdjacentHTML("afterbegin",'\n \n \n \n \n '),this.btnSendContainer.append(this.recordRippleEl,this.btnSend),this.sendMenu=new ln({onSilentClick:()=>{this.sendSilent=!0,this.sendMessage()},onScheduleClick:()=>{this.scheduleSending(void 0)},listenerSetter:this.listenerSetter,openSide:"top-left",onContextElement:this.btnSend,onOpen:()=>!("scheduled"===this.chat.type||this.isInputEmpty()&&!Object.keys(this.forwarding).length)}),this.btnSendContainer.append(this.sendMenu.sendMenu),this.inputContainer.append(this.btnCancelRecord,this.btnSendContainer),It.ZP.attachButtonListener(this.btnToggleEmoticons,this.listenerSetter),this.listenerSetter.add(It.ZP)("open",this.onEmoticonsOpen),this.listenerSetter.add(It.ZP)("close",this.onEmoticonsClose),this.attachMessageInputField(),this.listenerSetter.add(d.Z)("settings_updated",(()=>{var e;(this.stickersHelper||this.emojiHelper)&&(this.previousQuery="",this.checkAutocomplete()),null===(e=this.messageInputField)||void 0===e||e.onFakeInput()})),this.listenerSetter.add(d.Z)("draft_updated",(({peerId:e,threadId:t,draft:i,force:s})=>{this.chat.threadId===t&&this.chat.peerId===e&&"scheduled"!==this.chat.type&&this.setDraft(i,!0,s)})),this.listenerSetter.add(this.appImManager)("peer_changing",(e=>{this.chat!==e||"chat"!==this.chat.type&&"discussion"!==this.chat.type||this.saveDraft()})),this.listenerSetter.add(this.appImManager)("chat_changing",(({from:e,to:t})=>{this.chat===e?this.autocompleteHelperController.toggleListNavigation(!1):this.chat===t&&this.autocompleteHelperController.toggleListNavigation(!0)})),this.listenerSetter.add(d.Z)("scheduled_delete",(({peerId:e,mids:t})=>{"scheduled"===this.chat.type&&this.chat.peerId===e&&t.includes(this.editMsgId)&&this.onMessageSent()})),this.listenerSetter.add(d.Z)("history_delete",(({peerId:e,msgs:t})=>{this.chat.peerId===e&&"scheduled"!==this.chat.type&&(t.has(this.editMsgId)&&this.onMessageSent(),this.replyToMsgId&&t.has(this.replyToMsgId)&&this.clearHelper("reply"))})),this.listenerSetter.add(d.Z)("dialogs_multiupdate",(e=>{!e.has(this.chat.peerId)||"chat"!==this.chat.type&&"discussion"!==this.chat.type||(this.startParam===m.gZ?this.setStartParam():this.center(!0))}));try{this.recorder=new(rn())({encoderSampleRate:48e3,monitorGain:0,numberOfChannels:1,recordingGain:1,reuseWorker:!0})}catch(e){console.error("Recorder constructor error:",e)}this.updateSendBtn(),this.listenerSetter.add(this.fileInput)("change",(e=>{const t=e.target.files;t.length&&(w.Z.createPopup(Zn,this.chat,Array.from(t).slice(),this.willAttachType),this.fileInput.value="")}),!1),(0,S.fc)(this.btnSend,this.onBtnSendClick,{listenerSetter:this.listenerSetter,touchMouseDown:!0}),this.recorder&&((0,S.fc)(this.btnCancelRecord,this.onCancelRecordClick,{listenerSetter:this.listenerSetter}),this.recorder.onstop=()=>{this.setRecording(!1),this.chatInput.classList.remove("is-locked"),this.recordRippleEl.style.transform=""},this.recorder.ondataavailable=e=>{if(this.releaseMediaPlayback&&(this.releaseMediaPlayback(),this.releaseMediaPlayback=void 0),this.recordingOverlayListener&&(this.listenerSetter.remove(this.recordingOverlayListener),this.recordingOverlayListener=void 0),this.recordingNavigationItem&&(Dn.Z.removeItem(this.recordingNavigationItem),this.recordingNavigationItem=void 0),this.recordCanceled)return;const{peerId:t,threadId:i}=this.chat,s=this.replyToMsgId,n=(Date.now()-this.recordStartTime)/1e3|0,a=new Blob([e],{type:"audio/ogg"});dn.Z.decode(e,!0).then((e=>{dn.Z.setKeepAlive(!1),this.managers.appMessagesManager.sendFile(t,{file:a,isVoiceMessage:!0,isMedia:!0,duration:n,waveform:e.waveform,objectURL:e.url,replyToMsgId:s,threadId:i,clearDraft:!0}),this.onMessageSent(!1,!0)}))}),(0,S.fc)(this.replyElements.cancelBtn,this.onHelperCancel,{listenerSetter:this.listenerSetter}),(0,S.fc)(this.replyElements.container,this.onHelperClick,{listenerSetter:this.listenerSetter}),this.saveDraftDebounced=(0,Ze.Z)((()=>this.saveDraft()),2500,!1,!0),this.botStartBtn=(0,Ue.Z)("btn-primary btn-transparent text-bold chat-input-control-button"),this.botStartBtn.append((0,C.ag)("BotStart")),(0,S.fc)(this.botStartBtn,(()=>{const{startParam:e}=this;if(void 0===e)return;const t=this.toggleBotStartBtnDisability=(0,Ut.Z)([this.botStartBtn],!0),i=this.chat.peerId,s=this.chat.bubbles.getMiddleware((()=>this.chat.peerId===i&&this.startParam===e&&this.toggleBotStartBtnDisability===t));this.managers.appMessagesManager.startBot(i.toUserId(),void 0,e).then((()=>{s()&&(t(),this.toggleBotStartBtnDisability=void 0,this.setStartParam())}))}),{listenerSetter:this.listenerSetter}),this.controlContainer.append(this.botStartBtn,this.replyInTopicOverlay),this.pinnedControlBtn=(0,Ue.Z)("btn-primary btn-transparent text-bold chat-input-control-button",{icon:"unpin"}),this.controlContainer.append(this.pinnedControlBtn),this.listenerSetter.add(this.pinnedControlBtn)("click",(()=>{const e=this.chat.peerId;new As(e,0,!0,(()=>{this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}))}))}_center(e,t){if(!e&&!this.inputContainer.classList.contains("is-centering"))return;if(e===this.fakeWrapperTo)return;const i=e||this.fakeWrapperTo,s=!!e,n=this.fakeWrapperTo;let a,o="",r="";const d=i.getBoundingClientRect(),l=this.fakeRowsWrapper.getBoundingClientRect(),c=l.width,h=d.width;if(c!==h){const e=h/c,t=(c-h)/2;if(a=d.left-l.left-t,s&&(o=`translateX(${a}px) scaleX(${e})`,e<1)){const t=16;r=t+t*(1-e)+"px"}}this.fakeWrapperTo=e;const u=t?200:0;return(0,Fe.Z)({element:this.inputContainer,className:"is-centering",forwards:s,duration:u}),(0,Fe.Z)({element:this.rowsWrapperWrapper,className:"is-centering-to-control",forwards:!!(s&&e&&e.classList.contains("chat-input-control")),duration:u}),this.rowsWrapper.style.transform=o,this.rowsWrapper.style.borderRadius=r,{transform:o,borderRadius:r,needTranslateX:n&&(e&&e.classList.contains("chat-input-control")&&n===this.fakeSelectionWrapper||n.classList.contains("chat-input-control"))?-.5*a:a,widthFrom:c,widthTo:h}}center(e=!1){return Ba(this,void 0,void 0,(function*(){return this._center(yield this.getNeededFakeContainer(),e)}))}setStartParam(e){this.startParam!==e&&(this.startParam=e,this.center(!0))}isReplyInTopicOverlayNeeded(){return this.chat.isForum&&!this.chat.isForumTopic&&!this.replyToMsgId&&"chat"===this.chat.type}getNeededFakeContainer(e=this.startParam){return Ba(this,void 0,void 0,(function*(){return this.chat.selection.isSelecting?this.fakeSelectionWrapper:void 0!==e||!(yield this.chat.canSend())||"pinned"===this.chat.type||(yield this.chat.isStartButtonNeeded())||this.isReplyInTopicOverlayNeeded()?this.controlContainer:void 0}))}getReadyToSend(e){return"scheduled"===this.chat.type?(this.scheduleSending(e),!0):(e(),!1)}setUnreadCount(){return Ba(this,void 0,void 0,(function*(){if(!this.goDownUnreadBadge)return;const e=yield this.managers.dialogsStorage.getDialogOrTopic(this.chat.peerId,"discussion"===this.chat.type?void 0:this.chat.threadId),t=null==e?void 0:e.unread_count;if(this.goDownUnreadBadge.innerText=""+(t||""),this.goDownUnreadBadge.classList.toggle("badge-gray",yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.chat.peerId,respectType:!0,threadId:this.chat.threadId})),this.goMentionUnreadBadge&&"chat"===this.chat.type){const t=!(!(null==e?void 0:e.unread_mentions_count)||!e.unread_count);this.goMentionUnreadBadge.innerText=t?""+e.unread_mentions_count:"",this.goMentionBtn.classList.toggle("is-visible",t)}}))}getCurrentInputAsDraft(){const{value:e,entities:t}=(0,hn.Z)(this.messageInputField.input,!0,!1);let i;return(e.length||this.replyToMsgId)&&(i={_:"draftMessage",date:(0,Ht.Z)(!0),message:e,entities:t.length?t:void 0,pFlags:{no_webpage:this.noWebPage},reply_to_msg_id:this.replyToMsgId}),i}saveDraft(){if(!this.chat.peerId||this.editMsgId||"scheduled"===this.chat.type)return;const e=this.getCurrentInputAsDraft();this.managers.appDraftsManager.syncDraft(this.chat.peerId,this.chat.threadId,e)}destroy(){this.listenerSetter.removeAll()}cleanup(e=!0){this.chat.peerId||(this.chatInput.classList.add("hide"),this.goDownBtn.classList.add("hide")),(0,Kn.Z)(),this.lastTimeType=0,this.startParam=void 0,this.toggleBotStartBtnDisability&&(this.toggleBotStartBtnDisability(),this.toggleBotStartBtnDisability=void 0),this.messageInput&&(this.clearInput(),e&&this.clearHelper())}setDraft(e,t=!0,i=!1){return Ba(this,void 0,void 0,(function*(){if(!i&&!(0,cn.Z)(this.messageInput)||"scheduled"===this.chat.type)return!1;if(!e&&!(e=yield this.managers.appDraftsManager.getDraft(this.chat.peerId,this.chat.threadId)))return i&&(this.chat.container.classList.contains("is-helper-active")&&this.t(),this.messageInputField.inputFake.textContent="",this.messageInputField.onFakeInput(!1),(this.chat.bubbles.messagesQueuePromise||Promise.resolve()).then((()=>{(0,pe.T2)((()=>{this.onMessageSent()}))}))),!1;const s=function(e,t,i){const s=(0,Sa.Z)(e.message),n=e.entities||[],a=(0,wa.Z)(n.slice(),s);return(0,La.Z)(e.message,{entities:a,wrappingForPeerId:t,loadPromises:void 0})}(e,this.chat.peerId),n=this.getCurrentInputAsDraft();return!((0,Da.Z)(e,n)&&this.replyToMsgId===e.reply_to_msg_id||(t&&this.clearHelper(),this.noWebPage=e.pFlags.no_webpage,e.reply_to_msg_id&&this.initMessageReply(e.reply_to_msg_id),this.setInputValue(s,t,t),0))}))}createSendAs(){if(this.sendAsPeerId=void 0,"chat"===this.chat.type||"discussion"===this.chat.type){let e=!0;this.sendAs=new Za(this.managers,((e,t)=>{let i=0;e.parentElement||(this.newMessageWrapper.prepend(e),i=2),this.updateOffset("as",!0,t,i)}),(t=>{this.sendAsPeerId=t,e?e=!1:this.getPlaceholderKey().then((e=>{this.updateMessageInputPlaceholder(e)}))}))}else this.sendAs=void 0;return this.sendAs}finishPeerChange(e){return Ba(this,void 0,void 0,(function*(){const t=this.chat.peerId,{forwardElements:i,btnScheduled:s,replyKeyboard:n,sendMenu:a,goDownBtn:o,chatInput:r,botCommandsToggle:d}=this,l=this.sendAs,c=this.createSendAs(),[h,u,p,f,m,g,v,b,y]=yield Promise.all([this.managers.appPeersManager.isBroadcast(t),this.managers.appPeersManager.canPinMessage(t),this.managers.appPeersManager.isBot(t),this.chat.canSend(),this.getNeededFakeContainer(e),Ia(this.managers.acknowledged.appProfileManager.getProfileByPeerId(t)),s?Ia(this.managers.acknowledged.appMessagesManager.getScheduledMessages(t)):void 0,c?(c.setPeerId(this.chat.peerId),c.updateManual(!0)):void 0,this.filterAttachMenuButtons()]),w=this.messageInput?yield this.getPlaceholderKey():void 0;return()=>{var c;if(r.classList.remove("hide"),o.classList.toggle("is-broadcast",h),o.classList.remove("hide"),null===(c=this.messageInputField)||void 0===c||c.onFakeInput(),this.goDownUnreadBadge&&this.setUnreadCount(),"pinned"===this.chat.type&&r.classList.toggle("can-pin",u),i&&(this.forwardWasDroppingAuthor=!1,i.showCaption.checkboxField.setValueSilently(!0),i.showSender.checkboxField.setValueSilently(!0)),s&&v){s.classList.add("hide");const e=this.chat.bubbles.getMiddleware();(0,Ke.Z)(v.result,(t=>{e()&&t&&s.classList.toggle("hide",!t.length)}))}if(this.newMessageWrapper&&this.updateOffset(null,!1,!0),d&&(this.hasBotCommands=void 0,this.botCommands.toggle(!0,void 0,!0),this.updateBotCommandsToggle(!0),d.remove(),p)){const e=this.chat.bubbles.getMiddleware(),t=g.result;(0,Ke.Z)(t,(i=>{e()&&this.updateBotCommands(i,!(t instanceof Promise))}))}l&&l.destroy(),b&&b(),n&&n.setPeer(t),a&&a.setPeerId(t),this.messageInput&&(this.updateMessageInput(f,w,y),this.messageInput.dataset.peerId=""+t);let S=!1;if(this.pinnedControlBtn){const e="pinned"===this.chat.type;S||(S=e),this.pinnedControlBtn.classList.toggle("hide",!e),this.pinnedControlBtn.replaceChildren((0,C.ag)(u?"Chat.Input.UnpinAll":"Chat.Pinned.DontShow"))}{const e=this.chat.isForum&&!this.chat.isForumTopic&&"chat"===this.chat.type;S||(S=e),this.replyInTopicOverlay.classList.toggle("hide",!e)}this.botStartBtn.classList.toggle("hide",S),this.startParam=e,this._center(m,!1)}}))}updateOffset(e,t,i,s){e?this.newMessageWrapper.dataset.offset=e:delete this.newMessageWrapper.dataset.offset,(0,Fe.Z)({element:this.newMessageWrapper,className:"has-offset",forwards:t,duration:i?0:300,useRafs:s})}updateBotCommands(e,t){var i,s;this.hasBotCommands=!!(null===(s=null===(i=e.bot_info)||void 0===i?void 0:i.commands)||void 0===s?void 0:s.length),this.updateBotCommandsToggle(t)}updateBotCommandsToggle(e){const{botCommandsToggle:t,hasBotCommands:i}=this,s=!!i&&this.isInputEmpty();if(!i){if(!t.parentElement)return;t.remove()}const n=s,a=t.parentElement?0:2;t.parentElement||this.newMessageWrapper.prepend(t),this.updateOffset("commands",n,e,a)}getPlaceholderKey(){return Ba(this,void 0,void 0,(function*(){const{peerId:e,threadId:t,isForum:i}=this.chat;let s;return s=t&&!i?"Comment":(yield this.managers.appPeersManager.isBroadcast(e))?"ChannelBroadcast":void 0!==this.sendAsPeerId&&this.sendAsPeerId!==d.Z.myId||(yield this.managers.appMessagesManager.isAnonymousSending(e))?"SendAnonymously":"Message",s}))}updateMessageInputPlaceholder(e){const t=C.ZP.weakMap.get(this.messageInput);t&&t.compareAndUpdate({key:e})}filterAttachMenuButtons(){if(this.attachMenuButtons)return(0,en.Z)(this.attachMenuButtons,(e=>e.verify()))}updateMessageInput(e,t,i){const{chatInput:s,attachMenu:n,messageInput:a}=this,{peerId:o,threadId:r}=this.chat;s.classList.contains("is-hidden")!==!e&&(s.classList.add("no-transition"),s.classList.toggle("is-hidden",!e),s.offsetLeft,s.classList.remove("no-transition")),this.updateMessageInputPlaceholder(t),e?(a.contentEditable="true",this.setDraft(void 0,!1),a.innerHTML||this.messageInputField.onFakeInput()):a.contentEditable="inherit",n&&(n.toggleAttribute("disabled",!i.length),n.classList.toggle("btn-disabled",!i.length)),this.updateSendBtn()}attachMessageInputField(){const e=this.messageInputField;this.messageInputField=new Aa({placeholder:"Message",name:"message",withLinebreaks:!0}),this.messageInputField.input.classList.replace("input-field-input","input-message-input"),this.messageInputField.inputFake.classList.replace("input-field-input","input-message-input"),this.messageInput=this.messageInputField.input,this.messageInput.classList.add("no-scrollbar"),this.attachMessageInputListeners(),fa.T&&(0,fa.Z)(this.messageInput),e?(e.input.replaceWith(this.messageInputField.input),e.inputFake.replaceWith(this.messageInputField.inputFake)):this.inputMessageContainer.append(this.messageInputField.input,this.messageInputField.inputFake)}attachMessageInputListeners(){this.listenerSetter.add(this.messageInput)("keydown",(e=>{const t=e.key;if((0,Wn.Z)(e))(0,Ce.Z)(e),this.sendMessage();else if(e.ctrlKey||e.metaKey)this.handleMarkdownShortcut(e);else if(("PageUp"===t||"PageDown"===t)&&!e.shiftKey)if(e.preventDefault(),"PageUp"===t){const e=document.createRange(),t=window.getSelection();e.setStart(this.messageInput.childNodes[0]||this.messageInput,0),e.collapse(!0),t.removeAllRanges(),t.addRange(e)}else(0,Nt.Z)(this.messageInput)})),c.Z&&(0,S.fc)(this.messageInput,(e=>{if(It.ZP.isActive())return It.ZP.toggle(!1),(0,Vn.Z)(),void(0,Ce.Z)(e);this.appImManager.selectTab(qr.CHAT)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.messageInput)("input",this.onMessageInput),this.listenerSetter.add(this.messageInput)("keyup",(()=>{this.checkAutocomplete()})),this.listenerSetter.add(this.messageInput)("focusin",(()=>{"chat"!==this.chat.type&&"discussion"!==this.chat.type||!this.chat.bubbles.scrollable.loadedAll.bottom||this.managers.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId)}))}applyMarkdown(e,t){const i={link:t?()=>document.execCommand("createLink",!1,t):()=>document.execCommand("unlink",!1,null)},s=e=>{i[e]=()=>{const t=(n.includes(e)?n:[e]).filter((e=>l[e]));return(0,h.Z)(t,e)||t.push(e),t.length?document.execCommand("fontName",!1,"markup-"+t.join("-")):this.resetCurrentFontFormatting()}},n=["bold","italic","underline","strikethrough","spoiler"];if(n.forEach((e=>{s(e)})),s("monospace"),!i[e])return!1;const a=i[e],o=[],r=ka.Z.getInstance().prepareApplyingMarkdown(),d=this.listenerSetter.add(this.messageInput)("input",Ce.Z,{capture:!0,passive:!1});o.push(document.execCommand("styleWithCSS",!1,"true"));const l=Fa(Object.keys(i));return l.monospace&&"link"===e&&o.push(this.resetCurrentFormatting()),o.push("function"==typeof a?a():document.execCommand(a,!1,null)),o.push(document.execCommand("styleWithCSS",!1,"false")),r(),this.appImManager.markupTooltip&&this.appImManager.markupTooltip.setActiveMarkupButton(),this.listenerSetter.remove(d),this.messageInputField.simulateInputEvent(),!0}resetCurrentFormatting(){return document.execCommand("removeFormat",!1,null)}resetCurrentFontFormatting(){return document.execCommand("fontName",!1,"Roboto")}insertAtCaret(e,t,i=!0){ka.Z.getInstance().makeFocused(this.messageInput);const{value:s,caretPos:n,entities:a}=(0,hn.Z)(this.messageInput),o=n>=0?n:s.length,r=s.substr(0,o),d=(s.substr(o),i?r.match(Oa.AUTO_COMPLETE_REG_EXP):null),l=d?d.index+(d[0].length-d[2].length):r.length;if(r.slice(0,l),i&&-1!==n){const e=d[2],t=document.getSelection();let i=0;for(;t.toString()!==e;){if(++i>=1e4)throw new Error("lolwhat");t.modify("extend","backward","character")}}(0,L.rf)(this.messageInput,e,t?[t]:void 0,this.chat.peerId)}checkAutocomplete(e,t,i){return Ba(this,void 0,void 0,(function*(){if(void 0===e){const s=(0,hn.Z)(this.messageInputField.input,!0,!0);e=s.value,t=s.caretPos,i=s.entities}if(-1===t&&(t=e.length),void 0===i){const t=(0,Ca.Z)(e,i,!0);i=(0,wa.Z)(i,(0,Sa.Z)(t))}if(e=e.slice(0,t),this.previousQuery===e)return;this.previousQuery=e;const s=e.match(Oa.AUTO_COMPLETE_REG_EXP);let n;if(s){const t=i[0];let a=s[2];const o=a[0];if(this.stickersHelper&&d.Z.settings.stickers.suggest&&(yield this.chat.canSend("send_stickers"))&&"messageEntityEmoji"===(null==t?void 0:t._)&&t.length===e.length&&!t.offset)n=this.stickersHelper,this.stickersHelper.checkEmoticon(e);else if("@"===o){const e=this.chat.threadId?(0,bt.Z)(this.chat.threadId):void 0;(yield this.mentionsHelper.checkQuery(a,this.chat.peerId.isUser()?m.NM:this.chat.peerId,e))&&(n=this.mentionsHelper)}else s[1]||"/"!==o?d.Z.settings.emoji.suggest&&(a=a.replace(/^\s*/,""),e.match(/^\s*:(.+):\s*$/)||e.match(/:[;!@#$%^&*()-=|]/)||!a||(n=this.emojiHelper,this.emojiHelper.checkQuery(a,o))):(yield this.commandsHelper.checkQuery(a,this.chat.peerId))&&(n=this.commandsHelper)}n=this.checkInlineAutocomplete(e,n),this.autocompleteHelperController.hideOtherHelpers(n)}))}checkInlineAutocomplete(e,t){let i=!1;const s=e=>{this.btnPreloader&&(0,Fe.Z)({element:this.btnPreloader,className:"show",forwards:e,duration:400})};if(!t){const n=e.match(/^@([a-zA-Z\\d_]{3,32})\s/);if(n){const a=n[1],o=e.slice(n[0].length);i=n[0].length===e.length,t=this.inlineHelper,this.btnPreloader?s(!0):(this.btnPreloader=(0,On.Z)("none btn-preloader float show disable-hover",{noRipple:!0}),(0,jt.y)(this.btnPreloader,!0),this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader,this.inputMessageContainer.nextSibling)),this.inlineHelper.checkQuery(this.chat.peerId,a,o).then((({user:e,renderPromise:t})=>{i&&e.bot_inline_placeholder&&(this.messageInput.dataset.inlinePlaceholder=e.bot_inline_placeholder),t.then((()=>{s(!1)}))})).catch((e=>{s(!1)}))}}return i||delete this.messageInput.dataset.inlinePlaceholder,t!==this.inlineHelper&&s(!1),t}setRecording(e){this.recording!==e&&((0,Fe.Z)({element:this.chatInput,className:"is-recording",forwards:e,duration:200}),this.recording=e,this.updateSendBtn())}changeForwardRecipient(){if(this.helperWaitingForward)return;this.helperWaitingForward=!0;const e=(0,ba.Z)(this.forwarding),t=this.helperFunc;this.clearHelper(),this.updateSendBtn();let i=!1;new I.Z(e,(()=>{i=!0})).addEventListener("close",(()=>{this.helperWaitingForward=!1,i||t()}))}clearInput(e=!0,t=!0,i=""){return Ba(this,void 0,void 0,(function*(){if(document.activeElement===this.messageInput&&T.IS_MOBILE_SAFARI){const e=document.createElement("input");document.body.append(e),(0,na.Z)(e),this.messageInputField.setValueSilently(i),(0,na.Z)(this.messageInput),e.remove()}else this.messageInputField.setValueSilently(i);c.Z||(this.canRedoFromHTML="",this.undoHistory.length=0,this.executedHistory.length=0,this.canUndoFromHTML="");let s=!1;e&&(s=yield this.setDraft(void 0,!1)),!s&&t&&this.onMessageInput()}))}isInputEmpty(){return(0,cn.Z)(this.messageInput)}updateSendBtn(){let e;const t=this.isInputEmpty();e=this.editMsgId?"edit":!this.recorder||this.recording||!t||this.forwarding?"scheduled"===this.chat.type?"schedule":"send":"record",["send","record","edit","schedule"].forEach((t=>{this.btnSend.classList.toggle(t,e===t)})),this.btnScheduled&&this.btnScheduled.classList.toggle("show",t&&"scheduled"!==this.chat.type),this.btnToggleReplyMarkup&&this.btnToggleReplyMarkup.classList.toggle("show",t&&"scheduled"!==this.chat.type)}getValueAndEntities(e){const{entities:t,value:i}=(0,hn.Z)(this.messageInput,!0,!1),s=(0,Sa.Z)(i);return{value:i,totalEntities:(0,wa.Z)(t,s)}}onMessageSent(e=!0,t){"scheduled"!==this.chat.type&&this.managers.appMessagesManager.readAllHistory(this.chat.peerId,this.chat.threadId,!0),this.scheduleDate=void 0,this.sendSilent=void 0;const{totalEntities:i}=this.getValueAndEntities(this.messageInput);let s=0;i.filter((e=>{if("messageEntityEmoji"===e._||"messageEntityCustomEmoji"===e._){const t=e.offset+e.length;return!(t<=s||(s=t,0))}return!1})).forEach((e=>{const t="messageEntityEmoji"===e._?{emoji:(0,Bs.zu)(e.unicode)}:{docId:e.document_id,emoji:""};this.managers.appEmojiManager.pushRecentEmoji(t)})),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null,this.clearInput()),(t||e)&&this.clearHelper(),this.updateSendBtn()}sendMessage(e=!1){const{editMsgId:t,chat:i}=this;if("scheduled"===i.type&&!e&&!t)return void this.scheduleSending();const{peerId:s}=i,{noWebPage:n}=this,a=this.chat.getMessageSendingParams(),{value:o,entities:r}=(0,hn.Z)(this.messageInputField.input,!0,!1);if(t){const e=this.editMessage;if(!o.trim()&&!e.media)return void new Ts.Z(s,[t],i.type);this.managers.appMessagesManager.editMessage(e,o,{entities:r,noWebPage:n}),this.onMessageSent()}else o.trim()&&(this.managers.appMessagesManager.sendText(s,o,Object.assign(Object.assign({entities:r},a),{noWebPage:n,webPage:this.getWebPagePromise?void 0:this.willSendWebPage,clearDraft:!0})),"scheduled"===this.chat.type?this.onMessageSent(!0):this.onMessageSent(!1,!1));if(this.forwarding){const e=(0,ba.Z)(this.forwarding);for(const t in e)this.managers.appMessagesManager.forwardMessages(s,t.toPeerId(),e[t],Object.assign(Object.assign({},a),{dropAuthor:this.forwardElements&&this.forwardElements.hideSender.checkboxField.checked,dropCaptions:this.isDroppingCaptions()})).catch((e=>Ba(this,void 0,void 0,(function*(){"VOICE_MESSAGES_FORBIDDEN"===e.type&&(0,ye.bC)({langPackKey:"Chat.SendVoice.PrivacyError",langPackArguments:[yield(0,Vt.Z)({peerId:s})]})}))));o||this.onMessageSent()}}sendMessageWithDocument(e,t=!1,i=!1,s=!1){return Ba(this,void 0,void 0,(function*(){const n="sticker"===(e=yield this.managers.appDocsManager.getDoc(e)).type?"send_stickers":"gif"===e.type?"send_gifs":"send_media";return this.chat.peerId.isAnyChat()&&!(yield this.chat.canSend(n))?((0,ye.Am)(Na),!1):"scheduled"!==this.chat.type||t?!(!e||e.sticker&&(0,zi.Z)(e)&&!d.Z.premium||(this.managers.appMessagesManager.sendFile(this.chat.peerId,Object.assign(Object.assign({},this.chat.getMessageSendingParams()),{file:e,isMedia:!0,clearDraft:i,silent:s})),this.onMessageSent(i,!0),"sticker"===e.type&&this.managers.appStickersManager.saveRecentSticker(e.id),0)):(this.scheduleSending((()=>this.sendMessageWithDocument(e,!0,i,s))),!1)}))}canToggleHideAuthor(){const{forwardElements:e}=this;if(!e)return!1;const t=e.hideCaption.checkboxField;return!t.checked||(0,be.Z)(t.label,"FORM").classList.contains("hide")}isDroppingCaptions(){return!this.canToggleHideAuthor()}initMessageEditing(e){return Ba(this,void 0,void 0,(function*(){const t=yield this.chat.getMessage(e);let i=(0,La.Z)(t.message,{entities:t.totalEntities,wrappingForPeerId:this.chat.peerId});const s=()=>Ba(this,void 0,void 0,(function*(){const n=yield(0,G.Z)({message:t,usingMids:[t.mid]});this.setTopInfo("edit",s,(0,C.ag)("AccDescrEditing"),n,i,t),this.editMsgId=e,this.editMessage=t,i=void 0}));s()}))}initMessagesForward(e){const t=()=>Ba(this,void 0,void 0,(function*(){const i=Object.keys(e).map((e=>e.toPeerId())),s=new Set;let n=0,a=0;const o=i.map((t=>Ba(this,void 0,void 0,(function*(){const i=e[t],o=i.map((e=>Ba(this,void 0,void 0,(function*(){var i;const n=yield this.managers.appMessagesManager.getMessageByPeer(t,e);!(null===(i=n.fwd_from)||void 0===i?void 0:i.from_name)||n.fromId||n.fwdFromId?s.add("P"+n.fromId):s.add("N"+n.fwd_from.from_name),n.media&&n.message&&++a}))));yield Promise.all(o),n+=i.length}))));yield Promise.all(o);const r=s.size>2,l=[...s].map((e=>{const t=e[0];if(e=e.slice(1),"P"===t){const t=e.toPeerId();return t===d.Z.myId?(0,C.ag)("Chat.Accessory.Forward.You"):new B.Z({peerId:t,dialog:!1,onlyFirstName:r}).element}return r?e.split(" ")[0]:e})),{forwardElements:c}=this;(0,be.Z)(c.showCaption.checkboxField.label,"FORM").classList.toggle("hide",!a);const h=c.hideCaption.checkboxField.checked;a&&h?c.hideSender.checkboxField.setValueSilently(!0):void 0!==this.forwardWasDroppingAuthor&&(this.forwardWasDroppingAuthor?c.hideSender:c.showSender).checkboxField.setValueSilently(!0);const u=c.showSender.checkboxField.checked?"Chat.Accessory.Forward":"Chat.Accessory.Hidden",p=(0,C.ag)(u,[n]),f=document.createDocumentFragment();let m,g;if(l.length<3?f.append(...(0,C.v_)(l,!1)):f.append(l[0],(0,C.ag)("AndOther",[l.length-1])),1===i.length){const t=i[0],s=e[t];if(m=yield this.managers.appMessagesManager.getMessageByPeer(t,s[0]),g=!!m.grouped_id,g){const e=yield this.managers.appMessagesManager.getMidsByMessage(m);(e.length!==n||e.find((e=>!s.includes(e))))&&(g=!1)}}const v=document.createDocumentFragment();if(g||1===n){const t=e[i[0]],s=yield(0,G.Z)({message:m,usingMids:t});v.append(f,": ",s)}else v.append((0,C.ag)("Chat.Accessory.Forward.From"),": ",f);const b=this.setTopInfo("forward",t,p,v);c.modifyArgs.forEach(((e,t)=>{const s=e.textElement,n=C.ZP.weakMap.get(s);n.args=[t<2?i.length:a],n.update()})),this.forwardHover&&this.forwardHover.attachButtonListener(b,this.listenerSetter),this.forwarding=e}));t()}initMessageReply(e){return Ba(this,void 0,void 0,(function*(){if(this.replyToMsgId===e)return;let t=yield this.chat.getMessage(e);const i=()=>{let s;t?s=new B.Z({peerId:t.fromId,dialog:!1}).element:(s=(0,C.ag)("Loading"),this.managers.appMessagesManager.reloadMessages(this.chat.peerId,e).then((s=>{this.replyToMsgId===e&&(t=s,t?i():this.clearHelper("reply"))}))),this.setTopInfo("reply",i,s,t&&t.message,void 0,t),this.setReplyToMsgId(e)};i()}))}setReplyToMsgId(e){this.replyToMsgId=e,this.center(!0)}clearHelper(e){"edit"===this.helperType&&"edit"!==e&&this.clearInput(),e&&(this.lastUrl="",delete this.noWebPage,this.willSendWebPage=null),"reply"!==e&&(this.setReplyToMsgId(void 0),this.forwarding=void 0),this.editMsgId=this.editMessage=void 0,this.helperType=this.helperFunc=void 0,this.chat.container.classList.contains("is-helper-active")&&(Dn.Z.removeByType("input-helper"),this.chat.container.classList.remove("is-helper-active"),this.t())}t(){const e="is-toggling-helper";(0,Fe.Z)({element:this.chat.container,className:e,forwards:!0,duration:150,onTransitionEnd:()=>{this.chat.container.classList.remove(e)}})}setInputValue(e,t=!0,i=!0){e||(e=""),t?this.clearInput(!1,!1,e):this.messageInputField.setValueSilently(e),(0,pe.T2)((()=>{i&&(0,Nt.Z)(this.messageInput),this.onMessageInput(),this.messageInput.scrollTop=this.messageInput.scrollHeight}))}setTopInfo(e,t,i="",s="",n,a){if(this.willSendWebPage&&"reply"===e)return;"webpage"!==e&&(this.clearHelper(e),this.helperType=e,this.helperFunc=t);const o=this.replyElements.container,r=o.lastElementChild.previousElementSibling,d=r.classList.contains("reply");this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn=(0,On.Z)(("webpage"===e?"link":e)+" active reply-icon",{noRipple:!0}));const{container:l}=X(i,s,this.chat.animationGroup,a);return d?r.replaceWith(l):o.insertBefore(l,o.lastElementChild),"webpage"===e&&(l.style.cursor="default"),this.chat.container.classList.contains("is-helper-active")||(this.chat.container.classList.add("is-helper-active"),this.t()),T.IS_MOBILE||Dn.Z.pushItem({type:"input-helper",onPop:()=>{this.onHelperCancel()}}),void 0!==n&&this.setInputValue(n),setTimeout((()=>{this.updateSendBtn()}),0),l}}Oa.AUTO_COMPLETE_REG_EXP=/(\s|^)((?:(?:@|^\/)\S*)|(?::|^[^:@\/])(?!.*[:@\/]).*)$/;var Ua=i(6054);const Ha="pinned-container";class za{constructor(e){this.floating=!1,(0,Rn.Z)(this,e);const{divAndCaption:t,className:i}=this;t.container.classList.add(Ha,"hide"),t.title.classList.add(Ha+"-title"),t.subtitle.classList.add(Ha+"-subtitle"),t.content.classList.add(Ha+"-content"),this.btnClose=document.createElement("button"),this.btnClose.classList.add(Ha+"-close",`pinned-${i}-close`,"btn-icon","tgico-close"),this.wrapper=document.createElement("div"),this.wrapper.classList.add(Ha+"-wrapper"),(0,x.Z)(this.wrapper),this.wrapperUtils=document.createElement("div"),this.wrapperUtils.classList.add(Ha+"-wrapper-utils"),this.wrapperUtils.append(this.btnClose),this.wrapper.append(...Array.from(t.container.children),this.wrapperUtils),t.container.append(this.wrapper),this.attachOnCloseEvent(this.btnClose)}attachOnCloseEvent(e){(0,S.fc)(e,(e=>{(0,Ce.Z)(e),((this.onClose?this.onClose():null)||Promise.resolve(!0)).then((e=>{e&&this.toggle(!0)}))}),{listenerSetter:this.listenerSetter})}toggle(e){const t=this.divAndCaption.container.classList.contains("hide");if(void 0===e)e=!t;else if(e===t)return;const i=(this.floating||o.Z.isMobile)&&!e;this.divAndCaption.container.classList.toggle("is-floating",i),this.divAndCaption.container.classList.toggle("hide",e),this.topbar.container.classList.toggle("is-pinned-floating",i),this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`,!e),this.topbar.setFloating(),this.topbar.setUtilsWidth()}isVisible(){return!this.divAndCaption.container.classList.contains("hide")}isFloating(){return this.divAndCaption.container.classList.contains("is-floating")}fill(e,t,i){this.divAndCaption.container.dataset.peerId=""+i.peerId,this.divAndCaption.container.dataset.mid=""+i.mid,this.divAndCaption.fill(e,t,i),this.topbar.setUtilsWidth()}}var ja,Ga=i(7207),Va=i(8427);class Ka extends za{constructor(e,t,i){super({topbar:e,chat:t,listenerSetter:e.listenerSetter,className:"audio",divAndCaption:new j("pinned-audio",((e,t)=>{(0,U.Z)(this.divAndCaption.title,e),(0,U.Z)(this.divAndCaption.subtitle,t)})),onClose:()=>{ma.Z.stop()},floating:!0}),this.topbar=e,this.chat=t,this.managers=i,this.onPlaybackParams=e=>{this.fasterEl.classList.toggle("active",e.playbackRate>1),this.repeatEl.classList.remove("tgico-audio_repeat","tgico-audio_repeat_single"),this.repeatEl.classList.add(e.loop?"tgico-audio_repeat_single":"tgico-audio_repeat"),this.repeatEl.classList.toggle("active",e.loop||e.round)},this.onPause=()=>{this.toggleEl.classList.remove("flip-icon")},this.onStop=()=>{this.toggle(!0)},this.onMediaPlay=({doc:e,message:t,media:i,playbackParams:s})=>{var n,a;let o,r;const d="voice"!==e.type&&"round"!==e.type;if(d){const t=e.attributes.find((e=>"documentAttributeAudio"===e._));o=(0,R.Z)(null!==(a=null==t?void 0:t.title)&&void 0!==a?a:e.file_name),r=(null==t?void 0:t.performer)?(0,R.Z)(t.performer):(0,C.ag)("AudioUnknownArtist")}else o=new B.Z({peerId:t.fromId,fromName:null===(n=t.fwd_from)||void 0===n?void 0:n.from_name}).element,r=(0,A.OD)(t.date);this.fasterEl.classList.toggle("hide",d),this.repeatEl.classList.toggle("hide",!d),this.onPlaybackParams(s),this.volumeSelector.setVolume(),this.progressLine.setMedia(i),this.fill(o,r,t),this.toggleEl.classList.toggle("flip-icon",!i.paused),this.toggle(!1)},this.divAndCaption.border.remove();const s=(0,On.Z)("fast_rewind active",{noRipple:!0}),n=(0,On.Z)("fast_forward active",{noRipple:!0}),a=(e,t)=>{(0,S.fc)(e,(e=>{(0,Ce.Z)(e),t()}),{listenerSetter:this.topbar.listenerSetter})};a(s,(()=>{ma.Z.previous()})),a(n,(()=>{ma.Z.next()})),this.toggleEl=(0,On.Z)("",{noRipple:!0}),this.toggleEl.classList.add("active","pinned-audio-ico","tgico"),a(this.toggleEl,(()=>{ma.Z.toggle()})),this.wrapper.prepend(this.wrapper.firstElementChild,s,this.toggleEl,n),this.volumeSelector=new Va.Z(this.listenerSetter,!0);const o=document.createElement("div");o.classList.add("progress-line-container"),o.append(this.volumeSelector.container);const r=document.createElement("div");r.classList.add("pinned-audio-volume-tunnel"),this.volumeSelector.btn.classList.add("pinned-audio-volume","active"),this.volumeSelector.btn.prepend(r),this.volumeSelector.btn.append(o),this.repeatEl=(0,On.Z)("audio_repeat",{noRipple:!0}),a(this.repeatEl,(()=>{const e=ma.Z.getPlaybackParams();e.round?e.loop?(ma.Z.round=!1,ma.Z.loop=!1):ma.Z.loop=!ma.Z.loop:ma.Z.round=!0}));const d=this.fasterEl=(0,On.Z)("playback_2x",{noRipple:!0});a(d,(()=>{ma.Z.playbackRate=d.classList.contains("active")?1:1.75})),this.wrapperUtils.prepend(this.volumeSelector.btn,d,this.repeatEl);const l=document.createElement("div");l.classList.add("pinned-audio-progress-wrapper"),this.progressLine=new Ga.Z(void 0,void 0,!0,!0),this.progressLine.container.classList.add("pinned-audio-progress"),l.append(this.progressLine.container),this.wrapper.insertBefore(l,this.wrapperUtils),this.topbar.listenerSetter.add(ma.Z)("play",this.onMediaPlay),this.topbar.listenerSetter.add(ma.Z)("pause",this.onPause),this.topbar.listenerSetter.add(ma.Z)("stop",this.onStop),this.topbar.listenerSetter.add(ma.Z)("playbackParams",this.onPlaybackParams);const c=ma.Z.getPlayingDetails();c&&(this.onMediaPlay(c),this.onPlaybackParams(c.playbackParams))}destroy(){this.progressLine&&this.progressLine.removeListeners()}}!function(e){e[e.ONE=32]="ONE",e[e.TWO=15]="TWO",e[e.THREE=10]="THREE",e[e.FOUR=8]="FOUR",e[e.MORE=8]="MORE"}(ja||(ja={}));const Wa="pinned-message-border";class $a{constructor(){this.drawRect=(e,t,i,s,n)=>`M${e},${t+n}a${n},${n},0,0,1,${i},0v${s-2*n}a${n},${n},0,0,1,${-i},0Z`,this.getClipPath=(e,t,i)=>{let s="";if(2===i)s=this.drawRect(0,0,2,t,1)+this.drawRect(0,t+2,2,t,1);else for(let e=0;e{let i;return e<=1?i=ja.ONE:2===e?i=ja.TWO:3===e?i=ja.THREE:4===e?i=ja.FOUR:e>3&&(i=ja.MORE),i},this.getMarkHeight=(e,t)=>{let i;return e<=1?i=ja.ONE:2===e?i=ja.TWO:3===e?i=ja.THREE:4===e?i=ja.FOUR:e>3&&(i=ja.MORE),i},this.getMarkTranslateY=(e,t,i)=>1===i?0:2===i?e?t+1:0:3===i?e?1===e?t+1:2*t+2+1:0:(t+1)*e,this.getTrackTranslateY=(e,t,i,s)=>t<=4||e<=1?0:e>=t-2?s-ja.ONE-i:(e-2)*i+1*e,this.getTrackHeight=(e,t)=>e<=3?ja.ONE:t*e+1*(e-1)}render(e,t){if(this.border||(this.border=document.createElement("div"),this.border.classList.add(Wa),this.wrapper=document.createElement("div"),this.border.append(this.wrapper)),1===e)return this.count!==e&&(this.wrapper.className=Wa+"-wrapper-1",this.border.classList.remove(Wa+"-mask"),this.wrapper.innerHTML=this.wrapper.style.cssText=""),this.border;const i=this.getBarHeight(e,t),s=this.getMarkHeight(e,t),n=this.getTrackHeight(e,i),a=`clipPath_${e}`,o=this.getClipPath(a,i,e),r=this.getMarkTranslateY(t,i,e),d=this.getTrackTranslateY(t,e,i,n);return this.border.classList.toggle(Wa+"-mask",e>4),t<=1?(this.border.classList.add("mask-bottom"),this.border.classList.remove("mask-top")):t>=e-2?(this.border.classList.add("mask-top"),this.border.classList.remove("mask-bottom")):this.border.classList.add("mask-top","mask-bottom"),this.wrapper.className=Wa+"-wrapper",this.wrapper.style.cssText=`clip-path: url(#${a}); width: 2px; height: ${n}px; transform: translateY(-${d}px);`,this.svg||(this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.setAttributeNS(null,"height","0"),this.svg.setAttributeNS(null,"width","0"),this.defs=document.createElementNS("http://www.w3.org/2000/svg","defs"),this.defs.append(o),this.svg.append(this.defs),this.mark=document.createElement("div"),this.mark.classList.add(Wa+"-mark")),this.svg.parentElement||this.wrapper.append(this.svg,this.mark),this.mark.style.cssText=`height: ${s}px; transform: translateY(${r}px);`,this.count=e,this.index=t,this.border}}var qa=i(6724),Qa=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Ya{constructor(){this.rows={},this.container=document.createElement("div"),this.container.className=Ya.BASE_CLASS}getRow(e,t=!1){if(this.rows[e])return this.rows[e].element;const i=document.createElement("div"),s=!Object.keys(this.rows).length&&!t;return i.className=Ya.BASE_CLASS+"-row"+(s?"":" is-hiding hide"),this.rows[e]={element:i,new:!0},this.container.append(i),i}clearRow(e){this.rows[e]&&(this.rows[e].element.remove(),delete this.rows[e])}clearRows(e){this.clearTimeout&&clearTimeout(this.clearTimeout),this.clearTimeout=window.setTimeout((()=>{for(const t in this.rows)+t!==e&&this.clearRow(+t)}),Ya.DURATION)}setNewRow(e,t=!1){const i=this.rows[e];i.new&&(t?(i.element.classList.remove("hide"),i.element.offsetLeft):i.element.classList.remove("is-hiding","hide"),delete i.new),this.clearRows(e)}animate(e,t,i=e>t,s=!1){if(e===t)return this.setNewRow(e);const n=this.rows[e],a=this.rows[t];if(!a&&!s)return this.setNewRow(e);const o=["from-top","from-bottom"];i||o.reverse(),n.element.classList.add(o[0]),n.element.classList.remove(o[1]),a&&(a.element.classList.add(o[1]),a.element.classList.remove(o[0])),n.new&&this.setNewRow(e,!0),n.element.classList.toggle("is-hiding",!1),a&&a.element.classList.toggle("is-hiding",!0),this.clearRows(e)}}Ya.DURATION=200,Ya.BASE_CLASS="animated-super";class Xa{constructor(e=!1){this.reverse=e,this.decimals=[],this.previousNumber=0,this.container=document.createElement("div"),this.container.className=Xa.BASE_CLASS}getDecimal(e){if(this.decimals[e])return this.decimals[e];const t=document.createElement("div");t.className=Xa.BASE_CLASS+"-decimal";const i=document.createElement("div");i.className=Xa.BASE_CLASS+"-decimal-placeholder";const s=new Ya;return s.container.className=Xa.BASE_CLASS+"-decimal-wrapper",t.append(i,s.container),this.container.append(t),this.decimals[e]={container:t,placeholder:i,animatedSuper:s}}clear(e){this.clearTimeout&&clearTimeout(this.clearTimeout);const t=(""+e).length;t>=this.decimals.length||(this.clearTimeout=window.setTimeout((()=>{this.decimals.splice(t,this.decimals.length-t).forEach((e=>{e.container.remove()}))}),Ya.DURATION))}hideLeft(e){const t=(""+e).length;this.decimals.slice(t).forEach((t=>{const i=+t.placeholder.innerText||0;t.animatedSuper.getRow(Xa.EMPTY_INDEX,!0),t.animatedSuper.animate(Xa.EMPTY_INDEX,i,this.reverse?ethis.previousNumber,!0)})),this.clear(e)}setCount(e){const t=Array.from(""+this.previousNumber).map((e=>+e));Array.from(""+e).map((e=>+e)).forEach(((i,s)=>{var n;const a=this.getDecimal(s),o=a.animatedSuper.getRow(i,!0),r=null!==(n=t[s])&&void 0!==n?n:Xa.EMPTY_INDEX;o.innerText=a.placeholder.innerText=""+i,a.animatedSuper.animate(i,r,this.reverse?ethis.previousNumber,!0)})),this.hideLeft(e),this.previousNumber=e}}Xa.EMPTY_INDEX=-1,Xa.BASE_CLASS="animated-counter";class Ja{constructor(e,t,i){this.topbar=e,this.chat=t,this.managers=i,this.pinnedMaxMid=0,this.pinnedMid=0,this.pinnedIndex=-1,this.wasPinnedIndex=0,this.wasPinnedMediaIndex=0,this.locked=!1,this.waitForScrollBottom=!1,this.count=0,this.mids=[],this.offsetIndex=0,this.loading=!1,this.loadedBottom=!1,this.loadedTop=!1,this.scrollDownListenerSetter=null,this.hidden=!1,this.getCurrentIndexPromise=null,this.listenerSetter=new le.Z,this.log=(0,r.kg)("PM"),this.debug=!0,this.isStatic=!1;const s=new Y("pinned-message",t.animationGroup);this.pinnedMessageContainer=new za({topbar:e,chat:t,listenerSetter:this.listenerSetter,className:"message",divAndCaption:s,onClose:()=>Qa(this,void 0,void 0,(function*(){return(yield i.appPeersManager.canPinMessage(this.chat.peerId))?new As(this.chat.peerId,this.pinnedMid,!0):new As(this.chat.peerId,0,!0),!1}))}),this.pinnedMessageBorder=new $a,s.border.replaceWith(this.pinnedMessageBorder.render(1,0)),this.animatedSubtitle=new Ya,s.subtitle.append(this.animatedSubtitle.container),this.animatedMedia=new Ya,this.animatedMedia.container.classList.add("pinned-message-media-container"),s.content.prepend(this.animatedMedia.container),this.animatedCounter=new Xa(!0),s.title.append((0,C.ag)("PinnedMessage")," ",this.animatedCounter.container);const n=this.pinnedMessageContainer.btnClose.cloneNode(!0);this.pinnedMessageContainer.attachOnCloseEvent(n),s.container.prepend(n),this.btnOpen=(0,On.Z)("pinlist pinned-container-close pinned-message-pinlist",{noRipple:!0}),this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen),(0,S.fc)(this.btnOpen,(e=>{(0,Ce.Z)(e),this.topbar.openPinned(!0)}),{listenerSetter:this.listenerSetter}),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e})=>{e===this.chat.peerId&&(this.hidden&&this.pinnedMessageContainer.toggle(this.hidden=!1),this.loadedTop=this.loadedBottom=!1,this.pinnedIndex=-1,this.pinnedMid=0,this.count=0,this.mids=[],this.offsetIndex=0,this.pinnedMaxMid=0,this.setCorrectIndex(0))})),this.listenerSetter.add(d.Z)("peer_pinned_hidden",(({peerId:e})=>{e===this.chat.peerId&&this.pinnedMessageContainer.toggle(this.hidden=!0)})),this.setPinnedMessage=(0,Ze.Z)((()=>this._setPinnedMessage()),100,!0,!0),this.setCorrectIndexThrottled=(0,qa.Z)(this.setCorrectIndex.bind(this),100,!1),this.isStatic=!this.chat.isPinnedMessagesNeeded()}destroy(){this.pinnedMessageContainer.divAndCaption.container.remove(),this.pinnedMessageContainer.toggle(!0),this.listenerSetter.removeAll(),this.unsetScrollDownListener(!1)}setCorrectIndex(e){if(this.isStatic)return;if(this.locked||this.hidden)return;if((this.loadedBottom||this.loadedTop)&&!this.count)return;const t=this.chat.bubbles.getBubbleByPoint("bottom");if(!t)return;const i=t.dataset.mid;t&&void 0!==i&&this.testMid(+i,e)}testMid(e,t){if(this.isStatic)return;if(this.hidden)return;let i=this.mids.findIndex((t=>t<=e));if(-1===i||this.isNeededMore(i)){if(!(this.loadedTop&&ei))return;this.pinnedIndex=i,this.pinnedMid=this.mids.find((t=>t<=e))||this.mids[this.mids.length-1],this.setPinnedMessage()}}isNeededMore(e){return this.count>Ja.LOAD_COUNT&&(!this.loadedBottom&&e<=Ja.LOAD_OFFSET||!this.loadedTop&&this.count-1-e<=Ja.LOAD_OFFSET)}getCurrentIndex(e,t=!0){return Qa(this,void 0,void 0,(function*(){if(!this.loading){this.loading=!0;try{const i=this.debug?this.log.bindPrefix("getCurrentIndex"):void 0;i&&i("start",e,t);let s=!1;const n=[this.managers.appMessagesManager.getSearch({peerId:this.chat.peerId,inputFilter:{_:"inputMessagesFilterPinned"},maxId:e,limit:Ja.LOAD_COUNT,backLimit:Ja.LOAD_COUNT,threadId:this.chat.threadId}).then((e=>(s=!0,e)))];if(!this.pinnedMaxMid){const e=this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId,this.chat.threadId).then((e=>{e.maxId&&(this.pinnedMaxMid=e.maxId,!s&&t&&(this.mids=[this.pinnedMaxMid],this.count=e.count,this.pinnedIndex=0,this.pinnedMid=this.mids[0],this.setPinnedMessage()))}));n.push(e)}const a=(yield Promise.all(n))[0];let o=a.history.findIndex((t=>t.mid<=e));-1===o&&(o=a.history.length),this.offsetIndex=a.offset_id_offset?a.offset_id_offset-o:0,this.mids=a.history.map((e=>e.mid)).slice(),this.count=a.count,this.count||this.pinnedMessageContainer.toggle(!0),this.loadedTop=this.offsetIndex+this.mids.length===this.count,this.loadedBottom=!this.offsetIndex,i&&i("result",e,a,o,this.offsetIndex,this.loadedTop,this.loadedBottom)}catch(e){this.log.error("getCurrentIndex error",e)}this.loading=!1,this.locked?this.testMid(e):t&&this.setCorrectIndex(0),this.getCurrentIndexPromise=null}}))}setScrollDownListener(){this.waitForScrollBottom=!0,this.scrollDownListenerSetter||(this.scrollDownListenerSetter=new le.Z,function(e,t,i,s){if(c.Z){let t;const n={passive:!0};s.add(e)("touchstart",(i=>{i.touches.length>1?o():(t=i.touches[0].clientY,s.add(e)("touchmove",a,n),s.add(e)("touchend",o,n))}),n);const a=e=>{const s=e.touches[0].clientY,n=s{s.removeManual(e,"touchmove",a,n),s.removeManual(e,"touchend",o,n)}}else s.add(e)("wheel",(e=>{const t=e.deltaY>0;!t||i()}),{passive:!0})}(this.chat.bubbles.scrollable.container,0,(()=>{this.unsetScrollDownListener()}),this.scrollDownListenerSetter))}unsetScrollDownListener(e=!0){this.waitForScrollBottom=!1,this.scrollDownListenerSetter&&(this.scrollDownListenerSetter.removeAll(),this.scrollDownListenerSetter=null),e&&this.setCorrectIndex(0)}handleFollowingPinnedMessage(){return Qa(this,void 0,void 0,(function*(){this.locked=!0,this.debug&&this.log("handleFollowingPinnedMessage");try{this.setScrollDownListener();const e=this.chat.setPeerPromise;e instanceof Promise&&(yield e),yield(0,ue.e9)(),this.getCurrentIndexPromise&&(yield this.getCurrentIndexPromise),this.debug&&this.log("handleFollowingPinnedMessage: unlock"),this.locked=!1}catch(e){this.log.error("handleFollowingPinnedMessage error:",e),this.locked=!1,this.waitForScrollBottom=!1,this.setCorrectIndex(0)}}))}followPinnedMessage(e){return Qa(this,void 0,void 0,(function*(){(yield this.chat.getMessage(e))&&(this.chat.setMessageId(e),(this.chat.setPeerPromise||Promise.resolve()).then((()=>{this.handleFollowingPinnedMessage(),this.testMid(this.pinnedIndex>=this.count-1?this.pinnedMaxMid:e-1)})))}))}_setPinnedMessage(){return Qa(this,void 0,void 0,(function*(){const e=this.count;if(e){const t=this.pinnedIndex,i=yield this.chat.getMessage(this.pinnedMid),s=0===t;this.animatedCounter.container.classList.toggle("is-last",s),s||this.animatedCounter.setCount(e-t),this.pinnedMessageContainer.toggle(!1);const n=t>this.wasPinnedIndex;this.debug&&this.log("setPinnedMessage: fromTop",n,t,this.wasPinnedIndex);const a=this.animatedSubtitle.getRow(t),o=this.animatedMedia.getRow(t);o.classList.add("pinned-message-media");const r=[],d=yield Q({title:void 0,titleEl:null,subtitle:i.message,subtitleEl:a,message:i,mediaEl:o,loadPromises:r,animationGroup:this.chat.animationGroup});yield Promise.all(r),this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-media",d),this.animatedSubtitle.animate(t,this.wasPinnedIndex),d?(this.animatedMedia.animate(t,this.wasPinnedMediaIndex),this.wasPinnedMediaIndex=t):this.animatedMedia.clearRows(),this.pinnedMessageBorder.render(e,e-t-1),this.wasPinnedIndex=t,this.pinnedMessageContainer.divAndCaption.container.dataset.mid=""+i.mid}else this.pinnedMessageContainer.toggle(!0),this.wasPinnedIndex=0;this.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-many",this.count>1)}))}}Ja.LOAD_COUNT=50,Ja.LOAD_OFFSET=5;var eo=i(6194),to=i(2995),io=i(4240),so=i(6818),no=i(3897),ao=i(7120),oo=i(2059),ro=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class lo{constructor(e,t,i){this.chat=e,this.appSidebarRight=t,this.managers=i,this.verifyButtons=e=>{const t=!!e||!(!this.btnMore||!this.btnMore.classList.contains("menu-open"));e&&(0,Ce.Z)(e),(()=>{ro(this,void 0,void 0,(function*(){const e=this.buttonsToVerify.concat(t?this.menuButtons:[]);(yield Promise.all(e.map((e=>ro(this,void 0,void 0,(function*(){return{result:yield e.verify(),button:e}})))))).forEach((({button:e,result:t})=>{e.element.classList.toggle("hide",!t)}))}))})()},this.verifyVideoChatButton=e=>ro(this,void 0,void 0,(function*(){var t;if(!so.Z||this.peerId.isUser()||"chat"!==this.chat.type||this.chat.threadId)return!1;const i=oo.ZP.groupCall,s=this.peerId.toChatId();if((null==i?void 0:i.chatId)===s)return!1;if(e&&((yield this.managers.appPeersManager.isBroadcast(this.peerId))&&"group"===e||(yield this.managers.appPeersManager.isAnyGroup(this.peerId))&&"broadcast"===e))return!1;const n=yield this.managers.appChatsManager.getChat(s);return(null===(t=n.pFlags)||void 0===t?void 0:t.call_active)||(0,ao.Z)(n,"manage_call")})),this.verifyCallButton=e=>ro(this,void 0,void 0,(function*(){if(!Oe.Z||!this.peerId.isUser())return!1;const t=this.peerId.toUserId(),i=yield this.managers.appProfileManager.getCachedFullUser(t);return!!i&&!!("voice"===e?i.pFlags.phone_calls_available:i.pFlags.video_calls_available)})),this.onJoinGroupCallClick=()=>{this.chat.appImManager.joinGroupCall(this.peerId)},this.onMuteClick=()=>{new no.Z(this.peerId)},this.onResize=()=>{this.setUtilsWidth(!0),this.setFloating()},this.onChangeScreen=(e,t)=>{this.container.classList.toggle("is-pinned-floating",o.Z.isMobile),this.pinnedMessage&&this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle("is-floating",t===o._.mobile),this.onResize()},this.setUtilsWidth=(e=!1)=>{this.setUtilsRAF&&window.cancelAnimationFrame(this.setUtilsRAF),T.IS_SAFARI&&e&&this.chatUtils.classList.add("hide"),this.setUtilsRAF=window.requestAnimationFrame((()=>{T.IS_SAFARI&&e&&this.chatUtils.classList.remove("hide");const t=this.chatUtils.getBoundingClientRect().width;this.chat.log("utils width:",t),this.container.style.setProperty("--utils-width",t+"px"),this.setUtilsRAF=0}))},this.setFloating=()=>{var e;const t=[this.chatAudio,null===(e=this.pinnedMessage)||void 0===e?void 0:e.pinnedMessageContainer].filter(Boolean).reduce(((e,t)=>{const i=t.isFloating();return this.container.classList.toggle(`is-pinned-${t.className}-floating`,i),t.isVisible()?e+ +i:e}),0);this.container.dataset.floating=""+t},this.setPeerStatusManual=(e=!1)=>ro(this,void 0,void 0,(function*(){if(!this.subtitle||"chat"!==this.chat.type)return;if(this.chat.threadId){const e=yield(0,Vt.Z)({peerId:this.peerId,dialog:!0}),t=(0,C.ag)("TopicProfileStatus",[e]);return()=>(0,U.Z)(this.subtitle,t)}const t=this.peerId;return this.chat.appImManager.setPeerStatus({peerId:t,element:this.subtitle,needClear:e,useWhitespace:!1,middleware:()=>t===this.peerId})})),this.setPeerStatus=e=>this.setPeerStatusManual(e).then((e=>{null==e||e()})),this.listenerSetter=new le.Z,this.menuButtons=[],this.buttonsToVerify=[]}construct(){this.container=document.createElement("div"),this.container.classList.add("sidebar-header","topbar","hide"),this.container.dataset.floating="0",this.btnBack=(0,On.Z)("left sidebar-close-button",{noRipple:!0}),this.chatInfoContainer=document.createElement("div"),this.chatInfoContainer.classList.add("chat-info-container"),this.chatInfo=document.createElement("div"),this.chatInfo.classList.add("chat-info");const e=this.person=document.createElement("div");e.classList.add("person");const t=document.createElement("div");t.classList.add("content");const i=document.createElement("div");i.classList.add("top"),this.title=document.createElement("div"),this.title.classList.add("user-title"),i.append(this.title);const s=document.createElement("div");s.classList.add("bottom"),this.subtitle&&s.append(this.subtitle),t.append(i,s),this.avatarElement&&e.append(this.avatarElement),e.append(t),this.chatInfo.append(e),this.chatUtils=document.createElement("div"),this.chatUtils.classList.add("chat-utils"),this.chatAudio=new Ka(this,this.chat,this.managers),this.menuButtons.length&&(this.btnMore=(0,Un.Z)({listenerSetter:this.listenerSetter,direction:"bottom-left",buttons:this.menuButtons,onOpen:(e,t)=>ro(this,void 0,void 0,(function*(){const e=this.menuButtons[this.menuButtons.length-1];if(null==e?void 0:e.element){const t=yield this.managers.appPeersManager.getDeleteButtonText(this.peerId);e.element.lastChild.replaceWith((0,C.ag)(t))}}))})),this.chatUtils.append(...[this.pinnedMessage?this.pinnedMessage.pinnedMessageContainer.divAndCaption.container:null,this.btnJoin,this.btnPinned,this.btnCall,this.btnGroupCall,this.btnMute,this.btnSearch,this.btnMore].filter(Boolean)),this.pushButtonToVerify(this.btnCall,this.verifyCallButton.bind(this,"voice")),this.pushButtonToVerify(this.btnGroupCall,this.verifyVideoChatButton),this.chatInfoContainer.append(this.btnBack,this.chatInfo,this.chatUtils),this.container.append(this.chatInfoContainer),this.chatAudio&&this.container.append(this.chatAudio.divAndCaption.container),this.listenerSetter.add(window)("resize",this.onResize),this.listenerSetter.add(o.Z)("changeScreen",this.onChangeScreen),(0,S.fc)(this.container,(e=>{const t=(0,ve.Z)(e.target,"pinned-container");if((0,Vn.Z)(),t){if((0,Ce.Z)(e),(0,ve.Z)(e.target,"progress-line"))return;const i=+t.dataset.mid;if(t.classList.contains("pinned-message"))this.pinnedMessage.followPinnedMessage(i);else{const e=t.dataset.peerId.toPeerId(),s=ma.Z.getSearchContext();this.chat.appImManager.setInnerPeer({peerId:e,lastMsgId:i,type:s.isScheduled?"scheduled":s.threadId?"discussion":void 0,threadId:s.threadId})}}else o.Z.activeScreen===o._.medium&&document.body.classList.contains(n.ir)?r():(0,be.Z)(e.target,"AVATAR-ELEMENT")?this.appSidebarRight.toggleSidebar(!document.body.classList.contains(a.HQ)):this.appSidebarRight.toggleSidebar(!0)}),{listenerSetter:this.listenerSetter});const r=e=>{if(e&&(0,Ce.Z)(e),o.Z.activeScreen===o._.medium&&document.body.classList.contains(n.ir))this.chat.appImManager.setPeer({peerId:this.peerId});else{const e=0===this.chat.appImManager.chats.indexOf(this.chat);Dn.Z.back(e?"im":"chat")}};(0,S.fc)(this.btnBack,r,{listenerSetter:this.listenerSetter})}pushButtonToVerify(e,t){e&&this.buttonsToVerify.push({element:e,verify:t})}constructUtils(){this.menuButtons=[{icon:"search",text:"Search",onClick:()=>{this.chat.initSearch()},verify:()=>o.Z.isMobile},{icon:"mute",text:"ChatList.Context.Mute",onClick:this.onMuteClick,verify:()=>ro(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&d.Z.myId!==this.peerId&&!(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.chat.threadId}))}))},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:()=>{this.managers.appMessagesManager.togglePeerMute({peerId:this.peerId,threadId:this.chat.threadId})},verify:()=>ro(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&d.Z.myId!==this.peerId&&(yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:this.peerId,respectType:!1,threadId:this.chat.threadId}))}))},{icon:"comments",text:"ViewDiscussion",onClick:()=>{const e=this.chat.bubbles.getMiddleware();Promise.resolve(this.managers.appProfileManager.getChannelFull(this.peerId.toChatId())).then((t=>{e()&&t.linked_chat_id&&this.chat.appImManager.setInnerPeer({peerId:t.linked_chat_id.toPeerId(!0)})}))},verify:()=>ro(this,void 0,void 0,(function*(){const e=yield this.managers.appProfileManager.getCachedFullChat(this.peerId.toChatId());return"chat"===this.chat.type&&!!(null==e?void 0:e.linked_chat_id)}))},{icon:"phone",text:"Call",onClick:this.onCallClick.bind(this,"voice"),verify:this.verifyCallButton.bind(this,"voice")},{icon:"videocamera",text:"VideoCall",onClick:this.onCallClick.bind(this,"video"),verify:this.verifyCallButton.bind(this,"video")},{icon:"videochat",text:"PeerInfo.Action.LiveStream",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"broadcast")},{icon:"videochat",text:"PeerInfo.Action.VoiceChat",onClick:this.onJoinGroupCallClick,verify:this.verifyVideoChatButton.bind(this,"group")},{icon:"select",text:"Chat.Menu.SelectMessages",onClick:()=>{const e=this.chat.selection;e.toggleSelection(!0,!0),Sn.Z.getState().then((t=>{if(t.chatContextMenuHintWasShown)return;const i=e.toggleByElement.bind(e);e.toggleByElement=t=>ro(this,void 0,void 0,(function*(){this.managers.appStateManager.pushToState("chatContextMenuHintWasShown",!0),(0,ye.Am)((0,C.ag)("Chat.Menu.Hint")),e.toggleByElement=i,e.toggleByElement(t)}))}))},verify:()=>!this.chat.selection.isSelecting&&!!this.chat.bubbles.getRenderedLength()},{icon:"select",text:"Chat.Menu.ClearSelection",onClick:()=>{this.chat.selection.cancelSelection()},verify:()=>this.chat.selection.isSelecting},{icon:"adduser",text:"AddContact",onClick:()=>{if(!this.appSidebarRight.isTabExists(io.Z)){const e=this.appSidebarRight.createTab(io.Z);e.peerId=this.peerId,e.open(),this.appSidebarRight.toggleSidebar(!0)}},verify:()=>ro(this,void 0,void 0,(function*(){return this.peerId.isUser()&&!(yield this.managers.appPeersManager.isContact(this.peerId))}))},{icon:"forward",text:"ShareContact",onClick:()=>{const e=this.peerId;new to.Z({peerTypes:["dialogs","contacts"],onSelect:t=>new Promise(((i,s)=>{new xs.Z("",{titleLangKey:"SendMessageTitle",descriptionLangKey:"SendContactToGroupText",descriptionLangArgs:[new B.Z({peerId:t,dialog:!0}).element],buttons:[{langKey:"Send",callback:()=>{i(),this.managers.appMessagesManager.sendContact(t,e),this.chat.appImManager.setInnerPeer({peerId:t})}},{langKey:"Cancel",callback:()=>{s()},isCancel:!0}],peerId:t,overlayClosable:!0}).show()})),placeholder:"ShareModal.Search.Placeholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})},verify:()=>ro(this,void 0,void 0,(function*(){return d.Z.myId!==this.peerId&&this.peerId.isUser()&&(yield this.managers.appPeersManager.isContact(this.peerId))&&!!(yield this.managers.appUsersManager.getUser(this.peerId.toUserId())).phone}))},{icon:"bots",text:"Settings",onClick:()=>{this.managers.appMessagesManager.sendText(this.peerId,"/settings")},verify:()=>ro(this,void 0,void 0,(function*(){var e;try{const t=yield this.managers.appAttachMenuBotsManager.getAttachMenuBot(this.peerId.toUserId());return!!(null===(e=null==t?void 0:t.pFlags)||void 0===e?void 0:e.has_settings)}catch(e){return!1}}))},{icon:"lock",text:"BlockUser",onClick:()=>{new xs.Z("",{peerId:this.peerId,titleLangKey:"BlockUser",descriptionLangKey:"AreYouSureBlockContact2",descriptionLangArgs:[new B.Z({peerId:this.peerId}).element],buttons:[{langKey:"BlockUser",isDanger:!0,callback:()=>{this.managers.appUsersManager.toggleBlock(this.peerId,!0).then((e=>{e&&(0,ye.bC)({langPackKey:"UserBlocked"})}))}}]}).show()},verify:()=>ro(this,void 0,void 0,(function*(){var e;if(!this.peerId.isUser())return!1;const t=yield this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());return this.peerId!==d.Z.myId&&t&&!(null===(e=t.pFlags)||void 0===e?void 0:e.blocked)}))},{icon:"lockoff",text:"Unblock",onClick:()=>{this.managers.appUsersManager.toggleBlock(this.peerId,!1).then((e=>{e&&(0,ye.bC)({langPackKey:"UserUnblocked"})}))},verify:()=>ro(this,void 0,void 0,(function*(){var e;const t=yield this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());return!!(null===(e=null==t?void 0:t.pFlags)||void 0===e?void 0:e.blocked)}))},{icon:"delete danger",text:"Delete",onClick:()=>{new eo.Z(this.peerId)},verify:()=>ro(this,void 0,void 0,(function*(){return"chat"===this.chat.type&&!!(yield this.managers.appMessagesManager.getDialogOnly(this.peerId))}))}],this.btnSearch=(0,On.Z)("search"),this.attachClickEvent(this.btnSearch,(e=>{this.chat.initSearch()}),!0)}attachClickEvent(e,t,i){(0,S.fc)(e,(e=>{(0,Ce.Z)(e),!i&&(0,Vn.Z)(),t(e)}),{listenerSetter:this.listenerSetter})}onCallClick(e){this.chat.appImManager.callUser(this.peerId.toUserId(),e)}constructAvatar(){const e=new f.Z;return e.isDialog=!0,e.classList.add("avatar-42","person-avatar"),e}get peerId(){return this.chat.peerId}constructPeerHelpers(){return this.avatarElement=this.constructAvatar(),this.subtitle=document.createElement("div"),this.subtitle.classList.add("info"),this.pinnedMessage=new Ja(this,this.chat,this.managers),this.btnJoin=(0,Ue.Z)("btn-primary btn-color-primary chat-join hide"),this.btnCall=(0,On.Z)("phone"),this.btnGroupCall=(0,On.Z)("videochat"),this.btnPinned=(0,On.Z)("pinlist"),this.btnMute=(0,On.Z)("mute"),this.attachClickEvent(this.btnCall,this.onCallClick.bind(this,"voice")),this.attachClickEvent(this.btnGroupCall,this.onJoinGroupCallClick),this.attachClickEvent(this.btnPinned,(()=>{this.openPinned(!0)})),this.attachClickEvent(this.btnMute,this.onMuteClick),this.attachClickEvent(this.btnJoin,(()=>ro(this,void 0,void 0,(function*(){const e=this.chat.bubbles.getMiddleware();this.btnJoin.setAttribute("disabled","true");const t=this.peerId.toChatId();let i;i=(yield this.managers.appChatsManager.isChannel(t))?this.managers.appChatsManager.joinChannel(t):this.managers.appChatsManager.addChatUser(t,d.Z.myId),i.finally((()=>{e()&&this.btnJoin.removeAttribute("disabled")}))})))),this.listenerSetter.add(d.Z)("chat_update",(e=>ro(this,void 0,void 0,(function*(){var t;if(this.peerId===e.toPeerId(!0)){const i=yield this.managers.appChatsManager.getChat(e);this.btnJoin.classList.toggle("hide",!(null===(t=null==i?void 0:i.pFlags)||void 0===t?void 0:t.left)),this.setUtilsWidth(),this.verifyButtons()}})))),this.listenerSetter.add(d.Z)("dialog_notify_settings",(e=>{e.peerId===this.peerId&&this.setMutedState()})),this.listenerSetter.add(d.Z)("peer_typings",(({peerId:e})=>{this.peerId===e&&this.setPeerStatus()})),this.listenerSetter.add(d.Z)("user_update",(e=>{this.peerId===e.toPeerId()&&this.setPeerStatus()})),this.listenerSetter.add(d.Z)("peer_full_update",(e=>{this.peerId===e&&this.verifyButtons()})),this.chat.addEventListener("setPeer",((e,t)=>{const i=this.chat.bubbles.getMiddleware();Sn.Z.getState().then((s=>{i()&&this.pinnedMessage&&(this.pinnedMessage.hidden=!!s.hiddenPinnedMessages[this.chat.peerId],t?(this.pinnedMessage.unsetScrollDownListener(),this.pinnedMessage.testMid(e,0)):this.pinnedMessage.locked||(this.pinnedMessage.handleFollowingPinnedMessage(),this.pinnedMessage.testMid(e)))}))})),this.listenerSetter.add(d.Z)("peer_pinned_messages",(({peerId:e,mids:t})=>{"pinned"===this.chat.type&&e===this.peerId&&t&&this.setTitle()})),this.setPeerStatusInterval=window.setInterval(this.setPeerStatus,6e4),this}openPinned(e){this.chat.appImManager.setInnerPeer({peerId:this.peerId,lastMsgId:e?+this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid:0,type:"pinned"})}destroy(){var e,t;this.listenerSetter.removeAll(),window.clearInterval(this.setPeerStatusInterval),null===(e=this.pinnedMessage)||void 0===e||e.destroy(),null===(t=this.chatAudio)||void 0===t||t.destroy(),delete this.chatAudio,delete this.pinnedMessage}cleanup(){this.chat.peerId||this.container.classList.add("hide")}finishPeerChange(e){var t;return ro(this,void 0,void 0,(function*(){const{peerId:e,threadId:i}=this.chat;let s;"chat"===this.chat.type&&(s=(null===(t=this.avatarElement)||void 0===t?void 0:t.peerId)!==this.peerId||this.avatarElement.threadId!==this.chat.threadId?this.constructAvatar():this.avatarElement);const[n,a,o,r,d,l,c]=yield Promise.all([this.managers.appPeersManager.isBroadcast(e),this.managers.appPeersManager.isAnyChat(e),e.isAnyChat()?this.managers.appChatsManager.getChat(e.toChatId()):void 0,s?s.updateWithOptions({peerId:e,threadId:i,wrapOptions:{customEmojiSize:(0,qe.C)(32,32)}}):void 0,this.setTitleManual(),this.setPeerStatusManual(!0),Sn.Z.getState()]);return()=>{var t,i;const r=!("pinned"===this.chat.type||"scheduled"===this.chat.type);this.btnMute&&this.btnMute.classList.toggle("hide",!n||!r),this.btnJoin&&(a&&!this.chat.isRestricted&&r?((0,U.Z)(this.btnJoin,(0,C.ag)(n?"Chat.Subscribe":"ChannelJoin")),this.btnJoin.classList.toggle("hide",!(null===(t=null==o?void 0:o.pFlags)||void 0===t?void 0:t.left))):this.btnJoin.classList.add("hide")),this.btnSearch&&this.btnSearch.classList.toggle("hide",!r),this.btnPinned&&this.btnPinned.classList.toggle("hide",!r),this.avatarElement!==s&&(s&&(this.avatarElement?this.avatarElement.replaceWith(s):this.person.prepend(s)),null===(i=this.avatarElement)||void 0===i||i.remove(),this.avatarElement=s),this.setUtilsWidth(),this.verifyButtons(),this.btnMore&&this.btnMore.classList.toggle("hide",!r);const h=this.chat.isPinnedMessagesNeeded();if(h||"discussion"===this.chat.type){if(this.chat.wasAlreadyUsed||!this.pinnedMessage){const e=new Ja(this,this.chat,this.managers);this.pinnedMessage?(this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(e.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage.destroy()):this.chatUtils.prepend(this.pinnedMessage.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage=e}h?this.pinnedMessage.hidden=!!c.hiddenPinnedMessages[e]:"discussion"===this.chat.type&&(this.pinnedMessage.pinnedMid=this.chat.threadId,this.pinnedMessage.count=1,this.pinnedMessage.pinnedIndex=0,this.pinnedMessage._setPinnedMessage())}else this.pinnedMessage&&(this.pinnedMessage.destroy(),this.pinnedMessage=void 0);d(),null==l||l(),this.subtitle.classList.toggle("hide",!l),this.setMutedState(),this.container.classList.remove("hide")}}))}setTitleManual(e){return ro(this,void 0,void 0,(function*(){const{peerId:t,threadId:i}=this.chat,s=()=>this.chat.bubbles.getMiddleware();let n;if("pinned"===this.chat.type)n=void 0===e?(0,C.ag)("Loading"):(0,C.ag)("PinnedMessagesCount",[e]),void 0===e&&this.managers.appMessagesManager.getSearchCounters(t,[{_:"inputMessagesFilterPinned"}],!1).then((e=>{if(!s())return;const t=e[0].count;if(this.setTitle(t),!t){this.chat.appImManager.setPeer();const e=this.chat.appImManager.chat;e.topbar.pinnedMessage&&e.topbar.pinnedMessage.pinnedMessageContainer.toggle(!0)}}));else if("scheduled"===this.chat.type)n=(0,C.ag)(t===d.Z.myId?"Reminders":"ScheduledMessages");else if("discussion"===this.chat.type){if(void 0===e){const n=yield this.managers.acknowledged.appMessagesManager.getHistory(t,0,1,0,i);if(!s())return;if(n.cached){const t=yield n.result;if(!s())return;e=t.count}else n.result.then((e=>{s()&&this.setTitle(e.count)}))}n=void 0===e?(0,C.ag)("Loading"):(0,C.ag)("Chat.Title.Comments",[e])}else if("chat"===this.chat.type&&([n]=yield Promise.all([(0,Vt.Z)({peerId:t,dialog:!0,withIcons:!i,threadId:i})]),!s()))return;return()=>{(0,U.Z)(this.title,n)}}))}setTitle(e){this.setTitleManual(e).then((e=>e()))}setMutedState(){return ro(this,void 0,void 0,(function*(){if(!this.btnMute)return;const e=this.peerId,t=yield this.managers.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!1,threadId:this.chat.threadId});(yield this.managers.appPeersManager.isBroadcast(e))?(this.btnMute.classList.remove("tgico-mute","tgico-unmute"),this.btnMute.classList.add(t?"tgico-unmute":"tgico-mute"),this.btnMute.style.display=""):this.btnMute.style.display="none"}))}}var co=i(5884),ho=i(3607);class uo extends Xi._{constructor(){super(...arguments),this.threadId=0,this.query=""}onOpenAfterTimeout(){this.appSearch.beginSearch(this.peerId,this.threadId,this.query)}init(e,t,i,s){this.container.id="search-private-container",this.container.classList.add("chatlist-container"),this.inputSearch=new ho.Z("Search"),this.title.replaceWith(this.inputSearch.container),this.btnPickDate=(0,On.Z)("calendar sidebar-header-right"),this.header.append(this.btnPickDate);const n=document.createElement("div");n.classList.add("chatlist-container"),this.scrollable.container.replaceWith(n),this.appSearch=new co.Z(n,this.inputSearch,{messages:new co.z("Chat.Search.PrivateSearch","messages")}),this.peerId?this.appSearch.beginSearch(this.peerId,this.threadId,s):(this.query=s,this.peerId=e,this.threadId=t,this.onDatePick=i,this.btnPickDate.classList.toggle("hide",!this.onDatePick),this.onDatePick&&(0,S.fc)(this.btnPickDate,(()=>{w.Z.createPopup(E,new Date,this.onDatePick).show()})),s&&this.appSearch.searchInput.inputField.setValueSilently(s),a.ZP.toggleSidebar(!0))}}class po{constructor(e,t,i){this.topbar=e,this.chat=t,this.foundCount=0,this.selectedIndex=0,this.onDateClick=e=>{(0,Ce.Z)(e),w.Z.createPopup(E,new Date,this.chat.bubbles.onDatePick).show()},this.onResultsClick=e=>{const t=(0,be.Z)(e.target,Ji.DIALOG_LIST_ELEMENT_TAG);t&&this.selectResult(t)},this.onFooterClick=e=>{this.foundCount&&(this.chat.bubbles.container.classList.toggle("search-results-active"),this.results.classList.toggle("active"))},this.onUpClick=e=>{(0,Ce.Z)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex+1])},this.onDownClick=e=>{(0,Ce.Z)(e),this.selectResult(this.searchGroup.list.children[this.selectedIndex-1])},this.element=document.createElement("div"),this.element.classList.add("sidebar-header","chat-search","chatlist-container"),this.backBtn=document.createElement("button"),this.backBtn.classList.add("btn-icon","tgico-left","sidebar-close-button"),(0,x.Z)(this.backBtn);const s=this.listenerSetter=new le.Z,n=(e,t)=>{(0,S.fc)(e,t,{listenerSetter:s})};n(this.backBtn,(()=>{this.destroy()})),this.inputSearch=new ho.Z("Search"),this.results=document.createElement("div"),this.results.classList.add("chat-search-results","chatlist-container"),this.searchGroup=new co.z(!1,"messages",void 0,"",!1),n(this.searchGroup.list,this.onResultsClick),this.appSearch=new co.Z(this.results,this.inputSearch,{messages:this.searchGroup},(e=>{this.foundCount=e,this.foundCount?this.selectResult(this.searchGroup.list.children[0]):((0,U.Z)(this.foundCountEl,this.inputSearch.value?(0,C.ag)("NoResult"):""),this.results.classList.remove("active"),this.chat.bubbles.container.classList.remove("search-results-active"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"))})),this.appSearch.beginSearch(this.chat.peerId,this.chat.threadId),this.chat.bubbles.container.append(this.results),this.footer=document.createElement("div"),this.footer.classList.add("chat-search-footer"),n(this.footer,this.onFooterClick),(0,x.Z)(this.footer),this.foundCountEl=document.createElement("span"),this.foundCountEl.classList.add("chat-search-count"),this.dateBtn=document.createElement("button"),this.dateBtn.classList.add("btn-icon","tgico-calendar"),this.controls=document.createElement("div"),this.controls.classList.add("chat-search-controls"),this.upBtn=document.createElement("button"),this.upBtn.classList.add("btn-icon","tgico-up"),this.downBtn=document.createElement("button"),this.downBtn.classList.add("btn-icon","tgico-down"),this.upBtn.setAttribute("disabled","true"),this.downBtn.setAttribute("disabled","true"),n(this.dateBtn,this.onDateClick),n(this.upBtn,this.onUpClick),n(this.downBtn,this.onDownClick),this.controls.append(this.upBtn,this.downBtn),this.footer.append(this.foundCountEl,this.dateBtn,this.controls),this.topbar.container.parentElement.insertBefore(this.footer,t.input.chatInput),this.element.append(this.backBtn,this.inputSearch.container),this.topbar.container.classList.add("hide-pinned"),this.topbar.container.parentElement.append(this.element),this.inputSearch.input.focus(),i&&this.setQuery(i),T.IS_MOBILE_SAFARI||(this.navigationItem={type:"mobile-search",onPop:()=>{this.destroy()}},Dn.Z.pushItem(this.navigationItem))}destroy(){this.topbar.container.classList.remove("hide-pinned"),this.element.remove(),this.inputSearch.remove(),this.results.remove(),this.footer.remove(),this.listenerSetter.removeAll(),this.chat.bubbles.container.classList.remove("search-results-active"),this.chat.search=void 0,Dn.Z.removeItem(this.navigationItem)}setQuery(e){this.inputSearch.inputField.value=e}selectResult(e){if(this.setPeerPromise)return this.setPeerPromise;const t=e.dataset.peerId.toPeerId(),i=+e.dataset.mid||void 0,s=(0,Ie.Z)(e);s===this.foundCount-1?this.upBtn.setAttribute("disabled","true"):this.upBtn.removeAttribute("disabled"),s?this.downBtn.removeAttribute("disabled"):this.downBtn.setAttribute("disabled","true"),this.results.classList.remove("active"),this.chat.bubbles.container.classList.remove("search-results-active");const n=this.chat.setPeer({peerId:t,lastMsgId:i});this.setPeerPromise=(n instanceof Promise?n:Promise.resolve(n)).then((()=>{this.selectedIndex=s,(0,U.Z)(this.foundCountEl,(0,C.ag)("Of",[s+1,this.foundCount]));const e=this.searchGroup.list.childElementCount;this.selectedIndex>=e-6&&this.appSearch.searchMore()})).finally((()=>{this.setPeerPromise=null}))}}var fo=i(1571),mo=i(6848),go=i(356);class vo{constructor(){this.canvases=new Set}static getInstance(e){let t=this.INSTANCES.find((t=>(0,mo.Z)(t.options,e)));return t||(t=new vo,t.init(e),this.INSTANCES.push(t)),t}init(e){this.options=e}renderToCanvas(e){return this.renderImageFromUrl(this.options.url).then((()=>this.fillCanvas(e)))}renderImageFromUrl(e){if(this.renderImageFromUrlPromise)return this.renderImageFromUrlPromise;const t=this.image=document.createElement("img");return t.crossOrigin="anonymous",this.renderImageFromUrlPromise=(0,Ot.cj)(t,e,!1).then((()=>go.Z?createImageBitmap(t,{resizeWidth:1440,resizeHeight:2960}).then((e=>(this.imageBitmap=e,t))):t))}cleanup(e){var t;this.canvases.delete(e),this.canvases.size||((0,h.Z)(vo.INSTANCES,this),this.objectUrl&&(null===(t=this.imageBitmap)||void 0===t||t.close(),URL.revokeObjectURL(this.objectUrl)))}fillCanvas(e){const t=e.getContext("2d"),{width:i,height:s}=e,n=this.imageBitmap||this.image;let a=n.width,o=n.height;const r=(500+xe.Z.height/2.5)*e.dpr;a*=r/o,o=r,this.options.mask?(t.fillStyle="#000",t.fillRect(0,0,i,s),t.globalCompositeOperation="destination-out"):t.globalCompositeOperation="source-over";const d=e=>{for(let s=0;s0){let e=l;do{d(e-=o)}while(e>=0)}const c=s-1;for(let e=l+o;ei.resize(e,t))))}}vo.INSTANCES=[];var bo=i(6714),yo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class wo extends l.Z{constructor(e,t){super(),this.appImManager=e,this.managers=t,this.type="chat",this.animationGroup=`chat-${Math.round(65535*Math.random())}`,this.container=document.createElement("div"),this.container.classList.add("chat","tabs-tab"),this.backgroundEl=document.createElement("div"),this.backgroundEl.classList.add("chat-background"),this.log=(0,r.kg)("CHAT",r.v9.Log|r.v9.Warn|r.v9.Debug|r.v9.Error),this.log.warn("constructor"),this.peerId=m.NM,this.container.append(this.backgroundEl),this.appImManager.chatsContainer.append(this.container),this.backgroundTempId=0,this.sharedMediaTabs=[]}setBackground(e,t){const i=bo.Z.getTheme();let s;if(i.background.color&&!i.background.slug&&!i.background.intensity&&"grabbing"===document.documentElement.style.cursor&&this.gradientRenderer&&!this.patternRenderer)return this.gradientCanvas.dataset.colors=i.background.color,this.gradientRenderer.init(this.gradientCanvas),Promise.resolve();const n=++this.backgroundTempId,a=this.gradientRenderer,o=this.patternRenderer,r=(this.gradientCanvas,this.patternCanvas);this.gradientRenderer=this.patternRenderer=this.gradientCanvas=this.patternCanvas=void 0;const l=i.background.intensity&&i.background.intensity/100,c=!!l&&l<0;let h,u,p,f=null==s?void 0:s.firstElementChild;if(!s)if(s=document.createElement("div"),s.classList.add("chat-background-item"),e)if(l){s.classList.add("is-pattern");const t=this.appImManager.chatsContainer.getBoundingClientRect();h=this.patternRenderer=vo.getInstance({url:e,width:t.width,height:t.height,mask:c}),f=this.patternCanvas=h.createCanvas(),f.classList.add("chat-background-item-canvas","chat-background-item-pattern-canvas"),c&&s.classList.add("is-dark")}else i.background.slug&&s.classList.add("is-image");else i.background.color&&s.classList.add("is-color");const m=i.background.color;if(m){const{canvas:e,gradientRenderer:t}=fo.Z.create(m);p=this.gradientRenderer=t,u=this.gradientCanvas=e,u.classList.add("chat-background-item-canvas","chat-background-item-color-canvas"),d.Z.settings.animationsEnabled&&p.scrollAnimate(!0)}h&&(c?u:f).style.setProperty("--opacity-max",""+Math.abs(l)*(c?.5:1));const g=new Promise((i=>{const d=()=>{if(this.backgroundTempId!==n)return h&&h.cleanup(f),void(p&&p.cleanup());const e=this.backgroundEl.lastElementChild;if(e===s)return void i();const d=[u,f].filter(Boolean);d.length&&s.append(...d),this.backgroundEl.append(s),(0,Fe.Z)({element:s,className:"is-visible",forwards:!0,duration:t?0:200,onTransitionEnd:e?()=>{null==o||o.cleanup(r),null==a||a.cleanup(),e.remove()}:null,useRafs:2}),i()};h?h.renderToCanvas(f).then((()=>{this.backgroundTempId===n&&d()})):e?(0,Ot.ZP)(s,e,d):d()}));return this.setBackgroundPromise=Promise.race([(0,nt.Z)(500),g])}setType(e){this.type=e}init(){this.topbar=new lo(this,a.ZP,this.managers),this.bubbles=new Ps(this,this.managers),this.input=new Oa(this,this.appImManager,this.managers),this.contextMenu=new an(this,this.managers),this.selection=new Ua.Z(this,this.bubbles,this.input,this.managers),this.topbar.constructUtils(),this.topbar.constructPeerHelpers(),this.topbar.construct(),this.input.construct(),this.bubbles.constructPeerHelpers(),this.input.constructPeerHelpers(),c.Z||this.bubbles.setReactionsHoverListeners(),this.bubbles.attachContainerListeners(),this.container.append(this.topbar.container,this.bubbles.container,this.input.chatInput),this.bubbles.listenerSetter.add(d.Z)("dialog_migrate",(({migrateFrom:e,migrateTo:t})=>{this.peerId===e&&this.setPeer({peerId:t})})),this.bubbles.listenerSetter.add(d.Z)("dialog_drop",(e=>{e.peerId!==this.peerId||"dialog"!==e._&&this.threadId!==e.id||this.appImManager.setPeer()}));const e=e=>{const t=()=>{var t;null===(t=this.bubbles.observer)||void 0===t||t.toggleObservingNew(e),s.Z.toggleIntersectionGroup(this.animationGroup,e),e&&s.Z.checkAnimations(e,this.animationGroup)};e?t():setTimeout((()=>{t()}),400)};this.bubbles.listenerSetter.add(this.appImManager)("chat_changing",(({to:t})=>{e(t!==this)})),this.bubbles.listenerSetter.add(this.appImManager)("tab_changing",(t=>{e(this.appImManager.chat!==this||t!==qr.CHAT)}))}beforeDestroy(){this.bubbles.cleanup()}cleanupBackground(){++this.backgroundTempId,this.patternRenderer&&(this.patternRenderer.cleanup(this.patternCanvas),this.patternRenderer=void 0),this.gradientRenderer&&(this.gradientRenderer.cleanup(),this.gradientRenderer=void 0)}destroy(){this.destroySharedMediaTab(),this.topbar.destroy(),this.bubbles.destroy(),this.input.destroy(),this.contextMenu&&this.contextMenu.destroy(),this.selection&&this.selection.attachListeners(void 0,void 0),this.cleanupBackground(),delete this.topbar,delete this.bubbles,delete this.input,delete this.selection,delete this.contextMenu,this.container.remove()}cleanup(e=!0){this.input.cleanup(e),this.topbar.cleanup(),this.selection.cleanup()}get isForumTopic(){return!(!this.isForum||!this.threadId)}onChangePeer(e,t){var i;return yo(this,void 0,void 0,(function*(){const{peerId:s,threadId:n}=this,o=a.ZP.getTab(uo);null==o||o.close();const[r,d,l,c,h,u,p,f,m]=yield t(Promise.all([this.managers.appPeersManager.noForwards(s),this.managers.appPeersManager.isPeerRestricted(s),this._isAnyGroup(s),this.setAutoDownloadMedia(),this.managers.appPeersManager.isMegagroup(s),this.managers.appPeersManager.isBroadcast(s),this.managers.appPeersManager.isChannel(s),this.managers.appPeersManager.isBot(s),this.managers.appPeersManager.isForum(s)]));m&&n&&(yield t(this.managers.dialogsStorage.getForumTopicOrReload(s,n))),this.noForwards=r,this.isRestricted=d,this.isAnyGroup=l,this.isMegagroup=h,this.isBroadcast=u,this.isChannel=p,this.isBot=f,this.isForum=m,this.isAllMessagesForum=m&&!n,n&&!this.isForum&&(e.type="discussion");const g=null!==(i=e.type)&&void 0!==i?i:"chat";this.setType(g),this.messagesStorageKey=`${this.peerId}_${"scheduled"===this.type?"scheduled":"history"}`,this.container.classList.toggle("no-forwards",this.noForwards),this.sharedMediaTab=a.ZP.createSharedMediaTab(),this.sharedMediaTabs.push(this.sharedMediaTab),this.sharedMediaTab.setPeer(s,n),this.input.clearHelper(),this.selection.cleanup()}))}setPeer(e){const{peerId:t,threadId:i}=e;t?this.inited||(this.init&&(this.init(),this.init=null),this.inited=!0):this.inited=void 0;const s=this.appImManager.isSamePeer(this,e);if(s){if(this.setPeerPromise)return}else this.appImManager.dispatchEvent("peer_changing",this),this.peerId=t||m.NM,this.threadId=i;if(!t)return a.ZP.toggleSidebar(!1),this.cleanup(!0),this.bubbles.setPeer({samePeer:!1,peerId:t}),this.peerId=0,this.appImManager.dispatchEvent("peer_changed",this),a.ZP.replaceSharedMediaTab(),this.destroySharedMediaTab(),void(this.sharedMediaTab=void 0);this.peerChanged=s;const n=this.bubbles.setPeer(Object.assign(Object.assign({},e),{samePeer:s})),o=this.setPeerPromise=n.then((e=>e.promise)).catch(Qe.Z).finally((()=>{this.setPeerPromise===o&&(this.setPeerPromise=null)}));return n}destroySharedMediaTab(e=this.sharedMediaTab){e&&((0,h.Z)(this.sharedMediaTabs,e),e.destroy())}setAutoDownloadMedia(){return yo(this,void 0,void 0,(function*(){this.autoDownload=yield function(e){return t=this,i=void 0,n=function*(){let t,i=0,s=0,n=0;const a=d.Z.settings,o=d.Z.managers.appPeersManager;return!a.autoDownloadNew.pFlags.disabled&&e&&(t=e.isUser()?(yield o.isContact(e))?"contacts":"private":(yield o.isBroadcast(e))?"channels":"groups",a.autoDownload.photo[t]&&(i=a.autoDownloadNew.photo_size_max),a.autoDownload.video[t]&&(s=a.autoDownloadNew.video_size_max),a.autoDownload.file[t]&&(n=a.autoDownloadNew.file_size_max)),{photo:i,video:s,file:n}},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}(this.peerId)}))}setMessageId(e){return this.setPeer({peerId:this.peerId,threadId:this.threadId,lastMsgId:e})}finishPeerChange(e,t,i,s){return yo(this,void 0,void 0,(function*(){if(this.peerChanged)return;const t=this.peerId;this.peerChanged=!0,this.wasAlreadyUsed=!0;const i=this.bubbles.getMiddleware();this.cleanup(!1);const n=this.sharedMediaTab,o=Promise.all([this.topbar.finishPeerChange(e),this.bubbles.finishPeerChange(),this.input.finishPeerChange(s),n.fillProfileElements()]),r=yield o;n.loadSidebarMedia(!0),i()&&(r.forEach((e=>{null==e||e()})),a.ZP.replaceSharedMediaTab(n),this.sharedMediaTabs.filter((e=>e!==n)).forEach((e=>this.destroySharedMediaTab(e))),this.container.dataset.type=this.type,this.log.setPrefix("CHAT-"+t+"-"+this.type),this.appImManager.dispatchEvent("peer_changed",this))}))}getMessage(e){return this.managers.appMessagesManager.getMessageFromStorage(this.messagesStorageKey,e)}getMidsByMid(e){return yo(this,void 0,void 0,(function*(){return this.managers.appMessagesManager.getMidsByMessage(yield this.getMessage(e))}))}getHistoryStorage(e){return this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId,e?void 0:this.threadId).then((e=>Object.assign(Object.assign({},e),{history:ge.Z.fromJSON(e.historySerialized)})))}getDialogOrTopic(){return this.isForum&&this.threadId?this.managers.dialogsStorage.getForumTopic(this.peerId,this.threadId):this.managers.dialogsStorage.getDialogOnly(this.peerId)}getHistoryMaxId(){return this.getHistoryStorage().then((e=>e.maxId))}_isAnyGroup(e){return yo(this,void 0,void 0,(function*(){return e===d.Z.myId||e===m.hj||(yield this.managers.appPeersManager.isAnyGroup(e))}))}initSearch(e){if(this.peerId)if(o.Z.isMobile)this.search?this.search.setQuery(e):this.search=new po(this.topbar,this,e);else{let t=a.ZP.getTab(uo);t||(t=a.ZP.createTab(uo)),t.open(this.peerId,this.threadId,this.bubbles.onDatePick,e)}}canSend(e){return this.managers.appMessagesManager.canSendToPeer(this.peerId,this.threadId,e)}isStartButtonNeeded(){return Promise.all([this.managers.appPeersManager.isBot(this.peerId),this.managers.appMessagesManager.getDialogOnly(this.peerId),this.getHistoryStorage(!0)]).then((([e,t,i])=>e&&!t&&!i.history.length))}getMessageSendingParams(){return{threadId:this.threadId,replyToMsgId:this.input.replyToMsgId,scheduleDate:this.input.scheduleDate,silent:this.input.sendSilent,sendAsPeerId:this.input.sendAsPeerId}}isOurMessage(e){return e.fromId===d.Z.myId||!!e.pFlags.out&&this.isMegagroup}isOutMessage(e){const t=e.fwd_from;return!(!this.isOurMessage(e)||t&&this.peerId===d.Z.myId)}isAvatarNeeded(e){return this.isAnyGroup&&!this.isOutMessage(e)}isPinnedMessagesNeeded(){return"chat"===this.type||this.isForum}}var So=i(2342),Co=i(6637);class Lo{constructor(e){this.appImManager=e,this.buttons={},this.addedListener=!1,this.waitingForMouseUp=!1,this.mouseUpCounter=0,this.onMouseUpSingle=e=>{if(this.waitingForMouseUp=!1,c.Z){if(e&&(0,Ce.Z)(e),0!=this.mouseUpCounter++)return void this.hide();this.resetSelection(this.savedRange)}this.show()}}init(){this.container=document.createElement("div"),this.container.classList.add("markup-tooltip","z-depth-1","hide"),this.wrapper=document.createElement("div"),this.wrapper.classList.add("markup-tooltip-wrapper");const e=document.createElement("div"),t=document.createElement("div");e.classList.add("markup-tooltip-tools"),t.classList.add("markup-tooltip-tools"),["bold","italic","underline","strikethrough","monospace","spoiler","link"].forEach((t=>{const i=(0,On.Z)(t,{noRipple:!0});e.append(this.buttons[t]=i),"link"!==t?i.addEventListener("mousedown",(e=>{(0,Ce.Z)(e),this.appImManager.chat.input.applyMarkdown(t),this.cancelClosening()})):(0,S.fc)(i,(e=>{(0,Ce.Z)(e),this.showLinkEditor(),this.cancelClosening()}))})),this.linkBackButton=(0,On.Z)("left",{noRipple:!0}),this.linkInput=document.createElement("input"),(0,C.$d)(this.linkInput,"MarkupTooltip.LinkPlaceholder",void 0,"placeholder"),this.linkInput.classList.add("input-clear"),this.linkInput.addEventListener("keydown",(e=>{const t=!this.linkInput.value.length||!!(0,So.Z)(this.linkInput.value);"Enter"===e.key&&(t?this.applyLink(e):(this.linkInput.classList.contains("error")&&(this.linkInput.classList.remove("error"),this.linkInput.offsetLeft),this.linkInput.classList.add("error")))})),this.linkInput.addEventListener("input",(e=>{const t=this.isLinkValid();this.linkInput.classList.toggle("is-valid",t),this.linkInput.classList.remove("error")})),this.linkBackButton.addEventListener("mousedown",(e=>{(0,Ce.Z)(e),this.container.classList.remove("is-link"),this.resetSelection(),this.setTooltipPosition(),this.cancelClosening()})),this.linkApplyButton=(0,On.Z)("check markup-tooltip-link-apply",{noRipple:!0}),this.linkApplyButton.addEventListener("mousedown",(e=>{this.applyLink(e)}));const i=document.createElement("div");i.classList.add("markup-tooltip-link-apply-container");const s=document.createElement("span"),n=document.createElement("span"),a=document.createElement("span");s.classList.add("markup-tooltip-delimiter"),n.classList.add("markup-tooltip-delimiter"),a.classList.add("markup-tooltip-delimiter"),e.insertBefore(s,this.buttons.link),i.append(a,this.linkApplyButton),t.append(this.linkBackButton,n,this.linkInput,i),this.wrapper.append(e,t),this.container.append(this.wrapper),document.body.append(this.container),window.addEventListener("resize",(()=>{this.hide()}))}showLinkEditor(){this.container&&this.container.classList.contains("is-visible")||this.show();const e=this.buttons.link;this.container.classList.add("is-link");const t=document.getSelection();if(this.savedRange=t.getRangeAt(0),e.classList.contains("active")){const e=this.savedRange.startContainer.parentElement;this.linkInput.value=e.href}else this.linkInput.value="";this.setTooltipPosition(!0),setTimeout((()=>{this.linkInput.focus()}),200),this.linkInput.classList.toggle("is-valid",this.isLinkValid())}applyLink(e){(0,Ce.Z)(e),this.resetSelection();let t=this.linkInput.value;t&&!(0,Co.Z)(t)&&(t="https://"+t),this.appImManager.chat.input.applyMarkdown("link",t),setTimeout((()=>{this.hide()}),0)}isLinkValid(){return!this.linkInput.value.length||!!(0,So.Z)(this.linkInput.value)}resetSelection(e=this.savedRange){const t=window.getSelection();t.removeAllRanges(),t.addRange(e),this.appImManager.chat.input.messageInput.focus()}hide(){this.init||(this.container.classList.remove("is-visible"),document.removeEventListener("mouseup",this.onMouseUpSingle),this.waitingForMouseUp=!1,Dn.Z.removeByType("markup"),this.hideTimeout&&clearTimeout(this.hideTimeout),this.hideTimeout=window.setTimeout((()=>{this.hideTimeout=void 0,this.container.classList.add("hide"),this.container.classList.remove("is-link")}),200))}getActiveMarkupButton(){const e=new Set,t=Object.keys(this.buttons),i=Fa(t);return t.forEach((t=>{i[t]&&e.add(this.buttons[t])})),[...e]}setActiveMarkupButton(){const e=this.getActiveMarkupButton();for(const t in this.buttons){const i=this.buttons[t];i.classList.toggle("active",e.includes(i))}}setTooltipPosition(e=!1){const t=document.getSelection().getRangeAt(0),i=document.body.getBoundingClientRect(),s=t.getBoundingClientRect(),n=this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();this.container.style.maxWidth=n.width+"px";const a=(0,He.Z)(void 0,this.appImManager.chat.input.messageInput,!1,s).rect.top+-1*i.top,o=(this.container.classList.contains("is-link")?this.wrapper.lastElementChild:this.wrapper.firstElementChild).getBoundingClientRect(),r=a-o.height-8,d=n.left,l=n.left+n.width-Math.min(n.width,o.width);let c;if(e){const e=this.container.getBoundingClientRect();c=(0,Gi.Z)(e.left,d,l)}else{const e=s.left+(s.width-o.width)/2;c=(0,Gi.Z)(e,d,l)}this.container.style.transform=`translate3d(${c}px, ${r}px, 0)`}show(){if(this.init&&(this.init(),this.init=null),Fs())return void this.hide();if(void 0!==this.hideTimeout&&clearTimeout(this.hideTimeout),this.container.classList.contains("is-visible"))return;this.setActiveMarkupButton(),this.container.classList.remove("is-link");const e=this.container.classList.contains("hide");e&&(this.container.classList.remove("hide"),this.container.classList.add("no-transition")),this.setTooltipPosition(),e&&(this.container.offsetLeft,this.container.classList.remove("no-transition")),this.container.classList.add("is-visible"),T.IS_MOBILE||Dn.Z.pushItem({type:"markup",onPop:()=>{this.hide()}})}setMouseUpEvent(){this.waitingForMouseUp||(this.waitingForMouseUp=!0,document.addEventListener("mouseup",this.onMouseUpSingle,{once:!0}))}cancelClosening(){c.Z&&!T.IS_APPLE&&(document.removeEventListener("mouseup",this.onMouseUpSingle),document.addEventListener("mouseup",(e=>{(0,Ce.Z)(e),this.mouseUpCounter=1,this.waitingForMouseUp=!1,this.setMouseUpEvent()}),{once:!0}))}handleSelection(){this.addedListener||(this.addedListener=!0,document.addEventListener("selectionchange",(e=>{if(document.activeElement===this.linkInput)return;const t=this.appImManager.chat.input.messageInput;if(document.activeElement!==t)return void this.hide();const i=document.getSelection();if(Fs(i))this.hide();else if(c.Z)if(T.IS_APPLE)this.show(),this.setTooltipPosition();else{if(2===this.mouseUpCounter)return void(this.mouseUpCounter=0);this.savedRange=i.getRangeAt(0),this.setMouseUpEvent()}else this.container&&this.container.classList.contains("is-visible")?this.setTooltipPosition():t.matches(":active")?this.setMouseUpEvent():this.show()})),document.addEventListener("beforeinput",(e=>{"historyRedo"!==e.inputType&&"historyUndo"!==e.inputType||e.target.addEventListener("input",(()=>this.setActiveMarkupButton()),{once:!0})})))}}var Eo=i(9171);class Io{constructor(e,t){let i;this.options=t,this.onDragOver=e=>{this.container.classList.add("is-dragover")},this.onDragLeave=e=>{this.container.classList.remove("is-dragover")},this.onDrop=e=>{this.options.onDrop(e)},this.container=document.createElement("div"),this.container.classList.add("drop","z-depth-1"),this.outlineWrapper=document.createElement("div"),this.outlineWrapper.classList.add("drop-outline-wrapper"),this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.classList.add("drop-outline"),this.path=document.createElementNS("http://www.w3.org/2000/svg","path"),this.path.classList.add("drop-outline-path"),t.icon&&(i=document.createElement("div"),i.classList.add("drop-icon","tgico-"+t.icon));const s=document.createElement("div");let n;s.classList.add("drop-header"),s.append((0,C.ag)(t.header,t.headerArgs)),t.subtitle&&(n=document.createElement("div"),n.classList.add("drop-subtitle"),n.append((0,C.ag)(t.subtitle))),this.svg.append(this.path),this.outlineWrapper.append(this.svg),this.container.append(...[this.outlineWrapper,i,s,n].filter(Boolean)),e.append(this.container),this.container.addEventListener("dragover",this.onDragOver),this.container.addEventListener("dragleave",this.onDragLeave),this.container.addEventListener("drop",this.onDrop)}destroy(){delete this.options,this.container.remove(),this.container.removeEventListener("dragover",this.onDragOver),this.container.removeEventListener("dragleave",this.onDragLeave),this.container.removeEventListener("drop",this.onDrop)}setPath(){const e=this.outlineWrapper.getBoundingClientRect();this.svg.setAttributeNS(null,"preserveAspectRatio","none"),this.svg.setAttributeNS(null,"viewBox",`0 0 ${e.width} ${e.height}`),this.svg.setAttributeNS(null,"width",`${e.width}`),this.svg.setAttributeNS(null,"height",`${e.height}`);const t=10,i=e.width-t,s=e.height-t,n=(0,Eo.Z)(5,5,i,s,t,t,t,t);this.path.setAttributeNS(null,"d",n)}}var Mo=i(7922);function Po(e){e.forEach((e=>e.classList.add("no-transition"))),(0,pe.d1)().then((()=>{e.forEach((e=>e.classList.remove("no-transition")))}))}var Zo=i(490),ko=i(2831),To=i(2207);class xo{constructor(e){this.maxRadius=10,this.minRadius=0,this.N=e,this.radius=new Array(e+1),this.radiusNext=new Array(e+1),this.progress=new Array(e+1),this.speed=new Array(e+1);for(let t=0;t<=e;t++)this.generateBlob(this.radius,t),this.generateBlob(this.radiusNext,t),this.progress[t]=0}generateBlob(e,t){const{maxRadius:i,minRadius:s,speed:n}=this,a=i-s;e[t]=s+Math.random()*a,n[t]=.017+.003*Math.random()}generateNextBlob(){const{radius:e,radiusNext:t,progress:i,N:s}=this;for(let n=0;n=1&&(s[r]=0,a[r]=o[r],this.generateBlob(o,r))}draw(e,t,i,s,n,a,o,r){if(n.getContext){const d=n.getContext("2d");d.beginPath(),d.moveTo(i,s),d.lineTo(e,s);const{radius:l,radiusNext:c,N:h}=this;for(let n=0;n<=h;n++)if(0===n){const i=this.progress[n],s=(t-(l[n]*(1-i)+c[n]*i))*r+o*(1-r);d.lineTo(e,s)}else{const a=this.progress[n-1],u=l[n-1]*(1-a)+c[n-1]*a,p=this.progress[n],f=(i-e)/h*(n-1),m=(i-e)/h*n,g=f+(m-f)/2,v=(t-u)*r+o*(1-r),b=(t-(l[n]*(1-p)+c[n]*p))*r+o*(1-r);d.bezierCurveTo(g,v,g,b,m,b),n===h&&d.lineTo(i,s)}a(d),d.fill(),d.closePath()}}}class Ao{constructor(e){this.stateId=e,this.createGradient(e)}createGradient(e){this.shader=(t,i,s,n,a)=>{t.fillStyle=Ao.getGradientFromType(t,e,i,s,n,a)}}static getGradientFromType(e,t,i,s,n,a){const o=e.createLinearGradient(i,s,n,a);return t===To.Z.MUTED_BY_ADMIN?(o.addColorStop(0,"#F05459"),o.addColorStop(.4,"#766EE9"),o.addColorStop(1,"#57A4FE")):t===To.Z.UNMUTED?(o.addColorStop(0,"#52CE5D"),o.addColorStop(1,"#00B1C0")):t===To.Z.MUTED?(o.addColorStop(0,"#0976E3"),o.addColorStop(1,"#2BCEFF")):t===To.Z.CONNECTING&&(o.addColorStop(0,"#8599aa"),o.addColorStop(1,"#8599aa")),o}update(e,t,i,s){}}class _o{constructor(){this.handleDevicePixelRatioChanged=e=>{this.setSize(),this.forceUpdate()},this.handleResize=()=>{this.resizeHandler&&(clearTimeout(this.resizeHandler),this.resizeHandler=null),this.resizing=!0,this.resizeCanvas(),this.resizeHandler=window.setTimeout((()=>{this.resizing=!1,this.invokeDraw()}),250)},this.handleFocus=()=>{this.focused=!0,this.invokeDraw()},this.handleBlur=()=>{this.focused=!1},this.invokeDraw=()=>{this.raf||this.draw()},this.draw=(e=!1)=>{if(this.raf=null,!this.mounted)return;const{lbd:t,lbd1:i,lbd2:s,scale:n,left:a,top:o,right:r,bottom:d,currentState:l,previousState:c,focused:h,resizing:u,canvas:p}=this;if(!h&&!u&&this.progressToState>=1)return;let f=Date.now()-this.lastUpdateTime;f>20&&(f=17),this.animateToAmplitude!==this.amplitude&&(this.amplitude+=this.animateAmplitudeDiff*f,this.animateAmplitudeDiff>0?this.amplitude>this.animateToAmplitude&&(this.amplitude=this.animateToAmplitude):this.amplitude0?this.amplitude2>this.animateToAmplitude&&(this.amplitude2=this.animateToAmplitude):this.amplitude21&&(this.progressToState=1,this.previousState=null));const{amplitude:m,amplitude2:g,progressToState:v}=this,b=6*g*n,y=6*g*n;p.getContext("2d").clearRect(0,0,p.width,p.height),t.minRadius=0,t.maxRadius=(2+2*m)*n,i.minRadius=0,i.maxRadius=(3+9*m)*n,s.minRadius=0,s.maxRadius=(3+9*m)*n,t.update(m,.3),i.update(m,.7),s.update(m,.7);for(let e=0;e<2;e++){if(0===e&&!c)continue;let n=1,h=null;0===e?(n=1-v,h=c):(n=c?v:1,l.update(d-o,r-a,f,m),h=l);const u=e=>{e.globalAlpha=.3*n,h.shader(e,a,o,r,d)},g=t=>{t.globalAlpha=0===e?1:n,h.shader(t,a,o,r,d)};i.draw(a,o-b,r,d,p,u,o,1),s.draw(a,o-y,r,d,p,u,o,1),t.draw(a,o,r,d,p,g,o,1)}e||(this.raf=requestAnimationFrame((()=>this.draw())))},this.setCurrentState=(e,t)=>{const{currentState:i,states:s}=this;(null==i?void 0:i.stateId)!==e&&(this.previousState=t?i:null,this.currentState=s.get(e),this.progressToState=this.previousState?0:1)},this.focused=!0,this.resizing=!1,this.lastUpdateTime=Date.now(),this.amplitude=0,this.amplitude2=0,this.states=new Map([[To.Z.UNMUTED,new Ao(To.Z.UNMUTED)],[To.Z.MUTED,new Ao(To.Z.MUTED)],[To.Z.MUTED_BY_ADMIN,new Ao(To.Z.MUTED_BY_ADMIN)],[To.Z.CONNECTING,new Ao(To.Z.CONNECTING)]]),this.previousState=null,this.currentState=this.states.get(To.Z.CONNECTING),this.progressToState=1}componentDidMount(){this.mounted||(this.mounted=!0,window.addEventListener("resize",this.handleResize),this.media=window.matchMedia("screen and (min-resolution: 2dppx)"),this.media.addEventListener("change",this.handleDevicePixelRatioChanged),this.setSize(),this.forceUpdate(),this.lbd=new xo(3),this.lbd1=new xo(7),this.lbd2=new xo(8),this.setAmplitude(this.amplitude),this.draw())}componentWillUnmount(){this.mounted=!1,window.removeEventListener("resize",this.handleResize),this.media.addEventListener("change",this.handleDevicePixelRatioChanged);const{canvas:e}=this;e.getContext("2d").clearRect(0,0,e.width,e.height)}setSize(){this.scale=window.devicePixelRatio,this.top=20*this.scale,this.right=(this.mounted?this.container.offsetWidth:1261)*this.scale,this.bottom=(this.mounted?this.container.offsetHeight:68)*this.scale,this.left=0*this.scale,this.setCanvasSize()}setCanvasSize(){this.canvas.width=this.right,this.canvas.height=this.bottom}resizeCanvas(){this.scale=window.devicePixelRatio,this.right=this.container.offsetWidth*this.scale,this.forceUpdate(),this.invokeDraw()}setAmplitude(e){const{amplitude:t}=this;this.animateToAmplitude=e,this.animateAmplitudeDiff=(e-t)/250,this.animateAmplitudeDiff2=(e-t)/120}forceUpdate(){this.setCanvasSize()}render(e){const t=this.container=document.createElement("div");t.classList.add(e);const i=this.canvas=document.createElement("canvas");return i.classList.add(e+"-canvas"),t.append(i),t}}var Fo=i(8222);class Do{constructor(e,t){this.item=e,(0,Rn.Z)(this,t)}play(e){return this.item.playPart(this,e)}}class Ro{constructor(e,t){this.icon=e,this.autoplay=!1,(0,Rn.Z)(this,t),this.parts=this.parts.map((e=>this.createPart(e)))}load(){var e;let t=this.loadPromise;if(t)return t;const{container:i,canvas:s,width:n,height:a}=this.icon;return t=Rs.Z.loadAnimationAsAsset({container:i,canvas:s,width:n,height:a,group:"none",loop:!1,autoplay:null!==(e=this.autoplay)&&void 0!==e&&e,initFrame:this.initFrame,skipFirstFrameRendering:void 0===this.initFrame,color:this.color,inverseColor:this.inverseColor},this.name).then((e=>Rs.Z.waitForFirstFrame(e))).then((e=>{this.player=e,this.onLoadForColor&&(this.onLoadForColor(),this.onLoadForColor=void 0),this.onLoadForPart&&(this.onLoadForPart(),this.onLoadForPart=void 0)})),this.loadPromise=t,this.icon.loadPromises.set(this.name,t),t}createPart(e){return new Do(this,e)}getPart(e){return e instanceof Do?e:"string"==typeof e?this.parts.find((t=>t.name===e)):this.parts[e]}playPart(e,t){return this.icon.playPart(this,e,t)}}class Bo{constructor(e){(0,Rn.Z)(this,e),this.container||(this.container=document.createElement("div")),this.container.classList.add("rlottie-icon");const{width:t,height:i}=this;this.container.style.width=t+"px",this.container.style.height=i+"px";const s=this.canvas=document.createElement("canvas");s.classList.add("rlottie"),s.width=t,s.height=i,this.items=new Map,this.loadPromises=new Map}get loadPromise(){return Promise.all([...this.loadPromises.values()]).then(Qe.Z)}getItem(e){return e||1!==this.items.size?this.items.get(e):this.items.values().next().value}add(e){const t=new Ro(this,e);return this.items.set(e.name,t),t}playPart(e,t,i){if(!e.player)return void(e.onLoadForPart=()=>{this.playPart(e,t,i)});const s=e.getPart(t);e.player.playPart({from:d.Z.settings.animationsEnabled&&!this.skipAnimation?s.startFrame:s.endFrame,to:s.endFrame,callback:i})}static generateEqualParts(e,t){return new Array(e).fill(0).map(((e,i)=>{const s=i*t;return{startFrame:s,endFrame:s+t-1}}))}}class No extends Bo{constructor(e){super({width:e.width,height:e.height}),(0,Rn.Z)(this,e)}load(e,t){if(this.loaded)return this.loadPromise;this.loaded=!0,this.partState=e,this.colorState=t;const i=this.getPart(e),s=void 0!==t&&this.getColor&&this.getColor(t),n=i.item;n.initFrame=i.endFrame,n.color=s;const a=[...this.items.values()].map((e=>e.load()));return Promise.all(a).then(Qe.Z)}setState(e,t,i){this.loaded||this.load(e,t);let s=!1,n=!1;return void 0!==e?s=this.setPartState(e,t,i):void 0!==t&&(n=this.setColorState(t)),s||n}setPartState(e,t,i){const{partState:s}=this;return s===e?void 0!==t&&this.setColorState(t):(void 0!==t&&this.setColorState(t,!1),this.partState=e,this.getPart(e,s).play(i),!0)}setColorState(e,t=!0){const{colorState:i}=this;if(i===e||!this.getColor)return!1;this.colorState=e;const s=this.getItem(),n=this.getColor(e,i),a=()=>{s.player.setColor(n,t)};return s.player?a():s.onLoadForColor=a,!0}destroy(){this.items.forEach((e=>{e.loadPromise.then((()=>{e.player.remove()}))}))}}class Oo extends No{constructor(){super({width:36,height:36,getPart:(e,t)=>{const i=pr;let s;switch(e){case i.HAND:s=t===i.MUTED?"muted-to-hand":"unmuted-to-hand";break;case i.MUTED:s=t===i.HAND?"hand-to-muted":"mute";break;case i.UNMUTED:s="unmute"}return this.getItem().getPart(s)}}),this.container.classList.add("group-call-microphone-icon-container"),this.add({name:"voip_filled",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:172,name:"unmuted-to-hand"},{startFrame:173,endFrame:201,name:"scheduled-crossing"},{startFrame:202,endFrame:236,name:"scheduled-to-muted"},{startFrame:237,endFrame:273,name:"scheduled-to-hand"},{startFrame:274,endFrame:310,name:"scheduled-crossed-to-hand"},{startFrame:311,endFrame:343,name:"scheduled-uncrossing"},{startFrame:344,endFrame:375,name:"scheduled-to-muted"},{startFrame:376,endFrame:403,name:"play-to-muted"}]})}}var Uo=i(6733);class Ho extends No{constructor(e){super({width:32,height:32,getPart:(e,t)=>{const i=ur;let s;switch(e){case i.HAND:s=3;break;case i.MUTED:s=t===i.HAND?0:2;break;case i.UNMUTED:s=1}return this.getItem().getPart(s)},getColor:e?(e,t)=>function(e){const t=ur;let i;switch(e){case t.HAND:i="blue";break;case t.MUTED:case t.MUTED_FOR_ME:case t.MUTED_BY_ADMIN:i=e===t.MUTED?"secondary":"red";break;case t.UNMUTED:i="green"}const s=Fo.Z.getProperty("gc-"+i+"-text-color");return(0,N.oo)(s)}(e):void 0}),this.colored=e,this.container.classList.add("group-call-participant-muted-icon-container");const t=Bo.generateEqualParts(4,21);this.add({name:"voice_outlined2",parts:t})}setState(e){return super.setState(function(e){const t=ur;switch(e){case t.MUTED_BY_ADMIN:case t.MUTED_FOR_ME:return t.MUTED;default:return e}}(e),e)}}const zo="group-call-participant-status";class jo{constructor(e){this.withIcons=e,this.container=document.createElement("div"),this.container.classList.add(zo+"-container")}setState(e,t){const i=ur,s=this.withIcons.filter((e=>!!t[e])).map((e=>{const t="tgico-"+("presentation"===e?"listscreenshare":"videocamera_filled"),i=document.createElement("i");return i.classList.add(zo+"-icon",zo+"-icon-"+e,t),i}));let n,a;if(e===i.MUTED_FOR_ME)n=(0,C.ag)("VoiceChat.Status.MutedForYou"),a="is-muted";else if(e===i.UNMUTED)n=(0,C.ag)("VoiceChat.Status.Speaking"),a="is-speaking";else if(e===i.HAND)n=(0,C.ag)("VoiceChat.Status.WantsSpeak"),a="is-waiting";else{if(t.about&&!s.length)return void(0,_.Z)(this.container,(0,R.Z)(t.about));n=(0,C.ag)("VoiceChat.Status.Listening"),a="is-listening"}const o=document.createElement("span");o.classList.add(zo,a),o.append(...s,n),(0,U.Z)(this.container,o)}}var Go=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Vo extends ps.Z{constructor(e){super({getIndex:e=>Go(this,void 0,void 0,(function*(){return(yield this.instance.getParticipantByPeerId(e.id)).date})),onDelete:e=>{e.dom.listEl.remove(),this.onElementDestroy(e)},onUpdate:e=>Go(this,void 0,void 0,(function*(){const t=yield this.instance.getParticipantByPeerId(e.id),i=fr(t);e.mutedIcon.setState(i),e.status.setState(i,t)})),onSort:(e,t)=>{(0,p.Z)(e.dom.listEl,this.list,t)},onElementCreate:e=>{const{dom:t}=Ji.default.addDialogNew({peerId:e.id,container:!1,avatarSize:this.avatarSize,autonomous:this.autonomous,meAsSaved:!1,rippleEnabled:this.rippleEnabled,wrapOptions:{lazyLoadQueue:this.lazyLoadQueue}});t.listEl.classList.add("group-call-participant");const i=new Ho(!0),s=new jo(["presentation","video"]);return(0,U.Z)(t.lastMessageSpan,s.container),t.listEl.append(i.container),e.mutedIcon=i,e.status=s,e.dom=t,e},updateElementWith:pe.T2}),this.instance=e,this.avatarSize="abitbigger",this.rippleEnabled=!0,this.autonomous=!0,this.createChatListOptions={dialogSize:72},this.list=Ji.default.createChatList(this.createChatListOptions)}destroy(){this.elements.forEach((e=>{this.onElementDestroy(e)}))}onElementDestroy(e){e.mutedIcon.destroy()}}var Ko=i(7529);function Wo(e){const t=document.createElement("canvas");t.classList.add("call-video-blur"),t.width=16,t.height=16;const i=t.getContext("2d",{alpha:!1});i.filter="blur(2px)";const s=()=>{i.drawImage(e,0,0,e.videoWidth,e.videoHeight,0,0,t.width,t.height)};return(0,Me.jt)((()=>(s(),t.isConnected))),s(),t}const $o="group-call-participant-video";class qo{constructor(e,t,i){this.managers=e,this.instance=t,this.source=i,this.container=document.createElement("div"),this.container.classList.add($o+"-container"),this.info=document.createElement("div"),this.info.classList.add($o+"-info"),this.left=document.createElement("div"),this.left.classList.add($o+"-info-left"),this.right=document.createElement("div"),this.right.classList.add($o+"-info-right"),this.info.append(this.left,this.right),this.container.append(this.info)}setPinned(e){if(!e)return void(this.header&&(this.header.remove(),this.header=void 0));if(this.header)return;this.header=document.createElement("div"),this.header.classList.add($o+"-header");const t=document.createElement("i");t.classList.add("group-call-pin-icon","tgico-pin"),this.header.append(t),this.container.append(this.header)}setParticipant(e,t,i){let s;e.pFlags.self?(s=(0,C.ag)("VoiceChat.Status.You"),s.classList.add("peer-title")):(this.peerTitle=new B.Z({peerId:(0,D.Z)(e.peer)}),s=this.peerTitle.element),this.groupCallParticipantMutedIcon=new Ho(!1),this.groupCallParticipantStatus=new jo([t]),this.left.append(s,this.groupCallParticipantStatus.container),this.right.append(this.groupCallParticipantMutedIcon.container),i.classList.add($o,"call-video"),i.paused&&i.play();const n=Wo(i);n.classList.add($o+"-blur"),this.container.prepend(n,i),this.updateParticipant(e)}updateParticipant(e){const t=fr(e);this.groupCallParticipantMutedIcon.setState(t),this.groupCallParticipantStatus.setState(t,e)}destroy(){this.groupCallParticipantMutedIcon.destroy()}}class Qo extends Ko.Z{constructor(e){super(),(0,Rn.Z)(this,e);const t=this.container=document.createElement("div");this.container.classList.add("group-call-participants-video-container"),e.appendTo.append(t),this.participantsElements=new Map,this.containers=new Map;const{listenerSetter:i}=this;i.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),i.add(this.instance)("pinned",(e=>{this.participantsElements.forEach((t=>{t.forEach((t=>{this.setElementDisplay(t,e)}))}))})),(0,S.fc)(this.container,(e=>{const t=(0,ve.Z)(e.target,"group-call-participant-video-container");if(!t)return;const i=this.containers.get(t);this.instance.pinnedSource!==i.source?this.instance.pinSource(i.source):this.instance.unpinAll()}),{listenerSetter:i}),this.setInstance(this.instance),this.setup({element:t,listenerSetter:i,showOnLeaveToClassName:"group-call-buttons"})}shouldDisplayElement(e,t){return this.displayPinned?!t||e.source===t:t&&e.source!==t}setElementDisplay(e,t){const i=this.shouldDisplayElement(e,t);e.container.classList.toggle("video-hidden",!i);const s=e.source===t;e.setPinned(s)}updateParticipant(e){const t=(0,D.Z)(e.peer),i=["video","presentation"],s=i.some((t=>!!e[t]));let n=this.participantsElements.get(t);(s||n)&&(n||this.participantsElements.set(t,n=new Map),i.forEach((i=>{let s=n.get(i);const a=e[i];if(!!a!=!!s){if(a){const t=this.instance.getVideoElementFromParticipantByType(e,i);if(!t)return;const{video:a,source:o}=t;s=new qo(this.managers,this.instance,o),this.containers.set(s.container,s),this.setElementDisplay(s,this.instance.pinnedSource),n.set(i,s),s.setParticipant(e,i,a),this.container.prepend(s.container)}else n.delete(i),s.container.remove(),n.size||(this.participantsElements.delete(t),this.containers.delete(s.container),s.destroy());this._onLengthChange()}else s&&s.updateParticipant(e)})))}_onLengthChange(){const e=this.container.childElementCount;this.container.dataset.length=""+e,this.container.dataset.layout=e<=2?"1":3===e?"3":"4",this.onLengthChange&&this.onLengthChange(e)}setInstance(e){return t=this,i=void 0,n=function*(){(yield e.participants).forEach((e=>{this.updateParticipant(e)}))},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}destroy(){this.containers.forEach((e=>{e.destroy()}))}}var Yo=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class Xo{constructor(e){this.onOpenProfileClick=()=>{const e=w.Z.getPopups(vr)[0];e&&e.hide(),Jr.setInnerPeer({peerId:this.targetPeerId})},this.toggleParticipantMuted=e=>{this.instance.editParticipant(this.participant,{muted:e})},this.buttons=[{icon:"gc_microphoneoff",text:"VoiceChat.MutePeer",verify:()=>this.canManageCall&&this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmutePeer",verify:()=>this.canManageCall&&!this.participant.pFlags.can_self_unmute,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"gc_microphoneoff",text:"VoiceChat.MuteForMe",verify:()=>!this.canManageCall&&!this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!0)},{icon:"gc_microphone",text:"VoiceChat.UnmuteForMe",verify:()=>!this.canManageCall&&this.participant.pFlags.muted_by_you,onClick:()=>this.toggleParticipantMuted(!1)},{icon:"newprivate",text:"VoiceChat.OpenProfile",verify:()=>!0,onClick:this.onOpenProfileClick},{icon:"deleteuser danger",text:"VoiceChat.RemovePeer",verify:()=>this.managers.appChatsManager.hasRights(this.chatId,"ban_users"),onClick:()=>Yo(this,void 0,void 0,(function*(){(0,vi.Z)({peerId:this.targetPeerId,title:new B.Z({peerId:this.targetPeerId}).element,descriptionLangKey:(yield this.managers.appChatsManager.isBroadcast(this.chatId))?"VoiceChat.RemovePeer.Confirm.Channel":"VoiceChat.RemovePeer.Confirm",descriptionLangArgs:[new B.Z({peerId:this.targetPeerId}).element],button:{langKey:"VoiceChat.RemovePeer.Confirm.OK",isDanger:!0}}).then((()=>{this.managers.appChatsManager.kickFromChat(this.chatId,this.targetPeerId)}),Qe.Z)}))}];const{listenerSetter:t}=e;this.managers=e.managers,this.instance=e.instance,this.chatId=this.instance.chatId,this.element=(0,ks.b)({buttons:this.buttons,listenerSetter:t}),this.element.classList.add("group-call-participant-menu","night"),(0,Ct.E)({element:e.onContextElement,callback:e=>Yo(this,void 0,void 0,(function*(){const t=(0,ve.Z)(e.target,"group-call-participant");if(!t)return;this.element.parentElement!==i&&i.append(this.element),(0,Ce.Z)(e);const s=this.targetPeerId=t.dataset.peerId.toPeerId();this.participant=yield this.instance.getParticipantByPeerId(s),this.participant.pFlags.self||(this.canManageCall=yield this.managers.appChatsManager.hasRights(this.chatId,"manage_call"),yield(0,en.Z)(this.buttons,(e=>Yo(this,void 0,void 0,(function*(){const t=yield e.verify(s);return e.element.classList.toggle("hide",!t),t})))),(0,Js.Z)(e.touches?e.touches[0]:e,this.element,"right"),Lt.Z.openBtnMenu(this.element))})),listenerSetter:t}),t.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{if(this.instance.id===e){const e=(0,D.Z)(t.peer);this.targetPeerId===e&&Lt.Z.close()}}));let i=document.body;(0,Uo.Ms)(document.body,(()=>{const e=(0,Uo.rB)();i=e?w.Z.getPopups(vr)[0].getContainer():document.body,e||Lt.Z.close()}),t)}}class Jo{constructor(e){(0,Rn.Z)(this,e);const t="group-call-participants",i=new Z.ZP(void 0);i.container.classList.add(t+"-scrollable");const s=this.container=document.createElement("div");s.classList.add(t);const n=this.sortedList=new Vo(this.instance),{instance:a,listenerSetter:o}=this;this.contextMenu=new Xo(Object.assign(Object.assign({},e),{onContextElement:n.list,listenerSetter:o,instance:a})),this.groupCallParticipantsVideo=new Qo(Object.assign(Object.assign({},e),{appendTo:i.container,displayPinned:!1})),i.append(n.list),s.append(i.container),e.appendTo.append(s),o.add(d.Z)("group_call_participant",(({groupCallId:e,participant:t})=>{this.instance.id===e&&this.updateParticipant(t)})),new Vs.Z({scrollable:i,getPromise:()=>this.managers.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then((({participants:e,isEnd:t})=>(e.forEach((e=>{this.updateParticipant(e)})),t)))}),this.setInstance(a)}updateParticipant(e){const t=(0,D.Z)(e.peer),i=this.sortedList.has(t);e.pFlags.left?i&&this.sortedList.delete(t):i?this.sortedList.update(t):this.sortedList.add(t)}setInstance(e){return Yo(this,void 0,void 0,(function*(){(yield e.participants).forEach((e=>{this.updateParticipant(e)}))}))}destroy(){this.sortedList.destroy(),this.groupCallParticipantsVideo.destroy()}}class er{constructor(e){this.appendTo=e,this.descriptionIntl=new C.ZP.IntlElement({key:"VoiceChat.Status.Connecting"}),this.descriptionIntl.element.classList.add("group-call-description")}detach(){this.descriptionIntl.element.remove()}update(e){const{state:t}=e;let i,s;t===To.Z.CONNECTING?i="VoiceChat.Status.Connecting":(i="VoiceChat.Status.Members",s=[e.groupCall.participants_count]);const{descriptionIntl:n}=this;n.compareAndUpdate({key:i,args:s}),this.descriptionIntl.element.parentElement||this.appendTo.append(this.descriptionIntl.element)}}class tr{constructor(e){this.appendTo=e,this.peerTitle=new B.Z({peerId:0})}update(e){const{peerTitle:t,appendTo:i}=this,s=e.groupCall,n=e.chatId.toPeerId(!0);s.title?(0,_.Z)(i,(0,R.Z)(s.title)):(t.options.peerId!==n&&(t.options.peerId=n,t.update()),t.element.parentElement!==i&&i.append(t.element))}}var ir=i(2820);function sr(e,t,i){const s=e+"-button",n=document.createElement("div");n.classList.add(s,"call-button","rp-overflow"),i.icon&&n.classList.add("tgico-"+i.icon),i.noRipple||(0,x.Z)(n),i.isDanger&&n.classList.add(s+"-red"),i.isConfirm&&n.classList.add(s+"-green"),i.callback&&(0,S.fc)(n,i.callback,{listenerSetter:t});let a=n;if(i.text){const e=document.createElement("div");e.classList.add(s+"-container","call-button-container");const t="string"==typeof i.text?(0,C.ag)(i.text):i.text;t.classList.add(s+"-text","call-button-text"),e.append(n,t),a=e}return a}var nr=i(3757);const ar="movable-element",or=ar+"-resize-handler";class rr extends l.Z{constructor(e){super(!0),this.onResize=()=>{this.fixDimensions(),this.fixPosition(),this.setPosition()},(0,Rn.Z)(this,e),this.top=this.left=this.width=this.height=0,this.element.classList.add(ar),this.addResizeHandlers(),this.setSwipeHandler(),o.Z.addEventListener("resize",this.onResize)}destroyElements(){this.element.classList.remove(ar),this.handlers&&this.handlers.forEach((e=>{e.remove()}))}destroy(){o.Z.removeEventListener("resize",this.onResize),this.swipeHandler.removeListeners()}addResizeHandlers(){this.handlers=["n","e","s","w","ne","se","sw","nw"].map((e=>{const t=document.createElement("div");return t.dataset.side=e,t.classList.add(or,or+"-side-"+e),this.element.append(t),t}))}setSwipeHandler(){let e,t,i,s,n;const a=this.swipeHandler=new nr.Z({element:this.element,onSwipe:(a,o,r)=>{if(n){if(n.includes("e")||n.includes("w")){const e=n.includes("e")&&a>0||n.includes("w")&&a<0,s=Math.abs(a)*(e?1:-1),o=n.includes("e")?xe.Z.width-t:i+t;this.width=Math.min(o,i+s)}if(n.includes("n")||n.includes("s")){const t=n.includes("s")&&o>0||n.includes("n")&&o<0,i=Math.abs(o)*(t?1:-1),a=n.includes("s")?xe.Z.height-e:s+e;this.height=Math.min(a,s+i)}this.fixDimensions(),n.includes("w")&&(this.left=Math.min(t+i-this.minWidth,t+a)),n.includes("n")&&(this.top=Math.min(e+s-this.minHeight,e+o))}else this.top=e+o,this.left=t+a;this.fixPosition(),this.setPosition()},verifyTouchTarget:e=>{const t=e.target;if(this.verifyTouchTarget&&!this.verifyTouchTarget(e))return!1;const i=(0,ve.Z)(t,or);return i?(n=i.dataset.side,a.setCursor("")):(n=void 0,a.setCursor("grabbing")),!0},onFirstSwipe:()=>{e=this.top,t=this.left,i=this.width,s=this.height}})}setPositionToCenter(){this.top=xe.Z.height/2-this.height/2,this.left=xe.Z.width/2-this.width/2,this.setPosition()}fixDimensions(){this.width=(0,Gi.Z)(this.width,this.minWidth,xe.Z.width),this.height=(0,Gi.Z)(this.height,this.minHeight,xe.Z.height)}fixPosition(){this.top=(0,Gi.Z)(this.top,0,xe.Z.height-this.height),this.left=(0,Gi.Z)(this.left,0,xe.Z.width-this.width)}setPosition(){this.element.style.top=this.top+"px",this.element.style.left=this.left+"px",this.element.style.right="auto",this.element.style.bottom="auto",this.element.style.width=this.width+"px",this.element.style.height=this.height+"px",this.dispatchEvent("resize")}get width(){return this._width}get height(){return this._height}set width(e){this._width=e}set height(e){this._height=e}get state(){const{top:e,left:t,width:i,height:s}=this;return{top:e,left:t,width:i,height:s}}set state(e){const{top:t,left:i,width:s,height:n}=e;this.top=t,this.left=i,this.width=s,this.height=n,this.onResize()}}var dr,lr=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i};class cr{constructor(e){dr.set(this,void 0),(0,Rn.Z)(this,e),this.toggleMovable(!c.Z),this.listenerSetter.add(o.Z)("changeScreen",((e,t)=>{t!==o._.mobile&&e!==o._.mobile||this.toggleMovable(!c.Z)}))}destroy(){const e=this.movable;e&&e.destroy()}get movable(){return function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)}(this,dr,"f")}get state(){return this.movable?this.movable.state:this.previousState}set state(e){this.previousState=e}toggleMovable(e){let{movable:t}=this;if(e){if(t)return;t=lr(this,dr,new rr(this.movableOptions),"f"),t.state=this.previousState,void 0===this.previousState.top&&t.setPositionToCenter(),this.onResize&&this.listenerSetter.add(t)("resize",this.onResize)}else{if(!t)return;this.previousState=t.state,t.destroyElements(),t.destroy(),lr(this,dr,void 0,"f")}}}function hr(e,t,i){return t.forEach((t=>{t.classList.toggle(e,i)})),()=>hr(e,t,!i)}dr=new WeakMap;var ur,pr;function fr(e){const t=ur;return e.pFlags.muted_by_you?t.MUTED_FOR_ME:void 0!==e.raise_hand_rating?t.HAND:e.pFlags.muted?e.pFlags.can_self_unmute?t.MUTED:t.MUTED_BY_ADMIN:t.UNMUTED}!function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_FOR_ME=2]="MUTED_FOR_ME",e[e.MUTED_BY_ADMIN=3]="MUTED_BY_ADMIN",e[e.HAND=4]="HAND"}(ur||(ur={})),function(e){e[e.HAND=0]="HAND",e[e.MUTED=1]="MUTED",e[e.UNMUTED=2]="UNMUTED"}(pr||(pr={}));let mr={width:420,height:640};const gr="group-call";class vr extends w.Z{constructor(){super("popup-group-call",{body:!0,withoutOverlay:!0,closable:!0,title:!0}),this.onFullScreenClick=()=>{(0,Uo.Dj)(this.container)},this.onToggleControls=e=>{this.container.classList.toggle("show-controls",e),this.buttonsContainer.classList.toggle("show-controls",e)},this.toggleDisability=hr.bind(null,"btn-disabled"),this.onVideoClick=()=>{const e=this.toggleDisability([this.btnVideo],!0);this.instance.toggleVideoSharing().finally((()=>{e()}))},this.onScreenClick=()=>{const e=this.toggleDisability([this.btnScreen],!0);this.instance.toggleScreenSharing().finally((()=>{e()}))},this.onMuteClick=()=>{const e=this.instance.participant;e.pFlags.can_self_unmute?this.instance.toggleMuted():void 0===e.raise_hand_rating&&this.instance.changeRaiseHand(!0)},this.onLeaveClick=()=>{return e=this,t=void 0,s=function*(){const e=e=>{this.instance.hangUp(e)};(yield this.managers.appChatsManager.hasRights(this.instance.chatId,"manage_call"))?new xs.Z("popup-end-video-chat",{titleLangKey:"VoiceChat.End.Title",descriptionLangKey:"VoiceChat.End.Text",checkboxes:[{text:"VoiceChat.End.Third"}],buttons:[{langKey:"VoiceChat.End.OK",callback:t=>{e(!!t.size)},isDanger:!0}]}).show():e(!1)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s},this.onFullScreenChange=()=>{this.toggleBigLayout();const e=(0,Uo.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,n=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),i&&i.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==n&&(s.Z.checkAnimations2(e),bo.Z.setThemeColor(e?"#000000":void 0))},this.toggleBigLayout=()=>{var e;const t=(0,Uo.rB)(),i=null===(e=this.movablePanel)||void 0===e?void 0:e.movable,s=(t||!!(i&&i.width>=680))&&!!this.videosCount,n=this.container.classList.contains("is-big-layout");let a;s&&!n&&(a=Array.from(this.buttonsContainer.children),a.forEach((e=>{e.style.opacity="0"})),this.buttonsContainer.offsetLeft),this.container.classList.toggle("is-big-layout",s),this.btnInvite.classList.toggle("hide",s),this.btnShowColumn.classList.toggle("hide",!s),a&&a.forEach((e=>{e.style.opacity=""}))},this.toggleRightColumn=()=>{this.container.classList.toggle("is-right-column-shown")},this.videosCount=0,this.container.classList.add(gr,"night");const e=this.instance=oo.ZP.groupCall,{listenerSetter:t}=this;if(!T.IS_APPLE_MOBILE){const e=this.btnFullScreen=(0,On.Z)("fullscreen"),i=this.btnFullScreen2=(0,On.Z)("fullscreen "+gr+"-cfs"),s=this.btnExitFullScreen=(0,On.Z)("smallscreen");(0,S.fc)(e,this.onFullScreenClick,{listenerSetter:t}),(0,S.fc)(i,this.onFullScreenClick,{listenerSetter:t}),(0,S.fc)(s,(()=>{(0,Uo.C8)()}),{listenerSetter:t}),(0,Uo.Ms)(this.container,this.onFullScreenChange,t)}this.btnInvite=(0,On.Z)("adduser");const i=this.btnShowColumn=(0,On.Z)("rightpanel "+gr+"-only-big");(0,S.fc)(i,this.toggleRightColumn,{listenerSetter:t});const n=document.createElement("div");n.classList.add(gr+"-header-info"),this.title.classList.add(gr+"-header-title");const a=document.createElement("div");a.classList.add(gr+"-header-subtitle"),n.append(this.title,a),this.header.classList.add(gr+"-header"),this.header.append(...[this.btnExitFullScreen,n,this.btnFullScreen,i].filter(Boolean));const o=this.header.cloneNode(!1),r=n.cloneNode(!1),l=this.title.cloneNode(!1);r.append(l);const c=(0,On.Z)("rightpanel");o.append(...[c,r,this.btnFullScreen2].filter(Boolean)),(0,S.fc)(c,this.toggleRightColumn,{listenerSetter:t}),this.body.prepend(o);const h=new Z.ZP(void 0);h.container.classList.add("group-call-big-video-container"),this.container.append(h.container),this.groupCallTitle=new tr(this.title),this.groupCallDescription=new er(a),this.groupCallBodyHeaderDescription=new er(l),this.constructButtons(),this.groupCallParticipantsVideo=new Qo({appendTo:h.container,instance:e,listenerSetter:t,displayPinned:!0,onLengthChange:e=>{this.videosCount=e,this.toggleBigLayout()},managers:this.managers}),this.groupCallParticipants=new Jo({appendTo:this.body,instance:e,listenerSetter:t,managers:this.managers}),this.movablePanel=new cr({listenerSetter:t,movableOptions:{minWidth:400,minHeight:480,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,ve.Z)(t,"chatlist")||(0,ve.Z)(t,"group-call-button")||(0,ve.Z)(t,"btn-icon")||(0,ve.Z)(t,"group-call-participants-video-container")||(0,Uo.rB)())}},onResize:()=>this.toggleBigLayout(),previousState:mr}),t.add(e)("state",(()=>{this.updateInstance()})),t.add(d.Z)("group_call_update",(e=>{var t;(null===(t=this.instance)||void 0===t?void 0:t.id)===e.id&&this.updateInstance()})),t.add(e)("pinned",(()=>{this.setHasPinned()})),t.add(this.groupCallParticipantsVideo)("toggleControls",this.onToggleControls),this.addEventListener("close",(()=>{const{movablePanel:e}=this;mr=e.state,this.groupCallParticipantsVideo.destroy(),this.groupCallParticipants.destroy(),this.groupCallMicrophoneIcon.destroy(),e.destroy()})),this.toggleRightColumn(),this.onFullScreenChange(),this.updateInstance()}constructButtons(){const e=this.buttonsContainer=document.createElement("div");e.classList.add(gr+"-buttons");const t=sr.bind(null,gr,this.listenerSetter),i=this.btnVideo=t({callback:this.onVideoClick,icon:"videocamera_filled"}),s=this.btnScreen=t({callback:this.onScreenClick,icon:"sharescreen_filled"});s.classList.toggle("hide",!ir.Z);const n=t({noRipple:!0,callback:(0,qa.Z)(this.onMuteClick,600,!0)});n.classList.add(gr+"-microphone-button");const a=this.groupCallMicrophoneIcon=new Oo;n.append(a.container);const o=t({icon:"settings_filled"});o.classList.add("btn-disabled"),o.classList.toggle("hide",!ir.Z);const r=t({isDanger:!0,callback:this.onLeaveClick,icon:"close"});e.append(i,s,n,o,r),this.container.append(e)}getContainer(){return this.container}setHasPinned(){this.container.classList.toggle("has-pinned",!!this.instance.pinnedSource)}updateInstance(){if(this.instance.state===To.Z.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,Uo.C8)(),void this.hide();const{participant:e,groupCall:t}=this.instance;if(!e)return;this.setTitle(),this.setDescription(),this.setHasPinned();const i=function(e,t){const i=pr;return t.pFlags.can_self_unmute?t.pFlags.muted?i.MUTED:i.UNMUTED:i.HAND}(0,e);this.container.dataset.micState=i===pr.HAND?"hand":i===pr.MUTED?"muted":"unmuted",this.groupCallMicrophoneIcon.setState(i)}setTitle(){this.groupCallTitle.update(this.instance)}setDescription(){this.groupCallDescription.update(this.instance),this.groupCallBodyHeaderDescription.update(this.instance)}}var br=i(9078),yr=i(3335);class wr{constructor(e){this.appendTo=e,this.container=document.createElement("div"),this.container.classList.add("call-description")}detach(){void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0),this.container.remove(),this.state=void 0}update(e){const{connectionState:t}=e;if(this.state===t)return;let i;if(this.state=t,t===yr.Z.CONNECTED){i=document.createElement("span"),i.classList.add("call-description-duration");const t=()=>{i.innerText=(0,ts.Z)(e.duration,!0)};this.interval=window.setInterval(t,1e3),t()}else{let s;switch(t){case yr.Z.PENDING:s=e.isOutgoing?"Call.StatusRinging":"Call.StatusCalling";break;case yr.Z.REQUESTING:s="Call.StatusRequesting";break;case yr.Z.EXCHANGING_KEYS:s="VoipExchangingKeys";break;case yr.Z.CLOSED:s=void 0!==e.connectedAt?"Call.StatusEnded":"Call.StatusFailed";break;default:s="Call.StatusConnecting"}i=(0,C.ag)(s),void 0!==this.interval&&(clearInterval(this.interval),this.interval=void 0)}this.container.classList.toggle("has-duration",t===yr.Z.CONNECTED),(0,U.Z)(this.container,i),this.container.parentElement||this.appendTo.append(this.container)}}class Sr extends No{constructor(e,t){super({width:36,height:36,getPart:e=>this.getItem().getPart(e?"unmute":"mute"),getColor:e?e=>e?[255,255,255]:[158,158,158]:void 0,skipAnimation:t}),this.add({name:"voice_mini",parts:[{startFrame:0,endFrame:35,name:"hand-to-muted"},{startFrame:36,endFrame:68,name:"unmute"},{startFrame:69,endFrame:98,name:"mute"},{startFrame:99,endFrame:135,name:"muted-to-hand"},{startFrame:136,endFrame:171,name:"unmuted-to-hand"}]})}}const Cr="call",Lr={width:400,height:580};let Er=Object.assign({},Lr);class Ir extends w.Z{constructor(e){super("popup-call",{withoutOverlay:!0,closable:!0}),this.instance=e,this.onFullScreenClick=()=>{(0,Uo.Dj)(this.container)},this.onFullScreenChange=()=>{const e=(0,Uo.rB)(),{btnFullScreen:t,btnExitFullScreen:i}=this,n=this.container.classList.contains("is-full-screen");this.container.classList.toggle("is-full-screen",e),t&&t.classList.toggle("hide",e),i&&i.classList.toggle("hide",!e),this.btnClose.classList.toggle("hide",e),e!==n&&(s.Z.checkAnimations(e),bo.Z.setThemeColor(e?"#000000":void 0),this.resizeVideoContainers())},this.videoContainers={};const{container:t,listenerSetter:i}=this;t.classList.add(Cr,"night");const n=document.createElement("div");n.classList.add(Cr+"-avatar");const a=this.peerId=this.instance.interlocutorUserId.toPeerId(),o=new f.Z;o.classList.add("avatar-full"),o.updateWithOptions({isBig:!0,peerId:a}),n.append(o);const r=new B.Z({peerId:a}).element;r.classList.add(Cr+"-title");const d=document.createElement("div");d.classList.add(Cr+"-subtitle"),this.description=new wr(d);const l=this.emojisSubtitle=document.createElement("div");l.classList.add(Cr+"-emojis"),t.append(n,r,d),T.IS_MOBILE?this.header.append(l):(this.btnFullScreen=(0,On.Z)("fullscreen"),this.btnExitFullScreen=(0,On.Z)("smallscreen hide"),(0,S.fc)(this.btnFullScreen,this.onFullScreenClick,{listenerSetter:i}),(0,S.fc)(this.btnExitFullScreen,(()=>(0,Uo.C8)()),{listenerSetter:i}),(0,Uo.Ms)(this.container,this.onFullScreenChange,i),this.header.prepend(this.btnExitFullScreen),this.header.append(this.btnFullScreen),t.append(l)),this.partyStates=document.createElement("div"),this.partyStates.classList.add(Cr+"-party-states"),this.partyMutedState=document.createElement("div"),this.partyMutedState.classList.add(Cr+"-party-state");const c=(0,C.ag)("VoipUserMicrophoneIsOff",[new B.Z({peerId:a,onlyFirstName:!0,limitSymbols:18}).element]);c.classList.add(Cr+"-party-state-text");const h=new Sr(!1,!0);h.setState(!1,!1),this.partyMutedState.append(h.container,c),this.partyStates.append(this.partyMutedState),this.container.append(this.partyStates),this.makeButton=sr.bind(null,Cr,this.listenerSetter),this.constructFirstButtons(),this.constructSecondButtons(),i.add(e)("state",(()=>{this.updateInstance()})),i.add(e)("mediaState",(()=>{this.updateInstance()})),this.movablePanel=new cr({listenerSetter:i,movableOptions:{minWidth:400,minHeight:580,element:this.element,verifyTouchTarget:e=>{const t=e.target;return!((0,ve.Z)(t,"call-button")||(0,ve.Z)(t,"btn-icon")||(0,Uo.rB)())}},previousState:this.instance.wasTryingToJoin||this.instance.isOutgoing?Er:Object.assign({},Lr)});const u=this.movablePanel.movable;u&&this.listenerSetter.add(u)("resize",(()=>{this.resizeVideoContainers()}));const p=this.controlsHover=new Ko.Z;p.setup({element:this.container,listenerSetter:this.listenerSetter,showOnLeaveToClassName:"call-buttons"}),p.showControls(!1),this.addEventListener("close",(()=>{const{movablePanel:e}=this;Er=e.state,this.microphoneIcon.destroy(),e.destroy()})),this.updateInstance()}getCallInstance(){return this.instance}constructFirstButtons(){const e=this.firstButtonsRow=document.createElement("div");e.classList.add(Cr+"-buttons","is-first");const t=hr.bind(null,"btn-disabled"),i=this.btnVideo=this.makeButton({text:"Call.Camera",icon:"videocamera_filled",callback:()=>{const e=t([i,s],!0);this.instance.toggleVideoSharing().finally(e)}}),s=this.btnScreen=this.makeButton({text:"Call.Screen",icon:"sharescreen_filled",callback:()=>{const e=t([i,s],!0);this.instance.toggleScreenSharing().finally(e)}});ir.Z||(s.classList.add("hide"),this.container.classList.add("no-screen")),this.muteI18nElement=new C.ZP.IntlElement({key:"Call.Mute"});const n=this.btnMute=this.makeButton({text:this.muteI18nElement.element,callback:()=>{this.instance.toggleMuted()}}),a=this.microphoneIcon=new Sr(!0,!0);n.firstElementChild.append(a.container),e.append(i,s,n),this.container.append(e)}constructSecondButtons(){const e=this.secondButtonsRow=document.createElement("div");e.classList.add(Cr+"-buttons","is-second"),this.declineI18nElement=new C.ZP.IntlElement({key:"Call.Decline"});const t=this.btnDecline=this.makeButton({text:this.declineI18nElement.element,icon:"endcall_filled",callback:()=>{this.instance.hangUp("phoneCallDiscardReasonHangup")},isDanger:!0}),i=this.btnAccept=this.makeButton({text:"Call.Accept",icon:"phone_filled",callback:()=>{this.instance.acceptCall()},isConfirm:!0});e.append(t,i),this.container.append(e)}createVideoContainer(e){const t=Cr+"-video",i=document.createElement("div");i.classList.add(t+"-container"),e.classList.add(t),e.paused&&e.play(),(0,S.fc)(i,(()=>{if(!i.classList.contains("small"))return;const e=Object.values(this.videoContainers).find((e=>!e.classList.contains("small")));e.classList.add("small"),e.style.cssText=i.style.cssText,i.classList.remove("small"),i.style.cssText="",this.resizeVideoContainers()}));const s=Wo(e);return s.classList.add(t+"-blur"),i.append(s,e),i}updateInstance(){const{instance:e}=this,{connectionState:t}=e;if(t===yr.Z.CLOSED)return this.container.classList.contains("is-full-screen")&&(0,Uo.C8)(),this.btnVideo.classList.add("disabled"),void this.hide();const i=!e.isOutgoing&&t===yr.Z.PENDING;this.declineI18nElement.compareAndUpdate({key:t===yr.Z.PENDING?"Call.Decline":"Call.End"}),this.btnAccept.classList.toggle("disable",!i),this.btnAccept.classList.toggle("hide-me",!i),this.container.classList.toggle("two-button-rows",i);const s=e.isMuted,n=()=>{this.btnMute.firstElementChild.classList.toggle("active",s)},a=this.microphoneIcon.getItem().player;this.microphoneIcon.setState(!s,!s,n),a||n(),this.muteI18nElement.compareAndUpdate({key:s?"VoipUnmute":"Call.Mute"});const o=e.isSharingVideo;this.btnVideo.firstElementChild.classList.toggle("active",o);const r=e.isSharingScreen;this.btnScreen.firstElementChild.classList.toggle("active",r);const d=e.getMediaState("output");(0,Fe.Z)({element:this.partyMutedState,className:"is-visible",forwards:!!(null==d?void 0:d.muted),duration:300});const l=this.videoContainers,c=Object.assign({},l);["input","output"].forEach((t=>{const i=e.getMediaState(t),s=e.getVideoElement(t),n=!!(s&&s.videoWidth&&s.videoHeight);!s||n||s.dataset.hasPromise||(s.dataset.hasPromise="1",(0,wn.Z)(s).then((()=>{delete s.dataset.hasPromise,this.updateInstance()})));const a=!!s&&n&&!(!i||"active"!==i.videoState&&"active"!==i.screencastState);let o=l[t];a&&s&&!o&&(o=l[t]=this.createVideoContainer(s),this.container.append(o)),!a&&o&&(o.remove(),delete l[t])}));{const e=l.input,t=l.output;Object.keys(c).length!==Object.keys(l).length&&e&&e.classList.toggle("small",!!t),t&&!e&&t.classList.remove("small")}this.resizeVideoContainers(),this.container.classList.toggle("no-video",!Object.keys(l).length),!this.emojisSubtitle.textContent&&t{(0,U.Z)(this.emojisSubtitle,(0,R.Z)(e.join("")))})),this.setDescription()}resizeVideoContainers(){Object.values(this.videoContainers).forEach((e=>{if(e.classList.contains("small")){const t=e.querySelector("video"),i=this.movablePanel.state,s=240,n=240,a=t.videoHeight>t.videoWidth,o=a?n:s,r=1/3*((0,Uo.rB)()?65535:a?i.height:i.width),d=a?t.videoWidth/t.videoHeight:1,l=a?1:t.videoHeight/t.videoWidth;e.style.width=r*d+"px",e.style.height=r*l+"px",e.style.maxWidth=o*d+"px",e.style.maxHeight=o*l+"px"}else e.style.cssText=""}))}setDescription(){this.description.update(this.instance)}}var Mr=i(2069),Pr=i(9585),Zr=i(2493);const kr="topbar-call";class Tr{constructor(e){this.managers=e,this.onState=()=>{this.updateInstance(this.instance)};const t=this.listenerSetter=new le.Z;t.add(Zr.Z)("instance",(({instance:e})=>{this.instance||this.updateInstance(e)})),t.add(Zr.Z)("accepting",(e=>{this.instance!==e&&this.updateInstance(e)})),t.add(oo.ZP)("instance",(e=>{this.updateInstance(e)})),t.add(d.Z)("group_call_update",(e=>{const t=oo.ZP.groupCall;(null==t?void 0:t.id)===e.id&&this.updateInstance(t)})),t.add(Pr.Z.ANALYSER_LISTENER)("amplitude",(({amplitudes:e,type:t})=>{const{weave:i}=this;if(!e.length||!i)return;let s=0;for(let t=0;ts?n:s}i.setAmplitude(s)}))}clearCurrentInstance(){this.instance&&(this.center.textContent="",this.currentDescription&&(this.currentDescription.detach(),this.currentDescription=void 0),this.instance=void 0,this.instanceListenerSetter.removeAll())}updateInstance(e){this.construct&&(this.construct(),this.construct=void 0);const t=this.instance!==e;t&&(this.clearCurrentInstance(),this.instance=e,this.instanceListenerSetter=new le.Z,this.instanceListenerSetter.add(e)("state",this.onState),e instanceof br.Z?this.currentDescription=this.groupCallDescription:(this.currentDescription=this.callDescription,this.instanceListenerSetter.add(e)("muted",this.onState)),this.container.classList.toggle("is-call",!(e instanceof br.Z)));const i=this.instance.isMuted,s=e instanceof br.Z?e.state:function(e,t){switch(e){case yr.Z.CLOSING:case yr.Z.CLOSED:return To.Z.CLOSED;case yr.Z.CONNECTED:return t?To.Z.MUTED:To.Z.UNMUTED;default:return To.Z.CONNECTING}}(e.connectionState,i),{weave:n}=this;n.componentDidMount();const a=s===To.Z.CLOSED;(!document.body.classList.contains("is-calling")||t||a)&&(a&&n.setAmplitude(0),(0,Fe.Z)({element:document.body,className:"is-calling",forwards:!a,duration:250,onTransitionEnd:a?()=>{n.componentWillUnmount(),this.clearCurrentInstance()}:void 0})),a||(n.setCurrentState(s,!0),this.setTitle(e),this.setDescription(e),this.groupCallMicrophoneIconMini.setState(!i))}setDescription(e){return this.currentDescription.update(e)}setTitle(e){if(e instanceof br.Z)return this.groupCallTitle.update(e);(0,U.Z)(this.center,new B.Z({peerId:e.interlocutorUserId.toPeerId()}).element)}construct(){const{listenerSetter:e}=this,t=this.container=document.createElement("div");t.classList.add("sidebar-header",kr+"-container");const i=document.createElement("div");i.classList.add(kr+"-left");const s=this.groupCallMicrophoneIconMini=new Sr,n=(0,On.Z)();n.append(s.container),i.append(n);const a=(0,qa.Z)((()=>{this.instance.toggleMuted()}),600,!0);(0,S.fc)(n,(e=>{(0,Ce.Z)(e),a()}),{listenerSetter:e});const o=this.center=document.createElement("div");o.classList.add(kr+"-center"),this.groupCallTitle=new tr(o),this.groupCallDescription=new er(i),this.callDescription=new wr(i);const r=document.createElement("div");r.classList.add(kr+"-right");const d=(0,On.Z)("endcall_filled");r.append(d),(0,S.fc)(d,(e=>{(0,Ce.Z)(e);const{instance:t}=this;t&&(t instanceof br.Z?t.hangUp():t.hangUp("phoneCallDiscardReasonHangup"))}),{listenerSetter:e}),(0,S.fc)(t,(()=>{if(this.instance instanceof br.Z){if(w.Z.getPopups(vr).length)return;(new vr).show()}else if(this.instance instanceof Mr.Z){if(w.Z.getPopups(Ir).find((e=>e.getCallInstance()===this.instance)))return;new Ir(this.instance).show()}}),{listenerSetter:e}),t.append(i,o,r);const l=this.weave=new _o,c=l.render(kr+"-weave");t.prepend(c),document.getElementById("column-center").prepend(t),l.componentDidMount()}}var xr=i(2614),Ar=i(6009),_r=i(493),Fr=i(2131),Dr=i(6702),Rr=i(7746),Br=i(2491),Nr=i(1722),Or=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const Ur=new class{constructor(){this.notificationsShown={},this.notificationIndex=0,this.notificationsCount=0,this.soundsPlayed={},this.vibrateSupport=Fr.Z,this.faviconElements=Array.from(document.head.querySelectorAll('link[rel="icon"], link[rel="alternate icon"]')),this.titleBackup=document.title,this.titleChanged=!1,this.stopped=!1,this.settings={},this.pushInited=!1,this.updateLocalSettings=()=>{const e=["notify_nodesktop","notify_volume","notify_novibrate","notify_nopreview","notify_nopush"].map((()=>{}));Promise.all(e).then((e=>{if(this.settings.nodesktop=e[0],this.settings.volume=void 0===e[1]?.5:e[1],this.settings.novibrate=e[2],this.settings.nopreview=e[3],this.settings.nopush=e[4],this.pushInited){const e=!this.settings.nopush&&!this.settings.nodesktop&&Dr.default.isAvailable||!1;e!==(!1!==this.registeredDevice)&&(e?Dr.default.subscribe():Dr.default.unsubscribe())}Dr.default.setSettings(this.settings)})),Sn.Z.getState().then((e=>{this.settings.nosound=!e.settings.notifications.sound}))},this.requestPermission=()=>{Notification.requestPermission(),window.removeEventListener("click",this.requestPermission)}}construct(e){this.managers=e,navigator.vibrate=navigator.vibrate||navigator.mozVibrate||navigator.webkitVibrate,this.setAppBadge=navigator.setAppBadge&&navigator.setAppBadge.bind(navigator),this.setAppBadge&&this.setAppBadge(0),this.notificationsUiSupport="Notification"in window||"mozNotification"in navigator,this.notifySoundEl=document.createElement("div"),this.notifySoundEl.id="notify-sound",document.body.append(this.notifySoundEl),this.topMessagesDeferred=(0,fe.Z)(),Zo.Z.addEventListener("deactivated",(()=>{this.stop()})),Zo.Z.addEventListener("activated",(()=>{this.stopped&&this.start()})),wt.Z.addEventListener("change",(e=>{this.stopped||(e||this.clear(),this.toggleToggler())})),d.Z.addEventListener("notification_reset",(e=>{this.soundReset(e)})),d.Z.addEventListener("notification_cancel",(e=>{this.cancel(e)})),this.setAppBadge&&d.Z.addEventListener("folder_unread",(e=>{0===e.id&&this.setAppBadge(e.unreadUnmutedPeerIds.size)})),Dr.default.addEventListener("push_init",(e=>{this.pushInited=!0,this.settings.nodesktop||this.settings.nopush?this.unregisterDevice(e):e?this.registerDevice(e):Dr.default.subscribe()})),Dr.default.addEventListener("push_subscribe",(e=>{this.registerDevice(e)})),Dr.default.addEventListener("push_unsubscribe",(e=>{this.unregisterDevice(e)})),d.Z.addEventListener("dialogs_multiupdate",(()=>{this.topMessagesDeferred.resolve()}),{once:!0}),Dr.default.addEventListener("push_notification_click",(e=>{if("push_settings"===e.action)return;if("mute1d"===e.action)return void this.managers.apiManager.invokeApi("account.updateDeviceLocked",{period:86400}).then((()=>{}));const t=e.custom&&e.custom.peerId.toPeerId();console.log("click",e,t),t&&this.topMessagesDeferred.then((()=>Or(this,void 0,void 0,(function*(){e.custom.channel_id&&!(yield this.managers.appChatsManager.hasChat(e.custom.channel_id))||t.isUser()&&!(yield this.managers.appUsersManager.hasUser(t))||Jr.setInnerPeer({peerId:t,lastMsgId:(0,yt.Z)(+e.custom.msg_id)})}))))}))}buildNotification({message:e,fwdCount:t,peerReaction:i,peerTypeNotifySettings:s}){return Or(this,void 0,void 0,(function*(){const n=e.peerId,a=n.isAnyChat(),o={},[r,d=!1]=yield Promise.all([this.managers.appPeersManager.getPeerString(n),a&&this.managers.appPeersManager.isForum(n)]);let l,c=!1;if(s.show_previews)if("message"===e._&&e.fwd_from&&t>1)l=C.ZP.format("Notifications.Forwarded",!0,[t]);else{l=yield(0,G.Z)({message:e,plain:!0});const t=null==i?void 0:i.reaction;if("reactionEmoji"===(null==t?void 0:t._)){const e="Notification.Contact.Reacted",i=[(0,Rr.Z)(t.emoticon),l];l=C.ZP.format(e,!0,i)}else c=!0}else l=C.ZP.format("Notifications.New",!0);i&&(o.noIncrement=!0,o.silent=!0);const h=d?(0,v.Z)(e,d):void 0,u=i?(0,D.Z)(i.peer_id):e.fromId;if(o.title=yield(0,_r.Z)({peerId:n,plainText:!0,managers:this.managers,threadId:h}),d){const t=yield(0,_r.Z)({peerId:n,plainText:!0,managers:this.managers});o.title+=` (${t})`,c&&u!==e.peerId&&(l=(yield(0,_r.Z)({peerId:u,plainText:!0,managers:this.managers}))+": "+l)}else a&&u!==e.peerId&&(o.title=(yield(0,_r.Z)({peerId:u,plainText:!0,managers:this.managers}))+" @ "+o.title);o.title=(0,Br.Z)(o.title),o.onclick=()=>{Jr.setInnerPeer({peerId:n,lastMsgId:e.mid,threadId:h})},o.message=l,o.key="msg"+e.mid,o.tag=r,o.silent=!0;const p=yield this.managers.appPeersManager.getPeerPhoto(n);p?this.managers.appAvatarsManager.loadAvatar(n,p,"photo_small").then((t=>{(e.pFlags.unread||i)&&(o.image=t,this.notify(o))})):this.notify(o)}))}toggleToggler(e=wt.Z.isIdle){if(T.IS_MOBILE)return;const t=e=>{this.titleChanged=!1,document.title=this.titleBackup,this.setFavicon()};window.clearInterval(this.titleInterval),this.titleInterval=0,e?this.titleInterval=window.setInterval((()=>{const e=this.notificationsCount;if(e)if(this.titleChanged)t();else{this.titleChanged=!0,document.title=C.ZP.format("Notifications.Count",!0,[e]);const t=document.createElement("canvas");t.width=32*window.devicePixelRatio,t.height=t.width;const i=t.getContext("2d");i.beginPath(),i.arc(t.width/2,t.height/2,t.width/2,0,2*Math.PI,!1),i.fillStyle="#3390ec",i.fill();let s=24,n=""+e;e<10?s=22:e<100?s=20:(n="99+",s=16),s*=window.devicePixelRatio,i.font=`700 ${s}px ${kt.bt}`,i.textBaseline="middle",i.textAlign="center",i.fillStyle="white",i.fillText(n,t.width/2,.5625*t.height),this.setFavicon(t.toDataURL())}else this.toggleToggler(!1)}),1e3):t()}setFavicon(e){this.prevFavicon!==e&&(this.prevFavicon=e,this.faviconElements.forEach(((t,i,s)=>{const n=t.cloneNode();n.dataset.href||(n.dataset.href=n.href),null!=e||(e=n.dataset.href),n.href=e,t.replaceWith(s[i]=n)})))}notify(e){if(this.stopped)return;e.image||(e.image="assets/img/logo_filled_rounded.png"),e.noIncrement||++this.notificationsCount,this.titleInterval||this.toggleToggler();const t=++this.notificationIndex,i=e.key||"k"+t;this.notificationsShown[i]=!0;const s=(0,Ht.Z)();if(this.settings.volume>0&&!this.settings.nosound&&(this.testSound(this.settings.volume),this.soundsPlayed[e.tag]=s),!this.notificationsUiSupport||"Notification"in window&&"granted"!==Notification.permission)return!1;if(this.settings.nodesktop)return this.vibrateSupport&&!this.settings.novibrate?void navigator.vibrate([200,100,200]):void 0;let n;if("Notification"in window){try{if(e.tag)for(const t in this.notificationsShown){const i=this.notificationsShown[t];"boolean"!=typeof i&&i.tag===e.tag&&(i.hidden=!0)}n=new Notification(e.title,{icon:e.image||"",body:e.message||"",tag:e.tag||"",silent:e.silent||!1})}catch(e){return this.notificationsUiSupport=!1,void Dr.default.setLocalNotificationsDisabled()}n.onclick=()=>{n.close(),Nr.Z.focus(),this.clear(),e.onclick&&e.onclick()},n.onclose=()=>{n.hidden||(delete this.notificationsShown[i],this.clear())},n.show&&n.show(),this.notificationsShown[i]=n,T.IS_MOBILE||setTimeout((()=>{this.hide(i)}),8e3)}}getLocalSettings(){return this.settings}hide(e){const t=this.notificationsShown[e];if(t&&"boolean"!=typeof t)try{t.close&&(t.hidden=!0,t.close())}catch(e){}}soundReset(e){delete this.soundsPlayed[e]}testSound(e){const t=(0,Ht.Z)();if(this.nextSoundAt&&t\n \n `,this.notifySoundEl.append(s),s.addEventListener("ended",(()=>{s.remove()}),{once:!0})}cancel(e){const t=this.notificationsShown[e];if(t){this.notificationsCount>0&&--this.notificationsCount;try{"boolean"!=typeof t&&t.close&&(t.hidden=!0,t.close())}catch(e){}delete this.notificationsShown[e]}}clear(){for(const e in this.notificationsShown){const t=this.notificationsShown[e];try{"boolean"!=typeof t&&t.close&&t.close()}catch(e){}}this.notificationsShown={},this.notificationsCount=0,Dr.default.hidePushNotifications()}start(){if(this.updateLocalSettings(),d.Z.addEventListener("settings_updated",this.updateLocalSettings),Dr.default.start(),!this.notificationsUiSupport)return!1;"Notification"in window&&"granted"!==Notification.permission&&"denied"!==Notification.permission&&window.addEventListener("click",this.requestPermission);try{"onbeforeunload"in window&&window.addEventListener("beforeunload",this.clear)}catch(e){}}stop(){this.clear(),window.clearInterval(this.titleInterval),this.titleInterval=0,this.setFavicon(),this.stopped=!0}registerDevice(e){if(this.registeredDevice&&(0,mo.Z)(this.registeredDevice,e))return!1;this.managers.apiManager.invokeApi("account.registerDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[],app_sandbox:!1,secret:new Uint8Array}).then((()=>{this.registeredDevice=e}),(e=>{e.handled=!0}))}unregisterDevice(e){if(!this.registeredDevice)return!1;this.managers.apiManager.invokeApi("account.unregisterDevice",{token_type:e.tokenType,token:e.tokenValue,other_uids:[]}).then((()=>{this.registeredDevice=!1}),(e=>{e.handled=!0}))}};me.GO&&(me.GO.uiNotificationsManager=Ur);const Hr=Ur;var zr=i(2423),jr=i(236),Gr=i(5936),Vr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function Kr(e,t=!1){return Vr(this,void 0,void 0,(function*(){const i=[],s=(e,n)=>Vr(this,void 0,void 0,(function*(){if(e.isDirectory){const t=e.createReader();yield new Promise(((e,i)=>{t.readEntries((t=>Vr(this,void 0,void 0,(function*(){for(const e of t)yield s(e,n);e()}))))}))}else if(e)if(t)i.push(e.type);else{const t=n.getAsFile(),s=e instanceof File?e:e instanceof DataTransferItem?e.getAsFile():yield new Promise(((i,s)=>e.file(i,(e=>i(t)))));if(!s)return;i.push(s)}}));if(e instanceof DragEvent&&e.dataTransfer.files&&!e.dataTransfer.items)for(let s=0;s{!e.noCancelEvent&&(0,Ce.Z)(null);let i,s,n=t.href;const a=new URL(n),o=a.host.match(/(.+?)\.t(?:elegram)?\.me/);o&&!m.BX.has(o[1])&&(a.pathname=o[1]+("/"===a.pathname?"":a.pathname),n=a.toString()),e.noPathnameParams||(i=new URL(n).pathname.split("/").slice(1)),e.noUriParams||(s=(0,Wr.Z)(n));const r=e.callback({pathnameParams:i,uriParams:s},t);return void 0===r&&r}}var qr,Qr=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};!function(e){e[e.CHATLIST=0]="CHATLIST",e[e.CHAT=1]="CHAT",e[e.PROFILE=2]="PROFILE"}(qr||(qr={}));class Yr extends l.Z{constructor(){super(...arguments),this.columnEl=document.getElementById("column-center"),this.offline=!1,this.updateStatusInterval=0,this.setPeerPromise=null,this.chats=[],this.cacheStorage=new Gr.Z("cachedFiles"),this.onHashChange=e=>{try{this.onHashChangeUnsafe(e)}catch(e){this.log.error("hash change error",e)}},this.onHashChangeUnsafe=e=>{const t=location.hash;e||Dn.Z.replaceState();const i=t.split("?"),s=(0,Wr.Z)(t,i);if(this.log("hashchange",t,i[0],s),t)if(s.tgaddr)this.openUrl(s.tgaddr);else switch(i[0]){default:s.p=i[0].slice(1);case"#/im":{if(!Object.keys(s).length)break;const e=s.p,t=void 0!==s.post?(0,yt.Z)(+s.post):void 0;"@"===e[0]?this.openUsername({userName:e,lastMsgId:t}):this.setInnerPeer({peerId:t?e.toPeerId(!0):e.toPeerId(),lastMsgId:t})}}},this.setSettings=()=>{const{messagesTextSize:e}=d.Z.settings;this.customEmojiSize=(0,qe.C)(e+4,e+4),document.documentElement.style.setProperty("--messages-text-size",e+"px"),this.customEmojiSize&&(document.querySelectorAll("middle-ellipsis-element").forEach((t=>{t.disconnectedCallback(),t.dataset.fontSize=""+e,t.title&&(t.textContent=t.title),t.connectedCallback()})),document.querySelectorAll(".chat custom-emoji-renderer-element").forEach((e=>{e.forceRenderAfterSize=!0}))),document.body.classList.toggle("animation-level-0",!d.Z.settings.animationsEnabled),document.body.classList.toggle("animation-level-1",!1),document.body.classList.toggle("animation-level-2",d.Z.settings.animationsEnabled),this.chatsSelectTabDebounced=(0,Ze.Z)((()=>{var e;null===(e=this.chat.topbar.pinnedMessage)||void 0===e||e.setCorrectIndex(0),this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)}),d.Z.settings.animationsEnabled?250:0,!1,!0),Rs.Z.setLoop(d.Z.settings.stickers.loop),s.Z.checkAnimations2(!1);for(const e of this.chats)e.setAutoDownloadMedia();C.ZP.setTimeFormat(d.Z.settings.timeFormat),this.toggleChatGradientAnimation(this.chat)},this.onDocumentPaste=(e,t)=>Qr(this,void 0,void 0,(function*(){const i=Pn();if(e instanceof DragEvent){const t=e.dataTransfer.types;(t.contains?t.contains("Files"):t.indexOf("Files")>=0)&&(0,Ce.Z)(e)}const s=yield Kr(e);if(((yield this.canDrag())||i)&&s.length){if(i)return void i.addFiles(s);const e=this.chat.input;e.willAttachType=t||(vn.Z.has(s[0].type)?"media":"document"),w.Z.createPopup(Zn,this.chat,s,e.willAttachType)}}))}get myId(){return d.Z.myId}get chat(){return this.chats[this.chats.length-1]}construct(e){this.managers=e;const{apiUpdatesManager:t}=e;t.attach(C.ZP.lastRequestedLangCode),ma.Z.construct(e),Hr.construct(e),Hr.start(),this.log=(0,r.kg)("IM",r.v9.Log|r.v9.Warn|r.v9.Debug|r.v9.Error),this.backgroundPromises={},jr.h.settings.themes.forEach((e=>{if(e.background.slug){const t="assets/img/"+e.background.slug+".svg"+(T.IS_FIREFOX?"?1":"");this.backgroundPromises[e.background.slug]=Promise.resolve(t)}})),this.selectTab(qr.CHATLIST),wt.Z.addEventListener("change",(e=>{this.offline=e,this.updateStatus(),e?clearInterval(this.updateStatusInterval):this.updateStatusInterval=window.setInterval((()=>this.updateStatus()),5e4)})),this.chatsContainer=document.createElement("div"),this.chatsContainer.classList.add("chats-container","tabs-container"),this.chatsContainer.dataset.animation="navigation",this.emojiAnimationContainer=document.createElement("div"),this.emojiAnimationContainer.classList.add("emoji-animation-container"),this.appendEmojiAnimationContainer(o.Z.activeScreen),this.columnEl.append(this.chatsContainer),this.createNewChat(),this.chatsSelectTab(this.chat.container),Dn.Z.onHashChange=this.onHashChange,this.setSettings(),d.Z.addEventListener("settings_updated",this.setSettings);const i=e=>{document.body.classList.toggle("is-premium",e)};d.Z.addEventListener("premium_toggle",i),i(d.Z.premium),this.managers.rootScope.getPremium().then(i),(0,ue.ZP)((()=>{s.Z.setOnlyOnePlayableGroup("lock"),s.Z.checkAnimations2(!0)}),(()=>{s.Z.setOnlyOnePlayableGroup(),s.Z.checkAnimations2(!1)})),T.IS_FIREFOX&&Sn.Z.oldVersion&&-1===(0,Ar.Z)(Sn.Z.oldVersion,"1.4.3")?this.deleteFilesIterative((e=>"image/svg+xml"===e.headers.get("Content-Type"))).then((()=>{this.applyCurrentTheme()})):this.applyCurrentTheme(),o.Z.addEventListener("changeScreen",((e,t)=>{document.body.classList.contains(n.ir)&&document.body.classList.contains(a.HQ)&&a.ZP.toggleSidebar(!1),this.appendEmojiAnimationContainer(t)})),o.Z.addEventListener("resize",(()=>{const e=this.chatsContainer.getBoundingClientRect();vo.resizeInstances(e.width,e.height).then((()=>{}))})),this.addEventListener("peer_changing",(e=>{this.saveChatPosition(e)})),d.Z.addEventListener("theme_change",(()=>{this.applyCurrentTheme()})),d.Z.addEventListener("choosing_sticker",(e=>{this.setChoosingStickerTyping(!e)})),d.Z.addEventListener("peer_title_edit",(({peerId:e,threadId:t})=>{var i;(null===(i=this.chat)||void 0===i?void 0:i.peerId)!==e||t||void 0===this.tabId||this.overrideHash(e)})),d.Z.addEventListener("peer_typings",(({peerId:e,typings:t})=>{var i;const s=this.chat;if(!s||s.peerId!==e||St.Z.isOverlayActive||o.Z.activeScreen===o._.mobile&&this.tabId!==qr.CHAT)return;const n=t.find((e=>"sendMessageEmojiInteraction"===e.action._));if("sendMessageEmojiInteraction"===(null===(i=null==n?void 0:n.action)||void 0===i?void 0:i._)){const t=n.action,i=s.bubbles.bubbles[(0,yt.Z)(n.action.msg_id)];if(i&&i.classList.contains("emoji-big")&&(0,He.Z)(i,s.bubbles.scrollable.container)){const s=i.querySelector(".media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)");JSON.parse(t.interaction.data).a.forEach((e=>{setTimeout((()=>{(0,S.tH)(s)}),1e3*e.t)})),this.managers.appMessagesManager.setTyping(e,{_:"sendMessageEmojiInteractionSeen",emoticon:t.emoticon})}}}));const l=e=>{const t="version"===e,i=new w.Z("popup-instance-deactivated",{overlayClosable:!0}),s=document.createElement("div");s.classList.add("instance-deactivated-container"),i.container.replaceWith(s);const n=document.createElement("div");n.classList.add("header"),n.append((0,C.ag)(t?"Deactivated.Version.Title":"Deactivated.Title"));const a=document.createElement("div");a.classList.add("subtitle"),a.append((0,C.ag)(t?"Deactivated.Version.Subtitle":"Deactivated.Subtitle")),s.append(n,a),document.body.classList.add("deactivated");const o=t?()=>{Nr.Z.reload()}:()=>{document.body.classList.add("deactivated-backwards"),Zo.Z.activateInstance(),setTimeout((()=>{document.body.classList.remove("deactivated","deactivated-backwards")}),333)};i.addEventListener("close",o),i.show()};Zo.Z.addEventListener("deactivated",l),Zo.Z.deactivatedReason&&l(Zo.Z.deactivatedReason),this.addEventListener("chat_changing",(({to:e})=>{this.toggleChatGradientAnimation(e)})),d.Z.addEventListener("service_notification",(e=>{(0,vi.Z)({button:{langKey:"OK",isCancel:!0},description:(0,ft.ZP)(e.message)})})),d.Z.addEventListener("payment_sent",(({peerId:e,mid:t,receiptMessage:i})=>Qr(this,void 0,void 0,(function*(){const s=yield this.managers.appMessagesManager.getMessageByPeer(e,t);if(!s)return;const n=i.action;(0,ye.bC)({langPackKey:"PaymentInfoHint",langPackArguments:[(0,Pt.Z)(n.total_amount,n.currency),(0,R.Z)(s.media.title)]})})))),window.onSpoilerClick=e=>{const t=(0,ve.Z)(e.target,"spoiler"),i=(0,ve.Z)(t,"spoilers-container")||t.parentElement,s="is-spoiler-visible",n=i.classList.contains(s);n||((0,Ce.Z)(e),"click"!==S.pf&&window.addEventListener("click",Ce.Z,{capture:!0,once:!0}));const a=n?0:2;a&&i.classList.add("will-change");const o=i.dataset.spoilerTimeout;null!==o&&(clearTimeout(+o),delete i.dataset.spoilerTimeout),(0,Fe.Z)({element:i,className:s,forwards:!0,duration:200,onTransitionEnd:()=>{i.dataset.spoilerTimeout=""+window.setTimeout((()=>{(0,Fe.Z)({element:i,className:s,forwards:!1,duration:200,onTransitionEnd:()=>{i.classList.remove("will-change"),delete i.dataset.spoilerTimeout}})}),5e3)},useRafs:a})},d.Z.addEventListener("sticker_updated",(({type:e,faved:t})=>{"faved"===e?(0,ye.bC)({langPackKey:t?"AddedToFavorites":"RemovedFromFavorites"}):t||(0,ye.bC)({langPackKey:"RemovedFromRecent"})})),Sn.Z.addEventListener("notificationBuild",(e=>Qr(this,void 0,void 0,(function*(){const t=yield this.managers.appPeersManager.isForum(e.message.peerId),i=(0,v.Z)(e.message,t);(this.chat.peerId!==e.message.peerId||this.chat.threadId!==i||wt.Z.isIdle)&&Hr.buildNotification(e)})))),this.addEventListener("peer_changed",(({peerId:e})=>Qr(this,void 0,void 0,(function*(){document.body.classList.toggle("has-chat",!!e),this.emojiAnimationContainer.textContent="",this.overrideHash(e),Sn.Z.updateTabState("chatPeerIds",this.chats.map((e=>e.peerId)).filter(Boolean))})))),Mo.Z.setToCache("chatPositions",{}),(Oe.Z||so.Z)&&(this.topbarCall=new Tr(e)),Oe.Z&&(Zr.Z.addEventListener("instance",(({instance:e})=>{const t=new Ir(e);e.addEventListener("acceptCallOverride",(()=>this.discardCurrentCall(e.interlocutorUserId.toPeerId(),void 0,e).then((()=>(Zr.Z.dispatchEvent("accepting",e),!0))).catch((()=>!1)))),t.addEventListener("close",(()=>{const t=Zr.Z.currentCall;t&&t!==e&&!e.wasTryingToJoin&&e.hangUp("phoneCallDiscardReasonBusy")}),{once:!0}),t.show()})),Zr.Z.addEventListener("incompatible",(e=>Qr(this,void 0,void 0,(function*(){(0,ye.bC)({langPackKey:"VoipPeerIncompatible",langPackArguments:[yield(0,Vt.Z)({peerId:e.toPeerId()})]})}))))),Zo.Z.activateInstance();const c=()=>{ko.default.setAuthorized(!0)};setInterval(c,A.s2),c(),$r({name:"showMaskedAlert",callback:(e,t)=>{const i=t.href,s=t.cloneNode(!0);s.className="anchor-url",s.innerText=i,s.removeAttribute("onclick"),new xs.Z("popup-masked-url",{titleLangKey:"OpenUrlTitle",descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[s],buttons:[{langKey:"Open",callback:()=>{s.click()}}]}).show()}}),$r({name:"execBotCommand",callback:({uriParams:e})=>{const{command:t,bot:i}=e;this.managers.appMessagesManager.sendText(this.chat.peerId,"/"+t+(i?"@"+i:""))}}),$r({name:"searchByHashtag",callback:({uriParams:e})=>{const{hashtag:t}=e;t&&this.chat.initSearch("#"+t+" ")}}),[["addstickers",Te.STICKER_SET],["addemoji",Te.EMOJI_SET]].forEach((([e,t])=>{$r({name:e,callback:({pathnameParams:e})=>{if(!e[1])return;const i={_:t,set:e[1]};this.processInternalLink(i)}}),$r({name:e,protocol:"tg",callback:({uriParams:e})=>{const i=this.makeLink(t,e);this.processInternalLink(i)}})})),$r({name:"invoice",callback:({pathnameParams:e})=>{const t={_:Te.INVOICE,slug:e.length>1?e[1]:e[0].slice(1)};this.processInternalLink(t)}}),$r({name:"joinchat",callback:({pathnameParams:e})=>{const t={_:Te.JOIN_CHAT,invite:e[1]||decodeURIComponent(e[0]).slice(1)};this.processInternalLink(t)}}),so.Z&&$r({name:"voicechat",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Te.VOICE_CHAT,e);this.processInternalLink(t)}}),$r({name:"im",callback:({pathnameParams:e,uriParams:t},i)=>Qr(this,void 0,void 0,(function*(){let s;if(zr.kO.test(e[0]))s={_:Te.USER_PHONE_NUMBER,phone:e[0].slice(1)};else if("c"===e[0]){e.shift();const n="thread"in t?t.thread:e[2]&&e[1];s={_:Te.PRIVATE_POST,channel:e[0],post:e[2]||e[1],thread:n,comment:t.comment,stack:this.getStackFromElement(i)}}else{const n="thread"in t?t.thread:e[2]&&e[1];s={_:Te.MESSAGE,domain:e[0],post:e[2]||e[1],thread:n,comment:t.comment,start:"start"in t?t.start:void 0,stack:this.getStackFromElement(i)}}this.processInternalLink(s)}))}),$r({name:"resolve",protocol:"tg",callback:({uriParams:e},t)=>{let i;e.phone?i=this.makeLink(Te.USER_PHONE_NUMBER,e):"telegrampassport"===e.domain||(i=this.makeLink(Te.MESSAGE,Object.assign(Object.assign({},e),{stack:this.getStackFromElement(t)}))),this.processInternalLink(i)}}),$r({name:"privatepost",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Te.PRIVATE_POST,e);this.processInternalLink(t)}}),$r({name:"invoice",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Te.INVOICE,e);this.processInternalLink(t)}}),["joinchat","join"].forEach((e=>{$r({name:e,protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Te.JOIN_CHAT,e);this.processInternalLink(t)}})})),this.onHashChange(!0),this.attachKeydownListener(),this.handleAutologinDomains()}handleUrlAuth(e){const{peerId:t,mid:i,buttonId:s,url:n}=e,a=e=>{window.open(e,"_blank")},o=e=>Qr(this,void 0,void 0,(function*(){if("urlAuthResultRequest"===e._){const r=document.createElement("b");r.append(e.domain);const l=yield(0,Vt.Z)({peerId:d.Z.myId}),c=yield(0,Vt.Z)({peerId:e.bot.id.toPeerId()}),h={text:"OpenUrlOption1",textArgs:[r.cloneNode(!0),l],checked:!0},u=e.pFlags.request_write_access?{text:"OpenUrlOption2",textArgs:[c],checked:!0}:void 0,p=[h,u],f=(0,vi.Z)({titleLangKey:"OpenUrlTitle",button:{langKey:"Open"},descriptionLangKey:"OpenUrlAlert2",descriptionLangArgs:[r],checkboxes:p.filter(Boolean)});u&&h.checkboxField.input.addEventListener("change",(()=>{const e=!h.checkboxField.checked;u.checkboxField.toggleDisability(e),e&&(u.checkboxField.checked=!1)}));const[m,g]=yield f;if(!m)return void a(n);const v=yield this.managers.appSeamlessLoginManager.acceptUrlAuth(n,t,i,s,g);return o(v)}"urlAuthResultAccepted"===e._?(e=>{a(e.url)})(e):a(n)}));return this.managers.appSeamlessLoginManager.requestUrlAuth(n,t,i,s).then((e=>{o(e)}))}handleAutologinDomains(){let e;d.Z.addEventListener("app_config",(t=>{e=t}));const t=t=>{var i,s;const n=new URL(t.href);if(e.url_auth_domains.includes(n.hostname))return this.handleUrlAuth({url:t.href}),void(0,Ce.Z)();if(!e.autologin_token||!e.autologin_domains)return;const a=null!==(i=(s=t.dataset).originalUrl)&&void 0!==i?i:s.originalUrl=t.href;e.autologin_domains.includes(n.hostname)&&(n.searchParams.set("autologin_token",e.autologin_token),t.href=n.toString(),setTimeout((()=>{t.href=a,delete t.dataset.originalUrl}),0))};document.addEventListener("click",(e=>{const i=(0,be.Z)(e.target,"A");(null==i?void 0:i.href)&&t(i)}))}getStackFromElement(e){const t=(0,ve.Z)(e,"bubble");return t?+t.dataset.mid:void 0}deleteFilesIterative(e){return this.cacheStorage.timeoutOperation((t=>{const i=performance.now();return t.keys().then((i=>{const s=i.map((i=>t.match(i).then((t=>e(t)))));return Promise.all(s).then((e=>(e.map(((e,s)=>{if(!e)return;const n=i[s];return t.delete(n)})),Promise.all(e.filter(Boolean)))))})).then((()=>{this.log("deleted files",performance.now()-i)}))}))}toggleChatGradientAnimation(e){this.chats.forEach((t=>{t.gradientRenderer&&t.gradientRenderer.scrollAnimate(d.Z.settings.animationsEnabled&&t===e)}))}appendEmojiAnimationContainer(e){const t=e===o._.mobile?this.columnEl:document.body;this.emojiAnimationContainer.parentElement!==t&&t.append(this.emojiAnimationContainer)}attachKeydownListener(){const e=new Set(["PageUp","PageDown","Meta","Control"]);document.body.addEventListener("keydown",(t=>{var i;const s=t.key,n=document.getSelection().isCollapsed;if(St.Z.isOverlayActive||e.has(s))return;const a=t.target,r=this.chat;if((!(s.startsWith("Arrow")||t.shiftKey&&"Shift"===s)||n)&&("KeyC"!==t.code||!t.ctrlKey&&!t.metaKey||"INPUT"===a.tagName)){if(!t.altKey||"ArrowUp"!==s&&"ArrowDown"!==s){if("ArrowUp"===s&&"scheduled"!==this.chat.type){if(r.input.editMsgId||!r.input.isInputEmpty())return;this.managers.appMessagesManager.getFirstMessageToEdit(r.peerId,r.threadId).then((e=>{e&&(r.input.initMessageEditing(e.mid),(0,Ce.Z)(t))}))}else if("ArrowDown"===s)return}else(0,Ce.Z)(t),this.managers.dialogsStorage.getNextDialog(this.chat.peerId,"ArrowDown"===s,Ji.default.filterId).then((e=>{e&&this.setPeer({peerId:e.peerId})}));if((null===(i=null==r?void 0:r.input)||void 0===i?void 0:i.messageInput)&&t.target!==r.input.messageInput&&"INPUT"!==a.tagName&&!a.isContentEditable&&!c.Z&&(!o.Z.isMobile||this.tabId===qr.CHAT)&&!r.selection.isSelecting&&!r.input.recording){r.input.messageInput.focus(),(0,Nt.Z)(r.input.messageInput);const e=new KeyboardEvent(t.type,t);r.input.messageInput.dispatchEvent(e)}}}))}makeLink(e,t){return Object.assign({_:e},t)}processInternalLink(e){return Qr(this,void 0,void 0,(function*(){switch(null==e?void 0:e._){case Te.MESSAGE:{const t=e.post?(0,yt.Z)(+e.post):void 0,i=e.comment?(0,yt.Z)(+e.comment):void 0,s=e.thread?(0,yt.Z)(+e.thread):void 0;this.openUsername({userName:e.domain,lastMsgId:t,commentId:i,startParam:e.start,stack:e.stack,threadId:s});break}case Te.PRIVATE_POST:{const t=e.channel.toChatId(),i=(t.toPeerId(!0),yield this.managers.appChatsManager.getChat(t));if(!i)try{yield this.managers.appChatsManager.resolveChannel(t)}catch(e){throw(0,ye.bC)({langPackKey:"LinkNotFound"}),e}const s=(0,yt.Z)(+e.post),n=e.thread?(0,yt.Z)(+e.thread):void 0;this.op({peer:i,lastMsgId:s,threadId:n,stack:e.stack});break}case Te.EMOJI_SET:case Te.STICKER_SET:new M.Z({id:e.set},e._===Te.EMOJI_SET).show();break;case Te.JOIN_CHAT:this.managers.appChatsManager.checkChatInvite(e.invite).then((t=>{t.chat&&this.managers.appChatsManager.saveApiChat(t.chat,!0),"chatInviteAlready"!==t._&&"chatInvitePeek"!==t._?new Ge(e.invite,t):this.setInnerPeer({peerId:t.chat.id.toPeerId(!0)})}),(e=>{"INVITE_HASH_EXPIRED"===e.type&&(0,ye.Am)((0,C.ag)("InviteExpired"))}));break;case Te.VOICE_CHAT:so.Z&&this.joinGroupCall(e.chat_id.toPeerId(!0),e.id);break;case Te.USER_PHONE_NUMBER:this.managers.appUsersManager.resolvePhone(e.phone).then((e=>{this.setInnerPeer({peerId:e.id.toPeerId(!1)})})).catch((e=>{"PHONE_NOT_OCCUPIED"===e.type&&(0,ye.bC)({langPackKey:"Alert.UserDoesntExists"})}));break;case Te.INVOICE:this.managers.appPaymentsManager.getInputInvoiceBySlug(e.slug).then((e=>{this.managers.appPaymentsManager.getPaymentForm(e).then((t=>{new Ui(void 0,e,t)}))}));break;default:this.log.warn("Not supported internal link:",e)}}))}openUrl(e){const{url:t,onclick:i}=(0,fs.Z)(e);if(!i)return;const s=document.createElement("a");s.href=t,window[i](s)}op(e){return Qr(this,void 0,void 0,(function*(){let{peer:t,commentId:i,threadId:s,lastMsgId:n}=e;const a="user"===t._,o=t.id.toPeerId(!a),r="channel"===t._&&t.pFlags.forum;if(i||s||n||!r){if(r&&n&&!s){const t=yield this.managers.appMessagesManager.reloadMessages(o,n);t?s=e.threadId=(0,v.Z)(t,r):(s=e.threadId=n,n=e.lastMsgId=void 0)}return s?this.openThread(Object.assign(Object.assign({},e),{peerId:o})):i?this.openComment({peerId:o,msgId:n,commentId:i}):this.setInnerPeer(Object.assign(Object.assign({},e),{peerId:o}))}Ji.default.toggleForumTabByPeerId(o,!0)}))}openPremiumBot(){return this.managers.apiManager.getAppConfig().then((e=>this.openUsername({userName:e.premium_bot_username})))}openUsername(e){const{userName:t}=e;return this.managers.appUsersManager.resolveUsername(t).then((t=>this.op(Object.assign({peer:t},e))),(e=>{"USERNAME_NOT_OCCUPIED"===e.type?(0,ye.bC)({langPackKey:"NoUsernameFound"}):"USERNAME_INVALID"===e.type&&(0,ye.bC)({langPackKey:"Alert.UserDoesntExists"})}))}openThread(e){return Qr(this,void 0,void 0,(function*(){return(yield this.managers.appChatsManager.isForum(e.peerId.toChatId()))?(yield this.managers.dialogsStorage.getForumTopicOrReload(e.peerId,e.threadId),this.setInnerPeer(e)):this.managers.appMessagesManager.reloadMessages(e.peerId,e.threadId).then((t=>(t?this.managers.appMessagesManager.generateThreadServiceStartMessage(t):e.lastMsgId=void 0,this.setInnerPeer(Object.assign(Object.assign({},e),{type:"discussion"})))))}))}openComment(e){return this.managers.appMessagesManager.getDiscussionMessage(e.peerId,e.msgId).then((t=>this.openThread({peerId:t.peerId,lastMsgId:e.commentId,threadId:t.mid})))}callUser(e,t){return Qr(this,void 0,void 0,(function*(){Zr.Z.getCallByUserId(e)||((yield this.managers.appProfileManager.getProfile(e)).pFlags.phone_calls_private?(0,Vt.Z)({peerId:e.toPeerId()}).then((e=>(0,vi.Z)({descriptionLangKey:"Call.PrivacyErrorMessage",descriptionLangArgs:[e],button:{langKey:"OK",isCancel:!0}}))):(yield this.discardCurrentCall(e.toPeerId()),Zr.Z.startCallInternal(e,"video"===t)))}))}discardCurrentCall(e,t,i){return oo.ZP.groupCall&&oo.ZP.groupCall!==t?this.discardGroupCallConfirmation(e):Zr.Z.currentCall&&Zr.Z.currentCall!==i?this.discardCallConfirmation(e):Promise.resolve()}discardCallConfirmation(e){return Qr(this,void 0,void 0,(function*(){const t=Zr.Z.currentCall;t&&(yield Promise.all([(0,Vt.Z)({peerId:t.interlocutorUserId.toPeerId(!1)}),(0,Vt.Z)({peerId:e})]).then((([t,i])=>(0,vi.Z)({titleLangKey:"Call.Confirm.Discard.Call.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Call.ToCall.Text":"Call.Confirm.Discard.Call.ToVoice.Text",descriptionLangArgs:[t,i],button:{langKey:"OK"}}))),t.isClosing||(yield t.hangUp("phoneCallDiscardReasonDisconnect")))}))}discardGroupCallConfirmation(e){return Qr(this,void 0,void 0,(function*(){const t=oo.ZP.groupCall;t&&(yield Promise.all([(0,Vt.Z)({peerId:t.chatId.toPeerId(!0)}),(0,Vt.Z)({peerId:e})]).then((([t,i])=>(0,vi.Z)({titleLangKey:"Call.Confirm.Discard.Voice.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Voice.ToCall.Text":"Call.Confirm.Discard.Voice.ToVoice.Text",descriptionLangArgs:[t,i],button:{langKey:"OK"}}))),oo.ZP.groupCall===t&&(yield t.hangUp()))}))}joinGroupCall(e,t){return Qr(this,void 0,void 0,(function*(){const i=e.toChatId(),s=this.managers.appChatsManager.hasRights(i,"manage_call");if(t&&"groupCallDiscarded"===(yield this.managers.appGroupCallsManager.getGroupCallFull(t))._){if(!s)return void(0,ye.bC)({langPackKey:"VoiceChat.Chat.Ended"});yield(0,vi.Z)({descriptionLangKey:"VoiceChat.Chat.StartNew",button:{langKey:"VoiceChat.Chat.StartNew.OK"}})}(()=>{Qr(this,void 0,void 0,(function*(){const e=yield this.managers.appProfileManager.getChatFull(i);let t;if(e.call)t=e.call;else{if(!s)return;t=yield this.managers.appGroupCallsManager.createGroupCall(i)}oo.ZP.joinGroupCall(i,t.id,!0,!1)}))})()}))}setCurrentBackground(e=!1){const t=bo.Z.getTheme();if(t.background.slug){const i=jr.h.settings.themes.find((e=>e.name===t.name));return this.getBackground(t.background.slug).then((t=>this.setBackground(t,e)),(()=>(t.background=(0,ba.Z)(i.background),this.setCurrentBackground(!0))))}return this.setBackground("",e)}getBackground(e){return this.backgroundPromises[e]?this.backgroundPromises[e]:this.backgroundPromises[e]=this.cacheStorage.getFile("backgrounds/"+e).then((e=>URL.createObjectURL(e)))}setBackground(e,t=!0){this.lastBackgroundUrl=e;const i=this.chats.map((t=>t.setBackground(e)));return i[i.length-1].then((()=>{t&&d.Z.dispatchEvent("background_change")}))}saveChatPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.bubbles,i=e.peerId+(e.threadId?"_"+e.threadId:""),s=Mo.Z.getFromCache("chatPositions");if(t.scrollable.getDistanceToEnd()<=16&&t.scrollable.loadedAll.bottom||!t.getRenderedLength())delete s[i],this.log("deleted chat position");else{t.sliceViewport(!0);const e=t.scrollable.scrollTop,n={mids:(0,ot.Z)(t.bubbles,"desc").filter((e=>e>0&&!t.skippedMids.has(e))),top:e};s[i]=n,this.log("saved chat position:",n)}Mo.Z.set({chatPositions:s},!0)}getChatSavedPosition(e){if(!["chat","discussion"].includes(e.type)||!e.peerId)return;const t=e.peerId+(e.threadId?"_"+e.threadId:""),i=Mo.Z.getFromCache("chatPositions");return i&&i[t]}applyCurrentTheme(e,t,i){return t&&(this.backgroundPromises[e]=Promise.resolve(t)),bo.Z.setTheme(),this.setCurrentBackground(void 0===i?!!e:i)}chatsSelectTab(e,t){if(this.prevTab!==e){if(!1===t&&this.prevTab&&Po([e,this.prevTab].filter(Boolean)),this.prevTab){this.prevTab.classList.remove("active"),this.chatsSelectTabDebounced(),d.Z.settings.animationsEnabled&&!1!==t&&(0,ue.YW)((0,nt.Z)(400),400);const i=(0,Ie.Z)(this.prevTab);(0,Ie.Z)(e)>i&&Dn.Z.pushItem({type:"chat",onPop:e=>{this.setPeer({},e),(0,Vn.Z)()}})}e.classList.add("active"),this.prevTab=e}}init(){document.addEventListener("paste",this.onDocumentPaste,!0),c.Z||this.attachDragAndDropListeners(),this.markupTooltip=new Lo(this),this.markupTooltip.handleSelection()}attachDragAndDropListeners(){const e=[],t=[];let i=!1;const s=(r,d)=>Qr(this,void 0,void 0,(function*(){if(d===i)return;const l=r.dataTransfer.types,c=l.contains?l.contains("Files"):l.indexOf("Files")>=0,h=Pn(),u=yield Kr(r,!0);if(!c||!(yield this.canDrag())&&!h)return void(n=0);const p=h?o:a,f=h?t:e;if(d&&!f.length){const e=c&&!u.length,t=u.filter((e=>vn.Z.has(e))).length;this.log("drag files",u),h?(h.appendDrops(p),(u.length||e)&&f.push(new Io(p,{header:"Preview.Dragging.AddItems",headerArgs:[u.length],onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}}))):((u.length||e)&&f.push(new Io(p,{icon:"dragfiles",header:"Chat.DropTitle",subtitle:"Chat.DropAsFilesDesc",onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"document")}})),(t||e)&&f.push(new Io(p,{icon:"dragmedia",header:"Chat.DropTitle",subtitle:"Chat.DropQuickDesc",onDrop:e=>{s(e,!1),this.log("drop",e),this.onDocumentPaste(e,"media")}})),this.chat.container.append(p))}(0,Fe.Z)({element:p,className:"is-visible",forwards:d,duration:200,onTransitionEnd:()=>{d||(f.forEach((e=>{e.destroy()})),f.length=0)}}),d?f.forEach((e=>{e.setPath()})):n=0,document.body.classList.toggle("is-dragging",d),i=d}));let n=0;document.body.addEventListener("dragenter",(e=>{n++})),document.body.addEventListener("dragover",(e=>{s(e,!0),(0,Ce.Z)(e)})),document.body.addEventListener("dragleave",(e=>{n--,0===n&&s(e,!1)}));const a=document.createElement("div");a.classList.add("drops-container");const o=a.cloneNode(!0)}canDrag(){return Qr(this,void 0,void 0,(function*(){const e=this.chat;return!(!(null==e?void 0:e.peerId)||St.Z.isOverlayActive||!(yield e.canSend("send_media")))}))}overrideHash(e){return Qr(this,void 0,void 0,(function*(){let t;if(e){const i=yield this.managers.appPeersManager.getPeerUsername(e);t=i?"@"+i:""+e}Dn.Z.overrideHash(t)}))}selectTab(e,t){var i;!1===t&&Po([n.ZP.sidebarEl,this.columnEl,a.ZP.sidebarEl]),document.body.classList.toggle(n.ir,e===qr.CHATLIST);const s=this.tabId;void 0!==s&&(this.overrideHash(e>qr.CHATLIST?null===(i=this.chat)||void 0===i?void 0:i.peerId:void 0),this.dispatchEvent("tab_changing",e)),this.log("selectTab",e,s);let r=d.Z.settings.animationsEnabled?(0,pe.d1)():Promise.resolve();if(void 0!==s&&s!==e&&d.Z.settings.animationsEnabled&&!1!==t){const e=100+(o.Z.isMobile?250:200);r=(0,nt.Z)(e),(0,ue.YW)(r,e)}this.tabId=e,(0,Vn.Z)(),o.Z.isMobile&&s===qr.PROFILE&&es&&(e{this.setPeer({},e)}});const l=window.onImTabChange;return l&&l(e),r}updateStatus(){return this.managers.appUsersManager.updateMyOnlineStatus(this.offline)}createNewChat(){const e=new wo(this,this.managers);return this.chats.length&&e.setBackground(this.lastBackgroundUrl,!0),this.chats.push(e),e}spliceChats(e,t=!0,i,s){if(e>=this.chats.length)return;const n=this.chat;this.chats.length>1&&t&&this.dispatchEvent("peer_changing",this.chat),s||(s=this.chats.splice(e,this.chats.length-e));const o=this.chat;this.dispatchEvent("chat_changing",{from:n,to:o});for(let e=0;e1&&s.slice(0,-1).forEach((e=>{e.container.remove()})),this.chatsSelectTab(o.container,i),t){this.dispatchEvent("peer_changed",o);const e=a.ZP.getTab(uo);null==e||e.close(),a.ZP.replaceSharedMediaTab(o.sharedMediaTab)}s.forEach((e=>{e.beforeDestroy()})),setTimeout((()=>{s.forEach((e=>{e.destroy()}))}),350)}setPeer(e={},t){var i;return Qr(this,void 0,void 0,(function*(){this.init&&(this.init(),this.init=null),null!==(i=e.peerId)&&void 0!==i||(e.peerId=m.NM);const{peerId:s,lastMsgId:a,threadId:r}=e,d=this.chat,l=this.chats.indexOf(d),c=this.isSamePeer(d,e);if(s){if(l>0&&d.peerId&&!c){const t=this.chats.splice(1,this.chats.length-1);if(this.chat.peerId===s)return void this.spliceChats(0,!0,!0,t);{const i=this.setPeer(e);return this.spliceChats(0,!1,!1,t),i}}}else{if(l>0)return void this.spliceChats(l,void 0,t);if(o.Z.activeScreen===o._.medium)return void this.selectTab(+!this.tabId,t)}if(c&&o.Z.activeScreen<=o._.medium&&document.body.classList.contains(n.ir))return this.selectTab(qr.CHAT,t),!1;if(s||o.Z.activeScreen!==o._.mobile){const i=yield d.setPeer(e),n=(null==i?void 0:i.cached)?i.promise:Promise.resolve();s&&Promise.all([n,d.setBackgroundPromise]).then((()=>{setTimeout((()=>{setTimeout((()=>{this.chatsSelectTab(this.chat.container)}),0),this.selectTab(qr.CHAT,t)}),0)}))}return s?void 0:(this.selectTab(qr.CHATLIST,t),!1)}))}setInnerPeer(e){var t;return Qr(this,void 0,void 0,(function*(){const{peerId:i}=e;if(i===m.NM||!i)return;e.type||(e.threadId&&!(yield this.managers.appPeersManager.isForum(e.peerId))&&(e.type="discussion"),null!==(t=e.type)&&void 0!==t||(e.type="chat"));const s=this.chats.findIndex((t=>this.isSamePeer(t,e)||o.Z.activeScreen===o._.mobile&&0===this.tabId));if(-1!==s)return this.spliceChats(s+1),this.setPeer(e);const n=this.chat;let a=n;return n.inited&&(a=this.createNewChat()),this.dispatchEvent("chat_changing",{from:n,to:a}),this.setPeer(e)}))}openScheduled(e){this.setInnerPeer({peerId:e,type:"scheduled"})}getTypingElement(e){const t=document.createElement("span");let i="peer-typing";switch(t.classList.add(i),t.dataset.action=e._,e._){case"sendMessageTypingAction":i+="-text";for(let e=0;e<3;++e){const e=document.createElement("span");e.className=i+"-dot",t.append(e)}break;case"sendMessageUploadAudioAction":case"sendMessageUploadDocumentAction":case"sendMessageUploadRoundAction":case"sendMessageUploadVideoAction":case"sendMessageUploadPhotoAction":i+="-upload";break;case"sendMessageRecordAudioAction":case"sendMessageRecordRoundAction":case"sendMessageRecordVideoAction":i+="-record";break;case"sendMessageEmojiInteractionSeen":case"sendMessageChooseStickerAction":i+="-choosing-sticker";for(let e=0;e<2;++e){const e=document.createElement("div");e.className=i+"-eye",t.append(e)}}return t.classList.add(i),t}getPeerTyping(e,t,i){return Qr(this,void 0,void 0,(function*(){const s=e.isUser();if(s&&(yield this.managers.appUsersManager.isBot(e)))return;const n=yield this.managers.appProfileManager.getPeerTypings(e,i);if(!(null==n?void 0:n.length))return;const a=n[0],o={private:{sendMessageTypingAction:"Peer.Activity.User.TypingText",sendMessageUploadAudioAction:"Peer.Activity.User.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.User.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.User.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.User.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.User.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.User.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.User.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.User.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.User.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.User.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.User.EnjoyingAnimations"},chat:{sendMessageTypingAction:"Peer.Activity.Chat.TypingText",sendMessageUploadAudioAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadDocumentAction:"Peer.Activity.Chat.SendingFile",sendMessageUploadPhotoAction:"Peer.Activity.Chat.SendingPhoto",sendMessageUploadVideoAction:"Peer.Activity.Chat.SendingVideo",sendMessageUploadRoundAction:"Peer.Activity.Chat.SendingVideo",sendMessageRecordVideoAction:"Peer.Activity.Chat.RecordingVideo",sendMessageRecordAudioAction:"Peer.Activity.Chat.RecordingAudio",sendMessageRecordRoundAction:"Peer.Activity.Chat.RecordingVideo",sendMessageGamePlayAction:"Peer.Activity.Chat.PlayingGame",sendMessageChooseStickerAction:"Peer.Activity.Chat.ChoosingSticker",sendMessageEmojiInteractionSeen:"Peer.Activity.Chat.EnjoyingAnimations"},multi:{sendMessageTypingAction:"Peer.Activity.Chat.Multi.TypingText1",sendMessageUploadAudioAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadDocumentAction:"Peer.Activity.Chat.Multi.SendingFile1",sendMessageUploadPhotoAction:"Peer.Activity.Chat.Multi.SendingPhoto1",sendMessageUploadVideoAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageUploadRoundAction:"Peer.Activity.Chat.Multi.SendingVideo1",sendMessageRecordVideoAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageRecordAudioAction:"Peer.Activity.Chat.Multi.RecordingAudio1",sendMessageRecordRoundAction:"Peer.Activity.Chat.Multi.RecordingVideo1",sendMessageGamePlayAction:"Peer.Activity.Chat.Multi.PlayingGame1",sendMessageChooseStickerAction:"Peer.Activity.Chat.Multi.ChoosingSticker1"}},r=s?o.private:n.length>1?o.multi:o.chat;let d=a.action;if(n.length>1){const e={};n.forEach((t=>{const i=t.action._;void 0===e[i]&&(e[i]=0),++e[i]})),Object.keys(e).length>1&&(d={_:"sendMessageTypingAction"})}const l=r[d._];if(!l)return;let c,h;if(e.isAnyChat()){const e=new B.Z;c=e.update({peerId:a.userId.toPeerId(!1),onlyFirstName:!0}),h=[e.element,n.length-1],yield c}t||(t=document.createElement("span")).classList.add("online","peer-typing-container"),t.classList.toggle("peer-typing-flex","sendMessageChooseStickerAction"===d._||"sendMessageEmojiInteractionSeen"===d._);let u=t.firstElementChild;if(u?u.dataset.action!==d._&&u.replaceWith(this.getTypingElement(d)):(u=this.getTypingElement(d),t.prepend(u)),"sendMessageEmojiInteractionSeen"===d._){h?h.pop():h=[];const e=(0,xr.Z)((0,R.Z)(d.emoticon));h.push(e)}const p=(0,C.ag)(l,h);return p.classList.add("peer-typing-description"),t.childElementCount>1?t.lastElementChild.replaceWith(p):t.append(p),t}))}getChatStatus(e,t){return Qr(this,void 0,void 0,(function*(){const i=t?void 0:yield this.getPeerTyping(e.toPeerId(!0));if(i)return{cached:!0,result:Promise.resolve(i)};const s=yield this.managers.acknowledged.appProfileManager.getChatFull(e),n=Promise.resolve(s.result).then((t=>Qr(this,void 0,void 0,(function*(){var i,s;const n=t.participants_count||(null===(s=null===(i=t.participants)||void 0===i?void 0:i.participants)||void 0===s?void 0:s.length)||1;let a=yield(0,Ma.Z)(e);if(n<2)return a;const o=yield this.managers.appProfileManager.getOnlines(e);if(o>1){const e=document.createElement("span");e.append(...(0,C.v_)([a,(0,C.ag)("OnlineCount",[(0,ze.Z)(o)])],!1)),a=e}return a}))));return{cached:s.cached,result:n}}))}getUserStatus(e,t){var i;return Qr(this,void 0,void 0,(function*(){const s={cached:!0,result:Promise.resolve(void 0)},n=yield this.managers.appUsersManager.getUser(e);if(!n||n.pFlags.self&&!t)return s;const a=(0,Ks.Z)(n);if(!n.pFlags.bot&&!n.pFlags.support){let t=yield this.getPeerTyping(e.toPeerId());if(t||"userStatusOnline"!==(null===(i=n.status)||void 0===i?void 0:i._)||(t=document.createElement("span"),t.classList.add("online"),t.append(a)),t)return s.result=Promise.resolve(t),s}return s.result=Promise.resolve(a),s}))}getPeerStatus(e,t,i){return Qr(this,void 0,void 0,(function*(){if(!e)return;let s;return s=e.isAnyChat()?this.getChatStatus(e.toChatId(),i):this.getUserStatus(e.toUserId(),t),s}))}setPeerStatus(e){return Qr(this,void 0,void 0,(function*(){const{peerId:t,element:i,needClear:s,useWhitespace:n,middleware:a,ignoreSelf:o,noTyping:r}=e;if(!s){const e=i.querySelector(".peer-typing-container");if(e&&(yield this.getPeerTyping(t,e)))return}const d=yield this.getPeerStatus(t,o,r);if(!a())return;const l=()=>Qr(this,void 0,void 0,(function*(){const e=d&&(yield d.result);if(a())return()=>(0,U.Z)(i,e||c)})),c=n?"‎":"";return!d||d.cached||void 0===s?yield l():s?()=>(i.textContent=c,l().then((e=>null==e?void 0:e()))):void 0}))}setChoosingStickerTyping(e){this.managers.appMessagesManager.setTyping(this.chat.peerId,{_:e?"sendMessageCancelAction":"sendMessageChooseStickerAction"},void 0,this.chat.threadId)}isSamePeer(e,t){return e.peerId===t.peerId&&e.threadId===t.threadId&&(typeof e.type!=typeof t.type||e.type===t.type)}}const Xr=new Yr;me.GO&&(me.GO.appImManager=Xr);const Jr=Xr},3709:(e,t,i)=>{"use strict";function s(e){var t;return e&&!e.pFlags.is_outgoing&&!e.pFlags.noforwards&&!(null===(t=e.media)||void 0===t?void 0:t.extended_media)}i.d(t,{Z:()=>s})},7530:(e,t,i)=>{"use strict";function s(e){var t;if(!e)return;let i;if(e.action)i=e.action.photo;else if(e.media){let s=e.media;s.webpage?s=s.webpage:"messageExtendedMedia"===(null===(t=s.extended_media)||void 0===t?void 0:t._)&&(s=s.extended_media.media),i=s.document||s.photo}return i}i.d(t,{Z:()=>s})},2291:(e,t,i)=>{"use strict";function s(e){var t;return e.fromId?{peerId:e.fromId}:{fromName:null===(t=e.fwd_from)||void 0===t?void 0:t.from_name}}i.d(t,{Z:()=>s})},5381:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(677);function n(e){return!(!e.restriction_reason||!(0,s.X)(e.restriction_reason))}},5990:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});const s=["#fc5c51","#0fb297","#d09306","#3d72ed","#895dd5","#cd4073","#00c1a6","#fa790f"],n=["red","green","yellow","blue","violet","pink","cyan","orange"],a=[0,7,4,1,6,3,5];function o(e,t=!0){if(!e)return"";const i=a[Math.abs(+e)%7];return(t?n:s)[i]}},6082:(e,t,i)=>{"use strict";function s(e){if(e.username)return e.username;const t=e.usernames,i=null==t?void 0:t.find((e=>e.pFlags.editable));return null==i?void 0:i.username}i.d(t,{Z:()=>s})},2946:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(5880),n=i(1507);function a(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if((0,s.Z)(e)){const t=e.user_id;if(void 0!==t)return t.toPeerId(!1);const i=e.channel_id||e.chat_id;return void 0!==i?i.toPeerId(!0):n.NM}if(!e)return n.NM;const t="u"===e.charAt(0),i=e.substr(1).split("_");return t?i[0].toPeerId():(i[0]||"").toPeerId(!0)}},7030:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(9897),n=i(1507);function a(e,t=0,i=0,a=!1,o=!1){window.devicePixelRatio>1&&(t*=2,i*=2);let r=e.sizes||e.thumbs,d={_:"photoSizeEmpty",type:n.Pt};if(o&&r&&"photo"!==e._&&(r=r.concat({_:"photoSize",w:e.w,h:e.h,size:e.size,type:n.Pt})),null==r?void 0:r.length){for(let e=0,n=r.length;e=t||a.height>=i)break}a&&"photoSizeEmpty"===d._&&"photoStrippedSize"===r[0]._&&(d=r[0])}return d}},3075:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(5953),n=i(5003),a=i(6752);class o{constructor(e){var t;(0,s.Z)(this,e),this.log||(this.log=(null===(t=this.connection)||void 0===t?void 0:t.log)||(0,n.kg)("CALL-CONNECTION-BASE")),this.sources={}}createPeerConnection(e){return this.connection||(this.connection=function(e,t){t||(t=(0,n.kg)("RTCPeerConnection")),t("constructor");const i=new RTCPeerConnection(e);return i.addEventListener("track",(e=>{t("ontrack",e)})),i.addEventListener("signalingstatechange",(()=>{t("onsignalingstatechange",i.signalingState)})),i.addEventListener("connectionstatechange",(()=>{t("onconnectionstatechange",i.connectionState)})),i.addEventListener("negotiationneeded",(()=>{t("onnegotiationneeded",i.signalingState)})),i.addEventListener("icecandidate",(e=>{t("onicecandidate",e)})),i.addEventListener("iceconnectionstatechange",(()=>{t("oniceconnectionstatechange",i.iceConnectionState)})),i.addEventListener("datachannel",(()=>{t("ondatachannel")})),i.log=t,{connection:i}}(e,this.log.bindPrefix("connection")).connection)}createDataChannel(e){return this.dataChannel||(this.dataChannel=function(e,t,i){i||(i=(0,n.kg)("RTCDataChannel"));const s=e.createDataChannel("data",t);return s.addEventListener("message",(e=>{i("onmessage",e)})),s.addEventListener("open",(()=>{i("onopen")})),s.addEventListener("close",(()=>{i("onclose")})),s.log=i,s}(this.connection,e,this.log.bindPrefix("data")))}createDescription(){return this.description||(this.description=new a.ZP(this.connection))}appendStreamToConference(){return this.streamManager.appendToConference(this.description)}closeConnection(){const{connection:e}=this;if(e)try{e.log("close"),e.close()}catch(e){this.log.error(e)}}closeConnectionAndStream(e){this.closeConnection(),e&&this.streamManager.stop()}negotiate(){return this.negotiating||(this.negotiating=this.negotiateInternal().finally((()=>{this.negotiating=void 0})))}sendDataChannelData(e){"open"===this.dataChannel.readyState&&this.dataChannel.send(JSON.stringify(e))}}},2069:(e,t,i)=>{"use strict";i.d(t,{Z:()=>N});var s=i(6761),n=i(4762),a=i(5953),o=i(5701),r=i(671),d=i(5003),l=i(3855),c=i(3075),h=i(3773);function u(e){const t=(0,h.Z)(e,e.media[0]),i={"@type":"InitialSetup",fingerprints:[t.fingerprint],ufrag:t.ufrag,pwd:t.pwd,audio:void 0,video:void 0,screencast:void 0},s=e=>""+e;for(const t of e.media){const n=t.mediaType;if("application"===n||!t.isSending)continue;const a=i["video"===n&&i.video?"screencast":n]={},o=(0,h.Z)(e,t);a.ssrc=s(o.source),o.sourceGroups&&(a.ssrcGroups=o.sourceGroups.map((e=>({semantics:e.semantics,ssrcs:e.sources.map(s)}))));const r=a.rtpExtensions=[];t.attributes.get("extmap").forEach((e=>{r.push({id:+e.key,uri:e.value})}));const d=new Map,l=e=>{let t=d.get(e);return t||d.set(e,t={id:e}),t};t.attributes.get("rtpmap").forEach((e=>{const t=+e.key,i=l(t),s=e.value.split("/"),[n,a,o]=s;i.name=n,i.clockrate=+a,i.channels=o?+o:0})),t.attributes.get("rtcp-fb").forEach((e=>{const t=+e.key;l(t).feedbackTypes=e.lines.map((e=>{const t=e.split(" "),[i,s]=t;return{type:i,subtype:s||""}}))})),t.attributes.get("fmtp").forEach((e=>{const t=+e.key,i=l(t).parameters={},s=e.value.split(";");for(const e of s){const[t,s]=e.split("=");i[t]=s}})),a.payloadTypes=Array.from(d.values())}return i}var p=i(9124);class f extends c.Z{constructor(e){super(e)}negotiateInternal(){return e=this,t=void 0,s=function*(){const{connection:e,call:t}=this;if(!e.localDescription&&!e.remoteDescription&&!t.isOutgoing)return;let i;if(t.offerReceived){t.offerReceived=!1;const s=i=yield e.createAnswer();this.log("[sdp] local",s.type,s.sdp),yield e.setLocalDescription(s),this.log("[InitialSetup] send 2")}else{const s=i=yield e.createOffer();this.log("[sdp] local",s.sdp),yield e.setLocalDescription(s),t.offerSent=!0,this.log("[InitialSetup] send 0")}const s=u((0,p.DV)(i.sdp));t.sendCallSignalingData(s)},new((i=void 0)||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}));var e,t,i,s}}var m=i(8500),g=i(2493),v=i(3335),b=i(1677),y=i(49),w=i(6752),S=i(4903);const C="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;var L=i(9818),E=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class I{constructor(e,t){this.isOutgoing=e,this.p2pKey=t,this.type="Signaling",this.counter=0,this.seqMap=new Map}concatSHA256(e){return t=(0,S.Z)(...e),C.digest("SHA-256",(0,L.Z)(t)).then((e=>new Uint8Array(e)));var t}encryptPrepared(e){return E(this,void 0,void 0,(function*(){const t={counter:0,bytes:new Uint8Array(16+e.length)},i=(this.isOutgoing?0:8)+("Signaling"===this.type?128:0),s=this.p2pKey,n=yield this.concatSHA256([s.subarray(i+88,i+88+32),e]),a=t.bytes;for(let e=0;e<16;++e)a[e]=n[e+8];const o=yield this.prepareAesKeyIv(s,a,i),r=yield this.aesProcessCtr(e,e.length,o,!0);return t.bytes=new Uint8Array([...t.bytes.subarray(0,16),...r]),t}))}encryptRawPacket(e){const t=++this.counter,i=new ArrayBuffer(4);new DataView(i).setUint32(0,t>>>0,!1);const s=new Uint8Array([...new Uint8Array(i),...e]);return this.encryptPrepared(s)}prepareAesKeyIv(e,t,i){return E(this,void 0,void 0,(function*(){const[s,n]=yield Promise.all([this.concatSHA256([t.subarray(0,16),e.subarray(i,i+36)]),this.concatSHA256([e.subarray(40+i,40+i+36),t.subarray(0,16)])]);return{key:new Uint8Array([...s.subarray(0,8),...n.subarray(8,24),...s.subarray(24,32)]),iv:new Uint8Array([...n.subarray(0,4),...s.subarray(8,16),...n.subarray(24,28)])}}))}aesProcessCtr(e,t,i,s=!0){return E(this,void 0,void 0,(function*(){const t=yield C.importKey("raw",i.key,{name:"AES-CTR"},!1,[s?"encrypt":"decrypt"]),n=yield C[s?"encrypt":"decrypt"]({name:"AES-CTR",counter:i.iv,length:8*i.iv.length},t,e);return new Uint8Array(n)}))}constTimeIsDifferent(e,t,i){let s=!0;for(let n=0;n134217728)return;const{isOutgoing:t,type:i}=this,s=(t?8:0)+("Signaling"===i?128:0),n=this.p2pKey,a=e.subarray(0,16),o=e.subarray(16),r=e.length-16,d=yield this.prepareAesKeyIv(n,a,s),l=yield this.aesProcessCtr(o,r,d,!1),c=yield this.concatSHA256([n.subarray(88+s,88+s+32),l]);if(this.constTimeIsDifferent(c.subarray(8),a,16))return;const h=new DataView(l.buffer).getUint32(0);return this.seqMap.has(h)?void 0:(this.seqMap.set(h,h),l.slice(4))}))}}var M=i(630);class P{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new M.Z;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r.add(`a=fingerprint:${t} ${i}`,`a=setup:${s}`)})),i&&s&&r.add(`a=ice-ufrag:${i}`,`a=ice-pwd:${s}`),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} audio${s}`),r.add("a=rtcp-mux",_(a),F(i,s,n,d));break;case"video":r.add(`m=video 61986 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",_(a),F(i,s,n,d))}}return r.add("m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"),r.finalize()}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a],r=new M.Z;r.add("v=0","o=- 1 2 IN IP4 127.0.0.1","s=-","t=0 0"),t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r.add(`a=fingerprint:${t} ${i}`,`a=setup:${s}`)})),i&&s&&r.add(`a=ice-ufrag:${i}`,`a=ice-pwd:${s}`),r.add("a=group:BUNDLE 0 1 2","a=extmap-allow-mixed","a=msid-semantic: WMS *");const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} audio${s}`),r.add("a=rtcp-mux",_(a),F(i,s,n,d));break;case"video":r.add(`m=video 61986 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}`,"c=IN IP4 0.0.0.0","a=rtcp:9 IN IP4 0.0.0.0","a=ice-options:trickle",`a=mid:${e}`,"a=sendrecv",A(l)),s&&r.add(`a=msid:${d} video${s}`),r.add("a=rtcp-mux","a=rtcp-rsize",_(a),F(i,s,n,d))}}return r.add("m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144"),r.finalize()}}class Z{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(l),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(l),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];let r="v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(h),r+="\na=rtcp-mux",r+=_(l),r+=F(i,n,a,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${l.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=mid:${e}\na=sendrecv`,r+=A(h),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(l),r+=F(i,n,a,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}}class k{static generateOffer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} audio${s}`),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}static generateAnswer(e){const{fingerprints:t,ufrag:i,pwd:s,audio:n,video:a}=e;n.type="audio",a.type="video";const o=[n,a];if(!o.length)return"v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n";let r="v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0";t&&t.forEach((e=>{const{hash:t,fingerprint:i,setup:s}=e;r+=`\na=fingerprint:${t} ${i}\na=setup:${s}`})),i&&s&&(r+=`\na=ice-ufrag:${i}\na=ice-pwd:${s}`),r+="\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *";const d="stream"+o.map((e=>e.ssrc)).join("_");for(let e=0;ee.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} audio${s}`),r+="\na=rtcp-mux",r+=_(a),r+=F(i,s,n,d);break;case"video":r+=`\nm=video 9 UDP/TLS/RTP/SAVPF ${a.map((e=>e.id)).join(" ")}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${e}\na=sendrecv`,r+=A(l),s&&(r+=`\na=msid:${d} video${s}`),r+="\na=rtcp-mux\na=rtcp-rsize",r+=_(a),r+=F(i,s,n,d)}}return r+="m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144",r+="\n",r}}function T(){return navigator.userAgent.toLowerCase().indexOf("firefox")>-1}function x(){return navigator.userAgent.toLowerCase().indexOf("safari")>-1&&-1===navigator.userAgent.toLowerCase().indexOf("chrome")}function A(e){let t=[];for(let i=0;i{const{type:i,subtype:s}=e;t.push(`a=rtcp-fb:${n} ${[i,s].join(" ")}`)})),l){const e=[];Object.getOwnPropertyNames(l).forEach((t=>{e.push(`${t}=${l[t]}`)})),t.push(`a=fmtp:${n} ${e.join(";")}`)}}return t.join("\n")}function F(e,t,i,s){let n=[];return i&&i.length>0?i.forEach((t=>{t&&t.ssrcs.length>0&&(n.push(`a=ssrc-group:${t.semantics} ${t.ssrcs.join(" ")}`),t.ssrcs.forEach((t=>{n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${s} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`)})))})):t&&n.push(`a=ssrc:${t} cname:stream${t}`,`a=ssrc:${t} msid:${s} ${e}${t}`,`a=ssrc:${t} mslabel:${e}${t}`,`a=ssrc:${t} label:${e}${t}`),n.join("\n")}class D{static generateCandidate(e){if(!e)return null;const{sdpString:t,sdpMLineIndex:i,sdpMid:s,foundation:n,component:a,protocol:o,priority:r,address:d,type:l,relAddress:c,generation:h,tcpType:u,networkId:p,networkCost:f,username:m}=e;if(t)return{candidate:t,sdpMLineIndex:i,sdpMid:s};throw"no sdpString"}static generateOffer(e){return T()?Z.generateOffer(e):x()?k.generateOffer(e):P.generateOffer(e)}static generateAnswer(e){return T()?Z.generateAnswer(e):x()?k.generateAnswer(e):P.generateAnswer(e)}}var R=i(9585),B=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class N extends m.Z{constructor(e){super(),this.log=(0,d.kg)("CALL"),this.protocol||(this.protocol={_:"phoneCallProtocol",pFlags:{udp_p2p:!0,udp_reflector:!0},min_layer:92,max_layer:92,library_versions:["4.0.0"]}),(0,a.Z)(this,e),this.createdAt=Date.now(),this.offerReceived=!1,this.offerSent=!1,this.decryptQueue=[],this.candidates=[],this.addEventListener("state",(e=>{this.log("state",v.Z[e]),e===v.Z.CLOSED&&this.cleanup()}));const t=this.streamManager=new R.Z(b.iK);t.direction="sendrecv",t.types.push("screencast"),this.isOutgoing||(t.locked=!0,t.canCreateConferenceEntry=!1);let i={"@type":"MediaState",type:"input",lowBattery:!1,muted:!0,screencastState:"inactive",videoRotation:0,videoState:"inactive"};const s=this;i=new Proxy(i,{set:function(e,t,n){return e[t]=n,s.setMediaState(i),s.sendMediaState(),!0}}),this.mediaStates={input:i},this.sendMediaState=(0,o.Z)(this._sendMediaState.bind(this),0,!1,!0)}get connectionState(){const{_connectionState:e,connectionInstance:t}=this;if(void 0!==e)return e;if(t){const{iceConnectionState:e}=t.connection;return"closed"===e?v.Z.CLOSED:"connected"===e||n.IS_SAFARI&&"completed"===e?v.Z.CONNECTED:v.Z.CONNECTING}return v.Z.CONNECTING}get sortIndex(){const e=this.connectionState;let t=1e13*(v.Z.CLOSED-e+1);return t+=2147483647e3-(e===v.Z.PENDING&&this.isOutgoing?0:this.createdAt),t}getVideoElement(e){if("input"===e)return this.elements.get("main");{const e=this.getMediaState("output");if(!e)return;const t="active"===e.videoState?"video":"active"===e.screencastState?"screencast":void 0;if(!t)return;const i=this.description.findEntry((e=>e.type===t));if(!i)return;return this.elements.get(""+i.recvEntry.source)}}startScreenSharingInternal(){return B(this,void 0,void 0,(function*(){try{this.wasStartingScreen=!0,this.wasStartingVideo=!1,this.streamManager.types=["audio","screencast"],yield this.requestScreen()}catch(e){this.log.error("startScreenSharing error",e)}}))}toggleScreenSharing(){return B(this,void 0,void 0,(function*(){return this.isSharingVideo&&(yield this.stopVideoSharing()),this.isSharingScreen?this.stopVideoSharing():this.startScreenSharingInternal()}))}startVideoSharingInternal(){return B(this,void 0,void 0,(function*(){try{this.wasStartingScreen=!1,this.wasStartingVideo=!0,this.streamManager.types=["audio","video"],yield this.requestInputSource(!1,!0,!1)}catch(e){this.log.error("startVideoSharing error",e)}}))}stopVideoSharing(){return B(this,void 0,void 0,(function*(){const e=this.getMediaState("input");e.videoState=e.screencastState="inactive";const{streamManager:t,description:i}=this,s=t.inputStream.getVideoTracks()[0];s&&((0,y.Z)(s),t.appendToConference(i))}))}toggleVideoSharing(){return B(this,void 0,void 0,(function*(){return this.isSharingScreen&&(yield this.stopVideoSharing()),this.isSharingVideo?this.stopVideoSharing():this.startVideoSharingInternal()}))}getMediaState(e){return this.mediaStates[e]}setMediaState(e){this.mediaStates[e.type]=e,this.dispatchEvent("mediaState",e)}isSharingVideoType(e){try{return super.isSharingVideo&&!!(this.wasStartingScreen&&"screencast"===e||this.wasStartingVideo&&"video"===e)}catch(e){return!1}}get isSharingVideo(){return this.isSharingVideoType("video")}get isSharingScreen(){return this.isSharingVideoType("screencast")}get isMuted(){const e=this.streamManager.inputStream.getAudioTracks()[0];return!(null==e?void 0:e.enabled)}get isClosing(){const{connectionState:e}=this;return e===v.Z.CLOSING||e===v.Z.CLOSED}get description(){var e;return null===(e=this.connectionInstance)||void 0===e?void 0:e.description}setHangUpTimeout(e,t){this.clearHangUpTimeout(),this.hangUpTimeout=s.Z.setTimeout((()=>{this.hangUpTimeout=void 0,this.hangUp(t)}),e)}clearHangUpTimeout(){void 0!==this.hangUpTimeout&&(clearTimeout(this.hangUpTimeout),this.hangUpTimeout=void 0)}setPhoneCall(e){this.call=e;const{id:t}=e;if(this.id!==t){const e=this.id;this.id=t,this.dispatchEvent("id",t,e)}}acceptCall(){var e;return B(this,void 0,void 0,(function*(){const t=null===(e=(yield Promise.all(this.dispatchResultableEvent("acceptCallOverride")))[0])||void 0===e||e;if(this.isClosing||!t)return;this.overrideConnectionState(v.Z.EXCHANGING_KEYS);const i=this.call;this.requestInputSource(!0,!!i.pFlags.video,!1);const s=i.g_a_hash;this.managers.appCallsManager.generateDh().then((e=>B(this,void 0,void 0,(function*(){return this.dh={g_a_hash:s,b:e.a,g_b:e.g_a,g_b_hash:e.g_a_hash,p:e.p},this.managers.apiManager.invokeApi("phone.acceptCall",{peer:yield this.managers.appCallsManager.getCallInput(this.id),protocol:this.protocol,g_b:this.dh.g_b})})))).then((e=>B(this,void 0,void 0,(function*(){yield this.managers.appCallsManager.savePhonePhoneCall(e)})))).catch((e=>{this.log.error("accept call error",e),this.hangUp("phoneCallDiscardReasonHangup")}))}))}joinCall(){this.log("joinCall"),this.getEmojisFingerprint(),this.overrideConnectionState();const{isOutgoing:e,encryptionKey:t,streamManager:i}=this,s=function(e){const t=[];return e.connections.forEach((e=>{switch(e._){case"phoneConnectionWebrtc":{const{ip:i,ipv6:s,port:n,username:a,password:o}=e,r=[];e.pFlags.turn?(i&&r.push(`turn:${i}:${n}`),s&&r.push(`turn:[${s}]:${n}`)):e.pFlags.stun&&(i&&r.push(`stun:${i}:${n}`),s&&r.push(`stun:[${s}]:${n}`)),r.length>0&&t.push({urls:r,username:a,credential:o});break}}})),{iceServers:t,iceTransportPolicy:e.pFlags.p2p_allowed?"all":"relay"}}(this.call);if(this.log("joinCall configuration",s),!s)return;const n=this.connectionInstance=new f({call:this,streamManager:i,log:this.log.bindPrefix("connection")}),a=n.createPeerConnection(s);a.addEventListener("iceconnectionstatechange",(()=>{const e=this.connectionState;void 0===this.connectedAt&&e===v.Z.CONNECTED&&(this.connectedAt=Date.now()),this.dispatchEvent("state",e)})),a.addEventListener("negotiationneeded",(()=>{n.negotiate()})),a.addEventListener("icecandidate",(e=>{const{candidate:t}=e;a.log("onicecandidate",t),(null==t?void 0:t.candidate)&&this.sendIceCandidate(t)})),a.addEventListener("track",(e=>{const{track:t}=e;a.log("ontrack",t),this.onTrack(e)})),n.createDescription(),this.encryptor=new I(e,t),this.decryptor=new I(!e,t),this.log("currentCall",this),e&&n.appendStreamToConference(),this.createDataChannel(),this.processDecryptQueue()}createDataChannelEntry(){const e=this.description.createEntry("application");e.setDirection("sendrecv"),e.sendEntry=e.recvEntry=e}createDataChannel(){if(this.connectionInstance.dataChannel)return;const e=this.connectionInstance.createDataChannel({id:0,negotiated:!0});e.addEventListener("message",(e=>{this.applyDataChannelData(JSON.parse(e.data))})),e.addEventListener("open",(()=>{this.sendMediaState()}))}applyDataChannelData(e){"MediaState"===e["@type"]?(e.type="output",this.log("got output media state",e),this.setMediaState(e)):this.log.error("unknown data channel data:",e)}_sendMediaState(){const{connectionInstance:e}=this;if(!e)return;const t=Object.assign({},this.getMediaState("input"));delete t.type,this.log("sendMediaState",t),e.sendDataChannelData(t)}sendCallSignalingData(e){return B(this,void 0,void 0,(function*(){const t=JSON.stringify(e),i=(new TextEncoder).encode(t),{bytes:s}=yield this.encryptor.encryptRawPacket(i);this.log("sendCallSignalingData",this.id,t),yield this.managers.apiManager.invokeApi("phone.sendSignalingData",{peer:yield this.managers.appCallsManager.getCallInput(this.id),data:s})}))}sendIceCandidate(e){this.log("sendIceCandidate",e);const{candidate:t,sdpMLineIndex:i}=e;if(0!==i)return;const s=function(e){if(!e||!e.startsWith("candidate:"))return;const t=e;e=e.substr("candidate:".length);const[i,s,n,a,o,r,...d]=e.split(" "),l={sdpString:t,foundation:i,component:s,protocol:n,priority:a,address:{ip:o,port:r}};for(let e=0;e(this.getEmojisFingerprintPromise=void 0,this.emojisFingerprint=e.map((e=>(0,r.zu)(e))))))}unlockStreamManager(){this.connectionInstance.streamManager.locked=!1,this.connectionInstance.appendStreamToConference()}doTheMagic(){return B(this,void 0,void 0,(function*(){this.connectionInstance.appendStreamToConference();const e=this.connectionInstance.connection;let t=yield e.createAnswer();this.log("[sdp] local",t.type,t.sdp),yield e.setLocalDescription(t),e.getTransceivers().filter((e=>"recvonly"===e.direction)).forEach((e=>{const t=this.connectionInstance.description.getEntryByMid(e.mid);t.transceiver=t.recvEntry.transceiver=e,e.direction="sendrecv"}));const i=this.description,s=i.entries.map((e=>e.mid)),n={type:"offer",sdp:i.generateSdp({bundle:s,entries:i.entries.filter((e=>s.includes(e.mid))),isAnswer:!0})};yield e.setRemoteDescription(n),t=yield e.createAnswer(),yield e.setLocalDescription(t);const a=u((0,p.DV)(t.sdp));this.log("[InitialSetup] send 1"),this.sendCallSignalingData(a),this.unlockStreamManager()}))}overrideConnectionState(e){this._connectionState=e,this.dispatchEvent("state",this.connectionState)}get duration(){return void 0!==this.connectedAt?(Date.now()-this.connectedAt)/1e3|0:0}onInputStream(e){super.onInputStream(e);const t=e.getVideoTracks()[0];if(t){const e=this.getMediaState("input");this.wasStartingScreen||this.wasStartingVideo||(this.wasStartingVideo=!0),this.isSharingVideo?e.videoState="active":this.isSharingScreen&&(e.screencastState="active"),t.addEventListener("ended",(()=>{this.stopVideoSharing()}),{once:!0})}e.getAudioTracks().length&&this.onMutedChange()}onMutedChange(){const e=this.isMuted;this.dispatchEvent("muted",e),this.getMediaState("input").muted=e}toggleMuted(){return this.requestAudioSource(!0).then((()=>{this.setMuted(),this.onMutedChange()}))}hangUp(e,t){return B(this,void 0,void 0,(function*(){if(!this.isClosing&&(this.discardReason=e,this.log("hangUp",e),this.overrideConnectionState(v.Z.CLOSED),this.connectionInstance&&this.connectionInstance.closeConnectionAndStream(!0),e&&!t)){let t=!1;for(const e in this.mediaStates){const i=this.mediaStates[e];t="active"===i.videoState||"active"===i.screencastState||t}yield this.managers.appCallsManager.discardCall(this.id,this.duration,e,t)}}))}performCodec(e){const t=e.payloadTypes.map((e=>Object.assign(Object.assign({},e),{"rtcp-fbs":e.feedbackTypes})));return{"rtp-hdrexts":e.rtpExtensions,"payload-types":t}}setDataToDescription(e){this.description.setData({transport:{pwd:e.pwd,ufrag:e.ufrag,fingerprints:e.fingerprints,"rtcp-mux":!0},audio:this.performCodec(e.audio),video:e.video?this.performCodec(e.video):void 0,screencast:e.screencast?this.performCodec(e.screencast):void 0})}filterNotVP8(e){this.isOutgoing||[e.video,e.screencast].filter(Boolean).forEach((e=>{const t=e.payloadTypes,i=t.findIndex((e=>"VP8"===e.name)),s=t[i],n=t.findIndex((e=>{var t;return+(null===(t=e.parameters)||void 0===t?void 0:t.apt)===s.id}));e.payloadTypes=[t[i],t[n]]}))}applyCallSignalingData(e){return B(this,void 0,void 0,(function*(){this.log("applyCallSignalingData",this,e);const{connection:t,description:i}=this.connectionInstance;switch(e["@type"]){case"InitialSetup":{this.log("[sdp] InitialSetup",e),this.filterNotVP8(e),this.setDataToDescription(e);const s=e=>e.map((e=>({_:"groupCallParticipantVideoSourceGroup",semantics:e.semantics,sources:e.ssrcs.map((e=>+e))})));[(0,w.z_)("audio",+e.audio.ssrc),e.video?(0,w.z_)("video",s(e.video.ssrcGroups)):void 0,e.screencast?(0,w.z_)("screencast",s(e.screencast.ssrcGroups)):void 0].filter(Boolean).forEach((e=>{let t=i.getEntryBySource(e.source);if(t)return;const s=i.findFreeSendRecvEntry(e.type,!1);t=new w.Lp(s.mid,e.type),t.setDirection("sendrecv"),s.recvEntry=t,i.setEntrySource(t,e.sourceGroups||e.source)})),this.createDataChannelEntry();const n=this.offerSent;this.offerSent=!1;const a=i.entries.map((e=>e.mid)),o={type:n?"answer":"offer",sdp:i.generateSdp({bundle:a,entries:i.entries.filter((e=>a.includes(e.mid))),isAnswer:!n})};this.log("[sdp] remote",o.sdp),yield t.setRemoteDescription(o),yield this.tryToReleaseCandidates(),n||(yield this.doTheMagic());break}case"Candidates":for(const t of e.candidates){const e=D.generateCandidate(t);e.sdpMLineIndex=0;const i=new RTCIceCandidate(e);this.candidates.push(i)}yield this.tryToReleaseCandidates();break;default:this.log.error("unrecognized signaling data",e)}}))}tryToReleaseCandidates(){return B(this,void 0,void 0,(function*(){const{connectionInstance:e}=this;if(!e)return;const{connection:t}=e;if(t.remoteDescription){const e=this.candidates.map((e=>this.addIceCandidate(t,e)));this.candidates.length=0,yield Promise.all(e)}else this.log("[candidates] postpone")}))}addIceCandidate(e,t){return B(this,void 0,void 0,(function*(){this.log("[candidate] start",t);try{yield e.addIceCandidate(t),this.log("[candidate] add",t)}catch(e){this.log.error("[candidate] error",t,e)}}))}processDecryptQueue(){return B(this,void 0,void 0,(function*(){const{encryptor:e}=this;if(!e)return void this.log.warn("got encrypted signaling data before the encryption key");if(!this.decryptQueue.length)return;const t=this.decryptQueue.slice();this.decryptQueue.length=0;for(const i of t){const t=yield e.decryptRawPacket(i);if(!t)continue;const s=(new TextDecoder).decode(t);try{const e=JSON.parse(s);this.log("[update] updateNewCallSignalingData",e),this.applyCallSignalingData(e)}catch(e){this.log.error("wrong signaling data",s),this.hangUp("phoneCallDiscardReasonDisconnect"),g.Z.dispatchEvent("incompatible",this.interlocutorUserId)}}}))}onUpdatePhoneCallSignalingData(e){this.decryptQueue.push(e),this.processDecryptQueue()}}},8500:(e,t,i)=>{"use strict";i.d(t,{Z:()=>p});var s=i(3241),n=i(319),a=i(9125),o=i(9337),r=i(382),d=i(5424);function l(){const e={main:{},screen:{}};return t=>{return i=this,s=void 0,a=function*(){const{isScreen:i,constraints:s}=t,n=e[i?"screen":"main"];let a=n[s.audio?"audio":"video"];a||(a=(i?r.Z:d.Z)(s,t.muted),s.audio&&!n.audio&&(n.audio=a.finally((()=>n.audio=void 0))),s.video&&!n.video&&(n.video=a.finally((()=>n.video=void 0))));try{return yield a}catch(e){throw e}},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}window.getStreamCached=l;var c=i(312),h=i(49),u=i(9585);class p extends s.Z{constructor(){super(!1);const e=this.player=document.createElement("div");e.classList.add("call-player"),e.style.display="none",document.body.append(e),this.elements=new Map;const t=this.audio=new Audio;t.autoplay=!0,t.volume=1,this.player.append(t),this.elements.set("audio",t),this.fixSafariAudio(),this.getStream=l()}get isSharingAudio(){return!!this.streamManager.hasInputTrackKind("audio")}get isSharingVideo(){return!!this.streamManager.hasInputTrackKind("video")}fixSafariAudio(){this.audio.play().catch(n.Z)}requestAudioSource(e){return this.requestInputSource(!0,!1,e)}requestInputSource(e,t,i){const{streamManager:s}=this;if(s){const i=!e||this.isSharingAudio,s=!t||this.isSharingVideo;if(i&&s)return Promise.resolve()}const n={audio:e&&(0,a.Z)(),video:t&&(0,c.Z)()};return this.getStream({constraints:n,muted:i}).then((e=>{this.onInputStream(e)}))}requestScreen(){return this.getStream({isScreen:!0,constraints:(0,o.Z)(!0)}).then((e=>{this.onInputStream(e)}))}getElement(e){return this.elements.get(""+e)}cleanup(){this.player.textContent="",this.player.remove(),this.elements.clear(),this.streamManager.stop(),super.cleanup()}onTrack(e){this.tryAddTrack({stream:e.streams[0],track:e.track,type:"output"})}saveInputVideoStream(e,t){const i=e.getVideoTracks()[0];this.tryAddTrack({stream:e,track:i,type:"input",source:t||"main"})}tryAddTrack({stream:e,track:t,type:i,source:s}){s||(s=u.Z.getSource(e,i)),this.log("tryAddTrack",e,t,i,s);const a="output"===i,{player:o,elements:r,streamManager:d}=this,l=t.kind,c="video"===l,h=c?s:l;let p=r.get(h);c&&t.addEventListener("ended",(()=>{this.log("[track] onended"),r.delete(h)}),{once:!0}),a&&d.addTrack(e,t,i);const f=c?e:d.outputStream;if(p)p.paused&&p.play().catch(n.Z),p.srcObject=f;else{if(p=document.createElement(l),p.autoplay=!0,p.srcObject=f,p.volume=1,"undefined"!==p.sinkId){const{outputDeviceId:e}=this;e&&p.setSinkId(e)}c?(p.setAttribute("playsinline","true"),p.muted=!0):o.appendChild(p),r.set(h,p)}return s}setMuted(e){this.streamManager.inputStream.getAudioTracks().forEach((t=>{"audio"===(null==t?void 0:t.kind)&&(t.enabled=void 0===e?!t.enabled:!e)}))}onInputStream(e){if(this.isClosing)e.getTracks().forEach((e=>{(0,h.Z)(e)}));else{e.getVideoTracks().length&&this.saveInputVideoStream(e,"main");const{streamManager:t,description:i}=this;t.addStream(e,"input"),i&&t.appendToConference(i)}}}},3335:(e,t,i)=>{"use strict";var s;i.d(t,{Z:()=>n}),function(e){e[e.CONNECTED=0]="CONNECTED",e[e.CONNECTING=1]="CONNECTING",e[e.EXCHANGING_KEYS=2]="EXCHANGING_KEYS",e[e.PENDING=3]="PENDING",e[e.REQUESTING=4]="REQUESTING",e[e.CLOSING=5]="CLOSING",e[e.CLOSED=6]="CLOSED"}(s||(s={}));const n=s},2493:(e,t,i)=>{"use strict";i.d(t,{Z:()=>C});var s=i(5916);let n;var a=i(410),o=i(993),r=i(1655),d=i(6519),l=i(9895),c=i(3241),h=i(7298),u=i(5003),p=i(3855),f=i(1507),m=i(3512),g=i(2069),v=i(3335),b=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};const y=45e3;class w extends c.Z{construct(e){this.managers=e,this.log=(0,u.kg)("CC"),o.Z&&(this.audioAsset=null!=n?n:n=new s.Z(["call_busy.mp3","call_connect.mp3","call_end.mp3","call_incoming.mp3","call_outgoing.mp3","voip_failed.mp3"]),this.tempId=0,this.instances=new Map,this.sortedInstances=[],m.Z.addEventListener("call_update",(e=>b(this,void 0,void 0,(function*(){var t;let i=this.instances.get(e.id);switch(i&&i.setPhoneCall(e),e._){case"phoneCallDiscarded":i&&i.hangUp(null===(t=e.reason)||void 0===t?void 0:t._,!0);break;case"phoneCallAccepted":i&&i.confirmCall();break;case"phoneCallRequested":i||(i=this.createCallInstance({isOutgoing:!1,interlocutorUserId:e.admin_id}),i.overrideConnectionState(v.Z.PENDING),i.setPhoneCall(e),i.setHangUpTimeout(y,"phoneCallDiscardReasonMissed"));break;case"phoneCall":{if(!i||i.encryptionKey)break;const t=i.dh.g_a=e.g_a_or_b,s=i.dh,n=yield p.Z.invokeCrypto("sha256",t);if(!(0,l.Z)(s.g_a_hash,n)){this.log.error("Incorrect g_a_hash",s.g_a_hash,n);break}const{key:a,key_fingerprint:o}=yield this.managers.appCallsManager.computeKey(t,s.b,s.p);if(e.key_fingerprint!==o){this.log.error("Incorrect key fingerprint",e.key_fingerprint,o,t,s),i.hangUp("phoneCallDiscardReasonDisconnect");break}i.encryptionKey=a,i.joinCall();break}}})))),m.Z.addEventListener("call_signaling",(({callId:e,data:t})=>{const i=this.instances.get(e);(null==i?void 0:i.id)===e&&i.onUpdatePhoneCallSignalingData(t)})))}get currentCall(){return this.sortedInstances[0]}getCallByUserId(e){for(const[t,i]of this.instances)if(i.interlocutorUserId===e)return i}createCallInstance(e){const t=new g.Z(Object.assign({managers:this.managers},e));return t.addEventListener("state",(e=>{const i=this.currentCall;e===v.Z.CLOSED?(this.instances.delete(t.id),(0,r.Z)(this.sortedInstances,t)):(0,d.Z)(this.sortedInstances,t,"sortIndex"),e===v.Z.EXCHANGING_KEYS&&(t.wasTryingToJoin=!0);const s=void 0!==t.connectedAt;e===v.Z.EXCHANGING_KEYS||e===v.Z.CONNECTING&&s?t.setHangUpTimeout(y,"phoneCallDiscardReasonDisconnect"):t.clearHangUpTimeout(),i!==t&&i||(e===v.Z.CLOSED?t.isOutgoing||t.wasTryingToJoin?t.wasTryingToJoin&&!s?this.audioAsset.playSound("voip_failed.mp3"):this.audioAsset.playSound("phoneCallDiscardReasonBusy"===t.discardReason?"call_busy.mp3":"call_end.mp3"):this.audioAsset.stopSound():e===v.Z.PENDING?this.audioAsset.playSound(t.isOutgoing?"call_outgoing.mp3":"call_incoming.mp3",!0):e===v.Z.EXCHANGING_KEYS?this.audioAsset.playSoundIfDifferent("call_connect.mp3"):e===v.Z.CONNECTING?t.duration&&this.audioAsset.playSound("voip_connecting.mp3",!0):this.audioAsset.stopSound())})),t.addEventListener("id",((e,i)=>{void 0!==i&&this.instances.delete(i);const s=!!this.currentCall;this.instances.set(e,t),void 0===i&&this.dispatchEvent("instance",{instance:t,hasCurrent:s})})),t}startCallInternal(e,t){return b(this,void 0,void 0,(function*(){this.log("p2pStartCallInternal",e,t);const i=yield this.managers.appProfileManager.getProfile(e);if(!i)return;const{video_calls_available:s}=i.pFlags,n=this.createCallInstance({isOutgoing:!0,interlocutorUserId:e});n.requestInputSource(!0,!(!t||!s),!1),n.overrideConnectionState(v.Z.REQUESTING),n.setPhoneCall({_:"phoneCallWaiting",access_hash:"",admin_id:f.NM,date:(0,h.Z)(!0),id:--this.tempId,participant_id:e,protocol:n.protocol,pFlags:{video:t||void 0}}),this.managers.appCallsManager.generateDh().then((i=>b(this,void 0,void 0,(function*(){return n.dh=i,this.managers.appCallsManager.requestCall(e,n.protocol,n.dh.g_a_hash,t&&s)})))).then((e=>{n.overrideConnectionState(v.Z.PENDING),n.setPhoneCall(e),n.setHangUpTimeout(y,"phoneCallDiscardReasonHangup")}))}))}}const S=new w;a.GO&&(a.GO.callsController=S);const C=S},1677:(e,t,i)=>{"use strict";i.d(t,{KM:()=>s,iK:()=>n});const s=50,n=100},9078:(e,t,i)=>{"use strict";i.d(t,{Z:()=>T});var s=i(4762),n=i(1655),a=i(5953),o=i(6724),r=i(5003),d=i(1507),l=i(3512),c=i(8500),h=i(7625),u=i(3075),p=i(8479),f=i(6752),m=i(9124),g=i(4373),v=i(3773),b=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class y extends u.Z{constructor(e){super(e),this.negotiateThrottled=(0,o.Z)(this.negotiate.bind(this),0,!1)}createPeerConnection(){return this.connection||super.createPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",iceCandidatePoolSize:0})}createDataChannel(){if(this.dataChannel)return this.dataChannel;const e=super.createDataChannel();return e.addEventListener("open",(()=>{this.maybeUpdateRemoteVideoConstraints()})),e.addEventListener("close",(()=>{this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)})),e}createDescription(){return this.description?this.description:super.createDescription()}appendStreamToConference(){super.appendStreamToConference()}invokeJoinGroupCall(e,t,i){return b(this,void 0,void 0,(function*(){const{groupCall:s,description:n}=this,a=s.id,o=t.map((t=>{const i=function(e,t){const i=(0,v.Z)(e,t),s=t.mediaType,n={source:i.source,sourceGroups:i.sourceGroups,type:s};i.fingerprint.setup="active";const a={fingerprints:[i.fingerprint],pwd:i.pwd,ssrc:i.source,"ssrc-groups":i.sourceGroups||[],ufrag:i.ufrag};return{params:{_:"dataJSON",data:JSON.stringify(a)},source:i.source,media:t,sourceGroups:i.sourceGroups,entry:n}}(e,t);return this.sources[i.entry.type]=i.entry,i})),r=o.find((e=>"audio"===e.media.mediaType)),d=o.find((e=>"video"===e.media.mediaType));let{source:c,params:u}=r||{};const p=d||r,f={audio:r,video:d};if(n.entries.forEach((e=>{if("sendonly"===e.direction){const t=f[e.type];if(!t)return;n.setEntrySource(e,t.sourceGroups||t.source),n.setEntryPeerId(e,l.Z.myId)}})),u!==p.params){const e=JSON.parse(p.params.data);c?e.ssrc=c:delete e.ssrc,u={_:"dataJSON",data:JSON.stringify(e)}}const m=yield this.managers.appGroupCallsManager.joinGroupCall(a,u,i),g=JSON.parse(m.params.data);return g.audio=g.audio||s.connections.main.description.audio,n.setData(g),function(e,t){["audio","video"].filter((e=>t[e])).map((e=>[t[e],e])).forEach((([t,i])=>{const s=e.find((e=>e.mediaType===i));if(!s)return;const n=(e=>{const t={};return e.attributes.get("extmap").forEach((e=>{const i=e.key.split("/",1)[0];t[i]=e.value})),t})(s);(0,h.Z)(t["rtp-hdrexts"],((e,t,s)=>{n[e.id]!==e.uri&&(s.splice(t,1),console.log("[sdp] filtered extmap:",e,t,i))}))}))}(t,g),g}))}negotiateInternal(){return b(this,void 0,void 0,(function*(){const{connection:e,description:t}=this,i="new"===e.iceConnectionState&&!t.getEntryByMid("0").source,s=this.log.bindPrefix("startNegotiation");s("start");const n=yield e.createOffer({iceRestart:!1});i&&this.dataChannel&&t.createEntry("application").setDirection("sendrecv");const{sdp:a,offer:o}=function(e){const{offer:t,data:i}=e,s=(0,m.DV)(t.sdp);let n=!1;if(e.skipAddingMulticast||(n=(0,m.e6)(s)||n),(0,h.Z)(s.media,((e,t,a)=>{if(e.isSending)return;if("application"===e.mediaType)return;const o=e.mediaLine,r=o.mediaLineParts,d=(r.ids,o.toString()),l=i[e.mediaType]["payload-types"].map((e=>""+e.id));if(d!==(0,g.Px)(e.mediaType,void 0,l)){const o=(0,v.Z)(s,e),d=Object.assign({},i);d.transport=(0,p.Z)(d.transport),d.transport.ufrag=o.ufrag,d.transport.pwd=o.pwd,d.transport.fingerprints=[o.fingerprint],d.transport.candidates=[];const l=new f.Lp(o.mid,r.type);l.setPort(r.port),o.source&&l.setSource(o.sourceGroups||o.source),l.setDirection(e.direction);const c=(new g.DY).addSsrcEntry(l,d).finalize(),h=(0,m.DV)(c).media[0];a[t]=h,n=!0}})),n){const e=s.toString();t.sdp=e}return{offer:t,sdp:s}}({offer:n,data:t});s("[sdp] setLocalDescription",o.sdp),yield e.setLocalDescription(o);const r=a.media.filter((e=>"application"!==e.mediaType&&e.isSending));if(i)try{yield this.invokeJoinGroupCall(a,r,this.options)}catch(e){this.log.error("[tdweb] joinGroupCall error",e)}const d=[],l=a.bundle;(0,h.Z)(l,((e,i,s)=>{const n=t.getEntryByMid(e);n.shouldBeSkipped(!0)&&(s.splice(i,1),d.push(n))}));const c=a.media.map((e=>{const i=e.mid;let s=t.getEntryByMid(i);return s||(s=new f.Lp(i,e.mediaType),s.setDirection("inactive")),s})),u={type:"answer",sdp:t.generateSdp({bundle:l,entries:c,isAnswer:!0})};d.forEach((e=>{t.deleteEntry(e)})),s(`[sdp] setRemoteDescription signaling=${e.signalingState} ice=${e.iceConnectionState} gathering=${e.iceGatheringState} connection=${e.connectionState}`,u.sdp),yield e.setRemoteDescription(u),s("end")}))}negotiate(){let e=this.negotiating;return e||(e=super.negotiate(),this.updateConstraints&&e.then((()=>{this.maybeUpdateRemoteVideoConstraints(),this.updateConstraints=!1})),"presentation"===this.options.type&&e.then((()=>{this.connection.getTransceivers().find((e=>{var t,i;"video"===(null===(i=null===(t=e.sender)||void 0===t?void 0:t.track)||void 0===i?void 0:i.kind)&&e.sender.setParameters(Object.assign(Object.assign({},e.sender.getParameters()),{degradationPreference:"maintain-resolution"}))}))})),e)}maybeUpdateRemoteVideoConstraints(){if("open"!==this.dataChannel.readyState)return;this.log("maybeUpdateRemoteVideoConstraints");const e={colibriClass:"ReceiverVideoConstraints",constraints:{},defaultConstraints:{maxHeight:0},onStageEndpoints:[]};for(const t of this.description.entries){if("recvonly"!==t.direction||"video"!==t.type)continue;const{endpoint:i}=t;e.onStageEndpoints.push(i),e.constraints[i]={minHeight:180,maxHeight:720}}this.sendDataChannelData(e),e.onStageEndpoints.length?this.updateConstraintsInterval||(this.updateConstraintsInterval=window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this),5e3)):this.updateConstraintsInterval&&(clearInterval(this.updateConstraintsInterval),this.updateConstraintsInterval=void 0)}addInputVideoStream(e){this.groupCall.saveInputVideoStream(e,this.type),this.streamManager.addStream(e,"input"),this.appendStreamToConference()}}var w=i(2207),S=i(9337),C=i(382),L=i(5424),E=i(312),I=i(49),M=i(9585),P=i(2946),Z=i(2059),k=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};class T extends c.Z{constructor(e){super(),(0,a.Z)(this,e),this.log||(this.log=(0,r.kg)("GROUP-CALL")),this.connections||(this.connections={}),this.isSpeakingMap||(this.isSpeakingMap=new Map),this.pinnedSources=[],this.participantsSsrcs=new Map,this.hadAutoPinnedSources=new Set,this.dispatchPinnedThrottled=(0,o.Z)((()=>{this.dispatchEvent("pinned",this.pinnedSource)}),0,!1),this.addEventListener("state",(e=>{e===w.Z.CLOSED&&this.cleanup()}))}get connectionState(){return this.connections.main.connection.iceConnectionState}get state(){const{connectionState:e}=this;if("closed"===e)return w.Z.CLOSED;if("connected"===e||s.IS_SAFARI&&"completed"===e){const{participant:e}=this;return e.pFlags.can_self_unmute?e.pFlags.muted?w.Z.MUTED:w.Z.UNMUTED:w.Z.MUTED_BY_ADMIN}return w.Z.CONNECTING}get participants(){return this.managers.appGroupCallsManager.getCachedParticipants(this.id)}get isSharingScreen(){return!!this.connections.presentation}get pinnedSource(){return this.pinnedSources[this.pinnedSources.length-1]}get isMuted(){return this.state!==w.Z.UNMUTED}get isClosing(){const{state:e}=this;return e===w.Z.CLOSED}get streamManager(){return this.connections.main.streamManager}get description(){return this.connections.main.description}pinSource(e){(0,n.Z)(this.pinnedSources,e),this.pinnedSources.push(e),this.dispatchPinnedThrottled()}unpinSource(e){this.hadAutoPinnedSources.delete(e),(0,n.Z)(this.pinnedSources,e),this.dispatchPinnedThrottled()}unpinAll(){this.pinnedSources.length=0,this.dispatchPinnedThrottled()}getParticipantByPeerId(e){return k(this,void 0,void 0,(function*(){return d.NM===e?this.participant:(yield this.participants).get(e)}))}toggleMuted(){return this.requestAudioSource(!0).then((()=>this.changeUserMuted(d.NM)))}changeUserMuted(e,t){return k(this,void 0,void 0,(function*(){const i=yield this.getParticipantByPeerId(e);return d.NM===e&&i.pFlags.can_self_unmute&&(t=void 0===t?!i.pFlags.muted:t),this.editParticipant(i,{muted:t})}))}getElement(e){return super.getElement(e)}getVideoElementFromParticipantByType(e,t){let i;i=e.pFlags.self?"video"===t?"main":"presentation":e[t].source_groups[0].sources[0];const s=this.getElement(i);if(!s)return;const n=s.cloneNode();return n.srcObject=s.srcObject,{video:n,source:i}}createConnectionInstance(e){return this.connections[e.type]=new y(Object.assign({groupCall:this,log:this.log.bindPrefix(e.type),managers:this.managers},e))}changeRaiseHand(e){return this.editParticipant(this.participant,{raiseHand:e})}startScreenSharingInternal(){return k(this,void 0,void 0,(function*(){try{const e="presentation",t=yield(0,C.Z)((0,S.Z)()),i=new M.Z,s=this.createConnectionInstance({streamManager:i,type:e,options:{type:e}});s.createPeerConnection().addEventListener("negotiationneeded",(()=>{s.negotiate()})),t.getVideoTracks()[0].addEventListener("ended",(()=>{this.connections.presentation&&this.stopScreenSharing()}),{once:!0}),s.createDescription(),s.addInputVideoStream(t)}catch(e){this.log.error("start screen sharing error",e)}}))}startScreenSharing(){var e;return null!==(e=this.startScreenSharingPromise)&&void 0!==e?e:this.startScreenSharingPromise=this.startScreenSharingInternal().finally((()=>{this.startScreenSharingPromise=void 0}))}stopScreenSharing(){const e=this.connections.presentation;return e?(delete this.connections.presentation,this.unpinSource("presentation"),e.closeConnectionAndStream(!0),delete this.participant.presentation,this.managers.appGroupCallsManager.saveApiParticipant(this.id,this.participant),this.managers.appGroupCallsManager.leaveGroupCallPresentation(this.id)):Promise.resolve()}toggleScreenSharing(){return this.isSharingScreen?this.stopScreenSharing():this.startScreenSharing()}startVideoSharingInternal(){return k(this,void 0,void 0,(function*(){const e={video:(0,E.Z)()};try{const t=yield(0,L.Z)(e,!1);this.connections.main.addInputVideoStream(t),yield this.editParticipant(this.participant,{videoPaused:!1,videoStopped:!1})}catch(t){this.log.error("startVideoSharing error",t,e)}}))}startVideoSharing(){var e;return null!==(e=this.startVideoSharingPromise)&&void 0!==e?e:this.startVideoSharingPromise=this.startVideoSharingInternal().finally((()=>{this.startVideoSharingPromise=void 0}))}stopVideoSharing(){return k(this,void 0,void 0,(function*(){const e=this.connections.main,t=e.streamManager.inputStream.getVideoTracks()[0];t&&((0,I.Z)(t),e.streamManager.appendToConference(e.description),yield this.editParticipant(this.participant,{videoStopped:!0}))}))}toggleVideoSharing(){return this.isSharingVideo?this.stopVideoSharing():this.startVideoSharing()}hangUp(e=!1,t=!1,i=!1){return k(this,void 0,void 0,(function*(){for(const e in this.connections)this.connections[e].closeConnectionAndStream(!t);if(this.dispatchEvent("state",this.state),!i&&!t){const t=e||(this.joined?this.connections.main.sources.audio.source:void 0);this.managers.appGroupCallsManager.hangUp(this.id,t)}}))}tryAddTrack(e){const{description:t}=this,i=super.tryAddTrack(e);if("output"===e.type){const e=t.getEntryBySource(+i);this.getParticipantByPeerId(e.peerId).then((e=>{e&&l.Z.dispatchEvent("group_call_participant",{groupCallId:this.id,participant:e})}))}return i}editParticipant(e,t){return k(this,void 0,void 0,(function*(){if(Object.keys(t).length){if(e){const i=e.pFlags.self;if(i&&void 0!==t.muted&&!this.isSharingAudio&&(delete t.muted,!Object.keys(t).length))return;const s=t.muted;void 0!==s&&e.pFlags.self&&(s?e.pFlags.muted=!0:e.pFlags.can_self_unmute&&delete e.pFlags.muted),void 0!==t.raiseHand&&(t.raiseHand?e.raise_hand_rating="1":delete e.raise_hand_rating),i&&(void 0!==t.videoStopped&&(t.videoStopped?delete e.video:e.video=(0,Z.KR)(this.connections.main.sources.video)),!e.pFlags.muted&&e.pFlags.can_self_unmute&&this.setMuted(!1),this.dispatchEvent("state",this.state))}return this.managers.appGroupCallsManager.editParticipant(this.id,e,t)}}))}onParticipantUpdate(e,t){const i=this.connections.main,{connection:s,description:n}=i,a=(0,P.Z)(e.peer),o=!!e.pFlags.left,r=this.participantsSsrcs.get(a)||[];if(e.presentation&&!o){const{source:t}=(0,Z._f)(e,"video",e.presentation.source_groups,e.presentation.endpoint);this.hadAutoPinnedSources.has(t)||(this.hadAutoPinnedSources.add(t),this.pinSource(e.pFlags.self?"presentation":t))}if(e.pFlags.self){this.participant=e,i.sources.audio.source!==e.source&&this.hangUp();let s=!1;return e.pFlags.can_self_unmute?e.pFlags.muted&&(s=!0):(this.stopScreenSharing(),this.stopVideoSharing(),s=!0),s&&this.setMuted(!0),void(t!==a&&this.dispatchEvent("state",this.state))}const d=o?[]:(0,Z.s$)(e);o?this.participantsSsrcs.delete(a):this.participantsSsrcs.set(a,d);const l=new Set;r.forEach((e=>{const t=e.source;if(!d.find((e=>e.source===t))){this.unpinSource(t);const e=n.getEntryBySource(t);e&&"inactive"!==e.direction&&(e.setDirection("inactive"),l.add(e.type))}})),d.forEach((e=>{let t=n.getEntryBySource(e.source);t?"inactive"===t.direction&&(t.setDirection(t.originalDirection),l.add(t.type)):(t=n.createEntry(e.type),n.setEntrySource(t,e.sourceGroups||e.source),n.setEntryPeerId(t,a),"video"===e.type&&t.setEndpoint(e.endpoint),t.createTransceiver(s,{direction:"recvonly"}),l.add(t.type))})),l.size&&(l.has("video")&&(i.updateConstraints=!0),i.negotiateThrottled())}}},2207:(e,t,i)=>{"use strict";var s;i.d(t,{Z:()=>n}),function(e){e[e.UNMUTED=0]="UNMUTED",e[e.MUTED=1]="MUTED",e[e.MUTED_BY_ADMIN=2]="MUTED_BY_ADMIN",e[e.CONNECTING=3]="CONNECTING",e[e.CLOSED=4]="CLOSED"}(s||(s={}));const n=s},2059:(e,t,i)=>{"use strict";i.d(t,{ZP:()=>L,KR:()=>w,_f:()=>y,s$:()=>b});var s=i(5916);let n;var a=i(410),o=i(3241),r=i(5003),d=i(3512),l=i(9078),c=i(2207),h=i(1677),u=i(9585),p=i(9125),f=i(5424),m=i(312),g=i(6752),v=function(e,t,i,s){return new(i||(i=Promise))((function(n,a){function o(e){try{d(s.next(e))}catch(e){a(e)}}function r(e){try{d(s.throw(e))}catch(e){a(e)}}function d(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,r)}d((s=s.apply(e,t||[])).next())}))};function b(e){var t,i;return[y(0,"audio",e.source),(null===(t=e.video)||void 0===t?void 0:t.audio_source)&&y(0,"audio",e.video.audio_source),e.video&&y(0,"video",e.video.source_groups,e.video.endpoint),(null===(i=e.presentation)||void 0===i?void 0:i.audio_source)&&y(0,"audio",e.presentation.audio_source),e.presentation&&y(0,"video",e.presentation.source_groups,e.presentation.endpoint)].filter(Boolean)}function y(e,t,i,s){return(0,g.z_)(t,i,s)}function w(e,t){return e&&{_:"groupCallParticipantVideo",pFlags:{},endpoint:"",source_groups:e.sourceGroups,audio_source:t}}class S extends o.Z{construct(e){this.managers=e,this.audioAsset=null!=n?n:n=new s.Z(["group_call_connect.mp3","group_call_end.mp3","group_call_start.mp3","voip_onallowtalk.mp3"]),this.log=(0,r.kg)("GCC"),d.Z.addEventListener("group_call_update",(e=>{const{currentGroupCall:t}=this;(null==t?void 0:t.id)===e.id&&(t.groupCall=e,"groupCallDiscarded"===e._&&t.hangUp(!1,!1,!0))})),d.Z.addEventListener("group_call_participant",(({groupCallId:e,participant:t})=>{const{currentGroupCall:i}=this;(null==i?void 0:i.id)===e&&i.onParticipantUpdate(t)}))}get groupCall(){return this.currentGroupCall}setCurrentGroupCall(e){this.currentGroupCall=e,e&&this.dispatchEvent("instance",e)}startConnectingSound(){this.stopConnectingSound(),this.audioAsset.playSoundWithTimeout("group_call_connect.mp3",!0,2500)}stopConnectingSound(){this.audioAsset.stopSound(),this.audioAsset.cancelDelayedPlay()}joinGroupCall(e,t,i=!0,s,n){return v(this,void 0,void 0,(function*(){let a;return this.audioAsset.createAudio(),this.log(`joinGroupCall chatId=${e} id=${t} muted=${i} rejoin=${s}`),a=s?this.currentGroupCall.connections.main.streamManager:yield function(e,t){return i=this,s=void 0,a=function*(){const i={audio:(0,p.Z)(),video:t&&(0,m.Z)()},s=new u.Z(h.iK);try{const t=yield(0,f.Z)(i,e);s.addStream(t,"input")}catch(e){console.error("joinGroupCall getStream error",e,i),s.inputStream=new MediaStream}return s},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}(i,n),this.joinGroupCallInternal(e,t,a,i,s,n).then((()=>{const{currentGroupCall:e}=this;e.participants.then((t=>{this.currentGroupCall===e&&e.state!==c.Z.CLOSED&&t.forEach((t=>{t.pFlags.self||e.onParticipantUpdate(t)}))}))}))}))}joinGroupCallInternal(e,t,i,s,n=!1,a){return v(this,void 0,void 0,(function*(){const o=this.log.bindPrefix("joinGroupCallInternal");o("start",t);const r="main";let{currentGroupCall:h}=this;if(!h||!n){h=new l.Z({chatId:e,id:t,managers:this.managers}),h.fixSafariAudio(),h.addEventListener("state",(e=>{this.currentGroupCall===h&&e===c.Z.CLOSED&&(this.setCurrentGroupCall(null),this.stopConnectingSound(),this.audioAsset.playSound("group_call_end.mp3"),d.Z.dispatchEvent("chat_update",h.chatId))})),h.groupCall=yield this.managers.appGroupCallsManager.getGroupCallFull(t);const u=h.createConnectionInstance({streamManager:i,type:r,options:{type:r,isMuted:s,joinVideo:a,rejoin:n}}),p=u.createPeerConnection();return p.addEventListener("negotiationneeded",(()=>{u.negotiate()})),p.addEventListener("track",(e=>{o("ontrack",e),h.onTrack(e)})),p.addEventListener("iceconnectionstatechange",(()=>{h.dispatchEvent("state",h.state);const{iceConnectionState:e}=p;switch("disconnected"===e||"checking"===e||"new"===e?this.startConnectingSound():this.stopConnectingSound(),e){case"checking":case"completed":case"disconnected":case"new":break;case"closed":case"failed":h.hangUp();break;case"connected":h.joined||(h.joined=!0,this.audioAsset.playSound("group_call_start.mp3"),this.managers.appGroupCallsManager.getGroupCallParticipants(t))}})),u.createDescription(),u.createDataChannel(),u.appendStreamToConference(),this.setCurrentGroupCall(h),o("set currentGroupCall",t,h),this.startConnectingSound(),u.negotiate()}h.handleUpdateGroupCallParticipants=!1,h.updatingSdp=!1,o("update currentGroupCall",t,h)}))}}const C=new S;a.GO&&(a.GO.groupCallController=C);const L=C},9125:(e,t,i)=>{"use strict";function s(){const e={channelCount:2};return["noiseSuppression","echoCancellation","autoGainControl"].forEach((t=>{(function(e){var t;return(!!(null===(t=null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||void 0===t?void 0:t.getSupportedConstraints()))[e]})(t)&&(e[t]=!0)})),e}i.d(t,{Z:()=>s})},9337:(e,t,i)=>{"use strict";function s(e){const t={video:{width:{max:1920},height:{max:1080},frameRate:{max:30}}};return e||(t.audio=!0),t}i.d(t,{Z:()=>s})},382:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});function s(e){return t=this,i=void 0,n=function*(){const t=yield navigator.mediaDevices.getDisplayMedia(e);return t.getVideoTracks()[0].contentHint="text",t},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}},5424:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});function s(e,t){return i=this,s=void 0,a=function*(){const i=yield navigator.mediaDevices.getUserMedia(e);return i.getTracks().forEach((e=>{e.enabled=!t})),i},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}window.getStream=s},312:(e,t,i)=>{"use strict";function s(){return{width:{min:1280,max:1920},height:{min:720,max:1080},frameRate:{min:24,max:30}}}i.d(t,{Z:()=>s})},3773:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(8957);function n(e,t){const i=t.lookupAttributeKeys({"ice-ufrag":!0,"ice-pwd":!0,fingerprint:!0,setup:!0,ssrc:!0,mid:!0,"ssrc-group":!1});if(!i.fingerprint){const t=e.session.lines.find((e=>{var t;return"fingerprint"===(null===(t=e.parsed)||void 0===t?void 0:t.key)}));i.fingerprint=t.parsed.value}const n=function(e){const t=e.map((e=>{const[t,...i]=e.split(" ");return{_:"groupCallParticipantVideoSourceGroup",semantics:t,sources:i.map((e=>(0,s.Fk)(+e)))}}));return t.length?t:void 0}(i["ssrc-group"]),[a,o]=i.fingerprint.split(" ",2),r=i.ssrc&&(0,s.Fk)(+i.ssrc.split(" ",1)[0]);return{raw:i,ufrag:i["ice-ufrag"],pwd:i["ice-pwd"],fingerprint:{fingerprint:o,setup:i.setup,hash:a},source:r,sourceGroups:n,mid:i.mid}}},49:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(6669);function n(e){e.stop(),(0,s.Z)(e,"ended")}},6752:(e,t,i)=>{"use strict";i.d(t,{Lp:()=>o,ZP:()=>d,z_:()=>r});var s=i(1655),n=i(5953),a=i(4373);class o{constructor(e,t){this.mid=e,this.type=t,this.port=a._D}setDirection(e){return this.originalDirection||(this.originalDirection=e),this.direction=e}setPort(e){return this.port=e}setEndpoint(e){return this.endpoint=e}setPeerId(e){return this.peerId=e}createTransceiver(e,t){return(null==t?void 0:t.direction)&&this.setDirection(t.direction),this.transceiver=e.addTransceiver((0,a.pl)(this.type),t)}setSource(e){let t;if(Array.isArray(e)){if(!e[0])return;t=e,e=t[0].sources[0]}return this.sourceGroups=t,this.source=e}shouldBeSkipped(e){return e&&"inactive"===this.direction}}function r(e,t,i){let s;if(Array.isArray(t)){if(!t[0])return;s=t,t=s[0].sources[0]}return{endpoint:i,type:e,source:t,sourceGroups:s}}class d{constructor(e){this.connection=e,this.sessionId=""+Date.now(),this.maxSeenId=-1,this.entries=[],this.entriesByMid=new Map,this.entriesBySource=new Map,this.entriesByPeerId=new Map}setData(e){return(0,n.Z)(this,e)}createEntry(e){const t=""+ ++this.maxSeenId,i=new o(t,e);return this.entries.push(i),this.entriesByMid.set(t,i),i}deleteEntry(e){(0,s.Z)(this.entries,e),this.entriesByMid.delete(e.mid),this.entriesBySource.delete(e.source);const t=this.entriesByPeerId.get(e.peerId);t&&(t.delete(e),t.size||this.entriesByPeerId.delete(e.peerId))}setEntrySource(e,t){e.setSource(t),this.entriesBySource.set(e.source,e)}setEntryPeerId(e,t){e.setPeerId(t);let i=this.entriesByPeerId.get(t);i||this.entriesByPeerId.set(t,i=new Set),i.add(e)}findEntry(e){return this.entries.find(e)}findFreeSendRecvEntry(e,t){let i=this.entries.find((i=>"sendrecv"===i.direction&&i.type===e&&!(t?i.sendEntry:i.recvEntry)));return i||(i=this.createEntry(e),i.setDirection("sendrecv")),i}getEntryByMid(e){return this.entriesByMid.get(e)}getEntryBySource(e){return this.entriesBySource.get(e)}getEntriesByPeerId(e){return this.entriesByPeerId.get(e)}generateSdp(e){return a.DY.fromConference(Object.assign({conference:this},e))}}},9124:(e,t,i)=>{"use strict";i.d(t,{e6:()=>de,DV:()=>oe});var s,n,a=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},o=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class r{constructor(e,t){s.set(this,void 0),n.set(this,void 0),a(this,s,e,"f"),a(this,n,t,"f")}get session(){return o(this,s,"f")}get media(){return o(this,n,"f")}get bundle(){return this.session.lines.find((e=>{var t;return"group"===(null===(t=e.parsed)||void 0===t?void 0:t.key)})).value.split(" ").slice(1)}toString(){return this.session.lines.concat(...this.media.map((e=>e.lines))).map((e=>e.toString())).join("\r\n")+"\r\n"}}function d(e,t,i){const s=e.split(t),n=[];for(;i>0&&s.length;)n.push(s.shift()),--i;return s.length&&n.push(s.join(t)),n}s=new WeakMap,n=new WeakMap;var l,c,h,u=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},p=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class f{constructor(e,t){l.set(this,void 0),c.set(this,void 0),h.set(this,void 0),u(this,l,new Set,"f"),u(this,c,e,"f"),u(this,h,t,"f")}generate(){const e=p(this,c,"f"),t=p(this,h,"f"),i=p(this,l,"f"),s=t-e+1;let n=Math.floor(e+s*Math.random()),a=0;for(;i.has(n);)if(n=s)return null;return i.add(n),n}add(e){p(this,l,"f").add(e)}}l=new WeakMap,c=new WeakMap,h=new WeakMap;var m,g,v=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},b=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class y{constructor(e,t){m.set(this,void 0),g.set(this,void 0),v(this,m,e,"f"),v(this,g,t,"f")}get key(){return b(this,m,"f")}get value(){return b(this,g,"f")}}m=new WeakMap,g=new WeakMap;var w,S,C,L,E=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},I=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class M{constructor(e,t,i,s){w.set(this,void 0),S.set(this,void 0),C.set(this,void 0),L.set(this,void 0),E(this,w,e,"f"),E(this,S,t,"f"),E(this,C,i,"f"),E(this,L,s,"f")}get type(){return I(this,w,"f")}get port(){return I(this,S,"f")}get protocol(){return I(this,C,"f")}get ids(){return I(this,L,"f")}toString(){return this.type+" "+this.port+" "+this.protocol+" "+this.ids.join(" ")}}w=new WeakMap,S=new WeakMap,C=new WeakMap,L=new WeakMap;var P,Z,k,T,x=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},A=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class _{constructor(e,t){if(P.set(this,void 0),Z.set(this,void 0),k.set(this,void 0),T.set(this,void 0),x(this,P,e,"f"),"string"==typeof t){if(x(this,Z,t,"f"),"m"===e){const e=t.split(" ");x(this,k,new M(e[0],e[1],e[2],e.slice(3)),"f")}else if("a"===e){const e=d(t,":",1);t=e[0],x(this,T,1===e.length?new y(t,null):new y(t,e[1]),"f")}}else t instanceof M?(x(this,k,t,"f"),x(this,Z,t.toString(),"f")):t instanceof y&&(x(this,T,t,"f"),x(this,Z,t.value?`${t.key}:${t.value}`:t.key,"f"))}get key(){return A(this,P,"f")}get value(){return A(this,Z,"f")}get parsed(){return A(this,T,"f")}get mediaLineParts(){return A(this,k,"f")}toString(){return`${this.key}=${this.value}`}}P=new WeakMap,Z=new WeakMap,k=new WeakMap,T=new WeakMap;var F,D,R,B,N,O,U=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},H=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class z{constructor(e,t,i=":",s=!1){F.set(this,void 0),D.set(this,void 0),R.set(this,void 0),B.set(this,void 0),N.set(this,void 0),O.set(this,void 0),U(this,F,e,"f"),U(this,D,t,"f"),U(this,R,i,"f"),U(this,N,s,"f"),U(this,B,s?new Map:null,"f"),U(this,O,s?[]:null,"f")}get lines(){return H(this,D,"f")}get value(){return H(this,N,"f")||!this.lines.length?null:this.lines[0]}get exists(){return!H(this,N,"f")}get key(){return H(this,F,"f")}get keys(){return z.fill(this),H(this,O,"f")}forEach(e){z.fill(this),H(this,B,"f").forEach(e)}get(e){return z.fill(this),H(this,B,"f").get(e)||new z(e,[],":",!0)}static fill(e){if(null!==H(e,B,"f"))return;const t=new Map;e.lines.forEach((i=>{const[s,n]=d(i,H(e,R,"f"),1),a=t.get(s)||[];t.set(s,[...a,n||""])}));const i=U(e,B,z.makeAttributes(t),"f");U(e,O,Array.from(i.keys()),"f")}static makeAttributes(e){const t=new Map;return e.forEach(((e,i)=>{t.set(i,new z(i,e))})),t}}F=new WeakMap,D=new WeakMap,R=new WeakMap,B=new WeakMap,N=new WeakMap,O=new WeakMap;var j,G,V=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},K=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class W{constructor(e){j.set(this,void 0),G.set(this,void 0),V(this,j,e,"f"),V(this,G,new Map,"f"),W.fillAttributes(this)}get(e){return K(this,G,"f").get(e)||new z(e,[]," ",!0)}static fillAttributes(e){const t=new Map;K(e,j,"f").forEach((e=>{if("a"===e.key){const{key:i,value:s}=e.parsed;let n=t.get(i);n||(n=[],t.set(i,n)),n.push(s||"")}})),t.forEach(((t,i)=>{K(e,G,"f").set(i,new z(i,t," ",!1))}))}}j=new WeakMap,G=new WeakMap;var $,q,Q,Y,X=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},J=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class ee{constructor(e){$.set(this,void 0),q.set(this,void 0),Q.set(this,void 0),Y.set(this,void 0),X(this,$,e,"f"),X(this,q,e[0],"f"),X(this,Q,X(this,Y,null,"f"),"f")}get lines(){return J(this,$,"f")}get mediaLine(){return J(this,q,"f")}get mediaLineParts(){return J(this,q,"f").mediaLineParts}get mediaType(){return this.mediaLineParts.type}get direction(){if(!J(this,Y,"f")){const e=this.attributes;let t;t=e.get("sendonly").exists?"sendonly":e.get("recvonly").exists?"recvonly":e.get("inactive").exists?"inactive":"sendrecv",X(this,Y,t,"f")}return J(this,Y,"f")}get isSending(){return"sendrecv"===this.direction||"sendonly"===this.direction}get isReceiving(){return"sendrecv"===this.direction||"recvonly"===this.direction}get attributes(){return J(this,Q,"f")||X(this,Q,new W(this.lines),"f"),J(this,Q,"f")}get mid(){return this.attributes.get("mid").value}lookupAttributeKeys(e){const t={};for(const i in e){const s=this.attributes.get(i),n=!e[i];t[i]=s?n?s.lines:s.value:n?[]:void 0}return t}}$=new WeakMap,q=new WeakMap,Q=new WeakMap,Y=new WeakMap;var te,ie,se=function(e,t,i,s,n){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!n)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!n:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?n.call(e,i):n?n.value=i:t.set(e,i),i},ne=function(e,t,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!s:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(e):s?s.value:t.get(e)};class ae{constructor(e){te.set(this,void 0),ie.set(this,void 0),se(this,te,e,"f"),se(this,ie,e.filter((e=>"o"===e.key)).map((e=>e.value.split(" ")[1]))[0],"f")}get lines(){return ne(this,te,"f")}get sessionId(){return ne(this,ie,"f")}}function oe(e){function t(){i?n.push(new ee(s)):i=new ae(s)}let i=null,s=[];const n=[];return e.split(/\r?\n/).forEach((e=>{if(!function(e){return/^[\s\xa0]*$/.test(e)}(e)){const i=re(e);"m"===i.key&&(t(),s=[]),s.push(i)}})),t(),new r(i,n)}function re(e){const t=d(e,"=",1);return new _(t[0],t[1])}function de(e){let t;return e.media.forEach(((i,s)=>{if("video"===i.mediaType&&i.isSending&&!i.attributes.get("ssrc-group").get("SIM").exists){t||(t=new f(2,4294967295));const n=i.attributes.get("ssrc-group").get("FID").value.split(" "),a=i.lines;n.forEach((e=>t.add(+e)));const o=[n[0],t.generate(),t.generate()],r=[n[1],t.generate(),t.generate()];a.push(re("a=ssrc-group:SIM "+o.join(" ")));const d=i.attributes.get("ssrc").get(n[0]).lines;o.forEach(((e,t)=>{const i=r[t];t>0&&(a.push(re("a=ssrc-group:FID "+e+" "+i)),d.forEach((t=>{a.push(re("a=ssrc:"+e+" "+t))})),d.forEach((e=>{a.push(re("a=ssrc:"+i+" "+e))})))})),e.media[s]=new ee(a)}})),!!t}te=new WeakMap,ie=new WeakMap},4373:(e,t,i)=>{"use strict";i.d(t,{DY:()=>c,Px:()=>l,_D:()=>o,pl:()=>r});var s=i(4762),n=i(630),a=i(8957);const o="9";function r(e){return"screencast"===e?"video":e}function d(e){return"application"===e?"DTLS/SCTP":"UDP/TLS/RTP/SAVPF"}function l(e,t=o,i){const s=d(e);return`m=${r(e)} ${t} ${s} ${i.join(" ")}`}class c extends n.Z{addCandidate(e){return this.add(function(e){const t=[];return t.push("a=candidate:"),t.push(`${e.foundation} ${e.component} ${e.protocol.toUpperCase()} ${e.priority} ${e.ip} ${e.port} typ ${e.type}`),void 0!==e["rel-addr"]&&t.push(` raddr ${e["rel-addr"]} rport ${e["rel-port"]}`),t.push(` generation ${e.generation}`),t.join("")}(e))}addHeader(e,t){const i=t.join(" ");return this.add("v=0",`o=- ${e} 2 IN IP4 0.0.0.0`,"s=-","t=0 0","a=extmap-allow-mixed",`a=group:BUNDLE ${i}`,"a=ice-options:trickle","a=msid-semantic:WMS *")}addTransport(e,t){this.add(`a=ice-ufrag:${e.ufrag}`,`a=ice-pwd:${e.pwd}`,"a=ice-options:trickle");for(const t of e.fingerprints)this.add(`a=fingerprint:${t.hash} ${t.fingerprint}`,`a=setup:${t.setup}`);if(!t&&e.candidates)for(const t of e.candidates)this.addCandidate(t);return this}addSsrc(e){let t="stream",{type:i,sourceGroups:s}=e;const n=(0,a.h)(e.source);t+=n,i+=n;const o=e=>{this.add(`a=ssrc:${e} cname:${t}`,`a=ssrc:${e} msid:${t} ${i}`,`a=ssrc:${e} mslabel:${t}`,`a=ssrc:${e} label:${i}`)};return(()=>{this.add(`a=msid:${t} ${i}`)})(),(null==s?void 0:s.length)?s.forEach((e=>{if(e.sources.length){const t=e.sources.map(a.h);this.add(`a=ssrc-group:${e.semantics} ${t.join(" ")}`),t.forEach(o)}})):o(n),this}addSsrcEntry(e,t,i){const s=(...e)=>this.add(...e),{type:n,mid:a,direction:o,port:c}=e,h=t.transport,u="application"===n,p=u?void 0:t[n],f="inactive"===o;if(e.shouldBeSkipped(i))return s(`m=${r(n)} 0 ${d(n)} 0`,"c=IN IP4 0.0.0.0","a=inactive",`a=mid:${a}`);const m=u?[{id:5e3}]:p["payload-types"],g=m.map((e=>e.id));s(l(n,c,g),"c=IN IP4 0.0.0.0",`a=rtcp:${c} IN IP4 0.0.0.0`),h["rtcp-mux"]&&s("a=rtcp-mux"),s(`a=mid:${a}`);let v=o;if("sendrecv"===o||!i||f||u||(v="sendonly"===o?"recvonly":"sendonly"),s(`a=${v}`),this.addTransport(h),u)s(`a=sctpmap:${m[0].id} webrtc-datachannel 256`);else{const e=p["rtp-hdrexts"];(null==e?void 0:e.length)&&e.forEach((e=>{s(`a=extmap:${e.id} ${e.uri}`)})),m.forEach((e=>{s(`a=rtpmap:${e.id} ${e.name}/${e.clockrate}${e.channels&&e.channels>1?`/${e.channels}`:""}`);const t=e.parameters;if(Array.isArray(t))t.length&&console.error("parameters is array???",t);else if(t&&Object.keys(t).length){const i=[];for(const e in t)i.push(`${e}=${t[e]}`);s(`a=fmtp:${e.id} ${i.join(";")}`)}const i=e["rtcp-fbs"];(null==i?void 0:i.length)&&i.forEach((t=>{s(`a=rtcp-fb:${e.id} ${t.type}${t.subtype?" "+t.subtype:""}`)}))}))}return!e.source||"sendonly"!==v&&"sendrecv"!==v||this.addSsrc(e),this}addConference(e){const{conference:t,entries:i,bundle:n,isAnswer:a}=e;this.addHeader(t.sessionId,n),s.IS_FIREFOX&&this.addTransport(t.transport);for(const e of i)this.addSsrcEntry((a?e.recvEntry||e.sendEntry:e.sendEntry||e.recvEntry)||e,t,a);return this}static fromConference(e){return(new c).addConference(e).finalize()}}},9585:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(3241),n=i(5003),a=i(1677),o=i(49),r=i(4373),d=i(8957);class l{constructor(e,t){const i=this.streamSource=e.createMediaStreamSource(t),s=this.analyser=e.createAnalyser();this.gain=e.createGain(),s.minDecibels=-100,s.maxDecibels=-30,s.smoothingTimeConstant=.05,s.fftSize=1024,i.connect(s)}}class c{constructor(e){this.interval=e,this.getAmplitude=e=>{const{streamAnalyser:t,stream:i,track:s,source:n,type:a}=e,o=t.analyser;if(!o)return;const r=new Uint8Array(o.frequencyBinCount);return o.getByteFrequencyData(r),{type:a,source:n,stream:i,track:s,value:(0,d.UN)(r)}},this.analyse=()=>{const e=this.counter%3==0,t=(e?this.items:this.items.filter((e=>"input"===e.type))).filter((e=>"audio"===e.kind)).slice(0,a.KM).map(this.getAmplitude);++this.counter>=1e3&&(this.counter=0),c.ANALYSER_LISTENER.dispatchEvent("amplitude",{amplitudes:t,type:e?"all":"input"})},this.context=new(window.AudioContext||window.webkitAudioContext),this.items=[],this.outputStream=new MediaStream,this.inputStream=new MediaStream,this.counter=0,this.log=(0,n.kg)("SM"),this.direction="sendonly",this.canCreateConferenceEntry=!0,this.types=["audio","video"]}addStream(e,t){e.getTracks().forEach((i=>{this.addTrack(e,i,t)}))}addTrack(e,t,i){this.log("addTrack",i,t,e);const{context:s,items:n,inputStream:a,outputStream:o}=this,r=t.kind,d=c.getSource(e,i);switch(i){case"input":a?a.addTrack(t):this.inputStream=e;break;case"output":for(let e=0;e{this.removeTrack(t)}),{once:!0}),this.items.push(e)}hasInputTrackKind(e){return this.items.find((t=>"input"===t.type&&t.kind===e))}static getSource(e,t){return"input"===t?e.source||e.id:""+(0,d.Fk)(+e.id.substring(6))}removeTrack(e){this.log("removeTrack",e);const{items:t}=this;let i=!1;for(let s=0,n=t.length;!i&&s[e,n])),o=t.getTracks();for(const[t,n]of a){let a=e.findEntry((e=>e.direction===i&&e.type===t));if(!a){if(!s)continue;a=e.createEntry(t)}let{transceiver:d}=a;d||(d=a.createTransceiver(e.connection,n)),a.direction!==d.direction&&(d.direction=a.direction);const l=(0,r.pl)(t),c=o.findIndex((e=>e.kind===l)),h=-1!==c?o.splice(c,1)[0]:void 0,u=d.sender;u.track!==h&&u.replaceTrack(h).catch((e=>{this.log.error(e)}))}}stop(){try{this.inputStream.getTracks().concat(this.outputStream.getTracks()).forEach((e=>{(0,o.Z)(e)}))}catch(e){this.log.error(e)}}}c.ANALYSER_LISTENER=new s.Z},630:(e,t,i)=>{"use strict";i.d(t,{Z:()=>s});class s{constructor(e="\r\n"){this.joiner=e,this.lines=[],this.newLine=[]}add(...e){return this.lines.push(...e),this}push(e){return this.newLine.push(e),this}addJoined(e=""){return this.add(this.newLine.join(e)),this.newLine=[],this}join(){return this.lines.join(this.joiner)}finalize(){return this.join()+this.joiner}}},8957:(e,t,i)=>{"use strict";function s(e){return e<<0}function n(e){return e>>>0}function a(e,t=3){if(!e)return 0;const{length:i}=e;let s=0;for(let t=0;ts,UN:()=>a,h:()=>n})},3785:(e,t,i)=>{"use strict";i.d(t,{Z:()=>o});var s=i(7197),n=i(1229);const a=new RegExp(`(^${n.Z})`);function o(e,t=!1){const i=(e||"").trim().split(" ");if(!i[0])return{text:"",entities:[]};const n=[],o=i[0].match(a),r=(null==o?void 0:o[0])||i[0][0];o&&n.push((0,s.Z)(r));const d=i.length;if(t||1===d)return{text:r,entities:n};const l=i[d-1].match(a),c=(null==l?void 0:l[0])||i[d-1][0];return l&&n.push(Object.assign(Object.assign({},(0,s.Z)(c)),{offset:r.length})),{text:r+c,entities:n}}},7197:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(671);function n(e){return{_:"messageEntityEmoji",offset:0,length:e.length,unicode:(0,s.w1)(e).join("-").replace(/-?fe0f/g,"")}}},1171:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(2423);function n(e){return e?e.match(s.E):null}},2521:(e,t,i)=>{"use strict";function s(e){return e.target="_blank",e.rel="noopener noreferrer",e}i.d(t,{Z:()=>s})},5798:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(8115),n=i(3785);function a(e,t){const{text:i,entities:a}=(0,n.Z)(e,t);return(0,s.Z)(i,void 0,a)}},3066:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(3512),n=i(5400);function a(e,t={}){if(!e)return(0,n.ZP)("");let i=t.entities;return i&&!s.Z.premium&&t.wrappingForPeerId!==s.Z.myId&&(i=i.filter((e=>"messageEntityCustomEmoji"!==e._))),(0,n.ZP)(e,Object.assign(Object.assign({},t),{entities:i,noLinks:!0,wrappingDraft:!0,passEntities:{messageEntityTextUrl:!0,messageEntityMentionName:!0}}))}},8115:(e,t,i)=>{"use strict";i.d(t,{Z:()=>a});var s=i(6535),n=i(5400);function a(e,t=!1,i){return e?(null!=i||(i=(0,s.Z)(e).filter((e=>"messageEntityEmoji"===e._))),(0,n.ZP)(e,{entities:i,wrappingDraft:t})):(0,n.ZP)("")}},5400:(e,t,i)=>{"use strict";i.d(t,{LD:()=>_,KZ:()=>F,SZ:()=>G,ZP:()=>j,Cx:()=>K,Hc:()=>V});var s=i(2423),n=i(3447),a=i(9976),o=i(8479),r=i(4056),d=i(1379),l=i(6535),c=i(2521),h=i(3591);const u={};a.Z&&(u[""]=!0,[["14","🫱🏻"]].forEach((([e,t])=>{u[e]=function(e){const t=document.createElement("span");t.classList.add("emoji"),document.body.appendChild(t),t.innerText=e;const i=t.offsetWidth;t.innerText="❤️";const s=t.offsetWidth;return document.body.removeChild(t),Math.abs(i-s)<5}(t)})));const p=u;var f=i(2738),m=i(3512),g=i(4755),v=i(3541),b=i(3772),y=i(5814),w=i(2153),S=i(393),C=i(8938),L=i(319),E=i(8497),I=i(4881),M=i(3624),P=i(5565),Z=i(6854),k=i(645),T=i(4497);const x=new ResizeObserver((e=>{for(const t of e)t.target.parentElement.setDimensionsFromRect(t.contentRect)})),A=new w.Z;class _ extends HTMLElement{constructor(){super(),this.paused=!0,this.classList.add("custom-emoji")}get docId(){return this.dataset.docId}static create(e){const t=new _;return t.dataset.docId=""+e,t}get isConnected(){var e,t;return null!==(t=null===(e=this.placeholder)||void 0===e?void 0:e.isConnected)&&void 0!==t?t:super.isConnected}connectedCallback(){this.player&&y.Z.addAnimation(this,this.renderer.animationGroup,void 0,!0)}disconnectedCallback(){var e;!this.isConnected&&(null===(e=this.renderer)||void 0===e?void 0:e.isSelectable)&&this.clear()}destroy(){this.clear()}clear(e=!0){var t;if(this.clean)return;this.clean=!0,this.pause();const{syncedPlayer:i}=this;if(i&&i.pausedElements.delete(this),null===(t=this.middlewareHelper)||void 0===t||t.clean(),this.renderer){const t=this.renderer.customEmojis.get(this.docId);(null==t?void 0:t.delete(this))&&!t.size&&(this.renderer.customEmojis.delete(this.docId),this.renderer.playersSynced.delete(t)),e&&(this.renderer.isSelectable?this.replaceChildren(G(!0)):this.replaceChildren())}this.player&&y.Z.removeAnimationByPlayer(this),A&&A.delete({div:this}),this.elements=this.renderer=this.player=this.syncedPlayer=void 0}pause(){this.paused||(this.paused=!0,this.player instanceof HTMLVideoElement&&!this.syncedPlayer&&(this.renderer.lastPausedVideo=this.player,this.player.pause()),this.syncedPlayer&&!this.syncedPlayer.pausedElements.has(this)&&(this.syncedPlayer.pausedElements.add(this),this.syncedPlayer.player&&this.syncedPlayer.pausedElements.size===this.syncedPlayer.middlewares.size&&this.syncedPlayer.player.pause()))}play(){var e;this.paused&&(this.paused=!1,this.player instanceof HTMLVideoElement&&(this.player.currentTime=(null===(e=this.renderer.lastPausedVideo)||void 0===e?void 0:e.currentTime)||this.player.currentTime,this.player.play().catch(L.Z)),this.syncedPlayer&&this.syncedPlayer.pausedElements.has(this)&&(this.syncedPlayer.pausedElements.delete(this),this.syncedPlayer.pausedElements.size!==this.syncedPlayer.middlewares.size&&this.player.play()))}remove(){this.clear()}get autoplay(){return!0}}class F extends HTMLElement{constructor(){super(),this.classList.add("custom-emoji-renderer"),this.canvas=document.createElement("canvas"),this.canvas.classList.add("custom-emoji-canvas"),this.context=this.canvas.getContext("2d"),this.append(this.canvas),this.playersSynced=new Map,this.clearedElements=new WeakSet,this.customEmojis=new Map,this.animationGroup="EMOJI",this.isCanvasClean=!1}connectedCallback(){B.has(this)||(x.observe(this.canvas),B.add(this),this.connectedCallback=void 0)}disconnectedCallback(){var e;!this.isConnected&&this.auto&&(null===(e=this.destroy)||void 0===e||e.call(this),this.disconnectedCallback=void 0)}destroy(){var e;x.unobserve(this.canvas),this.customEmojis.forEach((e=>{e.forEach((e=>{e.clear()}))})),B.delete(this),this.playersSynced.clear(),null===(e=this.middlewareHelper)||void 0===e||e.clean(),this.customEmojis.clear(),this.destroy=this.lastPausedVideo=void 0}getOffsets(e=new Map){if(!this.playersSynced.size)return e;const t=(0,E.Z)(this,"scrollable")||this.offsetParent;if(!t)return e;const i=t.getBoundingClientRect(),s=this.getBoundingClientRect();for(const n of this.playersSynced.keys()){const a=Array.from(n),o=this.isSelectable?a.map((e=>e.placeholder)):a,{visible:r}=(0,I.Z)({overflowElement:t,overflowRect:i,elements:o,extraSize:2.5*this.size.height}),d=r.map((({rect:e})=>({top:e.top-s.top,left:e.left-s.left,width:e.width})));d.length&&e.set(n,d)}return e}clearCanvas(){if(this.isCanvasClean)return;const{context:e,canvas:t}=this;e.clearRect(0,0,t.width,t.height),this.isCanvasClean=!0}render(e){const{context:t,canvas:i,isDimensionsSet:s}=this;s||this.setDimensionsFromRect(void 0,!1),this.isCanvasClean=!1;const{width:n,height:a,dpr:o}=i;for(const[i,s]of e){const e=this.playersSynced.get(i),a=O.get(e)||(e instanceof HTMLVideoElement?e:void 0);if(!a)continue;const r=a instanceof ImageData;let d,l;e instanceof HTMLVideoElement?(d=this.size.width*o,l=this.size.height*o):(d=a.width,l=a.height);const c=Math.round(s[0].width*o);c!==d&&(d=c,l=c);const h=n-d;this.clearedElements.has(i)||this.isSelectable||(this.isSelectable?i.forEach((e=>{var t;null!==(t=e.lastChildWas)&&void 0!==t||(e.lastChildWas=e.lastChild),(0,P.Z)(e,e.firstChild)})):i.forEach((e=>{e.replaceChildren()})),this.clearedElements.add(i)),s.forEach((({top:e,left:i})=>{e=Math.round(e*o),(i=Math.round(i*o))<0||i>h||(r?t.putImageData(a,i,e):t.drawImage(a,i,e,d,l))}))}}checkForAnyFrame(){for(const e of this.playersSynced.values())if(O.has(e)||e instanceof HTMLVideoElement)return!0;return!1}remove(){super.remove()}setDimensionsFromRect(e=this.lastRect,t=!0){const{canvas:i}=this,{dpr:s}=i;if(this.lastRect!==e&&(this.lastRect=e),!e||!s||this.ignoreSettingDimensions)return;const{width:n,height:a}=e,o=Math.floor(Math.round(n*s)),r=Math.floor(Math.round(a*s));i.width===o&&i.height===r||(i.width=o,i.height=r,this.isDimensionsSet=!0,this.isCanvasClean=!0,(this.forceRenderAfterSize||this.isSelectable&&t)&&(this.forceRenderAfterSize=void 0,this.forceRender()))}forceRender(){this.isDimensionsSet&&(U(new Set([this]))||this.clearCanvas())}add(e,t,i,s){const n=this;if(e.forEach(((t,i)=>{let s=this.customEmojis.get(i);s?this.clearedElements.delete(s):this.customEmojis.set(i,s=new Set);for(const e of t)s.has(e)?t.delete(e):(e.clean=!1,e.renderer=n,e.elements=s,e.middlewareHelper=this.middlewareHelper.get().create(),s.add(e),e.lastChildWas&&!e.lastChildWas.parentNode&&e.append(e.lastChildWas));t.size||e.delete(i)})),!e.size)return;const a=!(t||!1===t||!A),o=Array.from(e.keys()),r=m.Z.managers,d=this.middlewareHelper.get(),l=this.size;return r.appEmojiManager.getCachedCustomEmojiDocuments(o).then((c=>{if(d&&!d())return;const h=[],u=(o,c)=>{const h=o.id,u=e.get(h),p=n.customEmojis.get(h),f=2===o.sticker,m="video/webm"===o.mime_type&&!S.Z,g=(f||3===o.sticker&&this.isSelectable)&&!i&&!m,w=[],E=Array.from(u),I=(0,v.ZP)({div:E,doc:o,width:l.width,height:l.height,loop:!0,play:D,managers:r,isCustomEmoji:!0,group:"none",loadPromises:w,middleware:d,exportLoad:a||!1===t?2:1,needFadeIn:!1,loadStickerMiddleware:g&&d?d.create().get((()=>!!P.middlewares.size)):void 0,static:m,onlyThumb:i,withThumb:null!=s?s:!n.clearedElements.has(p)&&void 0,syncedVideo:this.isSelectable});c&&I.then((()=>c.push(...w)));const M={elements:u};if(1===o.sticker||i||m)return this.isSelectable&&(M.onRender=()=>Promise.all(w).then((()=>{d&&!d()||E.forEach((e=>{const{placeholder:t}=e;t.src=e.firstElementChild.src}))}))),I.then((e=>Object.assign(Object.assign({},e),M)));let P;M.onRender=e=>Promise.all(w).then((()=>{var t;if(d&&!d()||!o.animated)return;const i=Array.isArray(e)?e:[e],s=Array.isArray(i)?i[0]:i;if((0,C.Z)(s),E.forEach(((e,t)=>{const s=i[t]||i[0];e.player=s,P&&(e.syncedPlayer=P,e.paused?e.syncedPlayer.pausedElements.add(e):s.paused&&s.play()),e.isConnected&&y.Z.addAnimation(e,e.renderer.animationGroup,void 0,!0)})),(s instanceof b.Z||s instanceof HTMLVideoElement&&this.isSelectable)&&(P.player=s,n.playersSynced.set(p,s)),s instanceof b.Z?(s.group=n.animationGroup,null!==(t=s.overrideRender)&&void 0!==t||(s.overrideRender=e=>{O.set(s,e)})):HTMLVideoElement,g){const e=(0,b.a)(this.size.width,this.size.height);n.canvas.dpr=e,H()}}));const Z=[h,l.width,l.height].join("-");if(g){P=N.get(Z),P||(P={player:void 0,middlewares:new Set,pausedElements:new Set,key:Z},N.set(Z,P));for(const e of u){const t=e.middlewareHelper.get();P.middlewares.add(t),t.onClean((()=>{var i,s;if(P.middlewares.delete(t),!P.middlewares.size){if(P.player){const t=O.get(P.player);if(t&&(null===(s=(i=t).close)||void 0===s||s.call(i),O.delete(P.player)),O.delete(P.player),P.player instanceof b.Z)P.player.overrideRender=L.Z,P.player.remove();else if(P.player instanceof HTMLVideoElement){const t=k.Z.generateName(""+e.docId,0,0,void 0,void 0);delete v._i[t]}P.player=void 0}N.get(P.key)===P&&N.delete(P.key)&&!N.size&&z()}}))}}return I.then((e=>Object.assign(Object.assign({},e),M)))},p=[],f=c.map(((e,t)=>{if(e)return u(e,h);p.push(o[t])})).filter(Boolean),m=p.length?r.appEmojiManager.getCustomEmojiDocuments(p).then((e=>d&&!d()?[]:e.filter(Boolean).map((e=>u(e))))):Promise.resolve([]),g=e=>Promise.all(e).then((e=>{const t=e.map((({load:e,onRender:t,elements:i})=>{if(!e)return;const s=()=>e().then(t);if(!a)return s();i.forEach((e=>{A.push({div:e,load:()=>(i.forEach((e=>{A.delete({div:e})})),s())})}))}));return Promise.all(t)})),w=()=>{if(d&&!d())return;const e=g(f),t=m.then((e=>g(e)));return Promise.all([e,t])};return t?t.push({div:n.canvas,load:w}):w(),Promise.all(f).then((()=>Promise.all(h))).then((()=>{}))}))}static create(e){const t=new F;t.animationGroup=e.animationGroup,t.size=e.customEmojiSize||g.Z.active.customEmoji,t.isSelectable=e.isSelectable,e.wrappingDraft&&(t.contentEditable="false",t.style.height="inherit");let i=e.middleware;return i?(t.middlewareHelper=i.create(),i=t.middlewareHelper.get(),i.onDestroy((()=>{var e;null===(e=t.destroy)||void 0===e||e.call(t)}))):(t.auto=!0,t.middlewareHelper=(0,M.k)()),t}}const D=!0;let R;const B=new Set,N=new Map,O=new Map,U=(e=B)=>{const t=Array.from(e).filter((e=>e.isConnected&&e.checkForAnyFrame()&&!e.ignoreSettingDimensions));if(!t.length)return!1;const i=t.map((e=>{const t=[...e.playersSynced.values()].reduce(((e,t)=>e+ +!!t.paused),0);if(e.playersSynced.size===t)return;const i=e.getOffsets();return i.size?[e,i]:void 0})).filter(Boolean);for(const[e]of i)e.clearCanvas();for(const[e,t]of i)e.render(t);return!0},H=()=>{R||(R=window.setInterval(U,16.666666666666668),U())},z=()=>{R&&(clearInterval(R),R=void 0)};function j(e,t={}){var i,u,m,g,v,b,y,w;const S=document.createDocumentFragment();if(!e)return S;const C=null!==(i=t.nasty)&&void 0!==i?i:t.nasty={i:0,usedLength:0,text:e},L=(e,i)=>{const s=document.createElement("span");return t.wrappingDraft&&(s.contentEditable="false"),s.classList.add("input-something"),s.append(e),(D||S).append(s),e.classList.add("input-selectable"),!i&&e.append(G(!0)),I.add(s),s};t.isSelectable||(t.isSelectable=t.wrappingDraft);const E=null!==(u=t.customEmojis)&&void 0!==u?u:t.customEmojis=new Map,I=null!==(m=t.customWraps)&&void 0!==m?m:t.customWraps=new Set,M=null!==(g=t.entities)&&void 0!==g?g:t.entities=(0,l.Z)(C.text),P=null!==(v=t.passEntities)&&void 0!==v?v:t.passEntities={},Z=null!==(b=t.contextSite)&&void 0!==b?b:t.contextSite="Telegram",k="Telegram"!==Z,x=C.text.length,A=M.length;let D;for(;C.i=x){if("messageEntityCaret"!==e._)continue}else e.offset+e.length>x&&(e=(0,o.Z)(e),e.length=x-e.offset);e.length&&(C.lastEntity=e);let i=M[C.i+1];const l=e.offset,u=l+e.length,m=Math.min(u,null!==(y=null==i?void 0:i.offset)&&void 0!==y?y:65535),g=C.text.slice(l,u);let v=C.text.slice(l,m);C.usedLengthv.length&&b?b:S,t.voodoo)return S}var R;if(C.lastEntity&&(C.usedLength=C.lastEntity.offset+C.lastEntity.length),C.usedLength{const t=document.createElement("span");return t.classList.add(e?"input-filler2":"input-filler"),t.textContent=Z.Z,t};function V(e){var t;if((null==e?void 0:e.textContent)!==Z.Z||"false"===(null===(t=null==e?void 0:e.getAttribute)||void 0===t?void 0:t.call(e,"contenteditable"))){if(!e||e.textContent!==Z.Z||e.firstElementChild)return 2;if(e.nodeType===e.ELEMENT_NODE)return 1}return 0}function K(e){const t=(e,t,i)=>{const s=V(t);2===s?e[i](G()):1===s&&t.appendChild(document.createTextNode(Z.Z))};for(const i of e){const{previousSibling:e,nextSibling:s}=i;t(i,e,"before"),t(i,s,"after")}}window.wrapRichText=j},4497:(e,t,i)=>{"use strict";i.d(t,{Z:()=>n});var s=i(3591);function n(e){const{url:t,onclick:i}=(0,s.Z)(e),n=document.createElement("a");return n.href=t,i&&n.setAttribute("onclick",`${i}(this)`),n}},1447:(e,t,i)=>{"use strict";i.d(t,{Z:()=>v});var s=i(5814),n=i(410),a=i(5418),o=i(5003),r=i(3772),d=i(7328),l=i(3241);class c extends l.Z{constructor(e){super(),this.worker=e,this.worker.onerror=e=>{try{this.dispatchEvent("workerError",e),this.cleanup(),this.terminate()}catch(e){}},this.worker.onmessage=e=>{this.dispatchEvent(e.data.queryMethodListener,...e.data.queryMethodArguments)}}postMessage(e){this.worker.postMessage(e)}terminate(){this.worker.terminate()}sendQuery(e,t){this.worker.postMessage({queryMethod:e.shift(),queryMethodArguments:e},d.Z?t:void 0)}}var h=i(8975),u=i(3855);const p="undefined"!=typeof WebAssembly;var f=i(5471),m=i(4159);const g=new class{constructor(){this.loadPromise=p?void 0:Promise.reject(),this.loaded=!1,this.workersLimit=m.Z.threads,this.players={},this.playersByCacheName={},this.workers=[],this.curWorkerNum=0,this.log=(0,o.kg)("LOTTIE",o.v9.Error),this.onPlayerLoaded=(e,t,i)=>{const s=this.players[e];s?(this.log.debug("onPlayerLoaded"),s.onLoad(t,i)):this.log.warn("onPlayerLoaded on destroyed player:",e,t)},this.onFrame=(e,t,i)=>{const s=this.players[e];s?(void 0!==s.clamped&&i instanceof Uint8ClampedArray&&(s.clamped=i),s.renderFrame(i,t)):this.log.warn("onFrame on destroyed player:",e,t)},this.onPlayerError=(e,t)=>{const i=this.players[e];i&&s.Z.getAnimations(i.el[0]).forEach((e=>{s.Z.removeAnimation(e)}))}}getAnimation(e){for(const t in this.players)if(this.players[t].el.includes(e))return this.players[t];return null}setLoop(e){for(const t in this.players){const i=this.players[t];i.loop=e,i.autoplay=i._autoplay}}loadLottieWorkers(){return this.loadPromise?this.loadPromise:this.loadPromise=new Promise(((e,t)=>{let s=this.workersLimit;for(let n=0;n{this.log("worker #"+n+" ready"),o.addEventListener("frame",this.onFrame),o.addEventListener("loaded",this.onPlayerLoaded),o.addEventListener("error",this.onPlayerError),--s,s||(this.log("workers ready"),e(),this.loaded=!0)}),{once:!0}),o.addEventListener("workerError",(e=>{t("rlottie load error: "+e.message),this.loaded=!1}),{once:!0})}}))}makeAssetUrl(e){return"assets/tgs/"+e+".json"}loadAnimationAsAsset(e,t){return this.loadAnimationFromURL(e,this.makeAssetUrl(t))}loadAnimationDataFromURL(e){return p?(this.loadLottieWorkers(),fetch(e).then((e=>e.headers&&"application/octet-stream"!==e.headers.get("content-type")?e.blob():e.arrayBuffer().then((e=>u.Z.invokeCrypto("gzipUncompress",e))).then((e=>(0,h.Z)(e,"")))))):this.loadPromise}loadAnimationFromURLManually(e){const t=this.makeAssetUrl(e);return this.loadAnimationDataFromURL(t).then((e=>i=>this.loadAnimationFromURLNext(e,i,t)))}loadAnimationFromURL(e,t){return this.loadAnimationDataFromURL(t).then((i=>this.loadAnimationFromURLNext(i,e,t)))}loadAnimationFromURLNext(e,t,i){const s=Object.assign(t,{animationData:e,needUpscale:!0});return s.name||(s.name=i),this.loadAnimationWorker(s)}waitForFirstFrame(e){return Promise.race([new Promise((t=>{e.addEventListener("firstFrame",t,{once:!0})})),(0,a.Z)(2500)]).then((()=>e))}loadAnimationWorker(e,t=e.group||"",i){return n=this,a=void 0,d=function*(){if(!p)return this.loadPromise;if(this.loaded||(yield this.loadLottieWorkers()),i&&!i())throw(0,f.Z)("MIDDLEWARE");if(e.sync){const t=r.Z.CACHE.generateName(e.name,e.width,e.height,e.color,e.toneIndex),i=this.playersByCacheName[t];if(null==i?void 0:i.size)return Promise.resolve(i.entries().next().value[0])}const n=Array.isArray(e.container)?e.container:[e.container];if(e.width&&e.height||(e.width=parseInt(n[0].style.width),e.height=parseInt(n[0].style.height)),!e.width||!e.height)throw new Error("No size for sticker!");e.group=t;const a=this.initPlayer(n,e);return s.Z.addAnimation(a,t),a},new((o=void 0)||(o=Promise))((function(e,t){function i(e){try{r(d.next(e))}catch(e){t(e)}}function s(e){try{r(d.throw(e))}catch(e){t(e)}}function r(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(i,s)}r((d=d.apply(n,a||[])).next())}));var n,a,o,d}onDestroy(e){delete this.players[e]}destroyWorkers(){p&&(this.workers.forEach(((e,t)=>{e.terminate(),this.log("worker #"+t+" terminated")})),this.log("workers destroyed"),this.workers.length=0,this.curWorkerNum=0,this.loaded=!1,this.loadPromise=void 0)}initPlayer(e,t){var i,s;const n=new r.Z({el:e,worker:this.workers[this.curWorkerNum++],options:t}),{reqId:a,cacheName:o}=n;this.players[a]=n;const d=o?null!==(i=(s=this.playersByCacheName)[o])&&void 0!==i?i:s[o]=new Set:void 0;return o&&d.add(n),this.curWorkerNum>=this.workers.length&&(this.curWorkerNum=0),n.addEventListener("destroy",(()=>{this.onDestroy(a),d.delete(n)&&!d.size&&delete this.playersByCacheName[o]})),n.loadFromData(t.animationData),n}};n.GO.lottieLoader=g;const v=g},3772:(e,t,i)=>{"use strict";i.d(t,{Z:()=>u,a:()=>h});var s=i(7328),n=i(8189),a=i(4762),o=i(3241),r=i(4755),d=i(3228),l=i(356),c=i(645);function h(e,t,i){let s=(0,d.Z)(window.devicePixelRatio,1,2);return s>1&&!i&&(e>90&&t>90?!a.IS_APPLE&&r.Z.isMobile&&(s=1):(e>60&&t>60||a.IS_ANDROID)&&(s=Math.max(1.5,s-1.5))),s}class u extends o.Z{constructor({el:e,worker:t,options:i}){super(!0),this.reqId=0,this.width=0,this.height=0,this.paused=!0,this.direction=1,this.speed=1,this.autoplay=!0,this.loop=!0,this.group="",this.cachingDelta=0,this.playedTimes=0,this.reqId=++u.reqId,this.el=e,this.worker=t;for(const e in i)this.hasOwnProperty(e)&&(this[e]=i[e]);let o;this._loop=this.loop,this._autoplay=this.autoplay,this.initFrame=i.initFrame,this.color=i.color,this.inverseColor=i.inverseColor,this.name=i.name,this.skipFirstFrameRendering=i.skipFirstFrameRendering,this.toneIndex=i.toneIndex,this.raw=void 0!==this.color,this.name&&(this.cacheName=u.CACHE.generateName(this.name,this.width,this.height,this.color,this.toneIndex)),void 0!==i.skipRatio?o=i.skipRatio:(a.IS_ANDROID||a.IS_APPLE_MOBILE||a.IS_APPLE&&!a.IS_SAFARI&&!n.Z)&&this.width<100&&this.height<100&&!i.needUpscale&&(o=.5),this.skipDelta=void 0!==o?1/o|0:1;const r=h(this.width,this.height,i.needUpscale);this.width=Math.round(this.width*r),this.height=Math.round(this.height*r),i.noCache||(a.IS_APPLE&&this.width>100&&this.height>100?this.cachingDelta=2:this.width<100&&this.height<100?this.cachingDelta=1/0:this.cachingDelta=4),this.canvas||(this.canvas=this.el.map((()=>{const e=document.createElement("canvas");return e.classList.add("rlottie"),e.width=this.width,e.height=this.height,e.dpr=r,e}))),this.contexts=this.canvas.map((e=>e.getContext("2d"))),l.Z&&!this.raw||(this.imageData=new ImageData(this.width,this.height),s.Z&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4))),this.name?this.cache=u.CACHE.getCache(this.cacheName):this.cache=c.M.createCache()}clearCache(){this.cachingDelta!==1/0&&(this.cacheName&&this.cache.counter>1||this.cache.clearCache())}sendQuery(e,t){this.worker.sendQuery([e.shift(),this.reqId,...e],t)}loadFromData(e){this.sendQuery(["loadFromData",e,this.width,this.height,this.toneIndex,void 0!==this.color])}play(){this.paused&&(this.paused=!1,this.setMainLoop())}pause(e=!0){this.paused||(this.paused=!0,e&&(clearTimeout(this.rafId),this.rafId=void 0))}resetCurrentFrame(){var e;return this.curFrame=null!==(e=this.initFrame)&&void 0!==e?e:1===this.direction?this.minFrame:this.maxFrame}stop(e=!0){this.pause();const t=this.resetCurrentFrame();e&&this.requestFrame(t)}restart(){this.stop(!1),this.play()}setSpeed(e){this.speed!==e&&(this.speed=e,this.paused||this.setMainLoop())}setDirection(e){this.direction!==e&&(this.direction=e,this.paused||this.setMainLoop())}remove(){this.pause(),this.sendQuery(["destroy"]),this.cacheName&&u.CACHE.releaseCache(this.cacheName),this.dispatchEvent("destroy"),this.cleanup()}applyColor(e){const[t,i,s]=this.color;for(let n=0,a=e.length;n{let n=this.cache.framesNew.get(t);if(e instanceof Uint8ClampedArray?s>0&&(n=this.canvas[0]):n=e,!n){const e=document.createElement("canvas");e.width=i.canvas.width,e.height=i.canvas.height,e.getContext("2d").putImageData(this.imageData,0,0),this.cache.framesNew.set(t,e),n=e}this.overrideRender&&this.renderedFirstFrame?this.overrideRender(n||this.imageData):n?(i.clearRect(0,0,n.width,n.height),i.drawImage(n,0,0)):i.putImageData(this.imageData,0,0),this.renderedFirstFrame||(this.renderedFirstFrame=!0)})),this.dispatchEvent("enterFrame",t)}catch(e){console.error("RLottiePlayer renderFrame error:",e,this.width,this.height),this.autoplay=!1,this.pause()}}renderFrame(e,t){if(this.cachingDelta&&(t%this.cachingDelta||!t)&&(e instanceof Uint8ClampedArray&&!this.cache.frames.has(t)?this.cache.frames.set(t,new Uint8ClampedArray(e)):l.Z&&e instanceof ImageBitmap&&!this.cache.framesNew.has(t)&&this.cache.framesNew.set(t,e)),this.frInterval){const i=Date.now()-this.frThen;if(i<0){const s=this.frInterval>-i?-i%this.frInterval:this.frInterval;return this.rafId&&clearTimeout(this.rafId),void(this.rafId=window.setTimeout((()=>{this.renderFrame2(e,t)}),s))}}this.renderFrame2(e,t)}requestFrame(e){const t=this.cache.frames.get(e),i=this.cache.framesNew.get(e);i?this.renderFrame(i,e):t?this.renderFrame(t,e):(this.clamped&&!this.clamped.length&&(this.clamped=new Uint8ClampedArray(this.width*this.height*4)),this.sendQuery(["renderFrame",e],this.clamped?[this.clamped.buffer]:void 0))}onLap(){return++this.playedTimes===this.loop&&(this.loop=!1),!!this.loop||(this.pause(!1),!1)}mainLoopForwards(){const{skipDelta:e,maxFrame:t}=this,i=this.curFrame+e>t?this.curFrame=this.loop?this.minFrame:this.maxFrame:this.curFrame+=e;return this.requestFrame(i),!(i+e>t)||this.onLap()}mainLoopBackwards(){const{skipDelta:e,minFrame:t}=this,i=this.curFrame-et?1:-1,callback:s})}playToFrame(e){this.pause();const{frame:t,speed:i,callback:s,direction:n}=e;this.setDirection(void 0===n?this.curFrame>t?-1:1:n),void 0!==i&&this.setSpeed(i);const a=[this.curFrame,t];-1===this.direction&&a.reverse(),this.loop=!1,this.setMinMax(a[0],a[1]),this.playToFrameOnFrameCallback&&this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),s&&(this.playToFrameOnFrameCallback=e=>{e===t&&(this.removeEventListener("enterFrame",this.playToFrameOnFrameCallback),s())},this.addEventListener("enterFrame",this.playToFrameOnFrameCallback)),this.play()}setColor(e,t){this.color=e,t&&this.paused&&this.renderFrame2(this.imageData.data,this.curFrame)}setInverseColor(e){this.inverseColor=e}setMinMax(e=0,t=this.frameCount-1){this.minFrame=e,this.maxFrame=t}onLoad(e,t){return i=this,s=void 0,a=function*(){this.frameCount=e,this.fps=t,this.setMinMax(),void 0!==this.initFrame&&(this.initFrame=(0,d.Z)(this.initFrame,this.minFrame,this.maxFrame));const i=this.resetCurrentFrame();if(this.fps<60&&1!==this.skipDelta){const e=60/t;this.skipDelta=this.skipDelta/e|0}this.frInterval=1e3/this.fps/this.speed*this.skipDelta,this.frThen=Date.now()-this.frInterval,!this.skipFirstFrameRendering&&this.requestFrame(i),this.dispatchEvent("ready"),this.addEventListener("enterFrame",(()=>{this.dispatchEvent("firstFrame"),this.canvas[0].parentNode||!this.el||this.overrideRender||this.el.forEach(((e,t)=>e.append(this.canvas[t]))),this.frameListener=()=>{if(this.paused||!this.currentMethod)return;const e=Date.now();this.frThen=e+this.frInterval,this.currentMethod()||this.loop||!this.autoplay||(this.autoplay=!1)},this.addEventListener("enterFrame",this.frameListener),"none"===this.group&&this.autoplay&&this.play()}),{once:!0})},new((n=void 0)||(n=Promise))((function(e,t){function o(e){try{d(a.next(e))}catch(e){t(e)}}function r(e){try{d(a.throw(e))}catch(e){t(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof n?i:new n((function(e){e(i)}))).then(o,r)}d((a=a.apply(i,s||[])).next())}));var i,s,n,a}}u.CACHE=c.Z,u.reqId=0},4874:(e,t,i)=>{"use strict";i.d(t,{Z:()=>c});var s=i(1447),n=i(6008),a=i(410),o=i(4789),r=i(2648);const d=new class{constructor(){this.pageId=-1,this.pagesDiv=document.getElementById("auth-pages"),this.scrollableDiv=this.pagesDiv.querySelector(".scrollable"),this.selectTab=(0,n.X)(null,this.scrollableDiv.querySelector(".tabs-container"),null,(()=>{var e;(null===(e=this.page)||void 0===e?void 0:e.onShown)&&this.page.onShown()}))}setPage(e){if(e.isAuthPage){this.pagesDiv.style.display="";const t=(0,r.Z)(e.pageEl);if(this.pageId===t)return;this.selectTab(t),-1!==this.pageId&&t>1&&s.Z.loadLottieWorkers(),this.pageId=t,this.scrollableDiv&&(0,o.Z)({container:this.scrollableDiv,element:this.scrollableDiv.firstElementChild,position:"start"})}else this.pagesDiv.style.display="none",e.pageEl.style.display="",this.pageId=-1;this.page=e}};a.GO.pagesManager=d;const l=d;class c{constructor(e,t,i,s,n){this.isAuthPage=t,this.onFirstMount=i,this.onMount=s,this.onShown=n,this.installed=!1,this.pageEl=document.body.querySelector("."+e)}mount(...e){return t=this,i=void 0,n=function*(){if(this.onMount){const t=this.onMount(...e);t instanceof Promise&&(yield t)}if(!this.installed){if(this.onFirstMount)try{const t=this.onFirstMount(...e);t instanceof Promise&&(yield t)}catch(e){console.error("PAGE MOUNT ERROR:",e)}this.installed=!0}l.setPage(this)},new((s=void 0)||(s=Promise))((function(e,a){function o(e){try{d(n.next(e))}catch(e){a(e)}}function r(e){try{d(n.throw(e))}catch(e){a(e)}}function d(t){var i;t.done?e(t.value):(i=t.value,i instanceof s?i:new s((function(e){e(i)}))).then(o,r)}d((n=n.apply(t,i||[])).next())}));var t,i,s,n}}},671:(e,t,i)=>{"use strict";function s(e){return r(o(e)).join("-")}i.d(t,{Ml:()=>c,N0:()=>s,tB:()=>d,w1:()=>r,zu:()=>h});const n=/\uFE0F/g,a=String.fromCharCode(8205),o=e=>e.indexOf(a)<0?e.replace(n,""):e;function r(e){const t=[];let i=0,s=0,n=0;for(;n55296&&i<=56319?s=i:t.push(i.toString(16));return t.length&&2===t[0].length&&(t[0]="00"+t[0]),t}function d(e){const t=e.match(/[\uDFFB-\uDFFF]/);return t?5-(57343-t[0].charCodeAt(0)):0}const l=new Map([["FT","🏴‍☠"]]);function c(e){var t;return null!==(t=l.get(e))&&void 0!==t?t:String.fromCharCode(55356,56741+e.charCodeAt(0),55356,56741+e.charCodeAt(1))}function h(e){return e.split("-").reduce(((e,t)=>e+String.fromCodePoint(parseInt(t,16))),"")}},4329:function(e){"undefined"!=typeof self&&self,e.exports=function(e){var t={};function i(s){if(t[s])return t[s].exports;var n=t[s]={i:s,l:!1,exports:{}};return e[s].call(n.exports,n,n.exports,i),n.l=!0,n.exports}return i.m=e,i.c=t,i.d=function(e,t,s){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(i.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(s,n,function(t){return e[t]}.bind(null,n));return s},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=0)}([function(e,t,i){"use strict";(function(t){var i=t.AudioContext||t.webkitAudioContext,s=function(e){if(!s.isRecordingSupported())throw new Error("Recording is not supported in this browser");e||(e={}),this.state="inactive",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:"encoderWorker.min.js",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};s.isRecordingSupported=function(){return i&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},s.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},s.prototype.encodeBuffers=function(e){if("recording"===this.state){for(var t=[],i=0;i{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},s.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then((e=>(this.stream=e,this.audioContext.createMediaStreamSource(e))))},s.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},s.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise(((t,i)=>{var s=i=>{switch(i.data.message){case"ready":t();break;case"page":this.encodedSamplePosition=i.data.samplePosition,e(i.data.page);break;case"done":this.encoder.removeEventListener("message",s),this.finish()}};this.encoder.addEventListener("message",s),this.encoder.postMessage(Object.assign({command:"init",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))}))},s.prototype.pause=function(e){if("recording"===this.state){if(this.state="paused",e&&this.config.streamPages){var t=this.encoder;return new Promise(((e,i)=>{var s=i=>{"flushed"===i.data.message&&(t.removeEventListener("message",s),this.onpause(),e())};t.addEventListener("message",s),t.postMessage({command:"flush"})}))}return this.onpause(),Promise.resolve()}},s.prototype.resume=function(){"paused"===this.state&&(this.state="recording",this.onresume())},s.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},s.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},s.prototype.start=function(e){if("inactive"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then((()=>this.initSourceNode(e))).then((e=>{this.sourceNode=e,this.state="recording",this.onstart(),this.encoder.postMessage({command:"getHeaderPages"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)}))},s.prototype.stop=function(){if("inactive"!==this.state){this.state="inactive",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise((t=>{var i=s=>{"done"===s.data.message&&(e.removeEventListener("message",i),t())};e.addEventListener("message",i),e.postMessage({command:"done"}),this.config.reuseWorker||e.postMessage({command:"close"})}))}return Promise.resolve()},s.prototype.destroyWorker=function(){"inactive"===this.state&&this.encoder&&(this.encoder.postMessage({command:"close"}),delete this.encoder)},s.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},s.prototype.streamPage=function(e){this.ondataavailable(e)},s.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,i){return e.set(i,t),t+i.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},s.prototype.ondataavailable=function(){},s.prototype.onpause=function(){},s.prototype.onresume=function(){},s.prototype.onstart=function(){},s.prototype.onstop=function(){},e.exports=s}).call(this,i(1))},function(e,t){var i;i=function(){return this}();try{i=i||new Function("return this")()}catch(e){"object"==typeof window&&(i=window)}e.exports=i}])},6802:e=>{var t=.1,i="function"==typeof Float32Array;function s(e,t){return 1-3*t+3*e}function n(e,t){return 3*t-6*e}function a(e){return 3*e}function o(e,t,i){return((s(t,i)*e+n(t,i))*e+a(t))*e}function r(e,t,i){return 3*s(t,i)*e*e+2*n(t,i)*e+a(t)}function d(e){return e}e.exports=function(e,s,n,a){if(!(0<=e&&e<=1&&0<=n&&n<=1))throw new Error("bezier x values must be in [0, 1] range");if(e===s&&n===a)return d;for(var l=i?new Float32Array(11):new Array(11),c=0;c<11;++c)l[c]=o(c*t,e,n);return function(i){return 0===i||1===i?i:o(function(i){for(var s=0,a=1;10!==a&&l[a]<=i;++a)s+=t;--a;var d=s+(i-l[a])/(l[a+1]-l[a])*t,c=r(d,e,n);return c>=.001?function(e,t,i,s){for(var n=0;n<4;++n){var a=r(t,i,s);if(0===a)return t;t-=(o(t,i,s)-e)/a}return t}(i,d,e,n):0===c?d:function(e,t,i,s,n){var a,r,d=0;do{(a=o(r=t+(i-t)/2,s,n)-e)>0?i=r:t=r}while(Math.abs(a)>1e-7&&++d<10);return r}(i,s,s+t,e,n)}(i),s,a)}}}}]); +//# sourceMappingURL=460.67f684b92b25fc4ed361.chunk.js.map \ No newline at end of file diff --git a/public/460.67f684b92b25fc4ed361.chunk.js.map b/public/460.67f684b92b25fc4ed361.chunk.js.map new file mode 100644 index 000000000..2b630b7d4 --- /dev/null +++ b/public/460.67f684b92b25fc4ed361.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"460.67f684b92b25fc4ed361.chunk.js","mappings":"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,MAAO,KAAO,MAAO,KAAO,KAAM,KAAO,KAAM,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,KAAO,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,YAAY,MAAO,OAAO,MAAO,OAAO,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,MAAO,kBAAkB,MAAO,QAAQ,MAAO,kBAAkB,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,wCAAwC,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,IAAK,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,iBAAiB,KAAM,iBAAiB,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,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","sources":["webpack://tweb/./src/components/animationIntersector.ts","webpack://tweb/./src/components/appMediaPlaybackController.ts","webpack://tweb/./src/components/appMediaViewer.ts","webpack://tweb/./src/lib/mediaPlayer.ts","webpack://tweb/./src/components/appMediaViewerBase.ts","webpack://tweb/./src/helpers/fillPropertyValue.ts","webpack://tweb/./src/components/appNavigationController.ts","webpack://tweb/./src/components/appSearch.ts","webpack://tweb/./src/components/appSearchSuper..ts","webpack://tweb/./src/helpers/dom/lockTouchScroll.ts","webpack://tweb/./src/components/appSelectPeers.ts","webpack://tweb/./src/components/audio.ts","webpack://tweb/./src/helpers/avatarListLoader.ts","webpack://tweb/./src/components/appMediaViewerAvatar.ts","webpack://tweb/./src/components/avatar.ts","webpack://tweb/./src/components/avatarEdit.ts","webpack://tweb/./src/components/button.ts","webpack://tweb/./src/components/buttonCorner.ts","webpack://tweb/./src/components/buttonIcon.ts","webpack://tweb/./src/components/buttonMenu.ts","webpack://tweb/./src/components/buttonMenuToggle.ts","webpack://tweb/./src/components/chat/gradientRenderer.ts","webpack://tweb/./src/helpers/easing/easeOutQuad.ts","webpack://tweb/./src/components/chat/selection.ts","webpack://tweb/./src/helpers/dom/getSelectedText.ts","webpack://tweb/./src/components/checkboxField.ts","webpack://tweb/./src/components/codeInputField.ts","webpack://tweb/./src/components/confirmationPopup.ts","webpack://tweb/./src/components/countryInputField.ts","webpack://tweb/./src/components/dotRenderer.ts","webpack://tweb/./src/components/editPeer.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/gifs.ts","webpack://tweb/./src/components/sidebarRight/tabs/gifs.ts","webpack://tweb/./src/components/sidebarRight/tabs/stickers.ts","webpack://tweb/./src/components/emoticonsDropdown/index.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/emoji.ts","webpack://tweb/./src/lib/richTextProcessor/wrapSingleEmoji.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat.ts","webpack://tweb/./src/components/emoticonsDropdown/tabs/stickers.ts","webpack://tweb/./src/components/generateDelimiter.ts","webpack://tweb/./src/components/generateFakeIcon.ts","webpack://tweb/./src/components/lazyLoadQueueRepeat2.ts","webpack://tweb/./src/components/gifsMasonry.ts","webpack://tweb/./src/components/horizontalMenu.ts","webpack://tweb/./src/components/inputField.ts","webpack://tweb/./src/helpers/dom/selectElementContents.ts","webpack://tweb/./src/components/inputSearch.ts","webpack://tweb/./src/components/lazyLoadQueue.ts","webpack://tweb/./src/components/lazyLoadQueueIntersector.ts","webpack://tweb/./src/components/mediaProgressLine.ts","webpack://tweb/./src/components/middleEllipsis.ts","webpack://tweb/./src/components/monkeys/password.ts","webpack://tweb/./src/components/monkeys/tracking.ts","webpack://tweb/./src/components/passwordInputField.ts","webpack://tweb/./src/components/peerProfileAvatars.ts","webpack://tweb/./src/components/peerProfile.ts","webpack://tweb/./src/components/generateTitleIcons.ts","webpack://tweb/./src/components/generateVerifiedIcon.ts","webpack://tweb/./src/components/generatePremiumIcon.ts","webpack://tweb/./src/components/peerTitle.ts","webpack://tweb/./src/components/popups/avatar.ts","webpack://tweb/./src/lib/cropper.ts","webpack://tweb/./src/components/popups/deleteDialog.ts","webpack://tweb/./src/components/popups/deleteMessages.ts","webpack://tweb/./src/components/popups/forward.ts","webpack://tweb/./src/components/popups/index.ts","webpack://tweb/./src/components/popups/limit.ts","webpack://tweb/./src/components/popups/mute.ts","webpack://tweb/./src/components/popups/peer.ts","webpack://tweb/./src/components/popups/pickUser.ts","webpack://tweb/./src/components/popups/sendNow.ts","webpack://tweb/./src/components/popups/stickers.ts","webpack://tweb/./src/components/preloader.ts","webpack://tweb/./src/components/putPhoto.ts","webpack://tweb/./src/components/wrappers/getPeerInitials.ts","webpack://tweb/./src/components/putPreloader.ts","webpack://tweb/./src/components/radioField.ts","webpack://tweb/./src/components/radioForm.ts","webpack://tweb/./src/components/rangeSelector.ts","webpack://tweb/./src/components/ripple.ts","webpack://tweb/./src/components/row.ts","webpack://tweb/./src/components/scrollable.ts","webpack://tweb/./src/components/settingSection.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newGroup.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/privacyType.ts","webpack://tweb/./src/lib/appManagers/utils/privacy/getPrivacyRulesDetails.ts","webpack://tweb/./src/components/privacySection.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/phoneNumber.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/passwordSet.ts","webpack://tweb/./src/helpers/dom/canFocus.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/emailConfirmation.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/email.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/hint.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/reEnterPassword.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/enterPassword.ts","webpack://tweb/./src/components/sidebarLeft/tabs/2fa/index.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/lastSeen.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/profilePhoto.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/forwardMessages.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/addToGroups.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/calls.ts","webpack://tweb/./src/components/sidebarLeft/tabs/activeSessions.ts","webpack://tweb/./src/components/sidebarLeft/tabs/blockedUsers.ts","webpack://tweb/./src/helpers/string/convertKeyToInputKey.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacy/voices.ts","webpack://tweb/./src/components/sidebarLeft/tabs/activeWebSessions.ts","webpack://tweb/./src/components/sidebarLeft/tabs/privacyAndSecurity.ts","webpack://tweb/./src/helpers/averageColor.ts","webpack://tweb/./src/helpers/highlightningColor.ts","webpack://tweb/./src/components/colorPicker.ts","webpack://tweb/./src/components/sidebarLeft/tabs/backgroundColor.ts","webpack://tweb/./src/components/sidebarLeft/tabs/background.ts","webpack://tweb/./src/helpers/files/requestFile.ts","webpack://tweb/./src/components/sidebarLeft/tabs/quickReaction.ts","webpack://tweb/./src/components/sidebarLeft/tabs/generalSettings.ts","webpack://tweb/./src/helpers/eachMinute.ts","webpack://tweb/./src/helpers/eachTimeout.ts","webpack://tweb/./src/components/sidebarLeft/tabs/chatFolders.ts","webpack://tweb/./src/components/sidebarLeft/tabs/notifications.ts","webpack://tweb/./src/components/sidebarLeft/tabs/language.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/photo.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/file.ts","webpack://tweb/./src/components/sidebarLeft/tabs/autoDownload/video.ts","webpack://tweb/./src/components/sidebarLeft/tabs/dataAndStorage.ts","webpack://tweb/./src/components/sidebarLeft/tabs/settings.ts","webpack://tweb/./src/components/sidebarLeft/tabs/newChannel.ts","webpack://tweb/./src/components/popups/createContact.ts","webpack://tweb/./src/components/sidebarLeft/tabs/contacts.ts","webpack://tweb/./src/components/sidebarLeft/tabs/archivedTab.ts","webpack://tweb/./src/components/sidebarLeft/tabs/peopleNearby.ts","webpack://tweb/./src/components/sidebarLeft/index.ts","webpack://tweb/./src/components/sidebarLeft/tabs/addMembers.ts","webpack://tweb/./src/components/sidebarLeft/tabs/includedChats.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editFolder.ts","webpack://tweb/./src/components/sidebarLeft/tabs/editProfile.ts","webpack://tweb/./src/components/sidebarRight/index.ts","webpack://tweb/./src/components/sidebarRight/tabs/editContact.ts","webpack://tweb/./src/components/sidebarRight/tabs/editTopic.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatType.ts","webpack://tweb/./src/components/sidebarRight/tabs/userPermissions.ts","webpack://tweb/./src/components/sidebarRight/tabs/groupPermissions.ts","webpack://tweb/./src/lib/appManagers/utils/chats/combineParticipantBannedRights.ts","webpack://tweb/./src/components/sidebarRight/tabs/chatReactions.ts","webpack://tweb/./src/components/sidebarRight/tabs/editChat.ts","webpack://tweb/./src/components/sidebarRight/tabs/sharedMedia.ts","webpack://tweb/./src/components/singleTransition.ts","webpack://tweb/./src/components/slider.ts","webpack://tweb/./src/components/sliderTab.ts","webpack://tweb/./src/components/sortedUserList.ts","webpack://tweb/./src/components/stickerViewer.ts","webpack://tweb/./src/components/stickyIntersector.ts","webpack://tweb/./src/components/swipeHandler.ts","webpack://tweb/./src/components/telInputField.ts","webpack://tweb/./src/components/toast.ts","webpack://tweb/./src/components/transition.ts","webpack://tweb/./src/lib/richTextProcessor/isUsernameValid.ts","webpack://tweb/./src/components/usernameInputField.ts","webpack://tweb/./src/components/usernamesSection.ts","webpack://tweb/./src/components/visibilityIntersector.ts","webpack://tweb/./src/components/volumeSelector.ts","webpack://tweb/./src/components/wrappers/customEmoji.ts","webpack://tweb/./src/components/wrappers/document.ts","webpack://tweb/./src/components/wrappers/formatUserPhone.ts","webpack://tweb/./src/components/wrappers/getChatMembersString.ts","webpack://tweb/./src/components/wrappers/getPeerTitle.ts","webpack://tweb/./src/components/wrappers/getUserStatusString.ts","webpack://tweb/./src/components/wrappers/mediaSpoiler.ts","webpack://tweb/./src/components/wrappers/messageActionTextNew.ts","webpack://tweb/./src/components/topicAvatar.ts","webpack://tweb/./src/components/wrappers/joinVoiceChatAnchor.ts","webpack://tweb/./src/components/wrappers/messageActionTextNewUnsafe.ts","webpack://tweb/./src/components/wrappers/messageForReply.ts","webpack://tweb/./src/components/wrappers/peerTitle.ts","webpack://tweb/./src/components/wrappers/photo.ts","webpack://tweb/./src/components/wrappers/senderToPeer.ts","webpack://tweb/./src/components/wrappers/sentTime.ts","webpack://tweb/./src/components/wrappers/sticker.ts","webpack://tweb/./src/helpers/bytes/getPathFromBytes.ts","webpack://tweb/./src/helpers/computeLockColor.ts","webpack://tweb/./src/components/wrappers/stickerAnimation.ts","webpack://tweb/./src/components/wrappers/stickerEmoji.ts","webpack://tweb/./src/components/wrappers/stickerSetThumb.ts","webpack://tweb/./src/components/wrappers/stickerToRow.ts","webpack://tweb/./src/components/wrappers/topicNameButton.ts","webpack://tweb/./src/components/wrappers/video.ts","webpack://tweb/./src/components/wrappers/webPageDescription.ts","webpack://tweb/./src/components/wrappers/webPageTitle.ts","webpack://tweb/./src/config/currencies.ts","webpack://tweb/./src/config/emoji.ts","webpack://tweb/./src/config/font.ts","webpack://tweb/./src/environment/imageBitmapSupport.ts","webpack://tweb/./src/helpers/animation.ts","webpack://tweb/./src/helpers/array/filterAsync.ts","webpack://tweb/./src/helpers/array/findAndSpliceAll.ts","webpack://tweb/./src/helpers/audioAssetPlayer.ts","webpack://tweb/./src/helpers/blob/readBlobAsDataURL.ts","webpack://tweb/./src/helpers/heavyQueue.ts","webpack://tweb/./src/helpers/blur.ts","webpack://tweb/./src/helpers/bytes/getPreviewURLFromBytes.ts","webpack://tweb/./src/helpers/bytes/bytesToDataURL.ts","webpack://tweb/./src/helpers/calcImageInBox.ts","webpack://tweb/./src/helpers/canvas/getTextWidth.ts","webpack://tweb/./src/helpers/canvas/scaleMediaElement.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/clipboard.ts","webpack://tweb/./src/helpers/contextMenuController.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/helpers/dom/anchorCopy.ts","webpack://tweb/./src/helpers/dom/attachContextMenuListener.ts","webpack://tweb/./src/helpers/dom/attachGrabListeners.ts","webpack://tweb/./src/helpers/dom/cancelSelection.ts","webpack://tweb/./src/helpers/dom/clickEvent.ts","webpack://tweb/./src/helpers/dom/controlsHover.ts","webpack://tweb/./src/helpers/dom/createContextMenu.ts","webpack://tweb/./src/helpers/dom/createStickersContextMenu.ts","webpack://tweb/./src/helpers/dom/createVideo.ts","webpack://tweb/./src/helpers/dom/customProperties.ts","webpack://tweb/./src/helpers/dom/dispatchEvent.ts","webpack://tweb/./src/helpers/dom/documentFragmentToHTML.ts","webpack://tweb/./src/helpers/dom/findUpAsChild.ts","webpack://tweb/./src/helpers/dom/findUpAttribute.ts","webpack://tweb/./src/helpers/dom/findUpTag.ts","webpack://tweb/./src/helpers/dom/fullScreen.ts","webpack://tweb/./src/helpers/dom/getCaretPosNew.ts","webpack://tweb/./src/helpers/dom/getRichElementValue.ts","webpack://tweb/./src/helpers/dom/getRichValueWithCaret.ts","webpack://tweb/./src/helpers/dom/getViewportSlice.ts","webpack://tweb/./src/helpers/dom/getVisibleRect.ts","webpack://tweb/./src/helpers/dom/handleHorizontalSwipe.ts","webpack://tweb/./src/helpers/dom/handleTabSwipe.ts","webpack://tweb/./src/helpers/dom/htmlToDocumentFragment.ts","webpack://tweb/./src/helpers/dom/htmlToSpan.ts","webpack://tweb/./src/helpers/dom/isInDOM.ts","webpack://tweb/./src/helpers/dom/isInputEmpty.ts","webpack://tweb/./src/helpers/dom/isSendShortcutPressed.ts","webpack://tweb/./src/helpers/dom/isSwipingBackSafari.ts","webpack://tweb/./src/helpers/dom/placeCaretAtEnd.ts","webpack://tweb/./src/helpers/dom/positionElementByIndex.ts","webpack://tweb/./src/helpers/dom/renderImageFromUrl.ts","webpack://tweb/./src/helpers/dom/renderMediaWithFadeIn.ts","webpack://tweb/./src/helpers/dom/replaceContent.ts","webpack://tweb/./src/helpers/dom/compareNodes.ts","webpack://tweb/./src/helpers/dom/richInputHandler.ts","webpack://tweb/./src/helpers/dom/sortable.ts","webpack://tweb/./src/helpers/dom/toggleDisability.ts","webpack://tweb/./src/helpers/dom/whichChild.ts","webpack://tweb/./src/helpers/dropdownHover.ts","webpack://tweb/./src/helpers/fastSmoothScroll.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/helpers/filterChatPhotosMessages.ts","webpack://tweb/./src/helpers/formatBytes.ts","webpack://tweb/./src/helpers/formatCallDuration.ts","webpack://tweb/./src/helpers/formatDuration.ts","webpack://tweb/./src/helpers/formatPhoneNumber.ts","webpack://tweb/./src/helpers/framesCache.ts","webpack://tweb/./src/helpers/generatePathData.ts","webpack://tweb/./src/helpers/getImageFromStrippedThumb.ts","webpack://tweb/./src/helpers/getPreviewURLFromThumb.ts","webpack://tweb/./src/helpers/getStrippedThumbIfNeeded.ts","webpack://tweb/./src/helpers/listLoader.ts","webpack://tweb/./src/helpers/listenerSetter.ts","webpack://tweb/./src/helpers/mediaSize.ts","webpack://tweb/./src/helpers/mediaSizes.ts","webpack://tweb/./src/helpers/middlewarePromise.ts","webpack://tweb/./src/helpers/number/clamp.ts","webpack://tweb/./src/helpers/number/formatNumber.ts","webpack://tweb/./src/helpers/number/numberThousandSplitter.ts","webpack://tweb/./src/helpers/onMediaLoad.ts","webpack://tweb/./src/helpers/overlayClickHandler.ts","webpack://tweb/./src/helpers/paymentsWrapCurrencyAmount.ts","webpack://tweb/./src/helpers/positionMenu.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/helpers/saveLottiePreview.ts","webpack://tweb/./src/helpers/schedulers/throttleWithRaf.ts","webpack://tweb/./src/helpers/schedulers/throttleWith.ts","webpack://tweb/./src/helpers/scrollableLoader.ts","webpack://tweb/./src/helpers/searchListLoader.ts","webpack://tweb/./src/lib/appManagers/utils/messageId/incrementMessageId.ts","webpack://tweb/./src/helpers/sequentialDom.ts","webpack://tweb/./src/helpers/setAttachmentSize.ts","webpack://tweb/./src/helpers/sortedList.ts","webpack://tweb/./src/helpers/string/bom.ts","webpack://tweb/./src/helpers/string/encodeEntities.ts","webpack://tweb/./src/helpers/string/escapeRegExp.ts","webpack://tweb/./src/helpers/string/limitSymbols.ts","webpack://tweb/./src/helpers/string/toHHMMSS.ts","webpack://tweb/./src/helpers/textToSvgURL.ts","webpack://tweb/./src/helpers/windowSize.ts","webpack://tweb/./src/hooks/useHeavyAnimationCheck.ts","webpack://tweb/./src/components/dialogsContextMenu.ts","webpack://tweb/./src/components/connectionStatus.ts","webpack://tweb/./src/components/sendingStatus.ts","webpack://tweb/./src/helpers/easing/easeInOutSine.ts","webpack://tweb/./src/helpers/canvas/roundRect.ts","webpack://tweb/./src/components/groupCallActiveIcon.ts","webpack://tweb/./src/helpers/canvas/shimmer.ts","webpack://tweb/./src/helpers/dialogsPlaceholder.ts","webpack://tweb/./src/helpers/canvas/drawCircle.ts","webpack://tweb/./src/helpers/dom/shake.ts","webpack://tweb/./src/lib/appManagers/appDialogsManager.ts","webpack://tweb/./src/helpers/number/getUnsafeRandomInt.ts","webpack://tweb/./src/lib/appManagers/appDownloadManager.ts","webpack://tweb/./src/helpers/dom/createDownloadAnchor.ts","webpack://tweb/./src/components/chat/bubbleGroups.ts","webpack://tweb/./src/helpers/array/partition.ts","webpack://tweb/./src/components/popups/datePicker.ts","webpack://tweb/./src/components/divAndCaption.ts","webpack://tweb/./src/components/chat/replyContainer.ts","webpack://tweb/./src/components/wrappers/reply.ts","webpack://tweb/./src/components/stackedAvatars.ts","webpack://tweb/./src/components/chat/replies.ts","webpack://tweb/./src/components/chat/messageRender.ts","webpack://tweb/./src/helpers/dom/getElementByPoint.ts","webpack://tweb/./src/helpers/dom/reflowScrollableElement.ts","webpack://tweb/./src/lib/mtproto/constants.ts","webpack://tweb/./src/lib/appManagers/internalLink.ts","webpack://tweb/./src/components/popups/joinChatInvite.ts","webpack://tweb/./src/components/chat/reaction.ts","webpack://tweb/./src/components/chat/reactions.ts","webpack://tweb/./src/helpers/scrollSaver.ts","webpack://tweb/./src/helpers/dom/superIntersectionObserver.ts","webpack://tweb/./src/lib/appManagers/utils/messages/isMentionUnread.ts","webpack://tweb/./src/helpers/array/accumulate.ts","webpack://tweb/./src/helpers/cacheCallback.ts","webpack://tweb/./src/helpers/string/replaceNonNumber.ts","webpack://tweb/./src/helpers/cards/cardBrands.ts","webpack://tweb/./src/helpers/array/createArray.ts","webpack://tweb/./src/helpers/string/buggedNumbers.ts","webpack://tweb/./src/helpers/cards/patternCharacters.ts","webpack://tweb/./src/helpers/cards/cardFormattingPatterns.ts","webpack://tweb/./src/helpers/cards/formatValueByPattern.ts","webpack://tweb/./src/helpers/cards/validateCard.ts","webpack://tweb/./src/helpers/string/nbsp.ts","webpack://tweb/./src/components/telegramWebView.ts","webpack://tweb/./src/components/popups/paymentVerification.ts","webpack://tweb/./src/components/popups/paymentCard.ts","webpack://tweb/./src/helpers/cards/formatInputValueByPattern.ts","webpack://tweb/./src/components/popups/paymentCardConfirmation.ts","webpack://tweb/./src/components/popups/paymentShipping.ts","webpack://tweb/./src/components/popups/paymentShippingMethods.ts","webpack://tweb/./src/components/popups/payment.ts","webpack://tweb/./src/components/groupedLayout.ts","webpack://tweb/./src/components/prepareAlbum.ts","webpack://tweb/./src/components/wrappers/album.ts","webpack://tweb/./src/components/sidebarRight/tabs/pollResults.ts","webpack://tweb/./src/components/poll.ts","webpack://tweb/./src/helpers/string/isRTL.ts","webpack://tweb/./src/components/chat/bubbles.ts","webpack://tweb/./src/helpers/dom/copyFromElement.ts","webpack://tweb/./src/components/wrappers/groupedDocuments.ts","webpack://tweb/./src/components/wrappers/poll.ts","webpack://tweb/./src/components/popups/unpinMessage.ts","webpack://tweb/./src/helpers/dom/isSelectionEmpty.ts","webpack://tweb/./src/helpers/preloadAnimatedEmojiSticker.ts","webpack://tweb/./src/components/popups/reportMessagesConfirm.ts","webpack://tweb/./src/components/popups/reportMessages.ts","webpack://tweb/./src/components/popups/sponsored.ts","webpack://tweb/./src/components/popups/reactedList.ts","webpack://tweb/./src/components/chat/reactionsMenu.ts","webpack://tweb/./src/components/chat/contextMenu.ts","webpack://tweb/./src/components/chat/sendContextMenu.ts","webpack://tweb/./src/components/popups/createPoll.ts","webpack://tweb/./src/helpers/createPoster.ts","webpack://tweb/./src/helpers/getGifDuration.ts","webpack://tweb/./src/components/popups/newMedia.ts","webpack://tweb/./src/helpers/dom/attachListNavigation.ts","webpack://tweb/./src/components/chat/autocompleteHelper.ts","webpack://tweb/./src/components/chat/stickersHelper.ts","webpack://tweb/./src/components/popups/schedule.ts","webpack://tweb/./src/components/chat/emojiHelper.ts","webpack://tweb/./src/components/chat/autocompletePeerHelper.ts","webpack://tweb/./src/components/chat/commandsHelper.ts","webpack://tweb/./src/components/chat/autocompleteHelperController.ts","webpack://tweb/./src/components/chat/mentionsHelper.ts","webpack://tweb/./src/components/chat/replyKeyboard.ts","webpack://tweb/./src/components/chat/inlineHelper.ts","webpack://tweb/./src/components/chat/botCommands.ts","webpack://tweb/./src/helpers/modifyAckedResult.ts","webpack://tweb/./src/components/chat/sendAs.ts","webpack://tweb/./src/components/inputFieldAnimated.ts","webpack://tweb/./src/helpers/dom/hasMarkupInSelection.ts","webpack://tweb/./src/components/chat/input.ts","webpack://tweb/./src/components/wrappers/draft.ts","webpack://tweb/./src/components/chat/pinnedContainer.ts","webpack://tweb/./src/components/chat/pinnedMessageBorder.ts","webpack://tweb/./src/components/chat/audio.ts","webpack://tweb/./src/components/chat/pinnedMessage.ts","webpack://tweb/./src/helpers/dom/handleScrollSideEvent.ts","webpack://tweb/./src/components/chat/topbar.ts","webpack://tweb/./src/components/sidebarRight/tabs/search.ts","webpack://tweb/./src/components/chat/search.ts","webpack://tweb/./src/components/chat/patternRenderer.ts","webpack://tweb/./src/components/chat/chat.ts","webpack://tweb/./src/helpers/autoDownload.ts","webpack://tweb/./src/components/chat/markupTooltip.ts","webpack://tweb/./src/components/chat/dragAndDrop.ts","webpack://tweb/./src/helpers/dom/disableTransition.ts","webpack://tweb/./src/components/lineBlobDrawable.ts","webpack://tweb/./src/components/topbarWeave.ts","webpack://tweb/./src/lib/rlottie/rlottieIcon.ts","webpack://tweb/./src/components/superIcon.ts","webpack://tweb/./src/components/groupCall/microphoneIcon.ts","webpack://tweb/./src/components/groupCall/participantMutedIcon.ts","webpack://tweb/./src/components/groupCall/index.ts","webpack://tweb/./src/components/groupCall/participantStatus.ts","webpack://tweb/./src/components/groupCall/participantsList.ts","webpack://tweb/./src/components/call/videoCanvasBlur.ts","webpack://tweb/./src/components/groupCall/participantVideo.ts","webpack://tweb/./src/components/groupCall/participantVideos.ts","webpack://tweb/./src/components/groupCall/participants.ts","webpack://tweb/./src/components/groupCall/description.ts","webpack://tweb/./src/components/groupCall/title.ts","webpack://tweb/./src/components/call/button.ts","webpack://tweb/./src/components/movableElement.ts","webpack://tweb/./src/helpers/movablePanel.ts","webpack://tweb/./src/helpers/toggleClassName.ts","webpack://tweb/./src/components/call/description.ts","webpack://tweb/./src/components/groupCall/microphoneIconMini.ts","webpack://tweb/./src/components/call/index.ts","webpack://tweb/./src/components/topbarCall.ts","webpack://tweb/./src/lib/appManagers/uiNotificationsManager.ts","webpack://tweb/./src/helpers/files/getFilesFromEvent.ts","webpack://tweb/./src/helpers/addAnchorListener.ts","webpack://tweb/./src/lib/appManagers/appImManager.ts","webpack://tweb/./src/lib/appManagers/utils/messages/canSaveMessageMedia.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMediaFromMessage.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getMessageSenderPeerIdOrName.ts","webpack://tweb/./src/lib/appManagers/utils/messages/isMessageRestricted.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerColorById.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerEditableUsername.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerId.ts","webpack://tweb/./src/lib/appManagers/utils/photos/choosePhotoSize.ts","webpack://tweb/./src/lib/calls/callConnectionInstanceBase.ts","webpack://tweb/./src/lib/calls/helpers/createPeerConnection.ts","webpack://tweb/./src/lib/calls/helpers/createDataChannel.ts","webpack://tweb/./src/lib/calls/helpers/parseSignalingData.ts","webpack://tweb/./src/lib/calls/callConnectionInstance.ts","webpack://tweb/./src/lib/crypto/subtle.ts","webpack://tweb/./src/lib/calls/p2P/p2PEncryptor.ts","webpack://tweb/./src/lib/crypto/utils/sha256.ts","webpack://tweb/./src/lib/calls/p2P/chromeP2PSdpBuilder.ts","webpack://tweb/./src/lib/calls/p2P/p2PSdpBuilder.js","webpack://tweb/./src/lib/calls/p2P/firefoxP2PSdpBuilder.js","webpack://tweb/./src/lib/calls/p2P/safariP2PSdpBuilder.js","webpack://tweb/./src/lib/calls/callInstance.ts","webpack://tweb/./src/lib/calls/p2P/getCallProtocol.ts","webpack://tweb/./src/lib/calls/p2P/getRtcConfiguration.ts","webpack://tweb/./src/lib/calls/helpers/getStreamCached.ts","webpack://tweb/./src/lib/calls/callInstanceBase.ts","webpack://tweb/./src/lib/calls/callState.ts","webpack://tweb/./src/components/call/getAudioAsset.ts","webpack://tweb/./src/lib/calls/callsController.ts","webpack://tweb/./src/lib/calls/constants.ts","webpack://tweb/./src/lib/calls/groupCallConnectionInstance.ts","webpack://tweb/./src/lib/calls/helpers/processMediaSection.ts","webpack://tweb/./src/lib/calls/helpers/filterServerCodecs.ts","webpack://tweb/./src/lib/calls/helpers/fixLocalOffer.ts","webpack://tweb/./src/lib/calls/groupCallInstance.ts","webpack://tweb/./src/lib/calls/groupCallState.ts","webpack://tweb/./src/components/groupCall/getAudioAsset.ts","webpack://tweb/./src/lib/calls/groupCallsController.ts","webpack://tweb/./src/lib/calls/helpers/createMainStreamManager.ts","webpack://tweb/./src/lib/calls/helpers/getAudioConstraints.ts","webpack://tweb/./src/environment/constraintSupport.ts","webpack://tweb/./src/lib/calls/helpers/getScreenConstraints.ts","webpack://tweb/./src/lib/calls/helpers/getScreenStream.ts","webpack://tweb/./src/lib/calls/helpers/getStream.ts","webpack://tweb/./src/lib/calls/helpers/getVideoConstraints.ts","webpack://tweb/./src/lib/calls/helpers/parseMediaSectionInfo.ts","webpack://tweb/./src/lib/calls/helpers/parseSourceGroups.ts","webpack://tweb/./src/lib/calls/helpers/stopTrack.ts","webpack://tweb/./src/lib/calls/localConferenceDescription.ts","webpack://tweb/./src/lib/calls/sdp/index.ts","webpack://tweb/./src/helpers/string/splitStringByLimitWithRest.ts","webpack://tweb/./src/helpers/uniqueNumberGenerator.ts","webpack://tweb/./src/lib/calls/sdp/attributeSplitted.ts","webpack://tweb/./src/lib/calls/sdp/mediaLineParts.ts","webpack://tweb/./src/lib/calls/sdp/line.ts","webpack://tweb/./src/lib/calls/sdp/attributeInner.ts","webpack://tweb/./src/lib/calls/sdp/attributes.ts","webpack://tweb/./src/lib/calls/sdp/mediaSection.ts","webpack://tweb/./src/lib/calls/sdp/sessionSection.ts","webpack://tweb/./src/lib/calls/sdp/utils.ts","webpack://tweb/./src/lib/calls/sdpBuilder.ts","webpack://tweb/./src/lib/calls/streamManager.ts","webpack://tweb/./src/lib/calls/stringFromLineBuilder.ts","webpack://tweb/./src/lib/calls/utils.ts","webpack://tweb/./src/lib/richTextProcessor/getAbbreviation.ts","webpack://tweb/./src/lib/richTextProcessor/getEmojiEntityFromEmoji.ts","webpack://tweb/./src/lib/richTextProcessor/matchEmail.ts","webpack://tweb/./src/lib/richTextProcessor/setBlankToAnchor.ts","webpack://tweb/./src/lib/richTextProcessor/wrapAbbreviation.ts","webpack://tweb/./src/lib/richTextProcessor/wrapDraftText.ts","webpack://tweb/./src/lib/richTextProcessor/wrapEmojiText.ts","webpack://tweb/./src/environment/emojiVersionsSupport.ts","webpack://tweb/./src/lib/richTextProcessor/wrapRichText.ts","webpack://tweb/./src/helpers/buildURLHash.ts","webpack://tweb/./src/lib/richTextProcessor/wrapTelegramUrlToAnchor.ts","webpack://tweb/./src/lib/rlottie/queryableWorker.ts","webpack://tweb/./src/environment/webAssemblySupport.ts","webpack://tweb/./src/lib/rlottie/lottieLoader.ts","webpack://tweb/./src/lib/rlottie/rlottiePlayer.ts","webpack://tweb/./src/pages/pagesManager.ts","webpack://tweb/./src/pages/page.ts","webpack://tweb/./src/vendor/emoji/index.ts","webpack://tweb/./public/recorder.min.js","webpack://tweb/./src/vendor/bezier-easing/index.js"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {CustomEmojiElement, CustomEmojiRendererElement} from '../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../lib/rootScope';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport forEachReverse from '../helpers/array/forEachReverse';\nimport idleController from '../helpers/idleController';\nimport appMediaPlaybackController from './appMediaPlaybackController';\nimport {fastRaf} from '../helpers/schedulers';\n\nexport type AnimationItemGroup = '' | 'none' | 'chat' | 'lock' |\n 'STICKERS-POPUP' | 'emoticons-dropdown' | 'STICKERS-SEARCH' | 'GIFS-SEARCH' |\n `CHAT-MENU-REACTIONS-${number}` | 'INLINE-HELPER' | 'GENERAL-SETTINGS' | 'STICKER-VIEWER' | 'EMOJI' |\n 'EMOJI-STATUS' | `chat-${number}`;\nexport interface AnimationItem {\n el: HTMLElement,\n group: AnimationItemGroup,\n animation: AnimationItemWrapper,\n controlled?: boolean\n};\n\nexport interface AnimationItemWrapper {\n remove: () => void;\n paused: boolean;\n pause: () => any;\n play: () => any;\n autoplay: boolean;\n // onVisibilityChange?: (visible: boolean) => boolean;\n};\n\nexport class AnimationIntersector {\n private observer: IntersectionObserver;\n private visible: Set;\n\n private overrideIdleGroups: Set;\n private byGroups: {[group in AnimationItemGroup]?: AnimationItem[]};\n private byPlayer: Map;\n private lockedGroups: {[group in AnimationItemGroup]?: true};\n private onlyOnePlayableGroup: AnimationItemGroup;\n\n private intersectionLockedGroups: {[group in AnimationItemGroup]?: true};\n private videosLocked: boolean;\n\n constructor() {\n this.observer = new IntersectionObserver((entries) => {\n // if(rootScope.idle.isIDLE) return;\n\n for(const entry of entries) {\n const target = entry.target;\n\n for(const group in this.byGroups) {\n if(this.intersectionLockedGroups[group as AnimationItemGroup]) {\n continue;\n }\n\n const animation = this.byGroups[group as AnimationItemGroup].find((p) => p.el === target);\n if(!animation) {\n continue;\n }\n\n if(entry.isIntersecting) {\n this.visible.add(animation);\n this.checkAnimation(animation, false);\n\n /* if(animation instanceof HTMLVideoElement && animation.dataset.src) {\n animation.src = animation.dataset.src;\n animation.load();\n } */\n } else {\n this.visible.delete(animation);\n this.checkAnimation(animation, true);\n\n const _animation = animation.animation;\n if(_animation instanceof RLottiePlayer/* && animation.cachingDelta === 2 */) {\n // console.warn('will clear cache', player);\n _animation.clearCache();\n }/* else if(animation instanceof HTMLVideoElement && animation.src) {\n animation.dataset.src = animation.src;\n animation.src = '';\n animation.load();\n } */\n }\n\n break;\n }\n }\n });\n\n this.visible = new Set();\n\n this.overrideIdleGroups = new Set();\n this.byGroups = {};\n this.byPlayer = new Map();\n this.lockedGroups = {};\n this.onlyOnePlayableGroup = '';\n\n this.intersectionLockedGroups = {};\n this.videosLocked = false;\n\n appMediaPlaybackController.addEventListener('play', ({doc}) => {\n if(doc.type === 'round') {\n this.videosLocked = true;\n this.checkAnimations2();\n }\n });\n\n appMediaPlaybackController.addEventListener('pause', () => {\n if(this.videosLocked) {\n this.videosLocked = false;\n this.checkAnimations2();\n }\n });\n\n idleController.addEventListener('change', (idle) => {\n this.checkAnimations2(idle);\n });\n }\n\n public setOverrideIdleGroup(group: string, override: boolean) {\n if(override) this.overrideIdleGroups.add(group);\n else this.overrideIdleGroups.delete(group);\n }\n\n public getAnimations(element: HTMLElement) {\n const found: AnimationItem[] = [];\n for(const group in this.byGroups) {\n for(const player of this.byGroups[group as AnimationItemGroup]) {\n if(player.el === element) {\n found.push(player);\n }\n }\n }\n\n return found;\n }\n\n public removeAnimation(player: AnimationItem) {\n const {el, animation} = player;\n // if(!(animation instanceof CustomEmojiElement)) {\n animation.remove();\n // }\n\n if(animation instanceof HTMLVideoElement && IS_SAFARI) {\n setTimeout(() => { // TODO: очистка по очереди, а не все вместе с этим таймаутом\n animation.src = '';\n animation.load();\n }, 1e3);\n }\n\n const group = this.byGroups[player.group];\n if(group) {\n indexOfAndSplice(group, player);\n if(!group.length) {\n delete this.byGroups[player.group];\n }\n }\n\n this.observer.unobserve(el);\n this.visible.delete(player);\n this.byPlayer.delete(animation);\n }\n\n public removeAnimationByPlayer(player: AnimationItemWrapper) {\n const item = this.byPlayer.get(player);\n if(item) {\n this.removeAnimation(item);\n }\n }\n\n public addAnimation(\n animation: AnimationItem['animation'],\n group: AnimationItemGroup = '',\n observeElement?: HTMLElement,\n controlled?: boolean\n ) {\n if(group === 'none' || this.byPlayer.has(animation)) {\n return;\n }\n\n if(!observeElement) {\n if(animation instanceof RLottiePlayer) {\n observeElement = animation.el[0];\n } else if(animation instanceof CustomEmojiRendererElement) {\n observeElement = animation.canvas;\n } else if(animation instanceof CustomEmojiElement) {\n observeElement = animation.placeholder ?? animation;\n } else if(animation instanceof HTMLElement) {\n observeElement = animation;\n }\n }\n\n const item: AnimationItem = {\n el: observeElement,\n animation: animation,\n group,\n controlled\n };\n\n if(animation instanceof RLottiePlayer) {\n if(!rootScope.settings.stickers.loop && animation.loop) {\n animation.loop = rootScope.settings.stickers.loop;\n }\n }\n\n (this.byGroups[group as AnimationItemGroup] ??= []).push(item);\n this.observer.observe(item.el);\n this.byPlayer.set(animation, item);\n }\n\n public checkAnimations(\n blurred?: boolean,\n group?: AnimationItemGroup,\n destroy?: boolean,\n imitateIntersection?: boolean\n ) {\n // if(rootScope.idle.isIDLE) return;\n\n if(group !== undefined && !this.byGroups[group]) {\n // console.warn('no animation group:', group);\n return;\n }\n\n const groups = group !== undefined /* && false */ ? [group] : Object.keys(this.byGroups) as AnimationItemGroup[];\n\n for(const group of groups) {\n if(imitateIntersection && this.intersectionLockedGroups[group]) {\n continue;\n }\n\n const animations = this.byGroups[group];\n\n forEachReverse(animations, (animation) => {\n this.checkAnimation(animation, blurred, destroy);\n });\n }\n }\n\n public checkAnimations2(blurred?: boolean) {\n this.checkAnimations(blurred, undefined, undefined, true);\n }\n\n public checkAnimation(player: AnimationItem, blurred?: boolean, destroy?: boolean) {\n const {el, animation, group} = player;\n // return;\n if(destroy || (!this.lockedGroups[group] && !isInDOM(el))) {\n if(!player.controlled || destroy) {\n this.removeAnimation(player);\n }\n\n return;\n }\n\n if(blurred ||\n (this.onlyOnePlayableGroup && this.onlyOnePlayableGroup !== group) ||\n (animation instanceof HTMLVideoElement && this.videosLocked)\n ) {\n if(!animation.paused) {\n // console.warn('pause animation:', animation);\n animation.pause();\n }\n } else if(animation.paused &&\n this.visible.has(player) &&\n animation.autoplay &&\n (!this.onlyOnePlayableGroup || this.onlyOnePlayableGroup === group) &&\n (!idleController.isIdle || this.overrideIdleGroups.has(player.group))\n ) {\n // console.warn('play animation:', animation);\n animation.play();\n }\n }\n\n public getOnlyOnePlayableGroup() {\n return this.onlyOnePlayableGroup;\n }\n\n public setOnlyOnePlayableGroup(group: AnimationItemGroup = '') {\n this.onlyOnePlayableGroup = group;\n }\n\n public lockGroup(group: AnimationItemGroup) {\n this.lockedGroups[group] = true;\n }\n\n public unlockGroup(group: AnimationItemGroup) {\n delete this.lockedGroups[group];\n this.checkAnimations(undefined, group);\n }\n\n public refreshGroup(group: AnimationItemGroup) {\n const animations = this.byGroups[group];\n if(!animations?.length) {\n return;\n }\n\n animations.forEach((animation) => {\n this.observer.unobserve(animation.el);\n });\n\n fastRaf(() => {\n animations.forEach((animation) => {\n this.observer.observe(animation.el);\n });\n });\n }\n\n public lockIntersectionGroup(group: AnimationItemGroup) {\n this.intersectionLockedGroups[group] = true;\n }\n\n public unlockIntersectionGroup(group: AnimationItemGroup) {\n delete this.intersectionLockedGroups[group];\n this.refreshGroup(group);\n }\n\n public toggleIntersectionGroup(group: AnimationItemGroup, lock: boolean) {\n if(lock) this.lockIntersectionGroup(group);\n else this.unlockIntersectionGroup(group);\n }\n}\n\nconst animationIntersector = new AnimationIntersector();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.animationIntersector = animationIntersector);\nexport default animationIntersector;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {IS_APPLE, IS_SAFARI} from '../environment/userAgent';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport simulateEvent from '../helpers/dom/dispatchEvent';\nimport type {SearchSuperContext} from './appSearchSuper.';\nimport {Document, DocumentAttribute, Message, PhotoSize} from '../layer';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport I18n from '../lib/langPack';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport copy from '../helpers/object/copy';\nimport deepEqual from '../helpers/object/deepEqual';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport getPeerTitle from './wrappers/getPeerTitle';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport onMediaLoad from '../helpers/onMediaLoad';\nimport EventListenerBase from '../helpers/eventListenerBase';\n\n// TODO: Safari: проверить стрим, включить его и сразу попробовать включить видео или другую песню\n// TODO: Safari: попробовать замаскировать подгрузку последнего чанка\n// TODO: Safari: пофиксить момент, когда заканчивается песня и пытаешься включить её заново - прогресс сразу в конце\n\nexport type MediaItem = {mid: number, peerId: PeerId};\n\ntype HTMLMediaElement = HTMLAudioElement | HTMLVideoElement;\n\nconst SHOULD_USE_SAFARI_FIX = (() => {\n try {\n return IS_SAFARI && +navigator.userAgent.match(/ Version\\/(\\d+)/)[1] < 14;\n } catch(err) {\n return false;\n }\n})();\n\nconst SEEK_OFFSET = 10;\n\nexport type MediaSearchContext = SearchSuperContext & Partial<{\n isScheduled: boolean,\n useSearch: boolean\n}>;\n\ntype MediaDetails = {\n peerId: PeerId,\n mid: number,\n docId: DocId,\n doc: MyDocument,\n message: Message.message,\n clean?: boolean,\n isScheduled?: boolean,\n isSingle?: boolean\n};\n\nexport type PlaybackMediaType = 'voice' | 'video' | 'audio';\n\nexport class AppMediaPlaybackController extends EventListenerBase<{\n play: (details: ReturnType) => void,\n pause: () => void,\n playbackParams: (params: ReturnType) => void,\n stop: () => void,\n}> {\n private container: HTMLElement;\n private media: Map> = new Map();\n private scheduled: AppMediaPlaybackController['media'] = new Map();\n private mediaDetails: Map = new Map();\n private playingMedia: HTMLMediaElement;\n private playingMediaType: PlaybackMediaType;\n\n private waitingMediaForLoad: Map>> = new Map();\n private waitingScheduledMediaForLoad: AppMediaPlaybackController['waitingMediaForLoad'] = new Map();\n private waitingDocumentsForLoad: {[docId: string]: Set} = {};\n\n public willBePlayedMedia: HTMLMediaElement;\n private searchContext: MediaSearchContext;\n\n private listLoader: SearchListLoader;\n\n public volume: number;\n public muted: boolean;\n public playbackRate: number;\n public loop: boolean;\n public round: boolean;\n private _volume: number;\n private _muted: boolean;\n private _playbackRate: number;\n private _loop: boolean;\n private _round: boolean;\n private lockedSwitchers: boolean;\n private playbackRates: Record = {\n voice: 1,\n video: 1,\n audio: 1\n };\n\n private pip: HTMLVideoElement;\n private managers: AppManagers;\n private skipMediaPlayEvent: boolean;\n\n construct(managers: AppManagers) {\n this.managers = managers;\n this.container = document.createElement('div');\n // this.container.style.cssText = 'position: absolute; top: -10000px; left: -10000px;';\n this.container.style.cssText = 'display: none;';\n document.body.append(this.container);\n\n if(navigator.mediaSession) {\n const actions: {[action in MediaSessionAction]?: MediaSessionActionHandler} = {\n play: this.browserPlay,\n pause: this.browserPause,\n stop: this.browserStop,\n seekbackward: this.browserSeekBackward,\n seekforward: this.browserSeekForward,\n seekto: this.browserSeekTo,\n previoustrack: this.browserPrevious,\n nexttrack: this.browserNext\n };\n\n for(const action in actions) {\n try {\n navigator.mediaSession.setActionHandler(action as MediaSessionAction, actions[action as MediaSessionAction]);\n } catch(err) {\n console.warn('MediaSession action is not supported:', action);\n }\n }\n }\n\n rootScope.addEventListener('document_downloaded', (docId) => {\n const set = this.waitingDocumentsForLoad[docId];\n if(set) {\n for(const media of set) {\n this.onMediaDocumentLoad(media);\n }\n }\n });\n\n rootScope.addEventListener('media_play', () => {\n if(this.skipMediaPlayEvent) {\n this.skipMediaPlayEvent = false;\n return;\n }\n\n if(!this.pause() && this.pip) {\n this.pip.pause();\n }\n });\n\n const properties: {[key: PropertyKey]: PropertyDescriptor} = {};\n const keys = [\n 'volume' as const,\n 'muted' as const,\n 'playbackRate' as const,\n 'loop' as const,\n 'round' as const\n ];\n keys.forEach((key) => {\n const _key = ('_' + key) as `_${typeof key}`;\n properties[key] = {\n get: () => this[_key],\n set: (value: number | boolean) => {\n if(this[_key] === value) {\n return;\n }\n\n // @ts-ignore\n this[_key] = value;\n if(this.playingMedia && (key !== 'loop' || this.playingMediaType === 'audio') && key !== 'round') {\n // @ts-ignore\n this.playingMedia[key] = value;\n }\n\n if(key === 'playbackRate' && this.playingMediaType !== undefined) {\n this.playbackRates[this.playingMediaType] = value as number;\n }\n\n this.dispatchPlaybackParams();\n }\n };\n });\n Object.defineProperties(this, properties);\n }\n\n private dispatchPlaybackParams() {\n this.dispatchEvent('playbackParams', this.getPlaybackParams());\n }\n\n public getPlaybackParams() {\n const {volume, muted, playbackRate, playbackRates, loop, round} = this;\n return {\n volume,\n muted,\n playbackRate,\n playbackRates,\n loop,\n round\n };\n }\n\n public setPlaybackParams(params: ReturnType) {\n this.playbackRates = params.playbackRates;\n this._volume = params.volume;\n this._muted = params.muted;\n this._playbackRate = params.playbackRate;\n this._loop = params.loop;\n this._round = params.round;\n }\n\n public seekBackward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\n if(media) {\n media.currentTime = Math.max(0, media.currentTime - (details.seekOffset || SEEK_OFFSET));\n }\n };\n\n public seekForward = (details: MediaSessionActionDetails, media = this.playingMedia) => {\n if(media) {\n media.currentTime = Math.min(media.duration, media.currentTime + (details.seekOffset || SEEK_OFFSET));\n }\n };\n\n public seekTo = (details: MediaSessionActionDetails, media = this.playingMedia) => {\n if(media) {\n media.currentTime = details.seekTime;\n }\n };\n\n public addMedia(message: Message.message, autoload: boolean, clean?: boolean): HTMLMediaElement {\n const {peerId, mid} = message;\n\n const isScheduled = !!message.pFlags.is_scheduled;\n const s = isScheduled ? this.scheduled : this.media;\n let storage = s.get(message.peerId);\n if(!storage) {\n s.set(message.peerId, storage = new Map());\n }\n\n let media = storage.get(mid);\n if(media) {\n return media;\n }\n\n const doc = getMediaFromMessage(message) as Document.document;\n storage.set(mid, media = document.createElement(doc.type === 'round' || doc.type === 'video' ? 'video' : 'audio'));\n // const source = document.createElement('source');\n // source.type = doc.type === 'voice' && !opusDecodeController.isPlaySupported() ? 'audio/wav' : doc.mime_type;\n\n if(doc.type === 'round') {\n media.setAttribute('playsinline', 'true');\n // media.muted = true;\n }\n\n const details: MediaDetails = {\n peerId,\n mid,\n docId: doc.id,\n doc,\n message,\n clean,\n isScheduled: message.pFlags.is_scheduled\n };\n\n this.mediaDetails.set(media, details);\n\n // media.autoplay = true;\n media.volume = 1;\n // media.append(source);\n\n this.container.append(media);\n\n media.addEventListener('play', this.onPlay);\n media.addEventListener('pause', this.onPause);\n media.addEventListener('ended', this.onEnded);\n\n if(doc.type !== 'audio' && message?.pFlags.media_unread && message.fromId !== rootScope.myId) {\n media.addEventListener('timeupdate', () => {\n this.managers.appMessagesManager.readMessages(peerId, [mid]);\n }, {once: true});\n }\n\n /* const onError = (e: Event) => {\n //console.log('appMediaPlaybackController: video onError', e);\n\n if(this.nextMid === mid) {\n this.loadSiblingsMedia(peerId, doc.type as MediaType, mid).then(() => {\n if(this.nextMid && storage[this.nextMid]) {\n storage[this.nextMid].play();\n }\n });\n }\n };\n\n media.addEventListener('error', onError); */\n\n const deferred = deferredPromise();\n if(autoload) {\n deferred.resolve();\n } else {\n const w = message.pFlags.is_scheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\n let waitingStorage = w.get(peerId);\n if(!waitingStorage) {\n w.set(peerId, waitingStorage = new Map());\n }\n\n waitingStorage.set(mid, deferred);\n }\n\n deferred.then(async() => {\n // media.autoplay = true;\n // console.log('will set media url:', media, doc, doc.type, doc.url);\n\n if(doc.supportsStreaming || (await this.managers.thumbsStorage.getCacheContext(doc)).url) {\n this.onMediaDocumentLoad(media);\n } else {\n let set = this.waitingDocumentsForLoad[doc.id];\n if(!set) {\n set = this.waitingDocumentsForLoad[doc.id] = new Set();\n }\n\n set.add(media);\n appDownloadManager.downloadMediaURL({media: doc});\n }\n }/* , onError */);\n\n return media;\n }\n\n public getMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\n const s = (isScheduled ? this.scheduled : this.media).get(peerId);\n return s?.get(mid);\n }\n\n private onMediaDocumentLoad = async(media: HTMLMediaElement) => {\n const details = this.mediaDetails.get(media);\n const doc = await this.managers.appDocsManager.getDoc(details.docId);\n if(doc.type === 'audio' && doc.supportsStreaming && SHOULD_USE_SAFARI_FIX) {\n this.handleSafariStreamable(media);\n }\n\n // setTimeout(() => {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\n media.src = cacheContext.url;\n\n if(this.playingMedia === media) {\n media.playbackRate = this.playbackRate;\n\n if(doc.type === 'audio') {\n media.loop = this.loop;\n }\n }\n // }, doc.supportsStreaming ? 500e3 : 0);\n\n const set = this.waitingDocumentsForLoad[doc.id];\n if(set) {\n set.delete(media);\n\n if(!set.size) {\n delete this.waitingDocumentsForLoad[doc.id];\n }\n }\n };\n\n // safari подгрузит последний чанк и песня включится,\n // при этом этот чанк нельзя руками отдать из SW, потому что браузер тогда теряется\n private handleSafariStreamable(media: HTMLMediaElement) {\n media.addEventListener('play', () => {\n /* if(media.readyState === 4) { // https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest/readyState\n return;\n } */\n\n // media.volume = 0;\n const currentTime = media.currentTime;\n // this.setSafariBuffering(media, true);\n\n media.addEventListener('progress', () => {\n media.currentTime = media.duration - 1;\n\n media.addEventListener('progress', () => {\n media.currentTime = currentTime;\n // media.volume = 1;\n // this.setSafariBuffering(media, false);\n\n if(!media.paused) {\n media.play()/* .catch(() => {}) */;\n }\n }, {once: true});\n }, {once: true});\n }/* , {once: true} */);\n }\n\n public resolveWaitingForLoadMedia(peerId: PeerId, mid: number, isScheduled?: boolean) {\n const w = isScheduled ? this.waitingScheduledMediaForLoad : this.waitingMediaForLoad;\n const storage = w.get(peerId);\n if(!storage) {\n return;\n }\n\n const promise = storage.get(mid);\n if(promise) {\n promise.resolve();\n storage.delete(mid);\n\n if(!storage.size) {\n w.delete(peerId);\n }\n }\n }\n\n /**\n * Only for audio\n */\n public isSafariBuffering(media: HTMLMediaElement) {\n // @ts-ignore\n return !!media.safariBuffering;\n }\n\n private setSafariBuffering(media: HTMLMediaElement, value: boolean) {\n // @ts-ignore\n media.safariBuffering = value;\n }\n\n private async setNewMediadata(message: Message.message, playingMedia = this.playingMedia) {\n if(document.pictureInPictureElement) {\n return;\n }\n\n await onMediaLoad(playingMedia, undefined, false); // have to wait for load, otherwise on macOS won't set\n\n const doc = getMediaFromMessage(message) as MyDocument;\n\n const artwork: MediaImage[] = [];\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n let title = '', artist = '';\n\n if(doc.thumbs?.length) {\n const size = doc.thumbs[doc.thumbs.length - 1];\n if(!(size as PhotoSize.photoStrippedSize).bytes) {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc, size.type);\n\n if(cacheContext.url) {\n artwork.push({\n src: cacheContext.url,\n sizes: `${(size as PhotoSize.photoSize).w}x${(size as PhotoSize.photoSize).h}`,\n type: 'image/jpeg'\n });\n } else {\n const download = appDownloadManager.downloadMediaURL({media: doc, thumb: size});\n download.then(() => {\n if(this.playingMedia !== playingMedia || !cacheContext.url) {\n return;\n }\n\n this.setNewMediadata(message);\n });\n }\n }\n } else if(isVoice) {\n const peerId = message.fromId || message.peerId;\n const peerPhoto = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n // const result = this.managers.appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small');\n // if(result.cached) {\n // const url = await result.loadPromise;\n // artwork.push({\n // src: url,\n // sizes: '160x160',\n // type: 'image/jpeg'\n // });\n // } else {\n // result.loadPromise.then((url) => {\n // if(this.playingMedia !== playingMedia || !url) {\n // return;\n // }\n\n // this.setNewMediadata(message);\n // });\n // }\n }\n\n title = await getPeerTitle({peerId, plainText: true, onlyFirstName: false});\n artist = I18n.format(doc.type === 'voice' ? 'AttachAudio' : 'AttachRound', true);\n }\n\n if(!isVoice) {\n const attribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n title = attribute?.title ?? doc.file_name;\n artist = attribute?.performer;\n }\n\n if(!artwork.length) {\n if(IS_APPLE) {\n if(IS_TOUCH_SUPPORTED) {\n artwork.push({\n src: `assets/img/apple-touch-icon-precomposed.png`,\n sizes: '180x180',\n type: 'image/png'\n });\n } else {\n artwork.push({\n src: `assets/img/apple-touch-icon.png`,\n sizes: '180x180',\n type: 'image/png'\n });\n }\n } else {\n [72, 96, 144, 192, 256, 384, 512].forEach((size) => {\n const sizes = `${size}x${size}`;\n artwork.push({\n src: `assets/img/android-chrome-${sizes}.png`,\n sizes,\n type: 'image/png'\n });\n });\n }\n }\n\n const metadata = new MediaMetadata({\n title,\n artist,\n artwork\n });\n\n navigator.mediaSession.metadata = metadata;\n }\n\n public setCurrentMediadata() {\n const {playingMedia} = this;\n if(!playingMedia) return;\n const message = this.getMessageByMedia(playingMedia);\n this.setNewMediadata(message, playingMedia);\n }\n\n private getMessageByMedia(media: HTMLMediaElement): Message.message {\n const details = this.mediaDetails.get(media);\n return details.message;\n // const {peerId, mid} = details;\n // const message = details.isScheduled ?\n // this.managers.appMessagesManager.getScheduledMessageByPeer(peerId, mid) :\n // this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n // return message;\n }\n\n public getPlayingDetails() {\n const {playingMedia} = this;\n if(!playingMedia) {\n return;\n }\n\n const message = this.getMessageByMedia(playingMedia);\n return {\n doc: getMediaFromMessage(message) as MyDocument,\n message,\n media: playingMedia,\n playbackParams: this.getPlaybackParams()\n };\n }\n\n private onPlay = (e?: Event) => {\n const media = e.target as HTMLMediaElement;\n const details = this.mediaDetails.get(media);\n const {peerId, mid} = details;\n\n // console.log('appMediaPlaybackController: video playing', this.currentPeerId, this.playingMedia, media);\n\n const pip = this.pip;\n if(pip) {\n pip.pause();\n }\n\n const message = this.getMessageByMedia(media);\n\n const previousMedia = this.playingMedia;\n if(previousMedia !== media) {\n this.stop();\n this.setMedia(media, message);\n\n const verify = (element: MediaItem) => element.mid === mid && element.peerId === peerId;\n const listLoader = this.listLoader;\n const current = listLoader.getCurrent();\n if(!current || !verify(current)) {\n let jumpLength: number;\n\n for(const withOtherSide of [false, true]) {\n const previous = listLoader.getPrevious(withOtherSide);\n\n let idx = previous.findIndex(verify);\n if(idx !== -1) {\n jumpLength = -(previous.length - idx);\n } else {\n const next = listLoader.getNext(withOtherSide);\n idx = next.findIndex(verify);\n if(idx !== -1) {\n jumpLength = idx + 1;\n }\n }\n\n if(jumpLength !== undefined) {\n break;\n }\n }\n\n if(jumpLength) {\n this.go(jumpLength, false);\n } else {\n this.setTargets({peerId, mid});\n }\n }\n }\n\n // audio_pause не успеет сработать без таймаута\n setTimeout(() => {\n if(this.playingMedia !== media) {\n return;\n }\n\n this.dispatchEvent('play', this.getPlayingDetails());\n this.pauseMediaInOtherTabs();\n }, 0);\n };\n\n private onPause = (e?: Event) => {\n /* const target = e.target as HTMLMediaElement;\n if(!isInDOM(target)) {\n this.container.append(target);\n target.play();\n return;\n } */\n\n // if(this.pip) {\n // this.pip.play();\n // }\n\n this.dispatchEvent('pause');\n };\n\n private onEnded = (e?: Event) => {\n if(!e.isTrusted) {\n return;\n }\n\n this.onPause(e);\n\n // console.log('on media end');\n\n const listLoader = this.listLoader;\n if(this.lockedSwitchers ||\n (!this.round && listLoader.current && !listLoader.next.length) ||\n !listLoader.getNext(true).length ||\n !this.next()) {\n this.stop();\n this.dispatchEvent('stop');\n }\n };\n\n public pauseMediaInOtherTabs() {\n this.skipMediaPlayEvent = true;\n rootScope.dispatchEvent('media_play');\n }\n\n // public get pip() {\n // return document.pictureInPictureElement as HTMLVideoElement;\n // }\n\n public toggle(play?: boolean, media = this.playingMedia) {\n if(!media) {\n return false;\n }\n\n if(play === undefined) {\n play = media.paused;\n }\n\n if(media.paused !== play) {\n return false;\n }\n\n if(play) {\n media.play();\n } else {\n media.pause();\n }\n\n return true;\n }\n\n public play = () => {\n return this.toggle(true);\n };\n\n public pause = () => {\n return this.toggle(false);\n };\n\n public stop = (media = this.playingMedia) => {\n if(!media) {\n return false;\n }\n\n if(!media.paused) {\n media.pause();\n }\n\n media.currentTime = 0;\n simulateEvent(media, 'ended');\n\n if(media === this.playingMedia) {\n const details = this.mediaDetails.get(media);\n if(details?.clean) {\n media.src = '';\n const peerId = details.peerId;\n const s = details.isScheduled ? this.scheduled : this.media;\n const storage = s.get(peerId);\n if(storage) {\n storage.delete(details.mid);\n\n if(!storage.size) {\n s.delete(peerId);\n }\n }\n\n media.remove();\n\n this.mediaDetails.delete(media);\n }\n\n this.playingMedia = undefined;\n this.playingMediaType = undefined;\n }\n\n return true;\n };\n\n public playItem = (item: MediaItem) => {\n const {peerId, mid} = item;\n const isScheduled = this.searchContext.isScheduled;\n const media = this.getMedia(peerId, mid, isScheduled);\n\n /* if(isSafari) {\n media.autoplay = true;\n } */\n\n media.play();\n\n setTimeout(() => {\n this.resolveWaitingForLoadMedia(peerId, mid, isScheduled);\n }, 0);\n };\n\n public go = (length: number, dispatchJump?: boolean) => {\n const listLoader = this.listLoader;\n if(this.lockedSwitchers || !listLoader) {\n return;\n }\n\n if(this.playingMediaType === 'audio') {\n return listLoader.goRound(length, dispatchJump);\n } else {\n return listLoader.go(length, dispatchJump);\n }\n };\n\n private bindBrowserCallback(cb: (video: HTMLVideoElement, details: MediaSessionActionDetails) => void) {\n const handler: MediaSessionActionHandler = (details) => {\n cb(this.pip, details);\n };\n\n return handler;\n }\n\n public browserPlay = this.bindBrowserCallback((video) => this.toggle(true, video));\n public browserPause = this.bindBrowserCallback((video) => this.toggle(false, video));\n public browserStop = this.bindBrowserCallback((video) => this.stop(video));\n public browserSeekBackward = this.bindBrowserCallback((video, details) => this.seekBackward(details, video));\n public browserSeekForward = this.bindBrowserCallback((video, details) => this.seekForward(details, video));\n public browserSeekTo = this.bindBrowserCallback((video, details) => this.seekTo(details, video));\n public browserNext = this.bindBrowserCallback((video) => video || this.next());\n public browserPrevious = this.bindBrowserCallback((video) => video ? this.seekToStart(video) : this.previous());\n\n public next = () => {\n return this.go(1);\n };\n\n public previous = () => {\n if(this.seekToStart(this.playingMedia)) {\n return;\n }\n\n return this.go(-1);\n };\n\n public seekToStart(media: HTMLMediaElement) {\n if(media?.currentTime > 5) {\n media.currentTime = 0;\n this.toggle(true, media);\n return true;\n }\n\n return false;\n }\n\n public willBePlayed(media: HTMLMediaElement) {\n this.willBePlayedMedia = media;\n }\n\n public setSearchContext(context: MediaSearchContext) {\n if(deepEqual(this.searchContext, context)) {\n return false;\n }\n\n this.searchContext = copy(context); // {_: type === 'audio' ? 'inputMessagesFilterMusic' : 'inputMessagesFilterRoundVoice'}\n return true;\n }\n\n public getSearchContext() {\n return this.searchContext;\n }\n\n public setTargets(current: MediaItem, prev?: MediaItem[], next?: MediaItem[]) {\n let listLoader = this.listLoader;\n if(!listLoader) {\n listLoader = this.listLoader = new SearchListLoader({\n loadCount: 10,\n loadWhenLeft: 5,\n processItem: (message: Message.message) => {\n this.addMedia(message, false);\n return {peerId: message.peerId, mid: message.mid};\n },\n onJump: (item, older) => {\n this.playItem(item);\n },\n onEmptied: () => {\n this.dispatchEvent('stop');\n this.stop();\n }\n });\n } else {\n listLoader.reset();\n }\n\n const reverse = this.searchContext.folderId !== undefined ? false : true;\n if(prev) {\n listLoader.setTargets(prev, next, reverse);\n } else {\n listLoader.reverse = reverse;\n }\n\n listLoader.setSearchContext(this.searchContext);\n listLoader.current = current;\n\n listLoader.load(true);\n listLoader.load(false);\n }\n\n private getPlaybackMediaTypeFromMessage(message: Message.message) {\n const doc = getMediaFromMessage(message) as MyDocument;\n let mediaType: PlaybackMediaType = 'audio';\n if(doc?.type) {\n if(doc.type === 'voice' || doc.type === 'round') {\n mediaType = 'voice';\n } else if(doc.type === 'video') {\n mediaType = 'video';\n }\n }\n\n return mediaType;\n }\n\n public setMedia(media: HTMLMediaElement, message: Message.message) {\n const mediaType = this.getPlaybackMediaTypeFromMessage(message);\n\n this._playbackRate = this.playbackRates[mediaType];\n\n this.playingMedia = media;\n this.playingMediaType = mediaType;\n this.playingMedia.volume = this.volume;\n this.playingMedia.muted = this.muted;\n this.playingMedia.playbackRate = this.playbackRate;\n\n if(mediaType === 'audio') {\n this.playingMedia.loop = this.loop;\n }\n\n if('mediaSession' in navigator) {\n this.setNewMediadata(message);\n }\n }\n\n public setSingleMedia(media?: HTMLMediaElement, message?: Message.message) {\n const playingMedia = this.playingMedia;\n\n const wasPlaying = this.pause();\n\n let onPlay: () => void;\n if(media) {\n onPlay = () => {\n const pip = this.pip;\n if(pip) {\n pip.pause();\n }\n\n this.pauseMediaInOtherTabs();\n };\n\n if(!media.paused) {\n onPlay();\n }\n\n media.addEventListener('play', onPlay);\n } else { // maybe it's voice recording\n this.pauseMediaInOtherTabs();\n }\n\n this.willBePlayed(undefined);\n if(media) this.setMedia(media, message);\n else this.playingMedia = undefined;\n this.toggleSwitchers(false);\n\n return (playPaused = wasPlaying) => {\n this.toggleSwitchers(true);\n\n if(playingMedia) {\n if(this.mediaDetails.get(playingMedia)) {\n this.setMedia(playingMedia, this.getMessageByMedia(playingMedia));\n } else {\n this.next() || this.previous();\n }\n }\n\n // If it's still not cleaned\n if(this.playingMedia === media) {\n this.playingMedia = undefined;\n this.playingMediaType = undefined;\n }\n\n if(media) {\n media.removeEventListener('play', onPlay);\n }\n\n // I don't remember what it was for\n // if(media && this.playingMedia === media) {\n // this.stop();\n // }\n\n if(playPaused) {\n this.play();\n }\n };\n }\n\n public toggleSwitchers(enabled: boolean) {\n this.lockedSwitchers = !enabled;\n }\n\n public setPictureInPicture(video: HTMLVideoElement) {\n this.pip = video;\n\n // let wasPlaying = this.pause();\n\n const listenerSetter = new ListenerSetter();\n listenerSetter.add(video)('leavepictureinpicture', () => {\n if(this.pip !== video) {\n return;\n }\n\n this.pip = undefined;\n // if(wasPlaying) {\n // this.play();\n // }\n\n listenerSetter.removeAll();\n }, {once: true});\n\n listenerSetter.add(video)('play', (e) => {\n if(this.playingMedia !== video) {\n this.pause();\n }\n\n this.pauseMediaInOtherTabs();\n // if(this.pause()) {\n // listenerSetter.add(video)('pause', () => {\n // this.play();\n // }, {once: true});\n // }\n });\n }\n}\n\nconst appMediaPlaybackController = new AppMediaPlaybackController();\nMOUNT_CLASS_TO.appMediaPlaybackController = appMediaPlaybackController;\nexport default appMediaPlaybackController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../environment/mediaMimeTypesSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport mediaSizes from '../helpers/mediaSizes';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport {Message} from '../layer';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport appImManager from '../lib/appManagers/appImManager';\nimport {MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport canSaveMessageMedia from '../lib/appManagers/utils/messages/canSaveMessageMedia';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport {MediaSearchContext} from './appMediaPlaybackController';\nimport AppMediaViewerBase, {MEDIA_VIEWER_CLASSNAME} from './appMediaViewerBase';\nimport {ButtonMenuItemOptionsVerifiable} from './buttonMenu';\nimport PopupDeleteMessages from './popups/deleteMessages';\nimport PopupForward from './popups/forward';\nimport Scrollable from './scrollable';\nimport appSidebarRight from './sidebarRight';\nimport AppSharedMediaTab from './sidebarRight/tabs/sharedMedia';\n\ntype AppMediaViewerTargetType = {\n element: HTMLElement,\n mid: number,\n peerId: PeerId\n};\nexport default class AppMediaViewer extends AppMediaViewerBase<'caption', 'delete' | 'forward', AppMediaViewerTargetType> {\n protected listLoader: SearchListLoader;\n protected btnMenuForward: ButtonMenuItemOptionsVerifiable;\n protected btnMenuDownload: ButtonMenuItemOptionsVerifiable;\n protected btnMenuDelete: ButtonMenuItemOptionsVerifiable;\n\n get searchContext() {\n return this.listLoader.searchContext;\n }\n\n constructor() {\n super(new SearchListLoader({\n processItem: (item) => {\n const isForDocument = this.searchContext.inputFilter._ === 'inputMessagesFilterDocument';\n const {mid, peerId} = item;\n const media: MyPhoto | MyDocument = getMediaFromMessage(item);\n\n if(!media) return;\n\n if(isForDocument && !AppMediaViewer.isMediaCompatibleForDocumentViewer(media)) {\n return;\n }\n\n return {element: null as HTMLElement, mid, peerId};\n }\n }), ['delete', 'forward']);\n\n this.listLoader.onEmptied = () => {\n this.close();\n };\n\n /* const stub = document.createElement('div');\n stub.classList.add(MEDIA_VIEWER_CLASSNAME + '-stub');\n this.content.main.prepend(stub); */\n\n this.content.caption = document.createElement('div');\n this.content.caption.classList.add(MEDIA_VIEWER_CLASSNAME + '-caption', 'spoilers-container'/* , 'media-viewer-stub' */);\n\n let captionTimeout: number;\n const setCaptionTimeout = () => {\n if(captionTimeout) {\n clearTimeout(captionTimeout);\n }\n\n captionTimeout = window.setTimeout(() => {\n captionTimeout = undefined;\n this.content.caption.classList.remove('is-focused');\n }, 800);\n };\n this.content.caption.addEventListener('touchstart', () => {\n if(!mediaSizes.isMobile) return;\n\n this.content.caption.classList.add('is-focused');\n\n if(captionTimeout) {\n clearTimeout(captionTimeout);\n captionTimeout = undefined;\n }\n\n document.addEventListener('touchend', setCaptionTimeout, {once: true});\n });\n\n const captionScrollable = new Scrollable(this.content.caption);\n captionScrollable.onAdditionalScroll = setCaptionTimeout;\n\n // this.content.main.append(this.content.caption);\n this.wholeDiv.append(this.content.caption);\n\n attachClickEvent(this.buttons.delete, this.onDeleteClick);\n\n const buttons: ButtonMenuItemOptionsVerifiable[] = [this.btnMenuForward = {\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick\n }, this.btnMenuDownload = {\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }, this.btnMenuDelete = {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick\n }];\n\n this.setBtnMenuToggle(buttons);\n\n // * constructing html end\n\n this.setListeners();\n }\n\n protected setListeners() {\n super.setListeners();\n attachClickEvent(this.buttons.forward, this.onForwardClick);\n attachClickEvent(this.author.container, this.onAuthorClick);\n\n const onCaptionClick = (e: MouseEvent) => {\n const a = findUpTag(e.target, 'A');\n const spoiler = findUpClassName(e.target, 'spoiler');\n if(a instanceof HTMLAnchorElement && (!spoiler || this.content.caption.classList.contains('is-spoiler-visible'))) { // close viewer if it's t.me/ redirect\n const onclick = a.getAttribute('onclick');\n if(!onclick || onclick.includes('showMaskedAlert')) {\n return;\n }\n\n cancelEvent(e);\n\n this.close().then(() => {\n this.content.caption.removeEventListener('click', onCaptionClick, {capture: true});\n a.click();\n });\n\n return false;\n }\n };\n\n this.content.caption.addEventListener('click', onCaptionClick, {capture: true});\n }\n\n /* public close(e?: MouseEvent) {\n const good = !this.setMoverAnimationPromise;\n const promise = super.close(e);\n\n if(good) { // clear\n this.currentMessageId = 0;\n this.peerId = 0;\n }\n\n return promise;\n } */\n\n protected getMessageByPeer(peerId: PeerId, mid: number) {\n return this.searchContext.isScheduled ? this.managers.appMessagesManager.getScheduledMessageByPeer(peerId, mid) : this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n }\n\n onPrevClick = async(target: AppMediaViewerTargetType) => {\n this.openMedia(await this.getMessageByPeer(target.peerId, target.mid), target.element, -1);\n };\n\n onNextClick = async(target: AppMediaViewerTargetType) => {\n this.openMedia(await this.getMessageByPeer(target.peerId, target.mid), target.element, 1);\n };\n\n onDeleteClick = () => {\n const target = this.target;\n new PopupDeleteMessages(target.peerId, [target.mid], 'chat', () => {\n this.target = {element: this.content.media} as any;\n this.close();\n });\n };\n\n onForwardClick = () => {\n const target = this.target;\n if(target.mid) {\n // appSidebarRight.forwardTab.open([target.mid]);\n new PopupForward({\n [target.peerId]: [target.mid]\n }, () => {\n return this.close();\n });\n }\n };\n\n onAuthorClick = async(e: MouseEvent) => {\n const {mid, peerId} = this.target;\n if(mid && mid !== Number.MAX_SAFE_INTEGER) {\n const threadId = this.searchContext.threadId;\n const message = await this.getMessageByPeer(peerId, mid);\n this.close(e)\n // .then(() => mediaSizes.isMobile ? appSidebarRight.sharedMediaTab.closeBtn.click() : Promise.resolve())\n .then(async() => {\n if(mediaSizes.isMobile) {\n const tab = appSidebarRight.getTab(AppSharedMediaTab);\n if(tab) {\n tab.close();\n }\n }\n\n appImManager.setInnerPeer({\n peerId: message.peerId,\n lastMsgId: mid,\n type: threadId ? 'discussion' : undefined,\n threadId\n });\n });\n }\n };\n\n onDownloadClick = async() => {\n const {peerId, mid} = this.target;\n const message = await this.getMessageByPeer(peerId, mid);\n const media = getMediaFromMessage(message);\n if(!media) return;\n appDownloadManager.downloadToDisc({media, queueId: appImManager.chat.bubbles.lazyLoadQueue.queueId});\n };\n\n private setCaption(message: MyMessage) {\n const caption = (message as Message.message).message;\n let html: Parameters[1] = '';\n if(caption) {\n html = wrapRichText(caption, {\n entities: (message as Message.message).totalEntities\n });\n }\n\n // html = 'Dandelion are a family of flowering plants that grow in many parts of the world.';\n setInnerHTML(this.content.caption.firstElementChild, html);\n this.content.caption.classList.toggle('hide', !caption);\n // this.content.container.classList.toggle('with-caption', !!caption);\n }\n\n public setSearchContext(context: MediaSearchContext) {\n this.listLoader.setSearchContext(context);\n\n return this;\n }\n\n public async openMedia(message: MyMessage, target?: HTMLElement, fromRight = 0, reverse = false,\n prevTargets: AppMediaViewerTargetType[] = [], nextTargets: AppMediaViewerTargetType[] = []/* , needLoadMore = true */) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const mid = message.mid;\n const fromId = (message as Message.message).fwd_from && !message.fromId ? (message as Message.message).fwd_from.from_name : message.fromId;\n const media = getMediaFromMessage(message);\n\n const noForwards = await this.managers.appPeersManager.noForwards(message.peerId);\n const isServiceMessage = message._ === 'messageService';\n const cantForwardMessage = isServiceMessage || !(await this.managers.appMessagesManager.canForward(message));\n const cantDownloadMessage = (isServiceMessage ? noForwards : cantForwardMessage) || !canSaveMessageMedia(message);\n const a: [(HTMLElement | ButtonMenuItemOptionsVerifiable)[], boolean][] = [\n [[this.buttons.forward, this.btnMenuForward], cantForwardMessage],\n [[this.buttons.download, this.btnMenuDownload], cantDownloadMessage],\n [[this.buttons.delete, this.btnMenuDelete], !(await this.managers.appMessagesManager.canDeleteMessage(message))]\n ];\n\n a.forEach(([buttons, hide]) => {\n buttons.forEach((button) => {\n if(button instanceof HTMLElement) {\n button.classList.toggle('hide', hide);\n } else {\n button.verify = () => !hide;\n }\n });\n });\n\n this.wholeDiv.classList.toggle('no-forwards', cantDownloadMessage);\n\n this.setCaption(message);\n const promise = super._openMedia(media, message.date, fromId, fromRight, target, reverse, prevTargets, nextTargets, message/* , needLoadMore */);\n this.target.mid = mid;\n this.target.peerId = message.peerId;\n\n return promise;\n }\n\n public static isMediaCompatibleForDocumentViewer(media: MyPhoto | MyDocument) {\n return media._ === 'photo' || MEDIA_MIME_TYPES_SUPPORTED.has(media.mime_type);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appMediaPlaybackController from '../components/appMediaPlaybackController';\nimport {IS_APPLE_MOBILE, IS_MOBILE} from '../environment/userAgent';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport ListenerSetter, {Listener} from '../helpers/listenerSetter';\nimport {ButtonMenuSync} from '../components/buttonMenu';\nimport {ButtonMenuToggleHandler} from '../components/buttonMenuToggle';\nimport ControlsHover from '../helpers/dom/controlsHover';\nimport {addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen} from '../helpers/dom/fullScreen';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport MediaProgressLine from '../components/mediaProgressLine';\nimport VolumeSelector from '../components/volumeSelector';\nimport debounce from '../helpers/schedulers/debounce';\nimport overlayCounter from '../helpers/overlayCounter';\nimport onMediaLoad from '../helpers/onMediaLoad';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\n\nexport default class VideoPlayer extends ControlsHover {\n private static PLAYBACK_RATES = [0.5, 1, 1.5, 2];\n private static PLAYBACK_RATES_ICONS = ['playback_05', 'playback_1x', 'playback_15', 'playback_2x'];\n\n protected video: HTMLVideoElement;\n protected wrapper: HTMLDivElement;\n protected progress: MediaProgressLine;\n protected skin: 'default';\n\n protected listenerSetter: ListenerSetter;\n protected playbackRateButton: HTMLElement;\n protected pipButton: HTMLElement;\n\n /* protected videoParent: HTMLElement;\n protected videoWhichChild: number; */\n\n protected onPlaybackRackMenuToggle?: (open: boolean) => void;\n protected onPip?: (pip: boolean) => void;\n protected onPipClose?: () => void;\n\n constructor({video, play = false, streamable = false, duration, onPlaybackRackMenuToggle, onPip, onPipClose}: {\n video: HTMLVideoElement,\n play?: boolean,\n streamable?: boolean,\n duration?: number,\n onPlaybackRackMenuToggle?: VideoPlayer['onPlaybackRackMenuToggle'],\n onPip?: VideoPlayer['onPip'],\n onPipClose?: VideoPlayer['onPipClose']\n }) {\n super();\n\n this.video = video;\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('ckin__player');\n\n this.onPlaybackRackMenuToggle = onPlaybackRackMenuToggle;\n this.onPip = onPip;\n this.onPipClose = onPipClose;\n\n this.listenerSetter = new ListenerSetter();\n\n this.setup({\n element: this.wrapper,\n listenerSetter: this.listenerSetter,\n canHideControls: () => {\n return !this.video.paused && (!this.playbackRateButton || !this.playbackRateButton.classList.contains('menu-open'));\n },\n showOnLeaveToClassName: 'media-viewer-caption',\n ignoreClickClassName: 'ckin__controls'\n });\n\n video.parentNode.insertBefore(this.wrapper, video);\n this.wrapper.appendChild(video);\n\n this.skin = 'default';\n\n this.stylePlayer(duration);\n this.setBtnMenuToggle();\n\n if(this.skin === 'default') {\n const controls = this.wrapper.querySelector('.default__controls.ckin__controls') as HTMLDivElement;\n this.progress = new MediaProgressLine(video, streamable);\n controls.prepend(this.progress.container);\n }\n\n if(play/* && video.paused */) {\n const promise = video.play();\n promise.catch((err: Error) => {\n if(err.name === 'NotAllowedError') {\n video.muted = true;\n video.autoplay = true;\n video.play();\n }\n }).finally(() => { // due to autoplay, play will not call\n this.wrapper.classList.toggle('is-playing', !this.video.paused);\n });\n }\n }\n\n private stylePlayer(initDuration: number) {\n const {wrapper, video, skin, listenerSetter} = this;\n\n wrapper.classList.add(skin);\n\n const html = this.buildControls();\n wrapper.insertAdjacentHTML('beforeend', html);\n let timeDuration: HTMLElement;\n\n if(skin === 'default') {\n this.playbackRateButton = this.wrapper.querySelector('.playback-rate') as HTMLElement;\n this.pipButton = this.wrapper.querySelector('.pip') as HTMLElement;\n\n const toggle = wrapper.querySelectorAll('.toggle') as NodeListOf;\n const fullScreenButton = wrapper.querySelector('.fullscreen') as HTMLElement;\n const timeElapsed = wrapper.querySelector('#time-elapsed');\n timeDuration = wrapper.querySelector('#time-duration') as HTMLElement;\n timeDuration.textContent = toHHMMSS(video.duration | 0);\n\n const volumeSelector = new VolumeSelector(listenerSetter);\n\n const leftControls = wrapper.querySelector('.left-controls');\n volumeSelector.btn.classList.remove('btn-icon');\n leftControls.insertBefore(volumeSelector.btn, timeElapsed.parentElement);\n\n Array.from(toggle).forEach((button) => {\n attachClickEvent(button, () => {\n this.togglePlay();\n }, {listenerSetter: this.listenerSetter});\n });\n\n if(this.pipButton) {\n attachClickEvent(this.pipButton, () => {\n this.video.requestPictureInPicture();\n }, {listenerSetter: this.listenerSetter});\n\n const onPip = (pip: boolean) => {\n this.wrapper.style.visibility = pip ? 'hidden': '';\n if(this.onPip) {\n this.onPip(pip);\n }\n };\n\n const debounceTime = 20;\n const debouncedPip = debounce(onPip, debounceTime, false, true);\n\n listenerSetter.add(video)('enterpictureinpicture', () => {\n debouncedPip(true);\n\n listenerSetter.add(video)('leavepictureinpicture', () => {\n const onPause = () => {\n clearTimeout(timeout);\n if(this.onPipClose) {\n this.onPipClose();\n }\n };\n const listener = listenerSetter.add(video)('pause', onPause, {once: true}) as any as Listener;\n const timeout = setTimeout(() => {\n listenerSetter.remove(listener);\n }, debounceTime);\n }, {once: true});\n });\n\n listenerSetter.add(video)('leavepictureinpicture', () => {\n debouncedPip(false);\n });\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n attachClickEvent(video, () => {\n this.togglePlay();\n }, {listenerSetter: this.listenerSetter});\n\n listenerSetter.add(document)('keydown', (e: KeyboardEvent) => {\n if(overlayCounter.overlaysActive > 1 || document.pictureInPictureElement === video) { // forward popup is active, etc\n return;\n }\n\n const {key, code} = e;\n\n let good = true;\n if(code === 'KeyF') {\n this.toggleFullScreen();\n } else if(code === 'KeyM') {\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n } else if(code === 'Space') {\n this.togglePlay();\n } else if(e.altKey && (code === 'Equal' || code === 'Minus')) {\n const add = code === 'Equal' ? 1 : -1;\n const playbackRate = appMediaPlaybackController.playbackRate;\n const idx = VideoPlayer.PLAYBACK_RATES.indexOf(playbackRate);\n const nextIdx = idx + add;\n if(nextIdx >= 0 && nextIdx < VideoPlayer.PLAYBACK_RATES.length) {\n appMediaPlaybackController.playbackRate = VideoPlayer.PLAYBACK_RATES[nextIdx];\n }\n } else if(wrapper.classList.contains('ckin__fullscreen') && (key === 'ArrowLeft' || key === 'ArrowRight')) {\n if(key === 'ArrowLeft') appMediaPlaybackController.seekBackward({action: 'seekbackward'});\n else appMediaPlaybackController.seekForward({action: 'seekforward'});\n } else {\n good = false;\n }\n\n if(good) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n listenerSetter.add(video)('dblclick', () => {\n if(!IS_TOUCH_SUPPORTED) {\n this.toggleFullScreen();\n }\n });\n\n attachClickEvent(fullScreenButton, () => {\n this.toggleFullScreen();\n }, {listenerSetter: this.listenerSetter});\n\n addFullScreenListener(wrapper, this.onFullScreen.bind(this, fullScreenButton), listenerSetter);\n\n listenerSetter.add(video)('timeupdate', () => {\n timeElapsed.textContent = toHHMMSS(video.currentTime | 0);\n });\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('played');\n\n if(!IS_TOUCH_SUPPORTED) {\n listenerSetter.add(video)('play', () => {\n this.hideControls(true);\n });\n }\n }, {once: true});\n\n listenerSetter.add(video)('pause', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(appMediaPlaybackController)('playbackParams', () => {\n this.setPlaybackRateIcon();\n });\n }\n\n listenerSetter.add(video)('play', () => {\n wrapper.classList.add('is-playing');\n });\n\n listenerSetter.add(video)('pause', () => {\n wrapper.classList.remove('is-playing');\n });\n\n if(video.duration || initDuration) {\n timeDuration.textContent = toHHMMSS(Math.round(video.duration || initDuration));\n } else {\n onMediaLoad(video).then(() => {\n timeDuration.textContent = toHHMMSS(Math.round(video.duration));\n });\n }\n }\n\n protected togglePlay() {\n this.video[this.video.paused ? 'play' : 'pause']();\n }\n\n private buildControls() {\n const skin = this.skin;\n if(skin === 'default') {\n return `\n \n
\n
\n
\n
\n \n
\n \n / \n \n
\n
\n
\n \n ${!IS_MOBILE && document.pictureInPictureEnabled ? `` : ''}\n \n
\n
\n
`;\n }\n }\n\n protected setBtnMenuToggle() {\n const buttons: Parameters[0]['buttons'] = VideoPlayer.PLAYBACK_RATES.map((rate, idx) => {\n return {\n // icon: VideoPlayer.PLAYBACK_RATES_ICONS[idx],\n regularText: rate + 'x',\n onClick: () => {\n appMediaPlaybackController.playbackRate = rate;\n }\n };\n });\n const btnMenu = ButtonMenuSync({buttons});\n btnMenu.classList.add('top-left');\n ButtonMenuToggleHandler({\n el: this.playbackRateButton,\n onOpen: this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(true);\n } : undefined,\n onClose: this.onPlaybackRackMenuToggle ? () => {\n this.onPlaybackRackMenuToggle(false);\n } : undefined\n });\n this.playbackRateButton.append(btnMenu);\n\n this.setPlaybackRateIcon();\n }\n\n protected setPlaybackRateIcon() {\n const playbackRateButton = this.playbackRateButton;\n VideoPlayer.PLAYBACK_RATES_ICONS.forEach((className) => {\n className = 'tgico-' + className;\n playbackRateButton.classList.remove(className);\n });\n\n let idx = VideoPlayer.PLAYBACK_RATES.indexOf(appMediaPlaybackController.playbackRate);\n if(idx === -1) idx = VideoPlayer.PLAYBACK_RATES.indexOf(1);\n\n playbackRateButton.classList.add('tgico-' + VideoPlayer.PLAYBACK_RATES_ICONS[idx]);\n }\n\n protected toggleFullScreen() {\n const player = this.wrapper;\n\n // * https://caniuse.com/#feat=fullscreen\n if(IS_APPLE_MOBILE) {\n const video = this.video as any;\n video.webkitEnterFullscreen();\n video.enterFullscreen();\n return;\n }\n\n if(!isFullScreen()) {\n /* const videoParent = this.video.parentElement;\n const videoWhichChild = whichChild(this.video);\n const needVideoRemount = videoParent !== player;\n\n if(needVideoRemount) {\n this.videoParent = videoParent;\n this.videoWhichChild = videoWhichChild;\n player.prepend(this.video);\n } */\n\n requestFullScreen(player);\n } else {\n /* if(this.videoParent) {\n const {videoWhichChild, videoParent} = this;\n if(!videoWhichChild) {\n videoParent.prepend(this.video);\n } else {\n videoParent.insertBefore(this.video, videoParent.children[videoWhichChild]);\n }\n\n this.videoParent = null;\n this.videoWhichChild = -1;\n } */\n\n cancelFullScreen();\n }\n }\n\n protected onFullScreen(fullScreenButton: HTMLElement) {\n const isFull = isFullScreen();\n this.wrapper.classList.toggle('ckin__fullscreen', isFull);\n if(!isFull) {\n fullScreenButton.classList.remove('tgico-smallscreen');\n fullScreenButton.classList.add('tgico-fullscreen');\n fullScreenButton.setAttribute('title', 'Full Screen');\n } else {\n fullScreenButton.classList.remove('tgico-fullscreen');\n fullScreenButton.classList.add('tgico-smallscreen');\n fullScreenButton.setAttribute('title', 'Exit Full Screen');\n }\n }\n\n public cleanup() {\n super.cleanup();\n this.listenerSetter.removeAll();\n this.progress.removeListeners();\n this.onPlaybackRackMenuToggle = this.onPip = undefined;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport deferredPromise from '../helpers/cancellablePromise';\nimport mediaSizes from '../helpers/mediaSizes';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {IS_MOBILE, IS_MOBILE_SAFARI, IS_SAFARI} from '../environment/userAgent';\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {logger} from '../lib/logger';\nimport VideoPlayer from '../lib/mediaPlayer';\nimport rootScope from '../lib/rootScope';\nimport animationIntersector from './animationIntersector';\nimport appMediaPlaybackController, {AppMediaPlaybackController} from './appMediaPlaybackController';\nimport AvatarElement from './avatar';\nimport ButtonIcon from './buttonIcon';\nimport {ButtonMenuItemOptions} from './buttonMenu';\nimport ButtonMenuToggle from './buttonMenuToggle';\nimport ProgressivePreloader from './preloader';\nimport SwipeHandler from './swipeHandler';\nimport {formatFullSentTime} from '../helpers/date';\nimport appNavigationController, {NavigationItem} from './appNavigationController';\nimport {Message} from '../layer';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport renderImageFromUrl, {renderImageFromUrlPromise} from '../helpers/dom/renderImageFromUrl';\nimport getVisibleRect from '../helpers/dom/getVisibleRect';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport fillPropertyValue from '../helpers/fillPropertyValue';\nimport generatePathData from '../helpers/generatePathData';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {doubleRaf, fastRaf} from '../helpers/schedulers';\nimport RangeSelector from './rangeSelector';\nimport windowSize from '../helpers/windowSize';\nimport ListLoader from '../helpers/listLoader';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport {isFullScreen} from '../helpers/dom/fullScreen';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport SearchListLoader from '../helpers/searchListLoader';\nimport createVideo from '../helpers/dom/createVideo';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getStrippedThumbIfNeeded from '../helpers/getStrippedThumbIfNeeded';\nimport setAttachmentSize from '../helpers/setAttachmentSize';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport LazyLoadQueueBase from './lazyLoadQueueBase';\nimport overlayCounter from '../helpers/overlayCounter';\nimport {ThumbCache} from '../lib/storages/thumbs';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport wrapPeerTitle from './wrappers/peerTitle';\nimport {toastNew} from './toast';\n\nconst ZOOM_STEP = 0.5;\nconst ZOOM_INITIAL_VALUE = 1;\nconst ZOOM_MIN_VALUE = 0.5;\nconst ZOOM_MAX_VALUE = 4;\n\n// TODO: масштабирование картинок (не SVG) при ресайзе, и правильный возврат на исходную позицию\n// TODO: картинки \"обрезаются\" если возвращаются или появляются с места, где есть их перекрытие (топбар, поле ввода)\n// TODO: видео в мобильной вёрстке, если показываются элементы управления: если свайпнуть в сторону, то элементы вернутся на место, т.е. прыгнут - это не ок, надо бы замаскировать\n\nexport const MEDIA_VIEWER_CLASSNAME = 'media-viewer';\n\nexport default class AppMediaViewerBase<\n ContentAdditionType extends string,\n ButtonsAdditionType extends string,\n TargetType extends {element: HTMLElement\n}> extends EventListenerBase<{\n setMoverBefore: () => void,\n setMoverAfter: () => void\n}> {\n protected wholeDiv: HTMLElement;\n protected overlaysDiv: HTMLElement;\n protected author: {[k in 'container' | 'avatarEl' | 'nameEl' | 'date']: HTMLElement} = {} as any;\n protected content: {[k in 'main' | 'container' | 'media' | 'mover' | ContentAdditionType]: HTMLElement} = {} as any;\n protected buttons: {[k in 'download' | 'close' | 'prev' | 'next' | 'mobile-close' | 'zoom' | ButtonsAdditionType]: HTMLElement} = {} as any;\n protected topbar: HTMLElement;\n protected moversContainer: HTMLElement;\n\n protected tempId = 0;\n protected preloader: ProgressivePreloader = null;\n protected preloaderStreamable: ProgressivePreloader = null;\n\n // protected targetContainer: HTMLElement = null;\n // protected loadMore: () => void = null;\n\n protected log: ReturnType;\n\n protected isFirstOpen = true;\n\n // protected needLoadMore = true;\n\n protected pageEl = document.getElementById('page-chats') as HTMLDivElement;\n\n protected setMoverPromise: Promise;\n protected setMoverAnimationPromise: Promise;\n\n protected lazyLoadQueue: LazyLoadQueueBase;\n\n protected highlightSwitchersTimeout: number;\n\n protected onDownloadClick: (e: MouseEvent) => void;\n protected onPrevClick: (target: TargetType) => void;\n protected onNextClick: (target: TargetType) => void;\n\n protected videoPlayer: VideoPlayer;\n\n protected zoomElements: {\n container: HTMLElement,\n btnOut: HTMLElement,\n btnIn: HTMLElement,\n rangeSelector: RangeSelector\n } = {} as any;\n // protected zoomValue = ZOOM_INITIAL_VALUE;\n protected zoomSwipeHandler: SwipeHandler;\n protected zoomSwipeStartX = 0;\n protected zoomSwipeStartY = 0;\n protected zoomSwipeX = 0;\n protected zoomSwipeY = 0;\n\n protected ctrlKeyDown: boolean;\n protected releaseSingleMedia: ReturnType;\n protected navigationItem: NavigationItem;\n\n protected managers: AppManagers;\n\n get target() {\n return this.listLoader.current;\n }\n\n set target(value) {\n this.listLoader.current = value;\n }\n\n constructor(\n protected listLoader: ListLoader,\n topButtons: Array['buttons']>\n ) {\n super(false);\n\n this.managers = rootScope.managers;\n\n this.log = logger('AMV');\n this.preloader = new ProgressivePreloader();\n this.preloaderStreamable = new ProgressivePreloader({\n cancelable: false,\n streamable: true\n });\n this.preloader.construct();\n this.preloaderStreamable.construct();\n this.lazyLoadQueue = new LazyLoadQueueBase();\n\n this.wholeDiv = document.createElement('div');\n this.wholeDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-whole');\n\n this.overlaysDiv = document.createElement('div');\n this.overlaysDiv.classList.add('overlays');\n\n const mainDiv = document.createElement('div');\n mainDiv.classList.add(MEDIA_VIEWER_CLASSNAME);\n\n const topbar = this.topbar = document.createElement('div');\n topbar.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar', MEDIA_VIEWER_CLASSNAME + '-appear');\n\n const topbarLeft = document.createElement('div');\n topbarLeft.classList.add(MEDIA_VIEWER_CLASSNAME + '-topbar-left');\n\n this.buttons['mobile-close'] = ButtonIcon('close', {onlyMobile: true});\n\n // * author\n this.author.container = document.createElement('div');\n this.author.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-author', 'no-select');\n const authorRight = document.createElement('div');\n\n this.author.avatarEl = new AvatarElement();\n this.author.avatarEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-userpic', 'avatar-44');\n\n this.author.nameEl = document.createElement('div');\n this.author.nameEl.classList.add(MEDIA_VIEWER_CLASSNAME + '-name');\n\n this.author.date = document.createElement('div');\n this.author.date.classList.add(MEDIA_VIEWER_CLASSNAME + '-date');\n\n authorRight.append(this.author.nameEl, this.author.date);\n\n this.author.container.append(this.author.avatarEl, authorRight);\n\n // * buttons\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add(MEDIA_VIEWER_CLASSNAME + '-buttons');\n\n topButtons.concat(['download', 'zoom', 'close']).forEach((name) => {\n const button = ButtonIcon(name, {noRipple: true});\n this.buttons[name] = button;\n buttonsDiv.append(button);\n });\n\n this.buttons.zoom.classList.add('zoom-in');\n\n // * zoom\n this.zoomElements.container = document.createElement('div');\n this.zoomElements.container.classList.add('zoom-container');\n\n this.zoomElements.btnOut = ButtonIcon('zoomout', {noRipple: true});\n attachClickEvent(this.zoomElements.btnOut, () => this.changeZoom(false));\n this.zoomElements.btnIn = ButtonIcon('zoomin', {noRipple: true});\n attachClickEvent(this.zoomElements.btnIn, () => this.changeZoom(true));\n\n this.zoomElements.rangeSelector = new RangeSelector({\n step: ZOOM_STEP,\n min: ZOOM_MIN_VALUE,\n max: ZOOM_MAX_VALUE,\n withTransition: true\n }, ZOOM_INITIAL_VALUE);\n this.zoomElements.rangeSelector.setListeners();\n this.zoomElements.rangeSelector.setHandlers({\n onScrub: this.setZoomValue,\n onMouseUp: () => this.setZoomValue()\n });\n\n this.zoomElements.container.append(this.zoomElements.btnOut, this.zoomElements.rangeSelector.container, this.zoomElements.btnIn);\n\n this.wholeDiv.append(this.zoomElements.container);\n\n // * content\n this.content.main = document.createElement('div');\n this.content.main.classList.add(MEDIA_VIEWER_CLASSNAME + '-content');\n\n this.content.container = document.createElement('div');\n this.content.container.classList.add(MEDIA_VIEWER_CLASSNAME + '-container');\n\n this.content.media = document.createElement('div');\n this.content.media.classList.add(MEDIA_VIEWER_CLASSNAME + '-media');\n\n this.content.container.append(this.content.media);\n\n this.content.main.append(this.content.container);\n mainDiv.append(this.content.main);\n this.overlaysDiv.append(mainDiv);\n // * overlays end\n\n topbarLeft.append(this.buttons['mobile-close'], this.author.container);\n topbar.append(topbarLeft, buttonsDiv);\n\n this.buttons.prev = document.createElement('div');\n this.buttons.prev.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-left`;\n this.buttons.prev.innerHTML = ``;\n\n this.buttons.next = document.createElement('div');\n this.buttons.next.className = `${MEDIA_VIEWER_CLASSNAME}-switcher ${MEDIA_VIEWER_CLASSNAME}-switcher-right`;\n this.buttons.next.innerHTML = ``;\n\n this.moversContainer = document.createElement('div');\n this.moversContainer.classList.add(MEDIA_VIEWER_CLASSNAME + '-movers');\n\n this.wholeDiv.append(this.overlaysDiv, this.buttons.prev, this.buttons.next, this.topbar, this.moversContainer);\n\n // * constructing html end\n\n this.listLoader.onLoadedMore = () => {\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n };\n\n this.setNewMover();\n }\n\n protected setListeners() {\n attachClickEvent(this.buttons.download, this.onDownloadClick);\n [this.buttons.close, this.buttons['mobile-close'], this.preloaderStreamable.preloader].forEach((el) => {\n attachClickEvent(el, this.close.bind(this));\n });\n\n ([[-1, this.buttons.prev], [1, this.buttons.next]] as [number, HTMLElement][]).forEach(([moveLength, button]) => {\n // attachClickEvent(button, (e) => {\n button.addEventListener('click', (e) => {\n cancelEvent(e);\n if(this.setMoverPromise) return;\n\n this.listLoader.go(moveLength);\n });\n });\n\n attachClickEvent(this.buttons.zoom, () => {\n if(this.isZooming()) this.toggleZoom(false);\n else {\n this.changeZoom(true);\n }\n });\n\n // ! cannot use the function because it'll cancel slide event on touch devices\n // attachClickEvent(this.wholeDiv, this.onClick);\n this.wholeDiv.addEventListener('click', this.onClick);\n\n this.listLoader.onJump = (item, older) => {\n if(older) this.onNextClick(item);\n else this.onPrevClick(item);\n };\n\n if(IS_TOUCH_SUPPORTED) {\n const swipeHandler = new SwipeHandler({\n element: this.wholeDiv,\n onSwipe: (xDiff, yDiff) => {\n if(isFullScreen()) {\n return;\n }\n\n const percents = Math.abs(xDiff) / windowSize.width;\n if(percents > .2 || xDiff > 125) {\n // console.log('will swipe', xDiff);\n\n if(xDiff > 0) {\n this.buttons.prev.click();\n } else {\n this.buttons.next.click();\n }\n\n return true;\n }\n\n const percentsY = Math.abs(yDiff) / windowSize.height;\n if(percentsY > .2 || yDiff > 125) {\n this.close();\n return true;\n }\n\n return false;\n },\n verifyTouchTarget: (evt) => {\n console.log('verify');\n // * Fix for seek input\n if((evt.target as HTMLElement).tagName === 'INPUT' || findUpClassName(evt.target, 'media-viewer-caption')) {\n return false;\n }\n\n return true;\n }\n });\n }\n }\n\n protected toggleZoom(enable?: boolean) {\n const isVisible = this.isZooming();\n if(this.zoomElements.rangeSelector.mousedown || this.ctrlKeyDown) {\n enable = true;\n }\n\n if(isVisible === enable) return;\n\n if(enable === undefined) {\n enable = !isVisible;\n }\n\n this.buttons.zoom.classList.toggle('zoom-in', !enable);\n this.zoomElements.container.classList.toggle('is-visible', enable);\n const zoomValue = enable ? this.zoomElements.rangeSelector.value : 1;\n this.setZoomValue(zoomValue);\n this.zoomElements.rangeSelector.setProgress(zoomValue);\n\n if(this.videoPlayer) {\n this.videoPlayer.lockControls(enable ? false : undefined);\n }\n\n if(enable) {\n if(!this.zoomSwipeHandler) {\n let lastDiffX: number, lastDiffY: number;\n const multiplier = 1;\n this.zoomSwipeHandler = new SwipeHandler({\n element: this.moversContainer,\n onFirstSwipe: () => {\n lastDiffX = lastDiffY = 0;\n this.moversContainer.classList.add('no-transition');\n },\n onSwipe: (xDiff, yDiff) => {\n [xDiff, yDiff] = [xDiff * multiplier, yDiff * multiplier];\n this.zoomSwipeX += xDiff - lastDiffX;\n this.zoomSwipeY += yDiff - lastDiffY;\n [lastDiffX, lastDiffY] = [xDiff, yDiff];\n\n this.setZoomValue();\n },\n onReset: () => {\n this.moversContainer.classList.remove('no-transition');\n },\n cursor: 'move'\n });\n } else {\n this.zoomSwipeHandler.setListeners();\n }\n\n this.zoomElements.rangeSelector.setProgress(zoomValue);\n } else if(!enable) {\n this.zoomSwipeHandler.removeListeners();\n }\n }\n\n protected changeZoom(add: boolean) {\n this.zoomElements.rangeSelector.addProgress(ZOOM_STEP * (add ? 1 : -1));\n this.setZoomValue();\n }\n\n protected setZoomValue = (value = this.zoomElements.rangeSelector.value) => {\n // this.zoomValue = value;\n if(value === ZOOM_INITIAL_VALUE) {\n this.zoomSwipeX = 0;\n this.zoomSwipeY = 0;\n }\n\n this.moversContainer.style.transform = `matrix(${value}, 0, 0, ${value}, ${this.zoomSwipeX}, ${this.zoomSwipeY})`;\n\n this.zoomElements.btnOut.classList.toggle('inactive', value === ZOOM_MIN_VALUE);\n this.zoomElements.btnIn.classList.toggle('inactive', value === ZOOM_MAX_VALUE);\n\n this.toggleZoom(value !== ZOOM_INITIAL_VALUE);\n };\n\n protected isZooming() {\n return this.zoomElements.container.classList.contains('is-visible');\n }\n\n protected setBtnMenuToggle(buttons: ButtonMenuItemOptions[]) {\n const btnMenuToggle = ButtonMenuToggle({buttonOptions: {onlyMobile: true}, direction: 'bottom-left', buttons});\n this.topbar.append(btnMenuToggle);\n }\n\n public close(e?: MouseEvent) {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.setMoverAnimationPromise) return Promise.reject();\n\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n }\n\n this.lazyLoadQueue.clear();\n\n const promise = this.setMoverToTarget(this.target?.element, true).then(({onAnimationEnd}) => onAnimationEnd);\n\n this.listLoader.reset();\n (this.listLoader as SearchListLoader).cleanup && (this.listLoader as SearchListLoader).cleanup();\n this.setMoverPromise = null;\n this.tempId = -1;\n if((window as any).appMediaViewer === this) {\n (window as any).appMediaViewer = undefined;\n }\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n promise.then(() => {\n appSidebarRight.forwardTab.closeBtn.click();\n });\n } */\n\n this.removeGlobalListeners();\n\n this.zoomSwipeHandler = undefined;\n\n promise.finally(() => {\n this.wholeDiv.remove();\n this.toggleOverlay(false);\n });\n\n return promise;\n }\n\n protected toggleOverlay(active: boolean) {\n overlayCounter.isOverlayActive = active;\n animationIntersector.checkAnimations2(active);\n }\n\n protected toggleGlobalListeners(active: boolean) {\n if(active) this.setGlobalListeners();\n else this.removeGlobalListeners();\n }\n\n protected removeGlobalListeners() {\n if(this.zoomSwipeHandler) {\n this.zoomSwipeHandler.removeListeners();\n }\n\n window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n window.removeEventListener('wheel', this.onWheel, {capture: true});\n }\n\n protected setGlobalListeners() {\n if(this.isZooming()) {\n this.zoomSwipeHandler.setListeners();\n }\n\n window.addEventListener('keydown', this.onKeyDown);\n window.addEventListener('keyup', this.onKeyUp);\n if(!IS_TOUCH_SUPPORTED) window.addEventListener('wheel', this.onWheel, {passive: false, capture: true});\n }\n\n onClick = (e: MouseEvent) => {\n if(this.setMoverAnimationPromise) return;\n\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') return;\n cancelEvent(e);\n\n if(IS_TOUCH_SUPPORTED) {\n if(this.highlightSwitchersTimeout) {\n clearTimeout(this.highlightSwitchersTimeout);\n } else {\n this.wholeDiv.classList.add('highlight-switchers');\n }\n\n this.highlightSwitchersTimeout = window.setTimeout(() => {\n this.wholeDiv.classList.remove('highlight-switchers');\n this.highlightSwitchersTimeout = 0;\n }, 3e3);\n\n return;\n }\n\n const isZooming = this.isZooming();\n let mover: HTMLElement = null;\n const classNames = ['ckin__player', 'media-viewer-buttons', 'media-viewer-author', 'media-viewer-caption', 'zoom-container'];\n if(isZooming) {\n classNames.push('media-viewer-movers');\n }\n\n classNames.find((s) => {\n try {\n mover = findUpClassName(target, s);\n if(mover) return true;\n } catch(err) {return false;}\n });\n\n if(/* target === this.mediaViewerDiv */!mover || (!isZooming && (target.tagName === 'IMG' || target.tagName === 'image'))) {\n this.close();\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n // this.log('onKeyDown', e);\n if(overlayCounter.overlaysActive > 1) {\n return;\n }\n\n const key = e.key;\n\n let good = true;\n if(key === 'ArrowRight') {\n this.buttons.next.click();\n } else if(key === 'ArrowLeft') {\n this.buttons.prev.click();\n } else if(key === '-' || key === '=') {\n if(this.ctrlKeyDown) {\n this.changeZoom(key === '=');\n }\n } else {\n good = false;\n }\n\n if(e.ctrlKey || e.metaKey) {\n this.ctrlKeyDown = true;\n }\n\n if(good) {\n cancelEvent(e);\n }\n };\n\n private onKeyUp = (e: KeyboardEvent) => {\n if(overlayCounter.overlaysActive > 1) {\n return;\n }\n\n if(!(e.ctrlKey || e.metaKey)) {\n this.ctrlKeyDown = false;\n\n if(this.isZooming()) {\n this.setZoomValue();\n }\n }\n };\n\n private onWheel = (e: WheelEvent) => {\n if(overlayCounter.overlaysActive > 1 || (findUpClassName(e.target, 'media-viewer-caption') && !this.ctrlKeyDown)) {\n return;\n }\n\n cancelEvent(e);\n\n if(this.ctrlKeyDown) {\n const scrollingUp = e.deltaY < 0;\n // if(!scrollingUp && !this.isZooming()) return;\n this.changeZoom(!!scrollingUp);\n }\n };\n\n protected async setMoverToTarget(target: HTMLElement, closing = false, fromRight = 0) {\n this.dispatchEvent('setMoverBefore');\n\n const mover = this.content.mover;\n\n if(!closing) {\n mover.innerHTML = '';\n // mover.append(this.buttons.prev, this.buttons.next);\n }\n\n const zoomValue = this.isZooming() && closing /* && false */ ? this.zoomElements.rangeSelector.value : ZOOM_INITIAL_VALUE;\n /* if(!(zoomValue > 1 && closing)) */ this.removeCenterFromMover(mover);\n\n const wasActive = fromRight !== 0;\n\n const delay = rootScope.settings.animationsEnabled ? (wasActive ? 350 : 200) : 0;\n // let delay = wasActive ? 350 : 10000;\n\n /* if(wasActive) {\n this.moveTheMover(mover);\n mover = this.setNewMover();\n } */\n\n /* if(DEBUG) {\n this.log('setMoverToTarget', target, closing, wasActive, fromRight);\n } */\n\n let realParent: HTMLElement;\n\n let rect: DOMRect;\n if(target) {\n if(target instanceof AvatarElement || target.classList.contains('grid-item')/* || target.classList.contains('document-ico') */) {\n realParent = target;\n rect = target.getBoundingClientRect();\n } else if(target instanceof SVGImageElement || target.parentElement instanceof SVGForeignObjectElement) {\n realParent = findUpClassName(target, 'attachment');\n rect = realParent.getBoundingClientRect();\n } else if(target.classList.contains('profile-avatars-avatar')) {\n realParent = findUpClassName(target, 'profile-avatars-container');\n rect = realParent.getBoundingClientRect();\n\n // * if not active avatar\n if(closing && target.getBoundingClientRect().left !== rect.left) {\n target = realParent = rect = undefined;\n }\n }\n }\n\n if(!target) {\n target = this.content.media;\n }\n\n if(!rect) {\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n }\n\n let needOpacity = false;\n if(target !== this.content.media && !target.classList.contains('profile-avatars-avatar')) {\n const overflowElement = findUpClassName(realParent, 'scrollable');\n const visibleRect = getVisibleRect(realParent, overflowElement, true);\n\n if(closing && (!visibleRect || visibleRect.overflow.vertical === 2 || visibleRect.overflow.horizontal === 2)) {\n target = this.content.media;\n realParent = target.parentElement as HTMLElement;\n rect = target.getBoundingClientRect();\n } else if(visibleRect && (visibleRect.overflow.vertical === 1 || visibleRect.overflow.horizontal === 1)) {\n needOpacity = true;\n }\n }\n\n const containerRect = this.content.media.getBoundingClientRect();\n\n let transform = '';\n let left: number;\n let top: number;\n\n if(wasActive) {\n left = fromRight === 1 ? windowSize.width : -containerRect.width;\n top = containerRect.top;\n } else {\n left = rect.left;\n top = rect.top;\n }\n\n /* if(zoomValue > 1) { // 33\n // const diffX = (rect.width * zoomValue - rect.width) / 4;\n const diffX = (rect.width * zoomValue - rect.width) / 2;\n const diffY = (rect.height * zoomValue - rect.height) / 4;\n // left -= diffX;\n // top += diffY;\n } */\n\n transform += `translate3d(${left}px,${top}px,0) `;\n\n /* if(wasActive) {\n left = fromRight === 1 ? appPhotosManager.windowW / 2 : -(containerRect.width + appPhotosManager.windowW / 2);\n transform += `translate(${left}px,-50%) `;\n } else {\n left = rect.left - (appPhotosManager.windowW / 2);\n top = rect.top - (appPhotosManager.windowH / 2);\n transform += `translate(${left}px,${top}px) `;\n } */\n\n let aspecter: HTMLDivElement;\n if(target instanceof HTMLImageElement || target instanceof HTMLVideoElement || target.tagName === 'DIV') {\n if(mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter')) {\n aspecter = mover.firstElementChild as HTMLDivElement;\n\n const player = aspecter.querySelector('.ckin__player');\n if(player) {\n const video = player.firstElementChild as HTMLVideoElement;\n aspecter.append(video);\n player.remove();\n }\n\n if(!aspecter.style.cssText) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n mover.classList.remove('active');\n this.setFullAspect(aspecter, containerRect, rect);\n void mover.offsetLeft; // reflow\n mover.classList.add('active');\n }\n } else {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-viewer-aspecter'/* , 'disable-hover' */);\n mover.prepend(aspecter);\n }\n\n aspecter.style.cssText = `width: ${rect.width}px; height: ${rect.height}px; transform: scale3d(${containerRect.width / rect.width}, ${containerRect.height / rect.height}, 1);`;\n }\n\n mover.style.width = containerRect.width + 'px';\n mover.style.height = containerRect.height + 'px';\n\n // const scaleX = rect.width / (containerRect.width * zoomValue);\n // const scaleY = rect.height / (containerRect.height * zoomValue);\n const scaleX = rect.width / containerRect.width;\n const scaleY = rect.height / containerRect.height;\n if(!wasActive) {\n transform += `scale3d(${scaleX},${scaleY},1) `;\n }\n\n let borderRadius = window.getComputedStyle(realParent).getPropertyValue('border-radius');\n const brSplitted = fillPropertyValue(borderRadius) as string[];\n borderRadius = brSplitted.map((r) => (parseInt(r) / scaleX) + 'px').join(' ');\n if(!wasActive) {\n mover.style.borderRadius = borderRadius;\n }\n // let borderRadius = '0px 0px 0px 0px';\n\n if(closing && zoomValue !== 1) {\n // const width = this.moversContainer.scrollWidth * scaleX;\n // const height = this.moversContainer.scrollHeight * scaleY;\n const willBeLeft = windowSize.width / 2 - rect.width / 2;\n const willBeTop = windowSize.height / 2 - rect.height / 2;\n const left = rect.left - willBeLeft/* + (width - rect.width) / 2 */;\n const top = rect.top - willBeTop/* + (height - rect.height) / 2 */;\n this.moversContainer.style.transform = `matrix(${scaleX}, 0, 0, ${scaleY}, ${left}, ${top})`;\n } else {\n mover.style.transform = transform;\n }\n\n needOpacity && (mover.style.opacity = '0'/* !closing ? '0' : '' */);\n\n /* if(wasActive) {\n this.log('setMoverToTarget', mover.style.transform);\n } */\n\n let path: SVGPathElement;\n const isOut = target.classList.contains('is-out');\n\n const deferred = this.setMoverAnimationPromise = deferredPromise();\n const ret = {onAnimationEnd: deferred};\n\n const timeout = setTimeout(() => {\n if(!deferred.isFulfilled && !deferred.isRejected) {\n deferred.resolve();\n }\n }, 1000);\n\n deferred.finally(() => {\n this.dispatchEvent('setMoverAfter');\n\n if(this.setMoverAnimationPromise === deferred) {\n this.setMoverAnimationPromise = null;\n }\n\n clearTimeout(timeout);\n });\n\n if(!closing) {\n let mediaElement: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement;\n let src: string;\n\n // if(target instanceof HTMLVideoElement) {\n const selector = 'video, img, .canvas-thumbnail';\n const queryFrom = target.matches(selector) ? target.parentElement : target;\n const elements = Array.from(queryFrom.querySelectorAll(selector)) as HTMLImageElement[];\n if(elements.length) {\n target = elements.pop();\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if(target instanceof HTMLImageElement) {\n canvas.width = target.naturalWidth;\n canvas.height = target.naturalHeight;\n } else if(target instanceof HTMLVideoElement) {\n canvas.width = target.videoWidth;\n canvas.height = target.videoHeight;\n } else if(target instanceof HTMLCanvasElement) {\n canvas.width = target.width;\n canvas.height = target.height;\n }\n\n canvas.className = 'canvas-thumbnail thumbnail media-photo';\n context.drawImage(target as HTMLImageElement | HTMLCanvasElement, 0, 0);\n target = canvas;\n }\n // }\n\n if(target.tagName === 'DIV' || target.tagName === 'AVATAR-ELEMENT') { // useContainerAsTarget\n const images = Array.from(target.querySelectorAll('img')) as HTMLImageElement[];\n const image = images.pop();\n if(image) {\n mediaElement = new Image();\n src = image.src;\n mover.append(mediaElement);\n }\n /* mediaElement = new Image();\n src = target.style.backgroundImage.slice(5, -2); */\n } else if(target instanceof HTMLImageElement) {\n mediaElement = new Image();\n src = target.src;\n } else if(target instanceof HTMLVideoElement) {\n mediaElement = createVideo();\n mediaElement.src = target.src;\n } else if(target instanceof SVGSVGElement) {\n const clipId = target.dataset.clipId;\n const newClipId = clipId + '-mv';\n\n const {width, height} = containerRect;\n\n const newSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n newSvg.setAttributeNS(null, 'width', '' + width);\n newSvg.setAttributeNS(null, 'height', '' + height);\n\n // нижние два свойства для масштабирования\n newSvg.setAttributeNS(null, 'viewBox', `0 0 ${width} ${height}`);\n newSvg.setAttributeNS(null, 'preserveAspectRatio', 'xMidYMid meet');\n\n newSvg.insertAdjacentHTML('beforeend', target.firstElementChild.outerHTML.replace(clipId, newClipId));\n newSvg.insertAdjacentHTML('beforeend', target.lastElementChild.outerHTML.replace(clipId, newClipId));\n\n // теперь надо выставить новую позицию для хвостика\n const defs = newSvg.firstElementChild;\n const use = defs.firstElementChild.firstElementChild as SVGUseElement;\n if(use instanceof SVGUseElement) {\n let transform = use.getAttributeNS(null, 'transform');\n transform = transform.replace(/translate\\((.+?), (.+?)\\) scale\\((.+?), (.+?)\\)/, (match, x, y, sX, sY) => {\n x = +x;\n if(x !== 2) {\n x = width - (2 / scaleX);\n } else {\n x = 2 / scaleX;\n }\n\n y = height;\n\n return `translate(${x}, ${y}) scale(${+sX / scaleX}, ${+sY / scaleY})`;\n });\n use.setAttributeNS(null, 'transform', transform);\n\n // и новый RECT\n path = defs.firstElementChild.lastElementChild as SVGPathElement;\n\n // код ниже нужен только чтобы скрыть моргание до момента как сработает таймаут\n let d: string;\n const br: [number, number, number, number] = borderRadius.split(' ').map((v) => parseInt(v)) as any;\n if(isOut) d = generatePathData(0, 0, width - 9 / scaleX, height, ...br);\n else d = generatePathData(9 / scaleX, 0, width - 9 / scaleX, height, ...br);\n path.setAttributeNS(null, 'd', d);\n }\n\n const foreignObject = newSvg.lastElementChild;\n foreignObject.setAttributeNS(null, 'width', '' + containerRect.width);\n foreignObject.setAttributeNS(null, 'height', '' + containerRect.height);\n\n mover.prepend(newSvg);\n } else if(target instanceof HTMLCanvasElement) {\n mediaElement = target;\n }\n\n if(aspecter) {\n aspecter.style.borderRadius = borderRadius;\n\n if(mediaElement) {\n aspecter.append(mediaElement);\n }\n }\n\n mediaElement = mover.querySelector('video, img');\n if(mediaElement instanceof HTMLImageElement) {\n mediaElement.classList.add('thumbnail');\n if(!aspecter) {\n mediaElement.style.width = containerRect.width + 'px';\n mediaElement.style.height = containerRect.height + 'px';\n }\n\n if(src) {\n await renderImageFromUrlPromise(mediaElement, src);\n }\n }/* else if(mediaElement instanceof HTMLVideoElement && mediaElement.firstElementChild && ((mediaElement.firstElementChild as HTMLSourceElement).src || src)) {\n await new Promise((resolve, reject) => {\n mediaElement.addEventListener('loadeddata', resolve);\n\n if(src) {\n (mediaElement.firstElementChild as HTMLSourceElement).src = src;\n }\n });\n } */\n\n mover.style.display = '';\n\n fastRaf(() => {\n mover.classList.add(wasActive ? 'moving' : 'active');\n });\n } else {\n /* if(mover.classList.contains('center')) {\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n } */\n\n if(target instanceof SVGSVGElement) {\n path = mover.querySelector('path');\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, false, isOut, borderRadius);\n }\n }\n\n if(target.classList.contains('media-viewer-media')) {\n mover.classList.add('hiding');\n }\n\n this.toggleWholeActive(false);\n\n // return ret;\n\n setTimeout(() => {\n mover.style.borderRadius = borderRadius;\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = borderRadius;\n }\n }, delay / 2);\n\n setTimeout(() => {\n mover.innerHTML = '';\n mover.classList.remove('moving', 'active', 'hiding');\n mover.style.cssText = 'display: none;';\n\n deferred.resolve();\n }, delay);\n\n mover.classList.remove('opening');\n\n return ret;\n }\n\n mover.classList.add('opening');\n\n // await new Promise((resolve) => setTimeout(resolve, 0));\n // await new Promise((resolve) => window.requestAnimationFrame(resolve));\n // * одного RAF'а недостаточно, иногда анимация с одним не срабатывает (преимущественно на мобильных)\n await doubleRaf();\n\n // чтобы проверить установленную позицию - раскомментировать\n // throw '';\n\n // await new Promise((resolve) => setTimeout(resolve, 5e3));\n\n mover.style.transform = `translate3d(${containerRect.left}px,${containerRect.top}px,0) scale3d(1,1,1)`;\n // mover.style.transform = `translate(-50%,-50%) scale(1,1)`;\n needOpacity && (mover.style.opacity = ''/* closing ? '0' : '' */);\n\n if(aspecter) {\n this.setFullAspect(aspecter, containerRect, rect);\n }\n\n // throw '';\n\n setTimeout(() => {\n mover.style.borderRadius = '';\n\n if(mover.firstElementChild) {\n (mover.firstElementChild as HTMLElement).style.borderRadius = '';\n }\n }, 0/* delay / 2 */);\n\n mover.dataset.timeout = '' + setTimeout(() => {\n mover.classList.remove('moving', 'opening');\n\n if(aspecter) { // всё из-за видео, элементы управления скейлятся, так бы можно было этого не делать\n if(mover.querySelector('video') || true) {\n mover.classList.remove('active');\n aspecter.style.cssText = '';\n void mover.offsetLeft; // reflow\n }\n\n // aspecter.classList.remove('disable-hover');\n }\n\n // эти строки нужны для установки центральной позиции, в случае ресайза это будет нужно\n mover.classList.add('center', 'no-transition');\n /* mover.style.left = mover.style.top = '50%';\n mover.style.transform = 'translate(-50%, -50%)';\n void mover.offsetLeft; // reflow */\n\n // это уже нужно для будущих анимаций\n mover.classList.add('active');\n delete mover.dataset.timeout;\n\n deferred.resolve();\n }, delay);\n\n if(path) {\n this.sizeTailPath(path, containerRect, scaleX, delay, true, isOut, borderRadius);\n }\n\n return ret;\n }\n\n protected toggleWholeActive(active: boolean) {\n if(active) {\n this.wholeDiv.classList.add('active');\n } else {\n this.wholeDiv.classList.add('backwards');\n setTimeout(() => {\n this.wholeDiv.classList.remove('active');\n }, 0);\n }\n }\n\n protected setFullAspect(aspecter: HTMLDivElement, containerRect: DOMRect, rect: DOMRect) {\n /* let media = aspecter.firstElementChild;\n let proportion: number;\n if(media instanceof HTMLImageElement) {\n proportion = media.naturalWidth / media.naturalHeight;\n } else if(media instanceof HTMLVideoElement) {\n proportion = media.videoWidth / media.videoHeight;\n } */\n const proportion = containerRect.width / containerRect.height;\n\n let {width, height} = rect;\n /* if(proportion === 1) {\n aspecter.style.cssText = '';\n } else { */\n if(proportion > 0) {\n width = height * proportion;\n } else {\n height = width * proportion;\n }\n\n // this.log('will set style aspecter:', `width: ${width}px; height: ${height}px; transform: scale(${containerRect.width / width}, ${containerRect.height / height});`);\n\n aspecter.style.cssText = `width: ${width}px; height: ${height}px; transform: scale3d(${containerRect.width / width}, ${containerRect.height / height}, 1);`;\n // }\n }\n\n protected sizeTailPath(path: SVGPathElement, rect: DOMRect, scaleX: number, delay: number, upscale: boolean, isOut: boolean, borderRadius: string) {\n const start = Date.now();\n const {width, height} = rect;\n delay = delay / 2;\n\n const br = borderRadius.split(' ').map((v) => parseInt(v));\n\n const step = () => {\n const diff = Date.now() - start;\n\n let progress = delay ? diff / delay : 1;\n if(progress > 1) progress = 1;\n if(upscale) progress = 1 - progress;\n\n const _br: [number, number, number, number] = br.map((v) => v * progress) as any;\n\n let d: string;\n if(isOut) d = generatePathData(0, 0, width - (9 / scaleX * progress), height, ..._br);\n else d = generatePathData(9 / scaleX * progress, 0, width/* width - (9 / scaleX * progress) */, height, ..._br);\n path.setAttributeNS(null, 'd', d);\n\n if(diff < delay) fastRaf(step);\n };\n\n // window.requestAnimationFrame(step);\n step();\n }\n\n protected removeCenterFromMover(mover: HTMLElement) {\n if(mover.classList.contains('center')) {\n // const rect = mover.getBoundingClientRect();\n const rect = this.content.media.getBoundingClientRect();\n mover.style.transform = `translate3d(${rect.left}px,${rect.top}px,0)`;\n mover.classList.remove('center');\n void mover.offsetLeft; // reflow\n mover.classList.remove('no-transition');\n }\n }\n\n protected moveTheMover(mover: HTMLElement, toLeft = true) {\n const windowW = windowSize.width;\n\n this.removeCenterFromMover(mover);\n\n // mover.classList.remove('active');\n mover.classList.add('moving');\n\n if(mover.dataset.timeout) { // и это тоже всё из-за скейла видео, так бы это не нужно было\n clearTimeout(+mover.dataset.timeout);\n }\n\n const rect = mover.getBoundingClientRect();\n\n const newTransform = mover.style.transform.replace(/translate3d\\((.+?),/, (match, p1) => {\n const x = toLeft ? -rect.width : windowW;\n // const x = toLeft ? -(rect.right + (rect.width / 2)) : windowW / 2;\n\n return match.replace(p1, x + 'px');\n });\n\n // //////this.log('set newTransform:', newTransform, mover.style.transform, toLeft);\n mover.style.transform = newTransform;\n\n setTimeout(() => {\n mover.remove();\n }, 350);\n }\n\n protected setNewMover() {\n const newMover = document.createElement('div');\n newMover.classList.add('media-viewer-mover');\n newMover.style.display = 'none';\n\n if(this.content.mover) {\n const oldMover = this.content.mover;\n oldMover.parentElement.append(newMover);\n } else {\n this.moversContainer.append(newMover);\n }\n\n return this.content.mover = newMover;\n }\n\n protected updateMediaSource(target: HTMLElement, url: string, tagName: 'video' | 'img') {\n // if(target instanceof SVGSVGElement) {\n const el = target.tagName.toLowerCase() === tagName ? target : target.querySelector(tagName) as HTMLElement;\n if(el && !findUpClassName(target, 'document')) {\n if(findUpClassName(target, 'attachment')) {\n // two parentElements because element can be contained in aspecter\n const preloader = target.parentElement.parentElement.querySelector('.preloader-container') as HTMLElement;\n if(preloader) {\n if(tagName === 'video') {\n if(preloader.classList.contains('manual')) {\n preloader.click();\n // return;\n }\n\n return;\n }\n\n preloader.remove();\n }\n }\n\n if((el as HTMLImageElement).src !== url) {\n renderImageFromUrl(el, url);\n }\n\n // ! костыль, но он тут даже и не нужен\n if(el.classList.contains('thumbnail') && el.parentElement.classList.contains('media-container-aspecter')) {\n el.classList.remove('thumbnail');\n }\n }\n /* } else {\n\n } */\n }\n\n protected setAuthorInfo(fromId: PeerId | string, timestamp: number) {\n const isPeerId = fromId.isPeerId();\n let wrapTitlePromise: Promise | HTMLElement;\n if(isPeerId) {\n wrapTitlePromise = wrapPeerTitle({\n peerId: fromId as PeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n })\n } else {\n const title = wrapTitlePromise = document.createElement('span');\n title.append(wrapEmojiText(fromId));\n title.classList.add('peer-title');\n }\n\n const oldAvatar = this.author.avatarEl;\n const newAvatar = this.author.avatarEl = (oldAvatar.cloneNode() as AvatarElement);\n\n return Promise.all([\n (this.author.avatarEl as AvatarElement).updateWithOptions({\n peerId: fromId as PeerId || NULL_PEER_ID,\n peerTitle: isPeerId ? undefined : '' + fromId\n }),\n\n wrapTitlePromise\n ]).then(([_, title]) => {\n if(this.author.avatarEl !== newAvatar) {\n return;\n }\n\n replaceContent(this.author.date, formatFullSentTime(timestamp));\n replaceContent(this.author.nameEl, title);\n oldAvatar.replaceWith(this.author.avatarEl);\n });\n }\n\n protected async _openMedia(\n media: MyDocument | MyPhoto,\n timestamp: number,\n fromId: PeerId | string,\n fromRight: number,\n target?: HTMLElement,\n reverse = false,\n prevTargets: TargetType[] = [],\n nextTargets: TargetType[] = [],\n message?: MyMessage\n /* , needLoadMore = true */\n ) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n /* if(DEBUG) {\n this.log('openMedia:', media, fromId, prevTargets, nextTargets);\n } */\n\n const setAuthorPromise = this.setAuthorInfo(fromId, timestamp);\n\n const isDocument = media._ === 'document';\n const isVideo = isDocument && media.mime_type && ((['video', 'gif'] as MyDocument['type'][]).includes(media.type) || media.mime_type.indexOf('video/') === 0);\n\n if(this.isFirstOpen) {\n // this.targetContainer = targetContainer;\n // this.needLoadMore = needLoadMore;\n this.isFirstOpen = false;\n this.listLoader.setTargets(prevTargets, nextTargets, reverse);\n (window as any).appMediaViewer = this;\n // this.loadMore = loadMore;\n\n /* if(appSidebarRight.historyTabIDs.slice(-1)[0] === AppSidebarRight.SLIDERITEMSIDS.forward) {\n appSidebarRight.forwardTab.closeBtn.click();\n await new Promise((resolve) => setTimeout(resolve, 200));\n } */\n }\n\n if(this.listLoader.next.length < 10) {\n setTimeout(() => {\n this.listLoader.load(true);\n }, 0);\n }\n\n // if(prevTarget && (!prevTarget.parentElement || !this.isElementVisible(this.targetContainer, prevTarget))) prevTarget = null;\n // if(nextTarget && (!nextTarget.parentElement || !this.isElementVisible(this.targetContainer, nextTarget))) nextTarget = null;\n\n this.buttons.prev.classList.toggle('hide', !this.listLoader.previous.length);\n this.buttons.next.classList.toggle('hide', !this.listLoader.next.length);\n\n const container = this.content.media;\n const useContainerAsTarget = !target || target === container;\n if(useContainerAsTarget) target = container;\n\n this.target = {element: target} as any;\n const tempId = ++this.tempId;\n\n if(container.firstElementChild) {\n container.innerHTML = '';\n }\n\n // ok set\n\n const wasActive = fromRight !== 0;\n if(wasActive) {\n this.moveTheMover(this.content.mover, fromRight === 1);\n this.setNewMover();\n } else {\n this.toggleOverlay(true);\n this.setGlobalListeners();\n await setAuthorPromise;\n\n if(!this.wholeDiv.parentElement) {\n this.pageEl.insertBefore(this.wholeDiv, document.getElementById('main-columns'));\n void this.wholeDiv.offsetLeft; // reflow\n }\n\n this.toggleWholeActive(true);\n\n if(!IS_MOBILE_SAFARI) {\n this.navigationItem = {\n type: 'media',\n onPop: (canAnimate) => {\n if(this.setMoverAnimationPromise) {\n return false;\n }\n\n this.close();\n }\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n }\n\n // //////this.log('wasActive:', wasActive);\n\n const mover = this.content.mover;\n\n const maxWidth = windowSize.width;\n // const maxWidth = this.pageEl.scrollWidth;\n // TODO: const maxHeight = mediaSizes.isMobile ? appPhotosManager.windowH : appPhotosManager.windowH - 100;\n let padding = 0;\n const windowH = windowSize.height;\n if(windowH < 1000000 && !mediaSizes.isMobile) {\n padding = 120;\n }\n const maxHeight = windowH - 120 - padding;\n let thumbPromise: Promise = Promise.resolve();\n const size = setAttachmentSize(media, container, maxWidth, maxHeight, mediaSizes.isMobile ? false : true, undefined, !!(isDocument && media.w && media.h)).photoSize;\n if(useContainerAsTarget) {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(media, size.type);\n let img: HTMLImageElement | HTMLCanvasElement;\n if(cacheContext.downloaded) {\n img = new Image();\n img.src = cacheContext.url;\n } else {\n const gotThumb = getStrippedThumbIfNeeded(media, cacheContext, true);\n if(gotThumb) {\n thumbPromise = gotThumb.loadPromise;\n img = gotThumb.image;\n }\n }\n\n if(img) {\n img.classList.add('thumbnail');\n container.append(img);\n }\n }\n\n // need after setAttachmentSize\n /* if(useContainerAsTarget) {\n target = target.querySelector('img, video') || target;\n } */\n\n const supportsStreaming: boolean = !!(isDocument && media.supportsStreaming);\n const preloader = supportsStreaming ? this.preloaderStreamable : this.preloader;\n\n const getCacheContext = () => {\n return this.managers.thumbsStorage.getCacheContext(media, size?.type);\n };\n\n let setMoverPromise: Promise;\n if(isVideo) {\n // //////this.log('will wrap video', media, size);\n\n // потому что для safari нужно создать элемент из event'а\n // const video = document.createElement('video');\n const useController = message && media.type !== 'gif';\n const video = /* useController ?\n appMediaPlaybackController.addMedia(message, false, true) as HTMLVideoElement :\n */createVideo({pip: useController});\n\n if(this.wholeDiv.classList.contains('no-forwards')) {\n video.addEventListener('contextmenu', cancelEvent);\n }\n\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n // return; // set and don't move\n // if(wasActive) return;\n // return;\n\n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n // const video = mover.querySelector('video') || document.createElement('video');\n\n const moverVideo = mover.querySelector('video');\n if(moverVideo) {\n moverVideo.remove();\n }\n\n // video.src = '';\n\n video.setAttribute('playsinline', 'true');\n\n // * fix for playing video if viewer is closed (https://contest.com/javascript-web-bonus/entry1425#issue11629)\n video.addEventListener('timeupdate', () => {\n if(this.tempId !== tempId) {\n video.pause();\n }\n });\n\n this.addEventListener('setMoverAfter', () => {\n video.src = '';\n video.load();\n }, {once: true});\n\n if(IS_SAFARI) {\n // test stream\n // video.controls = true;\n video.autoplay = true;\n }\n\n if(media.type === 'gif') {\n video.muted = true;\n video.autoplay = true;\n video.loop = true;\n } else if(media.duration < 60) {\n video.loop = true;\n }\n\n // if(!video.parentElement) {\n div.append(video);\n // }\n\n const canPlayThrough = new Promise((resolve) => {\n video.addEventListener('canplay', resolve, {once: true});\n });\n\n const createPlayer = () => {\n if(media.type !== 'gif') {\n video.dataset.ckin = 'default';\n video.dataset.overlay = '1';\n\n Promise.all([canPlayThrough, onAnimationEnd]).then(() => {\n if(this.tempId !== tempId) {\n return;\n }\n\n // const play = useController ? appMediaPlaybackController.willBePlayedMedia === video : true;\n const play = true;\n const player = this.videoPlayer = new VideoPlayer({\n video,\n play,\n streamable: supportsStreaming,\n onPlaybackRackMenuToggle: (open) => {\n this.wholeDiv.classList.toggle('hide-caption', !!open);\n },\n onPip: (pip) => {\n const otherMediaViewer = (window as any).appMediaViewer;\n if(!pip && otherMediaViewer && otherMediaViewer !== this) {\n this.releaseSingleMedia = undefined;\n this.close();\n return;\n }\n\n const mover = this.moversContainer.lastElementChild as HTMLElement;\n mover.classList.toggle('hiding', pip);\n this.toggleWholeActive(!pip);\n this.toggleOverlay(!pip);\n this.toggleGlobalListeners(!pip);\n\n if(this.navigationItem) {\n if(pip) appNavigationController.removeItem(this.navigationItem);\n else appNavigationController.pushItem(this.navigationItem);\n }\n\n if(useController) {\n if(pip) {\n // appMediaPlaybackController.toggleSwitchers(true);\n\n this.releaseSingleMedia(false);\n this.releaseSingleMedia = undefined;\n\n appMediaPlaybackController.setPictureInPicture(video);\n } else {\n this.releaseSingleMedia = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n }\n }\n },\n onPipClose: () => {\n // this.target = undefined;\n // this.toggleWholeActive(false);\n // this.toggleOverlay(false);\n this.close();\n }\n });\n player.addEventListener('toggleControls', (show) => {\n this.wholeDiv.classList.toggle('has-video-controls', show);\n });\n\n this.addEventListener('setMoverBefore', () => {\n this.wholeDiv.classList.remove('has-video-controls');\n this.videoPlayer.cleanup();\n this.videoPlayer = undefined;\n }, {once: true});\n\n if(this.isZooming()) {\n this.videoPlayer.lockControls(false);\n }\n /* div.append(video);\n mover.append(player.wrapper); */\n });\n }\n };\n\n if(supportsStreaming) {\n onAnimationEnd.then(() => {\n if(video.readyState < video.HAVE_FUTURE_DATA) {\n // console.log('ppp 1');\n preloader.attach(mover, true);\n }\n\n /* canPlayThrough.then(() => {\n preloader.detach();\n }); */\n });\n\n const attachCanPlay = () => {\n video.addEventListener('canplay', () => {\n // console.log('ppp 2');\n preloader.detach();\n video.parentElement.classList.remove('is-buffering');\n }, {once: true});\n };\n\n video.addEventListener('waiting', () => {\n const loading = video.networkState === video.NETWORK_LOADING;\n const isntEnoughData = video.readyState < video.HAVE_FUTURE_DATA;\n\n // this.log('video waiting for progress', loading, isntEnoughData);\n if(loading && isntEnoughData) {\n attachCanPlay();\n\n // console.log('ppp 3');\n preloader.attach(mover, true);\n\n // поставлю класс для плеера, чтобы убрать большую иконку пока прелоадер на месте\n video.parentElement.classList.add('is-buffering');\n }\n });\n\n if(this.wholeDiv.classList.contains('no-forwards')) {\n video.addEventListener('contextmenu', (e) => {\n cancelEvent(e);\n });\n }\n\n attachCanPlay();\n }\n\n // if(!video.src || media.url !== video.src) {\n const load = async() => {\n /* if(useController) {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n } */\n\n const promise: Promise = supportsStreaming ? Promise.resolve() : appDownloadManager.downloadMediaURL({media});\n\n if(!supportsStreaming) {\n onAnimationEnd.then(async() => {\n if(!(await getCacheContext()).url) {\n // console.log('ppp 4');\n preloader.attach(mover, true, promise);\n }\n });\n }\n\n Promise.all([promise, onAnimationEnd]).then(async() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed video');\n return;\n }\n\n const url = (await getCacheContext()).url;\n\n video.addEventListener('error', () => {\n toastNew({\n langPackKey: IS_MOBILE ? 'Video.Unsupported.Mobile' : 'Video.Unsupported.Desktop'\n });\n\n if(video.error.code !== 4) {\n this.log.error('Error ' + video.error.code + '; details: ' + video.error.message);\n }\n\n preloader?.detach();\n }, {once: true});\n\n if(target instanceof SVGSVGElement/* && (video.parentElement || !isSafari) */) { // if video exists\n // if(!video.parentElement) {\n div.firstElementChild.lastElementChild.append(video);\n // }\n } else {\n renderImageFromUrl(video, url);\n }\n\n // * have to set options (especially playbackRate) after src\n // * https://github.com/videojs/video.js/issues/2516\n if(useController) {\n this.releaseSingleMedia = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n\n this.addEventListener('setMoverBefore', () => {\n if(this.releaseSingleMedia) {\n this.releaseSingleMedia();\n this.releaseSingleMedia = undefined;\n }\n }, {once: true});\n }\n\n this.updateMediaSource(target, url, 'video');\n\n createPlayer();\n });\n\n return promise;\n };\n\n this.lazyLoadQueue.unshift({load});\n // } else createPlayer();\n });\n\n setMoverPromise = thumbPromise.then(set);\n } else {\n const set = () => this.setMoverToTarget(target, false, fromRight).then(({onAnimationEnd}) => {\n // return; // set and don't move\n // if(wasActive) return;\n // return;\n\n const load = async() => {\n const cancellablePromise = isDocument ? appDownloadManager.downloadMediaURL({media}) : appDownloadManager.downloadMediaURL({media, thumb: size});\n\n onAnimationEnd.then(async() => {\n if(!(await getCacheContext()).url) {\n this.preloader.attachPromise(cancellablePromise);\n // this.preloader.attach(mover, true, cancellablePromise);\n }\n });\n\n Promise.all([onAnimationEnd, cancellablePromise]).then(async() => {\n if(this.tempId !== tempId) {\n this.log.warn('media viewer changed photo');\n return;\n }\n\n // /////this.log('indochina', blob);\n\n const url = (await getCacheContext()).url;\n if(target instanceof SVGSVGElement) {\n this.updateMediaSource(target, url, 'img');\n this.updateMediaSource(mover, url, 'img');\n\n if(mediaSizes.isMobile) {\n const imgs = mover.querySelectorAll('img');\n if(imgs && imgs.length) {\n imgs.forEach((img) => {\n img.classList.remove('thumbnail'); // может здесь это вообще не нужно\n });\n }\n }\n } else {\n const div = mover.firstElementChild && mover.firstElementChild.classList.contains('media-viewer-aspecter') ? mover.firstElementChild : mover;\n const haveImage = div.firstElementChild?.tagName === 'IMG' ? div.firstElementChild as HTMLImageElement : null;\n if(!haveImage || haveImage.src !== url) {\n const image = new Image();\n image.classList.add('thumbnail');\n\n // this.log('will renderImageFromUrl:', image, div, target);\n\n renderImageFromUrl(image, url, () => {\n this.updateMediaSource(target, url, 'img');\n\n if(haveImage) {\n fastRaf(() => {\n haveImage.remove();\n });\n }\n\n div.append(image);\n });\n }\n }\n\n // this.preloader.detach();\n }).catch((err) => {\n this.log.error(err);\n this.preloader.attach(mover);\n this.preloader.setManual();\n });\n\n return cancellablePromise;\n };\n\n this.lazyLoadQueue.unshift({load});\n });\n\n setMoverPromise = thumbPromise.then(set);\n }\n\n return this.setMoverPromise = setMoverPromise.catch(() => {\n this.setMoverAnimationPromise = null;\n }).finally(() => {\n this.setMoverPromise = null;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function fillPropertyValue(str: string) {\n const splitted = str.split(' ');\n if(splitted.length !== 4) {\n if(!splitted[0]) splitted[0] = '0px';\n for(let i = splitted.length; i < 4; ++i) {\n splitted[i] = splitted[i % 2] || splitted[0] || '0px';\n }\n }\n\n return splitted;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {IS_MOBILE_SAFARI} from '../environment/userAgent';\nimport {logger} from '../lib/logger';\nimport blurActiveElement from '../helpers/dom/blurActiveElement';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport isSwipingBackSafari from '../helpers/dom/isSwipingBackSafari';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\n\nexport type NavigationItem = {\n type: 'left' | 'right' | 'im' | 'chat' | 'popup' | 'media' | 'menu' |\n 'esg' | 'multiselect' | 'input-helper' | 'autocomplete-helper' | 'markup' |\n 'global-search' | 'voice' | 'mobile-search' | 'filters' | 'global-search-focus' |\n 'toast' | 'dropdown' | 'forum',\n onPop: (canAnimate: boolean) => boolean | void,\n onEscape?: () => boolean,\n noHistory?: boolean,\n noBlurOnPop?: boolean,\n};\n\nexport class AppNavigationController {\n private navigations: Array;\n private id: number;\n private manual: boolean;\n private log: ReturnType;\n private debug: boolean;\n private currentHash: string; // have to start with # if not empty\n private overriddenHash: string; // have to start with # if not empty\n private isPossibleSwipe: boolean;\n public onHashChange: () => void;\n\n constructor() {\n this.navigations = [];\n this.id = Date.now();\n this.manual = false;\n this.log = logger('NC');\n this.debug = true;\n this.currentHash = window.location.hash;\n this.overriddenHash = '';\n this.isPossibleSwipe = false;\n\n window.addEventListener('popstate', this.onPopState);\n window.addEventListener('keydown', this.onKeyDown, {capture: true, passive: false});\n\n if(IS_MOBILE_SAFARI) {\n const options = {passive: true};\n window.addEventListener('touchstart', this.onTouchStart, options);\n }\n\n history.scrollRestoration = 'manual';\n\n this.pushState(); // * push init state\n }\n\n private onPopState = (e: PopStateEvent) => {\n const hash = window.location.hash;\n const id: number = e.state;\n this.debug && this.log('popstate', e, this.isPossibleSwipe, hash);\n if(hash !== this.currentHash) {\n this.debug && this.log.warn(`hash changed, new=${hash}, current=${this.currentHash}, overridden=${this.overriddenHash}`);\n // fix for returning to wrong hash (e.g. chat -> archive -> chat -> 3x back)\n if(id === this.id && this.overriddenHash && this.overriddenHash !== hash) {\n this.overrideHash(this.overriddenHash);\n } else if(id/* === this.id */ && !this.overriddenHash && hash) {\n this.overrideHash();\n } else {\n this.currentHash = hash;\n this.onHashChange && this.onHashChange();\n // this.replaceState();\n return;\n }\n }\n\n if(id !== this.id/* && !this.navigations.length */) {\n this.pushState();\n\n if(!this.navigations.length) {\n return;\n }\n }\n\n const item = this.navigations.pop();\n if(!item) {\n this.pushState();\n return;\n }\n\n this.manual = !this.isPossibleSwipe;\n this.handleItem(item);\n // this.pushState(); // * prevent adding forward arrow\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n const item = this.navigations[this.navigations.length - 1];\n if(!item) return;\n if(e.key === 'Escape' && (item.onEscape ? item.onEscape() : true)) {\n cancelEvent(e);\n this.back(item.type);\n }\n };\n\n private onTouchStart = (e: TouchEvent) => {\n if(e.touches.length > 1) return;\n this.debug && this.log('touchstart');\n\n if(isSwipingBackSafari(e)) {\n this.isPossibleSwipe = true;\n\n window.addEventListener('touchend', () => {\n setTimeout(() => {\n this.isPossibleSwipe = false;\n }, 100);\n }, {passive: true, once: true});\n }\n\n /* const detach = () => {\n window.removeEventListener('touchend', onTouchEnd);\n window.removeEventListener('touchmove', onTouchMove);\n };\n\n let moved = false;\n const onTouchMove = (e: TouchEvent) => {\n this.debug && this.log('touchmove');\n if(e.touches.length > 1) {\n detach();\n return;\n }\n\n moved = true;\n };\n\n const onTouchEnd = (e: TouchEvent) => {\n this.debug && this.log('touchend');\n if(e.touches.length > 1 || !moved) {\n detach();\n return;\n }\n\n isPossibleSwipe = true;\n doubleRaf().then(() => {\n isPossibleSwipe = false;\n });\n\n detach();\n };\n\n window.addEventListener('touchend', onTouchEnd, options);\n window.addEventListener('touchmove', onTouchMove, options); */\n };\n\n public overrideHash(hash: string = '') {\n if(hash && hash[0] !== '#') hash = '#' + hash;\n else if(hash === '#') hash = '';\n\n if(this.currentHash === hash) {\n return;\n }\n\n this.overriddenHash = this.currentHash = hash;\n this.replaceState();\n this.pushState();\n }\n\n private handleItem(item: NavigationItem) {\n const good = item.onPop(!this.manual ? false : undefined);\n this.debug && this.log('popstate, navigation:', item, this.navigations);\n if(good === false) {\n this.pushItem(item);\n } else if(!item.noBlurOnPop) {\n blurActiveElement(); // no better place for it\n }\n\n this.manual = false;\n }\n\n public findItemByType(type: NavigationItem['type']) {\n for(let i = this.navigations.length - 1; i >= 0; --i) {\n const item = this.navigations[i];\n if(item.type === type) {\n return {item, index: i};\n }\n }\n }\n\n public back(type?: NavigationItem['type']) {\n if(type) {\n const ret = this.findItemByType(type);\n if(ret) {\n this.backByItem(ret.item, ret.index);\n return;\n }\n }\n\n history.back();\n }\n\n public backByItem(item: NavigationItem, index = this.navigations.indexOf(item)) {\n this.manual = true;\n // ! commented because 'popstate' event will be fired with delay\n // if(index !== (this.navigations.length - 1)) {\n this.navigations.splice(index, 1);\n this.handleItem(item);\n // }\n }\n\n private onItemAdded(item: NavigationItem) {\n this.debug && this.log('onItemAdded', item, this.navigations);\n\n if(!item.noHistory) {\n this.pushState();\n }\n }\n\n public pushItem(item: NavigationItem) {\n this.navigations.push(item);\n this.onItemAdded(item);\n }\n\n public unshiftItem(item: NavigationItem) {\n this.navigations.unshift(item);\n this.onItemAdded(item);\n }\n\n public spliceItems(index: number, length: number, ...items: NavigationItem[]) {\n this.navigations.splice(index, length, ...items);\n items.forEach((item) => {\n this.onItemAdded(item);\n });\n }\n\n private pushState() {\n this.debug && this.log('push');\n this.manual = false;\n history.pushState(this.id, '');\n }\n\n public replaceState() {\n this.debug && this.log.warn('replace');\n\n const url = location.origin + location.pathname + location.search + this.overriddenHash;\n history.replaceState(this.id, '', url);\n }\n\n public removeItem(item: NavigationItem) {\n if(!item) {\n return;\n }\n\n indexOfAndSplice(this.navigations, item);\n }\n\n public removeByType(type: NavigationItem['type'], single = false) {\n for(let i = this.navigations.length - 1; i >= 0; --i) {\n const item = this.navigations[i];\n if(item.type === type) {\n this.navigations.splice(i, 1);\n\n if(single) {\n break;\n }\n }\n }\n }\n}\n\nconst appNavigationController = new AppNavigationController();\nMOUNT_CLASS_TO.appNavigationController = appNavigationController;\nexport default appNavigationController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from '../lib/appManagers/appDialogsManager';\nimport Scrollable from './scrollable';\nimport InputSearch from './inputSearch';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\n\nexport class SearchGroup {\n container: HTMLDivElement;\n nameEl: HTMLDivElement;\n list: HTMLUListElement;\n\n constructor(\n public name: LangPackKey | boolean,\n public type: string,\n private clearable = true,\n className?: string,\n clickable = true,\n public autonomous = true,\n public onFound?: () => void,\n public noIcons?: boolean\n ) {\n this.list = appDialogsManager.createChatList();\n this.container = document.createElement('div');\n if(className) this.container.className = className;\n\n if(name) {\n this.nameEl = document.createElement('div');\n this.nameEl.classList.add('search-group__name');\n if(typeof(name) === 'string') {\n this.nameEl.append(i18n(name));\n }\n this.container.append(this.nameEl);\n }\n\n this.container.classList.add('search-group', 'search-group-' + type);\n this.container.append(this.list);\n this.container.style.display = 'none';\n\n if(clickable) {\n appDialogsManager.setListClickListener(this.list, onFound, undefined, autonomous);\n }\n }\n\n clear() {\n this.container.style.display = 'none';\n\n if(this.clearable) {\n this.list.innerHTML = '';\n }\n }\n\n setActive() {\n this.container.style.display = '';\n }\n\n toggle() {\n if(this.list.childElementCount) {\n this.setActive();\n } else {\n this.clear();\n }\n }\n}\n\nexport type SearchGroupType = 'contacts' | 'globalContacts' | 'messages' | string;\n\nexport default class AppSearch {\n private minMsgId = 0;\n private loadedCount = -1;\n private foundCount = -1;\n\n private searchPromise: Promise = null;\n private searchTimeout: number = 0;\n\n private query = '';\n\n private listsContainer: HTMLDivElement = null;\n\n private peerId: PeerId; // 0 - means global\n private threadId = 0;\n\n private scrollable: Scrollable;\n\n constructor(\n public container: HTMLElement,\n public searchInput: InputSearch,\n public searchGroups: {[group in SearchGroupType]: SearchGroup},\n public onSearch?: (count: number) => void,\n public noIcons?: boolean\n ) {\n this.scrollable = new Scrollable(this.container);\n this.listsContainer = this.scrollable.container as HTMLDivElement;\n for(const i in this.searchGroups) {\n this.listsContainer.append(this.searchGroups[i as SearchGroupType].container);\n }\n\n if(this.searchGroups.messages) {\n this.scrollable.setVirtualContainer(this.searchGroups.messages.list);\n }\n\n this.searchInput.onChange = (value) => {\n /* if(!value.trim()) {\n //this.peerId = 0;\n return;\n } */\n\n this.query = value;\n this.reset(false);\n this.searchMore();\n };\n\n this.scrollable.onScrolledBottom = () => {\n if(!this.query.trim()) return;\n\n if(!this.searchTimeout) {\n this.searchTimeout = window.setTimeout(() => {\n this.searchMore();\n this.searchTimeout = 0;\n }, 0);\n }\n };\n }\n\n public reset(all = true) {\n if(all) {\n this.searchInput.value = '';\n this.query = '';\n this.peerId = undefined;\n this.threadId = 0;\n }\n\n this.minMsgId = 0;\n this.loadedCount = -1;\n this.foundCount = -1;\n\n for(const i in this.searchGroups) {\n this.searchGroups[i as SearchGroupType].clear();\n }\n\n this.searchPromise = null;\n }\n\n public beginSearch(peerId?: PeerId, threadId = 0, query = '') {\n this.peerId = peerId;\n this.threadId = threadId;\n\n if(this.query !== query) {\n this.searchInput.inputField.value = query;\n }\n\n this.searchInput.input.focus();\n }\n\n public searchMore() {\n if(this.searchPromise) return this.searchPromise;\n\n const query = this.query;\n\n if(!query.trim()) {\n this.onSearch && this.onSearch(0);\n return;\n }\n\n if(this.foundCount !== -1 && this.loadedCount >= this.foundCount) {\n return Promise.resolve();\n }\n\n const maxId = this.minMsgId || 0;\n\n return this.searchPromise = rootScope.managers.appMessagesManager.getSearch({\n peerId: this.peerId,\n query,\n inputFilter: {_: 'inputMessagesFilterEmpty'},\n maxId,\n limit: 20,\n threadId: this.threadId\n }).then((res) => {\n this.searchPromise = null;\n\n if(this.searchInput.value !== query) {\n return;\n }\n\n // console.log('input search result:', this.peerId, query, null, maxId, 20, res);\n\n const {count, history} = res;\n\n if(history.length && history[0].mid === this.minMsgId) {\n history.shift();\n }\n\n const searchGroup = this.searchGroups.messages;\n\n history.forEach((message) => {\n try {\n const peerId = this.peerId ? message.fromId : message.peerId;\n appDialogsManager.addDialogAndSetLastMessage({\n peerId,\n container: this.scrollable/* searchGroup.list */,\n avatarSize: 'bigger',\n meAsSaved: false,\n message,\n query,\n noIcons: this.noIcons\n });\n } catch(err) {\n console.error('[appSearch] render search result', err);\n }\n });\n\n searchGroup.toggle();\n\n this.minMsgId = history.length && history[history.length - 1].mid;\n\n if(this.loadedCount === -1) {\n this.loadedCount = 0;\n }\n this.loadedCount += history.length;\n\n if(this.foundCount === -1) {\n this.foundCount = count;\n\n if(searchGroup.nameEl) {\n replaceContent(searchGroup.nameEl, i18n(count ? 'Chat.Search.MessagesFound' : 'Chat.Search.NoMessagesFound', [count]));\n }\n\n this.onSearch && this.onSearch(this.foundCount);\n }\n }).catch((err) => {\n console.error('search error', err);\n this.searchPromise = null;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyInputMessagesFilter, MyMessage} from '../lib/appManagers/appMessagesManager';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../lib/appManagers/appDialogsManager';\nimport {logger} from '../lib/logger';\nimport rootScope from '../lib/rootScope';\nimport {SearchGroup, SearchGroupType} from './appSearch';\nimport {horizontalMenu} from './horizontalMenu';\nimport LazyLoadQueue from './lazyLoadQueue';\nimport {putPreloader} from './putPreloader';\nimport ripple from './ripple';\nimport Scrollable, {ScrollableX} from './scrollable';\nimport useHeavyAnimationCheck, {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport I18n, {LangPackKey, i18n} from '../lib/langPack';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport {getMiddleware, Middleware} from '../helpers/middleware';\nimport {ChannelParticipant, Chat, ChatFull, ChatParticipant, ChatParticipants, Document, Message, MessageMedia, Photo, WebPage} from '../layer';\nimport SortedUserList from './sortedUserList';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport appSidebarRight from './sidebarRight';\nimport mediaSizes from '../helpers/mediaSizes';\nimport appImManager from '../lib/appManagers/appImManager';\nimport positionElementByIndex from '../helpers/dom/positionElementByIndex';\nimport cleanSearchText from '../helpers/cleanSearchText';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport handleTabSwipe from '../helpers/dom/handleTabSwipe';\nimport windowSize from '../helpers/windowSize';\nimport {formatPhoneNumber} from '../helpers/formatPhoneNumber';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from './buttonMenu';\nimport PopupForward from './popups/forward';\nimport PopupDeleteMessages from './popups/deleteMessages';\nimport Row from './row';\nimport htmlToDocumentFragment from '../helpers/dom/htmlToDocumentFragment';\nimport {SearchSelection} from './chat/selection';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport AppMediaViewer from './appMediaViewer';\nimport lockTouchScroll from '../helpers/dom/lockTouchScroll';\nimport copy from '../helpers/object/copy';\nimport getObjectKeysAndSort from '../helpers/object/getObjectKeysAndSort';\nimport safeAssign from '../helpers/object/safeAssign';\nimport escapeRegExp from '../helpers/string/escapeRegExp';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport {ScrollStartCallbackDimensions} from '../helpers/fastSmoothScroll';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport wrapWebPageDescription from './wrappers/webPageDescription';\nimport wrapWebPageTitle from './wrappers/webPageTitle';\nimport wrapAbbreviation from '../lib/richTextProcessor/wrapAbbreviation';\nimport matchUrl from '../lib/richTextProcessor/matchUrl';\nimport wrapPlainText from '../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport wrapSenderToPeer from './wrappers/senderToPeer';\nimport wrapSentTime from './wrappers/sentTime';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport filterMessagesByInputFilter from '../lib/appManagers/utils/messages/filterMessagesByInputFilter';\nimport getChatMembersString from './wrappers/getChatMembersString';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport getParticipantPeerId from '../lib/appManagers/utils/chats/getParticipantPeerId';\nimport {Awaited} from '../types';\nimport {attachContextMenuListener} from '../helpers/dom/attachContextMenuListener';\nimport contextMenuController from '../helpers/contextMenuController';\nimport positionMenu from '../helpers/positionMenu';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport SwipeHandler from './swipeHandler';\nimport wrapDocument from './wrappers/document';\nimport wrapPhoto from './wrappers/photo';\nimport wrapVideo from './wrappers/video';\nimport noop from '../helpers/noop';\nimport wrapMediaSpoiler, {onMediaSpoilerClick} from './wrappers/mediaSpoiler';\n\n// const testScroll = false;\n\nexport type SearchSuperType = MyInputMessagesFilter/* | 'members' */;\nexport type SearchSuperContext = {\n peerId: PeerId,\n inputFilter: {_: MyInputMessagesFilter},\n query?: string,\n maxId?: number,\n folderId?: number,\n threadId?: number,\n date?: number,\n nextRate?: number,\n minDate?: number,\n maxDate?: number\n};\n\nexport type SearchSuperMediaType = 'members' | 'media' | 'files' | 'links' | 'music' | 'chats' | 'voice';\nexport type SearchSuperMediaTab = {\n inputFilter: SearchSuperType,\n name: LangPackKey,\n type: SearchSuperMediaType,\n contentTab?: HTMLElement,\n menuTab?: HTMLElement,\n scroll?: {scrollTop: number, scrollHeight: number}\n};\n\nclass SearchContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify?: () => boolean | Promise, withSelection?: true})[];\n private element: HTMLElement;\n private target: HTMLElement;\n private peerId: PeerId;\n private mid: number;\n private isSelected: boolean;\n private managers: AppManagers;\n\n constructor(\n private attachTo: HTMLElement,\n private searchSuper: AppSearchSuper,\n private listenerSetter: ListenerSetter\n ) {\n this.managers = searchSuper.managers;\n\n const onContextMenu: Parameters[0]['callback'] = (e) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let item: HTMLElement;\n try {\n item = findUpClassName(e.target, 'search-super-item');\n } catch(e) {}\n\n if(!item) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n const r = async() => {\n this.target = item;\n this.peerId = item.dataset.peerId.toPeerId();\n this.mid = +item.dataset.mid;\n this.isSelected = searchSuper.selection.isMidSelected(this.peerId, this.mid);\n\n await Promise.all(this.buttons.map(async(button) => {\n let good: boolean;\n\n if(this.isSelected && !button.withSelection) {\n good = false;\n } else {\n good = button.verify ? await button.verify() : true;\n }\n\n button.element.classList.toggle('hide', !good);\n }));\n\n item.classList.add('menu-open');\n\n positionMenu(e, this.element);\n contextMenuController.openBtnMenu(this.element, () => {\n item.classList.remove('menu-open');\n });\n };\n\n r();\n };\n\n if(IS_TOUCH_SUPPORTED) {\n\n } else {\n attachContextMenuListener({\n element: attachTo,\n callback: onContextMenu as any,\n listenerSetter\n });\n }\n }\n\n private init() {\n this.buttons = [{\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick,\n verify: async() => this.managers.appMessagesManager.canForward(await this.managers.appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'forward',\n text: 'Message.Context.Selection.Forward',\n onClick: this.onForwardClick,\n verify: () => this.isSelected &&\n !this.searchSuper.selection.selectionForwardBtn.classList.contains('hide'),\n withSelection: true\n }, {\n icon: 'message',\n text: 'Message.Context.Goto',\n onClick: this.onGotoClick,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Select',\n onClick: this.onSelectClick\n }, {\n icon: 'select',\n text: 'Message.Context.Selection.Clear',\n onClick: this.onClearSelectionClick,\n verify: () => this.isSelected,\n withSelection: true\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: async() => this.managers.appMessagesManager.canDeleteMessage(await this.managers.appMessagesManager.getMessageByPeer(this.peerId, this.mid))\n }, {\n icon: 'delete danger',\n text: 'Message.Context.Selection.Delete',\n onClick: this.onDeleteClick,\n verify: () => this.isSelected && !this.searchSuper.selection.selectionDeleteBtn.classList.contains('hide'),\n withSelection: true\n }];\n\n this.element = ButtonMenuSync({buttons: this.buttons, listenerSetter: this.listenerSetter});\n this.element.classList.add('search-contextmenu', 'contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onGotoClick = () => {\n appImManager.setInnerPeer({\n peerId: this.peerId,\n lastMsgId: this.mid,\n threadId: this.searchSuper.searchContext.threadId\n });\n };\n\n private onForwardClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionForwardBtn);\n } else {\n new PopupForward({\n [this.peerId]: [this.mid]\n });\n }\n };\n\n private onSelectClick = () => {\n this.searchSuper.selection.toggleByElement(this.target);\n };\n\n private onClearSelectionClick = () => {\n this.searchSuper.selection.cancelSelection();\n };\n\n private onDeleteClick = () => {\n if(this.searchSuper.selection.isSelecting) {\n simulateClickEvent(this.searchSuper.selection.selectionDeleteBtn);\n } else {\n new PopupDeleteMessages(this.peerId, [this.mid], 'chat');\n }\n };\n}\n\nexport type ProcessSearchSuperResult = {\n message: Message.message,\n middleware: Middleware,\n promises: Promise[],\n elemsToAppend: {element: HTMLElement, message: any}[],\n inputFilter: MyInputMessagesFilter,\n searchGroup?: SearchGroup\n};\n\nexport default class AppSearchSuper {\n public tabs: {[t in SearchSuperType]: HTMLDivElement} = {} as any;\n\n public mediaTab: SearchSuperMediaTab;\n\n public container: HTMLElement;\n public nav: HTMLElement;\n public navScrollableContainer: HTMLDivElement;\n public tabsContainer: HTMLElement;\n public navScrollable: ScrollableX;\n private tabsMenu: HTMLElement;\n private prevTabId = -1;\n\n private lazyLoadQueue = new LazyLoadQueue();\n public middleware = getMiddleware();\n\n public historyStorage: Partial<{[type in SearchSuperType]: {mid: number, peerId: PeerId}[]}> = {};\n public usedFromHistory: Partial<{[type in SearchSuperType]: number}> = {};\n\n public searchContext: SearchSuperContext;\n public loadMutex: Promise = Promise.resolve();\n\n private nextRates: Partial<{[type in SearchSuperType]: number}> = {};\n private loadPromises: Partial<{[type in SearchSuperType]: Promise}> = {};\n private loaded: Partial<{[type in SearchSuperType]: boolean}> = {};\n private loadedChats = false;\n private firstLoad = true;\n\n private log = logger('SEARCH-SUPER');\n public selectTab: ReturnType;\n\n private monthContainers: Partial<{\n [type in SearchSuperType]: {\n [timestamp: number]: {\n container: HTMLElement,\n items: HTMLElement\n }\n }\n }> = {};\n\n private searchGroupMedia: SearchGroup;\n\n public mediaTabsMap: Map = new Map();\n\n private membersList: SortedUserList;\n\n private skipScroll: boolean;\n\n // * arguments\n public mediaTabs: SearchSuperMediaTab[];\n public scrollable: Scrollable;\n public searchGroups?: {[group in SearchGroupType]: SearchGroup};\n public asChatList? = false;\n public groupByMonth? = true;\n public hideEmptyTabs? = true;\n public onChangeTab?: (mediaTab: SearchSuperMediaTab) => void;\n public showSender? = false;\n\n private searchContextMenu: SearchContextMenu;\n public selection: SearchSelection;\n\n public scrollStartCallback: (dimensions: ScrollStartCallbackDimensions) => void;\n\n public managers: AppManagers;\n private loadFirstTimePromise: Promise;\n\n private listenerSetter: ListenerSetter;\n private swipeHandler: SwipeHandler;\n\n constructor(options: Pick) {\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('search-super');\n\n this.listenerSetter = new ListenerSetter();\n this.searchContextMenu = new SearchContextMenu(this.container, this, this.listenerSetter);\n this.selection = new SearchSelection(this, this.managers, this.listenerSetter);\n\n const navScrollableContainer = this.navScrollableContainer = document.createElement('div');\n navScrollableContainer.classList.add('search-super-tabs-scrollable', 'menu-horizontal-scrollable', 'sticky');\n\n const navScrollable = this.navScrollable = new ScrollableX(navScrollableContainer);\n navScrollable.container.classList.add('search-super-nav-scrollable');\n\n const nav = this.nav = document.createElement('nav');\n nav.classList.add('search-super-tabs', 'menu-horizontal-div');\n this.tabsMenu = nav;\n\n navScrollable.container.append(nav);\n\n for(const mediaTab of this.mediaTabs) {\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const i = document.createElement('i');\n\n span.append(i18n(mediaTab.name));\n span.append(i);\n\n menuTab.append(span);\n\n ripple(menuTab);\n\n this.tabsMenu.append(menuTab);\n\n this.mediaTabsMap.set(mediaTab.type, mediaTab);\n\n mediaTab.menuTab = menuTab;\n }\n\n this.tabsContainer = document.createElement('div');\n this.tabsContainer.classList.add('search-super-tabs-container', 'tabs-container');\n\n let unlockScroll: ReturnType;\n if(IS_TOUCH_SUPPORTED) {\n this.swipeHandler = handleTabSwipe({\n element: this.tabsContainer,\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1;\n yDiff *= -1;\n const prevId = this.selectTab.prevId();\n const children = Array.from(this.tabsMenu.children) as HTMLElement[];\n let idx: number;\n if(xDiff > 0) {\n for(let i = prevId + 1; i < children.length; ++i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n } else {\n for(let i = prevId - 1; i >= 0; --i) {\n if(!children[i].classList.contains('hide')) {\n idx = i;\n break;\n }\n }\n }\n\n if(idx !== undefined) {\n unlockScroll = lockTouchScroll(this.tabsContainer);\n this.selectTab(idx);\n }\n }\n });\n }\n\n for(const mediaTab of this.mediaTabs) {\n const container = document.createElement('div');\n container.classList.add('search-super-container-' + mediaTab.type, 'tabs-tab');\n\n const content = document.createElement('div');\n content.classList.add('search-super-content-' + mediaTab.type);\n\n container.append(content);\n\n this.tabsContainer.append(container);\n\n this.tabs[mediaTab.inputFilter] = content;\n\n mediaTab.contentTab = content;\n }\n\n this.container.append(navScrollableContainer, this.tabsContainer);\n\n // * construct end\n\n this.searchGroupMedia = new SearchGroup(false, 'messages', true);\n\n this.scrollable.onScrolledBottom = () => {\n if(this.mediaTab.contentTab && this.canLoadMediaTab(this.mediaTab)/* && false */) {\n // this.log('onScrolledBottom will load media');\n this.load(true);\n }\n };\n // this.scroll.attachSentinels(undefined, 400);\n\n this.selectTab = horizontalMenu(this.tabsMenu, this.tabsContainer, (id, tabContent, animate) => {\n if(this.prevTabId === id && !this.skipScroll) {\n this.scrollable.scrollIntoViewNew({\n element: this.container,\n position: 'start',\n startCallback: this.scrollStartCallback\n });\n return;\n }\n\n const newMediaTab = this.mediaTabs[id];\n if(this.onChangeTab) {\n this.onChangeTab(newMediaTab);\n }\n\n const fromMediaTab = this.mediaTab;\n this.mediaTab = newMediaTab;\n\n if(this.prevTabId !== -1 && animate) {\n this.onTransitionStart();\n }\n\n if(this.skipScroll) {\n this.skipScroll = false;\n } else {\n const offsetTop = this.container.offsetTop;\n let scrollTop = this.scrollable.scrollTop;\n if(scrollTop < offsetTop) {\n this.scrollable.scrollIntoViewNew({\n element: this.container,\n position: 'start',\n startCallback: this.scrollStartCallback\n });\n scrollTop = offsetTop;\n }\n\n fromMediaTab.scroll = {scrollTop: scrollTop, scrollHeight: this.scrollable.scrollHeight};\n\n if(newMediaTab.scroll === undefined) {\n const rect = this.container.getBoundingClientRect();\n const rect2 = this.container.parentElement.getBoundingClientRect();\n const diff = rect.y - rect2.y;\n\n if(scrollTop > diff) {\n newMediaTab.scroll = {scrollTop: diff, scrollHeight: 0};\n }\n }\n\n if(newMediaTab.scroll) {\n const diff = fromMediaTab.scroll.scrollTop - newMediaTab.scroll.scrollTop;\n // console.log('what you gonna do', this.goingHard, diff);\n\n // this.scrollable.scrollTop = scrollTop;\n if(diff/* && diff < 0 */) {\n /* if(diff > -(fromMediaTab.contentTab.scrollHeight + this.nav.scrollHeight)) {\n fromMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n this.scrollable.scrollTop = scrollTop - diff;\n } else { */\n newMediaTab.contentTab.style.transform = `translateY(${diff}px)`;\n // }\n }\n }\n }\n\n /* if(this.prevTabId !== -1 && nav.offsetTop) {\n this.scrollable.scrollTop -= nav.offsetTop;\n } */\n\n /* this.log('setVirtualContainer', id, this.sharedMediaSelected, this.sharedMediaSelected.childElementCount);\n this.scroll.setVirtualContainer(this.sharedMediaSelected); */\n\n if(this.prevTabId !== -1 && !newMediaTab.contentTab.childElementCount) { // quick brown fix\n // this.contentContainer.classList.remove('loaded');\n this.load(true);\n }\n\n this.prevTabId = id;\n }, () => {\n this.scrollable.onScroll();\n\n // console.log('what y', this.tabSelected.style.transform);\n if(this.mediaTab.scroll !== undefined) {\n this.mediaTab.contentTab.style.transform = '';\n this.scrollable.scrollTop = this.mediaTab.scroll.scrollTop;\n }\n\n if(unlockScroll) {\n unlockScroll();\n unlockScroll = undefined;\n }\n\n this.onTransitionEnd();\n }, undefined, navScrollable, this.listenerSetter);\n\n attachClickEvent(this.tabsContainer, (e) => {\n if(this.selection.isSelecting) {\n cancelEvent(e);\n this.selection.toggleByElement(findUpClassName(e.target, 'search-super-item'));\n }\n }, {capture: true, passive: false, listenerSetter: this.listenerSetter});\n\n const onMediaClick = async(className: string, targetClassName: string, inputFilter: MyInputMessagesFilter, e: MouseEvent) => {\n const target = findUpClassName(e.target as HTMLDivElement, className);\n if(!target) return;\n\n const mid = +target.dataset.mid;\n if(!mid) {\n this.log.warn('no messageId by click on target:', target);\n return;\n }\n\n const mediaSpoiler: HTMLElement = target.querySelector('.media-spoiler-container');\n if(mediaSpoiler) {\n onMediaSpoilerClick({\n event: e,\n mediaSpoiler\n })\n return;\n }\n\n const peerId = target.dataset.peerId.toPeerId();\n\n const targets = (Array.from(this.tabs[inputFilter].querySelectorAll('.' + targetClassName)) as HTMLElement[]).map((el) => {\n const containerEl = findUpClassName(el, className);\n return {\n element: el,\n mid: +containerEl.dataset.mid,\n peerId: containerEl.dataset.peerId.toPeerId()\n };\n });\n\n // const ids = Object.keys(this.mediaDivsByIds).map((k) => +k).sort((a, b) => a - b);\n const idx = targets.findIndex((item) => item.mid === mid && item.peerId === peerId);\n\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n new AppMediaViewer()\n .setSearchContext(this.copySearchContext(inputFilter))\n .openMedia(message, targets[idx].element, 0, false, targets.slice(0, idx), targets.slice(idx + 1));\n };\n\n attachClickEvent(this.tabs.inputMessagesFilterPhotoVideo, onMediaClick.bind(null, 'grid-item', 'grid-item', 'inputMessagesFilterPhotoVideo'), {listenerSetter: this.listenerSetter});\n attachClickEvent(this.tabs.inputMessagesFilterDocument, onMediaClick.bind(null, 'document-with-thumb', 'media-container', 'inputMessagesFilterDocument'), {listenerSetter: this.listenerSetter});\n\n /* attachClickEvent(this.tabs.inputMessagesFilterUrl, (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'A') {\n return;\n }\n\n try {\n const a = findUpClassName(target, 'row').querySelector('.anchor-url:last-child') as HTMLAnchorElement;\n a.click();\n } catch(err) {}\n }); */\n\n this.mediaTab = this.mediaTabs[0];\n\n useHeavyAnimationCheck(() => {\n this.lazyLoadQueue.lock();\n }, () => {\n this.lazyLoadQueue.unlockAndRefresh(); // ! maybe not so efficient\n }, this.listenerSetter);\n }\n\n private onTransitionStart = () => {\n this.container.classList.add('sliding');\n };\n\n private onTransitionEnd = () => {\n this.container.classList.remove('sliding');\n };\n\n public filterMessagesByType(messages: any[], type: SearchSuperType): MyMessage[] {\n return filterMessagesByInputFilter(type, messages, messages.length);\n }\n\n private processEmptyFilter({message, searchGroup}: ProcessSearchSuperResult) {\n const loadPromises: Promise[] = [];\n const dialogElement = appDialogsManager.addDialogNew({\n peerId: message.peerId,\n container: searchGroup.list,\n avatarSize: 'bigger',\n loadPromises\n });\n\n const setLastMessagePromise = appDialogsManager.setLastMessageN({\n dialog: {\n _: 'dialog',\n peerId: message.peerId\n } as any,\n lastMessage: message,\n dialogElement,\n highlightWord: this.searchContext.query\n });\n\n loadPromises.push(setLastMessagePromise);\n return Promise.all(loadPromises).then(noop);\n }\n\n private async processPhotoVideoFilter({message, promises, middleware}: ProcessSearchSuperResult) {\n const media = getMediaFromMessage(message);\n\n const div = document.createElement('div');\n div.classList.add('grid-item');\n // this.log(message, photo);\n\n let wrapped: Awaited>;\n const size = choosePhotoSize(media, 200, 200);\n if(media._ !== 'photo') {\n wrapped = await (await wrapVideo({\n doc: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n onlyPreview: true,\n withoutPreloader: true,\n noPlayButton: true,\n photoSize: size\n })).thumb;\n } else {\n wrapped = await wrapPhoto({\n photo: media,\n message,\n container: div,\n boxWidth: 0,\n boxHeight: 0,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n noBlur: true,\n size\n });\n }\n\n if((message.media as MessageMedia.messageMediaPhoto).pFlags.spoiler) {\n const mediaSpoiler = await wrapMediaSpoiler({\n animationGroup: 'chat',\n media,\n middleware,\n width: 140,\n height: 140,\n multiply: 0.3\n });\n\n div.append(mediaSpoiler);\n }\n\n [\n wrapped.images.thumb,\n wrapped.images.full\n ].filter(Boolean).forEach((image) => {\n image.classList.add('grid-item-media');\n });\n\n promises.push(wrapped.loadPromises.thumb);\n\n return {element: div, message};\n }\n\n private async processDocumentFilter({message, inputFilter}: ProcessSearchSuperResult) {\n const document = getMediaFromMessage(message) as Document.document;\n const showSender = this.showSender || (['voice', 'round'] as MyDocument['type'][]).includes(document.type);\n\n const div = await wrapDocument({\n message,\n withTime: !showSender,\n fontWeight: 400,\n voiceAsMusic: true,\n showSender,\n searchContext: this.copySearchContext(inputFilter),\n lazyLoadQueue: this.lazyLoadQueue,\n autoDownloadSize: 0\n });\n\n if((['audio', 'voice', 'round'] as MyDocument['type'][]).includes(document.type)) {\n div.classList.add('audio-48');\n }\n\n return {message, element: div};\n }\n\n private async processUrlFilter({message, promises, middleware}: ProcessSearchSuperResult) {\n let webPage = (message.media as MessageMedia.messageMediaWebPage)?.webpage as WebPage.webPage | WebPage.webPageEmpty;\n\n if(!webPage) {\n const entity = message.totalEntities ? message.totalEntities.find((e: any) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') : null;\n let url: string, display_url: string, sliced: string;\n\n if(!entity) {\n const match = matchUrl(message.message);\n if(!match) {\n return;\n }\n\n url = match[0];\n } else {\n sliced = message.message.slice(entity.offset, entity.offset + entity.length);\n }\n\n if(entity?._ === 'messageEntityTextUrl') {\n url = entity.url;\n // display_url = sliced;\n } else {\n url = url || sliced;\n }\n\n display_url = url;\n\n const same = message.message === url;\n if(!url.match(/^(ftp|http|https):\\/\\//)) {\n display_url = 'https://' + url;\n url = url.includes('@') ? url : 'https://' + url;\n }\n\n display_url = new URL(display_url).hostname;\n\n webPage = {\n _: 'webPage',\n url,\n display_url,\n id: '',\n hash: 0\n };\n\n if(!same) {\n webPage.description = message.message;\n }\n }\n\n if(webPage._ === 'webPageEmpty') {\n return;\n }\n\n const previewDiv = document.createElement('div');\n previewDiv.classList.add('preview');\n\n // this.log('wrapping webpage', webpage);\n\n if(webPage.photo) {\n const res = wrapPhoto({\n container: previewDiv,\n message: null,\n photo: webPage.photo as Photo.photo,\n boxWidth: 0,\n boxHeight: 0,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n size: choosePhotoSize(webPage.photo as Photo.photo, 60, 60, false),\n loadPromises: promises,\n noBlur: true\n });\n } else {\n previewDiv.classList.add('empty');\n setInnerHTML(previewDiv, wrapAbbreviation(webPage.title || webPage.display_url || webPage.description || webPage.url, true));\n }\n\n const title = wrapWebPageTitle(webPage);\n\n const subtitleFragment = wrapWebPageDescription(webPage);\n const aFragment = htmlToDocumentFragment(wrapRichText(webPage.url || ''));\n const a = aFragment.firstElementChild;\n if(a instanceof HTMLAnchorElement) {\n try { // can have 'URIError: URI malformed'\n a.innerText = decodeURIComponent(a.href);\n } catch(err) {\n\n }\n }\n\n if(subtitleFragment.firstChild) {\n subtitleFragment.append('\\n');\n }\n\n subtitleFragment.append(a);\n\n if(this.showSender) {\n subtitleFragment.append('\\n', await wrapSenderToPeer(message));\n }\n\n if(!title.textContent) {\n // title = new URL(webpage.url).hostname;\n title.append(wrapPlainText(webPage.display_url.split('/', 1)[0]));\n }\n\n const row = new Row({\n title,\n titleRight: wrapSentTime(message),\n subtitle: subtitleFragment,\n havePadding: true,\n clickable: true,\n noRipple: true\n });\n\n row.applyMediaElement(previewDiv, 'big');\n\n if(row.container.innerText.trim().length) {\n return {message, element: row.container};\n }\n }\n\n public async performSearchResult(messages: any[], mediaTab: SearchSuperMediaTab, append = true) {\n const elemsToAppend: {element: HTMLElement, message: any}[] = [];\n const sharedMediaDiv: HTMLElement = mediaTab.contentTab;\n const promises: Promise[] = [];\n const middleware = this.middleware.get();\n let inputFilter = mediaTab.inputFilter;\n\n await getHeavyAnimationPromise();\n\n let searchGroup: SearchGroup;\n if(inputFilter === 'inputMessagesFilterPhotoVideo' && !!this.searchContext.query.trim()) {\n inputFilter = 'inputMessagesFilterEmpty';\n searchGroup = this.searchGroupMedia;\n sharedMediaDiv.append(searchGroup.container);\n } else if(inputFilter === 'inputMessagesFilterEmpty') {\n searchGroup = this.searchGroups.messages;\n }\n\n const options: ProcessSearchSuperResult = {\n elemsToAppend,\n inputFilter,\n message: undefined,\n middleware,\n promises,\n searchGroup\n };\n\n let processCallback: (options: ProcessSearchSuperResult) => any;\n\n // https://core.telegram.org/type/MessagesFilter\n switch(inputFilter) {\n case 'inputMessagesFilterEmpty': {\n processCallback = this.processEmptyFilter;\n break;\n }\n\n case 'inputMessagesFilterPhotoVideo': {\n processCallback = this.processPhotoVideoFilter;\n break;\n }\n\n case 'inputMessagesFilterVoice':\n case 'inputMessagesFilterRoundVoice':\n case 'inputMessagesFilterMusic':\n case 'inputMessagesFilterDocument': {\n processCallback = this.processDocumentFilter;\n break;\n }\n\n case 'inputMessagesFilterUrl': {\n processCallback = this.processUrlFilter;\n break;\n }\n\n default:\n // this.log.warn('death is my friend', messages);\n break;\n }\n\n if(processCallback) {\n processCallback = processCallback.bind(this);\n\n type K = {element: HTMLElement, message: Message.message | Message.messageService};\n const results: (Promise | K)[] = messages.map(async(message) => {\n try {\n options.message = message;\n return await processCallback(options);\n } catch(err) {\n this.log.error('error rendering filter', inputFilter, options, message, err);\n }\n });\n\n const awaited = (await Promise.all(results)).filter(Boolean);\n elemsToAppend.push(...awaited);\n }\n\n if(searchGroup && searchGroup.list.childElementCount) {\n searchGroup.setActive();\n }\n\n if(this.loadMutex) {\n promises.push(this.loadMutex);\n }\n\n if(promises.length) {\n await Promise.all(promises);\n if(!middleware()) {\n // this.log.warn('peer changed');\n return;\n }\n }\n\n if(elemsToAppend.length) {\n const method = append ? 'append' : 'prepend';\n elemsToAppend.forEach((details) => {\n const {element, message} = details;\n if(!message) {\n debugger;\n }\n\n const monthContainer = this.getMonthContainerByTimestamp(this.groupByMonth ? message.date : 0, inputFilter);\n element.classList.add('search-super-item');\n element.dataset.mid = '' + message.mid;\n element.dataset.peerId = '' + message.peerId;\n monthContainer.items[method](element);\n\n if(this.selection?.isSelecting) {\n this.selection.toggleElementCheckbox(element, true);\n }\n });\n }\n\n // if(type !== 'inputMessagesFilterEmpty') {\n this.afterPerforming(inputFilter === 'inputMessagesFilterEmpty' ? 1 : elemsToAppend.length, sharedMediaDiv);\n // }\n }\n\n private afterPerforming(length: number, contentTab: HTMLElement) {\n if(contentTab) {\n const parent = contentTab.parentElement;\n Array.from(parent.children).slice(1).forEach((child) => {\n child.remove();\n });\n\n // this.contentContainer.classList.add('loaded');\n\n if(!length && !contentTab.childElementCount) {\n const div = document.createElement('div');\n div.innerText = 'Nothing interesting here yet...';\n div.classList.add('position-center', 'text-center', 'content-empty', 'no-select');\n\n parent.append(div);\n }\n }\n }\n\n private loadChats() {\n const renderedPeerIds: Set = new Set();\n const middleware = this.middleware.get();\n\n for(const i in this.searchGroups) {\n const group = this.searchGroups[i as SearchGroupType];\n this.tabs.inputMessagesFilterEmpty.append(group.container);\n group.clear();\n }\n\n const query = this.searchContext.query;\n if(query) {\n const setResults = (results: PeerId[], group: SearchGroup, showMembersCount = false) => {\n results.map((peerId) => {\n if(renderedPeerIds.has(peerId)) {\n return;\n }\n\n renderedPeerIds.add(peerId);\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: group.list,\n avatarSize: 'abitbigger',\n autonomous: group.autonomous\n });\n\n return {dom, peerId};\n }).filter(Boolean).forEach(async({dom, peerId}) => {\n const peer = await this.managers.appPeersManager.getPeer(peerId);\n if(showMembersCount && ((peer as Chat.channel).participants_count || (peer as any).participants)) {\n const regExp = new RegExp(`(${escapeRegExp(query)}|${escapeRegExp(cleanSearchText(query))})`, 'gi');\n dom.titleSpan.innerHTML = dom.titleSpan.innerHTML.replace(regExp, '$1');\n dom.lastMessageSpan.append(await getChatMembersString(peerId.toChatId()));\n } else if(peerId === rootScope.myId) {\n dom.lastMessageSpan.append(i18n('Presence.YourChat'));\n } else {\n let username = await this.managers.appPeersManager.getPeerUsername(peerId);\n if(!username) {\n const user = await this.managers.appUsersManager.getUser(peerId);\n if(user && user.phone) {\n username = '+' + formatPhoneNumber(user.phone).formatted;\n }\n } else {\n username = '@' + username;\n }\n\n dom.lastMessageSpan.textContent = username;\n }\n });\n\n group.toggle();\n };\n\n const onLoad = (arg: T) => {\n if(!middleware()) {\n return;\n }\n\n // this.loadedContacts = true;\n\n return arg;\n };\n\n return Promise.all([\n this.managers.appUsersManager.getContactsPeerIds(query, true, undefined, 10)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts, this.searchGroups.contacts, true);\n }\n }),\n\n this.managers.appUsersManager.searchContacts(query, 20)\n .then(onLoad)\n .then((contacts) => {\n if(contacts) {\n setResults(contacts.my_results, this.searchGroups.contacts, true);\n setResults(contacts.results/* .concat(contacts.results, contacts.results, contacts.results) */, this.searchGroups.globalContacts);\n\n this.searchGroups.globalContacts.container.classList.add('is-short');\n\n if(this.searchGroups.globalContacts.nameEl.lastElementChild !== this.searchGroups.globalContacts.nameEl.firstElementChild) {\n this.searchGroups.globalContacts.nameEl.lastElementChild.remove();\n }\n\n if(this.searchGroups.globalContacts.list.childElementCount > 3) {\n const showMore = document.createElement('div');\n showMore.classList.add('search-group__show-more');\n const intlElement = new I18n.IntlElement({\n key: 'Separator.ShowMore'\n });\n showMore.append(intlElement.element);\n this.searchGroups.globalContacts.nameEl.append(showMore);\n attachClickEvent(showMore, () => {\n const isShort = this.searchGroups.globalContacts.container.classList.toggle('is-short');\n intlElement.key = isShort ? 'Separator.ShowMore' : 'Separator.ShowLess';\n intlElement.update();\n });\n }\n }\n }),\n\n this.managers.dialogsStorage.getDialogs({query, offsetIndex: 0, limit: 20, filterId: 0})\n .then(onLoad)\n .then((value) => {\n if(value) {\n setResults(value.dialogs.map((d) => d.peerId), this.searchGroups.contacts, true);\n }\n })\n ]);\n } else if(!this.searchContext.peerId && !this.searchContext.minDate) {\n const renderRecentSearch = (setActive = true) => {\n return apiManagerProxy.getState().then((state) => {\n if(!middleware()) {\n return;\n }\n\n this.searchGroups.recent.list.replaceChildren();\n\n state.recentSearch.slice(0, 20).forEach(async(peerId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.searchGroups.recent.list,\n meAsSaved: true,\n avatarSize: 'abitbigger',\n autonomous: true\n });\n\n dom.lastMessageSpan.append(await (peerId.isUser() ?\n getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId())) :\n getChatMembersString(peerId.toChatId())));\n });\n\n if(!state.recentSearch.length) {\n this.searchGroups.recent.clear();\n } else if(setActive) {\n this.searchGroups.recent.setActive();\n }\n });\n };\n\n return Promise.all([\n this.managers.appUsersManager.getTopPeers('correspondents').then((peers) => {\n if(!middleware()) return;\n\n const idx = peers.findIndex((peer) => peer.id === rootScope.myId);\n if(idx !== -1) {\n peers = peers.slice();\n peers.splice(idx, 1);\n }\n\n peers.forEach((peer) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peer.id,\n container: this.searchGroups.people.list,\n onlyFirstName: true,\n avatarSize: 'bigger',\n autonomous: false,\n noIcons: this.searchGroups.people.noIcons\n });\n\n dom.subtitleEl.remove();\n });\n\n this.searchGroups.people.toggle();\n }),\n\n renderRecentSearch()\n ]);\n } else return Promise.resolve();\n }\n\n private async loadMembers(mediaTab: SearchSuperMediaTab) {\n const id = this.searchContext.peerId.toChatId();\n const middleware = this.middleware.get();\n let promise: Promise;\n\n const renderParticipants = async(participants: (ChatParticipant | ChannelParticipant)[]) => {\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n\n if(!this.membersList) {\n this.membersList = new SortedUserList({\n lazyLoadQueue: this.lazyLoadQueue,\n rippleEnabled: false,\n managers: this.managers\n });\n attachClickEvent(this.membersList.list, (e) => {\n const li = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(!li) {\n return;\n }\n\n const peerId = li.dataset.peerId.toPeerId();\n let promise: Promise = Promise.resolve();\n if(mediaSizes.isMobile) {\n promise = appSidebarRight.toggleSidebar(false);\n }\n\n promise.then(() => {\n appImManager.setInnerPeer({peerId});\n });\n });\n mediaTab.contentTab.append(this.membersList.list);\n this.afterPerforming(1, mediaTab.contentTab);\n }\n\n for(const participant of participants) {\n const peerId = getParticipantPeerId(participant);\n if(peerId.isAnyChat()) {\n continue;\n }\n\n const user = await this.managers.appUsersManager.getUser(peerId);\n if(user.pFlags.deleted) {\n continue;\n }\n\n this.membersList.add(peerId);\n }\n };\n\n if(await this.managers.appChatsManager.isChannel(id)) {\n const LOAD_COUNT = !this.membersList ? 50 : 200;\n promise = this.managers.appProfileManager.getChannelParticipants(id, undefined, LOAD_COUNT, this.nextRates[mediaTab.inputFilter]).then((participants) => {\n if(!middleware()) {\n return;\n }\n\n const list = mediaTab.contentTab.firstElementChild as HTMLUListElement;\n this.nextRates[mediaTab.inputFilter] = (list ? list.childElementCount : 0) + participants.participants.length;\n\n if(participants.participants.length < LOAD_COUNT) {\n this.loaded[mediaTab.inputFilter] = true;\n }\n\n return renderParticipants(participants.participants);\n });\n } else {\n promise = this.managers.appProfileManager.getChatFull(id).then((chatFull) => {\n if(!middleware()) {\n return;\n }\n\n // console.log('anymore', chatFull);\n this.loaded[mediaTab.inputFilter] = true;\n const participants = (chatFull as ChatFull.chatFull).participants;\n if(participants._ === 'chatParticipantsForbidden') {\n return;\n }\n\n return renderParticipants(participants.participants);\n });\n }\n\n return this.loadPromises[mediaTab.inputFilter] = promise.finally(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadPromises[mediaTab.inputFilter] = null;\n });\n }\n\n private loadType(mediaTab: SearchSuperMediaTab, justLoad: boolean, loadCount: number, middleware: () => boolean) {\n const type = mediaTab.inputFilter;\n\n if(this.loadPromises[type]) {\n return this.loadPromises[type];\n }\n\n if(mediaTab.type === 'members') {\n return this.loadMembers(mediaTab);\n }\n\n const history = this.historyStorage[type] ??= [];\n\n if(type === 'inputMessagesFilterEmpty' && !history.length) {\n if(!this.loadedChats) {\n this.loadChats();\n this.loadedChats = true;\n }\n\n if(!this.searchContext.query.trim() && !this.searchContext.peerId && !this.searchContext.minDate) {\n this.loaded[type] = true;\n return Promise.resolve();\n }\n }\n\n const promise = this.loadPromises[type] = Promise.resolve().then(async() => {\n // render from cache\n if(history.length && this.usedFromHistory[type] < history.length && !justLoad) {\n const messages: any[] = [];\n let used = Math.max(0, this.usedFromHistory[type]);\n let slicedLength = 0;\n\n do {\n const ids = history.slice(used, used + loadCount);\n used += ids.length;\n slicedLength += ids.length;\n\n const notFilteredMessages = await Promise.all(ids.map((m) => this.managers.appMessagesManager.getMessageByPeer(m.peerId, m.mid)));\n\n messages.push(...this.filterMessagesByType(notFilteredMessages, type));\n } while(slicedLength < loadCount && used < history.length);\n\n // если перебор\n /* if(slicedLength > loadCount) {\n let diff = messages.length - loadCount;\n messages = messages.slice(0, messages.length - diff);\n used -= diff;\n } */\n\n this.usedFromHistory[type] = used;\n // if(messages.length) {\n return this.performSearchResult(messages, mediaTab).finally(() => {\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n // }\n }\n\n const maxId = history.length ? history[history.length - 1].mid : 0;\n\n const value = await this.managers.appMessagesManager.getSearch({\n ...this.searchContext,\n inputFilter: {_: type},\n maxId,\n limit: loadCount,\n nextRate: this.nextRates[type] ??= 0\n });\n\n history.push(...value.history.map((m) => ({mid: m.mid, peerId: m.peerId})));\n\n if(!middleware()) {\n // this.log.warn('peer changed');\n return;\n }\n\n // ! Фикс случая, когда не загружаются документы при открытой панели разработчиков (происходит из-за того, что не совпадают критерии отбора документов в getSearch)\n if(value.history.length < loadCount || (this.searchContext.folderId !== undefined && !value.next_rate) || value.history.length === value.count) {\n // if((value.count || history.length === value.count) && history.length >= value.count) {\n // this.log(logStr + 'loaded all media', value, loadCount);\n this.loaded[type] = true;\n }\n\n this.nextRates[type] = value.next_rate;\n\n if(justLoad) {\n return;\n }\n\n this.usedFromHistory[type] = history.length;\n\n if(!this.loaded[type]) {\n promise.then(() => {\n setTimeout(() => {\n if(!middleware()) return;\n // this.log('will preload more');\n if(this.mediaTab === mediaTab) {\n const promise = this.load(true, true);\n if(promise) {\n promise.then(() => {\n if(!middleware()) return;\n // this.log('preloaded more');\n setTimeout(() => {\n this.scrollable.checkForTriggers();\n }, 0);\n });\n }\n }\n }, 0);\n });\n }\n\n // if(value.history.length) {\n return this.performSearchResult(this.filterMessagesByType(value.history, type), mediaTab);\n // }\n }).catch((err) => {\n this.log.error('load error:', err);\n }).finally(() => {\n this.loadPromises[type] = null;\n });\n\n return promise;\n }\n\n private canLoadMediaTab(mediaTab: SearchSuperMediaTab) {\n const inputFilter = mediaTab.inputFilter;\n return !this.loaded[inputFilter] || (this.historyStorage[inputFilter] && this.usedFromHistory[inputFilter] < this.historyStorage[inputFilter].length);\n }\n\n private async loadFirstTime() {\n const middleware = this.middleware.get();\n const {peerId, threadId} = this.searchContext;\n if(!this.hideEmptyTabs) {\n return;\n }\n\n const mediaTabs = this.mediaTabs.filter((mediaTab) => mediaTab.inputFilter !== 'inputMessagesFilterEmpty');\n const filters = mediaTabs.map((mediaTab) => ({_: mediaTab.inputFilter}));\n\n const [counters, canViewMembers] = await Promise.all([\n this.managers.appMessagesManager.getSearchCounters(peerId, filters, undefined, threadId),\n this.canViewMembers()\n ]);\n\n if(!middleware()) {\n return;\n }\n\n if(this.loadMutex) {\n await this.loadMutex;\n\n if(!middleware()) {\n return;\n }\n }\n\n let firstMediaTab: SearchSuperMediaTab;\n let count = 0;\n mediaTabs.forEach((mediaTab) => {\n const counter = counters.find((c) => c.filter._ === mediaTab.inputFilter);\n\n mediaTab.menuTab.classList.toggle('hide', !counter.count);\n mediaTab.menuTab.classList.remove('active');\n // mediaTab.contentTab.classList.toggle('hide', !counter.count);\n\n if(counter.count) {\n if(firstMediaTab === undefined) {\n firstMediaTab = mediaTab;\n }\n\n ++count;\n }\n });\n\n const membersTab = this.mediaTabsMap.get('members');\n membersTab.menuTab.classList.toggle('hide', !canViewMembers);\n\n if(canViewMembers) {\n firstMediaTab = membersTab;\n ++count;\n }\n\n this.container.classList.toggle('hide', !firstMediaTab);\n this.container.parentElement.classList.toggle('search-empty', !firstMediaTab);\n if(firstMediaTab) {\n this.skipScroll = true;\n this.selectTab(this.mediaTabs.indexOf(firstMediaTab), false);\n // firstMediaTab.menuTab.classList.add('active');\n\n this.navScrollableContainer.classList.toggle('hide', count <= 1);\n }\n }\n\n public async load(single = false, justLoad = false) {\n const peerId = this.searchContext.peerId;\n this.log('load', single, peerId, this.loadPromises);\n const middleware = this.middleware.get();\n\n if(this.firstLoad) {\n await (this.loadFirstTimePromise ??= this.loadFirstTime());\n if(!middleware()) {\n return;\n }\n\n this.loadFirstTimePromise = undefined;\n this.firstLoad = false;\n }\n\n let toLoad = single ? [this.mediaTab] : this.mediaTabs.filter((t) => t !== this.mediaTab);\n toLoad = toLoad.filter((mediaTab) => {\n return this.canLoadMediaTab(mediaTab);\n });\n\n if(peerId.isUser()) {\n findAndSplice(toLoad, (mediaTab) => mediaTab.type === 'members');\n }\n\n if(!toLoad.length) {\n return;\n }\n\n const loadCount = justLoad ? 50 : Math.round((windowSize.height / 130 | 0) * 3 * 1.25); // that's good for all types\n\n const promises: Promise[] = toLoad.map((mediaTab) => {\n return this.loadType(mediaTab, justLoad, loadCount, middleware);\n });\n\n return Promise.all(promises).catch((err) => {\n this.log.error('Load error all promises:', err);\n });\n }\n\n private getMonthContainerByTimestamp(timestamp: number, type: SearchSuperType) {\n const date = new Date(timestamp * 1000);\n date.setHours(0, 0, 0);\n date.setDate(1);\n const dateTimestamp = date.getTime();\n const containers = this.monthContainers[type] ?? (this.monthContainers[type] = {});\n if(!(dateTimestamp in containers)) {\n const container = document.createElement('div');\n container.className = 'search-super-month';\n\n const name = document.createElement('div');\n name.classList.add('search-super-month-name');\n\n const options: Intl.DateTimeFormatOptions = {\n month: 'long'\n };\n\n if(date.getFullYear() !== new Date().getFullYear()) {\n options.year = 'numeric';\n }\n\n const dateElement = new I18n.IntlDateElement({\n date,\n options\n }).element;\n name.append(dateElement);\n\n container.append(name);\n\n const items = document.createElement('div');\n items.classList.add('search-super-month-items');\n\n container.append(name, items);\n\n const haveTimestamps = getObjectKeysAndSort(containers, 'desc');\n let i = 0;\n for(; i < haveTimestamps.length; ++i) {\n const t = haveTimestamps[i];\n if(dateTimestamp > t) {\n break;\n }\n }\n\n containers[dateTimestamp] = {container, items};\n positionElementByIndex(container, this.tabs[type], i);\n }\n\n return containers[dateTimestamp];\n }\n\n public canViewMembers() {\n const {peerId} = this.searchContext;\n const isAnyChat = peerId.isAnyChat();\n if(!isAnyChat) return Promise.resolve(false);\n const chatId = peerId.toChatId();\n return Promise.all([\n this.managers.appChatsManager.isBroadcast(chatId),\n this.managers.appChatsManager.hasRights(chatId, 'view_participants'),\n this.managers.appChatsManager.isForum(chatId)\n ]).then(([isBroadcast, hasRights, isForum]) => {\n return !isBroadcast && hasRights && (!this.searchContext.threadId || !isForum);\n });\n }\n\n public cleanup() {\n this.loadPromises = {};\n this.loaded = {};\n this.loadedChats = false;\n this.nextRates = {};\n this.firstLoad = true;\n this.prevTabId = -1;\n\n this.lazyLoadQueue.clear();\n\n this.mediaTabs.forEach((mediaTab) => {\n this.usedFromHistory[mediaTab.inputFilter] = -1;\n });\n\n if(this.selection?.isSelecting) {\n this.selection.cancelSelection();\n }\n\n // * must go to first tab (это костыль)\n /* const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n const tab = this.canViewMembers() ? membersTab : this.mediaTabs[this.mediaTabs.indexOf(membersTab) + 1];\n this.mediaTab = tab;\n } */\n\n this.middleware.clean();\n this.loadFirstTimePromise = undefined;\n this.cleanScrollPositions();\n this.membersList = undefined;\n }\n\n public cleanScrollPositions() {\n this.mediaTabs.forEach((mediaTab) => {\n mediaTab.scroll = undefined;\n });\n }\n\n public cleanupHTML(goFirst = false) {\n this.mediaTabs.forEach((tab) => {\n tab.contentTab.replaceChildren();\n\n if(this.hideEmptyTabs) {\n // tab.menuTab.classList.add('hide');\n this.container.classList.add('hide');\n this.container.parentElement.classList.add('search-empty');\n }\n\n if(tab.type === 'chats') {\n return;\n }\n\n if(!this.historyStorage[tab.inputFilter]) {\n const parent = tab.contentTab.parentElement;\n // if(!testScroll) {\n if(!parent.querySelector('.preloader')) {\n putPreloader(parent, true);\n }\n // }\n\n const empty = parent.querySelector('.content-empty');\n if(empty) {\n empty.remove();\n }\n }\n });\n\n /* if(goFirst) {\n const membersTab = this.mediaTabsMap.get('members');\n if(membersTab) {\n let idx = this.canViewMembers() ? 0 : 1;\n membersTab.menuTab.classList.toggle('hide', idx !== 0);\n\n this.selectTab(idx, false);\n } else {\n this.selectTab(0, false);\n }\n } */\n\n this.monthContainers = {};\n this.searchGroupMedia.clear();\n this.scrollable.scrollTop = 0;\n\n /* if(testScroll) {\n for(let i = 0; i < 1500; ++i) {\n let div = document.createElement('div');\n div.insertAdjacentHTML('beforeend', ``);\n div.classList.add('grid-item');\n div.dataset.id = '' + (i / 3 | 0);\n //div.innerText = '' + (i / 3 | 0);\n this.tabs.inputMessagesFilterPhotoVideo.append(div);\n }\n } */\n }\n\n private copySearchContext(newInputFilter: MyInputMessagesFilter) {\n const context = copy(this.searchContext);\n context.inputFilter = {_: newInputFilter};\n context.nextRate = this.nextRates[newInputFilter];\n return context;\n }\n\n public setQuery({peerId, query, threadId, historyStorage, folderId, minDate, maxDate}: {\n peerId: PeerId,\n query?: string,\n threadId?: number,\n historyStorage?: AppSearchSuper['historyStorage'],\n folderId?: number,\n minDate?: number,\n maxDate?: number\n }) {\n this.searchContext = {\n peerId,\n query: query || '',\n inputFilter: {_: this.mediaTab.inputFilter},\n threadId,\n folderId,\n minDate,\n maxDate\n };\n\n this.historyStorage = historyStorage ?? {};\n\n this.cleanup();\n }\n\n public destroy() {\n this.cleanup();\n this.listenerSetter.removeAll();\n this.scrollable.destroy();\n this.swipeHandler?.removeListeners();\n this.selection?.cleanup();\n\n this.scrollStartCallback = undefined;\n this.onChangeTab = undefined;\n this.selectTab = undefined;\n this.searchContextMenu = undefined;\n this.swipeHandler = undefined;\n this.selection = undefined;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from './cancelEvent';\n\nexport default function lockTouchScroll(container: HTMLElement) {\n const onTouchMove = (e: TouchEvent) => {\n cancelEvent(e);\n };\n\n let lockers = 2;\n const cb = () => {\n if(!--lockers) {\n container.removeEventListener('touchmove', onTouchMove, {capture: true});\n }\n };\n\n container.addEventListener('touchmove', onTouchMove, {capture: true, passive: false});\n container.addEventListener('touchend', cb, {once: true});\n\n return cb;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ChatRights} from '../lib/appManagers/appChatsManager';\nimport type {Dialog} from '../lib/appManagers/appMessagesManager';\nimport appDialogsManager, {DialogElementSize as DialogElementSize} from '../lib/appManagers/appDialogsManager';\nimport rootScope from '../lib/rootScope';\nimport Scrollable from './scrollable';\nimport {FocusDirection} from '../helpers/fastSmoothScroll';\nimport CheckboxField from './checkboxField';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport findUpAttribute from '../helpers/dom/findUpAttribute';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport PeerTitle from './peerTitle';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport debounce from '../helpers/schedulers/debounce';\nimport windowSize from '../helpers/windowSize';\nimport type {IsPeerType} from '../lib/appManagers/appPeersManager';\nimport {attachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\nimport filterUnique from '../helpers/array/filterUnique';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport safeAssign from '../helpers/object/safeAssign';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport AvatarElement from './avatar';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport filterAsync from '../helpers/array/filterAsync';\nimport getParticipantPeerId from '../lib/appManagers/utils/chats/getParticipantPeerId';\nimport getChatMembersString from './wrappers/getChatMembersString';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport {Chat, User} from '../layer';\nimport canSendToUser from '../lib/appManagers/utils/users/canSendToUser';\nimport hasRights from '../lib/appManagers/utils/chats/hasRights';\nimport getDialogIndex from '../lib/appManagers/utils/dialogs/getDialogIndex';\nimport {generateDelimiter} from './generateDelimiter';\nimport SettingSection from './settingSection';\n\ntype SelectSearchPeerType = 'contacts' | 'dialogs' | 'channelParticipants';\n\n// TODO: правильная сортировка для addMembers, т.е. для peerType: 'contacts', потому что там идут сначала контакты - потом неконтакты, а должно всё сортироваться по имени\n\nexport default class AppSelectPeers {\n public container = document.createElement('div');\n public list = appDialogsManager.createChatList(/* {\n handheldsSize: 66,\n avatarSize: 48\n } */);\n private chatsContainer = document.createElement('div');\n public scrollable: Scrollable;\n private selectedScrollable: Scrollable;\n\n private selectedContainer: HTMLElement;\n public input: HTMLInputElement;\n\n // public selected: {[peerId: PeerId]: HTMLElement} = {};\n public selected = new Set();\n\n public freezed = false;\n\n private folderId = 0;\n private offsetIndex = 0;\n private promise: Promise;\n\n private query = '';\n private cachedContacts: PeerId[];\n\n private loadedWhat: Partial<{[k in 'dialogs' | 'archived' | 'contacts' | 'channelParticipants']: true}> = {};\n\n private renderedPeerIds: Set = new Set();\n\n private appendTo: HTMLElement;\n private onChange: (length: number) => void;\n private peerType: SelectSearchPeerType[] = ['dialogs'];\n private renderResultsFunc: (peerIds: PeerId[]) => void | Promise;\n private chatRightsAction: ChatRights;\n private multiSelect = true;\n private rippleEnabled = true;\n private avatarSize: DialogElementSize = 'abitbigger';\n private exceptSelf = false;\n private filterPeerTypeBy: IsPeerType[];\n\n private tempIds: {[k in keyof AppSelectPeers['loadedWhat']]: number} = {};\n private peerId: PeerId;\n\n private placeholder: LangPackKey;\n\n private selfPresence: LangPackKey = 'Presence.YourChat';\n\n private needSwitchList = false;\n\n private sectionNameLangPackKey: LangPackKey;\n\n private managers: AppManagers;\n\n private design: 'round' | 'square' = 'round';\n\n constructor(options: {\n appendTo: AppSelectPeers['appendTo'],\n onChange?: AppSelectPeers['onChange'],\n peerType?: AppSelectPeers['peerType'],\n peerId?: AppSelectPeers['peerId'],\n onFirstRender?: () => void,\n renderResultsFunc?: AppSelectPeers['renderResultsFunc'],\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\n multiSelect?: AppSelectPeers['multiSelect'],\n rippleEnabled?: AppSelectPeers['rippleEnabled'],\n avatarSize?: AppSelectPeers['avatarSize'],\n placeholder?: AppSelectPeers['placeholder'],\n selfPresence?: AppSelectPeers['selfPresence'],\n exceptSelf?: AppSelectPeers['exceptSelf'],\n filterPeerTypeBy?: AppSelectPeers['filterPeerTypeBy'],\n sectionNameLangPackKey?: AppSelectPeers['sectionNameLangPackKey'],\n managers: AppSelectPeers['managers'],\n design?: AppSelectPeers['design']\n }) {\n safeAssign(this, options);\n\n this.container.classList.add('selector', 'selector-' + this.design);\n\n const f = (this.renderResultsFunc || this.renderResults).bind(this);\n this.renderResultsFunc = async(peerIds) => {\n if(this.needSwitchList) {\n this.scrollable.splitUp.replaceWith(this.list);\n this.scrollable.setVirtualContainer(this.list);\n this.needSwitchList = false;\n }\n\n peerIds = peerIds.filter((peerId) => {\n const notRendered = !this.renderedPeerIds.has(peerId);\n if(notRendered) this.renderedPeerIds.add(peerId);\n return notRendered;\n });\n\n if(this.filterPeerTypeBy) {\n peerIds = await filterAsync(peerIds, async(peerId) => {\n if(peerId.isPeerId()) {\n const peer = await this.managers.appPeersManager.getPeer(peerId);\n if(peer) {\n for(const method of this.filterPeerTypeBy) {\n if(await this.managers.appPeersManager[method](peerId)) {\n return true;\n }\n }\n }\n }\n\n return true;\n });\n }\n\n return f(peerIds);\n };\n\n this.input = document.createElement('input');\n this.input.classList.add('selector-search-input');\n if(this.placeholder) {\n _i18n(this.input, this.placeholder, undefined, 'placeholder');\n } else {\n _i18n(this.input, 'SendMessageTo', undefined, 'placeholder');\n }\n\n this.input.type = 'text';\n\n if(this.multiSelect) {\n const section = new SettingSection({});\n section.innerContainer.classList.add('selector-search-section');\n const topContainer = document.createElement('div');\n topContainer.classList.add('selector-search-container');\n\n this.selectedContainer = document.createElement('div');\n this.selectedContainer.classList.add('selector-search');\n\n this.selectedContainer.append(this.input);\n topContainer.append(this.selectedContainer);\n this.selectedScrollable = new Scrollable(topContainer);\n\n // let delimiter = document.createElement('hr');\n\n attachClickEvent(this.selectedContainer, (e) => {\n if(this.freezed) return;\n let target = e.target as HTMLElement;\n target = findUpClassName(target, 'selector-user');\n\n if(!target) return;\n\n const peerId = target.dataset.key;\n const li = this.chatsContainer.querySelector('[data-peer-id=\"' + peerId + '\"]') as HTMLElement;\n if(!li) {\n this.remove(peerId.toPeerId());\n } else {\n simulateClickEvent(li);\n }\n });\n\n section.content.append(topContainer);\n this.container.append(section.container/* , delimiter */);\n }\n\n this.chatsContainer.classList.add('chatlist-container');\n // this.chatsContainer.append(this.list);\n const section = new SettingSection({\n name: this.sectionNameLangPackKey,\n noShadow: true\n });\n section.content.append(this.list);\n this.chatsContainer.append(section.container);\n this.scrollable = new Scrollable(this.chatsContainer);\n this.scrollable.setVirtualContainer(this.list);\n\n attachClickEvent(this.chatsContainer, (e) => {\n const target = findUpAttribute(e.target, 'data-peer-id') as HTMLElement;\n cancelEvent(e);\n\n if(!target) return;\n if(this.freezed) return;\n\n let key: PeerId | string = target.dataset.peerId;\n key = key.isPeerId() ? key.toPeerId() : key;\n\n if(!this.multiSelect) {\n this.add(key);\n return;\n }\n\n // target.classList.toggle('active');\n if(this.selected.has(key)) {\n this.remove(key);\n } else {\n this.add(key);\n }\n\n const checkbox = target.querySelector('input') as HTMLInputElement;\n checkbox.checked = !checkbox.checked;\n });\n\n const debouncedInput = debounce(this.onInput, 200, false, true);\n this.input.addEventListener('input', debouncedInput);\n\n this.scrollable.onScrolledBottom = () => {\n this.getMoreResults();\n };\n\n this.scrollable.container.prepend(generateDelimiter());\n\n this.container.append(this.chatsContainer);\n this.appendTo.append(this.container);\n\n // WARNING TIMEOUT\n setTimeout(() => {\n const getResultsPromise = this.getMoreResults() as Promise;\n if(options.onFirstRender) {\n getResultsPromise.then(() => {\n options.onFirstRender();\n });\n }\n }, 0);\n }\n\n private onInput = () => {\n const value = this.input.value;\n if(this.query !== value) {\n if(this.peerType.includes('contacts') || this.peerType.includes('dialogs')) {\n this.cachedContacts = undefined;\n }\n\n if(this.peerType.includes('dialogs')) {\n this.folderId = 0;\n this.offsetIndex = 0;\n }\n\n for(const i in this.tempIds) {\n // @ts-ignore\n ++this.tempIds[i];\n }\n\n this.list = appDialogsManager.createChatList();\n\n this.promise = undefined;\n this.loadedWhat = {};\n this.query = value;\n this.renderedPeerIds.clear();\n this.needSwitchList = true;\n\n // console.log('selectPeers input:', this.query);\n this.getMoreResults();\n }\n };\n\n private async renderSaved() {\n if(\n !this.exceptSelf &&\n !this.offsetIndex &&\n this.folderId === 0 &&\n this.peerType.includes('dialogs') &&\n (!this.query || await this.managers.appUsersManager.testSelfSearch(this.query))\n ) {\n await this.renderResultsFunc([rootScope.myId]);\n }\n }\n\n private getTempId(type: keyof AppSelectPeers['tempIds']) {\n this.tempIds[type] ??= 0;\n const tempId = ++this.tempIds[type];\n return {\n tempId,\n middleware: () => this.tempIds[type] === tempId\n };\n }\n\n private async getMoreDialogs(): Promise {\n if(this.loadedWhat.dialogs && this.loadedWhat.archived) {\n return;\n }\n\n // в десктопе - сначала без группы, потом архивные, потом контакты без сообщений\n const pageCount = windowSize.height / 56 * 1.25 | 0;\n\n const {middleware} = this.getTempId('dialogs');\n const promise = this.managers.dialogsStorage.getDialogs({\n query: this.query,\n offsetIndex: this.offsetIndex,\n limit: pageCount,\n filterId: this.folderId,\n skipMigrated: true\n });\n\n promise.catch(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat[this.loadedWhat.dialogs ? 'archived' : 'dialogs'] = true;\n });\n\n const value = await promise;\n if(!middleware()) {\n return;\n }\n\n let dialogs = value.dialogs as Dialog[];\n if(dialogs.length) {\n const newOffsetIndex = getDialogIndex(dialogs[dialogs.length - 1]) || 0;\n\n dialogs = dialogs.slice();\n findAndSplice(dialogs, d => d.peerId === rootScope.myId); // no my account\n\n if(this.chatRightsAction) {\n dialogs = await filterAsync(dialogs, (d) => this.filterByRights(d.peerId));\n if(!middleware()) {\n return;\n }\n }\n\n await this.renderSaved();\n if(!middleware()) {\n return;\n }\n\n this.offsetIndex = newOffsetIndex;\n }\n\n this.renderResultsFunc(dialogs.map((dialog) => dialog.peerId));\n\n if(value.isEnd) {\n if(!this.loadedWhat.dialogs) {\n await this.renderSaved();\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat.dialogs = true;\n this.offsetIndex = 0;\n this.folderId = 1;\n\n return this.getMoreDialogs();\n } else {\n this.loadedWhat.archived = true;\n\n if(!this.loadedWhat.contacts/* && this.peerType.includes('contacts') */) {\n return this.getMoreContacts();\n }\n }\n }\n }\n\n private async filterByRights(peerId: PeerId) {\n const peer: User | Chat = await this.managers.appPeersManager.getPeer(peerId);\n if(peerId.isUser()) {\n return this.chatRightsAction !== 'send_messages' || canSendToUser(peer as User.user);\n } else if(hasRights(peer as Chat.chat, this.chatRightsAction)) {\n return true;\n }\n }\n\n private async getMoreContacts() {\n if(this.loadedWhat.contacts) {\n return;\n }\n\n const isGlobalSearch = this.peerType.includes('contacts');\n\n if(!this.cachedContacts) {\n /* const promises: Promise[] = [appUsersManager.getContacts(this.query)];\n if(!this.peerType.includes('dialogs')) {\n promises.push(appMessagesManager.getConversationsAll());\n }\n\n this.promise = Promise.all(promises);\n this.cachedContacts = (await this.promise)[0].slice(); */\n const {middleware} = this.getTempId('contacts');\n const promise = Promise.all([\n isGlobalSearch ? this.managers.appUsersManager.getContactsPeerIds(this.query) : [],\n this.query ? this.managers.appUsersManager.searchContacts(this.query) : undefined\n ]);\n\n promise.catch(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat.contacts = true;\n });\n\n const [cachedContacts, searchResult] = await promise;\n if(!middleware()) {\n return;\n }\n\n if(searchResult) {\n // do not add global result if only dialogs needed\n let resultPeerIds = isGlobalSearch ? searchResult.my_results.concat(searchResult.results) : searchResult.my_results;\n\n if(this.chatRightsAction) {\n resultPeerIds = await filterAsync(resultPeerIds, (peerId) => this.filterByRights(peerId));\n if(!middleware()) {\n return;\n }\n }\n\n if(!this.peerType.includes('dialogs')) {\n resultPeerIds = resultPeerIds.filter((peerId) => peerId.isUser());\n }\n\n this.cachedContacts = filterUnique(cachedContacts.concat(resultPeerIds));\n } else this.cachedContacts = cachedContacts.slice();\n\n indexOfAndSplice(this.cachedContacts, rootScope.myId); // no my account\n }\n\n // if(this.cachedContacts.length) {\n const pageCount = windowSize.height / 56 * 1.25 | 0;\n const arr = this.cachedContacts.splice(0, pageCount);\n this.renderResultsFunc(arr);\n // }\n\n if(!this.cachedContacts.length) {\n this.loadedWhat.contacts = true;\n\n // need to load non-contacts\n /* if(!this.peerType.includes('dialogs')) {\n return this.getMoreDialogs();\n } */\n }\n }\n\n private async getMoreChannelParticipants() {\n if(this.loadedWhat.channelParticipants) {\n return;\n }\n\n const pageCount = 50; // same as in group permissions to use cache\n\n const {middleware} = this.getTempId('channelParticipants');\n const promise = this.managers.appProfileManager.getChannelParticipants(\n this.peerId.toChatId(),\n {\n _: 'channelParticipantsSearch',\n q: this.query\n },\n pageCount,\n this.list.childElementCount\n );\n\n promise.catch(() => {\n if(!middleware()) {\n return;\n }\n\n this.loadedWhat.channelParticipants = true;\n });\n\n const participants = await promise;\n if(!middleware()) {\n return;\n }\n\n const peerIds = participants.participants.map((participant) => {\n return getParticipantPeerId(participant);\n });\n indexOfAndSplice(peerIds, rootScope.myId);\n this.renderResultsFunc(peerIds);\n\n if(this.list.childElementCount >= participants.count || participants.participants.length < pageCount) {\n this.loadedWhat.channelParticipants = true;\n }\n }\n\n checkForTriggers = () => {\n this.scrollable.checkForTriggers();\n };\n\n private getMoreResults() {\n if(this.promise) {\n return this.promise;\n }\n\n const get = () => {\n if((this.peerType.includes('dialogs')/* || this.loadedWhat.contacts */) && !this.loadedWhat.archived) { // to load non-contacts\n return this.getMoreSomething('dialogs');\n }\n\n if((this.peerType.includes('contacts') || this.peerType.includes('dialogs')) && !this.loadedWhat.contacts) {\n return this.getMoreSomething('contacts');\n }\n\n if(this.peerType.includes('channelParticipants') && !this.loadedWhat.channelParticipants) {\n return this.getMoreSomething('channelParticipants');\n }\n };\n\n const loadPromise = get();\n if(!loadPromise) {\n return Promise.resolve();\n }\n\n const promise = this.promise = loadPromise.catch((err) => {\n console.error('get more result error', err);\n }).finally(() => {\n if(this.promise === promise) {\n this.promise = undefined;\n }\n\n this.checkForTriggers();\n });\n\n return promise;\n }\n\n private getMoreSomething(peerType: SelectSearchPeerType) {\n const map: {[type in SelectSearchPeerType]: () => Promise} = {\n dialogs: this.getMoreDialogs,\n contacts: this.getMoreContacts,\n channelParticipants: this.getMoreChannelParticipants\n };\n\n const promise = map[peerType].call(this);\n return promise;\n }\n\n private async renderResults(peerIds: PeerId[]) {\n // console.log('will renderResults:', peerIds);\n\n // оставим только неконтакты с диалогов\n if(!this.peerType.includes('dialogs') && this.loadedWhat.contacts) {\n peerIds = await filterAsync(peerIds, (peerId) => {\n return this.managers.appUsersManager.isNonContactUser(peerId);\n });\n }\n\n peerIds.forEach(async(peerId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.scrollable,\n rippleEnabled: this.rippleEnabled,\n avatarSize: this.avatarSize\n });\n\n if(this.multiSelect) {\n const selected = this.selected.has(peerId);\n const checkboxField = new CheckboxField();\n\n if(selected) {\n // dom.listEl.classList.add('active');\n checkboxField.input.checked = true;\n }\n\n dom.containerEl.prepend(checkboxField.label);\n }\n\n let subtitleEl: HTMLElement;\n if(peerId.isAnyChat()) {\n subtitleEl = await getChatMembersString(peerId.toChatId());\n } else if(peerId === rootScope.myId) {\n subtitleEl = i18n(this.selfPresence);\n } else {\n subtitleEl = getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId()));\n }\n\n dom.lastMessageSpan.append(subtitleEl);\n });\n }\n\n public add(key: PeerId | string, title?: string | HTMLElement, scroll = true) {\n // console.trace('add');\n this.selected.add(key);\n\n if(!this.multiSelect) {\n this.onChange(this.selected.size);\n return;\n }\n\n if(this.query.trim()) {\n this.input.value = '';\n this.onInput();\n }\n\n const div = document.createElement('div');\n div.classList.add('selector-user', 'scale-in');\n\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('selector-user-avatar', 'tgico', 'avatar-32');\n avatarEl.isDialog = true;\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n const peerTitle = new PeerTitle();\n peerTitle.update({peerId: key.toPeerId(), dialog: true});\n title = peerTitle.element;\n }\n\n avatarEl.updateWithOptions({\n peerId: key as PeerId\n });\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n this.selectedContainer.insertBefore(div, this.input);\n // this.selectedScrollable.scrollTop = this.selectedScrollable.scrollHeight;\n this.onChange?.(this.selected.size);\n\n if(scroll) {\n this.selectedScrollable.scrollIntoViewNew({\n element: this.input,\n position: 'center'\n });\n }\n\n return div;\n }\n\n public remove(key: PeerId | string) {\n if(!this.multiSelect) return;\n // const div = this.selected[peerId];\n const div = this.selectedContainer.querySelector(`[data-key=\"${key}\"]`) as HTMLElement;\n div.classList.remove('scale-in');\n void div.offsetWidth;\n div.classList.add('scale-out');\n\n const onAnimationEnd = () => {\n this.selected.delete(key);\n div.remove();\n this.onChange && this.onChange(this.selected.size);\n };\n\n if(rootScope.settings.animationsEnabled) {\n div.addEventListener('animationend', onAnimationEnd, {once: true});\n } else {\n onAnimationEnd();\n }\n }\n\n public getSelected() {\n return [...this.selected];\n }\n\n public addInitial(values: any[]) {\n values.forEach((value) => {\n this.add(value, undefined, false);\n });\n\n window.requestAnimationFrame(() => { // ! not the best place for this raf though it works\n this.selectedScrollable.scrollIntoViewNew({\n element: this.input,\n position: 'center',\n forceDirection: FocusDirection.Static\n });\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport ProgressivePreloader from './preloader';\nimport appMediaPlaybackController, {MediaItem, MediaSearchContext} from './appMediaPlaybackController';\nimport {DocumentAttribute, Message} from '../layer';\nimport mediaSizes from '../helpers/mediaSizes';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport rootScope from '../lib/rootScope';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport LazyLoadQueue from './lazyLoadQueue';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport ListenerSetter, {Listener} from '../helpers/listenerSetter';\nimport noop from '../helpers/noop';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport {joinElementsWith} from '../lib/langPack';\nimport {MiddleEllipsisElement} from './middleEllipsis';\nimport {formatFullSentTime} from '../helpers/date';\nimport throttleWithRaf from '../helpers/schedulers/throttleWithRaf';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport formatBytes from '../helpers/formatBytes';\nimport {animateSingle} from '../helpers/animation';\nimport clamp from '../helpers/number/clamp';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport MediaProgressLine from './mediaProgressLine';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport wrapSenderToPeer from './wrappers/senderToPeer';\nimport wrapSentTime from './wrappers/sentTime';\nimport getMediaFromMessage from '../lib/appManagers/utils/messages/getMediaFromMessage';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport wrapPhoto from './wrappers/photo';\n\nrootScope.addEventListener('messages_media_read', ({mids, peerId}) => {\n mids.forEach((mid) => {\n const attr = `[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`;\n (Array.from(document.querySelectorAll(`audio-element.is-unread${attr}, .media-round.is-unread${attr}`)) as AudioElement[]).forEach((elem) => {\n elem.classList.remove('is-unread');\n });\n });\n});\n\n// https://github.com/LonamiWebs/Telethon/blob/4393ec0b83d511b6a20d8a20334138730f084375/telethon/utils.py#L1285\nexport function decodeWaveform(waveform: Uint8Array | number[]) {\n if(!(waveform instanceof Uint8Array)) {\n waveform = new Uint8Array(waveform);\n }\n\n const bitCount = waveform.length * 8;\n const valueCount = bitCount / 5 | 0;\n if(!valueCount) {\n return new Uint8Array([]);\n }\n\n let result: Uint8Array;\n try {\n const dataView = new DataView(waveform.buffer);\n result = new Uint8Array(valueCount);\n for(let i = 0; i < valueCount; i++) {\n const byteIndex = i * 5 / 8 | 0;\n const bitShift = i * 5 % 8;\n const value = dataView.getUint16(byteIndex, true);\n result[i] = (value >> bitShift) & 0b00011111;\n }\n } catch(err) {\n result = new Uint8Array([]);\n }\n\n /* var byteIndex = (valueCount - 1) / 8 | 0;\n var bitShift = (valueCount - 1) % 8;\n if(byteIndex === waveform.length - 1) {\n var value = waveform[byteIndex];\n } else {\n var value = dataView.getUint16(byteIndex, true);\n }\n console.log('decoded waveform, setting last value:', value, byteIndex, bitShift);\n result[valueCount - 1] = (value >> bitShift) & 0b00011111; */\n return result;\n}\n\nfunction createWaveformBars(waveform: Uint8Array, duration: number) {\n const barWidth = 2;\n const barMargin = 2; // mediaSizes.isMobile ? 2 : 1;\n const barHeightMin = 4; // mediaSizes.isMobile ? 3 : 2;\n const barHeightMax = mediaSizes.isMobile ? 16 : 23;\n // const availW = 150; //mediaSizes.isMobile ? 152 : 190;\n\n const minW = mediaSizes.isMobile ? 152 : 190;\n const maxW = mediaSizes.isMobile ? 190 : 256;\n const availW = clamp(duration / 60 * maxW, minW, maxW); // mediaSizes.isMobile ? 152 : 224;\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.classList.add('audio-waveform-bars');\n svg.setAttributeNS(null, 'width', '' + availW);\n svg.setAttributeNS(null, 'height', '' + barHeightMax);\n svg.setAttributeNS(null, 'viewBox', `0 0 ${availW} ${barHeightMax}`);\n\n // console.log('decoded waveform:', waveform);\n\n const normValue = Math.max(...waveform);\n const wfSize = waveform.length ? waveform.length : 100;\n const barCount = Math.min((availW / (barWidth + barMargin)) | 0, wfSize);\n\n let maxValue = 0;\n const maxDelta = barHeightMax - barHeightMin;\n\n let html = '';\n for(let i = 0, barX = 0, sumI = 0; i < wfSize; ++i) {\n const value = waveform[i] || 0;\n if((sumI + barCount) >= wfSize) { // draw bar\n sumI = sumI + barCount - wfSize;\n if(sumI < (barCount + 1) / 2) {\n if(maxValue < value) maxValue = value;\n }\n\n const bar_value = Math.max(((maxValue * maxDelta) + ((normValue + 1) / 2)) / (normValue + 1), barHeightMin);\n\n const h = `\n \n `;\n html += h;\n\n barX += barWidth + barMargin;\n\n if(sumI < (barCount + 1) / 2) {\n maxValue = 0;\n } else {\n maxValue = value;\n }\n } else {\n if(maxValue < value) maxValue = value;\n\n sumI += barCount;\n }\n }\n\n const container = document.createElement('div');\n container.classList.add('audio-waveform');\n container.append(svg);\n\n svg.insertAdjacentHTML('beforeend', html);\n return {svg, container, availW};\n}\n\nasync function wrapVoiceMessage(audioEl: AudioElement) {\n audioEl.classList.add('is-voice');\n\n const message = audioEl.message;\n const doc = getMediaFromMessage(message) as MyDocument;\n\n if(message.pFlags.out) {\n audioEl.classList.add('is-out');\n }\n\n let waveform = (doc.attributes.find((attribute) => attribute._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio).waveform || new Uint8Array([]);\n waveform = decodeWaveform(waveform.slice(0, 63));\n\n const {svg, container: svgContainer, availW} = createWaveformBars(waveform, doc.duration);\n\n const fakeSvgContainer = svgContainer.cloneNode(true) as HTMLElement;\n fakeSvgContainer.classList.add('audio-waveform-fake');\n svgContainer.classList.add('audio-waveform-background');\n\n const waveformContainer = document.createElement('div');\n waveformContainer.classList.add('audio-waveform-container');\n waveformContainer.append(svgContainer, fakeSvgContainer);\n\n const timeDiv = document.createElement('div');\n timeDiv.classList.add('audio-time');\n audioEl.append(waveformContainer, timeDiv);\n\n let progress = svg as any as HTMLElement;\n\n const onLoad = () => {\n let audio = audioEl.audio;\n\n const setAnimation = () => {\n animateSingle(() => {\n if(!audio) return false;\n onTimeUpdate();\n return !audio.paused;\n }, audioEl);\n };\n\n const onTimeUpdate = () => {\n fakeSvgContainer.style.width = (audio.currentTime / audio.duration * 100) + '%';\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onTimeUpdate();\n }\n\n const throttledTimeUpdate = throttleWithRaf(onTimeUpdate);\n audioEl.addAudioListener('timeupdate', throttledTimeUpdate);\n audioEl.addAudioListener('ended', throttledTimeUpdate);\n audioEl.addAudioListener('play', setAnimation);\n\n audioEl.readyPromise.then(() => {\n let mousedown = false, mousemove = false;\n progress.addEventListener('mouseleave', (e) => {\n if(mousedown) {\n audio.play();\n mousedown = false;\n }\n mousemove = false;\n });\n progress.addEventListener('mousemove', (e) => {\n mousemove = true;\n if(mousedown) scrub(e);\n });\n progress.addEventListener('mousedown', (e) => {\n e.preventDefault();\n if(e.button !== 0) return;\n if(!audio.paused) {\n audio.pause();\n }\n\n scrub(e);\n mousedown = true;\n });\n progress.addEventListener('mouseup', (e) => {\n if(mousemove && mousedown) {\n audio.play();\n mousedown = false;\n }\n });\n attachClickEvent(progress, (e) => {\n cancelEvent(e);\n if(!audio.paused) scrub(e);\n });\n\n function scrub(e: MouseEvent | TouchEvent) {\n let offsetX: number;\n if(e instanceof MouseEvent) {\n offsetX = e.offsetX;\n } else { // touch\n const rect = (e.target as HTMLElement).getBoundingClientRect();\n offsetX = e.targetTouches[0].pageX - rect.left;\n }\n\n const scrubTime = offsetX / availW /* width */ * audio.duration;\n audio.currentTime = scrubTime;\n }\n }, noop);\n\n return () => {\n progress.remove();\n progress = null;\n audio = null;\n };\n };\n\n return onLoad;\n}\n\nasync function wrapAudio(audioEl: AudioElement) {\n const withTime = audioEl.withTime;\n\n const message = audioEl.message;\n const doc = getMediaFromMessage(message) as MyDocument;\n\n const isVoice = doc.type === 'voice' || doc.type === 'round';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('audio-description');\n\n const audioAttribute = doc.attributes.find((attr) => attr._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n\n if(!isVoice) {\n const parts: (Node | string)[] = [];\n if(audioAttribute?.performer) {\n parts.push(wrapEmojiText(audioAttribute.performer));\n }\n\n if(withTime) {\n parts.push(formatFullSentTime(message.date));\n } else if(!parts.length) {\n parts.push(formatBytes(doc.size));\n }\n\n if(audioEl.showSender) {\n parts.push(await wrapSenderToPeer(message));\n }\n\n descriptionEl.append(...joinElementsWith(parts, ' • '));\n }\n\n const html = `\n
\n
\n
\n
`;\n audioEl.insertAdjacentHTML('beforeend', html);\n\n const titleEl = audioEl.querySelector('.audio-title') as HTMLElement;\n\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = audioEl.dataset.fontWeight;\n middleEllipsisEl.dataset.fontSize = audioEl.dataset.fontSize;\n middleEllipsisEl.dataset.sizeType = audioEl.dataset.sizeType;\n if(isVoice) {\n middleEllipsisEl.append(await wrapSenderToPeer(message));\n } else {\n setInnerHTML(middleEllipsisEl, wrapEmojiText(audioAttribute?.title ?? doc.file_name));\n }\n\n titleEl.append(middleEllipsisEl);\n\n if(audioEl.showSender) {\n titleEl.append(wrapSentTime(message));\n }\n\n const subtitleDiv = audioEl.querySelector('.audio-subtitle') as HTMLDivElement;\n subtitleDiv.append(descriptionEl);\n\n const onLoad = () => {\n let launched = false;\n\n let progressLine = new MediaProgressLine(audioEl.audio, doc.supportsStreaming);\n\n audioEl.addAudioListener('ended', () => {\n audioEl.classList.remove('audio-show-progress');\n // Reset subtitle\n subtitleDiv.lastChild.replaceWith(descriptionEl);\n launched = false;\n });\n\n const onPlay = () => {\n if(!launched) {\n audioEl.classList.add('audio-show-progress');\n launched = true;\n\n if(progressLine) {\n subtitleDiv.lastChild.replaceWith(progressLine.container);\n }\n }\n };\n\n audioEl.addAudioListener('play', onPlay);\n\n if(!audioEl.audio.paused || audioEl.audio.currentTime > 0) {\n onPlay();\n }\n\n return () => {\n progressLine.removeListeners();\n progressLine.container.remove();\n progressLine = null;\n };\n };\n\n return onLoad;\n}\n\nfunction constructDownloadPreloader(tryAgainOnFail = true) {\n const preloader = new ProgressivePreloader({cancelable: true, tryAgainOnFail});\n preloader.construct();\n\n if(!tryAgainOnFail) {\n preloader.circle.setAttributeNS(null, 'r', '23');\n preloader.totalLength = 143.58203125;\n }\n\n return preloader;\n}\n\nexport const findMediaTargets = (anchor: HTMLElement, anchorMid: number/* , useSearch: boolean */) => {\n let prev: MediaItem[], next: MediaItem[];\n // if(anchor.classList.contains('search-super-item') || !useSearch) {\n const isBubbles = !anchor.classList.contains('search-super-item');\n const container = findUpClassName(anchor, !isBubbles ? 'tabs-tab' : 'bubbles-inner');\n if(container) {\n const attr = `:not([data-is-outgoing=\"1\"])`;\n const justAudioSelector = `.audio:not(.is-voice)${attr}`;\n let selectors: string[];\n if(!anchor.matches(justAudioSelector)) {\n selectors = [`.audio.is-voice${attr}`, `.media-round${attr}`];\n } else {\n selectors = [justAudioSelector];\n }\n\n if(isBubbles) {\n const prefix = '.bubble:not(.webpage) ';\n selectors = selectors.map((s) => prefix + s);\n }\n\n const selector = selectors.join(', ');\n\n const elements = Array.from(container.querySelectorAll(selector)) as HTMLElement[];\n const idx = elements.indexOf(anchor);\n\n const mediaItems: MediaItem[] = elements.map((element) => ({peerId: element.dataset.peerId.toPeerId(), mid: +element.dataset.mid}));\n\n prev = mediaItems.slice(0, idx);\n next = mediaItems.slice(idx + 1);\n }\n // }\n\n if((next.length && next[0].mid < anchorMid) || (prev.length && prev[prev.length - 1].mid > anchorMid)) {\n [prev, next] = [next.reverse(), prev.reverse()];\n }\n\n // prev = next = undefined;\n\n return [prev, next];\n};\n\nexport default class AudioElement extends HTMLElement {\n public audio: HTMLAudioElement;\n public preloader: ProgressivePreloader;\n public message: Message.message;\n public withTime = false;\n public voiceAsMusic = false;\n public searchContext: MediaSearchContext;\n public showSender = false;\n public noAutoDownload: boolean;\n public lazyLoadQueue: LazyLoadQueue;\n public loadPromises: Promise[];\n public managers: AppManagers;\n\n private listenerSetter = new ListenerSetter();\n private onTypeDisconnect: () => void;\n public onLoad: (autoload?: boolean) => void;\n public readyPromise: CancellablePromise;\n\n public async render() {\n this.classList.add('audio');\n this.managers = rootScope.managers;\n\n this.dataset.mid = '' + this.message.mid;\n this.dataset.peerId = '' + this.message.peerId;\n\n const doc = getMediaFromMessage(this.message) as MyDocument;\n const isRealVoice = doc.type === 'voice';\n const isVoice = !this.voiceAsMusic && isRealVoice;\n const isOutgoing = this.message.pFlags.is_outgoing;\n const uploadingFileName = this.message?.uploadingFileName;\n\n const durationStr = toHHMMSS(doc.duration | 0);\n\n this.innerHTML = `\n
\n
\n
\n
\n
\n
`;\n\n const toggle = this.firstElementChild as HTMLElement;\n\n const downloadDiv = document.createElement('div');\n downloadDiv.classList.add('audio-download');\n\n const isUnread = doc.type !== 'audio' && this.message && this.message.pFlags.media_unread;\n if(isUnread) {\n this.classList.add('is-unread');\n }\n\n if(uploadingFileName) {\n this.classList.add('is-outgoing');\n this.append(downloadDiv);\n }\n\n const onTypeLoad = await (isVoice ? wrapVoiceMessage(this) : wrapAudio(this));\n\n const audioTimeDiv = this.querySelector('.audio-time') as HTMLDivElement;\n audioTimeDiv.innerHTML = durationStr;\n\n const onLoad = this.onLoad = (autoload: boolean) => {\n this.onLoad = undefined;\n\n const audio = this.audio = appMediaPlaybackController.addMedia(this.message, autoload);\n\n const readyPromise = this.readyPromise = deferredPromise();\n if(this.audio.readyState >= this.audio.HAVE_CURRENT_DATA) readyPromise.resolve();\n else {\n this.addAudioListener('canplay', () => readyPromise.resolve(), {once: true});\n }\n\n this.onTypeDisconnect = onTypeLoad();\n\n const getTimeStr = () => toHHMMSS(audio.currentTime | 0) + (isVoice ? (' / ' + durationStr) : '');\n\n const onPlay = () => {\n audioTimeDiv.innerText = getTimeStr();\n toggle.classList.toggle('playing', !audio.paused);\n };\n\n if(!audio.paused || (audio.currentTime > 0 && audio.currentTime !== audio.duration)) {\n onPlay();\n }\n\n const togglePlay = (e?: Event, paused = audio.paused) => {\n e && cancelEvent(e);\n\n if(paused) {\n const hadSearchContext = !!this.searchContext;\n if(appMediaPlaybackController.setSearchContext(this.searchContext || {\n peerId: NULL_PEER_ID,\n inputFilter: {_: 'inputMessagesFilterEmpty'},\n useSearch: false\n })) {\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(this, this.message.mid/* , this.searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: this.message.peerId, mid: this.message.mid}, prev, next);\n }\n\n audio.play().catch(() => {});\n } else {\n audio.pause();\n }\n };\n\n attachClickEvent(toggle, (e) => togglePlay(e), {listenerSetter: this.listenerSetter});\n\n this.addAudioListener('ended', () => {\n toggle.classList.remove('playing');\n audioTimeDiv.innerText = durationStr;\n });\n\n this.addAudioListener('timeupdate', () => {\n if((!audio.currentTime && audio.paused) || appMediaPlaybackController.isSafariBuffering(audio)) return;\n audioTimeDiv.innerText = getTimeStr();\n });\n\n this.addAudioListener('pause', () => {\n toggle.classList.remove('playing');\n });\n\n this.addAudioListener('play', onPlay);\n\n return togglePlay;\n };\n\n if(doc.thumbs?.length) {\n const imgs: HTMLElement[] = [];\n const wrapped = await wrapPhoto({\n photo: doc,\n message: null,\n container: toggle,\n boxWidth: 48,\n boxHeight: 48,\n loadPromises: this.loadPromises,\n withoutPreloader: true,\n lazyLoadQueue: this.lazyLoadQueue\n });\n toggle.style.width = toggle.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n\n this.classList.add('audio-with-thumb');\n imgs.forEach((img) => img.classList.add('audio-thumb'));\n }\n\n if(!isOutgoing) {\n let preloader: ProgressivePreloader = this.preloader;\n\n const autoDownload = doc.type !== 'audio'/* || !this.noAutoDownload */;\n onLoad(autoDownload);\n\n const r = (shouldPlay: boolean) => {\n if(this.audio.src) {\n return;\n }\n\n appMediaPlaybackController.resolveWaitingForLoadMedia(this.message.peerId, this.message.mid, this.message.pFlags.is_scheduled);\n\n const onDownloadInit = () => {\n if(shouldPlay) {\n appMediaPlaybackController.willBePlayed(this.audio); // prepare for loading audio\n\n if(IS_SAFARI && !this.audio.autoplay) {\n this.audio.autoplay = true;\n }\n }\n };\n\n onDownloadInit();\n\n if(!preloader) {\n if(doc.supportsStreaming) {\n this.classList.add('corner-download');\n\n let pauseListener: Listener;\n const onPlay = () => {\n const preloader = constructDownloadPreloader(false);\n const deferred = deferredPromise();\n deferred.notifyAll({done: 75, total: 100});\n deferred.catch(() => {\n this.audio.pause();\n appMediaPlaybackController.willBePlayed(undefined);\n });\n deferred.cancel = () => {\n deferred.cancel = noop;\n const err = new Error();\n (err as any).type = 'CANCELED';\n deferred.reject(err);\n };\n preloader.attach(downloadDiv, false, deferred);\n\n pauseListener = this.addAudioListener('pause', () => {\n deferred.cancel();\n }, {once: true}) as any;\n\n onDownloadInit();\n };\n\n /* if(!this.audio.paused) {\n onPlay();\n } */\n\n const playListener: any = this.addAudioListener('play', onPlay);\n this.readyPromise.then(() => {\n this.listenerSetter.remove(playListener);\n this.listenerSetter.remove(pauseListener);\n });\n } else {\n preloader = constructDownloadPreloader();\n\n if(!shouldPlay) {\n this.readyPromise = deferredPromise();\n }\n\n const load = () => {\n onDownloadInit();\n\n const download = appDownloadManager.downloadMediaURL({media: doc});\n\n if(!shouldPlay) {\n download.then(() => {\n this.readyPromise.resolve();\n });\n }\n\n preloader.attach(downloadDiv, false, download);\n return {download};\n };\n\n preloader.setDownloadFunction(load);\n load();\n }\n }\n\n if(this.classList.contains('corner-download')) {\n toggle.append(downloadDiv);\n } else {\n this.append(downloadDiv);\n }\n\n this.classList.add('downloading');\n\n this.readyPromise.then(() => {\n this.classList.remove('downloading');\n downloadDiv.classList.add('downloaded');\n setTimeout(() => {\n downloadDiv.remove();\n }, 200);\n\n // setTimeout(() => {\n // release loaded audio\n if(appMediaPlaybackController.willBePlayedMedia === this.audio) {\n this.audio.play();\n appMediaPlaybackController.willBePlayed(undefined);\n }\n // }, 10e3);\n });\n };\n\n if(!this.audio?.src) {\n if(autoDownload) {\n r(false);\n } else {\n attachClickEvent(toggle, () => {\n r(true);\n }, {once: true, capture: true, passive: false, listenerSetter: this.listenerSetter});\n }\n }\n } else if(uploadingFileName) {\n this.preloader = constructDownloadPreloader(false);\n this.preloader.attachPromise(appDownloadManager.getUpload(uploadingFileName));\n this.dataset.isOutgoing = '1';\n this.preloader.attach(downloadDiv, false);\n // onLoad();\n }\n }\n\n get addAudioListener() {\n return this.listenerSetter.add(this.audio);\n }\n\n disconnectedCallback() {\n setTimeout(() => {\n if(this.isConnected) {\n return;\n }\n\n if(this.onTypeDisconnect) {\n this.onTypeDisconnect();\n this.onTypeDisconnect = null;\n }\n\n if(this.readyPromise) {\n this.readyPromise.reject();\n }\n\n if(this.listenerSetter) {\n this.listenerSetter.removeAll();\n this.listenerSetter = null;\n }\n\n if(this.preloader) {\n this.preloader = null;\n }\n }, 100);\n }\n}\n\ncustomElements.define('audio-element', AudioElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Photo} from '../layer';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport ListLoader, {ListLoaderOptions} from './listLoader';\n\nexport default class AvatarListLoader extends ListLoader {\n private peerId: PeerId;\n private managers: AppManagers;\n\n constructor(options: Omit, 'loadMore'> & {peerId: PeerId, managers: AppManagers}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n if(this.peerId.isAnyChat() || !older) return Promise.resolve({count: 0, items: []}); // ! это значит, что открыло аватар чата, но следующих фотографий нет.\n\n const maxId = anchor?.photoId;\n return this.managers.appPhotosManager.getUserPhotos(this.peerId, maxId, loadCount).then((value) => {\n const items = value.photos.map((photoId) => {\n return {element: null as HTMLElement, photoId} as any;\n });\n\n return {count: value.count, items};\n });\n }\n });\n\n this.loadedAllUp = true;\n this.peerId = options.peerId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarListLoader from '../helpers/avatarListLoader';\nimport {Photo} from '../layer';\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport appImManager from '../lib/appManagers/appImManager';\nimport rootScope from '../lib/rootScope';\nimport AppMediaViewerBase from './appMediaViewerBase';\n\ntype AppMediaViewerAvatarTargetType = {element: HTMLElement, photoId: Photo.photo['id']};\nexport default class AppMediaViewerAvatar extends AppMediaViewerBase<'', 'delete', AppMediaViewerAvatarTargetType> {\n public peerId: PeerId;\n\n constructor(peerId: PeerId) {\n super(new AvatarListLoader({peerId, managers: rootScope.managers}), [/* 'delete' */]);\n\n this.peerId = peerId;\n\n this.setBtnMenuToggle([{\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: this.onDownloadClick\n }/* , {\n icon: 'delete danger btn-disabled',\n text: 'Delete',\n onClick: () => {}\n } */]);\n\n // * constructing html end\n\n this.setListeners();\n }\n\n onPrevClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, -1);\n };\n\n onNextClick = (target: AppMediaViewerAvatarTargetType) => {\n this.openMedia(target.photoId, target.element, 1);\n };\n\n onDownloadClick = async() => {\n appDownloadManager.downloadToDisc({\n media: await this.managers.appPhotosManager.getPhoto(this.target.photoId),\n queueId: appImManager.chat.bubbles.lazyLoadQueue.queueId\n });\n };\n\n public async openMedia(photoId: Photo.photo['id'], target?: HTMLElement, fromRight = 0, prevTargets?: AppMediaViewerAvatarTargetType[], nextTargets?: AppMediaViewerAvatarTargetType[]) {\n if(this.setMoverPromise) return this.setMoverPromise;\n\n const photo = await this.managers.appPhotosManager.getPhoto(photoId);\n const ret = super._openMedia(photo, photo.date, this.peerId, fromRight, target, false, prevTargets, nextTargets);\n this.target.photoId = photo.id;\n\n return ret;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\nimport {Message, Photo} from '../layer';\nimport type LazyLoadQueue from './lazyLoadQueue';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport AppMediaViewer from './appMediaViewer';\nimport AppMediaViewerAvatar from './appMediaViewerAvatar';\nimport isObject from '../helpers/object/isObject';\nimport {ArgumentTypes} from '../types';\nimport putPhoto from './putPhoto';\nimport {recordPromise} from '../helpers/recordPromise';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\n\nconst onAvatarUpdate = ({peerId, threadId}: {peerId: PeerId, threadId?: number}) => {\n let query = 'avatar-element[data-peer-id=\"' + peerId + '\"]';\n if(threadId) {\n query += '[data-thread-id=\"' + threadId + '\"]';\n }\n\n (Array.from(document.querySelectorAll(query)) as AvatarElement[]).forEach((elem) => {\n // console.log('updating avatar:', elem);\n elem.update();\n });\n};\n\nrootScope.addEventListener('avatar_update', onAvatarUpdate);\nrootScope.addEventListener('peer_title_edit', async(data) => {\n if(!(await rootScope.managers.appAvatarsManager.isAvatarCached(data.peerId))) {\n onAvatarUpdate(data);\n }\n});\n\nexport async function openAvatarViewer(\n target: HTMLElement,\n peerId: PeerId,\n middleware: () => boolean,\n message?: any,\n prevTargets?: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[],\n nextTargets?: typeof prevTargets\n) {\n let photo = await rootScope.managers.appProfileManager.getFullPhoto(peerId);\n if(!middleware() || !photo) {\n return;\n }\n\n const getTarget = () => {\n const good = Array.from(target.querySelectorAll('img')).find((img) => !img.classList.contains('emoji'));\n return good ? target : null;\n };\n\n if(peerId.isAnyChat()) {\n const hadMessage = !!message;\n const inputFilter = 'inputMessagesFilterChatPhotos';\n if(!message) {\n message = await rootScope.managers.appMessagesManager.getSearch({\n peerId,\n inputFilter: {_: inputFilter},\n maxId: 0,\n limit: 1\n }).then((value) => {\n // console.log(lol);\n // ! by descend\n return value.history[0];\n });\n\n if(!middleware()) {\n return;\n }\n }\n\n if(message) {\n // ! гений в деле, костылируем (но это гениально)\n const messagePhoto = message.action.photo;\n if(messagePhoto.id !== photo.id) {\n if(!hadMessage) {\n message = rootScope.managers.appMessagesManager.generateFakeAvatarMessage(peerId, photo);\n } else {\n\n }\n }\n\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\n element: el.element,\n mid: (el.item as Message.messageService).mid,\n peerId: (el.item as Message.messageService).peerId\n }));\n\n new AppMediaViewer()\n .setSearchContext({\n peerId,\n inputFilter: {_: inputFilter}\n })\n .openMedia(message, getTarget(), undefined, undefined, prevTargets ? f(prevTargets) : undefined, nextTargets ? f(nextTargets) : undefined);\n\n return;\n }\n }\n\n if(photo) {\n if(!isObject(message) && message) {\n photo = await rootScope.managers.appPhotosManager.getPhoto(message);\n }\n\n const f = (arr: typeof prevTargets) => arr.map((el) => ({\n element: el.element,\n photoId: el.item as string\n }));\n\n new AppMediaViewerAvatar(peerId).openMedia(\n photo.id,\n getTarget(),\n undefined,\n prevTargets ? f(prevTargets) : undefined,\n nextTargets ? f(nextTargets) : undefined\n );\n }\n}\n\nconst believeMe: Map> = new Map();\nconst seen: Set = new Set();\n\nfunction getAvatarQueueKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n}\n\nexport default class AvatarElement extends HTMLElement {\n public peerId: PeerId;\n public isDialog: boolean;\n public peerTitle: string;\n public loadPromises: Promise[];\n public lazyLoadQueue: LazyLoadQueue;\n public isBig: boolean;\n public threadId: number;\n private addedToQueue = false;\n public wrapOptions: WrapSomethingOptions;\n\n public middlewareHelper: MiddlewareHelper;\n\n constructor() {\n super();\n this.classList.add('avatar-like');\n this.middlewareHelper = getMiddleware();\n }\n\n disconnectedCallback() {\n // браузер вызывает этот метод при удалении элемента из документа\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\n const key = getAvatarQueueKey(this.peerId, this.threadId);\n const set = believeMe.get(key);\n if(set?.has(this)) {\n set.delete(this);\n if(!set.size) {\n believeMe.delete(key);\n }\n }\n\n this.lazyLoadQueue?.delete({div: this});\n }\n\n public attachClickEvent() {\n let loading = false;\n attachClickEvent(this, async(e) => {\n cancelEvent(e);\n if(loading) return;\n const peerId = this.peerId;\n loading = true;\n await openAvatarViewer(this, this.peerId, () => this.peerId === peerId);\n loading = false;\n });\n }\n\n public updateOptions(options: Partial[0]>) {\n for(const i in options) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n public updateWithOptions(options: {\n peerId: PeerId,\n threadId?: number,\n isDialog?: boolean,\n isBig?: boolean,\n peerTitle?: string,\n lazyLoadQueue?: LazyLoadQueue | false,\n loadPromises?: Promise[],\n wrapOptions?: WrapSomethingOptions\n }) {\n const wasPeerId = this.peerId;\n const wasThreadId = this.threadId;\n this.updateOptions(options);\n const newPeerId = this.peerId;\n const threadId = this.threadId;\n\n if(wasPeerId === newPeerId && wasThreadId === threadId) {\n return;\n }\n\n this.dataset.peerId = '' + newPeerId;\n\n if(threadId) {\n this.dataset.threadId = '' + threadId;\n } else if(wasThreadId) {\n delete this.dataset.threadId;\n }\n\n if(wasPeerId) {\n const key = getAvatarQueueKey(wasPeerId, wasThreadId);\n const set = believeMe.get(key);\n if(set) {\n set.delete(this);\n if(!set.size) {\n believeMe.delete(key);\n }\n }\n }\n\n const middleware = options.wrapOptions?.middleware;\n this.middlewareHelper.destroy();\n if(middleware) {\n this.middlewareHelper = middleware.create();\n } else {\n this.middlewareHelper.destroy();\n }\n\n return this.update();\n }\n\n public remove() {\n this.middlewareHelper.destroy();\n super.remove();\n }\n\n private r(onlyThumb = false) {\n const promise = putPhoto({\n div: this,\n peerId: this.peerId,\n isDialog: this.isDialog,\n title: this.peerTitle,\n onlyThumb,\n isBig: this.isBig,\n threadId: this.threadId,\n wrapOptions: {\n middleware: this.middlewareHelper.get(),\n ...(this.wrapOptions || {})\n }\n });\n // recordPromise(promise, 'avatar putPhoto-' + this.peerId);\n\n if(this.loadPromises) {\n this.loadPromises.push(promise);\n\n promise.finally(() => {\n this.loadPromises = undefined;\n });\n }\n\n return promise;\n }\n\n public update() {\n if(this.lazyLoadQueue) {\n if(!seen.has(this.peerId)) {\n if(this.addedToQueue) return;\n this.addedToQueue = true;\n\n const key = getAvatarQueueKey(this.peerId, this.threadId);\n let set = believeMe.get(key);\n if(!set) {\n believeMe.set(key, set = new Set());\n }\n\n set.add(this);\n\n this.lazyLoadQueue.push({\n div: this,\n load: () => {\n seen.add(this.peerId);\n return this.update();\n }\n });\n\n return this.r(true);\n } else if(this.addedToQueue) {\n this.lazyLoadQueue.delete({div: this});\n }\n }\n\n seen.add(this.peerId);\n\n const promise = this.r();\n\n if(this.addedToQueue) {\n promise.finally(() => {\n this.addedToQueue = false;\n });\n }\n\n const key = getAvatarQueueKey(this.peerId, this.threadId);\n const set = believeMe.get(key);\n if(set) {\n set.delete(this);\n const arr = Array.from(set);\n believeMe.delete(key);\n\n for(let i = 0, length = arr.length; i < length; ++i) {\n arr[i].update();\n }\n }\n\n return promise;\n }\n}\n\ncustomElements.define('avatar-element', AvatarElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {CancellablePromise} from '../helpers/cancellablePromise';\nimport type {InputFile} from '../layer';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport PopupElement from './popups';\nimport PopupAvatar from './popups/avatar';\n\nexport default class AvatarEdit {\n public container: HTMLElement;\n private canvas: HTMLCanvasElement;\n private icon: HTMLSpanElement;\n\n constructor(onChange: (uploadAvatar: () => CancellablePromise) => void, options?: ConstructorParameters[0]) {\n this.container = document.createElement('div');\n this.container.classList.add('avatar-edit');\n\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('avatar-edit-canvas');\n\n this.icon = document.createElement('span');\n this.icon.classList.add('tgico', 'tgico-cameraadd');\n\n this.container.append(this.canvas, this.icon);\n\n attachClickEvent(this.container, () => {\n PopupElement.createPopup(PopupAvatar, options).open(this.canvas, onChange);\n });\n }\n\n public clear() {\n const ctx = this.canvas.getContext('2d');\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport ripple from './ripple';\n\nexport type ButtonOptions = Partial<{\n noRipple: true,\n onlyMobile: true,\n icon: string,\n rippleSquare: true,\n text: LangPackKey,\n disabled: boolean,\n asDiv: boolean,\n asLink: boolean\n}>;\n\nexport default function Button(className: string, options: T = {} as T): T['asLink'] extends true ? HTMLAnchorElement : HTMLButtonElement {\n const button = document.createElement(options.asLink ? 'a' : (options.asDiv ? 'div' : 'button'));\n button.className = className + (options.icon ? ' tgico-' + options.icon : '');\n\n if(!options.noRipple) {\n if(options.rippleSquare) {\n button.classList.add('rp-square');\n }\n\n ripple(button);\n }\n\n if(options.onlyMobile) {\n button.classList.add('only-handhelds');\n }\n\n if(options.disabled) {\n button.setAttribute('disabled', 'true');\n }\n\n if(options.text) {\n button.append(i18n(options.text));\n }\n\n return button as any;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Button from './button';\n\nconst ButtonCorner = (options: Partial<{className: string, icon: string, noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\n const button = Button('btn-circle btn-corner z-depth-1' + (options.className ? ' ' + options.className : ''), options);\n return button;\n};\n\nexport default ButtonCorner;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Button from './button';\n\nconst ButtonIcon = (className?: string, options: Partial<{noRipple: true, onlyMobile: true, asDiv: boolean}> = {}) => {\n const button = Button('btn-icon', {\n icon: className || undefined,\n ...options\n });\n\n return button;\n};\n\nexport default ButtonIcon;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport flatten from '../helpers/array/flatten';\nimport contextMenuController from '../helpers/contextMenuController';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {AttachClickOptions, attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\nimport CheckboxField from './checkboxField';\nimport {Document} from '../layer';\nimport wrapPhoto from './wrappers/photo';\nimport textToSvgURL from '../helpers/textToSvgURL';\nimport customProperties from '../helpers/dom/customProperties';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport ripple from './ripple';\n\nexport type ButtonMenuItemOptions = {\n icon?: string,\n iconDoc?: Document.document,\n text?: LangPackKey,\n textArgs?: FormatterArguments,\n regularText?: Parameters[1],\n onClick: (e: MouseEvent | TouchEvent) => any,\n checkForClose?: () => boolean,\n element?: HTMLElement,\n textElement?: HTMLElement,\n options?: AttachClickOptions,\n checkboxField?: CheckboxField,\n noCheckboxClickListener?: boolean,\n keepOpen?: boolean,\n separator?: boolean | HTMLElement,\n multiline?: boolean,\n loadPromise?: Promise,\n waitForAnimation?: boolean\n /* , cancelEvent?: true */\n};\n\nexport type ButtonMenuItemOptionsVerifiable = ButtonMenuItemOptions & {\n verify?: () => boolean | Promise\n};\n\nfunction ButtonMenuItem(options: ButtonMenuItemOptions) {\n if(options.element) return [options.separator as HTMLElement, options.element].filter(Boolean);\n\n const {icon, iconDoc, text, onClick, checkboxField, noCheckboxClickListener} = options;\n const el = document.createElement('div');\n el.className = 'btn-menu-item rp-overflow' + (icon ? ' tgico-' + icon : '');\n\n if(IS_MOBILE) {\n ripple(el);\n }\n\n let textElement = options.textElement;\n if(!textElement) {\n textElement = options.textElement = text ? i18n(text, options.textArgs) : document.createElement('span');\n if(options.regularText) {\n setInnerHTML(textElement, options.regularText);\n }\n }\n\n if(iconDoc) {\n const iconElement = document.createElement('span');\n iconElement.classList.add('btn-menu-item-icon');\n el.append(iconElement);\n\n options.loadPromise = wrapPhoto({\n container: iconElement,\n photo: iconDoc,\n boxWidth: 24,\n boxHeight: 24,\n withoutPreloader: true,\n noFadeIn: true,\n noBlur: true,\n processUrl: (url) => {\n return fetch(url)\n .then((response) => response.text())\n .then((text) => {\n const color = customProperties.getProperty('primary-text-color');\n const doc = new DOMParser().parseFromString(text, 'image/svg+xml');\n const svg = doc.firstElementChild as HTMLElement;\n svg.querySelectorAll('path').forEach((path) => {\n path.setAttributeNS(null, 'fill', color);\n path.style.stroke = color;\n path.style.strokeWidth = '.25px';\n });\n return textToSvgURL(svg.outerHTML);\n });\n }\n }).then((ret) => ret.loadPromises.thumb);\n }\n\n textElement.classList.add('btn-menu-item-text');\n el.append(textElement);\n\n const keepOpen = !!checkboxField || !!options.keepOpen;\n\n // * cancel mobile keyboard close\n onClick && attachClickEvent(el, /* CLICK_EVENT_NAME !== 'click' || keepOpen ? */ /* async */(e) => {\n cancelEvent(e);\n\n const menu = findUpClassName(e.target, 'btn-menu');\n if(menu && !menu.classList.contains('active')) {\n return;\n }\n\n // let closed = false;\n // if(!keepOpen && !options.checkForClose) {\n // closed = true;\n // contextMenuController.close();\n // }\n\n // wait for closing animation\n // if(options.waitForAnimation && rootScope.settings.animationsEnabled && !options.checkForClose) {\n // await pause(125);\n // }\n\n onClick(e);\n if(options.checkForClose?.() === false) {\n return;\n }\n\n if(!keepOpen/* && !closed */) {\n contextMenuController.close();\n }\n\n if(checkboxField && !noCheckboxClickListener/* && result !== false */) {\n checkboxField.checked = checkboxField.input.type === 'radio' ? true : !checkboxField.checked;\n }\n }/* : onClick */, options.options);\n\n if(checkboxField) {\n el.append(checkboxField.label);\n }\n\n if(options.separator === true) {\n options.separator = document.createElement('hr');\n }\n\n if(options.multiline) {\n el.classList.add('is-multiline');\n }\n\n return [options.separator as HTMLElement, options.element = el].filter(Boolean);\n}\n\nexport function ButtonMenuSync({listenerSetter, buttons}: {\n buttons: ButtonMenuItemOptions[],\n listenerSetter?: ListenerSetter\n}) {\n const el: HTMLElement = document.createElement('div');\n el.classList.add('btn-menu');\n\n if(listenerSetter) {\n buttons.forEach((b) => {\n if(b.options) {\n b.options.listenerSetter = listenerSetter;\n } else {\n b.options = {listenerSetter};\n }\n });\n }\n\n const items = buttons.map(ButtonMenuItem);\n el.append(...flatten(items));\n\n return el;\n}\n\nexport default async function ButtonMenu(options: Parameters[0]) {\n const el = ButtonMenuSync(options);\n await Promise.all(options.buttons.map(({loadPromise}) => loadPromise));\n return el;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport contextMenuController from '../helpers/contextMenuController';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {AttachClickOptions, CLICK_EVENT_NAME} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ButtonIcon from './buttonIcon';\nimport ButtonMenu, {ButtonMenuItemOptionsVerifiable} from './buttonMenu';\nimport filterAsync from '../helpers/array/filterAsync';\nimport {doubleRaf} from '../helpers/schedulers';\n\n// TODO: refactor for attachClickEvent, because if move finger after touchstart, it will start anyway\nexport function ButtonMenuToggleHandler({\n el,\n onOpen,\n options,\n onClose\n}: {\n el: HTMLElement,\n onOpen?: (e: Event) => any,\n options?: AttachClickOptions,\n onClose?: () => void\n}) {\n const add = options?.listenerSetter ? options.listenerSetter.add(el) : el.addEventListener.bind(el);\n\n add(CLICK_EVENT_NAME, (e: Event) => {\n if(!el.classList.contains('btn-menu-toggle')) return false;\n\n cancelEvent(e);\n\n if(el.classList.contains('menu-open')) {\n contextMenuController.close();\n } else {\n const result = onOpen?.(e);\n const open = () => {\n const openedMenu = el.querySelector('.btn-menu') as HTMLDivElement;\n contextMenuController.openBtnMenu(openedMenu, onClose);\n };\n\n if(result instanceof Promise) {\n result.then(open);\n } else {\n open();\n }\n }\n });\n}\n\nexport default function ButtonMenuToggle({\n buttonOptions,\n listenerSetter: attachListenerSetter,\n container,\n direction,\n buttons,\n onOpenBefore,\n onOpen,\n onClose,\n onCloseAfter\n}: {\n buttonOptions?: Parameters[1],\n listenerSetter?: ListenerSetter,\n container?: HTMLElement\n direction: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right',\n buttons: ButtonMenuItemOptionsVerifiable[],\n onOpenBefore?: (e: Event) => any,\n onOpen?: (e: Event, element: HTMLElement) => any,\n onClose?: () => void,\n onCloseAfter?: () => void\n}) {\n if(buttonOptions) {\n buttonOptions.asDiv = true;\n }\n\n const button = container ?? ButtonIcon('more', buttonOptions);\n button.classList.add('btn-menu-toggle');\n\n const listenerSetter = new ListenerSetter();\n\n let element: HTMLElement, closeTimeout: number;\n ButtonMenuToggleHandler({\n el: button,\n onOpen: async(e) => {\n await onOpenBefore?.(e);\n if(closeTimeout) {\n clearTimeout(closeTimeout);\n closeTimeout = undefined;\n return;\n }\n\n const f = (b: (typeof buttons[0])[]) => filterAsync(b, (button) => button?.verify?.() ?? true);\n\n const filteredButtons = await f(buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const _element = element = await ButtonMenu({\n buttons: filteredButtons,\n listenerSetter\n });\n _element.classList.add(direction);\n\n await onOpen?.(e, _element);\n\n button.append(_element);\n await doubleRaf();\n },\n options: {\n listenerSetter: attachListenerSetter\n },\n onClose: () => {\n onClose?.();\n\n closeTimeout = window.setTimeout(() => {\n onCloseAfter?.();\n closeTimeout = undefined;\n listenerSetter.removeAll();\n buttons.forEach((button) => button.element = undefined);\n element.remove();\n }, 300);\n }\n });\n\n return button;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko, Artem Kolnogorov and unknown creator of the script taken from http://useless.altervista.org/gradient.html\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {animateSingle} from '../../helpers/animation';\nimport {hexToRgb} from '../../helpers/color';\nimport {easeOutQuadApply} from '../../helpers/easing/easeOutQuad';\n\nconst WIDTH = 50;\nconst HEIGHT = WIDTH;\n\nexport default class ChatBackgroundGradientRenderer {\n private readonly _width = WIDTH;\n private readonly _height = HEIGHT;\n private _phase: number;\n private _tail: number;\n private readonly _tails = 90;\n private readonly _scrollTails = 50;\n private _frames: ImageData[];\n private _colors: {r: number, g: number, b: number}[];\n private readonly _curve = [\n 0, 0.25, 0.50, 0.75, 1, 1.5, 2, 2.5, 3, 3.5, 4, 5, 6, 7, 8, 9, 10, 11, 12,\n 13, 14, 15, 16, 17, 18, 18.3, 18.6, 18.9, 19.2, 19.5, 19.8, 20.1, 20.4, 20.7,\n 21.0, 21.3, 21.6, 21.9, 22.2, 22.5, 22.8, 23.1, 23.4, 23.7, 24.0, 24.3, 24.6,\n 24.9, 25.2, 25.5, 25.8, 26.1, 26.3, 26.4, 26.5, 26.6, 26.7, 26.8, 26.9, 27\n ];\n private readonly _incrementalCurve: number[];\n private readonly _positions = [\n {x: 0.80, y: 0.10},\n {x: 0.60, y: 0.20},\n {x: 0.35, y: 0.25},\n {x: 0.25, y: 0.60},\n {x: 0.20, y: 0.90},\n {x: 0.40, y: 0.80},\n {x: 0.65, y: 0.75},\n {x: 0.75, y: 0.40}\n ];\n private readonly _phases = this._positions.length;\n private _onWheelRAF: number;\n private _scrollDelta: number;\n\n // private _ts = 0;\n // private _fps = 15;\n // private _frametime = 1000 / this._fps;\n // private _raf: number;\n\n private _canvas: HTMLCanvasElement;\n private _ctx: CanvasRenderingContext2D;\n private _hc: HTMLCanvasElement;\n private _hctx: CanvasRenderingContext2D;\n\n private _addedScrollListener: boolean;\n private _animatingToNextPosition: boolean;\n private _nextPositionTail: number;\n private _nextPositionTails: number;\n private _nextPositionLeft: number;\n\n constructor() {\n const diff = this._tails / this._curve[this._curve.length - 1];\n\n for(let i = 0, length = this._curve.length; i < length; ++i) {\n this._curve[i] = this._curve[i] * diff;\n }\n\n this._incrementalCurve = this._curve.map((v, i, arr) => {\n return v - (arr[i - 1] ?? 0);\n });\n }\n\n private hexToRgb(hex: string) {\n const result = hexToRgb(hex);\n return {r: result[0], g: result[1], b: result[2]};\n }\n\n private getPositions(shift: number) {\n const positions = this._positions.slice();\n positions.push(...positions.splice(0, shift));\n\n const result: typeof positions = [];\n for(let i = 0; i < positions.length; i += 2) {\n result.push(positions[i]);\n }\n return result;\n }\n\n private getNextPositions(phase: number, curveMax: number, curve: number[]) {\n const pos = this.getPositions(phase);\n if(!curve[0] && curve.length === 1) {\n return [pos];\n }\n\n const nextPos = this.getPositions(++phase % this._phases);\n const distances = nextPos.map((nextPos, idx) => {\n return {\n x: (nextPos.x - pos[idx].x) / curveMax,\n y: (nextPos.y - pos[idx].y) / curveMax\n };\n });\n\n const positions = curve.map((value) => {\n return distances.map((distance, idx) => {\n return {\n x: pos[idx].x + distance.x * value,\n y: pos[idx].y + distance.y * value\n };\n });\n });\n\n return positions;\n }\n\n private curPosition(phase: number, tail: number) {\n const positions = this.getNextPositions(phase, this._tails, [tail]);\n return positions[0];\n }\n\n private changeTail(diff: number) {\n this._tail += diff;\n\n while(this._tail >= this._tails) {\n this._tail -= this._tails;\n if(++this._phase >= this._phases) {\n this._phase -= this._phases;\n }\n }\n\n while(this._tail < 0) {\n this._tail += this._tails;\n if(--this._phase < 0) {\n this._phase += this._phases;\n }\n }\n }\n\n private onWheel = (e: {deltaY: number}) => {\n if(this._animatingToNextPosition) {\n return;\n }\n\n this._scrollDelta += e.deltaY;\n if(this._onWheelRAF === undefined) {\n this._onWheelRAF = requestAnimationFrame(this.drawOnWheel);\n }\n };\n\n private changeTailAndDraw(diff: number) {\n this.changeTail(diff);\n const curPos = this.curPosition(this._phase, this._tail);\n this.drawGradient(curPos);\n }\n\n private drawOnWheel = () => {\n const value = this._scrollDelta / this._scrollTails;\n this._scrollDelta %= this._scrollTails;\n const diff = value > 0 ? Math.floor(value) : Math.ceil(value);\n if(diff) {\n this.changeTailAndDraw(diff);\n }\n this._onWheelRAF = undefined;\n };\n\n private drawNextPositionAnimated = (getProgress?: () => number) => {\n let done: boolean, id: ImageData;\n if(getProgress) {\n const value = getProgress();\n done = value >= 1;\n const transitionValue = easeOutQuadApply(value, 1);\n const nextPositionTail = this._nextPositionTail ?? 0;\n const tail = this._nextPositionTail = this._nextPositionTails * transitionValue;\n const diff = tail - nextPositionTail;\n if(diff) {\n this._nextPositionLeft -= diff;\n this.changeTailAndDraw(diff);\n }\n } else {\n const frames = this._frames;\n id = frames.shift();\n done = !frames.length;\n }\n\n if(id) {\n this.drawImageData(id);\n }\n\n if(done) {\n this._nextPositionLeft = undefined;\n this._nextPositionTails = undefined;\n this._nextPositionTail = undefined;\n this._animatingToNextPosition = undefined;\n }\n\n return !done;\n };\n\n private getGradientImageData(positions: {x: number, y: number}[]) {\n const id = this._hctx.createImageData(this._width, this._height);\n const pixels = id.data;\n\n let offset = 0;\n for(let y = 0; y < this._height; ++y) {\n const directPixelY = y / this._height;\n const centerDistanceY = directPixelY - 0.5;\n const centerDistanceY2 = centerDistanceY * centerDistanceY;\n\n for(let x = 0; x < this._width; ++x) {\n const directPixelX = x / this._width;\n\n const centerDistanceX = directPixelX - 0.5;\n const centerDistance = Math.sqrt(centerDistanceX * centerDistanceX + centerDistanceY2);\n\n const swirlFactor = 0.35 * centerDistance;\n const theta = swirlFactor * swirlFactor * 0.8 * 8.0;\n const sinTheta = Math.sin(theta);\n const cosTheta = Math.cos(theta);\n\n const pixelX = Math.max(0.0, Math.min(1.0, 0.5 + centerDistanceX * cosTheta - centerDistanceY * sinTheta));\n const pixelY = Math.max(0.0, Math.min(1.0, 0.5 + centerDistanceX * sinTheta + centerDistanceY * cosTheta));\n\n let distanceSum = 0.0;\n\n let r = 0.0;\n let g = 0.0;\n let b = 0.0;\n\n for(let i = 0; i < this._colors.length; i++) {\n const colorX = positions[i].x;\n const colorY = positions[i].y;\n\n const distanceX = pixelX - colorX;\n const distanceY = pixelY - colorY;\n\n let distance = Math.max(0.0, 0.9 - Math.sqrt(distanceX * distanceX + distanceY * distanceY));\n distance = distance * distance * distance * distance;\n distanceSum += distance;\n\n r += distance * this._colors[i].r / 255;\n g += distance * this._colors[i].g / 255;\n b += distance * this._colors[i].b / 255;\n }\n\n pixels[offset++] = r / distanceSum * 255.0;\n pixels[offset++] = g / distanceSum * 255.0;\n pixels[offset++] = b / distanceSum * 255.0;\n pixels[offset++] = 0xFF;\n }\n }\n return id;\n }\n\n private drawImageData(id: ImageData) {\n this._hctx.putImageData(id, 0, 0);\n this._ctx.drawImage(this._hc, 0, 0, this._width, this._height);\n }\n\n private drawGradient(positions: {x: number, y: number}[]) {\n this.drawImageData(this.getGradientImageData(positions));\n }\n\n // private doAnimate = () => {\n // const now = +Date.now();\n // if(!document.hasFocus() || (now - this._ts) < this._frametime) {\n // this._raf = requestAnimationFrame(this.doAnimate);\n // return;\n // }\n\n // this._ts = now;\n // this.changeTail(1);\n // const cur_pos = this.curPosition(this._phase, this._tail);\n // this.drawGradient(cur_pos);\n // this._raf = requestAnimationFrame(this.doAnimate);\n // };\n\n // public animate(start?: boolean) {\n // if(!start) {\n // cancelAnimationFrame(this._raf);\n // return;\n // }\n // this.doAnimate();\n // }\n\n public init(el: HTMLCanvasElement) {\n this._frames = [];\n this._phase = 0;\n this._tail = 0;\n this._scrollDelta = 0;\n if(this._onWheelRAF !== undefined) {\n cancelAnimationFrame(this._onWheelRAF);\n this._onWheelRAF = undefined;\n }\n\n const colors = el.getAttribute('data-colors').split(',').reverse();\n this._colors = colors.map((color) => {\n return this.hexToRgb(color);\n });\n\n if(!this._hc) {\n this._hc = document.createElement('canvas');\n this._hc.width = this._width;\n this._hc.height = this._height;\n this._hctx = this._hc.getContext('2d', {alpha: false});\n }\n\n this._canvas = el;\n this._ctx = this._canvas.getContext('2d', {alpha: false});\n this.update();\n }\n\n public update() {\n if(this._colors.length < 2) {\n const color = this._colors[0];\n this._ctx.fillStyle = `rgb(${color.r}, ${color.g}, ${color.b})`;\n this._ctx.fillRect(0, 0, this._width, this._height);\n return;\n }\n\n const pos = this.curPosition(this._phase, this._tail);\n this.drawGradient(pos);\n }\n\n public toNextPosition(getProgress?: () => number) {\n if(this._colors.length < 2) {\n return;\n }\n\n if(getProgress) {\n this._nextPositionLeft = this._tails + (this._nextPositionLeft ?? 0);\n this._nextPositionTails = this._nextPositionLeft;\n this._nextPositionTail = undefined;\n this._animatingToNextPosition = true;\n animateSingle(this.drawNextPositionAnimated.bind(this, getProgress), this);\n return;\n }\n\n const tail = this._tail;\n const tails = this._tails;\n\n let nextPhaseOnIdx: number;\n\n const curve: number[] = [];\n for(let i = 0, length = this._incrementalCurve.length; i < length; ++i) {\n const inc = this._incrementalCurve[i];\n let value = (curve[i - 1] ?? tail) + inc;\n\n if(+value.toFixed(2) > tails && nextPhaseOnIdx === undefined) {\n nextPhaseOnIdx = i;\n value %= tails;\n }\n\n curve.push(value);\n }\n\n const currentPhaseCurve = curve.slice(0, nextPhaseOnIdx);\n const nextPhaseCurve = nextPhaseOnIdx !== undefined ? curve.slice(nextPhaseOnIdx) : [];\n\n [currentPhaseCurve, nextPhaseCurve].forEach((curve, idx, curves) => {\n const last = curve[curve.length - 1];\n if(last !== undefined && last > tails) {\n curve[curve.length - 1] = +last.toFixed(2);\n }\n\n this._tail = last ?? 0;\n\n if(!curve.length) {\n return;\n }\n\n const positions = this.getNextPositions(this._phase, tails, curve);\n if(idx !== (curves.length - 1)) {\n if(++this._phase >= this._phases) {\n this._phase -= this._phases;\n }\n }\n\n const ids = positions.map((pos) => {\n return this.getGradientImageData(pos);\n });\n\n this._frames.push(...ids);\n });\n\n this._animatingToNextPosition = true;\n animateSingle(this.drawNextPositionAnimated, this);\n }\n\n // public toNextPositionThrottled = throttle(this.toNextPosition.bind(this), 100, true);\n\n public scrollAnimate(start?: boolean) {\n return;\n\n if(this._colors.length < 2 && start) {\n return;\n }\n\n if(start && !this._addedScrollListener) {\n document.addEventListener('wheel', this.onWheel);\n this._addedScrollListener = true;\n } else if(!start && this._addedScrollListener) {\n document.removeEventListener('wheel', this.onWheel);\n this._addedScrollListener = false;\n }\n }\n\n public cleanup() {\n this.scrollAnimate(false);\n // this.animate(false);\n }\n\n public static createCanvas(colors?: string) {\n const canvas = document.createElement('canvas');\n canvas.width = WIDTH;\n canvas.height = HEIGHT;\n if(colors !== undefined) {\n canvas.dataset.colors = colors;\n }\n\n return canvas;\n }\n\n public static create(colors?: string) {\n const canvas = this.createCanvas(colors);\n const gradientRenderer = new ChatBackgroundGradientRenderer();\n gradientRenderer.init(canvas);\n\n return {gradientRenderer, canvas};\n }\n}\n","export default function easeOutQuad(t: number, b: number, c: number, d: number) {\n return t >= d ? b + c : easeOutQuadApply(t / d, c) + b;\n}\n\nexport function easeOutQuadApply(v: number, c: number) {\n return -c * v * (v - 2);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppMessagesManager, MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\nimport type ChatBubbles from './bubbles';\nimport type ChatInput from './input';\nimport type Chat from './chat';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport Button from '../button';\nimport ButtonIcon from '../buttonIcon';\nimport CheckboxField from '../checkboxField';\nimport PopupDeleteMessages from '../popups/deleteMessages';\nimport PopupForward from '../popups/forward';\nimport SetTransition from '../singleTransition';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport PopupSendNow from '../popups/sendNow';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport I18n, {i18n, _i18n} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport cancelSelection from '../../helpers/dom/cancelSelection';\nimport getSelectedText from '../../helpers/dom/getSelectedText';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport AppSearchSuper from '../appSearchSuper.';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport {randomLong} from '../../helpers/random';\nimport {attachClickEvent, AttachClickOptions} from '../../helpers/dom/clickEvent';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport appImManager from '../../lib/appManagers/appImManager';\n\nconst accumulateMapSet = (map: Map>) => {\n return [...map.values()].reduce((acc, v) => acc + v.size, 0);\n};\n\n// const MIN_CLICK_MOVE = 32; // minimum bubble height\n\nclass AppSelection extends EventListenerBase<{\n toggle: (isSelecting: boolean) => void\n}> {\n public selectedMids: Map> = new Map();\n public isSelecting = false;\n\n public selectedText: string;\n\n protected listenerSetter: ListenerSetter;\n protected isScheduled: boolean;\n protected listenElement: HTMLElement;\n\n protected onToggleSelection: (forwards: boolean, animate: boolean) => void | Promise;\n protected onUpdateContainer: (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => void;\n protected onCancelSelection: () => void;\n protected toggleByMid: (peerId: PeerId, mid: number) => void;\n protected toggleByElement: (bubble: HTMLElement) => void;\n\n protected navigationType: NavigationItem['type'];\n\n protected getElementFromTarget: (target: HTMLElement) => HTMLElement;\n protected verifyTarget: (e: MouseEvent, target: HTMLElement) => boolean;\n protected verifyMouseMoveTarget: (e: MouseEvent, element: HTMLElement, selecting: boolean) => boolean;\n protected verifyTouchLongPress: () => boolean;\n protected targetLookupClassName: string;\n protected lookupBetweenParentClassName: string;\n protected lookupBetweenElementsQuery: string;\n\n protected doNotAnimate: boolean;\n protected managers: AppManagers;\n\n constructor(options: {\n managers: AppManagers,\n getElementFromTarget: AppSelection['getElementFromTarget'],\n verifyTarget?: AppSelection['verifyTarget'],\n verifyMouseMoveTarget?: AppSelection['verifyMouseMoveTarget'],\n verifyTouchLongPress?: AppSelection['verifyTouchLongPress'],\n targetLookupClassName: string,\n lookupBetweenParentClassName: string,\n lookupBetweenElementsQuery: string,\n isScheduled?: AppSelection['isScheduled']\n }) {\n super(false);\n\n safeAssign(this, options);\n\n this.navigationType = 'multiselect-' + randomLong() as any;\n }\n\n public attachListeners(listenElement: HTMLElement, listenerSetter: ListenerSetter) {\n if(this.listenElement) {\n this.listenerSetter.removeAll();\n }\n\n this.listenElement = listenElement;\n this.listenerSetter = listenerSetter;\n\n if(!listenElement) {\n return;\n }\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(listenElement)('touchend', () => {\n if(!this.isSelecting) return;\n this.selectedText = getSelectedText();\n });\n\n attachContextMenuListener({\n element: listenElement,\n callback: (e) => {\n if(this.isSelecting || (this.verifyTouchLongPress && !this.verifyTouchLongPress())) return;\n\n // * these two lines will fix instant text selection on iOS Safari\n document.body.classList.add('no-select'); // * need no-select on body because chat-input transforms in channels\n listenElement.addEventListener('touchend', (e) => {\n cancelEvent(e); // ! this one will fix propagation to document loader button, etc\n document.body.classList.remove('no-select');\n\n // this.chat.bubbles.onBubblesClick(e);\n }, {once: true, capture: true});\n\n cancelSelection();\n // cancelEvent(e as any);\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(element) {\n this.toggleByElement(element);\n }\n },\n listenerSetter\n });\n\n return;\n }\n\n listenerSetter.add(listenElement)('mousedown', this.onMouseDown);\n }\n\n private onMouseDown = (e: MouseEvent) => {\n // console.log('selection mousedown', e);\n const element = findUpClassName(e.target, this.targetLookupClassName);\n if(e.button !== 0) {\n return;\n }\n\n if(this.verifyTarget && !this.verifyTarget(e, element)) {\n return;\n }\n\n const seen: AppSelection['selectedMids'] = new Map();\n let selecting: boolean;\n\n /* let good = false;\n const {x, y} = e; */\n\n /* const bubbles = appImManager.bubbles;\n for(const mid in bubbles) {\n const bubble = bubbles[mid];\n bubble.addEventListener('mouseover', () => {\n console.log('mouseover');\n }, {once: true});\n } */\n\n let firstTarget = element;\n\n const processElement = (element: HTMLElement, checkBetween = true) => {\n const mid = +element.dataset.mid;\n if(!mid || !element.dataset.peerId) return;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!isInDOM(firstTarget)) {\n firstTarget = element;\n }\n\n let seenSet = seen.get(peerId);\n if(!seenSet) {\n seen.set(peerId, seenSet = new Set());\n }\n\n if(seenSet.has(mid)) {\n return;\n }\n\n const isSelected = this.isMidSelected(peerId, mid);\n if(selecting === undefined) {\n // bubblesContainer.classList.add('no-select');\n selecting = !isSelected;\n }\n\n seenSet.add(mid);\n\n if((selecting && !isSelected) || (!selecting && isSelected)) {\n const seenLength = accumulateMapSet(seen);\n if(this.toggleByElement && checkBetween) {\n if(seenLength < 2) {\n if(findUpAsChild(element, firstTarget)) {\n firstTarget = element;\n }\n }\n\n const elementsBetween = this.getElementsBetween(firstTarget, element);\n // console.log(elementsBetween);\n if(elementsBetween.length) {\n elementsBetween.forEach((element) => {\n processElement(element, false);\n });\n }\n }\n\n if(!this.selectedMids.size) {\n if(seenLength === 2 && this.toggleByMid) {\n for(const [peerId, mids] of seen) {\n for(const mid of mids) {\n this.toggleByMid(peerId, mid);\n }\n }\n }\n } else if(this.toggleByElement) {\n this.toggleByElement(element);\n }\n }\n };\n\n // const foundTargets: Map = new Map();\n let canceledSelection = false;\n const onMouseMove = (e: MouseEvent) => {\n if(!canceledSelection) {\n cancelSelection();\n canceledSelection = true;\n }\n /* if(!good) {\n if(Math.abs(e.x - x) > MIN_CLICK_MOVE || Math.abs(e.y - y) > MIN_CLICK_MOVE) {\n good = true;\n } else {\n return;\n }\n } */\n\n /* if(foundTargets.has(e.target as HTMLElement)) return;\n foundTargets.set(e.target as HTMLElement, true); */\n const element = this.getElementFromTarget(e.target as HTMLElement);\n if(!element) {\n // console.error('found no bubble', e);\n return;\n }\n\n if(this.verifyMouseMoveTarget && !this.verifyMouseMoveTarget(e, element, selecting)) {\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n this.listenerSetter.removeManual(document, 'mouseup', onMouseUp, documentListenerOptions);\n return;\n }\n\n processElement(element);\n };\n\n const onMouseUp = (e: MouseEvent) => {\n if(seen.size) {\n attachClickEvent(window, cancelEvent, {capture: true, once: true, passive: false});\n }\n\n this.listenerSetter.removeManual(this.listenElement, 'mousemove', onMouseMove);\n // bubblesContainer.classList.remove('no-select');\n\n // ! CANCEL USER SELECTION !\n cancelSelection();\n };\n\n const documentListenerOptions = {once: true};\n this.listenerSetter.add(this.listenElement)('mousemove', onMouseMove);\n this.listenerSetter.add(document)('mouseup', onMouseUp, documentListenerOptions);\n };\n\n private getElementsBetween = (first: HTMLElement, last: HTMLElement) => {\n if(first === last) {\n return [];\n }\n\n const firstRect = first.getBoundingClientRect();\n const lastRect = last.getBoundingClientRect();\n const difference = (firstRect.top - lastRect.top) || (firstRect.left - lastRect.left);\n const isHigher = difference < 0;\n\n const parent = findUpClassName(first, this.lookupBetweenParentClassName);\n if(!parent) {\n return [];\n }\n\n const elements = Array.from(parent.querySelectorAll(this.lookupBetweenElementsQuery)) as HTMLElement[];\n let firstIndex = elements.indexOf(first);\n let lastIndex = elements.indexOf(last);\n\n if(!isHigher) {\n [lastIndex, firstIndex] = [firstIndex, lastIndex];\n }\n\n const slice = elements.slice(firstIndex + 1, lastIndex);\n\n // console.log('getElementsBetween', first, last, slice, firstIndex, lastIndex, isHigher);\n\n return slice;\n };\n\n protected isElementShouldBeSelected(element: HTMLElement) {\n return this.isMidSelected(element.dataset.peerId.toPeerId(), +element.dataset.mid);\n }\n\n protected appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n element.prepend(checkboxField.label);\n }\n\n public toggleElementCheckbox(element: HTMLElement, show: boolean) {\n const hasCheckbox = !!this.getCheckboxInputFromElement(element);\n if(show) {\n if(hasCheckbox) {\n return false;\n }\n\n const checkboxField = new CheckboxField({\n name: element.dataset.mid,\n round: true\n });\n\n // * if it is a render of new message\n if(this.isSelecting) { // ! avoid breaking animation on start\n if(this.isElementShouldBeSelected(element)) {\n checkboxField.input.checked = true;\n element.classList.add('is-selected');\n }\n }\n\n this.appendCheckbox(element, checkboxField);\n } else if(hasCheckbox) {\n this.getCheckboxInputFromElement(element).parentElement.remove();\n SetTransition({\n element,\n className: 'is-selected',\n forwards: false,\n duration: 200\n });\n }\n\n return true;\n }\n\n protected getCheckboxInputFromElement(element: HTMLElement): HTMLInputElement {\n return element.firstElementChild?.tagName === 'LABEL' &&\n element.firstElementChild.firstElementChild as HTMLInputElement;\n }\n\n protected async updateContainer(forceSelection = false) {\n const size = this.selectedMids.size;\n if(!size && !forceSelection) return;\n\n let cantForward = !size,\n cantDelete = !size;\n const cantSend = !size;\n for(const [peerId, mids] of this.selectedMids) {\n const storageKey: MessagesStorageKey = `${peerId}_${this.isScheduled ? 'scheduled' : 'history'}`;\n const r = await this.managers.appMessagesManager.cantForwardDeleteMids(storageKey, Array.from(mids));\n cantForward = r.cantForward;\n cantDelete = r.cantDelete;\n\n if(cantForward && cantDelete) break;\n }\n\n this.onUpdateContainer?.(cantForward, cantDelete, cantSend);\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const wasSelecting = this.isSelecting;\n const size = this.selectedMids.size;\n this.isSelecting = !!size || forceSelection;\n\n if(wasSelecting === this.isSelecting) return false;\n\n this.dispatchEvent('toggle', this.isSelecting);\n\n // const bubblesContainer = this.bubbles.bubblesContainer;\n // bubblesContainer.classList.toggle('is-selecting', !!size);\n\n /* if(bubblesContainer.classList.contains('is-chat-input-hidden')) {\n const scrollable = this.appImManager.scrollable;\n if(scrollable.isScrolledDown) {\n scrollable.scrollTo(scrollable.scrollHeight, 'top', true, true, 200);\n }\n } */\n\n if(!IS_TOUCH_SUPPORTED) {\n this.listenElement.classList.toggle('no-select', this.isSelecting);\n\n if(wasSelecting) {\n // ! CANCEL USER SELECTION !\n cancelSelection();\n }\n }/* else {\n if(!wasSelecting) {\n bubblesContainer.classList.add('no-select');\n setTimeout(() => {\n cancelSelection();\n bubblesContainer.classList.remove('no-select');\n cancelSelection();\n }, 100);\n }\n } */\n\n blurActiveElement();\n\n const forwards = !!size || forceSelection;\n const toggleResult = this.onToggleSelection?.(forwards, !this.doNotAnimate);\n\n if(!IS_MOBILE_SAFARI) {\n if(forwards) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: () => {\n this.cancelSelection();\n }\n });\n } else {\n appNavigationController.removeByType(this.navigationType);\n }\n }\n\n if(forceSelection) {\n (toggleResult || Promise.resolve()).then(() => this.updateContainer(forceSelection));\n }\n\n return true;\n }\n\n public cancelSelection = async(doNotAnimate?: boolean) => {\n if(doNotAnimate) this.doNotAnimate = true;\n this.onCancelSelection && await this.onCancelSelection();\n this.selectedMids.clear();\n this.toggleSelection();\n cancelSelection();\n if(doNotAnimate) this.doNotAnimate = undefined;\n };\n\n public cleanup() {\n this.doNotAnimate = true;\n this.selectedMids.clear();\n this.toggleSelection(false);\n this.doNotAnimate = undefined;\n }\n\n protected updateElementSelection(element: HTMLElement, isSelected: boolean) {\n this.toggleElementCheckbox(element, true);\n const input = this.getCheckboxInputFromElement(element);\n input.checked = isSelected;\n\n this.toggleSelection();\n this.updateContainer();\n SetTransition({\n element,\n className: 'is-selected',\n forwards: isSelected,\n duration: 200\n });\n }\n\n public isMidSelected(peerId: PeerId, mid: number) {\n const set = this.selectedMids.get(peerId);\n return set?.has(mid);\n }\n\n public length() {\n return accumulateMapSet(this.selectedMids);\n }\n\n protected toggleMid(peerId: PeerId, mid: number, unselect?: boolean) {\n let set = this.selectedMids.get(peerId);\n if(unselect || (unselect === undefined && set?.has(mid))) {\n if(set) {\n set.delete(mid);\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n }\n } else {\n // const diff = rootScope.config.forwarded_count_max - this.length() - 1;\n // if(diff < 0) {\n // toast(I18n.format('Chat.Selection.LimitToast', true));\n // return false;\n // /* const it = this.selectedMids.values();\n // do {\n // const mid = it.next().value;\n // const mounted = this.appImManager.getMountedBubble(mid);\n // if(mounted) {\n // this.toggleByBubble(mounted.bubble);\n // } else {\n // const mids = this.appMessagesManager.getMidsByMid(mid);\n // for(const mid of mids) {\n // this.selectedMids.delete(mid);\n // }\n // }\n // } while(this.selectedMids.size > MAX_SELECTION_LENGTH); */\n // }\n\n if(!set) {\n set = new Set();\n this.selectedMids.set(peerId, set);\n }\n\n set.add(mid);\n }\n\n return true;\n }\n\n /**\n * ! Call this method only to handle deleted messages\n */\n public deleteSelectedMids(peerId: PeerId, mids: number[]) {\n const set = this.selectedMids.get(peerId);\n if(!set) {\n return;\n }\n\n mids.forEach((mid) => {\n set.delete(mid);\n });\n\n if(!set.size) {\n this.selectedMids.delete(peerId);\n }\n\n this.updateContainer();\n this.toggleSelection();\n }\n}\n\nexport class SearchSelection extends AppSelection {\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n public selectionGotoBtn: HTMLElement;\n\n private isPrivate: boolean;\n\n constructor(private searchSuper: AppSearchSuper, managers: AppManagers, listenerSetter: ListenerSetter) {\n super({\n managers,\n verifyTarget: (e, target) => !!target && this.isSelecting,\n getElementFromTarget: (target) => findUpClassName(target, 'search-super-item'),\n targetLookupClassName: 'search-super-item',\n lookupBetweenParentClassName: 'tabs-tab',\n lookupBetweenElementsQuery: '.search-super-item'\n });\n\n this.isPrivate = !searchSuper.showSender;\n this.attachListeners(searchSuper.container, listenerSetter);\n }\n\n /* public appendCheckbox(element: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(element.classList.contains('document') || element.tagName === 'AUDIO-ELEMENT') {\n element.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n } */\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n const elements = Array.from(this.searchSuper.tabsContainer.querySelectorAll('.search-super-item')) as HTMLElement[];\n elements.forEach((element) => {\n this.toggleElementCheckbox(element, this.isSelecting);\n });\n }\n\n return ret;\n }\n\n public toggleByElement = (element: HTMLElement) => {\n const mid = +element.dataset.mid;\n const peerId = element.dataset.peerId.toPeerId();\n\n if(!this.toggleMid(peerId, mid)) {\n return;\n }\n\n this.updateElementSelection(element, this.isMidSelected(peerId, mid));\n };\n\n public toggleByMid = (peerId: PeerId, mid: number) => {\n const element = this.searchSuper.mediaTab.contentTab.querySelector(`.search-super-item[data-peer-id=\"${peerId}\"][data-mid=\"${mid}\"]`) as HTMLElement;\n this.toggleByElement(element);\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n const length = this.length();\n replaceContent(this.selectionCountEl, i18n('messages', [length]));\n this.selectionGotoBtn.classList.toggle('hide', length !== 1);\n this.selectionForwardBtn.classList.toggle('hide', cantForward);\n this.selectionDeleteBtn && this.selectionDeleteBtn.classList.toggle('hide', cantDelete);\n };\n\n protected onToggleSelection = (forwards: boolean, animate: boolean) => {\n SetTransition({\n element: this.searchSuper.navScrollableContainer,\n className: 'is-selecting',\n forwards,\n duration: animate ? 200 : 0,\n onTransitionEnd: () => {\n if(!this.isSelecting) {\n this.selectionContainer.remove();\n this.selectionContainer =\n this.selectionForwardBtn =\n this.selectionDeleteBtn =\n null;\n this.selectedText = undefined;\n }\n }\n });\n\n SetTransition({\n element: this.searchSuper.container,\n className: 'is-selecting',\n forwards,\n duration: 200\n });\n\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n const BASE_CLASS = 'search-super-selection';\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add(BASE_CLASS + '-container');\n\n const btnCancel = ButtonIcon(`close ${BASE_CLASS}-cancel`, {noRipple: true});\n attachClickEvent(btnCancel, () => this.cancelSelection(), {listenerSetter: this.listenerSetter, once: true});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add(BASE_CLASS + '-count');\n\n this.selectionGotoBtn = ButtonIcon(`message ${BASE_CLASS}-goto`);\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n attachClickEvent(this.selectionGotoBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n const mid = [...this.selectedMids.get(peerId)][0];\n this.cancelSelection();\n\n appImManager.setInnerPeer({peerId, lastMsgId: mid});\n }, attachClickOptions);\n\n this.selectionForwardBtn = ButtonIcon(`forward ${BASE_CLASS}-forward`);\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n if(this.isPrivate) {\n this.selectionDeleteBtn = ButtonIcon(`delete danger ${BASE_CLASS}-delete`);\n attachClickEvent(this.selectionDeleteBtn, () => {\n const peerId = [...this.selectedMids.keys()][0];\n new PopupDeleteMessages(peerId, [...this.selectedMids.get(peerId)], 'chat', () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionContainer.append(...[\n btnCancel,\n this.selectionCountEl,\n this.selectionGotoBtn,\n this.selectionForwardBtn,\n this.selectionDeleteBtn\n ].filter(Boolean));\n\n const transitionElement = this.selectionContainer;\n transitionElement.style.opacity = '0';\n this.searchSuper.navScrollableContainer.append(transitionElement);\n\n void transitionElement.offsetLeft; // reflow\n transitionElement.style.opacity = '';\n }\n }\n };\n}\n\nexport default class ChatSelection extends AppSelection {\n protected selectionInputWrapper: HTMLElement;\n protected selectionContainer: HTMLElement;\n protected selectionCountEl: HTMLElement;\n public selectionSendNowBtn: HTMLElement;\n public selectionForwardBtn: HTMLElement;\n public selectionDeleteBtn: HTMLElement;\n private selectionLeft: HTMLDivElement;\n private selectionRight: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private bubbles: ChatBubbles,\n private input: ChatInput,\n managers: AppManagers\n ) {\n super({\n managers,\n getElementFromTarget: (target) => findUpClassName(target, 'grouped-item') || findUpClassName(target, 'bubble'),\n verifyTarget: (e, target) => {\n // LEFT BUTTON\n // проверка внизу нужна для того, чтобы не активировать селект если target потомок .bubble\n const bad = !this.selectedMids.size &&\n !(e.target as HTMLElement).classList.contains('bubble') &&\n !(e.target as HTMLElement).classList.contains('document-selection') &&\n target;\n\n return !bad;\n },\n verifyMouseMoveTarget: (e, element, selecting) => {\n const bad = e.target !== element &&\n !(e.target as HTMLElement).classList.contains('document-selection') &&\n selecting === undefined &&\n !this.selectedMids.size;\n return !bad;\n },\n verifyTouchLongPress: () => !this.chat.input.recording,\n targetLookupClassName: 'bubble',\n lookupBetweenParentClassName: 'bubbles-inner',\n lookupBetweenElementsQuery: '.bubble:not(.is-multiple-documents), .grouped-item',\n isScheduled: chat.type === 'scheduled'\n });\n }\n\n public appendCheckbox(bubble: HTMLElement, checkboxField: CheckboxField) {\n checkboxField.label.classList.add('bubble-select-checkbox');\n\n if(bubble.classList.contains('document-container')) {\n bubble.querySelector('.document, audio-element').append(checkboxField.label);\n } else {\n super.appendCheckbox(bubble, checkboxField);\n }\n }\n\n public toggleSelection(toggleCheckboxes = true, forceSelection = false) {\n const ret = super.toggleSelection(toggleCheckboxes, forceSelection);\n\n if(ret && toggleCheckboxes) {\n for(const mid in this.bubbles.bubbles) {\n if(this.bubbles.skippedMids.has(+mid)) {\n continue;\n }\n\n const bubble = this.bubbles.bubbles[mid];\n this.toggleElementCheckbox(bubble, this.isSelecting);\n }\n }\n\n return ret;\n }\n\n public toggleElementCheckbox(bubble: HTMLElement, show: boolean) {\n if(!this.canSelectBubble(bubble)) return;\n\n const ret = super.toggleElementCheckbox(bubble, show);\n if(ret) {\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n this.bubbles.getBubbleGroupedItems(bubble).forEach((item) => this.toggleElementCheckbox(item, show));\n }\n }\n\n return ret;\n }\n\n public toggleByElement = (bubble: HTMLElement): Promise => {\n if(!this.canSelectBubble(bubble)) return;\n\n const mid = +bubble.dataset.mid;\n\n const isGrouped = bubble.classList.contains('is-grouped');\n if(isGrouped) {\n if(!this.isGroupedBubbleSelected(bubble)) {\n const set = this.selectedMids.get(this.chat.peerId);\n if(set) {\n // const mids = await this.chat.getMidsByMid(mid);\n const mids = this.getMidsFromGroupContainer(bubble);\n mids.forEach((mid) => set.delete(mid));\n }\n }\n\n /* const promises = */this.bubbles.getBubbleGroupedItems(bubble).map(this.toggleByElement);\n // await Promise.all(promises);\n return;\n }\n\n if(!this.toggleMid(this.chat.peerId, mid)) {\n return;\n }\n\n const isGroupedItem = bubble.classList.contains('grouped-item');\n if(isGroupedItem) {\n const groupContainer = findUpClassName(bubble, 'bubble');\n const isGroupedSelected = this.isGroupedBubbleSelected(groupContainer);\n const isGroupedMidsSelected = this.isGroupedMidsSelected(groupContainer);\n\n const willChange = isGroupedMidsSelected || isGroupedSelected;\n if(willChange) {\n this.updateElementSelection(groupContainer, isGroupedMidsSelected);\n }\n }\n\n this.updateElementSelection(bubble, this.isMidSelected(this.chat.peerId, mid));\n };\n\n protected toggleByMid = async(peerId: PeerId, mid: number) => {\n const mounted = await this.bubbles.getMountedBubble(mid);\n if(mounted) {\n this.toggleByElement(mounted.bubble);\n }\n };\n\n public isElementShouldBeSelected(element: HTMLElement) {\n const isGrouped = element.classList.contains('is-grouped');\n return super.isElementShouldBeSelected(element) && (!isGrouped || this.isGroupedMidsSelected(element));\n }\n\n protected isGroupedBubbleSelected(bubble: HTMLElement) {\n const groupedCheckboxInput = this.getCheckboxInputFromElement(bubble);\n return groupedCheckboxInput?.checked;\n }\n\n protected getMidsFromGroupContainer(groupContainer: HTMLElement) {\n const elements = this.chat.bubbles.getBubbleGroupedItems(groupContainer);\n if(!elements.length) {\n elements.push(groupContainer);\n }\n\n return elements.map((element) => +element.dataset.mid);\n }\n\n protected isGroupedMidsSelected(groupContainer: HTMLElement) {\n const mids = this.getMidsFromGroupContainer(groupContainer);\n const selectedMids = mids.filter((mid) => this.isMidSelected(this.chat.peerId, mid));\n return mids.length === selectedMids.length;\n }\n\n protected getCheckboxInputFromElement(bubble: HTMLElement) {\n /* let perf = performance.now();\n let checkbox = bubble.firstElementChild.tagName === 'LABEL' && bubble.firstElementChild.firstElementChild as HTMLInputElement;\n console.log('getCheckboxInputFromBubble firstElementChild time:', performance.now() - perf);\n\n perf = performance.now();\n checkbox = bubble.querySelector('label input');\n console.log('getCheckboxInputFromBubble querySelector time:', performance.now() - perf); */\n /* let perf = performance.now();\n let contains = bubble.classList.contains('document-container');\n console.log('getCheckboxInputFromBubble classList time:', performance.now() - perf);\n\n perf = performance.now();\n contains = bubble.className.includes('document-container');\n console.log('getCheckboxInputFromBubble className time:', performance.now() - perf); */\n\n return bubble.classList.contains('document-container') ?\n bubble.querySelector('label input') as HTMLInputElement :\n super.getCheckboxInputFromElement(bubble);\n }\n\n public canSelectBubble(bubble: HTMLElement) {\n return !bubble.classList.contains('service') &&\n !bubble.classList.contains('is-outgoing') &&\n !bubble.classList.contains('is-error') &&\n !bubble.classList.contains('bubble-first') &&\n !bubble.classList.contains('avoid-selection');\n }\n\n protected onToggleSelection = async(forwards: boolean, animate: boolean) => {\n const {needTranslateX, widthFrom, widthTo} = await this.chat.input.center(animate);\n\n SetTransition({\n element: this.listenElement,\n className: 'is-selecting',\n forwards,\n duration: animate ? 200 : 0,\n onTransitionEnd: () => {\n if(!this.isSelecting) {\n this.selectionInputWrapper.remove();\n this.selectionInputWrapper =\n this.selectionContainer =\n this.selectionSendNowBtn =\n this.selectionForwardBtn =\n this.selectionDeleteBtn =\n this.selectionLeft =\n this.selectionRight =\n null;\n this.selectedText = undefined;\n }\n\n /* fastRaf(() => {\n this.bubbles.onScroll();\n }); */\n }\n });\n\n // const chatInput = this.appImManager.chatInput;\n\n const translateButtonsX = widthFrom < widthTo ? undefined : needTranslateX * 2;\n if(this.isSelecting) {\n if(!this.selectionContainer) {\n this.selectionInputWrapper = document.createElement('div');\n this.selectionInputWrapper.classList.add('chat-input-wrapper', 'selection-wrapper');\n\n // const background = document.createElement('div');\n // background.classList.add('chat-input-wrapper-background');\n\n this.selectionContainer = document.createElement('div');\n this.selectionContainer.classList.add('selection-container');\n\n const attachClickOptions: AttachClickOptions = {listenerSetter: this.listenerSetter};\n const btnCancel = ButtonIcon('close', {noRipple: true});\n attachClickEvent(btnCancel, () => this.cancelSelection(), {once: true, listenerSetter: this.listenerSetter});\n\n this.selectionCountEl = document.createElement('div');\n this.selectionCountEl.classList.add('selection-container-count');\n\n if(this.chat.type === 'scheduled') {\n this.selectionSendNowBtn = Button('btn-primary btn-transparent btn-short text-bold selection-container-send', {icon: 'send2'});\n this.selectionSendNowBtn.append(i18n('MessageScheduleSend'));\n attachClickEvent(this.selectionSendNowBtn, () => {\n new PopupSendNow(this.chat.peerId, [...this.selectedMids.get(this.chat.peerId)], () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n } else {\n this.selectionForwardBtn = Button('btn-primary btn-transparent text-bold selection-container-forward', {icon: 'forward'});\n this.selectionForwardBtn.append(i18n('Forward'));\n attachClickEvent(this.selectionForwardBtn, () => {\n const obj: {[fromPeerId: PeerId]: number[]} = {};\n for(const [fromPeerId, mids] of this.selectedMids) {\n obj[fromPeerId] = Array.from(mids).sort((a, b) => a - b);\n }\n\n new PopupForward(obj, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n }\n\n this.selectionDeleteBtn = Button('btn-primary btn-transparent danger text-bold selection-container-delete', {icon: 'delete'});\n this.selectionDeleteBtn.append(i18n('Delete'));\n attachClickEvent(this.selectionDeleteBtn, () => {\n new PopupDeleteMessages(this.chat.peerId, [...this.selectedMids.get(this.chat.peerId)], this.chat.type, () => {\n this.cancelSelection();\n });\n }, attachClickOptions);\n\n const left = this.selectionLeft = document.createElement('div');\n left.classList.add('selection-container-left');\n left.append(btnCancel, this.selectionCountEl);\n\n const right = this.selectionRight = document.createElement('div');\n right.classList.add('selection-container-right');\n right.append(...[\n this.selectionSendNowBtn,\n this.selectionForwardBtn,\n this.selectionDeleteBtn\n ].filter(Boolean))\n\n if(translateButtonsX !== undefined) {\n left.style.transform = `translateX(${-translateButtonsX}px)`;\n right.style.transform = `translateX(${translateButtonsX}px)`;\n }\n\n this.selectionContainer.append(left, right);\n\n // background.style.opacity = '0';\n this.selectionInputWrapper.style.opacity = '0';\n this.selectionInputWrapper.append(/* background, */this.selectionContainer);\n this.input.inputContainer.append(this.selectionInputWrapper);\n\n void this.selectionInputWrapper.offsetLeft; // reflow\n // background.style.opacity = '';\n this.selectionInputWrapper.style.opacity = '';\n left.style.transform = '';\n right.style.transform = '';\n }\n } else if(this.selectionLeft && translateButtonsX !== undefined) {\n this.selectionLeft.style.transform = `translateX(-${translateButtonsX}px)`;\n this.selectionRight.style.transform = `translateX(${translateButtonsX}px)`;\n }\n };\n\n protected onUpdateContainer = (cantForward: boolean, cantDelete: boolean, cantSend: boolean) => {\n replaceContent(this.selectionCountEl, i18n('messages', [this.length()]));\n this.selectionSendNowBtn && this.selectionSendNowBtn.toggleAttribute('disabled', cantSend);\n this.selectionForwardBtn && this.selectionForwardBtn.toggleAttribute('disabled', cantForward);\n this.selectionDeleteBtn && this.selectionDeleteBtn.toggleAttribute('disabled', cantDelete);\n };\n\n protected onCancelSelection = async() => {\n return;\n const promises: Promise[] = [];\n for(const [peerId, mids] of this.selectedMids) {\n for(const mid of mids) {\n promises.push(this.bubbles.getMountedBubble(mid).then((m) => m?.bubble));\n }\n }\n\n const bubbles = filterUnique((await Promise.all(promises)).filter(Boolean));\n bubbles.forEach((bubble) => {\n this.toggleByElement(bubble);\n });\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function getSelectedText(): string {\n if(window.getSelection) {\n return window.getSelection().toString();\n // @ts-ignore\n } else if(document.selection) {\n // @ts-ignore\n return document.selection.createRange().text;\n }\n\n return '';\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../helpers/listenerSetter';\nimport ripple from './ripple';\nimport {LangPackKey, _i18n} from '../lib/langPack';\nimport getDeepProperty from '../helpers/object/getDeepProperty';\nimport rootScope from '../lib/rootScope';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\n\nexport type CheckboxFieldOptions = {\n text?: LangPackKey,\n textArgs?: any[],\n name?: string,\n round?: boolean,\n toggle?: boolean,\n stateKey?: string,\n stateValues?: any[],\n disabled?: boolean,\n checked?: boolean,\n restriction?: boolean,\n withRipple?: boolean,\n withHover?: boolean,\n listenerSetter?: ListenerSetter\n};\nexport default class CheckboxField {\n public input: HTMLInputElement;\n public label: HTMLLabelElement;\n public span: HTMLSpanElement;\n public listenerSetter: ListenerSetter;\n\n constructor(options: CheckboxFieldOptions = {}) {\n const label = this.label = document.createElement('label');\n label.classList.add('checkbox-field');\n\n if(options.restriction) {\n label.classList.add('checkbox-field-restriction');\n }\n\n if(options.round) {\n label.classList.add('checkbox-field-round');\n }\n\n if(options.disabled) {\n this.toggleDisability(true);\n }\n\n this.listenerSetter = options.listenerSetter;\n\n const input = this.input = document.createElement('input');\n input.classList.add('checkbox-field-input');\n input.type = 'checkbox';\n if(options.name) {\n input.id = 'input-' + options.name;\n }\n\n if(options.checked) {\n input.checked = true;\n }\n\n if(options.stateKey) {\n let loaded = false;\n const onChange = () => {\n if(!loaded) {\n return;\n }\n\n let value: any;\n if(options.stateValues) {\n value = options.stateValues[input.checked ? 1 : 0];\n } else {\n value = input.checked;\n }\n\n rootScope.managers.appStateManager.setByKey(options.stateKey, value);\n };\n\n apiManagerProxy.getState().then((state) => {\n loaded = true;\n const stateValue = getDeepProperty(state, options.stateKey);\n let checked: boolean;\n if(options.stateValues) {\n checked = options.stateValues.indexOf(stateValue) === 1;\n } else {\n checked = stateValue;\n }\n\n this.setValueSilently(checked);\n });\n\n if(options.listenerSetter) options.listenerSetter.add(input)('change', onChange);\n else input.addEventListener('change', onChange);\n }\n\n let span: HTMLSpanElement;\n if(options.text) {\n span = this.span = document.createElement('span');\n span.classList.add('checkbox-caption');\n _i18n(span, options.text, options.textArgs);\n } else {\n label.classList.add('checkbox-without-caption');\n }\n\n label.append(input);\n\n if(options.toggle) {\n label.classList.add('checkbox-field-toggle');\n\n const toggle = document.createElement('div');\n toggle.classList.add('checkbox-toggle');\n label.append(toggle);\n } else {\n const box = document.createElement('div');\n box.classList.add('checkbox-box');\n\n const checkSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n checkSvg.classList.add('checkbox-box-check');\n checkSvg.setAttributeNS(null, 'viewBox', '0 0 24 24');\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#check');\n use.setAttributeNS(null, 'x', '-1');\n checkSvg.append(use);\n\n const bg = document.createElement('div');\n bg.classList.add('checkbox-box-background');\n\n const border = document.createElement('div');\n border.classList.add('checkbox-box-border');\n\n box.append(border, bg, checkSvg);\n\n label.append(box);\n }\n\n if(span) {\n label.append(span);\n }\n\n if(options.withRipple) {\n label.classList.add('checkbox-ripple', 'hover-effect');\n ripple(label, undefined, undefined, true);\n // label.prepend(input);\n } else if(options.withHover) {\n label.classList.add('hover-effect');\n }\n }\n\n get checked() {\n return this.input.checked;\n }\n\n set checked(checked: boolean) {\n /* if(this.checked === checked) {\n return;\n } */\n\n this.setValueSilently(checked);\n\n const event = new Event('change', {bubbles: true, cancelable: true});\n this.input.dispatchEvent(event);\n }\n\n public setValueSilently(checked: boolean) {\n this.input.checked = checked;\n }\n\n public toggleDisability(disable: boolean) {\n this.label.classList.toggle('checkbox-disabled', disable);\n return () => this.toggleDisability(!disable);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField, {InputFieldOptions} from './inputField';\n\nexport default class CodeInputField extends InputField {\n constructor(public options: InputFieldOptions & {\n length: number,\n onFill: (code: string) => void\n }) {\n super(Object.assign(options, {\n plainText: true\n }));\n\n const input = this.input as HTMLInputElement;\n input.type = 'tel';\n input.setAttribute('required', '');\n input.autocomplete = 'off';\n\n let lastLength = 0;\n this.input.addEventListener('input', (e) => {\n this.input.classList.remove('error');\n this.setLabel();\n\n const value = this.value.replace(/\\D/g, '').slice(0, options.length);\n this.setValueSilently(value);\n\n const length = this.value.length;\n if(length === options.length) { // submit code\n options.onFill(this.value);\n } else if(length === lastLength) {\n return;\n }\n\n lastLength = length;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {addCancelButton} from './popups';\nimport PopupPeer, {PopupPeerCheckboxOptions, PopupPeerOptions} from './popups/peer';\n\n// type PopupConfirmationOptions = Pick;\nexport type PopupConfirmationOptions = PopupPeerOptions & {\n button: PopupPeerOptions['buttons'][0],\n checkbox?: PopupPeerOptions['checkboxes'][0]\n};\n\nexport default function confirmationPopup(\n options: T\n): Promise : (T['checkbox'] extends PopupPeerCheckboxOptions ? boolean : void)> {\n return new Promise((resolve, reject) => {\n const {button, checkbox} = options;\n button.callback = (set) => {\n if(checkbox || !set) {\n resolve(set ? !!set.size : undefined);\n } else {\n resolve(options.checkboxes.map((checkbox) => set.has(checkbox.text)));\n }\n };\n\n const buttons = addCancelButton(options.buttons || [button]);\n const cancelButton = buttons.find((button) => button.isCancel);\n cancelButton.callback = () => {\n reject();\n };\n\n options.buttons = buttons;\n options.checkboxes ??= checkbox && [checkbox];\n\n new PopupPeer('popup-confirmation', options).show();\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_EMOJI_SUPPORTED from '../environment/emojiSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport fastSmoothScroll from '../helpers/fastSmoothScroll';\nimport {randomLong} from '../helpers/random';\nimport {HelpCountry, HelpCountryCode} from '../layer';\nimport I18n, {i18n} from '../lib/langPack';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../lib/rootScope';\nimport {getCountryEmoji} from '../vendor/emoji';\nimport InputField, {InputFieldOptions} from './inputField';\nimport Scrollable from './scrollable';\n\nlet countries: HelpCountry.helpCountry[];\nconst setCountries = () => {\n countries = I18n.countriesList\n .filter((country) => !country.pFlags?.hidden)\n .sort((a, b) => (a.name || a.default_name).localeCompare(b.name || b.default_name));\n};\n\nlet init = () => {\n setCountries();\n rootScope.addEventListener('language_change', () => {\n setCountries();\n });\n};\n\nconst VIRTUAL_COUNTRIES = new Set(['FT']);\n\nexport default class CountryInputField extends InputField {\n private lastCountrySelected: HelpCountry;\n private lastCountryCodeSelected: HelpCountryCode;\n\n private hideTimeout: number;\n private selectWrapper: HTMLElement;\n\n private liMap: Map;\n\n constructor(public options: InputFieldOptions & {\n onCountryChange?: (country: HelpCountry.helpCountry, code: HelpCountryCode.helpCountryCode) => void,\n noPhoneCodes?: boolean\n } = {}) {\n super({\n label: 'Country',\n name: randomLong(),\n ...options\n });\n\n if(init) {\n init();\n init = undefined;\n }\n\n this.liMap = new Map();\n\n this.container.classList.add('input-select');\n\n const selectWrapper = this.selectWrapper = document.createElement('div');\n selectWrapper.classList.add('select-wrapper', 'z-depth-3', 'hide');\n\n const arrowDown = document.createElement('span');\n arrowDown.classList.add('arrow', 'arrow-down');\n this.container.append(arrowDown);\n\n const selectList = document.createElement('ul');\n selectWrapper.appendChild(selectList);\n\n const scroll = new Scrollable(selectWrapper);\n\n let initSelect = () => {\n initSelect = null;\n\n countries.forEach((c) => {\n if(options.noPhoneCodes && VIRTUAL_COUNTRIES.has(c.iso2)) {\n return;\n }\n\n const emoji = getCountryEmoji(c.iso2);\n\n const liArr: Array = [];\n for(let i = 0, length = Math.min(c.country_codes.length, options.noPhoneCodes ? 1 : Infinity); i < length; ++i) {\n const countryCode = c.country_codes[i];\n const li = document.createElement('li');\n\n const wrapped = wrapEmojiText(emoji);\n if(IS_EMOJI_SUPPORTED) {\n const spanEmoji = document.createElement('span');\n setInnerHTML(spanEmoji, wrapped);\n li.append(spanEmoji);\n } else {\n setInnerHTML(li, wrapped);\n }\n\n const el = i18n(c.default_name as any);\n el.dataset.defaultName = c.default_name;\n li.append(el);\n\n if(!options.noPhoneCodes) {\n const span = document.createElement('span');\n span.classList.add('phone-code');\n span.innerText = '+' + countryCode.country_code;\n li.appendChild(span);\n }\n\n liArr.push(li);\n selectList.append(li);\n }\n\n this.liMap.set(c.iso2, liArr);\n });\n\n selectList.addEventListener('mousedown', (e) => {\n if(e.button !== 0) { // other buttons but left shall not pass\n return;\n }\n\n const target = findUpTag(e.target, 'LI')\n this.selectCountryByTarget(target);\n // console.log('clicked', e, countryName, phoneCode);\n });\n\n this.container.appendChild(selectWrapper);\n };\n\n initSelect();\n\n this.input.addEventListener('focus', (e) => {\n if(initSelect) {\n initSelect();\n } else {\n countries.forEach((c) => {\n const arr = this.liMap.get(c.iso2);\n if(!arr) return;\n arr.forEach((li) => li.style.display = '');\n });\n }\n\n clearTimeout(this.hideTimeout);\n this.hideTimeout = undefined;\n\n selectWrapper.classList.remove('hide');\n void selectWrapper.offsetWidth; // reflow\n selectWrapper.classList.add('active');\n\n this.select();\n\n fastSmoothScroll({\n // container: page.pageEl.parentElement.parentElement,\n container: findUpClassName(this.container, 'scrollable-y'),\n element: this.input,\n position: 'start',\n margin: 4\n });\n\n setTimeout(() => {\n if(!mouseDownHandlerAttached) {\n document.addEventListener('mousedown', onMouseDown, {capture: true});\n mouseDownHandlerAttached = true;\n }\n }, 0);\n });\n\n let mouseDownHandlerAttached = false;\n const onMouseDown = (e: MouseEvent) => {\n if(findUpClassName(e.target, 'input-select')) {\n return;\n }\n if(e.target === this.input) {\n return;\n }\n\n this.hidePicker();\n document.removeEventListener('mousedown', onMouseDown, {capture: true});\n mouseDownHandlerAttached = false;\n };\n\n /* false && this.input.addEventListener('blur', function(this: typeof this.input, e) {\n hidePicker();\n\n e.cancelBubble = true;\n }, {capture: true}); */\n\n const onKeyPress = (e: KeyboardEvent) => {\n const key = e.key;\n if(e.ctrlKey || key === 'Control') return false;\n\n // let i = new RegExp('^' + this.value, 'i');\n const _value = this.value.toLowerCase();\n const matches: HelpCountry[] = [];\n countries.forEach((c) => {\n const arr = this.liMap.get(c.iso2);\n if(!arr) {\n return;\n }\n\n const names = [\n c.name,\n c.default_name,\n c.iso2\n ];\n\n names.filter(Boolean).forEach((name) => {\n const abbr = name.split(' ').filter((word) => /\\w/.test(word)).map((word) => word[0]).join('');\n if(abbr.length > 1) {\n names.push(abbr);\n }\n });\n\n const good = !!names.filter(Boolean).find((str) => str.toLowerCase().indexOf(_value) !== -1)/* === 0 */;// i.test(c.name);\n\n arr.forEach((li) => li.style.display = good ? '' : 'none');\n if(good) matches.push(c);\n });\n\n // Код ниже автоматически выберет страну если она осталась одна при поиске\n /* if(matches.length === 1 && matches[0].li.length === 1) {\n if(matches[0].name === lastCountrySelected) return false;\n //console.log('clicking', matches[0]);\n\n var clickEvent = document.createEvent('MouseEvents');\n clickEvent.initEvent('mousedown', true, true);\n matches[0].li[0].dispatchEvent(clickEvent);\n return false;\n } else */if(matches.length === 0) {\n countries.forEach((c) => {\n const arr = this.liMap.get(c.iso2);\n if(!arr) {\n return;\n }\n\n arr.forEach((li) => li.style.display = '');\n });\n } else if(matches.length === 1 && key === 'Enter') {\n cancelEvent(e);\n this.selectCountryByTarget(this.liMap.get(matches[0].iso2)[0]);\n }\n };\n\n this.input.addEventListener('keyup', onKeyPress);\n this.input.addEventListener('keydown', (e) => {\n if(e.key === 'Enter') {\n onKeyPress(e);\n }\n });\n\n arrowDown.addEventListener('mousedown', (e) => {\n if(this.input.matches(':focus')) {\n this.hidePicker();\n this.input.blur();\n } else {\n e.cancelBubble = true;\n e.preventDefault();\n this.input.focus();\n }\n });\n }\n\n public getSelected() {\n return {country: this.lastCountrySelected, code: this.lastCountryCodeSelected};\n }\n\n public hidePicker = () => {\n if(this.hideTimeout !== undefined) return;\n this.selectWrapper.classList.remove('active');\n this.hideTimeout = window.setTimeout(() => {\n this.selectWrapper.classList.add('hide');\n this.hideTimeout = undefined;\n }, 200);\n }\n\n public selectCountryByTarget = (target: HTMLElement) => {\n const defaultName = target.querySelector('[data-default-name]').dataset.defaultName;\n const phoneCodeEl = target.querySelector('.phone-code');\n const phoneCode = phoneCodeEl?.innerText;\n const countryCode = phoneCode && phoneCode.replace(/\\D/g, '');\n\n replaceContent(this.input, i18n(defaultName as any));\n this.simulateInputEvent();\n this.lastCountrySelected = countries.find((c) => c.default_name === defaultName);\n this.lastCountryCodeSelected = countryCode && this.lastCountrySelected.country_codes.find((_countryCode) => _countryCode.country_code === countryCode);\n\n this.options.onCountryChange?.(this.lastCountrySelected, this.lastCountryCodeSelected);\n this.hidePicker();\n }\n\n public selectCountryByIso2(iso2: string) {\n this.selectCountryByTarget(this.liMap.get(iso2)[0]);\n }\n\n public override(country: HelpCountry, code: HelpCountryCode, countryName?: string) {\n replaceContent(this.input, country ? i18n(country.default_name as any) : countryName);\n this.lastCountrySelected = country;\n this.lastCountryCodeSelected = code;\n this.options.onCountryChange?.(this.lastCountrySelected, this.lastCountryCodeSelected);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_MOBILE} from '../environment/userAgent';\nimport {animate} from '../helpers/animation';\nimport {Middleware} from '../helpers/middleware';\nimport clamp from '../helpers/number/clamp';\nimport animationIntersector, {AnimationItemGroup, AnimationItemWrapper} from './animationIntersector';\n\ntype DotRendererDot = {\n x: number,\n y: number,\n opacity: number,\n radius: number\n mOpacity: number,\n adding: boolean,\n counter: number,\n path: Path2D\n};\nexport default class DotRenderer implements AnimationItemWrapper {\n public canvas: HTMLCanvasElement;\n private context: CanvasRenderingContext2D;\n private dots: DotRendererDot[];\n\n public paused: boolean;\n public autoplay: boolean;\n public tempId: number;\n\n private dpr: number;\n\n constructor(\n private width: number,\n private height: number,\n private multiply?: number\n ) {\n const canvas = this.canvas = document.createElement('canvas');\n const dpr = this.dpr = window.devicePixelRatio;\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n canvas.classList.add('canvas-thumbnail', 'canvas-dots');\n\n this.paused = true;\n this.autoplay = true;\n this.tempId = 0;\n this.context = canvas.getContext('2d');\n }\n\n private prepare() {\n let count = Math.round(this.width * this.height / (35 * (IS_MOBILE ? 2 : 1)));\n count *= this.multiply || 1;\n count = Math.min(IS_MOBILE ? 1000 : 2200, count);\n count = Math.round(count);\n const dots: DotRendererDot[] = this.dots = new Array(count);\n\n for(let i = 0; i < count; ++i) {\n dots[i] = this.generateDot();\n }\n }\n\n private generateDot(adding?: boolean): DotRendererDot {\n const x = Math.floor(Math.random() * this.canvas.width);\n const y = Math.floor(Math.random() * this.canvas.height);\n const opacity = adding ? 0 : Math.random();\n const radius = (Math.random() >= .8 ? 1 : 0.5) * this.dpr;\n const path = new Path2D();\n path.arc(x, y, radius, 0, 2 * Math.PI, false);\n return {\n x,\n y,\n opacity,\n radius,\n mOpacity: opacity,\n adding: adding ?? Math.random() >= .5,\n counter: 0,\n path\n };\n }\n\n private draw() {\n const {context, canvas, dots} = this;\n context.clearRect(0, 0, canvas.width, canvas.height);\n context.fillStyle = '#fff';\n\n const add = 0.02;\n for(let i = 0, length = dots.length; i < length; ++i) {\n const dot = dots[i];\n const addOpacity = dot.adding ? add : -add;\n\n dot.mOpacity += addOpacity;\n // if(dot.mOpacity <= 0) dot.mOpacity = dot.opacity;\n\n // const easedOpacity = easing(dot.mOpacity);\n const easedOpacity = clamp(dot.mOpacity, 0, 1);\n context.globalAlpha = easedOpacity;\n context.fill(dot.path);\n\n if(dot.mOpacity <= 0) {\n dot.adding = true;\n\n if(++dot.counter >= 1) {\n dots[i] = this.generateDot(dot.adding);\n }\n } else if(dot.mOpacity >= 1) {\n dot.adding = false;\n }\n }\n }\n\n public remove() {\n this.pause();\n }\n\n public pause() {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n ++this.tempId;\n }\n\n public renderFirstFrame() {\n if(!this.dots) {\n this.prepare();\n }\n\n this.draw();\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n const tempId = ++this.tempId;\n\n if(!this.dots) {\n this.prepare();\n }\n\n animate(() => {\n if(this.tempId !== tempId || this.paused) {\n return false;\n }\n\n this.draw();\n return true;\n });\n }\n\n public static create({\n width,\n height,\n middleware,\n animationGroup,\n multiply\n }: {\n width: number,\n height: number,\n middleware: Middleware,\n animationGroup: AnimationItemGroup,\n multiply?: number\n }) {\n middleware.onClean(() => {\n animationIntersector.removeAnimationByPlayer(dotRenderer);\n });\n\n const dotRenderer = new DotRenderer(width, height, multiply);\n dotRenderer.renderFirstFrame();\n\n animationIntersector.addAnimation(dotRenderer, animationGroup, dotRenderer.canvas, true);\n\n return dotRenderer;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputFile} from '../layer';\nimport AvatarEdit from './avatarEdit';\nimport AvatarElement from './avatar';\nimport InputField from './inputField';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ButtonCorner from './buttonCorner';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\n\nexport default class EditPeer {\n public nextBtn: HTMLButtonElement;\n\n public uploadAvatar: () => Promise;\n public avatarEdit: AvatarEdit;\n public avatarElem: AvatarElement;\n\n private inputFields: InputField[];\n private listenerSetter: ListenerSetter;\n\n private peerId: PeerId;\n\n private _disabled = false;\n private avatarSize = 120;\n\n constructor(options: {\n peerId?: EditPeer['peerId'],\n inputFields: EditPeer['inputFields'],\n listenerSetter: ListenerSetter,\n doNotEditAvatar?: boolean,\n withoutAvatar?: boolean,\n nextBtn?: HTMLButtonElement,\n avatarSize?: number,\n popupOptions?: ConstructorParameters[1]\n }) {\n safeAssign(this, options);\n\n this.peerId ||= NULL_PEER_ID;\n\n if(!this.nextBtn) {\n this.nextBtn = ButtonCorner({icon: 'check'});\n } else if(!this.nextBtn.classList.contains('btn-corner')) {\n this.handleChange = () => {\n this.nextBtn.toggleAttribute('disabled', !this.isChanged() || this.disabled);\n };\n }\n\n if(!options.withoutAvatar) {\n this.avatarElem = new AvatarElement();\n this.avatarElem.classList.add('avatar-placeholder', 'avatar-' + this.avatarSize);\n this.avatarElem.updateWithOptions({peerId: this.peerId});\n\n if(!options.doNotEditAvatar) {\n this.avatarEdit = new AvatarEdit((_upload) => {\n this.uploadAvatar = _upload;\n this.handleChange();\n this.avatarElem.remove();\n }, options.popupOptions);\n\n this.avatarEdit.container.append(this.avatarElem);\n }\n }\n\n this.inputFields.forEach((inputField) => {\n this.listenerSetter.add(inputField.input)('input', this.handleChange);\n });\n\n this.handleChange();\n }\n\n public get disabled() {\n return this._disabled;\n }\n\n public set disabled(value) {\n this._disabled = value;\n this.inputFields.forEach((inputField) => inputField.input.toggleAttribute('disabled', value));\n this.handleChange();\n }\n\n public lockWithPromise(promise: Promise, unlockOnSuccess = false) {\n this.disabled = true;\n promise.then(() => {\n if(unlockOnSuccess) {\n this.disabled = false;\n }\n }, () => {\n this.disabled = false;\n });\n }\n\n public isChanged = () => {\n if(this.uploadAvatar) {\n return true;\n }\n\n let changedLength = 0, requiredLength = 0, requiredValidLength = 0;\n this.inputFields.forEach((inputField) => {\n if(inputField.isValid()) {\n if(inputField.isChanged()) {\n ++changedLength;\n }\n\n if(inputField.required) {\n ++requiredValidLength;\n }\n }\n\n if(inputField.required) {\n ++requiredLength;\n }\n });\n\n return requiredLength === requiredValidLength && changedLength > 0;\n };\n\n public handleChange = () => {\n this.nextBtn.classList.toggle('is-visible', this.isChanged());\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport emoticonsDropdown, {EmoticonsDropdown, EmoticonsTab, EMOTICONSSTICKERGROUP} from '..';\nimport GifsMasonry from '../../gifsMasonry';\nimport Scrollable from '../../scrollable';\nimport {putPreloader} from '../../putPreloader';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\n\nexport default class GifsTab implements EmoticonsTab {\n public content: HTMLElement;\n public scrollable: Scrollable;\n public tabId: number;\n\n constructor(private managers: AppManagers) {\n\n }\n\n init() {\n this.content = document.getElementById('content-gifs');\n const gifsContainer = this.content.firstElementChild as HTMLDivElement;\n attachClickEvent(gifsContainer, EmoticonsDropdown.onMediaClick);\n\n const scroll = this.scrollable = new Scrollable(this.content, 'GIFS');\n const masonry = new GifsMasonry(gifsContainer, EMOTICONSSTICKERGROUP, scroll);\n const preloader = putPreloader(this.content, true);\n\n this.managers.appDocsManager.getGifs().then((docs) => {\n docs.forEach((doc) => {\n masonry.add(doc);\n });\n\n preloader.remove();\n });\n\n emoticonsDropdown.addLazyLoadQueueRepeat(masonry.lazyLoadQueue, masonry.processInvisibleDiv);\n\n this.init = null;\n }\n\n onClose() {\n\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../../lib/appManagers/appDocsManager';\nimport {SliderSuperTab} from '../../slider';\nimport InputSearch from '../../inputSearch';\nimport animationIntersector, {AnimationItemGroup} from '../../animationIntersector';\nimport appSidebarRight from '..';\nimport {AppInlineBotsManager} from '../../../lib/appManagers/appInlineBotsManager';\nimport GifsMasonry from '../../gifsMasonry';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport {NULL_PEER_ID} from '../../../lib/mtproto/mtproto_config';\n\nconst ANIMATIONGROUP: AnimationItemGroup = 'GIFS-SEARCH';\n\nexport default class AppGifsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private gifsDiv: HTMLDivElement;\n\n private nextOffset = '';\n private loadedAll = false;\n\n private gifBotPeerId: PeerId;\n private masonry: GifsMasonry;\n\n private searchPromise: ReturnType;\n\n public init() {\n this.container.id = 'search-gifs-container';\n\n this.inputSearch = new InputSearch('SearchGifsTitle', (value) => {\n this.reset();\n this.search(value);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.gifsDiv = document.createElement('div');\n this.gifsDiv.classList.add('gifs-masonry');\n attachClickEvent(this.gifsDiv, this.onGifsClick, {listenerSetter: this.listenerSetter});\n\n this.scrollable.append(this.gifsDiv);\n\n this.masonry = new GifsMasonry(this.gifsDiv, ANIMATIONGROUP, this.scrollable);\n // this.backBtn.parentElement.append(this.inputSearch.container);\n\n appSidebarRight.toggleSidebar(true).then(() => {\n this.search('', true);\n\n this.scrollable.onScrolledBottom = () => {\n this.search(this.inputSearch.value, false);\n };\n });\n }\n\n private onGifsClick = async(e: MouseEvent | TouchEvent) => {\n const target = findUpClassName(e.target, 'gif');\n if(!target) return;\n\n const fileId = target.dataset.docId;\n if(await appImManager.chat.input.sendMessageWithDocument(fileId)) {\n if(mediaSizes.isMobile) {\n appSidebarRight.onCloseBtnClick();\n }\n } else {\n console.warn('got no doc by id:', fileId);\n }\n };\n\n public onClose() {\n this.scrollable.onScrolledBottom = () => {};\n }\n\n public onCloseAfterTimeout() {\n this.reset();\n this.gifsDiv.innerHTML = '';\n animationIntersector.checkAnimations(undefined, ANIMATIONGROUP);\n this.inputSearch.remove();\n return super.onCloseAfterTimeout();\n }\n\n private reset() {\n this.searchPromise = null;\n this.nextOffset = '';\n this.loadedAll = false;\n this.masonry.clear();\n }\n\n public async search(query: string, newSearch = true) {\n if(this.searchPromise || this.loadedAll) return;\n\n if(!this.gifBotPeerId) {\n this.gifBotPeerId = (await this.managers.appUsersManager.resolveUsername('gif')).id.toPeerId(false);\n }\n\n try {\n this.searchPromise = this.managers.appInlineBotsManager.getInlineResults(NULL_PEER_ID, this.gifBotPeerId, query, this.nextOffset);\n const {results, next_offset} = await this.searchPromise;\n\n if(this.inputSearch.value !== query) {\n return;\n }\n\n this.searchPromise = null;\n this.nextOffset = next_offset;\n if(newSearch) {\n this.gifsDiv.innerHTML = '';\n }\n\n if(results.length) {\n results.forEach((result) => {\n if(result._ === 'botInlineMediaResult' && result.document) {\n this.masonry.add(result.document as MyDocument);\n }\n });\n } else {\n this.loadedAll = true;\n }\n\n this.scrollable.onScroll();\n } catch(err) {\n this.searchPromise = null;\n console.error('gifs loading error:', err);\n throw err;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport InputSearch from '../../inputSearch';\nimport LazyLoadQueue from '../../lazyLoadQueue';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport PopupStickers from '../../popups/stickers';\nimport animationIntersector from '../../animationIntersector';\nimport appSidebarRight from '..';\nimport {StickerSet, StickerSetCovered} from '../../../layer';\nimport {i18n} from '../../../lib/langPack';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport wrapSticker from '../../wrappers/sticker';\n\nexport default class AppStickersTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private setsDiv: HTMLDivElement;\n private lazyLoadQueue: LazyLoadQueue;\n\n public init() {\n this.container.id = 'stickers-container';\n this.container.classList.add('chatlist-container');\n\n this.lazyLoadQueue = new LazyLoadQueue();\n\n this.inputSearch = new InputSearch('StickersTab.SearchPlaceholder', (value) => {\n this.search(value);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.setsDiv = document.createElement('div');\n this.setsDiv.classList.add('sticker-sets');\n this.scrollable.append(this.setsDiv);\n\n attachStickerViewerListeners({listenTo: this.setsDiv, listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.setsDiv, (e) => {\n const sticker = findUpClassName(e.target, 'sticker-set-sticker');\n if(sticker) {\n const docId = sticker.dataset.docId;\n appImManager.chat.input.sendMessageWithDocument(docId);\n return;\n }\n\n const target = findUpClassName(e.target, 'sticker-set');\n if(!target) return;\n\n const id = target.dataset.stickerSet as string;\n const access_hash = target.dataset.access_hash as string;\n\n const button = findUpClassName(e.target, 'sticker-set-button') as HTMLElement;\n if(button) {\n e.preventDefault();\n e.cancelBubble = true;\n\n button.setAttribute('disabled', 'true');\n\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\n this.managers.appStickersManager.toggleStickerSet(full.set).then((changed) => {\n if(changed) {\n button.textContent = '';\n button.append(i18n(full.set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\n button.classList.toggle('gray', !!full.set.installed_date);\n }\n }).finally(() => {\n // button.style.width = set.installed_date ? '68px' : '52px';\n button.removeAttribute('disabled');\n });\n });\n } else {\n this.managers.appStickersManager.getStickerSet({id, access_hash}).then((full) => {\n new PopupStickers(full.set).show();\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n appSidebarRight.toggleSidebar(true).then(() => {\n this.renderFeatured();\n });\n }\n\n public onCloseAfterTimeout() {\n this.setsDiv.innerHTML = '';\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\n return super.onCloseAfterTimeout();\n }\n\n public renderSet(set: StickerSet.stickerSet) {\n // console.log('renderSet:', set);\n const div = document.createElement('div');\n div.classList.add('sticker-set');\n\n const header = document.createElement('div');\n header.classList.add('sticker-set-header');\n\n const details = document.createElement('div');\n details.classList.add('sticker-set-details');\n details.innerHTML = `
`;\n\n setInnerHTML(details.firstElementChild, wrapEmojiText(set.title));\n\n const countDiv = document.createElement('div');\n countDiv.classList.add('sticker-set-count');\n countDiv.append(i18n('Stickers', [set.count]));\n details.append(countDiv);\n\n const button = document.createElement('button');\n button.classList.add('btn-primary', 'btn-color-primary', 'sticker-set-button');\n button.append(i18n(set.installed_date ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\n // button.style.width = set.installed_date ? '68px' : '52px';\n\n if(set.installed_date) {\n button.classList.add('gray');\n }\n\n // ripple(button);\n\n header.append(details, button);\n\n const stickersDiv = document.createElement('div');\n stickersDiv.classList.add('sticker-set-stickers');\n\n const count = Math.min(5, set.count);\n for(let i = 0; i < count; ++i) {\n const stickerDiv = document.createElement('div');\n stickerDiv.classList.add('sticker-set-sticker');\n\n stickersDiv.append(stickerDiv);\n }\n\n this.managers.appStickersManager.getStickerSet(set).then((set) => {\n // console.log('renderSet got set:', set);\n\n for(let i = 0; i < count; ++i) {\n const div = stickersDiv.children[i] as HTMLDivElement;\n const doc = set.documents[i];\n if(doc._ === 'documentEmpty') {\n continue;\n }\n\n wrapSticker({\n doc,\n div,\n lazyLoadQueue: this.lazyLoadQueue,\n group: 'STICKERS-SEARCH',\n /* play: false,\n loop: false, */\n play: true,\n loop: true,\n width: 68,\n height: 68,\n withLock: true\n });\n }\n });\n\n /* const onMouseOver = () => {\n const animations: AnimationItem['animation'][] = [];\n for(let i = 0; i < count; ++i) {\n const stickerDiv = stickersDiv.children[i] as HTMLElement;\n const animationItem = animationIntersector.getAnimation(stickerDiv);\n if(!animationItem) continue;\n\n const animation = animationItem.animation;\n\n animations.push(animation);\n animation.loop = true;\n animation.play();\n }\n\n div.addEventListener('mouseout', () => {\n animations.forEach((animation) => {\n animation.loop = false;\n });\n\n div.addEventListener('mouseover', onMouseOver, {once: true});\n }, {once: true});\n };\n\n div.addEventListener('mouseover', onMouseOver, {once: true}); */\n\n div.dataset.stickerSet = '' + set.id;\n div.dataset.access_hash = '' + set.access_hash;\n div.dataset.title = set.title;\n\n div.append(header, stickersDiv);\n\n this.setsDiv.append(div);\n }\n\n public renderFeatured() {\n return this.managers.appStickersManager.getFeaturedStickers().then((coveredSets) => {\n if(this.inputSearch.value) {\n return;\n }\n\n coveredSets = this.filterRendered('', coveredSets);\n coveredSets.forEach((set) => {\n this.renderSet(set.set);\n });\n });\n }\n\n private filterRendered(query: string, coveredSets: StickerSetCovered[]) {\n coveredSets = coveredSets.slice();\n\n const children = Array.from(this.setsDiv.children) as HTMLElement[];\n forEachReverse(children, el => {\n const id = el.dataset.stickerSet;\n const index = coveredSets.findIndex((covered) => covered.set.id === id);\n\n if(index !== -1) {\n coveredSets.splice(index, 1);\n } else if(!query || !el.dataset.title.toLowerCase().includes(query.toLowerCase())) {\n el.remove();\n }\n });\n\n animationIntersector.checkAnimations(undefined, 'STICKERS-SEARCH');\n\n return coveredSets;\n }\n\n public search(query: string) {\n if(!query) {\n return this.renderFeatured();\n }\n\n return this.managers.appStickersManager.searchStickerSets(query, false).then((coveredSets) => {\n if(this.inputSearch.value !== query) {\n return;\n }\n\n // console.log('search result:', coveredSets);\n\n coveredSets = this.filterRendered(query, coveredSets);\n coveredSets.forEach((set) => {\n this.renderSet(set.set);\n });\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport {horizontalMenu} from '../horizontalMenu';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport Scrollable, {ScrollableX} from '../scrollable';\nimport appSidebarRight from '../sidebarRight';\nimport StickyIntersector from '../stickyIntersector';\nimport EmojiTab from './tabs/emoji';\nimport GifsTab from './tabs/gifs';\nimport StickersTab, {EmoticonsTabC, StickersTabCategory} from './tabs/stickers';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport AppGifsTab from '../sidebarRight/tabs/gifs';\nimport AppStickersTab from '../sidebarRight/tabs/stickers';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport whichChild from '../../helpers/dom/whichChild';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport DropdownHover from '../../helpers/dropdownHover';\nimport pause from '../../helpers/schedulers/pause';\nimport {IS_APPLE_MOBILE} from '../../environment/userAgent';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport type LazyLoadQueueIntersector from '../lazyLoadQueueIntersector';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport noop from '../../helpers/noop';\nimport {FocusDirection, ScrollOptions} from '../../helpers/fastSmoothScroll';\nimport BezierEasing from '../../vendor/bezier-easing';\nimport RichInputHandler from '../../helpers/dom/richInputHandler';\nimport {getCaretPosF} from '../../helpers/dom/getCaretPosNew';\nimport ListenerSetter from '../../helpers/listenerSetter';\n\nexport const EMOTICONSSTICKERGROUP: AnimationItemGroup = 'emoticons-dropdown';\n\nexport interface EmoticonsTab {\n content: HTMLElement;\n scrollable: Scrollable;\n menuScroll?: ScrollableX;\n tabId: number;\n init: () => void;\n onOpen?: () => void;\n onOpened?: () => void;\n onClose?: () => void;\n onClosed?: () => void;\n}\n\nconst easing = BezierEasing(0.42, 0.0, 0.58, 1.0);\nconst scrollOptions: Partial = {\n forceDuration: 200,\n transitionFunction: easing\n};\n\nexport class EmoticonsDropdown extends DropdownHover {\n public static lazyLoadQueue = new LazyLoadQueue(1);\n\n private emojiTab: EmojiTab;\n private stickersTab: StickersTab;\n private gifsTab: GifsTab;\n\n private container: HTMLElement;\n private tabsEl: HTMLElement;\n private tabId = -1;\n\n private tabs: {[id: number]: EmoticonsTab};\n\n private searchButton: HTMLElement;\n private deleteBtn: HTMLElement;\n\n private selectTab: ReturnType;\n\n private savedRange: Range;\n private managers: AppManagers;\n\n constructor() {\n super({\n element: document.getElementById('emoji-dropdown') as HTMLDivElement,\n ignoreOutClickClassName: 'input-message-input'\n });\n\n this.addEventListener('open', async() => {\n if(IS_TOUCH_SUPPORTED) {\n // appImManager.chat.input.saveScroll();\n if(blurActiveElement()) {\n await pause(100);\n }\n }\n\n if(this.element.parentElement !== appImManager.chat.input.chatInput) {\n appImManager.chat.input.chatInput.append(this.element);\n }\n\n this.savedRange = this.getGoodRange();\n\n EmoticonsDropdown.lazyLoadQueue.lock();\n // EmoticonsDropdown.lazyLoadQueue.unlock();\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n\n const tab = this.tab;\n tab.onOpen?.();\n });\n\n this.addEventListener('opened', () => {\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlockAndRefresh();\n\n // this.container.classList.remove('disable-hover');\n\n const tab = this.tab;\n tab.onOpened?.();\n });\n\n this.addEventListener('close', () => {\n EmoticonsDropdown.lazyLoadQueue.lock();\n // EmoticonsDropdown.lazyLoadQueue.lock();\n\n // нужно залочить группу и выключить стикеры\n animationIntersector.lockIntersectionGroup(EMOTICONSSTICKERGROUP);\n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n const tab = this.tab;\n tab.onClose?.();\n });\n\n this.addEventListener('closed', () => {\n // теперь можно убрать visible, чтобы они не включились после фокуса\n animationIntersector.unlockIntersectionGroup(EMOTICONSSTICKERGROUP);\n EmoticonsDropdown.lazyLoadQueue.unlock();\n EmoticonsDropdown.lazyLoadQueue.refresh();\n\n // this.container.classList.remove('disable-hover');\n\n this.savedRange = undefined;\n\n const tab = this.tab;\n tab.onClosed?.();\n });\n }\n\n public get tab() {\n return this.tabs[this.tabId];\n }\n\n public init() {\n this.managers = rootScope.managers;\n this.emojiTab = new EmojiTab({managers: this.managers});\n this.stickersTab = new StickersTab(this.managers);\n this.gifsTab = new GifsTab(this.managers);\n\n this.tabs = {};\n [this.emojiTab, this.stickersTab, this.gifsTab].forEach((tab, idx) => {\n tab.tabId = idx;\n this.tabs[idx] = tab;\n });\n\n this.container = this.element.querySelector('.emoji-container .tabs-container') as HTMLDivElement;\n this.container.prepend(this.emojiTab.container, this.stickersTab.container);\n this.tabsEl = this.element.querySelector('.emoji-tabs') as HTMLUListElement;\n this.selectTab = horizontalMenu(this.tabsEl, this.container, this.onSelectTabClick, () => {\n const {tab} = this;\n tab.init?.();\n animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\n });\n\n this.searchButton = this.element.querySelector('.emoji-tabs-search');\n this.searchButton.addEventListener('click', () => {\n if(this.tabId === this.stickersTab.tabId) {\n if(!appSidebarRight.isTabExists(AppStickersTab)) {\n appSidebarRight.createTab(AppStickersTab).open();\n }\n } else {\n if(!appSidebarRight.isTabExists(AppGifsTab)) {\n appSidebarRight.createTab(AppGifsTab).open();\n }\n }\n });\n\n this.deleteBtn = this.element.querySelector('.emoji-tabs-delete');\n attachClickEvent(this.deleteBtn, (e) => {\n cancelEvent(e);\n const input = appImManager.chat.input.messageInput;\n // RichInputHandler.getInstance().makeFocused(appImManager.chat.input.messageInput);\n let range = RichInputHandler.getInstance().getSavedRange(input);\n if(!range) {\n range = document.createRange();\n range.setStartAfter(input.lastChild);\n }\n\n const newRange = range.cloneRange();\n // if(range.endOffset === range.startOffset && range.endContainer === range.startContainer) {\n if(range.collapsed) {\n const {node, offset} = getCaretPosF(input, range.endContainer, range.endOffset);\n let newStartNode: Node;\n if(offset) {\n newStartNode = node;\n } else {\n newStartNode = node.previousSibling;\n if(!newStartNode) {\n return;\n }\n\n while(newStartNode.nodeType === newStartNode.TEXT_NODE && !newStartNode.nodeValue && (newStartNode = newStartNode.previousSibling)) {\n\n }\n\n if(newStartNode.nodeType === newStartNode.ELEMENT_NODE && !(newStartNode as HTMLElement).isContentEditable) {\n return;\n }\n }\n\n if(newStartNode.nodeType === newStartNode.ELEMENT_NODE && (newStartNode as any).tagName === 'IMG') {\n newRange.selectNode(newStartNode);\n } else {\n const text = [...newStartNode.textContent];\n let t: string;\n if(offset) {\n let length = 0;\n t = text.find((text) => (length += text.length, length >= offset));\n } else {\n t = text.pop() || '';\n }\n\n const newOffset = offset ? offset - t.length : newStartNode.textContent.length - t.length;\n newRange.setStart(newStartNode, newOffset);\n }\n }\n\n newRange.deleteContents();\n\n appImManager.chat.input.messageInputField.simulateInputEvent();\n // const selection = document.getSelection();\n // if(selection.isCollapsed) {\n // selection.modify('extend', 'backward', 'character');\n // }\n\n // selection.deleteFromDocument();\n // (document.activeElement as HTMLElement).blur();\n\n // document.execCommand('undo', false, null);\n // const input = appImManager.chat.input.messageInput;\n // if((input.lastChild as any)?.tagName) {\n // input.lastElementChild.remove();\n // } else if(input.lastChild) {\n // if(!input.lastChild.textContent.length) {\n // input.lastChild.remove();\n // } else {\n // input.lastChild.textContent = input.lastChild.textContent.slice(0, -1);\n // }\n // }\n\n // const event = new Event('input', {bubbles: true, cancelable: true});\n // appImManager.chat.input.messageInput.dispatchEvent(event);\n // // appSidebarRight.stickersTab.init();\n });\n\n const HIDE_EMOJI_TAB = IS_APPLE_MOBILE && false;\n\n const INIT_TAB_ID = HIDE_EMOJI_TAB ? this.stickersTab.tabId : this.emojiTab.tabId;\n\n if(HIDE_EMOJI_TAB) {\n (this.tabsEl.children[1] as HTMLElement).classList.add('hide');\n }\n\n simulateClickEvent(this.tabsEl.children[INIT_TAB_ID + 1] as HTMLElement);\n if(this.tabs[INIT_TAB_ID].init) {\n this.tabs[INIT_TAB_ID].init(); // onTransitionEnd не вызовется, т.к. это первая открытая вкладка\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n let lastMouseMoveEvent: MouseEvent, mouseMoveEventAttached = false;\n const onMouseMove = (e: MouseEvent) => {\n lastMouseMoveEvent = e;\n };\n overlayCounter.addEventListener('change', (isActive) => {\n if(isActive) {\n if(!mouseMoveEventAttached) {\n document.body.addEventListener('mousemove', onMouseMove);\n mouseMoveEventAttached = true;\n }\n } else if(mouseMoveEventAttached) {\n document.body.removeEventListener('mousemove', onMouseMove);\n if(lastMouseMoveEvent) {\n this.onMouseOut(lastMouseMoveEvent);\n }\n }\n });\n }\n\n appImManager.addEventListener('peer_changing', () => {\n this.toggle(false);\n });\n appImManager.addEventListener('peer_changed', this.checkRights);\n this.checkRights();\n\n return super.init();\n }\n\n public getElement() {\n return this.element;\n }\n\n public scrollTo(tab: EmoticonsTab, element: HTMLElement) {\n tab.scrollable.scrollIntoViewNew({\n element: element as HTMLElement,\n axis: 'y',\n position: 'start',\n ...scrollOptions\n });\n }\n\n private onSelectTabClick = (id: number) => {\n if(this.tabId === id) {\n const {tab} = this;\n this.scrollTo(tab, tab.scrollable.container.firstElementChild as HTMLElement);\n return;\n }\n\n animationIntersector.checkAnimations(true, EMOTICONSSTICKERGROUP);\n\n this.tabId = id;\n this.searchButton.classList.toggle('hide', this.tabId === this.emojiTab.tabId);\n this.deleteBtn.classList.toggle('hide', this.tabId !== this.emojiTab.tabId);\n };\n\n private checkRights = async() => {\n const {peerId, threadId} = appImManager.chat;\n const children = this.tabsEl.children;\n const tabsElements = Array.from(children) as HTMLElement[];\n\n const [canSendStickers, canSendGifs] = await Promise.all([\n this.managers.appMessagesManager.canSendToPeer(peerId, threadId, 'send_stickers'),\n this.managers.appMessagesManager.canSendToPeer(peerId, threadId, 'send_gifs')\n ]);\n\n tabsElements[this.stickersTab.tabId + 1].toggleAttribute('disabled', !canSendStickers);\n tabsElements[this.gifsTab.tabId + 1].toggleAttribute('disabled', !canSendGifs);\n\n const active = this.tabsEl.querySelector('.active');\n if(active && whichChild(active) !== (this.emojiTab.tabId + 1) && (!canSendStickers || !canSendGifs)) {\n this.selectTab(this.emojiTab.tabId, false);\n }\n };\n\n public static menuOnClick = (\n emoticons: EmoticonsTabC,\n menu: HTMLElement,\n scrollable: Scrollable,\n menuScroll?: ScrollableX,\n prevTab?: StickersTabCategory,\n listenerSetter?: ListenerSetter\n ) => {\n let jumpedTo = -1;\n\n const scrollToTab = (tab: typeof prevTab, f?: boolean) => {\n const m = tab.menuScroll || menuScroll;\n if(m) {\n m.scrollIntoViewNew({\n element: tab.elements.menuTab,\n position: 'center',\n axis: 'x',\n getElementPosition: f ? ({elementPosition}) => {\n return elementPosition - 106;\n } : undefined,\n ...scrollOptions\n });\n }\n };\n\n const setActive = (tab: typeof prevTab, scroll = true) => {\n if(tab === prevTab) {\n return false;\n }\n\n let f = false;\n if(prevTab) {\n prevTab.elements.menuTab.classList.remove('active');\n if(prevTab.menuScroll && prevTab.menuScroll !== tab.menuScroll) {\n f = true;\n // scroll to first\n prevTab.menuScroll.container.parentElement.classList.remove('active');\n prevTab.menuScroll.scrollIntoViewNew({\n element: prevTab.menuScroll.container.firstElementChild as HTMLElement,\n forceDirection: scroll ? undefined : FocusDirection.Static,\n position: 'center',\n axis: 'x',\n ...scrollOptions\n });\n }\n }\n\n tab.elements.menuTab.classList.add('active');\n\n if(tab.menuScroll) {\n tab.menuScroll.container.parentElement.classList.add('active');\n scroll && menuScroll.scrollIntoViewNew({\n element: tab.menuScroll.container.parentElement,\n position: 'center',\n axis: 'x',\n ...scrollOptions\n });\n }\n\n if(prevTab) {\n scrollToTab(tab, f);\n }\n\n prevTab = tab;\n\n return true;\n };\n\n const setActiveStatic = (tab: typeof prevTab) => {\n if(prevTab?.local) {\n return;\n }\n\n emoticons.scrollable.scrollTop = tab.elements.container.offsetTop + 1;\n const s = emoticons.menuScroll.container;\n const e = tab.elements.menuTab;\n s.scrollLeft = e.offsetLeft - s.clientWidth / 2 + e.offsetWidth / 2;\n setActive(tab, false);\n };\n\n let scrollingToContent = false;\n const stickyIntersector = new StickyIntersector(scrollable.container, (stuck, target) => {\n if(scrollingToContent) {\n return;\n }\n\n // console.log('sticky scrollTop', stuck, target, scrollable.container.scrollTop, jumpedTo);\n\n if(Math.abs(jumpedTo - scrollable.container.scrollTop) <= 1) {\n return;\n } else {\n jumpedTo = -1;\n }\n\n const tab = emoticons.getCategoryByContainer(target);\n const which = whichChild(target);\n if(!stuck && (which || tab.menuScroll)) {\n return;\n }\n\n setActive(tab);\n });\n\n attachClickEvent(menu, (e) => {\n let target = findUpClassName(e.target as HTMLElement, 'menu-horizontal-div-item');\n if(!target) {\n target = findUpClassName(e.target as HTMLElement, 'menu-horizontal-inner');\n if(!target || target.classList.contains('active')) {\n return;\n }\n\n target = target.firstElementChild.firstElementChild as HTMLElement;\n }\n\n const which = whichChild(target);\n\n const tab = emoticons.getCategoryByMenuTab(target);\n\n /* if(menuScroll) {\n menuScroll.scrollIntoView(target, false, 0);\n } */\n\n if(setActive(tab)) {\n // scrollToTab(tab);\n // return;\n }\n\n let offsetTop = 0, additionalOffset = 0;\n if(which > 0 || tab.menuScroll) {\n const element = tab.elements.container;\n additionalOffset = 1;\n offsetTop = element.offsetTop + additionalOffset; // * due to stickyIntersector\n }\n\n jumpedTo = offsetTop;\n\n scrollingToContent = true;\n scrollable.scrollIntoViewNew({\n element: offsetTop ? tab.elements.container : scrollable.container.firstElementChild,\n position: 'start',\n axis: 'y',\n getElementPosition: offsetTop ? ({elementPosition}) => elementPosition + additionalOffset : undefined,\n ...scrollOptions\n }).finally(() => {\n setActive(tab);\n scrollingToContent = false;\n });\n }, {listenerSetter});\n\n const a = scrollable.onAdditionalScroll ? scrollable.onAdditionalScroll.bind(scrollable) : noop;\n scrollable.onAdditionalScroll = () => {\n emoticons.content.parentElement.classList.toggle('scrolled-top', !scrollable.scrollTop);\n a();\n };\n\n return {stickyIntersector, setActive, setActiveStatic};\n };\n\n public static onMediaClick = async(e: {target: EventTarget | Element}, clearDraft = false, silent?: boolean) => {\n const target = findUpTag(e.target as HTMLElement, 'DIV');\n if(!target) return false;\n\n const docId = target.dataset.docId;\n if(!docId) return false;\n\n return this.sendDocId(docId, clearDraft, silent);\n };\n\n public static async sendDocId(docId: DocId, clearDraft?: boolean, silent?: boolean) {\n if(await appImManager.chat.input.sendMessageWithDocument(docId, undefined, clearDraft, silent)) {\n /* dropdown.classList.remove('active');\n toggleEl.classList.remove('active'); */\n if(emoticonsDropdown.container) {\n emoticonsDropdown.forceClose = true;\n // emoticonsDropdown.container.classList.add('disable-hover');\n emoticonsDropdown.toggle(false);\n }\n\n return true;\n } else {\n console.warn('got no doc by id:', docId);\n return false;\n }\n }\n\n public addLazyLoadQueueRepeat(lazyLoadQueue: LazyLoadQueueIntersector, processInvisibleDiv: (div: HTMLElement) => void) {\n this.addEventListener('close', () => {\n lazyLoadQueue.lock();\n });\n\n this.addEventListener('closed', () => {\n const divs = lazyLoadQueue.intersector.getVisible();\n\n for(const div of divs) {\n processInvisibleDiv(div);\n }\n\n lazyLoadQueue.intersector.clearVisible();\n });\n\n this.addEventListener('opened', () => {\n lazyLoadQueue.unlockAndRefresh();\n });\n }\n\n public getSavedRange() {\n return this.getGoodRange() || this.savedRange;\n }\n\n private getGoodRange() {\n const sel = document.getSelection();\n if(sel.rangeCount && document.activeElement === appImManager.chat.input.messageInput) {\n return sel.getRangeAt(0);\n }\n }\n}\n\nconst emoticonsDropdown = new EmoticonsDropdown();\nMOUNT_CLASS_TO.emoticonsDropdown = emoticonsDropdown;\nexport default emoticonsDropdown;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport emoticonsDropdown, {EmoticonsDropdown, EMOTICONSSTICKERGROUP} from '..';\nimport cancelEvent from '../../../helpers/dom/cancelEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {fastRaf} from '../../../helpers/schedulers';\nimport pause from '../../../helpers/schedulers/pause';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport {emojiFromCodePoints} from '../../../vendor/emoji';\nimport {putPreloader} from '../../putPreloader';\nimport Scrollable, {ScrollableX} from '../../scrollable';\nimport IS_EMOJI_SUPPORTED from '../../../environment/emojiSupport';\nimport IS_TOUCH_SUPPORTED from '../../../environment/touchSupport';\nimport blurActiveElement from '../../../helpers/dom/blurActiveElement';\nimport Emoji from '../../../config/emoji';\nimport fixEmoji from '../../../lib/richTextProcessor/fixEmoji';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport wrapSingleEmoji from '../../../lib/richTextProcessor/wrapSingleEmoji';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport {EmoticonsTabC, StickersTabCategory} from './stickers';\nimport {makeMediaSize} from '../../../helpers/mediaSize';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport VisibilityIntersector, {OnVisibilityChangeItem} from '../../visibilityIntersector';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport ListenerSetter from '../../../helpers/listenerSetter';\nimport {Document, StickerSet} from '../../../layer';\nimport {CustomEmojiElement, CustomEmojiRendererElement} from '../../../lib/richTextProcessor/wrapRichText';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport PopupStickers from '../../popups/stickers';\nimport {hideToast, toastNew} from '../../toast';\nimport safeAssign from '../../../helpers/object/safeAssign';\nimport type {AppStickersManager} from '../../../lib/appManagers/appStickersManager';\n\nconst loadedURLs: Set = new Set();\nexport function appendEmoji(emoji: string, container?: HTMLElement, prepend = false, unify = false) {\n // const emoji = details.unified;\n // const emoji = (details.unified as string).split('-')\n // .reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n\n const spanEmoji = document.createElement('span');\n spanEmoji.classList.add('super-emoji');\n\n let kek: DocumentFragment;\n if(unify && !IS_EMOJI_SUPPORTED) {\n kek = wrapSingleEmoji(emoji);\n } else {\n emoji = fixEmoji(emoji);\n kek = wrapEmojiText(emoji);\n }\n\n /* if(!kek.includes('emoji')) {\n console.log(emoji, kek, spanEmoji, emoji.length, new TextEncoder().encode(emoji), emojiUnicode(emoji));\n return;\n } */\n\n // console.log(kek);\n\n spanEmoji.append(kek);\n\n if(spanEmoji.children.length > 1) {\n const first = spanEmoji.firstElementChild;\n spanEmoji.innerHTML = '';\n spanEmoji.append(first);\n }\n\n if(spanEmoji.firstElementChild?.tagName === 'IMG') {\n const image = spanEmoji.firstElementChild as HTMLImageElement;\n\n const url = image.src;\n if(!loadedURLs.has(url)) {\n image.setAttribute('loading', 'lazy');\n const placeholder = document.createElement('span');\n placeholder.classList.add('emoji-placeholder');\n\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '0';\n placeholder.style.opacity = '1';\n }\n\n image.addEventListener('load', () => {\n fastRaf(() => {\n if(rootScope.settings.animationsEnabled) {\n image.style.opacity = '';\n placeholder.style.opacity = '';\n }\n\n spanEmoji.classList.remove('empty');\n\n loadedURLs.add(url);\n });\n }, {once: true});\n\n spanEmoji.append(placeholder);\n }\n }\n\n // spanEmoji = spanEmoji.firstElementChild as HTMLSpanElement;\n // spanEmoji.setAttribute('emoji', emoji);\n if(container) {\n if(prepend) container.prepend(spanEmoji);\n else container.appendChild(spanEmoji);\n }\n\n return spanEmoji;\n}\n\nexport function getEmojiFromElement(element: HTMLElement): {docId?: DocId, emoji: string} {\n const superEmoji = findUpClassName(element, 'super-emoji');\n if(!superEmoji) return;\n\n const firstElementChild = superEmoji.firstElementChild as HTMLElement;\n if(firstElementChild && firstElementChild.classList.contains('custom-emoji')) {\n return {emoji: firstElementChild.dataset.stickerEmoji, docId: firstElementChild.dataset.docId} as const;\n } else {\n if(element.nodeType === element.TEXT_NODE) return {emoji: element.nodeValue};\n if(element.tagName === 'SPAN' && !element.classList.contains('emoji') && element.firstElementChild) {\n element = element.firstElementChild as HTMLElement;\n }\n\n return {emoji: element.getAttribute('alt') || element.innerText} as const;\n }\n}\n\nconst EMOJI_RECENT_ID: (typeof EMOJI_CATEGORIES)[0][0] = 'Emoji.Recent';\nconst EMOJI_RECENT_CATEGORY: (typeof EMOJI_CATEGORIES)[0] = [EMOJI_RECENT_ID, 'recent'];\nconst CUSTOM_EMOJI_RECENT_ID: (typeof EMOJI_CATEGORIES)[0][0] = '';\nconst CUSTOM_EMOJI_RECENT_CATEGORY: (typeof EMOJI_CATEGORIES)[0] = [CUSTOM_EMOJI_RECENT_ID, ''];\nconst EMOJI_CATEGORIES: [LangPackKey | '', string][] = [\n ['Emoji.SmilesAndPeople', 'smile'],\n ['Emoji.AnimalsAndNature', 'animals'],\n ['Emoji.FoodAndDrink', 'eats'],\n ['Emoji.TravelAndPlaces', 'car'],\n ['Emoji.ActivityAndSport', 'sport'],\n ['Emoji.Objects', 'lamp'],\n // ['Emoji.Symbols', 'info'],\n ['Emoji.Flags', 'flag'],\n ['Skin Tones' as any, '']\n];\n\nlet sorted: Map<(typeof EMOJI_CATEGORIES)[0], string[]>;\nfunction prepare() {\n if(sorted) {\n return sorted;\n }\n\n const a: Array<[(typeof EMOJI_CATEGORIES)[0], string[]]> = [\n [CUSTOM_EMOJI_RECENT_CATEGORY, []],\n [EMOJI_RECENT_CATEGORY, []]\n ];\n\n sorted = new Map(a);\n for(const emoji in Emoji) {\n const details = Emoji[emoji];\n const i = '' + details;\n const category = EMOJI_CATEGORIES[+i[0] - 1];\n if(!category) continue; // maybe it's skin tones\n\n let s = sorted.get(category);\n if(!s) {\n s = [];\n sorted.set(category, s);\n }\n\n s[+i.slice(1) || 0] = emoji;\n }\n\n sorted.delete(EMOJI_CATEGORIES.pop());\n EMOJI_CATEGORIES.unshift(CUSTOM_EMOJI_RECENT_CATEGORY, EMOJI_RECENT_CATEGORY);\n const order = EMOJI_CATEGORIES.map(([id]) => id);\n const entries = [...sorted.entries()].sort((a, b) => order.indexOf(a[0][0]) - order.indexOf(b[0][0]));\n sorted = new Map(entries);\n\n return sorted;\n}\n\nconst EMOJI_ELEMENT_SIZE = makeMediaSize(42, 42);\nconst RECENT_MAX_LENGTH = 32;\n\ntype EmojiTabItem = {element: HTMLElement} & ReturnType;\ntype EmojiTabCategory = StickersTabCategory;\nexport default class EmojiTab extends EmoticonsTabC {\n private closeScrollTop: number;\n private menuInnerScroll: ScrollableX;\n private isStandalone?: boolean;\n private noRegularEmoji?: boolean;\n private stickerSetId?: Parameters[0];\n private onClick: (emoji: EmojiTabItem) => void;\n private activeEmoji: ReturnType;\n private activeElements: EmojiTabItem[];\n\n constructor(options: {\n managers: AppManagers,\n isStandalone?: boolean,\n noRegularEmoji?: boolean,\n stickerSetId?: EmojiTab['stickerSetId'],\n onClick?: EmojiTab['onClick']\n }) {\n super(\n options.managers,\n 'super-emojis',\n () => EMOJI_ELEMENT_SIZE,\n 16,\n 4,\n 0\n );\n\n safeAssign(this, options);\n this.container.classList.add('emoji-padding');\n this.content.id = 'content-emoji';\n this.activeElements = [];\n }\n\n private onCategoryVisibility = ({target, visible}: Pick) => {\n const category = this.categoriesMap.get(target);\n // console.log(target, visible, category);\n // if(category.local) return;\n\n const renderer = category.elements.renderer;\n const newChildren: HTMLElement[] = [];\n if(renderer) {\n newChildren.push(renderer);\n const customEmojis: Parameters[0] = new Map();\n if(visible) {\n newChildren.push(...category.items.map(({docId, element}) => {\n if(!docId) {\n return element;\n }\n\n // return element;\n\n // if(element.firstElementChild) {\n // return element;\n // }\n\n const customEmojiElement = element.firstElementChild as CustomEmojiElement;\n customEmojiElement.clear(false);\n // const customEmojiElement = CustomEmojiElement.create(document.id);\n customEmojis.set(customEmojiElement.docId, new Set([customEmojiElement]));\n // element.append(customEmojiElement);\n return element;\n }));\n\n renderer.add(customEmojis/* , EmoticonsDropdown.lazyLoadQueue */, undefined, undefined, false);\n } else {\n renderer.clearCanvas();\n renderer.middlewareHelper.clean();\n }\n } else if(visible) {\n newChildren.push(...category.items.map(({element}) => element));\n }\n\n // if(visible)\n category.elements.items.replaceChildren(...newChildren);\n\n if(renderer && !visible) {\n const customEmojis: Parameters[0] = new Map();\n category.items.forEach(({docId, element}) => {\n if(!docId) {\n return;\n }\n\n const customEmojiElement = element.firstElementChild as CustomEmojiElement;\n customEmojiElement.clear();\n customEmojis.set(customEmojiElement.docId, new Set([customEmojiElement]));\n });\n\n /* const promise = */renderer.add(customEmojis/* , EmoticonsDropdown.lazyLoadQueue */, undefined, true);\n // promise.then(() => {\n // customEmojis.forEach((elements) => {\n // elements.forEach((element) => {\n // if(!element.innerHTML) {\n // console.log('no thumb', element);\n // // debugger;\n // }\n // });\n // });\n\n // const set = customEmojis.get('5766933926429854499');\n // console.log(`wrapped ${customEmojis.size} thumbs`, set && set.values().next().value.innerHTML);\n // });\n }\n\n // if(!visible) {\n // const customEmojis: Parameters[0] = {};\n // category.items.forEach((item) => {\n // const {element, document} = item;\n // if(!element.firstElementChild) {\n // return;\n // }\n\n // const customEmojiElement = CustomEmojiElement.create(document.id);\n // customEmojis[customEmojiElement.docId] = new Set([customEmojiElement]);\n // element.firstElementChild.replaceWith(customEmojiElement);\n // });\n\n // renderer.add(customEmojis, EmoticonsDropdown.lazyLoadQueue);\n // }\n };\n\n public destroy() {\n super.destroy();\n this.menuInnerScroll?.destroy();\n }\n\n public init() {\n super.init();\n this.init = undefined;\n\n const intersectionOptions: IntersectionObserverInit = {\n root: this.isStandalone ? this.content : emoticonsDropdown.getElement()\n };\n\n this.categoriesIntersector = new VisibilityIntersector(this.onCategoryVisibility, intersectionOptions);\n\n this.menuOnClickResult = EmoticonsDropdown.menuOnClick(this, this.menu, this.scrollable, this.menuScroll, undefined, this.listenerSetter);\n\n const preloader = putPreloader(this.content, true);\n\n let innerScrollWrapper: HTMLElement;\n\n if(!this.isStandalone) {\n const x = this.menuInnerScroll = new ScrollableX(undefined);\n x.container.classList.add('menu-horizontal-inner-scroll');\n\n innerScrollWrapper = document.createElement('div');\n innerScrollWrapper.classList.add('menu-horizontal-inner');\n innerScrollWrapper.append(x.container);\n }\n\n let preparedMap: ReturnType;\n prepare();\n if(!this.noRegularEmoji) {\n preparedMap = prepare();\n } else {\n preparedMap = new Map([\n [[CUSTOM_EMOJI_RECENT_CATEGORY[0], 'recent'], []]\n // [EMOJI_RECENT_CATEGORY, []]\n ]);\n }\n\n preparedMap.forEach((emojis, [titleLangPackKey, icon]) => {\n const category = this.createLocalCategory(titleLangPackKey, titleLangPackKey, icon, !icon);\n category.elements.container.classList.remove('hide');\n category.elements.items.classList.add(icon && !this.isStandalone ? 'is-local' : 'not-local');\n\n emojis.forEach((unified) => {\n /* if(emojiUnicode(emoji) === '1f481-200d-2642') {\n console.log('append emoji', emoji, emojiUnicode(emoji));\n } */\n\n const emoji = emojiFromCodePoints(unified);\n // if(emoji.includes('🕵')) {\n // console.log('toCodePoints', toCodePoints(emoji));\n // emoji = emoji.replace(/(\\u200d[\\u2640\\u2642\\u2695])(?!\\ufe0f)/, '\\ufe0f$1');\n // const zwjIndex = emoji.indexOf('\\u200d');\n // if(zwjIndex !== -1 && !emoji.includes('\\ufe0f')) {\n // /* if(zwjIndex !== (emoji.length - 1)) {\n // emoji = emoji.replace(/(\\u200d)/g, '\\ufe0f$1');\n // } */\n\n // emoji += '\\ufe0f';\n // //emoji += '\\ufe0f';\n // }\n\n // debugger;\n // }\n\n this.addEmojiToCategory({\n category,\n emoji: {emoji},\n batch: true\n });\n\n /* if(category === 'Smileys & Emotion') {\n console.log('appended emoji', emoji, itemsDiv.children[itemsDiv.childElementCount - 1].innerHTML, emojiUnicode(emoji));\n } */\n });\n });\n\n const promise = Promise.all([\n this.isStandalone ? undefined : pause(200),\n !this.noRegularEmoji && this.managers.appEmojiManager.getRecentEmojis('native'),\n !this.isStandalone && this.managers.appEmojiManager.getRecentEmojis('custom'),\n this.stickerSetId && this.managers.appStickersManager.getLocalStickerSet(this.stickerSetId),\n this.managers.appEmojiManager.getCustomEmojis()\n ]).then(([_, recent, recentCustom, mainSet, sets]) => {\n preloader.remove();\n\n if(mainSet) {\n recentCustom = mainSet.documents.map((doc) => doc.id);\n }\n\n const recentCategory = this.categories[EMOJI_RECENT_ID];\n const recentCustomCategory = this.categories[CUSTOM_EMOJI_RECENT_ID];\n\n if(!this.isStandalone) {\n const a = [\n recentCategory && [recentCategory, recent] as const,\n recentCustomCategory && [recentCustomCategory, recentCustom] as const\n ];\n\n a.filter(Boolean).forEach(([category, recent]) => {\n category.limit = RECENT_MAX_LENGTH;\n recent.splice(RECENT_MAX_LENGTH, recent.length - RECENT_MAX_LENGTH);\n });\n }\n\n if(recentCategory && recent) for(const emoji of recent) {\n this.addEmojiToCategory({\n category: recentCategory,\n emoji: {emoji},\n batch: true\n });\n }\n\n if(recentCustomCategory) {\n this.createRendererForCategory(recentCustomCategory);\n if(recentCustom) for(const docId of recentCustom) {\n this.addEmojiToCategory({\n category: recentCustomCategory,\n emoji: {emoji: '', docId},\n batch: true\n });\n }\n recentCustomCategory.elements.container.style.paddingTop = '.5rem';\n }\n\n EMOJI_CATEGORIES.forEach(([id]) => {\n const category = this.categories[id];\n if(!category) {\n return;\n }\n\n this.toggleLocalCategory(category, true);\n\n if(id !== EMOJI_RECENT_ID && id !== CUSTOM_EMOJI_RECENT_ID) {\n category.menuScroll = this.menuInnerScroll;\n this.menuInnerScroll.container.append(category.elements.menuTab);\n }\n });\n\n this.resizeCategories();\n\n recentCategory && innerScrollWrapper && recentCategory.elements.menuTab.after(innerScrollWrapper);\n\n sets.sets.forEach((set) => {\n this.renderStickerSet(set);\n });\n\n this.listenerSetter.add(rootScope)('premium_toggle', () => {\n this.toggleCustomCategory();\n });\n\n this.listenerSetter.add(rootScope)('stickers_top', this.postponedEvent((id) => {\n const category = this.categories[id];\n if(!category) {\n return;\n }\n\n this.positionCategory(category, true);\n\n this.listenerSetter.add(emoticonsDropdown)('openAfterLayout', () => {\n this.menuOnClickResult.setActiveStatic(category);\n }, {once: true});\n }));\n\n const toggleRenderers = (ignore: boolean) => {\n for(const id in this.categories) {\n const category = this.categories[id];\n const renderer = category.elements.renderer;\n if(renderer) {\n renderer.ignoreSettingDimensions = ignore;\n if(!ignore) {\n renderer.setDimensionsFromRect(undefined, true);\n }\n }\n }\n };\n\n !this.isStandalone && this.listenerSetter.add(emoticonsDropdown)('opened', () => {\n toggleRenderers(false);\n });\n\n !this.isStandalone && this.listenerSetter.add(emoticonsDropdown)('close', () => {\n toggleRenderers(true);\n });\n\n this.listenerSetter.add(rootScope)('stickers_installed', (set) => {\n if(!this.categories[set.id] && set.pFlags.emojis) {\n this.renderStickerSet(set, true);\n }\n });\n\n this.listenerSetter.add(rootScope)('stickers_deleted', (set) => {\n const category = this.categories[set.id];\n if(this.deleteCategory(category)) {\n const {renderer} = category.elements;\n if(renderer) {\n renderer.middlewareHelper.clean();\n }\n }\n });\n\n !this.isStandalone && this.listenerSetter.add(rootScope)('emoji_recent', this.postponedEvent((emoji) => {\n const category = this.categories[emoji.docId ? CUSTOM_EMOJI_RECENT_ID : EMOJI_RECENT_ID];\n if(!category) {\n return;\n }\n\n const verify: (item: EmojiTabItem) => boolean = emoji.docId ?\n (item) => item.docId === emoji.docId :\n (item) => item.emoji === emoji.emoji;\n const found = findAndSplice(category.items, verify);\n if(found) {\n category.items.unshift(found);\n if(this.isCategoryVisible(category)) {\n const {renderer} = category.elements;\n positionElementByIndex(found.element, category.elements.items, renderer ? 1 : 0, -1);\n renderer?.forceRender();\n }\n } else {\n this.addEmojiToCategory({\n category,\n emoji,\n batch: false,\n prepend: true\n });\n }\n\n if(this.closeScrollTop === 0) {\n this.menuOnClickResult.setActive(emoji.docId ? this.categories[EMOJI_RECENT_ID] : category);\n }\n }));\n\n !this.isStandalone && this.listenerSetter.add(appImManager)('peer_changed', () => {\n this.toggleCustomCategory();\n });\n\n this.toggleCustomCategory();\n\n this.menuOnClickResult.setActive(recentCategory ?? recentCustomCategory);\n });\n\n attachClickEvent(this.content, this.onContentClick, {listenerSetter: this.listenerSetter});\n attachStickerViewerListeners({listenTo: this.content, listenerSetter: this.listenerSetter});\n\n return promise;\n }\n\n private renderStickerSet(set: StickerSet.stickerSet, prepend?: boolean) {\n const category = this.createCategory(set, wrapEmojiText(set.title));\n this.positionCategory(category, prepend);\n const {container, menuTabPadding} = category.elements;\n category.elements.items.classList.add('not-local');\n category.elements.container.classList.add('is-premium-set');\n category.elements.title.classList.add('tgico');\n\n this.createRendererForCategory(category);\n\n const promise = this.managers.appStickersManager.getStickerSet(set);\n promise.then(({documents}) => {\n documents.forEach((document) => {\n this.addEmojiToCategory({\n category,\n emoji: {docId: document.id, emoji: (document as Document.document).stickerEmojiRaw},\n batch: true\n });\n });\n\n // if(this.isCategoryVisible(category)) {\n // category.elements.items.append(...category.items.map(({element}) => element));\n // }\n\n this.onCategoryVisibility({target: category.elements.container, visible: this.isCategoryVisible(category)});\n\n category.setCategoryItemsHeight();\n container.classList.remove('hide');\n });\n\n wrapStickerSetThumb({\n set,\n container: menuTabPadding,\n group: EMOTICONSSTICKERGROUP,\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n width: 32,\n height: 32,\n autoplay: false\n });\n }\n\n private get peerId() {\n return appImManager.chat.peerId;\n }\n\n public getCustomCategory() {\n return this.categories[CUSTOM_EMOJI_RECENT_ID];\n }\n\n private toggleCustomCategory() {\n const category = this.categories[CUSTOM_EMOJI_RECENT_ID];\n const hasPremium = rootScope.premium || this.peerId === rootScope.myId;\n const canSeeCustomCategory = hasPremium || this.isStandalone;\n super.toggleLocalCategory(category, !!category.items.length && canSeeCustomCategory);\n this.content.classList.toggle('has-premium', hasPremium);\n }\n\n protected toggleLocalCategory(category: EmojiTabCategory, visible: boolean) {\n if(category.id === CUSTOM_EMOJI_RECENT_ID) {\n this.toggleCustomCategory();\n return;\n }\n\n super.toggleLocalCategory(category, visible);\n }\n\n private createRendererForCategory(category: EmojiTabCategory) {\n const renderer = CustomEmojiRendererElement.create({\n animationGroup: EMOTICONSSTICKERGROUP,\n customEmojiSize: mediaSizes.active.esgCustomEmoji\n });\n\n category.elements.renderer = renderer;\n category.elements.items.append(renderer);\n }\n\n public addEmojiToCategory(options: {\n category: EmojiTabCategory,\n emoji?: ReturnType,\n element?: HTMLElement,\n batch?: boolean,\n prepend?: boolean,\n active?: boolean\n }) {\n const {category, emoji, batch, prepend} = options;\n let element = options.element;\n if(element) {\n const spanEmoji = document.createElement('span');\n spanEmoji.classList.add('super-emoji');\n spanEmoji.append(element);\n element = spanEmoji;\n } else if(emoji.docId) {\n const customEmojiElement = CustomEmojiElement.create(emoji.docId);\n const span = document.createElement('span');\n span.classList.add(/* 'emoji', */'super-emoji');\n span.append(customEmojiElement);\n element = span;\n } else {\n element = appendEmoji(emoji.emoji/* .replace(/[\\ufe0f\\u2640\\u2642\\u2695]/g, '') */, undefined, false/* , false */);\n }\n\n const item: typeof category['items'][0] = {\n ...(emoji || {emoji: undefined}),\n element\n };\n\n if(\n options.active || (\n this.activeEmoji && (\n item.docId ?\n this.activeEmoji.docId === item.docId :\n this.activeEmoji.emoji === item.emoji\n )\n )\n ) {\n this.activeEmoji === emoji;\n this.activeElements.push(item);\n element.classList.add('active');\n }\n\n category.items[prepend ? 'unshift' : 'push'](item);\n if(!batch && !this.spliceExceed(category)) {\n this.onLocalCategoryUpdate(category);\n }\n }\n\n // private addEmojisToCategory(category: EmojiTabCategory, emojis: string[], prepend?: boolean) {\n // emojis.forEach((emoji) => {\n // this.addEmojiToCategory(category, emoji, true, prepend);\n // });\n\n // this.onLocalCategoryUpdate(category);\n // }\n\n private onContentClick = (e: MouseEvent) => {\n cancelEvent(e);\n\n const {target} = e;\n\n const container = findUpClassName(target, 'emoji-category');\n const category = this.categoriesMap.get(container);\n if(findUpClassName(target, 'category-title')) {\n if(category.local) {\n return;\n }\n\n new PopupStickers({id: category.set.id, access_hash: category.set.access_hash}, true).show();\n return;\n }\n\n const emoji = getEmojiFromElement(target as HTMLElement);\n if(!emoji) {\n return;\n }\n\n if(\n emoji.docId &&\n !rootScope.premium && (\n this.isStandalone ? category.id !== CUSTOM_EMOJI_RECENT_ID : this.peerId !== rootScope.myId\n )\n ) {\n const a = document.createElement('a');\n a.onclick = () => {\n appImManager.openPremiumBot();\n hideToast();\n };\n toastNew({\n langPackKey: 'CustomEmoji.PremiumAlert',\n langPackArguments: [a]\n });\n return;\n }\n\n if(this.onClick) {\n this.onClick({\n ...emoji,\n element: findUpClassName(target, 'super-emoji').firstElementChild as HTMLElement\n });\n } else {\n appImManager.chat.input.onEmojiSelected(emoji, false);\n }\n\n if(IS_TOUCH_SUPPORTED) {\n blurActiveElement();\n }\n };\n\n public setActive(emoji: ReturnType) {\n if(\n emoji === this.activeEmoji ||\n emoji?.docId ? emoji.docId === this.activeEmoji?.docId : emoji?.emoji === this.activeEmoji?.emoji\n ) {\n return;\n }\n\n this.activeEmoji = emoji;\n\n this.activeElements.forEach((item) => {\n item.element.classList.remove('active');\n });\n\n this.activeElements.length = 0;\n\n this.categoriesMap.forEach((category) => {\n category.items.forEach((item) => {\n if(emoji.docId ? item.docId === emoji.docId : item.emoji === emoji.emoji) {\n item.element.classList.add('active');\n this.activeElements.push(item);\n }\n });\n });\n }\n\n public onClose() {\n this.closeScrollTop = this.scrollable.scrollTop;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getEmojiEntityFromEmoji from './getEmojiEntityFromEmoji';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapSingleEmoji(emoji: string) {\n return wrapRichText(emoji, {\n entities: [getEmojiEntityFromEmoji(emoji)]\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport VisibilityIntersector, {OnVisibilityChange} from './visibilityIntersector';\n\nexport default class LazyLoadQueueRepeat extends LazyLoadQueueIntersector {\n private elementsMap: Map = new Map();\n\n constructor(\n parallelLimit?: number,\n protected onVisibilityChange?: OnVisibilityChange,\n options?: IntersectionObserverInit\n ) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector((item) => {\n const {target, visible} = item;\n\n const queueItem = this.elementsMap.get(target);\n queueItem.visible = visible;\n\n if(visible) {\n queueItem.wasSeen = true;\n if(!this.queue.includes(queueItem)) {\n this.queue.push(queueItem);\n }\n } else {\n indexOfAndSplice(this.queue, queueItem);\n }\n\n this.onVisibilityChange?.(item);\n this.setProcessQueueTimeout();\n }, options);\n }\n\n public clear() {\n super.clear();\n this.elementsMap.clear();\n }\n\n /* public async processItem(item: LazyLoadElement) {\n //await super.processItem(item);\n await LazyLoadQueueBase.prototype.processItem.call(this, item);\n\n if(this.lazyLoadMedia.length) {\n this.processQueue();\n }\n } */\n\n public observe(el: LazyLoadElement) {\n this.elementsMap.set(el.div, el);\n super.observe(el);\n }\n\n public unobserve(el: LazyLoadElement) {\n this.elementsMap.delete(el.div);\n super.unobserve(el);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport emoticonsDropdown, {EmoticonsDropdown, EMOTICONSSTICKERGROUP, EmoticonsTab} from '..';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport mediaSizes from '../../../helpers/mediaSizes';\nimport {Document, MessagesAllStickers, StickerSet} from '../../../layer';\nimport {MyDocument} from '../../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../../animationIntersector';\nimport LazyLoadQueue from '../../lazyLoadQueue';\nimport LazyLoadQueueRepeat from '../../lazyLoadQueueRepeat';\nimport {putPreloader} from '../../putPreloader';\nimport PopupStickers from '../../popups/stickers';\nimport Scrollable, {ScrollableX} from '../../scrollable';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport noop from '../../../helpers/noop';\nimport ButtonIcon from '../../buttonIcon';\nimport confirmationPopup from '../../confirmationPopup';\nimport VisibilityIntersector, {OnVisibilityChangeItem} from '../../visibilityIntersector';\nimport createStickersContextMenu from '../../../helpers/dom/createStickersContextMenu';\nimport findUpAsChild from '../../../helpers/dom/findUpAsChild';\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport attachStickerViewerListeners from '../../stickerViewer';\nimport ListenerSetter from '../../../helpers/listenerSetter';\nimport wrapSticker from '../../wrappers/sticker';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport {MediaSize} from '../../../helpers/mediaSize';\nimport {AnyFunction} from '../../../types';\nimport {IgnoreMouseOutType} from '../../../helpers/dropdownHover';\n\nexport class SuperStickerRenderer {\n public lazyLoadQueue: LazyLoadQueueRepeat;\n private animated: Set = new Set();\n\n constructor(\n private regularLazyLoadQueue: LazyLoadQueue,\n private group: AnimationItemGroup,\n private managers: AppManagers,\n private options?: IntersectionObserverInit\n ) {\n this.lazyLoadQueue = new LazyLoadQueueRepeat(undefined, ({target, visible}) => {\n if(!visible) {\n this.processInvisible(target);\n }\n }, options);\n }\n\n public clear() {\n this.lazyLoadQueue.clear();\n }\n\n public renderSticker(doc: MyDocument, element?: HTMLElement, loadPromises?: Promise[]) {\n if(!element) {\n element = document.createElement('div');\n element.classList.add('grid-item', 'super-sticker');\n element.dataset.docId = '' + doc.id;\n\n if(doc.animated) {\n this.observeAnimated(element);\n }\n }\n\n // * This will wrap only a thumb\n /* !doc.animated && */wrapSticker({\n doc,\n div: element,\n lazyLoadQueue: this.regularLazyLoadQueue,\n group: this.group,\n onlyThumb: doc.animated,\n loadPromises\n });\n\n return element;\n }\n\n public observeAnimated(element: HTMLElement) {\n this.animated.add(element);\n this.lazyLoadQueue.observe({\n div: element,\n load: this.processVisible\n });\n }\n\n public unobserveAnimated(element: HTMLElement) {\n this.animated.delete(element);\n this.lazyLoadQueue.delete({div: element});\n }\n\n private checkAnimationContainer = (element: HTMLElement, visible: boolean) => {\n // console.error('checkAnimationContainer', div, visible);\n const players = animationIntersector.getAnimations(element);\n players.forEach((player) => {\n if(!visible) {\n animationIntersector.removeAnimation(player);\n } else {\n animationIntersector.checkAnimation(player, false);\n }\n });\n };\n\n private processVisible = async(element: HTMLElement) => {\n const docId = element.dataset.docId;\n const doc = await this.managers.appDocsManager.getDoc(docId);\n\n const size = mediaSizes.active.esgSticker.width;\n\n // console.log('processVisibleDiv:', element);\n\n const promise = wrapSticker({\n doc,\n div: element,\n width: size,\n height: size,\n lazyLoadQueue: null,\n group: this.group,\n onlyThumb: false,\n play: true,\n loop: true,\n withLock: true\n }).then(({render}) => render);\n\n promise.then(() => {\n // clearTimeout(timeout);\n this.checkAnimationContainer(element, this.lazyLoadQueue.intersector.isVisible(element));\n });\n\n /* let timeout = window.setTimeout(() => {\n console.error('processVisibleDiv timeout', div, doc);\n }, 1e3); */\n\n return promise;\n };\n\n public processInvisible = async(element: HTMLElement) => {\n const docId = element.dataset.docId;\n const doc = await this.managers.appDocsManager.getDoc(docId);\n\n // console.log('STICKER INvisible:', /* div, */docId);\n\n this.checkAnimationContainer(element, false);\n\n element.textContent = '';\n this.renderSticker(doc, element as HTMLDivElement);\n };\n}\n\nexport type StickersTabCategoryItem = {element: HTMLElement};\n\nexport class StickersTabCategory = {}> {\n public elements: {\n container: HTMLElement,\n title: HTMLElement,\n items: HTMLElement,\n menuTab: HTMLElement,\n menuTabPadding: HTMLElement\n } & AdditionalElements;\n public items: Item[];\n public mounted: boolean;\n public id: string;\n public limit: number;\n\n public getContainerSize: () => {width: number, height: number};\n private getElementMediaSize: () => MediaSize;\n\n private gapX: number;\n private gapY: number;\n\n public set?: StickerSet;\n public local?: boolean;\n public menuScroll?: ScrollableX;\n\n constructor(options: {\n id: string,\n title: HTMLElement | DocumentFragment,\n overflowElement: HTMLElement,\n getContainerSize: StickersTabCategory['getContainerSize'],\n getElementMediaSize: StickersTabCategory['getElementMediaSize'],\n gapX: number,\n gapY: number,\n noMenuTab?: boolean\n }) {\n const container = document.createElement('div');\n container.classList.add('emoji-category');\n\n const items = document.createElement('div');\n items.classList.add('category-items');\n\n let title: HTMLElement;\n if(options.title) {\n title = document.createElement('div');\n title.classList.add('category-title');\n title.append(options.title);\n }\n\n let menuTab: HTMLElement, menuTabPadding: HTMLElement;\n if(!options.noMenuTab) {\n menuTab = ButtonIcon(undefined, {noRipple: true});\n menuTab.classList.add('menu-horizontal-div-item');\n\n menuTabPadding = document.createElement('div');\n menuTabPadding.classList.add('menu-horizontal-div-item-padding');\n\n menuTab.append(menuTabPadding);\n }\n\n if(title) container.append(title);\n container.append(items);\n\n this.elements = {\n container,\n title,\n items,\n menuTab,\n menuTabPadding\n } as any;\n this.id = options.id;\n this.items = [];\n\n this.getContainerSize = options.getContainerSize;\n this.getElementMediaSize = options.getElementMediaSize;\n this.gapX = options.gapX ?? 0;\n this.gapY = options.gapY ?? 0;\n }\n\n public setCategoryItemsHeight() {\n const {width: containerWidth} = this.getContainerSize();\n const elementSize = this.getElementMediaSize().width;\n\n let itemsPerRow = containerWidth / elementSize;\n if(this.gapX) itemsPerRow -= Math.floor(itemsPerRow - 1) * this.gapX / elementSize;\n itemsPerRow = Math.floor(itemsPerRow);\n\n const rows = Math.ceil(this.items.length / itemsPerRow);\n let height = rows * elementSize;\n if(this.gapY) height += (rows - 1) * this.gapY;\n\n this.elements.items.style.minHeight = height + 'px';\n }\n}\n\nexport class EmoticonsTabC> implements EmoticonsTab {\n public content: HTMLElement;\n public menuScroll: ScrollableX;\n public container: HTMLElement;\n public menuWrapper: HTMLElement;\n public menu: HTMLElement;\n\n protected categories: {[id: string]: Category};\n protected categoriesMap: Map;\n protected categoriesByMenuTabMap: Map;\n protected categoriesIntersector: VisibilityIntersector;\n protected localCategories: Category[];\n\n protected listenerSetter: ListenerSetter;\n\n public scrollable: Scrollable;\n protected mounted = false;\n protected menuOnClickResult: ReturnType;\n\n public tabId: number;\n\n protected postponedEvents: {cb: AnyFunction, args: any[]}[];\n\n public getContainerSize: Category['getContainerSize'];\n\n constructor(\n protected managers: AppManagers,\n protected categoryItemsClassName: string,\n protected getElementMediaSize: () => MediaSize,\n protected padding: number,\n protected gapX: number,\n protected gapY: number\n ) {\n this.categories = {};\n this.categoriesMap = new Map();\n this.categoriesByMenuTabMap = new Map();\n this.localCategories = [];\n this.postponedEvents = [];\n\n this.listenerSetter = new ListenerSetter();\n\n this.container = document.createElement('div');\n this.container.classList.add('tabs-tab', 'emoticons-container');\n\n this.menuWrapper = document.createElement('div');\n this.menuWrapper.classList.add('menu-wrapper', 'emoticons-menu-wrapper');\n\n this.menu = document.createElement('nav');\n this.menu.className = 'menu-horizontal-div no-stripe justify-start emoticons-menu';\n\n this.menuWrapper.append(this.menu);\n this.menuScroll = new ScrollableX(this.menuWrapper);\n\n this.content = document.createElement('div');\n this.content.classList.add('emoticons-content');\n\n this.container.append(this.menuWrapper, this.content);\n\n this.scrollable = new Scrollable(this.content, 'STICKERS');\n }\n\n public getCategoryByContainer(container: HTMLElement) {\n return this.categoriesMap.get(container);\n }\n\n public getCategoryByMenuTab(menuTab: HTMLElement) {\n return this.categoriesByMenuTabMap.get(menuTab);\n }\n\n protected createCategory(stickerSet: StickerSet, title: HTMLElement | DocumentFragment, isLocal?: boolean, noMenuTab?: boolean) {\n const category: Category = new StickersTabCategory({\n id: '' + stickerSet.id,\n title,\n overflowElement: this.content,\n getContainerSize: () => {\n const {width, height} = this.getContainerSize?.() ?? this.content.getBoundingClientRect();\n return {width: width - this.padding, height};\n },\n getElementMediaSize: this.getElementMediaSize,\n gapX: this.gapX,\n gapY: this.gapY,\n noMenuTab\n }) as any;\n\n if(this.categoryItemsClassName) {\n category.elements.items.classList.add(this.categoryItemsClassName);\n }\n\n const container = category.elements.container;\n container.classList.add('hide');\n\n category.set = stickerSet;\n this.categories[stickerSet.id] = category;\n this.categoriesMap.set(container, category);\n !noMenuTab && this.categoriesByMenuTabMap.set(category.elements.menuTab, category);\n\n this.categoriesIntersector.observe(container);\n !noMenuTab && this.menuOnClickResult.stickyIntersector.observeStickyHeaderChanges(container);\n\n if(!isLocal) {\n !noMenuTab && category.elements.menuTab.classList.add('not-local');\n }\n\n return category;\n }\n\n protected positionCategory(category: Category, prepend?: boolean) {\n const {menuTab, container} = category.elements;\n const posItems = prepend ? this.localCategories.filter((category) => category.mounted).length : 0xFFFF;\n let foundMenuScroll = false;\n const posMenu = prepend ? this.localCategories.filter((category) => {\n if(category.menuScroll && !foundMenuScroll) {\n foundMenuScroll = true;\n return true;\n }\n\n return category.mounted && !category.menuScroll && category.elements.menuTab;\n }).length : 0xFFFF;\n positionElementByIndex(container, this.scrollable.container, posItems);\n positionElementByIndex(menuTab, this.menu, posMenu);\n }\n\n protected isCategoryVisible(category: Category) {\n return this.categoriesIntersector.getVisible().includes(category.elements.container);\n }\n\n protected toggleLocalCategory(category: Category, visible: boolean) {\n if(!visible) {\n category.elements.menuTab?.remove();\n category.elements.container.remove();\n } else {\n const idx = this.localCategories.indexOf(category);\n const sliced = this.localCategories.slice(0, idx);\n let notMountedItems = 0, notMountedMenus = 0;\n sliced.forEach((category) => {\n if(!category.mounted) {\n ++notMountedItems;\n ++notMountedMenus;\n } else if(!category.elements.menuTab || category.menuScroll) {\n ++notMountedMenus;\n }\n });\n const itemsIdx = idx - notMountedItems, menuIdx = idx - notMountedMenus;\n category.elements.menuTab && positionElementByIndex(category.elements.menuTab, this.menu, menuIdx);\n positionElementByIndex(category.elements.container, this.scrollable.container, itemsIdx);\n }\n\n category.mounted = visible;\n // category.elements.container.classList.toggle('hide', !visible);\n }\n\n protected createLocalCategory(id: string, title: LangPackKey | '', icon?: string, noMenuTab?: boolean) {\n const category = this.createCategory({id} as any, title && i18n(title), true, noMenuTab);\n category.local = true;\n this.localCategories.push(category);\n if(category.elements.title) {\n category.elements.title.classList.add('disable-hover');\n }\n\n if(!noMenuTab) {\n if(icon) {\n category.elements.menuTab.classList.add('tgico', 'tgico-' + icon);\n }\n\n category.elements.menuTabPadding.remove();\n }\n\n this.toggleLocalCategory(category, false);\n return category;\n }\n\n protected onLocalCategoryUpdate(category: Category) {\n category.setCategoryItemsHeight();\n this.toggleLocalCategory(category, !!category.items.length);\n }\n\n protected resizeCategories = () => {\n for(const [container, category] of this.categoriesMap) {\n category.setCategoryItemsHeight();\n }\n };\n\n protected deleteCategory(category: Category) {\n if(category) {\n category.elements.container.remove();\n category.elements.menuTab.remove();\n this.categoriesIntersector.unobserve(category.elements.container);\n delete this.categories[category.id];\n this.categoriesMap.delete(category.elements.container);\n this.categoriesByMenuTabMap.delete(category.elements.menuTab);\n\n return true;\n }\n\n return false;\n }\n\n protected spliceExceed(category: Category) {\n if(category.limit === undefined) {\n return false;\n }\n\n const {items, limit} = category;\n items.splice(limit, items.length - limit).forEach(({element}) => {\n element.remove();\n });\n\n this.onLocalCategoryUpdate(category);\n\n return true;\n }\n\n public init() {\n this.listenerSetter.add(emoticonsDropdown)('closed', () => {\n this.postponedEvents.forEach(({cb, args}) => {\n cb(...args);\n });\n\n this.postponedEvents.length = 0;\n });\n }\n\n public destroy() {\n this.getContainerSize = undefined;\n this.postponedEvents.length = 0;\n this.categoriesIntersector?.disconnect();\n this.listenerSetter.removeAll();\n this.scrollable.destroy();\n this.menuScroll?.destroy();\n this.menuOnClickResult?.stickyIntersector?.disconnect();\n }\n\n protected postponedEvent = (cb: (...args: K[]) => void) => {\n return (...args: K[]) => {\n if(emoticonsDropdown.isActive()) {\n this.postponedEvents.push({cb, args});\n } else {\n cb(...args);\n }\n };\n };\n}\n\ntype StickersTabItem = {element: HTMLElement, document: Document.document};\nexport default class StickersTab extends EmoticonsTabC> {\n private superStickerRenderer: SuperStickerRenderer;\n\n constructor(managers: AppManagers) {\n super(\n managers,\n 'super-stickers',\n () => mediaSizes.active.esgSticker,\n 3 * 2,\n 4,\n 4\n );\n\n this.container.classList.add('stickers-padding');\n this.content.id = 'content-stickers';\n }\n\n private setFavedLimit(limit: number) {\n const category = this.categories['faved'];\n category.limit = limit;\n }\n\n private categoryAppendStickers(\n category: StickersTabCategory,\n promise: Promise\n ) {\n const {container} = category.elements;\n\n promise.then((documents) => {\n const isVisible = this.isCategoryVisible(category);\n\n documents.forEach((document) => {\n const element = this.superStickerRenderer.renderSticker(document);\n category.items.push({document, element});\n\n if(isVisible) {\n category.elements.items.append(element);\n }\n });\n\n category.setCategoryItemsHeight();\n container.classList.remove('hide');\n });\n }\n\n private async renderStickerSet(set: StickerSet.stickerSet, prepend = false) {\n const category = this.createCategory(set, wrapEmojiText(set.title));\n const {menuTabPadding} = category.elements;\n\n const promise = this.managers.appStickersManager.getStickerSet(set);\n this.categoryAppendStickers(\n category,\n promise.then((stickerSet) => stickerSet.documents as MyDocument[])\n );\n\n this.positionCategory(category, prepend);\n\n wrapStickerSetThumb({\n set,\n container: menuTabPadding,\n group: EMOTICONSSTICKERGROUP,\n lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n width: 32,\n height: 32,\n autoplay: false\n });\n }\n\n private onCategoryVisibility = ({target, visible, entry}: OnVisibilityChangeItem) => {\n const category = this.categoriesMap.get(target);\n category.elements.items.replaceChildren(...(!visible ? [] : category.items.map(({element}) => element)));\n };\n\n public init() {\n super.init();\n\n this.scrollable.onAdditionalScroll = () => {\n this.setTyping();\n };\n\n /* stickersDiv.addEventListener('mouseover', (e) => {\n let target = e.target as HTMLElement;\n\n if(target.tagName === 'CANVAS') { // turn on sticker\n let animation = lottieLoader.getAnimation(target.parentElement, EMOTICONSSTICKERGROUP);\n\n if(animation) {\n // @ts-ignore\n if(animation.currentFrame === animation.totalFrames - 1) {\n animation.goToAndPlay(0, true);\n } else {\n animation.play();\n }\n }\n }\n }); */\n\n const intersectionOptions: IntersectionObserverInit = {root: emoticonsDropdown.getElement()};\n this.categoriesIntersector = new VisibilityIntersector(this.onCategoryVisibility, intersectionOptions);\n\n const clearCategoryItems = (category: StickersTabCategory) => {\n category.elements.items.replaceChildren();\n category.items.forEach(({element}) => this.superStickerRenderer.unobserveAnimated(element));\n category.items.length = 0;\n };\n\n this.scrollable.container.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n if(findUpClassName(target, 'category-title')) {\n const container = findUpClassName(target, 'emoji-category');\n const category = this.categoriesMap.get(container);\n if(category.local) {\n return;\n }\n\n new PopupStickers({id: category.set.id, access_hash: category.set.access_hash}).show();\n return;\n }\n\n EmoticonsDropdown.onMediaClick(e);\n });\n\n this.menuOnClickResult = EmoticonsDropdown.menuOnClick(this, this.menu, this.scrollable, this.menuScroll);\n\n const preloader = putPreloader(this.content, true);\n\n const onCategoryStickers = (category: StickersTabCategory, stickers: MyDocument[]) => {\n // if(category.id === 'faved' && category.limit && category.limit < stickers.length) {\n // category.limit = stickers.length;\n // }\n\n if(category.limit) {\n stickers = stickers.slice(0, category.limit);\n }\n\n const ids = new Set(stickers.map((doc) => doc.id));\n forEachReverse(category.items, (item) => {\n if(!ids.has(item.document.id)) {\n this.deleteSticker(category, item.document, true);\n }\n });\n\n this.toggleLocalCategory(category, !!stickers.length);\n forEachReverse(stickers, (doc, idx) => {\n this.unshiftSticker(category, doc, true, idx);\n });\n this.spliceExceed(category);\n category.elements.container.classList.remove('hide');\n };\n\n const favedCategory = this.createLocalCategory('faved', 'FavoriteStickers', 'savedmessages');\n // favedCategory.elements.menuTab.classList.add('active');\n\n const recentCategory = this.createLocalCategory('recent', 'Stickers.Recent', 'recent');\n recentCategory.limit = 20;\n\n const clearButton = ButtonIcon('close', {noRipple: true});\n recentCategory.elements.title.append(clearButton);\n attachClickEvent(clearButton, () => {\n confirmationPopup({\n titleLangKey: 'ClearRecentStickersAlertTitle',\n descriptionLangKey: 'ClearRecentStickersAlertMessage',\n button: {\n langKey: 'Clear'\n }\n }).then(() => {\n this.managers.appStickersManager.clearRecentStickers();\n }, noop);\n });\n\n const premiumCategory = this.createLocalCategory('premium', 'PremiumStickersShort');\n const s = document.createElement('span');\n s.classList.add('tgico-star', 'color-premium');\n premiumCategory.elements.menuTab.append(s);\n\n const promises = [\n Promise.all([\n this.managers.apiManager.getLimit('favedStickers'),\n this.managers.appStickersManager.getFavedStickersStickers()\n ]).then(([limit, stickers]) => {\n this.setFavedLimit(limit);\n onCategoryStickers(favedCategory, stickers);\n }),\n\n this.managers.appStickersManager.getRecentStickersStickers().then((stickers) => {\n onCategoryStickers(recentCategory, stickers);\n }),\n\n this.managers.appStickersManager.getAllStickers().then((res) => {\n for(const set of (res as MessagesAllStickers.messagesAllStickers).sets) {\n this.renderStickerSet(set);\n }\n }),\n\n this.managers.appStickersManager.getPremiumStickers().then((stickers) => {\n const length = stickers.length;\n this.toggleLocalCategory(premiumCategory, rootScope.premium && !!length);\n this.categoryAppendStickers(premiumCategory, Promise.resolve(stickers));\n\n rootScope.addEventListener('premium_toggle', (isPremium) => {\n this.toggleLocalCategory(this.categories['premium'], isPremium && !!length);\n });\n })\n ];\n\n Promise.race(promises).finally(() => {\n preloader.remove();\n });\n\n Promise.all(promises).finally(() => {\n this.mounted = true;\n this.setTyping();\n\n const favedCategory = this.categories['faved'];\n const recentCategory = this.categories['recent'];\n this.menuOnClickResult.setActive(favedCategory.items.length ? favedCategory : recentCategory);\n\n rootScope.addEventListener('stickers_installed', (set) => {\n if(!this.categories[set.id]) {\n this.renderStickerSet(set, true);\n }\n });\n });\n\n this.superStickerRenderer = new SuperStickerRenderer(EmoticonsDropdown.lazyLoadQueue, EMOTICONSSTICKERGROUP, this.managers, intersectionOptions);\n\n const rendererLazyLoadQueue = this.superStickerRenderer.lazyLoadQueue;\n emoticonsDropdown.addLazyLoadQueueRepeat(rendererLazyLoadQueue, this.superStickerRenderer.processInvisible);\n\n // emoticonsDropdown.addEventListener('close', () => {\n // this.categoriesIntersector.lock();\n // });\n\n // emoticonsDropdown.addEventListener('closed', () => {\n // for(const [container] of this.categoriesMap) {\n // onCategoryVisibility(container, false);\n // }\n // });\n\n // emoticonsDropdown.addEventListener('opened', () => {\n // this.categoriesIntersector.unlockAndRefresh();\n // });\n\n // setInterval(() => {\n // // @ts-ignore\n // const players = Object.values(lottieLoader.players).filter((p) => p.width >= 80);\n\n // console.log(\n // 'STICKERS RENDERED IN PANEL:',\n // players.length,\n // players.filter((p) => !p.paused).length,\n // rendererLazyLoadQueue.intersector.getVisible().length\n // );\n // }, .25e3);\n\n rootScope.addEventListener('sticker_updated', ({type, document, faved}) => {\n // if(type === 'faved') {\n // return;\n // }\n\n const category = this.categories[type === 'faved' ? 'faved' : 'recent'];\n if(category) {\n if(faved) {\n this.unshiftSticker(category, document);\n } else {\n this.deleteSticker(category, document);\n }\n }\n });\n\n rootScope.addEventListener('stickers_deleted', ({id}) => {\n const category = this.categories[id];\n if(this.deleteCategory(category)) {\n clearCategoryItems(category);\n }\n });\n\n rootScope.addEventListener('stickers_top', this.postponedEvent((id) => {\n const category = this.categories[id];\n if(category) {\n this.positionCategory(category, true);\n emoticonsDropdown.addEventListener('openAfterLayout', () => {\n this.menuOnClickResult.setActiveStatic(category);\n }, {once: true});\n }\n }));\n\n rootScope.addEventListener('stickers_updated', ({type, stickers}) => {\n const category = this.categories[type === 'faved' ? 'faved' : 'recent'];\n if(category) {\n onCategoryStickers(category, stickers);\n }\n });\n\n rootScope.addEventListener('app_config', () => {\n this.managers.apiManager.getLimit('favedStickers').then((limit) => {\n this.setFavedLimit(limit);\n });\n });\n\n mediaSizes.addEventListener('resize', this.resizeCategories);\n\n attachStickerViewerListeners({listenTo: this.content, listenerSetter: new ListenerSetter()});\n\n const type: IgnoreMouseOutType = 'menu';\n createStickersContextMenu({\n listenTo: this.content,\n verifyRecent: (target) => !!findUpAsChild(target, this.categories['recent'].elements.items),\n onOpen: () => {\n emoticonsDropdown.setIgnoreMouseOut(type, true);\n },\n onClose: () => {\n emoticonsDropdown.setIgnoreMouseOut(type, false);\n }\n });\n\n this.init = null;\n }\n\n public deleteSticker(category: StickersTabCategory, doc: MyDocument, batch?: boolean) {\n const item = findAndSplice(category.items, (item) => item.document.id === doc.id);\n if(item) {\n item.element.remove();\n\n if(!batch) {\n this.onLocalCategoryUpdate(category);\n }\n }\n }\n\n public unshiftSticker(category: StickersTabCategory, doc: MyDocument, batch?: boolean, idx?: number) {\n if(idx !== undefined) {\n const i = category.items[idx];\n if(i && i.document.id === doc.id) {\n return;\n }\n }\n\n let item = findAndSplice(category.items, (item) => item.document.id === doc.id);\n if(!item) {\n item = {\n element: this.superStickerRenderer.renderSticker(doc),\n document: doc\n };\n }\n\n category.items.unshift(item);\n category.elements.items.prepend(item.element);\n\n if(!batch) {\n this.spliceExceed(category);\n }\n }\n\n public unshiftRecentSticker(doc: MyDocument) {\n this.managers.appStickersManager.saveRecentSticker(doc.id);\n }\n\n public deleteRecentSticker(doc: MyDocument) {\n this.managers.appStickersManager.saveRecentSticker(doc.id, true);\n }\n\n public setTyping = (cancel = false) => {\n if(!cancel && (!emoticonsDropdown.isActive() || emoticonsDropdown.tab !== this)) {\n return;\n }\n\n rootScope.dispatchEvent('choosing_sticker', !cancel);\n };\n\n public onClosed() {\n this.setTyping(true);\n }\n\n public onOpened() {\n this.setTyping();\n this.resizeCategories();\n }\n}\n","export const generateDelimiter = () => {\n const delimiter = document.createElement('div');\n delimiter.classList.add('gradient-delimiter');\n return delimiter;\n};\n","import {_i18n} from '../lib/langPack';\n\nexport default function generateFakeIcon(isScam?: boolean) {\n const span = document.createElement('span');\n span.classList.add('badge-fake');\n _i18n(span, isScam ? 'ScamMessage' : 'FakeMessage');\n return span;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport VisibilityIntersector, {OnVisibilityChange} from './visibilityIntersector';\n\nexport default class LazyLoadQueueRepeat2 extends LazyLoadQueueIntersector {\n constructor(parallelLimit?: number, protected onVisibilityChange?: OnVisibilityChange) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector((item) => {\n const {target, visible} = item;\n const spliced = findAndSpliceAll(this.queue, (i) => i.div === target);\n if(visible && spliced.length) {\n spliced.forEach((item) => {\n this.queue.unshift(item);\n });\n }\n\n this.onVisibilityChange && this.onVisibilityChange(item);\n this.setProcessQueueTimeout();\n });\n }\n\n public observe(el: LazyLoadElement) {\n super.observe(el);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport animationIntersector, {AnimationItemGroup} from './animationIntersector';\nimport Scrollable from './scrollable';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport calcImageInBox from '../helpers/calcImageInBox';\nimport {doubleRaf} from '../helpers/schedulers';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport rootScope from '../lib/rootScope';\nimport LazyLoadQueueRepeat2 from './lazyLoadQueueRepeat2';\nimport wrapVideo from './wrappers/video';\nimport noop from '../helpers/noop';\n\nconst width = 400;\nconst maxSingleWidth = width - 100;\nconst height = 100;\n\nexport default class GifsMasonry {\n public lazyLoadQueue: LazyLoadQueueRepeat2;\n private scrollPromise: CancellablePromise = Promise.resolve();\n private timeout: number = 0;\n private managers: AppManagers;\n\n constructor(\n private element: HTMLElement,\n private group: AnimationItemGroup,\n private scrollable: Scrollable,\n attach = true\n ) {\n this.managers = rootScope.managers;\n\n this.lazyLoadQueue = new LazyLoadQueueRepeat2(undefined, ({target, visible}) => {\n if(visible) {\n this.processVisibleDiv(target);\n } else {\n this.processInvisibleDiv(target);\n }\n });\n\n /* setInterval(() => {\n // @ts-ignore\n const players = animationIntersector.byGroups[group];\n\n if(players) {\n console.log(`GIFS RENDERED IN ${group}:`, players.length, players.filter((p) => !p.animation.paused).length, this.lazyLoadQueue.intersector.getVisible().length);\n }\n }, .25e3); */\n\n if(attach) {\n this.attach();\n }\n }\n\n private onScroll = () => {\n if(this.timeout) {\n clearTimeout(this.timeout);\n } else {\n this.scrollPromise = deferredPromise();\n // animationIntersector.checkAnimations(true, group);\n }\n\n this.timeout = window.setTimeout(() => {\n this.timeout = 0;\n this.scrollPromise.resolve();\n // animationIntersector.checkAnimations(false, group);\n }, 150);\n };\n\n public attach() {\n this.scrollable.container.addEventListener('scroll', this.onScroll);\n }\n\n public detach() {\n this.clear();\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\n }\n\n public clear() {\n this.lazyLoadQueue.clear();\n }\n\n private processVisibleDiv(div: HTMLElement) {\n const video = div.querySelector('video');\n if(video) {\n return;\n }\n\n const load = () => {\n const docId = div.dataset.docId;\n const promise = Promise.all([this.managers.appDocsManager.getDoc(docId), this.scrollPromise]).then(async([doc]) => {\n const res = await wrapVideo({\n doc,\n container: div as HTMLDivElement,\n lazyLoadQueue: null,\n // lazyLoadQueue: EmoticonsDropdown.lazyLoadQueue,\n group: this.group,\n noInfo: true,\n noPreview: true\n });\n\n const promise = res.loadPromise;\n promise.finally(() => {\n const video = div.querySelector('video');\n const thumb = div.querySelector('img, canvas');\n\n // div.style.opacity = '';\n thumb && thumb.classList.add('hide');\n\n if(video && !video.parentElement) {\n setTimeout(() => {\n video.src = '';\n video.load();\n const animations = animationIntersector.getAnimations(video);\n animations.forEach((item) => {\n animationIntersector.removeAnimation(item);\n });\n }, 0);\n }\n\n // clearTimeout(timeout);\n if(!this.lazyLoadQueue.intersector.isVisible(div)) {\n this.processInvisibleDiv(div);\n }\n });\n\n return promise;\n });\n\n /* let timeout = window.setTimeout(() => {\n console.error('processVisibleDiv timeout', div, doc);\n }, 1e3); */\n\n return promise;\n };\n\n // return load();\n\n this.lazyLoadQueue.push({div, load});\n }\n\n public processInvisibleDiv = (div: HTMLElement) => {\n return this.scrollPromise.then(async() => {\n // return;\n\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\n return;\n }\n\n const video = div.querySelector('video');\n const thumb = div.querySelector('img, canvas');\n\n if(thumb) {\n thumb.classList.remove('hide');\n\n await doubleRaf();\n }\n\n if(this.lazyLoadQueue.intersector.isVisible(div)) {\n return;\n }\n\n if(video) {\n video.remove();\n video.src = '';\n video.load();\n const animations = animationIntersector.getAnimations(video);\n animations.forEach((item) => {\n animationIntersector.removeAnimation(item);\n });\n }\n });\n };\n\n public add(doc: MyDocument, appendTo = this.element) {\n // let gifWidth = doc.w;\n // let gifHeight = doc.h;\n // if(gifHeight < height) {\n // gifWidth = height / gifHeight * gifWidth;\n // gifHeight = height;\n // }\n\n // const willUseWidth = Math.min(maxSingleWidth, width, gifWidth);\n // const size = calcImageInBox(gifWidth, gifHeight, willUseWidth, height);\n\n const div = document.createElement('div');\n div.classList.add('gif', 'grid-item'/* , 'fade-in-transition' */);\n // div.style.width = size.width + 'px';\n // div.style.opacity = '0';\n // div.style.height = h + 'px';\n div.dataset.docId = '' + doc.id;\n\n appendTo.append(div);\n\n this.lazyLoadQueue.observe({div, load: noop as any});\n\n // let preloader = new ProgressivePreloader(div);\n\n wrapVideo({\n doc,\n container: div as HTMLDivElement,\n lazyLoadQueue: null,\n noInfo: true,\n onlyPreview: true\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport TransitionSlider from './transition';\nimport {ScrollableX} from './scrollable';\nimport rootScope from '../lib/rootScope';\nimport {fastRaf} from '../helpers/schedulers';\nimport {FocusDirection} from '../helpers/fastSmoothScroll';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport whichChild from '../helpers/dom/whichChild';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\n\nexport function horizontalMenu(\n tabs: HTMLElement,\n content: HTMLElement,\n onClick?: (id: number, tabContent: HTMLDivElement, animate: boolean) => void | boolean | Promise,\n onTransitionEnd?: () => void,\n transitionTime = 200,\n scrollableX?: ScrollableX,\n listenerSetter?: ListenerSetter\n) {\n const selectTab = TransitionSlider({\n content,\n type: tabs || content.dataset.animation === 'tabs' ? 'tabs' : 'navigation',\n transitionTime,\n onTransitionEnd,\n listenerSetter\n });\n\n if(!tabs) {\n return selectTab;\n }\n\n const proxy = new Proxy(selectTab, {\n apply: (target, that, args) => {\n const id = +args[0];\n const animate = args[1] !== undefined ? args[1] : true;\n\n const el = (tabs.querySelector(`[data-tab=\"${id}\"]`) || tabs.children[id]) as HTMLElement;\n selectTarget(el, id, animate);\n }\n });\n\n const selectTarget = async(target: HTMLElement, id: number, animate = true) => {\n const tabContent = content.children[id] as HTMLDivElement;\n\n if(onClick) {\n const result1 = onClick(id, tabContent, animate);\n const canChange = result1 instanceof Promise ? await result1 : result1;\n if(canChange !== undefined && !canChange) {\n return;\n }\n }\n\n if(scrollableX) {\n scrollableX.scrollIntoViewNew({\n element: target.parentElement.children[id] as HTMLElement,\n position: 'center',\n forceDirection: animate ? undefined : FocusDirection.Static,\n forceDuration: transitionTime,\n axis: 'x'\n });\n }\n\n if(!rootScope.settings.animationsEnabled) {\n animate = false;\n }\n\n const prevId = selectTab.prevId();\n if(target.classList.contains('active') || id === prevId) {\n return false;\n }\n\n const mutateCallback = animate ? fastRaf : (cb: () => void) => cb();\n\n const prev = tabs.querySelector(tagName.toLowerCase() + '.active') as HTMLElement;\n if(prev) {\n mutateCallback(() => {\n prev.classList.remove('active');\n });\n }\n\n // a great stripe from Jolly Cobra\n if(useStripe && prevId !== -1 && animate) {\n mutateCallback(() => {\n const indicator = target.querySelector('i')!;\n const currentIndicator = target.parentElement.children[prevId].querySelector('i')!;\n\n currentIndicator.classList.remove('animate');\n indicator.classList.remove('animate');\n\n // We move and resize our indicator so it repeats the position and size of the previous one.\n const shiftLeft = currentIndicator.parentElement.parentElement.offsetLeft - indicator.parentElement.parentElement.offsetLeft;\n const scaleFactor = currentIndicator.clientWidth / indicator.clientWidth;\n indicator.style.transform = `translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`;\n\n // console.log(`translate3d(${shiftLeft}px, 0, 0) scale3d(${scaleFactor}, 1, 1)`);\n\n fastRaf(() => {\n // Now we remove the transform to let it animate to its own position and size.\n indicator.classList.add('animate');\n indicator.style.transform = 'none';\n });\n });\n }\n\n mutateCallback(() => {\n target.classList.add('active');\n });\n\n selectTab(id, animate);\n };\n\n const useStripe = !tabs.classList.contains('no-stripe');\n\n // const tagName = tabs.classList.contains('menu-horizontal-div') ? 'BUTTON' : 'LI';\n const tagName = tabs.firstElementChild.tagName;\n attachClickEvent(tabs, (e) => {\n let target = e.target as HTMLElement;\n\n target = findUpAsChild(target, tabs);\n\n // console.log('tabs click:', target);\n\n if(!target) return false;\n\n let id: number;\n if(target.dataset.tab) {\n id = +target.dataset.tab;\n if(id === -1) {\n return false;\n }\n } else {\n id = whichChild(target);\n }\n\n selectTarget(target, id);\n }, {listenerSetter});\n\n return proxy;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport simulateEvent from '../helpers/dom/dispatchEvent';\nimport documentFragmentToHTML from '../helpers/dom/documentFragmentToHTML';\nimport findUpAttribute from '../helpers/dom/findUpAttribute';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport getCaretPosNew from '../helpers/dom/getCaretPosNew';\nimport getRichValueWithCaret from '../helpers/dom/getRichValueWithCaret';\nimport isInputEmpty from '../helpers/dom/isInputEmpty';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport RichInputHandler, {USING_BOMS} from '../helpers/dom/richInputHandler';\nimport selectElementContents from '../helpers/dom/selectElementContents';\nimport setInnerHTML, {setDirection} from '../helpers/dom/setInnerHTML';\nimport {MessageEntity} from '../layer';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport mergeEntities from '../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../lib/richTextProcessor/parseEntities';\nimport wrapDraftText from '../lib/richTextProcessor/wrapDraftText';\nimport {createCustomFiller, CustomEmojiElement, CustomEmojiRendererElement, insertCustomFillers, renderEmojis} from '../lib/richTextProcessor/wrapRichText';\n\nexport async function insertRichTextAsHTML(input: HTMLElement, text: string, entities: MessageEntity[], wrappingForPeerId: PeerId) {\n const loadPromises: Promise[] = [];\n const wrappingCustomEmoji = entities?.some((entity) => entity._ === 'messageEntityCustomEmoji');\n const renderer = wrappingCustomEmoji ? createCustomEmojiRendererForInput() : undefined;\n const fragment = wrapDraftText(text, {entities, wrappingForPeerId, loadPromises, customEmojiRenderer: renderer});\n const something = fragment.querySelectorAll('[contenteditable=\"false\"]');\n something.forEach((el) => {\n el.contentEditable = 'inherit';\n el.classList.add('pc');\n });\n\n loadPromises.length && await Promise.all(loadPromises);\n\n fragment.querySelectorAll('.input-selectable').forEach((el) => {\n el.prepend(createCustomFiller(true));\n });\n\n const richInputHandler = USING_BOMS ? RichInputHandler.getInstance() : undefined;\n // const restore = richInputHandler.prepareApplyingMarkdown();\n\n // fragment.querySelectorAll('.input-filler').forEach((el) => el.remove());\n\n // const fillers = Array.from(input.querySelectorAll('.input-filler')).map((el) => {\n // el.contentEditable = 'false';\n // return el;\n // });\n\n const customEmojiElements = Array.from(fragment.querySelectorAll('.custom-emoji-placeholder')).map((el) => {\n el.dataset.ces = '1';\n return (el as any).customEmojiElement as CustomEmojiElement;\n });\n\n const html = documentFragmentToHTML(fragment);\n renderer?.destroy();\n\n // console.log(html);\n\n const pre = getCaretPosNew(input);\n // console.log('pre', pre);\n let textNode: ChildNode, textNodeValue: string;\n if(pre.node) {\n // if(pre.node?.nodeValue === BOM && false) {\n // textNode = document.createTextNode(textNodeValue = BOM);\n // (pre.node.parentNode as any as ChildNode).after(textNode);\n // pre.selection.modify('extend', 'forward', 'character');\n // pre.selection.collapseToEnd();\n // }\n } else {\n const range = document.createRange();\n let node = input.lastChild;\n if(!node) {\n input.append(node /* = textNode */ = document.createTextNode(''));\n }\n\n range.setStartAfter(node);\n range.collapse(true);\n pre.selection.removeAllRanges();\n pre.selection.addRange(range);\n }\n\n // const fragmentLastChild = fragment.lastChild;\n\n // const s = document.createElement('span');\n // (node as ChildNode).replaceWith(s);\n // s.append(node);\n input.addEventListener('input', cancelEvent, {capture: true, once: true});\n richInputHandler?.onBeforeInput({inputType: 'insertContent'});\n window.document.execCommand('insertHTML', false, html);\n Array.from(input.querySelectorAll('[data-ces]')).forEach((el, idx) => {\n delete el.dataset.ces;\n const customEmojiElement = customEmojiElements[idx];\n (el as any).customEmojiElement = customEmojiElement;\n customEmojiElement.placeholder = el;\n });\n // fillers.forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n input.querySelectorAll('.pc').forEach((el) => {\n el.contentEditable = 'false';\n });\n if(textNode) {\n const {nodeValue} = textNode;\n if(nodeValue === textNodeValue) {\n textNode.remove();\n } else {\n (textNode as CharacterData).replaceData(nodeValue.indexOf(textNodeValue), textNodeValue.length, '');\n }\n }\n // restore();\n richInputHandler?.removeExtraBOMs(input);\n simulateEvent(input, 'input');\n\n // if(textNode) {\n // const selection = document.getSelection();\n // const node = fragmentLastChild.nextSibling || fragmentLastChild;\n // const range = document.createRange();\n // range.setStartAfter(node);\n // range.collapse(true);\n // selection.removeAllRanges();\n // selection.addRange(range);\n // }\n\n // const after = getCaretPosNew(input);\n // console.log('after', after);\n // if(after.node?.nodeValue === BOM) {\n // const smth = findUpClassName(after.node.parentElement, 'input-something');\n // if(smth) {\n // const selection = document.getSelection();\n // const node = smth.nextSibling;\n // const range = document.createRange();\n // range.setStartAfter(node);\n // range.collapse(true);\n // selection.removeAllRanges();\n // selection.addRange(range);\n\n // // if(after.offset === 0) after.selection.modify('extend', 'forward', 'character');\n // // after.selection.modify('extend', 'forward', 'character');\n // // after.selection.collapseToEnd();\n // }\n // }\n\n // setCaretAt(fragmentLastChild.nextSibling);\n\n // console.log('ASD');\n}\n\nlet init = () => {\n document.addEventListener('paste', (e) => {\n const input = findUpAttribute(e.target, 'contenteditable=\"true\"');\n if(!input) {\n return;\n }\n\n const noLinebreaks = !!input.dataset.noLinebreaks;\n e.preventDefault();\n let text: string, entities: MessageEntity[];\n\n // @ts-ignore\n let plainText: string = (e.originalEvent || e).clipboardData.getData('text/plain');\n let usePlainText = true;\n\n // @ts-ignore\n let html: string = (e.originalEvent || e).clipboardData.getData('text/html');\n\n const filterEntity = (e: MessageEntity) => e._ === 'messageEntityEmoji' || (e._ === 'messageEntityLinebreak' && !noLinebreaks);\n if(noLinebreaks) {\n const regExp = /[\\r\\n]/g;\n plainText = plainText.replace(regExp, '');\n html = html.replace(regExp, '');\n }\n\n const peerId = (input.dataset.peerId || NULL_PEER_ID).toPeerId();\n if(html.trim()) {\n // console.log(html.replace(/ (style|class|id)=\".+?\"/g, ''));\n\n html = html.replace(//, '');\n html = html.replace(//, '');\n html = html.replace('
', '');\n\n const match = html.match(/([\\s\\S]*)<\\/body>/);\n if(match) {\n html = match[1].trim();\n }\n\n // const s = cleanHTML(html, true) as NodeList;\n // console.log(s);\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const span = doc.body || document.createElement('body');\n\n // const span: HTMLElement = document.createElement('span');\n // span.innerHTML = html;\n // span.append(...Array.from(s));\n\n let curChild = span.firstChild;\n while(curChild) { // * fix whitespace between elements like

asd

\\n

zxc

\n const nextSibling = curChild.nextSibling;\n if(curChild.nodeType === curChild.TEXT_NODE) {\n if(!curChild.nodeValue.trim()) {\n curChild.remove();\n }\n }\n\n curChild = nextSibling;\n }\n\n const richValue = getRichValueWithCaret(span, true, false);\n\n const canWrapCustomEmojis = !!peerId;\n if(!canWrapCustomEmojis) {\n richValue.entities = richValue.entities.filter((entity) => entity._ !== 'messageEntityCustomEmoji');\n }\n\n { // * fix extra new lines appearing from

(can have them from some sources, like macOS Terminal)\n const lines = richValue.value.split('\\n');\n let textLength = 0;\n for(let i = 0; i < lines.length; ++i) {\n const line = lines[i];\n textLength += line.length;\n const index = textLength;\n if(plainText[index] !== '\\n' && i !== (lines.length - 1)) {\n lines[i] = line + lines.splice(i + 1, 1)[0];\n }\n textLength += 1;\n }\n\n const correctedText = lines.join('\\n');\n richValue.value = correctedText;\n }\n\n const richTextLength = richValue.value.replace(/\\s/g, '').length;\n const plainTextLength = plainText.replace(/\\s/g, '').length;\n if(richTextLength === plainTextLength ||\n richValue.entities.find((entity) => entity._ === 'messageEntityCustomEmoji')) {\n text = richValue.value;\n entities = richValue.entities;\n usePlainText = false;\n\n let entities2 = parseEntities(text);\n entities2 = entities2.filter(filterEntity);\n mergeEntities(entities, entities2);\n }\n }\n\n if(usePlainText) {\n text = plainText;\n entities = parseEntities(text);\n entities = entities.filter(filterEntity);\n }\n\n insertRichTextAsHTML(input, text, entities, peerId);\n });\n\n init = null;\n};\n\n// ! it doesn't respect symbols other than strongs\n/* const checkAndSetRTL = (input: HTMLElement) => {\n //const isEmpty = isInputEmpty(input);\n //console.log('input', isEmpty);\n\n //const char = [...getRichValue(input)][0];\n const char = (input instanceof HTMLInputElement ? input.value : input.innerText)[0];\n let direction = 'ltr';\n if(char && checkRTL(char)) {\n direction = 'rtl';\n }\n\n //console.log('RTL', direction, char);\n\n input.style.direction = direction;\n}; */\n\nexport enum InputState {\n Neutral = 0,\n Valid = 1,\n Error = 2\n};\n\nexport type InputFieldOptions = {\n placeholder?: LangPackKey,\n label?: LangPackKey,\n labelOptions?: any[],\n labelText?: string | DocumentFragment,\n name?: string,\n maxLength?: number,\n showLengthOn?: number,\n plainText?: true,\n required?: boolean,\n canBeEdited?: boolean,\n validate?: () => boolean,\n inputMode?: 'tel' | 'numeric',\n withLinebreaks?: boolean,\n autocomplete?: string\n};\n\nfunction createCustomEmojiRendererForInput() {\n const renderer = CustomEmojiRendererElement.create({\n wrappingDraft: true,\n isSelectable: true\n });\n return renderer;\n}\n\nfunction processCustomEmojisInInput(input: HTMLElement) {\n const customEmojiElements = Array.from(input.querySelectorAll('.custom-emoji, .custom-emoji-placeholder'));\n let renderer = input.querySelector('.custom-emoji-renderer');\n if(!renderer && customEmojiElements.length) {\n renderer = createCustomEmojiRendererForInput();\n input.prepend(renderer);\n } else if(renderer && !customEmojiElements.length) {\n renderer.remove();\n return;\n }\n\n if(!renderer) {\n return;\n }\n\n const customEmojis: Parameters[0] = new Map();\n customEmojiElements.forEach((element) => {\n const customEmojiElement = element instanceof CustomEmojiElement ? element : (element as any).customEmojiElement as CustomEmojiElement;\n const {docId} = customEmojiElement;\n let set = customEmojis.get(docId);\n if(!set) {\n customEmojis.set(docId, set = new Set());\n }\n\n set.add(customEmojiElement);\n });\n\n for(const [docId, customEmojiElements] of customEmojis) {\n let hasSet = renderer.customEmojis.get(docId);\n if(hasSet) {\n for(const customEmojiElement of hasSet) {\n if(!customEmojiElements.has(customEmojiElement)) {\n customEmojiElement.destroy();\n }\n }\n } else {\n hasSet = new Set();\n }\n\n for(const customEmojiElement of customEmojiElements) {\n if(!hasSet.has(customEmojiElement)) {\n customEmojiElement.connectedCallback();\n }\n }\n }\n\n renderer.add(customEmojis, false);\n renderer.forceRender();\n}\n\nexport default class InputField {\n public container: HTMLElement;\n public input: HTMLElement;\n public label: HTMLLabelElement;\n\n public originalValue: string;\n\n public required: boolean;\n public validate: () => boolean;\n\n constructor(public options: InputFieldOptions = {}) {\n this.container = document.createElement('div');\n this.container.classList.add('input-field');\n\n this.required = options.required;\n this.validate = options.validate;\n\n if(options.maxLength !== undefined && options.showLengthOn === undefined) {\n options.showLengthOn = Math.min(40, Math.round(options.maxLength / 3));\n }\n\n const {placeholder, maxLength, showLengthOn, name, plainText, canBeEdited = true, autocomplete} = options;\n const label = options.label || options.labelText;\n\n const onInputCallbacks: Array<() => void> = [];\n let input: HTMLElement;\n if(!plainText) {\n if(init) {\n init();\n }\n\n this.container.innerHTML = `

`;\n\n input = this.container.firstElementChild as HTMLElement;\n input.contentEditable = '' + !!canBeEdited;\n // const observer = new MutationObserver(() => {\n // //checkAndSetRTL(input);\n\n // if(processInput) {\n // processInput();\n // }\n // });\n\n RichInputHandler.getInstance();\n\n input.addEventListener('mousedown', (e) => {\n const selection = document.getSelection();\n if(!selection.isCollapsed) {\n return;\n }\n\n const placeholder = findUpTag(e.target, 'IMG');\n if(!placeholder) {\n return;\n }\n\n const rect = placeholder.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const focusOnNext = e.clientX >= centerX;\n\n const range = document.createRange();\n range.setStartAfter(focusOnNext ? placeholder : placeholder.previousSibling ?? placeholder);\n selection.removeAllRanges();\n selection.addRange(range);\n });\n\n onInputCallbacks.push(() => {\n // console.log('input');\n // return;\n // * because if delete all characters there will br left\n if(isInputEmpty(input)) {\n // const textNode = Array.from(input.childNodes).find((node) => node.nodeType === node.TEXT_NODE) || document.createTextNode('');\n input.replaceChildren();\n // input.append(document.createTextNode('')); // need first text node to support history stack\n }\n\n // const fillers = Array.from(input.querySelectorAll('.emoji-filler')) as HTMLElement[];\n // fillers.forEach((filler) => {\n // const textContent = filler.textContent;\n // if(textContent === BOM) {\n // return;\n // }\n\n // if(textContent) {\n\n // } else {\n // let curChild = filler.firstChild;\n // while(curChild) {\n // curChild = curChild.nextSibling;\n // }\n // }\n\n // filler.classList.remove('emoji-filler');\n // });\n\n // Array.from(input.querySelectorAll('br, span:empty')).forEach((el) => {\n // const parentElement = el.parentElement;\n // (parentElement === input ? el : parentElement).remove();\n // });\n USING_BOMS && Array.from(input.querySelectorAll('br:not(.br-not-br)')).forEach((el) => {\n // const parentElement = el.parentElement;\n el.remove();\n // if(!parentElement.children.length && !parentElement.textContent) {\n // parentElement.textContent = '';\n // }\n });\n\n insertCustomFillers(Array.from(input.querySelectorAll('.input-something')));\n\n processCustomEmojisInInput(input);\n\n // .forEach((el) => el.remove());\n });\n\n // ! childList for paste first symbol\n // observer.observe(input, {characterData: true, childList: true, subtree: true});\n } else {\n this.container.innerHTML = `\n \n `;\n\n input = this.container.firstElementChild as HTMLElement;\n // input.addEventListener('input', () => checkAndSetRTL(input));\n }\n\n setDirection(input);\n\n if(options.inputMode) {\n input.inputMode = options.inputMode;\n }\n\n if(placeholder) {\n _i18n(input, placeholder, undefined, 'placeholder');\n }\n\n if(label || placeholder) {\n const border = document.createElement('div');\n border.classList.add('input-field-border');\n this.container.append(border);\n }\n\n if(label) {\n this.label = document.createElement('label');\n this.setLabel();\n this.container.append(this.label);\n }\n\n if(maxLength) {\n const labelEl = this.container.lastElementChild as HTMLLabelElement;\n let showingLength = false;\n\n const onInput = () => {\n const wasError = input.classList.contains('error');\n // * https://stackoverflow.com/a/54369605 #2 to count emoji as 1 symbol\n const inputLength = plainText ? (input as HTMLInputElement).value.length : [...getRichValueWithCaret(input, false, false).value].length;\n const diff = maxLength - inputLength;\n const isError = diff < 0;\n input.classList.toggle('error', isError);\n\n // this.onLengthChange && this.onLengthChange(inputLength, isError);\n\n if(isError || diff <= showLengthOn) {\n this.setLabel();\n labelEl.append(` (${maxLength - inputLength})`);\n if(!showingLength) showingLength = true;\n } else if((wasError && !isError) || showingLength) {\n this.setLabel();\n showingLength = false;\n }\n };\n\n onInputCallbacks.push(onInput);\n }\n\n const noLinebreaks = !options.withLinebreaks;\n if(noLinebreaks && !plainText) {\n input.dataset.noLinebreaks = '1';\n input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n e.preventDefault();\n return false;\n }\n });\n }\n\n if(onInputCallbacks.length) {\n input.addEventListener('input', () => {\n onInputCallbacks.forEach((callback) => callback());\n });\n }\n\n this.input = input;\n }\n\n public select() {\n if(!this.value) { // * avoid selecting whole empty field on iOS devices\n return;\n }\n\n if(this.options.plainText) {\n (this.input as HTMLInputElement).select(); // * select text\n } else {\n selectElementContents(this.input);\n }\n }\n\n public setLabel() {\n this.label.textContent = '';\n if(this.options.labelText) {\n setInnerHTML(this.label, this.options.labelText);\n } else {\n this.label.append(i18n(this.options.label, this.options.labelOptions));\n }\n }\n\n get value(): string {\n return this.options.plainText ? (this.input as HTMLInputElement).value : getRichValueWithCaret(this.input, false, false).value;\n // return getRichValue(this.input);\n }\n\n set value(value: Parameters[1]) {\n this.setValueSilently(value, true);\n this.simulateInputEvent();\n }\n\n public simulateInputEvent() {\n simulateEvent(this.input, 'input');\n }\n\n public setValueSilently(value: Parameters[1], fromSet?: boolean) {\n if(this.options.plainText) {\n (this.input as HTMLInputElement).value = value as string;\n } else {\n replaceContent(this.input, value);\n processCustomEmojisInInput(this.input);\n }\n }\n\n public isChanged() {\n return this.value !== this.originalValue;\n }\n\n public isValid() {\n return !this.input.classList.contains('error') &&\n (!this.validate || this.validate()) &&\n (!this.required || !isInputEmpty(this.input));\n }\n\n public isValidToChange() {\n return this.isValid() && this.isChanged();\n }\n\n public setDraftValue(value = '', silent?: boolean) {\n if(!this.options.plainText) {\n value = documentFragmentToHTML(wrapDraftText(value));\n }\n\n if(silent) {\n this.setValueSilently(value, false);\n } else {\n this.value = value;\n }\n }\n\n public setOriginalValue(value: InputField['originalValue'] = '', silent?: boolean) {\n this.originalValue = value;\n this.setDraftValue(value, silent);\n }\n\n public setState(state: InputState, label?: LangPackKey) {\n if(label) {\n this.label.textContent = '';\n this.label.append(i18n(label, this.options.labelOptions));\n } else {\n this.setLabel();\n }\n\n this.input.classList.toggle('error', !!(state & InputState.Error));\n this.input.classList.toggle('valid', !!(state & InputState.Valid));\n }\n\n public setError(label?: LangPackKey) {\n this.setState(InputState.Error, label);\n }\n}\n","// https://stackoverflow.com/a/6150060\nexport default function selectElementContents(el: HTMLElement) {\n const range = document.createRange();\n range.selectNodeContents(el);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { getRichValue } from \"../helpers/dom\";\nimport {LangPackKey} from '../lib/langPack';\nimport InputField from './inputField';\n\nexport default class InputSearch {\n public container: HTMLElement;\n public input: HTMLElement;\n public inputField: InputField;\n public clearBtn: HTMLElement;\n\n public prevValue = '';\n public timeout = 0;\n public onChange: (value: string) => void;\n public onClear: () => void;\n\n constructor(placeholder: LangPackKey, onChange?: (value: string) => void) {\n this.inputField = new InputField({\n placeholder,\n plainText: true\n });\n\n this.container = this.inputField.container;\n this.container.classList.remove('input-field');\n this.container.classList.add('input-search');\n\n this.onChange = onChange;\n\n this.input = this.inputField.input;\n this.input.classList.add('input-search-input');\n\n const searchIcon = document.createElement('i');\n searchIcon.classList.add('tgico', 'tgico-search');\n\n this.clearBtn = document.createElement('i');\n this.clearBtn.classList.add('tgico', 'btn-icon', 'tgico-close');\n\n this.input.addEventListener('input', this.onInput);\n this.clearBtn.addEventListener('click', this.onClearClick);\n\n this.container.append(searchIcon, this.clearBtn);\n }\n\n onInput = () => {\n if(!this.onChange) return;\n\n const value = this.value;\n\n // this.input.classList.toggle('is-empty', !value.trim());\n\n if(value !== this.prevValue) {\n this.prevValue = value;\n clearTimeout(this.timeout);\n this.timeout = window.setTimeout(() => {\n this.onChange(value);\n }, 200);\n }\n };\n\n onClearClick = () => {\n this.value = '';\n this.onChange && this.onChange('');\n this.onClear && this.onClear();\n };\n\n get value() {\n return this.inputField.value;\n }\n\n set value(value: string) {\n this.prevValue = value;\n clearTimeout(this.timeout);\n this.inputField.value = value;\n }\n\n public remove() {\n clearTimeout(this.timeout);\n this.input.removeEventListener('input', this.onInput);\n this.clearBtn.removeEventListener('click', this.onClearClick);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport VisibilityIntersector, {OnVisibilityChangeItem} from './visibilityIntersector';\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport LazyLoadQueueIntersector, {LazyLoadElement} from './lazyLoadQueueIntersector';\nimport useHeavyAnimationCheck from '../hooks/useHeavyAnimationCheck';\n\nexport default class LazyLoadQueue extends LazyLoadQueueIntersector {\n constructor(parallelLimit?: number, ignoreHeavyAnimation?: boolean) {\n super(parallelLimit);\n\n this.intersector = new VisibilityIntersector(this.onVisibilityChange);\n\n !ignoreHeavyAnimation && useHeavyAnimationCheck(() => {\n this.lock();\n }, () => {\n this.unlockAndRefresh();\n });\n }\n\n private onVisibilityChange = ({target, visible}: OnVisibilityChangeItem) => {\n // if(DEBUG) {\n // this.log('isIntersecting', target, visible);\n // }\n\n // if visible - will move to the end of visible arary\n findAndSpliceAll(this.queue, (i) => i.div === target).forEach((item) => {\n if(visible) {\n item.wasSeen = true;\n }\n\n item.visible = visible;\n const index = this.queue.findIndex((item) => !item.visible);\n this.queue.splice(Math.max(0, index), 0, item);\n });\n\n this.setProcessQueueTimeout();\n };\n\n protected getItem() {\n return findAndSplice(this.queue, (item) => item.wasSeen);\n }\n\n public async processItem(item: LazyLoadElement) {\n await super.processItem(item);\n this.intersector.unobserve(item.div);\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\n const inserted = super.addElement(method, el);\n\n if(!inserted) return false;\n\n this.observe(el);\n /* if(el.wasSeen) {\n this.processQueue(el);\n } else */\n el.wasSeen ??= false;\n\n return true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSpliceAll from '../helpers/array/findAndSpliceAll';\nimport LazyLoadQueueBase, {LazyLoadElementBase} from './lazyLoadQueueBase';\nimport VisibilityIntersector from './visibilityIntersector';\n\nexport type LazyLoadElement = Omit & {\n load: (target?: HTMLElement) => Promise,\n div: HTMLElement\n wasSeen?: boolean,\n visible?: boolean\n};\n\nexport default class LazyLoadQueueIntersector extends LazyLoadQueueBase {\n protected queue: Array = [];\n protected inProcess: Set = new Set();\n\n public intersector: VisibilityIntersector;\n protected intersectorTimeout: number;\n\n constructor(parallelLimit?: number) {\n super(parallelLimit);\n }\n\n public lock() {\n super.lock();\n this.intersector.lock();\n }\n\n public unlock() {\n super.unlock();\n this.intersector.unlock();\n }\n\n public unlockAndRefresh() {\n super.unlock();\n this.intersector.unlockAndRefresh();\n }\n\n public clear() {\n super.clear();\n this.intersector.disconnect();\n }\n\n public refresh() {\n this.intersector.refresh();\n }\n\n protected loadItem(item: LazyLoadElement) {\n return item.load(item.div);\n }\n\n protected addElement(method: 'push' | 'unshift', el: LazyLoadElement) {\n const item = this.queue.find((i) => i.div === el.div && i.load === el.load);\n if(item) {\n return false;\n } else {\n for(const item of this.inProcess) {\n if(item.div === el.div && item.load === el.load) {\n return false;\n }\n }\n }\n\n this.queue[method](el);\n return true;\n }\n\n protected setProcessQueueTimeout() {\n this.intersectorTimeout ??= window.setTimeout(() => {\n this.intersectorTimeout = undefined;\n this.processQueue();\n }, 0);\n }\n\n public push(el: LazyLoadElement) {\n super.push(el);\n }\n\n public unshift(el: LazyLoadElement) {\n super.unshift(el);\n }\n\n public delete(el: Omit) {\n findAndSpliceAll(this.queue, (i) => i.div === el.div);\n this.unobserve(el);\n }\n\n public observe(el: LazyLoadElement) {\n this.intersector.observe(el.div);\n }\n\n public unobserve(el: Omit) {\n this.intersector.unobserve(el.div);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GrabEvent} from '../helpers/dom/attachGrabListeners';\nimport appMediaPlaybackController from './appMediaPlaybackController';\nimport RangeSelector from './rangeSelector';\n\nexport default class MediaProgressLine extends RangeSelector {\n protected filledLoad: HTMLDivElement;\n\n protected progressRAF = 0;\n\n protected media: HTMLMediaElement;\n protected streamable: boolean;\n\n constructor(media?: HTMLAudioElement | HTMLVideoElement, streamable?: boolean, withTransition?: boolean, useTransform?: boolean) {\n super({\n step: 1000 / 60 / 1000,\n min: 0,\n max: 1,\n withTransition,\n useTransform\n }, 0);\n\n if(media) {\n this.setMedia(media, streamable);\n }\n }\n\n public setMedia(media: HTMLMediaElement, streamable = false) {\n if(this.media) {\n this.removeListeners();\n }\n\n if(streamable && !this.filledLoad) {\n this.filledLoad = document.createElement('div');\n this.filledLoad.classList.add('progress-line__filled', 'progress-line__loaded');\n this.container.prepend(this.filledLoad);\n // this.setLoadProgress();\n } else if(this.filledLoad) {\n this.filledLoad.classList.toggle('hide', !streamable);\n }\n\n this.media = media;\n this.streamable = streamable;\n if(!media.paused || media.currentTime > 0) {\n this.onPlay();\n }\n\n let wasPlaying = false;\n this.setSeekMax();\n this.setListeners();\n this.setHandlers({\n onMouseDown: () => {\n wasPlaying = !this.media.paused;\n wasPlaying && this.media.pause();\n },\n\n onMouseUp: (e) => {\n // cancelEvent(e.event);\n wasPlaying && this.media.play();\n }\n });\n }\n\n protected onLoadedData = () => {\n this.max = this.media.duration;\n this.seek.setAttribute('max', '' + this.max);\n };\n\n protected onEnded = () => {\n this.setProgress();\n };\n\n protected onPlay = () => {\n const r = () => {\n this.setProgress();\n\n this.progressRAF = this.media.paused ? 0 : window.requestAnimationFrame(r);\n };\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n }\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n\n this.progressRAF = window.requestAnimationFrame(r);\n };\n\n protected onTimeUpdate = () => {\n if(this.media.paused) {\n this.setProgress();\n\n if(this.streamable) {\n this.setLoadProgress();\n }\n }\n };\n\n protected onProgress = (e: Event) => {\n this.setLoadProgress();\n };\n\n protected scrub(e: GrabEvent) {\n const scrubTime = super.scrub(e);\n this.media.currentTime = scrubTime;\n return scrubTime;\n }\n\n protected setLoadProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const buf = this.media.buffered;\n const numRanges = buf.length;\n\n const currentTime = this.media.currentTime;\n let nearestStart = 0, end = 0;\n for(let i = 0; i < numRanges; ++i) {\n const start = buf.start(i);\n if(currentTime >= start && start >= nearestStart) {\n nearestStart = start;\n end = buf.end(i);\n }\n\n // console.log('onProgress range:', i, buf.start(i), buf.end(i), this.media);\n }\n\n // console.log('onProgress correct range:', nearestStart, end, this.media);\n\n const percents = this.media.duration ? end / this.media.duration : 0;\n this.filledLoad.style.width = (percents * 100) + '%';\n // this.filledLoad.style.transform = 'scaleX(' + percents + ')';\n }\n\n protected setSeekMax() {\n this.max = this.media.duration || 0;\n if(this.max > 0) {\n this.onLoadedData();\n } else {\n this.media.addEventListener('loadeddata', this.onLoadedData);\n }\n }\n\n public setProgress() {\n if(appMediaPlaybackController.isSafariBuffering(this.media)) return;\n const currentTime = this.media.currentTime;\n\n super.setProgress(currentTime);\n }\n\n public setListeners() {\n super.setListeners();\n this.media.addEventListener('ended', this.onEnded);\n this.media.addEventListener('play', this.onPlay);\n this.media.addEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.addEventListener('progress', this.onProgress);\n }\n\n public removeListeners() {\n super.removeListeners();\n\n if(this.media) {\n this.media.removeEventListener('loadeddata', this.onLoadedData);\n this.media.removeEventListener('ended', this.onEnded);\n this.media.removeEventListener('play', this.onPlay);\n this.media.removeEventListener('timeupdate', this.onTimeUpdate);\n this.streamable && this.media.removeEventListener('progress', this.onProgress);\n }\n\n if(this.progressRAF) {\n window.cancelAnimationFrame(this.progressRAF);\n this.progressRAF = 0;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {FontFamily, FontSize, FontWeight} from '../config/font';\nimport getTextWidth from '../helpers/canvas/getTextWidth';\nimport mediaSizes from '../helpers/mediaSizes';\nimport clamp from '../helpers/number/clamp';\nimport {fastRaf} from '../helpers/schedulers';\n\n// Thanks to https://stackoverflow.com/a/49349813\n\n/**\n * Attibute modifier to create middle ellipsis\n * When the attribute value is left blank the ellipsis will be in the middle\n * When positive the attribute value will be used as a percentage\n * When negative the attribute value will be used as character index counted from the end\n * @example\n *
A Javascript solution to middle ellipsis
\n *
A Javascript solution to middle ellipsis
\n *
A Javascript solution to middle ellipsis
\n */\nconst ellipsis = '…';\nconst map: Map = new Map();\n\nconst testQueue: Set = new Set();\nconst fontSize = '16px';\nlet pendingTest = false;\n\nfunction setTestQueue() {\n if(pendingTest) {\n return;\n }\n\n pendingTest = true;\n fastRaf(() => {\n pendingTest = false;\n testQueueElements();\n });\n}\n\nfunction testQueueElements() {\n testQueue.forEach(testElement);\n testQueue.clear();\n}\n\nwindow.addEventListener('resize', () => {\n for(const [key] of map) {\n testQueue.add(key);\n }\n\n setTestQueue();\n}, {capture: true, passive: true});\n\nfunction getElementWidth(element: HTMLElement) {\n const type = element.dataset.sizeType;\n if(type) {\n const mediaSize = mediaSizes.active;\n // @ts-ignore\n const size: MediaSize = mediaSize[type];\n return size.width;\n }\n\n return element.getBoundingClientRect().width;\n}\n\nfunction testElement(element: HTMLElement) {\n // const perf = performance.now();\n // do not recalculate variables a second time\n let mapped = map.get(element);\n const firstTime = !mapped;\n\n let {text, textLength, from, multiplier, font, textWidth, elementWidth} = mapped || {};\n // console.log('[MEE] testElement got mapped', mapped);\n\n if(firstTime) {\n text = element.textContent;\n textLength = text.length;\n from = /* parseFloat(element.getAttribute(attributeName)) || */50;\n multiplier = from > 0 && from / 100;\n\n let fontSize = element.dataset.fontSize;\n if(fontSize && +fontSize) fontSize += 'px';\n // const perf = performance.now();\n font = `${element.dataset.fontWeight || FontWeight} ${fontSize || FontSize} ${FontFamily}`;\n /* const computedStyle = window.getComputedStyle(elm, null);\n font = `${computedStyle.getPropertyValue('font-weight')} ${computedStyle.getPropertyValue('font-size')} ${computedStyle.getPropertyValue('font-family')}`; */\n // console.log('testMiddleEllipsis get computed style:', performance.now() - perf, font);\n\n textWidth = getTextWidth(text, font);\n // const perf = performance.now();\n elementWidth = getElementWidth(element);\n // console.log('testMiddleEllipsis get offsetWidth:', performance.now() - perf, font);\n mapped = {text, textLength, from, multiplier, font, textWidth, elementWidth};\n map.set(element, mapped);\n\n // console.log('[MEE] testElement map set', element);\n }\n\n const newElementWidth = getElementWidth(element);\n const widthChanged = firstTime || elementWidth !== newElementWidth;\n !firstTime && widthChanged && (mapped.elementWidth = elementWidth = newElementWidth);\n\n if(widthChanged) {\n if(textWidth > elementWidth) {\n element.setAttribute('title', text);\n let smallerText = text;\n let smallerWidth = elementWidth;\n while(smallerText.length > 3) {\n const smallerTextLength = smallerText.length;\n const half = multiplier &&\n clamp(multiplier * smallerTextLength << 0, 1, smallerTextLength - 2) ||\n Math.max(smallerTextLength + from - 1, 1);\n const half1 = smallerText.substr(0, half).replace(/\\s*$/, '');\n const half2 = smallerText.substr(half + 1).replace(/^\\s*/, '');\n smallerText = half1 + half2;\n smallerWidth = getTextWidth(smallerText + ellipsis, font);\n if(smallerWidth < elementWidth) {\n element.textContent = half1 + ellipsis + half2;\n break;\n }\n }\n\n // * set new width after cutting text\n mapped.elementWidth = getElementWidth(element);\n // mapped.textWidth = smallerWidth;\n } else {\n element.removeAttribute('title');\n }\n }\n\n // console.log('testMiddleEllipsis for element:', elm, performance.now() - perf);\n}\n\nexport class MiddleEllipsisElement extends HTMLElement {\n connectedCallback() {\n // console.log('[MEE]: connectedCallback before', map.has(this), testQueue.has(this), map.size, this.textContent, map);\n\n map.set(this, null);\n if(this.dataset.sizeType) {\n testElement(this);\n } else {\n testQueue.add(this);\n setTestQueue();\n }\n // testElement(this);\n\n // console.log('[MEE]: connectedCallback after', map.has(this), map.size, testQueue.has(this), testQueue.size);\n }\n\n disconnectedCallback() {\n const deleted = map.delete(this);\n testQueue.delete(this);\n // console.log('[MEE]: disconnectedCallback', deleted, map.has(this), map.size, this.textContent, map);\n }\n}\n\ncustomElements.define('middle-ellipsis-element', MiddleEllipsisElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport lottieLoader, {LottieLoader} from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport PasswordInputField from '../passwordInputField';\n\nexport default class PasswordMonkey {\n public container: HTMLElement;\n public animation: RLottiePlayer;\n public needFrame = 0;\n protected loadPromise: ReturnType;\n\n constructor(protected passwordInputField: PasswordInputField, protected size: number) {\n this.container = document.createElement('div');\n this.container.classList.add('media-sticker-wrapper');\n }\n\n public load() {\n if(this.loadPromise) return this.loadPromise;\n return this.loadPromise = lottieLoader.loadAnimationAsAsset({\n container: this.container,\n loop: false,\n autoplay: false,\n width: this.size,\n height: this.size,\n noCache: true\n // }, 'assets/img/TwoFactorSetupMonkeyClose.tgs').then((_animation) => {\n }, 'TwoFactorSetupMonkeyPeek').then((_animation) => {\n // return;\n this.animation = _animation;\n this.animation.addEventListener('enterFrame', currentFrame => {\n // console.log('enterFrame', currentFrame, this.needFrame);\n\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\n this.animation.setSpeed(1);\n this.animation.pause();\n }\n });\n\n this.passwordInputField.helpers.onVisibilityClickAdditional = () => {\n if(this.passwordInputField.helpers.passwordVisible) {\n this.animation.setDirection(1);\n this.animation.curFrame = 0;\n this.needFrame = 16;\n this.animation.play();\n } else {\n this.animation.setDirection(-1);\n this.animation.curFrame = 16;\n this.needFrame = 0;\n this.animation.play();\n }\n };\n\n return lottieLoader.waitForFirstFrame(_animation);\n });\n }\n\n public remove() {\n if(this.animation) {\n this.animation.remove();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField from '../inputField';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\n\nexport default class TrackingMonkey {\n public container: HTMLElement;\n\n protected max = 45;\n protected needFrame = 0;\n\n protected animation: RLottiePlayer;\n protected idleAnimation: RLottiePlayer;\n\n protected loadPromise: Promise;\n\n constructor(protected inputField: InputField, protected size: number) {\n this.container = document.createElement('div');\n this.container.classList.add('media-sticker-wrapper');\n\n const input = inputField.input;\n\n input.addEventListener('blur', () => {\n this.playAnimation(0);\n });\n\n input.addEventListener('input', (e) => {\n this.playAnimation(inputField.value.length);\n });\n\n /* codeInput.addEventListener('focus', () => {\n playAnimation(Math.max(codeInput.value.length, 1));\n }); */\n }\n\n // 1st symbol = frame 15\n // end symbol = frame 165\n public playAnimation(length: number) {\n if(!this.animation) return;\n\n length = Math.min(length, 30);\n let frame: number;\n if(length) {\n frame = Math.round(Math.min(this.max, length) * (165 / this.max) + 11.33);\n\n if(this.idleAnimation) {\n this.idleAnimation.stop(true);\n this.idleAnimation.canvas[0].style.display = 'none';\n }\n\n this.animation.canvas[0].style.display = '';\n } else {\n /* const cb = (frameNo: number) => {\n if(frameNo <= 1) { */\n /* idleAnimation.play();\n idleAnimation.canvas.style.display = '';\n animation.canvas.style.display = 'none'; */\n /* animation.removeListener('enterFrame', cb);\n }\n };\n animation.addListener('enterFrame', cb); */\n\n frame = 0;\n }\n // animation.playSegments([1, 2]);\n\n const direction = this.needFrame > frame ? -1 : 1;\n // console.log('keydown', length, frame, direction);\n\n this.animation.setDirection(direction);\n if(this.needFrame !== 0 && frame === 0) {\n this.animation.setSpeed(7);\n }\n /* let diff = Math.abs(needFrame - frame * direction);\n if((diff / 20) > 1) animation.setSpeed(diff / 20 | 0); */\n this.needFrame = frame;\n\n this.animation.play();\n\n /* animation.goToAndStop(15, true); */\n // animation.goToAndStop(length / max * );\n }\n\n public load() {\n if(this.loadPromise) return this.loadPromise;\n return this.loadPromise = Promise.all([\n lottieLoader.loadAnimationAsAsset({\n container: this.container,\n loop: true,\n autoplay: true,\n width: this.size,\n height: this.size\n }, 'TwoFactorSetupMonkeyIdle').then((animation) => {\n this.idleAnimation = animation;\n\n // ! animationIntersector will stop animation instantly\n if(!this.inputField.value.length) {\n animation.play();\n }\n\n return lottieLoader.waitForFirstFrame(animation);\n }),\n\n lottieLoader.loadAnimationAsAsset({\n container: this.container,\n loop: false,\n autoplay: false,\n width: this.size,\n height: this.size\n }, 'TwoFactorSetupMonkeyTracking').then((_animation) => {\n this.animation = _animation;\n\n if(!this.inputField.value.length) {\n this.animation.canvas[0].style.display = 'none';\n }\n\n this.animation.addEventListener('enterFrame', currentFrame => {\n // console.log('enterFrame', currentFrame, needFrame);\n // let currentFrame = Math.round(e.currentTime);\n\n if((this.animation.direction === 1 && currentFrame >= this.needFrame) ||\n (this.animation.direction === -1 && currentFrame <= this.needFrame)) {\n this.animation.setSpeed(1);\n this.animation.pause();\n }\n\n if(currentFrame === 0 && this.needFrame === 0) {\n // animation.curFrame = 0;\n\n if(this.idleAnimation) {\n this.idleAnimation.canvas[0].style.display = '';\n this.idleAnimation.play();\n this.animation.canvas[0].style.display = 'none';\n }\n }\n });\n // console.log(animation.getDuration(), animation.getDuration(true));\n\n return lottieLoader.waitForFirstFrame(_animation);\n })\n ]);\n }\n\n public remove() {\n if(this.animation) this.animation.remove();\n if(this.idleAnimation) this.idleAnimation.remove();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport InputField, {InputFieldOptions} from './inputField';\n\nexport class PasswordInputHelpers {\n public passwordVisible = false;\n public toggleVisible: HTMLElement;\n public onVisibilityClickAdditional: () => void;\n\n constructor(public container: HTMLElement, public input: HTMLInputElement) {\n input.type = 'password';\n input.setAttribute('required', '');\n input.name = 'notsearch_password';\n input.autocomplete = 'off';\n\n // * https://stackoverflow.com/a/35949954/6758968\n const stealthy = document.createElement('input');\n stealthy.classList.add('stealthy');\n stealthy.tabIndex = -1;\n stealthy.type = 'password';\n input.parentElement.prepend(stealthy);\n input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);\n\n /* if(IS_SAFARI && !IS_MOBILE_SAFARI) {\n input.setAttribute('readonly', '');\n input.addEventListener('focus', () => {\n input.removeAttribute('readonly');\n }, {once: true});\n } */\n\n const toggleVisible = this.toggleVisible = document.createElement('span');\n toggleVisible.classList.add('toggle-visible', 'tgico');\n\n container.classList.add('input-field-password');\n container.append(toggleVisible);\n\n toggleVisible.addEventListener('click', this.onVisibilityClick);\n toggleVisible.addEventListener('touchend', this.onVisibilityClick);\n }\n\n public onVisibilityClick = (e: Event) => {\n cancelEvent(e);\n this.passwordVisible = !this.passwordVisible;\n\n this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);\n (this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';\n this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();\n };\n}\n\nexport default class PasswordInputField extends InputField {\n public helpers: PasswordInputHelpers;\n\n constructor(options: InputFieldOptions = {}) {\n super({\n plainText: true,\n ...options\n });\n\n this.helpers = new PasswordInputHelpers(this.container, this.input as HTMLInputElement);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_PARALLAX_SUPPORTED from '../environment/parallaxSupport';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport findAndSplice from '../helpers/array/findAndSplice';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport filterChatPhotosMessages from '../helpers/filterChatPhotosMessages';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport ListLoader from '../helpers/listLoader';\nimport {fastRaf} from '../helpers/schedulers';\nimport {Message, ChatFull, MessageAction, Photo} from '../layer';\nimport type {AppMessagesManager} from '../lib/appManagers/appMessagesManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport {openAvatarViewer} from './avatar';\nimport {putAvatar} from './putPhoto';\nimport Scrollable from './scrollable';\nimport SwipeHandler from './swipeHandler';\nimport wrapPhoto from './wrappers/photo';\n\nconst LOAD_NEAREST = 3;\n\nexport default class PeerProfileAvatars {\n private static BASE_CLASS = 'profile-avatars';\n private static SCALE = IS_PARALLAX_SUPPORTED ? 2 : 1;\n private static TRANSLATE_TEMPLATE = IS_PARALLAX_SUPPORTED ? `translate3d({x}, 0, -1px) scale(${PeerProfileAvatars.SCALE})` : 'translate({x}, 0)';\n public container: HTMLElement;\n public avatars: HTMLElement;\n public gradient: HTMLElement;\n public info: HTMLElement;\n public arrowPrevious: HTMLElement;\n public arrowNext: HTMLElement;\n private tabs: HTMLDivElement;\n private listLoader: ListLoader;\n private peerId: PeerId;\n private intersectionObserver: IntersectionObserver;\n private loadCallbacks: Map void>;\n private listenerSetter: ListenerSetter;\n private swipeHandler: SwipeHandler;\n\n constructor(\n public scrollable: Scrollable,\n private managers: AppManagers\n ) {\n this.container = document.createElement('div');\n this.container.classList.add(PeerProfileAvatars.BASE_CLASS + '-container');\n\n this.avatars = document.createElement('div');\n this.avatars.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatars');\n\n this.gradient = document.createElement('div');\n this.gradient.classList.add(PeerProfileAvatars.BASE_CLASS + '-gradient');\n\n this.info = document.createElement('div');\n this.info.classList.add(PeerProfileAvatars.BASE_CLASS + '-info');\n\n this.tabs = document.createElement('div');\n this.tabs.classList.add(PeerProfileAvatars.BASE_CLASS + '-tabs');\n\n this.arrowPrevious = document.createElement('div');\n this.arrowPrevious.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', 'tgico-avatarprevious');\n\n /* const previousIcon = document.createElement('i');\n previousIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-previous');\n this.arrowBack.append(previousIcon); */\n\n this.arrowNext = document.createElement('div');\n this.arrowNext.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow', PeerProfileAvatars.BASE_CLASS + '-arrow-next', 'tgico-avatarnext');\n\n /* const nextIcon = document.createElement('i');\n nextIcon.classList.add(PeerProfileAvatars.BASE_CLASS + '-arrow-icon', 'tgico-next');\n this.arrowNext.append(nextIcon); */\n\n this.container.append(this.avatars, this.gradient, this.info, this.tabs, this.arrowPrevious, this.arrowNext);\n\n this.loadCallbacks = new Map();\n this.listenerSetter = new ListenerSetter();\n\n const checkScrollTop = () => {\n if(this.scrollable.scrollTop !== 0) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement,\n position: 'start'\n });\n return false;\n }\n\n return true;\n };\n\n const SWITCH_ZONE = 1 / 3;\n let cancel = false;\n let freeze = false;\n attachClickEvent(this.container, async(_e) => {\n if(freeze) {\n cancelEvent(_e);\n return;\n }\n\n if(cancel) {\n cancel = false;\n return;\n }\n\n if(!checkScrollTop()) {\n return;\n }\n\n const rect = this.container.getBoundingClientRect();\n\n // const e = (_e as TouchEvent).touches ? (_e as TouchEvent).touches[0] : _e as MouseEvent;\n const e = _e;\n const x = e.pageX;\n\n const clickX = x - rect.left;\n if((!this.listLoader.previous.length && !this.listLoader.next.length) ||\n (clickX > (rect.width * SWITCH_ZONE) && clickX < (rect.width - rect.width * SWITCH_ZONE))) {\n const peerId = this.peerId;\n\n const targets: {element: HTMLElement, item: Photo.photo['id'] | Message.messageService}[] = [];\n this.listLoader.previous.concat(this.listLoader.current, this.listLoader.next).forEach((item, idx) => {\n targets.push({\n element: /* null */this.avatars.children[idx] as HTMLElement,\n item\n });\n });\n\n const prevTargets = targets.slice(0, this.listLoader.previous.length);\n const nextTargets = targets.slice(this.listLoader.previous.length + 1);\n\n const target = this.avatars.children[this.listLoader.previous.length] as HTMLElement;\n freeze = true;\n openAvatarViewer(target, peerId, () => peerId === this.peerId, this.listLoader.current, prevTargets, nextTargets);\n freeze = false;\n } else {\n const centerX = rect.right - (rect.width / 2);\n const toRight = x > centerX;\n\n // this.avatars.classList.remove('no-transition');\n // fastRaf(() => {\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n\n let distance: number;\n if(this.listLoader.index === 0 && !toRight) distance = this.listLoader.count - 1;\n else if(this.listLoader.index === (this.listLoader.count - 1) && toRight) distance = -(this.listLoader.count - 1);\n else distance = toRight ? 1 : -1;\n this.listLoader.go(distance);\n\n fastRaf(() => {\n this.avatars.classList.remove('no-transition');\n });\n // });\n }\n }, {listenerSetter: this.listenerSetter});\n\n const cancelNextClick = () => {\n cancel = true;\n document.body.addEventListener(IS_TOUCH_SUPPORTED ? 'touchend' : 'click', (e) => {\n cancel = false;\n }, {once: true});\n };\n\n let width = 0, x = 0, lastDiffX = 0, /* lastIndex = 0, */ minX = 0;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.avatars,\n onSwipe: (xDiff, yDiff) => {\n xDiff *= -1;\n yDiff *= -1;\n\n lastDiffX = xDiff;\n let lastX = x + xDiff * -PeerProfileAvatars.SCALE;\n if(lastX > 0) lastX = 0;\n else if(lastX < minX) lastX = minX;\n\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', lastX + 'px');\n // console.log(xDiff, yDiff);\n return false;\n },\n verifyTouchTarget: (e) => {\n if(!checkScrollTop()) {\n cancelNextClick();\n cancelEvent(e as any as Event);\n return false;\n } else if(this.container.classList.contains('is-single') || freeze) {\n return false;\n }\n\n return true;\n },\n onFirstSwipe: () => {\n const rect = this.avatars.getBoundingClientRect();\n width = rect.width;\n minX = -width * (this.tabs.childElementCount - 1);\n\n /* lastIndex = whichChild(this.tabs.querySelector('.active'));\n x = -width * lastIndex; */\n x = rect.left - this.container.getBoundingClientRect().left;\n\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', x + 'px');\n\n this.container.classList.add('is-swiping');\n this.avatars.classList.add('no-transition');\n void this.avatars.offsetLeft; // reflow\n },\n onReset: () => {\n const addIndex = Math.ceil(Math.abs(lastDiffX) / (width / PeerProfileAvatars.SCALE)) * (lastDiffX >= 0 ? 1 : -1);\n cancelNextClick();\n\n // console.log(addIndex);\n\n this.avatars.classList.remove('no-transition');\n fastRaf(() => {\n this.listLoader.go(addIndex);\n this.container.classList.remove('is-swiping');\n });\n }\n });\n\n this.intersectionObserver = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if(!entry.isIntersecting) {\n return;\n }\n\n this.loadNearestToTarget(entry.target);\n });\n });\n\n /* this.listenerSetter.add(rootScope)('avatar_update', (peerId) => {\n if(this.peerId === peerId) {\n const photo = appPeersManager.getPeerPhoto(peerId);\n if(photo) {\n const id = photo.photo_id;\n const previous = this.listLoader.previous;\n for(let i = 0; i < previous.length; ++i) {\n if(previous[i] === id)\n }\n this.listLoader.previous.forEach((_id, idx, arr) => {});\n }\n }\n }); */\n }\n\n public async setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n const photo = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(!photo) {\n return;\n }\n\n const listLoader: PeerProfileAvatars['listLoader'] = this.listLoader = new ListLoader({\n loadCount: 50,\n loadMore: (anchor, older, loadCount) => {\n if(!older) return Promise.resolve({count: undefined, items: []});\n\n if(peerId.isUser()) {\n const maxId: Photo.photo['id'] = anchor as any;\n return this.managers.appPhotosManager.getUserPhotos(peerId, maxId, loadCount).then((value) => {\n return {\n count: value.count,\n items: value.photos\n };\n });\n } else {\n const promises: [Promise | ChatFull, ReturnType] = [] as any;\n if(!listLoader.current) {\n promises.push(this.managers.appProfileManager.getChatFull(peerId.toChatId()));\n }\n\n promises.push(this.managers.appMessagesManager.getSearch({\n peerId,\n maxId: Number.MAX_SAFE_INTEGER,\n inputFilter: {\n _: 'inputMessagesFilterChatPhotos'\n },\n limit: loadCount,\n backLimit: 0\n }));\n\n return Promise.all(promises).then(async(result) => {\n const value = result.pop() as typeof result[1];\n\n filterChatPhotosMessages(value);\n\n if(!listLoader.current) {\n const chatFull = result[0];\n const message = findAndSplice(value.history, (message) => {\n return ((message as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo.id === chatFull.chat_photo.id;\n }) as Message.messageService;\n\n listLoader.current = message || await this.managers.appMessagesManager.generateFakeAvatarMessage(this.peerId, chatFull.chat_photo);\n }\n\n // console.log('avatars loaded:', value);\n return {\n count: value.count,\n items: value.history\n };\n });\n }\n },\n processItem: this.processItem,\n onJump: (item, older) => {\n const id = this.listLoader.index;\n // const nextId = Math.max(0, id);\n const x = 100 * PeerProfileAvatars.SCALE * id;\n this.avatars.style.transform = PeerProfileAvatars.TRANSLATE_TEMPLATE.replace('{x}', `-${x}%`);\n\n const activeTab = this.tabs.querySelector('.active');\n if(activeTab) activeTab.classList.remove('active');\n\n const tab = this.tabs.children[id] as HTMLElement;\n tab.classList.add('active');\n\n this.loadNearestToTarget(this.avatars.children[id]);\n }\n });\n\n if(photo._ === 'userProfilePhoto') {\n listLoader.current = photo.photo_id;\n }\n\n await this.processItem(listLoader.current);\n\n // listLoader.loaded\n listLoader.load(true);\n }\n\n public addTab() {\n const tab = document.createElement('div');\n tab.classList.add(PeerProfileAvatars.BASE_CLASS + '-tab');\n this.tabs.append(tab);\n\n if(this.tabs.childElementCount === 1) {\n tab.classList.add('active');\n }\n\n this.container.classList.toggle('is-single', this.tabs.childElementCount <= 1);\n }\n\n public processItem = async(photoId: Photo.photo['id'] | Message.messageService) => {\n const avatar = document.createElement('div');\n avatar.classList.add(PeerProfileAvatars.BASE_CLASS + '-avatar', 'media-container', 'hide');\n\n this.avatars.append(avatar);\n\n let photo: Photo.photo;\n if(photoId) {\n photo = typeof(photoId) !== 'object' ?\n await this.managers.appPhotosManager.getPhoto(photoId) :\n (photoId.action as MessageAction.messageActionChannelEditPhoto).photo as Photo.photo;\n }\n\n const img = new Image();\n img.classList.add('avatar-photo');\n img.draggable = false;\n\n const loadCallback = async() => {\n if(photo) {\n const res = await wrapPhoto({\n container: avatar,\n photo,\n size: choosePhotoSize(photo, 420, 420, false),\n withoutPreloader: true\n });\n\n [res.images.thumb, res.images.full].filter(Boolean).forEach((img) => {\n img.classList.add('avatar-photo');\n });\n } else {\n const photo = await this.managers.appPeersManager.getPeerPhoto(this.peerId);\n await putAvatar(avatar, this.peerId, photo, 'photo_big', img);\n }\n\n avatar.classList.remove('hide');\n };\n\n if(this.avatars.childElementCount <= LOAD_NEAREST) {\n await loadCallback();\n } else {\n this.intersectionObserver.observe(avatar);\n this.loadCallbacks.set(avatar, loadCallback);\n }\n\n this.addTab();\n\n return photoId;\n };\n\n private loadNearestToTarget(target: Element) {\n const children = Array.from(target.parentElement.children);\n const idx = children.indexOf(target);\n const slice = children.slice(Math.max(0, idx - LOAD_NEAREST), Math.min(children.length, idx + LOAD_NEAREST));\n\n slice.forEach((target) => {\n const callback = this.loadCallbacks.get(target);\n if(callback) {\n callback();\n this.loadCallbacks.delete(target);\n this.intersectionObserver.unobserve(target);\n }\n });\n }\n\n public cleanup() {\n this.listenerSetter.removeAll();\n this.swipeHandler.removeListeners();\n this.intersectionObserver?.disconnect();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_PARALLAX_SUPPORTED from '../environment/parallaxSupport';\nimport deferredPromise from '../helpers/cancellablePromise';\nimport {copyTextToClipboard} from '../helpers/clipboard';\nimport anchorCopy from '../helpers/dom/anchorCopy';\nimport {simulateClickEvent} from '../helpers/dom/clickEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport makeError from '../helpers/makeError';\nimport {makeMediaSize} from '../helpers/mediaSize';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\nimport middlewarePromise from '../helpers/middlewarePromise';\nimport {Chat, ChatFull, User, UserFull} from '../layer';\nimport appImManager from '../lib/appManagers/appImManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getServerMessageId from '../lib/appManagers/utils/messageId/getServerMessageId';\nimport getPeerActiveUsernames from '../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport I18n, {i18n, join} from '../lib/langPack';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../lib/rootScope';\nimport AvatarElement from './avatar';\nimport CheckboxField from './checkboxField';\nimport {generateDelimiter} from './generateDelimiter';\nimport PeerProfileAvatars from './peerProfileAvatars';\nimport Row from './row';\nimport Scrollable from './scrollable';\nimport SettingSection from './settingSection';\nimport {toast} from './toast';\nimport formatUserPhone from './wrappers/formatUserPhone';\nimport wrapPeerTitle from './wrappers/peerTitle';\nimport wrapTopicNameButton from './wrappers/topicNameButton';\n\nconst setText = (text: Parameters[1], row: Row) => {\n // fastRaf(() => {\n setInnerHTML(row.title, text || '');\n row.container.style.display = text ? '' : 'none';\n // });\n};\n\nexport default class PeerProfile {\n public element: HTMLElement;\n private avatars: PeerProfileAvatars;\n private avatar: AvatarElement;\n private section: SettingSection;\n private name: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private bio: Row;\n private username: Row;\n private phone: Row;\n private notifications: Row;\n private location: Row;\n private link: Row;\n\n private cleaned: boolean;\n private setMoreDetailsTimeout: number;\n private setPeerStatusInterval: number;\n\n private peerId: PeerId;\n private threadId: number;\n\n private middlewareHelper: MiddlewareHelper;\n\n constructor(\n private managers: AppManagers,\n public scrollable: Scrollable,\n private listenerSetter?: ListenerSetter,\n private isDialog = true\n ) {\n if(!IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('no-parallax');\n }\n\n if(!listenerSetter) {\n this.listenerSetter = new ListenerSetter();\n }\n\n this.middlewareHelper = getMiddleware();\n }\n\n public init() {\n this.init = null;\n\n\n this.element = document.createElement('div');\n this.element.classList.add('profile-content');\n\n this.section = new SettingSection({\n noDelimiter: true\n });\n\n this.name = document.createElement('div');\n this.name.classList.add('profile-name');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('profile-subtitle');\n\n this.bio = new Row({\n title: ' ',\n subtitle: true,\n icon: 'info',\n clickable: (e) => {\n if((e.target as HTMLElement).tagName === 'A') {\n return;\n }\n\n copyTextToClipboard(this.bio.title.textContent);\n toast(I18n.format('BioCopied', true));\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_About',\n onClick: () => {\n simulateClickEvent(this.bio.container);\n },\n verify: () => !this.peerId.isUser()\n }, {\n icon: 'copy',\n text: 'Text.CopyLabel_Bio',\n onClick: () => {\n simulateClickEvent(this.bio.container);\n },\n verify: () => this.peerId.isUser()\n }]\n }\n });\n\n this.bio.title.classList.add('pre-wrap');\n\n this.username = new Row({\n title: ' ',\n subtitleLangKey: 'Username',\n icon: 'username',\n clickable: () => {\n // const username = await this.managers.appPeersManager.getPeerUsername(this.peerId);\n copyTextToClipboard('@' + this.username.title.textContent);\n toast(I18n.format('UsernameCopied', true));\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_Username',\n onClick: () => {\n simulateClickEvent(this.username.container);\n }\n }]\n }\n });\n\n this.phone = new Row({\n title: ' ',\n subtitle: true,\n icon: 'phone',\n clickable: () => {\n copyTextToClipboard(this.phone.title.textContent.replace(/\\s/g, ''));\n toast(I18n.format('PhoneCopied', true));\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_PhoneNumber',\n onClick: () => {\n simulateClickEvent(this.phone.container);\n }\n }, {\n icon: 'info',\n text: 'PeerInfo.Phone.AnonymousInfo',\n textArgs: [(() => {\n const a = document.createElement('a');\n return a;\n })()],\n onClick: () => {\n window.open('https://fragment.com/numbers', '_blank');\n },\n separator: true,\n multiline: true,\n verify: async() => {\n const {isAnonymous} = await this.managers.appUsersManager.getUserPhone(this.peerId.toUserId()) || {};\n return isAnonymous;\n }\n }]\n }\n });\n\n this.link = new Row({\n title: ' ',\n subtitleLangKey: 'SetUrlPlaceholder',\n icon: 'link',\n clickable: () => {\n const url = this.link.title.textContent;\n copyTextToClipboard(url);\n // Promise.resolve(appProfileManager.getChatFull(this.peerId.toChatId())).then((chatFull) => {\n // copyTextToClipboard(chatFull.exported_invite.link);\n const isPrivate = url.includes('/c/');\n toast(I18n.format(isPrivate ? 'LinkCopiedPrivateInfo' : 'LinkCopied', true));\n // });\n },\n listenerSetter: this.listenerSetter,\n contextMenu: {\n buttons: [{\n icon: 'copy',\n text: 'Text.CopyLabel_ShareLink',\n onClick: () => {\n simulateClickEvent(this.link.container);\n }\n }]\n }\n });\n\n this.location = new Row({\n title: ' ',\n subtitleLangKey: 'ChatLocation',\n icon: 'location'\n });\n\n this.section.content.append(\n this.phone.container,\n this.username.container,\n this.location.container,\n this.bio.container,\n this.link.container\n );\n\n const {listenerSetter} = this;\n if(this.isDialog) {\n this.notifications = new Row({\n checkboxField: new CheckboxField({toggle: true}),\n titleLangKey: 'Notifications',\n icon: 'unmute',\n listenerSetter: this.listenerSetter\n });\n\n listenerSetter.add(this.notifications.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n // let checked = this.notificationsCheckbox.checked;\n this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, threadId: this.threadId});\n });\n\n listenerSetter.add(rootScope)('dialog_notify_settings', async(dialog) => {\n if(this.peerId === dialog.peerId) {\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.threadId});\n this.notifications.checkboxField.checked = !muted;\n }\n });\n\n this.section.content.append(this.notifications.container);\n }\n\n this.element.append(this.section.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.element.append(generateDelimiter());\n }\n\n listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('peer_bio_edit', (peerId) => {\n if(peerId === this.peerId) {\n this.setMoreDetails(true);\n }\n });\n\n const n = async({peerId, threadId}: {peerId: PeerId, threadId?: number}) => {\n if(this.peerId !== peerId) {\n return false;\n }\n\n const isForum = await this.managers.appPeersManager.isForum(this.peerId);\n if(isForum && this.threadId ? this.threadId === threadId : true) {\n return true;\n }\n\n return false;\n };\n\n listenerSetter.add(rootScope)('peer_title_edit', async(data) => {\n if(await n(data)) {\n this.fillUsername();\n this.setMoreDetails(true);\n }\n });\n\n listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n listenerSetter.add(rootScope)('contacts_update', async(userId) => {\n if(this.peerId === userId.toPeerId()) {\n const user = await this.managers.appUsersManager.getUser(userId);\n if(!user.pFlags.self || !this.isDialog) {\n this.fillUserPhone();\n }\n }\n });\n\n listenerSetter.add(rootScope)('avatar_update', async(data) => {\n if(await n(data)) {\n this.setAvatar();\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(() => this.setPeerStatus(), 60e3);\n }\n\n private async setPeerStatus(\n needClear = false,\n manual?: T\n ): Promise void : void> {\n const peerId = this.peerId;\n\n const callbacks: Array<() => void> = [];\n callbacks.push(() => {\n this.element.classList.toggle('is-me', peerId === rootScope.myId);\n });\n\n let promise: Promise<(() => void) | void> = Promise.resolve();\n if(!(!peerId || (rootScope.myId === peerId && this.isDialog))) {\n const isForum = await this.managers.appPeersManager.isForum(this.peerId);\n const middleware = this.middlewareHelper.get();\n if(isForum && this.threadId) {\n promise = wrapTopicNameButton({\n peerId,\n wrapOptions: {\n middleware\n }\n }).then(({element}) => {\n this.subtitle.replaceChildren(element);\n });\n } else {\n promise = appImManager.setPeerStatus({\n peerId,\n element: this.subtitle,\n needClear,\n useWhitespace: true,\n middleware,\n ignoreSelf: !this.isDialog\n });\n }\n\n promise.then((callback) => callback && callbacks.push(callback));\n }\n\n const callback = () => callbacks.forEach((callback) => callback());\n\n return promise.then(() => {\n if(manual) {\n return callback;\n }\n\n callback();\n }) as any;\n }\n\n public cleanupHTML() {\n [\n this.bio,\n this.phone,\n this.username,\n this.location,\n this.link\n ].forEach((row) => {\n row.container.style.display = 'none';\n });\n\n if(this.notifications) {\n this.notifications.container.style.display = '';\n this.notifications.checkboxField.checked = true;\n }\n\n this.clearSetMoreDetailsTimeout();\n }\n\n private canBeDetailed() {\n return this.peerId !== rootScope.myId || !this.isDialog;\n }\n\n private createAvatar() {\n const avatar = new AvatarElement();\n avatar.classList.add('profile-avatar', 'avatar-120');\n avatar.isDialog = this.isDialog;\n avatar.attachClickEvent();\n return avatar;\n }\n\n private async _setAvatar() {\n const {peerId} = this;\n const isTopic = !!(this.threadId && await this.managers.appPeersManager.isForum(peerId));\n if(this.canBeDetailed() && !isTopic) {\n const photo = await this.managers.appPeersManager.getPeerPhoto(peerId);\n\n if(photo) {\n const oldAvatars = this.avatars;\n this.avatars = new PeerProfileAvatars(this.scrollable, this.managers);\n await this.avatars.setPeer(peerId);\n\n return () => {\n this.avatars.info.append(this.name, this.subtitle);\n\n this.avatar?.remove();\n this.avatar = undefined;\n\n if(oldAvatars) oldAvatars.container.replaceWith(this.avatars.container);\n else this.element.prepend(this.avatars.container);\n\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.add('parallax');\n }\n };\n }\n }\n\n const avatar = this.createAvatar();\n await avatar.updateWithOptions({\n peerId,\n threadId: isTopic ? this.threadId : undefined,\n wrapOptions: {\n customEmojiSize: makeMediaSize(120, 120),\n middleware: this.middlewareHelper.get()\n }\n });\n\n return () => {\n if(IS_PARALLAX_SUPPORTED) {\n this.scrollable.container.classList.remove('parallax');\n }\n\n if(this.avatars) {\n this.avatars.container.remove();\n this.avatars.cleanup();\n this.avatars = undefined;\n }\n\n this.avatar?.remove();\n this.avatar = avatar;\n\n this.section.content.prepend(this.avatar, this.name, this.subtitle);\n };\n }\n\n private setAvatar(manual?: T): T extends true ? Promise<() => void> : Promise {\n const promise = this._setAvatar();\n return manual ? promise : promise.then((callback) => callback()) as any;\n }\n\n private getUsernamesAlso(usernames: string[]) {\n const also = usernames.slice(1);\n if(also.length) {\n const a = also.map((username) => anchorCopy({username}));\n const i = i18n('UsernameAlso', [join(a, false)]);\n return i;\n }\n }\n\n private async fillUsername() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const usernames = await this.managers.appPeersManager.getPeerActiveUsernames(peerId);\n const also = this.getUsernamesAlso(usernames);\n\n return () => {\n this.username.subtitle.replaceChildren(also || i18n('Username'));\n setText(usernames[0], this.username);\n };\n }\n }\n\n private async fillUserPhone() {\n const {peerId} = this;\n if(peerId.isUser() && this.canBeDetailed()) {\n const {phone, isAnonymous} = await this.managers.appUsersManager.getUserPhone(peerId.toUserId()) || {};\n\n return () => {\n this.phone.subtitle.replaceChildren(i18n(isAnonymous ? 'AnonymousNumber' : 'Phone'));\n setText(phone ? formatUserPhone(phone) : undefined, this.phone);\n };\n }\n }\n\n private async fillNotifications() {\n const notificationsRow = this.notifications;\n if(!notificationsRow) {\n return;\n }\n\n if(this.canBeDetailed()) {\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.threadId});\n return () => {\n notificationsRow.checkboxField.checked = !muted;\n };\n } else {\n return () => {\n // fastRaf(() => {\n notificationsRow.container.style.display = 'none';\n // });\n };\n }\n }\n\n private async fillName() {\n const {peerId} = this;\n const [element/* , icons */] = await Promise.all([\n wrapPeerTitle({\n peerId,\n dialog: this.isDialog,\n withIcons: !this.threadId,\n threadId: this.threadId\n })\n\n // generateTitleIcons(peerId)\n ]);\n\n return () => {\n replaceContent(this.name, element);\n // this.name.append(...icons);\n };\n }\n\n private async fillRows(manual: Promise) {\n return Promise.all([\n this.fillName(),\n this.fillUsername(),\n this.fillUserPhone(),\n this.fillNotifications(),\n this.setMoreDetails(undefined, manual),\n this.setPeerStatus(true, true)\n ]).then((callbacks) => {\n return () => {\n callbacks.forEach((callback) => callback?.());\n };\n });\n }\n\n public async fillProfileElements() {\n if(!this.cleaned) return;\n this.cleaned = false;\n\n this.cleanupHTML();\n const deferred = deferredPromise();\n const middleware = this.middlewareHelper.get();\n middleware.onClean(() => {\n deferred.reject();\n });\n\n const callbacks = await Promise.all([\n this.setAvatar(true),\n this.fillRows(deferred)\n ]);\n\n return () => {\n deferred.resolve();\n callbacks.forEach((callback) => callback?.());\n };\n }\n\n private async _setMoreDetails(peerId: PeerId, peerFull?: ChatFull | UserFull) {\n const m = this.getMiddlewarePromise();\n const isTopic = !!(this.threadId && await m(this.managers.appPeersManager.isForum(peerId)));\n if(isTopic) {\n let url = 'https://t.me/';\n const threadId = getServerMessageId(this.threadId);\n const username = await m(this.managers.appPeersManager.getPeerUsername(peerId));\n if(username) {\n url += `${username}/${threadId}`;\n } else {\n url += `c/${peerId.toChatId()}/${threadId}`;\n }\n\n return () => {\n setText(url, this.link);\n };\n }\n\n const callbacks: (() => void)[] = [];\n // if(peerFull.about) {\n callbacks.push(() => {\n this.bio.subtitle.replaceChildren(i18n(peerId.isUser() ? 'UserBio' : 'Info'));\n setText(peerFull.about ? wrapRichText(peerFull.about) : undefined, this.bio);\n });\n // }\n\n if(!peerId.isUser()) {\n const chat = await m(this.managers.appChatsManager.getChat(peerId.toChatId())) as Chat.channel;\n const usernames = getPeerActiveUsernames(chat);\n let also: HTMLElement;\n if(usernames.length) {\n also = this.getUsernamesAlso(usernames);\n callbacks.push(() => setText('https://t.me/' + usernames[0], this.link));\n } else {\n const exportedInvite = (peerFull as ChatFull.channelFull).exported_invite;\n if(exportedInvite?._ === 'chatInviteExported') {\n callbacks.push(() => setText(exportedInvite.link, this.link));\n }\n }\n\n callbacks.push(() => this.link.subtitle.replaceChildren(also || i18n('SetUrlPlaceholder')));\n }\n\n const location = (peerFull as ChatFull.channelFull).location;\n if(location?._ == 'channelLocation') {\n callbacks.push(() => setText(location.address, this.location));\n }\n\n this.setMoreDetailsTimeout = window.setTimeout(() => this.setMoreDetails(true), 60e3);\n\n return () => {\n callbacks.forEach((callback) => callback());\n };\n }\n\n private async setMoreDetails(override?: true, manual?: Promise) {\n this.clearSetMoreDetailsTimeout();\n\n const {peerId} = this;\n const m = this.getMiddlewarePromise();\n\n if(!peerId || !this.canBeDetailed() || await m(this.managers.appPeersManager.isPeerRestricted(peerId))) {\n return;\n }\n\n const result = await m(this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId, override));\n const setPromise = m(result.result).then(async(peerFull) => {\n if(await m(this.managers.appPeersManager.isPeerRestricted(peerId))) {\n // this.log.warn('peer changed');\n return;\n }\n\n return await m(this._setMoreDetails(peerId, peerFull));\n });\n\n if(result.cached && manual) {\n return setPromise;\n } else {\n (manual || Promise.resolve())\n .then(() => setPromise)\n .then((callback) => {\n callback?.();\n });\n }\n }\n\n private getMiddlewarePromise() {\n return middlewarePromise(this.middlewareHelper.get(), makeError('MIDDLEWARE'));\n }\n\n public setPeer(peerId: PeerId, threadId?: number) {\n if(this.peerId === peerId && this.threadId === threadId) return;\n\n this.init?.();\n\n this.peerId = peerId;\n this.threadId = threadId;\n\n this.middlewareHelper.clean();\n this.cleaned = true;\n }\n\n public clearSetMoreDetailsTimeout() {\n if(this.setMoreDetailsTimeout !== undefined) {\n clearTimeout(this.setMoreDetailsTimeout);\n this.setMoreDetailsTimeout = undefined;\n }\n }\n\n public destroy() {\n this.peerId = this.threadId = undefined;\n this.clearSetMoreDetailsTimeout();\n clearInterval(this.setPeerStatusInterval);\n this.avatars?.cleanup();\n this.middlewareHelper.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport mediaSizes from '../helpers/mediaSizes';\nimport {Middleware} from '../helpers/middleware';\nimport {Chat, Document, EmojiStatus, User} from '../layer';\nimport rootScope from '../lib/rootScope';\nimport generateFakeIcon from './generateFakeIcon';\nimport generatePremiumIcon from './generatePremiumIcon';\nimport generateVerifiedIcon from './generateVerifiedIcon';\nimport wrapSticker from './wrappers/sticker';\n\nexport default async function generateTitleIcons(\n peerId: PeerId,\n middleware?: Middleware,\n noVerifiedIcon?: boolean,\n noFakeIcon?: boolean,\n noPremiumIcon?: boolean\n) {\n const elements: HTMLElement[] = [];\n const peer: Chat | User = await rootScope.managers.appPeersManager.getPeer(peerId);\n if((peer as Chat.channel).pFlags.verified && !noVerifiedIcon) {\n elements.push(generateVerifiedIcon());\n }\n\n if(((peer as Chat.channel).pFlags.fake || (peer as User.user).pFlags.scam) && !noFakeIcon) {\n elements.push(generateFakeIcon((peer as User.user).pFlags.scam));\n }\n\n if((peer as User.user).pFlags.premium && !noPremiumIcon) {\n const emojiStatus = (peer as User.user).emoji_status;\n if(emojiStatus && emojiStatus._ !== 'emojiStatusEmpty' && false) {\n const container = document.createElement('span');\n container.classList.add('emoji-status');\n const result = await rootScope.managers.acknowledged.appEmojiManager.getCustomEmojiDocument((emojiStatus as EmojiStatus.emojiStatus).document_id);\n const wrap = async(doc: Document.document) => {\n const size = mediaSizes.active.emojiStatus\n const loadPromises: Promise[] = [];\n await wrapSticker({\n doc,\n div: container,\n width: size.width,\n height: size.height,\n loop: 2,\n play: true,\n group: 'EMOJI-STATUS',\n loadPromises,\n middleware\n // group: 'none'\n });\n\n await Promise.all(loadPromises);\n };\n\n const p = result.result.then(wrap);\n if(result.cached) {\n await p;\n }\n\n elements.push(container);\n } else {\n elements.push(generatePremiumIcon());\n }\n }\n\n return elements;\n}\n","export default function generateVerifiedIcon() {\n const span = document.createElement('span');\n span.classList.add('verified-icon', 'tgico');\n\n const size = 26; // 24\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', `0 0 ${size} ${size}`);\n svg.setAttributeNS(null, 'width', `${size}`);\n svg.setAttributeNS(null, 'height', `${size}`);\n svg.classList.add('verified-icon-svg');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#verified-icon-background');\n use.classList.add('verified-icon-background');\n\n const use2 = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use2.setAttributeNS(null, 'href', '#verified-icon-check');\n use2.classList.add('verified-icon-check');\n\n // svg.append(use, use2);\n svg.append(use2, use);\n\n span.append(svg);\n\n return span;\n // const span = document.createElement('span');\n // span.classList.add('verified-icon', 'tgico-verified_filled');\n // return span;\n}\n","export default function generatePremiumIcon() {\n const span = document.createElement('span');\n span.classList.add('premium-icon', 'tgico-star');\n return span;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\nimport {i18n} from '../lib/langPack';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {NULL_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport limitSymbols from '../helpers/string/limitSymbols';\nimport setInnerHTML, {setDirection} from '../helpers/dom/setInnerHTML';\nimport safeAssign from '../helpers/object/safeAssign';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport getPeerTitle from './wrappers/getPeerTitle';\nimport generateTitleIcons from './generateTitleIcons';\nimport {wrapTopicIcon} from './wrappers/messageActionTextNewUnsafe';\n\nexport type PeerTitleOptions = {\n peerId?: PeerId,\n fromName?: string,\n plainText?: boolean,\n onlyFirstName?: boolean,\n dialog?: boolean,\n limitSymbols?: number,\n withIcons?: boolean,\n withPremiumIcon?: boolean,\n threadId?: number,\n wrapOptions?: WrapSomethingOptions\n};\n\nconst weakMap: WeakMap = new WeakMap();\n\nrootScope.addEventListener('peer_title_edit', ({peerId, threadId}) => {\n let query = `.peer-title[data-peer-id=\"${peerId}\"]`;\n if(threadId) {\n query += `[data-thread-id=\"${threadId}\"]`;\n }\n\n const elements = Array.from(document.querySelectorAll(query)) as HTMLElement[];\n elements.forEach((element) => {\n const peerTitle = weakMap.get(element);\n peerTitle?.update();\n });\n});\n\nexport default class PeerTitle {\n public element: HTMLElement;\n public options: PeerTitleOptions;\n private hasInner: boolean;\n\n constructor(options?: PeerTitleOptions) {\n this.element = document.createElement('span');\n this.element.classList.add('peer-title');\n setDirection(this.element);\n\n this.options = {};\n\n if(options) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n public setOptions(options?: PeerTitleOptions) {\n if(!options) {\n return;\n }\n\n safeAssign(this.options, options);\n for(const i in options) {\n // @ts-ignore\n const value = options[i];\n\n if(typeof(value) !== 'object' && typeof(value) !== 'function') {\n // @ts-ignore\n this.element.dataset[i] = value ? '' + (typeof(value) === 'boolean' ? +value : value) : '0';\n }\n }\n }\n\n private setHasInner(hasInner: boolean) {\n if(this.hasInner !== hasInner) {\n this.hasInner = hasInner;\n this.element.classList.toggle('with-icons', hasInner);\n }\n }\n\n public async update(options?: PeerTitleOptions) {\n this.setOptions(options);\n\n let fromName = this.options.fromName;\n if(fromName !== undefined) {\n if(this.options.limitSymbols !== undefined) {\n fromName = limitSymbols(fromName, this.options.limitSymbols, this.options.limitSymbols);\n }\n\n setInnerHTML(this.element, wrapEmojiText(fromName));\n return;\n }\n\n this.options.peerId ??= NULL_PEER_ID;\n\n let hasInner: boolean;\n const {peerId, threadId} = this.options;\n if(peerId !== rootScope.myId || !this.options.dialog) {\n if(threadId) {\n const [topic, isForum] = await Promise.all([\n rootScope.managers.dialogsStorage.getForumTopic(peerId, threadId),\n rootScope.managers.appPeersManager.isForum(peerId)\n ]);\n\n if(!topic && isForum) {\n rootScope.managers.dialogsStorage.getForumTopicById(peerId, threadId).then((forumTopic) => {\n if(!forumTopic && this.options.threadId === threadId) {\n this.options.threadId = undefined;\n this.update({threadId: undefined});\n return;\n }\n\n this.update();\n }, () => {\n if(this.options.threadId === threadId) {\n this.options.threadId = undefined;\n this.update({threadId: undefined});\n }\n });\n\n setInnerHTML(this.element, i18n('Loading'));\n this.setHasInner(false);\n return;\n }\n }\n\n const getTopicIconPromise = threadId && this.options.withIcons ?\n rootScope.managers.dialogsStorage.getForumTopic(peerId, threadId).then((topic) => wrapTopicIcon({...(this.options.wrapOptions ?? {}), topic})) :\n undefined;\n\n const [title, icons, topicIcon] = await Promise.all([\n getPeerTitle(this.options as Required),\n (this.options.withIcons && generateTitleIcons(peerId, this.options.wrapOptions?.middleware)) || (this.options.withPremiumIcon && generateTitleIcons(peerId, this.options.wrapOptions?.middleware, true, true)),\n getTopicIconPromise\n ]);\n\n if(icons?.length || topicIcon) {\n const inner = document.createElement('span');\n inner.classList.add('peer-title-inner');\n hasInner = true;\n setInnerHTML(inner, title);\n\n const fragment = document.createDocumentFragment();\n fragment.append(...[topicIcon, inner, ...(icons ?? [])].filter(Boolean));\n setInnerHTML(this.element, fragment);\n } else {\n setInnerHTML(this.element, title);\n }\n } else {\n replaceContent(this.element, i18n(this.options.onlyFirstName ? 'Saved' : 'SavedMessages'));\n }\n\n this.setHasInner(hasInner);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppDownloadManager} from '../../lib/appManagers/appDownloadManager';\nimport resizeableImage from '../../lib/cropper';\nimport PopupElement from '.';\nimport {_i18n} from '../../lib/langPack';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport readBlobAsDataURL from '../../helpers/blob/readBlobAsDataURL';\nimport rootScope from '../../lib/rootScope';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\n\nexport default class PopupAvatar extends PopupElement {\n private cropContainer: HTMLElement;\n private input: HTMLInputElement;\n private h6: HTMLElement;\n\n private image = new Image();\n\n private canvas: HTMLCanvasElement;\n private blob: Blob;\n private cropper = {\n crop: () => {},\n removeHandlers: () => {}\n };\n\n private onCrop: (upload: () => ReturnType) => void;\n\n constructor(options: Partial<{\n isForum: boolean\n }> = {}) {\n super('popup-avatar', {closable: true, withConfirm: true});\n\n this.h6 = document.createElement('h6');\n _i18n(this.h6, 'Popup.Avatar.Title');\n\n this.btnClose.classList.remove('btn-icon');\n\n this.header.append(this.h6);\n\n this.cropContainer = document.createElement('div');\n this.cropContainer.classList.add('crop');\n this.cropContainer.append(this.image);\n\n if(options.isForum) {\n this.cropContainer.classList.add('is-forum');\n }\n\n this.input = document.createElement('input');\n this.input.type = 'file';\n this.input.style.display = 'none';\n this.listenerSetter.add(this.input)('change', (e: any) => {\n const file = e.target.files[0];\n if(!file) {\n return;\n }\n\n readBlobAsDataURL(file).then((contents) => {\n this.image = new Image();\n this.cropContainer.append(this.image);\n this.image.src = contents;\n\n this.image.onload = () => {\n /* let {w, h} = calcImageInBox(this.image.naturalWidth, this.image.naturalHeight, 460, 554);\n cropContainer.style.width = w + 'px';\n cropContainer.style.height = h + 'px'; */\n this.show();\n\n this.cropper = resizeableImage(this.image, this.canvas);\n this.input.value = '';\n };\n });\n }, false);\n\n this.btnConfirm.className = 'btn-primary btn-color-primary btn-circle btn-crop btn-icon tgico-check z-depth-1';\n attachClickEvent(this.btnConfirm, () => {\n this.cropper.crop();\n this.hide();\n\n this.canvas.toBlob((blob) => {\n this.blob = blob; // save blob to send after reg\n this.darkenCanvas();\n this.resolve();\n }, 'image/jpeg', 1);\n }, {listenerSetter: this.listenerSetter});\n\n this.container.append(this.cropContainer, this.btnConfirm, this.input);\n\n this.addEventListener('closeAfterTimeout', () => {\n this.cropper.removeHandlers();\n if(this.image) {\n this.image.remove();\n }\n });\n }\n\n private resolve() {\n this.onCrop(() => {\n return appDownloadManager.upload(this.blob);\n });\n }\n\n public open(postCanvas: HTMLCanvasElement, onCrop: PopupAvatar['onCrop']) {\n this.canvas = postCanvas;\n this.onCrop = onCrop;\n\n this.input.click();\n }\n\n public darkenCanvas() {\n const ctx = this.canvas.getContext('2d');\n ctx.fillStyle = 'rgba(0, 0, 0, 0.3)';\n ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nfunction resizeableImage(originalImage: HTMLImageElement, canvas?: HTMLCanvasElement) {\n let cropComponent: HTMLDivElement,\n container: HTMLDivElement,\n cropImage: HTMLImageElement,\n event_state: Partial<{\n mouse_x: number,\n mouse_y: number,\n container_width: number,\n container_height: number,\n container_left: number,\n container_top: number\n }> = {},\n keyZoomValue = 4.0,\n MINWIDTH = 50,\n MINHEIGHT = 50,\n CROPWIDTH = 200,\n CROPHEIGHT = 200,\n cropLeft = 0,\n cropTop = 0,\n cropWidth = 0,\n cropHeight = 0,\n scaledRatio = 0;\n\n if(originalImage.complete) init();\n else originalImage.onload = init;\n\n function removeHandlers() {\n container.removeEventListener('mousedown', startMoving);\n container.removeEventListener('touchstart', startMoving);\n container.removeEventListener('wheel', resizing);\n\n document.removeEventListener('mouseup', endMoving);\n document.removeEventListener('touchend', endMoving);\n document.removeEventListener('mousemove', moving);\n document.removeEventListener('touchmove', moving);\n document.removeEventListener('keypress', keyHandler);\n\n cropComponent.remove();\n container.remove();\n cropImage.remove();\n }\n\n function addHandlers() {\n container.addEventListener('mousedown', startMoving, false);\n container.addEventListener('touchstart', startMoving, false);\n container.addEventListener('wheel', resizing, false);\n\n document.addEventListener('keypress', keyHandler, false);\n // document.querySelector('.btn-crop').addEventListener('click', openCropCanvasImg);\n }\n\n function init() {\n originalImage.classList.add('crop-blur');\n originalImage.draggable = false;\n\n cropImage = new Image();\n cropImage.src = originalImage.src;\n cropImage.draggable = false;\n cropImage.classList.add('crop-overlay-image');\n\n if(!canvas) {\n canvas = document.createElement('canvas');\n }\n\n cropComponent = document.createElement('div');\n cropComponent.classList.add('crop-component');\n\n container = document.createElement('div');\n container.classList.add('crop-overlay');\n\n const overlayColor = document.createElement('div');\n overlayColor.classList.add('crop-overlay-color');\n\n cropComponent.appendChild(container);\n const wrapper = originalImage.parentNode as HTMLElement;\n wrapper.appendChild(cropComponent);\n cropComponent.appendChild(cropImage);\n cropComponent.appendChild(originalImage);\n cropComponent.appendChild(overlayColor);\n container.appendChild(cropImage);\n\n cropImage.style.maxWidth = originalImage.width + 'px';\n\n scaledRatio = originalImage.naturalWidth / originalImage.offsetWidth;\n\n const left = originalImage.offsetWidth / 2 - CROPWIDTH / 2;\n const top = originalImage.offsetHeight / 2 - CROPHEIGHT / 2;\n\n updateCropSize(CROPWIDTH, CROPHEIGHT);\n updateCropImage(left, top);\n updateContainer(left, top);\n addHandlers();\n // crop();\n }\n\n function updateCropSize(width: number, height: number) {\n cropWidth = width * scaledRatio;\n cropHeight = height * scaledRatio;\n\n container.style.width = width + 'px';\n container.style.height = height + 'px';\n }\n\n function updateCropImage(left: number, top: number) {\n cropTop = top * scaledRatio;\n cropLeft = left * scaledRatio;\n\n cropImage.style.top = -top + 'px';\n cropImage.style.left = -left + 'px';\n }\n\n function updateContainer(left: number, top: number) {\n container.style.top = top + 'px';\n container.style.left = left + 'px';\n }\n\n // Save the initial event details and container state\n function saveEventState(e: any) {\n event_state.container_width = container.offsetWidth;\n event_state.container_height = container.offsetHeight;\n\n event_state.container_left = container.offsetLeft;\n event_state.container_top = container.offsetTop;\n\n event_state.mouse_x = (e.clientX || e.pageX || e.touches && e.touches[0].clientX) + window.scrollX;\n event_state.mouse_y = (e.clientY || e.pageY || e.touches && e.touches[0].clientY) + window.scrollY;\n }\n\n function imgZoom(zoom: number) {\n zoom = zoom * Math.PI * 2\n let newWidth = Math.floor(container.clientWidth + zoom),\n newHeight = Math.floor(container.clientHeight + zoom),\n w = cropImage.clientWidth,\n h = cropImage.clientHeight,\n left: number,\n top: number,\n right: number,\n bottom: number;\n\n if(newWidth < MINWIDTH) {\n return;\n } else if(newWidth > w) {\n return;\n }\n\n left = container.offsetLeft - (zoom / 2);\n top = container.offsetTop - (zoom / 2);\n right = left + newWidth;\n bottom = top + newHeight;\n\n if(left < 0) left = 0;\n if(top < 0) top = 0;\n\n if(right > w) return;\n if(bottom > h) return;\n\n updateCropSize(newWidth, newWidth);\n updateCropImage(left, top);\n updateContainer(left, top);\n // crop();\n }\n\n function keyHandler(e: KeyboardEvent) {\n e.preventDefault();\n\n switch(String.fromCharCode(e.charCode)) {\n case '+':\n imgZoom(keyZoomValue);\n break;\n case '-':\n imgZoom(-keyZoomValue);\n break;\n }\n }\n\n function resizing(e: any) {\n e.preventDefault();\n imgZoom(e.deltaY > 0 ? 1 : -1);\n }\n\n function startMoving(e: MouseEvent | TouchEvent) {\n e.preventDefault();\n e.stopPropagation();\n\n saveEventState(e);\n\n document.addEventListener('mousemove', moving);\n document.addEventListener('touchmove', moving);\n document.addEventListener('mouseup', endMoving);\n document.addEventListener('touchend', endMoving);\n }\n\n function endMoving(e: MouseEvent | TouchEvent) {\n e.preventDefault();\n\n document.removeEventListener('mouseup', endMoving);\n document.removeEventListener('touchend', endMoving);\n document.removeEventListener('mousemove', moving);\n document.removeEventListener('touchmove', moving);\n }\n\n function moving(e: any) {\n let currentTouch = {x: 0, y: 0},\n left: number,\n top: number,\n w: number,\n h: number;\n\n e.preventDefault();\n e.stopPropagation();\n\n currentTouch.x = e.pageX || e.touches && e.touches[0].pageX;\n currentTouch.y = e.pageY || e.touches && e.touches[0].pageY;\n\n left = currentTouch.x - (event_state.mouse_x - event_state.container_left);\n top = currentTouch.y - (event_state.mouse_y - event_state.container_top);\n w = container.offsetWidth;\n h = container.offsetHeight;\n\n if(left < 0) left = 0;\n else if(left > cropImage.offsetWidth - w) left = cropImage.offsetWidth - w;\n\n if(top < 0) top = 0;\n else if(top > cropImage.offsetHeight - h) top = cropImage.offsetHeight - h;\n\n updateCropImage(left, top);\n updateContainer(left, top);\n // crop();\n }\n\n function crop() {\n canvas.width = cropWidth;\n canvas.height = cropHeight;\n\n const ctx = canvas.getContext('2d');\n ctx.drawImage(originalImage,\n cropLeft, cropTop,\n cropWidth, cropHeight,\n 0, 0,\n cropWidth, cropHeight\n );\n }\n\n return {crop, removeHandlers};\n}\n\nexport default resizeableImage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport type {PeerType} from '../../lib/appManagers/appPeersManager';\nimport {FormatterArguments, LangPackKey} from '../../lib/langPack';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\n\nexport default class PopupDeleteDialog {\n constructor(\n private peerId: PeerId,\n // actionType: 'leave' | 'delete',\n private peerType?: PeerType,\n private onSelect?: (promise: Promise) => void,\n private threadId?: number\n ) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, peerType, onSelect, threadId} = this;\n const peerTitleElement = await wrapPeerTitle({peerId, threadId: threadId});\n\n const managers = PopupElement.MANAGERS;\n if(peerType === undefined) {\n peerType = await managers.appPeersManager.getDialogType(peerId);\n }\n\n /* const callbackFlush = (checked: PopupPeerButtonCallbackCheckboxes) => {\n const promise = appMessagesManager.flushHistory(peerId, checkboxes ? !checked[checkboxes[0].text] : undefined);\n onSelect && onSelect(promise);\n }; */\n\n const callbackLeave = (checked: PopupPeerButtonCallbackCheckboxes, flush = checkboxes && !!checked.size) => {\n let promise = managers.appChatsManager.leave(peerId.toChatId());\n\n if(flush) {\n promise = promise.then(() => {\n return managers.appMessagesManager.flushHistory(peerId);\n }) as any;\n }\n\n onSelect?.(promise);\n };\n\n const callbackDelete = (checked: PopupPeerButtonCallbackCheckboxes) => {\n let promise: Promise;\n\n if(threadId) {\n promise = managers.appMessagesManager.flushHistory(peerId, false, true, threadId);\n } else if(peerId.isUser()) {\n promise = managers.appMessagesManager.flushHistory(peerId, false, checkboxes ? !!checked.size : undefined);\n } else {\n if(checked.size) {\n promise = managers.appChatsManager.delete(peerId.toChatId());\n } else {\n return callbackLeave(checked);\n }\n }\n\n onSelect?.(promise);\n };\n\n let title: LangPackKey,\n titleArgs: FormatterArguments,\n description: LangPackKey,\n descriptionArgs: FormatterArguments,\n buttons: PopupPeerOptions['buttons'],\n checkboxes: PopupPeerOptions['checkboxes'];\n switch(peerType) {\n case 'channel': {\n if(/* actionType === 'delete' && */await managers.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n title = 'ChannelDeleteMenu';\n description = 'AreYouSureDeleteAndExitChannel';\n buttons = [{\n langKey: 'ChannelDeleteMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChannelForAll'\n }];\n } else {\n title = 'LeaveChannelMenu';\n description = 'ChannelLeaveAlertWithName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'LeaveChannel',\n isDanger: true,\n callback: callbackLeave\n }];\n }\n\n break;\n }\n\n /* case 'megagroup': {\n title = 'Leave Group?';\n description = `Are you sure you want to leave this group?`;\n buttons = [{\n text: 'LEAVE ' + peerTitleElement,\n isDanger: true,\n callback: callbackLeave\n }];\n\n break;\n } */\n\n case 'chat': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatWithUser';\n descriptionArgs = [peerTitleElement];\n\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteMessagesOptionAlso',\n textArgs: [\n await wrapPeerTitle({peerId})\n ]\n }];\n\n break;\n }\n\n case 'saved': {\n title = 'DeleteChatUser';\n description = 'AreYouSureDeleteThisChatSavedMessages';\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: callbackDelete\n }];\n\n break;\n }\n\n case 'megagroup':\n case 'group': {\n if(threadId) {\n title = 'DeleteTopics';\n titleArgs = [1];\n description = 'DeleteSelectedTopic';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'Delete',\n isDanger: true,\n callback: callbackDelete\n }];\n } else if(/* actionType === 'delete' && */await managers.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat')) {\n title = 'DeleteMegaMenu';\n description = 'AreYouSureDeleteAndExit';\n buttons = [{\n langKey: 'DeleteMegaMenu',\n isDanger: true,\n callback: callbackDelete\n }];\n\n checkboxes = [{\n text: 'DeleteChat.DeleteGroupForAll'\n }];\n } else {\n title = 'LeaveMegaMenu';\n description = 'AreYouSureDeleteAndExitName';\n descriptionArgs = [peerTitleElement];\n buttons = [{\n langKey: 'DeleteChatUser',\n isDanger: true,\n callback: (checkboxes) => callbackLeave(checkboxes, true)\n }];\n }\n\n break;\n }\n }\n\n new PopupPeer('popup-delete-chat', {\n peerId,\n threadId,\n titleLangKey: title,\n titleLangArgs: titleArgs,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n }).show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../lib/rootScope';\nimport PopupElement, {addCancelButton} from '.';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\nimport {ChatType} from '../chat/chat';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport hasRights from '../../lib/appManagers/utils/chats/hasRights';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport wrapPeerTitle from '../wrappers/peerTitle';\n\nexport default class PopupDeleteMessages {\n constructor(\n private peerId: PeerId,\n private mids: number[],\n private type: ChatType,\n private onConfirm?: () => void,\n private threadId?: number\n ) {\n this.construct();\n }\n\n private async construct() {\n let {peerId, mids, type, onConfirm, threadId} = this;\n\n const peerTitleElement = await wrapPeerTitle({peerId, threadId});\n\n const managers = PopupElement.MANAGERS;\n\n mids = mids.slice();\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, revoke?: boolean) => {\n onConfirm && onConfirm();\n if(type === 'scheduled') {\n managers.appMessagesManager.deleteScheduledMessages(peerId, mids);\n } else {\n managers.appMessagesManager.deleteMessages(peerId, mids, !!checked.size || revoke);\n }\n };\n\n const buttons: PopupPeerOptions['buttons'] = [{\n langKey: 'Delete',\n isDanger: true,\n callback\n }];\n const checkboxes: PopupPeerOptions['checkboxes'] = [];\n let title: LangPackKey, titleArgs: any[], description: LangPackKey, descriptionArgs: any[];\n if(mids.length === 1) {\n title = 'DeleteSingleMessagesTitle';\n } else {\n title = 'DeleteMessagesTitle';\n titleArgs = [i18n('messages', [mids.length])];\n }\n\n if(await managers.appPeersManager.isMegagroup(peerId)) {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessageMega' : 'AreYouSureDeleteFewMessagesMega';\n } else {\n description = mids.length === 1 ? 'AreYouSureDeleteSingleMessage' : 'AreYouSureDeleteFewMessages';\n }\n\n if(peerId === rootScope.myId || type === 'scheduled') {\n\n } else {\n if(peerId.isUser()) {\n checkboxes.push({\n text: 'DeleteMessagesOptionAlso',\n textArgs: [peerTitleElement]\n });\n } else {\n const chat = await managers.appChatsManager.getChat(peerId.toChatId());\n\n const _hasRights = hasRights(chat, 'delete_messages');\n if(chat._ === 'chat') {\n const canRevoke = _hasRights ? mids.slice() : await filterAsync(mids, async(mid) => {\n const message = await managers.appMessagesManager.getMessageByPeer(peerId, mid);\n return message.fromId === rootScope.myId;\n });\n\n if(canRevoke.length) {\n if(canRevoke.length === mids.length) {\n checkboxes.push({\n text: 'DeleteForAll'\n });\n } else {\n checkboxes.push({\n text: 'DeleteMessagesOption'\n });\n\n description = 'DeleteMessagesTextGroup';\n descriptionArgs = [i18n('messages', [canRevoke.length])];\n // description = `You can also delete the ${canRevoke.length} message${canRevoke.length > 1 ? 's' : ''} you sent from the inboxes of other group members by pressing \"${buttonText}\".`;\n }\n }\n } else {\n buttons[0].callback = (checked) => callback(checked, true);\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n threadId,\n titleLangKey: title,\n titleLangArgs: titleArgs,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport {toastNew} from '../toast';\nimport PopupPickUser from './pickUser';\n\nexport default class PopupForward extends PopupPickUser {\n constructor(\n peerIdMids: {[fromPeerId: PeerId]: number[]},\n onSelect?: (peerId: PeerId) => Promise | void,\n overrideOnSelect = false\n ) {\n super({\n peerTypes: ['dialogs', 'contacts'],\n onSelect: overrideOnSelect ? onSelect : async(peerId) => {\n if(onSelect) {\n const res = onSelect(peerId);\n if(res instanceof Promise) {\n await res;\n }\n }\n\n if(peerId === rootScope.myId) {\n let count = 0;\n for(const fromPeerId in peerIdMids) {\n const mids = peerIdMids[fromPeerId];\n count += mids.length;\n this.managers.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), mids);\n }\n\n toastNew({\n langPackKey: count > 0 ? 'FwdMessagesToSavedMessages' : 'FwdMessageToSavedMessages'\n });\n\n return;\n }\n\n appImManager.setInnerPeer({peerId});\n appImManager.chat.input.initMessagesForward(peerIdMids);\n },\n placeholder: 'ShareModal.Search.ForwardPlaceholder',\n chatRightsAction: 'send_messages',\n selfPresence: 'ChatYourSelf'\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ripple from '../ripple';\nimport animationIntersector from '../animationIntersector';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {i18n, LangPackKey, _i18n} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport EventListenerBase, {EventListenerListeners} from '../../helpers/eventListenerBase';\nimport {addFullScreenListener, getFullScreenElement} from '../../helpers/dom/fullScreen';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport Scrollable from '../scrollable';\nimport {getMiddleware, MiddlewareHelper} from '../../helpers/middleware';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\n\nexport type PopupButton = {\n text?: string,\n callback?: () => void,\n langKey?: LangPackKey,\n langArgs?: any[],\n isDanger?: boolean,\n isCancel?: boolean,\n element?: HTMLButtonElement,\n noRipple?: boolean\n};\n\nexport type PopupOptions = Partial<{\n closable: boolean,\n overlayClosable: boolean,\n withConfirm: LangPackKey | boolean,\n body: boolean,\n confirmShortcutIsSendShortcut: boolean,\n withoutOverlay: boolean,\n scrollable: boolean,\n buttons: Array,\n title: boolean | LangPackKey,\n titleRaw: string\n}>;\n\nexport interface PopupElementConstructable {\n new(...args: any[]): T;\n}\n\nconst DEFAULT_APPEND_TO = document.body;\nlet appendPopupTo = DEFAULT_APPEND_TO;\n\nconst onFullScreenChange = () => {\n appendPopupTo = getFullScreenElement() || DEFAULT_APPEND_TO;\n PopupElement.reAppend();\n};\n\naddFullScreenListener(DEFAULT_APPEND_TO, onFullScreenChange);\n\ntype PopupListeners = {\n close: () => void,\n closeAfterTimeout: () => void\n};\n\nexport default class PopupElement extends EventListenerBase {\n private static POPUPS: PopupElement[] = [];\n public static MANAGERS: AppManagers;\n\n protected element = document.createElement('div');\n protected container = document.createElement('div');\n protected header = document.createElement('div');\n protected title = document.createElement('div');\n protected btnClose: HTMLElement;\n protected btnConfirm: HTMLButtonElement;\n protected body: HTMLElement;\n protected buttonsEl: HTMLElement;\n\n protected onEscape: () => boolean = () => true;\n\n protected navigationItem: NavigationItem;\n\n protected listenerSetter: ListenerSetter;\n\n protected confirmShortcutIsSendShortcut: boolean;\n protected btnConfirmOnEnter: HTMLElement;\n\n protected withoutOverlay: boolean;\n\n protected managers: AppManagers;\n\n protected scrollable: Scrollable;\n\n protected buttons: Array;\n\n protected middlewareHelper: MiddlewareHelper;\n\n constructor(className: string, options: PopupOptions = {}) {\n super(false);\n this.element.classList.add('popup');\n this.element.className = 'popup' + (className ? ' ' + className : '');\n this.container.classList.add('popup-container', 'z-depth-1');\n\n this.header.classList.add('popup-header');\n\n if(options.title || options.titleRaw) {\n this.title.classList.add('popup-title');\n if(typeof(options.title) === 'string') {\n _i18n(this.title, options.title);\n } else if(options.titleRaw) {\n this.title.append(wrapEmojiText(options.titleRaw));\n }\n\n this.header.append(this.title);\n }\n\n this.middlewareHelper = getMiddleware();\n this.listenerSetter = new ListenerSetter();\n this.managers = PopupElement.MANAGERS;\n\n this.confirmShortcutIsSendShortcut = options.confirmShortcutIsSendShortcut;\n\n if(options.closable) {\n this.btnClose = document.createElement('span');\n this.btnClose.classList.add('btn-icon', 'popup-close', 'tgico-close');\n // ripple(this.closeBtn);\n this.header.prepend(this.btnClose);\n\n attachClickEvent(this.btnClose, this.hide, {listenerSetter: this.listenerSetter, once: true});\n }\n\n this.withoutOverlay = options.withoutOverlay;\n if(this.withoutOverlay) {\n this.element.classList.add('no-overlay');\n }\n\n if(options.overlayClosable) {\n attachClickEvent(this.element, (e: MouseEvent) => {\n if(!findUpClassName(e.target, 'popup-container')) {\n this.hide();\n }\n }, {listenerSetter: this.listenerSetter});\n }\n\n if(options.withConfirm) {\n this.btnConfirm = document.createElement('button');\n this.btnConfirm.classList.add('btn-primary', 'btn-color-primary');\n if(options.withConfirm !== true) {\n this.btnConfirm.append(i18n(options.withConfirm));\n }\n this.header.append(this.btnConfirm);\n ripple(this.btnConfirm);\n }\n\n this.container.append(this.header);\n if(options.body) {\n this.body = document.createElement('div');\n this.body.classList.add('popup-body');\n this.container.append(this.body);\n }\n\n if(options.scrollable) {\n const scrollable = this.scrollable = new Scrollable(this.body);\n this.attachScrollableListeners();\n\n if(!this.body) {\n this.container.insertBefore(scrollable.container, this.header.nextSibling);\n }\n }\n\n let btnConfirmOnEnter = this.btnConfirm;\n const buttons = this.buttons = options.buttons;\n if(buttons?.length) {\n const buttonsDiv = this.buttonsEl = document.createElement('div');\n buttonsDiv.classList.add('popup-buttons');\n\n const buttonsElements = buttons.map((b) => {\n const button = document.createElement('button');\n button.className = 'btn' + (b.isDanger ? ' danger' : ' primary');\n\n if(!b.noRipple) {\n ripple(button);\n }\n\n if(b.text) {\n button.textContent = b.text;\n } else {\n button.append(i18n(b.langKey, b.langArgs));\n }\n\n attachClickEvent(button, () => {\n b.callback?.();\n this.destroy();\n }, {listenerSetter: this.listenerSetter, once: true});\n\n return b.element = button;\n });\n\n if(!btnConfirmOnEnter && buttons.length === 2) {\n const button = buttons.find((button) => !button.isCancel);\n if(button) {\n btnConfirmOnEnter = button.element;\n }\n }\n\n buttonsDiv.append(...buttonsElements);\n this.container.append(buttonsDiv);\n }\n\n this.btnConfirmOnEnter = btnConfirmOnEnter;\n\n this.element.append(this.container);\n\n PopupElement.POPUPS.push(this);\n }\n\n protected attachScrollableListeners(setClassOn?: HTMLElement) {\n return this.scrollable.attachBorderListeners(setClassOn);\n }\n\n protected onContentUpdate() {\n if(this.scrollable) {\n this.scrollable.onAdditionalScroll();\n }\n }\n\n public show() {\n this.navigationItem = {\n type: 'popup',\n onPop: () => this.destroy(),\n onEscape: this.onEscape\n };\n\n appNavigationController.pushItem(this.navigationItem);\n\n blurActiveElement(); // * hide mobile keyboard\n appendPopupTo.append(this.element);\n void this.element.offsetWidth; // reflow\n this.element.classList.add('active');\n\n this.onContentUpdate();\n\n if(!this.withoutOverlay) {\n overlayCounter.isOverlayActive = true;\n animationIntersector.checkAnimations2(true);\n }\n\n // cannot add event instantly because keydown propagation will fire it\n // if(this.btnConfirmOnEnter) {\n setTimeout(() => {\n if(!this.element.classList.contains('active')) {\n return;\n }\n\n this.listenerSetter.add(document.body)('keydown', (e) => {\n if(PopupElement.POPUPS[PopupElement.POPUPS.length - 1] !== this) {\n return;\n }\n\n if(this.confirmShortcutIsSendShortcut ? isSendShortcutPressed(e) : e.key === 'Enter') {\n simulateClickEvent(this.btnConfirmOnEnter);\n cancelEvent(e);\n }\n });\n }, 0);\n // }\n }\n\n public hide = () => {\n appNavigationController.backByItem(this.navigationItem);\n };\n\n protected destroy() {\n this.dispatchEvent('close');\n this.element.classList.add('hiding');\n this.element.classList.remove('active');\n this.listenerSetter.removeAll();\n this.middlewareHelper.destroy();\n\n if(!this.withoutOverlay) {\n overlayCounter.isOverlayActive = false;\n }\n\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n\n indexOfAndSplice(PopupElement.POPUPS, this);\n\n // ! calm\n onFullScreenChange();\n\n setTimeout(() => {\n this.element.remove();\n this.dispatchEvent('closeAfterTimeout');\n this.cleanup();\n this.scrollable?.destroy();\n\n if(!this.withoutOverlay) {\n animationIntersector.checkAnimations2(false);\n }\n }, 150);\n }\n\n public static reAppend() {\n this.POPUPS.forEach((popup) => {\n const {element, container} = popup;\n const parentElement = element.parentElement;\n if(parentElement && parentElement !== appendPopupTo && appendPopupTo !== container) {\n appendPopupTo.append(element);\n }\n });\n }\n\n public static getPopups(popupConstructor: PopupElementConstructable) {\n return this.POPUPS.filter((element) => element instanceof popupConstructor) as T[];\n }\n\n public static createPopup>(ctor: {new(...args: A): T}, ...args: A) {\n const popup = new ctor(...args);\n return popup;\n }\n}\n\nexport const addCancelButton = (buttons: PopupButton[]) => {\n const button = buttons.find((b) => b.isCancel);\n if(!button) {\n buttons.push({\n langKey: 'Cancel',\n isCancel: true\n });\n }\n\n return buttons;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {doubleRaf} from '../../helpers/schedulers';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {LangPackKey, _i18n, i18n} from '../../lib/langPack';\nimport {ApiLimitType} from '../../lib/mtproto/api_methods';\nimport rootScope from '../../lib/rootScope';\nimport PopupPeer from './peer';\n\nconst a: {[type in ApiLimitType]?: {\n title: LangPackKey,\n description: LangPackKey,\n descriptionPremium: LangPackKey,\n descriptionLocked: LangPackKey,\n icon: string\n}} = {\n pin: {\n title: 'LimitReached',\n description: 'LimitReachedPinDialogs',\n descriptionPremium: 'LimitReachedPinDialogsPremium',\n descriptionLocked: 'LimitReachedPinDialogsLocked',\n icon: 'limit_pin'\n },\n folders: {\n title: 'LimitReached',\n description: 'LimitReachedFolders',\n descriptionPremium: 'LimitReachedFoldersPremium',\n descriptionLocked: 'LimitReachedFoldersLocked',\n icon: 'limit_folders'\n }\n};\n\nclass P extends PopupPeer {\n constructor(options: {\n isPremium: boolean,\n limit: number,\n limitPremium: number\n }, _a: typeof a[keyof typeof a]) {\n super('popup-limit', {\n buttons: options.isPremium === undefined ? [{\n langKey: 'LimitReached.Ok',\n isCancel: true\n }] : (options.isPremium ? [{\n langKey: 'OK',\n isCancel: true\n }] : [{\n langKey: 'IncreaseLimit',\n callback: () => {\n appImManager.openPremiumBot();\n },\n noRipple: true\n }, {\n langKey: 'Cancel',\n isCancel: true\n }]),\n descriptionLangKey: options.isPremium === undefined ? _a.descriptionLocked : (options.isPremium ? _a.descriptionPremium : _a.description),\n descriptionLangArgs: options.isPremium ? [options.limitPremium] : [options.limit, options.limitPremium],\n titleLangKey: _a.title\n });\n\n const isLocked = options.isPremium === undefined;\n if(isLocked) {\n this.element.classList.add('is-locked');\n } else if(options.isPremium) {\n this.element.classList.add('is-premium');\n } else {\n const button = this.buttons.find((b) => !b.isCancel);\n button.element.classList.add('popup-limit-button');\n const i = document.createElement('i');\n i.classList.add('popup-limit-button-icon', 'tgico-premium_double');\n button.element.append(i);\n }\n\n const limitContainer = document.createElement('div');\n limitContainer.classList.add('popup-limit-line');\n\n const hint = document.createElement('div');\n hint.classList.add('popup-limit-hint');\n const i = document.createElement('span');\n i.classList.add('popup-limit-hint-icon', 'tgico-' + _a.icon);\n hint.append(i, '' + (options.isPremium ? options.limitPremium : options.limit));\n\n limitContainer.append(hint);\n\n if(!isLocked) {\n const limit = document.createElement('div');\n limit.classList.add('limit-line');\n\n const free = document.createElement('div');\n free.classList.add('limit-line-free');\n\n const premium = document.createElement('div');\n premium.classList.add('limit-line-premium');\n\n limit.append(free, premium);\n\n _i18n(free, 'LimitFree');\n premium.append(i18n('LimitPremium'), '' + options.limitPremium);\n\n limitContainer.append(limit);\n }\n\n this.container.insertBefore(limitContainer, this.description);\n\n // if(options.isPremium === false) {\n // this.buttons.pop().element.remove();\n // }\n\n const setHintActive = () => {\n hint.classList.add('active');\n };\n\n if(rootScope.settings.animationsEnabled) {\n doubleRaf().then(setHintActive);\n } else {\n setHintActive();\n }\n }\n}\n\nexport default async function showLimitPopup(type: keyof typeof a) {\n const _a = a[type];\n const [appConfig, limit, limitPremium] = await Promise.all([\n rootScope.managers.apiManager.getAppConfig(),\n ...[false, true].map((v) => rootScope.managers.apiManager.getLimit(type, v))\n ]);\n const isLocked = appConfig.premium_purchase_blocked;\n new P({\n isPremium: isLocked ? undefined : rootScope.premium,\n limit,\n limitPremium\n }, _a).show();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport tsNow from '../../helpers/tsNow';\nimport {LangPackKey} from '../../lib/langPack';\nimport {MUTE_UNTIL} from '../../lib/mtproto/mtproto_config';\nimport {RadioFormFromValues} from '../row';\nimport PopupPeer from './peer';\n\nconst ONE_HOUR = 3600;\nconst times: {value: number | string, langPackKey: LangPackKey, checked?: boolean}[] = [{\n value: ONE_HOUR,\n langPackKey: 'ChatList.Mute.1Hour'\n}, {\n value: ONE_HOUR * 4,\n langPackKey: 'ChatList.Mute.4Hours'\n}, {\n value: ONE_HOUR * 8,\n langPackKey: 'ChatList.Mute.8Hours'\n}, {\n value: ONE_HOUR * 24,\n langPackKey: 'ChatList.Mute.1Day'\n}, {\n value: ONE_HOUR * 24 * 3,\n langPackKey: 'ChatList.Mute.3Days'\n}, {\n value: -1,\n langPackKey: 'ChatList.Mute.Forever',\n checked: true\n}];\n\nexport default class PopupMute extends PopupPeer {\n constructor(peerId: PeerId, threadId?: number) {\n super('popup-mute', {\n peerId,\n titleLangKey: 'Notifications',\n buttons: [{\n langKey: 'ChatList.Context.Mute',\n callback: () => {\n this.managers.appMessagesManager.mutePeer({peerId, muteUntil: time === -1 ? MUTE_UNTIL : tsNow(true) + time, threadId});\n }\n }],\n body: true\n });\n\n let time: number;\n const radioForm = RadioFormFromValues(times, (value) => {\n time = +value;\n });\n\n this.body.append(radioForm);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarElement from '../avatar';\nimport PopupElement, {addCancelButton, PopupButton, PopupOptions} from '.';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport CheckboxField, {CheckboxFieldOptions} from '../checkboxField';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\n\nexport type PopupPeerButton = Omit & Partial<{callback: PopupPeerButtonCallback}>;\nexport type PopupPeerButtonCallbackCheckboxes = Set;\nexport type PopupPeerButtonCallback = (checkboxes?: PopupPeerButtonCallbackCheckboxes) => void;\nexport type PopupPeerCheckboxOptions = CheckboxFieldOptions & {checkboxField?: CheckboxField};\n\nexport type PopupPeerOptions = Omit & Partial<{\n peerId: PeerId,\n threadId: number,\n title: string | HTMLElement,\n titleLangKey: LangPackKey,\n titleLangArgs: any[],\n noTitle: boolean,\n description: string | DocumentFragment,\n descriptionLangKey: LangPackKey,\n descriptionLangArgs: any[],\n buttons: Array,\n checkboxes: Array\n}>;\nexport default class PopupPeer extends PopupElement {\n protected description: HTMLParagraphElement;\n\n constructor(private className: string, options: PopupPeerOptions = {}) {\n super('popup-peer' + (className ? ' ' + className : ''), {\n overlayClosable: true,\n ...options,\n title: true,\n buttons: options.buttons && addCancelButton(options.buttons)\n });\n\n if(options.peerId) {\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('avatar-32');\n avatarEl.updateWithOptions({\n isDialog: true,\n peerId: options.peerId,\n threadId: options.threadId,\n wrapOptions: {\n middleware: this.middlewareHelper.get()\n }\n });\n this.header.prepend(avatarEl);\n }\n\n if(!options.noTitle) {\n if(options.titleLangKey || !options.title) this.title.append(i18n(options.titleLangKey || 'AppName', options.titleLangArgs));\n else if(options.title instanceof HTMLElement) {\n this.title.append(options.title);\n } else this.title.innerText = options.title || '';\n }\n\n const fragment = document.createDocumentFragment();\n\n if(options.descriptionLangKey || options.description) {\n const p = this.description = document.createElement('p');\n p.classList.add('popup-description');\n if(options.descriptionLangKey) p.append(i18n(options.descriptionLangKey, options.descriptionLangArgs));\n else if(options.description) setInnerHTML(p, options.description);\n\n fragment.append(p);\n }\n\n if(options.checkboxes) {\n this.container.classList.add('have-checkbox');\n\n options.checkboxes.forEach((o) => {\n o.withRipple = true;\n const checkboxField = new CheckboxField(o);\n o.checkboxField = checkboxField;\n fragment.append(checkboxField.label);\n });\n\n options.buttons.forEach((button) => {\n if(button.callback) {\n const original = button.callback;\n button.callback = () => {\n const c: Set = new Set();\n options.checkboxes.forEach((o) => {\n if(o.checkboxField.checked) {\n c.add(o.text);\n }\n });\n original(c);\n };\n }\n });\n }\n\n this.container.insertBefore(fragment, this.header.nextElementSibling);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport AppSelectPeers from '../appSelectPeers';\nimport PopupElement from '.';\nimport {LangPackKey, _i18n} from '../../lib/langPack';\n\nexport default class PopupPickUser extends PopupElement {\n protected selector: AppSelectPeers;\n\n constructor(options: {\n peerTypes: AppSelectPeers['peerType'],\n onSelect?: (peerId: PeerId) => Promise | void,\n placeholder: LangPackKey,\n chatRightsAction?: AppSelectPeers['chatRightsAction'],\n peerId?: number,\n selfPresence?: LangPackKey\n }) {\n super('popup-forward', {closable: true, overlayClosable: true, body: true, title: true});\n\n this.selector = new AppSelectPeers({\n appendTo: this.body,\n onChange: async() => {\n const selected = this.selector.getSelected();\n const peerId = selected[selected.length - 1].toPeerId();\n\n if(options.onSelect) {\n const res = options.onSelect(peerId);\n if(res instanceof Promise) {\n try {\n await res;\n } catch(err) {\n return;\n }\n }\n }\n\n this.selector = null;\n this.hide();\n },\n peerType: options.peerTypes,\n onFirstRender: () => {\n this.show();\n this.selector.checkForTriggers(); // ! due to zero height before mounting\n\n if(!IS_TOUCH_SUPPORTED) {\n this.selector.input.focus();\n }\n },\n chatRightsAction: options.chatRightsAction,\n multiSelect: false,\n rippleEnabled: false,\n avatarSize: 'abitbigger',\n peerId: options.peerId,\n placeholder: options.placeholder,\n selfPresence: options.selfPresence,\n managers: this.managers\n });\n\n this.scrollable = this.selector.scrollable;\n this.attachScrollableListeners();\n\n // this.scrollable = new Scrollable(this.body);\n\n this.title.append(this.selector.input);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupPeer from './peer';\n\nexport default class PopupSendNow extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-delete-chat', {\n title: `Send Message${mids.length > 1 ? 's' : ''} Now`,\n description: mids.length > 1 ? 'Send ' + mids.length + ' messages now?' : 'Send message now?',\n buttons: [{\n langKey: 'Send',\n callback: () => {\n onConfirm && onConfirm();\n this.managers.appMessagesManager.sendScheduledMessages(peerId, mids);\n }\n }]\n });\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppStickersManager} from '../../lib/appManagers/appStickersManager';\nimport PopupElement from '.';\nimport wrapSticker from '../wrappers/sticker';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport {putPreloader} from '../putPreloader';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {i18n} from '../../lib/langPack';\nimport Button from '../button';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {toastNew} from '../toast';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport createStickersContextMenu from '../../helpers/dom/createStickersContextMenu';\nimport attachStickerViewerListeners from '../stickerViewer';\nimport {Document, StickerSet} from '../../layer';\nimport Row from '../row';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport rootScope from '../../lib/rootScope';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport emoticonsDropdown from '../emoticonsDropdown';\n\nconst ANIMATION_GROUP: AnimationItemGroup = 'STICKERS-POPUP';\n\nexport default class PopupStickers extends PopupElement {\n private stickersFooter: HTMLElement;\n private appendTo: HTMLElement;\n private updateAdded: {[setId: Long]: (added: boolean) => void};\n private sets: StickerSet.stickerSet[];\n private button: HTMLElement;\n\n constructor(\n private stickerSetInput: Parameters[0] | Parameters[0][],\n private isEmojis?: boolean\n ) {\n super('popup-stickers', {closable: true, overlayClosable: true, body: true, scrollable: true, title: true});\n\n this.title.append(i18n('Loading'));\n this.updateAdded = {};\n\n emoticonsDropdown.setIgnoreMouseOut('popup', true);\n this.addEventListener('close', () => {\n emoticonsDropdown.setIgnoreMouseOut('popup', false);\n animationIntersector.setOnlyOnePlayableGroup();\n });\n\n this.appendTo = this.scrollable.container;\n\n this.appendTo.classList.add('is-loading');\n putPreloader(this.appendTo, true);\n\n this.stickersFooter = document.createElement('div');\n this.stickersFooter.classList.add('sticker-set-footer');\n\n const btn = Button('btn-primary btn-primary-transparent disable-hover', {noRipple: true, text: 'Loading'});\n this.stickersFooter.append(btn);\n\n this.body.append(this.stickersFooter);\n\n attachStickerViewerListeners({listenTo: this.appendTo, listenerSetter: this.listenerSetter});\n\n const onStickerSetUpdate = (set: StickerSet.stickerSet) => {\n const idx = this.sets.findIndex((_set) => _set.id === set.id);\n if(idx === -1) {\n return;\n }\n\n this.sets[idx] = set;\n const updateAdded = this.updateAdded[set.id];\n updateAdded?.(!!set.installed_date);\n this.updateButton();\n };\n\n this.listenerSetter.add(rootScope)('stickers_installed', onStickerSetUpdate);\n this.listenerSetter.add(rootScope)('stickers_deleted', onStickerSetUpdate);\n\n this.loadStickerSet();\n }\n\n private createStickerSetElements(set?: StickerSet.stickerSet) {\n const container = document.createElement('div');\n container.classList.add('sticker-set');\n\n let headerRow: Row, updateAdded: (added: boolean) => void;\n if(set) {\n headerRow = new Row({\n title: wrapEmojiText(set.title),\n subtitle: i18n(set.pFlags.emojis ? 'EmojiCount' : 'Stickers', [set.count]),\n buttonRight: true\n });\n\n updateAdded = (added) => {\n replaceContent(headerRow.buttonRight, i18n(added ? 'Stickers.SearchAdded' : 'Stickers.SearchAdd'));\n headerRow.buttonRight.classList.toggle('active', added);\n };\n\n updateAdded(!!set.installed_date);\n\n container.append(headerRow.container);\n }\n\n const itemsContainer = document.createElement('div');\n itemsContainer.classList.add('sticker-set-stickers');\n\n container.append(itemsContainer);\n\n return {container, headerRow, updateAdded, itemsContainer};\n }\n\n private onStickersClick = async(e: MouseEvent) => {\n const target = findUpClassName(e.target, 'sticker-set-sticker');\n if(!target) return;\n\n const docId = target.dataset.docId;\n if(await appImManager.chat.input.sendMessageWithDocument(docId)) {\n this.hide();\n }\n };\n\n private async loadStickerSet() {\n const middleware = this.middlewareHelper.get();\n const inputs = Array.isArray(this.stickerSetInput) ? this.stickerSetInput : [this.stickerSetInput];\n const setsPromises = inputs.map((input) => this.managers.appStickersManager.getStickerSet(input));\n let sets = await Promise.all(setsPromises);\n if(!middleware()) return;\n let firstSet = sets[0];\n if(sets.length === 1 && !firstSet) {\n toastNew({langPackKey: this.isEmojis ? 'AddEmojiNotFound' : 'StickerSet.DontExist'});\n this.hide();\n return;\n }\n\n sets = sets.filter(Boolean);\n firstSet = sets[0];\n\n this.sets = sets.map((set) => set.set);\n\n const isEmojis = this.isEmojis ??= !!firstSet.set.pFlags.emojis;\n\n if(!isEmojis) {\n attachClickEvent(this.appendTo, this.onStickersClick, {listenerSetter: this.listenerSetter});\n\n const {destroy} = createStickersContextMenu({\n listenTo: this.appendTo,\n isStickerPack: true,\n onSend: () => this.hide()\n });\n\n this.addEventListener('close', destroy);\n }\n\n animationIntersector.setOnlyOnePlayableGroup(ANIMATION_GROUP);\n\n const lazyLoadQueue = new LazyLoadQueue();\n const loadPromises: Promise[] = [];\n\n const containersPromises = sets.map(async(set) => {\n const {container, itemsContainer, headerRow, updateAdded} = this.createStickerSetElements(sets.length > 1 ? set.set : undefined);\n\n if(headerRow) {\n attachClickEvent(headerRow.buttonRight, () => {\n this.managers.appStickersManager.toggleStickerSet(set.set);\n }, {listenerSetter: this.listenerSetter});\n }\n\n this.updateAdded[set.set.id] = updateAdded;\n\n let divs: (HTMLElement | DocumentFragment)[];\n\n const docs = set.documents.filter((doc) => doc?._ === 'document') as Document.document[];\n if(isEmojis) {\n const fragment = wrapCustomEmoji({\n docIds: docs.map((doc) => doc.id),\n loadPromises,\n animationGroup: ANIMATION_GROUP,\n customEmojiSize: mediaSizes.active.esgCustomEmoji,\n middleware\n // lazyLoadQueue\n });\n\n (Array.from(fragment.children) as HTMLElement[]).slice(1).forEach((element) => {\n const span = document.createElement('span');\n span.classList.add('super-emoji');\n element.replaceWith(span);\n span.append(element);\n });\n\n divs = [fragment];\n\n itemsContainer.classList.replace('sticker-set-stickers', 'super-emojis');\n itemsContainer.classList.add('is-emojis', 'not-local');\n } else {\n divs = await Promise.all(docs.map(async(doc) => {\n const div = document.createElement('div');\n div.classList.add('sticker-set-sticker');\n\n const size = mediaSizes.active.popupSticker.width;\n\n await wrapSticker({\n doc,\n div,\n lazyLoadQueue,\n group: ANIMATION_GROUP,\n play: true,\n loop: true,\n width: size,\n height: size,\n withLock: true,\n loadPromises,\n middleware\n });\n\n return div;\n }));\n }\n\n itemsContainer.append(...divs.filter(Boolean));\n\n return container;\n });\n\n const containers = await Promise.all(containersPromises);\n await Promise.all(loadPromises);\n\n const button = this.button = Button('', {noRipple: true});\n\n this.updateButton();\n\n attachClickEvent(button, () => {\n const toggle = toggleDisability([button], true);\n\n this.managers.appStickersManager.toggleStickerSets(sets.map((set) => set.set)).then(() => {\n this.hide();\n }).catch(() => {\n toggle();\n });\n }, {listenerSetter: this.listenerSetter});\n\n if(sets.length === 1) {\n setInnerHTML(this.title, wrapEmojiText(firstSet.set.title));\n } else {\n setInnerHTML(this.title, i18n('Emoji'));\n }\n\n this.stickersFooter.textContent = '';\n this.stickersFooter.append(button);\n\n this.appendTo.classList.remove('is-loading');\n this.appendTo.textContent = '';\n this.appendTo.append(...containers);\n\n this.scrollable.onAdditionalScroll();\n }\n\n private updateButton() {\n const {sets, isEmojis} = this;\n let isAdd: boolean, buttonAppend: HTMLElement;\n if(sets.length === 1) {\n const firstSet = sets[0];\n buttonAppend = i18n(isEmojis ? 'EmojiCount' : 'Stickers', [firstSet.count]);\n isAdd = !firstSet.installed_date;\n } else {\n const installed = sets.filter((set) => set.installed_date);\n let count: number;\n if(sets.length === installed.length) {\n isAdd = false;\n count = sets.length;\n } else {\n isAdd = true;\n count = sets.length - installed.length;\n }\n\n buttonAppend = i18n('EmojiPackCount', [count]);\n }\n\n this.button.className = isAdd ? 'btn-primary btn-color-primary' : 'btn-primary btn-primary-transparent danger';\n replaceContent(this.button, i18n(isAdd ? 'AddStickersCount' : 'RemoveStickersCount', [buttonAppend]));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {CancellablePromise} from '../helpers/cancellablePromise';\nimport SetTransition from './singleTransition';\nimport {fastRaf} from '../helpers/schedulers';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport safeAssign from '../helpers/object/safeAssign';\n\nconst TRANSITION_TIME = 200;\n\nexport default class ProgressivePreloader {\n public preloader: HTMLDivElement;\n public circle: SVGCircleElement;\n private cancelSvg: SVGSVGElement;\n private downloadSvg: HTMLElement;\n\n private tempId = 0;\n public detached = true;\n\n public promise: CancellablePromise = null;\n\n public isUpload = false;\n private cancelable = true;\n private streamable = false;\n private tryAgainOnFail = true;\n private attachMethod: 'append' | 'prepend' = 'append';\n\n public loadFunc: (e?: Event) => any;\n\n public totalLength: number;\n\n constructor(options?: Partial<{\n isUpload: ProgressivePreloader['isUpload'],\n cancelable: ProgressivePreloader['cancelable'],\n streamable: ProgressivePreloader['streamable'],\n tryAgainOnFail: ProgressivePreloader['tryAgainOnFail'],\n attachMethod: ProgressivePreloader['attachMethod']\n }>) {\n if(options) {\n safeAssign(this, options);\n }\n\n if(this.isUpload) {\n this.tryAgainOnFail = false;\n }\n }\n\n public constructContainer(options: Partial<{\n color: 'transparent',\n bold: boolean\n }> = {}) {\n if(!this.preloader) {\n this.preloader = document.createElement('div');\n this.preloader.classList.add('preloader-container');\n\n if(options.color) {\n this.preloader.classList.add('preloader-' + options.color);\n }\n\n if(options.bold) {\n this.preloader.classList.add('preloader-bold');\n }\n\n if(this.streamable) {\n this.preloader.classList.add('preloader-streamable');\n }\n }\n }\n\n public constructDownloadIcon() {\n this.constructContainer();\n }\n\n public construct() {\n this.construct = null;\n\n this.constructContainer();\n\n this.preloader.innerHTML = `\n
\n \n \n \n
`;\n\n if(this.streamable) {\n this.totalLength = 118.61124420166016;\n } else {\n this.totalLength = 149.82473754882812;\n }\n\n if(this.cancelable) {\n this.preloader.innerHTML += `\n \n \n \n \n \n \n \n \n \n \n \n `;\n\n this.downloadSvg = this.preloader.lastElementChild as HTMLElement;\n this.cancelSvg = this.downloadSvg.previousElementSibling as any;\n } else {\n this.preloader.classList.add('preloader-swing');\n }\n\n this.circle = this.preloader.firstElementChild.firstElementChild.firstElementChild as SVGCircleElement;\n\n if(this.cancelable) {\n attachClickEvent(this.preloader, this.onClick);\n }\n }\n\n public onClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.preloader.classList.contains('manual')) {\n if(this.loadFunc) {\n this.loadFunc(e);\n }\n } else {\n if(this.promise && this.promise.cancel) {\n this.promise.cancel();\n }\n }\n };\n\n public setDownloadFunction(func: ProgressivePreloader['loadFunc']) {\n this.loadFunc = func;\n }\n\n public setManual() {\n this.preloader.classList.add('manual');\n this.setProgress(0);\n }\n\n public attachPromise(promise: CancellablePromise) {\n if(this.isUpload && this.promise) return;\n\n this.promise = promise;\n\n const tempId = --this.tempId;\n const startTime = Date.now();\n\n const onEnd = (err: Error) => {\n promise.notify = promise.notifyAll = null;\n\n if(tempId !== this.tempId) {\n return;\n }\n\n const elapsedTime = Date.now() - startTime;\n\n // console.log('[PP]: end', this.detached, performance.now());\n\n if(!err && this.cancelable) {\n this.setProgress(100);\n\n const delay = TRANSITION_TIME * 0.75;\n\n if(elapsedTime < delay) {\n this.detach();\n } else {\n setTimeout(() => { // * wait for transition complete\n if(tempId === this.tempId) {\n this.detach();\n }\n }, delay);\n }\n } else {\n if(this.tryAgainOnFail) {\n this.attach(this.preloader.parentElement);\n fastRaf(() => {\n this.setManual();\n });\n } else {\n this.detach();\n }\n }\n\n this.promise = promise = null;\n };\n\n promise\n .then(() => onEnd(null))\n .catch((err) => onEnd(err));\n\n if(promise.addNotifyListener) {\n promise.addNotifyListener((details: {done: number, total: number}) => {\n /* if(details.done >= details.total) {\n onEnd();\n } */\n\n if(tempId !== this.tempId) return;\n\n // console.log('preloader download', promise, details);\n const percents = details.done / details.total * 100;\n this.setProgress(percents);\n });\n }\n }\n\n public attach(elem: Element, reset = false, promise?: CancellablePromise) {\n if(this.construct) {\n this.construct();\n }\n\n if(this.preloader.parentElement) {\n this.preloader.classList.remove('manual');\n }\n\n this.detached = false;\n\n if(promise/* && false */) {\n this.attachPromise(promise);\n }\n\n let useRafs = 0;\n if(this.detached || this.preloader.parentElement !== elem) {\n useRafs = isInDOM(this.preloader) ? 1 : 2;\n if(this.preloader.parentElement !== elem) {\n elem[this.attachMethod](this.preloader);\n }\n }\n\n SetTransition({\n element: this.preloader,\n className: 'is-visible',\n forwards: true,\n duration: TRANSITION_TIME,\n useRafs\n });\n\n if(this.cancelable && reset) {\n this.setProgress(0);\n }\n }\n\n public detach() {\n if(this.detached) {\n return;\n }\n // return;\n\n this.detached = true;\n\n // return;\n\n if(this.preloader?.parentElement) {\n /* setTimeout(() => */// fastRaf(() => {\n /* if(!this.detached) return;\n this.detached = true; */\n\n // fastRaf(() => {\n // console.log('[PP]: detach after rAF', this.detached, performance.now());\n\n // if(!this.detached || !this.preloader.parentElement) {\n // return;\n // }\n\n SetTransition({\n element: this.preloader,\n className: 'is-visible',\n forwards: false,\n duration: TRANSITION_TIME,\n onTransitionEnd: () => {\n this.preloader.remove();\n },\n useRafs: 1\n });\n // });\n // })/* , 5e3) */;\n }\n }\n\n public setProgress(percents: number) {\n if(!this.totalLength && !isInDOM(this.circle)) {\n return;\n }\n\n if(percents === 0) {\n this.circle.style.strokeDasharray = '';\n return;\n }\n\n try {\n if(!this.totalLength) {\n this.totalLength = this.circle.getTotalLength();\n }\n\n // console.log('setProgress', (percents / 100 * totalLength));\n this.circle.style.strokeDasharray = '' + Math.max(5, percents / 100 * this.totalLength) + ', ' + this.totalLength;\n } catch(err) {}\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {PeerPhotoSize} from '../lib/appManagers/appAvatarsManager';\nimport getPreviewURLFromBytes from '../helpers/bytes/getPreviewURLFromBytes';\nimport {renderImageFromUrlPromise} from '../helpers/dom/renderImageFromUrl';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {recordPromise} from '../helpers/recordPromise';\nimport sequentialDom from '../helpers/sequentialDom';\nimport {UserProfilePhoto, ChatPhoto, User, Chat} from '../layer';\nimport getPeerColorById from '../lib/appManagers/utils/peers/getPeerColorById';\nimport getPeerPhoto from '../lib/appManagers/utils/peers/getPeerPhoto';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../lib/mtproto/mtproto_config';\nimport wrapAbbreviation from '../lib/richTextProcessor/wrapAbbreviation';\nimport rootScope from '../lib/rootScope';\nimport getPeerInitials from './wrappers/getPeerInitials';\nimport {wrapTopicIcon} from './wrappers/messageActionTextNewUnsafe';\nimport makeError from '../helpers/makeError';\nimport noop from '../helpers/noop';\n\nexport async function putAvatar(\n div: HTMLElement,\n peerId: PeerId,\n photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto,\n size: PeerPhotoSize,\n img = new Image(),\n onlyThumb = false\n) {\n const r = await rootScope.managers.acknowledged.appAvatarsManager.loadAvatar(peerId, photo, size);\n const loadPromise = r.result;\n const cached = r.cached;\n\n img.classList.add('avatar-photo');\n\n let renderThumbPromise: Promise;\n let callback: () => void;\n let thumbImage: HTMLImageElement;\n if(cached) {\n // смотри в misc.ts: renderImageFromUrl\n callback = () => {\n replaceContent(div, img);\n div.dataset.color = '';\n };\n } else {\n const animate = rootScope.settings.animationsEnabled;\n if(animate) {\n img.classList.add('fade-in');\n }\n\n let isFullLoaded = false;\n if(size === 'photo_big') { // let's load small photo first\n const res = await putAvatar(div, peerId, photo, 'photo_small');\n renderThumbPromise = res.loadThumbPromise || res.loadPromise;\n thumbImage = res.thumbImage;\n } else if(photo.stripped_thumb) {\n thumbImage = new Image();\n div.classList.add('avatar-relative');\n thumbImage.classList.add('avatar-photo', 'avatar-photo-thumbnail');\n const url = getPreviewURLFromBytes(photo.stripped_thumb);\n renderThumbPromise = renderImageFromUrlPromise(thumbImage, url).then(() => {\n if(isFullLoaded) {\n return;\n }\n\n replaceContent(div, thumbImage);\n });\n }\n\n callback = () => {\n isFullLoaded = true;\n\n if(thumbImage) {\n div.append(img);\n } else {\n replaceContent(div, img);\n }\n\n setTimeout(() => {\n if(div.childElementCount) {\n sequentialDom.mutateElement(img, () => {\n div.dataset.color = '';\n\n if(animate) {\n img.classList.remove('fade-in');\n }\n\n thumbImage?.remove();\n });\n }\n }, animate ? 200 : 0);\n };\n }\n\n const renderPromise = loadPromise\n .then((url) => renderImageFromUrlPromise(img, url/* , !cached */))\n .then(callback);\n\n renderThumbPromise && await renderThumbPromise.catch(noop);\n\n return {\n cached,\n loadPromise: renderPromise,\n loadThumbPromise: cached ? renderPromise : renderThumbPromise || Promise.resolve(),\n thumbImage\n };\n}\n\nfunction set(\n div: HTMLElement,\n innerHTML: Parameters[1],\n color: string,\n icon?: string,\n isForum?: boolean,\n isTopic?: boolean\n) {\n setInnerHTML(div, innerHTML);\n div.dataset.color = color;\n div.classList.remove('tgico-saved', 'tgico-deletedaccount', 'tgico-reply_filled', 'is-forum', 'is-topic');\n icon && div.classList.add(icon);\n isForum && div.classList.add('is-forum');\n isTopic && div.classList.add('is-topic');\n}\n\n// peerId === peerId || title\nexport default async function putPhoto({\n div,\n peerId,\n isDialog = false,\n title = '',\n onlyThumb = false,\n isBig,\n threadId,\n wrapOptions = {}\n}: {\n div: HTMLElement,\n peerId: PeerId,\n isDialog?: boolean,\n title?: string,\n onlyThumb?: boolean,\n isBig?: boolean,\n threadId?: number,\n wrapOptions?: WrapSomethingOptions\n}) {\n const myId = rootScope.myId;\n\n if(peerId === myId && isDialog) {\n set(div, '', '', 'tgico-saved');\n return;\n }\n\n const managers = rootScope.managers;\n\n if(threadId) {\n const topic = await managers.dialogsStorage.getForumTopic(peerId, threadId);\n set(div, '', '', undefined, undefined, true);\n\n if(wrapOptions.customEmojiSize) {\n div.style.setProperty('--size', wrapOptions.customEmojiSize.width + 'px');\n }\n\n return wrapTopicIcon({\n ...wrapOptions,\n topic,\n lazyLoadQueue: false\n }).then((icon) => {\n div.replaceChildren(icon);\n });\n }\n\n const peer = await managers.appPeersManager.getPeer(peerId);\n if(peerId !== NULL_PEER_ID && peerId.isUser() && (peer as User.user)?.pFlags?.deleted) {\n set(div, '', getPeerColorById(peerId), 'tgico-deletedaccount');\n return;\n }\n\n const isForum = !!(peer as Chat.channel)?.pFlags?.forum;\n const size: PeerPhotoSize = isBig ? 'photo_big' : 'photo_small';\n const photo = getPeerPhoto(peer);\n const avatarAvailable = !!photo;\n const avatarRendered = !!div.firstElementChild && !(div.firstElementChild as HTMLElement).classList.contains('emoji');\n if(!avatarAvailable || !avatarRendered || !(await managers.appAvatarsManager.isAvatarCached(peerId, size))) {\n let color = '';\n if(peerId && (peerId !== myId || !isDialog)) {\n color = getPeerColorById(peerId);\n }\n\n if(peerId === REPLIES_PEER_ID) {\n set(div, '', color, 'tgico-reply_filled');\n return;\n }\n\n const abbr = title ? wrapAbbreviation(title) : getPeerInitials(peer);\n set(div, abbr, color, '', isForum);\n // return Promise.resolve(true);\n }\n\n if(avatarAvailable/* && false */) {\n const promise = putAvatar(div, peerId, photo, size, undefined, onlyThumb);\n // recordPromise(promise, 'putAvatar-' + peerId);\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Chat, User} from '../../layer';\nimport wrapAbbreviation from '../../lib/richTextProcessor/wrapAbbreviation';\n\nexport default function getPeerInitials(peer: Chat | User) {\n let str = '';\n if(peer) {\n str = (peer as Chat.chat).title ?? [\n (peer as User.user).first_name,\n (peer as User.user).last_name\n ].filter(Boolean).join(' ');\n }\n\n return wrapAbbreviation(str);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\n\nexport function putPreloader(elem: Element, returnDiv = false): HTMLElement {\n const html = `\n \n \n `;\n\n if(returnDiv) {\n const div = document.createElement('div');\n div.classList.add('preloader');\n div.innerHTML = html;\n\n if(elem) {\n elem.appendChild(div);\n }\n\n return div;\n }\n\n elem.insertAdjacentHTML('beforeend', html);\n return elem.lastElementChild as HTMLElement;\n}\n\nMOUNT_CLASS_TO.putPreloader = putPreloader;\n\nexport function setButtonLoader(elem: HTMLButtonElement, icon = 'check') {\n elem.classList.remove('tgico-' + icon);\n elem.disabled = true;\n putPreloader(elem);\n\n return () => {\n elem.innerHTML = '';\n elem.classList.add('tgico-' + icon);\n elem.removeAttribute('disabled');\n };\n}\n\n/* export function parseMenuButtonsTo(to: {[name: string]: HTMLElement}, elements: HTMLCollection | NodeListOf) {\n Array.from(elements).forEach((el) => {\n const match = el.className.match(/(?:^|\\s)menu-(.+?)(?:$|\\s)/);\n if(!match) return;\n to[match[1]] = el as HTMLElement;\n });\n} */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getDeepProperty from '../helpers/object/getDeepProperty';\nimport {LangPackKey, _i18n} from '../lib/langPack';\nimport apiManagerProxy from '../lib/mtproto/mtprotoworker';\nimport rootScope from '../lib/rootScope';\n\nexport default class RadioField {\n public input: HTMLInputElement;\n public label: HTMLLabelElement;\n public main: HTMLElement;\n\n constructor(options: {\n text?: string,\n langKey?: LangPackKey,\n name: string,\n value?: string,\n stateKey?: string,\n alignRight?: boolean\n }) {\n const label = this.label = document.createElement('label');\n label.classList.add('radio-field');\n\n if(options.alignRight) {\n label.classList.add('radio-field-right');\n }\n\n const input = this.input = document.createElement('input');\n input.type = 'radio';\n /* input.id = */input.name = 'input-radio-' + options.name;\n\n if(options.value) {\n input.value = options.value;\n\n if(options.stateKey) {\n apiManagerProxy.getState().then((state) => {\n input.checked = getDeepProperty(state, options.stateKey) === options.value;\n });\n\n input.addEventListener('change', () => {\n rootScope.managers.appStateManager.setByKey(options.stateKey, options.value);\n });\n }\n }\n\n const main = this.main = document.createElement('div');\n main.classList.add('radio-field-main');\n\n if(options.text) {\n main.innerHTML = options.text;\n /* const caption = document.createElement('div');\n caption.classList.add('radio-field-main-caption');\n caption.innerHTML = text;\n\n if(subtitle) {\n label.classList.add('radio-field-with-subtitle');\n caption.insertAdjacentHTML('beforeend', `
${subtitle}
`);\n }\n\n main.append(caption); */\n } else if(options.langKey) {\n _i18n(main, options.langKey);\n }\n\n label.append(input, main);\n }\n\n get checked() {\n return this.input.checked;\n }\n\n set checked(checked: boolean) {\n this.setValueSilently(checked);\n\n const event = new Event('change', {bubbles: true, cancelable: true});\n this.input.dispatchEvent(event);\n }\n\n public setValueSilently(checked: boolean) {\n this.input.checked = checked;\n }\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function RadioForm(radios: {container: HTMLElement, input: HTMLInputElement}[], onChange: (value: string, event: Event) => void) {\n const form = document.createElement('form');\n\n radios.forEach((r) => {\n const {container, input} = r;\n form.append(container);\n input.addEventListener('change', (e) => {\n if(input.checked) {\n onChange(input.value, e);\n }\n });\n });\n\n return form;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport attachGrabListeners, {GrabEvent} from '../helpers/dom/attachGrabListeners';\nimport clamp from '../helpers/number/clamp';\nimport safeAssign from '../helpers/object/safeAssign';\n\nexport default class RangeSelector {\n public container: HTMLDivElement;\n protected filled: HTMLDivElement;\n protected seek: HTMLInputElement;\n\n public mousedown = false;\n protected rect: DOMRect;\n protected _removeListeners: () => void;\n\n private events: Partial<{\n // onMouseMove: ProgressLine['onMouseMove'],\n onMouseDown: RangeSelector['onMouseDown'],\n onMouseUp: RangeSelector['onMouseUp'],\n onScrub: (value: number) => void\n }> = {};\n\n protected decimals: number;\n\n protected step: number;\n protected min: number;\n protected max: number;\n protected withTransition = false;\n protected useTransform = false;\n protected vertical = false;\n\n constructor(\n options: {\n step: RangeSelector['step'],\n min: RangeSelector['min'],\n max: RangeSelector['max'],\n withTransition?: RangeSelector['withTransition'],\n useTransform?: RangeSelector['useTransform'],\n vertical?: RangeSelector['vertical']\n },\n value = 0\n ) {\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('progress-line');\n\n // there is no sense in using transition with transform, because it is updating every frame\n if(this.useTransform) {\n this.container.classList.add('use-transform');\n } else if(this.withTransition) {\n this.container.classList.add('with-transition');\n }\n\n this.filled = document.createElement('div');\n this.filled.classList.add('progress-line__filled');\n\n const seek = this.seek = document.createElement('input');\n seek.classList.add('progress-line__seek');\n // seek.setAttribute('max', '0');\n seek.type = 'range';\n seek.step = '' + this.step;\n seek.min = '' + this.min;\n seek.max = '' + this.max;\n seek.value = '' + value;\n\n if(value) {\n this.setProgress(value);\n }\n\n const stepStr = '' + this.step;\n const index = stepStr.indexOf('.');\n this.decimals = index === -1 ? 0 : stepStr.length - index - 1;\n\n // this.setListeners();\n\n this.container.append(this.filled, seek);\n }\n\n get value() {\n return +this.seek.value;\n }\n\n public setHandlers(events: RangeSelector['events']) {\n this.events = events;\n }\n\n protected onMouseMove = (event: GrabEvent) => {\n this.scrub(event);\n };\n\n protected onMouseDown = (event: GrabEvent) => {\n this.rect = this.container.getBoundingClientRect();\n this.mousedown = true;\n this.scrub(event);\n this.container.classList.add('is-focused');\n this.events?.onMouseDown && this.events.onMouseDown(event);\n };\n\n protected onMouseUp = (event: GrabEvent) => {\n this.mousedown = false;\n this.container.classList.remove('is-focused');\n this.events?.onMouseUp && this.events.onMouseUp(event);\n };\n\n public setListeners() {\n this.seek.addEventListener('input', this.onInput);\n this._removeListeners = attachGrabListeners(this.container, this.onMouseDown, this.onMouseMove, this.onMouseUp);\n }\n\n public onInput = () => {\n const value = +this.seek.value;\n this.setFilled(value);\n this.events?.onScrub && this.events.onScrub(value);\n };\n\n public setProgress(value: number) {\n this.seek.value = '' + value;\n this.setFilled(+this.seek.value); // clamp\n }\n\n public addProgress(value: number) {\n this.seek.value = '' + (+this.seek.value + value);\n this.setFilled(+this.seek.value); // clamp\n }\n\n public setFilled(value: number) {\n let percents = (value - this.min) / (this.max - this.min);\n percents = clamp(percents, 0, 1);\n\n // using scaleX and width even with vertical because it will be rotated\n if(this.useTransform) {\n this.filled.style.transform = `scaleX(${percents})`;\n } else {\n this.filled.style.width = (percents * 100) + '%';\n }\n }\n\n protected scrub(event: GrabEvent) {\n const rectMax = this.vertical ? this.rect.height : this.rect.width;\n const offsetAxisValue = clamp(this.vertical ? -(event.y - this.rect.bottom) : event.x - this.rect.left, 0, rectMax);\n\n let value = this.min + (offsetAxisValue / rectMax * (this.max - this.min));\n\n if((value - this.min) < ((this.max - this.min) / 2)) {\n value -= this.step / 10;\n }\n\n value = +value.toFixed(this.decimals);\n value = clamp(value, this.min, this.max);\n\n // this.seek.value = '' + value;\n // this.onInput();\n\n this.setProgress(value);\n this.events?.onScrub && this.events.onScrub(value);\n\n return value;\n }\n\n public removeListeners() {\n if(this._removeListeners) {\n this._removeListeners();\n this._removeListeners = null;\n }\n\n this.seek.removeEventListener('input', this.onInput);\n\n this.events = {};\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport sequentialDom from '../helpers/sequentialDom';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport rootScope from '../lib/rootScope';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport {fastRaf} from '../helpers/schedulers';\n\nlet rippleClickId = 0;\nexport default function ripple(\n elem: HTMLElement,\n callback: (id: number) => Promise = () => Promise.resolve(),\n onEnd: (id: number) => void = null,\n prepend = false,\n attachListenerTo = elem\n) {\n // return;\n if(elem.querySelector('.c-ripple')) return;\n elem.classList.add('rp');\n\n const r = document.createElement('div');\n r.classList.add('c-ripple');\n\n const isSquare = elem.classList.contains('rp-square');\n if(isSquare) {\n r.classList.add('is-square');\n }\n\n elem[prepend ? 'prepend' : 'append'](r);\n\n let handler: () => void;\n // let animationEndPromise: Promise;\n const drawRipple = (clientX: number, clientY: number) => {\n const startTime = Date.now();\n const circle = document.createElement('div');\n\n const clickId = rippleClickId++;\n\n // console.log('ripple drawRipple');\n\n // const auto = elem.classList.contains('row-sortable') && !elem.classList.contains('cant-sort');\n const auto = false;\n const duration = (auto ? .3 : +window.getComputedStyle(r).getPropertyValue('--ripple-duration').replace('s', '')) * 1000;\n // console.log('ripple duration', duration);\n\n const _handler = handler = () => {\n // handler = () => animationEndPromise.then((duration) => {\n // console.log('ripple animation was:', duration);\n\n // const duration = isSquare || mediaSizes.isMobile ? 200 : 700;\n // return;\n const elapsedTime = Date.now() - startTime;\n const cb = () => {\n // console.log('ripple elapsedTime total pre-remove:', Date.now() - startTime);\n sequentialDom.mutate(() => {\n circle.remove();\n });\n\n onEnd?.(clickId);\n };\n if(elapsedTime < duration) {\n const delay = Math.max(duration - elapsedTime, duration / 2);\n setTimeout(() => circle.classList.add('hiding'), Math.max(delay - duration / 2, 0));\n\n setTimeout(cb, delay);\n } else {\n circle.classList.add('hiding');\n setTimeout(cb, duration / 2);\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n window.removeEventListener('contextmenu', handler);\n window.removeEventListener('mousemove', handler);\n }\n\n handler = null;\n touchStartFired = false;\n };\n // });\n\n callback?.(clickId);\n\n /* callback().then((bad) => {\n if(bad) {\n span.remove();\n return;\n } */\n\n // console.log('ripple after promise', Date.now() - startTime);\n // console.log('ripple tooSlow:', tooSlow);\n /* if(tooSlow) {\n span.remove();\n return;\n } */\n\n fastRaf(() => {\n if(_handler !== handler) {\n return;\n }\n\n const rect = r.getBoundingClientRect();\n circle.classList.add('c-ripple__circle');\n\n const clickX = clientX - rect.left;\n const clickY = clientY - rect.top;\n\n const radius = Math.sqrt((Math.abs(clickY - rect.height / 2) + rect.height / 2) ** 2 + (Math.abs(clickX - rect.width / 2) + rect.width / 2) ** 2);\n const size = radius;\n\n // center of circle\n const x = clickX - size / 2;\n const y = clickY - size / 2;\n\n // console.log('ripple click', offsetFromCenter, size, clickX, clickY);\n\n circle.style.width = circle.style.height = size + 'px';\n circle.style.left = x + 'px';\n circle.style.top = y + 'px';\n\n // нижний код выполняется с задержкой\n /* animationEndPromise = new Promise((resolve) => {\n span.addEventListener('animationend', () => {\n // 713 -> 700\n resolve(((Date.now() - startTime) / 100 | 0) * 100);\n }, {once: true});\n }); */\n\n // нижний код не всегда включает анимацию ПРИ КЛИКЕ НА ТАЧПАД БЕЗ ТАПТИК ЭНЖИНА\n /* span.style.display = 'none';\n r.append(span);\n duration = +window.getComputedStyle(span).getPropertyValue('animation-duration').replace('s', '') * 1000;\n span.style.display = ''; */\n\n r.append(circle);\n\n if(auto) {\n // window.addEventListener('mousemove', handler, {once: true, passive: true});\n handler();\n }\n\n // r.classList.add('active');\n // handler();\n });\n // });\n };\n\n const isRippleUnneeded = (e: Event) => e.target !== elem && (\n ['BUTTON', 'A'].includes((e.target as HTMLElement).tagName) ||\n findUpClassName(e.target as HTMLElement, 'c-ripple') !== r\n ) && (\n attachListenerTo === elem ||\n !findUpAsChild(e.target as HTMLElement, attachListenerTo)\n );\n\n // TODO: rename this variable\n let touchStartFired = false;\n if(IS_TOUCH_SUPPORTED) {\n const touchEnd = () => {\n handler?.();\n };\n\n attachListenerTo.addEventListener('touchstart', (e) => {\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n\n // console.log('ripple touchstart', e);\n if(e.touches.length > 1 || touchStartFired || isRippleUnneeded(e)) {\n return;\n }\n\n // console.log('touchstart', e);\n touchStartFired = true;\n\n const {clientX, clientY} = e.touches[0];\n drawRipple(clientX, clientY);\n attachListenerTo.addEventListener('touchend', touchEnd, {once: true});\n\n window.addEventListener('touchmove', (e) => {\n e.cancelBubble = true;\n e.stopPropagation();\n touchEnd();\n attachListenerTo.removeEventListener('touchend', touchEnd);\n }, {once: true});\n }, {passive: true});\n } else {\n attachListenerTo.addEventListener('mousedown', (e) => {\n if(![0, 2].includes(e.button)) { // only left and right buttons\n return;\n }\n\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n // console.log('ripple mousedown', e, e.target, findUpClassName(e.target as HTMLElement, 'c-ripple') === r);\n\n if(attachListenerTo.dataset.ripple === '0' || isRippleUnneeded(e)) {\n return;\n } else if(touchStartFired) {\n touchStartFired = false;\n return;\n }\n\n const {clientX, clientY} = e;\n drawRipple(clientX, clientY);\n window.addEventListener('mouseup', handler, {once: true, passive: true});\n window.addEventListener('contextmenu', handler, {once: true, passive: true});\n }, {passive: true});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CheckboxField, {CheckboxFieldOptions} from './checkboxField';\nimport RadioField from './radioField';\nimport ripple from './ripple';\nimport {SliderSuperTab} from './slider';\nimport RadioForm from './radioForm';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport setInnerHTML, {setDirection} from '../helpers/dom/setInnerHTML';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport Button from './button';\nimport createContextMenu from '../helpers/dom/createContextMenu';\n\ntype K = string | HTMLElement | DocumentFragment | true;\n\nconst setContent = (element: HTMLElement, content: K) => {\n if(content === true) {\n\n } else if(typeof(content) === 'string') {\n setInnerHTML(element, content);\n } else {\n element.append(content);\n }\n};\n\nexport type RowMediaSizeType = 'small' | 'medium' | 'big' | 'abitbigger' | 'bigger';\n\nexport default class Row {\n public container: HTMLElement;\n public title: HTMLElement;\n public titleRow: HTMLElement;\n public titleRight: HTMLElement;\n public media: HTMLElement;\n\n public subtitleRow: HTMLElement;\n public subtitleRight: HTMLElement;\n\n public checkboxField: CheckboxField;\n public radioField: RadioField;\n\n public freezed = false;\n\n public buttonRight: HTMLElement;\n\n private _subtitle: HTMLElement;\n private _midtitle: HTMLElement;\n\n constructor(options: Partial<{\n icon: string,\n subtitle: K,\n subtitleLangKey: LangPackKey,\n subtitleLangArgs: any[],\n subtitleRight: K,\n radioField: Row['radioField'],\n checkboxField: Row['checkboxField'],\n checkboxFieldOptions: CheckboxFieldOptions,\n withCheckboxSubtitle: boolean,\n title: K,\n titleLangKey: LangPackKey,\n titleRight: K,\n titleRightSecondary: K,\n clickable: boolean | ((e: Event) => void),\n navigationTab: SliderSuperTab,\n havePadding: boolean,\n noRipple: boolean,\n noWrap: boolean,\n listenerSetter: ListenerSetter,\n buttonRight?: HTMLElement | boolean,\n buttonRightLangKey: LangPackKey,\n asLink: boolean,\n contextMenu: Omit[0], 'findElement' | 'listenTo' | 'listenerSetter'>\n }> = {}) {\n if(options.checkboxFieldOptions) {\n options.checkboxField = new CheckboxField({\n listenerSetter: options.listenerSetter,\n ...options.checkboxFieldOptions\n });\n }\n\n const tagName = options.asLink ? 'a' : (options.radioField || options.checkboxField ? 'label' : 'div');\n this.container = document.createElement(tagName);\n this.container.classList.add('row', 'no-subtitle');\n\n if(options.noWrap) {\n this.container.classList.add('no-wrap');\n }\n\n if(options.subtitle) {\n const subtitle = this.subtitle;\n setContent(subtitle, options.subtitle);\n\n if(options.noWrap) subtitle.classList.add('no-wrap');\n\n if(options.subtitleRight) {\n this.container.append(this.subtitleRow = this.createRow());\n this.subtitleRow.classList.add('row-subtitle-row');\n const subtitleRight = this.subtitleRight = document.createElement('div');\n subtitleRight.classList.add('row-subtitle', 'row-subtitle-right');\n\n setContent(subtitleRight, options.subtitleRight);\n this.subtitleRow.append(subtitle, subtitleRight);\n }\n } else if(options.subtitleLangKey) {\n this.subtitle.append(i18n(options.subtitleLangKey, options.subtitleLangArgs));\n }\n\n let havePadding = !!options.havePadding;\n if(options.radioField || options.checkboxField) {\n if(options.radioField) {\n this.radioField = options.radioField;\n this.container.append(this.radioField.label);\n havePadding = true;\n }\n\n if(options.checkboxField) {\n this.checkboxField = options.checkboxField;\n\n const isToggle = options.checkboxField.label.classList.contains('checkbox-field-toggle');\n if(isToggle) {\n this.container.classList.add('row-with-toggle');\n options.titleRight = this.checkboxField.label;\n } else {\n havePadding = true;\n this.container.append(this.checkboxField.label);\n }\n\n if(options.withCheckboxSubtitle && !isToggle) {\n const onChange = () => {\n replaceContent(this.subtitle, i18n(this.checkboxField.input.checked ? 'Checkbox.Enabled' : 'Checkbox.Disabled'));\n };\n\n if(options.listenerSetter) options.listenerSetter.add(this.checkboxField.input)('change', onChange);\n else this.checkboxField.input.addEventListener('change', onChange);\n }\n }\n\n const i = options.radioField || options.checkboxField;\n i.label.classList.add('disable-hover');\n }\n\n if(options.title || options.titleLangKey) {\n let c: HTMLElement;\n const titleRightContent = options.titleRight || options.titleRightSecondary;\n if(titleRightContent) {\n this.container.append(c = this.titleRow = this.createRow());\n this.titleRow.classList.add('row-title-row');\n } else {\n c = this.container;\n }\n\n this.title = this.createTitle();\n if(options.noWrap) this.title.classList.add('no-wrap');\n if(options.title) {\n setContent(this.title, options.title);\n } else if(options.titleLangKey) {\n this.title.append(i18n(options.titleLangKey));\n }\n\n c.append(this.title);\n\n if(titleRightContent) {\n const titleRight = this.titleRight = document.createElement('div');\n titleRight.classList.add('row-title', 'row-title-right');\n\n if(options.titleRightSecondary) {\n titleRight.classList.add('row-title-right-secondary');\n }\n\n setContent(titleRight, titleRightContent);\n c.append(titleRight);\n }\n }\n\n if(options.icon) {\n havePadding = true;\n // this.title.classList.add('tgico', 'tgico-' + options.icon);\n this.container.classList.add('tgico', 'tgico-' + options.icon);\n this.container.classList.add('row-with-icon');\n }\n\n if(havePadding) {\n this.container.classList.add('row-with-padding');\n }\n\n if(options.navigationTab) {\n options.clickable = () => options.navigationTab.open();\n }\n\n if(options.clickable || options.radioField || options.checkboxField) {\n if(typeof(options.clickable) === 'function') {\n attachClickEvent(this.container, (e) => {\n if(this.freezed) return;\n (options.clickable as any)(e);\n }, {listenerSetter: options.listenerSetter});\n }\n\n this.container.classList.add('row-clickable', 'hover-effect');\n\n if(!options.noRipple) {\n ripple(this.container, undefined, undefined, true);\n }\n\n /* if(options.radioField || options.checkboxField) {\n this.container.prepend(this.container.lastElementChild);\n } */\n }\n\n if(options.buttonRight || options.buttonRightLangKey) {\n this.buttonRight = options.buttonRight instanceof HTMLElement ?\n options.buttonRight :\n Button('btn-primary btn-color-primary', {text: options.buttonRightLangKey});\n this.container.append(this.buttonRight);\n }\n\n if(options.contextMenu) {\n createContextMenu({\n ...options.contextMenu,\n listenTo: this.container,\n listenerSetter: options.listenerSetter\n });\n }\n }\n\n public get subtitle() {\n return this._subtitle ??= this.createSubtitle();\n }\n\n public get midtitle() {\n return this._midtitle ??= this.createMidtitle();\n }\n\n private createRow() {\n const c = document.createElement('div');\n c.classList.add('row-row');\n return c;\n }\n\n private createTitle() {\n const title = document.createElement('div');\n title.classList.add('row-title');\n setDirection(title);\n return title;\n }\n\n private createSubtitle() {\n const subtitle = document.createElement('div');\n subtitle.classList.add('row-subtitle');\n setDirection(subtitle);\n if(this.title) this.title.after(subtitle);\n else this.container.prepend(subtitle);\n this.container.classList.remove('no-subtitle');\n return subtitle;\n }\n\n private createMidtitle() {\n const midtitle = document.createElement('div');\n midtitle.classList.add('row-midtitle');\n this.subtitle.parentElement.insertBefore(midtitle, this.subtitle);\n return midtitle;\n }\n\n public createMedia(size?: RowMediaSizeType) {\n const media = document.createElement('div');\n return this.applyMediaElement(media, size);\n }\n\n public applyMediaElement(media: HTMLElement, size?: RowMediaSizeType) {\n this.container.classList.add('row-with-padding');\n\n this.media = media;\n media.classList.add('row-media');\n\n if(size) {\n media.classList.add('row-media-' + size);\n }\n\n this.container.append(media);\n\n return media;\n }\n\n public disableWithPromise(promise: Promise) {\n this.container.classList.add('is-disabled');\n promise.finally(() => {\n this.container.classList.remove('is-disabled');\n });\n }\n\n public makeSortable() {\n const sortIcon = document.createElement('span');\n this.container.classList.add('row-sortable', 'tgico');\n sortIcon.classList.add('row-sortable-icon', 'tgico-menu');\n this.container.append(sortIcon);\n }\n\n public toggleSorting(enabled?: boolean) {\n this.container.classList.toggle('cant-sort', !enabled);\n }\n}\n\nexport const CreateRowFromCheckboxField = (checkboxField: CheckboxField) => {\n return new Row({checkboxField, listenerSetter: checkboxField.listenerSetter});\n};\n\nexport const RadioFormFromRows = (rows: Row[], onChange: (value: string) => void) => {\n return RadioForm(rows.map((r) => ({container: r.container, input: r.radioField.input})), onChange);\n};\n\nexport const RadioFormFromValues = (values: {langPackKey: LangPackKey, value: number | string, checked?: boolean}[], onChange: Parameters[1]) => {\n const name = 'name-' + (Math.random() * 0x7FFFFF | 0);\n let checkedRadioField: RadioField;\n const rows = values.map(({langPackKey, value, checked}) => {\n const row = new Row({\n radioField: new RadioField({\n langKey: langPackKey,\n name,\n value: '' + value\n })\n });\n\n if(checked) {\n checkedRadioField = row.radioField;\n }\n\n return row;\n });\n\n const form = RadioFormFromRows(rows, onChange);\n if(checkedRadioField) {\n checkedRadioField.checked = true;\n }\n return form;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {logger, LogTypes} from '../lib/logger';\nimport fastSmoothScroll, {ScrollOptions} from '../helpers/fastSmoothScroll';\nimport useHeavyAnimationCheck from '../hooks/useHeavyAnimationCheck';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {IS_ANDROID} from '../environment/userAgent';\n/*\nvar el = $0;\nvar height = 0;\nvar checkUp = false;\n\ndo {\n height += el.scrollHeight;\n} while(el = (checkUp ? el.previousElementSibling : el.nextElementSibling));\nconsole.log(height);\n*/\n\n/*\nArray.from($0.querySelectorAll('.bubble-content')).forEach((_el) => {\n //_el.style.display = '';\n //return;\n\n let el = _el.parentElement;\n let height = el.scrollHeight;\n let width = el.scrollWidth;\n el.style.width = width + 'px';\n el.style.height = height + 'px';\n _el.style.display = 'none';\n});\n*/\n\n/* const scrollables: Map = new Map();\nconst scrollsIntersector = new IntersectionObserver((entries) => {\n for(let entry of entries) {\n const scrollable = scrollables.get(entry.target as HTMLElement);\n\n if(entry.isIntersecting) {\n scrollable.isVisible = true;\n } else {\n scrollable.isVisible = false;\n\n if(!isInDOM(entry.target)) {\n scrollsIntersector.unobserve(scrollable.container);\n scrollables.delete(scrollable.container);\n }\n }\n }\n}); */\n\nconst SCROLL_THROTTLE = /* IS_ANDROID ? 200 : */24;\n\nexport class ScrollableBase {\n protected log: ReturnType;\n\n public splitUp: HTMLElement;\n public onScrollMeasure: number = 0;\n\n public lastScrollPosition: number = 0;\n public lastScrollDirection: number = 0;\n\n public onAdditionalScroll: () => void;\n public onScrolledTop: () => void;\n public onScrolledBottom: () => void;\n\n public isHeavyAnimationInProgress = false;\n protected needCheckAfterAnimation = false;\n\n public checkForTriggers?: () => void;\n\n public scrollProperty: 'scrollTop' | 'scrollLeft';\n\n protected removeHeavyAnimationListener: () => void;\n protected addedScrollListener: boolean;\n\n constructor(public el?: HTMLElement, logPrefix = '', public container: HTMLElement = document.createElement('div')) {\n this.container.classList.add('scrollable');\n\n this.log = logger('SCROLL' + (logPrefix ? '-' + logPrefix : ''), LogTypes.Error);\n\n if(el) {\n Array.from(el.children).forEach((c) => this.container.append(c));\n\n el.append(this.container);\n }\n // this.onScroll();\n }\n\n public addScrollListener() {\n if(this.addedScrollListener) {\n return;\n }\n\n this.addedScrollListener = true;\n this.container.addEventListener('scroll', this.onScroll, {passive: true, capture: true});\n }\n\n public removeScrollListener() {\n if(!this.addedScrollListener) {\n return;\n }\n\n this.addedScrollListener = false;\n this.container.removeEventListener('scroll', this.onScroll, {capture: true});\n }\n\n public setListeners() {\n if(this.removeHeavyAnimationListener) {\n return;\n }\n\n window.addEventListener('resize', this.onScroll, {passive: true});\n this.addScrollListener();\n\n this.removeHeavyAnimationListener = useHeavyAnimationCheck(() => {\n this.isHeavyAnimationInProgress = true;\n\n if(this.onScrollMeasure) {\n this.cancelMeasure();\n this.needCheckAfterAnimation = true;\n }\n }, () => {\n this.isHeavyAnimationInProgress = false;\n\n if(this.needCheckAfterAnimation) {\n this.onScroll();\n this.needCheckAfterAnimation = false;\n }\n });\n }\n\n public removeListeners() {\n if(!this.removeHeavyAnimationListener) {\n return;\n }\n\n window.removeEventListener('resize', this.onScroll);\n this.removeScrollListener();\n\n this.removeHeavyAnimationListener();\n this.removeHeavyAnimationListener = undefined;\n }\n\n public destroy() {\n this.removeListeners();\n this.onAdditionalScroll = undefined;\n this.onScrolledTop = undefined;\n this.onScrolledBottom = undefined;\n }\n\n public append(element: HTMLElement) {\n this.container.append(element);\n }\n\n public scrollIntoViewNew(options: Omit) {\n // return Promise.resolve();\n // this.removeListeners();\n return fastSmoothScroll({\n ...options,\n container: this.container\n });/* .finally(() => {\n this.setListeners();\n }); */\n }\n\n public onScroll = () => {\n // if(this.debug) {\n // this.log('onScroll call', this.onScrollMeasure);\n // }\n\n // return;\n\n if(this.isHeavyAnimationInProgress) {\n this.cancelMeasure();\n this.needCheckAfterAnimation = true;\n return;\n }\n\n // if(this.onScrollMeasure || ((this.scrollLocked || (!this.onScrolledTop && !this.onScrolledBottom)) && !this.splitUp && !this.onAdditionalScroll)) return;\n if((!this.onScrolledTop && !this.onScrolledBottom) && !this.splitUp && !this.onAdditionalScroll) return;\n if(this.onScrollMeasure) return;\n // if(this.onScrollMeasure) window.cancelAnimationFrame(this.onScrollMeasure);\n // this.onScrollMeasure = window.requestAnimationFrame(() => {\n this.onScrollMeasure = window.setTimeout(() => {\n this.onScrollMeasure = 0;\n\n const scrollPosition = this.container[this.scrollProperty];\n this.lastScrollDirection = this.lastScrollPosition === scrollPosition ? 0 : (this.lastScrollPosition < scrollPosition ? 1 : -1); // * 1 - bottom, -1 - top\n this.lastScrollPosition = scrollPosition;\n\n // lastScrollDirection check is useless here, every callback should decide on its own\n if(this.onAdditionalScroll/* && this.lastScrollDirection !== 0 */) {\n this.onAdditionalScroll();\n }\n\n if(this.checkForTriggers) {\n this.checkForTriggers();\n }\n // });\n }, SCROLL_THROTTLE);\n };\n\n public cancelMeasure() {\n if(this.onScrollMeasure) {\n // window.cancelAnimationFrame(this.onScrollMeasure);\n clearTimeout(this.onScrollMeasure);\n this.onScrollMeasure = 0;\n }\n }\n}\n\nexport type SliceSides = 'top' | 'bottom';\nexport type SliceSidesContainer = {[k in SliceSides]: boolean};\n\nexport default class Scrollable extends ScrollableBase {\n public padding: HTMLElement;\n\n public loadedAll: SliceSidesContainer = {top: true, bottom: false};\n\n constructor(el?: HTMLElement, logPrefix = '', public onScrollOffset = 300, withPaddingContainer?: boolean) {\n super(el, logPrefix);\n\n /* if(withPaddingContainer) {\n this.padding = document.createElement('div');\n this.padding.classList.add('scrollable-padding');\n Array.from(this.container.children).forEach((c) => this.padding.append(c));\n this.container.append(this.padding);\n } */\n\n this.container.classList.add('scrollable-y');\n this.setListeners();\n this.scrollProperty = 'scrollTop';\n }\n\n public attachBorderListeners(setClassOn = this.container) {\n const cb = this.onAdditionalScroll;\n this.onAdditionalScroll = () => {\n cb?.();\n setClassOn.classList.toggle('scrolled-top', !this.scrollTop);\n setClassOn.classList.toggle('scrolled-bottom', this.isScrolledDown);\n };\n\n setClassOn.classList.add('scrolled-top', 'scrolled-bottom', 'scrollable-y-bordered');\n }\n\n public setVirtualContainer(el?: HTMLElement) {\n this.splitUp = el;\n this.log('setVirtualContainer:', el, this);\n }\n\n public checkForTriggers = () => {\n if((!this.onScrolledTop && !this.onScrolledBottom)) return;\n\n if(this.isHeavyAnimationInProgress) {\n this.onScroll();\n return;\n }\n\n const scrollHeight = this.container.scrollHeight;\n if(!scrollHeight) { // незачем вызывать триггеры если блок пустой или не виден\n return;\n }\n\n const clientHeight = this.container.clientHeight;\n const maxScrollTop = scrollHeight - clientHeight;\n const scrollTop = this.lastScrollPosition;\n\n // this.log('checkForTriggers:', scrollTop, maxScrollTop);\n\n if(this.onScrolledTop && scrollTop <= this.onScrollOffset && this.lastScrollDirection <= 0/* && direction === -1 */) {\n this.onScrolledTop();\n }\n\n if(this.onScrolledBottom && (maxScrollTop - scrollTop) <= this.onScrollOffset && this.lastScrollDirection >= 0/* && direction === 1 */) {\n this.onScrolledBottom();\n }\n };\n\n public prepend(...elements: (HTMLElement | DocumentFragment)[]) {\n (this.splitUp || this.padding || this.container).prepend(...elements);\n }\n\n public append(...elements: (HTMLElement | DocumentFragment)[]) {\n (this.splitUp || this.padding || this.container).append(...elements);\n }\n\n public getDistanceToEnd() {\n return this.scrollHeight - Math.round(this.scrollTop + this.container.offsetHeight);\n }\n\n get isScrolledDown() {\n return this.getDistanceToEnd() <= 1;\n }\n\n set scrollTop(y: number) {\n this.container.scrollTop = y;\n }\n\n get scrollTop() {\n // this.log.trace('get scrollTop');\n return this.container.scrollTop;\n }\n\n public setScrollTopSilently(value: number) {\n this.lastScrollPosition = value;\n this.ignoreNextScrollEvent();\n\n this.scrollTop = value;\n }\n\n public ignoreNextScrollEvent() {\n if(this.removeHeavyAnimationListener) {\n this.removeScrollListener();\n this.container.addEventListener('scroll', (e) => {\n cancelEvent(e);\n this.addScrollListener();\n }, {capture: true, passive: false, once: true});\n }\n }\n\n get scrollHeight() {\n return this.container.scrollHeight;\n }\n}\n\nexport class ScrollableX extends ScrollableBase {\n constructor(el: HTMLElement, logPrefix = '', public onScrollOffset = 300, public splitCount = 15, public container: HTMLElement = document.createElement('div')) {\n super(el, logPrefix, container);\n\n this.container.classList.add('scrollable-x');\n\n if(!IS_TOUCH_SUPPORTED) {\n const scrollHorizontally = (e: any) => {\n if(!e.deltaX && this.container.scrollWidth > this.container.clientWidth) {\n this.container.scrollLeft += e.deltaY / 4;\n cancelEvent(e);\n }\n };\n\n this.container.addEventListener('wheel', scrollHorizontally, {passive: false});\n }\n\n this.scrollProperty = 'scrollLeft';\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {LangPackKey, FormatterArguments, i18n_} from '../lib/langPack';\nimport {generateDelimiter} from './generateDelimiter';\nimport Scrollable from './scrollable';\n\nexport type SettingSectionOptions = {\n name?: LangPackKey,\n nameArgs?: FormatterArguments,\n caption?: LangPackKey | true,\n captionArgs?: FormatterArguments,\n captionOld?: SettingSectionOptions['caption'],\n noDelimiter?: boolean,\n fakeGradientDelimiter?: boolean,\n noShadow?: boolean,\n // fullWidth?: boolean,\n // noPaddingTop?: boolean\n};\n\nconst className = 'sidebar-left-section';\nexport default class SettingSection {\n public container: HTMLElement;\n public innerContainer: HTMLElement;\n public content: HTMLElement;\n public title: HTMLElement;\n public caption: HTMLElement;\n\n private fullWidth: boolean;\n\n constructor(options: SettingSectionOptions = {}) {\n const container = this.container = document.createElement('div');\n container.classList.add(className + '-container');\n\n const innerContainer = this.innerContainer = document.createElement('div');\n innerContainer.classList.add(className);\n\n if(options.noShadow) {\n innerContainer.classList.add('no-shadow');\n }\n\n if(options.fakeGradientDelimiter) {\n innerContainer.append(generateDelimiter());\n innerContainer.classList.add('with-fake-delimiter');\n } else if(!options.noDelimiter) {\n const hr = document.createElement('hr');\n innerContainer.append(hr);\n } else {\n innerContainer.classList.add('no-delimiter');\n }\n\n // if(options.fullWidth) {\n // this.fullWidth = true;\n // }\n\n // if(options.noPaddingTop) {\n // innerContainer.classList.add('no-padding-top');\n // }\n\n const content = this.content = this.generateContentElement();\n\n if(options.name) {\n const title = this.title = document.createElement('div');\n title.classList.add('sidebar-left-h2', className + '-name');\n i18n_({element: title, key: options.name, args: options.nameArgs});\n content.append(title);\n }\n\n container.append(innerContainer);\n\n const caption = options.caption ?? options.captionOld;\n if(caption) {\n const el = this.caption = this.generateContentElement();\n el.classList.add(className + '-caption');\n\n if(!options.captionOld) {\n container.append(el);\n }\n\n if(caption !== true) {\n i18n_({element: el, key: caption, args: options.captionArgs});\n }\n }\n }\n\n public generateContentElement() {\n const content = document.createElement('div');\n content.classList.add(className + '-content');\n\n // if(this.fullWidth) {\n // content.classList.add('full-width');\n // }\n\n this.innerContainer.append(content);\n return content;\n }\n}\n\nexport const generateSection = (appendTo: Scrollable, name?: LangPackKey, caption?: LangPackKey) => {\n const section = new SettingSection({name, caption});\n appendTo.append(section.container);\n return section.content;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputFile} from '../../../layer';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport InputField from '../../inputField';\nimport {SliderSuperTab} from '../../slider';\nimport AvatarEdit from '../../avatarEdit';\nimport I18n from '../../../lib/langPack';\nimport ButtonCorner from '../../buttonCorner';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\ninterface OpenStreetMapInterface {\n place_id?: number;\n license?: string;\n osm_type?: string;\n osm_id?: number;\n lat?: string;\n lon?: string;\n display_name: string;\n address?: object;\n boundingbox?: object;\n}\n\nexport default class AppNewGroupTab extends SliderSuperTab {\n private avatarEdit: AvatarEdit;\n private uploadAvatar: () => Promise = null;\n private peerIds: PeerId[];\n private isGeoChat: boolean = false;\n private nextBtn: HTMLButtonElement;\n private groupNameInputField: InputField;\n private list: HTMLUListElement;\n private groupLocationInputField: InputField;\n private userLocationCoords: {lat: number, long: number};\n private userLocationAddress: string;\n\n public init(\n peerIds: PeerId[],\n isGeoChat: boolean = false\n ) {\n this.isGeoChat = isGeoChat;\n this.peerIds = peerIds;\n\n this.container.classList.add('new-group-container');\n this.setTitle('NewGroup');\n\n this.avatarEdit = new AvatarEdit((_upload) => {\n this.uploadAvatar = _upload;\n });\n\n const section = new SettingSection({});\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.groupNameInputField = new InputField({\n label: 'CreateGroup.NameHolder',\n maxLength: 128\n });\n\n this.groupLocationInputField = new InputField({\n label: 'ChatLocation',\n name: 'location',\n canBeEdited: false\n });\n\n inputWrapper.append(\n this.groupNameInputField.container,\n this.groupLocationInputField.container\n );\n\n this.listenerSetter.add(this.groupNameInputField.input)('input', () => {\n const value = this.groupNameInputField.value;\n let valueCheck = !!value.length && !this.groupNameInputField.input.classList.contains('error');\n if(this.isGeoChat) valueCheck = valueCheck && !!this.userLocationCoords && !!this.userLocationAddress;\n this.nextBtn.classList.toggle('is-visible', !!valueCheck);\n });\n\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\n\n attachClickEvent(this.nextBtn, () => {\n const title = this.groupNameInputField.value;\n\n let promise: Promise;\n if(this.isGeoChat) {\n if(!this.userLocationAddress || !this.userLocationCoords) return;\n promise = this.managers.appChatsManager.createChannel({\n title,\n about: '',\n geo_point: {\n _: 'inputGeoPoint',\n ...this.userLocationCoords\n },\n address: this.userLocationAddress,\n megagroup: true\n }).then((chatId) => {\n if(this.uploadAvatar) {\n this.uploadAvatar().then((inputFile) => {\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\n });\n }\n\n if(this.peerIds.length) {\n this.managers.appChatsManager.inviteToChannel(chatId, this.peerIds);\n }\n\n return chatId;\n });\n } else {\n this.nextBtn.disabled = true;\n promise = this.managers.appChatsManager.createChat(title, this.peerIds.map((peerId) => peerId.toUserId())).then((chatId) => {\n if(this.uploadAvatar) {\n this.uploadAvatar().then((inputFile) => {\n this.managers.appChatsManager.editPhoto(chatId, inputFile);\n });\n }\n\n return chatId;\n });\n }\n\n if(!promise) {\n return;\n }\n\n promise.then((chatId) => {\n this.close();\n\n appImManager.setInnerPeer({peerId: chatId.toPeerId(true)});\n });\n }, {listenerSetter: this.listenerSetter});\n\n const chatsSection = new SettingSection({\n name: 'Members',\n nameArgs: [this.peerIds.length]\n });\n\n const list = this.list = appDialogsManager.createChatList({\n new: true\n });\n\n chatsSection.content.append(list);\n\n section.content.append(this.avatarEdit.container, inputWrapper);\n\n this.content.append(this.nextBtn);\n this.scrollable.append(section.container, chatsSection.container);\n\n if(isGeoChat) {\n this.setTitle('NearbyCreateGroup');\n this.groupLocationInputField.container.classList.remove('hide');\n this.groupLocationInputField.setValueSilently(I18n.format('Loading', true));\n this.startLocating();\n } else {\n this.groupLocationInputField.container.classList.add('hide');\n }\n\n return Promise.all(this.peerIds.map(async(userId) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: userId,\n container: this.list,\n rippleEnabled: false,\n avatarSize: 'abitbigger'\n });\n\n dom.lastMessageSpan.append(getUserStatusString(await this.managers.appUsersManager.getUser(userId)));\n }));\n }\n\n public onCloseAfterTimeout() {\n this.avatarEdit.clear();\n this.uploadAvatar = null;\n this.groupNameInputField.value = '';\n this.groupLocationInputField.container.classList.add('hide');\n this.nextBtn.disabled = false;\n }\n\n private startLocating() {\n navigator.geolocation.getCurrentPosition((location) => {\n this.userLocationCoords = {\n lat: location.coords.latitude,\n long: location.coords.longitude\n };\n\n let uri = 'https://nominatim.openstreetmap.org/reverse';\n uri += '?lat='+location.coords.latitude;\n uri += '&lon='+location.coords.longitude;\n uri += '&format=json';\n uri += '&addressdetails=1';\n uri += '&accept-language=en';\n fetch(uri)\n .then((response) => response.json())\n .then((response: OpenStreetMapInterface) => {\n this.userLocationAddress = response.display_name;\n this.groupLocationInputField.setValueSilently(response.display_name);\n });\n }, (error) => {\n if(error instanceof GeolocationPositionError) {\n this.groupLocationInputField.setValueSilently('Location permission denied. Please retry later.');\n } else {\n this.groupLocationInputField.setValueSilently('An error has occurred. Please retry later.');\n }\n });\n }\n}\n","enum PrivacyType {\n Everybody = 2,\n Contacts = 1,\n Nobody = 0\n}\n\nexport default PrivacyType;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PrivacyRule} from '../../../../layer';\nimport PrivacyType from './privacyType';\n\nexport default function getPrivacyRulesDetails(rules: PrivacyRule[]) {\n const types: PrivacyType[] = [];\n\n type peers = {users: UserId[], chats: ChatId[]};\n const allowPeers: peers = {users: [], chats: []}, disallowPeers: peers = {users: [], chats: []};\n rules.forEach((rule) => {\n switch(rule._) {\n case 'privacyValueAllowAll':\n types.push(2);\n break;\n case 'privacyValueDisallowAll':\n types.push(0);\n break;\n case 'privacyValueAllowContacts':\n types.push(1);\n break;\n /* case 'privacyValueDisallowContacts':\n types.push('Except My Contacts');\n break; */\n case 'privacyValueAllowChatParticipants':\n allowPeers.chats.push(...rule.chats);\n break;\n case 'privacyValueAllowUsers':\n allowPeers.users.push(...rule.users);\n break;\n case 'privacyValueDisallowChatParticipants':\n disallowPeers.chats.push(...rule.chats);\n break;\n case 'privacyValueDisallowUsers':\n disallowPeers.users.push(...rule.users);\n break;\n }\n });\n\n return {type: types[0], disallowPeers, allowPeers};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {randomLong} from '../helpers/random';\nimport {InputPrivacyKey, InputPrivacyRule} from '../layer';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getPrivacyRulesDetails from '../lib/appManagers/utils/privacy/getPrivacyRulesDetails';\nimport PrivacyType from '../lib/appManagers/utils/privacy/privacyType';\nimport {i18n, join, LangPackKey, _i18n} from '../lib/langPack';\nimport RadioField from './radioField';\nimport Row, {RadioFormFromRows} from './row';\nimport Scrollable from './scrollable';\nimport SettingSection, {generateSection} from './settingSection';\nimport AppAddMembersTab from './sidebarLeft/tabs/addMembers';\nimport {SliderSuperTabEventable} from './sliderTab';\n\nexport type PrivacySectionStr = LangPackKey | '' | HTMLElement;\nexport default class PrivacySection {\n public radioRows: Map;\n public radioSection: SettingSection;\n public exceptions: Map;\n public peerIds: {\n disallow?: PeerId[],\n allow?: PeerId[]\n };\n public type: PrivacyType;\n\n constructor(public options: {\n tab: SliderSuperTabEventable,\n title: LangPackKey,\n inputKey: InputPrivacyKey['_'],\n captions?: [PrivacySectionStr, PrivacySectionStr, PrivacySectionStr],\n appendTo?: Scrollable,\n noExceptions?: boolean,\n onRadioChange?: (value: number) => any,\n skipTypes?: PrivacyType[],\n exceptionTexts?: [LangPackKey, LangPackKey],\n managers: AppManagers\n }) {\n if(options.captions) {\n options.captions.reverse();\n }\n\n const managers = options.managers;\n\n this.radioSection = new SettingSection({name: options.title, caption: true});\n\n this.radioRows = new Map();\n\n let r: Array<{type: PrivacyType, langKey: LangPackKey}> = [{\n type: PrivacyType.Everybody,\n langKey: 'PrivacySettingsController.Everbody'\n }, {\n type: PrivacyType.Contacts,\n langKey: 'PrivacySettingsController.MyContacts'\n }, {\n type: PrivacyType.Nobody,\n langKey: 'PrivacySettingsController.Nobody'\n }];\n\n if(options.skipTypes) {\n r = r.filter((r) => !options.skipTypes.includes(r.type));\n }\n\n const random = randomLong();\n r.forEach(({type, langKey}) => {\n const row = new Row({\n radioField: new RadioField({\n langKey,\n name: random,\n value: '' + type\n })\n });\n\n this.radioRows.set(type, row);\n });\n\n const form = RadioFormFromRows([...this.radioRows.values()], this.onRadioChange);\n\n this.radioSection.content.append(form);\n if(options.appendTo) {\n options.appendTo.append(this.radioSection.container);\n }\n\n if(!options.noExceptions) {\n const container = generateSection(options.appendTo, 'PrivacyExceptions', 'PrivacySettingsController.PeerInfo');\n\n this.exceptions = new Map([[\n 'disallow',\n {\n titleLangKey: options.exceptionTexts[0],\n key: 'disallow',\n row: null,\n icon: 'deleteuser',\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\n clickable: true\n }\n ], [\n 'allow',\n {\n titleLangKey: options.exceptionTexts[1],\n key: 'allow',\n row: null,\n icon: 'adduser',\n subtitleLangKey: 'PrivacySettingsController.AddUsers',\n clickable: true\n }\n ]]);\n\n this.exceptions.forEach((exception) => {\n exception.row = new Row(exception);\n\n exception.row.container.addEventListener('click', () => {\n promise.then(() => {\n const _peerIds = this.peerIds[exception.key];\n options.tab.slider.createTab(AppAddMembersTab).open({\n type: 'privacy',\n skippable: true,\n title: exception.titleLangKey,\n placeholder: 'PrivacyModal.Search.Placeholder',\n takeOut: (newPeerIds) => {\n _peerIds.length = 0;\n _peerIds.push(...newPeerIds);\n exception.row.subtitle.innerHTML = '';\n exception.row.subtitle.append(...this.generateStr(this.splitPeersByType(newPeerIds)));\n },\n selectedPeerIds: _peerIds\n });\n });\n });\n\n container.append(exception.row.container);\n });\n }\n\n /* setTimeout(() => {\n this.setRadio(PrivacyType.Contacts);\n }, 0); */\n\n const promise = managers.appPrivacyManager.getPrivacy(options.inputKey).then((rules) => {\n const details = getPrivacyRulesDetails(rules);\n this.setRadio(details.type);\n\n if(this.exceptions) {\n this.peerIds = {};\n ['allow' as const, 'disallow' as const].forEach((k) => {\n const arr = [];\n const from = k === 'allow' ? details.allowPeers : details.disallowPeers;\n arr.push(...from.users.map((id) => id.toPeerId()));\n arr.push(...from.chats.map((id) => id.toPeerId(true)));\n this.peerIds[k] = arr;\n const s = this.exceptions.get(k).row.subtitle;\n s.innerHTML = '';\n s.append(...this.generateStr(from));\n });\n }\n\n options.tab.eventListener.addEventListener('destroy', async() => {\n const rules: InputPrivacyRule[] = [];\n\n switch(this.type) {\n case PrivacyType.Everybody:\n rules.push({_: 'inputPrivacyValueAllowAll'});\n break;\n case PrivacyType.Contacts:\n rules.push({_: 'inputPrivacyValueAllowContacts'});\n break;\n case PrivacyType.Nobody:\n rules.push({_: 'inputPrivacyValueDisallowAll'});\n break;\n }\n\n if(this.exceptions) {\n const a = ([\n ['allow', 'inputPrivacyValueAllowChatParticipants', 'inputPrivacyValueAllowUsers'],\n ['disallow', 'inputPrivacyValueDisallowChatParticipants', 'inputPrivacyValueDisallowUsers']\n ] as Array<[\n 'allow' | 'disallow',\n 'inputPrivacyValueAllowChatParticipants' | 'inputPrivacyValueDisallowChatParticipants',\n 'inputPrivacyValueAllowUsers' | 'inputPrivacyValueDisallowUsers'\n ]>);\n for(const [k, chatKey, usersKey] of a) {\n if(this.exceptions.get(k).row.container.classList.contains('hide')) {\n continue;\n }\n\n const _peerIds = this.peerIds[k];\n if(_peerIds) {\n const splitted = this.splitPeersByType(_peerIds);\n if(splitted.chats.length) {\n rules.push({_: chatKey, chats: splitted.chats});\n }\n\n if(splitted.users.length) {\n rules.push({\n _: usersKey,\n users: await Promise.all(splitted.users.map((id) => managers.appUsersManager.getUserInput(id)))\n });\n }\n }\n }\n }\n\n managers.appPrivacyManager.setPrivacy(options.inputKey, rules);\n }, {once: true});\n });\n }\n\n private onRadioChange = (value: string | PrivacySection['type']) => {\n value = +value as PrivacySection['type'];\n this.type = value;\n\n const caption = this.options.captions[this.type];\n const captionElement = this.radioSection.caption;\n if(!caption) {\n captionElement.innerHTML = '';\n } else if(caption instanceof HTMLElement) {\n replaceContent(captionElement, caption);\n } else {\n _i18n(captionElement, caption);\n }\n captionElement.classList.toggle('hide', !caption);\n\n if(this.exceptions) {\n this.exceptions.get('allow').row.container.classList.toggle('hide', this.type === PrivacyType.Everybody);\n this.exceptions.get('disallow').row.container.classList.toggle('hide', this.type === PrivacyType.Nobody);\n }\n\n this.options.onRadioChange && this.options.onRadioChange(value);\n };\n\n public setRadio(type: PrivacySection['type']) {\n const row = this.radioRows.get(type);\n this.onRadioChange(type);\n row.radioField.input.checked = true;\n }\n\n private splitPeersByType(peerIds: PeerId[]) {\n const peers = {users: [] as UserId[], chats: [] as ChatId[]};\n peerIds.forEach((peerId) => {\n peers[peerId.isAnyChat() ? 'chats' : 'users'].push(peerId.isAnyChat() ? peerId.toChatId() : peerId);\n });\n\n return peers;\n }\n\n private generateStr(peers: {users: UserId[], chats: ChatId[]}) {\n if(!peers.users.length && !peers.chats.length) {\n return [i18n('PrivacySettingsController.AddUsers')];\n }\n\n return join([\n peers.users.length ? i18n('Users', [peers.users.length]) : null,\n peers.chats.length ? i18n('Chats', [peers.chats.length]) : null\n ].filter(Boolean), false);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {i18n, LangPackKey} from '../../../../lib/langPack';\nimport anchorCopy from '../../../../helpers/dom/anchorCopy';\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\n\nexport default class AppPrivacyPhoneNumberTab extends SliderSuperTabEventable {\n public async init() {\n this.container.classList.add('privacy-tab', 'privacy-phone-number');\n this.setTitle('PrivacyPhone');\n\n const formatted = '+' + (await this.managers.appUsersManager.getSelf()).phone;\n const captionEl = document.createElement('div');\n captionEl.append(\n i18n('PrivacyPhoneInfo'),\n document.createElement('br'),\n document.createElement('br'),\n i18n('PrivacyPhoneInfo4'),\n document.createElement('br'),\n anchorCopy({\n mePath: formatted\n })\n );\n\n const phoneSection = new PrivacySection({\n tab: this,\n title: 'PrivacyPhoneTitle',\n inputKey: 'inputPrivacyKeyPhoneNumber',\n captions: [captionEl, captionEl, ''],\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\n appendTo: this.scrollable,\n onRadioChange: (type) => {\n s.setRadio(PrivacyType.Everybody);\n s.radioSection.container.classList.toggle('hide', type !== PrivacyType.Nobody);\n },\n managers: this.managers\n });\n\n const sCaption: LangPackKey = 'PrivacyPhoneInfo3';\n const s = new PrivacySection({\n tab: this,\n title: 'PrivacyPhoneTitle2',\n inputKey: 'inputPrivacyKeyAddedByPhone',\n captions: [sCaption, sCaption, ''],\n noExceptions: true,\n skipTypes: [PrivacyType.Nobody],\n managers: this.managers\n });\n\n this.scrollable.container.insertBefore(s.radioSection.container, phoneSection.radioSection.container.nextSibling);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport Button from '../../../button';\nimport SettingSection from '../../../settingSection';\nimport {SliderSuperTab} from '../../../slider';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport AppSettingsTab from '../settings';\n\nexport default class AppTwoStepVerificationSetTab extends SliderSuperTab {\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-set');\n this.setTitle('TwoStepVerificationPasswordSet');\n\n const section = new SettingSection({\n captionOld: 'TwoStepVerificationPasswordSetInfo',\n noDelimiter: true\n });\n\n const emoji = '🥳';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n emoji,\n div: stickerContainer,\n width: 160,\n height: 160\n });\n\n section.content.append(stickerContainer);\n\n const inputContent = section.generateContentElement();\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const btnReturn = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationPasswordReturnSettings'});\n\n attachClickEvent(btnReturn, (e) => {\n this.close();\n });\n\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\n\n inputWrapper.append(btnReturn);\n\n inputContent.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\n\nexport function canFocus(isFirstInput: boolean) {\n return !IS_MOBILE_SAFARI || !isFirstInput;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport {SliderSuperTab} from '../../../slider';\nimport AppTwoStepVerificationSetTab from './passwordSet';\nimport CodeInputField from '../../../codeInputField';\nimport AppTwoStepVerificationEmailTab from './email';\nimport {putPreloader} from '../../../putPreloader';\nimport {i18n, _i18n} from '../../../../lib/langPack';\nimport {canFocus} from '../../../../helpers/dom/canFocus';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../../helpers/dom/replaceContent';\nimport toggleDisability from '../../../../helpers/dom/toggleDisability';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationEmailConfirmationTab extends SliderSuperTab {\n public codeInputField: CodeInputField;\n public state: AccountPassword;\n public email: string;\n public length: number;\n public isFirst = false;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-email-confirmation');\n this.setTitle('TwoStepAuth.RecoveryTitle');\n\n const section = new SettingSection({\n captionOld: true,\n noDelimiter: true\n });\n\n _i18n(section.caption, 'TwoStepAuth.ConfirmEmailCodeDesc', [this.email]);\n\n const emoji = '📬';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n div: stickerContainer,\n width: 160,\n height: 160,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const inputContent = section.generateContentElement();\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const inputField = this.codeInputField = new CodeInputField({\n name: 'recovery-email-code',\n label: 'TwoStepAuth.RecoveryCode',\n length: this.length,\n onFill: (code) => {\n freeze(true);\n\n this.managers.passwordManager.confirmPasswordEmail('' + code)\n .then((value) => {\n if(!value) {\n\n }\n\n goNext();\n })\n .catch((err) => {\n switch(err.type) {\n case 'CODE_INVALID':\n inputField.input.classList.add('error');\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeInvalid'));\n break;\n\n case 'EMAIL_HASH_EXPIRED':\n inputField.input.classList.add('error');\n replaceContent(inputField.label, i18n('TwoStepAuth.RecoveryCodeExpired'));\n break;\n\n default:\n console.error('confirm error', err);\n break;\n }\n\n freeze(false);\n });\n }\n });\n\n const btnChange = Button('btn-primary btn-primary-transparent primary', {text: 'TwoStepAuth.EmailCodeChangeEmail'});\n const btnResend = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'ResendCode'});\n\n const goNext = () => {\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\n };\n\n const freeze = (disable: boolean) => {\n toggleDisability([inputField.input, btnChange, btnResend], disable);\n };\n\n attachClickEvent(btnChange, (e) => {\n freeze(true);\n this.managers.passwordManager.cancelPasswordEmail().then((value) => {\n this.slider.sliceTabsUntilTab(AppTwoStepVerificationEmailTab, this);\n this.close();\n }, () => {\n freeze(false);\n });\n });\n\n attachClickEvent(btnResend, (e) => {\n freeze(true);\n const d = putPreloader(btnResend);\n this.managers.passwordManager.resendPasswordEmail().then((value) => {\n d.remove();\n freeze(false);\n });\n });\n\n inputWrapper.append(inputField.container, btnChange, btnResend);\n\n inputContent.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n\n onOpenAfterTimeout() {\n if(!canFocus(this.isFirst)) return;\n this.codeInputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport {SliderSuperTab} from '../../../slider';\nimport InputField from '../../../inputField';\nimport {putPreloader} from '../../../putPreloader';\nimport AppTwoStepVerificationSetTab from './passwordSet';\nimport AppTwoStepVerificationEmailConfirmationTab from './emailConfirmation';\nimport PopupPeer from '../../../popups/peer';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {canFocus} from '../../../../helpers/dom/canFocus';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport matchEmail from '../../../../lib/richTextProcessor/matchEmail';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationEmailTab extends SliderSuperTab {\n public inputField: InputField;\n public state: AccountPassword;\n public plainPassword: string;\n public newPassword: string;\n public hint: string;\n public isFirst = false;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-email');\n this.setTitle('RecoveryEmailTitle');\n\n const section = new SettingSection({\n captionOld: true,\n noDelimiter: true\n });\n\n const emoji = '💌';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n div: stickerContainer,\n width: 160,\n height: 160,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const inputContent = section.generateContentElement();\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const inputField = this.inputField = new InputField({\n name: 'recovery-email',\n label: 'RecoveryEmail',\n plainText: true\n });\n\n inputField.input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n cancelEvent(e);\n return onContinueClick();\n }\n });\n\n inputField.input.addEventListener('input', (e) => {\n inputField.input.classList.remove('error');\n });\n\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\n\n const goNext = () => {\n this.slider.createTab(AppTwoStepVerificationSetTab).open();\n };\n\n const onContinueClick = () => {\n const email = inputField.value.trim();\n const match = matchEmail(email);\n if(!match || match[0].length !== email.length) {\n inputField.input.classList.add('error');\n return;\n }\n\n toggleButtons(true);\n const d = putPreloader(btnContinue);\n\n this.managers.passwordManager.updateSettings({\n hint: this.hint,\n currentPassword: this.plainPassword,\n newPassword: this.newPassword,\n email\n }).then((value) => {\n goNext();\n }, (err) => {\n if(err.type.includes('EMAIL_UNCONFIRMED')) {\n const symbols = +err.type.match(/^EMAIL_UNCONFIRMED_(\\d+)/)[1];\n\n const tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\n tab.state = this.state;\n tab.email = email;\n tab.length = symbols;\n tab.open();\n } else {\n console.log('password set error', err);\n }\n\n toggleButtons(false);\n d.remove();\n });\n };\n attachClickEvent(btnContinue, onContinueClick);\n\n const toggleButtons = (freeze: boolean) => {\n if(freeze) {\n btnContinue.setAttribute('disabled', 'true');\n btnSkip.setAttribute('disabled', 'true');\n } else {\n btnContinue.removeAttribute('disabled');\n btnSkip.removeAttribute('disabled');\n }\n };\n\n attachClickEvent(btnSkip, (e) => {\n const popup = new PopupPeer('popup-skip-email', {\n buttons: [{\n langKey: 'Cancel',\n isCancel: true\n }, {\n langKey: 'YourEmailSkip',\n callback: () => {\n // inputContent.classList.add('sidebar-left-section-disabled');\n toggleButtons(true);\n putPreloader(btnSkip);\n this.managers.passwordManager.updateSettings({\n hint: this.hint,\n currentPassword: this.plainPassword,\n newPassword: this.newPassword,\n email: ''\n }).then(() => {\n goNext();\n }, (err) => {\n toggleButtons(false);\n });\n },\n isDanger: true\n }],\n titleLangKey: 'YourEmailSkipWarning',\n descriptionLangKey: 'YourEmailSkipWarningText'\n });\n\n popup.show();\n });\n\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\n\n inputContent.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n\n onOpenAfterTimeout() {\n if(!canFocus(this.isFirst)) return;\n this.inputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport {SliderSuperTab} from '../../../slider';\nimport InputField from '../../../inputField';\nimport AppTwoStepVerificationEmailTab from './email';\nimport {toast} from '../../../toast';\nimport I18n from '../../../../lib/langPack';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationHintTab extends SliderSuperTab {\n public inputField: InputField;\n public state: AccountPassword;\n public plainPassword: string;\n public newPassword: string;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-hint');\n this.setTitle('TwoStepAuth.SetupHintTitle');\n\n const section = new SettingSection({\n noDelimiter: true\n });\n\n const emoji = '💡';\n const stickerContainer = document.createElement('div');\n wrapStickerEmoji({\n div: stickerContainer,\n width: 160,\n height: 160,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const inputField = this.inputField = new InputField({\n name: 'hint',\n label: 'TwoStepAuth.SetupHintPlaceholder'\n });\n\n inputField.input.addEventListener('keypress', (e) => {\n if(e.key === 'Enter') {\n cancelEvent(e);\n return inputField.value ? onContinueClick() : onSkipClick();\n }\n });\n\n const goNext = (e?: Event, saveHint?: boolean) => {\n if(e) {\n cancelEvent(e);\n }\n\n const hint = saveHint ? inputField.value : undefined;\n if(hint && this.newPassword === hint) {\n toast(I18n.format('PasswordAsHintError', true));\n return;\n }\n\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\n tab.state = this.state;\n tab.plainPassword = this.plainPassword;\n tab.newPassword = this.newPassword;\n tab.hint = hint;\n\n tab.open();\n };\n\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\n const btnSkip = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'YourEmailSkip'});\n\n const onContinueClick = (e?: Event) => goNext(e, true);\n const onSkipClick = (e?: Event) => goNext(e, false);\n attachClickEvent(btnContinue, onContinueClick);\n attachClickEvent(btnSkip, onSkipClick);\n\n inputWrapper.append(inputField.container, btnContinue, btnSkip);\n\n section.content.append(inputWrapper);\n\n this.scrollable.container.append(section.container);\n }\n\n onOpenAfterTimeout() {\n this.inputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AccountPassword} from '../../../../layer';\nimport Button from '../../../button';\nimport PasswordInputField from '../../../passwordInputField';\nimport {SliderSuperTab} from '../../../slider';\nimport TrackingMonkey from '../../../monkeys/tracking';\nimport AppTwoStepVerificationHintTab from './hint';\nimport {InputState} from '../../../inputField';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationReEnterPasswordTab extends SliderSuperTab {\n public state: AccountPassword;\n public passwordInputField: PasswordInputField;\n public plainPassword: string;\n public newPassword: string;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password', 'two-step-verification-re-enter-password');\n this.setTitle('PleaseReEnterPassword');\n\n const section = new SettingSection({\n noDelimiter: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const passwordInputField = this.passwordInputField = new PasswordInputField({\n name: 're-enter-password',\n label: 'PleaseReEnterPassword'\n });\n\n const monkey = new TrackingMonkey(passwordInputField, 157);\n\n const btnContinue = Button('btn-primary btn-color-primary', {text: 'Continue'});\n\n inputWrapper.append(passwordInputField.container, btnContinue);\n section.content.append(monkey.container, inputWrapper);\n\n this.scrollable.container.append(section.container);\n\n passwordInputField.input.addEventListener('keypress', (e) => {\n if(passwordInputField.input.classList.contains('error')) {\n passwordInputField.setState(InputState.Neutral);\n }\n\n if(e.key === 'Enter') {\n return onContinueClick();\n }\n });\n\n const verifyInput = () => {\n if(this.newPassword !== passwordInputField.value) {\n passwordInputField.setError();\n return false;\n }\n\n return true;\n };\n\n const onContinueClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(!verifyInput()) return;\n\n const tab = this.slider.createTab(AppTwoStepVerificationHintTab);\n tab.state = this.state;\n tab.plainPassword = this.plainPassword;\n tab.newPassword = this.newPassword;\n tab.open();\n };\n attachClickEvent(btnContinue, onContinueClick);\n\n return monkey.load();\n }\n\n onOpenAfterTimeout() {\n this.passwordInputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AppTwoStepVerificationTab from '.';\nimport cancelEvent from '../../../../helpers/dom/cancelEvent';\nimport {canFocus} from '../../../../helpers/dom/canFocus';\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../../../helpers/dom/setInnerHTML';\nimport {AccountPassword} from '../../../../layer';\nimport I18n, {i18n} from '../../../../lib/langPack';\nimport wrapEmojiText from '../../../../lib/richTextProcessor/wrapEmojiText';\nimport Button from '../../../button';\nimport {putPreloader} from '../../../putPreloader';\nimport PasswordMonkey from '../../../monkeys/password';\nimport PasswordInputField from '../../../passwordInputField';\nimport {SliderSuperTab} from '../../../slider';\nimport AppTwoStepVerificationReEnterPasswordTab from './reEnterPassword';\nimport SettingSection from '../../../settingSection';\n\nexport default class AppTwoStepVerificationEnterPasswordTab extends SliderSuperTab {\n public state: AccountPassword;\n public passwordInputField: PasswordInputField;\n public plainPassword: string;\n public isFirst = true;\n\n public init() {\n const isNew = !this.state.pFlags.has_password || this.plainPassword;\n this.container.classList.add('two-step-verification', 'two-step-verification-enter-password');\n this.setTitle(isNew ? 'PleaseEnterFirstPassword' : 'PleaseEnterCurrentPassword');\n\n const section = new SettingSection({\n noDelimiter: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const passwordInputField = this.passwordInputField = new PasswordInputField({\n name: 'enter-password',\n label: isNew ? 'PleaseEnterFirstPassword' : (this.state.hint ? undefined : 'LoginPassword'),\n labelText: !isNew && this.state.hint ? wrapEmojiText(this.state.hint) : undefined\n });\n\n const monkey = new PasswordMonkey(passwordInputField, 157);\n\n const btnContinue = Button('btn-primary btn-color-primary');\n const textEl = new I18n.IntlElement({key: 'Continue'});\n\n btnContinue.append(textEl.element);\n\n inputWrapper.append(passwordInputField.container, btnContinue);\n section.content.append(monkey.container, inputWrapper);\n\n this.scrollable.container.append(section.container);\n\n passwordInputField.input.addEventListener('keypress', (e) => {\n if(passwordInputField.input.classList.contains('error')) {\n passwordInputField.input.classList.remove('error');\n textEl.key = 'Continue';\n textEl.update();\n }\n\n if(e.key === 'Enter') {\n return onContinueClick();\n }\n });\n\n const verifyInput = () => {\n if(!passwordInputField.value.length) {\n passwordInputField.input.classList.add('error');\n return false;\n }\n\n return true;\n };\n\n let onContinueClick: (e?: Event) => void;\n if(!isNew) {\n let getStateInterval: number;\n\n const getState = () => {\n // * just to check session relevance\n if(!getStateInterval) {\n getStateInterval = window.setInterval(getState, 10e3);\n }\n\n return this.managers.passwordManager.getState().then((_state) => {\n this.state = _state;\n\n if(this.state.hint) {\n setInnerHTML(passwordInputField.label, wrapEmojiText(this.state.hint));\n } else {\n replaceContent(passwordInputField.label, i18n('LoginPassword'));\n }\n });\n };\n\n const submit = (e?: Event) => {\n if(!verifyInput()) {\n cancelEvent(e);\n return;\n }\n\n btnContinue.setAttribute('disabled', 'true');\n textEl.key = 'PleaseWait';\n textEl.update();\n const preloader = putPreloader(btnContinue);\n\n const plainPassword = passwordInputField.value;\n this.managers.passwordManager.check(passwordInputField.value, this.state).then((auth) => {\n console.log(auth);\n\n if(auth._ === 'auth.authorization') {\n clearInterval(getStateInterval);\n if(monkey) monkey.remove();\n const tab = this.slider.createTab(AppTwoStepVerificationTab);\n tab.state = this.state;\n tab.plainPassword = plainPassword;\n tab.open();\n this.slider.removeTabFromHistory(this);\n }\n }, (err) => {\n btnContinue.removeAttribute('disabled');\n passwordInputField.input.classList.add('error');\n\n switch(err.type) {\n default:\n // btnContinue.innerText = err.type;\n textEl.key = 'PASSWORD_HASH_INVALID';\n textEl.update();\n preloader.remove();\n passwordInputField.select();\n break;\n }\n\n getState();\n });\n };\n\n onContinueClick = submit;\n\n getState();\n } else {\n onContinueClick = (e) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(!verifyInput()) return;\n\n const tab = this.slider.createTab(AppTwoStepVerificationReEnterPasswordTab);\n tab.state = this.state;\n tab.newPassword = passwordInputField.value;\n tab.plainPassword = this.plainPassword;\n tab.open();\n };\n }\n\n attachClickEvent(btnContinue, onContinueClick);\n\n return monkey.load();\n }\n\n onOpenAfterTimeout() {\n if(!canFocus(this.isFirst)) return;\n this.passwordInputField.input.focus();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../../helpers/dom/clickEvent';\nimport {AccountPassword} from '../../../../layer';\nimport {_i18n} from '../../../../lib/langPack';\nimport Button from '../../../button';\nimport PopupPeer from '../../../popups/peer';\nimport SettingSection from '../../../settingSection';\nimport {SliderSuperTab} from '../../../slider';\nimport wrapStickerEmoji from '../../../wrappers/stickerEmoji';\nimport AppSettingsTab from '../settings';\nimport AppTwoStepVerificationEmailTab from './email';\nimport AppTwoStepVerificationEnterPasswordTab from './enterPassword';\n\nexport default class AppTwoStepVerificationTab extends SliderSuperTab {\n public state: AccountPassword;\n public plainPassword: string;\n\n public init() {\n this.container.classList.add('two-step-verification', 'two-step-verification-main');\n this.setTitle('TwoStepVerificationTitle');\n\n const section = new SettingSection({\n captionOld: true,\n noDelimiter: true\n });\n\n const emoji = '🔐';\n const stickerContainer = document.createElement('div');\n\n wrapStickerEmoji({\n div: stickerContainer,\n width: 168,\n height: 168,\n emoji\n });\n\n section.content.append(stickerContainer);\n\n const c = section.generateContentElement();\n if(this.state.pFlags.has_password) {\n _i18n(section.caption, 'TwoStepAuth.GenericHelp');\n\n const btnChangePassword = Button('btn-primary btn-transparent', {icon: 'edit', text: 'TwoStepAuth.ChangePassword'});\n const btnDisablePassword = Button('btn-primary btn-transparent', {icon: 'passwordoff', text: 'TwoStepAuth.RemovePassword'});\n const btnSetRecoveryEmail = Button('btn-primary btn-transparent', {icon: 'email', text: this.state.pFlags.has_recovery ? 'TwoStepAuth.ChangeEmail' : 'TwoStepAuth.SetupEmail'});\n\n attachClickEvent(btnChangePassword, () => {\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\n tab.state = this.state;\n tab.plainPassword = this.plainPassword;\n tab.open();\n });\n\n attachClickEvent(btnDisablePassword, () => {\n const popup = new PopupPeer('popup-disable-password', {\n buttons: [{\n langKey: 'Disable',\n callback: () => {\n this.managers.passwordManager.updateSettings({currentPassword: this.plainPassword}).then(() => {\n this.slider.sliceTabsUntilTab(AppSettingsTab, this);\n this.close();\n });\n },\n isDanger: true\n }],\n titleLangKey: 'TurnPasswordOffQuestionTitle',\n descriptionLangKey: 'TurnPasswordOffQuestion'\n });\n\n popup.show();\n });\n\n attachClickEvent(btnSetRecoveryEmail, () => {\n const tab = this.slider.createTab(AppTwoStepVerificationEmailTab);\n tab.state = this.state;\n tab.hint = this.state.hint;\n tab.plainPassword = this.plainPassword;\n tab.newPassword = this.plainPassword;\n tab.isFirst = true;\n tab.open();\n });\n\n c.append(btnChangePassword, btnDisablePassword, btnSetRecoveryEmail);\n } else {\n _i18n(section.caption, 'TwoStepAuth.SetPasswordHelp');\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const btnSetPassword = Button('btn-primary btn-color-primary', {text: 'TwoStepVerificationSetPassword'});\n\n inputWrapper.append(btnSetPassword);\n c.append(inputWrapper);\n\n attachClickEvent(btnSetPassword, (e) => {\n const tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\n tab.state = this.state;\n tab.open();\n });\n }\n\n this.scrollable.container.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyLastSeenTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-last-seen');\n this.setTitle('PrivacyLastSeen');\n\n const caption: LangPackKey = 'PrivacySettingsController.LastSeenDescription';\n new PrivacySection({\n tab: this,\n title: 'LastSeenTitle',\n inputKey: 'inputPrivacyKeyStatusTimestamp',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\n\nexport default class AppPrivacyProfilePhotoTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-profile-photo');\n this.setTitle('PrivacyProfilePhoto');\n\n const caption: LangPackKey = 'PrivacySettingsController.ProfilePhoto.CustomHelp';\n new PrivacySection({\n tab: this,\n title: 'PrivacyProfilePhotoTitle',\n inputKey: 'inputPrivacyKeyProfilePhoto',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverShare', 'PrivacySettingsController.AlwaysShare'],\n appendTo: this.scrollable,\n skipTypes: [PrivacyType.Nobody],\n managers: this.managers\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyForwardMessagesTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-forward-messages');\n this.setTitle('PrivacySettings.Forwards');\n\n const caption: LangPackKey = 'PrivacySettingsController.Forwards.CustomHelp';\n new PrivacySection({\n tab: this,\n title: 'PrivacyForwardsTitle',\n inputKey: 'inputPrivacyKeyForwards',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport PrivacyType from '../../../../lib/appManagers/utils/privacy/privacyType';\n\nexport default class AppPrivacyAddToGroupsTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-add-to-groups');\n this.setTitle('PrivacySettings.Groups');\n\n const caption: LangPackKey = 'PrivacySettingsController.GroupDescription';\n new PrivacySection({\n tab: this,\n title: 'WhoCanAddMe',\n inputKey: 'inputPrivacyKeyChatInvite',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n skipTypes: [PrivacyType.Nobody],\n managers: this.managers\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyCallsTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-calls');\n this.setTitle('PrivacySettings.VoiceCalls');\n\n const caption: LangPackKey = 'PrivacySettingsController.PhoneCallDescription';\n new PrivacySection({\n tab: this,\n title: 'WhoCanCallMe',\n inputKey: 'inputPrivacyKeyPhoneCall',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n\n {\n const caption: LangPackKey = 'PrivacySettingsController.P2p.Desc';\n new PrivacySection({\n tab: this,\n title: 'PrivacyP2PHeader',\n inputKey: 'inputPrivacyKeyPhoneP2P',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Button from '../../button';\nimport Row from '../../row';\nimport {Authorization} from '../../../layer';\nimport {formatDateAccordingToTodayNew} from '../../../helpers/date';\nimport {ButtonMenuSync} from '../../buttonMenu';\nimport {toast} from '../../toast';\nimport I18n from '../../../lib/langPack';\nimport PopupPeer from '../../popups/peer';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport findAndSplice from '../../../helpers/array/findAndSplice';\nimport {attachContextMenuListener} from '../../../helpers/dom/attachContextMenuListener';\nimport positionMenu from '../../../helpers/positionMenu';\nimport contextMenuController from '../../../helpers/contextMenuController';\nimport SettingSection from '../../settingSection';\n\nexport default class AppActiveSessionsTab extends SliderSuperTabEventable {\n public authorizations: Authorization.authorization[];\n private menuElement: HTMLElement;\n\n public init() {\n this.container.classList.add('active-sessions-container');\n this.setTitle('SessionsTitle');\n\n const Session = (auth: Authorization.authorization) => {\n const row = new Row({\n title: [auth.app_name, auth.app_version].join(' '),\n subtitle: [auth.ip, auth.country].join(' - '),\n clickable: true,\n titleRight: auth.pFlags.current ? undefined : formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\n });\n\n row.container.dataset.hash = '' + auth.hash;\n\n row.midtitle.textContent = [auth.device_model, auth.system_version || auth.platform].filter(Boolean).join(', ');\n\n return row;\n };\n\n const authorizations = this.authorizations.slice();\n\n {\n const section = new SettingSection({\n name: 'CurrentSession',\n caption: 'ClearOtherSessionsHelp'\n });\n\n const auth = findAndSplice(authorizations, auth => auth.pFlags.current);\n const session = Session(auth);\n\n section.content.append(session.container);\n\n if(authorizations.length) {\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllSessions'});\n attachClickEvent(btnTerminate, (e) => {\n new PopupPeer('revoke-session', {\n buttons: [{\n langKey: 'Terminate',\n isDanger: true,\n callback: () => {\n const toggle = toggleDisability([btnTerminate], true);\n this.managers.apiManager.invokeApi('auth.resetAuthorizations').then((value) => {\n // toggleDisability([btnTerminate], false);\n btnTerminate.remove();\n otherSection.container.remove();\n }, onError).finally(() => {\n toggle();\n });\n }\n }],\n titleLangKey: 'AreYouSureSessionsTitle',\n descriptionLangKey: 'AreYouSureSessions'\n }).show();\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnTerminate);\n }\n\n this.scrollable.append(section.container);\n }\n\n if(!authorizations.length) {\n return;\n }\n\n const otherSection = new SettingSection({\n name: 'OtherSessions',\n caption: 'SessionsListInfo'\n });\n\n authorizations.forEach((auth) => {\n otherSection.content.append(Session(auth).container);\n });\n\n this.scrollable.append(otherSection.container);\n\n const onError = (err: any) => {\n if(err.type === 'FRESH_RESET_AUTHORISATION_FORBIDDEN') {\n toast(I18n.format('RecentSessions.Error.FreshReset', true));\n }\n };\n\n let target: HTMLElement;\n const onTerminateClick = () => {\n const hash = target.dataset.hash;\n\n new PopupPeer('revoke-session', {\n buttons: [{\n langKey: 'Terminate',\n isDanger: true,\n callback: () => {\n this.managers.apiManager.invokeApi('account.resetAuthorization', {hash})\n .then((value) => {\n if(value) {\n target.remove();\n }\n }, onError);\n }\n }],\n titleLangKey: 'AreYouSureSessionTitle',\n descriptionLangKey: 'TerminateSessionText'\n }).show();\n };\n\n const element = this.menuElement = ButtonMenuSync({\n buttons: [{\n icon: 'stop',\n text: 'Terminate',\n onClick: onTerminateClick\n }]\n });\n element.id = 'active-sessions-contextmenu';\n element.classList.add('contextmenu');\n\n document.getElementById('page-chats').append(element);\n\n attachContextMenuListener({\n element: this.scrollable.container,\n callback: (e) => {\n target = findUpClassName(e.target, 'row');\n if(!target || target.dataset.hash === '0') {\n return;\n }\n\n if(e instanceof MouseEvent) e.preventDefault();\n // smth\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n positionMenu(e, element);\n contextMenuController.openBtnMenu(element);\n },\n listenerSetter: this.listenerSetter\n });\n\n attachClickEvent(this.scrollable.container, (e) => {\n target = findUpClassName(e.target, 'row');\n if(!target || target.dataset.hash === '0') {\n return;\n }\n\n onTerminateClick();\n }, {listenerSetter: this.listenerSetter});\n }\n\n onCloseAfterTimeout() {\n this.menuElement?.remove();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport {ButtonMenuSync} from '../../buttonMenu';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../../../lib/appManagers/appDialogsManager';\nimport PopupPickUser from '../../popups/pickUser';\nimport rootScope from '../../../lib/rootScope';\nimport findUpTag from '../../../helpers/dom/findUpTag';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport formatUserPhone from '../../wrappers/formatUserPhone';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\nimport {attachContextMenuListener} from '../../../helpers/dom/attachContextMenuListener';\nimport positionMenu from '../../../helpers/positionMenu';\nimport contextMenuController from '../../../helpers/contextMenuController';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport SettingSection from '../../settingSection';\n\nexport default class AppBlockedUsersTab extends SliderSuperTab {\n public peerIds: PeerId[];\n private menuElement: HTMLElement;\n\n public init() {\n this.container.classList.add('blocked-users-container');\n this.setTitle('BlockedUsers');\n\n const section = new SettingSection({\n caption: 'BlockedUsersInfo'\n });\n\n section.caption.parentElement.prepend(section.caption);\n\n this.scrollable.append(section.container);\n\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\n this.content.append(btnAdd);\n\n attachClickEvent(btnAdd, (e) => {\n new PopupPickUser({\n peerTypes: ['contacts'],\n placeholder: 'BlockModal.Search.Placeholder',\n onSelect: (peerId) => {\n // console.log('block', peerId);\n this.managers.appUsersManager.toggleBlock(peerId, true);\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n const list = appDialogsManager.createChatList();\n this.scrollable.container.classList.add('chatlist-container');\n section.content.append(list);\n\n const add = async(peerId: PeerId, append: boolean) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger',\n append\n });\n\n const user = await this.managers.appUsersManager.getUser(peerId.toUserId());\n if(!user) {\n return;\n }\n\n const usernames = getPeerActiveUsernames(user);\n const username = usernames[0];\n if(user.pFlags.bot) {\n dom.lastMessageSpan.append('@' + username);\n } else {\n if(user.phone) dom.lastMessageSpan.innerHTML = formatUserPhone(user.phone);\n else dom.lastMessageSpan.append(username ? '@' + username : getUserStatusString(user));\n }\n\n // dom.titleSpan.innerHTML = 'Raaid El Syed';\n // dom.lastMessageSpan.innerHTML = '+1 234 567891';\n };\n\n for(const peerId of this.peerIds) {\n add(peerId, true);\n }\n\n let target: HTMLElement;\n const onUnblock = () => {\n const peerId = target.dataset.peerId.toPeerId();\n this.managers.appUsersManager.toggleBlock(peerId, false);\n };\n\n const element = this.menuElement = ButtonMenuSync({\n buttons: [{\n icon: 'lockoff',\n text: 'Unblock',\n onClick: onUnblock,\n options: {listenerSetter: this.listenerSetter}\n }]\n });\n element.id = 'blocked-users-contextmenu';\n element.classList.add('contextmenu');\n\n document.getElementById('page-chats').append(element);\n\n attachContextMenuListener({\n element: this.scrollable.container,\n callback: (e) => {\n target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(!target) {\n return;\n }\n\n if(e instanceof MouseEvent) e.preventDefault();\n // smth\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n positionMenu(e, element);\n contextMenuController.openBtnMenu(element);\n },\n listenerSetter: this.listenerSetter\n });\n\n this.listenerSetter.add(rootScope)('peer_block', (update) => {\n const {peerId, blocked} = update;\n const li = list.querySelector(`[data-peer-id=\"${peerId}\"]`);\n if(blocked) {\n if(!li) {\n add(peerId, false);\n }\n } else {\n if(li) {\n li.remove();\n }\n }\n });\n\n const LOAD_COUNT = 50;\n let loading = false;\n this.scrollable.onScrolledBottom = () => {\n if(loading) {\n return;\n }\n\n loading = true;\n this.managers.appUsersManager.getBlocked(list.childElementCount, LOAD_COUNT).then((res) => {\n for(const peerId of res.peerIds) {\n add(peerId, true);\n }\n\n if(res.peerIds.length < LOAD_COUNT || list.childElementCount === res.count) {\n this.scrollable.onScrolledBottom = null;\n }\n\n this.scrollable.checkForTriggers();\n }).finally(() => {\n loading = false;\n });\n };\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n\n onCloseAfterTimeout() {\n if(this.menuElement) {\n this.menuElement.remove();\n }\n\n return super.onCloseAfterTimeout();\n }\n}\n","export default function convertKeyToInputKey(key: string) {\n key = key[0].toUpperCase() + key.slice(1);\n key = 'input' + key;\n return key;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport PrivacySection from '../../../privacySection';\nimport {LangPackKey} from '../../../../lib/langPack';\n\nexport default class AppPrivacyVoicesTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('privacy-tab', 'privacy-voices');\n this.setTitle('PrivacyVoiceMessages');\n\n const caption: LangPackKey = 'PrivacyVoiceMessagesInfo';\n new PrivacySection({\n tab: this,\n title: 'PrivacyVoiceMessagesTitle',\n inputKey: 'inputPrivacyKeyVoiceMessages',\n captions: [caption, caption, caption],\n exceptionTexts: ['PrivacySettingsController.NeverAllow', 'PrivacySettingsController.AlwaysAllow'],\n appendTo: this.scrollable,\n managers: this.managers\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatDateAccordingToTodayNew} from '../../../helpers/date';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport {WebAuthorization} from '../../../layer';\nimport AvatarElement from '../../avatar';\nimport Button from '../../button';\nimport confirmationPopup from '../../confirmationPopup';\nimport Row from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport wrapPeerTitle from '../../wrappers/peerTitle';\n\nexport default class AppActiveWebSessionsTab extends SliderSuperTabEventable {\n public async init(sessions: WebAuthorization[]) {\n this.container.classList.add('active-sessions-container');\n this.setTitle('WebSessionsTitle');\n\n const Session = async(auth: WebAuthorization) => {\n const peerId = auth.bot_id.toPeerId();\n const row = new Row({\n title: await wrapPeerTitle({peerId}),\n subtitle: [auth.ip, auth.region].join(' - '),\n clickable: true,\n titleRight: formatDateAccordingToTodayNew(new Date(Math.max(auth.date_active, auth.date_created) * 1000))\n });\n\n const media = row.createMedia('big');\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-48');\n await avatar.updateWithOptions({peerId});\n media.append(avatar);\n\n row.container.dataset.hash = '' + auth.hash;\n row.container.dataset.peerId = '' + peerId;\n\n row.midtitle.textContent = [auth.domain, auth.browser, auth.platform].filter(Boolean).join(', ');\n\n return row;\n };\n\n {\n const section = new SettingSection({\n caption: 'ClearOtherWebSessionsHelp'\n });\n\n const btnTerminate = Button('btn-primary btn-transparent danger', {icon: 'stop', text: 'TerminateAllWebSessions'});\n\n attachClickEvent(btnTerminate, async() => {\n await confirmationPopup({\n descriptionLangKey: 'AreYouSureWebSessions',\n button: {\n langKey: 'Disconnect',\n isDanger: true\n }\n });\n\n const toggle = toggleDisability([btnTerminate], true);\n this.managers.appSeamlessLoginManager.resetWebAuthorizations().then(() => {\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnTerminate);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({\n name: 'OtherWebSessions',\n caption: 'TerminateWebSessionInfo'\n });\n\n const rows = await Promise.all(sessions.map(Session));\n section.content.append(...rows.map((row) => row.container));\n\n let leftLength = rows.length;\n attachClickEvent(section.content, async(e) => {\n const row = findUpClassName(e.target, 'row');\n if(!row) {\n return;\n }\n\n await confirmationPopup({\n descriptionLangKey: 'TerminateWebSessionText',\n descriptionLangArgs: [await wrapPeerTitle({peerId: row.dataset.peerId.toPeerId()})],\n button: {\n langKey: 'Disconnect',\n isDanger: true\n }\n });\n\n const hash = row.dataset.hash;\n row.classList.add('is-disabled');\n this.managers.appSeamlessLoginManager.resetWebAuthorization(hash).then(() => {\n if(!--leftLength) {\n this.close();\n } else {\n row.remove();\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.scrollable.append(section.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SliderSuperTab, {SliderSuperTabEventable} from '../../sliderTab';\nimport Row from '../../row';\nimport {AccountPassword, Authorization, InputPrivacyKey, Updates, WebAuthorization} from '../../../layer';\nimport AppPrivacyPhoneNumberTab from './privacy/phoneNumber';\nimport AppTwoStepVerificationTab from './2fa';\nimport AppTwoStepVerificationEnterPasswordTab from './2fa/enterPassword';\nimport AppTwoStepVerificationEmailConfirmationTab from './2fa/emailConfirmation';\nimport AppPrivacyLastSeenTab from './privacy/lastSeen';\nimport AppPrivacyProfilePhotoTab from './privacy/profilePhoto';\nimport AppPrivacyForwardMessagesTab from './privacy/forwardMessages';\nimport AppPrivacyAddToGroupsTab from './privacy/addToGroups';\nimport AppPrivacyCallsTab from './privacy/calls';\nimport AppActiveSessionsTab from './activeSessions';\nimport AppBlockedUsersTab from './blockedUsers';\nimport rootScope from '../../../lib/rootScope';\nimport {i18n, LangPackKey, _i18n} from '../../../lib/langPack';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport CheckboxField from '../../checkboxField';\nimport PopupPeer from '../../popups/peer';\nimport Button from '../../button';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport convertKeyToInputKey from '../../../helpers/string/convertKeyToInputKey';\nimport getPrivacyRulesDetails from '../../../lib/appManagers/utils/privacy/getPrivacyRulesDetails';\nimport PrivacyType from '../../../lib/appManagers/utils/privacy/privacyType';\nimport confirmationPopup, {PopupConfirmationOptions} from '../../confirmationPopup';\nimport noop from '../../../helpers/noop';\nimport {toastNew} from '../../toast';\nimport AppPrivacyVoicesTab from './privacy/voices';\nimport SettingSection from '../../settingSection';\nimport AppActiveWebSessionsTab from './activeWebSessions';\n\nexport default class AppPrivacyAndSecurityTab extends SliderSuperTabEventable {\n private activeSessionsRow: Row;\n private authorizations: Authorization.authorization[];\n\n private websitesRow: Row;\n private websites: WebAuthorization[];\n\n public static getInitArgs(fromTab: SliderSuperTab) {\n return {\n appConfig: fromTab.managers.apiManager.getAppConfig(),\n globalPrivacy: fromTab.managers.appPrivacyManager.getGlobalPrivacySettings(),\n contentSettings: fromTab.managers.apiManager.invokeApi('account.getContentSettings'),\n webAuthorizations: fromTab.managers.appSeamlessLoginManager.getWebAuthorizations()\n };\n }\n\n public init(p: ReturnType) {\n this.container.classList.add('dont-u-dare-block-me');\n this.setTitle('PrivacySettings');\n\n const SUBTITLE: LangPackKey = 'Loading';\n const promises: Promise[] = [];\n\n {\n const section = new SettingSection({noDelimiter: true, caption: 'SessionsInfo'});\n\n let blockedPeerIds: PeerId[];\n const blockedUsersRow = new Row({\n icon: 'deleteuser',\n titleLangKey: 'BlockedUsers',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n const tab = this.slider.createTab(AppBlockedUsersTab);\n tab.peerIds = blockedPeerIds;\n tab.open();\n },\n listenerSetter: this.listenerSetter\n });\n blockedUsersRow.freezed = true;\n\n let passwordState: AccountPassword;\n const twoFactorRowOptions = {\n icon: 'lock',\n titleLangKey: 'TwoStepVerification' as LangPackKey,\n subtitleLangKey: SUBTITLE,\n clickable: (e: Event) => {\n let tab: AppTwoStepVerificationTab | AppTwoStepVerificationEnterPasswordTab | AppTwoStepVerificationEmailConfirmationTab;\n if(passwordState.pFlags.has_password) {\n tab = this.slider.createTab(AppTwoStepVerificationEnterPasswordTab);\n } else if(passwordState.email_unconfirmed_pattern) {\n tab = this.slider.createTab(AppTwoStepVerificationEmailConfirmationTab);\n tab.email = passwordState.email_unconfirmed_pattern;\n tab.length = 6;\n tab.isFirst = true;\n this.managers.passwordManager.resendPasswordEmail();\n } else {\n tab = this.slider.createTab(AppTwoStepVerificationTab);\n }\n\n tab.state = passwordState;\n tab.open();\n },\n listenerSetter: this.listenerSetter\n };\n\n const twoFactorRow = new Row(twoFactorRowOptions);\n twoFactorRow.freezed = true;\n\n const activeSessionsRow = this.activeSessionsRow = new Row({\n icon: 'activesessions',\n titleLangKey: 'SessionsTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n const tab = this.slider.createTab(AppActiveSessionsTab);\n tab.authorizations = this.authorizations;\n tab.eventListener.addEventListener('destroy', () => {\n this.updateActiveSessions();\n }, {once: true});\n tab.open();\n },\n listenerSetter: this.listenerSetter\n });\n activeSessionsRow.freezed = true;\n\n const websitesRow = this.websitesRow = new Row({\n icon: 'mention',\n titleLangKey: 'OtherWebSessions',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n const tab = this.slider.createTab(AppActiveWebSessionsTab);\n tab.eventListener.addEventListener('destroy', () => {\n this.updateActiveWebsites();\n });\n tab.open(this.websites);\n },\n listenerSetter: this.listenerSetter\n });\n websitesRow.freezed = true;\n\n section.content.append(blockedUsersRow.container, twoFactorRow.container, activeSessionsRow.container, websitesRow.container);\n this.scrollable.append(section.container);\n\n const setBlockedCount = (count: number) => {\n if(count) {\n replaceContent(blockedUsersRow.subtitle, i18n('PrivacySettingsController.UserCount', [count]));\n } else {\n replaceContent(blockedUsersRow.subtitle, i18n('BlockedEmpty', [count]));\n }\n };\n\n this.listenerSetter.add(rootScope)('peer_block', () => {\n /* const {blocked, peerId} = update;\n if(!blocked) blockedPeerIds.findAndSplice((p) => p === peerId);\n else blockedPeerIds.unshift(peerId);\n blockedCount += blocked ? 1 : -1;\n setBlockedCount(blockedCount); */\n updateBlocked();\n });\n\n const updateBlocked = () => {\n this.managers.appUsersManager.getBlocked().then((res) => {\n blockedUsersRow.freezed = false;\n setBlockedCount(res.count);\n blockedPeerIds = res.peerIds;\n });\n };\n\n updateBlocked();\n\n this.managers.passwordManager.getState().then((state) => {\n passwordState = state;\n replaceContent(twoFactorRow.subtitle, i18n(state.pFlags.has_password ? 'PrivacyAndSecurity.Item.On' : 'PrivacyAndSecurity.Item.Off'));\n twoFactorRow.freezed = false;\n\n // console.log('password state', state);\n });\n\n this.updateActiveSessions();\n promises.push(this.updateActiveWebsites(p.webAuthorizations));\n }\n\n {\n const section = new SettingSection({name: 'PrivacyTitle', caption: 'GroupsAndChannelsHelp'});\n\n section.content.classList.add('privacy-navigation-container');\n\n const rowsByKeys: Partial<{\n [key in InputPrivacyKey['_']]: Row\n }> = {};\n\n const numberVisibilityRow = rowsByKeys['inputPrivacyKeyPhoneNumber'] = new Row({\n titleLangKey: 'PrivacyPhoneTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyPhoneNumberTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const lastSeenTimeRow = rowsByKeys['inputPrivacyKeyStatusTimestamp'] = new Row({\n titleLangKey: 'LastSeenTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyLastSeenTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const photoVisibilityRow = rowsByKeys['inputPrivacyKeyProfilePhoto'] = new Row({\n titleLangKey: 'PrivacyProfilePhotoTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyProfilePhotoTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const callRow = rowsByKeys['inputPrivacyKeyPhoneCall'] = new Row({\n titleLangKey: 'WhoCanCallMe',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyCallsTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const linkAccountRow = rowsByKeys['inputPrivacyKeyForwards'] = new Row({\n titleLangKey: 'PrivacyForwardsTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyForwardMessagesTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const groupChatsAddRow = rowsByKeys['inputPrivacyKeyChatInvite'] = new Row({\n titleLangKey: 'WhoCanAddMe',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n this.slider.createTab(AppPrivacyAddToGroupsTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const voicesRow = rowsByKeys['inputPrivacyKeyVoiceMessages'] = new Row({\n titleLangKey: 'PrivacyVoiceMessagesTitle',\n subtitleLangKey: SUBTITLE,\n clickable: () => {\n if(!rootScope.premium) {\n toastNew({langPackKey: 'PrivacyVoiceMessagesPremiumOnly'});\n } else {\n this.slider.createTab(AppPrivacyVoicesTab).open();\n }\n },\n listenerSetter: this.listenerSetter\n });\n\n const updatePrivacyRow = (key: InputPrivacyKey['_']) => {\n const row = rowsByKeys[key];\n if(!row) {\n return;\n }\n\n this.managers.appPrivacyManager.getPrivacy(key).then((rules) => {\n const details = getPrivacyRulesDetails(rules);\n const langKey = details.type === PrivacyType.Everybody ? 'PrivacySettingsController.Everbody' : (details.type === PrivacyType.Contacts ? 'PrivacySettingsController.MyContacts' : 'PrivacySettingsController.Nobody');\n const disallowLength = details.disallowPeers.users.length + details.disallowPeers.chats.length;\n const allowLength = details.allowPeers.users.length + details.allowPeers.chats.length;\n\n row.subtitle.innerHTML = '';\n const s = i18n(langKey);\n row.subtitle.append(s);\n if(disallowLength || allowLength) {\n row.subtitle.append(` (${[-disallowLength, allowLength ? '+' + allowLength : 0].filter(Boolean).join(', ')})`);\n }\n });\n };\n\n section.content.append(\n numberVisibilityRow.container,\n lastSeenTimeRow.container,\n photoVisibilityRow.container,\n callRow.container,\n linkAccountRow.container,\n groupChatsAddRow.container,\n voicesRow.container\n );\n this.scrollable.append(section.container);\n\n for(const key in rowsByKeys) {\n updatePrivacyRow(key as keyof typeof rowsByKeys);\n }\n\n rootScope.addEventListener('privacy_update', (update) => {\n updatePrivacyRow(convertKeyToInputKey(update.key._) as any);\n });\n }\n\n {\n const section = new SettingSection({name: 'NewChatsFromNonContacts', caption: 'ArchiveAndMuteInfo'});\n\n const checkboxField = new CheckboxField({text: 'ArchiveAndMute'});\n const row = new Row({\n checkboxField\n });\n\n section.content.append(row.container);\n\n let enabled: boolean, destroyed: boolean;\n this.eventListener.addEventListener('destroy', () => {\n destroyed = true;\n if(enabled === undefined || enabled === checkboxField.checked) return;\n return this.managers.appPrivacyManager.setGlobalPrivacySettings({\n _: 'globalPrivacySettings',\n archive_and_mute_new_noncontact_peers: checkboxField.checked\n });\n }, {once: true});\n\n const promise = Promise.all([\n p.appConfig,\n p.globalPrivacy\n ]).then(([appConfig, settings]) => {\n if(destroyed) {\n return;\n }\n\n const onPremiumToggle = (isPremium: boolean) => {\n section.container.classList.toggle('hide', !isPremium && !appConfig.autoarchive_setting_available);\n };\n\n this.listenerSetter.add(rootScope)('premium_toggle', onPremiumToggle);\n onPremiumToggle(rootScope.premium);\n\n enabled = !!settings.archive_and_mute_new_noncontact_peers;\n\n checkboxField.setValueSilently(enabled);\n });\n\n promises.push(promise);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'Privacy.SensitiveContent', caption: 'PrivacyAndSecurity.SensitiveDesc'});\n section.container.classList.add('hide');\n\n const checkboxField = new CheckboxField({text: 'PrivacyAndSecurity.SensitiveText'});\n const row = new Row({\n checkboxField\n });\n\n section.content.append(row.container);\n\n let enabled: boolean;\n this.eventListener.addEventListener('destroy', () => {\n if(enabled === undefined) return;\n const _enabled = row.checkboxField.checked;\n const isChanged = _enabled !== enabled;\n if(!isChanged) {\n return;\n }\n\n return this.managers.apiManager.invokeApi('account.setContentSettings', {\n sensitive_enabled: _enabled\n });\n }, {once: true});\n\n const promise = p.contentSettings.then((settings) => {\n if(!settings.pFlags.sensitive_can_change) {\n return;\n }\n\n enabled = !!settings.pFlags.sensitive_enabled;\n checkboxField.setValueSilently(enabled);\n section.container.classList.remove('hide');\n });\n\n promises.push(promise);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'PrivacyPayments', caption: 'PrivacyPaymentsClearInfo'});\n\n const onClearClick = () => {\n const options: PopupConfirmationOptions = {\n titleLangKey: 'PrivacyPaymentsClearAlertTitle',\n descriptionLangKey: 'PrivacyPaymentsClearAlertText',\n button: {\n langKey: 'Clear'\n },\n checkboxes: [{\n text: 'PrivacyClearShipping',\n checked: true\n }, {\n text: 'PrivacyClearPayment',\n checked: true\n }]\n };\n\n confirmationPopup(options).then(() => {\n const [info, payment] = options.checkboxes.map((c) => c.checkboxField.checked);\n const toggle = toggleDisability([clearButton], true);\n this.managers.appPaymentsManager.clearSavedInfo(info, payment).then(() => {\n if(!info && !payment) {\n return;\n }\n\n toggle();\n toastNew({\n langPackKey: info && payment ? 'PrivacyPaymentsPaymentShippingCleared' : (info ? 'PrivacyPaymentsShippingInfoCleared' : 'PrivacyPaymentsPaymentInfoCleared')\n });\n });\n }, noop);\n };\n\n const clearButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyPaymentsClear'});\n this.listenerSetter.add(clearButton)('click', onClearClick);\n section.content.append(clearButton);\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'FilterChats'});\n\n const onDeleteClick = () => {\n const popup = new PopupPeer('popup-delete-drafts', {\n buttons: [{\n langKey: 'Delete',\n callback: () => {\n const toggle = toggleDisability([deleteButton], true);\n this.managers.appDraftsManager.clearAllDrafts().then(() => {\n toggle();\n });\n },\n isDanger: true\n }],\n titleLangKey: 'AreYouSureClearDraftsTitle',\n descriptionLangKey: 'AreYouSureClearDrafts'\n });\n\n popup.show();\n };\n\n const deleteButton = Button('btn-primary btn-transparent', {icon: 'delete', text: 'PrivacyDeleteCloudDrafts'});\n this.listenerSetter.add(deleteButton)('click', onDeleteClick);\n section.content.append(deleteButton);\n\n /* promises.push(apiManager.invokeApi('messages.getAllDrafts').then((drafts) => {\n const draftsRow = new Row({\n titleLangKey: 'PrivacyDeleteCloudDrafts',\n subtitleLangKey: 'Drafts',\n subtitleLangArgs: [(drafts as Updates.updates).updates.length],\n icon: 'delete',\n clickable: onDeleteClick\n });\n\n section.content.append(draftsRow.container);\n })); */\n\n this.scrollable.append(section.container);\n }\n\n // {\n // const section = new SettingSection({\n // name: 'OtherWebSessions'\n // });\n\n // const row = new Row({\n\n // });\n\n // this.scrollable.append(section.container);\n // }\n\n return Promise.all(promises);\n }\n\n public updateActiveSessions() {\n return this.managers.apiManager.invokeApi('account.getAuthorizations').then((auths) => {\n this.activeSessionsRow.freezed = false;\n this.authorizations = auths.authorizations;\n _i18n(this.activeSessionsRow.subtitle, 'Privacy.Devices', [this.authorizations.length]);\n });\n }\n\n public updateActiveWebsites(promise = this.managers.appSeamlessLoginManager.getWebAuthorizations()) {\n return promise.then((authorizations) => {\n this.websitesRow.freezed = false;\n this.websites = authorizations;\n _i18n(this.websitesRow.subtitle, 'Privacy.Websites', [this.websites.length]);\n this.websitesRow.container.classList.toggle('hide', !this.websites.length);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {renderImageFromUrlPromise} from './dom/renderImageFromUrl';\n\nexport function averageColorFromCanvas(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n\n const pixel = new Array(4).fill(0);\n const pixels = context.getImageData(0, 0, canvas.width, canvas.height).data;\n const pixelsLength = pixels.length / 4;\n for(let i = 0; i < pixels.length; i += 4) {\n // const alphaPixel = pixels[i + 3];\n pixel[0] += pixels[i]/* * (alphaPixel / 255) */;\n pixel[1] += pixels[i + 1]/* * (alphaPixel / 255) */;\n pixel[2] += pixels[i + 2]/* * (alphaPixel / 255) */;\n pixel[3] += pixels[i + 3];\n }\n\n const outPixel = new Uint8ClampedArray(4);\n outPixel[0] = pixel[0] / pixelsLength;\n outPixel[1] = pixel[1] / pixelsLength;\n outPixel[2] = pixel[2] / pixelsLength;\n outPixel[3] = pixel[3] / pixelsLength;\n // outPixel[3] = 255;\n return outPixel;\n}\n\nexport function averageColorFromImageSource(imageSource: CanvasImageSource, width: number, height: number) {\n const canvas = document.createElement('canvas');\n const ratio = width / height;\n const DIMENSIONS = 50;\n if(ratio === 1) {\n canvas.width = DIMENSIONS;\n canvas.height = canvas.width / ratio;\n } else if(ratio > 1) {\n canvas.height = DIMENSIONS;\n canvas.width = canvas.height / ratio;\n } else {\n canvas.width = canvas.height = DIMENSIONS;\n }\n\n const context = canvas.getContext('2d');\n context.drawImage(imageSource, 0, 0, width, height, 0, 0, canvas.width, canvas.height);\n return averageColorFromCanvas(canvas);\n}\n\nexport function averageColor(imageUrl: string) {\n const img = document.createElement('img');\n return renderImageFromUrlPromise(img, imageUrl, false).then(() => {\n return averageColorFromImageSource(img, img.naturalWidth, img.naturalHeight);\n });\n};\n","import {rgbaToHsla} from './color';\n\n// * https://github.com/TelegramMessenger/Telegram-iOS/blob/3d062fff78cc6b287c74e6171f855a3500c0156d/submodules/TelegramPresentationData/Sources/PresentationData.swift#L453\nexport default function highlightningColor(rgba: [number, number, number, number?]) {\n let {h, s, l} = rgbaToHsla(rgba[0], rgba[1], rgba[2]);\n if(s > 0) {\n s = Math.min(100, s + 5 + 0.1 * (100 - s));\n }\n l = Math.max(0, l * .65);\n\n const hsla = `hsla(${h}, ${s}%, ${l}%, .4)`;\n return hsla;\n}\n","import {ColorHsla, ColorRgba, hexaToHsla, hslaToRgba, rgbaToHexa as rgbaToHexa, rgbaToHsla} from '../helpers/color';\nimport attachGrabListeners from '../helpers/dom/attachGrabListeners';\nimport clamp from '../helpers/number/clamp';\nimport InputField, {InputState} from './inputField';\n\nexport type ColorPickerColor = {\n hsl: string;\n rgb: string;\n hex: string;\n hsla: string;\n rgba: string;\n hexa: string;\n rgbaArray: ColorRgba;\n};\n\nexport default class ColorPicker {\n private static BASE_CLASS = 'color-picker';\n public container: HTMLElement;\n\n private boxRect: DOMRect;\n // private boxDraggerRect: DOMRect;\n private hueRect: DOMRect;\n // private hueDraggerRect: DOMRect;\n\n private hue = 0;\n private saturation = 100;\n private lightness = 50;\n private alpha = 1;\n private elements: {\n box: SVGSVGElement,\n boxDragger: SVGSVGElement,\n sliders: HTMLElement,\n hue: SVGSVGElement,\n hueDragger: SVGSVGElement,\n saturation: SVGLinearGradientElement,\n } = {} as any;\n private hexInputField: InputField;\n private rgbInputField: InputField;\n public onChange: (color: ReturnType) => void;\n\n constructor() {\n this.container = document.createElement('div');\n this.container.classList.add(ColorPicker.BASE_CLASS);\n\n const html = `\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n `;\n\n this.container.innerHTML = html;\n\n this.elements.box = this.container.firstElementChild as any;\n this.elements.boxDragger = this.elements.box.lastElementChild as any;\n this.elements.saturation = this.elements.box.firstElementChild.firstElementChild as any;\n\n this.elements.sliders = this.elements.box.nextElementSibling as any;\n\n this.elements.hue = this.elements.sliders.firstElementChild as any;\n this.elements.hueDragger = this.elements.hue.lastElementChild as any;\n\n this.hexInputField = new InputField({plainText: true, label: 'Appearance.Color.Hex'});\n this.rgbInputField = new InputField({plainText: true, label: 'Appearance.Color.RGB'});\n\n const inputs = document.createElement('div');\n inputs.className = ColorPicker.BASE_CLASS + '-inputs';\n inputs.append(this.hexInputField.container, this.rgbInputField.container);\n this.container.append(inputs);\n\n this.hexInputField.input.addEventListener('input', () => {\n let value = this.hexInputField.value.replace(/#/g, '').slice(0, 6);\n\n const match = value.match(/([a-fA-F\\d]+)/);\n const valid = match && match[0].length === value.length && [/* 3, 4, */6].includes(value.length);\n this.hexInputField.setState(valid ? InputState.Neutral : InputState.Error);\n\n value = '#' + value;\n this.hexInputField.setValueSilently(value);\n\n if(valid) {\n this.setColor(value, false, true);\n }\n });\n\n // patched https://stackoverflow.com/a/34029238/6758968\n const rgbRegExp = /^(?:rgb)?\\(?([01]?\\d\\d?|2[0-4]\\d|25[0-5])(?:\\W+)([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\W+(?:([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\)?)$/;\n this.rgbInputField.input.addEventListener('input', () => {\n const match = this.rgbInputField.value.match(rgbRegExp);\n this.rgbInputField.setState(match ? InputState.Neutral : InputState.Error);\n\n if(match) {\n this.setColor(rgbaToHsla(+match[1], +match[2], +match[3]), true, false);\n }\n });\n\n this.attachBoxListeners();\n this.attachHueListeners();\n }\n\n private onGrabStart = () => {\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = 'grabbing';\n };\n\n private onGrabEnd = () => {\n document.documentElement.style.cursor = this.elements.boxDragger.style.cursor = '';\n };\n\n private attachBoxListeners() {\n attachGrabListeners(this.elements.box as any, () => {\n this.onGrabStart();\n this.boxRect = this.elements.box.getBoundingClientRect();\n // this.boxDraggerRect = this.elements.boxDragger.getBoundingClientRect();\n }, (pos) => {\n this.saturationHandler(pos.x, pos.y);\n }, () => {\n this.onGrabEnd();\n });\n }\n\n private attachHueListeners() {\n attachGrabListeners(this.elements.hue as any, () => {\n this.onGrabStart();\n this.hueRect = this.elements.hue.getBoundingClientRect();\n // this.hueDraggerRect = this.elements.hueDragger.getBoundingClientRect();\n }, (pos) => {\n this.hueHandler(pos.x);\n }, () => {\n this.onGrabEnd();\n });\n }\n\n public setColor(color: ColorHsla | string, updateHexInput = true, updateRgbInput = true) {\n if(color === undefined) { // * set to red\n color = {\n h: 0,\n s: 100,\n l: 50,\n a: 1\n };\n } else if(typeof(color) === 'string') {\n if(color[0] === '#') {\n color = hexaToHsla(color);\n } else {\n const rgb = color.match(/[.?\\d]+/g);\n color = rgbaToHsla(+rgb[0], +rgb[1], +rgb[2], rgb[3] === undefined ? 1 : +rgb[3]);\n }\n }\n\n // Set box\n this.boxRect = this.elements.box.getBoundingClientRect();\n\n const boxX = this.boxRect.width / 100 * color.s;\n const percentY = 100 - (color.l / (100 - color.s / 2)) * 100;\n const boxY = this.boxRect.height / 100 * percentY;\n\n this.saturationHandler(this.boxRect.left + boxX, this.boxRect.top + boxY, false);\n\n // Set hue\n this.hueRect = this.elements.hue.getBoundingClientRect();\n\n const percentHue = color.h / 360;\n const hueX = this.hueRect.left + this.hueRect.width * percentHue;\n\n this.hueHandler(hueX, false);\n\n // Set values\n this.hue = color.h;\n this.saturation = color.s;\n this.lightness = color.l;\n this.alpha = color.a;\n\n this.updatePicker(updateHexInput, updateRgbInput);\n };\n\n public getCurrentColor(): ColorPickerColor {\n const rgbaArray = hslaToRgba(this.hue, this.saturation, this.lightness, this.alpha);\n const hexa = rgbaToHexa(rgbaArray);\n const hex = hexa.slice(0, -2);\n\n return {\n hsl: `hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`,\n rgb: `rgb(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]})`,\n hex: hex,\n hsla: `hsla(${this.hue}, ${this.saturation}%, ${this.lightness}%, ${this.alpha})`,\n rgba: `rgba(${rgbaArray[0]}, ${rgbaArray[1]}, ${rgbaArray[2]}, ${rgbaArray[3]})`,\n hexa: hexa,\n rgbaArray: rgbaArray\n };\n }\n\n public updatePicker(updateHexInput = true, updateRgbInput = true) {\n const color = this.getCurrentColor();\n this.elements.boxDragger.setAttributeNS(null, 'fill', color.hex);\n\n if(updateHexInput) {\n this.hexInputField.setValueSilently(color.hex);\n this.hexInputField.setState(InputState.Neutral);\n }\n\n if(updateRgbInput) {\n this.rgbInputField.setValueSilently(color.rgbaArray.slice(0, -1).join(', '));\n this.rgbInputField.setState(InputState.Neutral);\n }\n\n if(this.onChange) {\n this.onChange(color);\n }\n }\n\n private hueHandler(pageX: number, update = true) {\n const eventX = clamp(pageX - this.hueRect.left, 0, this.hueRect.width);\n\n const percents = eventX / this.hueRect.width;\n this.hue = Math.round(360 * percents);\n\n const hsla = `hsla(${this.hue}, 100%, 50%, ${this.alpha})`;\n\n this.elements.hueDragger.setAttributeNS(null, 'x', (percents * 100) + '%');\n this.elements.hueDragger.setAttributeNS(null, 'fill', hsla);\n\n this.elements.saturation.lastElementChild.setAttributeNS(null, 'stop-color', hsla);\n\n if(update) {\n this.updatePicker();\n }\n }\n\n private saturationHandler(pageX: number, pageY: number, update = true) {\n const maxX = this.boxRect.width;\n const maxY = this.boxRect.height;\n\n const eventX = clamp(pageX - this.boxRect.left, 0, maxX);\n const eventY = clamp(pageY - this.boxRect.top, 0, maxY);\n\n const posX = eventX / maxX * 100;\n const posY = eventY / maxY * 100;\n\n const boxDragger = this.elements.boxDragger;\n boxDragger.setAttributeNS(null, 'x', posX + '%');\n boxDragger.setAttributeNS(null, 'y', posY + '%');\n\n const saturation = clamp(posX, 0, 100);\n\n const lightnessX = 100 - saturation / 2;\n const lightnessY = 100 - clamp(posY, 0, 100);\n\n const lightness = clamp(lightnessY / 100 * lightnessX, 0, 100);\n\n this.saturation = saturation;\n this.lightness = lightness;\n\n if(update) {\n this.updatePicker();\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Theme} from '../../../config/state';\nimport {hexaToRgba} from '../../../helpers/color';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport highlightningColor from '../../../helpers/highlightningColor';\nimport throttle from '../../../helpers/schedulers/throttle';\nimport themeController from '../../../helpers/themeController';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport rootScope from '../../../lib/rootScope';\nimport ColorPicker, {ColorPickerColor} from '../../colorPicker';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTab} from '../../slider';\n\nexport default class AppBackgroundColorTab extends SliderSuperTab {\n private colorPicker: ColorPicker;\n private grid: HTMLElement;\n private applyColor: (hex: string, updateColorPicker?: boolean) => void;\n private theme: Theme;\n\n init() {\n this.container.classList.add('background-container', 'background-color-container');\n this.setTitle('SetColor');\n\n this.theme = themeController.getTheme();\n\n const section = new SettingSection({});\n this.colorPicker = new ColorPicker();\n\n section.content.append(this.colorPicker.container);\n\n this.scrollable.append(section.container);\n\n const gridSection = new SettingSection({});\n\n const grid = this.grid = document.createElement('div');\n grid.classList.add('grid');\n\n const colors = [\n '#E6EBEE',\n '#B2CEE1',\n '#008DD0',\n '#C6E7CB',\n '#C4E1A6',\n '#60B16E',\n '#CCD0AF',\n '#A6A997',\n '#7A7072',\n '#FDD7AF',\n '#FDB76E',\n '#DD8851'\n ];\n\n colors.forEach((color) => {\n const item = document.createElement('div');\n item.classList.add('grid-item');\n item.dataset.color = color.toLowerCase();\n\n // * need for transform scale\n const media = document.createElement('div');\n media.classList.add('grid-item-media');\n media.style.backgroundColor = color;\n\n item.append(media);\n grid.append(item);\n });\n\n attachClickEvent(grid, (e) => {\n const target = findUpClassName(e.target, 'grid-item');\n if(!target || target.classList.contains('active')) {\n return;\n }\n\n const color = target.dataset.color;\n if(!color) {\n return;\n }\n\n this.applyColor(color);\n }, {listenerSetter: this.listenerSetter});\n\n gridSection.content.append(grid);\n this.scrollable.append(gridSection.container);\n\n this.applyColor = throttle(this._applyColor, 16, true);\n }\n\n private setActive() {\n const active = this.grid.querySelector('.active');\n const background = this.theme.background;\n const target = background.color ? this.grid.querySelector(`.grid-item[data-color=\"${background.color}\"]`) : null;\n if(active === target) {\n return;\n }\n\n if(active) {\n active.classList.remove('active');\n }\n\n if(target) {\n target.classList.add('active');\n }\n }\n\n private _applyColor = (hex: string, updateColorPicker = true) => {\n if(updateColorPicker) {\n this.colorPicker.setColor(hex);\n } else {\n const rgba = hexaToRgba(hex);\n const background = this.theme.background;\n const hsla = highlightningColor(rgba);\n\n background.id = '2';\n background.intensity = 0;\n background.slug = '';\n background.color = hex.toLowerCase();\n background.highlightningColor = hsla;\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\n\n appImManager.applyCurrentTheme(undefined, undefined, true);\n this.setActive();\n }\n };\n\n private onColorChange = (color: ColorPickerColor) => {\n this.applyColor(color.hex, false);\n };\n\n onOpen() {\n setTimeout(() => {\n const background = this.theme.background;\n\n const color = (background.color || '').split(',')[0];\n const isColored = !!color && !background.slug;\n\n // * set active if type is color\n if(isColored) {\n this.colorPicker.onChange = this.onColorChange;\n }\n\n this.colorPicker.setColor(color || '#cccccc');\n\n if(!isColored) {\n this.colorPicker.onChange = this.onColorChange;\n }\n }, 0);\n }\n\n onCloseAfterTimeout() {\n this.colorPicker.onChange = undefined;\n this.colorPicker = undefined;\n\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {averageColor, averageColorFromCanvas} from '../../../helpers/averageColor';\nimport blur from '../../../helpers/blur';\nimport deferredPromise, {CancellablePromise} from '../../../helpers/cancellablePromise';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpClassName from '../../../helpers/dom/findUpClassName';\nimport highlightningColor from '../../../helpers/highlightningColor';\nimport copy from '../../../helpers/object/copy';\nimport sequentialDom from '../../../helpers/sequentialDom';\nimport ChatBackgroundGradientRenderer from '../../chat/gradientRenderer';\nimport {Document, PhotoSize, WallPaper} from '../../../layer';\nimport {MyDocument} from '../../../lib/appManagers/appDocsManager';\nimport appDownloadManager, {AppDownloadManager, DownloadBlob} from '../../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport rootScope from '../../../lib/rootScope';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport ProgressivePreloader from '../../preloader';\nimport {SliderSuperTab} from '../../slider';\nimport AppBackgroundColorTab from './backgroundColor';\nimport choosePhotoSize from '../../../lib/appManagers/utils/photos/choosePhotoSize';\nimport {STATE_INIT, Theme} from '../../../config/state';\nimport themeController from '../../../helpers/themeController';\nimport requestFile from '../../../helpers/files/requestFile';\nimport {renderImageFromUrlPromise} from '../../../helpers/dom/renderImageFromUrl';\nimport scaleMediaElement from '../../../helpers/canvas/scaleMediaElement';\nimport {MediaSize} from '../../../helpers/mediaSize';\nimport wrapPhoto from '../../wrappers/photo';\nimport {CreateRowFromCheckboxField} from '../../row';\nimport {generateSection} from '../../settingSection';\n\nexport default class AppBackgroundTab extends SliderSuperTab {\n private grid: HTMLElement;\n private tempId = 0;\n private clicked: Set = new Set();\n private blurCheckboxField: CheckboxField;\n\n private wallPapersByElement: Map = new Map();\n private elementsByKey: Map = new Map();\n\n public static getInitArgs() {\n return {\n backgrounds: rootScope.managers.appDocsManager.getWallPapers()\n };\n }\n\n private get theme() {\n return themeController.getTheme();\n }\n\n public init(p: ReturnType = AppBackgroundTab.getInitArgs()) {\n this.container.classList.add('background-container', 'background-image-container');\n this.setTitle('ChatBackground');\n\n {\n const container = generateSection(this.scrollable);\n\n const uploadButton = Button('btn-primary btn-transparent', {icon: 'cameraadd', text: 'ChatBackground.UploadWallpaper'});\n const colorButton = Button('btn-primary btn-transparent', {icon: 'colorize', text: 'SetColor'});\n const resetButton = Button('btn-primary btn-transparent', {icon: 'favourites', text: 'Appearance.Reset'});\n\n attachClickEvent(uploadButton, this.onUploadClick, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(colorButton, () => {\n this.slider.createTab(AppBackgroundColorTab).open();\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(resetButton, this.onResetClick, {listenerSetter: this.listenerSetter});\n\n const blurCheckboxField = this.blurCheckboxField = new CheckboxField({\n text: 'ChatBackground.Blur',\n name: 'blur',\n checked: this.theme.background.blur\n });\n\n this.listenerSetter.add(blurCheckboxField.input)('change', async() => {\n this.theme.background.blur = blurCheckboxField.input.checked;\n await this.managers.appStateManager.pushToState('settings', rootScope.settings);\n\n // * wait for animation end\n setTimeout(() => {\n const active = grid.querySelector('.active') as HTMLElement;\n if(!active) return;\n\n const wallpaper = this.wallPapersByElement.get(active);\n if((wallpaper as WallPaper.wallPaper).pFlags.pattern || wallpaper._ === 'wallPaperNoFile') {\n return;\n }\n\n this.setBackgroundDocument(wallpaper);\n }, 100);\n });\n\n container.append(\n uploadButton,\n colorButton,\n resetButton,\n CreateRowFromCheckboxField(blurCheckboxField).container\n );\n }\n\n rootScope.addEventListener('background_change', this.setActive);\n\n const promise = p.backgrounds.then((wallPapers) => {\n const promises = wallPapers.map((wallPaper) => {\n return this.addWallPaper(wallPaper);\n });\n\n return Promise.all(promises);\n });\n\n const gridContainer = generateSection(this.scrollable);\n const grid = this.grid = document.createElement('div');\n grid.classList.add('grid');\n attachClickEvent(grid, this.onGridClick, {listenerSetter: this.listenerSetter});\n gridContainer.append(grid);\n\n return promise;\n }\n\n private onUploadClick = () => {\n requestFile('image/x-png,image/png,image/jpeg').then(async(file) => {\n if(file.name.endsWith('.png')) {\n const img = document.createElement('img');\n const url = URL.createObjectURL(file);\n await renderImageFromUrlPromise(img, url, false);\n const mimeType = 'image/jpeg';\n const {blob} = await scaleMediaElement({media: img, size: new MediaSize(img.naturalWidth, img.naturalHeight), mimeType});\n file = new File([blob], file.name.replace(/\\.png$/, '.jpg'), {type: mimeType});\n }\n\n const wallPaper = await this.managers.appDocsManager.prepareWallPaperUpload(file);\n const uploadPromise = this.managers.appDocsManager.uploadWallPaper(wallPaper.id);\n const uploadDeferred: CancellablePromise = appDownloadManager.getNewDeferredForUpload(file.name, uploadPromise);\n\n const deferred = deferredPromise();\n deferred.addNotifyListener = uploadDeferred.addNotifyListener;\n deferred.cancel = uploadDeferred.cancel;\n\n uploadDeferred.then((wallPaper) => {\n this.clicked.delete(key);\n this.elementsByKey.delete(key);\n this.wallPapersByElement.set(container, wallPaper);\n const newKey = this.getWallPaperKey(wallPaper);\n this.elementsByKey.set(newKey, container);\n\n this.setBackgroundDocument(wallPaper).then(deferred.resolve, deferred.reject);\n }, deferred.reject);\n\n const key = this.getWallPaperKey(wallPaper);\n deferred.catch(() => {\n container.remove();\n });\n\n const preloader = new ProgressivePreloader({\n isUpload: true,\n cancelable: true,\n tryAgainOnFail: false\n });\n\n const container = await this.addWallPaper(wallPaper, false);\n this.clicked.add(key);\n\n preloader.attach(container, false, deferred);\n });\n };\n\n private onResetClick = () => {\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === this.theme.name);\n if(defaultTheme) {\n ++this.tempId;\n this.theme.background = copy(defaultTheme.background);\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\n appImManager.applyCurrentTheme(undefined, undefined, true);\n this.blurCheckboxField.setValueSilently(this.theme.background.blur);\n }\n };\n\n private getColorsFromWallPaper(wallPaper: WallPaper) {\n return wallPaper.settings ? [\n wallPaper.settings.background_color,\n wallPaper.settings.second_background_color,\n wallPaper.settings.third_background_color,\n wallPaper.settings.fourth_background_color\n ].filter(Boolean).map((color) => '#' + color.toString(16)).join(',') : '';\n }\n\n private getWallPaperKey(wallPaper: WallPaper) {\n return '' + wallPaper.id;\n }\n\n private getWallPaperKeyFromTheme(theme: Theme) {\n return '' + theme.background.id;\n }\n\n private addWallPaper(wallPaper: WallPaper, append = true) {\n const colors = this.getColorsFromWallPaper(wallPaper);\n const hasFile = wallPaper._ === 'wallPaper';\n if((hasFile && wallPaper.pFlags.pattern && !colors)/* ||\n (wallpaper.document as MyDocument).mime_type.indexOf('application/') === 0 */) {\n return;\n }\n\n const isDark = !!wallPaper.pFlags.dark;\n\n const doc = hasFile ? wallPaper.document as Document.document : undefined;\n\n const container = document.createElement('div');\n container.classList.add('grid-item');\n\n container.dataset.id = '' + wallPaper.id;\n\n const key = this.getWallPaperKey(wallPaper);\n this.wallPapersByElement.set(container, wallPaper);\n this.elementsByKey.set(key, container);\n\n const media = document.createElement('div');\n media.classList.add('grid-item-media');\n\n const loadPromises: Promise[] = [];\n let wrapped: ReturnType, size: ReturnType;\n if(hasFile) {\n size = choosePhotoSize(doc, 200, 200);\n wrapped = wrapPhoto({\n photo: doc,\n message: null,\n container: media,\n withoutPreloader: true,\n size: size,\n noFadeIn: wallPaper.pFlags.pattern\n });\n\n if(wallPaper.pFlags.pattern) {\n media.classList.add('is-pattern');\n }\n\n const promise = wrapped.then(async({loadPromises, images}) => {\n await loadPromises.thumb || loadPromises.full;\n return images;\n }).then((images) => {\n if(wallPaper.pFlags.pattern) {\n if(isDark) {\n images.full.style.display = 'none';\n if(images.thumb) {\n images.thumb.style.display = 'none';\n }\n } else if(wallPaper.settings?.intensity) {\n images.full.style.opacity = '' + Math.abs(wallPaper.settings.intensity) / 100;\n }\n }\n\n return sequentialDom.mutate(() => {\n container.append(media);\n });\n });\n\n loadPromises.push(promise);\n } else {\n container.append(media);\n }\n\n if(wallPaper.settings && wallPaper.settings.background_color !== undefined) {\n const {canvas} = ChatBackgroundGradientRenderer.create(colors);\n canvas.classList.add('background-colors-canvas');\n\n if(isDark && hasFile) {\n const promise = wrapped.then(({loadPromises}) => {\n return loadPromises.full.then(async() => {\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc, size.type);\n canvas.style.webkitMaskImage = `url(${cacheContext.url})`;\n canvas.style.opacity = '' + (wallPaper.pFlags.dark ? 100 + wallPaper.settings.intensity : wallPaper.settings.intensity) / 100;\n media.append(canvas);\n });\n });\n\n loadPromises.push(promise);\n } else {\n media.append(canvas);\n }\n }\n\n if(this.getWallPaperKeyFromTheme(this.theme) === key) {\n container.classList.add('active');\n }\n\n this.grid[append ? 'append' : 'prepend'](container);\n\n return Promise.all(loadPromises).then(() => container);\n }\n\n private onGridClick = (e: MouseEvent | TouchEvent) => {\n const target = findUpClassName(e.target, 'grid-item') as HTMLElement;\n if(!target) return;\n\n const wallpaper = this.wallPapersByElement.get(target);\n if(wallpaper._ === 'wallPaperNoFile') {\n this.setBackgroundDocument(wallpaper);\n return;\n }\n\n const key = this.getWallPaperKey(wallpaper);\n if(this.clicked.has(key)) return;\n this.clicked.add(key);\n\n const doc = wallpaper.document as MyDocument;\n const preloader = new ProgressivePreloader({\n cancelable: true,\n tryAgainOnFail: false\n });\n\n const load = async() => {\n const promise = this.setBackgroundDocument(wallpaper);\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\n if(!cacheContext.url || this.theme.background.blur) {\n preloader.attach(target, true, promise);\n }\n };\n\n preloader.construct();\n\n attachClickEvent(target, (e) => {\n if(preloader.preloader.parentElement) {\n preloader.onClick(e);\n preloader.detach();\n } else {\n load();\n }\n }, {listenerSetter: this.listenerSetter});\n\n load();\n\n // console.log(doc);\n };\n\n private saveToCache = (slug: string, url: string) => {\n fetch(url).then((response) => {\n appImManager.cacheStorage.save('backgrounds/' + slug, response);\n });\n };\n\n private setBackgroundDocument = (wallPaper: WallPaper) => {\n const _tempId = ++this.tempId;\n const middleware = () => _tempId === this.tempId;\n\n const doc = (wallPaper as WallPaper.wallPaper).document as MyDocument;\n const deferred = deferredPromise();\n let download: Promise | ReturnType;\n if(doc) {\n download = appDownloadManager.downloadMediaURL({media: doc, queueId: appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : 0});\n deferred.addNotifyListener = download.addNotifyListener;\n deferred.cancel = download.cancel;\n } else {\n download = Promise.resolve();\n }\n\n download.then(async() => {\n if(!middleware()) {\n deferred.resolve();\n return;\n }\n\n const background = this.theme.background;\n const onReady = (url?: string) => {\n // const perf = performance.now();\n let getPixelPromise: Promise;\n const backgroundColor = this.getColorsFromWallPaper(wallPaper);\n if(url && !backgroundColor) {\n getPixelPromise = averageColor(url);\n } else {\n const {canvas} = ChatBackgroundGradientRenderer.create(backgroundColor);\n getPixelPromise = Promise.resolve(averageColorFromCanvas(canvas));\n }\n\n getPixelPromise.then((pixel) => {\n if(!middleware()) {\n deferred.resolve();\n return;\n }\n\n const hsla = highlightningColor(Array.from(pixel) as any);\n // const hsla = 'rgba(0, 0, 0, 0.3)';\n // console.log(doc, hsla, performance.now() - perf);\n\n const slug = (wallPaper as WallPaper.wallPaper).slug ?? '';\n background.id = wallPaper.id;\n background.intensity = wallPaper.settings?.intensity ?? 0;\n background.color = backgroundColor;\n background.slug = slug;\n background.highlightningColor = hsla;\n this.managers.appStateManager.pushToState('settings', rootScope.settings);\n\n if(slug) {\n this.saveToCache(slug, url);\n }\n\n appImManager.applyCurrentTheme(slug, url, true).then(deferred.resolve);\n });\n };\n\n if(!doc) {\n onReady();\n return;\n }\n\n const cacheContext = await this.managers.thumbsStorage.getCacheContext(doc);\n if(background.blur) {\n setTimeout(() => {\n const {canvas, promise} = blur(cacheContext.url, 12, 4)\n promise.then(() => {\n if(!middleware()) {\n deferred.resolve();\n return;\n }\n\n onReady(canvas.toDataURL());\n });\n }, 200);\n } else {\n onReady(cacheContext.url);\n }\n });\n\n return deferred;\n };\n\n private setActive = () => {\n const active = this.grid.querySelector('.active');\n const target = this.elementsByKey.get(this.getWallPaperKeyFromTheme(this.theme));\n if(active === target) {\n return;\n }\n\n if(active) {\n active.classList.remove('active');\n }\n\n if(target) {\n target.classList.add('active');\n }\n };\n}\n","export default function requestFile(accept?: string) {\n const input = document.createElement('input');\n input.type = 'file';\n input.style.display = 'none';\n\n if(accept) {\n input.accept = accept;\n }\n\n document.body.append(input);\n\n const promise = new Promise((resolve, reject) => {\n input.addEventListener('change', (e: any) => {\n const file: File = e.target.files[0];\n if(!file) {\n reject('NO_FILE_SELECTED');\n return;\n }\n\n resolve(file);\n }, {once: true});\n }).finally(() => {\n input.remove();\n });\n\n input.click();\n\n return promise;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AvailableReaction} from '../../../layer';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport SettingSection from '../../settingSection';\nimport SliderSuperTab from '../../sliderTab';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\n\nexport default class AppQuickReactionTab extends SliderSuperTab {\n public init() {\n this.setTitle('DoubleTapSetting');\n this.container.classList.add('quick-reaction-container');\n\n return Promise.all([\n this.managers.appReactionsManager.getQuickReaction(),\n this.managers.appReactionsManager.getAvailableReactions()\n ]).then(([quickReaction, availableReactions]) => {\n availableReactions = availableReactions.filter((reaction) => !reaction.pFlags.inactive);\n\n const section = new SettingSection();\n\n const name = 'quick-reaction';\n const rows = availableReactions.map((availableReaction) => {\n const radioField = new RadioField({\n name,\n text: availableReaction.title,\n value: availableReaction.reaction,\n alignRight: true\n });\n\n const row = new Row({\n radioField,\n havePadding: true\n });\n\n radioField.main.classList.add('quick-reaction-title');\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n if(availableReaction.reaction === (quickReaction as AvailableReaction).reaction) {\n radioField.setValueSilently(true);\n }\n\n return row;\n });\n\n const form = RadioFormFromRows(rows, (value) => {\n this.managers.appReactionsManager.setDefaultReaction({_: 'reactionEmoji', emoticon: value});\n });\n\n section.content.append(form);\n this.scrollable.append(section.container);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport RangeSelector from '../../rangeSelector';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport RadioField from '../../radioField';\nimport rootScope from '../../../lib/rootScope';\nimport {IS_APPLE} from '../../../environment/userAgent';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport AppBackgroundTab from './background';\nimport {LangPackKey, _i18n} from '../../../lib/langPack';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport assumeType from '../../../helpers/assumeType';\nimport {AvailableReaction, MessagesAllStickers, StickerSet} from '../../../layer';\nimport LazyLoadQueue from '../../lazyLoadQueue';\nimport PopupStickers from '../../popups/stickers';\nimport eachMinute from '../../../helpers/eachMinute';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport IS_GEOLOCATION_SUPPORTED from '../../../environment/geolocationSupport';\nimport AppQuickReactionTab from './quickReaction';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport {State} from '../../../config/state';\nimport wrapStickerSetThumb from '../../wrappers/stickerSetThumb';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\nimport SettingSection, {generateSection} from '../../settingSection';\n\nexport class RangeSettingSelector {\n public container: HTMLDivElement;\n public valueContainer: HTMLElement;\n private range: RangeSelector;\n\n public onChange: (value: number) => void;\n\n constructor(\n name: LangPackKey,\n step: number,\n initialValue: number,\n minValue: number,\n maxValue: number,\n writeValue = true\n ) {\n const BASE_CLASS = 'range-setting-selector';\n this.container = document.createElement('div');\n this.container.classList.add(BASE_CLASS);\n\n const details = document.createElement('div');\n details.classList.add(BASE_CLASS + '-details');\n\n const nameDiv = document.createElement('div');\n nameDiv.classList.add(BASE_CLASS + '-name');\n _i18n(nameDiv, name);\n\n const valueDiv = this.valueContainer = document.createElement('div');\n valueDiv.classList.add(BASE_CLASS + '-value');\n\n if(writeValue) {\n valueDiv.innerHTML = '' + initialValue;\n }\n\n details.append(nameDiv, valueDiv);\n\n this.range = new RangeSelector({\n step,\n min: minValue,\n max: maxValue\n }, initialValue);\n this.range.setListeners();\n this.range.setHandlers({\n onScrub: value => {\n if(this.onChange) {\n this.onChange(value);\n }\n\n if(writeValue) {\n // console.log('font size scrub:', value);\n valueDiv.innerText = '' + value;\n }\n }\n });\n\n this.container.append(details, this.range.container);\n }\n}\n\nexport default class AppGeneralSettingsTab extends SliderSuperTabEventable {\n init() {\n this.container.classList.add('general-settings-container');\n this.setTitle('General');\n\n const section = generateSection.bind(null, this.scrollable);\n\n {\n const container = section('Settings');\n\n const range = new RangeSettingSelector('TextSize', 1, rootScope.settings.messagesTextSize, 12, 20);\n range.onChange = (value) => {\n rootScope.managers.appStateManager.setByKey('settings.messagesTextSize', value);\n };\n\n const chatBackgroundButton = Button('btn-primary btn-transparent', {icon: 'image', text: 'ChatBackground'});\n\n const initArgs = AppBackgroundTab.getInitArgs();\n attachClickEvent(chatBackgroundButton, () => {\n this.slider.createTab(AppBackgroundTab).open(initArgs);\n });\n\n const animationsCheckboxField = new CheckboxField({\n text: 'EnableAnimations',\n name: 'animations',\n stateKey: 'settings.animationsEnabled',\n listenerSetter: this.listenerSetter\n });\n\n container.append(\n range.container,\n chatBackgroundButton,\n CreateRowFromCheckboxField(animationsCheckboxField).container\n );\n }\n\n {\n const container = section('General.Keyboard');\n\n const form = document.createElement('form');\n\n const name = 'send-shortcut';\n const stateKey = 'settings.sendShortcut';\n\n const enterRow = new Row({\n radioField: new RadioField({\n langKey: 'General.SendShortcut.Enter',\n name,\n value: 'enter',\n stateKey\n }),\n subtitleLangKey: 'General.SendShortcut.NewLine.ShiftEnter'\n });\n\n const ctrlEnterRow = new Row({\n radioField: new RadioField({\n name,\n value: 'ctrlEnter',\n stateKey\n }),\n subtitleLangKey: 'General.SendShortcut.NewLine.Enter'\n });\n _i18n(ctrlEnterRow.radioField.main, 'General.SendShortcut.CtrlEnter', [IS_APPLE ? '⌘' : 'Ctrl']);\n\n form.append(enterRow.container, ctrlEnterRow.container);\n container.append(form);\n }\n\n if(IS_GEOLOCATION_SUPPORTED) {\n const container = section('DistanceUnitsTitle');\n\n const form = document.createElement('form');\n\n const name = 'distance-unit';\n const stateKey = 'settings.distanceUnit';\n\n const kilometersRow = new Row({\n radioField: new RadioField({\n langKey: 'DistanceUnitsKilometers',\n name,\n value: 'kilometers',\n stateKey\n })\n });\n\n const milesRow = new Row({\n radioField: new RadioField({\n langKey: 'DistanceUnitsMiles',\n name,\n value: 'miles',\n stateKey\n })\n });\n\n form.append(kilometersRow.container, milesRow.container);\n container.append(form);\n }\n\n {\n const container = section('General.TimeFormat');\n\n const form = document.createElement('form');\n\n const name = 'time-format';\n const stateKey = 'settings.timeFormat';\n\n const formats: [State['settings']['timeFormat'], LangPackKey][] = [\n ['h12', 'General.TimeFormat.h12'],\n ['h23', 'General.TimeFormat.h23']\n ];\n\n const rows = formats.map(([format, langPackKey]) => {\n const row = new Row({\n radioField: new RadioField({\n langKey: langPackKey,\n name,\n value: format,\n stateKey\n })\n });\n\n return row;\n });\n\n const cancel = eachMinute(() => {\n const date = new Date();\n\n formats.forEach(([format], idx) => {\n const str = date.toLocaleTimeString('en-us-u-hc-' + format, {\n hour: '2-digit',\n minute: '2-digit'\n });\n\n rows[idx].subtitle.textContent = str;\n });\n });\n\n this.eventListener.addEventListener('destroy', cancel);\n\n form.append(...rows.map((row) => row.container));\n container.append(form);\n }\n\n {\n const container = section('Emoji');\n\n const suggestCheckboxField = new CheckboxField({\n text: 'GeneralSettings.EmojiPrediction',\n name: 'suggest-emoji',\n stateKey: 'settings.emoji.suggest',\n listenerSetter: this.listenerSetter\n });\n const bigCheckboxField = new CheckboxField({\n text: 'GeneralSettings.BigEmoji',\n name: 'emoji-big',\n stateKey: 'settings.emoji.big',\n listenerSetter: this.listenerSetter\n });\n\n container.append(\n CreateRowFromCheckboxField(suggestCheckboxField).container,\n CreateRowFromCheckboxField(bigCheckboxField).container\n );\n }\n\n {\n const section = new SettingSection({name: 'Telegram.InstalledStickerPacksController', caption: 'StickersBotInfo'});\n\n const reactionsRow = new Row({\n titleLangKey: 'DoubleTapSetting',\n havePadding: true,\n clickable: () => {\n this.slider.createTab(AppQuickReactionTab).open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const renderQuickReaction = () => {\n this.managers.appReactionsManager.getQuickReaction().then((reaction) => {\n if(reaction._ === 'availableReaction') {\n return reaction.static_icon;\n } else {\n return this.managers.appEmojiManager.getCustomEmojiDocument(reaction.document_id);\n }\n }).then((doc) => {\n wrapStickerToRow({\n row: reactionsRow,\n doc,\n size: 'small'\n });\n });\n };\n\n renderQuickReaction();\n\n this.listenerSetter.add(rootScope)('quick_reaction', renderQuickReaction);\n\n const suggestCheckboxField = new CheckboxField({\n text: 'Stickers.SuggestStickers',\n name: 'suggest',\n stateKey: 'settings.stickers.suggest',\n listenerSetter: this.listenerSetter\n });\n const loopCheckboxField = new CheckboxField({\n text: 'InstalledStickers.LoopAnimated',\n name: 'loop',\n stateKey: 'settings.stickers.loop',\n listenerSetter: this.listenerSetter\n });\n\n const stickerSets: {[id: string]: Row} = {};\n\n const stickersContent = section.generateContentElement();\n\n const lazyLoadQueue = new LazyLoadQueue();\n const renderStickerSet = (stickerSet: StickerSet.stickerSet, method: 'append' | 'prepend' = 'append') => {\n const row = new Row({\n title: wrapEmojiText(stickerSet.title),\n subtitleLangKey: 'Stickers',\n subtitleLangArgs: [stickerSet.count],\n havePadding: true,\n clickable: () => {\n new PopupStickers({id: stickerSet.id, access_hash: stickerSet.access_hash}).show();\n },\n listenerSetter: this.listenerSetter\n });\n\n stickerSets[stickerSet.id] = row;\n\n const div = document.createElement('div');\n div.classList.add('row-media');\n\n wrapStickerSetThumb({\n set: stickerSet,\n container: div,\n group: 'GENERAL-SETTINGS',\n lazyLoadQueue,\n width: 36,\n height: 36,\n autoplay: true\n });\n\n row.container.append(div);\n\n stickersContent[method](row.container);\n };\n\n this.managers.appStickersManager.getAllStickers().then((allStickers) => {\n assumeType(allStickers);\n for(const stickerSet of allStickers.sets) {\n renderStickerSet(stickerSet);\n }\n });\n\n this.listenerSetter.add(rootScope)('stickers_installed', (set) => {\n if(!stickerSets[set.id]) {\n renderStickerSet(set, 'prepend');\n }\n });\n\n this.listenerSetter.add(rootScope)('stickers_deleted', (set) => {\n if(stickerSets[set.id]) {\n stickerSets[set.id].container.remove();\n delete stickerSets[set.id];\n }\n });\n\n section.content.append(\n reactionsRow.container,\n CreateRowFromCheckboxField(suggestCheckboxField).container,\n CreateRowFromCheckboxField(loopCheckboxField).container\n );\n this.scrollable.append(section.container);\n }\n }\n\n onOpen() {\n if(this.init) {\n this.init();\n this.init = null;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport eachTimeout from './eachTimeout';\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachMinute(callback: () => any, runFirst = true) {\n return eachTimeout(callback, () => (60 - new Date().getSeconds()) * 1000, runFirst);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from '../environment/ctx';\nimport noop from './noop';\n\n// It's better to use timeout instead of interval, because interval can be corrupted\nexport default function eachTimeout(callback: () => any, getNextTimeout: () => number, runFirst = true) {\n const cancel = () => {\n clearTimeout(timeout);\n };\n\n // replace callback to run noop and restore after\n const _callback = callback;\n if(!runFirst) {\n callback = noop;\n }\n\n let timeout: number;\n (function run() {\n callback();\n timeout = ctx.setTimeout(run, getNextTimeout());\n })();\n\n callback = _callback;\n\n return cancel;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDialogFilter} from '../../../lib/storages/filters';\nimport type {DialogFilterSuggested} from '../../../layer';\nimport type _rootScope from '../../../lib/rootScope';\nimport {SliderSuperTab} from '../../slider';\nimport lottieLoader, {LottieLoader} from '../../../lib/rlottie/lottieLoader';\nimport Button from '../../button';\nimport rootScope from '../../../lib/rootScope';\nimport AppEditFolderTab from './editFolder';\nimport Row from '../../row';\nimport {i18n, i18n_, LangPackKey, join} from '../../../lib/langPack';\nimport cancelEvent from '../../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport positionElementByIndex from '../../../helpers/dom/positionElementByIndex';\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, REAL_FOLDERS} from '../../../lib/mtproto/mtproto_config';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport SettingSection from '../../settingSection';\nimport Sortable from '../../../helpers/dom/sortable';\nimport whichChild from '../../../helpers/dom/whichChild';\nimport indexOfAndSplice from '../../../helpers/array/indexOfAndSplice';\nimport showLimitPopup from '../../popups/limit';\n\nexport default class AppChatFoldersTab extends SliderSuperTab {\n private createFolderBtn: HTMLElement;\n private foldersSection: SettingSection;\n private suggestedSection: SettingSection;\n private stickerContainer: HTMLElement;\n private animation: RLottiePlayer;\n private list: HTMLElement;\n\n private filtersRendered: {[filterId: number]: Row} = {};\n private loadAnimationPromise: ReturnType;\n\n public static getInitArgs() {\n return {\n animationData: lottieLoader.loadAnimationFromURLManually('Folders_1'),\n filters: rootScope.managers.filtersStorage.getDialogFilters()\n };\n }\n\n private async renderFolder(\n dialogFilter: DialogFilterSuggested | MyDialogFilter,\n container?: HTMLElement,\n row?: Row,\n append?: boolean\n ) {\n let filter: MyDialogFilter;\n let description = '';\n const d: HTMLElement[] = [];\n if(dialogFilter._ === 'dialogFilterSuggested') {\n filter = dialogFilter.filter as MyDialogFilter;\n description = dialogFilter.description;\n } else {\n filter = dialogFilter;\n\n const enabledFilters = Object.keys(filter.pFlags).length;\n /* (['include_peers', 'exclude_peers'] as ['include_peers', 'exclude_peers']).forEach((key) => {\n enabledFilters += +!!filter[key].length;\n }); */\n\n if(enabledFilters === 1) {\n const pFlags = filter.pFlags;\n let k: LangPackKey;\n if(pFlags.contacts) k = 'FilterAllContacts';\n else if(pFlags.non_contacts) k = 'FilterAllNonContacts';\n else if(pFlags.groups) k = 'FilterAllGroups';\n else if(pFlags.broadcasts) k = 'FilterAllChannels';\n else if(pFlags.bots) k = 'FilterAllBots';\n\n if(k) {\n d.push(i18n(k));\n }\n }\n\n if(!d.length) {\n const folder = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\n let chats = 0, channels = 0, groups = 0;\n await Promise.all(folder.map(async(dialog) => {\n if(await this.managers.appPeersManager.isAnyGroup(dialog.peerId)) groups++;\n else if(await this.managers.appPeersManager.isBroadcast(dialog.peerId)) channels++;\n else chats++;\n }));\n\n if(chats) d.push(i18n('Chats', [chats]));\n if(channels) d.push(i18n('Channels', [channels]));\n if(groups) d.push(i18n('Groups', [groups]));\n }\n }\n\n if(!row) {\n row = new Row({\n title: filter.id === FOLDER_ID_ALL ? i18n('FilterAllChats') : wrapEmojiText(filter.title),\n subtitle: description,\n clickable: true,\n buttonRightLangKey: dialogFilter._ === 'dialogFilterSuggested' ? 'Add' : undefined\n });\n\n if(d.length) {\n row.subtitle.append(...join(d));\n }\n\n if(dialogFilter._ === 'dialogFilter') {\n const filterId = filter.id;\n if(!this.filtersRendered[filter.id] && filter.id !== FOLDER_ID_ALL) {\n const initArgs = AppEditFolderTab.getInitArgs();\n attachClickEvent(row.container, async() => {\n const filter = await this.managers.filtersStorage.getFilter(filterId);\n const tab = this.slider.createTab(AppEditFolderTab);\n tab.setInitFilter(filter);\n tab.open(initArgs);\n }, {listenerSetter: this.listenerSetter});\n }\n\n this.filtersRendered[filter.id] = row;\n\n row.makeSortable();\n }\n } else {\n if(filter.id !== FOLDER_ID_ALL) {\n replaceContent(row.title, wrapEmojiText(filter.title));\n }\n\n row.subtitle.textContent = '';\n row.subtitle.append(...join(d));\n }\n\n const div = row.container;\n\n if(append) {\n const localId = (filter as MyDialogFilter).localId;\n if(localId !== undefined) {\n // ! header will be at 0 index\n positionElementByIndex(div, div.parentElement || container, localId);\n } else if(container) {\n container.append(div);\n }\n }\n\n return row;\n }\n\n public init(p: ReturnType = AppChatFoldersTab.getInitArgs()) {\n this.container.classList.add('chat-folders-container');\n this.setTitle('ChatList.Filter.List.Title');\n\n this.scrollable.container.classList.add('chat-folders');\n\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add('sticker-container');\n\n const caption = document.createElement('div');\n caption.classList.add('caption');\n i18n_({element: caption, key: 'ChatList.Filter.Header'});\n\n this.createFolderBtn = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'ChatList.Filter.NewTitle',\n icon: 'add'\n });\n\n this.foldersSection = new SettingSection({\n name: 'Filters'\n });\n this.foldersSection.container.classList.add('hide');\n\n this.list = document.createElement('div');\n this.foldersSection.content.append(this.list);\n\n this.suggestedSection = new SettingSection({\n name: 'FilterRecommended'\n });\n this.suggestedSection.container.classList.add('hide');\n\n this.scrollable.append(\n this.stickerContainer,\n caption,\n this.createFolderBtn,\n this.foldersSection.container,\n this.suggestedSection.container\n );\n\n attachClickEvent(this.createFolderBtn, async() => {\n if(!(await this.canCreateFolder())) {\n showLimitPopup('folders');\n } else {\n this.slider.createTab(AppEditFolderTab).open();\n }\n }, {listenerSetter: this.listenerSetter});\n\n const onFiltersContainerUpdate = () => {\n this.foldersSection.container.classList.toggle('hide', !Object.keys(this.filtersRendered).length);\n };\n\n const loadPromises: Promise[] = [];\n const renderFiltersPromise = p.filters.then(async(filters) => {\n for(const filter of filters) {\n if(filter.id === FOLDER_ID_ARCHIVE) {\n continue;\n }\n\n await this.renderFolder(filter, this.list, undefined, true);\n }\n\n this.toggleAllChats();\n\n onFiltersContainerUpdate();\n });\n\n loadPromises.push(renderFiltersPromise);\n\n this.listenerSetter.add(rootScope)('filter_update', async(filter) => {\n const filterRendered = this.filtersRendered[filter.id];\n if(filterRendered) {\n await this.renderFolder(filter, null, filterRendered);\n } else if(filter.id !== FOLDER_ID_ARCHIVE) {\n await this.renderFolder(filter, this.list, undefined, true);\n }\n\n onFiltersContainerUpdate();\n\n this.getSuggestedFilters();\n });\n\n this.listenerSetter.add(rootScope)('filter_delete', (filter) => {\n const filterRendered = this.filtersRendered[filter.id];\n if(filterRendered) {\n /* for(const suggested of this.suggestedFilters) {\n if(deepEqual(suggested.filter, filter)) {\n\n }\n } */\n this.getSuggestedFilters();\n\n filterRendered.container.remove();\n delete this.filtersRendered[filter.id];\n }\n\n onFiltersContainerUpdate();\n });\n\n this.listenerSetter.add(rootScope)('filter_order', (order) => {\n order.filter((filterId) => !!this.filtersRendered[filterId]).forEach((filterId, idx) => {\n const filterRendered = this.filtersRendered[filterId];\n const container = filterRendered.container;\n positionElementByIndex(container, container.parentElement, idx + 1); // ! + 1 due to header\n });\n });\n\n this.listenerSetter.add(rootScope)('premium_toggle', () => {\n this.toggleAllChats();\n });\n\n this.loadAnimationPromise = p.animationData.then(async(cb) => {\n const player = await cb({\n container: this.stickerContainer,\n loop: false,\n autoplay: false,\n width: 86,\n height: 86\n });\n\n this.animation = player;\n\n return lottieLoader.waitForFirstFrame(player);\n });\n\n loadPromises.push(this.loadAnimationPromise);\n\n new Sortable({\n list: this.list,\n middleware: this.middlewareHelper.get(),\n onSort: (prevIdx, newIdx) => {\n let order: number[] = [];\n for(const filterId in this.filtersRendered) {\n const row = this.filtersRendered[filterId];\n const idx = whichChild(row.container);\n order[idx] = +filterId;\n }\n\n order = order.filter((filterId) => filterId !== undefined);\n if(!rootScope.premium) {\n indexOfAndSplice(order, FOLDER_ID_ALL);\n // order.unshift(FOLDER_ID_ALL);\n }\n\n this.managers.filtersStorage.updateDialogFiltersOrder(order);\n },\n scrollable: this.scrollable\n });\n\n this.getSuggestedFilters();\n\n /* return Promise.all([\n this.loadAnimationPromise\n ]); */\n return Promise.all(loadPromises);\n }\n\n onOpenAfterTimeout() {\n this.loadAnimationPromise.then(() => {\n this.animation.autoplay = true;\n this.animation.play();\n });\n\n return super.onOpenAfterTimeout();\n }\n\n private toggleAllChats() {\n const filterRendered = this.filtersRendered[FOLDER_ID_ALL];\n filterRendered.container.classList.toggle('hide', !rootScope.premium);\n }\n\n private async canCreateFolder() {\n const [limit, filters] = await Promise.all([\n this.managers.apiManager.getLimit('folders'),\n this.managers.filtersStorage.getDialogFilters()\n ]);\n\n const filtersLength = filters.filter((filter) => !REAL_FOLDERS.has(filter.id)).length;\n return filtersLength < limit;\n }\n\n private getSuggestedFilters() {\n return this.managers.filtersStorage.getSuggestedDialogsFilters().then(async(suggestedFilters) => {\n this.suggestedSection.container.classList.toggle('hide', !suggestedFilters.length);\n Array.from(this.suggestedSection.content.children).slice(1).forEach((el) => el.remove());\n\n for(const filter of suggestedFilters) {\n const row = await this.renderFolder(filter);\n this.suggestedSection.content.append(row.container);\n\n const button = row.buttonRight;\n attachClickEvent(button, async(e) => {\n cancelEvent(e);\n\n if(!(await this.canCreateFolder())) {\n showLimitPopup('folders');\n return;\n }\n\n button.setAttribute('disabled', 'true');\n\n const f = filter.filter as MyDialogFilter;\n f.includePeerIds = [];\n f.excludePeerIds = [];\n f.pinnedPeerIds = [];\n\n this.managers.filtersStorage.createDialogFilter(f, true).then(() => {\n row.container.remove();\n this.suggestedSection.container.classList.toggle('hide', this.suggestedSection.content.childElementCount === 1);\n }).finally(() => {\n button.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Row from '../../row';\nimport CheckboxField from '../../checkboxField';\nimport {InputNotifyPeer, Update} from '../../../layer';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport rootScope from '../../../lib/rootScope';\nimport {LangPackKey} from '../../../lib/langPack';\nimport copy from '../../../helpers/object/copy';\nimport convertKeyToInputKey from '../../../helpers/string/convertKeyToInputKey';\nimport {MUTE_UNTIL} from '../../../lib/mtproto/mtproto_config';\nimport apiManagerProxy from '../../../lib/mtproto/mtprotoworker';\nimport SettingSection from '../../settingSection';\n\ntype InputNotifyKey = Exclude;\n\nexport default class AppNotificationsTab extends SliderSuperTabEventable {\n public init() {\n this.container.classList.add('notifications-container');\n this.setTitle('Telegram.NotificationSettingsViewController');\n\n const NotifySection = (options: {\n name: LangPackKey,\n typeText: LangPackKey,\n inputKey: InputNotifyKey,\n }) => {\n const section = new SettingSection({\n name: options.name\n });\n\n const enabledRow = new Row({\n checkboxField: new CheckboxField({text: options.typeText, checked: true}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n const previewEnabledRow = new Row({\n checkboxField: new CheckboxField({text: 'MessagePreview', checked: true}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n section.content.append(enabledRow.container, previewEnabledRow.container);\n\n this.scrollable.append(section.container);\n\n const inputNotifyPeer = {_: options.inputKey};\n const ret = this.managers.appNotificationsManager.getNotifySettings(inputNotifyPeer);\n (ret instanceof Promise ? ret : Promise.resolve(ret)).then((notifySettings) => {\n const applySettings = async() => {\n const muted = await this.managers.appNotificationsManager.isMuted(notifySettings);\n enabledRow.checkboxField.checked = !muted;\n previewEnabledRow.checkboxField.checked = notifySettings.show_previews;\n\n return muted;\n };\n\n applySettings();\n\n this.eventListener.addEventListener('destroy', async() => {\n const mute = !enabledRow.checkboxField.checked;\n const showPreviews = previewEnabledRow.checkboxField.checked;\n\n if(mute === (await this.managers.appNotificationsManager.isMuted(notifySettings)) && showPreviews === notifySettings.show_previews) {\n return;\n }\n\n const inputSettings: any = copy(notifySettings);\n inputSettings._ = 'inputPeerNotifySettings';\n inputSettings.mute_until = mute ? MUTE_UNTIL : 0;\n inputSettings.show_previews = showPreviews;\n\n this.managers.appNotificationsManager.updateNotifySettings(inputNotifyPeer, inputSettings);\n }, {once: true});\n\n this.listenerSetter.add(rootScope)('notify_settings', (update: Update.updateNotifySettings) => {\n const inputKey = convertKeyToInputKey(update.peer._) as any;\n if(options.inputKey === inputKey) {\n notifySettings = update.notify_settings;\n applySettings();\n }\n });\n });\n };\n\n NotifySection({\n name: 'NotificationsPrivateChats',\n typeText: 'NotificationsForPrivateChats',\n inputKey: 'inputNotifyUsers'\n });\n\n NotifySection({\n name: 'NotificationsGroups',\n typeText: 'NotificationsForGroups',\n inputKey: 'inputNotifyChats'\n });\n\n NotifySection({\n name: 'NotificationsChannels',\n typeText: 'NotificationsForChannels',\n inputKey: 'inputNotifyBroadcasts'\n });\n\n {\n const section = new SettingSection({\n name: 'NotificationsOther'\n });\n\n const contactsSignUpRow = new Row({\n checkboxField: new CheckboxField({text: 'ContactJoined', checked: true}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n const soundRow = new Row({\n checkboxField: new CheckboxField({text: 'Notifications.Sound', checked: true, stateKey: 'settings.notifications.sound', listenerSetter: this.listenerSetter}),\n subtitleLangKey: 'Loading',\n listenerSetter: this.listenerSetter,\n withCheckboxSubtitle: true\n });\n\n apiManagerProxy.getState().then((state) => {\n soundRow.checkboxField.checked = state.settings.notifications.sound;\n });\n\n section.content.append(contactsSignUpRow.container, soundRow.container);\n\n this.scrollable.append(section.container);\n\n this.managers.appNotificationsManager.getContactSignUpNotification().then((enabled) => {\n contactsSignUpRow.checkboxField.checked = enabled;\n\n this.eventListener.addEventListener('destroy', () => {\n const _enabled = contactsSignUpRow.checkboxField.checked;\n if(enabled !== _enabled) {\n this.managers.appNotificationsManager.setContactSignUpNotification(!_enabled);\n }\n }, {once: true});\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {randomLong} from '../../../helpers/random';\nimport {LangPackLanguage} from '../../../layer';\nimport I18n from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTab} from '../../slider'\n\nexport default class AppLanguageTab extends SliderSuperTab {\n public static getInitArgs() {\n return {\n languages1: rootScope.managers.apiManager.invokeApiCacheable('langpack.getLanguages', {\n lang_pack: 'web'\n }),\n // languages2: rootScope.managers.apiManager.invokeApiCacheable('langpack.getLanguages', {\n // lang_pack: 'macos'\n // })\n languages2: Promise.resolve([] as LangPackLanguage[])\n };\n }\n\n public init(p: ReturnType) {\n this.header.classList.add('with-border');\n this.container.classList.add('language-container');\n this.setTitle('Telegram.LanguageViewController');\n\n const section = new SettingSection({});\n\n const radioRows: Map = new Map();\n\n const promise = Promise.all([\n p.languages1,\n p.languages2\n ]).then(([languages1, languages2]) => {\n const rendered: Set = new Set();\n const webLangCodes = languages1.map((language) => language.lang_code);\n\n const random = randomLong();\n languages1.concat(languages2).forEach((language) => {\n if(rendered.has(language.lang_code)) return;\n rendered.add(language.lang_code);\n\n const row = new Row({\n radioField: new RadioField({\n text: language.name,\n name: random,\n value: language.lang_code\n }),\n subtitle: language.native_name\n });\n\n radioRows.set(language.lang_code, row);\n });\n\n const form = RadioFormFromRows([...radioRows.values()], (value) => {\n I18n.getLangPack(value, webLangCodes.includes(value));\n });\n\n I18n.getCacheLangPack().then((langPack) => {\n const row = radioRows.get(langPack.lang_code);\n if(!row) {\n console.error('no row', row, langPack);\n return;\n }\n\n row.radioField.setValueSilently(true);\n });\n\n section.content.append(form);\n });\n\n this.scrollable.append(section.container);\n\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../../../../helpers/listenerSetter';\nimport {LangPackKey} from '../../../../lib/langPack';\nimport CheckboxField from '../../../checkboxField';\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport Row, {CreateRowFromCheckboxField} from '../../../row';\nimport SettingSection from '../../../settingSection';\n\nexport function autoDownloadPeerTypeSection(type: 'photo' | 'video' | 'file', title: LangPackKey, listenerSetter: ListenerSetter) {\n const section = new SettingSection({name: title});\n\n const key = 'settings.autoDownload.' + type + '.';\n const contactsCheckboxField = new CheckboxField({\n text: 'AutodownloadContacts',\n name: 'contacts',\n stateKey: key + 'contacts',\n listenerSetter\n });\n const privateCheckboxField = new CheckboxField({\n text: 'AutodownloadPrivateChats',\n name: 'private',\n stateKey: key + 'private',\n listenerSetter\n });\n const groupsCheckboxField = new CheckboxField({\n text: 'AutodownloadGroupChats',\n name: 'groups',\n stateKey: key + 'groups',\n listenerSetter\n });\n const channelsCheckboxField = new CheckboxField({\n text: 'AutodownloadChannels',\n name: 'channels',\n stateKey: key + 'channels',\n listenerSetter\n });\n\n section.content.append(\n CreateRowFromCheckboxField(contactsCheckboxField).container,\n CreateRowFromCheckboxField(privateCheckboxField).container,\n CreateRowFromCheckboxField(groupsCheckboxField).container,\n CreateRowFromCheckboxField(channelsCheckboxField).container\n );\n\n return section;\n}\n\nexport default class AppAutoDownloadPhotoTab extends SliderSuperTabEventable {\n public init() {\n this.setTitle('AutoDownloadPhotos');\n\n const section = autoDownloadPeerTypeSection('photo', 'AutoDownloadPhotosTitle', this.listenerSetter);\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport formatBytes from '../../../../helpers/formatBytes';\nimport debounce from '../../../../helpers/schedulers/debounce';\nimport I18n from '../../../../lib/langPack';\nimport rootScope from '../../../../lib/rootScope';\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport {RangeSettingSelector} from '../generalSettings';\nimport {autoDownloadPeerTypeSection} from './photo';\n\nexport default class AppAutoDownloadFileTab extends SliderSuperTabEventable {\n public init() {\n this.setTitle('AutoDownloadFiles');\n\n const debouncedSave = debounce((sizeMax: number) => {\n this.managers.appStateManager.setByKey('settings.autoDownloadNew.file_size_max', sizeMax);\n }, 200, false, true);\n\n const section = autoDownloadPeerTypeSection('file', 'AutoDownloadFilesTitle', this.listenerSetter);\n\n const MIN = 512 * 1024;\n // const MAX = 2 * 1024 * 1024 * 1024;\n const MAX = 20 * 1024 * 1024;\n const MAX_RANGE = MAX - MIN;\n\n const sizeMax = rootScope.settings.autoDownloadNew.file_size_max;\n const value = Math.sqrt(Math.sqrt((sizeMax - MIN) / MAX_RANGE));\n const upTo = new I18n.IntlElement({\n key: 'AutodownloadSizeLimitUpTo',\n args: [formatBytes(sizeMax)]\n });\n const range = new RangeSettingSelector('AutoDownloadMaxFileSize', 0.01, value, 0, 1, false);\n range.onChange = (value) => {\n const sizeMax = (value ** 4 * MAX_RANGE + MIN) | 0;\n\n upTo.compareAndUpdate({args: [formatBytes(sizeMax)]});\n\n debouncedSave(sizeMax);\n };\n\n range.valueContainer.append(upTo.element);\n\n section.content.append(range.container);\n\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTabEventable} from '../../../sliderTab';\nimport {autoDownloadPeerTypeSection} from './photo';\n\nexport default class AppAutoDownloadVideoTab extends SliderSuperTabEventable {\n public init() {\n this.setTitle('AutoDownloadVideos');\n\n const section = autoDownloadPeerTypeSection('video', 'AutoDownloadVideosTitle', this.listenerSetter);\n this.scrollable.append(section.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AutoDownloadPeerTypeSettings, STATE_INIT} from '../../../config/state';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport formatBytes from '../../../helpers/formatBytes';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {FormatterArguments, i18n, join, LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport Button from '../../button';\nimport CheckboxField from '../../checkboxField';\nimport confirmationPopup from '../../confirmationPopup';\nimport Row from '../../row';\nimport {SliderSuperTabEventable, SliderSuperTabEventableConstructable} from '../../sliderTab';\nimport AppAutoDownloadFileTab from './autoDownload/file';\nimport AppAutoDownloadPhotoTab from './autoDownload/photo';\nimport AppAutoDownloadVideoTab from './autoDownload/video';\nimport apiManagerProxy from '../../../lib/mtproto/mtprotoworker';\nimport SettingSection from '../../settingSection';\n\nconst AUTO_DOWNLOAD_FOR_KEYS: {[k in keyof AutoDownloadPeerTypeSettings]: LangPackKey} = {\n contacts: 'AutoDownloadContacts',\n private: 'AutoDownloadPm',\n groups: 'AutoDownloadGroups',\n channels: 'AutoDownloadChannels'\n};\n\nexport default class AppDataAndStorageTab extends SliderSuperTabEventable {\n public async init() {\n this.setTitle('DataSettings');\n\n {\n const section = new SettingSection({name: 'AutomaticMediaDownload', caption: 'AutoDownloadAudioInfo'});\n\n const state = await apiManagerProxy.getState();\n\n const autoCheckboxField = new CheckboxField({\n text: 'AutoDownloadMedia',\n name: 'auto',\n checked: !state.settings.autoDownloadNew.pFlags.disabled,\n listenerSetter: this.listenerSetter\n });\n\n const autoRow = new Row({\n checkboxField: autoCheckboxField,\n listenerSetter: this.listenerSetter\n });\n\n const onChange = () => {\n toggleDisability([resetButton],\n deepEqual(state.settings.autoDownload, STATE_INIT.settings.autoDownload) &&\n deepEqual(state.settings.autoDownloadNew, STATE_INIT.settings.autoDownloadNew));\n };\n\n const setSubtitles = () => {\n this.setAutoDownloadSubtitle(photoRow, state.settings.autoDownload.photo /* state.settings.autoDownloadNew.photo_size_max */);\n this.setAutoDownloadSubtitle(videoRow, state.settings.autoDownload.video/* , state.settings.autoDownloadNew.video_size_max */);\n this.setAutoDownloadSubtitle(fileRow, state.settings.autoDownload.file, state.settings.autoDownloadNew.file_size_max);\n };\n\n const openTab = (tabConstructor: SliderSuperTabEventableConstructable) => {\n const tab = this.slider.createTab(tabConstructor);\n tab.open();\n\n this.listenerSetter.add(tab.eventListener)('destroy', () => {\n setSubtitles();\n onChange();\n }, {once: true});\n };\n\n const photoRow = new Row({\n titleLangKey: 'AutoDownloadPhotos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadPhotoTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const videoRow = new Row({\n titleLangKey: 'AutoDownloadVideos',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadVideoTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const fileRow = new Row({\n titleLangKey: 'AutoDownloadFiles',\n subtitle: '',\n clickable: () => {\n openTab(AppAutoDownloadFileTab);\n },\n listenerSetter: this.listenerSetter\n });\n\n const resetButton = Button('btn-primary btn-transparent primary', {icon: 'delete', text: 'ResetAutomaticMediaDownload'});\n attachClickEvent(resetButton, () => {\n confirmationPopup({\n titleLangKey: 'ResetAutomaticMediaDownloadAlertTitle',\n descriptionLangKey: 'ResetAutomaticMediaDownloadAlert',\n button: {\n langKey: 'Reset'\n }\n }).then(() => {\n const settings = rootScope.settings;\n settings.autoDownloadNew = copy(STATE_INIT.settings.autoDownloadNew);\n settings.autoDownload = copy(STATE_INIT.settings.autoDownload);\n state.settings = settings;\n this.managers.appStateManager.setByKey('settings', settings);\n\n setSubtitles();\n autoCheckboxField.checked = !state.settings.autoDownloadNew.pFlags.disabled;\n });\n });\n\n const onDisabledChange = () => {\n const disabled = !autoCheckboxField.checked;\n\n const settings = rootScope.settings;\n if(disabled) {\n settings.autoDownloadNew.pFlags.disabled = true;\n } else {\n delete settings.autoDownloadNew.pFlags.disabled;\n }\n\n [photoRow, videoRow, fileRow].forEach((row) => {\n row.container.classList.toggle('is-disabled', disabled);\n });\n\n this.managers.appStateManager.setByKey('settings', settings);\n\n onChange();\n };\n\n autoCheckboxField.input.addEventListener('change', onDisabledChange);\n onDisabledChange();\n setSubtitles();\n\n section.content.append(\n autoRow.container,\n photoRow.container,\n videoRow.container,\n fileRow.container,\n resetButton\n );\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({name: 'AutoplayMedia'});\n\n section.content.append(new Row({\n checkboxField: new CheckboxField({\n text: 'AutoplayGIF',\n name: 'gifs',\n stateKey: 'settings.autoPlay.gifs',\n listenerSetter: this.listenerSetter\n }),\n listenerSetter: this.listenerSetter\n }).container, new Row({\n checkboxField: new CheckboxField({\n text: 'AutoplayVideo',\n name: 'videos',\n stateKey: 'settings.autoPlay.videos',\n listenerSetter: this.listenerSetter\n }),\n listenerSetter: this.listenerSetter\n }).container);\n\n this.scrollable.append(section.container);\n }\n }\n\n private setAutoDownloadSubtitle(row: Row, settings: AutoDownloadPeerTypeSettings, sizeMax?: number) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n\n const peerKeys = Object.keys(settings) as (keyof typeof AUTO_DOWNLOAD_FOR_KEYS)[];\n const enabledKeys = peerKeys.map((key) => settings[key] ? AUTO_DOWNLOAD_FOR_KEYS[key] : undefined).filter(Boolean);\n if(!enabledKeys.length || sizeMax === 0) {\n key = 'AutoDownloadOff';\n } else {\n const isAll = enabledKeys.length === peerKeys.length;\n if(sizeMax !== undefined) {\n key = isAll ? 'AutoDownloadUpToOnAllChats' : 'AutoDownloadOnUpToFor';\n args.push(formatBytes(sizeMax));\n } else {\n key = isAll ? 'AutoDownloadOnAllChats' : 'AutoDownloadOnFor';\n }\n\n if(!isAll) {\n const fragment = document.createElement('span');\n fragment.append(...join(enabledKeys.map((key) => i18n(key)), true, false));\n args.push(fragment);\n }\n }\n\n replaceContent(row.subtitle, i18n(key, args));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport ButtonMenuToggle from '../../buttonMenuToggle';\nimport Button from '../../button';\nimport AppPrivacyAndSecurityTab from './privacyAndSecurity';\nimport AppGeneralSettingsTab from './generalSettings';\nimport AppEditProfileTab from './editProfile';\nimport AppChatFoldersTab from './chatFolders';\nimport AppNotificationsTab from './notifications';\nimport AppLanguageTab from './language';\nimport lottieLoader from '../../../lib/rlottie/lottieLoader';\nimport PopupPeer from '../../popups/peer';\nimport AppDataAndStorageTab from './dataAndStorage';\nimport ButtonIcon from '../../buttonIcon';\nimport PeerProfile from '../../peerProfile';\nimport rootScope from '../../../lib/rootScope';\nimport Row from '../../row';\nimport AppActiveSessionsTab from './activeSessions';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport {SliderSuperTabConstructable, SliderSuperTabEventable} from '../../sliderTab';\nimport PopupAvatar from '../../popups/avatar';\nimport {AccountAuthorizations, Authorization} from '../../../layer';\nimport PopupElement from '../../popups';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n// import AppMediaViewer from \"../../appMediaViewerNew\";\n\nexport default class AppSettingsTab extends SliderSuperTab {\n private buttons: {\n edit: HTMLButtonElement,\n folders: HTMLButtonElement,\n general: HTMLButtonElement,\n notifications: HTMLButtonElement,\n storage: HTMLButtonElement,\n privacy: HTMLButtonElement,\n } = {} as any;\n private profile: PeerProfile;\n\n private languageRow: Row;\n private devicesRow: Row;\n\n private authorizations: Authorization.authorization[];\n private getAuthorizationsPromise: Promise;\n\n public async init() {\n this.container.classList.add('settings-container');\n this.setTitle('Settings');\n\n const btnMenu = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [{\n icon: 'logout',\n text: 'EditAccount.Logout',\n onClick: () => {\n new PopupPeer('logout', {\n titleLangKey: 'LogOut',\n descriptionLangKey: 'LogOut.Description',\n buttons: [{\n langKey: 'LogOut',\n callback: () => {\n this.managers.apiManager.logOut();\n },\n isDanger: true\n }]\n }).show();\n }\n }]\n });\n\n this.buttons.edit = ButtonIcon('edit');\n\n this.header.append(this.buttons.edit, btnMenu);\n\n this.profile = new PeerProfile(this.managers, this.scrollable, this.listenerSetter, false);\n this.profile.init();\n this.profile.setPeer(rootScope.myId);\n const fillPromise = this.profile.fillProfileElements();\n\n const changeAvatarBtn = Button('btn-circle btn-corner z-depth-1 profile-change-avatar', {icon: 'cameraadd'});\n attachClickEvent(changeAvatarBtn, () => {\n const canvas = document.createElement('canvas');\n PopupElement.createPopup(PopupAvatar).open(canvas, (upload) => {\n upload().then((inputFile) => {\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\n });\n });\n }, {listenerSetter: this.listenerSetter});\n this.profile.element.lastElementChild.firstElementChild.append(changeAvatarBtn);\n\n const updateChangeAvatarBtn = async() => {\n const user = await this.managers.appUsersManager.getSelf();\n changeAvatarBtn.classList.toggle('hide', user.photo?._ !== 'userProfilePhoto');\n };\n\n updateChangeAvatarBtn();\n this.listenerSetter.add(rootScope)('avatar_update', ({peerId}) => {\n if(rootScope.myId === peerId) {\n updateChangeAvatarBtn();\n }\n });\n\n /* const div = document.createElement('div');\n //div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem 0 10rem auto;';\n //div.style.width = '135px';\n //div.style.height = '100px';\n div.style.cssText = 'border-radius: 8px; overflow: hidden; width: 396px; height: 264px; flex: 0 0 auto; position: relative; margin: 10rem auto 10rem 0;';\n div.style.width = '135px';\n div.style.height = '100px';\n\n const img = document.createElement('img');\n img.src = 'assets/img/pepe.jpg';\n img.classList.add('media-photo');\n img.style.cssText = 'max-width: 100%;max-height: 100%;';\n\n div.append(img);\n\n div.addEventListener('click', () => {\n new AppMediaViewer().setSearchContext({peerId: 61004386, inputFilter: 'inputMessagesFilterPhotos'}).openMedia({\n _: 'message',\n mid: 1,\n peerId: 61004386,\n fromId: 61004386,\n message: '',\n media: {\n _: 'messageMediaPhoto',\n photo: {\n _: 'photo',\n url: img.src,\n downloaded: 111,\n sizes: [{\n _: 'photoSize',\n type: 'x',\n w: 618,\n h: 412\n }]\n }\n },\n date: Date.now() / 1000 | 0\n }, img);\n });\n\n this.scrollable.append(div); */\n\n const buttonsDiv = document.createElement('div');\n buttonsDiv.classList.add('profile-buttons');\n\n type ConstructorP = T extends {\n new (...args: any[]): infer U;\n } ? U : never;\n\n const m = (\n icon: string,\n text: LangPackKey,\n c: T,\n getInitArgs?: () => Promise['init']>>\n ): {\n icon: string,\n text: LangPackKey,\n tabConstructor: T,\n getInitArgs?: typeof getInitArgs,\n // args?: ReturnType\n args?: any\n } => {\n if(!getInitArgs) {\n const g = (c as any as typeof SliderSuperTab).getInitArgs;\n if(g) {\n // @ts-ignore\n getInitArgs = () => [g(this)];\n }\n }\n\n return {\n icon,\n text,\n tabConstructor: c,\n getInitArgs,\n args: getInitArgs?.()\n };\n };\n\n // const k = (c: T): () => [ReturnType['getInitArgs']>] => {\n // return () => (c as any).getInitArgs(this);\n // };\n\n const b = [\n m('unmute', 'AccountSettings.Notifications', AppNotificationsTab),\n m('data', 'DataSettings', AppDataAndStorageTab),\n m('lock', 'AccountSettings.PrivacyAndSecurity', AppPrivacyAndSecurityTab),\n m('settings', 'Telegram.GeneralSettingsViewController', AppGeneralSettingsTab),\n m('folder', 'AccountSettings.Filters', AppChatFoldersTab)\n ];\n\n const rows = b.map((item) => {\n const {icon, text: langPackKey, tabConstructor, getInitArgs} = item;\n return new Row({\n titleLangKey: langPackKey,\n icon,\n clickable: async() => {\n const args = item.args ? await item.args : [];\n const tab = this.slider.createTab(tabConstructor as any);\n tab.open(...args);\n\n if(tab instanceof SliderSuperTabEventable && getInitArgs) {\n tab.eventListener.addEventListener('destroyAfter', (promise) => {\n item.args = promise.then(() => getInitArgs() as any);\n });\n }\n },\n listenerSetter: this.listenerSetter\n });\n });\n\n const languageArgs = AppLanguageTab.getInitArgs();\n rows.push(\n this.devicesRow = new Row({\n titleLangKey: 'Devices',\n titleRightSecondary: ' ',\n icon: 'activesessions',\n clickable: async() => {\n if(!this.authorizations) {\n await this.updateActiveSessions();\n }\n\n const tab = this.slider.createTab(AppActiveSessionsTab);\n tab.authorizations = this.authorizations;\n tab.eventListener.addEventListener('destroy', () => {\n this.authorizations = undefined;\n this.updateActiveSessions(true);\n }, {once: true});\n tab.open();\n },\n listenerSetter: this.listenerSetter\n }),\n\n this.languageRow = new Row({\n titleLangKey: 'AccountSettings.Language',\n titleRightSecondary: i18n('LanguageName'),\n icon: 'language',\n clickable: () => {\n this.slider.createTab(AppLanguageTab).open(languageArgs);\n },\n listenerSetter: this.listenerSetter\n })\n );\n\n buttonsDiv.append(...rows.map((row) => row.container));\n\n // const profileSection = new SettingSection({fullWidth: true, noPaddingTop: true});\n // profileSection.content.append(this.profile.element);\n\n const buttonsSection = new SettingSection();\n buttonsSection.content.append(buttonsDiv);\n\n this.scrollable.append(this.profile.element/* profileSection.container */, buttonsSection.container);\n\n const getEditProfileArgs = () => {\n editProfileArgs = AppEditProfileTab.getInitArgs();\n };\n let editProfileArgs: ReturnType;\n attachClickEvent(this.buttons.edit, () => {\n const tab = this.slider.createTab(AppEditProfileTab);\n tab.open(editProfileArgs);\n }, {listenerSetter: this.listenerSetter});\n getEditProfileArgs();\n // this.listenerSetter.add(rootScope)('user_full_update', (userId) => {\n // if(rootScope.myId.toUserId() === userId) {\n // getEditProfileArgs();\n // }\n // });\n this.listenerSetter.add(rootScope)('user_update', (userId) => {\n if(rootScope.myId.toUserId() === userId) {\n getEditProfileArgs();\n }\n });\n\n lottieLoader.loadLottieWorkers();\n\n this.updateActiveSessions();\n\n (await fillPromise)();\n }\n\n private getAuthorizations(overwrite?: boolean) {\n if(this.getAuthorizationsPromise && !overwrite) return this.getAuthorizationsPromise;\n\n const promise = this.getAuthorizationsPromise = this.managers.apiManager.invokeApi('account.getAuthorizations')\n .finally(() => {\n if(this.getAuthorizationsPromise === promise) {\n this.getAuthorizationsPromise = undefined;\n }\n });\n\n return promise;\n }\n\n public updateActiveSessions(overwrite?: boolean) {\n return this.getAuthorizations(overwrite).then((auths) => {\n this.authorizations = auths.authorizations;\n this.devicesRow.titleRight.textContent = '' + this.authorizations.length;\n });\n }\n\n public onCloseAfterTimeout() {\n this.profile.destroy();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appSidebarLeft from '..';\nimport {InputFile} from '../../../layer';\nimport InputField from '../../inputField';\nimport {SliderSuperTab} from '../../slider';\nimport AvatarEdit from '../../avatarEdit';\nimport AppAddMembersTab from './addMembers';\nimport {_i18n} from '../../../lib/langPack';\nimport ButtonCorner from '../../buttonCorner';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\nexport default class AppNewChannelTab extends SliderSuperTab {\n private uploadAvatar: () => Promise = null;\n\n private channelNameInputField: InputField;\n private channelDescriptionInputField: InputField;\n private nextBtn: HTMLButtonElement;\n private avatarEdit: AvatarEdit;\n\n public init() {\n this.container.classList.add('new-channel-container');\n this.setTitle('NewChannel');\n\n this.avatarEdit = new AvatarEdit((_upload) => {\n this.uploadAvatar = _upload;\n });\n\n const section = new SettingSection({\n caption: 'Channel.DescriptionHolderDescrpiton'\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.channelNameInputField = new InputField({\n label: 'EnterChannelName',\n maxLength: 128\n });\n\n this.channelDescriptionInputField = new InputField({\n label: 'DescriptionOptionalPlaceholder',\n maxLength: 255\n });\n\n inputWrapper.append(this.channelNameInputField.container, this.channelDescriptionInputField.container);\n\n const onLengthChange = () => {\n this.nextBtn.classList.toggle('is-visible', !!this.channelNameInputField.value.length &&\n !this.channelNameInputField.input.classList.contains('error') &&\n !this.channelDescriptionInputField.input.classList.contains('error'));\n };\n\n this.channelNameInputField.input.addEventListener('input', onLengthChange);\n this.channelDescriptionInputField.input.addEventListener('input', onLengthChange);\n\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\n\n attachClickEvent(this.nextBtn, () => {\n const title = this.channelNameInputField.value;\n const about = this.channelDescriptionInputField.value;\n\n this.nextBtn.disabled = true;\n this.managers.appChatsManager.createChannel({\n title,\n about,\n broadcast: true\n }).then((channelId) => {\n if(this.uploadAvatar) {\n this.uploadAvatar().then((inputFile) => {\n this.managers.appChatsManager.editPhoto(channelId, inputFile);\n });\n }\n\n appImManager.setInnerPeer({peerId: channelId.toPeerId(true)});\n\n appSidebarLeft.removeTabFromHistory(this);\n this.slider.createTab(AppAddMembersTab).open({\n type: 'channel',\n skippable: true,\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo',\n takeOut: (peerIds) => {\n return this.managers.appChatsManager.inviteToChannel(channelId, peerIds);\n }\n });\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.content.append(this.nextBtn);\n section.content.append(this.avatarEdit.container, inputWrapper);\n this.scrollable.append(section.container);\n }\n\n public onCloseAfterTimeout() {\n this.avatarEdit.clear();\n this.uploadAvatar = null;\n this.channelNameInputField.value = '';\n this.channelDescriptionInputField.value = '';\n this.nextBtn.disabled = false;\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField from '../inputField';\nimport PopupElement from '.';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport EditPeer from '../editPeer';\nimport {_i18n} from '../../lib/langPack';\nimport TelInputField from '../telInputField';\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\nimport {toastNew} from '../toast';\n\nexport default class PopupCreateContact extends PopupElement {\n constructor() {\n super('popup-create-contact popup-send-photo popup-new-media', {closable: true, withConfirm: 'Add', title: 'AddContactTitle'});\n this.construct();\n }\n\n private async construct() {\n attachClickEvent(this.btnConfirm, () => {\n const promise = this.managers.appUsersManager.importContact(nameInputField.value, lastNameInputField.value, telInputField.value);\n\n promise.then(() => {\n this.hide();\n }, (err) => {\n if(err.type === 'NO_USER') {\n toastNew({langPackKey: 'Contacts.PhoneNumber.NotRegistred'});\n editPeer.disabled = false;\n }\n });\n\n editPeer.lockWithPromise(promise);\n }, {listenerSetter: this.listenerSetter});\n\n const inputFields: InputField[] = [];\n const div = document.createElement('div');\n div.classList.add('name-fields');\n const nameInputField = new InputField({\n label: 'FirstName',\n name: 'create-contact-name',\n maxLength: 70,\n required: true\n });\n const lastNameInputField = new InputField({\n label: 'LastName',\n name: 'create-contact-lastname',\n maxLength: 70\n });\n const telInputField = new TelInputField({required: true});\n inputFields.push(nameInputField, lastNameInputField, telInputField);\n\n const onInput = () => {\n const name = nameInputField.value + ' ' + lastNameInputField.value;\n // const abbr = getAbbreviation(name);\n editPeer.avatarElem.peerTitle = name;\n editPeer.avatarElem.update();\n };\n\n this.listenerSetter.add(nameInputField.input)('input', onInput);\n this.listenerSetter.add(lastNameInputField.input)('input', onInput);\n\n telInputField.validate = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n const user = await this.managers.appUsersManager.getSelf();\n const formatted = formatPhoneNumber(user.phone);\n if(formatted.code) {\n telInputField.value = '+' + formatted.code.country_code;\n }\n\n const editPeer = new EditPeer({\n inputFields,\n listenerSetter: this.listenerSetter,\n doNotEditAvatar: true,\n nextBtn: this.btnConfirm,\n avatarSize: 100\n });\n\n div.append(nameInputField.container, lastNameInputField.container, editPeer.avatarElem);\n this.container.append(div, telInputField.container);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport InputSearch from '../../inputSearch';\nimport {IS_MOBILE} from '../../../environment/userAgent';\nimport {canFocus} from '../../../helpers/dom/canFocus';\nimport windowSize from '../../../helpers/windowSize';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport PopupCreateContact from '../../popups/createContact';\nimport SortedUserList from '../../sortedUserList';\nimport {getMiddleware} from '../../../helpers/middleware';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport rootScope from '../../../lib/rootScope';\nimport PopupElement from '../../popups';\n\n// TODO: поиск по людям глобальный, если не нашло в контактах никого\n\nexport default class AppContactsTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private middleware: ReturnType;\n private sortedUserList: SortedUserList;\n\n public init() {\n this.container.id = 'contacts-container';\n\n // this.list = appDialogsManager.createChatList(/* {avatarSize: 48, handheldsSize: 66} */);\n\n const btnAdd = ButtonCorner({icon: 'add', className: 'is-visible'});\n this.content.append(btnAdd);\n\n attachClickEvent(btnAdd, () => {\n PopupElement.createPopup(PopupCreateContact);\n }, {listenerSetter: this.listenerSetter});\n\n this.inputSearch = new InputSearch('Search', (value) => {\n this.openContacts(value);\n });\n\n this.listenerSetter.add(rootScope)('contacts_update', async(userId) => {\n const isContact = await this.managers.appUsersManager.isContact(userId);\n const peerId = userId.toPeerId();\n if(isContact) this.sortedUserList.add(peerId);\n else this.sortedUserList.delete(peerId);\n });\n\n this.title.replaceWith(this.inputSearch.container);\n\n this.middleware = getMiddleware();\n\n this.openContacts();\n\n // preload contacts\n // appUsersManager.getContacts();\n }\n\n protected createList() {\n const sortedUserList = new SortedUserList({\n managers: this.managers\n });\n const list = sortedUserList.list;\n list.id = 'contacts';\n list.classList.add('contacts-container');\n appDialogsManager.setListClickListener(list, () => {\n this.close();\n }, undefined, true);\n return sortedUserList;\n }\n\n protected onClose() {\n this.middleware.clean();\n /* // need to clear, and left 1 page for smooth slide\n let pageCount = appPhotosManager.windowH / 56 * 1.25 | 0;\n (Array.from(this.list.children) as HTMLElement[]).slice(pageCount).forEach((el) => el.remove()); */\n }\n\n protected onOpenAfterTimeout() {\n if(IS_MOBILE || !canFocus(true)) return;\n this.inputSearch.input.focus();\n }\n\n public openContacts(query?: string) {\n this.middleware.clean();\n const middleware = this.middleware.get();\n this.scrollable.onScrolledBottom = null;\n this.scrollable.container.textContent = '';\n\n this.managers.appUsersManager.getContactsPeerIds(query, undefined, 'online').then((contacts) => {\n if(!middleware()) {\n return;\n }\n\n const sortedUserList = this.sortedUserList = this.createList();\n\n let renderPage = () => {\n const pageCount = windowSize.height / 56 * 1.25 | 0;\n const arr = contacts.splice(0, pageCount); // надо splice!\n\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n\n if(!contacts.length) {\n renderPage = undefined;\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n renderPage();\n this.scrollable.onScrolledBottom = () => {\n if(renderPage) {\n renderPage();\n } else {\n this.scrollable.onScrolledBottom = null;\n }\n };\n\n replaceContent(this.scrollable.container, sortedUserList.list);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {SliderSuperTab} from '../../slider';\nimport {FOLDER_ID_ARCHIVE, REAL_FOLDER_ID} from '../../../lib/mtproto/mtproto_config';\n\nexport default class AppArchivedTab extends SliderSuperTab {\n private static filterId: REAL_FOLDER_ID = FOLDER_ID_ARCHIVE;\n private wasFilterId: number;\n\n public init() {\n this.wasFilterId = appDialogsManager.filterId;\n\n this.container.id = 'chats-archived-container';\n this.setTitle('ArchivedChats');\n\n this.header.classList.add('can-have-forum');\n this.content.classList.add('can-have-forum');\n\n if(!appDialogsManager.xds[AppArchivedTab.filterId]) {\n const {ul, scrollable} = appDialogsManager.l({\n title: undefined,\n id: AppArchivedTab.filterId,\n localId: FOLDER_ID_ARCHIVE\n });\n scrollable.container.append(ul);\n }\n\n const scrollable = appDialogsManager.xds[AppArchivedTab.filterId].scrollable;\n this.scrollable.container.replaceWith(scrollable.container);\n scrollable.attachBorderListeners(this.container);\n // ! DO NOT UNCOMMENT NEXT LINE - chats will stop loading on scroll after closing the tab\n // this.scrollable = scrollable;\n return appDialogsManager.setFilterIdAndChangeTab(AppArchivedTab.filterId).then(({cached, renderPromise}) => {\n if(cached) {\n return renderPromise;\n }\n });\n }\n\n // вообще, так делать нельзя, но нет времени чтобы переделать главный чатлист на слайд...\n onOpenAfterTimeout() {\n appDialogsManager.xds[this.wasFilterId].clear();\n }\n\n onClose() {\n this.scrollable.onAdditionalScroll = undefined;\n appDialogsManager.setFilterIdAndChangeTab(this.wasFilterId);\n }\n\n onCloseAfterTimeout() {\n appDialogsManager.xds[AppArchivedTab.filterId].clear();\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport ButtonCorner from '../../buttonCorner';\nimport AppNewGroupTab from './newGroup';\nimport {toast} from '../../toast';\nimport {ButtonMenuItemOptions} from '../../buttonMenu';\nimport {i18n, join, _i18n} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport wrapSticker from '../../wrappers/sticker';\nimport SortedUserList from '../../sortedUserList';\nimport {PeerLocated, Update, Updates} from '../../../layer';\nimport {SettingChatListSection} from '..';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport confirmationPopup from '../../confirmationPopup';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport type LazyLoadQueue from '../../lazyLoadQueue';\n\nexport default class AppPeopleNearbyTab extends SliderSuperTab {\n private latestLocationSaved: {latitude: number, longitude: number, accuracy: number};\n private isLocationWatched: boolean = false;\n private errorCategory: HTMLElement;\n private retryBtn: HTMLButtonElement;\n private btnOptions: HTMLButtonElement;\n private menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean})[];\n\n protected lazyLoadQueue: LazyLoadQueue;\n protected peopleSection: SettingChatListSection;\n protected chatsSection: SettingChatListSection;\n\n protected locatedPeers: Map;\n\n // public async init() {\n // this.container.classList.add('people-nearby-container');\n // this.setTitle('PeopleNearby');\n\n // this.errorCategory = document.createElement('div');\n // this.errorCategory.classList.add('text', 'hide', 'nearby-error');\n\n // this.retryBtn = ButtonCorner({icon: 'check'});\n\n // const emoji = '🧭';\n // const doc = await this.managers.appStickersManager.getAnimatedEmojiSticker(emoji);\n // const stickerContainer = document.createElement('div');\n // stickerContainer.classList.add('sticker-container');\n\n // if(doc) {\n // wrapSticker({\n // doc,\n // div: stickerContainer,\n // loop: false,\n // play: true,\n // width: 86,\n // height: 86,\n // emoji,\n // needUpscale: true\n // }).then(() => {\n // // this.animation = player;\n // });\n // } else {\n // stickerContainer.classList.add('media-sticker-wrapper');\n // }\n\n // const caption = document.createElement('div');\n // caption.classList.add('caption');\n // _i18n(caption, 'PeopleNearbyInfo2');\n\n // this.locatedPeers = new Map();\n\n // const m = () => {\n // const sortedUserList = new SortedUserList({\n // avatarSize: 42,\n // createChatListOptions: {\n // dialogSize: 48,\n // new: true\n // },\n // autonomous: false,\n // onUpdate: (element) => {\n // const peer = this.locatedPeers.get(element.id);\n // const elements: HTMLElement[] = [\n // this.parseDistance(peer.distance)\n // ];\n\n // if(!element.id.isUser()) {\n // elements.push(this.managers.appProfileManager.getChatMembersString(element.id.toChatId()));\n // }\n\n // element.dom.lastMessageSpan.textContent = '';\n // element.dom.lastMessageSpan.append(...join(elements, false));\n // },\n // getIndex: (element) => {\n // const peer = this.locatedPeers.get(element.id);\n // return 0x7FFFFFFF - peer.distance;\n // },\n // appUsersManager: this.managers.appUsersManager\n // });\n\n // appDialogsManager.setListClickListener(sortedUserList.list, undefined, undefined, false);\n\n // return sortedUserList;\n // };\n\n // const peopleSection = this.peopleSection = new SettingChatListSection({\n // name: 'PeopleNearbyHeader',\n // sortedList: m()\n // });\n\n // const chatsSection = this.chatsSection = new SettingChatListSection({\n // name: 'ChatsNearbyHeader',\n // sortedList: m()\n // });\n\n // const btnMakeVisible = peopleSection.makeButton({\n // text: 'MakeMyselfVisible',\n // icon: 'location'\n // });\n\n // const btnMakeInvisible = peopleSection.makeButton({\n // text: 'StopShowingMe',\n // icon: 'location'\n // });\n\n // const btnCreateGroup = chatsSection.makeButton({\n // text: 'NearbyCreateGroup',\n // icon: 'newgroup'\n // });\n\n // attachClickEvent(btnMakeVisible, () => {\n // confirmationPopup({\n // titleLangKey: 'MakeMyselfVisibleTitle',\n // descriptionLangKey: 'MakeMyselfVisibleInfo',\n // button: {\n // langKey: 'OK'\n // }\n // }).then(() => {\n // this.startWatching();\n // });\n // }, {listenerSetter: this.listenerSetter});\n\n // attachClickEvent(btnMakeInvisible, () => {\n // this.stopWatching();\n // }, {listenerSetter: this.listenerSetter});\n\n // attachClickEvent(btnCreateGroup, () => {\n // this.slider.createTab(AppNewGroupTab).open([], true);\n // }, {listenerSetter: this.listenerSetter});\n\n // btnMakeVisible.classList.add('primary');\n // btnMakeInvisible.classList.add('danger');\n // btnCreateGroup.classList.add('primary');\n\n // this.content.append(this.retryBtn);\n // this.scrollable.append(\n // stickerContainer,\n // caption,\n // peopleSection.container,\n // chatsSection.container,\n // this.errorCategory\n // );\n // }\n\n private parseDistance(distance: number) {\n if(rootScope.settings.distanceUnit === 'miles') {\n if(distance > 1609.34) {\n return i18n('MilesAway', [Math.round(distance / 1609)]);\n } else {\n return i18n('FootsAway', [Math.round(distance * 3.281)]);\n }\n } else {\n if(distance >= 1000) {\n return i18n('KMetersAway2', [distance / 1000]);\n } else {\n return i18n('MetersAway2', [distance]);\n }\n }\n }\n\n // public open() {\n // const result = super.open();\n // result.then(() => {\n // this.retryBtn.classList.remove('is-visible');\n // navigator.geolocation.getCurrentPosition((location) => {\n // this.latestLocationSaved = {\n // latitude: location.coords.latitude,\n // longitude: location.coords.longitude,\n // accuracy: location.coords.accuracy\n // };\n\n // console.log(this.latestLocationSaved);\n\n // this.managers.appUsersManager.getLocated(\n // location.coords.latitude,\n // location.coords.longitude,\n // location.coords.accuracy\n // ).then((response) => {\n // const update = (response as Updates.updates).updates[0] as Update.updatePeerLocated;\n // const peers = update.peers as PeerLocated.peerLocated[];\n // const orderedPeers = peers.sort((a, b) => a.distance - b.distance);\n // const groupsCounter = peers.filter((e) => e.peer._ == 'peerChannel').length;\n // const usersCounter = peers.filter((e) => e.peer._ != 'peerChannel').length;\n // orderedPeers?.forEach((peer) => {\n // const peerId = getPeerId(peer.peer);\n // const section = peerId.isUser() ? this.peopleSection : this.chatsSection;\n // this.locatedPeers.set(peerId, peer);\n // section.sortedList.add(peerId);\n // });\n\n // this.errorCategory.classList.toggle('hide', !!(usersCounter || groupsCounter));\n // this.errorCategory.innerHTML = 'No groups or channels found around you.';\n // });\n // }, (error) => {\n // this.errorCategory.classList.remove('hide');\n // this.retryBtn.classList.add('is-visible');\n // this.retryBtn.addEventListener('click', this.open);\n // if(error instanceof GeolocationPositionError) {\n // this.errorCategory.innerHTML = 'Location permission denied. Click below to retry.';\n // } else {\n // this.errorCategory.innerHTML = 'An error has occurred. Please retry later clicking the button below.';\n // }\n // });\n // });\n\n // return result;\n // }\n\n private startWatching() {\n if(!this.latestLocationSaved || this.isLocationWatched) return;\n this.isLocationWatched = true;\n\n toast('Your position is now being shared. Do not close the page or it will be suspended.');\n\n this.managers.appUsersManager.getLocated(\n this.latestLocationSaved.latitude,\n this.latestLocationSaved.longitude,\n this.latestLocationSaved.accuracy,\n true, // background parameter\n 0x7fffffff // self_expires parameter\n );\n\n navigator.geolocation.watchPosition((result) => {\n const isLongitudeDifferent = result.coords.longitude !== this.latestLocationSaved.longitude;\n const isLatitudeDifferent = result.coords.latitude !== this.latestLocationSaved.latitude;\n const distanceCheck = this.calculateDistance(\n result.coords.latitude, result.coords.longitude,\n this.latestLocationSaved.latitude, this.latestLocationSaved.longitude\n ) > 100;\n\n if((isLatitudeDifferent || isLongitudeDifferent) && distanceCheck) {\n this.managers.appUsersManager.getLocated(\n result.coords.latitude,\n result.coords.longitude,\n result.coords.accuracy,\n true, // background parameter\n 0x7fffffff // self_expires parameter\n );\n this.latestLocationSaved = {\n latitude: result.coords.latitude,\n longitude: result.coords.longitude,\n accuracy: result.coords.accuracy\n }\n }\n });\n }\n\n private stopWatching() {\n if(!this.isLocationWatched) return;\n this.isLocationWatched = false;\n toast('The sharing of your position has been stopped. You will no longer be visible to other users.');\n this.managers.appUsersManager.getLocated(\n 0, // latitude parameter\n 0, // longitude parameter\n 0, // accuracy parameter\n false, // background parameter\n 0 // self_expires parameter\n );\n }\n\n private calculateDistance(lat1: number, long1: number, lat2: number, long2: number) {\n const p = 0.017453292519943295; // Math.PI/180\n return (\n 12742 * Math.asin(\n Math.sqrt(\n (0.5 - Math.cos((lat2 - lat1) * p)) +\n (\n Math.cos(lat1 * p) * Math.cos(lat2 * p) *\n (1 - Math.cos((long2 - long1) * p)/2)\n )\n )\n )\n );\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport {SearchGroup} from '../appSearch';\nimport '../avatar';\nimport Scrollable, {ScrollableX} from '../scrollable';\nimport InputSearch from '../inputSearch';\nimport SidebarSlider from '../slider';\nimport TransitionSlider from '../transition';\nimport AppNewGroupTab from './tabs/newGroup';\nimport AppSearchSuper from '../appSearchSuper.';\nimport {DateData, fillTipDates} from '../../helpers/date';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport AppSettingsTab from './tabs/settings';\nimport AppNewChannelTab from './tabs/newChannel';\nimport AppContactsTab from './tabs/contacts';\nimport AppArchivedTab from './tabs/archivedTab';\nimport AppAddMembersTab from './tabs/addMembers';\nimport I18n, {FormatterArguments, i18n, i18n_, LangPackKey} from '../../lib/langPack';\nimport AppPeopleNearbyTab from './tabs/peopleNearby';\nimport {ButtonMenuItemOptions} from '../buttonMenu';\nimport CheckboxField from '../checkboxField';\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport PeerTitle from '../peerTitle';\nimport App from '../../config/app';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport sessionStorage from '../../lib/sessionStorage';\nimport {attachClickEvent, CLICK_EVENT_NAME, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport ButtonIcon from '../buttonIcon';\nimport confirmationPopup from '../confirmationPopup';\nimport IS_GEOLOCATION_SUPPORTED from '../../environment/geolocationSupport';\nimport type SortedUserList from '../sortedUserList';\nimport Button, {ButtonOptions} from '../button';\nimport noop from '../../helpers/noop';\nimport ripple from '../ripple';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport AvatarElement from '../avatar';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport themeController from '../../helpers/themeController';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {DIALOG_LIST_ELEMENT_TAG} from '../../lib/appManagers/appDialogsManager';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport SettingSection, {SettingSectionOptions} from '../settingSection';\nimport {FOLDER_ID_ARCHIVE} from '../../lib/mtproto/mtproto_config';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {fastRaf} from '../../helpers/schedulers';\n\nexport const LEFT_COLUMN_ACTIVE_CLASSNAME = 'is-left-column-shown';\n\nexport class AppSidebarLeft extends SidebarSlider {\n private toolsBtn: HTMLElement;\n private backBtn: HTMLButtonElement;\n // private searchInput = document.getElementById('global-search') as HTMLInputElement;\n private inputSearch: InputSearch;\n\n public archivedCount: HTMLSpanElement;\n public rect: DOMRect;\n\n private newBtnMenu: HTMLElement;\n\n // private log = logger('SL');\n\n private searchGroups: {[k in 'contacts' | 'globalContacts' | 'messages' | 'people' | 'recent']: SearchGroup} = {} as any;\n private searchSuper: AppSearchSuper;\n\n private updateBtn: HTMLElement;\n private hasUpdate: boolean;\n\n constructor() {\n super({\n sidebarEl: document.getElementById('column-left') as HTMLDivElement,\n navigationType: 'left'\n });\n }\n\n construct(managers: AppManagers) {\n this.managers = managers;\n // this._selectTab(0); // make first tab as default\n\n this.inputSearch = new InputSearch('Search');\n const sidebarHeader = this.sidebarEl.querySelector('.item-main .sidebar-header');\n sidebarHeader.append(this.inputSearch.container);\n\n const onNewGroupClick = () => {\n this.createTab(AppAddMembersTab).open({\n type: 'chat',\n skippable: false,\n takeOut: (peerIds) => this.createTab(AppNewGroupTab).open(peerIds),\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n };\n\n const onContactsClick = () => {\n this.createTab(AppContactsTab).open();\n };\n\n // this.toolsBtn = this.sidebarEl.querySelector('.sidebar-tools-button') as HTMLButtonElement;\n this.backBtn = this.sidebarEl.querySelector('.sidebar-back-button') as HTMLButtonElement;\n\n const btnArchive: typeof menuButtons[0] = {\n icon: 'archive',\n text: 'ArchivedChats',\n onClick: () => {\n this.createTab(AppArchivedTab).open();\n },\n verify: async() => {\n const folder = await this.managers.dialogsStorage.getFolderDialogs(FOLDER_ID_ARCHIVE, false);\n return !!folder.length || !(await this.managers.dialogsStorage.isDialogsLoaded(FOLDER_ID_ARCHIVE));\n }\n };\n\n const themeCheckboxField = new CheckboxField({\n toggle: true,\n checked: themeController.getTheme().name === 'night'\n });\n themeCheckboxField.input.addEventListener('change', async() => {\n await this.managers.appStateManager.setByKey('settings.theme', themeCheckboxField.input.checked ? 'night' : 'day');\n rootScope.dispatchEvent('theme_change');\n });\n\n rootScope.addEventListener('theme_change', () => {\n themeCheckboxField.setValueSilently(themeController.getTheme().name === 'night');\n });\n\n const menuButtons: (ButtonMenuItemOptions & {verify?: () => boolean | Promise})[] = [{\n icon: 'savedmessages',\n text: 'SavedMessages',\n onClick: () => {\n setTimeout(() => { // menu doesn't close if no timeout (lol)\n appImManager.setPeer({\n peerId: appImManager.myId\n });\n }, 0);\n }\n }, btnArchive, {\n icon: 'user',\n text: 'Contacts',\n onClick: onContactsClick\n }, IS_GEOLOCATION_SUPPORTED ? {\n icon: 'group',\n text: 'PeopleNearby',\n onClick: () => {\n this.createTab(AppPeopleNearbyTab).open();\n }\n } : undefined, {\n icon: 'settings',\n text: 'Settings',\n onClick: () => {\n this.createTab(AppSettingsTab).open();\n }\n }, {\n icon: 'darkmode',\n text: 'DarkMode',\n onClick: () => {\n\n },\n checkboxField: themeCheckboxField\n }, {\n icon: 'animations',\n text: 'Animations',\n onClick: () => {\n\n },\n checkboxField: new CheckboxField({\n toggle: true,\n checked: true,\n stateKey: 'settings.animationsEnabled'\n })\n }, {\n icon: 'help',\n text: 'TelegramFeatures',\n onClick: () => {\n const url = I18n.format('TelegramFeaturesUrl', true);\n appImManager.openUrl(url);\n }\n }, {\n icon: 'bug',\n text: 'ReportBug',\n onClick: () => {\n const a = document.createElement('a');\n a.target = '_blank';\n a.href = 'https://bugs.telegram.org/?tag_ids=40&sort=time';\n document.body.append(a);\n a.click();\n setTimeout(() => {\n a.remove();\n }, 0);\n }\n }, {\n icon: 'char z',\n text: 'ChatList.Menu.SwitchTo.Z',\n onClick: () => {\n Promise.all([\n sessionStorage.set({kz_version: 'Z'}),\n sessionStorage.delete('tgme_sync')\n ]).then(() => {\n location.href = 'https://web.telegram.org/z/';\n });\n },\n verify: () => App.isMainDomain\n }, {\n icon: 'char w',\n text: 'ChatList.Menu.SwitchTo.Webogram',\n onClick: () => {\n sessionStorage.delete('tgme_sync').then(() => {\n location.href = 'https://web.telegram.org/?legacy=1';\n });\n },\n verify: () => App.isMainDomain\n }];\n\n const filteredButtons = menuButtons.filter(Boolean);\n\n this.toolsBtn = ButtonMenuToggle({\n direction: 'bottom-right',\n buttons: filteredButtons,\n onOpen: (e, btnMenu) => {\n const btnMenuFooter = document.createElement('a');\n btnMenuFooter.href = 'https://github.com/morethanwords/tweb/blob/master/CHANGELOG.md';\n btnMenuFooter.target = '_blank';\n btnMenuFooter.rel = 'noopener noreferrer';\n btnMenuFooter.classList.add('btn-menu-footer');\n btnMenuFooter.addEventListener(CLICK_EVENT_NAME, (e) => {\n e.stopPropagation();\n contextMenuController.close();\n });\n const t = document.createElement('span');\n t.classList.add('btn-menu-footer-text');\n t.innerHTML = 'Telegram Web' + App.suffix + ' '/* ' alpha ' */ + App.versionFull;\n btnMenuFooter.append(t);\n btnMenu.classList.add('has-footer');\n btnMenu.append(btnMenuFooter);\n\n btnArchive.element?.append(this.archivedCount);\n }\n });\n this.toolsBtn.classList.remove('tgico-more');\n this.toolsBtn.classList.add('sidebar-tools-button', 'is-visible');\n\n this.backBtn.parentElement.insertBefore(this.toolsBtn, this.backBtn);\n\n this.newBtnMenu = ButtonMenuToggle({\n direction: 'top-left',\n buttons: [{\n icon: 'newchannel',\n text: 'NewChannel',\n onClick: () => {\n this.createTab(AppNewChannelTab).open();\n }\n }, {\n icon: 'newgroup',\n text: 'NewGroup',\n onClick: onNewGroupClick\n }, {\n icon: 'newprivate',\n text: 'NewPrivateChat',\n onClick: onContactsClick\n }]\n });\n this.newBtnMenu.className = 'btn-circle rp btn-corner z-depth-1 btn-menu-toggle animated-button-icon';\n this.newBtnMenu.insertAdjacentHTML('afterbegin', `\n \n \n `);\n this.newBtnMenu.id = 'new-menu';\n sidebarHeader.nextElementSibling.append(this.newBtnMenu);\n\n this.updateBtn = document.createElement('div');\n this.updateBtn.className = 'btn-circle rp btn-corner z-depth-1 btn-update is-hidden';\n ripple(this.updateBtn);\n this.updateBtn.append(i18n('Update'));\n\n attachClickEvent(this.updateBtn, () => {\n if(this.updateBtn.classList.contains('is-hidden')) {\n return;\n }\n\n location.reload();\n });\n\n sidebarHeader.nextElementSibling.append(this.updateBtn);\n\n this.inputSearch.input.addEventListener('focus', () => this.initSearch(), {once: true});\n\n this.archivedCount = document.createElement('span');\n this.archivedCount.className = 'archived-count badge badge-24 badge-gray';\n\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === FOLDER_ID_ARCHIVE) {\n // const count = folder.unreadMessagesCount;\n const count = folder.unreadPeerIds.size;\n this.archivedCount.textContent = '' + formatNumber(count, 1);\n this.archivedCount.classList.toggle('hide', !count);\n }\n });\n\n this.managers.appUsersManager.getTopPeers('correspondents');\n\n // Focus search input by pressing Escape\n const navigationItem: NavigationItem = {\n type: 'global-search-focus',\n onPop: () => {\n setTimeout(() => {\n this.inputSearch.input.focus();\n }, 0);\n\n return false;\n },\n noHistory: true\n };\n appNavigationController.pushItem(navigationItem);\n\n apiManagerProxy.getState().then(() => {\n const CHECK_UPDATE_INTERVAL = 1800e3;\n const checkUpdateInterval = setInterval(() => {\n fetch('version', {cache: 'no-cache'})\n .then((res) => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then((text) => {\n if(text !== App.versionFull) {\n this.hasUpdate = true;\n clearInterval(checkUpdateInterval);\n\n if(!this.newBtnMenu.classList.contains('is-hidden')) {\n this.updateBtn.classList.remove('is-hidden');\n }\n }\n })\n .catch(noop);\n }, CHECK_UPDATE_INTERVAL);\n });\n\n const onResize = () => {\n const rect = this.rect = this.tabsContainer.getBoundingClientRect();\n document.documentElement.style.setProperty('--left-column-width', rect.width + 'px');\n };\n\n fastRaf(onResize);\n mediaSizes.addEventListener('resize', onResize);\n }\n\n private initSearch() {\n const searchContainer = this.sidebarEl.querySelector('#search-container') as HTMLDivElement;\n\n const scrollable = new Scrollable(searchContainer);\n\n const close = () => {\n // setTimeout(() => {\n simulateClickEvent(this.backBtn);\n // }, 0);\n };\n\n this.searchGroups = {\n contacts: new SearchGroup('SearchAllChatsShort', 'contacts', undefined, undefined, undefined, undefined, close),\n globalContacts: new SearchGroup('GlobalSearch', 'contacts', undefined, undefined, undefined, undefined, close),\n messages: new SearchGroup('SearchMessages', 'messages'),\n people: new SearchGroup(false, 'contacts', true, 'search-group-people', true, false, close, true),\n recent: new SearchGroup('Recent', 'contacts', true, 'search-group-recent', true, true, close)\n };\n\n const searchSuper = this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'FilterChats',\n type: 'chats'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }],\n scrollable,\n searchGroups: this.searchGroups,\n asChatList: true,\n hideEmptyTabs: false,\n showSender: true,\n managers: this.managers\n });\n\n searchContainer.prepend(searchSuper.nav.parentElement.parentElement);\n scrollable.container.append(searchSuper.container);\n\n const resetSearch = () => {\n searchSuper.setQuery({\n peerId: ''.toPeerId(),\n folderId: 0\n });\n searchSuper.selectTab(0);\n searchSuper.load(true);\n };\n\n resetSearch();\n\n const pickedElements: HTMLElement[] = [];\n let selectedPeerId: PeerId = ''.toPeerId();\n let selectedMinDate = 0;\n let selectedMaxDate = 0;\n const updatePicked = () => {\n // (this.inputSearch.input as HTMLInputElement).placeholder = pickedElements.length ? 'Search' : 'Telegram Search';\n this.inputSearch.container.classList.toggle('is-picked-twice', pickedElements.length === 2);\n this.inputSearch.container.classList.toggle('is-picked', !!pickedElements.length);\n\n if(pickedElements.length) {\n this.inputSearch.input.style.setProperty('--paddingLeft', (pickedElements[pickedElements.length - 1].getBoundingClientRect().right - this.inputSearch.input.getBoundingClientRect().left) + 'px');\n } else {\n this.inputSearch.input.style.removeProperty('--paddingLeft');\n }\n };\n\n const helper = document.createElement('div');\n helper.classList.add('search-helper');\n helper.addEventListener('click', (e) => {\n const target = findUpClassName(e.target, 'selector-user');\n if(!target) {\n return;\n }\n\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n const [_, minDate, maxDate] = key.split('_');\n selectedMinDate = +minDate;\n selectedMaxDate = +maxDate;\n } else {\n selectedPeerId = key.toPeerId();\n }\n\n target.addEventListener('click', () => {\n unselectEntity(target);\n });\n\n this.inputSearch.container.append(target);\n this.inputSearch.onChange(this.inputSearch.value = '');\n pickedElements.push(target);\n updatePicked();\n });\n\n searchSuper.nav.parentElement.append(helper);\n\n const renderEntity = (key: PeerId | string, title?: string | HTMLElement) => {\n const div = document.createElement('div');\n div.classList.add('selector-user'/* , 'scale-in' */);\n\n const avatarEl = new AvatarElement();\n avatarEl.classList.add('selector-user-avatar', 'tgico', 'avatar-32');\n avatarEl.isDialog = true;\n\n div.dataset.key = '' + key;\n if(key.isPeerId()) {\n if(title === undefined) {\n title = new PeerTitle({peerId: key.toPeerId()}).element;\n }\n\n avatarEl.updateWithOptions({peerId: key as PeerId});\n } else {\n avatarEl.classList.add('tgico-calendarfilter');\n }\n\n if(title) {\n if(typeof(title) === 'string') {\n div.innerHTML = title;\n } else {\n replaceContent(div, title);\n div.append(title);\n }\n }\n\n div.insertAdjacentElement('afterbegin', avatarEl);\n\n return div;\n };\n\n const unselectEntity = (target: HTMLElement) => {\n const key = target.dataset.key;\n if(key.indexOf('date_') === 0) {\n selectedMinDate = selectedMaxDate = 0;\n } else {\n selectedPeerId = ''.toPeerId();\n }\n\n target.remove();\n indexOfAndSplice(pickedElements, target);\n\n setTimeout(() => {\n updatePicked();\n this.inputSearch.onChange(this.inputSearch.value);\n }, 0);\n };\n\n this.inputSearch.onClear = () => {\n pickedElements.forEach((el) => {\n unselectEntity(el);\n });\n };\n\n this.inputSearch.onChange = (value) => {\n searchSuper.cleanupHTML();\n searchSuper.setQuery({\n peerId: selectedPeerId,\n folderId: selectedPeerId ? undefined : 0,\n query: value,\n minDate: selectedMinDate,\n maxDate: selectedMaxDate\n });\n searchSuper.load(true);\n\n helper.innerHTML = '';\n searchSuper.nav.classList.remove('hide');\n if(!value) {\n }\n\n if(!selectedPeerId && value.trim()) {\n const middleware = searchSuper.middleware.get();\n Promise.all([\n // appMessagesManager.getConversationsAll(value).then((dialogs) => dialogs.map((d) => d.peerId)),\n this.managers.dialogsStorage.getDialogs({query: value}).then(({dialogs}) => dialogs.map((d) => d.peerId)),\n this.managers.appUsersManager.getContactsPeerIds(value, true)\n ]).then((results) => {\n if(!middleware()) return;\n const peerIds = new Set(results[0].concat(results[1]));\n\n peerIds.forEach((peerId) => {\n helper.append(renderEntity(peerId));\n });\n\n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n // console.log('got peerIds by value:', value, [...peerIds]);\n });\n }\n\n if(!selectedMinDate && value.trim()) {\n const dates: DateData[] = [];\n fillTipDates(value, dates);\n dates.forEach((dateData) => {\n helper.append(renderEntity('date_' + dateData.minDate + '_' + dateData.maxDate, dateData.title));\n });\n\n searchSuper.nav.classList.toggle('hide', !!helper.innerHTML);\n }\n };\n\n searchSuper.tabs.inputMessagesFilterEmpty.addEventListener('mousedown', (e) => {\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG) as HTMLElement;\n if(!target) {\n return;\n }\n\n const searchGroup = findUpClassName(target, 'search-group');\n if(!searchGroup || searchGroup.classList.contains('search-group-recent') || searchGroup.classList.contains('search-group-people')) {\n return;\n }\n\n const peerId = target.getAttribute('data-peer-id').toPeerId();\n this.managers.appUsersManager.pushRecentSearch(peerId);\n }, {capture: true});\n\n const peopleContainer = document.createElement('div');\n peopleContainer.classList.add('search-group-scrollable');\n peopleContainer.append(this.searchGroups.people.list);\n this.searchGroups.people.container.append(peopleContainer);\n const peopleScrollable = new ScrollableX(peopleContainer);\n\n let first = true;\n let hideNewBtnMenuTimeout: number;\n // const transition = Transition.bind(null, searchContainer.parentElement, 150);\n const transition = TransitionSlider({\n content: searchContainer.parentElement,\n type: 'zoom-fade',\n transitionTime: 150,\n onTransitionEnd: (id) => {\n if(hideNewBtnMenuTimeout) clearTimeout(hideNewBtnMenuTimeout);\n\n if(id === 0 && !first) {\n searchSuper.selectTab(0, false);\n this.inputSearch.onClearClick();\n hideNewBtnMenuTimeout = window.setTimeout(() => {\n hideNewBtnMenuTimeout = 0;\n this.newBtnMenu.classList.remove('is-hidden');\n this.hasUpdate && this.updateBtn.classList.remove('is-hidden');\n }, 150);\n }\n\n first = false;\n }\n });\n\n transition(0);\n\n const activeClassName = 'is-visible';\n const onFocus = () => {\n this.toolsBtn.classList.remove(activeClassName);\n this.backBtn.classList.add(activeClassName);\n this.newBtnMenu.classList.add('is-hidden');\n this.updateBtn.classList.add('is-hidden');\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', true);\n\n const navigationType: NavigationItem['type'] = 'global-search';\n if(!IS_MOBILE_SAFARI && !appNavigationController.findItemByType(navigationType)) {\n appNavigationController.pushItem({\n onPop: () => {\n close();\n },\n type: navigationType\n });\n }\n\n transition(1);\n };\n\n this.inputSearch.input.addEventListener('focus', onFocus);\n onFocus();\n\n attachClickEvent(this.backBtn, (e) => {\n this.toolsBtn.classList.add(activeClassName);\n this.backBtn.classList.remove(activeClassName);\n this.toolsBtn.parentElement.firstElementChild.classList.toggle('state-back', false);\n\n appNavigationController.removeByType('global-search');\n\n transition(0);\n });\n\n const clearRecentSearchBtn = ButtonIcon('close');\n this.searchGroups.recent.nameEl.append(clearRecentSearchBtn);\n clearRecentSearchBtn.addEventListener('click', () => {\n confirmationPopup({\n descriptionLangKey: 'Search.Confirm.ClearHistory',\n button: {\n langKey: 'ClearButton',\n isDanger: true\n }\n }).then(() => {\n return this.managers.appUsersManager.clearRecentSearch().then(() => {\n this.searchGroups.recent.clear();\n });\n });\n });\n }\n}\n\nexport class SettingChatListSection extends SettingSection {\n public sortedList: SortedUserList;\n\n constructor(options: SettingSectionOptions & {sortedList: SortedUserList}) {\n super(options);\n\n this.sortedList = options.sortedList;\n\n this.content.append(this.sortedList.list);\n }\n\n public makeButton(options: ButtonOptions) {\n const button = Button('folder-category-button btn btn-primary btn-transparent', options);\n if(this.title) this.content.insertBefore(button, this.title.nextSibling);\n else this.content.prepend(button);\n return button;\n }\n}\n\nconst appSidebarLeft = new AppSidebarLeft();\nMOUNT_CLASS_TO.appSidebarLeft = appSidebarLeft;\nexport default appSidebarLeft;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport AppSelectPeers from '../../appSelectPeers';\nimport {setButtonLoader} from '../../putPreloader';\nimport {LangPackKey, _i18n} from '../../../lib/langPack';\nimport ButtonCorner from '../../buttonCorner';\n\nexport default class AppAddMembersTab extends SliderSuperTab {\n private nextBtn: HTMLButtonElement;\n private selector: AppSelectPeers;\n private peerType: 'channel' | 'chat' | 'privacy';\n private takeOut: (peerIds: PeerId[]) => Promise | false | void;\n private skippable: boolean;\n\n public init(options: {\n title: LangPackKey,\n placeholder: LangPackKey,\n type: AppAddMembersTab['peerType'],\n takeOut?: AppAddMembersTab['takeOut'],\n skippable: boolean,\n selectedPeerIds?: PeerId[]\n }) {\n this.container.classList.add('add-members-container');\n this.nextBtn = ButtonCorner({icon: 'arrow_next'});\n this.content.append(this.nextBtn);\n this.scrollable.container.remove();\n\n this.nextBtn.addEventListener('click', () => {\n const peerIds = this.selector.getSelected().map((sel) => sel.toPeerId());\n const result = this.takeOut(peerIds);\n\n if(this.skippable) {\n this.close();\n } else if(result instanceof Promise) {\n this.attachToPromise(result);\n } else if(result === undefined) {\n this.close();\n }\n });\n\n //\n this.setTitle(options.title);\n this.peerType = options.type;\n this.takeOut = options.takeOut;\n this.skippable = options.skippable;\n\n const isPrivacy = this.peerType === 'privacy';\n this.selector = new AppSelectPeers({\n appendTo: this.content,\n onChange: this.skippable ? null : (length) => {\n this.nextBtn.classList.toggle('is-visible', !!length);\n },\n peerType: [isPrivacy ? 'dialogs' : 'contacts'],\n placeholder: options.placeholder,\n exceptSelf: isPrivacy,\n filterPeerTypeBy: isPrivacy ? ['isAnyGroup', 'isUser'] : undefined,\n managers: this.managers,\n design: 'square'\n });\n\n if(options.selectedPeerIds) {\n this.selector.addInitial(options.selectedPeerIds);\n }\n\n this.nextBtn.classList.add('tgico-arrow_next');\n this.nextBtn.innerHTML = '';\n this.nextBtn.disabled = false;\n this.nextBtn.classList.toggle('is-visible', this.skippable);\n }\n\n public attachToPromise(promise: Promise) {\n const removeLoader = setButtonLoader(this.nextBtn, 'arrow_next');\n\n promise.then(() => {\n this.close();\n }, () => {\n removeLoader();\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport AppSelectPeers from '../../appSelectPeers';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {MyDialogFilter as DialogFilter} from '../../../lib/storages/filters';\nimport ButtonIcon from '../../buttonIcon';\nimport CheckboxField from '../../checkboxField';\nimport Button from '../../button';\nimport AppEditFolderTab from './editFolder';\nimport I18n, {i18n, LangPackKey, _i18n, join} from '../../../lib/langPack';\nimport {toast} from '../../toast';\nimport copy from '../../../helpers/object/copy';\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport {REAL_FOLDERS} from '../../../lib/mtproto/mtproto_config';\nimport rootScope from '../../../lib/rootScope';\nimport {MTAppConfig} from '../../../lib/mtproto/appConfig';\nimport {attachClickEvent, simulateClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\nexport default class AppIncludedChatsTab extends SliderSuperTab {\n private editFolderTab: AppEditFolderTab;\n private confirmBtn: HTMLElement;\n\n private selector: AppSelectPeers;\n private type: 'included' | 'excluded';\n private filter: DialogFilter;\n private originalFilter: DialogFilter;\n\n private dialogsByFilters: Map>;\n private limit: number;\n\n public init(\n filter: DialogFilter,\n type: 'included' | 'excluded',\n editFolderTab: AppIncludedChatsTab['editFolderTab']\n ) {\n this.originalFilter = filter;\n this.filter = copy(this.originalFilter);\n this.type = type;\n this.editFolderTab = editFolderTab;\n\n this.content.remove();\n this.container.classList.add('included-chatlist-container');\n this.confirmBtn = ButtonIcon('check btn-confirm blue', {noRipple: true});\n this.confirmBtn.style.display = 'none';\n\n this.header.append(this.confirmBtn);\n\n attachClickEvent(this.confirmBtn, async() => {\n const selected = this.selector.getSelected();\n\n // this.filter.pFlags = {};\n\n if(this.type === 'included') {\n for(const key in this.filter.pFlags) {\n if(key.indexOf('exclude_') === 0) {\n continue;\n }\n\n // @ts-ignore\n delete this.filter.pFlags[key];\n }\n } else {\n for(const key in this.filter.pFlags) {\n if(key.indexOf('exclude_') !== 0) {\n continue;\n }\n\n // @ts-ignore\n delete this.filter.pFlags[key];\n }\n }\n\n const peerIds: PeerId[] = [];\n for(const key of selected) {\n if(key.isPeerId()) {\n peerIds.push(key.toPeerId());\n } else {\n // @ts-ignore\n this.filter.pFlags[key] = true;\n }\n }\n\n let cmp: (peerId: PeerId) => boolean;\n if(this.type === 'included') {\n cmp = (peerId) => peerIds.includes(peerId);\n } else {\n cmp = (peerId) => !peerIds.includes(peerId);\n }\n\n forEachReverse(this.filter.pinnedPeerIds, (peerId, idx) => {\n if(!cmp(peerId)) {\n this.filter.pinnedPeerIds.splice(idx, 1);\n this.filter.pinned_peers.splice(idx, 1);\n }\n });\n\n const other = this.type === 'included' ? 'excludePeerIds' : 'includePeerIds';\n const otherLegacy = this.type === 'included' ? 'exclude_peers' : 'include_peers';\n forEachReverse(this.filter[other], (peerId, idx) => {\n if(peerIds.includes(peerId)) {\n this.filter[other].splice(idx, 1);\n this.filter[otherLegacy].splice(idx, 1);\n }\n });\n\n this.filter[this.type === 'included' ? 'includePeerIds' : 'excludePeerIds'] = peerIds;\n this.filter[this.type === 'included' ? 'include_peers' : 'exclude_peers'] = await Promise.all(peerIds.map((peerId) => this.managers.appPeersManager.getInputPeerById(peerId)));\n // this.filter.pinned_peers = this.filter.pinned_peers.filter((peerId) => this.filter.include_peers.includes(peerId));\n\n this.editFolderTab.setFilter(this.filter, false);\n this.close();\n }, {listenerSetter: this.listenerSetter});\n\n const onAppConfig = (appConfig: MTAppConfig) => {\n this.limit = rootScope.premium ? appConfig.dialog_filters_chats_limit_premium : appConfig.dialog_filters_chats_limit_default;\n };\n\n this.listenerSetter.add(rootScope)('app_config', onAppConfig);\n\n this.dialogsByFilters = new Map();\n return Promise.all([\n this.managers.filtersStorage.getDialogFilters().then(async(filters) => {\n await Promise.all(filters.filter((filter) => !REAL_FOLDERS.has(filter.id)).map(async(filter) => {\n const dialogs = await this.managers.dialogsStorage.getFolderDialogs(filter.id);\n const peerIds = dialogs.map((d) => d.peerId);\n this.dialogsByFilters.set(filter, new Set(peerIds));\n }));\n }),\n\n this.managers.apiManager.getAppConfig().then((appConfig) => {\n onAppConfig(appConfig);\n })\n ]);\n }\n\n checkbox(selected?: boolean) {\n const checkboxField = new CheckboxField({\n round: true\n });\n if(selected) {\n checkboxField.input.checked = selected;\n }\n\n return checkboxField.label;\n }\n\n renderResults = async(peerIds: PeerId[]) => {\n // const other = this.type === 'included' ? this.filter.exclude_peers : this.filter.include_peers;\n\n await this.managers.appUsersManager.getContacts();\n peerIds.forEach((peerId) => {\n // if(other.includes(peerId)) return;\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: this.selector.scrollable,\n rippleEnabled: true,\n avatarSize: 'abitbigger'\n });\n\n const selected = this.selector.selected.has(peerId);\n dom.containerEl.append(this.checkbox(selected));\n // if(selected) dom.listEl.classList.add('active');\n\n const foundInFilters: HTMLElement[] = [];\n this.dialogsByFilters.forEach((dialogs, filter) => {\n if(dialogs.has(peerId)) {\n const span = document.createElement('span');\n setInnerHTML(span, wrapEmojiText(filter.title));\n foundInFilters.push(span);\n }\n });\n\n const joined = join(foundInFilters, false);\n joined.forEach((el) => {\n dom.lastMessageSpan.append(el);\n });\n });\n };\n\n onOpen() {\n this.confirmBtn.style.display = this.type === 'excluded' ? '' : 'none';\n this.setTitle(this.type === 'included' ? 'FilterAlwaysShow' : 'FilterNeverShow');\n\n const filter = this.filter;\n\n const categoriesSection = new SettingSection({\n noDelimiter: true,\n name: 'FilterChatTypes'\n });\n\n categoriesSection.container.classList.add('folder-categories');\n\n let details: {[flag: string]: {ico: string, text: LangPackKey}};\n if(this.type === 'excluded') {\n details = {\n exclude_muted: {ico: 'mute', text: 'ChatList.Filter.MutedChats'},\n exclude_archived: {ico: 'archive', text: 'ChatList.Filter.Archive'},\n exclude_read: {ico: 'readchats', text: 'ChatList.Filter.ReadChats'}\n };\n } else {\n details = {\n contacts: {ico: 'newprivate', text: 'ChatList.Filter.Contacts'},\n non_contacts: {ico: 'noncontacts', text: 'ChatList.Filter.NonContacts'},\n groups: {ico: 'group', text: 'ChatList.Filter.Groups'},\n broadcasts: {ico: 'newchannel', text: 'ChatList.Filter.Channels'},\n bots: {ico: 'bots', text: 'ChatList.Filter.Bots'}\n };\n }\n\n const f = document.createDocumentFragment();\n for(const key in details) {\n const button = Button('btn-primary btn-transparent folder-category-button', {icon: details[key].ico, text: details[key].text});\n button.dataset.peerId = key;\n button.append(this.checkbox());\n f.append(button);\n }\n categoriesSection.content.append(f);\n\n // ///////////////\n\n const selectedPeers = (this.type === 'included' ? filter.includePeerIds : filter.excludePeerIds).slice();\n\n this.selector = new AppSelectPeers({\n appendTo: this.container,\n onChange: this.onSelectChange,\n peerType: ['dialogs'],\n renderResultsFunc: this.renderResults,\n placeholder: 'Search',\n sectionNameLangPackKey: 'FilterChats',\n managers: this.managers\n });\n this.selector.selected = new Set(selectedPeers);\n\n let addedInitial = false;\n const _add = this.selector.add.bind(this.selector);\n this.selector.add = (peerId, title, scroll) => {\n if(this.selector.selected.size >= this.limit && addedInitial && !details[peerId]) {\n const el: HTMLInputElement = this.selector.list.querySelector(`[data-peer-id=\"${peerId}\"] [type=\"checkbox\"]`);\n if(el) {\n setTimeout(() => {\n el.checked = false;\n }, 0);\n }\n\n const str = I18n.format(this.type === 'excluded' ? 'ChatList.Filter.Exclude.LimitReached': 'ChatList.Filter.Include.LimitReached', true);\n toast(str);\n return;\n }\n\n const div = _add(peerId, details[peerId] ? i18n(details[peerId].text) : undefined, scroll);\n if(details[peerId]) {\n div.querySelector('avatar-element').classList.add('tgico-' + details[peerId].ico);\n }\n return div;\n };\n\n this.selector.scrollable.container.append(categoriesSection.container, this.selector.scrollable.container.lastElementChild);\n\n this.selector.addInitial(selectedPeers);\n addedInitial = true;\n\n for(const flag in filter.pFlags) {\n // @ts-ignore\n if(details.hasOwnProperty(flag) && !!filter.pFlags[flag]) {\n simulateClickEvent(categoriesSection.content.querySelector(`[data-peer-id=\"${flag}\"]`) as HTMLElement);\n }\n }\n }\n\n onSelectChange = (length: number) => {\n // const changed = !deepEqual(this.filter, this.originalFilter);\n if(this.type === 'included') {\n this.confirmBtn.style.display = length ? '' : 'none';\n }\n };\n\n onCloseAfterTimeout() {\n if(this.selector) {\n this.selector.container.remove();\n this.selector = null;\n }\n\n return super.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {MyDialogFilter as DialogFilter} from '../../../lib/storages/filters';\nimport lottieLoader, {LottieLoader} from '../../../lib/rlottie/lottieLoader';\nimport {SliderSuperTab} from '../../slider';\nimport {toast} from '../../toast';\nimport InputField from '../../inputField';\nimport ButtonIcon from '../../buttonIcon';\nimport ButtonMenuToggle from '../../buttonMenuToggle';\nimport {ButtonMenuItemOptions} from '../../buttonMenu';\nimport Button from '../../button';\nimport AppIncludedChatsTab from './includedChats';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport PopupPeer from '../../popups/peer';\nimport RLottiePlayer from '../../../lib/rlottie/rlottiePlayer';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport wrapDraftText from '../../../lib/richTextProcessor/wrapDraftText';\nimport filterAsync from '../../../helpers/array/filterAsync';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport SettingSection from '../../settingSection';\n\nconst MAX_FOLDER_NAME_LENGTH = 12;\n\nexport default class AppEditFolderTab extends SliderSuperTab {\n private caption: HTMLElement;\n private stickerContainer: HTMLElement;\n\n private confirmBtn: HTMLElement;\n private menuBtn: HTMLElement;\n private nameInputField: InputField;\n\n private includePeerIds: SettingSection;\n private excludePeerIds: SettingSection;\n private flags: {[k in 'contacts' | 'non_contacts' | 'groups' | 'broadcasts' | 'bots' | 'exclude_muted' | 'exclude_archived' | 'exclude_read']: HTMLElement} = {} as any;\n\n private animation: RLottiePlayer;\n private filter: DialogFilter;\n private originalFilter: DialogFilter;\n\n private type: 'edit' | 'create';\n private loadAnimationPromise: ReturnType;\n\n public static getInitArgs() {\n return {\n animationData: lottieLoader.loadAnimationFromURLManually('Folders_2')\n };\n }\n\n public init(p: ReturnType = AppEditFolderTab.getInitArgs()) {\n this.container.classList.add('edit-folder-container');\n this.caption = document.createElement('div');\n this.caption.classList.add('caption');\n this.caption.append(i18n('FilterIncludeExcludeInfo'));\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add('sticker-container');\n\n this.confirmBtn = ButtonIcon('check btn-confirm hide blue');\n const deleteFolderButton: ButtonMenuItemOptions = {\n icon: 'delete danger',\n text: 'FilterMenuDelete',\n onClick: () => {\n new PopupPeer('filter-delete', {\n titleLangKey: 'ChatList.Filter.Confirm.Remove.Header',\n descriptionLangKey: 'ChatList.Filter.Confirm.Remove.Text',\n buttons: [{\n langKey: 'Delete',\n callback: () => {\n deleteFolderButton.element.setAttribute('disabled', 'true');\n this.managers.filtersStorage.updateDialogFilter(this.filter, true).then((bool) => {\n if(bool) {\n this.close();\n }\n }).finally(() => {\n deleteFolderButton.element.removeAttribute('disabled');\n });\n },\n isDanger: true\n }]\n }).show();\n }\n };\n this.menuBtn = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [deleteFolderButton]\n });\n this.menuBtn.classList.add('hide');\n\n this.header.append(this.confirmBtn, this.menuBtn);\n\n const inputSection = new SettingSection({});\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.nameInputField = new InputField({\n label: 'FilterNameHint',\n maxLength: MAX_FOLDER_NAME_LENGTH\n });\n\n inputWrapper.append(this.nameInputField.container);\n inputSection.content.append(inputWrapper);\n\n const generateList = (className: string, h2Text: LangPackKey, buttons: {icon: string, name?: string, withRipple?: true, text: LangPackKey}[], to: any) => {\n const section = new SettingSection({\n name: h2Text,\n noDelimiter: true\n });\n\n section.container.classList.add('folder-list', className);\n\n const categories = section.generateContentElement();\n categories.classList.add('folder-categories');\n\n buttons.forEach((o) => {\n const button = Button('folder-category-button btn btn-primary btn-transparent', {\n icon: o.icon,\n text: o.text,\n noRipple: o.withRipple ? undefined : true\n });\n\n if(o.name) {\n to[o.name] = button;\n }\n\n categories.append(button);\n });\n\n return section;\n };\n\n this.includePeerIds = generateList('folder-list-included', 'FilterInclude', [{\n icon: 'add primary',\n text: 'ChatList.Filter.Include.AddChat',\n withRipple: true\n }, {\n text: 'ChatList.Filter.Contacts',\n icon: 'newprivate',\n name: 'contacts'\n }, {\n text: 'ChatList.Filter.NonContacts',\n icon: 'noncontacts',\n name: 'non_contacts'\n }, {\n text: 'ChatList.Filter.Groups',\n icon: 'group',\n name: 'groups'\n }, {\n text: 'ChatList.Filter.Channels',\n icon: 'channel',\n name: 'broadcasts'\n }, {\n text: 'ChatList.Filter.Bots',\n icon: 'bots',\n name: 'bots'\n }], this.flags);\n\n this.excludePeerIds = generateList('folder-list-excluded', 'FilterExclude', [{\n icon: 'minus primary',\n text: 'ChatList.Filter.Exclude.AddChat',\n withRipple: true\n }, {\n text: 'ChatList.Filter.MutedChats',\n icon: 'mute',\n name: 'exclude_muted'\n }, {\n text: 'ChatList.Filter.Archive',\n icon: 'archive',\n name: 'exclude_archived'\n }, {\n text: 'ChatList.Filter.ReadChats',\n icon: 'readchats',\n name: 'exclude_read'\n }], this.flags);\n\n this.scrollable.append(this.stickerContainer, this.caption, inputSection.container, this.includePeerIds.container, this.excludePeerIds.container);\n\n const includedFlagsContainer = this.includePeerIds.container.querySelector('.folder-categories');\n const excludedFlagsContainer = this.excludePeerIds.container.querySelector('.folder-categories');\n\n attachClickEvent(includedFlagsContainer.querySelector('.btn') as HTMLElement, () => {\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'included', this);\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(excludedFlagsContainer.querySelector('.btn') as HTMLElement, () => {\n this.slider.createTab(AppIncludedChatsTab).open(this.filter, 'excluded', this);\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.confirmBtn, () => {\n if(this.nameInputField.input.classList.contains('error')) {\n return;\n }\n\n if(!this.nameInputField.value.trim()) {\n this.nameInputField.input.classList.add('error');\n return;\n }\n\n let include = (Array.from(includedFlagsContainer.children) as HTMLElement[]).slice(1).reduce((acc, el) => acc + +!el.style.display, 0);\n include += this.filter.include_peers.length;\n\n if(!include) {\n toast('Please choose at least one chat for this folder.');\n return;\n }\n\n this.confirmBtn.setAttribute('disabled', 'true');\n\n let promise: Promise;\n if(!this.filter.id) {\n promise = this.managers.filtersStorage.createDialogFilter(this.filter);\n } else {\n promise = this.managers.filtersStorage.updateDialogFilter(this.filter);\n }\n\n promise.then((bool) => {\n if(bool) {\n this.close();\n }\n }).catch((err) => {\n if(err.type === 'DIALOG_FILTERS_TOO_MUCH') {\n toast('Sorry, you can\\'t create more folders.');\n } else {\n console.error('updateDialogFilter error:', err);\n }\n }).finally(() => {\n this.confirmBtn.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(this.nameInputField.input)('input', () => {\n this.filter.title = this.nameInputField.value;\n this.editCheckForChange();\n });\n\n const reloadMissingPromises: Promise[] = this.type === 'edit' ? [\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'pinned_peers'),\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'include_peers'),\n this.managers.filtersStorage.reloadMissingPeerIds(this.filter.id, 'exclude_peers')\n ] : [];\n\n return Promise.all([\n this.loadAnimationPromise = p.animationData.then(async(cb) => {\n const player = await cb({\n container: this.stickerContainer,\n loop: false,\n autoplay: false,\n width: 86,\n height: 86\n });\n\n this.animation = player;\n\n return lottieLoader.waitForFirstFrame(player);\n }),\n\n ...reloadMissingPromises\n ]).then(() => {\n if(this.type === 'edit') {\n this.setFilter(this.originalFilter, true);\n this.onEditOpen();\n } else {\n this.onCreateOpen();\n }\n });\n }\n\n onOpenAfterTimeout() {\n this.loadAnimationPromise.then(() => {\n this.animation.autoplay = true;\n this.animation.play();\n });\n }\n\n private onCreateOpen() {\n // this.caption.style.display = '';\n this.setTitle('FilterNew');\n this.menuBtn.classList.add('hide');\n this.confirmBtn.classList.remove('hide');\n this.nameInputField.value = '';\n\n for(const flag in this.flags) {\n // @ts-ignore\n this.flags[flag].style.display = 'none';\n }\n }\n\n private onEditOpen() {\n // this.caption.style.display = 'none';\n this.setTitle(this.type === 'create' ? 'FilterNew' : 'FilterHeaderEdit');\n\n if(this.type === 'edit') {\n this.menuBtn.classList.remove('hide');\n this.confirmBtn.classList.add('hide');\n }\n\n const filter = this.filter;\n this.nameInputField.value = wrapDraftText(filter.title);\n\n for(const flag in this.flags) {\n this.flags[flag as keyof AppEditFolderTab['flags']].style.display = !!filter.pFlags[flag as keyof AppEditFolderTab['flags']] ? '' : 'none';\n }\n\n (['includePeerIds' as const, 'excludePeerIds' as const]).forEach(async(key) => {\n const section = this[key];\n const ul = appDialogsManager.createChatList({ignoreClick: true});\n\n let peers = filter[key];\n\n // filter peers where we're kicked\n const hasPeer = async(peerId: PeerId) => {\n return !!(await this.managers.appMessagesManager.getDialogOnly(peerId)) || (peerId.isUser() ? (await this.managers.appUsersManager.getUser(peerId.toUserId()))._ === 'user' : false);\n };\n\n const filtered = await filterAsync(peers, (peerId) => hasPeer(peerId));\n peers.length = 0;\n peers.push(...filtered);\n\n peers = peers.slice();\n\n const renderMore = async(_length: number) => {\n for(let i = 0, length = Math.min(peers.length, _length); i < length; ++i) {\n const peerId = peers.shift();\n if(peerId.isUser() ? false : !(await this.managers.appMessagesManager.getDialogOnly(peerId))) {\n continue;\n }\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n container: ul,\n rippleEnabled: false,\n meAsSaved: true,\n avatarSize: 'small'\n });\n dom.lastMessageSpan.parentElement.remove();\n }\n\n if(peers.length) {\n showMore.lastElementChild.replaceWith(i18n('FilterShowMoreChats', [peers.length]));\n } else if(showMore) {\n showMore.remove();\n }\n };\n\n section.generateContentElement().append(ul);\n\n let showMore: HTMLElement;\n if(peers.length) {\n const content = section.generateContentElement();\n showMore = Button('folder-category-button btn btn-primary btn-transparent', {icon: 'down'});\n showMore.classList.add('load-more', 'rp-overflow');\n attachClickEvent(showMore, () => renderMore(20), {listenerSetter: this.listenerSetter});\n showMore.append(i18n('FilterShowMoreChats', [peers.length]));\n\n content.append(showMore);\n }\n\n renderMore(4);\n });\n }\n\n editCheckForChange() {\n if(this.type === 'edit') {\n const changed = !deepEqual(this.originalFilter, this.filter);\n this.confirmBtn.classList.toggle('hide', !changed);\n this.menuBtn.classList.toggle('hide', changed);\n }\n };\n\n setFilter(filter: DialogFilter, firstTime: boolean) {\n if(this.container) {\n // cleanup\n Array.from(this.container.querySelectorAll('ul, .load-more')).forEach((el) => el.remove());\n }\n\n if(firstTime) {\n this.originalFilter = filter;\n this.filter = copy(filter);\n } else {\n this.filter = filter;\n this.onEditOpen();\n this.editCheckForChange();\n }\n }\n\n public setInitFilter(filter?: DialogFilter) {\n if(filter === undefined) {\n this.setFilter({\n _: 'dialogFilter',\n id: 0,\n title: '',\n pFlags: {},\n pinned_peers: [],\n include_peers: [],\n exclude_peers: [],\n pinnedPeerIds: [],\n includePeerIds: [],\n excludePeerIds: []\n }, true);\n this.type = 'create';\n } else {\n this.setFilter(filter, true);\n this.type = 'edit';\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport InputField from '../../inputField';\nimport {SliderSuperTab} from '../../slider';\nimport EditPeer from '../../editPeer';\nimport {UsernameInputField} from '../../usernameInputField';\nimport {i18n, i18n_, LangPackKey} from '../../../lib/langPack';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport rootScope from '../../../lib/rootScope';\nimport setBlankToAnchor from '../../../lib/richTextProcessor/setBlankToAnchor';\nimport getPeerEditableUsername from '../../../lib/appManagers/utils/peers/getPeerEditableUsername';\nimport SettingSection, {generateSection} from '../../settingSection';\nimport UsernamesSection from '../../usernamesSection';\n\n// TODO: аватарка не поменяется в этой вкладке после изменения почему-то (если поставить в другом клиенте, и потом тут проверить, для этого ещё вышел в чатлист)\n\nexport function purchaseUsernameCaption() {\n const p = document.createElement('div');\n const FRAGMENT_USERNAME_URL = 'https://fragment.com/username/';\n const a = setBlankToAnchor(document.createElement('a'));\n const purchaseText = i18n('Username.Purchase', [a]);\n purchaseText.classList.add('username-purchase-help');\n p.append(\n purchaseText,\n document.createElement('br'),\n document.createElement('br')\n );\n p.classList.add('hide');\n\n return {\n element: p,\n setUsername: (username: string) => {\n if(username) {\n a.href = FRAGMENT_USERNAME_URL + username;\n }\n\n p.classList.toggle('hide', !username);\n }\n };\n}\n\nexport default class AppEditProfileTab extends SliderSuperTab {\n private firstNameInputField: InputField;\n private lastNameInputField: InputField;\n private bioInputField: InputField;\n private usernameInputField: UsernameInputField;\n\n private profileUrlContainer: HTMLDivElement;\n private profileUrlAnchor: HTMLAnchorElement;\n\n private editPeer: EditPeer;\n\n public static getInitArgs() {\n return {\n bioMaxLength: rootScope.managers.apiManager.getLimit('bio'),\n user: rootScope.managers.appUsersManager.getSelf(),\n userFull: rootScope.managers.appProfileManager.getProfile(rootScope.myId.toUserId())\n };\n }\n\n public async init(p: ReturnType) {\n this.container.classList.add('edit-profile-container');\n this.setTitle('EditAccount.Title');\n\n const inputFields: InputField[] = [];\n\n const [bioMaxLength, user, userFull] = await Promise.all([p.bioMaxLength, p.user, p.userFull]);\n\n {\n const section = generateSection(this.scrollable, undefined, 'Bio.Description');\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.firstNameInputField = new InputField({\n label: 'EditProfile.FirstNameLabel',\n name: 'first-name',\n maxLength: 70\n });\n this.lastNameInputField = new InputField({\n label: 'Login.Register.LastName.Placeholder',\n name: 'last-name',\n maxLength: 64\n });\n this.bioInputField = new InputField({\n label: 'EditProfile.BioLabel',\n name: 'bio',\n maxLength: bioMaxLength\n });\n\n inputWrapper.append(this.firstNameInputField.container, this.lastNameInputField.container, this.bioInputField.container);\n\n const caption = document.createElement('div');\n caption.classList.add('caption');\n i18n_({element: caption, key: 'Bio.Description'});\n\n inputFields.push(this.firstNameInputField, this.lastNameInputField, this.bioInputField);\n\n this.editPeer = new EditPeer({\n peerId: rootScope.myId,\n inputFields,\n listenerSetter: this.listenerSetter\n });\n\n this.content.append(this.editPeer.nextBtn);\n\n section.append(this.editPeer.avatarEdit.container, inputWrapper);\n }\n\n {\n const section = new SettingSection({\n name: 'EditAccount.Username',\n caption: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.usernameInputField = new UsernameInputField({\n label: 'EditProfile.Username.Label',\n name: 'username',\n plainText: true,\n listenerSetter: this.listenerSetter,\n onChange: () => {\n this.editPeer.handleChange();\n // this.setProfileUrl();\n\n const {error} = this.usernameInputField;\n const isPurchase = error?.type === 'USERNAME_PURCHASE_AVAILABLE';\n setUsername(isPurchase ? this.usernameInputField.value : undefined);\n },\n availableText: 'EditProfile.Username.Available',\n takenText: 'EditProfile.Username.Taken',\n invalidText: 'EditProfile.Username.Invalid'\n }, this.managers);\n\n inputWrapper.append(this.usernameInputField.container);\n\n const caption = section.caption;\n\n const {setUsername, element: p} = purchaseUsernameCaption();\n\n caption.append(\n p,\n i18n('UsernameHelp')\n // document.createElement('br'),\n // document.createElement('br')\n );\n\n // const profileUrlContainer = this.profileUrlContainer = document.createElement('div');\n // profileUrlContainer.classList.add('profile-url-container');\n // const profileUrlAnchor = this.profileUrlAnchor = anchorCopy();\n // profileUrlContainer.append(i18n('UsernameHelpLink', [profileUrlAnchor]));\n // caption.append(profileUrlContainer);\n\n inputFields.push(this.usernameInputField);\n section.content.append(inputWrapper);\n this.scrollable.append(section.container);\n }\n\n {\n const section = new UsernamesSection({\n peerId: rootScope.myId,\n peer: user,\n listenerSetter: this.listenerSetter,\n usernameInputField: this.usernameInputField,\n middleware: this.middlewareHelper.get()\n });\n\n this.scrollable.append(section.container);\n }\n\n attachClickEvent(this.editPeer.nextBtn, () => {\n this.editPeer.nextBtn.disabled = true;\n\n const promises: Promise[] = [];\n\n const profilePromise = this.managers.appProfileManager.updateProfile(\n this.firstNameInputField.value,\n this.lastNameInputField.value,\n this.bioInputField.value\n );\n promises.push(profilePromise.then(() => {\n this.close();\n }, (err) => {\n console.error('updateProfile error:', err);\n }));\n\n if(this.editPeer.uploadAvatar) {\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\n return this.managers.appProfileManager.uploadProfilePhoto(inputFile);\n }));\n }\n\n if(this.usernameInputField.isValidToChange()) {\n promises.push(this.managers.appUsersManager.updateUsername(this.usernameInputField.value));\n }\n\n Promise.race(promises).finally(() => {\n this.editPeer.nextBtn.removeAttribute('disabled');\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.firstNameInputField.setOriginalValue(user.first_name, true);\n this.lastNameInputField.setOriginalValue(user.last_name, true);\n this.bioInputField.setOriginalValue(userFull.about, true);\n this.usernameInputField.setOriginalValue(getPeerEditableUsername(user), true);\n\n // this.setProfileUrl();\n this.editPeer.handleChange();\n }\n\n // private setProfileUrl() {\n // if(this.usernameInputField.input.classList.contains('error') || !this.usernameInputField.value.length) {\n // this.profileUrlContainer.style.display = 'none';\n // } else {\n // this.profileUrlContainer.style.display = '';\n // this.profileUrlAnchor.replaceWith(this.profileUrlAnchor = anchorCopy({mePath: this.usernameInputField.value}));\n // }\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appImManager, {APP_TABS} from '../../lib/appManagers/appImManager';\nimport SidebarSlider from '../slider';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport AppSharedMediaTab from './tabs/sharedMedia';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport const RIGHT_COLUMN_ACTIVE_CLASSNAME = 'is-right-column-shown';\n\nexport class AppSidebarRight extends SidebarSlider {\n private isColumnProportionSet = false;\n private sharedMediaTab: AppSharedMediaTab;\n // public rect: DOMRect;\n\n constructor() {\n super({\n sidebarEl: document.getElementById('column-right') as HTMLElement,\n canHideFirst: true,\n navigationType: 'right'\n });\n }\n\n construct(managers: AppManagers) {\n this.managers = managers;\n\n mediaSizes.addEventListener('changeScreen', (from, to) => {\n if(to === ScreenSize.medium && from !== ScreenSize.mobile) {\n this.toggleSidebar(false);\n }\n });\n\n mediaSizes.addEventListener('resize', () => {\n this.setColumnProportion();\n });\n }\n\n public createSharedMediaTab() {\n const tab = this.createTab(AppSharedMediaTab, false, true);\n tab.slider = this;\n // this.tabsContainer.prepend(tab.container);\n return tab;\n }\n\n public replaceSharedMediaTab(tab?: AppSharedMediaTab) {\n const previousTab = this.sharedMediaTab;\n if(previousTab) {\n const idx = this.historyTabIds.indexOf(previousTab);\n\n if(this._selectTab.getFrom() === previousTab.container) {\n this._selectTab.setFrom(tab?.container);\n }\n\n if(tab) {\n if(idx !== -1) {\n this.historyTabIds[idx] = tab;\n }\n\n const wasActive = previousTab.container.classList.contains('active');\n if(wasActive) {\n tab.container.classList.add('active');\n }\n\n previousTab.container.replaceWith(tab.container);\n } else {\n if(idx !== -1) {\n this.historyTabIds.splice(idx, 1);\n }\n\n previousTab.container.remove();\n }\n } else {\n this.tabsContainer.prepend(tab.container);\n }\n\n this.sharedMediaTab = tab;\n }\n\n public onCloseTab(id: number, animate: boolean, isNavigation?: boolean) {\n if(!this.historyTabIds.length) {\n this.toggleSidebar(false, animate);\n }\n\n super.onCloseTab(id, animate, isNavigation);\n }\n\n private setColumnProportion() {\n const proportion = this.sidebarEl.scrollWidth / this.sidebarEl.previousElementSibling.scrollWidth;\n document.documentElement.style.setProperty('--right-column-proportion', '' + proportion);\n // this.rect = this.sidebarEl.getBoundingClientRect();\n }\n\n public toggleSidebar(enable?: boolean, animate?: boolean) {\n const active = document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n let willChange: boolean;\n if(enable !== undefined) {\n if(enable) {\n if(!active) {\n willChange = true;\n }\n } else if(active) {\n willChange = true;\n }\n } else {\n willChange = true;\n }\n\n if(!willChange) return Promise.resolve();\n\n if(!active && !this.historyTabIds.length) {\n this.sharedMediaTab.open();\n }\n\n if(!this.isColumnProportionSet) {\n this.setColumnProportion();\n this.isColumnProportionSet = true;\n }\n\n const animationPromise = appImManager.selectTab(active ? APP_TABS.CHAT : APP_TABS.PROFILE, animate);\n document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, enable);\n return animationPromise;\n\n /* return new Promise((resolve, reject) => {\n const hidden: {element: HTMLDivElement, height: number}[] = [];\n const observer = new IntersectionObserver((entries) => {\n for(const entry of entries) {\n const bubble = entry.target as HTMLDivElement;\n if(!entry.isIntersecting) {\n hidden.push({element: bubble, height: bubble.scrollHeight});\n }\n }\n\n for(const item of hidden) {\n item.element.style.minHeight = item.height + 'px';\n (item.element.firstElementChild as HTMLElement).style.display = 'none';\n item.element.style.width = '1px';\n }\n\n //console.log('hidden', hidden);\n observer.disconnect();\n\n set();\n\n setTimeout(() => {\n for(const item of hidden) {\n item.element.style.minHeight = '';\n item.element.style.width = '';\n (item.element.firstElementChild as HTMLElement).style.display = '';\n }\n\n resolve();\n }, 200);\n });\n\n const length = Object.keys(appImManager.bubbles).length;\n if(length) {\n for(const i in appImManager.bubbles) {\n observer.observe(appImManager.bubbles[i]);\n }\n } else {\n set();\n setTimeout(resolve, 200);\n }\n }); */\n }\n}\n\nconst appSidebarRight = new AppSidebarRight();\nMOUNT_CLASS_TO.appSidebarRight = appSidebarRight;\nexport default appSidebarRight;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider'\nimport InputField from '../../inputField';\nimport EditPeer from '../../editPeer';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport CheckboxField from '../../checkboxField';\nimport Button from '../../button';\nimport PeerTitle from '../../peerTitle';\nimport rootScope from '../../../lib/rootScope';\nimport PopupPeer from '../../popups/peer';\nimport {addCancelButton} from '../../popups';\nimport {i18n} from '../../../lib/langPack';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport formatUserPhone from '../../wrappers/formatUserPhone';\nimport SettingSection from '../../settingSection';\nimport wrapPeerTitle from '../../wrappers/peerTitle';\n\nexport default class AppEditContactTab extends SliderSuperTab {\n private nameInputField: InputField;\n private lastNameInputField: InputField;\n private editPeer: EditPeer;\n private sharePhoneCheckboxField: CheckboxField;\n public peerId: PeerId;\n\n public async init() {\n const {peerId} = this;\n const userId = peerId.toUserId();\n this.container.classList.add('edit-peer-container', 'edit-contact-container');\n const [isContact, privacy] = await Promise.all([\n this.managers.appUsersManager.isContact(userId),\n this.managers.appPrivacyManager.getPrivacy('inputPrivacyKeyPhoneNumber')\n ]);\n const isNew = !isContact;\n this.setTitle(isNew ? 'AddContactTitle' : 'Edit');\n\n {\n const section = new SettingSection({noDelimiter: true});\n const inputFields: InputField[] = [];\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.nameInputField = new InputField({\n label: 'FirstName',\n name: 'contact-name',\n maxLength: 70,\n required: true\n });\n this.lastNameInputField = new InputField({\n label: 'LastName',\n name: 'contact-lastname',\n maxLength: 70\n });\n\n if(userId) {\n const user = await this.managers.appUsersManager.getUser(userId);\n\n if(isNew) {\n this.nameInputField.setDraftValue(user.first_name);\n this.lastNameInputField.setDraftValue(user.last_name);\n } else {\n this.nameInputField.setOriginalValue(user.first_name);\n this.lastNameInputField.setOriginalValue(user.last_name);\n }\n }\n\n inputWrapper.append(this.nameInputField.container, this.lastNameInputField.container);\n inputFields.push(this.nameInputField, this.lastNameInputField);\n\n this.editPeer = new EditPeer({\n peerId: peerId,\n inputFields,\n listenerSetter: this.listenerSetter,\n doNotEditAvatar: true\n });\n this.content.append(this.editPeer.nextBtn);\n\n if(peerId) {\n const div = document.createElement('div');\n div.classList.add('avatar-edit');\n div.append(this.editPeer.avatarElem);\n\n const notificationsCheckboxField = new CheckboxField({\n text: 'Notifications'\n });\n\n notificationsCheckboxField.input.addEventListener('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n this.managers.appMessagesManager.togglePeerMute({peerId});\n });\n\n this.listenerSetter.add(rootScope)('notify_settings', async(update) => {\n if(update.peer._ !== 'notifyPeer') return;\n const peerId = getPeerId(update.peer.peer);\n if(peerId === peerId) {\n const enabled = !(await this.managers.appNotificationsManager.isMuted(update.notify_settings));\n if(enabled !== notificationsCheckboxField.checked) {\n notificationsCheckboxField.checked = enabled;\n }\n }\n });\n\n const profileNameDiv = document.createElement('div');\n profileNameDiv.classList.add('profile-name');\n profileNameDiv.append(new PeerTitle({\n peerId: peerId\n }).element);\n // profileNameDiv.innerHTML = 'Karen Stanford';\n\n const profileSubtitleDiv = document.createElement('div');\n profileSubtitleDiv.classList.add('profile-subtitle');\n profileSubtitleDiv.append(i18n('EditContact.OriginalName'));\n\n section.content.append(div, profileNameDiv, profileSubtitleDiv, inputWrapper);\n\n if(!isNew) {\n const notificationsRow = new Row({\n checkboxField: notificationsCheckboxField,\n withCheckboxSubtitle: true,\n listenerSetter: this.listenerSetter\n });\n\n const enabled = !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId, respectType: false}));\n notificationsCheckboxField.checked = enabled;\n\n section.content.append(notificationsRow.container);\n } else {\n const user = await this.managers.appUsersManager.getUser(userId);\n\n const phoneRow = new Row({\n icon: 'phone',\n titleLangKey: user.phone ? undefined : 'MobileHidden',\n title: user.phone ? formatUserPhone(user.phone) : undefined,\n subtitleLangKey: user.phone ? 'Phone' : 'MobileHiddenExceptionInfo',\n subtitleLangArgs: user.phone ? undefined : [new PeerTitle({peerId: peerId}).element]\n });\n\n section.content.append(phoneRow.container);\n }\n } else {\n section.content.append(inputWrapper);\n }\n\n this.scrollable.append(section.container);\n }\n\n if(!isNew) {\n const section = new SettingSection();\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'PeerInfo.DeleteContact'});\n\n attachClickEvent(btnDelete, () => {\n new PopupPeer('popup-delete-contact', {\n peerId: peerId,\n titleLangKey: 'DeleteContact',\n descriptionLangKey: 'AreYouSureDeleteContact',\n buttons: addCancelButton([{\n langKey: 'Delete',\n callback: () => {\n const toggle = toggleDisability([btnDelete], true);\n\n this.managers.appUsersManager.deleteContacts([userId]).then(() => {\n this.close();\n }, () => {\n toggle();\n });\n },\n isDanger: true\n }])\n }).show();\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n } else if(\n privacy.some((privacyRule) => privacyRule._ === 'privacyValueDisallowAll') &&\n !privacy.some((privacyRule) => privacyRule._ === 'privacyValueAllowUsers' && privacyRule.users.includes(userId))\n ) {\n const section = new SettingSection({\n caption: 'NewContact.Exception.ShareMyPhoneNumber.Desc',\n captionArgs: [await wrapPeerTitle({peerId: this.peerId})]\n });\n const checkboxField = this.sharePhoneCheckboxField = new CheckboxField({\n text: 'NewContact.Exception.ShareMyPhoneNumber',\n checked: true\n });\n const row = CreateRowFromCheckboxField(checkboxField);\n\n section.content.append(row.container);\n\n this.scrollable.append(section.container);\n }\n\n attachClickEvent(this.editPeer.nextBtn, async() => {\n this.editPeer.nextBtn.disabled = true;\n\n this.managers.appUsersManager.addContact(\n userId,\n this.nameInputField.value,\n this.lastNameInputField.value,\n (await this.managers.appUsersManager.getUser(userId)).phone,\n this.sharePhoneCheckboxField?.checked\n ).finally(() => {\n this.editPeer.nextBtn.removeAttribute('disabled');\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport {makeMediaSize} from '../../../helpers/mediaSize';\nimport copy from '../../../helpers/object/copy';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {ForumTopic} from '../../../layer';\nimport appImManager from '../../../lib/appManagers/appImManager';\nimport {GENERAL_TOPIC_ID, TOPIC_COLORS} from '../../../lib/mtproto/mtproto_config';\nimport getAbbreviation from '../../../lib/richTextProcessor/getAbbreviation';\nimport ButtonIcon from '../../buttonIcon';\nimport CheckboxField from '../../checkboxField';\nimport EmojiTab from '../../emoticonsDropdown/tabs/emoji';\nimport InputField from '../../inputField';\nimport Row from '../../row';\nimport SettingSection from '../../settingSection';\nimport appSidebarLeft from '../../sidebarLeft';\nimport SliderSuperTab from '../../sliderTab';\nimport {wrapTopicIcon} from '../../wrappers/messageActionTextNewUnsafe';\n\nconst size = 64;\nconst mediaSize = makeMediaSize(size, size);\n\nexport default class AppEditTopicTab extends SliderSuperTab {\n private iconDiv: HTMLElement;\n private colorIndex: number;\n private nameInputField: InputField;\n private topic: Parameters[0]['topic'];\n private emojiElement: HTMLElement;\n private confirmBtn: HTMLButtonElement;\n private originalTopic: ForumTopic.forumTopic;\n\n public async init(peerId: PeerId, threadId?: number) {\n this.colorIndex = 0;\n const isNew = !threadId;\n const isGeneral = threadId === GENERAL_TOPIC_ID;\n this.container.classList.add('edit-topic-container');\n this.setTitle(isNew ? 'NewTopic' : 'ForumTopic.Title.Edit');\n const chatId = peerId.toChatId();\n\n if(threadId) {\n this.topic = this.originalTopic = copy(await this.managers.dialogsStorage.getForumTopic(peerId, threadId));\n }\n\n {\n const section = new SettingSection({\n name: isGeneral ? 'CreateGeneralTopicTitle' : 'CreateTopicTitle'\n });\n\n const iconDiv = this.iconDiv = document.createElement('div');\n iconDiv.classList.add('edit-topic-icon-container');\n\n !threadId && attachClickEvent(iconDiv, () => {\n if(this.topic.icon_emoji_id) {\n return;\n }\n\n this.colorIndex = (this.colorIndex + 1) % TOPIC_COLORS.length;\n this.setIcon();\n }, {listenerSetter: this.listenerSetter});\n\n if(threadId) {\n iconDiv.classList.add('disable-hover');\n }\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const nameInputField = this.nameInputField = new InputField({\n label: 'ForumTopic.Name.Placeholder',\n withLinebreaks: false,\n name: 'topic-name',\n maxLength: 70,\n required: true\n });\n\n if(this.topic) {\n nameInputField.setOriginalValue(this.topic.title, true);\n }\n\n const confirmBtn = this.confirmBtn = ButtonIcon('check btn-confirm blue hide', {noRipple: true});\n this.header.append(confirmBtn);\n\n attachClickEvent(confirmBtn, () => {\n const toggle = toggleDisability([confirmBtn], true);\n if(threadId) {\n this.managers.appChatsManager.editForumTopic({\n chatId,\n topicId: threadId,\n title: nameInputField.value,\n iconEmojiId: this.topic.icon_emoji_id || 0\n }).then(() => {\n this.close();\n }).catch((err) => {\n console.error('edit topic error', err);\n toggle();\n });\n } else {\n this.managers.appChatsManager.createForumTopic({\n chatId,\n iconColor: TOPIC_COLORS[this.colorIndex],\n iconEmojiId: this.topic.icon_emoji_id,\n title: nameInputField.value\n }).then((threadId) => {\n this.close();\n appImManager.setInnerPeer({\n peerId,\n threadId\n });\n }).catch((err) => {\n console.error('create topic error', err);\n toggle();\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(nameInputField.input)('input', () => {\n this.validate();\n this.setIcon(this.topic?.icon_emoji_id);\n });\n\n inputWrapper.append(nameInputField.container);\n\n section.content.append(iconDiv, inputWrapper);\n\n this.scrollable.append(section.container);\n }\n\n const promises: Promise[] = [];\n\n if(!isGeneral) {\n const section = new SettingSection({});\n section.container.classList.add('edit-topic-emoticons-container');\n const emojiTab = new EmojiTab({\n managers: this.managers,\n isStandalone: true,\n noRegularEmoji: true,\n stickerSetId: 'inputStickerSetEmojiDefaultTopicIcons',\n onClick: (emoji) => {\n emojiTab.setActive(!emoji.docId ? {emoji: undefined, docId: undefined} : emoji);\n this.setIcon(emoji.docId);\n }\n });\n emojiTab.getContainerSize = () => ({\n width: appSidebarLeft.rect.width,\n height: 400\n });\n\n this.middlewareHelper.onDestroy(() => {\n emojiTab.destroy();\n });\n\n emojiTab.container.classList.remove('tabs-tab');\n\n this.emojiElement = document.createElement('span');\n this.emojiElement.classList.add('super-emoji-topic-icon');\n\n const promise = emojiTab.init().then(async() => {\n const category = emojiTab.getCustomCategory();\n\n const iconEmojiId = this.topic?.icon_emoji_id;\n emojiTab.addEmojiToCategory({\n category,\n element: this.emojiElement,\n batch: false,\n prepend: true,\n active: !iconEmojiId\n });\n\n if(iconEmojiId) {\n emojiTab.setActive({docId: iconEmojiId, emoji: ''});\n }\n });\n\n promises.push(promise);\n\n section.content.replaceWith(emojiTab.container);\n this.scrollable.append(section.container);\n } else {\n const section = new SettingSection({caption: 'EditTopicHideInfo'});\n\n const checkboxField = new CheckboxField({\n // toggle: true,\n checked: !(this.topic as ForumTopic.forumTopic).pFlags.hidden,\n text: 'EditTopicHide'\n });\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n const promise = this.managers.appChatsManager.editForumTopic({\n chatId,\n topicId: threadId,\n hidden: !checkboxField.checked\n });\n\n row.disableWithPromise(promise);\n });\n\n const row = new Row({\n checkboxField\n });\n\n section.content.append(row.container);\n\n this.scrollable.append(section.container);\n }\n\n return Promise.all(promises).then(() => {\n return this.s();\n });\n }\n\n private validate() {\n let isChanged = this.nameInputField.isValidToChange();\n if(!isChanged && this.originalTopic) {\n isChanged = this.topic.icon_emoji_id !== this.originalTopic.icon_emoji_id;\n }\n\n this.confirmBtn.classList.toggle('hide', !isChanged);\n }\n\n private s() {\n if(this.topic?.icon_color) {\n this.colorIndex = TOPIC_COLORS.indexOf(this.topic.icon_color);\n }\n\n return this.setIcon(this.topic?.icon_emoji_id, undefined, true);\n }\n\n private async setIcon(iconEmojiId?: Long, appendTo = this.iconDiv, force?: boolean) {\n const title = this.nameInputField.value;\n\n const isMainIcon = appendTo === this.iconDiv;\n\n if(isMainIcon) {\n const newTopic: AppEditTopicTab['topic'] = {\n id: this.topic?.id,\n icon_color: TOPIC_COLORS[this.colorIndex],\n title: getAbbreviation(title, true).text || 'A',\n icon_emoji_id: iconEmojiId\n };\n\n const oldTopic = this.topic;\n this.topic = newTopic;\n\n if(\n force ||\n !oldTopic ||\n oldTopic.icon_color !== newTopic.icon_color ||\n oldTopic.title !== newTopic.title\n ) {\n this.setIcon(undefined, this.emojiElement);\n }\n\n if(deepEqual(oldTopic, newTopic) && !force) {\n return;\n }\n\n this.validate();\n }\n\n const el = await wrapTopicIcon({\n topic: isMainIcon ? this.topic : {...this.topic, icon_emoji_id: undefined},\n customEmojiSize: mediaSize,\n middleware: this.middlewareHelper.get()\n });\n\n const span = document.createElement('div');\n span.classList.add('edit-topic-icon');\n span.append(el);\n\n const oldEl = appendTo.lastElementChild as HTMLElement;\n appendTo.append(span);\n\n const applyFadeAnimation = (el: HTMLElement, fadeIn: boolean) => {\n const frames: Keyframe[] = [\n {opacity: '0', transform: 'scale(0.8)'},\n {opacity: '1', transform: 'scale(1)'}\n ];\n\n const animation = el.animate(frames, {\n duration: 200,\n iterations: 1,\n easing: 'ease-in-out',\n fill: 'forwards',\n direction: fadeIn ? 'normal' : 'reverse'\n });\n\n return new Promise((resolve) => {\n animation.addEventListener('finish', () => {\n resolve();\n }, {once: true});\n });\n };\n\n if(oldEl) {\n applyFadeAnimation(oldEl, false).then(() => oldEl.remove());\n }\n\n applyFadeAnimation(span, true);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {copyTextToClipboard} from '../../../helpers/clipboard';\nimport {randomLong} from '../../../helpers/random';\nimport {Chat, ChatFull, ExportedChatInvite} from '../../../layer';\nimport Button from '../../button';\nimport {setButtonLoader} from '../../putPreloader';\nimport RadioField from '../../radioField';\nimport Row, {RadioFormFromRows} from '../../row';\nimport {toast} from '../../toast';\nimport {UsernameInputField} from '../../usernameInputField';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport I18n, {i18n} from '../../../lib/langPack';\nimport PopupPeer from '../../popups/peer';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport CheckboxField from '../../checkboxField';\nimport rootScope from '../../../lib/rootScope';\nimport SettingSection from '../../settingSection';\nimport UsernamesSection from '../../usernamesSection';\nimport getPeerEditableUsername from '../../../lib/appManagers/utils/peers/getPeerEditableUsername';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport {purchaseUsernameCaption} from '../../sidebarLeft/tabs/editProfile';\nimport confirmationPopup from '../../confirmationPopup';\n\nexport default class AppChatTypeTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n public chatFull: ChatFull;\n\n public async init() {\n this.container.classList.add('edit-peer-container', 'group-type-container');\n\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\n\n this.setTitle(isBroadcast ? 'ChannelType' : 'GroupType');\n\n const section = new SettingSection({\n name: isBroadcast ? 'ChannelType' : 'GroupType'\n });\n\n const random = randomLong();\n const privateRow = new Row({\n radioField: new RadioField({\n langKey: isBroadcast ? 'ChannelPrivate' : 'MegaPrivate',\n name: random,\n value: 'private'\n }),\n subtitleLangKey: isBroadcast ? 'ChannelPrivateInfo' : 'MegaPrivateInfo'\n });\n const publicRow = new Row({\n radioField: new RadioField({\n langKey: isBroadcast ? 'ChannelPublic' : 'MegaPublic',\n name: random,\n value: 'public'\n }),\n subtitleLangKey: isBroadcast ? 'ChannelPublicInfo' : 'MegaPublicInfo'\n });\n const form = RadioFormFromRows([privateRow, publicRow], (value) => {\n const a: HTMLElement[][] = [[privateSection.container], [publicContainer]];\n if(value === 'public') a.reverse();\n\n a[0].forEach((container) => container.classList.remove('hide'));\n a[1].forEach((container) => container.classList.add('hide'));\n\n onChange();\n });\n\n let chat: Chat = await this.managers.appChatsManager.getChat(this.chatId);\n\n const chatUpdateListeners: {[type in 'basic']: (() => void)[]} = {basic: []};\n const addChatUpdateListener = (callback: () => void, type: 'basic' = 'basic') => {\n chatUpdateListeners[type].push(callback);\n };\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.chatId === chatId) {\n chat = await this.managers.appChatsManager.getChat(this.chatId) as typeof chat;\n chatUpdateListeners['basic'].forEach((callback) => callback());\n }\n });\n\n section.content.append(form);\n\n const privateSection = new SettingSection({});\n\n // let revoked = false;\n const linkRow = new Row({\n title: (this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link,\n subtitleLangKey: isBroadcast ? 'ChannelPrivateLinkHelp' : 'MegaPrivateLinkHelp',\n clickable: () => {\n copyTextToClipboard((this.chatFull.exported_invite as ExportedChatInvite.chatInviteExported).link);\n toast(I18n.format('LinkCopied', true));\n },\n listenerSetter: this.listenerSetter\n });\n\n const btnRevoke = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'RevokeLink'});\n\n attachClickEvent(btnRevoke, () => {\n new PopupPeer('revoke-link', {\n buttons: [{\n langKey: 'RevokeButton',\n callback: () => {\n const toggle = toggleDisability([btnRevoke], true);\n\n this.managers.appProfileManager.getChatInviteLink(this.chatId, true).then((link) => {\n toggle();\n linkRow.title.innerHTML = link;\n // revoked = true;\n // onChange();\n });\n }\n }],\n titleLangKey: 'RevokeLink',\n descriptionLangKey: 'RevokeAlert'\n }).show();\n }, {listenerSetter: this.listenerSetter});\n\n privateSection.content.append(linkRow.container, btnRevoke);\n\n const publicSection = new SettingSection({\n caption: true,\n noDelimiter: true\n });\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n const placeholder = 't.me/';\n\n const onChange = () => {\n const changed = (privateRow.radioField.checked && (originalValue !== placeholder/* || revoked */)) ||\n (linkInputField.isValidToChange() && linkInputField.input.classList.contains('valid'));\n applyBtn.classList.toggle('is-visible', changed);\n\n const {error} = linkInputField;\n const isPurchase = error?.type === 'USERNAME_PURCHASE_AVAILABLE';\n setUsername(isPurchase ? linkInputField.getValue() : undefined);\n };\n\n const linkInputField = new UsernameInputField({\n label: 'SetUrlPlaceholder',\n name: 'group-public-link',\n plainText: true,\n listenerSetter: this.listenerSetter,\n availableText: 'Link.Available',\n invalidText: 'Link.Invalid',\n takenText: 'Link.Taken',\n onChange: onChange,\n peerId: this.chatId.toPeerId(true),\n head: placeholder\n }, this.managers);\n\n const {setUsername, element: p} = purchaseUsernameCaption();\n\n publicSection.caption.append(\n p,\n i18n(isBroadcast ? 'Channel.UsernameAboutChannel' : 'Channel.UsernameAboutGroup')\n );\n\n const usernamesSection = new UsernamesSection({\n peerId: this.chatId.toPeerId(true),\n peer: chat as Chat.channel,\n listenerSetter: this.listenerSetter,\n usernameInputField: linkInputField,\n middleware: this.middlewareHelper.get()\n });\n\n const publicContainer = document.createElement('div');\n publicContainer.append(publicSection.container, usernamesSection.container);\n\n const originalValue = placeholder + (getPeerEditableUsername(chat as Chat.channel) || '');\n\n inputWrapper.append(linkInputField.container)\n publicSection.content.append(inputWrapper);\n\n const applyBtn = ButtonCorner({icon: 'check', className: 'is-visible'});\n this.content.append(applyBtn);\n\n attachClickEvent(applyBtn, async() => {\n const username = publicRow.radioField.checked ? linkInputField.getValue() : '';\n if(!username) {\n const chat = await this.managers.appChatsManager.getChat(this.chatId);\n const wasUsername = getPeerEditableUsername(chat as Chat.channel);\n if(wasUsername) {\n await confirmationPopup({\n descriptionLangKey: isBroadcast ? 'ChannelVisibility.Confirm.MakePrivate.Channel' : 'ChannelVisibility.Confirm.MakePrivate.Group',\n descriptionLangArgs: [wasUsername],\n button: {\n langKey: 'OK'\n }\n });\n }\n }\n\n /* const unsetLoader = */setButtonLoader(applyBtn);\n this.managers.appChatsManager.migrateChat(this.chatId).then((channelId) => {\n if(!username) {\n return this.managers.appChatsManager.makeChannelPrivate(channelId);\n } else {\n return this.managers.appChatsManager.updateUsername(channelId, username);\n }\n }).then(() => {\n // unsetLoader();\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n\n (originalValue !== placeholder || getPeerActiveUsernames(chat as Chat.channel).length ? publicRow : privateRow).radioField.checked = true;\n linkInputField.setOriginalValue(originalValue, true);\n\n this.scrollable.append(section.container, privateSection.container, publicContainer);\n\n {\n const section = new SettingSection({\n name: 'SavingContentTitle',\n caption: isBroadcast ? 'RestrictSavingContentInfoChannel' : 'RestrictSavingContentInfoGroup'\n });\n\n const checkboxField = new CheckboxField({\n text: 'RestrictSavingContent',\n withRipple: true\n });\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n const toggle = checkboxField.toggleDisability(true);\n this.managers.appChatsManager.toggleNoForwards(this.chatId, checkboxField.checked).then(() => {\n toggle();\n });\n });\n\n const onChatUpdate = () => {\n checkboxField.setValueSilently(!!(chat as Chat.channel).pFlags.noforwards);\n };\n\n addChatUpdateListener(onChatUpdate);\n\n onChatUpdate();\n\n section.content.append(checkboxField.label);\n\n this.scrollable.append(section.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport deepEqual from '../../../helpers/object/deepEqual';\nimport {ChannelParticipant} from '../../../layer';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport Button from '../../button';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport getUserStatusString from '../../wrappers/getUserStatusString';\nimport {ChatPermissions} from './groupPermissions';\n\nexport default class AppUserPermissionsTab extends SliderSuperTabEventable {\n public participant: ChannelParticipant;\n public chatId: ChatId;\n public userId: UserId;\n\n public async init() {\n this.container.classList.add('edit-peer-container', 'user-permissions-container');\n this.setTitle('UserRestrictions');\n\n let destroyListener: () => void;\n\n {\n const section = new SettingSection({\n name: 'UserRestrictionsCanDo'\n });\n\n const div = document.createElement('div');\n div.classList.add('chatlist-container');\n section.content.insertBefore(div, section.title);\n\n const list = appDialogsManager.createChatList({new: true});\n div.append(list);\n\n const {dom} = appDialogsManager.addDialogNew({\n peerId: this.userId.toPeerId(false),\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger'\n });\n\n dom.lastMessageSpan.append(getUserStatusString(await this.managers.appUsersManager.getUser(this.userId)));\n\n const p = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content,\n participant: this.participant._ === 'channelParticipantBanned' ? this.participant : undefined\n }, this.managers);\n\n destroyListener = () => {\n // appChatsManager.editChatDefaultBannedRights(this.chatId, p.takeOut());\n const rights = p.takeOut();\n if(this.participant._ === 'channelParticipantBanned' && deepEqual(this.participant.banned_rights.pFlags, rights.pFlags)) {\n return;\n }\n\n this.managers.appChatsManager.editBanned(this.chatId, this.participant, rights);\n };\n\n this.eventListener.addEventListener('destroy', destroyListener, {once: true});\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({});\n\n if(this.participant._ === 'channelParticipantBanned') {\n const btnDeleteException = Button('btn-primary btn-transparent danger', {icon: 'delete', text: 'GroupPermission.Delete'});\n\n attachClickEvent(btnDeleteException, () => {\n const toggle = toggleDisability([btnDeleteException], true);\n this.managers.appChatsManager.clearChannelParticipantBannedRights(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDeleteException);\n }\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'deleteuser', text: 'UserRestrictionsBlock'});\n\n attachClickEvent(btnDelete, () => {\n const toggle = toggleDisability([btnDelete], true);\n this.managers.appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n });\n /* new PopupPeer('popup-group-kick-user', {\n peerId: -this.chatId,\n title: 'Ban User?',\n description: `Are you sure you want to ban ${appPeersManager.getPeerTitle(this.userId)}`,\n buttons: addCancelButton([{\n text: 'BAN',\n callback: () => {\n const toggle = toggleDisability([btnDelete], true);\n\n appChatsManager.kickFromChannel(this.chatId, this.participant).then(() => {\n this.eventListener.removeEventListener('destroy', destroyListener);\n this.close();\n }, () => {\n toggle();\n });\n },\n isDanger: true\n }])\n }).show(); */\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport findUpTag from '../../../helpers/dom/findUpTag';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport ListenerSetter from '../../../helpers/listenerSetter';\nimport ScrollableLoader from '../../../helpers/scrollableLoader';\nimport {ChannelParticipant, Chat, ChatBannedRights, Update} from '../../../layer';\nimport {ChatRights} from '../../../lib/appManagers/appChatsManager';\nimport appDialogsManager, {DialogDom, DIALOG_LIST_ELEMENT_TAG} from '../../../lib/appManagers/appDialogsManager';\nimport {AppManagers} from '../../../lib/appManagers/managers';\nimport combineParticipantBannedRights from '../../../lib/appManagers/utils/chats/combineParticipantBannedRights';\nimport hasRights from '../../../lib/appManagers/utils/chats/hasRights';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport getPeerId from '../../../lib/appManagers/utils/peers/getPeerId';\nimport I18n, {i18n, join, LangPackKey} from '../../../lib/langPack';\nimport rootScope from '../../../lib/rootScope';\nimport CheckboxField from '../../checkboxField';\nimport PopupPickUser from '../../popups/pickUser';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport {toast} from '../../toast';\nimport AppUserPermissionsTab from './userPermissions';\n\nexport class ChatPermissions {\n public v: Array<{\n flags: ChatRights[],\n text: LangPackKey,\n exceptionText: LangPackKey,\n checkboxField?: CheckboxField,\n }>;\n private toggleWith: Partial<{[chatRight in ChatRights]: ChatRights[]}>;\n\n constructor(private options: {\n chatId: ChatId,\n listenerSetter: ListenerSetter,\n appendTo: HTMLElement,\n participant?: ChannelParticipant.channelParticipantBanned\n }, private managers: AppManagers) {\n this.construct();\n }\n\n public async construct() {\n this.v = [\n {flags: ['send_messages'], text: 'UserRestrictionsSend', exceptionText: 'UserRestrictionsNoSend'},\n {flags: ['send_media'], text: 'UserRestrictionsSendMedia', exceptionText: 'UserRestrictionsNoSendMedia'},\n {flags: ['send_stickers', 'send_gifs'], text: 'UserRestrictionsSendStickers', exceptionText: 'UserRestrictionsNoSendStickers'},\n {flags: ['send_polls'], text: 'UserRestrictionsSendPolls', exceptionText: 'UserRestrictionsNoSendPolls'},\n {flags: ['embed_links'], text: 'UserRestrictionsEmbedLinks', exceptionText: 'UserRestrictionsNoEmbedLinks'},\n {flags: ['invite_users'], text: 'UserRestrictionsInviteUsers', exceptionText: 'UserRestrictionsNoInviteUsers'},\n {flags: ['pin_messages'], text: 'UserRestrictionsPinMessages', exceptionText: 'UserRestrictionsNoPinMessages'},\n {flags: ['change_info'], text: 'UserRestrictionsChangeInfo', exceptionText: 'UserRestrictionsNoChangeInfo'}\n ];\n\n this.toggleWith = {\n 'send_messages': ['send_media', 'send_stickers', 'send_polls', 'embed_links']\n };\n\n const options = this.options;\n const chat = await this.managers.appChatsManager.getChat(options.chatId) as Chat.chat | Chat.channel;\n const defaultBannedRights = chat.default_banned_rights;\n const rights = options.participant ? combineParticipantBannedRights(chat as Chat.channel, options.participant.banned_rights) : defaultBannedRights;\n\n const restrictionText: LangPackKey = options.participant ? 'UserRestrictionsDisabled' : 'EditCantEditPermissionsPublic';\n for(const info of this.v) {\n const mainFlag = info.flags[0];\n const row = CreateRowFromCheckboxField(\n info.checkboxField = new CheckboxField({\n text: info.text,\n checked: hasRights(chat, mainFlag, rights),\n restriction: true,\n listenerSetter: options.listenerSetter\n })\n );\n\n if((\n options.participant &&\n defaultBannedRights.pFlags[mainFlag as keyof typeof defaultBannedRights['pFlags']]\n ) || (\n getPeerActiveUsernames(chat as Chat.channel)[0] &&\n (\n info.flags.includes('pin_messages') ||\n info.flags.includes('change_info')\n )\n )\n ) {\n info.checkboxField.input.disabled = true;\n\n /* options.listenerSetter.add(info.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n cancelEvent(e);\n toast('This option is disabled for all members in Group Permissions.');\n info.checkboxField.checked = false;\n }); */\n\n attachClickEvent(info.checkboxField.label, (e) => {\n toast(I18n.format(restrictionText, true));\n }, {listenerSetter: options.listenerSetter});\n }\n\n if(this.toggleWith[mainFlag]) {\n options.listenerSetter.add(info.checkboxField.input)('change', () => {\n if(!info.checkboxField.checked) {\n const other = this.v.filter((i) => this.toggleWith[mainFlag].includes(i.flags[0]));\n other.forEach((info) => {\n info.checkboxField.checked = false;\n });\n }\n });\n }\n\n options.appendTo.append(row.container);\n }\n }\n\n public takeOut() {\n const rights: ChatBannedRights = {\n _: 'chatBannedRights',\n until_date: 0x7FFFFFFF,\n pFlags: {}\n };\n\n for(const info of this.v) {\n const banned = !info.checkboxField.checked;\n if(banned) {\n info.flags.forEach((flag) => {\n // @ts-ignore\n rights.pFlags[flag] = true;\n });\n }\n }\n\n return rights;\n }\n}\n\nexport default class AppGroupPermissionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n public async init() {\n this.container.classList.add('edit-peer-container', 'group-permissions-container');\n this.setTitle('ChannelPermissions');\n\n let chatPermissions: ChatPermissions;\n {\n const section = new SettingSection({\n name: 'ChannelPermissionsHeader'\n });\n\n chatPermissions = new ChatPermissions({\n chatId: this.chatId,\n listenerSetter: this.listenerSetter,\n appendTo: section.content\n }, this.managers);\n\n this.eventListener.addEventListener('destroy', () => {\n this.managers.appChatsManager.editChatDefaultBannedRights(this.chatId, chatPermissions.takeOut());\n }, {once: true});\n\n this.scrollable.append(section.container);\n }\n\n {\n const section = new SettingSection({\n name: 'PrivacyExceptions'\n });\n\n const addExceptionRow = new Row({\n titleLangKey: 'ChannelAddException',\n subtitleLangKey: 'Loading',\n icon: 'adduser',\n clickable: () => {\n new PopupPickUser({\n peerTypes: ['channelParticipants'],\n onSelect: (peerId) => {\n setTimeout(() => {\n openPermissions(peerId);\n }, 0);\n },\n placeholder: 'ExceptionModal.Search.Placeholder',\n peerId: -this.chatId\n });\n },\n listenerSetter: this.listenerSetter\n });\n\n const openPermissions = async(peerId: PeerId) => {\n let participant: AppUserPermissionsTab['participant'];\n try {\n participant = await this.managers.appProfileManager.getChannelParticipant(this.chatId, peerId) as any;\n } catch(err) {\n toast('User is no longer participant');\n return;\n }\n\n const tab = this.slider.createTab(AppUserPermissionsTab);\n tab.participant = participant;\n tab.chatId = this.chatId;\n tab.userId = peerId;\n tab.open();\n };\n\n section.content.append(addExceptionRow.container);\n\n /* const removedUsersRow = new Row({\n titleLangKey: 'ChannelBlockedUsers',\n subtitleLangKey: 'NoBlockedUsers',\n icon: 'deleteuser',\n clickable: true\n });\n\n section.content.append(removedUsersRow.container); */\n\n const c = section.generateContentElement();\n c.classList.add('chatlist-container');\n\n const list = appDialogsManager.createChatList({new: true});\n c.append(list);\n\n attachClickEvent(list, (e) => {\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(!target) return;\n\n const peerId = target.dataset.peerId.toPeerId();\n openPermissions(peerId);\n }, {listenerSetter: this.listenerSetter});\n\n const setSubtitle = async(dom: DialogDom, participant: ChannelParticipant.channelParticipantBanned) => {\n const bannedRights = participant.banned_rights;// appChatsManager.combineParticipantBannedRights(this.chatId, participant.banned_rights);\n const defaultBannedRights = ((await this.managers.appChatsManager.getChat(this.chatId)) as Chat.channel).default_banned_rights;\n // const combinedRights = appChatsManager.combineParticipantBannedRights(this.chatId, bannedRights);\n\n const cantWhat: LangPackKey[] = []/* , canWhat: LangPackKey[] = [] */;\n chatPermissions.v.forEach((info) => {\n const mainFlag = info.flags[0];\n // @ts-ignore\n if(bannedRights.pFlags[mainFlag] && !defaultBannedRights.pFlags[mainFlag]) {\n cantWhat.push(info.exceptionText);\n // @ts-ignore\n }/* else if(!combinedRights.pFlags[mainFlag]) {\n canWhat.push(info.exceptionText);\n } */\n });\n\n const el = dom.lastMessageSpan as HTMLElement;\n\n if(cantWhat.length) {\n el.replaceChildren(...join(cantWhat.map((t) => i18n(t)), false));\n }/* else if(canWhat.length) {\n str = 'Can ' + canWhat.join(canWhat.length === 2 ? ' and ' : ', ');\n } */\n\n el.classList.toggle('hide', !cantWhat.length);\n };\n\n const add = (participant: ChannelParticipant.channelParticipantBanned, append: boolean) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: getPeerId(participant.peer),\n container: list,\n rippleEnabled: true,\n avatarSize: 'abitbigger',\n append\n });\n\n setSubtitle(dom, participant);\n\n // dom.titleSpan.innerHTML = 'Chinaza Akachi';\n // dom.lastMessageSpan.innerHTML = 'Can Add Users and Pin Messages';\n };\n\n // this.listenerSetter.add(rootScope)('updateChannelParticipant', (update: Update.updateChannelParticipant) => {\n // const needAdd = update.new_participant?._ === 'channelParticipantBanned' && !update.new_participant.banned_rights.pFlags.view_messages;\n // const li = list.querySelector(`[data-peer-id=\"${update.user_id}\"]`);\n // if(needAdd) {\n // if(!li) {\n // add(update.new_participant as ChannelParticipant.channelParticipantBanned, false);\n // } else {\n // setSubtitle(li, update.new_participant as ChannelParticipant.channelParticipantBanned);\n // }\n\n // if(update.prev_participant?._ !== 'channelParticipantBanned') {\n // ++exceptionsCount;\n // }\n // } else {\n // if(li) {\n // li.remove();\n // }\n\n // if(update.prev_participant?._ === 'channelParticipantBanned') {\n // --exceptionsCount;\n // }\n // }\n\n // setLength();\n // });\n\n const setLength = () => {\n replaceContent(addExceptionRow.subtitle, i18n(exceptionsCount ? 'Permissions.ExceptionsCount' : 'Permissions.NoExceptions', [exceptionsCount]));\n };\n\n let exceptionsCount = 0;\n let loader: ScrollableLoader;\n const setLoader = () => {\n const LOAD_COUNT = 50;\n loader = new ScrollableLoader({\n scrollable: this.scrollable,\n getPromise: () => {\n return this.managers.appProfileManager.getChannelParticipants(this.chatId, {_: 'channelParticipantsBanned', q: ''}, LOAD_COUNT, list.childElementCount).then((res) => {\n for(const participant of res.participants) {\n add(participant as ChannelParticipant.channelParticipantBanned, true);\n }\n\n exceptionsCount = res.count;\n setLength();\n\n return res.participants.length < LOAD_COUNT || res.count === list.childElementCount;\n });\n }\n });\n\n return loader.load();\n };\n\n this.scrollable.append(section.container);\n\n if(await this.managers.appChatsManager.isChannel(this.chatId)) {\n await setLoader();\n } else {\n setLength();\n\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.chatId === migrateFrom) {\n this.chatId = migrateTo;\n setLoader();\n }\n });\n }\n }\n }\n\n onOpenAfterTimeout() {\n this.scrollable.onScroll();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport copy from '../../../../helpers/object/copy';\nimport {ChatBannedRights, Chat} from '../../../../layer';\n\nexport default function combineParticipantBannedRights(chat: Chat.channel, rights: ChatBannedRights) {\n if(chat.default_banned_rights) {\n rights = copy(rights);\n const defaultRights = chat.default_banned_rights.pFlags;\n for(const i in defaultRights) {\n // @ts-ignore\n rights.pFlags[i] = defaultRights[i];\n }\n }\n\n return rights;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport debounce from '../../../helpers/schedulers/debounce';\nimport {ChatReactions, Reaction} from '../../../layer';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport CheckboxField from '../../checkboxField';\nimport Row, {RadioFormFromValues} from '../../row';\nimport SettingSection from '../../settingSection';\nimport {SliderSuperTabEventable} from '../../sliderTab';\nimport wrapStickerToRow from '../../wrappers/stickerToRow';\n\nexport default class AppChatReactionsTab extends SliderSuperTabEventable {\n public chatId: ChatId;\n\n public async init() {\n this.setTitle('Reactions');\n\n const availableReactions = await this.managers.appReactionsManager.getActiveAvailableReactions();\n const chatFull = await this.managers.appProfileManager.getChatFull(this.chatId);\n const isBroadcast = await this.managers.appChatsManager.isBroadcast(this.chatId);\n\n let _chatReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n let chatReactions = _chatReactions;\n let emoticons = new Set(_chatReactions._ === 'chatReactionsSome' ? _chatReactions.reactions.map((reaction) => (reaction as Reaction.reactionEmoji).emoticon) : []);\n\n const makeReactionFromEmoticons = (emoticons: Array): Reaction[] => emoticons.map((emoticon) => ({_: 'reactionEmoji', emoticon}));\n\n const getCaptionLangPackKey = (): LangPackKey => {\n if(isBroadcast) {\n return 'EnableReactionsChannelInfo';\n }\n\n return chatReactions._ === 'chatReactionsAll' ? 'EnableAllReactionsInfo' : (chatReactions._ === 'chatReactionsNone' ? 'DisableReactionsInfo' : 'EnableSomeReactionsInfo');\n };\n\n const toggleSection = new SettingSection({\n name: isBroadcast ? undefined : 'AvailableReactions',\n caption: getCaptionLangPackKey()\n });\n\n const reactionsSection = new SettingSection({\n name: 'OnlyAllowThisReactions'\n });\n\n const toggleCheckboxFieldsByEmoticons = () => {\n const r: Reaction.reactionEmoji[] = (chatReactions as ChatReactions.chatReactionsSome).reactions as any ?? [];\n emoticons = new Set(r.map(({emoticon}) => emoticon));\n checkboxFieldsByEmoticon.forEach((checkboxField, emoticon) => {\n checkboxField.setValueSilently(emoticons.has(emoticon));\n });\n };\n\n let toggleCheckboxField: CheckboxField;\n if(isBroadcast) {\n toggleCheckboxField = new CheckboxField({toggle: true, checked: _chatReactions._ === 'chatReactionsSome'});\n const toggleRow = new Row({\n checkboxField: toggleCheckboxField,\n titleLangKey: 'EnableReactions',\n listenerSetter: this.listenerSetter\n });\n\n toggleSection.content.append(toggleRow.container);\n\n this.listenerSetter.add(toggleCheckboxField.input)('change', () => {\n let save = true;\n if(!toggleCheckboxField.checked) {\n chatReactions = {_: 'chatReactionsNone'};\n } else if(checkboxFields.every((checkboxField) => !checkboxField.checked)) {\n chatReactions = {_: 'chatReactionsSome', reactions: makeReactionFromEmoticons(availableReactions.map(({reaction}) => reaction))};\n } else if(chatReactions._ !== 'chatReactionsSome') {\n chatReactions = {_: 'chatReactionsSome', reactions: makeReactionFromEmoticons(Array.from(emoticons))};\n } else {\n save = false;\n }\n\n if(save) {\n toggleCheckboxFieldsByEmoticons();\n saveReactionsDebounced();\n }\n });\n } else {\n const a: [ChatReactions['_'], LangPackKey][] = [\n ['chatReactionsAll', 'AllReactions'],\n ['chatReactionsSome', 'SomeReactions'],\n ['chatReactionsNone', 'NoReactions']\n ];\n\n const onChange = () => {\n reactionsSection.container.classList.toggle('hide', chatReactions._ !== 'chatReactionsSome');\n };\n\n let value = _chatReactions._;\n const form = RadioFormFromValues(a.map(([value, langPackKey]) => {\n return {\n langPackKey,\n value,\n checked: _chatReactions._ === value\n };\n }), (_value) => {\n value = _value as any;\n\n if(value === 'chatReactionsAll') {\n chatReactions = {\n _: value,\n pFlags: {\n allow_custom: true\n }\n };\n } else if(value === 'chatReactionsNone') {\n chatReactions = {\n _: value\n };\n } else {\n chatReactions = {\n _: value,\n reactions: makeReactionFromEmoticons(['👍', '👎'])\n };\n }\n\n replaceContent(toggleSection.caption, i18n(getCaptionLangPackKey()));\n toggleCheckboxFieldsByEmoticons();\n saveReactionsDebounced();\n onChange();\n });\n\n toggleSection.content.append(form);\n onChange();\n }\n\n const checkboxFieldsByEmoticon: Map = new Map();\n const checkboxFields = availableReactions.map((availableReaction) => {\n const emoticon = availableReaction.reaction;\n const checkboxField = new CheckboxField({\n toggle: true,\n checked: emoticons.has(emoticon)\n });\n\n checkboxFieldsByEmoticon.set(emoticon, checkboxField);\n\n this.listenerSetter.add(checkboxField.input)('change', () => {\n if(checkboxField.checked) {\n emoticons.add(emoticon);\n\n if(toggleCheckboxField && !toggleCheckboxField.checked) {\n toggleCheckboxField.checked = true;\n }\n } else {\n emoticons.delete(emoticon);\n\n if(toggleCheckboxField?.checked && !emoticons.size) {\n toggleCheckboxField.checked = false;\n }\n }\n\n saveReactionsDebounced();\n });\n\n const row = new Row({\n checkboxField,\n title: availableReaction.title,\n havePadding: true,\n listenerSetter: this.listenerSetter\n });\n\n wrapStickerToRow({\n row,\n doc: availableReaction.static_icon,\n size: 'small'\n });\n\n reactionsSection.content.append(row.container);\n\n return checkboxField;\n });\n\n const saveReactions = async() => {\n saveReactionsDebounced.clearTimeout();\n // const newReactions = Array.from(enabledReactions);\n // if([...newReactions].sort().join() === [...originalReactions].sort().join()) {\n // return;\n // }\n\n if(chatReactions._ === 'chatReactionsSome') {\n chatReactions.reactions = makeReactionFromEmoticons(Array.from(emoticons));\n }\n\n // const r = (chatReactions as ChatReactions.chatReactionsSome).reactions;\n // if(r?.length === availableReactions.length) {\n // chatReactions = {_: 'chatReactionsAll'};\n // }\n\n this.managers.appChatsManager.setChatAvailableReactions(this.chatId, chatReactions);\n _chatReactions = chatReactions;\n };\n\n const saveReactionsDebounced = debounce(saveReactions, 3000, false, true);\n\n this.eventListener.addEventListener('destroy', () => {\n if(saveReactionsDebounced.isDebounced()) {\n saveReactions();\n }\n }, {once: true});\n\n this.scrollable.append(toggleSection.container, reactionsSection.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider'\nimport InputField from '../../inputField';\nimport EditPeer from '../../editPeer';\nimport Row, {CreateRowFromCheckboxField} from '../../row';\nimport Button from '../../button';\nimport {ChatRights} from '../../../lib/appManagers/appChatsManager';\nimport {Chat, ChatFull} from '../../../layer';\nimport AppChatTypeTab from './chatType';\nimport rootScope from '../../../lib/rootScope';\nimport AppGroupPermissionsTab from './groupPermissions';\nimport {i18n, LangPackKey} from '../../../lib/langPack';\nimport PopupDeleteDialog from '../../popups/deleteDialog';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport toggleDisability from '../../../helpers/dom/toggleDisability';\nimport CheckboxField from '../../checkboxField';\nimport AppChatReactionsTab from './chatReactions';\nimport hasRights from '../../../lib/appManagers/utils/chats/hasRights';\nimport replaceContent from '../../../helpers/dom/replaceContent';\nimport SettingSection from '../../settingSection';\nimport getPeerActiveUsernames from '../../../lib/appManagers/utils/peers/getPeerActiveUsernames';\n\nexport default class AppEditChatTab extends SliderSuperTab {\n private chatNameInputField: InputField;\n private descriptionInputField: InputField;\n private editPeer: EditPeer;\n public chatId: ChatId;\n\n protected async _init() {\n // * cleanup prev\n this.listenerSetter.removeAll();\n this.scrollable.container.replaceChildren();\n\n this.container.classList.add('edit-peer-container', 'edit-group-container');\n this.setTitle('Edit');\n\n let [\n chatFull,\n chat,\n isBroadcast,\n isChannel,\n canChangeType,\n canChangePermissions,\n canManageTopics,\n appConfig\n ] = await Promise.all([\n this.managers.appProfileManager.getChatFull(this.chatId, true),\n this.managers.appChatsManager.getChat(this.chatId) as Promise,\n this.managers.appChatsManager.isBroadcast(this.chatId),\n this.managers.appChatsManager.isChannel(this.chatId),\n this.managers.appChatsManager.hasRights(this.chatId, 'change_type'),\n this.managers.appChatsManager.hasRights(this.chatId, 'change_permissions'),\n this.managers.appChatsManager.hasRights(this.chatId, 'manage_topics'),\n this.managers.apiManager.getAppConfig()\n ]);\n\n const chatUpdateListeners: {[type in 'full' | 'basic']: (() => void)[]} = {full: [], basic: []};\n const addChatUpdateListener = (callback: () => void, type: 'full' | 'basic' = 'basic') => {\n chatUpdateListeners[type].push(callback);\n };\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.chatId === chatId) {\n chat = await this.managers.appChatsManager.getChat(this.chatId) as typeof chat;\n chatUpdateListeners['basic'].forEach((callback) => callback());\n }\n });\n\n this.listenerSetter.add(rootScope)('chat_full_update', async(chatId) => {\n if(this.chatId === chatId) {\n chatFull = await this.managers.appProfileManager.getCachedFullChat(chatId) || chatFull;\n chatUpdateListeners['full'].forEach((callback) => callback());\n }\n });\n\n const peerId = this.chatId.toPeerId(true);\n\n {\n const section = new SettingSection({noDelimiter: true, caption: true});\n const inputFields: InputField[] = [];\n\n const inputWrapper = document.createElement('div');\n inputWrapper.classList.add('input-wrapper');\n\n this.chatNameInputField = new InputField({\n label: isBroadcast ? 'EnterChannelName' : 'CreateGroup.NameHolder',\n name: 'chat-name',\n maxLength: 255,\n required: true\n });\n this.descriptionInputField = new InputField({\n label: 'DescriptionPlaceholder',\n name: 'chat-description',\n maxLength: 255\n });\n\n this.chatNameInputField.setOriginalValue(chat.title);\n this.descriptionInputField.setOriginalValue(chatFull.about);\n\n inputWrapper.append(this.chatNameInputField.container, this.descriptionInputField.container);\n\n inputFields.push(this.chatNameInputField, this.descriptionInputField);\n\n this.editPeer = new EditPeer({\n peerId,\n inputFields,\n listenerSetter: this.listenerSetter,\n popupOptions: {isForum: (chat as Chat.channel).pFlags.forum}\n });\n this.content.append(this.editPeer.nextBtn);\n\n section.content.append(this.editPeer.avatarEdit.container, inputWrapper);\n\n if(canChangeType) {\n const chatTypeRow = new Row({\n titleLangKey: isBroadcast ? 'ChannelType' : 'GroupType',\n clickable: () => {\n const tab = this.slider.createTab(AppChatTypeTab);\n tab.chatId = this.chatId;\n tab.chatFull = chatFull;\n tab.open();\n },\n icon: 'lock',\n listenerSetter: this.listenerSetter\n });\n\n const setChatTypeSubtitle = () => {\n let key: LangPackKey;\n const username = getPeerActiveUsernames(chat as Chat.channel)[0];\n if(isBroadcast) {\n key = username ? 'TypePublic' : 'TypePrivate';\n } else {\n key = username ? 'TypePublicGroup' : 'TypePrivateGroup';\n }\n\n chatTypeRow.subtitle.replaceChildren(i18n(key));\n };\n\n setChatTypeSubtitle();\n addChatUpdateListener(setChatTypeSubtitle);\n section.content.append(chatTypeRow.container);\n }\n\n if(canChangeType || canChangePermissions) {\n const reactionsRow = new Row({\n titleLangKey: 'Reactions',\n icon: 'reactions',\n clickable: () => {\n const tab = this.slider.createTab(AppChatReactionsTab);\n tab.chatId = this.chatId;\n tab.open();\n },\n listenerSetter: this.listenerSetter\n });\n\n const availableReactions = await this.managers.appReactionsManager.getAvailableReactions();\n const availableReactionsLength = availableReactions.filter((availableReaction) => !availableReaction.pFlags.inactive).length;\n const setReactionsLength = () => {\n const chatAvailableReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n if(chatAvailableReactions._ === 'chatReactionsSome') {\n const length = chatAvailableReactions.reactions.length;\n if(length === availableReactionsLength) {\n replaceContent(reactionsRow.subtitle, i18n('ReactionsAll'));\n } else {\n reactionsRow.subtitle.textContent = length + '/' + availableReactionsLength;\n }\n } else {\n replaceContent(reactionsRow.subtitle, i18n(chatAvailableReactions._ === 'chatReactionsAll' ? 'ReactionsAll' : 'Checkbox.Disabled'));\n }\n };\n\n setReactionsLength();\n addChatUpdateListener(setReactionsLength, 'full');\n section.content.append(reactionsRow.container);\n }\n\n if(canChangePermissions && !isBroadcast) {\n const flags = [\n 'send_messages',\n 'send_media',\n 'send_stickers',\n 'send_polls',\n 'embed_links',\n 'invite_users',\n 'pin_messages',\n 'change_info'\n ] as ChatRights[];\n\n const permissionsRow = new Row({\n titleLangKey: 'ChannelPermissions',\n clickable: () => {\n const tab = this.slider.createTab(AppGroupPermissionsTab);\n tab.chatId = this.chatId;\n tab.open();\n },\n icon: 'permissions',\n listenerSetter: this.listenerSetter\n });\n\n const setPermissionsLength = () => {\n permissionsRow.subtitle.textContent = flags.reduce((acc, f) => acc + +hasRights(chat, f, (chat as Chat.chat).default_banned_rights), 0) + '/' + flags.length;\n };\n\n setPermissionsLength();\n addChatUpdateListener(setPermissionsLength);\n section.content.append(permissionsRow.container);\n }\n\n if(canManageTopics && (chat.participants_count >= appConfig.forum_upgrade_participants_min || (chat as Chat.channel).pFlags.forum) && !isBroadcast) {\n const topicsRow = new Row({\n checkboxField: new CheckboxField({toggle: true}),\n titleLangKey: 'Topics',\n clickable: () => {},\n icon: 'topics',\n listenerSetter: this.listenerSetter\n });\n\n const setTopics = () => {\n const isForum = !!(chat as Chat.channel).pFlags.forum;\n this.editPeer.avatarElem.parentElement.classList.toggle('is-forum', isForum);\n topicsRow.checkboxField.setValueSilently(isForum);\n };\n\n this.listenerSetter.add(topicsRow.checkboxField.input)('change', (e) => {\n if(!e.isTrusted) {\n return;\n }\n\n const promise = this.managers.appChatsManager.toggleForum(this.chatId, topicsRow.checkboxField.checked);\n topicsRow.disableWithPromise(promise);\n });\n\n setTopics();\n addChatUpdateListener(setTopics);\n\n section.caption.replaceChildren(i18n('ForumToggleDescription'));\n section.content.append(topicsRow.container);\n }\n\n section.caption.classList.toggle('hide', !section.caption.childElementCount);\n\n /* const administratorsRow = new Row({\n titleLangKey: 'PeerInfo.Administrators',\n subtitle: '' + ((chatFull as ChatFull.channelFull).admins_count || 1),\n icon: 'admin',\n clickable: true\n });\n\n section.content.append(administratorsRow.container); */\n\n this.scrollable.append(section.container);\n\n attachClickEvent(this.editPeer.nextBtn, () => {\n this.editPeer.nextBtn.disabled = true;\n\n const promises: Promise[] = [];\n\n const id = this.chatId;\n if(this.chatNameInputField.isValidToChange()) {\n promises.push(this.managers.appChatsManager.editTitle(id, this.chatNameInputField.value));\n }\n\n if(this.descriptionInputField.isValidToChange()) {\n promises.push(this.managers.appChatsManager.editAbout(id, this.descriptionInputField.value));\n }\n\n if(this.editPeer.uploadAvatar) {\n promises.push(this.editPeer.uploadAvatar().then((inputFile) => {\n return this.managers.appChatsManager.editPhoto(id, inputFile);\n }));\n }\n\n Promise.race(promises).finally(() => {\n this.editPeer.nextBtn.removeAttribute('disabled');\n this.close();\n });\n }, {listenerSetter: this.listenerSetter});\n\n\n /* if(appChatsManager.hasRights(-this.peerId, 'change_info')) {\n const discussionRow = new Row({\n titleLangKey: 'PeerInfo.Discussion',\n subtitleLangKey: 'PeerInfo.Discussion.Add',\n clickable: true,\n icon: 'message'\n });\n\n section.content.append(discussionRow.container);\n }\n\n const administratorsRow = new Row({\n titleLangKey: 'PeerInfo.Administrators',\n subtitle: '' + chatFull.admins_count,\n icon: 'admin',\n clickable: true\n });\n\n section.content.append(administratorsRow.container); */\n\n if(isBroadcast && await this.managers.appChatsManager.hasRights(this.chatId, 'change_info')) {\n const signMessagesCheckboxField = new CheckboxField({\n text: 'ChannelSignMessages',\n checked: !!(chat as Chat.channel).pFlags.signatures\n });\n\n this.listenerSetter.add(signMessagesCheckboxField.input)('change', () => {\n const toggle = signMessagesCheckboxField.toggleDisability(true);\n this.managers.appChatsManager.toggleSignatures(this.chatId, signMessagesCheckboxField.checked).then(() => {\n toggle();\n });\n });\n\n addChatUpdateListener(() => {\n signMessagesCheckboxField.setValueSilently(!!(chat as Chat.channel).pFlags.signatures);\n });\n\n section.content.append(CreateRowFromCheckboxField(signMessagesCheckboxField).container);\n }\n }\n\n if(!isBroadcast) {\n const section = new SettingSection({\n\n });\n\n /* const membersRow = new Row({\n titleLangKey: isBroadcast ? 'PeerInfo.Subscribers' : 'GroupMembers',\n icon: 'newgroup',\n clickable: true\n });\n\n membersRow.subtitle.append(i18n('Subscribers', [numberThousandSplitter(335356)]));\n\n section.content.append(membersRow.container); */\n\n if(!isBroadcast && canChangeType) {\n const showChatHistoryCheckboxField = new CheckboxField({\n text: 'ChatHistory'\n });\n\n this.listenerSetter.add(showChatHistoryCheckboxField.input)('change', () => {\n const toggle = showChatHistoryCheckboxField.toggleDisability(true);\n this.managers.appChatsManager.togglePreHistoryHidden(this.chatId, !showChatHistoryCheckboxField.checked).then(() => {\n toggle();\n });\n });\n\n // ! it won't be updated because chatFull will be old\n const onChatUpdate = () => {\n showChatHistoryCheckboxField.setValueSilently(isChannel && !(chatFull as ChatFull.channelFull).pFlags.hidden_prehistory);\n };\n\n onChatUpdate();\n addChatUpdateListener(onChatUpdate);\n\n section.content.append(CreateRowFromCheckboxField(showChatHistoryCheckboxField).container);\n }\n\n if(section.content.childElementCount) {\n this.scrollable.append(section.container);\n }\n }\n\n if(await this.managers.appChatsManager.hasRights(this.chatId, 'delete_chat')) {\n const section = new SettingSection({});\n\n const btnDelete = Button('btn-primary btn-transparent danger', {icon: 'delete', text: isBroadcast ? 'PeerInfo.DeleteChannel' : 'DeleteAndExitButton'});\n\n attachClickEvent(btnDelete, () => {\n new PopupDeleteDialog(peerId/* , 'delete' */, undefined, (promise) => {\n const toggle = toggleDisability([btnDelete], true);\n promise.then(() => {\n this.close();\n }, () => {\n toggle();\n });\n });\n }, {listenerSetter: this.listenerSetter});\n\n section.content.append(btnDelete);\n\n this.scrollable.append(section.container);\n }\n\n if(!isChannel) {\n // ! this one will fire earlier than tab's closeAfterTimeout (destroy) event and listeners will be erased, so destroy won't fire\n this.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(peerId === migrateFrom) {\n this.chatId = migrateTo.toChatId();\n this._init();\n }\n });\n }\n }\n\n public init() {\n return this._init();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../../lib/rootScope';\nimport AppSearchSuper, {SearchSuperType} from '../../appSearchSuper.';\nimport SidebarSlider, {SliderSuperTab} from '../../slider';\nimport TransitionSlider from '../../transition';\nimport AppEditChatTab from './editChat';\nimport PeerTitle from '../../peerTitle';\nimport AppEditContactTab from './editContact';\nimport Button from '../../button';\nimport ButtonIcon from '../../buttonIcon';\nimport I18n, {i18n, LangPackKey} from '../../../lib/langPack';\nimport {toastNew} from '../../toast';\nimport AppAddMembersTab from '../../sidebarLeft/tabs/addMembers';\nimport PopupPickUser from '../../popups/pickUser';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerCheckboxOptions} from '../../popups/peer';\nimport ButtonCorner from '../../buttonCorner';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport PeerProfile from '../../peerProfile';\nimport {Message} from '../../../layer';\nimport getMessageThreadId from '../../../lib/appManagers/utils/messages/getMessageThreadId';\nimport AppEditTopicTab from './editTopic';\n\ntype SharedMediaHistoryStorage = Partial<{\n [type in SearchSuperType]: {mid: number, peerId: PeerId}[]\n}>;\n\nconst historiesStorage: {\n [peerId: PeerId]: {\n [threadId: number]: SharedMediaHistoryStorage\n }\n} = {};\n\n// TODO: отредактированное сообщение не изменится\nexport default class AppSharedMediaTab extends SliderSuperTab {\n private editBtn: HTMLElement;\n\n private peerId: PeerId;\n private threadId: number;\n\n private searchSuper: AppSearchSuper;\n\n private profile: PeerProfile;\n private peerChanged: boolean;\n\n private titleI18n: I18n.IntlElement;\n\n public isFirst: boolean;\n\n public init() {\n // const perf = performance.now();\n\n this.container.classList.add('shared-media-container', 'profile-container');\n\n // * header\n const newCloseBtn = Button('btn-icon sidebar-close-button', {noRipple: true});\n this.closeBtn.replaceWith(newCloseBtn);\n this.closeBtn = newCloseBtn;\n\n const animatedCloseIcon = document.createElement('div');\n animatedCloseIcon.classList.add('animated-close-icon');\n newCloseBtn.append(animatedCloseIcon);\n\n if(this.isFirst) {\n animatedCloseIcon.classList.add('state-back');\n }\n\n const transitionContainer = document.createElement('div');\n transitionContainer.className = 'transition slide-fade';\n\n const transitionFirstItem = document.createElement('div');\n transitionFirstItem.classList.add('transition-item');\n\n this.titleI18n = new I18n.IntlElement();\n this.title.append(this.titleI18n.element);\n this.editBtn = ButtonIcon('edit');\n // const moreBtn = ButtonIcon('more');\n\n transitionFirstItem.append(this.title, this.editBtn/* , moreBtn */);\n\n const transitionLastItem = document.createElement('div');\n transitionLastItem.classList.add('transition-item');\n\n const secondTitle: HTMLElement = this.title.cloneNode() as any;\n secondTitle.append(i18n('PeerInfo.SharedMedia'));\n\n transitionLastItem.append(secondTitle);\n\n transitionContainer.append(transitionFirstItem, transitionLastItem);\n\n this.header.append(transitionContainer);\n\n // * body\n\n this.profile = new PeerProfile(this.managers, this.scrollable, this.listenerSetter);\n this.profile.init();\n\n this.scrollable.append(this.profile.element);\n\n const HEADER_HEIGHT = 56;\n this.scrollable.onAdditionalScroll = () => {\n const rect = this.searchSuper.nav.getBoundingClientRect();\n if(!rect.width) return;\n\n const top = rect.top - 1;\n setIsSharedMedia(top <= HEADER_HEIGHT);\n };\n\n const setIsSharedMedia = (isSharedMedia: boolean) => {\n animatedCloseIcon.classList.toggle('state-back', this.isFirst || isSharedMedia);\n this.searchSuper.container.classList.toggle('is-full-viewport', isSharedMedia);\n transition(+isSharedMedia);\n\n if(!isSharedMedia) {\n this.searchSuper.cleanScrollPositions();\n }\n };\n\n const transition = TransitionSlider({\n content: transitionContainer,\n type: 'slide-fade',\n transitionTime: 400,\n isHeavy: false\n });\n\n transition(0);\n\n attachClickEvent(this.closeBtn, (e) => {\n if(transition.prevId()) {\n this.scrollable.scrollIntoViewNew({\n element: this.scrollable.container.firstElementChild as HTMLElement,\n position: 'start'\n });\n transition(0);\n\n if(!this.isFirst) {\n animatedCloseIcon.classList.remove('state-back');\n }\n } else if(!this.scrollable.isHeavyAnimationInProgress) {\n this.slider.onCloseBtnClick();\n }\n }, {listenerSetter: this.listenerSetter});\n\n attachClickEvent(this.editBtn, async() => {\n let tab: AppEditChatTab | AppEditContactTab | AppEditTopicTab;\n const {peerId, threadId} = this;\n if(threadId && await this.managers.appPeersManager.isForum(peerId)) {\n tab = this.slider.createTab(AppEditTopicTab)\n } else if(peerId.isAnyChat()) {\n tab = this.slider.createTab(AppEditChatTab);\n } else {\n tab = this.slider.createTab(AppEditContactTab);\n }\n\n if(tab) {\n if(tab instanceof AppEditTopicTab) {\n tab.open(peerId, this.threadId);\n } else {\n if(tab instanceof AppEditChatTab) {\n tab.chatId = peerId.toChatId();\n } else {\n tab.peerId = peerId;\n }\n\n tab.open();\n }\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('contacts_update', (userId) => {\n if(this.peerId === userId) {\n this.toggleEditBtn();\n }\n });\n\n this.listenerSetter.add(rootScope)('chat_update', (chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n this.toggleEditBtn();\n }\n });\n\n this.listenerSetter.add(rootScope)('history_multiappend', (message) => {\n this.renderNewMessage(message);\n });\n\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\n this.deleteDeletedMessages(peerId, Array.from(msgs));\n });\n\n // Calls when message successfully sent and we have an id\n this.listenerSetter.add(rootScope)('message_sent', ({message}) => {\n this.renderNewMessage(message);\n });\n\n // this.container.prepend(this.closeBtn.parentElement);\n\n this.searchSuper = new AppSearchSuper({\n mediaTabs: [{\n inputFilter: 'inputMessagesFilterEmpty',\n name: 'PeerMedia.Members',\n type: 'members'\n }, {\n inputFilter: 'inputMessagesFilterPhotoVideo',\n name: 'SharedMediaTab2',\n type: 'media'\n }, {\n inputFilter: 'inputMessagesFilterDocument',\n name: 'SharedFilesTab2',\n type: 'files'\n }, {\n inputFilter: 'inputMessagesFilterUrl',\n name: 'SharedLinksTab2',\n type: 'links'\n }, {\n inputFilter: 'inputMessagesFilterMusic',\n name: 'SharedMusicTab2',\n type: 'music'\n }, {\n inputFilter: 'inputMessagesFilterRoundVoice',\n name: 'SharedVoiceTab2',\n type: 'voice'\n }],\n scrollable: this.scrollable,\n onChangeTab: (mediaTab) => {\n const timeout = mediaTab.type === 'members' && rootScope.settings.animationsEnabled ? 250 : 0;\n setTimeout(() => {\n btnAddMembers.classList.toggle('is-hidden', mediaTab.type !== 'members');\n }, timeout);\n },\n managers: this.managers\n });\n\n this.searchSuper.scrollStartCallback = () => {\n setIsSharedMedia(true);\n };\n\n this.profile.element.append(this.searchSuper.container);\n\n const btnAddMembers = ButtonCorner({icon: 'addmember_filled'});\n this.content.append(btnAddMembers);\n\n attachClickEvent(btnAddMembers, async() => {\n const peerId = this.peerId;\n const id = this.peerId.toChatId();\n const isChannel = await this.managers.appChatsManager.isChannel(id);\n\n const showConfirmation = (peerIds: PeerId[], callback: (checked: PopupPeerButtonCallbackCheckboxes) => void) => {\n let titleLangKey: LangPackKey, titleLangArgs: any[],\n descriptionLangKey: LangPackKey, descriptionLangArgs: any[],\n checkboxes: PopupPeerCheckboxOptions[];\n\n if(peerIds.length > 1) {\n titleLangKey = 'AddMembersAlertTitle';\n titleLangArgs = [i18n('Members', [peerIds.length])];\n descriptionLangKey = 'AddMembersAlertCountText';\n descriptionLangArgs = peerIds.map((peerId) => {\n const b = document.createElement('b');\n b.append(new PeerTitle({peerId}).element);\n return b;\n });\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddMembersForwardMessages',\n checked: true\n }];\n }\n } else {\n titleLangKey = 'AddOneMemberAlertTitle';\n descriptionLangKey = 'AddMembersAlertNamesText';\n const b = document.createElement('b');\n b.append(new PeerTitle({\n peerId: peerIds[0]\n }).element);\n descriptionLangArgs = [b];\n\n if(!isChannel) {\n checkboxes = [{\n text: 'AddOneMemberForwardMessages',\n textArgs: [new PeerTitle({peerId: peerIds[0]}).element],\n checked: true\n }];\n }\n }\n\n descriptionLangArgs.push(new PeerTitle({\n peerId\n }).element);\n\n new PopupPeer('popup-add-members', {\n peerId,\n titleLangKey,\n descriptionLangKey,\n descriptionLangArgs,\n buttons: [{\n langKey: 'Add',\n callback\n }],\n checkboxes\n }).show();\n };\n\n const onError = (err: any) => {\n if(err.type === 'USER_PRIVACY_RESTRICTED') {\n toastNew({langPackKey: 'InviteToGroupError'});\n }\n };\n\n if(isChannel) {\n const tab = this.slider.createTab(AppAddMembersTab);\n tab.open({\n type: 'channel',\n skippable: false,\n takeOut: (peerIds) => {\n showConfirmation(peerIds, () => {\n const promise = this.managers.appChatsManager.inviteToChannel(id, peerIds);\n promise.catch(onError);\n tab.attachToPromise(promise);\n });\n\n return false;\n },\n title: 'GroupAddMembers',\n placeholder: 'SendMessageTo'\n });\n } else {\n new PopupPickUser({\n peerTypes: ['contacts'],\n placeholder: 'Search',\n onSelect: (peerId) => {\n setTimeout(() => {\n showConfirmation([peerId], (checked) => {\n this.managers.appChatsManager.addChatUser(id, peerId, checked.size ? undefined : 0)\n .catch(onError);\n });\n }, 0);\n }\n });\n }\n }, {listenerSetter: this.listenerSetter});\n\n // console.log('construct shared media time:', performance.now() - perf);\n }\n\n private _renderNewMessage(message: Message.message | Message.messageService, threadId?: number) {\n const historyStorage = historiesStorage[message.peerId]?.[threadId];\n if(!historyStorage) return;\n\n for(const mediaTab of this.searchSuper.mediaTabs) {\n const inputFilter = mediaTab.inputFilter;\n const history = historyStorage[inputFilter];\n if(!history) {\n continue;\n }\n\n const filtered = this.searchSuper.filterMessagesByType([message], inputFilter)\n .filter((message) => !history.find((m) => m.mid === message.mid && m.peerId === message.peerId));\n if(filtered.length) {\n history.unshift(...filtered.map((message) => ({mid: message.mid, peerId: message.peerId})));\n\n if(this.peerId === message.peerId && this.searchSuper.usedFromHistory[inputFilter] !== -1) {\n this.searchSuper.usedFromHistory[inputFilter] += filtered.length;\n this.searchSuper.performSearchResult(filtered, mediaTab, false);\n }\n }\n }\n }\n\n private async renderNewMessage(message: Message.message | Message.messageService) {\n if(this.init) return; // * not inited yet\n\n const {peerId} = message;\n const isForum = await this.managers.appPeersManager.isForum(peerId);\n const threadId = getMessageThreadId(message, isForum);\n\n this._renderNewMessage(message);\n if(threadId) {\n this._renderNewMessage(message, threadId);\n }\n }\n\n public _deleteDeletedMessages(historyStorage: SharedMediaHistoryStorage, peerId: PeerId, mids: number[]) {\n for(const mid of mids) {\n for(const type of this.searchSuper.mediaTabs) {\n const inputFilter = type.inputFilter;\n\n const history = historyStorage[inputFilter];\n if(!history) continue;\n\n const idx = history.findIndex((m) => m.mid === mid);\n if(idx === -1) {\n continue;\n }\n\n history.splice(idx, 1);\n\n if(this.peerId === peerId) {\n const container = this.searchSuper.tabs[inputFilter];\n const div = container.querySelector(`[data-mid=\"${mid}\"][data-peer-id=\"${peerId}\"]`) as HTMLElement;\n if(div) {\n if(this.searchSuper.selection.isSelecting) {\n this.searchSuper.selection.toggleByElement(div);\n }\n\n div.remove();\n }\n\n if(this.searchSuper.usedFromHistory[inputFilter] >= (idx + 1)) {\n --this.searchSuper.usedFromHistory[inputFilter];\n }\n }\n\n // can have element in different tabs somehow\n // break;\n }\n }\n }\n\n public deleteDeletedMessages(peerId: PeerId, mids: number[]) {\n if(this.init) return; // * not inited yet\n\n const h = historiesStorage[peerId];\n if(!h) return;\n\n for(const threadId in h) {\n this._deleteDeletedMessages(h[threadId], peerId, mids);\n }\n\n this.scrollable.onScroll();\n }\n\n private async cleanupHTML() {\n // const perf = performance.now();\n const isAnyChat = this.peerId.isAnyChat();\n const [canViewMembers, hasRights] = await Promise.all([\n isAnyChat ? this.searchSuper.canViewMembers() : false,\n isAnyChat ? this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users') : false\n ]);\n\n return () => {\n this.profile.cleanupHTML();\n this.editBtn.classList.add('hide');\n this.searchSuper.cleanupHTML(true);\n this.container.classList.toggle('can-add-members', canViewMembers && hasRights);\n };\n // console.log('cleanupHTML shared media time:', performance.now() - perf);\n }\n\n public setLoadMutex(promise: Promise) {\n this.searchSuper.loadMutex = promise;\n }\n\n public setPeer(peerId: PeerId, threadId?: number) {\n if(this.peerId === peerId && this.threadId === threadId) return false;\n\n this.peerId = peerId;\n this.threadId = threadId;\n this.peerChanged = true;\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.searchSuper.setQuery({\n peerId,\n threadId,\n historyStorage: (historiesStorage[peerId] ??= {})[threadId] ??= {}\n });\n\n this.profile.setPeer(peerId, threadId);\n\n return true;\n }\n\n private async changeTitleKey() {\n const isForum = this.managers.appPeersManager.isForum(this.peerId);\n\n return () => {\n this.titleI18n.compareAndUpdate({key: this.threadId && isForum ? 'AccDescrTopic' : 'Profile'});\n };\n }\n\n public async fillProfileElements() {\n if(!this.peerChanged) {\n return;\n }\n\n this.peerChanged = false;\n const callbacks = await Promise.all([\n this.cleanupHTML(),\n this.toggleEditBtn(true),\n this.profile.fillProfileElements(),\n this.changeTitleKey()\n ]);\n\n return () => {\n callbacks.forEach((callback) => {\n callback?.();\n });\n };\n }\n\n private async toggleEditBtn(manual?: T): Promise void : void> {\n let show: boolean;\n if(this.peerId.isUser()) {\n show = this.peerId !== rootScope.myId && await this.managers.appUsersManager.isContact(this.peerId.toUserId());\n } else {\n const chatId = this.peerId.toChatId();\n const isTopic = this.threadId && await this.managers.appChatsManager.isForum(chatId);\n show = await this.managers.appChatsManager.hasRights(chatId, isTopic ? 'manage_topics' : 'change_info');\n }\n\n const callback = () => {\n this.editBtn.classList.toggle('hide', !show);\n };\n\n return manual ? callback : callback() as any;\n }\n\n public loadSidebarMedia(single: boolean, justLoad?: boolean) {\n this.searchSuper.load(single, justLoad);\n }\n\n onOpenAfterTimeout() {\n super.onOpenAfterTimeout();\n\n this.scrollable.onScroll();\n }\n\n onCloseAfterTimeout() {\n super.onCloseAfterTimeout();\n\n if(this.destroyable) {\n this.profile.destroy();\n this.searchSuper.destroy();\n }\n }\n\n public destroy() {\n this.destroyable = true;\n this.onCloseAfterTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\n\ntype SetTransitionOptions = {\n element: HTMLElement,\n className: string,\n forwards: boolean,\n duration: number,\n onTransitionEnd?: () => void,\n useRafs?: number,\n onTransitionStart?: () => void\n};\nconst SetTransition = (options: SetTransitionOptions) => {\n const {element, className, forwards, duration, onTransitionEnd, onTransitionStart, useRafs} = options;\n const {timeout, raf} = element.dataset;\n if(timeout !== undefined) {\n clearTimeout(+timeout);\n }\n\n // useRafs = undefined;\n // duration = 0;\n\n if(raf !== undefined) {\n window.cancelAnimationFrame(+raf);\n if(!useRafs) {\n delete element.dataset.raf;\n }\n }\n\n // if(forwards && className && element.classList.contains(className) && !element.classList.contains('animating')) {\n // return;\n // }\n\n if(useRafs && rootScope.settings.animationsEnabled && duration) {\n element.dataset.raf = '' + window.requestAnimationFrame(() => {\n delete element.dataset.raf;\n SetTransition({\n ...options,\n useRafs: useRafs - 1\n });\n });\n\n return;\n }\n\n if(forwards && className) {\n element.classList.add(className);\n }\n\n const afterTimeout = () => {\n delete element.dataset.timeout;\n if(!forwards && className) {\n element.classList.remove('backwards', className);\n }\n\n element.classList.remove('animating');\n\n onTransitionEnd?.();\n };\n\n onTransitionStart?.();\n if(!rootScope.settings.animationsEnabled || !duration) {\n element.classList.remove('animating', 'backwards');\n afterTimeout();\n return;\n }\n\n element.classList.add('animating');\n\n element.classList.toggle('backwards', !forwards);\n element.dataset.timeout = '' + setTimeout(afterTimeout, duration);\n};\n\nexport default SetTransition;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {horizontalMenu} from './horizontalMenu';\nimport TransitionSlider from './transition';\nimport appNavigationController, {NavigationItem} from './appNavigationController';\nimport SliderSuperTab, {SliderSuperTabConstructable} from './sliderTab';\nimport indexOfAndSplice from '../helpers/array/indexOfAndSplice';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\nimport {MaybePromise} from '../types';\n\nconst TRANSITION_TIME = 250;\n\nexport {SliderSuperTab};\n\nexport default class SidebarSlider {\n protected _selectTab: ReturnType;\n protected historyTabIds: (number | SliderSuperTab)[] = []; // * key is any, since right sidebar is ugly nowz\n protected tabsContainer: HTMLElement;\n public sidebarEl: HTMLElement;\n protected tabs: Map; // * key is any, since right sidebar is ugly now\n private canHideFirst = false;\n private navigationType: NavigationItem['type'];\n protected managers: AppManagers;\n protected middlewareHelper: MiddlewareHelper;\n public onOpenTab: () => MaybePromise;\n\n constructor(options: {\n sidebarEl: SidebarSlider['sidebarEl'],\n tabs?: SidebarSlider['tabs'],\n canHideFirst?: SidebarSlider['canHideFirst'],\n navigationType: SidebarSlider['navigationType']\n }) {\n safeAssign(this, options);\n\n this.tabs ??= new Map();\n\n this.tabsContainer = this.sidebarEl.querySelector('.sidebar-slider');\n this._selectTab = TransitionSlider({\n content: this.tabsContainer,\n type: 'navigation',\n transitionTime: TRANSITION_TIME\n });\n if(!this.canHideFirst) {\n this._selectTab(0);\n }\n\n this.middlewareHelper = getMiddleware();\n\n // Array.from(this.sidebarEl.querySelectorAll('.sidebar-close-button') as any as HTMLElement[]).forEach((el) => {\n // attachClickEvent(el, this.onCloseBtnClick);\n // });\n }\n\n public getMiddleware() {\n return this.middlewareHelper.get();\n }\n\n public onCloseBtnClick = () => {\n const item = appNavigationController.findItemByType(this.navigationType);\n if(item) {\n appNavigationController.back(this.navigationType);\n } else if(this.historyTabIds.length) {\n this.closeTab(this.historyTabIds[this.historyTabIds.length - 1]);\n }\n // this.closeTab();\n };\n\n public closeTab = (id?: number | SliderSuperTab, animate?: boolean, isNavigation?: boolean) => {\n if(id !== undefined && this.historyTabIds[this.historyTabIds.length - 1] !== id) {\n this.removeTabFromHistory(id);\n return false;\n }\n\n // console.log('sidebar-close-button click:', this.historyTabIDs);\n const closingId = this.historyTabIds.pop(); // pop current\n this.onCloseTab(closingId, animate, isNavigation);\n\n const tab = this.historyTabIds[this.historyTabIds.length - 1];\n this._selectTab(tab !== undefined ? (tab instanceof SliderSuperTab ? tab.container : tab) : (this.canHideFirst ? -1 : 0), animate);\n return true;\n };\n\n public async selectTab(id: number | SliderSuperTab) {\n /* if(id instanceof SliderSuperTab) {\n id = id.id;\n } */\n\n if(this.historyTabIds[this.historyTabIds.length - 1] === id) {\n return false;\n }\n\n const tab: SliderSuperTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\n this.onOpenTab && await this.onOpenTab();\n\n if(tab) {\n // @ts-ignore\n tab.onOpen?.();\n\n // @ts-ignore\n if(tab.onOpenAfterTimeout) {\n setTimeout(() => {\n // @ts-ignore\n tab.onOpenAfterTimeout();\n }, TRANSITION_TIME);\n }\n }\n\n // if(!this.canHideFirst || this.historyTabIds.length) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: (canAnimate) => {\n this.closeTab(undefined, canAnimate, true);\n return true;\n }\n });\n // }\n\n this.historyTabIds.push(id);\n this._selectTab(id instanceof SliderSuperTab ? id.container : id);\n return true;\n }\n\n public removeTabFromHistory(id: number | SliderSuperTab) {\n indexOfAndSplice(this.historyTabIds, id);\n this.onCloseTab(id, undefined);\n }\n\n public sliceTabsUntilTab(tabConstructor: SliderSuperTabConstructable, preserveTab: SliderSuperTab) {\n for(let i = this.historyTabIds.length - 1; i >= 0; --i) {\n const tab = this.historyTabIds[i];\n if(tab === preserveTab) continue;\n else if(tab instanceof tabConstructor) {\n break;\n }\n\n this.removeTabFromHistory(tab);\n // appNavigationController.removeByType(this.navigationType, true);\n }\n }\n\n public getTab(tabConstructor: SliderSuperTabConstructable) {\n return this.historyTabIds.find((t) => t instanceof tabConstructor) as T;\n }\n\n public getHistory() {\n return this.historyTabIds;\n }\n\n public isTabExists(tabConstructor: SliderSuperTabConstructable) {\n return !!this.getTab(tabConstructor);\n }\n\n protected onCloseTab(id: number | SliderSuperTab, animate: boolean, isNavigation?: boolean) {\n if(!isNavigation) {\n appNavigationController.removeByType(this.navigationType, true);\n }\n\n const tab: SliderSuperTab = id instanceof SliderSuperTab ? id : this.tabs.get(id);\n if(tab) {\n try {\n // @ts-ignore\n tab.onClose?.();\n } catch(err) {\n console.error('tab onClose error', tab);\n }\n\n // @ts-ignore\n if(tab.onCloseAfterTimeout) {\n setTimeout(() => {\n // @ts-ignore\n tab.onCloseAfterTimeout();\n }, TRANSITION_TIME + 30);\n }\n }\n }\n\n public addTab(tab: SliderSuperTab) {\n if(!tab.container.parentElement) {\n this.tabsContainer.append(tab.container);\n\n if(tab.closeBtn) {\n tab.closeBtn.addEventListener('click', this.onCloseBtnClick);\n }\n }\n }\n\n public deleteTab(tab: SliderSuperTab) {\n this.tabs.delete(tab);\n }\n\n public createTab(\n ctor: SliderSuperTabConstructable,\n destroyable = true,\n doNotAppend?: boolean\n ) {\n const tab = new ctor(doNotAppend ? undefined : this, destroyable);\n tab.managers = this.managers;\n return tab;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {getMiddleware, MiddlewareHelper} from '../helpers/middleware';\nimport noop from '../helpers/noop';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport ButtonIcon from './buttonIcon';\nimport Scrollable from './scrollable';\nimport SidebarSlider from './slider';\n\nexport interface SliderSuperTabConstructable {\n new(slider: SidebarSlider, destroyable: boolean): T;\n}\n\nexport interface SliderSuperTabEventableConstructable {\n new(slider: SidebarSlider, destroyable: boolean): SliderSuperTabEventable;\n}\n\nexport default class SliderSuperTab {\n public static getInitArgs?(fromTab: SliderSuperTab): any;\n\n public container: HTMLElement;\n\n public header: HTMLElement;\n public closeBtn: HTMLElement;\n public title: HTMLElement;\n\n public content: HTMLElement;\n public scrollable: Scrollable;\n\n public slider: SidebarSlider;\n public destroyable: boolean;\n public listenerSetter: ListenerSetter;\n\n public managers: AppManagers;\n public middlewareHelper: MiddlewareHelper;\n\n constructor(slider: SidebarSlider, destroyable?: boolean) {\n this._constructor(slider, destroyable);\n }\n\n public _constructor(slider: SidebarSlider, destroyable = true): any {\n this.slider = slider;\n this.middlewareHelper = slider ? slider.getMiddleware().create() : getMiddleware();\n this.destroyable = destroyable;\n\n this.container = document.createElement('div');\n this.container.classList.add('tabs-tab', 'sidebar-slider-item');\n\n // * Header\n this.header = document.createElement('div');\n this.header.classList.add('sidebar-header');\n\n this.closeBtn = ButtonIcon('left sidebar-close-button', {noRipple: true});\n this.title = document.createElement('div');\n this.title.classList.add('sidebar-header__title');\n this.header.append(this.closeBtn, this.title);\n\n // * Content\n this.content = document.createElement('div');\n this.content.classList.add('sidebar-content');\n\n this.scrollable = new Scrollable(this.content, undefined, undefined, true);\n this.scrollable.attachBorderListeners(this.container);\n\n this.container.append(this.header, this.content);\n\n this.slider?.addTab(this);\n\n this.listenerSetter = new ListenerSetter();\n }\n\n public close() {\n return this.slider.closeTab(this);\n }\n\n public async open(...args: Parameters) {\n if(this.init) {\n try {\n const result = this.init(...args);\n this.init = null;\n\n if(result instanceof Promise) {\n await result;\n }\n } catch(err) {\n console.error('open tab error', err);\n }\n }\n\n this.slider.selectTab(this);\n }\n\n public init(...args: any[]): Promise | any {\n\n }\n\n protected onOpen() {}\n protected onOpenAfterTimeout() {}\n protected onClose() {}\n\n protected onCloseAfterTimeout() {\n if(this.destroyable) { // ! WARNING, пока что это будет работать только с самой последней внутренней вкладкой !\n this.slider?.deleteTab(this);\n this.container.remove();\n this.scrollable.destroy();\n this.listenerSetter?.removeAll();\n this.middlewareHelper?.destroy();\n }\n }\n\n protected setTitle(key: LangPackKey) {\n this.title.replaceChildren(i18n(key));\n }\n}\n\nexport class SliderSuperTabEventable extends SliderSuperTab {\n public eventListener: EventListenerBase<{\n destroy: () => void | Promise,\n destroyAfter: (promise: Promise) => void,\n close: () => void\n }>;\n\n constructor(slider: SidebarSlider) {\n super(slider);\n this.eventListener = new EventListenerBase();\n }\n\n onClose() {\n this.eventListener.dispatchEvent('close');\n }\n\n onCloseAfterTimeout() {\n const results = this.eventListener.dispatchResultableEvent('destroy');\n this.eventListener.dispatchEvent('destroyAfter', Promise.all(results).then(noop, noop));\n this.eventListener.cleanup();\n return super.onCloseAfterTimeout();\n }\n}\n\n/* // @ts-ignore\ninterface SliderSuperEventsTab extends SliderSuperTab, EventListenerBase<{}> {\n superConstructor: (...args: any[]) => any;\n}\nclass SliderSuperEventsTab implements SliderSuperEventsTab {\n constructor(slider: SidebarSlider) {\n this.superConstructor([slider, true]);\n }\n}\napplyMixins(SliderSuperEventsTab, [SliderSuperTab, EventListenerBase]);\n\n(window as any).lol = SliderSuperEventsTab\n\nexport {SliderSuperEventsTab}; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDialogsManager, {AppDialogsManager, DialogDom, DialogElementSize} from '../lib/appManagers/appDialogsManager';\nimport {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport isInDOM from '../helpers/dom/isInDOM';\nimport positionElementByIndex from '../helpers/dom/positionElementByIndex';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {fastRaf} from '../helpers/schedulers';\nimport SortedList, {SortedElementBase} from '../helpers/sortedList';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport getUserStatusString from './wrappers/getUserStatusString';\nimport type LazyLoadQueue from './lazyLoadQueue';\n\ninterface SortedUser extends SortedElementBase {\n dom: DialogDom\n}\n\nexport default class SortedUserList extends SortedList {\n protected static SORT_INTERVAL = 30e3;\n public list: HTMLUListElement;\n\n protected lazyLoadQueue: LazyLoadQueue;\n protected avatarSize: DialogElementSize = 'abitbigger';\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0];\n protected onListLengthChange: () => void;\n protected getIndex: (element: SortedUser) => number;\n protected onUpdate: (element: SortedUser) => void;\n protected managers: AppManagers;\n\n constructor(options: Partial<{\n lazyLoadQueue: SortedUserList['lazyLoadQueue'],\n avatarSize: SortedUserList['avatarSize'],\n rippleEnabled: SortedUserList['rippleEnabled'],\n createChatListOptions: SortedUserList['createChatListOptions'],\n autonomous: SortedUserList['autonomous'],\n onListLengthChange: SortedUserList['onListLengthChange'],\n getIndex: SortedUserList['getIndex'],\n onUpdate: SortedUserList['onUpdate']\n }> & {\n managers: SortedUserList['managers']\n }) {\n super({\n getIndex: options.getIndex || ((element) => this.managers.appUsersManager.getUserStatusForSort(element.id)),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange && this.onListLengthChange();\n },\n onUpdate: options.onUpdate || (async(element) => {\n const status = getUserStatusString(await this.managers.appUsersManager.getUser(element.id));\n replaceContent(element.dom.lastMessageSpan, status);\n }),\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength && this.onListLengthChange) {\n this.onListLengthChange();\n }\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: base.id,\n container: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n wrapOptions: {\n lazyLoadQueue: this.lazyLoadQueue\n }\n });\n\n (base as SortedUser).dom = dom;\n return base as SortedUser;\n },\n updateElementWith: fastRaf,\n updateListWith: async(callback) => {\n if(!isInDOM(this.list)) {\n return callback(false);\n }\n\n await getHeavyAnimationPromise();\n\n if(!isInDOM(this.list)) {\n return callback(false);\n }\n\n callback(true);\n }\n });\n\n safeAssign(this, options);\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n\n let timeout: number;\n const doTimeout = () => {\n timeout = window.setTimeout(() => {\n this.updateList((good) => {\n if(good) {\n doTimeout();\n }\n });\n }, SortedUserList.SORT_INTERVAL);\n };\n\n doTimeout();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {simulateClickEvent, attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport getVisibleRect from '../helpers/dom/getVisibleRect';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {makeMediaSize} from '../helpers/mediaSize';\nimport {getMiddleware, Middleware} from '../helpers/middleware';\nimport {doubleRaf} from '../helpers/schedulers';\nimport pause from '../helpers/schedulers/pause';\nimport windowSize from '../helpers/windowSize';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport getStickerEffectThumb from '../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport {CustomEmojiElement} from '../lib/richTextProcessor/wrapRichText';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../lib/rlottie/rlottiePlayer';\nimport rootScope from '../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from './animationIntersector';\nimport SetTransition from './singleTransition';\nimport wrapSticker from './wrappers/sticker';\nimport {STICKER_EFFECT_MULTIPLIER} from './wrappers/sticker';\n\nlet hasViewer = false;\nexport default function attachStickerViewerListeners({listenTo, listenerSetter, selector, findTarget: originalFindTarget}: {\n listenerSetter: ListenerSetter,\n listenTo: HTMLElement,\n selector?: string,\n findTarget?: (e: MouseEvent) => HTMLElement\n}) {\n if(IS_TOUCH_SUPPORTED) {\n return;\n }\n\n const findTarget = (e: MouseEvent, checkForParent?: boolean) => {\n let el: HTMLElement;\n if(originalFindTarget) el = originalFindTarget(e);\n else {\n const s = selector || `.media-sticker-wrapper`;\n el = (e.target as HTMLElement).closest(s) as HTMLElement;\n }\n\n return el && (!checkForParent || findUpAsChild(el, listenTo)) ? el : undefined;\n };\n\n const managers = rootScope.managers;\n\n listenerSetter.add(listenTo)('mousedown', (e) => {\n if(hasViewer || e.buttons > 1 || e.button !== 0) return;\n let mediaContainer = findTarget(e);\n if(!mediaContainer) {\n return;\n }\n\n // const img: HTMLImageElement = mediaContainer.querySelector('img.media-sticker');\n\n const docId = mediaContainer.dataset.docId;\n if(!docId) {\n return;\n }\n\n const className = 'sticker-viewer';\n const group: AnimationItemGroup = 'STICKER-VIEWER';\n const openDuration = 200;\n const switchDuration = 200;\n const previousGroup = animationIntersector.getOnlyOnePlayableGroup();\n const _middleware = getMiddleware();\n let container: HTMLElement, previousTransformer: HTMLElement;\n\n const doThatSticker = async({mediaContainer, doc, middleware, lockGroups, isSwitching}: {\n mediaContainer: HTMLElement,\n doc: MyDocument,\n middleware: Middleware,\n lockGroups?: boolean,\n isSwitching?: boolean\n }) => {\n const effectThumb = getStickerEffectThumb(doc);\n const mediaRect: DOMRect = mediaContainer.getBoundingClientRect();\n const s = makeMediaSize(doc.w, doc.h);\n const size = effectThumb ? 280 : 360;\n const boxSize = makeMediaSize(size, size);\n const fitted = mediaRect.width === mediaRect.height ? boxSize : s.aspectFitted(boxSize);\n\n const bubble = findUpClassName(mediaContainer, 'bubble');\n const isOut = bubble ? bubble.classList.contains('is-out') : true;\n\n const transformer = document.createElement('div');\n transformer.classList.add(className + '-transformer');\n\n const stickerContainer = document.createElement('div');\n stickerContainer.classList.add(className + '-sticker');\n /* transformer.style.width = */stickerContainer.style.width = fitted.width + 'px';\n /* transformer.style.height = */stickerContainer.style.height = fitted.height + 'px';\n\n const stickerEmoji = document.createElement('div');\n stickerEmoji.classList.add(className + '-emoji');\n stickerEmoji.append(wrapEmojiText(doc.stickerEmojiRaw));\n\n if(effectThumb) {\n const margin = (size * STICKER_EFFECT_MULTIPLIER - size) / 3 * (isOut ? 1 : -1);\n transformer.classList.add('has-effect');\n // const property = `--margin-${isOut ? 'right' : 'left'}`;\n // stickerContainer.style.setProperty(property, `${margin * 2}px`);\n transformer.style.setProperty('--translateX', `${margin}px`);\n stickerEmoji.style.setProperty('--translateX', `${-margin}px`);\n }\n\n const overflowElement = findUpClassName(mediaContainer, 'scrollable');\n const visibleRect = getVisibleRect(mediaContainer, overflowElement, true, mediaRect);\n if(visibleRect.overflow.vertical || visibleRect.overflow.horizontal) {\n stickerContainer.classList.add('is-overflow');\n }\n\n // if(img) {\n // const ratio = img.naturalWidth / img.naturalHeight;\n // if((mediaRect.width / mediaRect.height).toFixed(1) !== ratio.toFixed(1)) {\n\n // mediaRect = mediaRect.toJSON();\n // }\n // }\n\n const rect = mediaContainer.getBoundingClientRect();\n const scaleX = rect.width / fitted.width;\n const scaleY = rect.height / fitted.height;\n const transformX = rect.left - (windowSize.width - rect.width) / 2;\n const transformY = rect.top - (windowSize.height - rect.height) / 2;\n transformer.style.transform = `translate(${transformX}px, ${transformY}px) scale(${scaleX}, ${scaleY})`;\n if(isSwitching) transformer.classList.add('is-switching');\n transformer.append(stickerContainer, stickerEmoji);\n container.append(transformer);\n\n const o = await wrapSticker({\n doc,\n div: stickerContainer,\n group,\n width: fitted.width,\n height: fitted.height,\n play: false,\n loop: true,\n middleware,\n managers,\n needFadeIn: false,\n isOut,\n withThumb: false,\n relativeEffect: true,\n loopEffect: true\n }).then(({render}) => render);\n if(!middleware()) return;\n\n if(!container.parentElement) {\n document.body.append(container);\n }\n\n const player = Array.isArray(o) ? o[0] : o;\n\n const firstFramePromise = player instanceof RLottiePlayer ?\n new Promise((resolve) => player.addEventListener('firstFrame', resolve, {once: true})) :\n Promise.resolve();\n await Promise.all([firstFramePromise, doubleRaf()]);\n await pause(0); // ! need it because firstFrame will be called just from the loop\n if(!middleware()) return;\n\n if(lockGroups) {\n animationIntersector.setOnlyOnePlayableGroup(group);\n animationIntersector.checkAnimations2(true);\n }\n\n if(player instanceof RLottiePlayer) {\n const prevPlayer = mediaContainer instanceof CustomEmojiElement ?\n mediaContainer.player as RLottiePlayer :\n lottieLoader.getAnimation(mediaContainer);\n if(prevPlayer) {\n player.curFrame = prevPlayer.curFrame;\n player.play();\n await new Promise((resolve) => {\n let i = 0;\n const c = () => {\n if(++i === 2) {\n resolve();\n player.removeEventListener('enterFrame', c);\n }\n };\n\n player.addEventListener('enterFrame', c);\n });\n if(!middleware()) return;\n player.pause();\n }\n } else if(player instanceof HTMLVideoElement) {\n const prevPlayer = mediaContainer.querySelector('video');\n if(prevPlayer) {\n player.currentTime = prevPlayer.currentTime;\n }\n }\n\n return {\n ready: () => {\n if(player instanceof RLottiePlayer || player instanceof HTMLVideoElement) {\n player.play();\n }\n\n if(effectThumb) {\n simulateClickEvent(stickerContainer);\n }\n },\n transformer\n };\n };\n\n const timeout = window.setTimeout(async() => {\n document.removeEventListener('mousemove', onMousePreMove);\n\n container = document.createElement('div');\n container.classList.add(className);\n hasViewer = true;\n\n const middleware = _middleware.get();\n const doc = await managers.appDocsManager.getDoc(docId);\n if(!middleware()) return;\n\n let result: Awaited>;\n try {\n result = await doThatSticker({\n doc,\n mediaContainer,\n middleware,\n lockGroups: true\n });\n if(!result) return;\n } catch(err) {\n return;\n }\n\n const {ready, transformer} = result;\n\n previousTransformer = transformer;\n\n SetTransition({\n element: container,\n className: 'is-visible',\n forwards: true,\n duration: openDuration,\n onTransitionEnd: () => {\n if(!middleware()) return;\n ready();\n }\n });\n\n document.addEventListener('mousemove', onMouseMove);\n }, 125);\n\n const onMouseMove = async(e: MouseEvent) => {\n const newMediaContainer = findTarget(e, true);\n if(!newMediaContainer || mediaContainer === newMediaContainer) {\n return;\n }\n\n const docId = newMediaContainer.dataset.docId;\n if(!docId) {\n return;\n }\n\n mediaContainer = newMediaContainer;\n _middleware.clean();\n const middleware = _middleware.get();\n\n const doc = await managers.appDocsManager.getDoc(docId);\n if(!middleware()) return;\n\n let r: Awaited>;\n try {\n r = await doThatSticker({\n doc,\n mediaContainer,\n middleware,\n isSwitching: true\n });\n if(!r) return;\n } catch(err) {\n console.error('sticker viewer error', err);\n return;\n }\n\n const {ready, transformer} = r;\n\n const _previousTransformer = previousTransformer;\n SetTransition({\n element: _previousTransformer,\n className: 'is-switching',\n forwards: true,\n duration: switchDuration,\n onTransitionEnd: () => {\n _previousTransformer.remove();\n }\n });\n\n previousTransformer = transformer;\n\n SetTransition({\n element: transformer,\n className: 'is-switching',\n forwards: false,\n duration: switchDuration,\n onTransitionEnd: () => {\n if(!middleware()) return;\n ready();\n }\n });\n };\n\n const onMousePreMove = (e: MouseEvent) => {\n if(!findUpAsChild(e.target as HTMLElement, mediaContainer)) {\n onMouseUp();\n }\n };\n\n const onMouseUp = () => {\n clearTimeout(timeout);\n _middleware.clean();\n\n if(container) {\n SetTransition({\n element: container,\n className: 'is-visible',\n forwards: false,\n duration: openDuration,\n onTransitionEnd: () => {\n container.remove();\n animationIntersector.setOnlyOnePlayableGroup(previousGroup);\n animationIntersector.checkAnimations2(false);\n hasViewer = false;\n }\n });\n\n attachClickEvent(document.body, cancelEvent, {capture: true, once: true});\n }\n\n document.removeEventListener('mousemove', onMousePreMove);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp, {capture: true});\n };\n\n document.addEventListener('mousemove', onMousePreMove);\n document.addEventListener('mouseup', onMouseUp, {once: true, capture: true});\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class StickyIntersector {\n private headersObserver: IntersectionObserver;\n private elementsObserver: IntersectionObserver;\n\n constructor(private container: HTMLElement, private handler: (stuck: boolean, target: HTMLElement) => void) {\n this.observeHeaders();\n this.observeElements();\n }\n\n /**\n * Sets up an intersection observer to notify when elements with the class\n * `.sticky_sentinel--top` become visible/invisible at the top of the container.\n * @param {!Element} container\n */\n private observeHeaders() {\n this.headersObserver = new IntersectionObserver((entries) => {\n for(const entry of entries) {\n const targetInfo = entry.boundingClientRect;\n const stickyTarget = entry.target.parentElement;\n const rootBoundsInfo = entry.rootBounds;\n\n // Started sticking.\n if(targetInfo.bottom < rootBoundsInfo.top) {\n this.handler(true, stickyTarget);\n }\n\n // Stopped sticking.\n if(targetInfo.bottom >= rootBoundsInfo.top &&\n targetInfo.bottom < rootBoundsInfo.bottom) {\n this.handler(false, stickyTarget);\n }\n }\n }, {threshold: 0, root: this.container});\n }\n\n private observeElements() {\n this.elementsObserver = new IntersectionObserver((entries) => {\n const entry = entries\n .filter((entry) => entry.boundingClientRect.top < entry.rootBounds.top)\n .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top)[0];\n if(!entry) return;\n\n const container = entry.isIntersecting ? entry.target : entry.target.nextElementSibling;\n this.handler(true, container as HTMLElement);\n }, {root: this.container});\n }\n\n /**\n * @param {!Element} container\n * @param {string} className\n */\n private addSentinel(container: HTMLElement, className: string) {\n const sentinel = document.createElement('div');\n sentinel.classList.add('sticky_sentinel', className);\n return container.appendChild(sentinel);\n }\n\n /**\n * Notifies when elements w/ the `sticky` class begin to stick or stop sticking.\n * Note: the elements should be children of `container`.\n * @param {!Element} container\n */\n public observeStickyHeaderChanges(element: HTMLElement) {\n const headerSentinel = this.addSentinel(element, 'sticky_sentinel--top');\n this.headersObserver.observe(headerSentinel);\n\n this.elementsObserver.observe(element);\n }\n\n public disconnect() {\n this.headersObserver.disconnect();\n this.elementsObserver.disconnect();\n }\n\n public unobserve(element: HTMLElement, headerSentinel: HTMLElement) {\n this.elementsObserver.unobserve(element);\n this.headersObserver.unobserve(headerSentinel);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport safeAssign from '../helpers/object/safeAssign';\nimport contextMenuController from '../helpers/contextMenuController';\nimport {Middleware} from '../helpers/middleware';\nimport ListenerSetter, {Listener, ListenerOptions} from '../helpers/listenerSetter';\nimport {attachContextMenuListener} from '../helpers/dom/attachContextMenuListener';\nimport pause from '../helpers/schedulers/pause';\nimport deferredPromise from '../helpers/cancellablePromise';\n\ntype E = {\n clientX: number,\n clientY: number,\n target: EventTarget,\n button?: number\n};\n\ntype EE = E | (Exclude & {\n touches: E[]\n});\n\nconst getEvent = (e: EE) => {\n return 'touches' in e ? e.touches[0] : e;\n};\n\nconst attachGlobalListenerTo = document;\n\nlet RESET_GLOBAL = false;\ncontextMenuController.addEventListener('toggle', (visible) => {\n RESET_GLOBAL = visible;\n});\n\nexport type SwipeHandlerOptions = {\n element: SwipeHandler['element'],\n onSwipe: SwipeHandler['onSwipe'],\n verifyTouchTarget?: SwipeHandler['verifyTouchTarget'],\n onFirstSwipe?: SwipeHandler['onFirstSwipe'],\n onReset?: SwipeHandler['onReset'],\n onStart?: SwipeHandler['onStart'],\n cursor?: SwipeHandler['cursor'],\n cancelEvent?: SwipeHandler['cancelEvent'],\n listenerOptions?: SwipeHandler['listenerOptions'],\n setCursorTo?: HTMLElement,\n middleware?: Middleware,\n withDelay?: boolean\n};\n\nconst TOUCH_MOVE_OPTIONS: ListenerOptions = {passive: false};\nconst MOUSE_MOVE_OPTIONS: ListenerOptions = false as any;\n\nexport default class SwipeHandler {\n private element: HTMLElement;\n private onSwipe: (xDiff: number, yDiff: number, e: EE) => boolean | void;\n private verifyTouchTarget: (evt: EE) => boolean | Promise;\n private onFirstSwipe: (e: EE) => void;\n private onReset: () => void;\n private onStart: () => void;\n private cursor: 'grabbing' | 'move' | 'row-resize' | 'col-resize' | 'nesw-resize' | 'nwse-resize' | 'ne-resize' | 'se-resize' | 'sw-resize' | 'nw-resize' | 'n-resize' | 'e-resize' | 's-resize' | 'w-resize' | '';\n private cancelEvent: boolean;\n private listenerOptions: ListenerOptions;\n private setCursorTo: HTMLElement;\n\n private isMouseDown: boolean;\n private tempId: number;\n\n private hadMove: boolean;\n private eventUp: E;\n private xDown: number;\n private yDown: number;\n private xAdded: number;\n private yAdded: number;\n\n private withDelay: boolean;\n private listenerSetter: ListenerSetter;\n\n constructor(options: SwipeHandlerOptions) {\n safeAssign(this, options);\n\n this.cursor ??= 'grabbing';\n this.cancelEvent ??= true;\n // this.listenerOptions ??= false as any;\n this.listenerOptions ??= TOUCH_MOVE_OPTIONS;\n\n this.setCursorTo ??= this.element;\n this.listenerSetter = new ListenerSetter();\n this.setListeners();\n\n this.resetValues();\n this.tempId = 0;\n\n options.middleware?.onDestroy(() => {\n this.reset();\n this.removeListeners();\n });\n }\n\n public setListeners() {\n if(!IS_TOUCH_SUPPORTED) {\n // @ts-ignore\n this.listenerSetter.add(this.element)('mousedown', this.handleStart, this.listenerOptions);\n this.listenerSetter.add(attachGlobalListenerTo)('mouseup', this.reset);\n } else {\n if(this.withDelay) {\n attachContextMenuListener({\n element: this.element,\n callback: (e) => {\n cancelEvent(e);\n // @ts-ignore\n this.handleStart(e);\n },\n listenerSetter: this.listenerSetter,\n listenerOptions: this.listenerOptions\n });\n } else {\n // @ts-ignore\n this.listenerSetter.add(this.element)('touchstart', this.handleStart, this.listenerOptions);\n }\n\n this.listenerSetter.add(attachGlobalListenerTo)('touchend', this.reset);\n }\n }\n\n public removeListeners() {\n this.listenerSetter.removeAll();\n }\n\n public setCursor(cursor: SwipeHandler['cursor'] = '') {\n this.cursor = cursor;\n\n if(!IS_TOUCH_SUPPORTED && this.hadMove) {\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\n }\n }\n\n public add(x: number, y: number) {\n this.xAdded = x;\n this.yAdded = y;\n this.handleMove({\n clientX: this.eventUp.clientX,\n clientY: this.eventUp.clientY,\n target: this.eventUp.target\n });\n }\n\n protected resetValues() {\n ++this.tempId;\n this.hadMove = false;\n this.xAdded = this.yAdded = 0;\n this.xDown =\n this.yDown =\n this.eventUp =\n this.isMouseDown =\n undefined;\n }\n\n protected reset = (e?: Event) => {\n /* if(e) {\n cancelEvent(e);\n } */\n\n if(IS_TOUCH_SUPPORTED) {\n this.listenerSetter.removeManual(attachGlobalListenerTo, 'touchmove', this.handleMove, TOUCH_MOVE_OPTIONS);\n } else {\n this.listenerSetter.removeManual(attachGlobalListenerTo, 'mousemove', this.handleMove, MOUSE_MOVE_OPTIONS);\n this.setCursorTo.style.cursor = '';\n }\n\n if(this.hadMove) {\n this.onReset?.();\n }\n\n this.resetValues();\n };\n\n protected handleStart = async(_e: EE) => {\n if(this.isMouseDown) {\n return;\n }\n\n const e = getEvent(_e);\n if(Math.max(0, e.button ?? 0) !== 0) {\n return;\n }\n\n if(this.verifyTouchTarget && !(await this.verifyTouchTarget(_e))) {\n return this.reset();\n }\n\n const tempId = ++this.tempId;\n this.isMouseDown = true;\n\n if(this.withDelay && !IS_TOUCH_SUPPORTED) {\n const options = {...MOUSE_MOVE_OPTIONS, once: true};\n const deferred = deferredPromise();\n const cb = () => deferred.resolve();\n const listener = this.listenerSetter.add(attachGlobalListenerTo)('mousemove', cb, options) as any as Listener;\n\n await Promise.race([\n pause(300),\n deferred\n ]);\n\n deferred.resolve();\n this.listenerSetter.remove(listener);\n\n if(this.tempId !== tempId) {\n return;\n }\n }\n\n this.xDown = e.clientX;\n this.yDown = e.clientY;\n this.eventUp = e;\n\n if(IS_TOUCH_SUPPORTED) {\n // @ts-ignore\n this.listenerSetter.add(attachGlobalListenerTo)('touchmove', this.handleMove, TOUCH_MOVE_OPTIONS);\n } else {\n // @ts-ignore\n this.listenerSetter.add(attachGlobalListenerTo)('mousemove', this.handleMove, MOUSE_MOVE_OPTIONS);\n }\n\n if(this.onStart) {\n this.onStart();\n\n // have to initiate move instantly\n this.hadMove = true;\n this.handleMove(e);\n }\n };\n\n protected handleMove = (_e: EE) => {\n if(this.xDown === undefined || this.yDown === undefined || RESET_GLOBAL) {\n this.reset();\n return;\n }\n\n if(this.cancelEvent) {\n cancelEvent(_e as any);\n }\n\n const e = this.eventUp = getEvent(_e);\n const xUp = e.clientX;\n const yUp = e.clientY;\n\n const xDiff = xUp - this.xDown + this.xAdded;\n const yDiff = yUp - this.yDown + this.yAdded;\n\n if(!this.hadMove) {\n if(!xDiff && !yDiff) {\n return;\n }\n\n this.hadMove = true;\n\n if(!IS_TOUCH_SUPPORTED) {\n this.setCursorTo.style.setProperty('cursor', this.cursor, 'important');\n }\n\n this.onFirstSwipe?.(_e);\n }\n\n const onSwipeResult = this.onSwipe(xDiff, yDiff, _e);\n if(onSwipeResult !== undefined && onSwipeResult) {\n this.reset();\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport placeCaretAtEnd from '../helpers/dom/placeCaretAtEnd';\nimport {formatPhoneNumber} from '../helpers/formatPhoneNumber';\nimport {IS_APPLE, IS_ANDROID, IS_APPLE_MOBILE} from '../environment/userAgent';\nimport {HelpCountry, HelpCountryCode} from '../layer';\nimport InputField, {InputFieldOptions} from './inputField';\n\nexport default class TelInputField extends InputField {\n private pasted = false;\n public lastValue = '';\n\n constructor(options: InputFieldOptions & {\n onInput?: (formatted: ReturnType) => void\n } = {}) {\n super({\n label: 'Contacts.PhoneNumber.Placeholder',\n // plainText: true,\n name: 'phone',\n ...options\n });\n\n this.container.classList.add('input-field-phone');\n\n const telEl = this.input;\n if(telEl instanceof HTMLInputElement) {\n telEl.type = 'tel';\n telEl.autocomplete = 'rr55RandomRR55';\n } else {\n telEl.inputMode = 'decimal';\n\n const pixelRatio = window.devicePixelRatio;\n if(pixelRatio > 1) {\n let letterSpacing: number;\n if(IS_APPLE) {\n letterSpacing = pixelRatio * -.16;\n } else if(IS_ANDROID) {\n letterSpacing = 0;\n }\n\n telEl.style.setProperty('--letter-spacing', letterSpacing + 'px');\n }\n\n const originalFunc = this.setValueSilently.bind(this);\n this.setValueSilently = (value) => {\n originalFunc(value);\n placeCaretAtEnd(this.input, true);\n };\n }\n\n telEl.addEventListener('input', () => {\n // console.log('input', this.value);\n telEl.classList.remove('error');\n\n const value = this.value;\n const diff = Math.abs(value.length - this.lastValue.length);\n if(diff > 1 && !this.pasted && IS_APPLE_MOBILE) {\n this.setValueSilently(this.lastValue + value);\n }\n\n this.pasted = false;\n\n this.setLabel();\n\n let formattedPhoneNumber: ReturnType;\n let formatted: string, country: HelpCountry, countryCode: HelpCountryCode, leftPattern = '';\n if(this.value.replace(/\\++/, '+') === '+') {\n this.setValueSilently('+');\n } else {\n formattedPhoneNumber = formatPhoneNumber(this.value);\n formatted = formattedPhoneNumber.formatted;\n country = formattedPhoneNumber.country;\n leftPattern = formattedPhoneNumber.leftPattern;\n countryCode = formattedPhoneNumber.code;\n this.setValueSilently(this.lastValue = formatted ? '+' + formatted : '');\n }\n\n telEl.dataset.leftPattern = leftPattern/* .replace(/X/g, '0') */;\n\n // console.log(formatted, country);\n\n options.onInput && options.onInput(formattedPhoneNumber);\n });\n\n telEl.addEventListener('paste', () => {\n this.pasted = true;\n // console.log('paste', telEl.value);\n });\n\n /* telEl.addEventListener('change', (e) => {\n console.log('change', telEl.value);\n }); */\n\n telEl.addEventListener('keypress', (e) => {\n // console.log('keypress', this.value);\n const key = e.key;\n if(/\\D/.test(key) && !(e.metaKey || e.ctrlKey) && key !== 'Backspace' && !(key === '+' && e.shiftKey/* && !this.value */)) {\n e.preventDefault();\n return false;\n }\n });\n\n /* telEl.addEventListener('focus', function(this: typeof telEl, e) {\n this.removeAttribute('readonly'); // fix autocomplete\n });*/\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../helpers/dom/replaceContent';\nimport OverlayClickHandler from '../helpers/overlayClickHandler';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\n\nconst toastEl = document.createElement('div');\ntoastEl.classList.add('toast');\nlet timeout: number;\n\nconst x = new OverlayClickHandler('toast');\nx.addEventListener('toggle', (open) => {\n if(!open) {\n hideToast();\n }\n});\n\nexport function hideToast() {\n x.close();\n\n toastEl.classList.remove('is-visible');\n timeout && clearTimeout(+timeout);\n\n timeout = window.setTimeout(() => {\n toastEl.remove();\n timeout = undefined;\n }, 200);\n}\n\nexport function toast(content: string | Node, onClose?: () => void) {\n x.close();\n\n replaceContent(toastEl, content);\n\n if(!toastEl.parentElement) {\n document.body.append(toastEl);\n void toastEl.offsetLeft; // reflow\n }\n\n toastEl.classList.add('is-visible');\n\n timeout && clearTimeout(+timeout);\n x.open(toastEl);\n\n timeout = window.setTimeout(hideToast, 3000);\n\n if(onClose) {\n x.addEventListener('toggle', onClose, {once: true});\n }\n}\n\nexport function toastNew(options: Partial<{\n langPackKey: LangPackKey,\n langPackArguments: FormatterArguments,\n onClose: () => void\n}>) {\n toast(i18n(options.langPackKey, options.langPackArguments), options.onClose);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../lib/rootScope';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {dispatchHeavyAnimationEvent} from '../hooks/useHeavyAnimationCheck';\nimport whichChild from '../helpers/dom/whichChild';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\n\nfunction makeTransitionFunction(options: TransitionFunction) {\n return options;\n}\n\nconst slideNavigation = makeTransitionFunction({\n callback: (tabContent, prevTabContent, toRight) => {\n const width = prevTabContent.getBoundingClientRect().width;\n const elements = [tabContent, prevTabContent];\n if(toRight) elements.reverse();\n elements[0].style.filter = `brightness(80%)`;\n elements[0].style.transform = `translate3d(${-width * .25}px, 0, 0)`;\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n tabContent.style.filter = '';\n\n return () => {\n prevTabContent.style.transform = prevTabContent.style.filter = '';\n };\n },\n animateFirst: false\n});\n\nconst slideTabs = makeTransitionFunction({\n callback: (tabContent, prevTabContent, toRight) => {\n // Jolly Cobra's // Workaround for scrollable content flickering during animation.\n // const scrollableContainer = findUpClassName(tabContent, 'scrollable-y');\n // if(scrollableContainer && scrollableContainer.style.overflowY !== 'hidden') {\n // // const scrollBarWidth = scrollableContainer.offsetWidth - scrollableContainer.clientWidth;\n // scrollableContainer.style.overflowY = 'hidden';\n // // scrollableContainer.style.paddingRight = `${scrollBarWidth}px`;\n // // this.container.classList.add('sliding');\n // }\n\n // window.requestAnimationFrame(() => {\n const width = prevTabContent.getBoundingClientRect().width;\n /* tabContent.style.setProperty('--width', width + 'px');\n prevTabContent.style.setProperty('--width', width + 'px');\n\n tabContent.classList.add('active'); */\n // void tabContent.offsetWidth; // reflow\n const elements = [tabContent, prevTabContent];\n if(toRight) elements.reverse();\n elements[0].style.transform = `translate3d(${-width}px, 0, 0)`;\n elements[1].style.transform = `translate3d(${width}px, 0, 0)`;\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n // });\n\n return () => {\n prevTabContent.style.transform = '';\n\n // if(scrollableContainer) {\n // // Jolly Cobra's // Workaround for scrollable content flickering during animation.\n // if(isSafari) { // ! safari doesn't respect sticky header, so it flicks when overflow is changing\n // scrollableContainer.style.display = 'none';\n // }\n\n // scrollableContainer.style.overflowY = '';\n\n // if(isSafari) {\n // void scrollableContainer.offsetLeft; // reflow\n // scrollableContainer.style.display = '';\n // }\n\n // // scrollableContainer.style.paddingRight = '0';\n // // this.container.classList.remove('sliding');\n // }\n };\n },\n animateFirst: false\n});\n\nconst slideTopics = makeTransitionFunction({\n callback: (tabContent, prevTabContent) => {\n const rect = tabContent.getBoundingClientRect();\n const offsetX = rect.width - 80;\n\n tabContent.style.transform = `transformX(${offsetX}px)`;\n\n tabContent.classList.add('active');\n void tabContent.offsetWidth; // reflow\n\n tabContent.style.transform = '';\n\n return () => {};\n },\n animateFirst: true\n});\n\nconst transitions: {[type in TransitionSliderType]?: TransitionFunction} = {\n navigation: slideNavigation,\n tabs: slideTabs\n // topics: slideTopics\n};\n\ntype TransitionSliderType = 'tabs' | 'navigation' | 'zoom-fade' | 'slide-fade' | 'topics' | 'none'/* | 'counter' */;\n\ntype TransitionSliderOptions = {\n content: HTMLElement,\n type: TransitionSliderType,\n transitionTime: number,\n onTransitionEnd?: (id: number) => void,\n isHeavy?: boolean,\n once?: boolean,\n withAnimationListener?: boolean,\n listenerSetter?: ListenerSetter,\n animateFirst?: boolean\n};\n\ntype TransitionFunction = {\n callback: (tabContent: HTMLElement, prevTabContent: HTMLElement, toRight: boolean) => () => void,\n animateFirst: boolean\n};\n\nconst TransitionSlider = (options: TransitionSliderOptions) => {\n let {\n content,\n type,\n transitionTime,\n onTransitionEnd,\n isHeavy = true,\n once = false,\n withAnimationListener = true,\n listenerSetter,\n animateFirst = false\n } = options;\n\n const {callback: animationFunction, animateFirst: _animateFirst} = transitions[type] || {};\n content.dataset.animation = type;\n\n if(_animateFirst !== undefined) {\n animateFirst = _animateFirst;\n }\n\n const onTransitionEndCallbacks: Map = new Map();\n let animationDeferred: CancellablePromise;\n // let animationStarted = 0;\n let from: HTMLElement = null;\n\n if(withAnimationListener) {\n const listenerName = animationFunction ? 'transitionend' : 'animationend';\n\n const onEndEvent = (e: TransitionEvent | AnimationEvent) => {\n cancelEvent(e);\n\n if((e.target as HTMLElement).parentElement !== content) {\n return;\n }\n\n // console.log('Transition: transitionend', /* content, */ e, selectTab.prevId, performance.now() - animationStarted);\n\n const callback = onTransitionEndCallbacks.get(e.target as HTMLElement);\n callback?.();\n\n if(e.target !== from) {\n return;\n }\n\n if(!animationDeferred && isHeavy) return;\n\n if(animationDeferred) {\n animationDeferred.resolve();\n animationDeferred = undefined;\n }\n\n onTransitionEnd?.(selectTab.prevId());\n\n content.classList.remove('animating', 'backwards', 'disable-hover');\n\n if(once) {\n if(listenerSetter) listenerSetter.removeManual(content, listenerName, onEndEvent);\n else content.removeEventListener(listenerName, onEndEvent/* , {capture: false} */);\n from = animationDeferred = undefined;\n onTransitionEndCallbacks.clear();\n }\n };\n\n // TODO: check for transition type (transform, etc) using by animationFunction\n if(listenerSetter) listenerSetter.add(content)(listenerName, onEndEvent);\n else content.addEventListener(listenerName, onEndEvent/* , {passive: true, capture: false} */);\n }\n\n function selectTab(id: number | HTMLElement, animate = true, overrideFrom?: typeof from) {\n if(overrideFrom) {\n from = overrideFrom;\n }\n\n if(id instanceof HTMLElement) {\n id = whichChild(id);\n }\n\n const prevId = selectTab.prevId();\n if(id === prevId) return false;\n\n // console.log('selectTab id:', id);\n\n const to = content.children[id] as HTMLElement;\n\n if(!rootScope.settings.animationsEnabled || (prevId === -1 && !animateFirst)) {\n animate = false;\n }\n\n if(!withAnimationListener) {\n const timeout = content.dataset.timeout;\n if(timeout !== undefined) {\n clearTimeout(+timeout);\n }\n\n delete content.dataset.timeout;\n }\n\n if(!animate) {\n if(from) from.classList.remove('active', 'to', 'from');\n else if(to) { // fix instant opening back from closed slider (e.g. instant closening and opening right sidebar)\n const callback = onTransitionEndCallbacks.get(to);\n callback?.();\n }\n\n if(to) {\n to.classList.remove('to', 'from');\n to.classList.add('active');\n }\n\n content.classList.remove('animating', 'backwards', 'disable-hover');\n\n from = to;\n\n onTransitionEnd?.(id);\n return;\n }\n\n if(!withAnimationListener) {\n content.dataset.timeout = '' + window.setTimeout(() => {\n to.classList.remove('to');\n from && from.classList.remove('from');\n content.classList.remove('animating', 'backwards', 'disable-hover');\n delete content.dataset.timeout;\n }, transitionTime);\n }\n\n if(from) {\n from.classList.remove('to');\n from.classList.add('from');\n }\n\n content.classList.add('animating'/* , 'disable-hover' */);\n const toRight = prevId < id;\n content.classList.toggle('backwards', !toRight);\n\n let onTransitionEndCallback: ReturnType;\n if(!to) {\n // prevTabContent.classList.remove('active');\n } else {\n if(animationFunction) {\n onTransitionEndCallback = animationFunction(to, from, toRight);\n } else {\n to.classList.add('active');\n }\n\n to.classList.remove('from');\n to.classList.add('to');\n }\n\n if(to) {\n const transitionTimeout = to.dataset.transitionTimeout;\n if(transitionTimeout) {\n clearTimeout(+transitionTimeout);\n }\n\n onTransitionEndCallbacks.set(to, () => {\n to.classList.remove('to');\n onTransitionEndCallbacks.delete(to);\n });\n }\n\n if(from/* && false */) {\n let timeout: number;\n const _from = from;\n const callback = () => {\n clearTimeout(timeout);\n _from.classList.remove('active', 'from');\n\n onTransitionEndCallback?.();\n\n onTransitionEndCallbacks.delete(_from);\n };\n\n if(to) {\n timeout = window.setTimeout(callback, transitionTime + 100); // something happened to container\n onTransitionEndCallbacks.set(_from, callback);\n } else {\n timeout = window.setTimeout(callback, transitionTime);\n onTransitionEndCallbacks.set(_from, () => {\n clearTimeout(timeout);\n onTransitionEndCallbacks.delete(_from);\n });\n }\n\n _from.dataset.transitionTimeout = '' + timeout;\n\n if(isHeavy) {\n if(!animationDeferred) {\n animationDeferred = deferredPromise();\n // animationStarted = performance.now();\n }\n\n dispatchHeavyAnimationEvent(animationDeferred, transitionTime * 2);\n }\n }\n\n from = to;\n }\n\n // selectTab.prevId = -1;\n selectTab.prevId = () => from ? whichChild(from) : -1;\n selectTab.getFrom = () => from;\n selectTab.setFrom = (_from: HTMLElement) => from = _from;\n\n return selectTab;\n};\n\nexport default TransitionSlider;\n","export default function isUsernameValid(username: string) {\n return ((username.length >= 3 && username.length <= 32) || !username.length) && /^[a-zA-Z0-9_]*$/.test(username);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ListenerSetter from '../helpers/listenerSetter';\nimport debounce from '../helpers/schedulers/debounce';\nimport {LangPackKey} from '../lib/langPack';\nimport InputField, {InputFieldOptions, InputState} from './inputField';\nimport isUsernameValid from '../lib/richTextProcessor/isUsernameValid';\nimport {AppManagers} from '../lib/appManagers/managers';\n\nexport class UsernameInputField extends InputField {\n private checkUsernamePromise: Promise;\n private checkUsernameDebounced: (username: string) => void;\n public options: InputFieldOptions & {\n peerId?: PeerId,\n listenerSetter: ListenerSetter,\n onChange?: () => void,\n invalidText: LangPackKey,\n takenText: LangPackKey,\n availableText: LangPackKey,\n head?: string\n };\n public error: ApiError;\n\n constructor(\n options: UsernameInputField['options'],\n private managers: AppManagers\n ) {\n super(options);\n\n this.checkUsernameDebounced = debounce(this.checkUsername.bind(this), 150, false, true);\n\n options.listenerSetter.add(this.input)('input', () => {\n const value = this.getValue();\n\n this.error = undefined;\n if(value === this.originalValue || !value.length) {\n this.setState(InputState.Neutral);\n this.options.onChange?.();\n return;\n } else if(!isUsernameValid(value)) { // does not check the last underscore\n this.setError(this.options.invalidText);\n } else {\n this.setState(InputState.Neutral);\n }\n\n if(this.input.classList.contains('error')) {\n this.options.onChange?.();\n return;\n }\n\n this.checkUsernameDebounced(value);\n });\n }\n\n public getValue() {\n let value = this.value;\n if(this.options.head) {\n value = value.slice(this.options.head.length);\n this.setValueSilently(this.options.head + value);\n }\n\n return value;\n }\n\n private checkUsername(username: string) {\n if(this.checkUsernamePromise) return;\n\n this.error = undefined;\n let checkPromise: Promise\n if(this.options.peerId) {\n checkPromise = this.managers.appChatsManager.checkUsername(this.options.peerId.toChatId(), username);\n } else {\n checkPromise = this.managers.appUsersManager.checkUsername(username);\n }\n\n const promise = this.checkUsernamePromise = checkPromise.then((available) => {\n if(this.getValue() !== username) return;\n\n if(available) {\n this.setState(InputState.Valid, this.options.availableText);\n } else {\n this.setError(this.options.takenText);\n }\n }, (err) => {\n if(this.getValue() !== username) return;\n\n this.error = err;\n switch((err as ApiError).type) {\n case 'USERNAME_PURCHASE_AVAILABLE': {\n this.setError(this.options.takenText);\n break;\n }\n\n case 'USERNAME_INVALID':\n default: {\n this.setError(this.options.invalidText);\n break;\n }\n }\n }).then(() => {\n if(this.checkUsernamePromise === promise) {\n this.checkUsernamePromise = undefined;\n }\n\n this.options.onChange?.();\n\n const value = this.getValue();\n if(value !== username && this.isValidToChange() && isUsernameValid(value)) {\n this.checkUsername(value);\n }\n });\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport findUpAsChild from '../helpers/dom/findUpAsChild';\nimport placeCaretAtEnd from '../helpers/dom/placeCaretAtEnd';\nimport positionElementByIndex from '../helpers/dom/positionElementByIndex';\nimport Sortable from '../helpers/dom/sortable';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport {Middleware} from '../helpers/middleware';\nimport noop from '../helpers/noop';\nimport SortedList, {SortedElementBase} from '../helpers/sortedList';\nimport {Chat, User, Username} from '../layer';\nimport {i18n, LangPackKey} from '../lib/langPack';\nimport rootScope from '../lib/rootScope';\nimport confirmationPopup from './confirmationPopup';\nimport Row from './row';\nimport SettingSection from './settingSection';\nimport {UsernameInputField} from './usernameInputField';\n\nexport default class UsernamesSection extends SettingSection {\n // public section: SettingSection;\n\n constructor(options: {\n peerId: PeerId,\n peer: Chat.channel | User.user,\n listenerSetter: ListenerSetter,\n usernameInputField: UsernameInputField,\n middleware: Middleware\n }) {\n /* const section = this.section = new SettingSection */super({\n name: 'UsernamesProfileHeader',\n caption: !options.peerId.isUser() ? 'UsernamesChannelHelp' : 'UsernamesProfileHelp'\n });\n\n const {peerId, peer, usernameInputField, listenerSetter, middleware} = options;\n const managers = rootScope.managers;\n const channelId = peerId.isUser() ? undefined : peerId.toChatId();\n\n const section = this;\n\n const CLASS_NAME = 'usernames';\n const list = document.createElement('div');\n list.classList.add(CLASS_NAME);\n\n let _usernames: Username[];\n\n interface SortedUsername extends SortedElementBase {\n row: Row\n }\n\n const sortedList = new SortedList({\n getIndex: (element) => _usernames.length - _usernames.findIndex((username) => username.username === element.id),\n onDelete: (element) => {\n element.row.container.remove();\n },\n onSort: (element, idx) => {\n positionElementByIndex(element.row.container, list, idx);\n },\n onElementCreate: (base) => {\n const username = _usernames.find((username) => username.username === base.id);\n const row = new Row({\n title: '@' + username.username,\n subtitle: true,\n clickable: true\n });\n\n const editable = !!username.pFlags.editable;\n const active = !!username.pFlags.active;\n\n if(editable) row.container.dataset.editable = '1';\n row.container.dataset.username = username.username;\n row.container.classList.add(CLASS_NAME + '-username');\n row.subtitle.classList.add(CLASS_NAME + '-username-status');\n const media = row.createMedia('medium');\n media.classList.add(CLASS_NAME + '-username-icon', 'tgico');\n\n row.makeSortable();\n\n changeActive(row, active);\n\n (base as SortedUsername).row = row;\n\n return base as SortedUsername;\n }\n });\n\n const changeActive = (row: Row, active: boolean) => {\n row.subtitle.replaceChildren(i18n(row.container.dataset.editable ? 'UsernameLinkEditable' : (active ? 'UsernameLinkActive' : 'UsernameLinkInactive')));\n row.container.classList.toggle('active', active);\n row.toggleSorting(active);\n };\n\n const applyUsernames = (usernames: Username[] = []) => {\n _usernames = usernames;\n\n sortedList.getAll().forEach((element) => {\n if(!usernames.some((username) => username.username === element.id)) {\n sortedList.delete(element.id);\n }\n });\n\n usernames.forEach((username) => {\n if(!sortedList.has(username.username)) {\n sortedList.add(username.username);\n } else {\n const element = sortedList.get(username.username);\n sortedList.update(username.username, element);\n changeActive(element.row, !!username.pFlags.active);\n }\n });\n\n section.container.classList.toggle('hide', !sortedList.getAll().size);\n };\n\n applyUsernames(peer.usernames);\n\n listenerSetter.add(rootScope)('peer_title_edit', async({peerId: _peerId}) => {\n if(_peerId !== peerId) {\n return;\n }\n\n const peer = await managers.appPeersManager.getPeer(peerId);\n applyUsernames((peer as User.user).usernames);\n });\n\n let cancelClick = false;\n attachClickEvent(list, async(e) => {\n if(cancelClick) {\n cancelClick = false;\n return;\n }\n\n const container = findUpAsChild(e.target as HTMLElement, list);\n if(!container) {\n return;\n }\n\n if(container.dataset.editable) {\n placeCaretAtEnd(usernameInputField.input, true, true);\n return;\n }\n\n const username = container.dataset.username;\n\n const active = container.classList.contains('active');\n let titleLangKey: LangPackKey, descriptionLangKey: LangPackKey;\n if(active) {\n titleLangKey = 'UsernameDeactivateLink';\n descriptionLangKey = channelId ? 'UsernameDeactivateLinkChannelMessage' : 'UsernameDeactivateLinkProfileMessage';\n } else {\n titleLangKey = 'UsernameActivateLink';\n descriptionLangKey = channelId ? 'UsernameActivateLinkChannelMessage' : 'UsernameActivateLinkProfileMessage';\n }\n\n try {\n await confirmationPopup({\n titleLangKey,\n descriptionLangKey,\n button: {\n langKey: active ? 'Hide' : 'Show'\n }\n });\n } catch(err) {\n return;\n }\n\n const newActive = !active;\n let promise: Promise;\n if(channelId) {\n promise = managers.appChatsManager.toggleUsername(channelId, username, newActive);\n } else {\n promise = managers.appUsersManager.toggleUsername(username, newActive);\n }\n\n promise.catch((err: ApiError) => {\n if(err.type === 'USERNAMES_ACTIVE_TOO_MUCH') {\n confirmationPopup({\n titleLangKey: 'UsernameActivateErrorTitle',\n descriptionLangKey: 'UsernameActivateErrorMessage',\n button: {langKey: 'OK', isCancel: true}\n }).catch(noop);\n } else {\n console.error('turn username error', err);\n }\n });\n });\n\n new Sortable({\n list,\n middleware,\n onSort: (idx, newIdx) => {\n const username = _usernames.splice(idx, 1)[0];\n _usernames.splice(newIdx, 0, username);\n sortedList.updateList();\n // can't just update particular element, have to change indexes\n // sortedList.update(username.username);\n\n const usernames = _usernames.filter((username) => username.pFlags.active).map((username) => username.username);\n if(channelId) {\n managers.appChatsManager.reorderUsernames(channelId, usernames);\n } else {\n managers.appUsersManager.reorderUsernames(usernames);\n }\n }\n });\n\n section.content.append(list);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\ntype TargetType = HTMLElement;\nexport type OnVisibilityChangeItem = {target: TargetType, visible: boolean, entry: IntersectionObserverEntry, index: number};\nexport type OnVisibilityChange = (item: OnVisibilityChangeItem) => void;\n\nexport default class VisibilityIntersector {\n private observer: IntersectionObserver;\n private items: Map = new Map();\n private locked = false;\n\n constructor(onVisibilityChange: OnVisibilityChange, options?: IntersectionObserverInit) {\n this.observer = new IntersectionObserver((entries) => {\n if(this.locked) {\n return;\n }\n\n const changed: OnVisibilityChangeItem[] = [];\n\n entries.forEach((entry, index) => {\n const target = entry.target as TargetType;\n\n if(this.items.get(target) === entry.isIntersecting) {\n return;\n } else {\n this.items.set(target, entry.isIntersecting);\n }\n\n /* if(entry.isIntersecting) {\n console.log('ooo', entry);\n } */\n\n /* if(this.locked) {\n return;\n } */\n\n const change: typeof changed[0] = {target, visible: entry.isIntersecting, entry, index};\n\n // ! order will be incorrect so can't use it\n // changed[entry.isIntersecting ? 'unshift' : 'push'](change);\n changed.push(change);\n\n // onVisibilityChange(target, entry.isIntersecting);\n });\n\n changed.forEach((item) => {\n onVisibilityChange(item);\n });\n }, options);\n }\n\n public getVisible() {\n const items: TargetType[] = [];\n this.items.forEach((value, key) => {\n if(value) {\n items.push(key);\n }\n });\n\n return items;\n }\n\n public clearVisible() {\n const visible = this.getVisible();\n for(const target of visible) {\n this.items.set(target, false);\n }\n }\n\n public isVisible(target: TargetType) {\n return this.items.get(target);\n }\n\n public disconnect() {\n this.observer.disconnect();\n this.items.clear();\n }\n\n public refresh() {\n this.observer.disconnect();\n\n // window.requestAnimationFrame(() => {\n const targets = [...this.items.keys()];\n for(const target of targets) {\n // this.items.set(target, false);\n this.observer.observe(target);\n }\n // });\n }\n\n public refreshVisible() {\n const visible = this.getVisible();\n for(const target of visible) {\n this.observer.unobserve(target);\n }\n\n for(const target of visible) {\n this.observer.observe(target);\n }\n }\n\n public observe(target: TargetType) {\n this.items.set(target, false);\n this.observer.observe(target);\n }\n\n public unobserve(target: TargetType) {\n this.observer.unobserve(target);\n this.items.delete(target);\n }\n\n public unlock() {\n this.locked = false;\n }\n\n public unlockAndRefresh() {\n this.unlock();\n this.refresh();\n }\n\n public lock() {\n this.locked = true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport rootScope from '../lib/rootScope';\nimport appMediaPlaybackController from './appMediaPlaybackController';\nimport RangeSelector from './rangeSelector';\n\nexport default class VolumeSelector extends RangeSelector {\n private static ICONS = ['volume_off', 'volume_mute', 'volume_down', 'volume_up'];\n public btn: HTMLElement;\n protected icon: HTMLSpanElement;\n\n constructor(protected listenerSetter: ListenerSetter, protected vertical = false) {\n super({\n step: 0.01,\n min: 0,\n max: 1,\n vertical\n }, 1);\n\n this.setListeners();\n this.setHandlers({\n onScrub: currentTime => {\n const value = Math.max(Math.min(currentTime, 1), 0);\n\n // console.log('volume scrub:', currentTime, value);\n\n appMediaPlaybackController.muted = false;\n appMediaPlaybackController.volume = value;\n }\n\n /* onMouseUp: (e) => {\n cancelEvent(e.event);\n } */\n });\n\n const className = 'player-volume';\n const btn = this.btn = document.createElement('div');\n btn.classList.add('btn-icon', className);\n const icon = this.icon = document.createElement('span');\n icon.classList.add(className + '__icon');\n\n btn.append(icon, this.container);\n\n attachClickEvent(icon, this.onMuteClick, {listenerSetter: this.listenerSetter});\n this.listenerSetter.add(appMediaPlaybackController)('playbackParams', this.setVolume);\n\n this.setVolume();\n }\n\n private onMuteClick = (e?: Event) => {\n e && cancelEvent(e);\n appMediaPlaybackController.muted = !appMediaPlaybackController.muted;\n };\n\n public setVolume = () => {\n // const volume = video.volume;\n const {volume, muted} = appMediaPlaybackController;\n let d: string;\n let iconIndex: number;\n if(!volume || muted) {\n iconIndex = 0;\n } else if(volume > .5) {\n iconIndex = 3;\n } else if(volume > 0 && volume < .25) {\n iconIndex = 1;\n } else {\n iconIndex = 2;\n }\n\n VolumeSelector.ICONS.forEach((icon) => this.icon.classList.remove('tgico-' + icon));\n this.icon.classList.add('tgico-' + VolumeSelector.ICONS[iconIndex]);\n\n if(!this.mousedown) {\n this.setProgress(muted ? 0 : volume);\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapCustomEmoji({\n docIds,\n loadPromises,\n middleware,\n lazyLoadQueue,\n customEmojiSize,\n animationGroup\n}: {\n docIds: DocId[],\n loadPromises?: Promise[]\n} & WrapSomethingOptions) {\n const text = ' '.repeat(docIds.length);\n const entities: MessageEntity[] = [];\n docIds.forEach((docId, idx) => {\n entities.push({\n _: 'messageEntityCustomEmoji',\n offset: idx,\n length: 1,\n document_id: docId\n });\n });\n\n const wrapped = wrapRichText(text, {\n entities,\n loadPromises,\n animationGroup,\n customEmojiSize,\n middleware,\n lazyLoadQueue\n });\n\n return wrapped;\n}\n\nexport function wrapCustomEmojiAwaited(options: Parameters[0]) {\n const loadPromises: Promise[] = options.loadPromises ??= [];\n const wrapped = wrapCustomEmoji(options);\n return Promise.all(loadPromises).then(() => wrapped);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {clearBadCharsAndTrim} from '../../helpers/cleanSearchText';\nimport {formatFullSentTime} from '../../helpers/date';\nimport {simulateClickEvent, attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport formatBytes from '../../helpers/formatBytes';\nimport {MediaSizeType} from '../../helpers/mediaSizes';\nimport noop from '../../helpers/noop';\nimport {Message, MessageMedia, WebPage} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager, {Progress} from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getDownloadMediaDetails from '../../lib/appManagers/utils/download/getDownloadMediaDetails';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport {joinElementsWith} from '../../lib/langPack';\nimport {MAX_FILE_SAVE_SIZE} from '../../lib/mtproto/mtproto_config';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport rootScope from '../../lib/rootScope';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport {MediaSearchContext} from '../appMediaPlaybackController';\nimport AudioElement from '../audio';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport {MiddleEllipsisElement} from '../middleEllipsis';\nimport ProgressivePreloader from '../preloader';\nimport wrapPhoto from './photo';\nimport wrapSenderToPeer from './senderToPeer';\nimport wrapSentTime from './sentTime';\n\nrootScope.addEventListener('document_downloading', (docId) => {\n const elements = Array.from(document.querySelectorAll(`.document[data-doc-id=\"${docId}\"]`)) as HTMLElement[];\n elements.forEach((element) => {\n if(element.querySelector('.preloader-container.manual')) {\n simulateClickEvent(element);\n }\n });\n});\n\nexport default async function wrapDocument({message, withTime, fontWeight, voiceAsMusic, showSender, searchContext, loadPromises, autoDownloadSize, lazyLoadQueue, sizeType, managers = rootScope.managers, cacheContext, fontSize}: {\n message: Message.message,\n withTime?: boolean,\n fontWeight?: number,\n voiceAsMusic?: boolean,\n showSender?: boolean,\n searchContext?: MediaSearchContext,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n lazyLoadQueue?: LazyLoadQueue,\n sizeType?: MediaSizeType,\n managers?: AppManagers,\n cacheContext?: ThumbCache,\n fontSize?: number\n}): Promise {\n fontWeight ??= 500;\n sizeType ??= '' as any;\n fontSize ??= 0;\n const noAutoDownload = autoDownloadSize === 0;\n\n const doc = ((message.media as MessageMedia.messageMediaDocument).document || ((message.media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage).document) as MyDocument;\n const uploadFileName = message?.uploadingFileName;\n if(doc.type === 'audio' || doc.type === 'voice' || doc.type === 'round') {\n const audioElement = new AudioElement();\n audioElement.withTime = withTime;\n audioElement.message = message;\n audioElement.noAutoDownload = noAutoDownload;\n audioElement.lazyLoadQueue = lazyLoadQueue;\n audioElement.loadPromises = loadPromises;\n\n if(voiceAsMusic) audioElement.voiceAsMusic = voiceAsMusic;\n if(searchContext) audioElement.searchContext = searchContext;\n if(showSender) audioElement.showSender = showSender;\n\n audioElement.dataset.fontWeight = '' + fontWeight;\n audioElement.dataset.fontSize = '' + fontSize;\n audioElement.dataset.sizeType = sizeType;\n await audioElement.render();\n return audioElement;\n }\n\n const extSplitted = doc.file_name ? doc.file_name.split('.') : '';\n let ext = '';\n ext = extSplitted.length > 1 && Array.isArray(extSplitted) ?\n clearBadCharsAndTrim(extSplitted.pop().split(' ', 1)[0].toLowerCase()) :\n 'file';\n\n const docDiv = document.createElement('div');\n docDiv.classList.add('document', `ext-${ext}`);\n docDiv.dataset.docId = '' + doc.id;\n (docDiv as any).doc = doc;\n\n // return docDiv;\n\n const icoDiv = document.createElement('div');\n icoDiv.classList.add('document-ico');\n let icoTextEl: HTMLElement;\n\n const hadContext = !!cacheContext;\n const getCacheContext = () => {\n return hadContext ? cacheContext : managers.thumbsStorage.getCacheContext(doc);\n };\n\n cacheContext = await getCacheContext();\n let hasThumb = false;\n if((doc.thumbs?.length || (message.pFlags.is_outgoing && cacheContext.url && doc.type === 'photo'))/* && doc.mime_type !== 'image/gif' */) {\n docDiv.classList.add('document-with-thumb');\n hasThumb = true;\n\n const imgs: (HTMLImageElement | HTMLCanvasElement | HTMLVideoElement)[] = [];\n // ! WARNING, use thumbs for check when thumb will be generated for media\n if(message.pFlags.is_outgoing && ['photo', 'video'].includes(doc.type) && cacheContext.url) {\n icoDiv.innerHTML = ``;\n imgs.push(icoDiv.firstElementChild as HTMLImageElement);\n } else {\n const perf = performance.now();\n const wrapped = await wrapPhoto({\n photo: doc,\n message: null,\n container: icoDiv,\n boxWidth: 54,\n boxHeight: 54,\n loadPromises,\n withoutPreloader: true,\n lazyLoadQueue,\n size: choosePhotoSize(doc, 54, 54, true),\n managers\n });\n // console.log('was wrapping photo', performance.now() - perf);\n icoDiv.style.width = icoDiv.style.height = '';\n if(wrapped.images.thumb) imgs.push(wrapped.images.thumb);\n if(wrapped.images.full) imgs.push(wrapped.images.full);\n }\n\n imgs.forEach((img) => img.classList.add('document-thumb'));\n } else {\n icoTextEl = document.createElement('span');\n icoTextEl.classList.add('document-ico-text');\n icoTextEl.innerText = ext;\n icoDiv.append(icoTextEl);\n }\n\n // let fileName = stringMiddleOverflow(doc.file_name || 'Unknown.file', 26);\n const fileName = doc.file_name ? wrapPlainText(doc.file_name) : 'Unknown.file';\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add('document-description');\n const bytesContainer = document.createElement('span');\n const bytesEl = formatBytes(doc.size);\n const bytesJoiner = ' / ';\n\n const descriptionParts: (HTMLElement | string | DocumentFragment)[] = [bytesEl];\n\n if(withTime) {\n descriptionParts.push(formatFullSentTime(message.date));\n }\n\n if(showSender) {\n descriptionParts.push(await wrapSenderToPeer(message));\n }\n\n if(!withTime && !showSender) {\n const b = document.createElement('span');\n const bytesMaxEl = formatBytes(doc.size);\n b.append(bytesJoiner, bytesMaxEl);\n b.style.visibility = 'hidden';\n descriptionParts.push(b);\n }\n\n docDiv.innerHTML = `\n ${(cacheContext.downloaded && !uploadFileName) || !message.mid || !hasThumb ? '' : `
`}\n
\n
\n `;\n\n const nameDiv = docDiv.querySelector('.document-name') as HTMLElement;\n const middleEllipsisEl = new MiddleEllipsisElement();\n middleEllipsisEl.dataset.fontWeight = '' + fontWeight;\n middleEllipsisEl.dataset.fontSize = '' + fontSize;\n middleEllipsisEl.dataset.sizeType = sizeType;\n middleEllipsisEl.textContent = fileName;\n // setInnerHTML(middleEllipsisEl, fileName);\n\n // * new media popup\n if(!message.mid) {\n docDiv.classList.add('downloaded');\n }\n\n nameDiv.append(middleEllipsisEl);\n\n if(showSender) {\n nameDiv.append(wrapSentTime(message));\n }\n\n const sizeDiv = docDiv.querySelector('.document-size') as HTMLElement;\n bytesContainer.append(...joinElementsWith(descriptionParts, ' · '));\n sizeDiv.append(bytesContainer);\n\n docDiv.prepend(icoDiv);\n\n if(!uploadFileName && message.pFlags.is_outgoing && !message.mid) {\n return docDiv;\n }\n\n let downloadDiv: HTMLElement, preloader: ProgressivePreloader = null;\n const onLoad = () => {\n docDiv.classList.remove('downloading');\n\n if(/* !hasThumb || */(doc.size > MAX_FILE_SAVE_SIZE && !uploadFileName)) {\n preloader.setManual();\n preloader.attach(downloadDiv);\n preloader.preloader.classList.add('manual');\n preloader.setDownloadFunction(load);\n return;\n }\n\n if(doc.size <= MAX_FILE_SAVE_SIZE) {\n docDiv.classList.add('downloaded');\n }\n\n if(downloadDiv) {\n if(downloadDiv !== icoDiv) {\n const _downloadDiv = downloadDiv;\n setTimeout(() => {\n _downloadDiv.remove();\n }, 200);\n }\n\n downloadDiv = null;\n }\n\n if(preloader) {\n preloader = null;\n }\n };\n\n const addByteProgress = (promise: CancellablePromise) => {\n docDiv.classList.add('downloading');\n\n const sizeContainer = document.createElement('span');\n const _bytesContainer = formatBytes(doc.size);\n sizeContainer.style.position = 'absolute';\n sizeContainer.style.left = '0';\n promise.then(onLoad, noop).finally(() => {\n // sizeContainer.replaceWith(bytesContainer);\n bytesContainer.style.visibility = '';\n sizeContainer.remove();\n // b && b.classList.remove('hide');\n });\n\n // b && b.classList.add('hide');\n\n const format = (bytes: number) => formatBytes(bytes);\n let d = format(0);\n bytesContainer.style.visibility = 'hidden';\n // bytesContainer.replaceWith(sizeContainer);\n sizeContainer.append(d, bytesJoiner, _bytesContainer);\n bytesContainer.parentElement.append(sizeContainer);\n promise.addNotifyListener((progress: Progress) => {\n const _d = format(progress.done);\n d.replaceWith(_d);\n d = _d;\n });\n };\n\n // ! DO NOT USE ASYNC/AWAIT HERE ! SAFARI WON'T LET DOWNLOAD THE FILE BECAUSE OF ASYNC\n const load = (e?: Event) => {\n const save = !e || e.isTrusted;\n const doc = (docDiv as any).doc;\n // const doc = await managers.appDocsManager.getDoc(docDiv.dataset.docId);\n let download: CancellablePromise;\n const queueId = appImManager.chat.bubbles ? appImManager.chat.bubbles.lazyLoadQueue.queueId : undefined;\n if(!save) {\n download = appDownloadManager.downloadToDisc({media: doc, queueId}, true);\n } else if(doc.type === 'pdf') {\n const canOpenAfter = /* managers.appDocsManager.downloading.has(doc.id) || */!preloader || preloader.detached;\n download = appDownloadManager.downloadMediaURL({media: doc, queueId});\n if(canOpenAfter) {\n download.then(() => {\n setTimeout(async() => { // wait for preloader animation end\n const url = (await getCacheContext()).url;\n window.open(url);\n }, rootScope.settings.animationsEnabled ? 250 : 0);\n });\n }\n } else if(MEDIA_MIME_TYPES_SUPPORTED.has(doc.mime_type) && doc.thumbs?.length) {\n download = appDownloadManager.downloadMediaURL({media: doc, queueId});\n } else {\n download = appDownloadManager.downloadToDisc({media: doc, queueId});\n }\n\n download.catch(() => {\n docDiv.classList.remove('downloading');\n });\n\n if(downloadDiv) {\n preloader.attach(downloadDiv, true, download);\n addByteProgress(download);\n }\n };\n\n const {fileName: downloadFileName} = getDownloadMediaDetails({media: doc, downloadId: '1'});\n if(await managers.apiFileManager.isDownloading(downloadFileName)) {\n downloadDiv = docDiv.querySelector('.document-download') || icoDiv;\n const promise = appDownloadManager.downloadToDisc({media: doc}, true);\n\n preloader = new ProgressivePreloader();\n preloader.attach(downloadDiv, false, promise);\n preloader.setDownloadFunction(load);\n addByteProgress(promise);\n } else if(!cacheContext.downloaded || uploadFileName) {\n downloadDiv = docDiv.querySelector('.document-download') || icoDiv;\n preloader = new ProgressivePreloader({\n isUpload: !!uploadFileName\n });\n\n if(!uploadFileName) {\n preloader.construct();\n preloader.setManual();\n preloader.attach(downloadDiv);\n preloader.setDownloadFunction(load);\n\n if(autoDownloadSize !== undefined && autoDownloadSize >= doc.size) {\n simulateClickEvent(preloader.preloader);\n }\n } else {\n const uploadPromise = appDownloadManager.getUpload(uploadFileName);\n preloader.attachPromise(uploadPromise);\n preloader.attach(downloadDiv);\n addByteProgress(uploadPromise);\n }\n }\n\n attachClickEvent(docDiv, (e) => {\n if(findUpClassName(e.target, 'time')) { // prevent downloading by clicking on time\n return;\n }\n\n if(preloader) {\n preloader.onClick(e);\n } else {\n load(e);\n }\n });\n\n return docDiv;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\n\nexport default function formatUserPhone(phone: string) {\n return '+' + formatPhoneNumber(phone).formatted;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport {Chat, ChatParticipants} from '../../layer';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport rootScope from '../../lib/rootScope';\n\nexport default async function getChatMembersString(chatId: ChatId, managers = rootScope.managers) {\n const chat: Chat = await managers.appChatsManager.getChat(chatId);\n if(chat._ === 'chatForbidden') {\n return i18n('YouWereKicked');\n }\n\n const chatFull = await managers.appProfileManager.getCachedFullChat(chatId);\n let count: number;\n if(chatFull) {\n if(chatFull._ === 'channelFull') {\n count = chatFull.participants_count;\n } else {\n count = (chatFull.participants as ChatParticipants.chatParticipants).participants?.length;\n }\n } else {\n count = (chat as Chat.chat).participants_count || (chat as any).participants?.participants.length;\n }\n\n const isBroadcast = (chat as Chat.channel).pFlags.broadcast;\n count = count || 1;\n\n const key: LangPackKey = isBroadcast ? 'Peer.Status.Subscribers' : 'Peer.Status.Member';\n return i18n(key, [numberThousandSplitter(count)]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport _limitSymbols from '../../helpers/string/limitSymbols';\nimport {Chat} from '../../layer';\nimport getPeerActiveUsernames from '../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport I18n from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../lib/rootScope';\n\ntype GetPeerTitleOptions = {\n peerId: PeerId,\n plainText?: boolean,\n onlyFirstName?: boolean,\n limitSymbols?: number,\n threadId?: number\n} & Pick;\n\nexport default async function getPeerTitle(\n options: T\n): Promise {\n const {\n peerId = rootScope.myId,\n plainText,\n onlyFirstName,\n limitSymbols,\n managers = rootScope.managers,\n threadId\n } = options;\n\n let title = '';\n if(peerId.isUser()) {\n const user = await managers.appUsersManager.getUser(peerId.toUserId());\n if(user) {\n if(user.first_name) title += user.first_name;\n if(user.last_name && (!onlyFirstName || !title)) title += ' ' + user.last_name;\n }\n\n if(!title) title = !user || user.pFlags.deleted ? I18n.format(onlyFirstName ? 'Deleted' : 'HiddenName', true) : getPeerActiveUsernames(user)[0] || '';\n else title = title.trim();\n } else {\n if(threadId) {\n const topic = await managers.dialogsStorage.getForumTopic(peerId, threadId);\n title = topic?.title || '';\n }\n\n if(!title) {\n const chat = await managers.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n title = chat?.title || '';\n }\n\n if(onlyFirstName) {\n title = title.split(' ')[0];\n }\n }\n\n if(limitSymbols !== undefined) {\n title = _limitSymbols(title, limitSymbols, limitSymbols);\n }\n\n return plainText ? title : wrapEmojiText(title) as any;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatFullSentTimeRaw} from '../../helpers/date';\nimport {User} from '../../layer';\nimport {LangPackKey, i18n} from '../../lib/langPack';\nimport {REPLIES_PEER_ID, SERVICE_PEER_ID} from '../../lib/mtproto/mtproto_config';\n\nexport default function getUserStatusString(user: User.user): HTMLElement {\n if(!user) {\n return document.createElement('span');\n }\n\n let key: LangPackKey;\n let args: any[];\n\n switch(user.id) {\n case REPLIES_PEER_ID.toUserId():\n key = 'Peer.RepliesNotifications';\n break;\n case SERVICE_PEER_ID.toUserId():\n key = 'Peer.ServiceNotifications';\n break;\n default: {\n if(user.pFlags.bot) {\n key = 'Bot';\n break;\n }\n\n if(user.pFlags.support) {\n key = 'SupportStatus';\n break;\n }\n\n switch(user.status?._) {\n case 'userStatusRecently': {\n key = 'Lately';\n break;\n }\n\n case 'userStatusLastWeek': {\n key = 'WithinAWeek';\n break;\n }\n\n case 'userStatusLastMonth': {\n key = 'WithinAMonth';\n break;\n }\n\n case 'userStatusOffline': {\n const date = user.status.was_online;\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n\n const diff = now - date;\n if(diff < 60) {\n key = 'Peer.Status.justNow';\n } else if(diff < 3600) {\n key = 'Peer.Status.minAgo';\n const c = diff / 60 | 0;\n args = [c];\n } else if(diff < 86400 && today.getDate() === new Date(date * 1000).getDate()) {\n key = 'LastSeen.HoursAgo';\n const c = diff / 3600 | 0;\n args = [c];\n } else {\n key = 'Peer.Status.LastSeenAt';\n const {dateEl, timeEl} = formatFullSentTimeRaw(date);\n args = [dateEl, timeEl];\n }\n\n break;\n }\n\n case 'userStatusOnline': {\n key = 'Online';\n break;\n }\n\n default: {\n key = 'ALongTimeAgo';\n break;\n }\n }\n\n break;\n }\n }\n\n return i18n(key, args);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport getImageFromStrippedThumb from '../../helpers/getImageFromStrippedThumb';\nimport noop from '../../helpers/noop';\nimport {Document, Photo, PhotoSize} from '../../layer';\nimport DotRenderer from '../dotRenderer';\nimport SetTransition from '../singleTransition';\n\nexport function toggleMediaSpoiler(options: {\n mediaSpoiler: HTMLElement,\n reveal: boolean,\n destroyAfter?: boolean\n}) {\n const {mediaSpoiler, reveal, destroyAfter} = options;\n SetTransition({\n element: mediaSpoiler,\n forwards: reveal,\n className: 'is-revealing',\n duration: 250,\n onTransitionEnd: () => {\n if(reveal && destroyAfter) {\n mediaSpoiler.remove();\n mediaSpoiler.middlewareHelper.destroy();\n }\n }\n });\n}\n\nexport function onMediaSpoilerClick(options: {\n mediaSpoiler: HTMLElement,\n event: Event\n}) {\n const {mediaSpoiler, event} = options;\n cancelEvent(event);\n\n if(mediaSpoiler.classList.contains('is-revealing')) {\n return;\n }\n\n const video = mediaSpoiler.parentElement.querySelector('video');\n if(video && !mediaSpoiler.parentElement.querySelector('.video-play')) {\n video.autoplay = true;\n video.play().catch(noop);\n }\n\n toggleMediaSpoiler({\n mediaSpoiler,\n reveal: true,\n destroyAfter: true\n });\n}\n\nexport function wrapMediaSpoilerWithImage(options: {\n image: Awaited>['image']\n} & Parameters[0]) {\n const {middleware, image} = options;\n if(!middleware()) {\n return;\n }\n\n image.classList.add('media-spoiler-thumbnail');\n\n const container = document.createElement('div');\n container.classList.add('media-spoiler-container');\n container.middlewareHelper = middleware.create();\n\n const dotRenderer = DotRenderer.create({\n ...options,\n middleware: container.middlewareHelper.get()\n });\n\n container.append(image, dotRenderer.canvas);\n\n return container;\n}\n\nexport default async function wrapMediaSpoiler(\n options: Omit[0], 'image'> & {\n media: Document.document | Photo.photo\n }\n) {\n const {media} = options;\n const sizes = (media as Photo.photo).sizes || (media as Document.document).thumbs;\n const thumb = sizes.find((size) => size._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n if(!thumb) {\n return;\n }\n\n const {image, loadPromise} = getImageFromStrippedThumb(media, thumb, true);\n await loadPromise;\n\n return wrapMediaSpoilerWithImage({\n ...options,\n image\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport wrapMessageActionTextNewUnsafe from './messageActionTextNewUnsafe';\n\nexport type WrapMessageActionTextOptions = {\n message: MyMessage,\n plain?: boolean\n} & WrapSomethingOptions;\n\nexport default async function wrapMessageActionTextNew(\n options: T\n): Promise {\n try {\n return await wrapMessageActionTextNewUnsafe(options) as any;\n } catch(err) {\n console.error('wrapMessageActionTextNewUnsafe error:', err);\n return options.plain ? '' : document.createElement('span') as any;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {hexaToHsla} from '../helpers/color';\nimport {TOPIC_COLORS} from '../lib/mtproto/mtproto_config';\nimport wrapAbbreviation from '../lib/richTextProcessor/wrapAbbreviation';\n\nlet svg: SVGSVGElement, span: HTMLElement, defs: HTMLElement;\nconst hadColors: Map = new Map();\nexport default function topicAvatar(color: number, content: string) {\n if(!svg) {\n defs = document.getElementById('svg-defs') as HTMLElement;\n\n const ns = 'http://www.w3.org/2000/svg';\n\n svg = document.createElementNS(ns, 'svg');\n svg.setAttributeNS(null, 'width', '26');\n svg.setAttributeNS(null, 'height', '26');\n svg.setAttributeNS(null, 'viewBox', '0 0 26 26');\n svg.classList.add('topic-icon-svg');\n\n const use = document.createElementNS(ns, 'use');\n use.setAttributeNS(null, 'href', '#topic-icon');\n svg.append(use);\n\n span = document.createElement('span');\n span.classList.add('topic-icon', 'avatar-like');\n\n const contentSpan = document.createElement('span');\n contentSpan.classList.add('topic-icon-content');\n span.append(svg, contentSpan);\n }\n\n if(!color) {\n console.error('NO TOPIC ICON COLOR!');\n color = TOPIC_COLORS[0];\n }\n\n if(!content) {\n console.error('NO TOPIC NAME!');\n content = '';\n }\n\n const hex = color.toString(16);\n\n const gradientId = `topic-icon-gradient-${color}`;\n let strokeColor = hadColors.get(color);\n if(!strokeColor) {\n const {h, s, l, a} = hexaToHsla('#' + hex);\n defs.insertAdjacentHTML('beforeend', `\n \n \n \n \n `);\n\n hadColors.set(color, strokeColor = `hsla(${h}, ${s}%, ${Math.max(0, l - 40)}%, ${a})`);\n }\n\n const clone = span.cloneNode(true) as typeof span;\n (clone.firstElementChild as HTMLElement).style.fill = `url(#${gradientId})`;\n // (clone.firstElementChild as HTMLElement).style.stroke = `var(--peer-avatar-${color}-filled)`;\n (clone.firstElementChild as HTMLElement).style.stroke = strokeColor;\n clone.lastElementChild.append(wrapAbbreviation(content, true));\n return clone;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message, MessageAction} from '../../layer';\nimport wrapUrl from '../../lib/richTextProcessor/wrapUrl';\n\nexport default function wrapJoinVoiceChatAnchor(message: Message.messageService) {\n const action = message.action as MessageAction.messageActionInviteToGroupCall;\n const {onclick, url} = wrapUrl(`tg://voicechat?chat_id=${message.peerId.toChatId()}&id=${action.call.id}&access_hash=${action.call.access_hash}`);\n if(!onclick) {\n return document.createElement('span');\n }\n\n const a = document.createElement('a');\n a.href = url;\n a.setAttribute('onclick', onclick + '(this)');\n\n return a;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {formatTime, ONE_DAY} from '../../helpers/date';\nimport htmlToSpan from '../../helpers/dom/htmlToSpan';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport formatCallDuration from '../../helpers/formatCallDuration';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport {ForumTopic, Message, MessageAction} from '../../layer';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport I18n, {FormatterArgument, FormatterArguments, i18n, join, langPack, LangPackKey, _i18n} from '../../lib/langPack';\nimport {GENERAL_TOPIC_ID} from '../../lib/mtproto/mtproto_config';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport topicAvatar from '../topicAvatar';\nimport {wrapCustomEmojiAwaited} from './customEmoji';\nimport getPeerTitle from './getPeerTitle';\nimport wrapJoinVoiceChatAnchor from './joinVoiceChatAnchor';\nimport {WrapMessageActionTextOptions} from './messageActionTextNew';\nimport wrapMessageForReply, {WrapMessageForReplyOptions} from './messageForReply';\nimport wrapPeerTitle from './peerTitle';\n\nasync function wrapLinkToMessage(options: WrapMessageForReplyOptions) {\n const wrapped = await wrapMessageForReply(options);\n\n if(options.plain) {\n return wrapped;\n }\n\n const a = document.createElement('i');\n a.dataset.savedFrom = (options.message as Message.message).peerId + '_' + (options.message as Message.message).mid;\n a.dir = 'auto';\n a.append(wrapped);\n return a;\n}\n\nfunction wrapSomeText(text: string, plain?: boolean) {\n return plain ? text : htmlToSpan(wrapEmojiText(text));\n}\n\ntype WrapTopicIconOptions = {\n topic: Pick,\n plain?: boolean\n} & WrapSomethingOptions;\nexport async function wrapTopicIcon(options: T): Promise {\n const topic = options.topic;\n\n let iconEmojiId = topic?.icon_emoji_id;\n if(topic?.id === GENERAL_TOPIC_ID) {\n iconEmojiId = '5390854796011906616';\n }\n\n if(!iconEmojiId) {\n if(options.plain) return '' as any;\n\n // if(topic?.id === GENERAL_TOPIC_ID) {\n // const span = document.createElement('span');\n // span.innerHTML = `\n // \n // \n // \n // `;\n\n // span.classList.add('topic-icon');\n\n // return span as any;\n // }\n\n return topicAvatar(topic?.icon_color, topic?.title) as any;\n }\n\n return options.plain ?\n rootScope.managers.appEmojiManager.getCustomEmojiDocument(iconEmojiId).then((doc) => doc.stickerEmojiRaw) :\n wrapCustomEmojiAwaited({\n ...options,\n docIds: [iconEmojiId]\n }).then((fragment) => {\n fragment.lastElementChild.classList.add('topic-icon');\n return fragment;\n }) as any;\n}\n\nfunction wrapMessageActionTopicIcon(options: WrapMessageActionTextOptions) {\n const action = ((options.message as Message.messageService).action as MessageAction.messageActionTopicCreate);\n return wrapTopicIcon({\n ...options,\n topic: action as any as ForumTopic.forumTopic\n });\n}\n\nasync function wrapMessageActionTopicIconAndName(options: WrapMessageActionTextOptions) {\n const action = ((options.message as Message.messageService).action as MessageAction.messageActionTopicCreate);\n const span = document.createElement('span');\n span.classList.add('topic-name');\n span.append(await wrapMessageActionTopicIcon(options), wrapSomeText(action.title, options.plain));\n return span;\n}\n\nexport default async function wrapMessageActionTextNewUnsafe(options: WrapMessageActionTextOptions) {\n const {plain, message, middleware, lazyLoadQueue, customEmojiSize, animationGroup} = options;\n const element: HTMLElement = plain ? undefined : document.createElement('span');\n const action = 'action' in message && message.action;\n\n // this.log('message action:', action);\n\n if((action as MessageAction.messageActionCustomAction).message) {\n const unsafeMessage = (action as MessageAction.messageActionCustomAction).message;\n if(plain) {\n return wrapPlainText(unsafeMessage);\n } else {\n setInnerHTML(element, wrapRichText(unsafeMessage, {noLinebreaks: true}));\n return element;\n }\n } else {\n let _ = action._;\n // let suffix = '';\n let langPackKey: LangPackKey;\n let args: Array>;\n\n const managers = rootScope.managers;\n\n const getNameDivHTML = (peerId: PeerId, plain: boolean) => {\n return plain ? getPeerTitle({peerId, plainText: plain}) : wrapPeerTitle({peerId});\n };\n\n switch(action._) {\n case 'messageActionPhoneCall': {\n _ += '.' + (action as any).type;\n\n args = [formatCallDuration(action.duration, plain)];\n break;\n }\n\n case 'messageActionGroupCall': {\n _ += '.' + (action as any).type;\n\n args = [];\n if(!_.endsWith('You') && !message.pFlags.post) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n if(action.duration !== undefined) {\n args.push(formatCallDuration(action.duration, plain));\n } else {\n args.push(wrapJoinVoiceChatAnchor(message as any));\n }\n\n break;\n }\n\n case 'messageActionInviteToGroupCall': {\n const peerIds = [message.fromId, action.users[0].toPeerId()];\n let a = 'Chat.Service.VoiceChatInvitation';\n const myId = rootScope.myId;\n if(peerIds[0] === myId) a += 'ByYou';\n else if(peerIds[1] === myId) a += 'ForYou';\n indexOfAndSplice(peerIds, myId);\n\n langPackKey = a as LangPackKey;\n args = peerIds.map((peerId) => getNameDivHTML(peerId, plain));\n args.push(wrapJoinVoiceChatAnchor(message as any));\n break;\n }\n\n case 'messageActionGroupCallScheduled': {\n const today = new Date();\n const date = new Date(action.schedule_date * 1000);\n const daysToStart = (date.getTime() - today.getTime()) / 86400e3;\n const tomorrowDate = new Date(today);\n tomorrowDate.setDate(tomorrowDate.getDate() + 1);\n\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n langPackKey = isBroadcast ? 'ChatList.Service.VoiceChatScheduled.Channel' : 'ChatList.Service.VoiceChatScheduled';\n args = [];\n const myId = rootScope.myId;\n if(message.fromId === myId) {\n langPackKey += 'You';\n } else if(!isBroadcast) {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let k: LangPackKey;\n const _args: FormatterArguments = [];\n if(daysToStart < 1 && date.getDate() === today.getDate()) {\n k = 'TodayAtFormattedWithToday';\n } else if(daysToStart < 2 && date.getDate() === tomorrowDate.getDate()) {\n k = 'Time.TomorrowAt';\n } else {\n k = 'formatDateAtTime';\n _args.push(new I18n.IntlDateElement({\n date,\n options: {\n day: '2-digit',\n month: '2-digit',\n year: '2-digit'\n }\n }).element);\n }\n\n _args.push(formatTime(date));\n const t = i18n(k, _args);\n args.push(t);\n\n break;\n }\n\n case 'messageActionChatCreate': {\n const myId = rootScope.myId;\n if(message.fromId === myId) {\n _ += 'You';\n } else {\n args = [getNameDivHTML(message.fromId, plain)];\n }\n\n break;\n }\n\n case 'messageActionPinMessage': {\n const peerId = message.peerId;\n const pinnedMessage = await managers.appMessagesManager.getMessageByPeer(peerId, message.reply_to_mid);\n\n args = [\n getNameDivHTML(message.fromId, plain)\n ];\n\n if(!pinnedMessage/* || true */) {\n langPackKey = 'ActionPinnedNoText';\n\n if(message.reply_to_mid) { // refresh original message\n managers.appMessagesManager.fetchMessageReplyTo(message);\n }\n } else {\n args.push(wrapLinkToMessage({\n ...options,\n message: pinnedMessage\n }));\n }\n\n break;\n }\n\n case 'messageActionChatJoinedByRequest': {\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n if(message.pFlags.out) {\n langPackKey = isBroadcast ? 'RequestToJoinChannelApproved' : 'RequestToJoinGroupApproved';\n } else {\n langPackKey = isBroadcast ? 'ChatService.UserJoinedChannelByRequest' : 'ChatService.UserJoinedGroupByRequest';\n args = [getNameDivHTML(message.fromId, plain)];\n }\n break;\n }\n\n case 'messageActionContactSignUp':\n case 'messageActionChatReturn':\n case 'messageActionChatLeave':\n case 'messageActionChatJoined':\n case 'messageActionChatEditPhoto':\n case 'messageActionChatDeletePhoto':\n case 'messageActionChatEditVideo':\n case 'messageActionChatJoinedByLink':\n case 'messageActionChannelEditVideo':\n case 'messageActionChannelDeletePhoto': {\n args = [getNameDivHTML(message.fromId, plain)];\n break;\n }\n\n case 'messageActionChannelEditTitle':\n case 'messageActionChatEditTitle': {\n args = [];\n if(action._ === 'messageActionChatEditTitle') {\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n args.push(wrapSomeText(action.title));\n break;\n }\n\n case 'messageActionChatDeleteUser':\n case 'messageActionChatAddUsers':\n case 'messageActionChatAddUser': {\n const users = (action as MessageAction.messageActionChatAddUser).users ||\n [(action as MessageAction.messageActionChatDeleteUser).user_id];\n\n args = [getNameDivHTML(message.fromId, plain)];\n\n if(users.length > 1) {\n const joined = join(\n await Promise.all(users.map((userId: UserId) => getNameDivHTML(userId.toPeerId(), plain))),\n false,\n plain\n );\n\n if(plain) {\n args.push(...joined);\n } else {\n const fragment = document.createElement('span');\n fragment.append(...joined);\n args.push(fragment);\n }\n } else {\n args.push(getNameDivHTML(users[0].toPeerId(), plain));\n }\n\n break;\n }\n\n case 'messageActionBotAllowed': {\n const anchorHTML = wrapRichText(action.domain, {\n entities: [{\n _: 'messageEntityUrl',\n length: action.domain.length,\n offset: 0\n }]\n });\n\n const node = htmlToSpan(anchorHTML);\n\n args = [node];\n break;\n }\n\n case 'messageActionPaymentSent': {\n const isRecurringInit = action.pFlags.recurring_init;\n const isRecurringUsed = action.pFlags.recurring_used;\n langPackKey = isRecurringUsed ? 'Chat.Service.PaymentSentRecurringUsedNoTitle' : (isRecurringInit ? 'Chat.Service.PaymentSentRecurringInitNoTitle' : 'Chat.Service.PaymentSent1NoTitle');\n const price = paymentsWrapCurrencyAmount(action.total_amount, action.currency);\n args = [price, getNameDivHTML(message.peerId, plain)];\n\n if(message.reply_to_mid) {\n const invoiceMessage = await managers.appMessagesManager.getMessageByPeer(\n message.reply_to?.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : message.peerId,\n message.reply_to_mid\n );\n\n if(!invoiceMessage) {\n managers.appMessagesManager.fetchMessageReplyTo(message);\n } else {\n langPackKey = isRecurringUsed ? 'Chat.Service.PaymentSentRecurringUsed' : (isRecurringInit ? 'Chat.Service.PaymentSentRecurringInit' : 'Chat.Service.PaymentSent1');\n args.push(wrapLinkToMessage({\n ...options,\n message: invoiceMessage\n }).then((el) => {\n if(el instanceof HTMLElement) {\n el.classList.add('is-receipt-link');\n }\n\n return el;\n }));\n }\n }\n\n break;\n }\n\n case 'messageActionSetMessagesTTL': {\n args = [];\n\n const isBroadcast = await managers.appPeersManager.isBroadcast(message.peerId);\n if(action.period) {\n if(isBroadcast) {\n langPackKey = 'ActionTTLChannelChanged';\n } else if(message.fromId === rootScope.myId) {\n langPackKey = 'ActionTTLYouChanged';\n } else {\n langPackKey = 'ActionTTLChanged';\n args.push(getNameDivHTML(message.fromId, plain));\n }\n\n let duration: ReturnType;\n if(action.period > 1814400) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n const year = 31536000;\n if(action.period >= year) {\n key = 'Years';\n args.push(action.period / year | 0);\n } else {\n key = 'Months';\n args.push(action.period / (ONE_DAY * 30) | 0);\n }\n\n duration = plain ? I18n.format(key, true, args) : i18n(key, args);\n } else {\n duration = formatCallDuration(action.period, plain);\n }\n\n args.push(duration);\n } else {\n if(isBroadcast) {\n langPackKey = 'ActionTTLChannelDisabled';\n } else if(message.fromId === rootScope.myId) {\n langPackKey = 'ActionTTLYouDisabled';\n } else {\n langPackKey = 'ActionTTLDisabled';\n args.push(getNameDivHTML(message.fromId, plain));\n }\n }\n break;\n }\n\n case 'messageActionTopicEdit': {\n let iconElement: (typeof args)[0];\n let titleElement: typeof iconElement;\n let authorElement: ReturnType;\n const isMe = !!message.pFlags.out;\n const isIconChanged = action.icon_emoji_id !== undefined;\n const isIconRemoved = isIconChanged && !+action.icon_emoji_id;\n const isTitleChanged = action.title !== undefined;\n const isHiddenChanged = action.hidden !== undefined;\n\n if(!isMe) {\n authorElement = getNameDivHTML(message.fromId, plain);\n }\n\n if(isTitleChanged) {\n titleElement = wrapSomeText(action.title);\n }\n\n if(isIconChanged && !isIconRemoved) {\n iconElement = wrapMessageActionTopicIcon(options);\n }\n\n args = authorElement ? [authorElement] : [];\n\n if(action.closed) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Paused' : 'Chat.Service.Group.TopicEdited.Paused';\n } else if(action.closed === false) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Resumed' : 'Chat.Service.Group.TopicEdited.Resumed';\n } else if(isIconRemoved && isTitleChanged) {\n langPackKey = isMe ? 'Chat.Service.TopicEdited.You.Mixed.IconRemoved' : 'Chat.Service.TopicEdited.Mixed.IconRemoved';\n args.push(titleElement);\n } else if(isIconChanged && isTitleChanged) {\n langPackKey = isMe ? 'Chat.Service.TopicEdited.You.Mixed' : 'Chat.Service.TopicEdited.Mixed';\n args.push(wrapMessageActionTopicIconAndName(options));\n } else if(isIconRemoved) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Icon.Removed' : 'Chat.Service.Group.TopicEdited.Icon.Removed';\n } else if(isTitleChanged) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Title' : 'Chat.Service.Group.TopicEdited.Title';\n args.push(titleElement);\n } else if(isIconChanged) {\n langPackKey = isMe ? 'Chat.Service.Group.TopicEdited.You.Icon' : 'Chat.Service.Group.TopicEdited.Icon';\n args.push(iconElement);\n } else if(isHiddenChanged) {\n langPackKey = isMe ?\n (action.hidden ? 'Chat.Service.Group.TopicEdited.You.Hided' : 'Chat.Service.Group.TopicEdited.You.Unhided') :\n (action.hidden ? 'Chat.Service.Group.TopicEdited.Hided' : 'Chat.Service.Group.TopicEdited.Unhided');\n }\n\n break;\n }\n\n case 'messageActionTopicCreate': {\n args = [wrapMessageActionTopicIconAndName(options)];\n langPackKey = 'TopicWasCreatedAction';\n break;\n }\n\n default:\n langPackKey = (langPack[_] || `[${action._}]`) as any;\n break;\n }\n\n if(!langPackKey) {\n langPackKey = langPack[_];\n if(langPackKey === undefined) {\n langPackKey = '[' + _ + ']' as any;\n }\n }\n\n const waited = args && await Promise.all(args);\n\n if(plain) {\n return I18n.format(langPackKey, true, waited);\n } else {\n return _i18n(element, langPackKey, waited);\n }\n\n // str = !langPackKey || langPackKey[0].toUpperCase() === langPackKey[0] ? langPackKey : getNameDivHTML(message.fromId) + langPackKey + (suffix ? ' ' : '');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport assumeType from '../../helpers/assumeType';\nimport htmlToDocumentFragment from '../../helpers/dom/htmlToDocumentFragment';\nimport {getRestrictionReason} from '../../helpers/restrictions';\nimport escapeRegExp from '../../helpers/string/escapeRegExp';\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {Message, DocumentAttribute, DraftMessage} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {MyDraftMessage} from '../../lib/appManagers/appDraftsManager';\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport isMessageRestricted from '../../lib/appManagers/utils/messages/isMessageRestricted';\nimport I18n, {LangPackKey, i18n, UNSUPPORTED_LANG_PACK_KEY} from '../../lib/langPack';\nimport sortEntities from '../../lib/richTextProcessor/sortEntities';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapPlainText from '../../lib/richTextProcessor/wrapPlainText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport {Modify} from '../../types';\nimport wrapMessageActionTextNew, {WrapMessageActionTextOptions} from './messageActionTextNew';\n\nexport type WrapMessageForReplyOptions = Modify & {\n text?: string,\n usingMids?: number[],\n highlightWord?: string,\n withoutMediaType?: boolean\n};\n\n// export default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string, usingMids: number[], plain: true, highlightWord?: string, withoutMediaType?: boolean): Promise;\n// export default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text?: string, usingMids?: number[], plain?: false, highlightWord?: string, withoutMediaType?: boolean): Promise;\n// export default async function wrapMessageForReply(message: MyMessage | MyDraftMessage, text: string = (message as Message.message).message, usingMids?: number[], plain?: boolean, highlightWord?: string, withoutMediaType?: boolean): Promise {\nexport default async function wrapMessageForReply(\n options: T\n): Promise {\n let {message, text, usingMids, plain, highlightWord, withoutMediaType} = options;\n text ??= (message as Message.message).message;\n\n const parts: (Node | string)[] = [];\n\n let hasAlbumKey = false;\n const addPart = (langKey: LangPackKey, part?: string | HTMLElement | DocumentFragment) => {\n if(langKey) {\n if(part === undefined && hasAlbumKey) {\n return;\n }\n\n part = plain ? I18n.format(langKey, true) : i18n(langKey);\n }\n\n if(plain) {\n parts.push(part);\n } else {\n const el = document.createElement('span');\n if(typeof(part) === 'string') el.innerHTML = part;\n else el.append(part);\n parts.push(el);\n }\n };\n\n const managers = rootScope.managers;\n const appMessagesManager = managers.appMessagesManager;\n\n const isRestricted = isMessageRestricted(message as any);\n\n let entities = (message as Message.message).totalEntities ?? (message as DraftMessage.draftMessage).entities;\n if((message as Message.message).media && !isRestricted) {\n assumeType(message);\n let usingFullAlbum = true;\n if(message.grouped_id) {\n if(usingMids) {\n const mids = await appMessagesManager.getMidsByMessage(message);\n if(usingMids.length === mids.length) {\n for(const mid of mids) {\n if(!usingMids.includes(mid)) {\n usingFullAlbum = false;\n break;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n }\n\n if(usingFullAlbum) {\n const albumText = await appMessagesManager.getAlbumText(message.grouped_id);\n text = albumText?.message || '';\n entities = albumText?.totalEntities || [];\n\n if(!withoutMediaType) {\n addPart('AttachAlbum');\n hasAlbumKey = true;\n }\n }\n } else {\n usingFullAlbum = false;\n }\n\n if((!usingFullAlbum && !withoutMediaType) || !text) {\n const media = message.media;\n switch(media._) {\n case 'messageMediaPhoto':\n addPart('AttachPhoto');\n break;\n case 'messageMediaDice':\n addPart(undefined, plain ? media.emoticon : wrapEmojiText(media.emoticon));\n break;\n case 'messageMediaVenue': {\n text = media.title;\n addPart('AttachLocation');\n break;\n }\n case 'messageMediaGeo':\n addPart('AttachLocation');\n break;\n case 'messageMediaGeoLive':\n addPart('AttachLiveLocation');\n break;\n case 'messageMediaPoll':\n const f = '📊' + ' ' + (media.poll.question || 'poll');\n addPart(undefined, plain ? f : wrapEmojiText(f));\n break;\n case 'messageMediaContact':\n addPart('AttachContact');\n break;\n case 'messageMediaGame': {\n const f = '🎮' + ' ' + media.game.title;\n addPart(undefined, plain ? f : wrapEmojiText(f));\n break;\n }\n case 'messageMediaDocument': {\n const document = media.document as MyDocument;\n\n if(document.type === 'video') {\n addPart('AttachVideo');\n } else if(document.type === 'voice') {\n addPart('AttachAudio');\n } else if(document.type === 'gif') {\n addPart('AttachGif');\n } else if(document.type === 'round') {\n addPart('AttachRound');\n } else if(document.type === 'sticker') {\n const i = parts.length;\n if(document.stickerEmojiRaw) {\n const f = document.stickerEmojiRaw + ' ';\n addPart(undefined, plain ? f : wrapEmojiText(f));\n }\n\n addPart('AttachSticker');\n\n // will combine two parts into one\n const p = parts.splice(i, 2);\n if(plain) parts.push((p[0] as string) + (p[1] ? p[1] as string : ''));\n else {\n const span = window.document.createElement('span');\n span.append(...p);\n parts.push(span);\n }\n\n text = '';\n } else if(document.type === 'audio') {\n const attribute = document.attributes.find((attribute) => attribute._ === 'documentAttributeAudio' && (attribute.title || attribute.performer)) as DocumentAttribute.documentAttributeAudio;\n const f = '🎵' + ' ' + (attribute ? [attribute.title, attribute.performer].filter(Boolean).join(' - ') : document.file_name);\n addPart(undefined, plain ? f : wrapEmojiText(f));\n } else {\n addPart(undefined, plain ? document.file_name : wrapEmojiText(document.file_name));\n }\n\n break;\n }\n\n case 'messageMediaInvoice': {\n if(media.extended_media?._ === 'messageExtendedMediaPreview') {\n addPart(undefined, plain ? media.description : wrapEmojiText(media.description));\n } else {\n addPart(undefined, plain ? media.title : wrapEmojiText(media.title));\n }\n\n break;\n }\n\n case 'messageMediaUnsupported': {\n addPart(UNSUPPORTED_LANG_PACK_KEY);\n break;\n }\n\n default:\n // messageText += media._;\n // /////appMessagesManager.log.warn('Got unknown media type!', message);\n break;\n }\n }\n\n const length = parts.length;\n for(let i = 1; i < length; i += 2) {\n parts.splice(i, 0, ', ');\n }\n\n if(text && length) {\n parts.push(', ');\n }\n }\n\n if((message as Message.messageService).action) {\n const actionWrapped = await wrapMessageActionTextNew({message: (message as Message.messageService), plain});\n if(actionWrapped) {\n addPart(undefined, actionWrapped);\n }\n }\n\n if(isRestricted) {\n text = getRestrictionReason((message as Message.message).restriction_reason).text;\n entities = [];\n }\n\n if(text) {\n text = limitSymbols(text, 100);\n\n if(!entities) {\n entities = [];\n }\n\n if(plain) {\n parts.push(wrapPlainText(text, entities));\n } else {\n // let entities = parseEntities(text.replace(/\\n/g, ' '));\n\n if(highlightWord) {\n highlightWord = highlightWord.trim();\n let found = false;\n let match: any;\n const regExp = new RegExp(escapeRegExp(highlightWord), 'gi');\n entities = entities.slice(); // fix leaving highlight entity\n while((match = regExp.exec(text)) !== null) {\n entities.push({_: 'messageEntityHighlight', length: highlightWord.length, offset: match.index});\n found = true;\n }\n\n if(found) {\n sortEntities(entities);\n }\n }\n\n const messageWrapped = wrapRichText(text, {\n noLinebreaks: true,\n entities,\n noLinks: true,\n noTextFormat: true\n });\n\n parts.push(htmlToDocumentFragment(messageWrapped));\n }\n }\n\n if(plain) {\n return parts.join('') as any;\n } else {\n const fragment = document.createDocumentFragment();\n fragment.append(...parts);\n return fragment as any;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PeerTitle, {PeerTitleOptions} from '../peerTitle';\n\nexport default async function wrapPeerTitle(options: PeerTitleOptions) {\n const peerTitle = new PeerTitle();\n await peerTitle.update(options);\n return peerTitle.element;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport renderMediaWithFadeIn from '../../helpers/dom/renderMediaWithFadeIn';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Message, PhotoSize, VideoSize, WebDocument} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../../lib/appManagers/appPhotosManager';\nimport rootScope from '../../lib/rootScope';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ProgressivePreloader from '../preloader';\nimport blur from '../../helpers/blur';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getStrippedThumbIfNeeded from '../../helpers/getStrippedThumbIfNeeded';\nimport setAttachmentSize from '../../helpers/setAttachmentSize';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport isWebDocument from '../../lib/appManagers/utils/webDocs/isWebDocument';\nimport createVideo from '../../helpers/dom/createVideo';\nimport noop from '../../helpers/noop';\nimport {THUMB_TYPE_FULL} from '../../lib/mtproto/mtproto_config';\nimport {Middleware} from '../../helpers/middleware';\n\nexport default async function wrapPhoto({photo, message, container, boxWidth, boxHeight, withTail, isOut, lazyLoadQueue, middleware, size, withoutPreloader, loadPromises, autoDownloadSize, noBlur, noThumb, noFadeIn, blurAfter, managers = rootScope.managers, processUrl}: {\n photo: MyPhoto | MyDocument | WebDocument,\n message?: Message.message | Message.messageService,\n container: HTMLElement,\n boxWidth?: number,\n boxHeight?: number,\n withTail?: boolean,\n isOut?: boolean,\n lazyLoadQueue?: LazyLoadQueue,\n middleware?: Middleware,\n size?: PhotoSize | VideoSize,\n withoutPreloader?: boolean,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n noBlur?: boolean,\n noThumb?: boolean,\n noFadeIn?: boolean,\n blurAfter?: boolean,\n managers?: AppManagers,\n processUrl?: (url: string) => Promise\n}) {\n const ret = {\n loadPromises: {\n thumb: Promise.resolve() as Promise,\n full: Promise.resolve() as Promise\n },\n images: {\n thumb: null as HTMLImageElement | HTMLCanvasElement,\n full: null as HTMLVideoElement | HTMLImageElement\n },\n preloader: null as ProgressivePreloader,\n aspecter: null as HTMLElement\n };\n\n const isDocument = photo._ === 'document';\n const isImageFromDocument = isDocument && photo.mime_type.startsWith('image/') && !size;\n const isWebDoc = isWebDocument(photo);\n if(!((photo as MyPhoto).sizes || (photo as MyDocument).thumbs) && !isWebDoc && !isImageFromDocument) {\n if(boxWidth && boxHeight && !size && isDocument) {\n setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message);\n }\n\n return ret;\n }\n\n let noAutoDownload = autoDownloadSize === 0;\n\n if(!size) {\n if(boxWidth === undefined) boxWidth = mediaSizes.active.regular.width;\n if(boxHeight === undefined) boxHeight = mediaSizes.active.regular.height;\n }\n\n container.classList.add('media-container');\n let aspecter = container;\n\n let isFit = true;\n let loadThumbPromise: Promise = Promise.resolve();\n let thumbImage: HTMLImageElement | HTMLCanvasElement;\n // let image: HTMLImageElement;\n let cacheContext: ThumbCache;\n // if(withTail) {\n // image = wrapMediaWithTail(photo, message, container, boxWidth, boxHeight, isOut);\n // } else {\n\n if(boxWidth && boxHeight && !size) { // !album\n const set = setAttachmentSize(photo, container, boxWidth, boxHeight, undefined, message, undefined, isImageFromDocument ? {\n _: 'photoSize',\n w: photo.w,\n h: photo.h,\n size: photo.size,\n type: THUMB_TYPE_FULL\n } : undefined);\n size = set.photoSize;\n isFit = set.isFit;\n cacheContext = await managers.thumbsStorage.getCacheContext(photo, size.type);\n\n if(!isFit && !isWebDoc) {\n aspecter = document.createElement('div');\n aspecter.classList.add('media-container-aspecter');\n aspecter.style.width = set.size.width + 'px';\n aspecter.style.height = set.size.height + 'px';\n\n const gotThumb = getStrippedThumbIfNeeded(photo, cacheContext, !noBlur, true);\n if(gotThumb) {\n loadThumbPromise = gotThumb.loadPromise;\n const thumbImage = gotThumb.image; // local scope\n thumbImage.classList.add('media-photo');\n container.append(thumbImage);\n } else {\n const res = await wrapPhoto({\n container,\n message,\n photo,\n boxWidth: 0,\n boxHeight: 0,\n size,\n lazyLoadQueue,\n isOut,\n loadPromises,\n middleware,\n withoutPreloader,\n withTail,\n autoDownloadSize,\n noBlur,\n noThumb: true,\n blurAfter: true,\n managers\n // noFadeIn: true\n });\n const thumbImage = res.images.full;\n thumbImage.classList.add('media-photo', 'thumbnail');\n // container.append(thumbImage);\n }\n\n container.classList.add('media-container-fitted');\n container.append(aspecter);\n }\n } else {\n if(!size) {\n size = choosePhotoSize(photo, boxWidth, boxHeight, true);\n }\n\n cacheContext = await managers.thumbsStorage.getCacheContext(photo, size?.type);\n }\n\n if(!noThumb && !isWebDoc) {\n const gotThumb = getStrippedThumbIfNeeded(photo, cacheContext, !noBlur);\n if(gotThumb) {\n loadThumbPromise = Promise.all([loadThumbPromise, gotThumb.loadPromise]);\n ret.loadPromises.thumb = ret.loadPromises.full = loadThumbPromise;\n thumbImage = ret.images.thumb = gotThumb.image;\n thumbImage.classList.add('media-photo');\n aspecter.append(thumbImage);\n }\n }\n // }\n\n ret.aspecter = aspecter;\n\n if((size?._ === 'photoSizeEmpty' && isDocument) || (size as PhotoSize.photoStrippedSize)?.bytes) {\n return ret;\n }\n\n let media: HTMLVideoElement | HTMLImageElement;\n if(size?._ === 'videoSize') {\n media = ret.images.full = createVideo();\n media.autoplay = true;\n media.loop = true;\n media.muted = true;\n media.classList.add('media-photo');\n } else {\n media = ret.images.full = new Image();\n media.classList.add('media-photo');\n }\n\n // console.log('wrapPhoto downloaded:', photo, photo.downloaded, container);\n\n const needFadeIn = (thumbImage || !cacheContext.downloaded) && rootScope.settings.animationsEnabled && !noFadeIn;\n\n let preloader: ProgressivePreloader;\n const uploadingFileName = (message as Message.message)?.uploadingFileName;\n if(!withoutPreloader) {\n if(!cacheContext.downloaded || uploadingFileName) {\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend',\n isUpload: !!uploadingFileName\n });\n }\n\n if(uploadingFileName) { // means upload\n preloader.attachPromise(appDownloadManager.getUpload(uploadingFileName));\n preloader.attach(container);\n noAutoDownload = undefined;\n }\n }\n\n\n const getDownloadPromise = () => {\n // const promise = isGif && !size ?\n // managers.appDocsManager.downloadDoc(photo, /* undefined, */lazyLoadQueue?.queueId) :\n // managers.appPhotosManager.preloadPhoto(photo, size, lazyLoadQueue?.queueId, noAutoDownload);\n const haveToDownload = isImageFromDocument && !size;\n const promise = appDownloadManager.downloadMediaURL({\n media: photo,\n thumb: size,\n queueId: lazyLoadQueue?.queueId,\n onlyCache: haveToDownload ? undefined : noAutoDownload\n });\n\n return promise;\n };\n\n const renderOnLoad = (url: string) => {\n return renderMediaWithFadeIn(container, media, url, needFadeIn, aspecter, thumbImage);\n };\n\n const onLoad = async(url: string) => {\n if(middleware && !middleware()) return;\n\n if(processUrl) {\n url = await processUrl(url);\n }\n\n if(blurAfter) {\n const result = blur(url, 12);\n return result.promise.then(() => {\n // image = result.canvas;\n return renderOnLoad(result.canvas.toDataURL());\n });\n }\n\n return renderOnLoad(url);\n };\n\n let loadPromise: Promise;\n const canAttachPreloader = (\n (size as PhotoSize.photoSize).w >= 150 &&\n (size as PhotoSize.photoSize).h >= 150\n ) || noAutoDownload;\n const load = async() => {\n if(noAutoDownload && !withoutPreloader && preloader) {\n preloader.construct();\n preloader.setManual();\n }\n\n const promise = getDownloadPromise();\n const cacheContext = await managers.thumbsStorage.getCacheContext(photo, size?.type);\n if(\n preloader &&\n !cacheContext.downloaded &&\n !withoutPreloader &&\n canAttachPreloader\n ) {\n preloader.attach(container, false, promise);\n }\n\n noAutoDownload = undefined;\n\n const renderPromise = promise.then(onLoad);\n renderPromise.catch(noop);\n return {download: promise, render: renderPromise};\n };\n\n if(preloader) {\n preloader.setDownloadFunction(load);\n }\n\n if(cacheContext.downloaded) {\n loadThumbPromise = loadPromise = (await load()).render;\n } else {\n if(!lazyLoadQueue) loadPromise = (await load()).render;\n /* else if(noAutoDownload) {\n preloader.construct();\n preloader.setManual();\n preloader.attach(container);\n } */ else lazyLoadQueue.push({div: container, load: () => load().then(({download}) => download)});\n }\n\n if(loadPromises && loadThumbPromise) {\n loadPromises.push(loadThumbPromise);\n }\n\n // const perf = performance.now();\n await loadThumbPromise;\n ret.loadPromises.thumb = loadThumbPromise;\n ret.loadPromises.full = loadPromise || Promise.resolve();\n ret.preloader = preloader;\n\n // const elapsedTime = performance.now() - perf;\n // if(elapsedTime > 4) {\n // console.log('wrapping photo thumb time', elapsedTime, photo, size);\n // }\n\n return ret;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport getMessageSenderPeerIdOrName from '../../lib/appManagers/utils/messages/getMessageSenderPeerIdOrName';\nimport {i18n} from '../../lib/langPack';\nimport rootScope from '../../lib/rootScope';\nimport wrapPeerTitle from './peerTitle';\n\nexport default async function wrapSenderToPeer(message: MyMessage) {\n const senderTitle: HTMLElement = document.createElement('span');\n senderTitle.classList.add('sender-title');\n\n const fromMe = message.fromId === rootScope.myId && message.peerId !== rootScope.myId;\n senderTitle.append(\n fromMe ?\n i18n('FromYou') :\n await wrapPeerTitle({\n ...getMessageSenderPeerIdOrName(message),\n dialog: message.peerId === rootScope.myId\n })\n );\n\n if(await rootScope.managers.appPeersManager.isAnyGroup(message.peerId) || fromMe) {\n const peerTitle = await wrapPeerTitle({peerId: message.peerId});\n senderTitle.append(' ➝ ', peerTitle);\n }\n\n return senderTitle;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatDateAccordingToTodayNew} from '../../helpers/date';\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\n\nexport default function wrapSentTime(message: MyMessage) {\n const el: HTMLElement = document.createElement('span');\n el.classList.add('sent-time');\n el.append(formatDateAccordingToTodayNew(new Date(message.date * 1000)));\n\n return el;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_WEBP_SUPPORTED from '../../environment/webpSupport';\nimport assumeType from '../../helpers/assumeType';\nimport getPathFromBytes from '../../helpers/bytes/getPathFromBytes';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport computeLockColor from '../../helpers/computeLockColor';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport renderImageFromUrl, {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport getImageFromStrippedThumb from '../../helpers/getImageFromStrippedThumb';\nimport getPreviewURLFromThumb from '../../helpers/getPreviewURLFromThumb';\nimport makeError from '../../helpers/makeError';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport {isSavingLottiePreview, saveLottiePreview} from '../../helpers/saveLottiePreview';\nimport throttle from '../../helpers/schedulers/throttle';\nimport sequentialDom from '../../helpers/sequentialDom';\nimport {PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport type RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport type {ThumbCache} from '../../lib/storages/thumbs';\nimport webpWorkerController from '../../lib/webp/webpWorkerController';\nimport {Awaited, SendMessageEmojiInteractionData} from '../../types';\nimport {getEmojiToneIndex} from '../../vendor/emoji';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport PopupStickers from '../popups/stickers';\nimport {hideToast, toastNew} from '../toast';\nimport wrapStickerAnimation from './stickerAnimation';\nimport framesCache from '../../helpers/framesCache';\n\n// https://github.com/telegramdesktop/tdesktop/blob/master/Telegram/SourceFiles/history/view/media/history_view_sticker.cpp#L40\nexport const STICKER_EFFECT_MULTIPLIER = 1 + 0.245 * 2;\nconst EMOJI_EFFECT_MULTIPLIER = 3;\n\nconst locksUrls: {[docId: string]: string} = {};\n\nexport const videosCache: {[key: string]: Promise} = {};\n\nexport default async function wrapSticker({doc, div, middleware, loadStickerMiddleware, lazyLoadQueue, exportLoad, group, play, onlyThumb, emoji, width, height, withThumb, loop, loadPromises, needFadeIn, needUpscale, skipRatio, static: asStatic, managers = rootScope.managers, fullThumb, isOut, noPremium, withLock, relativeEffect, loopEffect, isCustomEmoji, syncedVideo}: {\n doc: MyDocument,\n div: HTMLElement | HTMLElement[],\n middleware?: Middleware,\n loadStickerMiddleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n exportLoad?: number,\n group?: AnimationItemGroup,\n play?: boolean,\n onlyThumb?: boolean,\n emoji?: string,\n width?: number,\n height?: number,\n withThumb?: boolean,\n loop?: RLottiePlayer['loop'],\n loadPromises?: Promise[],\n needFadeIn?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n static?: boolean,\n managers?: AppManagers,\n fullThumb?: PhotoSize | VideoSize,\n isOut?: boolean,\n noPremium?: boolean,\n withLock?: boolean,\n relativeEffect?: boolean,\n loopEffect?: boolean,\n isCustomEmoji?: boolean,\n syncedVideo?: boolean\n}) {\n div = Array.isArray(div) ? div : [div];\n\n if(isCustomEmoji) {\n emoji = doc.stickerEmojiRaw;\n }\n\n const stickerType = doc.sticker;\n if(stickerType === 1) {\n asStatic = true;\n }\n\n if(!width && !height) {\n const sizes = mediaSizes.active;\n const boxSize = emoji ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\n const size = makeMediaSize(doc.w, doc.h).aspectFitted(boxSize);\n width = size.width;\n height = size.height;\n }\n\n if(stickerType === 2) {\n // LottieLoader.loadLottie();\n lottieLoader.loadLottieWorkers();\n }\n\n div.forEach((div) => {\n div.dataset.docId = '' + doc.id;\n if(emoji) {\n div.dataset.stickerEmoji = emoji;\n }\n\n div.classList.add('media-sticker-wrapper');\n });\n\n /* if(stickerType === 3) {\n const videoRes = wrapVideo({\n doc,\n boxWidth: width,\n boxHeight: height,\n container: div,\n group,\n lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n loadPromises,\n noPlayButton: true,\n noInfo: true\n });\n\n if(videoRes.thumb) {\n if(videoRes.thumb.images.thumb) {\n videoRes.thumb.images.thumb.classList.add('media-sticker', 'thumbnail');\n }\n\n if(videoRes.thumb.images.full) {\n videoRes.thumb.images.full.classList.add('media-sticker');\n }\n }\n\n return videoRes.loadPromise;\n } */\n\n // console.log('wrap sticker', doc, div, onlyThumb);\n\n let cacheContext: ThumbCache;\n const getCacheContext = async(type: string = cacheContext?.type) => {\n return cacheContext = await managers.thumbsStorage.getCacheContext(doc, type);\n };\n\n const isAnimated = !asStatic && (stickerType === 2 || stickerType === 3);\n\n const effectThumb = getStickerEffectThumb(doc);\n if(isOut !== undefined && effectThumb && !isOut) {\n div.forEach((div) => div.classList.add('reflect-x'));\n }\n\n const willHaveLock = effectThumb && withLock;\n if(willHaveLock) {\n const lockUrl = locksUrls[doc.id];\n div.forEach((div) => {\n div.classList.add('is-premium-sticker', 'tgico-premium_lock');\n lockUrl && div.style.setProperty('--lock-url', `url(${lockUrl})`);\n });\n }\n\n if(asStatic && stickerType !== 1) {\n const thumb = choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\n await getCacheContext(thumb.type);\n } else {\n await getCacheContext(fullThumb?.type);\n }\n\n const toneIndex = emoji && !isCustomEmoji ? getEmojiToneIndex(emoji) : -1;\n const downloaded = cacheContext.downloaded && !needFadeIn;\n\n const isThumbNeededForType = isAnimated;\n const lottieCachedThumb = stickerType === 2 || stickerType === 3 ? await managers.appDocsManager.getLottieCachedThumb(doc.id, toneIndex) : undefined;\n\n const ret = {render: undefined as typeof loadPromise, load: undefined as typeof load};\n let loadThumbPromise = deferredPromise();\n let haveThumbCached = false;\n if((\n doc.thumbs?.length ||\n lottieCachedThumb\n ) &&\n !div[0].firstElementChild && (\n !downloaded ||\n isThumbNeededForType ||\n onlyThumb\n ) && withThumb !== false/* && doc.thumbs[0]._ !== 'photoSizeEmpty' */\n ) {\n let thumb = lottieCachedThumb || doc.thumbs[0];\n\n // console.log('wrap sticker', thumb, div);\n\n const afterRender = (div: HTMLElement, thumbImage: HTMLElement) => {\n if(!div.childElementCount) {\n thumbImage.classList.add('media-sticker', 'thumbnail');\n\n sequentialDom.mutateElement(div, () => {\n div.append(thumbImage);\n loadThumbPromise.resolve();\n });\n } else {\n loadThumbPromise.resolve();\n }\n };\n\n if('url' in thumb) {\n haveThumbCached = true;\n div.forEach((div) => {\n const thumbImage = new Image();\n renderImageFromUrl(thumbImage, (thumb as any).url, () => afterRender(div, thumbImage));\n });\n } else if('bytes' in thumb) {\n if(thumb._ === 'photoPathSize') {\n if(!thumb.bytes.length) {\n thumb = doc.thumbs.find((t) => (t as PhotoSize.photoStrippedSize).bytes?.length) || thumb;\n }\n\n const d = getPathFromBytes((thumb as PhotoSize.photoStrippedSize).bytes);\n const ns = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(ns, 'svg');\n svg.classList.add('rlottie-vector', 'media-sticker', 'thumbnail');\n svg.setAttributeNS(null, 'viewBox', `0 0 ${doc.w || 512} ${doc.h || 512}`);\n\n // const defs = document.createElementNS(ns, 'defs');\n // const linearGradient = document.createElementNS(ns, 'linearGradient');\n // linearGradient.setAttributeNS(null, 'id', 'g');\n // linearGradient.setAttributeNS(null, 'x1', '-300%');\n // linearGradient.setAttributeNS(null, 'x2', '-200%');\n // linearGradient.setAttributeNS(null, 'y1', '0');\n // linearGradient.setAttributeNS(null, 'y2', '0');\n // const stops = [\n // ['-10%', '.1'],\n // ['30%', '.07'],\n // ['70%', '.07'],\n // ['110%', '.1']\n // ].map(([offset, stopOpacity]) => {\n // const stop = document.createElementNS(ns, 'stop');\n // stop.setAttributeNS(null, 'offset', offset);\n // stop.setAttributeNS(null, 'stop-opacity', stopOpacity);\n // return stop;\n // });\n // const animates = [\n // ['-300%', '1200%'],\n // ['-200%', '1300%']\n // ].map(([from, to], idx) => {\n // const animate = document.createElementNS(ns, 'animate');\n // animate.setAttributeNS(null, 'attributeName', 'x' + (idx + 1));\n // animate.setAttributeNS(null, 'from', from);\n // animate.setAttributeNS(null, 'to', to);\n // animate.setAttributeNS(null, 'dur', '3s');\n // animate.setAttributeNS(null, 'repeatCount', 'indefinite');\n // return animate;\n // });\n // linearGradient.append(...stops, ...animates);\n // defs.append(linearGradient);\n // svg.append(defs);\n\n const path = document.createElementNS(ns, 'path');\n path.setAttributeNS(null, 'd', d);\n if(rootScope.settings.animationsEnabled && !isCustomEmoji) path.setAttributeNS(null, 'fill', 'url(#g)');\n svg.append(path);\n div.forEach((div, idx) => div.append(idx > 0 ? svg.cloneNode(true) : svg));\n haveThumbCached = true;\n loadThumbPromise.resolve();\n } else if(toneIndex <= 0) {\n const r = () => {\n (div as HTMLElement[]).forEach((div) => {\n const thumbImage = new Image();\n const url = getPreviewURLFromThumb(doc, thumb as PhotoSize.photoStrippedSize, true);\n renderImageFromUrl(thumbImage, url, () => afterRender(div, thumbImage));\n });\n };\n\n if((IS_WEBP_SUPPORTED || doc.pFlags.stickerThumbConverted || cacheContext.url)/* && false */) {\n haveThumbCached = true;\n r();\n } else {\n haveThumbCached = true;\n webpWorkerController.convert('main-' + doc.id, thumb.bytes).then((bytes) => {\n managers.appDocsManager.saveWebPConvertedStrippedThumb(doc.id, bytes);\n (thumb as PhotoSize.photoStrippedSize).bytes = bytes;\n doc.pFlags.stickerThumbConverted = true;\n\n if((middleware && !middleware()) || (div as HTMLElement[])[0].childElementCount) {\n loadThumbPromise.resolve();\n return;\n }\n\n r();\n }).catch(() => loadThumbPromise.resolve());\n }\n }\n } else if(((stickerType === 2 && toneIndex <= 0) || stickerType === 3) && (withThumb || onlyThumb)) {\n const load = async() => {\n if((div as HTMLElement[])[0].childElementCount || (middleware && !middleware())) {\n loadThumbPromise.resolve();\n return;\n }\n\n const r = (div: HTMLElement, thumbImage: HTMLElement, url: string) => {\n if(div.childElementCount || (middleware && !middleware())) {\n loadThumbPromise.resolve();\n return;\n }\n\n if(!url) afterRender(div, thumbImage);\n else renderImageFromUrl(thumbImage, url, () => afterRender(div, thumbImage));\n };\n\n await getCacheContext();\n (div as HTMLElement[]).forEach((div) => {\n if(cacheContext.url) {\n r(div, new Image(), cacheContext.url);\n } else if('bytes' in thumb) {\n const res = getImageFromStrippedThumb(doc, thumb as PhotoSize.photoStrippedSize, true);\n res.loadPromise.then(() => r(div, res.image, ''));\n\n // return managers.appDocsManager.getThumbURL(doc, thumb as PhotoSize.photoStrippedSize).promise.then(r);\n } else {\n appDownloadManager.downloadMediaURL({\n media: doc,\n thumb: thumb as PhotoSize\n }).then(async(url) => {\n return r(div, new Image(), url);\n });\n }\n });\n };\n\n if(lazyLoadQueue && onlyThumb) {\n lazyLoadQueue.push({div: div[0], load});\n loadThumbPromise.resolve();\n return ret;\n } else {\n load();\n\n if((thumb as any).url) {\n haveThumbCached = true;\n }\n }\n }\n }\n\n if(loadPromises && haveThumbCached) {\n loadPromises.push(loadThumbPromise);\n }\n\n if(onlyThumb/* || true */) { // for sticker panel\n return ret;\n }\n\n const middlewareError = makeError('MIDDLEWARE');\n const load = async() => {\n if(middleware && !middleware()) {\n throw middlewareError;\n }\n\n if(stickerType === 2 && !asStatic) {\n return appDownloadManager.downloadMedia({media: doc, queueId: lazyLoadQueue?.queueId, thumb: fullThumb})\n .then(async(blob) => {\n if(middleware && !middleware()) {\n throw middlewareError;\n }\n\n const animation = await lottieLoader.loadAnimationWorker({\n container: (div as HTMLElement[])[0],\n loop: !!(!emoji || isCustomEmoji) && loop,\n autoplay: play,\n animationData: blob,\n width,\n height,\n name: 'doc' + doc.id,\n needUpscale,\n skipRatio,\n toneIndex,\n sync: isCustomEmoji\n }, group, loadStickerMiddleware ?? middleware);\n\n // const deferred = deferredPromise();\n\n const setLockColor = willHaveLock ? () => {\n const lockUrl = locksUrls[doc.id] ??= computeLockColor(animation.canvas[0]);\n (div as HTMLElement[]).forEach((div) => div.style.setProperty('--lock-url', `url(${lockUrl})`));\n } : undefined;\n\n const onFirstFrame = (container: HTMLElement, canvas: HTMLCanvasElement) => {\n const element = container.firstElementChild;\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !element || element.tagName === 'svg') && rootScope.settings.animationsEnabled;\n }\n\n const cb = () => {\n if(element && element !== canvas && element.tagName !== 'DIV') {\n element.remove();\n }\n };\n\n if(!needFadeIn) {\n if(element) {\n sequentialDom.mutate(cb);\n }\n } else {\n sequentialDom.mutate(() => {\n canvas && canvas.classList.add('fade-in');\n if(element) {\n element.classList.add('fade-out');\n }\n\n (canvas || element).addEventListener('animationend', () => {\n sequentialDom.mutate(() => {\n canvas && canvas.classList.remove('fade-in');\n cb();\n });\n }, {once: true});\n });\n }\n };\n\n animation.addEventListener('firstFrame', () => {\n const canvas = animation.canvas[0];\n if(withThumb !== false || isCustomEmoji) {\n saveLottiePreview(doc, canvas, toneIndex);\n }\n\n if(willHaveLock) {\n setLockColor();\n }\n\n if(!isCustomEmoji) {\n (div as HTMLElement[]).forEach((container, idx) => {\n onFirstFrame(container, animation.canvas[idx]);\n });\n }\n }, {once: true});\n\n if(emoji) {\n managers.appStickersManager.preloadAnimatedEmojiStickerAnimation(emoji);\n }\n\n return animation;\n\n // return deferred;\n // await new Promise((resolve) => setTimeout(resolve, 5e3));\n });\n } else if(asStatic || stickerType === 3) {\n const isSingleVideo = isAnimated && syncedVideo;\n const cacheName = isSingleVideo ? framesCache.generateName('' + doc.id, 0, 0, undefined, undefined) : undefined;\n\n const cachePromise = videosCache[cacheName];\n if(cachePromise) {\n return cachePromise as typeof promise;\n }\n\n const d = isSingleVideo ? (div as HTMLElement[]).slice(0, 1) : div as HTMLElement[];\n const media: HTMLElement[] = d.map(() => {\n let media: HTMLElement;\n if(asStatic) {\n media = new Image();\n } else {\n const video = media = createVideo();\n video.muted = true;\n if(play) video.autoplay = true;\n if(loop) video.loop = true;\n\n if(loop && typeof(loop) === 'number') {\n let previousTime = 0, playedTimes = 0;\n function onTimeupdate(this: HTMLVideoElement) {\n if(previousTime > this.currentTime && ++playedTimes === loop as number) {\n this.autoplay = false;\n this.loop = false;\n this.pause();\n video.removeEventListener('timeupdate', onTimeupdate);\n }\n\n previousTime = this.currentTime;\n }\n\n video.addEventListener('timeupdate', onTimeupdate);\n }\n }\n\n media.classList.add('media-sticker');\n return media;\n });\n\n const thumbImage = (div as HTMLElement[]).map((div, idx) => (div.firstElementChild as HTMLElement) !== media[idx] && div.firstElementChild) as HTMLElement[];\n if(needFadeIn !== false) {\n needFadeIn = (needFadeIn || !downloaded || (asStatic ? thumbImage[0] : (!thumbImage[0] || thumbImage[0].tagName === 'svg'))) && rootScope.settings.animationsEnabled;\n }\n\n if(needFadeIn) {\n media.forEach((media) => media.classList.add('fade-in'));\n }\n\n const promise = new Promise(async(resolve, reject) => {\n const r = async() => {\n if(middleware && !middleware()) {\n reject(middlewareError);\n return;\n }\n\n const mediaLength = media.length;\n const loaded: HTMLElement[] = [];\n const onLoad = (div: HTMLElement, media: HTMLElement, thumbImage: HTMLElement) => {\n sequentialDom.mutateElement(div, () => {\n if(middleware && !middleware()) {\n reject(middlewareError);\n return;\n }\n\n if(!media) {\n if(!isSingleVideo || !isAnimated) {\n thumbImage?.remove();\n }\n\n return;\n }\n\n if(media as HTMLVideoElement) {\n const w = width * window.devicePixelRatio;\n const h = height * window.devicePixelRatio;\n if(!isSavingLottiePreview(doc, toneIndex, w, h)) {\n // const perf = performance.now();\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(media as HTMLVideoElement, 0, 0, canvas.width, canvas.height);\n saveLottiePreview(doc, canvas, toneIndex);\n // console.log('perf', performance.now() - perf);\n }\n }\n\n if(isSingleVideo) {\n resolve(media as any);\n return;\n }\n\n div.append(media);\n\n if(needFadeIn) {\n thumbImage && thumbImage.classList.add('fade-out');\n media.addEventListener('animationend', () => {\n media.classList.remove('fade-in');\n thumbImage?.remove();\n }, {once: true});\n } else {\n thumbImage?.remove();\n }\n\n if(isAnimated) {\n animationIntersector.addAnimation(media as HTMLVideoElement, group);\n }\n\n if(loaded.push(media) === mediaLength) {\n resolve(loaded as any);\n }\n });\n };\n\n await getCacheContext();\n let lastPromise: Promise;\n (div as HTMLElement[]).forEach((div, idx) => {\n const _media = media[idx];\n const cb = () => onLoad(div, _media, thumbImage[idx]);\n if(_media) lastPromise = renderImageFromUrlPromise(_media, cacheContext.url);\n lastPromise.then(cb);\n });\n };\n\n await getCacheContext();\n if(cacheContext.url) r();\n else {\n let promise: Promise;\n if(stickerType !== 1 && asStatic) {\n const thumb = choosePhotoSize(doc, width, height, false) as PhotoSize.photoSize;\n // promise = managers.appDocsManager.getThumbURL(doc, thumb).promise\n promise = appDownloadManager.downloadMediaURL({media: doc, thumb, queueId: lazyLoadQueue?.queueId});\n } else {\n promise = appDownloadManager.downloadMediaURL({media: doc, queueId: lazyLoadQueue?.queueId});\n }\n\n promise.then(r, reject);\n }\n });\n\n if(cacheName) {\n videosCache[cacheName] = promise as any;\n loadStickerMiddleware && promise.finally(() => {\n if(!loadStickerMiddleware()) {\n delete videosCache[cacheName];\n }\n });\n }\n\n return promise;\n }\n };\n\n if(exportLoad && ((exportLoad === 1 && (!downloaded || isAnimated)) || exportLoad === 2)) {\n ret.load = load;\n return ret;\n }\n\n const loadPromise: Promise> | void> = lazyLoadQueue && (!downloaded || isAnimated) ?\n (lazyLoadQueue.push({div: div[0], load}), Promise.resolve()) :\n load();\n\n if(downloaded && (asStatic/* || stickerType === 3 */)) {\n loadThumbPromise = loadPromise as any;\n if(loadPromises) {\n loadPromises.push(loadThumbPromise);\n }\n }\n\n if(stickerType === 2 && effectThumb && isOut !== undefined && !noPremium) {\n attachStickerEffectHandler({\n container: div[0],\n doc,\n managers,\n middleware,\n isOut,\n width,\n loadPromise,\n relativeEffect,\n loopEffect\n });\n }\n\n ret.render = loadPromise as any;\n return ret;\n}\n\nfunction attachStickerEffectHandler({container, doc, managers, middleware, isOut, width, loadPromise, relativeEffect, loopEffect}: {\n container: HTMLElement,\n doc: MyDocument,\n managers: AppManagers,\n middleware: Middleware,\n isOut: boolean,\n width: number,\n loadPromise: Promise,\n relativeEffect?: boolean,\n loopEffect?: boolean\n}) {\n managers.appStickersManager.preloadSticker(doc.id, true);\n\n let playing = false;\n attachClickEvent(container, async(e) => {\n cancelEvent(e);\n if(playing) {\n const a = document.createElement('a');\n a.onclick = () => {\n hideToast();\n new PopupStickers(doc.stickerSetInput).show();\n };\n\n toastNew({\n langPackKey: 'Sticker.Premium.Click.Info',\n langPackArguments: [a]\n });\n\n return;\n }\n\n playing = true;\n\n await loadPromise;\n const {animationDiv, stickerPromise} = wrapStickerAnimation({\n doc,\n middleware,\n side: isOut ? 'right' : 'left',\n size: width * STICKER_EFFECT_MULTIPLIER,\n target: container,\n play: true,\n fullThumb: getStickerEffectThumb(doc),\n relativeEffect,\n loopEffect\n });\n\n if(isOut !== undefined && !isOut/* && !relativeEffect */) {\n animationDiv.classList.add('reflect-x');\n }\n\n stickerPromise.then((player) => {\n player.addEventListener('destroy', () => {\n playing = false;\n });\n });\n });\n}\n\nexport async function onEmojiStickerClick({event, container, managers, peerId, middleware}: {\n event: Event,\n container: HTMLElement,\n managers: AppManagers,\n peerId: PeerId,\n middleware: Middleware\n}) {\n cancelEvent(event);\n\n const bubble = findUpClassName(container, 'bubble');\n const emoji = container.dataset.stickerEmoji;\n\n const animation = !container.classList.contains('custom-emoji') ? lottieLoader.getAnimation(container) : undefined;\n if(animation?.paused) {\n const doc = await managers.appStickersManager.getAnimatedEmojiSoundDocument(emoji);\n if(doc) {\n const audio = document.createElement('audio');\n audio.style.display = 'none';\n container.parentElement.append(audio);\n\n try {\n const url = await appDownloadManager.downloadMediaURL({media: doc});\n\n audio.src = url;\n audio.play();\n await onMediaLoad(audio, undefined, true);\n\n audio.addEventListener('ended', () => {\n audio.src = '';\n audio.remove();\n }, {once: true});\n } catch(err) {\n\n }\n }\n\n animation.autoplay = true;\n animation.restart();\n }\n\n if(!peerId.isUser()) {\n return;\n }\n\n const doc = await managers.appStickersManager.getAnimatedEmojiSticker(emoji, true);\n if(!doc) {\n return;\n }\n\n const data: SendMessageEmojiInteractionData = (container as any).emojiData ??= {\n a: [],\n v: 1\n };\n\n const sendInteractionThrottled: () => void = (container as any).sendInteractionThrottled = throttle(() => {\n const length = data.a.length;\n if(!length) {\n return;\n }\n\n const firstTime = data.a[0].t;\n\n data.a.forEach((a) => {\n a.t = (a.t - firstTime) / 1000;\n });\n\n const bubble = findUpClassName(container, 'bubble');\n managers.appMessagesManager.setTyping(appImManager.chat.peerId, {\n _: 'sendMessageEmojiInteraction',\n msg_id: getServerMessageId(+bubble.dataset.mid),\n emoticon: emoji,\n interaction: {\n _: 'dataJSON',\n data: JSON.stringify(data)\n }\n }, true, appImManager.chat.threadId);\n\n data.a.length = 0;\n }, 1000, false);\n\n const isOut = bubble ? bubble.classList.contains('is-out') : undefined;\n const {animationDiv} = wrapStickerAnimation({\n doc,\n middleware,\n side: isOut ? 'right' : 'left',\n size: 360,\n target: container,\n play: true,\n withRandomOffset: true\n });\n\n if(isOut !== undefined && !isOut) {\n animationDiv.classList.add('reflect-x');\n }\n\n // using a trick here: simulated event from interlocutor's interaction won't fire ours\n if(event.isTrusted) {\n data.a.push({\n i: 1,\n t: Date.now()\n });\n\n sendInteractionThrottled();\n }\n // });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n/**\n * https://core.telegram.org/api/files#vector-thumbnails\n */\nexport default function getPathFromBytes(bytes: Uint8Array) {\n const lookup = 'AACAAAAHAAALMAAAQASTAVAAAZaacaaaahaaalmaaaqastava.az0123456789-,';\n\n let path = 'M';\n for(let i = 0, length = bytes.length; i < length; ++i) {\n const num = bytes[i];\n\n if(num >= (128 + 64)) {\n path += lookup[num - 128 - 64];\n } else {\n if(num >= 128) {\n path += ',';\n } else if(num >= 64) {\n path += '-';\n }\n path += '' + (num & 63);\n }\n }\n path += 'z';\n\n return path;\n}\n","// https://github.com/telegramdesktop/tdesktop/blob/543bfab24a76402992421063f1e6444f347d31fe/Telegram/SourceFiles/boxes/sticker_set_box.cpp#L75\nexport default function computeLockColor(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n const size = 20 * (canvas.dpr ?? 1);\n const width = size;\n const height = size;\n const skipx = (canvas.width - width) / 2;\n const margin = 0/* * (canvas.dpr ?? 1) */;\n const skipy = canvas.height - height - margin;\n const imageData = context.getImageData(skipx, skipy, width, height).data;\n let sr = 0, sg = 0, sb = 0, sa = 0;\n for(let i = 0; i < imageData.length; i += 4) {\n sr += imageData[i];\n sg += imageData[i + 1];\n sb += imageData[i + 2];\n sa += imageData[i + 3];\n }\n\n const outCanvas = document.createElement('canvas');\n outCanvas.width = size;\n outCanvas.height = size;\n const outContext = outCanvas.getContext('2d');\n const color = new Uint8ClampedArray([sr * 255 / sa, sg * 255 / sa, sb * 255 / sa, 255]);\n const rgba = `rgba(${color[0]}, ${color[1]}, ${color[2]}, ${color[3]})`;\n outContext.fillStyle = rgba;\n outContext.fillRect(0, 0, outCanvas.width, outCanvas.height);\n outContext.fillStyle = `rgba(112, 117, 121, 0.3)`;\n outContext.fillRect(0, 0, outCanvas.width, outCanvas.height);\n // document.querySelector('.popup-title').append(c);\n return outCanvas.toDataURL('image/jpeg');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_VIBRATE_SUPPORTED from '../../environment/vibrateSupport';\nimport assumeType from '../../helpers/assumeType';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport makeError from '../../helpers/makeError';\nimport {getMiddleware, Middleware} from '../../helpers/middleware';\nimport throttleWithRaf from '../../helpers/schedulers/throttleWithRaf';\nimport windowSize from '../../helpers/windowSize';\nimport {PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport wrapSticker from './sticker';\n\nexport default function wrapStickerAnimation({\n size,\n doc,\n middleware,\n target,\n side,\n skipRatio,\n play,\n managers,\n fullThumb,\n withRandomOffset,\n relativeEffect,\n loopEffect\n}: {\n size: number,\n doc: MyDocument,\n middleware?: Middleware,\n target: HTMLElement,\n side: 'left' | 'center' | 'right',\n skipRatio?: number,\n play: boolean,\n managers?: AppManagers,\n fullThumb?: PhotoSize | VideoSize,\n withRandomOffset?: boolean,\n relativeEffect?: boolean,\n loopEffect?: boolean\n}) {\n const animationDiv = document.createElement('div');\n animationDiv.classList.add('emoji-animation');\n\n // const size = 280;\n animationDiv.style.width = size + 'px';\n animationDiv.style.height = size + 'px';\n\n let animation: RLottiePlayer;\n const unmountAnimation = () => {\n middlewareHelper.clean();\n animation?.remove();\n animationDiv.remove();\n appImManager.chat.bubbles.scrollable.container.removeEventListener('scroll', onScroll);\n };\n\n const middlewareHelper = middleware?.create() ?? getMiddleware();\n middleware = middlewareHelper.get();\n\n const stickerPromise = wrapSticker({\n div: animationDiv,\n doc,\n middleware,\n withThumb: false,\n needFadeIn: false,\n loop: !!loopEffect,\n width: size,\n height: size,\n play,\n group: 'none',\n skipRatio,\n managers,\n fullThumb\n }).then(({render}) => render).then((_animation) => {\n assumeType(_animation);\n if(!middleware()) {\n _animation.remove();\n throw makeError('MIDDLEWARE');\n }\n\n animation = _animation;\n animation.addEventListener('enterFrame', (frameNo) => {\n if((!loopEffect && frameNo === animation.maxFrame) || !isInDOM(target)) {\n unmountAnimation();\n }\n });\n\n if(IS_VIBRATE_SUPPORTED) {\n animation.addEventListener('firstFrame', () => {\n navigator.vibrate(100);\n }, {once: true});\n }\n\n return animation;\n });\n\n const generateRandomSigned = (max: number) => {\n const r = Math.random() * max * 2;\n return r > max ? -r % max : r;\n };\n\n const randomOffsetX = withRandomOffset ? generateRandomSigned(16) : 0;\n const randomOffsetY = withRandomOffset ? generateRandomSigned(4) : 0;\n const setPosition = () => {\n if(!isInDOM(target)) {\n unmountAnimation();\n return;\n }\n\n const rect = target.getBoundingClientRect();\n\n const factor = rect.width / 200;\n const stableOffsetX = side === 'center' ? 0 : 16 * (side === 'right' ? 1 : -1) * factor;\n // const stableOffsetY = side === 'center' ? 0 : -50 * factor;\n const stableOffsetY = side === 'center' ? 0 : 0 * factor;\n\n const rectX = side === 'right' ? rect.right : rect.left;\n const rectY = rect.top;\n\n const addOffsetX = (side === 'center' ? (rect.width - size) / 2 : (side === 'right' ? -size : 0)) + stableOffsetX + randomOffsetX;\n const addOffsetY = (side === 'center' || true ? (rect.height - size) / 2 : 0) + stableOffsetY + randomOffsetY;\n const x = rectX + addOffsetX;\n const y = rectY + addOffsetY;\n\n if(y <= -size || y >= windowSize.height) {\n unmountAnimation();\n return;\n }\n\n if(relativeEffect) {\n if(side !== 'center') animationDiv.style[side] = Math.abs(stableOffsetX) * -1 + 'px';\n else animationDiv.style.left = addOffsetX + 'px';\n animationDiv.style.top = addOffsetY + 'px';\n } else {\n animationDiv.style.top = y + 'px';\n animationDiv.style.left = x + 'px';\n }\n };\n\n const onScroll = throttleWithRaf(setPosition);\n appImManager.chat.bubbles.scrollable.container.addEventListener('scroll', onScroll);\n\n setPosition();\n\n if(relativeEffect) {\n animationDiv.classList.add('is-relative');\n target.parentElement.append(animationDiv);\n } else {\n appImManager.emojiAnimationContainer.append(animationDiv);\n }\n\n return {animationDiv, stickerPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport rootScope from '../../lib/rootScope';\nimport wrapSticker from './sticker'\n\nexport default async function wrapStickerEmoji({emoji, div, width, height, managers = rootScope.managers}: {\n emoji: string,\n div: HTMLElement,\n managers?: AppManagers,\n width: number,\n height: number\n}) {\n const doc = await managers.appStickersManager.getAnimatedEmojiSticker(emoji);\n if(!doc) {\n div.classList.add('media-sticker-wrapper');\n throw new Error('no sticker');\n }\n\n return wrapSticker({\n doc,\n div,\n emoji,\n width,\n height,\n loop: false,\n play: true\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport createVideo from '../../helpers/dom/createVideo';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport {Document, StickerSet} from '../../layer';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport wrapSticker from './sticker';\n\nexport default async function wrapStickerSetThumb({set, lazyLoadQueue, container, group, autoplay, width, height, managers = rootScope.managers}: {\n set: StickerSet.stickerSet,\n lazyLoadQueue: LazyLoadQueue,\n container: HTMLElement,\n group: AnimationItemGroup,\n autoplay: boolean,\n width: number,\n height: number,\n managers?: AppManagers\n}) {\n if(set.thumbs?.length) {\n container.classList.add('media-sticker-wrapper');\n lazyLoadQueue.push({\n div: container,\n load: async() => {\n const downloadOptions = await managers.appStickersManager.getStickerSetThumbDownloadOptions(set);\n const promise = appDownloadManager.download(downloadOptions);\n\n if(set.pFlags.animated && !set.pFlags.videos) {\n return promise\n .then((blob) => {\n lottieLoader.loadAnimationWorker({\n container,\n loop: true,\n autoplay,\n animationData: blob,\n width,\n height,\n needUpscale: true,\n name: 'setThumb' + set.id\n }, group);\n });\n } else {\n let media: HTMLElement;\n if(set.pFlags.videos) {\n media = createVideo();\n (media as HTMLVideoElement).autoplay = true;\n (media as HTMLVideoElement).muted = true;\n (media as HTMLVideoElement).loop = true;\n } else {\n media = new Image();\n }\n\n media.classList.add('media-sticker');\n\n return promise.then((blob) => {\n renderImageFromUrl(media, URL.createObjectURL(blob), () => {\n container.append(media);\n\n if(set.pFlags.videos) {\n animationIntersector.addAnimation(media as HTMLVideoElement, group);\n }\n });\n });\n }\n }\n });\n\n return;\n }\n\n let getDocPromise: Promise;\n\n if(set.thumb_document_id) {\n getDocPromise = managers.appEmojiManager.getCustomEmojiDocument(set.thumb_document_id);\n } else {\n getDocPromise = managers.appStickersManager.getStickerSet(set).then((stickerSet) => stickerSet.documents[0]);\n }\n\n const doc = await getDocPromise;\n if(doc._ !== 'documentEmpty') { // as thumb will be used first sticker\n wrapSticker({\n doc,\n div: container,\n group: group,\n lazyLoadQueue,\n managers,\n width,\n height\n }); // kostil\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport Row from '../row';\nimport wrapSticker from './sticker';\n\nexport default function wrapStickerToRow({doc, row, size, managers}: {\n doc: MyDocument,\n row: Row,\n size?: 'small' | 'large',\n managers?: AppManagers\n}) {\n const previousMedia = row.media;\n const media = row.createMedia('small');\n\n if(previousMedia) {\n media.classList.add('hide');\n }\n\n const loadPromises: Promise[] = previousMedia ? [] : undefined;\n\n const _size = size === 'small' ? 32 : 48;\n const result = wrapSticker({\n div: media,\n doc: doc,\n width: _size,\n height: _size,\n loadPromises,\n managers\n }).then(({render}) => render);\n\n loadPromises && Promise.all(loadPromises).then(() => {\n media.classList.remove('hide');\n previousMedia.remove();\n });\n\n return result;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport {i18n} from '../../lib/langPack';\nimport wrapTelegramUrlToAnchor from '../../lib/richTextProcessor/wrapTelegramUrlToAnchor';\nimport rootScope from '../../lib/rootScope';\nimport wrapPeerTitle from './peerTitle';\n\nexport default async function wrapTopicNameButton(\n options: {\n lastMsgId?: number\n } & Pick[0], 'peerId' | 'threadId' | 'wrapOptions' | 'withIcons'>\n) {\n const {peerId, threadId, lastMsgId} = options;\n\n const loadPromise: Promise = Promise.resolve();\n const a = wrapTelegramUrlToAnchor('t.me/c/' + peerId.toChatId() + (threadId ? '/' + getServerMessageId(threadId) : '') + (lastMsgId ? '/' + getServerMessageId(lastMsgId) : ''));\n a.classList.add('topic-name', 'topic-name-button');\n // if(threadId) {\n // const topic = await rootScope.managers.dialogsStorage.getForumTopic(peerId, threadId);\n // if(!topic) {\n // a.append(i18n('Loading'));\n // loadPromise = rootScope.managers.dialogsStorage.getForumTopicById(peerId, threadId)\n // }\n // } else {\n a.append(await wrapPeerTitle(options));\n // }\n\n return {\n cached: true,\n element: a,\n loadPromise\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport {animateSingle} from '../../helpers/animation';\nimport {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport getStrippedThumbIfNeeded from '../../helpers/getStrippedThumbIfNeeded';\nimport makeError from '../../helpers/makeError';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport noop from '../../helpers/noop';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport {fastRaf} from '../../helpers/schedulers';\nimport throttle from '../../helpers/schedulers/throttle';\nimport sequentialDom from '../../helpers/sequentialDom';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport {Message, PhotoSize, VideoSize} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport rootScope from '../../lib/rootScope';\nimport {ThumbCache} from '../../lib/storages/thumbs';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport appMediaPlaybackController, {MediaSearchContext} from '../appMediaPlaybackController';\nimport {findMediaTargets} from '../audio';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ProgressivePreloader from '../preloader';\nimport wrapPhoto from './photo';\n\nconst MAX_VIDEO_AUTOPLAY_SIZE = 50 * 1024 * 1024; // 50 MB\n\nlet roundVideoCircumference = 0;\nmediaSizes.addEventListener('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n const elements = Array.from(document.querySelectorAll('.media-round .progress-ring')) as SVGSVGElement[];\n const width = mediaSizes.active.round.width;\n const halfSize = width / 2;\n const radius = halfSize - 7;\n roundVideoCircumference = 2 * Math.PI * radius;\n elements.forEach((element) => {\n element.setAttributeNS(null, 'width', '' + width);\n element.setAttributeNS(null, 'height', '' + width);\n\n const circle = element.firstElementChild as SVGCircleElement;\n circle.setAttributeNS(null, 'cx', '' + halfSize);\n circle.setAttributeNS(null, 'cy', '' + halfSize);\n circle.setAttributeNS(null, 'r', '' + radius);\n\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\n });\n }\n});\n\nexport default async function wrapVideo({doc, container, message, boxWidth, boxHeight, withTail, isOut, middleware, lazyLoadQueue, noInfo, group, onlyPreview, noPreview, withoutPreloader, loadPromises, noPlayButton, photoSize, videoSize, searchContext, autoDownload, managers = rootScope.managers, noAutoplayAttribute}: {\n doc: MyDocument,\n container?: HTMLElement,\n message?: Message.message,\n boxWidth?: number,\n boxHeight?: number,\n withTail?: boolean,\n isOut?: boolean,\n middleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n noInfo?: boolean,\n noPlayButton?: boolean,\n group?: AnimationItemGroup,\n onlyPreview?: boolean,\n noPreview?: boolean,\n withoutPreloader?: boolean,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n photoSize?: PhotoSize,\n videoSize?: VideoSize,\n searchContext?: MediaSearchContext,\n managers?: AppManagers,\n noAutoplayAttribute?: boolean\n}) {\n const autoDownloadSize = autoDownload?.video;\n let noAutoDownload = autoDownloadSize === 0;\n const isAlbumItem = !(boxWidth && boxHeight);\n const canAutoplay = /* doc.sticker || */(\n (\n doc.type !== 'video' || (\n doc.size <= MAX_VIDEO_AUTOPLAY_SIZE &&\n !isAlbumItem\n )\n ) && (doc.type === 'gif' ? rootScope.settings.autoPlay.gifs : rootScope.settings.autoPlay.videos)\n );\n let spanTime: HTMLElement, spanPlay: HTMLElement;\n\n if(!noInfo) {\n spanTime = document.createElement('span');\n spanTime.classList.add('video-time');\n container.append(spanTime);\n\n let needPlayButton = false;\n if(doc.type !== 'gif') {\n spanTime.innerText = toHHMMSS(doc.duration, false);\n\n if(!noPlayButton && doc.type !== 'round') {\n if(canAutoplay && !noAutoDownload) {\n spanTime.classList.add('tgico', 'can-autoplay');\n } else {\n needPlayButton = true;\n }\n }\n } else {\n spanTime.innerText = 'GIF';\n\n if(!canAutoplay && !noPlayButton) {\n needPlayButton = true;\n noAutoDownload = undefined;\n }\n }\n\n if(needPlayButton) {\n spanPlay = document.createElement('span');\n spanPlay.classList.add('video-play', 'tgico-largeplay', 'btn-circle', 'position-center');\n container.append(spanPlay);\n }\n }\n\n const res: {\n thumb?: typeof photoRes,\n loadPromise: Promise\n } = {} as any;\n\n if(doc.mime_type === 'image/gif') {\n const photoRes = await wrapPhoto({\n photo: doc,\n message,\n container,\n boxWidth,\n boxHeight,\n withTail,\n isOut,\n lazyLoadQueue,\n middleware,\n withoutPreloader,\n loadPromises,\n autoDownloadSize,\n size: photoSize,\n managers\n });\n\n res.thumb = photoRes;\n res.loadPromise = photoRes.loadPromises.full;\n return res;\n }\n\n /* const video = doc.type === 'round' ? appMediaPlaybackController.addMedia(doc, message.mid) as HTMLVideoElement : document.createElement('video');\n if(video.parentElement) {\n video.remove();\n } */\n\n let preloader: ProgressivePreloader; // it must be here, otherwise will get error before initialization in round onPlay\n\n const video = createVideo();\n video.classList.add('media-video');\n video.muted = true;\n if(doc.type === 'round') {\n const divRound = document.createElement('div');\n divRound.classList.add('media-round', 'z-depth-1');\n divRound.dataset.mid = '' + message.mid;\n divRound.dataset.peerId = '' + message.peerId;\n (divRound as any).message = message;\n\n const size = mediaSizes.active.round;\n const halfSize = size.width / 2;\n const strokeWidth = 3.5;\n const radius = halfSize - (strokeWidth * 2);\n divRound.innerHTML = `\n \n `;\n\n const circle = divRound.firstElementChild.firstElementChild as SVGCircleElement;\n if(!roundVideoCircumference) {\n roundVideoCircumference = 2 * Math.PI * radius;\n }\n circle.style.strokeDasharray = roundVideoCircumference + ' ' + roundVideoCircumference;\n circle.style.strokeDashoffset = '' + roundVideoCircumference;\n\n spanTime.classList.add('tgico');\n\n const isUnread = message.pFlags.media_unread;\n if(isUnread) {\n divRound.classList.add('is-unread');\n }\n\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = doc.w/* * window.devicePixelRatio */;\n\n divRound.prepend(canvas, spanTime);\n divRound.append(video);\n container.append(divRound);\n\n const ctx = canvas.getContext('2d');\n /* ctx.beginPath();\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, Math.PI * 2);\n ctx.clip(); */\n\n const onLoad = () => {\n const message: Message.message = (divRound as any).message;\n const globalVideo = appMediaPlaybackController.addMedia(message, !noAutoDownload) as HTMLVideoElement;\n const clear = () => {\n (appImManager.chat.setPeerPromise || Promise.resolve()).finally(() => {\n if(isInDOM(globalVideo)) {\n return;\n }\n\n globalVideo.removeEventListener('play', onPlay);\n globalVideo.removeEventListener('timeupdate', throttledTimeUpdate);\n globalVideo.removeEventListener('pause', onPaused);\n globalVideo.removeEventListener('ended', onEnded);\n });\n };\n\n const onFrame = () => {\n ctx.drawImage(globalVideo, 0, 0);\n\n const offset = roundVideoCircumference - globalVideo.currentTime / globalVideo.duration * roundVideoCircumference;\n circle.style.strokeDashoffset = '' + offset;\n\n return !globalVideo.paused;\n };\n\n const onTimeUpdate = () => {\n if(!globalVideo.duration) {\n return;\n }\n\n if(!isInDOM(globalVideo)) {\n clear();\n return;\n }\n\n if(globalVideo.paused) {\n onFrame();\n }\n\n spanTime.innerText = toHHMMSS(globalVideo.duration - globalVideo.currentTime, false);\n };\n\n const throttledTimeUpdate = throttle(() => {\n fastRaf(onTimeUpdate);\n }, 1000, false);\n\n const onPlay = () => {\n video.classList.add('hide');\n divRound.classList.remove('is-paused');\n animateSingle(onFrame, canvas);\n\n if(preloader && preloader.preloader && preloader.preloader.classList.contains('manual')) {\n preloader.onClick();\n }\n };\n\n const onPaused = () => {\n if(!isInDOM(globalVideo)) {\n clear();\n return;\n }\n\n divRound.classList.add('is-paused');\n };\n\n const onEnded = () => {\n video.classList.remove('hide');\n divRound.classList.add('is-paused');\n\n video.currentTime = 0;\n spanTime.innerText = toHHMMSS(globalVideo.duration, false);\n\n if(globalVideo.currentTime) {\n globalVideo.currentTime = 0;\n }\n };\n\n globalVideo.addEventListener('play', onPlay);\n globalVideo.addEventListener('timeupdate', throttledTimeUpdate);\n globalVideo.addEventListener('pause', onPaused);\n globalVideo.addEventListener('ended', onEnded);\n\n attachClickEvent(canvas, (e) => {\n cancelEvent(e);\n\n // ! костыль\n if(preloader && !preloader.detached) {\n preloader.onClick();\n }\n\n // ! can't use it here. on Safari iOS video won't start.\n /* if(globalVideo.readyState < 2) {\n return;\n } */\n\n if(globalVideo.paused) {\n const hadSearchContext = !!searchContext;\n if(appMediaPlaybackController.setSearchContext(searchContext || {\n peerId: NULL_PEER_ID,\n inputFilter: {_: 'inputMessagesFilterEmpty'},\n useSearch: false\n })) {\n const [prev, next] = !hadSearchContext ? [] : findMediaTargets(divRound, message.mid/* , searchContext.useSearch */);\n appMediaPlaybackController.setTargets({peerId: message.peerId, mid: message.mid}, prev, next);\n }\n\n globalVideo.play();\n } else {\n globalVideo.pause();\n }\n });\n\n if(globalVideo.paused) {\n if(globalVideo.duration && globalVideo.currentTime !== globalVideo.duration && globalVideo.currentTime > 0) {\n onFrame();\n onTimeUpdate();\n video.classList.add('hide');\n } else {\n onPaused();\n }\n } else {\n onPlay();\n }\n };\n\n if(message.pFlags.is_outgoing) {\n (divRound as any).onLoad = onLoad;\n divRound.dataset.isOutgoing = '1';\n } else {\n onLoad();\n }\n } else if(!noAutoplayAttribute) {\n video.autoplay = true; // для safari\n }\n\n let photoRes: Awaited>;\n if(message) {\n photoRes = await wrapPhoto({\n photo: doc,\n message,\n container,\n boxWidth,\n boxHeight,\n withTail,\n isOut,\n lazyLoadQueue,\n middleware,\n withoutPreloader: true,\n loadPromises,\n autoDownloadSize: autoDownload?.photo,\n size: photoSize,\n managers\n });\n\n res.thumb = photoRes;\n\n if((!canAutoplay && doc.type !== 'gif') || onlyPreview) {\n res.loadPromise = photoRes.loadPromises.full;\n return res;\n }\n\n if(withTail) {\n const foreignObject = (photoRes.images.thumb || photoRes.images.full).parentElement;\n video.width = +foreignObject.getAttributeNS(null, 'width');\n video.height = +foreignObject.getAttributeNS(null, 'height');\n foreignObject.append(video);\n }\n } else if(!noPreview) { // * gifs masonry\n const gotThumb = getStrippedThumbIfNeeded(doc, {} as ThumbCache, true);\n if(gotThumb) {\n const thumbImage = gotThumb.image;\n thumbImage.classList.add('media-poster');\n container.append(thumbImage);\n res.thumb = {\n loadPromises: {\n thumb: gotThumb.loadPromise,\n full: Promise.resolve()\n },\n images: {\n thumb: thumbImage,\n full: null\n },\n preloader: null,\n aspecter: null\n };\n\n loadPromises?.push(gotThumb.loadPromise);\n res.loadPromise = gotThumb.loadPromise;\n }\n }\n\n if(onlyPreview) {\n return res;\n }\n\n if(!video.parentElement && container) {\n (photoRes?.aspecter || container).append(video);\n }\n\n let cacheContext: ThumbCache;\n const getCacheContext = async() => {\n return cacheContext = await managers.thumbsStorage.getCacheContext(doc, videoSize?.type);\n };\n\n await getCacheContext();\n\n const uploadFileName = message?.uploadingFileName;\n if(uploadFileName) { // means upload\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend',\n isUpload: true\n });\n preloader.attachPromise(appDownloadManager.getUpload(uploadFileName));\n preloader.attach(container, false);\n noAutoDownload = undefined;\n } else if(!cacheContext.downloaded && !doc.supportsStreaming && !withoutPreloader) {\n preloader = new ProgressivePreloader({\n attachMethod: 'prepend'\n });\n } else if(doc.supportsStreaming) {\n preloader = new ProgressivePreloader({\n cancelable: false,\n attachMethod: 'prepend'\n });\n }\n\n const renderDeferred = deferredPromise();\n video.addEventListener('error', (e) => {\n if(video.error.code !== 4) {\n console.error('Error ' + video.error.code + '; details: ' + video.error.message);\n }\n\n if(preloader && !uploadFileName) {\n preloader.detach();\n }\n\n if(!renderDeferred.isFulfilled) {\n renderDeferred.resolve();\n }\n }, {once: true});\n\n if(doc.type === 'video') {\n const onTimeUpdate = () => {\n if(!video.duration) {\n return;\n }\n\n spanTime.innerText = toHHMMSS(video.duration - video.currentTime, false);\n };\n\n const throttledTimeUpdate = throttle(() => {\n fastRaf(onTimeUpdate);\n }, 1e3, false);\n\n video.addEventListener('timeupdate', throttledTimeUpdate);\n\n if(spanPlay) {\n video.addEventListener('timeupdate', () => {\n sequentialDom.mutateElement(spanPlay, () => {\n spanPlay.remove();\n });\n }, {once: true});\n }\n }\n\n video.muted = true;\n video.loop = true;\n // video.play();\n if(!noAutoplayAttribute) {\n video.autoplay = true;\n }\n\n let loadPhotoThumbFunc = noAutoDownload && photoRes?.preloader?.loadFunc;\n const load = async() => {\n if(preloader && noAutoDownload && !withoutPreloader) {\n preloader.construct();\n preloader.setManual();\n }\n\n await getCacheContext();\n let loadPromise: Promise = Promise.resolve();\n if((preloader && !uploadFileName) || withoutPreloader) {\n if(!cacheContext.downloaded && !doc.supportsStreaming) {\n const promise = loadPromise = appDownloadManager.downloadMediaURL({\n media: doc,\n queueId: lazyLoadQueue?.queueId,\n onlyCache: noAutoDownload,\n thumb: videoSize\n });\n\n if(preloader) {\n preloader.attach(container, false, promise);\n }\n } else if(doc.supportsStreaming) {\n if(noAutoDownload) {\n loadPromise = Promise.reject(makeError('NO_AUTO_DOWNLOAD'));\n } else if(!cacheContext.downloaded && preloader) { // * check for uploading video\n preloader.attach(container, false, null);\n video.addEventListener(IS_SAFARI ? 'timeupdate' : 'canplay', () => {\n preloader.detach();\n }, {once: true});\n }\n }\n }\n\n if(!noAutoDownload && loadPhotoThumbFunc) {\n loadPhotoThumbFunc();\n loadPhotoThumbFunc = null;\n }\n\n noAutoDownload = undefined;\n\n loadPromise.then(async() => {\n if(middleware && !middleware()) {\n renderDeferred.resolve();\n return;\n }\n\n if(doc.type === 'round') {\n appMediaPlaybackController.resolveWaitingForLoadMedia(message.peerId, message.mid, message.pFlags.is_scheduled);\n }\n\n await getCacheContext();\n\n onMediaLoad(video).then(() => {\n if(group) {\n animationIntersector.addAnimation(video, group);\n }\n\n if(preloader && !uploadFileName) {\n preloader.detach();\n }\n\n renderDeferred.resolve();\n }, (err) => {\n console.error('video load error', err);\n if(spanTime) {\n spanTime.classList.add('is-error');\n }\n renderDeferred.reject(err);\n });\n\n renderImageFromUrl(video, cacheContext.url);\n }, noop);\n\n return {download: loadPromise, render: Promise.all([loadPromise, renderDeferred])};\n };\n\n if(preloader && !uploadFileName) {\n preloader.setDownloadFunction(load);\n }\n\n /* if(doc.size >= 20e6 && !doc.downloaded) {\n let downloadDiv = document.createElement('div');\n downloadDiv.classList.add('download');\n\n let span = document.createElement('span');\n span.classList.add('btn-circle', 'tgico-download');\n downloadDiv.append(span);\n\n downloadDiv.addEventListener('click', () => {\n downloadDiv.remove();\n loadVideo();\n });\n\n container.prepend(downloadDiv);\n\n return;\n } */\n\n if(doc.type === 'gif' && !canAutoplay) {\n attachClickEvent(container, (e) => {\n cancelEvent(e);\n spanPlay.remove();\n load();\n }, {capture: true, once: true});\n } else {\n res.loadPromise = !lazyLoadQueue ?\n (await load()).render :\n (lazyLoadQueue.push({div: container, load: () => load().then(({render}) => render)}), Promise.resolve());\n }\n\n if(res.thumb) {\n await res.thumb.loadPromises.thumb;\n }\n\n return res;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {WebPage} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapWebPageDescription(webPage: WebPage.webPage) {\n const shortDescriptionText = limitSymbols(webPage.description || '', 150, 180);\n // const siteName = webPage.site_name;\n // let contextHashtag = '';\n // if(siteName === 'GitHub') {\n // const matches = apiWebPage.url.match(/(https?:\\/\\/github\\.com\\/[^\\/]+\\/[^\\/]+)/);\n // if(matches) {\n // contextHashtag = matches[0] + '/issues/{1}';\n // }\n // }\n return wrapRichText(shortDescriptionText/* , {\n contextSite: siteName || 'external',\n contextHashtag: contextHashtag\n } */);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {WebPage} from '../../layer';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\n\nexport default function wrapWebPageTitle(webPage: WebPage.webPage) {\n let shortTitle = webPage.title || webPage.author || webPage.site_name || '';\n shortTitle = limitSymbols(shortTitle, 80, 100);\n return wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true});\n}\n","// Taken from https://core.telegram.org/bots/payments/currencies.json\nexport type Currency = {\n code: string,\n title: string,\n symbol: string,\n native: string,\n thousands_sep: string,\n decimal_sep: string,\n symbol_left: boolean,\n space_between: boolean,\n exp: number,\n min_amount: string | number,\n max_amount: string | number\n};\n\n// eslint-disable-next-line quotes, comma-spacing\nconst Currencies: {[currency: string]: Currency} = {\"AED\":{\"code\":\"AED\",\"title\":\"United Arab Emirates Dirham\",\"symbol\":\"AED\",\"native\":\"د.إ.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"367\",\"max_amount\":\"3673030\"},\"AFN\":{\"code\":\"AFN\",\"title\":\"Afghan Afghani\",\"symbol\":\"AFN\",\"native\":\"؋\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"8729\",\"max_amount\":\"87299487\"},\"ALL\":{\"code\":\"ALL\",\"title\":\"Albanian Lek\",\"symbol\":\"ALL\",\"native\":\"Lek\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":false,\"exp\":2,\"min_amount\":\"11842\",\"max_amount\":\"118421187\"},\"AMD\":{\"code\":\"AMD\",\"title\":\"Armenian Dram\",\"symbol\":\"AMD\",\"native\":\"դր.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"40943\",\"max_amount\":\"409436718\"},\"ARS\":{\"code\":\"ARS\",\"title\":\"Argentine Peso\",\"symbol\":\"ARS\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"14705\",\"max_amount\":\"147059002\"},\"AUD\":{\"code\":\"AUD\",\"title\":\"Australian Dollar\",\"symbol\":\"AU$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"153\",\"max_amount\":\"1536825\"},\"AZN\":{\"code\":\"AZN\",\"title\":\"Azerbaijani Manat\",\"symbol\":\"AZN\",\"native\":\"ман.\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"169\",\"max_amount\":\"1699858\"},\"BAM\":{\"code\":\"BAM\",\"title\":\"Bosnia & Herzegovina Convertible Mark\",\"symbol\":\"BAM\",\"native\":\"KM\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"199\",\"max_amount\":\"1990677\"},\"BDT\":{\"code\":\"BDT\",\"title\":\"Bangladeshi Taka\",\"symbol\":\"BDT\",\"native\":\"৳\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"10009\",\"max_amount\":\"100094046\"},\"BGN\":{\"code\":\"BGN\",\"title\":\"Bulgarian Lev\",\"symbol\":\"BGN\",\"native\":\"лв.\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"199\",\"max_amount\":\"1993315\"},\"BND\":{\"code\":\"BND\",\"title\":\"Brunei Dollar\",\"symbol\":\"BND\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"142\",\"max_amount\":\"1421883\"},\"BOB\":{\"code\":\"BOB\",\"title\":\"Bolivian Boliviano\",\"symbol\":\"BOB\",\"native\":\"Bs\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"683\",\"max_amount\":\"6832607\"},\"BRL\":{\"code\":\"BRL\",\"title\":\"Brazilian Real\",\"symbol\":\"R$\",\"native\":\"R$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"539\",\"max_amount\":\"5397799\"},\"BYN\":{\"code\":\"BYN\",\"title\":\"Belarusian ruble\",\"symbol\":\"BYN\",\"native\":\"BYN\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"249\",\"max_amount\":\"2495801\"},\"CAD\":{\"code\":\"CAD\",\"title\":\"Canadian Dollar\",\"symbol\":\"CA$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"136\",\"max_amount\":\"1366860\"},\"CHF\":{\"code\":\"CHF\",\"title\":\"Swiss Franc\",\"symbol\":\"CHF\",\"native\":\"CHF\",\"thousands_sep\":\"'\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"97\",\"max_amount\":\"976705\"},\"CLP\":{\"code\":\"CLP\",\"title\":\"Chilean Peso\",\"symbol\":\"CLP\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":0,\"min_amount\":\"963\",\"max_amount\":\"9637495\"},\"CNY\":{\"code\":\"CNY\",\"title\":\"Chinese Renminbi Yuan\",\"symbol\":\"CN¥\",\"native\":\"CN¥\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"709\",\"max_amount\":\"7094102\"},\"COP\":{\"code\":\"COP\",\"title\":\"Colombian Peso\",\"symbol\":\"COP\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"452870\",\"max_amount\":\"4528700000\"},\"CRC\":{\"code\":\"CRC\",\"title\":\"Costa Rican Colón\",\"symbol\":\"CRC\",\"native\":\"₡\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"62506\",\"max_amount\":\"625061070\"},\"CZK\":{\"code\":\"CZK\",\"title\":\"Czech Koruna\",\"symbol\":\"CZK\",\"native\":\"Kč\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"2497\",\"max_amount\":\"24975029\"},\"DKK\":{\"code\":\"DKK\",\"title\":\"Danish Krone\",\"symbol\":\"DKK\",\"native\":\"kr\",\"thousands_sep\":\"\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"755\",\"max_amount\":\"7555990\"},\"DOP\":{\"code\":\"DOP\",\"title\":\"Dominican Peso\",\"symbol\":\"DOP\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5275\",\"max_amount\":\"52757308\"},\"DZD\":{\"code\":\"DZD\",\"title\":\"Algerian Dinar\",\"symbol\":\"DZD\",\"native\":\"د.ج.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"14035\",\"max_amount\":\"140353307\"},\"EGP\":{\"code\":\"EGP\",\"title\":\"Egyptian Pound\",\"symbol\":\"EGP\",\"native\":\"ج.م.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1953\",\"max_amount\":\"19537405\"},\"ETB\":{\"code\":\"ETB\",\"title\":\"Ethiopian Birr\",\"symbol\":\"ETB\",\"native\":\"ብር\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5224\",\"max_amount\":\"52247069\"},\"EUR\":{\"code\":\"EUR\",\"title\":\"Euro\",\"symbol\":\"€\",\"native\":\"€\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"101\",\"max_amount\":\"1016045\"},\"GBP\":{\"code\":\"GBP\",\"title\":\"British Pound\",\"symbol\":\"£\",\"native\":\"£\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"89\",\"max_amount\":\"894445\"},\"GEL\":{\"code\":\"GEL\",\"title\":\"Georgian Lari\",\"symbol\":\"GEL\",\"native\":\"GEL\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"283\",\"max_amount\":\"2830234\"},\"GTQ\":{\"code\":\"GTQ\",\"title\":\"Guatemalan Quetzal\",\"symbol\":\"GTQ\",\"native\":\"Q\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"778\",\"max_amount\":\"7781323\"},\"HKD\":{\"code\":\"HKD\",\"title\":\"Hong Kong Dollar\",\"symbol\":\"HK$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"784\",\"max_amount\":\"7849750\"},\"HNL\":{\"code\":\"HNL\",\"title\":\"Honduran Lempira\",\"symbol\":\"HNL\",\"native\":\"L\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"2441\",\"max_amount\":\"24413729\"},\"HRK\":{\"code\":\"HRK\",\"title\":\"Croatian Kuna\",\"symbol\":\"HRK\",\"native\":\"kn\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"764\",\"max_amount\":\"7648805\"},\"HUF\":{\"code\":\"HUF\",\"title\":\"Hungarian Forint\",\"symbol\":\"HUF\",\"native\":\"Ft\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"42685\",\"max_amount\":\"426850229\"},\"IDR\":{\"code\":\"IDR\",\"title\":\"Indonesian Rupiah\",\"symbol\":\"IDR\",\"native\":\"Rp\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"1523370\",\"max_amount\":\"15233700000\"},\"ILS\":{\"code\":\"ILS\",\"title\":\"Israeli New Sheqel\",\"symbol\":\"₪\",\"native\":\"₪\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"354\",\"max_amount\":\"3543350\"},\"INR\":{\"code\":\"INR\",\"title\":\"Indian Rupee\",\"symbol\":\"₹\",\"native\":\"₹\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"8155\",\"max_amount\":\"81555550\"},\"ISK\":{\"code\":\"ISK\",\"title\":\"Icelandic Króna\",\"symbol\":\"ISK\",\"native\":\"kr\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":0,\"min_amount\":\"142\",\"max_amount\":\"1425603\"},\"JMD\":{\"code\":\"JMD\",\"title\":\"Jamaican Dollar\",\"symbol\":\"JMD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"15013\",\"max_amount\":\"150131044\"},\"JPY\":{\"code\":\"JPY\",\"title\":\"Japanese Yen\",\"symbol\":\"¥\",\"native\":\"¥\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"144\",\"max_amount\":\"1443065\"},\"KES\":{\"code\":\"KES\",\"title\":\"Kenyan Shilling\",\"symbol\":\"KES\",\"native\":\"Ksh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"12075\",\"max_amount\":\"120750271\"},\"KGS\":{\"code\":\"KGS\",\"title\":\"Kyrgyzstani Som\",\"symbol\":\"KGS\",\"native\":\"KGS\",\"thousands_sep\":\" \",\"decimal_sep\":\"-\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"8018\",\"max_amount\":\"80182898\"},\"KRW\":{\"code\":\"KRW\",\"title\":\"South Korean Won\",\"symbol\":\"₩\",\"native\":\"₩\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"1431\",\"max_amount\":\"14315201\"},\"KZT\":{\"code\":\"KZT\",\"title\":\"Kazakhstani Tenge\",\"symbol\":\"KZT\",\"native\":\"₸\",\"thousands_sep\":\" \",\"decimal_sep\":\"-\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"47186\",\"max_amount\":\"471867112\"},\"LBP\":{\"code\":\"LBP\",\"title\":\"Lebanese Pound\",\"symbol\":\"LBP\",\"native\":\"ل.ل.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"150999\",\"max_amount\":\"1509998778\"},\"LKR\":{\"code\":\"LKR\",\"title\":\"Sri Lankan Rupee\",\"symbol\":\"LKR\",\"native\":\"රු.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"35546\",\"max_amount\":\"355469651\"},\"MAD\":{\"code\":\"MAD\",\"title\":\"Moroccan Dirham\",\"symbol\":\"MAD\",\"native\":\"د.م.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1093\",\"max_amount\":\"10938136\"},\"MDL\":{\"code\":\"MDL\",\"title\":\"Moldovan Leu\",\"symbol\":\"MDL\",\"native\":\"MDL\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1926\",\"max_amount\":\"19264439\"},\"MNT\":{\"code\":\"MNT\",\"title\":\"Mongolian Tögrög\",\"symbol\":\"MNT\",\"native\":\"MNT\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"322444\",\"max_amount\":\"3224442056\"},\"MUR\":{\"code\":\"MUR\",\"title\":\"Mauritian Rupee\",\"symbol\":\"MUR\",\"native\":\"MUR\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"4453\",\"max_amount\":\"44535174\"},\"MVR\":{\"code\":\"MVR\",\"title\":\"Maldivian Rufiyaa\",\"symbol\":\"MVR\",\"native\":\"MVR\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1546\",\"max_amount\":\"15460397\"},\"MXN\":{\"code\":\"MXN\",\"title\":\"Mexican Peso\",\"symbol\":\"MX$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"2012\",\"max_amount\":\"20122860\"},\"MYR\":{\"code\":\"MYR\",\"title\":\"Malaysian Ringgit\",\"symbol\":\"MYR\",\"native\":\"RM\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"463\",\"max_amount\":\"4632502\"},\"MZN\":{\"code\":\"MZN\",\"title\":\"Mozambican Metical\",\"symbol\":\"MZN\",\"native\":\"MTn\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"6382\",\"max_amount\":\"63829729\"},\"NGN\":{\"code\":\"NGN\",\"title\":\"Nigerian Naira\",\"symbol\":\"NGN\",\"native\":\"₦\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"43203\",\"max_amount\":\"432039828\"},\"NIO\":{\"code\":\"NIO\",\"title\":\"Nicaraguan Córdoba\",\"symbol\":\"NIO\",\"native\":\"C$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"3556\",\"max_amount\":\"35566412\"},\"NOK\":{\"code\":\"NOK\",\"title\":\"Norwegian Krone\",\"symbol\":\"NOK\",\"native\":\"kr\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1069\",\"max_amount\":\"10690975\"},\"NPR\":{\"code\":\"NPR\",\"title\":\"Nepalese Rupee\",\"symbol\":\"NPR\",\"native\":\"नेरू\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"12954\",\"max_amount\":\"129546657\"},\"NZD\":{\"code\":\"NZD\",\"title\":\"New Zealand Dollar\",\"symbol\":\"NZ$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"174\",\"max_amount\":\"1746220\"},\"PAB\":{\"code\":\"PAB\",\"title\":\"Panamanian Balboa\",\"symbol\":\"PAB\",\"native\":\"B\\/.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"98\",\"max_amount\":\"988722\"},\"PEN\":{\"code\":\"PEN\",\"title\":\"Peruvian Nuevo Sol\",\"symbol\":\"PEN\",\"native\":\"S\\/.\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"390\",\"max_amount\":\"3902208\"},\"PHP\":{\"code\":\"PHP\",\"title\":\"Philippine Peso\",\"symbol\":\"PHP\",\"native\":\"₱\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"5862\",\"max_amount\":\"58627496\"},\"PKR\":{\"code\":\"PKR\",\"title\":\"Pakistani Rupee\",\"symbol\":\"PKR\",\"native\":\"₨\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"22642\",\"max_amount\":\"226426805\"},\"PLN\":{\"code\":\"PLN\",\"title\":\"Polish Złoty\",\"symbol\":\"PLN\",\"native\":\"zł\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"493\",\"max_amount\":\"4932350\"},\"PYG\":{\"code\":\"PYG\",\"title\":\"Paraguayan Guaraní\",\"symbol\":\"PYG\",\"native\":\"₲\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":0,\"min_amount\":\"6977\",\"max_amount\":\"69772317\"},\"QAR\":{\"code\":\"QAR\",\"title\":\"Qatari Riyal\",\"symbol\":\"QAR\",\"native\":\"ر.ق.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"364\",\"max_amount\":\"3640989\"},\"RON\":{\"code\":\"RON\",\"title\":\"Romanian Leu\",\"symbol\":\"RON\",\"native\":\"RON\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"502\",\"max_amount\":\"5028645\"},\"RSD\":{\"code\":\"RSD\",\"title\":\"Serbian Dinar\",\"symbol\":\"RSD\",\"native\":\"дин.\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"11918\",\"max_amount\":\"119184990\"},\"RUB\":{\"code\":\"RUB\",\"title\":\"Russian Ruble\",\"symbol\":\"RUB\",\"native\":\"₽\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"7128\",\"max_amount\":\"71281218\"},\"SAR\":{\"code\":\"SAR\",\"title\":\"Saudi Riyal\",\"symbol\":\"SAR\",\"native\":\"ر.س.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"375\",\"max_amount\":\"3756546\"},\"SEK\":{\"code\":\"SEK\",\"title\":\"Swedish Krona\",\"symbol\":\"SEK\",\"native\":\"kr\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1109\",\"max_amount\":\"11094972\"},\"SGD\":{\"code\":\"SGD\",\"title\":\"Singapore Dollar\",\"symbol\":\"SGD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"143\",\"max_amount\":\"1430495\"},\"THB\":{\"code\":\"THB\",\"title\":\"Thai Baht\",\"symbol\":\"฿\",\"native\":\"฿\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"3780\",\"max_amount\":\"37800497\"},\"TJS\":{\"code\":\"TJS\",\"title\":\"Tajikistani Somoni\",\"symbol\":\"TJS\",\"native\":\"TJS\",\"thousands_sep\":\" \",\"decimal_sep\":\";\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"975\",\"max_amount\":\"9753854\"},\"TRY\":{\"code\":\"TRY\",\"title\":\"Turkish Lira\",\"symbol\":\"TRY\",\"native\":\"TL\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1854\",\"max_amount\":\"18543598\"},\"TTD\":{\"code\":\"TTD\",\"title\":\"Trinidad and Tobago Dollar\",\"symbol\":\"TTD\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"672\",\"max_amount\":\"6722681\"},\"TWD\":{\"code\":\"TWD\",\"title\":\"New Taiwan Dollar\",\"symbol\":\"NT$\",\"native\":\"NT$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"3173\",\"max_amount\":\"31738502\"},\"TZS\":{\"code\":\"TZS\",\"title\":\"Tanzanian Shilling\",\"symbol\":\"TZS\",\"native\":\"TSh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"233199\",\"max_amount\":\"2331999890\"},\"UAH\":{\"code\":\"UAH\",\"title\":\"Ukrainian Hryvnia\",\"symbol\":\"UAH\",\"native\":\"₴\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":false,\"exp\":2,\"min_amount\":\"3633\",\"max_amount\":\"36338830\"},\"UGX\":{\"code\":\"UGX\",\"title\":\"Ugandan Shilling\",\"symbol\":\"UGX\",\"native\":\"USh\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":0,\"min_amount\":\"3816\",\"max_amount\":\"38166726\"},\"USD\":{\"code\":\"USD\",\"title\":\"United States Dollar\",\"symbol\":\"$\",\"native\":\"$\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":false,\"exp\":2,\"min_amount\":\"100\",\"max_amount\":1000000},\"UYU\":{\"code\":\"UYU\",\"title\":\"Uruguayan Peso\",\"symbol\":\"UYU\",\"native\":\"$\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"4080\",\"max_amount\":\"40801205\"},\"UZS\":{\"code\":\"UZS\",\"title\":\"Uzbekistani Som\",\"symbol\":\"UZS\",\"native\":\"UZS\",\"thousands_sep\":\" \",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":2,\"min_amount\":\"1089058\",\"max_amount\":\"10890583014\"},\"VND\":{\"code\":\"VND\",\"title\":\"Vietnamese Đồng\",\"symbol\":\"₫\",\"native\":\"₫\",\"thousands_sep\":\".\",\"decimal_sep\":\",\",\"symbol_left\":false,\"space_between\":true,\"exp\":0,\"min_amount\":\"23862\",\"max_amount\":\"238625000\"},\"YER\":{\"code\":\"YER\",\"title\":\"Yemeni Rial\",\"symbol\":\"YER\",\"native\":\"ر.ي.‏\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"25030\",\"max_amount\":\"250300677\"},\"ZAR\":{\"code\":\"ZAR\",\"title\":\"South African Rand\",\"symbol\":\"ZAR\",\"native\":\"R\",\"thousands_sep\":\",\",\"decimal_sep\":\".\",\"symbol_left\":true,\"space_between\":true,\"exp\":2,\"min_amount\":\"1789\",\"max_amount\":\"17894299\"}};\n\nexport default Currencies;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {EMOJI_VERSION} from '../environment/emojiVersionsSupport';\n\nexport const EmojiVersions: {[version in EMOJI_VERSION]: {[emoji: string]: number}} = {'14':{'1f6dd':4867, '1f6de':4916, '1f6df':4923, '1f7f0':62832, '1f979':183, '1f9cc':1557, '1fa7b':61332, '1fa7c':61330, '1faa9':51093, '1faaa':61364, '1faab':61189, '1faac':51085, '1fab7':2651, '1fab8':2631, '1fab9':2672, '1faba':2673, '1fac3':1520, '1fac4':1521, '1fac5':1505, '1fad7':3793, '1fad8':3707, '1fad9':3804, '1fae0':111, '1fae1':136, '1fae2':132, '1fae3':133, '1fae4':174, '1fae5':142, '1fae6':1385, '1fae7':61353, '1faf0':1341, '1faf1':1332, '1faf2':1333, '1faf3':1334, '1faf4':1335, '1faf5':1351, '1faf6':1360, '1faf1-1f3fb-200d-1faf2-1f3fc':0, '1faf1-1f3fb-200d-1faf2-1f3fd':0, '1faf1-1f3fb-200d-1faf2-1f3fe':0, '1faf1-1f3fb-200d-1faf2-1f3ff':0, '1faf1-1f3fc-200d-1faf2-1f3fb':0, '1faf1-1f3fc-200d-1faf2-1f3fd':0, '1faf1-1f3fc-200d-1faf2-1f3fe':0, '1faf1-1f3fc-200d-1faf2-1f3ff':0, '1faf1-1f3fd-200d-1faf2-1f3fb':0, '1faf1-1f3fd-200d-1faf2-1f3fc':0, '1faf1-1f3fd-200d-1faf2-1f3fe':0, '1faf1-1f3fd-200d-1faf2-1f3ff':0, '1faf1-1f3fe-200d-1faf2-1f3fb':0, '1faf1-1f3fe-200d-1faf2-1f3fc':0, '1faf1-1f3fe-200d-1faf2-1f3fd':0, '1faf1-1f3fe-200d-1faf2-1f3ff':0, '1faf1-1f3ff-200d-1faf2-1f3fb':0, '1faf1-1f3ff-200d-1faf2-1f3fc':0, '1faf1-1f3ff-200d-1faf2-1f3fd':0, '1faf1-1f3ff-200d-1faf2-1f3fe':0, '1fac3-1f3fb':0, '1fac3-1f3fc':0, '1fac3-1f3fd':0, '1fac3-1f3fe':0, '1fac3-1f3ff':0, '1fac4-1f3fb':0, '1fac4-1f3fc':0, '1fac4-1f3fd':0, '1fac4-1f3fe':0, '1fac4-1f3ff':0, '1fac5-1f3fb':0, '1fac5-1f3fc':0, '1fac5-1f3fd':0, '1fac5-1f3fe':0, '1fac5-1f3ff':0, '1faf0-1f3fb':0, '1faf0-1f3fc':0, '1faf0-1f3fd':0, '1faf0-1f3fe':0, '1faf0-1f3ff':0, '1faf1-1f3fb':0, '1faf1-1f3fc':0, '1faf1-1f3fd':0, '1faf1-1f3fe':0, '1faf1-1f3ff':0, '1faf2-1f3fb':0, '1faf2-1f3fc':0, '1faf2-1f3fd':0, '1faf2-1f3fe':0, '1faf2-1f3ff':0, '1faf3-1f3fb':0, '1faf3-1f3fc':0, '1faf3-1f3fd':0, '1faf3-1f3fe':0, '1faf3-1f3ff':0, '1faf4-1f3fb':0, '1faf4-1f3fc':0, '1faf4-1f3fd':0, '1faf4-1f3fe':0, '1faf4-1f3ff':0, '1faf5-1f3fb':0, '1faf5-1f3fc':0, '1faf5-1f3fd':0, '1faf5-1f3fe':0, '1faf5-1f3ff':0, '1faf6-1f3fb':0, '1faf6-1f3fc':0, '1faf6-1f3fd':0, '1faf6-1f3fe':0, '1faf6-1f3ff':0}, '':{'2049':62835, '2122':62863, '2139':62888, '2194':62764, '2195':62763, '2196':62762, '2197':62756, '2198':62758, '2199':62760, '2328':61194, '2600':4990, '2601':4998, '2602':41013, '2603':41018, '2604':41020, '2611':62851, '2614':41014, '2615':3781, '2618':2667, '2620':1106, '2622':62753, '2623':62754, '2626':62783, '2638':62780, '2639':177, '2648':62788, '2649':62789, '2650':62796, '2651':62797, '2652':62798, '2653':62799, '2660':51095, '2663':51098, '2665':51096, '2666':51097, '2668':4865, '2692':61297, '2693':4922, '2694':61300, '2696':61311, '2697':61319, '2699':61309, '2702':61284, '2705':62850, '2708':4931, '2709':61245, '2712':61259, '2714':62852, '2716':62828, '2721':62779, '2728':51029, '2733':62858, '2734':62859, '2744':41017, '2747':62860, '2753':62836, '2754':62837, '2755':62838, '2757':62839, '2763':1137, '2764':1141, '2795':62829, '2796':62830, '2797':62831, '2934':62767, '2935':62768, '3030':62840, '3297':62912, '3299':62913, '0023-20e3':62864, '002a-20e3':62865, '0030-20e3':62866, '0031-20e3':62867, '0032-20e3':62868, '0033-20e3':62869, '0034-20e3':62870, '0035-20e3':62871, '0036-20e3':62872, '0037-20e3':62873, '0038-20e3':62874, '0039-20e3':62875, '00a9':62861, '00ae':62862, '1f004':51101, '1f0cf':51100, '1f170':62882, '1f171':62884, '1f17e':62893, '1f17f':62895, '1f18e':62883, '1f191':62885, '1f192':62886, '1f193':62887, '1f194':62889, '1f195':62891, '1f196':62892, '1f197':62894, '1f198':62896, '1f199':62897, '1f19a':62898, '1f1e6-1f1e8':71594, '1f1e6-1f1e9':71595, '1f1e6-1f1ea':71596, '1f1e6-1f1eb':71597, '1f1e6-1f1ec':71598, '1f1e6-1f1ee':71599, '1f1e6-1f1f1':71600, '1f1e6-1f1f2':71601, '1f1e6-1f1f4':71602, '1f1e6-1f1f6':71603, '1f1e6-1f1f7':71604, '1f1e6-1f1f8':71605, '1f1e6-1f1f9':71606, '1f1e6-1f1fa':71607, '1f1e6-1f1fc':71608, '1f1e6-1f1fd':71609, '1f1e6-1f1ff':71610, '1f1e7-1f1e6':71611, '1f1e7-1f1e7':71612, '1f1e7-1f1e9':71613, '1f1e7-1f1ea':71614, '1f1e7-1f1eb':71615, '1f1e7-1f1ec':71616, '1f1e7-1f1ed':71617, '1f1e7-1f1ee':71618, '1f1e7-1f1ef':71619, '1f1e7-1f1f1':71620, '1f1e7-1f1f2':71621, '1f1e7-1f1f3':71622, '1f1e7-1f1f4':71623, '1f1e7-1f1f6':71624, '1f1e7-1f1f7':71625, '1f1e7-1f1f8':71626, '1f1e7-1f1f9':71627, '1f1e7-1f1fb':71628, '1f1e7-1f1fc':71629, '1f1e7-1f1fe':71630, '1f1e7-1f1ff':71631, '1f1e8-1f1e6':71632, '1f1e8-1f1e8':71633, '1f1e8-1f1e9':71634, '1f1e8-1f1eb':71635, '1f1e8-1f1ec':71636, '1f1e8-1f1ed':71637, '1f1e8-1f1ee':71638, '1f1e8-1f1f0':71639, '1f1e8-1f1f1':71640, '1f1e8-1f1f2':71641, '1f1e8-1f1f3':71642, '1f1e8-1f1f4':71643, '1f1e8-1f1f5':71644, '1f1e8-1f1f7':71645, '1f1e8-1f1fa':71646, '1f1e8-1f1fb':71647, '1f1e8-1f1fc':71648, '1f1e8-1f1fd':71649, '1f1e8-1f1fe':71650, '1f1e8-1f1ff':71651, '1f1e9-1f1ea':71652, '1f1e9-1f1ec':71653, '1f1e9-1f1ef':71654, '1f1e9-1f1f0':71655, '1f1e9-1f1f2':71656, '1f1e9-1f1f4':71657, '1f1e9-1f1ff':71658, '1f1ea-1f1e6':71659, '1f1ea-1f1e8':71660, '1f1ea-1f1ea':71661, '1f1ea-1f1ec':71662, '1f1ea-1f1ed':71663, '1f1ea-1f1f7':71664, '1f1ea-1f1f8':71665, '1f1ea-1f1f9':71666, '1f1ea-1f1fa':71667, '1f1eb-1f1ee':71668, '1f1eb-1f1ef':71669, '1f1eb-1f1f0':71670, '1f1eb-1f1f2':71671, '1f1eb-1f1f4':71672, '1f1eb-1f1f7':71673, '1f1ec-1f1e6':71674, '1f1ec-1f1e7':71675, '1f1ec-1f1e9':71676, '1f1ec-1f1ea':71677, '1f1ec-1f1eb':71678, '1f1ec-1f1ec':71679, '1f1ec-1f1ed':71680, '1f1ec-1f1ee':71681, '1f1ec-1f1f1':71682, '1f1ec-1f1f2':71683, '1f1ec-1f1f3':71684, '1f1ec-1f1f5':71685, '1f1ec-1f1f6':71686, '1f1ec-1f1f7':71687, '1f1ec-1f1f8':71688, '1f1ec-1f1f9':71689, '1f1ec-1f1fa':71690, '1f1ec-1f1fc':71691, '1f1ec-1f1fe':71692, '1f1ed-1f1f0':71693, '1f1ed-1f1f2':71694, '1f1ed-1f1f3':71695, '1f1ed-1f1f7':71696, '1f1ed-1f1f9':71697, '1f1ed-1f1fa':71698, '1f1ee-1f1e8':71699, '1f1ee-1f1e9':71700, '1f1ee-1f1ea':71701, '1f1ee-1f1f1':71702, '1f1ee-1f1f2':71703, '1f1ee-1f1f3':71704, '1f1ee-1f1f4':71705, '1f1ee-1f1f6':71706, '1f1ee-1f1f7':71707, '1f1ee-1f1f8':71708, '1f1ee-1f1f9':71709, '1f1ef-1f1ea':71710, '1f1ef-1f1f2':71711, '1f1ef-1f1f4':71712, '1f1ef-1f1f5':71713, '1f1f0-1f1ea':71714, '1f1f0-1f1ec':71715, '1f1f0-1f1ed':71716, '1f1f0-1f1ee':71717, '1f1f0-1f1f2':71718, '1f1f0-1f1f3':71719, '1f1f0-1f1f5':71720, '1f1f0-1f1f7':71721, '1f1f0-1f1fc':71722, '1f1f0-1f1fe':71723, '1f1f0-1f1ff':71724, '1f1f1-1f1e6':71725, '1f1f1-1f1e7':71726, '1f1f1-1f1e8':71727, '1f1f1-1f1ee':71728, '1f1f1-1f1f0':71729, '1f1f1-1f1f7':71730, '1f1f1-1f1f8':71731, '1f1f1-1f1f9':71732, '1f1f1-1f1fa':71733, '1f1f1-1f1fb':71734, '1f1f1-1f1fe':71735, '1f1f2-1f1e6':71736, '1f1f2-1f1e8':71737, '1f1f2-1f1e9':71738, '1f1f2-1f1ea':71739, '1f1f2-1f1eb':71740, '1f1f2-1f1ec':71741, '1f1f2-1f1ed':71742, '1f1f2-1f1f0':71743, '1f1f2-1f1f1':71744, '1f1f2-1f1f2':71745, '1f1f2-1f1f3':71746, '1f1f2-1f1f4':71747, '1f1f2-1f1f5':71748, '1f1f2-1f1f6':71749, '1f1f2-1f1f7':71750, '1f1f2-1f1f8':71751, '1f1f2-1f1f9':71752, '1f1f2-1f1fa':71753, '1f1f2-1f1fb':71754, '1f1f2-1f1fc':71755, '1f1f2-1f1fd':71756, '1f1f2-1f1fe':71757, '1f1f2-1f1ff':71758, '1f1f3-1f1e6':71759, '1f1f3-1f1e8':71760, '1f1f3-1f1ea':71761, '1f1f3-1f1eb':71762, '1f1f3-1f1ec':71763, '1f1f3-1f1ee':71764, '1f1f3-1f1f1':71765, '1f1f3-1f1f4':71766, '1f1f3-1f1f5':71767, '1f1f3-1f1f7':71768, '1f1f3-1f1fa':71769, '1f1f3-1f1ff':71770, '1f1f4-1f1f2':71771, '1f1f5-1f1e6':71772, '1f1f5-1f1ea':71773, '1f1f5-1f1eb':71774, '1f1f5-1f1ec':71775, '1f1f5-1f1ed':71776, '1f1f5-1f1f0':71777, '1f1f5-1f1f1':71778, '1f1f5-1f1f2':71779, '1f1f5-1f1f3':71780, '1f1f5-1f1f7':71781, '1f1f5-1f1f8':71782, '1f1f5-1f1f9':71783, '1f1f5-1f1fc':71784, '1f1f5-1f1fe':71785, '1f1f6-1f1e6':71786, '1f1f7-1f1ea':71787, '1f1f7-1f1f4':71788, '1f1f7-1f1f8':71789, '1f1f7-1f1fa':71790, '1f1f7-1f1fc':71791, '1f1f8-1f1e6':71792, '1f1f8-1f1e7':71793, '1f1f8-1f1e8':71794, '1f1f8-1f1e9':71795, '1f1f8-1f1ea':71796, '1f1f8-1f1ec':71797, '1f1f8-1f1ed':71798, '1f1f8-1f1ee':71799, '1f1f8-1f1ef':71800, '1f1f8-1f1f0':71801, '1f1f8-1f1f1':71802, '1f1f8-1f1f2':71803, '1f1f8-1f1f3':71804, '1f1f8-1f1f4':71805, '1f1f8-1f1f7':71806, '1f1f8-1f1f8':71807, '1f1f8-1f1f9':71808, '1f1f8-1f1fb':71809, '1f1f8-1f1fd':71810, '1f1f8-1f1fe':71811, '1f1f8-1f1ff':71812, '1f1f9-1f1e6':71813, '1f1f9-1f1e8':71814, '1f1f9-1f1e9':71815, '1f1f9-1f1eb':71816, '1f1f9-1f1ec':71817, '1f1f9-1f1ed':71818, '1f1f9-1f1ef':71819, '1f1f9-1f1f0':71820, '1f1f9-1f1f1':71821, '1f1f9-1f1f2':71822, '1f1f9-1f1f3':71823, '1f1f9-1f1f4':71824, '1f1f9-1f1f7':71825, '1f1f9-1f1f9':71826, '1f1f9-1f1fb':71827, '1f1f9-1f1fc':71828, '1f1f9-1f1ff':71829, '1f1fa-1f1e6':71830, '1f1fa-1f1ec':71831, '1f1fa-1f1f2':71832, '1f1fa-1f1f3':71833, '1f1fa-1f1f8':71834, '1f1fa-1f1fe':71835, '1f1fa-1f1ff':71836, '1f1fb-1f1e6':71837, '1f1fb-1f1e8':71838, '1f1fb-1f1ea':71839, '1f1fb-1f1ec':71840, '1f1fb-1f1ee':71841, '1f1fb-1f1f3':71842, '1f1fb-1f1fa':71843, '1f1fc-1f1eb':71844, '1f1fc-1f1f8':71845, '1f1fd-1f1f0':71846, '1f1fe-1f1ea':71847, '1f1fe-1f1f9':71848, '1f1ff-1f1e6':71849, '1f1ff-1f1f2':71850, '1f1ff-1f1fc':71851, '1f201':62899, '1f202':62900, '1f21a':62906, '1f22f':62903, '1f232':62907, '1f233':62911, '1f234':62910, '1f235':62915, '1f236':62902, '1f237':62901, '1f238':62909, '1f239':62905, '1f23a':62914, '1f250':62904, '1f251':62908, '1f300':41010, '1f301':4857, '1f302':41012, '1f303':4858, '1f304':4860, '1f305':4861, '1f306':4862, '1f307':4863, '1f308':41011, '1f309':4864, '1f30a':41023, '1f30b':4815, '1f30c':4997, '1f30d':4806, '1f30e':4807, '1f30f':4808, '1f310':4809, '1f311':4977, '1f312':4978, '1f313':4979, '1f314':4980, '1f315':4981, '1f316':4982, '1f317':4983, '1f318':4984, '1f319':4985, '1f31a':4986, '1f31b':4987, '1f31c':4988, '1f31d':4991, '1f31e':4992, '1f31f':4995, '1f320':4996, '1f321':4989, '1f324':41001, '1f325':41002, '1f326':41003, '1f327':41004, '1f328':41005, '1f329':41006, '1f32a':41007, '1f32b':41008, '1f32c':41009, '1f32d':3725, '1f32e':3727, '1f32f':3728, '1f330':3708, '1f331':2659, '1f332':2661, '1f333':2662, '1f334':2663, '1f335':2664, '1f336':3698, '1f337':2658, '1f338':2649, '1f339':2653, '1f33a':2655, '1f33b':2656, '1f33c':2657, '1f33d':3697, '1f33e':2665, '1f33f':2666, '1f340':2668, '1f341':2669, '1f342':2670, '1f343':2671, '1f344':3705, '1f345':3690, '1f346':3694, '1f347':3674, '1f348':3675, '1f349':3676, '1f34a':3677, '1f34b':3678, '1f34c':3679, '1f34d':3680, '1f34e':3682, '1f34f':3683, '1f350':3684, '1f351':3685, '1f352':3686, '1f353':3687, '1f354':3722, '1f355':3724, '1f356':3718, '1f357':3719, '1f358':3744, '1f359':3745, '1f35a':3746, '1f35b':3747, '1f35c':3748, '1f35d':3749, '1f35e':3709, '1f35f':3723, '1f360':3750, '1f361':3756, '1f362':3751, '1f363':3752, '1f364':3753, '1f365':3754, '1f366':3765, '1f367':3766, '1f368':3767, '1f369':3768, '1f36a':3769, '1f36b':3774, '1f36c':3775, '1f36d':3776, '1f36e':3777, '1f36f':3778, '1f370':3771, '1f371':3743, '1f372':3735, '1f373':3733, '1f374':3801, '1f375':3783, '1f376':3784, '1f377':3786, '1f378':3787, '1f379':3788, '1f37a':3789, '1f37b':3790, '1f37c':3779, '1f37d':3800, '1f37e':3785, '1f37f':3739, '1f380':51040, '1f381':51041, '1f382':3770, '1f383':51024, '1f384':51025, '1f385':1527, '1f386':51026, '1f387':51027, '1f388':51030, '1f389':51031, '1f38a':51032, '1f38b':51033, '1f38c':71588, '1f38d':51034, '1f38e':51035, '1f38f':51036, '1f390':51037, '1f391':51038, '1f392':61134, '1f393':61147, '1f396':51045, '1f397':51042, '1f399':61167, '1f39a':61168, '1f39b':61169, '1f39e':61203, '1f39f':51043, '1f3a0':4866, '1f3a1':4868, '1f3a2':4869, '1f3a3':51072, '1f3a4':61170, '1f3a5':61202, '1f3a6':62819, '1f3a7':61171, '1f3a8':51105, '1f3a9':61146, '1f3aa':4871, '1f3ab':51044, '1f3ac':61205, '1f3ad':51103, '1f3ae':51086, '1f3af':51078, '1f3b0':51088, '1f3b1':51081, '1f3b2':51089, '1f3b3':51060, '1f3b4':51102, '1f3b5':61165, '1f3b6':61166, '1f3b7':61173, '1f3b8':61175, '1f3b9':61176, '1f3ba':61177, '1f3bb':61178, '1f3bc':61164, '1f3bd':51074, '1f3be':51058, '1f3bf':51075, '1f3c0':51054, '1f3c1':71586, '1f3c2':1600, '1f3c3-200d-2640':1584, '1f3c3-200d-2642':1583, '1f3c3':1582, '1f3c4-200d-2640':1606, '1f3c4-200d-2642':1605, '1f3c4':1604, '1f3c5':51047, '1f3c6':51046, '1f3c7':1598, '1f3c8':51056, '1f3c9':51057, '1f3ca-200d-2640':1612, '1f3ca-200d-2642':1611, '1f3ca':1610, '1f3cb-200d-2640':1618, '1f3cb-200d-2642':1617, '1f3cb':1616, '1f3cc-200d-2640':1603, '1f3cc-200d-2642':1602, '1f3cc':1601, '1f3cd':4902, '1f3ce':4901, '1f3cf':51061, '1f3d0':51055, '1f3d1':51062, '1f3d2':51063, '1f3d3':51065, '1f3d4':4813, '1f3d5':4817, '1f3d6':4818, '1f3d7':4824, '1f3d8':4829, '1f3d9':4859, '1f3da':4830, '1f3db':4823, '1f3dc':4819, '1f3dd':4820, '1f3de':4821, '1f3df':4822, '1f3e0':4831, '1f3e1':4832, '1f3e2':4833, '1f3e3':4834, '1f3e4':4835, '1f3e5':4836, '1f3e6':4837, '1f3e7':62729, '1f3e8':4838, '1f3e9':4839, '1f3ea':4840, '1f3eb':4841, '1f3ec':4842, '1f3ed':4843, '1f3ee':61216, '1f3ef':4844, '1f3f0':4845, '1f3f3-200d-1f308':71591, '1f3f3-200d-26a7':71592, '1f3f3':71590, '1f3f4-200d-2620':71593, '1f3f4-e0067-e0062-e0065-e006e-e0067-e007f':71852, '1f3f4-e0067-e0062-e0073-e0063-e0074-e007f':71853, '1f3f4-e0067-e0062-e0077-e006c-e0073-e007f':71854, '1f3f4':71589, '1f3f5':2652, '1f3f7':61234, '1f3f8':51066, '1f3f9':61303, '1f3fa':3805, '1f3fb':9525, '1f3fc':9526, '1f3fd':9527, '1f3fe':9528, '1f3ff':9529, '1f400':2576, '1f401':2575, '1f402':2556, '1f403':2557, '1f404':2558, '1f405':2547, '1f406':2548, '1f407':2579, '1f408-200d-2b1b':2544, '1f408':2543, '1f409':2618, '1f40a':2613, '1f40b':2622, '1f40c':2632, '1f40d':2616, '1f40e':2550, '1f40f':2563, '1f410':2565, '1f411':2564, '1f412':2531, '1f413':2596, '1f414':2595, '1f415-200d-1f9ba':2537, '1f415':2535, '1f416':2560, '1f417':2561, '1f418':2570, '1f419':2629, '1f41a':2630, '1f41b':2634, '1f41c':2635, '1f41d':2636, '1f41e':2638, '1f41f':2625, '1f420':2626, '1f421':2627, '1f422':2614, '1f423':2597, '1f424':2598, '1f425':2599, '1f426':2600, '1f427':2601, '1f428':2586, '1f429':2538, '1f42a':2566, '1f42b':2567, '1f42c':2623, '1f42d':2574, '1f42e':2555, '1f42f':2546, '1f430':2578, '1f431':2542, '1f432':2617, '1f433':2621, '1f434':2549, '1f435':2530, '1f436':2534, '1f437':2559, '1f438':2612, '1f439':2577, '1f43a':2539, '1f43b-200d-2744':2585, '1f43b':2584, '1f43c':2587, '1f43d':2562, '1f43e':2593, '1f43f':2580, '1f440':1381, '1f441-200d-1f5e8':1159, '1f441':1382, '1f442':1373, '1f443':1375, '1f444':1384, '1f445':1383, '1f446':1347, '1f447':1349, '1f448':1345, '1f449':1346, '1f44a':1355, '1f44b':1327, '1f44c':1336, '1f44d':1352, '1f44e':1353, '1f44f':1358, '1f450':1361, '1f451':61144, '1f452':61145, '1f453':61110, '1f454':61115, '1f455':61116, '1f456':61117, '1f457':61122, '1f458':61123, '1f459':61128, '1f45a':61129, '1f45b':61130, '1f45c':61131, '1f45d':61132, '1f45e':61136, '1f45f':61137, '1f460':61140, '1f461':61141, '1f462':61143, '1f463':1687, '1f464':1684, '1f465':1685, '1f466':1388, '1f467':1389, '1f468-200d-1f33e':1457, '1f468-200d-1f373':1460, '1f468-200d-1f37c':1524, '1f468-200d-1f393':1448, '1f468-200d-1f3a4':1478, '1f468-200d-1f3a8':1481, '1f468-200d-1f3eb':1451, '1f468-200d-1f3ed':1466, '1f468-200d-1f466-200d-1f466':1674, '1f468-200d-1f466':1673, '1f468-200d-1f467-200d-1f466':1676, '1f468-200d-1f467-200d-1f467':1677, '1f468-200d-1f467':1675, '1f468-200d-1f468-200d-1f466':1663, '1f468-200d-1f468-200d-1f466-200d-1f466':1666, '1f468-200d-1f468-200d-1f467':1664, '1f468-200d-1f468-200d-1f467-200d-1f466':1665, '1f468-200d-1f468-200d-1f467-200d-1f467':1667, '1f468-200d-1f469-200d-1f466':1658, '1f468-200d-1f469-200d-1f466-200d-1f466':1661, '1f468-200d-1f469-200d-1f467':1659, '1f468-200d-1f469-200d-1f467-200d-1f466':1660, '1f468-200d-1f469-200d-1f467-200d-1f467':1662, '1f468-200d-1f4bb':1475, '1f468-200d-1f4bc':1469, '1f468-200d-1f527':1463, '1f468-200d-1f52c':1472, '1f468-200d-1f680':1487, '1f468-200d-1f692':1490, '1f468-200d-1f9af':1574, '1f468-200d-1f9b0':1396, '1f468-200d-1f9b1':1397, '1f468-200d-1f9b2':1399, '1f468-200d-1f9b3':1398, '1f468-200d-1f9bc':1577, '1f468-200d-1f9bd':1580, '1f468-200d-2695':1445, '1f468-200d-2696':1454, '1f468-200d-2708':1484, '1f468-200d-2764-200d-1f468':1655, '1f468-200d-2764-200d-1f48b-200d-1f468':1651, '1f468':1392, '1f469-200d-1f33e':1458, '1f469-200d-1f373':1461, '1f469-200d-1f37c':1523, '1f469-200d-1f393':1449, '1f469-200d-1f3a4':1479, '1f469-200d-1f3a8':1482, '1f469-200d-1f3eb':1452, '1f469-200d-1f3ed':1467, '1f469-200d-1f466-200d-1f466':1679, '1f469-200d-1f466':1678, '1f469-200d-1f467-200d-1f466':1681, '1f469-200d-1f467-200d-1f467':1682, '1f469-200d-1f467':1680, '1f469-200d-1f469-200d-1f466':1668, '1f469-200d-1f469-200d-1f466-200d-1f466':1671, '1f469-200d-1f469-200d-1f467':1669, '1f469-200d-1f469-200d-1f467-200d-1f466':1670, '1f469-200d-1f469-200d-1f467-200d-1f467':1672, '1f469-200d-1f4bb':1476, '1f469-200d-1f4bc':1470, '1f469-200d-1f527':1464, '1f469-200d-1f52c':1473, '1f469-200d-1f680':1488, '1f469-200d-1f692':1491, '1f469-200d-1f9af':1575, '1f469-200d-1f9b0':1401, '1f469-200d-1f9b1':1403, '1f469-200d-1f9b2':1407, '1f469-200d-1f9b3':1405, '1f469-200d-1f9bc':1578, '1f469-200d-1f9bd':1581, '1f469-200d-2695':1446, '1f469-200d-2696':1455, '1f469-200d-2708':1485, '1f469-200d-2764-200d-1f468':1654, '1f469-200d-2764-200d-1f469':1656, '1f469-200d-2764-200d-1f48b-200d-1f468':1650, '1f469-200d-2764-200d-1f48b-200d-1f469':1652, '1f469':1400, '1f46a':1657, '1f46b':1647, '1f46c':1648, '1f46d':1646, '1f46e-200d-2640':1494, '1f46e-200d-2642':1493, '1f46e':1492, '1f46f-200d-2640':1590, '1f46f-200d-2642':1589, '1f46f':1588, '1f470-200d-2640':1518, '1f470-200d-2642':1517, '1f470':1516, '1f471-200d-2640':1409, '1f471-200d-2642':1410, '1f471':1391, '1f472':1511, '1f473-200d-2640':1510, '1f473-200d-2642':1509, '1f473':1508, '1f474':1412, '1f475':1413, '1f476':1386, '1f477-200d-2640':1504, '1f477-200d-2642':1503, '1f477':1502, '1f478':1507, '1f479':1109, '1f47a':1110, '1f47b':1111, '1f47c':1526, '1f47d':1112, '1f47e':1113, '1f47f':1104, '1f480':1105, '1f481-200d-2640':1428, '1f481-200d-2642':1427, '1f481':1426, '1f482-200d-2640':1500, '1f482-200d-2642':1499, '1f482':1498, '1f483':1585, '1f484':61152, '1f485':1366, '1f486-200d-2640':1560, '1f486-200d-2642':1559, '1f486':1558, '1f487-200d-2640':1563, '1f487-200d-2642':1562, '1f487':1561, '1f488':4870, '1f489':61326, '1f48a':61328, '1f48b':1127, '1f48c':1128, '1f48d':61153, '1f48e':61154, '1f48f':1649, '1f490':2648, '1f491':1653, '1f492':4846, '1f493':1133, '1f494':1138, '1f495':1135, '1f496':1131, '1f497':1132, '1f498':1129, '1f499':1145, '1f49a':1144, '1f49b':1143, '1f49c':1146, '1f49d':1130, '1f49e':1134, '1f49f':1136, '1f4a0':62946, '1f4a1':61214, '1f4a2':1151, '1f4a3':1157, '1f4a4':1163, '1f4a5':1152, '1f4a6':1154, '1f4a7':41022, '1f4a8':1155, '1f4a9':1107, '1f4aa':1368, '1f4ab':1153, '1f4ac':1158, '1f4ad':1162, '1f4ae':2650, '1f4af':1150, '1f4b0':61235, '1f4b1':62841, '1f4b2':62842, '1f4b3':61242, '1f4b4':61237, '1f4b5':61238, '1f4b6':61239, '1f4b7':61240, '1f4b8':61241, '1f4b9':61244, '1f4ba':4936, '1f4bb':61191, '1f4bc':61265, '1f4bd':61197, '1f4be':61198, '1f4bf':61199, '1f4c0':61200, '1f4c1':61266, '1f4c2':61267, '1f4c3':61227, '1f4c4':61229, '1f4c5':61269, '1f4c6':61270, '1f4c7':61273, '1f4c8':61274, '1f4c9':61275, '1f4ca':61276, '1f4cb':61277, '1f4cc':61278, '1f4cd':61279, '1f4ce':61280, '1f4cf':61282, '1f4d0':61283, '1f4d1':61232, '1f4d2':61226, '1f4d3':61225, '1f4d4':61218, '1f4d5':61219, '1f4d6':61220, '1f4d7':61221, '1f4d8':61222, '1f4d9':61223, '1f4da':61224, '1f4db':62847, '1f4dc':61228, '1f4dd':61264, '1f4de':61185, '1f4df':61186, '1f4e0':61187, '1f4e1':61325, '1f4e2':61159, '1f4e3':61160, '1f4e4':61249, '1f4e5':61250, '1f4e6':61251, '1f4e7':61246, '1f4e8':61247, '1f4e9':61248, '1f4ea':61253, '1f4eb':61252, '1f4ec':61254, '1f4ed':61255, '1f4ee':61256, '1f4ef':61161, '1f4f0':61230, '1f4f1':61182, '1f4f2':61183, '1f4f3':62823, '1f4f4':62824, '1f4f5':62751, '1f4f6':62822, '1f4f7':61207, '1f4f8':61208, '1f4f9':61209, '1f4fa':61206, '1f4fb':61172, '1f4fc':61210, '1f4fd':61204, '1f4ff':61151, '1f500':62801, '1f501':62802, '1f502':62803, '1f503':62769, '1f504':62770, '1f505':62820, '1f506':62821, '1f507':61155, '1f508':61156, '1f509':61157, '1f50a':61158, '1f50b':61188, '1f50c':61190, '1f50d':61211, '1f50e':61212, '1f50f':61290, '1f510':61291, '1f511':61292, '1f512':61288, '1f513':61289, '1f514':61162, '1f515':61163, '1f516':61233, '1f517':61313, '1f518':62947, '1f519':62771, '1f51a':62772, '1f51b':62773, '1f51c':62774, '1f51d':62775, '1f51e':62752, '1f51f':62876, '1f520':62877, '1f521':62878, '1f522':62879, '1f523':62880, '1f524':62881, '1f525':41021, '1f526':61215, '1f527':61306, '1f528':61294, '1f529':61308, '1f52a':3803, '1f52b':61301, '1f52c':61323, '1f52d':61324, '1f52e':51082, '1f52f':62787, '1f530':62848, '1f531':62846, '1f532':62949, '1f533':62948, '1f534':62916, '1f535':62920, '1f536':62940, '1f537':62941, '1f538':62942, '1f539':62943, '1f53a':62944, '1f53b':62945, '1f53c':62811, '1f53d':62813, '1f549':62778, '1f54a':2602, '1f54b':4854, '1f54c':4850, '1f54d':4852, '1f54e':62786, '1f550':4955, '1f551':4957, '1f552':4959, '1f553':4961, '1f554':4963, '1f555':4965, '1f556':4967, '1f557':4969, '1f558':4971, '1f559':4973, '1f55a':4975, '1f55b':4953, '1f55c':4956, '1f55d':4958, '1f55e':4960, '1f55f':4962, '1f560':4964, '1f561':4966, '1f562':4968, '1f563':4970, '1f564':4972, '1f565':4974, '1f566':4976, '1f567':4954, '1f56f':61213, '1f570':4952, '1f573':1156, '1f574':1587, '1f575-200d-2640':1497, '1f575-200d-2642':1496, '1f575':1495, '1f576':61111, '1f577':2641, '1f578':2642, '1f579':51087, '1f57a':1586, '1f587':61281, '1f58a':61261, '1f58b':61260, '1f58c':61262, '1f58d':61263, '1f590':1329, '1f595':1348, '1f596':1331, '1f5a4':1148, '1f5a5':61192, '1f5a8':61193, '1f5b1':61195, '1f5b2':61196, '1f5bc':51104, '1f5c2':61268, '1f5c3':61285, '1f5c4':61286, '1f5d1':61287, '1f5d2':61271, '1f5d3':61272, '1f5dc':61310, '1f5dd':61293, '1f5de':61231, '1f5e1':61299, '1f5e3':1683, '1f5e8':1160, '1f5ef':1161, '1f5f3':61257, '1f5fa':4810, '1f5fb':4816, '1f5fc':4847, '1f5fd':4848, '1f5fe':4811, '1f5ff':61362, '1f600':11, '1f601':14, '1f602':18, '1f603':12, '1f604':13, '1f605':16, '1f606':15, '1f607':114, '1f608':1103, '1f609':112, '1f60a':113, '1f60b':124, '1f60c':150, '1f60d':116, '1f60e':170, '1f60f':144, '1f610':139, '1f611':140, '1f612':145, '1f613':195, '1f614':151, '1f615':173, '1f616':192, '1f617':119, '1f618':118, '1f619':122, '1f61a':121, '1f61b':125, '1f61c':126, '1f61d':128, '1f61e':194, '1f61f':175, '1f620':1101, '1f621':1100, '1f622':189, '1f623':193, '1f624':199, '1f625':188, '1f626':184, '1f627':185, '1f628':186, '1f629':196, '1f62a':152, '1f62b':197, '1f62c':147, '1f62d':190, '1f62e-200d-1f4a8':148, '1f62e':178, '1f62f':179, '1f630':187, '1f631':191, '1f632':180, '1f633':181, '1f634':154, '1f635-200d-1f4ab':165, '1f635':164, '1f636-200d-1f32b':143, '1f636':141, '1f637':155, '1f638':1116, '1f639':1117, '1f63a':1115, '1f63b':1118, '1f63c':1119, '1f63d':1120, '1f63e':1123, '1f63f':1122, '1f640':1121, '1f641':176, '1f642':19, '1f643':110, '1f644':146, '1f645-200d-2640':1422, '1f645-200d-2642':1421, '1f645':1420, '1f646-200d-2640':1425, '1f646-200d-2642':1424, '1f646':1423, '1f647-200d-2640':1437, '1f647-200d-2642':1436, '1f647':1435, '1f648':1124, '1f649':1125, '1f64a':1126, '1f64b-200d-2640':1431, '1f64b-200d-2642':1430, '1f64b':1429, '1f64c':1359, '1f64d-200d-2640':1416, '1f64d-200d-2642':1415, '1f64d':1414, '1f64e-200d-2640':1419, '1f64e-200d-2642':1418, '1f64e':1417, '1f64f':1364, '1f680':4942, '1f681':4937, '1f682':4872, '1f683':4873, '1f684':4874, '1f685':4875, '1f686':4876, '1f687':4877, '1f688':4878, '1f689':4879, '1f68a':4880, '1f68b':4883, '1f68c':4884, '1f68d':4885, '1f68e':4886, '1f68f':4911, '1f690':4887, '1f691':4888, '1f692':4889, '1f693':4890, '1f694':4891, '1f695':4892, '1f696':4893, '1f697':4894, '1f698':4895, '1f699':4896, '1f69a':4898, '1f69b':4899, '1f69c':4900, '1f69d':4881, '1f69e':4882, '1f69f':4938, '1f6a0':4939, '1f6a1':4940, '1f6a2':4930, '1f6a3-200d-2640':1609, '1f6a3-200d-2642':1608, '1f6a3':1607, '1f6a4':4926, '1f6a5':4918, '1f6a6':4919, '1f6a7':4921, '1f6a8':4917, '1f6a9':71587, '1f6aa':61333, '1f6ab':62745, '1f6ac':61358, '1f6ad':62747, '1f6ae':62730, '1f6af':62748, '1f6b0':62731, '1f6b1':62749, '1f6b2':4907, '1f6b3':62746, '1f6b4-200d-2640':1621, '1f6b4-200d-2642':1620, '1f6b4':1619, '1f6b5-200d-2640':1624, '1f6b5-200d-2642':1623, '1f6b5':1622, '1f6b6-200d-2640':1566, '1f6b6-200d-2642':1565, '1f6b6':1564, '1f6b7':62750, '1f6b8':62743, '1f6b9':62733, '1f6ba':62734, '1f6bb':62735, '1f6bc':62736, '1f6bd':61340, '1f6be':62737, '1f6bf':61342, '1f6c0':1643, '1f6c1':61343, '1f6c2':62738, '1f6c3':62739, '1f6c4':62740, '1f6c5':62741, '1f6cb':61338, '1f6cc':1644, '1f6cd':61133, '1f6ce':4944, '1f6cf':61337, '1f6d0':62776, '1f6d1':4920, '1f6d2':61357, '1f6d5':4851, '1f6d6':4828, '1f6d7':61334, '1f6e0':61298, '1f6e1':61304, '1f6e2':4914, '1f6e3':4912, '1f6e4':4913, '1f6e5':4929, '1f6e9':4932, '1f6eb':4933, '1f6ec':4934, '1f6f0':4941, '1f6f3':4927, '1f6f4':4908, '1f6f5':4903, '1f6f6':4925, '1f6f7':51076, '1f6f8':4943, '1f6f9':4909, '1f6fa':4906, '1f6fb':4897, '1f6fc':4910, '1f7e0':62917, '1f7e1':62918, '1f7e2':62919, '1f7e3':62921, '1f7e4':62922, '1f7e5':62925, '1f7e6':62929, '1f7e7':62926, '1f7e8':62927, '1f7e9':62928, '1f7ea':62930, '1f7eb':62931, '1f90c':1337, '1f90d':1149, '1f90e':1147, '1f90f':1338, '1f910':137, '1f911':129, '1f912':156, '1f913':171, '1f914':135, '1f915':157, '1f916':1114, '1f917':130, '1f918':1343, '1f919':1344, '1f91a':1328, '1f91b':1356, '1f91c':1357, '1f91d':1363, '1f91e':1340, '1f91f':1342, '1f920':167, '1f921':1108, '1f922':158, '1f923':17, '1f924':153, '1f925':149, '1f926-200d-2640':1440, '1f926-200d-2642':1439, '1f926':1438, '1f927':160, '1f928':138, '1f929':117, '1f92a':127, '1f92b':134, '1f92c':1102, '1f92d':131, '1f92e':159, '1f92f':166, '1f930':1519, '1f931':1522, '1f932':1362, '1f933':1367, '1f934':1506, '1f935-200d-2640':1515, '1f935-200d-2642':1514, '1f935':1513, '1f936':1528, '1f937-200d-2640':1443, '1f937-200d-2642':1442, '1f937':1441, '1f938-200d-2640':1627, '1f938-200d-2642':1626, '1f938':1625, '1f939-200d-2640':1639, '1f939-200d-2642':1638, '1f939':1637, '1f93a':1597, '1f93c-200d-2640':1630, '1f93c-200d-2642':1629, '1f93c':1628, '1f93d-200d-2640':1633, '1f93d-200d-2642':1632, '1f93d':1631, '1f93e-200d-2640':1636, '1f93e-200d-2642':1635, '1f93e':1634, '1f93f':51073, '1f940':2654, '1f941':61180, '1f942':3791, '1f943':3792, '1f944':3802, '1f945':51069, '1f947':51048, '1f948':51049, '1f949':51050, '1f94a':51067, '1f94b':51068, '1f94c':51077, '1f94d':51064, '1f94e':51053, '1f94f':51059, '1f950':3710, '1f951':3693, '1f952':3700, '1f953':3721, '1f954':3695, '1f955':3696, '1f956':3711, '1f957':3738, '1f958':3734, '1f959':3730, '1f95a':3732, '1f95b':3780, '1f95c':3706, '1f95d':3689, '1f95e':3715, '1f95f':3757, '1f960':3758, '1f961':3759, '1f962':3799, '1f963':3737, '1f964':3794, '1f965':3692, '1f966':3702, '1f967':3773, '1f968':3713, '1f969':3720, '1f96a':3726, '1f96b':3742, '1f96c':3701, '1f96d':3681, '1f96e':3755, '1f96f':3714, '1f970':115, '1f971':198, '1f972':123, '1f973':168, '1f974':163, '1f975':161, '1f976':162, '1f977':1501, '1f978':169, '1f97a':182, '1f97b':61124, '1f97c':61113, '1f97d':61112, '1f97e':61138, '1f97f':61139, '1f980':3760, '1f981':2545, '1f982':2643, '1f983':2594, '1f984':2551, '1f985':2603, '1f986':2604, '1f987':2583, '1f988':2628, '1f989':2606, '1f98a':2540, '1f98b':2633, '1f98c':2553, '1f98d':2532, '1f98e':2615, '1f98f':2572, '1f990':3762, '1f991':3763, '1f992':2569, '1f993':2552, '1f994':2582, '1f995':2619, '1f996':2620, '1f997':2639, '1f998':2591, '1f999':2568, '1f99a':2610, '1f99b':2573, '1f99c':2611, '1f99d':2541, '1f99e':3761, '1f99f':2644, '1f9a0':2647, '1f9a1':2592, '1f9a2':2605, '1f9a3':2571, '1f9a4':2607, '1f9a5':2588, '1f9a6':2589, '1f9a7':2533, '1f9a8':2590, '1f9a9':2609, '1f9aa':3764, '1f9ab':2581, '1f9ac':2554, '1f9ad':2624, '1f9ae':2536, '1f9af':61312, '1f9b4':1380, '1f9b5':1371, '1f9b6':1372, '1f9b7':1379, '1f9b8-200d-2640':1532, '1f9b8-200d-2642':1531, '1f9b8':1530, '1f9b9-200d-2640':1535, '1f9b9-200d-2642':1534, '1f9b9':1533, '1f9ba':61114, '1f9bb':1374, '1f9bc':4905, '1f9bd':4904, '1f9be':1369, '1f9bf':1370, '1f9c0':3717, '1f9c1':3772, '1f9c2':3741, '1f9c3':3796, '1f9c4':3703, '1f9c5':3704, '1f9c6':3731, '1f9c7':3716, '1f9c8':3740, '1f9c9':3797, '1f9ca':3798, '1f9cb':3795, '1f9cd-200d-2640':1569, '1f9cd-200d-2642':1568, '1f9cd':1567, '1f9ce-200d-2640':1572, '1f9ce-200d-2642':1571, '1f9ce':1570, '1f9cf-200d-2640':1434, '1f9cf-200d-2642':1433, '1f9cf':1432, '1f9d0':172, '1f9d1-200d-1f33e':1456, '1f9d1-200d-1f373':1459, '1f9d1-200d-1f37c':1525, '1f9d1-200d-1f384':1529, '1f9d1-200d-1f393':1447, '1f9d1-200d-1f3a4':1477, '1f9d1-200d-1f3a8':1480, '1f9d1-200d-1f3eb':1450, '1f9d1-200d-1f3ed':1465, '1f9d1-200d-1f4bb':1474, '1f9d1-200d-1f4bc':1468, '1f9d1-200d-1f527':1462, '1f9d1-200d-1f52c':1471, '1f9d1-200d-1f680':1486, '1f9d1-200d-1f692':1489, '1f9d1-200d-1f91d-200d-1f9d1':1645, '1f9d1-200d-1f9af':1573, '1f9d1-200d-1f9b0':1402, '1f9d1-200d-1f9b1':1404, '1f9d1-200d-1f9b2':1408, '1f9d1-200d-1f9b3':1406, '1f9d1-200d-1f9bc':1576, '1f9d1-200d-1f9bd':1579, '1f9d1-200d-2695':1444, '1f9d1-200d-2696':1453, '1f9d1-200d-2708':1483, '1f9d1':1390, '1f9d2':1387, '1f9d3':1411, '1f9d4-200d-2640':1395, '1f9d4-200d-2642':1394, '1f9d4':1393, '1f9d5':1512, '1f9d6-200d-2640':1593, '1f9d6-200d-2642':1592, '1f9d6':1591, '1f9d7-200d-2640':1596, '1f9d7-200d-2642':1595, '1f9d7':1594, '1f9d8-200d-2640':1642, '1f9d8-200d-2642':1641, '1f9d8':1640, '1f9d9-200d-2640':1538, '1f9d9-200d-2642':1537, '1f9d9':1536, '1f9da-200d-2640':1541, '1f9da-200d-2642':1540, '1f9da':1539, '1f9db-200d-2640':1544, '1f9db-200d-2642':1543, '1f9db':1542, '1f9dc-200d-2640':1547, '1f9dc-200d-2642':1546, '1f9dc':1545, '1f9dd-200d-2640':1550, '1f9dd-200d-2642':1549, '1f9dd':1548, '1f9de-200d-2640':1553, '1f9de-200d-2642':1552, '1f9de':1551, '1f9df-200d-2640':1556, '1f9df-200d-2642':1555, '1f9df':1554, '1f9e0':1376, '1f9e1':1142, '1f9e2':61148, '1f9e3':61118, '1f9e4':61119, '1f9e5':61120, '1f9e6':61121, '1f9e7':51039, '1f9e8':51028, '1f9e9':51090, '1f9ea':61320, '1f9eb':61321, '1f9ec':61322, '1f9ed':4812, '1f9ee':61201, '1f9ef':61356, '1f9f0':61316, '1f9f1':4825, '1f9f2':61317, '1f9f3':4945, '1f9f4':61346, '1f9f5':51106, '1f9f6':51108, '1f9f7':61347, '1f9f8':51091, '1f9f9':61348, '1f9fa':61349, '1f9fb':61350, '1f9fc':61352, '1f9fd':61355, '1f9fe':61243, '1f9ff':51084, '1fa70':61142, '1fa71':61125, '1fa72':61126, '1fa73':61127, '1fa74':61135, '1fa78':61327, '1fa79':61329, '1fa7a':61331, '1fa80':51079, '1fa81':51080, '1fa82':4935, '1fa83':61302, '1fa84':51083, '1fa85':51092, '1fa86':51094, '1fa90':4993, '1fa91':61339, '1fa92':61345, '1fa93':61295, '1fa94':61217, '1fa95':61179, '1fa96':61149, '1fa97':61174, '1fa98':61181, '1fa99':61236, '1fa9a':61305, '1fa9b':61307, '1fa9c':61318, '1fa9d':61315, '1fa9e':61335, '1fa9f':61336, '1faa0':61341, '1faa1':51107, '1faa2':51109, '1faa3':61351, '1faa4':61344, '1faa5':61354, '1faa6':61360, '1faa7':61363, '1faa8':4826, '1fab0':2645, '1fab1':2646, '1fab2':2637, '1fab3':2640, '1fab4':2660, '1fab5':4827, '1fab6':2608, '1fac0':1377, '1fac1':1378, '1fac2':1686, '1fad0':3688, '1fad1':3699, '1fad2':3691, '1fad3':3712, '1fad4':3729, '1fad5':3736, '1fad6':3782, '203c':62834, '21a9':62765, '21aa':62766, '231a':4948, '231b':4946, '23cf':62818, '23e9':62805, '23ea':62809, '23eb':62812, '23ec':62814, '23ed':62806, '23ee':62810, '23ef':62807, '23f0':4949, '23f1':4950, '23f2':4951, '23f3':4947, '23f8':62815, '23f9':62816, '23fa':62817, '24c2':62890, '25aa':62938, '25ab':62939, '25b6':62804, '25c0':62808, '25fb':62935, '25fc':62934, '25fd':62937, '25fe':62936, '260e':61184, '261d':1350, '262a':62784, '262e':62785, '262f':62781, '263a':120, '264a':62790, '264b':62791, '264c':62792, '264d':62793, '264e':62794, '264f':62795, '265f':51099, '267b':62844, '267e':62833, '267f':62732, '269b':62777, '269c':62845, '26a0':62742, '26a1':41016, '26a7':62827, '26aa':62924, '26ab':62923, '26b0':61359, '26b1':61361, '26bd':51051, '26be':51052, '26c4':41019, '26c5':4999, '26c8':41000, '26ce':62800, '26cf':61296, '26d1':61150, '26d3':61314, '26d4':62744, '26e9':4853, '26ea':4849, '26f0':4814, '26f1':41015, '26f2':4855, '26f3':51070, '26f4':4928, '26f5':4924, '26f7':1599, '26f8':51071, '26f9-200d-2640':1615, '26f9-200d-2642':1614, '26f9':1613, '26fa':4856, '26fd':4915, '270a':1354, '270b':1330, '270c':1339, '270d':1365, '270f':61258, '271d':62782, '274c':62853, '274e':62854, '2764-200d-1f525':1139, '2764-200d-1fa79':1140, '27a1':62757, '27b0':62855, '27bf':62856, '2b05':62761, '2b06':62755, '2b07':62759, '2b1b':62932, '2b1c':62933, '2b50':4994, '2b55':62849, '303d':62857, '1f385-1f3fb':0, '1f385-1f3fc':0, '1f385-1f3fd':0, '1f385-1f3fe':0, '1f385-1f3ff':0, '1f3c2-1f3fb':0, '1f3c2-1f3fc':0, '1f3c2-1f3fd':0, '1f3c2-1f3fe':0, '1f3c2-1f3ff':0, '1f3c3-1f3fb-200d-2640':0, '1f3c3-1f3fc-200d-2640':0, '1f3c3-1f3fd-200d-2640':0, '1f3c3-1f3fe-200d-2640':0, '1f3c3-1f3ff-200d-2640':0, '1f3c3-1f3fb-200d-2642':0, '1f3c3-1f3fc-200d-2642':0, '1f3c3-1f3fd-200d-2642':0, '1f3c3-1f3fe-200d-2642':0, '1f3c3-1f3ff-200d-2642':0, '1f3c3-1f3fb':0, '1f3c3-1f3fc':0, '1f3c3-1f3fd':0, '1f3c3-1f3fe':0, '1f3c3-1f3ff':0, '1f3c4-1f3fb-200d-2640':0, '1f3c4-1f3fc-200d-2640':0, '1f3c4-1f3fd-200d-2640':0, '1f3c4-1f3fe-200d-2640':0, '1f3c4-1f3ff-200d-2640':0, '1f3c4-1f3fb-200d-2642':0, '1f3c4-1f3fc-200d-2642':0, '1f3c4-1f3fd-200d-2642':0, '1f3c4-1f3fe-200d-2642':0, '1f3c4-1f3ff-200d-2642':0, '1f3c4-1f3fb':0, '1f3c4-1f3fc':0, '1f3c4-1f3fd':0, '1f3c4-1f3fe':0, '1f3c4-1f3ff':0, '1f3c7-1f3fb':0, '1f3c7-1f3fc':0, '1f3c7-1f3fd':0, '1f3c7-1f3fe':0, '1f3c7-1f3ff':0, '1f3ca-1f3fb-200d-2640':0, '1f3ca-1f3fc-200d-2640':0, '1f3ca-1f3fd-200d-2640':0, '1f3ca-1f3fe-200d-2640':0, '1f3ca-1f3ff-200d-2640':0, '1f3ca-1f3fb-200d-2642':0, '1f3ca-1f3fc-200d-2642':0, '1f3ca-1f3fd-200d-2642':0, '1f3ca-1f3fe-200d-2642':0, '1f3ca-1f3ff-200d-2642':0, '1f3ca-1f3fb':0, '1f3ca-1f3fc':0, '1f3ca-1f3fd':0, '1f3ca-1f3fe':0, '1f3ca-1f3ff':0, '1f3cb-1f3fb-200d-2640':0, '1f3cb-1f3fc-200d-2640':0, '1f3cb-1f3fd-200d-2640':0, '1f3cb-1f3fe-200d-2640':0, '1f3cb-1f3ff-200d-2640':0, '1f3cb-1f3fb-200d-2642':0, '1f3cb-1f3fc-200d-2642':0, '1f3cb-1f3fd-200d-2642':0, '1f3cb-1f3fe-200d-2642':0, '1f3cb-1f3ff-200d-2642':0, '1f3cb-1f3fb':0, '1f3cb-1f3fc':0, '1f3cb-1f3fd':0, '1f3cb-1f3fe':0, '1f3cb-1f3ff':0, '1f3cc-1f3fb-200d-2640':0, '1f3cc-1f3fc-200d-2640':0, '1f3cc-1f3fd-200d-2640':0, '1f3cc-1f3fe-200d-2640':0, '1f3cc-1f3ff-200d-2640':0, '1f3cc-1f3fb-200d-2642':0, '1f3cc-1f3fc-200d-2642':0, '1f3cc-1f3fd-200d-2642':0, '1f3cc-1f3fe-200d-2642':0, '1f3cc-1f3ff-200d-2642':0, '1f3cc-1f3fb':0, '1f3cc-1f3fc':0, '1f3cc-1f3fd':0, '1f3cc-1f3fe':0, '1f3cc-1f3ff':0, '1f442-1f3fb':0, '1f442-1f3fc':0, '1f442-1f3fd':0, '1f442-1f3fe':0, '1f442-1f3ff':0, '1f443-1f3fb':0, '1f443-1f3fc':0, '1f443-1f3fd':0, '1f443-1f3fe':0, '1f443-1f3ff':0, '1f446-1f3fb':0, '1f446-1f3fc':0, '1f446-1f3fd':0, '1f446-1f3fe':0, '1f446-1f3ff':0, '1f447-1f3fb':0, '1f447-1f3fc':0, '1f447-1f3fd':0, '1f447-1f3fe':0, '1f447-1f3ff':0, '1f448-1f3fb':0, '1f448-1f3fc':0, '1f448-1f3fd':0, '1f448-1f3fe':0, '1f448-1f3ff':0, '1f449-1f3fb':0, '1f449-1f3fc':0, '1f449-1f3fd':0, '1f449-1f3fe':0, '1f449-1f3ff':0, '1f44a-1f3fb':0, '1f44a-1f3fc':0, '1f44a-1f3fd':0, '1f44a-1f3fe':0, '1f44a-1f3ff':0, '1f44b-1f3fb':0, '1f44b-1f3fc':0, '1f44b-1f3fd':0, '1f44b-1f3fe':0, '1f44b-1f3ff':0, '1f44c-1f3fb':0, '1f44c-1f3fc':0, '1f44c-1f3fd':0, '1f44c-1f3fe':0, '1f44c-1f3ff':0, '1f44d-1f3fb':0, '1f44d-1f3fc':0, '1f44d-1f3fd':0, '1f44d-1f3fe':0, '1f44d-1f3ff':0, '1f44e-1f3fb':0, '1f44e-1f3fc':0, '1f44e-1f3fd':0, '1f44e-1f3fe':0, '1f44e-1f3ff':0, '1f44f-1f3fb':0, '1f44f-1f3fc':0, '1f44f-1f3fd':0, '1f44f-1f3fe':0, '1f44f-1f3ff':0, '1f450-1f3fb':0, '1f450-1f3fc':0, '1f450-1f3fd':0, '1f450-1f3fe':0, '1f450-1f3ff':0, '1f466-1f3fb':0, '1f466-1f3fc':0, '1f466-1f3fd':0, '1f466-1f3fe':0, '1f466-1f3ff':0, '1f467-1f3fb':0, '1f467-1f3fc':0, '1f467-1f3fd':0, '1f467-1f3fe':0, '1f467-1f3ff':0, '1f468-1f3fb-200d-1f33e':0, '1f468-1f3fc-200d-1f33e':0, '1f468-1f3fd-200d-1f33e':0, '1f468-1f3fe-200d-1f33e':0, '1f468-1f3ff-200d-1f33e':0, '1f468-1f3fb-200d-1f373':0, '1f468-1f3fc-200d-1f373':0, '1f468-1f3fd-200d-1f373':0, '1f468-1f3fe-200d-1f373':0, '1f468-1f3ff-200d-1f373':0, '1f468-1f3fb-200d-1f37c':0, '1f468-1f3fc-200d-1f37c':0, '1f468-1f3fd-200d-1f37c':0, '1f468-1f3fe-200d-1f37c':0, '1f468-1f3ff-200d-1f37c':0, '1f468-1f3fb-200d-1f393':0, '1f468-1f3fc-200d-1f393':0, '1f468-1f3fd-200d-1f393':0, '1f468-1f3fe-200d-1f393':0, '1f468-1f3ff-200d-1f393':0, '1f468-1f3fb-200d-1f3a4':0, '1f468-1f3fc-200d-1f3a4':0, '1f468-1f3fd-200d-1f3a4':0, '1f468-1f3fe-200d-1f3a4':0, '1f468-1f3ff-200d-1f3a4':0, '1f468-1f3fb-200d-1f3a8':0, '1f468-1f3fc-200d-1f3a8':0, '1f468-1f3fd-200d-1f3a8':0, '1f468-1f3fe-200d-1f3a8':0, '1f468-1f3ff-200d-1f3a8':0, '1f468-1f3fb-200d-1f3eb':0, '1f468-1f3fc-200d-1f3eb':0, '1f468-1f3fd-200d-1f3eb':0, '1f468-1f3fe-200d-1f3eb':0, '1f468-1f3ff-200d-1f3eb':0, '1f468-1f3fb-200d-1f3ed':0, '1f468-1f3fc-200d-1f3ed':0, '1f468-1f3fd-200d-1f3ed':0, '1f468-1f3fe-200d-1f3ed':0, '1f468-1f3ff-200d-1f3ed':0, '1f468-1f3fb-200d-1f4bb':0, '1f468-1f3fc-200d-1f4bb':0, '1f468-1f3fd-200d-1f4bb':0, '1f468-1f3fe-200d-1f4bb':0, '1f468-1f3ff-200d-1f4bb':0, '1f468-1f3fb-200d-1f4bc':0, '1f468-1f3fc-200d-1f4bc':0, '1f468-1f3fd-200d-1f4bc':0, '1f468-1f3fe-200d-1f4bc':0, '1f468-1f3ff-200d-1f4bc':0, '1f468-1f3fb-200d-1f527':0, '1f468-1f3fc-200d-1f527':0, '1f468-1f3fd-200d-1f527':0, '1f468-1f3fe-200d-1f527':0, '1f468-1f3ff-200d-1f527':0, '1f468-1f3fb-200d-1f52c':0, '1f468-1f3fc-200d-1f52c':0, '1f468-1f3fd-200d-1f52c':0, '1f468-1f3fe-200d-1f52c':0, '1f468-1f3ff-200d-1f52c':0, '1f468-1f3fb-200d-1f680':0, '1f468-1f3fc-200d-1f680':0, '1f468-1f3fd-200d-1f680':0, '1f468-1f3fe-200d-1f680':0, '1f468-1f3ff-200d-1f680':0, '1f468-1f3fb-200d-1f692':0, '1f468-1f3fc-200d-1f692':0, '1f468-1f3fd-200d-1f692':0, '1f468-1f3fe-200d-1f692':0, '1f468-1f3ff-200d-1f692':0, '1f468-1f3fb-200d-1f9af':0, '1f468-1f3fc-200d-1f9af':0, '1f468-1f3fd-200d-1f9af':0, '1f468-1f3fe-200d-1f9af':0, '1f468-1f3ff-200d-1f9af':0, '1f468-1f3fb-200d-1f9b0':0, '1f468-1f3fc-200d-1f9b0':0, '1f468-1f3fd-200d-1f9b0':0, '1f468-1f3fe-200d-1f9b0':0, '1f468-1f3ff-200d-1f9b0':0, '1f468-1f3fb-200d-1f9b1':0, '1f468-1f3fc-200d-1f9b1':0, '1f468-1f3fd-200d-1f9b1':0, '1f468-1f3fe-200d-1f9b1':0, '1f468-1f3ff-200d-1f9b1':0, '1f468-1f3fb-200d-1f9b2':0, '1f468-1f3fc-200d-1f9b2':0, '1f468-1f3fd-200d-1f9b2':0, '1f468-1f3fe-200d-1f9b2':0, '1f468-1f3ff-200d-1f9b2':0, '1f468-1f3fb-200d-1f9b3':0, '1f468-1f3fc-200d-1f9b3':0, '1f468-1f3fd-200d-1f9b3':0, '1f468-1f3fe-200d-1f9b3':0, '1f468-1f3ff-200d-1f9b3':0, '1f468-1f3fb-200d-1f9bc':0, '1f468-1f3fc-200d-1f9bc':0, '1f468-1f3fd-200d-1f9bc':0, '1f468-1f3fe-200d-1f9bc':0, '1f468-1f3ff-200d-1f9bc':0, '1f468-1f3fb-200d-1f9bd':0, '1f468-1f3fc-200d-1f9bd':0, '1f468-1f3fd-200d-1f9bd':0, '1f468-1f3fe-200d-1f9bd':0, '1f468-1f3ff-200d-1f9bd':0, '1f468-1f3fb-200d-2695':0, '1f468-1f3fc-200d-2695':0, '1f468-1f3fd-200d-2695':0, '1f468-1f3fe-200d-2695':0, '1f468-1f3ff-200d-2695':0, '1f468-1f3fb-200d-2696':0, '1f468-1f3fc-200d-2696':0, '1f468-1f3fd-200d-2696':0, '1f468-1f3fe-200d-2696':0, '1f468-1f3ff-200d-2696':0, '1f468-1f3fb-200d-2708':0, '1f468-1f3fc-200d-2708':0, '1f468-1f3fd-200d-2708':0, '1f468-1f3fe-200d-2708':0, '1f468-1f3ff-200d-2708':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fb':0, '1f468-1f3fc':0, '1f468-1f3fd':0, '1f468-1f3fe':0, '1f468-1f3ff':0, '1f469-1f3fb-200d-1f33e':0, '1f469-1f3fc-200d-1f33e':0, '1f469-1f3fd-200d-1f33e':0, '1f469-1f3fe-200d-1f33e':0, '1f469-1f3ff-200d-1f33e':0, '1f469-1f3fb-200d-1f373':0, '1f469-1f3fc-200d-1f373':0, '1f469-1f3fd-200d-1f373':0, '1f469-1f3fe-200d-1f373':0, '1f469-1f3ff-200d-1f373':0, '1f469-1f3fb-200d-1f37c':0, '1f469-1f3fc-200d-1f37c':0, '1f469-1f3fd-200d-1f37c':0, '1f469-1f3fe-200d-1f37c':0, '1f469-1f3ff-200d-1f37c':0, '1f469-1f3fb-200d-1f393':0, '1f469-1f3fc-200d-1f393':0, '1f469-1f3fd-200d-1f393':0, '1f469-1f3fe-200d-1f393':0, '1f469-1f3ff-200d-1f393':0, '1f469-1f3fb-200d-1f3a4':0, '1f469-1f3fc-200d-1f3a4':0, '1f469-1f3fd-200d-1f3a4':0, '1f469-1f3fe-200d-1f3a4':0, '1f469-1f3ff-200d-1f3a4':0, '1f469-1f3fb-200d-1f3a8':0, '1f469-1f3fc-200d-1f3a8':0, '1f469-1f3fd-200d-1f3a8':0, '1f469-1f3fe-200d-1f3a8':0, '1f469-1f3ff-200d-1f3a8':0, '1f469-1f3fb-200d-1f3eb':0, '1f469-1f3fc-200d-1f3eb':0, '1f469-1f3fd-200d-1f3eb':0, '1f469-1f3fe-200d-1f3eb':0, '1f469-1f3ff-200d-1f3eb':0, '1f469-1f3fb-200d-1f3ed':0, '1f469-1f3fc-200d-1f3ed':0, '1f469-1f3fd-200d-1f3ed':0, '1f469-1f3fe-200d-1f3ed':0, '1f469-1f3ff-200d-1f3ed':0, '1f469-1f3fb-200d-1f4bb':0, '1f469-1f3fc-200d-1f4bb':0, '1f469-1f3fd-200d-1f4bb':0, '1f469-1f3fe-200d-1f4bb':0, '1f469-1f3ff-200d-1f4bb':0, '1f469-1f3fb-200d-1f4bc':0, '1f469-1f3fc-200d-1f4bc':0, '1f469-1f3fd-200d-1f4bc':0, '1f469-1f3fe-200d-1f4bc':0, '1f469-1f3ff-200d-1f4bc':0, '1f469-1f3fb-200d-1f527':0, '1f469-1f3fc-200d-1f527':0, '1f469-1f3fd-200d-1f527':0, '1f469-1f3fe-200d-1f527':0, '1f469-1f3ff-200d-1f527':0, '1f469-1f3fb-200d-1f52c':0, '1f469-1f3fc-200d-1f52c':0, '1f469-1f3fd-200d-1f52c':0, '1f469-1f3fe-200d-1f52c':0, '1f469-1f3ff-200d-1f52c':0, '1f469-1f3fb-200d-1f680':0, '1f469-1f3fc-200d-1f680':0, '1f469-1f3fd-200d-1f680':0, '1f469-1f3fe-200d-1f680':0, '1f469-1f3ff-200d-1f680':0, '1f469-1f3fb-200d-1f692':0, '1f469-1f3fc-200d-1f692':0, '1f469-1f3fd-200d-1f692':0, '1f469-1f3fe-200d-1f692':0, '1f469-1f3ff-200d-1f692':0, '1f469-1f3fb-200d-1f9af':0, '1f469-1f3fc-200d-1f9af':0, '1f469-1f3fd-200d-1f9af':0, '1f469-1f3fe-200d-1f9af':0, '1f469-1f3ff-200d-1f9af':0, '1f469-1f3fb-200d-1f9b0':0, '1f469-1f3fc-200d-1f9b0':0, '1f469-1f3fd-200d-1f9b0':0, '1f469-1f3fe-200d-1f9b0':0, '1f469-1f3ff-200d-1f9b0':0, '1f469-1f3fb-200d-1f9b1':0, '1f469-1f3fc-200d-1f9b1':0, '1f469-1f3fd-200d-1f9b1':0, '1f469-1f3fe-200d-1f9b1':0, '1f469-1f3ff-200d-1f9b1':0, '1f469-1f3fb-200d-1f9b2':0, '1f469-1f3fc-200d-1f9b2':0, '1f469-1f3fd-200d-1f9b2':0, '1f469-1f3fe-200d-1f9b2':0, '1f469-1f3ff-200d-1f9b2':0, '1f469-1f3fb-200d-1f9b3':0, '1f469-1f3fc-200d-1f9b3':0, '1f469-1f3fd-200d-1f9b3':0, '1f469-1f3fe-200d-1f9b3':0, '1f469-1f3ff-200d-1f9b3':0, '1f469-1f3fb-200d-1f9bc':0, '1f469-1f3fc-200d-1f9bc':0, '1f469-1f3fd-200d-1f9bc':0, '1f469-1f3fe-200d-1f9bc':0, '1f469-1f3ff-200d-1f9bc':0, '1f469-1f3fb-200d-1f9bd':0, '1f469-1f3fc-200d-1f9bd':0, '1f469-1f3fd-200d-1f9bd':0, '1f469-1f3fe-200d-1f9bd':0, '1f469-1f3ff-200d-1f9bd':0, '1f469-1f3fb-200d-2695':0, '1f469-1f3fc-200d-2695':0, '1f469-1f3fd-200d-2695':0, '1f469-1f3fe-200d-2695':0, '1f469-1f3ff-200d-2695':0, '1f469-1f3fb-200d-2696':0, '1f469-1f3fc-200d-2696':0, '1f469-1f3fd-200d-2696':0, '1f469-1f3fe-200d-2696':0, '1f469-1f3ff-200d-2696':0, '1f469-1f3fb-200d-2708':0, '1f469-1f3fc-200d-2708':0, '1f469-1f3fd-200d-2708':0, '1f469-1f3fe-200d-2708':0, '1f469-1f3ff-200d-2708':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fb':0, '1f469-1f3fc':0, '1f469-1f3fd':0, '1f469-1f3fe':0, '1f469-1f3ff':0, '1f46b-1f3fb':0, '1f46b-1f3fc':0, '1f46b-1f3fd':0, '1f46b-1f3fe':0, '1f46b-1f3ff':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe':0, '1f46c-1f3fb':0, '1f46c-1f3fc':0, '1f46c-1f3fd':0, '1f46c-1f3fe':0, '1f46c-1f3ff':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe':0, '1f46d-1f3fb':0, '1f46d-1f3fc':0, '1f46d-1f3fd':0, '1f46d-1f3fe':0, '1f46d-1f3ff':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe':0, '1f46e-1f3fb-200d-2640':0, '1f46e-1f3fc-200d-2640':0, '1f46e-1f3fd-200d-2640':0, '1f46e-1f3fe-200d-2640':0, '1f46e-1f3ff-200d-2640':0, '1f46e-1f3fb-200d-2642':0, '1f46e-1f3fc-200d-2642':0, '1f46e-1f3fd-200d-2642':0, '1f46e-1f3fe-200d-2642':0, '1f46e-1f3ff-200d-2642':0, '1f46e-1f3fb':0, '1f46e-1f3fc':0, '1f46e-1f3fd':0, '1f46e-1f3fe':0, '1f46e-1f3ff':0, '1f470-1f3fb-200d-2640':0, '1f470-1f3fc-200d-2640':0, '1f470-1f3fd-200d-2640':0, '1f470-1f3fe-200d-2640':0, '1f470-1f3ff-200d-2640':0, '1f470-1f3fb-200d-2642':0, '1f470-1f3fc-200d-2642':0, '1f470-1f3fd-200d-2642':0, '1f470-1f3fe-200d-2642':0, '1f470-1f3ff-200d-2642':0, '1f470-1f3fb':0, '1f470-1f3fc':0, '1f470-1f3fd':0, '1f470-1f3fe':0, '1f470-1f3ff':0, '1f471-1f3fb-200d-2640':0, '1f471-1f3fc-200d-2640':0, '1f471-1f3fd-200d-2640':0, '1f471-1f3fe-200d-2640':0, '1f471-1f3ff-200d-2640':0, '1f471-1f3fb-200d-2642':0, '1f471-1f3fc-200d-2642':0, '1f471-1f3fd-200d-2642':0, '1f471-1f3fe-200d-2642':0, '1f471-1f3ff-200d-2642':0, '1f471-1f3fb':0, '1f471-1f3fc':0, '1f471-1f3fd':0, '1f471-1f3fe':0, '1f471-1f3ff':0, '1f472-1f3fb':0, '1f472-1f3fc':0, '1f472-1f3fd':0, '1f472-1f3fe':0, '1f472-1f3ff':0, '1f473-1f3fb-200d-2640':0, '1f473-1f3fc-200d-2640':0, '1f473-1f3fd-200d-2640':0, '1f473-1f3fe-200d-2640':0, '1f473-1f3ff-200d-2640':0, '1f473-1f3fb-200d-2642':0, '1f473-1f3fc-200d-2642':0, '1f473-1f3fd-200d-2642':0, '1f473-1f3fe-200d-2642':0, '1f473-1f3ff-200d-2642':0, '1f473-1f3fb':0, '1f473-1f3fc':0, '1f473-1f3fd':0, '1f473-1f3fe':0, '1f473-1f3ff':0, '1f474-1f3fb':0, '1f474-1f3fc':0, '1f474-1f3fd':0, '1f474-1f3fe':0, '1f474-1f3ff':0, '1f475-1f3fb':0, '1f475-1f3fc':0, '1f475-1f3fd':0, '1f475-1f3fe':0, '1f475-1f3ff':0, '1f476-1f3fb':0, '1f476-1f3fc':0, '1f476-1f3fd':0, '1f476-1f3fe':0, '1f476-1f3ff':0, '1f477-1f3fb-200d-2640':0, '1f477-1f3fc-200d-2640':0, '1f477-1f3fd-200d-2640':0, '1f477-1f3fe-200d-2640':0, '1f477-1f3ff-200d-2640':0, '1f477-1f3fb-200d-2642':0, '1f477-1f3fc-200d-2642':0, '1f477-1f3fd-200d-2642':0, '1f477-1f3fe-200d-2642':0, '1f477-1f3ff-200d-2642':0, '1f477-1f3fb':0, '1f477-1f3fc':0, '1f477-1f3fd':0, '1f477-1f3fe':0, '1f477-1f3ff':0, '1f478-1f3fb':0, '1f478-1f3fc':0, '1f478-1f3fd':0, '1f478-1f3fe':0, '1f478-1f3ff':0, '1f47c-1f3fb':0, '1f47c-1f3fc':0, '1f47c-1f3fd':0, '1f47c-1f3fe':0, '1f47c-1f3ff':0, '1f481-1f3fb-200d-2640':0, '1f481-1f3fc-200d-2640':0, '1f481-1f3fd-200d-2640':0, '1f481-1f3fe-200d-2640':0, '1f481-1f3ff-200d-2640':0, '1f481-1f3fb-200d-2642':0, '1f481-1f3fc-200d-2642':0, '1f481-1f3fd-200d-2642':0, '1f481-1f3fe-200d-2642':0, '1f481-1f3ff-200d-2642':0, '1f481-1f3fb':0, '1f481-1f3fc':0, '1f481-1f3fd':0, '1f481-1f3fe':0, '1f481-1f3ff':0, '1f482-1f3fb-200d-2640':0, '1f482-1f3fc-200d-2640':0, '1f482-1f3fd-200d-2640':0, '1f482-1f3fe-200d-2640':0, '1f482-1f3ff-200d-2640':0, '1f482-1f3fb-200d-2642':0, '1f482-1f3fc-200d-2642':0, '1f482-1f3fd-200d-2642':0, '1f482-1f3fe-200d-2642':0, '1f482-1f3ff-200d-2642':0, '1f482-1f3fb':0, '1f482-1f3fc':0, '1f482-1f3fd':0, '1f482-1f3fe':0, '1f482-1f3ff':0, '1f483-1f3fb':0, '1f483-1f3fc':0, '1f483-1f3fd':0, '1f483-1f3fe':0, '1f483-1f3ff':0, '1f485-1f3fb':0, '1f485-1f3fc':0, '1f485-1f3fd':0, '1f485-1f3fe':0, '1f485-1f3ff':0, '1f486-1f3fb-200d-2640':0, '1f486-1f3fc-200d-2640':0, '1f486-1f3fd-200d-2640':0, '1f486-1f3fe-200d-2640':0, '1f486-1f3ff-200d-2640':0, '1f486-1f3fb-200d-2642':0, '1f486-1f3fc-200d-2642':0, '1f486-1f3fd-200d-2642':0, '1f486-1f3fe-200d-2642':0, '1f486-1f3ff-200d-2642':0, '1f486-1f3fb':0, '1f486-1f3fc':0, '1f486-1f3fd':0, '1f486-1f3fe':0, '1f486-1f3ff':0, '1f487-1f3fb-200d-2640':0, '1f487-1f3fc-200d-2640':0, '1f487-1f3fd-200d-2640':0, '1f487-1f3fe-200d-2640':0, '1f487-1f3ff-200d-2640':0, '1f487-1f3fb-200d-2642':0, '1f487-1f3fc-200d-2642':0, '1f487-1f3fd-200d-2642':0, '1f487-1f3fe-200d-2642':0, '1f487-1f3ff-200d-2642':0, '1f487-1f3fb':0, '1f487-1f3fc':0, '1f487-1f3fd':0, '1f487-1f3fe':0, '1f487-1f3ff':0, '1f48f-1f3fb':0, '1f48f-1f3fc':0, '1f48f-1f3fd':0, '1f48f-1f3fe':0, '1f48f-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f491-1f3fb':0, '1f491-1f3fc':0, '1f491-1f3fd':0, '1f491-1f3fe':0, '1f491-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe':0, '1f4aa-1f3fb':0, '1f4aa-1f3fc':0, '1f4aa-1f3fd':0, '1f4aa-1f3fe':0, '1f4aa-1f3ff':0, '1f574-1f3fb':0, '1f574-1f3fc':0, '1f574-1f3fd':0, '1f574-1f3fe':0, '1f574-1f3ff':0, '1f575-1f3fb-200d-2640':0, '1f575-1f3fc-200d-2640':0, '1f575-1f3fd-200d-2640':0, '1f575-1f3fe-200d-2640':0, '1f575-1f3ff-200d-2640':0, '1f575-1f3fb-200d-2642':0, '1f575-1f3fc-200d-2642':0, '1f575-1f3fd-200d-2642':0, '1f575-1f3fe-200d-2642':0, '1f575-1f3ff-200d-2642':0, '1f575-1f3fb':0, '1f575-1f3fc':0, '1f575-1f3fd':0, '1f575-1f3fe':0, '1f575-1f3ff':0, '1f57a-1f3fb':0, '1f57a-1f3fc':0, '1f57a-1f3fd':0, '1f57a-1f3fe':0, '1f57a-1f3ff':0, '1f590-1f3fb':0, '1f590-1f3fc':0, '1f590-1f3fd':0, '1f590-1f3fe':0, '1f590-1f3ff':0, '1f595-1f3fb':0, '1f595-1f3fc':0, '1f595-1f3fd':0, '1f595-1f3fe':0, '1f595-1f3ff':0, '1f596-1f3fb':0, '1f596-1f3fc':0, '1f596-1f3fd':0, '1f596-1f3fe':0, '1f596-1f3ff':0, '1f645-1f3fb-200d-2640':0, '1f645-1f3fc-200d-2640':0, '1f645-1f3fd-200d-2640':0, '1f645-1f3fe-200d-2640':0, '1f645-1f3ff-200d-2640':0, '1f645-1f3fb-200d-2642':0, '1f645-1f3fc-200d-2642':0, '1f645-1f3fd-200d-2642':0, '1f645-1f3fe-200d-2642':0, '1f645-1f3ff-200d-2642':0, '1f645-1f3fb':0, '1f645-1f3fc':0, '1f645-1f3fd':0, '1f645-1f3fe':0, '1f645-1f3ff':0, '1f646-1f3fb-200d-2640':0, '1f646-1f3fc-200d-2640':0, '1f646-1f3fd-200d-2640':0, '1f646-1f3fe-200d-2640':0, '1f646-1f3ff-200d-2640':0, '1f646-1f3fb-200d-2642':0, '1f646-1f3fc-200d-2642':0, '1f646-1f3fd-200d-2642':0, '1f646-1f3fe-200d-2642':0, '1f646-1f3ff-200d-2642':0, '1f646-1f3fb':0, '1f646-1f3fc':0, '1f646-1f3fd':0, '1f646-1f3fe':0, '1f646-1f3ff':0, '1f647-1f3fb-200d-2640':0, '1f647-1f3fc-200d-2640':0, '1f647-1f3fd-200d-2640':0, '1f647-1f3fe-200d-2640':0, '1f647-1f3ff-200d-2640':0, '1f647-1f3fb-200d-2642':0, '1f647-1f3fc-200d-2642':0, '1f647-1f3fd-200d-2642':0, '1f647-1f3fe-200d-2642':0, '1f647-1f3ff-200d-2642':0, '1f647-1f3fb':0, '1f647-1f3fc':0, '1f647-1f3fd':0, '1f647-1f3fe':0, '1f647-1f3ff':0, '1f64b-1f3fb-200d-2640':0, '1f64b-1f3fc-200d-2640':0, '1f64b-1f3fd-200d-2640':0, '1f64b-1f3fe-200d-2640':0, '1f64b-1f3ff-200d-2640':0, '1f64b-1f3fb-200d-2642':0, '1f64b-1f3fc-200d-2642':0, '1f64b-1f3fd-200d-2642':0, '1f64b-1f3fe-200d-2642':0, '1f64b-1f3ff-200d-2642':0, '1f64b-1f3fb':0, '1f64b-1f3fc':0, '1f64b-1f3fd':0, '1f64b-1f3fe':0, '1f64b-1f3ff':0, '1f64c-1f3fb':0, '1f64c-1f3fc':0, '1f64c-1f3fd':0, '1f64c-1f3fe':0, '1f64c-1f3ff':0, '1f64d-1f3fb-200d-2640':0, '1f64d-1f3fc-200d-2640':0, '1f64d-1f3fd-200d-2640':0, '1f64d-1f3fe-200d-2640':0, '1f64d-1f3ff-200d-2640':0, '1f64d-1f3fb-200d-2642':0, '1f64d-1f3fc-200d-2642':0, '1f64d-1f3fd-200d-2642':0, '1f64d-1f3fe-200d-2642':0, '1f64d-1f3ff-200d-2642':0, '1f64d-1f3fb':0, '1f64d-1f3fc':0, '1f64d-1f3fd':0, '1f64d-1f3fe':0, '1f64d-1f3ff':0, '1f64e-1f3fb-200d-2640':0, '1f64e-1f3fc-200d-2640':0, '1f64e-1f3fd-200d-2640':0, '1f64e-1f3fe-200d-2640':0, '1f64e-1f3ff-200d-2640':0, '1f64e-1f3fb-200d-2642':0, '1f64e-1f3fc-200d-2642':0, '1f64e-1f3fd-200d-2642':0, '1f64e-1f3fe-200d-2642':0, '1f64e-1f3ff-200d-2642':0, '1f64e-1f3fb':0, '1f64e-1f3fc':0, '1f64e-1f3fd':0, '1f64e-1f3fe':0, '1f64e-1f3ff':0, '1f64f-1f3fb':0, '1f64f-1f3fc':0, '1f64f-1f3fd':0, '1f64f-1f3fe':0, '1f64f-1f3ff':0, '1f6a3-1f3fb-200d-2640':0, '1f6a3-1f3fc-200d-2640':0, '1f6a3-1f3fd-200d-2640':0, '1f6a3-1f3fe-200d-2640':0, '1f6a3-1f3ff-200d-2640':0, '1f6a3-1f3fb-200d-2642':0, '1f6a3-1f3fc-200d-2642':0, '1f6a3-1f3fd-200d-2642':0, '1f6a3-1f3fe-200d-2642':0, '1f6a3-1f3ff-200d-2642':0, '1f6a3-1f3fb':0, '1f6a3-1f3fc':0, '1f6a3-1f3fd':0, '1f6a3-1f3fe':0, '1f6a3-1f3ff':0, '1f6b4-1f3fb-200d-2640':0, '1f6b4-1f3fc-200d-2640':0, '1f6b4-1f3fd-200d-2640':0, '1f6b4-1f3fe-200d-2640':0, '1f6b4-1f3ff-200d-2640':0, '1f6b4-1f3fb-200d-2642':0, '1f6b4-1f3fc-200d-2642':0, '1f6b4-1f3fd-200d-2642':0, '1f6b4-1f3fe-200d-2642':0, '1f6b4-1f3ff-200d-2642':0, '1f6b4-1f3fb':0, '1f6b4-1f3fc':0, '1f6b4-1f3fd':0, '1f6b4-1f3fe':0, '1f6b4-1f3ff':0, '1f6b5-1f3fb-200d-2640':0, '1f6b5-1f3fc-200d-2640':0, '1f6b5-1f3fd-200d-2640':0, '1f6b5-1f3fe-200d-2640':0, '1f6b5-1f3ff-200d-2640':0, '1f6b5-1f3fb-200d-2642':0, '1f6b5-1f3fc-200d-2642':0, '1f6b5-1f3fd-200d-2642':0, '1f6b5-1f3fe-200d-2642':0, '1f6b5-1f3ff-200d-2642':0, '1f6b5-1f3fb':0, '1f6b5-1f3fc':0, '1f6b5-1f3fd':0, '1f6b5-1f3fe':0, '1f6b5-1f3ff':0, '1f6b6-1f3fb-200d-2640':0, '1f6b6-1f3fc-200d-2640':0, '1f6b6-1f3fd-200d-2640':0, '1f6b6-1f3fe-200d-2640':0, '1f6b6-1f3ff-200d-2640':0, '1f6b6-1f3fb-200d-2642':0, '1f6b6-1f3fc-200d-2642':0, '1f6b6-1f3fd-200d-2642':0, '1f6b6-1f3fe-200d-2642':0, '1f6b6-1f3ff-200d-2642':0, '1f6b6-1f3fb':0, '1f6b6-1f3fc':0, '1f6b6-1f3fd':0, '1f6b6-1f3fe':0, '1f6b6-1f3ff':0, '1f6c0-1f3fb':0, '1f6c0-1f3fc':0, '1f6c0-1f3fd':0, '1f6c0-1f3fe':0, '1f6c0-1f3ff':0, '1f6cc-1f3fb':0, '1f6cc-1f3fc':0, '1f6cc-1f3fd':0, '1f6cc-1f3fe':0, '1f6cc-1f3ff':0, '1f90c-1f3fb':0, '1f90c-1f3fc':0, '1f90c-1f3fd':0, '1f90c-1f3fe':0, '1f90c-1f3ff':0, '1f90f-1f3fb':0, '1f90f-1f3fc':0, '1f90f-1f3fd':0, '1f90f-1f3fe':0, '1f90f-1f3ff':0, '1f918-1f3fb':0, '1f918-1f3fc':0, '1f918-1f3fd':0, '1f918-1f3fe':0, '1f918-1f3ff':0, '1f919-1f3fb':0, '1f919-1f3fc':0, '1f919-1f3fd':0, '1f919-1f3fe':0, '1f919-1f3ff':0, '1f91a-1f3fb':0, '1f91a-1f3fc':0, '1f91a-1f3fd':0, '1f91a-1f3fe':0, '1f91a-1f3ff':0, '1f91b-1f3fb':0, '1f91b-1f3fc':0, '1f91b-1f3fd':0, '1f91b-1f3fe':0, '1f91b-1f3ff':0, '1f91c-1f3fb':0, '1f91c-1f3fc':0, '1f91c-1f3fd':0, '1f91c-1f3fe':0, '1f91c-1f3ff':0, '1f91d-1f3fb':0, '1f91d-1f3fc':0, '1f91d-1f3fd':0, '1f91d-1f3fe':0, '1f91d-1f3ff':0, '1f91e-1f3fb':0, '1f91e-1f3fc':0, '1f91e-1f3fd':0, '1f91e-1f3fe':0, '1f91e-1f3ff':0, '1f91f-1f3fb':0, '1f91f-1f3fc':0, '1f91f-1f3fd':0, '1f91f-1f3fe':0, '1f91f-1f3ff':0, '1f926-1f3fb-200d-2640':0, '1f926-1f3fc-200d-2640':0, '1f926-1f3fd-200d-2640':0, '1f926-1f3fe-200d-2640':0, '1f926-1f3ff-200d-2640':0, '1f926-1f3fb-200d-2642':0, '1f926-1f3fc-200d-2642':0, '1f926-1f3fd-200d-2642':0, '1f926-1f3fe-200d-2642':0, '1f926-1f3ff-200d-2642':0, '1f926-1f3fb':0, '1f926-1f3fc':0, '1f926-1f3fd':0, '1f926-1f3fe':0, '1f926-1f3ff':0, '1f930-1f3fb':0, '1f930-1f3fc':0, '1f930-1f3fd':0, '1f930-1f3fe':0, '1f930-1f3ff':0, '1f931-1f3fb':0, '1f931-1f3fc':0, '1f931-1f3fd':0, '1f931-1f3fe':0, '1f931-1f3ff':0, '1f932-1f3fb':0, '1f932-1f3fc':0, '1f932-1f3fd':0, '1f932-1f3fe':0, '1f932-1f3ff':0, '1f933-1f3fb':0, '1f933-1f3fc':0, '1f933-1f3fd':0, '1f933-1f3fe':0, '1f933-1f3ff':0, '1f934-1f3fb':0, '1f934-1f3fc':0, '1f934-1f3fd':0, '1f934-1f3fe':0, '1f934-1f3ff':0, '1f935-1f3fb-200d-2640':0, '1f935-1f3fc-200d-2640':0, '1f935-1f3fd-200d-2640':0, '1f935-1f3fe-200d-2640':0, '1f935-1f3ff-200d-2640':0, '1f935-1f3fb-200d-2642':0, '1f935-1f3fc-200d-2642':0, '1f935-1f3fd-200d-2642':0, '1f935-1f3fe-200d-2642':0, '1f935-1f3ff-200d-2642':0, '1f935-1f3fb':0, '1f935-1f3fc':0, '1f935-1f3fd':0, '1f935-1f3fe':0, '1f935-1f3ff':0, '1f936-1f3fb':0, '1f936-1f3fc':0, '1f936-1f3fd':0, '1f936-1f3fe':0, '1f936-1f3ff':0, '1f937-1f3fb-200d-2640':0, '1f937-1f3fc-200d-2640':0, '1f937-1f3fd-200d-2640':0, '1f937-1f3fe-200d-2640':0, '1f937-1f3ff-200d-2640':0, '1f937-1f3fb-200d-2642':0, '1f937-1f3fc-200d-2642':0, '1f937-1f3fd-200d-2642':0, '1f937-1f3fe-200d-2642':0, '1f937-1f3ff-200d-2642':0, '1f937-1f3fb':0, '1f937-1f3fc':0, '1f937-1f3fd':0, '1f937-1f3fe':0, '1f937-1f3ff':0, '1f938-1f3fb-200d-2640':0, '1f938-1f3fc-200d-2640':0, '1f938-1f3fd-200d-2640':0, '1f938-1f3fe-200d-2640':0, '1f938-1f3ff-200d-2640':0, '1f938-1f3fb-200d-2642':0, '1f938-1f3fc-200d-2642':0, '1f938-1f3fd-200d-2642':0, '1f938-1f3fe-200d-2642':0, '1f938-1f3ff-200d-2642':0, '1f938-1f3fb':0, '1f938-1f3fc':0, '1f938-1f3fd':0, '1f938-1f3fe':0, '1f938-1f3ff':0, '1f939-1f3fb-200d-2640':0, '1f939-1f3fc-200d-2640':0, '1f939-1f3fd-200d-2640':0, '1f939-1f3fe-200d-2640':0, '1f939-1f3ff-200d-2640':0, '1f939-1f3fb-200d-2642':0, '1f939-1f3fc-200d-2642':0, '1f939-1f3fd-200d-2642':0, '1f939-1f3fe-200d-2642':0, '1f939-1f3ff-200d-2642':0, '1f939-1f3fb':0, '1f939-1f3fc':0, '1f939-1f3fd':0, '1f939-1f3fe':0, '1f939-1f3ff':0, '1f93d-1f3fb-200d-2640':0, '1f93d-1f3fc-200d-2640':0, '1f93d-1f3fd-200d-2640':0, '1f93d-1f3fe-200d-2640':0, '1f93d-1f3ff-200d-2640':0, '1f93d-1f3fb-200d-2642':0, '1f93d-1f3fc-200d-2642':0, '1f93d-1f3fd-200d-2642':0, '1f93d-1f3fe-200d-2642':0, '1f93d-1f3ff-200d-2642':0, '1f93d-1f3fb':0, '1f93d-1f3fc':0, '1f93d-1f3fd':0, '1f93d-1f3fe':0, '1f93d-1f3ff':0, '1f93e-1f3fb-200d-2640':0, '1f93e-1f3fc-200d-2640':0, '1f93e-1f3fd-200d-2640':0, '1f93e-1f3fe-200d-2640':0, '1f93e-1f3ff-200d-2640':0, '1f93e-1f3fb-200d-2642':0, '1f93e-1f3fc-200d-2642':0, '1f93e-1f3fd-200d-2642':0, '1f93e-1f3fe-200d-2642':0, '1f93e-1f3ff-200d-2642':0, '1f93e-1f3fb':0, '1f93e-1f3fc':0, '1f93e-1f3fd':0, '1f93e-1f3fe':0, '1f93e-1f3ff':0, '1f977-1f3fb':0, '1f977-1f3fc':0, '1f977-1f3fd':0, '1f977-1f3fe':0, '1f977-1f3ff':0, '1f9b5-1f3fb':0, '1f9b5-1f3fc':0, '1f9b5-1f3fd':0, '1f9b5-1f3fe':0, '1f9b5-1f3ff':0, '1f9b6-1f3fb':0, '1f9b6-1f3fc':0, '1f9b6-1f3fd':0, '1f9b6-1f3fe':0, '1f9b6-1f3ff':0, '1f9b8-1f3fb-200d-2640':0, '1f9b8-1f3fc-200d-2640':0, '1f9b8-1f3fd-200d-2640':0, '1f9b8-1f3fe-200d-2640':0, '1f9b8-1f3ff-200d-2640':0, '1f9b8-1f3fb-200d-2642':0, '1f9b8-1f3fc-200d-2642':0, '1f9b8-1f3fd-200d-2642':0, '1f9b8-1f3fe-200d-2642':0, '1f9b8-1f3ff-200d-2642':0, '1f9b8-1f3fb':0, '1f9b8-1f3fc':0, '1f9b8-1f3fd':0, '1f9b8-1f3fe':0, '1f9b8-1f3ff':0, '1f9b9-1f3fb-200d-2640':0, '1f9b9-1f3fc-200d-2640':0, '1f9b9-1f3fd-200d-2640':0, '1f9b9-1f3fe-200d-2640':0, '1f9b9-1f3ff-200d-2640':0, '1f9b9-1f3fb-200d-2642':0, '1f9b9-1f3fc-200d-2642':0, '1f9b9-1f3fd-200d-2642':0, '1f9b9-1f3fe-200d-2642':0, '1f9b9-1f3ff-200d-2642':0, '1f9b9-1f3fb':0, '1f9b9-1f3fc':0, '1f9b9-1f3fd':0, '1f9b9-1f3fe':0, '1f9b9-1f3ff':0, '1f9bb-1f3fb':0, '1f9bb-1f3fc':0, '1f9bb-1f3fd':0, '1f9bb-1f3fe':0, '1f9bb-1f3ff':0, '1f9cd-1f3fb-200d-2640':0, '1f9cd-1f3fc-200d-2640':0, '1f9cd-1f3fd-200d-2640':0, '1f9cd-1f3fe-200d-2640':0, '1f9cd-1f3ff-200d-2640':0, '1f9cd-1f3fb-200d-2642':0, '1f9cd-1f3fc-200d-2642':0, '1f9cd-1f3fd-200d-2642':0, '1f9cd-1f3fe-200d-2642':0, '1f9cd-1f3ff-200d-2642':0, '1f9cd-1f3fb':0, '1f9cd-1f3fc':0, '1f9cd-1f3fd':0, '1f9cd-1f3fe':0, '1f9cd-1f3ff':0, '1f9ce-1f3fb-200d-2640':0, '1f9ce-1f3fc-200d-2640':0, '1f9ce-1f3fd-200d-2640':0, '1f9ce-1f3fe-200d-2640':0, '1f9ce-1f3ff-200d-2640':0, '1f9ce-1f3fb-200d-2642':0, '1f9ce-1f3fc-200d-2642':0, '1f9ce-1f3fd-200d-2642':0, '1f9ce-1f3fe-200d-2642':0, '1f9ce-1f3ff-200d-2642':0, '1f9ce-1f3fb':0, '1f9ce-1f3fc':0, '1f9ce-1f3fd':0, '1f9ce-1f3fe':0, '1f9ce-1f3ff':0, '1f9cf-1f3fb-200d-2640':0, '1f9cf-1f3fc-200d-2640':0, '1f9cf-1f3fd-200d-2640':0, '1f9cf-1f3fe-200d-2640':0, '1f9cf-1f3ff-200d-2640':0, '1f9cf-1f3fb-200d-2642':0, '1f9cf-1f3fc-200d-2642':0, '1f9cf-1f3fd-200d-2642':0, '1f9cf-1f3fe-200d-2642':0, '1f9cf-1f3ff-200d-2642':0, '1f9cf-1f3fb':0, '1f9cf-1f3fc':0, '1f9cf-1f3fd':0, '1f9cf-1f3fe':0, '1f9cf-1f3ff':0, '1f9d1-1f3fb-200d-1f33e':0, '1f9d1-1f3fc-200d-1f33e':0, '1f9d1-1f3fd-200d-1f33e':0, '1f9d1-1f3fe-200d-1f33e':0, '1f9d1-1f3ff-200d-1f33e':0, '1f9d1-1f3fb-200d-1f373':0, '1f9d1-1f3fc-200d-1f373':0, '1f9d1-1f3fd-200d-1f373':0, '1f9d1-1f3fe-200d-1f373':0, '1f9d1-1f3ff-200d-1f373':0, '1f9d1-1f3fb-200d-1f37c':0, '1f9d1-1f3fc-200d-1f37c':0, '1f9d1-1f3fd-200d-1f37c':0, '1f9d1-1f3fe-200d-1f37c':0, '1f9d1-1f3ff-200d-1f37c':0, '1f9d1-1f3fb-200d-1f384':0, '1f9d1-1f3fc-200d-1f384':0, '1f9d1-1f3fd-200d-1f384':0, '1f9d1-1f3fe-200d-1f384':0, '1f9d1-1f3ff-200d-1f384':0, '1f9d1-1f3fb-200d-1f393':0, '1f9d1-1f3fc-200d-1f393':0, '1f9d1-1f3fd-200d-1f393':0, '1f9d1-1f3fe-200d-1f393':0, '1f9d1-1f3ff-200d-1f393':0, '1f9d1-1f3fb-200d-1f3a4':0, '1f9d1-1f3fc-200d-1f3a4':0, '1f9d1-1f3fd-200d-1f3a4':0, '1f9d1-1f3fe-200d-1f3a4':0, '1f9d1-1f3ff-200d-1f3a4':0, '1f9d1-1f3fb-200d-1f3a8':0, '1f9d1-1f3fc-200d-1f3a8':0, '1f9d1-1f3fd-200d-1f3a8':0, '1f9d1-1f3fe-200d-1f3a8':0, '1f9d1-1f3ff-200d-1f3a8':0, '1f9d1-1f3fb-200d-1f3eb':0, '1f9d1-1f3fc-200d-1f3eb':0, '1f9d1-1f3fd-200d-1f3eb':0, '1f9d1-1f3fe-200d-1f3eb':0, '1f9d1-1f3ff-200d-1f3eb':0, '1f9d1-1f3fb-200d-1f3ed':0, '1f9d1-1f3fc-200d-1f3ed':0, '1f9d1-1f3fd-200d-1f3ed':0, '1f9d1-1f3fe-200d-1f3ed':0, '1f9d1-1f3ff-200d-1f3ed':0, '1f9d1-1f3fb-200d-1f4bb':0, '1f9d1-1f3fc-200d-1f4bb':0, '1f9d1-1f3fd-200d-1f4bb':0, '1f9d1-1f3fe-200d-1f4bb':0, '1f9d1-1f3ff-200d-1f4bb':0, '1f9d1-1f3fb-200d-1f4bc':0, '1f9d1-1f3fc-200d-1f4bc':0, '1f9d1-1f3fd-200d-1f4bc':0, '1f9d1-1f3fe-200d-1f4bc':0, '1f9d1-1f3ff-200d-1f4bc':0, '1f9d1-1f3fb-200d-1f527':0, '1f9d1-1f3fc-200d-1f527':0, '1f9d1-1f3fd-200d-1f527':0, '1f9d1-1f3fe-200d-1f527':0, '1f9d1-1f3ff-200d-1f527':0, '1f9d1-1f3fb-200d-1f52c':0, '1f9d1-1f3fc-200d-1f52c':0, '1f9d1-1f3fd-200d-1f52c':0, '1f9d1-1f3fe-200d-1f52c':0, '1f9d1-1f3ff-200d-1f52c':0, '1f9d1-1f3fb-200d-1f680':0, '1f9d1-1f3fc-200d-1f680':0, '1f9d1-1f3fd-200d-1f680':0, '1f9d1-1f3fe-200d-1f680':0, '1f9d1-1f3ff-200d-1f680':0, '1f9d1-1f3fb-200d-1f692':0, '1f9d1-1f3fc-200d-1f692':0, '1f9d1-1f3fd-200d-1f692':0, '1f9d1-1f3fe-200d-1f692':0, '1f9d1-1f3ff-200d-1f692':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fb-200d-1f9af':0, '1f9d1-1f3fc-200d-1f9af':0, '1f9d1-1f3fd-200d-1f9af':0, '1f9d1-1f3fe-200d-1f9af':0, '1f9d1-1f3ff-200d-1f9af':0, '1f9d1-1f3fb-200d-1f9b0':0, '1f9d1-1f3fc-200d-1f9b0':0, '1f9d1-1f3fd-200d-1f9b0':0, '1f9d1-1f3fe-200d-1f9b0':0, '1f9d1-1f3ff-200d-1f9b0':0, '1f9d1-1f3fb-200d-1f9b1':0, '1f9d1-1f3fc-200d-1f9b1':0, '1f9d1-1f3fd-200d-1f9b1':0, '1f9d1-1f3fe-200d-1f9b1':0, '1f9d1-1f3ff-200d-1f9b1':0, '1f9d1-1f3fb-200d-1f9b2':0, '1f9d1-1f3fc-200d-1f9b2':0, '1f9d1-1f3fd-200d-1f9b2':0, '1f9d1-1f3fe-200d-1f9b2':0, '1f9d1-1f3ff-200d-1f9b2':0, '1f9d1-1f3fb-200d-1f9b3':0, '1f9d1-1f3fc-200d-1f9b3':0, '1f9d1-1f3fd-200d-1f9b3':0, '1f9d1-1f3fe-200d-1f9b3':0, '1f9d1-1f3ff-200d-1f9b3':0, '1f9d1-1f3fb-200d-1f9bc':0, '1f9d1-1f3fc-200d-1f9bc':0, '1f9d1-1f3fd-200d-1f9bc':0, '1f9d1-1f3fe-200d-1f9bc':0, '1f9d1-1f3ff-200d-1f9bc':0, '1f9d1-1f3fb-200d-1f9bd':0, '1f9d1-1f3fc-200d-1f9bd':0, '1f9d1-1f3fd-200d-1f9bd':0, '1f9d1-1f3fe-200d-1f9bd':0, '1f9d1-1f3ff-200d-1f9bd':0, '1f9d1-1f3fb-200d-2695':0, '1f9d1-1f3fc-200d-2695':0, '1f9d1-1f3fd-200d-2695':0, '1f9d1-1f3fe-200d-2695':0, '1f9d1-1f3ff-200d-2695':0, '1f9d1-1f3fb-200d-2696':0, '1f9d1-1f3fc-200d-2696':0, '1f9d1-1f3fd-200d-2696':0, '1f9d1-1f3fe-200d-2696':0, '1f9d1-1f3ff-200d-2696':0, '1f9d1-1f3fb-200d-2708':0, '1f9d1-1f3fc-200d-2708':0, '1f9d1-1f3fd-200d-2708':0, '1f9d1-1f3fe-200d-2708':0, '1f9d1-1f3ff-200d-2708':0, '1f9d1-1f3fb':0, '1f9d1-1f3fc':0, '1f9d1-1f3fd':0, '1f9d1-1f3fe':0, '1f9d1-1f3ff':0, '1f9d2-1f3fb':0, '1f9d2-1f3fc':0, '1f9d2-1f3fd':0, '1f9d2-1f3fe':0, '1f9d2-1f3ff':0, '1f9d3-1f3fb':0, '1f9d3-1f3fc':0, '1f9d3-1f3fd':0, '1f9d3-1f3fe':0, '1f9d3-1f3ff':0, '1f9d4-1f3fb-200d-2640':0, '1f9d4-1f3fc-200d-2640':0, '1f9d4-1f3fd-200d-2640':0, '1f9d4-1f3fe-200d-2640':0, '1f9d4-1f3ff-200d-2640':0, '1f9d4-1f3fb-200d-2642':0, '1f9d4-1f3fc-200d-2642':0, '1f9d4-1f3fd-200d-2642':0, '1f9d4-1f3fe-200d-2642':0, '1f9d4-1f3ff-200d-2642':0, '1f9d4-1f3fb':0, '1f9d4-1f3fc':0, '1f9d4-1f3fd':0, '1f9d4-1f3fe':0, '1f9d4-1f3ff':0, '1f9d5-1f3fb':0, '1f9d5-1f3fc':0, '1f9d5-1f3fd':0, '1f9d5-1f3fe':0, '1f9d5-1f3ff':0, '1f9d6-1f3fb-200d-2640':0, '1f9d6-1f3fc-200d-2640':0, '1f9d6-1f3fd-200d-2640':0, '1f9d6-1f3fe-200d-2640':0, '1f9d6-1f3ff-200d-2640':0, '1f9d6-1f3fb-200d-2642':0, '1f9d6-1f3fc-200d-2642':0, '1f9d6-1f3fd-200d-2642':0, '1f9d6-1f3fe-200d-2642':0, '1f9d6-1f3ff-200d-2642':0, '1f9d6-1f3fb':0, '1f9d6-1f3fc':0, '1f9d6-1f3fd':0, '1f9d6-1f3fe':0, '1f9d6-1f3ff':0, '1f9d7-1f3fb-200d-2640':0, '1f9d7-1f3fc-200d-2640':0, '1f9d7-1f3fd-200d-2640':0, '1f9d7-1f3fe-200d-2640':0, '1f9d7-1f3ff-200d-2640':0, '1f9d7-1f3fb-200d-2642':0, '1f9d7-1f3fc-200d-2642':0, '1f9d7-1f3fd-200d-2642':0, '1f9d7-1f3fe-200d-2642':0, '1f9d7-1f3ff-200d-2642':0, '1f9d7-1f3fb':0, '1f9d7-1f3fc':0, '1f9d7-1f3fd':0, '1f9d7-1f3fe':0, '1f9d7-1f3ff':0, '1f9d8-1f3fb-200d-2640':0, '1f9d8-1f3fc-200d-2640':0, '1f9d8-1f3fd-200d-2640':0, '1f9d8-1f3fe-200d-2640':0, '1f9d8-1f3ff-200d-2640':0, '1f9d8-1f3fb-200d-2642':0, '1f9d8-1f3fc-200d-2642':0, '1f9d8-1f3fd-200d-2642':0, '1f9d8-1f3fe-200d-2642':0, '1f9d8-1f3ff-200d-2642':0, '1f9d8-1f3fb':0, '1f9d8-1f3fc':0, '1f9d8-1f3fd':0, '1f9d8-1f3fe':0, '1f9d8-1f3ff':0, '1f9d9-1f3fb-200d-2640':0, '1f9d9-1f3fc-200d-2640':0, '1f9d9-1f3fd-200d-2640':0, '1f9d9-1f3fe-200d-2640':0, '1f9d9-1f3ff-200d-2640':0, '1f9d9-1f3fb-200d-2642':0, '1f9d9-1f3fc-200d-2642':0, '1f9d9-1f3fd-200d-2642':0, '1f9d9-1f3fe-200d-2642':0, '1f9d9-1f3ff-200d-2642':0, '1f9d9-1f3fb':0, '1f9d9-1f3fc':0, '1f9d9-1f3fd':0, '1f9d9-1f3fe':0, '1f9d9-1f3ff':0, '1f9da-1f3fb-200d-2640':0, '1f9da-1f3fc-200d-2640':0, '1f9da-1f3fd-200d-2640':0, '1f9da-1f3fe-200d-2640':0, '1f9da-1f3ff-200d-2640':0, '1f9da-1f3fb-200d-2642':0, '1f9da-1f3fc-200d-2642':0, '1f9da-1f3fd-200d-2642':0, '1f9da-1f3fe-200d-2642':0, '1f9da-1f3ff-200d-2642':0, '1f9da-1f3fb':0, '1f9da-1f3fc':0, '1f9da-1f3fd':0, '1f9da-1f3fe':0, '1f9da-1f3ff':0, '1f9db-1f3fb-200d-2640':0, '1f9db-1f3fc-200d-2640':0, '1f9db-1f3fd-200d-2640':0, '1f9db-1f3fe-200d-2640':0, '1f9db-1f3ff-200d-2640':0, '1f9db-1f3fb-200d-2642':0, '1f9db-1f3fc-200d-2642':0, '1f9db-1f3fd-200d-2642':0, '1f9db-1f3fe-200d-2642':0, '1f9db-1f3ff-200d-2642':0, '1f9db-1f3fb':0, '1f9db-1f3fc':0, '1f9db-1f3fd':0, '1f9db-1f3fe':0, '1f9db-1f3ff':0, '1f9dc-1f3fb-200d-2640':0, '1f9dc-1f3fc-200d-2640':0, '1f9dc-1f3fd-200d-2640':0, '1f9dc-1f3fe-200d-2640':0, '1f9dc-1f3ff-200d-2640':0, '1f9dc-1f3fb-200d-2642':0, '1f9dc-1f3fc-200d-2642':0, '1f9dc-1f3fd-200d-2642':0, '1f9dc-1f3fe-200d-2642':0, '1f9dc-1f3ff-200d-2642':0, '1f9dc-1f3fb':0, '1f9dc-1f3fc':0, '1f9dc-1f3fd':0, '1f9dc-1f3fe':0, '1f9dc-1f3ff':0, '1f9dd-1f3fb-200d-2640':0, '1f9dd-1f3fc-200d-2640':0, '1f9dd-1f3fd-200d-2640':0, '1f9dd-1f3fe-200d-2640':0, '1f9dd-1f3ff-200d-2640':0, '1f9dd-1f3fb-200d-2642':0, '1f9dd-1f3fc-200d-2642':0, '1f9dd-1f3fd-200d-2642':0, '1f9dd-1f3fe-200d-2642':0, '1f9dd-1f3ff-200d-2642':0, '1f9dd-1f3fb':0, '1f9dd-1f3fc':0, '1f9dd-1f3fd':0, '1f9dd-1f3fe':0, '1f9dd-1f3ff':0, '261d-1f3fb':0, '261d-1f3fc':0, '261d-1f3fd':0, '261d-1f3fe':0, '261d-1f3ff':0, '26f9-1f3fb-200d-2640':0, '26f9-1f3fc-200d-2640':0, '26f9-1f3fd-200d-2640':0, '26f9-1f3fe-200d-2640':0, '26f9-1f3ff-200d-2640':0, '26f9-1f3fb-200d-2642':0, '26f9-1f3fc-200d-2642':0, '26f9-1f3fd-200d-2642':0, '26f9-1f3fe-200d-2642':0, '26f9-1f3ff-200d-2642':0, '26f9-1f3fb':0, '26f9-1f3fc':0, '26f9-1f3fd':0, '26f9-1f3fe':0, '26f9-1f3ff':0, '270a-1f3fb':0, '270a-1f3fc':0, '270a-1f3fd':0, '270a-1f3fe':0, '270a-1f3ff':0, '270b-1f3fb':0, '270b-1f3fc':0, '270b-1f3fd':0, '270b-1f3fe':0, '270b-1f3ff':0, '270c-1f3fb':0, '270c-1f3fc':0, '270c-1f3fd':0, '270c-1f3fe':0, '270c-1f3ff':0, '270d-1f3fb':0, '270d-1f3fc':0, '270d-1f3fd':0, '270d-1f3fe':0, '270d-1f3ff':0}};\n\nconst Emoji: {[emoji: string]: number} = EmojiVersions[''];\nfor(const version in EmojiVersions) {\n if(version) {\n Object.assign(Emoji, EmojiVersions[version as EMOJI_VERSION]);\n }\n}\n\nexport default Emoji;\n\n/* Emoji[\"00a9-fe0f\"] = 6362;\nEmoji[\"00ae-fe0f\"] = 6363;\nEmoji[\"2122-fe0f\"] = 6364; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport const FontFamily = 'Roboto, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen-Sans, Ubuntu, Cantarell, \"Helvetica Neue\", sans-serif';\nexport const FontSize = '16px';\nexport const FontWeight = '400';\n","const IS_IMAGE_BITMAP_SUPPORTED = typeof(ImageBitmap) !== 'undefined';\n\nexport default IS_IMAGE_BITMAP_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's animation.ts\n\nimport {fastRaf} from './schedulers';\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\n\ninterface AnimationInstance {\n isCancelled: boolean;\n deferred: CancellablePromise\n}\n\ntype AnimationInstanceKey = any;\nconst instances: Map = new Map();\n\nexport function createAnimationInstance(key: AnimationInstanceKey) {\n cancelAnimationByKey(key);\n\n const instance: AnimationInstance = {\n isCancelled: false,\n deferred: deferredPromise()\n };\n\n instances.set(key, instance);\n instance.deferred.then(() => {\n if(getAnimationInstance(key) === instance) {\n instances.delete(key);\n }\n });\n\n return instance;\n}\n\nexport function getAnimationInstance(key: AnimationInstanceKey) {\n return instances.get(key);\n}\n\nexport function cancelAnimationByKey(key: AnimationInstanceKey) {\n const instance = getAnimationInstance(key);\n if(instance) {\n instance.isCancelled = true;\n instance.deferred.resolve();\n }\n}\n\nexport function animateSingle(tick: Function, key: AnimationInstanceKey, instance?: AnimationInstance) {\n if(!instance) {\n instance = createAnimationInstance(key);\n }\n\n fastRaf(() => {\n if(instance.isCancelled) {\n return;\n }\n\n if(tick()) {\n animateSingle(tick, key, instance);\n } else {\n instance.deferred.resolve();\n }\n });\n\n return instance.deferred;\n}\n\nexport function animate(tick: Function) {\n fastRaf(() => {\n if(tick()) {\n animate(tick);\n }\n });\n}\n","type K = boolean;\nexport default async function filterAsync(arr: T[], callback: (item: T, idx: number, arr: T[]) => Promise | K) {\n const promises = arr.map(async(item, idx, arr) => {\n if(await callback(item, idx, arr)) {\n return item;\n }\n });\n\n return (await Promise.all(promises)).filter(Boolean);\n}\n","export default function findAndSpliceAll(array: Array, verify: (value: T, index: number, arr: typeof array) => boolean) {\n const out: typeof array = [];\n let idx = -1;\n while((idx = array.findIndex(verify)) !== -1) {\n out.push(array.splice(idx, 1)[0]);\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst ASSETS_PATH = 'assets/audio/';\n\nexport default class AudioAssetPlayer {\n private audio: HTMLAudioElement;\n private tempId: number;\n private assetName: AssetName;\n\n constructor(private assets: AssetName[]) {\n this.tempId = 0;\n }\n\n public playSound(name: AssetName, loop = false) {\n ++this.tempId;\n this.assetName = name;\n\n try {\n const audio = this.createAudio();\n audio.autoplay = true;\n audio.src = ASSETS_PATH + name;\n audio.loop = loop;\n audio.play();\n } catch(e) {\n console.error('playSound', name, e);\n }\n }\n\n public playSoundIfDifferent(name: AssetName, loop?: boolean) {\n if(this.assetName !== name) {\n this.playSound(name, loop);\n }\n }\n\n public createAudio() {\n let {audio} = this;\n if(audio) {\n return audio;\n }\n\n audio = this.audio = new Audio();\n audio.play();\n return audio;\n }\n\n public stopSound() {\n if(!this.audio) {\n return;\n }\n\n this.audio.pause();\n }\n\n public cancelDelayedPlay() {\n ++this.tempId;\n }\n\n public playSoundWithTimeout(name: AssetName, loop: boolean, timeout: number) {\n // timeout = 0;\n const tempId = ++this.tempId;\n setTimeout(() => {\n if(this.tempId !== tempId) {\n return;\n }\n\n this.playSound(name, loop);\n }, timeout);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsDataURL(blob: Blob) {\n return readBlobAs(blob, 'readAsDataURL');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\nimport {getHeavyAnimationPromise} from '../hooks/useHeavyAnimationCheck';\nimport {fastRaf} from './schedulers';\nimport {ArgumentTypes} from '../types';\n\ntype HeavyQueue> = {\n items: ArgumentTypes[],\n process: (...args: any[]) => ReturnType,\n context: any,\n promise?: CancellablePromise[]>\n};\nconst heavyQueue: HeavyQueue[] = [];\nlet processingQueue = false;\n\nexport default function addHeavyTask>(queue: T, method: 'push' | 'unshift' = 'push') {\n if(!queue.items.length) {\n return Promise.resolve([]) as typeof promise;\n }\n\n const promise = queue.promise = deferredPromise();\n heavyQueue[method](queue);\n processHeavyQueue();\n\n return promise;\n}\n\nfunction processHeavyQueue() {\n if(!processingQueue) {\n const queue = heavyQueue.shift();\n timedChunk(queue).finally(() => {\n processingQueue = false;\n if(heavyQueue.length) {\n processHeavyQueue();\n }\n });\n }\n}\n\nfunction timedChunk>(queue: HeavyQueue) {\n if(!queue.items.length) {\n queue.promise.resolve([] as any);\n return Promise.resolve([]);\n }\n\n const todo = queue.items.slice();\n const results: ReturnType[] = [];\n\n return new Promise((resolve, reject) => {\n const f = async() => {\n const start = performance.now();\n\n do {\n await getHeavyAnimationPromise();\n const possiblePromise = queue.process.apply(queue.context, todo.shift());\n let realResult: typeof results[0];\n // @ts-ignore\n if(possiblePromise instanceof Promise) {\n try {\n realResult = await possiblePromise;\n } catch(err) {\n reject(err);\n return;\n }\n } else {\n realResult = possiblePromise;\n }\n\n results.push(realResult);\n } while(todo.length > 0 && (performance.now() - start) < 6);\n\n if(todo.length > 0) {\n fastRaf(f);\n // setTimeout(f, 25);\n } else {\n resolve(results);\n }\n };\n\n fastRaf(f);\n // setTimeout(f, 25);\n }).then(queue.promise.resolve, queue.promise.reject);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type fastBlur from '../vendor/fastBlur';\nimport addHeavyTask from './heavyQueue';\nimport IS_CANVAS_FILTER_SUPPORTED from '../environment/canvasFilterSupport';\n\nconst RADIUS = 2;\nconst ITERATIONS = 2;\n\nlet requireBlurPromise: Promise;\nlet fastBlurFunc: typeof fastBlur;\nif(!IS_CANVAS_FILTER_SUPPORTED) {\n requireBlurPromise = import('../vendor/fastBlur').then((m) => {\n fastBlurFunc = m.default;\n });\n} else {\n requireBlurPromise = Promise.resolve();\n}\n\nfunction processBlurNext(\n img: HTMLImageElement,\n radius: number,\n iterations: number,\n canvas: HTMLCanvasElement = document.createElement('canvas')\n) {\n canvas.width = img.width;\n canvas.height = img.height;\n\n const ctx = canvas.getContext('2d', {alpha: false});\n if(IS_CANVAS_FILTER_SUPPORTED) {\n ctx.filter = `blur(${radius}px)`;\n ctx.drawImage(img, -radius * 2, -radius * 2, canvas.width + radius * 4, canvas.height + radius * 4);\n } else {\n ctx.drawImage(img, 0, 0);\n fastBlurFunc(ctx, 0, 0, canvas.width, canvas.height, radius, iterations);\n }\n\n return canvas;\n}\n\ntype CacheValue = {canvas: HTMLCanvasElement, promise: Promise};\nconst cache: Map = new Map();\nconst CACHE_SIZE = 150;\n\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\n if(!dataUri) {\n throw 'no dataUri for blur: ' + dataUri;\n }\n\n if(cache.size > CACHE_SIZE) {\n cache.clear();\n }\n\n const canvas = document.createElement('canvas');\n canvas.className = 'canvas-thumbnail';\n\n let cached = cache.get(dataUri);\n if(!cached) {\n const promise: CacheValue['promise'] = new Promise((resolve) => {\n // return resolve(dataUri);\n requireBlurPromise.then(() => {\n const img = new Image();\n img.onload = () => {\n // if(IS_CANVAS_FILTER_SUPPORTED) {\n // resolve(processBlurNext(img, radius, iterations));\n // } else {\n const promise = addHeavyTask({\n items: [[img, radius, iterations, canvas]],\n context: null,\n process: processBlurNext\n }, 'unshift');\n\n promise.then(() => {\n resolve();\n });\n // }\n };\n img.src = dataUri;\n });\n });\n\n cache.set(dataUri, cached = {\n canvas,\n promise\n });\n } else {\n canvas.width = cached.canvas.width;\n canvas.height = cached.canvas.height;\n cached.promise.then(() => {\n canvas.getContext('2d').drawImage(cached.canvas, 0, 0, canvas.width, canvas.height);\n });\n }\n\n return {\n ...cached,\n canvas\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport bytesFromHex from './bytesFromHex';\nimport bytesToDataURL from './bytesToDataURL';\nimport convertToUint8Array from './convertToUint8Array';\n\nconst JPEG_HEADER_HEX = 'ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00';\n\nconst JPEG_HEADER = bytesFromHex(JPEG_HEADER_HEX);\nconst JPEG_TAIL = bytesFromHex('ffd9');\n\nexport function getPreviewBytesFromURL(url: string) {\n const needle = 'base64,';\n const sliced = url.slice(url.indexOf(needle) + needle.length);\n const jpegBytes = [...atob(sliced)].map((char) => char.charCodeAt(0));\n\n return new Uint8Array(jpegBytes);\n // console.log('getPreviewBytesFromURL', bytesToHex(jpegBytes));\n\n // const n = JPEG_HEADER_HEX.slice(-10);\n // const one = jpegBytes[164];\n // const two = jpegBytes[166];\n\n // const body = jpegBytes.slice(bytesToHex(jpegBytes).indexOf(n) / 2 + n.length / 2/* JPEG_HEADER.length */, jpegBytes.length - JPEG_TAIL.length);\n // const original = new Uint8Array([\n // 0xFF,\n // one,\n // two,\n // ...body\n // ]);\n\n // console.log(bytesToHex(body));\n\n // return original;\n}\n\nexport default function getPreviewURLFromBytes(bytes: Uint8Array | number[], isSticker = false) {\n let arr: Uint8Array;\n if(!isSticker && bytes[0] === 0x1) {\n arr = new Uint8Array(JPEG_HEADER.concat(Array.from(bytes.slice(3)), JPEG_TAIL));\n arr[164] = bytes[1];\n arr[166] = bytes[2];\n } else {\n arr = convertToUint8Array(bytes);\n }\n\n let mimeType: string;\n if(isSticker) {\n mimeType = IS_SAFARI ? 'image/png' : 'image/webp';\n } else {\n mimeType = 'image/jpeg';\n }\n\n const dataURL = bytesToDataURL(arr, mimeType);\n return dataURL;\n}\n","export default function bytesToDataURL(bytes: Uint8Array, mimeType: string = 'image/jpeg') {\n return `data:${mimeType};base64,${btoa(String.fromCharCode(...bytes))}`;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {makeMediaSize} from './mediaSize';\n\nexport default function calcImageInBox(imageW: number, imageH: number, boxW: number, boxH: number, noZoom = true) {\n if(imageW < boxW && imageH < boxH && noZoom) {\n return makeMediaSize(imageW, imageH);\n }\n\n let boxedImageW = boxW;\n let boxedImageH = boxH;\n\n if((imageW / imageH) > (boxW / boxH)) {\n boxedImageH = (imageH * boxW / imageW) | 0;\n } else {\n boxedImageW = (imageW * boxH / imageH) | 0;\n if(boxedImageW > boxW) {\n boxedImageH = (boxedImageH * boxW / boxedImageW) | 0;\n boxedImageW = boxW;\n }\n }\n\n // if (Config.Navigator.retina) {\n // imageW = Math.floor(imageW / 2)\n // imageH = Math.floor(imageH / 2)\n // }\n\n if(noZoom && boxedImageW >= imageW && boxedImageH >= imageH) {\n boxedImageW = imageW;\n boxedImageH = imageH;\n }\n\n return makeMediaSize(boxedImageW, boxedImageH);\n}\n\nMOUNT_CLASS_TO.calcImageInBox = calcImageInBox;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { MOUNT_CLASS_TO } from \"../../config/debug\";\n\nlet context: CanvasRenderingContext2D;\n/**\n * Get the text width\n * @param {string} text\n * @param {string} font\n */\nexport default function getTextWidth(text: string, font: string) {\n // const perf = performance.now();\n if(!context) {\n const canvas = document.createElement('canvas');\n context = canvas.getContext('2d', {alpha: false});\n }\n\n if(context.font !== font) {\n context.font = font;\n }\n\n // context.font = font;\n const metrics = context.measureText(text);\n // console.log('getTextWidth perf:', performance.now() - perf);\n return metrics.width;\n // return Math.round(metrics.width);\n}\n\n// MOUNT_CLASS_TO && (MOUNT_CLASS_TO.getTextWidth = getTextWidth);\n","import type {MediaSize} from '../mediaSize';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\n\nexport default function scaleMediaElement(options: T): Promise {\n return new Promise(async(resolve) => {\n const canvas = document.createElement('canvas');\n const size = options.size ?? options.mediaSize.aspectFitted(options.boxSize);\n const dpr = window.devicePixelRatio && 1;\n canvas.width = size.width * dpr;\n canvas.height = size.height * dpr;\n const ctx = canvas.getContext('2d');\n\n let source: CanvasImageSource;\n if(IS_IMAGE_BITMAP_SUPPORTED) {\n source = await createImageBitmap(options.media, {resizeWidth: size.width, resizeHeight: size.height});\n } else {\n source = options.media;\n }\n\n ctx.drawImage(source, 0, 0, canvas.width, canvas.height);\n\n if(IS_IMAGE_BITMAP_SUPPORTED) {\n (source as ImageBitmap)?.close();\n }\n\n const mimeType = options.mimeType ?? 'image/jpeg';\n const quality = options.quality ?? 1;\n if(options.toDataURL) {\n const url = canvas.toDataURL(mimeType, quality);\n resolve({url, size} as any);\n } else {\n canvas.toBlob((blob) => {\n resolve({blob, size} as any);\n }, mimeType, quality);\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport LatinizeMap from '../config/latinizeMap';\n\nexport const badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nconst C2L: {[k: string]: string} = {\n 'й': 'q',\n 'ц': 'w',\n 'у': 'e',\n 'к': 'r',\n 'е': 't',\n 'н': 'y',\n 'г': 'u',\n 'ш': 'i',\n 'щ': 'o',\n 'з': 'p',\n 'х': '[',\n 'ъ': ']',\n 'ф': 'a',\n 'ы': 's',\n 'в': 'd',\n 'а': 'f',\n 'п': 'g',\n 'р': 'h',\n 'о': 'j',\n 'л': 'k',\n 'д': 'l',\n 'ж': ';',\n 'э': '\\'',\n 'я': 'z',\n 'ч': 'x',\n 'с': 'c',\n 'м': 'v',\n 'и': 'b',\n 'т': 'n',\n 'ь': 'm',\n 'б': ',',\n 'ю': '.',\n '.': '/'\n};\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function fixCyrillic(text: string) {\n return text.toLowerCase().replace(/[\\wа-я]/g, (ch) => {\n const latinizeCh = C2L[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = LatinizeMap[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n return processSearchText(text, {\n clearBadChars: true,\n latinize,\n ignoreCase: true\n });\n}\n\nexport type ProcessSearchTextOptions = Partial<{\n clearBadChars: boolean,\n latinize: boolean,\n ignoreCase: boolean,\n includeTag: boolean\n}>;\n\nexport function processSearchText(text: string, options: ProcessSearchTextOptions = {}) {\n const hasTag = options.includeTag && text.charAt(0) === '%';\n const originalText = text;\n if(options.clearBadChars) text = clearBadCharsAndTrim(text);\n if(options.latinize) text = latinizeString(text);\n if(options.ignoreCase) text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n if(options.latinize) text += '\\x01' + fixCyrillic(originalText);\n return text;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// https://stackoverflow.com/a/30810322\nfunction fallbackCopyTextToClipboard(text: string) {\n var textArea = document.createElement('textarea');\n textArea.value = text;\n\n // Avoid scrolling to bottom\n textArea.style.top = '0';\n textArea.style.left = '0';\n textArea.style.position = 'fixed';\n\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n\n try {\n document.execCommand('copy');\n // const successful = document.execCommand('copy');\n // const msg = successful ? 'successful' : 'unsuccessful';\n // console.log('Fallback: Copying text command was ' + msg);\n } catch(err) {\n // console.error('Fallback: Oops, unable to copy', err);\n }\n\n document.body.removeChild(textArea);\n}\n\nexport function copyTextToClipboard(text: string) {\n if(!navigator.clipboard) {\n fallbackCopyTextToClipboard(text);\n return;\n }\n\n navigator.clipboard.writeText(text).catch((err) => {\n console.error('clipboard error', err);\n fallbackCopyTextToClipboard(text);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport mediaSizes from './mediaSizes';\nimport OverlayClickHandler from './overlayClickHandler';\n\nclass ContextMenuController extends OverlayClickHandler {\n constructor() {\n super('menu', true);\n\n mediaSizes.addEventListener('resize', () => {\n if(this.element) {\n this.close();\n }\n\n /* if(openedMenu && (openedMenu.style.top || openedMenu.style.left)) {\n const rect = openedMenu.getBoundingClientRect();\n const {innerWidth, innerHeight} = window;\n\n console.log(innerWidth, innerHeight, rect);\n } */\n });\n }\n\n public isOpened() {\n return !!this.element;\n }\n\n private onMouseMove = (e: MouseEvent) => {\n const rect = this.element.getBoundingClientRect();\n const {clientX, clientY} = e;\n\n const diffX = clientX >= rect.right ? clientX - rect.right : rect.left - clientX;\n const diffY = clientY >= rect.bottom ? clientY - rect.bottom : rect.top - clientY;\n\n if(diffX >= 100 || diffY >= 100) {\n this.close();\n // openedMenu.parentElement.click();\n }\n // console.log('mousemove', diffX, diffY);\n };\n\n public close() {\n if(this.element) {\n this.element.classList.remove('active');\n this.element.parentElement.classList.remove('menu-open');\n }\n\n super.close();\n\n if(!IS_TOUCH_SUPPORTED) {\n window.removeEventListener('mousemove', this.onMouseMove);\n }\n }\n\n public openBtnMenu(element: HTMLElement, onClose?: () => void) {\n super.open(element);\n\n this.element.classList.add('active', 'was-open');\n this.element.parentElement.classList.add('menu-open');\n\n if(onClose) {\n this.addEventListener('toggle', onClose, {once: true});\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n window.addEventListener('mousemove', this.onMouseMove);\n }\n }\n}\n\nconst contextMenuController = new ContextMenuController();\nexport default contextMenuController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport I18n, {i18n} from '../lib/langPack';\n\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\nexport const ONE_DAY = 86400;\n\n// https://stackoverflow.com/a/6117889\nexport const getWeekNumber = (date: Date) => {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n const dayNum = d.getUTCDay() || 7;\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\n};\n\nexport function formatDateAccordingToTodayNew(time: Date) {\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n const timestamp = time.getTime() / 1000 | 0;\n\n const options: Intl.DateTimeFormatOptions = {};\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\n options.hour = options.minute = '2-digit';\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\n options.year = options.day = 'numeric';\n options.month = '2-digit';\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\n options.weekday = 'short';\n } else { // same year\n options.month = 'short';\n options.day = 'numeric';\n }\n\n return new I18n.IntlDateElement({\n date: time,\n options\n }).element;\n}\n\nexport function formatFullSentTimeRaw(timestamp: number, options: {\n capitalize?: boolean\n} = {}) {\n const date = new Date();\n const time = new Date(timestamp * 1000);\n const now = date.getTime() / 1000;\n\n const timeEl = formatTime(time);\n\n let dateEl: Node | string;\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\n\n if(options.capitalize) {\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\n }\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\n } else {\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\n }\n\n return {dateEl, timeEl};\n}\n\nexport function formatFullSentTime(timestamp: number) {\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\n capitalize: true\n });\n\n const fragment = document.createDocumentFragment();\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\n return fragment;\n}\n\nexport function formatTime(date: Date) {\n return new I18n.IntlDateElement({\n date,\n options: {\n hour: '2-digit',\n minute: '2-digit'\n }\n }).element;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\n\nexport const getFullDate = (date: Date, options: Partial<{\n noTime: true,\n noSeconds: true,\n monthAsNumber: true,\n leadingZero: true\n}> = {}) => {\n const joiner = options.monthAsNumber ? '.' : ' ';\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\n\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) +\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) +\n joiner + date.getFullYear() +\n (options.noTime ? '' : ', ' + time);\n};\n\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\nconst minYear = 2013;\nconst yearPattern = new RegExp('20[0-9]{1,2}');\nconst monthYearOrDayPattern = new RegExp('(\\\\w{3,}) ([0-9]{0,4})', 'i');\nconst yearOrDayAndMonthPattern = new RegExp('([0-9]{0,4}) (\\\\w{2,})', 'i');\nconst shortDate = new RegExp('^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst longDate = new RegExp('^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nexport type DateData = {\n title: string,\n minDate: number,\n maxDate: number,\n};\nexport function fillTipDates(query: string, dates: DateData[]) {\n const q = query.trim().toLowerCase();\n\n if(q.length < 3) {\n return;\n }\n\n if('today'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: 'Today',\n minDate,\n maxDate\n });\n return;\n }\n\n if('yesterday'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime() - 86400000;\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 86400001;\n dates.push({\n title: 'Yesterday',\n minDate,\n maxDate\n });\n return;\n }\n\n const dayOfWeek = getDayOfWeek(q);\n if(dayOfWeek >= 0) {\n const date = new Date();\n const now = date.getTime();\n const currentDay = date.getDay();\n const distance = dayOfWeek - currentDay;\n date.setDate(date.getDate() + distance);\n if(date.getTime() > now) {\n date.setTime(date.getTime() - 604800000);\n }\n const year = date.getFullYear()\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatWeekLong(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n let matches: any[];\n if((matches = shortDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const k = parseInt(g1);\n const k1 = parseInt(g2);\n if(k > 0 && k <= 31) {\n if(k1 >= minYear && k <= 12) {\n const selectedYear = k1;\n const month = k - 1;\n createForMonthYear(dates, month, selectedYear);\n return;\n } else if(k1 <= 12) {\n const day = k - 1;\n const month = k1 - 1;\n createForDayMonth(dates, day, month);\n }\n } else if(k >= minYear && k1 <= 12) {\n const selectedYear = k;\n const month = k1 - 1;\n createForMonthYear(dates, month, selectedYear);\n }\n\n return;\n }\n\n if((matches = longDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const g3 = matches[5];\n if(!matches[2] === matches[4]) {\n return;\n }\n\n const day = parseInt(g1);\n const month = parseInt(g2) - 1;\n let year = parseInt(g3);\n if(year >= 10 && year <= 99) {\n year += 2000;\n }\n\n const currentYear = new Date().getFullYear();\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\n const date = new Date();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n return;\n }\n\n if((matches = yearPattern.exec(q)) !== null) {\n let selectedYear = +q;\n const currentYear = new Date().getFullYear();\n if(selectedYear < minYear) {\n selectedYear = minYear;\n for(let i = currentYear; i >= selectedYear; i--) {\n const date = new Date();\n date.setFullYear(i, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(i + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + i,\n minDate,\n maxDate\n });\n }\n } else if(selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(selectedYear + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + selectedYear,\n minDate,\n maxDate\n });\n }\n\n return;\n }\n\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g1);\n if(month >= 0) {\n const k = +g2;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n return;\n }\n }\n }\n\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g2);\n if(month >= 0) {\n const k = +g1;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n }\n }\n }\n}\n\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n if(selectedYear >= minYear && selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, month, 1);\n date.setHours(0, 0, 0);\n const minDate = date.getTime();\n if(minDate > today) {\n return;\n }\n date.setMonth(date.getMonth() + 1);\n const maxDate = date.getTime() - 1;\n\n dates.push({\n title: formatterMonthYear(minDate),\n minDate,\n maxDate\n });\n }\n}\n\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\n if(validDateForMonth(day, month)) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n\n for(let i = currentYear; i >= minYear; i--) {\n if(month === 1 && day === 28 && !isLeapYear(i)) {\n continue;\n }\n\n const date = new Date();\n date.setFullYear(i, month, day + 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n if(minDate > today) {\n continue;\n }\n\n date.setFullYear(i, month, day + 2);\n date.setHours(0, 0, 0);\n const maxDate = date.getTime() - 1;\n if(i === currentYear) {\n dates.push({\n title: formatterDayMonth(minDate),\n minDate,\n maxDate\n });\n } else {\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n }\n }\n }\n}\n\nfunction formatterMonthYear(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\n}\n\nfunction formatterDayMonth(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\n}\n\nfunction formatterYearMax(timestamp: number) {\n const date = new Date(timestamp);\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\n}\n\nfunction formatWeekLong(timestamp: number) {\n const date = new Date(timestamp);\n return days[date.getDay()];\n}\n\nfunction validDateForMonth(day: number, month: number) {\n if(month >= 0 && month < 12) {\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\n return true;\n }\n }\n return false;\n}\n\nfunction isLeapYear(year: number) {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\n}\n\nfunction getMonth(q: string) {\n /* String[] months = new String[]{\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\n }; */\n\n /* String[] monthsEng = new String[12];\n Calendar c = Calendar.getInstance();\n for (int i = 1; i <= 12; i++) {\n c.set(0, 0, 0, 0, 0, 0);\n c.set(Calendar.MONTH, i);\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\n } */\n\n q = q.toLowerCase();\n for(let i = 0; i < 12; i++) {\n const month = months[i].toLowerCase();\n if(month.indexOf(q) === 0) {\n return i;\n }\n }\n return -1;\n}\n\nfunction getDayOfWeek(q: string) {\n const c = new Date();\n if(q.length <= 3) {\n return -1;\n }\n\n for(let i = 0; i < 7; i++) {\n c.setDate(c.getDate() + 1);\n\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\n return c.getDay();\n }\n }\n return -1;\n}\n\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {toastNew} from '../../components/toast';\nimport {LangPackKey} from '../../lib/langPack';\nimport {copyTextToClipboard} from '../clipboard';\nimport cancelEvent from './cancelEvent';\nimport {attachClickEvent} from './clickEvent';\n\nconst T_ME = 'https://t.me/';\nexport default function anchorCopy(options: Partial<{\n // href: string,\n mePath: string,\n username: string\n}> = {}) {\n const anchor = document.createElement('a');\n anchor.classList.add('anchor-copy');\n\n let copyWhat: string, copyText: LangPackKey = 'LinkCopied';\n if(options.mePath) {\n const href = T_ME + options.mePath;\n copyWhat = anchor.href = anchor.innerText = href;\n }\n\n if(options.username) {\n const href = T_ME + options.username;\n anchor.href = href;\n copyWhat = anchor.innerText = '@' + options.username;\n copyText = 'UsernameCopied';\n }\n\n attachClickEvent(anchor, (e) => {\n cancelEvent(e);\n copyTextToClipboard(copyWhat ?? anchor.href);\n toastNew({langPackKey: copyText});\n });\n\n return anchor;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_APPLE} from '../../environment/userAgent';\nimport contextMenuController from '../contextMenuController';\nimport ListenerSetter, {ListenerOptions} from '../listenerSetter';\nimport cancelEvent from './cancelEvent';\n\nlet _cancelContextMenuOpening = false, _cancelContextMenuOpeningTimeout = 0;\nexport function cancelContextMenuOpening() {\n if(_cancelContextMenuOpeningTimeout) {\n clearTimeout(_cancelContextMenuOpeningTimeout);\n }\n\n _cancelContextMenuOpeningTimeout = window.setTimeout(() => {\n _cancelContextMenuOpeningTimeout = 0;\n _cancelContextMenuOpening = false;\n }, .4e3);\n\n _cancelContextMenuOpening = true;\n}\n\nexport function attachContextMenuListener({\n element,\n callback,\n listenerSetter,\n listenerOptions\n}: {\n element: HTMLElement,\n callback: (e: TouchEvent | MouseEvent) => void,\n listenerSetter?: ListenerSetter,\n listenerOptions?: ListenerOptions\n}) {\n const add = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, element) : element.removeEventListener.bind(element);\n\n // can't cancel further events coming after 'contextmenu' event\n if((IS_APPLE && IS_TOUCH_SUPPORTED) || listenerOptions) {\n let timeout: number;\n\n const options: EventListenerOptions = {\n ...(listenerOptions || {}),\n capture: true\n };\n\n const onCancel = () => {\n clearTimeout(timeout);\n // @ts-ignore\n remove('touchmove', onCancel, options);\n // @ts-ignore\n remove('touchend', onCancel, options);\n // @ts-ignore\n remove('touchcancel', onCancel, options);\n };\n\n add('touchstart', (e: TouchEvent) => {\n if(e.touches.length > 1) {\n onCancel();\n return;\n }\n\n add('touchmove', onCancel, options);\n add('touchend', onCancel, options);\n add('touchcancel', onCancel, options);\n\n timeout = window.setTimeout(() => {\n if(_cancelContextMenuOpening) {\n onCancel();\n return;\n }\n\n callback(e);\n onCancel();\n\n if(contextMenuController.isOpened()) {\n add('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n }, .4e3);\n }, listenerOptions);\n\n /* if(!isSafari) {\n add('contextmenu', (e: any) => {\n cancelEvent(e);\n }, {passive: false, capture: true});\n } */\n } else {\n add('contextmenu', IS_TOUCH_SUPPORTED ? (e: any) => {\n callback(e);\n\n if(contextMenuController.isOpened()) {\n add('touchend', cancelEvent, {once: true}); // * fix instant closing\n }\n } : callback, listenerOptions);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type GrabEvent = {x: number, y: number, isTouch?: boolean, event: TouchEvent | MouseEvent};\n\nexport default function attachGrabListeners(element: HTMLElement,\n onStart: (position: GrabEvent) => void,\n onMove: (position: GrabEvent) => void,\n onEnd?: (position: GrabEvent) => void) {\n // * Mouse\n const onMouseMove = (event: MouseEvent) => {\n onMove({x: event.pageX, y: event.pageY, event});\n };\n\n const onMouseUp = (event: MouseEvent) => {\n document.removeEventListener('mousemove', onMouseMove);\n element.addEventListener('mousedown', onMouseDown, {once: true});\n onEnd && onEnd({x: event.pageX, y: event.pageY, event});\n };\n\n const onMouseDown = (event: MouseEvent) => {\n if(event.button !== 0) {\n element.addEventListener('mousedown', onMouseDown, {once: true});\n return;\n }\n\n onStart({x: event.pageX, y: event.pageY, event});\n onMouseMove(event);\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp, {once: true});\n };\n\n element.addEventListener('mousedown', onMouseDown, {once: true});\n\n // * Touch\n const onTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n onMove({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\n };\n\n const onTouchEnd = (event: TouchEvent) => {\n document.removeEventListener('touchmove', onTouchMove);\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\n onEnd && onEnd({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\n };\n\n const onTouchStart = (event: TouchEvent) => {\n onStart({x: event.touches[0].clientX, y: event.touches[0].clientY, isTouch: true, event});\n onTouchMove(event);\n\n document.addEventListener('touchmove', onTouchMove, {passive: false});\n document.addEventListener('touchend', onTouchEnd, {passive: false, once: true});\n };\n\n element.addEventListener('touchstart', onTouchStart, {passive: false, once: true});\n\n return () => {\n element.removeEventListener('mousedown', onMouseDown);\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n\n element.removeEventListener('touchstart', onTouchStart);\n document.removeEventListener('touchmove', onTouchMove);\n document.removeEventListener('touchend', onTouchEnd);\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function cancelSelection() {\n if(window.getSelection) {\n if(window.getSelection().empty) { // Chrome\n window.getSelection().empty();\n } else if(window.getSelection().removeAllRanges) { // Firefox\n window.getSelection().removeAllRanges();\n }\n // @ts-ignore\n } else if(document.selection) { // IE?\n // @ts-ignore\n document.selection.empty();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../listenerSetter';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport simulateEvent from './dispatchEvent';\n\nexport const CLICK_EVENT_NAME: 'mousedown' /* | 'touchend' */ | 'click' = (IS_TOUCH_SUPPORTED ? 'mousedown' : 'click') as any;\nexport type AttachClickOptions = AddEventListenerOptions & Partial<{listenerSetter: ListenerSetter, touchMouseDown: true}>;\nexport function attachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options: AttachClickOptions = {}) {\n const add = options.listenerSetter ? options.listenerSetter.add(elem) : elem.addEventListener.bind(elem);\n const remove = options.listenerSetter ? options.listenerSetter.removeManual.bind(options.listenerSetter, elem) : elem.removeEventListener.bind(elem);\n\n options.touchMouseDown = true;\n /* if(options.touchMouseDown && CLICK_EVENT_NAME === 'touchend') {\n add('mousedown', callback, options);\n } else if(CLICK_EVENT_NAME === 'touchend') {\n const o = {...options, once: true};\n\n const onTouchStart = (e: TouchEvent) => {\n const onTouchMove = (e: TouchEvent) => {\n remove('touchmove', onTouchMove, o);\n remove('touchend', onTouchEnd, o);\n };\n\n const onTouchEnd = (e: TouchEvent) => {\n remove('touchmove', onTouchMove, o);\n callback(e);\n if(options.once) {\n remove('touchstart', onTouchStart);\n }\n };\n\n add('touchend', onTouchEnd, o);\n add('touchmove', onTouchMove, o);\n };\n\n add('touchstart', onTouchStart);\n } else {\n add(CLICK_EVENT_NAME, callback, options);\n } */\n add(CLICK_EVENT_NAME, callback, options);\n\n // @ts-ignore\n return () => remove(CLICK_EVENT_NAME, callback, options);\n}\n\nexport function detachClickEvent(elem: HTMLElement | Window, callback: (e: /* TouchEvent | */MouseEvent) => void, options?: AddEventListenerOptions) {\n // if(CLICK_EVENT_NAME === 'touchend') {\n // elem.removeEventListener('touchstart', callback, options);\n // } else {\n elem.removeEventListener(CLICK_EVENT_NAME, callback as any, options);\n // }\n}\n\nexport function simulateClickEvent(elem: HTMLElement) {\n simulateEvent(elem, CLICK_EVENT_NAME);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport EventListenerBase from '../eventListenerBase';\nimport ListenerSetter from '../listenerSetter';\nimport safeAssign from '../object/safeAssign';\nimport findUpClassName from './findUpClassName';\n\nexport default class ControlsHover extends EventListenerBase<{\n toggleControls: (show: boolean) => void\n}> {\n protected hideControlsTimeout: number;\n protected controlsLocked: boolean;\n\n protected canHideControls: () => boolean;\n protected element: HTMLElement;\n protected listenerSetter: ListenerSetter;\n protected showOnLeaveToClassName: string;\n protected ignoreClickClassName: string;\n\n constructor() {\n super(false);\n this.hideControlsTimeout = 0;\n }\n\n public setup(options: {\n element: HTMLElement,\n listenerSetter: ListenerSetter,\n canHideControls?: () => boolean,\n showOnLeaveToClassName?: string,\n ignoreClickClassName?: string\n }) {\n safeAssign(this, options);\n\n const {listenerSetter, element} = this;\n\n if(IS_TOUCH_SUPPORTED) {\n listenerSetter.add(element)('click', (e) => {\n if(this.ignoreClickClassName && findUpClassName(e.target, this.ignoreClickClassName)) {\n return;\n }\n\n this.toggleControls();\n });\n\n /* listenerSetter.add(player)('touchstart', () => {\n showControls(false);\n });\n\n listenerSetter.add(player)('touchend', () => {\n if(player.classList.contains('is-playing')) {\n showControls();\n }\n }); */\n } else {\n listenerSetter.add(element)('mousemove', () => {\n this.showControls();\n });\n\n listenerSetter.add(element)('mouseenter', () => {\n this.showControls(false);\n });\n\n listenerSetter.add(element)('mouseleave', (e) => {\n if(e.relatedTarget && this.showOnLeaveToClassName && findUpClassName(e.relatedTarget, this.showOnLeaveToClassName)) {\n this.showControls(false);\n return;\n }\n\n this.hideControls();\n });\n }\n }\n\n public hideControls = (setHideTimeout = false) => {\n if(setHideTimeout) {\n if(!this.hideControlsTimeout) {\n this.hideControlsTimeout = window.setTimeout(this.hideControls, 3e3);\n }\n\n return;\n }\n\n clearTimeout(this.hideControlsTimeout);\n this.hideControlsTimeout = 0;\n\n const isShown = this.element.classList.contains('show-controls');\n if(this.controlsLocked !== false) {\n if((this.canHideControls ? !this.canHideControls() : false) || !isShown || this.controlsLocked) {\n return;\n }\n } else if(!isShown) {\n return;\n }\n\n this.dispatchEvent('toggleControls', false);\n this.element.classList.remove('show-controls');\n };\n\n public showControls = (setHideTimeout = true) => {\n if(this.hideControlsTimeout) {\n clearTimeout(this.hideControlsTimeout);\n this.hideControlsTimeout = 0;\n } else if(!this.element.classList.contains('show-controls') && this.controlsLocked !== false) {\n this.dispatchEvent('toggleControls', true);\n this.element.classList.add('show-controls');\n }\n\n if(!setHideTimeout || this.controlsLocked) {\n return;\n }\n\n this.hideControlsTimeout = window.setTimeout(this.hideControls, 3e3);\n };\n\n public toggleControls = (show?: boolean) => {\n const isShown = this.element.classList.contains('show-controls');\n\n if(show === undefined) {\n if(isShown) this.hideControls();\n else this.showControls();\n } else if(show === isShown) return;\n else if(show === false) this.hideControls();\n else this.showControls();\n };\n\n public lockControls(visible: boolean) {\n this.controlsLocked = visible;\n\n this.element.classList.toggle('disable-hover', visible === false);\n this.toggleControls(visible);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ButtonMenu, {ButtonMenuItemOptionsVerifiable} from '../../components/buttonMenu';\nimport filterAsync from '../array/filterAsync';\nimport contextMenuController from '../contextMenuController';\nimport ListenerSetter from '../listenerSetter';\nimport {getMiddleware} from '../middleware';\nimport positionMenu from '../positionMenu';\nimport {attachContextMenuListener} from './attachContextMenuListener';\n\nexport default function createContextMenu({\n buttons,\n findElement,\n listenTo,\n appendTo,\n filterButtons,\n onOpen,\n onClose,\n onBeforeOpen,\n listenerSetter: attachListenerSetter\n}: {\n buttons: T[],\n findElement?: (e: MouseEvent | TouchEvent) => HTMLElement,\n listenTo: HTMLElement,\n appendTo?: HTMLElement,\n filterButtons?: (buttons: T[]) => Promise,\n onOpen?: (target: HTMLElement) => any,\n onClose?: () => any,\n onBeforeOpen?: () => any,\n listenerSetter?: ListenerSetter\n}) {\n appendTo ??= document.body;\n\n attachListenerSetter ??= new ListenerSetter();\n const listenerSetter = new ListenerSetter();\n const middleware = getMiddleware();\n let element: HTMLElement;\n\n attachContextMenuListener({\n element: listenTo,\n callback: (e) => {\n const target = findElement ? findElement(e as any) : listenTo;\n if(!target) {\n return;\n }\n\n let _element = element;\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\n if(_element && _element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\n\n const r = async() => {\n await onOpen?.(target);\n\n const initResult = await init();\n if(!initResult) {\n return;\n }\n\n _element = initResult.element;\n const {cleanup, destroy} = initResult;\n\n positionMenu(e, _element);\n contextMenuController.openBtnMenu(_element, () => {\n onClose?.();\n cleanup();\n\n setTimeout(() => {\n destroy();\n }, 300);\n });\n };\n\n r();\n },\n listenerSetter: attachListenerSetter\n });\n\n const cleanup = () => {\n listenerSetter.removeAll();\n middleware.clean();\n };\n\n const destroy = () => {\n cleanup();\n attachListenerSetter.removeAll();\n };\n\n const init = async() => {\n cleanup();\n\n buttons.forEach((button) => button.element = undefined);\n const f = filterButtons || ((buttons: T[]) => filterAsync(buttons, (button) => button?.verify?.() ?? true));\n\n const filteredButtons = await f(buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const _element = element = await ButtonMenu({\n buttons: filteredButtons,\n listenerSetter\n });\n _element.classList.add('contextmenu');\n\n await onBeforeOpen?.();\n\n appendTo.append(_element);\n\n return {\n element: _element,\n cleanup,\n destroy: () => {\n _element.remove();\n }\n };\n };\n\n return {element, destroy};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport PopupStickers from '../../components/popups/stickers';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport rootScope from '../../lib/rootScope';\nimport createContextMenu from './createContextMenu';\nimport findUpClassName from './findUpClassName';\nimport emoticonsDropdown, {EmoticonsDropdown} from '../../components/emoticonsDropdown';\n\nexport default function createStickersContextMenu(options: {\n listenTo: HTMLElement,\n isStickerPack?: boolean,\n verifyRecent?: (target: HTMLElement) => boolean,\n appendTo?: HTMLElement,\n onOpen?: () => any,\n onClose?: () => any,\n onSend?: () => any\n}) {\n const {listenTo, isStickerPack, verifyRecent, appendTo, onOpen, onClose, onSend} = options;\n let target: HTMLElement, doc: MyDocument;\n const verifyFavoriteSticker = async(toAdd: boolean) => {\n const favedStickers = await rootScope.managers.acknowledged.appStickersManager.getFavedStickersStickers();\n if(!favedStickers.cached) {\n return false;\n }\n\n const found = (await favedStickers.result).some((_doc) => _doc.id === doc.id);\n return toAdd ? !found : found;\n };\n\n return createContextMenu({\n listenTo: listenTo,\n appendTo,\n findElement: (e) => target = findUpClassName(e.target, 'media-sticker-wrapper'),\n onOpen: async() => {\n doc = await rootScope.managers.appDocsManager.getDoc(target.dataset.docId);\n return onOpen?.();\n },\n onClose,\n buttons: [{\n icon: 'stickers',\n text: 'Context.ViewStickerSet',\n onClick: () => new PopupStickers(doc.stickerSetInput).show(),\n verify: () => !isStickerPack\n }, {\n icon: 'favourites',\n text: 'AddToFavorites',\n onClick: () => rootScope.managers.appStickersManager.faveSticker(doc.id, false),\n verify: () => verifyFavoriteSticker(true)\n }, {\n icon: 'favourites',\n text: 'DeleteFromFavorites',\n onClick: () => rootScope.managers.appStickersManager.faveSticker(doc.id, true),\n verify: () => verifyFavoriteSticker(false)\n }, {\n icon: 'delete',\n text: 'DeleteFromRecent',\n onClick: () => rootScope.managers.appStickersManager.saveRecentSticker(doc.id, true),\n verify: () => verifyRecent?.(target) ?? false\n }, {\n icon: 'mute',\n text: 'Chat.Send.WithoutSound',\n onClick: () => {\n onSend?.();\n return EmoticonsDropdown.sendDocId(doc.id, false, true);\n },\n verify: () => !!(appImManager.chat.peerId && appImManager.chat.peerId !== rootScope.myId)\n }, {\n icon: 'schedule',\n text: 'Chat.Send.ScheduledMessage',\n onClick: () => appImManager.chat.input.scheduleSending(() => appImManager.chat.input.sendMessageWithDocument(doc)),\n verify: () => !!appImManager.chat.peerId\n }]\n });\n}\n","export default function createVideo(options: {\n pip?: boolean\n} = {}) {\n const video = document.createElement('video');\n if(!options.pip) video.disablePictureInPicture = true;\n video.setAttribute('playsinline', 'true');\n return video;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../lib/rootScope';\n\nexport type CustomProperty = string;\n\nexport class CustomProperties {\n private cache: {[k in CustomProperty]?: string};\n private computedStyle: CSSStyleDeclaration;\n\n constructor() {\n this.cache = {};\n\n rootScope.addEventListener('theme_change', () => {\n this.computedStyle = undefined;\n const cache = this.cache;\n this.cache = {};\n\n for(const i in cache) {\n this.getProperty(i);\n }\n });\n }\n\n public getProperty(name: CustomProperty) {\n let value = this.cache[name];\n if(value) {\n return value;\n }\n\n if(!this.computedStyle) {\n this.computedStyle = window.getComputedStyle(document.documentElement);\n }\n\n value = this.computedStyle.getPropertyValue('--' + name).trim();\n return this.cache[name] = value;\n }\n}\n\nconst customProperties = new CustomProperties();\nexport default customProperties;\n","export default function simulateEvent(elem: EventTarget, name: string) {\n const event = new Event(name, {bubbles: true, cancelable: true});\n elem.dispatchEvent(event);\n}\n","import encodeEntities from '../string/encodeEntities';\n\nexport default function documentFragmentToHTML(fragment: DocumentFragment) {\n return Array.from(fragment.childNodes).map((node) => {\n return node.nodeType === node.TEXT_NODE ? encodeEntities(node.textContent) : (node as Element).outerHTML;\n }).join('');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function findUpAsChild(el: T, parent: HTMLElement): T {\n if(!el) return null;\n if(el.parentElement === parent) return el;\n\n while(el.parentElement) {\n el = el.parentElement as any;\n if(el.parentElement === parent) {\n return el;\n }\n }\n\n return null;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function findUpAttribute(el: any, attribute: string): HTMLElement {\n return el.closest(`[${attribute}]`);\n /* if(el.getAttribute(attribute) !== null) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.getAttribute(attribute) !== null)\n return el;\n }\n return null; */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function findUpTag(el: any, tag: string): HTMLElement {\n return el.closest(tag);\n /* if(el.tagName === tag) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.tagName === tag)\n return el;\n }\n return null; */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../listenerSetter';\n\nexport function requestFullScreen(element: HTMLElement) {\n if(element.requestFullscreen) {\n element.requestFullscreen();\n // @ts-ignore\n } else if(element.mozRequestFullScreen) {\n // @ts-ignore\n element.mozRequestFullScreen(); // Firefox\n // @ts-ignore\n } else if(element.webkitRequestFullscreen) {\n // @ts-ignore\n element.webkitRequestFullscreen(); // Chrome and Safari\n // @ts-ignore\n } else if(element.msRequestFullscreen) {\n // @ts-ignore\n element.msRequestFullscreen();\n }\n}\n\nexport function cancelFullScreen() {\n // @ts-ignore\n if(document.cancelFullScreen) {\n // @ts-ignore\n document.cancelFullScreen();\n // @ts-ignore\n } else if(document.mozCancelFullScreen) {\n // @ts-ignore\n document.mozCancelFullScreen();\n // @ts-ignore\n } else if(document.webkitCancelFullScreen) {\n // @ts-ignore\n document.webkitCancelFullScreen();\n // @ts-ignore\n } else if(document.msExitFullscreen) {\n // @ts-ignore\n document.msExitFullscreen();\n }\n}\n\nexport function addFullScreenListener(element: HTMLElement, callback: (e: Event) => any, listenerSetter?: ListenerSetter) {\n const addListener = listenerSetter ? listenerSetter.add(element) : element.addEventListener.bind(element);\n 'webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange'.split(' ').forEach((eventName) => {\n addListener(eventName, callback, false);\n });\n}\n\nexport function getFullScreenElement(): HTMLElement {\n // @ts-ignore\n return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement;\n}\n\nexport function isFullScreen() {\n return !!getFullScreenElement();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpAsChild from './findUpAsChild';\n\nexport default function getCaretPosNew(input: HTMLElement, anchor?: boolean): ReturnType & {selection: Selection} {\n const selection = document.getSelection();\n // let {focusNode: node, focusOffset: offset} = selection;\n const node = selection[anchor ? 'anchorNode' : 'focusNode'];\n const offset = selection[anchor ? 'anchorOffset' : 'focusOffset'];\n if(!findUpAsChild(node, input) && node !== input) {\n return {selection} as any;\n }\n\n return {...getCaretPosF(input, node, offset), selection};\n}\n\nexport function getCaretPosF(input: HTMLElement, node: Node, offset: number) {\n if(node === input) {\n const childNodes = input.childNodes;\n const childNodesLength = childNodes.length;\n if(childNodesLength && offset >= childNodesLength) {\n node = childNodes[childNodesLength - 1];\n offset = (node.textContent || (node as HTMLImageElement).alt || '').length;\n } else {\n node = childNodes[offset];\n offset = 0;\n }\n }\n\n return {node: node as ChildNode, offset};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport BOM from '../string/bom';\n\nexport type MarkdownType = 'bold' | 'italic' | 'underline' | 'strikethrough' | 'monospace' | 'link' | 'mentionName' | 'spoiler'/* | 'customEmoji' */;\nexport type MarkdownTag = {\n match: string,\n entityName: Extract;\n};\n\n// https://core.telegram.org/bots/api#html-style\nexport const markdownTags: {[type in MarkdownType]: MarkdownTag} = {\n bold: {\n match: '[style*=\"bold\"], [style*=\"font-weight: 700\"], [style*=\"font-weight: 600\"], [style*=\"font-weight:700\"], [style*=\"font-weight:600\"], b, strong',\n entityName: 'messageEntityBold'\n },\n underline: {\n match: '[style*=\"underline\"], u, ins',\n entityName: 'messageEntityUnderline'\n },\n italic: {\n match: '[style*=\"italic\"], i, em',\n entityName: 'messageEntityItalic'\n },\n monospace: {\n match: '[style*=\"monospace\"], [face*=\"monospace\"], pre',\n entityName: 'messageEntityCode'\n },\n strikethrough: {\n match: '[style*=\"line-through\"], [style*=\"strikethrough\"], strike, del, s',\n entityName: 'messageEntityStrike'\n },\n link: {\n match: 'A:not(.follow)',\n entityName: 'messageEntityTextUrl'\n },\n mentionName: {\n match: 'A.follow',\n entityName: 'messageEntityMentionName'\n },\n spoiler: {\n match: '[style*=\"spoiler\"]',\n entityName: 'messageEntitySpoiler'\n }\n // customEmoji: {\n // match: '.custom-emoji',\n // entityName: 'messageEntityCustomEmoji'\n // }\n};\n\nconst tabulationMatch = '[style*=\"table-cell\"], th, td';\n\n/* export function getDepth(child: Node, container?: Node) {\n let depth = 0;\n\n do {\n if(child === container) {\n return depth;\n }\n\n ++depth;\n } while((child = child.parentNode) !== null);\n\n return depth;\n} */\n\nconst BLOCK_TAGS = new Set([\n 'DIV',\n 'P',\n 'BR',\n 'LI',\n 'SECTION',\n 'H6',\n 'H5',\n 'H4',\n 'H3',\n 'H2',\n 'H1',\n 'TR',\n 'OL',\n 'UL'\n]);\n\nconst INSERT_NEW_LINE_TAGS = new Set([\n 'OL',\n 'UL'\n]);\n\nconst BOM_REG_EXP = new RegExp(BOM, 'g');\n\nfunction checkNodeForEntity(node: Node, value: string, entities: MessageEntity[], offset: {offset: number}) {\n const parentElement = node.parentElement;\n\n // let closestTag: MarkdownTag, closestElementByTag: Element, closestDepth = Infinity;\n for(const type in markdownTags) {\n const tag = markdownTags[type as MarkdownType];\n const closest: HTMLElement = parentElement.closest(tag.match + ', [contenteditable=\"true\"]');\n if(closest?.getAttribute('contenteditable') !== null) {\n /* const depth = getDepth(closest, parentElement.closest('[contenteditable]'));\n if(closestDepth > depth) {\n closestDepth = depth;\n closestTag = tag;\n closestElementByTag = closest;\n } */\n continue;\n }\n\n if(tag.entityName === 'messageEntityTextUrl') {\n entities.push({\n _: tag.entityName,\n url: (closest as HTMLAnchorElement).href,\n offset: offset.offset,\n length: value.length\n });\n } else if(tag.entityName === 'messageEntityMentionName') {\n entities.push({\n _: tag.entityName,\n offset: offset.offset,\n length: value.length,\n user_id: (closest as HTMLElement).dataset.follow.toUserId()\n });\n }/* else if(tag.entityName === 'messageEntityCustomEmoji') {\n entities.push({\n _: tag.entityName,\n document_id: (closest as HTMLElement).dataset.docId,\n offset: offset.offset,\n length: emoji.length\n });\n } */ else {\n entities.push({\n _: tag.entityName,\n offset: offset.offset,\n length: value.length\n });\n }\n }\n}\n\nexport default function getRichElementValue(\n node: HTMLElement,\n lines: string[],\n line: string[],\n selNode?: Node,\n selOffset?: number,\n entities?: MessageEntity[],\n offset = {offset: 0}\n) {\n if(node.nodeType === node.TEXT_NODE) { // TEXT\n let nodeValue = node.nodeValue;\n // if(nodeValue[0] === BOM) {\n nodeValue = nodeValue.replace(BOM_REG_EXP, '');\n // }\n\n /* const tabulation = node.parentElement?.closest(tabulationMatch + ', [contenteditable]');\n if(tabulation?.getAttribute('contenteditable') === null) {\n nodeValue += ' ';\n // line.push('\\t');\n // ++offset.offset;\n } */\n\n if(nodeValue) {\n if(selNode === node) {\n line.push(nodeValue.substr(0, selOffset) + '\\x01' + nodeValue.substr(selOffset));\n } else {\n line.push(nodeValue);\n }\n } else if(selNode === node) {\n line.push('\\x01');\n }\n\n if(entities && nodeValue.length && node.parentNode) {\n checkNodeForEntity(node, nodeValue, entities, offset);\n }\n\n offset.offset += nodeValue.length;\n return;\n }\n\n if(node.nodeType !== node.ELEMENT_NODE) { // NON-ELEMENT\n return;\n }\n\n const isSelected = selNode === node;\n const isBlock = BLOCK_TAGS.has(node.tagName);\n if(isBlock && (line.length || node.tagName === 'BR'/* || (BLOCK_TAGS.has(node.tagName) && lines.length) */)) {\n lines.push(line.join(''));\n line.length = 0;\n ++offset.offset;\n } else {\n const alt = node.dataset.stickerEmoji || (node as HTMLImageElement).alt;\n const stickerEmoji = node.dataset.stickerEmoji;\n\n if(alt && entities) {\n checkNodeForEntity(node, alt, entities, offset);\n }\n\n if(stickerEmoji && entities) {\n entities.push({\n _: 'messageEntityCustomEmoji',\n document_id: node.dataset.docId,\n offset: offset.offset,\n length: alt.length\n });\n }\n\n if(alt) {\n line.push(alt);\n offset.offset += alt.length;\n }\n }\n\n if(isSelected && !selOffset) {\n line.push('\\x01');\n }\n\n const isTableCell = node.matches(tabulationMatch);\n const wasEntitiesLength = entities?.length;\n\n let curChild = node.firstChild as HTMLElement;\n while(curChild) {\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\n curChild = curChild.nextSibling as any;\n }\n\n if(isSelected && selOffset) {\n line.push('\\x01');\n }\n\n if(isTableCell && node.nextSibling && line.length) {\n line.push(' ');\n ++offset.offset;\n\n // * combine entities such as url after adding space\n if(wasEntitiesLength !== undefined) {\n for(let i = wasEntitiesLength, length = entities.length; i < length; ++i) {\n ++entities[i].length;\n }\n }\n }\n\n const wasLength = line.length;\n if(isBlock && wasLength) {\n lines.push(line.join(''));\n line.splice(0, wasLength);\n ++offset.offset;\n }\n\n if(wasLength && node.tagName === 'P' && node.nextSibling) {\n lines.push('');\n ++offset.offset;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {MessageEntity} from '../../layer';\nimport combineSameEntities from '../../lib/richTextProcessor/combineSameEntities';\nimport sortEntities from '../../lib/richTextProcessor/sortEntities';\nimport getRichElementValue from './getRichElementValue';\n\nexport function getCaretPos(field: HTMLElement) {\n const sel = window.getSelection();\n let selNode: Node;\n let selOffset: number;\n if(sel?.rangeCount) {\n const range = sel.getRangeAt(0);\n const startOffset = range.startOffset;\n if(\n range.startContainer &&\n range.startContainer == range.endContainer &&\n startOffset == range.endOffset\n ) {\n // * if focused on img, or caret has been set via placeCaretAtEnd\n const possibleChildrenFocusOffset = startOffset - 1;\n const childNodes = field.childNodes;\n if(range.startContainer === field && childNodes[possibleChildrenFocusOffset]) {\n selNode = childNodes[possibleChildrenFocusOffset];\n selOffset = 0;\n\n for(let i = 0; i < range.endOffset; ++i) {\n const node = childNodes[i];\n const value = node.nodeValue || (node as HTMLImageElement).alt;\n\n if(value) {\n selOffset += value.length;\n }\n }\n } else {\n selNode = range.startContainer;\n selOffset = startOffset;\n }\n }\n }\n\n return {node: selNode, offset: selOffset};\n}\n\nexport default function getRichValueWithCaret(\n field: HTMLElement | DocumentFragment,\n withEntities = true,\n withCaret = true\n) {\n const lines: string[] = [];\n const line: string[] = [];\n\n const {node: selNode, offset: selOffset} = !(field instanceof DocumentFragment) && withCaret && getCaretPos(field);\n\n const entities: MessageEntity[] = withEntities ? [] : undefined;\n const offset = {offset: 0};\n if(field instanceof DocumentFragment) {\n let curChild = field.firstChild as HTMLElement;\n while(curChild) {\n getRichElementValue(curChild, lines, line, selNode, selOffset, entities, offset);\n curChild = curChild.nextSibling as any;\n }\n } else {\n getRichElementValue(field, lines, line, selNode, selOffset, entities, offset);\n }\n\n if(line.length) {\n lines.push(line.join(''));\n }\n\n let value = lines.join('\\n');\n const caretPos = value.indexOf('\\x01');\n if(caretPos !== -1) {\n value = value.substr(0, caretPos) + value.substr(caretPos + 1);\n }\n value = value.replace(/\\u00A0/g, ' ');\n\n if(entities?.length) {\n // ! cannot do that here because have the same check before the sending in RichTextProcessor.parseMarkdown\n /* const entity = entities[entities.length - 1];\n const length = value.length;\n const trimmedLength = value.trimRight().length;\n if(length !== trimmedLength) {\n entity.length -= length - trimmedLength;\n } */\n\n combineSameEntities(entities);\n sortEntities(entities);\n }\n\n return {value, entities, caretPos};\n}\n\nMOUNT_CLASS_TO.getRichValueWithCaret = getRichValueWithCaret;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getVisibleRect from './getVisibleRect';\n\nexport type ViewportSlicePart = {element: HTMLElement, rect: DOMRect, visibleRect: ReturnType}[];\n\nexport default function getViewportSlice({overflowElement, overflowRect, selector, extraSize, elements}: {\n overflowElement: HTMLElement,\n overflowRect?: DOMRectMinified,\n extraSize?: number,\n selector?: string,\n elements?: HTMLElement[]\n}) {\n // const perf = performance.now();\n overflowRect ??= overflowElement.getBoundingClientRect();\n elements ??= Array.from(overflowElement.querySelectorAll(selector));\n\n if(extraSize) {\n overflowRect = {\n top: overflowRect.top - extraSize,\n right: overflowRect.right + extraSize,\n bottom: overflowRect.bottom + extraSize,\n left: overflowRect.left - extraSize\n };\n }\n\n const invisibleTop: ViewportSlicePart = [],\n visible: typeof invisibleTop = [],\n invisibleBottom: typeof invisibleTop = [];\n let foundVisible = false;\n for(const element of elements) {\n const rect = element.getBoundingClientRect();\n const visibleRect = getVisibleRect(element, overflowElement, false, rect, overflowRect);\n\n const isVisible = !!visibleRect;\n let array: typeof invisibleTop;\n if(isVisible) {\n foundVisible = true;\n array = visible;\n } else if(foundVisible) {\n array = invisibleBottom;\n } else {\n array = invisibleTop;\n }\n\n array.push({\n element,\n rect,\n visibleRect\n });\n }\n\n // if(extraSize && visible.length) {\n // const maxTop = visible[0].rect.top;\n // const minTop = maxTop - extraSize;\n // const minBottom = visible[visible.length - 1].rect.bottom;\n // const maxBottom = minBottom + extraSize;\n\n // for(let length = invisibleTop.length, i = length - 1; i >= 0; --i) {\n // const element = invisibleTop[i];\n // if(element.rect.top >= minTop) {\n // invisibleTop.splice(i, 1);\n // visible.unshift(element);\n // }\n // }\n\n // for(let i = 0, length = invisibleBottom.length; i < length; ++i) {\n // const element = invisibleBottom[i];\n // if(element.rect.bottom <= maxBottom) {\n // invisibleBottom.splice(i--, 1);\n // --length;\n // visible.push(element);\n // }\n // }\n // }\n\n // console.log('getViewportSlice time:', performance.now() - perf);\n\n return {invisibleTop, visible, invisibleBottom};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport windowSize from '../windowSize';\n\nexport default function getVisibleRect(\n element: HTMLElement,\n overflowElement: HTMLElement,\n lookForSticky?: boolean,\n rect: DOMRectMinified = element.getBoundingClientRect(),\n overflowRect: DOMRectMinified = overflowElement.getBoundingClientRect()\n) {\n let {top: overflowTop, right: overflowRight, bottom: overflowBottom, left: overflowLeft} = overflowRect;\n\n // * respect sticky headers\n if(lookForSticky) {\n const sticky = overflowElement.querySelector('.sticky');\n if(sticky) {\n const stickyRect = sticky.getBoundingClientRect();\n overflowTop = stickyRect.bottom;\n }\n }\n\n if(rect.top >= overflowBottom ||\n rect.bottom <= overflowTop ||\n rect.right <= overflowLeft ||\n rect.left >= overflowRight) {\n return null;\n }\n\n const overflow = {\n top: false,\n right: false,\n bottom: false,\n left: false,\n vertical: 0 as 0 | 1 | 2,\n horizontal: 0 as 0 | 1 | 2\n };\n\n const windowWidth = windowSize.width;\n const windowHeight = windowSize.height;\n\n return {\n rect: {\n top: rect.top < overflowTop && overflowTop !== 0 ? (overflow.top = true, ++overflow.vertical, overflowTop) : rect.top,\n right: rect.right > overflowRight && overflowRight !== windowWidth ? (overflow.right = true, ++overflow.horizontal, overflowRight) : rect.right,\n bottom: rect.bottom > overflowBottom && overflowBottom !== windowHeight ? (overflow.bottom = true, ++overflow.vertical, overflowBottom) : rect.bottom,\n left: rect.left < overflowLeft && overflowLeft !== 0 ? (overflow.left = true, ++overflow.horizontal, overflowLeft) : rect.left\n },\n overflow\n };\n}\n\n(window as any).getVisibleRect = getVisibleRect;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SwipeHandler, {SwipeHandlerOptions} from '../../components/swipeHandler';\nimport cancelEvent from './cancelEvent';\nimport findUpClassName from './findUpClassName';\nimport isSwipingBackSafari from './isSwipingBackSafari';\n\nexport type SwipeHandlerHorizontalOptions = SwipeHandlerOptions & {\n // xThreshold?: number\n};\n\nexport default function handleHorizontalSwipe(options: SwipeHandlerHorizontalOptions) {\n let cancelY = false;\n return new SwipeHandler({\n ...options,\n verifyTouchTarget: (e) => {\n return !findUpClassName(e.target, 'progress-line') &&\n !isSwipingBackSafari(e as any as TouchEvent) &&\n (options.verifyTouchTarget ? options.verifyTouchTarget(e) : true);\n },\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1;\n yDiff *= -1;\n\n if(!cancelY && Math.abs(yDiff) > 20) {\n return true;\n }\n\n if(Math.abs(xDiff) > Math.abs(yDiff)) {\n cancelEvent(e as any as Event);\n cancelY = true;\n } else if(!cancelY && Math.abs(yDiff) > Math.abs(xDiff)/* || Math.abs(yDiff) > 20 */) {\n return true;\n }\n\n /* if(!cancelY && options.xThreshold !== undefined && xDiff >= options.xThreshold) {\n cancelY = true;\n } */\n\n return options.onSwipe(xDiff, yDiff, e);\n },\n onReset: () => {\n cancelY = false;\n options.onReset && options.onReset();\n },\n cancelEvent: false // cannot use cancelEvent on Safari iOS because scroll will be canceled too\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {cancelContextMenuOpening} from './attachContextMenuListener';\nimport handleHorizontalSwipe, {SwipeHandlerHorizontalOptions} from './handleHorizontalSwipe';\n\nexport default function handleTabSwipe(options: SwipeHandlerHorizontalOptions) {\n return handleHorizontalSwipe({\n ...options,\n onSwipe: (xDiff, yDiff, e) => {\n xDiff *= -1;\n yDiff *= -1;\n\n if(Math.abs(xDiff) > 50) {\n options.onSwipe(xDiff, yDiff, e);\n cancelContextMenuOpening();\n\n return true;\n }\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function htmlToDocumentFragment(html: string | DocumentFragment) {\n if(html instanceof DocumentFragment) return html;\n const template = document.createElement('template');\n html = html.trim(); // Never return a text node of whitespace as the result\n template.innerHTML = html;\n return template.content;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function htmlToSpan(html: string | DocumentFragment) {\n const span = document.createElement('span');\n if(typeof(html) === 'string') span.innerHTML = html;\n else span.append(html);\n return span;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n/* export function isInDOM(element: Element, parentNode?: HTMLElement): boolean {\n if(!element) {\n return false;\n }\n\n parentNode = parentNode || document.body;\n if(element === parentNode) {\n return true;\n }\n return isInDOM(element.parentNode as HTMLElement, parentNode);\n} */\nexport default function isInDOM(element: Element): boolean {\n return element?.isConnected;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function isInputEmpty(element: HTMLElement) {\n if(element.isContentEditable || element.tagName !== 'INPUT') {\n /* const value = element.innerText;\n\n return !value.trim() && !serializeNodes(Array.from(element.childNodes)).trim(); */\n // return !getRichValueWithCaret(element, false, false).value.trim();\n return !element.textContent.trim() && !element.querySelector('.emoji, .custom-emoji, .custom-emoji-placeholder');\n } else {\n return !(element as HTMLInputElement).value.trim();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../lib/rootScope';\nimport {IS_MOBILE, IS_APPLE} from '../../environment/userAgent';\n\nexport default function isSendShortcutPressed(e: KeyboardEvent) {\n if(e.key === 'Enter' && !IS_MOBILE && !e.isComposing) {\n /* if(e.ctrlKey || e.metaKey) {\n this.messageInput.innerHTML += '
';\n placeCaretAtEnd(this.message)\n return;\n } */\n\n if(rootScope.settings.sendShortcut === 'enter') {\n if(e.shiftKey || e.ctrlKey || e.metaKey) {\n return;\n }\n\n return true;\n } else {\n const secondaryKey = IS_APPLE ? e.metaKey : e.ctrlKey;\n if(e.shiftKey || (IS_APPLE ? e.ctrlKey : e.metaKey)) {\n return;\n }\n\n if(secondaryKey) {\n return true;\n }\n }\n }\n\n return false;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\n\nexport default function isSwipingBackSafari(e: TouchEvent | MouseEvent) {\n return IS_MOBILE_SAFARI && e instanceof TouchEvent && e.touches[0].clientX < 30;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n\nexport default function placeCaretAtEnd(el: HTMLElement, ignoreTouchCheck = false, focus = true) {\n if(IS_TOUCH_SUPPORTED && (!ignoreTouchCheck || (document.activeElement.tagName !== 'INPUT' && !(document.activeElement as HTMLElement).isContentEditable))) {\n return;\n }\n\n focus && el.focus();\n if(el instanceof HTMLInputElement) {\n const length = el.value.length;\n el.selectionStart = length;\n el.selectionEnd = length;\n } else {\n const range = document.createRange();\n range.selectNodeContents(el);\n range.collapse(false);\n const sel = window.getSelection();\n sel.removeAllRanges();\n sel.addRange(range);\n }\n}\n\n(window as any).placeCaretAtEnd = placeCaretAtEnd;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport whichChild from './whichChild';\n\nexport default function positionElementByIndex(element: HTMLElement, container: HTMLElement, pos: number, prevPos?: number) {\n if(prevPos === undefined) {\n prevPos = element.parentElement === container ? whichChild(element) : -1;\n }\n\n if(prevPos === pos) {\n return false;\n } else if(prevPos !== -1 && prevPos < pos) { // was higher\n pos += 1;\n }\n\n if(!pos) {\n container.prepend(element);\n } else if(container.childElementCount > pos) {\n container.insertBefore(element, container.children[pos]);\n } else {\n container.append(element);\n }\n\n return true;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport onMediaLoad from '../onMediaLoad';\n\n// import { getHeavyAnimationPromise } from \"../../hooks/useHeavyAnimationCheck\";\n\nexport const loadedURLs: {[url: string]: boolean} = {};\nconst set = (elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement, url: string) => {\n if(elem instanceof HTMLImageElement || elem instanceof HTMLVideoElement) elem.src = url;\n else if(elem instanceof SVGImageElement) elem.setAttributeNS(null, 'href', url);\n else elem.style.backgroundImage = 'url(' + url + ')';\n};\n\n// проблема функции в том, что она не подходит для ссылок, пригодна только для blob'ов, потому что обычным ссылкам нужен 'load' каждый раз.\nexport default function renderImageFromUrl(\n elem: HTMLElement | HTMLImageElement | SVGImageElement | HTMLVideoElement,\n url: string,\n callback?: () => void,\n useCache = true\n) {\n if(!url) {\n console.error('renderImageFromUrl: no url?', elem, url);\n callback?.();\n return;\n }\n\n const isVideo = elem instanceof HTMLVideoElement;\n if(((loadedURLs[url]/* && false */) && useCache) || isVideo) {\n if(elem) {\n set(elem, url);\n }\n\n if(callback) {\n if(isVideo) {\n onMediaLoad(elem).then(callback);\n } else {\n callback?.();\n }\n // callback && getHeavyAnimationPromise().then(() => callback());\n }\n } else {\n const isImage = elem instanceof HTMLImageElement;\n const loader = isImage ? elem as HTMLImageElement : new Image();\n // const loader = new Image();\n loader.src = url;\n // let perf = performance.now();\n\n const onLoad = () => {\n if(!isImage && elem) {\n set(elem, url);\n }\n\n loadedURLs[url] = true;\n // console.log('onload:', url, performance.now() - perf);\n // TODO: переделать прогрузки аватаров до начала анимации, иначе с этим ожиданием они неприятно появляются\n // callback && getHeavyAnimationPromise().then(() => callback());\n callback?.();\n\n loader.removeEventListener('error', onError);\n };\n\n const onError = (err: ErrorEvent) => {\n console.error('Render image from url failed:', err, url, loader);\n loader.removeEventListener('load', onLoad);\n callback?.();\n };\n\n loader.addEventListener('load', onLoad, {once: true});\n loader.addEventListener('error', onError, {once: true});\n }\n}\n\nexport function renderImageFromUrlPromise(elem: Parameters[0], url: string, useCache?: boolean) {\n return new Promise((resolve) => {\n renderImageFromUrl(elem, url, resolve, useCache);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport sequentialDom from '../sequentialDom';\nimport {renderImageFromUrlPromise} from './renderImageFromUrl';\n\nexport default function renderMediaWithFadeIn(\n container: HTMLElement,\n media: Parameters[0],\n url: string,\n needFadeIn: boolean,\n aspecter = container,\n thumbImage?: HTMLElement\n) {\n if(needFadeIn) {\n media.classList.add('fade-in');\n }\n\n const promise = renderImageFromUrlPromise(media, url).then(() => {\n return sequentialDom.mutateElement(container, () => {\n aspecter.append(media);\n\n if(needFadeIn) {\n media.addEventListener('animationend', () => {\n sequentialDom.mutate(() => {\n media.classList.remove('fade-in');\n thumbImage?.remove();\n });\n }, {once: true});\n } else {\n thumbImage?.remove();\n }\n });\n });\n\n // recordPromise(promise, 'renderImageWithFadeIn');\n\n return promise;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function replaceContent(elem: HTMLElement, node: string | Node) {\n if(typeof(node) === 'string') {\n elem.innerHTML = node;\n return;\n }\n\n // * children.length doesn't count text nodes\n const firstChild = elem.firstChild;\n if(firstChild) {\n if(elem.lastChild === firstChild) {\n firstChild.replaceWith(node);\n } else {\n elem.textContent = '';\n elem.append(node);\n }\n } else {\n elem.append(node);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport clamp from '../number/clamp';\nimport findUpAsChild from './findUpAsChild';\nimport whichChild from './whichChild';\n\nexport default function compareNodes(node1: ChildNode, node1Offset: number, node2: ChildNode, node2Offset: number) {\n let diff: number;\n if(node1 === node2) {\n diff = node1Offset - node2Offset;\n } else if(node1.parentElement === node2.parentElement) {\n diff = whichChild(node1, true) - whichChild(node2, true);\n } else {\n const parents: HTMLElement[] = [];\n let parentElement = node1.parentElement;\n do {\n parents.push(parentElement);\n } while(parentElement = parentElement.parentElement);\n\n parentElement = node2.parentElement;\n do {\n if(parents.includes(parentElement)) {\n break;\n }\n } while(parentElement = parentElement.parentElement);\n\n const commonAncestorContainer = parentElement;\n // const range = document.createRange();\n // range.setStart(node1, 0);\n // range.setEnd(node2, node2.textContent.length);\n // const {commonAncestorContainer} = range;\n node1 = findUpAsChild(node1 as HTMLElement, commonAncestorContainer as HTMLElement);\n node2 = findUpAsChild(node2 as HTMLElement, commonAncestorContainer as HTMLElement);\n diff = whichChild(node1, true) - whichChild(node2, true);\n }\n\n return clamp(diff, -1, 1);\n}\n\n(window as any).compareNodes = compareNodes;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport {logger} from '../../lib/logger';\nimport {isCustomFillerNeededBySiblingNode} from '../../lib/richTextProcessor/wrapRichText';\nimport ListenerSetter from '../listenerSetter';\nimport BOM from '../string/bom';\nimport compareNodes from './compareNodes';\nimport getCaretPosNew from './getCaretPosNew';\nimport placeCaretAtEnd from './placeCaretAtEnd';\nimport whichChild from './whichChild';\n\nconst NOT_ONLY_BOMS_REG_EXP = new RegExp(`[^${BOM}]`);\n\nexport const USING_BOMS = false;\n\nexport default class RichInputHandler {\n private static INSTANCE: RichInputHandler;\n\n private listenerSetter: ListenerSetter;\n\n private lastNode: Node;\n private lastOffset: number;\n private savedRanges: WeakMap;\n\n private log: ReturnType;\n\n private inputCaptureCallbacks: Function[];\n\n constructor() {\n this.log = logger('RICH-INPUT');\n this.listenerSetter = new ListenerSetter();\n this.savedRanges = new WeakMap();\n\n this.listenerSetter.add(document)('selectionchange', this.saveSelectionOnChange);\n if(USING_BOMS) {\n this.listenerSetter.add(document)('focusout', this.onFocusOut);\n this.listenerSetter.add(document)('selectionchange', this.onSelectionChange);\n this.listenerSetter.add(document)('beforeinput', this.onBeforeInput);\n this.listenerSetter.add(document)('keydown', this.onKeyDown, {capture: true});\n\n if(IS_FIREFOX) {\n this.inputCaptureCallbacks = [];\n this.listenerSetter.add(document)('input', () => {\n this.inputCaptureCallbacks.forEach((callback) => callback());\n this.inputCaptureCallbacks.length = 0;\n }, {capture: true});\n }\n }\n }\n\n private get input() {\n const selection = document.getSelection();\n const {anchorNode: node} = selection;\n if(!node) return;\n return ((node as HTMLElement).closest ? node as HTMLElement : node.parentElement).closest('[contenteditable=\"true\"]');\n }\n\n private saveRangeForElement(element: HTMLElement) {\n if(element && (element.isContentEditable || element.tagName === 'INPUT')) {\n const selection = document.getSelection();\n if(selection.rangeCount) {\n this.savedRanges.set(element as HTMLElement, document.getSelection().getRangeAt(0));\n }\n }\n }\n\n private saveSelectionOnChange = (e: Event) => {\n const element = document.activeElement as HTMLElement; // e.target as HTMLElement;\n this.saveRangeForElement(element);\n };\n\n private onFocusOut = (e: FocusEvent) => {\n this.lastNode = this.lastOffset = undefined;\n };\n\n private findPreviousSmthIndex(input: HTMLElement, node: ChildNode, something?: NodeListOf) {\n // node = this.getFiller(node);\n // const childNodes = Array.from(node.parentElement.childNodes);\n // fillerIndex = childNodes.indexOf(node);\n // let smthIndex = -1;\n // for(let i = fillerIndex; i >= 0; --i) {\n // const node = childNodes[i];\n // if((node as HTMLElement)?.classList?.contains('input-something')) {\n // smthIndex = i;\n // break;\n // }\n // }\n // return smthIndex;\n\n const elements = Array.from(something ?? input.querySelectorAll('.input-something'));\n const index = elements.findIndex((element) => compareNodes(element, 0, node, 0) >= 0);\n return index === -1 ? elements.length - 1 : Math.max(0, index - 1);\n }\n\n private superMove(\n input: HTMLElement,\n caret: ReturnType,\n toLeft: boolean,\n fromSelectionChange: boolean\n ) {\n const {node, offset, move} = caret;\n const something = input.querySelectorAll('.input-something');\n const smthIndex = this.findPreviousSmthIndex(input, node, something);\n const r = document.createRange();\n r[toLeft ? 'setEnd' : 'setStart'](node, offset);\n\n if(fromSelectionChange) {\n move(toLeft);\n }\n\n const c = this.getCaretPosN();\n if(c.node?.nodeValue === BOM && (!fromSelectionChange || node === this.lastNode)) {\n const idx = this.findPreviousSmthIndex(input, c.node, something);\n\n let moved = !fromSelectionChange;\n\n do {\n const c = this.getCaretPosN();\n const idxidx = this.findPreviousSmthIndex(input, c.node, something);\n r[toLeft ? 'setStart' : 'setEnd'](c.node, c.offset);\n const rangeString = r.toString();\n const onlyBOMs = !NOT_ONLY_BOMS_REG_EXP.test(rangeString);\n this.log('test cursor', rangeString, onlyBOMs, idx, idxidx);\n if(\n onlyBOMs &&\n c.node?.nodeValue === BOM &&\n idxidx === idx &&\n // (idxidx > 1 || c.offset) &&\n // (idxidx < (getFiller(c.node).parentElement.childNodes.length - 2) || c.offset < BOM.length)\n (idxidx || c.offset) &&\n (idxidx < (something.length - 1) || c.offset < BOM.length)\n ) {\n move(toLeft);\n moved = true;\n } else if(!moved) {\n break;\n } else {\n if((!this.getFiller(node as HTMLElement).classList.contains('input-filler-text') && idx !== smthIndex) || c.offset === BOM.length) {\n move(!toLeft);\n }\n\n break;\n }\n } while(true);\n }\n }\n\n private onSelectionChange = (e: Event) => {\n const {input} = this;\n if(!input) {\n this.setSelectionClassName(document.getSelection());\n return;\n }\n\n // return;\n\n // this.log('selectionchange', document.getSelection(), document.getSelection().rangeCount && document.getSelection().getRangeAt(0), getCaretPosN());\n // let {node, offset} = getCaretPos(this.messageInput);\n\n let caret = this.getCaretPosN();\n do {\n const {node, offset, selection, move} = caret;\n\n const nodeValue = node?.nodeValue;\n // if(!nodeValue?.includes(BOM)) {\n if(nodeValue !== BOM || !this.lastNode) {\n break;\n }\n\n // node = getFiller(node);\n\n // const childIndex = whichChild(getFiller(node), true);\n // let toLeft: boolean;\n // // if(node === lastNode) toLeft = lastOffset >= offset;\n // if(node === lastNode) toLeft = lastOffset > offset;\n // else {\n // // toLeft = whichChild(getFiller(lastNode)) > childIndex;\n // toLeft = (lastNode.nodeValue === BOM ? whichChild(getFiller(lastNode), true) : whichChild(findUpAsChild(lastNode as any, getFiller(node).parentElement), true)) > childIndex;\n // }\n\n const toLeft = compareNodes(node, offset, this.lastNode as ChildNode, this.lastOffset) < 0;\n\n // const childNodes = Array.from(node.parentElement.childNodes);\n // if(toLeft) {\n // for(let i = childIndex; i >= 0; --i) {\n // const sibling = childNodes[i];\n // const {textContent} = sibling;\n // for()\n // }\n // }\n\n // {\n // if(toLeft === undefined) {\n // return;\n // }\n\n // const selection = window.getSelection();\n // selection.modify(selection.isCollapsed ? 'move' : 'extend', toLeft ? 'backward' : 'forward', 'character');\n // return;\n // }\n\n // const parent = getFiller(node);\n if(toLeft !== undefined) {\n // let newNode = toLeft ? parent.previousSibling : parent.nextSibling;\n if(selection.isCollapsed) {\n this.superMove(input, caret, toLeft, true);\n\n // if(offset === BOM.length) {\n // newNode = toLeft ? newNode.nextSibling.nextSibling : parent.previousSibling.previousSibling;\n // }\n\n // setCaretAt(newNode);\n } else {\n selection.modify(selection.isCollapsed ? 'move' : 'extend', toLeft ? 'backward' : 'forward', 'character');\n // const range = selection.getRangeAt(0);\n\n // if(toLeft) {\n // newNode = parent.previousSibling.previousSibling.firstChild;\n // const value = newNode.nodeValue;\n // range.setStart(newNode, value?.length);\n // } else {\n // newNode = parent.nextSibling.nextSibling.firstChild;\n // range.setEnd(newNode, 0);\n // }\n }\n }\n\n this.log('selectionchange',\n node,\n offset,\n this.lastNode,\n this.lastOffset,\n node === this.lastNode,\n whichChild(this.getFiller(node)),\n whichChild(this.getFiller(this.lastNode)),\n toLeft,\n selection,\n document.getSelection(),\n document.getSelection().getRangeAt(0),\n node?.parentNode,\n this.lastNode?.parentNode\n );\n\n caret = this.getCaretPosN();\n this.lastNode = node;\n this.lastOffset = offset;\n\n break;\n\n // if(findPreviousSmthIndex(caret.node) !== smthIndex) {\n // break;\n // }\n } while(true);\n\n this.lastNode = this.lastOffset = undefined;\n\n // if(offset === BOM.length) {\n // setCaretAt(parent);\n // } else {\n // setCaretAt(parent.nextSibling);\n // }\n\n this.setSelectionClassName(caret.selection, input);\n };\n\n public restoreSavedRange(input: HTMLElement) {\n const range = this.getSavedRange(input);\n if(!range) {\n return false;\n }\n\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n return true;\n }\n\n public getSavedRange(input: HTMLElement) {\n return this.savedRanges.get(input);\n }\n\n public makeFocused(input: HTMLElement) {\n if(document.activeElement !== input && !this.restoreSavedRange(input)) {\n placeCaretAtEnd(input, false, false);\n }\n }\n\n private fixInsertedLineBreaks(input: HTMLElement) {\n input.querySelectorAll('br').forEach((br) => {\n br.classList.add('br-not-br');\n });\n }\n\n private fixBuggedCaret() {\n const selection = document.getSelection();\n const range = selection.getRangeAt(0);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n public onBeforeInput = (e: Pick) => {\n const {input, log} = this;\n if(!input) {\n return;\n }\n\n const addInputCallback = this.addInputCallback.bind(this, input);\n\n const caretPos = this.getCaretPosN();\n let {node, offset, selection, move} = caretPos;\n log('beforeinput', e, node, offset, selection, caretPos);\n this.lastNode = this.lastOffset = undefined;\n\n if(e.inputType.startsWith('delete')) { // delete current BOM\n addInputCallback(() => {\n this.processEmptiedFillers(input);\n this.removeExtraBOMs(input);\n this.fixInsertedLineBreaks(input);\n });\n\n if(node?.nodeValue === BOM && selection.isCollapsed && e.inputType.includes('deleteContent')) {\n const toLeft = e.inputType.includes('Backward');\n const moveFirst = (offset === BOM.length && toLeft) || (!offset && !toLeft);\n this.superMove(input, caretPos, toLeft, moveFirst);\n // if((offset === BOM.length && toLeft) || (!offset && !toLeft)) {\n // move(toLeft);\n // }\n\n // addInputCallback(() => {\n // removePossibleBOMSiblingsByNode(getFiller(node));\n // });\n\n // if(node.parentNode.childNodes.length === 1) {\n // (node.parentNode as HTMLElement).remove();\n // move(e.inputType.includes('Backward') ? false : true);\n // } else {\n // move(e.inputType.includes('Backward') ? true : false);\n // addInputCallback(() => {\n // move(e.inputType.includes('Backward') ? false : true);\n // });\n // }\n\n // for(let i = 0, length = BOM.length + (direction === 'backward' ? offset : BOM.length - offset); i < length; ++i) {\n // selection.modify('extend', direction, 'character');\n // }\n\n // selection.modify('extend', direction, 'character');\n // selection.modify('extend', direction, 'character');\n\n // selection.deleteFromDocument();\n // e.preventDefault();\n } else {\n // const filler = getFiller(node);\n // if(filler?.classList?.contains('input-filler-text')) {\n // const {previousSibling, nextSibling} = filler;\n // addInputCallback(() => {\n // if(!filler.isConnected) {\n // removePossibleBOMSiblings(previousSibling, nextSibling);\n // }\n // // removeExtraBOMs();\n // // processEmptiedFillers();\n // });\n // }\n // addInputCallback(() => {\n // this.fixInsertedLineBreaks(input);\n // });\n }\n } else if(e.inputType.startsWith('insert')) { // clear current BOM\n if((node as HTMLElement)?.classList?.contains('input-something')/* || (node.textContent === BOM && offset === BOM.length) */) {\n node = node.previousSibling.firstChild;\n const range = selection.getRangeAt(0);\n range.setStart(node, 0);\n range.setEnd(node, 0);\n range.collapse(true);\n // selection.modify('move', 'backward', 'character');\n\n const c = this.getCaretPosN();\n node = c.node;\n selection = c.selection;\n offset = c.offset;\n }\n if(node && node.textContent === BOM && offset === BOM.length) {\n // const range = selection.getRangeAt(0);\n // range.setStart(node, 0);\n // range.setEnd(node, 0);\n // range.collapse(true);\n selection.modify('move', 'backward', 'character');\n\n const c = this.getCaretPosN();\n node = c.node;\n selection = c.selection;\n offset = c.offset;\n }\n // if(node && node.textContent === BOM && offset === 0) {\n // selection.modify('move', 'forward', 'character');\n // offset = BOM.length;\n // }\n\n if(e.inputType === 'insertLineBreak' || true) {\n // const appendix = 'X';\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // selection.modify('move', 'forward', 'character');\n // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n /* if(node?.nodeValue === BOM) */ {\n // const parent = node.parentElement;\n // parent.contentEditable = 'false';\n // addInputCallback(() => {\n // parent.contentEditable = 'inherit';\n // });\n // node.parentElement.remove();\n\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // // selection.modify('move', 'forward', 'character');\n // // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n // fix case when focused somehow on span instead of text node\n if(node && node.nodeType === node.ELEMENT_NODE) {\n node = node.firstChild;\n log.warn('fixing focus on span');\n }\n\n const isBOM = node?.nodeValue === BOM;\n log('inserting line break', isBOM, node, `\"${node?.nodeValue}\"`, node?.parentElement ? Array.from(node.parentElement.childNodes).slice() : []);\n if(isBOM) {\n // (node as ChildNode).replaceWith(this.messageInput.querySelector('.lol'));\n\n const parentElement = node.parentElement;\n parentElement.classList.replace('input-filler', 'input-filler-text');\n const childNodesLength = parentElement.childNodes.length;\n addInputCallback(() => {\n const newChildNodesLength = parentElement.childNodes.length;\n if(newChildNodesLength > 1/* && newChildNodesLength !== childNodesLength */) {\n log('inserting line break, remove');\n node = Array.from(parentElement.childNodes).find((node) => node.nodeValue === BOM);\n (parentElement as any).t = node;\n // node?.remove();\n\n // const n = parentElement.firstChild;\n // const range = selection.getRangeAt(0);\n // range.setStart(n, n.nodeValue.length);\n // range.setEnd(n, n.nodeValue.length);\n } else if(node.nodeValue !== BOM) {\n log('inserting line break, deleteData');\n (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // node = document.createTextNode(BOM);\n }\n\n this.fixInsertedLineBreaks(input);\n // (parentElement as any).t = node;\n // node.remove();\n });\n // addInputCallback(() => {\n // node.parentElement.classList.replace('input-filler', 'input-filler3');\n // const s = document.createElement('span');\n // s.style.display = 'none';\n // node.replaceWith(s);\n // s.prepend(node);\n // });\n } else if(e.inputType === 'insertLineBreak') {\n addInputCallback(() => {\n this.fixInsertedLineBreaks(input);\n });\n // const range = selection.getRangeAt(0);\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n\n // addInputCallback(() => {\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'false';\n // });\n\n // selection.removeAllRanges();\n // selection.addRange(range);\n // }, false);\n }/* else if(node &&\n node.nodeType === node.TEXT_NODE &&\n node.nodeValue.length === offset) {\n\n } */\n\n // if(e.inputType === 'insertLineBreak') {\n // e.preventDefault();\n // document.execCommand('insertHTML', false, '\\n');\n\n // this.messageInputField.simulateInputEvent();\n // }\n\n // node.parentElement.replaceWith(node);\n // selection.removeAllRanges();\n // const range = new Range();\n // range.setStart(node, 0);\n // range.setEnd(node, node.nodeValue.length);\n // selection.addRange(range);\n // node.parentElement.classList.remove('input-filler');\n // node.parentElement\n }\n\n // document.execCommand('insertHTML', false, '\\n');\n // e.preventDefault();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // if(node?.nodeValue === BOM) {\n // addInputCallback(() => {\n // node.remove();\n // });\n // }\n // this.messageInputField.simulateInputEvent();\n\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'inherit';\n // });\n // addInputCallback(() => {\n // this.messageInput.querySelectorAll('.input-something').forEach((el) => {\n // el.contentEditable = 'false';\n // });\n // });\n return;\n }\n\n if(node?.nodeValue === BOM) {\n // node.nodeValue = ''; // ! will move cursor forward\n // addInputCallback(() => {\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // });\n\n if(e.inputType === 'insertLineBreak') {\n if(offset === BOM.length) {\n selection.modify('move', 'backward', 'character');\n }\n\n // if(offset !== BOM.length) {\n // selection.modify('move', 'forward', 'character');\n // }\n\n addInputCallback(() => {\n node.remove();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // selection.modify('move', 'forward', 'character');\n\n setTimeout(() => {\n selection.modify('move', 'forward', 'character');\n }, 0);\n });\n }\n\n // node.parentElement.replaceWith(node);\n\n // node.parentElement.replaceWith(node);\n if(e.inputType === 'insertLineBreak') {\n // const previousParentSibling = node.parentNode.previousSibling;\n // addInputCallback(() => {\n // if(previousParentSibling.nextSibling.nodeValue === '\\n') {\n // previousParentSibling.nextSibling.remove();\n\n // setTimeout(() => {\n // // selection.modify('move', 'forward', 'character');\n // // selection.modify('move', 'forward', 'character');\n // }, 0);\n // } else {\n // previousParentSibling.nextSibling.nodeValue = previousParentSibling.nextSibling.nodeValue.replace('\\n\\n', '\\n');\n // }\n // });\n } else {\n // if(node.parentElement !== this.messageInput) {\n // node.parentElement.replaceWith(node);\n // }\n\n // setTimeout(() => {\n // this.log(JSON.stringify(node.parentElement.innerHTML));\n // node.nodeValue = node.nodeValue.replace(BOM, '');\n // // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // this.log(JSON.stringify(node.parentElement.innerHTML));\n // }, 1000);\n\n addInputCallback(() => {\n (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n if(!node.nodeValue) {\n node.remove();\n }\n\n // selection.modify('move', 'forward', 'character');\n });\n }\n\n if(selection.isCollapsed && false) {\n node.parentElement.replaceWith(node);\n // const textNode = document.createTextNode(BOM);\n // (node.parentNode as any as ChildNode).after(textNode);\n // setCaretAt(textNode.nextSibling);\n // selection.modify('move', 'forward', 'character');\n node.remove();\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(BOM), BOM.length);\n // selection.modify('move', 'forward', 'character');\n // selection.collapseToEnd();\n\n // addInputCallback(() => {\n // (textNode as CharacterData).deleteData(textNode.nodeValue.indexOf(BOM), BOM.length);\n // node.parentElement.remove();\n // });\n }\n } else if(e.inputType === 'insertLineBreak' &&\n node &&\n node.nodeType === node.TEXT_NODE &&\n node.nodeValue.length === offset) {\n log('inserting line break');\n // const appendix = '\\x01';\n\n input.querySelectorAll('.input-something').forEach((el) => {\n el.contentEditable = 'inherit';\n });\n addInputCallback(() => {\n input.querySelectorAll('.input-something').forEach((el) => {\n el.contentEditable = 'false';\n });\n });\n\n // const textNode = document.createTextNode(appendix);\n // if(node.parentElement !== this.messageInput) node.parentElement.after(textNode);\n // else node.after(textNode);\n // // selection.modify('move', 'forward', 'character');\n // addInputCallback(() => {\n // textNode.remove();\n // });\n\n // const offset = node.nodeValue.length;\n // (node as CharacterData).insertData(offset, appendix);\n // addInputCallback(() => {\n // selection.modify('move', 'forward', 'character');\n // (node as CharacterData).deleteData(node.nodeValue.indexOf(appendix), appendix.length);\n // if(!node.nodeValue) {\n // node.remove();\n // }\n // });\n }\n } else if(e.inputType === 'historyUndo') { // have to remove extra BOMs\n addInputCallback(() => {\n this.processFilledFillers(input);\n this.processEmptiedFillers(input);\n this.removeExtraBOMs(input);\n this.removeEmptyTextNodes(input);\n\n // ! lol what, caret will be at the wrong position, have to set it to the same\n this.fixBuggedCaret();\n\n // lol\n // this.messageInput.querySelectorAll('.has-text').forEach((el) => {\n // if(el.textContent === BOM) {\n // el.firstElementChild.replaceWith(el.firstElementChild.firstChild);\n // el.classList.replace('input-filler3', 'input-filler');\n // }\n // });\n });\n } else if(e.inputType === 'historyRedo') {\n // if(node?.nodeValue === BOM && offset === BOM.length) {\n // selection.modify('move', 'backward', 'character');\n // }\n\n addInputCallback(() => {\n this.processFilledFillers(input);\n this.processEmptiedFillers(input);\n\n // fix contenteditable attribute\n input.querySelectorAll('.input-something:not([contenteditable])').forEach((el) => {\n el.contentEditable = 'false';\n });\n\n this.removeExtraBOMs(input);\n\n // ! lol what, caret will be at the wrong position, have to set it to the same\n this.fixBuggedCaret();\n });\n }\n };\n\n private onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n\n // // have to ignore line up and down\n if(key === 'ArrowDown' || key === 'ArrowUp') {\n this.lastNode = this.lastOffset = undefined;\n } else {\n const {node, offset} = this.getCaretPosN();\n this.lastNode = node/* getFiller(node) */, this.lastOffset = offset;\n if(this.lastNode === this.input) {\n this.lastNode = this.lastOffset = undefined;\n }\n }\n\n this.log('keydown', this.lastNode, this.lastNode?.parentNode, this.lastOffset, this.getCaretPosN(), e);\n };\n\n private addInputCallback(input: HTMLElement, callback: () => void, capture = true) {\n const newCallback = () => {\n this.log('input modify callback');\n callback();\n };\n\n if(capture && IS_FIREFOX) this.inputCaptureCallbacks.push(newCallback);\n else this.listenerSetter.add(input)('input', newCallback, {once: true, capture});\n }\n\n public removeExtraBOMs(input: HTMLElement) {\n const c = (sibling: ChildNode) => {\n return (sibling as HTMLElement)?.classList?.contains('input-something');\n };\n\n input.querySelectorAll('.input-filler').forEach((el) => {\n const {previousSibling, nextSibling} = el;\n let needed = false;\n\n // if(!(previousSibling as HTMLElement)?.classList?.contains('input-filler') && isCustomFillerNeededBySiblingNode(previousSibling)) {\n if(!(nextSibling as HTMLElement)?.classList?.contains('input-filler') && isCustomFillerNeededBySiblingNode(nextSibling)) {\n needed = c(previousSibling) || c(nextSibling);\n }\n\n if(!needed) {\n this.log.warn('removing empty bom node', el);\n el.remove();\n }\n });\n }\n\n private getFiller(node: Node) {\n return node && node.nodeType === node.TEXT_NODE && node.parentElement !== this.input ? node.parentElement : node as HTMLElement;\n }\n\n private getCaretPosN() {\n const ret = getCaretPosNew(this.input);\n // const {node} = ret;\n // if((node as HTMLElement)?.classList?.contains('input-something')) {\n // ret.node = node.previousSibling;\n // ret.offset = ret.node.textContent.length;\n // }\n\n return {...ret, move: this.move.bind(this, ret.selection)};\n }\n\n private removeEmptyTextNodes(input: HTMLElement) {\n const {log} = this;\n // let i = -1;\n // remove empty text nodes\n const treeWalker = document.createTreeWalker(\n input,\n NodeFilter.SHOW_TEXT,\n {acceptNode: (node) => node.parentElement === input && !node.nodeValue/* && !++i */ ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT}\n );\n\n let textNode: Text;\n while(textNode = treeWalker.nextNode() as Text) {\n log.warn('removing empty text node', textNode);\n textNode.remove();\n }\n }\n\n private removePossibleBOMSiblings(previousSibling: ChildNode, nextSibling: ChildNode) {\n [previousSibling, nextSibling].forEach((sibling) => {\n if((sibling as HTMLElement)?.classList?.contains('input-filler')) {\n sibling.remove();\n }\n });\n }\n\n private removePossibleBOMSiblingsByNode(node: ChildNode) {\n const {previousSibling, nextSibling} = node;\n this.removePossibleBOMSiblings(previousSibling, nextSibling);\n };\n\n private processEmptiedFillers(input: HTMLElement) {\n input.querySelectorAll('.input-filler-text').forEach((el) => {\n this.removeExtraBOMs(el);\n\n let cleanSiblings = true;\n if(!el.textContent) {\n el.classList.replace('input-filler-text', 'input-filler');\n\n const textNode = Array.from(el.childNodes).find((node) => node.nodeType === node.TEXT_NODE);\n if(textNode) {\n (textNode as CharacterData).insertData(0, BOM);\n } else if(((el as any).t as ChildNode)?.nodeValue) {\n el.append((el as any).t);\n } else {\n el.append(document.createTextNode(BOM));\n }\n } else if(!NOT_ONLY_BOMS_REG_EXP.test(el.textContent) && !el.querySelector('.input-something')) {\n el.classList.replace('input-filler-text', 'input-filler');\n } else {\n cleanSiblings = false;\n }\n\n if(cleanSiblings) {\n this.removePossibleBOMSiblingsByNode(el);\n }\n });\n }\n\n private processFilledFillers(input: HTMLElement) {\n // remove the BOM when changing to text\n input.querySelectorAll('.input-filler').forEach((el) => {\n if(el.textContent !== BOM) {\n el.classList.replace('input-filler', 'input-filler-text');\n const t = (el as any).t as ChildNode;\n const bomNode = Array.from(el.childNodes).find((node) => node.nodeType === node.TEXT_NODE && node.nodeValue.includes(BOM));\n if(bomNode && !t?.nodeValue) {\n const idx = bomNode.nodeValue.indexOf(BOM);\n if(idx !== -1) {\n (bomNode as CharacterData).deleteData(idx, BOM.length);\n }\n }\n\n // t?.remove();\n }\n });\n }\n\n private setSelectionClassName(selection: Selection, input?: HTMLElement) {\n // Array.from(this.messageInput.querySelectorAll('.selection')).forEach((element) => {\n // element.classList.remove('selection');\n // });\n\n if(selection.rangeCount) {\n const range = selection.getRangeAt(0);\n\n if(input) {\n Array.from(input.querySelectorAll('.input-selectable')).forEach((element) => {\n element.classList.toggle('selection', !range.collapsed && range.intersectsNode(element));\n });\n } else {\n Array.from(document.querySelectorAll('.input-selectable.selection')).forEach((element) => element.classList.remove('selection'));\n }\n }\n }\n\n private move(selection: Selection, left: boolean) {\n const {focusNode: focusNodeBefore, focusOffset: focusOffsetBefore} = selection;\n selection.modify('extend', left ? 'backward' : 'forward', 'character');\n // if(offset === nodeValue.length) {\n // selection.modify('extend', !left ? 'backward' : 'forward', 'character');\n // }\n if(left) selection.collapseToStart();\n else selection.collapseToEnd();\n const {focusNode: focusNodeAfter, focusOffset: focusOffsetAfter} = selection;\n this.log(\n 'moving cursor',\n left,\n focusNodeBefore,\n focusNodeBefore.nodeType === focusNodeBefore.ELEMENT_NODE ? focusNodeBefore : focusNodeBefore.parentElement,\n focusOffsetBefore,\n focusNodeAfter,\n focusNodeAfter.nodeType === focusNodeAfter.ELEMENT_NODE ? focusNodeAfter : focusNodeAfter.parentElement,\n focusOffsetAfter\n );\n }\n\n public prepareApplyingMarkdown() {\n const {input} = this;\n\n // do not wrap fillers into spans\n const fillers = input.querySelectorAll('.input-filler');\n // fillers.forEach((el) => {\n // el.contentEditable = 'false';\n // });\n\n const smths = input.querySelectorAll('.input-something');\n smths.forEach((el) => {\n el.contentEditable = 'inherit';\n });\n\n return () => {\n fillers.forEach((el) => {\n el.contentEditable = 'inherit';\n });\n\n smths.forEach((el) => {\n el.contentEditable = 'false';\n });\n\n this.removeExtraBOMs(input);\n };\n }\n\n public static getInstance() {\n return this.INSTANCE ??= new RichInputHandler();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {ScrollableBase} from '../../components/scrollable';\nimport SwipeHandler from '../../components/swipeHandler';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport rootScope from '../../lib/rootScope';\nimport {Middleware} from '../middleware';\nimport clamp from '../number/clamp';\nimport safeAssign from '../object/safeAssign';\nimport pause from '../schedulers/pause';\nimport cancelEvent from './cancelEvent';\nimport {attachClickEvent} from './clickEvent';\nimport findUpAsChild from './findUpAsChild';\nimport positionElementByIndex from './positionElementByIndex';\nimport whichChild from './whichChild';\n\nexport default class Sortable {\n private element: HTMLElement;\n private elementRect: DOMRect;\n private containerRect: DOMRect;\n private scrollableRect: DOMRect;\n private minY: number;\n private maxY: number;\n private siblings: HTMLElement[];\n private swipeHandler: SwipeHandler;\n private startScrollPos: number;\n private addScrollPos: number;\n\n private list: HTMLElement;\n private middleware: Middleware;\n private onSort: (prevIdx: number, newIdx: number) => void;\n private scrollable: ScrollableBase;\n\n constructor(options: {\n list: HTMLElement,\n middleware: Middleware,\n onSort: Sortable['onSort'],\n scrollable?: Sortable['scrollable']\n }) {\n safeAssign(this, options);\n\n this.swipeHandler = new SwipeHandler({\n element: this.list,\n onSwipe: this.onSwipe,\n verifyTouchTarget: this.verifyTouchTarget,\n onStart: this.onStart,\n onReset: this.onReset,\n setCursorTo: document.body,\n middleware: this.middleware,\n withDelay: true\n });\n }\n\n private onSwipe = (xDiff: number, yDiff: number) => {\n yDiff = clamp(yDiff, this.minY, this.maxY);\n this.element.style.transform = `translateY(${yDiff}px)`;\n const count = Math.round(Math.abs(yDiff) / this.elementRect.height);\n const lastSiblings = this.siblings;\n this.siblings = [];\n const property = yDiff < 0 ? 'previousElementSibling' : 'nextElementSibling';\n let sibling = this.element[property] as HTMLElement;\n for(let i = 0; i < count; ++i) {\n if(this.getSortableTarget(sibling)) {\n this.siblings.push(sibling);\n sibling = sibling[property] as HTMLElement;\n } else {\n break;\n }\n }\n\n (lastSiblings || []).forEach((sibling) => {\n if(!this.siblings.includes(sibling)) {\n sibling.style.transform = '';\n }\n });\n\n this.siblings.forEach((sibling) => {\n const y = this.elementRect.height * (yDiff < 0 ? 1 : -1);\n sibling.style.transform = `translateY(${y}px)`;\n });\n\n if(this.scrollableRect) {\n const diff = yDiff;\n const toEnd = diff > 0;\n const elementEndPos = toEnd ? this.elementRect.bottom : this.elementRect.top;\n const clientY = elementEndPos + diff - this.addScrollPos;\n // console.log(clientY, this.scrollableRect.top, elementEndPos, diff, this.addScrollPos, toEnd);\n let change = 2;\n if((clientY + (toEnd ? 0 : this.elementRect.height)) >= this.scrollableRect.bottom/* && diff < this.maxY */) {\n\n } else if((clientY - (toEnd ? this.elementRect.height : 0)) <= this.scrollableRect.top/* && diff > this.minY */) {\n change *= -1;\n } else {\n change = undefined;\n }\n\n if(change !== undefined) {\n this.scrollable.container[this.scrollable.scrollProperty] += change;\n }\n }\n };\n\n private verifyTouchTarget = (e: {target: EventTarget}) => {\n if(this.list.classList.contains('is-reordering')) {\n return false;\n }\n\n this.element = this.getSortableTarget(e.target as HTMLElement);\n return !!this.element/* && pause(150).then(() => true) */;\n };\n\n private onScroll = () => {\n const scrollPos = this.scrollable.container[this.scrollable.scrollProperty];\n const diff = this.addScrollPos = scrollPos - this.startScrollPos;\n const isVertical = this.scrollable.scrollProperty === 'scrollTop';\n this.swipeHandler.add(isVertical ? 0 : diff, isVertical ? diff : 0);\n };\n\n private onStart = () => {\n this.list.classList.add('is-reordering');\n this.element.classList.add('is-dragging', 'no-transition');\n this.swipeHandler.setCursor('grabbing');\n this.elementRect = this.element.getBoundingClientRect();\n this.containerRect = this.list.getBoundingClientRect();\n\n this.minY = this.containerRect.top - this.elementRect.top;\n this.maxY = this.containerRect.bottom - this.elementRect.bottom;\n this.addScrollPos = 0;\n\n if(this.scrollable) {\n this.startScrollPos = this.scrollable.container[this.scrollable.scrollProperty];\n this.scrollableRect = this.scrollable.container.getBoundingClientRect();\n this.scrollable.container.addEventListener('scroll', this.onScroll);\n }\n };\n\n private onReset = async() => {\n const length = this.siblings.length;\n const move = length && length * (this.siblings[0].previousElementSibling === this.element ? 1 : -1);\n const idx = whichChild(this.element);\n const newIdx = idx + move;\n\n this.element.classList.remove('no-transition');\n this.element.style.transform = move ? `translateY(${move * this.elementRect.height}px)` : '';\n this.swipeHandler.setCursor('');\n\n if(this.scrollable) {\n this.scrollable.container.removeEventListener('scroll', this.onScroll);\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n attachClickEvent(document.body, cancelEvent, {capture: true, once: true});\n }\n\n if(rootScope.settings.animationsEnabled) {\n await pause(250);\n }\n\n this.list.classList.remove('is-reordering');\n this.element.classList.remove('is-dragging');\n positionElementByIndex(this.element, this.list, newIdx, idx);\n [this.element, ...this.siblings].forEach((element) => {\n element.style.transform = '';\n });\n\n this.element =\n this.siblings =\n this.elementRect =\n this.containerRect =\n this.minY =\n this.maxY =\n this.startScrollPos =\n this.addScrollPos =\n undefined;\n\n // cancelClick = true;\n\n if(!move) {\n return;\n }\n\n this.onSort(idx, newIdx);\n };\n\n private getSortableTarget(target: HTMLElement) {\n if(!target) {\n return;\n }\n\n let child = findUpAsChild(target as HTMLElement, this.list);\n if(child && child.classList.contains('cant-sort')) {\n child = undefined;\n }\n\n return child;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function toggleDisability(elements: HTMLElement[], disable: boolean): () => void {\n if(disable) {\n elements.forEach((el) => el.setAttribute('disabled', 'true'));\n } else {\n elements.forEach((el) => el.removeAttribute('disabled'));\n }\n\n return () => toggleDisability(elements, !disable);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function whichChild(elem: Node, countNonElements?: boolean) {\n if(!elem.parentNode) {\n return -1;\n }\n\n if(countNonElements) {\n return Array.from(elem.parentNode.childNodes).indexOf(elem as ChildNode);\n }\n\n let i = 0;\n // @ts-ignore\n while((elem = elem.previousElementSibling) !== null) ++i;\n return i;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent, detachClickEvent} from './dom/clickEvent';\nimport findUpAsChild from './dom/findUpAsChild';\nimport EventListenerBase from './eventListenerBase';\nimport ListenerSetter from './listenerSetter';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport safeAssign from './object/safeAssign';\nimport appNavigationController, {NavigationItem} from '../components/appNavigationController';\nimport findUpClassName from './dom/findUpClassName';\nimport rootScope from '../lib/rootScope';\n\nconst KEEP_OPEN = false;\nconst TOGGLE_TIMEOUT = 200;\nconst ANIMATION_DURATION = 200;\n\nexport type IgnoreMouseOutType = 'click' | 'menu' | 'popup';\ntype DropdownHoverTimeoutType = 'toggle' | 'done';\n\nexport default class DropdownHover extends EventListenerBase<{\n open: () => Promise | void,\n openAfterLayout: () => void,\n opened: () => any,\n close: () => any,\n closed: () => any\n}> {\n protected element: HTMLElement;\n protected forceClose: boolean;\n protected inited: boolean;\n protected ignoreMouseOut: Set;\n protected ignoreButtons: Set;\n protected navigationItem: NavigationItem;\n protected ignoreOutClickClassName: string;\n protected timeouts: {[type in DropdownHoverTimeoutType]?: number};\n\n constructor(options: {\n element: DropdownHover['element'],\n ignoreOutClickClassName?: string\n }) {\n super(false);\n safeAssign(this, options);\n this.forceClose = false;\n this.inited = false;\n this.ignoreMouseOut = new Set();\n this.ignoreButtons = new Set();\n this.timeouts = {};\n }\n\n public attachButtonListener(\n button: HTMLElement,\n listenerSetter: ListenerSetter\n ) {\n let firstTime = true;\n if(IS_TOUCH_SUPPORTED) {\n attachClickEvent(button, () => {\n if(firstTime) {\n firstTime = false;\n this.toggle(true);\n } else {\n this.toggle();\n }\n }, {listenerSetter});\n } else {\n listenerSetter.add(button)('mouseover', (e) => {\n if(firstTime) {\n listenerSetter.add(button)('mouseout', (e) => {\n this.clearTimeout('toggle');\n this.onMouseOut(e);\n });\n firstTime = false;\n }\n\n this.setTimeout('toggle', () => {\n this.toggle(true);\n }, TOGGLE_TIMEOUT);\n });\n\n attachClickEvent(button, () => {\n const type: IgnoreMouseOutType = 'click';\n const ignore = !this.ignoreMouseOut.has(type);\n\n if(ignore && !this.ignoreMouseOut.size) {\n this.ignoreButtons.add(button);\n setTimeout(() => {\n attachClickEvent(window, this.onClickOut, {capture: true});\n }, 0);\n }\n\n this.setIgnoreMouseOut(type, ignore);\n this.toggle(ignore);\n }, {listenerSetter});\n }\n }\n\n protected onClickOut = (e: MouseEvent) => {\n const target = e.target as HTMLElement;\n if(\n !findUpAsChild(target, this.element) &&\n !Array.from(this.ignoreButtons).some((button) => findUpAsChild(target, button) || target === button) &&\n this.ignoreMouseOut.size <= 1 &&\n (!this.ignoreOutClickClassName || !findUpClassName(target, this.ignoreOutClickClassName))\n ) {\n this.toggle(false);\n }\n };\n\n protected onMouseOut = (e: MouseEvent) => {\n if(KEEP_OPEN || !this.isActive()) return;\n this.clearTimeout('toggle');\n\n if(this.ignoreMouseOut.size) {\n return;\n }\n\n const toElement = (e as any).toElement as HTMLElement;\n if(toElement && findUpAsChild(toElement, this.element)) {\n return;\n }\n\n this.setTimeout('toggle', () => {\n this.toggle(false);\n }, TOGGLE_TIMEOUT);\n };\n\n protected clearTimeout(type: DropdownHoverTimeoutType) {\n if(this.timeouts[type] !== undefined) {\n clearTimeout(this.timeouts[type]);\n delete this.timeouts[type];\n }\n }\n\n protected setTimeout(type: DropdownHoverTimeoutType, cb: () => void, timeout: number) {\n this.clearTimeout(type);\n this.timeouts[type] = window.setTimeout(() => {\n this.clearTimeout(type);\n cb();\n }, timeout);\n }\n\n public init() {\n if(!IS_TOUCH_SUPPORTED) {\n this.element.onmouseout = this.onMouseOut;\n this.element.onmouseover = (e) => {\n if(this.forceClose) {\n return;\n }\n\n // console.log('onmouseover element');\n this.clearTimeout('toggle');\n };\n }\n }\n\n public toggle = async(enable?: boolean) => {\n // if(!this.element) return;\n const willBeActive = (!!this.element.style.display && enable === undefined) || enable;\n if(this.init) {\n if(willBeActive) {\n this.init();\n this.init = null;\n } else {\n return;\n }\n }\n\n if(willBeActive === this.isActive()) {\n return;\n }\n\n const delay = IS_TOUCH_SUPPORTED || !rootScope.settings.animationsEnabled ? 0 : ANIMATION_DURATION;\n if((this.element.style.display && enable === undefined) || enable) {\n const res = this.dispatchResultableEvent('open');\n await Promise.all(res);\n\n this.element.style.display = '';\n void this.element.offsetLeft; // reflow\n this.element.classList.add('active');\n\n this.dispatchEvent('openAfterLayout');\n\n appNavigationController.pushItem(this.navigationItem = {\n type: 'dropdown',\n onPop: () => {\n this.toggle(false);\n }\n });\n\n this.clearTimeout('toggle');\n this.setTimeout('done', () => {\n this.forceClose = false;\n this.dispatchEvent('opened');\n }, delay);\n\n // ! can't use together with resizeObserver\n /* if(isTouchSupported) {\n const height = this.element.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\n console.log('[ESG]: toggle: enable height', height);\n appImManager.chat.bubbles.scrollable.scrollTop += height;\n } */\n\n /* if(touchSupport) {\n this.restoreScroll();\n } */\n } else {\n this.dispatchEvent('close');\n this.ignoreMouseOut.clear();\n this.ignoreButtons.clear();\n\n this.element.classList.remove('active');\n\n appNavigationController.removeItem(this.navigationItem);\n detachClickEvent(window, this.onClickOut, {capture: true});\n\n this.clearTimeout('toggle');\n this.setTimeout('done', () => {\n this.element.style.display = 'none';\n this.forceClose = false;\n this.dispatchEvent('closed');\n }, delay);\n\n /* if(isTouchSupported) {\n const scrollHeight = this.container.scrollHeight;\n if(scrollHeight) {\n const height = this.container.scrollHeight + appImManager.chat.input.inputContainer.scrollHeight - 10;\n appImManager.chat.bubbles.scrollable.scrollTop -= height;\n }\n } */\n\n /* if(touchSupport) {\n this.restoreScroll();\n } */\n }\n\n // animationIntersector.checkAnimations(false, EMOTICONSSTICKERGROUP);\n };\n\n public isActive() {\n return this.element.classList.contains('active');\n }\n\n public setIgnoreMouseOut(type: IgnoreMouseOutType, ignore: boolean) {\n ignore ? this.ignoreMouseOut.add(type) : this.ignoreMouseOut.delete(type);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's fastSmoothScroll slightly patched\n\nimport {dispatchHeavyAnimationEvent} from '../hooks/useHeavyAnimationCheck';\nimport {fastRafPromise} from './schedulers';\nimport {animateSingle, cancelAnimationByKey} from './animation';\nimport rootScope from '../lib/rootScope';\nimport isInDOM from './dom/isInDOM';\n\nconst MIN_JS_DURATION = 250;\nconst MAX_JS_DURATION = 600;\nconst LONG_TRANSITION_MAX_DISTANCE = 1500;\nconst SHORT_TRANSITION_MAX_DISTANCE = 500;\n\nexport enum FocusDirection {\n Up,\n Down,\n Static,\n};\n\nexport type ScrollGetNormalSizeCallback = (options: {rect: DOMRect}) => number;\nexport type ScrollGetElementPositionCallback = (options: {elementRect: DOMRect, containerRect: DOMRect, elementPosition: number}) => number;\nexport type ScrollStartCallbackDimensions = {\n scrollSize: number,\n scrollPosition: number,\n distanceToEnd: number,\n path: number,\n duration: number,\n containerRect: DOMRect,\n elementRect: DOMRect,\n getProgress: () => number\n};\n\nexport type ScrollOptions = {\n container: HTMLElement,\n element: HTMLElement,\n position: ScrollLogicalPosition,\n margin?: number,\n maxDistance?: number,\n forceDirection?: FocusDirection,\n forceDuration?: number,\n axis?: 'x' | 'y',\n getNormalSize?: ScrollGetNormalSizeCallback,\n getElementPosition?: ScrollGetElementPositionCallback,\n fallbackToElementStartWhenCentering?: HTMLElement,\n startCallback?: (dimensions: ScrollStartCallbackDimensions) => void,\n transitionFunction?: (value: number) => number\n};\n\nexport default function fastSmoothScroll(options: ScrollOptions) {\n options.margin ??= 0;\n options.maxDistance ??= LONG_TRANSITION_MAX_DISTANCE;\n options.axis ??= 'y';\n // return;\n\n if(!rootScope.settings.animationsEnabled || options.forceDuration === 0) {\n options.forceDirection = FocusDirection.Static;\n }\n\n if(options.forceDirection === FocusDirection.Static) {\n options.forceDuration = 0;\n return scrollWithJs(options);\n /* return Promise.resolve();\n\n element.scrollIntoView({ block: position });\n\n cancelAnimationByKey(container);\n return Promise.resolve(); */\n }\n\n const promise = fastRafPromise().then(() => scrollWithJs(options));\n\n return options.axis === 'y' ? dispatchHeavyAnimationEvent(promise) : promise;\n}\n\nfunction scrollWithJs(options: ScrollOptions): Promise {\n const {element, container, getNormalSize, getElementPosition, transitionFunction, axis, margin, position, forceDirection, maxDistance, forceDuration} = options;\n if(!isInDOM(element)) {\n cancelAnimationByKey(container);\n return Promise.resolve();\n }\n\n const rectStartKey = axis === 'y' ? 'top' : 'left';\n const rectEndKey = axis === 'y' ? 'bottom' : 'right';\n const sizeKey = axis === 'y' ? 'height' : 'width';\n const scrollSizeKey = axis === 'y' ? 'scrollHeight' : 'scrollWidth';\n const elementScrollSizeKey = axis === 'y' ? 'scrollHeight' : 'offsetWidth'; // can use offsetWidth for X, since it's almost same as scrollWidth\n const scrollPositionKey = axis === 'y' ? 'scrollTop' : 'scrollLeft';\n\n // const { offsetTop: elementTop, offsetHeight: elementHeight } = element;\n const elementRect = element.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect ? container.getBoundingClientRect() : document.body.getBoundingClientRect();\n\n // const transformable = container.firstElementChild as HTMLElement;\n\n const possibleElementPosition = elementRect[rectStartKey] - containerRect[rectStartKey];\n const elementPosition = getElementPosition ? getElementPosition({elementRect, containerRect, elementPosition: possibleElementPosition}) : possibleElementPosition;\n const elementSize = element[elementScrollSizeKey]; // margin is exclusive in DOMRect\n\n const containerSize = getNormalSize ? getNormalSize({rect: containerRect}) : containerRect[sizeKey];\n\n let scrollPosition = container[scrollPositionKey];\n const scrollSize = container[scrollSizeKey];\n /* const elementPosition = element.offsetTop;\n const elementSize = element.offsetHeight;\n\n const scrollPosition = container[scrollPositionKey];\n const scrollSize = container[scrollSizeKey];\n const containerSize = container.offsetHeight; */\n\n let path!: number;\n\n switch(position) {\n case 'start':\n path = elementPosition - margin;\n break;\n case 'end':\n path = elementRect[rectEndKey] /* + (elementSize - elementRect[sizeKey]) */ - containerRect[rectEndKey] + margin;\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n if(elementSize < containerSize) {\n path = (elementPosition + elementSize / 2) - (containerSize / 2);\n } else {\n if(options.fallbackToElementStartWhenCentering && options.fallbackToElementStartWhenCentering !== element) {\n options.element = options.fallbackToElementStartWhenCentering;\n options.position = 'start';\n return scrollWithJs(options);\n }\n\n path = elementPosition - margin;\n }\n\n break;\n }\n /* switch (position) {\n case 'start':\n path = (elementPosition - margin) - scrollPosition;\n break;\n case 'end':\n path = (elementPosition + elementSize + margin) - (scrollPosition + containerSize);\n break;\n // 'nearest' is not supported yet\n case 'nearest':\n case 'center':\n path = elementSize < containerSize\n ? (elementPosition + elementSize / 2) - (scrollPosition + containerSize / 2)\n : (elementPosition - margin) - scrollPosition;\n break;\n } */\n\n if(Math.abs(path - (margin || 0)) < 1) {\n cancelAnimationByKey(container);\n return Promise.resolve();\n }\n\n if(axis === 'y') {\n if(forceDirection === undefined) {\n if(path > maxDistance) {\n scrollPosition = container.scrollTop += path - maxDistance;\n path = maxDistance;\n } else if(path < -maxDistance) {\n scrollPosition = container.scrollTop += path + maxDistance;\n path = -maxDistance;\n }\n }/* else if(forceDirection === FocusDirection.Up) { // * not tested yet\n container.scrollTop = offsetTop + container.scrollTop + maxDistance;\n } else if(forceDirection === FocusDirection.Down) { // * not tested yet\n container.scrollTop = Math.max(0, offsetTop + container.scrollTop - maxDistance);\n } */\n }\n\n // console.log('scrollWithJs: will scroll path:', path, element);\n\n /* let existsTransform = 0;\n const currentTransform = transformable.style.transform;\n if(currentTransform) {\n existsTransform = parseInt(currentTransform.match(/\\((.+?), (.+?), .+\\)/)[2]);\n //path += existsTransform;\n } */\n\n if(path < 0) {\n const remainingPath = -scrollPosition;\n path = Math.max(path, remainingPath);\n } else if(path > 0) {\n const remainingPath = scrollSize - (scrollPosition + containerSize);\n path = Math.min(path, remainingPath);\n }\n\n const target = container[scrollPositionKey] + path;\n const absPath = Math.abs(path);\n const duration = forceDuration ?? (\n MIN_JS_DURATION + (absPath / LONG_TRANSITION_MAX_DISTANCE) * (MAX_JS_DURATION - MIN_JS_DURATION)\n );\n const startAt = Date.now();\n\n /* transformable.classList.add('no-transition');\n\n const tickTransform = () => {\n const t = duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\n const currentPath = path * transition(t);\n\n transformable.style.transform = `translate3d(0, ${-currentPath}px, 0)`;\n container.dataset.translate = '' + -currentPath;\n\n const willContinue = t < 1;\n if(!willContinue) {\n fastRaf(() => {\n delete container.dataset.transform;\n container.dataset.transform = '';\n transformable.style.transform = '';\n void transformable.offsetLeft; // reflow\n transformable.classList.remove('no-transition');\n void transformable.offsetLeft; // reflow\n container[scrollPositionKey] = Math.round(target);\n });\n }\n\n return willContinue;\n };\n\n return animateSingle(tickTransform, container); */\n\n /* return new Promise((resolve) => {\n fastRaf(() => {\n transformable.style.transform = '';\n transformable.style.transition = '';\n\n setTimeout(resolve, duration);\n });\n });\n\n const transformableHeight = transformable.scrollHeight;\n //transformable.style.minHeight = `${transformableHeight}px`;\n */\n\n const transition = transitionFunction ?? (absPath < SHORT_TRANSITION_MAX_DISTANCE ? shortTransition : longTransition);\n const getProgress = () => duration ? Math.min((Date.now() - startAt) / duration, 1) : 1;\n const tick = () => {\n const t = getProgress();\n const value = transition(t);\n const currentPath = path * (1 - value);\n container[scrollPositionKey] = Math.round(target - currentPath);\n\n return t < 1;\n };\n\n if(!duration || !path) {\n cancelAnimationByKey(container);\n tick();\n return Promise.resolve();\n }\n\n /* return new Promise((resolve) => {\n setTimeout(resolve, duration);\n }).then(() => {\n transformable.classList.add('no-transition');\n void transformable.offsetLeft; // reflow\n transformable.style.transform = '';\n transformable.style.transition = '';\n void transformable.offsetLeft; // reflow\n transformable.classList.remove('no-transition');\n void transformable.offsetLeft; // reflow\n fastRaf(() => {\n\n container[scrollPositionKey] = Math.round(target);\n //transformable.style.minHeight = ``;\n });\n\n }); */\n\n if(options.startCallback) {\n const distanceToEnd = scrollSize - Math.round(target + container[axis === 'y' ? 'offsetHeight' : 'offsetWidth']);\n options.startCallback({\n scrollSize,\n scrollPosition,\n distanceToEnd,\n path,\n duration,\n containerRect,\n elementRect,\n getProgress\n });\n }\n\n return animateSingle(tick, container);\n}\n\nfunction longTransition(t: number) {\n return 1 - ((1 - t) ** 5);\n}\n\nfunction shortTransition(t: number) {\n return 1 - ((1 - t) ** 3.5);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {InputFileLocation, InputStickerSet, InputWebFileLocation} from '../layer';\nimport type {DownloadOptions} from '../lib/mtproto/apiFileManager';\n\nconst FILENAME_JOINER = '_';\n\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\n fileName: string,\n downloadId: string\n}>) {\n const fileName = '';// (options?.fileName || '').split('.');\n const ext = fileName[fileName.length - 1] || '';\n\n let str: string;\n switch(location._) {\n case 'inputPhotoFileLocation': {\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputDocumentFileLocation': {\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputPeerPhotoFileLocation':\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\n break;\n\n case 'inputStickerSetThumb': {\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id ||\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name ||\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon ||\n location.stickerset._;\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputFileLocation': {\n str = location.volume_id + '_' + location.local_id;\n break;\n }\n\n case 'inputWebFileLocation': {\n str = ['webFile', location.url].join(FILENAME_JOINER);\n break;\n }\n\n default: {\n console.error('Unrecognized location:', location);\n str = '';\n break;\n }\n }\n\n return str + (options?.downloadId ? '_download' : '') + (ext ? '.' + ext : ext);\n}\n\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\n // console.log('getFileURL', location);\n // const perf = performance.now();\n const encoded = encodeURIComponent(JSON.stringify(options));\n // console.log('getFileURL encode:', performance.now() - perf, encoded);\n\n return /* '/' + */type + '/' + encoded;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Message, MessageAction} from '../layer';\nimport type {MyMessage} from '../lib/appManagers/appMessagesManager';\nimport forEachReverse from './array/forEachReverse';\n\nexport default function filterChatPhotosMessages(value: {\n count: number;\n next_rate: number;\n offset_id_offset: number;\n history: MyMessage[];\n}) {\n forEachReverse(value.history, (message, idx, arr) => {\n if(!((message as Message.messageService).action as MessageAction.messageActionChatEditPhoto).photo) {\n arr.splice(idx, 1);\n if(value.count !== undefined) {\n --value.count;\n }\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {i18n, LangPackKey} from '../lib/langPack';\n\nexport default function formatBytes(bytes: number, decimals: number | 'auto' = 'auto') {\n if(bytes === 0) return i18n('FileSize.B', [0]);\n\n const strictDecimals = decimals === 'auto';\n\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const _decimals = decimals === 'auto' ? Math.max(0, i - 1) : decimals;\n\n const dm = Math.max(0, _decimals);\n const sizes: LangPackKey[] = ['FileSize.B', 'FileSize.KB', 'FileSize.MB', 'FileSize.GB'];\n\n const fixed = (bytes / Math.pow(k, i)).toFixed(dm);\n return i18n(sizes[i], [strictDecimals ? fixed : parseFloat(fixed)]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport I18n, {i18n, join, LangPackKey} from '../lib/langPack';\nimport formatDuration, {DurationType} from './formatDuration';\n\nconst CALL_DURATION_LANG_KEYS: {[type in DurationType]: LangPackKey} = {\n s: 'Seconds',\n m: 'Minutes',\n h: 'Hours',\n d: 'Days',\n w: 'Weeks',\n mm: 'Months',\n y: 'Years'\n};\nexport default function formatCallDuration(duration: number, plain?: boolean) {\n const a = formatDuration(duration, 2);\n if(plain) {\n const strings = a.map((d) => I18n.format(CALL_DURATION_LANG_KEYS[d.type], true, [d.duration]));\n return join(strings, false, plain);\n }\n\n const elements = a.map((d) => i18n(CALL_DURATION_LANG_KEYS[d.type], [d.duration]));\n\n const fragment = document.createElement('span');\n fragment.append(...join(elements, false));\n\n return fragment;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type DurationType = 's' | 'm' | 'h' | 'd' | 'w' | 'mm' | 'y';\nexport default function formatDuration(duration: number, showLast = 2) {\n if(!duration) {\n duration = 1;\n }\n\n const d: {duration: number, type: DurationType}[] = [];\n const p = [\n {m: 1, t: 's'},\n {m: 60, t: 'm'},\n {m: 60, t: 'h'},\n {m: 24, t: 'd'},\n {m: 7, t: 'w'}\n ] as Array<{m?: number, t: DurationType}>\n const s = 1;\n let t = s;\n p.forEach((o, idx) => {\n t = Math.round(t * o.m);\n\n if(duration < t) {\n return;\n }\n\n let dd = duration / t;\n if(idx !== (p.length - 1)) {\n const modulus = p[idx === (p.length - 1) ? idx : idx + 1].m;\n dd %= modulus;\n }\n\n d.push({\n duration: dd | 0,\n type: o.t\n });\n });\n\n const out = d.slice(-showLast).reverse();\n for(let i = out.length - 1; i >= 0; --i) {\n if(out[i].duration === 0) {\n out.splice(i, 1);\n }\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {HelpCountry, HelpCountryCode} from '../layer';\nimport I18n from '../lib/langPack';\n\nlet sortedCountries: HelpCountry[];\ntype PrefixCountry = {country: HelpCountry, code: HelpCountryCode};\nconst prefixes: Map = new Map();\nlet maxPrefixLength = 0;\nconst setPrefix = (country: HelpCountry, code: HelpCountryCode, prefix: string = '') => {\n prefix = code.country_code + prefix;\n /* if(prefixes.has(prefix)) {\n console.error('asdasdasd', prefixes.get(prefix), country, code);\n } */\n maxPrefixLength = Math.max(maxPrefixLength, prefix.length);\n prefixes.set(prefix, {country, code});\n};\n\nexport function formatPhoneNumber(originalStr: string): {\n formatted: string,\n country: HelpCountry,\n code: HelpCountryCode,\n leftPattern: string\n} {\n originalStr = originalStr || '';\n\n if(!prefixes.size) {\n I18n.countriesList.forEach((country) => {\n country.country_codes.forEach((code) => {\n if(code.prefixes) {\n code.prefixes.forEach((prefix) => {\n setPrefix(country, code, prefix);\n });\n } else {\n setPrefix(country, code);\n }\n });\n });\n }\n\n // return {formatted: originalStr, country: undefined as any, leftPattern: ''};\n let str = originalStr.replace(/\\D/g, '');\n const phoneCode = str.slice(0, maxPrefixLength);\n\n // //console.log('str', str, phoneCode);\n // if(!sortedCountries) {\n // sortedCountries = I18n.countriesList.slice().sort((a, b) => b.country_codes[0].country_code.length - a.country_codes[0].country_code.length);\n // }\n\n // let country = sortedCountries.find((c) => {\n // return c.country_codes.find((c) => phoneCode.indexOf(c.replace(/\\D/g, '')) === 0);\n // });\n\n let prefixCountry: PrefixCountry;\n for(let i = phoneCode.length - 1; i >= 0; --i) { // lookup for country by prefix\n prefixCountry = prefixes.get(phoneCode.slice(0, i + 1));\n if(prefixCountry) {\n break;\n }\n }\n\n if(!prefixCountry) {\n return {\n formatted: str,\n country: undefined,\n code: undefined,\n leftPattern: ''\n };\n }\n\n // country = /* PhoneCodesMain[country.phoneCode] || */country;\n const country = prefixCountry.country;\n\n const patterns = prefixCountry.code.patterns || [];\n const searchForPattern = str.slice(prefixCountry.code.country_code.length); // splice country code\n let pattern = '', mostMatchedPatternMatches = 0, mostMatchedPattern = '';\n for(let i = patterns.length - 1; i >= 0; --i) {\n pattern = patterns[i];\n\n const _pattern = pattern.replace(/ /g, '');\n let patternMatches = 0;\n for(let k = 0, length = Math.min(searchForPattern.length, _pattern.length); k < length; ++k) {\n if(searchForPattern[k] === _pattern[k]) {\n patternMatches += 1.01;\n } else if(_pattern[k] === 'X') {\n ++patternMatches;\n } else {\n patternMatches = 0;\n break;\n }\n }\n\n if(patternMatches > mostMatchedPatternMatches) {\n mostMatchedPatternMatches = patternMatches;\n mostMatchedPattern = pattern;\n }\n }\n\n pattern = mostMatchedPattern || pattern;\n pattern = pattern.replace(/\\d/g, 'X');\n\n pattern = prefixCountry.code.country_code + ' ' + pattern;\n // let pattern = country.pattern || country.phoneCode;\n pattern.split('').forEach((symbol, idx) => {\n if(symbol === ' ' && str[idx] !== ' ' && str.length > idx) {\n str = str.slice(0, idx) + ' ' + str.slice(idx);\n }\n });\n\n /* if(country.pattern) {\n str = str.slice(0, country.pattern.length);\n } */\n\n let leftPattern = pattern && pattern.length > str.length ? pattern.slice(str.length) : '';\n if(leftPattern) {\n /* const length = str.length;\n leftPattern = leftPattern.split('').map((_, idx) => (length + idx).toString().slice(-1)).join(''); */\n leftPattern = leftPattern.replace(/X/g, '‒');\n // leftPattern = leftPattern.replace(/X/g, '0');\n }\n\n return {formatted: str, country, code: prefixCountry.code, leftPattern};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {RLottieColor} from '../lib/rlottie/rlottiePlayer';\n\nexport type FramesCacheMap = Map;\nexport type FramesCacheMapNew = Map;\nexport type FramesCacheMapURLs = Map;\nexport type FramesCacheItem = {\n frames: FramesCacheMap,\n framesNew: FramesCacheMapNew,\n framesURLs: FramesCacheMapURLs,\n clearCache: () => void,\n counter: number\n};\n\nexport class FramesCache {\n private cache: Map;\n\n constructor() {\n this.cache = new Map();\n }\n\n public static createCache(): FramesCacheItem {\n const cache: FramesCacheItem = {\n frames: new Map(),\n framesNew: new Map(),\n framesURLs: new Map(),\n clearCache: () => {\n cache.framesNew.forEach((value) => {\n (value as ImageBitmap).close?.();\n });\n\n cache.frames.clear();\n cache.framesNew.clear();\n cache.framesURLs.clear();\n },\n counter: 0\n };\n\n return cache;\n }\n\n public getCache(name: string) {\n let cache = this.cache.get(name);\n if(!cache) {\n this.cache.set(name, cache = FramesCache.createCache());\n } else {\n // console.warn('[RLottieCache] cache will be reused', cache);\n }\n\n ++cache.counter;\n return cache;\n }\n\n public releaseCache(name: string) {\n const cache = this.cache.get(name);\n if(cache && !--cache.counter) {\n this.cache.delete(name);\n // console.warn('[RLottieCache] released cache', cache);\n }\n }\n\n public getCacheCounter(name: string) {\n const cache = this.cache.get(name);\n return cache?.counter;\n }\n\n public generateName(name: string, width: number, height: number, color: RLottieColor, toneIndex: number) {\n return [\n name,\n width,\n height,\n // color ? rgbaToHexa(color) : ''\n color ? 'colored' : '',\n toneIndex || ''\n ].filter(Boolean).join('-');\n }\n}\n\nconst framesCache = new FramesCache();\n\nexport default framesCache;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// generate a path's arc data parameter\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\n\n// http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands\nfunction arcParameter(rx: number, ry: number, xAxisRotation: number, largeArcFlag: number, sweepFlag: number, x: number, y: number) {\n return [rx, ',', ry, ' ',\n xAxisRotation, ' ',\n largeArcFlag, ',',\n sweepFlag, ' ',\n x, ',', y].join('');\n}\n\nexport default function generatePathData(x: number, y: number, width: number, height: number, tl: number, tr: number, br: number, bl: number) {\n const data: string[] = [];\n\n // start point in top-middle of the rectangle\n data.push('M' + (x + width / 2) + ',' + y);\n\n // next we go to the right\n data.push('H' + (x + width - tr));\n\n if(tr > 0) {\n // now we draw the arc in the top-right corner\n data.push('A' + arcParameter(tr, tr, 0, 0, 1, (x + width), (y + tr)));\n }\n\n // next we go down\n data.push('V' + (y + height - br));\n\n if(br > 0) {\n // now we draw the arc in the lower-right corner\n data.push('A' + arcParameter(br, br, 0, 0, 1, (x + width - br), (y + height)));\n }\n\n // now we go to the left\n data.push('H' + (x + bl));\n\n if(bl > 0) {\n // now we draw the arc in the lower-left corner\n data.push('A' + arcParameter(bl, bl, 0, 0, 1, (x + 0), (y + height - bl)));\n }\n\n // next we go up\n data.push('V' + (y + tl));\n\n if(tl > 0) {\n // now we draw the arc in the top-left corner\n data.push('A' + arcParameter(tl, tl, 0, 0, 1, (x + tl), (y + 0)));\n }\n\n // and we close the path\n data.push('Z');\n\n return data.join(' ');\n}\n\nMOUNT_CLASS_TO.generatePathData = generatePathData;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PhotoSize} from '../layer';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {renderImageFromUrlPromise} from './dom/renderImageFromUrl';\nimport getPreviewURLFromThumb from './getPreviewURLFromThumb';\nimport blur from './blur';\n\nexport default function getImageFromStrippedThumb(\n photo: MyPhoto | MyDocument,\n thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize,\n useBlur: boolean\n) {\n const url = getPreviewURLFromThumb(photo, thumb, false);\n\n let element: HTMLImageElement | HTMLCanvasElement, loadPromise: Promise;\n if(!useBlur) {\n element = new Image();\n loadPromise = renderImageFromUrlPromise(element, url);\n } else {\n const result = blur(url);\n element = result.canvas;\n loadPromise = result.promise;\n }\n\n element.classList.add('thumbnail');\n\n return {image: element, loadPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {PhotoSize} from '../layer';\n// import appDownloadManager from \"../lib/appManagers/appDownloadManager\";\nimport getPreviewURLFromBytes from './bytes/getPreviewURLFromBytes';\n\nexport default function getPreviewURLFromThumb(photo: MyPhoto | MyDocument, thumb: PhotoSize.photoCachedSize | PhotoSize.photoStrippedSize, isSticker = false) {\n // const cacheContext = appDownloadManager.getCacheContext(photo, thumb.type);\n // return cacheContext.url || (cacheContext.url = getPreviewURLFromBytes(thumb.bytes, isSticker));\n return getPreviewURLFromBytes(thumb.bytes, isSticker);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport type {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport {THUMB_TYPE_FULL} from '../lib/mtproto/mtproto_config';\nimport type {ThumbCache} from '../lib/storages/thumbs';\nimport getImageFromStrippedThumb from './getImageFromStrippedThumb';\n\nexport default function getStrippedThumbIfNeeded(photo: MyPhoto | MyDocument, cacheContext: ThumbCache, useBlur: boolean, ignoreCache = false) {\n const isVideo = (['video', 'gif'] as MyDocument['type'][]).includes((photo as MyDocument).type);\n if(!cacheContext.downloaded || isVideo || ignoreCache) {\n if(\n photo._ === 'document' &&\n cacheContext.downloaded &&\n !ignoreCache &&\n (!isVideo || cacheContext.type !== THUMB_TYPE_FULL)\n ) {\n return null;\n }\n\n const sizes = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs;\n const thumb = sizes?.length ? sizes.find((size) => size._ === 'photoStrippedSize') : null;\n if(thumb && ('bytes' in thumb)) {\n return getImageFromStrippedThumb(photo, thumb as any, useBlur);\n }\n }\n\n return null;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from './array/forEachReverse';\nimport safeAssign from './object/safeAssign';\n\nexport type ListLoaderOptions = {\n loadMore: ListLoader['loadMore'],\n loadCount?: ListLoader['loadCount'],\n loadWhenLeft?: ListLoader['loadWhenLeft'],\n processItem?: ListLoader['processItem'],\n onJump?: ListLoader['onJump'],\n onLoadedMore?: ListLoader['onLoadedMore']\n};\n\nexport type ListLoaderResult = {count: number, items: any[]};\nexport default class ListLoader {\n public current: T;\n public previous: T[] = [];\n public next: T[] = [];\n public count: number;\n public reverse = false; // reverse means next = higher msgid\n\n protected loadMore: (anchor: T, older: boolean, loadCount: number) => Promise>;\n protected processItem: (item: P) => T | Promise;\n protected loadCount = 50;\n protected loadWhenLeft = 20;\n\n public onJump: (item: T, older: boolean) => void;\n public onLoadedMore: () => void;\n\n protected loadedAllUp = false;\n protected loadedAllDown = false;\n protected loadPromiseUp: Promise;\n protected loadPromiseDown: Promise;\n\n constructor(options: ListLoaderOptions) {\n safeAssign(this, options);\n }\n\n public setTargets(previous: T[], next: T[], reverse: boolean) {\n this.previous = previous;\n this.next = next;\n this.reverse = reverse;\n }\n\n public get index() {\n return this.count !== undefined ? this.previous.length : -1;\n }\n\n /* public filter(callback: (item: T, idx: number, arr: T[]) => boolean) {\n const filter = (item: T, idx: number, arr: T[]) => {\n if(!callback(item, idx, arr)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n } */\n\n public reset(loadedAll = false) {\n this.current = undefined;\n this.previous = [];\n this.next = [];\n this.setLoaded(true, loadedAll);\n this.setLoaded(false, loadedAll);\n }\n\n public go(length: number, dispatchJump = true) {\n let items: T[], item: T;\n if(length > 0) {\n items = this.next.splice(0, length);\n item = items.pop();\n if(!item) {\n return;\n }\n\n if(this.current !== undefined) items.unshift(this.current);\n this.previous.push(...items);\n } else {\n items = this.previous.splice(Math.max(0, this.previous.length + length), -length);\n item = items.shift();\n if(!item) {\n return;\n }\n\n if(this.current !== undefined) items.push(this.current);\n this.next.unshift(...items);\n }\n\n if(this.next.length < this.loadWhenLeft) {\n this.load(!this.reverse);\n }\n\n if(this.previous.length < this.loadWhenLeft) {\n this.load(this.reverse);\n }\n\n this.current = item;\n dispatchJump && this.onJump && this.onJump(item, length > 0);\n return this.current;\n }\n\n protected unsetCurrent(toPrevious: boolean) {\n if(toPrevious) this.previous.push(this.current);\n else this.next.unshift(this.current);\n\n this.current = undefined;\n }\n\n public goUnsafe(length: number, dispatchJump?: boolean) {\n const leftLength = length > 0 ? Math.max(0, length - this.next.length) : Math.min(0, length + this.previous.length);\n const item = this.go(length, leftLength ? false : dispatchJump);\n\n /* if(length > 0 ? this.loadedAllUp : this.loadedAllDown) {\n this.unsetCurrent(length > 0);\n } */\n\n return {\n item: !leftLength ? item : undefined,\n leftLength\n };\n }\n\n protected setLoaded(down: boolean, value: boolean) {\n const isChanged = (down ? this.loadedAllDown : this.loadedAllUp) !== value;\n if(!isChanged) {\n return false;\n }\n\n if(down) this.loadedAllDown = value;\n else this.loadedAllUp = value;\n\n if(!value) {\n if(down) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n }\n\n return true;\n }\n\n // нет смысла делать проверку для reverse и loadMediaPromise\n public load(older: boolean) {\n if(older ? this.loadedAllDown : this.loadedAllUp) return Promise.resolve();\n\n let promise = older ? this.loadPromiseDown : this.loadPromiseUp;\n if(promise) return promise;\n\n let anchor: T;\n if(older) {\n anchor = this.reverse ? this.previous[0] : this.next[this.next.length - 1];\n } else {\n anchor = this.reverse ? this.next[this.next.length - 1] : this.previous[0];\n }\n\n anchor ??= this.current;\n promise = this.loadMore(anchor, older, this.loadCount).then(async(result) => {\n if((older ? this.loadPromiseDown : this.loadPromiseUp) !== promise) {\n return;\n }\n\n if(result.items.length < this.loadCount) {\n this.setLoaded(older, true);\n }\n\n if(this.count === undefined) {\n this.count = result.count || result.items.length;\n }\n\n const processedArr: (Promise | any)[] = [];\n const method = older ? result.items.forEach.bind(result.items) : forEachReverse.bind(null, result.items);\n method((item: any) => {\n const processed = this.processItem ? this.processItem(item) : item;\n\n if(!processed) return;\n processedArr.push(processed);\n });\n\n const results = await Promise.all(processedArr);\n if(older) {\n if(this.reverse) this.previous.unshift(...results);\n else this.next.push(...results);\n } else {\n if(this.reverse) this.next.push(...results);\n else this.previous.unshift(...results);\n }\n\n this.onLoadedMore && this.onLoadedMore();\n }, () => {}).then(() => {\n if(older) this.loadPromiseDown = null;\n else this.loadPromiseUp = null;\n });\n\n if(older) this.loadPromiseDown = promise;\n else this.loadPromiseUp = promise;\n\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type EventListenerBase from './eventListenerBase';\n\nexport type Listener = {\n element: ListenerElement,\n event: ListenerEvent,\n callback: ListenerCallback,\n options?: ListenerOptions,\n\n onceFired?: true, // will be set only when options.once is set\n onceCallback?: () => void,\n};\n\nexport type ListenerElement = Window | Document | HTMLElement | Element | EventListenerBase;\nexport type ListenerEvent = string;\nexport type ListenerCallback = Function;\nexport type ListenerOptions = AddEventListenerOptions;\n\n/* const originalAddEventListener = HTMLElement.prototype.addEventListener;\nHTMLElement.prototype.addEventListener = function(this, name: string, callback: EventListenerOrEventListenerObject, options: AddEventListenerOptions) {\n console.log('nu zdarova', name);\n originalAddEventListener.call(this, name, callback, options);\n\n if(options?.ls) {\n return options.ls.addFromElement(this, name, callback as any, options);\n }\n}; */\n\nexport default class ListenerSetter {\n private listeners: Set = new Set();\n\n public add(element: T): T['addEventListener'] {\n return ((event: string, callback: Function, options: ListenerOptions) => {\n const listener: Listener = {element, event, callback, options};\n this.addManual(listener);\n return listener;\n }) as any;\n }\n\n /* public addFromElement(element: T, event: ListenerEvent, callback: ListenerCallback, options: ListenerOptions) {\n const listener: Listener = {element, event, callback, options};\n this.addManual(listener);\n return listener;\n } */\n\n public addManual(listener: Listener) {\n // @ts-ignore\n listener.element.addEventListener(listener.event, listener.callback, listener.options);\n\n if(listener.options?.once) { // remove listener when its called\n listener.onceCallback = () => {\n this.remove(listener);\n listener.onceFired = true;\n };\n\n // @ts-ignore\n listener.element.addEventListener(listener.event, listener.onceCallback, listener.options);\n }\n\n this.listeners.add(listener);\n }\n\n public remove(listener: Listener) {\n if(!listener.onceFired) {\n // @ts-ignore\n listener.element.removeEventListener(listener.event, listener.callback, listener.options);\n\n if(listener.onceCallback) {\n // @ts-ignore\n listener.element.removeEventListener(listener.event, listener.onceCallback, listener.options);\n }\n }\n\n this.listeners.delete(listener);\n }\n\n public removeManual(\n element: T,\n event: ListenerEvent,\n callback: ListenerCallback,\n options?: ListenerOptions\n ) {\n let listener: Listener;\n for(const _listener of this.listeners) {\n if(_listener.element === element &&\n _listener.event === event &&\n _listener.callback === callback &&\n _listener.options === options) {\n listener = _listener;\n break;\n }\n }\n\n if(listener) {\n this.remove(listener);\n }\n }\n\n public removeAll() {\n this.listeners.forEach((listener) => {\n this.remove(listener);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport calcImageInBox from './calcImageInBox';\n\nexport class MediaSize {\n constructor(public width = 0, public height = width) {\n\n }\n\n public aspect(boxSize: MediaSize, fitted: boolean) {\n return calcImageInBox(this.width, this.height, boxSize.width, boxSize.height, fitted);\n }\n\n public aspectFitted(boxSize: MediaSize) {\n return this.aspect(boxSize, true);\n }\n\n public aspectCovered(boxSize: MediaSize) {\n return this.aspect(boxSize, false);\n }\n}\n\nexport function makeMediaSize(width?: number, height?: number): MediaSize {\n return new MediaSize(width, height);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport EventListenerBase from './eventListenerBase';\nimport {makeMediaSize, MediaSize} from './mediaSize';\n\ntype MediaTypeSizes = {\n regular: MediaSize,\n webpage: MediaSize,\n album: MediaSize,\n esgSticker: MediaSize,\n animatedSticker: MediaSize,\n staticSticker: MediaSize,\n emojiSticker: MediaSize,\n poll: MediaSize,\n round: MediaSize,\n documentName: MediaSize,\n invoice: MediaSize,\n extendedInvoice: MediaSize,\n customEmoji: MediaSize,\n esgCustomEmoji: MediaSize,\n emojiStatus: MediaSize,\n popupSticker: MediaSize\n};\n\nexport type MediaSizeType = keyof MediaTypeSizes;\n\nexport enum ScreenSize {\n mobile,\n medium,\n large\n}\n\nconst MOBILE_SIZE = 600;\nconst MEDIUM_SIZE = 1275;\nconst LARGE_SIZE = 1680;\n\nconst CUSTOM_EMOJI_SIZE = makeMediaSize(20, 20);\nconst ESG_CUSTOM_EMOJI_SIZE = makeMediaSize(36, 36);\nconst EMOJI_STATUS_SIZE = makeMediaSize(18, 18);\n\nclass MediaSizes extends EventListenerBase<{\n changeScreen: (from: ScreenSize, to: ScreenSize) => void,\n resize: () => void\n}> {\n private screenSizes: {key: ScreenSize, value: number}[] = [\n {key: ScreenSize.mobile, value: MOBILE_SIZE},\n {key: ScreenSize.medium, value: MEDIUM_SIZE},\n {key: ScreenSize.large, value: LARGE_SIZE}\n ];\n\n private sizes: {[k in 'desktop' | 'handhelds']: MediaTypeSizes} = {\n handhelds: {\n regular: makeMediaSize(270, 270),\n webpage: makeMediaSize(270, 200),\n album: makeMediaSize(270, 0),\n esgSticker: makeMediaSize(68, 68),\n animatedSticker: makeMediaSize(180, 180),\n staticSticker: makeMediaSize(180, 180),\n emojiSticker: makeMediaSize(112, 112),\n poll: makeMediaSize(240, 0),\n round: makeMediaSize(200, 200),\n documentName: makeMediaSize(200, 0),\n invoice: makeMediaSize(270, 270),\n extendedInvoice: makeMediaSize(270, 270),\n customEmoji: CUSTOM_EMOJI_SIZE,\n esgCustomEmoji: ESG_CUSTOM_EMOJI_SIZE,\n emojiStatus: EMOJI_STATUS_SIZE,\n popupSticker: makeMediaSize(68, 68)\n },\n desktop: {\n regular: makeMediaSize(420, 340),\n webpage: makeMediaSize(420, 340),\n album: makeMediaSize(420, 0),\n esgSticker: makeMediaSize(72, 72),\n animatedSticker: makeMediaSize(200, 200),\n staticSticker: makeMediaSize(200, 200),\n emojiSticker: makeMediaSize(112, 112),\n poll: makeMediaSize(330, 0),\n round: makeMediaSize(280, 280),\n documentName: makeMediaSize(240, 0),\n invoice: makeMediaSize(320, 320),\n extendedInvoice: makeMediaSize(420, 340),\n customEmoji: CUSTOM_EMOJI_SIZE,\n esgCustomEmoji: ESG_CUSTOM_EMOJI_SIZE,\n emojiStatus: EMOJI_STATUS_SIZE,\n popupSticker: makeMediaSize(80, 80)\n }\n };\n\n public isMobile = false;\n public active: MediaTypeSizes;\n public activeScreen: ScreenSize;\n private rAF: number;\n\n constructor() {\n super();\n\n window.addEventListener('resize', () => {\n if(this.rAF) window.cancelAnimationFrame(this.rAF);\n this.rAF = window.requestAnimationFrame(() => {\n this.handleResize();\n this.rAF = 0;\n });\n });\n this.handleResize();\n }\n\n private handleResize = () => {\n const innerWidth = window.innerWidth;\n // this.isMobile = innerWidth <= 720;\n\n let activeScreen = this.screenSizes[0].key;\n for(let i = this.screenSizes.length - 1; i >= 0; --i) {\n if(this.screenSizes[i].value < innerWidth) {\n activeScreen = (this.screenSizes[i + 1] || this.screenSizes[i]).key;\n break;\n }\n }\n\n const wasScreen = this.activeScreen;\n this.activeScreen = activeScreen;\n this.isMobile = this.activeScreen === ScreenSize.mobile;\n this.active = this.isMobile ? this.sizes.handhelds : this.sizes.desktop;\n\n // console.time('esg');\n // const computedStyle = window.getComputedStyle(document.documentElement);\n // this.active.esgSticker.width = parseFloat(computedStyle.getPropertyValue('--esg-sticker-size'));\n // console.timeEnd('esg');\n\n if(wasScreen !== activeScreen) {\n // console.log('changeScreen', this.activeScreen, activeScreen);\n\n if(wasScreen !== undefined) {\n this.dispatchEvent('changeScreen', wasScreen, activeScreen);\n }\n }\n\n if(wasScreen !== undefined) {\n this.dispatchEvent('resize');\n }\n\n /* if(this.isMobile) {\n for(let i in this.active) {\n // @ts-ignore\n let size = this.active[i];\n size.width = innerWidth\n }\n } */\n };\n}\n\nconst mediaSizes = new MediaSizes();\nMOUNT_CLASS_TO.mediaSizes = mediaSizes;\nexport default mediaSizes;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport makeError from './makeError';\n\nconst error = makeError('MIDDLEWARE');\nexport default function middlewarePromise(middleware: () => boolean, throwWhat: any = error) {\n return (promise: T): T => {\n if(!(promise instanceof Promise)) {\n if(promise instanceof Error) {\n throw promise;\n } else {\n return promise;\n }\n }\n\n return (promise as any as Promise).then((result) => {\n if(!middleware()) {\n throw throwWhat;\n }\n\n return result;\n }) as any;\n };\n}\n","export default function clamp(v: number, min: number, max: number): number {\n return v < min ? min : ((v > max) ? max : v);\n}\n","export default function formatNumber(bytes: number, decimals = 2) {\n if(bytes === 0) return '0';\n\n const k = 1000;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['', 'K', 'M', 'B', 'T'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + sizes[i];\n}\n","export default function numberThousandSplitter(x: number, joiner = ' ') {\n const parts = x.toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, joiner);\n return parts.join('.');\n}\n","import {IS_APPLE_MOBILE} from '../environment/userAgent';\n\nexport default function onMediaLoad(media: HTMLMediaElement, readyState = media.HAVE_METADATA, useCanplayOnIos?: boolean) {\n return new Promise((resolve, reject) => {\n if(media.readyState >= readyState) {\n resolve();\n return;\n }\n\n const loadEventName = IS_APPLE_MOBILE && !useCanplayOnIos ? 'loadeddata' : 'canplay';\n const errorEventName = 'error';\n const onLoad = () => {\n media.removeEventListener(errorEventName, onError);\n resolve();\n };\n const onError = (e: ErrorEvent) => {\n media.removeEventListener(loadEventName, onLoad);\n reject(e);\n };\n media.addEventListener(loadEventName, onLoad, {once: true});\n media.addEventListener(errorEventName, onError, {once: true});\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appNavigationController, {NavigationItem} from '../components/appNavigationController';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport {IS_MOBILE_SAFARI} from '../environment/userAgent';\nimport cancelEvent from './dom/cancelEvent';\nimport {CLICK_EVENT_NAME} from './dom/clickEvent';\nimport findUpAsChild from './dom/findUpAsChild';\nimport EventListenerBase from './eventListenerBase';\n\nexport default class OverlayClickHandler extends EventListenerBase<{\n toggle: (open: boolean) => void\n}> {\n protected element: HTMLElement;\n protected overlay: HTMLElement;\n protected listenerOptions: AddEventListenerOptions;\n\n constructor(\n protected navigationType: NavigationItem['type'],\n protected withOverlay?: boolean\n ) {\n super(false);\n this.listenerOptions = withOverlay ? {} : {capture: true};\n }\n\n protected onClick = (e: MouseEvent | TouchEvent) => {\n if(this.element && findUpAsChild(e.target as HTMLElement, this.element)) {\n return;\n }\n\n if(this.listenerOptions?.capture) {\n cancelEvent(e);\n }\n\n this.close();\n };\n\n public close() {\n if(this.element) {\n this.overlay?.remove();\n this.element = undefined;\n this.dispatchEvent('toggle', false);\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n // window.removeEventListener('keydown', onKeyDown, {capture: true});\n window.removeEventListener('contextmenu', this.onClick, this.listenerOptions);\n }\n\n document.removeEventListener(CLICK_EVENT_NAME, this.onClick, this.listenerOptions);\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.removeByType(this.navigationType);\n }\n }\n\n public open(element: HTMLElement) {\n this.close();\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.pushItem({\n type: this.navigationType,\n onPop: (canAnimate) => {\n this.close();\n }\n });\n }\n\n this.element = element;\n\n if(!this.overlay && this.withOverlay) {\n this.overlay = document.createElement('div');\n this.overlay.classList.add('btn-menu-overlay');\n\n // ! because this event must be canceled, and can't cancel on menu click (below)\n this.overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n this.onClick(e);\n });\n }\n\n this.overlay && this.element.parentElement.insertBefore(this.overlay, this.element);\n\n // document.body.classList.add('disable-hover');\n\n if(!IS_TOUCH_SUPPORTED) {\n // window.addEventListener('keydown', onKeyDown, {capture: true});\n window.addEventListener('contextmenu', this.onClick, {...this.listenerOptions, once: true});\n }\n\n /* // ! because this event must be canceled, and can't cancel on menu click (below)\n overlay.addEventListener(CLICK_EVENT_NAME, (e) => {\n cancelEvent(e);\n onClick(e);\n }); */\n\n // ! safari iOS doesn't handle window click event on overlay, idk why\n document.addEventListener(CLICK_EVENT_NAME, this.onClick, this.listenerOptions);\n\n this.dispatchEvent('toggle', true);\n }\n}\n","import Currencies from '../config/currencies';\n\n// https://stackoverflow.com/a/34141813\nfunction number_format(number: any, decimals: any, dec_point: any, thousands_sep: any): string {\n // Strip all characters but numerical ones.\n number = (number + '').replace(/[^0-9+\\-Ee.]/g, '');\n var n = !isFinite(+number) ? 0 : +number,\n prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),\n sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,\n dec = (typeof dec_point === 'undefined') ? '.' : dec_point,\n s: any = '',\n toFixedFix = function(n: number, prec: number) {\n var k = Math.pow(10, prec);\n return '' + Math.round(n * k) / k;\n };\n // Fix for IE parseFloat(0.55).toFixed(0) = 0;\n s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');\n if(s[0].length > 3) {\n s[0] = s[0].replace(/\\B(?=(?:\\d{3})+(?!\\d))/g, sep);\n }\n if((s[1] || '').length < prec) {\n s[1] = s[1] || '';\n s[1] += new Array(prec - s[1].length + 1).join('0');\n }\n return s.join(dec);\n}\n\nexport default function paymentsWrapCurrencyAmount(amount: number | string, currency: string, skipSymbol?: boolean) {\n amount = +amount;\n\n const isNegative = amount < 0;\n\n const currencyData = Currencies[currency];\n if(!currencyData) {\n throw new Error('CURRENCY_WRAP_INVALID');\n }\n\n const amountExp = amount / Math.pow(10, currencyData.exp);\n\n let decimals = currencyData.exp;\n if(currency == 'IRR' && Math.floor(amountExp) == amountExp) {\n decimals = 0; // у иранцев копейки почти всегда = 0 и не показываются в UI\n }\n\n let formatted = number_format(amountExp, decimals, currencyData.decimal_sep, currencyData.thousands_sep);\n if(skipSymbol) {\n return formatted;\n }\n\n let symbol = currencyData.symbol;\n if(isNegative && !currencyData.space_between && currencyData.symbol_left) {\n symbol = '-' + symbol;\n formatted = formatted.replace('-', '');\n }\n\n let out: string;\n const splitter = currencyData.space_between ? ' ' : '';\n if(currencyData.symbol_left) {\n out = symbol + splitter + formatted;\n } else {\n out = formatted + splitter + symbol;\n }\n return out;\n}\n\n(window as any).p = paymentsWrapCurrencyAmount;\n\n// function paymentsGetCurrencyExp($currency: string) {\n// if($currency == 'CLF') {\n// return 4;\n// }\n// if(['BHD','IQD','JOD','KWD','LYD','OMR','TND'].includes($currency)) {\n// return 3;\n// }\n// if(['BIF','BYR','CLP','CVE','DJF','GNF','ISK','JPY','KMF','KRW','MGA', 'PYG','RWF','UGX','UYI','VND','VUV','XAF','XOF','XPF'].includes($currency)) {\n// return 0;\n// }\n// if($currency == 'MRO') {\n// return 1;\n// }\n// return 2;\n// }\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport mediaSizes from './mediaSizes';\n\nexport type MenuPositionPadding = {\n top?: number,\n right?: number,\n bottom?: number,\n left?: number\n};\n\nconst PADDING_TOP = 8;\nconst PADDING_BOTTOM = PADDING_TOP;\nconst PADDING_LEFT = 8;\nconst PADDING_RIGHT = PADDING_LEFT;\nexport default function positionMenu(e: MouseEvent | Touch | TouchEvent, elem: HTMLElement, side?: 'left' | 'right' | 'center', additionalPadding?: MenuPositionPadding) {\n if((e as TouchEvent).touches) {\n e = (e as TouchEvent).touches[0];\n }\n\n const {pageX, pageY} = e as Touch;\n // let {clientX, clientY} = e;\n\n // * side mean the OPEN side\n\n const getScrollWidthFromElement = (Array.from(elem.children) as HTMLElement[]).find((element) => element.classList.contains('btn-menu-item') && !element.classList.contains('hide')) || elem;\n\n let {scrollWidth: menuWidth} = getScrollWidthFromElement;\n const {scrollHeight: menuHeight} = elem;\n // let {innerWidth: windowWidth, innerHeight: windowHeight} = window;\n const rect = document.body.getBoundingClientRect();\n const windowWidth = rect.width;\n const windowHeight = rect.height;\n\n menuWidth += getScrollWidthFromElement.offsetLeft * 2;\n\n let paddingTop = PADDING_TOP, paddingRight = PADDING_RIGHT, paddingBottom = PADDING_BOTTOM, paddingLeft = PADDING_LEFT;\n if(additionalPadding) {\n if(additionalPadding.top) paddingTop += additionalPadding.top;\n if(additionalPadding.right) paddingRight += additionalPadding.right;\n if(additionalPadding.bottom) paddingBottom += additionalPadding.bottom;\n if(additionalPadding.left) paddingLeft += additionalPadding.left;\n }\n\n side = mediaSizes.isMobile ? 'right' : 'left';\n let verticalSide: 'top' /* | 'bottom' */ | 'center' = 'top';\n\n const maxTop = windowHeight - menuHeight - paddingBottom;\n const maxLeft = windowWidth - menuWidth - paddingRight;\n const minTop = paddingTop;\n const minLeft = paddingLeft;\n\n const getSides = () => {\n return {\n x: {\n left: pageX,\n right: Math.min(maxLeft, pageX - menuWidth)\n },\n intermediateX: side === 'right' ? minLeft : maxLeft,\n // intermediateX: clientX < windowWidth / 2 ? PADDING_LEFT : windowWidth - menuWidth - PADDING_LEFT,\n y: {\n top: pageY,\n bottom: pageY - menuHeight\n },\n // intermediateY: verticalSide === 'top' ? paddingTop : windowHeight - menuHeight - paddingTop,\n // intermediateY: pageY < (windowHeight / 2) ? paddingTop : windowHeight - menuHeight - paddingBottom,\n intermediateY: maxTop\n };\n };\n\n const sides = getSides();\n\n const possibleSides = {\n x: {\n left: (sides.x.left + menuWidth + paddingRight) <= windowWidth,\n right: sides.x.right >= paddingLeft\n },\n y: {\n top: (sides.y.top + menuHeight + paddingBottom) <= windowHeight,\n bottom: (sides.y.bottom - paddingBottom) >= paddingBottom\n }\n };\n\n /* if(side === undefined) {\n if((clientX + menuWidth + PADDING_LEFT) > windowWidth) {\n side = 'right';\n }\n } */\n\n {\n /* const x = sides.x;\n\n const s = Object.keys(x) as (keyof typeof possibleSides.x)[];\n if(side) {\n s.findAndSplice((s) => s === side);\n s.unshift(side);\n }\n\n const possibleSide = s.find((s) => possibleSides.x[s]); */\n // let left: number;\n /* if(possibleSide) {\n left = x[possibleSide];\n side = possibleSide;\n } else {\n left = sides.intermediateX;\n side = undefined;\n } */\n const left = possibleSides.x[side] ? sides.x[side] : (side = 'center', sides.intermediateX);\n\n elem.style.left = left + 'px';\n }\n\n /* if((clientY + menuHeight + PADDING_TOP) > windowHeight) {\n elem.style.top = clamp(clientY - menuHeight, PADDING_TOP, windowHeight - menuHeight - PADDING_TOP) + 'px';\n // elem.style.top = (innerHeight - scrollHeight - PADDING_TOP) + 'px';\n verticalSide = 'bottom';\n } else {\n elem.style.top = Math.max(PADDING_TOP, clientY) + 'px';\n verticalSide = 'top';\n } */\n\n {\n const top = possibleSides.y[verticalSide] ? sides.y[verticalSide] : (verticalSide = 'center', sides.intermediateY);\n\n elem.style.top = top + 'px';\n }\n\n elem.className = elem.className.replace(/(top|center|bottom)-(left|center|right)/g, '');\n elem.classList.add(\n // (verticalSide === 'center' ? verticalSide : (verticalSide === 'bottom' ? 'top' : 'bottom')) +\n (verticalSide === 'center' ? verticalSide : 'bottom') +\n '-' +\n (side === 'center' ? side : (side === 'left' ? 'right' : 'left')));\n\n return {\n width: menuWidth,\n height: menuHeight\n };\n}\n","import {RestrictionReason} from '../layer';\n\nconst platforms = new Set([\n 'all',\n 'web',\n 'webk'\n]);\n\nconst ignore = new Set();\n\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\n // return reasons[0];\n return reasons.find((reason) => platforms.has(reason.platform) && !ignore.has(reason.reason));\n}\n\nexport function isRestricted(reasons: RestrictionReason[]) {\n return !!getRestrictionReason(reasons);\n}\n\nexport function ignoreRestrictionReasons(reasons: string[]) {\n ignore.clear();\n reasons.forEach((reason) => {\n ignore.add(reason);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../lib/appManagers/appDocsManager';\nimport rootScope from '../lib/rootScope';\n\nconst savingLottiePreview: {[docId: DocId]: {width: number, height: number}} = {};\n\nexport function isSavingLottiePreview(doc: MyDocument, toneIndex: number, width: number, height: number) {\n const key = doc.id + '-' + toneIndex;\n const saving = savingLottiePreview[key];\n return saving && saving.width >= width && saving.height >= height;\n}\n\nexport async function saveLottiePreview(doc: MyDocument, canvas: HTMLCanvasElement, toneIndex: number) {\n const key = doc.id + '-' + toneIndex;\n const {width, height} = canvas;\n if(isSavingLottiePreview(doc, toneIndex, width, height)) {\n return;\n }\n\n const saving = savingLottiePreview[key] = {\n width,\n height\n };\n\n const thumb = await rootScope.managers.appDocsManager.getLottieCachedThumb(doc.id, toneIndex);\n if(savingLottiePreview[key] !== saving) {\n return;\n }\n\n if(thumb && thumb.w >= width && thumb.h >= height) {\n return;\n }\n\n const promise = new Promise((resolve) => {\n canvas.toBlob((blob) => resolve(blob));\n });\n\n const blob = await promise;\n if(savingLottiePreview[key] !== saving) {\n return;\n }\n\n // console.log('got lottie preview', doc, blob, URL.createObjectURL(blob));\n\n rootScope.managers.appDocsManager.saveLottiePreview(doc.id, blob, width, height, toneIndex);\n\n // delete savingLottiePreview[key];\n\n /* const reader = new FileReader();\n reader.onloadend = (e) => {\n const uint8 = new Uint8Array(e.target.result as ArrayBuffer);\n const thumb: PhotoSize.photoStrippedSize = {\n _: 'photoStrippedSize',\n bytes: uint8,\n type: 'i'\n };\n\n doc.stickerSavedThumbWidth = canvas.width;\n doc.stickerSavedThumbHeight = canvas.width;\n\n defineNotNumerableProperties(thumb, ['url']);\n thumb.url = URL.createObjectURL(blob);\n doc.thumbs.findAndSplice((t) => t._ === thumb._);\n doc.thumbs.unshift(thumb);\n\n if(!webpWorkerController.isWebpSupported()) {\n doc.pFlags.stickerThumbConverted = true;\n }\n\n delete this.savingLottiePreview[doc.id];\n };\n reader.readAsArrayBuffer(blob); */\n}\n","// * Jolly Cobra's schedulers\n\nimport {AnyToVoidFunction} from '../../types';\nimport {fastRaf} from '../schedulers';\nimport throttleWith from './throttleWith';\n\nexport default function throttleWithRaf(fn: F) {\n return throttleWith(fastRaf, fn);\n}\n","// * Jolly Cobra's schedulers\n\nimport {AnyToVoidFunction} from '../../types';\n\nexport default function throttleWith(schedulerFn: AnyToVoidFunction, fn: F) {\n let waiting = false;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n args = _args;\n\n if(!waiting) {\n waiting = true;\n\n schedulerFn(() => {\n waiting = false;\n // @ts-ignore\n fn(...args);\n });\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Scrollable from '../components/scrollable';\nimport safeAssign from './object/safeAssign';\n\nexport default class ScrollableLoader {\n public loading = false;\n private scrollable: Scrollable;\n private getPromise: () => Promise;\n private promise: Promise;\n private loaded = false;\n\n constructor(options: {\n scrollable: ScrollableLoader['scrollable'],\n getPromise: ScrollableLoader['getPromise']\n }) {\n safeAssign(this, options);\n\n options.scrollable.onScrolledBottom = () => {\n this.load();\n };\n }\n\n public load() {\n if(this.loaded) {\n return Promise.resolve();\n }\n\n if(this.loading) {\n return this.promise;\n }\n\n this.loading = true;\n this.promise = this.getPromise().then((done) => {\n this.loading = false;\n this.promise = undefined;\n\n if(done) {\n this.loaded = true;\n this.scrollable.onScrolledBottom = null;\n } else {\n this.scrollable.checkForTriggers();\n }\n }, () => {\n this.promise = undefined;\n this.loading = false;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MediaSearchContext} from '../components/appMediaPlaybackController';\nimport type {SearchSuperContext} from '../components/appSearchSuper.';\nimport type {Message} from '../layer';\nimport type {MessagesStorageKey, MyMessage} from '../lib/appManagers/appMessagesManager';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport incrementMessageId from '../lib/appManagers/utils/messageId/incrementMessageId';\nimport rootScope from '../lib/rootScope';\nimport forEachReverse from './array/forEachReverse';\nimport filterChatPhotosMessages from './filterChatPhotosMessages';\nimport ListLoader, {ListLoaderOptions} from './listLoader';\n\nexport default class SearchListLoader extends ListLoader {\n public searchContext: MediaSearchContext;\n public onEmptied: () => void;\n\n private otherSideLoader: SearchListLoader;\n private managers: AppManagers;\n\n constructor(options: Omit, 'loadMore'> & {\n onEmptied?: () => void,\n isInner?: boolean,\n managers?: AppManagers\n } = {}) {\n super({\n ...options,\n loadMore: (anchor, older, loadCount) => {\n const backLimit = older ? 0 : loadCount;\n let maxId = anchor?.mid;\n\n if(maxId === undefined) maxId = this.searchContext.maxId;\n if(!older) maxId = incrementMessageId(maxId, 1);\n\n return this.managers.appMessagesManager.getSearch({\n ...this.searchContext,\n peerId: this.searchContext.peerId || anchor?.peerId,\n maxId,\n limit: backLimit ? 0 : loadCount,\n backLimit\n }).then((value) => {\n /* if(DEBUG) {\n this.log('loaded more media by maxId:', maxId, value, older, this.reverse);\n } */\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n filterChatPhotosMessages(value);\n }\n\n if(value.next_rate) {\n this.searchContext.nextRate = value.next_rate;\n }\n\n return {count: value.count, items: value.history};\n });\n },\n processItem: async(message) => {\n const filtered = await this.filterMids([message.mid]);\n if(!filtered.length) {\n return;\n }\n\n return options.processItem(message);\n }\n });\n\n this.managers ??= rootScope.managers;\n rootScope.addEventListener('history_delete', this.onHistoryDelete);\n rootScope.addEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.addEventListener('message_sent', this.onMessageSent);\n\n if(!options.isInner) {\n this.otherSideLoader = new SearchListLoader({\n ...options,\n isInner: true\n });\n\n // this.otherSideLoader.onLoadedMore = () => {\n\n // };\n }\n }\n\n protected async filterMids(mids: number[]) {\n const storageKey: MessagesStorageKey = `${this.searchContext.peerId}_${this.searchContext.isScheduled ? 'scheduled' : 'history'}`;\n const filtered = (await this.managers.appMessagesManager.filterMessagesByInputFilterFromStorage(this.searchContext.inputFilter._, mids, storageKey, mids.length)) as Message.message[];\n return filtered;\n }\n\n protected onHistoryDelete = ({peerId, msgs}: {peerId: PeerId, msgs: Set}) => {\n const shouldBeDeleted = (item: Item) => item.peerId === peerId && msgs.has(item.mid);\n const filter = (item: Item, idx: number, arr: Item[]) => {\n if(shouldBeDeleted(item)) {\n arr.splice(idx, 1);\n }\n };\n\n forEachReverse(this.previous, filter);\n forEachReverse(this.next, filter);\n\n if(this.current && shouldBeDeleted(this.current)) {\n this.current = undefined;\n /* if(this.go(1)) {\n this.previous.splice(this.previous.length - 1, 1);\n } else if(this.go(-1)) {\n this.next.splice(0, 1);\n } else */if(this.onEmptied) {\n this.onEmptied();\n }\n }\n };\n\n protected onHistoryMultiappend = async(message: Message.message | Message.messageService) => {\n if(this.searchContext.folderId !== undefined) {\n return;\n }\n\n // because it's reversed\n if(!this.loadedAllUp || this.loadPromiseUp) {\n return;\n }\n\n if(message.peerId !== this.searchContext.peerId) {\n return;\n }\n\n const filtered = await this.filterMids([message.mid]);\n const targets = (await Promise.all(filtered.map((message) => this.processItem(message)))).filter(Boolean);\n if(targets.length) {\n /* const {previous, current, next} = this;\n const targets = previous.concat(current, next);\n const currentIdx = targets.length;\n const mid = targets[0].mid;\n let i = 0, length = targets.length;\n for(; i < length; ++i) {\n const target = targets[i];\n if(!target || mid < target.mid) {\n break;\n }\n }\n\n if(i < currentIdx) previous.push(...targets);\n else next. */\n\n if(!this.current) {\n this.previous.push(...targets);\n } else {\n this.next.push(...targets);\n }\n }\n };\n\n protected onMessageSent = ({message}: {message: MyMessage}) => {\n this.onHistoryMultiappend(message);\n };\n\n public setSearchContext(context: SearchSuperContext) {\n this.searchContext = context;\n\n if(this.searchContext.folderId !== undefined) {\n this.loadedAllUp = true;\n\n if(this.searchContext.nextRate === undefined) {\n this.loadedAllDown = true;\n }\n }\n\n if(this.searchContext.inputFilter._ === 'inputMessagesFilterChatPhotos') {\n this.loadedAllUp = true;\n }\n\n if(this.searchContext.useSearch === false) {\n this.loadedAllDown = this.loadedAllUp = true;\n }\n\n if(this.otherSideLoader) {\n this.otherSideLoader.setSearchContext(context);\n }\n }\n\n public reset() {\n super.reset();\n this.searchContext = undefined;\n\n if(this.otherSideLoader) {\n this.otherSideLoader.reset();\n }\n }\n\n public getPrevious(withOtherSide?: boolean) {\n let previous = this.previous;\n\n if(this.otherSideLoader && withOtherSide) {\n previous = previous.concat(this.otherSideLoader.previous);\n }\n\n return previous;\n }\n\n public getNext(withOtherSide?: boolean) {\n let next = this.next;\n\n if(this.otherSideLoader && withOtherSide) {\n next = next.concat(this.otherSideLoader.next);\n }\n\n return next;\n }\n\n public getCurrent() {\n return this.current || this.otherSideLoader?.current;\n }\n\n private goToOtherEnd(length: number) {\n if(length > 0) return this.go(-this.previous.length);\n else return this.go(this.next.length);\n }\n\n public goRound(length: number, dispatchJump?: boolean) {\n let ret: ReturnType['goUnsafe']>;\n\n if(this.otherSideLoader?.current) {\n ret = this.otherSideLoader.goUnsafe(length, dispatchJump);\n if(ret.item) {\n return ret.item;\n }\n\n length = ret.leftLength;\n if(!(length > 0 ? this.otherSideLoader.next : this.otherSideLoader.previous).length) {\n const loaded = length > 0 ? this.otherSideLoader.loadedAllUp : this.otherSideLoader.loadedAllDown;\n if(!loaded) { // do not reset anything until it's loaded\n return;\n }\n\n // if other side is loaded too will start from its begin\n if((length > 0 && (this.otherSideLoader.searchContext.maxId === 1 || this.otherSideLoader.loadedAllDown)) ||\n (length < 0 && (this.otherSideLoader.searchContext.maxId === 0 || this.otherSideLoader.loadedAllUp))) {\n return this.otherSideLoader.goToOtherEnd(length);\n }\n\n this.otherSideLoader.unsetCurrent(length > 0);\n }\n }\n\n ret = this.goUnsafe(length, dispatchJump);\n if(!ret.item) {\n if(this.loadedAllUp && this.loadedAllDown) { // just use the same loader if the list is too short\n return this.goToOtherEnd(length);\n } else if(this.otherSideLoader) {\n length = ret.leftLength;\n ret = this.otherSideLoader.goUnsafe(length, dispatchJump);\n\n if(ret.item) {\n this.unsetCurrent(length > 0);\n }\n }\n }\n\n return ret?.item;\n }\n\n // public setTargets(previous: Item[], next: Item[], reverse: boolean) {\n // super.setTargets(previous, next, reverse);\n // }\n\n protected setLoaded(down: boolean, value: boolean) {\n const changed = super.setLoaded(down, value);\n\n if(changed &&\n this.otherSideLoader &&\n value &&\n this.searchContext?.useSearch !== false/* &&\n (this.reverse ? this.loadedAllUp : this.loadedAllDown) */) {\n const reverse = this.loadedAllUp;\n this.otherSideLoader.setSearchContext({\n ...this.searchContext,\n maxId: reverse ? 1 : 0\n });\n\n // these 'reverse' are different, not a mistake here.\n this.otherSideLoader.reverse = this.reverse;\n this.otherSideLoader.setLoaded(reverse, true);\n this.otherSideLoader.load(!reverse);\n }\n\n return changed;\n }\n\n public cleanup() {\n this.reset();\n rootScope.removeEventListener('history_delete', this.onHistoryDelete);\n rootScope.removeEventListener('history_multiappend', this.onHistoryMultiappend);\n rootScope.removeEventListener('message_sent', this.onMessageSent);\n this.onEmptied = undefined;\n\n if(this.otherSideLoader) {\n this.otherSideLoader.cleanup();\n this.otherSideLoader = undefined;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport generateMessageId from './generateMessageId';\nimport getServerMessageId from './getServerMessageId';\n\nexport default function incrementMessageId(messageId: number, increment: number) {\n return generateMessageId(getServerMessageId(messageId) + increment);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {fastRaf} from './schedulers';\nimport deferredPromise, {CancellablePromise} from './cancellablePromise';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport isInDOM from './dom/isInDOM';\n\nclass SequentialDom {\n private promises: Partial<{\n read: CancellablePromise,\n write: CancellablePromise\n }> = {};\n private raf = fastRaf.bind(null);\n private scheduled = false;\n\n private do(kind: keyof SequentialDom['promises'], callback?: VoidFunction) {\n let promise = this.promises[kind];\n if(!promise) {\n this.scheduleFlush();\n promise = this.promises[kind] = deferredPromise();\n }\n\n if(callback !== undefined) {\n promise.then(() => callback());\n }\n\n return promise;\n }\n\n public measure(callback?: VoidFunction) {\n return this.do('read', callback);\n }\n\n public mutate(callback?: VoidFunction) {\n return this.do('write', callback);\n }\n\n /**\n * Will fire instantly if element is not connected\n * @param element\n * @param callback\n */\n public mutateElement(element: HTMLElement, callback?: VoidFunction) {\n const isConnected = isInDOM(element);\n const promise = isConnected ? this.mutate() : Promise.resolve();\n\n if(callback !== undefined) {\n if(!isConnected) {\n callback();\n } else {\n promise.then(() => callback());\n }\n }\n\n return promise;\n }\n\n private scheduleFlush() {\n if(!this.scheduled) {\n this.scheduled = true;\n\n this.raf(() => {\n this.promises.read && this.promises.read.resolve();\n this.promises.write && this.promises.write.resolve();\n\n this.scheduled = false;\n this.promises = {};\n });\n }\n }\n}\n\nconst sequentialDom = new SequentialDom();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.sequentialDom = sequentialDom);\nexport default sequentialDom;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PhotoSize, WebDocument} from '../layer';\nimport {REPLIES_HIDDEN_CHANNEL_ID} from '../lib/mtproto/mtproto_config';\nimport {MyDocument} from '../lib/appManagers/appDocsManager';\nimport {MyPhoto} from '../lib/appManagers/appPhotosManager';\nimport choosePhotoSize from '../lib/appManagers/utils/photos/choosePhotoSize';\nimport {MediaSize, makeMediaSize} from './mediaSize';\nimport isWebDocument from '../lib/appManagers/utils/webDocs/isWebDocument';\n\nexport default function setAttachmentSize(\n photo: MyPhoto | MyDocument | WebDocument,\n element: HTMLElement | SVGForeignObjectElement,\n boxWidth: number,\n boxHeight: number,\n noZoom = true,\n message?: any,\n pushDocumentSize?: boolean,\n photoSize?: ReturnType\n) {\n const _isWebDocument = isWebDocument(photo);\n // if(_isWebDocument && pushDocumentSize === undefined) {\n // pushDocumentSize = true;\n // }\n\n if(!photoSize) {\n photoSize = choosePhotoSize(photo, boxWidth, boxHeight, undefined, pushDocumentSize);\n }\n // console.log('setAttachmentSize', photo, photo.sizes[0].bytes, div);\n\n let size: MediaSize;\n const isDocument = photo._ === 'document';\n if(isDocument || _isWebDocument) {\n size = makeMediaSize(photo.w || (photoSize as PhotoSize.photoSize).w || 512, photo.h || (photoSize as PhotoSize.photoSize).h || 512);\n } else {\n size = makeMediaSize((photoSize as PhotoSize.photoSize).w || 100, (photoSize as PhotoSize.photoSize).h || 100);\n }\n\n let boxSize = makeMediaSize(boxWidth, boxHeight);\n\n boxSize = size = size.aspect(boxSize, noZoom);\n\n let isFit = true;\n\n if(!isDocument || ['video', 'gif'].includes(photo.type) || _isWebDocument) {\n if(boxSize.width < 200 && boxSize.height < 200) { // make at least one side this big\n boxSize = size = size.aspectCovered(makeMediaSize(200, 200));\n }\n\n if(message &&\n (message.message ||\n message.reply_to_mid ||\n message.media.webpage ||\n (message.replies && message.replies.pFlags.comments && message.replies.channel_id.toChatId() !== REPLIES_HIDDEN_CHANNEL_ID)\n )\n ) { // make sure that bubble block is human-readable\n if(boxSize.width < 320) {\n boxSize = makeMediaSize(320, boxSize.height);\n isFit = false;\n }\n }\n\n if(isFit && boxSize.width < 120 && message) { // if image is too narrow\n boxSize = makeMediaSize(120, boxSize.height);\n isFit = false;\n }\n }\n\n // if(element instanceof SVGForeignObjectElement) {\n // element.setAttributeNS(null, 'width', '' + w);\n // element.setAttributeNS(null, 'height', '' + h);\n\n // //console.log('set dimensions to svg element:', element, w, h);\n // } else {\n element.style.width = boxSize.width + 'px';\n element.style.height = boxSize.height + 'px';\n // }\n\n return {photoSize, size, isFit};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {logger} from '../lib/logger';\nimport insertInDescendSortedArray from './array/insertInDescendSortedArray';\nimport {getMiddleware, MiddlewareHelper} from './middleware';\nimport middlewarePromise from './middlewarePromise';\nimport safeAssign from './object/safeAssign';\nimport pause from './schedulers/pause';\n\nexport type SortedElementBase = {\n id: T,\n index: number\n};\n\nlet id = 0;\n\nexport class BatchProcessor {\n protected queue: Promise[];\n protected promise: Promise;\n\n protected middlewareHelper: MiddlewareHelper;\n protected log: ReturnType;\n\n protected process: (batch: Item[], m: ReturnType, log: BatchProcessor['log']) => Promise;\n protected possibleError: any;\n\n constructor(options: {\n log?: BatchProcessor['log'],\n // middleware: MiddlewareHelper,\n process: BatchProcessor['process'],\n possibleError?: BatchProcessor['possibleError']\n }) {\n safeAssign(this, options);\n\n this.queue = [];\n this.middlewareHelper ??= getMiddleware();\n\n const prefix = 'BATCH-PROCESSOR-' + ++id;\n if(this.log) {\n this.log = this.log.bindPrefix(prefix);\n } else {\n this.log = logger(prefix);\n }\n }\n\n public get queuePromise() {\n return this.promise;\n }\n\n public clear() {\n this.log('clear');\n this.queue.length = 0;\n this.promise = undefined;\n this.middlewareHelper.clean();\n }\n\n public addToQueue(item: BatchProcessor['queue'][0]) {\n this.queue.push(item);\n return this.setQueue();\n }\n\n protected setQueue() {\n if(!this.queue.length) {\n return Promise.resolve();\n }\n\n if(this.promise) {\n return this.promise;\n }\n\n const middleware = this.middlewareHelper.get();\n const log = this.log.bindPrefix('queue');\n const m = middlewarePromise(middleware, this.possibleError);\n\n const processQueue = async(): Promise => {\n log('start', this.queue.length);\n\n const queue = this.queue.splice(0, this.queue.length);\n\n const perf = performance.now();\n const promises = queue.map((promise) => {\n promise.then((details) => {\n log('render item time', performance.now() - perf, details);\n });\n\n return promise;\n });\n\n const renderedQueue = await m(Promise.all(promises));\n await m(this.process(renderedQueue, m, log));\n\n log('queue rendered');\n\n if(this.queue.length) {\n log('have new items to render');\n return processQueue();\n } else {\n log('end');\n }\n };\n\n log('setting pause');\n const promise = this.promise = m(pause(0))\n .then(\n () => processQueue().catch((err: ApiError) => {\n if(err !== this.possibleError) {\n log.error('process queue error', err);\n }\n\n throw err;\n }),\n (err) => {\n log('pause has been cleared');\n throw err;\n }\n )\n .finally(() => {\n if(this.promise === promise) {\n this.promise = undefined;\n }\n });\n\n return promise;\n }\n}\n\nexport default class SortedList {\n protected elements: Map;\n protected sorted: Array;\n\n protected getIndex: (element: SortedElement) => PromiseLike | number;\n protected onDelete: (element: SortedElement) => void;\n protected onUpdate: (element: SortedElement) => void;\n protected onSort: (element: SortedElement, idx: number) => void;\n protected onElementCreate: (base: SortedElementBase) => PromiseLike | SortedElement;\n\n protected updateElementWith = (callback: () => void) => callback();\n protected updateListWith = (callback: (canUpdate: boolean | undefined) => void) => callback(true);\n\n protected middleware: MiddlewareHelper;\n\n protected batchProcessor: BatchProcessor;\n\n protected log: ReturnType;\n\n constructor(options: {\n getIndex: SortedList['getIndex'],\n onDelete?: SortedList['onDelete'],\n onUpdate?: SortedList['onUpdate'],\n onSort?: SortedList['onSort'],\n onElementCreate: SortedList['onElementCreate'],\n\n updateElementWith?: SortedList['updateElementWith'],\n updateListWith?: SortedList['updateListWith'],\n\n log?: SortedList['log']\n }) {\n safeAssign(this, options);\n\n this.elements = new Map();\n this.sorted = [];\n this.middleware = getMiddleware();\n\n this.batchProcessor = new BatchProcessor({\n log: this.log,\n process: async(batch, m, log) => {\n // const elements = await Promise.all(batch.map((element) => this.onElementCreate(element)));\n const elements = batch;\n const promises = elements.map((element) => this.update(element.id, element));\n await m(Promise.all(promises));\n }\n });\n }\n\n public clear() {\n this.batchProcessor.clear();\n this.middleware.clean();\n this.elements.clear();\n this.sorted.length = 0;\n }\n\n protected _updateList() {\n this.elements.forEach((element) => {\n this.update(element.id);\n });\n\n if(this.onSort) {\n this.sorted.forEach((element, idx) => {\n this.onSort(element, idx);\n });\n }\n }\n\n public updateList(callback?: (updated: boolean) => void) {\n const middleware = this.middleware.get();\n this.updateListWith((canUpdate) => {\n if(!middleware() || (canUpdate !== undefined && !canUpdate)) {\n callback?.(false);\n return;\n }\n\n this._updateList();\n\n callback?.(true);\n });\n }\n\n public has(id: SortedElementId) {\n return this.elements.has(id);\n }\n\n public get(id: SortedElementId) {\n return this.elements.get(id);\n }\n\n public getAll() {\n return this.elements;\n }\n\n public async add(id: SortedElementId) {\n const element = this.get(id);\n if(element) {\n return;\n // return element;\n }\n\n const base: SortedElementBase = {\n id,\n index: 0\n };\n\n this.elements.set(id, base as SortedElement);\n const createPromise = Promise.resolve(this.onElementCreate(base));\n return this.batchProcessor.addToQueue(createPromise);\n\n // return element;\n }\n\n public delete(id: SortedElementId, noScheduler?: boolean) {\n const element = this.elements.get(id);\n if(!element) {\n return false;\n }\n\n this.elements.delete(id);\n\n const idx = this.sorted.indexOf(element);\n if(idx !== -1) {\n this.sorted.splice(idx, 1);\n }\n\n if(this.onDelete) {\n if(noScheduler) {\n this.onDelete(element);\n } else {\n const middleware = this.middleware.get();\n this.updateElementWith(() => {\n if(!middleware()) {\n return;\n }\n\n this.onDelete(element);\n });\n }\n }\n\n return true;\n }\n\n public async update(id: SortedElementId, element = this.get(id)) {\n if(!element) {\n return;\n }\n\n element.index = await this.getIndex(element);\n if(this.get(id) !== element) {\n return;\n }\n\n this.onUpdate?.(element);\n\n const idx = insertInDescendSortedArray(this.sorted, element, 'index');\n this.onSort(element, idx);\n }\n}\n","const BOM = '';\n// const BOM = 'K';\nexport default BOM;\n","export default function encodeEntities(value: string) {\n return value.replace(/&/g, '&').replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, (value) => {\n const hi = value.charCodeAt(0);\n const low = value.charCodeAt(1);\n return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';\n }).replace(/([^\\#-~| |!])/g, (value) => { // non-alphanumeric\n return '&#' + value.charCodeAt(0) + ';';\n }).replace(//g, '>');\n}\n","// credits to https://github.com/sindresorhus/escape-string-regexp/blob/master/index.js\nexport default function escapeRegExp(str: string) {\n return str\n .replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n .replace(/-/g, '\\\\x2d');\n}\n","export default function limitSymbols(str: string, length: number, limitFrom = length + 10) {\n str = str.trim();\n if(str.length > limitFrom) {\n str = str.slice(0, length)/* .replace(/\\s*$/, '') */ + '...';\n }\n\n return str;\n}\n","export default function toHHMMSS(str: string | number, leadZero = false) {\n const sec_num = parseInt(str + '', 10);\n const hours = Math.floor(sec_num / 3600);\n let minutes: any = Math.floor((sec_num - (hours * 3600)) / 60);\n let seconds: any = sec_num - (hours * 3600) - (minutes * 60);\n\n if(hours) leadZero = true;\n if(minutes < 10) minutes = leadZero ? '0' + minutes : minutes;\n if(seconds < 10) seconds = '0' + seconds;\n return (hours ? /* ('0' + hours).slice(-2) */hours + ':' : '') + minutes + ':' + seconds;\n}\n","export default function textToSvgURL(text: string) {\n const blob = new Blob([text], {type: 'image/svg+xml;charset=utf-8'});\n\n // * because iOS Safari doesn't want to eat objectURL\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n resolve(e.target.result as string);\n };\n reader.readAsDataURL(blob);\n });\n // return URL.createObjectURL(blob);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {IS_WORKER} from './context';\n\nexport class WindowSize {\n public width: number;\n public height: number;\n\n constructor() {\n if(IS_WORKER) {\n return;\n }\n\n // @ts-ignore\n const w: any = 'visualViewport' in window ? window.visualViewport : window;\n const set = () => {\n this.width = w.width || w.innerWidth;\n this.height = w.height || w.innerHeight;\n };\n w.addEventListener('resize', set);\n set();\n }\n}\n\nconst windowSize = new WindowSize();\nexport default windowSize;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's useHeavyAnimationCheck.ts, patched\n\nimport {AnyToVoidFunction} from '../types';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport DEBUG from '../config/debug';\nimport pause from '../helpers/schedulers/pause';\nimport EventListenerBase from '../helpers/eventListenerBase';\n\nconst eventListener = new EventListenerBase<{\n start: () => void,\n end: () => void\n}>();\nconst ANIMATION_START_EVENT = 'start';\nconst ANIMATION_END_EVENT = 'end';\n\nlet isAnimating = false;\nlet heavyAnimationPromise: CancellablePromise = deferredPromise();\nlet promisesInQueue = 0;\n\nheavyAnimationPromise.resolve();\n\nconst log = console.log.bind(console.log, '[HEAVY-ANIMATION]:');\n\nexport function dispatchHeavyAnimationEvent(promise: Promise, timeout?: number) {\n if(!isAnimating) {\n heavyAnimationPromise = deferredPromise();\n eventListener.dispatchEvent(ANIMATION_START_EVENT);\n isAnimating = true;\n DEBUG && log('start');\n }\n\n ++promisesInQueue;\n DEBUG && log('attach promise, length:', promisesInQueue, timeout);\n\n const promises = [\n timeout !== undefined ? pause(timeout) : undefined,\n promise.finally(() => {})\n ].filter(Boolean);\n\n const perf = performance.now();\n const _heavyAnimationPromise = heavyAnimationPromise;\n Promise.race(promises).then(() => {\n if(heavyAnimationPromise !== _heavyAnimationPromise || heavyAnimationPromise.isFulfilled) { // interrupted\n return;\n }\n\n --promisesInQueue;\n DEBUG && log('promise end, length:', promisesInQueue, performance.now() - perf);\n if(promisesInQueue <= 0) {\n onHeavyAnimationEnd();\n }\n });\n\n return heavyAnimationPromise;\n}\n\n(window as any).dispatchHeavyAnimationEvent = dispatchHeavyAnimationEvent;\n\nfunction onHeavyAnimationEnd() {\n if(heavyAnimationPromise.isFulfilled) {\n return;\n }\n\n isAnimating = false;\n promisesInQueue = 0;\n eventListener.dispatchEvent(ANIMATION_END_EVENT);\n heavyAnimationPromise.resolve();\n\n DEBUG && log('end');\n}\n\nexport function interruptHeavyAnimation() {\n onHeavyAnimationEnd();\n}\n\nexport function getHeavyAnimationPromise() {\n return heavyAnimationPromise;\n}\n\nexport default function(\n handleAnimationStart: AnyToVoidFunction,\n handleAnimationEnd: AnyToVoidFunction,\n listenerSetter?: ListenerSetter\n) {\n // useEffect(() => {\n if(isAnimating) {\n handleAnimationStart();\n }\n\n const add = listenerSetter ? listenerSetter.add(eventListener) : eventListener.addEventListener.bind(eventListener);\n const remove = listenerSetter ? listenerSetter.removeManual.bind(listenerSetter, eventListener) : eventListener.removeEventListener.bind(eventListener);\n add(ANIMATION_START_EVENT, handleAnimationStart);\n add(ANIMATION_END_EVENT, handleAnimationEnd);\n\n return () => {\n remove(ANIMATION_END_EVENT, handleAnimationEnd);\n remove(ANIMATION_START_EVENT, handleAnimationStart);\n };\n // }, [handleAnimationEnd, handleAnimationStart]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Dialog} from '../lib/appManagers/appMessagesManager';\nimport type {ApiLimitType} from '../lib/mtproto/api_methods';\nimport type {ForumTopic} from '../layer';\nimport appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../lib/appManagers/appDialogsManager';\nimport rootScope from '../lib/rootScope';\nimport {ButtonMenuItemOptionsVerifiable, ButtonMenuSync} from './buttonMenu';\nimport PopupDeleteDialog from './popups/deleteDialog';\nimport {i18n, LangPackKey, _i18n} from '../lib/langPack';\nimport findUpTag from '../helpers/dom/findUpTag';\nimport {toastNew} from './toast';\nimport PopupMute from './popups/mute';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport positionMenu from '../helpers/positionMenu';\nimport contextMenuController from '../helpers/contextMenuController';\nimport {GENERAL_TOPIC_ID} from '../lib/mtproto/mtproto_config';\nimport showLimitPopup from './popups/limit';\n\nexport default class DialogsContextMenu {\n private element: HTMLElement;\n private buttons: ButtonMenuItemOptionsVerifiable[];\n\n private peerId: PeerId;\n private filterId: number;\n private threadId: number;\n private dialog: Dialog | ForumTopic.forumTopic;\n private canManageTopics: boolean;\n\n constructor(private managers: AppManagers) {\n\n }\n\n private init() {\n this.buttons = [{\n icon: 'unread',\n text: 'MarkAsUnread',\n onClick: this.onUnreadClick,\n verify: async() => !this.threadId && !(await this.managers.appMessagesManager.isDialogUnread(this.dialog))\n }, {\n icon: 'readchats',\n text: 'MarkAsRead',\n onClick: this.onUnreadClick,\n verify: () => this.managers.appMessagesManager.isDialogUnread(this.dialog)\n }, {\n icon: 'pin',\n text: 'ChatList.Context.Pin',\n onClick: this.onPinClick,\n verify: async() => {\n if(this.threadId && !this.canManageTopics) {\n return false;\n }\n\n const isPinned = this.filterId !== undefined && this.filterId > 1 ?\n (await this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId) :\n !!this.dialog.pFlags?.pinned;\n return !isPinned;\n }\n }, {\n icon: 'unpin',\n text: 'ChatList.Context.Unpin',\n onClick: this.onPinClick,\n verify: async() => {\n if(this.threadId && !this.canManageTopics) {\n return false;\n }\n\n const isPinned = this.filterId !== undefined && this.filterId > 1 ?\n (await this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId) :\n !!this.dialog.pFlags?.pinned;\n return isPinned;\n }\n }, {\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: async() => {\n return this.peerId !== rootScope.myId && !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.dialog.peerId, threadId: this.threadId}));\n }\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: this.onUnmuteClick,\n verify: async() => {\n return this.peerId !== rootScope.myId && (await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.dialog.peerId, threadId: this.threadId}));\n }\n }, {\n icon: 'archive',\n text: 'Archive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 0 && this.peerId !== rootScope.myId\n }, {\n icon: 'unarchive',\n text: 'Unarchive',\n onClick: this.onArchiveClick,\n verify: () => this.filterId === 1 && this.peerId !== rootScope.myId\n }, {\n icon: 'hide',\n text: 'Hide',\n onClick: this.hideTopic,\n verify: async() => {\n return this.canManageTopics && (this.dialog as ForumTopic.forumTopic).id === GENERAL_TOPIC_ID;\n }\n }, {\n icon: 'lock',\n text: 'CloseTopic',\n onClick: this.toggleTopic,\n verify: () => {\n return this.canManageTopics && !(this.dialog as ForumTopic.forumTopic).pFlags.closed;\n }\n }, {\n icon: 'lockoff',\n text: 'RestartTopic',\n onClick: this.toggleTopic,\n verify: () => {\n return this.canManageTopics && !!(this.dialog as ForumTopic.forumTopic).pFlags.closed;\n }\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: async() => {\n if(this.threadId) {\n if(!this.canManageTopics) {\n return false;\n }\n\n return (this.dialog as ForumTopic.forumTopic).id !== GENERAL_TOPIC_ID;\n }\n\n return true;\n }\n }];\n\n this.element = ButtonMenuSync({buttons: this.buttons});\n this.element.id = 'dialogs-contextmenu';\n this.element.classList.add('contextmenu');\n document.getElementById('page-chats').append(this.element);\n }\n\n private onArchiveClick = async() => {\n const dialog = await this.managers.appMessagesManager.getDialogOnly(this.peerId);\n if(dialog) {\n this.managers.appMessagesManager.editPeerFolders([dialog.peerId], +!dialog.folder_id);\n }\n };\n\n private hideTopic = () => {\n this.managers.appChatsManager.editForumTopic({\n chatId: this.peerId.toChatId(),\n topicId: this.threadId,\n hidden: true\n });\n };\n\n private toggleTopic = () => {\n this.managers.appChatsManager.editForumTopic({\n chatId: this.peerId.toChatId(),\n topicId: this.threadId,\n closed: !(this.dialog as ForumTopic.forumTopic).pFlags.closed\n });\n };\n\n private onPinClick = () => {\n const {peerId, filterId, threadId} = this;\n this.managers.appMessagesManager.toggleDialogPin({\n peerId,\n filterId,\n topicId: threadId\n }).catch(async(err: ApiError) => {\n if(err.type === 'PINNED_DIALOGS_TOO_MUCH' || err.type === 'PINNED_TOO_MUCH') {\n if(threadId) {\n this.managers.apiManager.getLimit('topicPin').then((limit) => {\n toastNew({langPackKey: 'LimitReachedPinnedTopics', langPackArguments: [limit]});\n });\n } else if(filterId >= 1) {\n toastNew({langPackKey: 'PinFolderLimitReached'});\n } else {\n showLimitPopup('pin');\n }\n }\n });\n };\n\n private onUnmuteClick = () => {\n this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, mute: false, threadId: this.threadId});\n };\n\n private onMuteClick = () => {\n new PopupMute(this.peerId, this.threadId);\n };\n\n private onUnreadClick = async() => {\n const {peerId, dialog} = this;\n if(dialog.unread_count) {\n this.managers.appMessagesManager.readHistory(peerId, dialog.top_message, this.threadId);\n\n if(!this.threadId) {\n this.managers.appMessagesManager.markDialogUnread(peerId, true);\n }\n } else if(!this.threadId) {\n this.managers.appMessagesManager.markDialogUnread(peerId);\n }\n };\n\n private onDeleteClick = () => {\n new PopupDeleteDialog(this.peerId, undefined, undefined, this.threadId);\n };\n\n onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n let li: HTMLElement = null;\n\n try {\n li = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n } catch(e) {}\n\n if(!li) return;\n\n if(e instanceof MouseEvent) e.preventDefault();\n if(this.element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent) e.cancelBubble = true;\n\n const r = async() => {\n this.peerId = li.dataset.peerId.toPeerId();\n this.threadId = +li.dataset.threadId || undefined;\n this.dialog = await this.managers.dialogsStorage.getDialogOrTopic(this.peerId, this.threadId);\n this.filterId = this.threadId ? undefined : appDialogsManager.filterId;\n this.canManageTopics = this.threadId ? await this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'manage_topics') : undefined;\n\n await Promise.all(this.buttons.map(async(button) => {\n const good = await button.verify();\n\n button.element.classList.toggle('hide', !good);\n }));\n\n const langPackKey: LangPackKey = this.threadId ? 'Delete' : await this.managers.appPeersManager.getDeleteButtonText(this.peerId);\n // delete button\n this.buttons[this.buttons.length - 1].element.lastChild.replaceWith(i18n(langPackKey));\n\n li.classList.add('menu-open');\n positionMenu(e, this.element);\n contextMenuController.openBtnMenu(this.element, () => {\n li.classList.remove('menu-open');\n this.peerId = this.dialog = this.filterId = this.threadId = this.canManageTopics = undefined;\n });\n };\n\n r();\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../config/app';\nimport DEBUG from '../config/debug';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport {LangPackKey, i18n} from '../lib/langPack';\nimport {logger} from '../lib/logger';\nimport rootScope from '../lib/rootScope';\nimport Button from './button';\nimport ProgressivePreloader from './preloader';\nimport SetTransition from './singleTransition';\nimport sessionStorage from '../lib/sessionStorage';\nimport {ConnectionStatus} from '../lib/mtproto/connectionStatus';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport singleInstance from '../lib/mtproto/singleInstance';\n\nexport default class ConnectionStatusComponent {\n public static CHANGE_STATE_DELAY = 1000;\n\n private statusContainer: HTMLElement;\n private statusEl: HTMLElement;\n private statusPreloader: ProgressivePreloader;\n\n private currentLangPackKey: LangPackKey;\n\n private hadConnect = false;\n private retryAt: number;\n private connecting = false;\n private timedOut = false;\n private updating = false;\n\n private log: ReturnType;\n\n private setFirstConnectionTimeout: number;\n private setStateTimeout: number;\n\n constructor(private managers: AppManagers, chatsContainer: HTMLElement) {\n this.log = logger('CS', undefined, undefined);\n\n this.statusContainer = document.createElement('div');\n this.statusContainer.classList.add('connection-status'/* , 'hide' */);\n\n this.statusEl = Button('btn-primary bg-warning connection-status-button', {noRipple: true});\n this.statusPreloader = new ProgressivePreloader({cancelable: false});\n this.statusPreloader.constructContainer({color: 'transparent', bold: true});\n this.statusContainer.append(this.statusEl);\n\n chatsContainer.prepend(this.statusContainer);\n\n rootScope.addEventListener('connection_status_change', (status) => {\n // console.log(status);\n\n this.setConnectionStatus();\n });\n\n rootScope.addEventListener('state_synchronizing', (channelId) => {\n if(!channelId) {\n this.updating = true;\n DEBUG && this.log('updating', this.updating);\n this.setState();\n }\n });\n\n rootScope.addEventListener('state_synchronized', (channelId) => {\n DEBUG && this.log('state_synchronized', channelId);\n if(!channelId) {\n this.updating = false;\n DEBUG && this.log('updating', this.updating);\n this.setState();\n }\n });\n\n this.setFirstConnectionTimeout = window.setTimeout(this.setConnectionStatus, ConnectionStatusComponent.CHANGE_STATE_DELAY + 1e3);\n\n // let bool = true;\n // document.addEventListener('dblclick', () => {\n // this.setConnectionStatus(bool ? (bool = false, ConnectionStatus.Closed) : (bool = true, ConnectionStatus.Connected));\n // });\n }\n\n private setConnectionStatus = (overrideStatus?: ConnectionStatus) => {\n Promise.all([\n sessionStorage.get('dc'),\n rootScope.managers.rootScope.getConnectionStatus()\n ]).then(([baseDcId, connectionStatus]) => {\n if(!baseDcId) {\n baseDcId = App.baseDcId;\n }\n\n if(this.setFirstConnectionTimeout) {\n clearTimeout(this.setFirstConnectionTimeout);\n this.setFirstConnectionTimeout = 0;\n }\n\n const status = connectionStatus['NET-' + baseDcId];\n const online = status && (overrideStatus || status.status) === ConnectionStatus.Connected;\n\n if(this.connecting && online) {\n this.managers.apiUpdatesManager.forceGetDifference();\n }\n\n if(online && !this.hadConnect) {\n this.hadConnect = true;\n }\n\n this.timedOut = status && (overrideStatus || status.status) === ConnectionStatus.TimedOut;\n this.connecting = !online;\n this.retryAt = status && status.retryAt;\n DEBUG && this.log('connecting', this.connecting);\n this.setState();\n });\n };\n\n private setStatusText = (langPackKey: LangPackKey, args?: any[]) => {\n if(this.currentLangPackKey === langPackKey) return;\n this.currentLangPackKey = langPackKey;\n replaceContent(this.statusEl, i18n(langPackKey, args));\n this.statusPreloader.attach(this.statusEl);\n };\n\n private getA(langPackKey: LangPackKey, callback: () => void) {\n const a = document.createElement('a');\n a.classList.add('force-reconnect');\n a.append(i18n(langPackKey));\n attachClickEvent(a, (e) => {\n cancelEvent(e);\n callback();\n });\n\n return a;\n }\n\n private setState = () => {\n if(singleInstance.deactivatedReason) {\n return;\n }\n\n const timeout = ConnectionStatusComponent.CHANGE_STATE_DELAY;\n if(this.connecting) {\n if(this.timedOut) {\n const a = this.getA('ConnectionStatus.ForceReconnect', () => this.managers.networkerFactory.forceReconnect());\n this.setStatusText('ConnectionStatus.TimedOut', [a]);\n } else if(this.hadConnect) {\n if(this.retryAt !== undefined) {\n const timerSpan = document.createElement('span');\n const retryAt = this.retryAt;\n const setTime = () => {\n const now = Date.now();\n timerSpan.innerText = '' + Math.max(0, Math.round((retryAt - now) / 1000));\n if(now > retryAt) {\n clearInterval(interval);\n }\n };\n const interval = setInterval(setTime, 1e3);\n setTime();\n\n const a = this.getA('ConnectionStatus.Reconnect', () => this.managers.networkerFactory.forceReconnectTimeout());\n this.setStatusText('ConnectionStatus.ReconnectIn', [timerSpan, a]);\n } else {\n this.setStatusText('ConnectionStatus.Reconnecting');\n }\n } else {\n this.setStatusText('ConnectionStatus.Waiting');\n }\n } else if(this.updating) {\n this.setStatusText('Updating');\n }\n\n DEBUG && this.log('setState', this.connecting || this.updating);\n window.requestAnimationFrame(() => {\n if(this.setStateTimeout) clearTimeout(this.setStateTimeout);\n\n const cb = () => {\n SetTransition({\n element: this.statusContainer,\n className: 'is-shown',\n forwards: this.connecting || this.updating,\n duration: 200\n });\n this.setStateTimeout = 0;\n DEBUG && this.log('setState: isShown:', this.connecting || this.updating);\n };\n\n this.setStateTimeout = window.setTimeout(cb, timeout);\n // cb();\n /* if(timeout) this.setStateTimeout = window.setTimeout(cb, timeout);\n else cb(); */\n });\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message} from '../layer';\n/* import findUpClassName from \"../helpers/dom/findUpClassName\";\nimport rootScope from \"../lib/rootScope\";\nimport Transition from \"./transition\"; */\n\nexport enum SENDING_STATUS {\n Error = -1,\n Pending,\n Sent,\n Read\n}\n\nexport function getSendingStatus(message: Message.message | Message.messageService) {\n return message.pFlags.is_outgoing ?\n SENDING_STATUS.Pending : (\n message.pFlags.unread ?\n SENDING_STATUS.Sent :\n SENDING_STATUS.Read\n );\n}\n\ntype C = 'check' | 'checks' | 'sending' | 'sendingerror' | 'premium_lock';\nexport function setSendingStatus(\n container: HTMLElement,\n message?: C | Message.message | Message.messageService,\n disableAnimationIfRippleFound?: boolean\n) {\n let className: C;\n if(typeof(message) === 'string') {\n className = message;\n } else if(message?.pFlags.out) {\n if(message.error) {\n className = 'sendingerror';\n } else if(message.pFlags.is_outgoing) {\n className = 'sending';\n } else if(message.pFlags.unread) {\n className = 'check';\n } else {\n className = 'checks';\n }\n }\n\n if(!className) {\n container.textContent = '';\n return;\n }\n\n const iconClassName = 'tgico-' + className;\n const lastElement = container.lastElementChild as HTMLElement;\n if(lastElement && lastElement.classList.contains(iconClassName)) {\n return;\n }\n\n const element = document.createElement('i');\n element.classList.add('sending-status-icon', /* 'transition-item', */ iconClassName);\n container.append(element);\n\n if(lastElement) {\n lastElement.remove();\n }\n\n /* if(!lastElement) {\n element.classList.add('active');\n return;\n }\n\n const select = Transition(container, undefined, 350, () => {\n lastElement.remove();\n }, false, true, false);\n\n let animate = rootScope.settings.animationsEnabled && className !== 'sending' && !lastElement.classList.contains('tgico-sending');\n if(disableAnimationIfRippleFound && animate) {\n const parent = findUpClassName(container, 'rp');\n if(parent.querySelector('.c-ripple__circle') || parent.matches(':hover')) {\n animate = false;\n }\n }\n\n select(element, animate, lastElement); */\n\n /* SetTransition(lastElement, 'is-visible', false, 350, () => {\n // lastElement.remove();\n }, 2);\n SetTransition(element, 'is-visible', true, 350, undefined, 2); */\n}\n","// https://spicyyoghurt.com/tools/easing-functions\nexport default function easeInOutSine(t: number, b: number, c: number, d: number) {\n return t >= d ? b + c : easeInOutSineApply(t / d, c) + b;\n}\n\nexport function easeInOutSineApply(v: number, c: number) {\n return -c / 2 * (Math.cos(Math.PI * v) - 1);\n}\n","export default function roundRect(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n radius: {[k in 'tl' | 'tr' | 'br' | 'bl']?: number} | number,\n fill?: boolean,\n stroke?: boolean\n) {\n const dpr = ctx.canvas.dpr;\n if(dpr) {\n x *= dpr;\n y *= dpr;\n width *= dpr;\n height *= dpr;\n }\n\n if(typeof(radius) === 'number') {\n if(dpr) radius *= dpr;\n radius = {tl: radius, tr: radius, br: radius, bl: radius};\n } else {\n const defaultRadius = {tl: 0, tr: 0, br: 0, bl: 0};\n for(const side in defaultRadius) {\n // @ts-ignore\n radius[side] = radius[side] ? (dpr ? radius[side] * dpr : radius[side]) : defaultRadius[side];\n }\n }\n\n ctx.beginPath();\n ctx.moveTo(x + radius.tl, y);\n ctx.lineTo(x + width - radius.tr, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr);\n ctx.lineTo(x + width, y + height - radius.br);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius.br, y + height);\n ctx.lineTo(x + radius.bl, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl);\n ctx.lineTo(x, y + radius.tl);\n ctx.quadraticCurveTo(x, y, x + radius.tl, y);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {animate} from '../helpers/animation';\nimport customProperties from '../helpers/dom/customProperties';\nimport easeInOutSine from '../helpers/easing/easeInOutSine';\nimport mediaSizes from '../helpers/mediaSizes';\nimport roundRect from '../helpers/canvas/roundRect';\n\nconst DPR = window.devicePixelRatio;\nconst SIZE = 20 * DPR;\nconst MARGIN = 2.5 * DPR;\nconst WIDTH = 2 * DPR;\nconst RADIUS = 1 * DPR;\nconst LENGTH = 3;\n\nconst MIN_HEIGHT = 4;\nconst MAX_HEIGHT = 12;\nconst DURATION = 1000;\n\nexport default function groupCallActiveIcon(isActive = false) {\n const canvas = document.createElement('canvas');\n canvas.width = canvas.height = SIZE;\n const context = canvas.getContext('2d');\n\n const TOTAL_WIDTH = LENGTH * WIDTH + (LENGTH - 1) * MARGIN;\n const START_X = (SIZE - TOTAL_WIDTH) / 2;\n\n const startTime = Date.now();\n let wasMounted = false;\n // let hadRound = false;\n const renderFrame = () => {\n if(!canvas.isConnected) {\n if(wasMounted) {\n return false;\n }\n } else if(!wasMounted) {\n wasMounted = canvas.isConnected;\n }\n\n const time = Date.now();\n // if(((time - startTime) / DURATION) >= 1) {\n // hadRound = true;\n // }\n\n const progress = easeInOutSine((time - startTime) % DURATION, 0, 1, DURATION);\n\n context.clearRect(0, 0, SIZE, SIZE);\n context.fillStyle = isActive && !mediaSizes.isMobile ? customProperties.getProperty('primary-color') : '#fff';\n\n for(let i = 0; i < LENGTH; ++i) {\n const x = START_X + (i * WIDTH) + (i * MARGIN);\n\n let itemProgress: number;\n if(progress >= .5) {\n itemProgress = i % 2 ? 2 - progress * 2 : (progress - .5) * 2;\n } else {\n itemProgress = i % 2 ? progress * 2 : 1 - progress * 2;\n }\n\n let height = MIN_HEIGHT + (itemProgress * (MAX_HEIGHT - MIN_HEIGHT));\n /* if(!hadRound && i === 1) {\n console.log('call status animation', itemProgress, height, progress, progress >= .5);\n } */\n\n height *= DPR;\n const y = (SIZE - height) / 2;\n\n roundRect(context, x, y, WIDTH, height, RADIUS, true);\n }\n\n return true;\n };\n\n return {\n canvas,\n startAnimation: () => {\n animate(renderFrame);\n renderFrame();\n },\n setActive: (active: boolean) => {\n isActive = active;\n renderFrame();\n }\n };\n}\n","import customProperties from '../dom/customProperties';\nimport clamp from '../number/clamp';\n\nexport default class Shimmer {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private font = '30pt Helvetica';\n private currTime = Date.now();\n private diffTime = 0;\n private spread = 0;\n private paused = false;\n private pausedTime = 0;\n private pauseInterval = 850;\n private lightSource = 0;\n private inc = 0.032;\n private lightSpread = 0.55;\n private animations = ['slide', 'slide', 'slide', 'slide'];\n private currentAnimationIndex = 0;\n private text: string;\n private fillStyle: CanvasRenderingContext2D['fillStyle'];\n\n private keepTime() {\n this.diffTime = Date.now() - this.currTime;\n this.currTime = Date.now();\n }\n\n private cycleAnimation() {\n ++this.currentAnimationIndex;\n if(this.currentAnimationIndex >= this.animations.length) {\n this.currentAnimationIndex = 0;\n }\n }\n\n private animate() {\n const currentAnimation = this.animations[this.currentAnimationIndex];\n if(currentAnimation === 'glow') {\n return this.animateGlow(); // return glow style\n } else if(currentAnimation === 'slide') {\n return this.animateSlide(); // return slide gradient\n } else {\n console.log('unknown animation type: ' + String(currentAnimation));\n }\n }\n\n private animateGlow() {\n var glowEnd = 255,\n rgbStart = 68,\n r = rgbStart,\n g = r,\n b = r,\n increment = 10,\n interval = 800;\n\n return () => {\n var smartInc = increment * (this.diffTime / (1000 / 60));\n if(this.paused) {\n if((Date.now() - this.pausedTime) > interval) {\n r = rgbStart;\n this.cycleAnimation()\n this.paused = false;\n }\n } else {\n r = parseInt('' + (r + smartInc));\n if(r >= glowEnd) {\n this.paused = true;\n this.pausedTime = Date.now()\n }\n }\n return 'rgb('+ r + ',' + r + ',' + r + ')';\n };\n }\n\n private animateSlide(): CanvasGradient {\n var gradient = this.ctx.createLinearGradient(0, 0, this.canvas.width, 0),\n smartInc = this.inc * (this.diffTime / (1000 / 60)),\n lightLeft,\n lightRight,\n lightCenter;\n if(this.paused) {\n if((Date.now() - this.pausedTime) > this.pauseInterval) {\n this.lightSource = -0.6;\n this.cycleAnimation()\n this.paused = false;\n return this.animateSlide();\n }\n } else {\n this.lightSource += smartInc;\n if(this.lightSource > (1 + this.lightSpread)) {\n this.paused = true;\n this.pausedTime = Date.now();\n }\n }\n // lighting positions:\n lightCenter = clamp(this.lightSource, 0, 1);\n lightLeft = clamp(this.lightSource - this.lightSpread, 0, 1);\n lightRight = clamp(this.lightSource + this.lightSpread, 0, 1);\n\n const backgroundColor = customProperties.getProperty('background-color-true');\n const shimmerColor = customProperties.getProperty('surface-color');\n gradient.addColorStop(lightLeft, backgroundColor);\n gradient.addColorStop(lightCenter, shimmerColor);\n gradient.addColorStop(lightRight, backgroundColor);\n\n return gradient;\n }\n\n public settings(dict: Partial<{\n canvas: Shimmer['canvas'],\n fillStyle: Shimmer['fillStyle'],\n font: Shimmer['font'],\n lightSpread: Shimmer['lightSpread'],\n inc: Shimmer['inc'],\n animations: Shimmer['animations'],\n text: Shimmer['text']\n }> = {}) {\n this.canvas = dict.canvas ?? document.createElement('canvas');\n this.ctx = this.canvas.getContext('2d');\n this.font = dict.font ?? this.font;\n this.lightSpread = dict.lightSpread ?? this.lightSpread;\n this.inc = dict.inc ?? this.inc;\n this.animations = dict.animations ?? this.animations;\n this.text = dict.text ?? this.text;\n this.fillStyle = dict.fillStyle;\n\n this.canvas.classList.add('shimmer-canvas');\n }\n\n public on() {\n const {width, height} = this.canvas;\n // record the time we ran:\n this.keepTime();\n // clear and fill the canvas:\n this.ctx.clearRect(0, 0, width, height);\n\n if(this.font) {\n this.ctx.font = this.font;\n }\n\n this.ctx.fillStyle = this.animate() as any;\n this.ctx.fillRect(0, 0, width, height);\n\n if(this.fillStyle) {\n this.ctx.fillStyle = this.fillStyle;\n this.ctx.fillRect(0, 0, width, height);\n }\n\n if(this.text) {\n this.ctx.fillText(this.text, 50, 50);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Scrollable from '../components/scrollable';\nimport rootScope from '../lib/rootScope';\nimport {animate} from './animation';\nimport {drawCircleFromStart} from './canvas/drawCircle';\nimport roundRect from './canvas/roundRect';\nimport Shimmer from './canvas/shimmer';\nimport customProperties from './dom/customProperties';\nimport easeInOutSine from './easing/easeInOutSine';\nimport mediaSizes from './mediaSizes';\n\nexport default class DialogsPlaceholder {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n private shimmer: Shimmer;\n private tempId: number;\n private detachTime: number;\n\n private length: number;\n private dialogHeight: number;\n private availableLength: number;\n\n private avatarSize: number;\n private marginVertical: number;\n private totalHeight: number;\n private lineHeight: number;\n private lineBorderRadius: number;\n private lineMarginVertical: number;\n private statusWidth: number;\n private generatedValues: {\n firstLineWidth: number,\n secondLineWidth: number,\n statusWidth: number\n }[];\n\n private getRectFrom: () => DOMRectEditable;\n private onRemove: () => void;\n private blockScrollable: Scrollable;\n\n constructor(sizes: Partial<{\n avatarSize: number,\n marginVertical: number,\n totalHeight: number\n }> = {}) {\n this.shimmer = new Shimmer();\n this.tempId = 0;\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('dialogs-placeholder-canvas');\n this.ctx = this.canvas.getContext('2d');\n\n this.generatedValues = [];\n this.avatarSize = sizes.avatarSize ?? 54;\n this.marginVertical = sizes.marginVertical ?? 9;\n this.totalHeight = sizes.totalHeight ?? (this.avatarSize + this.marginVertical * 2);\n this.lineHeight = 10;\n this.lineBorderRadius = 6;\n this.lineMarginVertical = 8;\n this.statusWidth = 24;\n }\n\n public attach({container, rect, getRectFrom, onRemove, blockScrollable}: {\n container: HTMLElement,\n rect?: ReturnType,\n getRectFrom?: HTMLElement | DialogsPlaceholder['getRectFrom'],\n onRemove?: DialogsPlaceholder['onRemove'],\n blockScrollable?: DialogsPlaceholder['blockScrollable']\n }) {\n const {canvas} = this;\n\n this.onRemove = onRemove;\n this.getRectFrom = typeof(getRectFrom) === 'function' ? getRectFrom : (getRectFrom || container).getBoundingClientRect.bind(getRectFrom || container);\n if(this.blockScrollable = blockScrollable) {\n blockScrollable.container.style.overflowY = 'hidden';\n }\n\n this.updateCanvasSize(rect);\n this.startAnimation();\n container.append(canvas);\n }\n\n public detach(availableLength: number) {\n if(this.detachTime) {\n return;\n }\n\n this.availableLength = availableLength;\n this.detachTime = Date.now();\n\n if(!rootScope.settings.animationsEnabled) {\n this.remove();\n }\n }\n\n public remove() {\n this.stopAnimation();\n\n if(this.canvas.parentElement) {\n this.canvas.remove();\n\n if(this.blockScrollable) {\n this.blockScrollable.container.style.overflowY = '';\n this.blockScrollable = undefined;\n }\n }\n\n this.onRemove?.();\n this.onRemove = undefined;\n }\n\n private updateCanvasSize(rect = this.getRectFrom()) {\n const {canvas} = this;\n const dpr = canvas.dpr = window.devicePixelRatio;\n canvas.width = rect.width * dpr;\n canvas.height = rect.height * dpr;\n canvas.style.width = rect.width + 'px';\n canvas.style.height = rect.height + 'px';\n }\n\n private renderDetachAnimationFrame() {\n const {\n canvas,\n ctx,\n detachTime,\n length,\n availableLength\n } = this;\n\n if(!detachTime) {\n return;\n } else if(!rootScope.settings.animationsEnabled) {\n this.remove();\n return;\n }\n\n const {width} = canvas;\n\n ctx.globalCompositeOperation = 'destination-out';\n\n // ctx.fillStyle = 'rgba(0, 0, 0, 0)';\n // ctx.fillRect(0, 0, width, height);\n\n // const DURATION = 500;\n // const DELAY = DURATION;\n const DURATION = 150;\n const DELAY = 15;\n const elapsedTime = Date.now() - detachTime;\n let completed = true;\n for(let i = 0; i < length; ++i) {\n const delay = availableLength < length && i >= availableLength ? DELAY * (availableLength - 1) : DELAY * i;\n const elapsedRowTime = elapsedTime - delay;\n if(elapsedRowTime <= 0) {\n completed = false;\n continue;\n }\n\n const progress = easeInOutSine(elapsedRowTime, 0, 1, DURATION);\n\n ctx.beginPath();\n ctx.rect(0, this.dialogHeight * i, width, this.dialogHeight);\n ctx.fillStyle = `rgba(0, 0, 0, ${progress})`;\n ctx.fill();\n\n if(progress < 1) {\n completed = false;\n }\n }\n\n // const totalRadius = Math.sqrt(width ** 2 + height ** 2);\n // const gradient = ctx.createRadialGradient(\n // 0, 0, 0,\n // 0, 0, totalRadius);\n // gradient.addColorStop(0, 'rgba(0, 0, 0, 1)');\n // gradient.addColorStop(progress, 'rgba(0, 0, 0, 0)');\n // gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');\n\n // const gradient = ctx.createLinearGradient(0, 0, 0, height);\n // gradient.addColorStop(0, 'rgba(0, 0, 0, 1)');\n // gradient.addColorStop(progress, 'rgba(0, 0, 0, 0)');\n // gradient.addColorStop(1, 'rgba(0, 0, 0, 0)');\n\n // ctx.fillStyle = gradient;\n // ctx.fillRect(0, 0, width, height);\n\n ctx.globalCompositeOperation = 'source-over';\n\n if(completed) {\n this.remove();\n }\n }\n\n private renderFrame() {\n this.shimmer.on();\n this.renderDetachAnimationFrame();\n }\n\n private startAnimation() {\n const {canvas, shimmer} = this;\n const tempId = ++this.tempId;\n const pattern = this.createPattern();\n\n shimmer.settings({\n canvas,\n fillStyle: pattern\n });\n\n const middleware = () => {\n return this.tempId === tempId;\n };\n\n this.renderFrame();\n animate(() => {\n if(!middleware()) {\n return false;\n }\n\n // ! should've removed the loop if animations are disabled\n if(rootScope.settings.animationsEnabled) {\n this.renderFrame();\n }\n\n // ! tempId can be changed during renderFrame\n return middleware();\n });\n\n rootScope.addEventListener('theme_change', this.onThemeChange);\n mediaSizes.addEventListener('resize', this.onResize);\n }\n\n private stopAnimation() {\n ++this.tempId;\n rootScope.removeEventListener('theme_change', this.onThemeChange);\n mediaSizes.removeEventListener('resize', this.onResize);\n }\n\n private onThemeChange = () => {\n this.stopAnimation();\n this.startAnimation();\n };\n\n private onResize = () => {\n const {canvas} = this;\n const {width, height, dpr} = canvas;\n this.updateCanvasSize();\n if(canvas.width === width && canvas.height === height && canvas.dpr === dpr) {\n return;\n }\n\n this.stopAnimation();\n this.startAnimation();\n };\n\n private createPattern() {\n const {canvas, ctx} = this;\n\n const patternCanvas = document.createElement('canvas');\n const patternContext = patternCanvas.getContext('2d');\n const dpr = canvas.dpr;\n patternCanvas.dpr = dpr;\n patternCanvas.width = canvas.width;\n patternCanvas.height = canvas.height;\n\n patternContext.fillStyle = customProperties.getProperty('surface-color');\n patternContext.fillRect(0, 0, patternCanvas.width, patternCanvas.height);\n\n patternContext.fillStyle = '#000';\n patternContext.globalCompositeOperation = 'destination-out';\n\n const dialogHeight = this.dialogHeight = this.totalHeight * dpr;\n const length = this.length = Math.ceil(canvas.height / dialogHeight);\n for(let i = 0; i < length; ++i) {\n this.drawChat(patternContext, i, i * dialogHeight);\n }\n\n return ctx.createPattern(patternCanvas, 'no-repeat');\n }\n\n private drawChat(ctx: CanvasRenderingContext2D, i: number, y: number) {\n let generatedValues = this.generatedValues[i];\n if(!generatedValues) {\n generatedValues = this.generatedValues[i] = {\n firstLineWidth: 40 + Math.random() * 100, // 120\n secondLineWidth: 120 + Math.random() * 130, // 240\n statusWidth: 24 + Math.random() * 16\n };\n }\n\n const {\n firstLineWidth,\n secondLineWidth,\n statusWidth\n } = generatedValues;\n\n const {canvas} = ctx;\n const {dpr} = canvas;\n y /= dpr;\n\n const {\n avatarSize,\n marginVertical,\n lineHeight,\n lineBorderRadius,\n lineMarginVertical\n } = this;\n\n let marginLeft = 17;\n\n if(avatarSize) {\n drawCircleFromStart(ctx, marginLeft, y + marginVertical, avatarSize / 2, true);\n marginLeft += avatarSize + 10;\n }\n\n // 9 + 54 - 10 - 8 = 45 ........ 72 - 9 - 10 - 8\n roundRect(ctx, marginLeft, y + marginVertical + lineMarginVertical, firstLineWidth, lineHeight, lineBorderRadius, true);\n // roundRect(ctx, marginLeft, y + marginVertical + avatarSize - lineHeight - lineMarginVertical, secondLineWidth, lineHeight, lineBorderRadius, true);\n roundRect(ctx, marginLeft, y + this.totalHeight - marginVertical - lineHeight - lineMarginVertical, secondLineWidth, lineHeight, lineBorderRadius, true);\n\n roundRect(ctx, canvas.width / dpr - 24 - statusWidth, y + marginVertical + lineMarginVertical, statusWidth, lineHeight, lineBorderRadius, true);\n }\n}\n","export default function drawCircle(ctx: CanvasRenderingContext2D, x: number, y: number, radius: number, fill?: boolean, stroke?: boolean) {\n const dpr = ctx.canvas.dpr;\n if(dpr) {\n x *= dpr;\n y *= dpr;\n radius *= dpr;\n }\n\n ctx.beginPath();\n ctx.arc(x, y, radius, 0, 2 * Math.PI, false);\n ctx.closePath();\n\n if(fill) {\n ctx.fill();\n }\n\n if(stroke) {\n ctx.stroke();\n }\n}\n\nexport function drawCircleFromStart(ctx: CanvasRenderingContext2D, x: number, y: number, radius: number, fill?: boolean, stroke?: boolean) {\n return drawCircle(ctx, x + radius, y + radius, radius, fill, stroke);\n}\n","import rootScope from '../../lib/rootScope';\n\nexport default function shake(element: HTMLElement) {\n if(!rootScope.settings.animationsEnabled) {\n return;\n }\n\n const keyframes: Keyframe[] = [\n {transform: 'translateX(0)'},\n {transform: 'translateX(.25rem)'},\n {transform: 'translateX(-.25rem)'},\n {transform: 'translateX(0)'}\n ];\n\n element.animate([...keyframes, ...keyframes, ...keyframes], {\n duration: 300,\n iterations: 1,\n easing: 'ease-in-out'\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDialogFilter as DialogFilter, MyDialogFilter} from '../storages/filters';\nimport type LazyLoadQueue from '../../components/lazyLoadQueue';\nimport type {Dialog, ForumTopic, MyMessage} from './appMessagesManager';\nimport type {MyPhoto} from './appPhotosManager';\nimport type {MyDocument} from './appDocsManager';\nimport type {State} from '../../config/state';\nimport AvatarElement from '../../components/avatar';\nimport DialogsContextMenu from '../../components/dialogsContextMenu';\nimport {horizontalMenu} from '../../components/horizontalMenu';\nimport ripple from '../../components/ripple';\nimport Scrollable, {ScrollableX, SliceSides} from '../../components/scrollable';\nimport {formatDateAccordingToTodayNew} from '../../helpers/date';\nimport {IS_MOBILE_SAFARI, IS_SAFARI} from '../../environment/userAgent';\nimport {logger, LogTypes} from '../logger';\nimport rootScope from '../rootScope';\nimport appImManager, {AppImManager, APP_TABS} from './appImManager';\nimport Button from '../../components/button';\nimport SetTransition from '../../components/singleTransition';\nimport {MyDraftMessage} from './appDraftsManager';\nimport DEBUG, {MOUNT_CLASS_TO} from '../../config/debug';\nimport PeerTitle from '../../components/peerTitle';\nimport I18n, {FormatterArguments, i18n, LangPackKey, _i18n} from '../langPack';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport wrapPhoto from '../../components/wrappers/photo';\nimport AppEditFolderTab from '../../components/sidebarLeft/tabs/editFolder';\nimport appSidebarLeft from '../../components/sidebarLeft';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport ConnectionStatusComponent from '../../components/connectionStatus';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport {fastRafConventional, fastRafPromise} from '../../helpers/schedulers';\nimport SortedUserList from '../../components/sortedUserList';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport handleTabSwipe from '../../helpers/dom/handleTabSwipe';\nimport windowSize from '../../helpers/windowSize';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport {setSendingStatus} from '../../components/sendingStatus';\nimport SortedList, {SortedElementBase} from '../../helpers/sortedList';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, NULL_PEER_ID, REAL_FOLDERS, REAL_FOLDER_ID} from '../mtproto/mtproto_config';\nimport groupCallActiveIcon from '../../components/groupCallActiveIcon';\nimport {Chat, Message, NotifyPeer} from '../../layer';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport appNavigationController, {NavigationItem} from '../../components/appNavigationController';\nimport appMediaPlaybackController from '../../components/appMediaPlaybackController';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {AppManagers} from './managers';\nimport appSidebarRight from '../../components/sidebarRight';\nimport PopupElement from '../../components/popups';\nimport choosePhotoSize from './utils/photos/choosePhotoSize';\nimport wrapEmojiText from '../richTextProcessor/wrapEmojiText';\nimport wrapMessageForReply from '../../components/wrappers/messageForReply';\nimport isMessageRestricted from './utils/messages/isMessageRestricted';\nimport getMediaFromMessage from './utils/messages/getMediaFromMessage';\nimport getMessageSenderPeerIdOrName from './utils/messages/getMessageSenderPeerIdOrName';\nimport wrapStickerEmoji from '../../components/wrappers/stickerEmoji';\nimport getDialogIndexKey from './utils/dialogs/getDialogIndexKey';\nimport getProxiedManagers from './getProxiedManagers';\nimport getDialogIndex from './utils/dialogs/getDialogIndex';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport wrapPeerTitle from '../../components/wrappers/peerTitle';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport appDownloadManager from './appDownloadManager';\nimport groupCallsController from '../calls/groupCallsController';\nimport callsController from '../calls/callsController';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport noop from '../../helpers/noop';\nimport DialogsPlaceholder from '../../helpers/dialogsPlaceholder';\nimport pause from '../../helpers/schedulers/pause';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {getMiddleware, MiddlewareHelper} from '../../helpers/middleware';\nimport makeError from '../../helpers/makeError';\nimport getUnsafeRandomInt from '../../helpers/number/getUnsafeRandomInt';\nimport Row, {RowMediaSizeType} from '../../components/row'\nimport SettingSection from '../../components/settingSection';\nimport {SliderSuperTabEventable} from '../../components/sliderTab';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport ButtonMenuToggle from '../../components/buttonMenuToggle';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport AppSharedMediaTab from '../../components/sidebarRight/tabs/sharedMedia';\nimport {dispatchHeavyAnimationEvent} from '../../hooks/useHeavyAnimationCheck';\nimport AppArchivedTab from '../../components/sidebarLeft/tabs/archivedTab';\nimport shake from '../../helpers/dom/shake';\nimport AppEditTopicTab from '../../components/sidebarRight/tabs/editTopic';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport const DIALOG_LIST_ELEMENT_TAG = 'A';\n\nexport type DialogDom = {\n avatarEl: AvatarElement,\n captionDiv: HTMLElement,\n titleSpan: HTMLSpanElement,\n titleSpanContainer: HTMLSpanElement,\n statusSpan: HTMLSpanElement,\n lastTimeSpan: HTMLSpanElement,\n unreadBadge?: HTMLElement,\n unreadAvatarBadge?: HTMLElement,\n callIcon?: ReturnType,\n mentionsBadge?: HTMLElement,\n lastMessageSpan: HTMLSpanElement,\n containerEl: HTMLElement,\n listEl: HTMLElement,\n subtitleEl: HTMLElement,\n\n setLastMessagePromise?: CancellablePromise,\n setUnreadMessagePromise?: CancellablePromise\n};\n\ninterface SortedDialog extends SortedElementBase {\n dom: DialogDom,\n dialogElement: DialogElement\n}\n\nfunction setPromiseMiddleware}, K extends keyof T>(obj: T, key: K) {\n const oldPromise: CancellablePromise = obj[key] as any;\n oldPromise?.reject();\n\n // @ts-ignore\n const deferred = obj[key] = deferredPromise();\n deferred.catch(() => {}).finally(() => {\n if((obj[key] as any) === deferred) {\n delete obj[key];\n }\n });\n\n const middleware = middlewarePromise(() => (obj[key] as any) === deferred);\n return {deferred, middleware};\n}\n\nconst BADGE_SIZE = 22;\nconst BADGE_TRANSITION_TIME = 250;\n\nclass SortedDialogList extends SortedList {\n public managers: AppManagers;\n public log: ReturnType;\n public list: HTMLElement;\n public indexKey: ReturnType;\n public onListLengthChange: () => void;\n public forumPeerId: PeerId;\n\n constructor(options: {\n managers: SortedDialogList['managers'],\n log?: SortedDialogList['log'],\n list: SortedDialogList['list'],\n indexKey: SortedDialogList['indexKey'],\n onListLengthChange?: SortedDialogList['onListLengthChange'],\n forumPeerId?: SortedDialogList['forumPeerId']\n }) {\n super({\n getIndex: (element) => this.managers.dialogsStorage.getDialogIndex(this.forumPeerId ?? element.id, this.indexKey, this.forumPeerId ? element.id : undefined),\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onListLengthChange?.();\n },\n onSort: (element, idx) => {\n const willChangeLength = element.dom.listEl.parentElement !== this.list;\n positionElementByIndex(element.dom.listEl, this.list, idx);\n\n if(willChangeLength) {\n this.onListLengthChange?.();\n }\n },\n onElementCreate: async(base) => {\n const loadPromises: Promise[] = [];\n\n const dialogElement = appDialogsManager.addListDialog({\n peerId: this.forumPeerId ?? base.id,\n loadPromises,\n isBatch: true,\n threadId: this.forumPeerId ? base.id : undefined,\n isMainList: this.indexKey === 'index_0'\n });\n (base as SortedDialog).dom = dialogElement.dom;\n (base as SortedDialog).dialogElement = dialogElement;\n\n await Promise.all(loadPromises);\n return base as SortedDialog;\n },\n updateElementWith: fastRafConventional,\n log: options.log\n });\n\n safeAssign(this, options);\n }\n\n public clear() {\n this.list.replaceChildren();\n super.clear();\n }\n}\n\nexport type DialogElementSize = RowMediaSizeType;\ntype DialogElementOptions = {\n peerId: PeerId,\n rippleEnabled?: boolean,\n onlyFirstName?: boolean,\n meAsSaved?: boolean,\n avatarSize?: RowMediaSizeType,\n autonomous?: boolean,\n loadPromises?: Promise[],\n fromName?: string,\n noIcons?: boolean,\n threadId?: number,\n wrapOptions?: WrapSomethingOptions,\n isMainList?: boolean\n};\nclass DialogElement extends Row {\n public dom: DialogDom;\n\n constructor({\n peerId,\n rippleEnabled = true,\n onlyFirstName = false,\n meAsSaved = true,\n avatarSize = 'bigger',\n autonomous,\n loadPromises,\n fromName,\n noIcons,\n threadId,\n wrapOptions = {},\n isMainList\n }: DialogElementOptions) {\n super({\n clickable: true,\n noRipple: !rippleEnabled,\n havePadding: !threadId,\n title: true,\n titleRightSecondary: true,\n subtitle: true,\n subtitleRight: true,\n noWrap: true,\n asLink: true\n });\n\n this.subtitleRight.remove();\n\n const avatarEl = threadId ? undefined : new AvatarElement();\n if(avatarEl) {\n const avatarSizeMap: {[k in DialogElementSize]?: number} = {\n bigger: 54,\n abitbigger: 42,\n small: 32\n };\n const s = avatarSizeMap[avatarSize];\n avatarEl.classList.add('dialog-avatar', 'avatar-' + s);\n avatarEl.updateWithOptions({\n loadPromises,\n lazyLoadQueue: wrapOptions.lazyLoadQueue,\n isDialog: !!meAsSaved,\n peerId,\n peerTitle: fromName\n });\n\n this.applyMediaElement(avatarEl, avatarSize);\n }\n\n const captionDiv = this.container;\n\n const titleSpanContainer = this.title;\n titleSpanContainer.classList.add('user-title');\n\n this.titleRow.classList.add('dialog-title');\n\n const peerTitle = new PeerTitle();\n const peerTitlePromise = peerTitle.update({\n peerId,\n fromName,\n dialog: meAsSaved,\n onlyFirstName,\n withIcons: !noIcons,\n threadId: threadId\n });\n\n loadPromises?.push(peerTitlePromise);\n titleSpanContainer.append(peerTitle.element);\n\n // for muted icon\n titleSpanContainer.classList.add('tgico'); // * эта строка будет актуальна только для !container, но ладно\n\n // const titleIconsPromise = generateTitleIcons(peerId).then((elements) => {\n // titleSpanContainer.append(...elements);\n // });\n\n // if(loadPromises) {\n // loadPromises.push(titleIconsPromise);\n // }\n // }\n\n const span = this.subtitle;\n // span.classList.add('user-last-message');\n\n const li = this.container;\n li.classList.add('chatlist-chat', 'chatlist-chat-' + avatarSize);\n if(!autonomous) {\n (li as HTMLAnchorElement).href = '#' + peerId;\n }\n // if(rippleEnabled) {\n // ripple(li);\n // }\n\n if(avatarSize === 'bigger') {\n this.container.classList.add('row-big');\n } else if(avatarSize === 'small') {\n this.container.classList.add('row-small');\n }\n\n li.dataset.peerId = '' + peerId;\n if(threadId) {\n li.dataset.threadId = '' + threadId;\n }\n\n const statusSpan = document.createElement('span');\n statusSpan.classList.add('message-status', 'sending-status'/* , 'transition', 'reveal' */);\n\n const lastTimeSpan = document.createElement('span');\n lastTimeSpan.classList.add('message-time');\n\n const rightSpan = this.titleRight;\n rightSpan.classList.add('dialog-title-details');\n rightSpan.append(statusSpan, lastTimeSpan);\n\n this.subtitleRow.classList.add('dialog-subtitle');\n\n const dom: DialogDom = this.dom = {\n avatarEl,\n captionDiv,\n titleSpan: peerTitle.element,\n titleSpanContainer,\n statusSpan,\n lastTimeSpan,\n lastMessageSpan: span,\n containerEl: li,\n listEl: li,\n subtitleEl: this.subtitleRow\n };\n\n if(!autonomous) {\n (li as any).dialogDom = dom;\n\n const chat = appImManager.chat;\n if(chat && appImManager.isSamePeer(chat, {peerId, threadId: threadId, type: 'chat'})) {\n appDialogsManager.setDialogActive(li, true);\n }\n\n if(isMainList && appDialogsManager.forumTab?.peerId === peerId && !threadId) {\n li.classList.add('is-forum-open');\n }\n }\n }\n\n public createUnreadBadge() {\n if(this.dom.unreadBadge) return;\n const badge = this.dom.unreadBadge = document.createElement('div');\n badge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE}`;\n this.dom.subtitleEl.append(badge);\n }\n\n public createUnreadAvatarBadge() {\n if(this.dom.unreadAvatarBadge) return;\n const badge = this.dom.unreadAvatarBadge = document.createElement('div');\n badge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE} avatar-badge`;\n this.dom.listEl.append(badge);\n }\n\n public createMentionsBadge() {\n if(this.dom.mentionsBadge) return;\n const badge = this.dom.mentionsBadge = document.createElement('div');\n badge.className = `dialog-subtitle-badge badge badge-${BADGE_SIZE} mention mention-badge`;\n badge.innerText = '@';\n this.dom.lastMessageSpan.after(badge);\n }\n\n public toggleBadgeByKey(\n key: Extract,\n hasBadge: boolean,\n justCreated: boolean,\n batch?: boolean\n ) {\n SetTransition({\n element: this.dom[key],\n className: 'is-visible',\n forwards: hasBadge,\n duration: batch ? 0 : BADGE_TRANSITION_TIME,\n onTransitionEnd: hasBadge ? undefined : () => {\n this.dom[key].remove();\n delete this.dom[key];\n },\n useRafs: !justCreated || !isInDOM(this.dom[key]) ? 2 : 0\n });\n }\n}\n\nclass ForumTab extends SliderSuperTabEventable {\n private rows: HTMLElement;\n private subtitle: HTMLElement;\n\n public peerId: PeerId;\n private firstTime: boolean;\n\n private log: ReturnType;\n\n private xd: Some3;\n\n public async toggle(value: boolean) {\n if(this.init2) {\n await this.init2();\n }\n\n SetTransition({\n element: this.container,\n className: 'is-visible',\n forwards: value,\n duration: 300,\n onTransitionEnd: !value ? () => {\n this.onCloseAfterTimeout();\n } : undefined,\n useRafs: this.firstTime ? (this.firstTime = undefined, 2) : undefined\n });\n }\n\n public init(options: {\n peerId: PeerId,\n managers: AppManagers\n }) {\n safeAssign(this, options);\n\n this.log = logger('FORUM');\n this.firstTime = true;\n this.container.classList.add('topics-container');\n\n const isFloating = !this.slider;\n if(isFloating) {\n this.closeBtn.classList.replace('tgico-left', 'tgico-close');\n this.container.classList.add('active', 'is-floating');\n\n attachClickEvent(this.closeBtn, () => {\n appDialogsManager.toggleForumTab(undefined, this);\n }, {listenerSetter: this.listenerSetter});\n }\n\n this.rows = document.createElement('div');\n this.rows.classList.add('sidebar-header__rows');\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('sidebar-header__subtitle');\n\n this.title.replaceWith(this.rows);\n this.rows.append(this.title, this.subtitle);\n\n const list = appDialogsManager.createChatList();\n appDialogsManager.setListClickListener(list, null, true);\n this.scrollable.append(list);\n\n this.xd = new Some3(this.peerId, isFloating ? 80 : 0);\n this.xd.scrollable = this.scrollable;\n this.xd.sortedList = new SortedDialogList({\n managers: this.managers,\n log: this.log,\n list,\n indexKey: 'index_0',\n forumPeerId: this.peerId\n });\n this.xd.bindScrollable();\n\n const getOptionsForMessages = (): Parameters[0] => {\n return {\n peerId: this.peerId,\n type: 'chat'\n };\n };\n\n const btnMenu = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: [{\n icon: 'info',\n text: 'ForumTopic.Context.Info',\n onClick: async() => {\n const tab = appSidebarLeft.createTab(AppSharedMediaTab, true);\n tab.isFirst = true;\n tab.setPeer(this.peerId);\n (await tab.fillProfileElements())();\n tab.loadSidebarMedia(true);\n tab.open();\n }\n }, {\n icon: 'message',\n text: 'ForumTopic.Context.ShowAsMessages',\n onClick: () => {\n const chat = appImManager.chat;\n appImManager[chat?.peerId === this.peerId ? 'setPeer' : 'setInnerPeer'](getOptionsForMessages());\n },\n verify: () => {\n const chat = appImManager.chat;\n return !chat || !appImManager.isSamePeer(chat, getOptionsForMessages());\n }\n }, {\n icon: 'adduser',\n text: 'ForumTopic.Context.AddMember',\n onClick: () => {},\n verify: () => false && this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'invite_users')\n }, {\n icon: 'add',\n text: 'ForumTopic.Context.New',\n onClick: () => {\n appSidebarLeft.createTab(AppEditTopicTab).open(this.peerId);\n },\n separator: true,\n verify: () => this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'manage_topics')\n }]\n });\n\n this.listenerSetter.add(rootScope)('history_reload', (peerId) => {\n if(this.peerId !== peerId) {\n return;\n }\n\n this.xd.fullReset();\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.peerId !== chatId.toPeerId(true)) {\n return;\n }\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n if(!(chat as Chat.channel).pFlags.forum) {\n appDialogsManager.toggleForumTab(undefined, this);\n }\n });\n\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.container,\n onSwipe: () => {\n appDialogsManager.toggleForumTab(undefined, this);\n },\n middleware: this.middlewareHelper.get()\n });\n }\n\n this.header.append(btnMenu);\n\n if(!isFloating) {\n return this.init2();\n }\n }\n\n public async init2() {\n this.init2 = undefined;\n\n const middleware = this.middlewareHelper.get();\n const peerId = this.peerId;\n\n this.managers.apiUpdatesManager.subscribeToChannelUpdates(this.peerId.toChatId());\n middleware.onDestroy(() => {\n this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(this.peerId.toChatId());\n });\n\n const peerTitlePromise = wrapPeerTitle({\n peerId,\n dialog: true,\n wrapOptions: {middleware}\n });\n\n const setStatusPromise = appImManager.setPeerStatus({\n peerId,\n element: this.subtitle,\n needClear: true,\n useWhitespace: false,\n middleware,\n noTyping: true\n });\n\n // this.managers.dialogsStorage.getForumTopics(this.peerId).then((messagesForumTopics) => {\n // console.log(messagesForumTopics);\n\n // const promises = messagesForumTopics.topics.map((forumTopic) => {\n // return this.sortedDialogList.add(forumTopic.id);\n // });\n\n // return Promise.all(promises);\n // }).then(() => {\n // this.dialogsPlaceholder.detach(this.sortedDialogList.getAll().size);\n // });\n\n return Promise.all([\n peerTitlePromise,\n setStatusPromise,\n this.xd.onChatsScroll().then((loadResult) => {\n return loadResult.cached ? loadResult.renderPromise : undefined\n })\n ]).then(([\n peerTitle,\n setStatus,\n _\n ]) => {\n if(!middleware()) {\n return;\n }\n\n this.title.append(peerTitle);\n setStatus?.();\n });\n }\n\n public onCloseAfterTimeout() {\n super.onCloseAfterTimeout();\n this.xd.destroy();\n }\n}\n\nconst NOT_IMPLEMENTED_ERROR = new Error('not implemented');\n\ntype DialogKey = Parameters[0];\nclass Some {\n public sortedList: SortedDialogList;\n public scrollable: Scrollable;\n public loadedDialogsAtLeastOnce: boolean;\n public needPlaceholderAtFirstTime: boolean;\n protected offsets: {top: number, bottom: number};\n protected indexKey: ReturnType;\n protected sliceTimeout: number;\n protected managers: AppManagers;\n protected listenerSetter: ListenerSetter;\n protected loadDialogsPromise: Promise<{cached: boolean, renderPromise: Some2['loadDialogsRenderPromise']}>;\n protected loadDialogsRenderPromise: Promise;\n protected placeholder: DialogsPlaceholder;\n protected log: ReturnType;\n protected placeholderOptions: ConstructorParameters[0];\n\n constructor() {\n this.log = logger('CL');\n this.offsets = {top: 0, bottom: 0};\n this.managers = rootScope.managers;\n this.listenerSetter = new ListenerSetter();\n }\n\n public getOffsetIndex(side: 'top' | 'bottom') {\n return {index: this.scrollable.loadedAll[side] ? 0 : this.offsets[side]};\n }\n\n protected isDialogMustBeInViewport(dialog: T) {\n // return true;\n const topOffset = this.getOffsetIndex('top');\n const bottomOffset = this.getOffsetIndex('bottom');\n\n if(!topOffset.index && !bottomOffset.index) {\n return true;\n }\n\n const index = getDialogIndex(dialog, this.indexKey);\n return (!topOffset.index || index <= topOffset.index) &&\n (!bottomOffset.index || index >= bottomOffset.index);\n }\n\n public setIndexKey(indexKey: Some['indexKey']) {\n this.indexKey = indexKey;\n this.sortedList.indexKey = indexKey;\n }\n\n protected deleteDialogByKey(key: DialogKey) {\n this.sortedList.delete(key);\n }\n\n public deleteDialog(dialog: T) {\n return this.deleteDialogByKey(this.getDialogKey(dialog));\n }\n\n public updateDialog(dialog: T) {\n const key = this.getDialogKey(dialog);\n if(this.isDialogMustBeInViewport(dialog)) {\n if(!this.sortedList.has(key) && this.loadedDialogsAtLeastOnce) {\n this.sortedList.add(key);\n return;\n }\n } else {\n this.deleteDialog(dialog);\n return;\n }\n\n const dialogElement = this.getDialogElement(key);\n if(dialogElement) {\n appDialogsManager.setLastMessageN({\n dialog,\n dialogElement,\n setUnread: true\n });\n this.sortedList.update(key);\n }\n }\n\n public onChatsRegularScroll = () => {\n // return;\n\n if(this.sliceTimeout) clearTimeout(this.sliceTimeout);\n this.sliceTimeout = window.setTimeout(() => {\n this.sliceTimeout = undefined;\n\n if(!this.sortedList.list.childElementCount || appDialogsManager.processContact) {\n return;\n }\n\n /* const observer = new IntersectionObserver((entries) => {\n const\n });\n\n Array.from(this.chatList.children).forEach((el) => {\n observer.observe(el);\n }); */\n\n fastRafConventional(() => {\n const perf = performance.now();\n\n const scrollTopWas = this.scrollable.scrollTop;\n\n const firstElementChild = this.sortedList.list.firstElementChild;\n const rectContainer = this.scrollable.container.getBoundingClientRect();\n const rectTarget = firstElementChild.getBoundingClientRect();\n const children = Array.from(this.scrollable.splitUp.children) as HTMLElement[];\n\n // const padding = 8;\n // const offsetTop = this.folders.container.offsetTop;\n let offsetTop = this.scrollable.splitUp.offsetTop;\n if(offsetTop && scrollTopWas < offsetTop) offsetTop -= scrollTopWas;\n // const offsetTop = scrollTopWas < padding ? padding - scrollTopWas : 0;\n const firstY = rectContainer.y + offsetTop;\n const lastY = rectContainer.y/* - 8 */; // 8px - .chatlist padding-bottom\n\n const firstElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.ceil(firstY + 1)), firstElementChild.tagName) as HTMLElement;\n const lastElement = findUpTag(document.elementFromPoint(Math.ceil(rectTarget.x), Math.floor(lastY + rectContainer.height - 1)), firstElementChild.tagName) as HTMLElement;\n\n // alert('got element:' + rect.y);\n\n if(!firstElement || !lastElement) {\n return;\n }\n\n // alert('got element:' + !!firstElement);\n\n const firstElementRect = firstElement.getBoundingClientRect();\n const elementOverflow = firstElementRect.y - firstY;\n\n const sliced: HTMLElement[] = [];\n const firstIndex = children.indexOf(firstElement);\n const lastIndex = children.indexOf(lastElement);\n\n const saveLength = 10;\n\n const sliceFromStart = IS_SAFARI ? [] : children.slice(0, Math.max(0, firstIndex - saveLength));\n const sliceFromEnd = children.slice(lastIndex + saveLength);\n\n /* if(sliceFromStart.length !== sliceFromEnd.length) {\n console.log('not equal', sliceFromStart.length, sliceFromEnd.length);\n }\n\n if(sliceFromStart.length > sliceFromEnd.length) {\n const diff = sliceFromStart.length - sliceFromEnd.length;\n sliceFromStart.splice(0, diff);\n } else if(sliceFromEnd.length > sliceFromStart.length) {\n const diff = sliceFromEnd.length - sliceFromStart.length;\n sliceFromEnd.splice(sliceFromEnd.length - diff, diff);\n } */\n\n if(sliceFromStart.length) {\n this.scrollable.loadedAll.top = false;\n }\n\n if(sliceFromEnd.length) {\n this.scrollable.loadedAll.bottom = false;\n }\n\n sliced.push(...sliceFromStart);\n sliced.push(...sliceFromEnd);\n\n sliced.forEach((el) => {\n this.deleteDialogByKey(this.getDialogKeyFromElement(el));\n });\n\n this.setOffsets();\n\n // this.log('[slicer] elements', firstElement, lastElement, rect, sliced, sliceFromStart.length, sliceFromEnd.length);\n\n // this.log('[slicer] reset scrollTop', this.scroll.scrollTop, firstElement.offsetTop, firstElementRect.y, rect.y, elementOverflow);\n\n // alert('left length:' + children.length);\n\n this.scrollable.scrollTop = firstElement.offsetTop - elementOverflow;\n\n this.log('slice time', performance.now() - perf);\n /* const firstElementRect = firstElement.getBoundingClientRect();\n const scrollTop = */\n\n // this.scroll.scrollIntoView(firstElement, false);\n });\n }, 200);\n };\n\n public onChatsScrollTop() {\n return this.onChatsScroll('top');\n };\n\n public onChatsScroll(side: SliceSides = 'bottom') {\n return this.loadDialogs(side);\n };\n\n public createPlaceholder(): DialogsPlaceholder {\n const placeholder = this.placeholder = new DialogsPlaceholder(this.placeholderOptions);\n const getRectFrom = this.getRectFromForPlaceholder();\n placeholder.attach({\n container: this.sortedList.list.parentElement,\n getRectFrom,\n onRemove: () => {\n if(this.placeholder === placeholder) {\n this.placeholder = undefined;\n }\n },\n blockScrollable: this.scrollable\n });\n\n return placeholder;\n }\n\n public loadDialogs(side: SliceSides) {\n /* if(testScroll) {\n return;\n } */\n\n const log = this.log.bindPrefix('load-' + getUnsafeRandomInt(1000, 9999));\n log('try', side);\n\n if(this.loadDialogsPromise || this.loadDialogsRenderPromise/* || 1 === 1 */) return this.loadDialogsPromise;\n else if(this.scrollable.loadedAll[side]) {\n return Promise.resolve({\n cached: true,\n renderPromise: Promise.resolve()\n });\n }\n\n log.warn('start', side);\n const middlewareError = makeError('MIDDLEWARE');\n\n const cachedInfoPromise = deferredPromise();\n const renderPromise = new Promise(async(resolve, reject) => {\n const chatList = this.sortedList.list;\n\n let placeholder = this.placeholder;\n try {\n const getConversationsResult = this.loadDialogsInner(side);\n const a = await getConversationsResult;\n\n if(\n !chatList.childElementCount &&\n !placeholder &&\n (\n (!this.loadedDialogsAtLeastOnce && this.needPlaceholderAtFirstTime) ||\n !a.cached\n )\n ) {\n if(this.loadDialogsRenderPromise !== renderPromise) {\n throw middlewareError;\n }\n\n placeholder = this.createPlaceholder();\n\n cachedInfoPromise.resolve(false);\n }\n\n const result = await a.result;\n // await pause(5000);\n if(this.loadDialogsRenderPromise !== renderPromise) {\n throw middlewareError;\n }\n\n cachedInfoPromise.resolve(a.cached);\n\n // console.timeEnd('getDialogs time');\n\n // * loaded all\n // if(!result.dialogs.length || chatList.childElementCount === result.count) {\n // !result.dialogs.length не подходит, так как при супердревном диалоге getConversations его не выдаст.\n // if(chatList.childElementCount === result.count) {\n if(side === 'bottom') {\n if(result.isEnd) {\n this.scrollable.loadedAll[side] = true;\n }\n } else if(result.isTopEnd) {\n this.scrollable.loadedAll[side] = true;\n }\n\n const length = result.dialogs.length;\n log(`will render ${length} dialogs`);\n if(length) {\n const dialogs = side === 'top' ? result.dialogs.slice().reverse() : result.dialogs;\n\n const loadPromises = dialogs.map((dialog) => {\n return this.sortedList.add(this.getDialogKey(dialog as T));\n });\n\n await Promise.all(loadPromises).catch();\n if(this.loadDialogsRenderPromise !== renderPromise) {\n throw middlewareError;\n }\n }\n\n const offsetDialog = result.dialogs[side === 'top' ? 0 : length - 1];\n if(offsetDialog) {\n this.offsets[side] = getDialogIndex(offsetDialog, this.indexKey);\n }\n\n // don't set it before - no need to fire length change with every dialog\n this.loadedDialogsAtLeastOnce = true;\n appDialogsManager.onListLengthChange();\n\n log('getDialogs', result, chatList.childElementCount);\n\n setTimeout(() => {\n this.scrollable.onScroll();\n }, 0);\n\n if(placeholder) {\n // await pause(500);\n placeholder.detach(chatList.childElementCount);\n }\n } catch(err) {\n if((err as ApiError)?.type !== 'MIDDLEWARE') {\n log.error(err);\n }\n\n reject(err);\n cachedInfoPromise.reject(err);\n return;\n }\n\n resolve();\n }).finally(() => {\n if(this.loadDialogsRenderPromise === renderPromise) {\n log('end');\n this.loadDialogsRenderPromise = undefined;\n } else {\n log('has been cleared');\n }\n });\n\n this.loadDialogsRenderPromise = renderPromise;\n const loadDialogsPromise = this.loadDialogsPromise = cachedInfoPromise.then((cached) => {\n return {\n cached,\n renderPromise\n };\n }).finally(() => {\n if(this.loadDialogsPromise === loadDialogsPromise) {\n this.loadDialogsPromise = undefined;\n }\n });\n\n return loadDialogsPromise;\n }\n\n public async setOffsets() {\n const chatList = this.sortedList.list;\n const [firstDialog, lastDialog] = await Promise.all([\n this.getDialogFromElement(chatList.firstElementChild as HTMLElement),\n this.getDialogFromElement(chatList.lastElementChild as HTMLElement)\n ]);\n\n const {indexKey} = this;\n this.offsets.top = getDialogIndex(firstDialog, indexKey);\n this.offsets.bottom = getDialogIndex(lastDialog, indexKey);\n }\n\n public getDialogKey(dialog: T): DialogKey {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public getDialogKeyFromElement(element: HTMLElement): DialogKey {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public getRectFromForPlaceholder(): Parameters[0]['getRectFrom'] {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public getDialogFromElement(element: HTMLElement): Promise {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public loadDialogsInner(side: SliceSides): ReturnType {\n throw NOT_IMPLEMENTED_ERROR;\n }\n\n public async setTyping(dialog: T) {\n const key = this.getDialogKey(dialog);\n const dom = this.getDialogDom(key);\n if(!dom) {\n return;\n }\n\n const oldTypingElement = dom.lastMessageSpan.querySelector('.peer-typing-container') as HTMLElement;\n const newTypingElement = await appImManager.getPeerTyping(\n dialog.peerId,\n oldTypingElement,\n dialog._ === 'forumTopic' ? dialog.id : undefined\n );\n if(!oldTypingElement && newTypingElement) {\n replaceContent(dom.lastMessageSpan, newTypingElement);\n dom.lastMessageSpan.classList.add('user-typing');\n }\n }\n\n public unsetTyping(dialog: T) {\n const key = this.getDialogKey(dialog);\n const dialogElement = this.getDialogElement(key);\n if(!dialogElement) {\n return;\n }\n\n dialogElement.dom.lastMessageSpan.classList.remove('user-typing');\n appDialogsManager.setLastMessageN({\n dialog,\n lastMessage: null,\n dialogElement,\n setUnread: null\n });\n }\n\n public getDialogDom(key: DialogKey) {\n // return this.doms[peerId];\n const element = this.sortedList.get(key);\n return element?.dom;\n }\n\n public getDialogElement(key: DialogKey) {\n const element = this.sortedList.get(key);\n return element?.dialogElement;\n }\n\n public bindScrollable() {\n this.scrollable.container.addEventListener('scroll', this.onChatsRegularScroll);\n this.scrollable.onScrolledTop = this.onChatsScrollTop.bind(this);\n this.scrollable.onScrolledBottom = this.onChatsScroll.bind(this);\n this.scrollable.setVirtualContainer(this.sortedList.list);\n }\n\n public clear() {\n this.sortedList.clear();\n this.placeholder?.remove();\n }\n\n public reset() {\n this.scrollable.loadedAll.top = true;\n this.scrollable.loadedAll.bottom = false;\n this.offsets.top = this.offsets.bottom = 0;\n this.loadDialogsRenderPromise = undefined;\n this.loadDialogsPromise = undefined;\n }\n\n public fullReset() {\n this.reset();\n this.clear();\n return this.onChatsScroll();\n }\n\n public destroy() {\n this.clear();\n this.scrollable.destroy();\n this.listenerSetter.removeAll();\n }\n}\n\nclass Some3 extends Some {\n constructor(public peerId: PeerId, public paddingX: number) {\n super();\n\n this.placeholderOptions = {\n avatarSize: 0,\n marginVertical: 5,\n totalHeight: 64\n };\n\n this.listenerSetter.add(rootScope)('peer_typings', async({peerId, threadId, typings}) => {\n if(!threadId || this.peerId !== peerId) {\n return;\n }\n\n const dialog = await this.managers.dialogsStorage.getForumTopic(peerId, threadId);\n\n if(!dialog) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n for(const [peerId, {dialog, topics}] of dialogs) {\n if(peerId !== this.peerId || !topics?.size) {\n continue;\n }\n\n topics.forEach((forumTopic) => {\n this.updateDialog(forumTopic);\n });\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_unread', ({dialog}) => {\n if(dialog?._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))});\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', async(dialog) => {\n if(dialog.peerId !== this.peerId) {\n return;\n }\n\n if(dialog._ === 'dialog') {\n const all = this.sortedList.getAll();\n const entries = [...all.entries()];\n const promises = entries.map(([id]) => this.managers.dialogsStorage.getForumTopic(this.peerId, id));\n const topics = await Promise.all(promises);\n entries.forEach(([id, element], idx) => {\n appDialogsManager.setUnreadMessagesN({dialog: topics[idx], dialogElement: element.dialogElement}); // возможно это не нужно, но нужно менять is-muted\n });\n\n return;\n }\n\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))}); // возможно это не нужно, но нужно менять is-muted\n });\n\n this.listenerSetter.add(rootScope)('dialog_drop', (dialog) => {\n if(dialog._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n this.deleteDialogByKey(this.getDialogKey(dialog));\n });\n\n this.listenerSetter.add(rootScope)('dialog_draft', ({dialog, drop, peerId}) => {\n if(dialog._ !== 'forumTopic' || dialog.peerId !== this.peerId) {\n return;\n }\n\n if(drop) {\n this.deleteDialog(dialog);\n } else {\n this.updateDialog(dialog);\n }\n });\n }\n\n protected isDialogMustBeInViewport(dialog: ForumTopic) {\n if(dialog.pFlags.hidden) return false;\n return super.isDialogMustBeInViewport(dialog);\n }\n\n public getDialogKey(dialog: ForumTopic) {\n return dialog.id;\n }\n\n public getDialogKeyFromElement(element: HTMLElement) {\n return +element.dataset.threadId;\n }\n\n public getRectFromForPlaceholder() {\n return (): DOMRectEditable => {\n const sidebarRect = appSidebarLeft.rect;\n const paddingY = 56;\n return {\n top: paddingY,\n right: sidebarRect.right,\n bottom: 0,\n left: this.paddingX,\n width: sidebarRect.width - this.paddingX,\n height: sidebarRect.height - paddingY\n };\n };\n }\n\n public getDialogFromElement(element: HTMLElement) {\n return this.managers.dialogsStorage.getForumTopic(+element.dataset.peerId, +element.dataset.threadId);\n }\n\n public async loadDialogsInner(side: SliceSides) {\n const {indexKey} = this;\n let loadCount = windowSize.height / 64 * 1.25 | 0;\n let offsetIndex = 0;\n\n const filterId = this.peerId;\n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n offsetIndex = currentOffsetIndex;\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = await this.managers.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex((dialog) => getDialogIndex(dialog, indexKey) <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = getDialogIndex(storage[needIndex], indexKey) + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n\n return this.managers.acknowledged.dialogsStorage.getDialogs({\n offsetIndex,\n limit: loadCount,\n filterId,\n skipMigrated: true\n });\n }\n}\n\nclass Some2 extends Some {\n constructor(protected filterId: number) {\n super();\n\n this.needPlaceholderAtFirstTime = true;\n\n this.listenerSetter.add(rootScope)('peer_typings', async({peerId, typings}) => {\n const [dialog, isForum] = await Promise.all([\n this.managers.appMessagesManager.getDialogOnly(peerId),\n this.managers.appPeersManager.isForum(peerId)\n ]);\n\n if(!dialog || isForum) return;\n\n if(typings.length) {\n this.setTyping(dialog);\n } else {\n this.unsetTyping(dialog);\n }\n });\n\n this.listenerSetter.add(rootScope)('user_update', async(userId) => {\n if(!this.isActive) {\n return;\n }\n\n const peerId = userId.toPeerId();\n const dom = this.getDialogDom(peerId);\n if(!dom) {\n return;\n }\n\n const status = await this.managers.appUsersManager.getUserStatus(userId);\n const online = status?._ === 'userStatusOnline';\n this.setOnlineStatus(dom.avatarEl, online);\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n const peerId = chatId.toPeerId(true);\n this.processDialogForCallStatus(peerId);\n });\n\n this.listenerSetter.add(rootScope)('dialog_flush', ({dialog}) => {\n if(!this.isActive || !dialog) {\n return;\n }\n\n appDialogsManager.setLastMessageN({\n dialog,\n setUnread: true\n });\n this.validateDialogForFilter(dialog);\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n if(!this.isActive) {\n return;\n }\n\n for(const [peerId, {dialog, topics}] of dialogs) {\n if(dialog?._ !== 'dialog') {\n continue;\n }\n\n this.updateDialog(dialog);\n\n appDialogsManager.processContact?.(peerId.toPeerId());\n\n this.validateDialogForFilter(dialog);\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_drop', (dialog) => {\n if(!this.isActive || dialog._ !== 'dialog') {\n return;\n }\n\n this.deleteDialogByKey(dialog.peerId);\n appDialogsManager.processContact?.(dialog.peerId);\n });\n\n this.listenerSetter.add(rootScope)('dialog_unread', ({dialog}) => {\n if(!this.isActive || dialog?._ !== 'dialog') {\n return;\n }\n\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))});\n this.validateDialogForFilter(dialog);\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(!this.isActive || dialog._ === 'forumTopic') {\n return;\n }\n\n this.validateDialogForFilter(dialog);\n appDialogsManager.setUnreadMessagesN({dialog, dialogElement: this.getDialogElement(this.getDialogKey(dialog))}); // возможно это не нужно, но нужно менять is-muted\n });\n\n this.listenerSetter.add(rootScope)('dialog_draft', ({dialog, drop, peerId}) => {\n if(!this.isActive || dialog._ === 'forumTopic') {\n return;\n }\n\n if(drop) {\n this.deleteDialog(dialog);\n } else {\n this.updateDialog(dialog);\n }\n\n appDialogsManager.processContact?.(peerId);\n });\n\n this.listenerSetter.add(rootScope)('filter_update', async(filter) => {\n if(this.isActive && filter.id === this.filterId && !REAL_FOLDERS.has(filter.id)) {\n const dialogs = await this.managers.dialogsStorage.getCachedDialogs(true);\n await this.validateListForFilter();\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n this.updateDialog(dialog);\n }\n }\n });\n }\n\n private get isActive() {\n return appDialogsManager.xd === this;\n }\n\n public getRectFromForPlaceholder() {\n return this.filterId === FOLDER_ID_ARCHIVE ? appDialogsManager.chatsContainer : appDialogsManager.folders.container;\n }\n\n public async loadDialogsInner(side: SliceSides) {\n const {filterId, indexKey} = this;\n let loadCount = windowSize.height / 72 * 1.25 | 0;\n let offsetIndex = 0;\n\n const doNotRenderChatList = appDialogsManager.doNotRenderChatList; // cache before awaits\n\n const {index: currentOffsetIndex} = this.getOffsetIndex(side);\n if(currentOffsetIndex) {\n if(side === 'top') {\n const storage = await this.managers.dialogsStorage.getFolderDialogs(filterId, true);\n const index = storage.findIndex((dialog) => getDialogIndex(dialog, indexKey) <= currentOffsetIndex);\n const needIndex = Math.max(0, index - loadCount);\n loadCount = index - needIndex;\n offsetIndex = getDialogIndex(storage[needIndex], indexKey) + 1;\n } else {\n offsetIndex = currentOffsetIndex;\n }\n }\n\n const promise = this.managers.acknowledged.dialogsStorage.getDialogs({\n offsetIndex,\n limit: loadCount,\n filterId,\n skipMigrated: true\n });\n\n const a = await promise;\n if(doNotRenderChatList) {\n a.result = Promise.reject(makeError('MIDDLEWARE'));\n }\n\n return a;\n }\n\n public setOnlineStatus(element: HTMLElement, online: boolean) {\n const className = 'is-online';\n const hasClassName = element.classList.contains(className);\n !hasClassName && online && element.classList.add(className);\n SetTransition({\n element: element,\n className: 'is-visible',\n forwards: online,\n duration: 250,\n onTransitionEnd: online ? undefined : () => {\n element.classList.remove(className);\n },\n useRafs: online && !hasClassName ? 2 : 0\n });\n }\n\n public generateScrollable(list: HTMLUListElement, filter: Parameters[0]) {\n const filterId = filter.id;\n const scrollable = new Scrollable(null, 'CL', 500);\n scrollable.container.dataset.filterId = '' + filterId;\n\n const indexKey = getDialogIndexKey(filter.localId);\n const sortedDialogList = new SortedDialogList({\n managers: rootScope.managers,\n log: this.log,\n list: list,\n indexKey,\n onListLengthChange: appDialogsManager.onListLengthChange\n });\n\n this.scrollable = scrollable;\n this.sortedList = sortedDialogList;\n this.setIndexKey(indexKey);\n this.bindScrollable();\n\n // list.classList.add('hide');\n // scrollable.container.style.backgroundColor = '#' + (Math.random() * (16 ** 6 - 1) | 0).toString(16);\n\n return scrollable;\n }\n\n public testDialogForFilter(dialog: Dialog) {\n if(!REAL_FOLDERS.has(this.filterId) ? getDialogIndex(dialog, this.indexKey) === undefined : this.filterId !== dialog.folder_id) {\n return false;\n }\n\n return true;\n }\n\n protected isDialogMustBeInViewport(dialog: Dialog) {\n if(dialog.migratedTo !== undefined || !this.testDialogForFilter(dialog)) return false;\n return super.isDialogMustBeInViewport(dialog);\n }\n\n /**\n * Удалит неподходящие чаты из списка, но не добавит их(!)\n */\n public async validateListForFilter() {\n this.sortedList.getAll().forEach(async(element) => {\n const dialog = await rootScope.managers.appMessagesManager.getDialogOnly(element.id);\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(dialog);\n }\n });\n }\n\n /**\n * Удалит неподходящий чат из списка, но не добавит его(!)\n */\n public validateDialogForFilter(dialog: Dialog) {\n if(!this.getDialogElement(dialog.peerId)) {\n return;\n }\n\n if(!this.testDialogForFilter(dialog)) {\n this.deleteDialog(dialog);\n }\n }\n\n public setCallStatus(dom: DialogDom, visible: boolean) {\n let {callIcon, listEl} = dom;\n if(!callIcon && visible) {\n const {canvas, startAnimation} = dom.callIcon = callIcon = groupCallActiveIcon(listEl.classList.contains('active'));\n canvas.classList.add('dialog-group-call-icon');\n listEl.append(canvas);\n startAnimation();\n }\n\n if(!callIcon) {\n return;\n }\n\n SetTransition({\n element: dom.callIcon.canvas,\n className: 'is-visible',\n forwards: visible,\n duration: BADGE_TRANSITION_TIME,\n onTransitionEnd: visible ? undefined : () => {\n dom.callIcon.canvas.remove();\n dom.callIcon = undefined;\n },\n useRafs: visible ? 2 : 0\n });\n }\n\n public async processDialogForCallStatus(peerId: PeerId, dom?: DialogDom) {\n if(!IS_GROUP_CALL_SUPPORTED) {\n return;\n }\n\n if(!dom) dom = this.getDialogDom(peerId);\n if(!dom) return;\n\n const chat = await rootScope.managers.appChatsManager.getChat(peerId.toChatId()) as Chat.chat | Chat.channel;\n this.setCallStatus(dom, !!(chat.pFlags.call_active && chat.pFlags.call_not_empty));\n }\n\n public onChatsScroll(side: SliceSides = 'bottom') {\n if(this.scrollable.loadedAll[side]) {\n appDialogsManager.loadContacts?.();\n }\n\n this.log('onChatsScroll', side);\n return super.onChatsScroll(side);\n }\n\n public toggleAvatarUnreadBadges(value: boolean, useRafs: number) {\n if(!value) {\n this.sortedList.getAll().forEach((sortedDialog) => {\n const {dom, dialogElement} = sortedDialog;\n if(!dom.unreadAvatarBadge) {\n return;\n }\n\n dialogElement.toggleBadgeByKey('unreadAvatarBadge', false, false, false);\n });\n\n return;\n }\n\n const reuseClassNames = ['unread', 'mention'];\n this.sortedList.getAll().forEach((sortedDialog) => {\n const {dom, dialogElement} = sortedDialog;\n const unreadContent = dom.unreadBadge?.textContent;\n if(!unreadContent || dom.unreadBadge.classList.contains('backwards')) {\n return;\n }\n\n const isUnreadAvatarBadgeMounted = !!dom.unreadAvatarBadge;\n dialogElement.createUnreadAvatarBadge();\n dialogElement.toggleBadgeByKey('unreadAvatarBadge', true, isUnreadAvatarBadgeMounted);\n dom.unreadAvatarBadge.textContent = unreadContent;\n const unreadAvatarBadgeClassList = dom.unreadAvatarBadge.classList;\n const unreadBadgeClassList = dom.unreadBadge.classList;\n reuseClassNames.forEach((className) => {\n unreadAvatarBadgeClassList.toggle(className, unreadBadgeClassList.contains(className));\n });\n });\n }\n\n public getDialogKey(dialog: Dialog) {\n return dialog.peerId;\n }\n\n public getDialogKeyFromElement(element: HTMLElement) {\n return +element.dataset.peerId;\n }\n\n public getDialogFromElement(element: HTMLElement) {\n return rootScope.managers.appMessagesManager.getDialogOnly(element.dataset.peerId.toPeerId());\n }\n}\n\n// const testScroll = false;\n// let testTopSlice = 1;\n\nexport class AppDialogsManager {\n public chatsContainer = document.getElementById('chatlist-container') as HTMLDivElement;\n\n private log = logger('DIALOGS', LogTypes.Log | LogTypes.Error | LogTypes.Warn | LogTypes.Debug);\n\n private contextMenu: DialogsContextMenu;\n\n public filterId: number;\n public folders: {[k in 'menu' | 'container' | 'menuScrollContainer']: HTMLElement} = {\n menu: document.getElementById('folders-tabs'),\n menuScrollContainer: null,\n container: document.getElementById('folders-container')\n };\n private filtersRendered: {\n [filterId: string]: {\n menu: HTMLElement,\n container: HTMLElement,\n unread: HTMLElement,\n title: HTMLElement\n }\n } = {};\n private showFiltersPromise: Promise;\n\n private lastActiveElements: Set = new Set();\n\n public loadContacts: () => void;\n public processContact: (peerId: PeerId) => void;\n\n private initedListeners = false;\n\n public onListLengthChange: () => Promise;\n private allChatsIntlElement: I18n.IntlElement;\n\n private emptyDialogsPlaceholderSubtitle: I18n.IntlElement;\n private updateContactsLengthPromise: Promise;\n\n private filtersNavigationItem: NavigationItem;\n\n private managers: AppManagers;\n private selectTab: ReturnType;\n\n public doNotRenderChatList: boolean;\n\n private stateMiddlewareHelper: MiddlewareHelper;\n\n private forumsTabs: Map;\n private forumsSlider: HTMLElement;\n public forumTab: ForumTab;\n private forumNavigationItem: NavigationItem;\n\n public xd: Some2;\n public xds: {[filterId: number]: Some2} = {};\n\n public start() {\n const managers = this.managers = getProxiedManagers();\n\n this.contextMenu = new DialogsContextMenu(managers);\n this.stateMiddlewareHelper = getMiddleware();\n\n this.folders.menuScrollContainer = this.folders.menu.parentElement;\n\n this.onListLengthChange = debounce(this._onListLengthChange, 100, false, true);\n\n const bottomPart = document.createElement('div');\n bottomPart.classList.add('connection-status-bottom');\n bottomPart.append(this.folders.container);\n\n this.forumsTabs = new Map();\n this.forumsSlider = document.createElement('div');\n this.forumsSlider.classList.add('topics-slider');\n this.chatsContainer.parentElement.parentElement.append(this.forumsSlider);\n // findUpClassName(this.chatsContainer, 'chatlist-container').append(this.forumsSlider);\n\n // appSidebarLeft.onOpenTab = () => {\n // return this.toggleForumTab();\n // };\n\n /* if(isTouchSupported && isSafari) {\n let allowUp: boolean, allowDown: boolean, slideBeginY: number;\n const container = this.scroll.container;\n container.addEventListener('touchstart', (event) => {\n allowUp = container.scrollTop > 0;\n allowDown = (container.scrollTop < container.scrollHeight - container.clientHeight);\n // @ts-ignore\n slideBeginY = event.pageY;\n });\n\n container.addEventListener('touchmove', (event: any) => {\n var up = (event.pageY > slideBeginY);\n var down = (event.pageY < slideBeginY);\n slideBeginY = event.pageY;\n if((up && allowUp) || (down && allowDown)) {\n event.stopPropagation();\n } else if(up || down) {\n event.preventDefault();\n }\n });\n } */\n\n if(IS_TOUCH_SUPPORTED) {\n handleTabSwipe({\n element: this.folders.container,\n onSwipe: (xDiff) => {\n const prevId = selectTab.prevId();\n selectTab(xDiff < 0 ? prevId + 1 : prevId - 1);\n },\n verifyTouchTarget: () => {\n return !this.forumTab;\n }\n });\n }\n\n this.allChatsIntlElement = new I18n.IntlElement({\n key: 'FilterAllChatsShort'\n });\n\n rootScope.addEventListener('premium_toggle', async(isPremium) => {\n if(isPremium) {\n return;\n }\n\n const isFolderAvailable = await this.managers.filtersStorage.isFilterIdAvailable(this.filterId);\n if(!isFolderAvailable) {\n selectTab(whichChild(this.filtersRendered[FOLDER_ID_ALL].menu), false);\n }\n });\n\n rootScope.addEventListener('state_cleared', () => {\n const clearCurrent = REAL_FOLDERS.has(this.filterId);\n // setTimeout(() =>\n apiManagerProxy.getState().then(async(state) => {\n this.xd.loadedDialogsAtLeastOnce = false;\n this.showFiltersPromise = undefined;\n\n /* const clearPromises: Promise[] = [];\n for(const name in this.managers.appStateManager.storagesResults) {\n const results = this.managers.appStateManager.storagesResults[name as keyof AppStateManager['storages']];\n const storage = this.managers.appStateManager.storages[name as keyof AppStateManager['storages']];\n results.length = 0;\n clearPromises.push(storage.clear());\n } */\n\n if(clearCurrent) {\n this.xd.clear();\n this.onTabChange();\n }\n\n this.onStateLoaded(state);\n })// , 5000);\n });\n\n this.setFilterId(FOLDER_ID_ALL, FOLDER_ID_ALL);\n this.addFilter({\n id: FOLDER_ID_ALL,\n title: '',\n localId: FOLDER_ID_ALL\n });\n\n const foldersScrollable = new ScrollableX(this.folders.menuScrollContainer);\n bottomPart.prepend(this.folders.menuScrollContainer);\n const selectTab = this.selectTab = horizontalMenu(this.folders.menu, this.folders.container, async(id, tabContent) => {\n /* if(id !== 0) {\n id += 1;\n } */\n\n const _id = id;\n id = +tabContent.dataset.filterId || FOLDER_ID_ALL;\n\n const isFilterAvailable = this.filterId === -1 || REAL_FOLDERS.has(id) || await this.managers.filtersStorage.isFilterIdAvailable(id);\n if(!isFilterAvailable) {\n return false;\n }\n\n const wasFilterId = this.filterId;\n if(!IS_MOBILE_SAFARI) {\n if(_id) {\n if(!this.filtersNavigationItem) {\n this.filtersNavigationItem = {\n type: 'filters',\n onPop: () => {\n selectTab(0);\n this.filtersNavigationItem = undefined;\n }\n };\n\n appNavigationController.spliceItems(1, 0, this.filtersNavigationItem);\n }\n } else if(this.filtersNavigationItem) {\n appNavigationController.removeItem(this.filtersNavigationItem);\n this.filtersNavigationItem = undefined;\n }\n }\n\n if(wasFilterId === id) return;\n\n this.xds[id].clear();\n const promise = this.setFilterIdAndChangeTab(id).then(({cached, renderPromise}) => {\n if(cached) {\n return renderPromise;\n }\n });\n\n if(wasFilterId !== -1) {\n return promise;\n }\n }, () => {\n for(const folderId in this.xds) {\n if(+folderId !== this.filterId) {\n this.xds[folderId].clear();\n }\n }\n }, undefined, foldersScrollable);\n\n apiManagerProxy.getState().then((state) => {\n // * it should've had a better place :(\n appMediaPlaybackController.setPlaybackParams(state.playbackParams);\n appMediaPlaybackController.addEventListener('playbackParams', (params) => {\n this.managers.appStateManager.pushToState('playbackParams', params);\n });\n\n return this.onStateLoaded(state);\n })/* .then(() => {\n const isLoadedMain = this.managers.appMessagesManager.dialogsStorage.isDialogsLoaded(0);\n const isLoadedArchive = this.managers.appMessagesManager.dialogsStorage.isDialogsLoaded(1);\n const wasLoaded = isLoadedMain || isLoadedArchive;\n const a: Promise = isLoadedMain ? Promise.resolve() : this.managers.appMessagesManager.getConversationsAll('', 0);\n const b: Promise = isLoadedArchive ? Promise.resolve() : this.managers.appMessagesManager.getConversationsAll('', 1);\n a.finally(() => {\n b.then(() => {\n if(wasLoaded) {\n (apiUpdatesManager.updatesState.syncLoading || Promise.resolve()).then(() => {\n this.managers.appMessagesManager.refreshConversations();\n });\n }\n });\n });\n }) */;\n\n mediaSizes.addEventListener('resize', () => {\n this.changeFiltersAllChatsKey();\n });\n\n new ConnectionStatusComponent(this.managers, this.chatsContainer);\n this.chatsContainer.append(bottomPart);\n\n setTimeout(() => {\n lottieLoader.loadLottieWorkers();\n }, 200);\n\n PopupElement.MANAGERS = rootScope.managers = managers;\n appDownloadManager.construct(managers);\n appSidebarLeft.construct(managers);\n appSidebarRight.construct(managers);\n groupCallsController.construct(managers);\n callsController.construct(managers);\n appImManager.construct(managers);\n\n // start\n\n this.xd = this.xds[this.filterId];\n\n // selectTab(0, false);\n }\n\n public get chatList() {\n return this.xd.sortedList.list;\n }\n\n public setFilterId(filterId: number, localId: MyDialogFilter['localId']) {\n this.filterId = filterId;\n }\n\n public async setFilterIdAndChangeTab(filterId: number) {\n this.filterId = filterId;\n return this.onTabChange();\n }\n\n private initListeners() {\n rootScope.addEventListener('dialog_flush', ({dialog}) => {\n if(!dialog) {\n return;\n }\n\n this.setFiltersUnreadCount();\n });\n\n rootScope.addEventListener('folder_unread', async(folder) => {\n if(folder.id < 0) {\n const dialogElement = this.xd.getDialogElement(folder.id);\n if(!dialogElement) {\n return;\n }\n\n this.setUnreadMessagesN({\n dialog: await this.managers.dialogsStorage.getDialogOnly(folder.id),\n dialogElement\n });\n } else {\n this.setFilterUnreadCount(folder.id);\n }\n });\n\n rootScope.addEventListener('contacts_update', (userId) => {\n this.processContact?.(userId.toPeerId());\n });\n\n appImManager.addEventListener('peer_changed', ({peerId, threadId, isForum}) => {\n const options: Parameters[0] = {peerId, threadId: isForum ? threadId : undefined};\n // const perf = performance.now();\n for(const element of this.lastActiveElements) {\n const elementThreadId = +element.dataset.threadId || undefined;\n const elementPeerId = element.dataset.peerId.toPeerId();\n if(!appImManager.isSamePeer({peerId: elementPeerId, threadId: elementThreadId}, options)) {\n this.setDialogActive(element, false);\n }\n }\n\n const elements = Array.from(document.querySelectorAll(`[data-autonomous=\"0\"] .chatlist-chat[data-peer-id=\"${peerId}\"]`)) as HTMLElement[];\n elements.forEach((element) => {\n const elementThreadId = +element.dataset.threadId || undefined;\n if(appImManager.isSamePeer({peerId, threadId: elementThreadId}, options)) {\n this.setDialogActive(element, true);\n }\n });\n // this.log('peer_changed total time:', performance.now() - perf);\n });\n\n rootScope.addEventListener('filter_update', async(filter) => {\n if(REAL_FOLDERS.has(filter.id)) {\n return;\n }\n\n if(!this.filtersRendered[filter.id]) {\n this.addFilter(filter);\n return;\n }\n\n const elements = this.filtersRendered[filter.id];\n setInnerHTML(elements.title, wrapEmojiText(filter.title));\n });\n\n rootScope.addEventListener('filter_delete', (filter) => {\n const elements = this.filtersRendered[filter.id];\n if(!elements) return;\n\n // set tab\n // (this.folders.menu.firstElementChild.children[Math.max(0, filter.id - 2)] as HTMLElement).click();\n elements.container.remove();\n elements.menu.remove();\n\n this.xds[filter.id].destroy();\n delete this.xds[filter.id];\n delete this.filtersRendered[filter.id];\n\n this.onFiltersLengthChange();\n\n if(this.filterId === filter.id) {\n this.selectTab(0, false);\n }\n });\n\n rootScope.addEventListener('filter_order', async(order) => {\n order = order.slice();\n indexOfAndSplice(order, FOLDER_ID_ARCHIVE);\n\n const containerToAppend = this.folders.menu as HTMLElement;\n const r = await Promise.all(order.map(async(filterId) => {\n const [indexKey, filter] = await Promise.all([\n this.managers.dialogsStorage.getDialogIndexKeyByFilterId(filterId),\n this.managers.filtersStorage.getFilter(filterId)\n ]);\n\n return {indexKey, filter};\n }));\n\n order.forEach((filterId, idx) => {\n const {indexKey, filter} = r[idx];\n const renderedFilter = this.filtersRendered[filterId];\n\n this.xds[filterId].setIndexKey(indexKey);\n\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.localId);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.localId);\n });\n\n /* if(this.filterId) {\n const tabIndex = order.indexOf(this.filterId) + 1;\n selectTab.prevId = tabIndex;\n } */\n });\n }\n\n public setDialogActive(listEl: HTMLElement, active: boolean) {\n const dom = (listEl as any).dialogDom as DialogDom;\n listEl.classList.toggle('active', active);\n listEl.classList.toggle('is-forum-open', this.forumTab?.peerId === listEl.dataset.peerId.toPeerId() && !listEl.dataset.threadId);\n if(active) {\n this.lastActiveElements.add(listEl);\n } else {\n this.lastActiveElements.delete(listEl);\n }\n\n if(dom?.callIcon) {\n dom.callIcon.setActive(active);\n }\n }\n\n private async onStateLoaded(state: State) {\n this.stateMiddlewareHelper.clean();\n const middleware = this.stateMiddlewareHelper.get();\n const filtersArr = state.filtersArr;\n const haveFilters = filtersArr.length > REAL_FOLDERS.size;\n // const filter = filtersArr.find((filter) => filter.id !== FOLDER_ID_ARCHIVE);\n\n const addFilters = (filters: MyDialogFilter[]) => {\n for(const filter of filters) {\n this.addFilter(filter);\n }\n };\n\n let addFiltersPromise: Promise;\n if(haveFilters) {\n addFilters(filtersArr);\n } else {\n addFiltersPromise = this.managers.filtersStorage.getDialogFilters().then(addFilters);\n }\n\n this.doNotRenderChatList = true;\n const loadDialogsPromise = this.xd.onChatsScroll();\n const m = middlewarePromise(middleware);\n try {\n await m(loadDialogsPromise);\n } catch(err) {\n\n }\n\n // show the placeholder before the filters, and then will reset to the default tab again\n if(!haveFilters) {\n this.selectTab(0, false);\n }\n\n addFiltersPromise && await m(addFiltersPromise);\n // this.folders.menu.children[0].classList.add('active');\n\n this.doNotRenderChatList = undefined;\n\n this.filterId = -1;\n this.selectTab(0, false);\n\n if(!this.initedListeners) {\n this.initListeners();\n this.initedListeners = true;\n }\n\n haveFilters && this.showFiltersPromise && await m(this.showFiltersPromise);\n\n this.managers.appNotificationsManager.getNotifyPeerTypeSettings();\n\n await (await m(loadDialogsPromise)).renderPromise.catch(noop);\n this.managers.appMessagesManager.fillConversations();\n }\n\n /* private getOffset(side: 'top' | 'bottom'): {index: number, pos: number} {\n if(!this.scroll.loadedAll[side]) {\n const element = (side === 'top' ? this.chatList.firstElementChild : this.chatList.lastElementChild) as HTMLElement;\n if(element) {\n const peerId = element.dataset.peerId;\n const dialog = this.managers.appMessagesManager.getDialogByPeerId(peerId);\n return {index: dialog[0].index, pos: dialog[1]};\n }\n }\n\n return {index: 0, pos: -1};\n } */\n\n public onTabChange = () => {\n this.xd = this.xds[this.filterId];\n this.xd.reset();\n return this.xd.onChatsScroll();\n };\n\n private async setFilterUnreadCount(filterId: number) {\n // if(filterId === FOLDER_ID_ALL) {\n // return;\n // }\n\n const unreadSpan = this.filtersRendered[filterId]?.unread;\n if(!unreadSpan) {\n return;\n }\n\n const {unreadUnmutedCount, unreadCount} = await this.managers.dialogsStorage.getFolderUnreadCount(filterId);\n\n unreadSpan.classList.toggle('badge-gray', !unreadUnmutedCount);\n const count = filterId === FOLDER_ID_ALL ? unreadUnmutedCount : unreadCount;\n unreadSpan.innerText = count ? '' + count : '';\n }\n\n private setFiltersUnreadCount() {\n for(const filterId in this.filtersRendered) {\n this.setFilterUnreadCount(+filterId);\n }\n }\n\n public l(filter: Parameters[0]) {\n const ul = this.createChatList();\n const xd = this.xds[filter.id] = new Some2(filter.id);\n const scrollable = xd.generateScrollable(ul, filter);\n this.setListClickListener(ul, null, true);\n\n return {ul, xd, scrollable};\n }\n\n private addFilter(filter: Pick) {\n if(filter.id === FOLDER_ID_ARCHIVE) {\n return;\n }\n\n const containerToAppend = this.folders.menu as HTMLElement;\n const renderedFilter = this.filtersRendered[filter.id];\n if(renderedFilter) {\n positionElementByIndex(renderedFilter.menu, containerToAppend, filter.localId);\n positionElementByIndex(renderedFilter.container, this.folders.container, filter.localId);\n return;\n }\n\n const menuTab = document.createElement('div');\n menuTab.classList.add('menu-horizontal-div-item');\n const span = document.createElement('span');\n const titleSpan = document.createElement('span');\n titleSpan.classList.add('text-super');\n if(filter.id === FOLDER_ID_ALL) titleSpan.append(this.allChatsIntlElement.element);\n else setInnerHTML(titleSpan, wrapEmojiText(filter.title));\n const unreadSpan = document.createElement('div');\n unreadSpan.classList.add('badge', 'badge-20', 'badge-primary');\n const i = document.createElement('i');\n span.append(titleSpan, unreadSpan, i);\n ripple(menuTab);\n menuTab.append(span);\n\n menuTab.dataset.filterId = '' + filter.id;\n\n positionElementByIndex(menuTab, containerToAppend, filter.localId);\n // containerToAppend.append(li);\n\n const {ul, scrollable} = this.l(filter);\n scrollable.container.classList.add('tabs-tab', 'chatlist-parts');\n\n /* const parts = document.createElement('div');\n parts.classList.add('chatlist-parts'); */\n\n const top = document.createElement('div');\n top.classList.add('chatlist-top');\n\n const bottom = document.createElement('div');\n bottom.classList.add('chatlist-bottom');\n\n top.append(ul);\n scrollable.container.append(top, bottom);\n /* parts.append(top, bottom);\n scrollable.container.append(parts); */\n\n const div = scrollable.container;\n // this.folders.container.append(div);\n positionElementByIndex(scrollable.container, this.folders.container, filter.localId);\n\n this.filtersRendered[filter.id] = {\n menu: menuTab,\n container: div,\n unread: unreadSpan,\n title: titleSpan\n };\n\n this.onFiltersLengthChange();\n }\n\n private changeFiltersAllChatsKey() {\n const scrollable = this.folders.menuScrollContainer.firstElementChild;\n const key: LangPackKey = scrollable.scrollWidth > scrollable.clientWidth ? 'FilterAllChatsShort' : 'FilterAllChats';\n this.allChatsIntlElement.compareAndUpdate({key});\n }\n\n private onFiltersLengthChange() {\n let promise = this.showFiltersPromise;\n return promise ??= this.showFiltersPromise = pause(0).then(() => {\n if(this.showFiltersPromise !== promise) {\n return;\n }\n\n const length = Object.keys(this.filtersRendered).length;\n const show = length > 1;\n const wasShowing = !this.folders.menuScrollContainer.classList.contains('hide');\n\n if(show !== wasShowing) {\n this.folders.menuScrollContainer.classList.toggle('hide', !show);\n if(show && !wasShowing) {\n this.setFiltersUnreadCount();\n }\n\n this.chatsContainer.classList.toggle('has-filters', show);\n }\n\n this.changeFiltersAllChatsKey();\n\n this.showFiltersPromise = undefined;\n });\n }\n\n private generateEmptyPlaceholder(options: {\n title: LangPackKey,\n subtitle?: LangPackKey,\n subtitleArgs?: FormatterArguments,\n classNameType: string\n }) {\n const BASE_CLASS = 'empty-placeholder';\n const container = document.createElement('div');\n container.classList.add(BASE_CLASS, BASE_CLASS + '-' + options.classNameType);\n\n const header = document.createElement('div');\n header.classList.add(BASE_CLASS + '-header');\n _i18n(header, options.title);\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(BASE_CLASS + '-subtitle');\n if(options.subtitle) {\n _i18n(subtitle, options.subtitle, options.subtitleArgs);\n }\n\n container.append(header, subtitle);\n\n return {container, header, subtitle};\n }\n\n private checkIfPlaceholderNeeded() {\n if(this.filterId === FOLDER_ID_ARCHIVE) {\n return;\n }\n\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n let placeholderContainer = (Array.from(part.children) as HTMLElement[]).find((el) => el.matches('.empty-placeholder'));\n const needPlaceholder = this.xd.scrollable.loadedAll.bottom && !chatList.childElementCount/* || true */;\n // chatList.style.display = 'none';\n\n if(needPlaceholder && placeholderContainer) {\n return;\n } else if(!needPlaceholder) {\n if(placeholderContainer) {\n part.classList.remove('with-placeholder');\n placeholderContainer.remove();\n }\n\n return;\n }\n\n let placeholder: ReturnType, type: 'dialogs' | 'folder';\n if(!this.filterId) {\n placeholder = this.generateEmptyPlaceholder({\n title: 'ChatList.Main.EmptyPlaceholder.Title',\n classNameType: type = 'dialogs'\n });\n\n placeholderContainer = placeholder.container;\n\n const img = document.createElement('img');\n img.classList.add('empty-placeholder-dialogs-icon');\n\n this.emptyDialogsPlaceholderSubtitle = new I18n.IntlElement({\n element: placeholder.subtitle\n });\n\n Promise.all([\n this.updateContactsLength(false),\n renderImageFromUrlPromise(img, 'assets/img/EmptyChats.svg'),\n fastRafPromise()\n ]).then(([usersLength]) => {\n placeholderContainer.classList.add('visible');\n part.classList.toggle('has-contacts', !!usersLength);\n });\n\n placeholderContainer.prepend(img);\n } else {\n placeholder = this.generateEmptyPlaceholder({\n title: 'FilterNoChatsToDisplay',\n subtitle: 'FilterNoChatsToDisplayInfo',\n classNameType: type = 'folder'\n });\n\n placeholderContainer = placeholder.container;\n\n const div = document.createElement('div');\n const emoji = '📂';\n const size = 128;\n wrapStickerEmoji({\n div,\n emoji: emoji,\n width: size,\n height: size\n });\n\n placeholderContainer.prepend(div);\n\n const button = Button('btn-primary btn-color-primary btn-control tgico', {\n text: 'FilterHeaderEdit',\n icon: 'settings'\n });\n\n attachClickEvent(button, async() => {\n const tab = appSidebarLeft.createTab(AppEditFolderTab);\n tab.setInitFilter(await this.managers.filtersStorage.getFilter(this.filterId));\n tab.open();\n });\n\n placeholderContainer.append(button);\n }\n\n part.append(placeholderContainer);\n part.classList.add('with-placeholder');\n part.dataset.placeholderType = type;\n }\n\n private updateContactsLength(updatePartClassName: boolean) {\n return this.updateContactsLengthPromise ??= this.managers.appUsersManager.getContacts().then((users) => {\n const subtitle = this.emptyDialogsPlaceholderSubtitle;\n if(subtitle) {\n let key: LangPackKey, args: FormatterArguments;\n\n if(users.length/* && false */) {\n key = 'ChatList.Main.EmptyPlaceholder.Subtitle';\n args = [i18n('Contacts.Count', [users.length])];\n } else {\n key = 'ChatList.Main.EmptyPlaceholder.SubtitleNoContacts';\n args = [];\n }\n\n subtitle.compareAndUpdate({\n key,\n args\n });\n }\n\n if(updatePartClassName) {\n const chatList = this.chatList;\n const part = chatList.parentElement as HTMLElement;\n part.classList.toggle('has-contacts', !!users.length);\n }\n\n this.updateContactsLengthPromise = undefined;\n\n return users.length;\n });\n }\n\n private removeContactsPlaceholder() {\n const chatList = this.chatList;\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n parts.classList.remove('with-contacts');\n bottom.replaceChildren();\n this.loadContacts = undefined;\n this.processContact = undefined;\n }\n\n private _onListLengthChange = () => {\n if(!this.xd.loadedDialogsAtLeastOnce) {\n return;\n }\n\n this.checkIfPlaceholderNeeded();\n\n if(this.filterId !== FOLDER_ID_ALL) return;\n\n const chatList = this.chatList;\n const count = chatList.childElementCount;\n\n const parts = chatList.parentElement.parentElement;\n const bottom = chatList.parentElement.nextElementSibling as HTMLElement;\n const hasContacts = !!bottom.childElementCount;\n if(count >= 10) {\n if(hasContacts) {\n this.removeContactsPlaceholder();\n }\n\n return;\n } else if(hasContacts) return;\n\n parts.classList.add('with-contacts');\n\n const section = new SettingSection({\n name: 'Contacts',\n noDelimiter: true,\n fakeGradientDelimiter: true\n });\n\n section.container.classList.add('hide');\n\n this.managers.appUsersManager.getContactsPeerIds(undefined, undefined, 'online').then((contacts) => {\n let ready = false;\n const onListLengthChange = () => {\n if(ready) {\n section.container.classList.toggle('hide', !sortedUserList.list.childElementCount);\n }\n\n this.updateContactsLength(true);\n };\n\n const sortedUserList = new SortedUserList({\n avatarSize: 'abitbigger',\n createChatListOptions: {\n dialogSize: 48,\n new: true\n },\n autonomous: false,\n onListLengthChange,\n managers: this.managers\n });\n\n this.loadContacts = () => {\n const pageCount = windowSize.height / 60 | 0;\n const promise = filterAsync(contacts.splice(0, pageCount), this.verifyPeerIdForContacts);\n\n promise.then((arr) => {\n arr.forEach((peerId) => {\n sortedUserList.add(peerId);\n });\n });\n\n if(!contacts.length) {\n this.loadContacts = undefined;\n }\n };\n\n this.loadContacts();\n\n this.processContact = async(peerId) => {\n if(peerId.isAnyChat()) {\n return;\n }\n\n const good = await this.verifyPeerIdForContacts(peerId);\n const added = sortedUserList.has(peerId);\n if(!added && good) sortedUserList.add(peerId);\n else if(added && !good) sortedUserList.delete(peerId);\n };\n\n const list = sortedUserList.list;\n list.classList.add('chatlist-new');\n this.setListClickListener(list);\n section.content.append(list);\n\n ready = true;\n onListLengthChange();\n });\n\n bottom.append(section.container);\n };\n\n private verifyPeerIdForContacts = async(peerId: PeerId) => {\n const [isContact, dialog] = await Promise.all([\n this.managers.appPeersManager.isContact(peerId),\n this.managers.appMessagesManager.getDialogOnly(peerId)\n ]);\n\n return isContact && !dialog;\n };\n\n public async toggleForumTab(newTab?: ForumTab, hideTab = this.forumTab) {\n if(!hideTab && !newTab) {\n return;\n }\n\n if(hideTab) {\n const dialogElement = this.xd.getDialogElement(hideTab.peerId);\n if(dialogElement) {\n dialogElement.dom.listEl.classList.remove('is-forum-open');\n }\n }\n\n if(hideTab === newTab) {\n newTab = undefined;\n }\n\n hideTab?.toggle(false);\n const promise = newTab?.toggle(true);\n if(hideTab === this.forumTab) {\n this.forumTab = newTab;\n }\n\n if(newTab) {\n const dialogElement = this.xd.getDialogElement(newTab.peerId);\n if(dialogElement) {\n dialogElement.dom.listEl.classList.add('is-forum-open');\n }\n\n appImManager.selectTab(APP_TABS.CHATLIST);\n }\n\n if(promise) {\n await promise;\n }\n\n if(newTab && !this.forumNavigationItem) {\n this.forumNavigationItem = {\n type: 'forum',\n onPop: () => {\n this.forumNavigationItem = undefined;\n this.toggleForumTab();\n }\n };\n\n appNavigationController.pushItem(this.forumNavigationItem);\n } else if(!newTab && this.forumNavigationItem) {\n appNavigationController.removeItem(this.forumNavigationItem);\n this.forumNavigationItem = undefined;\n }\n\n const forwards = !!newTab;\n const useRafs = promise ? 2 : undefined;\n this.xd.toggleAvatarUnreadBadges(forwards, useRafs);\n\n const deferred = deferredPromise();\n const duration = 300;\n SetTransition({\n element: this.forumsSlider.parentElement,\n className: 'is-forum-visible',\n duration,\n forwards,\n useRafs,\n onTransitionEnd: () => {\n deferred.resolve();\n }\n });\n\n dispatchHeavyAnimationEvent(deferred, duration).then(() => deferred.resolve());\n }\n\n public toggleForumTabByPeerId(peerId: PeerId, show?: boolean) {\n const {managers} = this;\n const history = appSidebarLeft.getHistory();\n const lastTab = history[history.length - 1];\n let forumTab: ForumTab;\n if(lastTab/* && !(lastTab instanceof AppArchivedTab) */) {\n if(lastTab instanceof ForumTab && lastTab.peerId === peerId && show) {\n shake(lastTab.container);\n return;\n }\n\n forumTab = appSidebarLeft.createTab(ForumTab);\n forumTab.open({peerId, managers});\n return;\n }\n\n forumTab = this.forumsTabs.get(peerId);\n const isSameTab = this.forumTab && this.forumTab === forumTab;\n show ??= !isSameTab;\n if(show === isSameTab) {\n if(show) {\n shake(forumTab.container);\n }\n\n return;\n }\n\n if(show && !forumTab) {\n forumTab = new ForumTab(undefined);\n forumTab.init({peerId, managers});\n\n this.forumsTabs.set(peerId, forumTab);\n this.forumsSlider.append(forumTab.container);\n\n forumTab.managers = this.managers;\n forumTab.eventListener.addEventListener('destroy', () => {\n this.forumsTabs.delete(peerId);\n });\n }\n\n return this.toggleForumTab(forumTab);\n }\n\n public setListClickListener(\n list: HTMLUListElement,\n onFound?: () => void,\n withContext = false,\n autonomous = false,\n openInner = false\n ) {\n let lastActiveListElement: HTMLElement;\n\n const setPeerFunc = (openInner ? appImManager.setInnerPeer : appImManager.setPeer).bind(appImManager);\n\n list.dataset.autonomous = '' + +autonomous;\n list.addEventListener('mousedown', (e) => {\n if(e.button !== 0) return;\n\n this.log('dialogs click list');\n const target = e.target as HTMLElement;\n const elem = findUpTag(target, DIALOG_LIST_ELEMENT_TAG);\n\n if(!elem) {\n return;\n }\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n const threadId = +elem.dataset.threadId || undefined;\n\n onFound?.();\n\n const isForum = !!elem.querySelector('.is-forum');\n if(isForum && !e.shiftKey && !lastMsgId) {\n this.toggleForumTabByPeerId(peerId);\n return;\n }\n\n if(e.ctrlKey || e.metaKey) {\n window.open((elem as HTMLAnchorElement).href || ('#' + peerId), '_blank');\n cancelEvent(e);\n return;\n }\n\n if(autonomous) {\n const sameElement = lastActiveListElement === elem;\n if(lastActiveListElement && !sameElement) {\n lastActiveListElement.classList.remove('active');\n }\n\n if(elem) {\n elem.classList.add('active');\n lastActiveListElement = elem;\n this.lastActiveElements.add(elem);\n }\n }\n\n if(\n (!threadId || lastMsgId) &&\n this.xd.sortedList.list === list &&\n this.xd !== this.xds[FOLDER_ID_ARCHIVE]\n ) {\n this.toggleForumTab();\n }\n\n setPeerFunc({\n peerId,\n lastMsgId,\n threadId: threadId\n });\n }, {capture: true});\n\n // cancel link click\n // ! do not change it to attachClickEvent\n list.addEventListener('click', (e) => {\n if(e.button === 0) {\n cancelEvent(e);\n }\n }, {capture: true});\n\n if(withContext) {\n attachContextMenuListener({\n element: list,\n callback: this.contextMenu.onContextMenu\n });\n }\n }\n\n public createChatList(options: {\n // avatarSize?: number,\n // handheldsSize?: number,\n // size?: number,\n new?: boolean,\n dialogSize?: number,\n ignoreClick?: boolean\n } = {}) {\n const list = document.createElement('ul');\n list.classList.add('chatlist'/* ,\n 'chatlist-avatar-' + (options.avatarSize || 54) *//* , 'chatlist-' + (options.size || 72) */);\n\n if(options.new) {\n list.classList.add('chatlist-new');\n }\n\n if(options.dialogSize) {\n list.classList.add('chatlist-' + options.dialogSize);\n }\n\n // if(options.ignoreClick) {\n // list.classList.add('disable-hover');\n // }\n\n /* if(options.handheldsSize) {\n list.classList.add('chatlist-handhelds-' + options.handheldsSize);\n } */\n\n return list;\n }\n\n public setLastMessageN(options: Parameters[0]) {\n const promise = this.setLastMessage(options);\n return promise.catch((err: ApiError) => {\n if(err?.type !== 'MIDDLEWARE') {\n this.log.error('set last message error', err);\n }\n });\n }\n\n private async setLastMessage({\n dialog,\n lastMessage,\n dialogElement,\n highlightWord,\n isBatch = false,\n setUnread = false\n }: {\n dialog: Dialog | ForumTopic,\n lastMessage?: Message.message | Message.messageService,\n dialogElement?: DialogElement,\n highlightWord?: string,\n isBatch?: boolean,\n setUnread?: boolean\n }) {\n if(!dialogElement) {\n dialogElement = this.xd.getDialogElement(dialog.peerId);\n\n if(!dialogElement) {\n return;\n }\n }\n\n const {dom} = dialogElement;\n const {peerId} = dialog;\n\n const {deferred: promise, middleware} = setPromiseMiddleware(dom, 'setLastMessagePromise');\n\n let draftMessage: MyDraftMessage;\n if(!lastMessage) {\n if(\n dialog.draft?._ === 'draftMessage' && (\n !peerId.isAnyChat() ||\n dialog._ === 'forumTopic' ||\n !(await this.managers.appPeersManager.isForum(peerId))\n )\n ) {\n draftMessage = dialog.draft;\n }\n\n lastMessage = (dialog as Dialog).topMessage;\n if(lastMessage?.mid !== dialog.top_message) {\n const promise = this.managers.appMessagesManager.getMessageByPeer(peerId, dialog.top_message);\n lastMessage = await middleware(promise);\n }\n }\n\n // * do not uncomment next line - unsetTyping right after this call will interrupt setting unread badges\n // if(setUnread) {\n this.setUnreadMessagesN({dialog, dialogElement, isBatch, setLastMessagePromise: promise});\n // }\n\n if(!lastMessage/* || (lastMessage._ === 'messageService' && !lastMessage.rReply) */) {\n dom.lastMessageSpan.replaceChildren();\n dom.lastTimeSpan.replaceChildren();\n delete dom.listEl.dataset.mid;\n\n promise.resolve();\n return;\n }\n\n const isRestricted = lastMessage && isMessageRestricted(lastMessage as Message.message);\n\n /* if(!dom.lastMessageSpan.classList.contains('user-typing')) */ {\n let mediaContainer: HTMLElement;\n const willPrepend: (Promise | HTMLElement)[] = [];\n if(lastMessage && !draftMessage && !isRestricted) {\n const media: MyDocument | MyPhoto = getMediaFromMessage(lastMessage);\n const videoTypes: Set = new Set(['video', 'gif', 'round']);\n if(media && (media._ === 'photo' || videoTypes.has(media.type))) {\n const size = choosePhotoSize(media, 20, 20);\n\n if(size._ !== 'photoSizeEmpty') {\n mediaContainer = document.createElement('div');\n mediaContainer.classList.add('dialog-subtitle-media');\n\n if((media as MyDocument).type === 'round') {\n mediaContainer.classList.add('is-round');\n }\n\n willPrepend.push(wrapPhoto({\n photo: media,\n message: lastMessage,\n container: mediaContainer,\n withoutPreloader: true,\n size\n }).then(() => mediaContainer));\n\n if(videoTypes.has((media as MyDocument).type)) {\n const playIcon = document.createElement('span');\n playIcon.classList.add('tgico-play');\n\n mediaContainer.append(playIcon);\n }\n }\n }\n }\n\n /* if(lastMessage.from_id === auth.id) { // You: */\n if(draftMessage) {\n const span = document.createElement('span');\n span.classList.add('danger');\n span.append(i18n('Draft'), ': ');\n willPrepend.unshift(span);\n } else if(peerId.isAnyChat() && peerId !== lastMessage.fromId && !(lastMessage as Message.messageService).action) {\n const span = document.createElement('span');\n span.classList.add('primary-text');\n\n if(lastMessage.fromId === rootScope.myId) {\n span.append(i18n('FromYou'));\n willPrepend.unshift(span);\n } else {\n // str = sender.first_name || sender.last_name || sender.username;\n const p = middleware(wrapPeerTitle({\n peerId: lastMessage.fromId,\n onlyFirstName: true\n })).then((element) => {\n span.prepend(element);\n return span;\n }, noop);\n\n willPrepend.unshift(p);\n }\n\n span.append(': ');\n // console.log(sender, senderBold.innerText);\n }\n\n const withoutMediaType = !!mediaContainer && !!(lastMessage as Message.message)?.message;\n\n let fragment: DocumentFragment;\n if(highlightWord && (lastMessage as Message.message).message) {\n fragment = await middleware(wrapMessageForReply({message: lastMessage, highlightWord, withoutMediaType}));\n } else if(draftMessage) {\n fragment = await middleware(wrapMessageForReply({message: draftMessage}));\n } else if(lastMessage) {\n fragment = await middleware(wrapMessageForReply({message: lastMessage, withoutMediaType}));\n } else { // rare case\n fragment = document.createDocumentFragment();\n }\n\n if(willPrepend.length) {\n const elements = await middleware(Promise.all(willPrepend));\n fragment.prepend(...elements);\n }\n\n replaceContent(dom.lastMessageSpan, fragment);\n }\n\n if(lastMessage || draftMessage/* && lastMessage._ !== 'draftMessage' */) {\n const date = draftMessage ? Math.max(draftMessage.date, lastMessage.date || 0) : lastMessage.date;\n replaceContent(dom.lastTimeSpan, formatDateAccordingToTodayNew(new Date(date * 1000)));\n } else dom.lastTimeSpan.textContent = '';\n\n if(setUnread !== null && !setUnread) { // means search\n dom.listEl.dataset.mid = '' + lastMessage.mid;\n\n const replyTo = lastMessage.reply_to;\n if(replyTo?.pFlags?.forum_topic) {\n dom.listEl.dataset.threadId = '' + getMessageThreadId(lastMessage);\n }\n }\n\n promise.resolve();\n }\n\n public setUnreadMessagesN(options: Parameters[0]) {\n return this.setUnreadMessages(options).catch(() => {});\n }\n\n private async setUnreadMessages({\n dialog,\n dialogElement,\n isBatch = false,\n setLastMessagePromise\n }: {\n dialog: Dialog | ForumTopic,\n dialogElement: DialogElement,\n isBatch?: boolean,\n setLastMessagePromise?: Promise\n }) {\n const {dom} = dialogElement;\n if(!dom) {\n // this.log.error('setUnreadMessages no dom!', dialog);\n return;\n }\n\n const isTopic = dialog._ === 'forumTopic';\n\n const {deferred, middleware} = setPromiseMiddleware(dom, 'setUnreadMessagePromise');\n\n const {peerId} = dialog;\n const promises = Promise.all([\n this.managers.appNotificationsManager.isPeerLocalMuted({peerId: peerId, respectType: true, threadId: isTopic ? dialog.id : undefined}),\n dialog.draft?._ !== 'draftMessage' ? this.managers.appMessagesManager.getMessageByPeer(peerId, dialog.top_message) : undefined,\n isTopic ? !!dialog.pFlags.pinned : this.managers.dialogsStorage.isDialogPinned(peerId, this.filterId),\n this.managers.appMessagesManager.isDialogUnread(dialog),\n peerId.isAnyChat() && !isTopic ? this.managers.acknowledged.dialogsStorage.getForumUnreadCount(peerId).then((result) => {\n if(result.cached) {\n return result.result;\n } else {\n result.result.then(() => {\n this.setUnreadMessagesN({dialog, dialogElement});\n });\n\n return {count: 0, hasUnmuted: false};\n }\n }).catch(() => undefined as {count: number, hasUnmuted: boolean}) : undefined\n ]);\n\n let [isMuted, lastMessage, isPinned, isDialogUnread, forumUnreadCount] = await middleware(promises);\n const wasMuted = dom.listEl.classList.contains('is-muted');\n\n const {count: unreadTopicsCount, hasUnmuted: hasUnmutedTopic} = forumUnreadCount || {};\n\n let setStatusMessage: MyMessage;\n if(lastMessage && lastMessage.pFlags.out && lastMessage.peerId !== rootScope.myId) {\n setStatusMessage = lastMessage;\n }\n\n const unreadCount = unreadTopicsCount ?? dialog.unread_count;\n if(unreadTopicsCount !== undefined) {\n isDialogUnread = !!unreadCount;\n }\n\n if(isTopic && !isDialogUnread) {\n isDialogUnread = !getServerMessageId(dialog.read_inbox_max_id);\n }\n\n const hasUnreadBadge = isPinned || isDialogUnread;\n const hasUnreadAvatarBadge = this.xd !== this.xds[FOLDER_ID_ARCHIVE] && !isTopic && !!this.forumTab && this.xd.getDialogElement(peerId) === dialogElement && isDialogUnread;\n // dom.messageEl.classList.toggle('has-badge', hasBadge);\n\n // * have to await all promises before modifying something\n\n if(setLastMessagePromise) {\n try {\n await middleware(setLastMessagePromise);\n } catch(err) {\n return;\n }\n }\n\n const transitionDuration = isBatch ? 0 : BADGE_TRANSITION_TIME;\n\n dom.listEl.classList.toggle('no-unmuted-topic', !isMuted && hasUnmutedTopic !== undefined && !hasUnmutedTopic);\n\n if(isMuted !== wasMuted) {\n SetTransition({\n element: dom.listEl,\n className: 'is-muted',\n forwards: isMuted,\n duration: transitionDuration\n });\n }\n\n setSendingStatus(dom.statusSpan, isTopic && dialog.pFlags.closed ? 'premium_lock' : setStatusMessage, true);\n\n // if(isTopic) {\n // dom.statusSpan.parentElement.classList.toggle('is-closed', !!dialog.pFlags.closed);\n // }\n\n const isUnreadBadgeMounted = !!dom.unreadBadge;\n if(hasUnreadBadge) {\n dialogElement.createUnreadBadge();\n }\n\n const isUnreadAvatarBadgeMounted = !!dom.unreadAvatarBadge;\n if(hasUnreadAvatarBadge) {\n dialogElement.createUnreadAvatarBadge();\n }\n\n const hasMentionsBadge = dialog.unread_mentions_count && (dialog.unread_mentions_count > 1 || dialog.unread_count > 1);\n const isMentionsBadgeMounted = !!dom.mentionsBadge;\n if(hasMentionsBadge) {\n dialogElement.createMentionsBadge();\n }\n\n const a: [Parameters[0], boolean, boolean][] = [\n ['unreadBadge', hasUnreadBadge, isUnreadBadgeMounted],\n ['unreadAvatarBadge', hasUnreadAvatarBadge, isUnreadAvatarBadgeMounted],\n ['mentionsBadge', hasMentionsBadge, isMentionsBadgeMounted]\n ];\n\n a.forEach(([key, hasBadge, isBadgeMounted]) => {\n const badge = dom[key];\n if(!badge) {\n return;\n }\n\n dialogElement.toggleBadgeByKey(key, hasBadge, isBadgeMounted, isBatch);\n });\n\n if(!hasUnreadBadge) {\n deferred.resolve();\n return;\n }\n\n if(isPinned) {\n dom.unreadBadge.classList.add('tgico-chatspinned', 'tgico');\n } else if(dom.unreadBadge) {\n dom.unreadBadge.classList.remove('tgico-chatspinned', 'tgico');\n }\n\n let isUnread = true, isMention = false, unreadBadgeText: string;\n if(dialog.unread_mentions_count && unreadCount === 1) {\n unreadBadgeText = '@';\n isMention = true;\n // dom.unreadBadge.classList.add('tgico-mention', 'tgico');\n } else if(isDialogUnread) {\n // dom.unreadMessagesSpan.innerText = '' + (unreadCount ? formatNumber(unreadCount, 1) : ' ');\n unreadBadgeText = '' + (unreadCount ? formatNumber(unreadCount, 1) : ' ');\n } else {\n unreadBadgeText = '';\n isUnread = false;\n }\n\n if(isTopic) {\n const notVisited = isDialogUnread && unreadBadgeText === ' ';\n dom.unreadBadge.classList.toggle('not-visited', notVisited);\n }\n\n const b: Array<[HTMLElement, string]> = [\n [dom.unreadBadge, unreadBadgeText],\n [dom.unreadAvatarBadge, unreadBadgeText || undefined]\n ];\n\n b.filter(Boolean).forEach(([badge, text]) => {\n if(text !== undefined) {\n badge.innerText = unreadBadgeText;\n }\n\n badge.classList.toggle('unread', isUnread);\n badge.classList.toggle('mention', isMention);\n });\n\n deferred.resolve();\n }\n\n private async getDialog(dialog: Dialog | ForumTopic | PeerId, threadId?: number) {\n if(typeof(dialog) !== 'object') {\n let originalDialog: Dialog | ForumTopic;\n if(threadId) {\n originalDialog = await this.managers.dialogsStorage.getForumTopic(dialog, threadId);\n if(!originalDialog) {\n const peerId = dialog || NULL_PEER_ID;\n return {\n peerId,\n pFlags: {}\n } as any as ForumTopic;\n }\n } else {\n originalDialog = await this.managers.appMessagesManager.getDialogOnly(dialog);\n if(!originalDialog) {\n const peerId = dialog || NULL_PEER_ID;\n return {\n peerId,\n peer: await this.managers.appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } as any as Dialog;\n }\n }\n\n return originalDialog;\n }\n\n return dialog as Dialog | ForumTopic;\n }\n\n public addListDialog(options: Parameters[0] & {isBatch?: boolean}) {\n options.autonomous = false;\n\n const ret = this.addDialogNew(options);\n\n if(ret) {\n const {peerId} = options;\n const getDialogPromise = this.getDialog(peerId, options.threadId);\n const promise = getDialogPromise.then((dialog) => {\n const promises: Promise[] = [];\n const isUser = peerId.isUser();\n if(!isUser && dialog._ === 'dialog') {\n promises.push(this.xd.processDialogForCallStatus(peerId, ret.dom));\n }\n\n if(peerId !== rootScope.myId && isUser) {\n promises.push(this.managers.appUsersManager.getUserStatus(peerId.toUserId()).then((status) => {\n if(status?._ === 'userStatusOnline') {\n this.xd.setOnlineStatus(ret.dom.avatarEl, true);\n }\n }));\n }\n\n promises.push(this.setLastMessageN({\n dialog,\n dialogElement: ret,\n isBatch: options.isBatch,\n setUnread: true\n }));\n\n return Promise.all(promises);\n });\n\n options.loadPromises?.push(promise);\n }\n\n return ret;\n }\n\n /**\n * use for rendering search result\n */\n public addDialogAndSetLastMessage(options: Omit[0], 'dialog'> & {\n message: MyMessage,\n peerId: PeerId,\n query?: string\n }) {\n const {peerId, message, query} = options;\n const ret = this.addDialogNew({\n ...options,\n ...getMessageSenderPeerIdOrName(message),\n peerId\n });\n\n this.setLastMessageN({\n dialog: {_: 'dialog', peerId} as any,\n lastMessage: message,\n dialogElement: ret,\n highlightWord: query\n });\n\n if(message.peerId !== peerId) {\n ret.dom.listEl.dataset.peerId = '' + message.peerId;\n }\n\n return ret;\n }\n\n public addDialogNew(options: DialogElementOptions & {container?: HTMLElement | Scrollable | false, append?: boolean}) {\n const d = new DialogElement({\n autonomous: !!options.container,\n avatarSize: 'bigger',\n ...options\n // avatarSize: !options.avatarSize || options.avatarSize >= 54 ? 'bigger' : 'abitbigger',\n });\n\n if(options.container) {\n const method = !options.append ? 'append' : 'prepend';\n options.container[method](d.container);\n }\n\n return d;\n // return this.addDialog(options.peerId, options.container, options.rippleEnabled, options.onlyFirstName, options.meAsSaved, options.append, options.avatarSize, options.autonomous, options.lazyLoadQueue, options.loadPromises, options.fromName, options.noIcons);\n }\n}\n\nconst appDialogsManager = new AppDialogsManager();\nMOUNT_CLASS_TO.appDialogsManager = appDialogsManager;\nexport default appDialogsManager;\n","export default function getUnsafeRandomInt(min: number, max: number) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {DownloadMediaOptions, DownloadOptions} from '../mtproto/apiFileManager';\nimport type {AppMessagesManager} from './appMessagesManager';\nimport type {MyDocument} from './appDocsManager';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {InputFile, Photo, PhotoSize} from '../../layer';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport {AppManagers} from './managers';\nimport rootScope from '../rootScope';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport noop from '../../helpers/noop';\nimport getDownloadMediaDetails from './utils/download/getDownloadMediaDetails';\nimport getDownloadFileNameFromOptions from './utils/download/getDownloadFileNameFromOptions';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport makeError from '../../helpers/makeError';\nimport createDownloadAnchor from '../../helpers/dom/createDownloadAnchor';\nimport {getFileNameByLocation} from '../../helpers/fileName';\nimport getDocumentDownloadOptions from './utils/docs/getDocumentDownloadOptions';\nimport getPhotoDownloadOptions from './utils/photos/getPhotoDownloadOptions';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\n\nexport type ResponseMethodBlob = 'blob';\nexport type ResponseMethodJson = 'json';\nexport type ResponseMethod = ResponseMethodBlob | ResponseMethodJson;\n\n/* export type DownloadBlob = {promise: Promise, controller: AbortController};\nexport type DownloadJson = {promise: Promise, controller: AbortController}; */\nexport type DownloadBlob = CancellablePromise;\nexport type DownloadUrl = CancellablePromise;\nexport type DownloadJson = CancellablePromise;\n// export type Download = DownloadBlob/* | DownloadJson */;\nexport type Download = DownloadBlob | DownloadUrl/* | DownloadJson */;\n\nexport type Progress = {done: number, fileName: string, total: number, offset: number};\nexport type ProgressCallback = (details: Progress) => void;\n\ntype DownloadType = 'url' | 'blob' | 'void' | 'disc';\n\nexport class AppDownloadManager {\n private downloads: {[fileName: string]: {main: Download} & {[type in DownloadType]?: Download}} = {};\n // private downloadsToDisc: {[fileName: string]: Download} = {};\n private progress: {[fileName: string]: Progress} = {};\n // private progressCallbacks: {[fileName: string]: Array} = {};\n private managers: AppManagers;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n rootScope.addEventListener('download_progress', (details) => {\n // const callbacks = this.progressCallbacks[details.fileName];\n // if(callbacks) {\n // callbacks.forEach((callback) => callback(details));\n // }\n\n const download = this.downloads[details.fileName];\n if(download?.main?.notifyAll) {\n this.progress[details.fileName] = details;\n download.main.notifyAll(details);\n }\n });\n }\n\n private getNewDeferred(fileName: string, type?: DownloadType) {\n const deferred = deferredPromise();\n\n let download = this.downloads[fileName];\n if(!download) {\n download = this.downloads[fileName] = {\n main: deferred as any\n };\n\n deferred.cancel = () => {\n const error = makeError('DOWNLOAD_CANCELED');\n\n this.managers.apiFileManager.cancelDownload(fileName);\n\n deferred.reject(error);\n deferred.cancel = noop;\n };\n\n deferred.catch(() => {\n this.clearDownload(fileName, type);\n }).finally(() => {\n delete this.progress[fileName];\n // delete this.progressCallbacks[fileName];\n });\n } else {\n const main = download.main;\n (['cancel', 'addNotifyListener', 'notify', 'notifyAll'] as (keyof CancellablePromise)[]).forEach((key) => {\n if(!main[key]) {\n return;\n }\n\n // @ts-ignore\n deferred[key] = main[key].bind(main);\n });\n }\n\n const haveToClear = type === 'disc';\n if(haveToClear) {\n deferred.catch(noop).finally(() => {\n this.clearDownload(fileName, type);\n });\n }\n\n return download[type] = deferred as any;\n }\n\n public getNewDeferredForUpload>(fileName: string, promise: T) {\n const deferred = this.getNewDeferred(fileName);\n promise.then(deferred.resolve, deferred.reject);\n\n deferred.finally(() => {\n this.clearDownload(fileName);\n });\n\n return deferred as CancellablePromise>;\n }\n\n private clearDownload(fileName: string, type?: DownloadType) {\n const downloads = this.downloads[fileName];\n if(!downloads) {\n return;\n }\n\n delete downloads[type];\n\n const length = Object.keys(downloads).length;\n if(!length || (downloads.main && length === 1)) {\n delete this.downloads[fileName];\n }\n }\n\n public getUpload(fileName: string): ReturnType['promise'] {\n let deferred: CancellablePromise = this.getDownload(fileName);\n if(deferred) {\n return deferred;\n }\n\n deferred = this.getNewDeferred(fileName);\n this.managers.appMessagesManager.getUploadPromise(fileName).then(deferred.resolve, deferred.reject);\n return deferred;\n }\n\n /* public fakeDownload(fileName: string, value: Blob | string) {\n const deferred = this.getNewDeferred(fileName);\n if(typeof(value) === 'string') {\n fetch(value)\n .then((response) => response.blob())\n .then((blob) => deferred.resolve(blob));\n } else {\n deferred.resolve(value);\n }\n\n return deferred;\n } */\n\n private d(fileName: string, getPromise: () => Promise, type?: DownloadType) {\n let deferred = this.getDownload(fileName, type);\n if(deferred) return deferred;\n\n deferred = this.getNewDeferred(fileName, type);\n getPromise().then(deferred.resolve, deferred.reject);\n return deferred;\n }\n\n public download(options: DownloadOptions): DownloadBlob {\n const fileName = getDownloadFileNameFromOptions(options);\n return this.d(fileName, () => this.managers.apiFileManager.download(options), 'blob') as any;\n }\n\n public downloadMedia(options: DownloadMediaOptions, type: DownloadType = 'blob', promiseBefore?: Promise): DownloadBlob {\n const {downloadOptions, fileName} = getDownloadMediaDetails(options);\n\n return this.d(fileName, () => {\n let cb: any;\n if(type === 'url') {\n cb = this.managers.apiFileManager.downloadMediaURL;\n } else if(type === 'void'/* || type === 'disc' */) {\n cb = this.managers.apiFileManager.downloadMediaVoid;\n } else /* if(type === 'blob') */ {\n cb = this.managers.apiFileManager.downloadMedia;\n }\n\n if(promiseBefore) {\n return promiseBefore.then(() => cb(options));\n }\n\n return cb(options);\n }, type) as any;\n }\n\n public downloadMediaURL(options: DownloadMediaOptions): DownloadUrl {\n return this.downloadMedia(options, 'url') as any;\n }\n\n public downloadMediaVoid(options: DownloadMediaOptions): DownloadBlob {\n return this.downloadMedia(options, 'void');\n }\n\n public upload(file: File | Blob, fileName?: string, promise?: Promise) {\n if(!fileName) {\n fileName = getFileNameForUpload(file);\n }\n\n if(!promise) {\n promise = this.managers.apiFileManager.upload({file, fileName});\n }\n\n const deferred = this.getNewDeferredForUpload(fileName, promise);\n return deferred as any as CancellablePromise;\n }\n\n public getDownload(fileName: string, type?: DownloadType) {\n const d = this.downloads[fileName];\n return d && d[type];\n }\n\n // public addProgressCallback(fileName: string, callback: ProgressCallback) {\n // const progress = this.progress[fileName];\n // (this.progressCallbacks[fileName] ?? (this.progressCallbacks[fileName] = [])).push(callback);\n\n // if(progress) {\n // callback(progress);\n // }\n // }\n\n public downloadToDisc(options: DownloadMediaOptions, justAttach?: boolean) {\n const media = options.media;\n const isDocument = media._ === 'document';\n if(!isDocument && !options.thumb) {\n options.thumb = (media as Photo.photo).sizes.slice().pop() as PhotoSize.photoSize;\n }\n\n // const {fileName: cacheFileName} = getDownloadMediaDetails(options);\n // if(justAttach) {\n // const promise = this.downloadsToDisc[cacheFileName];\n // if(promise) {\n // return promise;\n // }\n // }\n\n // const {downloadOptions, fileName} = getDownloadMediaDetails(options);\n // if(downloadOptions.size && downloadOptions.size > MAX_FILE_SAVE_SIZE) {\n const id = '' + (Math.random() * 0x7FFFFFFF | 0);\n // const id = 'test';\n const url = `download/${id}`;\n options.downloadId = id;\n\n const pingPromise = apiManagerProxy.pingServiceWorkerWithIframe();\n\n const promise = this.downloadMedia(options, 'disc', pingPromise);\n // this.downloadsToDisc[cacheFileName] = promise;\n\n if(justAttach) {\n return promise;\n }\n\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n\n pingPromise.then(() => {\n iframe.src = url;\n document.body.append(iframe);\n });\n\n // createDownloadAnchor(url, 'asd.txt');\n\n // const events = [\n // 'emptied',\n // 'abort',\n // 'suspend',\n // 'reset',\n // 'error',\n // 'ended',\n // 'load'\n // ].forEach((event) => {\n // iframe.addEventListener(event, () => alert(event));\n // iframe.contentWindow.addEventListener(event, () => alert(event));\n // });\n\n let element: HTMLElement, hadProgress = false;\n const onProgress = () => {\n if(hadProgress) {\n return;\n }\n\n hadProgress = true;\n element = iframe;\n\n indexOfAndSplice(promise.listeners, onProgress);\n };\n\n promise.addNotifyListener(onProgress);\n promise.then((blob) => {\n if(!blob) {\n return;\n }\n\n const url = URL.createObjectURL(blob);\n const downloadOptions = isDocument ?\n getDocumentDownloadOptions(media) :\n getPhotoDownloadOptions(media as any, options.thumb as PhotoSize.photoSize);\n const fileName = (options.media as MyDocument).file_name || getFileNameByLocation(downloadOptions.location);\n createDownloadAnchor(url, downloadOptions.fileName || fileName, () => {\n URL.revokeObjectURL(url);\n });\n }).catch(noop).finally(() => {\n if(!hadProgress) {\n onProgress();\n }\n\n setTimeout(() => {\n element?.remove();\n }, 1000);\n\n // if(this.downloadsToDisc[cacheFileName] === promise) {\n // delete this.downloadsToDisc[cacheFileName];\n // }\n });\n\n return promise;\n }\n}\n\nconst appDownloadManager = new AppDownloadManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appDownloadManager = appDownloadManager);\nexport default appDownloadManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function createDownloadAnchor(url: string, fileName: string, onRemove?: () => void) {\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName;\n a.target = '_blank';\n\n a.style.position = 'absolute';\n a.style.top = '1px';\n a.style.left = '1px';\n\n document.body.append(a);\n\n try {\n const clickEvent = document.createEvent('MouseEvents');\n clickEvent.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n a.dispatchEvent(clickEvent);\n } catch(e) {\n console.error('Download click error', e);\n try {\n a.click();\n } catch(e) {\n window.open(url as string, '_blank');\n }\n }\n\n setTimeout(() => {\n a.remove();\n onRemove && onRemove();\n }, 100);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../../lib/rootScope';\n// import { generatePathData } from \"../../helpers/dom\";\nimport {MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport type Chat from './chat';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport AvatarElement from '../avatar';\nimport {Message} from '../../layer';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport {SERVICE_AS_REGULAR, STICKY_OFFSET} from './bubbles';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport partition from '../../helpers/array/partition';\nimport noop from '../../helpers/noop';\nimport getMessageThreadId from '../../lib/appManagers/utils/messages/getMessageThreadId';\n\ntype GroupItem = {\n bubble: HTMLElement,\n fromId: PeerId,\n mid: number,\n groupMid?: number,\n timestamp: number,\n dateTimestamp: number,\n mounted: boolean,\n single: boolean,\n group?: BubbleGroup,\n message: Message.message | Message.messageService // use it only to set avatar\n};\n\nclass BubbleGroup {\n container: HTMLElement;\n chat: Chat;\n groups: BubbleGroups;\n items: GroupItem[]; // descend sorted\n avatarContainer: HTMLElement;\n avatarLoadPromise: ReturnType;\n avatar: AvatarElement;\n mounted: boolean;\n dateTimestamp: number;\n offset: number;\n\n constructor(chat: Chat, groups: BubbleGroups, dateTimestamp: number) {\n this.container = document.createElement('div');\n this.container.classList.add('bubbles-group');\n this.chat = chat;\n this.groups = groups;\n this.items = [];\n this.dateTimestamp = dateTimestamp;\n this.offset = 0;\n }\n\n createAvatar(message: Message.message | Message.messageService) {\n if(this.avatarLoadPromise) {\n return this.avatarLoadPromise;\n } else if(message._ === 'messageService') {\n return;\n }\n\n this.avatarContainer = document.createElement('div');\n this.avatarContainer.classList.add('bubbles-group-avatar-container');\n ++this.offset;\n\n const fwdFrom = message.fwd_from;\n const fwdFromId = message.fwdFromId;\n const isForwardFromChannel = message.from_id && message.from_id._ === 'peerChannel' && message.fromId === fwdFromId;\n const currentPeerId = this.chat.peerId;\n const avatar = this.avatar = new AvatarElement();\n this.avatar.classList.add('bubbles-group-avatar', 'user-avatar', 'avatar-40'/* , 'can-zoom-fade' */);\n const peerId = ((fwdFrom && (currentPeerId === rootScope.myId || currentPeerId === REPLIES_PEER_ID)) || isForwardFromChannel ? fwdFromId : message.fromId) || NULL_PEER_ID;\n const avatarLoadPromise = this.avatar.updateWithOptions({\n lazyLoadQueue: this.chat.bubbles.lazyLoadQueue,\n peerId,\n peerTitle: !fwdFromId && fwdFrom && fwdFrom.from_name ? /* '🔥 FF 🔥' */fwdFrom.from_name : undefined\n });\n\n // this.avatarLoadPromise = Promise.all([\n // avatarLoadPromise,\n // peerId && peerId.isUser() ? this.chat.managers.appUsersManager.getUser(peerId.toUserId()) : undefined\n // ]).then(([result, user]) => {\n // if(user?.pFlags?.premium) {\n // avatar.classList.add('is-premium', 'tgico-star');\n // }\n\n // return result;\n // });\n this.avatarLoadPromise = avatarLoadPromise;\n\n this.avatarContainer.append(this.avatar);\n this.container.append(this.avatarContainer);\n\n return this.avatarLoadPromise;\n }\n\n get firstTimestamp() {\n return this.firstItem.timestamp;\n }\n\n get firstMid() {\n return this.firstItem.mid;\n }\n\n get firstItem() {\n return this.items[this.items.length - 1];\n }\n\n get lastTimestamp() {\n return this.lastItem.timestamp;\n }\n\n get lastMid() {\n return this.lastItem.mid;\n }\n\n get lastItem() {\n return this.items[0];\n }\n\n updateClassNames() {\n const items = this.items;\n const length = items.length;\n if(!length) {\n return;\n }\n\n // const elements = Array.from(this.container.children);\n // if(this.offset) elements.splice(0, this.offset);\n\n // const length = elements.length;\n // if(!length) {\n // return;\n // }\n\n const first = items[length - 1].bubble;\n\n if(items.length === 1) {\n first.classList.add('is-group-first', 'is-group-last');\n // this.setClipIfNeeded(first);\n return;\n } else {\n first.classList.remove('is-group-last');\n first.classList.add('is-group-first');\n // this.setClipIfNeeded(first, true);\n }\n\n for(let i = 1, _length = length - 1; i < _length; ++i) {\n const bubble = items[i].bubble;\n bubble.classList.remove('is-group-last', 'is-group-first');\n // this.setClipIfNeeded(bubble, true);\n }\n\n const last = items[0].bubble;\n last.classList.remove('is-group-first');\n last.classList.add('is-group-last');\n // this.setClipIfNeeded(last);\n }\n\n insertItem(item: GroupItem) {\n const {items} = this;\n insertInDescendSortedArray(items, item, this.groups.sortGroupItemsKey);\n\n item.group = this;\n if(items.length === 1) {\n this.groups.insertGroup(this);\n }\n }\n\n removeItem(item: GroupItem) {\n indexOfAndSplice(this.items, item);\n\n if(!this.items.length) {\n indexOfAndSplice(this.groups.groups, this);\n }\n\n item.group = undefined;\n }\n\n mount(updateClassNames?: boolean) {\n if(!this.groups.groups.includes(this) || !this.items.length) { // group can be already removed\n debugger;\n\n if(this.mounted) {\n this.onItemUnmount();\n }\n\n return;\n }\n\n const {offset, items} = this;\n const {length} = items;\n forEachReverse(items, (item, idx) => {\n this.mountItem(item, length - 1 - idx, offset);\n });\n\n if(updateClassNames) {\n this.updateClassNames();\n }\n\n this.onItemMount();\n }\n\n mountItem(item: GroupItem, idx = this.items.indexOf(item), offset = this.offset) {\n if(item.mounted) {\n return;\n }\n\n positionElementByIndex(item.bubble, this.container, offset + idx);\n item.mounted = true;\n }\n\n unmountItem(item: GroupItem) {\n if(!item.mounted) {\n return;\n }\n\n item.bubble.remove();\n item.mounted = false;\n this.onItemUnmount();\n }\n\n onItemMount() {\n if(this.mounted) {\n return;\n }\n\n const dateContainer = this.chat.bubbles.getDateContainerByTimestamp(this.dateTimestamp / 1000);\n // const idx = this.groups.indexOf(group);\n const dateGroups = this.groups.groups.filter((_group) => _group.dateTimestamp === this.dateTimestamp);\n const dateGroupsLength = dateGroups.length;\n const idx = dateGroups.indexOf(this);\n const unmountedLength = dateGroups.slice(idx + 1).reduce((acc, v) => acc + (v.mounted ? 0 : 1), 0);\n positionElementByIndex(this.container, dateContainer.container, STICKY_OFFSET + dateGroupsLength - 1 - idx - unmountedLength);\n this.mounted = true;\n }\n\n onItemUnmount() {\n if(!this.mounted) {\n return;\n }\n\n if(!this.items.length) {\n this.container.remove();\n this.chat.bubbles.deleteEmptyDateGroups();\n this.mounted = false;\n } else {\n this.updateClassNames();\n }\n }\n}\n\n// class BubbleGroupItem implements GroupItem {\n// bubble: HTMLElement;\n// fromId: PeerId;\n// mid: number;\n// timestamp: number;\n// dateTimestamp: number;\n// mounted: boolean;\n// single: boolean;\n// group: BubbleGroup;\n\n// constructor(details: GroupItem) {\n// Object.assign(this, details);\n// }\n// }\n\nexport default class BubbleGroups {\n public itemsArr: Array = []; // descend sorted\n private itemsMap: Map = new Map();\n public groups: Array = []; // descend sorted\n private newGroupDiff = 121; // * 121 in scheduled messages\n private sortItemsKey: Extract;\n private sortGroupsKey: Extract;\n public sortGroupItemsKey: Extract;\n\n constructor(private chat: Chat) {\n this.sortItemsKey = chat.type === 'scheduled' ? 'timestamp' : 'mid';\n this.sortGroupsKey = chat.type === 'scheduled' ? 'lastTimestamp' : 'lastMid';\n this.sortGroupItemsKey = /* chat.type === 'scheduled' ? 'timestamp' : */'groupMid';\n }\n\n removeItem(item: GroupItem) {\n item.group?.removeItem(item);\n this.removeItemFromCache(item);\n }\n\n removeAndUnmountBubble(bubble: HTMLElement) {\n const item = this.getItemByBubble(bubble);\n if(!item) {\n if(bubble.parentElement) {\n bubble.remove(); // * can be a placeholder\n }\n\n return false;\n }\n\n const items = this.itemsArr;\n const index = items.indexOf(item);\n const siblings = this.getSiblingsAtIndex(index, items);\n\n const group = item.group;\n this.removeItem(item);\n\n const modifiedGroups: Set = new Set();\n if(group) {\n group.unmountItem(item);\n modifiedGroups.add(group);\n }\n\n const [previousSibling, nextSibling] = siblings;\n if(\n previousSibling &&\n nextSibling &&\n this.canItemsBeGrouped(previousSibling, nextSibling) &&\n previousSibling.group !== nextSibling.group\n ) {\n const group = nextSibling.group;\n this.f(nextSibling.group.items);\n group.onItemUnmount();\n modifiedGroups.add(previousSibling.group);\n this.groupUngrouped();\n }\n\n this.mountUnmountGroups(Array.from(modifiedGroups));\n\n return true;\n }\n\n mountUnmountGroups(groups: BubbleGroup[]) {\n // groups.sort((a, b) => (b.lastItem?.mid ?? 0) - (a.lastItem?.mid ?? 0));\n\n const [toMount, toUnmount] = partition(groups, (group) => !!group.items.length);\n toUnmount.forEach((group) => {\n group.onItemUnmount();\n })\n\n toMount.forEach((group) => {\n group.mount(true);\n });\n\n // toMount.forEach((group) => {\n // group.updateClassNames();\n // });\n }\n\n f(items: GroupItem[], index: number = 0, length = items.length) {\n for(; index < length; ++index) {\n const item = items[index];\n item.mounted = false;\n item.group.removeItem(item);\n --length;\n --index;\n }\n }\n\n getItemByBubble(bubble: HTMLElement) {\n return this.itemsMap.get(bubble);\n }\n\n getLastGroup() {\n return this.groups[0];\n }\n\n changeBubbleMid(bubble: HTMLElement, mid: number) {\n const item = this.getItemByBubble(bubble);\n if(!item) {\n return;\n }\n\n item.mid = mid;\n\n // indexOfAndSplice(item.group.items, item);\n // // const canChangeGroupMid = !item.group.items.length || item.group.items.every((item) => item.groupMid === item.mid);\n // // if(canChangeGroupMid) item.groupMid = mid;\n // item.group.insertItem(item);\n\n indexOfAndSplice(this.itemsArr, item);\n this.insertItemToArray(item, this.itemsArr);\n }\n\n changeItemBubble(item: GroupItem, bubble: HTMLElement) {\n this.itemsMap.delete(item.bubble);\n item.bubble = bubble;\n this.itemsMap.set(bubble, item);\n }\n\n changeBubbleByBubble(from: HTMLElement, to: HTMLElement) {\n const item = this.getItemByBubble(from);\n if(!item) {\n return;\n }\n\n this.changeItemBubble(item, to);\n }\n\n canItemsBeGrouped(item1: GroupItem, item2: GroupItem) {\n return item2.fromId === item1.fromId &&\n Math.abs(item2.timestamp - item1.timestamp) <= this.newGroupDiff &&\n item1.dateTimestamp === item2.dateTimestamp &&\n !item1.single &&\n !item2.single &&\n item1.message.pFlags.out === item2.message.pFlags.out &&\n (!this.chat.isAllMessagesForum || getMessageThreadId(item1.message, true) === getMessageThreadId(item2.message, true));\n }\n\n getSiblingsAtIndex(itemIndex: number, items: GroupItem[]) {\n return [items[itemIndex - 1], items[itemIndex + 1]] as const;\n }\n\n // findGroupSiblingInSiblings(item: GroupItem, siblings: ReturnType) {\n // return siblings.find((sibling) => sibling && this.canItemsBeGrouped(item, sibling));\n // }\n\n findGroupSiblingByItem(item: GroupItem, items: GroupItem[]) {\n items = items.slice();\n const idx = this.insertItemToArray(item, items);\n // return this.findGroupSiblingInSiblings(item, this.getSiblingsAtIndex(idx, items));\n return this.findGroupSiblingInItems(item, items, idx);\n }\n\n findGroupSiblingInItems(item: GroupItem, items: GroupItem[], index = items.indexOf(item), length = items.length) {\n const previousItem = items[index - 1];\n let siblingGroupedItem: GroupItem;\n if(previousItem?.group && this.canItemsBeGrouped(item, previousItem)) {\n siblingGroupedItem = previousItem;\n } else {\n for(let k = index + 1; k < length; ++k) {\n const nextItem = items[k];\n if(this.canItemsBeGrouped(item, nextItem)) {\n if(nextItem.group) {\n siblingGroupedItem = nextItem;\n }\n } else {\n break;\n }\n }\n }\n\n return siblingGroupedItem;\n }\n\n addItemToGroup(item: GroupItem, group: BubbleGroup) {\n group.insertItem(item);\n this.addItemToCache(item);\n }\n\n insertItemToArray(item: GroupItem, array: GroupItem[]) {\n return insertInDescendSortedArray(array, item, this.sortItemsKey);\n }\n\n insertGroup(group: BubbleGroup) {\n return insertInDescendSortedArray(this.groups, group, this.sortGroupsKey);\n }\n\n addItemToCache(item: GroupItem) {\n this.insertItemToArray(item, this.itemsArr);\n this.itemsMap.set(item.bubble, item);\n }\n\n removeItemFromCache(item: GroupItem) {\n indexOfAndSplice(this.itemsArr, item);\n this.itemsMap.delete(item.bubble);\n }\n\n getMessageFromId(message: MyMessage) {\n let fromId = message.viaBotId || message.fromId;\n\n // fix for saved messages forward to self\n if(fromId === rootScope.myId && message.peerId === rootScope.myId && (message as Message.message).fwdFromId === fromId) {\n fromId = fromId.toPeerId(true);\n }\n\n return fromId;\n }\n\n createItem(bubble: HTMLElement, message: MyMessage) {\n const single = !(message._ === 'message' || (message.action && SERVICE_AS_REGULAR.has(message.action._)));\n const {mid, date: timestamp} = message;\n const {dateTimestamp} = this.chat.bubbles.getDateForDateContainer(timestamp);\n const item: GroupItem = {\n mid,\n groupMid: this.chat.type === 'scheduled' ? +`${(timestamp * 1000 - dateTimestamp) / 1000}.${mid}` : mid,\n fromId: this.getMessageFromId(message),\n bubble,\n // timestamp: this.chat.type === 'scheduled' ? +`${(timestamp * 1000 - dateTimestamp) / 1000}.${mid}` : timestamp,\n timestamp,\n dateTimestamp,\n mounted: false,\n single,\n message\n };\n\n return item;\n }\n\n splitSiblingsOnGrouping(siblings: ReturnType) {\n const [previousSibling, nextSibling] = siblings;\n const previousGroup = previousSibling?.group;\n const nextGroup = nextSibling?.group;\n\n if(!previousGroup) {\n return;\n }\n\n // will refresh group\n // if(previousGroup === nextGroup) {\n const items = previousGroup.items;\n const index = items.indexOf(previousSibling) + 1;\n const length = items.length;\n if(index === length) {\n return;\n }\n\n const modifiedGroups: BubbleGroup[] = [previousGroup];\n // if(previousGroup !== nextGroup && nextGroup) {\n // modifiedGroups.push(nextGroup);\n // }\n\n this.f(items, index, length);\n return modifiedGroups;\n // }\n }\n\n prepareForGrouping(bubble: HTMLElement, message: MyMessage) {\n const foundItem = this.getItemByBubble(bubble);\n if(foundItem) { // should happen only on edit\n // debugger;\n return;\n }\n\n const item = this.createItem(bubble, message);\n this.addItemToCache(item);\n }\n\n groupUngrouped() {\n const items = this.itemsArr;\n const length = items.length;\n const modifiedGroups: Set = new Set();\n // for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const item = items[i];\n if(item.group) {\n continue;\n }\n\n let hadGroup = true;\n const siblings = this.getSiblingsAtIndex(i, items);\n const siblingGroupedItem = this.findGroupSiblingInItems(item, items, i, length);\n\n // const foundItem = this.findGroupSiblingInSiblings(item, siblings);\n const foundItem = siblingGroupedItem;\n const group = foundItem?.group ?? (hadGroup = false, new BubbleGroup(this.chat, this, item.dateTimestamp));\n\n modifiedGroups.add(group);\n group.insertItem(item);\n\n if(!hadGroup) {\n const splittedGroups = this.splitSiblingsOnGrouping(siblings);\n if(splittedGroups) {\n splittedGroups.forEach((group) => modifiedGroups.add(group));\n }\n }\n }\n\n return modifiedGroups;\n }\n\n // addBubble(bubble: HTMLElement, message: MyMessage, unmountIfFound?: boolean) {\n // const oldItem = this.getItemByBubble(bubble);\n // if(unmountIfFound) { // updating position\n // this.removeAndUnmountBubble(bubble);\n // } else if(oldItem) { // editing\n // const group = oldItem.group;\n // this.changeItemBubble(oldItem, bubble);\n // oldItem.mounted = false;\n\n // return {item: oldItem, group};\n // }\n\n // const item = this.createItem(bubble, message);\n\n // const foundItem = this.findSameGroupItem(item, this.itemsArr);\n\n // const group = foundItem?.group ?? new BubbleGroup(this.chat, this, item.dateTimestamp);\n // this.addItemToGroup(item, group);\n\n // return {item, group};\n // }\n\n /* setClipIfNeeded(bubble: HTMLDivElement, remove = false) {\n //console.log('setClipIfNeeded', bubble, remove);\n const className = bubble.className;\n if(className.includes('is-message-empty') && (className.includes('photo') || className.includes('video'))) {\n let container = bubble.querySelector('.bubble__media-container') as SVGSVGElement;\n //console.log('setClipIfNeeded', bubble, remove, container);\n if(!container) return;\n\n try {\n Array.from(container.children).forEach((object) => {\n if(object instanceof SVGDefsElement) return;\n\n if(remove) {\n object.removeAttributeNS(null, 'clip-path');\n } else {\n let clipId = container.dataset.clipId;\n let path = container.firstElementChild.firstElementChild.lastElementChild as SVGPathElement;\n let width = +object.getAttributeNS(null, 'width');\n let height = +object.getAttributeNS(null, 'height');\n let isOut = className.includes('is-out');\n let isReply = className.includes('is-reply');\n let d = '';\n\n //console.log('setClipIfNeeded', object, width, height, isOut);\n\n let tr: number, tl: number;\n if(className.includes('forwarded') || isReply) {\n tr = tl = 0;\n } else if(isOut) {\n tr = className.includes('is-group-first') ? 12 : 6;\n tl = 12;\n } else {\n tr = 12;\n tl = className.includes('is-group-first') ? 12 : 6;\n }\n\n if(isOut) {\n d = generatePathData(0, 0, width - 9, height, tl, tr, 0, 12);\n } else {\n d = generatePathData(9, 0, width - 9, height, tl, tr, 12, 0);\n }\n\n path.setAttributeNS(null, 'd', d);\n object.setAttributeNS(null, 'clip-path', 'url(#' + clipId + ')');\n }\n });\n } catch(err) {}\n }\n } */\n\n // updateGroupByMessageId(mid: number) {\n // const item = this.itemsArr.find((g) => g.mid === mid);\n // if(item) {\n // item.group.updateGroup();\n // }\n // }\n\n cleanup() {\n this.itemsArr = [];\n this.groups = [];\n this.itemsMap.clear();\n }\n\n // findIncorrentPositions() {\n // var bubbles = Array.from(this.chat.bubbles.chatInner.querySelectorAll('.bubbles-group .bubble')).reverse();\n // var items = this.itemsArr;\n // for(var i = 0, length = items.length; i < length; ++i) {\n // const item = items[i];\n // const foundBubble = bubbles[i];\n // if(item.bubble !== foundBubble) {\n // console.log('incorrect position', i, item, foundBubble);\n // // debugger;\n // // break;\n // }\n // }\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function partition(arr: T[], callback: (item: T, idx: number, arr: T[]) => boolean) {\n const good: T[] = [], bad: T[] = [];\n for(let i = 0, length = arr.length; i < length; ++i) {\n const item = arr[i];\n (callback(item, i, arr) ? good : bad).push(item);\n }\n\n return [good, bad];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement, {PopupOptions} from '.';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport I18n, {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\nimport InputField from '../inputField';\n\nexport default class PopupDatePicker extends PopupElement {\n protected controlsDiv: HTMLElement;\n protected monthTitle: HTMLElement;\n protected prevBtn: HTMLElement;\n protected nextBtn: HTMLElement;\n\n protected monthsContainer: HTMLElement;\n protected month: HTMLElement;\n\n protected minMonth: Date;\n protected maxMonth: Date;\n protected minDate: Date;\n protected maxDate: Date;\n protected selectedDate: Date;\n protected selectedMonth: Date;\n protected selectedEl: HTMLElement;\n\n protected timeDiv: HTMLDivElement;\n protected hoursInputField: InputField;\n protected minutesInputField: InputField;\n\n constructor(initDate: Date, public onPick: (timestamp: number) => void, protected options: Partial<{\n noButtons: true,\n noTitle: true,\n minDate: Date,\n maxDate: Date\n withTime: true,\n showOverflowMonths: true\n }> & PopupOptions = {}) {\n super('popup-date-picker', {\n body: true,\n overlayClosable: true,\n buttons: options.noButtons ? [] : [{\n langKey: 'JumpToDate',\n callback: () => {\n if(this.onPick) {\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\n }\n }\n }, {\n langKey: 'Cancel',\n isCancel: true\n }],\n title: true,\n ...options\n });\n\n this.minDate = options.minDate || new Date('2013-08-01T00:00:00');\n\n if(initDate < this.minDate) {\n initDate.setFullYear(this.minDate.getFullYear(), this.minDate.getMonth(), this.minDate.getDate());\n }\n\n // Controls\n this.controlsDiv = document.createElement('div');\n this.controlsDiv.classList.add('date-picker-controls');\n\n this.prevBtn = document.createElement('button');\n this.prevBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-prev');\n attachClickEvent(this.prevBtn, this.onPrevClick, {listenerSetter: this.listenerSetter});\n\n this.nextBtn = document.createElement('button');\n this.nextBtn.classList.add('btn-icon', 'tgico-down', 'date-picker-next');\n attachClickEvent(this.nextBtn, this.onNextClick, {listenerSetter: this.listenerSetter});\n\n this.monthTitle = document.createElement('div');\n this.monthTitle.classList.add('date-picker-month-title');\n\n this.controlsDiv.append(this.prevBtn, this.monthTitle, this.nextBtn);\n\n // Month\n this.monthsContainer = document.createElement('div');\n this.monthsContainer.classList.add('date-picker-months');\n attachClickEvent(this.monthsContainer, this.onDateClick, {listenerSetter: this.listenerSetter});\n\n this.body.append(this.controlsDiv, this.monthsContainer);\n\n // Time inputs\n if(options.withTime) {\n this.timeDiv = document.createElement('div');\n this.timeDiv.classList.add('date-picker-time');\n\n const delimiter = document.createElement('div');\n delimiter.classList.add('date-picker-time-delimiter');\n delimiter.append(':');\n\n const handleTimeInput = (max: number, inputField: InputField, onInput: (length: number) => void, onOverflow?: (number: number) => void) => {\n const maxString = '' + max;\n this.listenerSetter.add(inputField.input)('input', (e) => {\n let value = inputField.value.replace(/\\D/g, '');\n if(value.length > 2) {\n value = value.slice(0, 2);\n } else {\n if((value.length === 1 && +value[0] > +maxString[0]) || (value.length === 2 && +value > max)) {\n if(value.length === 2 && onOverflow) {\n onOverflow(+value[1]);\n }\n\n value = '0' + value[0];\n }\n }\n\n inputField.setValueSilently(value);\n onInput(value.length);\n });\n };\n\n this.hoursInputField = new InputField({plainText: true});\n this.minutesInputField = new InputField({plainText: true});\n\n handleTimeInput(23, this.hoursInputField, (length) => {\n if(length === 2) {\n this.minutesInputField.input.focus();\n }\n\n this.setTimeTitle();\n }, (number) => {\n this.minutesInputField.value = (number + this.minutesInputField.value).slice(0, 2);\n });\n handleTimeInput(59, this.minutesInputField, (length) => {\n if(!length) {\n this.hoursInputField.input.focus();\n }\n\n this.setTimeTitle();\n });\n\n this.selectedDate = initDate;\n\n initDate.setMinutes(initDate.getMinutes() + 10);\n\n this.hoursInputField.setValueSilently(('0' + initDate.getHours()).slice(-2));\n this.minutesInputField.setValueSilently(('0' + initDate.getMinutes()).slice(-2));\n\n initDate.setHours(0, 0, 0, 0);\n\n this.timeDiv.append(this.hoursInputField.container, delimiter, this.minutesInputField.container);\n\n attachClickEvent(this.btnConfirm, () => {\n if(this.onPick) {\n this.selectedDate.setHours(+this.hoursInputField.value || 0, +this.minutesInputField.value || 0, 0, 0);\n this.onPick(this.selectedDate.getTime() / 1000 | 0);\n }\n\n this.hide();\n }, {listenerSetter: this.listenerSetter});\n\n this.body.append(this.timeDiv);\n\n this.prevBtn.classList.add('primary');\n this.nextBtn.classList.add('primary');\n }\n\n const popupCenterer = document.createElement('div');\n popupCenterer.classList.add('popup-centerer');\n popupCenterer.append(this.container);\n this.element.append(popupCenterer);\n\n // const passed = (initDate.getTime() - (initDate.getTimezoneOffset() * 60000)) % 86400000;\n // this.selectedDate = this.maxDate = new Date(initDate.getTime() - passed);\n initDate.setHours(0, 0, 0, 0);\n this.selectedDate = initDate;\n\n this.maxDate = options.maxDate || new Date();\n this.maxDate.setHours(0, 0, 0, 0);\n\n this.selectedMonth = new Date(this.selectedDate);\n this.selectedMonth.setDate(1);\n\n this.maxMonth = new Date(this.maxDate);\n this.maxMonth.setDate(1);\n\n this.minMonth = new Date(this.minDate);\n this.minMonth.setHours(0, 0, 0, 0);\n this.minMonth.setDate(1);\n\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\n this.prevBtn.setAttribute('disabled', 'true');\n }\n\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\n this.nextBtn.setAttribute('disabled', 'true');\n }\n\n if(options.noTitle) {\n this.setTitle = () => {};\n }\n\n this.setTimeTitle();\n this.setTitle();\n this.setMonth();\n }\n\n onPrevClick = (e: MouseEvent) => {\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() - 1);\n this.setMonth();\n\n if(this.selectedMonth.getTime() === this.minMonth.getTime()) {\n this.prevBtn.setAttribute('disabled', 'true');\n }\n\n this.nextBtn.removeAttribute('disabled');\n };\n\n onNextClick = (e: MouseEvent) => {\n this.selectedMonth.setMonth(this.selectedMonth.getMonth() + 1);\n this.setMonth();\n\n if(this.selectedMonth.getTime() === this.maxMonth.getTime()) {\n this.nextBtn.setAttribute('disabled', 'true');\n }\n\n this.prevBtn.removeAttribute('disabled');\n };\n\n onDateClick = (e: MouseEvent) => {\n // cancelEvent(e);\n const target = e.target as HTMLElement;\n\n if(!target.dataset.timestamp) return;\n\n if(this.selectedEl) {\n if(this.selectedEl === target) return;\n this.selectedEl.classList.remove('active');\n }\n\n this.selectedEl = target;\n\n target.classList.add('active');\n const timestamp = +target.dataset.timestamp;\n\n this.selectedDate = new Date(timestamp);\n\n this.setTitle();\n this.setTimeTitle();\n };\n\n public setTimeTitle() {\n if(this.btnConfirm && this.selectedDate) {\n let key: LangPackKey;\n const args: FormatterArguments = [];\n const date = new Date();\n date.setHours(0, 0, 0, 0);\n\n const timeOptions: Intl.DateTimeFormatOptions = {\n minute: '2-digit',\n hour: '2-digit'\n };\n\n const sendDate = new Date(this.selectedDate.getTime());\n sendDate.setHours(+this.hoursInputField.value, +this.minutesInputField.value);\n\n if(this.selectedDate.getTime() === date.getTime()) {\n key = 'Schedule.SendToday';\n }/* else if(this.selectedDate.getTime() === (date.getTime() + 86400e3)) {\n dayStr = 'Tomorrow';\n } */ else {\n key = 'Schedule.SendDate';\n\n const dateOptions: Intl.DateTimeFormatOptions = {\n month: 'short',\n day: 'numeric'\n };\n\n if(sendDate.getFullYear() !== date.getFullYear()) {\n dateOptions.year = 'numeric';\n }\n\n args.push(new I18n.IntlDateElement({\n date: sendDate,\n options: dateOptions\n }).element);\n }\n\n args.push(new I18n.IntlDateElement({\n date: sendDate,\n options: timeOptions\n }).element);\n\n this.btnConfirm.firstChild.replaceWith(i18n(key, args));\n }\n }\n\n public setTitle() {\n // const splitted = this.selectedDate.toString().split(' ', 3);\n // this.title.innerText = splitted[0] + ', ' + splitted[1] + ' ' + splitted[2];\n this.title.textContent = '';\n this.title.append(new I18n.IntlDateElement({\n date: this.selectedDate,\n options: {\n day: 'numeric',\n month: 'long',\n weekday: 'short'\n }\n }).element);\n }\n\n private renderElement(disabled: boolean, innerText: string | HTMLElement = '') {\n const el = document.createElement('button');\n el.classList.add('btn-icon', 'date-picker-month-date');\n\n if(disabled) {\n el.setAttribute('disabled', 'true');\n }\n\n if(innerText) {\n el.append(innerText);\n }\n\n return el;\n }\n\n public setMonth() {\n const firstDate = new Date(this.selectedMonth);\n\n const options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: this.timeDiv && mediaSizes.isMobile ? 'short' : 'long'\n };\n\n this.monthTitle.textContent = '';\n this.monthTitle.append(new I18n.IntlDateElement({date: firstDate, options}).element);\n // this.monthTitle.innerText = (this.timeDiv && mediaSizes.isMobile ? monthName.slice(0, 3) : monthName) + ' ' + this.selectedMonth.getFullYear();\n\n if(this.month) {\n this.month.remove();\n }\n\n this.month = document.createElement('div');\n this.month.classList.add('date-picker-month');\n\n const weekStartDate = new Date();\n const day = weekStartDate.getDay();\n if(day !== 1) {\n weekStartDate.setHours(-24 * (day - 1));\n }\n\n for(let i = 0; i < 7; ++i) {\n const el = this.renderElement(true, new I18n.IntlDateElement({date: weekStartDate, options: {weekday: 'narrow'}}).element);\n el.classList.remove('date-picker-month-date');\n el.classList.add('date-picker-month-day');\n this.month.append(el);\n weekStartDate.setDate(weekStartDate.getDate() + 1);\n }\n\n // 0 - sunday\n let dayIndex = firstDate.getDay() - 1;\n if(dayIndex === -1) dayIndex = 7 - 1;\n\n const clonedDate = new Date(firstDate.getTime());\n clonedDate.setDate(clonedDate.getDate() - dayIndex - 1);\n\n // Padding first week\n for(let i = 0; i < dayIndex; ++i) {\n if(this.options.showOverflowMonths) {\n clonedDate.setDate(clonedDate.getDate() + 1);\n this.month.append(this.renderElement(true, '' + clonedDate.getDate()));\n } else {\n this.month.append(this.renderElement(true));\n }\n }\n\n do {\n const date = firstDate.getDate();\n const el = this.renderElement(firstDate > this.maxDate || firstDate < this.minDate, '' + date);\n el.dataset.timestamp = '' + firstDate.getTime();\n\n if(firstDate.getTime() === this.selectedDate.getTime()) {\n this.selectedEl = el;\n el.classList.add('active');\n }\n\n this.month.append(el);\n\n firstDate.setDate(date + 1);\n } while(firstDate.getDate() !== 1);\n\n const remainder = this.month.childElementCount % 7;\n if(this.options.showOverflowMonths && remainder) {\n for(let i = remainder; i < 7; ++i) {\n this.month.append(this.renderElement(true, '' + firstDate.getDate()));\n firstDate.setDate(firstDate.getDate() + 1);\n }\n }\n\n const lines = Math.ceil(this.month.childElementCount / 7);\n this.container.dataset.lines = '' + lines;\n\n this.monthsContainer.append(this.month);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {setDirection} from '../helpers/dom/setInnerHTML';\n\nexport default class DivAndCaption {\n public container: HTMLElement;\n public border: HTMLElement;\n public content: HTMLElement;\n public title: HTMLElement;\n public subtitle: HTMLElement;\n\n constructor(protected className: string, public fill?: T) {\n this.container = document.createElement('div');\n this.container.className = className;\n\n this.border = document.createElement('div');\n this.border.classList.add(className + '-border');\n\n this.content = document.createElement('div');\n this.content.classList.add(className + '-content');\n\n this.title = document.createElement('div');\n this.title.classList.add(className + '-title');\n setDirection(this.title);\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add(className + '-subtitle');\n setDirection(this.subtitle);\n\n this.content.append(this.title, this.subtitle);\n this.container.append(this.border, this.content);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {Middleware} from '../../helpers/middleware';\nimport limitSymbols from '../../helpers/string/limitSymbols';\nimport {Document, Message, MessageMedia, Photo, WebPage} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport DivAndCaption from '../divAndCaption';\nimport wrapMessageForReply from '../wrappers/messageForReply';\nimport wrapPhoto from '../wrappers/photo';\nimport wrapSticker from '../wrappers/sticker';\nimport wrapVideo from '../wrappers/video';\nimport {AnimationItemGroup} from '../animationIntersector';\n\nconst MEDIA_SIZE = 32;\n\nexport async function wrapReplyDivAndCaption(options: {\n title: string | HTMLElement | DocumentFragment,\n titleEl: HTMLElement,\n subtitle: string | HTMLElement | DocumentFragment,\n subtitleEl: HTMLElement,\n message: Message.message | Message.messageService,\n mediaEl: HTMLElement,\n loadPromises?: Promise[],\n animationGroup: AnimationItemGroup\n}) {\n let {title, titleEl, subtitle, subtitleEl, mediaEl, message, loadPromises, animationGroup} = options;\n if(title !== undefined) {\n if(typeof(title) === 'string') {\n title = limitSymbols(title, 140);\n title = wrapEmojiText(title);\n }\n\n replaceContent(titleEl, title);\n }\n\n if(!loadPromises) {\n loadPromises = [];\n }\n\n let messageMedia: MessageMedia | WebPage.webPage = (message as Message.message)?.media;\n let setMedia = false, isRound = false;\n const mediaChildren = mediaEl ? Array.from(mediaEl.children).slice() : [];\n let middleware: Middleware;\n if(messageMedia && mediaEl) {\n subtitleEl.textContent = '';\n subtitleEl.append(await wrapMessageForReply({message, animationGroup, withoutMediaType: true}));\n\n messageMedia = (messageMedia as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || messageMedia;\n const photo = (messageMedia as MessageMedia.messageMediaPhoto).photo as Photo.photo;\n const document = (messageMedia as MessageMedia.messageMediaDocument).document as Document.document;\n if(photo || (document && document.thumbs?.length)/* ['video', 'sticker', 'gif', 'round', 'photo', 'audio'].indexOf(document.type) !== -1) */) {\n middleware = appImManager.chat.bubbles.getMiddleware();\n const lazyLoadQueue = appImManager.chat.bubbles.lazyLoadQueue;\n\n if(document?.type === 'sticker') {\n await wrapSticker({\n doc: document,\n div: mediaEl,\n lazyLoadQueue,\n group: animationGroup,\n // onlyThumb: document.sticker === 2,\n width: MEDIA_SIZE,\n height: MEDIA_SIZE,\n middleware,\n loadPromises\n });\n setMedia = true;\n } else if(document?.type === 'gif' && document.video_thumbs) {\n setMedia = true;\n await wrapVideo({\n doc: document,\n container: mediaEl,\n boxWidth: MEDIA_SIZE,\n boxHeight: MEDIA_SIZE,\n lazyLoadQueue,\n noPlayButton: true,\n noInfo: true,\n middleware,\n loadPromises,\n withoutPreloader: true,\n videoSize: document.video_thumbs[0],\n group: animationGroup\n });\n } else {\n const m = photo || document;\n isRound = document?.type === 'round';\n\n try {\n await wrapPhoto({\n photo: m,\n container: mediaEl,\n boxWidth: MEDIA_SIZE,\n boxHeight: MEDIA_SIZE,\n size: choosePhotoSize(m, MEDIA_SIZE, MEDIA_SIZE),\n middleware,\n lazyLoadQueue,\n noBlur: true,\n withoutPreloader: true,\n loadPromises\n });\n setMedia = true;\n } catch(err) {\n\n }\n }\n }\n } else {\n if(message) {\n subtitleEl.textContent = '';\n subtitleEl.append(await wrapMessageForReply({message}));\n } else {\n if(typeof(subtitle) === 'string') {\n subtitle = limitSymbols(subtitle, 140);\n subtitle = wrapEmojiText(subtitle);\n }\n\n replaceContent(subtitleEl, subtitle || '');\n }\n }\n\n Promise.all(loadPromises).then(() => {\n if(middleware && !middleware()) return;\n mediaChildren.forEach((child) => child.remove());\n\n if(mediaEl) {\n mediaEl.classList.toggle('is-round', isRound);\n }\n });\n\n return setMedia;\n}\n\nexport default class ReplyContainer extends DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => Promise> {\n private mediaEl: HTMLElement;\n\n constructor(protected className: string, protected animationGroup: AnimationItemGroup) {\n super(className, async(title, subtitle = '', message?) => {\n if(!this.mediaEl) {\n this.mediaEl = document.createElement('div');\n this.mediaEl.classList.add(this.className + '-media');\n }\n\n const isMediaSet = await wrapReplyDivAndCaption({\n title,\n titleEl: this.title,\n subtitle,\n subtitleEl: this.subtitle,\n mediaEl: this.mediaEl,\n message,\n animationGroup\n });\n\n this.container.classList.toggle('is-media', isMediaSet);\n if(isMediaSet) {\n this.content.prepend(this.mediaEl);\n } else {\n this.mediaEl.remove();\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {hexToRgb} from '../../helpers/color';\nimport {Message} from '../../layer';\nimport getPeerColorById from '../../lib/appManagers/utils/peers/getPeerColorById';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport ReplyContainer from '../chat/replyContainer';\n\nexport default function wrapReply(\n title: Parameters[0],\n subtitle: Parameters[1],\n animationGroup: AnimationItemGroup,\n message?: Message.message | Message.messageService,\n setColorPeerId?: PeerId\n) {\n const replyContainer = new ReplyContainer('reply', animationGroup);\n const fillPromise = replyContainer.fill(title, subtitle, message);\n\n if(setColorPeerId) {\n const hex = getPeerColorById(setColorPeerId, false);\n const [r, g, b] = hexToRgb(hex);\n replyContainer.container.style.setProperty('--override-color', `${r}, ${g}, ${b}`);\n replyContainer.container.classList.add('is-overriding-color');\n // replyContainer.border.style.backgroundColor = hex;\n // replyContainer.title.style.color = hex;\n }\n\n return {container: replyContainer.container, fillPromise};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AvatarElement from './avatar';\nimport type LazyLoadQueue from './lazyLoadQueue';\n\nconst CLASS_NAME = 'stacked-avatars';\nconst AVATAR_CLASS_NAME = CLASS_NAME + '-avatar';\nconst AVATAR_CONTAINER_CLASS_NAME = AVATAR_CLASS_NAME + '-container';\n\nexport default class StackedAvatars {\n public container: HTMLElement;\n private lazyLoadQueue: LazyLoadQueue;\n private avatarSize: number;\n\n constructor(options: {\n lazyLoadQueue?: StackedAvatars['lazyLoadQueue'],\n avatarSize: StackedAvatars['avatarSize']\n }) {\n this.lazyLoadQueue = options.lazyLoadQueue;\n this.avatarSize = options.avatarSize;\n\n this.container = document.createElement('div');\n this.container.classList.add(CLASS_NAME);\n\n this.container.style.setProperty('--avatar-size', options.avatarSize + 'px');\n }\n /**\n * MACOS, ANDROID - без реверса\n * WINDOWS DESKTOP - реверс\n * все приложения накладывают аватарку первую на вторую, а в макете зато вторая на первую, ЛОЛ!\n */\n public render(peerIds: PeerId[], loadPromises?: Promise[]) {\n const children = this.container.children;\n peerIds = peerIds.slice().reverse();\n if(peerIds.length > 3) {\n peerIds = peerIds.slice(-3);\n }\n\n peerIds.forEach((peerId, idx) => {\n let avatarContainer = children[idx] as HTMLElement;\n if(!avatarContainer) {\n avatarContainer = document.createElement('div');\n avatarContainer.classList.add(AVATAR_CONTAINER_CLASS_NAME);\n }\n\n let avatarElem = avatarContainer.firstElementChild as AvatarElement;\n if(!avatarElem) {\n avatarElem = new AvatarElement();\n avatarElem.classList.add('avatar-' + this.avatarSize, AVATAR_CLASS_NAME);\n avatarElem.updateOptions({\n isDialog: false,\n loadPromises\n });\n }\n\n avatarElem.updateWithOptions({\n lazyLoadQueue: this.lazyLoadQueue,\n peerId: peerId\n });\n\n if(!avatarElem.parentNode) {\n avatarContainer.append(avatarElem);\n }\n\n if(!avatarContainer.parentNode) {\n this.container.append(avatarContainer);\n }\n });\n\n // if were 3 and became 2\n (Array.from(children) as HTMLElement[]).slice(peerIds.length).forEach((el) => el.remove());\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message} from '../../layer';\nimport rootScope from '../../lib/rootScope';\nimport ripple from '../ripple';\nimport I18n from '../../lib/langPack';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport StackedAvatars from '../stackedAvatars';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport type LazyLoadQueue from '../lazyLoadQueue';\n\nconst TAG_NAME = 'replies-element';\n\nrootScope.addEventListener('replies_updated', (message) => {\n (Array.from(document.querySelectorAll(TAG_NAME + `[data-post-key=\"${message.peerId}_${message.mid}\"]`)) as RepliesElement[]).forEach((element) => {\n element.message = message;\n element.render();\n });\n});\n\nexport default class RepliesElement extends HTMLElement {\n public message: Message.message;\n public type: 'footer' | 'beside';\n public loadPromises: Promise[];\n public lazyLoadQueue: LazyLoadQueue;\n public stackedAvatars: StackedAvatars;\n public text: I18n.IntlElement;\n public managers: AppManagers;\n\n private updated = false;\n\n constructor() {\n super();\n this.managers = rootScope.managers;\n }\n\n public init() {\n this.render();\n this.dataset.postKey = this.message.peerId + '_' + this.message.mid;\n this.classList.add('replies', 'replies-' + this.type);\n }\n\n public render() {\n const replies = this.message.replies;\n\n /* if(this.firstChild) {\n this.innerHTML = '';\n } */\n\n if(this.type === 'footer') {\n let leftPart: HTMLElement;\n if(this.firstElementChild) {\n leftPart = this.firstElementChild as HTMLElement;\n }\n\n if(replies?.recent_repliers) {\n if(leftPart && !leftPart.classList.contains('replies-footer-avatars')) {\n this.innerHTML = '';\n leftPart = null;\n }\n\n if(!this.stackedAvatars) {\n this.stackedAvatars = new StackedAvatars({\n lazyLoadQueue: this.lazyLoadQueue,\n avatarSize: 30\n });\n\n this.stackedAvatars.container.classList.add('replies-footer-avatars');\n }\n\n leftPart = this.stackedAvatars.container;\n\n this.stackedAvatars.render(replies.recent_repliers.map((peer) => getPeerId(peer)), this.loadPromises);\n } else {\n if(leftPart && !leftPart.classList.contains('tgico-comments')) {\n leftPart.remove();\n leftPart = null;\n }\n\n if(!leftPart) {\n leftPart = document.createElement('span');\n leftPart.classList.add('tgico-comments');\n }\n }\n\n if(!leftPart.parentElement) {\n this.prepend(leftPart);\n }\n\n if(!this.text) {\n this.text = new I18n.IntlElement();\n }\n\n const text = this.text;\n if(replies) {\n if(replies.replies) {\n text.compareAndUpdate({key: 'Comments', args: [replies.replies]});\n } else {\n text.compareAndUpdate({key: 'LeaveAComment'});\n }\n } else {\n text.compareAndUpdate({key: 'ViewInChat'});\n }\n\n if(replies) {\n // const historyStorage = appMessagesManager.getHistoryStorage(replies.channel_id.toPeerId(true));\n let isUnread = false;\n if(replies.replies) {\n if(replies.read_max_id !== undefined && replies.max_id !== undefined) {\n isUnread = replies.read_max_id < replies.max_id;\n }/* else {\n isUnread = !historyStorage.readMaxId || historyStorage.readMaxId < (replies.max_id || 0);\n } */\n }\n this.classList.toggle('is-unread', isUnread);\n }\n\n let textSpan = this.children[1] as HTMLElement;\n if(!textSpan) {\n textSpan = document.createElement('span');\n textSpan.classList.add('replies-footer-text');\n\n const iconSpan = document.createElement('span');\n iconSpan.classList.add('tgico-next');\n\n const rippleContainer = document.createElement('div');\n ripple(rippleContainer);\n\n this.append(textSpan, iconSpan, rippleContainer);\n }\n\n replaceContent(textSpan, text.element);\n } else {\n this.classList.add('bubble-beside-button');\n this.innerHTML = `${replies?.replies ? formatNumber(replies.replies, 0) : ''}`;\n }\n\n if(replies && !this.updated && !this.message.pFlags.is_outgoing) {\n this.managers.appMessagesManager.subscribeRepliesThread(this.message.peerId, this.message.mid);\n this.managers.appMessagesManager.updateMessage(this.message.peerId, this.message.mid, 'replies_updated');\n this.updated = true;\n }\n\n if(this.loadPromises) {\n this.loadPromises = undefined;\n }\n }\n}\n\ncustomElements.define(TAG_NAME, RepliesElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {formatTime, getFullDate} from '../../helpers/date';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {Message} from '../../layer';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {i18n, _i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport rootScope from '../../lib/rootScope';\nimport type LazyLoadQueue from '../lazyLoadQueue';\nimport PeerTitle from '../peerTitle';\nimport wrapReply from '../wrappers/reply';\nimport Chat, {ChatType} from './chat';\nimport RepliesElement from './replies';\n\nconst NBSP = ' ';\n\nconst makeEdited = () => {\n const edited = document.createElement('i');\n edited.classList.add('edited');\n _i18n(edited, 'EditedMessage');\n return edited;\n};\n\nconst makeSponsored = () => i18n('SponsoredMessage');\n\nexport namespace MessageRender {\n /* export const setText = () => {\n\n }; */\n\n export const setTime = (options: {\n chatType: ChatType,\n message: Message.message | Message.messageService,\n reactionsMessage?: Message.message\n }) => {\n const {chatType, message} = options;\n const date = new Date(message.date * 1000);\n const args: (HTMLElement | string)[] = [];\n\n let editedSpan: HTMLElement,\n sponsoredSpan: HTMLElement;\n // reactionsElement: ReactionsElement,\n // reactionsMessage: Message.message;\n\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\n const isMessage = !('action' in message) && !isSponsored;\n // let hasReactions: boolean;\n\n const time: HTMLElement = isSponsored ? undefined : formatTime(date);\n if(isMessage) {\n if(message.views) {\n const postAuthor = message.post_author || message.fwd_from?.post_author;\n\n const postViewsSpan = document.createElement('span');\n postViewsSpan.classList.add('post-views');\n postViewsSpan.innerHTML = formatNumber(message.views, 1);\n\n const channelViews = document.createElement('i');\n channelViews.classList.add('tgico-channelviews', 'time-icon');\n\n args.push(postViewsSpan, channelViews);\n if(postAuthor) {\n const span = document.createElement('span');\n setInnerHTML(span, wrapEmojiText(postAuthor));\n span.insertAdjacentHTML('beforeend', ',' + NBSP)\n args.push(span);\n }\n }\n\n if(message.edit_date && chatType !== 'scheduled' && !message.pFlags.edit_hide) {\n args.unshift(editedSpan = makeEdited());\n }\n\n if(chatType !== 'pinned' && message.pFlags.pinned) {\n const i = document.createElement('i');\n i.classList.add('tgico-pinnedchat', 'time-icon');\n args.unshift(i);\n }\n\n // if(USER_REACTIONS_INLINE && message.peer_id._ === 'peerUser'/* && message.reactions?.results?.length */) {\n // hasReactions = true;\n\n // reactionsMessage = options.reactionsMessage;\n // reactionsElement = new ReactionsElement();\n // reactionsElement.init(reactionsMessage, 'inline', true);\n // reactionsElement.render();\n // args.unshift(reactionsElement);\n // }\n } else if(isSponsored) {\n args.push(sponsoredSpan = makeSponsored());\n }\n\n if(time) {\n args.push(time);\n }\n\n let title = isSponsored ? undefined : getFullDate(date);\n if(isMessage) {\n title += (message.edit_date && !message.pFlags.edit_hide ? `\\nEdited: ${getFullDate(new Date(message.edit_date * 1000))}` : '') +\n (message.fwd_from ? `\\nOriginal: ${getFullDate(new Date(message.fwd_from.date * 1000))}` : '');\n }\n\n const timeSpan = document.createElement('span');\n timeSpan.classList.add('time', 'tgico');\n // if(title) timeSpan.title = title;\n timeSpan.append(...args);\n\n const inner = document.createElement('div');\n inner.classList.add('inner', 'tgico');\n if(title) inner.title = title;\n\n let clonedArgs = args;\n if(editedSpan) {\n clonedArgs[clonedArgs.indexOf(editedSpan)] = makeEdited();\n }\n if(sponsoredSpan) {\n clonedArgs[clonedArgs.indexOf(sponsoredSpan)] = makeSponsored();\n }\n // if(reactionsElement) {\n // const _reactionsElement = clonedArgs[clonedArgs.indexOf(reactionsElement)] = new ReactionsElement();\n // _reactionsElement.init(reactionsMessage, 'inline');\n // _reactionsElement.render();\n // }\n clonedArgs = clonedArgs.map((a) => a instanceof HTMLElement && !a.classList.contains('i18n') && !a.classList.contains('reactions') ? a.cloneNode(true) as HTMLElement : a);\n if(time) {\n clonedArgs[clonedArgs.length - 1] = formatTime(date); // clone time\n }\n inner.append(...clonedArgs);\n\n timeSpan.append(inner);\n\n return timeSpan;\n };\n\n export const renderReplies = ({bubble, bubbleContainer, message, messageDiv, loadPromises, lazyLoadQueue}: {\n bubble: HTMLElement,\n bubbleContainer: HTMLElement,\n message: Message.message,\n messageDiv: HTMLElement,\n loadPromises?: Promise[],\n lazyLoadQueue?: LazyLoadQueue\n }) => {\n const isFooter = !bubble.classList.contains('sticker') && !bubble.classList.contains('emoji-big') && !bubble.classList.contains('round');\n const repliesFooter = new RepliesElement();\n repliesFooter.message = message;\n repliesFooter.type = isFooter ? 'footer' : 'beside';\n repliesFooter.loadPromises = loadPromises;\n repliesFooter.lazyLoadQueue = lazyLoadQueue;\n repliesFooter.init();\n bubbleContainer.prepend(repliesFooter);\n return isFooter;\n };\n\n export const setReply = async({chat, bubble, bubbleContainer, message}: {\n chat: Chat,\n bubble: HTMLElement,\n bubbleContainer?: HTMLElement,\n message: Message.message\n }) => {\n const isReplacing = !bubbleContainer;\n if(isReplacing) {\n bubbleContainer = bubble.querySelector('.bubble-content');\n }\n\n const currentReplyDiv = isReplacing ? bubbleContainer.querySelector('.reply') : null;\n if(!message.reply_to_mid) {\n currentReplyDiv?.remove();\n\n bubble.classList.remove('is-reply');\n return;\n }\n\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : chat.peerId;\n\n const originalMessage = await rootScope.managers.appMessagesManager.getMessageByPeer(replyToPeerId, message.reply_to_mid);\n let originalPeerTitle: string | HTMLElement;\n\n // ///////this.log('message to render reply', originalMessage, originalPeerTitle, bubble, message);\n\n let titlePeerId: PeerId;\n // need to download separately\n if(!originalMessage) {\n // ////////this.log('message to render reply empty, need download', message, message.reply_to_mid);\n rootScope.managers.appMessagesManager.fetchMessageReplyTo(message);\n chat.bubbles.needUpdate.push({replyToPeerId, replyMid: message.reply_to_mid, mid: message.mid});\n\n originalPeerTitle = i18n('Loading');\n } else {\n const originalMessageFwdFromId = (originalMessage as Message.message).fwdFromId;\n titlePeerId = message.fwdFromId && message.fwdFromId === originalMessageFwdFromId ? message.fwdFromId : originalMessage.fromId || originalMessageFwdFromId;\n originalPeerTitle = new PeerTitle({\n peerId: titlePeerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element;\n }\n\n const {container, fillPromise} = wrapReply(originalPeerTitle, undefined, chat.animationGroup, originalMessage, chat.isAnyGroup ? titlePeerId : undefined);\n await fillPromise;\n if(currentReplyDiv) {\n if(currentReplyDiv.classList.contains('floating-part')) {\n container.classList.add('floating-part');\n }\n currentReplyDiv.replaceWith(container);\n } else {\n bubbleContainer.append(container);\n }\n // bubbleContainer.insertBefore(, nameContainer);\n bubble.classList.add('is-reply');\n\n return container;\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\n\nexport function getElementByPoint(container: HTMLElement, verticalSide: 'top' | 'bottom', horizontalSide: 'center' | 'left'): HTMLElement {\n // return null;\n const rect = container.getBoundingClientRect();\n const x = horizontalSide === 'center' ? Math.ceil(rect.left + ((rect.right - rect.left) / 2) + 1) : Math.ceil(rect.left + 1);\n const y = verticalSide === 'bottom' ? Math.floor(rect.top + rect.height - 1) : Math.ceil(rect.top + 1);\n return document.elementFromPoint(x, y) as any;\n};\n\nMOUNT_CLASS_TO.getElementByPoint = getElementByPoint;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function reflowScrollableElement(element: HTMLElement) {\n element.style.display = 'none';\n void element.offsetLeft; // reflow\n element.style.display = '';\n}\n","export const SEND_WHEN_ONLINE_TIMESTAMP = 0x7FFFFFFE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport enum INTERNAL_LINK_TYPE {\n MESSAGE,\n PRIVATE_POST,\n STICKER_SET,\n JOIN_CHAT,\n VOICE_CHAT,\n USER_PHONE_NUMBER,\n INVOICE,\n EMOJI_SET\n};\n\nexport type InternalLink = InternalLink.InternalLinkMessage | InternalLink.InternalLinkPrivatePost | InternalLink.InternalLinkStickerSet | InternalLink.InternalLinkJoinChat | InternalLink.InternalLinkVoiceChat | InternalLink.InternalLinkUserPhoneNumber | InternalLink.InternalLinkInvoice | InternalLink.InternalLinkEmojiSet;\n\nexport namespace InternalLink {\n export interface InternalLinkMessage {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: string,\n post?: string,\n comment?: string,\n thread?: string,\n start?: string,\n stack?: number // local\n }\n\n export interface InternalLinkPrivatePost {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: string,\n post: string,\n thread?: string,\n comment?: string,\n stack?: number // local\n }\n\n export interface InternalLinkStickerSet {\n _: INTERNAL_LINK_TYPE.STICKER_SET,\n set: string\n }\n\n export interface InternalLinkJoinChat {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: string\n }\n\n /**\n * LOCAL LINK\n */\n export interface InternalLinkVoiceChat {\n _: INTERNAL_LINK_TYPE.VOICE_CHAT,\n id: string,\n access_hash: string,\n chat_id: string\n }\n\n export interface InternalLinkUserPhoneNumber {\n _: INTERNAL_LINK_TYPE.USER_PHONE_NUMBER,\n phone: string\n }\n\n export interface InternalLinkInvoice {\n _: INTERNAL_LINK_TYPE.INVOICE,\n slug: string\n }\n\n export interface InternalLinkEmojiSet {\n _: INTERNAL_LINK_TYPE.EMOJI_SET,\n set: string\n }\n}\n\nexport type InternalLinkTypeMap = {\n [INTERNAL_LINK_TYPE.MESSAGE]: InternalLink.InternalLinkMessage,\n [INTERNAL_LINK_TYPE.PRIVATE_POST]: InternalLink.InternalLinkPrivatePost,\n [INTERNAL_LINK_TYPE.STICKER_SET]: InternalLink.InternalLinkStickerSet,\n [INTERNAL_LINK_TYPE.JOIN_CHAT]: InternalLink.InternalLinkJoinChat,\n [INTERNAL_LINK_TYPE.VOICE_CHAT]: InternalLink.InternalLinkVoiceChat,\n [INTERNAL_LINK_TYPE.USER_PHONE_NUMBER]: InternalLink.InternalLinkUserPhoneNumber,\n [INTERNAL_LINK_TYPE.INVOICE]: InternalLink.InternalLinkInvoice,\n [INTERNAL_LINK_TYPE.EMOJI_SET]: InternalLink.InternalLinkEmojiSet\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement, {addCancelButton} from '.';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport {ChatInvite} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {i18n, _i18n} from '../../lib/langPack';\nimport {NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport AvatarElement from '../avatar';\nimport putPhoto from '../putPhoto';\nimport {toastNew} from '../toast';\nimport wrapPhoto from '../wrappers/photo';\n\n// const FAKE_CHAT_ID = Number.MAX_SAFE_INTEGER - 0x1000;\n\nexport default class PopupJoinChatInvite extends PopupElement {\n constructor(\n private hash: string,\n private chatInvite: ChatInvite.chatInvite\n ) {\n super('popup-join-chat-invite', {\n closable: true,\n overlayClosable: true,\n body: true,\n buttons: addCancelButton([{\n langKey: chatInvite.pFlags.request_needed ? 'RequestJoin.Button' : (chatInvite.pFlags.broadcast ? 'JoinByPeekChannelTitle' : 'JoinByPeekGroupTitle'),\n callback: () => {\n this.managers.appChatsManager.importChatInvite(hash)\n .then((chatId) => {\n const peerId = chatId.toPeerId(true);\n appImManager.setInnerPeer({peerId});\n }, (error) => {\n if(error.type === 'INVITE_REQUEST_SENT') {\n toastNew({langPackKey: 'RequestToJoinSent'});\n }\n });\n }\n }])\n });\n\n this.construct();\n }\n\n private async construct() {\n this.header.remove();\n /* const fakeChat: Chat.channel | Chat.chat = {\n _: chatInvite.pFlags.channel ? 'channel' : 'chat',\n id: FAKE_CHAT_ID,\n title: chatInvite.title,\n photo: chatInvite.photo as any,\n date: Date.now() / 1000 | 0,\n version: 0,\n participants_count: chatInvite.participants_count,\n pFlags: chatInvite.pFlags as any\n };\n\n appChatsManager.saveApiChat(fakeChat); */\n\n const {chatInvite, managers, hash} = this;\n\n const avatarElem = new AvatarElement();\n avatarElem.classList.add('avatar-100');\n avatarElem.isDialog = false;\n if(chatInvite.photo._ === 'photo') {\n chatInvite.photo = await managers.appPhotosManager.savePhoto(chatInvite.photo);\n wrapPhoto({\n container: avatarElem,\n message: null,\n photo: chatInvite.photo,\n boxHeight: 100,\n boxWidth: 100,\n withoutPreloader: true\n });\n avatarElem.style.width = avatarElem.style.height = '';\n } else {\n putPhoto({\n div: avatarElem,\n peerId: NULL_PEER_ID,\n isDialog: false,\n title: chatInvite.title\n });\n }\n\n const title = document.createElement('div');\n title.classList.add('chat-title');\n setInnerHTML(title, wrapEmojiText(chatInvite.title));\n // avatarElem.setAttribute('peer', '' + -fakeChat.id);\n\n const isBroadcast = chatInvite.pFlags.broadcast;\n const peopleCount = i18n(isBroadcast ? 'Subscribers' : 'Members', [numberThousandSplitter(chatInvite.participants_count)]);\n peopleCount.classList.add('chat-participants-count');\n\n this.body.append(avatarElem, title, peopleCount);\n\n if(chatInvite.pFlags.request_needed) {\n const caption = document.createElement('div');\n _i18n(caption, isBroadcast ? 'RequestToJoinChannelDescription' : 'RequestToJoinGroupDescription');\n caption.classList.add('chat-participants-count', 'request-caption');\n\n this.body.append(caption);\n }\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport callbackify from '../../helpers/callbackify';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport {Document, MessagePeerReaction, ReactionCount} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport rootScope from '../../lib/rootScope';\nimport SetTransition from '../singleTransition';\nimport StackedAvatars from '../stackedAvatars';\nimport {Awaited} from '../../types';\nimport wrapSticker from '../wrappers/sticker';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport wrapStickerAnimation from '../wrappers/stickerAnimation';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport {fastRaf} from '../../helpers/schedulers';\nimport noop from '../../helpers/noop';\nimport {Middleware} from '../../helpers/middleware';\n\nconst CLASS_NAME = 'reaction';\nconst TAG_NAME = CLASS_NAME + '-element';\nconst REACTION_INLINE_SIZE = 14;\nconst REACTION_BLOCK_SIZE = 22;\n\nexport const REACTION_DISPLAY_INLINE_COUNTER_AT = 2;\nexport const REACTION_DISPLAY_BLOCK_COUNTER_AT = 4;\n\nexport type ReactionLayoutType = 'block' | 'inline';\n\nexport default class ReactionElement extends HTMLElement {\n private type: ReactionLayoutType;\n private counter: HTMLElement;\n private stickerContainer: HTMLElement;\n private stackedAvatars: StackedAvatars;\n private canRenderAvatars: boolean;\n private _reactionCount: ReactionCount;\n private wrapStickerPromise: Awaited>['render'];\n private managers: AppManagers;\n private middleware: Middleware;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.managers = rootScope.managers;\n }\n\n public get reactionCount() {\n return this._reactionCount;\n }\n\n public set reactionCount(reactionCount: ReactionCount) {\n this._reactionCount = reactionCount;\n }\n\n public get count() {\n return this.reactionCount.count;\n }\n\n public init(type: ReactionLayoutType, middleware: Middleware) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n this.middleware = middleware;\n }\n\n public setCanRenderAvatars(canRenderAvatars: boolean) {\n this.canRenderAvatars = canRenderAvatars;\n }\n\n public render(doNotRenderSticker?: boolean) {\n const hadStickerContainer = !!this.stickerContainer;\n if(!hadStickerContainer) {\n this.stickerContainer = document.createElement('div');\n this.stickerContainer.classList.add(CLASS_NAME + '-sticker');\n this.append(this.stickerContainer);\n }\n\n const reactionCount = this.reactionCount;\n if(!doNotRenderSticker && !hadStickerContainer) {\n const reaction = reactionCount.reaction;\n if(reaction._ === 'reactionEmoji') {\n const availableReaction = this.managers.appReactionsManager.getReaction(reaction.emoticon);\n callbackify(availableReaction, (availableReaction) => {\n if(!availableReaction.center_icon) {\n this.stickerContainer.classList.add('is-static');\n }\n\n if(availableReaction.pFlags.inactive) {\n this.classList.add('is-inactive');\n }\n\n this.renderDoc(availableReaction.center_icon ?? availableReaction.static_icon);\n });\n } else if(reaction._ === 'reactionCustomEmoji') {\n this.stickerContainer.classList.add('is-custom');\n const wrapped = wrapCustomEmoji({\n docIds: [reaction.document_id],\n customEmojiSize: makeMediaSize(REACTION_BLOCK_SIZE, REACTION_BLOCK_SIZE)\n });\n\n this.stickerContainer.append(wrapped);\n }\n }\n }\n\n private renderDoc(doc: Document.document) {\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE : REACTION_BLOCK_SIZE;\n const wrapPromise = this.wrapStickerPromise = wrapSticker({\n div: this.stickerContainer,\n doc,\n width: size,\n height: size,\n static: true,\n managers: this.managers,\n middleware: this.middleware\n }).then(({render}) => render).finally(() => {\n if(this.wrapStickerPromise === wrapPromise) {\n this.wrapStickerPromise = undefined;\n }\n });\n }\n\n public renderCounter() {\n const reactionCount = this.reactionCount;\n const displayOn = this.type === 'inline' ? REACTION_DISPLAY_INLINE_COUNTER_AT : REACTION_DISPLAY_BLOCK_COUNTER_AT;\n if(reactionCount.count >= displayOn || (this.type === 'block' && !this.canRenderAvatars)) {\n if(!this.counter) {\n this.counter = document.createElement(this.type === 'inline' ? 'i' : 'span');\n this.counter.classList.add(CLASS_NAME + '-counter');\n }\n\n const formatted = formatNumber(reactionCount.count);\n if(this.counter.textContent !== formatted) {\n this.counter.textContent = formatted;\n }\n\n if(!this.counter.parentElement) {\n this.append(this.counter);\n }\n } else if(this.counter?.parentElement) {\n this.counter.remove();\n this.counter = undefined;\n }\n }\n\n public renderAvatars(recentReactions: MessagePeerReaction[]) {\n if(this.type === 'inline') {\n return;\n }\n\n if(this.reactionCount.count >= REACTION_DISPLAY_BLOCK_COUNTER_AT || !this.canRenderAvatars) {\n if(this.stackedAvatars) {\n this.stackedAvatars.container.remove();\n this.stackedAvatars = undefined;\n }\n\n return;\n }\n\n if(!this.stackedAvatars) {\n this.stackedAvatars = new StackedAvatars({\n avatarSize: 24\n });\n\n this.append(this.stackedAvatars.container);\n }\n\n this.stackedAvatars.render(recentReactions.map((reaction) => getPeerId(reaction.peer_id)));\n }\n\n public setIsChosen(isChosen = this.reactionCount.chosen_order !== undefined) {\n if(this.type === 'inline') return;\n const wasChosen = this.classList.contains('is-chosen') && !this.classList.contains('backwards');\n if(wasChosen !== isChosen) {\n SetTransition({\n element: this,\n className: 'is-chosen',\n forwards: isChosen,\n duration: this.isConnected ? 300 : 0\n });\n }\n }\n\n public fireAroundAnimation() {\n const reaction = this.reactionCount.reaction;\n if(reaction._ !== 'reactionEmoji') return;\n callbackify(this.managers.appReactionsManager.getReaction(reaction.emoticon), (availableReaction) => {\n const size = this.type === 'inline' ? REACTION_INLINE_SIZE + 14 : REACTION_BLOCK_SIZE + 18;\n const div = document.createElement('div');\n div.classList.add(CLASS_NAME + '-sticker-activate');\n\n Promise.all([\n wrapSticker({\n div: div,\n doc: availableReaction.center_icon,\n width: size,\n height: size,\n withThumb: false,\n needUpscale: true,\n play: false,\n skipRatio: 1,\n group: 'none',\n needFadeIn: false,\n managers: this.managers,\n middleware: this.middleware\n }).then(({render}) => render as Promise),\n\n wrapStickerAnimation({\n doc: availableReaction.around_animation,\n size: 80,\n target: this.stickerContainer,\n side: 'center',\n skipRatio: 1,\n play: false,\n managers: this.managers,\n middleware: this.middleware\n }).stickerPromise.catch(noop)\n ]).then(([iconPlayer, aroundPlayer]) => {\n const remove = () => {\n // if(!isInDOM(div)) return;\n iconPlayer.remove();\n div.remove();\n this.stickerContainer.classList.remove('has-animation');\n };\n\n if(!aroundPlayer) {\n remove();\n return;\n }\n\n const removeOnFrame = () => {\n // if(!isInDOM(div)) return;\n fastRaf(remove);\n };\n\n iconPlayer.addEventListener('enterFrame', (frameNo) => {\n if(frameNo === iconPlayer.maxFrame) {\n if(this.wrapStickerPromise) { // wait for fade in animation\n this.wrapStickerPromise.then(() => {\n setTimeout(removeOnFrame, 1e3);\n });\n } else {\n removeOnFrame();\n }\n }\n });\n\n iconPlayer.addEventListener('firstFrame', () => {\n this.stickerContainer.append(div);\n this.stickerContainer.classList.add('has-animation');\n iconPlayer.play();\n aroundPlayer.play();\n }, {once: true});\n });\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport {Middleware, MiddlewareHelper} from '../../helpers/middleware';\nimport {Message, ReactionCount} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport reactionsEqual from '../../lib/appManagers/utils/reactions/reactionsEqual';\nimport rootScope from '../../lib/rootScope';\nimport ReactionElement, {ReactionLayoutType, REACTION_DISPLAY_BLOCK_COUNTER_AT} from './reaction';\n\nconst CLASS_NAME = 'reactions';\nconst TAG_NAME = CLASS_NAME + '-element';\n\nconst REACTIONS_ELEMENTS: Map> = new Map();\nexport {REACTIONS_ELEMENTS};\n\nexport default class ReactionsElement extends HTMLElement {\n private message: Message.message;\n private key: string;\n private isPlaceholder: boolean;\n private type: ReactionLayoutType;\n private sorted: ReactionElement[];\n private onConnectCallback: () => void;\n private managers: AppManagers;\n private middleware: Middleware;\n private middlewareHelpers: Map;\n\n constructor() {\n super();\n this.classList.add(CLASS_NAME);\n this.sorted = [];\n this.middlewareHelpers = new Map();\n this.managers = rootScope.managers;\n }\n\n connectedCallback() {\n let set = REACTIONS_ELEMENTS.get(this.key);\n if(!set) {\n REACTIONS_ELEMENTS.set(this.key, set = new Set());\n }\n\n set.add(this);\n\n if(this.onConnectCallback && this.isConnected) {\n this.onConnectCallback();\n this.onConnectCallback = undefined;\n }\n }\n\n disconnectedCallback() {\n const set = REACTIONS_ELEMENTS.get(this.key);\n set.delete(this);\n if(!set.size) {\n REACTIONS_ELEMENTS.delete(this.key);\n }\n }\n\n public getReactionCount(reactionElement: ReactionElement) {\n return this.sorted[this.sorted.indexOf(reactionElement)].reactionCount;\n }\n\n public getMessage() {\n return this.message;\n }\n\n public init(\n message: Message.message,\n type: ReactionLayoutType,\n middleware: Middleware,\n isPlaceholder = this.isPlaceholder\n ) {\n if(this.key !== undefined) {\n this.disconnectedCallback();\n }\n\n if(this.middleware !== middleware) {\n middleware.onDestroy(() => {\n this.middlewareHelpers.clear();\n });\n }\n\n this.message = message;\n this.key = this.message.peerId + '_' + this.message.mid;\n this.middleware = middleware;\n this.isPlaceholder = isPlaceholder;\n\n if(this.type !== type) {\n this.type = type;\n this.classList.add(CLASS_NAME + '-' + type);\n }\n\n this.connectedCallback();\n }\n\n public changeMessage(message: Message.message) {\n return this.init(message, this.type, this.middleware);\n }\n\n public update(message: Message.message, changedResults?: ReactionCount[]) {\n this.message = message;\n this.render(changedResults);\n }\n\n public render(changedResults?: ReactionCount[]) {\n const reactions = this.message.reactions;\n const hasReactions = !!(reactions && reactions.results.length);\n this.classList.toggle('has-no-reactions', !hasReactions);\n if(!hasReactions && !this.sorted.length) return;\n\n const availableReactionsResult = this.managers.appReactionsManager.getAvailableReactions();\n // callbackify(availableReactionsResult, () => {\n const counts = hasReactions ? (\n reactions.results\n // availableReactionsResult instanceof Promise ?\n // reactions.results :\n // reactions.results.filter((reactionCount) => {\n // return this.managers.appReactionsManager.isReactionActive(reactionCount.reaction);\n // })\n ) : [];\n\n // if(this.message.peerId.isUser()) {\n // counts.sort((a, b) => (b.count - a.count) || ((b.chosen_order ?? 0) - (a.chosen_order ?? 0)));\n // } else {\n counts.sort((a, b) => (b.count - a.count) || ((a.chosen_order ?? 0) - (b.chosen_order ?? 0)));\n // }\n\n forEachReverse(this.sorted, (reactionElement, idx, arr) => {\n const reaction = reactionElement.reactionCount.reaction;\n const found = counts.some((reactionCount) => reactionsEqual(reactionCount.reaction, reaction));\n if(!found) {\n const middlewareHelper = this.middlewareHelpers.get(reactionElement);\n middlewareHelper.destroy();\n this.middlewareHelpers.delete(reactionElement);\n arr.splice(idx, 1);\n reactionElement.remove();\n }\n });\n\n const totalReactions = counts.reduce((acc, c) => acc + c.count, 0);\n const canRenderAvatars = reactions && (!!reactions.pFlags.can_see_list || this.message.peerId.isUser()) && totalReactions < REACTION_DISPLAY_BLOCK_COUNTER_AT;\n this.sorted = counts.map((reactionCount, idx) => {\n let reactionElement = this.sorted.find((reactionElement) => reactionsEqual(reactionElement.reactionCount.reaction, reactionCount.reaction));\n if(!reactionElement) {\n const middlewareHelper = this.middleware.create();\n reactionElement = new ReactionElement();\n reactionElement.init(this.type, middlewareHelper.get());\n this.middlewareHelpers.set(reactionElement, middlewareHelper);\n }\n\n positionElementByIndex(reactionElement, this, idx);\n\n const recentReactions = reactions.recent_reactions ? reactions.recent_reactions.filter((reaction) => reactionsEqual(reaction.reaction, reactionCount.reaction)) : [];\n reactionElement.reactionCount = {...reactionCount};\n reactionElement.setCanRenderAvatars(canRenderAvatars);\n reactionElement.render(this.isPlaceholder);\n reactionElement.renderCounter();\n reactionElement.renderAvatars(recentReactions);\n reactionElement.setIsChosen();\n\n return reactionElement;\n });\n\n // this.sorted.forEach((reactionElement, idx) => {\n // /* if(this.type === 'block' && this.childElementCount !== this.sorted.length) { // because of appended time\n // idx += 1;\n // } */\n\n // positionElementByIndex(reactionElement, this, idx);\n // });\n\n if(!this.isPlaceholder && changedResults?.length) {\n if(this.isConnected) {\n this.handleChangedResults(changedResults);\n } else {\n this.onConnectCallback = () => {\n this.handleChangedResults(changedResults);\n };\n }\n }\n // });\n\n // ! тут вообще не должно быть этого кода, но пока он побудет тут\n if(!this.sorted.length && this.type === 'block') {\n const parentElement = this.parentElement;\n this.remove();\n\n if(parentElement.classList.contains('document-message') && !parentElement.childNodes.length) {\n parentElement.remove();\n return;\n }\n\n const timeSpan = this.querySelector('.time');\n if(timeSpan) {\n parentElement.append(timeSpan);\n }\n }\n }\n\n private handleChangedResults(changedResults: ReactionCount[]) {\n // ! temp\n if(this.message.peerId !== appImManager.chat.peerId) return;\n\n changedResults.forEach((reactionCount) => {\n const reactionElement = this.sorted.find((reactionElement) => reactionsEqual(reactionElement.reactionCount.reaction, reactionCount.reaction));\n reactionElement?.fireAroundAnimation();\n });\n }\n}\n\ncustomElements.define(TAG_NAME, ReactionsElement);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Scrollable from '../components/scrollable';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport getVisibleRect from './dom/getVisibleRect';\nimport reflowScrollableElement from './dom/reflowScrollableElement';\n\nexport default class ScrollSaver {\n private scrollHeight: number;\n private scrollHeightMinusTop: number;\n private scrollTop: number;\n private clientHeight: number;\n private elements: {element: HTMLElement, rect: DOMRect}[];\n\n /**\n *\n * @param scrollable to reset scroll position and direction\n * @param reverse true means top\n */\n constructor(\n private scrollable: Scrollable,\n private query: string,\n private reverse: boolean\n ) {\n\n }\n\n private get container() {\n return this.scrollable.container;\n }\n\n public getSaved() {\n return {\n scrollHeight: this.scrollHeight,\n scrollTop: this.scrollTop,\n clientHeight: this.clientHeight\n };\n }\n\n public findElements() {\n if(!this.query) return [];\n\n const {container} = this;\n const containerRect = container.getBoundingClientRect();\n const bubbles = Array.from(container.querySelectorAll(this.query)) as HTMLElement[];\n const elements: ScrollSaver['elements'] = [];\n for(const bubble of bubbles) {\n const elementRect = bubble.getBoundingClientRect();\n const visibleRect = getVisibleRect(bubble, container, undefined, elementRect, containerRect);\n if(visibleRect) {\n elements.push({element: bubble, rect: elementRect});\n // break; // find first\n } else if(elements.length) { // find last\n break;\n }\n }\n\n if(!elements.length) {\n const bubble = bubbles[0];\n if(bubble) {\n elements.push({element: bubble, rect: bubble.getBoundingClientRect()});\n }\n }\n\n return elements;\n }\n\n public replaceSaved(from: HTMLElement, to: HTMLElement) {\n if(!this.elements) {\n return;\n }\n\n const idx = this.elements.findIndex(({element}) => from === element);\n if(idx !== -1) {\n this.elements[idx].element = to;\n }\n }\n\n public findAndSetElements() {\n this.elements = this.findElements();\n }\n\n public save() {\n this.findAndSetElements();\n // console.warn('scroll save', this.elements);\n this._save();\n }\n\n public _save() {\n const {scrollTop, scrollHeight, clientHeight} = this.container;\n\n // previousScrollHeight = scrollHeight;\n // previousScrollHeight = scrollHeight + padding;\n this.scrollHeight = scrollHeight;\n this.scrollTop = scrollTop;\n this.clientHeight = clientHeight;\n this.scrollHeightMinusTop = this.reverse ? scrollHeight - scrollTop : scrollTop;\n\n // this.chatInner.style.paddingTop = padding + 'px';\n /* if(reverse) {\n previousScrollHeightMinusTop = this.scrollable.scrollHeight - scrollTop;\n } else {\n previousScrollHeightMinusTop = scrollTop;\n } */\n }\n\n private onRestore(useReflow?: boolean) {\n if(IS_SAFARI && useReflow/* && !isAppleMobile */) { // * fix blinking and jumping\n reflowScrollableElement(this.container);\n }\n }\n\n private setScrollTop(newScrollTop: number, useReflow?: boolean) {\n // touchSupport for safari iOS\n // isTouchSupported && isApple && (container.container.style.overflow = 'hidden');\n this.scrollable.setScrollTopSilently(this.scrollTop = newScrollTop);\n // container.scrollTop = scrollHeight;\n // isTouchSupported && isApple && (container.container.style.overflow = '');\n\n this.onRestore(useReflow);\n }\n\n public restore(useReflow?: boolean) {\n const {scrollTop, scrollHeight} = this.scrollable;\n this.scrollHeight = scrollHeight;\n\n if(!this.elements.length) { // maybe all messages have been deleted\n this._restore(useReflow);\n return;\n }\n\n let anchor: ScrollSaver['elements'][0];\n // for(let i = this.elements.length - 1; i >= 0; --i) {\n // const _anchor = this.elements[i];\n // if(_anchor.element.parentElement) {\n // anchor = _anchor;\n // break;\n // }\n // }\n anchor = this.elements[this.elements.length - 1];\n\n if(!anchor?.element?.parentElement) { // try to find new anchor\n this.findAndSetElements();\n anchor = this.elements[this.elements.length - 1];\n\n if(!anchor) { // fallback to old method if smth is really strange\n this._restore(useReflow);\n return;\n }\n }\n\n const {element, rect} = anchor;\n const newRect = element.getBoundingClientRect();\n const diff = newRect.bottom - rect.bottom;\n this.setScrollTop(scrollTop + diff, useReflow);\n // if(diff) debugger;\n // console.warn('scroll restore', rect, diff, newRect);\n }\n\n public _restore(useReflow?: boolean) {\n const {scrollHeightMinusTop: previousScrollHeightMinusTop, scrollable} = this;\n // if(previousScrollHeightMinusTop === undefined) {\n // throw new Error('scroll was not saved');\n // }\n\n // const scrollHeight = container.scrollHeight;\n const scrollHeight = this.scrollHeight;\n // if(scrollHeight === this.scrollHeight) {\n // return;\n // }\n\n // this.scrollHeight = scrollHeight;\n\n /* const scrollHeight = container.scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n\n this.chatInner.style.paddingTop = (10000 - addedHeight) + 'px'; */\n /* const scrollHeight = scrollHeight;\n const addedHeight = scrollHeight - previousScrollHeight;\n\n this.chatInner.style.paddingTop = (padding - addedHeight) + 'px';\n\n //const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = reverse ? scrollHeight - addedHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n this.log('performHistoryResult: will set scrollTop',\n previousScrollHeightMinusTop, scrollHeight,\n newScrollTop, container.container.clientHeight); */\n // const newScrollTop = reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n const newScrollTop = this.reverse ? scrollHeight - previousScrollHeightMinusTop : previousScrollHeightMinusTop;\n\n /* if(DEBUG) {\n this.log('performHistoryResult: will set up scrollTop:', newScrollTop, this.isHeavyAnimationInProgress);\n } */\n\n this.setScrollTop(newScrollTop, useReflow);\n\n /* if(DEBUG) {\n this.log('performHistoryResult: have set up scrollTop:', newScrollTop, container.scrollTop, container.scrollHeight, this.isHeavyAnimationInProgress);\n } */\n }\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.ScrollSaver = ScrollSaver);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type IntersectionTarget = Element;\nexport type IntersectionCallback = (entry: IntersectionObserverEntry) => void;\n\nexport default class SuperIntersectionObserver {\n private observing: Map>;\n private observingQueue: SuperIntersectionObserver['observing'];\n private observer: IntersectionObserver;\n private freezedObservingNew: boolean;\n\n constructor(init?: IntersectionObserverInit) {\n this.observing = new Map();\n this.observingQueue = new Map();\n this.freezedObservingNew = false;\n\n this.observer = new IntersectionObserver((entries) => {\n const observing = this.observing;\n for(let i = 0, length = entries.length; i < length; ++i) {\n const entry = entries[i];\n const callbacks = observing.get(entry.target);\n if(!callbacks) {\n console.error('intersection process no callbacks:', entry);\n debugger;\n continue;\n }\n\n for(const callback of callbacks) {\n try {\n callback(entry);\n } catch(err) {\n console.error('intersection process callback error:', err);\n }\n }\n }\n }, init);\n }\n\n public disconnect() {\n this.observing.clear();\n this.observingQueue.clear();\n this.observer.disconnect();\n }\n\n public toggleObservingNew(value: boolean) {\n if(this.freezedObservingNew === value) {\n return;\n }\n\n this.freezedObservingNew = value;\n\n const queue = this.observingQueue;\n if(!value && queue.size) {\n for(const [target, callbacks] of queue) {\n for(const callback of callbacks) {\n this.observe(target, callback);\n }\n }\n\n queue.clear();\n }\n }\n\n public has(target: IntersectionTarget, callback: IntersectionCallback, observing = this.observing) {\n const callbacks = observing.get(target);\n return !!(callbacks && callbacks.has(callback));\n }\n\n public observe(target: IntersectionTarget, callback: IntersectionCallback) {\n if(this.freezedObservingNew && this.has(target, callback)) {\n return;\n }\n\n const observing = this.freezedObservingNew ? this.observingQueue : this.observing;\n let callbacks = observing.get(target);\n if(callbacks && callbacks.has(callback)) {\n return;\n }\n\n if(!callbacks) {\n callbacks = new Set();\n observing.set(target, callbacks);\n\n if(observing === this.observing) {\n this.observer.observe(target);\n }\n }\n\n callbacks.add(callback);\n }\n\n public unobserve(target: IntersectionTarget, callback: IntersectionCallback) {\n const observing = this.freezedObservingNew && !this.has(target, callback) ? this.observingQueue : this.observing;\n const callbacks = observing.get(target);\n if(!callbacks) {\n return;\n }\n\n callbacks.delete(callback);\n if(!callbacks.size) {\n observing.delete(target);\n this.observer.unobserve(target);\n }\n }\n}\n","import type {MyDocument} from '../../appDocsManager';\nimport type {MyMessage} from '../../appMessagesManager';\nimport {Message, MessageMedia} from '../../../../layer';\n\nexport default function isMentionUnread(message: MyMessage) {\n if(!message) {\n return false;\n }\n\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n return !!(\n message.pFlags.media_unread &&\n message.pFlags.mentioned &&\n (\n !doc ||\n !(['voice', 'round'] as MyDocument['type'][]).includes(doc.type)\n )\n );\n}\n","export default function accumulate(arr: number[], initialValue: number) {\n return arr.reduce((acc, value) => acc + value, initialValue);\n}\n","function cacheCallback(callback: (str: A) => T) {\n const stringResults: any = {}, numberResults: any = {};\n return (value: A): T => {\n const key = '_' + value;\n return (typeof(value) === 'string' ? stringResults : numberResults)[key] ??= callback(value);\n };\n}\n\nexport default cacheCallback;\n","export default function replaceNonNumber(str: string) {\n return str.replace(/\\D/g, '');\n}\n","import cacheCallback from '../cacheCallback';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nconst CARD_BRAND_REGEXP: {[brand: string]: RegExp} = {\n visa: /^4/,\n mastercard: /^(51|52|53|54|55|222|23|24|25|26|27)/,\n amex: /^(34|37)/,\n discover: /^(60|64|65)/,\n diners: /^(30|38|39)/,\n diners14: /^(36)/,\n jcb: /^(35)/,\n unionpay: /^(62[0-6,8-9]|627[0-6,8-9]|6277[0-7,9]|62778[1-9]|81)/,\n elo: /^(5067|509|636368|627780)/,\n mir: /^(220[0-4])/\n};\n\n// * taken from Stripe\nexport const CARD_BRANDS: {[b: string]: {\n minLength: number,\n maxLength: number,\n cvcMaxLength: number,\n cvcMinLength: number | null\n}} = {\n visa: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n mastercard: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n amex: {\n minLength: 15,\n maxLength: 15,\n cvcMaxLength: 4,\n cvcMinLength: 3\n },\n unionpay: {\n minLength: 13,\n maxLength: 19,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n diners: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n diners14: {\n minLength: 14,\n maxLength: 14,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n discover: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n jcb: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n elo: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n mir: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 3,\n cvcMinLength: null\n },\n unknown: {\n minLength: 16,\n maxLength: 16,\n cvcMaxLength: 4,\n cvcMinLength: 3\n }\n};\n\nexport const detectCardBrand = cacheCallback((card: string = '') => {\n const keys = Object.keys(CARD_BRAND_REGEXP);\n const sanitizedCard = replaceNonNumber(card);\n let brand: string;\n let last = 0;\n keys.forEach((key) => {\n const regExp = CARD_BRAND_REGEXP[key];\n const match = sanitizedCard.match(regExp);\n if(match) {\n const result = match[0];\n if(result && result.length > last) {\n brand = key;\n last = result.length;\n }\n }\n });\n\n return brand || 'unknown';\n});\n\nexport function cardBrandToUnifiedBrand(brand: string) {\n return brand === 'diners14' ? 'diners' : brand;\n}\n\nexport function detectUnifiedCardBrand(card = '') {\n const brand = detectCardBrand(card);\n return cardBrandToUnifiedBrand(brand);\n}\n","export default function createArray(length: number, fill?: T1, map?: any): T1[] {\n const arr = new Array(length);\n arr.fill(fill);\n return map ? arr.map(map) : arr;\n}\n","const delta = '0'.charCodeAt(0) - '0'.charCodeAt(0);\nconst buggedRegExp = /[0-9]/g;\n\n// function hasBuggedNumbers(str: string) {\n// return !!str.match(a);\n// }\n\nfunction getDistanceFromBuggedToNormal(char: string) {\n return String.fromCharCode(char.charCodeAt(0) - delta);\n}\n\nexport function fixBuggedNumbers(str: string) {\n return str.replace(buggedRegExp, getDistanceFromBuggedToNormal);\n}\n","import {fixBuggedNumbers} from '../string/buggedNumbers';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nexport type PatternCharacter = {\n type: 'optional',\n result: string,\n consumed: number\n} | {\n type: 'required',\n result: string,\n consumed: number,\n partial?: boolean\n} | {\n type: 'formatting',\n result: string,\n consumed: number\n};\n\nexport type PatternFunction = (str: string) => ((str: string) => PatternCharacter)[];\n\nfunction makeOptionalCharacter(result: string, consumed: number): PatternCharacter {\n return {type: 'optional', result, consumed};\n}\n\nfunction makeRequiredCharacter(result: string, consumed: number, partial?: boolean): PatternCharacter {\n return {type: 'required', result, consumed, partial};\n}\n\nfunction makeFormattingCharacter(result: string, consumed: number): PatternCharacter {\n return {type: 'formatting', result, consumed};\n}\n\nfunction wrapCharacterRegExpFactory(regExp: RegExp, optional?: boolean) {\n return (str: string) => {\n const _regExp = new RegExp('^'.concat(regExp.source.replace(/^\\^/, '')));\n const match = str.match(_regExp);\n const makeCharacter = optional ? makeOptionalCharacter : makeRequiredCharacter;\n if(match) {\n const result = match[0];\n return makeCharacter(result, match.index + result.length);\n }\n\n return makeCharacter('', str.length);\n };\n}\n\nfunction makeCapitalPatternCharacter(str: string) {\n const char = wrapCharacterRegExpFactory(/\\w/)(str);\n return char.result ? makeRequiredCharacter(char.result.toUpperCase(), char.consumed) : char;\n}\n\nconst makeMonthDigitPatternCharacter = wrapCharacterRegExpFactory(/1[0-2]|0?[1-9]|0/);\n\nfunction digit(str: string) {\n return wrapCharacterRegExpFactory(/[0-9]/)(fixBuggedNumbers(str));\n}\n\nconst patternCharacters = {\n digit,\n capitalCharacter: makeCapitalPatternCharacter,\n month: (str: string) => {\n const char = makeMonthDigitPatternCharacter(fixBuggedNumbers(str));\n const cleanedResult = replaceNonNumber(char.result);\n const isPartial = ['0', '1'].includes(char.result) && str.length === 1;\n if(isPartial || (char.result === '0' && str.length >= 2)) {\n return makeRequiredCharacter(char.result, str.length, true);\n }\n\n return makeRequiredCharacter(cleanedResult.length === 1 ? '0' + cleanedResult : cleanedResult, char.consumed);\n },\n formattingCharacter: (str: string) => {\n return (str1: string) => {\n const consumed = str === str1[0] ? 1 : 0;\n return makeFormattingCharacter(str, consumed);\n }\n },\n optionalPattern: (regExp: RegExp) => {\n return (str: string) => {\n const char = wrapCharacterRegExpFactory(regExp, true)(str);\n return char.result ? char : makeOptionalCharacter('', 0);\n };\n }\n};\n\nexport default patternCharacters;\n","import {IS_ANDROID} from '../../environment/userAgent';\nimport createArray from '../array/createArray';\nimport cacheCallback from '../cacheCallback';\nimport replaceNonNumber from '../string/replaceNonNumber';\nimport {CARD_BRANDS, detectCardBrand} from './cardBrands';\nimport patternCharacters from './patternCharacters';\n\nconst digit = patternCharacters.digit;\nconst capitalCharacter = patternCharacters.capitalCharacter;\nconst spaceCharacter = patternCharacters.formattingCharacter(' ');\nconst yearOptionalPattern = patternCharacters.optionalPattern(/\\d\\d/);\nconst sixteenPattern = [digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit];\nconst fifteenPattern = [digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit, digit, digit, spaceCharacter, digit, digit, digit, digit];\n\nconst requiredPostcodes = new Set(['DZ', 'AR', 'AM', 'AU', 'AT', 'AZ', 'PT', 'BD', 'BY', 'BE', 'BA', 'BR', 'BN', 'BG', 'CA', 'IC', 'CN', 'CO', 'HR', 'CY', 'CZ', 'DK', 'EC', 'GB', 'EE', 'FO', 'FI', 'FR', 'GE', 'DE', 'GR', 'GL', 'GU', 'GG', 'NL', 'HU', 'IN', 'ID', 'IL', 'IT', 'JP', 'JE', 'KZ', 'KR', 'FM', 'KG', 'LV', 'LI', 'LT', 'LU', 'MK', 'MG', 'PT', 'MY', 'MH', 'MQ', 'YT', 'MX', 'MN', 'ME', 'NL', 'NZ', 'GB', 'NO', 'PK', 'PH', 'PL', 'FM', 'PT', 'PR', 'RE', 'RU', 'SA', 'SF', 'RS', 'SG', 'SK', 'SI', 'ZA', 'ES', 'LK', 'SX', 'VI', 'VI', 'SE', 'CH', 'TW', 'TJ', 'TH', 'TU', 'TN', 'TR', 'TM', 'VI', 'UA', 'GB', 'US', 'UY', 'UZ', 'VA', 'VN', 'GB', 'FM']);\n\nconst generateFourPattern = cacheCallback((length: number) => {\n const out: Array = [];\n\n for(let i = 0, k = 0; i < length;) {\n if(k === 4) {\n out.push(spaceCharacter);\n k = 0;\n } else {\n out.push(digit);\n ++i;\n ++k;\n }\n }\n\n return out;\n});\n\nfunction generateCardNumberPattern(card: string) {\n const brand = detectCardBrand(card);\n if(brand === 'amex') return sixteenPattern;\n if(brand === 'diners14') return fifteenPattern;\n const {minLength, maxLength} = CARD_BRANDS[brand];\n const s = replaceNonNumber(card).length;\n const d = Math.min(Math.max(minLength, s), maxLength);\n return generateFourPattern(d);\n}\n\nconst cardFormattingPatterns = {\n cardNumber: generateCardNumberPattern,\n cardExpiry: () => [patternCharacters.month, patternCharacters.formattingCharacter('/'), digit, digit, yearOptionalPattern],\n cardCvc: (card?: string) => cardFormattingPatterns.cardCvcFromBrand(detectCardBrand(card)),\n cardCvcFromBrand: cacheCallback((brand: string) => {\n const info = CARD_BRANDS[brand];\n const {cvcMinLength, cvcMaxLength} = info;\n const pattern = createArray(cvcMinLength || cvcMaxLength, digit);\n if(cvcMinLength && cvcMinLength < cvcMaxLength) {\n const i = cvcMaxLength - cvcMinLength;\n const h = patternCharacters.optionalPattern(/\\d/);\n if(i) {\n pattern.push(...createArray(i, h));\n }\n }\n\n return pattern;\n }),\n postalCodeFromCountry: cacheCallback((iso2: string) => {\n switch(iso2) {\n case 'US':\n return createArray(5, digit);\n case 'CA':\n return IS_ANDROID ? null : [capitalCharacter, capitalCharacter, capitalCharacter, spaceCharacter, capitalCharacter, capitalCharacter, capitalCharacter];\n default:\n const optionalDigits = createArray(10, patternCharacters.optionalPattern(/\\d/));\n if(requiredPostcodes.has(iso2)) {\n optionalDigits[0] = digit;\n }\n return optionalDigits;\n }\n })\n};\n\nexport default cardFormattingPatterns;\n","import accumulate from '../array/accumulate';\nimport {PatternFunction} from './patternCharacters';\n\nfunction accumulateLengths(strs: string[]) {\n return accumulate(strs.map((str) => str.length), 0);\n}\n\nfunction formatValueByPattern(\n getPattern: PatternFunction,\n value: string,\n options: Partial<{\n selectionStart: number,\n selectionEnd: number\n }> = {},\n pushRest?: boolean\n) {\n const pattern = getPattern(value);\n\n if(!pattern) {\n return {\n value: value,\n selection: null as typeof options,\n autocorrectComplete: !!value\n };\n }\n\n const length = pattern.length;\n const c: string[] = [];\n const s: string[] = [];\n\n let l = 0;\n let i = 0;\n let f = options.selectionStart === 0 ? 0 : null;\n let d = options.selectionEnd === 0 ? 0 : null;\n const p = () => {\n if(f === null && (i + 1) >= options.selectionStart) f = accumulateLengths(c) + (pushRest ? s.length : 0);\n if(d === null && (i + 1) >= options.selectionEnd) d = accumulateLengths(c) + (pushRest ? s.length : 0);\n };\n const m = (e: number) => {\n if(e > 0) {\n p();\n i += e;\n }\n };\n\n for(; l < length;) {\n const getCharacter = pattern[l];\n const character = getCharacter(value.slice(i));\n const {type, result, consumed} = character;\n if(type === 'required') {\n if(result) {\n c.push(...s, result);\n s.length = 0;\n ++l;\n\n if(character.partial) {\n m(value.length - i);\n break;\n }\n\n m(consumed);\n } else {\n if(!consumed) {\n break;\n }\n\n m(1);\n }\n } else if(type === 'optional') {\n if(result) {\n c.push(...s, result);\n s.length = 0;\n m(consumed);\n }\n\n ++l;\n } else if(type === 'formatting') {\n if(!pushRest && i >= value.length) {\n break;\n }\n\n s.push(result);\n ++l;\n m(consumed);\n }\n }\n\n if(pushRest) {\n c.push(...s);\n }\n\n return {\n value: c.join(''),\n selection: {\n selectionStart: f === null || value.length && options.selectionStart === value.length ? accumulateLengths(c) : f,\n selectionEnd: d === null || value.length && options.selectionEnd === value.length ? accumulateLengths(c) : d\n },\n autocorrectComplete: l === length\n };\n}\n\nexport default formatValueByPattern;\n","import {CARD_BRANDS, detectCardBrand} from './cardBrands';\nimport formatInputValueByPattern from './formatInputValueByPattern';\nimport NBSP from '../string/nbsp';\nimport replaceNonNumber from '../string/replaceNonNumber';\n\nexport type PatternValidationOptions = Partial<{\n ignoreIncomplete: boolean\n}>;\n\nconst nbspRegExp = new RegExp(NBSP, 'g');\n\nfunction makeValidationError(code?: string) {\n return code ? {\n type: 'invalid',\n code\n } : null;\n}\n\n// Luhn algorithm\nfunction validateCompleteCardNumber(card: string) {\n const t = '0'.charCodeAt(0);\n const n = card.length % 2;\n let a = 0;\n for(let i = card.length - 1; i >= 0; --i) {\n const c = n === (i % 2);\n let o = card.charCodeAt(i) - t;\n if(c) o *= 2;\n if(o > 9) o -= 9;\n a += o;\n }\n return !(a % 10);\n}\n\nfunction validateExpiry(year: number, month: number, options?: PatternValidationOptions) {\n const date = new Date(Date.now());\n const _year = year < 100 ? date.getFullYear() % 100 : date.getFullYear();\n const nextMonth = date.getMonth() + 1;\n\n if(isNaN(year) || isNaN(month)) {\n return options?.ignoreIncomplete ? null : 'incomplete';\n }\n\n if((year - _year) < 0) {\n return 'invalid_expiry_year_past';\n }\n\n if((year - _year) > 50) {\n return 'invalid_expiry_year';\n }\n\n return !(year - _year) && month < nextMonth ? 'invalid_expiry_month_past' : null;\n}\n\nfunction getCardInfoByNumber(card: string) {\n const sanitized = replaceNonNumber(card);\n const brand = detectCardBrand(card);\n return {\n sanitized,\n brand,\n minLength: CARD_BRANDS[brand].minLength\n };\n}\n\nfunction makeCardNumberError(str: string, length: number, ignoreIncomplete: boolean) {\n if(str.length >= length) {\n return validateCompleteCardNumber(str) || detectCardBrand(str) === 'mir' ? null : makeValidationError('invalid');\n }\n\n return ignoreIncomplete ? null : makeValidationError('incomplete');\n}\n\nexport function validateCardNumber(str: string, options: PatternValidationOptions = {}) {\n const {sanitized, minLength} = getCardInfoByNumber(str);\n return makeCardNumberError(sanitized, minLength, options.ignoreIncomplete);\n}\n\nexport function validateCardExpiry(str: string, options: PatternValidationOptions = {}) {\n const sanitized = str.replace(nbspRegExp, '').split(/ ?\\/ ?/);\n const [monthStr, yearStr = ''] = sanitized;\n const [month, year] = [monthStr, yearStr].map((str) => +str);\n const s = yearStr.length === 2 ? year % 100 : year;\n return yearStr.length < 2 || yearStr.length === 3 ? (options.ignoreIncomplete ? null : makeValidationError('incomplete')) : makeValidationError(validateExpiry(s, month, options));\n}\n\nexport function validateAnyIncomplete(formatted: ReturnType, str: string, options: PatternValidationOptions = {}) {\n return formatted.meta.autocorrectComplete || options.ignoreIncomplete ? null : makeValidationError('incomplete');\n}\n","const NBSP = '‎';\nexport default NBSP;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {TelegramWebViewEvent, TelegramWebViewEventCallback, TelegramWebViewEventMap} from '../types';\n\nconst weakMap: WeakMap = new WeakMap();\nwindow.addEventListener('message', (e) => {\n const callback = weakMap.get(e.source as Window);\n if(!callback) {\n return;\n }\n\n callback(JSON.parse(e.data));\n});\n\nexport default class TelegramWebView extends EventListenerBase<{\n [type in keyof TelegramWebViewEventMap]: (data: TelegramWebViewEventMap[type]) => void\n}> {\n public iframe: HTMLIFrameElement;\n\n constructor({url, sandbox}: {\n url: string,\n sandbox?: string\n }) {\n super(false);\n\n const iframe = this.iframe = document.createElement('iframe');\n iframe.src = url;\n if(sandbox) iframe.setAttribute('sandbox', sandbox);\n }\n\n public onMount() {\n weakMap.set(this.iframe.contentWindow, this.onTelegramWebViewEvent);\n }\n\n public destroy() {\n this.cleanup();\n weakMap.delete(this.iframe.contentWindow);\n }\n\n private onTelegramWebViewEvent = ({eventType, eventData}: TelegramWebViewEvent) => {\n if((eventData as any) === '') {\n eventData = undefined;\n }\n\n console.log('onTelegramWebViewEvent', eventType, eventData);\n this.dispatchEvent(eventType, eventData as any);\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport TelegramWebView from '../telegramWebView';\n\nexport function createVerificationIframe(options: ConstructorParameters[0]) {\n const result = new TelegramWebView({\n ...options,\n sandbox: 'allow-forms allow-scripts allow-same-origin allow-modals'\n });\n const {iframe} = result;\n iframe.allow = 'payment';\n iframe.classList.add('payment-verification');\n return result;\n}\n\nexport default class PopupPaymentVerification extends PopupElement<{\n finish: () => void\n}> {\n private telegramWebView: TelegramWebView;\n\n constructor(private url: string, private openPathAfter?: boolean) {\n super('popup-payment popup-payment-verification', {\n closable: true,\n overlayClosable: true,\n body: true,\n title: 'Checkout.WebConfirmation.Title'\n });\n\n this.d();\n }\n\n private d() {\n const telegramWebView = this.telegramWebView = createVerificationIframe({\n url: this.url\n });\n\n telegramWebView.addEventListener('web_app_open_tg_link', (e) => {\n this.dispatchEvent('finish');\n this.hide();\n if(this.openPathAfter) {\n appImManager.openUrl('https://t.me' + e.path_full);\n }\n });\n\n this.body.append(telegramWebView.iframe);\n this.show();\n telegramWebView.onMount();\n }\n\n protected destroy() {\n this.telegramWebView.destroy();\n return super.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport cardFormattingPatterns from '../../helpers/cards/cardFormattingPatterns';\nimport {detectUnifiedCardBrand} from '../../helpers/cards/cardBrands';\nimport formatInputValueByPattern from '../../helpers/cards/formatInputValueByPattern';\nimport {validateAnyIncomplete, validateCardExpiry, validateCardNumber} from '../../helpers/cards/validateCard';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport noop from '../../helpers/noop';\nimport {PaymentsPaymentForm} from '../../layer';\nimport {LangPackKey, _i18n} from '../../lib/langPack';\nimport CheckboxField from '../checkboxField';\nimport confirmationPopup from '../confirmationPopup';\nimport CountryInputField from '../countryInputField';\nimport InputField, {InputFieldOptions, InputState} from '../inputField';\nimport Row from '../row';\nimport {getPaymentBrandIconPath, PaymentButton, PaymentsCredentialsToken} from './payment';\nimport {createVerificationIframe} from './paymentVerification';\nimport {PasswordInputHelpers} from '../passwordInputField';\nimport SettingSection from '../settingSection';\nimport TelegramWebView from '../telegramWebView';\n\nexport type PaymentCardDetails = {\n cardNumber: string;\n cardholderName: string;\n expiryFull: string;\n expiryMonth: string;\n expiryYear: string;\n cvc: string;\n country: string;\n zip: string;\n save?: boolean;\n};\n\nexport type PaymentCardDetailsShort = {\n title: string,\n save?: boolean;\n icon?: string;\n};\n\nexport type PaymentCardDetailsResult = PaymentCardDetails | PaymentCardDetailsShort;\n\nexport class InputFieldCorrected extends InputField {\n private lastKeyDown: string;\n private lastTransformed: ReturnType;\n\n constructor(public options: InputFieldOptions & {\n formatMethod: typeof cardFormattingPatterns['cardNumber'],\n validateMethod?: typeof validateCardNumber,\n errorKeys?: {[code: string]: LangPackKey},\n optional?: boolean,\n onChange?: (transformed: InputFieldCorrected['lastTransformed']) => void,\n onKeyDown?: (e: KeyboardEvent) => void\n }) {\n super(options);\n\n // const handleIncomplete = (t?: any) => {\n // if(\n // (!lastTransformed.value && t) ||\n // lastTransformed.meta.autocorrectComplete ||\n // lastTransformed.meta.error ||\n // optional\n // ) {\n // return;\n // }\n\n\n // };\n\n this.input.addEventListener('keydown', this.onKeyDown);\n this.input.addEventListener('input', this.onInput);\n this.input.addEventListener('blur', this.onBlur);\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n this.lastKeyDown = e.key;\n this.options.onKeyDown?.(e);\n };\n\n private onInput = () => {\n const value = this.value;\n const deleting = this.lastKeyDown === 'Backspace' && (((this.lastTransformed && this.lastTransformed.value.length) || 0) - value.length) === 1;\n const result = this.lastTransformed = formatInputValueByPattern({\n value: value,\n getPattern: this.options.formatMethod,\n deleting,\n input: this.input\n });\n\n const transformedValue = result.value;\n if(transformedValue !== value) {\n this.setValueSilently(transformedValue);\n\n if(result.selection) {\n (this.input as HTMLInputElement).selectionStart = result.selection.selectionStart;\n (this.input as HTMLInputElement).selectionEnd = result.selection.selectionEnd;\n }\n }\n\n this.validateNew(transformedValue, {ignoreIncomplete: true/* !result.meta.autocorrectComplete */});\n\n this.options.onChange?.(result);\n };\n\n private onBlur = () => {\n const value = this.lastTransformed?.value;\n if(value) {\n this.validateNew(value);\n }\n };\n\n public update() {\n this.onInput();\n }\n\n public validate = () => {\n return this.validateNew();\n };\n\n public validateNew(\n value = this.lastTransformed?.value ?? '',\n t: any = {},\n justReturn?: boolean\n ) {\n let result: ReturnType;\n if(this.options.validateMethod) {\n result = this.options.validateMethod?.(value, t);\n } else {\n result = validateAnyIncomplete(this.lastTransformed, value, t);\n }\n\n if(result?.code) {\n const langPackKey: LangPackKey = this.options.errorKeys?.[result.code];\n !justReturn && this.setState(InputState.Error, langPackKey);\n return false;\n }\n\n !justReturn && this.setState(InputState.Neutral);\n return true;\n }\n}\n\nexport function handleInputFieldsOnChange(inputFields: (CountryInputField | InputField | InputFieldCorrected)[], _onChange: (valid: boolean) => void) {\n const onChange = () => {\n const valid = inputFields.every((inputField) => {\n return 'validateNew' in inputField ? inputField.validateNew(undefined, undefined, true) : inputField.isValid();\n });\n\n _onChange(valid);\n };\n\n inputFields.forEach((inputField) => {\n if(inputField instanceof InputFieldCorrected) {\n const original = inputField.options.onChange;\n inputField.options.onChange = (...args: any[]) => {\n // @ts-ignore\n original?.(...args);\n onChange();\n };\n\n if('update' in inputField) {\n inputField.update();\n }\n } else {\n inputField.input.addEventListener('input', onChange);\n }\n });\n\n return {validate: onChange};\n}\n\nexport function createCountryZipFields(country?: boolean, zip?: boolean) {\n let countryInputField: CountryInputField, postcodeInputField: InputFieldCorrected;\n if(country || zip) {\n if(country) countryInputField = new CountryInputField({\n noPhoneCodes: true,\n onCountryChange: () => {\n postcodeInputField?.update();\n },\n required: true,\n autocomplete: 'country'\n });\n if(zip) postcodeInputField = new InputFieldCorrected({\n label: 'PaymentShippingZipPlaceholder',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'postal-code',\n formatMethod: (/* ...args */) => {\n const {country} = countryInputField.getSelected();\n const iso2 = country?.iso2;\n return cardFormattingPatterns.postalCodeFromCountry(iso2 && iso2.toUpperCase());\n }\n });\n }\n\n return {countryInputField, postcodeInputField};\n}\n\nexport type PaymentsNativeProvider = 'stripe' | 'smartglocal';\nexport type PaymentsNativeParams = {\n need_country?: boolean,\n need_zip?: boolean,\n need_cardholder_name?: boolean,\n publishable_key?: string, // stripe\n public_token?: string, // smartglocal\n gpay_params: string,\n};\nconst SUPPORTED_NATIVE_PROVIDERS: Set = new Set(['stripe', 'smartglocal']);\n\nexport default class PopupPaymentCard extends PopupElement<{\n finish: (obj: {token: any, card: PaymentCardDetailsResult}) => void\n}> {\n protected telegramWebView: TelegramWebView;\n\n constructor(private paymentForm: PaymentsPaymentForm, private savedCard?: PaymentCardDetails) {\n super('popup-payment popup-payment-card', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: SUPPORTED_NATIVE_PROVIDERS.has(paymentForm.native_provider as PaymentsNativeProvider),\n title: 'PaymentCardInfo'\n });\n\n if(SUPPORTED_NATIVE_PROVIDERS.has(paymentForm.native_provider as PaymentsNativeProvider)) {\n this.d();\n } else {\n const telegramWebView = this.telegramWebView = createVerificationIframe({\n url: paymentForm.url\n });\n\n telegramWebView.addEventListener('payment_form_submit', (data) => {\n const cardOut = {title: data.title, save: false} as any as PaymentCardDetails;\n this.dispatchEvent('finish', {\n token: data.credentials,\n card: cardOut\n });\n\n this.hide();\n\n if(paymentForm.pFlags.can_save_credentials) {\n confirmationPopup({\n titleLangKey: 'PaymentCardSavePaymentInformation',\n descriptionLangKey: 'PaymentCardSavePaymentInformationInfoLine1',\n button: {\n langKey: 'Save'\n }\n }).then(() => {\n cardOut.save = true;\n }, noop);\n }\n });\n\n // putPreloader(this.body, true);\n this.body.append(telegramWebView.iframe);\n this.show();\n telegramWebView.onMount();\n }\n }\n\n protected destroy() {\n this.telegramWebView?.destroy();\n return super.destroy();\n }\n\n private d() {\n const savedCard = this.savedCard;\n const cardSection = new SettingSection({name: 'PaymentInfo.Card.Title', noDelimiter: true, noShadow: true});\n\n const nativeParams: PaymentsNativeParams = JSON.parse(this.paymentForm.native_params.data);\n\n let lastBrand: string, brandIconTempId = 0, lastBrandImg: HTMLImageElement;\n const setBrandIcon = (brand: string) => {\n if(lastBrand === brand) {\n return;\n }\n\n const tempId = ++brandIconTempId;\n lastBrand = brand;\n\n const path = getPaymentBrandIconPath(brand);\n if(!path) {\n if(lastBrandImg) {\n lastBrandImg.remove();\n lastBrandImg = undefined;\n }\n\n return;\n }\n\n const img = new Image();\n img.classList.add('input-field-icon');\n renderImageFromUrlPromise(img, path, false).then(() => {\n if(brandIconTempId !== tempId) {\n return;\n }\n\n if(lastBrandImg) {\n lastBrandImg.replaceWith(img);\n } else {\n cardInputField.container.append(img);\n }\n\n lastBrandImg = img;\n });\n };\n const cardInputField = new InputFieldCorrected({\n label: 'PaymentCardNumber',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-number',\n formatMethod: cardFormattingPatterns.cardNumber,\n validateMethod: validateCardNumber,\n errorKeys: {\n invalid: 'PaymentCard.Error.Invalid',\n incomplete: 'PaymentCard.Error.Incomplete'\n },\n onChange: (transformed) => {\n setBrandIcon(detectUnifiedCardBrand(transformed.value));\n cvcInputField.update(); // format cvc\n }\n });\n\n let nameInputField: InputField;\n if(nativeParams.need_cardholder_name) nameInputField = new InputField({\n label: 'Checkout.NewCard.CardholderNamePlaceholder',\n maxLength: 255,\n required: true,\n autocomplete: 'cc-name'\n });\n\n const expireInputField = new InputFieldCorrected({\n label: 'SecureId.Identity.Placeholder.ExpiryDate',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-exp',\n formatMethod: cardFormattingPatterns.cardExpiry,\n validateMethod: validateCardExpiry\n });\n\n // handle autocomplete: 01/2345 -> 01/45\n expireInputField.input.addEventListener('input', () => {\n let value = expireInputField.value;\n if(value.length < 5) {\n return;\n }\n\n const splitted = value.split('/');\n if(splitted[1].length !== 4) {\n return;\n }\n\n value = [splitted[0], splitted[1].slice(2)].join('/');\n expireInputField.setValueSilently(value);\n }, {capture: true});\n\n const cvcInputField = new InputFieldCorrected({\n labelText: 'CVC',\n plainText: true,\n inputMode: 'numeric',\n autocomplete: 'cc-csc',\n name: 'cvc',\n formatMethod: () => cardFormattingPatterns.cardCvc(cardInputField.value)\n // validateMethod: (...args) => _5AH3.a.cardCvc(cardInputField.value)(...args)\n });\n\n const passwordHelpers = new PasswordInputHelpers(cvcInputField.container, cvcInputField.input as HTMLInputElement);\n\n const switchFocusOrder: (InputFieldCorrected | InputField)[] = [\n cardInputField,\n expireInputField,\n cvcInputField,\n nameInputField\n ].filter(Boolean);\n switchFocusOrder.forEach((inputField) => {\n const onKeyDown = (e: KeyboardEvent) => {\n if(!inputField.value && e.key === 'Backspace') {\n const previousInputField = switchFocusOrder[switchFocusOrder.indexOf(inputField) - 1];\n if(previousInputField) {\n // previousInputField.value = previousInputField.value.slice(0, -1);\n placeCaretAtEnd(previousInputField.input, true);\n }\n }\n };\n\n if(inputField instanceof InputFieldCorrected) {\n inputField.options.onKeyDown = onKeyDown;\n\n const original = inputField.options.onChange;\n inputField.options.onChange = (transformed) => {\n original?.(transformed);\n\n if(document.activeElement === inputField.input && transformed.meta.autocorrectComplete) {\n for(let i = switchFocusOrder.indexOf(inputField), length = switchFocusOrder.length; i < length; ++i) {\n const nextInputField = switchFocusOrder[i];\n if(\n nextInputField instanceof InputFieldCorrected ?\n !nextInputField.validateNew(undefined, undefined, true) :\n !nextInputField.value\n ) {\n placeCaretAtEnd(nextInputField.input, true);\n break;\n }\n }\n }\n };\n } else {\n inputField.input.addEventListener('keydown', onKeyDown);\n }\n });\n\n const inputFieldsRow = document.createElement('div');\n inputFieldsRow.classList.add('input-fields-row');\n inputFieldsRow.append(expireInputField.container, cvcInputField.container);\n\n const form = document.createElement('form');\n form.append(...[\n cardInputField.container,\n inputFieldsRow,\n nameInputField?.container\n ].filter(Boolean))\n\n cardSection.content.append(form);\n\n let billingSection: SettingSection;\n // let saveCheckboxField: CheckboxField;\n const {countryInputField, postcodeInputField} = createCountryZipFields(nativeParams.need_country, nativeParams.need_zip);\n if(nativeParams.need_country || nativeParams.need_zip) {\n billingSection = new SettingSection({name: 'PaymentInfo.Billing.Title', noDelimiter: true, noShadow: true});\n\n // const inputFieldsRow2 = inputFieldsRow.cloneNode() as HTMLElement;\n // inputFieldsRow2.append(countryInputField.container, postcodeInputField.container);\n // billingSection.content.append(inputFieldsRow2);\n billingSection.content.append(...[countryInputField, postcodeInputField].filter(Boolean).map((i) => i.container));\n }\n\n const canSave = !!this.paymentForm.pFlags.can_save_credentials;\n const saveCheckboxField = new CheckboxField({\n text: 'PaymentCardSavePaymentInformation',\n checked: !!canSave\n });\n const saveRow = new Row({\n checkboxField: saveCheckboxField,\n subtitleLangKey: canSave ? 'PaymentCardSavePaymentInformationInfoLine1' : 'Checkout.2FA.Text'\n });\n\n if(!canSave) {\n saveRow.container.classList.add('is-disabled');\n }\n\n (billingSection || cardSection).content.append(saveRow.container);\n\n this.scrollable.append(...[cardSection, billingSection].filter(Boolean).map((s) => s.container));\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: async() => {\n const data: PaymentCardDetails = {\n cardNumber: cardInputField.value,\n expiryFull: expireInputField.value,\n expiryMonth: expireInputField.value.split('/')[0],\n expiryYear: expireInputField.value.split('/')[1],\n cvc: cvcInputField.value,\n\n cardholderName: nameInputField?.value,\n country: countryInputField?.value,\n zip: postcodeInputField?.value,\n\n save: saveCheckboxField?.checked\n };\n\n const nativeProvider: PaymentsNativeProvider = this.paymentForm.native_provider as any;\n let out: PaymentsCredentialsToken;\n if(nativeProvider === 'stripe') {\n const url = new URL('https://api.stripe.com/v1/tokens');\n url.search = new URLSearchParams({\n 'card[number]': data.cardNumber,\n 'card[exp_month]': data.expiryMonth,\n 'card[exp_year]': data.expiryYear,\n 'card[cvc]': data.cvc,\n 'card[address_zip]': data.zip,\n 'card[address_country]': data.country,\n 'card[name]': data.cardholderName\n }).toString();\n\n const response = await fetch(url.toString(), {\n method: 'POST',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'Authorization': `Bearer ${nativeParams.publishable_key}`\n }\n });\n\n out = await response.json();\n } else if(nativeProvider === 'smartglocal') {\n const params = {\n card: {\n number: data.cardNumber.replace(/[^\\d]+/g, ''),\n expiration_month: data.expiryMonth,\n expiration_year: data.expiryYear,\n security_code: data.cvc.replace(/[^\\d]+/g, '')\n }\n };\n\n const url = /* DEBUG_PAYMENT_SMART_GLOCAL */false ?\n 'https://tgb-playground.smart-glocal.com/cds/v1/tokenize/card' :\n 'https://tgb.smart-glocal.com/cds/v1/tokenize/card';\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json',\n 'X-PUBLIC-TOKEN': nativeParams.public_token\n },\n body: JSON.stringify(params)\n });\n\n const json: { // smartglocal\n data: {\n info: {\n card_network: string,\n card_type: string,\n masked_card_number: string\n },\n token: string\n },\n status: 'ok'\n } = await response.json();\n\n out = {type: 'card', token: json.data.token}\n }\n\n this.dispatchEvent('finish', {token: out, card: data});\n this.hide();\n }\n });\n\n const inputFields = ([\n cardInputField,\n nameInputField,\n expireInputField,\n cvcInputField,\n countryInputField,\n postcodeInputField\n ] as const).filter(Boolean);\n handleInputFieldsOnChange(inputFields, (valid) => {\n payButton.disabled = !valid;\n // payButton.classList.toggle('btn-disabled', !valid);\n });\n\n if(savedCard) {\n cardInputField.value = savedCard.cardNumber;\n expireInputField.value = savedCard.expiryFull;\n cvcInputField.value = savedCard.cvc;\n nameInputField && (nameInputField.value = savedCard.cardholderName);\n countryInputField && (countryInputField.value = savedCard.country);\n postcodeInputField && (postcodeInputField.value = savedCard.zip);\n }\n\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.show();\n\n if(!cardInputField.validateNew(undefined, undefined, true)) {\n placeCaretAtEnd(cardInputField.input);\n }\n }\n}\n","import formatValueByPattern from './formatValueByPattern';\n\nexport default function formatInputValueByPattern(options: {\n value: string,\n getPattern: Parameters[0],\n deleting?: boolean,\n input?: HTMLElement\n}) {\n const {value: originalValue, getPattern, deleting, input} = options;\n const pushRest = !deleting && !!originalValue.length;\n const result = formatValueByPattern(getPattern, originalValue, {\n selectionStart: input ? (input as HTMLInputElement).selectionStart : 0,\n selectionEnd: input ? (input as HTMLInputElement).selectionEnd : 0\n }, pushRest)\n const {value, selection} = result;\n\n return {\n value,\n meta: {\n autocorrectComplete: result.autocorrectComplete,\n empty: !value\n },\n selection\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {AccountPassword, AccountTmpPassword} from '../../layer';\nimport {InputState} from '../inputField';\nimport PasswordInputField from '../passwordInputField';\nimport SettingSection from '../settingSection';\nimport {PaymentButton} from './payment';\n\nexport default class PopupPaymentCardConfirmation extends PopupElement<{\n finish: (tmpPassword: AccountTmpPassword) => void\n}> {\n constructor(card: string, passwordState: AccountPassword) {\n super('popup-payment popup-payment-card-confirmation', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'Checkout.PasswordEntry.Title'\n });\n\n const section = new SettingSection({noDelimiter: true, noShadow: true, caption: 'Checkout.PasswordEntry.Text', captionArgs: [card]});\n const passwordInputField = new PasswordInputField({labelText: passwordState.hint});\n section.content.append(passwordInputField.container);\n this.scrollable.append(section.container);\n\n const onInput = () => {\n payButton.disabled = !passwordInputField.value;\n passwordInputField.setState(InputState.Neutral);\n };\n\n passwordInputField.input.addEventListener('input', onInput);\n\n const payButton = PaymentButton({\n key: 'Checkout.PasswordEntry.Pay',\n onClick: async() => {\n try {\n const inputCheckPassword = await this.managers.passwordManager.getInputCheckPassword(passwordInputField.value, passwordState);\n const tmpPassword = await this.managers.apiManager.invokeApi('account.getTmpPassword', {\n password: inputCheckPassword,\n period: 60\n });\n\n this.dispatchEvent('finish', tmpPassword);\n this.hide();\n } catch(err) {\n if((err as ApiError).type === 'PASSWORD_HASH_INVALID') {\n (err as ApiError).handled = true;\n passwordInputField.setError('PASSWORD_HASH_INVALID');\n }\n\n throw err;\n }\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n onInput();\n\n this.show();\n\n placeCaretAtEnd(passwordInputField.input);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {InputInvoice, PaymentRequestedInfo, PaymentsPaymentForm, PaymentsValidatedRequestedInfo} from '../../layer';\nimport matchEmail from '../../lib/richTextProcessor/matchEmail';\nimport CheckboxField from '../checkboxField';\nimport CountryInputField from '../countryInputField';\nimport InputField from '../inputField';\nimport Row from '../row';\nimport SettingSection from '../settingSection';\nimport TelInputField from '../telInputField';\nimport {PaymentButton} from './payment';\nimport {createCountryZipFields, handleInputFieldsOnChange, InputFieldCorrected} from './paymentCard';\n\nexport type PaymentShippingAddress = PaymentRequestedInfo;\n\ntype ShippingFocusField = 'name' | 'email' | 'phone';\n\nexport default class PopupPaymentShipping extends PopupElement<{\n finish: (o: {shippingAddress: PaymentShippingAddress, requestedInfo: PaymentsValidatedRequestedInfo}) => void\n}> {\n constructor(\n private paymentForm: PaymentsPaymentForm,\n private inputInvoice: InputInvoice,\n private focus?: ShippingFocusField\n ) {\n super('popup-payment popup-payment-shipping', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'PaymentShippingInfo'\n });\n\n this.d();\n }\n\n private d() {\n const paymentForm = this.paymentForm;\n const invoice = paymentForm.invoice;\n const savedInfo = this.paymentForm.saved_info;\n\n let addressSection: SettingSection,\n address1InputField: InputField,\n address2InputField: InputField,\n cityInputField: InputField,\n stateInputField: InputField,\n countryInputField: CountryInputField,\n postcodeInputField: InputFieldCorrected;\n if(invoice.pFlags.shipping_address_requested) {\n addressSection = new SettingSection({name: 'PaymentShippingAddress', noDelimiter: true, noShadow: true});\n address1InputField = new InputField({label: 'PaymentShippingAddress1Placeholder', maxLength: 64, required: true});\n address2InputField = new InputField({label: 'PaymentShippingAddress2Placeholder', maxLength: 64});\n cityInputField = new InputField({label: 'PaymentShippingCityPlaceholder', maxLength: 64, required: true});\n stateInputField = new InputField({label: 'PaymentShippingStatePlaceholder', maxLength: 64});\n const res = createCountryZipFields(true, true);\n countryInputField = res.countryInputField;\n postcodeInputField = res.postcodeInputField;\n\n addressSection.content.append(...[\n address1InputField,\n address2InputField,\n cityInputField,\n stateInputField,\n countryInputField,\n postcodeInputField\n ].filter(Boolean).map((inputField) => inputField.container));\n }\n\n let receiverSection: SettingSection;\n let nameInputField: InputField, emailInputField: InputField, telInputField: TelInputField;\n if([invoice.pFlags.name_requested, invoice.pFlags.email_requested, invoice.pFlags.phone_requested].includes(true)) {\n receiverSection = new SettingSection({name: 'PaymentShippingReceiver', noDelimiter: true, noShadow: true});\n\n const validateEmail = () => {\n const value = emailInputField.value;\n const match = matchEmail(value);\n if(!match || match[0].length !== value.length) {\n return false;\n }\n\n return true;\n };\n\n const validatePhone = () => {\n return !!telInputField.value.match(/\\d/);\n };\n\n if(invoice.pFlags.name_requested) nameInputField = new InputField({label: 'PaymentShippingName', maxLength: 256, required: true});\n if(invoice.pFlags.email_requested) emailInputField = new InputField({label: 'PaymentShippingEmailPlaceholder', maxLength: 64, required: true, validate: validateEmail});\n if(invoice.pFlags.phone_requested) telInputField = new TelInputField({required: true, validate: validatePhone});\n\n receiverSection.content.append(...[\n nameInputField,\n emailInputField,\n telInputField\n ].filter(Boolean).map((inputField) => inputField.container));\n }\n\n const saveCheckboxField = new CheckboxField({\n text: 'PaymentShippingSave',\n checked: true\n });\n const saveRow = new Row({\n checkboxField: saveCheckboxField,\n subtitleLangKey: 'PaymentShippingSaveInfo'\n });\n\n (receiverSection || addressSection).content.append(saveRow.container);\n\n this.scrollable.append(...[addressSection, receiverSection].filter(Boolean).map((section) => section.container));\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: async() => {\n const selectedCountry = countryInputField && countryInputField.getSelected().country;\n const data: PaymentShippingAddress = {\n _: 'paymentRequestedInfo',\n shipping_address: selectedCountry && {\n _: 'postAddress',\n street_line1: address1InputField.value,\n street_line2: address2InputField.value,\n city: cityInputField.value,\n state: stateInputField.value,\n // country: countryInputField.value,\n country_iso2: selectedCountry?.iso2,\n post_code: postcodeInputField.value\n },\n name: nameInputField?.value,\n email: emailInputField?.value,\n phone: telInputField?.value\n };\n\n try {\n const requestedInfo = await this.managers.appPaymentsManager.validateRequestedInfo(this.inputInvoice, data, saveCheckboxField?.checked);\n\n this.dispatchEvent('finish', {\n shippingAddress: data,\n requestedInfo\n });\n\n this.hide();\n } catch(err: any) {\n const errorMap: {[err: string]: InputField} = {\n ADDRESS_STREET_LINE1_INVALID: address1InputField,\n ADDRESS_STREET_LINE2_INVALID: address2InputField,\n ADDRESS_COUNTRY_INVALID: countryInputField,\n ADDRESS_CITY_INVALID: cityInputField,\n ADDRESS_STATE_INVALID: stateInputField,\n ADDRESS_POSTCODE_INVALID: postcodeInputField,\n\n REQ_INFO_NAME_INVALID: nameInputField,\n REQ_INFO_EMAIL_INVALID: emailInputField,\n REQ_INFO_PHONE_INVALID: telInputField\n };\n\n const inputField = errorMap[(err as ApiError).type];\n if(inputField) {\n inputField.setError();\n (err as any).handled = true;\n }\n\n throw err;\n }\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n if(savedInfo) {\n const shippingAddress = savedInfo.shipping_address;\n if(shippingAddress) {\n address1InputField.value = shippingAddress.street_line1;\n address2InputField.value = shippingAddress.street_line2;\n cityInputField.value = shippingAddress.city;\n stateInputField.value = shippingAddress.state;\n countryInputField.selectCountryByIso2(shippingAddress.country_iso2);\n postcodeInputField.value = shippingAddress.post_code;\n }\n\n savedInfo.name && nameInputField && (nameInputField.value = savedInfo.name);\n savedInfo.email && emailInputField && (emailInputField.value = savedInfo.email);\n savedInfo.phone && telInputField && (telInputField.value = savedInfo.phone);\n }\n\n const {validate} = handleInputFieldsOnChange([\n address1InputField,\n address2InputField,\n cityInputField,\n stateInputField,\n countryInputField,\n postcodeInputField,\n nameInputField,\n emailInputField,\n telInputField\n ].filter(Boolean), (valid) => {\n payButton.disabled = !valid;\n });\n\n validate();\n\n this.show();\n\n let focusField: InputField;\n if(this.focus) {\n const focusMap: {[field in ShippingFocusField]?: InputField} = {\n name: nameInputField,\n email: emailInputField,\n phone: telInputField\n };\n\n focusField = focusMap[this.focus];\n } else {\n focusField = address1InputField;\n }\n\n if(focusField) {\n placeCaretAtEnd(focusField.input);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport accumulate from '../../helpers/array/accumulate';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport {PaymentsPaymentForm, PaymentsValidatedRequestedInfo, ShippingOption} from '../../layer';\nimport RadioField from '../radioField';\nimport Row, {RadioFormFromRows} from '../row';\nimport SettingSection from '../settingSection';\nimport {PaymentButton} from './payment';\n\nexport default class PopupPaymentShippingMethods extends PopupElement<{\n finish: (shippingOption: ShippingOption) => void\n}> {\n constructor(\n private paymentForm: PaymentsPaymentForm,\n private requestedInfo: PaymentsValidatedRequestedInfo,\n private shippingOption: ShippingOption\n ) {\n super('popup-payment popup-payment-shipping-methods', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: 'PaymentShippingMethod'\n });\n\n this.d();\n }\n\n private d() {\n const section = new SettingSection({name: 'PaymentCheckoutShippingMethod', noDelimiter: true, noShadow: true});\n\n const rows = this.requestedInfo.shipping_options.map((shippingOption) => {\n return new Row({\n radioField: new RadioField({\n text: shippingOption.title,\n name: 'shipping-method',\n value: shippingOption.id\n }),\n subtitle: paymentsWrapCurrencyAmount(\n accumulate(shippingOption.prices.map(({amount}) => +amount), 0),\n this.paymentForm.invoice.currency\n )\n });\n });\n\n let lastShippingId: string;\n const form = RadioFormFromRows(rows, (value) => {\n lastShippingId = value;\n });\n\n if(this.shippingOption) {\n rows.find((row) => row.radioField.input.value === this.shippingOption.id).radioField.checked = true;\n } else {\n rows[0].radioField.checked = true;\n }\n\n section.content.append(form);\n\n this.scrollable.append(section.container);\n\n const payButton = PaymentButton({\n key: 'PaymentInfo.Done',\n onClick: () => {\n this.dispatchEvent('finish', this.requestedInfo.shipping_options.find((option) => option.id === lastShippingId));\n this.hide();\n }\n });\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport Currencies from '../../config/currencies';\nimport {FontFamily, FontSize} from '../../config/font';\nimport accumulate from '../../helpers/array/accumulate';\nimport getTextWidth from '../../helpers/canvas/getTextWidth';\nimport {detectUnifiedCardBrand} from '../../helpers/cards/cardBrands';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport ScrollSaver from '../../helpers/scrollSaver';\nimport tsNow from '../../helpers/tsNow';\nimport {AccountTmpPassword, InputInvoice, InputPaymentCredentials, LabeledPrice, Message, MessageMedia, PaymentRequestedInfo, PaymentSavedCredentials, PaymentsPaymentForm, PaymentsPaymentReceipt, PaymentsValidatedRequestedInfo, PostAddress, ShippingOption} from '../../layer';\nimport I18n, {i18n, LangPackKey, _i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport rootScope from '../../lib/rootScope';\nimport AvatarElement from '../avatar';\nimport Button from '../button';\nimport CheckboxField from '../checkboxField';\nimport PeerTitle from '../peerTitle';\nimport {putPreloader} from '../putPreloader';\nimport Row from '../row';\nimport {toastNew} from '../toast';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport wrapPhoto from '../wrappers/photo';\nimport PopupPaymentCard, {PaymentCardDetails, PaymentCardDetailsResult} from './paymentCard';\nimport PopupPaymentCardConfirmation from './paymentCardConfirmation';\nimport PopupPaymentShipping, {PaymentShippingAddress} from './paymentShipping';\nimport PopupPaymentShippingMethods from './paymentShippingMethods';\nimport PopupPaymentVerification from './paymentVerification';\n\nconst iconPath = 'assets/img/';\nconst icons = [\n 'amex',\n 'card',\n 'diners',\n 'discover',\n 'jcb',\n 'mastercard',\n 'visa',\n 'unionpay',\n 'mir',\n 'logo'\n];\n\nexport function getPaymentBrandIconPath(brand: string) {\n if(!icons.includes(brand)) {\n return;\n }\n\n return `${iconPath}${brand}.svg`;\n}\n\nexport function PaymentButton(options: {\n onClick: () => Promise | void,\n key?: LangPackKey,\n textEl?: I18n.IntlElement\n}) {\n const textEl = options.textEl ?? new I18n.IntlElement({key: options.key ?? 'PaymentInfo.Done'});\n const key = textEl.key;\n const payButton = Button('btn-primary btn-color-primary payment-item-pay');\n payButton.append(textEl.element);\n attachClickEvent(payButton, async() => {\n const result = options.onClick();\n if(!(result instanceof Promise)) {\n return;\n }\n\n const d = putPreloader(payButton);\n const toggle = toggleDisability([payButton], true);\n textEl.compareAndUpdate({key: 'PleaseWait'});\n try {\n await result;\n } catch(err) {\n if(!(err as any).handled) {\n console.error('payment button error', err);\n }\n\n toggle();\n textEl.compareAndUpdate({key});\n d.remove();\n }\n });\n return payButton;\n}\n\nexport type PaymentsCredentialsToken = {type: 'card', token?: string, id?: string};\n\nexport default class PopupPayment extends PopupElement {\n private tipButtonsMap: Map;\n\n constructor(\n private message: Message.message,\n private inputInvoice: InputInvoice,\n private paymentForm?: PaymentsPaymentForm | PaymentsPaymentReceipt,\n private isReceipt?: boolean\n ) {\n super('popup-payment', {\n closable: true,\n overlayClosable: true,\n body: true,\n scrollable: true,\n title: true\n });\n\n this.tipButtonsMap = new Map();\n this.d().catch((err) => {\n console.error('payment popup error', err);\n this.hide();\n });\n }\n\n private async d() {\n this.element.classList.add('is-loading');\n this.show();\n\n let confirmed = false;\n const onConfirmed = () => {\n if(confirmed) {\n return;\n }\n\n confirmed = true;\n if(popupPaymentVerification) {\n popupPaymentVerification.hide();\n }\n\n this.hide();\n };\n\n let {paymentForm, message} = this;\n\n if(message) {\n this.listenerSetter.add(rootScope)('payment_sent', ({peerId, mid}) => {\n if(message.peerId === peerId && message.mid === mid) {\n onConfirmed();\n }\n });\n }\n\n const mediaInvoice = message?.media as MessageMedia.messageMediaInvoice;\n const isReceipt = this.isReceipt ??\n (\n mediaInvoice ?\n !!mediaInvoice.receipt_msg_id || mediaInvoice.extended_media?._ === 'messageExtendedMedia' :\n paymentForm._ === 'payments.paymentReceipt'\n );\n const isTest = mediaInvoice ? mediaInvoice.pFlags.test : paymentForm.invoice.pFlags.test;\n\n const photo = mediaInvoice ? mediaInvoice.photo : paymentForm.photo;\n const title = mediaInvoice ? mediaInvoice.title : paymentForm.title;\n const description = mediaInvoice ? mediaInvoice.description : paymentForm.description;\n\n _i18n(this.title, isReceipt ? 'PaymentReceipt' : 'PaymentCheckout');\n if(isTest) {\n this.title.append(' (Test)');\n }\n\n const className = 'payment-item';\n\n const itemEl = document.createElement('div');\n itemEl.classList.add(className);\n\n const detailsClassName = className + '-details';\n const details = document.createElement('div');\n details.classList.add(detailsClassName);\n\n let photoEl: HTMLElement;\n if(photo) {\n photoEl = document.createElement('div');\n photoEl.classList.add(detailsClassName + '-photo', 'media-container-contain');\n wrapPhoto({\n photo: photo,\n container: photoEl,\n boxWidth: 100,\n boxHeight: 100,\n size: {_: 'photoSizeEmpty', type: ''}\n });\n details.append(photoEl);\n }\n\n const linesClassName = detailsClassName + '-lines';\n const linesEl = document.createElement('div');\n linesEl.classList.add(linesClassName);\n\n const titleEl = document.createElement('div');\n titleEl.classList.add(linesClassName + '-title');\n\n const descriptionEl = document.createElement('div');\n descriptionEl.classList.add(linesClassName + '-description');\n\n const botName = document.createElement('div');\n botName.classList.add(linesClassName + '-bot-name');\n\n linesEl.append(titleEl, descriptionEl, botName);\n\n setInnerHTML(titleEl, wrapEmojiText(title));\n setInnerHTML(descriptionEl, wrapEmojiText(description));\n\n const peerTitle = new PeerTitle();\n botName.append(peerTitle.element);\n\n details.append(linesEl);\n itemEl.append(details);\n this.scrollable.append(itemEl);\n\n const preloaderContainer = document.createElement('div');\n preloaderContainer.classList.add(className + '-preloader-container');\n const preloader = putPreloader(preloaderContainer, true);\n this.scrollable.container.append(preloaderContainer);\n\n const inputInvoice = this.inputInvoice;\n if(!paymentForm) {\n if(isReceipt) paymentForm = await this.managers.appPaymentsManager.getPaymentReceipt(message.peerId, mediaInvoice.receipt_msg_id || (inputInvoice as InputInvoice.inputInvoiceMessage).msg_id);\n else paymentForm = await this.managers.appPaymentsManager.getPaymentForm(inputInvoice);\n this.paymentForm = paymentForm;\n }\n\n let savedInfo = (paymentForm as PaymentsPaymentForm).saved_info || (paymentForm as PaymentsPaymentReceipt).info;\n const savedCredentials = (paymentForm as PaymentsPaymentForm).saved_credentials?.[0];\n let [lastRequestedInfo, passwordState, providerPeerTitle] = await Promise.all([\n !isReceipt && savedInfo && this.managers.appPaymentsManager.validateRequestedInfo(inputInvoice, savedInfo),\n savedCredentials && this.managers.passwordManager.getState(),\n wrapPeerTitle({peerId: paymentForm.provider_id.toPeerId()})\n ]);\n\n // console.log(paymentForm, lastRequestedInfo);\n\n await peerTitle.update({peerId: paymentForm.bot_id.toPeerId()});\n preloaderContainer.remove();\n this.element.classList.remove('is-loading');\n\n const wrapAmount = (amount: string | number, skipSymbol?: boolean) => {\n return paymentsWrapCurrencyAmount(amount, currency, skipSymbol);\n };\n\n const {invoice} = paymentForm;\n const currency = invoice.currency;\n\n const isRecurring = invoice.pFlags.recurring && !isReceipt;\n\n await peerTitle.update({peerId: paymentForm.bot_id.toPeerId()});\n const peerTitle2 = isRecurring ? await wrapPeerTitle({peerId: paymentForm.bot_id.toPeerId()}) : undefined;\n preloaderContainer.remove();\n this.element.classList.remove('is-loading');\n\n const makeLabel = () => {\n const labelEl = document.createElement('div');\n labelEl.classList.add(pricesClassName + '-price');\n\n const left = document.createElement('span');\n const right = document.createElement('span');\n labelEl.append(left, right);\n return {label: labelEl, left, right};\n };\n\n const pricesClassName = className + '-prices';\n const prices = document.createElement('div');\n prices.classList.add(pricesClassName);\n const makePricesElements = (prices: LabeledPrice[]) => {\n return prices.map((price) => {\n const {amount, label} = price;\n\n const _label = makeLabel();\n _label.left.textContent = label;\n\n const wrappedAmount = wrapAmount(amount);\n _label.right.textContent = wrappedAmount;\n\n return _label.label;\n });\n };\n\n const pricesElements = makePricesElements(invoice.prices);\n\n let getTipsAmount = (): number => 0;\n let shippingAmount = 0;\n\n const getTotalTotal = () => totalAmount + getTipsAmount() + shippingAmount;\n const setTotal = () => {\n const wrapped = wrapAmount(getTotalTotal());\n totalLabel.right.textContent = wrapped;\n payI18n.compareAndUpdate({\n key: 'PaymentCheckoutPay',\n args: [wrapped]\n });\n };\n\n const payI18n = new I18n.IntlElement();\n\n const totalLabel = makeLabel();\n totalLabel.label.classList.add('is-total');\n _i18n(totalLabel.left, 'PaymentTransactionTotal');\n const totalAmount = accumulate(invoice.prices.map(({amount}) => +amount), 0);\n\n const canTip = (invoice.max_tip_amount !== undefined && !isReceipt) || !!(paymentForm as PaymentsPaymentReceipt).tip_amount;\n if(canTip) {\n const tipsClassName = className + '-tips';\n\n const currencyData = Currencies[currency];\n\n getTipsAmount = () => +getInputValue().replace(/\\D/g, '');\n\n const getInputValue = () => {\n // return input.textContent;\n return input.value;\n };\n\n const setInputWidth = () => {\n const width = getTextWidth(getInputValue(), `500 ${FontSize} ${FontFamily}`);\n input.style.width = width + 'px';\n };\n\n const setInputValue = (amount: string | number) => {\n amount = Math.min(+amount, +invoice.max_tip_amount);\n const wrapped = wrapAmount(amount, true);\n\n input.value = wrapped;\n // input.textContent = wrapped;\n if(document.activeElement === input) {\n placeCaretAtEnd(input);\n }\n\n unsetActiveTip && unsetActiveTip();\n const tipEl = this.tipButtonsMap.get(amount);\n if(tipEl) {\n tipEl.classList.add('active');\n }\n\n setInputWidth();\n setTotal();\n };\n\n const tipsLabel = makeLabel();\n _i18n(tipsLabel.left, isReceipt ? 'PaymentTip' : 'PaymentTipOptional');\n const input = document.createElement('input');\n input.type = 'tel';\n // const input: HTMLElement = document.createElement('div');\n // input.contentEditable = 'true';\n input.classList.add('input-clear', tipsClassName + '-input');\n tipsLabel.right.append(input);\n\n if(!isReceipt) {\n tipsLabel.label.style.cursor = 'text';\n } else {\n tipsLabel.label.classList.add('disable-hover');\n }\n\n tipsLabel.label.addEventListener('mousedown', (e) => {\n if(!findUpAsChild(e.target as HTMLElement, input)) {\n placeCaretAtEnd(input);\n }\n });\n\n const haveToIgnoreEvents = input instanceof HTMLInputElement ? 1 : 2;\n const onSelectionChange = () => {\n if(ignoreNextSelectionChange) {\n --ignoreNextSelectionChange;\n return;\n }\n\n // setTimeout(() => {\n ignoreNextSelectionChange = haveToIgnoreEvents;\n placeCaretAtEnd(input);\n // }, 0);\n };\n\n const onFocus = () => {\n // cancelEvent(e);\n setTimeout(() => {\n ignoreNextSelectionChange = haveToIgnoreEvents;\n placeCaretAtEnd(input);\n document.addEventListener('selectionchange', onSelectionChange);\n }, 0);\n };\n\n const onFocusOut = () => {\n input.addEventListener('focus', onFocus, {once: true});\n document.removeEventListener('selectionchange', onSelectionChange);\n };\n\n let ignoreNextSelectionChange: number;\n input.addEventListener('focusout', onFocusOut);\n onFocusOut();\n\n input.addEventListener('input', () => {\n setInputValue(getTipsAmount());\n });\n\n const s = [currencyData.symbol, currencyData.space_between ? ' ' : ''];\n if(!currencyData.symbol_left) s.reverse();\n tipsLabel.right[currencyData.symbol_left ? 'prepend' : 'append'](s.join(''));\n\n pricesElements.push(tipsLabel.label);\n\n //\n let unsetActiveTip: () => void;\n if(!isReceipt) {\n const tipsEl = document.createElement('div');\n tipsEl.classList.add(tipsClassName);\n\n const tipClassName = tipsClassName + '-tip';\n const tipButtons = invoice.suggested_tip_amounts.map((tipAmount) => {\n const button = Button(tipClassName, {noRipple: true});\n button.textContent = wrapAmount(tipAmount);\n\n this.tipButtonsMap.set(+tipAmount, button);\n return button;\n });\n\n unsetActiveTip = () => {\n const prevTipEl = tipsEl.querySelector('.active');\n if(prevTipEl) {\n prevTipEl.classList.remove('active');\n }\n };\n\n attachClickEvent(tipsEl, (e) => {\n const tipEl = findUpClassName(e.target, tipClassName);\n if(!tipEl) {\n return;\n }\n\n let tipAmount = 0;\n if(tipEl.classList.contains('active')) {\n tipEl.classList.remove('active');\n } else {\n unsetActiveTip();\n tipEl.classList.add('active');\n\n for(const [amount, el] of this.tipButtonsMap) {\n if(el === tipEl) {\n tipAmount = amount;\n break;\n }\n }\n }\n\n setInputValue(tipAmount);\n });\n\n setInputValue(0);\n\n tipsEl.append(...tipButtons);\n pricesElements.push(tipsEl);\n } else {\n setInputValue((paymentForm as PaymentsPaymentReceipt).tip_amount);\n }\n } else {\n setTotal();\n }\n\n pricesElements.push(totalLabel.label);\n\n prices.append(...pricesElements);\n itemEl.append(prices);\n\n // /\n\n const setRowIcon = async(row: Row, icon?: string) => {\n const img = document.createElement('img');\n img.classList.add('media-photo');\n await renderImageFromUrlPromise(img, getPaymentBrandIconPath(icon));\n let container = row.media;\n if(!container) {\n container = row.createMedia('small');\n container.classList.add('media-container-cover');\n container.append(img);\n } else {\n replaceContent(container, img);\n }\n\n row.container.classList.remove('row-with-icon');\n };\n\n const createRow = (options: ConstructorParameters[0]) => {\n if(options.titleLangKey) {\n options.subtitleLangKey = options.titleLangKey;\n }\n\n options.noWrap = true;\n const row = new Row(options);\n row.container.classList.add(className + '-row');\n\n if(options.titleLangKey) {\n row.subtitle.classList.add('hide');\n }\n\n return row;\n };\n\n const setRowTitle = (row: Row, textContent: string) => {\n row.title.textContent = textContent;\n if(!textContent) {\n const e = I18n.weakMap.get(row.subtitle.firstElementChild as HTMLElement) as I18n.IntlElement;\n row.title.append(i18n(e.key));\n }\n\n row.subtitle.classList.toggle('hide', !textContent);\n };\n\n const setCardSubtitle = (card: PaymentCardDetailsResult) => {\n let brand: string;\n let str: string;\n let icon: string;\n if('title' in card) {\n brand = card.title.split(' ').shift();\n str = card.title;\n icon = card.icon;\n } else {\n brand = detectUnifiedCardBrand(card.cardNumber);\n str = brand + ' *' + card.cardNumber.split(' ').pop();\n }\n\n methodRow.title.classList.remove('tgico', 'tgico-card_outline');\n setRowIcon(methodRow, icon || brand.toLowerCase());\n setRowTitle(methodRow, str);\n };\n\n const onMethodClick = () => {\n new PopupPaymentCard(paymentForm as PaymentsPaymentForm, previousCardDetails as PaymentCardDetails).addEventListener('finish', ({token, card}) => {\n previousToken = token, previousCardDetails = card;\n\n setCardSubtitle(card);\n });\n };\n\n let previousCardDetails: PaymentCardDetailsResult, previousToken: PaymentsCredentialsToken;\n const methodRow = createRow({\n titleLangKey: 'PaymentCheckoutMethod',\n clickable: isReceipt ? undefined : onMethodClick,\n icon: 'card_outline'\n });\n\n methodRow.container.classList.add(className + '-method-row');\n\n if(savedCredentials) {\n setCardSubtitle(savedCredentials);\n } else if((paymentForm as PaymentsPaymentReceipt).credentials_title) {\n setCardSubtitle({title: (paymentForm as PaymentsPaymentReceipt).credentials_title});\n }\n\n const providerRow = createRow({\n title: providerPeerTitle,\n subtitleLangKey: 'PaymentCheckoutProvider'\n });\n\n const providerAvatar = new AvatarElement();\n providerAvatar.classList.add('avatar-32');\n providerRow.createMedia('small').append(providerAvatar);\n /* await */ providerAvatar.updateWithOptions({peerId: paymentForm.provider_id.toPeerId()});\n\n let shippingAddressRow: Row, shippingNameRow: Row, shippingEmailRow: Row, shippingPhoneRow: Row, shippingMethodRow: Row;\n let lastShippingOption: ShippingOption, onShippingAddressClick: (focus?: ConstructorParameters[2]) => void, onShippingMethodClick: () => void;\n const setShippingTitle = invoice.pFlags.shipping_address_requested ? (shippingAddress?: PaymentShippingAddress) => {\n if(!shippingAddress) {\n shippingMethodRow.subtitle.classList.add('hide');\n replaceContent(shippingMethodRow.title, i18n('PaymentShippingAddress'));\n return;\n }\n\n const postAddress = shippingAddress.shipping_address;\n setRowTitle(shippingAddressRow, [postAddress.city, postAddress.street_line1, postAddress.street_line2].filter(Boolean).join(', '));\n\n shippingMethodRow.container.classList.toggle('hide', !lastRequestedInfo && !isReceipt);\n } : undefined;\n\n const setShippingInfo = (info: PaymentRequestedInfo) => {\n setShippingTitle && setShippingTitle(info);\n shippingNameRow && setRowTitle(shippingNameRow, info.name);\n shippingEmailRow && setRowTitle(shippingEmailRow, info.email);\n shippingPhoneRow && setRowTitle(shippingPhoneRow, info.phone && ('+' + formatPhoneNumber(info.phone).formatted));\n };\n\n if(!isReceipt) {\n onShippingAddressClick = (focus) => {\n new PopupPaymentShipping(paymentForm as PaymentsPaymentForm, inputInvoice, focus).addEventListener('finish', ({shippingAddress, requestedInfo}) => {\n lastRequestedInfo = requestedInfo;\n savedInfo = (paymentForm as PaymentsPaymentForm).saved_info = shippingAddress;\n setShippingInfo(shippingAddress);\n });\n };\n }\n\n if(invoice.pFlags.shipping_address_requested) {\n const setShippingOption = (shippingOption?: ShippingOption) => {\n const scrollSaver = new ScrollSaver(this.scrollable, undefined, true);\n scrollSaver.save();\n if(lastShippingPricesElements) {\n lastShippingPricesElements.forEach((node) => node.remove());\n }\n\n if(!shippingOption) {\n shippingAmount = 0;\n\n setTotal();\n scrollSaver.restore();\n this.onContentUpdate();\n return;\n }\n\n lastShippingOption = shippingOption;\n setRowTitle(shippingMethodRow, shippingOption.title);\n\n shippingAmount = accumulate(shippingOption.prices.map(({amount}) => +amount), 0);\n lastShippingPricesElements = makePricesElements(shippingOption.prices);\n let l = totalLabel.label;\n if(canTip) {\n l = l.previousElementSibling as any;\n if(!isReceipt) {\n l = l.previousElementSibling as any;\n }\n }\n\n lastShippingPricesElements.forEach((element) => l.parentElement.insertBefore(element, l));\n\n setTotal();\n scrollSaver.restore();\n this.onContentUpdate();\n };\n\n shippingAddressRow = createRow({\n icon: 'location',\n titleLangKey: 'PaymentShippingAddress',\n clickable: !isReceipt && onShippingAddressClick.bind(null, undefined)\n });\n\n let lastShippingPricesElements: HTMLElement[];\n shippingMethodRow = createRow({\n icon: 'shipping',\n titleLangKey: 'PaymentCheckoutShippingMethod',\n clickable: !isReceipt && (onShippingMethodClick = () => {\n new PopupPaymentShippingMethods(paymentForm as PaymentsPaymentForm, lastRequestedInfo, lastShippingOption).addEventListener('finish', (shippingOption) => {\n setShippingOption(shippingOption);\n });\n })\n });\n\n shippingMethodRow.container.classList.add('hide');\n\n const shippingOption = (paymentForm as PaymentsPaymentReceipt).shipping;\n if(shippingOption) {\n setShippingOption(shippingOption);\n }\n }\n\n if(invoice.pFlags.name_requested) {\n shippingNameRow = createRow({\n icon: 'newprivate',\n titleLangKey: 'PaymentCheckoutName',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'name')\n });\n }\n\n if(invoice.pFlags.email_requested) {\n shippingEmailRow = createRow({\n icon: 'mention',\n titleLangKey: 'PaymentShippingEmailPlaceholder',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'email')\n });\n }\n\n if(invoice.pFlags.phone_requested) {\n shippingPhoneRow = createRow({\n icon: 'phone',\n titleLangKey: 'PaymentCheckoutPhoneNumber',\n clickable: !isReceipt && onShippingAddressClick.bind(null, 'phone')\n });\n }\n\n if(savedInfo) {\n setShippingInfo(savedInfo);\n }\n\n const rows = [\n methodRow,\n providerRow,\n shippingAddressRow,\n shippingMethodRow,\n shippingNameRow,\n shippingEmailRow,\n shippingPhoneRow\n ].filter(Boolean);\n\n const acceptTermsCheckboxField = isRecurring && new CheckboxField({\n text: 'Payments.Recurrent.Accept',\n textArgs: [wrapRichText(invoice.recurring_terms_url), peerTitle2]\n });\n\n const acceptTermsRow = isRecurring && createRow({\n checkboxField: acceptTermsCheckboxField\n });\n\n const recurringElements = isRecurring ? [document.createElement('hr'), acceptTermsRow.container] : [];\n\n this.scrollable.append(...[\n document.createElement('hr'),\n ...rows.map((row) => row.container),\n ...recurringElements\n ].filter(Boolean));\n\n // /\n let popupPaymentVerification: PopupPaymentVerification, lastTmpPasword: AccountTmpPassword;\n const onClick = () => {\n const missingInfo = invoice.pFlags.name_requested && !savedInfo?.name ? 'name' : (invoice.pFlags.email_requested && !savedInfo?.email ? 'email' : (invoice.pFlags.phone_requested && !savedInfo?.phone ? 'phone' : undefined));\n if(invoice.pFlags.shipping_address_requested) {\n if(!lastRequestedInfo) {\n onShippingAddressClick();\n return;\n } else if(!lastShippingOption) {\n onShippingMethodClick();\n return;\n }\n } else if(missingInfo) {\n onShippingAddressClick(missingInfo);\n return;\n }\n\n if(!previousCardDetails && !lastTmpPasword) {\n if(!savedCredentials) {\n onMethodClick();\n return;\n }\n\n Promise.resolve(passwordState ?? this.managers.passwordManager.getState()).then((_passwordState) => {\n new PopupPaymentCardConfirmation(savedCredentials.title, _passwordState).addEventListener('finish', (tmpPassword) => {\n passwordState = undefined;\n lastTmpPasword = tmpPassword;\n simulateClickEvent(payButton);\n\n // * reserve 5 seconds\n const diff = tmpPassword.valid_until - tsNow(true) - 5;\n setTimeout(() => {\n if(lastTmpPasword === tmpPassword) {\n lastTmpPasword = undefined;\n }\n }, diff * 1000);\n });\n });\n\n return;\n }\n\n return Promise.resolve().then(async() => {\n const credentials: InputPaymentCredentials = lastTmpPasword ? {\n _: 'inputPaymentCredentialsSaved',\n id: savedCredentials.id,\n tmp_password: lastTmpPasword.tmp_password\n } : {\n _: 'inputPaymentCredentials',\n data: {\n _: 'dataJSON',\n data: JSON.stringify(previousToken.token ? previousToken : {type: previousToken.type, id: previousToken.id})\n },\n pFlags: {\n save: previousCardDetails.save || undefined\n }\n };\n\n try {\n const paymentResult = await this.managers.appPaymentsManager.sendPaymentForm(\n inputInvoice,\n (paymentForm as PaymentsPaymentForm).form_id,\n lastRequestedInfo?.id,\n lastShippingOption?.id,\n credentials,\n getTipsAmount()\n );\n\n if(paymentResult._ === 'payments.paymentResult') {\n onConfirmed();\n } else {\n popupPaymentVerification = new PopupPaymentVerification(paymentResult.url, !mediaInvoice.extended_media);\n popupPaymentVerification.addEventListener('finish', () => {\n popupPaymentVerification = undefined;\n\n onConfirmed();\n });\n await new Promise((resolve, reject) => {\n popupPaymentVerification.addEventListener('close', () => {\n popupPaymentVerification = undefined;\n if(confirmed) {\n resolve();\n } else {\n const err = new Error('payment not finished');\n (err as ApiError).handled = true;\n reject(err);\n }\n });\n });\n }\n } catch(err) {\n if((err as ApiError).type === 'BOT_PRECHECKOUT_TIMEOUT') {\n toastNew({langPackKey: 'Error.AnError'});\n (err as ApiError).handled = true;\n } else if((err as ApiError).type === 'TMP_PASSWORD_INVALID') {\n passwordState = lastTmpPasword = undefined;\n simulateClickEvent(payButton);\n (err as ApiError).handled = true;\n }\n\n throw err;\n }\n });\n };\n\n const onChange = () => {\n payButton.disabled = !!(acceptTermsCheckboxField && !acceptTermsCheckboxField.checked);\n };\n\n let payButton: HTMLButtonElement;\n if(isReceipt) {\n payButton = PaymentButton({\n onClick: () => this.hide(),\n key: 'Done'\n });\n } else {\n payButton = PaymentButton({\n onClick: onClick,\n textEl: payI18n\n });\n }\n\n onChange();\n if(acceptTermsCheckboxField) {\n acceptTermsCheckboxField.input.addEventListener('change', onChange);\n }\n\n this.body.append(this.btnConfirmOnEnter = payButton);\n\n this.onContentUpdate();\n }\n}\n","/*\nThis file is part of Telegram Desktop,\nthe official desktop application for the Telegram messaging service.\nFor license and copyright information please follow this link:\nhttps://github.com/telegramdesktop/tdesktop/blob/master/LEGAL\n*/\n\nimport accumulate from '../helpers/array/accumulate';\nimport clamp from '../helpers/number/clamp';\n\ntype Size = {w: number, h: number};\nexport type GroupMediaLayout = {\n geometry: {\n x: number,\n y: number,\n width: number,\n height: number\n },\n sides: number\n};\ntype Attempt = {\n lineCounts: number[],\n heights: number[]\n};\nexport const RectPart = {\n None: 0,\n Top: 1,\n Right: 2,\n Bottom: 4,\n Left: 8\n};\n\n// https://github.com/telegramdesktop/tdesktop/blob/4669c07dc5335cbf4795bbbe5b0ab7c007b9aee2/Telegram/SourceFiles/ui/grouped_layout.cpp\nexport class Layouter {\n private count: number;\n private ratios: number[];\n private proportions: string;\n private averageRatio: number;\n private maxSizeRatio: number;\n\n constructor(private sizes: Size[], private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth) {\n this.count = sizes.length;\n this.ratios = Layouter.countRatios(sizes);\n this.proportions = Layouter.countProportions(this.ratios);\n this.averageRatio = accumulate(this.ratios, 1) / this.count; // warn\n this.maxSizeRatio = maxWidth / this.maxHeight;\n }\n\n public layout(): GroupMediaLayout[] {\n if(!this.count) return [];\n // else if(this.count === 1) return this.layoutOne();\n\n if(this.count >= 5 || this.ratios.find((r) => r > 2)) {\n return new ComplexLayouter(this.ratios, this.averageRatio, this.maxWidth, this.minWidth, this.spacing).layout();\n }\n\n if(this.count === 2) return this.layoutTwo();\n else if(this.count === 3) return this.layoutThree();\n return this.layoutFour();\n }\n\n private layoutTwo(): ReturnType {\n if((this.proportions === 'ww') &&\n (this.averageRatio > 1.4 * this.maxSizeRatio) &&\n (this.ratios[1] - this.ratios[0] < 0.2)) {\n return this.layoutTwoTopBottom();\n } else if(this.proportions === 'ww' || this.proportions === 'qq') {\n return this.layoutTwoLeftRightEqual();\n }\n return this.layoutTwoLeftRight();\n }\n\n private layoutThree(): ReturnType {\n // console.log('layoutThree:', this);\n if(this.proportions[0] === 'n') {\n return this.layoutThreeLeftAndOther();\n }\n return this.layoutThreeTopAndOther();\n }\n\n private layoutFour(): ReturnType {\n if(this.proportions[0] === 'w') {\n return this.layoutFourTopAndOther();\n }\n return this.layoutFourLeftAndOther();\n }\n\n private layoutTwoTopBottom(): ReturnType {\n const width = this.maxWidth;\n const height = Math.round(Math.min(\n width / this.ratios[0],\n Math.min(\n width / this.ratios[1],\n (this.maxHeight - this.spacing) / 2)));\n\n return [\n {\n geometry: {x: 0, y: 0, width, height},\n sides: RectPart.Left | RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: 0, y: height + this.spacing, width, height},\n sides: RectPart.Left | RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private layoutTwoLeftRightEqual(): ReturnType {\n const width = (this.maxWidth - this.spacing) / 2;\n const height = Math.round(Math.min(\n width / this.ratios[0],\n Math.min(width / this.ratios[1], this.maxHeight * 1)));\n\n return [\n {\n geometry: {x: 0, y: 0, width, height},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: width + this.spacing, y: 0, width, height},\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\n }\n ];\n }\n\n private layoutTwoLeftRight(): ReturnType {\n const minimalWidth = Math.round(this.minWidth * 1.5);\n const secondWidth = Math.min(\n Math.round(Math.max(\n 0.4 * (this.maxWidth - this.spacing),\n (this.maxWidth - this.spacing) / this.ratios[0] /\n (1 / this.ratios[0] + 1 / this.ratios[1]))),\n this.maxWidth - this.spacing - minimalWidth);\n const firstWidth = this.maxWidth -\n secondWidth -\n this.spacing;\n const height = Math.min(\n this.maxHeight,\n Math.round(Math.min(\n firstWidth / this.ratios[0],\n secondWidth / this.ratios[1])));\n\n return [\n {\n geometry: {x: 0, y: 0, width: firstWidth, height},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: firstWidth + this.spacing, y: 0, width: secondWidth, height},\n sides: RectPart.Top | RectPart.Right | RectPart.Bottom\n }\n ];\n }\n\n private layoutThreeLeftAndOther(): ReturnType {\n const firstHeight = this.maxHeight;\n const thirdHeight = Math.round(Math.min(\n (this.maxHeight - this.spacing) / 2.,\n (this.ratios[1] * (this.maxWidth - this.spacing) /\n (this.ratios[2] + this.ratios[1]))));\n const secondHeight = firstHeight -\n thirdHeight -\n this.spacing;\n const rightWidth = Math.max(\n this.minWidth,\n Math.round(Math.min(\n (this.maxWidth - this.spacing) / 2.,\n Math.min(\n thirdHeight * this.ratios[2],\n secondHeight * this.ratios[1]))));\n const leftWidth = Math.min(\n Math.round(firstHeight * this.ratios[0]),\n this.maxWidth - this.spacing - rightWidth);\n\n return [\n {\n geometry: {x: 0, y: 0, width: leftWidth, height: firstHeight},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: leftWidth + this.spacing, y: 0, width: rightWidth, height: secondHeight},\n sides: RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: leftWidth + this.spacing, y: secondHeight + this.spacing, width: rightWidth, height: thirdHeight},\n sides: RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private layoutThreeTopAndOther(): ReturnType {\n const firstWidth = this.maxWidth;\n const firstHeight = Math.round(Math.min(\n firstWidth / this.ratios[0],\n (this.maxHeight - this.spacing) * 0.66));\n const secondWidth = (this.maxWidth - this.spacing) / 2;\n const secondHeight = Math.min(\n this.maxHeight - firstHeight - this.spacing,\n Math.round(Math.min(\n secondWidth / this.ratios[1],\n secondWidth / this.ratios[2])));\n const thirdWidth = firstWidth - secondWidth - this.spacing;\n\n return [\n {\n geometry: {x: 0, y: 0, width: firstWidth, height: firstHeight},\n sides: RectPart.Left | RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: 0, y: firstHeight + this.spacing, width: secondWidth, height: secondHeight},\n sides: RectPart.Bottom | RectPart.Left\n },\n {\n geometry: {x: secondWidth + this.spacing, y: firstHeight + this.spacing, width: thirdWidth, height: secondHeight},\n sides: RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private layoutFourTopAndOther(): ReturnType {\n const w = this.maxWidth;\n const h0 = Math.round(Math.min(\n w / this.ratios[0],\n (this.maxHeight - this.spacing) * 0.66));\n const h = Math.round(\n (this.maxWidth - 2 * this.spacing) /\n (this.ratios[1] + this.ratios[2] + this.ratios[3]));\n const w0 = Math.max(\n this.minWidth,\n Math.round(Math.min(\n (this.maxWidth - 2 * this.spacing) * 0.4,\n h * this.ratios[1])));\n const w2 = Math.round(Math.max(\n Math.max(\n this.minWidth * 1.,\n (this.maxWidth - 2 * this.spacing) * 0.33),\n h * this.ratios[3]));\n const w1 = w - w0 - w2 - 2 * this.spacing;\n const h1 = Math.min(\n this.maxHeight - h0 - this.spacing,\n h);\n\n return [\n {\n geometry: {x: 0, y: 0, width: w, height: h0},\n sides: RectPart.Left | RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: 0, y: h0 + this.spacing, width: w0, height: h1},\n sides: RectPart.Bottom | RectPart.Left\n },\n {\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\n sides: RectPart.Bottom\n },\n {\n geometry: {x: w0 + this.spacing + w1 + this.spacing, y: h0 + this.spacing, width: w2, height: h1},\n sides: RectPart.Right | RectPart.Bottom\n }\n ];\n }\n\n private layoutFourLeftAndOther(): ReturnType {\n const h = this.maxHeight;\n const w0 = Math.round(Math.min(\n h * this.ratios[0],\n (this.maxWidth - this.spacing) * 0.6));\n\n const w = Math.round(\n (this.maxHeight - 2 * this.spacing) /\n (1. / this.ratios[1] + 1. / this.ratios[2] + 1. / this.ratios[3])\n );\n const h0 = Math.round(w / this.ratios[1]);\n const h1 = Math.round(w / this.ratios[2]);\n const h2 = h - h0 - h1 - 2 * this.spacing;\n const w1 = Math.max(\n this.minWidth,\n Math.min(this.maxWidth - w0 - this.spacing, w));\n\n return [\n {\n geometry: {x: 0, y: 0, width: w0, height: h},\n sides: RectPart.Top | RectPart.Left | RectPart.Bottom\n },\n {\n geometry: {x: w0 + this.spacing, y: 0, width: w1, height: h0},\n sides: RectPart.Top | RectPart.Right\n },\n {\n geometry: {x: w0 + this.spacing, y: h0 + this.spacing, width: w1, height: h1},\n sides: RectPart.Right\n },\n {\n geometry: {x: w0 + this.spacing, y: h0 + h1 + 2 * this.spacing, width: w1, height: h2},\n sides: RectPart.Bottom | RectPart.Right\n }\n ];\n }\n\n private static countRatios(sizes: Size[]) {\n return sizes.map((size) => size.w / size.h);\n }\n\n private static countProportions(ratios: number[]) {\n return ratios.map((ratio) => (ratio > 1.2) ? 'w' : (ratio < 0.8) ? 'n' : 'q').join('');\n }\n}\n\nclass ComplexLayouter {\n private ratios: number[];\n private count: number;\n\n constructor(ratios: number[], private averageRatio: number, private maxWidth: number, private minWidth: number, private spacing: number, private maxHeight = maxWidth * 4 / 3) {\n this.ratios = ComplexLayouter.cropRatios(ratios, averageRatio);\n this.count = ratios.length;\n }\n\n private static cropRatios(ratios: number[], averageRatio: number) {\n const kMaxRatio = 2.75;\n const kMinRatio = 0.6667;\n return ratios.map((ratio) => {\n return averageRatio > 1.1 ?\n clamp(ratio, 1., kMaxRatio) :\n clamp(ratio, kMinRatio, 1.);\n });\n }\n\n public layout(): GroupMediaLayout[] {\n const result = new Array(this.count);\n\n const attempts: Attempt[] = [];\n const multiHeight = (offset: number, count: number) => {\n const ratios = this.ratios.slice(offset, offset + count); // warn\n const sum = accumulate(ratios, 0);\n return (this.maxWidth - (count - 1) * this.spacing) / sum;\n };\n const pushAttempt = (lineCounts: number[]) => {\n const heights: number[] = [];\n let offset = 0;\n for(const count of lineCounts) {\n heights.push(multiHeight(offset, count));\n offset += count;\n }\n attempts.push({lineCounts, heights}); // warn\n };\n\n for(let first = 1; first !== this.count; ++first) {\n const second = this.count - first;\n if(first > 3 || second > 3) {\n continue;\n }\n pushAttempt([first, second]);\n }\n for(let first = 1; first !== this.count - 1; ++first) {\n for(let second = 1; second !== this.count - first; ++second) {\n const third = this.count - first - second;\n if((first > 3) ||\n (second > ((this.averageRatio < 0.85) ? 4 : 3)) ||\n (third > 3)) {\n continue;\n }\n pushAttempt([first, second, third]);\n }\n }\n for(let first = 1; first !== this.count - 1; ++first) {\n for(let second = 1; second !== this.count - first; ++second) {\n for(let third = 1; third !== this.count - first - second; ++third) {\n const fourth = this.count - first - second - third;\n if(first > 3 || second > 3 || third > 3 || fourth > 3) {\n continue;\n }\n pushAttempt([first, second, third, fourth]);\n }\n }\n }\n\n let optimalAttempt: Attempt = null;\n let optimalDiff = 0;\n for(const attempt of attempts) {\n const {heights, lineCounts: counts} = attempt;\n const lineCount = counts.length;\n const totalHeight = accumulate(heights, 0) +\n this.spacing * (lineCount - 1);\n const minLineHeight = Math.min(...heights);\n const maxLineHeight = Math.max(...heights);\n const bad1 = (minLineHeight < this.minWidth) ? 1.5 : 1;\n const bad2 = (() => {\n for(let line = 1; line !== lineCount; ++line) {\n if(counts[line - 1] > counts[line]) {\n return 1.5;\n }\n }\n return 1.;\n })();\n const diff = Math.abs(totalHeight - this.maxHeight) * bad1 * bad2;\n if(!optimalAttempt || diff < optimalDiff) {\n optimalAttempt = attempt;\n optimalDiff = diff;\n }\n }\n\n const optimalCounts = optimalAttempt.lineCounts;\n const optimalHeights = optimalAttempt.heights;\n const rowCount = optimalCounts.length;\n\n let index = 0;\n let y = 0;\n for(let row = 0; row !== rowCount; ++row) {\n const colCount = optimalCounts[row];\n const lineHeight = optimalHeights[row];\n const height = Math.round(lineHeight);\n\n let x = 0;\n for(let col = 0; col !== colCount; ++col) {\n const sides = RectPart.None |\n (row === 0 ? RectPart.Top : RectPart.None) |\n (row === rowCount - 1 ? RectPart.Bottom : RectPart.None) |\n (col === 0 ? RectPart.Left : RectPart.None) |\n (col === colCount - 1 ? RectPart.Right : RectPart.None);\n\n const ratio = this.ratios[index];\n const width = (col === colCount - 1) ?\n (this.maxWidth - x) :\n Math.round(ratio * lineHeight);\n result[index] = {\n geometry: {x, y, width, height},\n sides\n };\n\n x += width + this.spacing;\n ++index;\n }\n y += height + this.spacing;\n }\n\n return result;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Layouter, RectPart} from './groupedLayout';\n\nexport default function prepareAlbum(options: {\n container: HTMLElement,\n items: {w: number, h: number}[],\n maxWidth: number,\n minWidth: number,\n spacing: number,\n maxHeight?: number,\n forMedia?: true\n}) {\n const layouter = new Layouter(options.items, options.maxWidth, options.minWidth, options.spacing, options.maxHeight);\n const layout = layouter.layout();\n\n const widthItem = layout.find((item) => item.sides & RectPart.Right);\n const width = widthItem.geometry.width + widthItem.geometry.x;\n\n const heightItem = layout.find((item) => item.sides & RectPart.Bottom);\n const height = heightItem.geometry.height + heightItem.geometry.y;\n\n const container = options.container;\n container.style.width = width + 'px';\n container.style.height = height + 'px';\n const children = container.children;\n\n layout.forEach(({geometry, sides}, idx) => {\n let div: HTMLElement;\n div = children[idx] as HTMLElement;\n if(!div) {\n div = document.createElement('div');\n container.append(div);\n }\n\n div.classList.add('album-item', 'grouped-item');\n\n div.style.width = (geometry.width / width * 100) + '%';\n div.style.height = (geometry.height / height * 100) + '%';\n div.style.top = (geometry.y / height * 100) + '%';\n div.style.left = (geometry.x / width * 100) + '%';\n\n if(sides & RectPart.Left && sides & RectPart.Top) {\n div.style.borderTopLeftRadius = 'inherit';\n }\n\n if(sides & RectPart.Left && sides & RectPart.Bottom) {\n div.style.borderBottomLeftRadius = 'inherit';\n }\n\n if(sides & RectPart.Right && sides & RectPart.Top) {\n div.style.borderTopRightRadius = 'inherit';\n }\n\n if(sides & RectPart.Right && sides & RectPart.Bottom) {\n div.style.borderBottomRightRadius = 'inherit';\n }\n\n if(options.forMedia) {\n const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('album-item-media');\n\n div.append(mediaDiv);\n }\n\n // @ts-ignore\n // div.style.backgroundColor = '#' + Math.floor(Math.random() * (2 ** 24 - 1)).toString(16).padStart(6, '0');\n });\n\n /* if(options.forMedia) {\n layout.forEach((_, i) => {\n const mediaDiv = document.createElement('div');\n mediaDiv.classList.add('album-item-media');\n\n options.container.children[i].append(mediaDiv);\n });\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {Middleware} from '../../helpers/middleware';\nimport {Document, Message, MessageMedia, Photo, PhotoSize} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport choosePhotoSize from '../../lib/appManagers/utils/photos/choosePhotoSize';\nimport rootScope from '../../lib/rootScope';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport Chat from '../chat/chat';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport prepareAlbum from '../prepareAlbum';\nimport wrapMediaSpoiler from './mediaSpoiler';\nimport wrapPhoto from './photo';\nimport wrapVideo from './video';\n\nexport default function wrapAlbum({messages, attachmentDiv, middleware, uploading, lazyLoadQueue, isOut, chat, loadPromises, autoDownload, managers = rootScope.managers, animationGroup}: {\n messages: Message.message[],\n attachmentDiv: HTMLElement,\n middleware?: Middleware,\n lazyLoadQueue?: LazyLoadQueue,\n uploading?: boolean,\n isOut: boolean,\n chat: Chat,\n loadPromises?: Promise[],\n autoDownload?: ChatAutoDownloadSettings,\n managers?: AppManagers,\n animationGroup?: AnimationItemGroup\n}) {\n const items: {size: PhotoSize.photoSize, media: Photo.photo | Document.document, message: Message.message}[] = [];\n\n // !lowest msgID will be the FIRST in album\n for(const message of messages) {\n const media: Photo.photo | Document.document = getMediaFromMessage(message);\n\n const size: any = media._ === 'photo' ? choosePhotoSize(media, 480, 480) : {w: media.w, h: media.h};\n items.push({size, media, message});\n }\n\n /* // * pending\n if(storage[0] < 0) {\n items.reverse();\n } */\n\n prepareAlbum({\n container: attachmentDiv,\n items: items.map((i) => ({w: i.size.w, h: i.size.h})),\n maxWidth: mediaSizes.active.album.width,\n minWidth: 100,\n spacing: 2,\n forMedia: true\n });\n\n const {width, height} = attachmentDiv.style;\n const containerWidth = parseInt(width);\n const containerHeight = parseInt(height);\n\n items.forEach((item, idx) => {\n const {size, media, message} = item;\n\n const messageMedia = message.media;\n const hasSpoiler = !!(messageMedia as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument).pFlags?.spoiler;\n\n const div = attachmentDiv.children[idx] as HTMLElement;\n div.dataset.mid = '' + message.mid;\n div.dataset.peerId = '' + message.peerId;\n const mediaDiv = div.firstElementChild as HTMLElement;\n const isPhoto = media._ === 'photo';\n let thumbPromise: Promise;\n if(isPhoto) {\n thumbPromise = wrapPhoto({\n photo: media,\n message,\n container: mediaDiv,\n boxWidth: 0,\n boxHeight: 0,\n isOut,\n lazyLoadQueue,\n middleware,\n size,\n loadPromises,\n autoDownloadSize: autoDownload.photo,\n managers\n });\n } else {\n thumbPromise = wrapVideo({\n doc: media,\n container: mediaDiv,\n message,\n boxWidth: 0,\n boxHeight: 0,\n withTail: false,\n isOut,\n lazyLoadQueue,\n middleware,\n loadPromises,\n autoDownload,\n managers,\n noAutoplayAttribute: hasSpoiler\n });\n }\n\n if(thumbPromise) {\n loadPromises?.push(thumbPromise);\n }\n\n if(hasSpoiler) {\n const promise = (thumbPromise || Promise.resolve()).then(async() => {\n if(!middleware()) {\n return;\n }\n\n const {width, height} = div.style;\n const itemWidth = +width.slice(0, -1) / 100 * containerWidth;\n const itemHeight = +height.slice(0, -1) / 100 * containerHeight;\n const container = await wrapMediaSpoiler({\n media,\n animationGroup,\n middleware,\n width: itemWidth,\n height: itemHeight\n });\n\n if(!middleware()) {\n return;\n }\n\n mediaDiv.append(container);\n });\n\n loadPromises?.push(promise);\n }\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SliderSuperTab} from '../../slider';\nimport appSidebarRight from '..';\nimport {roundPercents} from '../../poll';\nimport appDialogsManager from '../../../lib/appManagers/appDialogsManager';\nimport {i18n} from '../../../lib/langPack';\nimport setInnerHTML from '../../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../../lib/richTextProcessor/wrapEmojiText';\nimport Button from '../../button';\nimport {Message, MessageMedia} from '../../../layer';\n\nexport default class AppPollResultsTab extends SliderSuperTab {\n private resultsDiv: HTMLElement;\n\n public async init(message: Message.message) {\n this.container.id = 'poll-results-container';\n this.container.classList.add('chatlist-container');\n\n this.resultsDiv = document.createElement('div');\n this.resultsDiv.classList.add('poll-results');\n this.scrollable.append(this.resultsDiv);\n\n const poll = await this.managers.appPollsManager.getPoll((message.media as MessageMedia.messageMediaPoll).poll.id);\n\n this.setTitle(poll.poll.pFlags.quiz ? 'PollResults.Title.Quiz' : 'PollResults.Title.Poll');\n\n const title = document.createElement('h3');\n setInnerHTML(title, wrapEmojiText(poll.poll.question));\n\n const percents = poll.results.results.map((v) => v.voters / poll.results.total_voters * 100);\n roundPercents(percents);\n\n const fragment = document.createDocumentFragment();\n poll.results.results.forEach((result, idx) => {\n if(!result.voters) return;\n\n const hr = document.createElement('hr');\n\n const answer = poll.poll.answers[idx];\n\n // Head\n const answerEl = document.createElement('div');\n answerEl.classList.add('poll-results-answer');\n\n const answerTitle = document.createElement('div');\n setInnerHTML(answerTitle, wrapEmojiText(answer.text));\n\n const answerPercents = document.createElement('div');\n answerPercents.innerText = Math.round(percents[idx]) + '%';\n\n answerEl.append(answerTitle, answerPercents);\n\n // Humans\n const list = appDialogsManager.createChatList();\n list.classList.add('poll-results-voters');\n\n appDialogsManager.setListClickListener(list, () => {\n appSidebarRight.onCloseBtnClick();\n }, undefined, true);\n\n list.style.minHeight = Math.min(result.voters, 4) * 48 + 'px';\n\n fragment.append(hr, answerEl, list);\n\n let offset: string, limit = 4, loading = false, left = Math.max(0, result.voters - 4);\n const load = () => {\n if(loading) return;\n loading = true;\n\n this.managers.appPollsManager.getVotes(message, answer.option, offset, limit).then((votesList) => {\n votesList.votes.forEach((vote) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: vote.user_id.toPeerId(false),\n container: list,\n rippleEnabled: false,\n meAsSaved: false,\n avatarSize: 'small'\n });\n dom.lastMessageSpan.parentElement.remove();\n });\n\n if(offset) {\n left = Math.max(0, left - votesList.votes.length);\n\n if(left) {\n (showMore.lastElementChild as HTMLElement).replaceWith(i18n('PollResults.LoadMore', [Math.min(20, left)]));\n }\n }\n\n offset = votesList.next_offset;\n limit = 20;\n\n if(!left || !votesList.votes.length) {\n showMore.remove();\n }\n }).finally(() => {\n loading = false;\n });\n };\n\n const showMore = Button('poll-results-more btn btn-primary btn-transparent', {icon: 'down'});\n showMore.addEventListener('click', load);\n showMore.append(i18n('PollResults.LoadMore', [Math.min(20, left)]));\n\n fragment.append(showMore);\n\n load();\n });\n\n this.resultsDiv.append(title, fragment);\n\n appSidebarRight.toggleSidebar(true).then(() => {\n /* appPollsManager.getVotes(mid).then((votes) => {\n console.log('gOt VotEs', votes);\n }); */\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport mediaSizes from '../helpers/mediaSizes';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport appImManager from '../lib/appManagers/appImManager';\nimport rootScope from '../lib/rootScope';\nimport ripple from './ripple';\nimport appSidebarRight from './sidebarRight';\nimport AppPollResultsTab from './sidebarRight/tabs/pollResults';\nimport {FormatterArguments, i18n, LangPackKey} from '../lib/langPack';\nimport {fastRaf} from '../helpers/schedulers';\nimport SetTransition from './singleTransition';\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent, detachClickEvent, simulateClickEvent} from '../helpers/dom/clickEvent';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport windowSize from '../helpers/windowSize';\nimport {Message, MessageMedia, Poll, PollResults} from '../layer';\nimport toHHMMSS from '../helpers/string/toHHMMSS';\nimport StackedAvatars from './stackedAvatars';\nimport setInnerHTML from '../helpers/dom/setInnerHTML';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../lib/richTextProcessor/wrapRichText';\n\nlet lineTotalLength = 0;\nconst tailLength = 9;\nconst times = 10;\nconst fullTime = 340;\nconst oneTime = fullTime / times;\n\nexport const roundPercents = (percents: number[]) => {\n // console.log('roundPercents before percents:', percents);\n\n const sum = percents.reduce((acc, p) => acc + Math.round(p), 0);\n if(sum > 100) {\n const diff = sum - 100;\n const length = percents.length;\n for(let i = 0; i < diff; ++i) {\n let minIndex = -1, minRemainder = 1;\n for(let k = 0; k < length; ++k) {\n const remainder = percents[k] % 1;\n if(remainder >= 0.5 && remainder < minRemainder) {\n minRemainder = remainder;\n minIndex = k;\n }\n }\n\n if(minIndex === -1) {\n // throw new Error('lol chto');\n return;\n }\n\n percents[minIndex] -= minRemainder;\n }\n } else if(sum < 100) {\n const diff = 100 - sum;\n const length = percents.length;\n for(let i = 0; i < diff; ++i) {\n let minIndex = -1, maxRemainder = 0;\n for(let k = 0; k < length; ++k) {\n const remainder = percents[k] % 1;\n if(remainder < 0.5 && remainder > maxRemainder) {\n maxRemainder = remainder;\n minIndex = k;\n }\n }\n\n if(minIndex === -1) {\n // throw new Error('lol chto');\n return;\n }\n\n percents[minIndex] += 1 - maxRemainder;\n }\n }\n\n // console.log('roundPercents after percents:', percents);\n};\n\n/* const connectedPolls: {id: string, element: PollElement}[] = [];\nrootScope.on('poll_update', (e) => {\n const {poll, results} = e as {poll: Poll, results: PollResults};\n\n //console.log('poll_update', poll, results);\n for(const connected of connectedPolls) {\n if(connected.id === poll.id) {\n const pollElement = connected.element;\n pollElement.isClosed = !!poll.pFlags.closed;\n pollElement.performResults(results, poll.chosenIndexes);\n }\n }\n}); */\n\nrootScope.addEventListener('poll_update', ({poll, results}) => {\n const pollElements = Array.from(document.querySelectorAll(`poll-element[poll-id=\"${poll.id}\"]`)) as PollElement[];\n pollElements.forEach((pollElement) => {\n // console.log('poll_update', poll, results);\n pollElement.isClosed = !!poll.pFlags.closed;\n pollElement.performResults(results, poll.chosenIndexes);\n });\n});\n\nmediaSizes.addEventListener('resize', () => {\n PollElement.setMaxLength();\n PollElement.resizePolls();\n});\n\nmediaSizes.addEventListener('changeScreen', () => {\n PollElement.setMaxLength();\n});\n\nconst hideQuizHint = (element: HTMLElement, onHide: () => void, timeout: number) => {\n element.classList.remove('active');\n\n clearTimeout(timeout);\n setTimeout(() => {\n onHide();\n element.remove();\n\n if(prevQuizHint === element && prevQuizHintOnHide === onHide && prevQuizHintTimeout === timeout) {\n prevQuizHint = prevQuizHintOnHide = null;\n prevQuizHintTimeout = 0;\n }\n }, 200);\n};\n\nlet prevQuizHint: HTMLElement, prevQuizHintOnHide: () => void, prevQuizHintTimeout: number;\nlet isListenerSet = false;\nconst setQuizHint = (solution: string, solution_entities: any[], onHide: () => void) => {\n if(prevQuizHint) {\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\n }\n\n const element = document.createElement('div');\n element.classList.add('quiz-hint');\n\n const container = document.createElement('div');\n container.classList.add('container', 'tgico');\n\n const textEl = document.createElement('div');\n textEl.classList.add('text');\n\n container.append(textEl);\n element.append(container);\n\n setInnerHTML(textEl, wrapRichText(solution, {entities: solution_entities}));\n appImManager.chat.bubbles.container.append(element);\n\n void element.offsetLeft; // reflow\n element.classList.add('active');\n\n prevQuizHint = element;\n prevQuizHintOnHide = onHide;\n prevQuizHintTimeout = window.setTimeout(() => {\n hideQuizHint(element, onHide, prevQuizHintTimeout);\n }, IS_TOUCH_SUPPORTED ? 5000 : 7000);\n\n if(!isListenerSet) {\n isListenerSet = true;\n appImManager.addEventListener('peer_changed', () => {\n if(prevQuizHint) {\n hideQuizHint(prevQuizHint, prevQuizHintOnHide, prevQuizHintTimeout);\n }\n });\n }\n};\n\nexport default class PollElement extends HTMLElement {\n public static MAX_OFFSET = -46.5;\n public static MAX_LENGTH = 0;\n public svgLines: SVGSVGElement[];\n private numberDivs: HTMLDivElement[];\n private answerDivs: HTMLDivElement[];\n private descDiv: HTMLElement;\n private typeDiv: HTMLElement;\n private avatarsDiv: HTMLElement;\n private viewResults: HTMLElement;\n private votersCountDiv: HTMLDivElement;\n\n // private maxLength: number;\n // private maxLengths: number[];\n private maxPercents: number[];\n\n public isClosed = false;\n private isQuiz = false;\n private isRetracted = false;\n private isPublic = false;\n private isMultiple = false;\n private chosenIndexes: number[] = [];\n private percents: number[];\n\n public message: Message.message;\n public managers: AppManagers;\n\n private quizInterval: number;\n private quizTimer: SVGSVGElement;\n\n private sendVoteBtn: HTMLElement;\n private chosingIndexes: number[] = [];\n\n private sendVotePromise: Promise;\n private sentVote = false;\n\n public static setMaxLength() {\n const width = windowSize.width <= 360 ? windowSize.width - 120 : mediaSizes.active.poll.width;\n this.MAX_LENGTH = width + tailLength + this.MAX_OFFSET + -13.7; // 13 - position left\n }\n\n public static resizePolls() {\n if(!this.MAX_LENGTH) return;\n const pollElements = Array.from(document.querySelectorAll('poll-element.is-voted')) as PollElement[];\n pollElements.forEach((pollElement) => {\n pollElement.svgLines.forEach((svg, idx) => {\n // void svg.getBoundingClientRect(); // reflow\n pollElement.setLineProgress(idx, 1);\n });\n });\n }\n\n public async render() {\n // браузер вызывает этот метод при добавлении элемента в документ\n // (может вызываться много раз, если элемент многократно добавляется/удаляется)\n\n if(!lineTotalLength) {\n lineTotalLength = (document.getElementById('poll-line') as any as SVGPathElement).getTotalLength();\n // console.log('line total length:', lineTotalLength);\n PollElement.setMaxLength();\n }\n\n // const {poll, results} = this.managers.appPollsManager.getPoll(pollId);\n const {poll, results} = this.message.media as MessageMedia.messageMediaPoll;\n\n /* const timestamp = Date.now() / 1000 | 0;\n if(timestamp < this.message.date) { */\n if(this.message.pFlags.is_scheduled) {\n this.classList.add('disable-hover');\n }\n\n // console.log('pollElement poll:', poll, results);\n\n let descKey: LangPackKey;\n if(poll.pFlags) {\n this.isPublic = !!poll.pFlags.public_voters;\n this.isQuiz = !!poll.pFlags.quiz;\n this.isClosed = !!poll.pFlags.closed;\n this.isMultiple = !!poll.pFlags.multiple_choice;\n\n if(this.isClosed) {\n descKey = 'Chat.Poll.Type.Closed';\n this.classList.add('is-closed');\n } else if(this.isQuiz) {\n descKey = this.isPublic ? 'Chat.Poll.Type.Quiz' : 'Chat.Poll.Type.AnonymousQuiz';\n } else {\n descKey = this.isPublic ? 'Chat.Poll.Type.Public' : 'Chat.Poll.Type.Anonymous';\n }\n }\n\n this.classList.toggle('is-multiple', this.isMultiple);\n\n const multipleSelect = this.isMultiple ? '' : '';\n const votes = poll.answers.map((answer, idx) => {\n return `\n
\n
\n
\n \n \n \n ${multipleSelect}\n
\n
\n
\n \n \n \n \n
\n `;\n }).join('');\n\n this.innerHTML = `\n
\n
\n
\n
\n
\n ${votes}`;\n\n setInnerHTML(this.firstElementChild, wrapEmojiText(poll.question));\n\n Array.from(this.querySelectorAll('.poll-answer-text')).forEach((el, idx) => {\n setInnerHTML(el, wrapEmojiText(poll.answers[idx].text));\n });\n\n this.descDiv = this.firstElementChild.nextElementSibling as HTMLElement;\n this.typeDiv = this.descDiv.firstElementChild as HTMLElement;\n this.avatarsDiv = this.descDiv.lastElementChild as HTMLElement;\n\n if(descKey) {\n this.typeDiv.append(i18n(descKey));\n }\n\n if(this.isQuiz) {\n this.classList.add('is-quiz');\n\n if(poll.close_period && poll.close_date) {\n const timeLeftDiv = document.createElement('div');\n timeLeftDiv.classList.add('poll-time');\n this.descDiv.append(timeLeftDiv);\n\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n // svg.setAttributeNS(null, 'viewBox', '0 0 15 15');\n svg.classList.add('poll-quiz-timer');\n\n this.quizTimer = svg;\n\n const strokeWidth = 2;\n const radius = 7;\n const circumference = 2 * Math.PI * radius;\n\n const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n circle.classList.add('poll-quiz-timer-circle');\n circle.setAttributeNS(null, 'cx', '16');\n circle.setAttributeNS(null, 'cy', '16');\n circle.setAttributeNS(null, 'r', '' + radius);\n circle.setAttributeNS(null, 'stroke-width', '' + strokeWidth);\n\n svg.append(circle);\n this.descDiv.append(svg);\n\n const period = poll.close_period * 1000;\n const closeTime = (poll.close_date - await rootScope.managers.timeManager.getServerTimeOffset()) * 1000;\n\n // console.log('closeTime:', poll.close_date, serverTimeManager.serverTimeOffset, Date.now() / 1000 | 0);\n\n // let time = Date.now();\n // let percents = (closeTime - time) / period;\n\n // timeLeftDiv.innerHTML = String((closeTime - time) / 1000 + 1 | 0).toHHMMSS();\n\n // // @ts-ignore\n // circle.style.strokeDashoffset = circumference + percents * circumference;\n // circle.style.strokeDasharray = ${circumference} ${circumference};\n\n this.quizInterval = window.setInterval(() => {\n const time = Date.now();\n const percents = (closeTime - time) / period;\n const timeLeft = (closeTime - time) / 1000 + 1 | 0;\n timeLeftDiv.innerHTML = toHHMMSS(timeLeft);\n\n if(timeLeft <= 5) {\n timeLeftDiv.style.color = '#ee545c';\n circle.style.stroke = '#ee545c';\n }\n // timeLeftDiv.style.visibility = 'visible';\n\n // @ts-ignore\n circle.style.strokeDashoffset = circumference + percents * circumference;\n circle.style.strokeDasharray = `${circumference} ${circumference}`;\n\n if(time >= closeTime) {\n clearInterval(this.quizInterval);\n timeLeftDiv.innerHTML = '';\n // @ts-ignore\n circle.style.strokeDashoffset = circumference;\n this.quizInterval = 0;\n\n setTimeout(() => {\n // нужно запросить апдейт чтобы опрос обновился\n this.managers.appPollsManager.getResults(this.message);\n }, 3e3);\n }\n }, 1e3);\n }\n }\n\n this.answerDivs = Array.from(this.querySelectorAll('.poll-answer')) as HTMLDivElement[];\n this.svgLines = Array.from(this.querySelectorAll('.poll-line')) as SVGSVGElement[];\n this.numberDivs = Array.from(this.querySelectorAll('.poll-answer-percents')) as HTMLDivElement[];\n\n const footerDiv = document.createElement('div');\n footerDiv.classList.add('poll-footer');\n\n this.viewResults = document.createElement('div');\n this.viewResults.className = 'poll-footer-button poll-view-results hide';\n this.viewResults.append(i18n('Chat.Poll.ViewResults'));\n\n this.votersCountDiv = document.createElement('div');\n this.votersCountDiv.className = 'poll-votes-count';\n\n footerDiv.append(this.viewResults, this.votersCountDiv);\n this.append(footerDiv);\n\n this.viewResults.addEventListener('click', (e) => {\n cancelEvent(e);\n\n if(!appSidebarRight.isTabExists(AppPollResultsTab)) {\n appSidebarRight.createTab(AppPollResultsTab).open(this.message);\n }\n });\n ripple(this.viewResults);\n\n if(this.isMultiple) {\n this.sendVoteBtn = document.createElement('div');\n this.sendVoteBtn.classList.add('poll-footer-button', 'poll-send-vote');\n this.sendVoteBtn.append(i18n('Chat.Poll.SubmitVote'));\n ripple(this.sendVoteBtn);\n\n if(!poll.chosenIndexes.length) {\n this.votersCountDiv.classList.add('hide');\n }\n\n attachClickEvent(this.sendVoteBtn, (e) => {\n cancelEvent(e);\n /* const indexes = this.answerDivs.filter((el) => el.classList.contains('is-chosing')).map((el) => +el.dataset.index);\n if(indexes.length) {\n\n } */\n if(this.chosingIndexes.length) {\n this.sendVotes(this.chosingIndexes).then(() => {\n this.chosingIndexes.length = 0;\n this.answerDivs.forEach((el) => {\n el.classList.remove('is-chosing');\n });\n });\n }\n });\n\n footerDiv.append(this.sendVoteBtn);\n }\n\n // const width = this.getBoundingClientRect().width;\n // const width = mediaSizes.active.poll.width;\n // this.maxLength = width + tailLength + this.maxOffset + -13.7; // 13 - position left\n\n const canVote = !(poll.chosenIndexes.length || this.isClosed);\n if(!canVote || this.isPublic) {\n this.performResults(results, poll.chosenIndexes, false);\n }\n\n if(canVote) {\n this.setVotersCount(results);\n attachClickEvent(this, this.clickHandler);\n }\n }\n\n initQuizHint(results: PollResults) {\n if(results.solution && results.solution_entities) {\n const toggleHint = document.createElement('div');\n toggleHint.classList.add('tgico-tip', 'poll-hint');\n this.descDiv.append(toggleHint);\n\n // let active = false;\n attachClickEvent(toggleHint, (e) => {\n cancelEvent(e);\n\n // active = true;\n toggleHint.classList.add('active');\n setQuizHint(results.solution, results.solution_entities, () => {\n // active = false;\n toggleHint.classList.remove('active');\n });\n });\n\n if(this.sentVote) {\n const correctResult = results.results.find((r) => r.pFlags.correct);\n if(correctResult && !correctResult.pFlags.chosen) {\n simulateClickEvent(toggleHint);\n }\n }\n }\n }\n\n clickHandler(e: Event) {\n const target = findUpClassName(e.target, 'poll-answer') as HTMLElement;\n if(!target) {\n return;\n }\n\n cancelEvent(e);\n const answerIndex = +target.dataset.index;\n if(this.isMultiple) {\n target.classList.toggle('is-chosing');\n\n const foundIndex = this.chosingIndexes.indexOf(answerIndex);\n if(foundIndex !== -1) {\n this.chosingIndexes.splice(foundIndex, 1);\n } else {\n this.chosingIndexes.push(answerIndex);\n }\n } else {\n this.sendVotes([answerIndex]);\n }\n\n /* target.classList.add('is-voting');\n setTimeout(() => { // simulate\n this.setResults([100, 0], answerIndex);\n target.classList.remove('is-voting');\n }, 1000); */\n }\n\n sendVotes(indexes: number[]) {\n if(this.sendVotePromise) return this.sendVotePromise;\n\n const targets = this.answerDivs.filter((_, idx) => indexes.includes(idx));\n targets.forEach((target) => {\n target.classList.add('is-voting');\n });\n\n this.classList.add('disable-hover');\n this.sentVote = true;\n return this.sendVotePromise = this.managers.appPollsManager.sendVote(this.message, indexes).then(() => {\n targets.forEach((target) => {\n target.classList.remove('is-voting');\n });\n\n this.classList.remove('disable-hover');\n }).catch(() => {\n this.sentVote = false;\n }).finally(() => {\n this.sendVotePromise = null;\n });\n }\n\n performResults(results: PollResults, chosenIndexes: number[], animate = true) {\n if(!rootScope.settings.animationsEnabled) {\n animate = false;\n }\n\n if(this.isQuiz && (results.results?.length || this.isClosed)) {\n this.answerDivs.forEach((el, idx) => {\n el.classList.toggle('is-correct', !!results.results[idx].pFlags.correct);\n });\n\n if(this.initQuizHint) {\n this.initQuizHint(results);\n this.initQuizHint = null;\n }\n\n if(this.quizInterval) {\n clearInterval(this.quizInterval);\n this.quizInterval = 0;\n }\n\n if(this.quizTimer?.parentElement) {\n this.quizTimer.remove();\n }\n\n const timeEl = this.descDiv.querySelector('.poll-time');\n if(timeEl) {\n timeEl.remove();\n }\n }\n\n if(this.isClosed) {\n this.classList.add('is-closed');\n replaceContent(this.typeDiv, i18n('Chat.Poll.Type.Closed'));\n }\n\n // set chosen\n if(this.chosenIndexes.length !== chosenIndexes.length || this.isClosed) { // if we voted\n this.isRetracted = this.chosenIndexes.length && !chosenIndexes.length;\n this.chosenIndexes = chosenIndexes.slice();\n\n if(this.isRetracted) {\n attachClickEvent(this, this.clickHandler);\n } else {\n detachClickEvent(this, this.clickHandler);\n }\n }\n\n // is need update\n if(this.chosenIndexes.length || this.isRetracted || this.isClosed) {\n const percents = results.results.map((v) => results.total_voters ? v.voters / results.total_voters * 100 : 0);\n\n this.classList.toggle('no-transition', !animate);\n if(animate) {\n SetTransition({\n element: this,\n className: '',\n forwards: !this.isRetracted,\n duration: 340\n });\n }\n\n fastRaf(() => {\n this.setResults(this.isRetracted ? this.percents : percents, this.chosenIndexes, animate);\n this.percents = percents;\n this.isRetracted = false;\n });\n }\n\n this.setVotersCount(results);\n\n if(this.isPublic) {\n if(!this.isMultiple) {\n this.viewResults.classList.toggle('hide', !results.total_voters || !this.chosenIndexes.length);\n this.votersCountDiv.classList.toggle('hide', !!this.chosenIndexes.length);\n }\n\n const peerIds = (results.recent_voters || []).map((userId) => userId.toPeerId());\n const stackedAvatars = new StackedAvatars({avatarSize: 16});\n stackedAvatars.render(peerIds);\n replaceContent(this.avatarsDiv, stackedAvatars.container);\n }\n\n if(this.isMultiple) {\n const isVoted = !!this.chosenIndexes.length;\n\n const hideSendVoteBtn = this.isClosed || isVoted;\n const hideViewResultsBtn = !this.isPublic || !results.total_voters || (!isVoted && !this.isClosed);\n this.sendVoteBtn.classList.toggle('hide', hideSendVoteBtn);\n this.viewResults.classList.toggle('hide', hideViewResultsBtn);\n this.votersCountDiv.classList.toggle('hide', !hideSendVoteBtn || !hideViewResultsBtn);\n }\n }\n\n setResults(percents: number[], chosenIndexes: number[], animate: boolean) {\n this.svgLines.forEach((svg) => svg.style.display = '');\n\n this.answerDivs.forEach((el, idx) => {\n el.classList.toggle('is-chosen', chosenIndexes.includes(idx));\n });\n\n const maxValue = Math.max(...percents);\n // this.maxLengths = percents.map((p) => p / maxValue * this.maxLength);\n this.maxPercents = percents.map((p) => p / maxValue);\n\n // line\n if(this.isRetracted) {\n this.svgLines.forEach((svg, idx) => {\n this.setLineProgress(idx, -1);\n });\n } else {\n const cb = () => {\n this.svgLines.forEach((svg, idx) => {\n // void svg.getBoundingClientRect(); // reflow\n this.setLineProgress(idx, 1);\n });\n };\n\n animate ? fastRaf(cb) : cb();\n }\n\n percents = percents.slice();\n roundPercents(percents);\n let getPercentValue: (percents: number, index: number) => number;\n const iterate = (i: number) => {\n percents.forEach((percents, idx) => {\n const value = getPercentValue(percents, i);\n this.numberDivs[idx].innerText = value + '%';\n });\n };\n // numbers\n if(this.isRetracted) {\n getPercentValue = (percents, index) => Math.round(percents / times * index);\n\n if(animate) {\n for(let i = (times - 1), k = 0; i >= 0; --i, ++k) {\n setTimeout(() => {\n iterate(i);\n }, oneTime * k);\n }\n } else {\n iterate(0);\n }\n } else {\n getPercentValue = (percents, index) => Math.round(percents / times * (index + 1));\n\n if(animate) {\n for(let i = 0; i < times; ++i) {\n setTimeout(() => {\n iterate(i);\n }, oneTime * i);\n }\n } else {\n iterate(times - 1);\n }\n }\n\n if(this.isRetracted) {\n if(animate) {\n this.classList.add('is-retracting');\n }\n\n this.classList.remove('is-voted');\n const cb = () => {\n this.svgLines.forEach((svg) => svg.style.display = 'none');\n };\n\n if(animate) {\n setTimeout(() => {\n this.classList.remove('is-retracting');\n cb();\n }, fullTime);\n } else {\n cb();\n }\n } else {\n this.classList.add('is-voted');\n }\n }\n\n setVotersCount(results: PollResults) {\n const votersCount = results.total_voters || 0;\n let key: LangPackKey;\n const args: FormatterArguments = [votersCount];\n if(this.isClosed) {\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesResultEmpty';\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesResultEmpty';\n } else {\n if(this.isQuiz) key = votersCount ? 'Chat.Quiz.TotalVotes' : 'Chat.Quiz.TotalVotesEmpty';\n else key = votersCount ? 'Chat.Poll.TotalVotes1' : 'Chat.Poll.TotalVotesEmpty';\n }\n\n replaceContent(this.votersCountDiv, i18n(key, args));\n }\n\n setLineProgress(index: number, multiplier: number) {\n const svg = this.svgLines[index];\n\n if(multiplier === -1) {\n svg.style.strokeDasharray = '';\n svg.style.strokeDashoffset = '';\n } else {\n // svg.style.strokeDasharray = (multiplier * this.maxLengths[index]) + ', 485.9';\n svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * PollElement.MAX_LENGTH) + ', 485.9';\n // svg.style.strokeDasharray = (multiplier * this.maxPercents[index] * 100) + '%, 485.9';\n svg.style.strokeDashoffset = '' + multiplier * PollElement.MAX_OFFSET;\n }\n }\n\n // у элемента могут быть ещё другие методы и свойства\n}\n\ncustomElements.define('poll-element', PollElement);\n","// https://stackoverflow.com/a/14824756/6758968\nconst ltrChars = 'A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF'+'\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF',\n rtlChars = '\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC',\n fullRtlDirCheck = new RegExp('^[^'+ltrChars+']*['+rtlChars+']'),\n justRtlDirCheck = new RegExp('['+rtlChars+']');\n\nexport default function isRTL(s: string, anyChar?: boolean) {\n return anyChar ? justRtlDirCheck.test(s) : fullRtlDirCheck.test(s);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppImManager, ChatSavedPosition, ChatSetPeerOptions} from '../../lib/appManagers/appImManager';\nimport type {HistoryResult, MyMessage} from '../../lib/appManagers/appMessagesManager';\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport type Chat from './chat';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {logger} from '../../lib/logger';\nimport rootScope from '../../lib/rootScope';\nimport BubbleGroups from './bubbleGroups';\nimport PopupDatePicker from '../popups/datePicker';\nimport PopupForward from '../popups/forward';\nimport PopupStickers from '../popups/stickers';\nimport ProgressivePreloader from '../preloader';\nimport Scrollable, {SliceSides} from '../scrollable';\nimport StickyIntersector from '../stickyIntersector';\nimport animationIntersector from '../animationIntersector';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport {IS_ANDROID, IS_APPLE, IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\nimport I18n, {FormatterArguments, i18n, langPack, LangPackKey, UNSUPPORTED_LANG_PACK_KEY, _i18n} from '../../lib/langPack';\nimport AvatarElement from '../avatar';\nimport ripple from '../ripple';\nimport {MessageRender} from './messageRender';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport PollElement from '../poll';\nimport AudioElement from '../audio';\nimport {Chat as MTChat, ChatInvite, Document, Message, MessageEntity, MessageMedia, MessageReplyHeader, Photo, PhotoSize, ReactionCount, ReplyMarkup, SponsoredMessage, Update, UrlAuthResult, User, WebPage} from '../../layer';\nimport {BOT_START_PARAM, NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport {FocusDirection, ScrollStartCallbackDimensions} from '../../helpers/fastSmoothScroll';\nimport useHeavyAnimationCheck, {getHeavyAnimationPromise, dispatchHeavyAnimationEvent, interruptHeavyAnimation} from '../../hooks/useHeavyAnimationCheck';\nimport {fastRaf, fastRafPromise} from '../../helpers/schedulers';\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport RepliesElement from './replies';\nimport DEBUG from '../../config/debug';\nimport {SliceEnd} from '../../helpers/slicedArray';\nimport PeerTitle from '../peerTitle';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport {toast, toastNew} from '../toast';\nimport {getElementByPoint} from '../../helpers/dom/getElementByPoint';\nimport {getMiddleware, Middleware} from '../../helpers/middleware';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent, detachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport htmlToDocumentFragment from '../../helpers/dom/htmlToDocumentFragment';\nimport reflowScrollableElement from '../../helpers/dom/reflowScrollableElement';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {cancelAnimationByKey} from '../../helpers/animation';\nimport assumeType from '../../helpers/assumeType';\nimport debounce, {DebounceReturnType} from '../../helpers/schedulers/debounce';\nimport {SEND_WHEN_ONLINE_TIMESTAMP} from '../../lib/mtproto/constants';\nimport windowSize from '../../helpers/windowSize';\nimport {formatPhoneNumber} from '../../helpers/formatPhoneNumber';\nimport AppMediaViewer from '../appMediaViewer';\nimport SetTransition from '../singleTransition';\nimport handleHorizontalSwipe from '../../helpers/dom/handleHorizontalSwipe';\nimport findUpAttribute from '../../helpers/dom/findUpAttribute';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport formatCallDuration from '../../helpers/formatCallDuration';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport Button from '../button';\nimport {CallType} from '../../lib/calls/types';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport PopupJoinChatInvite from '../popups/joinChatInvite';\nimport {InternalLink, INTERNAL_LINK_TYPE} from '../../lib/appManagers/internalLink';\nimport ReactionsElement, {REACTIONS_ELEMENTS} from './reactions';\nimport type ReactionElement from './reaction';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport pause from '../../helpers/schedulers/pause';\nimport ScrollSaver from '../../helpers/scrollSaver';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport formatNumber from '../../helpers/number/formatNumber';\nimport getViewportSlice from '../../helpers/dom/getViewportSlice';\nimport SuperIntersectionObserver from '../../helpers/dom/superIntersectionObserver';\nimport generateFakeIcon from '../generateFakeIcon';\nimport copyFromElement from '../../helpers/dom/copyFromElement';\nimport PopupElement from '../popups';\nimport setAttachmentSize from '../../helpers/setAttachmentSize';\nimport wrapWebPageDescription from '../wrappers/webPageDescription';\nimport wrapWebPageTitle from '../wrappers/webPageTitle';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport wrapMessageActionTextNew from '../wrappers/messageActionTextNew';\nimport isMentionUnread from '../../lib/appManagers/utils/messages/isMentionUnread';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport getPeerColorById from '../../lib/appManagers/utils/peers/getPeerColorById';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport generateMessageId from '../../lib/appManagers/utils/messageId/generateMessageId';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {Awaited, SendMessageEmojiInteractionData} from '../../types';\nimport idleController from '../../helpers/idleController';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport {cancelContextMenuOpening} from '../../helpers/dom/attachContextMenuListener';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {AckedResult} from '../../lib/mtproto/superMessagePort';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport {EmoticonsDropdown} from '../emoticonsDropdown';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport noop from '../../helpers/noop';\nimport getAlbumText from '../../lib/appManagers/utils/messages/getAlbumText';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport PopupPayment from '../popups/payment';\nimport isInDOM from '../../helpers/dom/isInDOM';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport attachStickerViewerListeners from '../stickerViewer';\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\nimport wrapSticker, {onEmojiStickerClick} from '../wrappers/sticker';\nimport wrapAlbum from '../wrappers/album';\nimport wrapDocument from '../wrappers/document';\nimport wrapGroupedDocuments from '../wrappers/groupedDocuments';\nimport wrapPhoto from '../wrappers/photo';\nimport wrapPoll from '../wrappers/poll';\nimport wrapVideo from '../wrappers/video';\nimport isRTL from '../../helpers/string/isRTL';\nimport NBSP from '../../helpers/string/nbsp';\nimport DotRenderer from '../dotRenderer';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport {BatchProcessor} from '../../helpers/sortedList';\nimport wrapUrl from '../../lib/richTextProcessor/wrapUrl';\nimport getMessageThreadId from '../../lib/appManagers/utils/messages/getMessageThreadId';\nimport wrapTopicNameButton from '../wrappers/topicNameButton';\nimport wrapMediaSpoiler, {onMediaSpoilerClick, toggleMediaSpoiler} from '../wrappers/mediaSpoiler';\nimport confirmationPopup from '../confirmationPopup';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport {PopupPeerCheckboxOptions} from '../popups/peer';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\n\nexport const USER_REACTIONS_INLINE = false;\nconst USE_MEDIA_TAILS = false;\ntype MESSAGE_ACTION_TYPE = Message.messageService['action']['_'];\ntype IGNORE_ACTION_KEY = MESSAGE_ACTION_TYPE;\ntype IGNORE_ACTION_VALUE = true | ((message: Message.messageService) => boolean);\nconst IGNORE_ACTIONS: Map = new Map([\n ['messageActionHistoryClear', true],\n ['messageActionChatCreate', (message) => message.pFlags.out]\n // 'messageActionChannelMigrateFrom'\n] as [IGNORE_ACTION_KEY, IGNORE_ACTION_VALUE][]);\n\nexport const SERVICE_AS_REGULAR: Set = new Set();\n\nif(IS_CALL_SUPPORTED) {\n SERVICE_AS_REGULAR.add('messageActionPhoneCall');\n}\n\nconst TEST_SCROLL_TIMES: number = undefined;\nlet TEST_SCROLL = TEST_SCROLL_TIMES;\n\nlet queueId = 0;\n\ntype GenerateLocalMessageType = IsService extends true ? Message.messageService : Message.message;\n\nconst SPONSORED_MESSAGE_ID_OFFSET = 1;\nexport const STICKY_OFFSET = 3;\nconst SCROLLED_DOWN_THRESHOLD = 300;\nconst PEER_CHANGED_ERROR = new Error('peer changed');\n\nconst DO_NOT_SLICE_VIEWPORT = false;\nconst DO_NOT_SLICE_VIEWPORT_ON_RENDER = false;\nconst DO_NOT_UPDATE_MESSAGE_VIEWS = false;\nconst DO_NOT_UPDATE_MESSAGE_REACTIONS = false;\nconst DO_NOT_UPDATE_MESSAGE_REPLY = false;\n\nconst BIG_EMOJI_SIZES: {[size: number]: number} = {\n 1: 96,\n 2: 90,\n 3: 84,\n 4: 72,\n 5: 60,\n 6: 48,\n 7: 36\n};\nconst BIG_EMOJI_SIZES_LENGTH = Object.keys(BIG_EMOJI_SIZES).length;\n\ntype Bubble = {\n bubble: HTMLElement,\n mids: Set,\n groupedId?: string\n};\n\ntype MyHistoryResult = HistoryResult | {history: number[]};\n\nfunction getMainMidForGrouped(mids: number[]) {\n return Math.max(...mids);\n}\n\nexport default class ChatBubbles {\n public container: HTMLDivElement;\n public chatInner: HTMLDivElement;\n public scrollable: Scrollable;\n\n private getHistoryTopPromise: Promise;\n private getHistoryBottomPromise: Promise;\n\n // public messagesCount: number = -1;\n\n private unreadOut = new Set();\n public needUpdate: {replyToPeerId: PeerId, replyMid: number, mid: number}[] = []; // if need wrapSingleMessage\n\n public bubbles: {[mid: string]: HTMLElement} = {};\n public skippedMids: Set = new Set();\n public bubblesNewByGroupedId: {[groupId: string]: Bubble} = {};\n public bubblesNew: {[mid: string]: Bubble} = {};\n private dateMessages: {[timestamp: number]: {\n div: HTMLElement,\n firstTimestamp: number,\n container: HTMLElement,\n timeout?: number\n }} = {};\n\n private scrolledDown = true;\n private isScrollingTimeout = 0;\n\n private stickyIntersector: StickyIntersector;\n\n private unreaded: Map = new Map();\n private unreadedSeen: Set = new Set();\n private readPromise: Promise;\n\n private bubbleGroups: BubbleGroups;\n\n private preloader: ProgressivePreloader = null;\n\n // private messagesQueueOnRender: () => void = null;\n private messagesQueueOnRenderAdditional: () => void = null;\n\n private firstUnreadBubble: HTMLElement = null;\n private attachedUnreadBubble: boolean;\n\n public lazyLoadQueue: LazyLoadQueue;\n\n private middlewareHelper = getMiddleware();\n\n private log: ReturnType;\n\n public listenerSetter: ListenerSetter;\n\n private followStack: number[] = [];\n\n private isHeavyAnimationInProgress = false;\n private scrollingToBubble: HTMLElement;\n\n private isFirstLoad = true;\n private needReflowScroll: boolean;\n\n private fetchNewPromise: Promise;\n\n private passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }> = {};\n\n private onAnimateLadder: () => Promise | void;\n // private ladderDeferred: CancellablePromise;\n private resolveLadderAnimation: () => Promise;\n private emptyPlaceholderBubble: HTMLElement;\n\n private viewsMids: Set = new Set();\n private sendViewCountersDebounced: () => Promise;\n\n private isTopPaddingSet = false;\n\n private getSponsoredMessagePromise: Promise;\n\n private previousStickyDate: HTMLElement;\n private sponsoredMessage: SponsoredMessage.sponsoredMessage;\n\n private hoverBubble: HTMLElement;\n private hoverReaction: HTMLElement;\n private sliceViewportDebounced: DebounceReturnType;\n private resizeObserver: ResizeObserver;\n private willScrollOnLoad: boolean;\n public observer: SuperIntersectionObserver;\n\n private renderingMessages: Set = new Set();\n private setPeerCached: boolean;\n private attachPlaceholderOnRender: () => void;\n\n private bubblesToEject: Set = new Set();\n private bubblesToReplace: Map = new Map(); // TO -> FROM\n private updatePlaceholderPosition: () => void;\n private setPeerOptions: {lastMsgId: number; topMessage: number; savedPosition: ChatSavedPosition};\n\n private setPeerTempId: number = 0;\n\n private renderNewPromises: Set> = new Set();\n private updateGradient: boolean;\n\n private extendedMediaMessages: Set = new Set();\n private pollExtendedMediaMessagesPromise: Promise;\n\n private batchProcessor: BatchProcessor>>;\n\n // private reactions: Map;\n\n constructor(\n private chat: Chat,\n private managers: AppManagers\n ) {\n this.log = this.chat.log;\n // this.chat.log.error('Bubbles construction');\n\n this.listenerSetter = new ListenerSetter();\n\n this.constructBubbles();\n\n // * constructor end\n\n this.batchProcessor = new BatchProcessor({\n log: this.log,\n process: this.processBatch,\n possibleError: PEER_CHANGED_ERROR\n });\n this.bubbleGroups = new BubbleGroups(this.chat);\n this.preloader = new ProgressivePreloader({\n cancelable: false\n });\n this.lazyLoadQueue = new LazyLoadQueue(undefined, true);\n this.lazyLoadQueue.queueId = ++queueId;\n\n // this.reactions = new Map();\n\n // * events\n\n // will call when sent for update pos\n this.listenerSetter.add(rootScope)('history_update', async({storageKey, sequential, message}) => {\n if(this.chat.messagesStorageKey !== storageKey || this.chat.type === 'scheduled') {\n return;\n }\n\n const {mid} = message;\n const log = false ? this.log.bindPrefix('history_update-' + mid) : undefined;\n log && log('start');\n\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n if(this.renderNewPromises.size) {\n log && log.error('will await new messages render');\n await Promise.all(Array.from(this.renderNewPromises));\n }\n\n if(this.messagesQueuePromise) {\n log && log.error('messages render in process');\n await this.messagesQueuePromise;\n }\n\n if(this.bubbles[mid] !== bubble) return;\n\n // await getHeavyAnimationPromise();\n\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(!item) { // probably a group item\n log && log.error('no item by bubble', bubble);\n return;\n } else if(item.mid === mid) {\n log && log.warn('wow what', item, mid);\n return;\n }\n\n if(sequential) {\n const group = item.group;\n const newItem = this.bubbleGroups.createItem(bubble, message);\n // newItem.mid = item.mid;\n const _items = this.bubbleGroups.itemsArr.slice();\n indexOfAndSplice(_items, item);\n const foundItem = this.bubbleGroups.findGroupSiblingByItem(newItem, _items);\n if(\n group === foundItem?.group ||\n (group === this.bubbleGroups.getLastGroup() && group.items.length === 1 && newItem.dateTimestamp === item.dateTimestamp) ||\n (this.peerId === rootScope.myId && sequential && newItem.dateTimestamp === item.dateTimestamp)\n ) {\n log && log('item has correct position', item);\n this.bubbleGroups.changeBubbleMid(bubble, mid);\n return;\n }\n }\n\n // return;\n\n // await fastRafPromise();\n // if(this.bubbles[mid] !== bubble) return;\n\n // const groupIndex = this.bubbleGroups.groups.indexOf(group);\n this.bubbleGroups.removeAndUnmountBubble(bubble);\n // if(!group.items.length) { // group has collapsed, next message can have higher mid so have to reposition them too\n // log && log('group has collapsed', item);\n\n // const siblingGroups = this.bubbleGroups.groups.slice(0, groupIndex + 1);\n // for(let length = siblingGroups.length, i = length - 2; i >= 0; --i) {\n // const siblingGroup = siblingGroups[i];\n // const siblingItems = siblingGroup.items;\n // const nextGroup = siblingGroups[i + 1];\n // const nextItems = nextGroup.items;\n\n // let _break = false, moved = false;\n // for(let j = siblingItems.length - 1; j >= 0; --j) {\n // const siblingItem = siblingItems[j];\n // const foundItem = this.bubbleGroups.findGroupSiblingByItem(siblingItem, nextItems);\n // if(!foundItem) {\n // _break = true;\n // break;\n // }\n\n // log('will move item', siblingItem, nextGroup);\n // this.bubbleGroups.removeAndUnmountBubble(siblingItem.bubble);\n // this.bubbleGroups.addItemToGroup(siblingItem, nextGroup);\n // moved = true;\n // }\n\n // if(moved) {\n // nextGroup.mount();\n // }\n\n // if(_break) {\n // break;\n // }\n // }\n // }\n\n const {groups} = this.groupBubbles([{bubble, message}]);\n this.bubbleGroups.mountUnmountGroups(groups);\n\n if(this.scrollingToBubble) {\n this.scrollToEnd();\n }\n\n log && log('end');\n\n // this.bubbleGroups.findIncorrentPositions();\n });\n\n this.listenerSetter.add(rootScope)('dialog_flush', ({peerId}) => {\n if(this.peerId === peerId) {\n this.deleteMessagesByIds(Object.keys(this.bubbles).map((m) => +m));\n }\n });\n\n // Calls when message successfully sent and we have an id\n this.listenerSetter.add(rootScope)('message_sent', async(e) => {\n const {storageKey, tempId, tempMessage, mid, message} = e;\n\n // ! can't use peerId to validate here, because id can be the same in 'scheduled' and 'chat' types\n if(this.chat.messagesStorageKey !== storageKey) {\n return;\n }\n\n const bubbles = this.bubbles;\n const _bubble = bubbles[tempId];\n if(_bubble) {\n const bubble = bubbles[tempId];\n bubbles[mid] = bubble;\n bubble.dataset.mid = '' + mid;\n delete bubbles[tempId];\n\n fastRaf(() => {\n const mid = +bubble.dataset.mid;\n if(bubbles[mid] === bubble && bubble.classList.contains('is-outgoing')) {\n bubble.classList.remove('is-sending', 'is-outgoing');\n bubble.classList.add((this.peerId === rootScope.myId && this.chat.type !== 'scheduled') || !this.unreadOut.has(mid) ? 'is-read' : 'is-sent');\n }\n });\n }\n\n if(this.unreadOut.has(tempId)) {\n this.unreadOut.delete(tempId);\n this.unreadOut.add(mid);\n }\n\n // * check timing of scheduled message\n if(this.chat.type === 'scheduled') {\n const timestamp = Date.now() / 1000 | 0;\n const maxTimestamp = tempMessage.date - 10;\n if(timestamp >= maxTimestamp) {\n this.deleteMessagesByIds([mid]);\n }\n }\n\n if(!_bubble) {\n return;\n }\n\n let messages: (Message.message | Message.messageService)[], tempIds: number[];\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n messages = await this.managers.appMessagesManager.getMessagesByAlbum(groupedId);\n const mids = messages.map(({mid}) => mid);\n if(!mids.length || getMainMidForGrouped(mids) !== mid || bubbles[mid] !== _bubble) {\n return;\n }\n\n if(bubbles[mid] !== _bubble) {\n return;\n }\n\n tempIds = (Array.from(_bubble.querySelectorAll('.grouped-item')) as HTMLElement[]).map((el) => +el.dataset.mid);\n } else {\n messages = [message];\n tempIds = [tempId];\n }\n\n const reactionsElements = Array.from(_bubble.querySelectorAll('reactions-element')) as ReactionsElement[];\n if(reactionsElements.length) {\n reactionsElements.forEach((reactionsElement) => {\n reactionsElement.changeMessage(message as Message.message);\n });\n }\n\n (messages as Message.message[]).forEach((message, idx) => {\n if(!message) {\n return;\n }\n\n const tempId = tempIds[idx];\n const mid = message.mid;\n const bubble: HTMLElement = _bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || _bubble;\n\n if(message._ !== 'message') {\n return;\n }\n\n if(message.replies) {\n const repliesElement = _bubble.querySelector('replies-element') as RepliesElement;\n if(repliesElement) {\n repliesElement.message = message;\n repliesElement.init();\n }\n }\n\n const media = message.media ?? {} as MessageMedia.messageMediaEmpty;\n const doc = (media as MessageMedia.messageMediaDocument).document as Document.document;\n const poll = (media as MessageMedia.messageMediaPoll).poll;\n const webPage = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage;\n if(doc) {\n const div = bubble.querySelector(`.document-container[data-mid=\"${tempId}\"] .document`);\n if(div) {\n const container = findUpClassName(div, 'document-container');\n\n if(!tempMessage.media?.document?.thumbs?.length && doc.thumbs?.length) {\n getHeavyAnimationPromise().then(async() => {\n const timeSpan = div.querySelector('.time');\n const newDiv = await wrapDocument({message, fontSize: rootScope.settings.messagesTextSize});\n div.replaceWith(newDiv);\n\n if(timeSpan) {\n (newDiv.querySelector('.document') || newDiv).append(timeSpan);\n }\n });\n }\n\n if(container) {\n container.dataset.mid = '' + mid;\n }\n }\n\n const element = bubble.querySelector(`audio-element[data-mid=\"${tempId}\"], .document[data-doc-id=\"${tempId}\"], .media-round[data-mid=\"${tempId}\"]`) as HTMLElement;\n if(element) {\n if(element instanceof AudioElement || element.classList.contains('media-round')) {\n element.dataset.mid = '' + message.mid;\n delete element.dataset.isOutgoing;\n (element as any).message = message;\n (element as any).onLoad(true);\n } else {\n element.dataset.docId = '' + doc.id;\n (element as any).doc = doc;\n }\n }\n } else if(poll) {\n const pollElement = bubble.querySelector('poll-element') as PollElement;\n if(pollElement) {\n pollElement.message = message;\n pollElement.setAttribute('poll-id', '' + poll.id);\n pollElement.setAttribute('message-id', '' + mid);\n }\n } else if(webPage && !bubble.querySelector('.web')) {\n getHeavyAnimationPromise().then(() => {\n this.safeRenderMessage(message, true, bubble);\n this.scrollToBubbleIfLast(bubble);\n });\n }\n\n // set new mids to album items for mediaViewer\n if(groupedId) {\n const item = (bubble.querySelector(`.grouped-item[data-mid=\"${tempId}\"]`) as HTMLElement) || bubble; // * it can be .document-container\n if(item) {\n item.dataset.mid = '' + mid;\n }\n }\n });\n });\n\n this.listenerSetter.add(rootScope)('message_edit', async({storageKey, message}) => {\n if(storageKey !== this.chat.messagesStorageKey) return;\n\n const bubble = this.bubbles[message.mid];\n if(!bubble) return;\n\n await getHeavyAnimationPromise();\n if(this.bubbles[message.mid] !== bubble) return;\n\n this.safeRenderMessage(message, true, bubble);\n });\n\n this.listenerSetter.add(rootScope)('message_error', async({storageKey, tempId}) => {\n if(storageKey !== this.chat.messagesStorageKey) return;\n\n const bubble = this.bubbles[tempId];\n if(!bubble) return;\n\n await getHeavyAnimationPromise();\n if(this.bubbles[tempId] !== bubble) return;\n\n bubble.classList.remove('is-outgoing');\n bubble.classList.add('is-error');\n });\n\n this.listenerSetter.add(rootScope)('album_edit', ({peerId, messages, deletedMids}) => {\n if(peerId !== this.peerId) return;\n\n const mids = messages.map(({mid}) => mid);\n const oldMids = mids.concat(Array.from(deletedMids));\n const wasMainMid = getMainMidForGrouped(oldMids);\n const bubble = this.bubbles[wasMainMid];\n if(!bubble) {\n return;\n }\n\n const mainMid = getMainMidForGrouped(mids);\n const message = messages.find((message) => message.mid === mainMid);\n this.safeRenderMessage(message, true, bubble);\n });\n\n // this.listenerSetter.add(rootScope)('peer_title_edit', async(peerId) => {\n // if(peerId.isUser()) {\n // const middleware = this.getMiddleware();\n // const user = await this.managers.appUsersManager.getUser(peerId.toUserId());\n // if(!middleware()) return;\n\n // const isPremium = user?.pFlags?.premium;\n // const groups = this.bubbleGroups.groups.filter((group) => group.avatar?.peerId === peerId);\n // groups.forEach((group) => {\n // group.avatar.classList.toggle('is-premium', isPremium);\n // group.avatar.classList.toggle('tgico-star', isPremium);\n // });\n // }\n // });\n\n if(!DO_NOT_UPDATE_MESSAGE_REACTIONS/* && false */) {\n this.listenerSetter.add(rootScope)('messages_reactions', async(arr) => {\n if(this.chat.type === 'scheduled') {\n return;\n }\n\n let scrollSaver: ScrollSaver;\n\n const a = arr.map(async({message, changedResults}) => {\n if(this.peerId !== message.peerId) {\n return;\n }\n\n const result = await this.getMountedBubble(message.mid, message);\n if(!result) {\n return;\n }\n\n return {bubble: result.bubble, message, changedResults};\n });\n\n let top: number;\n (await Promise.all(a)).filter(Boolean).forEach(({bubble, message, changedResults}) => {\n if(!scrollSaver) {\n scrollSaver = this.createScrollSaver(false);\n scrollSaver.save();\n }\n\n const key = message.peerId + '_' + message.mid;\n const set = REACTIONS_ELEMENTS.get(key);\n if(set) {\n for(const element of set) {\n element.update(message, changedResults);\n }\n } else if(!message.reactions || !message.reactions.results.length) {\n return;\n } else {\n this.appendReactionsElementToBubble(bubble, message, message, changedResults);\n }\n });\n\n if(scrollSaver) {\n scrollSaver.restore();\n }\n });\n }\n\n !DO_NOT_UPDATE_MESSAGE_REPLY && this.listenerSetter.add(rootScope)('messages_downloaded', async({peerId, mids}) => {\n const middleware = this.getMiddleware();\n await getHeavyAnimationPromise();\n if(!middleware()) return;\n\n (mids as number[]).forEach((mid) => {\n const needUpdate = this.needUpdate;\n const filtered: typeof needUpdate[0][] = [];\n forEachReverse(this.needUpdate, (obj, idx) => {\n if(obj.replyMid === mid && obj.replyToPeerId === peerId) {\n this.needUpdate.splice(idx, 1)[0];\n filtered.push(obj);\n }\n });\n\n filtered.forEach(async({mid, replyMid, replyToPeerId}) => {\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n const message = (await this.chat.getMessage(mid)) as Message.message;\n\n MessageRender.setReply({\n chat: this.chat,\n bubble,\n message\n });\n });\n });\n });\n\n attachStickerViewerListeners({\n listenTo: this.scrollable.container,\n listenerSetter: this.listenerSetter,\n findTarget: (e) => {\n const target = e.target as HTMLElement;\n const found = target.closest('.attachment.media-sticker-wrapper') || (findUpClassName(target, 'attachment') && target.closest('.custom-emoji'));\n return found as HTMLElement;\n }\n });\n attachClickEvent(this.scrollable.container, this.onBubblesClick, {listenerSetter: this.listenerSetter});\n // this.listenerSetter.add(this.bubblesContainer)('click', this.onBubblesClick/* , {capture: true, passive: false} */);\n\n this.listenerSetter.add(this.scrollable.container)('mousedown', (e) => {\n if(e.button !== 0) return;\n\n const code: HTMLElement = findUpTag(e.target, 'CODE');\n if(code) {\n cancelEvent(e);\n copyFromElement(code);\n\n const onClick = (e: MouseEvent) => {\n cancelEvent(e);\n toastNew({\n langPackKey: 'TextCopied',\n onClose: () => {\n detach();\n }\n });\n };\n\n const detach = attachClickEvent(window, onClick, {listenerSetter: this.listenerSetter, once: true, capture: true});\n return;\n }\n });\n\n /* if(false) */this.stickyIntersector = new StickyIntersector(this.scrollable.container, (stuck, target) => {\n for(const timestamp in this.dateMessages) {\n const dateMessage = this.dateMessages[timestamp];\n if(dateMessage.container === target) {\n const dateBubble = dateMessage.div;\n\n // dateMessage.container.classList.add('has-sticky-dates');\n\n // SetTransition(dateBubble, 'kek', stuck, this.previousStickyDate ? 300 : 0);\n // if(this.previousStickyDate) {\n // dateBubble.classList.add('kek');\n // }\n\n dateBubble.classList.toggle('is-sticky', stuck);\n if(stuck) {\n this.previousStickyDate = dateBubble;\n }\n\n break;\n }\n }\n\n if(this.previousStickyDate) {\n // fastRaf(() => {\n // this.bubblesContainer.classList.add('has-sticky-dates');\n // });\n }\n });\n\n if(!IS_SAFARI) {\n this.sliceViewportDebounced = debounce(this.sliceViewport.bind(this), 3000, false, true);\n }\n\n let middleware: ReturnType;\n useHeavyAnimationCheck(() => {\n this.isHeavyAnimationInProgress = true;\n this.lazyLoadQueue.lock();\n middleware = this.getMiddleware();\n\n // if(this.sliceViewportDebounced) {\n // this.sliceViewportDebounced.clearTimeout();\n // }\n }, () => {\n this.isHeavyAnimationInProgress = false;\n\n if(middleware?.()) {\n this.lazyLoadQueue.unlockAndRefresh();\n\n // if(this.sliceViewportDebounced) {\n // this.sliceViewportDebounced();\n // }\n }\n\n middleware = null;\n }, this.listenerSetter);\n }\n\n private constructBubbles() {\n const container = this.container = document.createElement('div');\n container.classList.add('bubbles', 'scrolled-down');\n\n const chatInner = this.chatInner = document.createElement('div');\n chatInner.classList.add('bubbles-inner');\n\n this.setScroll();\n\n container.append(this.scrollable.container);\n }\n\n public attachContainerListeners() {\n const container = this.container;\n\n this.chat.contextMenu.attachTo(container);\n this.chat.selection.attachListeners(container, new ListenerSetter());\n\n if(DEBUG) {\n this.listenerSetter.add(container)('dblclick', async(e) => {\n const bubble = findUpClassName(e.target, 'grouped-item') || findUpClassName(e.target, 'bubble');\n if(bubble) {\n const mid = +bubble.dataset.mid\n this.log('debug message:', await this.chat.getMessage(mid));\n this.highlightBubble(bubble);\n }\n });\n }\n\n if(!IS_MOBILE) {\n this.listenerSetter.add(container)('dblclick', async(e) => {\n if(this.chat.type === 'pinned' ||\n this.chat.selection.isSelecting ||\n !(await this.chat.canSend())) {\n return;\n }\n\n const target = e.target as HTMLElement;\n const bubble = target.classList.contains('bubble') ?\n target :\n (target.classList.contains('document-selection') ? target.parentElement : null);\n if(bubble && !bubble.classList.contains('bubble-first')) {\n const mid = +bubble.dataset.mid;\n const message = await this.chat.getMessage(mid);\n if(message.pFlags.is_outgoing) {\n return;\n }\n\n this.chat.input.initMessageReply(mid);\n }\n });\n } else if(IS_TOUCH_SUPPORTED) {\n const className = 'is-gesturing-reply';\n const MAX = 64;\n const replyAfter = MAX * .75;\n let shouldReply = false;\n let target: HTMLElement;\n let icon: HTMLElement;\n let swipeAvatar: HTMLElement;\n handleHorizontalSwipe({\n element: container,\n verifyTouchTarget: async(e) => {\n if(this.chat.type === 'pinned' || this.chat.selection.isSelecting || !(await this.chat.canSend())) {\n return false;\n }\n\n // cancelEvent(e);\n target = findUpClassName(e.target, 'bubble');\n if(target) {\n try {\n const avatar = target.parentElement.querySelector('.bubbles-group-avatar') as HTMLElement\n if(avatar) {\n const visibleRect = getVisibleRect(avatar, target);\n if(visibleRect) {\n swipeAvatar = avatar;\n }\n }\n } catch(err) {}\n\n SetTransition({\n element: target,\n className,\n forwards: true,\n duration: 250\n });\n void target.offsetLeft; // reflow\n\n if(!icon) {\n icon = document.createElement('span');\n icon.classList.add('tgico-reply_filled', 'bubble-gesture-reply-icon');\n } else {\n icon.classList.remove('is-visible');\n icon.style.opacity = '';\n }\n\n target/* .querySelector('.bubble-content') */.append(icon);\n }\n\n return !!target;\n },\n onSwipe: (xDiff) => {\n shouldReply = xDiff >= replyAfter;\n\n if(shouldReply && !icon.classList.contains('is-visible')) {\n icon.classList.add('is-visible');\n }\n icon.style.opacity = '' + Math.min(1, xDiff / replyAfter);\n\n const x = -Math.max(0, Math.min(MAX, xDiff));\n const transform = `translateX(${x}px)`;\n target.style.transform = transform;\n if(swipeAvatar) {\n swipeAvatar.style.transform = transform;\n }\n cancelContextMenuOpening();\n },\n onReset: () => {\n const _target = target;\n const _swipeAvatar = swipeAvatar;\n target = swipeAvatar = undefined;\n SetTransition({\n element: _target,\n className,\n forwards: false,\n duration: 250,\n onTransitionEnd: () => {\n if(icon.parentElement === _target) {\n icon.classList.remove('is-visible');\n icon.remove();\n }\n }\n });\n\n fastRaf(() => {\n _target.style.transform = '';\n if(_swipeAvatar) {\n _swipeAvatar.style.transform = '';\n }\n\n if(shouldReply) {\n const {mid} = _target.dataset;\n this.chat.input.initMessageReply(+mid);\n shouldReply = false;\n }\n });\n },\n listenerOptions: {capture: true}\n });\n }\n }\n\n public constructPeerHelpers() {\n // will call when message is sent (only 1)\n this.listenerSetter.add(rootScope)('history_append', async({storageKey, message}) => {\n if(storageKey !== this.chat.messagesStorageKey || this.chat.type === 'scheduled') return;\n\n if(rootScope.settings.animationsEnabled) {\n this.updateGradient = true;\n }\n\n if(!this.scrollable.loadedAll.bottom) {\n this.chat.setMessageId();\n } else {\n this.renderNewMessage(message, true);\n }\n });\n\n this.listenerSetter.add(rootScope)('history_multiappend', (message) => {\n if(this.peerId !== message.peerId || this.chat.type === 'scheduled') return;\n this.renderNewMessage(message);\n });\n\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\n if(peerId !== this.peerId || this.chat.type === 'scheduled') {\n return;\n }\n\n this.deleteMessagesByIds(Array.from(msgs));\n });\n\n this.listenerSetter.add(rootScope)('dialog_unread', ({peerId}) => {\n if(peerId === this.peerId) {\n this.chat.input.setUnreadCount();\n\n getHeavyAnimationPromise().then(() => {\n this.updateUnreadByDialog();\n });\n }\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n if(!dialogs.has(this.peerId) || this.chat.type === 'scheduled') {\n return;\n }\n\n this.chat.input.setUnreadCount();\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(this.peerId !== dialog.peerId || this.chat.type === 'scheduled') {\n return;\n }\n\n this.chat.input.setUnreadCount();\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n const {peerId} = this;\n if(peerId !== chatId.toPeerId(true)) {\n return;\n }\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n const hadRights = this.chatInner.classList.contains('has-rights');\n const hasRights = await this.chat.canSend();\n\n if(hadRights !== hasRights) {\n const callbacks = await Promise.all([\n this.finishPeerChange(),\n this.chat.input.finishPeerChange()\n ]);\n\n callbacks.forEach((callback) => callback());\n }\n\n if(!!(chat as MTChat.channel).pFlags.forum !== this.chat.isForum && this.chat.type === 'chat') {\n this.chat.peerId = 0;\n this.chat.appImManager.setPeer({peerId});\n }\n });\n\n this.listenerSetter.add(rootScope)('history_reload', (peerId) => {\n if(peerId !== this.peerId) {\n return;\n }\n\n const mids = getObjectKeysAndSort(this.bubbles, 'desc').filter((mid) => mid > 0);\n const middleware = this.getMiddleware();\n this.managers.appMessagesManager.reloadMessages(this.peerId, mids).then((messages) => {\n if(!middleware()) return;\n\n const toDelete: number[] = [];\n messages.forEach((message, idx) => {\n const mid = mids[idx];\n if(message) {\n const bubble = this.bubbles[message.mid];\n if(!bubble) return;\n\n this.safeRenderMessage(message, true, bubble);\n } else {\n toDelete.push(mid);\n }\n });\n\n this.deleteMessagesByIds(toDelete);\n\n this.setLoaded('top', false);\n this.setLoaded('bottom', false);\n this.scrollable.checkForTriggers();\n });\n });\n\n this.listenerSetter.add(rootScope)('settings_updated', async({key}) => {\n if(key === 'settings.emoji.big') {\n const middleware = this.getMiddleware();\n const mids = getObjectKeysAndSort(this.bubbles, 'desc');\n const m = mids.map(async(mid) => {\n const bubble = this.bubbles[mid];\n if(bubble.classList.contains('can-have-big-emoji')) {\n return {bubble, message: await this.chat.getMessage(mid)};\n }\n });\n\n const awaited = await Promise.all(m);\n if(!middleware()) {\n return;\n }\n\n awaited.filter(Boolean).forEach(({bubble, message}) => {\n if(this.bubbles[message.mid] !== bubble) {\n return;\n }\n\n this.safeRenderMessage(message, true, bubble);\n });\n }\n });\n\n !DO_NOT_UPDATE_MESSAGE_VIEWS && this.listenerSetter.add(rootScope)('messages_views', (arr) => {\n if(this.chat.type === 'scheduled') return;\n\n fastRaf(() => {\n let scrollSaver: ScrollSaver;\n for(const {peerId, views, mid} of arr) {\n if(this.peerId !== peerId) continue;\n\n const bubble = this.bubbles[mid];\n if(!bubble) continue;\n\n const postViewsElements = Array.from(bubble.querySelectorAll('.post-views')) as HTMLElement[];\n if(!postViewsElements.length) continue;\n\n const str = formatNumber(views, 1);\n let different = false;\n postViewsElements.forEach((postViews) => {\n if(different || postViews.textContent !== str) {\n if(!scrollSaver) {\n scrollSaver = this.createScrollSaver(true);\n scrollSaver.save();\n }\n\n different = true;\n postViews.textContent = str;\n }\n });\n }\n\n scrollSaver?.restore();\n });\n });\n\n this.observer = new SuperIntersectionObserver({root: this.scrollable.container});\n\n this.sendViewCountersDebounced = debounce(() => {\n const mids = [...this.viewsMids];\n this.viewsMids.clear();\n\n this.managers.appMessagesManager.incrementMessageViews(this.peerId, mids);\n }, 1000, false, true);\n\n // * pinned part start\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids, pinned}) => {\n if(this.chat.type !== 'pinned' || peerId !== this.peerId) {\n return;\n }\n\n if(mids) {\n if(!pinned) {\n this.deleteMessagesByIds(mids);\n }\n }\n });\n // * pinned part end\n\n // * scheduled part start\n const onUpdate = async() => {\n this.chat.topbar.setTitle((await this.managers.appMessagesManager.getScheduledMessagesStorage(this.peerId)).size);\n };\n\n this.listenerSetter.add(rootScope)('scheduled_new', (message) => {\n if(this.chat.type !== 'scheduled' || message.peerId !== this.peerId) return;\n\n this.renderNewMessage(message);\n onUpdate();\n });\n\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\n if(this.chat.type !== 'scheduled' || peerId !== this.peerId) return;\n\n this.deleteMessagesByIds(mids);\n onUpdate();\n });\n // * scheduled part end\n }\n\n private get peerId() {\n return this.chat.peerId;\n }\n\n public get messagesQueuePromise() {\n return this.batchProcessor.queuePromise;\n }\n\n private createScrollSaver(reverse = true) {\n const scrollSaver = new ScrollSaver(this.scrollable, '.bubble:not(.is-date)', reverse);\n return scrollSaver;\n }\n\n private unreadedObserverCallback = (entry: IntersectionObserverEntry) => {\n if(entry.isIntersecting) {\n const target = entry.target as HTMLElement;\n const mid = this.unreaded.get(target as HTMLElement);\n this.onUnreadedInViewport(target, mid);\n }\n };\n\n private viewsObserverCallback = (entry: IntersectionObserverEntry) => {\n if(entry.isIntersecting) {\n const mid = +(entry.target as HTMLElement).dataset.mid;\n this.observer.unobserve(entry.target, this.viewsObserverCallback);\n\n if(mid) {\n this.viewsMids.add(mid);\n this.sendViewCountersDebounced();\n } else {\n const {sponsoredMessage} = this;\n const randomId = sponsoredMessage?.random_id;\n if(randomId) {\n this.managers.appChatsManager.viewSponsoredMessage(this.peerId.toChatId(), randomId);\n delete sponsoredMessage.random_id;\n }\n }\n }\n };\n\n private stickerEffectObserverCallback = (entry: IntersectionObserverEntry) => {\n if(entry.isIntersecting) {\n this.observer.unobserve(entry.target, this.stickerEffectObserverCallback);\n\n const attachmentDiv: HTMLElement = entry.target.querySelector('.attachment');\n getHeavyAnimationPromise().then(() => {\n if(isInDOM(attachmentDiv)) {\n simulateClickEvent(attachmentDiv);\n }\n });\n }\n };\n\n private createResizeObserver() {\n if(!('ResizeObserver' in window) || this.resizeObserver) {\n return;\n }\n\n const container = this.scrollable.container;\n let wasHeight = 0/* container.offsetHeight */;\n let resizing = false;\n let skip = false;\n let scrolled = 0;\n let part = 0;\n let rAF = 0;\n // let skipNext = true;\n\n const onResizeEnd = () => {\n const height = container.offsetHeight;\n const isScrolledDown = this.scrollable.isScrolledDown;\n if(height !== wasHeight && (!skip || !isScrolledDown)) { // * fix opening keyboard while ESG is active, offsetHeight will change right between 'start' and this first frame\n part += wasHeight - height;\n }\n\n /* if(DEBUG) {\n this.log('resize end', scrolled, part, this.scrollable.scrollTop, height, wasHeight, this.scrollable.isScrolledDown);\n } */\n\n if(part) {\n this.scrollable.setScrollTopSilently(this.scrollable.scrollTop + Math.round(part));\n }\n\n wasHeight = height;\n scrolled = 0;\n rAF = 0;\n part = 0;\n resizing = false;\n skip = false;\n };\n\n const setEndRAF = (single: boolean) => {\n if(rAF) window.cancelAnimationFrame(rAF);\n rAF = window.requestAnimationFrame(single ? onResizeEnd : () => {\n rAF = window.requestAnimationFrame(onResizeEnd);\n // this.log('resize after RAF', part);\n });\n };\n\n const processEntries: ResizeObserverCallback = (entries) => {\n /* if(skipNext) {\n skipNext = false;\n return;\n } */\n\n if(skip) {\n setEndRAF(false);\n return;\n }\n\n const entry = entries[0];\n const height = entry.contentRect.height;/* Math.ceil(entry.contentRect.height); */\n\n if(!wasHeight) {\n wasHeight = height;\n return;\n }\n\n const realDiff = wasHeight - height;\n let diff = realDiff + part;\n const _part = diff % 1;\n diff -= _part;\n\n if(!resizing) {\n resizing = true;\n\n /* if(DEBUG) {\n this.log('resize start', realDiff, this.scrollable.scrollTop, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown);\n } */\n\n if(realDiff < 0 && this.scrollable.isScrolledDown) {\n // if(isSafari) { // * fix opening keyboard while ESG is active\n part = -realDiff;\n // }\n\n skip = true;\n setEndRAF(false);\n return;\n }\n }\n\n scrolled += diff;\n\n /* if(DEBUG) {\n this.log('resize', wasHeight - height, diff, this.scrollable.container.offsetHeight, this.scrollable.isScrolledDown, height, wasHeight);\n } */\n\n if(diff) {\n const needScrollTop = this.scrollable.scrollTop + diff;\n this.scrollable.setScrollTopSilently(needScrollTop);\n }\n\n setEndRAF(false);\n\n part = _part;\n wasHeight = height;\n };\n\n const resizeObserver = this.resizeObserver = new ResizeObserver(processEntries);\n resizeObserver.observe(container);\n }\n\n private destroyResizeObserver() {\n const resizeObserver = this.resizeObserver;\n if(!resizeObserver) {\n return;\n }\n\n resizeObserver.disconnect();\n this.resizeObserver = undefined;\n }\n\n private onBubblesMouseMove = async(e: MouseEvent) => {\n const content = findUpClassName(e.target, 'bubble-content');\n if(\n this.chat.type !== 'scheduled' &&\n content &&\n !this.chat.selection.isSelecting &&\n !findUpClassName(e.target, 'service') &&\n !findUpClassName(e.target, 'bubble-beside-button')\n ) {\n const bubble = findUpClassName(content, 'bubble');\n if(!this.chat.selection.canSelectBubble(bubble)) {\n this.unhoverPrevious();\n return;\n }\n\n let {hoverBubble, hoverReaction} = this;\n if(bubble === hoverBubble) {\n return;\n }\n\n this.unhoverPrevious();\n\n hoverBubble = this.hoverBubble = bubble;\n hoverReaction = this.hoverReaction;\n // hoverReaction = contentWrapper.querySelector('.bubble-hover-reaction');\n if(!hoverReaction) {\n hoverReaction = this.hoverReaction = document.createElement('div');\n hoverReaction.classList.add('bubble-hover-reaction');\n\n const stickerWrapper = document.createElement('div');\n stickerWrapper.classList.add('bubble-hover-reaction-sticker');\n hoverReaction.append(stickerWrapper);\n\n content.append(hoverReaction);\n\n let message = await this.chat.getMessage(+bubble.dataset.mid);\n if(message?._ !== 'message') {\n this.unhoverPrevious();\n return;\n }\n\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\n\n const middleware = this.getMiddleware(() => this.hoverReaction === hoverReaction);\n Promise.all([\n this.managers.appReactionsManager.getAvailableReactionsByMessage(message),\n pause(400)\n ]).then(([availableReactions]) => {\n const availableReaction = availableReactions[0];\n if(!availableReaction) {\n hoverReaction.remove();\n return;\n }\n\n wrapSticker({\n div: stickerWrapper,\n doc: availableReaction.select_animation,\n width: 18,\n height: 18,\n needUpscale: true,\n middleware,\n group: this.chat.animationGroup,\n withThumb: false,\n needFadeIn: false\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n player.addEventListener('firstFrame', () => {\n if(!middleware()) {\n // debugger;\n return;\n }\n\n hoverReaction.dataset.loaded = '1';\n this.setHoverVisible(hoverReaction, true);\n }, {once: true});\n\n attachClickEvent(hoverReaction, (e) => {\n cancelEvent(e); // cancel triggering selection\n\n this.managers.appReactionsManager.sendReaction(message as Message.message, availableReaction);\n this.unhoverPrevious();\n }, {listenerSetter: this.listenerSetter});\n }, noop);\n });\n } else if(hoverReaction.dataset.loaded) {\n this.setHoverVisible(hoverReaction, true);\n }\n } else {\n this.unhoverPrevious();\n }\n };\n\n public setReactionsHoverListeners() {\n this.listenerSetter.add(contextMenuController)('toggle', this.unhoverPrevious);\n this.listenerSetter.add(overlayCounter)('change', this.unhoverPrevious);\n this.listenerSetter.add(this.chat.selection)('toggle', this.unhoverPrevious);\n this.listenerSetter.add(this.container)('mousemove', this.onBubblesMouseMove);\n }\n\n private setHoverVisible(hoverReaction: HTMLElement, visible: boolean) {\n if(hoverReaction.parentElement) {\n hoverReaction.parentElement.classList.toggle('hover-reaction-visible', visible);\n }\n\n SetTransition({\n element: hoverReaction,\n className: 'is-visible',\n forwards: visible,\n duration: 200,\n onTransitionEnd: visible ? undefined : () => {\n hoverReaction.remove();\n },\n useRafs: 2\n });\n }\n\n private unhoverPrevious = () => {\n const {hoverBubble, hoverReaction} = this;\n if(hoverBubble) {\n this.setHoverVisible(hoverReaction, false);\n this.hoverBubble = undefined;\n this.hoverReaction = undefined;\n }\n };\n\n public setStickyDateManually() {\n return;\n\n const timestamps = Object.keys(this.dateMessages).map((k) => +k).sort((a, b) => b - a);\n let lastVisible: HTMLElement;\n\n // if(this.chatInner.classList.contains('is-scrolling')) {\n const {scrollTop} = this.scrollable.container;\n const isOverflown = scrollTop > 0;\n if(isOverflown) {\n for(const timestamp of timestamps) {\n const dateMessage = this.dateMessages[timestamp];\n const visibleRect = getVisibleRect(dateMessage.container, this.scrollable.container);\n if(visibleRect && visibleRect.overflow.top) {\n lastVisible = dateMessage.div;\n } else if(lastVisible) {\n break;\n }\n }\n }\n // }\n\n if(lastVisible === this.previousStickyDate) {\n return;\n }\n\n if(lastVisible) {\n const needReflow = /* !!this.chat.setPeerPromise || */!this.previousStickyDate;\n if(needReflow) {\n lastVisible.classList.add('no-transition');\n }\n\n lastVisible.classList.add('is-sticky');\n\n if(needReflow) {\n void lastVisible.offsetLeft; // reflow\n lastVisible.classList.remove('no-transition');\n }\n }\n\n if(this.previousStickyDate && this.previousStickyDate !== lastVisible) {\n this.previousStickyDate.classList.remove('is-sticky');\n }\n\n this.previousStickyDate = lastVisible;\n }\n\n public getRenderedLength() {\n return Object.keys(this.bubbles).length - this.skippedMids.size;\n }\n\n private onUnreadedInViewport(target: HTMLElement, mid: number) {\n this.unreadedSeen.add(mid);\n this.observer.unobserve(target, this.unreadedObserverCallback);\n this.unreaded.delete(target);\n this.readUnreaded();\n }\n\n private readUnreaded() {\n if(this.readPromise) return;\n\n const middleware = this.getMiddleware();\n this.readPromise = idleController.getFocusPromise().then(async() => {\n if(!middleware()) return;\n let maxId = Math.max(...Array.from(this.unreadedSeen));\n\n // ? if message with maxId is not rendered ?\n if(this.scrollable.loadedAll.bottom) {\n const bubblesMaxId = Math.max(...Object.keys(this.bubbles).map((i) => +i));\n if(maxId >= bubblesMaxId) {\n maxId = Math.max((await this.chat.getHistoryMaxId()) || 0, maxId);\n }\n }\n\n this.unreaded.forEach((mid, target) => {\n if(mid <= maxId) {\n this.onUnreadedInViewport(target, mid);\n }\n });\n\n const readContents: number[] = [];\n for(const mid of this.unreadedSeen) {\n const message: MyMessage = await this.chat.getMessage(mid);\n if(isMentionUnread(message)) {\n readContents.push(mid);\n }\n }\n\n this.managers.appMessagesManager.readMessages(this.peerId, readContents);\n\n this.unreadedSeen.clear();\n\n if(DEBUG) {\n this.log('will readHistory by maxId:', maxId);\n }\n\n // return;\n\n return this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId).catch((err: any) => {\n this.log.error('readHistory err:', err);\n this.managers.appMessagesManager.readHistory(this.peerId, maxId, this.chat.threadId);\n }).finally(() => {\n if(!middleware()) return;\n this.readPromise = undefined;\n\n if(this.unreadedSeen.size) {\n this.readUnreaded();\n }\n });\n });\n }\n\n public onBubblesClick = async(e: Event) => {\n let target = e.target as HTMLElement;\n let bubble: HTMLElement = null;\n try {\n bubble = findUpClassName(target, 'bubble');\n } catch(err) {}\n\n if(!bubble && !this.chat.selection.isSelecting) {\n const avatar = findUpClassName(target, 'user-avatar');\n if(!avatar) {\n return;\n }\n\n const peerId = avatar.dataset.peerId.toPeerId();\n if(peerId !== NULL_PEER_ID) {\n this.chat.appImManager.setInnerPeer({peerId});\n } else {\n toast(I18n.format('HidAccount', true));\n }\n return;\n }\n\n if(bubble.classList.contains('is-date') && findUpClassName(target, 'bubble-content')) {\n if(bubble.classList.contains('is-fake')) {\n bubble = bubble.previousElementSibling as HTMLElement;\n }\n\n if(bubble.classList.contains('is-sticky') && !this.chatInner.classList.contains('is-scrolling')) {\n return;\n }\n\n for(const timestamp in this.dateMessages) {\n const d = this.dateMessages[timestamp];\n if(d.div === bubble) {\n PopupElement.createPopup(PopupDatePicker, new Date(+timestamp), this.onDatePick).show();\n break;\n }\n }\n\n return;\n }\n\n if(!IS_TOUCH_SUPPORTED && findUpClassName(target, 'time')) {\n this.chat.selection.toggleByElement(bubble);\n return;\n }\n\n // ! Trusted - due to audio autoclick\n if(this.chat.selection.isSelecting && e.isTrusted) {\n if(bubble.classList.contains('service') && bubble.dataset.mid === undefined) {\n return;\n }\n\n cancelEvent(e);\n // console.log('bubble click', e);\n\n if(IS_TOUCH_SUPPORTED && this.chat.selection.selectedText) {\n this.chat.selection.selectedText = undefined;\n return;\n }\n\n // this.chatSelection.toggleByBubble(bubble);\n this.chat.selection.toggleByElement(findUpClassName(target, 'grouped-item') || bubble);\n return;\n }\n\n const mediaSpoiler: HTMLElement = findUpClassName(target, 'media-spoiler-container');\n if(mediaSpoiler) {\n onMediaSpoilerClick({\n event: e,\n mediaSpoiler\n });\n return;\n }\n\n const contactDiv: HTMLElement = findUpClassName(target, 'contact');\n if(contactDiv) {\n this.chat.appImManager.setInnerPeer({\n peerId: contactDiv.dataset.peerId.toPeerId()\n });\n return;\n }\n\n const callDiv: HTMLElement = findUpClassName(target, 'bubble-call');\n if(callDiv) {\n this.chat.appImManager.callUser(this.peerId.toUserId(), callDiv.dataset.type as any);\n return;\n }\n\n const buyButton: HTMLElement = findUpClassName(target, 'is-buy');\n if(buyButton) {\n cancelEvent(e);\n\n const message = await this.chat.getMessage(+bubble.dataset.mid);\n if(!message) {\n return;\n }\n\n new PopupPayment(\n message as Message.message,\n await this.managers.appPaymentsManager.getInputInvoiceByPeerId(message.peerId, message.mid)\n );\n return;\n }\n\n const reactionElement = findUpTag(target, 'REACTION-ELEMENT') as ReactionElement;\n if(reactionElement) {\n cancelEvent(e);\n if(reactionElement.classList.contains('is-inactive')) {\n return;\n }\n\n const reactionsElement = reactionElement.parentElement as ReactionsElement;\n const reactionCount = reactionsElement.getReactionCount(reactionElement);\n\n const message = reactionsElement.getMessage();\n this.managers.appReactionsManager.sendReaction(message, reactionCount.reaction);\n\n return;\n }\n\n const stickerEmojiEl = findUpAttribute(target, 'data-sticker-emoji');\n if(stickerEmojiEl && stickerEmojiEl.parentElement.querySelectorAll('[data-sticker-emoji]').length === 1 && bubble.classList.contains('emoji-big')) {\n onEmojiStickerClick({\n event: e,\n container: stickerEmojiEl,\n managers: this.managers,\n middleware: this.getMiddleware(),\n peerId: this.peerId\n });\n\n return;\n }\n\n const commentsDiv: HTMLElement = findUpClassName(target, 'replies');\n if(commentsDiv) {\n const bubbleMid = +bubble.dataset.mid;\n if(this.peerId === REPLIES_PEER_ID) {\n const message = await this.chat.getMessage(bubbleMid) as Message.message;\n const peerId = getPeerId(message.reply_to.reply_to_peer_id);\n const threadId = message.reply_to.reply_to_top_id;\n const lastMsgId = message.fwd_from.saved_from_msg_id;\n this.chat.appImManager.openThread({\n peerId,\n lastMsgId,\n threadId\n });\n } else {\n const message1 = await this.chat.getMessage(bubbleMid);\n const message = await this.managers.appMessagesManager.getMessageWithReplies(message1 as Message.message);\n const replies = message.replies;\n if(replies) {\n this.managers.appMessagesManager.getDiscussionMessage(this.peerId, message.mid).then((message) => {\n this.chat.appImManager.setInnerPeer({\n peerId: replies.channel_id.toPeerId(true),\n type: 'discussion',\n threadId: (message as MyMessage).mid\n });\n });\n }\n }\n\n return;\n }\n\n const via = findUpClassName(target, 'is-via');\n if(via) {\n const el = via.querySelector('.peer-title') as HTMLElement;\n if(target === el || findUpAsChild(target, el)) {\n const message = el.innerText + ' ';\n this.managers.appDraftsManager.setDraft(this.peerId, this.chat.threadId, message);\n cancelEvent(e);\n\n return;\n }\n }\n\n const nameDiv = findUpClassName(target, 'peer-title') || findUpTag(target, 'AVATAR-ELEMENT') || findUpAttribute(target, 'data-saved-from');\n if(nameDiv && nameDiv !== bubble) {\n target = nameDiv || target;\n const peerIdStr = target.dataset.peerId || target.getAttribute('peer') || (target as AvatarElement).peerId;\n const savedFrom = target.dataset.savedFrom;\n if(typeof(peerIdStr) === 'string' || savedFrom) {\n if(savedFrom) {\n const [peerId, mid] = savedFrom.split('_');\n if(target.classList.contains('is-receipt-link')) {\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId.toPeerId(), +mid);\n if(message) {\n const inputInvoice = await this.managers.appPaymentsManager.getInputInvoiceByPeerId(this.peerId, +bubble.dataset.mid);\n new PopupPayment(message as Message.message, inputInvoice, undefined, true);\n }\n } else {\n this.chat.appImManager.setInnerPeer({\n peerId: peerId.toPeerId(),\n lastMsgId: +mid\n });\n }\n } else {\n const peerId = peerIdStr.toPeerId();\n if(peerId !== NULL_PEER_ID) {\n this.chat.appImManager.setInnerPeer({peerId});\n } else {\n toast(I18n.format('HidAccount', true));\n }\n }\n }\n\n return;\n }\n\n // this.log('chatInner click:', target);\n // const isVideoComponentElement = target.tagName === 'SPAN' && findUpClassName(target, 'media-container');\n /* if(isVideoComponentElement) {\n const video = target.parentElement.querySelector('video') as HTMLElement;\n if(video) {\n video.click(); // hot-fix for time and play button\n return;\n }\n } */\n\n if(bubble.classList.contains('sticker') && target.parentElement.classList.contains('attachment')) {\n const messageId = +bubble.dataset.mid;\n const message = await this.chat.getMessage(messageId);\n\n const doc = ((message as Message.message).media as MessageMedia.messageMediaDocument)?.document as Document.document;\n\n if(doc?.stickerSetInput) {\n new PopupStickers(doc.stickerSetInput).show();\n }\n\n return;\n }\n\n const documentDiv = findUpClassName(target, 'document-with-thumb');\n if((target.tagName === 'IMG' && !target.classList.contains('emoji') && !target.classList.contains('document-thumb')) ||\n target.classList.contains('album-item') ||\n // || isVideoComponentElement\n (target.tagName === 'VIDEO' && !bubble.classList.contains('round')) ||\n (documentDiv && !documentDiv.querySelector('.preloader-container')) ||\n target.classList.contains('canvas-thumbnail')) {\n const groupedItem = findUpClassName(target, 'album-item') || findUpClassName(target, 'document-container');\n const preloader = (groupedItem || bubble).querySelector('.preloader-container');\n if(preloader) {\n simulateClickEvent(preloader);\n cancelEvent(e);\n return;\n }\n\n cancelEvent(e);\n const messageId = +(groupedItem || bubble).dataset.mid;\n const message = await this.chat.getMessage(messageId);\n if(!message) {\n this.log.warn('no message by messageId:', messageId);\n return;\n }\n\n const SINGLE_MEDIA_CLASSNAME = 'webpage';\n const isSingleMedia = bubble.classList.contains(SINGLE_MEDIA_CLASSNAME);\n\n const f = documentDiv ? (media: any) => {\n return AppMediaViewer.isMediaCompatibleForDocumentViewer(media);\n } : (media: any) => {\n return media._ === 'photo' || ['video', 'gif'].includes(media.type);\n };\n\n const targets: {element: HTMLElement, mid: number, peerId: PeerId}[] = [];\n const ids = isSingleMedia ? [messageId] : (await Promise.all(Object.keys(this.bubbles).map((k) => +k).map(async(mid) => {\n /* if(isSingleMedia && !this.bubbles[id].classList.contains(SINGLE_MEDIA_CLASSNAME)) {\n return false;\n } */\n // if(!this.scrollable.visibleElements.find((e) => e.element === this.bubbles[id])) return false;\n\n const message = await this.chat.getMessage(mid);\n const media = getMediaFromMessage(message);\n\n return media && f(media) && mid;\n }))).filter(Boolean).sort((a, b) => a - b);\n\n ids.forEach((id) => {\n let selector: string;\n if(documentDiv) {\n selector = '.document-container';\n } else {\n const withTail = this.bubbles[id].classList.contains('with-media-tail');\n selector = '.album-item video, .album-item img, .preview video, .preview img, ';\n if(withTail) {\n selector += '.bubble__media-container';\n } else {\n selector += '.attachment video, .attachment img';\n }\n }\n\n const elements = Array.from(this.bubbles[id].querySelectorAll(selector)) as HTMLElement[];\n const parents: Set = new Set();\n if(documentDiv) {\n elements.forEach((element) => {\n targets.push({\n element: element.querySelector('.document-ico'),\n mid: +element.dataset.mid,\n peerId: this.peerId\n });\n });\n } else {\n const hasAspecter = !!this.bubbles[id].querySelector('.media-container-aspecter');\n elements.forEach((element) => {\n if(hasAspecter && !findUpClassName(element, 'media-container-aspecter')) return;\n const albumItem = findUpClassName(element, 'album-item');\n const parent = albumItem || element.parentElement;\n if(parents.has(parent)) return;\n parents.add(parent);\n targets.push({\n element,\n mid: albumItem ? +albumItem.dataset.mid : id,\n peerId: this.peerId\n });\n });\n }\n });\n\n targets.sort((a, b) => a.mid - b.mid);\n\n const idx = targets.findIndex((t) => t.mid === messageId);\n\n if(DEBUG) {\n this.log('open mediaViewer single with ids:', ids, idx, targets);\n }\n\n if(!targets[idx]) {\n this.log('no target for media viewer!', target);\n return;\n }\n\n new AppMediaViewer()\n .setSearchContext({\n threadId: this.chat.threadId,\n peerId: this.peerId,\n inputFilter: {_: documentDiv ? 'inputMessagesFilterDocument' : 'inputMessagesFilterPhotoVideo'},\n useSearch: this.chat.type !== 'scheduled' && !isSingleMedia,\n isScheduled: this.chat.type === 'scheduled'\n })\n .openMedia(message, targets[idx].element, 0, true, targets.slice(0, idx), targets.slice(idx + 1));\n\n // appMediaViewer.openMedia(message, target as HTMLImageElement);\n return;\n }\n\n if(['IMG', 'DIV', 'SPAN'/* , 'A' */].indexOf(target.tagName) === -1) target = findUpTag(target, 'DIV');\n\n if(['DIV', 'SPAN'].indexOf(target.tagName) !== -1/* || target.tagName === 'A' */) {\n if(target.classList.contains('goto-original')) {\n const savedFrom = bubble.dataset.savedFrom;\n const [peerId, mid] = savedFrom.split('_');\n // //this.log('savedFrom', peerId, msgID);\n this.chat.appImManager.setInnerPeer({\n peerId: peerId.toPeerId(),\n lastMsgId: +mid\n });\n return;\n } else if(target.classList.contains('forward')) {\n const mid = +bubble.dataset.mid;\n const message = await this.managers.appMessagesManager.getMessageByPeer(this.peerId, mid);\n new PopupForward({\n [this.peerId]: await this.managers.appMessagesManager.getMidsByMessage(message)\n });\n // appSidebarRight.forwardTab.open([mid]);\n return;\n }\n\n let isReplyClick = false;\n\n try {\n isReplyClick = !!findUpClassName(e.target, 'reply');\n } catch(err) {}\n\n if(isReplyClick && bubble.classList.contains('is-reply')/* || bubble.classList.contains('forwarded') */) {\n const bubbleMid = +bubble.dataset.mid;\n this.followStack.push(bubbleMid);\n\n const message = (await this.chat.getMessage(bubbleMid)) as Message.message;\n\n const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : this.peerId;\n const replyToMid = message.reply_to.reply_to_msg_id;\n\n this.chat.appImManager.setInnerPeer({\n peerId: replyToPeerId,\n lastMsgId: replyToMid,\n type: this.chat.type,\n threadId: this.chat.threadId\n });\n\n /* if(this.chat.type === 'discussion') {\n this.chat.appImManager.setMessageId(, originalMessageId);\n } else {\n this.chat.appImManager.setInnerPeer(this.peerId, originalMessageId);\n } */\n // this.chat.setMessageId(, originalMessageId);\n }\n }\n\n // console.log('chatInner click', e);\n };\n\n public async onGoDownClick() {\n if(!this.followStack.length) {\n // this.onScroll(true, undefined, true);\n this.chat.setMessageId(/* , dialog.top_message */);\n // const dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\n\n // if(dialog) {\n // this.chat.setPeer(this.peerId/* , dialog.top_message */);\n // } else {\n // this.log('will scroll down 3');\n // this.scroll.scrollTop = this.scroll.scrollHeight;\n // }\n\n return;\n }\n\n const middleware = this.getMiddleware();\n const slice = this.followStack.slice();\n const messages = await Promise.all(slice.map((mid) => this.chat.getMessage(mid)));\n if(!middleware()) return;\n\n slice.forEach((mid, idx) => {\n const message = messages[idx];\n\n const bubble = this.bubbles[mid];\n let bad = true;\n if(bubble) {\n const rect = bubble.getBoundingClientRect();\n bad = (windowSize.height / 2) > rect.top;\n } else if(message) {\n bad = false;\n }\n\n if(bad) {\n this.followStack.splice(this.followStack.indexOf(mid), 1);\n }\n });\n\n this.followStack.sort((a, b) => b - a);\n\n const mid = this.followStack.pop();\n this.chat.setMessageId(mid);\n }\n\n public getBubbleByPoint(verticalSide: 'top' | 'bottom') {\n let element = getElementByPoint(this.scrollable.container, verticalSide, 'center');\n /* if(element) {\n if(element.classList.contains('bubbles-date-group')) {\n const children = Array.from(element.children) as HTMLElement[];\n if(verticalSide === 'top') {\n element = children[this.stickyIntersector ? 2 : 1];\n } else {\n element = children[children.length - 1];\n }\n } else {\n element = findUpClassName(element, 'bubble');\n if(element && element.classList.contains('is-date')) {\n element = element.nextElementSibling as HTMLElement;\n }\n }\n } */\n if(element) element = findUpClassName(element, 'bubble');\n\n return element;\n }\n\n public async getGroupedBubble(groupId: string) {\n const mids = await this.managers.appMessagesManager.getMidsByAlbum(groupId);\n for(const mid of mids) {\n if(this.bubbles[mid] && !this.skippedMids.has(mid)) {\n // const maxId = Math.max(...mids); // * because in scheduled album can be rendered by lowest mid during sending\n return {\n bubble: this.bubbles[mid],\n mid: mid\n // message: await this.chat.getMessage(maxId) as Message.message\n };\n }\n }\n }\n\n public getBubbleGroupedItems(bubble: HTMLElement) {\n return Array.from(bubble.querySelectorAll('.grouped-item')) as HTMLElement[];\n }\n\n public async getMountedBubble(mid: number, message?: Message.message | Message.messageService) {\n if(message === undefined) {\n message = await this.chat.getMessage(mid);\n }\n\n if(!message) {\n return;\n }\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const a = await this.getGroupedBubble(groupedId);\n if(a) {\n a.bubble = a.bubble.querySelector(`.document-container[data-mid=\"${mid}\"]`) || a.bubble;\n return a;\n }\n }\n\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n return {bubble, mid};\n }\n\n private findNextMountedBubbleByMsgId(mid: number, prev?: boolean) {\n const mids = getObjectKeysAndSort(this.bubbles, prev ? 'desc' : 'asc');\n\n let filterCallback: (_mid: number) => boolean;\n if(prev) filterCallback = (_mid) => _mid < mid;\n else filterCallback = (_mid) => mid < _mid;\n\n const foundMid = mids.find((_mid) => {\n if(!filterCallback(_mid)) return false;\n return !!this.bubbles[_mid]?.parentElement;\n });\n\n return this.bubbles[foundMid];\n }\n\n public loadMoreHistory(top: boolean, justLoad = false) {\n // this.log('loadMoreHistory', top);\n if(\n !this.peerId ||\n /* TEST_SCROLL || */\n this.chat.setPeerPromise ||\n this.isHeavyAnimationInProgress ||\n (top && (this.getHistoryTopPromise || this.scrollable.loadedAll.top)) ||\n (!top && (this.getHistoryBottomPromise || this.scrollable.loadedAll.bottom))\n ) {\n return;\n }\n\n // warning, если иды только отрицательные то вниз не попадёт (хотя мб и так не попадёт)\n // some messages can have negative id (such as sponsored message)\n const history = Object.keys(this.bubbles)\n .map((id) => +id)\n .filter((id) => id > 0 && !this.skippedMids.has(id))\n .sort((a, b) => a - b);\n\n if(!history.length) {\n history.push(0);\n }\n\n if(top) {\n if(DEBUG) {\n this.log('Will load more (up) history by id:', history[0], 'maxId:', history[history.length - 1], justLoad/* , history */);\n }\n\n this.getHistory1(history[0], true, undefined, undefined, justLoad);\n } else {\n // let dialog = this.appMessagesManager.getDialogByPeerId(this.peerId)[0];\n // const historyMaxId = await this.chat.getHistoryMaxId();\n\n // // if scroll down after search\n // if(history.indexOf(historyMaxId) !== -1) {\n // this.setLoaded('bottom', true);\n // return;\n // }\n\n if(DEBUG) {\n this.log('Will load more (down) history by id:', history[history.length - 1], justLoad/* , history */);\n }\n\n this.getHistory1(history[history.length - 1], false, true, undefined, justLoad);\n }\n }\n\n public onScroll = (ignoreHeavyAnimation?: boolean, scrollDimensions?: ScrollStartCallbackDimensions, forceDown?: boolean) => {\n // return;\n\n if(this.isHeavyAnimationInProgress) {\n this.sliceViewportDebounced?.clearTimeout();\n\n // * В таком случае, кнопка не будет моргать если чат в самом низу, и правильно отработает случай написания нового сообщения и проскролла вниз\n if(this.scrolledDown && !ignoreHeavyAnimation) {\n return;\n }\n } else {\n this.chat.topbar.pinnedMessage?.setCorrectIndexThrottled(this.scrollable.lastScrollDirection);\n this.sliceViewportDebounced?.();\n this.setStickyDateManually();\n }\n\n // lottieLoader.checkAnimations(false, 'chat');\n\n if(scrollDimensions && scrollDimensions.distanceToEnd < SCROLLED_DOWN_THRESHOLD && this.scrolledDown) {\n return;\n }\n\n const distanceToEnd = forceDown ? 0 : scrollDimensions?.distanceToEnd ?? this.scrollable.getDistanceToEnd();\n if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 && distanceToEnd > 0) || scrollDimensions || forceDown) {\n // if(/* !IS_TOUCH_SUPPORTED && */(this.scrollable.lastScrollDirection !== 0 || scrollDimensions) && distanceToEnd > 0) {\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\n this.chatInner.classList.add('is-scrolling');\n }\n\n this.isScrollingTimeout = window.setTimeout(() => {\n this.chatInner.classList.remove('is-scrolling');\n this.isScrollingTimeout = 0;\n }, 1350 + (scrollDimensions?.duration ?? 0));\n }\n\n if(distanceToEnd < SCROLLED_DOWN_THRESHOLD && (forceDown || this.scrollable.loadedAll.bottom || this.chat.setPeerPromise || !this.peerId)) {\n this.container.classList.add('scrolled-down');\n this.scrolledDown = true;\n } else if(this.container.classList.contains('scrolled-down')) {\n this.container.classList.remove('scrolled-down');\n this.scrolledDown = false;\n }\n };\n\n public setScroll() {\n if(this.scrollable) {\n this.destroyScrollable();\n }\n\n this.scrollable = new Scrollable(null, 'IM', /* 10300 */300);\n this.setLoaded('top', false, false);\n this.setLoaded('bottom', false, false);\n\n this.scrollable.container.append(this.chatInner);\n\n /* const getScrollOffset = () => {\n //return Math.round(Math.max(300, appPhotosManager.windowH / 1.5));\n return 300;\n };\n\n window.addEventListener('resize', () => {\n this.scrollable.onScrollOffset = getScrollOffset();\n });\n\n this.scrollable = new Scrollable(this.bubblesContainer, 'y', 'IM', this.chatInner, getScrollOffset()); */\n\n this.scrollable.onAdditionalScroll = this.onScroll;\n this.scrollable.onScrolledTop = () => this.loadMoreHistory(true);\n this.scrollable.onScrolledBottom = () => this.loadMoreHistory(false);\n // this.scrollable.attachSentinels(undefined, 300);\n\n if(IS_TOUCH_SUPPORTED && false) {\n this.scrollable.container.addEventListener('touchmove', () => {\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n } else if(!this.chatInner.classList.contains('is-scrolling')) {\n this.chatInner.classList.add('is-scrolling');\n }\n }, {passive: true});\n\n this.scrollable.container.addEventListener('touchend', () => {\n if(!this.chatInner.classList.contains('is-scrolling')) {\n return;\n }\n\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n }\n\n this.isScrollingTimeout = window.setTimeout(() => {\n this.chatInner.classList.remove('is-scrolling');\n this.isScrollingTimeout = 0;\n }, 1350);\n }, {passive: true});\n }\n }\n\n public async updateUnreadByDialog() {\n const historyStorage = await this.chat.getHistoryStorage();\n const maxId = this.peerId === rootScope.myId ? historyStorage.readMaxId : historyStorage.readOutboxMaxId;\n\n // /////this.log('updateUnreadByDialog', maxId, dialog, this.unreadOut);\n\n for(const msgId of this.unreadOut) {\n if(msgId > 0 && msgId <= maxId) {\n const bubble = this.bubbles[msgId];\n if(bubble) {\n this.unreadOut.delete(msgId);\n\n if(bubble.classList.contains('is-outgoing') || bubble.classList.contains('is-error')) {\n continue;\n }\n\n bubble.classList.remove('is-sent', 'is-sending', 'is-outgoing'); // is-sending can be when there are bulk of updates (e.g. sending command to Stickers bot)\n bubble.classList.add('is-read');\n }\n }\n }\n }\n\n public destroyBubble(bubble: HTMLElement, mid = +bubble.dataset.mid) {\n // this.log.warn('destroy bubble', bubble, mid);\n bubble.middlewareHelper.destroy();\n\n /* const mounted = this.getMountedBubble(mid);\n if(!mounted) return; */\n\n if(this.bubbles[mid] === bubble) { // have to check because can clear bubble with same id later\n delete this.bubbles[mid];\n }\n\n this.skippedMids.delete(mid);\n\n if(this.firstUnreadBubble === bubble) {\n this.firstUnreadBubble = null;\n }\n\n this.bubbleGroups.removeAndUnmountBubble(bubble);\n if(this.observer) {\n this.observer.unobserve(bubble, this.unreadedObserverCallback);\n this.unreaded.delete(bubble);\n\n this.observer.unobserve(bubble, this.viewsObserverCallback);\n this.viewsMids.delete(mid);\n\n this.observer.unobserve(bubble, this.stickerEffectObserverCallback);\n }\n\n // this.reactions.delete(mid);\n }\n\n public deleteMessagesByIds(mids: number[], permanent = true, ignoreOnScroll?: boolean) {\n let deleted = false;\n mids.forEach((mid) => {\n const bubble = this.bubbles[mid];\n if(!bubble) return;\n\n this.destroyBubble(bubble, mid);\n\n deleted = true;\n });\n\n if(!deleted) {\n return;\n }\n\n this.scrollable.ignoreNextScrollEvent();\n if(permanent && this.chat.selection.isSelecting) {\n this.chat.selection.deleteSelectedMids(this.peerId, mids);\n }\n\n animationIntersector.checkAnimations(false, this.chat.animationGroup);\n this.deleteEmptyDateGroups();\n\n if(!ignoreOnScroll) {\n this.scrollable.onScroll();\n // this.onScroll();\n }\n }\n\n private pollExtendedMediaMessages() {\n const mids = Array.from(this.extendedMediaMessages);\n return this.managers.appMessagesManager.getExtendedMedia(this.peerId, mids);\n }\n\n private setExtendedMediaMessagesPollInterval() {\n if(this.pollExtendedMediaMessagesPromise || !this.extendedMediaMessages.size) {\n return;\n }\n\n this.pollExtendedMediaMessagesPromise = pause(30000)\n .then(() => this.pollExtendedMediaMessages())\n .then(() => this.setExtendedMediaMessagesPollInterval());\n }\n\n private setTopPadding(middleware = this.getMiddleware()) {\n let isPaddingNeeded = false;\n let setPaddingTo: HTMLElement;\n if(!this.isTopPaddingSet && this.chat.type !== 'scheduled') {\n const {clientHeight, scrollHeight} = this.scrollable.container;\n isPaddingNeeded = clientHeight === scrollHeight;\n /* const firstEl = this.chatInner.firstElementChild as HTMLElement;\n if(this.chatInner.firstElementChild) {\n const visibleRect = getVisibleRect(firstEl, this.scrollable.container);\n isPaddingNeeded = !visibleRect.overflow.top && (visibleRect.rect.top - firstEl.offsetTop) !== this.scrollable.container.getBoundingClientRect().top;\n } else {\n isPaddingNeeded = true;\n } */\n\n if(isPaddingNeeded) {\n /* const add = clientHeight - scrollHeight;\n this.chatInner.style.paddingTop = add + 'px';\n this.scrollable.scrollTop += add; */\n setPaddingTo = this.chatInner;\n setPaddingTo.style.paddingTop = clientHeight + 'px';\n this.scrollable.setScrollTopSilently(scrollHeight);\n this.isTopPaddingSet = true;\n }\n }\n\n return {\n isPaddingNeeded,\n unsetPadding: isPaddingNeeded ? () => {\n if(middleware() && isPaddingNeeded) {\n setPaddingTo.style.paddingTop = '';\n this.isTopPaddingSet = false;\n }\n } : undefined\n };\n }\n\n private renderNewMessage(message: MyMessage, scrolledDown?: boolean) {\n const promise = this._renderNewMessage(message, scrolledDown);\n this.renderNewPromises.add(promise);\n promise.catch(noop).finally(() => {\n this.renderNewPromises.delete(promise);\n });\n return promise;\n }\n\n private async _renderNewMessage(message: MyMessage, scrolledDown?: boolean) {\n if(!this.scrollable.loadedAll.bottom) { // seems search active or sliced\n // this.log('renderNewMessagesByIds: seems search is active, skipping render:', mids);\n const setPeerPromise = this.chat.setPeerPromise;\n if(setPeerPromise) {\n const middleware = this.getMiddleware();\n setPeerPromise.then(async() => {\n if(!middleware()) return;\n const newMessage = await this.chat.getMessage(message.mid);\n if(!middleware()) return;\n this.renderNewMessage(newMessage);\n });\n }\n\n return;\n }\n\n if(this.chat.threadId && getMessageThreadId(message, this.chat.isForum) !== this.chat.threadId) {\n return;\n }\n\n if(this.bubbles[message.mid]) {\n return;\n }\n // ! should scroll even without new messages\n /* if(!mids.length) {\n return;\n } */\n\n if(!scrolledDown) {\n scrolledDown = this.scrolledDown && (\n !this.scrollingToBubble ||\n this.scrollingToBubble === this.getLastBubble() ||\n this.scrollingToBubble === this.chatInner\n );\n }\n\n const middleware = this.getMiddleware();\n const {isPaddingNeeded, unsetPadding} = this.setTopPadding(middleware);\n\n const promise = this.performHistoryResult({history: [message]}, false);\n if(scrolledDown) {\n promise.then(() => {\n if(!middleware()) return;\n // this.log('renderNewMessagesByIDs: messagesQueuePromise after', this.scrollable.isScrolledDown);\n // this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true, 5000);\n // const bubble = this.bubbles[Math.max(...mids)];\n\n let bubble: HTMLElement;\n if(this.chat.type === 'scheduled') {\n bubble = this.bubbles[message.mid];\n }\n\n const promise = bubble ? this.scrollToBubbleEnd(bubble) : this.scrollToEnd();\n if(isPaddingNeeded) {\n // it will be called only once even if was set multiple times (that won't happen)\n promise.then(unsetPadding);\n }\n\n // this.scrollable.scrollIntoViewNew(this.chatInner, 'end');\n\n /* setTimeout(() => {\n this.log('messagesQueuePromise afterafter:', this.chatInner.childElementCount, this.scrollable.scrollHeight);\n }, 10); */\n });\n }\n\n return promise;\n }\n\n public getLastBubble() {\n const group = this.bubbleGroups.getLastGroup();\n return group?.lastItem?.bubble;\n }\n\n public scrollToBubble(\n element: HTMLElement,\n position: ScrollLogicalPosition,\n forceDirection?: FocusDirection,\n forceDuration?: number\n ) {\n const bubble = findUpClassName(element, 'bubble');\n\n if(!element.parentElement) {\n this.log.error('element is not connected', bubble);\n }\n\n let fallbackToElementStartWhenCentering: HTMLElement;\n // * if it's a start, then scroll to start of the group\n if(bubble && position !== 'end') {\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(item && item.group.firstItem === item && whichChild(item.group.container) === (this.stickyIntersector ? STICKY_OFFSET : 1)) {\n const dateGroup = item.group.container.parentElement;\n // if(whichChild(dateGroup) === 0) {\n fallbackToElementStartWhenCentering = dateGroup;\n // position = 'start';\n // element = dateGroup;\n // }\n }\n }\n\n // const isLastBubble = this.getLastBubble() === bubble;\n /* if(isLastBubble) {\n element = this.getLastDateGroup();\n } */\n\n const margin = 4; // * 4 = .25rem\n /* if(isLastBubble && this.chat.type === 'chat' && this.bubblesContainer.classList.contains('is-chat-input-hidden')) {\n margin = 20;\n } */\n\n const isChangingHeight = (this.chat.input.messageInput && this.chat.input.messageInput.classList.contains('is-changing-height')) || this.chat.container.classList.contains('is-toggling-helper');\n const promise = this.scrollable.scrollIntoViewNew({\n element,\n position,\n margin,\n forceDirection,\n forceDuration,\n axis: 'y',\n getNormalSize: isChangingHeight ? ({rect}) => {\n // return rect.height;\n\n let height = windowSize.height;\n // height -= this.chat.topbar.container.getBoundingClientRect().height;\n height -= this.container.offsetTop;\n height -= mediaSizes.isMobile || windowSize.height < 570 ? 58 : 78;\n return height;\n\n /* const rowsWrapperHeight = this.chat.input.rowsWrapper.getBoundingClientRect().height;\n const diff = rowsWrapperHeight - 54;\n return rect.height + diff; */\n } : undefined,\n fallbackToElementStartWhenCentering,\n startCallback: (dimensions) => {\n // this.onScroll(true, this.scrolledDown && dimensions.distanceToEnd <= SCROLLED_DOWN_THRESHOLD ? undefined : dimensions);\n this.onScroll(true, dimensions);\n\n if(this.updateGradient) {\n const {gradientRenderer} = this.chat;\n gradientRenderer?.toNextPosition(dimensions.getProgress);\n this.updateGradient = undefined;\n }\n }\n });\n\n // fix flickering date when opening unread chat and focusing message\n if(forceDirection === FocusDirection.Static) {\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\n }\n\n return promise;\n }\n\n public scrollToEnd() {\n return this.scrollToBubbleEnd(this.chatInner);\n }\n\n public async scrollToBubbleEnd(bubble: HTMLElement) {\n /* if(DEBUG) {\n this.log('scrollToNewLastBubble: will scroll into view:', bubble);\n } */\n\n if(bubble) {\n this.scrollingToBubble = bubble;\n const middleware = this.getMiddleware();\n await this.scrollToBubble(bubble, 'end', undefined, undefined);\n if(!middleware()) return;\n this.scrollingToBubble = undefined;\n }\n }\n\n // ! can't get it by chatInner.lastElementChild because placeholder can be the last...\n // private getLastDateGroup() {\n // let lastTime = 0, lastElem: HTMLElement;\n // for(const i in this.dateMessages) {\n // const dateMessage = this.dateMessages[i];\n // if(dateMessage.firstTimestamp > lastTime) {\n // lastElem = dateMessage.container;\n // lastTime = dateMessage.firstTimestamp;\n // }\n // }\n\n // return lastElem;\n // }\n\n public async scrollToBubbleIfLast(bubble: HTMLElement) {\n if(this.getLastBubble() === bubble) {\n // return this.scrollToBubbleEnd(bubble);\n return this.scrollToEnd();\n }\n }\n\n public highlightBubble(element: HTMLElement) {\n const datasetKey = 'highlightTimeout';\n if(element.dataset[datasetKey]) {\n clearTimeout(+element.dataset[datasetKey]);\n element.classList.remove('is-highlighted');\n void element.offsetWidth; // reflow\n }\n\n element.classList.add('is-highlighted');\n element.dataset[datasetKey] = '' + setTimeout(() => {\n element.classList.remove('is-highlighted');\n delete element.dataset[datasetKey];\n }, 2000);\n }\n\n private createDateBubble(timestamp: number, date: Date = new Date(timestamp * 1000)) {\n let dateElement: HTMLElement;\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n const isScheduled = this.chat.type === 'scheduled';\n\n if(today.getTime() === date.getTime()) {\n dateElement = i18n(isScheduled ? 'Chat.Date.ScheduledForToday' : 'Date.Today');\n } else if(isScheduled && timestamp === SEND_WHEN_ONLINE_TIMESTAMP) {\n dateElement = i18n('MessageScheduledUntilOnline');\n } else {\n const options: Intl.DateTimeFormatOptions = {\n day: 'numeric',\n month: 'long'\n };\n\n if(date.getFullYear() !== today.getFullYear()) {\n options.year = 'numeric';\n }\n\n dateElement = new I18n.IntlDateElement({\n date,\n options\n }).element;\n\n if(isScheduled) {\n dateElement = i18n('Chat.Date.ScheduledFor', [dateElement]);\n }\n }\n\n const bubble = document.createElement('div');\n bubble.className = 'bubble service is-date';\n const bubbleContent = document.createElement('div');\n bubbleContent.classList.add('bubble-content');\n const serviceMsg = document.createElement('div');\n serviceMsg.classList.add('service-msg');\n\n serviceMsg.append(dateElement);\n\n bubbleContent.append(serviceMsg);\n bubble.append(bubbleContent);\n\n return bubble;\n }\n\n public getDateForDateContainer(timestamp: number) {\n const date = new Date(timestamp * 1000);\n date.setHours(0, 0, 0);\n return {date, dateTimestamp: date.getTime()};\n }\n\n public getDateContainerByTimestamp(timestamp: number) {\n const {date, dateTimestamp} = this.getDateForDateContainer(timestamp);\n let ret = this.dateMessages[dateTimestamp];\n if(ret) {\n return ret;\n }\n\n const bubble = this.createDateBubble(timestamp, date);\n // bubble.classList.add('is-sticky');\n const fakeBubble = this.createDateBubble(timestamp, date);\n fakeBubble.classList.add('is-fake');\n\n const container = document.createElement('section');\n container.className = 'bubbles-date-group';\n container.append(bubble, fakeBubble);\n\n ret = this.dateMessages[dateTimestamp] = {\n div: bubble,\n container,\n firstTimestamp: date.getTime()\n };\n\n const haveTimestamps = getObjectKeysAndSort(this.dateMessages, 'asc');\n const length = haveTimestamps.length;\n let i = 0, insertBefore: HTMLElement; // there can be 'first bubble' (e.g. bot description) so can't insert by index\n for(; i < haveTimestamps.length; ++i) {\n const t = haveTimestamps[i];\n insertBefore = this.dateMessages[t].container;\n if(dateTimestamp < t) {\n break;\n }\n }\n\n if(i === length && insertBefore) {\n insertBefore = insertBefore.nextElementSibling as HTMLElement;\n }\n\n if(!insertBefore) {\n this.chatInner.append(container);\n } else {\n this.chatInner.insertBefore(container, insertBefore);\n }\n\n this.stickyIntersector?.observeStickyHeaderChanges(container);\n\n if(this.chatInner.parentElement) {\n this.container.classList.add('has-groups');\n }\n\n return ret;\n }\n\n private destroyScrollable() {\n this.scrollable.destroy();\n }\n\n public destroy() {\n // this.chat.log.error('Bubbles destroying');\n\n this.destroyScrollable();\n\n this.listenerSetter.removeAll();\n\n this.lazyLoadQueue.clear();\n this.observer && this.observer.disconnect();\n this.stickyIntersector && this.stickyIntersector.disconnect();\n\n delete this.lazyLoadQueue;\n this.observer && delete this.observer;\n this.stickyIntersector && delete this.stickyIntersector;\n }\n\n public cleanup(bubblesToo = false) {\n this.log('cleanup');\n\n this.bubbles = {}; // clean it before so sponsored message won't be deleted faster on peer changing\n // //console.time('appImManager cleanup');\n this.setLoaded('top', false, false);\n this.setLoaded('bottom', false, false);\n\n // cancel scroll\n cancelAnimationByKey(this.scrollable.container);\n\n // do not wait ending of previous scale animation\n interruptHeavyAnimation();\n\n if(TEST_SCROLL !== undefined) {\n TEST_SCROLL = TEST_SCROLL_TIMES;\n }\n\n this.skippedMids.clear();\n this.dateMessages = {};\n this.bubbleGroups.cleanup();\n this.unreadOut.clear();\n this.needUpdate.length = 0;\n this.lazyLoadQueue.clear();\n this.renderNewPromises.clear();\n\n // clear messages\n if(bubblesToo) {\n this.scrollable.container.textContent = '';\n this.chatInner.textContent = '';\n this.cleanupPlaceholders();\n }\n\n this.firstUnreadBubble = null;\n this.attachedUnreadBubble = false;\n\n this.batchProcessor.clear();\n\n this.getHistoryTopPromise = this.getHistoryBottomPromise = undefined;\n this.fetchNewPromise = undefined;\n this.getSponsoredMessagePromise = undefined;\n this.updateGradient = undefined;\n\n if(this.stickyIntersector) {\n this.stickyIntersector.disconnect();\n }\n\n if(this.observer) {\n this.observer.disconnect();\n\n this.unreaded.clear();\n this.unreadedSeen.clear();\n this.readPromise = undefined;\n\n this.viewsMids.clear();\n }\n\n this.middlewareHelper.clean();\n\n this.onAnimateLadder = undefined;\n this.resolveLadderAnimation = undefined;\n this.attachPlaceholderOnRender = undefined;\n this.emptyPlaceholderBubble = undefined;\n this.sponsoredMessage = undefined;\n this.previousStickyDate = undefined;\n\n this.scrollingToBubble = undefined;\n // //console.timeEnd('appImManager cleanup');\n\n this.isTopPaddingSet = false;\n\n this.renderingMessages.clear();\n this.bubblesToEject.clear();\n this.bubblesToReplace.clear();\n\n // this.reactions.clear();\n\n if(this.isScrollingTimeout) {\n clearTimeout(this.isScrollingTimeout);\n this.isScrollingTimeout = 0;\n }\n\n this.container.classList.remove('has-sticky-dates');\n this.scrollable.cancelMeasure();\n }\n\n private cleanupPlaceholders(bubble = this.emptyPlaceholderBubble) {\n if(bubble) {\n this.destroyBubble(bubble);\n }\n }\n\n public async setPeer(options: ChatSetPeerOptions & {samePeer: boolean}): Promise<{cached?: boolean, promise: Chat['setPeerPromise']}> {\n const {samePeer, peerId, stack} = options;\n let {lastMsgId, startParam} = options;\n const tempId = ++this.setPeerTempId;\n\n if(!peerId) {\n this.cleanup(true);\n this.preloader.detach();\n return null;\n }\n\n const perf = performance.now();\n const log = this.log.bindPrefix('setPeer');\n log.warn('start');\n\n const middleware = () => {\n return this.setPeerTempId === tempId;\n };\n\n const m = middlewarePromise(middleware, PEER_CHANGED_ERROR);\n\n if(!samePeer) {\n await m(this.chat.onChangePeer(options, m));\n }\n\n /* if(samePeer && this.chat.setPeerPromise) {\n return {cached: true, promise: this.chat.setPeerPromise};\n } */\n\n const chatType = this.chat.type;\n\n if(chatType === 'scheduled' || this.chat.isRestricted) {\n lastMsgId = 0;\n }\n\n const historyStorage = await m(this.chat.getHistoryStorage());\n const topMessage = chatType === 'pinned' ? await m(this.managers.appMessagesManager.getPinnedMessagesMaxId(peerId, this.chat.threadId)) : historyStorage.maxId ?? 0;\n const isTarget = lastMsgId !== undefined;\n\n // * this one will fix topMessage for null message in history (e.g. channel comments with only 1 comment and it is a topMessage)\n /* if(chatType !== 'pinned' && topMessage && !historyStorage.history.slice.includes(topMessage)) {\n topMessage = 0;\n } */\n\n let followingUnread: boolean;\n let readMaxId = 0, savedPosition: ReturnType, overrideAdditionMsgId: number;\n if(!isTarget) {\n if(!samePeer) {\n savedPosition = this.chat.appImManager.getChatSavedPosition(this.chat);\n }\n\n if(savedPosition) {\n\n } else if(topMessage) {\n readMaxId = await m(this.managers.appMessagesManager.getReadMaxIdIfUnread(peerId, this.chat.threadId));\n const dialog = await m(this.chat.getDialogOrTopic());\n if(/* dialog.unread_count */readMaxId && !samePeer && (!dialog || dialog.unread_count !== 1)) {\n const foundSlice = historyStorage.history.findSliceOffset(readMaxId);\n if(foundSlice && foundSlice.slice.isEnd(SliceEnd.Bottom)) {\n overrideAdditionMsgId = foundSlice.slice[foundSlice.offset - 25] || foundSlice.slice[0] || readMaxId;\n }\n\n followingUnread = !isTarget;\n lastMsgId = readMaxId;\n } else {\n lastMsgId = topMessage;\n // lastMsgID = topMessage;\n }\n }\n }\n\n const isJump = lastMsgId !== topMessage/* && overrideAdditionMsgId === undefined */;\n\n if(startParam === undefined && await m(this.chat.isStartButtonNeeded())) {\n startParam = BOT_START_PARAM;\n }\n\n if(samePeer) {\n if(stack && lastMsgId) {\n this.followStack.push(stack);\n }\n\n const mounted = await m(this.getMountedBubble(lastMsgId));\n if(mounted) {\n if(isTarget) {\n this.scrollToBubble(mounted.bubble, 'center');\n this.highlightBubble(mounted.bubble);\n this.chat.dispatchEvent('setPeer', lastMsgId, false);\n } else if(topMessage && !isJump) {\n // log('will scroll down', this.scroll.scrollTop, this.scroll.scrollHeight);\n // scrollable.setScrollTopSilently(scrollable.scrollHeight);\n this.scrollToEnd();\n this.chat.dispatchEvent('setPeer', lastMsgId, true);\n }\n\n if(startParam !== undefined) {\n this.chat.input.setStartParam(startParam);\n }\n\n return null;\n }\n } else {\n if(this.peerId) { // * set new queue id if new peer (setting not from 0)\n this.lazyLoadQueue.queueId = ++queueId;\n this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }\n\n this.followStack.length = 0;\n\n this.passEntities = {\n messageEntityBotCommand: await m(this.managers.appPeersManager.isAnyGroup(peerId)) || this.chat.isBot\n };\n }\n\n if(DEBUG) {\n log('setPeer peerId:', peerId, historyStorage, lastMsgId, topMessage);\n }\n\n // add last message, bc in getHistory will load < max_id\n const additionMsgId = overrideAdditionMsgId ?? (isJump || chatType === 'scheduled' || this.chat.isRestricted ? 0 : topMessage);\n\n let maxBubbleId = 0;\n if(samePeer) {\n const el = this.getBubbleByPoint('bottom'); // ! this may not work if being called when chat is hidden\n // this.chat.log('[PM]: setCorrectIndex: get last element perf:', performance.now() - perf, el);\n if(el) {\n maxBubbleId = +el.dataset.mid;\n }\n\n if(maxBubbleId <= 0) {\n maxBubbleId = Math.max(...Object.keys(this.bubbles).map((mid) => +mid));\n }\n } else {\n this.isFirstLoad = true;\n this.destroyResizeObserver();\n }\n\n const oldChatInner = this.chatInner;\n const oldPlaceholderBubble = this.emptyPlaceholderBubble;\n this.cleanup();\n const chatInner = this.chatInner = document.createElement('div');\n if(samePeer) {\n chatInner.className = oldChatInner.className;\n chatInner.classList.remove('disable-hover', 'is-scrolling');\n } else {\n chatInner.classList.add('bubbles-inner');\n }\n\n this.lazyLoadQueue.lock();\n\n // const haveToScrollToBubble = (topMessage && (isJump || samePeer)) || isTarget;\n const haveToScrollToBubble = samePeer || (topMessage && isJump) || isTarget;\n const fromUp = maxBubbleId > 0 && (!lastMsgId || maxBubbleId < lastMsgId || lastMsgId < 0);\n const scrollFromDown = !fromUp && samePeer;\n const scrollFromUp = !scrollFromDown && fromUp/* && (samePeer || forwardingUnread) */;\n this.willScrollOnLoad = scrollFromDown || scrollFromUp;\n\n this.setPeerOptions = {\n lastMsgId,\n topMessage,\n savedPosition\n };\n\n let result: Awaited>;\n if(!savedPosition) {\n result = await m(this.getHistory1(lastMsgId, true, isJump, additionMsgId));\n } else {\n result = {\n promise: getHeavyAnimationPromise().then(() => {\n return this.performHistoryResult({history: savedPosition.mids}, true);\n }) as any,\n cached: true,\n waitPromise: Promise.resolve()\n };\n }\n\n this.setPeerCached = result.cached;\n\n log.warn('got history');// warning\n\n const {promise, cached} = result;\n\n if(!cached && !samePeer) {\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam));\n this.scrollable.container.textContent = '';\n // oldContainer.textContent = '';\n // oldChatInner.remove();\n this.preloader.attach(this.container);\n }\n\n /* this.ladderDeferred && this.ladderDeferred.resolve();\n this.ladderDeferred = deferredPromise(); */\n\n animationIntersector.lockGroup(this.chat.animationGroup);\n const setPeerPromise = m(promise).then(async() => {\n log.warn('promise fulfilled');\n\n const mountedByLastMsgId = haveToScrollToBubble ? await m(lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()}) : undefined;\n if(cached && !samePeer) {\n log.warn('finishing peer change');\n await m(this.chat.finishPeerChange(isTarget, isJump, lastMsgId, startParam)); // * костыль\n log.warn('finished peer change');\n }\n\n this.preloader.detach();\n\n if(this.resolveLadderAnimation) {\n this.resolveLadderAnimation();\n this.resolveLadderAnimation = undefined;\n }\n\n this.setPeerCached = undefined;\n\n // this.ladderDeferred.resolve();\n\n const scrollable = this.scrollable;\n scrollable.lastScrollDirection = 0;\n scrollable.lastScrollPosition = 0;\n replaceContent(scrollable.container, chatInner);\n // this.chat.topbar.container.nextElementSibling.replaceWith(container);\n\n if(oldPlaceholderBubble) {\n this.cleanupPlaceholders(oldPlaceholderBubble);\n }\n\n if(this.attachPlaceholderOnRender) {\n this.attachPlaceholderOnRender();\n }\n\n if(!isTarget && this.chat.isPinnedMessagesNeeded()) {\n this.chat.topbar.pinnedMessage?.setCorrectIndex(0);\n }\n\n this.container.classList.toggle('has-groups', !!Object.keys(this.dateMessages).length);\n\n log.warn('mounted chat', this.chatInner === chatInner, this.chatInner.parentElement, performance.now() - perf);\n\n animationIntersector.unlockGroup(this.chat.animationGroup);\n animationIntersector.checkAnimations(false, this.chat.animationGroup/* , true */);\n\n // fastRaf(() => {\n this.lazyLoadQueue.unlock();\n // });\n\n // if(dialog && lastMsgID && lastMsgID !== topMessage && (this.bubbles[lastMsgID] || this.firstUnreadBubble)) {\n if(savedPosition) {\n scrollable.setScrollTopSilently(savedPosition.top);\n /* const mountedByLastMsgId = this.getMountedBubble(lastMsgId);\n let bubble: HTMLElement = mountedByLastMsgId?.bubble;\n if(!bubble?.parentElement) {\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId);\n }\n\n if(bubble) {\n const top = bubble.getBoundingClientRect().top;\n const distance = savedPosition.top - top;\n scrollable.scrollTop += distance;\n } */\n } else if(haveToScrollToBubble) {\n let unsetPadding: () => void;\n if(scrollFromDown) {\n scrollable.setScrollTopSilently(99999);\n } else if(scrollFromUp) {\n const set = this.setTopPadding();\n if(set.isPaddingNeeded) {\n unsetPadding = set.unsetPadding;\n }\n\n scrollable.setScrollTopSilently(0);\n }\n\n // const mountedByLastMsgId = lastMsgId ? this.getMountedBubble(lastMsgId) : {bubble: this.getLastBubble()};\n let bubble: HTMLElement = (followingUnread && this.firstUnreadBubble) || mountedByLastMsgId?.bubble;\n if(!bubble?.parentElement) {\n bubble = this.findNextMountedBubbleByMsgId(lastMsgId, false) || this.findNextMountedBubbleByMsgId(lastMsgId, true);\n }\n\n let promise: Promise;\n // ! sometimes there can be no bubble\n if(bubble) {\n const lastBubble = this.getLastBubble();\n const position: ScrollLogicalPosition = followingUnread ? 'start' : (!isJump && !isTarget && lastBubble === bubble ? 'end' : 'center');\n\n if(position === 'end' && lastBubble === bubble && samePeer) {\n promise = this.scrollToEnd();\n } else {\n promise = this.scrollToBubble(bubble, position, !samePeer ? FocusDirection.Static : undefined);\n }\n\n if(!followingUnread && isTarget) {\n this.highlightBubble(bubble);\n }\n }\n\n if(unsetPadding) {\n (promise || Promise.resolve()).then(() => {\n unsetPadding();\n });\n }\n } else {\n scrollable.setScrollTopSilently(99999);\n }\n\n // if(!cached) {\n this.onRenderScrollSet();\n // }\n\n this.onScroll();\n\n const afterSetPromise = Promise.all([setPeerPromise, getHeavyAnimationPromise()]);\n afterSetPromise.then(() => { // check whether list isn't full\n scrollable.checkForTriggers();\n\n // if(cached) {\n // this.onRenderScrollSet();\n // }\n });\n\n this.chat.dispatchEvent('setPeer', lastMsgId, !isJump);\n\n Promise.all([\n this.setFetchReactionsInterval(afterSetPromise),\n this.setFetchHistoryInterval({\n afterSetPromise,\n lastMsgId,\n samePeer,\n savedPosition,\n topMessage\n })\n ]).then(() => {\n log('scrolledAllDown:', scrollable.loadedAll.bottom);\n // if(!this.unreaded.length && dialog) { // lol\n if(scrollable.loadedAll.bottom && topMessage && !this.unreaded.size) { // lol\n this.onScrolledAllDown();\n }\n });\n\n if(chatType === 'chat' && !this.chat.isForumTopic) {\n const dialog = await m(this.managers.appMessagesManager.getDialogOnly(peerId));\n if(dialog?.pFlags.unread_mark) {\n this.managers.appMessagesManager.markDialogUnread(peerId, true);\n }\n }\n\n // this.chatInner.classList.remove('disable-hover', 'is-scrolling'); // warning, performance!\n }).catch((err) => {\n log.error('setPeer promise error:', err);\n if(!middleware()) {\n this.preloader.detach();\n }\n\n throw err;\n });\n\n return {cached, promise: setPeerPromise};\n }\n\n private async setFetchReactionsInterval(afterSetPromise: Promise) {\n const middleware = this.getMiddleware();\n const needReactionsInterval = this.chat.isChannel;\n if(needReactionsInterval) {\n const fetchReactions = async() => {\n if(!middleware()) return;\n\n const mids: number[] = [];\n for(const mid in this.bubbles) {\n let message = await this.chat.getMessage(+mid);\n if(message?._ !== 'message') {\n continue;\n }\n\n message = await this.managers.appMessagesManager.getGroupsFirstMessage(message);\n mids.push(message.mid);\n }\n\n const promise = mids.length ? this.managers.appReactionsManager.getMessagesReactions(this.peerId, mids) : Promise.resolve();\n promise.then(() => {\n setTimeout(fetchReactions, 10e3);\n });\n };\n\n Promise.all([afterSetPromise, getHeavyAnimationPromise(), pause(500)]).then(() => {\n fetchReactions();\n });\n }\n }\n\n private async setFetchHistoryInterval({\n lastMsgId,\n topMessage,\n afterSetPromise,\n savedPosition,\n samePeer\n }: {\n lastMsgId: number,\n topMessage: number,\n afterSetPromise: Promise,\n savedPosition: ChatSavedPosition,\n samePeer: boolean\n }) {\n const middleware = this.getMiddleware();\n const peerId = this.peerId;\n\n const needFetchInterval = await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId);\n const needFetchNew = savedPosition || needFetchInterval;\n if(!needFetchNew) {\n return;\n }\n\n await afterSetPromise;\n if(!middleware()) {\n return;\n }\n\n const chatId = peerId.toChatId();\n middleware.onClean(() => {\n this.managers.apiUpdatesManager.unsubscribeFromChannelUpdates(chatId);\n });\n\n this.managers.apiUpdatesManager.subscribeToChannelUpdates(chatId);\n return;\n\n this.setLoaded('bottom', false);\n this.scrollable.checkForTriggers();\n\n if(!needFetchInterval) {\n return;\n }\n\n const f = () => {\n this.fetchNewPromise = new Promise(async(resolve) => {\n if(!middleware() || !(await this.managers.appMessagesManager.isFetchIntervalNeeded(peerId))) {\n resolve();\n return;\n }\n\n this.managers.appMessagesManager.getNewHistory(peerId, this.chat.threadId).then((result) => {\n if(!middleware() || !result) {\n resolve();\n return;\n }\n\n const {isBottomEnd} = result;\n if(this.scrollable.loadedAll.bottom && this.scrollable.loadedAll.bottom !== isBottomEnd) {\n this.setLoaded('bottom', isBottomEnd);\n this.onScroll();\n }\n\n setTimeout(f, 30e3);\n resolve();\n });\n }).finally(() => {\n this.fetchNewPromise = undefined;\n });\n };\n\n if(samePeer) {\n setTimeout(f, 30e3);\n } else {\n f();\n }\n }\n\n public async onScrolledAllDown() {\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n const historyMaxId = await this.chat.getHistoryMaxId();\n this.managers.appMessagesManager.readHistory(this.peerId, historyMaxId, this.chat.threadId, true);\n }\n }\n\n public async finishPeerChange() {\n const [isChannel, canWrite, isAnyGroup] = await Promise.all([\n this.chat.isChannel,\n this.chat.canSend(),\n this.chat.isAnyGroup\n ]);\n\n return () => {\n this.chatInner.classList.toggle('has-rights', canWrite);\n this.container.classList.toggle('is-chat-input-hidden', !canWrite);\n\n this.chatInner.classList.toggle('is-chat', isAnyGroup);\n this.chatInner.classList.toggle('is-channel', isChannel);\n\n this.createResizeObserver();\n };\n }\n\n private processBatch = async(...args: Parameters) => {\n let [loadQueue, m, log] = args;\n\n const filterQueue = (queue: typeof loadQueue) => {\n return queue.filter((details) => {\n // message can be deleted during rendering\n return details && this.bubbles[details.bubble.dataset.mid] === details.bubble;\n });\n };\n\n loadQueue = filterQueue(loadQueue);\n\n log('messages rendered');\n\n const reverse = loadQueue[0]?.reverse;\n\n const {groups, avatarPromises} = this.groupBubbles(loadQueue.filter((details) => details.updatePosition));\n\n // if(groups.length > 2 && loadQueue.length === 1) {\n // debugger;\n // }\n\n const promises = loadQueue.reduce((acc, details) => {\n const perf = performance.now();\n\n const promises = details.promises.slice();\n const timePromises = promises.map(async(promise) => (await promise, performance.now() - perf));\n Promise.all(timePromises).then((times) => {\n log.groupCollapsed('media message time', performance.now() - perf, details, times);\n times.forEach((time, idx) => {\n log('media message time', time, idx, promises[idx]);\n });\n log.groupEnd();\n });\n\n // if(details.updatePosition) {\n // if(res) {\n // groups.add(res.group);\n // if(details.needAvatar) {\n // details.promises.push(res.group.createAvatar(details.message));\n // }\n // }\n // }\n\n acc.push(...details.promises);\n return acc;\n }, [] as Promise[]);\n\n promises.push(...avatarPromises);\n // promises.push(pause(200));\n\n // * это нужно для того, чтобы если захочет подгрузить reply или какое-либо сообщение, то скролл не прервался\n // * если добавить этот промис - в таком случае нужно сделать, чтобы скроллило к последнему сообщению после рендера\n // promises.push(getHeavyAnimationPromise());\n\n log('media promises to call', promises, loadQueue, this.isHeavyAnimationInProgress);\n await m(Promise.all([...promises, this.setUnreadDelimiter()]).catch(noop)); // не нашёл места лучше\n await m(fastRafPromise()); // have to be the last\n log('media promises end');\n\n loadQueue = filterQueue(loadQueue);\n\n const {restoreScroll, scrollSaver} = this.prepareToSaveScroll(reverse);\n // if(this.messagesQueueOnRender) {\n // this.messagesQueueOnRender();\n // }\n\n this.messagesQueueOnRenderAdditional?.();\n\n this.ejectBubbles();\n for(const [bubble, oldBubble] of this.bubblesToReplace) {\n if(scrollSaver) {\n scrollSaver.replaceSaved(oldBubble, bubble);\n }\n\n if(!loadQueue.find((details) => details.bubble === bubble)) {\n continue;\n }\n\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(!item) {\n this.log.error('NO ITEM BY BUBBLE', bubble);\n } else {\n item.mounted = false;\n if(!groups.includes(item.group)) {\n groups.push(item.group);\n }\n }\n\n this.bubblesToReplace.delete(bubble);\n }\n\n if(this.chat.selection.isSelecting) {\n loadQueue.forEach(({bubble}) => {\n this.chat.selection.toggleElementCheckbox(bubble, true);\n });\n }\n\n loadQueue.forEach(({message, bubble, updatePosition}) => {\n if(message.pFlags.local && updatePosition) {\n this.chatInner[(message as Message.message).pFlags.sponsored ? 'append' : 'prepend'](bubble);\n return;\n }\n });\n\n this.bubbleGroups.mountUnmountGroups(groups);\n // this.bubbleGroups.findIncorrentPositions();\n\n this.updatePlaceholderPosition?.();\n\n restoreScroll?.();\n\n // this.setStickyDateManually();\n };\n\n public renderMessagesQueue(options: ReturnType) {\n return this.batchProcessor.addToQueue(options);\n }\n\n private ejectBubbles() {\n for(const bubble of this.bubblesToEject) {\n bubble.remove();\n // this.bubbleGroups.removeAndUnmountBubble(bubble);\n }\n\n this.bubblesToEject.clear();\n }\n\n public groupBubbles(items: Array<{\n // Awaited> &\n bubble: HTMLElement,\n message: Message.message | Message.messageService\n }/* & {\n unmountIfFound?: boolean\n } */>) {\n let modifiedGroups: typeof groups;\n\n if(this.chat.type === 'scheduled') {\n modifiedGroups = new Set();\n items.forEach(({bubble, message}) => {\n const item = this.bubbleGroups.getItemByBubble(bubble);\n const group = item?.group;\n if(group && item.message.date !== message.date) {\n this.bubbleGroups.removeItem(item);\n modifiedGroups.add(group);\n }\n });\n }\n\n items.forEach(({bubble, message}) => {\n this.bubbleGroups.prepareForGrouping(bubble, message);\n });\n\n const groups = this.bubbleGroups.groupUngrouped();\n\n const avatarPromises = Array.from(groups).map((group) => {\n if(group.avatar) return;\n const firstItem = group.firstItem;\n if(firstItem && this.chat.isAvatarNeeded(firstItem.message)) {\n return group.createAvatar(firstItem.message);\n }\n }).filter(Boolean);\n\n if(modifiedGroups) {\n for(const group of modifiedGroups) {\n groups.add(group);\n }\n }\n\n return {\n groups: [...groups],\n avatarPromises\n };\n }\n\n public getMiddleware(additionalCallback?: () => boolean) {\n return this.middlewareHelper.get(additionalCallback);\n }\n\n private async wrapMediaSpoiler({\n media,\n promise,\n middleware,\n attachmentDiv\n }: {\n media: Photo.photo | MyDocument,\n promise: Promise,\n middleware: Middleware,\n attachmentDiv: HTMLElement\n }) {\n await promise;\n if(!middleware()) {\n return;\n }\n\n const {width, height} = attachmentDiv.style;\n const container = await wrapMediaSpoiler({\n media,\n width: parseInt(width),\n height: parseInt(height),\n middleware,\n animationGroup: this.chat.animationGroup\n });\n\n if(!middleware()) {\n return;\n }\n\n attachmentDiv.append(container);\n }\n\n private async safeRenderMessage(\n message: Message.message | Message.messageService,\n reverse?: boolean,\n bubble?: HTMLElement,\n updatePosition = true,\n processResult?: (result: ReturnType, bubble: HTMLElement) => typeof result\n ) {\n if(!message || this.renderingMessages.has(message.mid) || (this.bubbles[message.mid] && !bubble)) {\n return;\n }\n\n const middlewareHelper = this.getMiddleware().create();\n const middleware = middlewareHelper.get();\n\n let result: Awaited> & {updatePosition: typeof updatePosition};\n try {\n this.renderingMessages.add(message.mid);\n\n // const groupedId = (message as Message.message).grouped_id;\n const newBubble = document.createElement('div');\n newBubble.middlewareHelper = middlewareHelper;\n newBubble.dataset.mid = '' + message.mid;\n newBubble.dataset.peerId = '' + message.peerId;\n newBubble.dataset.timestamp = '' + message.date;\n\n // const bubbleNew: Bubble = this.bubblesNew[message.mid] ??= {\n // bubble: newBubble,\n // mids: new Set(),\n // groupedId\n // };\n\n // bubbleNew.mids.add(message.mid);\n\n if(bubble) {\n bubble.middlewareHelper.destroy();\n this.skippedMids.delete(message.mid);\n\n this.bubblesToEject.add(bubble);\n this.bubblesToReplace.delete(bubble);\n this.bubblesToReplace.set(newBubble, bubble);\n this.bubbleGroups.changeBubbleByBubble(bubble, newBubble);\n }\n\n bubble = this.bubbles[message.mid] = newBubble;\n let originalPromise = this.renderMessage(message, reverse, bubble, middleware);\n if(processResult) {\n originalPromise = processResult(originalPromise, bubble);\n }\n\n const promise = originalPromise.then((r) => ((r && middleware() ? {...r, updatePosition} : undefined) as typeof result));\n\n this.renderMessagesQueue(promise.catch(() => undefined));\n\n result = await promise;\n if(!middleware()) {\n return;\n }\n\n if(!result) {\n this.skippedMids.add(+message.mid);\n }\n } catch(err) {\n this.log.error('renderMessage error:', err);\n }\n\n if(!middleware()) {\n return;\n }\n\n this.renderingMessages.delete(message.mid);\n return result;\n }\n\n // reverse means top\n private async renderMessage(\n message: Message.message | Message.messageService,\n reverse = false,\n bubble: HTMLElement,\n middleware: Middleware\n ) {\n // if(DEBUG) {\n // this.log('message to render:', message);\n // }\n\n // if(!bubble && this.bubbles[message.mid]) {\n // return;\n // }\n\n // await pause(1000);\n\n const isMessage = message._ === 'message';\n const groupedId = isMessage && message.grouped_id;\n let albumMids: number[], reactionsMessage: Message.message;\n const albumMessages = groupedId ? await this.managers.appMessagesManager.getMessagesByAlbum(groupedId) : undefined;\n\n const albumMustBeRenderedFull = this.chat.type !== 'pinned';\n\n if(groupedId && albumMustBeRenderedFull) { // will render only last album's message\n albumMids = albumMessages.map((message) => message.mid);\n const mainMid = getMainMidForGrouped(albumMids);\n if(message.mid !== mainMid) {\n return;\n }\n }\n\n if(isMessage) {\n reactionsMessage = groupedId ? albumMessages[0] : message;\n }\n\n // * can't use 'message.pFlags.out' here because this check will be used to define side of message (left-right)\n const our = this.chat.isOurMessage(message);\n\n const messageDiv = document.createElement('div');\n messageDiv.classList.add('message', 'spoilers-container');\n\n const contentWrapper = document.createElement('div');\n contentWrapper.classList.add('bubble-content-wrapper');\n\n const bubbleContainer = document.createElement('div');\n bubbleContainer.classList.add('bubble-content');\n\n bubble.classList.add('bubble');\n contentWrapper.append(bubbleContainer);\n bubble.append(contentWrapper);\n\n let isInUnread = !our &&\n !message.pFlags.out &&\n (\n message.pFlags.unread ||\n isMentionUnread(message)\n );\n\n if(!isInUnread && this.chat.peerId.isAnyChat()) {\n const readMaxId = await this.managers.appMessagesManager.getReadMaxIdIfUnread(this.chat.peerId, this.chat.threadId);\n if(readMaxId !== undefined && readMaxId < message.mid) {\n isInUnread = true;\n }\n }\n\n if(isInUnread && this.observer) {\n // this.log('not our message', message, message.pFlags.unread);\n this.observer.observe(bubble, this.unreadedObserverCallback);\n this.unreaded.set(bubble, message.mid);\n }\n\n const loadPromises: Promise[] = [];\n const ret = {\n bubble,\n promises: loadPromises,\n message,\n reverse\n };\n\n const wrapOptions: WrapSomethingOptions = {\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n customEmojiSize: this.chat.appImManager.customEmojiSize,\n animationGroup: this.chat.animationGroup\n };\n\n if(message._ === 'messageService' && (!message.action || !SERVICE_AS_REGULAR.has(message.action._))) {\n const action = message.action;\n if(action) {\n const _ = action._;\n\n const ignoreAction = IGNORE_ACTIONS.get(_);\n if(ignoreAction && (ignoreAction === true || ignoreAction(message))) {\n return;\n }\n\n if(langPack.hasOwnProperty(_) && !langPack[_]) {\n return;\n }\n }\n\n bubble.className = 'bubble service';\n\n bubbleContainer.innerHTML = '';\n const s = document.createElement('div');\n s.classList.add('service-msg');\n if(action) {\n let promise: Promise;\n if(action._ === 'messageActionChannelMigrateFrom') {\n const peerTitle = new PeerTitle();\n promise = peerTitle.update({peerId: action.chat_id.toPeerId(true), wrapOptions});\n s.append(i18n('ChatMigration.From', [peerTitle.element]));\n } else if(action._ === 'messageActionChatMigrateTo') {\n const peerTitle = new PeerTitle();\n promise = peerTitle.update({peerId: action.channel_id.toPeerId(true), wrapOptions});\n s.append(i18n('ChatMigration.To', [peerTitle.element]));\n } else {\n s.append(await wrapMessageActionTextNew({\n message,\n ...wrapOptions\n }));\n }\n }\n bubbleContainer.append(s);\n\n if(message.pFlags.is_single) { // * Ignore 'Discussion started'\n bubble.classList.add('is-group-last');\n }\n\n return ret;\n }\n\n let messageMedia: MessageMedia = isMessage && message.media;\n let needToSetHTML = true;\n let messageMessage: string, totalEntities: MessageEntity[];\n if(isMessage) {\n if(groupedId && albumMustBeRenderedFull) {\n const t = getAlbumText(albumMessages);\n messageMessage = t?.message || '';\n // totalEntities = t.entities;\n totalEntities = t?.totalEntities || [];\n } else {\n messageMessage = message.message;\n // totalEntities = message.entities;\n totalEntities = message.totalEntities;\n }\n\n const document = (messageMedia as MessageMedia.messageMediaDocument)?.document as MyDocument;\n if(document) {\n if(document?.type === 'sticker') {\n messageMessage = totalEntities = undefined;\n } else if(!['video', 'gif'].includes(document.type)) {\n needToSetHTML = false;\n }\n }\n } else {\n if(message.action._ === 'messageActionPhoneCall') {\n messageMedia = {\n _: 'messageMediaCall',\n action: message.action\n };\n }\n }\n\n let bigEmojis = 0, customEmojiSize: MediaSize;\n if(totalEntities && !messageMedia) {\n const emojiEntities = totalEntities.filter((e) => e._ === 'messageEntityEmoji'/* || e._ === 'messageEntityCustomEmoji' */);\n const strLength = messageMessage.replace(/\\s/g, '').length;\n const emojiStrLength = emojiEntities.reduce((acc, curr) => acc + curr.length, 0);\n\n if(emojiStrLength === strLength /* && emojiEntities.length <= 3 *//* && totalEntities.length === emojiEntities.length */) {\n bigEmojis = Math.min(BIG_EMOJI_SIZES_LENGTH, emojiEntities.length);\n\n customEmojiSize = mediaSizes.active.customEmoji;\n\n const size = BIG_EMOJI_SIZES[bigEmojis];\n if(size) {\n customEmojiSize = makeMediaSize(size, size);\n bubble.style.setProperty('--emoji-size', size + 'px');\n }\n }\n }\n\n customEmojiSize ??= this.chat.appImManager.customEmojiSize;\n\n const richText = wrapRichText(messageMessage, {\n entities: totalEntities,\n passEntities: this.passEntities,\n loadPromises,\n lazyLoadQueue: this.lazyLoadQueue,\n customEmojiSize,\n middleware,\n animationGroup: this.chat.animationGroup\n });\n\n let canHaveTail = true;\n let isStandaloneMedia = false;\n let attachmentDiv: HTMLElement;\n if(bigEmojis) {\n if(rootScope.settings.emoji.big) {\n const sticker = bigEmojis === 1 &&\n !totalEntities.find((entity) => entity._ === 'messageEntityCustomEmoji') &&\n await this.managers.appStickersManager.getAnimatedEmojiSticker(messageMessage);\n if(bigEmojis === 1 && !messageMedia && sticker) {\n messageMedia = {\n _: 'messageMediaDocument',\n document: sticker\n };\n } else {\n attachmentDiv = document.createElement('div');\n attachmentDiv.classList.add('attachment', 'spoilers-container');\n\n setInnerHTML(attachmentDiv, richText);\n\n bubbleContainer.append(attachmentDiv);\n }\n\n bubble.classList.add('is-message-empty', 'emoji-big');\n isStandaloneMedia = true;\n canHaveTail = false;\n needToSetHTML = false;\n }\n\n bubble.classList.add('can-have-big-emoji');\n }\n\n if(needToSetHTML) {\n setInnerHTML(messageDiv, richText);\n }\n\n const haveRTLChar = isRTL(messageMessage, true);\n\n const timeSpan = MessageRender.setTime({\n chatType: this.chat.type,\n message,\n reactionsMessage\n });\n messageDiv.append(timeSpan);\n bubbleContainer.prepend(messageDiv);\n // bubble.prepend(timeSpan, messageDiv); // that's bad\n\n if(haveRTLChar) {\n timeSpan.classList.add('is-block');\n }\n\n let topicNameButtonContainer: HTMLElement;\n if(isMessage && this.chat.isAllMessagesForum) {\n const result = await wrapTopicNameButton({\n peerId: this.peerId,\n threadId: getMessageThreadId(message, this.chat.isForum),\n lastMsgId: message.mid,\n wrapOptions: {\n middleware\n },\n withIcons: true\n });\n\n const {element} = result;\n // if(isStandaloneMedia) {\n // element.classList.add('floating-part');\n // }\n\n topicNameButtonContainer = document.createElement('div');\n topicNameButtonContainer.classList.add(/* 'name', */'topic-name-button-container');\n topicNameButtonContainer.append(element);\n }\n\n if(isMessage && message.views) {\n bubble.classList.add('channel-post');\n\n if(!message.fwd_from?.saved_from_msg_id && this.chat.type !== 'pinned') {\n const forward = document.createElement('div');\n forward.classList.add('bubble-beside-button', 'forward', 'tgico-forward_filled');\n bubbleContainer.prepend(forward);\n bubble.classList.add('with-beside-button');\n }\n\n if(!message.pFlags.is_outgoing && this.observer) {\n this.observer.observe(bubble, this.viewsObserverCallback);\n }\n }\n\n const replyMarkup = isMessage && message.reply_markup;\n let replyMarkupRows = replyMarkup?._ === 'replyInlineMarkup' && replyMarkup.rows;\n if(replyMarkupRows) {\n replyMarkupRows = replyMarkupRows.filter((row) => row.buttons.length);\n }\n\n if(replyMarkupRows) {\n const containerDiv = document.createElement('div');\n containerDiv.classList.add('reply-markup');\n replyMarkupRows.forEach((row) => {\n const buttons = row.buttons;\n\n const rowDiv = document.createElement('div');\n rowDiv.classList.add('reply-markup-row');\n\n buttons.forEach((button) => {\n let text: DocumentFragment | HTMLElement | string = wrapRichText(button.text, {noLinks: true, noLinebreaks: true});\n\n let buttonEl: HTMLButtonElement | HTMLAnchorElement;\n\n switch(button._) {\n case 'keyboardButtonUrl': {\n const r = wrapRichText(' ', {\n entities: [{\n _: 'messageEntityTextUrl',\n length: 1,\n offset: 0,\n url: button.url\n }]\n });\n\n buttonEl = htmlToDocumentFragment(r).firstElementChild as HTMLAnchorElement;\n buttonEl.classList.add('is-link');\n\n break;\n }\n\n case 'keyboardButtonSwitchInline': {\n buttonEl = document.createElement('button');\n buttonEl.classList.add('is-switch-inline');\n attachClickEvent(buttonEl, (e) => {\n cancelEvent(e);\n\n const botId = message.viaBotId || message.fromId;\n let promise: Promise;\n if(button.pFlags.same_peer) promise = Promise.resolve(this.peerId);\n else promise = this.managers.appInlineBotsManager.checkSwitchReturn(botId).then((peerId) => {\n if(peerId) {\n return peerId;\n }\n\n return new Promise((resolve, reject) => {\n const popup = new PopupForward({\n [this.peerId]: []\n }, (peerId) => {\n resolve(peerId);\n }, true);\n\n popup.addEventListener('close', () => {\n reject();\n });\n });\n });\n\n promise.then((peerId) => {\n const threadId = this.peerId === peerId ? this.chat.threadId : undefined;\n this.chat.appImManager.setInnerPeer({peerId});\n this.managers.appInlineBotsManager.switchInlineQuery(peerId, threadId, botId, button.query);\n });\n });\n break;\n }\n\n case 'keyboardButtonBuy': {\n const mediaInvoice = messageMedia._ === 'messageMediaInvoice' ? messageMedia : undefined;\n if(mediaInvoice?.extended_media) {\n break;\n }\n\n buttonEl = document.createElement('button');\n buttonEl.classList.add('is-buy');\n\n if(mediaInvoice?.receipt_msg_id) {\n text = i18n('Message.ReplyActionButtonShowReceipt');\n }\n\n break;\n }\n\n case 'keyboardButtonUrlAuth': {\n buttonEl = document.createElement('button');\n buttonEl.classList.add('is-url-auth');\n\n const {peerId} = this;\n const {mid} = message;\n const {url, button_id} = button;\n\n attachClickEvent(buttonEl, () => {\n const toggle = toggleDisability([buttonEl], true);\n this.chat.appImManager.handleUrlAuth({\n peerId,\n mid,\n url,\n buttonId: button_id\n }).then(() => {\n toggle();\n });\n });\n break;\n }\n\n default: {\n buttonEl = document.createElement('button');\n break;\n }\n }\n\n if(!buttonEl) {\n return;\n }\n\n buttonEl.classList.add('reply-markup-button', 'rp', 'tgico');\n const t = document.createElement('span');\n t.classList.add('reply-markup-button-text');\n if(typeof(text) === 'string') {\n t.insertAdjacentHTML('beforeend', text);\n } else {\n t.append(text);\n }\n\n ripple(buttonEl);\n buttonEl.append(t);\n\n rowDiv.append(buttonEl);\n });\n\n if(!rowDiv.childElementCount) {\n return;\n }\n\n containerDiv.append(rowDiv);\n });\n\n const haveButtons = !!containerDiv.childElementCount;\n\n haveButtons && attachClickEvent(containerDiv, (e) => {\n let target = e.target as HTMLElement;\n\n if(!target.classList.contains('reply-markup-button')) target = findUpClassName(target, 'reply-markup-button');\n if(\n !target ||\n target.classList.contains('is-link') ||\n target.classList.contains('is-switch-inline') ||\n target.classList.contains('is-buy') ||\n target.classList.contains('is-url-auth')\n ) return;\n\n cancelEvent(e);\n\n const column = whichChild(target);\n const row = replyMarkupRows[whichChild(target.parentElement)];\n\n if(!row.buttons || !row.buttons[column]) {\n this.log.warn('no such button', row, column, message);\n return;\n }\n\n const button = row.buttons[column];\n this.managers.appInlineBotsManager.callbackButtonClick(this.peerId, message.mid, button).then((callbackAnswer) => {\n if(typeof callbackAnswer.message === 'string' && callbackAnswer.message.length) {\n toast(wrapRichText(callbackAnswer.message, {noLinks: true, noLinebreaks: true}));\n }\n\n // console.log('callbackButtonClick callbackAnswer:', callbackAnswer);\n });\n });\n\n if(haveButtons) {\n // canHaveTail = false;\n bubble.classList.add('with-reply-markup');\n contentWrapper.append(containerDiv);\n }\n }\n\n const isOutgoing = message.pFlags.is_outgoing/* && this.peerId !== rootScope.myId */;\n if(our) {\n if(message.pFlags.unread || isOutgoing) this.unreadOut.add(message.mid);\n let status = '';\n if(message.error) status = 'is-error';\n else if(isOutgoing) status = 'is-sending';\n else status = message.pFlags.unread || (message as Message.message).pFlags.is_scheduled ? 'is-sent' : 'is-read';\n bubble.classList.add(status);\n }\n\n if(isOutgoing && !message.error) {\n bubble.classList.add('is-outgoing');\n }\n\n const messageWithReplies = isMessage && await this.managers.appMessagesManager.getMessageWithCommentReplies(message);\n const withReplies = !!messageWithReplies && message.mid > 0;\n\n if(withReplies) {\n bubble.classList.add('with-replies');\n }\n\n const fwdFrom = isMessage && message.fwd_from;\n const fwdFromId = isMessage && message.fwdFromId;\n\n const isOut = this.chat.isOutMessage(message);\n let nameContainer: HTMLElement = bubbleContainer;\n\n const canHideNameIfMedia = !message.viaBotId && (message.fromId === rootScope.myId || !message.pFlags.out);\n\n const isMessageEmpty = !messageMessage/* && (!topicNameButtonContainer || isStandaloneMedia) */;\n\n let viewButton: HTMLAnchorElement;\n // media\n if(messageMedia/* && messageMedia._ === 'messageMediaPhoto' */) {\n attachmentDiv = document.createElement('div');\n attachmentDiv.classList.add('attachment');\n\n if(isMessageEmpty) {\n bubble.classList.add('is-message-empty');\n }\n\n let processingWebPage = false;\n\n /* if(isMessage) */switch(messageMedia._) {\n case 'messageMediaPhoto': {\n const photo = messageMedia.photo;\n // //////this.log('messageMediaPhoto', photo);\n\n if(isMessageEmpty) {\n canHaveTail = false;\n }\n\n if(canHideNameIfMedia) {\n bubble.classList.add('hide-name');\n }\n\n bubble.classList.add('photo');\n\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\n bubble.classList.add('is-album', 'is-grouped');\n wrapAlbum({\n messages: albumMessages,\n attachmentDiv,\n middleware: this.getMiddleware(),\n isOut: our,\n lazyLoadQueue: this.lazyLoadQueue,\n chat: this.chat,\n loadPromises,\n autoDownload: this.chat.autoDownload\n });\n\n break;\n }\n\n const withTail = !IS_ANDROID && canHaveTail && !withReplies && USE_MEDIA_TAILS;\n if(withTail) bubble.classList.add('with-media-tail');\n const p = wrapPhoto({\n photo: photo as Photo.photo,\n message,\n container: attachmentDiv,\n withTail,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware: this.getMiddleware(),\n loadPromises,\n autoDownloadSize: this.chat.autoDownload.photo\n });\n\n if(messageMedia.pFlags.spoiler) {\n loadPromises.push(this.wrapMediaSpoiler({\n media: photo as Photo.photo,\n promise: p,\n middleware,\n attachmentDiv\n }));\n }\n\n break;\n }\n\n case 'messageMediaWebPage': {\n processingWebPage = true;\n\n const webPage: WebPage = messageMedia.webpage;\n // //////this.log('messageMediaWebPage', webpage);\n if(webPage._ !== 'webPage') {\n break;\n }\n\n const wrapped = wrapUrl(webPage.url);\n if(wrapped?.onclick === 'im') {\n const map: {[type: string]: LangPackKey} = {\n telegram_channel: 'Chat.Message.ViewChannel',\n telegram_megagroup: 'OpenGroup',\n telegram_bot: 'Chat.Message.ViewBot'\n };\n\n const langPackKey = map[webPage.type] || 'OpenMessage';\n viewButton = this.makeViewButton({text: langPackKey, asLink: true});\n viewButton.href = wrapped.url;\n viewButton.setAttribute('onclick', `${wrapped.onclick}(this)`);\n }\n\n bubble.classList.add('webpage');\n\n const box = document.createElement('div');\n box.classList.add('web');\n\n const quote = document.createElement('div');\n quote.classList.add('quote');\n\n let previewResizer: HTMLDivElement, preview: HTMLDivElement;\n const photo: Photo.photo = webPage.photo as any;\n if(photo || webPage.document) {\n previewResizer = document.createElement('div');\n previewResizer.classList.add('preview-resizer');\n preview = document.createElement('div');\n preview.classList.add('preview');\n previewResizer.append(preview);\n }\n\n const quoteTextDiv = document.createElement('div');\n quoteTextDiv.classList.add('quote-text');\n\n const doc = webPage.document as MyDocument;\n if(doc) {\n if(doc.type === 'gif' || doc.type === 'video' || doc.type === 'round') {\n // if(doc.size <= 20e6) {\n const mediaSize = doc.type === 'round' ? mediaSizes.active.round : mediaSizes.active.webpage;\n if(doc.type === 'round') {\n bubble.classList.add('round');\n preview.classList.add('is-round');\n } else {\n bubble.classList.add('video');\n }\n wrapVideo({\n doc,\n container: preview,\n message: message as Message.message,\n boxWidth: mediaSize.width,\n boxHeight: mediaSize.height,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware: this.getMiddleware(),\n isOut,\n group: this.chat.animationGroup,\n loadPromises,\n autoDownload: this.chat.autoDownload,\n noInfo: message.mid < 0\n });\n // }\n } else {\n const docDiv = await wrapDocument({\n message: message as Message.message,\n autoDownloadSize: this.chat.autoDownload.file,\n lazyLoadQueue: this.lazyLoadQueue,\n loadPromises,\n sizeType: 'documentName',\n searchContext: {\n useSearch: false,\n peerId: this.peerId,\n inputFilter: {\n _: 'inputMessagesFilterEmpty'\n }\n },\n fontSize: rootScope.settings.messagesTextSize\n });\n preview.append(docDiv);\n preview.classList.add('preview-with-document');\n quoteTextDiv.classList.add('has-document');\n // messageDiv.classList.add((webpage.type || 'document') + '-message');\n // doc = null;\n }\n }\n\n if(previewResizer) {\n quoteTextDiv.append(previewResizer);\n }\n\n let t: HTMLElement;\n if(webPage.site_name) {\n const html = wrapRichText(webPage.url);\n const a: HTMLAnchorElement = htmlToDocumentFragment(html).firstElementChild as any;\n a.classList.add('webpage-name');\n const strong = document.createElement('strong');\n setInnerHTML(strong, wrapEmojiText(webPage.site_name));\n a.textContent = '';\n a.append(strong);\n quoteTextDiv.append(a);\n t = a;\n }\n\n const title = wrapWebPageTitle(webPage);\n if(title.textContent) {\n const titleDiv = document.createElement('div');\n titleDiv.classList.add('title');\n const strong = document.createElement('strong');\n setInnerHTML(strong, title);\n titleDiv.append(strong);\n quoteTextDiv.append(titleDiv);\n t = titleDiv;\n }\n\n const description = wrapWebPageDescription(webPage);\n if(description.textContent) {\n const textDiv = document.createElement('div');\n textDiv.classList.add('text');\n setInnerHTML(textDiv, description);\n quoteTextDiv.append(textDiv);\n t = textDiv;\n }\n\n /* if(t) {\n t.append(timeSpan);\n } else {\n box.classList.add('no-text');\n } */\n\n quote.append(quoteTextDiv);\n\n if(photo && !doc) {\n bubble.classList.add('photo');\n\n const size: PhotoSize.photoSize = photo.sizes[photo.sizes.length - 1] as any;\n let isSquare = false;\n if(size.w === size.h && t) {\n bubble.classList.add('is-square-photo');\n isSquare = true;\n setAttachmentSize(photo, preview, 48, 48, false);\n\n /* if(t) {\n t.append(timeSpan);\n } */\n } else if(size.h > size.w) {\n bubble.classList.add('is-vertical-photo');\n }\n\n wrapPhoto({\n photo,\n message,\n container: preview,\n boxWidth: isSquare ? 0 : mediaSizes.active.webpage.width,\n boxHeight: isSquare ? 0 : mediaSizes.active.webpage.height,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware: this.getMiddleware(),\n loadPromises,\n withoutPreloader: isSquare,\n autoDownloadSize: this.chat.autoDownload.photo\n });\n }\n\n box.append(quote);\n\n // bubble.prepend(box);\n // if(timeSpan.parentElement === messageDiv) {\n messageDiv.insertBefore(box, timeSpan);\n // } else {\n // messageDiv.append(box);\n // }\n\n // this.log('night running', bubble.scrollHeight);\n\n break;\n }\n\n case 'messageMediaDocument': {\n const doc = messageMedia.document as MyDocument;\n\n // this.log('messageMediaDocument', doc, bubble);\n\n if(doc.sticker/* && doc.size <= 1e6 */) {\n bubble.classList.add('sticker');\n canHaveTail = false;\n isStandaloneMedia = true;\n\n if(doc.animated) {\n bubble.classList.add('sticker-animated');\n }\n\n const sizes = mediaSizes.active;\n const isEmoji = bubble.classList.contains('emoji-big');\n const boxSize = isEmoji ? sizes.emojiSticker : (doc.animated ? sizes.animatedSticker : sizes.staticSticker);\n setAttachmentSize(doc, attachmentDiv, boxSize.width, boxSize.height);\n // let preloader = new ProgressivePreloader(attachmentDiv, false);\n bubbleContainer.style.minWidth = attachmentDiv.style.width;\n bubbleContainer.style.minHeight = attachmentDiv.style.height;\n // appPhotosManager.setAttachmentSize(doc, bubble);\n wrapSticker({\n doc,\n div: attachmentDiv,\n middleware,\n lazyLoadQueue: this.lazyLoadQueue,\n group: this.chat.animationGroup,\n // play: !!message.pending || !multipleRender,\n play: true,\n loop: true,\n emoji: isEmoji ? messageMessage : undefined,\n withThumb: true,\n loadPromises,\n isOut,\n noPremium: messageMedia?.pFlags?.nopremium\n });\n\n if((getStickerEffectThumb(doc) || isEmoji) && (isInUnread || isOutgoing)/* || true */) {\n this.observer.observe(bubble, this.stickerEffectObserverCallback);\n }\n } else if(doc.type === 'video' || doc.type === 'gif' || doc.type === 'round'/* && doc.size <= 20e6 */) {\n // this.log('never get free 2', doc);\n\n const isRound = doc.type === 'round';\n if(isRound) {\n isStandaloneMedia = true;\n }\n\n if(isRound || isMessageEmpty) {\n canHaveTail = false;\n }\n\n if(canHideNameIfMedia) {\n bubble.classList.add('hide-name');\n }\n\n bubble.classList.add(isRound ? 'round' : 'video');\n if(albumMustBeRenderedFull && groupedId && albumMids.length !== 1) {\n bubble.classList.add('is-album', 'is-grouped');\n\n wrapAlbum({\n messages: albumMessages,\n attachmentDiv,\n middleware,\n isOut: our,\n lazyLoadQueue: this.lazyLoadQueue,\n chat: this.chat,\n loadPromises,\n autoDownload: this.chat.autoDownload\n });\n } else {\n const withTail = !IS_ANDROID && !IS_APPLE && !isRound && canHaveTail && !withReplies && USE_MEDIA_TAILS;\n if(withTail) bubble.classList.add('with-media-tail');\n const p = wrapVideo({\n doc,\n container: attachmentDiv,\n message: message as Message.message,\n boxWidth: mediaSizes.active.regular.width,\n boxHeight: mediaSizes.active.regular.height,\n withTail,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n group: this.chat.animationGroup,\n loadPromises,\n autoDownload: this.chat.autoDownload,\n searchContext: isRound ? {\n peerId: this.peerId,\n inputFilter: {_: 'inputMessagesFilterRoundVoice'},\n threadId: this.chat.threadId,\n useSearch: !(message as Message.message).pFlags.is_scheduled,\n isScheduled: (message as Message.message).pFlags.is_scheduled\n } : undefined,\n noInfo: message.mid < 0,\n noAutoplayAttribute: !!messageMedia.pFlags.spoiler\n });\n\n if(messageMedia.pFlags.spoiler) {\n loadPromises.push(this.wrapMediaSpoiler({\n media: doc,\n promise: p,\n middleware,\n attachmentDiv\n }));\n }\n }\n } else {\n const newNameContainer = await wrapGroupedDocuments({\n albumMustBeRenderedFull,\n message,\n bubble,\n messageDiv,\n chat: this.chat,\n loadPromises,\n autoDownloadSize: this.chat.autoDownload.file,\n lazyLoadQueue: this.lazyLoadQueue,\n searchContext: doc.type === 'voice' || doc.type === 'audio' ? {\n peerId: this.peerId,\n inputFilter: {_: doc.type === 'voice' ? 'inputMessagesFilterRoundVoice' : 'inputMessagesFilterMusic'},\n threadId: this.chat.threadId,\n useSearch: !(message as Message.message).pFlags.is_scheduled,\n isScheduled: (message as Message.message).pFlags.is_scheduled\n } : undefined,\n sizeType: 'documentName',\n fontSize: rootScope.settings.messagesTextSize,\n richTextFragment: richText\n });\n\n if(newNameContainer) {\n nameContainer = newNameContainer;\n }\n\n const lastContainer = messageDiv.lastElementChild.querySelector('.document-message, .document, .audio');\n // lastContainer && lastContainer.append(timeSpan.cloneNode(true));\n lastContainer && lastContainer.append(timeSpan);\n\n bubble.classList.remove('is-message-empty');\n messageDiv.classList.add((!(['photo', 'pdf'] as MyDocument['type'][]).includes(doc.type) ? doc.type || 'document' : 'document') + '-message');\n processingWebPage = true;\n }\n\n break;\n }\n\n case 'messageMediaCall': {\n const action = messageMedia.action;\n const div = document.createElement('div');\n div.classList.add('bubble-call', action.pFlags.video ? 'tgico-videocamera' : 'tgico-phone');\n\n const type: CallType = action.pFlags.video ? 'video' : 'voice';\n div.dataset.type = type;\n\n const title = document.createElement('div');\n title.classList.add('bubble-call-title');\n\n _i18n(title, isOut ?\n (action.pFlags.video ? 'CallMessageVideoOutgoing' : 'CallMessageOutgoing') :\n (action.pFlags.video ? 'CallMessageVideoIncoming' : 'CallMessageIncoming'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('bubble-call-subtitle');\n\n if(action.duration !== undefined) {\n subtitle.append(formatCallDuration(action.duration));\n } else {\n let langPackKey: LangPackKey;\n switch(action.reason._) {\n case 'phoneCallDiscardReasonBusy':\n langPackKey = 'Call.StatusBusy';\n break;\n case 'phoneCallDiscardReasonMissed':\n langPackKey = 'Chat.Service.Call.Missed';\n break;\n // case 'phoneCallDiscardReasonHangup':\n default:\n langPackKey = 'Chat.Service.Call.Cancelled';\n break;\n }\n\n subtitle.classList.add('is-reason');\n _i18n(subtitle, langPackKey);\n }\n\n subtitle.classList.add('tgico', 'arrow-' + (action.duration !== undefined ? 'green' : 'red'));\n\n div.append(title, subtitle);\n\n processingWebPage = true;\n\n bubble.classList.remove('is-message-empty');\n messageDiv.classList.add('call-message');\n messageDiv.append(div);\n\n break;\n }\n\n case 'messageMediaContact': {\n // this.log('wrapping contact', message);\n\n const contact = messageMedia;\n const contactDiv = document.createElement('div');\n contactDiv.classList.add('contact');\n contactDiv.dataset.peerId = '' + contact.user_id;\n\n processingWebPage = true;\n\n const contactDetails = document.createElement('div');\n contactDetails.className = 'contact-details';\n const contactNameDiv = document.createElement('div');\n contactNameDiv.className = 'contact-name';\n contactNameDiv.append(\n wrapEmojiText([\n contact.first_name,\n contact.last_name\n ].filter(Boolean).join(' '))\n );\n\n const contactNumberDiv = document.createElement('div');\n contactNumberDiv.className = 'contact-number';\n contactNumberDiv.textContent = contact.phone_number ? '+' + formatPhoneNumber(contact.phone_number).formatted : 'Unknown phone number';\n\n contactDiv.append(contactDetails);\n contactDetails.append(contactNameDiv, contactNumberDiv);\n\n const avatarElem = new AvatarElement();\n avatarElem.updateWithOptions({\n lazyLoadQueue: this.lazyLoadQueue,\n peerId: contact.user_id.toPeerId()\n });\n avatarElem.classList.add('contact-avatar', 'avatar-54');\n\n contactDiv.prepend(avatarElem);\n\n bubble.classList.remove('is-message-empty');\n messageDiv.classList.add('contact-message');\n messageDiv.append(contactDiv);\n\n break;\n }\n\n case 'messageMediaPoll': {\n bubble.classList.remove('is-message-empty');\n\n const pollElement = wrapPoll(message);\n messageDiv.prepend(pollElement);\n messageDiv.classList.add('poll-message');\n\n break;\n }\n\n case 'messageMediaInvoice': {\n const isTest = messageMedia.pFlags.test;\n const extendedMedia = messageMedia.extended_media;\n const isAlreadyPaid = extendedMedia?._ === 'messageExtendedMedia';\n const isNotPaid = extendedMedia?._ === 'messageExtendedMediaPreview';\n let innerMedia = isAlreadyPaid ?\n (extendedMedia.media as MessageMedia.messageMediaPhoto).photo as Photo.photo ||\n (extendedMedia.media as MessageMedia.messageMediaDocument).document as Document.document :\n messageMedia.photo;\n\n const wrappedPrice = paymentsWrapCurrencyAmount(messageMedia.total_amount, messageMedia.currency);\n let priceEl: HTMLElement;\n if(!extendedMedia) {\n priceEl = document.createElement(innerMedia ? 'span' : 'div');\n const f = document.createDocumentFragment();\n const l = i18n(messageMedia.receipt_msg_id ? 'PaymentReceipt' : (isTest ? 'PaymentTestInvoice' : 'PaymentInvoice'));\n l.classList.add('text-uppercase');\n const joiner = ' ' + NBSP;\n const p = document.createElement('span');\n p.classList.add('text-bold');\n p.textContent = wrappedPrice + joiner;\n f.append(p, l);\n if(isTest && messageMedia.receipt_msg_id) {\n const a = document.createElement('span');\n a.classList.add('text-uppercase', 'pre-wrap');\n a.append(joiner + '(Test)');\n f.append(a);\n }\n setInnerHTML(priceEl, f);\n } else if(isNotPaid) {\n priceEl = document.createElement('span');\n priceEl.classList.add('extended-media-buy', 'tgico-premium_lock');\n attachmentDiv.classList.add('is-buy');\n _i18n(priceEl, 'Checkout.PayPrice', [wrappedPrice]);\n\n if(extendedMedia.video_duration !== undefined) {\n const videoTime = document.createElement('span');\n videoTime.classList.add('video-time');\n videoTime.textContent = toHHMMSS(extendedMedia.video_duration, false);\n attachmentDiv.append(videoTime);\n }\n }\n\n if(isNotPaid) {\n (extendedMedia.thumb as PhotoSize.photoStrippedSize).w = extendedMedia.w;\n (extendedMedia.thumb as PhotoSize.photoStrippedSize).h = extendedMedia.h;\n innerMedia = {\n _: 'photo',\n access_hash: '',\n pFlags: {},\n date: 0,\n dc_id: 0,\n file_reference: [],\n id: 0,\n sizes: [extendedMedia.thumb]\n };\n }\n\n if(innerMedia) {\n const mediaSize = extendedMedia ? mediaSizes.active.extendedInvoice : mediaSizes.active.invoice;\n if(innerMedia._ === 'document') {\n wrapVideo({\n doc: innerMedia,\n container: attachmentDiv,\n withTail: false,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n loadPromises,\n boxWidth: mediaSize.width,\n boxHeight: mediaSize.height,\n group: this.chat.animationGroup,\n message: message as Message.message\n });\n bubble.classList.add('video');\n } else {\n wrapPhoto({\n photo: innerMedia,\n container: attachmentDiv,\n withTail: false,\n isOut,\n lazyLoadQueue: this.lazyLoadQueue,\n middleware,\n loadPromises,\n boxWidth: mediaSize.width,\n boxHeight: mediaSize.height,\n message: isAlreadyPaid ? message : undefined\n });\n bubble.classList.add('photo');\n }\n\n if(priceEl) {\n if(!extendedMedia) {\n priceEl.classList.add('video-time');\n }\n\n attachmentDiv.append(priceEl);\n }\n } else {\n attachmentDiv = undefined;\n }\n\n if(isNotPaid) {\n const {mid} = message;\n this.extendedMediaMessages.add(mid);\n middleware.onClean(() => {\n this.extendedMediaMessages.delete(mid);\n });\n this.setExtendedMediaMessagesPollInterval();\n\n const {width, height} = attachmentDiv.style;\n const dotRenderer = DotRenderer.create({\n width: parseInt(width),\n height: parseInt(height),\n middleware,\n animationGroup: this.chat.animationGroup\n });\n attachmentDiv.append(dotRenderer.canvas);\n }\n\n let titleDiv: HTMLElement;\n if(!extendedMedia) {\n titleDiv = document.createElement('div');\n titleDiv.classList.add('bubble-primary-color');\n setInnerHTML(titleDiv, wrapEmojiText(messageMedia.title));\n }\n\n const richText = isAlreadyPaid ? undefined : wrapEmojiText(messageMedia.description);\n messageDiv.prepend(...[titleDiv, !innerMedia && priceEl, richText].filter(Boolean));\n\n if(!richText) canHaveTail = false;\n else bubble.classList.remove('is-message-empty');\n bubble.classList.add('is-invoice');\n\n break;\n }\n\n default:\n attachmentDiv = undefined;\n bubble.classList.remove('is-message-empty');\n messageDiv.append(i18n(UNSUPPORTED_LANG_PACK_KEY), timeSpan);\n this.log.warn('unrecognized media type:', messageMedia._, message);\n break;\n }\n\n if(!processingWebPage && attachmentDiv) {\n bubbleContainer.append(attachmentDiv);\n }\n\n /* if(bubble.classList.contains('is-message-empty') && (bubble.classList.contains('photo') || bubble.classList.contains('video'))) {\n bubble.classList.add('no-tail');\n\n if(!bubble.classList.contains('with-media-tail')) {\n bubble.classList.add('use-border-radius');\n }\n } */\n }\n\n if(isStandaloneMedia) {\n bubble.classList.add('just-media');\n }\n\n if(viewButton) {\n timeSpan.before(viewButton);\n // messageDiv.append(viewButton);\n }\n\n let savedFrom = '';\n\n // const needName = ((peerId.isAnyChat() && (peerId !== message.fromId || our)) && message.fromId !== rootScope.myId) || message.viaBotId;\n const needName = (message.fromId !== rootScope.myId && this.chat.isAnyGroup) || message.viaBotId || (message as Message.message).pFlags.sponsored;\n if(needName || fwdFrom || message.reply_to_mid || topicNameButtonContainer) { // chat\n let title: HTMLElement | DocumentFragment;\n let titleVia: typeof title;\n\n const isForwardFromChannel = message.from_id?._ === 'peerChannel' && message.fromId === fwdFromId;\n\n const mustHaveName = !!(message.viaBotId/* || topicNameButtonContainer */);\n const isHidden = fwdFrom && !fwdFrom.from_id;\n if(message.viaBotId) {\n titleVia = document.createElement('span');\n titleVia.innerText = '@' + (await this.managers.appPeersManager.getPeerUsername(message.viaBotId));\n titleVia.classList.add('peer-title');\n }\n\n if(mustHaveName) {\n bubble.classList.add('must-have-name');\n }\n\n const isForward = fwdFromId || fwdFrom;\n if(isHidden) {\n // /////this.log('message to render hidden', message);\n title = document.createElement('span');\n setInnerHTML(title, wrapEmojiText(fwdFrom.from_name));\n title.classList.add('peer-title');\n // title = fwdFrom.from_name;\n bubble.classList.add('hidden-profile');\n } else {\n title = new PeerTitle({peerId: fwdFromId || message.fromId, withPremiumIcon: !isForward, wrapOptions}).element;\n }\n\n let replyContainer: HTMLElement;\n if(\n isMessage &&\n message.reply_to_mid &&\n message.reply_to_mid !== this.chat.threadId &&\n (!this.chat.isAllMessagesForum || message.reply_to.reply_to_top_id)\n ) {\n replyContainer = await MessageRender.setReply({\n chat: this.chat,\n bubble,\n bubbleContainer,\n message\n });\n }\n\n // this.log(title);\n\n let nameDiv: HTMLElement;\n if(isForward) {\n if(this.peerId !== rootScope.myId && !isForwardFromChannel) {\n bubble.classList.add('forwarded');\n }\n\n if(message.savedFrom) {\n savedFrom = message.savedFrom;\n title.dataset.savedFrom = savedFrom;\n }\n\n nameDiv = document.createElement('div');\n title.dataset.peerId = '' + fwdFromId;\n\n if((this.peerId === rootScope.myId || this.peerId === REPLIES_PEER_ID || isForwardFromChannel) && !isStandaloneMedia) {\n nameDiv.style.color = getPeerColorById(fwdFromId, false);\n nameDiv.classList.add('colored-name');\n nameDiv.append(title);\n } else {\n /* const fromTitle = message.fromId === this.myID || appPeersManager.isBroadcast(fwdFromId || message.fromId) ? '' : `
${appPeersManager.getPeerTitle(message.fromId)}
`;\n nameDiv.innerHTML = fromTitle + 'Forwarded from ' + title; */\n const args: FormatterArguments = [title];\n if(isStandaloneMedia) {\n const br = document.createElement('br');\n br.classList.add('hide-ol');\n args.unshift(br);\n }\n nameDiv.append(i18n('ForwardedFrom', [args]));\n }\n } else if(!message.viaBotId) {\n if(!isStandaloneMedia && needName) {\n nameDiv = document.createElement('div');\n nameDiv.append(title);\n\n const peer = await this.managers.appPeersManager.getPeer(message.fromId);\n const pFlags = (peer as User.user)?.pFlags;\n if(pFlags && (pFlags.scam || pFlags.fake)) {\n nameDiv.append(generateFakeIcon(pFlags.scam));\n }\n\n if(!our) {\n nameDiv.style.color = getPeerColorById(message.fromId, false);\n nameDiv.classList.add('colored-name');\n }\n\n nameDiv.dataset.peerId = '' + message.fromId;\n } else /* if(!message.reply_to_mid) */ {\n bubble.classList.add('hide-name');\n }\n }\n\n if(message.viaBotId) {\n if(!nameDiv) {\n nameDiv = document.createElement('div');\n } else {\n nameDiv.append(' ');\n }\n\n const span = document.createElement('span');\n span.append(i18n('ViaBot'), ' ', titleVia);\n span.classList.add('is-via');\n\n nameDiv.append(span);\n }\n\n if(topicNameButtonContainer) {\n if(isStandaloneMedia) {\n topicNameButtonContainer.classList.add('floating-part');\n } else {\n if(!nameDiv) {\n nameDiv = document.createElement('div');\n }\n\n nameDiv.append(topicNameButtonContainer);\n\n bubble.classList.remove('hide-name');\n }\n }\n\n if(nameDiv) {\n nameDiv.classList.add('name');\n\n if(isStandaloneMedia) {\n nameContainer.append(nameContainer = document.createElement('div'));\n nameContainer.classList.add('name-with-reply', 'floating-part');\n } else {\n nameDiv.classList.add('floating-part');\n }\n\n nameContainer.append(nameDiv);\n\n if(isStandaloneMedia && replyContainer) {\n nameContainer.append(replyContainer);\n }\n } else if(isStandaloneMedia && replyContainer) {\n replyContainer.classList.add('floating-part');\n }\n\n if(topicNameButtonContainer && isStandaloneMedia) {\n if(!attachmentDiv) {\n this.log.error('no attachment div?', bubble, message);\n debugger;\n } else {\n attachmentDiv.after(topicNameButtonContainer);\n }\n }\n } else {\n bubble.classList.add('hide-name');\n }\n\n if(this.chat.type === 'pinned') {\n savedFrom = `${this.chat.peerId}_${message.mid}`;\n }\n\n const isThreadStarter = messageWithReplies && messageWithReplies.mid === this.chat.threadId;\n if(isThreadStarter) {\n bubble.classList.add('is-thread-starter', 'is-group-last');\n }\n\n if(savedFrom && (this.chat.type === 'pinned' || fwdFrom.saved_from_msg_id) && this.peerId !== REPLIES_PEER_ID) {\n const goto = document.createElement('div');\n goto.classList.add('bubble-beside-button', 'goto-original', 'tgico-arrow_next');\n bubbleContainer.append(goto);\n bubble.dataset.savedFrom = savedFrom;\n bubble.classList.add('with-beside-button');\n }\n\n bubble.classList.add(isOut ? 'is-out' : 'is-in');\n\n if(withReplies) {\n const isFooter = MessageRender.renderReplies({\n bubble,\n bubbleContainer,\n message: messageWithReplies,\n messageDiv,\n loadPromises,\n lazyLoadQueue: this.lazyLoadQueue\n });\n\n if(isFooter) {\n canHaveTail = true;\n } else {\n bubble.classList.add('with-beside-replies');\n }\n }\n\n if(isMessage) {\n this.appendReactionsElementToBubble(bubble, message, reactionsMessage);\n }\n\n /* if(isMessage) {\n const reactionHover = document.createElement('div');\n reactionHover.classList.add('bubble-reaction-hover');\n contentWrapper.append(reactionHover);\n } */\n\n if(canHaveTail) {\n bubble.classList.add('can-have-tail');\n\n bubbleContainer.append(generateTail());\n }\n\n return ret;\n }\n\n private appendReactionsElementToBubble(\n bubble: HTMLElement,\n message: Message.message,\n reactionsMessage: Message.message,\n changedResults?: ReactionCount[]\n ) {\n if(this.peerId.isUser() && USER_REACTIONS_INLINE/* || true */) {\n return;\n }\n\n if(!reactionsMessage?.reactions || !reactionsMessage.reactions.results.length) {\n return;\n }\n\n // message = this.appMessagesManager.getMessageWithReactions(message);\n\n const reactionsElement = new ReactionsElement();\n reactionsElement.init(reactionsMessage, 'block', bubble.middlewareHelper.get());\n reactionsElement.render(changedResults);\n\n if(bubble.classList.contains('is-message-empty')) {\n bubble.querySelector('.bubble-content-wrapper').append(reactionsElement);\n } else {\n const messageDiv = bubble.querySelector('.message');\n if(bubble.classList.contains('is-multiple-documents')) {\n const documentContainer = messageDiv.lastElementChild as HTMLElement;\n let documentMessageDiv = documentContainer.querySelector('.document-message');\n\n let timeSpan: HTMLElement = documentMessageDiv && documentMessageDiv.querySelector('.time');\n if(!timeSpan) {\n timeSpan = MessageRender.setTime({\n chatType: this.chat.type,\n message,\n reactionsMessage\n });\n }\n\n reactionsElement.append(timeSpan);\n\n if(!documentMessageDiv) {\n documentMessageDiv = document.createElement('div');\n documentMessageDiv.classList.add('document-message');\n documentContainer.querySelector('.document-wrapper').prepend(documentMessageDiv);\n }\n\n documentMessageDiv.append(reactionsElement);\n } else {\n const timeSpan = Array.from(bubble.querySelectorAll('.time')).pop();\n reactionsElement.append(timeSpan);\n\n messageDiv.append(reactionsElement);\n }\n }\n }\n\n private prepareToSaveScroll(reverse?: boolean) {\n const isMounted = !!this.chatInner.parentElement;\n if(!isMounted) {\n return {};\n }\n\n const log = this.log.bindPrefix('prepareToSaveScroll');\n log('save');\n const scrollSaver = this.createScrollSaver(reverse);\n scrollSaver.save(); // * let's save scroll position by point before the slicing, not after\n\n if(this.getRenderedLength() && !this.chat.setPeerPromise) {\n const viewportSlice = this.getViewportSlice();\n this.deleteViewportSlice(viewportSlice, true);\n }\n\n // scrollSaver.save(); // ! slicing will corrupt scroll position\n // const saved = scrollSaver.getSaved();\n // const hadScroll = saved.scrollHeight !== saved.clientHeight;\n\n return {\n restoreScroll: () => {\n log('restore');\n // scrollSaver.restore(_history.length === 1 && !reverse ? false : true);\n scrollSaver.restore(reverse);\n this.onRenderScrollSet(scrollSaver.getSaved());\n },\n scrollSaver\n };\n }\n\n public async performHistoryResult(\n historyResult: HistoryResult | {history: (Message.message | Message.messageService | number)[]},\n reverse: boolean\n ) {\n const log = false ? this.log.bindPrefix('perform-' + (Math.random() * 1000 | 0)) : undefined;\n log?.('start', this.chatInner.parentElement);\n\n let history = historyResult.history;\n history = history.slice(); // need\n\n if(this.needReflowScroll) {\n reflowScrollableElement(this.scrollable.container);\n this.needReflowScroll = false;\n }\n\n const cb = (message: Message.message | Message.messageService) => {\n if(!message) {\n return;\n } else if(message.pFlags.local) {\n return this.processLocalMessageRender(message);\n } else {\n return this.safeRenderMessage(message, reverse);\n }\n };\n\n const messages = await Promise.all(history.map((mid) => {\n return typeof(mid) === 'number' ? this.chat.getMessage(mid) : mid;\n }));\n\n const setLoadedPromises: Promise[] = [];\n if(!this.scrollable.loadedAll['bottom'] || !this.scrollable.loadedAll['top']) {\n let isEnd = (historyResult as HistoryResult).isEnd;\n if(!isEnd) {\n const historyStorage = await this.chat.getHistoryStorage();\n const firstSlice = historyStorage.history.first;\n const lastSlice = historyStorage.history.last;\n isEnd = {top: false, bottom: false, both: false};\n if(firstSlice.isEnd(SliceEnd.Bottom) && (!firstSlice.length || history.includes(firstSlice[0]))) {\n isEnd.bottom = true;\n }\n\n if(lastSlice.isEnd(SliceEnd.Top) && (!lastSlice.length || history.includes(lastSlice[lastSlice.length - 1]))) {\n isEnd.top = true;\n }\n }\n\n if(!isEnd.bottom && this.setPeerOptions) {\n const {lastMsgId, topMessage, savedPosition} = this.setPeerOptions;\n this.setPeerOptions = undefined;\n if((!lastMsgId && !savedPosition) || this.bubbles[topMessage] || lastMsgId === topMessage) {\n isEnd.bottom = true;\n }\n }\n\n if(isEnd.top) setLoadedPromises.push(this.setLoaded('top', true));\n if(isEnd.bottom) setLoadedPromises.push(this.setLoaded('bottom', true));\n }\n\n await Promise.all(setLoadedPromises);\n\n // ! it is important to insert bubbles to group reversed way\n // const length = history.length, promises: Promise[] = [];\n // if(reverse) for(let i = 0; i < length; ++i) promises.push(cb(messages[i]));\n // else for(let i = length - 1; i >= 0; --i) promises.push(cb(messages[i]));\n const promises = messages.map(cb);\n\n // cannot combine them into one promise\n await Promise.all(promises);\n await this.messagesQueuePromise;\n\n if(this.scrollable.loadedAll.top && this.messagesQueueOnRenderAdditional) {\n this.messagesQueueOnRenderAdditional();\n this.messagesQueueOnRenderAdditional?.(); // * can set it second time\n }\n\n log?.('performHistoryResult end');\n }\n\n private onRenderScrollSet(state?: {scrollHeight: number, clientHeight: number}) {\n const className = 'has-sticky-dates';\n if(!this.container.classList.contains(className)) {\n const isLoading = !this.preloader.detached;\n\n if(isLoading ||\n (\n state ??= {\n scrollHeight: this.scrollable.scrollHeight,\n clientHeight: this.scrollable.container.clientHeight\n },\n state.scrollHeight !== state.clientHeight\n )\n ) {\n /* for(const timestamp in this.dateMessages) {\n const dateMessage = this.dateMessages[timestamp];\n dateMessage.div.classList.add('is-sticky');\n } */\n\n const middleware = this.getMiddleware();\n const callback = () => {\n if(!middleware()) return;\n this.container.classList.add(className);\n };\n\n if(this.willScrollOnLoad) {\n callback();\n } else {\n setTimeout(callback, 600);\n }\n\n return;\n }\n }\n\n this.willScrollOnLoad = undefined;\n }\n\n public onDatePick = (timestamp: number) => {\n const peerId = this.peerId;\n this.managers.appMessagesManager.requestHistory(peerId, 0, 2, -1, timestamp, this.chat.threadId).then((history) => {\n if(!history?.messages?.length) {\n this.log.error('no history!');\n return;\n } else if(this.peerId !== peerId) {\n return;\n }\n\n this.chat.setMessageId((history.messages[0] as MyMessage).mid);\n // console.log('got history date:', history);\n });\n };\n\n public requestHistory(maxId: number, loadCount: number, backLimit: number) {\n // const middleware = this.getMiddleware();\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n return this.managers.acknowledged.appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit, this.chat.threadId);\n } else if(this.chat.type === 'pinned') {\n return this.managers.acknowledged.appMessagesManager.getSearch({\n peerId: this.peerId,\n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId,\n limit: loadCount,\n backLimit\n }).then((ackedResult) => {\n return {\n cached: ackedResult.cached,\n result: Promise.resolve(ackedResult.result).then((value) => {\n return {history: value.history.map((m) => m.mid)};\n })\n };\n });\n } else if(this.chat.type === 'scheduled') {\n return this.managers.acknowledged.appMessagesManager.getScheduledMessages(this.peerId).then((ackedResult) => {\n // this.setLoaded('top', true);\n // this.setLoaded('bottom', true);\n return {\n cached: ackedResult.cached,\n result: Promise.resolve(ackedResult.result).then((mids) => ({history: mids.slice().reverse()}))\n };\n });\n }\n }\n\n private async animateAsLadder(additionMsgId: number, additionMsgIds: number[], isAdditionRender: boolean, backLimit: number, maxId: number) {\n /* const middleware = this.getMiddleware();\n await this.ladderDeferred; */\n\n const log = this.log.bindPrefix('ladder');\n if(this.chat.setPeerPromise && !this.resolveLadderAnimation) {\n log.warn('will be delayed');\n // @ts-ignore\n this.resolveLadderAnimation = this.animateAsLadder.bind(this, additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\n return;\n }\n\n /* if(!middleware()) {\n return;\n } */\n\n if(!Object.keys(this.bubbles).length) {\n log.warn('no bubbles');\n return;\n }\n\n let sortedMids = getObjectKeysAndSort(this.bubbles, 'desc');\n\n if(isAdditionRender && additionMsgIds.length) {\n sortedMids = sortedMids.filter((mid) => !additionMsgIds.includes(mid));\n }\n\n let targetMid: number;\n if(backLimit) {\n targetMid = maxId || Math.max(...sortedMids); // * on discussion enter\n } else {\n if(additionMsgId) {\n targetMid = additionMsgId;\n } else { // * if maxId === 0\n targetMid = Math.max(...sortedMids);\n }\n }\n\n const topIds = sortedMids.slice(sortedMids.findIndex((mid) => targetMid > mid));\n const middleIds = isAdditionRender ? [] : [targetMid];\n const bottomIds = isAdditionRender ? [] : sortedMids.slice(0, sortedMids.findIndex((mid) => targetMid >= mid)).reverse();\n\n if(DEBUG) {\n log('targeting mid:', targetMid, maxId, additionMsgId,\n topIds.map((m) => getServerMessageId(m)),\n bottomIds.map((m) => getServerMessageId(m)));\n }\n\n const setBubbles: HTMLElement[] = [];\n\n this.chatInner.classList.add('zoom-fading');\n const delay = isAdditionRender ? 10 : 40;\n const offsetIndex = isAdditionRender ? 0 : 1;\n const animateAsLadder = (mids: number[], offsetIndex = 0) => {\n const animationPromise = deferredPromise();\n let lastMsDelay = 0;\n mids.forEach((mid, idx) => {\n const bubble = this.bubbles[mid];\n if(!bubble || this.skippedMids.has(mid)) {\n log.warn('no bubble by mid:', mid);\n return;\n }\n\n lastMsDelay = ((idx + offsetIndex) || 0.1) * delay;\n // lastMsDelay = (idx + offsetIndex) * delay;\n // lastMsDelay = (idx || 0.1) * 1000;\n\n const contentWrapper = bubble.lastElementChild as HTMLElement;\n const elementsToAnimate: HTMLElement[] = [contentWrapper];\n const item = this.bubbleGroups.getItemByBubble(bubble);\n if(item && item.group.avatar && item.group.lastItem === item) {\n elementsToAnimate.push(item.group.avatar);\n }\n\n elementsToAnimate.forEach((element) => {\n element.classList.add('zoom-fade', 'can-zoom-fade');\n element.style.transitionDelay = lastMsDelay + 'ms';\n });\n\n if(idx === (mids.length - 1)) {\n const onTransitionEnd = (e: TransitionEvent) => {\n if(e.target !== contentWrapper) {\n return;\n }\n\n animationPromise.resolve();\n contentWrapper.removeEventListener('transitionend', onTransitionEnd);\n };\n\n contentWrapper.addEventListener('transitionend', onTransitionEnd);\n }\n\n setBubbles.push(...elementsToAnimate);\n });\n\n if(!mids.length) {\n animationPromise.resolve();\n }\n\n return {lastMsDelay, animationPromise};\n };\n\n const topRes = animateAsLadder(topIds, offsetIndex);\n const middleRes = animateAsLadder(middleIds);\n const bottomRes = animateAsLadder(bottomIds, offsetIndex);\n const promises = [topRes.animationPromise, middleRes.animationPromise, bottomRes.animationPromise];\n const delays: number[] = [topRes.lastMsDelay, middleRes.lastMsDelay, bottomRes.lastMsDelay];\n\n if(this.onAnimateLadder) {\n await this.onAnimateLadder();\n }\n\n fastRaf(() => {\n this.setStickyDateManually(); // ! maybe it's not efficient\n\n setBubbles.forEach((element) => {\n element.classList.remove('zoom-fade');\n });\n });\n\n let promise: Promise;\n if(topIds.length || middleIds.length || bottomIds.length) {\n promise = Promise.all(promises);\n\n dispatchHeavyAnimationEvent(promise, Math.max(...delays) + 200) // * 200 - transition time\n .then(() => {\n fastRaf(() => {\n setBubbles.forEach((element) => {\n element.style.transitionDelay = '';\n element.classList.remove('can-zoom-fade');\n });\n\n this.chatInner.classList.remove('zoom-fading');\n });\n\n // ! в хроме, каким-то образом из-за zoom-fade класса начинает прыгать скролл при подгрузке сообщений вверх,\n // ! т.е. скролл не ставится, так же, как в сафари при translateZ на блок выше scrollable\n // if(!IS_SAFARI) {\n // this.needReflowScroll = true;\n // }\n });\n }\n\n return promise;\n }\n\n private async renderEmptyPlaceholder(\n type: 'group' | 'saved' | 'noMessages' | 'noScheduledMessages' | 'greeting' | 'restricted',\n bubble: HTMLElement,\n message: any,\n elements: (Node | string)[]\n ) {\n const BASE_CLASS = 'empty-bubble-placeholder';\n bubble.classList.add(BASE_CLASS, BASE_CLASS + '-' + type);\n\n let title: HTMLElement;\n if(type === 'group') title = i18n('GroupEmptyTitle1');\n else if(type === 'saved') title = i18n('ChatYourSelfTitle');\n else if(type === 'noMessages' || type === 'greeting') title = i18n('NoMessages');\n else if(type === 'noScheduledMessages') title = i18n('NoScheduledMessages');\n else if(type === 'restricted') {\n title = document.createElement('span');\n title.innerText = await this.managers.appPeersManager.getRestrictionReasonText(this.peerId);\n }\n title.classList.add('center', BASE_CLASS + '-title');\n\n elements.push(title);\n\n let listElements: HTMLElement[];\n if(type === 'group') {\n elements.push(i18n('GroupEmptyTitle2'));\n listElements = [\n i18n('GroupDescription1'),\n i18n('GroupDescription2'),\n i18n('GroupDescription3'),\n i18n('GroupDescription4')\n ];\n } else if(type === 'saved') {\n listElements = [\n i18n('ChatYourSelfDescription1'),\n i18n('ChatYourSelfDescription2'),\n i18n('ChatYourSelfDescription3'),\n i18n('ChatYourSelfDescription4')\n ];\n } else if(type === 'greeting') {\n const subtitle = i18n('NoMessagesGreetingsDescription');\n subtitle.classList.add('center', BASE_CLASS + '-subtitle');\n\n // findAndSplice(this.messagesQueue, q => q.bubble === bubble);\n\n const stickerDiv = document.createElement('div');\n stickerDiv.classList.add(BASE_CLASS + '-sticker');\n\n const middleware = this.getMiddleware();\n\n await this.managers.appStickersManager.getGreetingSticker().then(async(doc) => {\n if(!middleware()) return;\n\n const loadPromises: Promise[] = [];\n await wrapSticker({\n doc,\n // doc: appDocsManager.getDoc(\"5431607541660389336\"), // cubigator mockup\n div: stickerDiv,\n middleware,\n lazyLoadQueue: this.lazyLoadQueue,\n group: this.chat.animationGroup,\n // play: !!message.pending || !multipleRender,\n play: true,\n loop: true,\n withThumb: true,\n loadPromises\n });\n\n attachClickEvent(stickerDiv, (e) => {\n cancelEvent(e);\n EmoticonsDropdown.onMediaClick({target: e.target});\n });\n\n return Promise.all(loadPromises);\n });\n\n // this.renderMessagesQueue({\n // message,\n // bubble,\n // reverse: false,\n // promises: [loadPromise]\n // });\n\n elements.push(subtitle, stickerDiv);\n }\n\n if(listElements) {\n elements.push(\n ...listElements.map((elem) => {\n const span = document.createElement('span');\n span.classList.add(BASE_CLASS + '-list-item');\n span.append(elem);\n return span;\n })\n );\n\n if(type === 'group') {\n listElements.forEach((elem) => {\n const i = document.createElement('span');\n i.classList.add('tgico-check');\n elem.prepend(i);\n });\n } else if(type === 'saved') {\n listElements.forEach((elem) => {\n const i = document.createElement('span');\n i.classList.add(BASE_CLASS + '-list-bullet');\n i.innerText = '•';\n elem.prepend(i);\n });\n }\n }\n\n if(elements.length > 1) {\n bubble.classList.add('has-description');\n }\n\n elements.forEach((element: any) => element.classList.add(BASE_CLASS + '-line'));\n }\n\n private async processLocalMessageRender(\n message: Message.message | Message.messageService,\n animate?: boolean,\n middleware = this.getMiddleware()\n ) {\n const isSponsored = !!(message as Message.message).pFlags.sponsored;\n const m = middlewarePromise(middleware);\n\n const p: Parameters[4] = async(result) => {\n const {bubble} = await m(result);\n if(!bubble) {\n return result;\n }\n\n (bubble as any).message = message;\n\n bubble.classList.add('is-group-last', 'is-group-first');\n\n const updatePosition = () => {\n if(this.updatePlaceholderPosition === updatePosition) {\n this.updatePlaceholderPosition = undefined;\n }\n\n appendTo[method](bubble);\n };\n\n if(!isSponsored) {\n bubble.classList.add('bubble-first');\n bubble.classList.remove('can-have-tail', 'is-in');\n }\n\n const elements: (Node | string)[] = [];\n const isBot = this.chat.isBot;\n let renderPromise: Promise, appendTo = this.container, method: 'append' | 'prepend' = 'append';\n if(this.chat.isRestricted) {\n renderPromise = this.renderEmptyPlaceholder('restricted', bubble, message, elements);\n } else if(isSponsored) {\n let text: LangPackKey, mid: number, startParam: string, callback: () => void;\n\n bubble.classList.add('avoid-selection');\n bubble.style.order = '999999';\n\n const sponsoredMessage = this.sponsoredMessage = (message as Message.message).sponsoredMessage;\n const peerId = getPeerId(sponsoredMessage.from_id);\n // const peer = this.appPeersManager.getPeer(peerId);\n if(sponsoredMessage.channel_post) {\n text = 'OpenChannelPost';\n mid = generateMessageId(sponsoredMessage.channel_post);\n } else if(sponsoredMessage.start_param || isBot) {\n text = 'Chat.Message.ViewBot';\n startParam = sponsoredMessage.start_param;\n } else {\n text = await this.managers.appPeersManager.isAnyGroup(peerId) ? 'Chat.Message.ViewGroup' : 'Chat.Message.ViewChannel';\n }\n\n if(sponsoredMessage.chat_invite) {\n callback = () => {\n new PopupJoinChatInvite(sponsoredMessage.chat_invite_hash, sponsoredMessage.chat_invite as ChatInvite.chatInvite);\n };\n } else if(sponsoredMessage.chat_invite_hash) {\n callback = () => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: sponsoredMessage.chat_invite_hash\n };\n\n this.chat.appImManager.processInternalLink(link);\n };\n } else {\n callback = () => {\n this.chat.appImManager.setInnerPeer({\n peerId,\n lastMsgId: mid,\n startParam\n });\n };\n }\n\n const button = this.makeViewButton({text});\n\n this.observer.observe(button, this.viewsObserverCallback);\n\n if(callback) {\n attachClickEvent(button, callback);\n }\n\n bubble.querySelector('.bubble-content').prepend(button);\n\n appendTo = this.chatInner;\n method = 'append';\n animate = false;\n\n // return result;\n } else if(isBot && message._ === 'message') {\n const b = document.createElement('b');\n b.append(i18n('BotInfoTitle'));\n elements.push(b, '\\n\\n');\n appendTo = this.chatInner;\n method = 'prepend';\n } else if(this.chat.isAnyGroup && ((await m(this.managers.appPeersManager.getPeer(this.peerId))) as MTChat.chat).pFlags.creator) {\n renderPromise = this.renderEmptyPlaceholder('group', bubble, message, elements);\n } else if(this.chat.type === 'scheduled') {\n renderPromise = this.renderEmptyPlaceholder('noScheduledMessages', bubble, message, elements);\n } else if(rootScope.myId === this.peerId) {\n renderPromise = this.renderEmptyPlaceholder('saved', bubble, message, elements);\n } else if(this.peerId.isUser() && !isBot && await m(this.chat.canSend()) && this.chat.type === 'chat') {\n renderPromise = this.renderEmptyPlaceholder('greeting', bubble, message, elements);\n } else {\n renderPromise = this.renderEmptyPlaceholder('noMessages', bubble, message, elements);\n }\n\n if(renderPromise) {\n await renderPromise;\n }\n\n if(elements.length) {\n const messageDiv = bubble.querySelector('.message, .service-msg');\n messageDiv.prepend(...elements);\n }\n\n const isWaitingForAnimation = !!this.messagesQueueOnRenderAdditional;\n const noTransition = this.setPeerCached && !isWaitingForAnimation;\n if(noTransition) {\n const setOn = bubble.firstElementChild;\n setOn.classList.add('no-transition');\n\n if(this.chat.setPeerPromise) {\n this.chat.setPeerPromise.catch(noop).finally(() => {\n setOn.classList.remove('no-transition');\n });\n }\n }\n\n if(animate === undefined && !noTransition) {\n animate = true;\n }\n\n if(isWaitingForAnimation || animate) {\n this.updatePlaceholderPosition = updatePosition;\n\n this.onAnimateLadder = () => {\n // appendTo[method](bubble);\n this.onAnimateLadder = undefined;\n\n // need raf here because animation won't fire if this message is single\n if(!this.messagesQueuePromise) {\n return fastRafPromise();\n }\n };\n } else if(this.chat.setPeerPromise) {\n this.attachPlaceholderOnRender = () => {\n this.attachPlaceholderOnRender = undefined;\n updatePosition();\n // appendTo[method](bubble);\n };\n } else {\n this.updatePlaceholderPosition = updatePosition;\n // appendTo[method](bubble);\n }\n\n if(!isWaitingForAnimation && animate) {\n await m(getHeavyAnimationPromise());\n const additionMsgIds = getObjectKeysAndSort(this.bubbles);\n indexOfAndSplice(additionMsgIds, message.mid);\n this.animateAsLadder(message.mid, additionMsgIds, false, 0, 0);\n }\n\n bubble.middlewareHelper.onDestroy(() => {\n if(this.emptyPlaceholderBubble === bubble) {\n this.emptyPlaceholderBubble = undefined;\n }\n });\n\n this.emptyPlaceholderBubble = bubble;\n\n return result;\n };\n\n return this.safeRenderMessage(\n message,\n !isSponsored,\n undefined,\n false,\n p\n );\n }\n\n private makeViewButton[1]>(options: T) {\n return Button('btn-primary btn-primary-transparent bubble-view-button', options);\n }\n\n private generateLocalMessageId(addOffset = 0) {\n // const INCREMENT = 0x10;\n const offset = (this.chat.type === 'scheduled' ? -1 : 0) + addOffset;\n // offset = generateMessageId(offset);\n // id: -Math.abs(+this.peerId * INCREMENT + offset),\n const id = -Math.abs(offset);\n const mid = -Math.abs(generateMessageId(id));\n return {id, mid};\n }\n\n private async generateLocalFirstMessage(service?: T, fill?: (message: GenerateLocalMessageType) => void, addOffset = 0): Promise> {\n const {id, mid} = this.generateLocalMessageId(addOffset);\n let message: Omit & {message?: string} = {\n _: service ? 'messageService' : 'message',\n date: 0,\n id,\n mid,\n peer_id: await this.managers.appPeersManager.getOutputPeer(this.peerId),\n pFlags: {\n local: true\n }\n };\n\n if(!service) {\n message.message = '';\n }/* else {\n (message as Message.messageService).action = {} as any;\n } */\n\n assumeType>(message);\n\n fill && fill(message);\n\n const savedMessages = await this.managers.appMessagesManager.saveMessages([message], {storage: new Map() as any});\n message = savedMessages[0];\n message.mid = mid;\n return message as any;\n }\n\n public getViewportSlice() {\n // this.log.trace('viewport slice');\n return getViewportSlice({\n overflowElement: this.scrollable.container,\n selector: '.bubbles-date-group .bubble:not(.is-date)',\n extraSize: Math.max(700, windowSize.height) * 2\n });\n }\n\n public deleteViewportSlice(slice: ReturnType, ignoreScrollSaving?: boolean) {\n if(DO_NOT_SLICE_VIEWPORT_ON_RENDER) {\n return;\n }\n\n const {invisibleTop, invisibleBottom} = slice;\n const invisible = invisibleTop.concat(invisibleBottom);\n if(!invisible.length) {\n return;\n }\n\n if(invisibleTop.length) {\n this.setLoaded('top', false);\n this.getHistoryTopPromise = undefined;\n }\n\n if(invisibleBottom.length) {\n this.setLoaded('bottom', false);\n this.getHistoryBottomPromise = undefined;\n }\n\n const mids = invisible.map(({element}) => +element.dataset.mid);\n\n let scrollSaver: ScrollSaver;\n if(/* !!invisibleTop.length !== !!invisibleBottom.length && */!ignoreScrollSaving) {\n scrollSaver = this.createScrollSaver(!!invisibleTop.length);\n scrollSaver.save();\n }\n\n this.deleteMessagesByIds(mids, false, true);\n\n if(scrollSaver) {\n scrollSaver.restore();\n } else if(invisibleTop.length) {\n this.scrollable.lastScrollPosition = this.scrollable.scrollTop;\n }\n }\n\n public sliceViewport(ignoreHeavyAnimation?: boolean) {\n // Safari cannot reset the scroll.\n if(IS_SAFARI || (this.isHeavyAnimationInProgress && !ignoreHeavyAnimation) || DO_NOT_SLICE_VIEWPORT) {\n return;\n }\n\n // const scrollSaver = new ScrollSaver(this.scrollable, true);\n // scrollSaver.save();\n const slice = this.getViewportSlice();\n // if(IS_SAFARI) slice.invisibleTop = [];\n this.deleteViewportSlice(slice);\n // scrollSaver.restore();\n }\n\n private async setLoaded(side: SliceSides, value: boolean, checkPlaceholders = true) {\n const willChange = this.scrollable.loadedAll[side] !== value;\n if(!willChange) {\n return;\n }\n\n const log = this.log.bindPrefix('setLoaded');\n log('change', side, value);\n\n this.scrollable.loadedAll[side] = value;\n this.scrollable.onScroll(); // ! WARNING\n // return;\n\n if(!checkPlaceholders) {\n return;\n }\n\n if(!this.chat.isRestricted) {\n if(side === 'bottom' && this.chat.isBroadcast/* && false */) {\n this.toggleSponsoredMessage(value);\n }\n\n if(side === 'top' && value && this.chat.isBot) {\n return this.renderBotPlaceholder();\n }\n }\n\n return this.checkIfEmptyPlaceholderNeeded();\n }\n\n private async toggleSponsoredMessage(value: boolean) {\n const log = this.log.bindPrefix('sponsored');\n log('checking');\n const {mid} = this.generateLocalMessageId(SPONSORED_MESSAGE_ID_OFFSET);\n if(value) {\n const middleware = this.getMiddleware(() => {\n return this.scrollable.loadedAll.bottom && this.getSponsoredMessagePromise === promise;\n });\n\n const promise = this.getSponsoredMessagePromise = this.managers.appChatsManager.getSponsoredMessage(this.peerId.toChatId())\n .then(async(sponsoredMessages) => {\n if(!middleware() || sponsoredMessages._ === 'messages.sponsoredMessagesEmpty') {\n return;\n }\n\n const sponsoredMessage = sponsoredMessages.messages[0];\n if(!sponsoredMessage) {\n log('no message');\n return;\n }\n\n const messagePromise = this.generateLocalFirstMessage(false, (message) => {\n message.message = sponsoredMessage.message;\n message.from_id = sponsoredMessage.from_id;\n message.entities = sponsoredMessage.entities;\n message.pFlags.sponsored = true;\n message.sponsoredMessage = sponsoredMessage;\n }, SPONSORED_MESSAGE_ID_OFFSET);\n\n return Promise.all([\n messagePromise,\n this.getHistoryTopPromise, // wait for top load and execute rendering after or with it\n this.messagesQueuePromise\n ]).then(([message]) => {\n if(!middleware()) return;\n // this.processLocalMessageRender(message);\n log('rendering', message);\n return this.performHistoryResult({history: [message]}, false);\n });\n }).finally(() => {\n if(this.getSponsoredMessagePromise === promise) {\n this.getSponsoredMessagePromise = undefined;\n }\n });\n } else {\n log('clearing rendered', mid);\n this.getSponsoredMessagePromise = undefined;\n this.deleteMessagesByIds([mid]);\n }\n }\n\n private async renderBotPlaceholder() {\n const _log = this.log.bindPrefix('bot placeholder');\n\n const middleware = this.getMiddleware();\n const result = await this.managers.acknowledged.appProfileManager.getProfile(this.peerId.toUserId());\n _log('getting profile, cached:', result.cached);\n const processPromise = result.result.then(async(userFull) => {\n if(!middleware()) {\n return;\n }\n\n if(!userFull.bot_info?.description) {\n _log.warn('no description');\n return this.checkIfEmptyPlaceholderNeeded();\n }\n\n const message = await this.generateLocalFirstMessage(false, (message) => {\n const botInfo = userFull.bot_info;\n message.message = botInfo.description;\n if(botInfo.description_document) message.media = {_: 'messageMediaDocument', document: botInfo.description_document, pFlags: {}};\n if(botInfo.description_photo) message.media = {_: 'messageMediaPhoto', photo: botInfo.description_photo, pFlags: {}};\n });\n\n if(!middleware()) {\n return;\n }\n\n _log('rendering');\n const renderPromise = this.processLocalMessageRender(message, !result.cached).then(() => {\n _log('done');\n });\n\n return {renderPromise};\n });\n\n if(!result.cached) {\n return;\n }\n\n return processPromise;\n }\n\n public async checkIfEmptyPlaceholderNeeded() {\n if(this.scrollable.loadedAll.top &&\n this.scrollable.loadedAll.bottom &&\n this.emptyPlaceholderBubble === undefined &&\n (\n this.chat.isRestricted ||\n !(await this.chat.getHistoryStorage()).count ||\n (\n // !Object.keys(this.bubbles).length ||\n // ! WARNING ! ! ! ! ! ! REPLACE LINE ABOVE WITH THESE\n Object.keys(this.bubbles).length &&\n !this.getRenderedLength()\n ) ||\n (this.chat.type === 'scheduled' && !Object.keys(this.bubbles).length)\n )\n ) {\n this.log('inject empty peer placeholder');\n\n const message = await this.generateLocalFirstMessage(true);\n return {renderPromise: this.processLocalMessageRender(message)};\n }\n }\n\n public getHistory1(maxId?: number, reverse?: boolean, isBackLimit?: boolean, additionMsgId?: number, justLoad?: boolean) {\n const middleware = this.getMiddleware(justLoad ? undefined : () => {\n return (reverse ? this.getHistoryTopPromise : this.getHistoryBottomPromise) === waitPromise;\n });\n\n const result = this.getHistory(maxId, reverse, isBackLimit, additionMsgId, justLoad, middleware);\n const waitPromise = result.then((res) => res && (res.waitPromise || res.promise));\n\n (reverse ? this.getHistoryTopPromise = waitPromise : this.getHistoryBottomPromise = waitPromise);\n waitPromise.then(() => {\n if(!middleware()) {\n return;\n }\n\n (reverse ? this.getHistoryTopPromise = undefined : this.getHistoryBottomPromise = undefined);\n\n if(!justLoad) {\n // preload more\n // if(!isFirstMessageRender) {\n if(this.chat.type === 'chat'/* || this.chat.type === 'discussion' */) {\n /* const storage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);\n const isMaxIdInHistory = storage.history.indexOf(maxId) !== -1;\n if(isMaxIdInHistory || true) { // * otherwise it is a search or jump */\n setTimeout(() => {\n if(reverse) {\n this.loadMoreHistory(true, true);\n } else {\n this.loadMoreHistory(false, true);\n }\n }, 0);\n // }\n }\n // }\n\n // this.scrollable.onScroll();\n }\n });\n\n return result;\n }\n\n /**\n * Load and render history\n * @param maxId max message id\n * @param reverse 'true' means up\n * @param isBackLimit is search\n * @param additionMsgId for the last message\n * @param justLoad do not render\n */\n public async getHistory(\n maxId = 0,\n reverse = false,\n isBackLimit = false,\n additionMsgId = 0,\n justLoad = false,\n middleware?: () => boolean\n ): Promise<{cached: boolean, promise: Promise, waitPromise: Promise}> {\n const peerId = this.peerId;\n\n const isBroadcast = this.chat.isBroadcast;\n // console.time('appImManager call getHistory');\n const pageCount = Math.min(30, windowSize.height / 40/* * 1.25 */ | 0);\n // const loadCount = Object.keys(this.bubbles).length > 0 ? 50 : pageCount;\n const realLoadCount = isBroadcast ? 20 : (Object.keys(this.bubbles).length > 0 ? Math.max(35, pageCount) : pageCount);\n // const realLoadCount = pageCount;//const realLoadCount = 50;\n let loadCount = realLoadCount;\n\n /* if(TEST_SCROLL) {\n //loadCount = 1;\n if(Object.keys(this.bubbles).length > 0)\n return {cached: false, promise: Promise.resolve(true)};\n } */\n if(TEST_SCROLL !== undefined) {\n if(TEST_SCROLL) {\n if(Object.keys(this.bubbles).length > 0) {\n --TEST_SCROLL;\n }\n } else {\n return {cached: false, promise: Promise.resolve(), waitPromise: Promise.resolve()};\n }\n }\n\n // //console.time('render history total');\n\n let backLimit = 0;\n if(isBackLimit) {\n backLimit = loadCount;\n\n if(!reverse) { // if not jump\n loadCount = 0;\n // maxId = this.appMessagesManager.incrementMessageId(maxId, 1);\n }\n }\n\n let additionMsgIds: number[];\n if(additionMsgId && !isBackLimit) {\n if(this.chat.type === 'pinned') {\n additionMsgIds = [additionMsgId];\n } else {\n const historyStorage = await this.chat.getHistoryStorage();\n const slice = historyStorage.history.slice;\n if(slice.length < loadCount && !slice.isEnd(SliceEnd.Both)) {\n additionMsgIds = slice.slice();\n\n // * filter last album, because we don't know is it the last item\n for(let i = additionMsgIds.length - 1; i >= 0; --i) {\n const message = await this.chat.getMessage(additionMsgIds[i]);\n if((message as Message.message)?.grouped_id) additionMsgIds.splice(i, 1);\n else break;\n }\n\n maxId = additionMsgIds[additionMsgIds.length - 1] || maxId;\n }\n }\n }\n\n /* const result = additionMsgID ?\n {history: [additionMsgID]} :\n appMessagesManager.getHistory(this.peerId, maxId, loadCount, backLimit); */\n let result: AckedResult = await this.requestHistory(maxId, loadCount, backLimit) as any;\n let resultPromise: typeof result['result'];\n\n this.log('i vin brehnya', result, maxId, loadCount, backLimit);\n\n // const isFirstMessageRender = !!additionMsgID && result.cached && !appMessagesManager.getMessage(additionMsgID).grouped_id;\n const isAdditionRender = additionMsgIds?.length && !result.cached;\n const isFirstMessageRender = (this.isFirstLoad && backLimit && !result.cached) || isAdditionRender;\n if(isAdditionRender) {\n resultPromise = result.result;\n\n result = {\n cached: true,\n result: Promise.resolve({history: additionMsgIds})\n };\n\n // additionMsgID = 0;\n }\n\n this.isFirstLoad = false;\n\n const processResult = async(historyResult: Awaited) => {\n if((historyResult as HistoryResult).isEnd?.top) {\n if(this.chat.type === 'discussion') { // * inject discussion start\n const serviceStartMessageId = await this.managers.appMessagesManager.getThreadServiceMessageId(this.peerId, this.chat.threadId);\n if(serviceStartMessageId) historyResult.history.push(serviceStartMessageId);\n const mids = await this.chat.getMidsByMid(this.chat.threadId);\n historyResult.history.push(...mids.reverse());\n }\n\n // synchronize bot placeholder appearance\n await this.managers.appProfileManager.getProfileByPeerId(peerId);\n\n // await this.setLoaded('top', true);\n }\n };\n\n const sup = (historyResult: Awaited) => {\n return getHeavyAnimationPromise().then(() => {\n return processResult(historyResult);\n }).then(() => {\n if(!isAdditionRender && additionMsgId) {\n historyResult.history.unshift(additionMsgId);\n }\n\n return this.performHistoryResult(historyResult, reverse);\n });\n };\n\n const processPromise = (_promise: typeof result['result']) => {\n const promise = Promise.resolve(_promise).then((result) => {\n if(middleware && !middleware()) {\n throw PEER_CHANGED_ERROR;\n }\n\n if(justLoad) {\n // нужно делать из-за ранней прогрузки\n this.scrollable.onScroll();\n // fastRaf(() => {\n // this.scrollable.checkForTriggers();\n // });\n return;\n }\n\n return sup(result);\n }, (err) => {\n this.log.error('getHistory error:', err);\n throw err;\n });\n\n return promise;\n };\n\n let promise: Promise, cached: boolean;\n if(!result.cached) {\n cached = false;\n promise = processPromise(result.result);\n } else if(justLoad) {\n // нужно делать из-за ранней прогрузки\n this.scrollable.onScroll();\n return null;\n } else {\n cached = true;\n promise = sup(await result.result);\n }\n\n const waitPromise = isAdditionRender ? processPromise(resultPromise) : promise;\n\n if(isFirstMessageRender && rootScope.settings.animationsEnabled/* && false */) {\n let times = isAdditionRender ? 2 : 1;\n this.messagesQueueOnRenderAdditional = () => {\n this.log('messagesQueueOnRenderAdditional');\n\n if(--times) return;\n\n this.messagesQueueOnRenderAdditional = undefined;\n\n const promise = this.animateAsLadder(additionMsgId, additionMsgIds, isAdditionRender, backLimit, maxId);\n promise.then(() => {\n setTimeout(() => { // preload messages\n this.loadMoreHistory(reverse, true);\n }, 0);\n });\n };\n } else {\n this.messagesQueueOnRenderAdditional = undefined;\n }\n\n if(justLoad) {\n return null;\n }\n\n return {cached, promise, waitPromise};\n }\n\n public async setUnreadDelimiter() {\n if(!(this.chat.type === 'chat' || this.chat.type === 'discussion')) {\n return;\n }\n\n if(this.attachedUnreadBubble) {\n return;\n }\n\n const historyMaxId = await this.chat.getHistoryMaxId();\n let readMaxId = await this.managers.appMessagesManager.getReadMaxIdIfUnread(this.peerId, this.chat.threadId);\n if(!readMaxId) return;\n\n readMaxId = Object.keys(this.bubbles)\n .filter((mid) => !this.bubbles[mid].classList.contains('is-out'))\n .map((i) => +i)\n .sort((a, b) => a - b)\n .find((i) => i > readMaxId);\n\n if(readMaxId && this.bubbles[readMaxId]) {\n const bubble = this.bubbles[readMaxId];\n if(this.firstUnreadBubble && this.firstUnreadBubble !== bubble) {\n this.firstUnreadBubble.classList.remove('is-first-unread');\n this.firstUnreadBubble = null;\n }\n\n if(readMaxId !== historyMaxId) {\n bubble.classList.add('is-first-unread');\n }\n\n this.firstUnreadBubble = bubble;\n this.attachedUnreadBubble = true;\n }\n }\n\n public deleteEmptyDateGroups() {\n const mustBeCount = this.stickyIntersector ? STICKY_OFFSET : 1;\n let deleted = false;\n for(const i in this.dateMessages) {\n const dateMessage = this.dateMessages[i];\n\n if(dateMessage.container.childElementCount === mustBeCount) { // only date div + sentinel div\n dateMessage.container.remove();\n if(this.stickyIntersector) {\n this.stickyIntersector.unobserve(dateMessage.container, dateMessage.div);\n }\n delete this.dateMessages[i];\n deleted = true;\n\n // * no sense in it\n /* if(dateMessage.div === this.previousStickyDate) {\n this.previousStickyDate = undefined;\n } */\n }\n }\n\n if(!deleted) {\n return;\n }\n\n if(!Object.keys(this.dateMessages).length) {\n this.container.classList.remove('has-groups');\n }\n\n this.checkIfEmptyPlaceholderNeeded();\n this.setStickyDateManually();\n }\n}\n\nexport function generateTail() {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttributeNS(null, 'viewBox', '0 0 11 20');\n svg.setAttributeNS(null, 'width', '11');\n svg.setAttributeNS(null, 'height', '20');\n svg.classList.add('bubble-tail');\n\n const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n use.setAttributeNS(null, 'href', '#message-tail-filled');\n\n svg.append(use);\n\n return svg;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {copyTextToClipboard} from '../clipboard';\n// import SelectionSaver from \"../selectionSaver\";\n// import selectElementContents from \"./selectElementContents\";\n\nexport default function copyFromElement(element: HTMLElement) {\n copyTextToClipboard(element.textContent);\n // const saver = new SelectionSaver();\n // saver.save();\n // selectElementContents(element);\n // document.execCommand('copy');\n // saver.restore();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {MediaSizeType} from '../../helpers/mediaSizes';\nimport {Message} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {MediaSearchContext} from '../appMediaPlaybackController';\nimport Chat from '../chat/chat';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport wrapDocument from './document';\n\nexport default async function wrapGroupedDocuments({albumMustBeRenderedFull, message, bubble, messageDiv, chat, loadPromises, autoDownloadSize, lazyLoadQueue, searchContext, useSearch, sizeType, managers, fontWeight, fontSize, richTextFragment}: {\n albumMustBeRenderedFull: boolean,\n message: any,\n messageDiv: HTMLElement,\n bubble: HTMLElement,\n uploading?: boolean,\n chat: Chat,\n loadPromises?: Promise[],\n autoDownloadSize?: number,\n lazyLoadQueue?: LazyLoadQueue,\n searchContext?: MediaSearchContext,\n useSearch?: boolean,\n sizeType?: MediaSizeType,\n managers?: AppManagers,\n fontWeight?: number,\n fontSize?: number,\n richTextFragment?: DocumentFragment\n}) {\n let nameContainer: HTMLElement;\n const mids = albumMustBeRenderedFull ? await chat.getMidsByMid(message.mid) : [message.mid];\n /* if(isPending) {\n mids.reverse();\n } */\n\n const promises = mids.map(async(mid, idx) => {\n const message = (await chat.getMessage(mid)) as Message.message;\n const div = await wrapDocument({\n message,\n loadPromises,\n autoDownloadSize,\n lazyLoadQueue,\n searchContext,\n sizeType,\n managers,\n fontWeight,\n fontSize\n });\n\n const container = document.createElement('div');\n container.classList.add('document-container');\n container.dataset.mid = '' + mid;\n container.dataset.peerId = '' + message.peerId;\n\n const wrapper = document.createElement('div');\n wrapper.classList.add('document-wrapper');\n\n if(message.message) {\n const messageDiv = document.createElement('div');\n messageDiv.classList.add('document-message');\n\n setInnerHTML(messageDiv, richTextFragment);\n wrapper.append(messageDiv);\n }\n\n if(mids.length > 1) {\n const selection = document.createElement('div');\n selection.classList.add('document-selection');\n container.append(selection);\n\n container.classList.add('grouped-item');\n\n if(idx === 0) {\n nameContainer = wrapper;\n }\n }\n\n wrapper.append(div);\n container.append(wrapper);\n return container;\n });\n\n const containers = await Promise.all(promises);\n messageDiv.append(...containers);\n\n if(mids.length > 1) {\n bubble.classList.add('is-multiple-documents', 'is-grouped');\n }\n\n return nameContainer;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport rootScope from '../../lib/rootScope';\nimport PollElement from '../poll';\n\nexport default function wrapPoll(message: any, managers: AppManagers = rootScope.managers) {\n const elem = new PollElement();\n elem.message = message;\n elem.managers = managers;\n elem.setAttribute('peer-id', '' + message.peerId);\n elem.setAttribute('poll-id', message.media.poll.id);\n elem.setAttribute('message-id', '' + message.mid);\n elem.render();\n return elem;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement, {addCancelButton} from '.';\nimport PopupPeer, {PopupPeerButtonCallbackCheckboxes, PopupPeerOptions} from './peer';\nimport rootScope from '../../lib/rootScope';\nimport {FormatterArguments, LangPackKey} from '../../lib/langPack';\nimport wrapPeerTitle from '../wrappers/peerTitle';\n\nexport default class PopupPinMessage {\n constructor(private peerId: PeerId, private mid: number, private unpin?: true, private onConfirm?: () => void) {\n this.construct();\n }\n\n private async construct() {\n const {peerId, mid, unpin, onConfirm} = this;\n let title: LangPackKey, description: LangPackKey, descriptionArgs: FormatterArguments;\n const buttons: PopupPeerOptions['buttons'] = [], checkboxes: PopupPeerOptions['checkboxes'] = [];\n\n const managers = PopupElement.MANAGERS;\n\n const canUnpin = await managers.appPeersManager.canPinMessage(peerId);\n\n const callback = (checked: PopupPeerButtonCallbackCheckboxes, oneSide?: boolean, silent?: boolean) => {\n setTimeout(() => { // * костыль, потому что document.elementFromPoint вернёт popup-peer пока он будет закрываться\n let promise: Promise;\n if(unpin && !mid) {\n if(canUnpin) {\n promise = managers.appMessagesManager.unpinAllMessages(peerId);\n } else {\n promise = managers.appMessagesManager.hidePinnedMessages(peerId);\n }\n } else {\n promise = managers.appMessagesManager.updatePinnedMessage(peerId, mid, unpin, silent, oneSide);\n }\n\n if(onConfirm) {\n promise.then(onConfirm);\n }\n }, 300);\n };\n\n if(unpin) {\n let buttonText: LangPackKey = 'UnpinMessage';\n if(!mid) {\n if(canUnpin) {\n title = 'Popup.Unpin.AllTitle';\n description = 'Chat.UnpinAllMessagesConfirmation';\n descriptionArgs = ['' + ((await managers.appMessagesManager.getPinnedMessagesCount(peerId)) || 1)];\n } else {\n title = 'Popup.Unpin.HideTitle';\n description = 'Popup.Unpin.HideDescription';\n buttonText = 'Popup.Unpin.Hide';\n }\n } else {\n title = 'UnpinMessageAlertTitle';\n description = 'Chat.Confirm.Unpin';\n }\n\n buttons.push({\n langKey: buttonText,\n isDanger: true,\n callback\n });\n } else {\n title = 'PinMessageAlertTitle';\n const pinButtonText: LangPackKey = 'PinMessage';\n\n if(peerId.isAnyChat()) {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, false, !checked.size)\n });\n\n if(await managers.appChatsManager.isBroadcast(peerId.toChatId())) {\n description = 'PinMessageAlertChannel';\n } else {\n description = 'PinMessageAlert';\n\n checkboxes.push({\n text: 'PinNotify',\n checked: true\n });\n }\n } else {\n description = 'PinMessageAlertChat';\n\n if(peerId === rootScope.myId) {\n buttons.push({\n langKey: pinButtonText,\n callback\n });\n } else {\n buttons.push({\n langKey: pinButtonText,\n callback: (checked) => callback(checked, !checked.size)\n });\n\n checkboxes.push({\n text: 'PinAlsoFor',\n textArgs: [await wrapPeerTitle({peerId})],\n checked: true\n });\n }\n }\n }\n\n addCancelButton(buttons);\n\n const popup = new PopupPeer('popup-delete-chat', {\n peerId,\n titleLangKey: title,\n descriptionLangKey: description,\n descriptionLangArgs: descriptionArgs,\n buttons,\n checkboxes\n });\n\n popup.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function isSelectionEmpty(selection = window.getSelection()) {\n if(!selection?.rangeCount) {\n return true;\n }\n\n const selectionRange = selection.getRangeAt(0);\n if(selectionRange.collapsed || !selectionRange.START_TO_END) {\n return true;\n }\n\n return false;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appDownloadManager from '../lib/appManagers/appDownloadManager';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport rootScope from '../lib/rootScope';\nimport {getEmojiToneIndex} from '../vendor/emoji';\nimport mediaSizes from './mediaSizes';\nimport {saveLottiePreview} from './saveLottiePreview';\n\nexport default function preloadAnimatedEmojiSticker(emoji: string, width?: number, height?: number) {\n return rootScope.managers.appStickersManager.preloadAnimatedEmojiSticker(emoji).then(({doc}) => {\n if(!doc) {\n return;\n }\n\n return appDownloadManager.downloadMedia({media: doc})\n .then(async(blob) => {\n const mediaSize = mediaSizes.active.emojiSticker;\n const toneIndex = getEmojiToneIndex(emoji);\n const animation = await lottieLoader.loadAnimationWorker({\n container: undefined,\n animationData: blob,\n width: width ?? mediaSize.width,\n height: height ?? mediaSize.height,\n name: 'doc' + doc.id,\n autoplay: false,\n loop: false,\n toneIndex\n }, 'none');\n\n animation.addEventListener('firstFrame', () => {\n saveLottiePreview(doc, animation.canvas[0], toneIndex);\n animation.remove();\n }, {once: true});\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {ReportReason} from '../../layer';\nimport InputField from '../inputField';\nimport {toastNew} from '../toast';\nimport wrapStickerEmoji from '../wrappers/stickerEmoji';\nimport PopupPeer from './peer';\n\nexport default class PopupReportMessagesConfirm extends PopupPeer {\n public static STICKER_EMOJI = '👮‍♀️';\n constructor(peerId: PeerId, mids: number[], reason: ReportReason['_'], onConfirm?: () => void) {\n super('popup-report-messages-confirm', {\n noTitle: true,\n descriptionLangKey: 'ReportInfo',\n buttons: [{\n langKey: 'ReportChat',\n callback: () => {\n if(!inputField.isValid()) {\n return;\n }\n\n onConfirm && onConfirm();\n this.managers.appMessagesManager.reportMessages(peerId, mids, reason, inputField.value).then((bool) => {\n if(!bool) return;\n\n toastNew({\n langPackKey: 'ReportSentInfo'\n });\n });\n }\n }],\n body: true\n });\n\n const div = document.createElement('div');\n const size = 100;\n wrapStickerEmoji({\n div,\n emoji: PopupReportMessagesConfirm.STICKER_EMOJI,\n width: size,\n height: size\n }).then(({render}) => render).finally(() => {\n this.show();\n });\n\n this.header.append(div);\n\n const inputField = new InputField({\n label: 'ReportHint',\n maxLength: 512,\n placeholder: 'ReportChatDescription'\n });\n\n inputField.input.addEventListener('input', () => {\n this.buttons[0].element.toggleAttribute('disabled', !inputField.isValid());\n });\n\n this.body.append(inputField.container);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport whichChild from '../../helpers/dom/whichChild';\nimport preloadAnimatedEmojiSticker from '../../helpers/preloadAnimatedEmojiSticker';\nimport {ReportReason} from '../../layer';\nimport {LangPackKey} from '../../lib/langPack';\nimport Button from '../button';\nimport PopupPeer from './peer';\nimport PopupReportMessagesConfirm from './reportMessagesConfirm';\n\nexport default class PopupReportMessages extends PopupPeer {\n constructor(peerId: PeerId, mids: number[], onConfirm?: () => void) {\n super('popup-report-messages', {titleLangKey: 'ChatTitle.ReportMessages', buttons: [], body: true});\n\n mids = mids.slice();\n\n const buttons: [LangPackKey, ReportReason['_']][] = [\n ['ReportChatSpam', 'inputReportReasonSpam'],\n ['ReportChatViolence', 'inputReportReasonViolence'],\n ['ReportChatChild', 'inputReportReasonChildAbuse'],\n ['ReportChatPornography', 'inputReportReasonPornography'],\n ['ReportChatOther', 'inputReportReasonOther'],\n ['ReportChatPersonalDetails', 'inputReportReasonPersonalDetails'],\n ['ReportChatIllegalDrugs', 'inputReportReasonIllegalDrugs']\n ];\n\n const className = 'btn-primary btn-transparent';\n buttons.forEach((b) => {\n const button = Button(className, {/* icon: 'edit', */text: b[0]});\n this.body.append(button);\n });\n\n const preloadStickerPromise = preloadAnimatedEmojiSticker(PopupReportMessagesConfirm.STICKER_EMOJI);\n\n attachClickEvent(this.body, (e) => {\n const target = findUpClassName(e.target, 'btn-primary');\n const reason = buttons[whichChild(target)][1];\n\n preloadStickerPromise.then(() => {\n this.hide();\n\n new PopupReportMessagesConfirm(peerId, mids, reason, onConfirm);\n });\n }, {listenerSetter: this.listenerSetter});\n\n // this.body.style.margin = '0 -1rem';\n this.buttonsEl.style.marginTop = '.5rem';\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport I18n, {i18n} from '../../lib/langPack';\nimport PopupPeer from './peer';\n\nexport default class PopupSponsored extends PopupPeer {\n constructor() {\n super('popup-sponsored', {\n titleLangKey: 'Chat.Message.Sponsored.What',\n descriptionLangKey: 'Chat.Message.Ad.Text',\n descriptionLangArgs: [i18n('Chat.Message.Sponsored.Link')],\n buttons: [{\n langKey: 'OK',\n isCancel: true\n }, {\n langKey: 'Chat.Message.Ad.ReadMore',\n callback: () => {\n window.open(I18n.format('Chat.Message.Sponsored.Link', true));\n },\n isCancel: true\n }],\n scrollable: true\n });\n\n this.scrollable.append(this.description);\n\n this.show();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '.';\nimport {Message, Reaction} from '../../layer';\nimport ReactionsElement from '../chat/reactions';\nimport {horizontalMenu} from '../horizontalMenu';\nimport Scrollable from '../scrollable';\nimport ScrollableLoader from '../../helpers/scrollableLoader';\nimport appDialogsManager from '../../lib/appManagers/appDialogsManager';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport wrapSticker from '../wrappers/sticker';\nimport ReactionElement from '../chat/reaction';\nimport getUserStatusString from '../wrappers/getUserStatusString';\nimport {makeMediaSize} from '../../helpers/mediaSize';\nimport wrapCustomEmoji from '../wrappers/customEmoji';\nimport SettingSection from '../settingSection';\n\nexport default class PopupReactedList extends PopupElement {\n constructor(\n private message: Message.message\n ) {\n super('popup-reacted-list', {closable: true, overlayClosable: true, body: true});\n\n this.init();\n }\n\n private async init() {\n const middleware = this.middlewareHelper.get();\n const message = await this.managers.appMessagesManager.getGroupsFirstMessage(this.message);\n if(!middleware()) return;\n const canViewReadParticipants = await this.managers.appMessagesManager.canViewMessageReadParticipants(message);\n if(!middleware()) return;\n // this.body.append(generateDelimiter());\n\n const reactionsElement = new ReactionsElement();\n const newMessage: Message.message = {\n ...message,\n mid: 0,\n id: 0,\n reactions: {\n _: 'messageReactions',\n results: [],\n\n ...message.reactions,\n\n pFlags: {},\n recent_reactions: []\n }\n };\n\n newMessage.reactions.results = newMessage.reactions.results.map((reactionCount) => {\n return {\n ...reactionCount,\n chosen_order: undefined,\n pFlags: {}\n };\n });\n\n reactionsElement.init(newMessage, 'block', this.middlewareHelper.get());\n reactionsElement.render();\n reactionsElement.classList.add('no-stripe');\n reactionsElement.classList.remove('has-no-reactions');\n\n reactionsElement.append(this.btnClose);\n\n this.header.append(reactionsElement);\n\n const tabsContainer = document.createElement('div');\n tabsContainer.classList.add('tabs-container');\n tabsContainer.dataset.animation = 'tabs';\n\n const loaders: Map = new Map();\n\n let hasAllReactions = false;\n if(newMessage.reactions.results.length) {\n const reaction = this.createFakeReaction('reactions', newMessage.reactions.results.reduce((acc, r) => acc + r.count, 0));\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasAllReactions = true;\n }\n\n let hasReadParticipants = false;\n if(canViewReadParticipants) {\n try {\n const readUserIds = await this.managers.appMessagesManager.getMessageReadParticipants(message.peerId, message.mid);\n if(!middleware()) return;\n if(!readUserIds.length) {\n throw '';\n }\n\n const reaction = this.createFakeReaction('checks', readUserIds.length);\n\n reactionsElement.prepend(reaction);\n newMessage.reactions.results.unshift(reaction.reactionCount);\n hasReadParticipants = true;\n } catch(err) {\n\n }\n }\n\n newMessage.reactions.results.forEach((reactionCount) => {\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add('tabs-tab');\n\n const section = new SettingSection({\n noShadow: true,\n noDelimiter: true\n });\n\n const chatlist = appDialogsManager.createChatList({\n dialogSize: 72\n });\n\n appDialogsManager.setListClickListener(chatlist, () => {\n this.hide();\n }, undefined, false, true);\n\n section.content.append(chatlist);\n scrollable.container.append(section.container);\n\n const skipReadParticipants = (reactionCount.reaction as any) !== 'checks';\n const skipReactionsList = (reactionCount.reaction as any) === 'checks';\n if(['checks', 'reactions'].includes(reactionCount.reaction as any)) {\n reactionCount.reaction = undefined;\n }\n\n const size = 24;\n const mediaSize = makeMediaSize(size, size);\n\n let nextOffset: string;\n const loader = new ScrollableLoader({\n scrollable,\n getPromise: async() => {\n const result = await this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(message, undefined, reactionCount.reaction, nextOffset, skipReadParticipants, skipReactionsList);\n nextOffset = result.nextOffset;\n\n await Promise.all(result.combined.map(async({peerId, reaction}) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: peerId,\n autonomous: true,\n container: chatlist,\n avatarSize: 'abitbigger',\n rippleEnabled: false,\n meAsSaved: false\n });\n\n if(reaction) {\n const stickerContainer = document.createElement('div');\n stickerContainer.classList.add('reacted-list-reaction-icon');\n\n if(reaction._ === 'reactionEmoji') {\n const availableReaction = await this.managers.appReactionsManager.getReactionCached(reaction.emoticon);\n\n wrapSticker({\n doc: availableReaction.static_icon,\n div: stickerContainer,\n width: 24,\n height: 24,\n middleware\n });\n } else if(reaction._ === 'reactionCustomEmoji') {\n stickerContainer.append(wrapCustomEmoji({\n docIds: [reaction.document_id],\n customEmojiSize: mediaSize,\n middleware\n }));\n }\n\n dom.listEl.append(stickerContainer);\n }\n\n replaceContent(dom.lastMessageSpan, getUserStatusString(await this.managers.appUsersManager.getUser(peerId.toUserId())));\n }));\n\n return !nextOffset;\n }\n });\n\n loaders.set(scrollable.container, loader);\n\n tabsContainer.append(scrollable.container);\n });\n\n this.body.append(tabsContainer);\n\n const selectTab = horizontalMenu(reactionsElement, tabsContainer, (id, tabContent) => {\n if(id === (reactionsElement.childElementCount - 1)) {\n return false;\n }\n\n const reaction = reactionsElement.children[id] as ReactionElement;\n const prevId = selectTab.prevId();\n if(prevId !== -1) {\n (reactionsElement.children[prevId] as ReactionElement).setIsChosen(false);\n }\n\n reaction.setIsChosen(true);\n\n const loader = loaders.get(tabContent);\n loader.load();\n }, undefined, undefined, undefined, this.listenerSetter);\n\n // selectTab(hasAllReactions && hasReadParticipants ? 1 : 0, false);\n selectTab(0, false);\n\n this.show();\n }\n\n private createFakeReaction(icon: string, count: number) {\n const reaction = new ReactionElement();\n reaction.init('block', this.middlewareHelper.get());\n reaction.reactionCount = {\n _: 'reactionCount',\n count: count,\n reaction: icon as any\n };\n reaction.setCanRenderAvatars(false);\n reaction.renderCounter();\n\n const allReactionsSticker = document.createElement('div');\n allReactionsSticker.classList.add('reaction-counter', 'reaction-sticker-icon', 'tgico-' + icon);\n reaction.prepend(allReactionsSticker);\n\n return reaction;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\nimport assumeType from '../../helpers/assumeType';\nimport callbackify from '../../helpers/callbackify';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport {getMiddleware} from '../../helpers/middleware';\nimport noop from '../../helpers/noop';\nimport {fastRaf} from '../../helpers/schedulers';\nimport {Message, AvailableReaction, Reaction} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport lottieLoader from '../../lib/rlottie/lottieLoader';\nimport RLottiePlayer from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\nimport Scrollable, {ScrollableBase, ScrollableX} from '../scrollable';\nimport wrapSticker from '../wrappers/sticker';\n\nconst REACTIONS_CLASS_NAME = 'btn-menu-reactions';\nconst REACTION_CLASS_NAME = REACTIONS_CLASS_NAME + '-reaction';\n\nconst REACTION_SIZE = 26;\nconst PADDING = 4;\nexport const REACTION_CONTAINER_SIZE = REACTION_SIZE + PADDING * 2;\n\nconst CAN_USE_TRANSFORM = !IS_SAFARI;\n\ntype ChatReactionsMenuPlayers = {\n select?: RLottiePlayer,\n appear?: RLottiePlayer,\n selectWrapper: HTMLElement,\n appearWrapper: HTMLElement,\n reaction: Reaction\n};\nexport class ChatReactionsMenu {\n public widthContainer: HTMLElement;\n public container: HTMLElement;\n private reactionsMap: Map;\n public scrollable: ScrollableBase;\n private animationGroup: AnimationItemGroup;\n private middleware: ReturnType;\n private message: Message.message;\n\n constructor(\n private managers: AppManagers,\n private type: 'horizontal' | 'vertical',\n middleware: ChatReactionsMenu['middleware']\n ) {\n const widthContainer = this.widthContainer = document.createElement('div');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container');\n widthContainer.classList.add(REACTIONS_CLASS_NAME + '-container-' + type);\n\n const reactionsContainer = this.container = document.createElement('div');\n reactionsContainer.classList.add(REACTIONS_CLASS_NAME);\n\n const reactionsScrollable = this.scrollable = type === 'vertical' ? new Scrollable(undefined) : new ScrollableX(undefined);\n reactionsContainer.append(reactionsScrollable.container);\n reactionsScrollable.onAdditionalScroll = this.onScroll;\n reactionsScrollable.setListeners();\n\n reactionsScrollable.container.classList.add('no-scrollbar');\n\n // ['big'].forEach((type) => {\n // const bubble = document.createElement('div');\n // bubble.classList.add(REACTIONS_CLASS_NAME + '-bubble', REACTIONS_CLASS_NAME + '-bubble-' + type);\n // reactionsContainer.append(bubble);\n // });\n\n this.reactionsMap = new Map();\n this.animationGroup = `CHAT-MENU-REACTIONS-${Date.now()}`;\n animationIntersector.setOverrideIdleGroup(this.animationGroup, true);\n\n if(!IS_TOUCH_SUPPORTED) {\n reactionsContainer.addEventListener('mousemove', this.onMouseMove);\n }\n\n attachClickEvent(reactionsContainer, (e) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) return;\n\n const players = this.reactionsMap.get(reactionDiv);\n if(!players) return;\n\n this.managers.appReactionsManager.sendReaction(this.message, players.reaction);\n });\n\n widthContainer.append(reactionsContainer);\n\n this.middleware = middleware ?? getMiddleware();\n }\n\n public init(message: Message.message) {\n this.message = message;\n\n const middleware = this.middleware.get();\n // const result = Promise.resolve(this.appReactionsManager.getAvailableReactionsForPeer(message.peerId)).then((res) => pause(1000).then(() => res));\n const result = this.managers.appReactionsManager.getAvailableReactionsByMessage(message);\n callbackify(result, (reactions) => {\n if(!middleware() || !reactions.length) return;\n reactions.forEach((reaction) => {\n if(reaction.pFlags.premium && !rootScope.premium) return;\n this.renderReaction(reaction);\n });\n\n const setVisible = () => {\n this.container.classList.add('is-visible');\n };\n\n if(result instanceof Promise) {\n fastRaf(setVisible);\n } else {\n setVisible();\n }\n });\n }\n\n public cleanup() {\n this.middleware.clean();\n this.scrollable.removeListeners();\n this.reactionsMap.clear();\n animationIntersector.setOverrideIdleGroup(this.animationGroup, false);\n animationIntersector.checkAnimations(true, this.animationGroup, true);\n }\n\n private onScroll = () => {\n this.reactionsMap.forEach((players, div) => {\n this.onScrollProcessItem(div, players);\n });\n };\n\n private canUseAnimations() {\n return rootScope.settings.animationsEnabled && !IS_MOBILE;\n }\n\n private renderReaction(reaction: AvailableReaction) {\n const reactionDiv = document.createElement('div');\n reactionDiv.classList.add(REACTION_CLASS_NAME);\n\n const scaleContainer = document.createElement('div');\n scaleContainer.classList.add(REACTION_CLASS_NAME + '-scale');\n\n const appearWrapper = document.createElement('div');\n let selectWrapper: HTMLElement;;\n appearWrapper.classList.add(REACTION_CLASS_NAME + '-appear');\n\n if(this.canUseAnimations()) {\n selectWrapper = document.createElement('div');\n selectWrapper.classList.add(REACTION_CLASS_NAME + '-select', 'hide');\n }\n\n const players: ChatReactionsMenuPlayers = {\n selectWrapper,\n appearWrapper,\n reaction: {_: 'reactionEmoji', emoticon: reaction.reaction}\n };\n this.reactionsMap.set(reactionDiv, players);\n\n const middleware = this.middleware.get();\n\n const hoverScale = IS_TOUCH_SUPPORTED ? 1 : 1.25;\n const size = REACTION_SIZE * hoverScale;\n\n const options = {\n width: size,\n height: size,\n skipRatio: 1,\n needFadeIn: false,\n withThumb: false,\n group: this.animationGroup,\n middleware\n };\n\n if(!this.canUseAnimations()) {\n delete options.needFadeIn;\n delete options.withThumb;\n\n wrapSticker({\n doc: reaction.static_icon,\n div: appearWrapper,\n ...options\n });\n } else {\n let isFirst = true;\n wrapSticker({\n doc: reaction.appear_animation,\n div: appearWrapper,\n play: true,\n ...options\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n players.appear = player;\n\n player.addEventListener('enterFrame', (frameNo) => {\n if(player.maxFrame === frameNo) {\n selectLoadPromise.then((selectPlayer) => {\n assumeType(selectPlayer);\n appearWrapper.classList.add('hide');\n selectWrapper.classList.remove('hide');\n\n if(isFirst) {\n players.select = selectPlayer;\n isFirst = false;\n }\n }, noop);\n }\n });\n }, noop);\n\n const selectLoadPromise = wrapSticker({\n doc: reaction.select_animation,\n div: selectWrapper,\n ...options\n }).then(({render}) => render).then((player) => {\n assumeType(player);\n\n return lottieLoader.waitForFirstFrame(player);\n }).catch(noop);\n }\n\n scaleContainer.append(appearWrapper);\n selectWrapper && scaleContainer.append(selectWrapper);\n reactionDiv.append(scaleContainer);\n this.scrollable.append(reactionDiv);\n }\n\n private onScrollProcessItem(div: HTMLElement, players: ChatReactionsMenuPlayers) {\n // return;\n\n const scaleContainer = div.firstElementChild as HTMLElement;\n const visibleRect = getVisibleRect(div, this.scrollable.container);\n let transform: string;\n if(!visibleRect) {\n if(!players.appearWrapper.classList.contains('hide') || !players.appear) {\n return;\n }\n\n if(players.select) {\n players.select.stop();\n }\n\n players.appear.stop();\n players.appear.autoplay = true;\n players.appearWrapper.classList.remove('hide');\n players.selectWrapper.classList.add('hide');\n\n transform = '';\n } else if(visibleRect.overflow.left || visibleRect.overflow.right) {\n const diff = Math.abs(visibleRect.rect.left - visibleRect.rect.right);\n const scale = Math.min(diff ** 2 / REACTION_CONTAINER_SIZE ** 2, 1);\n\n transform = 'scale(' + scale + ')';\n } else {\n transform = '';\n }\n\n if(CAN_USE_TRANSFORM) {\n scaleContainer.style.transform = transform;\n }\n }\n\n private onMouseMove = (e: MouseEvent) => {\n const reactionDiv = findUpClassName(e.target, REACTION_CLASS_NAME);\n if(!reactionDiv) {\n return;\n }\n\n const players = this.reactionsMap.get(reactionDiv);\n if(!players) {\n return;\n }\n\n // do not play select animation when appearing\n if(!players.appear?.paused) {\n return;\n }\n\n const player = players.select;\n if(!player) {\n return;\n }\n\n if(player.paused) {\n player.autoplay = true;\n player.restart();\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport type Chat from './chat';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport ButtonMenu, {ButtonMenuItemOptions} from '../buttonMenu';\nimport PopupDeleteMessages from '../popups/deleteMessages';\nimport PopupForward from '../popups/forward';\nimport PopupPinMessage from '../popups/unpinMessage';\nimport {copyTextToClipboard} from '../../helpers/clipboard';\nimport PopupSendNow from '../popups/sendNow';\nimport {toast} from '../toast';\nimport I18n, {i18n, LangPackKey} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\nimport {Message, Poll, Chat as MTChat, MessageMedia, AvailableReaction, MessageEntity, InputStickerSet, StickerSet, Document, Reaction} from '../../layer';\nimport PopupReportMessages from '../popups/reportMessages';\nimport assumeType from '../../helpers/assumeType';\nimport PopupSponsored from '../popups/sponsored';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {getMiddleware} from '../../helpers/middleware';\nimport PeerTitle from '../peerTitle';\nimport StackedAvatars from '../stackedAvatars';\nimport {IS_APPLE} from '../../environment/userAgent';\nimport PopupReactedList from '../popups/reactedList';\nimport {ChatReactionsMenu, REACTION_CONTAINER_SIZE} from './reactionsMenu';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport positionMenu, {MenuPositionPadding} from '../../helpers/positionMenu';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {SERVICE_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport {MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport PopupStickers from '../popups/stickers';\nimport getMediaFromMessage from '../../lib/appManagers/utils/messages/getMediaFromMessage';\nimport canSaveMessageMedia from '../../lib/appManagers/utils/messages/canSaveMessageMedia';\nimport getAlbumText from '../../lib/appManagers/utils/messages/getAlbumText';\n\nexport default class ChatContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify: () => boolean | Promise, notDirect?: () => boolean, withSelection?: true, isSponsored?: true, localName?: 'views' | 'emojis'})[];\n private element: HTMLElement;\n\n private isSelectable: boolean;\n private isSelected: boolean;\n private target: HTMLElement;\n private isTargetAGroupedItem: boolean;\n private isTextSelected: boolean;\n private isAnchorTarget: boolean;\n private isUsernameTarget: boolean;\n private isSponsored: boolean;\n private isOverBubble: boolean;\n private peerId: PeerId;\n private mid: number;\n private message: Message.message | Message.messageService;\n private noForwards: boolean;\n\n private reactionsMenu: ChatReactionsMenu;\n private listenerSetter: ListenerSetter;\n private attachListenerSetter: ListenerSetter;\n\n private viewerPeerId: PeerId;\n private middleware: ReturnType;\n private canOpenReactedList: boolean;\n\n private emojiInputsPromise: CancellablePromise;\n private albumMessages: Message.message[];\n private linkToMessage: Awaited>;\n private selectedMessagesText: string;\n\n constructor(\n private chat: Chat,\n private managers: AppManagers\n ) {\n this.listenerSetter = new ListenerSetter();\n this.attachListenerSetter = new ListenerSetter();\n this.middleware = getMiddleware();\n }\n\n public attachTo(element: HTMLElement) {\n this.attachListenerSetter.removeAll();\n\n if(IS_TOUCH_SUPPORTED/* && false */) {\n attachClickEvent(element, (e) => {\n if(this.chat.selection.isSelecting) {\n return;\n }\n\n this.chat.log('touchend', e);\n\n const badSelectors = [\n '.name',\n '.peer-title',\n '.reply',\n '.document',\n 'audio-element',\n 'avatar-element',\n 'a',\n '.bubble-beside-button',\n 'replies-element',\n '[data-saved-from]:not(.bubble)',\n 'poll-element',\n '.attachment',\n '.reply-markup-button'\n ];\n const good = !(e.target as HTMLElement).closest(badSelectors.join(', '));\n if(good) {\n cancelEvent(e);\n // onContextMenu((e as TouchEvent).changedTouches[0]);\n // onContextMenu((e as TouchEvent).changedTouches ? (e as TouchEvent).changedTouches[0] : e as MouseEvent);\n this.onContextMenu(e);\n }\n }, {listenerSetter: this.attachListenerSetter});\n } else attachContextMenuListener({\n element,\n callback: this.onContextMenu,\n listenerSetter: this.attachListenerSetter\n });\n }\n\n private onContextMenu = (e: MouseEvent | Touch | TouchEvent) => {\n let bubble: HTMLElement, contentWrapper: HTMLElement;\n\n try {\n contentWrapper = findUpClassName(e.target, 'bubble-content-wrapper');\n bubble = contentWrapper ? contentWrapper.parentElement : findUpClassName(e.target, 'bubble');\n } catch(e) {}\n\n // ! context menu click by date bubble (there is no pointer-events)\n if(!bubble || bubble.classList.contains('bubble-first')) return;\n\n let element = this.element;\n if(e instanceof MouseEvent || e.hasOwnProperty('preventDefault')) (e as any).preventDefault();\n if(element && element.classList.contains('active')) {\n return false;\n }\n if(e instanceof MouseEvent || e.hasOwnProperty('cancelBubble')) (e as any).cancelBubble = true;\n\n let mid = +bubble.dataset.mid;\n if(!mid) return;\n\n const r = async() => {\n const isSponsored = this.isSponsored = mid < 0;\n this.isSelectable = this.chat.selection.canSelectBubble(bubble);\n this.peerId = this.chat.peerId;\n // this.msgID = msgID;\n this.target = e.target as HTMLElement;\n this.isTextSelected = !isSelectionEmpty();\n this.isAnchorTarget = this.target.tagName === 'A' && (\n (this.target as HTMLAnchorElement).target === '_blank' ||\n this.target.classList.contains('anchor-url')\n );\n this.isUsernameTarget = this.target.tagName === 'A' && this.target.classList.contains('mention');\n\n const mids = await this.chat.getMidsByMid(mid);\n // * если открыть контекстное меню для альбома не по бабблу, и последний элемент не выбран, чтобы показать остальные пункты\n if(this.chat.selection.isSelecting && !contentWrapper) {\n if(isSponsored) {\n return;\n }\n\n if(mids.length > 1) {\n const selectedMid = this.chat.selection.isMidSelected(this.peerId, mid) ?\n mid :\n mids.find((mid) => this.chat.selection.isMidSelected(this.peerId, mid));\n if(selectedMid) {\n mid = selectedMid;\n }\n }\n }\n\n this.isOverBubble = !!contentWrapper;\n\n const groupedItem = findUpClassName(this.target, 'grouped-item');\n this.isTargetAGroupedItem = !!groupedItem;\n if(groupedItem) {\n this.mid = +groupedItem.dataset.mid;\n } else {\n this.mid = mid;\n }\n\n this.isSelected = this.chat.selection.isMidSelected(this.peerId, this.mid);\n this.message = (bubble as any).message || await this.chat.getMessage(this.mid);\n this.albumMessages = (this.message as Message.message).grouped_id ? await this.managers.appMessagesManager.getMessagesByAlbum((this.message as Message.message).grouped_id) : undefined;\n this.noForwards = !isSponsored && !(await this.managers.appMessagesManager.canForward(this.message));\n this.viewerPeerId = undefined;\n this.canOpenReactedList = undefined;\n this.linkToMessage = await this.getUrlToMessage();\n this.selectedMessagesText = await this.getSelectedMessagesText();\n\n const initResult = await this.init();\n if(!initResult) {\n return;\n }\n\n element = initResult.element;\n const {cleanup, destroy, menuPadding, reactionsMenu, reactionsMenuPosition} = initResult;\n let isReactionsMenuVisible = false;\n if(reactionsMenu) {\n const className = 'is-visible';\n isReactionsMenuVisible = reactionsMenu.container.classList.contains(className);\n if(isReactionsMenuVisible) reactionsMenu.container.classList.remove(className);\n\n if(reactionsMenuPosition === 'horizontal') {\n const offsetSize = element[/* reactionsMenuPosition === 'vertical' ? 'offsetHeight' : */'offsetWidth'];\n // if(reactionsMenu.scrollable.container.scrollWidth > offsetWidth) {\n const INNER_CONTAINER_PADDING = 8;\n const visibleLength = (offsetSize - INNER_CONTAINER_PADDING) / REACTION_CONTAINER_SIZE;\n const nextVisiblePart = visibleLength % 1;\n const MIN_NEXT_VISIBLE_PART = 0.65;\n if(nextVisiblePart < MIN_NEXT_VISIBLE_PART) {\n const minSize = (offsetSize + (MIN_NEXT_VISIBLE_PART - nextVisiblePart) * REACTION_CONTAINER_SIZE) | 0;\n element.style[/* reactionsMenuPosition === 'vertical' ? 'minHeight' : */'minWidth'] = minSize + 'px';\n }\n // }\n }\n }\n\n const side: 'left' | 'right' = bubble.classList.contains('is-in') ? 'left' : 'right';\n // bubble.parentElement.append(element);\n // appImManager.log('contextmenu', e, bubble, side);\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, element, side, menuPadding);\n\n if(reactionsMenu) {\n reactionsMenu.widthContainer.style.top = element.style.top;\n reactionsMenu.widthContainer.style.left = element.style.left;\n reactionsMenu.widthContainer.style.setProperty('--menu-width', element[reactionsMenuPosition === 'vertical' ? 'offsetHeight' : 'offsetWidth'] + 'px');\n element.parentElement.append(reactionsMenu.widthContainer);\n if(isReactionsMenuVisible) void reactionsMenu.container.offsetLeft; // reflow\n }\n\n contextMenuController.openBtnMenu(element, () => {\n if(reactionsMenu) {\n reactionsMenu.container.classList.remove('is-visible');\n }\n\n this.mid = 0;\n this.peerId = undefined;\n this.target = null;\n this.viewerPeerId = undefined;\n this.canOpenReactedList = undefined;\n cleanup();\n\n setTimeout(() => {\n destroy();\n }, 300);\n });\n\n if(isReactionsMenuVisible) {\n reactionsMenu.container.classList.add('is-visible');\n }\n };\n\n r();\n };\n\n public cleanup() {\n this.listenerSetter.removeAll();\n this.reactionsMenu && this.reactionsMenu.cleanup();\n this.middleware.clean();\n }\n\n public destroy() {\n this.cleanup();\n this.attachListenerSetter.removeAll();\n }\n\n private async filterButtons(buttons: ChatContextMenu['buttons']) {\n if(this.isSponsored) {\n return buttons.filter((button) => {\n return button.isSponsored;\n });\n } else {\n return filterAsync(buttons, async(button) => {\n let good: boolean;\n\n // if((appImManager.chatSelection.isSelecting && !button.withSelection) || (button.withSelection && !appImManager.chatSelection.isSelecting)) {\n if(this.chat.selection.isSelecting && !button.withSelection) {\n good = false;\n } else {\n good = this.isOverBubble || IS_TOUCH_SUPPORTED || true ?\n await button.verify() :\n button.notDirect && await button.verify() && button.notDirect();\n }\n\n return !!good;\n });\n }\n }\n\n private setButtons() {\n const verifyFavoriteSticker = async(toAdd: boolean) => {\n const doc = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document;\n if(!(doc as MyDocument)?.sticker) {\n return false;\n }\n\n const favedStickers = await this.managers.acknowledged.appStickersManager.getFavedStickersStickers();\n if(!favedStickers.cached) {\n return false;\n }\n\n const found = (await favedStickers.result).some((_doc) => _doc.id === doc.id);\n return toAdd ? !found : found;\n };\n\n this.buttons = [{\n icon: 'send2',\n text: 'MessageScheduleSend',\n onClick: this.onSendScheduledClick,\n verify: () => this.chat.type === 'scheduled' && !this.message.pFlags.is_outgoing\n }, {\n icon: 'send2',\n text: 'Message.Context.Selection.SendNow',\n onClick: this.onSendScheduledClick,\n verify: () => this.chat.type === 'scheduled' && this.isSelected && !this.chat.selection.selectionSendNowBtn.hasAttribute('disabled'),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'schedule',\n text: 'MessageScheduleEditTime',\n onClick: () => {\n this.chat.input.scheduleSending(() => {\n assumeType(this.message);\n this.managers.appMessagesManager.editMessage(this.message, this.message.message, {\n scheduleDate: this.chat.input.scheduleDate,\n entities: this.message.entities\n });\n\n this.chat.input.onMessageSent(false, false);\n }, new Date(this.message.date * 1000));\n },\n verify: () => this.chat.type === 'scheduled'\n }, {\n icon: 'reply',\n text: 'Reply',\n onClick: this.onReplyClick,\n verify: async() => await this.chat.canSend() &&\n !this.message.pFlags.is_outgoing &&\n !!this.chat.input.messageInput &&\n this.chat.type !== 'scheduled'/* ,\n cancelEvent: true */\n }, {\n icon: 'favourites',\n text: 'AddToFavorites',\n onClick: this.onFaveStickerClick.bind(this, false),\n verify: () => verifyFavoriteSticker(true)\n }, {\n icon: 'favourites',\n text: 'DeleteFromFavorites',\n onClick: this.onFaveStickerClick.bind(this, true),\n verify: () => verifyFavoriteSticker(false)\n }, {\n icon: 'edit',\n text: 'Edit',\n onClick: this.onEditClick,\n verify: async() => (await this.managers.appMessagesManager.canEditMessage(this.message, 'text')) && !!this.chat.input.messageInput\n }, {\n icon: 'copy',\n text: 'Copy',\n onClick: this.onCopyClick,\n verify: () => !this.noForwards && !!(this.message as Message.message).message && !this.isTextSelected && (!this.isAnchorTarget || (this.message as Message.message).message !== this.target.innerText)\n }, {\n icon: 'copy',\n text: 'Chat.CopySelectedText',\n onClick: this.onCopyClick,\n verify: () => !this.noForwards && !!(this.message as Message.message).message && this.isTextSelected\n }, {\n icon: 'copy',\n text: 'Message.Context.Selection.Copy',\n onClick: this.onCopyClick,\n verify: async() => {\n if(!this.isSelected || this.noForwards) {\n return false;\n }\n\n for(const [peerId, mids] of this.chat.selection.selectedMids) {\n const storageKey: MessagesStorageKey = `${peerId}_${this.chat.type === 'scheduled' ? 'scheduled' : 'history'}`;\n for(const mid of mids) {\n const message = (await this.managers.appMessagesManager.getMessageFromStorage(storageKey, mid)) as Message.message;\n if(!!message.message) {\n return true;\n }\n }\n }\n\n return false;\n },\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'copy',\n text: 'CopyLink',\n onClick: this.onCopyAnchorLinkClick,\n verify: () => this.isAnchorTarget,\n withSelection: true\n }, {\n icon: 'copy',\n text: 'Text.Context.Copy.Username',\n onClick: () => {\n copyTextToClipboard(this.target.innerHTML);\n },\n verify: () => this.isUsernameTarget,\n withSelection: true\n }, {\n icon: 'copy',\n text: 'Text.Context.Copy.Hashtag',\n onClick: () => {\n copyTextToClipboard(this.target.innerHTML);\n },\n verify: () => this.target.classList.contains('anchor-hashtag'),\n withSelection: true\n }, {\n icon: 'link',\n text: 'MessageContext.CopyMessageLink1',\n onClick: this.onCopyLinkClick,\n verify: async() => await this.managers.appPeersManager.isChannel(this.peerId) && !this.message.pFlags.is_outgoing\n }, {\n icon: 'pin',\n text: 'Message.Context.Pin',\n onClick: this.onPinClick,\n verify: async() => !this.message.pFlags.is_outgoing &&\n this.message._ !== 'messageService' &&\n !this.message.pFlags.pinned &&\n await this.managers.appPeersManager.canPinMessage(this.peerId) &&\n this.chat.type !== 'scheduled'\n }, {\n icon: 'unpin',\n text: 'Message.Context.Unpin',\n onClick: this.onUnpinClick,\n verify: async() => (this.message as Message.message).pFlags.pinned && await this.managers.appPeersManager.canPinMessage(this.peerId)\n }, {\n icon: 'download',\n text: 'MediaViewer.Context.Download',\n onClick: () => {\n appDownloadManager.downloadToDisc({media: getMediaFromMessage(this.message)});\n },\n verify: () => {\n if(!canSaveMessageMedia(this.message) || this.noForwards) {\n return false;\n }\n\n const isPhoto: boolean = !!((this.message as Message.message).media as MessageMedia.messageMediaPhoto)?.photo;\n let isGoodType = false\n\n if(isPhoto) {\n isGoodType = true;\n } else {\n const doc: MyDocument = ((this.message as Message.message).media as MessageMedia.messageMediaDocument)?.document as any;\n if(!doc) return false;\n // isGoodType = doc.type && (['gif', 'video', 'audio', 'voice', 'sticker'] as MyDocument['type'][]).includes(doc.type)\n isGoodType = true;\n }\n\n let hasTarget = !!IS_TOUCH_SUPPORTED;\n\n if(isGoodType) hasTarget ||= !!findUpClassName(this.target, 'document') || !!findUpClassName(this.target, 'audio') || !!findUpClassName(this.target, 'media-sticker-wrapper') || !!findUpClassName(this.target, 'media-photo') || !!findUpClassName(this.target, 'media-video');\n\n return isGoodType && hasTarget;\n }\n }, {\n icon: 'checkretract',\n text: 'Chat.Poll.Unvote',\n onClick: this.onRetractVote,\n verify: () => {\n const poll = (this.message as any).media?.poll as Poll;\n return poll && poll.chosenIndexes.length && !poll.pFlags.closed && !poll.pFlags.quiz;\n }/* ,\n cancelEvent: true */\n }, {\n icon: 'stop',\n text: 'Chat.Poll.Stop',\n onClick: this.onStopPoll,\n verify: async() => {\n const poll = (this.message as any).media?.poll;\n return await this.managers.appMessagesManager.canEditMessage(this.message, 'poll') && poll && !poll.pFlags.closed && !this.message.pFlags.is_outgoing;\n }/* ,\n cancelEvent: true */\n }, {\n icon: 'forward',\n text: 'Forward',\n onClick: this.onForwardClick, // let forward the message if it's outgoing but not ours (like a changelog)\n verify: () => !this.noForwards && this.chat.type !== 'scheduled' && (!this.message.pFlags.is_outgoing || this.message.fromId === SERVICE_PEER_ID) && this.message._ !== 'messageService'\n }, {\n icon: 'forward',\n text: 'Message.Context.Selection.Forward',\n onClick: this.onForwardClick,\n verify: () => this.chat.selection.selectionForwardBtn &&\n this.isSelected &&\n !this.chat.selection.selectionForwardBtn.hasAttribute('disabled'),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'flag',\n text: 'ReportChat',\n onClick: () => {\n new PopupReportMessages(this.peerId, [this.mid]);\n },\n verify: async() => !this.message.pFlags.out && this.message._ === 'message' && !this.message.pFlags.is_outgoing && await this.managers.appPeersManager.isChannel(this.peerId),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Select',\n onClick: this.onSelectClick,\n verify: () => !(this.message as Message.messageService).action && !this.isSelected && this.isSelectable,\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'select',\n text: 'Message.Context.Selection.Clear',\n onClick: this.onClearSelectionClick,\n verify: () => this.isSelected,\n notDirect: () => true,\n withSelection: true\n }, {\n onClick: () => {\n if(this.viewerPeerId) {\n this.chat.appImManager.setInnerPeer({\n peerId: this.viewerPeerId\n });\n } else if(this.canOpenReactedList) {\n new PopupReactedList(this.message as Message.message);\n } else {\n return false;\n }\n },\n verify: async() => !this.peerId.isUser() && (!!(this.message as Message.message).reactions?.recent_reactions?.length || await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message)),\n notDirect: () => true,\n localName: 'views'\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: this.onDeleteClick,\n verify: async() => this.managers.appMessagesManager.canDeleteMessage(this.message)\n }, {\n icon: 'delete danger',\n text: 'Message.Context.Selection.Delete',\n onClick: this.onDeleteClick,\n verify: () => this.isSelected && !this.chat.selection.selectionDeleteBtn.hasAttribute('disabled'),\n notDirect: () => true,\n withSelection: true\n }, {\n icon: 'info',\n text: 'Chat.Message.Sponsored.What',\n onClick: () => {\n new PopupSponsored();\n },\n verify: () => false,\n isSponsored: true\n }, {\n // icon: 'smile',\n text: 'Loading',\n onClick: () => {\n this.emojiInputsPromise.then((inputs) => {\n new PopupStickers(inputs, true).show();\n });\n },\n verify: () => !!this.getUniqueCustomEmojisFromMessage().length,\n notDirect: () => true,\n localName: 'emojis'\n }];\n }\n\n private getUniqueCustomEmojisFromMessage() {\n const docIds: DocId[] = [];\n\n const message = this.albumMessages ? getAlbumText(this.albumMessages) || this.message : this.message;\n\n const entities = (message as Message.message).entities;\n if(entities) {\n const filtered = entities.filter((entity) => entity._ === 'messageEntityCustomEmoji') as MessageEntity.messageEntityCustomEmoji[];\n docIds.push(...filtered.map((entity) => entity.document_id));\n }\n\n const reactions = (message as Message.message).reactions;\n if(reactions) {\n const results = reactions.results.filter((reactionCount) => reactionCount.reaction._ === 'reactionCustomEmoji');\n docIds.push(...results.map((reactionCount) => (reactionCount.reaction as Reaction.reactionCustomEmoji).document_id));\n }\n\n return filterUnique(docIds);\n }\n\n private async init() {\n this.cleanup();\n this.setButtons();\n\n const filteredButtons = await this.filterButtons(this.buttons);\n if(!filteredButtons.length) {\n return;\n }\n\n const element = this.element = await ButtonMenu({\n buttons: filteredButtons,\n listenerSetter: this.listenerSetter\n });\n element.id = 'bubble-contextmenu';\n element.classList.add('contextmenu');\n\n const viewsButton = filteredButtons.find((button) => button.localName === 'views');\n if(viewsButton) {\n const reactions = (this.message as Message.message).reactions;\n const recentReactions = reactions?.recent_reactions;\n const isViewingReactions = !!recentReactions?.length;\n const participantsCount = await this.managers.appMessagesManager.canViewMessageReadParticipants(this.message) ?\n ((await this.managers.appPeersManager.getPeer(this.peerId)) as MTChat.chat).participants_count :\n undefined;\n const reactedLength = reactions ? reactions.results.reduce((acc, r) => acc + r.count, 0) : undefined;\n\n viewsButton.element.classList.add('tgico-' + (isViewingReactions ? 'reactions' : 'checks'));\n const i18nElem = new I18n.IntlElement({\n key: isViewingReactions ? (\n participantsCount === undefined ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted'\n ) : 'NobodyViewed',\n args: isViewingReactions ? (\n participantsCount === undefined ? [reactedLength] : [participantsCount, participantsCount]\n ) : undefined,\n element: viewsButton.textElement\n });\n\n let fakeText: HTMLElement;\n if(isViewingReactions) {\n if(participantsCount === undefined) {\n fakeText = i18n('Chat.Context.ReactedFast', [reactedLength]);\n } else {\n fakeText = i18n(\n recentReactions.length === participantsCount ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted',\n [recentReactions.length, participantsCount]\n );\n }\n } else {\n fakeText = i18n('Loading');\n }\n\n fakeText.classList.add('btn-menu-item-text-fake');\n viewsButton.element.append(fakeText);\n\n const AVATAR_SIZE = 22;\n const MAX_AVATARS = 3;\n const PADDING_PER_AVATAR = 1.125;\n i18nElem.element.style.visibility = 'hidden';\n i18nElem.element.style.paddingRight = isViewingReactions ? PADDING_PER_AVATAR * Math.min(MAX_AVATARS, recentReactions.length) + 'rem' : '1rem';\n const middleware = this.middleware.get();\n this.managers.appMessagesManager.getMessageReactionsListAndReadParticipants(this.message as Message.message).then((result) => {\n if(!middleware()) {\n return;\n }\n\n if(fakeText) {\n fakeText.remove();\n }\n\n const reactions = result.combined;\n const reactedLength = participantsCount === undefined ?\n result.reactionsCount :\n (\n isViewingReactions ?\n reactions.filter((reaction) => reaction.reaction).length :\n reactions.length\n );\n\n let fakeElem: HTMLElement;\n if(reactions.length === 1) {\n fakeElem = new PeerTitle({\n peerId: reactions[0].peerId,\n onlyFirstName: true,\n dialog: false\n }).element;\n\n if(!isViewingReactions || result.readParticipants.length <= 1) {\n this.viewerPeerId = reactions[0].peerId;\n }\n } else if(isViewingReactions) {\n const isFull = reactedLength === reactions.length || participantsCount === undefined;\n fakeElem = i18n(\n isFull ? 'Chat.Context.ReactedFast' : 'Chat.Context.Reacted',\n isFull ? [reactedLength] : [reactedLength, reactions.length]\n );\n } else {\n if(!reactions.length) {\n i18nElem.element.style.visibility = '';\n } else {\n fakeElem = i18n('MessageSeen', [reactions.length]);\n }\n }\n\n if(fakeElem) {\n fakeElem.style.paddingRight = PADDING_PER_AVATAR * Math.min(MAX_AVATARS, reactedLength) + 'rem';\n fakeElem.classList.add('btn-menu-item-text-fake');\n viewsButton.element.append(fakeElem);\n }\n\n if(reactions.length) {\n const avatars = new StackedAvatars({avatarSize: AVATAR_SIZE});\n avatars.render(recentReactions ? recentReactions.map((r) => getPeerId(r.peer_id)) : reactions.map((reaction) => reaction.peerId));\n viewsButton.element.append(avatars.container);\n\n // if(reactions.length > 1) {\n // if(isViewingReactions) {\n this.canOpenReactedList = true;\n // }\n }\n });\n }\n\n let menuPadding: MenuPositionPadding;\n let reactionsMenu: ChatReactionsMenu;\n let reactionsMenuPosition: 'horizontal' | 'vertical';\n if(\n this.message._ === 'message' &&\n !this.chat.selection.isSelecting &&\n !this.message.pFlags.is_outgoing &&\n !this.message.pFlags.is_scheduled &&\n !this.message.pFlags.local\n ) {\n reactionsMenuPosition = (IS_APPLE || IS_TOUCH_SUPPORTED)/* && false */ ? 'horizontal' : 'vertical';\n reactionsMenu = this.reactionsMenu = new ChatReactionsMenu(this.managers, reactionsMenuPosition, this.middleware);\n reactionsMenu.init(await this.managers.appMessagesManager.getGroupsFirstMessage(this.message));\n // element.prepend(reactionsMenu.widthContainer);\n\n const size = 36;\n const margin = 8;\n const totalSize = size + margin;\n const paddingLeft = 0, paddingRight = 0;\n if(reactionsMenuPosition === 'vertical') {\n menuPadding = {\n top: paddingLeft,\n // bottom: 36, // positionMenu will detect it itself somehow\n left: totalSize\n };\n } else {\n menuPadding = {\n top: totalSize,\n right: paddingRight,\n left: paddingLeft\n };\n }\n }\n\n const emojisButton = filteredButtons.find((button) => button.localName === 'emojis');\n if(emojisButton) {\n emojisButton.element.classList.add('is-multiline');\n emojisButton.element.parentElement.insertBefore(document.createElement('hr'), emojisButton.element);\n\n const setPadding = () => {\n menuPadding ??= {};\n menuPadding.bottom = 24;\n };\n\n const docIds = this.getUniqueCustomEmojisFromMessage();\n const inputsPromise = this.emojiInputsPromise = deferredPromise();\n\n await this.managers.appEmojiManager.getCachedCustomEmojiDocuments(docIds).then(async(docs) => {\n const p = async(docs: Document.document[]) => {\n const s: Map = new Map();\n docs.forEach((doc) => {\n if(!doc || s.has(doc.stickerSetInput.id)) {\n return;\n }\n\n s.set(doc.stickerSetInput.id, doc.stickerSetInput);\n });\n\n const inputs = [...s.values()];\n inputsPromise.resolve(inputs);\n if(s.size === 1) {\n const result = await this.managers.acknowledged.appStickersManager.getStickerSet(inputs[0]);\n const promise = result.result.then((set) => {\n const el = i18n('MessageContainsEmojiPack', [wrapEmojiText(set.set.title)]);\n replaceContent(emojisButton.textElement, el);\n });\n\n return result.cached ? promise : (setPadding(), undefined);\n }\n\n replaceContent(emojisButton.textElement, i18n('MessageContainsEmojiPacks', [s.size]));\n };\n\n if(docs.some((doc) => !doc)) {\n setPadding();\n this.managers.appEmojiManager.getCustomEmojiDocuments(docIds).then(p);\n } else {\n return p(docs);\n }\n });\n // emojisButton.element.append(i18n('Loading'));\n }\n\n this.chat.container.append(element);\n\n return {\n element,\n cleanup: () => {\n this.cleanup();\n reactionsMenu && reactionsMenu.cleanup();\n },\n destroy: () => {\n element.remove();\n reactionsMenu && reactionsMenu.widthContainer.remove();\n },\n menuPadding,\n reactionsMenu,\n reactionsMenuPosition\n };\n }\n\n private async getUrlToMessage() {\n if(this.peerId.isUser()) {\n return;\n }\n\n let threadMessage: Message.message;\n const {peerId, mid} = this;\n const threadId = this.chat.threadId;\n if(this.chat.type === 'discussion') {\n threadMessage = (await this.managers.appMessagesManager.getMessageByPeer(peerId, threadId)) as Message.message;\n }\n\n const username = await this.managers.appPeersManager.getPeerUsername(threadMessage ? threadMessage.fromId : peerId);\n const msgId = getServerMessageId(mid);\n let url = 'https://t.me/';\n if(username) {\n url += username;\n if(threadMessage) url += `/${getServerMessageId(threadMessage.fwd_from.channel_post)}?comment=${msgId}`;\n else if(threadId) url += `/${getServerMessageId(threadId)}/${msgId}`;\n else url += '/' + msgId;\n } else {\n url += 'c/' + peerId.toChatId();\n if(threadMessage) url += `/${msgId}?thread=${getServerMessageId(threadMessage.mid)}`;\n else if(threadId) url += `/${getServerMessageId(threadId)}/${msgId}`;\n else url += '/' + msgId;\n }\n\n return {url, isPrivate: !username};\n }\n\n private async getSelectedMessagesText() {\n if(!isSelectionEmpty()) {\n return '';\n }\n\n const mids = this.chat.selection.isSelecting ?\n [...this.chat.selection.selectedMids.get(this.peerId)].sort((a, b) => a - b) :\n [this.mid];\n\n const parts: string[] = await Promise.all(mids.map(async(mid) => {\n const message = (await this.chat.getMessage(mid)) as Message.message;\n return message?.message ? message.message + '\\n' : '';\n }));\n\n return parts.join('');\n }\n\n private onSendScheduledClick = async() => {\n if(this.chat.selection.isSelecting) {\n simulateClickEvent(this.chat.selection.selectionSendNowBtn);\n } else {\n new PopupSendNow(this.peerId, await this.chat.getMidsByMid(this.mid));\n }\n };\n\n private onReplyClick = () => {\n this.chat.input.initMessageReply(this.mid);\n };\n\n private onFaveStickerClick = (unfave?: boolean) => {\n const docId = ((this.message as Message.message).media as MessageMedia.messageMediaDocument).document.id;\n this.managers.appStickersManager.faveSticker(docId, unfave);\n };\n\n private onEditClick = () => {\n this.chat.input.initMessageEditing(this.mid);\n };\n\n private onCopyClick = async() => {\n if(isSelectionEmpty()) {\n copyTextToClipboard(this.selectedMessagesText);\n } else {\n document.execCommand('copy');\n // cancelSelection();\n }\n };\n\n private onCopyAnchorLinkClick = () => {\n copyTextToClipboard((this.target as HTMLAnchorElement).href);\n };\n\n private onCopyLinkClick = () => {\n const {url, isPrivate} = this.linkToMessage;\n const key: LangPackKey = isPrivate ? 'LinkCopiedPrivateInfo' : 'LinkCopied';\n toast(I18n.format(key, true));\n copyTextToClipboard(url);\n };\n\n private onPinClick = () => {\n new PopupPinMessage(this.peerId, this.mid);\n };\n\n private onUnpinClick = () => {\n new PopupPinMessage(this.peerId, this.mid, true);\n };\n\n private onRetractVote = () => {\n this.managers.appPollsManager.sendVote(this.message as Message.message, []);\n };\n\n private onStopPoll = () => {\n this.managers.appPollsManager.stopPoll(this.message as Message.message);\n };\n\n private onForwardClick = async() => {\n if(this.chat.selection.isSelecting) {\n simulateClickEvent(this.chat.selection.selectionForwardBtn);\n } else {\n const peerId = this.peerId;\n const mids = this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid);\n new PopupForward({\n [peerId]: mids\n });\n }\n };\n\n private onSelectClick = () => {\n this.chat.selection.toggleByElement(findUpClassName(this.target, 'grouped-item') || findUpClassName(this.target, 'bubble'));\n };\n\n private onClearSelectionClick = () => {\n this.chat.selection.cancelSelection();\n };\n\n private onDeleteClick = async() => {\n if(this.chat.selection.isSelecting) {\n simulateClickEvent(this.chat.selection.selectionDeleteBtn);\n } else {\n new PopupDeleteMessages(this.peerId, this.isTargetAGroupedItem ? [this.mid] : await this.chat.getMidsByMid(this.mid), this.chat.type);\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport rootScope from '../../lib/rootScope';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from '../buttonMenu';\n\nexport default class SendMenu {\n public sendMenu: HTMLElement;\n private sendMenuButtons: (ButtonMenuItemOptions & {verify: () => boolean})[];\n private type: 'schedule' | 'reminder';\n\n constructor(options: {\n onSilentClick: () => void,\n onScheduleClick: () => void,\n listenerSetter?: ListenerSetter,\n openSide: string,\n onContextElement: HTMLElement,\n onOpen?: () => boolean\n }) {\n this.sendMenuButtons = [{\n icon: 'mute',\n text: 'Chat.Send.WithoutSound',\n onClick: options.onSilentClick,\n verify: () => this.type === 'schedule'\n }, {\n icon: 'schedule',\n text: 'Chat.Send.ScheduledMessage',\n onClick: options.onScheduleClick,\n verify: () => this.type === 'schedule'\n }, {\n icon: 'schedule',\n text: 'Chat.Send.SetReminder',\n onClick: options.onScheduleClick,\n verify: () => this.type === 'reminder'\n }];\n\n this.sendMenu = ButtonMenuSync({buttons: this.sendMenuButtons, listenerSetter: options.listenerSetter});\n this.sendMenu.classList.add('menu-send', options.openSide);\n\n attachContextMenuListener({\n element: options.onContextElement,\n callback: (e) => {\n if(options.onOpen && !options.onOpen()) {\n return;\n }\n\n this.sendMenuButtons.forEach((button) => {\n button.element.classList.toggle('hide', !button.verify());\n });\n\n cancelEvent(e);\n contextMenuController.openBtnMenu(this.sendMenu);\n },\n listenerSetter: options.listenerSetter\n });\n }\n\n public setPeerId(peerId: PeerId) {\n this.type = peerId === rootScope.myId ? 'reminder' : 'schedule';\n }\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from '../chat/chat';\nimport PopupElement from '.';\nimport CheckboxField from '../checkboxField';\nimport InputField from '../inputField';\nimport RadioField from '../radioField';\nimport Scrollable from '../scrollable';\nimport SendContextMenu from '../chat/sendContextMenu';\nimport I18n, {_i18n} from '../../lib/langPack';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\nimport whichChild from '../../helpers/dom/whichChild';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {Poll} from '../../layer';\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\n\nconst MAX_LENGTH_QUESTION = 255;\nconst MAX_LENGTH_OPTION = 100;\nconst MAX_LENGTH_SOLUTION = 200;\n\nexport default class PopupCreatePoll extends PopupElement {\n private questionInputField: InputField;\n private questions: HTMLElement;\n protected scrollable: Scrollable;\n private tempId = 0;\n\n private anonymousCheckboxField: CheckboxField;\n private multipleCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\n private quizCheckboxField: PopupCreatePoll['anonymousCheckboxField'];\n\n private correctAnswers: Uint8Array[];\n private quizSolutionField: InputField;\n private optionInputFields: InputField[];\n\n constructor(private chat: Chat) {\n super('popup-create-poll popup-new-media', {closable: true, withConfirm: 'Create', body: true, title: 'NewPoll'});\n this.construct();\n }\n\n private async construct() {\n this.questionInputField = new InputField({\n placeholder: 'AskAQuestion',\n label: 'AskAQuestion',\n name: 'question',\n maxLength: MAX_LENGTH_QUESTION\n });\n\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\n this.handleChange();\n });\n\n this.optionInputFields = [];\n\n if(this.chat.type !== 'scheduled') {\n const sendMenu = new SendContextMenu({\n onSilentClick: () => {\n this.chat.input.sendSilent = true;\n this.send();\n },\n onScheduleClick: () => {\n this.chat.input.scheduleSending(() => {\n this.send();\n });\n },\n openSide: 'bottom-left',\n onContextElement: this.btnConfirm\n });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.header.append(sendMenu.sendMenu);\n }\n\n this.header.append(this.questionInputField.container);\n\n const hr = document.createElement('hr');\n const d = document.createElement('div');\n d.classList.add('caption');\n _i18n(d, 'PollOptions');\n\n this.questions = document.createElement('form');\n this.questions.classList.add('poll-create-questions');\n\n const dd = document.createElement('div');\n dd.classList.add('poll-create-settings');\n\n const settingsCaption = document.createElement('div');\n settingsCaption.classList.add('caption');\n _i18n(settingsCaption, 'Settings');\n\n if(!(await this.chat.managers.appPeersManager.isBroadcast(this.chat.peerId))) {\n this.anonymousCheckboxField = new CheckboxField({\n text: 'NewPoll.Anonymous',\n name: 'anonymous'\n });\n this.anonymousCheckboxField.input.checked = true;\n dd.append(this.anonymousCheckboxField.label);\n }\n\n this.multipleCheckboxField = new CheckboxField({\n text: 'NewPoll.MultipleChoice',\n name: 'multiple'\n });\n this.quizCheckboxField = new CheckboxField({\n text: 'NewPoll.Quiz',\n name: 'quiz'\n });\n\n this.listenerSetter.add(this.multipleCheckboxField.input)('change', () => {\n const checked = this.multipleCheckboxField.input.checked;\n this.quizCheckboxField.input.toggleAttribute('disabled', checked);\n });\n\n this.listenerSetter.add(this.quizCheckboxField.input)('change', () => {\n const checked = this.quizCheckboxField.input.checked;\n\n (Array.from(this.questions.children) as HTMLElement[]).map((el) => {\n el.classList.toggle('radio-field', checked);\n });\n\n if(!checked) {\n this.correctAnswers = undefined;\n this.quizSolutionField.setValueSilently('');\n }\n\n quizElements.forEach((el) => el.classList.toggle('hide', !checked));\n\n this.multipleCheckboxField.input.toggleAttribute('disabled', checked);\n this.handleChange();\n });\n\n dd.append(this.multipleCheckboxField.label, this.quizCheckboxField.label);\n\n const quizElements: HTMLElement[] = [];\n\n const quizSolutionCaption = document.createElement('div');\n quizSolutionCaption.classList.add('caption');\n _i18n(quizSolutionCaption, 'AccDescrQuizExplanation');\n\n const quizHr = document.createElement('hr');\n\n const quizSolutionContainer = document.createElement('div');\n quizSolutionContainer.classList.add('poll-create-questions');\n\n this.quizSolutionField = new InputField({\n placeholder: 'NewPoll.Explanation.Placeholder',\n label: 'NewPoll.Explanation.Placeholder',\n name: 'solution',\n maxLength: MAX_LENGTH_SOLUTION\n });\n\n this.listenerSetter.add(this.questionInputField.input)('input', () => {\n this.handleChange();\n });\n\n const quizSolutionSubtitle = document.createElement('div');\n quizSolutionSubtitle.classList.add('subtitle');\n _i18n(quizSolutionSubtitle, 'AddAnExplanationInfo');\n\n quizSolutionContainer.append(this.quizSolutionField.container, quizSolutionSubtitle);\n\n quizElements.push(quizHr, quizSolutionCaption, quizSolutionContainer);\n quizElements.forEach((el) => el.classList.add('hide'));\n\n this.body.parentElement.insertBefore(hr, this.body);\n this.body.append(d, this.questions, document.createElement('hr'), settingsCaption, dd, ...quizElements);\n\n attachClickEvent(this.btnConfirm, this.onSubmitClick, {listenerSetter: this.listenerSetter});\n\n this.scrollable = new Scrollable(this.body);\n this.appendMoreField();\n\n this.onEscape = () => {\n return !this.getFilledAnswers().length;\n };\n\n this.handleChange();\n }\n\n private getFilledAnswers() {\n const answers = Array.from(this.questions.children).map((el, idx) => {\n const input = el.querySelector('.input-field-input') as HTMLElement;\n return input instanceof HTMLInputElement ? input.value : getRichValueWithCaret(input, false, false).value;\n }).filter((v) => !!v.trim());\n\n return answers;\n }\n\n private onSubmitClick = () => {\n this.send();\n };\n\n private validate() {\n const question = this.questionInputField.value;\n if(!question) {\n return false;\n }\n\n if(question.length > MAX_LENGTH_QUESTION) {\n return false;\n }\n\n if(this.quizCheckboxField.input.checked && !this.correctAnswers?.length) {\n return false;\n }\n\n const answers = this.getFilledAnswers();\n if(answers.length < 2) {\n return false;\n }\n\n const tooLongOption = answers.find((a) => a.length > MAX_LENGTH_OPTION);\n if(tooLongOption) {\n return false;\n }\n\n const {value: quizSolution} = getRichValueWithCaret(this.quizSolutionField.input, false, false);\n if(quizSolution.length > MAX_LENGTH_SOLUTION) {\n return false;\n }\n\n return true;\n }\n\n private handleChange() {\n const valid = this.validate();\n this.btnConfirm.toggleAttribute('disabled', !valid);\n }\n\n public async send(force = false) {\n const question = this.questionInputField.value;\n\n const answers = this.getFilledAnswers();\n\n const {value: quizSolution, entities: quizSolutionEntities} = getRichValueWithCaret(this.quizSolutionField.input, true, false);\n\n if(this.chat.type === 'scheduled' && !force) {\n this.chat.input.scheduleSending(() => {\n this.send(true);\n });\n\n return;\n }\n\n this.hide();\n\n // const randomID = [nextRandomInt(0xFFFFFFFF), nextRandomInt(0xFFFFFFFF)];\n // const randomIDS = bigint(randomID[0]).shiftLeft(32).add(bigint(randomID[1])).toString();\n\n const pFlags: Poll['pFlags'] = {};\n\n if(this.anonymousCheckboxField && !this.anonymousCheckboxField.input.checked) {\n pFlags.public_voters = true;\n }\n\n if(this.multipleCheckboxField.input.checked) {\n pFlags.multiple_choice = true;\n }\n\n if(this.quizCheckboxField.input.checked) {\n pFlags.quiz = true;\n }\n\n const poll: Poll = {\n _: 'poll',\n pFlags,\n question,\n answers: answers.map((value, idx) => {\n return {\n _: 'pollAnswer',\n text: value,\n option: new Uint8Array([idx])\n };\n }),\n id: undefined\n };\n // poll.id = randomIDS;\n\n const inputMediaPoll = await this.chat.managers.appPollsManager.getInputMediaPoll(poll, this.correctAnswers, quizSolution, quizSolutionEntities);\n\n // console.log('Will try to create poll:', inputMediaPoll);\n\n this.chat.managers.appMessagesManager.sendOther(this.chat.peerId, inputMediaPoll, {\n ...this.chat.getMessageSendingParams()\n });\n\n if(this.chat.input.helperType === 'reply') {\n this.chat.input.clearHelper();\n }\n\n this.chat.input.onMessageSent(false, false);\n }\n\n onInput = (e: Event) => {\n const target = e.target as HTMLInputElement;\n\n const radioLabel = findUpTag(target, 'LABEL');\n const isEmpty = isInputEmpty(target);\n if(!isEmpty) {\n target.parentElement.classList.add('is-filled');\n radioLabel.classList.remove('hidden-widget');\n radioLabel.firstElementChild.removeAttribute('disabled');\n }\n\n const isLast = !radioLabel.nextElementSibling;\n if(isLast && !isEmpty && this.questions.childElementCount < 10) {\n this.appendMoreField();\n }\n\n this.handleChange();\n };\n\n onDeleteClick = (e: MouseEvent) => {\n const target = e.target as HTMLSpanElement;\n const label = findUpTag(target, 'LABEL');\n const idx = whichChild(label);\n\n if(this.correctAnswers && this.correctAnswers[0][0] === idx) {\n this.correctAnswers = undefined;\n }\n\n label.remove();\n this.optionInputFields.splice(idx, 1);\n\n this.optionInputFields.forEach((inputField, idx) => {\n inputField.options.labelOptions.length = 0;\n inputField.options.labelOptions.push(idx + 1);\n const i18nElement = I18n.weakMap.get(inputField.label.firstElementChild as HTMLElement);\n i18nElement.update();\n });\n\n this.handleChange();\n };\n\n private appendMoreField() {\n const tempId = this.tempId++;\n const idx = this.questions.childElementCount + 1;\n const questionField = new InputField({\n placeholder: 'NewPoll.OptionsAddOption',\n label: 'NewPoll.OptionLabel',\n labelOptions: [idx],\n name: 'question-' + tempId,\n maxLength: MAX_LENGTH_OPTION\n });\n this.listenerSetter.add(questionField.input)('input', this.onInput);\n\n const radioField = new RadioField({\n text: '',\n name: 'question'\n });\n radioField.main.append(questionField.container);\n attachClickEvent(questionField.input, cancelEvent, {listenerSetter: this.listenerSetter});\n radioField.label.classList.add('hidden-widget');\n radioField.input.disabled = true;\n if(!this.quizCheckboxField.input.checked) {\n radioField.label.classList.remove('radio-field');\n }\n this.listenerSetter.add(radioField.input)('change', () => {\n const checked = radioField.input.checked;\n if(checked) {\n const idx = whichChild(radioField.label);\n this.correctAnswers = [new Uint8Array([idx])];\n this.handleChange();\n }\n });\n\n const deleteBtn = document.createElement('span');\n deleteBtn.classList.add('btn-icon', 'tgico-close');\n questionField.container.append(deleteBtn);\n\n attachClickEvent(deleteBtn, this.onDeleteClick, {listenerSetter: this.listenerSetter, once: true});\n\n this.questions.append(radioField.label);\n\n this.scrollable.scrollIntoViewNew({\n element: this.questions.lastElementChild as HTMLElement,\n position: 'center'\n });\n // this.scrollable.scrollTo(this.scrollable.scrollHeight, 'top', true, true);\n\n this.optionInputFields.push(questionField);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pause from './schedulers/pause';\nimport {makeMediaSize} from './mediaSize';\nimport scaleMediaElement from './canvas/scaleMediaElement';\nimport preloadVideo from './preloadVideo';\n\nexport function createPosterFromMedia(media: HTMLVideoElement | HTMLImageElement) {\n let width: number, height: number;\n if(media instanceof HTMLVideoElement) {\n width = media.videoWidth;\n height = media.videoHeight;\n } else {\n width = media.naturalWidth;\n height = media.naturalHeight;\n }\n\n return scaleMediaElement({\n media,\n mediaSize: makeMediaSize(width, height),\n boxSize: makeMediaSize(320, 240),\n quality: .9\n });\n}\n\nexport function createPosterFromVideo(video: HTMLVideoElement): ReturnType {\n return new Promise((resolve, reject) => {\n video.onseeked = () => {\n video.onseeked = () => {\n createPosterFromMedia(video).then(resolve);\n\n video.onseeked = undefined;\n };\n\n video.currentTime = 0;\n };\n\n video.onerror = reject;\n video.currentTime = Math.min(video.duration, 1);\n });\n}\n\nexport async function createPosterForVideo(url: string) {\n const video = await preloadVideo(url);\n\n return Promise.race([\n pause(2000) as Promise,\n createPosterFromVideo(video)\n ]);\n}\n\n\n","/**\n * @returns duration in ms\n */\nexport default function getGifDuration(image: HTMLImageElement) {\n const src = image.src;\n\n return fetch(src)\n .then((response) => response.arrayBuffer())\n .then((arrayBuffer) => {\n const d = new Uint8Array(arrayBuffer);\n // Thanks to http://justinsomnia.org/2006/10/gif-animation-duration-calculation/\n // And http://www.w3.org/Graphics/GIF/spec-gif89a.txt\n let duration = 0;\n for(let i = 0, length = d.length; i < length; ++i) {\n // Find a Graphic Control Extension hex(21F904__ ____ __00)\n if(d[i] == 0x21 &&\n d[i + 1] == 0xF9 &&\n d[i + 2] == 0x04 &&\n d[i + 7] == 0x00) {\n // Swap 5th and 6th bytes to get the delay per frame\n const delay = (d[i + 5] << 8) | (d[i + 4] & 0xFF);\n\n // Should be aware browsers have a minimum frame delay\n // e.g. 6ms for IE, 2ms modern browsers (50fps)\n duration += delay < 2 ? 10 : delay;\n }\n }\n\n return duration / 1000;\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from '../chat/chat';\nimport type {SendFileDetails} from '../../lib/appManagers/appMessagesManager';\nimport InputField from '../inputField';\nimport PopupElement from '.';\nimport Scrollable from '../scrollable';\nimport {toast} from '../toast';\nimport CheckboxField from '../checkboxField';\nimport SendContextMenu from '../chat/sendContextMenu';\nimport {createPosterFromMedia, createPosterFromVideo} from '../../helpers/createPoster';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport I18n, {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\nimport calcImageInBox from '../../helpers/calcImageInBox';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport getGifDuration from '../../helpers/getGifDuration';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport createVideo from '../../helpers/dom/createVideo';\nimport prepareAlbum from '../prepareAlbum';\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\nimport {ThumbCache} from '../../lib/storages/thumbs';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport {THUMB_TYPE_FULL} from '../../lib/mtproto/mtproto_config';\nimport wrapDocument from '../wrappers/document';\nimport createContextMenu from '../../helpers/dom/createContextMenu';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport wrapMediaSpoiler, {toggleMediaSpoiler} from '../wrappers/mediaSpoiler';\nimport {MiddlewareHelper} from '../../helpers/middleware';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport scaleMediaElement from '../../helpers/canvas/scaleMediaElement';\nimport {doubleRaf} from '../../helpers/schedulers';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport {Photo, PhotoSize} from '../../layer';\nimport {getPreviewBytesFromURL} from '../../helpers/bytes/getPreviewURLFromBytes';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\n\ntype SendFileParams = SendFileDetails & {\n file?: File,\n scaledBlob?: Blob,\n noSound?: boolean,\n itemDiv: HTMLElement,\n mediaSpoiler?: HTMLElement,\n middlewareHelper: MiddlewareHelper\n // strippedBytes?: PhotoSize.photoStrippedSize['bytes']\n};\n\nlet currentPopup: PopupNewMedia;\n\nexport function getCurrentNewMediaPopup() {\n return currentPopup;\n}\n\nexport default class PopupNewMedia extends PopupElement {\n private input: HTMLElement;\n private mediaContainer: HTMLElement;\n private groupCheckboxField: CheckboxField;\n private mediaCheckboxField: CheckboxField;\n private wasInputValue: string;\n\n private willAttach: Partial<{\n type: 'media' | 'document',\n isMedia: true,\n group: boolean,\n sendFileDetails: SendFileParams[]\n }>;\n private inputField: InputField;\n private captionLengthMax: number;\n\n private animationGroup: AnimationItemGroup;\n\n constructor(\n private chat: Chat,\n private files: File[],\n willAttachType: PopupNewMedia['willAttach']['type']\n ) {\n super('popup-send-photo popup-new-media', {\n closable: true,\n withConfirm: 'Modal.Send',\n confirmShortcutIsSendShortcut: true,\n body: true,\n title: true\n });\n\n this.animationGroup = '';\n this.construct(willAttachType);\n }\n\n private async construct(willAttachType: PopupNewMedia['willAttach']['type']) {\n this.willAttach = {\n type: willAttachType,\n sendFileDetails: [],\n group: false\n };\n\n const captionMaxLength = await this.managers.apiManager.getLimit('caption');\n this.captionLengthMax = captionMaxLength;\n\n attachClickEvent(this.btnConfirm, () => this.send(), {listenerSetter: this.listenerSetter});\n\n if(this.chat.type !== 'scheduled') {\n const sendMenu = new SendContextMenu({\n onSilentClick: () => {\n this.chat.input.sendSilent = true;\n this.send();\n },\n onScheduleClick: () => {\n this.chat.input.scheduleSending(() => {\n this.send();\n });\n },\n openSide: 'bottom-left',\n onContextElement: this.btnConfirm,\n listenerSetter: this.listenerSetter\n });\n\n sendMenu.setPeerId(this.chat.peerId);\n\n this.header.append(sendMenu.sendMenu);\n }\n\n this.mediaContainer = document.createElement('div');\n this.mediaContainer.classList.add('popup-photo');\n const scrollable = new Scrollable(null);\n scrollable.container.append(this.mediaContainer);\n\n this.inputField = new InputField({\n placeholder: 'PreviewSender.CaptionPlaceholder',\n label: 'Caption',\n name: 'photo-caption',\n maxLength: this.captionLengthMax,\n withLinebreaks: true\n });\n this.input = this.inputField.input;\n\n this.inputField.value = this.wasInputValue = this.chat.input.messageInputField.input.innerHTML;\n this.chat.input.messageInputField.value = '';\n\n this.body.append(scrollable.container);\n this.container.append(this.inputField.container);\n\n this.attachFiles();\n\n this.addEventListener('close', () => {\n this.files.length = 0;\n this.willAttach.sendFileDetails.length = 0;\n\n if(currentPopup === this) {\n currentPopup = undefined;\n }\n });\n\n let target: HTMLElement, isMedia: boolean, item: SendFileParams;\n createContextMenu({\n buttons: [{\n icon: 'mediaspoiler',\n text: 'EnablePhotoSpoiler',\n onClick: () => {\n this.applyMediaSpoiler(item);\n },\n verify: () => isMedia && !item.mediaSpoiler\n }, {\n icon: 'mediaspoileroff',\n text: 'DisablePhotoSpoiler',\n onClick: () => {\n toggleMediaSpoiler({\n mediaSpoiler: item.mediaSpoiler,\n reveal: true,\n destroyAfter: true\n });\n\n item.mediaSpoiler = undefined;\n },\n verify: () => !!(isMedia && item.mediaSpoiler)\n }],\n listenTo: this.mediaContainer,\n listenerSetter: this.listenerSetter,\n findElement: (e) => {\n target = findUpClassName(e.target, 'popup-item');\n isMedia = target.classList.contains('popup-item-media');\n item = this.willAttach.sendFileDetails.find((i) => i.itemDiv === target);\n return target;\n }\n });\n\n currentPopup = this;\n }\n\n private async applyMediaSpoiler(item: SendFileParams, noAnimation?: boolean) {\n const middleware = item.middlewareHelper.get();\n const {width: widthStr, height: heightStr} = item.itemDiv.style;\n\n let width: number, height: number;\n if(item.itemDiv.classList.contains('album-item')) {\n const {width: containerWidthStr, height: containerHeightStr} = item.itemDiv.parentElement.style;\n const containerWidth = parseInt(containerWidthStr);\n const containerHeight = parseInt(containerHeightStr);\n\n width = +widthStr.slice(0, -1) / 100 * containerWidth;\n height = +heightStr.slice(0, -1) / 100 * containerHeight;\n } else {\n width = parseInt(widthStr);\n height = parseInt(heightStr);\n }\n\n const {url} = await scaleMediaElement({\n media: item.itemDiv.firstElementChild as HTMLImageElement,\n boxSize: makeMediaSize(40, 40),\n mediaSize: makeMediaSize(width, height),\n toDataURL: true,\n quality: 0.2\n });\n\n const strippedBytes = getPreviewBytesFromURL(url);\n const photoSize: PhotoSize.photoStrippedSize = {\n _: 'photoStrippedSize',\n bytes: strippedBytes,\n type: 'i'\n };\n\n item.strippedBytes = strippedBytes;\n\n const photo: Photo.photo = {\n _: 'photo',\n sizes: [\n photoSize\n ],\n id: 0,\n access_hash: 0,\n date: 0,\n dc_id: 0,\n file_reference: []\n };\n\n const mediaSpoiler = await wrapMediaSpoiler({\n middleware,\n width,\n height,\n animationGroup: this.animationGroup,\n media: photo\n });\n\n if(!middleware()) {\n return;\n }\n\n if(!noAnimation) {\n mediaSpoiler.classList.add('is-revealing');\n }\n\n item.mediaSpoiler = mediaSpoiler;\n item.itemDiv.append(mediaSpoiler);\n\n await doubleRaf();\n if(!middleware()) {\n return;\n }\n\n toggleMediaSpoiler({\n mediaSpoiler,\n reveal: false\n });\n }\n\n public appendDrops(element: HTMLElement) {\n this.body.append(element);\n }\n\n get type() {\n return this.willAttach.type;\n }\n\n set type(type: PopupNewMedia['willAttach']['type']) {\n this.willAttach.type = type;\n }\n\n private appendGroupCheckboxField() {\n const good = this.files.length > 1;\n if(good && !this.groupCheckboxField) {\n this.groupCheckboxField = new CheckboxField({\n text: 'PreviewSender.GroupItems',\n name: 'group-items'\n });\n this.container.append(...[\n this.groupCheckboxField.label,\n this.mediaCheckboxField?.label,\n this.inputField.container\n ].filter(Boolean));\n\n this.willAttach.group = true;\n this.groupCheckboxField.setValueSilently(this.willAttach.group);\n\n this.listenerSetter.add(this.groupCheckboxField.input)('change', () => {\n const checked = this.groupCheckboxField.checked;\n\n this.willAttach.group = checked;\n\n this.attachFiles();\n });\n } else if(this.groupCheckboxField) {\n this.groupCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n private appendMediaCheckboxField() {\n const good = !!this.files.find((file) => MEDIA_MIME_TYPES_SUPPORTED.has(file.type));\n if(good && !this.mediaCheckboxField) {\n this.mediaCheckboxField = new CheckboxField({\n text: 'PreviewSender.CompressFile',\n name: 'compress-items'\n });\n this.container.append(...[\n this.groupCheckboxField?.label,\n this.mediaCheckboxField.label,\n this.inputField.container\n ].filter(Boolean));\n\n this.mediaCheckboxField.setValueSilently(this.willAttach.type === 'media');\n\n this.listenerSetter.add(this.mediaCheckboxField.input)('change', () => {\n const checked = this.mediaCheckboxField.checked;\n\n this.willAttach.type = checked ? 'media' : 'document';\n\n this.attachFiles();\n });\n } else if(this.mediaCheckboxField) {\n this.mediaCheckboxField.label.classList.toggle('hide', !good);\n }\n }\n\n public addFiles(files: File[]) {\n const toPush = files.filter((file) => {\n const found = this.files.find((_file) => {\n return _file.lastModified === file.lastModified && _file.name === file.name && _file.size === file.size;\n });\n\n return !found;\n });\n\n if(toPush.length) {\n this.files.push(...toPush);\n this.attachFiles();\n }\n }\n\n private onKeyDown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n if(target !== this.input) {\n if(target.tagName === 'INPUT' || target.isContentEditable) {\n return;\n }\n\n this.input.focus();\n placeCaretAtEnd(this.input);\n }\n };\n\n private send(force = false) {\n if(this.chat.type === 'scheduled' && !force) {\n this.chat.input.scheduleSending(() => {\n this.send(true);\n });\n\n return;\n }\n\n let caption = this.inputField.value;\n if(caption.length > this.captionLengthMax) {\n toast(I18n.format('Error.PreviewSender.CaptionTooLong', true));\n return;\n }\n\n const willAttach = this.willAttach;\n willAttach.isMedia = willAttach.type === 'media' || undefined;\n const {sendFileDetails, isMedia} = willAttach;\n\n const {peerId, input} = this.chat;\n\n const {length} = sendFileDetails;\n const sendingParams = this.chat.getMessageSendingParams();\n this.iterate((sendFileParams) => {\n if(caption && sendFileParams.length !== length) {\n this.managers.appMessagesManager.sendText(peerId, caption, {\n ...sendingParams,\n clearDraft: true\n });\n\n caption = undefined;\n }\n\n const d: SendFileDetails[] = sendFileParams.map((params) => {\n return {\n ...params,\n file: params.scaledBlob || params.file,\n spoiler: !!params.mediaSpoiler\n };\n });\n\n const w = {\n ...willAttach,\n sendFileDetails: d\n };\n\n this.managers.appMessagesManager.sendAlbum(peerId, Object.assign({\n ...sendingParams,\n caption,\n isMedia,\n clearDraft: true\n }, w));\n\n caption = undefined;\n });\n\n input.replyToMsgId = this.chat.threadId;\n input.onMessageSent();\n\n this.hide();\n }\n\n private async scaleImageForTelegram(image: HTMLImageElement, params: SendFileParams) {\n const PHOTO_SIDE_LIMIT = 2560;\n const mimeType = params.file.type;\n let url = image.src, scaledBlob: Blob;\n if(mimeType !== 'image/gif' && Math.max(image.naturalWidth, image.naturalHeight) > PHOTO_SIDE_LIMIT) {\n const {blob} = await scaleMediaElement({\n media: image,\n boxSize: makeMediaSize(PHOTO_SIDE_LIMIT, PHOTO_SIDE_LIMIT),\n mediaSize: makeMediaSize(image.naturalWidth, image.naturalHeight),\n mimeType: mimeType as any\n });\n\n scaledBlob = blob;\n URL.revokeObjectURL(url);\n url = await apiManagerProxy.invoke('createObjectURL', blob);\n await renderImageFromUrlPromise(image, url);\n }\n\n params.objectURL = url;\n params.scaledBlob = scaledBlob;\n }\n\n private async attachMedia(params: SendFileParams) {\n const {itemDiv} = params;\n itemDiv.classList.add('popup-item-media');\n\n const file = params.file;\n const isVideo = file.type.startsWith('video/');\n\n let promise: Promise;\n if(isVideo) {\n const video = createVideo();\n const source = document.createElement('source');\n source.src = params.objectURL = await apiManagerProxy.invoke('createObjectURL', file);\n video.autoplay = true;\n video.controls = false;\n video.muted = true;\n\n video.addEventListener('timeupdate', () => {\n video.pause();\n }, {once: true});\n\n promise = onMediaLoad(video).then(async() => {\n params.width = video.videoWidth;\n params.height = video.videoHeight;\n params.duration = Math.floor(video.duration);\n\n const audioDecodedByteCount = (video as any).webkitAudioDecodedByteCount;\n if(audioDecodedByteCount !== undefined) {\n params.noSound = !audioDecodedByteCount;\n }\n\n itemDiv.append(video);\n const thumb = await createPosterFromVideo(video);\n params.thumb = {\n url: await apiManagerProxy.invoke('createObjectURL', thumb.blob),\n ...thumb\n };\n });\n\n video.append(source);\n } else {\n const img = new Image();\n const url = await apiManagerProxy.invoke('createObjectURL', file);\n await renderImageFromUrlPromise(img, url);\n\n await this.scaleImageForTelegram(img, params);\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n\n itemDiv.append(img);\n\n if(file.type === 'image/gif') {\n params.noSound = true;\n\n return Promise.all([\n getGifDuration(img).then((duration) => {\n params.duration = Math.ceil(duration);\n }),\n\n createPosterFromMedia(img).then(async(thumb) => {\n params.thumb = {\n url: await apiManagerProxy.invoke('createObjectURL', thumb.blob),\n ...thumb\n };\n })\n ]);\n }\n }\n\n return promise;\n }\n\n private async attachDocument(params: SendFileParams): ReturnType {\n const {itemDiv} = params;\n itemDiv.classList.add('popup-item-document');\n const file = params.file;\n\n const isPhoto = file.type.startsWith('image/');\n const isAudio = file.type.startsWith('audio/');\n if(isPhoto || isAudio || file.size < 20e6) {\n params.objectURL ||= await apiManagerProxy.invoke('createObjectURL', file);\n }\n\n let img: HTMLImageElement;\n if(isPhoto) {\n img = new Image();\n await renderImageFromUrlPromise(img, params.objectURL);\n await this.scaleImageForTelegram(img, params);\n params.scaledBlob = undefined;\n }\n\n const doc = {\n _: 'document',\n file: file,\n file_name: file.name || '',\n size: file.size,\n type: isPhoto ? 'photo' : 'doc'\n } as MyDocument;\n\n let cacheContext: ThumbCache;\n if(params.objectURL) {\n cacheContext = {\n url: params.objectURL,\n downloaded: file.size,\n type: THUMB_TYPE_FULL\n };\n }\n\n const docDiv = await wrapDocument({\n message: {\n _: 'message',\n pFlags: {\n is_outgoing: true\n },\n mid: 0,\n peerId: 0,\n media: {\n _: 'messageMediaDocument',\n document: doc\n }\n } as any,\n cacheContext\n });\n\n if(isPhoto) {\n params.width = img.naturalWidth;\n params.height = img.naturalHeight;\n }\n\n itemDiv.append(docDiv);\n }\n\n private attachFile = (file: File) => {\n const willAttach = this.willAttach;\n const shouldCompress = this.shouldCompress(file.type);\n\n const itemDiv = document.createElement('div');\n itemDiv.classList.add('popup-item');\n\n const params: SendFileParams = {\n file\n } as any;\n\n // do not pass these properties to worker\n defineNotNumerableProperties(params, ['scaledBlob', 'middlewareHelper', 'itemDiv', 'mediaSpoiler']);\n\n params.middlewareHelper = this.middlewareHelper.get().create();\n params.itemDiv = itemDiv;\n\n const promise = shouldCompress ? this.attachMedia(params) : this.attachDocument(params);\n willAttach.sendFileDetails.push(params);\n return promise;\n };\n\n private shouldCompress(mimeType: string) {\n return this.willAttach.type === 'media' && MEDIA_MIME_TYPES_SUPPORTED.has(mimeType);\n }\n\n private onRender() {\n // show now\n if(!this.element.classList.contains('active')) {\n this.listenerSetter.add(document.body)('keydown', this.onKeyDown);\n this.addEventListener('close', () => {\n if(this.wasInputValue) {\n this.chat.input.messageInputField.value = this.wasInputValue;\n }\n });\n this.show();\n }\n }\n\n private setTitle() {\n const {willAttach, title, files} = this;\n let key: LangPackKey;\n const args: FormatterArguments = [];\n if(willAttach.type === 'document') {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else {\n let foundPhotos = 0, foundVideos = 0, foundFiles = 0;\n files.forEach((file) => {\n if(file.type.startsWith('image/')) ++foundPhotos;\n else if(file.type.startsWith('video/')) ++foundVideos;\n else ++foundFiles;\n });\n\n if([foundPhotos, foundVideos, foundFiles].filter((n) => n > 0).length > 1) {\n key = 'PreviewSender.SendFile';\n args.push(files.length);\n } else\n\n /* const sum = foundPhotos + foundVideos;\n if(sum > 1 && willAttach.group) {\n key = 'PreviewSender.SendAlbum';\n const albumsLength = Math.ceil(sum / 10);\n args.push(albumsLength);\n } else */if(foundPhotos) {\n key = 'PreviewSender.SendPhoto';\n args.push(foundPhotos);\n } else if(foundVideos) {\n key = 'PreviewSender.SendVideo';\n args.push(foundVideos);\n }\n }\n\n replaceContent(title, i18n(key, args));\n }\n\n private appendMediaToContainer(params: SendFileParams) {\n if(this.shouldCompress(params.file.type)) {\n const size = calcImageInBox(params.width, params.height, 380, 320);\n params.itemDiv.style.width = size.width + 'px';\n params.itemDiv.style.height = size.height + 'px';\n }\n\n this.mediaContainer.append(params.itemDiv);\n }\n\n private iterate(cb: (sendFileDetails: SendFileParams[]) => void) {\n const {sendFileDetails} = this.willAttach;\n if(!this.willAttach.group) {\n sendFileDetails.forEach((p) => cb([p]));\n return;\n }\n\n const length = sendFileDetails.length;\n for(let i = 0; i < length;) {\n const firstType = sendFileDetails[i].file.type;\n let k = 0;\n for(; k < 10 && i < length; ++i, ++k) {\n const type = sendFileDetails[i].file.type;\n if(this.shouldCompress(firstType) !== this.shouldCompress(type)) {\n break;\n }\n }\n\n cb(sendFileDetails.slice(i - k, i));\n }\n }\n\n private attachFiles() {\n const {files, willAttach, mediaContainer} = this;\n\n const oldSendFileDetails = willAttach.sendFileDetails.splice(0, willAttach.sendFileDetails.length);\n oldSendFileDetails.forEach((params) => {\n params.middlewareHelper.destroy();\n });\n\n this.appendGroupCheckboxField();\n this.appendMediaCheckboxField();\n\n const promises = files.map((file) => this.attachFile(file));\n\n Promise.all(promises).then(() => {\n mediaContainer.replaceChildren();\n\n if(!files.length) {\n return;\n }\n\n this.setTitle();\n\n this.iterate((sendFileDetails) => {\n const shouldCompress = this.shouldCompress(sendFileDetails[0].file.type);\n if(shouldCompress && sendFileDetails.length > 1) {\n const albumContainer = document.createElement('div');\n albumContainer.classList.add('popup-item-album', 'popup-item');\n albumContainer.append(...sendFileDetails.map((s) => s.itemDiv));\n\n prepareAlbum({\n container: albumContainer,\n items: sendFileDetails.map((o) => ({w: o.width, h: o.height})),\n maxWidth: 380,\n minWidth: 100,\n spacing: 4\n });\n\n mediaContainer.append(albumContainer);\n } else {\n sendFileDetails.forEach((params) => {\n this.appendMediaToContainer(params);\n });\n }\n\n if(!shouldCompress) {\n return;\n }\n\n sendFileDetails.forEach((params) => {\n const oldParams = oldSendFileDetails.find((o) => o.file === params.file);\n if(!oldParams) {\n return;\n }\n\n if(oldParams.mediaSpoiler) {\n this.applyMediaSpoiler(params, true);\n }\n });\n });\n }).then(() => {\n this.onRender();\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport fastSmoothScroll from '../fastSmoothScroll';\nimport cancelEvent from './cancelEvent';\nimport {attachClickEvent, detachClickEvent} from './clickEvent';\nimport findUpAsChild from './findUpAsChild';\nimport findUpClassName from './findUpClassName';\n\ntype ArrowKey = 'ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight';\nconst HANDLE_EVENT = 'keydown';\nconst ACTIVE_CLASS_NAME = 'active';\n\nconst AXIS_Y_KEYS: ArrowKey[] = ['ArrowUp', 'ArrowDown'];\nconst AXIS_X_KEYS: ArrowKey[] = ['ArrowLeft', 'ArrowRight'];\n\nexport type ListNavigationOptions = {\n list: HTMLElement,\n type: 'xy' | 'x' | 'y',\n onSelect: (target: Element) => void | boolean | Promise,\n once: boolean,\n waitForKey?: string[]\n};\n\nexport default function attachListNavigation({list, type, onSelect, once, waitForKey}: ListNavigationOptions) {\n let waitForKeySet = waitForKey?.length ? new Set(waitForKey) : undefined;\n const keyNames = new Set(type === 'xy' ? AXIS_Y_KEYS.concat(AXIS_X_KEYS) : (type === 'x' ? AXIS_X_KEYS : AXIS_Y_KEYS));\n\n let target: Element;\n const getCurrentTarget = () => {\n return target || list.querySelector('.' + ACTIVE_CLASS_NAME) || list.firstElementChild;\n };\n\n const setCurrentTarget = (_target: Element, scrollTo: boolean) => {\n if(target === _target) {\n return;\n }\n\n let hadTarget = false;\n if(target) {\n hadTarget = true;\n target.classList.remove(ACTIVE_CLASS_NAME);\n }\n\n target = _target;\n if(!target) return;\n target.classList.add(ACTIVE_CLASS_NAME);\n\n if(hadTarget && scrollable && scrollTo) {\n fastSmoothScroll({\n container: scrollable,\n element: target as HTMLElement,\n position: 'center',\n forceDuration: 100,\n axis: type === 'x' ? 'x' : 'y'\n });\n }\n };\n\n const getNextTargetX = (currentTarget: Element, isNext: boolean) => {\n let nextTarget: Element;\n if(isNext) nextTarget = currentTarget.nextElementSibling || list.firstElementChild;\n else nextTarget = currentTarget.previousElementSibling || list.lastElementChild;\n\n return nextTarget;\n };\n\n const getNextTargetY = (currentTarget: Element, isNext: boolean) => {\n const property = isNext ? 'nextElementSibling' : 'previousElementSibling';\n const endProperty = isNext ? 'firstElementChild' : 'lastElementChild';\n const currentRect = currentTarget.getBoundingClientRect();\n\n let nextTarget = currentTarget[property] || list[endProperty];\n while(nextTarget !== currentTarget) {\n const targetRect = nextTarget.getBoundingClientRect();\n if(targetRect.x === currentRect.x && targetRect.y !== currentRect.y) {\n break;\n }\n\n nextTarget = nextTarget[property] || list[endProperty];\n }\n\n return nextTarget;\n };\n\n let handleArrowKey: (currentTarget: Element, key: ArrowKey) => Element;\n if(type === 'xy') { // flex-direction: row; flex-wrap: wrap;\n handleArrowKey = (currentTarget, key) => {\n if(key === 'ArrowUp' || key === 'ArrowDown') return getNextTargetY(currentTarget, key === 'ArrowDown');\n else return getNextTargetX(currentTarget, key === 'ArrowRight');\n };\n } else { // flex-direction: row | column;\n handleArrowKey = (currentTarget, key) => getNextTargetX(currentTarget, key === 'ArrowRight' || key === 'ArrowDown');\n }\n\n let onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n if(!keyNames.has(key as any)) {\n if(key === 'Enter' || (type !== 'xy' && key === 'Tab')) {\n cancelEvent(e);\n fireSelect(getCurrentTarget());\n }\n\n return;\n }\n\n cancelEvent(e);\n\n if(list.childElementCount > 1) {\n let currentTarget = getCurrentTarget();\n currentTarget = handleArrowKey(currentTarget, key as any);\n setCurrentTarget(currentTarget, true);\n }\n };\n\n const scrollable = findUpClassName(list, 'scrollable');\n list.classList.add('navigable-list');\n\n const onMouseMove = (e: MouseEvent) => {\n const target = findUpAsChild(e.target as HTMLElement, list) as HTMLElement;\n if(!target) {\n return;\n }\n\n setCurrentTarget(target, false);\n };\n\n const onClick = (e: Event) => {\n cancelEvent(e); // cancel keyboard closening\n\n const target = findUpAsChild(e.target as HTMLElement, list) as HTMLElement;\n if(!target) {\n return;\n }\n\n setCurrentTarget(target, false);\n fireSelect(getCurrentTarget());\n };\n\n const fireSelect = async(target: Element) => {\n const canContinue = await onSelect(target);\n if(canContinue !== undefined ? !canContinue : once) {\n detach();\n }\n };\n\n let attached = false;\n const attach = () => {\n if(attached) return;\n attached = true;\n // const input = document.activeElement as HTMLElement;\n // input.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\n list.addEventListener('mousemove', onMouseMove, {passive: true});\n attachClickEvent(list, onClick);\n };\n\n const detach = () => {\n if(!attached) return;\n attached = false;\n // input.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\n list.removeEventListener('mousemove', onMouseMove);\n detachClickEvent(list, onClick);\n };\n\n const resetTarget = () => {\n if(waitForKeySet) return;\n setCurrentTarget(list.firstElementChild, false);\n };\n\n if(waitForKeySet) {\n const _onKeyDown = onKeyDown;\n onKeyDown = (e) => {\n if(waitForKeySet.has(e.key)) {\n cancelEvent(e);\n\n document.removeEventListener(HANDLE_EVENT, onKeyDown, {capture: true});\n onKeyDown = _onKeyDown;\n document.addEventListener(HANDLE_EVENT, onKeyDown, {capture: true, passive: false});\n\n waitForKeySet = undefined;\n resetTarget();\n }\n };\n } else {\n resetTarget();\n }\n\n attach();\n\n return {\n attach,\n detach,\n resetTarget\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport attachListNavigation, {ListNavigationOptions} from '../../helpers/dom/attachListNavigation';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport rootScope from '../../lib/rootScope';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport SetTransition from '../singleTransition';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport safeAssign from '../../helpers/object/safeAssign';\n\nexport default class AutocompleteHelper extends EventListenerBase<{\n hidden: () => void,\n visible: () => void,\n hiding: () => void\n}> {\n protected hidden = true;\n protected container: HTMLElement;\n protected list: HTMLElement;\n protected resetTarget: () => void;\n protected attach: () => void;\n protected detach: () => void;\n protected init?(): void;\n\n protected controller: AutocompleteHelperController;\n protected listType: 'xy' | 'x' | 'y';\n protected onSelect: ListNavigationOptions['onSelect'];\n protected waitForKey?: string[];\n\n protected navigationItem: NavigationItem;\n\n constructor(options: {\n appendTo: HTMLElement,\n controller?: AutocompleteHelper['controller'],\n listType: AutocompleteHelper['listType'],\n onSelect: AutocompleteHelper['onSelect'],\n waitForKey?: AutocompleteHelper['waitForKey']\n }) {\n super(false);\n\n safeAssign(this, options);\n\n this.container = document.createElement('div');\n this.container.classList.add('autocomplete-helper', 'z-depth-1');\n\n options.appendTo.append(this.container);\n\n this.attachNavigation();\n\n this.controller && this.controller.addHelper(this);\n }\n\n public toggleListNavigation(enabled: boolean) {\n if(enabled) {\n this.attach && this.attach();\n } else {\n this.detach && this.detach();\n }\n }\n\n protected onVisible = () => {\n if(this.detach) { // it can be so because 'visible' calls before animation's end\n this.detach();\n }\n\n const list = this.list;\n const {attach, detach, resetTarget} = attachListNavigation({\n list,\n type: this.listType,\n onSelect: this.onSelect,\n once: true,\n waitForKey: this.waitForKey\n });\n\n this.attach = attach;\n this.detach = detach;\n this.resetTarget = resetTarget;\n if(!IS_MOBILE && !this.navigationItem) {\n this.navigationItem = {\n type: 'autocomplete-helper',\n onPop: () => {\n this.navigationItem = undefined;\n this.toggle(true);\n },\n noBlurOnPop: true\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n\n this.addEventListener('hidden', () => {\n this.resetTarget = undefined;\n this.attach = undefined;\n this.detach = undefined;\n\n list.innerHTML = '';\n detach();\n\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n }\n }, {once: true});\n };\n\n protected attachNavigation() {\n this.addEventListener('visible', this.onVisible);\n }\n\n public toggle(hide?: boolean, fromController = false, skipAnimation?: boolean) {\n if(this.init) {\n return;\n }\n\n if(hide === undefined) {\n hide = this.container.classList.contains('is-visible') && !this.container.classList.contains('backwards');\n }\n\n if(this.hidden === hide) {\n if(!hide) {\n this.dispatchEvent('visible'); // reset target and listener\n }\n\n return;\n }\n\n this.hidden = hide;\n\n if(!hide) {\n this.controller && this.controller.hideOtherHelpers(this);\n this.dispatchEvent('visible'); // fire it before so target will be set\n } else {\n if(this.navigationItem) {\n appNavigationController.removeItem(this.navigationItem);\n this.navigationItem = undefined;\n }\n\n if(!fromController && this.controller) {\n this.controller.hideOtherHelpers();\n }\n\n if(this.detach) { // force detach here\n this.detach();\n }\n }\n\n const useRafs = this.controller || hide ? 0 : 2;\n\n if(hide) {\n this.dispatchEvent('hiding');\n }\n\n SetTransition({\n element: this.container,\n className: 'is-visible',\n forwards: !hide,\n duration: rootScope.settings.animationsEnabled && !skipAnimation ? 300 : 0,\n onTransitionEnd: () => {\n this.hidden && this.dispatchEvent('hidden');\n },\n useRafs\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from './chat';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport preloadAnimatedEmojiSticker from '../../helpers/preloadAnimatedEmojiSticker';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport rootScope from '../../lib/rootScope';\nimport {EmoticonsDropdown} from '../emoticonsDropdown';\nimport {SuperStickerRenderer} from '../emoticonsDropdown/tabs/stickers';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport Scrollable from '../scrollable';\nimport attachStickerViewerListeners from '../stickerViewer';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\n\nexport default class StickersHelper extends AutocompleteHelper {\n private scrollable: Scrollable;\n private superStickerRenderer: SuperStickerRenderer;\n private lazyLoadQueue: LazyLoadQueue;\n private onChangeScreen: () => void;\n private listenerSetter: ListenerSetter;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n private chat: Chat,\n private managers: AppManagers\n ) {\n super({\n appendTo,\n controller,\n listType: 'xy',\n onSelect: async(target) => {\n return !(await EmoticonsDropdown.onMediaClick({target}, true));\n },\n waitForKey: ['ArrowUp', 'ArrowDown']\n });\n\n this.container.classList.add('stickers-helper');\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollTop = 0;\n }, 0);\n\n rootScope.dispatchEvent('choosing_sticker', true);\n });\n\n this.addEventListener('hidden', () => {\n if(this.onChangeScreen) {\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\n this.onChangeScreen = undefined;\n\n this.listenerSetter.removeAll();\n this.listenerSetter = undefined;\n }\n\n rootScope.dispatchEvent('choosing_sticker', false);\n });\n }\n\n public checkEmoticon(emoticon: string) {\n const middleware = this.controller.getMiddleware();\n\n if(this.lazyLoadQueue) {\n this.lazyLoadQueue.clear();\n }\n\n preloadAnimatedEmojiSticker(emoticon);\n this.managers.appStickersManager.getStickersByEmoticon(emoticon)\n .then((stickers) => {\n if(!middleware()) {\n return;\n }\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n const container = this.list.cloneNode() as HTMLElement;\n\n let ready: Promise;\n\n this.lazyLoadQueue.clear();\n if(stickers.length) {\n ready = new Promise((resolve) => {\n const promises: Promise[] = [];\n stickers.forEach((sticker) => {\n container.append(this.superStickerRenderer.renderSticker(sticker as MyDocument, undefined, promises));\n });\n\n (Promise.all(promises) as Promise).finally(resolve);\n });\n } else {\n ready = Promise.resolve();\n }\n\n ready.then(() => {\n this.list.replaceWith(container);\n this.list = container;\n\n if(!this.onChangeScreen) {\n this.onChangeScreen = () => {\n const width = (this.list.childElementCount * mediaSizes.active.popupSticker.width) + (this.list.childElementCount - 1 * 1);\n this.list.style.width = width + 'px';\n };\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\n\n this.listenerSetter = new ListenerSetter();\n attachStickerViewerListeners({listenTo: this.container, listenerSetter: this.listenerSetter});\n }\n\n this.onChangeScreen();\n\n this.toggle(!stickers.length);\n this.scrollable.scrollTop = 0;\n });\n });\n }\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add('stickers-helper-stickers', 'super-stickers');\n\n this.container.append(this.list);\n\n this.scrollable = new Scrollable(this.container);\n this.lazyLoadQueue = new LazyLoadQueue();\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, this.chat.animationGroup, this.managers);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {SEND_WHEN_ONLINE_TIMESTAMP} from '../../lib/mtproto/constants';\nimport Button from '../button';\nimport PopupDatePicker from './datePicker';\n\nconst getMinDate = () => {\n const date = new Date();\n // date.setDate(date.getDate() - 1);\n date.setHours(0, 0, 0, 0);\n return date;\n};\n\nconst getMaxDate = () => {\n const date = new Date();\n date.setFullYear(date.getFullYear() + 1);\n date.setDate(date.getDate() - 1);\n return date;\n};\n\nconst checkDate = (date: Date) => {\n return date.getTime() > getMaxDate().getTime() ? new Date() : date;\n};\n\nexport default class PopupSchedule extends PopupDatePicker {\n constructor(initDate: Date, onPick: (timestamp: number) => void, canSendWhenOnline: boolean) {\n super(checkDate(initDate), onPick, {\n noButtons: true,\n noTitle: true,\n closable: true,\n withConfirm: true,\n minDate: getMinDate(),\n maxDate: getMaxDate(),\n withTime: true,\n showOverflowMonths: true,\n confirmShortcutIsSendShortcut: true,\n title: true\n });\n\n this.element.classList.add('popup-schedule');\n this.header.append(this.controlsDiv);\n this.title.replaceWith(this.monthTitle);\n this.body.append(this.btnConfirm);\n\n if(canSendWhenOnline) {\n const btnSendWhenOnline = Button('btn-primary btn-secondary btn-primary-transparent primary', {text: 'Schedule.SendWhenOnline'});\n this.body.append(btnSendWhenOnline);\n\n attachClickEvent(btnSendWhenOnline, () => {\n onPick(SEND_WHEN_ONLINE_TIMESTAMP);\n this.hide();\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport {appendEmoji, getEmojiFromElement} from '../emoticonsDropdown/tabs/emoji';\nimport {ScrollableX} from '../scrollable';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport default class EmojiHelper extends AutocompleteHelper {\n private scrollable: ScrollableX;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super({\n appendTo,\n controller,\n listType: 'x',\n onSelect: (target) => {\n chatInput.onEmojiSelected(getEmojiFromElement(target as any), true);\n }\n });\n\n this.container.classList.add('emoji-helper');\n }\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add('emoji-helper-emojis', 'super-emojis');\n\n this.container.append(this.list);\n\n this.scrollable = new ScrollableX(this.container);\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollLeft = 0;\n }, 0);\n });\n }\n\n public render(emojis: string[], waitForKey: boolean) {\n if(this.init) {\n if(!emojis.length) {\n return;\n }\n\n this.init();\n this.init = null;\n }\n\n emojis = emojis.slice(0, 80);\n\n if(emojis.length) {\n this.list.innerHTML = '';\n emojis.forEach((emoji) => {\n appendEmoji(emoji, this.list, false, true);\n });\n }\n\n this.waitForKey = waitForKey ? ['ArrowUp', 'ArrowDown'] : undefined;\n this.toggle(!emojis.length);\n\n /* window.requestAnimationFrame(() => {\n this.container.style.width = (3 * 2) + (emojis.length * 44) + 'px';\n }); */\n }\n\n public checkQuery(query: string, firstChar: string) {\n const middleware = this.controller.getMiddleware();\n this.managers.appEmojiManager.getBothEmojiKeywords().then(async() => {\n if(!middleware()) {\n return;\n }\n\n const q = query.replace(/^:/, '');\n const emojis = await this.managers.appEmojiManager.searchEmojis(q);\n if(!middleware()) {\n return;\n }\n\n this.render(emojis, firstChar !== ':');\n // console.log(emojis);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport AvatarElement from '../avatar';\nimport PeerTitle from '../peerTitle';\nimport Scrollable from '../scrollable';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\n\nexport default class AutocompletePeerHelper extends AutocompleteHelper {\n protected static BASE_CLASS = 'autocomplete-peer-helper';\n protected static BASE_CLASS_LIST_ELEMENT = AutocompletePeerHelper.BASE_CLASS + '-list-element';\n private scrollable: Scrollable;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n protected className: string,\n onSelect: (target: Element) => boolean | void\n ) {\n super({\n appendTo,\n controller,\n listType: 'y',\n onSelect\n });\n\n this.container.classList.add(AutocompletePeerHelper.BASE_CLASS, className);\n }\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add(AutocompletePeerHelper.BASE_CLASS + '-list', this.className + '-list');\n\n this.container.append(this.list);\n\n this.scrollable = new Scrollable(this.container);\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollTop = 0;\n }, 0);\n });\n }\n\n public render(data: {peerId: PeerId, name?: string, description?: string}[], doNotShow?: boolean) {\n if(this.init) {\n if(!data.length) {\n return;\n }\n\n this.init();\n this.init = null;\n }\n\n if(data.length) {\n this.list.innerHTML = '';\n data.forEach((d) => {\n const div = AutocompletePeerHelper.listElement({\n className: this.className,\n peerId: d.peerId,\n name: d.name,\n description: d.description\n });\n\n this.list.append(div);\n });\n }\n\n if(!doNotShow) {\n this.toggle(!data.length);\n }\n }\n\n public static listElement(options: {\n className: string,\n peerId: PeerId,\n name?: string,\n description?: string\n }) {\n const BASE = AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT;\n options.className += '-list-element';\n\n const div = document.createElement('div');\n div.classList.add(BASE, options.className);\n div.dataset.peerId = '' + options.peerId;\n\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-30', BASE + '-avatar', options.className + '-avatar');\n avatar.updateWithOptions({\n isDialog: false,\n peerId: options.peerId\n });\n\n const name = document.createElement('div');\n name.classList.add(BASE + '-name', options.className + '-name');\n if(!options.name) {\n name.append(new PeerTitle({\n peerId: options.peerId,\n dialog: false,\n onlyFirstName: false,\n plainText: false\n }).element);\n } else {\n setInnerHTML(name, wrapEmojiText(options.name));\n }\n\n div.append(avatar, name);\n\n if(options.description) {\n const description = document.createElement('div');\n description.classList.add(BASE + '-description', options.className + '-description');\n setInnerHTML(description, wrapEmojiText(options.description));\n div.append(description);\n }\n\n return div;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport type {BotInfo, ChatFull, UserFull} from '../../layer';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport SearchIndex from '../../lib/searchIndex';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport function processPeerFullForCommands(peerId: PeerId, full: ChatFull.chatFull | ChatFull.channelFull | UserFull.userFull, query?: string) {\n const botInfos: BotInfo.botInfo[] = [].concat(full.bot_info);\n let index: SearchIndex;\n\n if(query !== undefined) {\n index = new SearchIndex({\n ignoreCase: true\n });\n }\n\n type T = {peerId: PeerId, name: string, description: string, index: number, command: string};\n const commands: Map = new Map();\n botInfos.forEach((botInfo) => {\n if(!botInfo.commands) {\n return;\n }\n\n botInfo.commands.forEach(({command, description}, idx) => {\n const c = '/' + command;\n commands.set(command, {\n peerId: botInfo.user_id ? botInfo.user_id.toPeerId(false) : peerId,\n command: command,\n name: c,\n description: description,\n index: idx\n });\n\n if(index) {\n index.indexObject(command, c);\n }\n });\n });\n\n let out: T[];\n if(!index) {\n out = [...commands.values()];\n } else {\n const found = index.search(query);\n out = Array.from(found).map((command) => commands.get(command));\n }\n\n out = out.sort((a, b) => commands.get(a.command).index - commands.get(b.command).index);\n\n return out;\n}\n\nexport default class CommandsHelper extends AutocompletePeerHelper {\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(appendTo,\n controller,\n 'commands-helper',\n (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n });\n }\n );\n }\n\n public async checkQuery(query: string, peerId: PeerId) {\n if(!(await this.managers.appUsersManager.isBot(peerId))) {\n return false;\n }\n\n const middleware = this.controller.getMiddleware();\n this.managers.appProfileManager.getProfileByPeerId(peerId).then((full) => {\n if(!middleware()) {\n return;\n }\n\n const filtered = processPeerFullForCommands(peerId, full, query);\n this.render(filtered);\n // console.log('found commands', found, filtered);\n });\n\n return true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getMiddleware} from '../../helpers/middleware';\nimport AutocompleteHelper from './autocompleteHelper';\n\nexport default class AutocompleteHelperController {\n private helpers: Set = new Set();\n private middleware = getMiddleware();\n /* private tempId = 0;\n\n public incrementToggleCount() {\n return ++this.tempId;\n }\n\n public getToggleCount() {\n return this.tempId;\n } */\n\n public toggleListNavigation(enabled: boolean) {\n for(const helper of this.helpers) {\n helper.toggleListNavigation(enabled);\n }\n }\n\n public getMiddleware() {\n this.middleware.clean();\n return this.middleware.get();\n }\n\n public addHelper(helper: AutocompleteHelper) {\n this.helpers.add(helper);\n }\n\n public hideOtherHelpers(preserveHelper?: AutocompleteHelper) {\n this.helpers.forEach((helper) => {\n if(helper !== preserveHelper) {\n helper.toggle(true, true);\n }\n });\n\n if(!preserveHelper) {\n this.middleware.clean();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport type {MessageEntity} from '../../layer';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerActiveUsernames from '../../lib/appManagers/utils/peers/getPeerActiveUsernames';\nimport rootScope from '../../lib/rootScope';\n\nexport default class MentionsHelper extends AutocompletePeerHelper {\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(\n appendTo,\n controller,\n 'mentions-helper',\n (target) => {\n const userId = (target as HTMLElement).dataset.peerId.toUserId();\n const user = Promise.resolve(managers.appUsersManager.getUser(userId)).then((user) => {\n let str = '', entity: MessageEntity;\n const usernames = getPeerActiveUsernames(user);\n if(usernames[0]) {\n str = '@' + usernames[0];\n } else {\n str = user.first_name || user.last_name;\n entity = {\n _: 'messageEntityMentionName',\n length: str.length,\n offset: 0,\n user_id: user.id\n };\n }\n\n str += ' ';\n chatInput.insertAtCaret(str, entity);\n });\n }\n );\n }\n\n public checkQuery(query: string, peerId: PeerId, topMsgId: number) {\n const trimmed = query.trim(); // check that there is no whitespace\n if(query.length !== trimmed.length) return false;\n\n const middleware = this.controller.getMiddleware();\n this.managers.appProfileManager.getMentions(peerId && peerId.toChatId(), trimmed, topMsgId).then(async(peerIds) => {\n if(!middleware()) return;\n\n peerIds = peerIds.filter((peerId) => peerId !== rootScope.myId);\n\n // const username = trimmed.slice(1).toLowerCase();\n\n const p = peerIds.map(async(peerId) => {\n const user = await this.managers.appUsersManager.getUser(peerId);\n const usernames = getPeerActiveUsernames(user);\n // if(usernames.length && usernames.some((_username) => _username.toLowerCase() === username)) { // hide full matched suggestion\n // return;\n // }\n\n return {\n peerId,\n description: usernames[0] ? '@' + usernames[0] : undefined\n };\n });\n\n this.render((await Promise.all(p)).filter(Boolean));\n });\n\n return true;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport DropdownHover from '../../helpers/dropdownHover';\nimport {KeyboardButton, ReplyMarkup} from '../../layer';\nimport rootScope from '../../lib/rootScope';\nimport ListenerSetter, {Listener} from '../../helpers/listenerSetter';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport findUpAsChild from '../../helpers/dom/findUpAsChild';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {getHeavyAnimationPromise} from '../../hooks/useHeavyAnimationCheck';\nimport confirmationPopup from '../confirmationPopup';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport Scrollable from '../scrollable';\n\nexport default class ReplyKeyboard extends DropdownHover {\n private static BASE_CLASS = 'reply-keyboard';\n private appendTo: HTMLElement;\n private listenerSetter: ListenerSetter;\n private managers: AppManagers;\n private btnHover: HTMLElement;\n private peerId: PeerId;\n private touchListener: Listener;\n private chatInput: ChatInput;\n private scrollable: Scrollable;\n\n constructor(options: {\n listenerSetter: ListenerSetter,\n managers: AppManagers,\n appendTo: HTMLElement,\n btnHover: HTMLElement,\n chatInput: ChatInput\n }) {\n super({\n element: document.createElement('div')\n });\n\n safeAssign(this, options);\n\n this.element.classList.add(ReplyKeyboard.BASE_CLASS);\n this.element.style.display = 'none';\n\n this.scrollable = new Scrollable();\n this.element.append(this.scrollable.container);\n\n this.attachButtonListener(this.btnHover, this.listenerSetter);\n this.listenerSetter.add(rootScope)('history_reply_markup', async({peerId}) => {\n if(this.peerId === peerId) {\n if(this.checkAvailability() && this.isActive()) {\n await this.render();\n }\n\n getHeavyAnimationPromise().then(() => {\n this.checkForceReply();\n });\n }\n });\n }\n\n public init() {\n this.appendTo.append(this.element);\n\n this.listenerSetter.add(this)('open', async() => {\n await this.render();\n\n if(IS_TOUCH_SUPPORTED) {\n this.touchListener = this.listenerSetter.add(document.body)('touchstart', this.onBodyTouchStart, {passive: false, capture: true}) as any as Listener;\n this.listenerSetter.add(this)('close', () => {\n this.listenerSetter.remove(this.touchListener);\n }, {once: true});\n }\n });\n\n attachClickEvent(this.element, (e) => {\n const target = findUpClassName(e.target, 'btn');\n if(!target) {\n return;\n }\n\n const type = target.dataset.type as KeyboardButton['_'];\n const {peerId} = this;\n switch(type) {\n case 'keyboardButtonRequestPhone': {\n confirmationPopup({\n titleLangKey: 'ShareYouPhoneNumberTitle',\n button: {\n langKey: 'OK'\n },\n descriptionLangKey: 'AreYouSureShareMyContactInfoBot'\n }).then(() => {\n this.managers.appMessagesManager.sendContact(peerId, rootScope.myId);\n });\n break;\n }\n\n default: {\n this.managers.appMessagesManager.sendText(peerId, target.dataset.text);\n break;\n }\n }\n\n this.toggle(false);\n }, {listenerSetter: this.listenerSetter});\n\n return super.init();\n }\n\n private onBodyTouchStart = (e: TouchEvent) => {\n const target = e.touches[0].target as HTMLElement;\n if(!findUpAsChild(target, this.element) && target !== this.btnHover) {\n cancelEvent(e);\n this.toggle(false);\n }\n };\n\n public async checkForceReply() {\n const replyMarkup = await this.getReplyMarkup();\n if(replyMarkup._ === 'replyKeyboardForceReply' &&\n !replyMarkup.pFlags.hidden &&\n !replyMarkup.pFlags.used) {\n replyMarkup.pFlags.used = true;\n this.chatInput.initMessageReply(replyMarkup.mid);\n }\n }\n\n private async getReplyMarkup() {\n return (await this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId)).replyMarkup ?? {\n _: 'replyKeyboardHide'\n };\n }\n\n public async render(replyMarkup?: ReplyMarkup.replyKeyboardMarkup) {\n if(replyMarkup === undefined) {\n replyMarkup = await this.getReplyMarkup() as any;\n }\n\n this.scrollable.container.replaceChildren();\n\n for(const row of replyMarkup.rows) {\n const div = document.createElement('div');\n div.classList.add(ReplyKeyboard.BASE_CLASS + '-row');\n\n for(const button of row.buttons) {\n const btn = document.createElement('button');\n btn.classList.add(ReplyKeyboard.BASE_CLASS + '-button', 'btn');\n setInnerHTML(btn, wrapEmojiText(button.text));\n btn.dataset.text = button.text;\n btn.dataset.type = button._;\n div.append(btn);\n }\n\n this.scrollable.container.append(div);\n }\n }\n\n public async checkAvailability(replyMarkup?: ReplyMarkup) {\n if(replyMarkup === undefined) {\n replyMarkup = await this.getReplyMarkup();\n }\n\n const hide = replyMarkup._ === 'replyKeyboardHide' || !(replyMarkup as ReplyMarkup.replyInlineMarkup).rows?.length;\n this.btnHover.classList.toggle('hide', hide);\n\n if(hide) {\n this.toggle(false);\n }\n\n return !hide;\n }\n\n public setPeer(peerId: PeerId) {\n this.peerId = peerId;\n\n this.checkAvailability();\n this.checkForceReply();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from './chat';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {WebDocument} from '../../layer';\nimport {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport LazyLoadQueue from '../lazyLoadQueue';\nimport Scrollable from '../scrollable';\nimport AutocompleteHelper from './autocompleteHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport Button from '../button';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {MyPhoto} from '../../lib/appManagers/appPhotosManager';\nimport assumeType from '../../helpers/assumeType';\nimport GifsMasonry from '../gifsMasonry';\nimport {SuperStickerRenderer} from '../emoticonsDropdown/tabs/stickers';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport readBlobAsDataURL from '../../helpers/blob/readBlobAsDataURL';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport renderMediaWithFadeIn from '../../helpers/dom/renderMediaWithFadeIn';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport wrapRichText from '../../lib/richTextProcessor/wrapRichText';\nimport generateQId from '../../lib/appManagers/utils/inlineBots/generateQId';\nimport appDownloadManager from '../../lib/appManagers/appDownloadManager';\nimport {AnimationItemGroup} from '../animationIntersector';\nimport wrapPhoto from '../wrappers/photo';\n\nconst ANIMATION_GROUP: AnimationItemGroup = 'INLINE-HELPER';\n// const GRID_ITEMS = 5;\n\nexport default class InlineHelper extends AutocompleteHelper {\n private scrollable: Scrollable;\n private lazyLoadQueue: LazyLoadQueue;\n private gifsMasonry: GifsMasonry;\n private superStickerRenderer: SuperStickerRenderer;\n private onChangeScreen: () => void;\n public checkQuery: (peerId: PeerId, username: string, query: string) => ReturnType;\n\n constructor(\n appendTo: HTMLElement,\n controller: AutocompleteHelperController,\n private chat: Chat,\n private managers: AppManagers\n ) {\n super({\n appendTo,\n controller,\n listType: 'xy',\n waitForKey: ['ArrowUp', 'ArrowDown'],\n onSelect: (target) => {\n if(!target) return false; // can happen when there is only button\n const {peerId, botId, queryId} = this.list.dataset;\n return this.chat.input.getReadyToSend(() => {\n const queryAndResultIds = generateQId(queryId, (target as HTMLElement).dataset.resultId);\n this.managers.appInlineBotsManager.sendInlineResult(peerId.toPeerId(), botId, queryAndResultIds, {\n ...this.chat.getMessageSendingParams(),\n clearDraft: true\n });\n\n this.chat.input.onMessageSent(true, true);\n });\n }\n });\n\n this.container.classList.add('inline-helper');\n\n this.addEventListener('visible', () => {\n setTimeout(() => { // it is not rendered yet\n this.scrollable.container.scrollTop = 0;\n }, 0);\n });\n\n this.checkQuery = debounce(this._checkQuery, 200, true, true);\n\n this.addEventListener('hidden', () => {\n if(this.onChangeScreen) {\n mediaSizes.removeEventListener('changeScreen', this.onChangeScreen);\n this.onChangeScreen = undefined;\n }\n });\n }\n\n public _checkQuery = async(peerId: PeerId, username: string, query: string) => {\n const middleware = this.controller.getMiddleware();\n\n const peer = await this.managers.appUsersManager.resolveUsername(username);\n if(!middleware()) {\n throw 'PEER_CHANGED';\n }\n\n if(peer._ !== 'user' || !peer.pFlags.bot) {\n throw 'NOT_A_BOT';\n }\n\n const renderPromise = this.managers.appInlineBotsManager.getInlineResults(peerId, peer.id, query).then((botResults) => {\n if(!middleware()) {\n throw 'PEER_CHANGED';\n }\n\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n const list = this.list.cloneNode() as HTMLElement;\n list.dataset.peerId = '' + peerId;\n list.dataset.botId = '' + peer.id;\n list.dataset.queryId = '' + botResults.query_id;\n\n const gifsMasonry = new GifsMasonry(null, ANIMATION_GROUP, this.scrollable, false);\n\n this.lazyLoadQueue.clear();\n this.superStickerRenderer.clear();\n\n const loadPromises: Promise[] = [];\n const isGallery = !!botResults.pFlags.gallery;\n // botResults.results.length = 3;\n for(const item of botResults.results) {\n const container = document.createElement('div');\n container.classList.add('inline-helper-result');\n container.dataset.resultId = item.id;\n\n const preview = isGallery ? undefined : document.createElement('div');\n if(preview) {\n preview.classList.add('inline-helper-result-preview');\n\n container.append(preview);\n }\n\n list.append(container);\n\n if(!isGallery) {\n preview.classList.add('empty');\n setInnerHTML(preview, wrapEmojiText([...item.title.trim()][0]));\n\n const title = document.createElement('div');\n title.classList.add('inline-helper-result-title');\n setInnerHTML(title, wrapEmojiText(item.title));\n\n const description = document.createElement('div');\n description.classList.add('inline-helper-result-description');\n setInnerHTML(description, wrapRichText(item.description, {\n noCommands: true,\n noLinks: true\n }));\n\n container.append(title, description);\n\n const separator = document.createElement('div');\n separator.classList.add('inline-helper-separator');\n\n list.append(separator);\n } else {\n container.classList.add('grid-item');\n }\n\n if(item._ === 'botInlineResult') {\n if(item.thumb && item.thumb.mime_type.indexOf('image/') === 0) {\n let mediaContainer: HTMLElement;\n if(preview) {\n mediaContainer = document.createElement('div');\n preview.append(mediaContainer);\n } else {\n mediaContainer = container;\n }\n\n mediaContainer.classList.add('media-container');\n isGallery && mediaContainer.classList.add('no-border-radius');\n\n this.lazyLoadQueue.push({\n div: container,\n load: () => {\n return appDownloadManager.download({\n dcId: 4,\n location: {\n _: 'inputWebFileLocation',\n access_hash: (item.thumb as WebDocument.webDocument).access_hash,\n url: item.thumb.url\n },\n size: item.thumb.size,\n mimeType: item.thumb.mime_type\n }).then((blob) => {\n const image = new Image();\n image.classList.add('media-photo');\n readBlobAsDataURL(blob).then((dataURL) => {\n renderMediaWithFadeIn(mediaContainer, image, dataURL, true);\n });\n });\n }\n });\n }\n } else {\n const media = item.document as MyDocument || item.photo as MyPhoto;\n if((['sticker', 'gif'] as MyDocument['type'][]).includes((media as MyDocument)?.type) && isGallery) {\n assumeType(media);\n\n if(media.type === 'gif') {\n gifsMasonry.add(media, container);\n } else if(media.type === 'sticker') {\n container.classList.add('super-sticker');\n this.superStickerRenderer.renderSticker(media, container, loadPromises);\n if(media.animated) {\n this.superStickerRenderer.observeAnimated(container);\n }\n }\n } else if(media) {\n const size = isGallery ? 48 : undefined;\n isGallery && container.classList.add('no-border-radius');\n wrapPhoto({\n photo: media,\n container: isGallery ? container : preview,\n boxWidth: size,\n boxHeight: size,\n middleware,\n lazyLoadQueue: this.lazyLoadQueue,\n loadPromises\n });\n }\n }\n }\n\n return Promise.all(loadPromises).then(() => {\n if(!middleware()) {\n gifsMasonry.clear();\n return;\n }\n\n list.classList.toggle('is-gallery', isGallery);\n list.classList.toggle('super-stickers', isGallery);\n this.container.classList.toggle('is-gallery', isGallery);\n\n /* if(isGallery) {\n list.style.gridTemplateColumns = `repeat(${Math.min(botResults.results.length, 4)}, 1fr)`;\n }\n\n this.container.style.setProperty('width', isGallery ? `${Math.min(botResults.results.length, 4) * 25}%` : '', 'important'); */\n\n const parent = this.list.parentElement;\n parent.textContent = '';\n if(botResults.switch_pm) {\n const btnSwitchToPM = Button('btn-primary btn-secondary btn-primary-transparent primary');\n setInnerHTML(btnSwitchToPM, wrapEmojiText(botResults.switch_pm.text));\n attachClickEvent(btnSwitchToPM, (e) => {\n this.chat.appImManager.setInnerPeer({peerId});\n this.managers.appInlineBotsManager.switchToPM(peerId, peer.id, botResults.switch_pm.start_param);\n });\n parent.append(btnSwitchToPM);\n }\n parent.append(this.list = list);\n\n if(this.gifsMasonry) {\n this.gifsMasonry.detach();\n }\n this.gifsMasonry = gifsMasonry;\n gifsMasonry.attach();\n\n if(!this.onChangeScreen) {\n this.onChangeScreen = () => {\n if(this.list.classList.contains('is-gallery')) {\n const width = (this.list.childElementCount * mediaSizes.active.popupSticker.width) + (this.list.childElementCount - 1 * 1);\n this.list.style.width = width + 'px';\n } else {\n this.list.style.width = '';\n }\n };\n mediaSizes.addEventListener('changeScreen', this.onChangeScreen);\n }\n\n this.onChangeScreen();\n\n this.toggle(!botResults.results.length && !botResults.switch_pm);\n this.scrollable.scrollTop = 0;\n });\n });\n\n return {user: peer, renderPromise};\n };\n\n public init() {\n this.list = document.createElement('div');\n this.list.classList.add('inline-helper-results');\n\n this.container.append(this.list);\n\n this.scrollable = new Scrollable(this.container);\n this.lazyLoadQueue = new LazyLoadQueue();\n this.superStickerRenderer = new SuperStickerRenderer(this.lazyLoadQueue, ANIMATION_GROUP, this.managers);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatInput from './input';\nimport callbackify from '../../helpers/callbackify';\nimport AutocompletePeerHelper from './autocompletePeerHelper';\nimport {processPeerFullForCommands} from './commandsHelper';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nconst CLASS_NAME = 'bot-commands';\nexport default class ChatBotCommands extends AutocompletePeerHelper {\n private userId: UserId;\n\n constructor(\n appendTo: HTMLElement,\n chatInput: ChatInput,\n private managers: AppManagers\n ) {\n super(appendTo, undefined, CLASS_NAME, (target) => {\n const innerHTML = target.querySelector(`.${AutocompletePeerHelper.BASE_CLASS_LIST_ELEMENT}-name`).innerHTML;\n return chatInput.getReadyToSend(() => {\n chatInput.messageInput.innerHTML = innerHTML;\n chatInput.sendMessage(true);\n this.toggle(true);\n });\n });\n }\n\n public setUserId(userId: UserId, middleware: () => boolean) {\n if(this.userId === userId && this.list?.childElementCount) {\n this.toggle(false);\n return;\n }\n\n this.userId = userId;\n return callbackify(this.managers.appProfileManager.getProfile(userId), (full) => {\n if(!middleware()) return;\n const filtered = processPeerFullForCommands(userId.toPeerId(false), full);\n\n const PADDING_TOP = 8;\n // const PADDING_BOTTOM = 8;\n const PADDING_BOTTOM = 24;\n const height = filtered.length * 50 + PADDING_TOP + PADDING_BOTTOM;\n this.container.style.setProperty('--height', height + 'px');\n\n this.render(filtered);\n\n // this.container.style.top =\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AckedResult} from '../lib/mtproto/superMessagePort';\nimport {Modify} from '../types';\n\nexport default async function modifyAckedResult(acked: AckedResult): Promise, {result: T | Promise}>> {\n return {\n cached: acked.cached,\n result: acked.cached ? await acked.result : acked.result\n };\n}\n\nexport function modifyAckedPromise(promise: Promise>) {\n return promise.then(modifyAckedResult);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport callbackify from '../../helpers/callbackify';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {getMiddleware} from '../../helpers/middleware';\nimport {modifyAckedPromise} from '../../helpers/modifyAckedResult';\nimport {ChatFull} from '../../layer';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {i18n} from '../../lib/langPack';\nimport {AckedResult} from '../../lib/mtproto/superMessagePort';\nimport rootScope from '../../lib/rootScope';\nimport AvatarElement from '../avatar';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from '../buttonMenu';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport PeerTitle from '../peerTitle';\nimport SetTransition from '../singleTransition';\nimport getChatMembersString from '../wrappers/getChatMembersString';\n\nconst SEND_AS_ANIMATION_DURATION = 300;\n\nexport default class ChatSendAs {\n private avatar: AvatarElement;\n private container: HTMLElement;\n private closeBtn: HTMLElement;\n private btnMenu: HTMLElement;\n private sendAsPeerIds: PeerId[];\n private sendAsPeerId: PeerId;\n private updatingPromise: ReturnType;\n private middleware: ReturnType;\n private listenerSetter: ListenerSetter;\n private peerId: PeerId;\n private addedListener: boolean;\n private buttons: ButtonMenuItemOptions[];\n\n constructor(\n private managers: AppManagers,\n private onReady: (container: HTMLElement, skipAnimation?: boolean) => void,\n private onChange: (sendAsPeerId: PeerId) => void\n ) {\n this.middleware = getMiddleware();\n this.listenerSetter = new ListenerSetter();\n this.construct();\n }\n\n private construct() {\n this.container = document.createElement('div');\n this.container.classList.add('new-message-send-as-container');\n\n this.closeBtn = document.createElement('div');\n this.closeBtn.classList.add('new-message-send-as-close', 'new-message-send-as-avatar', 'tgico-close');\n\n const sendAsButtons: ButtonMenuItemOptions[] = [{\n text: 'SendMessageAsTitle',\n onClick: undefined\n }];\n\n this.buttons = [];\n\n let previousAvatar: HTMLElement;\n const onSendAsMenuToggle = (visible: boolean) => {\n if(visible) {\n previousAvatar = this.avatar;\n }\n\n const isChanged = this.avatar !== previousAvatar;\n const useRafs = !visible && isChanged ? 2 : 0;\n\n SetTransition({\n element: this.closeBtn,\n className: 'is-visible',\n forwards: visible,\n duration: SEND_AS_ANIMATION_DURATION,\n useRafs\n });\n if(!isChanged) {\n SetTransition({\n element: previousAvatar,\n className: 'is-visible',\n forwards: !visible,\n duration: SEND_AS_ANIMATION_DURATION,\n useRafs\n });\n }\n };\n\n ButtonMenuToggle({\n buttonOptions: {noRipple: true},\n listenerSetter: this.listenerSetter,\n container: this.container,\n direction: 'top-right',\n buttons: sendAsButtons,\n onOpenBefore: () => {\n onSendAsMenuToggle(true);\n },\n onOpen: (e, btnMenu) => {\n sendAsButtons[0].element.classList.add('btn-menu-item-header');\n this.btnMenu = btnMenu as any;\n this.btnMenu.classList.add('scrollable', 'scrollable-y');\n this.btnMenu.append(...this.buttons.map((button) => button.element));\n },\n onClose: () => {\n onSendAsMenuToggle(false);\n },\n onCloseAfter: () => {\n this.btnMenu = undefined;\n }\n });\n\n this.container.append(this.closeBtn);\n }\n\n private async updateButtons(peerIds: PeerId[]) {\n const promises: Promise[] = peerIds.map(async(sendAsPeerId, idx) => {\n const textElement = document.createElement('div');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('btn-menu-item-subtitle');\n if(sendAsPeerId.isUser()) {\n subtitle.append(i18n('Chat.SendAs.PersonalAccount'));\n } else if(sendAsPeerId === this.peerId) {\n subtitle.append(i18n('VoiceChat.DiscussionGroup'));\n } else {\n subtitle.append(await getChatMembersString(sendAsPeerId.toChatId()));\n }\n\n textElement.append(\n new PeerTitle({peerId: sendAsPeerId}).element,\n subtitle\n );\n\n return {\n onClick: idx ? async() => {\n const currentPeerId = this.peerId;\n this.changeSendAsPeerId(sendAsPeerId);\n\n const middleware = this.middleware.get();\n const executeButtonsUpdate = () => {\n if(this.sendAsPeerId !== sendAsPeerId || !middleware()) return;\n const peerIds = this.sendAsPeerIds.slice();\n indexOfAndSplice(peerIds, sendAsPeerId);\n peerIds.unshift(sendAsPeerId);\n this.updateButtons(peerIds);\n };\n\n if(rootScope.settings.animationsEnabled) {\n setTimeout(executeButtonsUpdate, 250);\n } else {\n executeButtonsUpdate();\n }\n\n // return;\n this.managers.appMessagesManager.saveDefaultSendAs(currentPeerId, sendAsPeerId);\n } : undefined,\n textElement\n };\n });\n\n const buttons = await Promise.all(promises);\n const btnMenu = ButtonMenuSync({buttons}/* , this.listenerSetter */);\n buttons.forEach((button, idx) => {\n const peerId = peerIds[idx];\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-26', 'btn-menu-item-icon');\n avatar.updateWithOptions({peerId});\n\n if(!idx) {\n avatar.classList.add('active');\n }\n\n button.element.prepend(avatar);\n });\n\n this.buttons = buttons;\n\n // if already opened\n this.btnMenu?.append(...this.buttons.map((button) => button.element));\n }\n\n private async updateAvatar(sendAsPeerId: PeerId, skipAnimation?: boolean) {\n const previousAvatar = this.avatar;\n if(previousAvatar) {\n if(previousAvatar.peerId === sendAsPeerId) {\n return;\n }\n }\n\n if(!previousAvatar) {\n skipAnimation = true;\n }\n\n const useRafs = skipAnimation ? 0 : 2;\n const duration = skipAnimation ? 0 : SEND_AS_ANIMATION_DURATION;\n const avatar = this.avatar = new AvatarElement();\n avatar.classList.add('new-message-send-as-avatar', 'avatar-30');\n await avatar.updateWithOptions({\n isDialog: false,\n peerId: sendAsPeerId\n });\n\n SetTransition({\n element: avatar,\n className: 'is-visible',\n forwards: true,\n duration,\n useRafs\n });\n if(previousAvatar) {\n SetTransition({\n element: previousAvatar,\n className: 'is-visible',\n forwards: false,\n duration,\n onTransitionEnd: () => {\n previousAvatar.remove();\n },\n useRafs\n });\n }\n\n this.container.append(avatar);\n }\n\n private changeSendAsPeerId(sendAsPeerId: PeerId, skipAnimation?: boolean) {\n this.sendAsPeerId = sendAsPeerId;\n this.onChange(sendAsPeerId);\n return this.updateAvatar(sendAsPeerId, skipAnimation);\n }\n\n private getDefaultSendAs(): Promise> {\n // return rootScope.myId;\n return this.managers.acknowledged.appProfileManager.getChannelFull(this.peerId.toChatId()).then((acked) => {\n return {\n cached: acked.cached,\n result: acked.result.then((channelFull) => {\n return channelFull.default_send_as ? getPeerId(channelFull.default_send_as) : undefined\n })\n };\n });\n }\n\n public async updateManual(skipAnimation?: boolean): Promise<() => void> {\n const peerId = this.peerId;\n if(this.updatingPromise || !(await this.managers.appPeersManager.isChannel(peerId))) {\n return;\n }\n\n const middleware = this.middleware.get(() => {\n return !this.updatingPromise || this.updatingPromise === updatingPromise;\n });\n\n const {container} = this;\n const chatId = peerId.toChatId();\n const result = (await modifyAckedPromise(this.getDefaultSendAs())).result;\n // const result = Promise.resolve(this.getDefaultSendAs());\n\n const wasSkippingAnimation = skipAnimation;\n if(result instanceof Promise) {\n skipAnimation = undefined;\n }\n\n const auto = wasSkippingAnimation && !skipAnimation;\n\n const updatingPromise = this.updatingPromise = callbackify(result, async(sendAsPeerId) => {\n if(!middleware() || sendAsPeerId === undefined) return;\n\n await this.changeSendAsPeerId(sendAsPeerId, skipAnimation);\n if(!middleware()) return;\n\n this.managers.appChatsManager.getSendAs(chatId).then((sendAsPeers) => {\n if(!middleware()) return;\n\n const peers = sendAsPeers.filter((sendAsPeer) => !sendAsPeer.pFlags.premium_required).map((sendAsPeer) => sendAsPeer.peer);\n const peerIds = peers.map((peer) => getPeerId(peer));\n this.sendAsPeerIds = peerIds.slice();\n\n indexOfAndSplice(peerIds, sendAsPeerId);\n peerIds.unshift(sendAsPeerId);\n this.updateButtons(peerIds);\n });\n\n const callback = () => {\n this.onReady(container, skipAnimation);\n\n if(!this.addedListener) {\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\n if(this.peerId === peerId) {\n this.update();\n }\n });\n\n this.addedListener = true;\n }\n };\n\n if(auto) {\n callback();\n return;\n }\n\n return callback;\n });\n\n updatingPromise.finally(() => {\n if(this.updatingPromise === updatingPromise) {\n this.updatingPromise = undefined;\n }\n });\n\n if(!auto) {\n return updatingPromise;\n }\n }\n\n public update(skipAnimation?: boolean) {\n return this.updateManual(skipAnimation).then((callback) => callback?.());\n }\n\n public setPeerId(peerId?: PeerId) {\n /* if(this.avatar) {\n this.avatar.remove();\n this.avatar = undefined;\n } */\n\n this.middleware.clean();\n this.updatingPromise = undefined;\n this.peerId = peerId;\n }\n\n public destroy() {\n this.container.remove();\n this.setPeerId();\n this.listenerSetter.removeAll();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {USING_BOMS} from '../helpers/dom/richInputHandler';\nimport BOM from '../helpers/string/bom';\nimport {_i18n} from '../lib/langPack';\nimport InputField, {InputFieldOptions} from './inputField';\nimport SetTransition from './singleTransition';\n\nconst USELESS_REG_EXP = new RegExp(`(${BOM})|()`, 'g');\n\nexport default class InputFieldAnimated extends InputField {\n public inputFake: HTMLElement;\n\n // public onLengthChange: (length: number, isOverflow: boolean) => void;\n // protected wasInputFakeClientHeight: number;\n // protected showScrollDebounced: () => void;\n\n constructor(options?: InputFieldOptions) {\n super(options);\n\n this.input.addEventListener('input', () => {\n this.updateInnerHTML();\n this.onFakeInput();\n });\n\n if(options.placeholder) {\n _i18n(this.inputFake, options.placeholder, undefined, 'placeholder');\n }\n\n this.input.classList.add('scrollable', 'scrollable-y');\n // this.wasInputFakeClientHeight = 0;\n // this.showScrollDebounced = debounce(() => this.input.classList.remove('no-scrollbar'), 150, false, true);\n this.inputFake = document.createElement('div');\n // this.inputFake.contentEditable = 'true';\n this.inputFake.contentEditable = 'true';\n this.inputFake.tabIndex = -1;\n this.inputFake.className = this.input.className + ' input-field-input-fake';\n }\n\n public onFakeInput(setHeight = true) {\n const {scrollHeight: newHeight/* , clientHeight */} = this.inputFake;\n /* if(this.wasInputFakeClientHeight && this.wasInputFakeClientHeight !== clientHeight) {\n this.input.classList.add('no-scrollbar'); // ! в сафари может вообще не появиться скролл после анимации, так как ему нужен полный reflow блока с overflow.\n this.showScrollDebounced();\n } */\n\n const currentHeight = +this.input.style.height.replace('px', '');\n if(currentHeight === newHeight) {\n return;\n }\n\n const TRANSITION_DURATION_FACTOR = 50;\n const transitionDuration = Math.round(\n TRANSITION_DURATION_FACTOR * Math.log(Math.abs(newHeight - currentHeight))\n );\n\n // this.wasInputFakeClientHeight = clientHeight;\n this.input.style.transitionDuration = `${transitionDuration}ms`;\n\n if(setHeight) {\n this.input.style.height = newHeight ? newHeight + 'px' : '';\n }\n\n const className = 'is-changing-height';\n SetTransition({\n element: this.input,\n className,\n forwards: true,\n duration: transitionDuration,\n onTransitionEnd: () => {\n this.input.classList.remove(className);\n }\n });\n }\n\n protected updateInnerHTML(innerHTML = this.input.innerHTML) {\n innerHTML = innerHTML.replace(//, '')\n .replace(/().+?\\/custom-emoji-element>/g, '$1')\n\n if(USING_BOMS) {\n innerHTML = innerHTML.replace(USELESS_REG_EXP, '');\n }\n\n this.inputFake.innerHTML = innerHTML;\n }\n\n public setValueSilently(value: Parameters[0], fromSet?: boolean) {\n super.setValueSilently(value, fromSet);\n\n this.updateInnerHTML();\n if(!fromSet) {\n this.onFakeInput();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {markdownTags, MarkdownType} from './getRichElementValue';\n\nexport default function hasMarkupInSelection(types: T[]) {\n const result: Record = {} as any;\n types.forEach((tag) => result[tag] = false);\n const selection = window.getSelection();\n if(!selection.isCollapsed) {\n const range = selection.getRangeAt(0);\n const commonAncestor = range.commonAncestorContainer;\n const treeWalker = document.createTreeWalker(\n (commonAncestor.nodeType === commonAncestor.ELEMENT_NODE ? commonAncestor as HTMLElement : (commonAncestor as ChildNode).parentElement).closest('[contenteditable=\"true\"]'),\n NodeFilter.SHOW_ELEMENT,\n {acceptNode: (node) => range.intersectsNode(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT}\n );\n\n let element: HTMLElement;\n while(element = treeWalker.nextNode() as HTMLElement) {\n for(const type of types) {\n if(result[type]) {\n continue;\n }\n\n const tag = markdownTags[type];\n if(element.matches(tag.match)) {\n result[type] = true;\n }\n }\n }\n }\n\n return result;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../lib/appManagers/appDocsManager';\nimport {AppImManager, APP_TABS} from '../../lib/appManagers/appImManager';\nimport type {MyDraftMessage} from '../../lib/appManagers/appDraftsManager';\nimport type Chat from './chat';\nimport Recorder from '../../../public/recorder.min';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n// import Recorder from '../opus-recorder/dist/recorder.min';\nimport opusDecodeController from '../../lib/opusDecodeController';\nimport {ButtonMenuItemOptions, ButtonMenuItemOptionsVerifiable, ButtonMenuSync} from '../buttonMenu';\nimport emoticonsDropdown from '../emoticonsDropdown';\nimport PopupCreatePoll from '../popups/createPoll';\nimport PopupForward from '../popups/forward';\nimport PopupNewMedia from '../popups/newMedia';\nimport {toast, toastNew} from '../toast';\nimport {MessageEntity, DraftMessage, WebPage, Message, UserFull, AttachMenuPeerType} from '../../layer';\nimport StickersHelper from './stickersHelper';\nimport ButtonIcon from '../buttonIcon';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport ListenerSetter, {Listener} from '../../helpers/listenerSetter';\nimport Button from '../button';\nimport PopupSchedule from '../popups/schedule';\nimport SendMenu from './sendContextMenu';\nimport rootScope from '../../lib/rootScope';\nimport PopupPinMessage from '../popups/unpinMessage';\nimport tsNow from '../../helpers/tsNow';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {IS_MOBILE, IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport I18n, {i18n, join, LangPackKey} from '../../lib/langPack';\nimport {generateTail} from './bubbles';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport ButtonCorner from '../buttonCorner';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport cancelSelection from '../../helpers/dom/cancelSelection';\nimport {attachClickEvent, simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport isInputEmpty from '../../helpers/dom/isInputEmpty';\nimport isSendShortcutPressed from '../../helpers/dom/isSendShortcutPressed';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport {MarkdownType} from '../../helpers/dom/getRichElementValue';\nimport getRichValueWithCaret from '../../helpers/dom/getRichValueWithCaret';\nimport EmojiHelper from './emojiHelper';\nimport CommandsHelper from './commandsHelper';\nimport AutocompleteHelperController from './autocompleteHelperController';\nimport AutocompleteHelper from './autocompleteHelper';\nimport MentionsHelper from './mentionsHelper';\nimport fixSafariStickyInput from '../../helpers/dom/fixSafariStickyInput';\nimport ReplyKeyboard from './replyKeyboard';\nimport InlineHelper from './inlineHelper';\nimport debounce from '../../helpers/schedulers/debounce';\nimport noop from '../../helpers/noop';\nimport {putPreloader} from '../putPreloader';\nimport SetTransition from '../singleTransition';\nimport PeerTitle from '../peerTitle';\nimport {fastRaf} from '../../helpers/schedulers';\nimport PopupDeleteMessages from '../popups/deleteMessages';\nimport fixSafariStickyInputFocusing, {IS_STICKY_INPUT_BUGGED} from '../../helpers/dom/fixSafariStickyInputFocusing';\nimport PopupPeer from '../popups/peer';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport appMediaPlaybackController from '../appMediaPlaybackController';\nimport {BOT_START_PARAM, NULL_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport setCaretAt from '../../helpers/dom/setCaretAt';\nimport CheckboxField from '../checkboxField';\nimport DropdownHover from '../../helpers/dropdownHover';\nimport RadioForm from '../radioForm';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport toggleDisability from '../../helpers/dom/toggleDisability';\nimport callbackify from '../../helpers/callbackify';\nimport ChatBotCommands from './botCommands';\nimport copy from '../../helpers/object/copy';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport documentFragmentToHTML from '../../helpers/dom/documentFragmentToHTML';\nimport PopupElement from '../popups';\nimport getEmojiEntityFromEmoji from '../../lib/richTextProcessor/getEmojiEntityFromEmoji';\nimport mergeEntities from '../../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../../lib/richTextProcessor/parseEntities';\nimport parseMarkdown from '../../lib/richTextProcessor/parseMarkdown';\nimport wrapDraftText from '../../lib/richTextProcessor/wrapDraftText';\nimport wrapDraft from '../wrappers/draft';\nimport wrapMessageForReply from '../wrappers/messageForReply';\nimport getServerMessageId from '../../lib/appManagers/utils/messageId/getServerMessageId';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {emojiFromCodePoints} from '../../vendor/emoji';\nimport {modifyAckedPromise} from '../../helpers/modifyAckedResult';\nimport ChatSendAs from './sendAs';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport InputFieldAnimated from '../inputFieldAnimated';\nimport getStickerEffectThumb from '../../lib/appManagers/utils/stickers/getStickerEffectThumb';\nimport PopupStickers from '../popups/stickers';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport wrapReply from '../wrappers/reply';\nimport {getEmojiFromElement} from '../emoticonsDropdown/tabs/emoji';\nimport hasMarkupInSelection from '../../helpers/dom/hasMarkupInSelection';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport RichInputHandler from '../../helpers/dom/richInputHandler';\nimport {insertRichTextAsHTML} from '../inputField';\nimport getCaretPosNew from '../../helpers/dom/getCaretPosNew';\nimport draftsAreEqual from '../../lib/appManagers/utils/drafts/draftsAreEqual';\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport getAttachMenuBotIcon from '../../lib/appManagers/utils/attachMenuBots/getAttachMenuBotIcon';\nimport TelegramWebView from '../telegramWebView';\n\nconst RECORD_MIN_TIME = 500;\nconst POSTING_MEDIA_NOT_ALLOWED = 'Posting media content isn\\'t allowed in this group.';\n\ntype ChatInputHelperType = 'edit' | 'webpage' | 'forward' | 'reply';\n\nexport default class ChatInput {\n // private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?::|.)(?!.*[:@]).*|(?:[@\\/]\\S*))$/;\n private static AUTO_COMPLETE_REG_EXP = /(\\s|^)((?:(?:@|^\\/)\\S*)|(?::|^[^:@\\/])(?!.*[:@\\/]).*)$/;\n public messageInput: HTMLElement;\n public messageInputField: InputFieldAnimated;\n private fileInput: HTMLInputElement;\n private inputMessageContainer: HTMLDivElement;\n private btnSend: HTMLButtonElement;\n private btnCancelRecord: HTMLButtonElement;\n private lastUrl = '';\n private lastTimeType = 0;\n\n public chatInput: HTMLElement;\n public inputContainer: HTMLElement;\n public rowsWrapper: HTMLDivElement;\n private newMessageWrapper: HTMLDivElement;\n private btnToggleEmoticons: HTMLButtonElement;\n private btnToggleReplyMarkup: HTMLButtonElement;\n private btnSendContainer: HTMLDivElement;\n\n private replyKeyboard: ReplyKeyboard;\n\n private attachMenu: HTMLElement;\n private attachMenuButtons: ButtonMenuItemOptionsVerifiable[];\n\n private sendMenu: SendMenu;\n\n private replyElements: {\n container: HTMLElement,\n cancelBtn: HTMLButtonElement,\n iconBtn: HTMLButtonElement\n } = {} as any;\n\n private forwardElements: {\n changePeer: ButtonMenuItemOptions,\n showSender: ButtonMenuItemOptions,\n hideSender: ButtonMenuItemOptions,\n showCaption: ButtonMenuItemOptions,\n hideCaption: ButtonMenuItemOptions,\n container: HTMLElement,\n modifyArgs?: ButtonMenuItemOptions[]\n };\n private forwardHover: DropdownHover;\n private forwardWasDroppingAuthor: boolean;\n\n private getWebPagePromise: Promise;\n private willSendWebPage: WebPage = null;\n private forwarding: {[fromPeerId: PeerId]: number[]};\n public replyToMsgId: number;\n public editMsgId: number;\n public editMessage: Message.message;\n private noWebPage: true;\n public scheduleDate: number;\n public sendSilent: true;\n public startParam: string;\n\n private recorder: any;\n public recording = false;\n private recordCanceled = false;\n private recordTimeEl: HTMLElement;\n private recordRippleEl: HTMLElement;\n private recordStartTime = 0;\n private recordingOverlayListener: Listener;\n private recordingNavigationItem: NavigationItem;\n\n // private scrollTop = 0;\n // private scrollOffsetTop = 0;\n // private scrollDiff = 0;\n\n public helperType: Exclude;\n private helperFunc: () => void | Promise;\n private helperWaitingForward: boolean;\n\n public willAttachType: 'document' | 'media';\n\n private lockRedo = false;\n private canRedoFromHTML = '';\n private readonly undoHistory: string[] = [];\n private readonly executedHistory: string[] = [];\n private canUndoFromHTML = '';\n\n private autocompleteHelperController: AutocompleteHelperController;\n private stickersHelper: StickersHelper;\n private emojiHelper: EmojiHelper;\n private commandsHelper: CommandsHelper;\n private mentionsHelper: MentionsHelper;\n private inlineHelper: InlineHelper;\n private listenerSetter: ListenerSetter;\n\n private pinnedControlBtn: HTMLButtonElement;\n\n private goDownBtn: HTMLButtonElement;\n private goDownUnreadBadge: HTMLElement;\n private goMentionBtn: HTMLButtonElement;\n private goMentionUnreadBadge: HTMLSpanElement;\n private btnScheduled: HTMLButtonElement;\n\n private btnPreloader: HTMLButtonElement;\n\n private saveDraftDebounced: () => void;\n\n private fakeRowsWrapper: HTMLDivElement;\n\n private previousQuery: string;\n\n private releaseMediaPlayback: () => void;\n\n private botStartBtn: HTMLButtonElement;\n private rowsWrapperWrapper: HTMLDivElement;\n private controlContainer: HTMLElement;\n private fakeSelectionWrapper: HTMLDivElement;\n\n private fakeWrapperTo: HTMLElement;\n private toggleBotStartBtnDisability: () => void;\n\n private botCommandsToggle: HTMLElement;\n private botCommands: ChatBotCommands;\n private botCommandsIcon: HTMLDivElement;\n private hasBotCommands: boolean;\n\n // private activeContainer: HTMLElement;\n\n private sendAs: ChatSendAs;\n public sendAsPeerId: PeerId;\n\n private replyInTopicOverlay: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private appImManager: AppImManager,\n private managers: AppManagers\n ) {\n this.listenerSetter = new ListenerSetter();\n }\n\n public construct() {\n this.chatInput = document.createElement('div');\n this.chatInput.classList.add('chat-input', 'hide');\n\n this.inputContainer = document.createElement('div');\n this.inputContainer.classList.add('chat-input-container');\n\n this.rowsWrapperWrapper = document.createElement('div');\n this.rowsWrapperWrapper.classList.add('rows-wrapper-wrapper');\n\n this.rowsWrapper = document.createElement('div');\n this.rowsWrapper.classList.add('rows-wrapper', 'chat-input-wrapper');\n\n this.rowsWrapperWrapper.append(this.rowsWrapper);\n\n const tail = generateTail();\n this.rowsWrapper.append(tail);\n\n const fakeRowsWrapper = this.fakeRowsWrapper = document.createElement('div');\n fakeRowsWrapper.classList.add('fake-wrapper', 'fake-rows-wrapper');\n\n const fakeSelectionWrapper = this.fakeSelectionWrapper = document.createElement('div');\n fakeSelectionWrapper.classList.add('fake-wrapper', 'fake-selection-wrapper');\n\n this.inputContainer.append(this.rowsWrapperWrapper, fakeRowsWrapper, fakeSelectionWrapper);\n this.chatInput.append(this.inputContainer);\n\n this.goDownBtn = ButtonCorner({icon: 'arrow_down', className: 'bubbles-corner-button chat-secondary-button bubbles-go-down hide'});\n this.inputContainer.append(this.goDownBtn);\n\n attachClickEvent(this.goDownBtn, (e) => {\n cancelEvent(e);\n this.chat.bubbles.onGoDownClick();\n }, {listenerSetter: this.listenerSetter});\n\n // * constructor end\n\n /* let setScrollTopTimeout: number;\n // @ts-ignore\n let height = window.visualViewport.height; */\n // @ts-ignore\n // this.listenerSetter.add(window.visualViewport)('resize', () => {\n // const scrollable = this.chat.bubbles.scrollable;\n // const wasScrolledDown = scrollable.isScrolledDown;\n\n // /* if(wasScrolledDown) {\n // this.saveScroll();\n // } */\n\n // // @ts-ignore\n // let newHeight = window.visualViewport.height;\n // const diff = height - newHeight;\n // const scrollTop = scrollable.scrollTop;\n // const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\n\n // console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\n\n // scrollable.scrollTop = needScrollTop;\n\n // if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\n // setScrollTopTimeout = window.setTimeout(() => {\n // const diff = height - newHeight;\n // const isScrolledDown = scrollable.scrollHeight - Math.round(scrollable.scrollTop + scrollable.container.offsetHeight + diff) <= 1;\n // height = newHeight;\n\n // scrollable.scrollTop = needScrollTop;\n\n // console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\n\n // /* if(isScrolledDown) {\n // scrollable.scrollTop = scrollable.scrollHeight;\n // } */\n\n // //scrollable.scrollTop += diff;\n // setScrollTopTimeout = 0;\n // }, 0);\n // });\n\n // ! Can't use it with resizeObserver\n /* this.listenerSetter.add(window.visualViewport)('resize', () => {\n const scrollable = this.chat.bubbles.scrollable;\n const wasScrolledDown = scrollable.isScrolledDown;\n\n // @ts-ignore\n let newHeight = window.visualViewport.height;\n const diff = height - newHeight;\n const needScrollTop = wasScrolledDown ? scrollable.scrollHeight : scrollable.scrollTop + diff; // * wasScrolledDown это проверка для десктоп хрома, когда пропадает панель загрузок снизу\n\n //console.log('resize before', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, wasScrolledDown, scrollable.lastScrollTop, diff, needScrollTop);\n\n scrollable.scrollTop = needScrollTop;\n height = newHeight;\n\n if(setScrollTopTimeout) clearTimeout(setScrollTopTimeout);\n setScrollTopTimeout = window.setTimeout(() => { // * try again for scrolled down Android Chrome\n scrollable.scrollTop = needScrollTop;\n\n //console.log('resize after', scrollable.scrollTop, scrollable.container.clientHeight, scrollable.scrollHeight, scrollable.isScrolledDown, scrollable.lastScrollTop, isScrolledDown);\n setScrollTopTimeout = 0;\n }, 0);\n }); */\n\n const c = this.controlContainer = document.createElement('div');\n c.classList.add('chat-input-control', 'chat-input-wrapper');\n this.inputContainer.append(c);\n }\n\n public constructPeerHelpers() {\n this.replyElements.container = document.createElement('div');\n this.replyElements.container.classList.add('reply-wrapper');\n\n this.replyElements.iconBtn = ButtonIcon('');\n this.replyElements.cancelBtn = ButtonIcon('close reply-cancel', {noRipple: true});\n\n this.replyElements.container.append(this.replyElements.iconBtn, this.replyElements.cancelBtn);\n\n //\n\n const onHideAuthorClick = () => {\n isChangingAuthor = true;\n };\n\n const onHideCaptionClick = () => {\n isChangingAuthor = false;\n };\n\n const forwardElements: ChatInput['forwardElements'] = this.forwardElements = {} as any;\n let isChangingAuthor = false;\n const forwardButtons: ButtonMenuItemOptions[] = [\n forwardElements.showSender = {\n text: 'Chat.Alert.Forward.Action.Show1',\n onClick: onHideAuthorClick,\n checkForClose: () => this.canToggleHideAuthor(),\n checkboxField: new CheckboxField({checked: true})\n },\n forwardElements.hideSender = {\n text: 'Chat.Alert.Forward.Action.Hide1',\n onClick: onHideAuthorClick,\n checkForClose: () => this.canToggleHideAuthor(),\n checkboxField: new CheckboxField({checked: false})\n },\n forwardElements.showCaption = {\n text: 'Chat.Alert.Forward.Action.ShowCaption',\n onClick: onHideCaptionClick,\n checkboxField: new CheckboxField({checked: true})\n },\n forwardElements.hideCaption = {\n text: 'Chat.Alert.Forward.Action.HideCaption',\n onClick: onHideCaptionClick,\n checkboxField: new CheckboxField({checked: false})\n },\n forwardElements.changePeer = {\n text: 'Chat.Alert.Forward.Action.Another',\n onClick: () => {\n this.changeForwardRecipient();\n },\n icon: 'replace'\n }\n ];\n const forwardBtnMenu = forwardElements.container = ButtonMenuSync({\n buttons: forwardButtons,\n listenerSetter: this.listenerSetter\n });\n // forwardBtnMenu.classList.add('top-center');\n\n const children = Array.from(forwardBtnMenu.children) as HTMLElement[];\n const groups: {\n elements: HTMLElement[],\n onChange: (value: string, event: Event) => void\n }[] = [{\n elements: children.slice(0, 2),\n onChange: (value, e) => {\n const checked = !!+value;\n if(isChangingAuthor) {\n this.forwardWasDroppingAuthor = !checked;\n }\n\n const replyTitle = this.replyElements.container.querySelector('.reply-title');\n if(replyTitle) {\n const el = replyTitle.firstElementChild as HTMLElement;\n const i = I18n.weakMap.get(el) as I18n.IntlElement;\n const langPackKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\n i.key = langPackKey;\n i.update();\n }\n }\n }, {\n elements: children.slice(2, 4),\n onChange: (value) => {\n const checked = !!+value;\n let b: ButtonMenuItemOptions;\n if(checked && this.forwardWasDroppingAuthor !== undefined) {\n b = this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender;\n } else {\n b = checked ? forwardElements.showSender : forwardElements.hideSender;\n }\n\n b.checkboxField.checked = true;\n }\n }];\n groups.forEach((group) => {\n const container = RadioForm(group.elements.map((e) => {\n return {\n container: e,\n input: e.querySelector('input')\n };\n }), group.onChange);\n\n const hr = document.createElement('hr');\n container.append(hr);\n forwardBtnMenu.append(container);\n });\n\n forwardBtnMenu.append(forwardElements.changePeer.element);\n\n if(!IS_TOUCH_SUPPORTED) {\n const forwardHover = this.forwardHover = new DropdownHover({\n element: forwardBtnMenu\n });\n }\n\n forwardElements.modifyArgs = forwardButtons.slice(0, -1);\n this.replyElements.container.append(forwardBtnMenu);\n\n forwardElements.modifyArgs.forEach((b, idx) => {\n const {input} = b.checkboxField;\n input.type = 'radio';\n input.name = idx < 2 ? 'author' : 'caption';\n input.value = '' + +!(idx % 2);\n });\n\n //\n\n this.newMessageWrapper = document.createElement('div');\n this.newMessageWrapper.classList.add('new-message-wrapper');\n\n this.replyInTopicOverlay = document.createElement('div');\n this.replyInTopicOverlay.classList.add('reply-in-topic-overlay', 'hide');\n this.replyInTopicOverlay.append(i18n('Chat.Input.ReplyToAnswer'));\n\n this.btnToggleEmoticons = ButtonIcon('none toggle-emoticons', {noRipple: true});\n\n this.inputMessageContainer = document.createElement('div');\n this.inputMessageContainer.classList.add('input-message-container');\n\n this.goDownUnreadBadge = document.createElement('span');\n this.goDownUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\n this.goDownBtn.append(this.goDownUnreadBadge);\n\n this.goMentionBtn = ButtonCorner({icon: 'mention', className: 'bubbles-corner-button chat-secondary-button bubbles-go-mention'});\n this.goMentionUnreadBadge = document.createElement('span');\n this.goMentionUnreadBadge.classList.add('badge', 'badge-24', 'badge-primary');\n this.goMentionBtn.append(this.goMentionUnreadBadge);\n this.inputContainer.append(this.goMentionBtn);\n\n attachClickEvent(this.goMentionBtn, (e) => {\n cancelEvent(e);\n const middleware = this.chat.bubbles.getMiddleware();\n this.managers.appMessagesManager.goToNextMention(this.chat.peerId, this.chat.threadId).then((mid) => {\n if(!middleware()) {\n return;\n }\n\n if(mid) {\n this.chat.setMessageId(mid);\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.btnScheduled = ButtonIcon('scheduled btn-scheduled float hide', {noRipple: true});\n\n attachClickEvent(this.btnScheduled, (e) => {\n this.appImManager.openScheduled(this.chat.peerId);\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('scheduled_new', ({peerId}) => {\n if(this.chat.peerId !== peerId) {\n return;\n }\n\n this.btnScheduled.classList.remove('hide');\n });\n\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId}) => {\n if(this.chat.peerId !== peerId) {\n return;\n }\n\n this.managers.appMessagesManager.getScheduledMessages(this.chat.peerId).then((value) => {\n this.btnScheduled.classList.toggle('hide', !value.length);\n });\n });\n\n this.btnToggleReplyMarkup = ButtonIcon('botcom toggle-reply-markup float hide', {noRipple: true});\n this.replyKeyboard = new ReplyKeyboard({\n appendTo: this.rowsWrapper,\n listenerSetter: this.listenerSetter,\n managers: this.managers,\n btnHover: this.btnToggleReplyMarkup,\n chatInput: this\n });\n this.listenerSetter.add(this.replyKeyboard)('open', () => this.btnToggleReplyMarkup.classList.add('active'));\n this.listenerSetter.add(this.replyKeyboard)('close', () => this.btnToggleReplyMarkup.classList.remove('active'));\n\n this.botCommands = new ChatBotCommands(this.rowsWrapper, this, this.managers);\n this.botCommandsToggle = document.createElement('div');\n this.botCommandsToggle.classList.add('new-message-bot-commands');\n\n const scaler = document.createElement('div');\n scaler.classList.add('new-message-bot-commands-icon-scale');\n\n const icon = this.botCommandsIcon = document.createElement('div');\n icon.classList.add('animated-menu-icon', 'animated-menu-close-icon');\n scaler.append(icon);\n this.botCommandsToggle.append(scaler);\n\n attachClickEvent(this.botCommandsToggle, (e) => {\n cancelEvent(e);\n const isShown = icon.classList.contains('state-back');\n if(isShown) {\n this.botCommands.toggle(true);\n icon.classList.remove('state-back');\n } else {\n this.botCommands.setUserId(this.chat.peerId.toUserId(), this.chat.bubbles.getMiddleware());\n icon.classList.add('state-back');\n }\n }, {listenerSetter: this.listenerSetter});\n\n this.botCommands.addEventListener('visible', () => {\n icon.classList.add('state-back');\n });\n\n this.botCommands.addEventListener('hiding', () => {\n icon.classList.remove('state-back');\n });\n\n this.attachMenuButtons = [{\n icon: 'image',\n text: 'Chat.Input.Attach.PhotoOrVideo',\n onClick: () => {\n this.fileInput.value = '';\n const accept = [...MEDIA_MIME_TYPES_SUPPORTED].join(', ');\n this.fileInput.setAttribute('accept', accept);\n this.willAttachType = 'media';\n this.fileInput.click();\n },\n verify: () => this.chat.canSend('send_media')\n }, {\n icon: 'document',\n text: 'Chat.Input.Attach.Document',\n onClick: () => {\n this.fileInput.value = '';\n this.fileInput.removeAttribute('accept');\n this.willAttachType = 'document';\n this.fileInput.click();\n },\n verify: () => this.chat.canSend('send_media')\n }, {\n icon: 'poll',\n text: 'Poll',\n onClick: () => {\n PopupElement.createPopup(PopupCreatePoll, this.chat).show();\n },\n verify: () => (this.chat.peerId.isAnyChat() || this.chat.isBot) && this.chat.canSend('send_polls')\n }];\n\n const attachMenuButtons = this.attachMenuButtons.slice();\n this.attachMenu = ButtonMenuToggle({\n buttonOptions: {noRipple: true},\n listenerSetter: this.listenerSetter,\n direction: 'top-left',\n buttons: this.attachMenuButtons,\n onOpenBefore: async() => {\n const attachMenuBots = await this.managers.appAttachMenuBotsManager.getAttachMenuBots();\n const buttons = attachMenuButtons.slice();\n const attachMenuBotsButtons = attachMenuBots.filter((attachMenuBot) => {\n return !attachMenuBot.pFlags.inactive;\n }).map((attachMenuBot) => {\n const icon = getAttachMenuBotIcon(attachMenuBot);\n const button: typeof buttons[0] = {\n regularText: wrapEmojiText(attachMenuBot.short_name),\n onClick: () => {\n this.managers.appAttachMenuBotsManager.requestWebView({\n botId: attachMenuBot.bot_id,\n peerId: this.chat.peerId,\n ...this.chat.getMessageSendingParams()\n }).then((webViewResultUrl) => {\n const SANDBOX_ATTRIBUTES = [\n 'allow-scripts',\n 'allow-same-origin',\n 'allow-popups',\n 'allow-forms',\n 'allow-modals',\n 'allow-storage-access-by-user-activation'\n ].join(' ');\n\n class P extends PopupElement<{\n finish: () => void\n }> {\n private telegramWebView: TelegramWebView;\n\n constructor(private url: string) {\n super('popup-payment popup-payment-verification', {\n closable: true,\n overlayClosable: true,\n body: true,\n titleRaw: attachMenuBot.short_name\n });\n\n this.d();\n }\n\n protected destroy() {\n this.telegramWebView.destroy();\n return super.destroy();\n }\n\n private d() {\n const telegramWebView = this.telegramWebView = new TelegramWebView({\n url: this.url,\n sandbox: SANDBOX_ATTRIBUTES\n });\n\n telegramWebView.iframe.classList.add('payment-verification');\n\n this.body.append(telegramWebView.iframe);\n this.show();\n telegramWebView.onMount();\n }\n }\n\n new P(webViewResultUrl.url);\n });\n },\n iconDoc: icon?.icon as MyDocument,\n verify: async() => {\n let found = false;\n\n const verifyMap: {\n [type in AttachMenuPeerType['_']]: () => boolean | Promise\n } = {\n attachMenuPeerTypeSameBotPM: () => this.chat.peerId.toUserId() === attachMenuBot.bot_id,\n attachMenuPeerTypeBotPM: () => this.chat.isBot,\n attachMenuPeerTypePM: () => this.chat.peerId.isUser(),\n attachMenuPeerTypeChat: () => this.chat.isAnyGroup,\n attachMenuPeerTypeBroadcast: () => this.chat.isBroadcast\n };\n\n for(const peerType of attachMenuBot.peer_types) {\n const verify = verifyMap[peerType._];\n found = await verify();\n if(found) {\n break;\n }\n }\n\n return found;\n }\n };\n\n return button;\n });\n\n buttons.splice(buttons.length, 0, ...attachMenuBotsButtons);\n this.attachMenuButtons.splice(0, this.attachMenuButtons.length, ...buttons);\n }\n });\n this.attachMenu.classList.add('attach-file', 'tgico-attach');\n this.attachMenu.classList.remove('tgico-more');\n\n // this.inputContainer.append(this.sendMenu);\n\n this.recordTimeEl = document.createElement('div');\n this.recordTimeEl.classList.add('record-time');\n\n this.fileInput = document.createElement('input');\n this.fileInput.type = 'file';\n this.fileInput.multiple = true;\n this.fileInput.style.display = 'none';\n\n this.newMessageWrapper.append(...[this.botCommandsToggle, this.btnToggleEmoticons, this.inputMessageContainer, this.btnScheduled, this.btnToggleReplyMarkup, this.attachMenu, this.recordTimeEl, this.fileInput].filter(Boolean));\n\n this.rowsWrapper.append(this.replyElements.container);\n this.autocompleteHelperController = new AutocompleteHelperController();\n this.stickersHelper = new StickersHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.managers);\n this.emojiHelper = new EmojiHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\n this.commandsHelper = new CommandsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\n this.mentionsHelper = new MentionsHelper(this.rowsWrapper, this.autocompleteHelperController, this, this.managers);\n this.inlineHelper = new InlineHelper(this.rowsWrapper, this.autocompleteHelperController, this.chat, this.managers);\n this.rowsWrapper.append(this.newMessageWrapper);\n\n this.btnCancelRecord = ButtonIcon('binfilled btn-circle btn-record-cancel chat-secondary-button');\n\n this.btnSendContainer = document.createElement('div');\n this.btnSendContainer.classList.add('btn-send-container');\n\n this.recordRippleEl = document.createElement('div');\n this.recordRippleEl.classList.add('record-ripple');\n\n this.btnSend = ButtonIcon('none btn-circle btn-send animated-button-icon');\n this.btnSend.insertAdjacentHTML('afterbegin', `\n \n \n \n \n `);\n\n this.btnSendContainer.append(this.recordRippleEl, this.btnSend);\n\n this.sendMenu = new SendMenu({\n onSilentClick: () => {\n this.sendSilent = true;\n this.sendMessage();\n },\n onScheduleClick: () => {\n this.scheduleSending(undefined);\n },\n listenerSetter: this.listenerSetter,\n openSide: 'top-left',\n onContextElement: this.btnSend,\n onOpen: () => {\n return this.chat.type !== 'scheduled' && (!this.isInputEmpty() || !!Object.keys(this.forwarding).length);\n }\n });\n\n this.btnSendContainer.append(this.sendMenu.sendMenu);\n\n this.inputContainer.append(this.btnCancelRecord, this.btnSendContainer);\n\n emoticonsDropdown.attachButtonListener(this.btnToggleEmoticons, this.listenerSetter);\n this.listenerSetter.add(emoticonsDropdown)('open', this.onEmoticonsOpen);\n this.listenerSetter.add(emoticonsDropdown)('close', this.onEmoticonsClose);\n\n this.attachMessageInputField();\n\n /* this.attachMenu.addEventListener('mousedown', (e) => {\n const hidden = this.attachMenu.querySelectorAll('.hide');\n if(hidden.length === this.attachMenuButtons.length) {\n toast(POSTING_MEDIA_NOT_ALLOWED);\n cancelEvent(e);\n return false;\n }\n }, {passive: false, capture: true}); */\n\n this.listenerSetter.add(rootScope)('settings_updated', () => {\n if(this.stickersHelper || this.emojiHelper) {\n // this.previousQuery = undefined;\n this.previousQuery = '';\n this.checkAutocomplete();\n /* if(!rootScope.settings.stickers.suggest) {\n this.stickersHelper.checkEmoticon('');\n } else {\n this.onMessageInput();\n } */\n }\n\n this.messageInputField?.onFakeInput();\n });\n\n this.listenerSetter.add(rootScope)('draft_updated', ({peerId, threadId, draft, force}) => {\n if(this.chat.threadId !== threadId || this.chat.peerId !== peerId || this.chat.type === 'scheduled') return;\n this.setDraft(draft, true, force);\n });\n\n this.listenerSetter.add(this.appImManager)('peer_changing', (chat) => {\n if(this.chat === chat && (this.chat.type === 'chat' || this.chat.type === 'discussion')) {\n this.saveDraft();\n }\n });\n\n this.listenerSetter.add(this.appImManager)('chat_changing', ({from, to}) => {\n if(this.chat === from) {\n this.autocompleteHelperController.toggleListNavigation(false);\n } else if(this.chat === to) {\n this.autocompleteHelperController.toggleListNavigation(true);\n }\n });\n\n this.listenerSetter.add(rootScope)('scheduled_delete', ({peerId, mids}) => {\n if(this.chat.type === 'scheduled' && this.chat.peerId === peerId && mids.includes(this.editMsgId)) {\n this.onMessageSent();\n }\n });\n\n this.listenerSetter.add(rootScope)('history_delete', ({peerId, msgs}) => {\n if(this.chat.peerId === peerId && this.chat.type !== 'scheduled') {\n if(msgs.has(this.editMsgId)) {\n this.onMessageSent();\n }\n\n if(this.replyToMsgId && msgs.has(this.replyToMsgId)) {\n this.clearHelper('reply');\n }\n\n /* if(this.chat.isStartButtonNeeded()) {\n this.setStartParam(BOT_START_PARAM);\n } */\n }\n });\n\n this.listenerSetter.add(rootScope)('dialogs_multiupdate', (dialogs) => {\n if(dialogs.has(this.chat.peerId) && (this.chat.type === 'chat' || this.chat.type === 'discussion')) {\n if(this.startParam === BOT_START_PARAM) {\n this.setStartParam();\n } else { // updateNewMessage comes earlier than dialog appers\n this.center(true);\n }\n }\n });\n\n try {\n this.recorder = new Recorder({\n // encoderBitRate: 32,\n // encoderPath: \"../dist/encoderWorker.min.js\",\n encoderSampleRate: 48000,\n monitorGain: 0,\n numberOfChannels: 1,\n recordingGain: 1,\n reuseWorker: true\n });\n } catch(err) {\n console.error('Recorder constructor error:', err);\n }\n\n this.updateSendBtn();\n\n this.listenerSetter.add(this.fileInput)('change', (e) => {\n const files = (e.target as HTMLInputElement & EventTarget).files;\n if(!files.length) {\n return;\n }\n\n PopupElement.createPopup(PopupNewMedia, this.chat, Array.from(files).slice(), this.willAttachType);\n this.fileInput.value = '';\n }, false);\n\n /* let time = Date.now();\n this.btnSend.addEventListener('touchstart', (e) => {\n time = Date.now();\n });\n\n let eventName1 = 'touchend';\n this.btnSend.addEventListener(eventName1, (e: Event) => {\n //cancelEvent(e);\n console.log(eventName1 + ', time: ' + (Date.now() - time));\n });\n\n let eventName = 'mousedown';\n this.btnSend.addEventListener(eventName, (e: Event) => {\n cancelEvent(e);\n console.log(eventName + ', time: ' + (Date.now() - time));\n }); */\n attachClickEvent(this.btnSend, this.onBtnSendClick, {listenerSetter: this.listenerSetter, touchMouseDown: true});\n\n if(this.recorder) {\n attachClickEvent(this.btnCancelRecord, this.onCancelRecordClick, {listenerSetter: this.listenerSetter});\n\n this.recorder.onstop = () => {\n this.setRecording(false);\n this.chatInput.classList.remove('is-locked');\n this.recordRippleEl.style.transform = '';\n };\n\n this.recorder.ondataavailable = (typedArray: Uint8Array) => {\n if(this.releaseMediaPlayback) {\n this.releaseMediaPlayback();\n this.releaseMediaPlayback = undefined;\n }\n\n if(this.recordingOverlayListener) {\n this.listenerSetter.remove(this.recordingOverlayListener);\n this.recordingOverlayListener = undefined;\n }\n\n if(this.recordingNavigationItem) {\n appNavigationController.removeItem(this.recordingNavigationItem);\n this.recordingNavigationItem = undefined;\n }\n\n if(this.recordCanceled) {\n return;\n }\n\n const {peerId, threadId} = this.chat;\n const replyToMsgId = this.replyToMsgId;\n\n const duration = (Date.now() - this.recordStartTime) / 1000 | 0;\n const dataBlob = new Blob([typedArray], {type: 'audio/ogg'});\n /* const fileName = new Date().toISOString() + \".opus\";\n console.log('Recorder data received', typedArray, dataBlob); */\n\n // let perf = performance.now();\n opusDecodeController.decode(typedArray, true).then((result) => {\n // console.log('WAVEFORM!:', /* waveform, */performance.now() - perf);\n\n opusDecodeController.setKeepAlive(false);\n\n // тут objectURL ставится уже с audio/wav\n this.managers.appMessagesManager.sendFile(peerId, {\n file: dataBlob,\n isVoiceMessage: true,\n isMedia: true,\n duration,\n waveform: result.waveform,\n objectURL: result.url,\n replyToMsgId,\n threadId,\n clearDraft: true\n });\n\n this.onMessageSent(false, true);\n });\n };\n }\n\n attachClickEvent(this.replyElements.cancelBtn, this.onHelperCancel, {listenerSetter: this.listenerSetter});\n attachClickEvent(this.replyElements.container, this.onHelperClick, {listenerSetter: this.listenerSetter});\n\n this.saveDraftDebounced = debounce(() => this.saveDraft(), 2500, false, true);\n\n this.botStartBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button');\n this.botStartBtn.append(i18n('BotStart'));\n\n attachClickEvent(this.botStartBtn, () => {\n const {startParam} = this;\n if(startParam === undefined) {\n return;\n }\n\n const toggle = this.toggleBotStartBtnDisability = toggleDisability([this.botStartBtn], true);\n const peerId = this.chat.peerId;\n const middleware = this.chat.bubbles.getMiddleware(() => {\n return this.chat.peerId === peerId && this.startParam === startParam && this.toggleBotStartBtnDisability === toggle;\n });\n\n this.managers.appMessagesManager.startBot(peerId.toUserId(), undefined, startParam).then(() => {\n if(middleware()) {\n toggle();\n this.toggleBotStartBtnDisability = undefined;\n this.setStartParam();\n }\n });\n }, {listenerSetter: this.listenerSetter});\n\n this.controlContainer.append(this.botStartBtn, this.replyInTopicOverlay);\n\n // * pinned part start\n this.pinnedControlBtn = Button('btn-primary btn-transparent text-bold chat-input-control-button', {icon: 'unpin'});\n this.controlContainer.append(this.pinnedControlBtn);\n\n this.listenerSetter.add(this.pinnedControlBtn)('click', () => {\n const peerId = this.chat.peerId;\n\n new PopupPinMessage(peerId, 0, true, () => {\n this.chat.appImManager.setPeer(); // * close tab\n\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\n const originalChat = this.chat.appImManager.chat;\n if(originalChat.topbar.pinnedMessage) {\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\n }\n });\n });\n // * pinned part end\n }\n\n public _center(neededFakeContainer: HTMLElement, animate?: boolean) {\n if(!neededFakeContainer && !this.inputContainer.classList.contains('is-centering')) {\n return;\n }\n\n if(neededFakeContainer === this.fakeWrapperTo) {\n return;\n }\n\n /* if(neededFakeContainer === this.botStartContainer && this.fakeWrapperTo === this.fakeSelectionWrapper) {\n this.inputContainer.classList.remove('is-centering');\n void this.rowsWrapper.offsetLeft; // reflow\n // this.inputContainer.classList.add('is-centering');\n // void this.rowsWrapper.offsetLeft; // reflow\n } */\n\n const fakeSelectionWrapper = neededFakeContainer || this.fakeWrapperTo;\n const forwards = !!neededFakeContainer;\n const oldFakeWrapperTo = this.fakeWrapperTo;\n let transform = '', borderRadius = '', needTranslateX: number;\n // if(forwards) {]\n const fakeSelectionRect = fakeSelectionWrapper.getBoundingClientRect();\n const fakeRowsRect = this.fakeRowsWrapper.getBoundingClientRect();\n const widthFrom = fakeRowsRect.width;\n const widthTo = fakeSelectionRect.width;\n\n if(widthFrom !== widthTo) {\n const scale = (widthTo/* - 8 */) / widthFrom;\n const initTranslateX = (widthFrom - widthTo) / 2;\n needTranslateX = fakeSelectionRect.left - fakeRowsRect.left - initTranslateX;\n\n if(forwards) {\n transform = `translateX(${needTranslateX}px) scaleX(${scale})`;\n // transform = `translateX(0px) scaleX(${scale})`;\n\n if(scale < 1) {\n const br = 16;\n borderRadius = '' + (br + br * (1 - scale)) + 'px';\n }\n }\n // scale = widthTo / widthFrom;\n }\n // }\n\n this.fakeWrapperTo = neededFakeContainer;\n\n const duration = animate ? 200 : 0;\n SetTransition({\n element: this.inputContainer,\n className: 'is-centering',\n forwards,\n duration\n });\n SetTransition({\n element: this.rowsWrapperWrapper,\n className: 'is-centering-to-control',\n forwards: !!(forwards && neededFakeContainer && neededFakeContainer.classList.contains('chat-input-control')),\n duration\n });\n this.rowsWrapper.style.transform = transform;\n this.rowsWrapper.style.borderRadius = borderRadius;\n\n return {\n transform,\n borderRadius,\n needTranslateX: oldFakeWrapperTo && (\n (\n neededFakeContainer &&\n neededFakeContainer.classList.contains('chat-input-control') &&\n oldFakeWrapperTo === this.fakeSelectionWrapper\n ) || oldFakeWrapperTo.classList.contains('chat-input-control')\n ) ? needTranslateX * -.5 : needTranslateX,\n widthFrom,\n widthTo\n };\n }\n\n public async center(animate = false) {\n return this._center(await this.getNeededFakeContainer(), animate);\n }\n\n public setStartParam(startParam?: string) {\n if(this.startParam === startParam) {\n return;\n }\n\n this.startParam = startParam;\n this.center(true);\n }\n\n public isReplyInTopicOverlayNeeded() {\n return this.chat.isForum &&\n !this.chat.isForumTopic &&\n !this.replyToMsgId &&\n this.chat.type === 'chat';\n }\n\n public async getNeededFakeContainer(startParam = this.startParam) {\n if(this.chat.selection.isSelecting) {\n return this.fakeSelectionWrapper;\n } else if(\n startParam !== undefined ||\n !(await this.chat.canSend()) ||\n this.chat.type === 'pinned' ||\n await this.chat.isStartButtonNeeded() ||\n this.isReplyInTopicOverlayNeeded()\n ) {\n return this.controlContainer;\n }\n }\n\n // public getActiveContainer() {\n // if(this.chat.selection.isSelecting) {\n // return this.chat\n // }\n // return this.startParam !== undefined ? this.botStartContainer : this.rowsWrapper;\n // }\n\n // public setActiveContainer() {\n // const container = this.activeContainer;\n // const newContainer = this.getActiveContainer();\n // if(newContainer === container) {\n // return;\n // }\n\n\n // }\n\n private onCancelRecordClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n this.recordCanceled = true;\n this.recorder.stop();\n opusDecodeController.setKeepAlive(false);\n };\n\n private onEmoticonsOpen = () => {\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\n this.btnToggleEmoticons.classList.toggle(toggleClass, true);\n };\n\n private onEmoticonsClose = () => {\n const toggleClass = IS_TOUCH_SUPPORTED ? 'flip-icon' : 'active';\n this.btnToggleEmoticons.classList.toggle(toggleClass, false);\n };\n\n public getReadyToSend(callback: () => void) {\n return this.chat.type === 'scheduled' ? (this.scheduleSending(callback), true) : (callback(), false);\n }\n\n public scheduleSending = async(callback: () => void = this.sendMessage.bind(this, true), initDate = new Date()) => {\n const {peerId} = this.chat;\n const middleware = this.chat.bubbles.getMiddleware();\n const canSendWhenOnline = rootScope.myId !== peerId && peerId.isUser() && await this.managers.appUsersManager.isUserOnlineVisible(peerId);\n\n new PopupSchedule(initDate, (timestamp) => {\n if(!middleware()) {\n return;\n }\n\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\n if(timestamp <= minTimestamp) {\n timestamp = undefined;\n }\n\n this.scheduleDate = timestamp;\n callback();\n\n if(this.chat.type !== 'scheduled' && timestamp) {\n setTimeout(() => { // ! need timeout here because .forwardMessages will be called after timeout\n if(!middleware()) {\n return;\n }\n\n const popups = PopupElement.getPopups(PopupStickers);\n popups.forEach((popup) => popup.hide());\n\n this.appImManager.openScheduled(peerId);\n }, 0);\n }\n }, canSendWhenOnline).show();\n };\n\n public async setUnreadCount() {\n if(!this.goDownUnreadBadge) {\n return;\n }\n\n const dialog = await this.managers.dialogsStorage.getDialogOrTopic(this.chat.peerId, this.chat.type === 'discussion' ? undefined : this.chat.threadId);\n const count = dialog?.unread_count;\n this.goDownUnreadBadge.innerText = '' + (count || '');\n this.goDownUnreadBadge.classList.toggle('badge-gray', await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.chat.peerId, respectType: true, threadId: this.chat.threadId}));\n\n if(this.goMentionUnreadBadge && this.chat.type === 'chat') {\n const hasMentions = !!(dialog?.unread_mentions_count && dialog.unread_count);\n this.goMentionUnreadBadge.innerText = hasMentions ? '' + (dialog.unread_mentions_count) : '';\n this.goMentionBtn.classList.toggle('is-visible', hasMentions);\n }\n }\n\n public getCurrentInputAsDraft() {\n const {value, entities} = getRichValueWithCaret(this.messageInputField.input, true, false);\n\n let draft: DraftMessage.draftMessage;\n if(value.length || this.replyToMsgId) {\n draft = {\n _: 'draftMessage',\n date: tsNow(true),\n message: value,\n entities: entities.length ? entities : undefined,\n pFlags: {\n no_webpage: this.noWebPage\n },\n reply_to_msg_id: this.replyToMsgId\n };\n }\n\n return draft;\n }\n\n public saveDraft() {\n if(!this.chat.peerId || this.editMsgId || this.chat.type === 'scheduled') return;\n const draft = this.getCurrentInputAsDraft();\n this.managers.appDraftsManager.syncDraft(this.chat.peerId, this.chat.threadId, draft);\n }\n\n public destroy() {\n // this.chat.log.error('Input destroying');\n\n this.listenerSetter.removeAll();\n }\n\n public cleanup(helperToo = true) {\n if(!this.chat.peerId) {\n this.chatInput.classList.add('hide');\n this.goDownBtn.classList.add('hide');\n }\n\n cancelSelection();\n\n this.lastTimeType = 0;\n this.startParam = undefined;\n\n if(this.toggleBotStartBtnDisability) {\n this.toggleBotStartBtnDisability();\n this.toggleBotStartBtnDisability = undefined;\n }\n\n if(this.messageInput) {\n this.clearInput();\n helperToo && this.clearHelper();\n }\n }\n\n public async setDraft(draft?: MyDraftMessage, fromUpdate = true, force = false) {\n if((!force && !isInputEmpty(this.messageInput)) || this.chat.type === 'scheduled') return false;\n\n if(!draft) {\n draft = await this.managers.appDraftsManager.getDraft(this.chat.peerId, this.chat.threadId);\n\n if(!draft) {\n if(force) { // this situation can only happen when sending message with clearDraft\n /* const height = this.chatInput.getBoundingClientRect().height;\n const willChangeHeight = 78 - height;\n this.willChangeHeight = willChangeHeight; */\n if(this.chat.container.classList.contains('is-helper-active')) {\n this.t();\n }\n\n this.messageInputField.inputFake.textContent = '';\n this.messageInputField.onFakeInput(false);\n\n ((this.chat.bubbles.messagesQueuePromise || Promise.resolve()) as Promise).then(() => {\n fastRaf(() => {\n this.onMessageSent();\n });\n });\n }\n\n return false;\n }\n }\n\n const wrappedDraft = wrapDraft(draft, this.chat.peerId);\n const currentDraft = this.getCurrentInputAsDraft();\n\n if(draftsAreEqual(draft, currentDraft) &&/* this.messageInputField.value === wrappedDraft && */this.replyToMsgId === draft.reply_to_msg_id) return false;\n\n if(fromUpdate) {\n this.clearHelper();\n }\n\n this.noWebPage = draft.pFlags.no_webpage;\n if(draft.reply_to_msg_id) {\n this.initMessageReply(draft.reply_to_msg_id);\n }\n\n this.setInputValue(wrappedDraft, fromUpdate, fromUpdate);\n return true;\n }\n\n private createSendAs() {\n this.sendAsPeerId = undefined;\n\n if(this.chat.type === 'chat' || this.chat.type === 'discussion') {\n let firstChange = true;\n this.sendAs = new ChatSendAs(\n this.managers,\n (container, skipAnimation) => {\n let useRafs = 0;\n if(!container.parentElement) {\n this.newMessageWrapper.prepend(container);\n useRafs = 2;\n }\n\n this.updateOffset('as', true, skipAnimation, useRafs);\n },\n (sendAsPeerId) => {\n this.sendAsPeerId = sendAsPeerId;\n\n // do not change placeholder earlier than finishPeerChange does\n if(firstChange) {\n firstChange = false;\n return;\n }\n\n this.getPlaceholderKey().then((key) => {\n this.updateMessageInputPlaceholder(key);\n });\n }\n );\n } else {\n this.sendAs = undefined;\n }\n\n return this.sendAs;\n }\n\n public async finishPeerChange(startParam?: string) {\n const peerId = this.chat.peerId;\n\n const {forwardElements, btnScheduled, replyKeyboard, sendMenu, goDownBtn, chatInput, botCommandsToggle} = this;\n\n const previousSendAs = this.sendAs;\n const sendAs = this.createSendAs();\n\n const [\n isBroadcast,\n canPinMessage,\n isBot,\n canSend,\n neededFakeContainer,\n ackedPeerFull,\n ackedScheduledMids,\n setSendAsCallback,\n filteredAttachMenuButtons\n ] = await Promise.all([\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.canPinMessage(peerId),\n this.managers.appPeersManager.isBot(peerId),\n this.chat.canSend(),\n this.getNeededFakeContainer(startParam),\n modifyAckedPromise(this.managers.acknowledged.appProfileManager.getProfileByPeerId(peerId)),\n btnScheduled ? modifyAckedPromise(this.managers.acknowledged.appMessagesManager.getScheduledMessages(peerId)) : undefined,\n sendAs ? (sendAs.setPeerId(this.chat.peerId), sendAs.updateManual(true)) : undefined,\n this.filterAttachMenuButtons()\n ]);\n\n const placeholderKey = this.messageInput ? await this.getPlaceholderKey() : undefined;\n\n return () => {\n // console.warn('[input] finishpeerchange start');\n\n chatInput.classList.remove('hide');\n goDownBtn.classList.toggle('is-broadcast', isBroadcast);\n goDownBtn.classList.remove('hide');\n\n this.messageInputField?.onFakeInput();\n\n if(this.goDownUnreadBadge) {\n this.setUnreadCount();\n }\n\n if(this.chat.type === 'pinned') {\n chatInput.classList.toggle('can-pin', canPinMessage);\n }/* else if(this.chat.type === 'chat') {\n } */\n\n if(forwardElements) {\n this.forwardWasDroppingAuthor = false;\n forwardElements.showCaption.checkboxField.setValueSilently(true);\n forwardElements.showSender.checkboxField.setValueSilently(true);\n }\n\n if(btnScheduled && ackedScheduledMids) {\n btnScheduled.classList.add('hide');\n const middleware = this.chat.bubbles.getMiddleware();\n callbackify(ackedScheduledMids.result, (mids) => {\n if(!middleware() || !mids) return;\n btnScheduled.classList.toggle('hide', !mids.length);\n });\n }\n\n if(this.newMessageWrapper) {\n this.updateOffset(null, false, true);\n }\n\n if(botCommandsToggle) {\n this.hasBotCommands = undefined;\n this.botCommands.toggle(true, undefined, true);\n this.updateBotCommandsToggle(true);\n botCommandsToggle.remove();\n if(isBot) {\n const middleware = this.chat.bubbles.getMiddleware();\n const result = ackedPeerFull.result;\n callbackify(result, (userFull) => {\n if(!middleware()) return;\n this.updateBotCommands(userFull as UserFull.userFull, !(result instanceof Promise));\n });\n }\n }\n\n if(previousSendAs) {\n previousSendAs.destroy();\n }\n\n if(setSendAsCallback) {\n setSendAsCallback();\n }\n\n if(replyKeyboard) {\n replyKeyboard.setPeer(peerId);\n }\n\n if(sendMenu) {\n sendMenu.setPeerId(peerId);\n }\n\n if(this.messageInput) {\n this.updateMessageInput(canSend, placeholderKey, filteredAttachMenuButtons);\n this.messageInput.dataset.peerId = '' + peerId;\n }\n\n let haveSomethingInControl = false;\n if(this.pinnedControlBtn) {\n const good = this.chat.type === 'pinned';\n haveSomethingInControl ||= good;\n this.pinnedControlBtn.classList.toggle('hide', !good);\n this.pinnedControlBtn.replaceChildren(i18n(canPinMessage ? 'Chat.Input.UnpinAll' : 'Chat.Pinned.DontShow'));\n }\n\n {\n const good = this.chat.isForum && !this.chat.isForumTopic && this.chat.type === 'chat';\n haveSomethingInControl ||= good;\n this.replyInTopicOverlay.classList.toggle('hide', !good);\n }\n\n this.botStartBtn.classList.toggle('hide', haveSomethingInControl);\n\n // * testing\n // this.startParam = this.appPeersManager.isBot(peerId) ? '123' : undefined;\n\n this.startParam = startParam;\n\n this._center(neededFakeContainer, false);\n\n // console.warn('[input] finishpeerchange ends');\n };\n }\n\n private updateOffset(type: 'commands' | 'as', forwards: boolean, skipAnimation?: boolean, useRafs?: number) {\n if(type) {\n this.newMessageWrapper.dataset.offset = type;\n } else {\n delete this.newMessageWrapper.dataset.offset;\n }\n\n SetTransition({\n element: this.newMessageWrapper,\n className: 'has-offset',\n forwards,\n duration: skipAnimation ? 0 : 300,\n useRafs\n });\n }\n\n private updateBotCommands(userFull: UserFull.userFull, skipAnimation?: boolean) {\n this.hasBotCommands = !!userFull.bot_info?.commands?.length;\n this.updateBotCommandsToggle(skipAnimation);\n }\n\n private updateBotCommandsToggle(skipAnimation?: boolean) {\n const {botCommandsToggle, hasBotCommands} = this;\n\n const show = !!hasBotCommands && this.isInputEmpty();\n if(!hasBotCommands) {\n if(!botCommandsToggle.parentElement) {\n return;\n }\n\n botCommandsToggle.remove();\n }\n\n const forwards = show;\n const useRafs = botCommandsToggle.parentElement ? 0 : 2;\n\n if(!botCommandsToggle.parentElement) {\n this.newMessageWrapper.prepend(botCommandsToggle);\n }\n\n this.updateOffset('commands', forwards, skipAnimation, useRafs);\n }\n\n private async getPlaceholderKey() {\n const {peerId, threadId, isForum} = this.chat;\n let key: LangPackKey;\n if(threadId && !isForum) {\n key = 'Comment';\n } else if(await this.managers.appPeersManager.isBroadcast(peerId)) {\n key = 'ChannelBroadcast';\n } else if(\n (this.sendAsPeerId !== undefined && this.sendAsPeerId !== rootScope.myId) ||\n await this.managers.appMessagesManager.isAnonymousSending(peerId)\n ) {\n key = 'SendAnonymously';\n } else {\n key = 'Message';\n }\n\n return key;\n }\n\n private updateMessageInputPlaceholder(key: LangPackKey) {\n // console.warn('[input] update placeholder');\n const i = I18n.weakMap.get(this.messageInput) as I18n.IntlElement;\n if(!i) {\n return;\n }\n\n i.compareAndUpdate({key});\n }\n\n private filterAttachMenuButtons() {\n if(!this.attachMenuButtons) return;\n return filterAsync(this.attachMenuButtons, (button) => {\n return button.verify();\n });\n }\n\n public updateMessageInput(canSend: boolean, placeholderKey: LangPackKey, visible: ChatInput['attachMenuButtons']) {\n const {chatInput, attachMenu, messageInput} = this;\n const {peerId, threadId} = this.chat;\n const isHidden = chatInput.classList.contains('is-hidden');\n const willBeHidden = !canSend;\n if(isHidden !== willBeHidden) {\n chatInput.classList.add('no-transition');\n chatInput.classList.toggle('is-hidden', !canSend);\n void chatInput.offsetLeft; // reflow\n chatInput.classList.remove('no-transition');\n }\n\n this.updateMessageInputPlaceholder(placeholderKey);\n\n if(!canSend) {\n messageInput.contentEditable = 'inherit';\n } else {\n messageInput.contentEditable = 'true';\n this.setDraft(undefined, false);\n\n if(!messageInput.innerHTML) {\n this.messageInputField.onFakeInput();\n }\n }\n\n if(attachMenu) {\n attachMenu.toggleAttribute('disabled', !visible.length);\n attachMenu.classList.toggle('btn-disabled', !visible.length);\n }\n\n this.updateSendBtn();\n }\n\n private attachMessageInputField() {\n const oldInputField = this.messageInputField;\n this.messageInputField = new InputFieldAnimated({\n placeholder: 'Message',\n name: 'message',\n withLinebreaks: true\n });\n\n this.messageInputField.input.classList.replace('input-field-input', 'input-message-input');\n this.messageInputField.inputFake.classList.replace('input-field-input', 'input-message-input');\n this.messageInput = this.messageInputField.input;\n this.messageInput.classList.add('no-scrollbar');\n this.attachMessageInputListeners();\n\n if(IS_STICKY_INPUT_BUGGED) {\n fixSafariStickyInputFocusing(this.messageInput);\n }\n\n if(oldInputField) {\n oldInputField.input.replaceWith(this.messageInputField.input);\n oldInputField.inputFake.replaceWith(this.messageInputField.inputFake);\n } else {\n this.inputMessageContainer.append(this.messageInputField.input, this.messageInputField.inputFake);\n }\n }\n\n private attachMessageInputListeners() {\n this.listenerSetter.add(this.messageInput)('keydown', (e) => {\n const key = e.key;\n\n if(isSendShortcutPressed(e)) {\n cancelEvent(e);\n this.sendMessage();\n } else if(e.ctrlKey || e.metaKey) {\n this.handleMarkdownShortcut(e);\n } else if((key === 'PageUp' || key === 'PageDown') && !e.shiftKey) { // * fix pushing page to left (Chrome Windows)\n e.preventDefault();\n\n if(key === 'PageUp') {\n const range = document.createRange();\n const sel = window.getSelection();\n\n range.setStart(this.messageInput.childNodes[0] || this.messageInput, 0);\n range.collapse(true);\n\n sel.removeAllRanges();\n sel.addRange(range);\n } else {\n placeCaretAtEnd(this.messageInput);\n }\n }\n });\n\n if(IS_TOUCH_SUPPORTED) {\n attachClickEvent(this.messageInput, (e) => {\n if(emoticonsDropdown.isActive()) {\n emoticonsDropdown.toggle(false);\n blurActiveElement();\n cancelEvent(e);\n // this.messageInput.focus();\n return;\n }\n\n this.appImManager.selectTab(APP_TABS.CHAT); // * set chat tab for album orientation\n // this.saveScroll();\n }, {listenerSetter: this.listenerSetter});\n\n /* this.listenerSetter.add(window)('resize', () => {\n this.restoreScroll();\n }); */\n\n /* if(isSafari) {\n this.listenerSetter.add(this.messageInput)('mousedown', () => {\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => {\n emoticonsDropdown.toggle(false);\n });\n });\n });\n } */\n }\n\n /* this.listenerSetter.add(this.messageInput)('beforeinput', (e: Event) => {\n // * validate due to manual formatting through browser's context menu\n const inputType = (e as InputEvent).inputType;\n //console.log('message beforeinput event', e);\n\n if(inputType.indexOf('format') === 0) {\n //console.log('message beforeinput format', e, inputType, this.messageInput.innerHTML);\n const markdownType = inputType.split('format')[1].toLowerCase() as MarkdownType;\n if(this.applyMarkdown(markdownType)) {\n cancelEvent(e); // * cancel legacy markdown event\n }\n }\n }); */\n this.listenerSetter.add(this.messageInput)('input', this.onMessageInput);\n this.listenerSetter.add(this.messageInput)('keyup', () => {\n this.checkAutocomplete();\n });\n\n this.listenerSetter.add(this.messageInput)('focusin', () => {\n if((this.chat.type === 'chat' || this.chat.type === 'discussion') &&\n this.chat.bubbles.scrollable.loadedAll.bottom) {\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId);\n }\n });\n }\n\n private prepareDocumentExecute = () => {\n this.executedHistory.push(this.messageInput.innerHTML);\n return () => this.canUndoFromHTML = this.messageInput.innerHTML;\n };\n\n private undoRedo = (e: Event, type: 'undo' | 'redo', needHTML: string) => {\n cancelEvent(e); // cancel legacy event\n\n let html = this.messageInput.innerHTML;\n if(html && html !== needHTML) {\n this.lockRedo = true;\n\n let sameHTMLTimes = 0;\n do {\n document.execCommand(type, false, null);\n const currentHTML = this.messageInput.innerHTML;\n if(html === currentHTML) {\n if(++sameHTMLTimes > 2) { // * unlink, removeFormat (а может и нет, случай: заболдить подчёркнутый текст (выделить ровно его), попробовать отменить)\n break;\n }\n } else {\n sameHTMLTimes = 0;\n }\n\n html = currentHTML;\n } while(html !== needHTML);\n\n this.lockRedo = false;\n }\n };\n\n public applyMarkdown(type: MarkdownType, href?: string) {\n // const MONOSPACE_FONT = 'var(--font-monospace)';\n // const SPOILER_FONT = 'spoiler';\n const commandsMap: Partial<{[key in typeof type]: string | (() => void)}> = {\n // bold: 'Bold',\n // italic: 'Italic',\n // underline: 'Underline',\n // strikethrough: 'Strikethrough',\n // monospace: () => document.execCommand('fontName', false, MONOSPACE_FONT),\n link: href ? () => document.execCommand('createLink', false, href) : () => document.execCommand('unlink', false, null)\n // spoiler: () => document.execCommand('fontName', false, SPOILER_FONT)\n };\n\n const c = (type: MarkdownType) => {\n commandsMap[type] = () => {\n const k = (canCombine.includes(type) ? canCombine : [type]).filter((type) => hasMarkup[type]);\n if(!indexOfAndSplice(k, type)) {\n k.push(type);\n }\n\n if(!k.length) {\n return this.resetCurrentFontFormatting();\n } else {\n return document.execCommand('fontName', false, 'markup-' + k.join('-'));\n }\n };\n };\n\n const canCombine = ['bold', 'italic', 'underline', 'strikethrough', 'spoiler'] as (typeof type)[];\n canCombine.forEach((type) => {\n c(type);\n });\n\n c('monospace');\n\n if(!commandsMap[type]) {\n return false;\n }\n\n const command = commandsMap[type];\n\n // type = 'monospace';\n\n // const saveExecuted = this.prepareDocumentExecute();\n const executed: any[] = [];\n /**\n * * clear previous formatting, due to Telegram's inability to handle several entities\n */\n /* const checkForSingle = () => {\n const nodes = getSelectedNodes();\n //console.log('Using formatting:', commandsMap[type], nodes, this.executedHistory);\n\n const parents = [...new Set(nodes.map((node) => node.parentNode))];\n //const differentParents = !!nodes.find((node) => node.parentNode !== firstParent);\n const differentParents = parents.length > 1;\n\n let notSingle = false;\n if(differentParents) {\n notSingle = true;\n } else {\n const node = nodes[0];\n if(node && (node.parentNode as HTMLElement) !== this.messageInput && (node.parentNode.parentNode as HTMLElement) !== this.messageInput) {\n notSingle = true;\n }\n }\n\n if(notSingle) {\n //if(type === 'monospace') {\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\n //}\n\n executed.push(document.execCommand('unlink', false, null));\n executed.push(document.execCommand('removeFormat', false, null));\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\n\n //if(type === 'monospace') {\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\n //}\n }\n }; */\n\n // fix applying markdown when range starts from contenteditable=\"false\"\n let textNode: Text;\n // do {\n // // const {node, offset, selection} = getCaretPosNew(this.messageInput, true);\n // const selection = document.getSelection();\n // const range = selection.getRangeAt(0);\n // const {node, offset} = getCaretPosF(this.messageInput, range.startContainer, range.startOffset);\n // // const node = range.startContainer as ChildNode;\n // if(node?.textContent === BOM || (node as HTMLElement)?.isContentEditable === false) {\n // // selection.modify('extend', 'backward', 'character');\n // textNode = document.createTextNode(BOM);\n // (node.nodeType === node.ELEMENT_NODE ? node : node.parentElement).before(textNode);\n // range.setStart(textNode, 0);\n // }/* else {\n // break;\n // } */\n\n // break;\n // } while(true);\n\n const richInputHandler = RichInputHandler.getInstance();\n const restore = richInputHandler.prepareApplyingMarkdown();\n\n const listener = this.listenerSetter.add(this.messageInput)('input', cancelEvent, {capture: true, passive: false}) as any as Listener;\n\n executed.push(document.execCommand('styleWithCSS', false, 'true'));\n\n const hasMarkup = hasMarkupInSelection(Object.keys(commandsMap) as (typeof type)[]);\n\n // * monospace can't be combined with different types\n /* if(type === 'monospace' || type === 'spoiler') {\n // executed.push(document.execCommand('styleWithCSS', false, 'true'));\n\n const haveThisType = hasMarkup[type];\n // executed.push(document.execCommand('removeFormat', false, null));\n\n if(haveThisType) {\n executed.push(this.resetCurrentFontFormatting());\n } else {\n // if(type === 'monospace' || hasMarkup['monospace']) {\n // executed.push(this.resetCurrentFormatting());\n // }\n\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\n }\n } else */{\n if(hasMarkup['monospace'] && type === 'link') {\n executed.push(this.resetCurrentFormatting());\n }\n\n executed.push(typeof(command) === 'function' ? command() : document.execCommand(command, false, null));\n }\n\n executed.push(document.execCommand('styleWithCSS', false, 'false'));\n\n restore();\n\n // checkForSingle();\n // saveExecuted();\n if(this.appImManager.markupTooltip) {\n this.appImManager.markupTooltip.setActiveMarkupButton();\n }\n\n if(textNode) {\n (textNode.parentElement === this.messageInput ? textNode : textNode.parentElement).remove();\n textNode.nodeValue = '';\n }\n\n this.listenerSetter.remove(listener);\n this.messageInputField.simulateInputEvent();\n\n return true;\n }\n\n private resetCurrentFormatting() {\n return document.execCommand('removeFormat', false, null);\n }\n\n private resetCurrentFontFormatting() {\n return document.execCommand('fontName', false, 'Roboto');\n }\n\n private handleMarkdownShortcut = (e: KeyboardEvent) => {\n // console.log('handleMarkdownShortcut', e);\n const formatKeys: {[key: string]: MarkdownType} = {\n 'KeyB': 'bold',\n 'KeyI': 'italic',\n 'KeyU': 'underline',\n 'KeyS': 'strikethrough',\n 'KeyM': 'monospace',\n 'KeyP': 'spoiler'\n };\n\n if(this.appImManager.markupTooltip) {\n formatKeys['KeyK'] = 'link';\n }\n\n const code = e.code;\n const applyMarkdown = formatKeys[code];\n\n const selection = document.getSelection();\n if(!isSelectionEmpty(selection) && applyMarkdown) {\n // * костыльчик\n if(code === 'KeyK') {\n this.appImManager.markupTooltip.showLinkEditor();\n } else {\n this.applyMarkdown(applyMarkdown);\n }\n\n cancelEvent(e); // cancel legacy event\n }\n\n // return;\n if(code === 'KeyZ') {\n let html = this.messageInput.innerHTML;\n\n if(e.shiftKey) {\n if(this.undoHistory.length) {\n this.executedHistory.push(html);\n html = this.undoHistory.pop();\n this.undoRedo(e, 'redo', html);\n html = this.messageInput.innerHTML;\n this.canRedoFromHTML = this.undoHistory.length ? html : '';\n this.canUndoFromHTML = html;\n }\n } else {\n // * подождём, когда пользователь сам восстановит поле до нужного состояния, которое стало сразу после saveExecuted\n if(this.executedHistory.length && (!this.canUndoFromHTML || html === this.canUndoFromHTML)) {\n this.undoHistory.push(html);\n html = this.executedHistory.pop();\n this.undoRedo(e, 'undo', html);\n\n // * поставим новое состояние чтобы снова подождать, если пользователь изменит что-то, и потом попробует откатить до предыдущего состояния\n this.canUndoFromHTML = this.canRedoFromHTML = this.messageInput.innerHTML;\n }\n }\n }\n };\n\n private onMessageInput = (e?: Event) => {\n // * validate due to manual formatting through browser's context menu\n /* const inputType = (e as InputEvent).inputType;\n console.log('message input event', e);\n if(inputType === 'formatBold') {\n console.log('message input format', this.messageInput.innerHTML);\n cancelEvent(e);\n }\n\n if(!isSelectionSingle()) {\n alert('not single');\n } */\n\n // console.log('messageInput input', this.messageInput.innerText);\n // const value = this.messageInput.innerText;\n const {value: richValue, entities: markdownEntities, caretPos} = getRichValueWithCaret(this.messageInputField.input);\n\n // const entities = parseEntities(value);\n const value = parseMarkdown(richValue, markdownEntities, true);\n const entities = mergeEntities(markdownEntities, parseEntities(value));\n\n // this.chat.log('messageInput entities', richValue, value, markdownEntities, caretPos);\n\n if(this.canRedoFromHTML && !this.lockRedo && this.messageInput.innerHTML !== this.canRedoFromHTML) {\n this.canRedoFromHTML = '';\n this.undoHistory.length = 0;\n }\n\n const urlEntities: Array = (!this.editMessage?.media || this.editMessage.media._ === 'messageMediaWebPage') && entities.filter((e) => e._ === 'messageEntityUrl' || e._ === 'messageEntityTextUrl') as any;\n if(urlEntities.length) {\n for(const entity of urlEntities) {\n let url: string;\n if(entity._ === 'messageEntityTextUrl') {\n url = entity.url;\n } else {\n url = richValue.slice(entity.offset, entity.offset + entity.length);\n\n if(!(url.includes('http://') || url.includes('https://'))) {\n continue;\n }\n }\n\n // console.log('messageInput url:', url);\n\n if(this.lastUrl !== url) {\n this.lastUrl = url;\n // this.willSendWebPage = null;\n const promise = this.getWebPagePromise = this.managers.appWebPagesManager.getWebPage(url).then((webpage) => {\n if(this.getWebPagePromise === promise) this.getWebPagePromise = undefined;\n if(this.lastUrl !== url) return;\n if(webpage._ === 'webPage') {\n // console.log('got webpage: ', webpage);\n\n this.setTopInfo('webpage', () => {}, webpage.site_name || webpage.title || 'Webpage', webpage.description || webpage.url || '');\n delete this.noWebPage;\n this.willSendWebPage = webpage;\n } else if(this.willSendWebPage) {\n this.onHelperCancel();\n }\n });\n }\n\n break;\n }\n } else if(this.lastUrl) {\n this.lastUrl = '';\n delete this.noWebPage;\n this.willSendWebPage = null;\n\n if(this.helperType) {\n this.helperFunc();\n } else {\n this.clearHelper();\n }\n }\n\n const isEmpty = !richValue.trim();\n if(isEmpty) {\n if(this.lastTimeType) {\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageCancelAction'}, undefined, this.chat.threadId);\n }\n\n if(this.appImManager.markupTooltip) {\n this.appImManager.markupTooltip.hide();\n }\n\n // * Chrome has a bug - it will preserve the formatting if the input with monospace text is cleared\n // * so have to reset formatting\n if(document.activeElement === this.messageInput) {\n // document.execCommand('styleWithCSS', false, 'true');\n setTimeout(() => {\n if(document.activeElement === this.messageInput) {\n this.resetCurrentFontFormatting();\n }\n }, 0);\n // document.execCommand('styleWithCSS', false, 'false');\n }\n } else {\n const time = Date.now();\n if((time - this.lastTimeType) >= 6000) {\n this.lastTimeType = time;\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: 'sendMessageTypingAction'}, undefined, this.chat.threadId);\n }\n\n if(this.botCommands) {\n this.botCommands.toggle(true);\n }\n }\n\n if(this.botCommands) {\n this.updateBotCommandsToggle();\n }\n\n if(!this.editMsgId) {\n this.saveDraftDebounced();\n }\n\n this.checkAutocomplete(richValue, caretPos, entities);\n\n this.updateSendBtn();\n };\n\n public insertAtCaret(insertText: string, insertEntity?: MessageEntity, isHelper = true) {\n RichInputHandler.getInstance().makeFocused(this.messageInput);\n\n const {value: fullValue, caretPos, entities} = getRichValueWithCaret(this.messageInput);\n const pos = caretPos >= 0 ? caretPos : fullValue.length;\n const prefix = fullValue.substr(0, pos);\n const suffix = fullValue.substr(pos);\n\n const matches = isHelper ? prefix.match(ChatInput.AUTO_COMPLETE_REG_EXP) : null;\n\n const matchIndex = matches ? matches.index + (matches[0].length - matches[2].length) : prefix.length;\n const newPrefix = prefix.slice(0, matchIndex);\n const newValue = newPrefix + insertText + suffix;\n\n if(isHelper && caretPos !== -1) {\n const match = matches[2];\n // const {node, selection} = getCaretPosNew(this.messageInput);\n\n const selection = document.getSelection();\n // const range = document.createRange();\n let counter = 0;\n while(selection.toString() !== match) {\n if(++counter >= 10000) {\n throw new Error('lolwhat');\n }\n\n // for(let i = 0; i < match.length; ++i) {\n selection.modify('extend', 'backward', 'character');\n }\n }\n\n {\n // const fragment = wrapDraftText(insertText, {entities: insertEntity ? [insertEntity] : undefined, wrappingForPeerId: this.chat.peerId});\n insertRichTextAsHTML(this.messageInput, insertText, insertEntity ? [insertEntity] : undefined, this.chat.peerId);\n // const {node, offset} = getCaretPos(this.messageInput);\n // const fragmentLastChild = fragment.lastChild;\n // if(node?.nodeType === node.TEXT_NODE) {\n // const prefix = node.nodeValue.slice(0, offset);\n // const suffix = node.nodeValue.slice(offset);\n\n // const suffixNode = document.createTextNode(suffix);\n\n // node.nodeValue = prefix;\n // node.parentNode.insertBefore(suffixNode, node.nextSibling);\n // node.parentNode.insertBefore(fragment, suffixNode);\n\n // setCaretAt(fragmentLastChild.nextSibling);\n\n // this.messageInputField.simulateInputEvent();\n // }\n }\n return;\n\n // merge emojis\n const hadEntities = parseEntities(fullValue);\n mergeEntities(entities, hadEntities);\n\n // max for additional whitespace\n const insertLength = insertEntity ? Math.max(insertEntity.length, insertText.length) : insertText.length;\n const addEntities: MessageEntity[] = [];\n if(insertEntity) {\n addEntities.push(insertEntity);\n insertEntity.offset = matchIndex;\n }\n\n // add offset to entities next to emoji\n const diff = matches ? insertLength - matches[2].length : insertLength;\n entities.forEach((entity) => {\n if(entity.offset >= matchIndex) {\n entity.offset += diff;\n }\n });\n\n mergeEntities(entities, addEntities);\n\n if(/* caretPos !== -1 && caretPos !== fullValue.length */true) {\n const caretEntity: MessageEntity.messageEntityCaret = {\n _: 'messageEntityCaret',\n offset: matchIndex + insertLength,\n length: 0\n };\n\n let insertCaretAtIndex = 0;\n for(let length = entities.length; insertCaretAtIndex < length; ++insertCaretAtIndex) {\n const entity = entities[insertCaretAtIndex];\n if(entity.offset > caretEntity.offset) {\n break;\n }\n }\n\n entities.splice(insertCaretAtIndex, 0, caretEntity);\n }\n\n // const saveExecuted = this.prepareDocumentExecute();\n // can't exec .value here because it will instantly check for autocomplete\n const value = documentFragmentToHTML(wrapDraftText(newValue, {entities}));\n this.messageInputField.setValueSilently(value);\n\n const caret = this.messageInput.querySelector('.composer-sel');\n if(caret) {\n setCaretAt(caret);\n caret.remove();\n }\n\n // but it's needed to be checked only here\n this.onMessageInput();\n\n // saveExecuted();\n\n // document.execCommand('insertHTML', true, wrapEmojiText(emoji));\n }\n\n public onEmojiSelected = (emoji: ReturnType, autocomplete: boolean) => {\n const entity: MessageEntity = emoji.docId ? {_: 'messageEntityCustomEmoji', document_id: emoji.docId, length: emoji.emoji.length, offset: 0} : getEmojiEntityFromEmoji(emoji.emoji);\n this.insertAtCaret(emoji.emoji, entity, autocomplete);\n };\n\n private async checkAutocomplete(value?: string, caretPos?: number, entities?: MessageEntity[]) {\n // return;\n\n if(value === undefined) {\n const r = getRichValueWithCaret(this.messageInputField.input, true, true);\n value = r.value;\n caretPos = r.caretPos;\n entities = r.entities;\n }\n\n if(caretPos === -1) {\n caretPos = value.length;\n }\n\n if(entities === undefined) {\n const _value = parseMarkdown(value, entities, true);\n entities = mergeEntities(entities, parseEntities(_value));\n }\n\n value = value.slice(0, caretPos);\n\n if(this.previousQuery === value) {\n return;\n }\n\n this.previousQuery = value;\n\n const matches = value.match(ChatInput.AUTO_COMPLETE_REG_EXP);\n let foundHelper: AutocompleteHelper;\n if(matches) {\n const entity = entities[0];\n\n let query = matches[2];\n const firstChar = query[0];\n\n if(this.stickersHelper &&\n rootScope.settings.stickers.suggest &&\n await this.chat.canSend('send_stickers') &&\n entity?._ === 'messageEntityEmoji' && entity.length === value.length && !entity.offset) {\n foundHelper = this.stickersHelper;\n this.stickersHelper.checkEmoticon(value);\n } else if(firstChar === '@') { // mentions\n const topMsgId = this.chat.threadId ? getServerMessageId(this.chat.threadId) : undefined;\n if(await this.mentionsHelper.checkQuery(query, this.chat.peerId.isUser() ? NULL_PEER_ID : this.chat.peerId, topMsgId)) {\n foundHelper = this.mentionsHelper;\n }\n } else if(!matches[1] && firstChar === '/') { // commands\n if(await this.commandsHelper.checkQuery(query, this.chat.peerId)) {\n foundHelper = this.commandsHelper;\n }\n } else if(rootScope.settings.emoji.suggest) { // emoji\n query = query.replace(/^\\s*/, '');\n if(!value.match(/^\\s*:(.+):\\s*$/) && !value.match(/:[;!@#$%^&*()-=|]/) && query) {\n foundHelper = this.emojiHelper;\n this.emojiHelper.checkQuery(query, firstChar);\n }\n }\n }\n\n foundHelper = this.checkInlineAutocomplete(value, foundHelper);\n\n this.autocompleteHelperController.hideOtherHelpers(foundHelper);\n }\n\n private checkInlineAutocomplete(value: string, foundHelper?: AutocompleteHelper): AutocompleteHelper {\n let needPlaceholder = false;\n\n const setPreloaderShow = (show: boolean) => {\n if(!this.btnPreloader) {\n return;\n }\n\n SetTransition({\n element: this.btnPreloader,\n className: 'show',\n forwards: show,\n duration: 400\n });\n };\n\n if(!foundHelper) {\n const inlineMatch = value.match(/^@([a-zA-Z\\\\d_]{3,32})\\s/);\n if(inlineMatch) {\n const username = inlineMatch[1];\n const query = value.slice(inlineMatch[0].length);\n needPlaceholder = inlineMatch[0].length === value.length;\n\n foundHelper = this.inlineHelper;\n\n if(!this.btnPreloader) {\n this.btnPreloader = ButtonIcon('none btn-preloader float show disable-hover', {noRipple: true});\n putPreloader(this.btnPreloader, true);\n this.inputMessageContainer.parentElement.insertBefore(this.btnPreloader, this.inputMessageContainer.nextSibling);\n } else {\n setPreloaderShow(true);\n }\n\n this.inlineHelper.checkQuery(this.chat.peerId, username, query).then(({user, renderPromise}) => {\n if(needPlaceholder && user.bot_inline_placeholder) {\n this.messageInput.dataset.inlinePlaceholder = user.bot_inline_placeholder;\n }\n\n renderPromise.then(() => {\n setPreloaderShow(false);\n });\n }).catch((err: ApiError) => {\n setPreloaderShow(false);\n });\n }\n }\n\n if(!needPlaceholder) {\n delete this.messageInput.dataset.inlinePlaceholder;\n }\n\n if(foundHelper !== this.inlineHelper) {\n setPreloaderShow(false);\n }\n\n return foundHelper;\n }\n\n private setRecording(value: boolean) {\n if(this.recording === value) {\n return;\n }\n\n SetTransition({\n element: this.chatInput,\n className: 'is-recording',\n forwards: value,\n duration: 200\n });\n this.recording = value;\n this.updateSendBtn();\n }\n\n private onBtnSendClick = async(e: Event) => {\n cancelEvent(e);\n\n if(!this.recorder || this.recording || !this.isInputEmpty() || this.forwarding || this.editMsgId) {\n if(this.recording) {\n if((Date.now() - this.recordStartTime) < RECORD_MIN_TIME) {\n this.onCancelRecordClick();\n } else {\n this.recorder.stop();\n }\n } else {\n this.sendMessage();\n }\n } else {\n const isAnyChat = this.chat.peerId.isAnyChat();\n if(isAnyChat && !(await this.chat.canSend('send_media'))) {\n toast(POSTING_MEDIA_NOT_ALLOWED);\n return;\n }\n\n this.chatInput.classList.add('is-locked');\n blurActiveElement();\n\n let restricted = false;\n if(!isAnyChat) {\n const userFull = await this.managers.appProfileManager.getProfile(this.chat.peerId.toUserId());\n if(userFull?.pFlags.voice_messages_forbidden) {\n toastNew({\n langPackKey: 'Chat.SendVoice.PrivacyError',\n langPackArguments: [await wrapPeerTitle({peerId: this.chat.peerId})]\n });\n restricted = true;\n }\n }\n\n if(restricted) {\n this.chatInput.classList.remove('is-locked');\n return;\n }\n\n this.recorder.start().then(() => {\n this.releaseMediaPlayback = appMediaPlaybackController.setSingleMedia();\n this.recordCanceled = false;\n\n this.setRecording(true);\n opusDecodeController.setKeepAlive(true);\n\n const showDiscardPopup = () => {\n new PopupPeer('popup-cancel-record', {\n titleLangKey: 'DiscardVoiceMessageTitle',\n descriptionLangKey: 'DiscardVoiceMessageDescription',\n buttons: [{\n langKey: 'DiscardVoiceMessageAction',\n callback: () => {\n simulateClickEvent(this.btnCancelRecord);\n }\n }, {\n langKey: 'Continue',\n isCancel: true\n }]\n }).show();\n };\n\n this.recordingOverlayListener = this.listenerSetter.add(document.body)('mousedown', (e) => {\n if(!findUpClassName(e.target, 'chat-input') && !findUpClassName(e.target, 'popup-cancel-record')) {\n cancelEvent(e);\n showDiscardPopup();\n }\n }, {capture: true, passive: false}) as any;\n\n appNavigationController.pushItem(this.recordingNavigationItem = {\n type: 'voice',\n onPop: () => {\n setTimeout(() => {\n showDiscardPopup();\n }, 0);\n\n return false;\n }\n });\n\n this.recordStartTime = Date.now();\n\n const sourceNode: MediaStreamAudioSourceNode = this.recorder.sourceNode;\n const context = sourceNode.context;\n\n const analyser = context.createAnalyser();\n sourceNode.connect(analyser);\n // analyser.connect(context.destination);\n analyser.fftSize = 32;\n\n const frequencyData = new Uint8Array(analyser.frequencyBinCount);\n const max = frequencyData.length * 255;\n const min = 54 / 150;\n const r = () => {\n if(!this.recording) return;\n\n analyser.getByteFrequencyData(frequencyData);\n\n let sum = 0;\n frequencyData.forEach((value) => {\n sum += value;\n });\n\n const percents = Math.min(1, (sum / max) + min);\n // console.log('frequencyData', frequencyData, percents);\n\n this.recordRippleEl.style.transform = `scale(${percents})`;\n\n const diff = Date.now() - this.recordStartTime;\n const ms = diff % 1000;\n\n const formatted = toHHMMSS(diff / 1000) + ',' + ('00' + Math.round(ms / 10)).slice(-2);\n\n this.recordTimeEl.innerText = formatted;\n\n fastRaf(r);\n };\n\n r();\n }).catch((e: Error) => {\n switch(e.name as string) {\n case 'NotAllowedError': {\n toast('Please allow access to your microphone');\n break;\n }\n\n case 'NotReadableError': {\n toast(e.message);\n break;\n }\n\n default:\n console.error('Recorder start error:', e, e.name, e.message);\n toast(e.message);\n break;\n }\n\n this.setRecording(false);\n this.chatInput.classList.remove('is-locked');\n });\n }\n };\n\n private onHelperCancel = async(e?: Event, force?: boolean) => {\n if(e) {\n cancelEvent(e);\n }\n\n if(this.willSendWebPage) {\n const lastUrl = this.lastUrl;\n let needReturn = false;\n if(this.helperType) {\n // if(this.helperFunc) {\n await this.helperFunc();\n // }\n\n needReturn = true;\n }\n\n // * restore values\n this.lastUrl = lastUrl;\n this.noWebPage = true;\n this.willSendWebPage = null;\n\n if(needReturn) return;\n }\n\n if(this.helperType === 'edit' && !force) {\n const message = this.editMessage;\n const draft = this.getCurrentInputAsDraft();\n if(draft) {\n delete draft.pFlags.no_webpage;\n }\n // const value = parseMarkdown(this.messageInputField.value, []);\n // if(message.message !== value) {\n if(!draftsAreEqual(draft, {...message, _: 'draftMessage'} as any)) {\n new PopupPeer('discard-editing', {\n buttons: [{\n langKey: 'Alert.Confirm.Discard',\n callback: () => {\n this.onHelperCancel(undefined, true);\n }\n }],\n descriptionLangKey: 'Chat.Edit.Cancel.Text'\n }).show();\n\n return;\n }\n }\n\n this.clearHelper();\n this.updateSendBtn();\n };\n\n private onHelperClick = (e: Event) => {\n cancelEvent(e);\n\n if(!findUpClassName(e.target, 'reply')) return;\n if(this.helperType === 'forward') {\n const {forwardElements} = this;\n if(forwardElements && IS_TOUCH_SUPPORTED && !forwardElements.container.classList.contains('active')) {\n contextMenuController.openBtnMenu(forwardElements.container);\n }\n } else if(this.helperType === 'reply') {\n this.chat.setMessageId(this.replyToMsgId);\n } else if(this.helperType === 'edit') {\n this.chat.setMessageId(this.editMsgId);\n }\n };\n\n private changeForwardRecipient() {\n if(this.helperWaitingForward) return;\n this.helperWaitingForward = true;\n\n const forwarding = copy(this.forwarding);\n const helperFunc = this.helperFunc;\n this.clearHelper();\n this.updateSendBtn();\n let selected = false;\n const popup = new PopupForward(forwarding, () => {\n selected = true;\n });\n\n popup.addEventListener('close', () => {\n this.helperWaitingForward = false;\n\n if(!selected) {\n helperFunc();\n }\n });\n }\n\n public async clearInput(canSetDraft = true, fireEvent = true, clearValue = '') {\n if(document.activeElement === this.messageInput && IS_MOBILE_SAFARI) { // fix first char uppercase\n const i = document.createElement('input');\n document.body.append(i);\n fixSafariStickyInput(i);\n this.messageInputField.setValueSilently(clearValue);\n fixSafariStickyInput(this.messageInput);\n i.remove();\n } else {\n this.messageInputField.setValueSilently(clearValue);\n }\n\n if(IS_TOUCH_SUPPORTED) {\n // this.messageInput.innerText = '';\n } else {\n // this.attachMessageInputField();\n // this.messageInput.innerText = '';\n\n // clear executions\n this.canRedoFromHTML = '';\n this.undoHistory.length = 0;\n this.executedHistory.length = 0;\n this.canUndoFromHTML = '';\n }\n\n let set = false;\n if(canSetDraft) {\n set = await this.setDraft(undefined, false);\n }\n\n if(!set && fireEvent) {\n this.onMessageInput();\n }\n }\n\n public isInputEmpty() {\n return isInputEmpty(this.messageInput);\n }\n\n public updateSendBtn() {\n let icon: 'send' | 'record' | 'edit' | 'schedule';\n\n const isInputEmpty = this.isInputEmpty();\n\n if(this.editMsgId) icon = 'edit';\n else if(!this.recorder || this.recording || !isInputEmpty || this.forwarding) icon = this.chat.type === 'scheduled' ? 'schedule' : 'send';\n else icon = 'record';\n\n ['send', 'record', 'edit', 'schedule'].forEach((i) => {\n this.btnSend.classList.toggle(i, icon === i);\n });\n\n if(this.btnScheduled) {\n this.btnScheduled.classList.toggle('show', isInputEmpty && this.chat.type !== 'scheduled');\n }\n\n if(this.btnToggleReplyMarkup) {\n this.btnToggleReplyMarkup.classList.toggle('show', isInputEmpty && this.chat.type !== 'scheduled');\n }\n }\n\n private getValueAndEntities(input: HTMLElement) {\n const {entities: apiEntities, value} = getRichValueWithCaret(this.messageInput, true, false);\n const myEntities = parseEntities(value);\n const totalEntities = mergeEntities(apiEntities, myEntities);\n\n return {value, totalEntities};\n }\n\n public onMessageSent(clearInput = true, clearReply?: boolean) {\n if(this.chat.type !== 'scheduled') {\n this.managers.appMessagesManager.readAllHistory(this.chat.peerId, this.chat.threadId, true);\n }\n\n this.scheduleDate = undefined;\n this.sendSilent = undefined;\n\n const {totalEntities} = this.getValueAndEntities(this.messageInput);\n let nextOffset = 0;\n const emojiEntities: (MessageEntity.messageEntityEmoji | MessageEntity.messageEntityCustomEmoji)[] = totalEntities.filter((entity) => {\n if(entity._ === 'messageEntityEmoji' || entity._ === 'messageEntityCustomEmoji') {\n const endOffset = entity.offset + entity.length;\n return endOffset <= nextOffset ? false : (nextOffset = endOffset, true);\n }\n\n return false;\n }) as any;\n emojiEntities.forEach((entity) => {\n const emoji: AppEmoji = entity._ === 'messageEntityEmoji' ? {emoji: emojiFromCodePoints(entity.unicode)} : {docId: entity.document_id, emoji: ''};\n this.managers.appEmojiManager.pushRecentEmoji(emoji);\n });\n\n if(clearInput) {\n this.lastUrl = '';\n delete this.noWebPage;\n this.willSendWebPage = null;\n this.clearInput();\n }\n\n if(clearReply || clearInput) {\n this.clearHelper();\n }\n\n this.updateSendBtn();\n }\n\n public sendMessage(force = false) {\n const {editMsgId, chat} = this;\n if(chat.type === 'scheduled' && !force && !editMsgId) {\n this.scheduleSending();\n return;\n }\n\n const {peerId} = chat;\n const {noWebPage} = this;\n const sendingParams = this.chat.getMessageSendingParams();\n\n const {value, entities} = getRichValueWithCaret(this.messageInputField.input, true, false);\n\n // return;\n if(editMsgId) {\n const message = this.editMessage;\n if(value.trim() || message.media) {\n this.managers.appMessagesManager.editMessage(message, value, {\n entities,\n noWebPage: noWebPage\n });\n\n this.onMessageSent();\n } else {\n new PopupDeleteMessages(peerId, [editMsgId], chat.type);\n\n return;\n }\n } else if(value.trim()) {\n this.managers.appMessagesManager.sendText(peerId, value, {\n entities,\n ...sendingParams,\n noWebPage: noWebPage,\n webPage: this.getWebPagePromise ? undefined : this.willSendWebPage,\n clearDraft: true\n });\n\n if(this.chat.type === 'scheduled') {\n this.onMessageSent(true);\n } else {\n this.onMessageSent(false, false);\n }\n // this.onMessageSent();\n }\n\n // * wait for sendText set messageId for invokeAfterMsg\n if(this.forwarding) {\n const forwarding = copy(this.forwarding);\n // setTimeout(() => {\n for(const fromPeerId in forwarding) {\n this.managers.appMessagesManager.forwardMessages(peerId, fromPeerId.toPeerId(), forwarding[fromPeerId], {\n ...sendingParams,\n dropAuthor: this.forwardElements && this.forwardElements.hideSender.checkboxField.checked,\n dropCaptions: this.isDroppingCaptions()\n }).catch(async(err: ApiError) => {\n if(err.type === 'VOICE_MESSAGES_FORBIDDEN') {\n toastNew({\n langPackKey: 'Chat.SendVoice.PrivacyError',\n langPackArguments: [await wrapPeerTitle({peerId})]\n });\n }\n });\n }\n\n if(!value) {\n this.onMessageSent();\n }\n // }, 0);\n }\n\n // this.onMessageSent();\n }\n\n public async sendMessageWithDocument(\n document: MyDocument | DocId,\n force = false,\n clearDraft = false,\n silent = false\n ) {\n document = await this.managers.appDocsManager.getDoc(document);\n\n const flag = document.type === 'sticker' ? 'send_stickers' : (document.type === 'gif' ? 'send_gifs' : 'send_media');\n if(this.chat.peerId.isAnyChat() && !(await this.chat.canSend(flag))) {\n toast(POSTING_MEDIA_NOT_ALLOWED);\n return false;\n }\n\n if(this.chat.type === 'scheduled' && !force) {\n this.scheduleSending(() => this.sendMessageWithDocument(document, true, clearDraft, silent));\n return false;\n }\n\n if(!document) {\n return false;\n }\n\n if(document.sticker && getStickerEffectThumb(document) && !rootScope.premium) {\n return false;\n }\n\n this.managers.appMessagesManager.sendFile(this.chat.peerId, {\n ...this.chat.getMessageSendingParams(),\n file: document,\n isMedia: true,\n clearDraft,\n silent\n });\n this.onMessageSent(clearDraft, true);\n\n if(document.type === 'sticker') {\n this.managers.appStickersManager.saveRecentSticker(document.id);\n }\n\n return true;\n }\n\n private canToggleHideAuthor() {\n const {forwardElements} = this;\n if(!forwardElements) return false;\n const hideCaptionCheckboxField = forwardElements.hideCaption.checkboxField;\n return !hideCaptionCheckboxField.checked ||\n findUpTag(hideCaptionCheckboxField.label, 'FORM').classList.contains('hide');\n }\n\n private isDroppingCaptions() {\n return !this.canToggleHideAuthor();\n }\n\n /* public sendSomething(callback: () => void, force = false) {\n if(this.chat.type === 'scheduled' && !force) {\n this.scheduleSending(() => this.sendSomething(callback, true));\n return false;\n }\n\n callback();\n this.onMessageSent(false, true);\n\n return true;\n } */\n\n public async initMessageEditing(mid: number) {\n const message = (await this.chat.getMessage(mid)) as Message.message;\n\n let input = wrapDraftText(message.message, {entities: message.totalEntities, wrappingForPeerId: this.chat.peerId});\n const f = async() => {\n const replyFragment = await wrapMessageForReply({message, usingMids: [message.mid]});\n this.setTopInfo('edit', f, i18n('AccDescrEditing'), replyFragment, input, message);\n\n this.editMsgId = mid;\n this.editMessage = message;\n input = undefined;\n };\n f();\n }\n\n public initMessagesForward(fromPeerIdsMids: {[fromPeerId: PeerId]: number[]}) {\n const f = async() => {\n // const peerTitles: string[]\n const fromPeerIds = Object.keys(fromPeerIdsMids).map((fromPeerId) => fromPeerId.toPeerId());\n const smth: Set = new Set();\n let length = 0, messagesWithCaptionsLength = 0;\n\n const p = fromPeerIds.map(async(fromPeerId) => {\n const mids = fromPeerIdsMids[fromPeerId];\n const promises = mids.map(async(mid) => {\n const message = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mid)) as Message.message;\n if(message.fwd_from?.from_name && !message.fromId && !message.fwdFromId) {\n smth.add('N' + message.fwd_from.from_name);\n } else {\n smth.add('P' + message.fromId);\n }\n\n if(message.media && message.message) {\n ++messagesWithCaptionsLength;\n }\n });\n\n await Promise.all(promises);\n\n length += mids.length;\n });\n\n await Promise.all(p);\n\n const onlyFirstName = smth.size > 2;\n const peerTitles = [...smth].map((smth) => {\n const type = smth[0];\n smth = smth.slice(1);\n if(type === 'P') {\n const peerId = smth.toPeerId();\n return peerId === rootScope.myId ? i18n('Chat.Accessory.Forward.You') : new PeerTitle({peerId, dialog: false, onlyFirstName}).element;\n } else {\n return onlyFirstName ? smth.split(' ')[0] : smth;\n }\n });\n\n const {forwardElements} = this;\n const form = findUpTag(forwardElements.showCaption.checkboxField.label, 'FORM');\n form.classList.toggle('hide', !messagesWithCaptionsLength);\n const hideCaption = forwardElements.hideCaption.checkboxField.checked;\n if(messagesWithCaptionsLength && hideCaption) {\n forwardElements.hideSender.checkboxField.setValueSilently(true);\n } else if(this.forwardWasDroppingAuthor !== undefined) {\n (this.forwardWasDroppingAuthor ? forwardElements.hideSender : forwardElements.showSender).checkboxField.setValueSilently(true);\n }\n\n const titleKey: LangPackKey = forwardElements.showSender.checkboxField.checked ? 'Chat.Accessory.Forward' : 'Chat.Accessory.Hidden';\n const title = i18n(titleKey, [length]);\n\n const senderTitles = document.createDocumentFragment();\n if(peerTitles.length < 3) {\n senderTitles.append(...join(peerTitles, false));\n } else {\n senderTitles.append(peerTitles[0], i18n('AndOther', [peerTitles.length - 1]));\n }\n\n let firstMessage: Message.message, usingFullAlbum: boolean;\n if(fromPeerIds.length === 1) {\n const fromPeerId = fromPeerIds[0];\n const mids = fromPeerIdsMids[fromPeerId];\n firstMessage = (await this.managers.appMessagesManager.getMessageByPeer(fromPeerId, mids[0])) as Message.message;\n\n usingFullAlbum = !!firstMessage.grouped_id;\n if(usingFullAlbum) {\n const albumMids = await this.managers.appMessagesManager.getMidsByMessage(firstMessage);\n if(albumMids.length !== length || albumMids.find((mid) => !mids.includes(mid))) {\n usingFullAlbum = false;\n }\n }\n }\n\n const subtitleFragment = document.createDocumentFragment();\n const delimiter = ': ';\n if(usingFullAlbum || length === 1) {\n const mids = fromPeerIdsMids[fromPeerIds[0]];\n const replyFragment = await wrapMessageForReply({message: firstMessage, usingMids: mids});\n subtitleFragment.append(\n senderTitles,\n delimiter,\n replyFragment\n );\n } else {\n subtitleFragment.append(\n i18n('Chat.Accessory.Forward.From'),\n delimiter,\n senderTitles\n );\n }\n\n const newReply = this.setTopInfo('forward', f, title, subtitleFragment);\n\n forwardElements.modifyArgs.forEach((b, idx) => {\n const text = b.textElement;\n const intl: I18n.IntlElement = I18n.weakMap.get(text) as any;\n intl.args = [idx < 2 ? fromPeerIds.length : messagesWithCaptionsLength];\n intl.update();\n });\n\n if(this.forwardHover) {\n this.forwardHover.attachButtonListener(newReply, this.listenerSetter);\n }\n\n this.forwarding = fromPeerIdsMids;\n };\n\n f();\n }\n\n public async initMessageReply(mid: number) {\n if(this.replyToMsgId === mid) {\n return;\n }\n\n let message = await this.chat.getMessage(mid);\n const f = () => {\n let peerTitleEl: HTMLElement;\n if(!message) { // load missing replying message\n peerTitleEl = i18n('Loading');\n\n this.managers.appMessagesManager.reloadMessages(this.chat.peerId, mid).then((_message) => {\n if(this.replyToMsgId !== mid) {\n return;\n }\n\n message = _message;\n if(!message) {\n this.clearHelper('reply');\n } else {\n f();\n }\n });\n } else {\n peerTitleEl = new PeerTitle({\n peerId: message.fromId,\n dialog: false\n }).element;\n }\n\n this.setTopInfo('reply', f, peerTitleEl, message && (message as Message.message).message, undefined, message);\n this.setReplyToMsgId(mid)\n };\n f();\n }\n\n public setReplyToMsgId(mid: number) {\n this.replyToMsgId = mid;\n this.center(true);\n }\n\n public clearHelper(type?: ChatInputHelperType) {\n if(this.helperType === 'edit' && type !== 'edit') {\n this.clearInput();\n }\n\n if(type) {\n this.lastUrl = '';\n delete this.noWebPage;\n this.willSendWebPage = null;\n }\n\n if(type !== 'reply') {\n this.setReplyToMsgId(undefined);\n this.forwarding = undefined;\n }\n\n this.editMsgId = this.editMessage = undefined;\n this.helperType = this.helperFunc = undefined;\n\n if(this.chat.container.classList.contains('is-helper-active')) {\n appNavigationController.removeByType('input-helper');\n this.chat.container.classList.remove('is-helper-active');\n this.t();\n }\n }\n\n private t() {\n const className = 'is-toggling-helper';\n SetTransition({\n element: this.chat.container,\n className,\n forwards: true,\n duration: 150,\n onTransitionEnd: () => {\n this.chat.container.classList.remove(className);\n }\n });\n }\n\n public setInputValue(value: Parameters[0], clear = true, focus = true) {\n if(!value) value = '';\n\n if(clear) this.clearInput(false, false, value as string);\n else this.messageInputField.setValueSilently(value);\n\n fastRaf(() => {\n focus && placeCaretAtEnd(this.messageInput);\n this.onMessageInput();\n this.messageInput.scrollTop = this.messageInput.scrollHeight;\n });\n }\n\n public setTopInfo(\n type: ChatInputHelperType,\n callerFunc: () => void,\n title: Parameters[0] = '',\n subtitle: Parameters[1] = '',\n input?: Parameters[0],\n message?: any\n ) {\n if(this.willSendWebPage && type === 'reply') {\n return;\n }\n\n if(type !== 'webpage') {\n this.clearHelper(type);\n this.helperType = type;\n this.helperFunc = callerFunc;\n }\n\n const replyParent = this.replyElements.container;\n const oldReply = replyParent.lastElementChild.previousElementSibling;\n const haveReply = oldReply.classList.contains('reply');\n\n this.replyElements.iconBtn.replaceWith(this.replyElements.iconBtn = ButtonIcon((type === 'webpage' ? 'link' : type) + ' active reply-icon', {noRipple: true}));\n const {container} = wrapReply(title, subtitle, this.chat.animationGroup, message);\n if(haveReply) {\n oldReply.replaceWith(container);\n } else {\n replyParent.insertBefore(container, replyParent.lastElementChild);\n }\n\n if(type === 'webpage') {\n container.style.cursor = 'default';\n }\n\n if(!this.chat.container.classList.contains('is-helper-active')) {\n this.chat.container.classList.add('is-helper-active');\n this.t();\n }\n\n /* const scroll = appImManager.scrollable;\n if(scroll.isScrolledDown && !scroll.scrollLocked && !appImManager.messagesQueuePromise && !appImManager.setPeerPromise) {\n scroll.scrollTo(scroll.scrollHeight, 'top', true, true, 200);\n } */\n\n if(!IS_MOBILE) {\n appNavigationController.pushItem({\n type: 'input-helper',\n onPop: () => {\n this.onHelperCancel();\n }\n });\n }\n\n if(input !== undefined) {\n this.setInputValue(input);\n }\n\n setTimeout(() => {\n this.updateSendBtn();\n }, 0);\n\n return container;\n }\n\n // public saveScroll() {\n // this.scrollTop = this.chat.bubbles.scrollable.container.scrollTop;\n // this.scrollOffsetTop = this.chatInput.offsetTop;\n // }\n\n // public restoreScroll() {\n // if(this.chatInput.style.display) return;\n // //console.log('input resize', offsetTop, this.chatInput.offsetTop);\n // let newOffsetTop = this.chatInput.offsetTop;\n // let container = this.chat.bubbles.scrollable.container;\n // let scrollTop = container.scrollTop;\n // let clientHeight = container.clientHeight;\n // let maxScrollTop = container.scrollHeight;\n\n // if(newOffsetTop < this.scrollOffsetTop) {\n // this.scrollDiff = this.scrollOffsetTop - newOffsetTop;\n // container.scrollTop += this.scrollDiff;\n // } else if(scrollTop !== this.scrollTop) {\n // let endDiff = maxScrollTop - (scrollTop + clientHeight);\n // if(endDiff < this.scrollDiff/* && false */) {\n // //container.scrollTop -= endDiff;\n // } else {\n // container.scrollTop -= this.scrollDiff;\n // }\n // }\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {DraftMessage} from '../../layer';\nimport mergeEntities from '../../lib/richTextProcessor/mergeEntities';\nimport parseEntities from '../../lib/richTextProcessor/parseEntities';\nimport wrapDraftText from '../../lib/richTextProcessor/wrapDraftText';\n\nexport default function wrapDraft(draft: DraftMessage.draftMessage, wrappingForPeerId: PeerId, loadPromises?: Promise[]) {\n const myEntities = parseEntities(draft.message);\n const apiEntities = draft.entities || [];\n const totalEntities = mergeEntities(apiEntities.slice(), myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n\n return wrapDraftText(draft.message, {entities: totalEntities, wrappingForPeerId, loadPromises});\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type Chat from './chat';\nimport type ChatTopbar from './topbar';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport DivAndCaption from '../divAndCaption';\nimport ripple from '../ripple';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport {Message} from '../../layer';\nimport safeAssign from '../../helpers/object/safeAssign';\n\nconst classNames: string[] = ['is-pinned-message-shown', 'is-pinned-audio-shown'];\nconst CLASSNAME_BASE = 'pinned-container';\nconst HEIGHT = 52;\n\nexport default class PinnedContainer {\n public wrapperUtils: HTMLElement;\n public btnClose: HTMLElement;\n protected wrapper: HTMLElement;\n\n protected topbar: ChatTopbar;\n protected chat: Chat;\n protected listenerSetter: ListenerSetter;\n public className: string;\n public divAndCaption: DivAndCaption<(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message?: any) => void>;\n\n protected floating = false;\n\n public onClose?: () => void | Promise;\n\n constructor(options: {\n topbar: PinnedContainer['topbar'],\n chat: PinnedContainer['chat'],\n listenerSetter: PinnedContainer['listenerSetter'],\n className: PinnedContainer['className'],\n divAndCaption: PinnedContainer['divAndCaption'],\n onClose?: PinnedContainer['onClose'],\n floating?: PinnedContainer['floating']\n }) {\n safeAssign(this, options);\n\n const {divAndCaption, className} = this;\n divAndCaption.container.classList.add(CLASSNAME_BASE, 'hide');\n divAndCaption.title.classList.add(CLASSNAME_BASE + '-title');\n divAndCaption.subtitle.classList.add(CLASSNAME_BASE + '-subtitle');\n divAndCaption.content.classList.add(CLASSNAME_BASE + '-content');\n\n this.btnClose = document.createElement('button');\n this.btnClose.classList.add(CLASSNAME_BASE + '-close', `pinned-${className}-close`, 'btn-icon', 'tgico-close');\n\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add(CLASSNAME_BASE + '-wrapper');\n ripple(this.wrapper);\n\n this.wrapperUtils = document.createElement('div');\n this.wrapperUtils.classList.add(CLASSNAME_BASE + '-wrapper-utils');\n this.wrapperUtils.append(this.btnClose);\n\n this.wrapper.append(...Array.from(divAndCaption.container.children), this.wrapperUtils);\n\n divAndCaption.container.append(this.wrapper/* , this.close */);\n\n this.attachOnCloseEvent(this.btnClose);\n }\n\n public attachOnCloseEvent(elem: HTMLElement) {\n attachClickEvent(elem, (e) => {\n cancelEvent(e);\n\n ((this.onClose ? this.onClose() : null) || Promise.resolve(true)).then((needClose) => {\n if(needClose) {\n this.toggle(true);\n }\n });\n }, {listenerSetter: this.listenerSetter});\n }\n\n public toggle(hide?: boolean) {\n const isHidden = this.divAndCaption.container.classList.contains('hide');\n if(hide === undefined) {\n hide = !isHidden;\n } else if(hide === isHidden) {\n return;\n }\n\n // const scrollable = this.chat.bubbles.scrollable;\n\n const isFloating = (this.floating || mediaSizes.isMobile) && !hide;\n // const scrollTop = isFloating || this.divAndCaption.container.classList.contains('is-floating') ? scrollable.scrollTop : undefined;\n\n this.divAndCaption.container.classList.toggle('is-floating', isFloating);\n this.divAndCaption.container.classList.toggle('hide', hide);\n\n this.topbar.container.classList.toggle('is-pinned-floating', isFloating);\n this.topbar.container.classList.toggle(`is-pinned-${this.className}-shown`, !hide);\n\n // const active = classNames.filter((className) => this.topbar.container.classList.contains(className));\n // const maxActive = hide ? 0 : 1;\n\n // * not sure when it became unneeded\n // if(scrollTop !== undefined && active.length <= maxActive/* && !scrollable.isScrolledDown */) {\n // scrollable.scrollTop = scrollTop + ((hide ? -1 : 1) * HEIGHT);\n // }\n\n this.topbar.setFloating();\n this.topbar.setUtilsWidth();\n }\n\n public isVisible() {\n return !this.divAndCaption.container.classList.contains('hide');\n }\n\n public isFloating() {\n return this.divAndCaption.container.classList.contains('is-floating');\n }\n\n public fill(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment, message: Message.message) {\n this.divAndCaption.container.dataset.peerId = '' + message.peerId;\n this.divAndCaption.container.dataset.mid = '' + message.mid;\n this.divAndCaption.fill(title, subtitle, message);\n this.topbar.setUtilsWidth();\n }\n}\n","// https://github.com/evgeny-nadymov/telegram-react/blob/master/src/Components/ColumnMiddle/PinnedMessageBorder.js\n\nenum BAR_HEIGHTS {\n ONE = 32,\n TWO = 15,\n THREE = 10,\n FOUR = 8,\n MORE = 8\n};\n\nconst GAP = 1;\nconst WIDTH = 2;\nconst BASE_CLASS = 'pinned-message-border';\n\nexport default class PinnedMessageBorder {\n private border: HTMLElement;\n private wrapper: HTMLElement;\n private svg: SVGSVGElement;\n private defs: SVGDefsElement;\n private clipPath: SVGClipPathElement;\n private path: SVGPathElement;\n private mark: HTMLElement;\n\n private count: number;\n private index: number;\n\n private drawRect = (x: number, y: number, width: number, height: number, radius: number) => {\n return `M${x},${y + radius}a${radius},${radius},0,0,1,${width},0v${height - 2 * radius}a${radius},${radius},0,0,1,${-width},0Z`;\n };\n\n private getClipPath = (id: string, barHeight: number, count: number) => {\n const radius = 1;\n\n let d = '';\n /* if(count === 3) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius)\n + this.drawRect(0, barHeight + GAP, WIDTH, barHeight + 1, radius)\n + this.drawRect(0, barHeight * 2 + GAP * 2 + 1, WIDTH, barHeight, radius);\n } */if(count === 2) {\n d = this.drawRect(0, 0, WIDTH, barHeight, radius) + this.drawRect(0, barHeight + GAP * 2, WIDTH, barHeight, radius);\n } else {\n for(let i = 0; i < count; ++i) {\n d += this.drawRect(0, (barHeight + GAP) * i, WIDTH, barHeight, radius);\n }\n }\n\n if(!this.clipPath) {\n this.clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n\n this.clipPath.append(this.path);\n }\n\n this.clipPath.id = id;\n this.path.setAttributeNS(null, 'd', d);\n\n return this.clipPath;\n };\n\n private getBarHeight = (count: number, index: number) => {\n let barHeight: number;\n if(count <= 1) {\n barHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n barHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n barHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n barHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n barHeight = BAR_HEIGHTS.MORE;\n }\n\n return barHeight;\n };\n\n private getMarkHeight = (count: number, index: number) => {\n let markHeight: number;\n if(count <= 1) {\n markHeight = BAR_HEIGHTS.ONE;\n } else if(count === 2) {\n markHeight = BAR_HEIGHTS.TWO;\n } else if(count === 3) {\n markHeight = BAR_HEIGHTS.THREE;\n } else if(count === 4) {\n markHeight = BAR_HEIGHTS.FOUR;\n } else if(count > 3) {\n markHeight = BAR_HEIGHTS.MORE;\n }\n\n return markHeight;\n };\n\n private getMarkTranslateY = (index: number, barHeight: number, count: number) => {\n if(count === 1) {\n return 0;\n } else if(count === 2) {\n return !index ? 0 : barHeight + GAP;\n }\n\n if(count === 3) {\n if(!index) {\n return 0;\n } else if(index === 1) {\n return barHeight + GAP;\n }\n\n return barHeight * 2 + GAP * 2 + 1;\n } else {\n return (barHeight + GAP) * index;\n }\n };\n\n private getTrackTranslateY = (index: number, count: number, barHeight: number, trackHeight: number) => {\n if(count <= 4) {\n return 0;\n }\n\n if(index <= 1) {\n return 0;\n } else if(index >= (count - 2)) {\n return trackHeight - BAR_HEIGHTS.ONE - barHeight;\n }\n\n // return (index + 1) * barHeight + index * GAP;\n return (index - 2) * barHeight + index * GAP;\n // return (barHeight + GAP * 2) / 2 + (index - 2) * (barHeight + GAP);\n };\n\n private getTrackHeight = (count: number, barHeight: number) => {\n return count <= 3 ? BAR_HEIGHTS.ONE : barHeight * count + GAP * (count - 1);\n };\n\n public render(count: number, index: number) {\n if(!this.border) {\n this.border = document.createElement('div');\n this.border.classList.add(BASE_CLASS);\n\n this.wrapper = document.createElement('div');\n this.border.append(this.wrapper);\n }\n\n if(count === 1) {\n if(this.count !== count) {\n this.wrapper.className = BASE_CLASS + '-wrapper-1';\n this.border.classList.remove(BASE_CLASS + '-mask');\n this.wrapper.innerHTML = this.wrapper.style.cssText = '';\n }\n\n return this.border;\n }\n\n const barHeight = this.getBarHeight(count, index);\n const markHeight = this.getMarkHeight(count, index);\n const trackHeight = this.getTrackHeight(count, barHeight);\n\n const clipPathId = `clipPath_${count}`;\n const clipPath = this.getClipPath(clipPathId, barHeight, count);\n\n const markTranslateY = this.getMarkTranslateY(index, barHeight, count);\n const trackTranslateY = this.getTrackTranslateY(index, count, barHeight, trackHeight);\n\n this.border.classList.toggle(BASE_CLASS + '-mask', count > 4);\n\n if(index <= 1) {\n this.border.classList.add('mask-bottom');\n this.border.classList.remove('mask-top');\n } else if(index >= (count - 2)) {\n this.border.classList.add('mask-top');\n this.border.classList.remove('mask-bottom');\n } else {\n this.border.classList.add('mask-top', 'mask-bottom');\n }\n\n this.wrapper.className = BASE_CLASS + '-wrapper';\n this.wrapper.style.cssText = `clip-path: url(#${clipPathId}); width: 2px; height: ${trackHeight}px; transform: translateY(-${trackTranslateY}px);`;\n\n if(!this.svg) {\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.svg.setAttributeNS(null, 'height', '0');\n this.svg.setAttributeNS(null, 'width', '0');\n\n this.defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n this.defs.append(clipPath);\n\n this.svg.append(this.defs);\n\n this.mark = document.createElement('div');\n this.mark.classList.add(BASE_CLASS + '-mark');\n }\n\n if(!this.svg.parentElement) {\n this.wrapper.append(this.svg, this.mark);\n }\n\n this.mark.style.cssText = `height: ${markHeight}px; transform: translateY(${markTranslateY}px);`;\n\n this.count = count;\n this.index = index;\n\n return this.border;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppMessagesManager} from '../../lib/appManagers/appMessagesManager';\nimport type ChatTopbar from './topbar';\nimport rootScope from '../../lib/rootScope';\nimport appMediaPlaybackController, {AppMediaPlaybackController} from '../appMediaPlaybackController';\nimport DivAndCaption from '../divAndCaption';\nimport PinnedContainer from './pinnedContainer';\nimport Chat from './chat';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport PeerTitle from '../peerTitle';\nimport {i18n} from '../../lib/langPack';\nimport {formatFullSentTime} from '../../helpers/date';\nimport ButtonIcon from '../buttonIcon';\nimport {DocumentAttribute} from '../../layer';\nimport MediaProgressLine from '../mediaProgressLine';\nimport VolumeSelector from '../volumeSelector';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nexport default class ChatAudio extends PinnedContainer {\n private toggleEl: HTMLElement;\n private progressLine: MediaProgressLine;\n private volumeSelector: VolumeSelector;\n private fasterEl: HTMLElement;\n private repeatEl: HTMLButtonElement;\n\n constructor(protected topbar: ChatTopbar, protected chat: Chat, protected managers: AppManagers) {\n super({\n topbar,\n chat,\n listenerSetter: topbar.listenerSetter,\n className: 'audio',\n divAndCaption: new DivAndCaption(\n 'pinned-audio',\n (title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment) => {\n replaceContent(this.divAndCaption.title, title);\n replaceContent(this.divAndCaption.subtitle, subtitle);\n }\n ),\n onClose: () => {\n appMediaPlaybackController.stop();\n },\n floating: true\n });\n\n this.divAndCaption.border.remove();\n\n const prevEl = ButtonIcon('fast_rewind active', {noRipple: true});\n const nextEl = ButtonIcon('fast_forward active', {noRipple: true});\n\n const attachClick = (elem: HTMLElement, callback: () => void) => {\n attachClickEvent(elem, (e) => {\n cancelEvent(e);\n callback();\n }, {listenerSetter: this.topbar.listenerSetter});\n };\n\n attachClick(prevEl, () => {\n appMediaPlaybackController.previous();\n });\n\n attachClick(nextEl, () => {\n appMediaPlaybackController.next();\n });\n\n this.toggleEl = ButtonIcon('', {noRipple: true});\n this.toggleEl.classList.add('active', 'pinned-audio-ico', 'tgico');\n attachClick(this.toggleEl, () => {\n appMediaPlaybackController.toggle();\n });\n this.wrapper.prepend(this.wrapper.firstElementChild, prevEl, this.toggleEl, nextEl);\n\n this.volumeSelector = new VolumeSelector(this.listenerSetter, true);\n const volumeProgressLineContainer = document.createElement('div');\n volumeProgressLineContainer.classList.add('progress-line-container');\n volumeProgressLineContainer.append(this.volumeSelector.container);\n const tunnel = document.createElement('div');\n tunnel.classList.add('pinned-audio-volume-tunnel');\n this.volumeSelector.btn.classList.add('pinned-audio-volume', 'active');\n this.volumeSelector.btn.prepend(tunnel);\n this.volumeSelector.btn.append(volumeProgressLineContainer);\n\n this.repeatEl = ButtonIcon('audio_repeat', {noRipple: true});\n attachClick(this.repeatEl, () => {\n const params = appMediaPlaybackController.getPlaybackParams();\n if(!params.round) {\n appMediaPlaybackController.round = true;\n } else if(params.loop) {\n appMediaPlaybackController.round = false;\n appMediaPlaybackController.loop = false;\n } else {\n appMediaPlaybackController.loop = !appMediaPlaybackController.loop;\n }\n });\n\n const fasterEl = this.fasterEl = ButtonIcon('playback_2x', {noRipple: true});\n attachClick(fasterEl, () => {\n appMediaPlaybackController.playbackRate = fasterEl.classList.contains('active') ? 1 : 1.75;\n });\n\n this.wrapperUtils.prepend(this.volumeSelector.btn, fasterEl, this.repeatEl);\n\n const progressWrapper = document.createElement('div');\n progressWrapper.classList.add('pinned-audio-progress-wrapper');\n\n this.progressLine = new MediaProgressLine(undefined, undefined, true, true);\n this.progressLine.container.classList.add('pinned-audio-progress');\n progressWrapper.append(this.progressLine.container);\n this.wrapper.insertBefore(progressWrapper, this.wrapperUtils);\n\n this.topbar.listenerSetter.add(appMediaPlaybackController)('play', this.onMediaPlay);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('pause', this.onPause);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('stop', this.onStop);\n this.topbar.listenerSetter.add(appMediaPlaybackController)('playbackParams', this.onPlaybackParams);\n\n const playingDetails = appMediaPlaybackController.getPlayingDetails();\n if(playingDetails) {\n this.onMediaPlay(playingDetails);\n this.onPlaybackParams(playingDetails.playbackParams);\n }\n }\n\n public destroy() {\n if(this.progressLine) {\n this.progressLine.removeListeners();\n }\n }\n\n private onPlaybackParams = (playbackParams: ReturnType) => {\n this.fasterEl.classList.toggle('active', playbackParams.playbackRate > 1);\n\n this.repeatEl.classList.remove('tgico-audio_repeat', 'tgico-audio_repeat_single');\n this.repeatEl.classList.add(playbackParams.loop ? 'tgico-audio_repeat_single' : 'tgico-audio_repeat');\n this.repeatEl.classList.toggle('active', playbackParams.loop || playbackParams.round);\n };\n\n private onPause = () => {\n this.toggleEl.classList.remove('flip-icon');\n };\n\n private onStop = () => {\n this.toggle(true);\n };\n\n private onMediaPlay = ({doc, message, media, playbackParams}: ReturnType) => {\n let title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment;\n const isMusic = doc.type !== 'voice' && doc.type !== 'round';\n if(!isMusic) {\n title = new PeerTitle({peerId: message.fromId, fromName: message.fwd_from?.from_name}).element;\n\n // subtitle = 'Voice message';\n subtitle = formatFullSentTime(message.date);\n } else {\n const audioAttribute = doc.attributes.find((attr) => attr._ === 'documentAttributeAudio') as DocumentAttribute.documentAttributeAudio;\n title = wrapEmojiText(audioAttribute?.title ?? doc.file_name);\n subtitle = audioAttribute?.performer ? wrapEmojiText(audioAttribute.performer) : i18n('AudioUnknownArtist');\n }\n\n this.fasterEl.classList.toggle('hide', isMusic);\n this.repeatEl.classList.toggle('hide', !isMusic);\n\n this.onPlaybackParams(playbackParams);\n this.volumeSelector.setVolume();\n\n this.progressLine.setMedia(media);\n\n this.fill(title, subtitle, message);\n // this.toggleEl.classList.add('flip-icon');\n this.toggleEl.classList.toggle('flip-icon', !media.paused);\n this.toggle(false);\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatTopbar from './topbar';\nimport PopupPinMessage from '../popups/unpinMessage';\nimport PinnedContainer from './pinnedContainer';\nimport PinnedMessageBorder from './pinnedMessageBorder';\nimport ReplyContainer, {wrapReplyDivAndCaption} from './replyContainer';\nimport rootScope from '../../lib/rootScope';\nimport Chat from './chat';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport ButtonIcon from '../buttonIcon';\nimport {getHeavyAnimationPromise} from '../../hooks/useHeavyAnimationCheck';\nimport {i18n} from '../../lib/langPack';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport handleScrollSideEvent from '../../helpers/dom/handleScrollSideEvent';\nimport debounce from '../../helpers/schedulers/debounce';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport {Message} from '../../layer';\nimport {logger} from '../../lib/logger';\n\nclass AnimatedSuper {\n static DURATION = 200;\n static BASE_CLASS = 'animated-super';\n container: HTMLDivElement;\n rows: {[index: string]: {element: HTMLElement, timeout?: number, new?: true}} = {};\n clearTimeout: number;\n\n constructor() {\n this.container = document.createElement('div');\n this.container.className = AnimatedSuper.BASE_CLASS;\n }\n\n public getRow(index: number, animateFirst = false) {\n if(this.rows[index]) return this.rows[index].element;\n const row = document.createElement('div');\n const isFirst = !Object.keys(this.rows).length && !animateFirst;\n row.className = AnimatedSuper.BASE_CLASS + '-row' + (isFirst ? '' : ' is-hiding hide');\n this.rows[index] = {element: row, new: true};\n this.container.append(row);\n return row;\n }\n\n public clearRow(index: number) {\n if(!this.rows[index]) return;\n this.rows[index].element.remove();\n delete this.rows[index];\n }\n\n public clearRows(currentIndex?: number) {\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\n this.clearTimeout = window.setTimeout(() => {\n for(const i in this.rows) {\n if(+i === currentIndex) continue;\n this.clearRow(+i);\n }\n }, AnimatedSuper.DURATION);\n }\n\n public setNewRow(index: number, reflow = false) {\n const row = this.rows[index];\n if(row.new) {\n if(reflow) {\n row.element.classList.remove('hide');\n void row.element.offsetLeft; // reflow\n } else {\n row.element.classList.remove('is-hiding', 'hide');\n }\n\n delete row.new;\n }\n\n this.clearRows(index);\n }\n\n public animate(index: number, previousIndex: number, fromTop = index > previousIndex, ignorePrevious = false) {\n if(index === previousIndex) { // * handle if set index 0 and previousIndex 0\n return this.setNewRow(index);\n }\n\n const row = this.rows[index];\n const previousRow = this.rows[previousIndex];\n if(!previousRow && !ignorePrevious) {\n return this.setNewRow(index);\n }\n\n const sides = ['from-top', 'from-bottom'];\n if(!fromTop) sides.reverse();\n\n row.element.classList.add(sides[0]);\n row.element.classList.remove(sides[1]);\n if(previousRow) {\n previousRow.element.classList.add(sides[1]);\n previousRow.element.classList.remove(sides[0]);\n }\n\n if(row.new) {\n this.setNewRow(index, true);\n }\n\n row.element.classList.toggle('is-hiding', false);\n previousRow && previousRow.element.classList.toggle('is-hiding', true);\n\n /* const height = row.element.getBoundingClientRect().height;\n row.element.style.transform = `translateY(${fromTop ? height * -1 : height}px)`;\n if(previousRow) {\n previousRow.element.style.transform = `translateY(${fromTop ? height : height * -1}px)`;\n } */\n\n /* row.element.style.setProperty('--height', row.element.getBoundingClientRect().height + 'px');\n if(previousRow) {\n previousRow.element.style.setProperty('--height', previousRow.element.getBoundingClientRect().height + 'px');\n } */\n\n this.clearRows(index);\n }\n}\n\nclass AnimatedCounter {\n static EMPTY_INDEX = -1;\n static BASE_CLASS = 'animated-counter';\n container: HTMLElement;\n decimals: {\n container: HTMLElement,\n placeholder: HTMLElement,\n animatedSuper: AnimatedSuper\n }[] = [];\n previousNumber = 0;\n clearTimeout: number;\n\n constructor(private reverse = false) {\n this.container = document.createElement('div');\n this.container.className = AnimatedCounter.BASE_CLASS;\n }\n\n getDecimal(index: number) {\n if(this.decimals[index]) return this.decimals[index];\n const item = document.createElement('div');\n item.className = AnimatedCounter.BASE_CLASS + '-decimal';\n\n const placeholder = document.createElement('div');\n placeholder.className = AnimatedCounter.BASE_CLASS + '-decimal-placeholder';\n\n const animatedSuper = new AnimatedSuper();\n animatedSuper.container.className = AnimatedCounter.BASE_CLASS + '-decimal-wrapper';\n\n item.append(placeholder, animatedSuper.container);\n\n this.container.append(item);\n\n return this.decimals[index] = {container: item, placeholder, animatedSuper};\n }\n\n clear(number: number) {\n if(this.clearTimeout) clearTimeout(this.clearTimeout);\n\n const decimals = ('' + number).length;\n if(decimals >= this.decimals.length) {\n return;\n }\n\n this.clearTimeout = window.setTimeout(() => {\n const byDecimal = this.decimals.splice(decimals, this.decimals.length - decimals);\n byDecimal.forEach((decimal) => {\n decimal.container.remove();\n });\n }, AnimatedSuper.DURATION);\n }\n\n /* prepareNumber(number: number) {\n const decimals = ('' + number).length;\n if(this.decimals.length < decimals) {\n for(let i = this.decimals.length; i < decimals; ++i) {\n this.getDecimal(i);\n }\n }\n } */\n\n hideLeft(number: number) {\n const decimals = ('' + number).length;\n const byDecimal = this.decimals.slice(decimals);// this.decimals.splice(deleteCount, this.decimals.length - deleteCount);\n byDecimal.forEach((decimal) => {\n const previousDecimalNumber = +decimal.placeholder.innerText || 0;\n const row = decimal.animatedSuper.getRow(AnimatedCounter.EMPTY_INDEX, true);\n decimal.animatedSuper.animate(AnimatedCounter.EMPTY_INDEX, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\n });\n\n this.clear(number);\n }\n\n setCount(number: number) {\n // this.prepareNumber(number);\n\n const previousByDecimal = Array.from('' + this.previousNumber).map((n) => +n);\n const byDecimal = Array.from('' + number).map((n) => +n);\n byDecimal.forEach((decimalNumber, idx) => {\n const decimal = this.getDecimal(idx);\n // const row = decimal.animatedSuper.getRow(number, true);\n const row = decimal.animatedSuper.getRow(decimalNumber, true);\n const previousDecimalNumber = previousByDecimal[idx] ?? AnimatedCounter.EMPTY_INDEX;\n row.innerText = decimal.placeholder.innerText = '' + decimalNumber;\n // decimal.animatedSuper.animate(number, this.previousNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\n decimal.animatedSuper.animate(decimalNumber, previousDecimalNumber, this.reverse ? number < this.previousNumber : number > this.previousNumber, true);\n });\n\n this.hideLeft(number);\n // this.clear(number);\n this.previousNumber = number;\n }\n}\n\nexport default class ChatPinnedMessage {\n private static LOAD_COUNT = 50;\n private static LOAD_OFFSET = 5;\n\n public pinnedMessageContainer: PinnedContainer;\n private pinnedMessageBorder: PinnedMessageBorder;\n\n private pinnedMaxMid = 0;\n public pinnedMid = 0;\n public pinnedIndex = -1;\n private wasPinnedIndex = 0;\n private wasPinnedMediaIndex = 0;\n\n public locked = false;\n private waitForScrollBottom = false;\n\n public count = 0;\n private mids: number[] = [];\n private offsetIndex = 0;\n\n private loading = false;\n private loadedBottom = false;\n private loadedTop = false;\n\n private animatedSubtitle: AnimatedSuper;\n private animatedMedia: AnimatedSuper;\n private animatedCounter: AnimatedCounter;\n\n private listenerSetter: ListenerSetter;\n private scrollDownListenerSetter: ListenerSetter = null;\n\n public hidden = false;\n\n private getCurrentIndexPromise: Promise = null;\n private btnOpen: HTMLButtonElement;\n\n private setPinnedMessage: () => void;\n\n private isStatic: boolean;\n\n private debug: boolean;\n\n public setCorrectIndexThrottled: (lastScrollDirection?: number) => void;\n\n private log: ReturnType;\n\n constructor(private topbar: ChatTopbar, private chat: Chat, private managers: AppManagers) {\n this.listenerSetter = new ListenerSetter();\n this.log = logger('PM');\n this.debug = true;\n this.isStatic = false;\n\n const dAC = new ReplyContainer('pinned-message', chat.animationGroup);\n this.pinnedMessageContainer = new PinnedContainer({\n topbar,\n chat,\n listenerSetter: this.listenerSetter,\n className: 'message',\n divAndCaption: dAC,\n onClose: async() => {\n if(await managers.appPeersManager.canPinMessage(this.chat.peerId)) {\n new PopupPinMessage(this.chat.peerId, this.pinnedMid, true);\n } else {\n new PopupPinMessage(this.chat.peerId, 0, true);\n }\n\n return false;\n }\n });\n\n this.pinnedMessageBorder = new PinnedMessageBorder();\n dAC.border.replaceWith(this.pinnedMessageBorder.render(1, 0));\n\n this.animatedSubtitle = new AnimatedSuper();\n dAC.subtitle.append(this.animatedSubtitle.container);\n\n this.animatedMedia = new AnimatedSuper();\n this.animatedMedia.container.classList.add('pinned-message-media-container');\n dAC.content.prepend(this.animatedMedia.container);\n\n this.animatedCounter = new AnimatedCounter(true);\n dAC.title.append(i18n('PinnedMessage'), ' ', this.animatedCounter.container);\n\n const btnClose = this.pinnedMessageContainer.btnClose.cloneNode(true) as HTMLElement;\n this.pinnedMessageContainer.attachOnCloseEvent(btnClose);\n dAC.container.prepend(btnClose);\n\n this.btnOpen = ButtonIcon('pinlist pinned-container-close pinned-message-pinlist', {noRipple: true});\n\n this.pinnedMessageContainer.wrapperUtils.prepend(this.btnOpen);\n\n attachClickEvent(this.btnOpen, (e) => {\n cancelEvent(e);\n this.topbar.openPinned(true);\n }, {listenerSetter: this.listenerSetter});\n\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId}) => {\n if(peerId === this.chat.peerId) {\n // this.wasPinnedIndex = 0;\n // setTimeout(() => {\n if(this.hidden) {\n this.pinnedMessageContainer.toggle(this.hidden = false);\n }\n\n this.loadedTop = this.loadedBottom = false;\n this.pinnedIndex = -1;\n this.pinnedMid = 0;\n this.count = 0;\n this.mids = [];\n this.offsetIndex = 0;\n this.pinnedMaxMid = 0;\n this.setCorrectIndex(0);\n // }, 300);\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_pinned_hidden', ({peerId}) => {\n if(peerId === this.chat.peerId) {\n this.pinnedMessageContainer.toggle(this.hidden = true);\n }\n });\n\n // * 200 - no lags\n // * 100 - need test\n this.setPinnedMessage = debounce(() => this._setPinnedMessage(), 100, true, true);\n this.setCorrectIndexThrottled = throttle(this.setCorrectIndex.bind(this), 100, false);\n\n this.isStatic = !this.chat.isPinnedMessagesNeeded();\n }\n\n public destroy() {\n this.pinnedMessageContainer.divAndCaption.container.remove();\n this.pinnedMessageContainer.toggle(true);\n this.listenerSetter.removeAll();\n this.unsetScrollDownListener(false);\n }\n\n public setCorrectIndex(lastScrollDirection?: number) {\n if(this.isStatic) return;\n // return;\n\n if(this.locked || this.hidden/* || this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise */) {\n return;\n }\n\n if((this.loadedBottom || this.loadedTop) && !this.count) {\n return;\n }\n\n // const perf = performance.now();\n const el = this.chat.bubbles.getBubbleByPoint('bottom');\n // this.log('setCorrectIndex: get last element perf:', performance.now() - perf, el);\n if(!el) return;\n\n // return;\n\n const mid = el.dataset.mid;\n if(el && mid !== undefined) {\n // this.log('setCorrectIndex will test mid:', mid);\n this.testMid(+mid, lastScrollDirection);\n }\n }\n\n public testMid(mid: number, lastScrollDirection?: number) {\n if(this.isStatic) return;\n\n // if(lastScrollDirection !== undefined) return;\n if(this.hidden) return;\n\n // this.log('testMid', mid);\n\n let currentIndex: number = this.mids.findIndex((_mid) => _mid <= mid);\n if(currentIndex !== -1 && !this.isNeededMore(currentIndex)) {\n currentIndex += this.offsetIndex;\n } else if(this.loadedTop && mid < this.mids[this.mids.length - 1]) {\n // currentIndex = 0;\n currentIndex = this.mids.length - 1 + this.offsetIndex;\n } else {\n if(!this.getCurrentIndexPromise) {\n this.getCurrentIndexPromise = this.getCurrentIndex(mid, lastScrollDirection !== undefined);\n }\n\n return;\n }\n\n // const idx = Math.max(0, this.mids.indexOf(mid));\n\n /* if(currentIndex === this.count) {\n currentIndex = 0;\n } */\n\n // this.log('testMid: pinned currentIndex', currentIndex, mid);\n\n const changed = this.pinnedIndex !== currentIndex;\n if(changed) {\n if(this.waitForScrollBottom && lastScrollDirection !== undefined) {\n if(this.pinnedIndex === 0 || this.pinnedIndex > currentIndex) { // если не скроллил вниз и пытается поставить нижний пиннед - выйти\n return;\n }\n }\n\n this.pinnedIndex = currentIndex;\n this.pinnedMid = this.mids.find((_mid) => _mid <= mid) || this.mids[this.mids.length - 1];\n this.setPinnedMessage();\n }\n }\n\n private isNeededMore(currentIndex: number) {\n return (this.count > ChatPinnedMessage.LOAD_COUNT &&\n (\n (!this.loadedBottom && currentIndex <= ChatPinnedMessage.LOAD_OFFSET) ||\n (!this.loadedTop && (this.count - 1 - currentIndex) <= ChatPinnedMessage.LOAD_OFFSET)\n )\n );\n }\n\n private async getCurrentIndex(mid: number, correctAfter = true) {\n if(this.loading) return;\n this.loading = true;\n\n try {\n const log = this.debug ? this.log.bindPrefix('getCurrentIndex') : undefined;\n log && log('start', mid, correctAfter);\n\n let gotRest = false;\n const promises = [\n this.managers.appMessagesManager.getSearch({\n peerId: this.chat.peerId,\n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId: mid,\n limit: ChatPinnedMessage.LOAD_COUNT,\n backLimit: ChatPinnedMessage.LOAD_COUNT,\n threadId: this.chat.threadId\n })\n .then((r) => {\n gotRest = true;\n return r;\n })\n ];\n\n if(!this.pinnedMaxMid) {\n const promise = this.managers.appMessagesManager.getPinnedMessage(this.chat.peerId, this.chat.threadId).then((p) => {\n if(!p.maxId) return;\n this.pinnedMaxMid = p.maxId;\n\n if(!gotRest && correctAfter) {\n this.mids = [this.pinnedMaxMid];\n this.count = p.count;\n this.pinnedIndex = 0;\n this.pinnedMid = this.mids[0];\n this.setPinnedMessage();\n // this.pinnedMessageContainer.toggle(false);\n }\n });\n\n promises.push(promise as any);\n }\n\n const result = (await Promise.all(promises))[0];\n\n let backLimited = result.history.findIndex((message) => message.mid <= mid);\n if(backLimited === -1) {\n backLimited = result.history.length;\n }/* else {\n backLimited -= 1;\n } */\n\n this.offsetIndex = result.offset_id_offset ? result.offset_id_offset - backLimited : 0;\n this.mids = result.history.map((message) => message.mid).slice();\n this.count = result.count;\n\n if(!this.count) {\n this.pinnedMessageContainer.toggle(true);\n }\n\n this.loadedTop = (this.offsetIndex + this.mids.length) === this.count;\n this.loadedBottom = !this.offsetIndex;\n\n log && log('result', mid, result, backLimited, this.offsetIndex, this.loadedTop, this.loadedBottom);\n } catch(err) {\n this.log.error('getCurrentIndex error', err);\n }\n\n this.loading = false;\n\n if(this.locked) {\n this.testMid(mid);\n } else if(correctAfter) {\n this.setCorrectIndex(0);\n }\n\n this.getCurrentIndexPromise = null;\n // return result.offset_id_offset || 0;\n }\n\n public setScrollDownListener() {\n this.waitForScrollBottom = true;\n\n if(!this.scrollDownListenerSetter) {\n this.scrollDownListenerSetter = new ListenerSetter();\n handleScrollSideEvent(this.chat.bubbles.scrollable.container, 'bottom', () => {\n this.unsetScrollDownListener();\n }, this.scrollDownListenerSetter);\n }\n }\n\n public unsetScrollDownListener(refreshPosition = true) {\n this.waitForScrollBottom = false;\n\n if(this.scrollDownListenerSetter) {\n this.scrollDownListenerSetter.removeAll();\n this.scrollDownListenerSetter = null;\n }\n\n if(refreshPosition) {\n this.setCorrectIndex(0);\n }\n }\n\n public async handleFollowingPinnedMessage() {\n this.locked = true;\n\n this.debug && this.log('handleFollowingPinnedMessage');\n try {\n this.setScrollDownListener();\n\n const setPeerPromise = this.chat.setPeerPromise;\n if(setPeerPromise instanceof Promise) {\n await setPeerPromise;\n }\n\n // await this.chat.bubbles.scrollable.scrollLockedPromise;\n await getHeavyAnimationPromise();\n\n if(this.getCurrentIndexPromise) {\n await this.getCurrentIndexPromise;\n }\n\n this.debug && this.log('handleFollowingPinnedMessage: unlock');\n this.locked = false;\n\n /* // подождём, пока скролл остановится\n setTimeout(() => {\n this.log('handleFollowingPinnedMessage: unlock');\n this.locked = false;\n }, 50); */\n } catch(err) {\n this.log.error('handleFollowingPinnedMessage error:', err);\n\n this.locked = false;\n this.waitForScrollBottom = false;\n this.setCorrectIndex(0);\n }\n }\n\n public async followPinnedMessage(mid: number) {\n const message = await this.chat.getMessage(mid);\n if(!message) {\n return;\n }\n\n this.chat.setMessageId(mid);\n (this.chat.setPeerPromise || Promise.resolve()).then(() => { // * debounce fast clicker\n this.handleFollowingPinnedMessage();\n this.testMid(this.pinnedIndex >= (this.count - 1) ? this.pinnedMaxMid : mid - 1);\n });\n }\n\n public async _setPinnedMessage() {\n // ///this.log('setting pinned message', message);\n // return;\n /* const promise: Promise = this.chat.setPeerPromise || this.chat.bubbles.messagesQueuePromise || Promise.resolve();\n Promise.all([\n promise\n ]).then(() => { */\n // const mids = results[0];\n const count = this.count;\n if(count) {\n const pinnedIndex = this.pinnedIndex;\n const message = await this.chat.getMessage(this.pinnedMid);\n\n // this.animatedCounter.prepareNumber(count);\n\n // setTimeout(() => {\n const isLast = pinnedIndex === 0;\n this.animatedCounter.container.classList.toggle('is-last', isLast);\n // SetTransition(this.animatedCounter.container, 'is-last', isLast, AnimatedSuper.DURATION);\n if(!isLast) {\n this.animatedCounter.setCount(count - pinnedIndex);\n }\n // }, 100);\n\n // this.pinnedMessageContainer.fill(undefined, message.message, message);\n this.pinnedMessageContainer.toggle(false);\n\n const fromTop = pinnedIndex > this.wasPinnedIndex;\n\n this.debug && this.log('setPinnedMessage: fromTop', fromTop, pinnedIndex, this.wasPinnedIndex);\n\n const writeTo = this.animatedSubtitle.getRow(pinnedIndex);\n const writeMediaTo = this.animatedMedia.getRow(pinnedIndex);\n writeMediaTo.classList.add('pinned-message-media');\n // writeMediaTo.innerHTML = writeMediaTo.style.cssText = writeMediaTo.dataset.docId = '';\n const loadPromises: Promise[] = [];\n const isMediaSet = await wrapReplyDivAndCaption({\n title: undefined,\n titleEl: null,\n subtitle: (message as Message.message).message,\n subtitleEl: writeTo,\n message,\n mediaEl: writeMediaTo,\n loadPromises,\n animationGroup: this.chat.animationGroup\n });\n\n await Promise.all(loadPromises);\n\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-media', isMediaSet);\n\n // if(this.wasPinnedIndex !== this.pinnedIndex) {\n this.animatedSubtitle.animate(pinnedIndex, this.wasPinnedIndex);\n if(isMediaSet) {\n this.animatedMedia.animate(pinnedIndex, this.wasPinnedMediaIndex); // * wasPinnedMediaIndex из-за того, что блок меняется с другим алгоритмом\n this.wasPinnedMediaIndex = pinnedIndex;\n } else {\n this.animatedMedia.clearRows();\n }\n // }\n\n this.pinnedMessageBorder.render(count, count - pinnedIndex - 1);\n this.wasPinnedIndex = pinnedIndex;\n this.pinnedMessageContainer.divAndCaption.container.dataset.mid = '' + message.mid;\n } else {\n this.pinnedMessageContainer.toggle(true);\n this.wasPinnedIndex = 0;\n }\n\n this.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-many', this.count > 1);\n // });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ListenerSetter from '../listenerSetter';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\n\nexport default function handleScrollSideEvent(elem: HTMLElement, side: 'top' | 'bottom', callback: () => void, listenerSetter: ListenerSetter) {\n if(IS_TOUCH_SUPPORTED) {\n let lastY: number;\n const options = {passive: true};\n listenerSetter.add(elem)('touchstart', (e) => {\n if(e.touches.length > 1) {\n onTouchEnd();\n return;\n }\n\n lastY = e.touches[0].clientY;\n\n listenerSetter.add(elem)('touchmove', onTouchMove, options);\n listenerSetter.add(elem)('touchend', onTouchEnd, options);\n }, options);\n\n const onTouchMove = (e: TouchEvent) => {\n const clientY = e.touches[0].clientY;\n\n const isDown = clientY < lastY;\n if(side === 'bottom' && isDown) callback();\n else if(side === 'top' && !isDown) callback();\n lastY = clientY;\n // alert('isDown: ' + !!isDown);\n };\n\n const onTouchEnd = () => {\n listenerSetter.removeManual(elem, 'touchmove', onTouchMove, options);\n listenerSetter.removeManual(elem, 'touchend', onTouchEnd, options);\n };\n } else {\n listenerSetter.add(elem)('wheel', (e) => {\n const isDown = e.deltaY > 0;\n // this.log('wheel', e, isDown);\n if(side === 'bottom' && isDown) callback();\n else if(side === 'top' && !isDown) callback();\n }, {passive: true});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Channel} from '../../lib/appManagers/appChatsManager';\nimport type {AppSidebarRight} from '../sidebarRight';\nimport type Chat from './chat';\nimport {RIGHT_COLUMN_ACTIVE_CLASSNAME} from '../sidebarRight';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport rootScope from '../../lib/rootScope';\nimport AvatarElement from '../avatar';\nimport Button from '../button';\nimport ButtonIcon from '../buttonIcon';\nimport ButtonMenuToggle from '../buttonMenuToggle';\nimport ChatAudio from './audio';\nimport ChatPinnedMessage from './pinnedMessage';\nimport {ButtonMenuItemOptions} from '../buttonMenu';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport PopupDeleteDialog from '../popups/deleteDialog';\nimport appNavigationController from '../appNavigationController';\nimport {LEFT_COLUMN_ACTIVE_CLASSNAME} from '../sidebarLeft';\nimport PeerTitle from '../peerTitle';\nimport {i18n} from '../../lib/langPack';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport {toast, toastNew} from '../toast';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {ChatFull, Chat as MTChat, GroupCall} from '../../layer';\nimport PopupPickUser from '../popups/pickUser';\nimport PopupPeer from '../popups/peer';\nimport AppEditContactTab from '../sidebarRight/tabs/editContact';\nimport appMediaPlaybackController from '../appMediaPlaybackController';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport {CallType} from '../../lib/calls/types';\nimport PopupMute from '../popups/mute';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport hasRights from '../../lib/appManagers/utils/chats/hasRights';\nimport wrapPeerTitle from '../wrappers/peerTitle';\nimport groupCallsController from '../../lib/calls/groupCallsController';\nimport apiManagerProxy from '../../lib/mtproto/mtprotoworker';\nimport {makeMediaSize} from '../../helpers/mediaSize';\n\ntype ButtonToVerify = {element?: HTMLElement, verify: () => boolean | Promise};\n\nexport default class ChatTopbar {\n public container: HTMLDivElement;\n private btnBack: HTMLButtonElement;\n private chatInfo: HTMLDivElement;\n private avatarElement: AvatarElement;\n private title: HTMLDivElement;\n private subtitle: HTMLDivElement;\n private chatUtils: HTMLDivElement;\n private btnJoin: HTMLButtonElement;\n private btnPinned: HTMLButtonElement;\n private btnCall: HTMLButtonElement;\n private btnGroupCall: HTMLButtonElement;\n private btnMute: HTMLButtonElement;\n private btnSearch: HTMLButtonElement;\n private btnMore: HTMLElement;\n\n private chatAudio: ChatAudio;\n public pinnedMessage: ChatPinnedMessage;\n\n private setUtilsRAF: number;\n private setPeerStatusInterval: number;\n\n public listenerSetter: ListenerSetter;\n\n private menuButtons: Parameters[0]['buttons'];\n private buttonsToVerify: ButtonToVerify[];\n private chatInfoContainer: HTMLDivElement;\n private person: HTMLDivElement;\n\n constructor(\n private chat: Chat,\n private appSidebarRight: AppSidebarRight,\n private managers: AppManagers\n ) {\n this.listenerSetter = new ListenerSetter();\n\n this.menuButtons = [];\n this.buttonsToVerify = [];\n }\n\n public construct() {\n // this.chat.log.error('Topbar construction');\n\n this.container = document.createElement('div');\n this.container.classList.add('sidebar-header', 'topbar', 'hide');\n this.container.dataset.floating = '0';\n\n this.btnBack = ButtonIcon('left sidebar-close-button', {noRipple: true});\n\n // * chat info section\n this.chatInfoContainer = document.createElement('div');\n this.chatInfoContainer.classList.add('chat-info-container');\n\n this.chatInfo = document.createElement('div');\n this.chatInfo.classList.add('chat-info');\n\n const person = this.person = document.createElement('div');\n person.classList.add('person');\n\n const content = document.createElement('div');\n content.classList.add('content');\n\n const top = document.createElement('div');\n top.classList.add('top');\n\n this.title = document.createElement('div');\n this.title.classList.add('user-title');\n\n top.append(this.title);\n\n const bottom = document.createElement('div');\n bottom.classList.add('bottom');\n\n if(this.subtitle) {\n bottom.append(this.subtitle);\n }\n\n content.append(top, bottom);\n if(this.avatarElement) {\n person.append(this.avatarElement);\n }\n\n person.append(content);\n this.chatInfo.append(person);\n\n // * chat utils section\n this.chatUtils = document.createElement('div');\n this.chatUtils.classList.add('chat-utils');\n\n this.chatAudio = new ChatAudio(this, this.chat, this.managers);\n\n if(this.menuButtons.length) {\n this.btnMore = ButtonMenuToggle({\n listenerSetter: this.listenerSetter,\n direction: 'bottom-left',\n buttons: this.menuButtons,\n onOpen: async(e, element) => {\n const deleteButton = this.menuButtons[this.menuButtons.length - 1];\n if(deleteButton?.element) {\n const deleteButtonText = await this.managers.appPeersManager.getDeleteButtonText(this.peerId);\n deleteButton.element.lastChild.replaceWith(i18n(deleteButtonText));\n }\n }\n });\n }\n\n this.chatUtils.append(...[\n // this.chatAudio ? this.chatAudio.divAndCaption.container : null,\n this.pinnedMessage ? this.pinnedMessage.pinnedMessageContainer.divAndCaption.container : null,\n this.btnJoin,\n this.btnPinned,\n this.btnCall,\n this.btnGroupCall,\n this.btnMute,\n this.btnSearch,\n this.btnMore\n ].filter(Boolean));\n\n this.pushButtonToVerify(this.btnCall, this.verifyCallButton.bind(this, 'voice'));\n this.pushButtonToVerify(this.btnGroupCall, this.verifyVideoChatButton);\n\n this.chatInfoContainer.append(this.btnBack, this.chatInfo, this.chatUtils);\n this.container.append(this.chatInfoContainer);\n\n if(this.chatAudio) {\n // this.container.append(this.chatAudio.divAndCaption.container, this.chatUtils);\n this.container.append(this.chatAudio.divAndCaption.container);\n }\n\n // * construction end\n\n // * fix topbar overflow section\n\n this.listenerSetter.add(window)('resize', this.onResize);\n this.listenerSetter.add(mediaSizes)('changeScreen', this.onChangeScreen);\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'pinned-container');\n blurActiveElement();\n if(container) {\n cancelEvent(e);\n\n if(findUpClassName(e.target, 'progress-line')) {\n return;\n }\n\n const mid = +container.dataset.mid;\n if(container.classList.contains('pinned-message')) {\n // if(!this.pinnedMessage.locked) {\n this.pinnedMessage.followPinnedMessage(mid);\n // }\n } else {\n const peerId = container.dataset.peerId.toPeerId();\n const searchContext = appMediaPlaybackController.getSearchContext();\n this.chat.appImManager.setInnerPeer({\n peerId,\n lastMsgId: mid,\n type: searchContext.isScheduled ? 'scheduled' : (searchContext.threadId ? 'discussion' : undefined),\n threadId: searchContext.threadId\n });\n }\n } else {\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n onBtnBackClick();\n } else if(findUpTag(e.target, 'AVATAR-ELEMENT')) {\n this.appSidebarRight.toggleSidebar(!document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME));\n } else {\n this.appSidebarRight.toggleSidebar(true);\n }\n }\n }, {listenerSetter: this.listenerSetter});\n\n const onBtnBackClick = (e?: Event) => {\n if(e) {\n cancelEvent(e);\n }\n\n // const item = appNavigationController.findItemByType('chat');\n // * return manually to chat by arrow, since can't get back to\n if(mediaSizes.activeScreen === ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.chat.appImManager.setPeer({peerId: this.peerId});\n } else {\n const isFirstChat = this.chat.appImManager.chats.indexOf(this.chat) === 0;\n appNavigationController.back(isFirstChat ? 'im' : 'chat');\n /* return;\n\n if(mediaSizes.activeScreen === ScreenSize.medium && !appNavigationController.findItemByType('chat')) {\n this.chat.appImManager.setPeer(0);\n blurActiveElement();\n } else {\n appNavigationController.back('chat');\n } */\n }\n };\n\n attachClickEvent(this.btnBack, onBtnBackClick, {listenerSetter: this.listenerSetter});\n }\n\n private pushButtonToVerify(element: HTMLElement, verify: ButtonToVerify['verify']) {\n if(!element) {\n return;\n }\n\n this.buttonsToVerify.push({element, verify});\n }\n\n private verifyButtons = (e?: Event) => {\n const isMenuOpen = !!e || !!(this.btnMore && this.btnMore.classList.contains('menu-open'));\n\n e && cancelEvent(e);\n\n const r = async() => {\n const buttons = this.buttonsToVerify.concat(isMenuOpen ? this.menuButtons as any : []);\n const results = await Promise.all(buttons.map(async(button) => {\n return {\n result: await button.verify(),\n button\n }\n }));\n\n results.forEach(({button, result}) => {\n button.element.classList.toggle('hide', !result);\n });\n };\n\n r();\n };\n\n private verifyVideoChatButton = async(type?: 'group' | 'broadcast') => {\n if(!IS_GROUP_CALL_SUPPORTED || this.peerId.isUser() || this.chat.type !== 'chat' || this.chat.threadId) return false;\n\n const currentGroupCall = groupCallsController.groupCall;\n const chatId = this.peerId.toChatId();\n if(currentGroupCall?.chatId === chatId) {\n return false;\n }\n\n if(type) {\n if(((await this.managers.appPeersManager.isBroadcast(this.peerId)) && type === 'group') ||\n ((await this.managers.appPeersManager.isAnyGroup(this.peerId)) && type === 'broadcast')) {\n return false;\n }\n }\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n return (chat as MTChat.chat).pFlags?.call_active || hasRights(chat, 'manage_call');\n };\n\n private verifyCallButton = async(type?: CallType) => {\n if(!IS_CALL_SUPPORTED || !this.peerId.isUser()) return false;\n const userId = this.peerId.toUserId();\n const userFull = await this.managers.appProfileManager.getCachedFullUser(userId);\n\n return !!userFull && !!(type === 'voice' ? userFull.pFlags.phone_calls_available : userFull.pFlags.video_calls_available);\n };\n\n public constructUtils() {\n this.menuButtons = [{\n icon: 'search',\n text: 'Search',\n onClick: () => {\n this.chat.initSearch();\n },\n verify: () => mediaSizes.isMobile\n }, /* {\n icon: 'pinlist',\n text: 'Pinned Messages',\n onClick: () => this.openPinned(false),\n verify: () => mediaSizes.isMobile\n }, */{\n icon: 'mute',\n text: 'ChatList.Context.Mute',\n onClick: this.onMuteClick,\n verify: async() => this.chat.type === 'chat' && rootScope.myId !== this.peerId && !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.chat.threadId}))\n }, {\n icon: 'unmute',\n text: 'ChatList.Context.Unmute',\n onClick: () => {\n this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, threadId: this.chat.threadId});\n },\n verify: async() => this.chat.type === 'chat' && rootScope.myId !== this.peerId && (await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.peerId, respectType: false, threadId: this.chat.threadId}))\n }, {\n icon: 'comments',\n text: 'ViewDiscussion',\n onClick: () => {\n const middleware = this.chat.bubbles.getMiddleware();\n Promise.resolve(this.managers.appProfileManager.getChannelFull(this.peerId.toChatId())).then((channelFull) => {\n if(middleware() && channelFull.linked_chat_id) {\n this.chat.appImManager.setInnerPeer({\n peerId: channelFull.linked_chat_id.toPeerId(true)\n });\n }\n });\n },\n verify: async() => {\n const chatFull = await this.managers.appProfileManager.getCachedFullChat(this.peerId.toChatId());\n return this.chat.type === 'chat' && !!(chatFull as ChatFull.channelFull)?.linked_chat_id;\n }\n }, {\n icon: 'phone',\n text: 'Call',\n onClick: this.onCallClick.bind(this, 'voice'),\n verify: this.verifyCallButton.bind(this, 'voice')\n }, {\n icon: 'videocamera',\n text: 'VideoCall',\n onClick: this.onCallClick.bind(this, 'video'),\n verify: this.verifyCallButton.bind(this, 'video')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.LiveStream',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'broadcast')\n }, {\n icon: 'videochat',\n text: 'PeerInfo.Action.VoiceChat',\n onClick: this.onJoinGroupCallClick,\n verify: this.verifyVideoChatButton.bind(this, 'group')\n }, {\n icon: 'select',\n text: 'Chat.Menu.SelectMessages',\n onClick: () => {\n const selection = this.chat.selection;\n selection.toggleSelection(true, true);\n apiManagerProxy.getState().then((state) => {\n if(state.chatContextMenuHintWasShown) {\n return;\n }\n\n const original = selection.toggleByElement.bind(selection);\n selection.toggleByElement = async(bubble) => {\n this.managers.appStateManager.pushToState('chatContextMenuHintWasShown', true);\n toast(i18n('Chat.Menu.Hint'));\n\n selection.toggleByElement = original;\n selection.toggleByElement(bubble);\n };\n });\n },\n verify: () => !this.chat.selection.isSelecting && !!this.chat.bubbles.getRenderedLength()\n }, {\n icon: 'select',\n text: 'Chat.Menu.ClearSelection',\n onClick: () => {\n this.chat.selection.cancelSelection();\n },\n verify: () => this.chat.selection.isSelecting\n }, {\n icon: 'adduser',\n text: 'AddContact',\n onClick: () => {\n if(!this.appSidebarRight.isTabExists(AppEditContactTab)) {\n const tab = this.appSidebarRight.createTab(AppEditContactTab);\n tab.peerId = this.peerId;\n tab.open();\n\n this.appSidebarRight.toggleSidebar(true);\n }\n },\n verify: async() => this.peerId.isUser() && !(await this.managers.appPeersManager.isContact(this.peerId))\n }, {\n icon: 'forward',\n text: 'ShareContact',\n onClick: () => {\n const contactPeerId = this.peerId;\n new PopupPickUser({\n peerTypes: ['dialogs', 'contacts'],\n onSelect: (peerId) => {\n return new Promise((resolve, reject) => {\n new PopupPeer('', {\n titleLangKey: 'SendMessageTitle',\n descriptionLangKey: 'SendContactToGroupText',\n descriptionLangArgs: [new PeerTitle({peerId, dialog: true}).element],\n buttons: [{\n langKey: 'Send',\n callback: () => {\n resolve();\n\n this.managers.appMessagesManager.sendContact(peerId, contactPeerId);\n this.chat.appImManager.setInnerPeer({peerId});\n }\n }, {\n langKey: 'Cancel',\n callback: () => {\n reject();\n },\n isCancel: true\n }],\n peerId,\n overlayClosable: true\n }).show();\n });\n },\n placeholder: 'ShareModal.Search.Placeholder',\n chatRightsAction: 'send_messages',\n selfPresence: 'ChatYourSelf'\n });\n },\n verify: async() => rootScope.myId !== this.peerId && this.peerId.isUser() && (await this.managers.appPeersManager.isContact(this.peerId)) && !!(await this.managers.appUsersManager.getUser(this.peerId.toUserId())).phone\n }, {\n icon: 'bots',\n text: 'Settings',\n onClick: () => {\n this.managers.appMessagesManager.sendText(this.peerId, '/settings');\n },\n verify: async() => {\n try {\n const attachMenuBot = await this.managers.appAttachMenuBotsManager.getAttachMenuBot(this.peerId.toUserId());\n return !!attachMenuBot?.pFlags?.has_settings;\n } catch(err) {\n return false;\n }\n }\n }, {\n icon: 'lock',\n text: 'BlockUser',\n onClick: () => {\n new PopupPeer('', {\n peerId: this.peerId,\n titleLangKey: 'BlockUser',\n descriptionLangKey: 'AreYouSureBlockContact2',\n descriptionLangArgs: [new PeerTitle({peerId: this.peerId}).element],\n buttons: [{\n langKey: 'BlockUser',\n isDanger: true,\n callback: () => {\n this.managers.appUsersManager.toggleBlock(this.peerId, true).then((value) => {\n if(value) {\n toastNew({langPackKey: 'UserBlocked'});\n }\n });\n }\n }]\n }).show();\n },\n verify: async() => {\n if(!this.peerId.isUser()) return false;\n const userFull = await this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return this.peerId !== rootScope.myId && userFull && !userFull.pFlags?.blocked;\n }\n }, {\n icon: 'lockoff',\n text: 'Unblock',\n onClick: () => {\n this.managers.appUsersManager.toggleBlock(this.peerId, false).then((value) => {\n if(value) {\n toastNew({langPackKey: 'UserUnblocked'});\n }\n });\n },\n verify: async() => {\n const userFull = await this.managers.appProfileManager.getCachedFullUser(this.peerId.toUserId());\n return !!userFull?.pFlags?.blocked;\n }\n }, {\n icon: 'delete danger',\n text: 'Delete',\n onClick: () => {\n new PopupDeleteDialog(this.peerId/* , 'leave' */);\n },\n verify: async() => this.chat.type === 'chat' && !!(await this.managers.appMessagesManager.getDialogOnly(this.peerId))\n }];\n\n this.btnSearch = ButtonIcon('search');\n this.attachClickEvent(this.btnSearch, (e) => {\n this.chat.initSearch();\n }, true);\n }\n\n public attachClickEvent(el: HTMLElement, cb: (e: MouseEvent) => void, noBlur?: boolean) {\n attachClickEvent(el, (e) => {\n cancelEvent(e);\n !noBlur && blurActiveElement();\n cb(e);\n }, {listenerSetter: this.listenerSetter});\n }\n\n private onCallClick(type: CallType) {\n this.chat.appImManager.callUser(this.peerId.toUserId(), type);\n }\n\n private onJoinGroupCallClick = () => {\n this.chat.appImManager.joinGroupCall(this.peerId);\n };\n\n private constructAvatar() {\n const avatarElement = new AvatarElement();\n avatarElement.isDialog = true;\n avatarElement.classList.add('avatar-42', 'person-avatar');\n return avatarElement;\n }\n\n private get peerId() {\n return this.chat.peerId;\n }\n\n public constructPeerHelpers() {\n this.avatarElement = this.constructAvatar();\n\n this.subtitle = document.createElement('div');\n this.subtitle.classList.add('info');\n\n this.pinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\n\n this.btnJoin = Button('btn-primary btn-color-primary chat-join hide');\n this.btnCall = ButtonIcon('phone');\n this.btnGroupCall = ButtonIcon('videochat');\n this.btnPinned = ButtonIcon('pinlist');\n this.btnMute = ButtonIcon('mute');\n\n this.attachClickEvent(this.btnCall, this.onCallClick.bind(this, 'voice'));\n this.attachClickEvent(this.btnGroupCall, this.onJoinGroupCallClick);\n\n this.attachClickEvent(this.btnPinned, () => {\n this.openPinned(true);\n });\n\n this.attachClickEvent(this.btnMute, this.onMuteClick);\n\n this.attachClickEvent(this.btnJoin, async() => {\n const middleware = this.chat.bubbles.getMiddleware();\n this.btnJoin.setAttribute('disabled', 'true');\n\n const chatId = this.peerId.toChatId();\n let promise: Promise;\n if(await this.managers.appChatsManager.isChannel(chatId)) {\n promise = this.managers.appChatsManager.joinChannel(chatId);\n } else {\n promise = this.managers.appChatsManager.addChatUser(chatId, rootScope.myId);\n }\n\n promise.finally(() => {\n if(!middleware()) {\n return;\n }\n\n this.btnJoin.removeAttribute('disabled');\n });\n });\n\n this.listenerSetter.add(rootScope)('chat_update', async(chatId) => {\n if(this.peerId === chatId.toPeerId(true)) {\n const chat = await this.managers.appChatsManager.getChat(chatId) as Channel/* | Chat */;\n\n this.btnJoin.classList.toggle('hide', !(chat as Channel)?.pFlags?.left);\n this.setUtilsWidth();\n this.verifyButtons();\n }\n });\n\n this.listenerSetter.add(rootScope)('dialog_notify_settings', (dialog) => {\n if(dialog.peerId === this.peerId) {\n this.setMutedState();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_typings', ({peerId}) => {\n if(this.peerId === peerId) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('user_update', (userId) => {\n if(this.peerId === userId.toPeerId()) {\n this.setPeerStatus();\n }\n });\n\n this.listenerSetter.add(rootScope)('peer_full_update', (peerId) => {\n if(this.peerId === peerId) {\n this.verifyButtons();\n }\n });\n\n this.chat.addEventListener('setPeer', (mid, isTopMessage) => {\n const middleware = this.chat.bubbles.getMiddleware();\n apiManagerProxy.getState().then((state) => {\n if(!middleware() || !this.pinnedMessage) return;\n\n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[this.chat.peerId];\n\n if(isTopMessage) {\n this.pinnedMessage.unsetScrollDownListener();\n this.pinnedMessage.testMid(mid, 0); // * because slider will not let get bubble by document.elementFromPoint\n } else if(!this.pinnedMessage.locked) {\n this.pinnedMessage.handleFollowingPinnedMessage();\n this.pinnedMessage.testMid(mid);\n }\n });\n });\n\n this.listenerSetter.add(rootScope)('peer_pinned_messages', ({peerId, mids}) => {\n if(this.chat.type !== 'pinned' || peerId !== this.peerId) {\n return;\n }\n\n if(mids) {\n this.setTitle();\n }\n });\n\n this.setPeerStatusInterval = window.setInterval(this.setPeerStatus, 60e3);\n\n return this;\n }\n\n public openPinned(byCurrent: boolean) {\n this.chat.appImManager.setInnerPeer({\n peerId: this.peerId,\n lastMsgId: byCurrent ? +this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.dataset.mid : 0,\n type: 'pinned'\n });\n }\n\n private onMuteClick = () => {\n new PopupMute(this.peerId);\n };\n\n private onResize = () => {\n this.setUtilsWidth(true);\n this.setFloating();\n };\n\n private onChangeScreen = (from: ScreenSize, to: ScreenSize) => {\n this.container.classList.toggle('is-pinned-floating', mediaSizes.isMobile);\n // this.chatAudio && this.chatAudio.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.pinnedMessage && this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.classList.toggle('is-floating', to === ScreenSize.mobile);\n this.onResize();\n };\n\n public destroy() {\n // this.chat.log.error('Topbar destroying');\n this.listenerSetter.removeAll();\n window.clearInterval(this.setPeerStatusInterval);\n\n this.pinnedMessage?.destroy(); // * возможно это можно не делать\n this.chatAudio?.destroy();\n\n delete this.chatAudio;\n delete this.pinnedMessage;\n }\n\n public cleanup() {\n if(!this.chat.peerId) {\n this.container.classList.add('hide');\n }\n }\n\n public async finishPeerChange(isTarget: boolean) {\n const {peerId, threadId} = this.chat;\n\n let newAvatar: AvatarElement;\n if(this.chat.type === 'chat') {\n if(this.avatarElement?.peerId !== this.peerId || this.avatarElement.threadId !== this.chat.threadId) {\n newAvatar = this.constructAvatar();\n } else {\n newAvatar = this.avatarElement;\n }\n }\n\n const [isBroadcast, isAnyChat, chat, _, setTitleCallback, setStatusCallback, state] = await Promise.all([\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.isAnyChat(peerId),\n peerId.isAnyChat() ? this.managers.appChatsManager.getChat(peerId.toChatId()) : undefined,\n newAvatar ? newAvatar.updateWithOptions({peerId, threadId, wrapOptions: {customEmojiSize: makeMediaSize(32, 32)}}) : undefined,\n this.setTitleManual(),\n this.setPeerStatusManual(true),\n apiManagerProxy.getState()\n ]);\n\n return () => {\n const canHaveSomeButtons = !(this.chat.type === 'pinned' || this.chat.type === 'scheduled');\n this.btnMute && this.btnMute.classList.toggle('hide', !isBroadcast || !canHaveSomeButtons);\n if(this.btnJoin) {\n if(isAnyChat && !this.chat.isRestricted && canHaveSomeButtons) {\n replaceContent(this.btnJoin, i18n(isBroadcast ? 'Chat.Subscribe' : 'ChannelJoin'));\n this.btnJoin.classList.toggle('hide', !(chat as MTChat.chat)?.pFlags?.left);\n } else {\n this.btnJoin.classList.add('hide');\n }\n }\n\n if(this.btnSearch) {\n this.btnSearch.classList.toggle('hide', !canHaveSomeButtons);\n }\n\n if(this.btnPinned) {\n this.btnPinned.classList.toggle('hide', !canHaveSomeButtons);\n }\n\n if(this.avatarElement !== newAvatar) {\n if(newAvatar) {\n if(this.avatarElement) {\n this.avatarElement.replaceWith(newAvatar);\n } else {\n this.person.prepend(newAvatar);\n }\n }\n\n this.avatarElement?.remove();\n this.avatarElement = newAvatar;\n }\n\n this.setUtilsWidth();\n\n this.verifyButtons();\n\n if(this.btnMore) {\n this.btnMore.classList.toggle('hide', !canHaveSomeButtons);\n }\n\n const isPinnedMessagesNeeded = this.chat.isPinnedMessagesNeeded();\n if(isPinnedMessagesNeeded || this.chat.type === 'discussion') {\n if(this.chat.wasAlreadyUsed || !this.pinnedMessage) { // * change\n const newPinnedMessage = new ChatPinnedMessage(this, this.chat, this.managers);\n if(this.pinnedMessage) {\n this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(newPinnedMessage.pinnedMessageContainer.divAndCaption.container);\n this.pinnedMessage.destroy();\n // this.pinnedMessage.pinnedMessageContainer.toggle(true);\n } else {\n this.chatUtils.prepend(this.pinnedMessage.pinnedMessageContainer.divAndCaption.container);\n }\n\n this.pinnedMessage = newPinnedMessage;\n }\n\n if(isPinnedMessagesNeeded) {\n this.pinnedMessage.hidden = !!state.hiddenPinnedMessages[peerId];\n } else if(this.chat.type === 'discussion') {\n this.pinnedMessage.pinnedMid = this.chat.threadId;\n this.pinnedMessage.count = 1;\n this.pinnedMessage.pinnedIndex = 0;\n this.pinnedMessage._setPinnedMessage();\n }\n } else if(this.pinnedMessage) {\n this.pinnedMessage.destroy();\n this.pinnedMessage = undefined;\n }\n\n setTitleCallback();\n setStatusCallback?.();\n this.subtitle.classList.toggle('hide', !setStatusCallback);\n this.setMutedState();\n\n this.container.classList.remove('hide');\n };\n }\n\n public async setTitleManual(count?: number) {\n const {peerId, threadId} = this.chat;\n const middleware = () => this.chat.bubbles.getMiddleware();\n let titleEl: HTMLElement, icons: Element[];\n if(this.chat.type === 'pinned') {\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('PinnedMessagesCount', [count]);\n\n if(count === undefined) {\n this.managers.appMessagesManager.getSearchCounters(peerId, [{_: 'inputMessagesFilterPinned'}], false).then((result) => {\n if(!middleware()) return;\n const count = result[0].count;\n this.setTitle(count);\n\n // ! костыль х2, это нужно делать в другом месте\n if(!count) {\n this.chat.appImManager.setPeer(); // * close tab\n\n // ! костыль, это скроет закреплённые сообщения сразу, вместо того, чтобы ждать пока анимация перехода закончится\n const originalChat = this.chat.appImManager.chat;\n if(originalChat.topbar.pinnedMessage) {\n originalChat.topbar.pinnedMessage.pinnedMessageContainer.toggle(true);\n }\n }\n });\n }\n } else if(this.chat.type === 'scheduled') {\n titleEl = i18n(peerId === rootScope.myId ? 'Reminders' : 'ScheduledMessages');\n } else if(this.chat.type === 'discussion') {\n if(count === undefined) {\n const result = await this.managers.acknowledged.appMessagesManager.getHistory(peerId, 0, 1, 0, threadId);\n if(!middleware()) return;\n if(result.cached) {\n const historyResult = await result.result;\n if(!middleware()) return;\n count = historyResult.count;\n } else result.result.then((historyResult) => {\n if(!middleware()) return;\n this.setTitle(historyResult.count);\n });\n }\n\n if(count === undefined) titleEl = i18n('Loading');\n else titleEl = i18n('Chat.Title.Comments', [count]);\n } else if(this.chat.type === 'chat') {\n [titleEl/* , icons */] = await Promise.all([\n wrapPeerTitle({\n peerId,\n dialog: true,\n withIcons: !threadId,\n threadId: threadId\n })\n // generateTitleIcons(peerId)\n ]);\n\n if(!middleware()) {\n return;\n }\n }\n\n return () => {\n replaceContent(this.title, titleEl);\n // if(icons) {\n // this.title.append(...icons);\n // }\n };\n }\n\n public setTitle(count?: number) {\n this.setTitleManual(count).then((setTitleCallback) => setTitleCallback());\n }\n\n public async setMutedState() {\n if(!this.btnMute) return;\n\n const peerId = this.peerId;\n const muted = await this.managers.appNotificationsManager.isPeerLocalMuted({peerId, respectType: false, threadId: this.chat.threadId});\n if(await this.managers.appPeersManager.isBroadcast(peerId)) { // not human\n this.btnMute.classList.remove('tgico-mute', 'tgico-unmute');\n this.btnMute.classList.add(muted ? 'tgico-unmute' : 'tgico-mute');\n this.btnMute.style.display = '';\n } else {\n this.btnMute.style.display = 'none';\n }\n }\n\n // ! У МЕНЯ ПРОСТО СГОРЕЛО, САФАРИ КОНЧЕННЫЙ БРАУЗЕР - ЕСЛИ НЕ СКРЫВАТЬ БЛОК, ТО ПРИ ПЕРЕВОРОТЕ ЭКРАНА НА АЙФОНЕ БЛОК БУДЕТ НЕПРАВИЛЬНО ШИРИНЫ, ДАЖЕ БЕЗ ЭТОЙ ФУНКЦИИ!\n public setUtilsWidth = (resize = false) => {\n // return;\n if(this.setUtilsRAF) window.cancelAnimationFrame(this.setUtilsRAF);\n\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.add('hide');\n }\n\n // mutationObserver.disconnect();\n this.setUtilsRAF = window.requestAnimationFrame(() => {\n // mutationRAF = window.requestAnimationFrame(() => {\n\n // setTimeout(() => {\n if(IS_SAFARI && resize) {\n this.chatUtils.classList.remove('hide');\n }\n /* this.chatInfo.style.removeProperty('--utils-width');\n void this.chatInfo.offsetLeft; // reflow */\n const width = /* chatUtils.scrollWidth */this.chatUtils.getBoundingClientRect().width;\n this.chat.log('utils width:', width);\n this.container.style.setProperty('--utils-width', width + 'px');\n // this.chatInfo.classList.toggle('have-utils-width', !!width);\n // }, 0);\n\n this.setUtilsRAF = 0;\n\n // mutationObserver.observe(chatUtils, observeOptions);\n // });\n });\n };\n\n public setFloating = () => {\n const containers = [this.chatAudio, this.pinnedMessage?.pinnedMessageContainer].filter(Boolean);\n const count = containers.reduce((acc, container) => {\n const isFloating = container.isFloating();\n this.container.classList.toggle(`is-pinned-${container.className}-floating`, isFloating);\n\n if(!container.isVisible()) {\n return acc;\n }\n\n return acc + +isFloating;\n }, 0);\n this.container.dataset.floating = '' + count;\n };\n\n public setPeerStatusManual = async(needClear = false) => {\n if(!this.subtitle || this.chat.type !== 'chat') return;\n\n if(this.chat.threadId) {\n const title = await wrapPeerTitle({peerId: this.peerId, dialog: true});\n const span = i18n('TopicProfileStatus', [title]);\n return () => replaceContent(this.subtitle, span);\n }\n\n const peerId = this.peerId;\n return this.chat.appImManager.setPeerStatus({\n peerId,\n element: this.subtitle,\n needClear,\n useWhitespace: false,\n middleware: () => peerId === this.peerId\n });\n };\n\n public setPeerStatus = (needClear?: boolean) => {\n return this.setPeerStatusManual(needClear).then((callback) => {\n callback?.();\n });\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport appSidebarRight from '..';\nimport {attachClickEvent} from '../../../helpers/dom/clickEvent';\nimport AppSearch, {SearchGroup} from '../../appSearch';\nimport ButtonIcon from '../../buttonIcon';\nimport InputSearch from '../../inputSearch';\nimport PopupElement from '../../popups';\nimport PopupDatePicker from '../../popups/datePicker';\nimport {SliderSuperTab} from '../../slider';\n\nexport default class AppPrivateSearchTab extends SliderSuperTab {\n private inputSearch: InputSearch;\n private appSearch: AppSearch;\n private btnPickDate: HTMLElement;\n\n private peerId: PeerId;\n private threadId = 0;\n private query = '';\n private onDatePick: (timestamp: number) => void;\n\n onOpenAfterTimeout() {\n this.appSearch.beginSearch(this.peerId, this.threadId, this.query);\n }\n\n public init(\n peerId: PeerId,\n threadId?: number,\n onDatePick?: AppPrivateSearchTab['onDatePick'],\n query?: string\n ) {\n this.container.id = 'search-private-container';\n this.container.classList.add('chatlist-container');\n this.inputSearch = new InputSearch('Search');\n this.title.replaceWith(this.inputSearch.container);\n\n this.btnPickDate = ButtonIcon('calendar sidebar-header-right');\n this.header.append(this.btnPickDate);\n\n const c = document.createElement('div');\n c.classList.add('chatlist-container');\n this.scrollable.container.replaceWith(c);\n this.appSearch = new AppSearch(c, this.inputSearch, {\n messages: new SearchGroup('Chat.Search.PrivateSearch', 'messages')\n });\n\n if(!this.peerId) {\n this.query = query;\n this.peerId = peerId;\n this.threadId = threadId;\n this.onDatePick = onDatePick;\n\n this.btnPickDate.classList.toggle('hide', !this.onDatePick);\n if(this.onDatePick) {\n attachClickEvent(this.btnPickDate, () => {\n PopupElement.createPopup(PopupDatePicker, new Date(), this.onDatePick).show();\n });\n }\n\n query && this.appSearch.searchInput.inputField.setValueSilently(query);\n\n appSidebarRight.toggleSidebar(true);\n } else {\n this.appSearch.beginSearch(this.peerId, this.threadId, query);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type ChatTopbar from './topbar';\nimport AppSearch, {SearchGroup} from '../appSearch';\nimport PopupDatePicker from '../popups/datePicker';\nimport ripple from '../ripple';\nimport InputSearch from '../inputSearch';\nimport type Chat from './chat';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport whichChild from '../../helpers/dom/whichChild';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {i18n} from '../../lib/langPack';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport appNavigationController, {NavigationItem} from '../appNavigationController';\nimport {IS_MOBILE_SAFARI} from '../../environment/userAgent';\nimport PopupElement from '../popups';\nimport {DIALOG_LIST_ELEMENT_TAG} from '../../lib/appManagers/appDialogsManager';\n\nexport default class ChatSearch {\n private element: HTMLElement;\n private backBtn: HTMLElement;\n private inputSearch: InputSearch;\n\n private results: HTMLElement;\n\n private footer: HTMLElement;\n private dateBtn: HTMLElement;\n private foundCountEl: HTMLElement;\n private controls: HTMLElement;\n private downBtn: HTMLElement;\n private upBtn: HTMLElement;\n\n private appSearch: AppSearch;\n private searchGroup: SearchGroup;\n\n private foundCount = 0;\n private selectedIndex = 0;\n private setPeerPromise: Promise;\n private listenerSetter: ListenerSetter;\n private navigationItem: NavigationItem;\n\n constructor(private topbar: ChatTopbar, private chat: Chat, query?: string) {\n this.element = document.createElement('div');\n this.element.classList.add('sidebar-header', 'chat-search', 'chatlist-container');\n\n this.backBtn = document.createElement('button');\n this.backBtn.classList.add('btn-icon', 'tgico-left', 'sidebar-close-button');\n ripple(this.backBtn);\n\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n const attachClick = (element: HTMLElement, callback: (e: MouseEvent) => void) => {\n attachClickEvent(element, callback, {listenerSetter});\n };\n\n attachClick(this.backBtn, () => {\n this.destroy();\n });\n\n this.inputSearch = new InputSearch('Search');\n\n // Results\n this.results = document.createElement('div');\n this.results.classList.add('chat-search-results', 'chatlist-container');\n\n this.searchGroup = new SearchGroup(false, 'messages', undefined, '', false);\n attachClick(this.searchGroup.list, this.onResultsClick);\n\n this.appSearch = new AppSearch(this.results, this.inputSearch, {\n messages: this.searchGroup\n }, (count) => {\n this.foundCount = count;\n\n if(!this.foundCount) {\n replaceContent(this.foundCountEl, this.inputSearch.value ? i18n('NoResult') : '');\n this.results.classList.remove('active');\n this.chat.bubbles.container.classList.remove('search-results-active');\n this.upBtn.setAttribute('disabled', 'true');\n this.downBtn.setAttribute('disabled', 'true');\n } else {\n this.selectResult(this.searchGroup.list.children[0] as HTMLElement);\n }\n });\n this.appSearch.beginSearch(this.chat.peerId, this.chat.threadId);\n\n // appImManager.topbar.parentElement.insertBefore(this.results, appImManager.bubblesContainer);\n this.chat.bubbles.container.append(this.results);\n\n // Footer\n this.footer = document.createElement('div');\n this.footer.classList.add('chat-search-footer');\n\n attachClick(this.footer, this.onFooterClick);\n ripple(this.footer);\n\n this.foundCountEl = document.createElement('span');\n this.foundCountEl.classList.add('chat-search-count');\n\n this.dateBtn = document.createElement('button');\n this.dateBtn.classList.add('btn-icon', 'tgico-calendar');\n\n this.controls = document.createElement('div');\n this.controls.classList.add('chat-search-controls');\n\n this.upBtn = document.createElement('button');\n this.upBtn.classList.add('btn-icon', 'tgico-up');\n this.downBtn = document.createElement('button');\n this.downBtn.classList.add('btn-icon', 'tgico-down');\n\n this.upBtn.setAttribute('disabled', 'true');\n this.downBtn.setAttribute('disabled', 'true');\n\n attachClick(this.dateBtn, this.onDateClick);\n attachClick(this.upBtn, this.onUpClick);\n attachClick(this.downBtn, this.onDownClick);\n this.controls.append(this.upBtn, this.downBtn);\n\n this.footer.append(this.foundCountEl, this.dateBtn, this.controls);\n\n this.topbar.container.parentElement.insertBefore(this.footer, chat.input.chatInput);\n\n // Append container\n this.element.append(this.backBtn, this.inputSearch.container);\n\n this.topbar.container.classList.add('hide-pinned');\n this.topbar.container.parentElement.append(this.element);\n\n this.inputSearch.input.focus();\n\n if(query) {\n this.setQuery(query);\n }\n\n if(!IS_MOBILE_SAFARI) {\n this.navigationItem = {\n type: 'mobile-search',\n onPop: () => {\n this.destroy();\n }\n };\n\n appNavigationController.pushItem(this.navigationItem);\n }\n }\n\n public destroy() {\n this.topbar.container.classList.remove('hide-pinned');\n this.element.remove();\n this.inputSearch.remove();\n this.results.remove();\n this.footer.remove();\n this.listenerSetter.removeAll();\n this.chat.bubbles.container.classList.remove('search-results-active');\n this.chat.search = undefined;\n appNavigationController.removeItem(this.navigationItem);\n }\n\n public setQuery(query: string) {\n this.inputSearch.inputField.value = query;\n }\n\n private onDateClick = (e: MouseEvent) => {\n cancelEvent(e);\n PopupElement.createPopup(PopupDatePicker, new Date(), this.chat.bubbles.onDatePick).show();\n };\n\n private selectResult(elem: HTMLElement) {\n if(this.setPeerPromise) return this.setPeerPromise;\n\n const peerId = elem.dataset.peerId.toPeerId();\n const lastMsgId = +elem.dataset.mid || undefined;\n\n const index = whichChild(elem);\n\n if(index === (this.foundCount - 1)) {\n this.upBtn.setAttribute('disabled', 'true');\n } else {\n this.upBtn.removeAttribute('disabled');\n }\n\n if(!index) {\n this.downBtn.setAttribute('disabled', 'true');\n } else {\n this.downBtn.removeAttribute('disabled');\n }\n\n this.results.classList.remove('active');\n this.chat.bubbles.container.classList.remove('search-results-active');\n\n const res = this.chat.setPeer({peerId, lastMsgId});\n this.setPeerPromise = ((res instanceof Promise ? res : Promise.resolve(res)) as Promise).then(() => {\n this.selectedIndex = index;\n replaceContent(this.foundCountEl, i18n('Of', [index + 1, this.foundCount]));\n\n const renderedCount = this.searchGroup.list.childElementCount;\n if(this.selectedIndex >= (renderedCount - 6)) {\n this.appSearch.searchMore();\n }\n }).finally(() => {\n this.setPeerPromise = null;\n });\n }\n\n private onResultsClick = (e: MouseEvent) => {\n const target = findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG);\n if(target) {\n this.selectResult(target);\n }\n };\n\n private onFooterClick = (e: MouseEvent) => {\n if(this.foundCount) {\n this.chat.bubbles.container.classList.toggle('search-results-active');\n this.results.classList.toggle('active');\n }\n };\n\n private onUpClick = (e: MouseEvent) => {\n cancelEvent(e);\n this.selectResult(this.searchGroup.list.children[this.selectedIndex + 1] as HTMLElement);\n };\n\n private onDownClick = (e: MouseEvent) => {\n cancelEvent(e);\n this.selectResult(this.searchGroup.list.children[this.selectedIndex - 1] as HTMLElement);\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport {renderImageFromUrlPromise} from '../../helpers/dom/renderImageFromUrl';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport windowSize from '../../helpers/windowSize';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\n\ntype ChatBackgroundPatternRendererInitOptions = {\n url: string,\n width: number,\n height: number,\n mask?: boolean\n};\n\nexport default class ChatBackgroundPatternRenderer {\n private static INSTANCES: ChatBackgroundPatternRenderer[] = [];\n\n // private pattern: CanvasPattern;\n private objectUrl: string;\n private options: ChatBackgroundPatternRendererInitOptions;\n private canvases: Set;\n // private createCanvasPatternPromise: Promise;\n // private exportCanvasPatternToImagePromise: Promise;\n private renderImageFromUrlPromise: Promise;\n private image: HTMLImageElement;\n private imageBitmap: ImageBitmap;\n\n constructor() {\n this.canvases = new Set();\n }\n\n public static getInstance(options: ChatBackgroundPatternRendererInitOptions) {\n let instance = this.INSTANCES.find((instance) => {\n return deepEqual(instance.options, options);\n });\n\n if(!instance) {\n instance = new ChatBackgroundPatternRenderer();\n instance.init(options);\n this.INSTANCES.push(instance);\n }\n\n return instance;\n }\n\n public init(options: ChatBackgroundPatternRendererInitOptions) {\n // if(this.options) {\n // if(this.options.width !== options.width || this.options.height !== options.height) {\n // this.createCanvasPatternPromise =\n // this.pattern =\n // this.exportCanvasPatternToImagePromise =\n // undefined;\n // }\n // }\n\n this.options = options;\n }\n\n public renderToCanvas(canvas: HTMLCanvasElement) {\n // return this.createCanvasPattern(canvas).then(() => {\n // return this.fillCanvas(canvas);\n // });\n\n return this.renderImageFromUrl(this.options.url).then(() => {\n return this.fillCanvas(canvas);\n });\n }\n\n private renderImageFromUrl(url: string) {\n if(this.renderImageFromUrlPromise) return this.renderImageFromUrlPromise;\n const img = this.image = document.createElement('img');\n img.crossOrigin = 'anonymous';\n return this.renderImageFromUrlPromise = renderImageFromUrlPromise(img, url, false).then(() => {\n if(!IS_IMAGE_BITMAP_SUPPORTED) {\n return img;\n }\n\n return createImageBitmap(img, {\n resizeWidth: 1440,\n resizeHeight: 2960\n }).then((imageBitmap) => {\n this.imageBitmap = imageBitmap;\n return img;\n });\n });\n }\n\n /* private createCanvasPattern(canvas: HTMLCanvasElement) {\n if(this.createCanvasPatternPromise) return this.createCanvasPatternPromise;\n return this.createCanvasPatternPromise = this.renderImageFromUrl(this.options.url).then((img) => {\n let createPatternFrom: HTMLImageElement | HTMLCanvasElement;\n if(IS_SAFARI) {\n const canvas = createPatternFrom = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n } else {\n createPatternFrom = img;\n }\n\n const perf = performance.now();\n this.pattern = canvas.getContext('2d').createPattern(createPatternFrom, 'repeat-x');\n console.warn('creating pattern time:', performance.now() - perf);\n\n return this.pattern;\n });\n }\n\n public exportCanvasPatternToImage(canvas: HTMLCanvasElement) {\n if(this.exportCanvasPatternToImagePromise) return this.exportCanvasPatternToImagePromise;\n return this.exportCanvasPatternToImagePromise = new Promise((resolve) => {\n canvas.toBlob((blob) => {\n const newUrl = this.objectUrl = URL.createObjectURL(blob);\n resolve(newUrl);\n }, 'image/png');\n });\n } */\n\n public cleanup(canvas: HTMLCanvasElement) {\n this.canvases.delete(canvas);\n\n if(!this.canvases.size) {\n indexOfAndSplice(ChatBackgroundPatternRenderer.INSTANCES, this);\n\n if(this.objectUrl) {\n this.imageBitmap?.close();\n URL.revokeObjectURL(this.objectUrl);\n }\n }\n }\n\n public fillCanvas(canvas: HTMLCanvasElement) {\n const context = canvas.getContext('2d');\n const {width, height} = canvas;\n // const perf = performance.now();\n // if(context.fillStyle instanceof CanvasPattern) {\n // context.clearRect(0, 0, width, height);\n // }\n\n const source = this.imageBitmap || this.image;\n\n let imageWidth = source.width, imageHeight = source.height;\n // let patternHeight = 1480 * canvas.dpr;\n // if(+canvas.dataset.originalHeight !== height) patternHeight *= .6875;\n const patternHeight = (500 + (windowSize.height / 2.5)) * canvas.dpr;\n const ratio = patternHeight / imageHeight;\n imageWidth *= ratio;\n imageHeight = patternHeight;\n\n if(this.options.mask) {\n context.fillStyle = '#000';\n context.fillRect(0, 0, width, height);\n context.globalCompositeOperation = 'destination-out';\n } else {\n context.globalCompositeOperation = 'source-over';\n }\n\n const d = (y: number) => {\n for(let x = 0; x < width; x += imageWidth) {\n context.drawImage(source, x, y, imageWidth, imageHeight);\n }\n };\n\n const centerY = (height - imageHeight) / 2;\n d(centerY);\n\n if(centerY > 0) {\n let topY = centerY;\n do {\n d(topY -= imageHeight);\n } while(topY >= 0);\n }\n\n const endY = height - 1;\n for(let bottomY = centerY + imageHeight; bottomY < endY; bottomY += imageHeight) {\n d(bottomY);\n }\n\n // for(let x = 0; x < width; x += imageWidth) {\n // for(let y = 0; y < height; y += imageHeight) {\n // context.drawImage(img, x, y, imageWidth, imageHeight);\n // }\n // }\n // context.fillStyle = this.pattern;\n // context.fillRect(0, 0, width, height);\n // console.warn('fill canvas time', performance.now() - perf);\n }\n\n public setCanvasDimensions(canvas: HTMLCanvasElement) {\n const devicePixelRatio = Math.min(2, window.devicePixelRatio);\n const width = this.options.width * devicePixelRatio;\n let height = this.options.height * devicePixelRatio;\n\n canvas.dpr = devicePixelRatio;\n canvas.dataset.originalHeight = '' + height;\n if(mediaSizes.activeScreen === ScreenSize.large) height *= 1.5;\n canvas.width = width;\n canvas.height = height;\n }\n\n public createCanvas() {\n const canvas = document.createElement('canvas');\n this.canvases.add(canvas);\n this.setCanvasDimensions(canvas);\n return canvas;\n }\n\n public resize(width: number, height: number) {\n this.init({\n ...this.options,\n width,\n height\n });\n\n const promises: Promise[] = [];\n for(const canvas of this.canvases) {\n this.setCanvasDimensions(canvas);\n promises.push(this.renderToCanvas(canvas));\n }\n\n return Promise.all(promises);\n }\n\n public static resizeInstances(width: number, height: number) {\n return Promise.all(this.INSTANCES.map((instance) => instance.resize(width, height)));\n }\n\n /* public setResizeMode(resizing: boolean) {\n const canvases = Array.from(this.canvases);\n const canvas = canvases[canvases.length - 1];\n canvas.style.display = resizing ? 'none' : '';\n const img = this.img;\n img.style.display = resizing ? '' : 'none';\n\n return {img, canvas};\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ChatRights} from '../../lib/appManagers/appChatsManager';\nimport {AppImManager, APP_TABS, ChatSetPeerOptions} from '../../lib/appManagers/appImManager';\nimport type {MessageSendingParams, MessagesStorageKey} from '../../lib/appManagers/appMessagesManager';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {logger, LogTypes} from '../../lib/logger';\nimport rootScope from '../../lib/rootScope';\nimport appSidebarRight from '../sidebarRight';\nimport ChatBubbles from './bubbles';\nimport ChatContextMenu from './contextMenu';\nimport ChatInput from './input';\nimport ChatSelection from './selection';\nimport ChatTopbar from './topbar';\nimport {NULL_PEER_ID, REPLIES_PEER_ID} from '../../lib/mtproto/mtproto_config';\nimport SetTransition from '../singleTransition';\nimport AppPrivateSearchTab from '../sidebarRight/tabs/search';\nimport renderImageFromUrl from '../../helpers/dom/renderImageFromUrl';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport ChatSearch from './search';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport getAutoDownloadSettingsByPeerId, {ChatAutoDownloadSettings} from '../../helpers/autoDownload';\nimport ChatBackgroundGradientRenderer from './gradientRenderer';\nimport ChatBackgroundPatternRenderer from './patternRenderer';\nimport pause from '../../helpers/schedulers/pause';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport SlicedArray from '../../helpers/slicedArray';\nimport themeController from '../../helpers/themeController';\nimport AppSharedMediaTab from '../sidebarRight/tabs/sharedMedia';\nimport noop from '../../helpers/noop';\nimport middlewarePromise from '../../helpers/middlewarePromise';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {Message} from '../../layer';\nimport animationIntersector, {AnimationItemGroup} from '../animationIntersector';\n\nexport type ChatType = 'chat' | 'pinned' | 'discussion' | 'scheduled';\n\nexport default class Chat extends EventListenerBase<{\n setPeer: (mid: number, isTopMessage: boolean) => void\n}> {\n public container: HTMLElement;\n public backgroundEl: HTMLElement;\n\n public topbar: ChatTopbar;\n public bubbles: ChatBubbles;\n public input: ChatInput;\n public selection: ChatSelection;\n public contextMenu: ChatContextMenu;\n public search: ChatSearch;\n\n public wasAlreadyUsed: boolean;\n // public initPeerId = 0;\n public peerId: PeerId;\n public threadId: number;\n public setPeerPromise: Promise;\n public peerChanged: boolean;\n\n public log: ReturnType;\n\n public type: ChatType;\n public messagesStorageKey: MessagesStorageKey;\n\n public noForwards: boolean;\n\n public inited: boolean;\n\n public isRestricted: boolean;\n public autoDownload: ChatAutoDownloadSettings;\n\n public gradientRenderer: ChatBackgroundGradientRenderer;\n public patternRenderer: ChatBackgroundPatternRenderer;\n public gradientCanvas: HTMLCanvasElement;\n public patternCanvas: HTMLCanvasElement;\n public backgroundTempId: number;\n public setBackgroundPromise: Promise;\n public sharedMediaTab: AppSharedMediaTab;\n public sharedMediaTabs: AppSharedMediaTab[];\n // public renderDarkPattern: () => Promise;\n\n public isBot: boolean;\n public isChannel: boolean;\n public isBroadcast: boolean;\n public isAnyGroup: boolean;\n public isMegagroup: boolean;\n public isForum: boolean;\n public isAllMessagesForum: boolean;\n\n public animationGroup: AnimationItemGroup;\n\n constructor(\n public appImManager: AppImManager,\n public managers: AppManagers\n ) {\n super();\n\n this.type = 'chat';\n this.animationGroup = `chat-${Math.round(Math.random() * 65535)}`;\n\n this.container = document.createElement('div');\n this.container.classList.add('chat', 'tabs-tab');\n\n this.backgroundEl = document.createElement('div');\n this.backgroundEl.classList.add('chat-background');\n\n // * constructor end\n\n this.log = logger('CHAT', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n this.log.warn('constructor');\n\n this.peerId = NULL_PEER_ID;\n\n this.container.append(this.backgroundEl);\n this.appImManager.chatsContainer.append(this.container);\n\n this.backgroundTempId = 0;\n this.sharedMediaTabs = [];\n }\n\n public setBackground(url: string, skipAnimation?: boolean): Promise {\n const theme = themeController.getTheme();\n\n let item: HTMLElement;\n const isColorBackground = !!theme.background.color && !theme.background.slug && !theme.background.intensity;\n if(\n isColorBackground &&\n document.documentElement.style.cursor === 'grabbing' &&\n this.gradientRenderer &&\n !this.patternRenderer\n ) {\n this.gradientCanvas.dataset.colors = theme.background.color;\n this.gradientRenderer.init(this.gradientCanvas);\n return Promise.resolve();\n }\n\n const tempId = ++this.backgroundTempId;\n\n const previousGradientRenderer = this.gradientRenderer;\n const previousPatternRenderer = this.patternRenderer;\n const previousGradientCanvas = this.gradientCanvas;\n const previousPatternCanvas = this.patternCanvas;\n\n this.gradientRenderer =\n this.patternRenderer =\n this.gradientCanvas =\n this.patternCanvas =\n // this.renderDarkPattern =\n undefined;\n\n const intensity = theme.background.intensity && theme.background.intensity / 100;\n const isDarkPattern = !!intensity && intensity < 0;\n\n let patternRenderer: ChatBackgroundPatternRenderer;\n let patternCanvas = item?.firstElementChild as HTMLCanvasElement;\n let gradientCanvas: HTMLCanvasElement;\n if(!item) {\n item = document.createElement('div');\n item.classList.add('chat-background-item');\n\n if(url) {\n if(intensity) {\n item.classList.add('is-pattern');\n\n const rect = this.appImManager.chatsContainer.getBoundingClientRect();\n patternRenderer = this.patternRenderer = ChatBackgroundPatternRenderer.getInstance({\n url,\n width: rect.width,\n height: rect.height,\n mask: isDarkPattern\n });\n\n patternCanvas = this.patternCanvas = patternRenderer.createCanvas();\n patternCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-pattern-canvas');\n\n if(isDarkPattern) {\n item.classList.add('is-dark');\n }\n\n // if(isDarkPattern) {\n // this.renderDarkPattern = () => {\n // return patternRenderer.exportCanvasPatternToImage(patternCanvas).then((url) => {\n // if(this.backgroundTempId !== tempId) {\n // return;\n // }\n\n // gradientCanvas.style.webkitMaskImage = `url(${url})`;\n // });\n // };\n // }\n } else if(theme.background.slug) {\n item.classList.add('is-image');\n }\n } else if(theme.background.color) {\n item.classList.add('is-color');\n }\n }\n\n let gradientRenderer: ChatBackgroundGradientRenderer;\n const color = theme.background.color;\n if(color) {\n // if(color.includes(',')) {\n const {canvas, gradientRenderer: _gradientRenderer} = ChatBackgroundGradientRenderer.create(color);\n gradientRenderer = this.gradientRenderer = _gradientRenderer;\n gradientCanvas = this.gradientCanvas = canvas;\n gradientCanvas.classList.add('chat-background-item-canvas', 'chat-background-item-color-canvas');\n\n if(rootScope.settings.animationsEnabled) {\n gradientRenderer.scrollAnimate(true);\n }\n // } else {\n // item.style.backgroundColor = color;\n // item.style.backgroundImage = 'none';\n // }\n }\n\n if(patternRenderer) {\n const setOpacityTo = isDarkPattern ? gradientCanvas : patternCanvas;\n setOpacityTo.style.setProperty('--opacity-max', '' + (Math.abs(intensity) * (isDarkPattern ? .5 : 1)));\n }\n\n const promise = new Promise((resolve) => {\n const cb = () => {\n if(this.backgroundTempId !== tempId) {\n if(patternRenderer) {\n patternRenderer.cleanup(patternCanvas);\n }\n\n if(gradientRenderer) {\n gradientRenderer.cleanup();\n }\n\n return;\n }\n\n const prev = this.backgroundEl.lastElementChild as HTMLElement;\n\n if(prev === item) {\n resolve();\n return;\n }\n\n const append = [\n gradientCanvas,\n // isDarkPattern && this.renderDarkPattern ? undefined : patternCanvas\n patternCanvas\n ].filter(Boolean);\n if(append.length) {\n item.append(...append);\n }\n\n this.backgroundEl.append(item);\n\n SetTransition({\n element: item,\n className: 'is-visible',\n forwards: true,\n duration: !skipAnimation ? 200 : 0,\n onTransitionEnd: prev ? () => {\n previousPatternRenderer?.cleanup(previousPatternCanvas);\n previousGradientRenderer?.cleanup();\n\n prev.remove();\n } : null,\n useRafs: 2\n });\n\n resolve();\n };\n\n if(patternRenderer) {\n const renderPatternPromise = patternRenderer.renderToCanvas(patternCanvas);\n renderPatternPromise.then(() => {\n if(this.backgroundTempId !== tempId) {\n return;\n }\n\n // let promise: Promise;\n // if(isDarkPattern && this.renderDarkPattern) {\n // promise = this.renderDarkPattern();\n // } else {\n // const promise = Promise.resolve();\n // }\n\n // promise.then(cb);\n cb();\n });\n } else if(url) {\n renderImageFromUrl(item, url, cb);\n } else {\n cb();\n }\n });\n\n return this.setBackgroundPromise = Promise.race([\n pause(500),\n promise\n ]);\n }\n\n public setType(type: ChatType) {\n this.type = type;\n }\n\n public init(/* peerId: PeerId */) {\n // this.initPeerId = peerId;\n\n this.topbar = new ChatTopbar(this, appSidebarRight, this.managers);\n this.bubbles = new ChatBubbles(this, this.managers);\n this.input = new ChatInput(this, this.appImManager, this.managers);\n this.contextMenu = new ChatContextMenu(this, this.managers);\n this.selection = new ChatSelection(this, this.bubbles, this.input, this.managers);\n\n this.topbar.constructUtils();\n this.topbar.constructPeerHelpers();\n\n this.topbar.construct();\n this.input.construct();\n\n this.bubbles.constructPeerHelpers();\n this.input.constructPeerHelpers();\n\n if(!IS_TOUCH_SUPPORTED) {\n this.bubbles.setReactionsHoverListeners();\n }\n\n this.bubbles.attachContainerListeners();\n\n this.container.append(this.topbar.container, this.bubbles.container, this.input.chatInput);\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_migrate', ({migrateFrom, migrateTo}) => {\n if(this.peerId === migrateFrom) {\n this.setPeer({peerId: migrateTo});\n }\n });\n\n this.bubbles.listenerSetter.add(rootScope)('dialog_drop', (dialog) => {\n if(dialog.peerId === this.peerId && (dialog._ === 'dialog' || this.threadId === dialog.id)) {\n this.appImManager.setPeer();\n }\n });\n\n const freezeObservers = (freeze: boolean) => {\n const cb = () => {\n this.bubbles.observer?.toggleObservingNew(freeze);\n animationIntersector.toggleIntersectionGroup(this.animationGroup, freeze);\n if(freeze) {\n animationIntersector.checkAnimations(freeze, this.animationGroup);\n }\n };\n\n if(!freeze) {\n setTimeout(() => {\n cb();\n }, 400);\n } else {\n cb();\n }\n };\n\n this.bubbles.listenerSetter.add(this.appImManager)('chat_changing', ({to}) => {\n freezeObservers(to !== this);\n });\n\n this.bubbles.listenerSetter.add(this.appImManager)('tab_changing', (tabId) => {\n freezeObservers(this.appImManager.chat !== this || tabId !== APP_TABS.CHAT);\n });\n }\n\n public beforeDestroy() {\n this.bubbles.cleanup();\n }\n\n private cleanupBackground() {\n ++this.backgroundTempId;\n if(this.patternRenderer) {\n this.patternRenderer.cleanup(this.patternCanvas);\n this.patternRenderer = undefined;\n }\n\n if(this.gradientRenderer) {\n this.gradientRenderer.cleanup();\n this.gradientRenderer = undefined;\n }\n }\n\n public destroy() {\n // const perf = performance.now();\n\n this.destroySharedMediaTab();\n this.topbar.destroy();\n this.bubbles.destroy();\n this.input.destroy();\n this.contextMenu && this.contextMenu.destroy();\n this.selection && this.selection.attachListeners(undefined, undefined);\n\n this.cleanupBackground();\n\n delete this.topbar;\n delete this.bubbles;\n delete this.input;\n delete this.selection;\n delete this.contextMenu;\n\n this.container.remove();\n\n // this.log.error('Chat destroy time:', performance.now() - perf);\n }\n\n public cleanup(helperToo = true) {\n this.input.cleanup(helperToo);\n this.topbar.cleanup();\n this.selection.cleanup();\n }\n\n public get isForumTopic() {\n return !!(this.isForum && this.threadId);\n }\n\n public async onChangePeer(options: ChatSetPeerOptions, m: ReturnType) {\n const {peerId, threadId} = this;\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n searchTab?.close();\n\n const [\n noForwards,\n isRestricted,\n isAnyGroup,\n _,\n isMegagroup,\n isBroadcast,\n isChannel,\n isBot,\n isForum\n ] = await m(Promise.all([\n this.managers.appPeersManager.noForwards(peerId),\n this.managers.appPeersManager.isPeerRestricted(peerId),\n this._isAnyGroup(peerId),\n this.setAutoDownloadMedia(),\n this.managers.appPeersManager.isMegagroup(peerId),\n this.managers.appPeersManager.isBroadcast(peerId),\n this.managers.appPeersManager.isChannel(peerId),\n this.managers.appPeersManager.isBot(peerId),\n this.managers.appPeersManager.isForum(peerId)\n ]));\n\n // ! WARNING: TEMPORARY, HAVE TO GET TOPIC\n if(isForum && threadId) {\n await m(this.managers.dialogsStorage.getForumTopicOrReload(peerId, threadId));\n }\n\n this.noForwards = noForwards;\n this.isRestricted = isRestricted;\n this.isAnyGroup = isAnyGroup;\n this.isMegagroup = isMegagroup;\n this.isBroadcast = isBroadcast;\n this.isChannel = isChannel;\n this.isBot = isBot;\n this.isForum = isForum;\n this.isAllMessagesForum = isForum && !threadId;\n\n if(threadId && !this.isForum) {\n options.type = 'discussion';\n }\n\n const type = options.type ?? 'chat';\n this.setType(type);\n\n this.messagesStorageKey = `${this.peerId}_${this.type === 'scheduled' ? 'scheduled' : 'history'}`;\n\n this.container.classList.toggle('no-forwards', this.noForwards);\n\n this.sharedMediaTab = appSidebarRight.createSharedMediaTab();\n this.sharedMediaTabs.push(this.sharedMediaTab);\n\n this.sharedMediaTab.setPeer(peerId, threadId);\n this.input.clearHelper(); // костыль\n this.selection.cleanup(); // TODO: REFACTOR !!!!!!\n }\n\n public setPeer(options: ChatSetPeerOptions) {\n const {peerId, threadId} = options;\n if(!peerId) {\n this.inited = undefined;\n } else if(!this.inited) {\n if(this.init) {\n this.init(/* peerId */);\n this.init = null;\n }\n\n this.inited = true;\n }\n\n // const appMediaViewer = (window as any).appMediaViewer as AppMediaViewerBase;\n // if(appMediaViewer) {\n // appMediaViewer.close();\n // }\n\n const samePeer = this.appImManager.isSamePeer(this, options);\n if(!samePeer) {\n this.appImManager.dispatchEvent('peer_changing', this);\n this.peerId = peerId || NULL_PEER_ID;\n this.threadId = threadId;\n } else if(this.setPeerPromise) {\n return;\n }\n\n if(!peerId) {\n appSidebarRight.toggleSidebar(false);\n this.cleanup(true);\n this.bubbles.setPeer({samePeer: false, peerId});\n this.peerId = 0;\n this.appImManager.dispatchEvent('peer_changed', this);\n\n appSidebarRight.replaceSharedMediaTab();\n this.destroySharedMediaTab();\n this.sharedMediaTab = undefined;\n\n return;\n }\n\n this.peerChanged = samePeer;\n\n const bubblesSetPeerPromise = this.bubbles.setPeer({...options, samePeer});\n const setPeerPromise = this.setPeerPromise = bubblesSetPeerPromise.then((result) => {\n return result.promise;\n }).catch(noop).finally(() => {\n if(this.setPeerPromise === setPeerPromise) {\n this.setPeerPromise = null;\n }\n });\n\n return bubblesSetPeerPromise;\n }\n\n public destroySharedMediaTab(tab = this.sharedMediaTab) {\n if(!tab) {\n return;\n }\n\n indexOfAndSplice(this.sharedMediaTabs, tab);\n tab.destroy();\n }\n\n public async setAutoDownloadMedia() {\n this.autoDownload = await getAutoDownloadSettingsByPeerId(this.peerId);\n }\n\n public setMessageId(messageId?: number) {\n return this.setPeer({\n peerId: this.peerId,\n threadId: this.threadId,\n lastMsgId: messageId\n });\n }\n\n public async finishPeerChange(isTarget: boolean, isJump: boolean, lastMsgId: number, startParam?: string) {\n if(this.peerChanged) return;\n\n const peerId = this.peerId;\n this.peerChanged = true;\n this.wasAlreadyUsed = true;\n\n const middleware = this.bubbles.getMiddleware();\n\n this.cleanup(false);\n\n const sharedMediaTab = this.sharedMediaTab;\n\n const callbacksPromise = Promise.all([\n this.topbar.finishPeerChange(isTarget),\n this.bubbles.finishPeerChange(),\n this.input.finishPeerChange(startParam),\n sharedMediaTab.fillProfileElements()\n ]);\n\n const callbacks = await callbacksPromise;\n sharedMediaTab.loadSidebarMedia(true);\n\n if(!middleware()) {\n return;\n }\n\n callbacks.forEach((callback) => {\n callback?.();\n });\n\n appSidebarRight.replaceSharedMediaTab(sharedMediaTab);\n\n this.sharedMediaTabs.filter((tab) => tab !== sharedMediaTab).forEach((tab) => this.destroySharedMediaTab(tab));\n\n this.container.dataset.type = this.type;\n this.log.setPrefix('CHAT-' + peerId + '-' + this.type);\n\n this.appImManager.dispatchEvent('peer_changed', this);\n }\n\n public getMessage(mid: number) {\n return this.managers.appMessagesManager.getMessageFromStorage(this.messagesStorageKey, mid);\n }\n\n public async getMidsByMid(mid: number) {\n return this.managers.appMessagesManager.getMidsByMessage(await this.getMessage(mid));\n }\n\n public getHistoryStorage(ignoreThreadId?: boolean) {\n return this.managers.appMessagesManager.getHistoryStorageTransferable(this.peerId, ignoreThreadId ? undefined : this.threadId)\n .then((historyStorageTransferable) => {\n return {\n ...historyStorageTransferable,\n history: SlicedArray.fromJSON(historyStorageTransferable.historySerialized)\n }\n });\n }\n\n public getDialogOrTopic() {\n return this.isForum && this.threadId ? this.managers.dialogsStorage.getForumTopic(this.peerId, this.threadId) : this.managers.dialogsStorage.getDialogOnly(this.peerId);\n }\n\n public getHistoryMaxId() {\n return this.getHistoryStorage().then((historyStorage) => historyStorage.maxId);\n }\n\n public async _isAnyGroup(peerId: PeerId) {\n return peerId === rootScope.myId || peerId === REPLIES_PEER_ID || (await this.managers.appPeersManager.isAnyGroup(peerId));\n }\n\n public initSearch(query?: string) {\n if(!this.peerId) return;\n\n if(mediaSizes.isMobile) {\n if(!this.search) {\n this.search = new ChatSearch(this.topbar, this, query);\n } else {\n this.search.setQuery(query);\n }\n } else {\n let tab = appSidebarRight.getTab(AppPrivateSearchTab);\n if(!tab) {\n tab = appSidebarRight.createTab(AppPrivateSearchTab);\n }\n\n tab.open(this.peerId, this.threadId, this.bubbles.onDatePick, query);\n }\n }\n\n public canSend(action?: ChatRights) {\n return this.managers.appMessagesManager.canSendToPeer(this.peerId, this.threadId, action);\n }\n\n public isStartButtonNeeded() {\n return Promise.all([\n this.managers.appPeersManager.isBot(this.peerId),\n this.managers.appMessagesManager.getDialogOnly(this.peerId),\n this.getHistoryStorage(true)\n ]).then(([isBot, dialog, historyStorage]) => {\n return isBot && !dialog && !historyStorage.history.length;\n });\n }\n\n public getMessageSendingParams(): MessageSendingParams {\n return {\n threadId: this.threadId,\n replyToMsgId: this.input.replyToMsgId,\n scheduleDate: this.input.scheduleDate,\n silent: this.input.sendSilent,\n sendAsPeerId: this.input.sendAsPeerId\n };\n }\n\n public isOurMessage(message: Message.message | Message.messageService) {\n return message.fromId === rootScope.myId || (!!message.pFlags.out && this.isMegagroup);\n }\n\n public isOutMessage(message: Message.message | Message.messageService) {\n const fwdFrom = (message as Message.message).fwd_from;\n const isOut = this.isOurMessage(message) && (!fwdFrom || this.peerId !== rootScope.myId);\n return !!isOut;\n }\n\n public isAvatarNeeded(message: Message.message | Message.messageService) {\n return this.isAnyGroup && !this.isOutMessage(message);\n }\n\n public isPinnedMessagesNeeded() {\n return this.type === 'chat' || this.isForum;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {State} from '../config/state';\nimport rootScope from '../lib/rootScope';\n\nexport type ChatAutoDownloadSettings = {\n photo: number,\n video: number,\n file: number\n};\n\nexport default async function getAutoDownloadSettingsByPeerId(peerId: PeerId): Promise {\n let type: keyof State['settings']['autoDownload'];\n\n let photoSizeMax = 0, videoSizeMax = 0, fileSizeMax = 0;\n const settings = rootScope.settings;\n const appPeersManager = rootScope.managers.appPeersManager;\n if(!settings.autoDownloadNew.pFlags.disabled && peerId) {\n if(peerId.isUser()) {\n if(await appPeersManager.isContact(peerId)) {\n type = 'contacts';\n } else {\n type = 'private';\n }\n } else if(await appPeersManager.isBroadcast(peerId)) {\n type = 'channels';\n } else {\n type = 'groups';\n }\n\n if(settings.autoDownload.photo[type]) photoSizeMax = settings.autoDownloadNew.photo_size_max;\n if(settings.autoDownload.video[type]) videoSizeMax = settings.autoDownloadNew.video_size_max;\n if(settings.autoDownload.file[type]) fileSizeMax = settings.autoDownloadNew.file_size_max;\n }\n\n return {\n photo: photoSizeMax,\n video: videoSizeMax,\n file: fileSizeMax\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppImManager} from '../../lib/appManagers/appImManager';\nimport ButtonIcon from '../buttonIcon';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_APPLE, IS_MOBILE} from '../../environment/userAgent';\nimport appNavigationController from '../appNavigationController';\nimport {_i18n} from '../../lib/langPack';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport isSelectionEmpty from '../../helpers/dom/isSelectionEmpty';\nimport {MarkdownType} from '../../helpers/dom/getRichElementValue';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport clamp from '../../helpers/number/clamp';\nimport matchUrl from '../../lib/richTextProcessor/matchUrl';\nimport matchUrlProtocol from '../../lib/richTextProcessor/matchUrlProtocol';\nimport hasMarkupInSelection from '../../helpers/dom/hasMarkupInSelection';\n\nexport default class MarkupTooltip {\n public container: HTMLElement;\n private wrapper: HTMLElement;\n private buttons: {[type in MarkdownType]: HTMLElement} = {} as any;\n private linkBackButton: HTMLElement;\n private linkApplyButton: HTMLButtonElement;\n private hideTimeout: number;\n private addedListener = false;\n private waitingForMouseUp = false;\n private linkInput: HTMLInputElement;\n private savedRange: Range;\n private mouseUpCounter: number = 0;\n // private log: ReturnType;\n\n constructor(private appImManager: AppImManager) {\n // this.log = logger('MARKUP');\n }\n\n private init() {\n this.container = document.createElement('div');\n this.container.classList.add('markup-tooltip', 'z-depth-1', 'hide');\n\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add('markup-tooltip-wrapper');\n\n const tools1 = document.createElement('div');\n const tools2 = document.createElement('div');\n tools1.classList.add('markup-tooltip-tools');\n tools2.classList.add('markup-tooltip-tools');\n\n const arr = ['bold', 'italic', 'underline', 'strikethrough', 'monospace', 'spoiler', 'link'] as (keyof MarkupTooltip['buttons'])[];\n arr.forEach((c) => {\n const button = ButtonIcon(c, {noRipple: true});\n tools1.append(this.buttons[c] = button);\n\n if(c !== 'link') {\n button.addEventListener('mousedown', (e) => {\n cancelEvent(e);\n this.appImManager.chat.input.applyMarkdown(c);\n this.cancelClosening();\n\n /* this.mouseUpCounter = 0;\n this.setMouseUpEvent(); */\n // this.hide();\n });\n } else {\n attachClickEvent(button, (e) => {\n cancelEvent(e);\n this.showLinkEditor();\n this.cancelClosening();\n });\n }\n });\n\n this.linkBackButton = ButtonIcon('left', {noRipple: true});\n this.linkInput = document.createElement('input');\n _i18n(this.linkInput, 'MarkupTooltip.LinkPlaceholder', undefined, 'placeholder');\n this.linkInput.classList.add('input-clear');\n this.linkInput.addEventListener('keydown', (e) => {\n const valid = !this.linkInput.value.length || !!matchUrl(this.linkInput.value);// /^(http)|(https):\\/\\//i.test(this.linkInput.value);\n\n if(e.key === 'Enter') {\n if(!valid) {\n if(this.linkInput.classList.contains('error')) {\n this.linkInput.classList.remove('error');\n void this.linkInput.offsetLeft; // reflow\n }\n\n this.linkInput.classList.add('error');\n } else {\n this.applyLink(e);\n }\n }\n });\n\n this.linkInput.addEventListener('input', (e) => {\n const valid = this.isLinkValid();\n\n this.linkInput.classList.toggle('is-valid', valid);\n this.linkInput.classList.remove('error');\n });\n\n this.linkBackButton.addEventListener('mousedown', (e) => {\n // this.log('linkBackButton click');\n cancelEvent(e);\n this.container.classList.remove('is-link');\n // input.value = '';\n this.resetSelection();\n this.setTooltipPosition();\n this.cancelClosening();\n });\n\n this.linkApplyButton = ButtonIcon('check markup-tooltip-link-apply', {noRipple: true});\n this.linkApplyButton.addEventListener('mousedown', (e) => {\n // this.log('linkApplyButton click');\n this.applyLink(e);\n });\n\n const applyDiv = document.createElement('div');\n applyDiv.classList.add('markup-tooltip-link-apply-container');\n\n const delimiter1 = document.createElement('span');\n const delimiter2 = document.createElement('span');\n const delimiter3 = document.createElement('span');\n delimiter1.classList.add('markup-tooltip-delimiter');\n delimiter2.classList.add('markup-tooltip-delimiter');\n delimiter3.classList.add('markup-tooltip-delimiter');\n tools1.insertBefore(delimiter1, this.buttons.link);\n applyDiv.append(delimiter3, this.linkApplyButton);\n tools2.append(this.linkBackButton, delimiter2, this.linkInput, applyDiv);\n // tools1.insertBefore(delimiter2, this.buttons.link.nextSibling);\n\n this.wrapper.append(tools1, tools2);\n this.container.append(this.wrapper);\n document.body.append(this.container);\n\n window.addEventListener('resize', () => {\n this.hide();\n });\n }\n\n public showLinkEditor() {\n if(!this.container || !this.container.classList.contains('is-visible')) { // * if not inited yet (Ctrl+A + Ctrl+K)\n this.show();\n }\n\n const button = this.buttons.link;\n this.container.classList.add('is-link');\n\n const selection = document.getSelection();\n this.savedRange = selection.getRangeAt(0);\n\n if(button.classList.contains('active')) {\n const startContainer = this.savedRange.startContainer;\n const anchor = startContainer.parentElement as HTMLAnchorElement;\n this.linkInput.value = anchor.href;\n } else {\n this.linkInput.value = '';\n }\n\n this.setTooltipPosition(true);\n\n setTimeout(() => {\n this.linkInput.focus(); // !!! instant focus will break animation\n }, 200);\n this.linkInput.classList.toggle('is-valid', this.isLinkValid());\n }\n\n private applyLink(e: Event) {\n cancelEvent(e);\n this.resetSelection();\n let url = this.linkInput.value;\n if(url && !matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n this.appImManager.chat.input.applyMarkdown('link', url);\n setTimeout(() => {\n this.hide();\n }, 0);\n }\n\n private isLinkValid() {\n return !this.linkInput.value.length || !!matchUrl(this.linkInput.value);\n }\n\n private resetSelection(range: Range = this.savedRange) {\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n this.appImManager.chat.input.messageInput.focus();\n }\n\n public hide() {\n // return;\n\n if(this.init) return;\n\n this.container.classList.remove('is-visible');\n // document.removeEventListener('mouseup', this.onMouseUp);\n document.removeEventListener('mouseup', this.onMouseUpSingle);\n this.waitingForMouseUp = false;\n\n appNavigationController.removeByType('markup');\n\n if(this.hideTimeout) clearTimeout(this.hideTimeout);\n this.hideTimeout = window.setTimeout(() => {\n this.hideTimeout = undefined;\n this.container.classList.add('hide');\n this.container.classList.remove('is-link');\n }, 200);\n }\n\n public getActiveMarkupButton() {\n const currentMarkups: Set = new Set();\n\n // const nodes = getSelectedNodes();\n // const parents = [...new Set(nodes.map((node) => node.parentNode))];\n // // if(parents.length > 1 && parents) return [];\n\n // (parents as HTMLElement[]).forEach((node) => {\n // for(const type in markdownTags) {\n // const tag = markdownTags[type as MarkdownType];\n // const closest = node.closest(tag.match + ', [contenteditable=\"true\"]');\n // if(closest !== this.appImManager.chat.input.messageInput) {\n // currentMarkups.add(this.buttons[type as MarkdownType]);\n // }\n // }\n // });\n\n const types = Object.keys(this.buttons) as MarkdownType[];\n const markup = hasMarkupInSelection(types);\n types.forEach((type) => {\n if(markup[type]) {\n currentMarkups.add(this.buttons[type as MarkdownType]);\n }\n });\n\n return [...currentMarkups];\n }\n\n public setActiveMarkupButton() {\n const activeButtons = this.getActiveMarkupButton();\n\n for(const i in this.buttons) {\n // @ts-ignore\n const button = this.buttons[i];\n button.classList.toggle('active', activeButtons.includes(button));\n }\n }\n\n private setTooltipPosition(isLinkToggle = false) {\n const selection = document.getSelection();\n const range = selection.getRangeAt(0);\n\n const bodyRect = document.body.getBoundingClientRect();\n const selectionRect = range.getBoundingClientRect();\n const inputRect = this.appImManager.chat.input.rowsWrapper.getBoundingClientRect();\n\n this.container.style.maxWidth = inputRect.width + 'px';\n\n const visibleRect = getVisibleRect(undefined, this.appImManager.chat.input.messageInput, false, selectionRect);\n\n const selectionTop = visibleRect.rect.top/* selectionRect.top */ + (bodyRect.top * -1);\n\n const currentTools = this.container.classList.contains('is-link') ? this.wrapper.lastElementChild : this.wrapper.firstElementChild;\n\n const sizesRect = currentTools.getBoundingClientRect();\n const top = selectionTop - sizesRect.height - 8;\n\n const minX = inputRect.left;\n const maxX = (inputRect.left + inputRect.width) - Math.min(inputRect.width, sizesRect.width);\n let left: number;\n if(isLinkToggle) {\n const containerRect = this.container.getBoundingClientRect();\n left = clamp(containerRect.left, minX, maxX);\n } else {\n const x = selectionRect.left + (selectionRect.width - sizesRect.width) / 2;\n left = clamp(x, minX, maxX);\n }\n\n /* const isClamped = x !== minX && x !== maxX && (left === minX || left === maxX || this.container.getBoundingClientRect().left >= maxX);\n\n if(isLinkToggle && this.container.classList.contains('is-link') && !isClamped) return; */\n\n this.container.style.transform = `translate3d(${left}px, ${top}px, 0)`;\n }\n\n public show() {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n if(isSelectionEmpty()) {\n this.hide();\n return;\n }\n\n if(this.hideTimeout !== undefined) {\n clearTimeout(this.hideTimeout);\n }\n\n if(this.container.classList.contains('is-visible')) {\n return;\n }\n\n this.setActiveMarkupButton();\n\n this.container.classList.remove('is-link');\n const isFirstShow = this.container.classList.contains('hide');\n if(isFirstShow) {\n this.container.classList.remove('hide');\n this.container.classList.add('no-transition');\n }\n\n this.setTooltipPosition();\n\n if(isFirstShow) {\n void this.container.offsetLeft; // reflow\n this.container.classList.remove('no-transition');\n }\n\n this.container.classList.add('is-visible');\n\n if(!IS_MOBILE) {\n appNavigationController.pushItem({\n type: 'markup',\n onPop: () => {\n this.hide();\n }\n });\n }\n\n // this.log('selection', selectionRect, activeButton);\n }\n\n /* private onMouseUp = (e: Event) => {\n this.log('onMouseUp');\n if(findUpClassName(e.target, 'markup-tooltip')) return;\n\n this.hide();\n //document.removeEventListener('mouseup', this.onMouseUp);\n }; */\n\n private onMouseUpSingle = (e?: Event) => {\n // this.log('onMouseUpSingle');\n this.waitingForMouseUp = false;\n\n if(IS_TOUCH_SUPPORTED) {\n e && cancelEvent(e);\n if(this.mouseUpCounter++ === 0) {\n this.resetSelection(this.savedRange);\n } else {\n this.hide();\n return;\n }\n }\n\n this.show();\n\n /* !isTouchSupported && document.addEventListener('mouseup', this.onMouseUp); */\n };\n\n public setMouseUpEvent() {\n if(this.waitingForMouseUp) return;\n this.waitingForMouseUp = true;\n\n // this.log('setMouseUpEvent');\n\n document.addEventListener('mouseup', this.onMouseUpSingle, {once: true});\n }\n\n public cancelClosening() {\n if(IS_TOUCH_SUPPORTED && !IS_APPLE) {\n document.removeEventListener('mouseup', this.onMouseUpSingle);\n document.addEventListener('mouseup', (e) => {\n cancelEvent(e);\n this.mouseUpCounter = 1;\n this.waitingForMouseUp = false;\n this.setMouseUpEvent();\n }, {once: true});\n }\n }\n\n public handleSelection() {\n if(this.addedListener) return;\n this.addedListener = true;\n document.addEventListener('selectionchange', (e) => {\n // this.log('selectionchange');\n\n if(document.activeElement === this.linkInput) {\n return;\n }\n\n const messageInput = this.appImManager.chat.input.messageInput;\n if(document.activeElement !== messageInput) {\n this.hide();\n return;\n }\n\n const selection = document.getSelection();\n if(isSelectionEmpty(selection)) {\n this.hide();\n return;\n }\n\n if(IS_TOUCH_SUPPORTED) {\n if(IS_APPLE) {\n this.show();\n this.setTooltipPosition(); // * because can skip this in .show();\n } else {\n if(this.mouseUpCounter === 2) {\n this.mouseUpCounter = 0;\n return;\n }\n\n this.savedRange = selection.getRangeAt(0);\n this.setMouseUpEvent();\n /* document.addEventListener('touchend', (e) => {\n cancelEvent(e);\n this.resetSelection(range);\n this.show();\n }, {once: true, passive: false}); */\n }\n } else if(this.container && this.container.classList.contains('is-visible')) {\n this.setTooltipPosition();\n } else if(messageInput.matches(':active')) {\n this.setMouseUpEvent();\n } else {\n this.show();\n }\n });\n\n document.addEventListener('beforeinput', (e) => {\n if(e.inputType === 'historyRedo' || e.inputType === 'historyUndo') {\n e.target.addEventListener('input', () => this.setActiveMarkupButton(), {once: true});\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport generatePathData from '../../helpers/generatePathData';\nimport {FormatterArguments, i18n, LangPackKey} from '../../lib/langPack';\n\nexport default class ChatDragAndDrop {\n container: HTMLDivElement;\n svg: SVGSVGElement;\n outlineWrapper: HTMLDivElement;\n path: SVGPathElement;\n\n constructor(appendTo: HTMLElement, private options: {\n icon?: string,\n header: LangPackKey,\n headerArgs?: FormatterArguments,\n subtitle?: LangPackKey,\n onDrop: (e: DragEvent) => void\n }) {\n this.container = document.createElement('div');\n this.container.classList.add('drop', 'z-depth-1');\n\n this.outlineWrapper = document.createElement('div');\n this.outlineWrapper.classList.add('drop-outline-wrapper');\n\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n this.svg.classList.add('drop-outline');\n\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n this.path.classList.add('drop-outline-path');\n\n let dropIcon: HTMLElement;\n if(options.icon) {\n dropIcon = document.createElement('div');\n dropIcon.classList.add('drop-icon', 'tgico-' + options.icon);\n }\n\n const dropHeader = document.createElement('div');\n dropHeader.classList.add('drop-header');\n dropHeader.append(i18n(options.header, options.headerArgs));\n\n let dropSubtitle: HTMLElement;\n if(options.subtitle) {\n dropSubtitle = document.createElement('div');\n dropSubtitle.classList.add('drop-subtitle');\n dropSubtitle.append(i18n(options.subtitle));\n }\n\n this.svg.append(this.path);\n this.outlineWrapper.append(this.svg);\n\n this.container.append(...[this.outlineWrapper, dropIcon, dropHeader, dropSubtitle].filter(Boolean));\n appendTo.append(this.container);\n\n this.container.addEventListener('dragover', this.onDragOver);\n this.container.addEventListener('dragleave', this.onDragLeave);\n this.container.addEventListener('drop', this.onDrop);\n }\n\n onDragOver = (e: DragEvent) => {\n this.container.classList.add('is-dragover');\n // SetTransition(this.container, 'is-dragover', true, 500);\n };\n\n onDragLeave = (e: DragEvent) => {\n this.container.classList.remove('is-dragover');\n // SetTransition(this.container, 'is-dragover', false, 500);\n };\n\n onDrop = (e: DragEvent) => {\n this.options.onDrop(e);\n };\n\n destroy() {\n delete this.options;\n this.container.remove();\n this.container.removeEventListener('dragover', this.onDragOver);\n this.container.removeEventListener('dragleave', this.onDragLeave);\n this.container.removeEventListener('drop', this.onDrop);\n }\n\n setPath() {\n const rect = this.outlineWrapper.getBoundingClientRect();\n this.svg.setAttributeNS(null, 'preserveAspectRatio', 'none');\n this.svg.setAttributeNS(null, 'viewBox', `0 0 ${rect.width} ${rect.height}`);\n this.svg.setAttributeNS(null, 'width', `${rect.width}`);\n this.svg.setAttributeNS(null, 'height', `${rect.height}`);\n\n const radius = 10;\n // const strokeWidth = 2;\n const sizeX = rect.width - radius;\n const sizeY = rect.height - radius;\n const pos = radius / 2;\n const d = generatePathData(pos, pos, sizeX, sizeY, radius, radius, radius, radius);\n this.path.setAttributeNS(null, 'd', d);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {doubleRaf} from '../schedulers';\n\nexport default function disableTransition(elements: HTMLElement[]) {\n elements.forEach((el) => el.classList.add('no-transition'));\n\n doubleRaf().then(() => {\n elements.forEach((el) => el.classList.remove('no-transition'));\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport const MAX_SPEED = 8.2;\nexport const MIN_SPEED = 0.8;\n\n// import { MIN_SPEED, MAX_SPEED } from './BlobDrawable';\n\ntype Radius = number[];\n\nexport default class LineBlobDrawable {\n public maxRadius: number;\n public minRadius: number;\n private N: number;\n private radius: Radius;\n private radiusNext: Radius;\n private progress: number[];\n private speed: number[];\n\n constructor(n: number) {\n this.maxRadius = 10;\n this.minRadius = 0;\n\n this.N = n;\n this.radius = new Array(n + 1);\n\n this.radiusNext = new Array(n + 1);\n this.progress = new Array(n + 1);\n this.speed = new Array(n + 1);\n\n for(let i = 0; i <= n; i++) {\n this.generateBlob(this.radius, i);\n this.generateBlob(this.radiusNext, i);\n this.progress[i] = 0;\n }\n }\n\n private generateBlob(radius: Radius, i: number) {\n const {maxRadius, minRadius, speed} = this;\n\n const radDif = maxRadius - minRadius;\n radius[i] = minRadius + Math.random() * radDif;\n speed[i] = 0.017 + 0.003 * Math.random();\n }\n\n private generateNextBlob() {\n const {radius, radiusNext, progress, N} = this;\n for(let i = 0; i < N; i++) {\n this.generateBlob(radius, i);\n this.generateBlob(radiusNext, i);\n progress[i] = 0.0;\n }\n }\n\n public update(amplitude: number, speedScale: number) {\n const {N, progress, speed, radius, radiusNext} = this;\n for(let i = 0; i <= N; i++) {\n progress[i] += (speed[i] * MIN_SPEED) + amplitude * speed[i] * MAX_SPEED * speedScale;\n if(progress[i] >= 1.0) {\n progress[i] = 0.0;\n radius[i] = radiusNext[i];\n this.generateBlob(radiusNext, i);\n }\n }\n }\n\n public draw(left: number, top: number, right: number, bottom: number, canvas: HTMLCanvasElement, paint: (ctx: CanvasRenderingContext2D) => void, pinnedTop: number, progressToPinned: number) {\n if(canvas.getContext) {\n const ctx = canvas.getContext('2d');\n // ctx.globalAlpha = 0.5;\n // ctx.lineWidth = 1;\n\n ctx.beginPath();\n ctx.moveTo(right, bottom);\n ctx.lineTo(left, bottom);\n\n const {radius, radiusNext, N} = this;\n for(let i = 0; i <= N; i++) {\n if(i === 0) {\n const progress = this.progress[i];\n const r1 = radius[i] * (1.0 - progress) + radiusNext[i] * progress;\n const y = (top - r1) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n ctx.lineTo(left, y);\n } else {\n const progress = this.progress[i - 1];\n const r1 = radius[i - 1] * (1.0 - progress) + radiusNext[i - 1] * progress;\n const progressNext = this.progress[i];\n const r2 = radius[i] * (1.0 - progressNext) + radiusNext[i] * progressNext;\n const x1 = (right - left) / N * (i - 1);\n const x2 = (right - left) / N * i;\n const cx = x1 + (x2 - x1) / 2;\n\n const y1 = (top - r1) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n const y2 = (top - r2) * progressToPinned + pinnedTop * (1.0 - progressToPinned);\n ctx.bezierCurveTo(cx, y1, cx, y2, x2, y2);\n if(i === N) {\n ctx.lineTo(right, bottom);\n }\n }\n }\n\n // ctx.scale(1.0, 1.0);\n paint(ctx);\n ctx.fill();\n ctx.closePath();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport GROUP_CALL_STATE from '../lib/calls/groupCallState';\nimport LineBlobDrawable from './lineBlobDrawable';\n\nexport class WeavingState {\n public shader: (ctx: CanvasRenderingContext2D, left: number, top: number, right: number, bottom: number) => void;\n\n constructor(public stateId: GROUP_CALL_STATE) {\n this.createGradient(stateId);\n }\n\n public createGradient(stateId: GROUP_CALL_STATE) {\n this.shader = (ctx, left, top, right, bottom) => {\n ctx.fillStyle = WeavingState.getGradientFromType(ctx, stateId, left, top, right, bottom);\n };\n }\n\n // Android colors\n static getGradientFromType(ctx: CanvasRenderingContext2D, type: GROUP_CALL_STATE, x0: number, y0: number, x1: number, y1: number) {\n const gradient = ctx.createLinearGradient(x0, y0, x1, y1);\n if(type === GROUP_CALL_STATE.MUTED_BY_ADMIN) {\n gradient.addColorStop(0, '#F05459');\n gradient.addColorStop(.4, '#766EE9');\n gradient.addColorStop(1, '#57A4FE');\n } else if(type === GROUP_CALL_STATE.UNMUTED) {\n gradient.addColorStop(0, '#52CE5D');\n gradient.addColorStop(1, '#00B1C0');\n } else if(type === GROUP_CALL_STATE.MUTED) {\n gradient.addColorStop(0, '#0976E3');\n gradient.addColorStop(1, '#2BCEFF');\n } else if(type === GROUP_CALL_STATE.CONNECTING) {\n gradient.addColorStop(0, '#8599aa');\n gradient.addColorStop(1, '#8599aa');\n }\n\n return gradient;\n }\n\n update(height: number, width: number, dt: number, amplitude: number) {\n // TODO: move gradient here\n }\n}\n\nexport default class TopbarWeave {\n private focused: boolean;\n private resizing: boolean;\n private lastUpdateTime: number;\n private amplitude: number;\n private amplitude2: number;\n\n private states: Map;\n private previousState: WeavingState;\n private currentState: WeavingState;\n private progressToState: number;\n\n private scale: number;\n private left: number;\n private top: number;\n private right: number;\n private bottom: number;\n\n private mounted: boolean;\n private media: MediaQueryList;\n\n private container: HTMLDivElement;\n private canvas: HTMLCanvasElement;\n\n private resizeHandler: number;\n private raf: number;\n\n private lbd: LineBlobDrawable;\n private lbd1: LineBlobDrawable;\n private lbd2: LineBlobDrawable;\n\n private animateToAmplitude: number;\n private animateAmplitudeDiff: number;\n private animateAmplitudeDiff2: number;\n\n constructor() {\n this.focused = true;\n this.resizing = false;\n this.lastUpdateTime = Date.now();\n this.amplitude = 0.0;\n this.amplitude2 = 0.0;\n\n this.states = new Map([\n [GROUP_CALL_STATE.UNMUTED, new WeavingState(GROUP_CALL_STATE.UNMUTED)],\n [GROUP_CALL_STATE.MUTED, new WeavingState(GROUP_CALL_STATE.MUTED)],\n [GROUP_CALL_STATE.MUTED_BY_ADMIN, new WeavingState(GROUP_CALL_STATE.MUTED_BY_ADMIN)],\n [GROUP_CALL_STATE.CONNECTING, new WeavingState(GROUP_CALL_STATE.CONNECTING)]\n ]);\n this.previousState = null;\n this.currentState = this.states.get(GROUP_CALL_STATE.CONNECTING);\n this.progressToState = 1.0;\n }\n\n public componentDidMount() {\n if(this.mounted) {\n return;\n }\n\n this.mounted = true;\n // window.addEventListener('blur', this.handleBlur);\n // window.addEventListener('focus', this.handleFocus);\n window.addEventListener('resize', this.handleResize);\n this.media = window.matchMedia('screen and (min-resolution: 2dppx)');\n this.media.addEventListener('change', this.handleDevicePixelRatioChanged);\n\n this.setSize();\n this.forceUpdate();\n\n this.lbd = new LineBlobDrawable(3);\n this.lbd1 = new LineBlobDrawable(7);\n this.lbd2 = new LineBlobDrawable(8);\n this.setAmplitude(this.amplitude);\n\n this.draw();\n }\n\n public componentWillUnmount() {\n this.mounted = false;\n // window.removeEventListener('blur', this.handleBlur);\n // window.removeEventListener('focus', this.handleFocus);\n window.removeEventListener('resize', this.handleResize);\n this.media.addEventListener('change', this.handleDevicePixelRatioChanged);\n\n const {canvas} = this;\n const ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n }\n\n private setSize() {\n this.scale = window.devicePixelRatio;\n this.top = 20 * this.scale;\n this.right = (this.mounted ? this.container.offsetWidth : 1261) * this.scale;\n this.bottom = (this.mounted ? this.container.offsetHeight : 68) * this.scale;\n this.left = 0 * this.scale;\n this.setCanvasSize();\n }\n\n private setCanvasSize() {\n this.canvas.width = this.right;\n this.canvas.height = this.bottom;\n }\n\n private handleDevicePixelRatioChanged = (e: Event) => {\n this.setSize();\n this.forceUpdate();\n }\n\n private handleResize = () => {\n if(this.resizeHandler) {\n clearTimeout(this.resizeHandler);\n this.resizeHandler = null;\n }\n\n this.resizing = true;\n this.resizeCanvas();\n this.resizeHandler = window.setTimeout(() => {\n this.resizing = false;\n this.invokeDraw();\n }, 250);\n }\n\n private resizeCanvas() {\n this.scale = window.devicePixelRatio;\n this.right = this.container.offsetWidth * this.scale;\n\n this.forceUpdate();\n this.invokeDraw();\n }\n\n public handleFocus = () => {\n this.focused = true;\n this.invokeDraw();\n }\n\n public handleBlur = () => {\n this.focused = false;\n }\n\n private invokeDraw = () => {\n if(this.raf) return;\n\n this.draw();\n }\n\n private draw = (force = false) => {\n this.raf = null;\n if(!this.mounted) {\n return;\n }\n const {lbd, lbd1, lbd2, scale, left, top, right, bottom, currentState, previousState, focused, resizing, canvas} = this;\n if(!focused && !resizing && this.progressToState >= 1.0) {\n return;\n }\n\n // console.log('[top] draw', [focused, resizing, this.mounted]);\n\n const newTime = Date.now();\n let dt = (newTime - this.lastUpdateTime);\n if(dt > 20) {\n dt = 17;\n }\n\n // console.log('draw start', this.amplitude, this.animateToAmplitude);\n if(this.animateToAmplitude !== this.amplitude) {\n this.amplitude += this.animateAmplitudeDiff * dt;\n if(this.animateAmplitudeDiff > 0) {\n if(this.amplitude > this.animateToAmplitude) {\n this.amplitude = this.animateToAmplitude;\n }\n } else {\n if(this.amplitude < this.animateToAmplitude) {\n this.amplitude = this.animateToAmplitude;\n }\n }\n }\n\n if(this.animateToAmplitude !== this.amplitude2) {\n this.amplitude2 += this.animateAmplitudeDiff2 * dt;\n if(this.animateAmplitudeDiff2 > 0) {\n if(this.amplitude2 > this.animateToAmplitude) {\n this.amplitude2 = this.animateToAmplitude;\n }\n } else {\n if(this.amplitude2 < this.animateToAmplitude) {\n this.amplitude2 = this.animateToAmplitude;\n }\n }\n }\n\n if(previousState) {\n this.progressToState += dt / 250;\n if(this.progressToState > 1) {\n this.progressToState = 1;\n this.previousState = null;\n }\n }\n\n const {amplitude, amplitude2, progressToState} = this;\n\n const top1 = 6 * amplitude2 * scale;\n const top2 = 6 * amplitude2 * scale;\n\n const ctx = canvas.getContext('2d');\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n lbd.minRadius = 0;\n lbd.maxRadius = (2 + 2 * amplitude) * scale;\n lbd1.minRadius = 0;\n lbd1.maxRadius = (3 + 9 * amplitude) * scale;\n lbd2.minRadius = 0;\n lbd2.maxRadius = (3 + 9 * amplitude) * scale;\n\n lbd.update(amplitude, 0.3);\n lbd1.update(amplitude, 0.7);\n lbd2.update(amplitude, 0.7);\n\n for(let i = 0; i < 2; i++) {\n if(i === 0 && !previousState) {\n continue;\n }\n\n let alpha = 1;\n let state: WeavingState = null;\n if(i === 0) {\n alpha = 1 - progressToState;\n state = previousState;\n // previousState.setToPaint(paint);\n } else {\n alpha = previousState ? progressToState : 1;\n currentState.update(bottom - top, right - left, dt, amplitude);\n state = currentState;\n // currentState.setToPaint(paint);\n }\n\n const paint1 = (ctx: CanvasRenderingContext2D) => {\n ctx.globalAlpha = 0.3 * alpha;\n state.shader(ctx, left, top, right, bottom);\n };\n const paint = (ctx: CanvasRenderingContext2D) => {\n ctx.globalAlpha = i === 0 ? 1 : alpha;\n state.shader(ctx, left, top, right, bottom);\n };\n\n lbd1.draw(left, top - top1, right, bottom, canvas, paint1, top, 1.0);\n lbd2.draw(left, top - top2, right, bottom, canvas, paint1, top, 1.0);\n lbd.draw(left, top, right, bottom, canvas, paint, top, 1.0);\n }\n\n if(!force) {\n this.raf = requestAnimationFrame(() => this.draw());\n }\n };\n\n public setCurrentState = (stateId: GROUP_CALL_STATE, animated: boolean) => {\n const {currentState, states} = this;\n\n if(currentState?.stateId === stateId) {\n return;\n }\n\n this.previousState = animated ? currentState : null;\n this.currentState = states.get(stateId);\n this.progressToState = this.previousState ? 0.0 : 1.0;\n };\n\n public setAmplitude(value: number) {\n const {amplitude} = this;\n this.animateToAmplitude = value;\n this.animateAmplitudeDiff = (value - amplitude) / 250;\n this.animateAmplitudeDiff2 = (value - amplitude) / 120;\n }\n\n private forceUpdate() {\n this.setCanvasSize();\n }\n\n public render(className: string) {\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add(className + '-canvas');\n\n container.append(canvas);\n\n return container;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from '../../helpers/noop';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport rootScope from '../rootScope';\nimport lottieLoader, {LottieAssetName} from './lottieLoader';\nimport type RLottiePlayer from './rlottiePlayer';\nimport {RLottieColor} from './rlottiePlayer';\n\nexport type RLottieIconOptions = {\n width: number,\n height: number,\n container?: HTMLElement,\n skipAnimation?: boolean\n};\n\nexport type RLottieIconItemPartOptions = {\n startFrame: number,\n endFrame: number,\n name?: string\n};\n\nexport type RLottieIconItemOptions = {\n name: LottieAssetName,\n parts: RLottieIconItemPartOptions[],\n initFrame?: number,\n player?: RLottiePlayer,\n autoplay?: boolean,\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n};\n\nexport class RLottieIconItemPart implements RLottieIconItemPartOptions {\n public startFrame: number;\n public endFrame: number;\n public name?: string;\n\n constructor(public item: RLottieIconItem, options: RLottieIconItemPartOptions) {\n safeAssign(this, options);\n }\n\n public play(callback?: () => void) {\n return this.item.playPart(this, callback);\n }\n}\n\n// export type RLottieIconItemPart = RLottieIconItemPartOptions;\n\nexport class RLottieIconItem implements RLottieIconItemOptions {\n public name: LottieAssetName;\n public parts: RLottieIconItemPart[];\n public player: RLottiePlayer;\n public initFrame: number;\n public autoplay: boolean;\n public color: RLottieColor;\n public inverseColor: RLottieColor;\n public loadPromise: Promise;\n public onLoadForPart: () => void;\n public onLoadForColor: () => void;\n\n constructor(public icon: RLottieIcon, options: RLottieIconItemOptions) {\n this.autoplay = false;\n\n safeAssign(this, options);\n\n this.parts = this.parts.map((options) => this.createPart(options));\n }\n\n public load() {\n let loadPromise = this.loadPromise;\n if(loadPromise) {\n return loadPromise;\n }\n\n const {container, canvas, width, height} = this.icon;\n loadPromise = lottieLoader.loadAnimationAsAsset({\n container,\n canvas,\n width,\n height,\n group: 'none',\n loop: false,\n autoplay: this.autoplay ?? false,\n initFrame: this.initFrame,\n skipFirstFrameRendering: this.initFrame === undefined,\n color: this.color,\n inverseColor: this.inverseColor\n }, this.name).then((player) => {\n return lottieLoader.waitForFirstFrame(player);\n }).then((player) => {\n this.player = player;\n\n if(this.onLoadForColor) {\n this.onLoadForColor();\n this.onLoadForColor = undefined;\n }\n\n if(this.onLoadForPart) {\n this.onLoadForPart();\n this.onLoadForPart = undefined;\n }\n });\n\n this.loadPromise = loadPromise;\n this.icon.loadPromises.set(this.name, loadPromise);\n return loadPromise;\n }\n\n public createPart(options: RLottieIconItemPartOptions) {\n return new RLottieIconItemPart(this, options);\n }\n\n public getPart(index: string | number | RLottieIconItemPart) {\n if(index instanceof RLottieIconItemPart) return index;\n else if(typeof(index) === 'string') return this.parts.find((part) => part.name === index);\n else return this.parts[index];\n }\n\n public playPart(part: RLottieIconItemPart, callback?: () => void) {\n return this.icon.playPart(this, part, callback);\n }\n}\n\nexport default class RLottieIcon {\n public container: HTMLElement;\n public canvas: HTMLCanvasElement;\n public width: number;\n public height: number;\n\n protected items: Map;\n public loadPromises: Map>;\n\n protected skipAnimation: boolean;\n\n constructor(options: RLottieIconOptions) {\n safeAssign(this, options);\n\n if(!this.container) this.container = document.createElement('div');\n this.container.classList.add('rlottie-icon');\n\n const {width, height} = this;\n this.container.style.width = width + 'px';\n this.container.style.height = height + 'px';\n\n const canvas = this.canvas = document.createElement('canvas');\n canvas.classList.add('rlottie');\n canvas.width = width;\n canvas.height = height;\n\n this.items = new Map();\n this.loadPromises = new Map();\n }\n\n public get loadPromise() {\n return Promise.all([...this.loadPromises.values()]).then(noop);\n }\n\n public getItem(name?: LottieAssetName): RLottieIconItem {\n return !name && this.items.size === 1 ? this.items.values().next().value : this.items.get(name);\n }\n\n public add(options: Omit) {\n const item = new RLottieIconItem(this, options);\n this.items.set(options.name, item);\n\n return item;\n }\n\n public playPart(item: RLottieIconItem, index: Parameters[0], callback?: () => void) {\n if(!item.player) {\n item.onLoadForPart = () => {\n this.playPart(item, index, callback);\n };\n\n return;\n }\n\n const part = item.getPart(index);\n item.player.playPart({\n from: rootScope.settings.animationsEnabled && !this.skipAnimation ? part.startFrame : part.endFrame,\n to: part.endFrame,\n callback\n });\n }\n\n /* public playToPart(item: RLottieIconItem, index: Parameters[0], toEnd: boolean) {\n if(!item.player) return;\n const part = item.getPart(index);\n const toFrame = toEnd ? part.endFrame : part.startFrame;\n item.player.playToFrame({\n frame: toFrame\n });\n } */\n\n public static generateEqualParts(length: number, frameCount: number): RLottieIconItemPartOptions[] {\n return new Array(length).fill(0).map((_, idx) => {\n const startFrame = idx * frameCount;\n return {startFrame, endFrame: startFrame + frameCount - 1};\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from '../helpers/noop';\nimport safeAssign from '../helpers/object/safeAssign';\nimport {LottieAssetName} from '../lib/rlottie/lottieLoader';\nimport RLottieIcon, {RLottieIconItemPartOptions, RLottieIconItemPart} from '../lib/rlottie/rlottieIcon';\nimport {RLottieColor} from '../lib/rlottie/rlottiePlayer';\n\nexport type SuperRLottieIconAddItemOptions = {name: LottieAssetName, parts: RLottieIconItemPartOptions};\nexport type SuperRLottieIconGetInfoResult = RLottieIconItemPart;\nexport class SuperRLottieIcon extends RLottieIcon {\n protected getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult;\n protected getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor;\n\n protected partState: Options['PartState'];\n protected colorState: Options['ColorState'];\n protected loaded: boolean;\n\n constructor(options: {\n width: number,\n height: number,\n skipAnimation?: boolean,\n getPart: (state: Options['PartState'], prevState?: Options['PartState']) => SuperRLottieIconGetInfoResult,\n getColor?: (state: Options['ColorState'], prevState?: Options['ColorState']) => RLottieColor,\n }) {\n super({\n width: options.width,\n height: options.height\n });\n\n safeAssign(this, options);\n\n // hook the first call\n /* const originalFunction = this.setState.bind(this);\n this.setState = (partState, colorState) => {\n this.setState = originalFunction;\n this.load(partState, colorState);\n return originalFunction(partState, colorState);\n }; */\n }\n\n public load(partState: Options['PartState'], colorState?: Options['ColorState']) {\n if(this.loaded) {\n return this.loadPromise;\n }\n\n this.loaded = true;\n this.partState = partState;\n this.colorState = colorState;\n\n const part = this.getPart(partState);\n const color = colorState !== undefined && this.getColor && this.getColor(colorState);\n\n const item = part.item;\n item.initFrame = part.endFrame;\n item.color = color;\n\n const promises = [...this.items.values()].map((item) => item.load());\n return Promise.all(promises).then(noop);\n }\n\n /**\n * Will redirect setting color state to part callback to synchronize the rendering\n */\n public setState(partState: Options['PartState'], colorState?: Options['ColorState'], partCallback?: () => void) {\n if(!this.loaded) this.load(partState, colorState);\n\n let changedPartState = false, changedColorState = false;\n if(partState !== undefined) changedPartState = this.setPartState(partState, colorState, partCallback);\n else if(colorState !== undefined) changedColorState = this.setColorState(colorState);\n\n return changedPartState || changedColorState;\n }\n\n public setPartState(state: Options['PartState'], colorState?: Options['ColorState'], callback?: () => void) {\n const {partState: prevState} = this;\n if(prevState === state) {\n return colorState !== undefined ? this.setColorState(colorState) : false;\n }\n\n if(colorState !== undefined) {\n this.setColorState(colorState, false);\n }\n\n this.partState = state;\n\n const part = this.getPart(state, prevState);\n part.play(callback);\n\n return true;\n }\n\n public setColorState(state: Options['ColorState'], renderIfPaused = true) {\n const {colorState: prevState} = this;\n if(prevState === state || !this.getColor) {\n return false;\n }\n\n this.colorState = state;\n\n const item = this.getItem();\n const color = this.getColor(state, prevState);\n const invoke = () => {\n item.player.setColor(color, renderIfPaused);\n };\n\n if(item.player) {\n invoke();\n } else {\n item.onLoadForColor = invoke;\n }\n\n return true;\n }\n\n public destroy() {\n this.items.forEach((item) => {\n item.loadPromise.then(() => {\n item.player.remove();\n });\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {RLottieIconItemPartOptions} from '../../lib/rlottie/rlottieIcon';\nimport {GROUP_CALL_MICROPHONE_BUTTON_STATE} from '.';\nimport {SuperRLottieIcon} from '../superIcon';\n\nexport default class GroupCallMicrophoneIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_MICROPHONE_BUTTON_STATE\n}> {\n constructor() {\n super({\n width: 36,\n height: 36,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n let partName: string;\n switch(state) {\n case states.HAND:\n partName = prevState === states.MUTED ? 'muted-to-hand' : 'unmuted-to-hand';\n break;\n case states.MUTED:\n partName = prevState === states.HAND ? 'hand-to-muted' : 'mute';\n break;\n case states.UNMUTED:\n partName = 'unmute';\n break;\n }\n\n return this.getItem().getPart(partName);\n }\n });\n\n const className = 'group-call-microphone-icon';\n this.container.classList.add(className + '-container');\n\n const parts: RLottieIconItemPartOptions[] = [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 172,\n name: 'unmuted-to-hand'\n }, {\n startFrame: 173,\n endFrame: 201,\n name: 'scheduled-crossing'\n }, {\n startFrame: 202,\n endFrame: 236,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 237,\n endFrame: 273,\n name: 'scheduled-to-hand'\n }, {\n startFrame: 274,\n endFrame: 310,\n name: 'scheduled-crossed-to-hand'\n }, {\n startFrame: 311,\n endFrame: 343,\n name: 'scheduled-uncrossing'\n }, {\n startFrame: 344,\n endFrame: 375,\n name: 'scheduled-to-muted'\n }, {\n startFrame: 376,\n endFrame: 403,\n name: 'play-to-muted'\n }];\n\n this.add({\n name: 'voip_filled',\n parts\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport RLottieIcon from '../../lib/rlottie/rlottieIcon';\nimport {GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE, GROUP_CALL_PARTICIPANT_MUTED_STATE, getColorByMutedState, clearMutedStateModifier} from '.';\nimport {SuperRLottieIcon} from '../superIcon';\n\nexport default class GroupCallParticipantMutedIcon extends SuperRLottieIcon<{\n PartState: GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE,\n ColorState: GROUP_CALL_PARTICIPANT_MUTED_STATE\n}> {\n constructor(private colored: boolean) {\n super({\n width: 32,\n height: 32,\n getPart: (state, prevState) => {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n\n let index: number;\n switch(state) {\n case states.HAND:\n index = 3;\n break;\n case states.MUTED:\n index = prevState === states.HAND ? 0 : 2;\n break;\n case states.UNMUTED:\n index = 1;\n break;\n }\n\n return this.getItem().getPart(index);\n },\n getColor: colored ? (state, prevState) => {\n return getColorByMutedState(state);\n } : undefined\n });\n\n const className = 'group-call-participant-muted-icon';\n this.container.classList.add(className + '-container');\n\n const parts = RLottieIcon.generateEqualParts(4, 21);\n this.add({\n name: 'voice_outlined2',\n parts\n });\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n return super.setState(clearMutedStateModifier(state), state);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupElement from '../popups';\nimport {hexToRgb} from '../../helpers/color';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport customProperties from '../../helpers/dom/customProperties';\nimport {GroupCall, GroupCallParticipant} from '../../layer';\nimport type {AppChatsManager} from '../../lib/appManagers/appChatsManager';\nimport type {AppGroupCallsManager} from '../../lib/appManagers/appGroupCallsManager';\nimport type {AppPeersManager} from '../../lib/appManagers/appPeersManager';\nimport GROUP_CALL_STATE from '../../lib/calls/groupCallState';\nimport {RLottieColor} from '../../lib/rlottie/rlottiePlayer';\nimport rootScope from '../../lib/rootScope';\nimport ButtonIcon from '../buttonIcon';\nimport GroupCallMicrophoneIcon from './microphoneIcon';\nimport GroupCallParticipantsElement from './participants';\nimport GroupCallParticipantsVideoElement from './participantVideos';\nimport PopupPeer from '../popups/peer';\nimport GroupCallDescriptionElement from './description';\nimport GroupCallTitleElement from './title';\nimport {addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen} from '../../helpers/dom/fullScreen';\nimport Scrollable from '../scrollable';\nimport {MovableState} from '../movableElement';\nimport animationIntersector from '../animationIntersector';\nimport {IS_APPLE_MOBILE} from '../../environment/userAgent';\nimport throttle from '../../helpers/schedulers/throttle';\nimport IS_SCREEN_SHARING_SUPPORTED from '../../environment/screenSharingSupport';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport makeButton from '../call/button';\nimport MovablePanel from '../../helpers/movablePanel';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport toggleClassName from '../../helpers/toggleClassName';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport themeController from '../../helpers/themeController';\nimport groupCallsController from '../../lib/calls/groupCallsController';\n\nexport enum GROUP_CALL_PARTICIPANT_MUTED_STATE {\n UNMUTED,\n MUTED,\n MUTED_FOR_ME,\n MUTED_BY_ADMIN,\n HAND\n}\n\nexport type GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE = Exclude;\n\nexport function getGroupCallParticipantMutedState(participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n if(participant.pFlags.muted_by_you) {\n return states.MUTED_FOR_ME;\n } else if(participant.raise_hand_rating !== undefined) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return participant.pFlags.can_self_unmute ? states.MUTED : states.MUTED_BY_ADMIN;\n } else {\n return states.UNMUTED;\n }\n}\n\nexport function clearMutedStateModifier(state: GROUP_CALL_PARTICIPANT_MUTED_STATE): GROUP_CALL_PARTICIPANT_CLEARED_MUTED_STATE {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n switch(state) {\n case states.MUTED_BY_ADMIN:\n case states.MUTED_FOR_ME:\n return states.MUTED;\n default:\n return state;\n }\n}\n\nexport function getColorByMutedState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n let colorStr: 'blue' | 'green' | 'secondary' | 'red';\n switch(state) {\n case states.HAND:\n colorStr = 'blue';\n break;\n case states.MUTED:\n case states.MUTED_FOR_ME:\n case states.MUTED_BY_ADMIN:\n colorStr = state === states.MUTED ? 'secondary' : 'red';\n break;\n case states.UNMUTED:\n colorStr = 'green';\n break;\n }\n\n const propertyValue = customProperties.getProperty('gc-' + colorStr + '-text-color');\n const color: RLottieColor = hexToRgb(propertyValue);\n\n return color;\n}\n\nexport enum GROUP_CALL_MICROPHONE_BUTTON_STATE {\n HAND,\n MUTED,\n UNMUTED,\n}\n\nexport function getGroupCallMicrophoneButtonState(groupCall: GroupCall.groupCall, participant: GroupCallParticipant) {\n const states = GROUP_CALL_MICROPHONE_BUTTON_STATE;\n if(!participant.pFlags.can_self_unmute) {\n return states.HAND;\n } else if(participant.pFlags.muted) {\n return states.MUTED\n } else {\n return states.UNMUTED;\n }\n}\n\nlet previousState: MovableState = {\n width: 420,\n height: 640\n};\n\nconst className = 'group-call';\n\nexport default class PopupGroupCall extends PopupElement {\n private instance: GroupCallInstance;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallBodyHeaderDescription: GroupCallDescriptionElement;\n private groupCallParticipants: GroupCallParticipantsElement;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private groupCallMicrophoneIcon: GroupCallMicrophoneIcon;\n private videosCount: number;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n private btnInvite: HTMLButtonElement;\n private btnShowColumn: HTMLButtonElement;\n private movablePanel: MovablePanel;\n private buttonsContainer: HTMLDivElement;\n private btnFullScreen2: HTMLButtonElement;\n private btnVideo: HTMLDivElement;\n private btnScreen: HTMLDivElement;\n\n constructor() {\n super('popup-group-call', {\n body: true,\n withoutOverlay: true,\n closable: true,\n title: true\n });\n\n this.videosCount = 0;\n this.container.classList.add(className, 'night');\n\n const instance = this.instance = groupCallsController.groupCall;\n const {listenerSetter} = this;\n\n if(!IS_APPLE_MOBILE) {\n const btnFullScreen = this.btnFullScreen = ButtonIcon('fullscreen');\n const btnFullScreen2 = this.btnFullScreen2 = ButtonIcon('fullscreen ' + className + '-cfs');\n const btnExitFullScreen = this.btnExitFullScreen = ButtonIcon('smallscreen');\n\n attachClickEvent(btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(btnFullScreen2, this.onFullScreenClick, {listenerSetter});\n\n attachClickEvent(btnExitFullScreen, () => {\n cancelFullScreen();\n }, {listenerSetter});\n\n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n }\n\n const btnInvite = this.btnInvite = ButtonIcon('adduser');\n const btnShowColumn = this.btnShowColumn = ButtonIcon('rightpanel ' + className + '-only-big');\n\n attachClickEvent(btnShowColumn, this.toggleRightColumn, {listenerSetter});\n\n const headerInfo = document.createElement('div');\n headerInfo.classList.add(className + '-header-info');\n\n this.title.classList.add(className + '-header-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-header-subtitle');\n\n headerInfo.append(this.title, subtitle);\n\n this.header.classList.add(className + '-header');\n this.header.append(...[this.btnExitFullScreen, headerInfo/* , btnInvite */, this.btnFullScreen, btnShowColumn].filter(Boolean));\n\n const newHeader = this.header.cloneNode(false) as HTMLElement;\n const newHeaderInfo = headerInfo.cloneNode(false) as HTMLElement;\n const newHeaderTitle = this.title.cloneNode(false) as HTMLElement;\n\n newHeaderInfo.append(newHeaderTitle);\n\n const btnHideColumn = ButtonIcon('rightpanel');\n newHeader.append(...[btnHideColumn, newHeaderInfo, this.btnFullScreen2].filter(Boolean));\n\n attachClickEvent(btnHideColumn, this.toggleRightColumn, {listenerSetter});\n\n this.body.prepend(newHeader);\n\n const videosScrollable = new Scrollable(undefined);\n videosScrollable.container.classList.add('group-call-big-video-container');\n this.container.append(videosScrollable.container);\n\n this.groupCallTitle = new GroupCallTitleElement(this.title);\n this.groupCallDescription = new GroupCallDescriptionElement(subtitle);\n this.groupCallBodyHeaderDescription = new GroupCallDescriptionElement(newHeaderTitle);\n this.constructButtons();\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n appendTo: videosScrollable.container,\n instance,\n listenerSetter,\n displayPinned: true,\n onLengthChange: (length) => {\n this.videosCount = length;\n this.toggleBigLayout();\n },\n managers: this.managers\n });\n this.groupCallParticipants = new GroupCallParticipantsElement({\n appendTo: this.body,\n instance,\n listenerSetter,\n managers: this.managers\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: 400,\n minHeight: 480,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'chatlist') ||\n findUpClassName(target, 'group-call-button') ||\n findUpClassName(target, 'btn-icon') ||\n findUpClassName(target, 'group-call-participants-video-container') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n onResize: () => this.toggleBigLayout(),\n previousState\n });\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n if(this.instance?.id === groupCall.id) {\n this.updateInstance();\n }\n });\n\n listenerSetter.add(instance)('pinned', () => {\n this.setHasPinned();\n });\n\n listenerSetter.add(this.groupCallParticipantsVideo)('toggleControls', this.onToggleControls);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.groupCallParticipantsVideo.destroy();\n this.groupCallParticipants.destroy();\n this.groupCallMicrophoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.toggleRightColumn();\n this.onFullScreenChange();\n\n this.updateInstance();\n }\n\n private constructButtons() {\n const buttons = this.buttonsContainer = document.createElement('div');\n buttons.classList.add(className + '-buttons');\n\n const _makeButton = makeButton.bind(null, className, this.listenerSetter);\n\n const btnVideo = this.btnVideo = _makeButton({\n // text: 'VoiceChat.Video.Stream.Video',\n callback: this.onVideoClick,\n icon: 'videocamera_filled'\n });\n\n const btnScreen = this.btnScreen = _makeButton({\n // text: 'VoiceChat.Video.Stream.Screencast',\n callback: this.onScreenClick,\n icon: 'sharescreen_filled'\n });\n\n btnScreen.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnMute = _makeButton({\n noRipple: true,\n callback: throttle(this.onMuteClick, 600, true)\n });\n btnMute.classList.add(className + '-microphone-button');\n\n const microphoneIcon = this.groupCallMicrophoneIcon = new GroupCallMicrophoneIcon();\n btnMute.append(microphoneIcon.container);\n\n const btnMore = _makeButton({\n // text: 'VoiceChat.Video.Stream.More'\n icon: 'settings_filled'\n });\n\n btnMore.classList.add('btn-disabled');\n btnMore.classList.toggle('hide', !IS_SCREEN_SHARING_SUPPORTED);\n\n const btnLeave = _makeButton({\n // text: 'VoiceChat.Leave',\n isDanger: true,\n callback: this.onLeaveClick,\n icon: 'close'\n });\n\n buttons.append(btnVideo, btnScreen, btnMute, btnMore, btnLeave);\n\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onToggleControls = (show: boolean) => {\n this.container.classList.toggle('show-controls', show);\n this.buttonsContainer.classList.toggle('show-controls', show);\n };\n\n private toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n\n private onVideoClick = () => {\n const toggle = this.toggleDisability([this.btnVideo], true);\n this.instance.toggleVideoSharing().finally(() => {\n toggle();\n });\n };\n\n private onScreenClick = () => {\n const toggle = this.toggleDisability([this.btnScreen], true);\n this.instance.toggleScreenSharing().finally(() => {\n toggle();\n });\n };\n\n private onMuteClick = () => {\n const participant = this.instance.participant;\n if(!participant.pFlags.can_self_unmute) {\n if(participant.raise_hand_rating === undefined) {\n this.instance.changeRaiseHand(true);\n }\n } else {\n this.instance.toggleMuted();\n }\n };\n\n private onLeaveClick = async() => {\n const hangUp = (discard: boolean) => {\n this.instance.hangUp(discard);\n };\n\n if(await this.managers.appChatsManager.hasRights(this.instance.chatId, 'manage_call')) {\n new PopupPeer('popup-end-video-chat', {\n titleLangKey: 'VoiceChat.End.Title',\n descriptionLangKey: 'VoiceChat.End.Text',\n checkboxes: [{\n text: 'VoiceChat.End.Third'\n }],\n buttons: [{\n langKey: 'VoiceChat.End.OK',\n callback: (checkboxes) => {\n hangUp(!!checkboxes.size);\n },\n isDanger: true\n }]\n }).show();\n } else {\n hangUp(false);\n }\n };\n\n public getContainer() {\n return this.container;\n }\n\n private onFullScreenChange = () => {\n this.toggleBigLayout();\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations2(isFull);\n\n themeController.setThemeColor(isFull ? '#000000' : undefined);\n }\n };\n\n private toggleBigLayout = () => {\n const isFull = isFullScreen();\n const movable = this.movablePanel?.movable;\n const isBig = (isFull || !!(movable && movable.width >= 680)) && !!this.videosCount;\n\n /* if(!isBig && isFull) {\n cancelFullScreen();\n return;\n } */\n\n const wasBig = this.container.classList.contains('is-big-layout');\n let buttons: HTMLElement[];\n if(isBig && !wasBig) { // fix buttons transition to 0 opacity\n buttons = Array.from(this.buttonsContainer.children) as HTMLElement[];\n buttons.forEach((element) => {\n element.style.opacity = '0';\n });\n\n void this.buttonsContainer.offsetLeft;\n }\n\n this.container.classList.toggle('is-big-layout', isBig);\n this.btnInvite.classList.toggle('hide', isBig);\n this.btnShowColumn.classList.toggle('hide', !isBig);\n\n if(buttons) {\n // window.requestAnimationFrame(() => {\n buttons.forEach((element) => {\n element.style.opacity = '';\n });\n // });\n }\n };\n\n private toggleRightColumn = () => {\n this.container.classList.toggle('is-right-column-shown');\n };\n\n private setHasPinned() {\n this.container.classList.toggle('has-pinned', !!this.instance.pinnedSource);\n }\n\n private updateInstance() {\n if(this.instance.state === GROUP_CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.hide();\n return;\n }\n\n const {participant, groupCall} = this.instance;\n if(!participant) {\n return;\n }\n\n this.setTitle();\n this.setDescription();\n this.setHasPinned();\n\n const microphoneButtonState = getGroupCallMicrophoneButtonState(groupCall as any, participant);\n this.container.dataset.micState = microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.HAND ? 'hand' : (microphoneButtonState === GROUP_CALL_MICROPHONE_BUTTON_STATE.MUTED ? 'muted' : 'unmuted');\n this.groupCallMicrophoneIcon.setState(microphoneButtonState);\n }\n\n private setTitle() {\n this.groupCallTitle.update(this.instance);\n }\n\n private setDescription() {\n this.groupCallDescription.update(this.instance);\n this.groupCallBodyHeaderDescription.update(this.instance);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {GroupCallParticipant} from '../../layer';\nimport {i18n} from '../../lib/langPack';\nimport {GROUP_CALL_PARTICIPANT_MUTED_STATE} from '.';\nimport {GroupCallParticipantVideoType} from './participantVideo';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\n\nconst className = 'group-call-participant-status';\nexport default class GroupCallParticipantStatusElement {\n public container: HTMLElement;\n\n constructor(private withIcons: GroupCallParticipantVideoType[]) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n }\n\n public setState(state: GROUP_CALL_PARTICIPANT_MUTED_STATE, participant: GroupCallParticipant) {\n const states = GROUP_CALL_PARTICIPANT_MUTED_STATE;\n const icons = this.withIcons.filter((type) => !!participant[type]).map((type) => {\n const iconClassName = `tgico-${type === 'presentation' ? 'listscreenshare' : 'videocamera_filled'}`;\n const i = document.createElement('i');\n i.classList.add(className + '-icon', className + '-icon-' + type, iconClassName);\n return i;\n });\n\n let element2: HTMLElement, actionClassName: string;\n if(state === states.MUTED_FOR_ME) {\n element2 = i18n('VoiceChat.Status.MutedForYou');\n actionClassName = 'is-muted';\n } else if(state === states.UNMUTED) {\n element2 = i18n('VoiceChat.Status.Speaking');\n actionClassName = 'is-speaking';\n } else if(state === states.HAND) {\n element2 = i18n('VoiceChat.Status.WantsSpeak');\n actionClassName = 'is-waiting';\n } else if(participant.about && !icons.length) {\n setInnerHTML(this.container, wrapEmojiText(participant.about));\n return;\n } else {\n element2 = i18n('VoiceChat.Status.Listening');\n actionClassName = 'is-listening';\n }\n\n const span = document.createElement('span');\n span.classList.add(className, actionClassName);\n span.append(...icons, element2);\n\n replaceContent(this.container, span);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport positionElementByIndex from '../../helpers/dom/positionElementByIndex';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport {fastRaf} from '../../helpers/schedulers';\nimport SortedList, {SortedElementBase} from '../../helpers/sortedList';\nimport appDialogsManager, {DialogDom, AppDialogsManager, DialogElementSize} from '../../lib/appManagers/appDialogsManager';\nimport {getGroupCallParticipantMutedState} from '.';\nimport GroupCallParticipantMutedIcon from './participantMutedIcon';\nimport GroupCallParticipantStatusElement from './participantStatus';\nimport type GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport type LazyLoadQueue from '../lazyLoadQueue';\n\ninterface SortedParticipant extends SortedElementBase {\n dom: DialogDom,\n mutedIcon: GroupCallParticipantMutedIcon,\n status: GroupCallParticipantStatusElement\n}\n\nexport default class GroupCallParticipantsList extends SortedList {\n public list: HTMLUListElement;\n\n protected lazyLoadQueue: LazyLoadQueue;\n protected avatarSize: DialogElementSize = 'abitbigger';\n protected rippleEnabled = true;\n protected autonomous = true;\n protected createChatListOptions: Parameters[0] = {/* new: true, */dialogSize: 72};\n\n constructor(private instance: GroupCallInstance) {\n super({\n getIndex: async(element) => (await this.instance.getParticipantByPeerId(element.id)).date,\n onDelete: (element) => {\n element.dom.listEl.remove();\n this.onElementDestroy(element);\n },\n onUpdate: async(element) => {\n const participant = await this.instance.getParticipantByPeerId(element.id);\n const state = getGroupCallParticipantMutedState(participant);\n\n element.mutedIcon.setState(state);\n element.status.setState(state, participant);\n },\n onSort: (element, idx) => {\n positionElementByIndex(element.dom.listEl, this.list, idx);\n },\n onElementCreate: (base) => {\n const {dom} = appDialogsManager.addDialogNew({\n peerId: base.id,\n container: false,\n avatarSize: this.avatarSize,\n autonomous: this.autonomous,\n meAsSaved: false,\n rippleEnabled: this.rippleEnabled,\n wrapOptions: {\n lazyLoadQueue: this.lazyLoadQueue\n }\n });\n\n const className = 'group-call-participant';\n dom.listEl.classList.add(className);\n\n const mutedIcon = new GroupCallParticipantMutedIcon(true);\n const status = new GroupCallParticipantStatusElement(['presentation', 'video']);\n replaceContent(dom.lastMessageSpan, status.container);\n dom.listEl.append(mutedIcon.container);\n (base as SortedParticipant).mutedIcon = mutedIcon;\n (base as SortedParticipant).status = status;\n\n /* instance.getParticipantByPeerId(base.id).then((participant) => {\n const mutedState = getGroupCallParticipantMutedState(participant);\n\n mutedIcon.setState(mutedState);\n status.setState(mutedState, participant);\n }); */\n\n (base as SortedParticipant).dom = dom;\n\n return base as SortedParticipant;\n },\n updateElementWith: fastRaf\n });\n\n this.list = appDialogsManager.createChatList(this.createChatListOptions);\n }\n\n public destroy() {\n this.elements.forEach((element) => {\n this.onElementDestroy(element);\n });\n }\n\n protected onElementDestroy(element: SortedParticipant) {\n element.mutedIcon.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {animate} from '../../helpers/animation';\n\nexport default function callVideoCanvasBlur(video: HTMLVideoElement) {\n const canvas = document.createElement('canvas');\n canvas.classList.add('call-video-blur');\n const size = 16;\n canvas.width = size;\n canvas.height = size;\n\n const ctx = canvas.getContext('2d', {alpha: false});\n ctx.filter = 'blur(2px)';\n const renderFrame = () => {\n ctx.drawImage(video, 0, 0, video.videoWidth, video.videoHeight, 0, 0, canvas.width, canvas.height);\n };\n\n animate(() => {\n renderFrame();\n return canvas.isConnected;\n });\n\n renderFrame();\n\n return canvas;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GroupCallParticipant} from '../../layer';\nimport type {GroupCallOutputSource} from '../../lib/appManagers/appGroupCallsManager';\nimport {i18n} from '../../lib/langPack';\nimport PeerTitle from '../peerTitle';\nimport {getGroupCallParticipantMutedState} from '.';\nimport GroupCallParticipantMutedIcon from './participantMutedIcon';\nimport GroupCallParticipantStatusElement from './participantStatus';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport callVideoCanvasBlur from '../call/videoCanvasBlur';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport {AppManagers} from '../../lib/appManagers/managers';\n\nconst className = 'group-call-participant-video';\n\nexport type GroupCallParticipantVideoType = 'video' | 'presentation';\nexport default class GroupCallParticipantVideoElement {\n public container: HTMLElement;\n private peerTitle: PeerTitle;\n private subtitle: HTMLElement;\n private info: HTMLElement;\n private left: HTMLElement;\n private right: HTMLElement;\n private header: HTMLElement;\n private groupCallParticipantMutedIcon: GroupCallParticipantMutedIcon;\n private groupCallParticipantStatus: GroupCallParticipantStatusElement;\n\n constructor(private managers: AppManagers, private instance: GroupCallInstance, public source: GroupCallOutputSource) {\n this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n\n this.info = document.createElement('div');\n this.info.classList.add(className + '-info');\n\n this.left = document.createElement('div');\n this.left.classList.add(className + '-info-left');\n\n this.right = document.createElement('div');\n this.right.classList.add(className + '-info-right');\n\n this.info.append(this.left, this.right);\n\n this.container.append(this.info);\n }\n\n public setPinned(value: boolean) {\n if(!value) {\n if(this.header) {\n this.header.remove();\n this.header = undefined;\n }\n\n return;\n } else if(this.header) {\n return;\n }\n\n // if(!this.header) {\n this.header = document.createElement('div');\n this.header.classList.add(className + '-header');\n\n const icon = document.createElement('i');\n icon.classList.add('group-call-pin-icon', 'tgico-pin');\n this.header.append(icon);\n\n this.container.append(this.header);\n // }\n\n // this.container.classList.toggle('is-pinned', value);\n }\n\n public setParticipant(participant: GroupCallParticipant, type: GroupCallParticipantVideoType, video: HTMLVideoElement) {\n let peerTitleElement: HTMLElement;\n if(participant.pFlags.self) {\n peerTitleElement = i18n('VoiceChat.Status.You');\n peerTitleElement.classList.add('peer-title');\n } else {\n this.peerTitle = new PeerTitle({\n peerId: getPeerId(participant.peer)\n });\n\n peerTitleElement = this.peerTitle.element;\n }\n\n this.groupCallParticipantMutedIcon = new GroupCallParticipantMutedIcon(false);\n this.groupCallParticipantStatus = new GroupCallParticipantStatusElement([type]);\n\n this.left.append(peerTitleElement, this.groupCallParticipantStatus.container);\n\n this.right.append(this.groupCallParticipantMutedIcon.container);\n\n video.classList.add(className, 'call-video');\n\n if(video.paused) {\n video.play();\n }\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(className + '-blur');\n\n this.container.prepend(canvas, video);\n\n this.updateParticipant(participant);\n }\n\n public updateParticipant(participant: GroupCallParticipant) {\n const state = getGroupCallParticipantMutedState(participant);\n\n this.groupCallParticipantMutedIcon.setState(state);\n this.groupCallParticipantStatus.setState(state, participant);\n }\n\n public destroy() {\n this.groupCallParticipantMutedIcon.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport ControlsHover from '../../helpers/dom/controlsHover';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {GroupCallParticipant} from '../../layer';\nimport {GroupCallOutputSource} from '../../lib/appManagers/appGroupCallsManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport rootScope from '../../lib/rootScope';\nimport GroupCallParticipantVideoElement, {GroupCallParticipantVideoType} from './participantVideo';\n\nexport default class GroupCallParticipantsVideoElement extends ControlsHover {\n private container: HTMLDivElement;\n private instance: GroupCallInstance;\n private participantsElements: Map>;\n private displayPinned: boolean;\n private containers: Map;\n private onLengthChange: (length: number) => void;\n private managers: AppManagers;\n\n constructor(options: {\n appendTo: HTMLElement,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n displayPinned: boolean,\n onLengthChange?: GroupCallParticipantsVideoElement['onLengthChange'],\n managers: AppManagers\n }) {\n super();\n safeAssign(this, options);\n\n const className = 'group-call-participants-video';\n const container = this.container = document.createElement('div');\n this.container.classList.add(className + '-container');\n\n options.appendTo.append(container);\n\n this.participantsElements = new Map();\n this.containers = new Map();\n\n const {listenerSetter} = this;\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n listenerSetter.add(this.instance)('pinned', (source) => {\n this.participantsElements.forEach((map) => {\n map.forEach((element) => {\n this.setElementDisplay(element, source);\n });\n });\n });\n\n attachClickEvent(this.container, (e) => {\n const container = findUpClassName(e.target, 'group-call-participant-video-container');\n if(!container) {\n return;\n }\n\n const element = this.containers.get(container);\n if(this.instance.pinnedSource === element.source) {\n this.instance.unpinAll();\n return;\n }\n\n this.instance.pinSource(element.source);\n }, {listenerSetter});\n\n this.setInstance(this.instance);\n\n this.setup({\n element: container,\n listenerSetter: listenerSetter,\n showOnLeaveToClassName: 'group-call-buttons'\n });\n }\n\n private shouldDisplayElement(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n return this.displayPinned ? !pinnedSource || element.source === pinnedSource : pinnedSource && element.source !== pinnedSource;\n }\n\n private setElementDisplay(element: GroupCallParticipantVideoElement, pinnedSource: GroupCallOutputSource) {\n const shouldDisplay = this.shouldDisplayElement(element, pinnedSource);\n element.container.classList.toggle('video-hidden', !shouldDisplay);\n\n const isPinned = element.source === pinnedSource;\n element.setPinned(isPinned);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = getPeerId(participant.peer);\n const types: GroupCallParticipantVideoType[] = ['video', 'presentation'];\n const hasAnyVideo = types.some((type) => !!participant[type]);\n let participantElements = this.participantsElements.get(peerId);\n if(!hasAnyVideo && !participantElements) {\n return;\n }\n\n if(!participantElements) {\n this.participantsElements.set(peerId, participantElements = new Map());\n }\n\n types.forEach((type) => {\n let element = participantElements.get(type);\n const participantVideo = participant[type];\n if(!!participantVideo === !!element) {\n if(element) {\n element.updateParticipant(participant);\n }\n\n return;\n }\n\n if(participantVideo) {\n const result = this.instance.getVideoElementFromParticipantByType(participant, type);\n if(!result) {\n return;\n }\n\n const {video, source} = result;\n\n element = new GroupCallParticipantVideoElement(this.managers, this.instance, source);\n\n this.containers.set(element.container, element);\n\n this.setElementDisplay(element, this.instance.pinnedSource);\n participantElements.set(type, element);\n element.setParticipant(participant, type, video);\n\n this.container.prepend(element.container);\n } else {\n participantElements.delete(type);\n element.container.remove();\n\n if(!participantElements.size) {\n this.participantsElements.delete(peerId);\n this.containers.delete(element.container);\n element.destroy();\n }\n }\n\n this._onLengthChange();\n });\n }\n\n private _onLengthChange() {\n const length = this.container.childElementCount;\n this.container.dataset.length = '' + length;\n this.container.dataset.layout = length <= 2 ? '1' : (length === 3 ? '3' : '4');\n\n this.onLengthChange && this.onLengthChange(length);\n }\n\n public async setInstance(instance: GroupCallInstance) {\n (await instance.participants).forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n\n public destroy() {\n this.containers.forEach((element) => {\n element.destroy();\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport PopupGroupCall from '.';\nimport filterAsync from '../../helpers/array/filterAsync';\nimport contextMenuController from '../../helpers/contextMenuController';\nimport {attachContextMenuListener} from '../../helpers/dom/attachContextMenuListener';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport {addFullScreenListener, isFullScreen} from '../../helpers/dom/fullScreen';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport noop from '../../helpers/noop';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport positionMenu from '../../helpers/positionMenu';\nimport ScrollableLoader from '../../helpers/scrollableLoader';\nimport {GroupCallParticipant} from '../../layer';\nimport appImManager from '../../lib/appManagers/appImManager';\nimport {AppManagers} from '../../lib/appManagers/managers';\nimport getPeerId from '../../lib/appManagers/utils/peers/getPeerId';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport rootScope from '../../lib/rootScope';\nimport {ButtonMenuItemOptions, ButtonMenuSync} from '../buttonMenu';\nimport confirmationPopup from '../confirmationPopup';\nimport PeerTitle from '../peerTitle';\nimport PopupElement from '../popups';\nimport Scrollable from '../scrollable';\nimport GroupCallParticipantsList from './participantsList';\nimport GroupCallParticipantsVideoElement from './participantVideos';\n\nexport class GroupCallParticipantContextMenu {\n private buttons: (ButtonMenuItemOptions & {verify: (peerId: PeerId) => boolean | Promise})[];\n private element: HTMLElement;\n private chatId: ChatId;\n private targetPeerId: PeerId;\n private participant: GroupCallParticipant;\n private instance: GroupCallInstance;\n private canManageCall: boolean;\n private managers: AppManagers;\n\n constructor(options: {\n listenerSetter: ListenerSetter,\n onContextElement: HTMLElement,\n managers: AppManagers,\n instance: GroupCallInstance,\n }) {\n this.buttons = [{\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MutePeer',\n verify: () => this.canManageCall && this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmutePeer',\n verify: () => this.canManageCall && !this.participant.pFlags.can_self_unmute,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'gc_microphoneoff',\n text: 'VoiceChat.MuteForMe',\n verify: () => !this.canManageCall && !this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(true)\n }, {\n icon: 'gc_microphone',\n text: 'VoiceChat.UnmuteForMe',\n verify: () => !this.canManageCall && this.participant.pFlags.muted_by_you,\n onClick: () => this.toggleParticipantMuted(false)\n }, {\n icon: 'newprivate',\n text: 'VoiceChat.OpenProfile',\n verify: () => true,\n onClick: this.onOpenProfileClick\n }, {\n icon: 'deleteuser danger',\n text: 'VoiceChat.RemovePeer',\n verify: () => this.managers.appChatsManager.hasRights(this.chatId, 'ban_users'),\n onClick: async() => {\n confirmationPopup({\n peerId: this.targetPeerId,\n title: new PeerTitle({peerId: this.targetPeerId}).element,\n descriptionLangKey: await this.managers.appChatsManager.isBroadcast(this.chatId) ? 'VoiceChat.RemovePeer.Confirm.Channel' : 'VoiceChat.RemovePeer.Confirm',\n descriptionLangArgs: [new PeerTitle({peerId: this.targetPeerId}).element],\n button: {\n langKey: 'VoiceChat.RemovePeer.Confirm.OK',\n isDanger: true\n }\n }).then(() => {\n this.managers.appChatsManager.kickFromChat(this.chatId, this.targetPeerId);\n }, noop);\n }\n }];\n\n const {listenerSetter} = options;\n this.managers = options.managers;\n this.instance = options.instance;\n this.chatId = this.instance.chatId;\n\n this.element = ButtonMenuSync({buttons: this.buttons, listenerSetter});\n this.element.classList.add('group-call-participant-menu', 'night');\n\n attachContextMenuListener({\n element: options.onContextElement,\n callback: async(e) => {\n const li = findUpClassName(e.target, 'group-call-participant');\n if(!li) {\n return;\n }\n\n if(this.element.parentElement !== appendTo) {\n appendTo.append(this.element);\n }\n\n cancelEvent(e);\n\n const peerId = this.targetPeerId = li.dataset.peerId.toPeerId();\n this.participant = await this.instance.getParticipantByPeerId(peerId);\n if(this.participant.pFlags.self) {\n return;\n }\n\n this.canManageCall = await this.managers.appChatsManager.hasRights(this.chatId, 'manage_call');\n\n await filterAsync(this.buttons, async(button) => {\n const good = await button.verify(peerId);\n button.element.classList.toggle('hide', !good);\n return good;\n });\n\n positionMenu((e as TouchEvent).touches ? (e as TouchEvent).touches[0] : e as MouseEvent, this.element, 'right');\n contextMenuController.openBtnMenu(this.element);\n },\n listenerSetter\n });\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n const peerId = getPeerId(participant.peer);\n if(this.targetPeerId === peerId) {\n contextMenuController.close();\n }\n }\n });\n\n let appendTo: HTMLElement = document.body;\n addFullScreenListener(document.body, () => {\n const isFull = isFullScreen();\n appendTo = isFull ? PopupElement.getPopups(PopupGroupCall)[0].getContainer(): document.body;\n\n if(!isFull) {\n contextMenuController.close();\n }\n }, listenerSetter);\n }\n\n private onOpenProfileClick = () => {\n const popup = PopupElement.getPopups(PopupGroupCall)[0];\n if(popup) {\n popup.hide();\n }\n\n appImManager.setInnerPeer({peerId: this.targetPeerId});\n };\n\n private toggleParticipantMuted = (muted: boolean) => {\n this.instance.editParticipant(this.participant, {\n muted\n });\n };\n};\n\nexport default class GroupCallParticipantsElement {\n private container: HTMLDivElement;\n private sortedList: GroupCallParticipantsList;\n private instance: GroupCallInstance;\n private listenerSetter: ListenerSetter;\n private groupCallParticipantsVideo: GroupCallParticipantsVideoElement;\n private contextMenu: GroupCallParticipantContextMenu;\n private managers: AppManagers;\n\n constructor(options: {\n appendTo: HTMLElement,\n instance: GroupCallInstance,\n listenerSetter: ListenerSetter,\n managers: AppManagers\n }) {\n safeAssign(this, options);\n\n const className = 'group-call-participants';\n\n const scrollable = new Scrollable(undefined);\n scrollable.container.classList.add(className + '-scrollable');\n\n const container = this.container = document.createElement('div');\n container.classList.add(className);\n\n // const invite = Button(`btn-primary btn-transparent ${className}-invite`, {icon: 'adduser', text: 'VoiceChat.Invite.InviteMembers'});\n\n const sortedList = this.sortedList = new GroupCallParticipantsList(this.instance);\n\n const {instance, listenerSetter} = this;\n this.contextMenu = new GroupCallParticipantContextMenu({\n ...options,\n onContextElement: sortedList.list,\n listenerSetter,\n instance\n });\n\n this.groupCallParticipantsVideo = new GroupCallParticipantsVideoElement({\n ...options,\n appendTo: scrollable.container,\n displayPinned: false\n });\n\n scrollable.append(/* invite, */sortedList.list);\n container.append(scrollable.container);\n\n options.appendTo.append(container);\n\n listenerSetter.add(rootScope)('group_call_participant', ({groupCallId, participant}) => {\n if(this.instance.id === groupCallId) {\n this.updateParticipant(participant);\n }\n });\n\n const scrollableLoader = new ScrollableLoader({\n scrollable,\n getPromise: () => {\n return this.managers.appGroupCallsManager.getGroupCallParticipants(this.instance.id).then(({participants, isEnd}) => {\n participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n\n return isEnd;\n });\n }\n });\n\n this.setInstance(instance);\n }\n\n private updateParticipant(participant: GroupCallParticipant) {\n const peerId = getPeerId(participant.peer);\n const has = this.sortedList.has(peerId);\n if(participant.pFlags.left) {\n if(has) {\n this.sortedList.delete(peerId);\n }\n\n return;\n }\n\n if(!has) {\n this.sortedList.add(peerId);\n return;\n }\n\n this.sortedList.update(peerId);\n }\n\n public async setInstance(instance: GroupCallInstance) {\n // @ts-ignore\n /* const users = appUsersManager.users;\n for(const userId in users) {\n const participant: GroupCallParticipant = {\n _: 'groupCallParticipant',\n date: 0,\n peer: {_: 'peerUser', user_id: userId.toPeerId()},\n pFlags: {\n muted: true\n },\n source: 1\n };\n\n instance.participants.set(userId.toPeerId(), participant);\n this.updateParticipant(participant);\n } */\n const participants = await instance.participants;\n participants.forEach((participant) => {\n this.updateParticipant(participant);\n });\n }\n\n public destroy() {\n this.sortedList.destroy();\n this.groupCallParticipantsVideo.destroy();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GroupCall} from '../../layer';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport GROUP_CALL_STATE from '../../lib/calls/groupCallState';\nimport I18n, {LangPackKey, FormatterArguments} from '../../lib/langPack';\n\nexport default class GroupCallDescriptionElement {\n private descriptionIntl: I18n.IntlElement;\n\n constructor(private appendTo: HTMLElement) {\n this.descriptionIntl = new I18n.IntlElement({\n key: 'VoiceChat.Status.Connecting'\n });\n\n this.descriptionIntl.element.classList.add('group-call-description');\n }\n\n public detach() {\n this.descriptionIntl.element.remove();\n }\n\n public update(instance: GroupCallInstance) {\n const {state} = instance;\n\n let key: LangPackKey, args: FormatterArguments;\n if(state === GROUP_CALL_STATE.CONNECTING) {\n key = 'VoiceChat.Status.Connecting';\n } else {\n key = 'VoiceChat.Status.Members';\n args = [(instance.groupCall as GroupCall.groupCall).participants_count];\n }\n\n const {descriptionIntl} = this;\n descriptionIntl.compareAndUpdate({\n key,\n args\n });\n\n if(!this.descriptionIntl.element.parentElement) {\n this.appendTo.append(this.descriptionIntl.element);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport setInnerHTML from '../../helpers/dom/setInnerHTML';\nimport {GroupCall} from '../../layer';\nimport GroupCallInstance from '../../lib/calls/groupCallInstance';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport PeerTitle from '../peerTitle';\n\nexport default class GroupCallTitleElement {\n private peerTitle: PeerTitle;\n\n constructor(private appendTo: HTMLElement) {\n this.peerTitle = new PeerTitle({peerId: 0});\n }\n\n public update(instance: GroupCallInstance) {\n const {peerTitle, appendTo} = this;\n const groupCall = instance.groupCall as GroupCall.groupCall;\n const peerId = instance.chatId.toPeerId(true);\n if(groupCall.title) {\n setInnerHTML(appendTo, wrapEmojiText(groupCall.title));\n } else {\n if(peerTitle.options.peerId !== peerId) {\n peerTitle.options.peerId = peerId;\n peerTitle.update();\n }\n\n if(peerTitle.element.parentElement !== appendTo) {\n appendTo.append(peerTitle.element);\n }\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport ListenerSetter from '../../helpers/listenerSetter';\nimport {i18n, LangPackKey} from '../../lib/langPack';\nimport ripple from '../ripple';\n\nexport default function makeButton(className: string, listenerSetter: ListenerSetter, options: {\n text?: LangPackKey | HTMLElement,\n isDanger?: boolean,\n noRipple?: boolean,\n callback?: () => void,\n icon?: string,\n isConfirm?: boolean,\n}) {\n const _className = className + '-button';\n const buttonDiv = document.createElement('div');\n buttonDiv.classList.add(_className, 'call-button', 'rp-overflow');\n\n if(options.icon) {\n buttonDiv.classList.add('tgico-' + options.icon);\n }\n\n if(!options.noRipple) {\n ripple(buttonDiv);\n }\n\n if(options.isDanger) {\n buttonDiv.classList.add(_className + '-red');\n }\n\n if(options.isConfirm) {\n buttonDiv.classList.add(_className + '-green');\n }\n\n if(options.callback) {\n attachClickEvent(buttonDiv, options.callback, {listenerSetter});\n }\n\n let ret = buttonDiv;\n if(options.text) {\n const div = document.createElement('div');\n div.classList.add(_className + '-container', 'call-button-container');\n\n const textEl = typeof(options.text) === 'string' ? i18n(options.text) : options.text;\n textEl.classList.add(_className + '-text', 'call-button-text');\n\n div.append(buttonDiv, textEl);\n\n ret = div;\n }\n\n return ret;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findUpClassName from '../helpers/dom/findUpClassName';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport mediaSizes from '../helpers/mediaSizes';\nimport clamp from '../helpers/number/clamp';\nimport safeAssign from '../helpers/object/safeAssign';\nimport windowSize from '../helpers/windowSize';\nimport SwipeHandler from './swipeHandler';\n\ntype ResizeSide = 'n' | 'e' | 's' | 'w' | 'ne' | 'se' | 'sw' | 'nw';\nexport type MovableState = {\n top?: number;\n left?: number;\n width: number;\n height: number;\n};\n\nconst className = 'movable-element';\nconst resizeHandlerClassName = className + '-resize-handler';\n\nexport type MovableElementOptions = {\n minWidth: MovableElement['minWidth'],\n minHeight: MovableElement['minHeight'],\n element: MovableElement['element'],\n verifyTouchTarget?: MovableElement['verifyTouchTarget']\n};\n\nexport default class MovableElement extends EventListenerBase<{\n resize: () => void\n}> {\n private minWidth: number;\n private minHeight: number;\n private element: HTMLElement;\n private verifyTouchTarget: SwipeHandler['verifyTouchTarget'];\n\n private top: number;\n private left: number;\n private _width: number;\n private _height: number;\n\n private swipeHandler: SwipeHandler;\n private handlers: HTMLElement[];\n\n constructor(options: MovableElementOptions) {\n super(true);\n safeAssign(this, options);\n\n this.top = this.left = this.width = this.height = 0;\n this.element.classList.add(className);\n\n this.addResizeHandlers();\n this.setSwipeHandler();\n\n mediaSizes.addEventListener('resize', this.onResize);\n }\n\n private onResize = () => {\n this.fixDimensions();\n this.fixPosition();\n this.setPosition();\n };\n\n public destroyElements() {\n this.element.classList.remove(className);\n\n if(this.handlers) {\n this.handlers.forEach((handler) => {\n handler.remove();\n });\n }\n }\n\n public destroy() {\n mediaSizes.removeEventListener('resize', this.onResize);\n this.swipeHandler.removeListeners();\n }\n\n private addResizeHandlers() {\n const sides: ResizeSide[] = ['n', 'e', 's', 'w', 'ne', 'se', 'sw', 'nw'];\n this.handlers = sides.map((side) => {\n const div = document.createElement('div');\n div.dataset.side = side;\n div.classList.add(resizeHandlerClassName, resizeHandlerClassName + '-side-' + side);\n this.element.append(div);\n return div;\n });\n }\n\n private setSwipeHandler() {\n let startTop: number, startLeft: number, startWidth: number, startHeight: number, resizingSide: ResizeSide;\n const swipeHandler = this.swipeHandler = new SwipeHandler({\n element: this.element,\n onSwipe: (xDiff, yDiff, e) => {\n // console.log(xDiff, yDiff, e);\n\n if(resizingSide) {\n if(resizingSide.includes('e') || resizingSide.includes('w')) {\n const isEnlarging = resizingSide.includes('e') && xDiff > 0 || resizingSide.includes('w') && xDiff < 0;\n const resizeDiff = Math.abs(xDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('e') ? windowSize.width - startLeft : startWidth + startLeft;\n this.width = Math.min(maxPossible, startWidth + resizeDiff);\n }\n\n if(resizingSide.includes('n') || resizingSide.includes('s')) {\n const isEnlarging = resizingSide.includes('s') && yDiff > 0 || resizingSide.includes('n') && yDiff < 0;\n const resizeDiff = Math.abs(yDiff) * (isEnlarging ? 1 : -1);\n\n const maxPossible = resizingSide.includes('s') ? windowSize.height - startTop : startHeight + startTop;\n this.height = Math.min(maxPossible, startHeight + resizeDiff);\n }\n\n this.fixDimensions();\n\n if(resizingSide.includes('w')) {\n this.left = Math.min(startLeft + startWidth - this.minWidth, startLeft + xDiff);\n }\n\n if(resizingSide.includes('n')) {\n this.top = Math.min(startTop + startHeight - this.minHeight, startTop + yDiff);\n }\n } else {\n this.top = startTop + yDiff;\n this.left = startLeft + xDiff;\n }\n\n this.fixPosition();\n this.setPosition();\n },\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(this.verifyTouchTarget && !this.verifyTouchTarget(e)) {\n return false;\n }\n\n const resizeHandler = findUpClassName(target, resizeHandlerClassName);\n if(resizeHandler) {\n resizingSide = resizeHandler.dataset.side as ResizeSide;\n swipeHandler.setCursor('');\n } else {\n resizingSide = undefined;\n swipeHandler.setCursor('grabbing');\n }\n\n return true;\n },\n onFirstSwipe: () => {\n startTop = this.top;\n startLeft = this.left;\n startWidth = this.width;\n startHeight = this.height;\n }\n });\n }\n\n public setPositionToCenter() {\n this.top = (windowSize.height / 2) - (this.height / 2);\n this.left = (windowSize.width / 2) - (this.width / 2);\n this.setPosition();\n }\n\n private fixDimensions() {\n this.width = clamp(this.width, this.minWidth, windowSize.width);\n this.height = clamp(this.height, this.minHeight, windowSize.height);\n }\n\n private fixPosition() {\n this.top = clamp(this.top, 0, windowSize.height - this.height);\n this.left = clamp(this.left, 0, windowSize.width - this.width);\n }\n\n private setPosition() {\n this.element.style.top = this.top + 'px';\n this.element.style.left = this.left + 'px';\n this.element.style.right = 'auto';\n this.element.style.bottom = 'auto';\n this.element.style.width = this.width + 'px';\n this.element.style.height = this.height + 'px';\n\n this.dispatchEvent('resize');\n }\n\n public get width() {\n return this._width;\n }\n\n public get height() {\n return this._height;\n }\n\n private set width(value: number) {\n this._width = value;\n }\n\n private set height(value: number) {\n this._height = value;\n }\n\n public get state(): MovableState {\n const {top, left, width, height} = this;\n return {\n top,\n left,\n width,\n height\n };\n }\n\n public set state(state: MovableState) {\n const {top, left, width, height} = state;\n this.top = top;\n this.left = left;\n this.width = width;\n this.height = height;\n this.onResize();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport MovableElement, {MovableElementOptions, MovableState} from '../components/movableElement';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport ListenerSetter from './listenerSetter';\nimport mediaSizes, {ScreenSize} from './mediaSizes';\nimport safeAssign from './object/safeAssign';\n\nexport default class MovablePanel {\n #movable: MovableElement;\n private listenerSetter: ListenerSetter;\n private previousState: MovableState;\n private onResize: () => void;\n private movableOptions: MovableElementOptions;\n\n constructor(options: {\n listenerSetter: ListenerSetter,\n previousState: MovableState,\n onResize?: () => void,\n movableOptions: MovableElementOptions\n }) {\n safeAssign(this, options);\n\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n\n this.listenerSetter.add(mediaSizes)('changeScreen', (from, to) => {\n if(to === ScreenSize.mobile || from === ScreenSize.mobile) {\n this.toggleMovable(!IS_TOUCH_SUPPORTED);\n }\n });\n }\n\n public destroy() {\n const movable = this.movable;\n if(movable) {\n movable.destroy();\n }\n }\n\n public get movable() {\n return this.#movable;\n }\n\n public get state() {\n return this.movable ? this.movable.state : this.previousState;\n }\n\n public set state(state: MovableState) {\n this.previousState = state;\n }\n\n private toggleMovable(enabled: boolean) {\n let {movable} = this;\n if(enabled) {\n if(movable) {\n return;\n }\n\n movable = this.#movable = new MovableElement(this.movableOptions);\n\n movable.state = this.previousState;\n if(this.previousState.top === undefined) {\n movable.setPositionToCenter();\n }\n\n if(this.onResize) {\n this.listenerSetter.add(movable)('resize', this.onResize);\n }\n } else {\n if(!movable) {\n return;\n }\n\n this.previousState = movable.state;\n movable.destroyElements();\n movable.destroy();\n this.#movable = undefined;\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function toggleClassName(className: string, elements: HTMLElement[], disable: boolean) {\n elements.forEach((element) => {\n element.classList.toggle(className, disable);\n });\n\n return () => toggleClassName(className, elements, !disable);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport toHHMMSS from '../../helpers/string/toHHMMSS';\nimport CALL_STATE from '../../lib/calls/callState';\nimport {i18n, LangPackKey} from '../../lib/langPack';\n\nexport default class CallDescriptionElement {\n private container: HTMLElement;\n private state: CALL_STATE;\n private interval: number;\n\n constructor(private appendTo: HTMLElement) {\n this.container = document.createElement('div');\n this.container.classList.add('call-description');\n }\n\n public detach() {\n if(this.interval !== undefined) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n\n this.container.remove();\n this.state = undefined;\n }\n\n public update(instance: any) {\n const {connectionState} = instance;\n\n if(this.state === connectionState) {\n return;\n }\n\n this.state = connectionState;\n\n let element: HTMLElement;\n if(connectionState === CALL_STATE.CONNECTED) {\n element = document.createElement('span');\n element.classList.add('call-description-duration');\n\n const setTime = () => {\n element.innerText = toHHMMSS(instance.duration, true);\n };\n\n this.interval = window.setInterval(setTime, 1000);\n setTime();\n } else {\n let langPackKey: LangPackKey;\n switch(connectionState) {\n case CALL_STATE.PENDING:\n langPackKey = instance.isOutgoing ? 'Call.StatusRinging' : 'Call.StatusCalling';\n break;\n case CALL_STATE.REQUESTING:\n langPackKey = 'Call.StatusRequesting';\n break;\n case CALL_STATE.EXCHANGING_KEYS:\n langPackKey = 'VoipExchangingKeys';\n break;\n case CALL_STATE.CLOSED:\n langPackKey = instance.connectedAt !== undefined ? 'Call.StatusEnded' : 'Call.StatusFailed';\n break;\n default:\n langPackKey = 'Call.StatusConnecting';\n break;\n }\n\n element = i18n(langPackKey);\n if(this.interval !== undefined) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n }\n\n this.container.classList.toggle('has-duration', connectionState === CALL_STATE.CONNECTED);\n replaceContent(this.container, element);\n\n if(!this.container.parentElement) {\n this.appendTo.append(this.container);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {SuperRLottieIcon} from '../superIcon';\n\nexport default class GroupCallMicrophoneIconMini extends SuperRLottieIcon<{\n PartState: boolean,\n ColorState: boolean,\n Items: {\n name: 'voice_mini'\n }[]\n}> {\n constructor(colored?: boolean, skipAnimation?: boolean) {\n super({\n width: 36,\n height: 36,\n getPart: (state) => {\n return this.getItem().getPart(state ? 'unmute' : 'mute');\n },\n getColor: colored ? (state) => {\n return state ? [255, 255, 255] : [158, 158, 158];\n } : undefined,\n skipAnimation\n });\n\n this.add({\n name: 'voice_mini',\n parts: [{\n startFrame: 0,\n endFrame: 35,\n name: 'hand-to-muted'\n }, {\n startFrame: 36,\n endFrame: 68,\n name: 'unmute'\n }, {\n startFrame: 69,\n endFrame: 98,\n name: 'mute'\n }, {\n startFrame: 99,\n endFrame: 135,\n name: 'muted-to-hand'\n }, {\n startFrame: 136,\n endFrame: 171,\n name: 'unmuted-to-hand'\n }]\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_SCREEN_SHARING_SUPPORTED from '../../environment/screenSharingSupport';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport {attachClickEvent} from '../../helpers/dom/clickEvent';\nimport ControlsHover from '../../helpers/dom/controlsHover';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport {addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen} from '../../helpers/dom/fullScreen';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport MovablePanel from '../../helpers/movablePanel';\nimport onMediaLoad from '../../helpers/onMediaLoad';\nimport themeController from '../../helpers/themeController';\nimport toggleClassName from '../../helpers/toggleClassName';\nimport CallInstance from '../../lib/calls/callInstance';\nimport CALL_STATE from '../../lib/calls/callState';\nimport I18n, {i18n} from '../../lib/langPack';\nimport wrapEmojiText from '../../lib/richTextProcessor/wrapEmojiText';\nimport animationIntersector from '../animationIntersector';\nimport AvatarElement from '../avatar';\nimport ButtonIcon from '../buttonIcon';\nimport GroupCallMicrophoneIconMini from '../groupCall/microphoneIconMini';\nimport {MovableState} from '../movableElement';\nimport PeerTitle from '../peerTitle';\nimport PopupElement from '../popups';\nimport SetTransition from '../singleTransition';\nimport makeButton from './button';\nimport CallDescriptionElement from './description';\nimport callVideoCanvasBlur from './videoCanvasBlur';\n\nconst className = 'call';\n\nconst MIN_WIDTH = 400;\nconst MIN_HEIGHT = 580;\n\nconst INIT_STATE: MovableState = {\n width: MIN_WIDTH,\n height: MIN_HEIGHT\n};\n\nlet previousState: MovableState = {...INIT_STATE};\n\nexport default class PopupCall extends PopupElement {\n private peerId: PeerId;\n\n private description: CallDescriptionElement;\n private emojisSubtitle: HTMLElement;\n\n private partyStates: HTMLElement;\n private partyMutedState: HTMLElement;\n\n private firstButtonsRow: HTMLElement;\n private secondButtonsRow: HTMLElement;\n\n private declineI18nElement: I18n.IntlElement;\n\n private makeButton: (options: Parameters[2]) => HTMLElement;\n private btnAccept: HTMLElement;\n private btnDecline: HTMLElement;\n private btnVideo: HTMLElement;\n private btnScreen: HTMLElement;\n private btnMute: HTMLElement;\n private btnFullScreen: HTMLButtonElement;\n private btnExitFullScreen: HTMLButtonElement;\n\n private movablePanel: MovablePanel;\n private microphoneIcon: GroupCallMicrophoneIconMini;\n private muteI18nElement: I18n.IntlElement;\n\n private videoContainers: {\n input?: HTMLElement,\n output?: HTMLElement\n };\n\n private controlsHover: ControlsHover;\n\n constructor(private instance: CallInstance) {\n super('popup-call', {\n withoutOverlay: true,\n closable: true\n });\n\n this.videoContainers = {};\n\n const {container, listenerSetter} = this;\n container.classList.add(className, 'night');\n\n const avatarContainer = document.createElement('div');\n avatarContainer.classList.add(className + '-avatar');\n\n const peerId = this.peerId = this.instance.interlocutorUserId.toPeerId();\n const avatar = new AvatarElement();\n avatar.classList.add('avatar-full');\n avatar.updateWithOptions({\n isBig: true,\n peerId: peerId\n });\n avatarContainer.append(avatar);\n\n const title = new PeerTitle({\n peerId\n }).element;\n\n title.classList.add(className + '-title');\n\n const subtitle = document.createElement('div');\n subtitle.classList.add(className + '-subtitle');\n\n const description = this.description = new CallDescriptionElement(subtitle);\n\n const emojisSubtitle = this.emojisSubtitle = document.createElement('div');\n emojisSubtitle.classList.add(className + '-emojis');\n\n container.append(avatarContainer, title, subtitle);\n\n if(!IS_MOBILE) {\n this.btnFullScreen = ButtonIcon('fullscreen');\n this.btnExitFullScreen = ButtonIcon('smallscreen hide');\n attachClickEvent(this.btnFullScreen, this.onFullScreenClick, {listenerSetter});\n attachClickEvent(this.btnExitFullScreen, () => cancelFullScreen(), {listenerSetter});\n addFullScreenListener(this.container, this.onFullScreenChange, listenerSetter);\n this.header.prepend(this.btnExitFullScreen);\n this.header.append(this.btnFullScreen);\n\n container.append(emojisSubtitle);\n } else {\n this.header.append(emojisSubtitle);\n }\n\n this.partyStates = document.createElement('div');\n this.partyStates.classList.add(className + '-party-states');\n\n this.partyMutedState = document.createElement('div');\n this.partyMutedState.classList.add(className + '-party-state');\n const stateText = i18n('VoipUserMicrophoneIsOff', [new PeerTitle({peerId, onlyFirstName: true, limitSymbols: 18}).element]);\n stateText.classList.add(className + '-party-state-text');\n const mutedIcon = new GroupCallMicrophoneIconMini(false, true);\n mutedIcon.setState(false, false);\n this.partyMutedState.append(\n mutedIcon.container,\n stateText\n );\n\n this.partyStates.append(this.partyMutedState);\n this.container.append(this.partyStates);\n\n this.makeButton = makeButton.bind(null, className, this.listenerSetter);\n this.constructFirstButtons();\n this.constructSecondButtons();\n\n listenerSetter.add(instance)('state', () => {\n this.updateInstance();\n });\n\n listenerSetter.add(instance)('mediaState', () => {\n this.updateInstance();\n });\n\n this.movablePanel = new MovablePanel({\n listenerSetter,\n movableOptions: {\n minWidth: MIN_WIDTH,\n minHeight: MIN_HEIGHT,\n element: this.element,\n verifyTouchTarget: (e) => {\n const target = e.target;\n if(findUpClassName(target, 'call-button') ||\n findUpClassName(target, 'btn-icon') ||\n isFullScreen()) {\n return false;\n }\n\n return true;\n }\n },\n // onResize: () => this.toggleBigLayout(),\n previousState: !this.instance.wasTryingToJoin && !this.instance.isOutgoing ? {...INIT_STATE} : previousState\n });\n\n const movableElement = this.movablePanel.movable;\n if(movableElement) {\n this.listenerSetter.add(movableElement)('resize', () => {\n this.resizeVideoContainers();\n });\n }\n\n const controlsHover = this.controlsHover = new ControlsHover();\n controlsHover.setup({\n element: this.container,\n listenerSetter: this.listenerSetter,\n showOnLeaveToClassName: 'call-buttons'\n });\n controlsHover.showControls(false);\n\n this.addEventListener('close', () => {\n const {movablePanel} = this;\n previousState = movablePanel.state;\n\n this.microphoneIcon.destroy();\n\n movablePanel.destroy();\n });\n\n this.updateInstance();\n }\n\n public getCallInstance() {\n return this.instance;\n }\n\n private constructFirstButtons() {\n const buttons = this.firstButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-first');\n\n const toggleDisability = toggleClassName.bind(null, 'btn-disabled');\n\n const btnVideo = this.btnVideo = this.makeButton({\n text: 'Call.Camera',\n icon: 'videocamera_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleVideoSharing().finally(toggle);\n }\n });\n\n const btnScreen = this.btnScreen = this.makeButton({\n text: 'Call.Screen',\n icon: 'sharescreen_filled',\n callback: () => {\n const toggle = toggleDisability([btnVideo, btnScreen], true);\n this.instance.toggleScreenSharing().finally(toggle);\n }\n });\n\n if(!IS_SCREEN_SHARING_SUPPORTED) {\n btnScreen.classList.add('hide');\n this.container.classList.add('no-screen');\n }\n\n this.muteI18nElement = new I18n.IntlElement({\n key: 'Call.Mute'\n });\n const btnMute = this.btnMute = this.makeButton({\n text: this.muteI18nElement.element,\n callback: () => {\n this.instance.toggleMuted();\n }\n });\n\n const microphoneIcon = this.microphoneIcon = new GroupCallMicrophoneIconMini(true, true);\n btnMute.firstElementChild.append(microphoneIcon.container);\n\n // btnVideo.classList.add('disabled');\n // btnScreen.classList.add('disabled');\n\n buttons.append(btnVideo, btnScreen, btnMute);\n this.container.append(buttons);\n }\n\n private constructSecondButtons() {\n const buttons = this.secondButtonsRow = document.createElement('div');\n buttons.classList.add(className + '-buttons', 'is-second');\n\n this.declineI18nElement = new I18n.IntlElement({\n key: 'Call.Decline'\n });\n const btnDecline = this.btnDecline = this.makeButton({\n text: this.declineI18nElement.element,\n icon: 'endcall_filled',\n callback: () => {\n this.instance.hangUp('phoneCallDiscardReasonHangup');\n },\n isDanger: true\n });\n\n const btnAccept = this.btnAccept = this.makeButton({\n text: 'Call.Accept',\n icon: 'phone_filled',\n callback: () => {\n this.instance.acceptCall();\n },\n isConfirm: true\n });\n\n buttons.append(btnDecline, btnAccept);\n this.container.append(buttons);\n }\n\n private onFullScreenClick = () => {\n requestFullScreen(this.container);\n };\n\n private onFullScreenChange = () => {\n const isFull = isFullScreen();\n\n const {btnFullScreen, btnExitFullScreen} = this;\n\n const wasFullScreen = this.container.classList.contains('is-full-screen');\n this.container.classList.toggle('is-full-screen', isFull);\n btnFullScreen && btnFullScreen.classList.toggle('hide', isFull);\n btnExitFullScreen && btnExitFullScreen.classList.toggle('hide', !isFull);\n this.btnClose.classList.toggle('hide', isFull);\n\n if(isFull !== wasFullScreen) {\n animationIntersector.checkAnimations(isFull);\n\n themeController.setThemeColor(isFull ? '#000000' : undefined);\n\n this.resizeVideoContainers();\n }\n };\n\n private createVideoContainer(video: HTMLVideoElement) {\n const _className = className + '-video';\n const container = document.createElement('div');\n container.classList.add(_className + '-container');\n\n video.classList.add(_className);\n if(video.paused) {\n video.play();\n }\n\n attachClickEvent(container, () => {\n if(!container.classList.contains('small')) {\n return;\n }\n\n const big = Object.values(this.videoContainers).find((container) => !container.classList.contains('small'));\n big.classList.add('small');\n big.style.cssText = container.style.cssText;\n container.classList.remove('small');\n container.style.cssText = '';\n\n this.resizeVideoContainers();\n });\n\n const canvas = callVideoCanvasBlur(video);\n canvas.classList.add(_className + '-blur');\n\n container.append(canvas, video);\n\n return container;\n }\n\n private updateInstance() {\n const {instance} = this;\n const {connectionState} = instance;\n if(connectionState === CALL_STATE.CLOSED) {\n if(this.container.classList.contains('is-full-screen')) {\n cancelFullScreen();\n }\n\n this.btnVideo.classList.add('disabled');\n\n this.hide();\n return;\n }\n\n const isPendingIncoming = !instance.isOutgoing && connectionState === CALL_STATE.PENDING;\n this.declineI18nElement.compareAndUpdate({\n key: connectionState === CALL_STATE.PENDING ? 'Call.Decline' : 'Call.End'\n });\n this.btnAccept.classList.toggle('disable', !isPendingIncoming);\n this.btnAccept.classList.toggle('hide-me', !isPendingIncoming);\n this.container.classList.toggle('two-button-rows', isPendingIncoming);\n\n const isMuted = instance.isMuted;\n const onFrame = () => {\n this.btnMute.firstElementChild.classList.toggle('active', isMuted);\n };\n\n const player = this.microphoneIcon.getItem().player;\n this.microphoneIcon.setState(!isMuted, !isMuted, onFrame);\n if(!player) {\n onFrame();\n }\n\n this.muteI18nElement.compareAndUpdate({\n key: isMuted ? 'VoipUnmute' : 'Call.Mute'\n });\n\n const isSharingVideo = instance.isSharingVideo;\n this.btnVideo.firstElementChild.classList.toggle('active', isSharingVideo);\n\n const isSharingScreen = instance.isSharingScreen;\n this.btnScreen.firstElementChild.classList.toggle('active', isSharingScreen);\n\n const outputState = instance.getMediaState('output');\n\n SetTransition({\n element: this.partyMutedState,\n className: 'is-visible',\n forwards: !!outputState?.muted,\n duration: 300\n });\n\n const containers = this.videoContainers;\n const oldContainers = {...containers};\n ['input' as const, 'output' as const].forEach((type) => {\n const mediaState = instance.getMediaState(type);\n const video = instance.getVideoElement(type) as HTMLVideoElement;\n\n const hasFrame = !!(video && video.videoWidth && video.videoHeight);\n if(video && !hasFrame && !video.dataset.hasPromise) {\n video.dataset.hasPromise = '1';\n // container.classList.add('hide');\n onMediaLoad(video).then(() => {\n delete video.dataset.hasPromise;\n this.updateInstance();\n // this.resizeVideoContainers();\n // container.classList.remove('hide');\n });\n }\n\n const isActive = !!video && hasFrame && !!(mediaState && (mediaState.videoState === 'active' || mediaState.screencastState === 'active'));\n let videoContainer = containers[type];\n\n if(isActive && video && !videoContainer) {\n videoContainer = containers[type] = this.createVideoContainer(video);\n this.container.append(videoContainer);\n }\n\n if(!isActive && videoContainer) {\n videoContainer.remove();\n delete containers[type];\n }\n });\n\n {\n const input = containers.input;\n const output = containers.output;\n if(Object.keys(oldContainers).length !== Object.keys(containers).length && input) {\n input.classList.toggle('small', !!output);\n }\n\n if(output && !input) {\n output.classList.remove('small');\n }\n }\n\n this.resizeVideoContainers();\n\n this.container.classList.toggle('no-video', !Object.keys(containers).length);\n\n if(!this.emojisSubtitle.textContent && connectionState < CALL_STATE.EXCHANGING_KEYS) {\n Promise.resolve(instance.getEmojisFingerprint()).then((emojis) => {\n replaceContent(this.emojisSubtitle, wrapEmojiText(emojis.join('')));\n });\n }\n\n this.setDescription();\n }\n\n private resizeVideoContainers() {\n Object.values(this.videoContainers).forEach((container) => {\n const isSmall = container.classList.contains('small');\n if(isSmall) {\n const video = container.querySelector('video');\n const popupWidth = this.movablePanel.state;\n const MAX_WIDTH_PX = 240;\n const MAX_HEIGHT_PX = 240;\n\n const isVertical = video.videoHeight > video.videoWidth;\n const MAX_SIZE = isVertical ? MAX_HEIGHT_PX : MAX_WIDTH_PX;\n\n const biggestSideSize = 1 / 3 * (isFullScreen() ? 0xFFFF : (isVertical ? popupWidth.height : popupWidth.width));\n const widthRatio = isVertical ? video.videoWidth / video.videoHeight : 1;\n const heightRatio = isVertical ? 1 : video.videoHeight / video.videoWidth;\n container.style.width = biggestSideSize * widthRatio + 'px';\n container.style.height = biggestSideSize * heightRatio + 'px';\n container.style.maxWidth = MAX_SIZE * widthRatio + 'px';\n container.style.maxHeight = MAX_SIZE * heightRatio + 'px';\n } else {\n container.style.cssText = '';\n }\n });\n }\n\n private setDescription() {\n this.description.update(this.instance);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cancelEvent from '../helpers/dom/cancelEvent';\nimport {attachClickEvent} from '../helpers/dom/clickEvent';\nimport ListenerSetter from '../helpers/listenerSetter';\nimport GROUP_CALL_STATE from '../lib/calls/groupCallState';\nimport rootScope from '../lib/rootScope';\nimport ButtonIcon from './buttonIcon';\nimport TopbarWeave from './topbarWeave';\nimport SetTransition from './singleTransition';\nimport PopupGroupCall from './groupCall';\nimport GroupCallDescriptionElement from './groupCall/description';\nimport GroupCallTitleElement from './groupCall/title';\nimport PopupElement from './popups';\nimport throttle from '../helpers/schedulers/throttle';\nimport GroupCallInstance from '../lib/calls/groupCallInstance';\nimport CALL_STATE from '../lib/calls/callState';\nimport replaceContent from '../helpers/dom/replaceContent';\nimport PeerTitle from './peerTitle';\nimport CallDescriptionElement from './call/description';\nimport PopupCall from './call';\nimport GroupCallMicrophoneIconMini from './groupCall/microphoneIconMini';\nimport CallInstance from '../lib/calls/callInstance';\nimport {AppManagers} from '../lib/appManagers/managers';\nimport groupCallsController from '../lib/calls/groupCallsController';\nimport StreamManager from '../lib/calls/streamManager';\nimport callsController from '../lib/calls/callsController';\n\nfunction convertCallStateToGroupState(state: CALL_STATE, isMuted: boolean) {\n switch(state) {\n case CALL_STATE.CLOSING:\n case CALL_STATE.CLOSED:\n return GROUP_CALL_STATE.CLOSED;\n case CALL_STATE.CONNECTED:\n return isMuted ? GROUP_CALL_STATE.MUTED : GROUP_CALL_STATE.UNMUTED;\n default:\n return GROUP_CALL_STATE.CONNECTING;\n }\n}\n\nconst CLASS_NAME = 'topbar-call';\n\nexport default class TopbarCall {\n public container: HTMLElement;\n private listenerSetter: ListenerSetter;\n private weave: TopbarWeave;\n private center: HTMLDivElement;\n private groupCallTitle: GroupCallTitleElement;\n private groupCallDescription: GroupCallDescriptionElement;\n private groupCallMicrophoneIconMini: GroupCallMicrophoneIconMini;\n private callDescription: CallDescriptionElement;\n\n private currentDescription: GroupCallDescriptionElement | CallDescriptionElement;\n\n private instance: GroupCallInstance | any/* CallInstance */;\n private instanceListenerSetter: ListenerSetter;\n\n constructor(\n private managers: AppManagers\n ) {\n const listenerSetter = this.listenerSetter = new ListenerSetter();\n\n listenerSetter.add(callsController)('instance', ({instance}) => {\n if(!this.instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(callsController)('accepting', (instance) => {\n if(this.instance !== instance) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(groupCallsController)('instance', (instance) => {\n this.updateInstance(instance);\n });\n\n listenerSetter.add(rootScope)('group_call_update', (groupCall) => {\n const instance = groupCallsController.groupCall;\n if(instance?.id === groupCall.id) {\n this.updateInstance(instance);\n }\n });\n\n listenerSetter.add(StreamManager.ANALYSER_LISTENER)('amplitude', ({amplitudes, type}) => {\n const {weave} = this;\n if(!amplitudes.length || !weave/* || type !== 'input' */) return;\n\n let max = 0;\n for(let i = 0; i < amplitudes.length; ++i) {\n const {type, value} = amplitudes[i];\n max = value > max ? value : max;\n }\n\n weave.setAmplitude(max);\n });\n }\n\n private onState = () => {\n this.updateInstance(this.instance);\n };\n\n private clearCurrentInstance() {\n if(!this.instance) return;\n this.center.textContent = '';\n\n if(this.currentDescription) {\n this.currentDescription.detach();\n this.currentDescription = undefined;\n }\n\n this.instance = undefined;\n this.instanceListenerSetter.removeAll();\n }\n\n private updateInstance(instance: TopbarCall['instance']) {\n if(this.construct) {\n this.construct();\n this.construct = undefined;\n }\n\n const isChangingInstance = this.instance !== instance;\n if(isChangingInstance) {\n this.clearCurrentInstance();\n\n this.instance = instance;\n this.instanceListenerSetter = new ListenerSetter();\n\n this.instanceListenerSetter.add(instance as GroupCallInstance)('state', this.onState);\n\n if(instance instanceof GroupCallInstance) {\n this.currentDescription = this.groupCallDescription;\n } else {\n this.currentDescription = this.callDescription;\n this.instanceListenerSetter.add(instance)('muted', this.onState);\n }\n\n this.container.classList.toggle('is-call', !(instance instanceof GroupCallInstance));\n }\n\n const isMuted = this.instance.isMuted;\n const state = instance instanceof GroupCallInstance ? instance.state : convertCallStateToGroupState(instance.connectionState, isMuted);\n\n const {weave} = this;\n\n weave.componentDidMount();\n\n const isClosed = state === GROUP_CALL_STATE.CLOSED;\n if((!document.body.classList.contains('is-calling') || isChangingInstance) || isClosed) {\n if(isClosed) {\n weave.setAmplitude(0);\n }\n\n SetTransition({\n element: document.body,\n className: 'is-calling',\n forwards: !isClosed,\n duration: 250,\n onTransitionEnd: isClosed ? () => {\n weave.componentWillUnmount();\n\n this.clearCurrentInstance();\n } : undefined\n });\n }\n\n if(isClosed) {\n return;\n }\n\n weave.setCurrentState(state, true);\n // if(state === GROUP_CALL_STATE.CONNECTING) {\n // weave.setCurrentState(state, true);\n // } else {\n // /* var a = 0;\n // animate(() => {\n // a += 0.1;\n // if(a > 1) a = 0;\n // weave.setAmplitude(a);\n // return true;\n // });\n // weave.setAmplitude(1); */\n // weave.setCurrentState(state, true);\n // }\n\n this.setTitle(instance);\n this.setDescription(instance);\n this.groupCallMicrophoneIconMini.setState(!isMuted);\n }\n\n private setDescription(instance: TopbarCall['instance']) {\n return this.currentDescription.update(instance as any);\n }\n\n private setTitle(instance: TopbarCall['instance']) {\n if(instance instanceof GroupCallInstance) {\n return this.groupCallTitle.update(instance);\n } else {\n replaceContent(this.center, new PeerTitle({peerId: instance.interlocutorUserId.toPeerId()}).element);\n }\n }\n\n private construct() {\n const {listenerSetter} = this;\n const container = this.container = document.createElement('div');\n container.classList.add('sidebar-header', CLASS_NAME + '-container');\n\n const left = document.createElement('div');\n left.classList.add(CLASS_NAME + '-left');\n\n const groupCallMicrophoneIconMini = this.groupCallMicrophoneIconMini = new GroupCallMicrophoneIconMini();\n\n const mute = ButtonIcon();\n mute.append(groupCallMicrophoneIconMini.container);\n left.append(mute);\n\n const throttledMuteClick = throttle(() => {\n this.instance.toggleMuted();\n }, 600, true);\n\n attachClickEvent(mute, (e) => {\n cancelEvent(e);\n throttledMuteClick();\n }, {listenerSetter});\n\n const center = this.center = document.createElement('div');\n center.classList.add(CLASS_NAME + '-center');\n\n this.groupCallTitle = new GroupCallTitleElement(center);\n this.groupCallDescription = new GroupCallDescriptionElement(left);\n\n this.callDescription = new CallDescriptionElement(left);\n\n const right = document.createElement('div');\n right.classList.add(CLASS_NAME + '-right');\n\n const end = ButtonIcon('endcall_filled');\n right.append(end);\n\n attachClickEvent(end, (e) => {\n cancelEvent(e);\n\n const {instance} = this;\n if(!instance) {\n return;\n }\n\n if(instance instanceof GroupCallInstance) {\n instance.hangUp();\n } else {\n instance.hangUp('phoneCallDiscardReasonHangup');\n }\n }, {listenerSetter});\n\n attachClickEvent(container, () => {\n if(this.instance instanceof GroupCallInstance) {\n if(PopupElement.getPopups(PopupGroupCall).length) {\n return;\n }\n\n new PopupGroupCall().show();\n } else if(this.instance instanceof CallInstance) {\n const popups = PopupElement.getPopups(PopupCall);\n if(popups.find((popup) => popup.getCallInstance() === this.instance)) {\n return;\n }\n\n new PopupCall(this.instance).show();\n }\n }, {listenerSetter});\n\n container.append(left, center, right);\n\n const weave = this.weave = new TopbarWeave();\n const weaveContainer = weave.render(CLASS_NAME + '-weave');\n container.prepend(weaveContainer);\n\n document.getElementById('column-center').prepend(container);\n weave.componentDidMount();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getPeerTitle from '../../components/wrappers/getPeerTitle';\nimport wrapMessageForReply from '../../components/wrappers/messageForReply';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {FontFamily} from '../../config/font';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport IS_VIBRATE_SUPPORTED from '../../environment/vibrateSupport';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport idleController from '../../helpers/idleController';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport tsNow from '../../helpers/tsNow';\nimport {Message, MessagePeerReaction, PeerNotifySettings} from '../../layer';\nimport I18n, {FormatterArguments, LangPackKey} from '../langPack';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport singleInstance from '../mtproto/singleInstance';\nimport webPushApiManager, {PushSubscriptionNotify} from '../mtproto/webPushApiManager';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport wrapPlainText from '../richTextProcessor/wrapPlainText';\nimport rootScope from '../rootScope';\nimport appImManager from './appImManager';\nimport appRuntimeManager from './appRuntimeManager';\nimport {AppManagers} from './managers';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\nimport getPeerId from './utils/peers/getPeerId';\n\ntype MyNotification = Notification & {\n hidden?: boolean,\n show?: () => void,\n};\n\nexport type NotifyOptions = Partial<{\n tag: string;\n image: string;\n key: string;\n title: string;\n message: string;\n silent: boolean;\n onclick: () => void;\n noIncrement: boolean;\n}>;\n\nexport type NotificationSettings = {\n nodesktop: boolean,\n volume: number,\n novibrate: boolean,\n nopreview: boolean,\n nopush: boolean,\n nosound: boolean\n};\n\nexport class UiNotificationsManager {\n private notificationsUiSupport: boolean;\n private notificationsShown: {[key: string]: MyNotification | true} = {};\n private notificationIndex = 0;\n private notificationsCount = 0;\n private soundsPlayed: {[tag: string]: number} = {};\n private vibrateSupport = IS_VIBRATE_SUPPORTED;\n private nextSoundAt: number;\n private prevSoundVolume: number;\n\n private faviconElements = Array.from(document.head.querySelectorAll('link[rel=\"icon\"], link[rel=\"alternate icon\"]'));\n\n private titleBackup = document.title;\n private titleChanged = false;\n private titleInterval: number;\n private prevFavicon: string;\n\n private notifySoundEl: HTMLElement;\n\n private stopped = false;\n\n private topMessagesDeferred: CancellablePromise;\n\n private settings: NotificationSettings = {} as any;\n\n private registeredDevice: any;\n private pushInited = false;\n\n private managers: AppManagers;\n private setAppBadge: (contents?: any) => Promise;\n\n construct(managers: AppManagers) {\n this.managers = managers;\n\n navigator.vibrate = navigator.vibrate || (navigator as any).mozVibrate || (navigator as any).webkitVibrate;\n this.setAppBadge = (navigator as any).setAppBadge && (navigator as any).setAppBadge.bind(navigator);\n this.setAppBadge && this.setAppBadge(0);\n\n this.notificationsUiSupport = ('Notification' in window) || ('mozNotification' in navigator);\n\n this.notifySoundEl = document.createElement('div');\n this.notifySoundEl.id = 'notify-sound';\n document.body.append(this.notifySoundEl);\n\n this.topMessagesDeferred = deferredPromise();\n\n singleInstance.addEventListener('deactivated', () => {\n this.stop();\n });\n\n singleInstance.addEventListener('activated', () => {\n if(this.stopped) {\n this.start();\n }\n });\n\n idleController.addEventListener('change', (idle) => {\n if(this.stopped) {\n return;\n }\n\n if(!idle) {\n this.clear();\n }\n\n this.toggleToggler();\n });\n\n rootScope.addEventListener('notification_reset', (peerString) => {\n this.soundReset(peerString);\n });\n\n rootScope.addEventListener('notification_cancel', (str) => {\n this.cancel(str);\n });\n\n if(this.setAppBadge) {\n rootScope.addEventListener('folder_unread', (folder) => {\n if(folder.id === 0) {\n this.setAppBadge(folder.unreadUnmutedPeerIds.size);\n }\n });\n }\n\n webPushApiManager.addEventListener('push_init', (tokenData) => {\n this.pushInited = true;\n if(!this.settings.nodesktop && !this.settings.nopush) {\n if(tokenData) {\n this.registerDevice(tokenData);\n } else {\n webPushApiManager.subscribe();\n }\n } else {\n this.unregisterDevice(tokenData);\n }\n });\n webPushApiManager.addEventListener('push_subscribe', (tokenData) => {\n this.registerDevice(tokenData);\n });\n webPushApiManager.addEventListener('push_unsubscribe', (tokenData) => {\n this.unregisterDevice(tokenData);\n });\n\n rootScope.addEventListener('dialogs_multiupdate', () => {\n // unregisterTopMsgs()\n this.topMessagesDeferred.resolve();\n }, {once: true});\n\n webPushApiManager.addEventListener('push_notification_click', (notificationData) => {\n if(notificationData.action === 'push_settings') {\n /* this.topMessagesDeferred.then(() => {\n $modal.open({\n templateUrl: templateUrl('settings_modal'),\n controller: 'SettingsModalController',\n windowClass: 'settings_modal_window mobile_modal',\n backdrop: 'single'\n })\n }); */\n return;\n }\n\n if(notificationData.action === 'mute1d') {\n this.managers.apiManager.invokeApi('account.updateDeviceLocked', {\n period: 86400\n }).then(() => {\n // var toastData = toaster.pop({\n // type: 'info',\n // body: _('push_action_mute1d_success'),\n // bodyOutputType: 'trustedHtml',\n // clickHandler: () => {\n // toaster.clear(toastData)\n // },\n // showCloseButton: false\n // })\n });\n\n return;\n }\n\n const peerId = notificationData.custom && notificationData.custom.peerId.toPeerId();\n console.log('click', notificationData, peerId);\n if(peerId) {\n this.topMessagesDeferred.then(async() => {\n if(notificationData.custom.channel_id &&\n !(await this.managers.appChatsManager.hasChat(notificationData.custom.channel_id))) {\n return;\n }\n\n if(peerId.isUser() && !(await this.managers.appUsersManager.hasUser(peerId))) {\n return;\n }\n\n appImManager.setInnerPeer({\n peerId,\n lastMsgId: generateMessageId(+notificationData.custom.msg_id)\n });\n });\n }\n });\n }\n\n public async buildNotification({\n message,\n fwdCount,\n peerReaction,\n peerTypeNotifySettings\n }: {\n message: Message.message | Message.messageService,\n fwdCount?: number,\n peerReaction?: MessagePeerReaction,\n peerTypeNotifySettings?: PeerNotifySettings\n }) {\n const peerId = message.peerId;\n const isAnyChat = peerId.isAnyChat();\n const notification: NotifyOptions = {};\n const [peerString, isForum = false] = await Promise.all([\n this.managers.appPeersManager.getPeerString(peerId),\n isAnyChat && this.managers.appPeersManager.isForum(peerId)\n ]);\n let notificationMessage: string;\n let wrappedMessage = false;\n\n if(peerTypeNotifySettings.show_previews) {\n if(message._ === 'message' && message.fwd_from && fwdCount > 1) {\n notificationMessage = I18n.format('Notifications.Forwarded', true, [fwdCount]);\n } else {\n notificationMessage = await wrapMessageForReply({message, plain: true});\n\n const reaction = peerReaction?.reaction;\n if(reaction?._ === 'reactionEmoji') {\n const langPackKey: LangPackKey = /* isAnyChat ? 'Notification.Group.Reacted' : */'Notification.Contact.Reacted';\n const args: FormatterArguments = [\n fixEmoji(reaction.emoticon), // can be plain heart\n notificationMessage\n ];\n\n /* if(isAnyChat) {\n args.unshift(appPeersManager.getPeerTitle(message.fromId, true));\n } */\n\n notificationMessage = I18n.format(langPackKey, true, args);\n } else {\n wrappedMessage = true;\n }\n }\n } else {\n notificationMessage = I18n.format('Notifications.New', true);\n }\n\n if(peerReaction) {\n notification.noIncrement = true;\n notification.silent = true;\n }\n\n const threadId = isForum ? getMessageThreadId(message, isForum) : undefined;\n const notificationFromPeerId = peerReaction ? getPeerId(peerReaction.peer_id) : message.fromId;\n notification.title = await getPeerTitle({peerId, plainText: true, managers: this.managers, threadId: threadId});\n if(isForum) {\n const peerTitle = await getPeerTitle({peerId, plainText: true, managers: this.managers});\n notification.title += ` (${peerTitle})`;\n\n if(wrappedMessage && notificationFromPeerId !== message.peerId) {\n notificationMessage = await getPeerTitle({peerId: notificationFromPeerId, plainText: true, managers: this.managers}) +\n ': ' + notificationMessage;\n }\n } else if(isAnyChat && notificationFromPeerId !== message.peerId) {\n notification.title = await getPeerTitle({peerId: notificationFromPeerId, plainText: true, managers: this.managers}) +\n ' @ ' +\n notification.title;\n }\n\n notification.title = wrapPlainText(notification.title);\n\n notification.onclick = () => {\n appImManager.setInnerPeer({peerId, lastMsgId: message.mid, threadId});\n };\n\n notification.message = notificationMessage;\n notification.key = 'msg' + message.mid;\n notification.tag = peerString;\n notification.silent = true;// message.pFlags.silent || false;\n\n const peerPhoto = await this.managers.appPeersManager.getPeerPhoto(peerId);\n if(peerPhoto) {\n this.managers.appAvatarsManager.loadAvatar(peerId, peerPhoto, 'photo_small').then((url) => {\n // ! WARNING, message can be already read\n if(message.pFlags.unread || peerReaction) {\n notification.image = url;\n this.notify(notification);\n }\n });\n } else {\n this.notify(notification);\n }\n }\n\n private toggleToggler(enable = idleController.isIdle) {\n if(IS_MOBILE) return;\n\n const resetTitle = (isBlink?: boolean) => {\n this.titleChanged = false;\n document.title = this.titleBackup;\n this.setFavicon();\n };\n\n window.clearInterval(this.titleInterval);\n this.titleInterval = 0;\n\n if(!enable) {\n resetTitle();\n } else {\n this.titleInterval = window.setInterval(() => {\n const count = this.notificationsCount;\n if(!count) {\n this.toggleToggler(false);\n } else if(this.titleChanged) {\n resetTitle(true);\n } else {\n this.titleChanged = true;\n document.title = I18n.format('Notifications.Count', true, [count]);\n // this.setFavicon('assets/img/favicon_unread.ico');\n\n // fetch('assets/img/favicon.ico')\n // .then((res) => res.blob())\n // .then((blob) => {\n // const img = document.createElement('img');\n // img.src = URL.createObjectURL(blob);\n\n const canvas = document.createElement('canvas');\n canvas.width = 32 * window.devicePixelRatio;\n canvas.height = canvas.width;\n\n const ctx = canvas.getContext('2d');\n ctx.beginPath();\n ctx.arc(canvas.width / 2, canvas.height / 2, canvas.width / 2, 0, 2 * Math.PI, false);\n ctx.fillStyle = '#3390ec';\n ctx.fill();\n\n let fontSize = 24;\n let str = '' + count;\n if(count < 10) {\n fontSize = 22;\n } else if(count < 100) {\n fontSize = 20;\n } else {\n str = '99+';\n fontSize = 16;\n }\n\n fontSize *= window.devicePixelRatio;\n\n ctx.font = `700 ${fontSize}px ${FontFamily}`;\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'center';\n ctx.fillStyle = 'white';\n ctx.fillText(str, canvas.width / 2, canvas.height * .5625);\n\n /* const ctx = canvas.getContext('2d');\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height); */\n\n this.setFavicon(canvas.toDataURL());\n // });\n }\n }, 1000);\n }\n }\n\n private setFavicon(href?: string) {\n if(this.prevFavicon === href) {\n return;\n }\n\n this.prevFavicon = href;\n this.faviconElements.forEach((element, idx, arr) => {\n const link = element.cloneNode() as HTMLLinkElement;\n\n if(!link.dataset.href) {\n link.dataset.href = link.href;\n }\n\n href ??= link.dataset.href;\n link.href = href;\n element.replaceWith(arr[idx] = link);\n });\n }\n\n public notify(data: NotifyOptions) {\n // console.log('notify', data, rootScope.idle.isIDLE, this.notificationsUiSupport, this.stopped);\n\n if(this.stopped) {\n return;\n }\n\n // FFOS Notification blob src bug workaround\n /* if(Config.Navigator.ffos && !Config.Navigator.ffos2p) {\n data.image = 'https://telegram.org/img/t_logo.png'\n }\n else if (data.image && !angular.isString(data.image)) {\n if (Config.Navigator.ffos2p) {\n FileManager.getDataUrl(data.image, 'image/jpeg').then(function (url) {\n data.image = url\n notify(data)\n })\n return false\n } else {\n data.image = FileManager.getUrl(data.image, 'image/jpeg')\n }\n }\n else */ if(!data.image) {\n data.image = 'assets/img/logo_filled_rounded.png';\n }\n // console.log('notify image', data.image)\n\n if(!data.noIncrement) {\n ++this.notificationsCount;\n }\n\n if(!this.titleInterval) {\n this.toggleToggler();\n }\n\n const idx = ++this.notificationIndex;\n const key = data.key || 'k' + idx;\n this.notificationsShown[key] = true;\n\n const now = tsNow();\n if(this.settings.volume > 0 && !this.settings.nosound/* &&\n (\n !data.tag ||\n !this.soundsPlayed[data.tag] ||\n now > this.soundsPlayed[data.tag] + 60000\n ) */\n ) {\n this.testSound(this.settings.volume);\n this.soundsPlayed[data.tag] = now;\n }\n\n if(!this.notificationsUiSupport ||\n 'Notification' in window && Notification.permission !== 'granted') {\n return false;\n }\n\n if(this.settings.nodesktop) {\n if(this.vibrateSupport && !this.settings.novibrate) {\n navigator.vibrate([200, 100, 200]);\n return;\n }\n\n return;\n }\n\n let notification: MyNotification;\n\n if('Notification' in window) {\n try {\n if(data.tag) {\n for(const i in this.notificationsShown) {\n const notification = this.notificationsShown[i];\n if(typeof(notification) !== 'boolean' && notification.tag === data.tag) {\n notification.hidden = true;\n }\n }\n }\n\n notification = new Notification(data.title, {\n icon: data.image || '',\n body: data.message || '',\n tag: data.tag || '',\n silent: data.silent || false\n });\n\n // console.log('notify constructed notification');\n } catch(e) {\n this.notificationsUiSupport = false;\n webPushApiManager.setLocalNotificationsDisabled();\n return;\n }\n } /* else if('mozNotification' in navigator) {\n notification = navigator.mozNotification.createNotification(data.title, data.message || '', data.image || '')\n } else if(notificationsMsSiteMode) {\n window.external.msSiteModeClearIconOverlay()\n window.external.msSiteModeSetIconOverlay('img/icons/icon16.png', data.title)\n window.external.msSiteModeActivate()\n notification = {\n index: idx\n }\n } */ else {\n return;\n }\n\n notification.onclick = () => {\n notification.close();\n appRuntimeManager.focus();\n this.clear();\n if(data.onclick) {\n data.onclick();\n }\n };\n\n notification.onclose = () => {\n if(!notification.hidden) {\n delete this.notificationsShown[key];\n this.clear();\n }\n };\n\n if(notification.show) {\n notification.show();\n }\n this.notificationsShown[key] = notification;\n\n if(!IS_MOBILE) {\n setTimeout(() => {\n this.hide(key);\n }, 8000);\n }\n }\n\n public updateLocalSettings = () => {\n const keys = ['notify_nodesktop', 'notify_volume', 'notify_novibrate', 'notify_nopreview', 'notify_nopush'];\n const promises = keys.map(() => undefined);\n // const promises = keys.map((k) => stateStorage.get(k as any));\n Promise.all(promises)\n .then((updSettings) => {\n this.settings.nodesktop = updSettings[0];\n this.settings.volume = updSettings[1] === undefined ? 0.5 : updSettings[1];\n this.settings.novibrate = updSettings[2];\n this.settings.nopreview = updSettings[3];\n this.settings.nopush = updSettings[4];\n\n if(this.pushInited) {\n const needPush = !this.settings.nopush && !this.settings.nodesktop && webPushApiManager.isAvailable || false;\n const hasPush = this.registeredDevice !== false;\n if(needPush !== hasPush) {\n if(needPush) {\n webPushApiManager.subscribe();\n } else {\n webPushApiManager.unsubscribe();\n }\n }\n }\n\n webPushApiManager.setSettings(this.settings);\n });\n\n apiManagerProxy.getState().then((state) => {\n this.settings.nosound = !state.settings.notifications.sound;\n });\n }\n\n public getLocalSettings() {\n return this.settings;\n }\n\n private hide(key: string) {\n const notification = this.notificationsShown[key];\n if(notification && typeof(notification) !== 'boolean') {\n try {\n if(notification.close) {\n notification.hidden = true;\n notification.close();\n }\n } catch(e) {}\n }\n }\n\n public soundReset(tag: string) {\n delete this.soundsPlayed[tag];\n }\n\n private requestPermission = () => {\n Notification.requestPermission();\n window.removeEventListener('click', this.requestPermission);\n };\n\n public testSound(volume: number) {\n const now = tsNow();\n if(this.nextSoundAt && now < this.nextSoundAt && this.prevSoundVolume === volume) {\n return;\n }\n\n this.nextSoundAt = now + 1000;\n this.prevSoundVolume = volume;\n const filename = 'assets/audio/notification.mp3';\n const audio = document.createElement('audio');\n audio.autoplay = true;\n audio.setAttribute('mozaudiochannel', 'notification');\n audio.volume = volume;\n audio.innerHTML = `\n \n \n `;\n this.notifySoundEl.append(audio);\n\n audio.addEventListener('ended', () => {\n audio.remove();\n }, {once: true});\n }\n\n public cancel(key: string) {\n const notification = this.notificationsShown[key];\n if(notification) {\n if(this.notificationsCount > 0) {\n --this.notificationsCount;\n }\n\n try {\n if(typeof(notification) !== 'boolean' && notification.close) {\n notification.hidden = true;\n notification.close();\n }/* else if(notificationsMsSiteMode &&\n notification.index === notificationIndex) {\n window.external.msSiteModeClearIconOverlay()\n } */\n } catch(e) {}\n\n delete this.notificationsShown[key];\n }\n }\n\n public clear() {\n /* if(notificationsMsSiteMode) {\n window.external.msSiteModeClearIconOverlay()\n } else { */\n for(const i in this.notificationsShown) {\n const notification = this.notificationsShown[i];\n try {\n if(typeof(notification) !== 'boolean' && notification.close) {\n notification.close();\n }\n } catch(e) {}\n }\n /* } */\n this.notificationsShown = {};\n this.notificationsCount = 0;\n\n webPushApiManager.hidePushNotifications();\n }\n\n public start() {\n this.updateLocalSettings();\n rootScope.addEventListener('settings_updated', this.updateLocalSettings);\n webPushApiManager.start();\n\n if(!this.notificationsUiSupport) {\n return false;\n }\n\n if('Notification' in window && Notification.permission !== 'granted' && Notification.permission !== 'denied') {\n window.addEventListener('click', this.requestPermission);\n }\n\n try {\n if('onbeforeunload' in window) {\n window.addEventListener('beforeunload', this.clear);\n }\n } catch(e) {}\n }\n\n private stop() {\n this.clear();\n window.clearInterval(this.titleInterval);\n this.titleInterval = 0;\n this.setFavicon();\n this.stopped = true;\n }\n\n private registerDevice(tokenData: PushSubscriptionNotify) {\n if(this.registeredDevice && deepEqual(this.registeredDevice, tokenData)) {\n return false;\n }\n\n this.managers.apiManager.invokeApi('account.registerDevice', {\n token_type: tokenData.tokenType,\n token: tokenData.tokenValue,\n other_uids: [],\n app_sandbox: false,\n secret: new Uint8Array()\n }).then(() => {\n this.registeredDevice = tokenData;\n }, (error) => {\n error.handled = true;\n });\n }\n\n private unregisterDevice(tokenData: PushSubscriptionNotify) {\n if(!this.registeredDevice) {\n return false;\n }\n\n this.managers.apiManager.invokeApi('account.unregisterDevice', {\n token_type: tokenData.tokenType,\n token: tokenData.tokenValue,\n other_uids: []\n }).then(() => {\n this.registeredDevice = false;\n }, (error) => {\n error.handled = true;\n });\n }\n}\n\nconst uiNotificationsManager = new UiNotificationsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.uiNotificationsManager = uiNotificationsManager);\nexport default uiNotificationsManager;\n","export default async function getFilesFromEvent(e: ClipboardEvent | DragEvent, onlyTypes = false): Promise {\n const files: any[] = [];\n\n const scanFiles = async(entry: any, item: DataTransferItem) => {\n if(entry.isDirectory) {\n const directoryReader = entry.createReader();\n await new Promise((resolve, reject) => {\n directoryReader.readEntries(async(entries: any) => {\n for(const entry of entries) {\n await scanFiles(entry, item);\n }\n\n resolve();\n });\n });\n } else if(entry) {\n if(onlyTypes) {\n files.push(entry.type);\n } else {\n const itemFile = item.getAsFile(); // * Safari can't handle entry.file with pasting\n const file = entry instanceof File ?\n entry :\n (\n entry instanceof DataTransferItem ?\n entry.getAsFile() :\n await new Promise((resolve, reject) => entry.file(resolve, (err: any) => resolve(itemFile)))\n );\n\n /* if(!onlyTypes) {\n console.log('getFilesFromEvent: got file', item, file);\n } */\n\n if(!file) return;\n files.push(file);\n }\n }\n };\n\n if(e instanceof DragEvent && e.dataTransfer.files && !e.dataTransfer.items) {\n for(let i = 0; i < e.dataTransfer.files.length; i++) {\n const file = e.dataTransfer.files[i];\n files.push(onlyTypes ? file.type : file);\n }\n } else {\n // @ts-ignore\n const items = (e.dataTransfer || e.clipboardData || e.originalEvent.clipboardData).items;\n\n const promises: Promise[] = [];\n for(let i = 0; i < items.length; ++i) {\n const item: DataTransferItem = items[i];\n if(item.kind === 'file') {\n const entry = (onlyTypes ? item : item.webkitGetAsEntry()) || item.getAsFile();\n promises.push(scanFiles(entry, item));\n }\n }\n\n await Promise.all(promises);\n }\n\n /* if(!onlyTypes) {\n console.log('getFilesFromEvent: got files:', e, files);\n } */\n\n return files;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {T_ME_PREFIXES} from '../lib/mtproto/mtproto_config';\nimport cancelEvent from './dom/cancelEvent';\nimport parseUriParams from './string/parseUriParams';\n\nexport default function addAnchorListener(options: {\n name: 'showMaskedAlert' | 'execBotCommand' | 'searchByHashtag' | 'addstickers' | 'im' |\n 'resolve' | 'privatepost' | 'addstickers' | 'voicechat' | 'joinchat' | 'join' | 'invoice' |\n 'addemoji',\n protocol?: 'tg',\n callback: (params: Params, element?: HTMLAnchorElement) => boolean | any,\n noPathnameParams?: boolean,\n noUriParams?: boolean,\n noCancelEvent?: boolean\n}) {\n (window as any)[(options.protocol ? options.protocol + '_' : '') + options.name] = (element?: HTMLAnchorElement/* , e: Event */) => {\n !options.noCancelEvent && cancelEvent(null);\n\n let href = element.href;\n let pathnameParams: any[];\n let uriParams: any;\n\n const u = new URL(href);\n const match = u.host.match(/(.+?)\\.t(?:elegram)?\\.me/);\n if(match && !T_ME_PREFIXES.has(match[1])) {\n u.pathname = match[1] + (u.pathname === '/' ? '' : u.pathname);\n href = u.toString();\n }\n\n if(!options.noPathnameParams) pathnameParams = new URL(href).pathname.split('/').slice(1);\n if(!options.noUriParams) uriParams = parseUriParams(href);\n\n const res = options.callback({pathnameParams, uriParams} as Params, element);\n return res === undefined ? res : false;\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {GroupCallId, MyGroupCall} from './appGroupCallsManager';\nimport type GroupCallInstance from '../calls/groupCallInstance';\nimport type CallInstance from '../calls/callInstance';\nimport animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport appSidebarLeft, {LEFT_COLUMN_ACTIVE_CLASSNAME} from '../../components/sidebarLeft';\nimport appSidebarRight, {RIGHT_COLUMN_ACTIVE_CLASSNAME} from '../../components/sidebarRight';\nimport mediaSizes, {ScreenSize} from '../../helpers/mediaSizes';\nimport {logger, LogTypes} from '../logger';\nimport rootScope from '../rootScope';\nimport Chat, {ChatType} from '../../components/chat/chat';\nimport PopupNewMedia, {getCurrentNewMediaPopup} from '../../components/popups/newMedia';\nimport MarkupTooltip from '../../components/chat/markupTooltip';\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport SetTransition from '../../components/singleTransition';\nimport ChatDragAndDrop from '../../components/chat/dragAndDrop';\nimport {doubleRaf} from '../../helpers/schedulers';\nimport lottieLoader from '../rlottie/lottieLoader';\nimport useHeavyAnimationCheck, {dispatchHeavyAnimationEvent} from '../../hooks/useHeavyAnimationCheck';\nimport stateStorage from '../stateStorage';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport appNavigationController from '../../components/appNavigationController';\nimport AppPrivateSearchTab from '../../components/sidebarRight/tabs/search';\nimport I18n, {i18n, join, LangPackKey} from '../langPack';\nimport {ChatFull, ChatInvite, ChatParticipant, ChatParticipants, Message, MessageAction, MessageMedia, SendMessageAction, User, Chat as MTChat, UrlAuthResult} from '../../layer';\nimport PeerTitle from '../../components/peerTitle';\nimport PopupPeer, {PopupPeerCheckboxOptions} from '../../components/popups/peer';\nimport blurActiveElement from '../../helpers/dom/blurActiveElement';\nimport cancelEvent from '../../helpers/dom/cancelEvent';\nimport disableTransition from '../../helpers/dom/disableTransition';\nimport placeCaretAtEnd from '../../helpers/dom/placeCaretAtEnd';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport whichChild from '../../helpers/dom/whichChild';\nimport PopupElement from '../../components/popups';\nimport singleInstance, {InstanceDeactivateReason, SingleInstance} from '../mtproto/singleInstance';\nimport PopupStickers from '../../components/popups/stickers';\nimport PopupJoinChatInvite from '../../components/popups/joinChatInvite';\nimport {toast, toastNew} from '../../components/toast';\nimport debounce from '../../helpers/schedulers/debounce';\nimport pause from '../../helpers/schedulers/pause';\nimport {InternalLink, InternalLinkTypeMap, INTERNAL_LINK_TYPE} from './internalLink';\nimport MEDIA_MIME_TYPES_SUPPORTED from '../../environment/mediaMimeTypesSupport';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport {ONE_DAY} from '../../helpers/date';\nimport TopbarCall from '../../components/topbarCall';\nimport confirmationPopup from '../../components/confirmationPopup';\nimport IS_GROUP_CALL_SUPPORTED from '../../environment/groupCallSupport';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport {CallType} from '../calls/types';\nimport {Modify, SendMessageEmojiInteractionData} from '../../types';\nimport htmlToSpan from '../../helpers/dom/htmlToSpan';\nimport getVisibleRect from '../../helpers/dom/getVisibleRect';\nimport {simulateClickEvent} from '../../helpers/dom/clickEvent';\nimport PopupCall from '../../components/call';\nimport copy from '../../helpers/object/copy';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport numberThousandSplitter from '../../helpers/number/numberThousandSplitter';\nimport ChatBackgroundPatternRenderer from '../../components/chat/patternRenderer';\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport compareVersion from '../../helpers/compareVersion';\nimport {AppManagers} from './managers';\nimport uiNotificationsManager from './uiNotificationsManager';\nimport appMediaPlaybackController from '../../components/appMediaPlaybackController';\nimport {PHONE_NUMBER_REG_EXP} from '../richTextProcessor';\nimport wrapEmojiText from '../richTextProcessor/wrapEmojiText';\nimport wrapRichText, {CustomEmojiRendererElement, renderEmojis} from '../richTextProcessor/wrapRichText';\nimport wrapUrl from '../richTextProcessor/wrapUrl';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getUserStatusString from '../../components/wrappers/getUserStatusString';\nimport getChatMembersString from '../../components/wrappers/getChatMembersString';\nimport {STATE_INIT} from '../../config/state';\nimport CacheStorageController from '../files/cacheStorage';\nimport themeController from '../../helpers/themeController';\nimport overlayCounter from '../../helpers/overlayCounter';\nimport appDialogsManager from './appDialogsManager';\nimport idleController from '../../helpers/idleController';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport groupCallsController from '../calls/groupCallsController';\nimport callsController from '../calls/callsController';\nimport getFilesFromEvent from '../../helpers/files/getFilesFromEvent';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport appRuntimeManager from './appRuntimeManager';\nimport paymentsWrapCurrencyAmount from '../../helpers/paymentsWrapCurrencyAmount';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport {CLICK_EVENT_NAME} from '../../helpers/dom/clickEvent';\nimport PopupPayment from '../../components/popups/payment';\nimport wrapPeerTitle from '../../components/wrappers/peerTitle';\nimport NBSP from '../../helpers/string/nbsp';\nimport {makeMediaSize, MediaSize} from '../../helpers/mediaSize';\nimport {MiddleEllipsisElement} from '../../components/middleEllipsis';\nimport addAnchorListener from '../../helpers/addAnchorListener';\nimport parseUriParams from '../../helpers/string/parseUriParams';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\nimport findUpTag from '../../helpers/dom/findUpTag';\nimport {MTAppConfig} from '../mtproto/appConfig';\n\nexport type ChatSavedPosition = {\n mids: number[],\n top: number\n};\n\nexport type ChatSetPeerOptions = {\n peerId: PeerId,\n lastMsgId?: number,\n threadId?: number,\n startParam?: string,\n stack?: number,\n commentId?: number,\n type?: ChatType\n};\n\nexport type ChatSetInnerPeerOptions = Modify;\n\nexport enum APP_TABS {\n CHATLIST,\n CHAT,\n PROFILE\n}\n\nexport class AppImManager extends EventListenerBase<{\n chat_changing: (details: {from: Chat, to: Chat}) => void,\n peer_changed: (chat: Chat) => void,\n peer_changing: (chat: Chat) => void,\n tab_changing: (tabId: number) => void\n}> {\n public columnEl = document.getElementById('column-center') as HTMLDivElement;\n public chatsContainer: HTMLElement;\n\n public offline = false;\n public updateStatusInterval = 0;\n\n public log: ReturnType;\n\n public setPeerPromise: Promise = null;\n\n private tabId: APP_TABS;\n\n public chats: Chat[] = [];\n private prevTab: HTMLElement;\n private chatsSelectTabDebounced: () => void;\n\n public markupTooltip: MarkupTooltip;\n private backgroundPromises: {[slug: string]: Promise};\n\n private topbarCall: TopbarCall;\n public emojiAnimationContainer: HTMLDivElement;\n\n private lastBackgroundUrl: string;\n\n public managers: AppManagers;\n\n public cacheStorage = new CacheStorageController('cachedFiles');\n public customEmojiSize: MediaSize;\n\n get myId() {\n return rootScope.myId;\n }\n\n get chat(): Chat {\n return this.chats[this.chats.length - 1];\n }\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n\n const {\n apiUpdatesManager\n } = managers;\n apiUpdatesManager.attach(I18n.lastRequestedLangCode);\n\n appMediaPlaybackController.construct(managers);\n uiNotificationsManager.construct(managers);\n uiNotificationsManager.start();\n\n this.log = logger('IM', LogTypes.Log | LogTypes.Warn | LogTypes.Debug | LogTypes.Error);\n\n this.backgroundPromises = {};\n STATE_INIT.settings.themes.forEach((theme) => {\n if(theme.background.slug) {\n const url = 'assets/img/' + theme.background.slug + '.svg' + (IS_FIREFOX ? '?1' : '');\n this.backgroundPromises[theme.background.slug] = Promise.resolve(url);\n }\n });\n\n this.selectTab(APP_TABS.CHATLIST);\n\n idleController.addEventListener('change', (idle) => {\n this.offline = idle;\n this.updateStatus();\n if(idle) {\n clearInterval(this.updateStatusInterval);\n } else {\n this.updateStatusInterval = window.setInterval(() => this.updateStatus(), 50e3);\n }\n });\n\n this.chatsContainer = document.createElement('div');\n this.chatsContainer.classList.add('chats-container', 'tabs-container');\n this.chatsContainer.dataset.animation = 'navigation';\n\n this.emojiAnimationContainer = document.createElement('div');\n this.emojiAnimationContainer.classList.add('emoji-animation-container');\n this.appendEmojiAnimationContainer(mediaSizes.activeScreen);\n\n this.columnEl.append(this.chatsContainer);\n\n this.createNewChat();\n this.chatsSelectTab(this.chat.container);\n\n appNavigationController.onHashChange = this.onHashChange;\n // window.addEventListener('hashchange', this.onHashChange);\n\n this.setSettings();\n rootScope.addEventListener('settings_updated', this.setSettings);\n\n const onPremiumToggle = (isPremium: boolean) => {\n document.body.classList.toggle('is-premium', isPremium);\n };\n rootScope.addEventListener('premium_toggle', onPremiumToggle);\n onPremiumToggle(rootScope.premium);\n this.managers.rootScope.getPremium().then(onPremiumToggle);\n\n useHeavyAnimationCheck(() => {\n animationIntersector.setOnlyOnePlayableGroup('lock');\n animationIntersector.checkAnimations2(true);\n }, () => {\n animationIntersector.setOnlyOnePlayableGroup();\n animationIntersector.checkAnimations2(false);\n });\n\n if(IS_FIREFOX && apiManagerProxy.oldVersion && compareVersion(apiManagerProxy.oldVersion, '1.4.3') === -1) {\n this.deleteFilesIterative((response) => {\n return response.headers.get('Content-Type') === 'image/svg+xml';\n }).then(() => {\n this.applyCurrentTheme();\n });\n } else {\n this.applyCurrentTheme();\n }\n\n // * fix simultaneous opened both sidebars, can happen when floating sidebar is opened with left sidebar\n mediaSizes.addEventListener('changeScreen', (from, to) => {\n if(document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME) &&\n document.body.classList.contains(RIGHT_COLUMN_ACTIVE_CLASSNAME)) {\n appSidebarRight.toggleSidebar(false);\n }\n\n this.appendEmojiAnimationContainer(to);\n });\n\n mediaSizes.addEventListener('resize', () => {\n // const perf = performance.now();\n const rect = this.chatsContainer.getBoundingClientRect();\n ChatBackgroundPatternRenderer.resizeInstances(rect.width, rect.height).then(() => {\n // this.log.warn('resize bg time:', performance.now() - perf);\n // for(const chat of this.chats) {\n // if(chat.renderDarkPattern) {\n // chat.renderDarkPattern();\n // }\n // }\n });\n });\n\n this.addEventListener('peer_changing', (chat) => {\n this.saveChatPosition(chat);\n });\n\n rootScope.addEventListener('theme_change', () => {\n this.applyCurrentTheme();\n });\n\n rootScope.addEventListener('choosing_sticker', (choosing) => {\n this.setChoosingStickerTyping(!choosing);\n });\n\n rootScope.addEventListener('peer_title_edit', ({peerId, threadId}) => {\n if(this.chat?.peerId === peerId && !threadId && this.tabId !== undefined) {\n this.overrideHash(peerId);\n }\n });\n\n rootScope.addEventListener('peer_typings', ({peerId, typings}) => {\n const chat = this.chat;\n if(\n !chat ||\n chat.peerId !== peerId ||\n overlayCounter.isOverlayActive || (\n mediaSizes.activeScreen === ScreenSize.mobile &&\n this.tabId !== APP_TABS.CHAT\n )\n ) {\n return;\n }\n\n const typing = typings.find((typing) => typing.action._ === 'sendMessageEmojiInteraction');\n if(typing?.action?._ === 'sendMessageEmojiInteraction') {\n const action = typing.action;\n const bubble = chat.bubbles.bubbles[generateMessageId(typing.action.msg_id)];\n if(bubble && bubble.classList.contains('emoji-big') && getVisibleRect(bubble, chat.bubbles.scrollable.container)) {\n const stickerWrapper: HTMLElement = bubble.querySelector('.media-sticker-wrapper:not(.bubble-hover-reaction-sticker):not(.reaction-sticker)');\n\n const data: SendMessageEmojiInteractionData = JSON.parse(action.interaction.data);\n data.a.forEach((a) => {\n setTimeout(() => {\n simulateClickEvent(stickerWrapper);\n }, a.t * 1000);\n });\n\n this.managers.appMessagesManager.setTyping(peerId, {\n _: 'sendMessageEmojiInteractionSeen',\n emoticon: action.emoticon\n });\n }\n }\n });\n\n const onInstanceDeactivated = (reason: InstanceDeactivateReason) => {\n const isUpdated = reason === 'version';\n const popup = new PopupElement('popup-instance-deactivated', {overlayClosable: true});\n const c = document.createElement('div');\n c.classList.add('instance-deactivated-container');\n (popup as any).container.replaceWith(c);\n\n const header = document.createElement('div');\n header.classList.add('header');\n header.append(i18n(isUpdated ? 'Deactivated.Version.Title' : 'Deactivated.Title'));\n\n const subtitle = document.createElement('div');\n subtitle.classList.add('subtitle');\n subtitle.append(i18n(isUpdated ? 'Deactivated.Version.Subtitle' : 'Deactivated.Subtitle'));\n\n c.append(header, subtitle);\n\n document.body.classList.add('deactivated');\n\n const onClose = isUpdated ? () => {\n appRuntimeManager.reload();\n } : () => {\n document.body.classList.add('deactivated-backwards');\n\n singleInstance.activateInstance();\n\n setTimeout(() => {\n document.body.classList.remove('deactivated', 'deactivated-backwards');\n }, 333);\n };\n\n popup.addEventListener('close', onClose);\n popup.show();\n };\n\n singleInstance.addEventListener('deactivated', onInstanceDeactivated);\n if(singleInstance.deactivatedReason) {\n onInstanceDeactivated(singleInstance.deactivatedReason);\n }\n\n // remove scroll listener when setting chat to tray\n this.addEventListener('chat_changing', ({to}) => {\n this.toggleChatGradientAnimation(to);\n });\n\n rootScope.addEventListener('service_notification', (update) => {\n confirmationPopup({\n button: {langKey: 'OK', isCancel: true},\n description: wrapRichText(update.message)\n });\n });\n\n rootScope.addEventListener('payment_sent', async({peerId, mid, receiptMessage}) => {\n const message = await this.managers.appMessagesManager.getMessageByPeer(peerId, mid);\n if(!message) {\n return;\n }\n\n const action = receiptMessage.action as MessageAction.messageActionPaymentSent;\n toastNew({\n langPackKey: 'PaymentInfoHint',\n langPackArguments: [\n paymentsWrapCurrencyAmount(action.total_amount, action.currency),\n wrapEmojiText(((message as Message.message).media as MessageMedia.messageMediaInvoice).title)\n ]\n });\n });\n\n (window as any).onSpoilerClick = (e: MouseEvent) => {\n const spoiler = findUpClassName(e.target, 'spoiler');\n const parentElement = findUpClassName(spoiler, 'spoilers-container') || spoiler.parentElement;\n\n const className = 'is-spoiler-visible';\n const isVisible = parentElement.classList.contains(className);\n if(!isVisible) {\n cancelEvent(e);\n\n if(CLICK_EVENT_NAME !== 'click') {\n window.addEventListener('click', cancelEvent, {capture: true, once: true});\n }\n }\n\n const duration = 400 / 2;\n const showDuration = 5000;\n const useRafs = !isVisible ? 2 : 0;\n if(useRafs) {\n parentElement.classList.add('will-change');\n }\n\n const spoilerTimeout = parentElement.dataset.spoilerTimeout;\n if(spoilerTimeout !== null) {\n clearTimeout(+spoilerTimeout);\n delete parentElement.dataset.spoilerTimeout;\n }\n\n SetTransition({\n element: parentElement,\n className,\n forwards: true,\n duration,\n onTransitionEnd: () => {\n parentElement.dataset.spoilerTimeout = '' + window.setTimeout(() => {\n SetTransition({\n element: parentElement,\n className,\n forwards: false,\n duration,\n onTransitionEnd: () => {\n parentElement.classList.remove('will-change');\n delete parentElement.dataset.spoilerTimeout;\n }\n });\n }, showDuration);\n },\n useRafs\n });\n };\n\n rootScope.addEventListener('sticker_updated', ({type, faved}) => {\n if(type === 'faved') {\n toastNew({\n langPackKey: faved ? 'AddedToFavorites' : 'RemovedFromFavorites'\n });\n } else if(!faved) {\n toastNew({\n langPackKey: 'RemovedFromRecent'\n });\n }\n });\n\n apiManagerProxy.addEventListener('notificationBuild', async(options) => {\n const isForum = await this.managers.appPeersManager.isForum(options.message.peerId);\n const threadId = getMessageThreadId(options.message, isForum);\n if(this.chat.peerId === options.message.peerId && this.chat.threadId === threadId && !idleController.isIdle) {\n return;\n }\n\n uiNotificationsManager.buildNotification(options);\n });\n\n this.addEventListener('peer_changed', async({peerId}) => {\n document.body.classList.toggle('has-chat', !!peerId);\n\n this.emojiAnimationContainer.textContent = '';\n\n this.overrideHash(peerId);\n\n apiManagerProxy.updateTabState('chatPeerIds', this.chats.map((chat) => chat.peerId).filter(Boolean));\n });\n\n // stateStorage.get('chatPositions').then((c) => {\n stateStorage.setToCache('chatPositions', /* c || */{});\n // });\n\n if(IS_CALL_SUPPORTED || IS_GROUP_CALL_SUPPORTED) {\n this.topbarCall = new TopbarCall(managers);\n }\n\n if(IS_CALL_SUPPORTED) {\n callsController.addEventListener('instance', ({instance/* , hasCurrent */}) => {\n // if(hasCurrent) {\n // return;\n // }\n\n const popup = new PopupCall(instance);\n\n instance.addEventListener('acceptCallOverride', () => {\n return this.discardCurrentCall(instance.interlocutorUserId.toPeerId(), undefined, instance)\n .then(() => {\n callsController.dispatchEvent('accepting', instance);\n return true;\n })\n .catch(() => false);\n });\n\n popup.addEventListener('close', () => {\n const currentCall = callsController.currentCall;\n if(currentCall && currentCall !== instance && !instance.wasTryingToJoin) {\n instance.hangUp('phoneCallDiscardReasonBusy');\n }\n }, {once: true});\n\n popup.show();\n });\n\n callsController.addEventListener('incompatible', async(userId) => {\n toastNew({\n langPackKey: 'VoipPeerIncompatible',\n langPackArguments: [\n await wrapPeerTitle({peerId: userId.toPeerId()})\n ]\n });\n });\n }\n\n // ! do not remove this line\n // ! instance can be deactivated before the UI starts, because it waits in background for RAF that is delayed\n singleInstance.activateInstance();\n\n const setAuthorized = () => {\n telegramMeWebManager.setAuthorized(true);\n };\n\n setInterval(setAuthorized, ONE_DAY);\n setAuthorized();\n\n addAnchorListener<{}>({\n name: 'showMaskedAlert',\n callback: (params, element) => {\n const href = element.href;\n\n const a = element.cloneNode(true) as HTMLAnchorElement;\n a.className = 'anchor-url';\n a.innerText = href;\n a.removeAttribute('onclick');\n\n new PopupPeer('popup-masked-url', {\n titleLangKey: 'OpenUrlTitle',\n descriptionLangKey: 'OpenUrlAlert2',\n descriptionLangArgs: [a],\n buttons: [{\n langKey: 'Open',\n callback: () => {\n a.click();\n }\n }]\n }).show();\n }\n });\n\n addAnchorListener<{uriParams: {command: string, bot: string}}>({\n name: 'execBotCommand',\n callback: ({uriParams}) => {\n const {command, bot} = uriParams;\n\n /* const promise = bot ? this.openUsername(bot).then(() => this.chat.peerId) : Promise.resolve(this.chat.peerId);\n promise.then((peerId) => {\n this.managers.appMessagesManager.sendText(peerId, '/' + command);\n }); */\n\n this.managers.appMessagesManager.sendText(this.chat.peerId, '/' + command + (bot ? '@' + bot : ''));\n\n // console.log(command, bot);\n }\n });\n\n addAnchorListener<{uriParams: {hashtag: string}}>({\n name: 'searchByHashtag',\n callback: ({uriParams}) => {\n const {hashtag} = uriParams;\n if(!hashtag) {\n return;\n }\n\n this.chat.initSearch('#' + hashtag + ' ');\n }\n });\n\n ([\n ['addstickers', INTERNAL_LINK_TYPE.STICKER_SET],\n ['addemoji', INTERNAL_LINK_TYPE.EMOJI_SET]\n ] as [\n 'addstickers' | 'addemoji',\n INTERNAL_LINK_TYPE.STICKER_SET | INTERNAL_LINK_TYPE.EMOJI_SET\n ][]).forEach(([name, type]) => {\n addAnchorListener<{pathnameParams: [typeof name, string]}>({\n name,\n callback: ({pathnameParams}) => {\n if(!pathnameParams[1]) {\n return;\n }\n\n const link: InternalLink = {\n _: type,\n set: pathnameParams[1]\n };\n\n this.processInternalLink(link);\n }\n });\n\n addAnchorListener<{\n uriParams: {\n set: string\n }\n }>({\n name,\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(type, uriParams);\n this.processInternalLink(link);\n }\n });\n });\n\n // * t.me/invoice/asdasdad\n // * t.me/$asdasdad\n addAnchorListener<{pathnameParams: ['invoice', string] | string}>({\n name: 'invoice',\n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.INVOICE,\n slug: pathnameParams.length > 1 ? pathnameParams[1] : pathnameParams[0].slice(1)\n };\n\n this.processInternalLink(link);\n }\n });\n\n // Support old t.me/joinchat/asd and new t.me/+asd\n addAnchorListener<{pathnameParams: ['joinchat', string]}>({\n name: 'joinchat',\n callback: ({pathnameParams}) => {\n const link: InternalLink = {\n _: INTERNAL_LINK_TYPE.JOIN_CHAT,\n invite: pathnameParams[1] || decodeURIComponent(pathnameParams[0]).slice(1)\n };\n\n this.processInternalLink(link);\n }\n });\n\n if(IS_GROUP_CALL_SUPPORTED) {\n addAnchorListener<{\n uriParams: Omit\n }>({\n name: 'voicechat',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.VOICE_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n }\n\n addAnchorListener<{\n // pathnameParams: ['c', string, string],\n // uriParams: {thread?: number}\n // } | {\n // pathnameParams: [string, string?],\n // uriParams: {comment?: number}\n pathnameParams: ['c', string, string] | [string, string?],\n uriParams: {thread?: string, comment?: string} | {comment?: string, start?: string}\n }>({\n name: 'im',\n callback: async({pathnameParams, uriParams}, element) => {\n let link: InternalLink;\n if(PHONE_NUMBER_REG_EXP.test(pathnameParams[0])) {\n link = {\n _: INTERNAL_LINK_TYPE.USER_PHONE_NUMBER,\n phone: pathnameParams[0].slice(1)\n };\n } else if(pathnameParams[0] === 'c') {\n pathnameParams.shift();\n const thread = 'thread' in uriParams ? uriParams.thread : pathnameParams[2] && pathnameParams[1];\n link = {\n _: INTERNAL_LINK_TYPE.PRIVATE_POST,\n channel: pathnameParams[0],\n post: pathnameParams[2] || pathnameParams[1],\n thread,\n comment: uriParams.comment,\n stack: this.getStackFromElement(element)\n };\n } else {\n const thread = 'thread' in uriParams ? uriParams.thread : pathnameParams[2] && pathnameParams[1];\n link = {\n _: INTERNAL_LINK_TYPE.MESSAGE,\n domain: pathnameParams[0],\n post: pathnameParams[2] || pathnameParams[1],\n thread,\n comment: uriParams.comment,\n start: 'start' in uriParams ? uriParams.start : undefined,\n stack: this.getStackFromElement(element)\n };\n }\n\n this.processInternalLink(link);\n }\n });\n\n addAnchorListener<{\n uriParams: {\n domain: string,\n\n // telegrampassport\n scope?: string,\n nonce?: string,\n payload?: string,\n bot_id?: string,\n public_key?: string,\n callback_url?: string,\n\n // regular\n start?: string,\n startgroup?: string,\n game?: string,\n voicechat?: string,\n post?: string,\n thread?: string,\n comment?: string,\n phone?: string\n }\n }>({\n name: 'resolve',\n protocol: 'tg',\n callback: ({uriParams}, element) => {\n let link: InternalLink;\n if(uriParams.phone) {\n link = this.makeLink(INTERNAL_LINK_TYPE.USER_PHONE_NUMBER, uriParams as Required);\n } else if(uriParams.domain === 'telegrampassport') {\n\n } else {\n link = this.makeLink(INTERNAL_LINK_TYPE.MESSAGE, {\n ...uriParams,\n stack: this.getStackFromElement(element)\n });\n }\n\n this.processInternalLink(link);\n }\n });\n\n addAnchorListener<{\n uriParams: {\n channel: string,\n post: string,\n thread?: string,\n comment?: string\n }\n }>({\n name: 'privatepost',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.PRIVATE_POST, uriParams);\n this.processInternalLink(link);\n }\n });\n\n addAnchorListener<{\n uriParams: {\n slug: string\n }\n }>({\n name: 'invoice',\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.INVOICE, uriParams);\n this.processInternalLink(link);\n }\n });\n\n ['joinchat' as const, 'join' as const].forEach((name) => {\n addAnchorListener<{\n uriParams: {\n invite: string\n }\n }>({\n name,\n protocol: 'tg',\n callback: ({uriParams}) => {\n const link = this.makeLink(INTERNAL_LINK_TYPE.JOIN_CHAT, uriParams);\n this.processInternalLink(link);\n }\n });\n });\n\n this.onHashChange(true);\n this.attachKeydownListener();\n this.handleAutologinDomains();\n }\n\n public handleUrlAuth(options: {\n peerId?: PeerId,\n mid?: number,\n buttonId?: number,\n url: string\n }) {\n const {peerId, mid, buttonId, url} = options;\n\n const openWindow = (url: string) => {\n window.open(url, '_blank');\n };\n\n const onUrlAuthResultAccepted = (urlAuthResult: UrlAuthResult.urlAuthResultAccepted) => {\n openWindow(urlAuthResult.url);\n };\n\n const onUrlAuthResult = async(urlAuthResult: UrlAuthResult): Promise => {\n if(urlAuthResult._ === 'urlAuthResultRequest') {\n const b = document.createElement('b');\n b.append(urlAuthResult.domain);\n const peerTitle = await wrapPeerTitle({peerId: rootScope.myId});\n const botPeerTitle = await wrapPeerTitle({peerId: urlAuthResult.bot.id.toPeerId()});\n\n const logInCheckbox: PopupPeerCheckboxOptions = {\n text: 'OpenUrlOption1',\n textArgs: [b.cloneNode(true), peerTitle],\n checked: true\n };\n\n const allowMessagesCheckbox: PopupPeerCheckboxOptions = urlAuthResult.pFlags.request_write_access ? {\n text: 'OpenUrlOption2',\n textArgs: [botPeerTitle],\n checked: true\n } : undefined;\n\n const checkboxes: PopupPeerCheckboxOptions[] = [\n logInCheckbox,\n allowMessagesCheckbox\n ];\n\n const confirmationPromise = confirmationPopup({\n titleLangKey: 'OpenUrlTitle',\n button: {\n langKey: 'Open'\n },\n descriptionLangKey: 'OpenUrlAlert2',\n descriptionLangArgs: [b],\n checkboxes: checkboxes.filter(Boolean)\n });\n\n if(allowMessagesCheckbox) {\n logInCheckbox.checkboxField.input.addEventListener('change', () => {\n const disabled = !logInCheckbox.checkboxField.checked;\n allowMessagesCheckbox.checkboxField.toggleDisability(disabled);\n\n if(disabled) {\n allowMessagesCheckbox.checkboxField.checked = false;\n }\n });\n }\n\n const [logInChecked, allowMessagesChecked] = await confirmationPromise;\n\n if(!logInChecked) {\n openWindow(url);\n return;\n }\n\n const result = await this.managers.appSeamlessLoginManager.acceptUrlAuth(\n url,\n peerId,\n mid,\n buttonId,\n allowMessagesChecked\n );\n\n return onUrlAuthResult(result);\n } else if(urlAuthResult._ === 'urlAuthResultAccepted') {\n onUrlAuthResultAccepted(urlAuthResult);\n } else {\n openWindow(url);\n }\n };\n\n return this.managers.appSeamlessLoginManager.requestUrlAuth(\n url,\n peerId,\n mid,\n buttonId\n ).then((urlAuthResult) => {\n onUrlAuthResult(urlAuthResult);\n });\n }\n\n private handleAutologinDomains() {\n let appConfig: MTAppConfig;\n rootScope.addEventListener('app_config', (_appConfig) => {\n appConfig = _appConfig;\n });\n\n const onAnchorClick = (element: HTMLAnchorElement) => {\n const url = new URL(element.href);\n if(appConfig.url_auth_domains.includes(url.hostname)) {\n this.handleUrlAuth({url: element.href});\n cancelEvent();\n return;\n }\n\n if(!appConfig.autologin_token || !appConfig.autologin_domains) {\n return;\n }\n\n const originalUrl = element.dataset.originalUrl ??= element.href;\n if(appConfig.autologin_domains.includes(url.hostname)) {\n url.searchParams.set('autologin_token', appConfig.autologin_token);\n element.href = url.toString();\n\n setTimeout(() => {\n element.href = originalUrl;\n delete element.dataset.originalUrl;\n }, 0);\n }\n };\n\n document.addEventListener('click', (e) => {\n const anchor = findUpTag(e.target as HTMLElement, 'A') as HTMLAnchorElement;\n if(anchor?.href) {\n onAnchorClick(anchor);\n }\n });\n\n // addAnchorListener({\n // name: 'handleUrlClick',\n // callback: (_, element) => {\n // onAnchorClick(element);\n // },\n // noCancelEvent: true,\n // noPathnameParams: true,\n // noUriParams: true\n // });\n }\n\n private getStackFromElement(element: HTMLElement) {\n const possibleBubble = findUpClassName(element, 'bubble');\n return possibleBubble ? +possibleBubble.dataset.mid : undefined;\n }\n\n private deleteFilesIterative(callback: (response: Response) => boolean) {\n return this.cacheStorage.timeoutOperation((cache) => {\n const perf = performance.now();\n return cache.keys().then((requests) => {\n const promises = requests.map((request) => {\n return cache.match(request).then((response) => {\n return callback(response);\n });\n });\n\n return Promise.all(promises).then((values) => {\n values.map((isBad, idx) => {\n if(!isBad) {\n return;\n }\n\n const request = requests[idx];\n return cache.delete(request);\n });\n\n return Promise.all(values.filter(Boolean));\n });\n }).then(() => {\n this.log('deleted files', performance.now() - perf);\n });\n });\n }\n\n private toggleChatGradientAnimation(activatingChat: Chat) {\n this.chats.forEach((chat) => {\n if(chat.gradientRenderer) {\n chat.gradientRenderer.scrollAnimate(rootScope.settings.animationsEnabled && chat === activatingChat);\n }\n });\n }\n\n private appendEmojiAnimationContainer(screen: ScreenSize) {\n const appendTo = screen === ScreenSize.mobile ? this.columnEl : document.body;\n if(this.emojiAnimationContainer.parentElement !== appendTo) {\n appendTo.append(this.emojiAnimationContainer)\n }\n }\n\n private attachKeydownListener() {\n const IGNORE_KEYS = new Set(['PageUp', 'PageDown', 'Meta', 'Control']);\n const onKeyDown = (e: KeyboardEvent) => {\n const key = e.key;\n const isSelectionCollapsed = document.getSelection().isCollapsed;\n if(overlayCounter.isOverlayActive || IGNORE_KEYS.has(key)) return;\n\n const target = e.target as HTMLElement;\n\n // if(target.tagName === 'INPUT') return;\n\n // this.log('onkeydown', e, document.activeElement);\n\n const chat = this.chat;\n\n if((key.startsWith('Arrow') || (e.shiftKey && key === 'Shift')) && !isSelectionCollapsed) {\n return;\n } else if(e.code === 'KeyC' && (e.ctrlKey || e.metaKey) && target.tagName !== 'INPUT') {\n return;\n } else if(e.altKey && (key === 'ArrowUp' || key === 'ArrowDown')) {\n cancelEvent(e);\n this.managers.dialogsStorage.getNextDialog(this.chat.peerId, key === 'ArrowDown', appDialogsManager.filterId).then((dialog) => {\n if(dialog) {\n this.setPeer({peerId: dialog.peerId});\n }\n });\n } else if(key === 'ArrowUp' && this.chat.type !== 'scheduled') {\n if(!chat.input.editMsgId && chat.input.isInputEmpty()) {\n this.managers.appMessagesManager.getFirstMessageToEdit(chat.peerId, chat.threadId).then((message) => {\n if(message) {\n chat.input.initMessageEditing(message.mid);\n cancelEvent(e); // * prevent from scrolling\n }\n });\n } else {\n return;\n }\n } else if(key === 'ArrowDown') {\n return;\n }\n\n if(\n chat?.input?.messageInput &&\n e.target !== chat.input.messageInput &&\n target.tagName !== 'INPUT' &&\n !target.isContentEditable &&\n !IS_TOUCH_SUPPORTED &&\n (!mediaSizes.isMobile || this.tabId === APP_TABS.CHAT) &&\n !chat.selection.isSelecting &&\n !chat.input.recording\n ) {\n chat.input.messageInput.focus();\n placeCaretAtEnd(chat.input.messageInput);\n\n // clone and dispatch same event to new input. it is needed for sending message if input was blurred\n const newEvent = new KeyboardEvent(e.type, e);\n chat.input.messageInput.dispatchEvent(newEvent);\n }\n };\n\n document.body.addEventListener('keydown', onKeyDown);\n }\n\n private makeLink(type: T, uriParams: Omit) {\n return {\n _: type,\n ...uriParams\n } as any as InternalLinkTypeMap[T];\n }\n\n public async processInternalLink(link: InternalLink) {\n switch(link?._) {\n case INTERNAL_LINK_TYPE.MESSAGE: {\n const postId = link.post ? generateMessageId(+link.post) : undefined;\n const commentId = link.comment ? generateMessageId(+link.comment) : undefined;\n const threadId = link.thread ? generateMessageId(+link.thread) : undefined;\n\n this.openUsername({\n userName: link.domain,\n lastMsgId: postId,\n commentId,\n startParam: link.start,\n stack: link.stack,\n threadId\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.PRIVATE_POST: {\n const chatId = link.channel.toChatId();\n const peerId = chatId.toPeerId(true);\n\n const chat = await this.managers.appChatsManager.getChat(chatId);\n if(!chat) {\n try {\n await this.managers.appChatsManager.resolveChannel(chatId);\n } catch(err) {\n toastNew({langPackKey: 'LinkNotFound'});\n throw err;\n }\n }\n\n const postId = generateMessageId(+link.post);\n const threadId = link.thread ? generateMessageId(+link.thread) : undefined;\n\n this.op({\n peer: chat,\n lastMsgId: postId,\n threadId,\n stack: link.stack\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.EMOJI_SET:\n case INTERNAL_LINK_TYPE.STICKER_SET: {\n new PopupStickers({id: link.set}, link._ === INTERNAL_LINK_TYPE.EMOJI_SET).show();\n break;\n }\n\n case INTERNAL_LINK_TYPE.JOIN_CHAT: {\n this.managers.appChatsManager.checkChatInvite(link.invite).then((chatInvite) => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n this.managers.appChatsManager.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n // console.log(chatInvite);\n\n if(chatInvite._ === 'chatInviteAlready' ||\n chatInvite._ === 'chatInvitePeek'/* && chatInvite.expires > tsNow(true) */) {\n this.setInnerPeer({\n peerId: chatInvite.chat.id.toPeerId(true)\n });\n return;\n }\n\n new PopupJoinChatInvite(link.invite, chatInvite);\n }, (err) => {\n if(err.type === 'INVITE_HASH_EXPIRED') {\n toast(i18n('InviteExpired'));\n }\n });\n break;\n }\n\n case INTERNAL_LINK_TYPE.VOICE_CHAT: {\n if(IS_GROUP_CALL_SUPPORTED) {\n this.joinGroupCall(link.chat_id.toPeerId(true), link.id);\n }\n\n break;\n }\n\n case INTERNAL_LINK_TYPE.USER_PHONE_NUMBER: {\n this.managers.appUsersManager.resolvePhone(link.phone).then((user) => {\n this.setInnerPeer({\n peerId: user.id.toPeerId(false)\n });\n }).catch((err) => {\n if(err.type === 'PHONE_NOT_OCCUPIED') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n\n break;\n }\n\n case INTERNAL_LINK_TYPE.INVOICE: {\n this.managers.appPaymentsManager.getInputInvoiceBySlug(link.slug).then((inputInvoice) => {\n this.managers.appPaymentsManager.getPaymentForm(inputInvoice).then((paymentForm) => {\n // const message: Message.message = {\n // _: 'message',\n // date: 0,\n // id: 0,\n // peerId: 0,\n // peer_id: undefined,\n // message: '',\n // media: {\n // _: 'messageMediaInvoice',\n // currency: paymentForm.invoice.currency,\n // description: paymentForm.description,\n\n // }\n // };\n new PopupPayment(undefined, inputInvoice, paymentForm);\n });\n });\n break;\n }\n\n default: {\n this.log.warn('Not supported internal link:', link);\n break;\n }\n }\n }\n\n public openUrl(url: string) {\n const {url: wrappedUrl, onclick} = wrapUrl(url);\n if(!onclick) {\n return;\n }\n\n const a = document.createElement('a');\n a.href = wrappedUrl;\n (window as any)[onclick](a);\n }\n\n private onHashChange = (saveState?: boolean) => {\n try {\n this.onHashChangeUnsafe(saveState);\n } catch(err) {\n this.log.error('hash change error', err);\n }\n };\n\n private onHashChangeUnsafe = (saveState?: boolean) => {\n const hash = location.hash;\n if(!saveState) {\n appNavigationController.replaceState();\n }\n\n const splitted = hash.split('?');\n const params = parseUriParams(hash, splitted);\n this.log('hashchange', hash, splitted[0], params);\n if(!hash) {\n return;\n }\n\n if(params.tgaddr) {\n this.openUrl(params.tgaddr);\n return;\n }\n\n switch(splitted[0]) {\n default: {\n params.p = splitted[0].slice(1);\n }\n\n case '#/im': {\n if(!Object.keys(params).length) {\n break;\n }\n\n const p: string = params.p;\n const postId = params.post !== undefined ? generateMessageId(+params.post) : undefined;\n\n switch(p[0]) {\n case '@': {\n this.openUsername({\n userName: p,\n lastMsgId: postId\n });\n break;\n }\n\n default: { // peerId\n this.setInnerPeer({\n peerId: postId ? p.toPeerId(true) : p.toPeerId(),\n lastMsgId: postId\n });\n break;\n }\n }\n }\n }\n\n // appNavigationController.replaceState();\n // location.hash = '';\n };\n\n private async op(options: {\n peer: User.user | MTChat\n } & Omit) {\n let {peer, commentId, threadId, lastMsgId} = options;\n const isUser = peer._ === 'user';\n const peerId = peer.id.toPeerId(!isUser);\n\n const isForum = peer._ === 'channel' && peer.pFlags.forum;\n // open forum tab\n if(!commentId && !threadId && !lastMsgId && isForum) {\n appDialogsManager.toggleForumTabByPeerId(peerId, true);\n return;\n }\n\n // handle t.me/username/thread or t.me/username/messageId\n if(isForum && lastMsgId && !threadId) {\n const message = await this.managers.appMessagesManager.reloadMessages(peerId, lastMsgId);\n if(message) {\n threadId = options.threadId = getMessageThreadId(message, isForum);\n } else {\n threadId = options.threadId = lastMsgId;\n lastMsgId = options.lastMsgId = undefined;\n }\n }\n\n if(threadId) {\n return this.openThread({\n ...(options as any as Parameters[0]),\n peerId\n });\n } else if(commentId) {\n return this.openComment({\n peerId,\n msgId: lastMsgId,\n commentId\n });\n }\n\n return this.setInnerPeer({\n ...options,\n peerId\n });\n }\n\n public openPremiumBot() {\n return this.managers.apiManager.getAppConfig().then((appConfig) => {\n return this.openUsername({userName: appConfig.premium_bot_username});\n });\n }\n\n public openUsername(options: {\n userName: string\n } & Omit) {\n const {userName} = options;\n return this.managers.appUsersManager.resolveUsername(userName).then((peer) => {\n return this.op({\n peer,\n ...options\n });\n }, (err: ApiError) => {\n if(err.type === 'USERNAME_NOT_OCCUPIED') {\n toastNew({langPackKey: 'NoUsernameFound'});\n } else if(err.type === 'USERNAME_INVALID') {\n toastNew({langPackKey: 'Alert.UserDoesntExists'});\n }\n });\n }\n\n /**\n * Opens thread when peerId of discussion group is known\n */\n public async openThread(options: {\n peerId: PeerId,\n lastMsgId: number,\n threadId: number,\n stack?: number\n }) {\n if(await this.managers.appChatsManager.isForum(options.peerId.toChatId())) {\n await this.managers.dialogsStorage.getForumTopicOrReload(options.peerId, options.threadId);\n return this.setInnerPeer(options);\n }\n\n return this.managers.appMessagesManager.reloadMessages(options.peerId, options.threadId).then((message) => {\n if(!message) {\n options.lastMsgId = undefined;\n } else {\n this.managers.appMessagesManager.generateThreadServiceStartMessage(message);\n }\n\n return this.setInnerPeer({\n ...options,\n type: 'discussion'\n });\n });\n }\n\n /**\n * Opens comment directly from original channel\n */\n public openComment(options: {\n peerId: PeerId,\n msgId: number,\n commentId: number\n }) {\n return this.managers.appMessagesManager.getDiscussionMessage(options.peerId, options.msgId).then((message) => {\n return this.openThread({\n peerId: message.peerId,\n lastMsgId: options.commentId,\n threadId: message.mid\n });\n });\n }\n\n public async callUser(userId: UserId, type: CallType) {\n const call = callsController.getCallByUserId(userId);\n if(call) {\n return;\n }\n\n const userFull = await this.managers.appProfileManager.getProfile(userId);\n if(userFull.pFlags.phone_calls_private) {\n wrapPeerTitle({peerId: userId.toPeerId()}).then((element) => {\n return confirmationPopup({\n descriptionLangKey: 'Call.PrivacyErrorMessage',\n descriptionLangArgs: [element],\n button: {\n langKey: 'OK',\n isCancel: true\n }\n });\n });\n\n return;\n }\n\n await this.discardCurrentCall(userId.toPeerId());\n\n callsController.startCallInternal(userId, type === 'video');\n }\n\n private discardCurrentCall(toPeerId: PeerId, ignoreGroupCall?: GroupCallInstance, ignoreCall?: CallInstance) {\n if(groupCallsController.groupCall && groupCallsController.groupCall !== ignoreGroupCall) return this.discardGroupCallConfirmation(toPeerId);\n else if(callsController.currentCall && callsController.currentCall !== ignoreCall) return this.discardCallConfirmation(toPeerId);\n else return Promise.resolve();\n }\n\n private async discardCallConfirmation(toPeerId: PeerId) {\n const currentCall = callsController.currentCall;\n if(currentCall) {\n await Promise.all([\n wrapPeerTitle({peerId: currentCall.interlocutorUserId.toPeerId(false)}),\n wrapPeerTitle({peerId: toPeerId})\n ]).then(([title1, title2]) => {\n return confirmationPopup({\n titleLangKey: 'Call.Confirm.Discard.Call.Header',\n descriptionLangKey: toPeerId.isUser() ? 'Call.Confirm.Discard.Call.ToCall.Text' : 'Call.Confirm.Discard.Call.ToVoice.Text',\n descriptionLangArgs: [title1, title2],\n button: {\n langKey: 'OK'\n }\n });\n });\n\n if(!currentCall.isClosing) {\n await currentCall.hangUp('phoneCallDiscardReasonDisconnect');\n }\n }\n }\n\n private async discardGroupCallConfirmation(toPeerId: PeerId) {\n const currentGroupCall = groupCallsController.groupCall;\n if(currentGroupCall) {\n await Promise.all([\n wrapPeerTitle({peerId: currentGroupCall.chatId.toPeerId(true)}),\n wrapPeerTitle({peerId: toPeerId})\n ]).then(([title1, title2]) => {\n return confirmationPopup({\n titleLangKey: 'Call.Confirm.Discard.Voice.Header',\n descriptionLangKey: toPeerId.isUser() ? 'Call.Confirm.Discard.Voice.ToCall.Text' : 'Call.Confirm.Discard.Voice.ToVoice.Text',\n descriptionLangArgs: [title1, title2],\n button: {\n langKey: 'OK'\n }\n });\n });\n\n if(groupCallsController.groupCall === currentGroupCall) {\n await currentGroupCall.hangUp();\n }\n }\n }\n\n public async joinGroupCall(peerId: PeerId, groupCallId?: GroupCallId) {\n const chatId = peerId.toChatId();\n const hasRights = this.managers.appChatsManager.hasRights(chatId, 'manage_call');\n const next = async() => {\n const chatFull = await this.managers.appProfileManager.getChatFull(chatId);\n let call: MyGroupCall;\n if(!chatFull.call) {\n if(!hasRights) {\n return;\n }\n\n call = await this.managers.appGroupCallsManager.createGroupCall(chatId);\n } else {\n call = chatFull.call;\n }\n\n groupCallsController.joinGroupCall(chatId, call.id, true, false);\n };\n\n if(groupCallId) {\n const groupCall = await this.managers.appGroupCallsManager.getGroupCallFull(groupCallId);\n if(groupCall._ === 'groupCallDiscarded') {\n if(!hasRights) {\n toastNew({\n langPackKey: 'VoiceChat.Chat.Ended'\n });\n\n return;\n }\n\n await confirmationPopup({\n descriptionLangKey: 'VoiceChat.Chat.StartNew',\n button: {\n langKey: 'VoiceChat.Chat.StartNew.OK'\n }\n });\n }\n }\n\n // await this.discardCurrentCall(peerId);\n\n next();\n };\n\n public setCurrentBackground(broadcastEvent = false): ReturnType {\n const theme = themeController.getTheme();\n\n if(theme.background.slug) {\n const defaultTheme = STATE_INIT.settings.themes.find((t) => t.name === theme.name);\n // const isDefaultBackground = theme.background.blur === defaultTheme.background.blur &&\n // theme.background.slug === defaultTheme.background.slug;\n\n // if(!isDefaultBackground) {\n return this.getBackground(theme.background.slug).then((url) => {\n return this.setBackground(url, broadcastEvent);\n }, () => { // * if NO_ENTRY_FOUND\n theme.background = copy(defaultTheme.background); // * reset background\n return this.setCurrentBackground(true);\n });\n // }\n }\n\n return this.setBackground('', broadcastEvent);\n }\n\n private getBackground(slug: string) {\n if(this.backgroundPromises[slug]) return this.backgroundPromises[slug];\n return this.backgroundPromises[slug] = this.cacheStorage.getFile('backgrounds/' + slug).then((blob) => {\n return URL.createObjectURL(blob);\n });\n }\n\n public setBackground(url: string, broadcastEvent = true): Promise {\n this.lastBackgroundUrl = url;\n const promises = this.chats.map((chat) => chat.setBackground(url));\n return promises[promises.length - 1].then(() => {\n if(broadcastEvent) {\n rootScope.dispatchEvent('background_change');\n }\n });\n }\n\n public saveChatPosition(chat: Chat) {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n\n // const bubble = chat.bubbles.getBubbleByPoint('top');\n // if(bubble) {\n // const top = bubble.getBoundingClientRect().top;\n const chatBubbles = chat.bubbles;\n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const chatPositions = stateStorage.getFromCache('chatPositions');\n if(!(chatBubbles.scrollable.getDistanceToEnd() <= 16 && chatBubbles.scrollable.loadedAll.bottom) && chatBubbles.getRenderedLength()) {\n chatBubbles.sliceViewport(true);\n const top = chatBubbles.scrollable.scrollTop;\n\n const position = {\n mids: getObjectKeysAndSort(chatBubbles.bubbles, 'desc').filter((mid) => mid > 0 && !chatBubbles.skippedMids.has(mid)),\n top\n };\n\n chatPositions[key] = position;\n\n this.log('saved chat position:', position);\n } else {\n delete chatPositions[key];\n\n this.log('deleted chat position');\n }\n\n stateStorage.set({chatPositions}, true);\n // }\n }\n\n public getChatSavedPosition(chat: Chat): ChatSavedPosition {\n if(!(['chat', 'discussion'] as ChatType[]).includes(chat.type) || !chat.peerId) {\n return;\n }\n\n const key = chat.peerId + (chat.threadId ? '_' + chat.threadId : '');\n const cache = stateStorage.getFromCache('chatPositions');\n return cache && cache[key];\n }\n\n public applyCurrentTheme(slug?: string, backgroundUrl?: string, broadcastEvent?: boolean) {\n if(backgroundUrl) {\n this.backgroundPromises[slug] = Promise.resolve(backgroundUrl);\n }\n\n themeController.setTheme();\n\n return this.setCurrentBackground(broadcastEvent === undefined ? !!slug : broadcastEvent);\n }\n\n private setSettings = () => {\n const {messagesTextSize} = rootScope.settings;\n\n this.customEmojiSize = makeMediaSize(messagesTextSize + 4, messagesTextSize + 4);\n document.documentElement.style.setProperty('--messages-text-size', messagesTextSize + 'px');\n\n const firstTime = !this.customEmojiSize;\n if(!firstTime) {\n const ellipsisElements = document.querySelectorAll('middle-ellipsis-element');\n ellipsisElements.forEach((element) => {\n element.disconnectedCallback();\n element.dataset.fontSize = '' + messagesTextSize;\n if(element.title) element.textContent = element.title;\n element.connectedCallback();\n });\n\n const renderers = document.querySelectorAll('.chat custom-emoji-renderer-element');\n renderers.forEach((renderer) => {\n renderer.forceRenderAfterSize = true;\n });\n }\n\n document.body.classList.toggle('animation-level-0', !rootScope.settings.animationsEnabled);\n document.body.classList.toggle('animation-level-1', false);\n document.body.classList.toggle('animation-level-2', rootScope.settings.animationsEnabled);\n\n this.chatsSelectTabDebounced = debounce(() => {\n const topbar = this.chat.topbar;\n topbar.pinnedMessage?.setCorrectIndex(0); // * буду молиться богам, чтобы это ничего не сломало, но это исправляет получение пиннеда после анимации\n\n this.managers.apiFileManager.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId);\n }, rootScope.settings.animationsEnabled ? 250 : 0, false, true);\n\n lottieLoader.setLoop(rootScope.settings.stickers.loop);\n animationIntersector.checkAnimations2(false);\n\n for(const chat of this.chats) {\n chat.setAutoDownloadMedia();\n }\n\n I18n.setTimeFormat(rootScope.settings.timeFormat);\n\n this.toggleChatGradientAnimation(this.chat);\n };\n\n // * не могу использовать тут TransitionSlider, так как мне нужен отрисованный блок рядом\n // * (или под текущим чатом) чтобы правильно отрендерить чат (напр. scrollTop)\n private chatsSelectTab(tab: HTMLElement, animate?: boolean) {\n if(this.prevTab === tab) {\n return;\n }\n\n if(animate === false && this.prevTab) { // * will be used for Safari iOS history swipe\n disableTransition([tab, this.prevTab].filter(Boolean));\n }\n\n if(this.prevTab) {\n this.prevTab.classList.remove('active');\n this.chatsSelectTabDebounced();\n\n // ! нужно переделать на animation, так как при лаге анимация будет длиться не 250мс\n if(rootScope.settings.animationsEnabled && animate !== false) {\n dispatchHeavyAnimationEvent(pause(250 + 150), 250 + 150);\n }\n\n const prevIdx = whichChild(this.prevTab);\n const idx = whichChild(tab);\n if(idx > prevIdx) {\n appNavigationController.pushItem({\n type: 'chat',\n onPop: (canAnimate) => {\n this.setPeer({}, canAnimate);\n blurActiveElement();\n }\n });\n }\n }\n\n tab.classList.add('active');\n this.prevTab = tab;\n }\n\n private init() {\n document.addEventListener('paste', this.onDocumentPaste, true);\n\n if(!IS_TOUCH_SUPPORTED) {\n this.attachDragAndDropListeners();\n }\n\n // if(!isTouchSupported) {\n this.markupTooltip = new MarkupTooltip(this);\n this.markupTooltip.handleSelection();\n // }\n }\n\n private attachDragAndDropListeners() {\n const drops: ChatDragAndDrop[] = [];\n const mediaDrops: ChatDragAndDrop[] = [];\n let mounted = false;\n const toggle = async(e: DragEvent, mount: boolean) => {\n if(mount === mounted) return;\n\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n\n const newMediaPopup = getCurrentNewMediaPopup();\n const types: string[] = await getFilesFromEvent(e, true);\n if(!isFiles || (!(await this.canDrag()) && !newMediaPopup)) { // * skip dragging text case\n counter = 0;\n return;\n }\n\n const _dropsContainer = newMediaPopup ? mediaDropsContainer : dropsContainer;\n const _drops = newMediaPopup ? mediaDrops : drops;\n\n if(mount && !_drops.length) {\n const force = isFiles && !types.length; // * can't get file items not from 'drop' on Safari\n\n const foundMedia = types.filter((t) => MEDIA_MIME_TYPES_SUPPORTED.has(t)).length;\n // const foundDocuments = types.length - foundMedia;\n\n this.log('drag files', types);\n\n if(newMediaPopup) {\n newMediaPopup.appendDrops(_dropsContainer);\n\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n header: 'Preview.Dragging.AddItems',\n headerArgs: [types.length],\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n this.log('drop', e);\n this.onDocumentPaste(e, 'document');\n }\n }));\n }\n } else {\n if(types.length || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragfiles',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropAsFilesDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n this.log('drop', e);\n this.onDocumentPaste(e, 'document');\n }\n }));\n }\n\n // if((foundMedia && !foundDocuments) || force) {\n if(foundMedia || force) {\n _drops.push(new ChatDragAndDrop(_dropsContainer, {\n icon: 'dragmedia',\n header: 'Chat.DropTitle',\n subtitle: 'Chat.DropQuickDesc',\n onDrop: (e: DragEvent) => {\n toggle(e, false);\n this.log('drop', e);\n this.onDocumentPaste(e, 'media');\n }\n }));\n }\n\n this.chat.container.append(_dropsContainer);\n }\n }\n\n // if(!mount) return;\n\n SetTransition({\n element: _dropsContainer,\n className: 'is-visible',\n forwards: mount,\n duration: 200,\n onTransitionEnd: () => {\n if(!mount) {\n _drops.forEach((drop) => {\n drop.destroy();\n });\n\n _drops.length = 0;\n }\n }\n });\n\n if(mount) {\n _drops.forEach((drop) => {\n drop.setPath();\n });\n } else {\n counter = 0;\n }\n\n document.body.classList.toggle('is-dragging', mount);\n mounted = mount;\n };\n\n /* document.body.addEventListener('dragover', (e) => {\n cancelEvent(e);\n }); */\n\n let counter = 0;\n document.body.addEventListener('dragenter', (e) => {\n counter++;\n });\n\n document.body.addEventListener('dragover', (e) => {\n // this.log('dragover', e/* , e.dataTransfer.types[0] */);\n toggle(e, true);\n cancelEvent(e);\n });\n\n document.body.addEventListener('dragleave', (e) => {\n // this.log('dragleave', e, counter);\n // if((e.pageX <= 0 || e.pageX >= this.managers.appPhotosManager.windowW) || (e.pageY <= 0 || e.pageY >= this.managers.appPhotosManager.windowH)) {\n counter--;\n if(counter === 0) {\n // if(!findUpClassName(e.target, 'drops-container')) {\n toggle(e, false);\n }\n });\n\n const dropsContainer = document.createElement('div');\n dropsContainer.classList.add('drops-container');\n\n const mediaDropsContainer = dropsContainer.cloneNode(true) as HTMLElement;\n }\n\n private async canDrag() {\n const chat = this.chat;\n const peerId = chat?.peerId;\n return !(!peerId || overlayCounter.isOverlayActive || !(await chat.canSend('send_media')));\n }\n\n private onDocumentPaste = async(e: ClipboardEvent | DragEvent, attachType?: 'media' | 'document') => {\n const newMediaPopup = getCurrentNewMediaPopup();\n\n // console.log('document paste');\n // console.log('item', event.clipboardData.getData());\n\n if(e instanceof DragEvent) {\n const _types = e.dataTransfer.types;\n // @ts-ignore\n const isFiles = _types.contains ? _types.contains('Files') : _types.indexOf('Files') >= 0;\n if(isFiles) {\n cancelEvent(e);\n }\n }\n\n const files = await getFilesFromEvent(e);\n if(!(await this.canDrag()) && !newMediaPopup) return;\n if(files.length) {\n if(newMediaPopup) {\n newMediaPopup.addFiles(files);\n return;\n }\n\n const chatInput = this.chat.input;\n chatInput.willAttachType = attachType || (MEDIA_MIME_TYPES_SUPPORTED.has(files[0].type) ? 'media' : 'document');\n PopupElement.createPopup(PopupNewMedia, this.chat, files, chatInput.willAttachType);\n }\n };\n\n private async overrideHash(peerId?: PeerId) {\n let str: string;\n if(peerId) {\n const username = await this.managers.appPeersManager.getPeerUsername(peerId);\n str = username ? '@' + username : '' + peerId;\n }\n\n appNavigationController.overrideHash(str);\n }\n\n public selectTab(id: APP_TABS, animate?: boolean) {\n if(animate === false) { // * will be used for Safari iOS history swipe\n disableTransition([appSidebarLeft.sidebarEl, this.columnEl, appSidebarRight.sidebarEl]);\n }\n\n document.body.classList.toggle(LEFT_COLUMN_ACTIVE_CLASSNAME, id === APP_TABS.CHATLIST);\n\n const prevTabId = this.tabId;\n if(prevTabId !== undefined) {\n this.overrideHash(id > APP_TABS.CHATLIST ? this.chat?.peerId : undefined);\n this.dispatchEvent('tab_changing', id);\n }\n\n this.log('selectTab', id, prevTabId);\n\n let animationPromise: Promise = rootScope.settings.animationsEnabled ? doubleRaf() : Promise.resolve();\n if(\n prevTabId !== undefined &&\n prevTabId !== id &&\n rootScope.settings.animationsEnabled &&\n animate !== false/* &&\n mediaSizes.activeScreen !== ScreenSize.large */\n ) {\n const transitionTime = (mediaSizes.isMobile ? 250 : 200) + 100; // * cause transition time could be > 250ms\n animationPromise = pause(transitionTime);\n dispatchHeavyAnimationEvent(animationPromise, transitionTime);\n\n // ! it's very heavy operation. will blink in firefox\n /* this.columnEl.classList.add('disable-hover');\n animationPromise.finally(() => {\n this.columnEl.classList.remove('disable-hover');\n }); */\n }\n\n this.tabId = id;\n blurActiveElement();\n if(mediaSizes.isMobile && prevTabId === APP_TABS.PROFILE && id < APP_TABS.PROFILE) {\n document.body.classList.remove(RIGHT_COLUMN_ACTIVE_CLASSNAME);\n }\n\n if(prevTabId !== undefined && id > prevTabId) {\n if(id < APP_TABS.PROFILE || !appNavigationController.findItemByType('im')) {\n appNavigationController.pushItem({\n type: 'im',\n onPop: (canAnimate) => {\n // this.selectTab(prevTabId, !isSafari);\n this.setPeer({}, canAnimate);\n }\n });\n }\n }\n\n const onImTabChange = (window as any).onImTabChange;\n onImTabChange && onImTabChange(id);\n\n // this._selectTab(id, mediaSizes.isMobile);\n // document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, id === 2);\n\n return animationPromise;\n }\n\n public updateStatus() {\n return this.managers.appUsersManager.updateMyOnlineStatus(this.offline);\n }\n\n private createNewChat() {\n const chat = new Chat(\n this,\n this.managers\n );\n\n if(this.chats.length) {\n chat.setBackground(this.lastBackgroundUrl, true);\n }\n\n this.chats.push(chat);\n\n return chat;\n }\n\n private spliceChats(fromIndex: number, justReturn = true, animate?: boolean, spliced?: Chat[]) {\n if(fromIndex >= this.chats.length) return;\n\n const chatFrom = this.chat;\n if(this.chats.length > 1 && justReturn) {\n this.dispatchEvent('peer_changing', this.chat);\n }\n\n if(!spliced) {\n spliced = this.chats.splice(fromIndex, this.chats.length - fromIndex);\n }\n\n const chatTo = this.chat;\n this.dispatchEvent('chat_changing', {from: chatFrom, to: chatTo});\n\n // * -1 because one item is being sliced when closing the chat by calling .removeByType\n for(let i = 0; i < spliced.length - 1; ++i) {\n appNavigationController.removeByType('chat', true);\n }\n\n // * fix middle chat z-index on animation\n if(spliced.length > 1) {\n spliced.slice(0, -1).forEach((chat) => {\n chat.container.remove();\n });\n }\n\n this.chatsSelectTab(chatTo.container, animate);\n\n if(justReturn) {\n this.dispatchEvent('peer_changed', chatTo);\n\n const searchTab = appSidebarRight.getTab(AppPrivateSearchTab);\n searchTab?.close();\n\n appSidebarRight.replaceSharedMediaTab(chatTo.sharedMediaTab);\n }\n\n spliced.forEach((chat) => {\n chat.beforeDestroy();\n });\n\n setTimeout(() => {\n // chat.setPeer(0);\n spliced.forEach((chat) => {\n chat.destroy();\n });\n }, 250 + 100);\n }\n\n public async setPeer(options: Partial = {}, animate?: boolean): Promise {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n options.peerId ??= NULL_PEER_ID;\n\n const {peerId, lastMsgId, threadId} = options;\n\n const chat = this.chat;\n const chatIndex = this.chats.indexOf(chat);\n const isSamePeer = this.isSamePeer(chat, options as any);\n if(!peerId) {\n if(chatIndex > 0) {\n this.spliceChats(chatIndex, undefined, animate);\n return;\n } else if(mediaSizes.activeScreen === ScreenSize.medium) { // * floating sidebar case\n this.selectTab(+!this.tabId, animate);\n return;\n }\n } else if(chatIndex > 0 && chat.peerId && !isSamePeer) {\n // const firstChat = this.chats[0];\n // if(firstChat.peerId !== chat.peerId) {\n /* // * slice idx > 0, set background and slice first, so new one will be the first\n const spliced = this.chats.splice(1, this.chats.length - 1);\n this.createNewChat();\n this.chats.splice(0, 1); */\n const spliced = this.chats.splice(1, this.chats.length - 1);\n if(this.chat.peerId === peerId) {\n this.spliceChats(0, true, true, spliced);\n return;\n } else {\n const ret = this.setPeer(options);\n this.spliceChats(0, false, false, spliced);\n return ret;\n }\n // } else {\n // this.spliceChats(1, false, animate);\n // }\n\n // return ret;\n }\n\n // * don't reset peer if returning\n if(isSamePeer && mediaSizes.activeScreen <= ScreenSize.medium && document.body.classList.contains(LEFT_COLUMN_ACTIVE_CLASSNAME)) {\n this.selectTab(APP_TABS.CHAT, animate);\n return false;\n }\n\n if(peerId || mediaSizes.activeScreen !== ScreenSize.mobile) {\n const result = await chat.setPeer(options as any as Parameters[0]);\n\n // * wait for cached render\n const promise = result?.cached ? result.promise : Promise.resolve();\n if(peerId) {\n Promise.all([\n promise,\n chat.setBackgroundPromise\n ]).then(() => {\n // window.requestAnimationFrame(() => {\n setTimeout(() => { // * setTimeout is better here\n setTimeout(() => {\n this.chatsSelectTab(this.chat.container);\n }, 0);\n this.selectTab(APP_TABS.CHAT, animate);\n }, 0);\n });\n }\n }\n\n if(!peerId) {\n this.selectTab(APP_TABS.CHATLIST, animate);\n return false;\n }\n }\n\n public async setInnerPeer(options: ChatSetInnerPeerOptions) {\n const {peerId} = options;\n if(peerId === NULL_PEER_ID || !peerId) {\n return;\n }\n\n if(!options.type) {\n if(options.threadId && !(await this.managers.appPeersManager.isForum(options.peerId))) {\n options.type = 'discussion';\n }\n\n options.type ??= 'chat';\n }\n\n // * reuse current chat\n const existingIndex = this.chats.findIndex((chat) => this.isSamePeer(chat, options) || (mediaSizes.activeScreen === ScreenSize.mobile && this.tabId === 0));\n if(existingIndex !== -1) {\n this.spliceChats(existingIndex + 1);\n return this.setPeer(options);\n }\n\n const oldChat = this.chat;\n let chat = oldChat;\n if(oldChat.inited) { // * use first not inited chat\n chat = this.createNewChat();\n }\n\n this.dispatchEvent('chat_changing', {from: oldChat, to: chat});\n\n // this.chatsSelectTab(chat.container);\n\n return this.setPeer(options);\n }\n\n public openScheduled(peerId: PeerId) {\n this.setInnerPeer({\n peerId,\n type: 'scheduled'\n });\n }\n\n private getTypingElement(action: SendMessageAction) {\n const el = document.createElement('span');\n let c = 'peer-typing';\n el.classList.add(c);\n el.dataset.action = action._;\n switch(action._) {\n case 'sendMessageTypingAction': {\n // default: {\n c += '-text';\n for(let i = 0; i < 3; ++i) {\n const dot = document.createElement('span');\n dot.className = c + '-dot';\n el.append(dot);\n }\n break;\n }\n\n case 'sendMessageUploadAudioAction':\n case 'sendMessageUploadDocumentAction':\n case 'sendMessageUploadRoundAction':\n case 'sendMessageUploadVideoAction':\n case 'sendMessageUploadPhotoAction': {\n c += '-upload';\n /* const trail = document.createElement('span');\n trail.className = c + '-trail';\n el.append(trail); */\n break;\n }\n\n case 'sendMessageRecordAudioAction':\n case 'sendMessageRecordRoundAction':\n case 'sendMessageRecordVideoAction': {\n c += '-record';\n break;\n }\n\n case 'sendMessageEmojiInteractionSeen':\n case 'sendMessageChooseStickerAction': {\n c += '-choosing-sticker';\n for(let i = 0; i < 2; ++i) {\n const eye = document.createElement('div');\n eye.className = c + '-eye';\n el.append(eye);\n }\n break;\n }\n }\n\n el.classList.add(c);\n\n return el;\n }\n\n public async getPeerTyping(peerId: PeerId, container?: HTMLElement, threadId?: number) {\n // const log = this.log.bindPrefix('getPeerTyping-' + peerId);\n // log('getting peer typing');\n\n const isUser = peerId.isUser();\n if(isUser && await this.managers.appUsersManager.isBot(peerId)) {\n // log('a bot');\n return;\n }\n\n const typings = await this.managers.appProfileManager.getPeerTypings(peerId, threadId);\n if(!typings?.length) {\n // log('have no typing');\n return;\n }\n\n const typing = typings[0];\n\n const langPackKeys: {\n [peerType in 'private' | 'chat' | 'multi']?: Partial<{[action in SendMessageAction['_']]: LangPackKey}>\n } = {\n private: {\n 'sendMessageTypingAction': 'Peer.Activity.User.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.User.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.User.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.User.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.User.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.User.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.User.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.User.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.User.EnjoyingAnimations'\n },\n chat: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.TypingText',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.SendingFile',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.SendingPhoto',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.SendingVideo',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.RecordingAudio',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.RecordingVideo',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.PlayingGame',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.ChoosingSticker',\n 'sendMessageEmojiInteractionSeen': 'Peer.Activity.Chat.EnjoyingAnimations'\n },\n multi: {\n 'sendMessageTypingAction': 'Peer.Activity.Chat.Multi.TypingText1',\n 'sendMessageUploadAudioAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadDocumentAction': 'Peer.Activity.Chat.Multi.SendingFile1',\n 'sendMessageUploadPhotoAction': 'Peer.Activity.Chat.Multi.SendingPhoto1',\n 'sendMessageUploadVideoAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageUploadRoundAction': 'Peer.Activity.Chat.Multi.SendingVideo1',\n 'sendMessageRecordVideoAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageRecordAudioAction': 'Peer.Activity.Chat.Multi.RecordingAudio1',\n 'sendMessageRecordRoundAction': 'Peer.Activity.Chat.Multi.RecordingVideo1',\n 'sendMessageGamePlayAction': 'Peer.Activity.Chat.Multi.PlayingGame1',\n 'sendMessageChooseStickerAction': 'Peer.Activity.Chat.Multi.ChoosingSticker1'\n }\n };\n\n const mapa = isUser ? langPackKeys.private : (typings.length > 1 ? langPackKeys.multi : langPackKeys.chat);\n let action = typing.action;\n\n if(typings.length > 1) {\n const s: any = {};\n typings.forEach((typing) => {\n const type = typing.action._;\n if(s[type] === undefined) s[type] = 0;\n ++s[type];\n });\n\n if(Object.keys(s).length > 1) {\n action = {\n _: 'sendMessageTypingAction'\n };\n }\n }\n\n const langPackKey = mapa[action._];\n if(!langPackKey) {\n // log('no langPackKey');\n return;\n }\n\n let peerTitlePromise: Promise;\n let args: any[];\n if(peerId.isAnyChat()) {\n const peerTitle = new PeerTitle();\n peerTitlePromise = peerTitle.update({peerId: typing.userId.toPeerId(false), onlyFirstName: true});\n args = [\n peerTitle.element,\n typings.length - 1\n ];\n\n await peerTitlePromise;\n }\n\n if(!container) {\n container = document.createElement('span');\n container.classList.add('online', 'peer-typing-container');\n }\n\n container.classList.toggle('peer-typing-flex', action._ === 'sendMessageChooseStickerAction' || action._ === 'sendMessageEmojiInteractionSeen');\n\n let typingElement = container.firstElementChild as HTMLElement;\n if(!typingElement) {\n typingElement = this.getTypingElement(action);\n container.prepend(typingElement);\n } else {\n if(typingElement.dataset.action !== action._) {\n typingElement.replaceWith(this.getTypingElement(action));\n }\n }\n\n if(action._ === 'sendMessageEmojiInteractionSeen') {\n if(args) {\n args.pop();\n } else {\n args = [];\n }\n\n const span = htmlToSpan(wrapEmojiText(action.emoticon));\n args.push(span);\n }\n\n const descriptionElement = i18n(langPackKey, args);\n descriptionElement.classList.add('peer-typing-description');\n\n if(container.childElementCount > 1) container.lastElementChild.replaceWith(descriptionElement);\n else container.append(descriptionElement);\n\n // log('returning typing');\n return container;\n }\n\n private async getChatStatus(chatId: ChatId, noTyping?: boolean): Promise> {\n const typingEl = noTyping ? undefined : await this.getPeerTyping(chatId.toPeerId(true));\n if(typingEl) {\n return {cached: true, result: Promise.resolve(typingEl)};\n }\n\n const result = await this.managers.acknowledged.appProfileManager.getChatFull(chatId);\n const dooo = async(chatInfo: ChatFull) => {\n // this.chat.log('chatInfo res:', chatInfo);\n\n const participants_count = (chatInfo as ChatFull.channelFull).participants_count ||\n ((chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants)?.participants?.length ||\n 1;\n // if(participants_count) {\n let subtitle = await getChatMembersString(chatId);\n\n if(participants_count < 2) {\n return subtitle;\n }\n\n const onlines = await this.managers.appProfileManager.getOnlines(chatId);\n if(onlines > 1) {\n const span = document.createElement('span');\n\n span.append(...join([subtitle, i18n('OnlineCount', [numberThousandSplitter(onlines)])], false));\n subtitle = span;\n }\n\n return subtitle;\n // }\n };\n\n const promise = Promise.resolve(result.result).then(dooo);\n return {\n cached: result.cached,\n result: promise\n };\n }\n\n private async getUserStatus(userId: UserId, ignoreSelf?: boolean) {\n const result: AckedResult = {\n cached: true,\n result: Promise.resolve(undefined as HTMLElement)\n };\n\n const user = await this.managers.appUsersManager.getUser(userId);\n if(!user || (user.pFlags.self && !ignoreSelf)) {\n return result;\n }\n\n const subtitle = getUserStatusString(user);\n\n if(!user.pFlags.bot && !user.pFlags.support) {\n let typingEl = await this.getPeerTyping(userId.toPeerId());\n if(!typingEl && user.status?._ === 'userStatusOnline') {\n typingEl = document.createElement('span');\n typingEl.classList.add('online');\n typingEl.append(subtitle);\n }\n\n if(typingEl) {\n result.result = Promise.resolve(typingEl);\n return result;\n }\n }\n\n result.result = Promise.resolve(subtitle);\n return result;\n }\n\n private async getPeerStatus(peerId: PeerId, ignoreSelf?: boolean, noTyping?: boolean) {\n if(!peerId) return;\n let promise: Promise>;\n if(peerId.isAnyChat()) {\n promise = this.getChatStatus(peerId.toChatId(), noTyping);\n } else {\n promise = this.getUserStatus(peerId.toUserId(), ignoreSelf);\n }\n\n return promise;\n }\n\n public async setPeerStatus(options: {\n peerId: PeerId,\n element: HTMLElement,\n needClear: boolean,\n useWhitespace: boolean,\n middleware: () => boolean,\n ignoreSelf?: boolean,\n noTyping?: boolean\n }) {\n // const log = this.log.bindPrefix('status-' + peerId);\n // log('setting status', element);\n\n const {peerId, element, needClear, useWhitespace, middleware, ignoreSelf, noTyping} = options;\n\n if(!needClear) {\n // * good good good\n const typingContainer = element.querySelector('.peer-typing-container') as HTMLElement;\n if(typingContainer && await this.getPeerTyping(peerId, typingContainer)) {\n // log('already have a status');\n return;\n }\n }\n\n const result = await this.getPeerStatus(peerId, ignoreSelf, noTyping);\n // log('getPeerStatus result', result);\n if(!middleware()) {\n // log.warn('middleware');\n return;\n }\n\n const set = async() => {\n const subtitle = result && await result.result;\n if(!middleware()) {\n return;\n }\n\n return () => replaceContent(element, subtitle || placeholder);\n };\n\n const placeholder = useWhitespace ? NBSP : ''; // ! HERE U CAN FIND WHITESPACE\n if(!result || result.cached || needClear === undefined) {\n return await set();\n } else if(needClear) {\n return () => {\n element.textContent = placeholder;\n return set().then((callback) => callback?.());\n };\n }\n }\n\n public setChoosingStickerTyping(cancel: boolean) {\n this.managers.appMessagesManager.setTyping(this.chat.peerId, {_: cancel ? 'sendMessageCancelAction' : 'sendMessageChooseStickerAction'}, undefined, this.chat.threadId);\n }\n\n public isSamePeer(options1: {peerId: PeerId, threadId?: number, type?: ChatType}, options2: typeof options1) {\n return options1.peerId === options2.peerId &&\n options1.threadId === options2.threadId &&\n (typeof(options1.type) !== typeof(options2.type) || options1.type === options2.type);\n }\n}\n\nconst appImManager = new AppImManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appImManager = appImManager);\nexport default appImManager;\n","import {Message, MessageMedia} from '../../../../layer';\n\nexport default function canSaveMessageMedia(message: Message.message | Message.messageService) {\n return message &&\n !message.pFlags.is_outgoing &&\n !(message as Message.message).pFlags.noforwards &&\n !((message as Message.message).media as MessageMedia.messageMediaInvoice)?.extended_media\n}\n","import {Document, Message, MessageAction, MessageExtendedMedia, MessageMedia, Photo, WebPage} from '../../../../layer';\n\nexport default function getMediaFromMessage(message: Message) {\n if(!message) return;\n\n let media: any;\n if((message as Message.messageService).action) {\n media = ((message as Message.messageService).action as MessageAction.messageActionChannelEditPhoto).photo;\n } else if((message as Message.message).media) {\n let messageMedia = (message as Message.message).media;\n if((messageMedia as MessageMedia.messageMediaWebPage).webpage) {\n messageMedia = (messageMedia as MessageMedia.messageMediaWebPage).webpage as any as MessageMedia;\n } else if((messageMedia as MessageMedia.messageMediaInvoice).extended_media?._ === 'messageExtendedMedia') {\n messageMedia = ((messageMedia as MessageMedia.messageMediaInvoice).extended_media as MessageExtendedMedia.messageExtendedMedia).media;\n }\n\n media = (messageMedia as MessageMedia.messageMediaDocument).document ||\n (messageMedia as MessageMedia.messageMediaPhoto).photo;\n }\n\n return media as Photo.photo | Document.document;\n}\n","import {Message} from '../../../../layer';\nimport type {MyMessage} from '../../appMessagesManager';\n\nexport default function getMessageSenderPeerIdOrName(message: MyMessage) {\n if(message.fromId) {\n return {\n peerId: message.fromId\n };\n } else {\n return {\n fromName: (message as Message.message).fwd_from?.from_name\n };\n }\n}\n","import {isRestricted} from '../../../../helpers/restrictions';\nimport {Message} from '../../../../layer';\n\nexport default function isMessageRestricted(message: Message.message) {\n return !!(message.restriction_reason && isRestricted(message.restriction_reason));\n}\n","// https://github.com/eelcohn/Telegram-API/wiki/Calculating-color-for-a-Telegram-user-on-IRC\n/*\n HTML-color IRC-color Description\n #c03d33 4 red\n #4fad2d 3 green\n #d09306 7 yellow\n #168acd 10 blue\n #8544d6 6 purple\n #cd4073 13 pink\n #2996ad 11 sea\n #ce671b 5 orange\n*/\nconst DialogColorsFg = ['#fc5c51', '#0fb297', '#d09306', '#3d72ed', '#895dd5', '#cd4073', '#00c1a6', '#fa790f'];\nconst DialogColors = ['red', 'green', 'yellow', 'blue', 'violet', 'pink', 'cyan', 'orange'];\nconst DialogColorsMap = [0, 7, 4, 1, 6, 3, 5];\n\nexport default function getPeerColorById(peerId: PeerId, pic = true) {\n if(!peerId) return '';\n\n const idx = DialogColorsMap[Math.abs(+peerId) % 7];\n const color = (pic ? DialogColors : DialogColorsFg)[idx];\n return color;\n}\n","import {Chat, User} from '../../../../layer';\n\nexport default function getPeerEditableUsername(peer: User.user | Chat.channel) {\n if(peer.username) {\n return peer.username;\n }\n\n const usernames = peer.usernames;\n const username = usernames?.find((username) => username.pFlags.editable);\n return username?.username;\n}\n","import isObject from '../../../../helpers/object/isObject';\nimport {InputChannel, InputPeer, Peer} from '../../../../layer';\nimport {NULL_PEER_ID} from '../../../mtproto/mtproto_config';\n\nexport default function getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | InputChannel | PeerId | string): PeerId {\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\n // if(typeof(peerId) === 'number') return peerId;\n else if(isObject(peerId)) {\n const userId = (peerId as Peer.peerUser).user_id;\n if(userId !== undefined) {\n return userId.toPeerId(false);\n }\n\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\n if(chatId !== undefined) {\n return chatId.toPeerId(true);\n }\n\n return NULL_PEER_ID; // maybe it is an inputPeerSelf\n // } else if(!peerId) return 'u0';\n } else if(!peerId) return NULL_PEER_ID;\n\n const isUser = (peerId as string).charAt(0) === 'u';\n const peerParams = (peerId as string).substr(1).split('_');\n\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from '../../appDocsManager';\nimport type {MyPhoto} from '../../appPhotosManager';\nimport type {PhotoSize, VideoSize, WebDocument} from '../../../../layer';\nimport calcImageInBox from '../../../../helpers/calcImageInBox';\nimport {THUMB_TYPE_FULL} from '../../../mtproto/mtproto_config';\n\nexport default function choosePhotoSize(\n photo: MyPhoto | MyDocument | WebDocument,\n boxWidth = 0,\n boxHeight = 0,\n useBytes = false,\n pushDocumentSize = false\n) {\n if(window.devicePixelRatio > 1) {\n boxWidth *= 2;\n boxHeight *= 2;\n }\n\n /*\n s box 100x100\n m box 320x320\n x box 800x800\n y box 1280x1280\n w box 2560x2560\n a crop 160x160\n b crop 320x320\n c crop 640x640\n d crop 1280x1280 */\n\n let sizes: PhotoSize[] = (photo as MyPhoto).sizes || (photo as MyDocument).thumbs as PhotoSize[];\n let bestPhotoSize: typeof sizes[0] = {_: 'photoSizeEmpty', type: THUMB_TYPE_FULL};\n if(pushDocumentSize && sizes && photo._ !== 'photo') {\n sizes = sizes.concat({\n _: 'photoSize',\n w: photo.w,\n h: photo.h,\n size: photo.size,\n type: THUMB_TYPE_FULL\n });\n }\n\n if(sizes?.length) {\n for(let i = 0, length = sizes.length; i < length; ++i) {\n const photoSize = sizes[i];\n if(!('w' in photoSize) && !('h' in photoSize)) continue;\n\n bestPhotoSize = photoSize;\n\n const size = calcImageInBox(photoSize.w, photoSize.h, boxWidth, boxHeight);\n if(size.width >= boxWidth || size.height >= boxHeight) {\n break;\n }\n }\n\n if(useBytes && bestPhotoSize._ === 'photoSizeEmpty' && sizes[0]._ === 'photoStrippedSize') {\n bestPhotoSize = sizes[0];\n }\n }\n\n return bestPhotoSize;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\nimport createDataChannel from './helpers/createDataChannel';\nimport createPeerConnection from './helpers/createPeerConnection';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport StreamManager from './streamManager';\nimport {Ssrc} from './types';\n\nexport type CallConnectionInstanceOptions = {\n streamManager: StreamManager,\n connection?: RTCPeerConnection,\n log?: ReturnType\n};\n\nexport default abstract class CallConnectionInstanceBase {\n public connection: RTCPeerConnection;\n public streamManager: StreamManager;\n public dataChannel: RTCDataChannel;\n public description: LocalConferenceDescription;\n public sources: {\n audio: Ssrc,\n video?: Ssrc,\n };\n protected negotiating: Promise;\n protected log: ReturnType;\n\n constructor(options: CallConnectionInstanceOptions) {\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = this.connection?.log || logger('CALL-CONNECTION-BASE');\n }\n\n this.sources = {} as any;\n }\n\n public createPeerConnection(config?: RTCConfiguration) {\n return this.connection || (this.connection = createPeerConnection(config, this.log.bindPrefix('connection')).connection);\n }\n\n public createDataChannel(dict?: RTCDataChannelInit) {\n return this.dataChannel || (this.dataChannel = createDataChannel(this.connection, dict, this.log.bindPrefix('data')));\n }\n\n public createDescription() {\n return this.description || (this.description = new LocalConferenceDescription(this.connection));\n }\n\n public appendStreamToConference() {\n return this.streamManager.appendToConference(this.description);\n }\n\n public closeConnection() {\n const {connection} = this;\n if(!connection) {\n return;\n }\n\n try {\n connection.log('close');\n connection.close();\n } catch(e) {\n this.log.error(e);\n }\n }\n\n public closeConnectionAndStream(stopStream: boolean) {\n this.closeConnection();\n stopStream && this.streamManager.stop();\n }\n\n protected abstract negotiateInternal(): CallConnectionInstanceBase['negotiating'];\n\n public negotiate() {\n const promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n return this.negotiating = this.negotiateInternal().finally(() => {\n this.negotiating = undefined;\n });\n }\n\n public sendDataChannelData(data: any) {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.dataChannel.send(JSON.stringify(data));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Logger, logger} from '../../logger';\n\nexport default function createPeerConnection(config: RTCConfiguration, log?: Logger) {\n if(!log) {\n log = logger('RTCPeerConnection');\n }\n\n log('constructor');\n\n // @ts-ignore\n const connection = new RTCPeerConnection(config);\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n });\n connection.addEventListener('signalingstatechange', () => {\n log('onsignalingstatechange', connection.signalingState);\n });\n connection.addEventListener('connectionstatechange', () => {\n log('onconnectionstatechange', connection.connectionState);\n });\n connection.addEventListener('negotiationneeded', () => { // * will be fired every time input device changes\n log('onnegotiationneeded', connection.signalingState);\n });\n connection.addEventListener('icecandidate', (event) => {\n log('onicecandidate', event);\n });\n connection.addEventListener('iceconnectionstatechange', () => {\n log('oniceconnectionstatechange', connection.iceConnectionState);\n });\n connection.addEventListener('datachannel', () => {\n log('ondatachannel');\n });\n\n connection.log = log;\n\n return {connection};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Logger, logger} from '../../logger';\n\nexport default function createDataChannel(connection: RTCPeerConnection, dict?: RTCDataChannelInit, log?: Logger) {\n // return;\n\n if(!log) {\n log = logger('RTCDataChannel');\n }\n\n const channel = connection.createDataChannel('data', dict);\n\n channel.addEventListener('message', (e) => {\n log('onmessage', e);\n });\n channel.addEventListener('open', () => {\n log('onopen');\n });\n channel.addEventListener('close', () => {\n log('onclose');\n });\n\n channel.log = log;\n\n return channel;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from '../sdp';\nimport {CallSignalingData, P2PVideoCodec} from '../types';\nimport parseMediaSectionInfo from './parseMediaSectionInfo';\n\nexport default function parseSignalingData(sdp: SDP) {\n const info = parseMediaSectionInfo(sdp, sdp.media[0]);\n\n const data: CallSignalingData.initialSetup = {\n '@type': 'InitialSetup',\n 'fingerprints': [info.fingerprint],\n 'ufrag': info.ufrag,\n 'pwd': info.pwd,\n 'audio': undefined,\n 'video': undefined,\n 'screencast': undefined\n };\n\n const convertNumber = (number: number) => '' + number;\n\n for(const section of sdp.media) {\n const mediaType = section.mediaType;\n if(mediaType === 'application' || !section.isSending) {\n continue;\n }\n\n const codec: P2PVideoCodec = data[mediaType === 'video' && data['video'] ? 'screencast' : mediaType] = {} as any;\n const info = parseMediaSectionInfo(sdp, section);\n codec.ssrc = convertNumber(info.source);\n\n if(info.sourceGroups) {\n codec.ssrcGroups = info.sourceGroups.map((sourceGroup) => ({semantics: sourceGroup.semantics, ssrcs: sourceGroup.sources.map(convertNumber)}));\n }\n\n const rtpExtensions: P2PVideoCodec['rtpExtensions'] = codec.rtpExtensions = [];\n section.attributes.get('extmap').forEach((attribute) => {\n rtpExtensions.push({\n id: +attribute.key,\n uri: attribute.value\n });\n });\n\n const payloadTypesMap: Map = new Map();\n\n const getPayloadType = (id: number) => {\n let payloadType = payloadTypesMap.get(id);\n if(!payloadType) {\n payloadTypesMap.set(id, payloadType = {\n id\n } as any);\n }\n\n return payloadType;\n };\n\n section.attributes.get('rtpmap').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n const splitted = attribute.value.split('/');\n const [name, clockrate, channels] = splitted;\n payloadType.name = name;\n payloadType.clockrate = +clockrate;\n payloadType.channels = channels ? +channels : 0;\n });\n\n section.attributes.get('rtcp-fb').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n payloadType.feedbackTypes = attribute.lines.map((line) => {\n const splitted = line.split(' ');\n const [type, subtype] = splitted;\n return {\n type,\n subtype: subtype || ''\n };\n });\n });\n\n section.attributes.get('fmtp').forEach((attribute) => {\n const id = +attribute.key;\n const payloadType = getPayloadType(id);\n const parameters: P2PVideoCodec['payloadTypes'][0]['parameters'] = payloadType.parameters = {};\n const splitted = attribute.value.split(';');\n for(const str of splitted) {\n const [key, value] = str.split('=');\n parameters[key] = value;\n }\n });\n\n codec.payloadTypes = Array.from(payloadTypesMap.values());\n\n /* if(codec.payloadTypes.length > 5) {\n codec.payloadTypes.length = Math.min(codec.payloadTypes.length, 5);\n } */\n }\n\n return data;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CallConnectionInstanceBase, {CallConnectionInstanceOptions} from './callConnectionInstanceBase';\nimport CallInstance from './callInstance';\nimport parseSignalingData from './helpers/parseSignalingData';\nimport {parseSdp} from './sdp/utils';\n\nexport default class CallConnectionInstance extends CallConnectionInstanceBase {\n private call: CallInstance;\n\n constructor(options: CallConnectionInstanceOptions & {\n call: CallConnectionInstance['call']\n }) {\n super(options);\n }\n\n protected async negotiateInternal() {\n const {connection, call} = this;\n\n if(!connection.localDescription && !connection.remoteDescription && !call.isOutgoing) {\n return;\n }\n\n let descriptionInit: RTCSessionDescriptionInit;\n if(call.offerReceived) {\n call.offerReceived = false;\n\n const answer = descriptionInit = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n this.log('[InitialSetup] send 2');\n } else {\n const offer = descriptionInit = await connection.createOffer();\n\n this.log('[sdp] local', offer.sdp);\n await connection.setLocalDescription(offer);\n\n call.offerSent = true;\n\n this.log('[InitialSetup] send 0');\n }\n\n const initialSetup = parseSignalingData(parseSdp(descriptionInit.sdp));\n call.sendCallSignalingData(initialSetup);\n }\n}\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport bufferConcats from '../../../helpers/bytes/bufferConcats';\nimport subtle from '../../crypto/subtle';\nimport sha256 from '../../crypto/utils/sha256';\n\nconst kMaxIncomingPacketSize = 128 * 1024 * 1024;\n\nexport default class P2PEncryptor {\n private type: 'Signaling';\n private counter: number;\n private seqMap: Map;\n\n constructor(private isOutgoing: boolean, private p2pKey: Uint8Array) {\n this.type = 'Signaling';\n this.counter = 0;\n this.seqMap = new Map();\n }\n\n private concatSHA256(parts: Uint8Array[]) {\n return sha256(bufferConcats(...parts));\n }\n\n private async encryptPrepared(buffer: Uint8Array) {\n const result = {\n counter: 0, // this.counterFromSeq(this.readSeq(buffer)),\n bytes: new Uint8Array(16 + buffer.length)\n };\n\n const x = (this.isOutgoing ? 0 : 8) + (this.type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n\n const msgKeyLarge = await this.concatSHA256([key.subarray(x + 88, x + 88 + 32), buffer]);\n const msgKey = result.bytes;\n for(let i = 0; i < 16; ++i) {\n msgKey[i] = msgKeyLarge[i + 8];\n }\n\n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n\n const bytes = await this.aesProcessCtr(buffer, buffer.length, aesKeyIv, true);\n\n result.bytes = new Uint8Array([...result.bytes.subarray(0, 16), ...bytes]);\n\n return result;\n }\n\n public encryptRawPacket(buffer: Uint8Array) {\n const seq = ++this.counter;\n const arr = new ArrayBuffer(4);\n const view = new DataView(arr);\n view.setUint32(0, seq >>> 0, false); // byteOffset = 0; litteEndian = false\n\n const result = new Uint8Array([...new Uint8Array(arr), ...buffer]);\n\n return this.encryptPrepared(result);\n }\n\n private async prepareAesKeyIv(key: Uint8Array, msgKey: Uint8Array, x: number) {\n const [sha256a, sha256b] = await Promise.all([\n this.concatSHA256([\n msgKey.subarray(0, 16),\n key.subarray(x, x + 36)\n ]),\n\n this.concatSHA256([\n key.subarray(40 + x, 40 + x + 36),\n msgKey.subarray(0, 16)\n ])\n ]);\n\n return {\n key: new Uint8Array([\n ...sha256a.subarray(0, 8),\n ...sha256b.subarray(8, 8 + 16),\n ...sha256a.subarray(24, 24 + 8)\n ]),\n iv: new Uint8Array([\n ...sha256b.subarray(0, 4),\n ...sha256a.subarray(8, 8 + 8),\n ...sha256b.subarray(24, 24 + 4)\n ])\n };\n }\n\n private async aesProcessCtr(encryptedData: Uint8Array, dataSize: number, aesKeyIv: {key: Uint8Array, iv: Uint8Array}, encrypt = true) {\n const cryptoKey = await subtle.importKey(\n 'raw',\n aesKeyIv.key,\n {name: 'AES-CTR'},\n false,\n [encrypt ? 'encrypt' : 'decrypt']\n );\n\n const buffer: ArrayBuffer = await subtle[encrypt ? 'encrypt' : 'decrypt']({\n name: 'AES-CTR',\n counter: aesKeyIv.iv,\n length: aesKeyIv.iv.length * 8\n },\n cryptoKey,\n encryptedData\n );\n\n return new Uint8Array(buffer);\n }\n\n private constTimeIsDifferent(a: Uint8Array, b: Uint8Array, count: number) {\n let msgKeyEquals = true;\n for(let i = 0; i < count; ++i) {\n if(a[i] !== b[i]) {\n msgKeyEquals = false;\n }\n }\n\n return !msgKeyEquals;\n }\n\n public async decryptRawPacket(buffer: Uint8Array) {\n if(buffer.length < 21 || buffer.length > kMaxIncomingPacketSize) {\n return;\n }\n\n const {isOutgoing, type} = this;\n\n const x = (isOutgoing ? 8 : 0) + (type === 'Signaling' ? 128 : 0);\n const key = this.p2pKey;\n\n const msgKey = buffer.subarray(0, 16);\n const encryptedData = buffer.subarray(16);\n const encryptedDataSize = buffer.length - 16;\n\n const aesKeyIv = await this.prepareAesKeyIv(key, msgKey, x);\n\n const decryptionBuffer = await this.aesProcessCtr(encryptedData, encryptedDataSize, aesKeyIv, false);\n\n const msgKeyLarge = await this.concatSHA256([\n key.subarray(88 + x, 88 + x + 32),\n decryptionBuffer\n ]);\n\n if(this.constTimeIsDifferent(msgKeyLarge.subarray(8), msgKey, 16)) {\n return;\n }\n\n const dataView = new DataView(decryptionBuffer.buffer);\n const seq = dataView.getUint32(0);\n if(this.seqMap.has(seq)) {\n return;\n }\n this.seqMap.set(seq, seq);\n\n return decryptionBuffer.slice(4);\n }\n}\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha256 from '@cryptography/sha256';\n\nexport default function sha256(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then((b) => {\n // console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n\n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport StringFromLineBuilder from '../stringFromLineBuilder';\nimport {addDataChannel, addExtmap, addPayloadTypes, addSsrc} from './p2PSdpBuilder';\n\nexport default class ChromeP2PSdpBuilder {\n static generateOffer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0',\n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0'\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`,\n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2',\n 'a=extmap-allow-mixed',\n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map((x) => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n\n static generateAnswer(info: any) {\n const {fingerprints, ufrag, pwd, audio, video} = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n const stringBuilder = new StringFromLineBuilder();\n stringBuilder.add(\n 'v=0',\n 'o=- 1 2 IN IP4 127.0.0.1',\n 's=-',\n 't=0 0'\n );\n\n if(fingerprints) {\n fingerprints.forEach((x: any) => {\n const {hash, fingerprint, setup} = x;\n stringBuilder.add(\n `a=fingerprint:${hash} ${fingerprint}`,\n `a=setup:${setup}`\n );\n });\n }\n if(ufrag && pwd) {\n stringBuilder.add(\n `a=ice-ufrag:${ufrag}`,\n `a=ice-pwd:${pwd}`\n );\n }\n\n stringBuilder.add(\n 'a=group:BUNDLE 0 1 2',\n 'a=extmap-allow-mixed',\n 'a=msid-semantic: WMS *'\n );\n const streamName = 'stream' + media.map((x) => x.ssrc).join('_');\n for(let i = 0; i < media.length; i++) {\n const m = media[i];\n const {type, ssrc, ssrcGroups, payloadTypes, rtpExtensions} = m;\n switch(type) {\n case 'audio': {\n stringBuilder.add(\n `m=audio 56930 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} audio${ssrc}`);\n }\n stringBuilder.add(\n 'a=rtcp-mux',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n\n case 'video': {\n stringBuilder.add(\n `m=video 61986 UDP/TLS/RTP/SAVPF ${payloadTypes.map((x: any) => x.id).join(' ')}`,\n 'c=IN IP4 0.0.0.0',\n 'a=rtcp:9 IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${i}`,\n 'a=sendrecv',\n addExtmap(rtpExtensions)\n );\n if(ssrc) {\n stringBuilder.add(`a=msid:${streamName} video${ssrc}`);\n }\n\n stringBuilder.add(\n 'a=rtcp-mux',\n 'a=rtcp-rsize',\n addPayloadTypes(payloadTypes),\n addSsrc(type, ssrc, ssrcGroups, streamName)\n );\n break;\n }\n }\n }\n stringBuilder.add(addDataChannel(2));\n return stringBuilder.finalize();\n }\n}\n","/*\n* Copyright (c) 2018-present, Evgeny Nadymov\n*\n* This source code is licensed under the GPL v.3.0 license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\nimport ChromeP2PSdpBuilder from './chromeP2PSdpBuilder';\nimport { FirefoxP2PSdpBuilder } from './firefoxP2PSdpBuilder';\nimport { SafariP2PSdpBuilder } from './safariP2PSdpBuilder';\n// import { TG_CALLS_SDP_STRING } from '../../Stores/CallStore';\n\nexport function p2pParseCandidate(candidate) {\n if(!candidate || !candidate.startsWith('candidate:')) {\n return;\n }\n \n const sdpString = candidate;\n candidate = candidate.substr('candidate:'.length);\n \n const [foundation, component, protocol, priority, ip, port, ...other] = candidate.split(' ');\n const c = {\n sdpString,\n foundation,\n component,\n protocol,\n priority,\n address: { ip, port }\n };\n \n for(let i = 0; i < other.length; i += 2) {\n switch(other[i]) {\n case 'typ': {\n c.type = other[i + 1];\n break;\n }\n case 'raddr': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.ip = other[i + 1];\n break;\n }\n case 'rport': {\n if(!c.relAddress) {\n c.relAddress = {};\n }\n \n c.relAddress.port = other[i + 1];\n break;\n }\n case 'generation': {\n c.generation = other[i + 1];\n break;\n }\n case 'tcptype': {\n c.tcpType = other[i + 1];\n break;\n }\n case 'network-id': {\n c.networkId = other[i + 1];\n break;\n }\n case 'network-cost': {\n c.networkCost = other[i + 1];\n break;\n }\n case 'ufrag': {\n c.username = other[i + 1];\n break;\n }\n }\n }\n \n return c;\n}\n\nexport function p2pParseSdp(sdp) {\n const lines = sdp.split('\\r\\n');\n const lookup = (prefix, force = true, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return line.substr(prefix.length);\n }\n }\n \n if (force) {\n console.error(\"Can't find prefix\", prefix);\n }\n \n return null;\n };\n const findIndex = (prefix, lineFrom = 0, lineTo = Number.MAX_VALUE) => {\n if (lineTo === -1) {\n lineTo = Number.MAX_VALUE;\n }\n for (let i = lineFrom; i < lines.length && i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith(prefix)) {\n return i;\n }\n }\n \n return -1;\n };\n \n const pwdIndex = findIndex('a=ice-pwd:');\n const ufragIndex = findIndex('a=ice-ufrag:');\n if (pwdIndex === -1 && ufragIndex === -1) {\n return {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n }\n \n const info = {\n // sessionId: lookup('o=').split(' ')[1],\n ufrag: null,\n pwd: null,\n fingerprints: []\n };\n \n let mediaIndex = findIndex('m=');\n const fingerprint = lookup('a=fingerprint:', false);\n const setup = lookup('a=setup:', false);\n if (fingerprint && setup) {\n info.fingerprints.push({\n hash: fingerprint.split(' ')[0],\n fingerprint: fingerprint.split(' ')[1],\n setup\n });\n }\n \n const ufrag = lookup('a=ice-ufrag:', false);\n const pwd = lookup('a=ice-pwd:', false);\n if (ufrag && pwd) {\n info.ufrag = ufrag;\n info.pwd = pwd;\n }\n \n while (mediaIndex !== -1) {\n let nextMediaIndex = findIndex('m=', mediaIndex + 1);\n \n const extmap = [];\n const types = [];\n const mediaType = lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0];\n const media = {\n // type: lookup('m=', true, mediaIndex, nextMediaIndex).split(' ')[0],\n // mid: lookup('a=mid:', true, mediaIndex, nextMediaIndex),\n // dir: findDirection(mediaIndex, nextMediaIndex),\n rtpExtensions: extmap,\n payloadTypes: types\n }\n \n const lineTo = nextMediaIndex === -1 ? lines.length : nextMediaIndex;\n const fmtp = new Map();\n const rtcpFb = new Map();\n for (let i = mediaIndex; i < lineTo; i++) {\n const line = lines[i];\n if (line.startsWith('a=extmap:')) {\n const [ id, uri ] = line.substr('a=extmap:'.length).split(' ');\n extmap.push({ id: parseInt(id), uri });\n } else if (line.startsWith('a=fmtp:')) {\n const [ id, str ] = line.substr('a=fmtp:'.length).split(' ');\n const obj = { };\n const arr = str.split(';').map(x => {\n const [ key, value ] = x.split('=');\n obj[key] = value;\n return { [key]: value };\n });\n fmtp.set(parseInt(id), obj);\n } else if (line.startsWith('a=rtcp-fb:')) {\n const [ id, type = '', subtype = '' ] = line.substr('a=rtcp-fb:'.length).split(' ');\n if (rtcpFb.has(parseInt(id))) {\n rtcpFb.get(parseInt(id)).push({ type, subtype });\n } else {\n rtcpFb.set(parseInt(id), [{ type, subtype }])\n }\n } else if (line.startsWith('a=rtpmap')) {\n const [ id, str ] = line.substr('a=rtpmap:'.length).split(' ');\n const [ name, clockrate, channels = '0' ] = str.split('/');\n const obj = { id: parseInt(id), name, clockrate: parseInt(clockrate), channels: parseInt(channels) };\n \n types.push(obj);\n }\n }\n \n for (let i = 0; i < types.length; i++) {\n const { id } = types[i];\n if (rtcpFb.has(id)) {\n types[i].feedbackTypes = rtcpFb.get(id);\n }\n if (fmtp.has(id)) {\n types[i].parameters = fmtp.get(id);\n }\n }\n \n const ssrc = lookup('a=ssrc:', false, mediaIndex, nextMediaIndex);\n if (ssrc) {\n media.ssrc = ssrc.split(' ')[0];\n }\n \n const ssrcGroup = lookup('a=ssrc-group:', false, mediaIndex, nextMediaIndex);\n if (ssrcGroup) {\n const [ semantics, ...ssrcs ] = ssrcGroup.split(' ');\n media.ssrcGroups = [{\n semantics,\n ssrcs\n }]\n }\n \n switch (mediaType) {\n case 'audio': {\n info.audio = media;\n break;\n }\n case 'video': {\n info.video = media;\n break;\n }\n }\n \n mediaIndex = nextMediaIndex;\n }\n\n if(!info.video.ssrcGroups) {\n info.video.ssrcGroups = [];\n }\n\n info['@type'] = 'InitialSetup';\n \n // console.log('[p2pParseSdp]', sdp, info);\n return info;\n}\n\nexport function isFirefox() {\n return navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n}\n\nfunction isSafari() {\n return navigator.userAgent.toLowerCase().indexOf('safari') > -1 && navigator.userAgent.toLowerCase().indexOf('chrome') === -1;\n}\n\nexport function addExtmap(extmap) {\n let sdp = [];\n // return sdp;\n for (let j = 0; j < extmap.length; j++) {\n const ext = extmap[j];\n const { id, uri } = ext;\n // if (isFirefox() && uri.indexOf(''))\n console.log('[extmap] add', id, uri);\n sdp.push(`a=extmap:${id} ${uri}`);\n }\n \n return sdp.join('\\n');\n}\n\nexport function addPayloadTypes(types) {\n let sdp = [];\n console.log('[SDP] addPayloadTypes', types);\n for (let i = 0; i < types.length; i++) {\n const type = types[i];\n const { id, name, clockrate, channels, feedbackTypes, parameters } = type;\n sdp.push(`a=rtpmap:${id} ${name}/${clockrate}${channels ? '/' + channels : ''}`);\n if (feedbackTypes) {\n feedbackTypes.forEach(x => {\n const { type, subtype } = x;\n sdp.push(`a=rtcp-fb:${id} ${[type, subtype].join(' ')}`);\n });\n }\n if (parameters) {\n const fmtp = [];\n Object.getOwnPropertyNames(parameters).forEach(pName => {\n fmtp.push(`${pName}=${parameters[pName]}`);\n });\n \n sdp.push(`a=fmtp:${id} ${fmtp.join(';')}`);\n }\n }\n \n return sdp.join('\\n');\n}\n\nexport function addSsrc(type, ssrc, ssrcGroups, streamName) {\n let sdp = [];\n \n if (ssrcGroups && ssrcGroups.length > 0) {\n ssrcGroups.forEach(ssrcGroup => {\n if (ssrcGroup && ssrcGroup.ssrcs.length > 0) {\n sdp.push(`a=ssrc-group:${ssrcGroup.semantics} ${ssrcGroup.ssrcs.join(' ')}`);\n ssrcGroup.ssrcs.forEach(ssrc => {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n });\n }\n });\n } else if (ssrc) {\n sdp.push(\n `a=ssrc:${ssrc} cname:stream${ssrc}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}${ssrc}`,\n `a=ssrc:${ssrc} mslabel:${type}${ssrc}`,\n `a=ssrc:${ssrc} label:${type}${ssrc}`\n );\n }\n \n return sdp.join('\\n');\n}\n\nexport function addDataChannel(mid) {\n return `m=application 9 UDP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:2\na=sctp-port:5000\na=max-message-size:262144`;\n}\n\nexport class P2PSdpBuilder {\n static generateCandidate(info) {\n if (!info) return null;\n \n const { sdpString, sdpMLineIndex, sdpMid, foundation, component, protocol, priority, address, type, relAddress, generation, tcpType, networkId, networkCost, username } = info;\n if (/* TG_CALLS_SDP_STRING */true) {\n if (sdpString) {\n return {\n candidate: sdpString,\n sdpMLineIndex,\n sdpMid\n };\n }\n }\n throw 'no sdpString';\n \n let candidate = `candidate:${foundation} ${component} ${protocol} ${priority} ${address.ip} ${address.port}`;\n const attrs = []\n if (type) {\n attrs.push(`typ ${type}`);\n }\n if (relAddress) {\n attrs.push(`raddr ${relAddress.ip}`);\n attrs.push(`rport ${relAddress.port}`);\n }\n if (tcpType) {\n attrs.push(`tcptype ${tcpType}`);\n }\n if (generation) {\n attrs.push(`generation ${generation}`);\n }\n if (username) {\n attrs.push(`ufrag ${username}`);\n }\n if (networkId) {\n attrs.push(`network-id ${networkId}`);\n }\n if (networkCost) {\n attrs.push(`network-cost ${networkCost}`);\n }\n if (attrs.length > 0) {\n candidate += ` ${attrs.join(' ')}`;\n }\n \n return { candidate, sdpMid, sdpMLineIndex };\n }\n \n static generateOffer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateOffer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateOffer(info);\n }\n \n return ChromeP2PSdpBuilder.generateOffer(info);\n }\n \n static generateAnswer(info) {\n if (isFirefox()) {\n return FirefoxP2PSdpBuilder.generateAnswer(info);\n } else if (isSafari()) {\n return SafariP2PSdpBuilder.generateAnswer(info);\n }\n \n return ChromeP2PSdpBuilder.generateAnswer(info);\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class FirefoxP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n let sdp = `v=0\no=- 1 0 IN IP4 0.0.0.0\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=ice-options:trickle\na=msid-semantic:WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, mid, ssrc, ssrcGroups, payloadTypes, dir, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n}","/*\n * Copyright (c) 2018-present, Evgeny Nadymov\n *\n * This source code is licensed under the GPL v.3.0 license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { addDataChannel, addExtmap, addPayloadTypes, addSsrc } from './p2PSdpBuilder';\n\nexport class SafariP2PSdpBuilder {\n static generateOffer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n\n static generateAnswer(info) {\n const { fingerprints, ufrag, pwd, audio, video } = info;\n audio.type = 'audio';\n video.type = 'video';\n const media = [audio, video];\n\n if (!media.length) {\n return `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0\na=msid-semantic: WMS\n`;\n }\n\n let sdp = `v=0\no=- 1 2 IN IP4 127.0.0.1\ns=-\nt=0 0`;\n if (fingerprints) {\n fingerprints.forEach(x => {\n const { hash, fingerprint, setup } = x;\n sdp += `\na=fingerprint:${hash} ${fingerprint}\na=setup:${setup}`;\n });\n }\n if (ufrag && pwd) {\n sdp += `\na=ice-ufrag:${ufrag}\na=ice-pwd:${pwd}`;\n }\n\n sdp += `\na=group:BUNDLE 0 1 2\na=extmap-allow-mixed\na=msid-semantic: WMS *`;\n const streamName = 'stream' + media.map(x => x.ssrc).join('_');\n for (let i = 0; i < media.length; i++) {\n const m = media[i];\n const { type, ssrc, ssrcGroups, payloadTypes, rtpExtensions } = m;\n switch (type) {\n case 'audio': {\n sdp += `\nm=audio 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} audio${ssrc}`;\n }\n sdp += `\na=rtcp-mux`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n\n break;\n }\n case 'video': {\n sdp += `\nm=video 9 UDP/TLS/RTP/SAVPF ${payloadTypes.map(x => x.id).join(' ')}\nc=IN IP4 0.0.0.0\na=rtcp:9 IN IP4 0.0.0.0\na=ice-options:trickle\na=mid:${i}\na=sendrecv`;\n sdp += addExtmap(rtpExtensions);\n if (ssrc) {\n sdp += `\na=msid:${streamName} video${ssrc}`;\n }\n sdp += `\na=rtcp-mux\na=rtcp-rsize`;\n sdp += addPayloadTypes(payloadTypes);\n sdp += addSsrc(type, ssrc, ssrcGroups, streamName);\n break;\n }\n }\n }\n sdp += addDataChannel(2);\n sdp += `\n`;\n\n return sdp;\n }\n}","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from '../../environment/ctx';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {GroupCallParticipantVideoSourceGroup, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, Update} from '../../layer';\nimport {emojiFromCodePoints} from '../../vendor/emoji';\nimport type {CallId} from '../appManagers/appCallsManager';\nimport type {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport CallConnectionInstance from './callConnectionInstance';\nimport CallInstanceBase from './callInstanceBase';\nimport callsController from './callsController';\nimport CALL_STATE from './callState';\nimport {GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS} from './constants';\nimport parseSignalingData from './helpers/parseSignalingData';\nimport stopTrack from './helpers/stopTrack';\nimport localConferenceDescription, {ConferenceEntry, generateSsrc} from './localConferenceDescription';\nimport getCallProtocol from './p2P/getCallProtocol';\nimport getRtcConfiguration from './p2P/getRtcConfiguration';\nimport P2PEncryptor from './p2P/p2PEncryptor';\nimport {p2pParseCandidate, P2PSdpBuilder} from './p2P/p2PSdpBuilder';\nimport {parseSdp} from './sdp/utils';\nimport {WebRTCLineType} from './sdpBuilder';\nimport StreamManager from './streamManager';\nimport {AudioCodec, CallMediaState, CallSignalingData, DiffieHellmanInfo, P2PAudioCodec, P2PVideoCodec, VideoCodec} from './types';\n\nexport default class CallInstance extends CallInstanceBase<{\n state: (state: CALL_STATE) => void,\n id: (id: CallId, prevId: CallId) => void,\n muted: (muted: boolean) => void,\n mediaState: (mediaState: CallMediaState) => void,\n acceptCallOverride: () => Promise,\n}> {\n public dh: Partial;\n public id: CallId;\n public call: PhoneCall;\n public interlocutorUserId: UserId;\n public protocol: PhoneCallProtocol;\n public isOutgoing: boolean;\n public encryptionKey: Uint8Array;\n public connectionInstance: CallConnectionInstance;\n public encryptor: P2PEncryptor;\n public decryptor: P2PEncryptor;\n public candidates: RTCIceCandidate[];\n\n public offerReceived: boolean;\n public offerSent: boolean;\n\n public createdParticipantEntries: boolean;\n public release: () => Promise;\n public _connectionState: CALL_STATE;\n\n public createdAt: number;\n public connectedAt: number;\n public discardReason: string;\n\n private managers: AppManagers;\n\n private hangUpTimeout: number;\n\n private mediaStates: {\n input: CallMediaState,\n output?: CallMediaState\n };\n\n private sendMediaState: () => Promise;\n\n private decryptQueue: Uint8Array[];\n\n private getEmojisFingerprintPromise: Promise;\n private emojisFingerprint: [string, string, string, string];\n\n private wasStartingScreen: boolean;\n private wasStartingVideo: boolean;\n public wasTryingToJoin: boolean;\n\n public streamManager: StreamManager;\n\n constructor(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n managers: CallInstance['managers'],\n protocol?: PhoneCallProtocol\n }) {\n super();\n\n this.log = logger('CALL');\n\n if(!this.protocol) {\n this.protocol = getCallProtocol();\n }\n\n safeAssign(this, options);\n\n this.createdAt = Date.now();\n this.offerReceived = false;\n this.offerSent = false;\n this.decryptQueue = [];\n this.candidates = [];\n\n this.addEventListener('state', (state) => {\n this.log('state', CALL_STATE[state]);\n\n if(state === CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n\n const streamManager = this.streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n streamManager.direction = 'sendrecv';\n streamManager.types.push('screencast');\n if(!this.isOutgoing) {\n streamManager.locked = true;\n streamManager.canCreateConferenceEntry = false;\n }\n\n let mediaState: CallMediaState = {\n '@type': 'MediaState',\n 'type': 'input',\n 'lowBattery': false,\n 'muted': true,\n 'screencastState': 'inactive',\n 'videoRotation': 0,\n 'videoState': 'inactive'\n };\n\n const self = this;\n mediaState = new Proxy(mediaState, {\n set: function(target, key, value) {\n // @ts-ignore\n target[key] = value;\n self.setMediaState(mediaState);\n self.sendMediaState();\n return true;\n }\n });\n\n this.mediaStates = {\n input: mediaState\n };\n\n this.sendMediaState = debounce(this._sendMediaState.bind(this), 0, false, true);\n }\n\n get connectionState() {\n const {_connectionState, connectionInstance} = this;\n if(_connectionState !== undefined) {\n return _connectionState;\n } else if(!connectionInstance) {\n return CALL_STATE.CONNECTING;\n } else {\n const {iceConnectionState} = connectionInstance.connection;\n if(iceConnectionState === 'closed') {\n return CALL_STATE.CLOSED;\n } else if(iceConnectionState !== 'connected' && (!IS_SAFARI || iceConnectionState !== 'completed')) {\n return CALL_STATE.CONNECTING;\n } else {\n return CALL_STATE.CONNECTED;\n }\n }\n }\n\n get sortIndex() {\n const connectionState = this.connectionState;\n const state = CALL_STATE.CLOSED - connectionState + 1;\n let index = state * 10000000000000;\n index += 2147483647000 - (connectionState === CALL_STATE.PENDING && this.isOutgoing ? 0 : this.createdAt);\n return index;\n }\n\n public getVideoElement(type: CallMediaState['type']) {\n if(type === 'input') return this.elements.get('main');\n else {\n const mediaState = this.getMediaState('output');\n if(!mediaState) {\n return;\n }\n\n const type: WebRTCLineType = mediaState.videoState === 'active' ? 'video' : (mediaState.screencastState === 'active' ? 'screencast' : undefined);\n if(!type) {\n return;\n }\n\n const entry = this.description.findEntry((entry) => entry.type === type);\n if(!entry) {\n return;\n }\n\n return this.elements.get('' + entry.recvEntry.source);\n }\n }\n\n public async startScreenSharingInternal() {\n try {\n this.wasStartingScreen = true;\n this.wasStartingVideo = false;\n this.streamManager.types = ['audio', 'screencast'];\n await this.requestScreen();\n } catch(err) {\n this.log.error('startScreenSharing error', err);\n }\n }\n\n public async toggleScreenSharing() {\n if(this.isSharingVideo) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingScreen) {\n return this.stopVideoSharing();\n } else {\n return this.startScreenSharingInternal();\n }\n }\n\n public async startVideoSharingInternal() {\n try {\n this.wasStartingScreen = false;\n this.wasStartingVideo = true;\n this.streamManager.types = ['audio', 'video'];\n await this.requestInputSource(false, true, false);\n } catch(err) {\n this.log.error('startVideoSharing error', err);\n }\n }\n\n public async stopVideoSharing() {\n const mediaState = this.getMediaState('input');\n mediaState.videoState = mediaState.screencastState = 'inactive';\n\n const {streamManager, description} = this;\n const track = streamManager.inputStream.getVideoTracks()[0];\n if(track) {\n stopTrack(track);\n streamManager.appendToConference(description); // clear sender track\n }\n }\n\n public async toggleVideoSharing() {\n if(this.isSharingScreen) {\n await this.stopVideoSharing();\n }\n\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharingInternal();\n }\n }\n\n public getMediaState(type: CallMediaState['type']) {\n return this.mediaStates[type];\n }\n\n public setMediaState(mediaState: CallMediaState) {\n this.mediaStates[mediaState.type] = mediaState;\n this.dispatchEvent('mediaState', mediaState);\n }\n\n public isSharingVideoType(type: 'video' | 'screencast') {\n try {\n const hasVideoTrack = super.isSharingVideo;\n return hasVideoTrack && !!((this.wasStartingScreen && type === 'screencast') || (this.wasStartingVideo && type === 'video'));\n\n // ! it will be used before the track appears\n // return !!this.description.entries.find((entry) => entry.type === type && entry.transceiver.sender.track.enabled);\n } catch(err) {\n return false;\n }\n }\n\n public get isSharingVideo() {\n return this.isSharingVideoType('video');\n }\n\n public get isSharingScreen() {\n return this.isSharingVideoType('screencast');\n }\n\n public get isMuted() {\n const audioTrack = this.streamManager.inputStream.getAudioTracks()[0];\n return !audioTrack?.enabled;\n }\n\n public get isClosing() {\n const {connectionState} = this;\n return connectionState === CALL_STATE.CLOSING || connectionState === CALL_STATE.CLOSED;\n }\n\n public get description(): localConferenceDescription {\n return this.connectionInstance?.description;\n }\n\n public setHangUpTimeout(timeout: number, reason: PhoneCallDiscardReason['_']) {\n this.clearHangUpTimeout();\n this.hangUpTimeout = ctx.setTimeout(() => {\n this.hangUpTimeout = undefined;\n this.hangUp(reason);\n }, timeout);\n }\n\n public clearHangUpTimeout() {\n if(this.hangUpTimeout !== undefined) {\n clearTimeout(this.hangUpTimeout);\n this.hangUpTimeout = undefined;\n }\n }\n\n public setPhoneCall(phoneCall: PhoneCall) {\n this.call = phoneCall;\n\n const {id} = phoneCall;\n if(this.id !== id) {\n const prevId = this.id;\n this.id = id;\n this.dispatchEvent('id', id, prevId);\n }\n }\n\n public async acceptCall() {\n const canAccept = (await Promise.all(this.dispatchResultableEvent('acceptCallOverride')))[0] ?? true;\n if(this.isClosing || !canAccept) {\n return;\n }\n\n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n\n const call = this.call as PhoneCall.phoneCallRequested;\n this.requestInputSource(true, !!call.pFlags.video, false);\n\n const g_a_hash = call.g_a_hash;\n this.managers.appCallsManager.generateDh().then(async(dh) => {\n this.dh = { // ! it is correct\n g_a_hash,\n b: dh.a,\n g_b: dh.g_a,\n g_b_hash: dh.g_a_hash,\n p: dh.p\n };\n\n return this.managers.apiManager.invokeApi('phone.acceptCall', {\n peer: await this.managers.appCallsManager.getCallInput(this.id),\n protocol: this.protocol,\n g_b: this.dh.g_b\n });\n }).then(async(phonePhoneCall) => {\n await this.managers.appCallsManager.savePhonePhoneCall(phonePhoneCall);\n }).catch((err) => {\n this.log.error('accept call error', err);\n // if(err.type === 'CALL_PROTOCOL_COMPAT_LAYER_INVALID') {\n\n // }\n\n this.hangUp('phoneCallDiscardReasonHangup');\n });\n }\n\n public joinCall() {\n this.log('joinCall');\n\n this.getEmojisFingerprint();\n\n this.overrideConnectionState();\n\n const {isOutgoing, encryptionKey, streamManager} = this;\n\n const configuration = getRtcConfiguration(this.call as PhoneCall.phoneCall);\n this.log('joinCall configuration', configuration);\n if(!configuration) return;\n\n const connectionInstance = this.connectionInstance = new CallConnectionInstance({\n call: this,\n streamManager,\n log: this.log.bindPrefix('connection')\n });\n\n const connection = connectionInstance.createPeerConnection(configuration);\n connection.addEventListener('iceconnectionstatechange', () => {\n const state = this.connectionState;\n if(this.connectedAt === undefined && state === CALL_STATE.CONNECTED) {\n this.connectedAt = Date.now();\n }\n\n this.dispatchEvent('state', state);\n });\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n connection.addEventListener('icecandidate', (event) => {\n const {candidate} = event;\n connection.log('onicecandidate', candidate);\n if(candidate?.candidate) {\n this.sendIceCandidate(candidate);\n }\n });\n connection.addEventListener('track', (event) => {\n const {track} = event;\n connection.log('ontrack', track);\n this.onTrack(event);\n });\n\n const description = connectionInstance.createDescription();\n\n this.encryptor = new P2PEncryptor(isOutgoing, encryptionKey);\n this.decryptor = new P2PEncryptor(!isOutgoing, encryptionKey);\n\n this.log('currentCall', this);\n\n if(isOutgoing) {\n connectionInstance.appendStreamToConference();\n }\n\n this.createDataChannel();\n\n this.processDecryptQueue();\n }\n\n private createDataChannelEntry() {\n const dataChannelEntry = this.description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n dataChannelEntry.sendEntry = dataChannelEntry.recvEntry = dataChannelEntry;\n }\n\n private createDataChannel() {\n if(this.connectionInstance.dataChannel) {\n return;\n }\n\n const channel = this.connectionInstance.createDataChannel({\n id: 0,\n negotiated: true\n });\n channel.addEventListener('message', (e) => {\n this.applyDataChannelData(JSON.parse(e.data));\n });\n channel.addEventListener('open', () => {\n this.sendMediaState();\n });\n }\n\n private applyDataChannelData(data: CallMediaState) {\n switch(data['@type']) {\n case 'MediaState': {\n data.type = 'output';\n this.log('got output media state', data);\n this.setMediaState(data);\n break;\n }\n\n default:\n this.log.error('unknown data channel data:', data);\n break;\n }\n }\n\n private _sendMediaState() {\n const {connectionInstance} = this;\n if(!connectionInstance) return;\n\n const mediaState = {...this.getMediaState('input')};\n // mediaState.videoRotation = 90;\n delete mediaState.type;\n this.log('sendMediaState', mediaState);\n\n connectionInstance.sendDataChannelData(mediaState);\n }\n\n public async sendCallSignalingData(data: CallSignalingData) {\n /* if(data['@type'] === 'InitialSetup') {\n this.filterNotVP8(data);\n } */\n\n const json = JSON.stringify(data);\n const arr = new TextEncoder().encode(json);\n const {bytes} = await this.encryptor.encryptRawPacket(arr);\n\n this.log('sendCallSignalingData', this.id, json);\n await this.managers.apiManager.invokeApi('phone.sendSignalingData', {\n peer: await this.managers.appCallsManager.getCallInput(this.id),\n data: bytes\n });\n }\n\n public sendIceCandidate(iceCandidate: RTCIceCandidate) {\n this.log('sendIceCandidate', iceCandidate);\n const {candidate, sdpMLineIndex} = iceCandidate;\n if(sdpMLineIndex !== 0) {\n return;\n }\n\n const parsed = p2pParseCandidate(candidate);\n // const parsed = {sdpString: candidate};\n /* if(parsed.address.ip !== '') {\n return;\n } */\n\n this.sendCallSignalingData({\n '@type': 'Candidates',\n 'candidates': [parsed]\n });\n }\n\n public async confirmCall() {\n const {protocol, id, call} = this;\n const dh = this.dh as DiffieHellmanInfo.a;\n\n // this.clearHangUpTimeout();\n this.overrideConnectionState(CALL_STATE.EXCHANGING_KEYS);\n const {key, key_fingerprint} = await this.managers.appCallsManager.computeKey((call as PhoneCall.phoneCallAccepted).g_b, dh.a, dh.p);\n\n const phonePhoneCall = await this.managers.apiManager.invokeApi('phone.confirmCall', {\n peer: await this.managers.appCallsManager.getCallInput(id),\n protocol: protocol,\n g_a: dh.g_a,\n key_fingerprint: key_fingerprint\n });\n\n this.encryptionKey = key;\n await this.managers.appCallsManager.savePhonePhoneCall(phonePhoneCall);\n this.joinCall();\n }\n\n public getEmojisFingerprint() {\n if(this.emojisFingerprint) return this.emojisFingerprint;\n if(this.getEmojisFingerprintPromise) return this.getEmojisFingerprintPromise;\n return this.getEmojisFingerprintPromise = apiManagerProxy.invokeCrypto('get-emojis-fingerprint', this.encryptionKey, this.dh.g_a).then((codePoints) => {\n this.getEmojisFingerprintPromise = undefined;\n return this.emojisFingerprint = codePoints.map((codePoints) => emojiFromCodePoints(codePoints)) as [string, string, string, string];\n });\n }\n\n private unlockStreamManager() {\n this.connectionInstance.streamManager.locked = false;\n this.connectionInstance.appendStreamToConference();\n }\n\n private async doTheMagic() {\n this.connectionInstance.appendStreamToConference();\n\n const connection = this.connectionInstance.connection;\n\n let answer = await connection.createAnswer();\n\n this.log('[sdp] local', answer.type, answer.sdp);\n await connection.setLocalDescription(answer);\n\n connection.getTransceivers().filter((transceiver) => transceiver.direction === 'recvonly').forEach((transceiver) => {\n const entry = this.connectionInstance.description.getEntryByMid(transceiver.mid);\n entry.transceiver = entry.recvEntry.transceiver = transceiver;\n transceiver.direction = 'sendrecv';\n });\n\n const isAnswer = false;\n\n const description = this.description;\n const bundle = description.entries.map((entry) => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter((entry) => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n await connection.setRemoteDescription(sdpDescription);\n\n answer = await connection.createAnswer();\n\n await connection.setLocalDescription(answer);\n\n const initialSetup = parseSignalingData(parseSdp(answer.sdp));\n this.log('[InitialSetup] send 1');\n this.sendCallSignalingData(initialSetup);\n\n this.unlockStreamManager();\n }\n\n public overrideConnectionState(state?: CALL_STATE) {\n this._connectionState = state;\n this.dispatchEvent('state', this.connectionState);\n }\n\n public get duration() {\n return this.connectedAt !== undefined ? (Date.now() - this.connectedAt) / 1000 | 0 : 0;\n }\n\n protected onInputStream(stream: MediaStream): void {\n super.onInputStream(stream);\n\n const videoTrack = stream.getVideoTracks()[0];\n if(videoTrack) {\n const state = this.getMediaState('input');\n\n // handle starting camera\n if(!this.wasStartingScreen && !this.wasStartingVideo) {\n this.wasStartingVideo = true;\n }\n\n if(this.isSharingVideo) {\n state.videoState = 'active';\n } else if(this.isSharingScreen) {\n state.screencastState = 'active';\n }\n\n videoTrack.addEventListener('ended', () => {\n this.stopVideoSharing();\n }, {once: true});\n }\n\n if(stream.getAudioTracks().length) {\n this.onMutedChange();\n }\n }\n\n private onMutedChange() {\n const isMuted = this.isMuted;\n this.dispatchEvent('muted', isMuted);\n\n const state = this.getMediaState('input');\n state.muted = isMuted;\n }\n\n public toggleMuted(): Promise {\n return this.requestAudioSource(true).then(() => {\n this.setMuted();\n this.onMutedChange();\n });\n }\n\n public async hangUp(discardReason?: PhoneCallDiscardReason['_'], discardedByOtherParty?: boolean) {\n if(this.isClosing) {\n return;\n }\n\n this.discardReason = discardReason;\n this.log('hangUp', discardReason);\n this.overrideConnectionState(CALL_STATE.CLOSED);\n\n if(this.connectionInstance) {\n this.connectionInstance.closeConnectionAndStream(true);\n }\n\n if(discardReason && !discardedByOtherParty) {\n let hasVideo = false;\n for(const type in this.mediaStates) {\n const mediaState = this.mediaStates[type as 'input' | 'output'];\n hasVideo = mediaState.videoState === 'active' || mediaState.screencastState === 'active' || hasVideo;\n }\n\n await this.managers.appCallsManager.discardCall(this.id, this.duration, discardReason, hasVideo);\n }\n }\n\n private performCodec(_codec: P2PAudioCodec | P2PVideoCodec) {\n const payloadTypes: AudioCodec['payload-types'] = _codec.payloadTypes.map((payloadType) => {\n return {\n ...payloadType,\n 'rtcp-fbs': payloadType.feedbackTypes\n }\n });\n\n const codec: AudioCodec = {\n 'rtp-hdrexts': _codec.rtpExtensions,\n 'payload-types': payloadTypes\n };\n\n return codec;\n }\n\n private setDataToDescription(data: CallSignalingData.initialSetup) {\n this.description.setData({\n transport: {\n 'pwd': data.pwd,\n 'ufrag': data.ufrag,\n 'fingerprints': data.fingerprints,\n 'rtcp-mux': true\n },\n audio: this.performCodec(data.audio),\n video: data.video ? this.performCodec(data.video) as VideoCodec : undefined,\n screencast: data.screencast ? this.performCodec(data.screencast) as VideoCodec : undefined\n });\n }\n\n private filterNotVP8(initialSetup: CallSignalingData.initialSetup) {\n if(!this.isOutgoing) { // only VP8 works now\n [initialSetup.video, initialSetup.screencast].filter(Boolean).forEach((codec) => {\n const payloadTypes = codec.payloadTypes;\n const idx = payloadTypes.findIndex((payloadType) => payloadType.name === 'VP8');\n const vp8PayloadType = payloadTypes[idx];\n const rtxIdx = payloadTypes.findIndex((payloadType) => +payloadType.parameters?.apt === vp8PayloadType.id);\n codec.payloadTypes = [payloadTypes[idx], payloadTypes[rtxIdx]];\n });\n }\n }\n\n public async applyCallSignalingData(data: CallSignalingData) {\n this.log('applyCallSignalingData', this, data);\n\n const {connection, description} = this.connectionInstance;\n\n switch(data['@type']) {\n case 'InitialSetup': {\n this.log('[sdp] InitialSetup', data);\n\n this.filterNotVP8(data);\n this.setDataToDescription(data);\n\n const performSsrcGroups = (ssrcGroups: P2PVideoCodec['ssrcGroups']): GroupCallParticipantVideoSourceGroup[] => {\n return ssrcGroups.map((ssrcGroup) => {\n return {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics: ssrcGroup.semantics,\n sources: ssrcGroup.ssrcs.map((source) => +source)\n };\n });\n };\n\n const ssrcs = [\n generateSsrc('audio', +data.audio.ssrc),\n data.video ? generateSsrc('video', performSsrcGroups(data.video.ssrcGroups)) : undefined,\n data.screencast ? generateSsrc('screencast', performSsrcGroups(data.screencast.ssrcGroups)) : undefined\n ].filter(Boolean);\n\n ssrcs.forEach((ssrc) => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n return;\n }\n\n const sendRecvEntry = description.findFreeSendRecvEntry(ssrc.type, false);\n entry = new ConferenceEntry(sendRecvEntry.mid, ssrc.type);\n entry.setDirection('sendrecv');\n sendRecvEntry.recvEntry = entry;\n\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n });\n\n this.createDataChannelEntry();\n\n const isAnswer = this.offerSent;\n this.offerSent = false;\n\n const bundle = description.entries.map((entry) => entry.mid);\n const sdpDescription: RTCSessionDescriptionInit = {\n type: isAnswer ? 'answer' : 'offer',\n sdp: description.generateSdp({\n bundle,\n entries: description.entries.filter((entry) => bundle.includes(entry.mid)),\n // isAnswer: isAnswer\n isAnswer: !isAnswer\n })\n };\n\n this.log('[sdp] remote', sdpDescription.sdp);\n\n await connection.setRemoteDescription(sdpDescription);\n\n await this.tryToReleaseCandidates();\n\n if(!isAnswer) {\n await this.doTheMagic();\n }\n\n break;\n }\n\n case 'Candidates': {\n for(const candidate of data.candidates) {\n const init: RTCIceCandidateInit = P2PSdpBuilder.generateCandidate(candidate);\n init.sdpMLineIndex = 0;\n const iceCandidate = new RTCIceCandidate(init);\n this.candidates.push(iceCandidate);\n }\n\n await this.tryToReleaseCandidates();\n break;\n }\n\n default: {\n this.log.error('unrecognized signaling data', data);\n }\n }\n }\n\n public async tryToReleaseCandidates() {\n const {connectionInstance} = this;\n if(!connectionInstance) {\n return;\n }\n\n const {connection} = connectionInstance;\n if(connection.remoteDescription) {\n const promises: Promise[] = this.candidates.map((candidate) => this.addIceCandidate(connection, candidate));\n this.candidates.length = 0;\n\n await Promise.all(promises);\n } else {\n this.log('[candidates] postpone');\n }\n }\n\n private async addIceCandidate(connection: RTCPeerConnection, candidate: RTCIceCandidate) {\n this.log('[candidate] start', candidate);\n try {\n // if(!candidate.address) return;\n await connection.addIceCandidate(candidate);\n this.log('[candidate] add', candidate);\n } catch(e) {\n this.log.error('[candidate] error', candidate, e);\n }\n }\n\n private async processDecryptQueue() {\n const {encryptor} = this;\n if(!encryptor) {\n this.log.warn('got encrypted signaling data before the encryption key');\n return;\n }\n\n const length = this.decryptQueue.length;\n if(!length) {\n return;\n }\n\n const queue = this.decryptQueue.slice();\n this.decryptQueue.length = 0;\n\n for(const data of queue) {\n const decryptedData = await encryptor.decryptRawPacket(data);\n if(!decryptedData) {\n continue;\n }\n\n // this.log('[update] updateNewCallSignalingData', update, decryptedData);\n\n const str = new TextDecoder().decode(decryptedData);\n try {\n const signalingData: CallSignalingData = JSON.parse(str);\n this.log('[update] updateNewCallSignalingData', signalingData);\n this.applyCallSignalingData(signalingData);\n } catch(err) {\n this.log.error('wrong signaling data', str);\n this.hangUp('phoneCallDiscardReasonDisconnect');\n callsController.dispatchEvent('incompatible', this.interlocutorUserId);\n }\n }\n }\n\n public onUpdatePhoneCallSignalingData(data: Uint8Array) {\n this.decryptQueue.push(data);\n this.processDecryptQueue();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport {PhoneCallProtocol} from '../../../layer';\n\nexport default function getCallProtocol(): PhoneCallProtocol {\n return {\n _: 'phoneCallProtocol',\n pFlags: {\n udp_p2p: true,\n udp_reflector: true\n },\n min_layer: 92,\n max_layer: 92,\n library_versions: ['4.0.0']\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport {PhoneCall} from '../../../layer';\n\nexport default function getRtcConfiguration(call: PhoneCall.phoneCall): RTCConfiguration {\n const iceServers: RTCIceServer[] = [];\n call.connections.forEach((connection) => {\n switch(connection._) {\n /* case 'callServerTypeTelegramReflector': {\n break;\n } */\n case 'phoneConnectionWebrtc': {\n const {ip, ipv6, port, username, password} = connection;\n const urls: string[] = [];\n if(connection.pFlags.turn) {\n if(ip) {\n urls.push(`turn:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`turn:[${ipv6}]:${port}`);\n }\n } else if(connection.pFlags.stun) {\n if(ip) {\n urls.push(`stun:${ip}:${port}`);\n }\n if(ipv6) {\n urls.push(`stun:[${ipv6}]:${port}`);\n }\n }\n\n if(urls.length > 0) {\n iceServers.push({\n urls,\n username,\n credential: password\n });\n }\n break;\n }\n }\n });\n\n return {\n iceServers,\n iceTransportPolicy: call.pFlags.p2p_allowed ? 'all' : 'relay'\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getScreenStream from './getScreenStream';\nimport getStream from './getStream';\n\n/**\n * ! Use multiple constraints together only with first invoke\n */\nexport default function getStreamCached() {\n const _cache: {\n main: Partial<{\n audio: Promise,\n video: Promise\n }>,\n screen: Partial<{\n audio: Promise,\n video: Promise\n }>\n } = {\n main: {},\n screen: {}\n };\n\n return async(options: {\n isScreen: true,\n constraints: DisplayMediaStreamOptions,\n } | {\n isScreen?: false,\n constraints: MediaStreamConstraints,\n muted: boolean\n }) => {\n const {isScreen, constraints} = options;\n const cache = _cache[isScreen ? 'screen' : 'main'];\n let promise: Promise = cache[constraints.audio ? 'audio' : 'video'];\n\n if(!promise) {\n promise = (isScreen ? getScreenStream : getStream)(constraints, (options as any).muted);\n if(constraints.audio && !cache.audio) cache.audio = promise.finally(() => cache.audio = undefined);\n if(constraints.video && !cache.video) cache.video = promise.finally(() => cache.video = undefined);\n }\n\n try {\n return await promise;\n /* let out: Partial<{\n audio: MediaStream,\n video: MediaStream\n }> = {};\n\n await Promise.all([\n constraints.audio && cache.audio.then((stream) => out.audio = stream),\n constraints.video && cache.video.then((stream) => out.video = stream)\n ].filter(Boolean));\n\n return out; */\n } catch(err) {\n throw err;\n }\n };\n}\n\n(window as any).getStreamCached = getStreamCached;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase, {EventListenerListeners} from '../../helpers/eventListenerBase';\nimport noop from '../../helpers/noop';\nimport {logger} from '../logger';\nimport getAudioConstraints from './helpers/getAudioConstraints';\nimport getScreenConstraints from './helpers/getScreenConstraints';\nimport getStreamCached from './helpers/getStreamCached';\nimport getVideoConstraints from './helpers/getVideoConstraints';\nimport stopTrack from './helpers/stopTrack';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport StreamManager, {StreamItem} from './streamManager';\n\nexport type TryAddTrackOptions = {\n stream: MediaStream,\n track: MediaStreamTrack,\n type: StreamItem['type'],\n source?: string\n};\n\nexport default abstract class CallInstanceBase extends EventListenerBase {\n protected log: ReturnType;\n protected outputDeviceId: string;\n\n protected player: HTMLElement;\n protected elements: Map;\n\n protected audio: HTMLAudioElement;\n // protected fixedSafariAudio: boolean;\n\n protected getStream: ReturnType;\n\n constructor() {\n super(false);\n\n const player = this.player = document.createElement('div');\n player.classList.add('call-player');\n player.style.display = 'none';\n document.body.append(player);\n\n this.elements = new Map();\n\n // possible Safari fix\n const audio = this.audio = new Audio();\n audio.autoplay = true;\n audio.volume = 1.0;\n this.player.append(audio);\n this.elements.set('audio', audio);\n\n this.fixSafariAudio();\n\n this.getStream = getStreamCached();\n }\n\n public get isSharingAudio() {\n return !!this.streamManager.hasInputTrackKind('audio');\n }\n\n public get isSharingVideo() {\n return !!this.streamManager.hasInputTrackKind('video');\n }\n\n public abstract get isMuted(): boolean;\n public abstract get isClosing(): boolean;\n\n public fixSafariAudio() {\n // if(this.fixedSafariAudio) return;\n this.audio.play().catch(noop);\n // this.fixedSafariAudio = true;\n }\n\n public requestAudioSource(muted: boolean) {\n return this.requestInputSource(true, false, muted);\n }\n\n public requestInputSource(audio: boolean, video: boolean, muted: boolean) {\n const {streamManager} = this;\n if(streamManager) {\n const isAudioGood = !audio || this.isSharingAudio;\n const isVideoGood = !video || this.isSharingVideo;\n if(isAudioGood && isVideoGood) {\n return Promise.resolve();\n }\n }\n\n const constraints: MediaStreamConstraints = {\n audio: audio && getAudioConstraints(),\n video: video && getVideoConstraints()\n };\n\n return this.getStream({\n constraints,\n muted\n }).then((stream) => {\n this.onInputStream(stream);\n });\n }\n\n public requestScreen() {\n return this.getStream({\n isScreen: true,\n constraints: getScreenConstraints(true)\n }).then((stream) => {\n this.onInputStream(stream);\n });\n }\n\n public getElement(endpoint: number | string) {\n return this.elements.get('' + endpoint);\n }\n\n public abstract get streamManager(): StreamManager;\n public abstract get description(): LocalConferenceDescription;\n public abstract toggleMuted(): Promise;\n\n public cleanup() {\n this.player.textContent = '';\n this.player.remove();\n this.elements.clear();\n\n // can have no connectionInstance but streamManager with input stream\n this.streamManager.stop();\n\n super.cleanup();\n }\n\n public onTrack(event: RTCTrackEvent) {\n this.tryAddTrack({\n stream: event.streams[0],\n track: event.track,\n type: 'output'\n });\n }\n\n public saveInputVideoStream(stream: MediaStream, type?: string) {\n const track = stream.getVideoTracks()[0];\n this.tryAddTrack({\n stream,\n track,\n type: 'input',\n source: type || 'main'\n });\n }\n\n public tryAddTrack({stream, track, type, source}: TryAddTrackOptions) {\n if(!source) {\n source = StreamManager.getSource(stream, type);\n }\n\n this.log('tryAddTrack', stream, track, type, source);\n\n const isOutput = type === 'output';\n\n const {player, elements, streamManager} = this;\n\n const tagName = track.kind as StreamItem['kind'];\n const isVideo = tagName === 'video';\n\n const elementEndpoint = isVideo ? source : tagName;\n let element = elements.get(elementEndpoint);\n\n if(isVideo) {\n track.addEventListener('ended', () => {\n this.log('[track] onended');\n elements.delete(elementEndpoint);\n // element.remove();\n }, {once: true});\n }\n\n if(isOutput) {\n streamManager.addTrack(stream, track, type);\n }\n\n const useStream = isVideo ? stream : streamManager.outputStream;\n if(!element) {\n element = document.createElement(tagName);\n element.autoplay = true;\n element.srcObject = useStream;\n element.volume = 1.0;\n\n if((element as any).sinkId !== 'undefined') {\n const {outputDeviceId} = this;\n if(outputDeviceId) {\n (element as any).setSinkId(outputDeviceId);\n }\n }\n\n if(!isVideo) {\n player.appendChild(element);\n } else {\n element.setAttribute('playsinline', 'true');\n element.muted = true;\n }\n // audio.play();\n\n elements.set(elementEndpoint, element);\n } else {\n if(element.paused) {\n element.play().catch(noop);\n }\n\n // ! EVEN IF MEDIASTREAM IS THE SAME NEW TRACK WON'T PLAY WITHOUT REPLACING IT WHEN NEW PARTICIPANT IS ENTERING !\n // if(element.srcObject !== useStream) {\n element.srcObject = useStream;\n // }\n }\n\n return source;\n }\n\n public setMuted(muted?: boolean) {\n this.streamManager.inputStream.getAudioTracks().forEach((track) => {\n if(track?.kind === 'audio') {\n track.enabled = muted === undefined ? !track.enabled : !muted;\n }\n });\n }\n\n protected onInputStream(stream: MediaStream): void {\n if(!this.isClosing) {\n const videoTracks = stream.getVideoTracks();\n if(videoTracks.length) {\n this.saveInputVideoStream(stream, 'main');\n }\n\n const {streamManager, description} = this;\n streamManager.addStream(stream, 'input');\n\n if(description) {\n streamManager.appendToConference(description);\n }\n } else { // if call is declined earlier than stream appears\n stream.getTracks().forEach((track) => {\n stopTrack(track);\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nenum CALL_STATE {\n CONNECTED,\n CONNECTING,\n EXCHANGING_KEYS,\n PENDING,\n REQUESTING,\n CLOSING,\n CLOSED\n}\n\nexport default CALL_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\n\nexport type CallAudioAssetName = 'call_busy.mp3' | 'call_connect.mp3' | 'call_end.mp3' | 'call_incoming.mp3' | 'call_outgoing.mp3' | 'voip_failed.mp3' | 'voip_connecting.mp3';\n\nlet audioAsset: AudioAssetPlayer;\nexport default function getCallAudioAsset() {\n return audioAsset ??= new AudioAssetPlayer([\n 'call_busy.mp3',\n 'call_connect.mp3',\n 'call_end.mp3',\n 'call_incoming.mp3',\n 'call_outgoing.mp3',\n 'voip_failed.mp3'\n ]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getCallAudioAsset, {CallAudioAssetName} from '../../components/call/getAudioAsset';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport IS_CALL_SUPPORTED from '../../environment/callSupport';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport tsNow from '../../helpers/tsNow';\nimport {PhoneCallProtocol} from '../../layer';\nimport {CallId} from '../appManagers/appCallsManager';\nimport {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport rootScope from '../rootScope';\nimport CallInstance from './callInstance';\nimport CALL_STATE from './callState';\n\nconst CALL_REQUEST_TIMEOUT = 45e3;\n\nexport class CallsController extends EventListenerBase<{\n instance: (details: {hasCurrent: boolean, instance: CallInstance}) => void,\n accepting: (instance: CallInstance) => void, // это костыль. используется при параллельном вызове, чтобы заменить звонок в topbarCall\n incompatible: (userId: UserId) => void,\n}> {\n private log: ReturnType;\n private managers: AppManagers;\n private audioAsset: AudioAssetPlayer;\n private instances: Map;\n private sortedInstances: Array;\n private tempId: number;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n this.log = logger('CC');\n\n if(!IS_CALL_SUPPORTED) {\n return;\n }\n\n this.audioAsset = getCallAudioAsset();\n this.tempId = 0;\n this.instances = new Map();\n this.sortedInstances = [];\n\n rootScope.addEventListener('call_update', async(call) => {\n let instance = this.instances.get(call.id);\n\n if(instance) {\n instance.setPhoneCall(call);\n }\n\n switch(call._) {\n case 'phoneCallDiscarded': {\n if(instance) {\n instance.hangUp(call.reason?._, true);\n }\n\n break;\n }\n\n case 'phoneCallAccepted': {\n if(instance) {\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\n instance.hangUp('phoneCallDiscardReasonDisconnect');\n rootScope.dispatchEvent('call_incompatible', instance.interlocutorUserId);\n break;\n } */\n\n instance.confirmCall();\n }\n\n break;\n }\n\n case 'phoneCallRequested': {\n if(!instance) {\n /* if(!this.verifyProtocolCompatibility(call.protocol)) {\n rootScope.dispatchEvent('call_incompatible', call.admin_id);\n break;\n } */\n\n instance = this.createCallInstance({\n isOutgoing: false,\n interlocutorUserId: call.admin_id\n });\n\n instance.overrideConnectionState(CALL_STATE.PENDING);\n instance.setPhoneCall(call);\n instance.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonMissed');\n }\n\n break;\n }\n\n case 'phoneCall': {\n if(!instance || instance.encryptionKey) {\n break;\n }\n\n const g_a = instance.dh.g_a = call.g_a_or_b;\n const dh = instance.dh;\n const g_a_hash = await apiManagerProxy.invokeCrypto('sha256', g_a);\n if(!bytesCmp(dh.g_a_hash, g_a_hash)) {\n this.log.error('Incorrect g_a_hash', dh.g_a_hash, g_a_hash);\n break;\n }\n\n const {key, key_fingerprint} = await this.managers.appCallsManager.computeKey(g_a, dh.b, dh.p);\n if(call.key_fingerprint !== key_fingerprint) {\n this.log.error('Incorrect key fingerprint', call.key_fingerprint, key_fingerprint, g_a, dh);\n instance.hangUp('phoneCallDiscardReasonDisconnect');\n break;\n }\n\n instance.encryptionKey = key;\n instance.joinCall();\n\n break;\n }\n }\n });\n\n rootScope.addEventListener('call_signaling', ({callId, data}) => {\n const instance = this.instances.get(callId);\n if(instance?.id !== callId) {\n return;\n }\n\n instance.onUpdatePhoneCallSignalingData(data);\n });\n }\n\n public get currentCall() {\n return this.sortedInstances[0];\n }\n\n public getCallByUserId(userId: UserId) {\n for(const [callId, instance] of this.instances) {\n if(instance.interlocutorUserId === userId) {\n return instance;\n }\n }\n }\n\n private createCallInstance(options: {\n isOutgoing: boolean,\n interlocutorUserId: UserId,\n protocol?: PhoneCallProtocol\n }) {\n const call = new CallInstance({\n managers: this.managers,\n ...options\n });\n\n call.addEventListener('state', (state) => {\n const currentCall = this.currentCall;\n if(state === CALL_STATE.CLOSED) {\n this.instances.delete(call.id);\n indexOfAndSplice(this.sortedInstances, call);\n } else {\n insertInDescendSortedArray(this.sortedInstances, call, 'sortIndex');\n }\n\n if(state === CALL_STATE.EXCHANGING_KEYS) {\n call.wasTryingToJoin = true;\n }\n\n const hasConnected = call.connectedAt !== undefined;\n if(state === CALL_STATE.EXCHANGING_KEYS || (state === CALL_STATE.CONNECTING && hasConnected)) {\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonDisconnect');\n } else {\n call.clearHangUpTimeout();\n }\n\n if(currentCall === call || !currentCall) {\n if(state === CALL_STATE.CLOSED) {\n if(!call.isOutgoing && !call.wasTryingToJoin) { // incoming call has been accepted on other device or ended\n this.audioAsset.stopSound();\n } else if(call.wasTryingToJoin && !hasConnected) { // something has happened during the key exchanging\n this.audioAsset.playSound('voip_failed.mp3');\n } else {\n this.audioAsset.playSound(call.discardReason === 'phoneCallDiscardReasonBusy' ? 'call_busy.mp3' : 'call_end.mp3');\n }\n } else if(state === CALL_STATE.PENDING) {\n this.audioAsset.playSound(call.isOutgoing ? 'call_outgoing.mp3' : 'call_incoming.mp3', true);\n } else if(state === CALL_STATE.EXCHANGING_KEYS) {\n this.audioAsset.playSoundIfDifferent('call_connect.mp3');\n } else if(state === CALL_STATE.CONNECTING) {\n if(call.duration) {\n this.audioAsset.playSound('voip_connecting.mp3', true);\n }\n } else {\n this.audioAsset.stopSound();\n }\n }\n });\n\n call.addEventListener('id', (id, prevId) => {\n if(prevId !== undefined) {\n this.instances.delete(prevId);\n }\n\n const hasCurrent = !!this.currentCall;\n this.instances.set(id, call);\n\n if(prevId === undefined) {\n this.dispatchEvent('instance', {instance: call, hasCurrent: hasCurrent});\n }\n });\n\n return call;\n }\n\n public async startCallInternal(userId: UserId, isVideo: boolean) {\n this.log('p2pStartCallInternal', userId, isVideo);\n\n const fullInfo = await this.managers.appProfileManager.getProfile(userId);\n if(!fullInfo) return;\n\n const {video_calls_available} = fullInfo.pFlags;\n\n const call = this.createCallInstance({\n isOutgoing: true,\n interlocutorUserId: userId\n });\n\n call.requestInputSource(true, !!(isVideo && video_calls_available), false);\n\n call.overrideConnectionState(CALL_STATE.REQUESTING);\n call.setPhoneCall({\n _: 'phoneCallWaiting',\n access_hash: '',\n admin_id: NULL_PEER_ID,\n date: tsNow(true),\n id: --this.tempId,\n participant_id: userId,\n protocol: call.protocol,\n pFlags: {\n video: isVideo || undefined\n }\n });\n\n // return;\n this.managers.appCallsManager.generateDh().then(async(dh) => {\n call.dh = dh;\n\n return this.managers.appCallsManager.requestCall(userId, call.protocol, call.dh.g_a_hash, isVideo && video_calls_available);\n }).then((phoneCall) => {\n call.overrideConnectionState(CALL_STATE.PENDING);\n call.setPhoneCall(phoneCall);\n call.setHangUpTimeout(CALL_REQUEST_TIMEOUT, 'phoneCallDiscardReasonHangup');\n });\n }\n}\n\nconst callsController = new CallsController();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.callsController = callsController);\nexport default callsController;\n","export const GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX = 50;\nexport const GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS = 100;\nexport const GROUP_CALL_PARTICIPANTS_LOAD_LIMIT = 100;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {GroupCallConnectionType, JoinGroupCallJsonPayload} from '../appManagers/appGroupCallsManager';\nimport {AppManagers} from '../appManagers/managers';\nimport rootScope from '../rootScope';\nimport CallConnectionInstanceBase, {CallConnectionInstanceOptions} from './callConnectionInstanceBase';\nimport GroupCallInstance from './groupCallInstance';\nimport filterServerCodecs from './helpers/filterServerCodecs';\nimport fixLocalOffer from './helpers/fixLocalOffer';\nimport processMediaSection from './helpers/processMediaSection';\nimport {ConferenceEntry} from './localConferenceDescription';\nimport SDP from './sdp';\nimport SDPMediaSection from './sdp/mediaSection';\nimport {WebRTCLineType} from './sdpBuilder';\nimport {UpdateGroupCallConnectionData} from './types';\n\nexport default class GroupCallConnectionInstance extends CallConnectionInstanceBase {\n private groupCall: GroupCallInstance;\n public updateConstraints?: boolean;\n private type: GroupCallConnectionType;\n private options: {\n type: Extract,\n isMuted?: boolean,\n joinVideo?: boolean,\n rejoin?: boolean\n } | {\n type: Extract,\n };\n\n private updateConstraintsInterval: number;\n public negotiateThrottled: () => void;\n\n private managers: AppManagers;\n\n constructor(options: CallConnectionInstanceOptions & {\n groupCall: GroupCallConnectionInstance['groupCall'],\n type: GroupCallConnectionInstance['type'],\n options: GroupCallConnectionInstance['options'],\n managers: AppManagers\n }) {\n super(options);\n\n this.negotiateThrottled = throttle(this.negotiate.bind(this), 0, false);\n }\n\n public createPeerConnection() {\n return this.connection || super.createPeerConnection({\n iceServers: [],\n iceTransportPolicy: 'all',\n bundlePolicy: 'max-bundle',\n rtcpMuxPolicy: 'require',\n iceCandidatePoolSize: 0\n // sdpSemantics: \"unified-plan\",\n // extmapAllowMixed: true,\n });\n }\n\n public createDataChannel() {\n if(this.dataChannel) {\n return this.dataChannel;\n }\n\n const dataChannel = super.createDataChannel();\n\n dataChannel.addEventListener('open', () => {\n this.maybeUpdateRemoteVideoConstraints();\n });\n\n dataChannel.addEventListener('close', () => {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n });\n\n return dataChannel;\n }\n\n public createDescription() {\n if(this.description) {\n return this.description;\n }\n\n const description = super.createDescription();\n\n /* const perType = 0;\n const types = ['audio' as const, 'video' as const];\n const count = types.length * perType;\n const init: RTCRtpTransceiverInit = {direction: 'recvonly'};\n types.forEach((type) => {\n for(let i = 0; i < perType; ++i) {\n description.createEntry(type).createTransceiver(connection, init);\n }\n }); */\n\n return description;\n }\n\n public appendStreamToConference() {\n super.appendStreamToConference();/* .then(() => {\n currentGroupCall.connections.main.negotiating = false;\n this.startNegotiation({\n type: type,\n isMuted: muted,\n rejoin\n });\n }); */\n }\n\n private async invokeJoinGroupCall(localSdp: SDP, mainChannels: SDPMediaSection[], options: GroupCallConnectionInstance['options']) {\n const {groupCall, description} = this;\n const groupCallId = groupCall.id;\n\n const processedChannels = mainChannels.map((section) => {\n const processed = processMediaSection(localSdp, section);\n\n this.sources[processed.entry.type as 'video' | 'audio'] = processed.entry;\n\n return processed;\n });\n\n const audioChannel = processedChannels.find((channel) => channel.media.mediaType === 'audio');\n const videoChannel = processedChannels.find((channel) => channel.media.mediaType === 'video');\n let {source, params} = audioChannel || {};\n const useChannel = videoChannel || audioChannel;\n\n const channels: {[type in WebRTCLineType]?: typeof audioChannel} = {\n audio: audioChannel,\n video: videoChannel\n };\n\n description.entries.forEach((entry) => {\n if(entry.direction === 'sendonly') {\n const channel = channels[entry.type];\n if(!channel) return;\n\n description.setEntrySource(entry, channel.sourceGroups || channel.source);\n description.setEntryPeerId(entry, rootScope.myId);\n }\n });\n\n // overwrite ssrc with audio in video params\n if(params !== useChannel.params) {\n const data: JoinGroupCallJsonPayload = JSON.parse(useChannel.params.data);\n // data.ssrc = source || data.ssrc - 1; // audio channel can be missed in screensharing\n if(source) data.ssrc = source;\n else delete data.ssrc;\n params = {\n _: 'dataJSON',\n data: JSON.stringify(data)\n };\n }\n\n const update = await this.managers.appGroupCallsManager.joinGroupCall(groupCallId, params, options);\n\n const data: UpdateGroupCallConnectionData = JSON.parse(update.params.data);\n\n data.audio = data.audio || groupCall.connections.main.description.audio;\n description.setData(data);\n filterServerCodecs(mainChannels, data);\n\n return data;\n }\n\n protected async negotiateInternal() {\n const {connection, description} = this;\n const isNewConnection = connection.iceConnectionState === 'new' && !description.getEntryByMid('0').source;\n const log = this.log.bindPrefix('startNegotiation');\n log('start');\n\n const originalOffer = await connection.createOffer({iceRestart: false});\n\n if(isNewConnection && this.dataChannel) {\n const dataChannelEntry = description.createEntry('application');\n dataChannelEntry.setDirection('sendrecv');\n }\n\n const {sdp: localSdp, offer} = fixLocalOffer({\n offer: originalOffer,\n data: description\n });\n\n log('[sdp] setLocalDescription', offer.sdp);\n await connection.setLocalDescription(offer);\n\n const mainChannels = localSdp.media.filter((media) => {\n return media.mediaType !== 'application' && media.isSending;\n });\n\n if(isNewConnection) {\n try {\n await this.invokeJoinGroupCall(localSdp, mainChannels, this.options);\n } catch(e) {\n this.log.error('[tdweb] joinGroupCall error', e);\n }\n }\n\n /* if(!data) {\n log('abort 0');\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n\n /* if(connection.iceConnectionState !== 'new') {\n log(`abort 1 connectionState=${connection.iceConnectionState}`);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n /* if(this.currentGroupCall !== currentGroupCall || connectionHandler.connection !== connection) {\n log('abort', this.currentGroupCall, currentGroupCall);\n this.closeConnectionAndStream(connection, streamManager);\n return;\n } */\n\n const isAnswer = true;\n // const _bundleMids = bundleMids.slice();\n const entriesToDelete: ConferenceEntry[] = [];\n const bundle = localSdp.bundle;\n forEachReverse(bundle, (mid, idx, arr) => {\n const entry = description.getEntryByMid(mid);\n if(entry.shouldBeSkipped(isAnswer)) {\n arr.splice(idx, 1);\n entriesToDelete.push(entry);\n }\n });\n\n /* forEachReverse(description.entries, (entry, idx, arr) => {\n const mediaSection = _parsedSdp.media.find((section) => section.oa.get('mid').oa === entry.mid);\n const deleted = !mediaSection;\n // const deleted = !_bundleMids.includes(entry.mid); // ! can't use it because certain mid can be missed in bundle\n if(deleted) {\n arr.splice(idx, 1);\n }\n }); */\n\n const entries = localSdp.media.map((section) => {\n const mid = section.mid;\n let entry = description.getEntryByMid(mid);\n if(!entry) {\n entry = new ConferenceEntry(mid, section.mediaType);\n entry.setDirection('inactive');\n }\n\n return entry;\n });\n\n const answerDescription: RTCSessionDescriptionInit = {\n type: 'answer',\n sdp: description.generateSdp({\n bundle,\n entries,\n isAnswer\n })\n };\n\n entriesToDelete.forEach((entry) => {\n description.deleteEntry(entry);\n });\n\n log(`[sdp] setRemoteDescription signaling=${connection.signalingState} ice=${connection.iceConnectionState} gathering=${connection.iceGatheringState} connection=${connection.connectionState}`, answerDescription.sdp);\n await connection.setRemoteDescription(answerDescription);\n\n log('end');\n }\n\n public negotiate() {\n let promise = this.negotiating;\n if(promise) {\n return promise;\n }\n\n promise = super.negotiate();\n\n if(this.updateConstraints) {\n promise.then(() => {\n this.maybeUpdateRemoteVideoConstraints();\n this.updateConstraints = false;\n });\n }\n\n if(this.options.type === 'presentation') {\n promise.then(() => {\n this.connection.getTransceivers().find((transceiver) => {\n if(transceiver.sender?.track?.kind === 'video') {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n }\n });\n });\n }\n\n return promise;\n }\n\n public maybeUpdateRemoteVideoConstraints() {\n if(this.dataChannel.readyState !== 'open') {\n return;\n }\n\n this.log('maybeUpdateRemoteVideoConstraints');\n\n // * https://github.com/TelegramMessenger/tgcalls/blob/6f2746e04c9b040f8c8dfc64d916a1853d09c4ce/tgcalls/group/GroupInstanceCustomImpl.cpp#L2549\n type VideoConstraints = {minHeight?: number, maxHeight: number};\n const obj: {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {[endpoint: string]: VideoConstraints},\n defaultConstraints: VideoConstraints,\n onStageEndpoints: string[]\n } = {\n colibriClass: 'ReceiverVideoConstraints',\n constraints: {},\n defaultConstraints: {maxHeight: 0},\n onStageEndpoints: []\n };\n\n for(const entry of this.description.entries) {\n if(entry.direction !== 'recvonly' || entry.type !== 'video') {\n continue;\n }\n\n const {endpoint} = entry;\n obj.onStageEndpoints.push(endpoint);\n obj.constraints[endpoint] = {\n minHeight: 180,\n maxHeight: 720\n };\n }\n\n this.sendDataChannelData(obj);\n\n if(!obj.onStageEndpoints.length) {\n if(this.updateConstraintsInterval) {\n clearInterval(this.updateConstraintsInterval);\n this.updateConstraintsInterval = undefined;\n }\n } else if(!this.updateConstraintsInterval) {\n this.updateConstraintsInterval = window.setInterval(this.maybeUpdateRemoteVideoConstraints.bind(this), 5000);\n }\n }\n\n public addInputVideoStream(stream: MediaStream) {\n // const {sources} = this;\n // if(sources?.video) {\n // const source = this.sources.video.source;\n // stream.source = '' + source;\n this.groupCall.saveInputVideoStream(stream, this.type);\n // }\n\n this.streamManager.addStream(stream, 'input');\n this.appendStreamToConference(); // replace sender track\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {DataJSON} from '../../../layer';\nimport {JoinGroupCallJsonPayload} from '../../appManagers/appGroupCallsManager';\nimport SDP from '../sdp';\nimport {Ssrc} from '../types';\nimport parseMediaSectionInfo from './parseMediaSectionInfo';\n\nexport default function processMediaSection(sdp: SDP, media: SDP['media'][0]) {\n const sectionInfo = parseMediaSectionInfo(sdp, media);\n\n const mediaType: Exclude = media.mediaType as any;\n const entry: Ssrc = {\n source: sectionInfo.source,\n sourceGroups: sectionInfo.sourceGroups,\n type: mediaType\n };\n\n // do not change this value, otherwise onconnectionstatechange won't fire\n sectionInfo.fingerprint.setup = 'active';\n const payload: JoinGroupCallJsonPayload = {\n 'fingerprints': [sectionInfo.fingerprint],\n 'pwd': sectionInfo.pwd,\n 'ssrc': sectionInfo.source,\n 'ssrc-groups': sectionInfo.sourceGroups || [],\n 'ufrag': sectionInfo.ufrag\n };\n const paramsDataJson = JSON.stringify(payload);\n\n const params: DataJSON = {\n _: 'dataJSON',\n data: paramsDataJson\n };\n\n return {\n params,\n source: sectionInfo.source,\n media,\n sourceGroups: sectionInfo.sourceGroups,\n entry\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport SDPMediaSection from '../sdp/mediaSection';\nimport {UpdateGroupCallConnectionData, Codec} from '../types';\n\nexport default function filterServerCodecs(mainChannels: SDPMediaSection[], data: UpdateGroupCallConnectionData) {\n // ! Need to filter server's extmap for Firefox\n const performExtmap = (channel: typeof mainChannels[0]) => {\n const out: {[id: string]: string} = {};\n const extmap = channel.attributes.get('extmap');\n extmap.forEach((extmap) => {\n const id = extmap.key.split('/', 1)[0];\n out[id] = extmap.value;\n });\n\n return out;\n };\n\n const codecsToPerform: [Codec, 'audio' | 'video'][] = /* flatten([data, dataPresentation].filter(Boolean).map((data) => {\n return */['audio' as const, 'video' as const].filter((type) => data[type]).map((type) => ([data[type], type]));\n // }));\n\n codecsToPerform.forEach(([codec, type]) => {\n const channel = mainChannels.find((line) => line.mediaType === type);\n if(!channel) {\n return;\n }\n\n const extmap = performExtmap(channel);\n forEachReverse(codec['rtp-hdrexts'], (value, index, arr) => {\n if(extmap[value.id] !== value.uri) {\n arr.splice(index, 1);\n console.log(`[sdp] filtered extmap:`, value, index, type);\n }\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport forEachReverse from '../../../helpers/array/forEachReverse';\nimport copy from '../../../helpers/object/copy';\nimport {ConferenceEntry} from '../localConferenceDescription';\nimport {parseSdp, addSimulcast} from '../sdp/utils';\nimport {generateMediaFirstLine, SDPBuilder} from '../sdpBuilder';\nimport {UpdateGroupCallConnectionData} from '../types';\nimport parseMediaSectionInfo from './parseMediaSectionInfo';\n\nexport default function fixLocalOffer(options: {\n offer: RTCSessionDescriptionInit,\n data: UpdateGroupCallConnectionData,\n skipAddingMulticast?: boolean\n // mids?: string[]\n}) {\n const {offer, data} = options;\n const sdp = parseSdp(offer.sdp);\n let hasMunged = false;\n\n if(!options.skipAddingMulticast) {\n hasMunged = addSimulcast(sdp) || hasMunged;\n }\n\n // const bundleLine = parsedSdp.session.lines.find((line) => line.Ha?.key === 'group');\n // const bundleMids = bundleLine.value.split(' ').slice(1);\n\n forEachReverse(sdp.media, (section, idx, arr) => {\n // const mid = section.oa.get('mid').oa;\n\n // это может случиться при выключении и включении видео. почему-то появится секция уже удалённая\n // ! нельзя тут модифицировать локальное описание, будет критовать\n /* if(mids && !mids.includes(mid) && !bundleMids.includes(mid)) {\n console.error('wtf');\n hasMunged = true;\n arr.splice(idx, 1);\n return;\n } */\n\n if(/* section.mediaType !== 'video' || */section.isSending) {\n return;\n }\n\n if(section.mediaType === 'application') {\n return;\n }\n\n const mediaLine = section.mediaLine;\n const mediaLineParts = mediaLine.mediaLineParts;\n const mediaCodecIds = mediaLineParts.ids;\n const localMLine = mediaLine.toString();\n\n const codec = data[section.mediaType];\n const payloadTypes = codec['payload-types'];\n\n /* forEachReverse(payloadTypes, (payloadType, idx, arr) => {\n if(!mediaCodecIds.includes('' + payloadType.id) && section.mediaType === 'video') {\n // if(payloadType.name === 'H265') {\n console.warn('[sdp] filtered unsupported codec', payloadType, mediaCodecIds, section.mediaType);\n arr.splice(idx, 1);\n }\n }); */\n\n const codecIds = payloadTypes.map((payload) => '' + payload.id);\n const correctMLine = generateMediaFirstLine(section.mediaType, undefined, codecIds);\n\n if(localMLine !== correctMLine) {\n const sectionInfo = parseMediaSectionInfo(sdp, section);\n\n const newData = {...data};\n newData.transport = copy(newData.transport);\n newData.transport.ufrag = sectionInfo.ufrag;\n newData.transport.pwd = sectionInfo.pwd;\n newData.transport.fingerprints = [sectionInfo.fingerprint];\n newData.transport.candidates = [];\n\n const entry = new ConferenceEntry(sectionInfo.mid, mediaLineParts.type);\n entry.setPort(mediaLineParts.port);\n sectionInfo.source && entry.setSource(sectionInfo.sourceGroups || sectionInfo.source);\n entry.setDirection(section.direction);\n\n const newSdp = new SDPBuilder().addSsrcEntry(entry, newData).finalize();\n\n const newChannel = parseSdp(newSdp).media[0];\n arr[idx] = newChannel;\n\n hasMunged = true;\n }\n });\n\n if(hasMunged) {\n const mungedSdp = sdp.toString();\n offer.sdp = mungedSdp;\n }\n\n return {offer, sdp/* , bundleMids */};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {GroupCallConnectionType, GroupCallId, GroupCallOutputSource} from '../appManagers/appGroupCallsManager';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport throttle from '../../helpers/schedulers/throttle';\nimport {GroupCall, GroupCallParticipant} from '../../layer';\nimport {logger} from '../logger';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport rootScope from '../rootScope';\nimport CallInstanceBase, {TryAddTrackOptions} from './callInstanceBase';\nimport GroupCallConnectionInstance from './groupCallConnectionInstance';\nimport GROUP_CALL_STATE from './groupCallState';\nimport getScreenConstraints from './helpers/getScreenConstraints';\nimport getScreenStream from './helpers/getScreenStream';\nimport getStream from './helpers/getStream';\nimport getVideoConstraints from './helpers/getVideoConstraints';\nimport stopTrack from './helpers/stopTrack';\nimport localConferenceDescription from './localConferenceDescription';\nimport {WebRTCLineType} from './sdpBuilder';\nimport StreamManager from './streamManager';\nimport {Ssrc} from './types';\nimport getPeerId from '../appManagers/utils/peers/getPeerId';\nimport {AppManagers} from '../appManagers/managers';\nimport {generateSelfVideo, makeSsrcFromParticipant, makeSsrcsFromParticipant} from './groupCallsController';\n\nexport default class GroupCallInstance extends CallInstanceBase<{\n state: (state: GROUP_CALL_STATE) => void,\n pinned: (source?: GroupCallOutputSource) => void,\n}> {\n public id: GroupCallId;\n public chatId: ChatId;\n public handleUpdateGroupCallParticipants: boolean;\n public updatingSdp: boolean;\n public isSpeakingMap: Map;\n public connections: {[k in GroupCallConnectionType]?: GroupCallConnectionInstance};\n public groupCall: GroupCall;\n public participant: GroupCallParticipant;\n\n // will be set with negotiation\n public joined: boolean;\n\n private pinnedSources: Array;\n private participantsSsrcs: Map;\n private hadAutoPinnedSources: Set;\n private dispatchPinnedThrottled: () => void;\n private startVideoSharingPromise: Promise;\n private startScreenSharingPromise: Promise;\n\n private managers: AppManagers;\n\n constructor(options: {\n id: GroupCallInstance['id'],\n chatId: GroupCallInstance['chatId'],\n isSpeakingMap?: GroupCallInstance['isSpeakingMap'],\n connections?: GroupCallInstance['connections'],\n managers: AppManagers\n }) {\n super();\n\n safeAssign(this, options);\n\n if(!this.log) {\n this.log = logger('GROUP-CALL');\n }\n\n if(!this.connections) {\n this.connections = {};\n }\n\n if(!this.isSpeakingMap) {\n this.isSpeakingMap = new Map();\n }\n\n this.pinnedSources = [];\n this.participantsSsrcs = new Map();\n this.hadAutoPinnedSources = new Set();\n this.dispatchPinnedThrottled = throttle(() => {\n this.dispatchEvent('pinned', this.pinnedSource);\n }, 0, false);\n\n this.addEventListener('state', (state) => {\n if(state === GROUP_CALL_STATE.CLOSED) {\n this.cleanup();\n }\n });\n }\n\n get connectionState() {\n return this.connections.main.connection.iceConnectionState;\n }\n\n get state() {\n const {connectionState} = this;\n if(connectionState === 'closed') {\n return GROUP_CALL_STATE.CLOSED;\n } else if(connectionState !== 'connected' && (!IS_SAFARI || connectionState !== 'completed')) {\n return GROUP_CALL_STATE.CONNECTING;\n } else {\n const {participant} = this;\n if(!participant.pFlags.can_self_unmute) {\n return GROUP_CALL_STATE.MUTED_BY_ADMIN;\n } else if(participant.pFlags.muted) {\n return GROUP_CALL_STATE.MUTED;\n } else {\n return GROUP_CALL_STATE.UNMUTED;\n }\n }\n }\n\n get participants() {\n return this.managers.appGroupCallsManager.getCachedParticipants(this.id);\n }\n\n get isSharingScreen() {\n return !!this.connections.presentation;\n }\n\n get pinnedSource() {\n return this.pinnedSources[this.pinnedSources.length - 1];\n }\n\n public get isMuted() {\n return this.state !== GROUP_CALL_STATE.UNMUTED;\n }\n\n public get isClosing() {\n const {state} = this;\n return state === GROUP_CALL_STATE.CLOSED;\n }\n\n public get streamManager(): StreamManager {\n return this.connections.main.streamManager;\n }\n\n public get description(): localConferenceDescription {\n return this.connections.main.description;\n }\n\n public pinSource(source: GroupCallOutputSource) {\n indexOfAndSplice(this.pinnedSources, source);\n this.pinnedSources.push(source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinSource(source: GroupCallOutputSource) {\n this.hadAutoPinnedSources.delete(source);\n indexOfAndSplice(this.pinnedSources, source);\n this.dispatchPinnedThrottled();\n }\n\n public unpinAll() {\n this.pinnedSources.length = 0;\n this.dispatchPinnedThrottled();\n }\n\n public async getParticipantByPeerId(peerId: PeerId) {\n return NULL_PEER_ID === peerId ? this.participant : (await this.participants).get(peerId);\n }\n\n public toggleMuted() {\n return this.requestAudioSource(true).then(() => this.changeUserMuted(NULL_PEER_ID));\n }\n\n public async changeUserMuted(peerId: PeerId, muted?: boolean) {\n const participant = await this.getParticipantByPeerId(peerId);\n if(NULL_PEER_ID === peerId && participant.pFlags.can_self_unmute) {\n muted = muted === undefined ? !participant.pFlags.muted : muted;\n }\n\n return this.editParticipant(participant, {muted});\n }\n\n public getElement(endpoint: GroupCallOutputSource) {\n return super.getElement(endpoint);\n }\n\n public getVideoElementFromParticipantByType(participant: GroupCallParticipant, type: 'video' | 'presentation') {\n let source: GroupCallOutputSource;\n if(participant.pFlags.self) {\n const connectionType: GroupCallConnectionType = type === 'video' ? 'main' : 'presentation';\n source = connectionType;\n } else {\n const codec = participant[type];\n source = codec.source_groups[0].sources[0];\n }\n\n const element = this.getElement(source) as HTMLVideoElement;\n if(!element) return;\n\n const clone = element.cloneNode() as typeof element;\n clone.srcObject = element.srcObject;\n return {video: clone, source};\n }\n\n public createConnectionInstance(options: {\n streamManager: StreamManager,\n type: GroupCallConnectionType,\n options: GroupCallConnectionInstance['options'],\n }) {\n return this.connections[options.type] = new GroupCallConnectionInstance({\n groupCall: this,\n log: this.log.bindPrefix(options.type),\n managers: this.managers,\n ...options\n });\n }\n\n public changeRaiseHand(raise: boolean) {\n return this.editParticipant(this.participant, {raiseHand: raise});\n }\n\n public async startScreenSharingInternal() {\n try {\n const type: GroupCallConnectionType = 'presentation';\n\n const stream = await getScreenStream(getScreenConstraints());\n const streamManager = new StreamManager();\n\n const connectionInstance = this.createConnectionInstance({\n streamManager,\n type,\n options: {\n type\n }\n });\n\n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n stream.getVideoTracks()[0].addEventListener('ended', () => {\n if(this.connections.presentation) { // maybe user has stopped screensharing through browser's ui\n this.stopScreenSharing();\n }\n }, {once: true});\n\n connectionInstance.createDescription();\n connectionInstance.addInputVideoStream(stream);\n } catch(err) {\n this.log.error('start screen sharing error', err);\n }\n }\n\n public startScreenSharing() {\n return this.startScreenSharingPromise ??= this.startScreenSharingInternal().finally(() => {\n this.startScreenSharingPromise = undefined;\n });\n }\n\n public stopScreenSharing() {\n const connectionInstance = this.connections.presentation;\n if(!connectionInstance) {\n return Promise.resolve();\n }\n\n delete this.connections.presentation;\n this.unpinSource('presentation');\n connectionInstance.closeConnectionAndStream(true);\n\n delete this.participant.presentation;\n this.managers.appGroupCallsManager.saveApiParticipant(this.id, this.participant);\n\n return this.managers.appGroupCallsManager.leaveGroupCallPresentation(this.id);\n }\n\n public toggleScreenSharing() {\n if(this.isSharingScreen) {\n return this.stopScreenSharing();\n } else {\n return this.startScreenSharing();\n }\n }\n\n public async startVideoSharingInternal() {\n const constraints: MediaStreamConstraints = {\n video: getVideoConstraints()\n };\n\n try {\n const stream = await getStream(constraints, false);\n const connectionInstance = this.connections.main;\n connectionInstance.addInputVideoStream(stream);\n\n await this.editParticipant(this.participant, {\n videoPaused: false,\n videoStopped: false\n });\n } catch(err) {\n this.log.error('startVideoSharing error', err, constraints);\n }\n }\n\n public startVideoSharing() {\n return this.startVideoSharingPromise ??= this.startVideoSharingInternal().finally(() => {\n this.startVideoSharingPromise = undefined;\n });\n }\n\n public async stopVideoSharing() {\n const connectionInstance = this.connections.main;\n const track = connectionInstance.streamManager.inputStream.getVideoTracks()[0];\n if(!track) {\n return;\n }\n\n stopTrack(track);\n connectionInstance.streamManager.appendToConference(connectionInstance.description); // clear sender track\n\n await this.editParticipant(this.participant, {\n videoStopped: true\n });\n }\n\n public toggleVideoSharing() {\n if(this.isSharingVideo) {\n return this.stopVideoSharing();\n } else {\n return this.startVideoSharing();\n }\n }\n\n public async hangUp(discard = false, rejoin = false, isDiscarded = false) {\n for(const type in this.connections) {\n const connection = this.connections[type as GroupCallConnectionType];\n connection.closeConnectionAndStream(!rejoin);\n }\n\n this.dispatchEvent('state', this.state);\n\n if(isDiscarded) {\n return;\n }\n\n if(!rejoin) {\n const d = discard || (this.joined ? this.connections.main.sources.audio.source : undefined);\n this.managers.appGroupCallsManager.hangUp(this.id, d);\n }\n }\n\n public tryAddTrack(options: Omit) {\n const {description} = this;\n const source = super.tryAddTrack(options);\n\n if(options.type === 'output') {\n const entry = description.getEntryBySource(+source);\n this.getParticipantByPeerId(entry.peerId).then((participant) => {\n if(participant) {\n rootScope.dispatchEvent('group_call_participant', {groupCallId: this.id, participant});\n }\n });\n }\n\n return source;\n }\n\n public async editParticipant(participant: GroupCallParticipant, options: Partial<{\n muted: boolean,\n volume: number,\n raiseHand: boolean,\n videoStopped: boolean,\n videoPaused: boolean,\n presentationPaused: boolean\n }>) {\n if(!Object.keys(options).length) {\n return;\n }\n\n // let processUpdate = true;\n if(participant) {\n // const {currentGroupCall} = this;\n // const isCurrentCall = currentGroupCall?.id === groupCallId;\n const isCurrentCall = true;\n const isUpdatingMeInCurrentCall = isCurrentCall && participant.pFlags.self;\n\n if(isUpdatingMeInCurrentCall) {\n if(options.muted !== undefined && !this.isSharingAudio) {\n delete options.muted;\n\n if(!Object.keys(options).length) {\n return;\n }\n }\n }\n\n // if(isCurrentCall) {\n const muted = options.muted;\n if(muted !== undefined) {\n /* const isAdmin = appChatsManager.hasRights(currentGroupCall.chatId, 'manage_call');\n if(isAdmin) {\n if(muted) {\n participant.pFlags.muted = true;\n delete participant.pFlags.can_self_unmute;\n } else {\n participant.pFlags.can_self_unmute = true;\n }\n } else */if(participant.pFlags.self) {\n if(muted) {\n participant.pFlags.muted = true;\n } else if(participant.pFlags.can_self_unmute) {\n delete participant.pFlags.muted;\n }\n }/* else {\n if(muted) {\n participant.pFlags.muted_by_you = true;\n } else {\n delete participant.pFlags.muted_by_you;\n }\n } */\n }\n // }\n\n /* const a: [keyof GroupCallParticipant['pFlags'], keyof typeof options][] = [\n ['muted', 'muted']\n ];\n\n a.forEach(([key, optionKey]) => {\n const value = options[optionKey];\n if(value === undefined) {\n return;\n }\n\n if(value) {\n participant.pFlags[key] = true;\n } else {\n delete participant.pFlags[key];\n }\n }); */\n\n if(options.raiseHand !== undefined) {\n if(options.raiseHand) participant.raise_hand_rating = '1';\n else delete participant.raise_hand_rating;\n }\n\n if(isUpdatingMeInCurrentCall) {\n if(options.videoStopped !== undefined) {\n if(options.videoStopped) delete participant.video;\n else participant.video = generateSelfVideo(this.connections.main.sources.video);\n }\n\n if(!participant.pFlags.muted && participant.pFlags.can_self_unmute) {\n this.setMuted(false);\n }\n\n this.dispatchEvent('state', this.state);\n }\n\n // rootScope.dispatchEvent('group_call_participant', {groupCallId, participant});\n\n /* if(participant.pFlags.self) {\n processUpdate = false;\n } */\n }\n\n return this.managers.appGroupCallsManager.editParticipant(this.id, participant, options);\n }\n\n public onParticipantUpdate(participant: GroupCallParticipant, doNotDispatchParticipantUpdate?: PeerId) {\n const connectionInstance = this.connections.main;\n const {connection, description} = connectionInstance;\n\n const peerId = getPeerId(participant.peer);\n const hasLeft = !!participant.pFlags.left;\n const oldSsrcs = this.participantsSsrcs.get(peerId) || [];\n\n if(participant.presentation && !hasLeft) {\n const {source} = makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint);\n if(!this.hadAutoPinnedSources.has(source)) {\n this.hadAutoPinnedSources.add(source);\n this.pinSource(participant.pFlags.self ? 'presentation' : source);\n }\n }\n\n if(participant.pFlags.self) {\n this.participant = participant;\n\n if(connectionInstance.sources.audio.source !== participant.source) {\n this.hangUp();\n }\n\n let mute = false;\n if(!participant.pFlags.can_self_unmute) {\n this.stopScreenSharing();\n this.stopVideoSharing();\n mute = true;\n } else if(participant.pFlags.muted) {\n mute = true;\n }\n\n if(mute) {\n this.setMuted(true);\n }\n\n if(doNotDispatchParticipantUpdate !== peerId) {\n this.dispatchEvent('state', this.state);\n }\n\n return;\n }\n\n const ssrcs = hasLeft ? [] : makeSsrcsFromParticipant(participant);\n\n if(!hasLeft) {\n this.participantsSsrcs.set(peerId, ssrcs);\n } else {\n this.participantsSsrcs.delete(peerId);\n }\n\n // const TEST_OLD = false;\n\n const modifiedTypes: Set = new Set();\n oldSsrcs.forEach((oldSsrc) => {\n const oldSource = oldSsrc.source;\n const newSsrc = ssrcs.find((ssrc) => ssrc.source === oldSource);\n if(!newSsrc) {\n this.unpinSource(oldSource);\n\n const oldEntry = description.getEntryBySource(oldSource);\n if(oldEntry && oldEntry.direction !== 'inactive') {\n oldEntry.setDirection('inactive');\n modifiedTypes.add(oldEntry.type);\n }\n }\n });\n\n ssrcs.forEach((ssrc) => {\n let entry = description.getEntryBySource(ssrc.source);\n if(entry) {\n if(entry.direction === 'inactive') {\n entry.setDirection(entry.originalDirection);\n modifiedTypes.add(entry.type);\n }\n\n return;\n }\n\n entry = description.createEntry(ssrc.type);\n description.setEntrySource(entry, ssrc.sourceGroups || ssrc.source);\n description.setEntryPeerId(entry, peerId);\n\n // if(TEST_OLD) {\n // description.bundleMids.push(entry.mid);\n // entry.setDirection('recvonly');\n // } else {\n ssrc.type === 'video' && entry.setEndpoint(ssrc.endpoint);\n entry.createTransceiver(connection, {direction: 'recvonly'});\n // }\n\n modifiedTypes.add(entry.type);\n });\n\n /* if(TEST_OLD) {\n this.setRemoteOffer({\n connection,\n description,\n ssrcs\n });\n } else */if(modifiedTypes.size) {\n if(modifiedTypes.has('video')) {\n connectionInstance.updateConstraints = true;\n }\n\n connectionInstance.negotiateThrottled();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nenum GROUP_CALL_STATE {\n UNMUTED,\n MUTED,\n MUTED_BY_ADMIN,\n CONNECTING,\n CLOSED\n}\n\nexport default GROUP_CALL_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport AudioAssetPlayer from '../../helpers/audioAssetPlayer';\n\nexport type GroupCallAudioAssetName = 'group_call_connect.mp3' | 'group_call_end.mp3' | 'group_call_start.mp3' | 'voip_onallowtalk.mp3';\n\nlet audioAsset: AudioAssetPlayer;\nexport default function getGroupCallAudioAsset() {\n return audioAsset ??= new AudioAssetPlayer([\n 'group_call_connect.mp3',\n 'group_call_end.mp3',\n 'group_call_start.mp3',\n 'voip_onallowtalk.mp3'\n ]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport getGroupCallAudioAsset from '../../components/groupCall/getAudioAsset';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {GroupCallParticipant, GroupCallParticipantVideo, GroupCallParticipantVideoSourceGroup} from '../../layer';\nimport {GroupCallId, GroupCallConnectionType} from '../appManagers/appGroupCallsManager';\nimport {AppManagers} from '../appManagers/managers';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport GroupCallInstance from './groupCallInstance';\nimport GROUP_CALL_STATE from './groupCallState';\nimport createMainStreamManager from './helpers/createMainStreamManager';\nimport {generateSsrc} from './localConferenceDescription';\nimport {WebRTCLineType} from './sdpBuilder';\nimport StreamManager from './streamManager';\nimport {Ssrc} from './types';\n\nconst IS_MUTED = true;\n\nexport function makeSsrcsFromParticipant(participant: GroupCallParticipant) {\n return [\n makeSsrcFromParticipant(participant, 'audio', participant.source),\n participant.video?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.video.audio_source),\n participant.video && makeSsrcFromParticipant(participant, 'video', participant.video.source_groups, participant.video.endpoint),\n participant.presentation?.audio_source && makeSsrcFromParticipant(participant, 'audio', participant.presentation.audio_source),\n participant.presentation && makeSsrcFromParticipant(participant, 'video', participant.presentation.source_groups, participant.presentation.endpoint)\n ].filter(Boolean);\n};\n\nexport function makeSsrcFromParticipant(participant: GroupCallParticipant, type: WebRTCLineType, source?: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n return generateSsrc(type, source, endpoint);\n}\n\nexport function generateSelfVideo(source: Ssrc, audioSource?: number): GroupCallParticipantVideo {\n return source && {\n _: 'groupCallParticipantVideo',\n pFlags: {},\n endpoint: '',\n source_groups: source.sourceGroups,\n audio_source: audioSource\n };\n}\n\nexport class GroupCallsController extends EventListenerBase<{\n instance: (instance: GroupCallInstance) => void\n}> {\n private audioAsset: ReturnType;\n private log: ReturnType;\n private currentGroupCall: GroupCallInstance;\n private managers: AppManagers;\n\n public construct(managers: AppManagers) {\n this.managers = managers;\n this.audioAsset = getGroupCallAudioAsset();\n this.log = logger('GCC');\n\n rootScope.addEventListener('group_call_update', (groupCall) => {\n const {currentGroupCall} = this;\n if(currentGroupCall?.id === groupCall.id) {\n currentGroupCall.groupCall = groupCall;\n\n if(groupCall._ === 'groupCallDiscarded') {\n currentGroupCall.hangUp(false, false, true);\n }\n }\n });\n\n rootScope.addEventListener('group_call_participant', ({groupCallId, participant}) => {\n const {currentGroupCall} = this;\n if(currentGroupCall?.id === groupCallId) {\n currentGroupCall.onParticipantUpdate(participant/* , this.doNotDispatchParticipantUpdate */);\n }\n });\n }\n\n get groupCall() {\n return this.currentGroupCall;\n }\n\n public setCurrentGroupCall(groupCall: GroupCallInstance) {\n this.currentGroupCall = groupCall;\n\n if(groupCall) {\n this.dispatchEvent('instance', groupCall);\n }\n }\n\n public startConnectingSound() {\n this.stopConnectingSound();\n this.audioAsset.playSoundWithTimeout('group_call_connect.mp3', true, 2500);\n }\n\n public stopConnectingSound() {\n this.audioAsset.stopSound();\n this.audioAsset.cancelDelayedPlay();\n }\n\n public async joinGroupCall(chatId: ChatId, groupCallId: GroupCallId, muted = IS_MUTED, rejoin?: boolean, joinVideo?: boolean) {\n this.audioAsset.createAudio();\n\n this.log(`joinGroupCall chatId=${chatId} id=${groupCallId} muted=${muted} rejoin=${rejoin}`);\n\n let streamManager: StreamManager;\n if(rejoin) {\n streamManager = this.currentGroupCall.connections.main.streamManager;\n } else {\n streamManager = await createMainStreamManager(muted, joinVideo);\n }\n\n return this.joinGroupCallInternal(chatId, groupCallId, streamManager, muted, rejoin, joinVideo)\n .then(() => {\n // have to refresh participants because of the new connection\n const {currentGroupCall} = this;\n currentGroupCall.participants.then((participants) => {\n if(this.currentGroupCall !== currentGroupCall || currentGroupCall.state === GROUP_CALL_STATE.CLOSED) {\n return;\n }\n\n participants.forEach((participant) => {\n if(!participant.pFlags.self) {\n currentGroupCall.onParticipantUpdate(participant);\n }\n });\n });\n });\n }\n\n private async joinGroupCallInternal(chatId: ChatId, groupCallId: GroupCallId, streamManager: StreamManager, muted: boolean, rejoin = false, joinVideo?: boolean) {\n const log = this.log.bindPrefix('joinGroupCallInternal');\n log('start', groupCallId);\n\n const type: GroupCallConnectionType = 'main';\n\n let {currentGroupCall} = this;\n if(currentGroupCall && rejoin) {\n // currentGroupCall.connections.main.connection = connection;\n currentGroupCall.handleUpdateGroupCallParticipants = false;\n currentGroupCall.updatingSdp = false;\n log('update currentGroupCall', groupCallId, currentGroupCall);\n } else {\n currentGroupCall = new GroupCallInstance({\n chatId,\n id: groupCallId,\n managers: this.managers\n });\n\n currentGroupCall.fixSafariAudio();\n\n currentGroupCall.addEventListener('state', (state) => {\n if(this.currentGroupCall === currentGroupCall && state === GROUP_CALL_STATE.CLOSED) {\n this.setCurrentGroupCall(null);\n this.stopConnectingSound();\n this.audioAsset.playSound('group_call_end.mp3');\n rootScope.dispatchEvent('chat_update', currentGroupCall.chatId);\n }\n });\n\n currentGroupCall.groupCall = await this.managers.appGroupCallsManager.getGroupCallFull(groupCallId);\n\n const connectionInstance = currentGroupCall.createConnectionInstance({\n streamManager,\n type,\n options: {\n type,\n isMuted: muted,\n joinVideo,\n rejoin\n }\n });\n\n const connection = connectionInstance.createPeerConnection();\n connection.addEventListener('negotiationneeded', () => {\n connectionInstance.negotiate();\n });\n\n connection.addEventListener('track', (event) => {\n log('ontrack', event);\n currentGroupCall.onTrack(event);\n });\n\n connection.addEventListener('iceconnectionstatechange', () => {\n currentGroupCall.dispatchEvent('state', currentGroupCall.state);\n\n const {iceConnectionState} = connection;\n if(iceConnectionState === 'disconnected' || iceConnectionState === 'checking' || iceConnectionState === 'new') {\n this.startConnectingSound();\n } else {\n this.stopConnectingSound();\n }\n\n switch(iceConnectionState) {\n case 'checking': {\n break;\n }\n\n case 'closed': {\n currentGroupCall.hangUp();\n break;\n }\n\n case 'completed': {\n break;\n }\n\n case 'connected': {\n if(!currentGroupCall.joined) {\n currentGroupCall.joined = true;\n this.audioAsset.playSound('group_call_start.mp3');\n this.managers.appGroupCallsManager.getGroupCallParticipants(groupCallId);\n }\n\n break;\n }\n\n case 'disconnected': {\n break;\n }\n\n case 'failed': {\n // TODO: replace with ICE restart\n currentGroupCall.hangUp();\n // connection.restartIce();\n break;\n }\n\n case 'new': {\n break;\n }\n }\n });\n\n connectionInstance.createDescription();\n connectionInstance.createDataChannel();\n\n connectionInstance.appendStreamToConference();\n\n this.setCurrentGroupCall(currentGroupCall);\n log('set currentGroupCall', groupCallId, currentGroupCall);\n\n this.startConnectingSound();\n\n return connectionInstance.negotiate();\n }\n }\n}\n\nconst groupCallsController = new GroupCallsController();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.groupCallController = groupCallsController);\nexport default groupCallsController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS} from '../constants';\nimport StreamManager from '../streamManager';\nimport getAudioConstraints from './getAudioConstraints';\nimport getStream from './getStream';\nimport getVideoConstraints from './getVideoConstraints';\n\nexport default async function createMainStreamManager(muted?: boolean, joinVideo?: boolean) {\n const constraints: MediaStreamConstraints = {\n audio: getAudioConstraints(),\n video: joinVideo && getVideoConstraints()\n };\n\n const streamManager = new StreamManager(GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS);\n\n try {\n const stream = await getStream(constraints, muted);\n streamManager.addStream(stream, 'input');\n } catch(err) {\n console.error('joinGroupCall getStream error', err, constraints);\n streamManager.inputStream = new MediaStream();\n }\n\n return streamManager;\n}\n","import constraintSupported, {MyMediaTrackSupportedConstraints} from '../../../environment/constraintSupport';\n\nexport default function getAudioConstraints(): MediaTrackConstraints {\n const constraints: MediaTrackConstraints = {\n channelCount: 2\n };\n\n const desirable: (keyof MyMediaTrackSupportedConstraints)[] = [\n 'noiseSuppression',\n 'echoCancellation',\n 'autoGainControl'\n ];\n\n desirable.forEach((constraint) => {\n if(constraintSupported(constraint)) {\n // @ts-ignore\n constraints[constraint] = true;\n }\n });\n\n return constraints;\n}\n","export type MyMediaTrackSupportedConstraints = MediaTrackSupportedConstraints & {\n noiseSuppression?: boolean,\n autoGainControl?: boolean\n};\n\nexport default function constraintSupported(constraint: keyof MyMediaTrackSupportedConstraints) {\n return (!!navigator?.mediaDevices?.getSupportedConstraints() as any as MyMediaTrackSupportedConstraints)[constraint];\n}\n","export default function getScreenConstraints(skipAudio?: boolean) {\n const constraints: DisplayMediaStreamOptions = {\n video: {\n // @ts-ignore\n // cursor: 'always',\n width: {max: 1920},\n height: {max: 1080},\n frameRate: {max: 30}\n }\n };\n\n if(!skipAudio) {\n constraints.audio = true;\n }\n\n return constraints;\n}\n","export default async function getScreenStream(constraints: DisplayMediaStreamOptions) {\n const screenStream = await navigator.mediaDevices.getDisplayMedia(constraints);\n const track = screenStream.getVideoTracks()[0];\n track.contentHint = 'text';\n return screenStream;\n}\n","export default async function getStream(constraints: MediaStreamConstraints, muted: boolean) {\n // console.log('getStream', constraints);\n\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\n stream.getTracks().forEach((x) => {\n x.enabled = !muted;\n });\n\n // console.log('getStream result', stream);\n return stream;\n}\n\n(window as any).getStream = getStream;\n","export default function getVideoConstraints(): MediaTrackConstraints {\n return {\n width: {min: 1280, max: 1920/* , ideal: 1920 */},\n height: {min: 720, max: 1080/* , ideal: 1080 */},\n frameRate: {min: 24, max: 30}\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from '../sdp';\nimport SDPMediaSection from '../sdp/mediaSection';\nimport {toTelegramSource} from '../utils';\nimport {parseSourceGroups} from './parseSourceGroups';\n\nexport default function parseMediaSectionInfo(sdp: SDP, channel: SDPMediaSection) {\n const clientInfo = channel.lookupAttributeKeys({\n 'ice-ufrag': true,\n 'ice-pwd': true,\n 'fingerprint': true,\n 'setup': true,\n 'ssrc': true,\n 'mid': true,\n 'ssrc-group': false\n });\n\n if(!clientInfo.fingerprint) { // support Firefox\n const line = sdp.session.lines.find((line) => line.parsed?.key === 'fingerprint');\n clientInfo.fingerprint = line.parsed.value;\n }\n\n const telegramSourceGroups = parseSourceGroups(clientInfo['ssrc-group']);\n const [hash, fingerprint] = clientInfo.fingerprint.split(' ', 2);\n const ssrc = clientInfo.ssrc && toTelegramSource(+clientInfo.ssrc.split(' ', 1)[0]);\n // ssrc = telegramSourceGroups ? telegramSourceGroups[0].sources[0] : ssrc;\n\n return {\n raw: clientInfo,\n ufrag: clientInfo['ice-ufrag'],\n pwd: clientInfo['ice-pwd'],\n fingerprint: {\n fingerprint,\n setup: clientInfo.setup,\n hash\n },\n source: ssrc,\n sourceGroups: telegramSourceGroups,\n mid: clientInfo.mid\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {GroupCallParticipantVideoSourceGroup} from '../../../layer';\nimport {toTelegramSource} from '../utils';\n\nexport function parseSourceGroups(sdpLines: string[]) {\n const telegramSourceGroups = sdpLines.map((str) => {\n const [semantics, ...rest] = str.split(' ');\n\n const sourceGroup: GroupCallParticipantVideoSourceGroup = {\n _: 'groupCallParticipantVideoSourceGroup',\n semantics,\n // sources: rest.map((ssrc) => +ssrc)\n sources: rest.map((ssrc) => toTelegramSource(+ssrc))\n };\n\n return sourceGroup;\n });\n\n /* const simIndex = telegramSourceGroups.findIndex((g) => g.semantics === 'SIM');\n if(simIndex !== -1) {\n const sourceGroup = telegramSourceGroups.splice(simIndex, 1)[0];\n telegramSourceGroups.unshift(sourceGroup);\n } */\n\n return telegramSourceGroups.length ? telegramSourceGroups : undefined;\n}\n","import simulateEvent from '../../../helpers/dom/dispatchEvent';\n\nexport default function stopTrack(track: MediaStreamTrack) {\n track.stop();\n simulateEvent(track, 'ended');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {GroupCallParticipantVideoSourceGroup} from '../../layer';\nimport {fixMediaLineType, SDPBuilder, WebRTCLineType, WEBRTC_MEDIA_PORT} from './sdpBuilder';\nimport {AudioCodec, GroupCallConnectionTransport, Ssrc, UpdateGroupCallConnectionData, VideoCodec} from './types';\n\nexport class ConferenceEntry {\n public source: number;\n public sourceGroups: GroupCallParticipantVideoSourceGroup[];\n public transceiver: RTCRtpTransceiver;\n public originalDirection: RTCRtpTransceiverDirection;\n public direction: RTCRtpTransceiverDirection;\n public port: string;\n public endpoint: string;\n public peerId: PeerId;\n\n public sendEntry: ConferenceEntry;\n public recvEntry: ConferenceEntry;\n\n constructor(public mid: string, public type: WebRTCLineType) {\n this.port = WEBRTC_MEDIA_PORT;\n }\n\n public setDirection(direction: RTCRtpTransceiverDirection) {\n if(!this.originalDirection) {\n this.originalDirection = direction;\n }\n\n return this.direction = direction;\n }\n\n public setPort(port: string) {\n return this.port = port;\n }\n\n public setEndpoint(endpoint: string) {\n return this.endpoint = endpoint;\n }\n\n public setPeerId(peerId: PeerId) {\n return this.peerId = peerId;\n }\n\n public createTransceiver(connection: RTCPeerConnection, init?: RTCRtpTransceiverInit) {\n if(init?.direction) {\n this.setDirection(init.direction);\n }\n\n return this.transceiver = connection.addTransceiver(fixMediaLineType(this.type), init);\n }\n\n public setSource(source: number | GroupCallParticipantVideoSourceGroup[]) {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n\n this.sourceGroups = sourceGroups;\n return this.source = source;\n }\n\n public shouldBeSkipped(isAnswer?: boolean) {\n return isAnswer && this.direction === 'inactive';\n }\n}\n\nexport function generateSsrc(type: WebRTCLineType, source: number | GroupCallParticipantVideoSourceGroup[], endpoint?: string): Ssrc {\n let sourceGroups: GroupCallParticipantVideoSourceGroup[];\n if(Array.isArray(source)) {\n if(!source[0]) return;\n sourceGroups = source;\n source = sourceGroups[0].sources[0];\n }\n\n return {\n endpoint,\n type,\n source,\n sourceGroups\n };\n}\n\nexport default class LocalConferenceDescription implements UpdateGroupCallConnectionData {\n public readonly sessionId: string;\n // public ssrcs: Ssrc[];\n public readonly transport: GroupCallConnectionTransport;\n public readonly audio?: AudioCodec;\n public readonly video: VideoCodec;\n public readonly screencast?: VideoCodec;\n\n private maxSeenId: number;\n public readonly entries: ConferenceEntry[];\n private entriesByMid: Map;\n private entriesBySource: Map;\n private entriesByPeerId: Map>;\n\n constructor(public connection: RTCPeerConnection) {\n this.sessionId = '' + Date.now();\n // this.ssrcs = [];\n this.maxSeenId = -1;\n this.entries = [];\n this.entriesByMid = new Map();\n this.entriesBySource = new Map();\n this.entriesByPeerId = new Map();\n }\n\n public setData(data: UpdateGroupCallConnectionData) {\n return safeAssign(this, data);\n }\n\n public createEntry(type: WebRTCLineType) {\n const mid = '' + ++this.maxSeenId;\n const entry = new ConferenceEntry(mid, type);\n this.entries.push(entry);\n this.entriesByMid.set(mid, entry);\n return entry;\n }\n\n public deleteEntry(entry: ConferenceEntry) {\n indexOfAndSplice(this.entries, entry);\n this.entriesByMid.delete(entry.mid);\n this.entriesBySource.delete(entry.source);\n\n const set = this.entriesByPeerId.get(entry.peerId);\n if(set) {\n set.delete(entry);\n if(!set.size) {\n this.entriesByPeerId.delete(entry.peerId);\n }\n }\n }\n\n public setEntrySource(entry: ConferenceEntry, source: Parameters[0]) {\n entry.setSource(source);\n this.entriesBySource.set(entry.source, entry);\n }\n\n public setEntryPeerId(entry: ConferenceEntry, peerId: ConferenceEntry['peerId']) {\n entry.setPeerId(peerId);\n let set = this.entriesByPeerId.get(peerId);\n if(!set) {\n this.entriesByPeerId.set(peerId, set = new Set());\n }\n\n set.add(entry);\n }\n\n public findEntry(verify: Parameters[0]) {\n return this.entries.find(verify);\n }\n\n public findFreeSendRecvEntry(type: WebRTCLineType, isSending: boolean) {\n let entry = this.entries.find((entry) => {\n return entry.direction === 'sendrecv' && entry.type === type && !(isSending ? entry.sendEntry : entry.recvEntry);\n });\n\n if(!entry) {\n entry = this.createEntry(type);\n entry.setDirection('sendrecv');\n }\n\n return entry;\n }\n\n public getEntryByMid(mid: ConferenceEntry['mid']) {\n return this.entriesByMid.get(mid);\n }\n\n public getEntryBySource(source: ConferenceEntry['source']) {\n return this.entriesBySource.get(source);\n }\n\n public getEntriesByPeerId(peerId: ConferenceEntry['peerId']) {\n return this.entriesByPeerId.get(peerId);\n }\n\n public generateSdp(options: Omit[0], 'conference'>) {\n return SDPBuilder.fromConference({\n conference: this,\n ...options\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPMediaSection from './mediaSection';\nimport SDPSessionSection from './sessionSection';\n\nexport type AttributeKey = 'group' | 'rtcp' | 'ice-ufrag' |\n 'ice-pwd' | 'ice-options' | 'fingerprint' | 'setup' |\n 'mid' | 'extmap' | 'sendonly' | 'msid' | 'rtcp-mux' |\n 'rtpmap' | 'rtcp-fb' | 'fmtp' | 'ssrc' | 'ssrc-group' |\n 'extmap-allow-mixed' | 'msid-semantic';\n\nexport type AttributeMap = {[k in AttributeKey]?: boolean};\n\nexport default class SDP {\n #session: SDPSessionSection;\n #media: SDPMediaSection[];\n\n constructor(session: SDP['session'], mediaSections: SDP['media']) {\n this.#session = session;\n this.#media = mediaSections;\n }\n\n public get session() {\n return this.#session;\n }\n\n public get media() {\n return this.#media;\n }\n\n public get bundle() {\n const bundleLine = this.session.lines.find((line) => line.parsed?.key === 'group');\n return bundleLine.value.split(' ').slice(1);\n }\n\n toString() {\n return this.session.lines\n .concat(...this.media.map((section) => section.lines))\n .map((line) => line.toString()).join('\\r\\n') + '\\r\\n';\n }\n\n /* get buggedMedia() {\n const bundle = this.bundle;\n type A = {\n mid: SDPMediaSection['mid'],\n mediaType: SDPMediaSection['mediaType'],\n direction: SDPMediaSection['direction']\n };\n const out: A[] = [];\n for(let i = 0, length = this.media.length; i < length; ++i) {\n const section = this.media[i];\n const mid = section.mid;\n if(!bundle.includes(mid)) {\n out.push(section);\n }\n }\n\n return out;\n } */\n\n /* get mediaTypes() {\n return this.media.map((section) => {\n return {mid: section.oa.get('mid').oa, type: section.mediaType, direction: section.direction};\n });\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function splitStringByLimitWithRest(str: string, separator: string, limit: number) {\n const splitted = str.split(separator);\n const out: string[] = [];\n\n while(limit > 0 && splitted.length) {\n out.push(splitted.shift());\n --limit;\n }\n\n if(splitted.length) {\n out.push(splitted.join(separator));\n }\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class UniqueNumberGenerator {\n #set: Set;\n #min: number;\n #max: number;\n\n constructor(min: number, max: number) {\n this.#set = new Set();\n this.#min = min;\n this.#max = max;\n }\n\n public generate() {\n const min = this.#min;\n const max = this.#max;\n const set = this.#set;\n\n const maxTries = max - min + 1;\n let value = Math.floor(min + maxTries * Math.random()), _try = 0;\n while(set.has(value)) {\n if(value < max) {\n ++value;\n } else {\n value = min;\n }\n\n if(++_try >= maxTries) {\n return null;\n }\n }\n\n set.add(value);\n return value;\n }\n\n public add(value: number) {\n this.#set.add(value);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AttributeKey} from '.';\n\nexport default class SDPAttributeSplitted {\n #key: AttributeKey;\n #value: string;\n\n // key = 'ssrc-group', value = 'SIM 1 2 3'\n constructor(key: AttributeKey, value: string) {\n this.#key = key;\n this.#value = value;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default class SDPMediaLineParts {\n #type: 'audio' | 'video' | 'application';\n #port: string;\n #protocol: string;\n #ids: string[];\n\n constructor(\n type: SDPMediaLineParts['type'],\n port: SDPMediaLineParts['port'],\n protocol: SDPMediaLineParts['protocol'],\n ids: SDPMediaLineParts['ids']\n ) {\n this.#type = type;\n this.#port = port;\n this.#protocol = protocol;\n this.#ids = ids;\n }\n\n public get type() {\n return this.#type;\n }\n\n public get port() {\n return this.#port;\n }\n\n public get protocol() {\n return this.#protocol;\n }\n\n public get ids() {\n return this.#ids;\n }\n\n toString() {\n return this.type + ' ' + this.port + ' ' + this.protocol + ' ' + this.ids.join(' ');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport splitStringByLimitWithRest from '../../../helpers/string/splitStringByLimitWithRest';\nimport SDPAttributeSplitted from './attributeSplitted';\nimport SDPMediaLineParts from './mediaLineParts';\n\nexport default class SDPLine {\n #key: 'm' | 'a' | 'o' | 'v' | 's' | 't' | 'c';\n #value: string;\n #mediaLineParts: SDPMediaLineParts;\n #parsed?: SDPAttributeSplitted;\n\n // key = 'a', value = 'ssrc-group:SIM 1 2 3'\n constructor(key: SDPLine['key'], value: string | SDPMediaLineParts | SDPAttributeSplitted) {\n this.#key = key;\n\n if(typeof(value) === 'string') {\n this.#value = value;\n\n if(key === 'm') {\n const splitted = value.split(' ');\n this.#mediaLineParts = new SDPMediaLineParts(splitted[0] as any, splitted[1], splitted[2], splitted.slice(3));\n } else {\n if(key === 'a') {\n const result = splitStringByLimitWithRest(value, ':', 1);\n value = result[0];\n this.#parsed = result.length === 1 ? new SDPAttributeSplitted(value as any, null) : new SDPAttributeSplitted(value as any, result[1]);\n }\n }\n } else {\n if(value instanceof SDPMediaLineParts) {\n this.#mediaLineParts = value;\n this.#value = value.toString();\n } else if(value instanceof SDPAttributeSplitted) {\n this.#parsed = value;\n this.#value = value.value ? `${value.key}:${value.value}` : value.key;\n }\n }\n }\n\n public get key() {\n return this.#key;\n }\n\n public get value() {\n return this.#value;\n }\n\n public get parsed() {\n return this.#parsed;\n }\n\n public get mediaLineParts() {\n return this.#mediaLineParts;\n }\n\n toString() {\n return `${this.key}=${this.value}`;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport splitStringByLimitWithRest from '../../../helpers/string/splitStringByLimitWithRest';\n\nexport default class SDPAttributeInner {\n #key: string;\n #lines: Array;\n #prefix: string;\n #nestedMap: Map;\n #missed: boolean;\n #keys: Array;\n\n constructor(key: SDPAttributeInner['key'], lines: SDPAttributeInner['lines'], prefix: string = ':', missed = false) {\n this.#key = key;\n this.#lines = lines;\n this.#prefix = prefix;\n this.#missed = missed;\n this.#nestedMap = missed ? new Map() : null;\n this.#keys = missed ? [] : null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get value() {\n return this.#missed || !this.lines.length ? null : this.lines[0];\n }\n\n public get exists() {\n return !this.#missed;\n }\n\n public get key() {\n return this.#key;\n }\n\n public get keys() {\n SDPAttributeInner.fill(this);\n return this.#keys;\n }\n\n public forEach(callback: Parameters['forEach']>[0]) {\n SDPAttributeInner.fill(this);\n this.#nestedMap.forEach(callback);\n }\n\n public get(key: string) {\n SDPAttributeInner.fill(this);\n return this.#nestedMap.get(key) || new SDPAttributeInner(key, [], ':', true);\n }\n\n private static fill(attribute: SDPAttributeInner) {\n if(attribute.#nestedMap !== null) {\n return;\n }\n\n const map: Map> = new Map();\n attribute.lines.forEach((str) => {\n const [key, rest] = splitStringByLimitWithRest(str, attribute.#prefix, 1);\n const values = map.get(key) || [];\n map.set(key, [...values, rest || '']);\n });\n\n const nestedMap = attribute.#nestedMap = SDPAttributeInner.makeAttributes(map);\n attribute.#keys = Array.from(nestedMap.keys());\n }\n\n private static makeAttributes(innerParts: Map>) {\n const out: Map = new Map();\n\n innerParts.forEach((lines, key) => {\n out.set(key, new SDPAttributeInner(key, lines));\n });\n\n return out;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPAttributeInner from './attributeInner';\nimport SDPLine from './line';\n\nexport default class SDPAttributes {\n #lines: SDPLine[];\n #attributes: Map;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#attributes = new Map();\n SDPAttributes.fillAttributes(this);\n }\n\n public get(key: string) {\n return this.#attributes.get(key) || new SDPAttributeInner(key, [], ' ', true);\n }\n\n private static fillAttributes(attributes: SDPAttributes) {\n const attributesMap: Map> = new Map();\n attributes.#lines.forEach((line) => {\n if(line.key === 'a') {\n const {key, value} = line.parsed;\n\n let linesArray = attributesMap.get(key);\n if(!linesArray) {\n linesArray = [];\n attributesMap.set(key, linesArray);\n }\n\n linesArray.push(value || '');\n }\n });\n\n attributesMap.forEach((linesArray, key) => {\n attributes.#attributes.set(key, new SDPAttributeInner(key, linesArray, ' ', false));\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AttributeMap} from '.';\nimport {NoExtraProperties} from '../../../types';\nimport SDPAttributes from './attributes';\nimport SDPLine from './line';\n\nexport type SDPMediaDirection = 'sendonly' | 'recvonly' | 'inactive' | 'sendrecv';\nexport default class SDPMediaSection {\n #lines: Array;\n #mediaLine: SDPLine;\n #attributes: SDPAttributes;\n #direction: SDPMediaDirection;\n\n constructor(lines: Array) {\n this.#lines = lines;\n this.#mediaLine = lines[0];\n this.#attributes = this.#direction = null;\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get mediaLine() {\n return this.#mediaLine;\n }\n\n public get mediaLineParts() {\n return this.#mediaLine.mediaLineParts;\n }\n\n public get mediaType() {\n return this.mediaLineParts.type;\n }\n\n public get direction() {\n if(!this.#direction) {\n const attributes = this.attributes;\n\n let direction: SDPMediaDirection;\n if(attributes.get('sendonly').exists) direction = 'sendonly';\n else if(attributes.get('recvonly').exists) direction = 'recvonly';\n else if(attributes.get('inactive').exists) direction = 'inactive';\n else direction = 'sendrecv';\n\n this.#direction = direction;\n }\n\n return this.#direction;\n }\n\n public get isSending() {\n return this.direction === 'sendrecv' || this.direction === 'sendonly';\n }\n\n public get isReceiving() {\n return this.direction === 'sendrecv' || this.direction === 'recvonly';\n }\n\n public get attributes() {\n this.#attributes || (this.#attributes = new SDPAttributes(this.lines));\n return this.#attributes;\n }\n\n public get mid() {\n return this.attributes.get('mid').value;\n }\n\n public lookupAttributeKeys(keys: NoExtraProperties): {[k in keyof T]: T[k] extends true ? string : string[]} {\n const out: any = {};\n\n for(const key in keys) {\n const result = this.attributes.get(key);\n // @ts-ignore\n const resultShouldBeArray = !keys[key];\n if(!result) {\n out[key] = resultShouldBeArray ? [] : undefined;\n } else {\n out[key] = resultShouldBeArray ? result.lines : result.value;\n }\n }\n\n return out;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDPLine from './line';\n\nexport default class SDPSessionSection {\n #lines: SDPLine[];\n #sessionId: string;\n\n constructor(lines: SDPLine[]) {\n this.#lines = lines;\n this.#sessionId = lines.filter((line) => line.key === 'o').map((line) => line.value.split(' ')[1])[0];\n }\n\n public get lines() {\n return this.#lines;\n }\n\n public get sessionId() {\n return this.#sessionId;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport SDP from '.';\nimport splitStringByLimitWithRest from '../../../helpers/string/splitStringByLimitWithRest';\nimport UniqueNumberGenerator from '../../../helpers/uniqueNumberGenerator';\nimport SDPLine from './line';\nimport SDPMediaSection from './mediaSection';\nimport SDPSessionSection from './sessionSection';\n\nexport function parseSdp(str: string) {\n function createSection() {\n if(sessionSection) {\n mediaSections.push(new SDPMediaSection(lines));\n } else {\n sessionSection = new SDPSessionSection(lines);\n }\n }\n\n let sessionSection: SDPSessionSection = null, lines: SDPLine[] = [];\n const mediaSections: SDPMediaSection[] = [];\n str.split(/\\r?\\n/).forEach((lineStr) => {\n if(!isIncorrectSdpLine(lineStr)) {\n const line = parseSdpLine(lineStr);\n if(line.key === 'm') {\n createSection();\n lines = [];\n }\n\n lines.push(line);\n }\n });\n\n createSection();\n return new SDP(sessionSection, mediaSections);\n}\n\nexport function isIncorrectSdpLine(str: string) {\n return /^[\\s\\xa0]*$/.test(str);\n}\n\nexport function parseSdpLine(str: string) {\n const splitted = splitStringByLimitWithRest(str, '=', 1);\n return new SDPLine(splitted[0] as any, splitted[1]);\n}\n\nexport function addSimulcast(sdp: SDP) {\n let generator: UniqueNumberGenerator;\n sdp.media.forEach((section, idx) => {\n if(section.mediaType === 'video' && section.isSending && !section.attributes.get('ssrc-group').get('SIM').exists) {\n if(!generator) {\n generator = new UniqueNumberGenerator(2, 4294967295);\n }\n\n const originalSsrcs = section.attributes.get('ssrc-group').get('FID').value.split(' ');\n const lines = section.lines;\n originalSsrcs.forEach((ssrc) => generator.add(+ssrc)); // fix possible duplicates\n const ssrcs = [originalSsrcs[0], generator.generate(), generator.generate()];\n const ssrcs2 = [originalSsrcs[1], generator.generate(), generator.generate()];\n\n lines.push(parseSdpLine('a=ssrc-group:SIM ' + ssrcs.join(' ')));\n\n const ssrcsStrLines = section.attributes.get('ssrc').get(originalSsrcs[0]).lines;\n\n ssrcs.forEach((ssrc, idx) => {\n const ssrc2 = ssrcs2[idx];\n if(idx > 0) {\n lines.push(parseSdpLine('a=ssrc-group:FID ' + ssrc + ' ' + ssrc2));\n\n ssrcsStrLines.forEach((v) => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc + ' ' + v));\n });\n\n ssrcsStrLines.forEach((v) => {\n lines.push(parseSdpLine('a=ssrc:' + ssrc2 + ' ' + v));\n });\n }\n });\n\n sdp.media[idx] = new SDPMediaSection(lines);\n }\n });\n\n return !!generator;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport LocalConferenceDescription, {ConferenceEntry} from './localConferenceDescription';\nimport StringFromLineBuilder from './stringFromLineBuilder';\nimport {GroupCallConnectionTransport, PayloadType, UpdateGroupCallConnectionData} from './types';\nimport {fromTelegramSource} from './utils';\n\n// screencast is for Peer-to-Peer only\nexport type WebRTCLineTypeTrue = 'video' | 'audio' | 'application';\nexport type WebRTCLineType = WebRTCLineTypeTrue | 'screencast';\n\nexport const WEBRTC_MEDIA_PORT = '9';\n\nexport function fixMediaLineType(mediaType: WebRTCLineType) {\n return mediaType === 'screencast' ? 'video' : mediaType;\n}\n\nexport function performCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n const arr: string[] = [];\n arr.push('a=candidate:');\n arr.push(`${c.foundation} ${c.component} ${c.protocol.toUpperCase()} ${c.priority} ${c.ip} ${c.port} typ ${c.type}`);\n if(c['rel-addr'] !== undefined) {\n arr.push(` raddr ${c['rel-addr']} rport ${c['rel-port']}`);\n }\n arr.push(` generation ${c.generation}`);\n return arr.join('');\n}\n\nexport function getConnectionTypeForMediaType(mediaType: WebRTCLineType) {\n // return mediaType === 'application' ? 'DTLS/SCTP' : 'RTP/SAVPF';\n return mediaType === 'application' ? 'DTLS/SCTP' : 'UDP/TLS/RTP/SAVPF';\n}\n\nexport function generateMediaFirstLine(mediaType: WebRTCLineType, port = WEBRTC_MEDIA_PORT, payloadIds: (string | number)[]) {\n const connectionType = getConnectionTypeForMediaType(mediaType);\n return `m=${fixMediaLineType(mediaType)} ${port} ${connectionType} ${payloadIds.join(' ')}`;\n}\n\ntype ConferenceData = UpdateGroupCallConnectionData | LocalConferenceDescription;\n\n// https://tools.ietf.org/id/draft-ietf-rtcweb-sdp-08.html\n// https://datatracker.ietf.org/doc/html/draft-roach-mmusic-unified-plan-00\nexport class SDPBuilder extends StringFromLineBuilder {\n public addCandidate(c: GroupCallConnectionTransport['candidates'][0]) {\n return this.add(performCandidate(c));\n }\n\n /* public addDataChannel(mid: string, transport: GroupCallConnectionTransport, isAnswer?: boolean) {\n this.add(\n 'm=application 9 UDP/DTLS/SCTP webrtc-datachannel',\n 'c=IN IP4 0.0.0.0',\n 'a=ice-options:trickle',\n `a=mid:${mid}`\n );\n\n // if(!isAnswer) {\n this.add('a=sendrecv');\n // }\n\n this.addTransport(transport, isAnswer);\n\n return this.add(\n 'a=sctp-port:5000',\n 'a=max-message-size:262144'\n );\n } */\n\n public addHeader(sId: string, bundleMids: string[]) {\n const bundle = bundleMids.join(' ');\n return this.add(\n 'v=0', // version\n `o=- ${sId} 2 IN IP4 0.0.0.0`, // sessionId, 2=sessionVersion\n 's=-', // name of the session\n 't=0 0', // time when session is valid\n 'a=extmap-allow-mixed',\n `a=group:BUNDLE ${bundle}`,\n 'a=ice-options:trickle',\n // 'a=ice-lite', // ice-lite: is a minimal version of the ICE specification, intended for servers running on a public IP address.\n 'a=msid-semantic:WMS *'\n );\n }\n\n public addTransport(transport: GroupCallConnectionTransport, skipCandidates?: boolean) {\n this.add(\n `a=ice-ufrag:${transport.ufrag}`,\n `a=ice-pwd:${transport.pwd}`,\n 'a=ice-options:trickle' // ! test\n );\n\n for(const fingerprint of transport.fingerprints) {\n this.add(\n `a=fingerprint:${fingerprint.hash} ${fingerprint.fingerprint}`,\n `a=setup:${fingerprint.setup}`\n );\n }\n\n if(!skipCandidates && transport.candidates) {\n for(const candidate of transport.candidates) {\n this.addCandidate(candidate);\n }\n }\n\n return this;\n }\n\n public addSsrc(entry: ConferenceEntry) {\n let streamName = 'stream';\n let {type, sourceGroups} = entry;\n\n // let source = ssrc.source ?? ssrc.sourceGroups[0].sources[0];\n // source = fromTelegramSource(source);\n const source = fromTelegramSource(entry.source);\n\n streamName += source;\n type += source as any;\n\n // streamName += mid;\n // type += mid as any;\n\n // streamName = type = entry.transceiver.receiver.track.id as any;\n\n const addMsid = () => {\n this.add(`a=msid:${streamName} ${type}`);\n };\n\n const addSource = (ssrc: number) => {\n this.add(\n `a=ssrc:${ssrc} cname:${streamName}`,\n `a=ssrc:${ssrc} msid:${streamName} ${type}`,\n `a=ssrc:${ssrc} mslabel:${streamName}`,\n `a=ssrc:${ssrc} label:${type}`\n );\n };\n\n addMsid();\n if(sourceGroups?.length) {\n sourceGroups.forEach((ssrcGroup) => {\n if(ssrcGroup.sources.length) {\n const sources = ssrcGroup.sources.map(fromTelegramSource);\n this.add(`a=ssrc-group:${ssrcGroup.semantics} ${sources.join(' ')}`);\n sources.forEach(addSource);\n }\n });\n } else {\n addSource(source);\n }\n\n return this;\n }\n\n public addSsrcEntry(entry: ConferenceEntry, data: ConferenceData, isAnswer?: boolean) {\n const add = (...x: string[]) => this.add(...x);\n\n const {type, mid, direction, port} = entry;\n const transport = data.transport;\n\n /* if(type === 'application') {\n return this.addDataChannel(mid, transport, isAnswer);\n } */\n\n const isApplication = type === 'application';\n const codec = isApplication ? undefined : data[type];\n\n const isInactive = direction === 'inactive';\n if(entry.shouldBeSkipped(isAnswer)) {\n return add(\n `m=${fixMediaLineType(type)} 0 ${getConnectionTypeForMediaType(type)} 0`,\n `c=IN IP4 0.0.0.0`,\n `a=inactive`,\n `a=mid:${mid}`\n );\n }\n\n const payloadTypes = !isApplication ? codec['payload-types'] : [{id: 5000} as PayloadType];\n const ids = payloadTypes.map((type) => type.id);\n add(\n generateMediaFirstLine(type, port, ids),\n 'c=IN IP4 0.0.0.0',\n `a=rtcp:${port} IN IP4 0.0.0.0`\n );\n\n if(transport['rtcp-mux']) {\n add('a=rtcp-mux');\n }\n\n add(`a=mid:${mid}`);\n /* if(type === 'video') {\n add('b=AS:2500');\n } */\n\n let setDirection = direction;\n if(direction !== 'sendrecv' && isAnswer && !(isInactive || isApplication)) {\n setDirection = direction === 'sendonly' ? 'recvonly' : 'sendonly';\n }\n\n // a=bundle-only\n add(`a=${setDirection}`);\n\n // this.addTransport(transport, isAnswer);\n this.addTransport(transport);\n\n if(!isApplication) {\n const hdrexts = codec['rtp-hdrexts'];\n if(hdrexts?.length) {\n hdrexts.forEach((hdrext) => {\n add(`a=extmap:${hdrext.id} ${hdrext.uri}`);\n });\n }\n\n payloadTypes.forEach((type) => {\n add(`a=rtpmap:${type.id} ${type.name}/${type.clockrate}${type.channels && type.channels > 1 ? `/${type.channels}` : ''}`);\n\n const parameters = type.parameters;\n if(Array.isArray(parameters)) {\n if(parameters.length) {\n console.error('parameters is array???', parameters);\n }\n } else if(parameters && Object.keys(parameters).length) {\n const p: string[] = [];\n for(const i in parameters) {\n p.push(`${i}=${parameters[i]}`);\n }\n add(`a=fmtp:${type.id} ${p.join(';')}`);\n }\n\n const fbs = type['rtcp-fbs'];\n if(fbs?.length) {\n fbs.forEach((fb) => {\n add(`a=rtcp-fb:${type.id} ${fb.type}${fb.subtype ? ' ' + fb.subtype : ''}`);\n });\n }\n });\n } else {\n add(`a=sctpmap:${payloadTypes[0].id} webrtc-datachannel 256`);\n }\n\n if(entry.source && (setDirection === 'sendonly' || setDirection === 'sendrecv')) {\n this.addSsrc(entry);\n }\n\n return this;\n }\n\n public addConference(options: {\n conference: LocalConferenceDescription,\n bundle: string[],\n entries: ConferenceEntry[],\n isAnswer?: boolean,\n }) {\n const {conference, entries, bundle, isAnswer} = options;\n this.addHeader(conference.sessionId, bundle);\n\n if(IS_FIREFOX) {\n this.addTransport(conference.transport); // support Firefox\n }\n\n for(const entry of entries) {\n // this.addSsrcEntry(entry, conference, isAnswer);\n this.addSsrcEntry((isAnswer ? entry.recvEntry || entry.sendEntry : entry.sendEntry || entry.recvEntry) || entry, conference, isAnswer);\n }\n\n return this;\n }\n\n public static fromConference(options: Parameters[0]) {\n return new SDPBuilder().addConference(options).finalize();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport {GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX} from './constants';\nimport stopTrack from './helpers/stopTrack';\nimport LocalConferenceDescription from './localConferenceDescription';\nimport {fixMediaLineType, WebRTCLineType} from './sdpBuilder';\nimport {getAmplitude, toTelegramSource} from './utils';\n\nexport type StreamItemBase = {\n type: 'input' | 'output',\n track: MediaStreamTrack,\n source: string,\n stream: MediaStream\n};\n\nexport type StreamItem = StreamAudioItem | StreamVideoItem;\n\nexport type StreamAudioItem = StreamItemBase & {kind: 'audio', streamAnalyser: AudioStreamAnalyser};\nexport type StreamVideoItem = StreamItemBase & {kind: 'video'};\n\nexport type StreamAmplitude = {\n type: 'input' | 'output';\n source: string;\n stream: MediaStream;\n track: MediaStreamTrack;\n value: number;\n};\n\nclass AudioStreamAnalyser {\n public analyser: AnalyserNode;\n public gain: GainNode;\n public streamSource: MediaStreamAudioSourceNode;\n\n constructor(context: AudioContext, stream: MediaStream) {\n const streamSource = this.streamSource = context.createMediaStreamSource(stream);\n const analyser = this.analyser = context.createAnalyser();\n const gain = this.gain = context.createGain();\n // const streamDestination = context.createMediaStreamDestination();\n\n analyser.minDecibels = -100;\n analyser.maxDecibels = -30;\n analyser.smoothingTimeConstant = 0.05;\n analyser.fftSize = 1024;\n\n // connect Web Audio API\n streamSource.connect(analyser);\n // analyser.connect(context.destination);\n }\n}\n\nexport default class StreamManager {\n public static ANALYSER_LISTENER = new EventListenerBase<{amplitude: (details: {amplitudes: StreamAmplitude[], type: 'all' | 'input'}) => void}>();\n private context: AudioContext;\n public outputStream: MediaStream;\n public inputStream: MediaStream;\n\n private timer: number;\n private counter: number;\n\n private items: StreamItem[];\n\n private log: ReturnType;\n\n public direction: RTCRtpTransceiver['direction'];\n public canCreateConferenceEntry: boolean;\n public locked: boolean;\n public types: WebRTCLineType[];\n\n constructor(private interval?: number) {\n this.context = new (window.AudioContext || (window as any).webkitAudioContext)();\n this.items = [];\n this.outputStream = new MediaStream();\n this.inputStream = new MediaStream();\n this.counter = 0;\n this.log = logger('SM');\n this.direction = 'sendonly';\n this.canCreateConferenceEntry = true;\n // this.lol = true;\n this.types = ['audio', 'video'];\n }\n\n public addStream(stream: MediaStream, type: StreamItem['type']) {\n stream.getTracks().forEach((track) => {\n this.addTrack(stream, track, type);\n });\n }\n\n public addTrack(stream: MediaStream, track: MediaStreamTrack, type: StreamItem['type']) {\n this.log('addTrack', type, track, stream);\n\n const {context, items, inputStream, outputStream} = this;\n const kind: StreamItem['kind'] = track.kind as any;\n const source = StreamManager.getSource(stream, type);\n\n // this.removeTrack(track);\n switch(type) {\n case 'input': {\n if(!inputStream) {\n this.inputStream = stream;\n } else {\n inputStream.addTrack(track);\n }\n\n break;\n }\n\n case 'output': {\n for(let i = 0; i < items.length; ++i) {\n const {track: t, type, source: itemSource} = items[i];\n if(itemSource === source && type === 'input') {\n items.splice(i, 1);\n outputStream.removeTrack(t);\n break;\n }\n }\n\n if(kind !== 'video') {\n outputStream.addTrack(track);\n }\n\n break;\n }\n }\n\n this.finalizeAddingTrack({\n type,\n source,\n stream,\n track,\n kind,\n streamAnalyser: kind === 'audio' ? new AudioStreamAnalyser(context, stream) : undefined\n });\n\n if(kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n\n private finalizeAddingTrack(item: StreamItem) {\n const {track} = item;\n track.addEventListener('ended', () => {\n this.removeTrack(track);\n }, {once: true});\n\n this.items.push(item);\n }\n\n public hasInputTrackKind(kind: StreamItem['kind']) {\n return this.items.find((item) => item.type === 'input' && item.kind === kind);\n }\n\n public static getSource(stream: MediaStream, type: StreamItem['type']) {\n return type === 'input' ? (stream.source || stream.id) : '' + toTelegramSource(+stream.id.substring(6));\n }\n\n public removeTrack(track: MediaStreamTrack) {\n this.log('removeTrack', track);\n\n const {items} = this;\n\n let handled = false;\n for(let i = 0, length = items.length; !handled && i < length; ++i) {\n const {track: t, type} = items[i];\n switch(type) {\n case 'output': {\n if(t === track) {\n items.splice(i, 1);\n this.outputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n\n case 'input': {\n if(t === track) {\n items.splice(i, 1);\n this.inputStream.removeTrack(track);\n handled = true;\n }\n\n break;\n }\n }\n }\n\n if(track.kind === 'audio' && this.interval) {\n this.changeTimer();\n }\n }\n\n public replaceInputAudio(stream: MediaStream, oldTrack: MediaStreamTrack) {\n this.removeTrack(oldTrack);\n this.addStream(stream, 'input');\n }\n\n private changeTimer() {\n if(this.timer !== undefined) {\n clearInterval(this.timer);\n }\n\n if(this.items.length) {\n this.timer = window.setInterval(this.analyse, this.interval);\n }\n }\n\n public getAmplitude = (item: StreamAudioItem): StreamAmplitude => {\n const {streamAnalyser, stream, track, source, type} = item;\n const analyser = streamAnalyser.analyser;\n if(!analyser) return;\n\n const array = new Uint8Array(analyser.frequencyBinCount);\n analyser.getByteFrequencyData(array);\n const value = getAmplitude(array);\n\n return {\n type,\n source,\n stream,\n track,\n value\n };\n };\n\n public analyse = () => {\n const all = this.counter % 3 === 0;\n const filteredItems = all ? this.items : this.items.filter((x) => x.type === 'input');\n const audioItems = filteredItems.filter((x) => x.kind === 'audio') as StreamAudioItem[];\n const amplitudes = audioItems.slice(0, GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX).map(this.getAmplitude);\n if(++this.counter >= 1000) {\n this.counter = 0;\n }\n\n StreamManager.ANALYSER_LISTENER.dispatchEvent('amplitude', {\n amplitudes,\n type: all ? 'all' : 'input'\n });\n };\n\n /* public appendToConnection(connection: RTCPeerConnection) {\n if(this.inputStream) {\n this.inputStream.getTracks().forEach((track) => {\n connection.log('addTrack', track);\n connection.addTrack(track, this.inputStream);\n\n if(track.kind === 'video') {\n track.enabled = true;\n }\n });\n }\n } */\n\n public appendToConference(conference: LocalConferenceDescription) {\n if(this.locked) {\n return;\n }\n\n const {inputStream, direction, canCreateConferenceEntry} = this;\n const transceiverInit: RTCRtpTransceiverInit = {direction, streams: [inputStream]};\n const types = this.types.map((type) => {\n return [\n type,\n /* type === 'video' || type === 'screencast' ?\n {sendEncodings: [{maxBitrate: 2500000}], ...transceiverInit} : */\n transceiverInit\n ] as const;\n });\n\n const tracks = inputStream.getTracks();\n // const transceivers = conference.connection.getTransceivers();\n for(const [type, transceiverInit] of types) {\n let entry = conference.findEntry((entry) => entry.direction === direction && entry.type === type);\n if(!entry) {\n if(!canCreateConferenceEntry) {\n continue;\n }\n\n entry = conference.createEntry(type);\n }\n /* const entry = conference.findFreeSendRecvEntry(type, true);\n if(!entry.transceiver) {\n entry.transceiver = transceivers.find((transceiver) => transceiver.mid === entry.mid);\n } */\n\n let {transceiver} = entry;\n if(!transceiver) {\n transceiver = entry.createTransceiver(conference.connection, transceiverInit);\n\n /* if(this.isScreenSharingManager) {\n transceiver.sender.setParameters({\n ...transceiver.sender.getParameters(),\n degradationPreference: 'maintain-resolution'\n });\n } */\n }\n\n if(entry.direction !== transceiver.direction) {\n transceiver.direction = entry.direction;\n }\n\n const mediaTrackType = fixMediaLineType(type);\n const trackIdx = tracks.findIndex((track) => track.kind === mediaTrackType);\n const track = trackIdx !== -1 ? tracks.splice(trackIdx, 1)[0] : undefined;\n const sender = transceiver.sender;\n if(sender.track === track) {\n continue;\n }\n\n // try { // ! don't use await here. it will wait for adding track and fake one won't be visible in startNegotiation.\n /* await */sender.replaceTrack(track).catch((err) => {\n this.log.error(err);\n });\n // } catch(err) {\n\n // }\n }\n }\n\n public stop() {\n try {\n const tracks = this.inputStream.getTracks().concat(this.outputStream.getTracks());\n tracks.forEach((track) => {\n stopTrack(track);\n });\n } catch(e) {\n this.log.error(e);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nexport default class StringFromLineBuilder {\n private lines: string[];\n private newLine: string[];\n\n constructor(private joiner = '\\r\\n') {\n this.lines = [];\n this.newLine = [];\n }\n\n public add(...strs: string[]) {\n this.lines.push(...strs);\n return this;\n }\n\n public push(word: string) {\n this.newLine.push(word);\n return this;\n }\n\n public addJoined(separator = '') {\n this.add(this.newLine.join(separator));\n this.newLine = [];\n return this;\n }\n\n public join() {\n return this.lines.join(this.joiner);\n }\n\n public finalize() {\n return this.join() + this.joiner;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\n// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n// unsign => sign\nexport function toTelegramSource(source: number) {\n return source << 0;\n}\n\n// NOTE: telegram returns sign source, while webrtc uses unsign source internally\n// sign => unsign\nexport function fromTelegramSource(source: number) {\n return source >>> 0;\n}\n\nexport function getAmplitude(array: Uint8Array, scale = 3) {\n if(!array) return 0;\n\n const {length} = array;\n let total = 0;\n for(let i = 0; i < length; ++i) {\n total += array[i] * array[i];\n }\n const rms = Math.sqrt(total / length) / 255;\n\n return Math.min(1, rms * scale);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport getEmojiEntityFromEmoji from './getEmojiEntityFromEmoji';\nimport emojiRegExp from '../../vendor/emoji/regex';\n\nconst EMOJI_REG_EXP = new RegExp(`(^${emojiRegExp})`);\n\nexport default function getAbbreviation(str: string, onlyFirst = false): {\n text: string,\n entities: MessageEntity[]\n} {\n const splitted = (str || '').trim().split(' ');\n if(!splitted[0]) return {text: '', entities: []};\n\n const entities: MessageEntity.messageEntityEmoji[] = [];\n\n const firstEmojiMatch = splitted[0].match(EMOJI_REG_EXP);\n const first = firstEmojiMatch?.[0] || splitted[0][0];\n if(firstEmojiMatch) {\n entities.push(getEmojiEntityFromEmoji(first));\n }\n\n const length = splitted.length;\n if(onlyFirst || length === 1) return {text: first, entities};\n\n const lastEmojiMatch = splitted[length - 1].match(EMOJI_REG_EXP);\n const last = lastEmojiMatch?.[0] || splitted[length - 1][0];\n if(lastEmojiMatch) {\n entities.push({\n ...getEmojiEntityFromEmoji(last),\n offset: first.length\n });\n }\n\n return {text: first + last, entities};\n}\n","import {MessageEntity} from '../../layer';\nimport {toCodePoints} from '../../vendor/emoji';\n\nexport default function getEmojiEntityFromEmoji(emoji: string): MessageEntity.messageEntityEmoji {\n return {\n _: 'messageEntityEmoji',\n offset: 0,\n length: emoji.length,\n unicode: toCodePoints(emoji).join('-').replace(/-?fe0f/g, '')\n };\n}\n","import {EMAIL_REG_EXP} from '.';\n\nexport default function matchEmail(text: string) {\n return !text ? null : text.match(EMAIL_REG_EXP);\n}\n","export default function setBlankToAnchor(anchor: HTMLAnchorElement) {\n anchor.target = '_blank';\n anchor.rel = 'noopener noreferrer';\n return anchor;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport wrapEmojiText from './wrapEmojiText';\nimport getAbbreviation from './getAbbreviation';\n\nexport default function wrapAbbreviation(str: string, onlyFirst?: boolean) {\n const {text, entities} = getAbbreviation(str, onlyFirst);\n return wrapEmojiText(text, undefined, entities);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport rootScope from '../rootScope';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapDraftText(text: string, options: Partial<{\n wrappingForPeerId: PeerId\n}> & Parameters[1] = {}) {\n if(!text) {\n return wrapRichText('');\n }\n\n let entities = options.entities;\n if(entities && !rootScope.premium && options.wrappingForPeerId !== rootScope.myId) {\n entities = entities.filter((entity) => entity._ !== 'messageEntityCustomEmoji');\n }\n\n const fragment = wrapRichText(text, {\n ...options,\n entities,\n noLinks: true,\n wrappingDraft: true,\n passEntities: {\n messageEntityTextUrl: true,\n messageEntityMentionName: true\n }\n });\n\n return fragment;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MessageEntity} from '../../layer';\nimport parseEntities from './parseEntities';\nimport wrapRichText from './wrapRichText';\n\nexport default function wrapEmojiText(text: string, isDraft = false, entities?: MessageEntity[]) {\n if(!text) return wrapRichText('');\n\n entities ??= parseEntities(text).filter((e) => e._ === 'messageEntityEmoji');\n return wrapRichText(text, {entities, wrappingDraft: isDraft});\n}\n","import IS_EMOJI_SUPPORTED from './emojiSupport';\n\nexport type EMOJI_VERSION = '' | '14';\n\nconst EMOJI_VERSIONS_SUPPORTED: {\n [v in EMOJI_VERSION]: boolean\n} = {} as any;\n\n// Thanks to WebZ for the detect\nfunction isEmojiSupported(emoji: string) {\n const ALLOWABLE_CALCULATION_ERROR_SIZE = 5;\n const inlineEl = document.createElement('span');\n inlineEl.classList.add('emoji');\n document.body.appendChild(inlineEl);\n\n inlineEl.innerText = emoji; // Emoji from 14.0 version\n const newEmojiWidth = inlineEl.offsetWidth;\n inlineEl.innerText = '❤️'; // Emoji from 1.0 version\n const legacyEmojiWidth = inlineEl.offsetWidth;\n\n document.body.removeChild(inlineEl);\n\n return Math.abs(newEmojiWidth - legacyEmojiWidth) < ALLOWABLE_CALCULATION_ERROR_SIZE;\n}\n\nif(IS_EMOJI_SUPPORTED) {\n EMOJI_VERSIONS_SUPPORTED[''] = true;\n\n const a: [keyof typeof EMOJI_VERSIONS_SUPPORTED, string][] = [\n ['14', '🫱🏻']\n ];\n\n a.forEach(([version, emoji]) => {\n EMOJI_VERSIONS_SUPPORTED[version] = isEmojiSupported(emoji);\n });\n}\n\nexport default EMOJI_VERSIONS_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {EMOJI_VERSION} from '../../environment/emojiVersionsSupport';\nimport {SITE_HASHTAGS} from '.';\nimport {EmojiVersions} from '../../config/emoji';\nimport IS_EMOJI_SUPPORTED from '../../environment/emojiSupport';\nimport buildURLHash from '../../helpers/buildURLHash';\nimport copy from '../../helpers/object/copy';\nimport encodeEntities from '../../helpers/string/encodeEntities';\nimport {MessageEntity} from '../../layer';\nimport encodeSpoiler from './encodeSpoiler';\nimport parseEntities from './parseEntities';\nimport setBlankToAnchor from './setBlankToAnchor';\nimport wrapUrl from './wrapUrl';\nimport EMOJI_VERSIONS_SUPPORTED from '../../environment/emojiVersionsSupport';\nimport {CLICK_EVENT_NAME} from '../../helpers/dom/clickEvent';\nimport IS_CUSTOM_EMOJI_SUPPORTED from '../../environment/customEmojiSupport';\nimport rootScope from '../rootScope';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport wrapSticker, {videosCache} from '../../components/wrappers/sticker';\nimport RLottiePlayer, {getLottiePixelRatio} from '../rlottie/rlottiePlayer';\nimport animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport type {MyDocument} from '../appManagers/appDocsManager';\nimport LazyLoadQueue from '../../components/lazyLoadQueue';\nimport {Awaited} from '../../types';\nimport {MediaSize} from '../../helpers/mediaSize';\nimport IS_WEBM_SUPPORTED from '../../environment/webmSupport';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport findUpClassName from '../../helpers/dom/findUpClassName';\nimport getViewportSlice from '../../helpers/dom/getViewportSlice';\nimport {getMiddleware, Middleware, MiddlewareHelper} from '../../helpers/middleware';\nimport replaceContent from '../../helpers/dom/replaceContent';\nimport BOM from '../../helpers/string/bom';\nimport framesCache from '../../helpers/framesCache';\nimport wrapTelegramUrlToAnchor from './wrapTelegramUrlToAnchor';\n\nconst resizeObserver = new ResizeObserver((entries) => {\n for(const entry of entries) {\n const renderer = entry.target.parentElement as CustomEmojiRendererElement;\n renderer.setDimensionsFromRect(entry.contentRect);\n }\n});\n\nconst globalLazyLoadQueue = new LazyLoadQueue();\n\nexport class CustomEmojiElement extends HTMLElement {\n public elements: CustomEmojiElements;\n public renderer: CustomEmojiRendererElement;\n public player: RLottiePlayer | HTMLVideoElement;\n public paused: boolean;\n public syncedPlayer: SyncedPlayer;\n public clean: boolean;\n public lastChildWas: Node;\n // public docId: DocId;\n public placeholder: HTMLImageElement;\n public middlewareHelper: MiddlewareHelper;\n\n constructor() {\n super();\n this.paused = true;\n this.classList.add('custom-emoji');\n }\n\n public get docId() {\n return this.dataset.docId;\n }\n\n public static create(docId: DocId) {\n const element = new CustomEmojiElement();\n // element.docId = docId;\n element.dataset.docId = '' + docId;\n return element;\n }\n\n public get isConnected() {\n return this.placeholder?.isConnected ?? super.isConnected;\n }\n\n public connectedCallback() {\n // if(this.isConnected) {\n // return;\n // }\n\n if(this.player) {\n animationIntersector.addAnimation(this, this.renderer.animationGroup, undefined, true);\n }\n\n // this.connectedCallback = undefined;\n }\n\n public disconnectedCallback() {\n if(this.isConnected || !this.renderer?.isSelectable) { // prepend on sibling can invoke disconnectedCallback\n return;\n }\n\n this.clear();\n }\n\n public destroy() {\n this.clear();\n }\n\n public clear(replaceChildren = true) {\n if(this.clean) {\n return;\n }\n\n // if(this.docId === '5399836826758290421') {\n // console.log('clear', this, this.isConnected);\n // }\n\n this.clean = true;\n this.pause();\n\n const {syncedPlayer} = this;\n if(syncedPlayer) {\n syncedPlayer.pausedElements.delete(this);\n }\n\n this.middlewareHelper?.clean();\n\n if(this.renderer) {\n const elements = this.renderer.customEmojis.get(this.docId);\n if(elements?.delete(this) && !elements.size) {\n this.renderer.customEmojis.delete(this.docId);\n this.renderer.playersSynced.delete(elements);\n }\n\n if(replaceChildren) {\n if(this.renderer.isSelectable) {\n this.replaceChildren(createCustomFiller(true));\n } else {\n // otherwise https://bugs.chromium.org/p/chromium/issues/detail?id=1144736#c27 will happen\n this.replaceChildren();\n }\n }\n }\n\n if(this.player) {\n animationIntersector.removeAnimationByPlayer(this);\n }\n\n if(globalLazyLoadQueue) {\n globalLazyLoadQueue.delete({div: this});\n }\n\n /* this.disconnectedCallback = */this.elements =\n this.renderer =\n this.player =\n this.syncedPlayer =\n undefined;\n }\n\n public pause() {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n\n if(this.player instanceof HTMLVideoElement && !this.syncedPlayer) {\n this.renderer.lastPausedVideo = this.player;\n this.player.pause();\n }\n\n if(this.syncedPlayer && !this.syncedPlayer.pausedElements.has(this)) {\n this.syncedPlayer.pausedElements.add(this);\n\n if(this.syncedPlayer.player && this.syncedPlayer.pausedElements.size === this.syncedPlayer.middlewares.size) {\n this.syncedPlayer.player.pause();\n }\n }\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n\n if(this.player instanceof HTMLVideoElement) {\n this.player.currentTime = this.renderer.lastPausedVideo?.currentTime || this.player.currentTime;\n this.player.play().catch(noop);\n }\n\n if(this.syncedPlayer && this.syncedPlayer.pausedElements.has(this)) {\n this.syncedPlayer.pausedElements.delete(this);\n\n if(this.syncedPlayer.pausedElements.size !== this.syncedPlayer.middlewares.size) {\n this.player.play();\n }\n }\n }\n\n public remove() {\n this.clear();\n // this.elements = this.renderer = this.player = undefined;\n }\n\n public get autoplay() {\n return true;\n }\n}\n\ntype CustomEmojiElements = Set;\n\nexport class CustomEmojiRendererElement extends HTMLElement {\n public canvas: HTMLCanvasElement;\n public context: CanvasRenderingContext2D;\n\n public playersSynced: Map;\n public clearedElements: WeakSet;\n public customEmojis: Parameters[1]['customEmojis'];\n public lastPausedVideo: HTMLVideoElement;\n\n public lastRect: DOMRect;\n public isDimensionsSet: boolean;\n\n public animationGroup: AnimationItemGroup;\n public size: MediaSize;\n\n public isSelectable: boolean;\n public isCanvasClean: boolean;\n\n public ignoreSettingDimensions: boolean;\n\n public forceRenderAfterSize: boolean;\n\n public middlewareHelper: MiddlewareHelper;\n\n public auto: boolean;\n\n constructor() {\n super();\n\n this.classList.add('custom-emoji-renderer');\n this.canvas = document.createElement('canvas');\n this.canvas.classList.add('custom-emoji-canvas');\n this.context = this.canvas.getContext('2d');\n this.append(this.canvas);\n\n this.playersSynced = new Map();\n this.clearedElements = new WeakSet();\n this.customEmojis = new Map();\n\n this.animationGroup = 'EMOJI';\n this.isCanvasClean = false;\n }\n\n public connectedCallback() {\n if(emojiRenderers.has(this)) {\n return;\n }\n\n // this.setDimensions();\n // animationIntersector.addAnimation(this, this.animationGroup);\n resizeObserver.observe(this.canvas);\n emojiRenderers.add(this);\n\n this.connectedCallback = undefined;\n }\n\n public disconnectedCallback() {\n if(this.isConnected || !this.auto) {\n return;\n }\n\n this.destroy?.();\n\n this.disconnectedCallback = undefined;\n }\n\n public destroy() {\n // if(this.isConnected) {\n // return;\n // }\n\n resizeObserver.unobserve(this.canvas);\n\n this.customEmojis.forEach((elements) => {\n elements.forEach((element) => {\n element.clear();\n });\n });\n\n emojiRenderers.delete(this);\n this.playersSynced.clear();\n this.middlewareHelper?.clean();\n this.customEmojis.clear();\n\n this.destroy =\n this.lastPausedVideo =\n undefined;\n }\n\n public getOffsets(offsetsMap: Map = new Map()) {\n if(!this.playersSynced.size) {\n return offsetsMap;\n }\n\n const overflowElement = findUpClassName(this, 'scrollable') || this.offsetParent as HTMLElement;\n if(!overflowElement) {\n return offsetsMap;\n }\n\n const overflowRect = overflowElement.getBoundingClientRect();\n const rect = this.getBoundingClientRect();\n\n for(const elements of this.playersSynced.keys()) {\n const elementsArr = Array.from(elements);\n const placeholders = this.isSelectable ? elementsArr.map((element) => element.placeholder) : elementsArr;\n const {visible} = getViewportSlice({\n overflowElement,\n overflowRect,\n elements: placeholders,\n extraSize: this.size.height * 2.5 // let's add some margin\n });\n\n const offsets = visible.map(({rect: elementRect}) => {\n const top = elementRect.top - rect.top;\n const left = elementRect.left - rect.left;\n return {top, left, width: elementRect.width};\n });\n\n if(offsets.length) {\n offsetsMap.set(elements, offsets);\n }\n }\n\n // const rect = this.getBoundingClientRect();\n // const visibleRect = getVisibleRect(this, overflowElement, undefined, rect);\n // const minTop = visibleRect ? visibleRect.rect.top - this.size.height : 0;\n // const maxTop = Infinity;\n // for(const elements of this.playersSynced.keys()) {\n // const offsets = elements.map((element) => {\n // const elementRect = element.getBoundingClientRect();\n // const top = elementRect.top - rect.top;\n // const left = elementRect.left - rect.left;\n // return top >= minTop && (top + elementRect.height) <= maxTop ? {top, left} : undefined;\n // }).filter(Boolean);\n\n // if(offsets.length) {\n // offsetsMap.set(elements, offsets);\n // }\n // }\n\n return offsetsMap;\n }\n\n public clearCanvas() {\n if(this.isCanvasClean) {\n return;\n }\n\n const {context, canvas} = this;\n context.clearRect(0, 0, canvas.width, canvas.height);\n this.isCanvasClean = true;\n }\n\n public render(offsetsMap: ReturnType) {\n const {context, canvas, isDimensionsSet} = this;\n if(!isDimensionsSet) {\n this.setDimensionsFromRect(undefined, false);\n }\n\n this.isCanvasClean = false;\n\n const {width, height, dpr} = canvas;\n for(const [elements, offsets] of offsetsMap) {\n const player = this.playersSynced.get(elements);\n const frame = syncedPlayersFrames.get(player) || (player instanceof HTMLVideoElement ? player : undefined);\n if(!frame) {\n continue;\n }\n\n const isImageData = frame instanceof ImageData;\n let frameWidth: number, frameHeight: number;\n if(player instanceof HTMLVideoElement) {\n frameWidth = this.size.width * dpr;\n frameHeight = this.size.height * dpr;\n } else {\n frameWidth = frame.width;\n frameHeight = frame.height;\n }\n\n // ! check performance of scaling\n const elementWidth = Math.round(offsets[0].width * dpr);\n if(elementWidth !== frameWidth) {\n // if(this.size.width === 36) {\n // console.warn('different width', elementWidth, frameWidth, this);\n // }\n\n frameWidth = elementWidth;\n frameHeight = elementWidth;\n }\n\n const maxTop = height - frameHeight;\n const maxLeft = width - frameWidth;\n\n if(!this.clearedElements.has(elements) && !this.isSelectable) {\n if(this.isSelectable/* && false */) {\n elements.forEach((element) => {\n element.lastChildWas ??= element.lastChild;\n replaceContent(element, element.firstChild);\n });\n } else {\n elements.forEach((element) => {\n element.replaceChildren();\n });\n }\n\n this.clearedElements.add(elements);\n }\n\n offsets.forEach(({top, left}) => {\n top = Math.round(top * dpr), left = Math.round(left * dpr);\n if(left < 0 ||/* top > maxTop || */left > maxLeft) {\n return;\n }\n\n if(isImageData) {\n context.putImageData(frame, left, top);\n } else {\n // context.clearRect(left, top, width, height);\n context.drawImage(frame, left, top, frameWidth, frameHeight);\n }\n });\n }\n }\n\n public checkForAnyFrame() {\n for(const player of this.playersSynced.values()) {\n if(syncedPlayersFrames.has(player) || player instanceof HTMLVideoElement) {\n return true;\n }\n }\n\n return false;\n }\n\n public remove() {\n super.remove();\n // this.canvas.remove();\n }\n\n // public setDimensions() {\n // const {canvas} = this;\n // sequentialDom.mutateElement(canvas, () => {\n // const rect = canvas.getBoundingClientRect();\n // this.setDimensionsFromRect(rect);\n // });\n // }\n\n public setDimensionsFromRect(rect: DOMRect = this.lastRect, forceRenderAfter = true) {\n const {canvas} = this;\n const {dpr} = canvas;\n\n if(this.lastRect !== rect) {\n this.lastRect = rect;\n }\n\n if(!rect || !dpr || this.ignoreSettingDimensions) {\n return;\n }\n\n const {width, height} = rect;\n // if(this.isSelectable) {\n // height = this.parentElement.scrollHeight || height;\n\n // this.style.width = width + 'px';\n // this.style.height = height + 'px';\n // }\n\n const newWidth = Math.floor(Math.round(width * dpr));\n const newHeight = Math.floor(Math.round(height * dpr));\n if(canvas.width === newWidth && canvas.height === newHeight) {\n return;\n }\n\n canvas.width = newWidth;\n canvas.height = newHeight;\n this.isDimensionsSet = true;\n this.isCanvasClean = true;\n\n if(this.forceRenderAfterSize || (this.isSelectable && forceRenderAfter)) {\n this.forceRenderAfterSize = undefined;\n this.forceRender();\n }\n }\n\n public forceRender() {\n if(!this.isDimensionsSet) {\n return;\n }\n\n if(!renderEmojis(new Set([this]))) {\n this.clearCanvas();\n }\n }\n\n public add(\n addCustomEmojis: Parameters[1]['customEmojis'],\n lazyLoadQueue?: LazyLoadQueue | false,\n onlyThumb?: boolean,\n withThumb?: boolean\n ) {\n const renderer = this;\n\n addCustomEmojis.forEach((addElements, docId) => { // prevent adding old elements\n let elements = this.customEmojis.get(docId);\n if(!elements) this.customEmojis.set(docId, elements = new Set());\n else this.clearedElements.delete(elements);\n\n for(const el of addElements) {\n if(elements.has(el)) {\n addElements.delete(el);\n } else {\n el.clean = false;\n el.renderer = renderer;\n el.elements = elements;\n el.middlewareHelper = this.middlewareHelper.get().create();\n elements.add(el);\n\n if(el.lastChildWas && !el.lastChildWas.parentNode) {\n el.append(el.lastChildWas);\n }\n }\n }\n\n if(!addElements.size) {\n addCustomEmojis.delete(docId);\n }\n });\n\n if(!addCustomEmojis.size) {\n return;\n }\n\n const usingOwnQueue = !!(!lazyLoadQueue && lazyLoadQueue !== false && globalLazyLoadQueue);\n\n const docIds = Array.from(addCustomEmojis.keys());\n\n const managers = rootScope.managers;\n const middleware = this.middlewareHelper.get();\n const size = this.size;\n\n const loadPromise = managers.appEmojiManager.getCachedCustomEmojiDocuments(docIds).then((docs) => {\n if(middleware && !middleware()) return;\n\n const loadPromises: Promise[] = [];\n const wrap = (doc: MyDocument, _loadPromises?: Promise[]) => {\n const docId = doc.id;\n const newElements = addCustomEmojis.get(docId);\n const customEmojis = renderer.customEmojis.get(docId);\n const isLottie = doc.sticker === 2;\n const isStatic = doc.mime_type === 'video/webm' && !IS_WEBM_SUPPORTED;\n const willHaveSyncedPlayer = (isLottie || (doc.sticker === 3 && this.isSelectable)) && !onlyThumb && !isStatic;\n\n const loadPromises: Promise[] = [];\n const newElementsArray = Array.from(newElements);\n const promise = wrapSticker({\n div: newElementsArray,\n doc,\n width: size.width,\n height: size.height,\n loop: true,\n play: CUSTOM_EMOJI_INSTANT_PLAY,\n managers,\n isCustomEmoji: true,\n group: 'none',\n loadPromises,\n middleware,\n exportLoad: usingOwnQueue || lazyLoadQueue === false ? 2 : 1, // 2 - export load always, 1 - do not export load if cached static\n needFadeIn: false,\n loadStickerMiddleware: willHaveSyncedPlayer && middleware ? middleware.create().get(() => {\n // if(syncedPlayers.get(key) !== syncedPlayer) {\n // return false;\n // }\n\n // let good = false;\n // for(const middleware of syncedPlayer.middlewares) {\n // if(middleware()) {\n // good = true;\n // break;\n // }\n // }\n\n // return good;\n return !!syncedPlayer.middlewares.size;\n }) : undefined,\n static: isStatic,\n onlyThumb,\n withThumb: withThumb ?? (renderer.clearedElements.has(customEmojis) ? false : undefined),\n syncedVideo: this.isSelectable\n });\n\n if(_loadPromises) {\n promise.then(() => _loadPromises.push(...loadPromises));\n }\n\n const addition: {\n onRender?: (_p: Awaited['render']>) => Promise,\n elements: typeof newElements\n } = {\n elements: newElements\n };\n\n if(doc.sticker === 1 || onlyThumb || isStatic) {\n if(this.isSelectable) {\n addition.onRender = () => Promise.all(loadPromises).then(() => {\n if(middleware && !middleware()) return;\n newElementsArray.forEach((element) => {\n const {placeholder} = element;\n placeholder.src = (element.firstElementChild as HTMLImageElement).src;\n });\n });\n }\n\n return promise.then((res) => ({...res, ...addition}));\n }\n\n // eslint-disable-next-line prefer-const\n addition.onRender = (_p) => Promise.all(loadPromises).then(() => {\n if((middleware && !middleware()) || !doc.animated) {\n return;\n }\n\n const players = Array.isArray(_p) ? _p as HTMLVideoElement[] : [_p as RLottiePlayer];\n const player = Array.isArray(players) ? players[0] : players;\n assumeType(player);\n newElementsArray.forEach((element, idx) => {\n const player = players[idx] || players[0];\n element.player = player;\n\n if(syncedPlayer) {\n element.syncedPlayer = syncedPlayer;\n if(element.paused) {\n element.syncedPlayer.pausedElements.add(element);\n } else if(player.paused) {\n player.play();\n }\n }\n\n if(element.isConnected) {\n animationIntersector.addAnimation(element, element.renderer.animationGroup, undefined, true);\n }\n });\n\n if(player instanceof RLottiePlayer || (player instanceof HTMLVideoElement && this.isSelectable)) {\n syncedPlayer.player = player;\n renderer.playersSynced.set(customEmojis, player);\n }\n\n if(player instanceof RLottiePlayer) {\n player.group = renderer.animationGroup;\n\n player.overrideRender ??= (frame) => {\n syncedPlayersFrames.set(player, frame);\n // frames.set(containers, frame);\n };\n } else if(player instanceof HTMLVideoElement) {\n // player.play();\n\n // const cache = framesCache.getCache(key);\n // let {width, height} = renderer.size;\n // width *= dpr;\n // height *= dpr;\n\n // const onFrame = (frame: ImageBitmap | HTMLCanvasElement) => {\n // topFrames.set(player, frame);\n // player.requestVideoFrameCallback(callback);\n // };\n\n // let frameNo = -1, lastTime = 0;\n // const callback: VideoFrameRequestCallback = (now, metadata) => {\n // const time = player.currentTime;\n // if(lastTime > time) {\n // frameNo = -1;\n // }\n\n // const _frameNo = ++frameNo;\n // lastTime = time;\n // // const frameNo = Math.floor(player.currentTime * 1000 / CUSTOM_EMOJI_FRAME_INTERVAL);\n // // const frameNo = metadata.presentedFrames;\n // const imageBitmap = cache.framesNew.get(_frameNo);\n\n // if(imageBitmap) {\n // onFrame(imageBitmap);\n // } else if(IS_IMAGE_BITMAP_SUPPORTED) {\n // createImageBitmap(player, {resizeWidth: width, resizeHeight: height}).then((imageBitmap) => {\n // cache.framesNew.set(_frameNo, imageBitmap);\n // if(frameNo === _frameNo) onFrame(imageBitmap);\n // });\n // } else {\n // const canvas = document.createElement('canvas');\n // const context = canvas.getContext('2d');\n // canvas.width = width;\n // canvas.height = height;\n // context.drawImage(player, 0, 0);\n // cache.framesNew.set(_frameNo, canvas);\n // onFrame(canvas);\n // }\n // };\n\n // // player.requestVideoFrameCallback(callback);\n // // setInterval(callback, CUSTOM_EMOJI_FRAME_INTERVAL);\n }\n\n if(willHaveSyncedPlayer) {\n const dpr = getLottiePixelRatio(this.size.width, this.size.height);\n renderer.canvas.dpr = dpr;\n setRenderInterval();\n }\n });\n\n let syncedPlayer: SyncedPlayer;\n const key = [docId, size.width, size.height].join('-');\n if(willHaveSyncedPlayer) {\n syncedPlayer = syncedPlayers.get(key);\n if(!syncedPlayer) {\n syncedPlayer = {\n player: undefined,\n middlewares: new Set(),\n pausedElements: new Set(),\n key\n };\n\n syncedPlayers.set(key, syncedPlayer);\n }\n\n for(const element of newElements) {\n const middleware = element.middlewareHelper.get();\n syncedPlayer.middlewares.add(middleware);\n middleware.onClean(() => {\n syncedPlayer.middlewares.delete(middleware);\n\n if(!syncedPlayer.middlewares.size) {\n if(syncedPlayer.player) {\n const frame = syncedPlayersFrames.get(syncedPlayer.player);\n if(frame) {\n (frame as ImageBitmap).close?.();\n syncedPlayersFrames.delete(syncedPlayer.player);\n }\n\n syncedPlayersFrames.delete(syncedPlayer.player);\n if(syncedPlayer.player instanceof RLottiePlayer) {\n syncedPlayer.player.overrideRender = noop;\n syncedPlayer.player.remove();\n } else if(syncedPlayer.player instanceof HTMLVideoElement) {\n const cacheName = framesCache.generateName('' + element.docId, 0, 0, undefined, undefined);\n delete videosCache[cacheName];\n }\n\n syncedPlayer.player = undefined;\n }\n\n if(syncedPlayers.get(syncedPlayer.key) === syncedPlayer && syncedPlayers.delete(syncedPlayer.key) && !syncedPlayers.size) {\n clearRenderInterval();\n }\n }\n });\n }\n }\n\n return promise.then((res) => ({...res, ...addition}));\n };\n\n const missing: DocId[] = [];\n const cachedPromises = docs.map((doc, idx) => {\n if(!doc) {\n missing.push(docIds[idx]);\n return;\n }\n\n return wrap(doc, loadPromises);\n }).filter(Boolean);\n\n const uncachedPromisesPromise = !missing.length ?\n Promise.resolve([] as typeof cachedPromises) :\n managers.appEmojiManager.getCustomEmojiDocuments(missing).then((docs) => {\n if(middleware && !middleware()) return [];\n return docs.filter(Boolean).map((doc) => wrap(doc));\n });\n\n const loadFromPromises = (promises: typeof cachedPromises) => {\n return Promise.all(promises).then((arr) => {\n const promises = arr.map(({load, onRender, elements}) => {\n if(!load) {\n return;\n }\n\n const l = () => load().then(onRender);\n\n if(usingOwnQueue) {\n elements.forEach((element) => {\n globalLazyLoadQueue.push({\n div: element,\n load: () => {\n elements.forEach((element) => {\n globalLazyLoadQueue.delete({div: element});\n });\n\n return l();\n }\n });\n });\n } else {\n return l();\n }\n });\n\n return Promise.all(promises);\n });\n };\n\n const load = () => {\n if(middleware && !middleware()) return;\n const cached = loadFromPromises(cachedPromises);\n const uncached = uncachedPromisesPromise.then((promises) => loadFromPromises(promises));\n return Promise.all([cached, uncached]);\n };\n\n if(lazyLoadQueue) {\n lazyLoadQueue.push({\n div: renderer.canvas,\n load\n });\n } else {\n load();\n }\n\n return Promise.all(cachedPromises).then(() => Promise.all(loadPromises)).then(() => {});\n });\n\n // recordPromise(loadPromise, 'render emojis: ' + docIds.length);\n\n return loadPromise;\n }\n\n public static create(options: CustomEmojiRendererElementOptions) {\n const renderer = new CustomEmojiRendererElement();\n renderer.animationGroup = options.animationGroup;\n renderer.size = options.customEmojiSize || mediaSizes.active.customEmoji;\n renderer.isSelectable = options.isSelectable;\n if(options.wrappingDraft) {\n renderer.contentEditable = 'false';\n renderer.style.height = 'inherit';\n }\n // const middleware = () => !!renderer.disconnectedCallback && (!options.middleware || options.middleware());\n let middleware = options.middleware;\n if(middleware) {\n renderer.middlewareHelper = middleware.create();\n middleware = renderer.middlewareHelper.get();\n middleware.onDestroy(() => {\n renderer.destroy?.();\n });\n } else {\n // console.error('no middleware', this, options);\n renderer.auto = true;\n renderer.middlewareHelper = getMiddleware();\n }\n\n return renderer;\n }\n}\n\ntype CustomEmojiRenderer = CustomEmojiRendererElement;\ntype SyncedPlayer = {\n player: RLottiePlayer | HTMLVideoElement,\n middlewares: Set,\n pausedElements: Set,\n key: string\n};\ntype CustomEmojiFrame = Parameters[0] | HTMLVideoElement;\n\nconst CUSTOM_EMOJI_INSTANT_PLAY = true; // do not wait for animationIntersector\nlet emojiRenderInterval: number;\nconst emojiRenderers: Set = new Set();\nconst syncedPlayers: Map = new Map();\nconst syncedPlayersFrames: Map = new Map();\nexport const renderEmojis = (renderers = emojiRenderers) => {\n const r = Array.from(renderers);\n const t = r.filter((r) => r.isConnected && r.checkForAnyFrame() && !r.ignoreSettingDimensions);\n if(!t.length) {\n return false;\n }\n\n const o = t.map((renderer) => {\n const paused = [...renderer.playersSynced.values()].reduce((acc, v) => acc + +!!v.paused, 0);\n if(renderer.playersSynced.size === paused) {\n return;\n }\n\n const offsets = renderer.getOffsets();\n if(offsets.size) {\n return [renderer, offsets] as const;\n }\n }).filter(Boolean);\n\n for(const [renderer] of o) {\n renderer.clearCanvas();\n }\n\n for(const [renderer, offsets] of o) {\n renderer.render(offsets);\n }\n\n return true;\n};\nconst CUSTOM_EMOJI_FPS = 60;\nconst CUSTOM_EMOJI_FRAME_INTERVAL = 1000 / CUSTOM_EMOJI_FPS;\nconst setRenderInterval = () => {\n if(emojiRenderInterval) {\n return;\n }\n\n emojiRenderInterval = window.setInterval(renderEmojis, CUSTOM_EMOJI_FRAME_INTERVAL);\n renderEmojis();\n};\nconst clearRenderInterval = () => {\n if(!emojiRenderInterval) {\n return;\n }\n\n clearInterval(emojiRenderInterval);\n emojiRenderInterval = undefined;\n};\n\n(window as any).syncedPlayers = syncedPlayers;\n(window as any).emojiRenderers = emojiRenderers;\n\ncustomElements.define('custom-emoji-element', CustomEmojiElement);\ncustomElements.define('custom-emoji-renderer-element', CustomEmojiRendererElement);\n\ntype CustomEmojiRendererElementOptions = Partial<{\n loadPromises: Promise[],\n customEmojiRenderer: CustomEmojiRendererElement,\n\n isSelectable: boolean,\n wrappingDraft: boolean\n}> & WrapSomethingOptions;\n\n/**\n * * Expecting correctly sorted nested entities (RichTextProcessor.sortEntities)\n */\nexport default function wrapRichText(text: string, options: Partial<{\n entities: MessageEntity[],\n contextSite: string,\n highlightUsername: string,\n noLinks: boolean,\n noLinebreaks: boolean,\n noCommands: boolean,\n wrappingDraft: boolean,\n // mustWrapEmoji: boolean,\n fromBot: boolean,\n noTextFormat: boolean,\n passEntities: Partial<{\n [_ in MessageEntity['_']]: boolean\n }>,\n noEncoding: boolean,\n isSelectable: boolean,\n\n contextHashtag?: string,\n\n // ! recursive, do not provide\n nasty?: {\n i: number,\n usedLength: number,\n text: string,\n lastEntity?: MessageEntity\n },\n voodoo?: boolean,\n customEmojis?: Map,\n customWraps?: Set,\n}> & CustomEmojiRendererElementOptions = {}) {\n const fragment = document.createDocumentFragment();\n if(!text) {\n return fragment;\n }\n\n const nasty = options.nasty ??= {\n i: 0,\n usedLength: 0,\n text\n };\n\n const wrapSomething = (wrapElement: HTMLElement, noFiller?: boolean) => {\n const element = document.createElement('span');\n // element.append(BOM, a, BOM);\n if(options.wrappingDraft) {\n element.contentEditable = 'false';\n }\n // element.style.display = 'inline-block';\n element.classList.add('input-something');\n element.append(/* BOM, */wrapElement);\n\n (lastElement || fragment).append(element);\n\n wrapElement.classList.add('input-selectable');\n // if(wrapElement instanceof HTMLImageElement) {\n // element.prepend(f());\n // } else {\n !noFiller && wrapElement.append(createCustomFiller(true));\n // }\n\n customWraps.add(element);\n\n return element;\n };\n\n options.isSelectable ||= options.wrappingDraft;\n\n const customEmojis = options.customEmojis ??= new Map() as Map;\n const customWraps = options.customWraps ??= new Set();\n\n const entities = options.entities ??= parseEntities(nasty.text);\n\n const passEntities = options.passEntities ??= {};\n const contextSite = options.contextSite ??= 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const textLength = nasty.text.length;\n const length = entities.length;\n let lastElement: HTMLElement | DocumentFragment;\n for(; nasty.i < length; ++nasty.i) {\n let entity = entities[nasty.i];\n\n // * check whether text was sliced\n // TODO: consider about moving it to other function\n if(entity.offset >= textLength) {\n if(entity._ !== 'messageEntityCaret') { // * can set caret to the end\n continue;\n }\n } else if((entity.offset + entity.length) > textLength) {\n entity = copy(entity);\n // entity.length = entity.offset + entity.length - textLength;\n entity.length = textLength - entity.offset;\n }\n\n if(entity.length) {\n nasty.lastEntity = entity;\n }\n\n let nextEntity = entities[nasty.i + 1];\n\n const startOffset = entity.offset;\n const endOffset = startOffset + entity.length;\n const endPartOffset = Math.min(endOffset, nextEntity?.offset ?? 0xFFFF);\n const fullEntityText = nasty.text.slice(startOffset, endOffset);\n const sliced = nasty.text.slice(startOffset, endPartOffset);\n let partText = sliced;\n\n if(nasty.usedLength < startOffset) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength, startOffset));\n }\n\n if(lastElement) {\n lastElement = fragment;\n }\n\n nasty.usedLength = endPartOffset;\n\n let element: HTMLElement,\n property: 'textContent' | 'alt' = 'textContent',\n usedText = false;\n switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontWeight = 'bold';\n element.style.fontFamily = 'markup-bold';\n } else {\n element = document.createElement('strong');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontStyle = 'italic';\n element.style.fontFamily = 'markup-italic';\n } else {\n element = document.createElement('em');\n }\n }\n\n break;\n }\n\n case 'messageEntityStrike': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n // element.style.cssText = `${styleName}: line-through;`;\n element.style.fontFamily = 'markup-strikethrough';\n } else/* if(!options.noTextFormat) */ {\n element = document.createElement('del');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n // element.style.cssText = `${styleName}: underline;`;\n element.style.fontFamily = 'markup-underline';\n } else if(!options.noTextFormat) {\n element = document.createElement('u');\n }\n\n break;\n }\n\n case 'messageEntityPre':\n case 'messageEntityCode': {\n if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n element.style.fontFamily = 'markup-monospace';\n } else if(!options.noTextFormat) {\n element = document.createElement('code');\n }\n\n break;\n }\n\n // case 'messageEntityPre': {\n // if(options.wrappingDraft) {\n // element = document.createElement('span');\n // element.style.fontFamily = 'var(--font-monospace)';\n // } else if(!options.noTextFormat) {\n // element = document.createElement('pre');\n // const inner = document.createElement('code');\n // if(entity.language) {\n // inner.className = 'language-' + entity.language;\n // inner.textContent = entityText;\n // usedText = true;\n // }\n // }\n\n // break;\n // }\n\n case 'messageEntityHighlight': {\n element = document.createElement('i');\n element.className = 'text-highlight';\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n let command = fullEntityText.slice(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.slice(atPos + 1);\n command = command.slice(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('tg://bot_command?command=' + encodeURIComponent(command) + (bot ? '&bot=' + encodeURIComponent(bot) : ''));\n if(!contextExternal) {\n element.setAttribute('onclick', 'execBotCommand(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityCustomEmoji': {\n if(!IS_CUSTOM_EMOJI_SUPPORTED) {\n break;\n }\n\n while(nextEntity?._ === 'messageEntityEmoji' && nextEntity.offset < endOffset) {\n ++nasty.i;\n nasty.lastEntity = nextEntity;\n nasty.usedLength += nextEntity.length;\n nextEntity = entities[nasty.i + 1];\n }\n\n const customEmojiElement = element = CustomEmojiElement.create(entity.document_id);\n const {docId} = customEmojiElement;\n let set = customEmojis.get(docId);\n if(!set) customEmojis.set(docId, set = new Set());\n set.add(customEmojiElement);\n customEmojiElement.dataset.stickerEmoji = fullEntityText;\n\n if(options.wrappingDraft) {\n element = document.createElement('img');\n (element as HTMLImageElement).alt = fullEntityText;\n for(const i in customEmojiElement.dataset) {\n element.dataset[i] = customEmojiElement.dataset[i];\n }\n (element as any).customEmojiElement = customEmojiElement;\n customEmojiElement.placeholder = element as HTMLImageElement;\n element.classList.add('custom-emoji-placeholder');\n (element as HTMLImageElement).src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAAtJREFUGFdjYAACAAAFAAGq1chRAAAAAElFTkSuQmCC';\n property = 'alt';\n break;\n }\n\n if(options.isSelectable) {\n // const s = document.createElement('span');\n // s.append(fullEntityText);\n // element.append(s);\n // element.textContent = fullEntityText;\n // element.textContent = 'a';\n // element.contentEditable = 'false';\n\n // const x = f();\n // x.style.display = 'inline-block';\n // x.contentEditable = 'false';\n // (lastElement || fragment).append(BOM);\n // (lastElement || fragment).append(x);\n\n element = wrapSomething(element, !!options.customEmojiRenderer);\n\n // const a = element;\n // element = document.createElement('span');\n // element.append(BOM, a, BOM);\n // element.contentEditable = 'false';\n }\n\n property = 'alt';\n break;\n }\n\n case 'messageEntityEmoji': {\n let isSupported = IS_EMOJI_SUPPORTED;\n if(isSupported) {\n for(const version in EmojiVersions) {\n if(version) {\n const emojiData = EmojiVersions[version as EMOJI_VERSION];\n if(emojiData.hasOwnProperty(entity.unicode) && !EMOJI_VERSIONS_SUPPORTED[version as EMOJI_VERSION]) {\n isSupported = false;\n break;\n }\n }\n }\n }\n\n // if(!(options.wrappingDraft && isSupported)) { // * fix safari emoji\n if(!isSupported) { // no wrapping needed\n // if(isSupported) { // ! contenteditable=\"false\" нужен для поля ввода, иначе там будет меняться шрифт в Safari, или же рендерить смайлик напрямую, без контейнера\n // insertPart(entity, '', '');\n // } else {\n element = document.createElement('img');\n (element as HTMLImageElement).src = `assets/img/emoji/${entity.unicode}.png`;\n property = 'alt';\n element.className = 'emoji';\n\n // if(options.isSelectable) {\n // usedText = true;\n // (element as HTMLImageElement).alt = partText;\n // element = wrapSomething(element);\n // }\n\n // const a = element;\n // a.contentEditable = 'false';\n // element = document.createElement('span');\n // element.append(a);\n // element.contentEditable = 'false';\n // }\n // } else if(options.mustWrapEmoji) {\n } else if(!options.wrappingDraft) {\n element = document.createElement('span');\n element.className = 'emoji';\n }/* else if(!IS_SAFARI) {\n insertPart(entity, '', '');\n } */\n /* if(!isSupported) {\n insertPart(entity, `\"`,`);\n } */\n\n break;\n }\n\n case 'messageEntityCaret': {\n element = document.createElement('span');\n element.className = 'composer-sel';\n break;\n }\n\n // case 'messageEntityLinebreak': {\n // if(options.noLinebreaks) {\n // insertPart(entity, ' ');\n // } else {\n // insertPart(entity, '
');\n // }\n\n // break;\n // }\n\n case 'messageEntityUrl':\n case 'messageEntityTextUrl': {\n if(!(options.noLinks && !passEntities[entity._])) {\n // let inner: string;\n let url: string = (entity as MessageEntity.messageEntityTextUrl).url || fullEntityText;\n let masked = false;\n let onclick: string;\n\n const wrapped = wrapUrl(url, true);\n url = wrapped.url;\n onclick = wrapped.onclick;\n\n if(entity._ === 'messageEntityTextUrl') {\n if(nextEntity?._ === 'messageEntityUrl' &&\n nextEntity.length === entity.length &&\n nextEntity.offset === entity.offset) {\n nasty.lastEntity = nextEntity;\n ++nasty.i;\n }\n\n if(url !== fullEntityText) {\n masked = true;\n }\n } else {\n // inner = encodeEntities(replaceUrlEncodings(entityText));\n }\n\n const currentContext = !!onclick;\n if(!onclick && masked && !currentContext) {\n onclick = 'showMaskedAlert';\n }\n\n if(options.wrappingDraft) {\n onclick = undefined;\n }\n\n const href = (currentContext || typeof electronHelpers === 'undefined') ?\n url :\n `javascript:electronHelpers.openExternal('${url}');`;\n\n element = document.createElement('a');\n element.className = 'anchor-url';\n (element as HTMLAnchorElement).href = href;\n\n if(!(currentContext || typeof electronHelpers !== 'undefined')) {\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n if(onclick) {\n element.setAttribute('onclick', onclick + '(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityEmail': {\n if(!options.noLinks) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = encodeEntities('mailto:' + fullEntityText);\n setBlankToAnchor(element as HTMLAnchorElement);\n }\n\n break;\n }\n\n case 'messageEntityHashtag': {\n const contextUrl = !options.noLinks && SITE_HASHTAGS[contextSite];\n if(contextUrl) {\n const hashtag = fullEntityText.slice(1);\n element = document.createElement('a');\n element.className = 'anchor-hashtag';\n (element as HTMLAnchorElement).href = contextUrl.replace('{1}', encodeURIComponent(hashtag));\n if(contextExternal) {\n setBlankToAnchor(element as HTMLAnchorElement);\n } else {\n element.setAttribute('onclick', 'searchByHashtag(this)');\n }\n }\n\n break;\n }\n\n case 'messageEntityMentionName': {\n if(!(options.noLinks && !passEntities[entity._])) {\n element = document.createElement('a');\n (element as HTMLAnchorElement).href = buildURLHash('' + entity.user_id);\n element.className = 'follow';\n element.dataset.follow = '' + entity.user_id;\n }\n\n break;\n }\n\n case 'messageEntityMention': {\n // const contextUrl = !options.noLinks && siteMentions[contextSite];\n if(!options.noLinks) {\n const username = fullEntityText.slice(1);\n\n element = wrapTelegramUrlToAnchor('t.me/' + username);\n element.className = 'mention';\n\n // insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntitySpoiler': {\n if(options.noTextFormat) {\n const encoded = encodeSpoiler(nasty.text, entity);\n nasty.text = encoded.text;\n partText = encoded.entityText;\n if(endPartOffset !== endOffset) {\n nasty.usedLength += endOffset - endPartOffset;\n }\n let n: MessageEntity;\n for(; n = entities[nasty.i + 1], n && n.offset < endOffset;) {\n // nasty.usedLength += n.length;\n ++nasty.i;\n nasty.lastEntity = n;\n nextEntity = entities[nasty.i + 1];\n }\n } else if(options.wrappingDraft) {\n element = document.createElement('span');\n // element.style.fontFamily = 'spoiler';\n element.style.fontFamily = 'markup-spoiler';\n } else {\n const container = document.createElement('span');\n container.className = 'spoiler';\n element = document.createElement('span');\n element.className = 'spoiler-text';\n element.textContent = partText;\n usedText = true;\n container.append(element);\n fragment.append(container);\n\n container[`on${CLICK_EVENT_NAME}`] = (window as any).onSpoilerClick;\n }\n\n break;\n }\n }\n\n if(!usedText && partText) {\n if(element) {\n // @ts-ignore\n element[property] = partText;\n } else {\n (element || fragment).append(partText);\n }\n }\n\n if(element && !element.parentNode) {\n (lastElement || fragment).append(element);\n }\n\n while(nextEntity && nextEntity.offset < endOffset) {\n ++nasty.i;\n\n (element || fragment).append(wrapRichText(nasty.text, {\n ...options,\n voodoo: true\n }));\n\n nextEntity = entities[nasty.i + 1];\n }\n\n // if(!element?.parentNode) {\n // (lastElement || fragment).append(element ?? partText);\n // }\n\n if(nasty.usedLength <= endOffset) {\n if(nasty.usedLength < endOffset) {\n (element || fragment).append(nasty.text.slice(nasty.usedLength, endOffset));\n nasty.usedLength = endOffset;\n }\n\n lastElement = fragment;\n nasty.lastEntity = undefined;\n } else if(entity.length > partText.length && element) {\n lastElement = element;\n } else {\n lastElement = fragment;\n }\n\n if(options.voodoo) {\n return fragment;\n }\n }\n\n if(nasty.lastEntity) {\n nasty.usedLength = nasty.lastEntity.offset + nasty.lastEntity.length;\n }\n\n if(nasty.usedLength < textLength) {\n (lastElement || fragment).append(nasty.text.slice(nasty.usedLength));\n }\n\n if((!options.wrappingDraft || options.customEmojiRenderer) && customEmojis.size) {\n let renderer = options.customEmojiRenderer;\n if(!renderer) {\n renderer = CustomEmojiRendererElement.create(options);\n fragment.prepend(renderer);\n }\n\n const loadPromise = renderer.add(customEmojis, options.lazyLoadQueue, options.wrappingDraft);\n options.loadPromises?.push(loadPromise);\n // recordPromise(loadPromise, 'render emojis: ' + docIds.length);\n }\n\n if(customWraps.size) {\n insertCustomFillers(customWraps);\n }\n\n return fragment;\n}\n\nexport const createCustomFiller = (notFiller?: boolean) => {\n const x = document.createElement('span');\n x.classList.add(notFiller ? 'input-filler2' : 'input-filler');\n x.textContent = BOM;\n return x;\n};\n\nexport function isCustomFillerNeededBySiblingNode(node: ChildNode) {\n if(\n // !node?.textContent ||\n // node.textContent.endsWith('\\n') ||\n node?.textContent !== BOM ||\n (node as HTMLElement)?.getAttribute?.('contenteditable') === 'false'\n ) {\n // if(!node || (node as HTMLElement).firstElementChild || node.textContent.endsWith('\\n')) {\n if(!node || node.textContent !== BOM || (node as HTMLElement).firstElementChild) {\n return 2;\n } else if(node.nodeType === node.ELEMENT_NODE) {\n return 1;\n }/* else if(node.nodeType === node.TEXT_NODE && !node.nodeValue) {\n (node as CharacterData).insertData(0, BOM);\n } */\n }\n\n return 0;\n}\n\nexport function insertCustomFillers(elements: Iterable) {\n const check = (element: HTMLElement, node: ChildNode, method: 'before' | 'after') => {\n const needed = isCustomFillerNeededBySiblingNode(node);\n if(needed === 2) {\n element[method](createCustomFiller());\n } else if(needed === 1) {\n node.appendChild(document.createTextNode(BOM));\n }\n };\n\n for(const element of elements) {\n const {previousSibling, nextSibling} = element;\n check(element, previousSibling, 'before');\n check(element, nextSibling, 'after');\n }\n}\n\n(window as any).wrapRichText = wrapRichText;\n","// just for the future\nexport default function buildURLHash(str: string) {\n return '#' + encodeURIComponent(str);\n}\n","import wrapUrl from './wrapUrl';\n\nexport default function wrapTelegramUrlToAnchor(url1: string) {\n const {url, onclick} = wrapUrl(url1);\n const element = document.createElement('a');\n (element as HTMLAnchorElement).href = url;\n if(onclick) {\n element.setAttribute('onclick', `${onclick}(this)`);\n }\n\n return element;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport EventListenerBase from '../../helpers/eventListenerBase';\n\nexport default class QueryableWorker extends EventListenerBase<{\n ready: () => void,\n frame: (reqId: number, frameNo: number, frame: Uint8ClampedArray | ImageBitmap) => void,\n loaded: (reqId: number, frameCount: number, fps: number) => void,\n error: (reqId: number, error: Error) => void,\n workerError: (error: ErrorEvent) => void\n}> {\n constructor(private worker: Worker) {\n super();\n\n this.worker.onerror = (error) => {\n try {\n this.dispatchEvent('workerError', error);\n this.cleanup();\n this.terminate();\n } catch(err) {\n\n }\n };\n\n this.worker.onmessage = (event) => {\n this.dispatchEvent(event.data.queryMethodListener, ...event.data.queryMethodArguments);\n };\n }\n\n public postMessage(message: any) {\n this.worker.postMessage(message);\n }\n\n public terminate() {\n this.worker.terminate();\n }\n\n public sendQuery(args: any[], transfer?: Transferable[]) {\n this.worker.postMessage({\n queryMethod: args.shift(),\n queryMethodArguments: args\n }, CAN_USE_TRANSFERABLES ? transfer: undefined);\n }\n}\n","const IS_WEB_ASSEMBLY_SUPPORTED = typeof(WebAssembly) !== 'undefined';\n\nexport default IS_WEB_ASSEMBLY_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport animationIntersector, {AnimationItemGroup} from '../../components/animationIntersector';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport pause from '../../helpers/schedulers/pause';\nimport {logger, LogTypes} from '../logger';\nimport RLottiePlayer, {RLottieOptions} from './rlottiePlayer';\nimport QueryableWorker from './queryableWorker';\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport IS_WEB_ASSEMBLY_SUPPORTED from '../../environment/webAssemblySupport';\nimport makeError from '../../helpers/makeError';\nimport App from '../../config/app';\n\nexport type LottieAssetName = 'EmptyFolder' | 'Folders_1' | 'Folders_2' |\n 'TwoFactorSetupMonkeyClose' | 'TwoFactorSetupMonkeyCloseAndPeek' |\n 'TwoFactorSetupMonkeyCloseAndPeekToIdle' | 'TwoFactorSetupMonkeyIdle' |\n 'TwoFactorSetupMonkeyPeek' | 'TwoFactorSetupMonkeyTracking' |\n 'voice_outlined2' | 'voip_filled' | 'voice_mini' | 'jolly_roger';\n\nexport class LottieLoader {\n private loadPromise: Promise = !IS_WEB_ASSEMBLY_SUPPORTED ? Promise.reject() : undefined;\n private loaded = false;\n\n private workersLimit = App.threads;\n private players: {[reqId: number]: RLottiePlayer} = {};\n private playersByCacheName: {[cacheName: string]: Set} = {};\n\n private workers: QueryableWorker[] = [];\n private curWorkerNum = 0;\n\n private log = logger('LOTTIE', LogTypes.Error);\n\n public getAnimation(element: HTMLElement) {\n for(const i in this.players) {\n if(this.players[i].el.includes(element)) {\n return this.players[i];\n }\n }\n\n return null;\n }\n\n public setLoop(loop: boolean) {\n for(const i in this.players) {\n const player = this.players[i];\n player.loop = loop;\n player.autoplay = player._autoplay;\n }\n }\n\n public loadLottieWorkers() {\n if(this.loadPromise) {\n return this.loadPromise;\n }\n\n return this.loadPromise = new Promise((resolve, reject) => {\n let remain = this.workersLimit;\n for(let i = 0; i < this.workersLimit; ++i) {\n const worker = new Worker(new URL('./rlottie.worker.ts', import.meta.url));\n const queryableWorker = this.workers[i] = new QueryableWorker(worker);\n\n queryableWorker.addEventListener('ready', () => {\n this.log('worker #' + i + ' ready');\n\n queryableWorker.addEventListener('frame', this.onFrame);\n queryableWorker.addEventListener('loaded', this.onPlayerLoaded);\n queryableWorker.addEventListener('error', this.onPlayerError);\n\n --remain;\n if(!remain) {\n this.log('workers ready');\n resolve();\n this.loaded = true;\n }\n }, {once: true});\n\n queryableWorker.addEventListener('workerError', (error) => {\n reject('rlottie load error: ' + error.message);\n this.loaded = false;\n }, {once: true});\n }\n });\n }\n\n private makeAssetUrl(name: LottieAssetName) {\n return 'assets/tgs/' + name + '.json';\n }\n\n public loadAnimationAsAsset(params: Omit, name: LottieAssetName) {\n // (params as RLottieOptions).name = name;\n return this.loadAnimationFromURL(params, this.makeAssetUrl(name));\n }\n\n public loadAnimationDataFromURL(url: string): Promise {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return this.loadPromise as any;\n }\n\n this.loadLottieWorkers();\n\n return fetch(url)\n .then((res) => {\n if(!res.headers || res.headers.get('content-type') === 'application/octet-stream') {\n return res.arrayBuffer()\n .then((data) => apiManagerProxy.invokeCrypto('gzipUncompress', data))\n .then((arr) => blobConstruct(arr as Uint8Array, ''));\n } else {\n return res.blob();\n }\n });\n /* .then((str) => {\n return new Promise((resolve) => setTimeout(() => resolve(str), 2e3));\n }) */\n }\n\n public loadAnimationFromURLManually(name: LottieAssetName) {\n const url = this.makeAssetUrl(name);\n return this.loadAnimationDataFromURL(url).then((blob) => {\n return (params: Omit) => this.loadAnimationFromURLNext(blob, params, url);\n });\n }\n\n public loadAnimationFromURL(params: Omit, url: string) {\n return this.loadAnimationDataFromURL(url).then((blob) => {\n return this.loadAnimationFromURLNext(blob, params, url);\n });\n }\n\n public loadAnimationFromURLNext(blob: Blob, params: Omit, url: string) {\n const newParams = Object.assign(params, {animationData: blob, needUpscale: true});\n newParams.name ||= url;\n return this.loadAnimationWorker(newParams);\n }\n\n public waitForFirstFrame(player: RLottiePlayer) {\n return Promise.race([\n /* new Promise((resolve) => {\n player.addEventListener('firstFrame', () => {\n setTimeout(() => resolve(), 1500);\n }, true);\n }) */\n new Promise((resolve) => {\n player.addEventListener('firstFrame', resolve, {once: true});\n }),\n pause(2500)\n ]).then(() => player);\n }\n\n public async loadAnimationWorker(\n params: RLottieOptions,\n group: AnimationItemGroup = params.group || '',\n middleware?: () => boolean\n ): Promise {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return this.loadPromise as any;\n }\n\n if(!this.loaded) {\n await this.loadLottieWorkers();\n }\n\n if(middleware && !middleware()) {\n throw makeError('MIDDLEWARE');\n }\n\n if(params.sync) {\n const cacheName = RLottiePlayer.CACHE.generateName(params.name, params.width, params.height, params.color, params.toneIndex);\n const players = this.playersByCacheName[cacheName];\n if(players?.size) {\n return Promise.resolve(players.entries().next().value[0]);\n }\n }\n\n const containers = Array.isArray(params.container) ? params.container : [params.container];\n if(!params.width || !params.height) {\n params.width = parseInt(containers[0].style.width);\n params.height = parseInt(containers[0].style.height);\n }\n\n if(!params.width || !params.height) {\n throw new Error('No size for sticker!');\n }\n\n params.group = group;\n\n const player = this.initPlayer(containers, params);\n\n animationIntersector.addAnimation(player, group);\n\n return player;\n }\n\n private onPlayerLoaded = (reqId: number, frameCount: number, fps: number) => {\n const player = this.players[reqId];\n if(!player) {\n this.log.warn('onPlayerLoaded on destroyed player:', reqId, frameCount);\n return;\n }\n\n this.log.debug('onPlayerLoaded');\n player.onLoad(frameCount, fps);\n };\n\n private onFrame = (reqId: number, frameNo: number, frame: Uint8ClampedArray | ImageBitmap) => {\n const player = this.players[reqId];\n if(!player) {\n this.log.warn('onFrame on destroyed player:', reqId, frameNo);\n return;\n }\n\n if(player.clamped !== undefined && frame instanceof Uint8ClampedArray) {\n player.clamped = frame;\n }\n\n player.renderFrame(frame, frameNo);\n };\n\n private onPlayerError = (reqId: number, error: Error) => {\n const player = this.players[reqId];\n if(!player) {\n return;\n }\n\n // ! will need refactoring later, this is not the best way to remove the animation\n const animations = animationIntersector.getAnimations(player.el[0]);\n animations.forEach((animation) => {\n animationIntersector.removeAnimation(animation);\n });\n };\n\n public onDestroy(reqId: number) {\n delete this.players[reqId];\n }\n\n public destroyWorkers() {\n if(!IS_WEB_ASSEMBLY_SUPPORTED) {\n return;\n }\n\n this.workers.forEach((worker, idx) => {\n worker.terminate();\n this.log('worker #' + idx + ' terminated');\n });\n\n this.log('workers destroyed');\n this.workers.length = 0;\n this.curWorkerNum = 0;\n this.loaded = false;\n this.loadPromise = undefined;\n }\n\n private initPlayer(el: RLottiePlayer['el'], options: RLottieOptions) {\n const player = new RLottiePlayer({\n el,\n worker: this.workers[this.curWorkerNum++],\n options\n });\n\n const {reqId, cacheName} = player;\n this.players[reqId] = player;\n\n const playersByCacheName = cacheName ? this.playersByCacheName[cacheName] ??= new Set() : undefined;\n if(cacheName) {\n playersByCacheName.add(player);\n }\n\n if(this.curWorkerNum >= this.workers.length) {\n this.curWorkerNum = 0;\n }\n\n player.addEventListener('destroy', () => {\n this.onDestroy(reqId);\n if(playersByCacheName.delete(player) && !playersByCacheName.size) {\n delete this.playersByCacheName[cacheName];\n }\n });\n\n player.loadFromData(options.animationData);\n\n return player;\n }\n}\n\nconst lottieLoader = new LottieLoader();\nMOUNT_CLASS_TO.lottieLoader = lottieLoader;\nexport default lottieLoader;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AnimationItemGroup, AnimationItemWrapper} from '../../components/animationIntersector';\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport IS_APPLE_MX from '../../environment/appleMx';\nimport {IS_ANDROID, IS_APPLE_MOBILE, IS_APPLE, IS_SAFARI} from '../../environment/userAgent';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport mediaSizes from '../../helpers/mediaSizes';\nimport clamp from '../../helpers/number/clamp';\nimport QueryableWorker from './queryableWorker';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\nimport framesCache, {FramesCache, FramesCacheItem} from '../../helpers/framesCache';\n\nexport type RLottieOptions = {\n container: HTMLElement | HTMLElement[],\n canvas?: HTMLCanvasElement,\n autoplay?: boolean,\n animationData: Blob,\n loop?: RLottiePlayer['loop'],\n width?: number,\n height?: number,\n group?: AnimationItemGroup,\n noCache?: boolean,\n needUpscale?: boolean,\n skipRatio?: number,\n initFrame?: number, // index\n color?: RLottieColor,\n inverseColor?: RLottieColor,\n name?: string,\n skipFirstFrameRendering?: boolean,\n toneIndex?: number,\n sync?: boolean\n};\n\nexport type RLottieColor = [number, number, number];\n\nexport function getLottiePixelRatio(width: number, height: number, needUpscale?: boolean) {\n let pixelRatio = clamp(window.devicePixelRatio, 1, 2);\n if(pixelRatio > 1 && !needUpscale) {\n if(width > 90 && height > 90) {\n if(!IS_APPLE && mediaSizes.isMobile) {\n pixelRatio = 1;\n }\n } else if((width > 60 && height > 60) || IS_ANDROID) {\n pixelRatio = Math.max(1.5, pixelRatio - 1.5);\n }\n }\n\n return pixelRatio;\n}\n\nexport default class RLottiePlayer extends EventListenerBase<{\n enterFrame: (frameNo: number) => void,\n ready: () => void,\n firstFrame: () => void,\n cached: () => void,\n destroy: () => void\n}> implements AnimationItemWrapper {\n public static CACHE = framesCache;\n private static reqId = 0;\n\n public reqId = 0;\n public curFrame: number;\n private frameCount: number;\n private fps: number;\n private skipDelta: number;\n public name: string;\n public cacheName: string;\n private toneIndex: number;\n\n private worker: QueryableWorker;\n\n private width = 0;\n private height = 0;\n\n public el: HTMLElement[];\n public canvas: HTMLCanvasElement[];\n private contexts: CanvasRenderingContext2D[];\n\n public paused = true;\n // public paused = false;\n public direction = 1;\n private speed = 1;\n public autoplay = true;\n public _autoplay: boolean; // ! will be used to store original value for settings.stickers.loop\n public loop: number | boolean = true;\n private _loop: RLottiePlayer['loop']; // ! will be used to store original value for settings.stickers.loop\n public group: AnimationItemGroup = '';\n\n private frInterval: number;\n private frThen: number;\n private rafId: number;\n\n // private caching = false;\n // private removed = false;\n\n private cache: FramesCacheItem;\n private imageData: ImageData;\n public clamped: Uint8ClampedArray;\n private cachingDelta = 0;\n\n private initFrame: number;\n private color: RLottieColor;\n private inverseColor: RLottieColor;\n\n public minFrame: number;\n public maxFrame: number;\n\n private playedTimes = 0;\n\n private currentMethod: RLottiePlayer['mainLoopForwards'] | RLottiePlayer['mainLoopBackwards'];\n private frameListener: (currentFrame: number) => void;\n private skipFirstFrameRendering: boolean;\n private playToFrameOnFrameCallback: (frameNo: number) => void;\n\n public overrideRender: (frame: ImageData | HTMLCanvasElement | ImageBitmap) => void;\n private renderedFirstFrame: boolean;\n\n private raw: boolean;\n\n constructor({el, worker, options}: {\n el: RLottiePlayer['el'],\n worker: QueryableWorker,\n options: RLottieOptions\n }) {\n super(true);\n\n this.reqId = ++RLottiePlayer['reqId'];\n this.el = el;\n this.worker = worker;\n\n for(const i in options) {\n if(this.hasOwnProperty(i)) {\n // @ts-ignore\n this[i] = options[i];\n }\n }\n\n this._loop = this.loop;\n this._autoplay = this.autoplay;\n\n // ! :(\n this.initFrame = options.initFrame;\n this.color = options.color;\n this.inverseColor = options.inverseColor;\n this.name = options.name;\n this.skipFirstFrameRendering = options.skipFirstFrameRendering;\n this.toneIndex = options.toneIndex;\n this.raw = this.color !== undefined;\n\n if(this.name) {\n this.cacheName = RLottiePlayer.CACHE.generateName(this.name, this.width, this.height, this.color, this.toneIndex);\n }\n\n // * Skip ratio (30fps)\n let skipRatio: number;\n if(options.skipRatio !== undefined) skipRatio = options.skipRatio;\n else if((IS_ANDROID || IS_APPLE_MOBILE || (IS_APPLE && !IS_SAFARI && !IS_APPLE_MX)) && this.width < 100 && this.height < 100 && !options.needUpscale) {\n skipRatio = 0.5;\n }\n\n this.skipDelta = skipRatio !== undefined ? 1 / skipRatio | 0 : 1;\n\n // options.needUpscale = true;\n\n // * Pixel ratio\n const pixelRatio = getLottiePixelRatio(this.width, this.height, options.needUpscale);\n\n this.width = Math.round(this.width * pixelRatio);\n this.height = Math.round(this.height * pixelRatio);\n\n // options.noCache = true;\n\n // * Cache frames params\n if(!options.noCache/* && false */) {\n // проверка на размер уже после скейлинга, сделано для попапа и сайдбара, где стикеры 80х80 и 68х68, туда нужно 75%\n if(IS_APPLE && this.width > 100 && this.height > 100) {\n this.cachingDelta = 2; // 2 // 50%\n } else if(this.width < 100 && this.height < 100) {\n this.cachingDelta = Infinity; // 100%\n } else {\n this.cachingDelta = 4; // 75%\n }\n }\n\n // this.cachingDelta = Infinity;\n // this.cachingDelta = 0;\n // if(isApple) {\n // this.cachingDelta = 0; //2 // 50%\n // }\n\n if(!this.canvas) {\n this.canvas = this.el.map(() => {\n const canvas = document.createElement('canvas');\n canvas.classList.add('rlottie');\n canvas.width = this.width;\n canvas.height = this.height;\n canvas.dpr = pixelRatio;\n return canvas;\n });\n }\n\n this.contexts = this.canvas.map((canvas) => canvas.getContext('2d'));\n\n if(!IS_IMAGE_BITMAP_SUPPORTED || this.raw) {\n this.imageData = new ImageData(this.width, this.height);\n\n if(CAN_USE_TRANSFERABLES) {\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n }\n\n if(this.name) {\n this.cache = RLottiePlayer.CACHE.getCache(this.cacheName);\n } else {\n this.cache = FramesCache.createCache();\n }\n }\n\n public clearCache() {\n if(this.cachingDelta === Infinity) {\n return;\n }\n\n if(this.cacheName && this.cache.counter > 1) { // skip clearing because same sticker can be still visible\n return;\n }\n\n this.cache.clearCache();\n }\n\n public sendQuery(args: any[], transfer?: Transferable[]) {\n this.worker.sendQuery([args.shift(), this.reqId, ...args], transfer);\n }\n\n public loadFromData(data: RLottieOptions['animationData']) {\n this.sendQuery(['loadFromData', data, this.width, this.height, this.toneIndex, this.color !== undefined/* , this.canvas.transferControlToOffscreen() */]);\n }\n\n public play() {\n if(!this.paused) {\n return;\n }\n\n this.paused = false;\n this.setMainLoop();\n }\n\n public pause(clearPendingRAF = true) {\n if(this.paused) {\n return;\n }\n\n this.paused = true;\n if(clearPendingRAF) {\n clearTimeout(this.rafId);\n this.rafId = undefined;\n }\n // window.cancelAnimationFrame(this.rafId);\n }\n\n private resetCurrentFrame() {\n return this.curFrame = this.initFrame ?? (this.direction === 1 ? this.minFrame : this.maxFrame);\n }\n\n public stop(renderFirstFrame = true) {\n this.pause();\n\n const curFrame = this.resetCurrentFrame();\n if(renderFirstFrame) {\n this.requestFrame(curFrame);\n // this.sendQuery('renderFrame', this.curFrame);\n }\n }\n\n public restart() {\n this.stop(false);\n this.play();\n }\n\n public setSpeed(speed: number) {\n if(this.speed === speed) {\n return;\n }\n\n this.speed = speed;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public setDirection(direction: number) {\n if(this.direction === direction) {\n return;\n }\n\n this.direction = direction;\n\n if(!this.paused) {\n this.setMainLoop();\n }\n }\n\n public remove() {\n this.pause();\n this.sendQuery(['destroy']);\n if(this.cacheName) RLottiePlayer.CACHE.releaseCache(this.cacheName);\n this.dispatchEvent('destroy');\n this.cleanup();\n }\n\n private applyColor(frame: Uint8ClampedArray) {\n const [r, g, b] = this.color;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] !== 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n }\n }\n }\n\n private applyInversing(frame: Uint8ClampedArray) {\n const [r, g, b] = this.inverseColor;\n for(let i = 0, length = frame.length; i < length; i += 4) {\n if(frame[i + 3] === 0) {\n frame[i] = r;\n frame[i + 1] = g;\n frame[i + 2] = b;\n frame[i + 3] = 255;\n } else {\n frame[i + 3] = 0;\n }\n }\n }\n\n public renderFrame2(frame: Uint8ClampedArray | HTMLCanvasElement | ImageBitmap, frameNo: number) {\n /* this.setListenerResult('enterFrame', frameNo);\n return; */\n\n try {\n if(frame instanceof Uint8ClampedArray) {\n if(this.color) {\n this.applyColor(frame);\n }\n\n if(this.inverseColor) {\n this.applyInversing(frame);\n }\n\n this.imageData.data.set(frame);\n }\n\n // this.context.putImageData(new ImageData(frame, this.width, this.height), 0, 0);\n this.contexts.forEach((context, idx) => {\n let cachedSource: HTMLCanvasElement | ImageBitmap = this.cache.framesNew.get(frameNo);\n if(!(frame instanceof Uint8ClampedArray)) {\n cachedSource = frame;\n } else if(idx > 0) {\n cachedSource = this.canvas[0];\n }\n\n if(!cachedSource) {\n // console.log('drawing from data');\n const c = document.createElement('canvas');\n c.width = context.canvas.width;\n c.height = context.canvas.height;\n c.getContext('2d').putImageData(this.imageData, 0, 0);\n this.cache.framesNew.set(frameNo, c);\n cachedSource = c;\n }\n\n if(this.overrideRender && this.renderedFirstFrame) {\n this.overrideRender(cachedSource || this.imageData);\n } else if(cachedSource) {\n // console.log('drawing from canvas');\n context.clearRect(0, 0, cachedSource.width, cachedSource.height);\n context.drawImage(cachedSource, 0, 0);\n } else {\n context.putImageData(this.imageData, 0, 0);\n }\n\n if(!this.renderedFirstFrame) {\n this.renderedFirstFrame = true;\n }\n });\n\n this.dispatchEvent('enterFrame', frameNo);\n } catch(err) {\n console.error('RLottiePlayer renderFrame error:', err/* , frame */, this.width, this.height);\n this.autoplay = false;\n this.pause();\n }\n }\n\n public renderFrame(frame: Parameters[0], frameNo: number) {\n const canCacheFrame = this.cachingDelta && (frameNo % this.cachingDelta || !frameNo);\n if(canCacheFrame) {\n if(frame instanceof Uint8ClampedArray && !this.cache.frames.has(frameNo)) {\n this.cache.frames.set(frameNo, new Uint8ClampedArray(frame));// frame;\n } else if(IS_IMAGE_BITMAP_SUPPORTED && frame instanceof ImageBitmap && !this.cache.framesNew.has(frameNo)) {\n this.cache.framesNew.set(frameNo, frame);\n }\n }\n\n /* if(!this.listenerResults.hasOwnProperty('cached')) {\n this.setListenerResult('enterFrame', frameNo);\n if(frameNo === (this.frameCount - 1)) {\n this.setListenerResult('cached');\n }\n\n return;\n } */\n\n if(this.frInterval) {\n const now = Date.now(), delta = now - this.frThen;\n\n if(delta < 0) {\n const timeout = this.frInterval > -delta ? -delta % this.frInterval : this.frInterval;\n if(this.rafId) clearTimeout(this.rafId);\n this.rafId = window.setTimeout(() => {\n this.renderFrame2(frame, frameNo);\n }, timeout);\n // await new Promise((resolve) => setTimeout(resolve, -delta % this.frInterval));\n return;\n }\n }\n\n this.renderFrame2(frame, frameNo);\n }\n\n public requestFrame(frameNo: number) {\n const frame = this.cache.frames.get(frameNo);\n const frameNew = this.cache.framesNew.get(frameNo);\n if(frameNew) {\n this.renderFrame(frameNew, frameNo);\n } else if(frame) {\n this.renderFrame(frame, frameNo);\n } else {\n if(this.clamped && !this.clamped.length) { // fix detached\n this.clamped = new Uint8ClampedArray(this.width * this.height * 4);\n }\n\n this.sendQuery(['renderFrame', frameNo], this.clamped ? [this.clamped.buffer] : undefined);\n }\n }\n\n private onLap() {\n if(++this.playedTimes === this.loop) {\n this.loop = false;\n }\n\n if(!this.loop) {\n this.pause(false);\n return false;\n }\n\n return true;\n }\n\n private mainLoopForwards() {\n const {skipDelta, maxFrame} = this;\n const frame = (this.curFrame + skipDelta) > maxFrame ? this.curFrame = (this.loop ? this.minFrame : this.maxFrame) : this.curFrame += skipDelta;\n // console.log('mainLoopForwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame + skipDelta) > maxFrame) {\n return this.onLap();\n }\n\n return true;\n }\n\n private mainLoopBackwards() {\n const {skipDelta, minFrame} = this;\n const frame = (this.curFrame - skipDelta) < minFrame ? this.curFrame = (this.loop ? this.maxFrame : this.minFrame) : this.curFrame -= skipDelta;\n // console.log('mainLoopBackwards', this.curFrame, skipDelta, frame);\n\n this.requestFrame(frame);\n if((frame - skipDelta) < minFrame) {\n return this.onLap();\n }\n\n return true;\n }\n\n public setMainLoop() {\n // window.cancelAnimationFrame(this.rafId);\n clearTimeout(this.rafId);\n this.rafId = undefined;\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n\n // console.trace('setMainLoop', this.frInterval, this.direction, this, JSON.stringify(this.listenerResults), this.listenerResults);\n\n const method = (this.direction === 1 ? this.mainLoopForwards : this.mainLoopBackwards).bind(this);\n this.currentMethod = method;\n // this.frameListener && this.removeListener('enterFrame', this.frameListener);\n\n // setTimeout(() => {\n // this.addListener('enterFrame', this.frameListener);\n // }, 0);\n\n if(this.frameListener) {\n const lastResult = this.listenerResults.enterFrame;\n if(lastResult !== undefined) {\n this.frameListener(this.curFrame);\n }\n }\n\n // this.mainLoop(method);\n // this.r(method);\n // method();\n }\n\n public playPart(options: {\n from: number,\n to: number,\n callback?: () => void\n }) {\n this.pause();\n\n const {from, to, callback} = options;\n this.curFrame = from - 1;\n\n return this.playToFrame({\n frame: to,\n direction: to > from ? 1 : -1,\n callback\n });\n }\n\n public playToFrame(options: {\n frame: number,\n speed?: number,\n direction?: number,\n callback?: () => void\n }) {\n this.pause();\n\n const {frame, speed, callback, direction} = options;\n this.setDirection(direction === undefined ? this.curFrame > frame ? -1 : 1 : direction);\n speed !== undefined && this.setSpeed(speed);\n\n const bounds = [this.curFrame, frame];\n if(this.direction === -1) bounds.reverse();\n\n this.loop = false;\n this.setMinMax(bounds[0], bounds[1]);\n\n if(this.playToFrameOnFrameCallback) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n if(callback) {\n this.playToFrameOnFrameCallback = (frameNo: number) => {\n if(frameNo === frame) {\n this.removeEventListener('enterFrame', this.playToFrameOnFrameCallback);\n callback();\n }\n };\n\n this.addEventListener('enterFrame', this.playToFrameOnFrameCallback);\n }\n\n this.play();\n }\n\n public setColor(color: RLottieColor, renderIfPaused: boolean) {\n this.color = color;\n\n if(renderIfPaused && this.paused) {\n this.renderFrame2(this.imageData.data, this.curFrame);\n }\n }\n\n public setInverseColor(color: RLottieColor) {\n this.inverseColor = color;\n }\n\n private setMinMax(minFrame = 0, maxFrame = this.frameCount - 1) {\n this.minFrame = minFrame;\n this.maxFrame = maxFrame;\n }\n\n public async onLoad(frameCount: number, fps: number) {\n this.frameCount = frameCount;\n this.fps = fps;\n this.setMinMax();\n if(this.initFrame !== undefined) {\n this.initFrame = clamp(this.initFrame, this.minFrame, this.maxFrame);\n }\n\n const curFrame = this.resetCurrentFrame();\n\n // * Handle 30fps stickers if 30fps set\n if(this.fps < 60 && this.skipDelta !== 1) {\n const diff = 60 / fps;\n this.skipDelta = this.skipDelta / diff | 0;\n }\n\n this.frInterval = 1000 / this.fps / this.speed * this.skipDelta;\n this.frThen = Date.now() - this.frInterval;\n // this.sendQuery('renderFrame', 0);\n\n // Кешировать сразу не получится, рендер стикера (тайгер) занимает 519мс,\n // если рендерить 75% с получением каждого кадра из воркера, будет 475мс, т.е. при 100% было бы 593мс, потеря на передаче 84мс.\n\n /* console.time('cache' + this.reqId);\n for(let i = 0; i < frameCount; ++i) {\n //if(this.removed) return;\n\n if(i % 4) {\n await new Promise((resolve) => {\n delete this.listenerResults.enterFrame;\n this.addListener('enterFrame', resolve, true);\n this.requestFrame(i);\n });\n }\n }\n\n console.timeEnd('cache' + this.reqId); */\n // console.log('cached');\n /* this.el.innerHTML = '';\n this.el.append(this.canvas);\n return; */\n\n !this.skipFirstFrameRendering && this.requestFrame(curFrame);\n this.dispatchEvent('ready');\n this.addEventListener('enterFrame', () => {\n this.dispatchEvent('firstFrame');\n\n if(!this.canvas[0].parentNode && this.el && !this.overrideRender) {\n this.el.forEach((container, idx) => container.append(this.canvas[idx]));\n }\n\n // console.log('enterFrame firstFrame');\n\n // let lastTime = this.frThen;\n this.frameListener = () => {\n if(this.paused || !this.currentMethod) {\n return;\n }\n\n const time = Date.now();\n // console.log(`enterFrame handle${this.reqId}`, time, (time - lastTime), this.frInterval);\n /* if(Math.round(time - lastTime + this.frInterval * 0.25) < Math.round(this.frInterval)) {\n return;\n } */\n\n // lastTime = time;\n\n this.frThen = time + this.frInterval;\n const canContinue = this.currentMethod();\n if(!canContinue && !this.loop && this.autoplay) {\n this.autoplay = false;\n }\n };\n\n this.addEventListener('enterFrame', this.frameListener);\n // setInterval(this.frameListener, this.frInterval);\n\n // ! fix autoplaying since there will be no animationIntersector for it\n if(this.group === 'none' && this.autoplay) {\n this.play();\n }\n }, {once: true});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Page from './page';\nimport lottieLoader from '../lib/rlottie/lottieLoader';\nimport {horizontalMenu} from '../components/horizontalMenu';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport fastSmoothScroll from '../helpers/fastSmoothScroll';\nimport whichChild from '../helpers/dom/whichChild';\n\nclass PagesManager {\n private pageId = -1;\n private page: Page;\n\n private selectTab: ReturnType;\n public pagesDiv: HTMLDivElement;\n public scrollableDiv: HTMLElement;\n\n constructor() {\n this.pagesDiv = document.getElementById('auth-pages') as HTMLDivElement;\n this.scrollableDiv = this.pagesDiv.querySelector('.scrollable') as HTMLElement;\n this.selectTab = horizontalMenu(null, this.scrollableDiv.querySelector('.tabs-container') as HTMLDivElement, null, () => {\n if(this.page?.onShown) {\n this.page.onShown();\n }\n });\n }\n\n public setPage(page: Page) {\n if(page.isAuthPage) {\n this.pagesDiv.style.display = '';\n\n const id = whichChild(page.pageEl);\n if(this.pageId === id) return;\n\n this.selectTab(id);\n\n if(this.pageId !== -1 && id > 1) {\n lottieLoader.loadLottieWorkers();\n }\n\n\n this.pageId = id;\n\n if(this.scrollableDiv) {\n fastSmoothScroll({\n container: this.scrollableDiv,\n element: this.scrollableDiv.firstElementChild as HTMLElement,\n position: 'start'\n });\n }\n } else {\n this.pagesDiv.style.display = 'none';\n page.pageEl.style.display = '';\n\n this.pageId = -1;\n }\n\n this.page = page;\n }\n}\n\nconst pagesManager = new PagesManager();\nMOUNT_CLASS_TO.pagesManager = pagesManager;\nexport default pagesManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pagesManager from './pagesManager';\n\nexport default class Page {\n public pageEl: HTMLDivElement;\n private installed = false;\n\n constructor(\n className: string,\n public isAuthPage: boolean,\n private onFirstMount?: (...args: any[]) => Promise | void,\n private onMount?: (...args: any[]) => Promise | void,\n public onShown?: () => void\n ) {\n this.pageEl = document.body.querySelector('.' + className) as HTMLDivElement;\n }\n\n public async mount(...args: any[]) {\n // this.pageEl.style.display = '';\n\n if(this.onMount) {\n const res = this.onMount(...args);\n if(res instanceof Promise) {\n await res;\n }\n }\n\n if(!this.installed) {\n if(this.onFirstMount) {\n try {\n const res = this.onFirstMount(...args);\n if(res instanceof Promise) {\n await res;\n }\n } catch(err) {\n console.error('PAGE MOUNT ERROR:', err);\n }\n }\n\n this.installed = true;\n }\n\n pagesManager.setPage(this);\n }\n}\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\n\nexport function encodeEmoji(emojiText: string) {\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\n return codepoints;\n}\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\n\nexport function toCodePoints(unicodeSurrogates: string): Array {\n const points = [];\n let char = 0;\n let previous = 0;\n let i = 0;\n while(i < unicodeSurrogates.length) {\n char = unicodeSurrogates.charCodeAt(i++);\n if(previous) {\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\n previous = 0;\n } else if(char > 0xd800 && char <= 0xdbff) {\n previous = char;\n } else {\n points.push(char.toString(16));\n }\n }\n\n if(points.length && points[0].length === 2) {\n points[0] = '00' + points[0];\n }\n\n return points;\n}\n\nexport function getEmojiToneIndex(input: string) {\n const match = input.match(/[\\uDFFB-\\uDFFF]/);\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\n}\n\nconst VIRTUAL_COUNTRIES_EMOJIS: Map = new Map([\n ['FT', '🏴‍☠']\n]);\n\nexport function getCountryEmoji(iso2: string) {\n return VIRTUAL_COUNTRIES_EMOJIS.get(iso2) ??\n String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\n}\n\nexport function emojiFromCodePoints(codePoints: string) {\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n}\n","!function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.Recorder=t():e.Recorder=t()}(\"undefined\"!=typeof self?self:this,(function(){return function(e){var t={};function o(i){if(t[i])return t[i].exports;var n=t[i]={i:i,l:!1,exports:{}};return e[i].call(n.exports,n,n.exports,o),n.l=!0,n.exports}return o.m=e,o.c=t,o.d=function(e,t,i){o.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},o.r=function(e){\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},o.t=function(e,t){if(1&t&&(e=o(e)),8&t)return e;if(4&t&&\"object\"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(o.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var n in e)o.d(i,n,function(t){return e[t]}.bind(null,n));return i},o.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(t,\"a\",t),t},o.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o.p=\"\",o(o.s=0)}([function(e,t,o){\"use strict\";(function(t){var o=t.AudioContext||t.webkitAudioContext,i=function(e){if(!i.isRecordingSupported())throw new Error(\"Recording is not supported in this browser\");e||(e={}),this.state=\"inactive\",this.config=Object.assign({bufferLength:4096,encoderApplication:2049,encoderFrameSize:20,encoderPath:\"encoderWorker.min.js\",encoderSampleRate:48e3,maxFramesPerPage:40,mediaTrackConstraints:!0,monitorGain:0,numberOfChannels:1,recordingGain:1,resampleQuality:3,streamPages:!1,reuseWorker:!1,wavBitDepth:16},e),this.encodedSamplePosition=0};i.isRecordingSupported=function(){return o&&t.navigator&&t.navigator.mediaDevices&&t.navigator.mediaDevices.getUserMedia&&t.WebAssembly},i.prototype.clearStream=function(){this.stream&&(this.stream.getTracks?this.stream.getTracks().forEach((function(e){e.stop()})):this.stream.stop(),delete this.stream),this.audioContext&&this.closeAudioContext&&(this.audioContext.close(),delete this.audioContext)},i.prototype.encodeBuffers=function(e){if(\"recording\"===this.state){for(var t=[],o=0;o{this.encodeBuffers(e.inputBuffer)},this.monitorGainNode=this.audioContext.createGain(),this.setMonitorGain(this.config.monitorGain),this.monitorGainNode.connect(this.audioContext.destination),this.recordingGainNode=this.audioContext.createGain(),this.setRecordingGain(this.config.recordingGain),this.recordingGainNode.connect(this.scriptProcessorNode)},i.prototype.initSourceNode=function(e){return e&&e.context?t.Promise.resolve(e):t.navigator.mediaDevices.getUserMedia({audio:this.config.mediaTrackConstraints}).then(e=>(this.stream=e,this.audioContext.createMediaStreamSource(e)))},i.prototype.loadWorker=function(){this.encoder||(this.encoder=new t.Worker(this.config.encoderPath))},i.prototype.initWorker=function(){var e=(this.config.streamPages?this.streamPage:this.storePage).bind(this);return this.recordedPages=[],this.totalLength=0,this.loadWorker(),new Promise((t,o)=>{var i=o=>{switch(o.data.message){case\"ready\":t();break;case\"page\":this.encodedSamplePosition=o.data.samplePosition,e(o.data.page);break;case\"done\":this.encoder.removeEventListener(\"message\",i),this.finish()}};this.encoder.addEventListener(\"message\",i),this.encoder.postMessage(Object.assign({command:\"init\",originalSampleRate:this.audioContext.sampleRate,wavSampleRate:this.audioContext.sampleRate},this.config))})},i.prototype.pause=function(e){if(\"recording\"===this.state){if(this.state=\"paused\",e&&this.config.streamPages){var t=this.encoder;return new Promise((e,o)=>{var i=o=>{\"flushed\"===o.data.message&&(t.removeEventListener(\"message\",i),this.onpause(),e())};t.addEventListener(\"message\",i),t.postMessage({command:\"flush\"})})}return this.onpause(),Promise.resolve()}},i.prototype.resume=function(){\"paused\"===this.state&&(this.state=\"recording\",this.onresume())},i.prototype.setRecordingGain=function(e){this.config.recordingGain=e,this.recordingGainNode&&this.audioContext&&this.recordingGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.setMonitorGain=function(e){this.config.monitorGain=e,this.monitorGainNode&&this.audioContext&&this.monitorGainNode.gain.setTargetAtTime(e,this.audioContext.currentTime,.01)},i.prototype.start=function(e){if(\"inactive\"===this.state)return this.initAudioContext(e),this.initAudioGraph(),this.encodedSamplePosition=0,this.initWorker().then(()=>this.initSourceNode(e)).then(e=>{this.sourceNode=e,this.state=\"recording\",this.onstart(),this.encoder.postMessage({command:\"getHeaderPages\"}),this.sourceNode.connect(this.monitorGainNode),this.sourceNode.connect(this.recordingGainNode)})},i.prototype.stop=function(){if(\"inactive\"!==this.state){this.state=\"inactive\",this.monitorGainNode.disconnect(),this.scriptProcessorNode.disconnect(),this.recordingGainNode.disconnect(),this.sourceNode.disconnect(),this.clearStream();var e=this.encoder;return new Promise(t=>{var o=i=>{\"done\"===i.data.message&&(e.removeEventListener(\"message\",o),t())};e.addEventListener(\"message\",o),e.postMessage({command:\"done\"}),this.config.reuseWorker||e.postMessage({command:\"close\"})})}return Promise.resolve()},i.prototype.destroyWorker=function(){\"inactive\"===this.state&&this.encoder&&(this.encoder.postMessage({command:\"close\"}),delete this.encoder)},i.prototype.storePage=function(e){this.recordedPages.push(e),this.totalLength+=e.length},i.prototype.streamPage=function(e){this.ondataavailable(e)},i.prototype.finish=function(){if(!this.config.streamPages){var e=new Uint8Array(this.totalLength);this.recordedPages.reduce((function(t,o){return e.set(o,t),t+o.length}),0),this.ondataavailable(e)}this.onstop(),this.config.reuseWorker||delete this.encoder},i.prototype.ondataavailable=function(){},i.prototype.onpause=function(){},i.prototype.onresume=function(){},i.prototype.onstart=function(){},i.prototype.onstop=function(){},e.exports=i}).call(this,o(1))},function(e,t){var o;o=function(){return this}();try{o=o||new Function(\"return this\")()}catch(e){\"object\"==typeof window&&(o=window)}e.exports=o}])}));","/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\n */\n\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\nvar NEWTON_ITERATIONS = 4;\nvar NEWTON_MIN_SLOPE = 0.001;\nvar SUBDIVISION_PRECISION = 0.0000001;\nvar SUBDIVISION_MAX_ITERATIONS = 10;\n\nvar kSplineTableSize = 11;\nvar kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\nvar float32ArraySupported = typeof Float32Array === 'function';\n\nfunction A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }\nfunction B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }\nfunction C (aA1) { return 3.0 * aA1; }\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }\n\nfunction binarySubdivide (aX, aA, aB, mX1, mX2) {\n var currentX, currentT, i = 0;\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) {\n aB = currentT;\n } else {\n aA = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n return currentT;\n}\n\nfunction newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {\n for (var i = 0; i < NEWTON_ITERATIONS; ++i) {\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n if (currentSlope === 0.0) {\n return aGuessT;\n }\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n}\n\nfunction LinearEasing (x) {\n return x;\n}\n\nmodule.exports = function bezier (mX1, mY1, mX2, mY2) {\n if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range');\n }\n\n if (mX1 === mY1 && mX2 === mY2) {\n return LinearEasing;\n }\n\n // Precompute samples table\n var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n for (var i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n }\n\n function getTForX (aX) {\n var intervalStart = 0.0;\n var currentSample = 1;\n var lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n --currentSample;\n\n // Interpolate to provide an initial guess for t\n var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n var guessForT = intervalStart + dist * kSampleStepSize;\n\n var initialSlope = getSlope(guessForT, mX1, mX2);\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n } else if (initialSlope === 0.0) {\n return guessForT;\n } else {\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n }\n }\n\n return function BezierEasing (x) {\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n if (x === 0 || x === 1) {\n return x;\n }\n return calcBezier(getTForX(x), mY1, mY2);\n };\n};\n"],"names":["animationIntersector","constructor","this","observer","IntersectionObserver","entries","entry","target","group","byGroups","intersectionLockedGroups","animation","find","p","el","isIntersecting","visible","add","checkAnimation","delete","_animation","clearCache","Set","overrideIdleGroups","byPlayer","Map","lockedGroups","onlyOnePlayableGroup","videosLocked","doc","type","checkAnimations2","idle","setOverrideIdleGroup","override","getAnimations","element","found","player","push","removeAnimation","remove","HTMLVideoElement","IS_SAFARI","setTimeout","src","load","length","unobserve","removeAnimationByPlayer","item","get","addAnimation","observeElement","controlled","has","canvas","placeholder","HTMLElement","loop","observe","set","checkAnimations","blurred","destroy","imitateIntersection","undefined","groups","Object","keys","animations","paused","pause","autoplay","play","getOnlyOnePlayableGroup","setOnlyOnePlayableGroup","lockGroup","unlockGroup","refreshGroup","forEach","lockIntersectionGroup","unlockIntersectionGroup","toggleIntersectionGroup","lock","SHOULD_USE_SAFARI_FIX","navigator","userAgent","match","err","AppMediaPlaybackController","media","scheduled","mediaDetails","waitingMediaForLoad","waitingScheduledMediaForLoad","waitingDocumentsForLoad","playbackRates","voice","video","audio","seekBackward","details","playingMedia","currentTime","Math","max","seekOffset","seekForward","min","duration","seekTo","seekTime","onMediaDocumentLoad","managers","appDocsManager","getDoc","docId","supportsStreaming","handleSafariStreamable","cacheContext","thumbsStorage","getCacheContext","url","playbackRate","id","size","onPlay","e","peerId","mid","pip","message","getMessageByMedia","stop","setMedia","verify","listLoader","current","getCurrent","jumpLength","withOtherSide","previous","getPrevious","idx","findIndex","getNext","go","setTargets","dispatchEvent","getPlayingDetails","pauseMediaInOtherTabs","onPause","onEnded","isTrusted","lockedSwitchers","round","next","toggle","clean","s","isScheduled","storage","playingMediaType","playItem","searchContext","getMedia","resolveWaitingForLoadMedia","dispatchJump","goRound","browserPlay","bindBrowserCallback","browserPause","browserStop","browserSeekBackward","browserSeekForward","browserSeekTo","browserNext","browserPrevious","seekToStart","construct","container","document","createElement","style","cssText","body","append","mediaSession","actions","seekbackward","seekforward","seekto","previoustrack","nexttrack","action","setActionHandler","console","warn","skipMediaPlayEvent","properties","key","_key","value","dispatchPlaybackParams","defineProperties","getPlaybackParams","volume","muted","setPlaybackParams","params","_volume","_muted","_playbackRate","_loop","_round","addMedia","autoload","pFlags","is_scheduled","setAttribute","addEventListener","media_unread","fromId","appMessagesManager","readMessages","once","deferred","resolve","w","waitingStorage","then","promise","isSafariBuffering","safariBuffering","setSafariBuffering","setNewMediadata","pictureInPictureElement","artwork","isVoice","title","artist","thumbs","bytes","sizes","h","thumb","appPeersManager","getPeerPhoto","plainText","onlyFirstName","attribute","attributes","_","file_name","performer","IS_APPLE","metadata","MediaMetadata","setCurrentMediadata","playbackParams","cb","willBePlayed","willBePlayedMedia","setSearchContext","context","getSearchContext","prev","reset","loadCount","loadWhenLeft","processItem","onJump","older","onEmptied","reverse","folderId","getPlaybackMediaTypeFromMessage","mediaType","setSingleMedia","wasPlaying","toggleSwitchers","playPaused","removeEventListener","enabled","setPictureInPicture","listenerSetter","removeAll","appMediaPlaybackController","AppMediaViewer","captionTimeout","super","isForDocument","inputFilter","isMediaCompatibleForDocumentViewer","onPrevClick","openMedia","getMessageByPeer","onNextClick","onDeleteClick","content","close","onForwardClick","onAuthorClick","Number","MAX_SAFE_INTEGER","threadId","tab","lastMsgId","onDownloadClick","queueId","caption","classList","setCaptionTimeout","clearTimeout","window","onAdditionalScroll","wholeDiv","buttons","btnMenuForward","icon","text","onClick","btnMenuDownload","btnMenuDelete","setBtnMenuToggle","setListeners","forward","author","onCaptionClick","a","spoiler","HTMLAnchorElement","contains","onclick","getAttribute","includes","capture","click","getScheduledMessageByPeer","setCaption","html","entities","totalEntities","firstElementChild","fromRight","prevTargets","nextTargets","setMoverPromise","fwd_from","from_name","noForwards","isServiceMessage","cantForwardMessage","canForward","cantDownloadMessage","download","canDeleteMessage","hide","button","_openMedia","date","static","mime_type","VideoPlayer","streamable","onPlaybackRackMenuToggle","onPip","onPipClose","wrapper","setup","canHideControls","playbackRateButton","showOnLeaveToClassName","ignoreClickClassName","parentNode","insertBefore","appendChild","skin","stylePlayer","controls","querySelector","progress","prepend","catch","name","finally","initDuration","buildControls","timeDuration","insertAdjacentHTML","pipButton","querySelectorAll","fullScreenButton","timeElapsed","textContent","toHHMMSS","volumeSelector","leftControls","btn","parentElement","Array","from","togglePlay","requestPictureInPicture","visibility","debounceTime","debouncedPip","debounce","listener","timeout","overlayCounter","code","good","toggleFullScreen","altKey","nextIdx","PLAYBACK_RATES","indexOf","cancelEvent","onFullScreen","bind","hideControls","showControls","setPlaybackRateIcon","onMediaLoad","IS_MOBILE","pictureInPictureEnabled","map","rate","regularText","btnMenu","onOpen","onClose","PLAYBACK_RATES_ICONS","className","IS_APPLE_MOBILE","webkitEnterFullscreen","enterFullscreen","isFull","cleanup","removeListeners","MEDIA_VIEWER_CLASSNAME","AppMediaViewerBase","topButtons","tempId","preloader","preloaderStreamable","isFirstOpen","pageEl","getElementById","zoomElements","zoomSwipeStartX","zoomSwipeStartY","zoomSwipeX","zoomSwipeY","setZoomValue","rangeSelector","moversContainer","transform","btnOut","btnIn","toggleZoom","setMoverAnimationPromise","tagName","highlightSwitchersTimeout","isZooming","mover","classNames","findUpClassName","onKeyDown","ctrlKeyDown","changeZoom","ctrlKey","metaKey","onKeyUp","onWheel","scrollingUp","deltaY","rootScope","log","logger","cancelable","lazyLoadQueue","overlaysDiv","mainDiv","topbar","topbarLeft","onlyMobile","authorRight","avatarEl","nameEl","buttonsDiv","concat","noRipple","zoom","step","withTransition","setHandlers","onScrub","onMouseUp","main","innerHTML","onLoadedMore","setNewMover","moveLength","onSwipe","xDiff","yDiff","abs","windowSize","verifyTouchTarget","evt","enable","isVisible","mousedown","zoomValue","setProgress","videoPlayer","lockControls","zoomSwipeHandler","lastDiffX","lastDiffY","multiplier","onFirstSwipe","onReset","cursor","addProgress","btnMenuToggle","buttonOptions","direction","Promise","reject","navigationItem","appNavigationController","clear","setMoverToTarget","onAnimationEnd","appMediaViewer","removeGlobalListeners","toggleOverlay","active","toggleGlobalListeners","setGlobalListeners","passive","closing","removeCenterFromMover","wasActive","delay","realParent","rect","getBoundingClientRect","SVGImageElement","SVGForeignObjectElement","left","needOpacity","overflowElement","visibleRect","getVisibleRect","overflow","vertical","horizontal","containerRect","top","aspecter","width","HTMLImageElement","setFullAspect","offsetLeft","height","scaleX","scaleY","borderRadius","getComputedStyle","getPropertyValue","brSplitted","str","splitted","split","i","fillPropertyValue","r","parseInt","join","willBeLeft","willBeTop","path","opacity","isOut","ret","isFulfilled","isRejected","SVGSVGElement","sizeTailPath","toggleWholeActive","mediaElement","selector","queryFrom","matches","elements","pop","getContext","naturalWidth","naturalHeight","videoWidth","videoHeight","HTMLCanvasElement","drawImage","image","Image","createVideo","clipId","dataset","newClipId","newSvg","createElementNS","setAttributeNS","outerHTML","replace","lastElementChild","defs","use","SVGUseElement","d","getAttributeNS","x","y","sX","sY","br","v","generatePathData","foreignObject","renderImageFromUrl","display","proportion","upscale","start","Date","now","diff","_br","moveTheMover","toLeft","windowW","newTransform","p1","newMover","updateMediaSource","toLowerCase","setAuthorInfo","timestamp","isPeerId","wrapTitlePromise","dialog","wrapEmojiText","oldAvatar","newAvatar","cloneNode","all","updateWithOptions","peerTitle","replaceContent","replaceWith","setAuthorPromise","isDocument","isVideo","useContainerAsTarget","IS_MOBILE_SAFARI","onPop","canAnimate","maxWidth","padding","windowH","mediaSizes","maxHeight","thumbPromise","setAttachmentSize","photoSize","img","downloaded","gotThumb","getStrippedThumbIfNeeded","loadPromise","useController","div","moverVideo","canPlayThrough","createPlayer","ckin","overlay","open","otherMediaViewer","releaseSingleMedia","show","readyState","HAVE_FUTURE_DATA","attach","attachCanPlay","detach","loading","networkState","NETWORK_LOADING","isntEnoughData","unshift","appDownloadManager","toast","langPackKey","error","cancellablePromise","attachPromise","imgs","haveImage","setManual","onPopState","hash","location","state","debug","isPossibleSwipe","currentHash","overriddenHash","overrideHash","onHashChange","pushState","navigations","manual","handleItem","onEscape","back","onTouchStart","touches","options","history","scrollRestoration","replaceState","pushItem","noBlurOnPop","findItemByType","index","backByItem","splice","onItemAdded","noHistory","unshiftItem","spliceItems","items","origin","pathname","search","removeItem","removeByType","single","SearchGroup","clearable","clickable","autonomous","onFound","noIcons","list","setActive","childElementCount","AppSearch","searchInput","searchGroups","onSearch","minMsgId","loadedCount","foundCount","searchPromise","searchTimeout","query","listsContainer","scrollable","messages","setVirtualContainer","onChange","searchMore","onScrolledBottom","trim","beginSearch","inputField","input","focus","maxId","limit","res","count","shift","searchGroup","avatarSize","meAsSaved","SearchContextMenu","attachTo","searchSuper","onGotoClick","appImManager","selection","isSelecting","selectionForwardBtn","onSelectClick","toggleByElement","onClearSelectionClick","cancelSelection","selectionDeleteBtn","attachContextMenuListener","callback","init","MouseEvent","preventDefault","cancelBubble","toPeerId","isSelected","isMidSelected","withSelection","positionMenu","contextMenuController","AppSearchSuper","tabs","prevTabId","middleware","historyStorage","usedFromHistory","loadMutex","nextRates","loadPromises","loaded","loadedChats","firstLoad","monthContainers","mediaTabsMap","asChatList","groupByMonth","hideEmptyTabs","showSender","onTransitionStart","onTransitionEnd","safeAssign","searchContextMenu","navScrollableContainer","navScrollable","nav","tabsMenu","mediaTab","mediaTabs","menuTab","span","ripple","unlockScroll","tabsContainer","swipeHandler","handleTabSwipe","prevId","selectTab","children","onTouchMove","lockers","lockTouchScroll","contentTab","searchGroupMedia","canLoadMediaTab","horizontalMenu","tabContent","animate","skipScroll","scrollIntoViewNew","position","startCallback","scrollStartCallback","newMediaTab","onChangeTab","fromMediaTab","offsetTop","scrollTop","scroll","scrollHeight","rect2","onScroll","onMediaClick","targetClassName","mediaSpoiler","event","targets","containerEl","copySearchContext","slice","inputMessagesFilterPhotoVideo","inputMessagesFilterDocument","useHeavyAnimationCheck","unlockAndRefresh","filterMessagesByType","filterMessagesByInputFilter","processEmptyFilter","dialogElement","appDialogsManager","setLastMessagePromise","lastMessage","highlightWord","noop","processPhotoVideoFilter","promises","getMediaFromMessage","wrapped","choosePhotoSize","boxWidth","boxHeight","onlyPreview","withoutPreloader","noPlayButton","photo","noBlur","animationGroup","multiply","images","full","filter","Boolean","processDocumentFilter","withTime","fontWeight","voiceAsMusic","autoDownloadSize","processUrlFilter","webPage","webpage","entity","display_url","sliced","offset","matchUrl","same","URL","hostname","description","previewDiv","setInnerHTML","wrapAbbreviation","subtitleFragment","htmlToDocumentFragment","wrapRichText","innerText","decodeURIComponent","href","firstChild","wrapPlainText","row","titleRight","subtitle","havePadding","applyMediaElement","performSearchResult","elemsToAppend","sharedMediaDiv","processCallback","results","awaited","method","monthContainer","getMonthContainerByTimestamp","toggleElementCheckbox","afterPerforming","parent","child","loadChats","renderedPeerIds","inputMessagesFilterEmpty","setResults","showMembersCount","dom","peer","getPeer","participants_count","participants","regExp","RegExp","escapeRegExp","cleanSearchText","titleSpan","lastMessageSpan","getChatMembersString","toChatId","username","getPeerUsername","user","appUsersManager","getUser","phone","formatPhoneNumber","formatted","onLoad","arg","getContactsPeerIds","contacts","searchContacts","my_results","globalContacts","showMore","intlElement","isShort","update","dialogsStorage","getDialogs","offsetIndex","filterId","dialogs","minDate","renderRecentSearch","recent","replaceChildren","recentSearch","isUser","getUserStatusString","toUserId","getTopPeers","peers","people","subtitleEl","loadMembers","renderParticipants","membersList","rippleEnabled","li","findUpTag","DIALOG_LIST_ELEMENT_TAG","participant","getParticipantPeerId","isAnyChat","deleted","appChatsManager","isChannel","LOAD_COUNT","appProfileManager","getChannelParticipants","getChatFull","chatFull","loadType","justLoad","used","slicedLength","ids","notFilteredMessages","m","checkForTriggers","getSearch","nextRate","next_rate","loadFirstTime","filters","counters","canViewMembers","getSearchCounters","firstMediaTab","counter","c","membersTab","loadFirstTimePromise","toLoad","t","findAndSplice","setHours","setDate","dateTimestamp","getTime","containers","month","getFullYear","year","dateElement","haveTimestamps","getObjectKeysAndSort","positionElementByIndex","chatId","isBroadcast","hasRights","isForum","cleanScrollPositions","cleanupHTML","goFirst","putPreloader","empty","newInputFilter","copy","setQuery","maxDate","AppSelectPeers","chatsContainer","selected","freezed","loadedWhat","peerType","multiSelect","exceptSelf","tempIds","selfPresence","needSwitchList","design","onInput","cachedContacts","getMoreResults","f","renderResultsFunc","renderResults","peerIds","splitUp","notRendered","filterPeerTypeBy","section","innerContainer","topContainer","selectedContainer","selectedScrollable","sectionNameLangPackKey","noShadow","checkbox","checked","debouncedInput","appendTo","getResultsPromise","onFirstRender","renderSaved","testSelfSearch","getTempId","getMoreDialogs","archived","pageCount","skipMigrated","newOffsetIndex","chatRightsAction","filterByRights","isEnd","getMoreContacts","isGlobalSearch","searchResult","resultPeerIds","arr","getMoreChannelParticipants","channelParticipants","q","getMoreSomething","call","isNonContactUser","checkboxField","label","isDialog","insertAdjacentElement","offsetWidth","getSelected","addInitial","values","requestAnimationFrame","forceDirection","constructDownloadPreloader","tryAgainOnFail","circle","totalLength","mids","attr","elem","findMediaTargets","anchor","anchorMid","isBubbles","justAudioSelector","selectors","prefix","mediaItems","AudioElement","render","isRealVoice","isOutgoing","is_outgoing","uploadingFileName","durationStr","downloadDiv","onTypeLoad","audioEl","out","waveform","Uint8Array","valueCount","result","dataView","DataView","buffer","byteIndex","bitShift","getUint16","decodeWaveform","svg","svgContainer","availW","barHeightMax","minW","maxW","normValue","wfSize","barCount","maxValue","maxDelta","barX","sumI","bar_value","barWidth","createWaveformBars","fakeSvgContainer","waveformContainer","timeDiv","onTimeUpdate","throttledTimeUpdate","addAudioListener","readyPromise","mousemove","scrub","offsetX","targetTouches","pageX","scrubTime","wrapVoiceMessage","descriptionEl","audioAttribute","parts","titleEl","middleEllipsisEl","fontSize","sizeType","subtitleDiv","launched","progressLine","lastChild","wrapAudio","audioTimeDiv","HAVE_CURRENT_DATA","onTypeDisconnect","getTimeStr","hadSearchContext","useSearch","autoDownload","shouldPlay","onDownloadInit","pauseListener","notifyAll","done","total","cancel","Error","playListener","setDownloadFunction","disconnectedCallback","isConnected","customElements","define","AvatarListLoader","loadMore","photoId","appPhotosManager","getUserPhotos","photos","loadedAllUp","AppMediaViewerAvatar","getPhoto","onAvatarUpdate","openAvatarViewer","getTarget","hadMessage","isObject","data","believeMe","seen","getAvatarQueueKey","AvatarElement","addedToQueue","middlewareHelper","attachClickEvent","updateOptions","wasPeerId","wasThreadId","newPeerId","wrapOptions","create","onlyThumb","putPhoto","isBig","AvatarEdit","clearRect","Button","asLink","asDiv","rippleSquare","disabled","ButtonMenuItem","separator","iconDoc","noCheckboxClickListener","textElement","textArgs","iconElement","noFadeIn","processUrl","fetch","response","color","DOMParser","parseFromString","stroke","strokeWidth","keepOpen","menu","checkForClose","multiline","ButtonMenuSync","b","ButtonMenu","ButtonMenuToggleHandler","openedMenu","ButtonMenuToggle","attachListenerSetter","onOpenBefore","onCloseAfter","closeTimeout","filteredButtons","_element","ChatBackgroundGradientRenderer","_width","_height","_tails","_scrollTails","_curve","_positions","_phases","_animatingToNextPosition","_scrollDelta","_onWheelRAF","drawOnWheel","floor","ceil","changeTailAndDraw","drawNextPositionAnimated","getProgress","transitionValue","nextPositionTail","_nextPositionTail","_nextPositionTails","_nextPositionLeft","frames","_frames","drawImageData","_incrementalCurve","hexToRgb","hex","g","getPositions","positions","getNextPositions","phase","curveMax","curve","pos","distances","nextPos","distance","curPosition","tail","changeTail","_tail","_phase","curPos","drawGradient","getGradientImageData","_hctx","createImageData","pixels","centerDistanceY","centerDistanceY2","centerDistanceX","swirlFactor","sqrt","theta","sinTheta","sin","cosTheta","cos","pixelX","pixelY","distanceSum","_colors","distanceX","distanceY","putImageData","_ctx","_hc","cancelAnimationFrame","colors","alpha","_canvas","fillStyle","fillRect","toNextPosition","tails","nextPhaseOnIdx","inc","toFixed","curves","last","scrollAnimate","createCanvas","gradientRenderer","accumulateMapSet","reduce","acc","AppSelection","selectedMids","onMouseDown","targetLookupClassName","verifyTarget","selecting","firstTarget","processElement","checkBetween","isInDOM","seenSet","seenLength","findUpAsChild","elementsBetween","getElementsBetween","toggleByMid","canceledSelection","onMouseMove","getElementFromTarget","verifyMouseMoveTarget","removeManual","listenElement","documentListenerOptions","first","firstRect","lastRect","isHigher","lookupBetweenParentClassName","lookupBetweenElementsQuery","firstIndex","lastIndex","doNotAnimate","onCancelSelection","toggleSelection","navigationType","random","attachListeners","selectedText","getSelection","toString","createRange","verifyTouchLongPress","isElementShouldBeSelected","appendCheckbox","hasCheckbox","getCheckboxInputFromElement","forwards","updateContainer","forceSelection","cantForward","cantDelete","cantSend","storageKey","cantForwardDeleteMids","onUpdateContainer","toggleCheckboxes","wasSelecting","blurActiveElement","toggleResult","onToggleSelection","updateElementSelection","toggleMid","unselect","deleteSelectedMids","SearchSelection","selectionCountEl","selectionGotoBtn","selectionContainer","BASE_CLASS","btnCancel","attachClickOptions","obj","fromPeerId","sort","isPrivate","transitionElement","ChatSelection","chat","bubbles","recording","bubble","canSelectBubble","isGroupedBubbleSelected","getMidsFromGroupContainer","getBubbleGroupedItems","groupContainer","isGroupedSelected","isGroupedMidsSelected","mounted","getMountedBubble","needTranslateX","widthFrom","widthTo","center","selectionInputWrapper","selectionSendNowBtn","selectionLeft","selectionRight","translateButtonsX","right","inputContainer","toggleAttribute","skippedMids","isGrouped","groupedCheckboxInput","CheckboxField","restriction","toggleDisability","stateKey","stateValues","stateValue","setValueSilently","box","checkSvg","bg","border","withRipple","withHover","Event","disable","CodeInputField","assign","autocomplete","lastLength","setLabel","onFill","confirmationPopup","checkboxes","cancelButton","isCancel","countries","setCountries","country","hidden","default_name","localeCompare","VIRTUAL_COUNTRIES","CountryInputField","hidePicker","hideTimeout","selectWrapper","selectCountryByTarget","defaultName","phoneCodeEl","phoneCode","countryCode","simulateInputEvent","lastCountrySelected","lastCountryCodeSelected","country_codes","_countryCode","country_code","onCountryChange","liMap","arrowDown","selectList","initSelect","noPhoneCodes","iso2","emoji","liArr","Infinity","spanEmoji","select","margin","mouseDownHandlerAttached","onKeyPress","_value","names","abbr","word","test","blur","selectCountryByIso2","countryName","DotRenderer","dpr","devicePixelRatio","prepare","dots","generateDot","adding","radius","Path2D","arc","PI","mOpacity","draw","dot","addOpacity","easedOpacity","globalAlpha","fill","renderFirstFrame","onClean","dotRenderer","EditPeer","_disabled","isChanged","uploadAvatar","changedLength","requiredLength","requiredValidLength","inputFields","isValid","required","handleChange","nextBtn","withoutAvatar","avatarElem","doNotEditAvatar","avatarEdit","_upload","popupOptions","lockWithPromise","unlockOnSuccess","GifsTab","gifsContainer","EmoticonsDropdown","masonry","EMOTICONSSTICKERGROUP","getGifs","docs","processInvisibleDiv","ANIMATIONGROUP","AppGifsTab","nextOffset","loadedAll","onGifsClick","fileId","inputSearch","gifsDiv","onCloseAfterTimeout","newSearch","gifBotPeerId","resolveUsername","appInlineBotsManager","getInlineResults","next_offset","AppStickersTab","setsDiv","listenTo","sticker","stickerSet","access_hash","appStickersManager","getStickerSet","toggleStickerSet","changed","installed_date","removeAttribute","renderFeatured","renderSet","header","countDiv","stickersDiv","stickerDiv","documents","withLock","getFeaturedStickers","coveredSets","filterRendered","forEachReverse","covered","searchStickerSets","scrollOptions","forceDuration","transitionFunction","ignoreOutClickClassName","tabId","onSelectTabClick","searchButton","emojiTab","deleteBtn","scrollTo","checkRights","tabsEl","tabsElements","canSendStickers","canSendGifs","canSendToPeer","stickersTab","gifsTab","whichChild","savedRange","getGoodRange","onOpened","unlock","refresh","onClosed","range","getSavedRange","setStartAfter","newRange","cloneRange","collapsed","node","endContainer","endOffset","newStartNode","previousSibling","nodeType","TEXT_NODE","nodeValue","ELEMENT_NODE","isContentEditable","selectNode","newOffset","setStart","deleteContents","HIDE_EMOJI_TAB","INIT_TAB_ID","lastMouseMoveEvent","mouseMoveEventAttached","isActive","onMouseOut","getElement","axis","clearDraft","silent","emoticonsDropdown","forceClose","addLazyLoadQueueRepeat","divs","intersector","getVisible","clearVisible","sel","rangeCount","activeElement","getRangeAt","menuOnClick","emoticons","menuScroll","prevTab","jumpedTo","getElementPosition","elementPosition","scrollToTab","scrollingToContent","stickyIntersector","stuck","getCategoryByContainer","which","getCategoryByMenuTab","additionalOffset","setActiveStatic","local","scrollLeft","clientWidth","sendDocId","loadedURLs","appendEmoji","unify","kek","getEmojiEntityFromEmoji","wrapSingleEmoji","fixEmoji","getEmojiFromElement","superEmoji","stickerEmoji","EMOJI_RECENT_ID","EMOJI_RECENT_CATEGORY","CUSTOM_EMOJI_RECENT_CATEGORY","EMOJI_CATEGORIES","sorted","category","order","EMOJI_ELEMENT_SIZE","EmojiTab","onCategoryVisibility","categoriesMap","renderer","newChildren","customEmojis","customEmojiElement","clearCanvas","onContentClick","isStandalone","langPackArguments","activeElements","menuInnerScroll","intersectionOptions","root","categoriesIntersector","menuOnClickResult","innerScrollWrapper","preparedMap","noRegularEmoji","emojis","titleLangPackKey","createLocalCategory","unified","addEmojiToCategory","batch","appEmojiManager","getRecentEmojis","stickerSetId","getLocalStickerSet","getCustomEmojis","recentCustom","mainSet","sets","recentCategory","categories","recentCustomCategory","CUSTOM_EMOJI_RECENT_ID","createRendererForCategory","paddingTop","toggleLocalCategory","resizeCategories","after","renderStickerSet","toggleCustomCategory","postponedEvent","positionCategory","toggleRenderers","ignore","ignoreSettingDimensions","setDimensionsFromRect","deleteCategory","isCategoryVisible","forceRender","closeScrollTop","createCategory","menuTabPadding","stickerEmojiRaw","setCategoryItemsHeight","getCustomCategory","hasPremium","canSeeCustomCategory","customEmojiSize","activeEmoji","spliceExceed","onLocalCategoryUpdate","LazyLoadQueueRepeat","parallelLimit","onVisibilityChange","elementsMap","queueItem","wasSeen","queue","indexOfAndSplice","setProcessQueueTimeout","SuperStickerRenderer","regularLazyLoadQueue","animated","checkAnimationContainer","processVisible","processInvisible","renderSticker","observeAnimated","unobserveAnimated","StickersTabCategory","noMenuTab","getContainerSize","getElementMediaSize","gapX","gapY","containerWidth","elementSize","itemsPerRow","rows","minHeight","EmoticonsTabC","categoryItemsClassName","args","postponedEvents","categoriesByMenuTabMap","localCategories","menuWrapper","isLocal","observeStickyHeaderChanges","posItems","foundMenuScroll","posMenu","notMountedItems","notMountedMenus","itemsIdx","menuIdx","disconnect","StickersTab","setTyping","setFavedLimit","categoryAppendStickers","superStickerRenderer","clearCategoryItems","onCategoryStickers","stickers","deleteSticker","unshiftSticker","favedCategory","clearButton","titleLangKey","descriptionLangKey","langKey","clearRecentStickers","premiumCategory","apiManager","getLimit","getFavedStickersStickers","getRecentStickersStickers","getAllStickers","getPremiumStickers","isPremium","race","rendererLazyLoadQueue","faved","createStickersContextMenu","verifyRecent","unshiftRecentSticker","saveRecentSticker","deleteRecentSticker","generateDelimiter","delimiter","generateFakeIcon","isScam","LazyLoadQueueRepeat2","spliced","findAndSpliceAll","GifsMasonry","scrollPromise","processVisibleDiv","noInfo","noPreview","transitionTime","scrollableX","proxy","Proxy","apply","that","selectTarget","result1","canChange","mutateCallback","useStripe","indicator","currentIndicator","shiftLeft","scaleFactor","insertRichTextAsHTML","wrappingForPeerId","some","createCustomEmojiRendererForInput","fragment","wrapDraftText","customEmojiRenderer","contentEditable","richInputHandler","customEmojiElements","ces","documentFragmentToHTML","pre","getCaretPosNew","createTextNode","collapse","removeAllRanges","addRange","onBeforeInput","inputType","execCommand","removeExtraBOMs","findUpAttribute","noLinebreaks","originalEvent","clipboardData","getData","usePlainText","filterEntity","curChild","nextSibling","richValue","getRichValueWithCaret","lines","textLength","line","correctedText","entities2","parseEntities","mergeEntities","InputState","wrappingDraft","isSelectable","processCustomEmojisInInput","hasSet","connectedCallback","InputField","validate","maxLength","showLengthOn","canBeEdited","labelText","onInputCallbacks","isCollapsed","centerX","focusOnNext","clientX","isInputEmpty","inputMode","labelEl","showingLength","wasError","inputLength","isError","withLinebreaks","selectNodeContents","selectElementContents","labelOptions","fromSet","originalValue","isValidToChange","setDraftValue","setOriginalValue","setState","Valid","setError","InputSearch","prevValue","onClearClick","onClear","searchIcon","clearBtn","LazyLoadQueue","ignoreHeavyAnimation","getItem","addElement","LazyLoadQueueIntersector","inProcess","loadItem","intersectorTimeout","processQueue","MediaProgressLine","useTransform","progressRAF","onLoadedData","seek","setLoadProgress","onProgress","filledLoad","setSeekMax","buf","buffered","numRanges","nearestStart","end","percents","testQueue","pendingTest","setTestQueue","testElement","getElementWidth","mapped","firstTime","font","textWidth","elementWidth","newElementWidth","widthChanged","smallerText","smallerWidth","smallerTextLength","half","half1","substr","half2","MiddleEllipsisElement","PasswordMonkey","passwordInputField","needFrame","noCache","currentFrame","setSpeed","helpers","onVisibilityClickAdditional","passwordVisible","setDirection","curFrame","TrackingMonkey","playAnimation","frame","idleAnimation","PasswordInputHelpers","onVisibilityClick","toggleVisible","stealthy","tabIndex","PasswordInputField","PeerProfileAvatars","avatar","avatars","draggable","loadCallback","intersectionObserver","loadCallbacks","addTab","gradient","info","arrowPrevious","arrowNext","checkScrollTop","SWITCH_ZONE","freeze","_e","clickX","toRight","cancelNextClick","minX","lastX","SCALE","TRANSLATE_TEMPLATE","addIndex","loadNearestToTarget","setPeer","backLimit","filterChatPhotosMessages","chat_photo","generateFakeAvatarMessage","activeTab","photo_id","setText","PeerProfile","noDelimiter","bio","contextMenu","subtitleLangKey","isAnonymous","getUserPhone","link","notifications","togglePeerMute","appNotificationsManager","isPeerLocalMuted","respectType","setPeerStatus","setMoreDetails","n","fillUsername","userId","self","fillUserPhone","setAvatar","setPeerStatusInterval","setInterval","needClear","callbacks","useWhitespace","ignoreSelf","clearSetMoreDetailsTimeout","canBeDetailed","createAvatar","_setAvatar","isTopic","oldAvatars","getUsernamesAlso","usernames","also","anchorCopy","getPeerActiveUsernames","formatUserPhone","fillNotifications","notificationsRow","fillName","withIcons","fillRows","fillProfileElements","cleaned","_setMoreDetails","peerFull","getMiddlewarePromise","getServerMessageId","about","getChat","exportedInvite","exported_invite","address","setMoreDetailsTimeout","isPeerRestricted","acknowledged","getProfileByPeerId","setPromise","cached","middlewarePromise","makeError","clearInterval","generateTitleIcons","noVerifiedIcon","noFakeIcon","noPremiumIcon","verified","use2","generateVerifiedIcon","fake","scam","premium","emojiStatus","emoji_status","generatePremiumIcon","weakMap","WeakMap","PeerTitle","setOptions","setHasInner","hasInner","fromName","limitSymbols","topic","forumTopic","getTopicIconPromise","icons","topicIcon","getPeerTitle","withPremiumIcon","inner","createDocumentFragment","PopupAvatar","closable","withConfirm","cropper","crop","removeHandlers","h6","btnClose","cropContainer","file","files","readBlobAsDataURL","contents","onload","originalImage","cropComponent","cropImage","event_state","cropLeft","cropTop","cropWidth","cropHeight","scaledRatio","overlayColor","CROPWIDTH","offsetHeight","CROPHEIGHT","updateCropSize","updateCropImage","startMoving","resizing","keyHandler","imgZoom","bottom","newWidth","newHeight","clientHeight","String","fromCharCode","charCode","stopPropagation","container_width","container_height","container_left","container_top","mouse_x","scrollX","mouse_y","clientY","pageY","scrollY","saveEventState","moving","endMoving","currentTouch","complete","btnConfirm","toBlob","blob","darkenCanvas","onCrop","postCanvas","ctx","PopupDeleteDialog","onSelect","peerTitleElement","getDialogType","callbackLeave","flush","leave","flushHistory","callbackDelete","titleArgs","descriptionArgs","isDanger","titleLangArgs","descriptionLangArgs","PopupDeleteMessages","onConfirm","revoke","deleteScheduledMessages","deleteMessages","isMegagroup","_hasRights","canRevoke","PopupForward","peerIdMids","overrideOnSelect","peerTypes","forwardMessages","DEFAULT_APPEND_TO","appendPopupTo","onFullScreenChange","PopupElement","reAppend","titleRaw","MANAGERS","confirmShortcutIsSendShortcut","withoutOverlay","overlayClosable","attachScrollableListeners","btnConfirmOnEnter","buttonsEl","buttonsElements","langArgs","POPUPS","setClassOn","attachBorderListeners","onContentUpdate","popup","popupConstructor","ctor","addCancelButton","pin","descriptionPremium","descriptionLocked","folders","P","_a","limitPremium","isLocked","limitContainer","hint","free","setHintActive","showLimitPopup","appConfig","premium_purchase_blocked","times","ONE_HOUR","PopupMute","time","mutePeer","muteUntil","radioForm","PopupPeer","noTitle","o","original","nextElementSibling","PopupPickUser","PopupSendNow","sendScheduledMessages","ANIMATION_GROUP","PopupStickers","stickerSetInput","isEmojis","onStickersClick","updateAdded","stickersFooter","onStickerSetUpdate","_set","updateButton","loadStickerSet","createStickerSetElements","headerRow","buttonRight","added","itemsContainer","setsPromises","isArray","firstSet","isStickerPack","onSend","containersPromises","docIds","toggleStickerSets","isAdd","buttonAppend","installed","ProgressivePreloader","detached","isUpload","attachMethod","loadFunc","constructContainer","bold","constructDownloadIcon","downloadSvg","cancelSvg","previousElementSibling","func","startTime","onEnd","notify","elapsedTime","TRANSITION_TIME","addNotifyListener","useRafs","getTotalLength","strokeDasharray","putAvatar","renderThumbPromise","thumbImage","isFullLoaded","loadThumbPromise","stripped_thumb","getPreviewURLFromBytes","sequentialDom","renderPromise","myId","getForumTopic","setProperty","getPeerColorById","forum","avatarAvailable","avatarRendered","appAvatarsManager","isAvatarCached","first_name","last_name","getPeerInitials","returnDiv","setButtonLoader","RadioField","alignRight","RadioForm","radios","form","RangeSelector","events","setFilled","filled","stepStr","decimals","_removeListeners","rectMax","offsetAxisValue","rippleClickId","attachListenerTo","handler","drawRipple","clickId","_handler","touchStartFired","clickY","isRippleUnneeded","touchEnd","setContent","Row","checkboxFieldOptions","radioField","noWrap","subtitleRight","subtitleRow","createRow","subtitleLangArgs","isToggle","withCheckboxSubtitle","titleRightContent","titleRightSecondary","titleRow","createTitle","navigationTab","buttonRightLangKey","_subtitle","createSubtitle","midtitle","_midtitle","createMidtitle","createMedia","disableWithPromise","makeSortable","sortIcon","toggleSorting","CreateRowFromCheckboxField","RadioFormFromRows","RadioFormFromValues","checkedRadioField","ScrollableBase","logPrefix","onScrollMeasure","lastScrollPosition","lastScrollDirection","isHeavyAnimationInProgress","needCheckAfterAnimation","cancelMeasure","onScrolledTop","scrollPosition","scrollProperty","addScrollListener","addedScrollListener","removeScrollListener","removeHeavyAnimationListener","Scrollable","onScrollOffset","withPaddingContainer","maxScrollTop","isScrolledDown","getDistanceToEnd","setScrollTopSilently","ignoreNextScrollEvent","ScrollableX","splitCount","scrollHorizontally","deltaX","scrollWidth","SettingSection","fakeGradientDelimiter","hr","generateContentElement","nameArgs","captionOld","captionArgs","generateSection","AppNewGroupTab","isGeoChat","setTitle","inputWrapper","groupNameInputField","groupLocationInputField","valueCheck","userLocationCoords","userLocationAddress","createChannel","geo_point","megagroup","inputFile","editPhoto","inviteToChannel","createChat","chatsSection","new","startLocating","geolocation","getCurrentPosition","lat","coords","latitude","long","longitude","uri","json","display_name","GeolocationPositionError","PrivacyType","getPrivacyRulesDetails","rules","types","allowPeers","users","chats","disallowPeers","rule","PrivacySection","onRadioChange","captions","captionElement","radioSection","exceptions","radioRows","skipTypes","noExceptions","exceptionTexts","exception","_peerIds","slider","createTab","skippable","takeOut","newPeerIds","generateStr","splitPeersByType","selectedPeerIds","appPrivacyManager","getPrivacy","inputKey","setRadio","k","eventListener","chatKey","usersKey","getUserInput","setPrivacy","AppPrivacyPhoneNumberTab","getSelf","captionEl","mePath","phoneSection","sCaption","AppTwoStepVerificationSetTab","stickerContainer","inputContent","btnReturn","sliceTabsUntilTab","AppSettingsTab","canFocus","isFirstInput","AppTwoStepVerificationEmailConfirmationTab","isFirst","email","codeInputField","passwordManager","confirmPasswordEmail","goNext","btnChange","btnResend","cancelPasswordEmail","AppTwoStepVerificationEmailTab","resendPasswordEmail","onOpenAfterTimeout","onContinueClick","btnContinue","btnSkip","matchEmail","toggleButtons","updateSettings","currentPassword","plainPassword","newPassword","symbols","AppTwoStepVerificationHintTab","onSkipClick","saveHint","AppTwoStepVerificationReEnterPasswordTab","monkey","verifyInput","AppTwoStepVerificationEnterPasswordTab","isNew","has_password","textEl","getStateInterval","getState","_state","check","auth","AppTwoStepVerificationTab","removeTabFromHistory","btnChangePassword","btnDisablePassword","btnSetRecoveryEmail","has_recovery","btnSetPassword","AppPrivacyLastSeenTab","AppPrivacyProfilePhotoTab","AppPrivacyForwardMessagesTab","AppPrivacyAddToGroupsTab","AppPrivacyCallsTab","AppActiveSessionsTab","Session","app_name","app_version","ip","date_active","date_created","device_model","system_version","platform","authorizations","session","btnTerminate","invokeApi","otherSection","onError","onTerminateClick","menuElement","AppBlockedUsersTab","btnAdd","toggleBlock","bot","blocked","getBlocked","convertKeyToInputKey","toUpperCase","AppPrivacyVoicesTab","AppActiveWebSessionsTab","sessions","bot_id","region","domain","browser","appSeamlessLoginManager","resetWebAuthorizations","leftLength","resetWebAuthorization","AppPrivacyAndSecurityTab","fromTab","getAppConfig","globalPrivacy","getGlobalPrivacySettings","contentSettings","webAuthorizations","getWebAuthorizations","SUBTITLE","blockedPeerIds","blockedUsersRow","passwordState","twoFactorRowOptions","email_unconfirmed_pattern","twoFactorRow","activeSessionsRow","updateActiveSessions","websitesRow","updateActiveWebsites","websites","setBlockedCount","updateBlocked","rowsByKeys","numberVisibilityRow","lastSeenTimeRow","photoVisibilityRow","callRow","linkAccountRow","groupChatsAddRow","voicesRow","updatePrivacyRow","disallowLength","allowLength","destroyed","setGlobalPrivacySettings","archive_and_mute_new_noncontact_peers","settings","onPremiumToggle","autoarchive_setting_available","_enabled","sensitive_enabled","sensitive_can_change","payment","appPaymentsManager","clearSavedInfo","deleteButton","appDraftsManager","clearAllDrafts","auths","averageColorFromCanvas","pixel","getImageData","pixelsLength","outPixel","Uint8ClampedArray","highlightningColor","rgba","l","ColorPicker","hue","saturation","lightness","onGrabStart","documentElement","boxDragger","onGrabEnd","sliders","hueDragger","hexInputField","rgbInputField","inputs","valid","setColor","rgbRegExp","attachBoxListeners","attachHueListeners","attachGrabListeners","boxRect","saturationHandler","hueRect","hueHandler","updateHexInput","updateRgbInput","rgb","boxX","percentY","boxY","percentHue","hueX","updatePicker","getCurrentColor","rgbaArray","hexa","hsl","hsla","clamp","maxX","maxY","posX","posY","lightnessX","lightnessY","AppBackgroundColorTab","_applyColor","updateColorPicker","colorPicker","background","theme","intensity","slug","appStateManager","pushToState","onColorChange","applyColor","themeController","gridSection","grid","backgroundColor","throttle","isColored","AppBackgroundTab","clicked","wallPapersByElement","elementsByKey","onUploadClick","accept","requestFile","endsWith","createObjectURL","mimeType","scaleMediaElement","File","wallPaper","prepareWallPaperUpload","uploadPromise","uploadWallPaper","uploadDeferred","newKey","getWallPaperKey","setBackgroundDocument","addWallPaper","onResetClick","defaultTheme","blurCheckboxField","onGridClick","wallpaper","saveToCache","_tempId","onReady","getPixelPromise","getColorsFromWallPaper","imageUrl","imageSource","ratio","averageColorFromImageSource","averageColor","toDataURL","getWallPaperKeyFromTheme","backgrounds","getInitArgs","uploadButton","colorButton","resetButton","pattern","wallPapers","gridContainer","background_color","second_background_color","third_background_color","fourth_background_color","hasFile","isDark","dark","webkitMaskImage","AppQuickReactionTab","appReactionsManager","getQuickReaction","getAvailableReactions","quickReaction","availableReactions","reaction","inactive","availableReaction","static_icon","setDefaultReaction","emoticon","RangeSettingSelector","initialValue","minValue","writeValue","nameDiv","valueDiv","valueContainer","AppGeneralSettingsTab","chatBackgroundButton","initArgs","animationsCheckboxField","enterRow","ctrlEnterRow","kilometersRow","milesRow","formats","format","runFirst","getNextTimeout","_callback","run","eachTimeout","getSeconds","eachMinute","toLocaleTimeString","hour","minute","suggestCheckboxField","bigCheckboxField","reactionsRow","renderQuickReaction","getCustomEmojiDocument","document_id","loopCheckboxField","stickerSets","stickersContent","allStickers","assumeType","AppChatFoldersTab","filtersRendered","animationData","lottieLoader","renderFolder","dialogFilter","non_contacts","broadcasts","bots","folder","getFolderDialogs","channels","isAnyGroup","filtersStorage","getFilter","setInitFilter","localId","createFolderBtn","foldersSection","suggestedSection","canCreateFolder","onFiltersContainerUpdate","renderFiltersPromise","toggleAllChats","getSuggestedFilters","loadAnimationPromise","onSort","prevIdx","newIdx","updateDialogFiltersOrder","getDialogFilters","getSuggestedDialogsFilters","suggestedFilters","includePeerIds","excludePeerIds","pinnedPeerIds","createDialogFilter","AppNotificationsTab","NotifySection","enabledRow","typeText","previewEnabledRow","inputNotifyPeer","getNotifySettings","notifySettings","applySettings","isMuted","show_previews","mute","showPreviews","inputSettings","mute_until","updateNotifySettings","notify_settings","contactsSignUpRow","soundRow","sound","getContactSignUpNotification","setContactSignUpNotification","AppLanguageTab","languages1","lang_pack","languages2","rendered","webLangCodes","language","lang_code","native_name","langPack","autoDownloadPeerTypeSection","contactsCheckboxField","privateCheckboxField","groupsCheckboxField","channelsCheckboxField","AppAutoDownloadPhotoTab","AppAutoDownloadFileTab","debouncedSave","sizeMax","setByKey","MIN","MAX_RANGE","MAX","upTo","formatBytes","compareAndUpdate","AppAutoDownloadVideoTab","AUTO_DOWNLOAD_FOR_KEYS","private","AppDataAndStorageTab","autoCheckboxField","autoDownloadNew","autoRow","deepEqual","setSubtitles","setAutoDownloadSubtitle","photoRow","videoRow","fileRow","file_size_max","openTab","tabConstructor","onDisabledChange","peerKeys","enabledKeys","isAll","logOut","edit","profile","fillPromise","changeAvatarBtn","upload","uploadProfilePhoto","updateChangeAvatarBtn","languageArgs","devicesRow","languageRow","buttonsSection","getEditProfileArgs","editProfileArgs","getAuthorizations","overwrite","getAuthorizationsPromise","AppNewChannelTab","channelNameInputField","channelDescriptionInputField","onLengthChange","broadcast","channelId","PopupCreateContact","importContact","nameInputField","lastNameInputField","telInputField","editPeer","AppContactsTab","openContacts","isContact","sortedUserList","createList","renderPage","AppArchivedTab","wasFilterId","ul","AppPeopleNearbyTab","isLocationWatched","parseDistance","startWatching","latestLocationSaved","getLocated","accuracy","watchPosition","isLongitudeDifferent","isLatitudeDifferent","distanceCheck","calculateDistance","stopWatching","lat1","long1","lat2","long2","asin","LEFT_COLUMN_ACTIVE_CLASSNAME","AppSidebarLeft","sidebarEl","sidebarHeader","onContactsClick","backBtn","btnArchive","isDialogsLoaded","themeCheckboxField","sessionStorage","kz_version","toolsBtn","btnMenuFooter","rel","archivedCount","newBtnMenu","updateBtn","reload","initSearch","unreadPeerIds","formatNumber","checkUpdateInterval","cache","status","ok","hasUpdate","onResize","searchContainer","pickedElements","selectedPeerId","selectedMinDate","selectedMaxDate","updatePicked","removeProperty","helper","unselectEntity","renderEntity","dates","dateData","pushRecentSearch","peopleContainer","hideNewBtnMenuTimeout","transition","activeClassName","onFocus","clearRecentSearchBtn","clearRecentSearch","appSidebarLeft","AppAddMembersTab","attachToPromise","isPrivacy","removeLoader","AppIncludedChatsTab","getContacts","foundInFilters","dialogsByFilters","onSelectChange","confirmBtn","editFolderTab","originalFilter","cmp","pinned_peers","other","otherLegacy","getInputPeerById","setFilter","onAppConfig","dialog_filters_chats_limit_premium","dialog_filters_chats_limit_default","categoriesSection","exclude_muted","ico","exclude_archived","exclude_read","selectedPeers","addedInitial","_add","flag","hasOwnProperty","AppEditFolderTab","flags","deleteFolderButton","updateDialogFilter","bool","menuBtn","inputSection","generateList","h2Text","to","includedFlagsContainer","excludedFlagsContainer","include","include_peers","editCheckForChange","reloadMissingPromises","reloadMissingPeerIds","onEditOpen","onCreateOpen","ignoreClick","hasPeer","getDialogOnly","filtered","filterAsync","renderMore","_length","exclude_peers","purchaseUsernameCaption","purchaseText","setUsername","AppEditProfileTab","bioMaxLength","userFull","firstNameInputField","bioInputField","usernameInputField","isPurchase","availableText","takenText","invalidText","profilePromise","updateProfile","updateUsername","RIGHT_COLUMN_ACTIVE_CLASSNAME","AppSidebarRight","canHideFirst","isColumnProportionSet","toggleSidebar","setColumnProportion","createSharedMediaTab","replaceSharedMediaTab","previousTab","sharedMediaTab","historyTabIds","_selectTab","getFrom","setFrom","onCloseTab","isNavigation","willChange","animationPromise","appSidebarRight","AppEditContactTab","privacy","notificationsCheckboxField","profileNameDiv","profileSubtitleDiv","phoneRow","privacyRule","sharePhoneCheckboxField","btnDelete","deleteContacts","addContact","mediaSize","AppEditTopicTab","colorIndex","isGeneral","originalTopic","iconDiv","icon_emoji_id","setIcon","editForumTopic","topicId","iconEmojiId","createForumTopic","iconColor","onDestroy","emojiElement","icon_color","force","isMainIcon","newTopic","oldTopic","oldEl","applyFadeAnimation","fadeIn","iterations","easing","AppChatTypeTab","privateRow","publicRow","privateSection","publicContainer","chatUpdateListeners","basic","linkRow","btnRevoke","getChatInviteLink","publicSection","linkInputField","applyBtn","getValue","head","usernamesSection","getPeerEditableUsername","wasUsername","migrateChat","makeChannelPrivate","toggleNoForwards","onChatUpdate","noforwards","addChatUpdateListener","AppUserPermissionsTab","destroyListener","ChatPermissions","rights","banned_rights","editBanned","btnDeleteException","clearChannelParticipantBannedRights","kickFromChannel","exceptionText","toggleWith","defaultBannedRights","default_banned_rights","defaultRights","combineParticipantBannedRights","restrictionText","mainFlag","until_date","AppGroupPermissionsTab","chatPermissions","editChatDefaultBannedRights","addExceptionRow","openPermissions","getChannelParticipant","setSubtitle","bannedRights","cantWhat","getPeerId","setLength","exceptionsCount","loader","setLoader","getPromise","migrateFrom","migrateTo","AppChatReactionsTab","getActiveAvailableReactions","_chatReactions","available_reactions","chatReactions","reactions","makeReactionFromEmoticons","getCaptionLangPackKey","toggleSection","reactionsSection","toggleCheckboxFieldsByEmoticons","checkboxFieldsByEmoticon","toggleCheckboxField","toggleRow","save","checkboxFields","every","saveReactionsDebounced","allow_custom","saveReactions","setChatAvailableReactions","isDebounced","AppEditChatTab","_init","canChangeType","canChangePermissions","canManageTopics","getCachedFullChat","chatNameInputField","descriptionInputField","chatTypeRow","setChatTypeSubtitle","availableReactionsLength","setReactionsLength","chatAvailableReactions","permissionsRow","setPermissionsLength","forum_upgrade_participants_min","topicsRow","setTopics","toggleForum","editTitle","editAbout","signMessagesCheckboxField","signatures","toggleSignatures","showChatHistoryCheckboxField","togglePreHistoryHidden","hidden_prehistory","historiesStorage","AppSharedMediaTab","newCloseBtn","closeBtn","animatedCloseIcon","transitionContainer","transitionFirstItem","titleI18n","editBtn","transitionLastItem","secondTitle","setIsSharedMedia","isSharedMedia","isHeavy","onCloseBtnClick","toggleEditBtn","renderNewMessage","msgs","deleteDeletedMessages","btnAddMembers","showConfirmation","addChatUser","_renderNewMessage","getMessageThreadId","_deleteDeletedMessages","setLoadMutex","peerChanged","changeTitleKey","loadSidebarMedia","destroyable","SetTransition","raf","afterTimeout","SidebarSlider","closeTab","closingId","getMiddleware","onOpenTab","preserveTab","getTab","getHistory","isTabExists","deleteTab","doNotAppend","SliderSuperTab","_constructor","SliderSuperTabEventable","dispatchResultableEvent","SortedUserList","getIndex","getUserStatusForSort","onDelete","listEl","onListLengthChange","onUpdate","willChangeLength","onElementCreate","base","updateElementWith","updateListWith","createChatListOptions","doTimeout","updateList","SORT_INTERVAL","hasViewer","attachStickerViewerListeners","findTarget","originalFindTarget","checkForParent","closest","mediaContainer","previousGroup","_middleware","previousTransformer","doThatSticker","lockGroups","isSwitching","effectThumb","mediaRect","boxSize","fitted","aspectFitted","transformer","transformX","transformY","needFadeIn","withThumb","relativeEffect","loopEffect","firstFramePromise","prevPlayer","ready","onMousePreMove","newMediaContainer","_previousTransformer","StickyIntersector","observeHeaders","observeElements","headersObserver","targetInfo","boundingClientRect","stickyTarget","rootBoundsInfo","rootBounds","threshold","elementsObserver","addSentinel","sentinel","headerSentinel","getEvent","attachGlobalListenerTo","RESET_GLOBAL","TOUCH_MOVE_OPTIONS","MOUSE_MOVE_OPTIONS","SwipeHandler","handleMove","setCursorTo","hadMove","resetValues","handleStart","isMouseDown","withDelay","xDown","yDown","eventUp","onStart","xUp","yUp","xAdded","yAdded","onSwipeResult","listenerOptions","setCursor","TelInputField","pasted","lastValue","telEl","HTMLInputElement","pixelRatio","letterSpacing","IS_ANDROID","originalFunc","formattedPhoneNumber","leftPattern","shiftKey","toastEl","hideToast","toastNew","transitions","navigation","prevTabContent","animateFirst","withAnimationListener","animationFunction","_animateFirst","onTransitionEndCallbacks","animationDeferred","listenerName","onEndEvent","overrideFrom","onTransitionEndCallback","transitionTimeout","_from","isUsernameValid","UsernameInputField","checkUsernameDebounced","checkUsername","checkUsernamePromise","checkPromise","available","UsernamesSection","CLASS_NAME","_usernames","sortedList","editable","changeActive","applyUsernames","getAll","_peerId","cancelClick","newActive","toggleUsername","reorderUsernames","VisibilityIntersector","locked","change","refreshVisible","VolumeSelector","onMuteClick","setVolume","iconIndex","ICONS","wrapCustomEmoji","repeat","wrapCustomEmojiAwaited","wrapDocument","noAutoDownload","uploadFileName","audioElement","extSplitted","ext","docDiv","icoDiv","icoTextEl","hadContext","hasThumb","performance","fileName","bytesContainer","descriptionParts","bytesMaxEl","sizeDiv","_downloadDiv","addByteProgress","sizeContainer","_bytesContainer","_d","canOpenAfter","downloadFileName","downloadId","apiFileManager","isDownloading","support","was_online","today","getDate","dateEl","timeEl","toggleMediaSpoiler","reveal","destroyAfter","onMediaSpoilerClick","wrapMediaSpoiler","wrapMediaSpoilerWithImage","wrapMessageActionTextNew","plain","hadColors","wrapJoinVoiceChatAnchor","wrapUrl","wrapLinkToMessage","savedFrom","dir","wrapSomeText","htmlToSpan","wrapTopicIcon","ns","contentSpan","gradientId","strokeColor","clone","topicAvatar","wrapMessageActionTopicIcon","wrapMessageActionTopicIconAndName","wrapMessageActionTextNewUnsafe","unsafeMessage","getNameDivHTML","formatCallDuration","post","schedule_date","daysToStart","tomorrowDate","_args","day","pinnedMessage","reply_to_mid","fetchMessageReplyTo","user_id","joined","anchorHTML","isRecurringInit","recurring_init","isRecurringUsed","recurring_used","paymentsWrapCurrencyAmount","total_amount","currency","invoiceMessage","reply_to","reply_to_peer_id","period","titleElement","authorElement","isMe","isIconChanged","isIconRemoved","isTitleChanged","isHiddenChanged","closed","waited","wrapMessageForReply","usingMids","withoutMediaType","hasAlbumKey","addPart","part","isRestricted","usingFullAlbum","grouped_id","getMidsByMessage","albumText","getAlbumText","poll","question","game","extended_media","actionWrapped","restriction_reason","exec","messageWrapped","noLinks","noTextFormat","wrapPeerTitle","wrapPhoto","withTail","noThumb","blurAfter","isImageFromDocument","startsWith","isWebDoc","isFit","renderOnLoad","canAttachPreloader","haveToDownload","onlyCache","getDownloadPromise","wrapSenderToPeer","senderTitle","fromMe","wrapSentTime","STICKER_EFFECT_MULTIPLIER","locksUrls","videosCache","wrapSticker","loadStickerMiddleware","exportLoad","needUpscale","skipRatio","asStatic","fullThumb","noPremium","isCustomEmoji","syncedVideo","stickerType","emojiSticker","animatedSticker","staticSticker","isAnimated","getStickerEffectThumb","willHaveLock","lockUrl","toneIndex","isThumbNeededForType","lottieCachedThumb","getLottieCachedThumb","haveThumbCached","afterRender","num","getPathFromBytes","getPreviewURLFromThumb","stickerThumbConverted","webpWorkerController","saveWebPConvertedStrippedThumb","getImageFromStrippedThumb","middlewareError","sync","setLockColor","skipx","skipy","imageData","sr","sg","sb","sa","outCanvas","outContext","computeLockColor","saveLottiePreview","onFirstFrame","preloadAnimatedEmojiStickerAnimation","isSingleVideo","cacheName","framesCache","cachePromise","previousTime","playedTimes","onTimeupdate","mediaLength","lastPromise","_media","preloadSticker","playing","animationDiv","stickerPromise","side","attachStickerEffectHandler","onEmojiStickerClick","getAnimatedEmojiSoundDocument","restart","getAnimatedEmojiSticker","emojiData","sendInteractionThrottled","msg_id","interaction","JSON","stringify","withRandomOffset","wrapStickerAnimation","unmountAnimation","frameNo","maxFrame","vibrate","generateRandomSigned","randomOffsetX","randomOffsetY","setPosition","factor","stableOffsetX","stableOffsetY","rectX","rectY","addOffsetX","addOffsetY","wrapStickerEmoji","wrapStickerSetThumb","downloadOptions","getStickerSetThumbDownloadOptions","videos","getDocPromise","thumb_document_id","wrapStickerToRow","previousMedia","_size","wrapTopicNameButton","roundVideoCircumference","wrapVideo","videoSize","noAutoplayAttribute","isAlbumItem","canAutoplay","spanTime","spanPlay","needPlayButton","photoRes","divRound","halfSize","strokeDashoffset","globalVideo","onPaused","onFrame","renderDeferred","loadPhotoThumbFunc","wrapWebPageDescription","shortDescriptionText","wrapWebPageTitle","shortTitle","site_name","EmojiVersions","Emoji","version","FontFamily","FontSize","FontWeight","instances","getAnimationInstance","cancelAnimationByKey","instance","isCancelled","animateSingle","tick","createAnimationInstance","array","AudioAssetPlayer","assets","playSound","assetName","createAudio","playSoundIfDifferent","Audio","stopSound","cancelDelayedPlay","playSoundWithTimeout","heavyQueue","processingQueue","addHeavyTask","processHeavyQueue","todo","possiblePromise","process","realResult","timedChunk","requireBlurPromise","fastBlurFunc","processBlurNext","default","dataUri","JPEG_HEADER","bytesFromHex","JPEG_TAIL","getPreviewBytesFromURL","needle","jpegBytes","atob","char","charCodeAt","isSticker","convertToUint8Array","dataURL","btoa","bytesToDataURL","calcImageInBox","imageW","imageH","boxW","boxH","noZoom","boxedImageW","boxedImageH","getTextWidth","measureText","source","createImageBitmap","resizeWidth","resizeHeight","quality","badCharsRe","trimRe","C2L","clearBadCharsAndTrim","latinize","processSearchText","clearBadChars","ignoreCase","hasTag","includeTag","charAt","originalText","ch","latinizeCh","latinizeString","fixCyrillic","fallbackCopyTextToClipboard","textArea","removeChild","copyTextToClipboard","clipboard","writeText","ContextMenuController","diffX","diffY","isOpened","openBtnMenu","months","days","ONE_DAY","getWeekNumber","UTC","getMonth","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","formatDateAccordingToTodayNew","weekday","formatFullSentTimeRaw","formatTime","capitalize","textTransform","formatFullSentTime","getFullDate","joiner","monthAsNumber","getHours","getMinutes","noSeconds","leadingZero","noTime","minYear","yearPattern","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","setFullYear","dayOfWeek","formatWeekLong","getDay","getDayOfWeek","setTime","g1","g2","createForDayMonth","createForMonthYear","selectedYear","currentYear","g3","validDateForMonth","formatterYearMax","k1","setMonth","formatterMonthYear","formatterDayMonth","T_ME","copyWhat","copyText","_cancelContextMenuOpening","_cancelContextMenuOpeningTimeout","cancelContextMenuOpening","onCancel","onMove","isTouch","onTouchEnd","CLICK_EVENT_NAME","touchMouseDown","detachClickEvent","simulateClickEvent","ControlsHover","setHideTimeout","hideControlsTimeout","isShown","controlsLocked","toggleControls","relatedTarget","createContextMenu","findElement","filterButtons","onBeforeOpen","initResult","verifyFavoriteSticker","toAdd","favedStickers","_doc","disablePictureInPicture","computedStyle","getProperty","simulateEvent","childNodes","tag","requestFullScreen","requestFullscreen","mozRequestFullScreen","webkitRequestFullscreen","msRequestFullscreen","cancelFullScreen","mozCancelFullScreen","webkitCancelFullScreen","msExitFullscreen","addFullScreenListener","addListener","eventName","getFullScreenElement","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","msFullscreenElement","isFullScreen","getCaretPosF","childNodesLength","alt","markdownTags","entityName","underline","italic","monospace","strikethrough","mentionName","BLOCK_TAGS","BOM_REG_EXP","checkNodeForEntity","follow","getRichElementValue","selNode","selOffset","isBlock","isTableCell","wasEntitiesLength","wasLength","field","withEntities","withCaret","DocumentFragment","startOffset","startContainer","possibleChildrenFocusOffset","getCaretPos","caretPos","getViewportSlice","overflowRect","extraSize","invisibleTop","invisibleBottom","foundVisible","lookForSticky","overflowTop","overflowRight","overflowBottom","overflowLeft","sticky","windowWidth","windowHeight","handleHorizontalSwipe","cancelY","template","isSendShortcutPressed","isComposing","secondaryKey","isSwipingBackSafari","TouchEvent","placeCaretAtEnd","ignoreTouchCheck","selectionStart","selectionEnd","prevPos","backgroundImage","useCache","isImage","renderImageFromUrlPromise","renderMediaWithFadeIn","compareNodes","node1","node1Offset","node2","node2Offset","parents","commonAncestorContainer","NOT_ONLY_BOMS_REG_EXP","USING_BOMS","RichInputHandler","saveSelectionOnChange","saveRangeForElement","onFocusOut","lastNode","lastOffset","onSelectionChange","setSelectionClassName","caret","getCaretPosN","move","superMove","modify","getFiller","addInputCallback","processEmptiedFillers","fixInsertedLineBreaks","moveFirst","setEnd","isBOM","deleteData","processFilledFillers","removeEmptyTextNodes","fixBuggedCaret","savedRanges","IS_FIREFOX","inputCaptureCallbacks","anchorNode","findPreviousSmthIndex","something","fromSelectionChange","smthIndex","moved","idxidx","rangeString","onlyBOMs","restoreSavedRange","makeFocused","newCallback","sibling","needed","treeWalker","createTreeWalker","NodeFilter","SHOW_TEXT","acceptNode","FILTER_REJECT","FILTER_ACCEPT","textNode","nextNode","removePossibleBOMSiblings","removePossibleBOMSiblingsByNode","cleanSiblings","insertData","bomNode","intersectsNode","focusNode","focusNodeBefore","focusOffset","focusOffsetBefore","collapseToStart","collapseToEnd","focusNodeAfter","focusOffsetAfter","prepareApplyingMarkdown","fillers","smths","INSTANCE","Sortable","minY","elementRect","lastSiblings","siblings","property","getSortableTarget","scrollableRect","toEnd","addScrollPos","scrollPos","startScrollPos","isVertical","countNonElements","DropdownHover","onClickOut","ignoreButtons","ignoreMouseOut","toElement","willBeActive","inited","timeouts","attachButtonListener","setIgnoreMouseOut","onmouseout","onmouseover","FocusDirection","fastSmoothScroll","maxDistance","Static","scrollWithJs","getNormalSize","rectStartKey","rectEndKey","sizeKey","scrollSizeKey","elementScrollSizeKey","scrollPositionKey","possibleElementPosition","containerSize","scrollSize","fallbackToElementStartWhenCentering","remainingPath","absPath","startAt","shortTransition","longTransition","currentPath","distanceToEnd","FILENAME_JOINER","getFileNameByLocation","thumb_size","big","stickerset","short_name","thumb_version","volume_id","local_id","strictDecimals","_decimals","dm","fixed","pow","parseFloat","CALL_DURATION_LANG_KEYS","mm","showLast","dd","formatDuration","strings","prefixes","maxPrefixLength","setPrefix","originalStr","prefixCountry","patterns","searchForPattern","mostMatchedPatternMatches","mostMatchedPattern","_pattern","patternMatches","symbol","FramesCache","framesNew","framesURLs","getCache","createCache","releaseCache","getCacheCounter","generateName","arcParameter","rx","ry","xAxisRotation","largeArcFlag","sweepFlag","tl","tr","bl","useBlur","ignoreCache","ListLoader","loadedAllDown","setLoaded","unsetCurrent","toPrevious","goUnsafe","down","loadPromiseDown","loadPromiseUp","processedArr","processed","ListenerSetter","listeners","addManual","onceCallback","onceFired","_listener","MediaSize","aspect","aspectCovered","makeMediaSize","ScreenSize","CUSTOM_EMOJI_SIZE","ESG_CUSTOM_EMOJI_SIZE","EMOJI_STATUS_SIZE","MediaSizes","screenSizes","mobile","medium","large","handhelds","regular","album","esgSticker","documentName","invoice","extendedInvoice","customEmoji","esgCustomEmoji","popupSticker","desktop","isMobile","handleResize","innerWidth","activeScreen","wasScreen","rAF","throwWhat","numberThousandSplitter","HAVE_METADATA","useCanplayOnIos","loadEventName","errorEventName","OverlayClickHandler","withOverlay","amount","skipSymbol","isNegative","currencyData","amountExp","exp","number","dec_point","thousands_sep","isFinite","prec","sep","dec","toFixedFix","number_format","decimal_sep","space_between","symbol_left","splitter","additionalPadding","getScrollWidthFromElement","menuWidth","menuHeight","paddingRight","paddingBottom","paddingLeft","verticalSide","maxTop","maxLeft","minLeft","sides","intermediateX","intermediateY","possibleSides","platforms","getRestrictionReason","reasons","reason","savingLottiePreview","isSavingLottiePreview","saving","throttleWithRaf","fn","schedulerFn","waiting","throttleWith","ScrollableLoader","SearchListLoader","messageId","generateMessageId","filterMids","onHistoryDelete","shouldBeDeleted","onHistoryMultiappend","onMessageSent","isInner","otherSideLoader","filterMessagesByInputFilterFromStorage","goToOtherEnd","do","kind","scheduleFlush","measure","mutate","mutateElement","read","write","pushDocumentSize","_isWebDocument","replies","comments","channel_id","BatchProcessor","bindPrefix","queuePromise","addToQueue","setQueue","possibleError","perf","renderedQueue","SortedList","batchProcessor","_updateList","canUpdate","createPromise","noScheduler","encodeEntities","limitFrom","leadZero","sec_num","hours","minutes","seconds","textToSvgURL","Blob","reader","FileReader","readAsDataURL","visualViewport","innerHeight","ANIMATION_START_EVENT","ANIMATION_END_EVENT","isAnimating","heavyAnimationPromise","promisesInQueue","dispatchHeavyAnimationEvent","_heavyAnimationPromise","onHeavyAnimationEnd","interruptHeavyAnimation","getHeavyAnimationPromise","handleAnimationStart","handleAnimationEnd","DialogsContextMenu","onArchiveClick","editPeerFolders","folder_id","hideTopic","toggleTopic","onPinClick","toggleDialogPin","onUnmuteClick","onUnreadClick","unread_count","readHistory","top_message","markDialogUnread","onContextMenu","getDialogOrTopic","getDeleteButtonText","isDialogUnread","pinned","ConnectionStatusComponent","hadConnect","connecting","timedOut","updating","setConnectionStatus","overrideStatus","baseDcId","connectionStatus","setFirstConnectionTimeout","online","apiUpdatesManager","forceGetDifference","retryAt","setStatusText","currentLangPackKey","statusEl","statusPreloader","singleInstance","CHANGE_STATE_DELAY","getA","networkerFactory","forceReconnect","timerSpan","interval","forceReconnectTimeout","setStateTimeout","statusContainer","SENDING_STATUS","easeInOutSine","easeInOutSineApply","roundRect","defaultRadius","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","DPR","SIZE","MARGIN","WIDTH","RADIUS","Shimmer","currTime","diffTime","spread","pausedTime","pauseInterval","lightSource","lightSpread","currentAnimationIndex","keepTime","cycleAnimation","currentAnimation","animateGlow","animateSlide","smartInc","lightLeft","lightRight","lightCenter","createLinearGradient","customProperties","shimmerColor","addColorStop","dict","on","fillText","DialogsPlaceholder","onThemeChange","stopAnimation","startAnimation","updateCanvasSize","shimmer","generatedValues","marginVertical","totalHeight","lineHeight","lineBorderRadius","lineMarginVertical","statusWidth","getRectFrom","onRemove","blockScrollable","overflowY","availableLength","detachTime","renderDetachAnimationFrame","globalCompositeOperation","completed","elapsedRowTime","dialogHeight","renderFrame","createPattern","patternCanvas","patternContext","drawChat","firstLineWidth","secondLineWidth","marginLeft","drawCircle","drawCircleFromStart","shake","keyframes","setPromiseMiddleware","oldPromise","SortedDialogList","getDialogIndex","forumPeerId","indexKey","addListDialog","isBatch","isMainList","DialogElement","bigger","abitbigger","small","captionDiv","titleSpanContainer","peerTitlePromise","statusSpan","lastTimeSpan","rightSpan","dialogDom","setDialogActive","forumTab","createUnreadBadge","unreadBadge","badge","createUnreadAvatarBadge","unreadAvatarBadge","createMentionsBadge","mentionsBadge","toggleBadgeByKey","hasBadge","justCreated","ForumTab","init2","isFloating","toggleForumTab","createChatList","setListClickListener","xd","Some3","bindScrollable","getOptionsForMessages","fullReset","subscribeToChannelUpdates","unsubscribeFromChannelUpdates","setStatusPromise","noTyping","onChatsScroll","loadResult","setStatus","NOT_IMPLEMENTED_ERROR","Some","onChatsRegularScroll","sliceTimeout","processContact","scrollTopWas","rectContainer","rectTarget","firstY","lastY","firstElement","elementFromPoint","lastElement","elementOverflow","sliceFromStart","sliceFromEnd","deleteDialogByKey","getDialogKeyFromElement","setOffsets","offsets","getOffsetIndex","isDialogMustBeInViewport","topOffset","bottomOffset","setIndexKey","deleteDialog","getDialogKey","updateDialog","loadedDialogsAtLeastOnce","getDialogElement","setLastMessageN","setUnread","onChatsScrollTop","loadDialogs","createPlaceholder","placeholderOptions","getRectFromForPlaceholder","loadDialogsPromise","loadDialogsRenderPromise","cachedInfoPromise","chatList","getConversationsResult","loadDialogsInner","needPlaceholderAtFirstTime","isTopEnd","offsetDialog","firstDialog","lastDialog","getDialogFromElement","getDialogDom","oldTypingElement","newTypingElement","unsetTyping","paddingX","typings","topics","setUnreadMessagesN","drop","sidebarRect","currentOffsetIndex","needIndex","Some2","getUserStatus","setOnlineStatus","processDialogForCallStatus","validateDialogForFilter","getCachedDialogs","validateListForFilter","doNotRenderChatList","hasClassName","generateScrollable","getDialogIndexKey","sortedDialogList","testDialogForFilter","migratedTo","setCallStatus","callIcon","START_X","wasMounted","itemProgress","groupCallActiveIcon","call_active","call_not_empty","loadContacts","toggleAvatarUnreadBadges","sortedDialog","reuseClassNames","unreadContent","isUnreadAvatarBadgeMounted","unreadAvatarBadgeClassList","unreadBadgeClassList","AppDialogsManager","Log","menuScrollContainer","lastActiveElements","initedListeners","xds","onTabChange","_onListLengthChange","checkIfPlaceholderNeeded","hasContacts","removeContactsPlaceholder","updateContactsLength","dialogSize","verifyPeerIdForContacts","getProxiedManagers","stateMiddlewareHelper","bottomPart","forumsTabs","forumsSlider","allChatsIntlElement","isFilterIdAvailable","clearCurrent","showFiltersPromise","onStateLoaded","setFilterId","addFilter","foldersScrollable","_id","filtersNavigationItem","setFilterIdAndChangeTab","changeFiltersAllChatsKey","groupCallsController","callsController","initListeners","setFiltersUnreadCount","setFilterUnreadCount","elementThreadId","elementPeerId","onFiltersLengthChange","containerToAppend","getDialogIndexKeyByFilterId","renderedFilter","filtersArr","haveFilters","addFilters","addFiltersPromise","getNotifyPeerTypeSettings","fillConversations","unreadSpan","unread","unreadUnmutedCount","unreadCount","getFolderUnreadCount","wasShowing","generateEmptyPlaceholder","classNameType","subtitleArgs","placeholderContainer","needPlaceholder","emptyDialogsPlaceholderSubtitle","usersLength","placeholderType","updatePartClassName","updateContactsLengthPromise","newTab","hideTab","forumNavigationItem","toggleForumTabByPeerId","lastTab","isSameTab","withContext","openInner","lastActiveListElement","setPeerFunc","setLastMessage","draftMessage","draft","topMessage","isMessageRestricted","willPrepend","videoTypes","playIcon","replyTo","forum_topic","setUnreadMessages","isDialogPinned","getForumUnreadCount","hasUnmuted","isPinned","forumUnreadCount","wasMuted","unreadTopicsCount","hasUnmutedTopic","setStatusMessage","read_inbox_max_id","hasUnreadBadge","hasUnreadAvatarBadge","transitionDuration","disableAnimationIfRippleFound","iconClassName","setSendingStatus","isUnreadBadgeMounted","hasMentionsBadge","unread_mentions_count","isMentionsBadgeMounted","isBadgeMounted","unreadBadgeText","isUnread","isMention","notVisited","getDialog","originalDialog","getOutputPeer","addDialogNew","addDialogAndSetLastMessage","getMessageSenderPeerIdOrName","downloads","getNewDeferred","cancelDownload","clearDownload","getNewDeferredForUpload","getUpload","getDownload","getUploadPromise","getDownloadFileNameFromOptions","downloadMedia","promiseBefore","getDownloadMediaDetails","downloadMediaURL","downloadMediaVoid","getFileNameForUpload","downloadToDisc","justAttach","pingPromise","iframe","hadProgress","getDocumentDownloadOptions","getPhotoDownloadOptions","clickEvent","createEvent","initMouseEvent","createDownloadAnchor","revokeObjectURL","BubbleGroup","avatarLoadPromise","avatarContainer","fwdFrom","fwdFromId","isForwardFromChannel","from_id","currentPeerId","firstTimestamp","firstItem","firstMid","lastTimestamp","lastItem","lastMid","updateClassNames","insertItem","insertInDescendSortedArray","sortGroupItemsKey","insertGroup","mount","onItemUnmount","mountItem","onItemMount","unmountItem","dateContainer","getDateContainerByTimestamp","dateGroups","_group","dateGroupsLength","unmountedLength","STICKY_OFFSET","deleteEmptyDateGroups","BubbleGroups","itemsArr","itemsMap","newGroupDiff","sortItemsKey","sortGroupsKey","removeItemFromCache","removeAndUnmountBubble","getItemByBubble","getSiblingsAtIndex","modifiedGroups","canItemsBeGrouped","groupUngrouped","mountUnmountGroups","toMount","toUnmount","bad","partition","getLastGroup","changeBubbleMid","insertItemToArray","changeItemBubble","changeBubbleByBubble","item1","item2","isAllMessagesForum","itemIndex","findGroupSiblingByItem","findGroupSiblingInItems","previousItem","siblingGroupedItem","nextItem","addItemToGroup","addItemToCache","getMessageFromId","viaBotId","createItem","SERVICE_AS_REGULAR","getDateForDateContainer","groupMid","splitSiblingsOnGrouping","prepareForGrouping","hadGroup","foundItem","splittedGroups","PopupDatePicker","initDate","onPick","noButtons","selectedDate","selectedMonth","minMonth","prevBtn","maxMonth","onDateClick","selectedEl","setTimeTitle","controlsDiv","monthTitle","monthsContainer","handleTimeInput","onOverflow","maxString","hoursInputField","minutesInputField","setMinutes","popupCenterer","timeOptions","sendDate","dateOptions","renderElement","firstDate","weekStartDate","dayIndex","clonedDate","showOverflowMonths","remainder","DivAndCaption","MEDIA_SIZE","wrapReplyDivAndCaption","mediaEl","messageMedia","isRound","mediaChildren","video_thumbs","ReplyContainer","isMediaSet","wrapReply","setColorPeerId","replyContainer","AVATAR_CLASS_NAME","AVATAR_CONTAINER_CLASS_NAME","StackedAvatars","TAG_NAME","RepliesElement","updated","postKey","leftPart","recent_repliers","stackedAvatars","read_max_id","max_id","textSpan","iconSpan","rippleContainer","subscribeRepliesThread","updateMessage","makeEdited","edited","makeSponsored","MessageRender","chatType","editedSpan","sponsoredSpan","isSponsored","sponsored","isMessage","views","postAuthor","post_author","postViewsSpan","channelViews","edit_date","edit_hide","timeSpan","clonedArgs","renderReplies","bubbleContainer","messageDiv","isFooter","repliesFooter","setReply","isReplacing","currentReplyDiv","replyToPeerId","originalMessage","originalPeerTitle","titlePeerId","originalMessageFwdFromId","needUpdate","replyMid","getElementByPoint","horizontalSide","reflowScrollableElement","SEND_WHEN_ONLINE_TIMESTAMP","INTERNAL_LINK_TYPE","PopupJoinChatInvite","chatInvite","request_needed","importChatInvite","savePhoto","peopleCount","ReactionElement","reactionCount","_reactionCount","setCanRenderAvatars","canRenderAvatars","doNotRenderSticker","hadStickerContainer","getReaction","callbackify","center_icon","renderDoc","wrapPromise","wrapStickerPromise","renderCounter","displayOn","renderAvatars","recentReactions","peer_id","setIsChosen","isChosen","chosen_order","fireAroundAnimation","REACTION_INLINE_SIZE","REACTION_BLOCK_SIZE","around_animation","iconPlayer","aroundPlayer","removeOnFrame","REACTIONS_ELEMENTS","ReactionsElement","middlewareHelpers","onConnectCallback","getReactionCount","reactionElement","getMessage","isPlaceholder","changeMessage","changedResults","hasReactions","counts","reactionsEqual","totalReactions","can_see_list","recent_reactions","handleChangedResults","ScrollSaver","getSaved","findElements","replaceSaved","findAndSetElements","_save","scrollHeightMinusTop","onRestore","useReflow","setScrollTop","newScrollTop","restore","_restore","previousScrollHeightMinusTop","SuperIntersectionObserver","observing","observingQueue","freezedObservingNew","toggleObservingNew","isMentionUnread","mentioned","accumulate","stringResults","numberResults","replaceNonNumber","CARD_BRAND_REGEXP","visa","mastercard","amex","discover","diners","diners14","jcb","unionpay","elo","mir","CARD_BRANDS","minLength","cvcMaxLength","cvcMinLength","unknown","detectCardBrand","card","sanitizedCard","brand","detectUnifiedCardBrand","createArray","delta","buggedRegExp","getDistanceFromBuggedToNormal","fixBuggedNumbers","makeOptionalCharacter","consumed","makeRequiredCharacter","partial","wrapCharacterRegExpFactory","optional","_regExp","makeCharacter","makeMonthDigitPatternCharacter","digit","capitalCharacter","cleanedResult","formattingCharacter","str1","makeFormattingCharacter","optionalPattern","spaceCharacter","yearOptionalPattern","sixteenPattern","fifteenPattern","requiredPostcodes","generateFourPattern","cardFormattingPatterns","cardNumber","cardExpiry","cardCvc","cardCvcFromBrand","postalCodeFromCountry","optionalDigits","accumulateLengths","strs","nbspRegExp","makeValidationError","validateCardNumber","sanitized","getCardInfoByNumber","ignoreIncomplete","validateCompleteCardNumber","makeCardNumberError","validateCardExpiry","monthStr","yearStr","_year","nextMonth","isNaN","validateExpiry","parse","TelegramWebView","sandbox","onTelegramWebViewEvent","eventType","eventData","onMount","contentWindow","createVerificationIframe","allow","PopupPaymentVerification","openPathAfter","telegramWebView","path_full","InputFieldCorrected","lastKeyDown","deleting","lastTransformed","getPattern","pushRest","autocorrectComplete","character","getCharacter","meta","formatInputValueByPattern","formatMethod","transformedValue","validateNew","onBlur","justReturn","validateMethod","validateAnyIncomplete","errorKeys","handleInputFieldsOnChange","_onChange","createCountryZipFields","zip","countryInputField","postcodeInputField","SUPPORTED_NATIVE_PROVIDERS","PopupPaymentCard","paymentForm","savedCard","native_provider","cardOut","token","credentials","can_save_credentials","cardSection","nativeParams","native_params","lastBrand","lastBrandImg","brandIconTempId","cardInputField","invalid","incomplete","transformed","getPaymentBrandIconPath","setBrandIcon","cvcInputField","need_cardholder_name","expireInputField","switchFocusOrder","previousInputField","nextInputField","inputFieldsRow","billingSection","need_country","need_zip","canSave","saveCheckboxField","saveRow","payButton","PaymentButton","expiryFull","expiryMonth","expiryYear","cvc","cardholderName","nativeProvider","URLSearchParams","headers","publishable_key","expiration_month","expiration_year","security_code","public_token","PopupPaymentCardConfirmation","inputCheckPassword","getInputCheckPassword","tmpPassword","password","handled","PopupPaymentShipping","inputInvoice","savedInfo","saved_info","addressSection","address1InputField","address2InputField","cityInputField","stateInputField","receiverSection","emailInputField","shipping_address_requested","name_requested","email_requested","phone_requested","validateEmail","validatePhone","selectedCountry","shipping_address","street_line1","street_line2","city","country_iso2","post_code","requestedInfo","validateRequestedInfo","shippingAddress","ADDRESS_STREET_LINE1_INVALID","ADDRESS_STREET_LINE2_INVALID","ADDRESS_COUNTRY_INVALID","ADDRESS_CITY_INVALID","ADDRESS_STATE_INVALID","ADDRESS_POSTCODE_INVALID","REQ_INFO_NAME_INVALID","REQ_INFO_EMAIL_INVALID","REQ_INFO_PHONE_INVALID","focusField","PopupPaymentShippingMethods","shippingOption","shipping_options","prices","lastShippingId","option","PopupPayment","isReceipt","tipButtonsMap","confirmed","onConfirmed","popupPaymentVerification","mediaInvoice","receipt_msg_id","isTest","itemEl","detailsClassName","photoEl","linesClassName","linesEl","botName","preloaderContainer","getPaymentReceipt","getPaymentForm","savedCredentials","saved_credentials","lastRequestedInfo","providerPeerTitle","provider_id","wrapAmount","isRecurring","recurring","peerTitle2","makeLabel","pricesClassName","makePricesElements","price","_label","wrappedAmount","pricesElements","getTipsAmount","shippingAmount","setTotal","totalAmount","totalLabel","payI18n","canTip","max_tip_amount","tip_amount","tipsClassName","getInputValue","setInputWidth","setInputValue","unsetActiveTip","tipEl","tipsLabel","haveToIgnoreEvents","ignoreNextSelectionChange","tipsEl","tipClassName","tipButtons","suggested_tip_amounts","tipAmount","prevTipEl","setRowIcon","setRowTitle","setCardSubtitle","methodRow","onMethodClick","previousCardDetails","previousToken","credentials_title","providerRow","providerAvatar","shippingAddressRow","shippingNameRow","shippingEmailRow","shippingPhoneRow","shippingMethodRow","lastShippingOption","onShippingAddressClick","onShippingMethodClick","setShippingTitle","postAddress","setShippingInfo","setShippingOption","scrollSaver","lastShippingPricesElements","shipping","acceptTermsCheckboxField","recurring_terms_url","acceptTermsRow","recurringElements","lastTmpPasword","missingInfo","tmp_password","paymentResult","sendPaymentForm","form_id","_passwordState","valid_until","tsNow","Layouter","minWidth","spacing","ratios","countRatios","proportions","countProportions","averageRatio","maxSizeRatio","layout","ComplexLayouter","layoutTwo","layoutThree","layoutFour","layoutTwoTopBottom","layoutTwoLeftRightEqual","layoutTwoLeftRight","layoutThreeLeftAndOther","layoutThreeTopAndOther","layoutFourTopAndOther","layoutFourLeftAndOther","geometry","RectPart","minimalWidth","secondWidth","firstWidth","firstHeight","thirdHeight","secondHeight","rightWidth","leftWidth","thirdWidth","h0","w0","w2","w1","h1","h2","cropRatios","attempts","multiHeight","sum","pushAttempt","lineCounts","heights","second","third","fourth","optimalAttempt","optimalDiff","attempt","lineCount","minLineHeight","bad1","bad2","optimalCounts","optimalHeights","rowCount","colCount","col","prepareAlbum","widthItem","heightItem","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","forMedia","mediaDiv","wrapAlbum","attachmentDiv","uploading","containerHeight","hasSpoiler","itemWidth","itemHeight","AppPollResultsTab","resultsDiv","appPollsManager","getPoll","quiz","voters","total_voters","roundPercents","answer","answers","answerEl","answerTitle","answerPercents","getVotes","votesList","votes","vote","lineTotalLength","minIndex","minRemainder","maxRemainder","pollElement","isClosed","performResults","chosenIndexes","PollElement","setMaxLength","resizePolls","hideQuizHint","onHide","prevQuizHint","prevQuizHintOnHide","prevQuizHintTimeout","isListenerSet","isQuiz","isRetracted","isPublic","isMultiple","chosingIndexes","sentVote","MAX_LENGTH","MAX_OFFSET","svgLines","setLineProgress","descKey","public_voters","multiple_choice","multipleSelect","descDiv","typeDiv","avatarsDiv","close_period","close_date","timeLeftDiv","quizTimer","circumference","closeTime","quizInterval","timeLeft","getResults","answerDivs","numberDivs","footerDiv","viewResults","votersCountDiv","sendVoteBtn","sendVotes","canVote","setVotersCount","clickHandler","initQuizHint","solution","solution_entities","toggleHint","setQuizHint","correctResult","correct","chosen","answerIndex","foundIndex","indexes","sendVotePromise","sendVote","recent_voters","isVoted","hideSendVoteBtn","hideViewResultsBtn","maxPercents","getPercentValue","iterate","fullTime","votersCount","rtlChars","justRtlDirCheck","IGNORE_ACTIONS","TEST_SCROLL_TIMES","TEST_SCROLL","PEER_CHANGED_ERROR","BIG_EMOJI_SIZES","BIG_EMOJI_SIZES_LENGTH","getMainMidForGrouped","ChatBubbles","unreadOut","bubblesNewByGroupedId","bubblesNew","dateMessages","scrolledDown","isScrollingTimeout","unreaded","unreadedSeen","messagesQueueOnRenderAdditional","firstUnreadBubble","followStack","isFirstLoad","passEntities","viewsMids","isTopPaddingSet","renderingMessages","bubblesToEject","bubblesToReplace","setPeerTempId","renderNewPromises","extendedMediaMessages","unreadedObserverCallback","onUnreadedInViewport","viewsObserverCallback","sendViewCountersDebounced","sponsoredMessage","randomId","random_id","viewSponsoredMessage","stickerEffectObserverCallback","onBubblesMouseMove","unhoverPrevious","hoverBubble","hoverReaction","setHoverVisible","stickerWrapper","getGroupsFirstMessage","getAvailableReactionsByMessage","select_animation","sendReaction","onBubblesClick","setInnerPeer","chatInner","onDatePick","contactDiv","callDiv","callUser","getInputInvoiceByPeerId","reactionsElement","stickerEmojiEl","bubbleMid","reply_to_top_id","saved_from_msg_id","openThread","message1","getMessageWithReplies","getDiscussionMessage","via","setDraft","peerIdStr","documentDiv","groupedItem","SINGLE_MEDIA_CLASSNAME","isSingleMedia","hasAspecter","albumItem","isReplyClick","replyToMid","reply_to_msg_id","scrollDimensions","forceDown","sliceViewportDebounced","setCorrectIndexThrottled","setStickyDateManually","setPeerPromise","processBatch","loadQueue","filterQueue","avatarPromises","groupBubbles","updatePosition","timePromises","groupCollapsed","groupEnd","setUnreadDelimiter","restoreScroll","prepareToSaveScroll","ejectBubbles","oldBubble","bubbleGroups","updatePlaceholderPosition","requestHistory","setMessageId","constructBubbles","sequential","messagesStorageKey","messagesQueuePromise","newItem","_items","scrollingToBubble","scrollToEnd","deleteMessagesByIds","tempMessage","_bubble","groupedId","getMessagesByAlbum","reactionsElements","repliesElement","newDiv","safeRenderMessage","scrollToBubbleIfLast","deletedMids","wasMainMid","mainMid","createScrollSaver","appendReactionsElementToBubble","dateMessage","dateBubble","previousStickyDate","sliceViewport","setScroll","attachContainerListeners","highlightBubble","replyAfter","swipeAvatar","shouldReply","canSend","_target","_swipeAvatar","initMessageReply","constructPeerHelpers","updateGradient","setUnreadCount","updateUnreadByDialog","finishPeerChange","reloadMessages","toDelete","postViewsElements","different","postViews","incrementMessageViews","getScheduledMessagesStorage","createResizeObserver","resizeObserver","wasHeight","skip","scrolled","onResizeEnd","setEndRAF","ResizeObserver","contentRect","realDiff","_part","needScrollTop","destroyResizeObserver","setReactionsHoverListeners","getRenderedLength","readUnreaded","readPromise","idleController","bubblesMaxId","getHistoryMaxId","readContents","onGoDownClick","getBubbleByPoint","getGroupedBubble","groupId","getMidsByAlbum","findNextMountedBubbleByMsgId","filterCallback","_mid","foundMid","loadMoreHistory","getHistoryTopPromise","getHistoryBottomPromise","getHistory1","destroyScrollable","getHistoryStorage","readMaxId","readOutboxMaxId","msgId","destroyBubble","permanent","ignoreOnScroll","pollExtendedMediaMessages","getExtendedMedia","setExtendedMediaMessagesPollInterval","pollExtendedMediaMessagesPromise","setTopPadding","setPaddingTo","isPaddingNeeded","unsetPadding","newMessage","getLastBubble","performHistoryResult","scrollToBubbleEnd","scrollToBubble","isChangingHeight","messageInput","dimensions","datasetKey","createDateBubble","bubbleContent","serviceMsg","fakeBubble","bubblesToo","cleanupPlaceholders","attachedUnreadBubble","fetchNewPromise","getSponsoredMessagePromise","onAnimateLadder","resolveLadderAnimation","attachPlaceholderOnRender","emptyPlaceholderBubble","samePeer","stack","startParam","onChangePeer","getPinnedMessagesMaxId","isTarget","followingUnread","savedPosition","overrideAdditionMsgId","getChatSavedPosition","getReadMaxIdIfUnread","foundSlice","findSliceOffset","isJump","isStartButtonNeeded","setStartParam","setQueueId","messageEntityBotCommand","isBot","additionMsgId","maxBubbleId","oldChatInner","oldPlaceholderBubble","haveToScrollToBubble","fromUp","scrollFromDown","scrollFromUp","willScrollOnLoad","setPeerOptions","waitPromise","setPeerCached","mountedByLastMsgId","isPinnedMessagesNeeded","setCorrectIndex","lastBubble","onRenderScrollSet","afterSetPromise","setFetchReactionsInterval","setFetchHistoryInterval","onScrolledAllDown","isForumTopic","unread_mark","fetchReactions","getMessagesReactions","needFetchInterval","isFetchIntervalNeeded","historyMaxId","canWrite","renderMessagesQueue","isAvatarNeeded","additionalCallback","processResult","newBubble","originalPromise","renderMessage","albumMids","reactionsMessage","albumMessages","albumMustBeRenderedFull","our","isOurMessage","contentWrapper","isInUnread","ignoreAction","chat_id","is_single","messageMessage","needToSetHTML","bigEmojis","emojiEntities","strLength","curr","richText","canHaveTail","isStandaloneMedia","haveRTLChar","topicNameButtonContainer","replyMarkup","reply_markup","replyMarkupRows","containerDiv","rowDiv","buttonEl","botId","same_peer","checkSwitchReturn","switchInlineQuery","button_id","handleUrlAuth","buttonId","haveButtons","column","callbackButtonClick","callbackAnswer","messageWithReplies","getMessageWithCommentReplies","withReplies","isOutMessage","nameContainer","canHideNameIfMedia","isMessageEmpty","viewButton","processingWebPage","telegram_channel","telegram_megagroup","telegram_bot","makeViewButton","quote","previewResizer","preview","quoteTextDiv","strong","titleDiv","textDiv","isSquare","isEmoji","nopremium","newNameContainer","richTextFragment","getMidsByMid","wrapGroupedDocuments","lastContainer","contact","contactDetails","contactNameDiv","contactNumberDiv","phone_number","wrapPoll","extendedMedia","isAlreadyPaid","isNotPaid","innerMedia","wrappedPrice","priceEl","video_duration","videoTime","dc_id","file_reference","before","needName","titleVia","mustHaveName","isHidden","isForward","goto","generateTail","documentContainer","documentMessageDiv","viewportSlice","deleteViewportSlice","historyResult","needReflowScroll","setLoadedPromises","firstSlice","lastSlice","both","processLocalMessageRender","ackedResult","getScheduledMessages","animateAsLadder","additionMsgIds","isAdditionRender","targetMid","sortedMids","topIds","middleIds","bottomIds","setBubbles","lastMsDelay","elementsToAnimate","transitionDelay","topRes","middleRes","bottomRes","delays","renderEmptyPlaceholder","listElements","getRestrictionReasonText","getGreetingSticker","channel_post","start_param","chat_invite","chat_invite_hash","JOIN_CHAT","invite","processInternalLink","creator","isWaitingForAnimation","noTransition","setOn","generateLocalMessageId","addOffset","generateLocalFirstMessage","service","saveMessages","ignoreScrollSaving","invisible","checkPlaceholders","toggleSponsoredMessage","renderBotPlaceholder","checkIfEmptyPlaceholderNeeded","getSponsoredMessage","sponsoredMessages","messagePromise","_log","getProfile","processPromise","bot_info","botInfo","description_document","description_photo","isBackLimit","resultPromise","isFirstMessageRender","serviceStartMessageId","getThreadServiceMessageId","sup","_promise","mustBeCount","PopupPinMessage","unpin","canUnpin","canPinMessage","oneSide","unpinAllMessages","hidePinnedMessages","updatePinnedMessage","buttonText","getPinnedMessagesCount","pinButtonText","isSelectionEmpty","selectionRange","START_TO_END","preloadAnimatedEmojiSticker","PopupReportMessagesConfirm","reportMessages","STICKER_EMOJI","PopupReportMessages","preloadStickerPromise","marginTop","PopupSponsored","PopupReactedList","canViewReadParticipants","canViewMessageReadParticipants","loaders","hasAllReactions","createFakeReaction","hasReadParticipants","readUserIds","getMessageReadParticipants","chatlist","skipReadParticipants","skipReactionsList","getMessageReactionsListAndReadParticipants","combined","getReactionCached","allReactionsSticker","REACTIONS_CLASS_NAME","REACTION_CLASS_NAME","CAN_USE_TRANSFORM","ChatReactionsMenu","reactionsMap","players","onScrollProcessItem","reactionDiv","appear","widthContainer","reactionsContainer","reactionsScrollable","renderReaction","setVisible","canUseAnimations","scaleContainer","appearWrapper","appear_animation","selectLoadPromise","selectPlayer","REACTION_SIZE","ChatContextMenu","isTextSelected","isAnchorTarget","isUsernameTarget","selectedMid","isOverBubble","isTargetAGroupedItem","viewerPeerId","canOpenReactedList","linkToMessage","getUrlToMessage","selectedMessagesText","getSelectedMessagesText","menuPadding","reactionsMenu","reactionsMenuPosition","isReactionsMenuVisible","offsetSize","nextVisiblePart","MIN_NEXT_VISIBLE_PART","minSize","onSendScheduledClick","onReplyClick","onFaveStickerClick","unfave","faveSticker","onEditClick","initMessageEditing","onCopyClick","onCopyAnchorLinkClick","onCopyLinkClick","onUnpinClick","onRetractVote","onStopPoll","stopPoll","setButtons","hasAttribute","notDirect","scheduleSending","editMessage","scheduleDate","canEditMessage","getMessageFromStorage","canSaveMessageMedia","isGoodType","hasTarget","localName","emojiInputsPromise","getUniqueCustomEmojisFromMessage","filterUnique","viewsButton","isViewingReactions","participantsCount","reactedLength","i18nElem","fakeText","AVATAR_SIZE","MAX_AVATARS","PADDING_PER_AVATAR","reactionsCount","fakeElem","readParticipants","totalSize","emojisButton","setPadding","inputsPromise","getCachedCustomEmojiDocuments","getCustomEmojiDocuments","threadMessage","SendMenu","sendMenuButtons","onSilentClick","onScheduleClick","sendMenu","openSide","onContextElement","setPeerId","PopupCreatePoll","onSubmitClick","send","radioLabel","isEmpty","questions","appendMoreField","correctAnswers","optionInputFields","questionInputField","sendSilent","settingsCaption","anonymousCheckboxField","multipleCheckboxField","quizCheckboxField","quizSolutionField","quizElements","quizSolutionCaption","quizHr","quizSolutionContainer","quizSolutionSubtitle","getFilledAnswers","quizSolution","quizSolutionEntities","inputMediaPoll","getInputMediaPoll","sendOther","getMessageSendingParams","helperType","clearHelper","questionField","createPosterFromMedia","getGifDuration","arrayBuffer","currentPopup","getCurrentNewMediaPopup","PopupNewMedia","willAttachType","attachFile","willAttach","shouldCompress","itemDiv","defineNotNumerableProperties","attachMedia","attachDocument","sendFileDetails","captionMaxLength","captionLengthMax","isMedia","wasInputValue","messageInputField","attachFiles","applyMediaSpoiler","noAnimation","widthStr","heightStr","containerWidthStr","containerHeightStr","strippedBytes","appendDrops","appendGroupCheckboxField","groupCheckboxField","mediaCheckboxField","appendMediaCheckboxField","addFiles","toPush","_file","lastModified","sendingParams","sendFileParams","sendText","scaledBlob","sendAlbum","replyToMsgId","scaleImageForTelegram","PHOTO_SIDE_LIMIT","objectURL","audioDecodedByteCount","webkitAudioDecodedByteCount","noSound","onseeked","onerror","createPosterFromVideo","isPhoto","isAudio","onRender","foundPhotos","foundVideos","foundFiles","appendMediaToContainer","firstType","oldSendFileDetails","albumContainer","oldParams","HANDLE_EVENT","ACTIVE_CLASS_NAME","AXIS_Y_KEYS","AXIS_X_KEYS","attachListNavigation","waitForKey","waitForKeySet","keyNames","getCurrentTarget","setCurrentTarget","hadTarget","getNextTargetX","currentTarget","isNext","nextTarget","handleArrowKey","endProperty","currentRect","targetRect","getNextTargetY","fireSelect","canContinue","attached","resetTarget","_onKeyDown","AutocompleteHelper","onVisible","listType","attachNavigation","controller","addHelper","toggleListNavigation","fromController","skipAnimation","hideOtherHelpers","StickersHelper","onChangeScreen","checkEmoticon","getStickersByEmoticon","getMinDate","getMaxDate","PopupSchedule","canSendWhenOnline","btnSendWhenOnline","EmojiHelper","chatInput","onEmojiSelected","checkQuery","firstChar","getBothEmojiKeywords","searchEmojis","AutocompletePeerHelper","doNotShow","listElement","BASE","BASE_CLASS_LIST_ELEMENT","processPeerFullForCommands","botInfos","commands","command","indexObject","CommandsHelper","getReadyToSend","sendMessage","AutocompleteHelperController","preserveHelper","MentionsHelper","insertAtCaret","topMsgId","trimmed","getMentions","ReplyKeyboard","onBodyTouchStart","btnHover","checkAvailability","checkForceReply","touchListener","sendContact","getReplyMarkup","getHistoryStorageTransferable","InlineHelper","queryId","queryAndResultIds","generateQId","resultId","sendInlineResult","_checkQuery","botResults","query_id","gifsMasonry","isGallery","gallery","noCommands","dcId","switch_pm","btnSwitchToPM","switchToPM","ChatBotCommands","setUserId","modifyAckedResult","acked","modifyAckedPromise","ChatSendAs","sendAsButtons","previousAvatar","onSendAsMenuToggle","updateButtons","sendAsPeerId","changeSendAsPeerId","executeButtonsUpdate","sendAsPeerIds","saveDefaultSendAs","updateAvatar","getDefaultSendAs","getChannelFull","channelFull","default_send_as","updateManual","updatingPromise","wasSkippingAnimation","auto","getSendAs","sendAsPeers","sendAsPeer","premium_required","addedListener","USELESS_REG_EXP","InputFieldAnimated","updateInnerHTML","onFakeInput","inputFake","setHeight","currentHeight","hasMarkupInSelection","commonAncestor","SHOW_ELEMENT","POSTING_MEDIA_NOT_ALLOWED","ChatInput","lastUrl","lastTimeType","replyElements","willSendWebPage","recordCanceled","recordStartTime","lockRedo","canRedoFromHTML","undoHistory","executedHistory","canUndoFromHTML","onCancelRecordClick","recorder","opusDecodeController","onEmoticonsOpen","toggleClass","btnToggleEmoticons","onEmoticonsClose","isUserOnlineVisible","openScheduled","prepareDocumentExecute","undoRedo","needHTML","sameHTMLTimes","currentHTML","handleMarkdownShortcut","formatKeys","markupTooltip","applyMarkdown","showLinkEditor","onMessageInput","markdownEntities","parseMarkdown","urlEntities","getWebPagePromise","appWebPagesManager","getWebPage","setTopInfo","noWebPage","onHelperCancel","helperFunc","botCommands","resetCurrentFontFormatting","updateBotCommandsToggle","editMsgId","saveDraftDebounced","checkAutocomplete","updateSendBtn","onBtnSendClick","forwarding","restricted","voice_messages_forbidden","releaseMediaPlayback","setRecording","showDiscardPopup","btnCancelRecord","recordingOverlayListener","recordingNavigationItem","sourceNode","analyser","createAnalyser","connect","fftSize","frequencyData","frequencyBinCount","getByteFrequencyData","recordRippleEl","ms","recordTimeEl","needReturn","getCurrentInputAsDraft","no_webpage","draftsAreEqual","onHelperClick","forwardElements","rowsWrapperWrapper","rowsWrapper","fakeRowsWrapper","fakeSelectionWrapper","goDownBtn","controlContainer","iconBtn","cancelBtn","onHideAuthorClick","isChangingAuthor","onHideCaptionClick","forwardButtons","canToggleHideAuthor","hideSender","showCaption","hideCaption","changePeer","changeForwardRecipient","forwardBtnMenu","forwardWasDroppingAuthor","replyTitle","forwardHover","modifyArgs","newMessageWrapper","replyInTopicOverlay","inputMessageContainer","goDownUnreadBadge","goMentionBtn","goMentionUnreadBadge","goToNextMention","btnScheduled","btnToggleReplyMarkup","replyKeyboard","botCommandsToggle","scaler","botCommandsIcon","attachMenuButtons","fileInput","attachMenu","attachMenuBots","appAttachMenuBotsManager","getAttachMenuBots","attachMenuBotsButtons","attachMenuBot","getAttachMenuBotIcon","requestWebView","webViewResultUrl","SANDBOX_ATTRIBUTES","verifyMap","attachMenuPeerTypeSameBotPM","attachMenuPeerTypeBotPM","attachMenuPeerTypePM","attachMenuPeerTypeChat","attachMenuPeerTypeBroadcast","peer_types","multiple","autocompleteHelperController","stickersHelper","emojiHelper","commandsHelper","mentionsHelper","inlineHelper","btnSendContainer","btnSend","attachMessageInputField","previousQuery","saveDraft","encoderSampleRate","monitorGain","numberOfChannels","recordingGain","reuseWorker","onstop","ondataavailable","typedArray","dataBlob","sendFile","isVoiceMessage","botStartBtn","toggleBotStartBtnDisability","startBot","pinnedControlBtn","originalChat","pinnedMessageContainer","_center","neededFakeContainer","fakeWrapperTo","oldFakeWrapperTo","fakeSelectionRect","fakeRowsRect","scale","initTranslateX","getNeededFakeContainer","isReplyInTopicOverlayNeeded","hasMentions","syncDraft","helperToo","clearInput","fromUpdate","getDraft","wrappedDraft","myEntities","apiEntities","wrapDraft","currentDraft","createSendAs","firstChange","sendAs","updateOffset","getPlaceholderKey","updateMessageInputPlaceholder","previousSendAs","ackedPeerFull","ackedScheduledMids","setSendAsCallback","filteredAttachMenuButtons","filterAttachMenuButtons","placeholderKey","hasBotCommands","updateBotCommands","updateMessageInput","haveSomethingInControl","isAnonymousSending","oldInputField","attachMessageInputListeners","fixSafariStickyInputFocusing","APP_TABS","CHAT","readAllHistory","commandsMap","canCombine","hasMarkup","executed","resetCurrentFormatting","setActiveMarkupButton","insertText","insertEntity","isHelper","fullValue","AUTO_COMPLETE_REG_EXP","matchIndex","foundHelper","checkInlineAutocomplete","setPreloaderShow","btnPreloader","inlineMatch","bot_inline_placeholder","inlinePlaceholder","helperWaitingForward","canSetDraft","fireEvent","clearValue","fixSafariStickyInput","getValueAndEntities","clearReply","unicode","pushRecentEmoji","dropAuthor","dropCaptions","isDroppingCaptions","sendMessageWithDocument","hideCaptionCheckboxField","replyFragment","initMessagesForward","fromPeerIdsMids","fromPeerIds","smth","messagesWithCaptionsLength","peerTitles","titleKey","senderTitles","firstMessage","newReply","intl","peerTitleEl","_message","setReplyToMsgId","callerFunc","replyParent","oldReply","haveReply","CLASSNAME_BASE","PinnedContainer","floating","divAndCaption","wrapperUtils","attachOnCloseEvent","needClose","setFloating","setUtilsWidth","BAR_HEIGHTS","ChatAudio","onPlaybackParams","fasterEl","repeatEl","toggleEl","onStop","onMediaPlay","isMusic","prevEl","nextEl","attachClick","volumeProgressLineContainer","tunnel","progressWrapper","playingDetails","PinnedMessageBorder","drawRect","getClipPath","barHeight","GAP","clipPath","getBarHeight","ONE","TWO","THREE","FOUR","MORE","getMarkHeight","markHeight","getMarkTranslateY","getTrackTranslateY","trackHeight","getTrackHeight","clipPathId","markTranslateY","trackTranslateY","mark","AnimatedSuper","getRow","clearRow","clearRows","currentIndex","DURATION","setNewRow","reflow","previousIndex","fromTop","ignorePrevious","previousRow","AnimatedCounter","previousNumber","getDecimal","animatedSuper","decimal","hideLeft","previousDecimalNumber","EMPTY_INDEX","setCount","previousByDecimal","decimalNumber","ChatPinnedMessage","pinnedMaxMid","pinnedMid","pinnedIndex","wasPinnedIndex","wasPinnedMediaIndex","waitForScrollBottom","loadedBottom","loadedTop","scrollDownListenerSetter","getCurrentIndexPromise","isStatic","dAC","pinnedMessageBorder","animatedSubtitle","animatedMedia","animatedCounter","btnOpen","openPinned","setPinnedMessage","_setPinnedMessage","unsetScrollDownListener","testMid","isNeededMore","getCurrentIndex","LOAD_OFFSET","correctAfter","gotRest","getPinnedMessage","backLimited","offset_id_offset","setScrollDownListener","isDown","handleScrollSideEvent","refreshPosition","handleFollowingPinnedMessage","followPinnedMessage","isLast","writeTo","writeMediaTo","ChatTopbar","verifyButtons","isMenuOpen","btnMore","buttonsToVerify","menuButtons","verifyVideoChatButton","currentGroupCall","groupCall","verifyCallButton","getCachedFullUser","phone_calls_available","video_calls_available","onJoinGroupCallClick","joinGroupCall","resize","setUtilsRAF","chatUtils","chatAudio","setPeerStatusManual","btnBack","chatInfoContainer","chatInfo","person","avatarElement","deleteButtonText","btnJoin","btnPinned","btnCall","btnGroupCall","btnMute","btnSearch","pushButtonToVerify","onBtnBackClick","isFirstChat","constructUtils","linked_chat_id","onCallClick","chatContextMenuHintWasShown","contactPeerId","getAttachMenuBot","has_settings","constructAvatar","joinChannel","setMutedState","isTopMessage","hiddenPinnedMessages","byCurrent","setTitleCallback","setStatusCallback","setTitleManual","canHaveSomeButtons","wasAlreadyUsed","newPinnedMessage","AppPrivateSearchTab","appSearch","btnPickDate","ChatSearch","selectedIndex","onResultsClick","selectResult","onFooterClick","onUpClick","onDownClick","foundCountEl","upBtn","downBtn","footer","dateBtn","renderedCount","ChatBackgroundPatternRenderer","canvases","INSTANCES","renderToCanvas","fillCanvas","crossOrigin","imageBitmap","objectUrl","imageWidth","imageHeight","patternHeight","mask","centerY","topY","endY","bottomY","setCanvasDimensions","originalHeight","Chat","backgroundEl","backgroundTempId","sharedMediaTabs","setBackground","patternRenderer","gradientCanvas","previousGradientRenderer","previousPatternRenderer","previousPatternCanvas","isDarkPattern","getInstance","_gradientRenderer","setBackgroundPromise","setType","freezeObservers","beforeDestroy","cleanupBackground","destroySharedMediaTab","searchTab","_isAnyGroup","setAutoDownloadMedia","getForumTopicOrReload","isSamePeer","bubblesSetPeerPromise","photoSizeMax","videoSizeMax","fileSizeMax","photo_size_max","video_size_max","getAutoDownloadSettingsByPeerId","callbacksPromise","ignoreThreadId","historyStorageTransferable","historySerialized","MarkupTooltip","waitingForMouseUp","mouseUpCounter","onMouseUpSingle","resetSelection","tools1","tools2","cancelClosening","linkBackButton","linkInput","applyLink","isLinkValid","setTooltipPosition","linkApplyButton","applyDiv","delimiter1","delimiter2","delimiter3","matchUrlProtocol","getActiveMarkupButton","currentMarkups","markup","activeButtons","isLinkToggle","bodyRect","selectionRect","inputRect","selectionTop","sizesRect","isFirstShow","setMouseUpEvent","handleSelection","ChatDragAndDrop","dropIcon","onDragOver","onDragLeave","onDrop","outlineWrapper","dropHeader","dropSubtitle","headerArgs","setPath","sizeX","sizeY","disableTransition","LineBlobDrawable","maxRadius","minRadius","N","radiusNext","speed","generateBlob","radDif","generateNextBlob","amplitude","speedScale","paint","pinnedTop","progressToPinned","r1","progressNext","x1","x2","cx","y1","y2","bezierCurveTo","WeavingState","stateId","createGradient","shader","getGradientFromType","x0","y0","dt","TopbarWeave","handleDevicePixelRatioChanged","setSize","forceUpdate","resizeHandler","resizeCanvas","invokeDraw","handleFocus","focused","handleBlur","lbd","lbd1","lbd2","currentState","previousState","progressToState","lastUpdateTime","animateToAmplitude","animateAmplitudeDiff","amplitude2","animateAmplitudeDiff2","top1","top2","paint1","setCurrentState","states","componentDidMount","matchMedia","setAmplitude","componentWillUnmount","setCanvasSize","RLottieIconItemPart","playPart","RLottieIconItem","createPart","initFrame","skipFirstFrameRendering","inverseColor","onLoadForColor","onLoadForPart","getPart","RLottieIcon","startFrame","endFrame","frameCount","SuperRLottieIcon","partState","colorState","getColor","partCallback","changedPartState","changedColorState","setPartState","setColorState","prevState","renderIfPaused","invoke","GroupCallMicrophoneIcon","GROUP_CALL_MICROPHONE_BUTTON_STATE","partName","HAND","MUTED","UNMUTED","GroupCallParticipantMutedIcon","colored","GROUP_CALL_PARTICIPANT_MUTED_STATE","colorStr","MUTED_FOR_ME","MUTED_BY_ADMIN","propertyValue","getColorByMutedState","generateEqualParts","clearMutedStateModifier","GroupCallParticipantStatusElement","element2","actionClassName","GroupCallParticipantsList","getParticipantByPeerId","onElementDestroy","getGroupCallParticipantMutedState","mutedIcon","callVideoCanvasBlur","GroupCallParticipantVideoElement","setPinned","setParticipant","groupCallParticipantMutedIcon","groupCallParticipantStatus","updateParticipant","GroupCallParticipantsVideoElement","participantsElements","groupCallId","setElementDisplay","pinnedSource","pinSource","unpinAll","setInstance","shouldDisplayElement","displayPinned","shouldDisplay","hasAnyVideo","participantElements","participantVideo","getVideoElementFromParticipantByType","_onLengthChange","GroupCallParticipantContextMenu","onOpenProfileClick","PopupGroupCall","targetPeerId","toggleParticipantMuted","editParticipant","canManageCall","can_self_unmute","muted_by_you","kickFromChat","getContainer","GroupCallParticipantsElement","groupCallParticipantsVideo","appGroupCallsManager","getGroupCallParticipants","GroupCallDescriptionElement","descriptionIntl","GroupCallTitleElement","makeButton","_className","buttonDiv","isConfirm","resizeHandlerClassName","MovableElement","fixDimensions","fixPosition","addResizeHandlers","setSwipeHandler","destroyElements","handlers","startTop","startLeft","startWidth","startHeight","resizingSide","isEnlarging","resizeDiff","maxPossible","setPositionToCenter","MovablePanel","toggleMovable","movable","movableOptions","toggleClassName","raise_hand_rating","onFullScreenClick","onToggleControls","buttonsContainer","onVideoClick","btnVideo","toggleVideoSharing","onScreenClick","btnScreen","toggleScreenSharing","toggleMuted","changeRaiseHand","onLeaveClick","hangUp","discard","toggleBigLayout","btnFullScreen","btnExitFullScreen","wasFullScreen","movablePanel","videosCount","wasBig","btnInvite","btnShowColumn","toggleRightColumn","btnFullScreen2","headerInfo","newHeader","newHeaderInfo","newHeaderTitle","btnHideColumn","videosScrollable","groupCallTitle","groupCallDescription","groupCallBodyHeaderDescription","constructButtons","groupCallParticipants","updateInstance","setHasPinned","groupCallMicrophoneIcon","_makeButton","microphoneIcon","btnLeave","setDescription","microphoneButtonState","getGroupCallMicrophoneButtonState","micState","CallDescriptionElement","connectionState","connectedAt","GroupCallMicrophoneIconMini","INIT_STATE","PopupCall","resizeVideoContainers","videoContainers","interlocutorUserId","emojisSubtitle","partyStates","partyMutedState","stateText","constructFirstButtons","constructSecondButtons","wasTryingToJoin","movableElement","controlsHover","getCallInstance","firstButtonsRow","muteI18nElement","secondButtonsRow","declineI18nElement","btnDecline","btnAccept","acceptCall","createVideoContainer","isPendingIncoming","isSharingVideo","isSharingScreen","outputState","getMediaState","oldContainers","mediaState","getVideoElement","hasFrame","hasPromise","videoState","screencastState","videoContainer","output","getEmojisFingerprint","popupWidth","MAX_WIDTH_PX","MAX_HEIGHT_PX","MAX_SIZE","biggestSideSize","widthRatio","heightRatio","TopbarCall","onState","amplitudes","weave","clearCurrentInstance","currentDescription","instanceListenerSetter","isChangingInstance","callDescription","convertCallStateToGroupState","groupCallMicrophoneIconMini","throttledMuteClick","weaveContainer","uiNotificationsManager","notificationsShown","notificationIndex","notificationsCount","soundsPlayed","vibrateSupport","faviconElements","titleBackup","titleChanged","stopped","pushInited","updateLocalSettings","updSettings","nodesktop","novibrate","nopreview","nopush","needPush","webPushApiManager","registeredDevice","nosound","requestPermission","Notification","mozVibrate","webkitVibrate","setAppBadge","notificationsUiSupport","notifySoundEl","topMessagesDeferred","toggleToggler","peerString","soundReset","unreadUnmutedPeerIds","tokenData","unregisterDevice","registerDevice","notificationData","custom","hasChat","hasUser","buildNotification","fwdCount","peerReaction","peerTypeNotifySettings","notification","getPeerString","notificationMessage","wrappedMessage","noIncrement","notificationFromPeerId","peerPhoto","loadAvatar","resetTitle","isBlink","setFavicon","titleInterval","textBaseline","textAlign","prevFavicon","testSound","permission","appRuntimeManager","onclose","getLocalSettings","nextSoundAt","prevSoundVolume","filename","token_type","tokenType","tokenValue","other_uids","app_sandbox","secret","getFilesFromEvent","onlyTypes","scanFiles","isDirectory","directoryReader","createReader","readEntries","itemFile","getAsFile","DataTransferItem","DragEvent","dataTransfer","webkitGetAsEntry","addAnchorListener","protocol","noCancelEvent","pathnameParams","uriParams","u","host","noPathnameParams","noUriParams","parseUriParams","AppImManager","columnEl","offline","updateStatusInterval","cacheStorage","saveState","onHashChangeUnsafe","tgaddr","openUrl","postId","openUsername","userName","setSettings","messagesTextSize","forceRenderAfterSize","chatsSelectTabDebounced","toggleChatGradientAnimation","onDocumentPaste","attachType","newMediaPopup","_types","canDrag","backgroundPromises","CHATLIST","updateStatus","emojiAnimationContainer","appendEmojiAnimationContainer","createNewChat","chatsSelectTab","getPremium","compareVersion","deleteFilesIterative","applyCurrentTheme","resizeInstances","saveChatPosition","choosing","setChoosingStickerTyping","typing","onInstanceDeactivated","isUpdated","receiptMessage","onSpoilerClick","spoilerTimeout","stateStorage","topbarCall","discardCurrentCall","currentCall","setAuthorized","telegramMeWebManager","hashtag","STICKER_SET","EMOJI_SET","makeLink","INVOICE","VOICE_CHAT","USER_PHONE_NUMBER","thread","PRIVATE_POST","channel","comment","getStackFromElement","MESSAGE","attachKeydownListener","handleAutologinDomains","openWindow","onUrlAuthResult","urlAuthResult","botPeerTitle","logInCheckbox","allowMessagesCheckbox","request_write_access","confirmationPromise","logInChecked","allowMessagesChecked","acceptUrlAuth","onUrlAuthResultAccepted","requestUrlAuth","_appConfig","onAnchorClick","url_auth_domains","autologin_token","autologin_domains","originalUrl","searchParams","possibleBubble","timeoutOperation","requests","request","isBad","activatingChat","screen","IGNORE_KEYS","isSelectionCollapsed","getFirstMessageToEdit","getNextDialog","newEvent","KeyboardEvent","commentId","resolveChannel","op","checkChatInvite","saveApiChat","resolvePhone","getInputInvoiceBySlug","wrappedUrl","openComment","openPremiumBot","premium_bot_username","generateThreadServiceStartMessage","phone_calls_private","ignoreGroupCall","ignoreCall","discardGroupCallConfirmation","discardCallConfirmation","title1","title2","isClosing","getGroupCallFull","createGroupCall","setCurrentBackground","broadcastEvent","getBackground","getFile","lastBackgroundUrl","chatBubbles","chatPositions","backgroundUrl","attachDragAndDropListeners","drops","mediaDrops","isFiles","_dropsContainer","mediaDropsContainer","dropsContainer","_drops","foundMedia","PROFILE","onImTabChange","updateMyOnlineStatus","spliceChats","fromIndex","chatFrom","chatTo","chatIndex","existingIndex","oldChat","getTypingElement","eye","getPeerTyping","getPeerTypings","langPackKeys","multi","mapa","typingElement","descriptionElement","getChatStatus","typingEl","onlines","getOnlines","getPeerStatus","typingContainer","options1","options2","DialogColorsFg","DialogColors","DialogColorsMap","pic","peerParams","useBytes","bestPhotoSize","CallConnectionInstanceBase","connection","sources","createPeerConnection","config","RTCPeerConnection","signalingState","iceConnectionState","createDataChannel","dataChannel","createDescription","appendStreamToConference","streamManager","appendToConference","closeConnection","closeConnectionAndStream","stopStream","negotiate","negotiating","negotiateInternal","sendDataChannelData","parseSignalingData","sdp","parseMediaSectionInfo","fingerprint","ufrag","pwd","convertNumber","isSending","codec","ssrc","sourceGroups","ssrcGroups","sourceGroup","semantics","ssrcs","rtpExtensions","payloadTypesMap","getPayloadType","payloadType","clockrate","feedbackTypes","subtype","parameters","payloadTypes","CallConnectionInstance","localDescription","remoteDescription","descriptionInit","offerReceived","createAnswer","setLocalDescription","offer","createOffer","offerSent","initialSetup","sendCallSignalingData","crypto","subtle","P2PEncryptor","p2pKey","seqMap","concatSHA256","bufferConcats","encryptPrepared","msgKeyLarge","subarray","msgKey","aesKeyIv","prepareAesKeyIv","aesProcessCtr","encryptRawPacket","seq","ArrayBuffer","setUint32","sha256a","sha256b","iv","encryptedData","dataSize","encrypt","cryptoKey","constTimeIsDifferent","msgKeyEquals","decryptRawPacket","encryptedDataSize","decryptionBuffer","getUint32","ChromeP2PSdpBuilder","fingerprints","stringBuilder","streamName","addExtmap","addPayloadTypes","addSsrc","finalize","FirefoxP2PSdpBuilder","SafariP2PSdpBuilder","isFirefox","isSafari","extmap","j","fmtp","getOwnPropertyNames","pName","ssrcGroup","P2PSdpBuilder","sdpString","sdpMLineIndex","sdpMid","foundation","component","priority","relAddress","generation","tcpType","networkId","networkCost","candidate","generateOffer","generateAnswer","CallInstance","udp_p2p","udp_reflector","min_layer","max_layer","library_versions","createdAt","decryptQueue","candidates","canCreateConferenceEntry","setMediaState","sendMediaState","mediaStates","_sendMediaState","_connectionState","connectionInstance","sortIndex","findEntry","recvEntry","startScreenSharingInternal","wasStartingScreen","wasStartingVideo","requestScreen","stopVideoSharing","startVideoSharingInternal","requestInputSource","track","inputStream","getVideoTracks","stopTrack","isSharingVideoType","audioTrack","getAudioTracks","setHangUpTimeout","clearHangUpTimeout","hangUpTimeout","setPhoneCall","phoneCall","canAccept","overrideConnectionState","g_a_hash","appCallsManager","generateDh","dh","g_b","g_a","g_b_hash","getCallInput","phonePhoneCall","savePhonePhoneCall","joinCall","encryptionKey","configuration","iceServers","connections","ipv6","port","urls","turn","stun","credential","iceTransportPolicy","p2p_allowed","getRtcConfiguration","sendIceCandidate","onTrack","encryptor","decryptor","processDecryptQueue","createDataChannelEntry","dataChannelEntry","createEntry","sendEntry","negotiated","applyDataChannelData","TextEncoder","encode","iceCandidate","parsed","p2pParseCandidate","confirmCall","key_fingerprint","computeKey","emojisFingerprint","getEmojisFingerprintPromise","codePoints","unlockStreamManager","doTheMagic","getTransceivers","transceiver","getEntryByMid","bundle","sdpDescription","generateSdp","isAnswer","setRemoteDescription","onInputStream","stream","videoTrack","onMutedChange","requestAudioSource","setMuted","discardReason","discardedByOtherParty","hasVideo","discardCall","performCodec","_codec","setDataToDescription","setData","transport","screencast","filterNotVP8","vp8PayloadType","rtxIdx","apt","applyCallSignalingData","performSsrcGroups","getEntryBySource","sendRecvEntry","findFreeSendRecvEntry","setEntrySource","tryToReleaseCandidates","generateCandidate","RTCIceCandidate","addIceCandidate","decryptedData","TextDecoder","decode","signalingData","onUpdatePhoneCallSignalingData","getStreamCached","_cache","isScreen","constraints","getScreenStream","getStream","CallInstanceBase","fixSafariAudio","isSharingAudio","hasInputTrackKind","isAudioGood","isVideoGood","getAudioConstraints","getVideoConstraints","getScreenConstraints","endpoint","tryAddTrack","streams","saveInputVideoStream","isOutput","elementEndpoint","addTrack","useStream","outputStream","srcObject","sinkId","outputDeviceId","setSinkId","getTracks","addStream","CALL_STATE","audioAsset","CALL_REQUEST_TIMEOUT","CallsController","sortedInstances","createCallInstance","admin_id","g_a_or_b","bytesCmp","callId","getCallByUserId","hasConnected","hasCurrent","startCallInternal","fullInfo","participant_id","requestCall","GROUP_CALL_AMPLITUDE_ANALYSE_COUNT_MAX","GROUP_CALL_AMPLITUDE_ANALYSE_INTERVAL_MS","GroupCallConnectionInstance","negotiateThrottled","bundlePolicy","rtcpMuxPolicy","iceCandidatePoolSize","maybeUpdateRemoteVideoConstraints","updateConstraintsInterval","invokeJoinGroupCall","localSdp","mainChannels","processedChannels","sectionInfo","payload","processMediaSection","audioChannel","videoChannel","useChannel","setEntryPeerId","performExtmap","filterServerCodecs","isNewConnection","originalOffer","iceRestart","hasMunged","skipAddingMulticast","mediaLine","mediaLineParts","localMLine","codecIds","newData","setPort","setSource","newSdp","addSsrcEntry","newChannel","mungedSdp","fixLocalOffer","entriesToDelete","shouldBeSkipped","answerDescription","deleteEntry","iceGatheringState","updateConstraints","sender","setParameters","getParameters","degradationPreference","colibriClass","defaultConstraints","onStageEndpoints","addInputVideoStream","GroupCallInstance","isSpeakingMap","pinnedSources","participantsSsrcs","hadAutoPinnedSources","dispatchPinnedThrottled","getCachedParticipants","presentation","unpinSource","changeUserMuted","source_groups","createConnectionInstance","raise","raiseHand","stopScreenSharing","startScreenSharing","startScreenSharingPromise","saveApiParticipant","leaveGroupCallPresentation","videoPaused","videoStopped","startVideoSharing","startVideoSharingPromise","rejoin","isDiscarded","isUpdatingMeInCurrentCall","onParticipantUpdate","doNotDispatchParticipantUpdate","hasLeft","oldSsrcs","modifiedTypes","oldSsrc","oldSource","oldEntry","originalDirection","setEndpoint","createTransceiver","GROUP_CALL_STATE","makeSsrcsFromParticipant","makeSsrcFromParticipant","audio_source","generateSelfVideo","audioSource","GroupCallsController","setCurrentGroupCall","startConnectingSound","stopConnectingSound","joinVideo","MediaStream","createMainStreamManager","joinGroupCallInternal","handleUpdateGroupCallParticipants","updatingSdp","channelCount","constraint","mediaDevices","getSupportedConstraints","constraintSupported","skipAudio","frameRate","screenStream","getDisplayMedia","contentHint","getUserMedia","clientInfo","lookupAttributeKeys","telegramSourceGroups","sdpLines","rest","parseSourceGroups","raw","ConferenceEntry","addTransceiver","generateSsrc","LocalConferenceDescription","sessionId","maxSeenId","entriesByMid","entriesBySource","entriesByPeerId","getEntriesByPeerId","conference","SDP","mediaSections","splitStringByLimitWithRest","UniqueNumberGenerator","generate","maxTries","_try","SDPAttributeSplitted","SDPMediaLineParts","SDPLine","SDPAttributeInner","missed","exists","nestedMap","makeAttributes","innerParts","SDPAttributes","fillAttributes","attributesMap","linesArray","SDPMediaSection","isReceiving","resultShouldBeArray","SDPSessionSection","parseSdp","createSection","sessionSection","lineStr","isIncorrectSdpLine","parseSdpLine","addSimulcast","generator","originalSsrcs","ssrcs2","ssrcsStrLines","ssrc2","WEBRTC_MEDIA_PORT","fixMediaLineType","getConnectionTypeForMediaType","generateMediaFirstLine","payloadIds","connectionType","SDPBuilder","addCandidate","performCandidate","addHeader","sId","bundleMids","addTransport","skipCandidates","addSource","addMsid","isApplication","isInactive","hdrexts","hdrext","fbs","fb","addConference","AudioStreamAnalyser","streamSource","createMediaStreamSource","gain","createGain","minDecibels","maxDecibels","smoothingTimeConstant","StreamManager","getAmplitude","streamAnalyser","analyse","ANALYSER_LISTENER","AudioContext","webkitAudioContext","getSource","itemSource","removeTrack","finalizeAddingTrack","changeTimer","substring","replaceInputAudio","oldTrack","timer","transceiverInit","tracks","mediaTrackType","trackIdx","replaceTrack","StringFromLineBuilder","newLine","addJoined","toTelegramSource","fromTelegramSource","rms","EMOJI_REG_EXP","getAbbreviation","onlyFirst","firstEmojiMatch","lastEmojiMatch","E","setBlankToAnchor","messageEntityTextUrl","messageEntityMentionName","isDraft","EMOJI_VERSIONS_SUPPORTED","inlineEl","newEmojiWidth","legacyEmojiWidth","isEmojiSupported","globalLazyLoadQueue","CustomEmojiElement","syncedPlayer","pausedElements","playersSynced","createCustomFiller","lastPausedVideo","middlewares","CustomEmojiRendererElement","clearedElements","WeakSet","isCanvasClean","emojiRenderers","getOffsets","offsetsMap","offsetParent","elementsArr","placeholders","isDimensionsSet","syncedPlayersFrames","isImageData","ImageData","frameWidth","frameHeight","lastChildWas","checkForAnyFrame","forceRenderAfter","renderEmojis","addCustomEmojis","addElements","usingOwnQueue","wrap","_loadPromises","newElements","isLottie","willHaveSyncedPlayer","newElementsArray","CUSTOM_EMOJI_INSTANT_PLAY","addition","_p","overrideRender","setRenderInterval","syncedPlayers","clearRenderInterval","missing","cachedPromises","uncachedPromisesPromise","loadFromPromises","uncached","emojiRenderInterval","renderers","nasty","usedLength","wrapSomething","wrapElement","noFiller","customWraps","contextSite","contextExternal","lastEntity","nextEntity","endPartOffset","fullEntityText","partText","usedText","fontFamily","atPos","fromBot","encodeURIComponent","isSupported","masked","currentContext","electronHelpers","contextUrl","wrapTelegramUrlToAnchor","encoded","encodeSpoiler","entityText","voodoo","insertCustomFillers","notFiller","isCustomFillerNeededBySiblingNode","url1","QueryableWorker","worker","terminate","onmessage","queryMethodListener","queryMethodArguments","postMessage","sendQuery","transfer","queryMethod","workersLimit","playersByCacheName","workers","curWorkerNum","onPlayerLoaded","reqId","fps","clamped","onPlayerError","getAnimation","setLoop","_autoplay","loadLottieWorkers","remain","Worker","queryableWorker","makeAssetUrl","loadAnimationAsAsset","loadAnimationFromURL","loadAnimationDataFromURL","blobConstruct","loadAnimationFromURLManually","loadAnimationFromURLNext","newParams","loadAnimationWorker","waitForFirstFrame","initPlayer","destroyWorkers","loadFromData","getLottiePixelRatio","RLottiePlayer","cachingDelta","CACHE","skipDelta","contexts","setMainLoop","clearPendingRAF","rafId","resetCurrentFrame","minFrame","requestFrame","applyInversing","renderFrame2","cachedSource","renderedFirstFrame","ImageBitmap","frInterval","frThen","frameNew","onLap","mainLoopForwards","mainLoopBackwards","currentMethod","frameListener","listenerResults","enterFrame","playToFrame","bounds","setMinMax","playToFrameOnFrameCallback","setInverseColor","pagesManager","pageId","pagesDiv","scrollableDiv","page","onShown","setPage","isAuthPage","Page","onFirstMount","encodeEmoji","emojiText","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","rawEmoji","unicodeSurrogates","points","getEmojiToneIndex","VIRTUAL_COUNTRIES_EMOJIS","getCountryEmoji","emojiFromCodePoints","fromCodePoint","module","exports","defineProperty","enumerable","Symbol","toStringTag","__esModule","prototype","isRecordingSupported","bufferLength","encoderApplication","encoderFrameSize","encoderPath","maxFramesPerPage","mediaTrackConstraints","resampleQuality","streamPages","wavBitDepth","encodedSamplePosition","WebAssembly","clearStream","audioContext","closeAudioContext","encodeBuffers","getChannelData","encoder","buffers","initAudioContext","initAudioGraph","scriptProcessorNode","createScriptProcessor","destination","onaudioprocess","inputBuffer","monitorGainNode","setMonitorGain","recordingGainNode","setRecordingGain","initSourceNode","loadWorker","initWorker","streamPage","storePage","recordedPages","samplePosition","finish","originalSampleRate","sampleRate","wavSampleRate","onpause","resume","onresume","setTargetAtTime","onstart","destroyWorker","Function","kSampleStepSize","float32ArraySupported","Float32Array","A","aA1","aA2","B","C","calcBezier","aT","getSlope","LinearEasing","mX1","mY1","mX2","mY2","sampleValues","aX","intervalStart","currentSample","kSplineTableSize","guessForT","initialSlope","aGuessT","currentSlope","newtonRaphsonIterate","aA","aB","currentX","currentT","binarySubdivide","getTForX"],"sourceRoot":""} \ No newline at end of file diff --git a/public/508.56e4692b095fba8d9cdf.chunk.js b/public/508.ffe1001d2cc7df6d2eb6.chunk.js similarity index 98% rename from public/508.56e4692b095fba8d9cdf.chunk.js rename to public/508.ffe1001d2cc7df6d2eb6.chunk.js index 2fdc3572d..7560e91f7 100644 --- a/public/508.56e4692b095fba8d9cdf.chunk.js +++ b/public/508.ffe1001d2cc7df6d2eb6.chunk.js @@ -1,2 +1,2 @@ (()=>{"use strict";(()=>{if("undefined"!=typeof __webpack_require__){var e=__webpack_require__.u,t=__webpack_require__.e,r={},i={};__webpack_require__.u=function(t){return e(t)+(r.hasOwnProperty(t)?"?"+r[t]:"")},__webpack_require__.e=function(n){return t(n).catch((function(t){var a=i.hasOwnProperty(n)?i[n]:999999;if(a<1){var o=e(n);throw t.message="Loading chunk "+n+" failed after 999999 retries.\n("+o+")",t.request=o,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();r[n]=t,i[n]=a-1,e(__webpack_require__.e(n))}),3e3)}))}))}}})();const e="undefined"!=typeof window?window:self,t=navigator?navigator.userAgent:null,r=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&e.MSStream,!!("safari"in e)||!(!t||!(/\b(iPad|iPhone|iPod)\b/.test(t)||t.match("Safari")&&!t.match("Chrome"))));let i;if(navigator.userAgent.toLowerCase().indexOf("firefox"),navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i),r)try{i=+navigator.userAgent.match(/Version\/(.+?) /)[1]>=14}catch(e){i=!1}else i=!0;const n=i,a="undefined"!=typeof ImageBitmap;const o=[[[16219713,13335381],[16757049,16168585],[16765248,16764327],[16768889,16768965]],[[16219713,10771e3],[16757049,14653547],[16765248,15577475],[16768889,16040864]],[[16219713,7354903],[16757049,11233085],[16765248,12812110],[16768889,14194279]],[[16219713,4858889],[16757049,8207886],[16765248,9852201],[16768889,11100983]],[[16219713,2101002],[16757049,4270372],[16765248,5848375],[16768889,6505791]]],s=e=>Math.round(255*Math.min(Math.max(e,0),1));importScripts("rlottie-wasm.js");const h=self.Module;class d{constructor(e,t,r,i){this.reqId=e,this.width=t,this.height=r,this.raw=i}init(e,t){if(!this.dead){this.fps=Math.max(1,Math.min(60,t||60));try{this.handle=c.Api.init(),this.stringOnWasmHeap=allocate(intArrayFromString(e),"i8",0),this.frameCount=c.Api.loadFromData(this.handle,this.stringOnWasmHeap),c.Api.resize(this.handle,this.width,this.height),m(["loaded",this.reqId,this.frameCount,this.fps]),!this.raw&&a&&(this.imageData=new ImageData(this.width,this.height))}catch(e){console.error("init RLottieItem error:",e),m(["error",this.reqId,e])}}}render(e,t){if(!this.dead&&void 0!==this.handle&&!(this.frameCount{m(["frame",this.reqId,e,t],[t])}))):(t?t.set(i):t=new Uint8ClampedArray(i),m(["frame",this.reqId,e,t],[t.buffer]))}catch(e){console.error("Render error:",e),this.dead=!0,m(["error",this.reqId,e])}}destroy(){this.dead=!0,void 0!==this.handle&&c.Api.destroy(this.handle)}}const c=new class{constructor(){this.Api={}}initApi(){this.Api={init:h.cwrap("lottie_init","",[]),destroy:h.cwrap("lottie_destroy","",["number"]),resize:h.cwrap("lottie_resize","",["number","number","number"]),buffer:h.cwrap("lottie_buffer","number",["number"]),render:h.cwrap("lottie_render","",["number","number"]),loadFromData:h.cwrap("lottie_load_from_data","number",["number","number"])}}init(){this.initApi(),m(["ready"])}};h.onRuntimeInitialized=function(){c.init()};const u={},f={loadFromData:function(e,t,r,i,n,a){const h=u[e]=new d(e,r,i,a);(function(e){return function(e,t){return new Promise((t=>{const r=new FileReader;r.addEventListener("loadend",(e=>{t(e.target.result)})),r.readAsText(e)}))}(e)})(t).then((t=>{try{if("number"==typeof n&&n>=1&&n<=5){const e=JSON.parse(t);(function(e,t){const r=o[Math.max(t-1,0)],i=e=>{switch(e.ty){case"st":case"fl":(e=>{const t=e.c.k,i=s(t[2])|s(t[1])<<8|s(t[0])<<16,n=r.find((e=>e[0]===i));n&&(t[0]=(n[1]>>16&255)/255,t[1]=(n[1]>>8&255)/255,t[2]=(255&n[1])/255)})(e)}e.hasOwnProperty("it")&&n(e.it)},n=e=>{for(const t of e)i(t)};try{for(const t of e.layers)if(t.shapes)for(const e of t.shapes)e.it?n(e.it):i(e)}catch(r){console.warn("cant apply replacements",r,e,t)}})(e,n),t=JSON.stringify(e)}const e=t.match(/"fr":\s*?(\d+?),/),r=+(null==e?void 0:e[1])||60;h.init(t,r)}catch(r){console.error("Invalid file for sticker:",t),m(["error",e,r])}}))},destroy:function(e){const t=u[e];t&&(t.destroy(),delete u[e])},renderFrame:function(e,t,r){u[e].render(t,r)}};function m(e,t){postMessage({queryMethodListener:e.shift(),queryMethodArguments:e},n?t:void 0)}onmessage=function(e){f[e.data.queryMethod].apply(f,e.data.queryMethodArguments)}})(); -//# sourceMappingURL=508.56e4692b095fba8d9cdf.chunk.js.map \ No newline at end of file +//# sourceMappingURL=508.ffe1001d2cc7df6d2eb6.chunk.js.map \ No newline at end of file diff --git a/public/508.56e4692b095fba8d9cdf.chunk.js.map b/public/508.ffe1001d2cc7df6d2eb6.chunk.js.map similarity index 99% rename from public/508.56e4692b095fba8d9cdf.chunk.js.map rename to public/508.ffe1001d2cc7df6d2eb6.chunk.js.map index fdefdba07..09a25001d 100644 --- a/public/508.56e4692b095fba8d9cdf.chunk.js.map +++ b/public/508.ffe1001d2cc7df6d2eb6.chunk.js.map @@ -1 +1 @@ -{"version":3,"file":"508.56e4692b095fba8d9cdf.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/compat","webpack://tweb/./src/environment/ctx.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/environment/canUseTransferables.ts","webpack://tweb/./src/environment/imageBitmapSupport.ts","webpack://tweb/./src/lib/rlottie/applyReplacements.ts","webpack://tweb/./src/lib/rlottie/rlottie.worker.ts","webpack://tweb/./src/helpers/blob/readBlobAsText.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts"],"sourcesContent":["(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\n","import {IS_SAFARI} from './userAgent';\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","const IS_IMAGE_BITMAP_SUPPORTED = typeof(ImageBitmap) !== 'undefined';\n\nexport default IS_IMAGE_BITMAP_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// https://github.com/telegramdesktop/tdesktop/blob/97d8ee75d51874fcb74a9bfadc79f835c82be54a/Telegram/SourceFiles/chat_helpers/stickers_emoji_pack.cpp#L46\nconst COLORREPLACEMENTS = [\n [\n [0xf77e41, 0xcb7b55],\n [0xffb139, 0xf6b689],\n [0xffd140, 0xffcda7],\n [0xffdf79, 0xffdfc5]\n ],\n\n [\n [0xf77e41, 0xa45a38],\n [0xffb139, 0xdf986b],\n [0xffd140, 0xedb183],\n [0xffdf79, 0xf4c3a0]\n ],\n\n [\n [0xf77e41, 0x703a17],\n [0xffb139, 0xab673d],\n [0xffd140, 0xc37f4e],\n [0xffdf79, 0xd89667]\n ],\n\n [\n [0xf77e41, 0x4a2409],\n [0xffb139, 0x7d3e0e],\n [0xffd140, 0x965529],\n [0xffdf79, 0xa96337]\n ],\n\n [\n [0xf77e41, 0x200f0a],\n [0xffb139, 0x412924],\n [0xffd140, 0x593d37],\n [0xffdf79, 0x63453f]\n ]\n];\n\nconst convert = (value: number) => {\n return Math.round(Math.min(Math.max(value, 0), 1) * 255);\n};\n\ntype LottieShape = {\n c: {\n k: number[]\n },\n ty: 'st' | 'fl',\n it?: LottieShape[]\n};\n\nexport default function applyReplacements(object: {\n layers: Array<{shapes: LottieShape[]}>\n}, toneIndex: number) {\n const replacements = COLORREPLACEMENTS[Math.max(toneIndex - 1, 0)];\n\n const applyTo = (smth: LottieShape) => {\n const k = smth.c.k;\n const color = convert(k[2]) | (convert(k[1]) << 8) | (convert(k[0]) << 16);\n\n const foundReplacement = replacements.find((p) => p[0] === color);\n if(foundReplacement) {\n k[0] = ((foundReplacement[1] >> 16) & 255) / 255;\n k[1] = ((foundReplacement[1] >> 8) & 255) / 255;\n k[2] = (foundReplacement[1] & 255) / 255;\n }\n\n // console.log('foundReplacement!', foundReplacement, color.toString(16), k);\n };\n\n const checkSmth = (smth: LottieShape) => {\n switch(smth.ty) {\n case 'st':\n case 'fl':\n applyTo(smth);\n break;\n }\n\n if(smth.hasOwnProperty('it')) {\n iterateIt(smth.it);\n }\n };\n\n const iterateIt = (it: LottieShape['it']) => {\n for(const smth of it) {\n checkSmth(smth);\n }\n };\n\n try {\n for(const layer of object.layers) {\n if(!layer.shapes) continue;\n\n for(const shape of layer.shapes) {\n if(!shape.it) {\n checkSmth(shape);\n continue;\n }\n\n iterateIt(shape.it);\n }\n }\n } catch(err) {\n console.warn('cant apply replacements', err, object, toneIndex);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\nimport readBlobAsText from '../../helpers/blob/readBlobAsText';\nimport applyReplacements from './applyReplacements';\n\nimportScripts('rlottie-wasm.js');\n// import Module, { allocate, intArrayFromString } from './rlottie-wasm';\n\nconst _Module = (self as any).Module as any;\n\nconst DEFAULT_FPS = 60;\n\ntype LottieHandlePointer = number;\n\n// throw new Error('test');\n\nexport class RLottieItem {\n private stringOnWasmHeap: number;\n private handle: LottieHandlePointer;\n private frameCount: number;\n private fps: number;\n\n private dead: boolean;\n // private context: OffscreenCanvasRenderingContext2D;\n\n private imageData: ImageData;\n\n constructor(\n private reqId: number,\n private width: number,\n private height: number,\n private raw?: boolean/* ,\n private canvas: OffscreenCanvas */\n ) {\n }\n\n public init(json: string, fps: number) {\n if(this.dead) {\n return;\n }\n\n this.fps = Math.max(1, Math.min(60, fps || DEFAULT_FPS));\n\n // this.context = canvas.getContext('2d');\n /* let frame = 0;\n setInterval(() => {\n if(frame >= this.frameCount) frame = 0;\n let _frame = frame++;\n this.render(_frame, null);\n }, 1000 / this.fps); */\n\n try {\n this.handle = worker.Api.init();\n\n // @ts-ignore\n this.stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0);\n\n this.frameCount = worker.Api.loadFromData(this.handle, this.stringOnWasmHeap);\n\n worker.Api.resize(this.handle, this.width, this.height);\n\n reply(['loaded', this.reqId, this.frameCount, this.fps]);\n\n if(!this.raw && IS_IMAGE_BITMAP_SUPPORTED) {\n this.imageData = new ImageData(this.width, this.height);\n }\n } catch(e) {\n console.error('init RLottieItem error:', e);\n reply(['error', this.reqId, e]);\n }\n }\n\n public render(frameNo: number, clamped?: Uint8ClampedArray) {\n if(this.dead || this.handle === undefined) return;\n // return;\n\n if(this.frameCount < frameNo || frameNo < 0) {\n return;\n }\n\n try {\n worker.Api.render(this.handle, frameNo);\n\n const bufferPointer = worker.Api.buffer(this.handle);\n\n const data = _Module.HEAPU8.subarray(bufferPointer, bufferPointer + (this.width * this.height * 4));\n\n if(this.imageData) {\n this.imageData.data.set(data);\n createImageBitmap(this.imageData).then((imageBitmap) => {\n reply(['frame', this.reqId, frameNo, imageBitmap], [imageBitmap]);\n });\n } else {\n if(!clamped) {\n clamped = new Uint8ClampedArray(data);\n } else {\n clamped.set(data);\n }\n\n // this.context.putImageData(new ImageData(clamped, this.width, this.height), 0, 0);\n\n reply(['frame', this.reqId, frameNo, clamped], [clamped.buffer]);\n }\n } catch(e) {\n console.error('Render error:', e);\n this.dead = true;\n reply(['error', this.reqId, e]);\n }\n }\n\n public destroy() {\n this.dead = true;\n\n if(this.handle !== undefined) {\n worker.Api.destroy(this.handle);\n }\n }\n}\n\nclass RLottieWorker {\n public Api: {\n init: () => LottieHandlePointer,\n destroy: (handle: LottieHandlePointer) => void,\n resize: (handle: LottieHandlePointer, width: number, height: number) => void,\n buffer: (handle: LottieHandlePointer) => number,\n render: (handle: LottieHandlePointer, frameNo: number) => void,\n loadFromData: (handle: LottieHandlePointer, bufferPointer: number) => number\n } = {} as any;\n\n public initApi() {\n this.Api = {\n init: _Module.cwrap('lottie_init', '', []),\n destroy: _Module.cwrap('lottie_destroy', '', ['number']),\n resize: _Module.cwrap('lottie_resize', '', ['number', 'number', 'number']),\n buffer: _Module.cwrap('lottie_buffer', 'number', ['number']),\n render: _Module.cwrap('lottie_render', '', ['number', 'number']),\n loadFromData: _Module.cwrap('lottie_load_from_data', 'number', ['number', 'number'])\n };\n }\n\n public init() {\n this.initApi();\n reply(['ready']);\n }\n}\n\nconst worker = new RLottieWorker();\n\n_Module.onRuntimeInitialized = function() {\n worker.init();\n};\n\nconst items: {[reqId: string]: RLottieItem} = {};\nconst queryableFunctions = {\n loadFromData: function(reqId: number, blob: Blob, width: number, height: number, toneIndex: number, raw: boolean/* , canvas: OffscreenCanvas */) {\n const item = items[reqId] = new RLottieItem(reqId, width, height, raw/* , canvas */);\n readBlobAsText(blob).then((json) => {\n try {\n if(typeof(toneIndex) === 'number' && toneIndex >= 1 && toneIndex <= 5) {\n /* params.animationData = copy(params.animationData);\n this.applyReplacements(params.animationData, toneIndex); */\n\n const newAnimationData = JSON.parse(json);\n applyReplacements(newAnimationData, toneIndex);\n json = JSON.stringify(newAnimationData);\n }\n\n // ! WARNING, с этой проверкой не все стикеры работают, например - ДУРКА\n /* if(!/\"tgs\":\\s*?1./.test(jsString)) {\n throw new Error('Invalid file');\n } */\n\n /* let perf = performance.now();\n let json = JSON.parse(jsString);\n console.log('sticker decode:', performance.now() - perf); */\n\n const match = json.match(/\"fr\":\\s*?(\\d+?),/);\n const frameRate = +match?.[1] || DEFAULT_FPS;\n\n // console.log('Rendering sticker:', reqId, frameRate, 'now rendered:', Object.keys(items).length);\n\n item.init(json, frameRate);\n } catch(err) {\n console.error('Invalid file for sticker:', json);\n reply(['error', reqId, err]);\n }\n });\n },\n destroy: function(reqId: number) {\n const item = items[reqId];\n if(!item) {\n return;\n }\n\n item.destroy();\n delete items[reqId];\n },\n renderFrame: function(reqId: number, frameNo: number, clamped?: Uint8ClampedArray) {\n // console.log('worker renderFrame', reqId, frameNo, clamped);\n items[reqId].render(frameNo, clamped);\n }\n};\n\nfunction reply(args: any[], transfer?: Transferable[]) {\n postMessage({queryMethodListener: args.shift(), queryMethodArguments: args}, CAN_USE_TRANSFERABLES ? transfer : undefined);\n}\n\nonmessage = function(e) {\n // @ts-ignore\n queryableFunctions[e.data.queryMethod].apply(queryableFunctions, e.data.queryMethodArguments);\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsText(blob: Blob) {\n return readBlobAs(blob, 'readAsText');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n"],"names":["__webpack_require__","oldGetScript","u","oldLoadScript","e","queryMap","countMap","chunkId","hasOwnProperty","catch","error","retries","realSrc","message","request","Promise","resolve","setTimeout","cacheBust","Date","now","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","CAN_USE_TRANSFERABLES","err","COLORREPLACEMENTS","convert","value","Math","round","min","max","importScripts","_Module","Module","RLottieItem","constructor","reqId","width","height","raw","init","json","fps","this","dead","handle","worker","Api","stringOnWasmHeap","allocate","intArrayFromString","frameCount","loadFromData","resize","reply","imageData","ImageData","console","render","frameNo","clamped","undefined","bufferPointer","buffer","data","HEAPU8","subarray","set","createImageBitmap","then","imageBitmap","Uint8ClampedArray","destroy","initApi","cwrap","onRuntimeInitialized","items","queryableFunctions","blob","toneIndex","item","method","reader","FileReader","addEventListener","target","result","readBlobAs","readBlobAsText","newAnimationData","JSON","parse","object","replacements","checkSmth","smth","ty","k","c","color","foundReplacement","find","p","applyTo","iterateIt","it","layer","layers","shapes","shape","warn","applyReplacements","stringify","frameRate","renderFrame","args","transfer","postMessage","queryMethodListener","shift","queryMethodArguments","onmessage","queryMethod","apply"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"508.ffe1001d2cc7df6d2eb6.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/compat","webpack://tweb/./src/environment/ctx.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/environment/canUseTransferables.ts","webpack://tweb/./src/environment/imageBitmapSupport.ts","webpack://tweb/./src/lib/rlottie/applyReplacements.ts","webpack://tweb/./src/lib/rlottie/rlottie.worker.ts","webpack://tweb/./src/helpers/blob/readBlobAsText.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts"],"sourcesContent":["(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","const ctx = typeof(window) !== 'undefined' ? window : self;\n\nexport default ctx;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\n","import {IS_SAFARI} from './userAgent';\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","const IS_IMAGE_BITMAP_SUPPORTED = typeof(ImageBitmap) !== 'undefined';\n\nexport default IS_IMAGE_BITMAP_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// https://github.com/telegramdesktop/tdesktop/blob/97d8ee75d51874fcb74a9bfadc79f835c82be54a/Telegram/SourceFiles/chat_helpers/stickers_emoji_pack.cpp#L46\nconst COLORREPLACEMENTS = [\n [\n [0xf77e41, 0xcb7b55],\n [0xffb139, 0xf6b689],\n [0xffd140, 0xffcda7],\n [0xffdf79, 0xffdfc5]\n ],\n\n [\n [0xf77e41, 0xa45a38],\n [0xffb139, 0xdf986b],\n [0xffd140, 0xedb183],\n [0xffdf79, 0xf4c3a0]\n ],\n\n [\n [0xf77e41, 0x703a17],\n [0xffb139, 0xab673d],\n [0xffd140, 0xc37f4e],\n [0xffdf79, 0xd89667]\n ],\n\n [\n [0xf77e41, 0x4a2409],\n [0xffb139, 0x7d3e0e],\n [0xffd140, 0x965529],\n [0xffdf79, 0xa96337]\n ],\n\n [\n [0xf77e41, 0x200f0a],\n [0xffb139, 0x412924],\n [0xffd140, 0x593d37],\n [0xffdf79, 0x63453f]\n ]\n];\n\nconst convert = (value: number) => {\n return Math.round(Math.min(Math.max(value, 0), 1) * 255);\n};\n\ntype LottieShape = {\n c: {\n k: number[]\n },\n ty: 'st' | 'fl',\n it?: LottieShape[]\n};\n\nexport default function applyReplacements(object: {\n layers: Array<{shapes: LottieShape[]}>\n}, toneIndex: number) {\n const replacements = COLORREPLACEMENTS[Math.max(toneIndex - 1, 0)];\n\n const applyTo = (smth: LottieShape) => {\n const k = smth.c.k;\n const color = convert(k[2]) | (convert(k[1]) << 8) | (convert(k[0]) << 16);\n\n const foundReplacement = replacements.find((p) => p[0] === color);\n if(foundReplacement) {\n k[0] = ((foundReplacement[1] >> 16) & 255) / 255;\n k[1] = ((foundReplacement[1] >> 8) & 255) / 255;\n k[2] = (foundReplacement[1] & 255) / 255;\n }\n\n // console.log('foundReplacement!', foundReplacement, color.toString(16), k);\n };\n\n const checkSmth = (smth: LottieShape) => {\n switch(smth.ty) {\n case 'st':\n case 'fl':\n applyTo(smth);\n break;\n }\n\n if(smth.hasOwnProperty('it')) {\n iterateIt(smth.it);\n }\n };\n\n const iterateIt = (it: LottieShape['it']) => {\n for(const smth of it) {\n checkSmth(smth);\n }\n };\n\n try {\n for(const layer of object.layers) {\n if(!layer.shapes) continue;\n\n for(const shape of layer.shapes) {\n if(!shape.it) {\n checkSmth(shape);\n continue;\n }\n\n iterateIt(shape.it);\n }\n }\n } catch(err) {\n console.warn('cant apply replacements', err, object, toneIndex);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CAN_USE_TRANSFERABLES from '../../environment/canUseTransferables';\nimport IS_IMAGE_BITMAP_SUPPORTED from '../../environment/imageBitmapSupport';\nimport readBlobAsText from '../../helpers/blob/readBlobAsText';\nimport applyReplacements from './applyReplacements';\n\nimportScripts('rlottie-wasm.js');\n// import Module, { allocate, intArrayFromString } from './rlottie-wasm';\n\nconst _Module = (self as any).Module as any;\n\nconst DEFAULT_FPS = 60;\n\ntype LottieHandlePointer = number;\n\n// throw new Error('test');\n\nexport class RLottieItem {\n private stringOnWasmHeap: number;\n private handle: LottieHandlePointer;\n private frameCount: number;\n private fps: number;\n\n private dead: boolean;\n // private context: OffscreenCanvasRenderingContext2D;\n\n private imageData: ImageData;\n\n constructor(\n private reqId: number,\n private width: number,\n private height: number,\n private raw?: boolean/* ,\n private canvas: OffscreenCanvas */\n ) {\n }\n\n public init(json: string, fps: number) {\n if(this.dead) {\n return;\n }\n\n this.fps = Math.max(1, Math.min(60, fps || DEFAULT_FPS));\n\n // this.context = canvas.getContext('2d');\n /* let frame = 0;\n setInterval(() => {\n if(frame >= this.frameCount) frame = 0;\n let _frame = frame++;\n this.render(_frame, null);\n }, 1000 / this.fps); */\n\n try {\n this.handle = worker.Api.init();\n\n // @ts-ignore\n this.stringOnWasmHeap = allocate(intArrayFromString(json), 'i8', 0);\n\n this.frameCount = worker.Api.loadFromData(this.handle, this.stringOnWasmHeap);\n\n worker.Api.resize(this.handle, this.width, this.height);\n\n reply(['loaded', this.reqId, this.frameCount, this.fps]);\n\n if(!this.raw && IS_IMAGE_BITMAP_SUPPORTED) {\n this.imageData = new ImageData(this.width, this.height);\n }\n } catch(e) {\n console.error('init RLottieItem error:', e);\n reply(['error', this.reqId, e]);\n }\n }\n\n public render(frameNo: number, clamped?: Uint8ClampedArray) {\n if(this.dead || this.handle === undefined) return;\n // return;\n\n if(this.frameCount < frameNo || frameNo < 0) {\n return;\n }\n\n try {\n worker.Api.render(this.handle, frameNo);\n\n const bufferPointer = worker.Api.buffer(this.handle);\n\n const data = _Module.HEAPU8.subarray(bufferPointer, bufferPointer + (this.width * this.height * 4));\n\n if(this.imageData) {\n this.imageData.data.set(data);\n createImageBitmap(this.imageData).then((imageBitmap) => {\n reply(['frame', this.reqId, frameNo, imageBitmap], [imageBitmap]);\n });\n } else {\n if(!clamped) {\n clamped = new Uint8ClampedArray(data);\n } else {\n clamped.set(data);\n }\n\n // this.context.putImageData(new ImageData(clamped, this.width, this.height), 0, 0);\n\n reply(['frame', this.reqId, frameNo, clamped], [clamped.buffer]);\n }\n } catch(e) {\n console.error('Render error:', e);\n this.dead = true;\n reply(['error', this.reqId, e]);\n }\n }\n\n public destroy() {\n this.dead = true;\n\n if(this.handle !== undefined) {\n worker.Api.destroy(this.handle);\n }\n }\n}\n\nclass RLottieWorker {\n public Api: {\n init: () => LottieHandlePointer,\n destroy: (handle: LottieHandlePointer) => void,\n resize: (handle: LottieHandlePointer, width: number, height: number) => void,\n buffer: (handle: LottieHandlePointer) => number,\n render: (handle: LottieHandlePointer, frameNo: number) => void,\n loadFromData: (handle: LottieHandlePointer, bufferPointer: number) => number\n } = {} as any;\n\n public initApi() {\n this.Api = {\n init: _Module.cwrap('lottie_init', '', []),\n destroy: _Module.cwrap('lottie_destroy', '', ['number']),\n resize: _Module.cwrap('lottie_resize', '', ['number', 'number', 'number']),\n buffer: _Module.cwrap('lottie_buffer', 'number', ['number']),\n render: _Module.cwrap('lottie_render', '', ['number', 'number']),\n loadFromData: _Module.cwrap('lottie_load_from_data', 'number', ['number', 'number'])\n };\n }\n\n public init() {\n this.initApi();\n reply(['ready']);\n }\n}\n\nconst worker = new RLottieWorker();\n\n_Module.onRuntimeInitialized = function() {\n worker.init();\n};\n\nconst items: {[reqId: string]: RLottieItem} = {};\nconst queryableFunctions = {\n loadFromData: function(reqId: number, blob: Blob, width: number, height: number, toneIndex: number, raw: boolean/* , canvas: OffscreenCanvas */) {\n const item = items[reqId] = new RLottieItem(reqId, width, height, raw/* , canvas */);\n readBlobAsText(blob).then((json) => {\n try {\n if(typeof(toneIndex) === 'number' && toneIndex >= 1 && toneIndex <= 5) {\n /* params.animationData = copy(params.animationData);\n this.applyReplacements(params.animationData, toneIndex); */\n\n const newAnimationData = JSON.parse(json);\n applyReplacements(newAnimationData, toneIndex);\n json = JSON.stringify(newAnimationData);\n }\n\n // ! WARNING, с этой проверкой не все стикеры работают, например - ДУРКА\n /* if(!/\"tgs\":\\s*?1./.test(jsString)) {\n throw new Error('Invalid file');\n } */\n\n /* let perf = performance.now();\n let json = JSON.parse(jsString);\n console.log('sticker decode:', performance.now() - perf); */\n\n const match = json.match(/\"fr\":\\s*?(\\d+?),/);\n const frameRate = +match?.[1] || DEFAULT_FPS;\n\n // console.log('Rendering sticker:', reqId, frameRate, 'now rendered:', Object.keys(items).length);\n\n item.init(json, frameRate);\n } catch(err) {\n console.error('Invalid file for sticker:', json);\n reply(['error', reqId, err]);\n }\n });\n },\n destroy: function(reqId: number) {\n const item = items[reqId];\n if(!item) {\n return;\n }\n\n item.destroy();\n delete items[reqId];\n },\n renderFrame: function(reqId: number, frameNo: number, clamped?: Uint8ClampedArray) {\n // console.log('worker renderFrame', reqId, frameNo, clamped);\n items[reqId].render(frameNo, clamped);\n }\n};\n\nfunction reply(args: any[], transfer?: Transferable[]) {\n postMessage({queryMethodListener: args.shift(), queryMethodArguments: args}, CAN_USE_TRANSFERABLES ? transfer : undefined);\n}\n\nonmessage = function(e) {\n // @ts-ignore\n queryableFunctions[e.data.queryMethod].apply(queryableFunctions, e.data.queryMethodArguments);\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsText(blob: Blob) {\n return readBlobAs(blob, 'readAsText');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n"],"names":["__webpack_require__","oldGetScript","u","oldLoadScript","e","queryMap","countMap","chunkId","hasOwnProperty","catch","error","retries","realSrc","message","request","Promise","resolve","setTimeout","cacheBust","Date","now","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","CAN_USE_TRANSFERABLES","err","COLORREPLACEMENTS","convert","value","Math","round","min","max","importScripts","_Module","Module","RLottieItem","constructor","reqId","width","height","raw","init","json","fps","this","dead","handle","worker","Api","stringOnWasmHeap","allocate","intArrayFromString","frameCount","loadFromData","resize","reply","imageData","ImageData","console","render","frameNo","clamped","undefined","bufferPointer","buffer","data","HEAPU8","subarray","set","createImageBitmap","then","imageBitmap","Uint8ClampedArray","destroy","initApi","cwrap","onRuntimeInitialized","items","queryableFunctions","blob","toneIndex","item","method","reader","FileReader","addEventListener","target","result","readBlobAs","readBlobAsText","newAnimationData","JSON","parse","object","replacements","checkSmth","smth","ty","k","c","color","foundReplacement","find","p","applyTo","iterateIt","it","layer","layers","shapes","shape","warn","applyReplacements","stringify","frameRate","renderFrame","args","transfer","postMessage","queryMethodListener","shift","queryMethodArguments","onmessage","queryMethod","apply"],"sourceRoot":""} \ No newline at end of file diff --git a/public/61.9f135819bd5af1b57a36.chunk.js b/public/61.3cfffcdc0849ca3fc87c.chunk.js similarity index 99% rename from public/61.9f135819bd5af1b57a36.chunk.js rename to public/61.3cfffcdc0849ca3fc87c.chunk.js index 98b3b84cf..223941b20 100644 --- a/public/61.9f135819bd5af1b57a36.chunk.js +++ b/public/61.3cfffcdc0849ca3fc87c.chunk.js @@ -1,2 +1,2 @@ (()=>{"use strict";var t,e,r={2061:(t,e,r)=>{let n,a;const o=null;function f(t){return JSON.parse(JSON.stringify(t))}function c(t,e,r,a,o){for(n=0;n=0;--r)e=f(d(t[r],e));return e}function g(t){if(!t)throw Error("assert :P")}const P=function(){function t(t){return t==Ee||t==je||t==Ce||t==Fe}function e(t){return A(t,1)}function r(t,e){const r=1+((t.la-1)*e>>8),n=r<<8;let a=0;for(t.Z>=n?(a=1,t.la-=r,t.Z-=n):(a=0,t.la=r);t.la<128;)t.Z<<=1,t.la<<=1,8==++t.gc&&(t.gc=0,t.bc&&(t.Z+=t.qa[t.Ia++],t.bc--));return a}function P(t,e,r,n){(n-=r)>=2?(t.Z=e[r+0]<<8|e[r+1],t.qa=e,t.Ia=r+2,t.bc=n-2):(t.Z=0,t.qa=o,t.bc=0),t.la=255,t.gc=0}function A(t,e){var n=0,a=0;for(a=e-1;a>=0;a--)n|=r(t,128)<=8&&t.Q>>=8,t.T+=t.qa[t.Ia+t.Q]<<24>>>0,++t.Q,t.g-=8}function y(t){t.g>=8&&w(t),t.Q==t.ya&&32==t.g&&(t.L=1)}function S(t,e){let r=0;if(g(e>=0),!t.L&&e=32&&(t.L=1,t.g+e>32))return r;r=t.T>>t.g&fr[e],t.g+=e,t.g>=8&&t.g>=8&&w(t)}else t.fa=1;return r}function T(t){return t.Pa==t.gb}function R(t,e){return g(t!=o),0==e?0:(t.gb=2*e-1,t.Y=v(t.gb,Dr),t.Y==o?0:(t.Y[0].s=-1,t.Pa=1))}function O(t){t!=o&&(t.Y=o,t.Y=o,t.gb=0,t.Pa=0)}function V(t,e,r,n){for(var a=t.Y,o=0,f=+t.gb;n-- >0;){if(o>=f)return 0;if(a[o].s<0){if(T(t))return 0;const e=t,r=e.Y,n=+e.Pa;a[o].s=n-o,e.Pa+=2,r[n+0].s=-1,r[n+1].s=-1}else if(0==a[o].s)return 0;o+=a[o].s+(r>>n&1)}if(a[o].s<0)a[o].s=0;else if(0!=a[o].s)return 0;return a[o].kc=e,1}function I(t,e,r){var n=0;let a=0,f=0;for(g(t!=o),g(e!=o),n=0;n0&&(++a,f=n);if(!R(t,a))return 0;if(1==a)return f<0||f>=r?(O(t),0):V(t,f,0,0);if(a=0,f=d(r,0),f==o)return(a=a&&T(t))||O(t),a;var c=0;c=0,n=d(pr+1,0);let i=0;const u=d(pr+1,0);let b=0;for(g(e!=o),g(r>0),g(f!=o),c=0;cb&&(b=e[c]);if(b>pr)n=0;else{for(c=0;c0?u[e[c]]++:jr;n=1}if(!n)return(a=a&&T(t))||O(t),a;for(n=0;n0&&!V(t,n,f[n],e[n]))return(a=a&&T(t))||O(t),a;return(a=T(t))||O(t),a}function _(t,e,r,n,a,o,f){var c=0;for(c=0;ct.P.v)&&(r=0==e)){t:{let e=t.Ga;var a=t.G,i=t.ub;r=t.P.l;let h=t.P.v;const v=t.Xb;var u=[o];let p=o,P=h*r;var b=o,s=o;s="WEBP_FILTER_TYPE";let A=0;u=0;var l=0;let k=0;if(g(r>0&&h>0&&n>=r),g(e!=o&&v!=o),i<=Sr)r=0;else if(k=e[a+0]>>0&3,s=e[a+0]>>2&3,A=e[a+0]>>4&3,u=e[a+0]>>6&3,kRr||s>=Sn||A>Or||0!=u)r=0;else{if(k==Tr)l=i>=P,u=e,p=a+Sr;else{if(p=0,(u=d(P,0))==o){r=0;break t}l=a+Sr,i-=Sr,a=u,b=f(tr);let t=0;const n=qt();n==o?l=0:(n.l=r,n.v=h,n.N=b,st(Ve),b.put=Pe,b.Mb=ge,b.Pb=Ae,b.ka=o,b.ka=a,b.fd=0,b.width=r,b.height=h,n.a=ze,m(n.o,e,l,i),n.Wa=An,Jt(r,h,1,n,o)&&Yt(n,r)&&(n.Wa=Pn,t=Ht(n,n.V,n.Ha,n.l,n.v,xt)),n!=o&&Kt(n),l=t)}if(l){for(e=Tn[s],e!=o?((b=d(P,0))==o&&(l=0,k!=Tr&&(p=u=o)),e(u,p,r,h,1,r,b,s=0),P=b,k=s):(P=u,k=p),e=0;h-- >0;)c(v,e,P,k,r),k+=r,e+=n;A==Or&&(l=u==o||p<=0||r<=0?0:1)}r=l}}r=!r}return r?o:0==e?t.Xb:+e*n}function U(t,e,r,n){if(n==o||t<=0||e<=0)return Ke;if(r!=o){if(r.Ua){const n=r.wc,a=r.vc,o=-2&r.t,f=-2&r.k;if(o<0||f<0||n<=0||a<=0||o+n>t||f+a>e)return Ke;t=n,e=a}if(r.I){if(r.Ba<=0||r.Aa<=0)return Ke;t=r.Ba,e=r.Aa}}return n.width=t,n.height=e,function(t){let e=t.width;const r=t.height;let n=t.J;if(e<=0||r<=0||!(n>=Ie&&n=Ie&&f=c*Rn[f],n&=t.ma!=o):(u=(t=t.c.Va).nb*parseInt((i+1)/2,10),b=t.rb*parseInt((i+1)/2,10),s=t.Fa*i,n&=t.F*i<=t.Wc,n&=u<=t.Rc,n&=b<=t.Uc,n&=s<=t.Wb,n&=t.F>=c,n&=t.nb>=parseInt((c+1)/2,10),n&=t.rb>=parseInt((c+1)/2,10),n&=t.y!=o,n&=t.c!=o,n&=t.S!=o,f==Ne&&(n&=t.Fa>=c,n&=s<=t.Wb,n&=t.p!=o)):n=0,n?ze:Ke}(n)}function M(t){return-256&t?t<0?0:255:t}function B(t,e,r,n){const a=d(16,0);let o,f;for(o=0,f=0;f<4;++f){var c=t[e+0]+t[e+8],i=t[e+0]-t[e+8],u=(t[e+4]*Bn>>16)-(t[e+12]*Mn>>16),b=(t[e+4]*Mn>>16)+(t[e+12]*Bn>>16);a[o+0]=c+b,a[o+1]=i+u,a[o+2]=i-u,a[o+3]=c-b,o+=4,e++}for(f=o=0;f<4;++f)c=(t=a[o+0]+4)+a[o+8],i=t-a[o+8],u=(a[o+4]*Bn>>16)-(a[o+12]*Mn>>16),b=(a[o+4]*Mn>>16)+(a[o+12]*Bn>>16),r[n+0+0*en]=M(r[n+0+0*en]+(c+b>>3)),r[n+1+0*en]=M(r[n+1+0*en]+(i+u>>3)),r[n+2+0*en]=M(r[n+2+0*en]+(i-u>>3)),r[n+3+0*en]=M(r[n+3+0*en]+(c-b>>3)),o++,n+=en}function D(t,e,r,n,a){B(t,e,r,n),a&&B(t,e+16,r,n+4)}function E(t,e,r,n){Cn(t,e+0,r,n+0,1),Cn(t,e+32,r,n+4*en,1)}function C(t,e,r,n){let a;for(t=t[e+0]+4,a=0;a<4;++a)for(e=0;e<4;++e)r[n+e+a*en]=M(r[n+e+a*en]+(t>>3))}function F(t,e,r,n){t[e+0]&&C(t,e+0,r,n+0),t[e+16]&&C(t,e+16,r,n+4),t[e+32]&&C(t,e+32,r,n+4*en),t[e+48]&&C(t,e+48,r,n+4*en+4)}function G(t,e,r){const n=e-en,a=Wn,o=255-t[n-1];let f;for(f=0;f>2}function H(t,e,r){let n,a;for(n=0;n<8;++n)for(a=0;a<8;++a)e[r+a+n*en]=t}function z(t,e,r){const n=t[e-r],a=t[e+0],o=3*(a-n)+In[1020+t[e-2*r]-t[e+r]],f=_n[112+(o+4>>3)];t[e-r]=Wn[255+n+_n[112+(o+3>>3)]],t[e+0]=Wn[255+a-f]}function q(t,e,r,n){const a=t[e+0],o=t[e+r];return On[255+t[e-2*r]-t[e-r]]>n||On[255+o-a]>n}function K(t,e,r,n,a){const o=t[e-3*r],f=t[e-2*r],c=t[e-r],i=t[e+0],u=t[e+r],b=t[e+2*r],s=t[e+3*r];return 2*On[255+c-i]+Vn[255+f-u]>n?0:On[255+t[e-4*r]-o]<=a&&On[255+o-f]<=a&&On[255+f-c]<=a&&On[255+s-b]<=a&&On[255+b-u]<=a&&On[255+u-i]<=a}function J(t,e,r,n){let a;for(a=0;a<16;++a)2*On[255+t[e+a-r]-t[e+a+0]]+Vn[255+t[e+a-2*r]-t[e+a+r]]<=n&&z(t,e+a,r)}function Y(t,e,r,n){let a;for(a=0;a<16;++a)2*On[255+t[e+a*r-1]-t[e+a*r+0]]+Vn[255+t[e+a*r-2]-t[e+a*r+1]]<=n&&z(t,e+a*r,1)}function x(t,e,r,n){let a;for(a=3;a>0;--a)J(t,(e+=4*r)+0,r,n)}function Q(t,e,r,n){let a;for(a=3;a>0;--a)Y(t,(e+=4)+0,r,n)}function $(t,e,r,n,a,o,f,c){for(;a-- >0;){if(K(t,e+0,r,o,f))if(q(t,e+0,r,c))z(t,e+0,r);else{const n=t,a=e+0,o=r,f=n[a-2*o],c=n[a-o],u=n[a+0],b=n[a+o],s=n[a+2*o],l=27*(i=In[1020+3*(u-c)+In[1020+f-b]])+63>>7,h=18*i+63>>7;var i=9*i+63>>7;n[a-3*o]=Wn[255+n[a-3*o]+i],n[a-2*o]=Wn[255+f+h],n[a-o]=Wn[255+c+l],n[a+0]=Wn[255+u-l],n[a+o]=Wn[255+b-h],n[a+2*o]=Wn[255+s-i]}e+=n}}function X(t,e,r,n,a,o,f,c){for(;a-- >0;){if(K(t,e+0,r,o,f))if(q(t,e+0,r,c))z(t,e+0,r);else{const n=t,a=e+0,o=r,f=n[a-o],c=n[a+0],u=n[a+o],b=_n[112+(4+(i=3*(c-f))>>3)];var i=_n[112+(i+3>>3)];const s=b+1>>1;n[a-2*o]=Wn[255+n[a-2*o]+s],n[a-o]=Wn[255+f+i],n[a+0]=Wn[255+c-b],n[a+o]=Wn[255+u-s]}e+=n}}function Z(t,e,r,n,a,o){$(t,e+0,r,1,16,n,a,o)}function tt(t,e,r,n,a,o){$(t,e+0,1,r,16,n,a,o)}function et(t,e,r,n,a,o){let f;for(f=3;f>0;--f)X(t,(e+=4*r)+0,r,1,16,n,a,o)}function rt(t,e,r,n,a,o){let f;for(f=3;f>0;--f)X(t,(e+=4)+0,1,r,16,n,a,o)}function nt(t,e,r,n,a,o,f,c){$(t,e,a,1,8,o,f,c),$(r,n,a,1,8,o,f,c)}function at(t,e,r,n,a,o,f,c){$(t,e,1,a,8,o,f,c),$(r,n,1,a,8,o,f,c)}function ot(t,e,r,n,a,o,f,c){X(t,e+4*a,a,1,8,o,f,c),X(r,n+4*a,a,1,8,o,f,c)}function ft(t,e,r,n,a,o,f,c){X(t,e+4,1,a,8,o,f,c),X(r,n+4,1,a,8,o,f,c)}function ct(t,e){return e==Fr?0==t.i?0==t.d?Kr:qr:0==t.d?zr:Fr:e}function it(t,e,r,a){for(n=0;n<4;++n)t[e+n]=r[a+n]}function ut(t,e){return t<0?0:t>e?e:t}function bt(t){t.a="VP8_STATUS_OK",t.xc="OK"}function st(t){t>>>8!=Ve>>>8&&alert("mismatch error")}function lt(t,e,r){return t.a==ze&&(t.a=e,t.xc=r,t.za=0),0}function ht(t,a){let c=[0],i=0;var u=[0],b=f(fn),s=f(cn);let l=f(nr);if(u="VP8StatusCode",b=f(rr),t==o)return alert("(dec == null)"),0;if(bt(t),a==o)return lt(t,"VP8_STATUS_INVALID_PARAM","null VP8Io passed to VP8GetHeaders()");if(b.data=a.data,b.b=a.b,b.e=a.e,b.b=[b.b],b.e=[b.e],(u=ye(b=[b]))!=ze)return lt(t,u,"Incorrect/incomplete header.");if((b=b[0]).b=b.b[0],b.e=b.e[0],b.ia)return lt(t,Je,"Unexpected lossless format encountered.");if(t.Ga==o&&(g(0==t.ub),t.Ga=b.$,t.G=b.G,t.ub=b.pa),i=b.data,c=b.b+b.offset,u=b.e-b.offset,g(b.e>=b.offset),u[0]<4)return lt(t,$e,"Truncated header.");if(l=i[c+0]|i[c+1]<<8|i[c+2]<<16,(b=t.Ac).fb=!(1&l)+0,b.Jc=l>>1&7,b.Nc=l>>4&1,b.Ra=l>>5,b.Jc>3)return lt(t,"VP8_STATUS_BITSTREAM_ERROR","Incorrect keyframe parameters.");if(!b.Nc)return lt(t,"VP8_STATUS_UNSUPPORTED_FEATURE","Frame not displayable.");if(c+=3,u-=3,s=t.P,b.fb){if(u<7)return lt(t,"VP8_STATUS_NOT_ENOUGH_DATA","cannot parse picture header");if(!(u>=3&&157==i[c+0]&&1==i[c+1]&&42==i[c+2]))return lt(t,"VP8_STATUS_BITSTREAM_ERROR","Bad code word");for(s.l=16383&(i[c+4]<<8|i[c+3]),s.gd=i[c+4]>>6,s.v=16383&(i[c+6]<<8|i[c+5]),s.hd=i[c+6]>>6,c+=7,u-=7,t.Ma=s.l+15>>4,t.hb=s.v+15>>4,a.width=s.l,a.height=s.v,a.I=0,a.Ua=0,a.k=0,a.t=0,a.Ka=a.width,a.K=a.height,a.m=a.width,a.h=a.height,l=t.R,n=0;nu)return lt(t,"VP8_STATUS_NOT_ENOUGH_DATA","bad partition length");l=t.o,P(l,i,c,c+b.Ra),c+=b.Ra,u-=b.Ra,b.fb&&(s.uc=e(l),s.$c=e(l)),s=l;var h=t.Ca;let d=t.R;if(g(s!=o),g(h!=o),h.pb=e(s),h.pb){if(h.ob=e(s),e(s)){var v;for(h.tb=e(s),v=0;v0)if(t.Ca.pb)for(d=0;du&&(w=s),P(t.ic[+m],d,v,y),d=w,v=y,h+=3}P(t.ic[+p],d,v,u),u=v0){t.yb[w]=t.yb[0];continue}y=u}const e=t.yb[w];e.sc[0]=oa[ut(y+s,127)],e.sc[1]=fa[ut(y+0,127)],e.sb[0]=2*oa[ut(y+h,127)],e.sb[1]=101581*fa[ut(y+d,127)]>>16,e.sb[1]<8&&(e.sb[1]=8),e.qc[0]=oa[ut(y+v,117)],e.qc[1]=fa[ut(y+p,127)]}if(!b.fb)return lt(t,Ye,"Not a key frame.");for(t.Zc=259,e(l),u=t.R,s=0;s<$r;++s)for(h=0;h0)+0],16==o||!r(t,c[0]))return o}else c=e[sa[o]][0];if(16==o)return 16}}function vt(t,e){return((16777216*t[0]+65536*t[1]+256*t[2]+1*t[3])*pa&4278190080)>>e}function pt(t,e){let a,f=0;if(t==o)return 0;if(e==o)return lt(t,"VP8_STATUS_INVALID_PARAM","NULL VP8Io parameter in VP8Decode().");if(!t.za&&!ht(t,e))return 0;if(g(t.za),e.Mb&&!e.Mb(e))lt(t,Qe,"Frame setup failed"),a=t.a;else{e.Za&&(t.A=0);const r=ea[t.A];2==t.A?(t.lb=0,t.mb=0):(t.lb=e.t-r>>4,t.mb=e.k-r>>4,t.lb<0&&(t.lb=0),t.mb<0&&(t.mb=0)),t.Ya=e.K+15+r>>4,t.wb=e.Ka+15+r>>4,t.wb>t.Ma&&(t.wb=t.Ma),t.Ya>t.hb&&(t.Ya=t.hb),a=ze}if(f=a==ze){if(f){let r,n;t:{if(t.Ja=0,t.qb){const e=t.rc;if(!WebPWorkerReset(e)){r=lt(t,qe,"thread initialization failed.");break t}e.Qd=t,e.Rd=t.oa.N,e.Ud=FinishRow,t.jb=t.A>0?ra:ra-1}else t.jb=na;r=1}if(!(n=!r)){let e;t:{const r=t.jb,n=t.Ma,a=4*n,f=32*n,c=n+1,i=t.A>0?n*(t.qb?2:1):0,s=rn,l=f*(16*r+parseInt(3*ea[t.A]/2,10)),h=t.Ga!=o?t.P.l*t.P.v:0,v=a+f+c+i+s+384+l+h+ta;if(v!=v)e=0;else{if(v>t.Gb){if(t.ib=0,t.Gb=0,t.ib==o){e=lt(t,"VP8_STATUS_OUT_OF_MEMORY","no memory during frame initialization.");break t}t.Gb=v}t.dc=205,t.Xc=b(205,16*n),t.Sc=b(205,8*n),t.Vc=b(205,8*n),t.M=i?u(ln,i):o,t.Sd=i?0:o,t.oa.ha=0,t.oa.M=t.M,g(0==(s&ta)),t.Ea=b(205,1*s),t.z=-12851,t.H=16*n,t.r=8*n;const f=ea[t.A],p=f*t.H,P=f/2*t.r;t.ca=d(l,205),t.da=+p,t.aa=t.ca,t.ba=t.da+16*r*t.H+P,t.ra=t.aa,t.sa=t.ba+8*r*t.r+P,t.Xb=h?d(h,0):o,t.La=u(hn,c),t.dc=b(Fr,a),e=1}}n=!e}if(n)f=0;else{if(e.width=t.P.l,e.height=t.P.v,e.w=0,e.y=t.ca,e.D=t.da,e.c=t.aa,e.B=t.ba,e.S=t.ra,e.C=t.sa,e.F=t.H,e.Da=t.r,e.p=o,e.q=o,!Un){let t;for(t=-255;t<=255;++t)On[255+t]=t<0?-t:t,Vn[255+t]=On[255+t]>>1;for(t=-1020;t<=1020;++t)In[1020+t]=t<-128?-128:t>127?127:t;for(t=-112;t<=112;++t)_n[112+t]=t<-16?-16:t>15?15:t;for(t=-255;t<=510;++t)Wn[255+t]=t<0?0:t>255?255:t;Un=1}Cn=D,Fn=E,Gn=C,Nn=F,Ln=Z,Hn=tt,zn=nt,qn=at,Kn=et,Jn=rt,Yn=ot,xn=ft,Qn=J,$n=Y,Xn=x,Zn=Q,f=1}}if(f)t:{for(t.d=0;t.d0&&u.d>=u.mb&&u.d<=u.Ya)+0,t.i=0;t.i0);A=-k,W[W[W.length-1]+P]=A,h[v]=A,v++}D[p]=A}}else{for(A=r(u,156)?r(u,128)?Hr:Lr:r(u,163)?Nr:Gr,e.Eb[0]=A,k=0;k<4;++k)W[k+W[W.length-1]]=A;for(k=0;k<4;++k)D[k]=A}if(e.Tc=r(u,142)?r(u,114)?r(u,183)?Hr:Lr:Nr:Gr,u.Ab)s=0;else{if(g.Nb)l.X=g.X=0,e.wa||(l.ua=g.ua=0),e.ja=0,e.Oa=0;else{let t=0,r=0;var m=0,w=da;const n=e.yb[e.Lb];var y=e.z;const a=e.La[0],f=d(4,0),c=d(4,0);let u=d(4,0),s=d(4,0),l=0,h=0;var S=0;let v=0,p=0;if(y=b(0,384),e.wa)m=0,w=e.R.z[3];else{const t=d(16,0);var T=g.ua+a.ua;g.ua=a.ua=(dt(o,e.R.z[1],T,n.sb,0,t)>0)+0,m=1,w=e.R.z[0];var R=t,O=y,V=d(16,0),I=0;for(I=0;I<4;++I){var _=R[0+I]+R[12+I],U=R[4+I]+R[8+I],M=R[4+I]-R[8+I],B=R[0+I]-R[12+I];V[0+I]=_+U,V[8+I]=_-U,V[4+I]=B+M,V[12+I]=B-M}for(I=0;I<4;++I){const t=O[O.length-1],e=V[0+4*I]+3;_=e+V[3+4*I],U=V[1+4*I]+V[2+4*I],M=V[1+4*I]-V[2+4*I],B=e-V[3+4*I],O[t+0]=_+U>>3,O[t+16]=B+M>>3,O[t+32]=_-U>>3,O[t+48]=B-M>>3,O[O.length-1]+=64}y[y.length-1]=0}for(u=i(va[15&g.X]),s=i(va[15&a.X]),v=0;v<4;++v){var j=s[v];for(S=0;S<4;++S){var G=dt(o,w,T=j+u[S],n.sc,m,y);u[S]=j=(G>0)+0,c[S]=(0!=y[y[y.length-1]+0])+0,f[S]=(G>1)+0,y[y.length-1]+=16}s[v]=j,h|=vt(c,24-4*v),l|=vt(f,24-4*v)}for(t=vt(u,24),r=vt(s,24),u=i(va[g.X>>4]),s=i(va[a.X>>4]),p=0;p<4;p+=2){for(v=0;v<2;++v){for(j=s[p+v],S=0;S<2;++S)T=j+u[p+S],G=dt(o,e.R.z[2],T,n.qc,0,y),u[p+S]=j=(G>0)+0,c[2*v+S]=(0!=y[y[y.length-1]+0])+0,f[2*v+S]=(G>1)+0,y[y.length-1]+=16;s[p+v]=j}h|=vt(c,8-2*p),l|=vt(f,8-2*p)}t|=vt(u,20),r|=vt(s,20),g.X=t,a.X=r,e.z=y,e.Oa=l+0,e.ja=l|h,g.Nb=!e.ja+0}s=!o.Ab}if(!s){f=lt(t,"VP8_STATUS_NOT_ENOUGH_DATA",`Premature end-of-file encountered.${t.i} ${t.d}`);break t}const E=t,C=E.Ea,F=nn,J=E.Ea,Y=an,x=E.Ea,Q=on;if(E.i>0){var N=0;for(N=-1;N<16;++N)it(C,F+N*en-4,C,F+N*en+12);for(N=-1;N<8;++N)it(J,Y+N*en-4,J,Y+N*en+4),it(x,Q+N*en-4,x,Q+N*en+4)}else{for(N=0;N<16;++N)C[F+N*en-1]=129;for(N=0;N<8;++N)J[Y+N*en-1]=129,x[Q+N*en-1]=129;E.d>0&&(C[F-1-en]=J[Y-1-en]=x[Q-1-en]=129)}const Z=E.Xc,tt=16*+E.i,et=E.Sc,rt=8*+E.i,nt=E.Vc,at=8*+E.i,ot=E.z;let ft=0;if(E.d>0)c(C,F-en,Z,tt,16),c(J,Y-en,et,rt,8),c(x,Q-en,nt,at,8);else if(0==E.i){for(n=0;n<21;++n)C[F-en-1+n]=127;for(n=0;n<9;++n)J[Y-en-1+n]=127;for(n=0;n<9;++n)x[Q-en-1+n]=127}if(E.wa){const t=F-en+16;E.d>0&&(E.i>=E.Ma-1?C[t+0]=C[t+1]=C[t+2]=C[t+3]=Z[tt+15]:c(C,t+0,Z,tt+16,4));for(let e=0;e<4;++e)C[e+t+4*en]=C[e+t+4*en]=C[e+t+8*en]=C[e+t+12*en]=C[e+t+0];for(ft=0;ft<16;ft++){var L=C,H=F+aa[ft];Dn[E.Eb[ft]](L,H),E.Oa&1<0){const t=ht.M[1+ht.i],e=ht.La[1+ht.i].Nb;let r=ht.Zb[ht.Lb];ht.ga.oc&&(r+=ht.ga.Lc[0],ht.wa&&(r+=ht.ga.Gc[0])),r=r<0?0:r>63?63:r,t.zc=r,ht.ga.kb>0&&(r=ht.ga.kb>4?r>>2:r>>1,r>9-ht.ga.kb&&(r=9-ht.ga.kb)),t.yc=r<1?1:r,t.ab=(!e||ht.wa)+0}var K=0,$=8*ht.Ja*ht.r,X=ht.ca,ut=ht.da+16*ht.i+16*ht.Ja*ht.H,bt=ht.aa,st=ht.ba+8*ht.i+$,pt=ht.ra,Pt=ht.sa+8*ht.i+$;for(K=0;K<16;++K)c(X,ut+K*ht.H,ht.Ea,+nn+K*en,16);for(K=0;K<8;++K)c(bt,st+K*ht.r,ht.Ea,+an+K*en,8),c(pt,Pt+K*ht.r,ht.Ea,+on+K*en,8)}const E=t,C=e;var At=1;const F=E.oa;if(E.qb){const t=E.rc;if(At&=WebPWorkerSync(t),g(t.a==OK),At){if(F.N=C,F.ha=E.Ja,F.d=E.d,F.W=E.W,F.W){const t=F.M;F.M=E.M,E.M=t}WebPWorkerLaunch(t),++E.Ja==E.jb&&(E.Ja=0)}}else{F.d=E.d,F.W=E.W;e:{let t=1;const e=E.oa,r=ea[E.A],n=r*E.H,a=parseInt(r/2)*E.r,f=16*e.ha*E.H,i=8*e.ha*E.r,u=E.ca,b=E.da-n+f,s=E.aa,l=E.ba-a+i,h=E.ra,d=E.sa-a+i,v=0==e.d,p=(e.d>=E.hb-1)+0;var kt=16*e.d;let P=16*(e.d+1);if(e.W){const t=E;let e=0;const r=t.oa.d;for(g(t.oa.W),e=t.lb;e0&&$n(u,b,c,h+4),i.ab&&Zn(u,b,c,h),o>0&&Qn(u,b,c,h+4),i.ab&&Xn(u,b,c,h);else{const t=n.r,e=n.aa,r=n.ba+8*f.ha*t+8*a,d=n.ra,v=n.sa+8*f.ha*t+8*a,p=n.Ac.fb?s>=40?2:s>=15?1:0:s>=40?3:s>=20?2:s>=15?1:0;a>0&&(Hn(u,b,c,h+4,l,p),qn(e,r,d,v,t,h+4,l,p)),i.ab&&(Jn(u,b,c,h,l,p),xn(e,r,d,v,t,h,l,p)),o>0&&(Ln(u,b,c,h+4,l,p),zn(e,r,d,v,t,h+4,l,p)),i.ab&&(Kn(u,b,c,h,l,p),Yn(e,r,d,v,t,h,l,p))}}}if(C.put){if(v?(C.y=E.ca,C.D=E.da+f,C.c=E.aa,C.B=E.ba+i,C.S=E.ra,C.C=E.sa+i):(kt-=r,C.y=u,C.D=b,C.c=s,C.B=l,C.S=h,C.C=d),p||(P-=r),P>C.K&&(P=C.K),E.Ga!=o&&kt>1),C.C+=E.r*(t>>1),C.p!=o&&(C.q+=C.width*t)}kt>1,C.C+=C.t>>1,C.p!=o&&(C.q+=C.t),C.w=kt-C.k,C.m=C.Ka-C.t,C.h=P-kt,t=C.put(C))}e.ha+1==E.jb&&!p&&(c(E.ca,E.da-n,u,b+16*E.H,n),c(E.aa,E.ba-a,s,l+8*E.r,a),c(E.ra,E.sa-a,h,d+8*E.r,a)),At=t}}if(!At){f=lt(t,"VP8_STATUS_USER_ABORT","Output aborted.");break t}}let a;if(!(a=t.qb&&!WebPWorkerSync(t.rc))){let e;(e=t.fc>0)&&(g(t),g(t.fc>0),e=!1),a=e}f=a?0:1}const a=f;e.Pb&&e.Pb(e),f=1&a}return f?(t.za=0,f):(gt(t),0)}function gt(t){t!=o&&(t.ib&&(t.ib=0),t.ib=o,t.Gb=0,t.za=0)}function Pt(t,e){return t+(1<>e}function At(t,e,r,n,a){const o=Ga[r]+Na[e]>>ga;e=Fa[e],n[a+0]=La[t+Ca[r]-Pa],n[a+1]=La[t+o-Pa],n[a+2]=La[t+e-Pa]}function kt(t,e,r,n,a){const o=Ga[r]+Na[e]>>ga;e=Fa[e],n[a+0]=248&La[t+Ca[r]-Pa]|La[t+o-Pa]>>5,n[a+1]=La[t+o-Pa]<<3&224|La[t+e-Pa]>>3}function mt(t,e,r,n,a){n[a+0]=255,At(t,e,r,n,a+1)}function wt(t,e,r,n,a){const o=Fa[e];n[a+0]=Ha[t+Ca[r]-Pa]<<4|Ha[t+(Ga[r]+Na[e]>>ga)-Pa],n[a+1]=15|Ha[t+o-Pa]<<4}function yt(t,e,r,n,a){const o=Ca[r];r=Ga[r]+Na[e]>>ga,n[a+0]=La[t+Fa[e]-Pa],n[a+1]=La[t+r-Pa],n[a+2]=La[t+o-Pa]}function St(t,e,r,n,a){yt(t,e,r,n,a),n[a+3]=255}function Tt(t,e,r,n,a){At(t,e,r,n,a),n[a+3]=255}function Rt(t,e,r){t[e]=((((4278255360&t[e])>>>0)+((4278255360&r)>>>0)&4278255360)>>>0|(16711935&t[e])+(16711935&r)&16711935)>>>0}function Ot(t,e){return((4278124286&(t^e))>>>1)+((t&e)>>>0)>>>0}function Vt(t){return t<256&&t>0?t:t<=0?0:~t>>24&255}function It(t,e){return Vt(t+parseInt((t-e)/2,10))}function _t(){return dr}function Wt(t,e){return(t&=255)>127&&(t-=256),(e&=255)>127&&(e-=256),t*e>>>5}function Ut(t,e,r,n,a,o,f){var c=0;const i=8>>t.n,u=t.U,b=t.u;if(i<8){t=(1<>8&255),o[f++]=b[e&s],e>>=i}}else for(c=e;c>8&255]}function Mt(t,e,r,n,a){for(r=e+r;e>16&255,n[a++]=r>>8&255,n[a++]=r>>0&255,n[a++]=r>>24&255}}function Bt(t,e,r,n,a){for(r=e+r;e>16&240|r>>12&15,n[a++]=r>>0&240|r>>28&15}}function Dt(t,e,r,n,a){for(r=e+r;e>24&255,n[a++]=r>>16&255,n[a++]=r>>8&255,n[a++]=r>>0&255}}function Et(t,e,r,n){return S(t,8)!=ir?0:(e[0]=S(t,ur)+1,r[0]=S(t,ur)+1,n[0]=S(t,1),S(t,br),1)}function jt(t,e){let r=0;return t<4?t+1:(r=t-2>>1,(2+(1&t)<e.ya){var r=t.Y,n=0;for(g(r!=o);0!=r[n].s;){var a=r,f=e;const t=f.T>>f.g&1;f.L?f.fa=1:(++f.g,f.g>=8&&w(f),f.Q==f.ya&&32==f.g&&(f.L=1)),n=n+a[n].s+t}return r[n].kc}for(n=0,g((r=t.Y)!=o);0!=r[n].s;)a=r,f=e.T>>e.g&1,++e.g,n=n+a[n].s+f;return r[n].kc}function Ft(t,e){if(t!=o){var r=0,n=0;for(r=0;r>t.eb)+(e>>t.eb)])0;){e=t.nc[a];let O=i;var h=b,d=l;switch(l=n,b=r,g(O<(v=u)),g(v<=e.Vb),e.Qc){case wr:for(h=0,e=b+(v-O)*e.U;b>8&255,P=16711935&(P=(P=(16711935&v[d])>>>0)+(p<<16|p));l[b++]=((4278255360&v[d])>>>0|P)>>>0,32==O&&h++}break;case kr:var A=O;if(h=v,d=l,p=b,P=(S=e).U,0==A){var k=0;for(Rt(d,p,dr),k=1;k>S.n)*w;A>8&15],k=1;k>8&15]),e=t(d[p+k-1],d,p+k-P),Rt(d,p+k,e)}p+=P,0==(++A&m)&&(S+=w)}v!=e.Vb&&c(l,b-(e=e.U),l,b+(v-O-1)*e,e);break;case mr:for(h=e.U,d=(1<>e.n)*p;O>0&255,S.Bc=y>>8&255,S.Kc=y>>16&255),S=(y=l[b+w])>>>8,T=y>>>16,R=y,T+=Wt(m.Cc,S),T&=255,R+=Wt(m.Bc,S),R+=Wt(m.Kc,T),R&=255,l[b+w]=(4278255360&y|T<<16|R)>>>0;b+=h,++O,0==(O&d)&&(e+=p)}break;case yr:h==l&&e.n>0?(h=(v-O)*Pt(e.U,e.n),s(l,d=b+(v-O)*e.U-h,l,b,h),Ut(e,O,v,l,d,l,b)):Ut(e,O,v,h,d,l,b)}b=n,l=r}}function Lt(t,e){var r=t.V,n=t.Ha+t.l*t.O;if(!((o=e-t.O)<=0)){Nt(t,o,r,n);var a=t.N;r=t.Xa;let l=[t.vb];n=t.O;var o=e,f=l,c=a.width;if(g(na.K&&(o=a.K),n=o?n=0:(f[0]+=a.t,a.w=n-a.k,a.m=a.Ka-a.t,a.h=o-n,n=1),n){if(l=l[0],n=t.Ib,o=a.width,n.J0;){const t=r;let n=l,a=i;const b=f;let h=e;switch(c){case Ie:for(a=n+a;n>16&255,b[h++]=s>>8&255,b[h++]=s>>0&255}break;case _e:Mt(t,n,a,b,h);break;case Ee:Mt(t,n,a,b,h),WebPApplyAlphaMultiply(b,0,a,1,0);break;case We:for(a=n+a;n>0&255,b[h++]=s>>8&255,b[h++]=s>>16&255;break;case Ue:Dt(t,n,a,b,h);break;case je:Dt(t,n,a,b,h),WebPApplyAlphaMultiply(b,0,a,1,0);break;case Me:Dt(t,n,a,b,h);break;case Ce:Dt(t,n,a,b,h),WebPApplyAlphaMultiply(b,1,a,1,0);break;case Be:Bt(t,n,a,b,h);break;case Fe:Bt(t,n,a,b,h),WebPApplyAlphaMultiply4444(b,a,1,0);break;case De:for(a=n+a;n>16&248|s>>13&7,b[h++]=s>>5&224|s>>3&31;break;default:g(0)}l+=o,e+=u}r=a}t.xa+=r}else t.xa=a.I?EmitRescaledRowsYUVA(t,r,l,o,a.h):EmitRowsYUVA(t,r,l,o,a.m,a.h);g(t.xa<=n.height)}t.O=e,g(t.O<=t.v)}}function Ht(t,e,r,n,a,f){let c=1,i=0,u=0;const b=t.o,s=t.cb;let l=s.Db,h=r,d=r;r+=n*a;const v=(a=gr+Pr)+s.xb,p=s.xb>0?s.Yb:o,P=s.Dc;let A=!1;for(g(l!=o);!b.L&&h>>0)+(A<<16)+(c<<8)+k}if(A=!1,++h,++i,i>=n&&(i=0,++u,f!=o&&u%wa==0&&f(t,u),p!=o))for(;d>>p.bb]=c}else if(wDa?k-=Da:(w=Ea[k-1],w=(w>>4)*n+(8-(15&w)),k=w>=1?w:1),w=0,w=0;w=n;)i-=n,++u,f!=o&&u%wa==0&&f(t,u);if(h>>p.bb]=c}else if(w>>p.bb]=w;w=e,k=h,g(A<=-1>>>(m=p).bb),w[k]=m.ea[A],A=!0;continue}(c=!b.fa)||End}return f!=o&&f(t,u),b.fa||!c||b.L&&h16?0:h>4?1:h>2?2:3,l[0]=Pt(c.U,p),c.n=p,l=p=Jt(h,1,0,_,c.u))if(l=h,p=0,h=1<<(8>>>(_=c).n)>>>0,(P=Array(h))==o)l=0;else{A=_.u[0];var k=_.b;for(P[0]=_.u[0][_.b+0],p=1;p>>0)+((4278255360&P[p-1])>>>0)&4278255360)>>>0|(16711935&A[k+p])+(16711935&P[p-1])&16711935)>>>0;for(;p=1&&s<=lr)){n.a=Je;break}if(c)t:{c=n;var m=t[0],w=e[0],_=(l=s,k=A=0,k=c.o,c.cb);if(p=[o],h=o,P=1,r&&S(k,1)){if(w=(m=Pt(m,A=S(k,3)+2))*(W=Pt(w,A)),!Jt(m,W,0,c,p)){c.a=Je,Ft(h,P),c=0;break t}for(p=p[0],_.eb=A,A=0;A>>8&65535,p[A]=m,m>=P&&(P=m+1)}if(k.fa)Ft(h,P),c=0;else if(g(P<=65536),(h=v(P,mn))==o)c.a=qe,Ft(h,P),c=0;else{for(A=0;A0&&(m+=1<=t){(E=E&&T(e))||O(e),U=E;break r}if(!V(e,M[j],B[j],D[j])){(E=E&&T(e))||O(e),U=E;break r}}(E=(E=1)&&T(e))||O(e),U=E}else U=0}}else{if(U=0,B=[],(M=S(W,4)+4)>Ma){m.a=Je,m=0;break e}if((D=Array(t))==o){m.a=qe,m=0;break e}for(U=0;UB){U.a=Je,O(a),U=E;break r}}else r=B;for(e=0;eB){U.a=Je,O(a),U=E;break r}for(C=C?n:0;F-- >0;)M[e++]=C}}E=1,O(a),U=E}else U.a=Je,U=0}U&&(U=I(e,D,t))}(U=U&&!W.fa)?m=1:(m.a=Je,m=0)}if(!m){Ft(h,P),c=0;break t}}_.ac=p,_.hc=P,_.Db=h,c=1}}if(!c){n.a=Je;break}if(s>0){if(u.xb=1<0),l.ea=d(_,0),l.ea==o?s=0:(l.bb=32-s,s=1),!s){n.a=qe,c=0;break}}else u.xb=0;if(s=n,l=t[0],_=e[0],h=(p=s.cb).eb,s.l=l,s.v=_,p.Ec=Pt(l,h),p.Dc=0==h?-1:(1<>>8&255;t.O=t.xa=e}}function ut(t,e){return t<0?0:t>e?e:t}function Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,g,P){let A;const k=p-1>>1;let m=a[o+0]|f[c+0]<<16,w=i[u+0]|b[s+0]<<16;if(t){var y=3*m+w+131074>>2;g(t[e+0],255&y,y>>16,l,h)}for(r&&(y=3*w+m+131074>>2,g(r[n+0],255&y,y>>16,d,v)),A=1;A<=k;++A){const p=a[o+A]|f[c+A]<<16,k=i[u+A]|b[s+A]<<16,S=(y=m+p+w+k+524296)+2*(p+w)>>3,T=y+2*(m+k)>>3;t&&(y=S+m>>1,m=T+p>>1,g(t[e+2*A-1],255&y,y>>16,l,h+(2*A-1)*P),g(t[e+2*A-0],255&m,m>>16,l,h+(2*A-0)*P)),r&&(y=T+w>>1,m=S+k>>1,g(r[n+2*A-1],255&y,y>>16,d,v+(2*A-1)*P),g(r[n+2*A+0],255&m,m>>16,d,v+(2*A+0)*P)),m=p,w=k}1&p||(t&&(y=3*m+w+131074>>2,g(t[e+p-1],255&y,y>>16,l,h+(p-1)*P)),r&&(y=3*w+m+131074>>2,g(r[n+p-1],255&y,y>>16,d,v+(p-1)*P)))}function $t(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p){Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,At,3)}function Xt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p){Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,yt,3)}function Zt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p){Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,Tt,4)}function te(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p){Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,St,4)}function ee(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p){Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,mt,4)}function re(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p){Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,wt,2)}function ne(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p){Qt(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d,v,p,kt,2)}function ae(t,e,r,n,a,o,f,c,i,u,b,s,l,h,d){let v;for(v=0;v0;){var f=t,c=e+(r?1:0),i=t,u=e+(r?0:3),b=0;for(b=0;b>1)*r.nb,i=r.S,u=r.C+(t.w>>1)*r.rb,b=t.m,s=t.h,l=parseInt((b+1)/2,10),h=parseInt((s+1)/2,10);let d;for(d=0;d>4;b[s+2*h]=240&b[s+2*h]|t,l&=t}a+=e.width,s+=i.f}15!=l&&t(c)&&WebPApplyAlphaMultiply4444(b,f,o,u,i.f)}return 0}function ge(e){let r=e.ka;const n=r.j.J,a=n>1,n=e.m+2*t;let a;const f=[];for(a=0;a>ga,Na[e]=-22014*(e-128)+ja,Ga[e]=-45773*(e-128),Fa[e]=113618*(e-128)+ja>>ga;for(e=Pa;e>ga,La[e-Pa]=ut(r,255),Ha[e-Pa]=ut(r+8>>4,15);za=1}return 1}function Pe(t){const e=t.ka;let r=t.m;const n=t.h;return g(!(1&t.w)),r<=0||n<=0?0:(r=e.$a(t,e),e.ec+=r,e.zb&&e.zb(t,e),1)}function Ae(t){(t=t.ka).memory="",t.memory=o}function ke(t,e){return t[e+0]|t[e+1]<<8|t[e+2]<<16}function me(t,e){return(ke(t,e)|t[e+3]<<24)>>>0}function we(t,e,r,n,a,c,i){var u=0,b=[0],s="VP8StatusCode";const l=f(rr);if(t==o||r[0]<_r)return $e;l.data=t,l.b=[e[0]],l.e=[r[0]],l.na=[l.na];t:{if(u=l.na,g(t!=o),g(r!=o),g(u!=o),u[0]=0,r[0]>=_r&&!h(t,e[0],"RIFF",Vr)){if(h(t,e[0]+8,"WEBP",Vr)){s=Je;break t}if((P=me(t,e[0]+Vr))0,P=[0];t:if(s=Ir+Wr,g(t!=o),g(r!=o),g(b!=o),b[0]=0,r[0]=Mr){s=Je;break t}P!=o&&(P[0]=p),n!=o&&(n[0]=d),a!=o&&(a[0]=v),e[0]+=s,r[0]-=s,b[0]=1}s=ze}if(s!=ze)return s;if(!u&&b[0])return Je;if(c!=o&&(c[0]=!!(P[0]&Ur)),b&&i==o)return ze;if(r0&&n>b){s=Je;break t}if(p=d&&v>b-d){s=Je;break t}u[0]=v,e[0]+=Ir,r[0]-=Ir,P[0]=s}else P[0]=r>=1&&t[e+0]==ir,u[0]=r[0];s=ze}if(l.ta=l.ta[0],l.ia=l.ia[0],s!=ze)return s;if(l.ta>Br)return Je;if(l.ia){if(r[0]=3&&157==t[b+3+0]&&1==t[b+3+1]&&42==t[b+3+2]?(u=t[b+0]|t[b+1]<<8|t[b+2]<<16,P=16383&(t[b+7]<<8|t[b+6]),t=16383&(t[b+9]<<8|t[b+8]),!(!(1&u)+0)||(u>>1&7)>3||!(u>>4&1)||u>>5>=l.ta?t=0:(n&&(n[0]=P),a&&(a[0]=t),t=1)):t=0}return t?(c!=o&&(c[0]|=l.$!=o),i!=o&&(i[0]=l,i[0].offset=e[0]-i[0].b,g(e[0]-i[0].b0,e.Ua&&(i=t.wc,u=t.vc,f=t.t,c=t.k,rn||c+u>a))return 0;if(e.t=f,e.k=c,e.Ka=f+i,e.K=c+u,e.m=i,e.h=u,e.I=t!=o&&t.I>0,e.I){if(t.Ba<=0||t.Aa<=0)return 0;e.Ba=t.Ba,e.Aa=t.Aa}return e.Za=t&&t.Za,e.Bb=t==o||!t.ed,e.I&&(e.Za=e.Ba<3*n/4&&e.Aa<3*a/4,e.Bb=0),1}var Ve=512,Ie=0,_e=1,We=2,Ue=3,Me=4,Be=5,De=6,Ee=7,je=8,Ce=9,Fe=10,Ge=11,Ne=12,Le=13;this.WEBP_CSP_MODE=this.Cd={nd:0,od:1,kd:2,ld:3,jd:4,pd:5,qd:6,rd:7,sd:8,md:9};var He={J:"WEBP_CSP_MODE",width:0,height:0,Fc:0,c:{RGBA:{ma:0,Sa:0,f:0,size:0},Va:{y:0,c:0,S:0,p:0,D:0,B:0,C:0,q:0,F:0,nb:0,rb:0,Fa:0,Wc:0,Rc:0,Uc:0,Wb:0}},Ic:d(4,0),Jb:o,jc:0},ze=0,qe=1,Ke=2,Je=3,Ye=4,xe=5,Qe=6,$e=7;this.VP8StatusCode=this.td={xd:0,yd:1,vd:2,ud:3,Ad:4,zd:5,Bd:6,wd:7};var Xe={width:{value:0},height:{value:0},$b:{value:0},tc:0,Yd:0,rotate:0,be:0,Ic:d(3,0)};this.WebPGetFeatures=this.Md=function(t,e,r){let n="VP8StatusCode";return Ve>>>8!=Ve>>>8||r==o?t=Ke:(n=Re(t,[0],e=[e],r),t=n==$e?Je:n),t};const Ze={Za:0,ed:0,Ua:0,t:0,k:0,wc:0,vc:0,I:0,Ba:0,Aa:0,ae:0,Td:0,Xd:0,Ic:d(6,0)};this.WebPDecoderConfig=this.Kd={input:f(Xe),j:f(He),options:f(Ze)},this.WebPInitDecoderConfig=this.Nd=function(t){return Ve>>>8!=Ve>>>8||t==o?t=0:(g((t=t.input)!=o),t.tc=0,t=1),t};var tr={width:0,height:0,w:0,m:0,h:0,y:0,c:0,S:0,D:0,B:0,C:0,F:0,Da:0,ka:0,put:0,Mb:0,Pb:0,Bb:0,e:0,data:0,b:0,Za:0,Ua:0,t:0,Ka:0,k:0,K:0,I:0,Ba:0,Aa:0,p:0,q:0},er={j:f(He),Sb:0,Qb:0,lc:0,Tb:0,Rb:0,mc:0,ec:0,Qa:f(Ze),memory:0,$a:"(OutputFunc)",zb:"(OutputFunc)",ad:"(OutputRowFunc)"},rr={data:0,b:0,e:0,offset:0,$:o,G:0,pa:0,ta:0,na:0,ia:0},nr={qa:0,Ia:o,Pd:0,Ab:0,la:0,Z:0,gc:0},ar={T:0,qa:0,Ia:0,ya:0,Q:0,g:0,L:0,fa:0},or=25,fr=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215],cr=10,ir=47,ur=14,br=3,sr=5,lr=11,hr=5,dr=4278190080,vr=8,pr=15,gr=256,Pr=24,Ar=4,kr=0,mr=1,wr=2,yr=3,Sr=1,Tr=0,Rr=1,Or=1,Vr=4,Ir=8,_r=12,Wr=10,Ur=16,Mr=1*Math.pow(2,32),Br=-1-Ir-1>>>0,Dr={kc:0,s:0},Er={Y:"HuffmanTreeNode*",gb:0,Pa:0},jr=-1;var Cr=506832829,Fr=0,Gr=Fr,Nr=2,Lr=3,Hr=1,zr=4,qr=5,Kr=6,Jr=3,Yr=4,xr=4,Qr=4,$r=4,Xr=8,Zr=3,tn=11,en=32,rn=17*en+9*en,nn=1*en+8,an=nn+16*en+en,on=an+16,fn={fb:0,Jc:0,Nc:0,Ra:0},cn={l:0,v:0,gd:0,hd:0,uc:0,$c:0};const un={pb:0,ob:0,tb:0,Kb:d(Yr,0),Cb:d(Yr,0)},bn={Ta:d(Jr,0),z:p([$r,Xr,Zr,tn],0)},sn={Oc:0,Fb:0,kb:0,oc:0,Lc:d(xr,0),Gc:d(xr,0)};var ln={zc:0,yc:0,ab:0},hn={X:0,ua:0,Nb:0};const dn=d(2,0),vn={sc:f(dn),sb:f(dn),qc:f(dn)},pn={ha:0,d:0,W:0,M:ln,N:tr};var gn={a:"VP8StatusCode",za:0,xc:0,o:f(nr),Ac:f(fn),P:f(cn),ga:f(sn),Ca:f(un),rc:"WebPWorker",qb:0,Ja:0,jb:0,oa:pn,Ma:0,hb:0,lb:0,mb:0,wb:0,Ya:0,Hb:0,ic:v(8,nr),Zc:0,yb:v(Yr,vn),R:f(bn),pc:0,Pc:0,dc:0,cc:d(4,0),Xc:0,Sc:0,Vc:0,La:f(hn),M:f(ln),Ea:0,z:0,ca:0,aa:0,ra:0,da:0,ba:0,sa:0,H:0,r:0,ib:0,Gb:0,i:0,d:0,wa:0,Eb:d(16,0),Vd:0,Tc:0,Lb:0,ja:0,Oa:0,A:0,W:0,Zb:d(Yr,0),Ga:o,G:0,ub:0,Xb:0,Od:0,cd:0,dd:0,Wd:0,fc:0},Pn=0,An=1,kn=2;var mn={va:v(hr,Er)};const wn={xb:0,Yb:f({ea:0,bb:0}),Dc:0,eb:0,Ec:0,ac:0,bd:0,hc:0,Db:"HTreeGroup"};var yn={a:"VP8StatusCode",Wa:"VP8LDecodeState",Ob:"VP8LDecodeState",N:"VP8Io",Ib:"WebPDecBuffer",Hc:"WebPDecBuffer",V:0,Ha:0,Xa:0,vb:0,o:f(ar),l:0,v:0,O:0,xa:0,cb:f(wn),Na:0,nc:v(Ar,{Qc:"VP8LImageTransformType",n:0,U:0,Vb:0,u:0,b:0}),Ub:0,Mc:0,$d:0,Zd:"*WebPRescaler"},Sn=4,Tn=[o,function(t,e,r,n,a,f,i,u){let b=0,s=u;for(g(t!=o),g(i!=o),g(r>0),g(n>0),g(a>0),g(f>=r*a),b=0;b0),g(n>0),g(a>0),g(f>=r*a),c(i,u,t,e,a),_(t,e+a,i,s,i,u+a,a*(r-1)),b=1;b0),g(n>0),g(a>0),g(f>=r*a),c(i,u,t,e,a),_(t,e+a,i,b,i,u+a,a*(r-1)),s=1;s255?255:r)&255}}}],Rn=[3,4,3,4,4,2,2,4,4,4,2,1,1];this.WebPFreeDecBuffer=this.Yc=function(t){t!=o&&(t.Fc||(t.Jb=""),t.jc=0,t.Jb=t.jc=o)},a=this;var On=d(511,0),Vn=d(511,0),In=d(2041,0),_n=d(225,0),Wn=d(766,0),Un=0,Mn=85627,Bn=35468,Dn=[function(t,e){let r,n=4;for(r=0;r<4;++r)n+=t[e+r-en]+t[e-1+r*en];for(n>>=3,r=0;r<4;++r)l(t,e+r*en,n,4)},function(t,e){G(t,e,4)},function(t,e){let r=e-en;const n=[];for(n.push(L(t[r-1],t[r+0],t[r+1])),n.push(L(t[r+0],t[r+1],t[r+2])),n.push(L(t[r+1],t[r+2],t[r+3])),n.push(L(t[r+2],t[r+3],t[r+4])),r=0;r<4;++r)c(t,e+r*en,n,0,4)},function(t,e){const r=t[e-1],n=t[e-1+en],a=t[e-1+2*en],o=t[e-1+3*en];t[e+0+0*en]=t[e+1+0*en]=t[e+2+0*en]=t[e+3+0*en]=L(t[e-1-en],r,n),t[e+0+1*en]=t[e+1+1*en]=t[e+2+1*en]=t[e+3+1*en]=L(r,n,a),t[e+0+2*en]=t[e+1+2*en]=t[e+2+2*en]=t[e+3+2*en]=L(n,a,o),t[e+0+3*en]=t[e+1+3*en]=t[e+2+3*en]=t[e+3+3*en]=L(a,o,o)},function(t,e){const r=t[e-1+0*en],n=t[e-1+1*en],a=t[e-1+2*en],o=t[e-1-en],f=t[e+0-en],c=t[e+1-en],i=t[e+2-en],u=t[e+3-en];t[e+0+3*en]=L(n,a,t[e-1+3*en]),t[e+0+2*en]=t[e+1+3*en]=L(r,n,a),t[e+0+1*en]=t[e+1+2*en]=t[e+2+3*en]=L(o,r,n),t[e+0+0*en]=t[e+1+1*en]=t[e+2+2*en]=t[e+3+3*en]=L(f,o,r),t[e+1+0*en]=t[e+2+1*en]=t[e+3+2*en]=L(c,f,o),t[e+2+0*en]=t[e+3+1*en]=L(i,c,f),t[e+3+0*en]=L(u,i,c)},function(t,e){const r=t[e-1+0*en],n=t[e-1+1*en],a=t[e-1+2*en],o=t[e-1-en],f=t[e+0-en],c=t[e+1-en],i=t[e+2-en],u=t[e+3-en];t[e+0+0*en]=t[e+1+2*en]=o+f+1>>1,t[e+1+0*en]=t[e+2+2*en]=f+c+1>>1,t[e+2+0*en]=t[e+3+2*en]=c+i+1>>1,t[e+3+0*en]=i+u+1>>1,t[e+0+3*en]=L(a,n,r),t[e+0+2*en]=L(n,r,o),t[e+0+1*en]=t[e+1+3*en]=L(r,o,f),t[e+1+1*en]=t[e+2+3*en]=L(o,f,c),t[e+2+1*en]=t[e+3+3*en]=L(f,c,i),t[e+3+1*en]=L(c,i,u)},function(t,e){const r=t[e+1-en],n=t[e+2-en],a=t[e+3-en],o=t[e+4-en],f=t[e+5-en],c=t[e+6-en],i=t[e+7-en];t[e+0+0*en]=L(t[e+0-en],r,n),t[e+1+0*en]=t[e+0+1*en]=L(r,n,a),t[e+2+0*en]=t[e+1+1*en]=t[e+0+2*en]=L(n,a,o),t[e+3+0*en]=t[e+2+1*en]=t[e+1+2*en]=t[e+0+3*en]=L(a,o,f),t[e+3+1*en]=t[e+2+2*en]=t[e+1+3*en]=L(o,f,c),t[e+3+2*en]=t[e+2+3*en]=L(f,c,i),t[e+3+3*en]=L(c,i,i)},function(t,e){const r=t[e+0-en],n=t[e+1-en],a=t[e+2-en],o=t[e+3-en],f=t[e+4-en],c=t[e+5-en],i=t[e+6-en],u=t[e+7-en];t[e+0+0*en]=r+n+1>>1,t[e+1+0*en]=t[e+0+2*en]=n+a+1>>1,t[e+2+0*en]=t[e+1+2*en]=a+o+1>>1,t[e+3+0*en]=t[e+2+2*en]=o+f+1>>1,t[e+0+1*en]=L(r,n,a),t[e+1+1*en]=t[e+0+3*en]=L(n,a,o),t[e+2+1*en]=t[e+1+3*en]=L(a,o,f),t[e+3+1*en]=t[e+2+3*en]=L(o,f,c),t[e+3+2*en]=L(f,c,i),t[e+3+3*en]=L(c,i,u)},function(t,e){const r=t[e-1+0*en],n=t[e-1+1*en],a=t[e-1+2*en],o=t[e-1+3*en],f=t[e-1-en],c=t[e+0-en],i=t[e+1-en],u=t[e+2-en];t[e+0+0*en]=t[e+2+1*en]=r+f+1>>1,t[e+0+1*en]=t[e+2+2*en]=n+r+1>>1,t[e+0+2*en]=t[e+2+3*en]=a+n+1>>1,t[e+0+3*en]=o+a+1>>1,t[e+3+0*en]=L(c,i,u),t[e+2+0*en]=L(f,c,i),t[e+1+0*en]=t[e+3+1*en]=L(r,f,c),t[e+1+1*en]=t[e+3+2*en]=L(n,r,f),t[e+1+2*en]=t[e+3+3*en]=L(a,n,r),t[e+1+3*en]=L(o,a,n)},function(t,e){const r=t[e-1+0*en],n=t[e-1+1*en],a=t[e-1+2*en],o=t[e-1+3*en];t[e+0+0*en]=r+n+1>>1,t[e+2+0*en]=t[e+0+1*en]=n+a+1>>1,t[e+2+1*en]=t[e+0+2*en]=a+o+1>>1,t[e+1+0*en]=L(r,n,a),t[e+3+0*en]=t[e+1+1*en]=L(n,a,o),t[e+3+1*en]=t[e+1+2*en]=L(a,o,o),t[e+3+2*en]=t[e+2+2*en]=t[e+0+3*en]=t[e+1+3*en]=t[e+2+3*en]=t[e+3+3*en]=o}],En=[function(t,e){let r,n=16;for(r=0;r<16;++r)n+=t[e-1+r*en]+t[e+r-en];N(n>>5,t,e)},function(t,e){G(t,e,16)},function(t,e){let r;for(r=0;r<16;++r)c(t,e+r*en,t,e-en,16)},function(t,e){let r;for(r=16;r>0;--r)l(t,e+0,t[e-1],16),e+=en},function(t,e){let r,n=8;for(r=0;r<16;++r)n+=t[e-1+r*en];N(n>>4,t,e)},function(t,e){let r,n=8;for(r=0;r<16;++r)n+=t[e+r-en];N(n>>4,t,e)},function(t,e){N(128,t,e)}],jn=[function(t,e){let r,n=8;for(r=0;r<8;++r)n+=t[e+r-en]+t[e-1+r*en];H(1*(n>>4),t,e)},function(t,e){G(t,e,8)},function(t,e){let r;for(r=0;r<8;++r)c(t,e+r*en,t,e-en,8)},function(t,e){let r;for(r=0;r<8;++r)l(t,e+0,t[e-1],8),e+=en},function(t,e){let r,n=4;for(r=0;r<8;++r)n+=t[e-1+r*en];H(1*(n>>3),t,e)},function(t,e){let r,n=4;for(r=0;r<8;++r)n+=t[e+r-en];H(1*(n>>3),t,e)},function(t,e){H(128,t,e)}];let Cn,Fn,Gn,Nn,Ln,Hn,zn,qn,Kn,Jn,Yn,xn,Qn,$n,Xn,Zn;var ta=31,ea=[0,2,8],ra=3,na=1,aa=[0+0*en,4+0*en,8+0*en,12+0*en,0+4*en,4+4*en,8+4*en,12+4*en,0+8*en,4+8*en,8+8*en,12+8*en,0+12*en,4+12*en,8+12*en,12+12*en],oa=[4,5,6,7,8,9,10,10,11,12,13,14,15,16,17,17,18,19,20,20,21,21,22,22,23,23,24,25,25,26,27,28,29,30,31,32,33,34,35,36,37,37,38,39,40,41,42,43,44,45,46,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,76,77,78,79,80,81,82,83,84,85,86,87,88,89,91,93,95,96,98,100,101,102,104,106,108,110,112,114,116,118,122,124,126,128,130,132,134,136,138,140,143,145,148,151,154,157],fa=[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,119,122,125,128,131,134,137,140,143,146,149,152,155,158,161,164,167,170,173,177,181,185,189,193,197,201,205,209,213,217,221,225,229,234,239,245,249,254,259,264,269,274,279,284],ca=[-Fr,1,-1,2,-2,3,4,6,-3,5,-4,-5,-6,7,-7,8,-8,-9],ia=[[[[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128]],[[253,136,254,255,228,219,128,128,128,128,128],[189,129,242,255,227,213,255,219,128,128,128],[106,126,227,252,214,209,255,255,128,128,128]],[[1,98,248,255,236,226,255,255,128,128,128],[181,133,238,254,221,234,255,154,128,128,128],[78,134,202,247,198,180,255,219,128,128,128]],[[1,185,249,255,243,255,128,128,128,128,128],[184,150,247,255,236,224,128,128,128,128,128],[77,110,216,255,236,230,128,128,128,128,128]],[[1,101,251,255,241,255,128,128,128,128,128],[170,139,241,252,236,209,255,255,128,128,128],[37,116,196,243,228,255,255,255,128,128,128]],[[1,204,254,255,245,255,128,128,128,128,128],[207,160,250,255,238,128,128,128,128,128,128],[102,103,231,255,211,171,128,128,128,128,128]],[[1,152,252,255,240,255,128,128,128,128,128],[177,135,243,255,234,225,128,128,128,128,128],[80,129,211,255,194,224,128,128,128,128,128]],[[1,1,255,128,128,128,128,128,128,128,128],[246,1,255,128,128,128,128,128,128,128,128],[255,128,128,128,128,128,128,128,128,128,128]]],[[[198,35,237,223,193,187,162,160,145,155,62],[131,45,198,221,172,176,220,157,252,221,1],[68,47,146,208,149,167,221,162,255,223,128]],[[1,149,241,255,221,224,255,255,128,128,128],[184,141,234,253,222,220,255,199,128,128,128],[81,99,181,242,176,190,249,202,255,255,128]],[[1,129,232,253,214,197,242,196,255,255,128],[99,121,210,250,201,198,255,202,128,128,128],[23,91,163,242,170,187,247,210,255,255,128]],[[1,200,246,255,234,255,128,128,128,128,128],[109,178,241,255,231,245,255,255,128,128,128],[44,130,201,253,205,192,255,255,128,128,128]],[[1,132,239,251,219,209,255,165,128,128,128],[94,136,225,251,218,190,255,255,128,128,128],[22,100,174,245,186,161,255,199,128,128,128]],[[1,182,249,255,232,235,128,128,128,128,128],[124,143,241,255,227,234,128,128,128,128,128],[35,77,181,251,193,211,255,205,128,128,128]],[[1,157,247,255,236,231,255,255,128,128,128],[121,141,235,255,225,227,255,255,128,128,128],[45,99,188,251,195,217,255,224,128,128,128]],[[1,1,251,255,213,255,128,128,128,128,128],[203,1,248,255,255,128,128,128,128,128,128],[137,1,177,255,224,255,128,128,128,128,128]]],[[[253,9,248,251,207,208,255,192,128,128,128],[175,13,224,243,193,185,249,198,255,255,128],[73,17,171,221,161,179,236,167,255,234,128]],[[1,95,247,253,212,183,255,255,128,128,128],[239,90,244,250,211,209,255,255,128,128,128],[155,77,195,248,188,195,255,255,128,128,128]],[[1,24,239,251,218,219,255,205,128,128,128],[201,51,219,255,196,186,128,128,128,128,128],[69,46,190,239,201,218,255,228,128,128,128]],[[1,191,251,255,255,128,128,128,128,128,128],[223,165,249,255,213,255,128,128,128,128,128],[141,124,248,255,255,128,128,128,128,128,128]],[[1,16,248,255,255,128,128,128,128,128,128],[190,36,230,255,236,255,128,128,128,128,128],[149,1,255,128,128,128,128,128,128,128,128]],[[1,226,255,128,128,128,128,128,128,128,128],[247,192,255,128,128,128,128,128,128,128,128],[240,128,255,128,128,128,128,128,128,128,128]],[[1,134,252,255,255,128,128,128,128,128,128],[213,62,250,255,255,128,128,128,128,128,128],[55,93,255,128,128,128,128,128,128,128,128]],[[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128],[128,128,128,128,128,128,128,128,128,128,128]]],[[[202,24,213,235,186,191,220,160,240,175,255],[126,38,182,232,169,184,228,174,255,187,128],[61,46,138,219,151,178,240,170,255,216,128]],[[1,112,230,250,199,191,247,159,255,255,128],[166,109,228,252,211,215,255,174,128,128,128],[39,77,162,232,172,180,245,178,255,255,128]],[[1,52,220,246,198,199,249,220,255,255,128],[124,74,191,243,183,193,250,221,255,255,128],[24,71,130,219,154,170,243,182,255,255,128]],[[1,182,225,249,219,240,255,224,128,128,128],[149,150,226,252,216,205,255,171,128,128,128],[28,108,170,242,183,194,254,223,255,255,128]],[[1,81,230,252,204,203,255,192,128,128,128],[123,102,209,247,188,196,255,233,128,128,128],[20,95,153,243,164,173,255,203,128,128,128]],[[1,222,248,255,216,213,128,128,128,128,128],[168,175,246,252,235,205,255,255,128,128,128],[47,116,215,255,211,212,255,255,128,128,128]],[[1,121,236,253,212,214,255,255,128,128,128],[141,84,213,252,201,202,255,219,128,128,128],[42,80,160,240,162,185,255,205,128,128,128]],[[1,1,255,128,128,128,128,128,128,128,128],[244,1,255,128,128,128,128,128,128,128,128],[238,1,255,128,128,128,128,128,128,128,128]]]],ua=[[[231,120,48,89,115,113,120,152,112],[152,179,64,126,170,118,46,70,95],[175,69,143,80,85,82,72,155,103],[56,58,10,171,218,189,17,13,152],[114,26,17,163,44,195,21,10,173],[121,24,80,195,26,62,44,64,85],[144,71,10,38,171,213,144,34,26],[170,46,55,19,136,160,33,206,71],[63,20,8,114,114,208,12,9,226],[81,40,11,96,182,84,29,16,36]],[[134,183,89,137,98,101,106,165,148],[72,187,100,130,157,111,32,75,80],[66,102,167,99,74,62,40,234,128],[41,53,9,178,241,141,26,8,107],[74,43,26,146,73,166,49,23,157],[65,38,105,160,51,52,31,115,128],[104,79,12,27,217,255,87,17,7],[87,68,71,44,114,51,15,186,23],[47,41,14,110,182,183,21,17,194],[66,45,25,102,197,189,23,18,22]],[[88,88,147,150,42,46,45,196,205],[43,97,183,117,85,38,35,179,61],[39,53,200,87,26,21,43,232,171],[56,34,51,104,114,102,29,93,77],[39,28,85,171,58,165,90,98,64],[34,22,116,206,23,34,43,166,73],[107,54,32,26,51,1,81,43,31],[68,25,106,22,64,171,36,225,114],[34,19,21,102,132,188,16,76,124],[62,18,78,95,85,57,50,48,51]],[[193,101,35,159,215,111,89,46,111],[60,148,31,172,219,228,21,18,111],[112,113,77,85,179,255,38,120,114],[40,42,1,196,245,209,10,25,109],[88,43,29,140,166,213,37,43,154],[61,63,30,155,67,45,68,1,209],[100,80,8,43,154,1,51,26,71],[142,78,78,16,255,128,34,197,171],[41,40,5,102,211,183,4,1,221],[51,50,17,168,209,192,23,25,82]],[[138,31,36,171,27,166,38,44,229],[67,87,58,169,82,115,26,59,179],[63,59,90,180,59,166,93,73,154],[40,40,21,116,143,209,34,39,175],[47,15,16,183,34,223,49,45,183],[46,17,33,183,6,98,15,32,183],[57,46,22,24,128,1,54,17,37],[65,32,73,115,28,128,23,128,205],[40,3,9,115,51,192,18,6,223],[87,37,9,115,59,77,64,21,47]],[[104,55,44,218,9,54,53,130,226],[64,90,70,205,40,41,23,26,57],[54,57,112,184,5,41,38,166,213],[30,34,26,133,152,116,10,32,134],[39,19,53,221,26,114,32,73,255],[31,9,65,234,2,15,1,118,73],[75,32,12,51,192,255,160,43,51],[88,31,35,67,102,85,55,186,85],[56,21,23,111,59,205,45,37,192],[55,38,70,124,73,102,1,34,98]],[[125,98,42,88,104,85,117,175,82],[95,84,53,89,128,100,113,101,45],[75,79,123,47,51,128,81,171,1],[57,17,5,71,102,57,53,41,49],[38,33,13,121,57,73,26,1,85],[41,10,67,138,77,110,90,47,114],[115,21,2,10,102,255,166,23,6],[101,29,16,10,85,128,101,196,26],[57,18,10,102,102,213,34,20,43],[117,20,15,36,163,128,68,1,26]],[[102,61,71,37,34,53,31,243,192],[69,60,71,38,73,119,28,222,37],[68,45,128,34,1,47,11,245,171],[62,17,19,70,146,85,55,62,70],[37,43,37,154,100,163,85,160,1],[63,9,92,136,28,64,32,201,85],[75,15,9,9,64,255,184,119,16],[86,6,28,5,64,255,25,248,1],[56,8,17,132,137,255,55,116,128],[58,15,20,82,135,57,26,121,40]],[[164,50,31,137,154,133,25,35,218],[51,103,44,131,131,123,31,6,158],[86,40,64,135,148,224,45,183,128],[22,26,17,131,240,154,14,1,209],[45,16,21,91,64,222,7,1,197],[56,21,39,155,60,138,23,102,213],[83,12,13,54,192,255,68,47,28],[85,26,85,85,128,128,32,146,171],[18,11,7,63,144,171,4,4,246],[35,27,10,146,174,171,12,26,128]],[[190,80,35,99,180,80,126,54,45],[85,126,47,87,176,51,41,20,32],[101,75,128,139,118,146,116,128,85],[56,41,15,176,236,85,37,9,62],[71,30,17,119,118,255,17,18,138],[101,38,60,138,55,70,43,26,142],[146,36,19,30,171,255,97,27,20],[138,45,61,62,219,1,81,188,64],[32,41,20,117,151,142,20,21,163],[112,19,12,61,195,128,48,4,24]]],ba=[[[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[176,246,255,255,255,255,255,255,255,255,255],[223,241,252,255,255,255,255,255,255,255,255],[249,253,253,255,255,255,255,255,255,255,255]],[[255,244,252,255,255,255,255,255,255,255,255],[234,254,254,255,255,255,255,255,255,255,255],[253,255,255,255,255,255,255,255,255,255,255]],[[255,246,254,255,255,255,255,255,255,255,255],[239,253,254,255,255,255,255,255,255,255,255],[254,255,254,255,255,255,255,255,255,255,255]],[[255,248,254,255,255,255,255,255,255,255,255],[251,255,254,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[251,254,254,255,255,255,255,255,255,255,255],[254,255,254,255,255,255,255,255,255,255,255]],[[255,254,253,255,254,255,255,255,255,255,255],[250,255,254,255,254,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[217,255,255,255,255,255,255,255,255,255,255],[225,252,241,253,255,255,254,255,255,255,255],[234,250,241,250,253,255,253,254,255,255,255]],[[255,254,255,255,255,255,255,255,255,255,255],[223,254,254,255,255,255,255,255,255,255,255],[238,253,254,254,255,255,255,255,255,255,255]],[[255,248,254,255,255,255,255,255,255,255,255],[249,254,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,255,255,255,255,255,255,255,255,255],[247,254,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[252,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,254,255,255,255,255,255,255,255,255],[253,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,253,255,255,255,255,255,255,255,255],[250,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[186,251,250,255,255,255,255,255,255,255,255],[234,251,244,254,255,255,255,255,255,255,255],[251,251,243,253,254,255,254,255,255,255,255]],[[255,253,254,255,255,255,255,255,255,255,255],[236,253,254,255,255,255,255,255,255,255,255],[251,253,253,254,254,255,255,255,255,255,255]],[[255,254,254,255,255,255,255,255,255,255,255],[254,254,254,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,254,255,255,255,255,255,255,255,255,255],[254,254,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]],[[[248,255,255,255,255,255,255,255,255,255,255],[250,254,252,254,255,255,255,255,255,255,255],[248,254,249,253,255,255,255,255,255,255,255]],[[255,253,253,255,255,255,255,255,255,255,255],[246,253,253,255,255,255,255,255,255,255,255],[252,254,251,254,254,255,255,255,255,255,255]],[[255,254,252,255,255,255,255,255,255,255,255],[248,254,253,255,255,255,255,255,255,255,255],[253,255,254,254,255,255,255,255,255,255,255]],[[255,251,254,255,255,255,255,255,255,255,255],[245,251,254,255,255,255,255,255,255,255,255],[253,253,254,255,255,255,255,255,255,255,255]],[[255,251,253,255,255,255,255,255,255,255,255],[252,253,254,255,255,255,255,255,255,255,255],[255,254,255,255,255,255,255,255,255,255,255]],[[255,252,255,255,255,255,255,255,255,255,255],[249,255,254,255,255,255,255,255,255,255,255],[255,255,254,255,255,255,255,255,255,255,255]],[[255,255,253,255,255,255,255,255,255,255,255],[250,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]],[[255,255,255,255,255,255,255,255,255,255,255],[254,255,255,255,255,255,255,255,255,255,255],[255,255,255,255,255,255,255,255,255,255,255]]]];this.WebPGetDecoderVersion=this.Ld=function(){return 512};var sa=[0,1,2,3,6,4,5,6,6,6,6,6,6,6,6,7,0],la=[[173,148,140,0],[176,155,140,135,0],[180,157,141,134,130,0],[254,254,243,230,196,177,153,140,133,130,129,0]],ha=[0,1,4,8,5,2,3,6,9,12,13,10,7,11,14,15],da=p([Zr,tn],"");d(4,0);var va=[[0,0,0,0],[1,0,0,0],[0,1,0,0],[1,1,0,0],[0,0,1,0],[1,0,1,0],[0,1,1,0],[1,1,1,0],[0,0,0,1],[1,0,0,1],[0,1,0,1],[1,1,0,1],[0,0,1,1],[1,0,1,1],[0,1,1,1],[1,1,1,1]],pa=134480385,ga=16,Pa=-227,Aa=482,ka=[_t,function(t){return t},function(t,e,r){return e[r+0]},function(t,e,r){return e[r+1]},function(t,e,r){return e[r-1]},function(t,e,r){return Ot(Ot(t,e[r+1]),e[r+0])},function(t,e,r){return Ot(t,e[r-1])},function(t,e,r){return Ot(t,e[r+0])},function(t,e,r){return Ot(e[r-1],e[r+0])},function(t,e,r){return Ot(e[r+0],e[r+1])},function(t,e,r){return Ot(Ot(t,e[r-1]),Ot(e[r+0],e[r+1]))},function(t,e,r){return Math.abs((t>>24&255)-(e[r-1]>>24&255))-Math.abs((e[r+0]>>24&255)-(e[r-1]>>24&255))+(Math.abs((t>>16&255)-(e[r-1]>>16&255))-Math.abs((e[r+0]>>16&255)-(e[r-1]>>16&255)))+(Math.abs((t>>8&255)-(e[r-1]>>8&255))-Math.abs((e[r+0]>>8&255)-(e[r-1]>>8&255)))+(Math.abs((255&t)-(255&e[r-1]))-Math.abs((255&e[r+0])-(255&e[r-1])))<=0?e[r+0]:t},function(t,e,r){return(Vt((t>>24&255)+(e[r+0]>>24&255)-(e[r-1]>>24&255))<<24|Vt((t>>16&255)+(e[r+0]>>16&255)-(e[r-1]>>16&255))<<16|Vt((t>>8&255)+(e[r+0]>>8&255)-(e[r-1]>>8&255))<<8|Vt((255&t)+(255&e[r+0])-(255&e[r-1])))>>>0},function(t,e,r){const n=e[r-1];return(It((t=Ot(t,e[r+0]))>>24&255,n>>24&255)<<24|It(t>>16&255,n>>16&255)<<16|It(t>>8&255,n>>8&255)<<8|It(t>>0&255,n>>0&255))>>>0},_t,_t],ma={Cc:0,Bc:0,Kc:0},wa=16,ya=16,Sa=16,Ta=[2,3,7],Ra=[3,3,11],Oa=0,Va=1,Ia=2,_a=3,Wa=4,Ua=[gr+Pr,gr,gr,gr,40],Ma=19,Ba=[17,18,0,1,2,3,4,5,16,6,7,8,9,10,11,12,13,14,15],Da=120,Ea=[24,7,23,25,40,6,39,41,22,26,38,42,56,5,55,57,21,27,54,58,37,43,72,4,71,73,20,28,53,59,70,74,36,44,88,69,75,52,60,3,87,89,19,29,86,90,35,45,68,76,85,91,51,61,104,2,103,105,18,30,102,106,34,46,84,92,67,77,101,107,50,62,120,1,119,121,83,93,17,31,100,108,66,78,118,122,33,47,117,123,49,63,99,109,82,94,0,116,124,65,79,16,32,98,110,48,115,125,81,95,64,114,126,97,111,80,113,127,96,112],ja=1<{var e;e=t.data,m.push(e),y()}))}},n={};function a(t){var e=n[t];if(void 0!==e)return e.exports;var o=n[t]={exports:{}};return r[t].call(o.exports,o,o.exports,a),o.exports}a.m=r,a.x=()=>{var t=a.O(void 0,[699,866,158],(()=>a(2061)));return a.O(t)},t=[],a.O=(e,r,n,o)=>{if(!r){var f=1/0;for(b=0;b=o)&&Object.keys(a.O).every((t=>a.O[t](r[i])))?r.splice(i--,1):(c=!1,o0&&t[b-1][2]>o;b--)t[b]=t[b-1];t[b]=[r,n,o]},a.d=(t,e)=>{for(var r in e)a.o(e,r)&&!a.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},a.f={},a.e=t=>Promise.all(Object.keys(a.f).reduce(((e,r)=>(a.f[r](t,e),e)),[])),a.u=t=>({158:"npm.iobuffer",699:"npm.pako",866:"npm.fast-png"}[t]+"."+{158:"061a9f8cc247dc1dbb8d",699:"85f88e27b023cbb2ca51",866:"8cb0a7aa9c4ab1eb9f54"}[t]+".chunk.js"),a.miniCssF=t=>{},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),a.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{var t;a.g.importScripts&&(t=a.g.location+"");var e=a.g.document;if(!t&&e&&(e.currentScript&&(t=e.currentScript.src),!t)){var r=e.getElementsByTagName("script");r.length&&(t=r[r.length-1].src)}if(!t)throw new Error("Automatic publicPath is not supported in this browser");t=t.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=t})(),(()=>{if(void 0!==a){var t=a.u,e=a.e,r={},n={};a.u=function(e){return t(e)+(r.hasOwnProperty(e)?"?"+r[e]:"")},a.e=function(o){return e(o).catch((function(e){var f=n.hasOwnProperty(o)?n[o]:999999;if(f<1){var c=t(o);throw e.message="Loading chunk "+o+" failed after 999999 retries.\n("+c+")",e.request=c,e}return new Promise((function(t){setTimeout((function(){var e=Date.now();r[o]=e,n[o]=f-1,t(a.e(o))}),3e3)}))}))}}})(),(()=>{var t={61:1};a.f.i=(e,r)=>{t[e]||importScripts(a.p+a.u(e))};var e=this.webpackChunktweb=this.webpackChunktweb||[],r=e.push.bind(e);e.push=e=>{var[n,o,f]=e;for(var c in o)a.o(o,c)&&(a.m[c]=o[c]);for(f&&f(a);n.length;)t[n.pop()]=1;r(e)}})(),e=a.x,a.x=()=>Promise.all([699,866,158].map(a.e,a)).then(e),a.x()})(); -//# sourceMappingURL=61.9f135819bd5af1b57a36.chunk.js.map \ No newline at end of file +//# sourceMappingURL=61.3cfffcdc0849ca3fc87c.chunk.js.map \ No newline at end of file diff --git a/public/61.9f135819bd5af1b57a36.chunk.js.map b/public/61.3cfffcdc0849ca3fc87c.chunk.js.map similarity index 99% rename from public/61.9f135819bd5af1b57a36.chunk.js.map rename to public/61.3cfffcdc0849ca3fc87c.chunk.js.map index 4116996e8..6aec79080 100644 --- a/public/61.9f135819bd5af1b57a36.chunk.js.map +++ b/public/61.3cfffcdc0849ca3fc87c.chunk.js.map @@ -1 +1 @@ -{"version":3,"file":"61.9f135819bd5af1b57a36.chunk.js","mappings":"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,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAGvD,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClC,IAAK,IAAK,KAEZ,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IACnB,IAAK,IAAK,IAAK,IAAK,IAAK,KAE3B,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IACT,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAIzC,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACvC,IAAK,MAGT,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAGvD,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IACxB,IAAK,IAAK,IAAK,IAAK,KAEtB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IACT,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAErC,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/vendor/libwebp-0.2.0.js","webpack://tweb/./src/lib/webp/webp.worker.ts","webpack://tweb/./src/lib/webp/webp.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,866,158].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","// Copyright 2011 Google Inc.\n//\n// This code is licensed under the same terms as WebM:\n// Software License Agreement: http://www.webmproject.org/license/software/\n// Additional IP Rights Grant: http://www.webmproject.org/license/additional/\n// -----------------------------------------------------------------------------\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// -----------------------------------------------------------------------------\n//\n// Copyright 2011-2013 Dominik Homberger\n// Libwebp Javascript / libwebpjs - the libwebp implementation in javascript (v0.2.0)\n//\n// Author: Dominik Homberger (dominik.homberger@gmail.com)\n\nlet i;\nlet a;\nlet self;\nconst ca = 0;\nconst p = null;\nconst s = 0;\nconst x = 0;\nconst la = s;\nconst E = s;\nconst bb = 0;\nconst Mb = 0;\n\nfunction M(F) {\n return JSON.parse(JSON.stringify(F));\n}\n\nfunction N(F, G, w, D, S) {\n for (i = 0; i < S; ++i) F[G + i] = w[D + i];\n}\n\nfunction Nb(F) {\n const G = [];\n const w = F.length;\n let D;\n for (D = 0; D < w; ++D) G.push(F[D]);\n return G;\n}\n\nfunction ic(F, G) {\n const w = [];\n w.push(M(F));\n let D;\n for (D = 0; D < G; ++D) w.push(M(F));\n w.push(0);\n return w;\n}\n\nfunction rc(F, G) {\n const w = [];\n let D;\n for (D = 0; D < G; ++D) w.push(F);\n w.push(0);\n return w;\n}\n\nfunction memmove(arr1, index1, arr2, index2, length) {\n let i;\n for (i = 0; i < length; i++) {\n arr1[index1 + i] = arr2[index2 + i];\n }\n}\n\nfunction jd(F, G, w, D) {\n let S;\n for (S = 0; S < D; ++S) F[G + S] = w;\n}\n\nfunction kd(F, G, w, D) {\n let S = '';\n let ga;\n for (ga = 0; ga < D; ++ga) S += String.fromCharCode(F[G + ga]);\n return w == S ? 0 : 1;\n}\n\nfunction U(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(G);\n return D;\n}\n\nfunction ld(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(M(G));\n return D;\n}\n\nfunction md(F, G) {\n let w;\n for (w = F.length - 1; w >= 0; --w) G = M(U(F[w], G));\n return G;\n}\n\nfunction $(F) {\n if (!F) throw Error('assert :P');\n}\nexport const WebPDecoder = function () {\n function F(a) {\n return a == Ob || a == Pb || a == Bb || a == Qb;\n }\n\n function G(a) {\n return S(a, 1);\n }\n\n function w(a, b) {\n const c = 1 + ((a.la - 1) * b >> 8);\n const d = c << 8;\n let e = s;\n a.Z >= d ? (e = 1, a.la -= c, a.Z -= d) : (e = 0, a.la = c);\n for (; a.la < 128;) a.Z <<= 1, a.la <<= 1, ++a.gc == 8 && (a.gc = 0, a.bc && (a.Z += a.qa[a.Ia++], a.bc--));\n return e;\n }\n\n function D(a, b, c, d) {\n d -= c;\n d >= 2 ? (a.Z = b[c + 0] << 8 | b[c + 1], a.qa = b, a.Ia = c + 2, a.bc = d - 2) : (a.Z = 0, a.qa = p, a.bc = 0);\n a.la = 255;\n a.gc = 0;\n }\n\n function S(a, b) {\n for (var c = 0, d = s, d = b - 1; d >= 0; d--) c |= w(a, 128) << d;\n return c;\n }\n\n function ga(a, b) {\n const c = S(a, b);\n return G(a) ? -c : c;\n }\n\n function Rb(a, b, c, d) {\n let e = Mb;\n $(a != p);\n $(b != p);\n $(d < 4294967288);\n a.qa = b;\n a.Ia = c;\n a.ya = d;\n a.T = 0;\n a.Q = 0;\n a.g = 0;\n a.L = 0;\n for (e = a.fa = 0; e < 4 && e < a.ya; ++e) a.T |= a.qa[a.Ia + a.Q] << 8 * e, ++a.Q;\n }\n\n function Sb(a) {\n for (; a.g >= 8 && a.Q < a.ya;) a.T >>>= 8, a.T += a.qa[a.Ia + a.Q] << 24 >>> 0, ++a.Q, a.g -= 8;\n }\n\n function Da(a) {\n a.g >= 8 && Sb(a);\n a.Q == a.ya && a.g == 32 && (a.L = 1);\n }\n\n function T(a, b) {\n let c = 0;\n $(b >= 0);\n if (!a.L && b < gf) {\n if (a.Q == a.ya && a.g + b >= 32 && (a.L = 1, a.g + b > 32)) return c;\n c = a.T >> a.g & hf[b];\n a.g += b;\n a.g >= 8 && a.g >= 8 && Sb(a);\n } else a.fa = 1;\n return c;\n }\n\n function ma(a) {\n return a.Pa == a.gb;\n }\n\n function nd(a, b) {\n $(a != p);\n if (b == 0) return 0;\n a.gb = 2 * b - 1;\n a.Y = ld(a.gb, jf);\n if (a.Y == p) return 0;\n a.Y[0].s = -1;\n return a.Pa = 1;\n }\n\n function ja(a) {\n a != p && (a.Y = p, a.Y = p, a.gb = 0, a.Pa = 0);\n }\n\n function jc(a, b, c, d) {\n for (var e = a.Y, g = 0, k = +a.gb; d-- > 0;) {\n if (g >= k) return 0;\n if (e[g].s < 0) {\n if (ma(a)) return 0;\n const h = a;\n const n = h.Y;\n const l = +h.Pa;\n e[g].s = l - g;\n h.Pa += 2;\n n[l + 0].s = -1;\n n[l + 1].s = -1;\n } else if (e[g].s == 0) return 0;\n g += e[g].s + (c >> d & 1);\n }\n if (e[g].s < 0) e[g].s = 0;\n else if (e[g].s != 0) return 0;\n e[g].kc = b;\n return 1;\n }\n\n function od(a, b, c) {\n var d = s;\n let e = 0;\n let g = 0;\n $(a != p);\n $(b != p);\n for (d = 0; d < c; ++d) b[d] > 0 && (++e, g = d);\n if (!nd(a, e)) return 0;\n if (e == 1) return g < 0 || g >= c ? (ja(a), 0) : jc(a, g, 0, 0);\n e = 0;\n g = U(c, s);\n if (g == p) return (e = e && ma(a)) || ja(a), e;\n var k = s;\n var k = s;\n var d = U(Tb + 1, 0);\n let h = s;\n const n = U(Tb + 1, 0);\n let l = 0;\n $(b != p);\n $(c > 0);\n $(g != p);\n for (k = 0; k < c; ++k) b[k] > l && (l = b[k]);\n if (l > Tb) d = 0;\n else {\n for (k = 0; k < c; ++k) ++d[b[k]];\n h = d[0] = 0;\n n[0] = -1;\n for (k = 1; k <= l; ++k) h = h + d[k - 1] << 1, n[k] = h;\n for (k = 0; k < c; ++k) g[k] = b[k] > 0 ? n[b[k]]++ : pd;\n d = 1;\n }\n if (!d) return (e = e && ma(a)) || ja(a), e;\n for (d = 0; d < c; ++d) {\n if (b[d] > 0 && !jc(a, d, g[d], b[d])) {\n return (e = e && ma(a)) || ja(a), e;\n }\n }\n (e = ma(a)) || ja(a);\n return e;\n }\n\n function Ea(a, b, c, d, e, g, k) {\n for (var h = s, h = 0; h < k; ++h) e[g + h] = a[b + h] + c[d + h] & 255;\n }\n\n function qd(a, b, c) {\n const d = a.P.l;\n if (!(c = b < 0 || c < 0 || b + c > a.P.v)) {\n if (c = b == 0) {\n a: {\n let e = a.Ga;\n var g = a.G;\n var k = a.ub;\n c = a.P.l;\n let h = a.P.v;\n const n = a.Xb;\n var l = [p];\n let m = p;\n let f = h * c;\n var q = p;\n var r = p;\n var r = 'WEBP_FILTER_TYPE';\n let u = s;\n var l = s;\n var v = 0;\n let C = s;\n $(c > 0 && h > 0 && d >= c);\n $(e != p && n != p);\n if (k <= Ub) c = 0;\n else if (C = e[g + 0] >> 0 & 3, r = e[g + 0] >> 2 & 3, u = e[g + 0] >> 4 & 3, l = e[g + 0] >> 6 & 3, C < kc || C > kf || r >= lf || u > rd || l != 0) c = 0;\n else {\n if (C == kc) v = k >= f, l = e, m = g + Ub;\n else {\n l = U(f, 0);\n m = 0;\n if (l\n == p) {\n c = 0;\n break a;\n }\n var v = g + Ub;\n var k = k - Ub;\n var g = l;\n var q = M(Vb);\n let A = 0;\n const z = sd();\n z == p ? v = 0 : (z.l = c, z.v = h, z.N = q, td(na), q.put = ud, q.Mb = vd, q.Pb = wd, q.ka = p, q.ka = g, q.fd = 0, q.width = c, q.height = h, z.a = L, Rb(z.o, e, v, k), z.Wa = Cb, Ka(c, h, 1, z, p) && xd(z, c) && (z.Wa = Db, A = lc(z, z.V, z.Ha, z.l, z.v, mf)), z != p && sa(z), v = A);\n }\n if (v) {\n e = nf[r];\n e != p ? (q = U(f, 0), r = 0, q == p && (v = 0, C != kc && (m = l = p)), e(l, m, c, h, 1, c, q, r), f = q, C = r) : (f = l, C = m);\n for (e = 0; h-- > 0;) N(n, e, f, C, c), C += c, e += d;\n u == rd && (v = l == p || m <= 0 || c <= 0 ? 0 : 1);\n }\n c = v;\n }\n }\n c = !c;\n }\n }\n return c ? p : b == 0 ? a.Xb : +b * d;\n }\n\n function of(a) {\n let b = a.width;\n const c = a.height;\n let d = a.J;\n if (b <= 0 || c <= 0 || !(d >= Qa && d < Cc)) return ta;\n if (!a.Fc && a.Jb == p) {\n var e = p;\n var g = 0;\n var k = 0;\n var h = 0;\n var n = 0;\n var e = bb;\n var l = b * yd[d];\n var m = l * c;\n d < ua || (g = parseInt((b + 1) / 2, 10), h = g * parseInt((c + 1) / 2, 10), d == Ra && (k = b, n = k * c));\n e = m + 2 * h + n;\n if (e != e) return ta;\n e = U(e, 205);\n if (e == p) return cb;\n a.Jb = e;\n a.jc = p;\n d < ua ? (b = a.c.RGBA, b.ma = e, b.Sa = p, b.f = l, b.size = m) : (b = a.c.Va, b.y = e, b.D = p, b.F = l, b.Wc = m, b.c = e, b.B = p + m, b.nb = g, b.Rc = h, b.S = e, b.C = p + m + h, b.rb = g, b.Uc = h, d == Ra && (b.p = e, b.q = p + m + 2 * h), b.Wb = n, b.Fa = k);\n }\n d = 1;\n g = a.J;\n k = a.width;\n h = a.height;\n g >= Qa && g < Cc ? g < ua ? (a = a.c.RGBA, d\n &= a.f * h <= a.size, d &= a.f >= k * yd[g], d &= a.ma != p) : (a = a.c.Va, n = a.nb * parseInt((h + 1) / 2, 10), l = a.rb * parseInt((h + 1) / 2, 10), m = a.Fa * h, d &= a.F * h <= a.Wc, d &= n <= a.Rc, d &= l <= a.Uc, d &= m <= a.Wb, d &= a.F >= k, d &= a.nb >= parseInt((k + 1) / 2, 10), d &= a.rb >= parseInt((k + 1) / 2, 10), d &= a.y != p, d &= a.c != p, d &= a.S != p, g == Ra && (d &= a.Fa >= k, d &= m <= a.Wb, d &= a.p != p)) : d = 0;\n return d ? L : ta;\n }\n\n function zd(a, b, c, d) {\n if (d == p || a <= 0 || b <= 0) return ta;\n if (c != p) {\n if (c.Ua) {\n const e = c.wc;\n const g = c.vc;\n const k = c.t & -2;\n const h = c.k & -2;\n if (k < 0 || h < 0 || e <= 0 || g <= 0 || k + e > a || h + g > b) return ta;\n a = e;\n b = g;\n }\n if (c.I) {\n if (c.Ba <= 0\n || c.Aa <= 0) return ta;\n a = c.Ba;\n b = c.Aa;\n }\n }\n d.width = a;\n d.height = b;\n return of(d);\n }\n\n function mb(a) {\n return !(a & -256) ? a : a < 0 ? 0 : 255;\n }\n\n function Ad(a, b, c, d) {\n const e = U(16, 0);\n let g;\n g = 0;\n let k;\n for (k = 0; k < 4; ++k) {\n var h = a[b + 0] + a[b + 8];\n var n = a[b + 0] - a[b + 8];\n var l = (a[b + 4] * Wb >> 16) - (a[b + 12] * Xb >> 16);\n var m = (a[b + 4] * Xb >> 16) + (a[b + 12] * Wb >> 16);\n e[g + 0] = h + m;\n e[g + 1] = n + l;\n e[g + 2] = n - l;\n e[g + 3] = h - m;\n g += 4;\n b++;\n }\n for (k = g = 0; k < 4; ++k) {\n a = e[g + 0] + 4, h = a + e[g + 8], n = a - e[g + 8], l = (e[g + 4] * Wb >> 16) - (e[g + 12] * Xb >> 16), m = (e[g + 4] * Xb >> 16) + (e[g + 12] * Wb >> 16), c[d + 0 + 0 * f] = mb(c[d + 0 + 0 * f] + (h + m >> 3)), c[d + 1 + 0 * f] = mb(c[d\n + 1 + 0 * f] + (n + l >> 3)), c[d + 2 + 0 * f] = mb(c[d + 2 + 0 * f] + (n - l >> 3)), c[d + 3 + 0 * f] = mb(c[d + 3 + 0 * f] + (h - m >> 3)), g++, d += f;\n }\n }\n\n function pf(a, b, c, d, e) {\n Ad(a, b, c, d);\n e && Ad(a, b + 16, c, d + 4);\n }\n\n function qf(a, b, c, d) {\n mc(a, b + 0, c, d + 0, 1);\n mc(a, b + 32, c, d + 4 * f, 1);\n }\n\n function nc(a, b, c, d) {\n a = a[b + 0] + 4;\n let e;\n for (e = 0; e < 4; ++e) for (b = 0; b < 4; ++b) c[d + b + e * f] = mb(c[d + b + e * f] + (a >> 3));\n }\n\n function rf(a, b, c, d) {\n a[b + 0] && nc(a, b + 0, c, d + 0);\n a[b + 16] && nc(a, b + 16, c, d + 4);\n a[b + 32] && nc(a, b + 32, c, d + 4 * f);\n a[b + 48] && nc(a, b + 48, c, d + 4 * f + 4);\n }\n\n function Dc(a, b, c) {\n const d = b - f;\n const e = oa;\n const g = 255 - a[d - 1];\n let k;\n for (k = 0; k\n < c; ++k) {\n const h = e;\n const n = g + a[b - 1];\n var l;\n for (l = 0; l < c; ++l) a[b + l] = h[n + a[d + l]];\n b += f;\n }\n }\n\n function Yb(a, b, c) {\n let d;\n for (d = 0; d < 16; ++d) for (i = 0; i < 16; ++i) b[c + d * f + i] = a;\n }\n\n function y(a, b, c) {\n return a + 2 * b + c + 2 >> 2;\n }\n\n function Zb(a, b, c) {\n let d; let\n e;\n for (d = 0; d < 8; ++d) for (e = 0; e < 8; ++e) b[c + e + d * f] = a;\n }\n\n function nb(a, b, c) {\n const d = a[b - c];\n const e = a[b + 0];\n const g = 3 * (e - d) + sc[1020 + a[b - 2 * c] - a[b + c]];\n const k = oc[112 + (g + 4 >> 3)];\n a[b - c] = oa[255 + d + oc[112 + (g + 3 >> 3)]];\n a[b + 0] = oa[255 + e - k];\n }\n\n function Bd(a, b, c, d) {\n const e = a[b + 0];\n const g = a[b + c];\n return va[255 + a[b - 2 * c] - a[b - c]] > d || va[255 + g - e] > d;\n }\n\n function Cd(a,\n b, c, d, e) {\n const g = a[b - 3 * c];\n const k = a[b - 2 * c];\n const h = a[b - c];\n const n = a[b + 0];\n const l = a[b + c];\n const m = a[b + 2 * c];\n const f = a[b + 3 * c];\n return 2 * va[255 + h - n] + tc[255 + k - l] > d ? 0 : va[255 + a[b - 4 * c] - g] <= e && va[255 + g - k] <= e && va[255 + k - h] <= e && va[255 + f - m] <= e && va[255 + m - l] <= e && va[255 + l - n] <= e;\n }\n\n function Dd(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e - c] - a[b + e + 0]] + tc[255 + a[b + e - 2 * c] - a[b + e + c]] <= d && nb(a, b + e, c);\n }\n\n function Ed(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e * c - 1] - a[b + e * c + 0]] + tc[255 + a[b + e * c - 2] - a[b + e * c + 1]] <= d && nb(a, b + e * c, 1);\n }\n\n function sf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) {\n b\n += 4 * c, Dd(a, b + 0, c, d);\n }\n }\n\n function tf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) b += 4, Ed(a, b + 0, c, d);\n }\n\n function Fa(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c, g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - 2 * m];\n const q = n[l - m];\n const r = n[l + 0];\n const u = n[l + m];\n const v = n[l + 2 * m];\n var C = sc[1020 + 3 * (r - q) + sc[1020 + f - u]];\n const A = 27 * C + 63 >> 7;\n const z = 18 * C + 63 >> 7;\n var C = 9 * C + 63 >> 7;\n n[l - 3 * m] = oa[255 + n[l - 3 * m] + C];\n n[l - 2 * m] = oa[255 + f + z];\n n[l - m] = oa[255 + q + A];\n n[l + 0] = oa[255 + r - A];\n n[l + m] = oa[255 + u - z];\n n[l + 2 * m] = oa[255 + v - C];\n }\n }\n b += d;\n }\n }\n\n function Ga(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c,\n g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - m];\n const q = n[l + 0];\n const r = n[l + m];\n var u = 3 * (q - f);\n const v = oc[112 + (u + 4 >> 3)];\n var u = oc[112 + (u + 3 >> 3)];\n const C = v + 1 >> 1;\n n[l - 2 * m] = oa[255 + n[l - 2 * m] + C];\n n[l - m] = oa[255 + f + u];\n n[l + 0] = oa[255 + q - v];\n n[l + m] = oa[255 + r - C];\n }\n }\n b += d;\n }\n }\n\n function uf(a, b, c, d, e, g) {\n Fa(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function vf(a, b, c, d, e, g) {\n Fa(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function wf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4 * c, Ga(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function xf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4, Ga(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function yf(a, b, c, d, e,\n g, k, h) {\n Fa(a, b, e, 1, 8, g, k, h);\n Fa(c, d, e, 1, 8, g, k, h);\n }\n\n function zf(a, b, c, d, e, g, k, h) {\n Fa(a, b, 1, e, 8, g, k, h);\n Fa(c, d, 1, e, 8, g, k, h);\n }\n\n function Af(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4 * e, e, 1, 8, g, k, h);\n Ga(c, d + 4 * e, e, 1, 8, g, k, h);\n }\n\n function Bf(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4, 1, e, 8, g, k, h);\n Ga(c, d + 4, 1, e, 8, g, k, h);\n }\n\n function Fd(a, b) {\n return b == $b ? a.i == 0 ? a.d == 0 ? Cf : Df : a.d == 0 ? Ef : $b : b;\n }\n\n function Ec(a, b, c, d) {\n for (i = 0; i < 4; ++i) a[b + i] = c[d + i];\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function Gd(a) {\n a.a = 'VP8_STATUS_OK';\n a.xc = 'OK';\n }\n\n function td(a) {\n a >>> 8 != na >>> 8 && alert('mismatch error');\n }\n\n function Y(a, b, c) {\n a.a == L && (a.a = b, a.xc = c, a.za = 0);\n // alert(b + \": \" + c);\n return 0;\n }\n\n function Hd(a, b) {\n let c = [0];\n let d = x;\n var e = [Mb];\n var g = M(Id);\n var k = M(Jd);\n let h = M(Fc);\n var e = 'VP8StatusCode';\n var g = M(Gc);\n if (a == p) return alert('(dec == null)'), 0;\n Gd(a);\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'null VP8Io passed to VP8GetHeaders()');\n g.data = b.data;\n g.b = b.b;\n g.e = b.e;\n g.b = [g.b];\n g.e = [g.e];\n g = [g];\n e = Kd(g);\n if (e != L) return Y(a, e, 'Incorrect/incomplete header.');\n g = g[0];\n g.b = g.b[0];\n g.e = g.e[0];\n if (g.ia) return Y(a, W, 'Unexpected lossless format encountered.');\n a.Ga == p && ($(a.ub == 0), a.Ga = g.$, a.G = g.G, a.ub = g.pa);\n d = g.data;\n c = g.b + g.offset;\n e = g.e - g.offset;\n $(g.e >= g.offset);\n if (e[0] < 4) return Y(a, Z, 'Truncated header.');\n h = d[c + 0] | d[c + 1] << 8 | d[c + 2] << 16;\n g = a.Ac;\n g.fb = !(h & 1) + 0;\n g.Jc = h >> 1 & 7;\n g.Nc = h >> 4 & 1;\n g.Ra = h >> 5;\n if (g.Jc > 3) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Incorrect keyframe parameters.');\n if (!g.Nc) return Y(a, 'VP8_STATUS_UNSUPPORTED_FEATURE', 'Frame not displayable.');\n c += 3;\n e -= 3;\n k = a.P;\n if (g.fb) {\n if (e < 7) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'cannot parse picture header');\n if (!(e\n >= 3 && d[c + 0] == 157 && d[c + 1] == 1 && d[c + 2] == 42)) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Bad code word');\n k.l = (d[c + 4] << 8 | d[c + 3]) & 16383;\n k.gd = d[c + 4] >> 6;\n k.v = (d[c + 6] << 8 | d[c + 5]) & 16383;\n k.hd = d[c + 6] >> 6;\n c += 7;\n e -= 7;\n a.Ma = k.l + 15 >> 4;\n a.hb = k.v + 15 >> 4;\n b.width = k.l;\n b.height = k.v;\n b.I = 0;\n b.Ua = 0;\n b.k = 0;\n b.t = 0;\n b.Ka = b.width;\n b.K = b.height;\n b.m = b.width;\n b.h = b.height;\n h = a.R;\n for (i = 0; i < h.Ta.length; ++i) h.Ta[i] = 255;\n h.z = M(Ff);\n h = a.Ca;\n $(h != p);\n h.pb = 0;\n h.ob = 0;\n h.tb = 1;\n for (i = 0; i < h.Kb.length; ++i) h.Kb[i] = 0;\n for (i = 0; i < h.Cb.length; ++i) h.Cb[i] = 0;\n a.Lb = 0;\n }\n if (g.Ra\n > e) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'bad partition length');\n h = a.o;\n D(h, d, c, c + g.Ra);\n c += g.Ra;\n e -= g.Ra;\n g.fb && (k.uc = G(h), k.$c = G(h));\n var k = h;\n var n = a.Ca;\n let l = a.R;\n $(k != p);\n $(n != p);\n n.pb = G(k);\n if (n.pb) {\n n.ob = G(k);\n if (G(k)) {\n var m;\n n.tb = G(k);\n for (m = 0; m < xa; ++m) n.Kb[m] = G(k) ? ga(k, 7) : 0;\n for (m = 0; m < xa; ++m) n.Cb[m] = G(k) ? ga(k, 6) : 0;\n }\n if (n.ob) for (m = 0; m < Ld; ++m) l.Ta[m] = G(k) ? S(k, 8) : 255;\n } else n.ob = 0;\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse segment header');\n k = h;\n n = a.ga;\n n.Oc = G(k);\n n.Fb = S(k, 6);\n n.kb = S(k, 3);\n n.oc = G(k);\n if (n.oc\n && G(k)) {\n for (l = 0; l < Hc; ++l) G(k) && (n.Lc[l] = ga(k, 6));\n for (l = 0; l < Gf; ++l) G(k) && (n.Gc[l] = ga(k, 6));\n }\n a.A = n.Fb == 0 ? 0 : n.Oc ? 1 : 2;\n if (a.A > 0) {\n if (a.Ca.pb) for (l = 0; l < xa; ++l) m = a.Ca.Cb[l], a.Ca.tb || (m += n.Fb), a.Zb[l] = m;\n else a.Zb[0] = n.Fb;\n }\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse filter header');\n var k = d;\n var f = c;\n var n = f;\n var e = f + e;\n m = 0;\n let q = s;\n let r = s;\n a.Hb = 1 << S(a.o, 2);\n q = a.Hb - 1;\n l = k;\n m = f + 3 * q;\n if (e < m) e = 'VP8_STATUS_NOT_ENOUGH_DATA';\n else {\n for (r = 0; r < q; ++r) {\n var f = l;\n var u = m + (k[n + 0] | k[n + 1] << 8 | k[n + 2] << 16);\n u > e && (f = k);\n D(a.ic[+r], l, m, u);\n l = f;\n m = u;\n n += 3;\n }\n D(a.ic[+q], l, m, e);\n e = m < e ? 'VP8_STATUS_OK' : 'VP8_STATUS_SUSPENDED';\n }\n if (e != 'VP8_STATUS_OK') return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse partitions');\n q = a.o;\n e = S(q, 7);\n k = G(q) ? ga(q, 4) : 0;\n n = G(q) ? ga(q, 4) : 0;\n l = G(q) ? ga(q, 4) : 0;\n m = G(q) ? ga(q, 4) : 0;\n q = G(q) ? ga(q, 4) : 0;\n r = a.Ca;\n f = s;\n for (f = 0; f < xa; ++f) {\n u = s;\n if (r.pb) u = r.Kb[f], r.tb || (u += e);\n else if (f > 0) {\n a.yb[f] = a.yb[0];\n continue;\n } else u = e;\n const v = a.yb[f];\n v.sc[0] = Ic[wa(u + k, 127)];\n v.sc[1] = Jc[wa(u + 0, 127)];\n v.sb[0] = 2 * Ic[wa(u + n, 127)];\n v.sb[1] = 101581 * Jc[wa(u + l, 127)] >> 16;\n v.sb[1] < 8\n && (v.sb[1] = 8);\n v.qc[0] = Ic[wa(u + m, 117)];\n v.qc[1] = Jc[wa(u + q, 127)];\n }\n if (g.fb) a.Zc = 259;\n else return Y(a, Hf, 'Not a key frame.');\n G(h);\n e = a.R;\n for (k = 0; k < Md; ++k) for (n = 0; n < Nd; ++n) for (l = 0; l < Kc; ++l) for (m = 0; m < Lc; ++m) w(h, If[k][n][l][m]) && (e.z[k][n][l][m] = S(h, 8));\n a.pc = G(h);\n a.pc && (a.Pc = S(h, 8));\n if (a.P.uc) {\n c -= 8;\n h = Mb;\n if (g.Ra < 8 || d[c + 8 - 1] != 1) return Y(a, W, 'RIFF: Inconsistent extra information.');\n h = d[c + 0] << 0 | d[c + 1] << 8 | d[c + 2] << 16;\n a.fc = h;\n a.dd = p;\n a.cd = d[c + 3];\n }\n return a.za = 1;\n }\n\n function Mc(a, b, c, d, e, g) {\n let k = b[e][c];\n if (!w(a, k[0])) return 0;\n for (;;) {\n ++e;\n if (w(a, k[1])) {\n var h;\n if (w(a, k[2])) {\n if (w(a, k[3])) {\n if (w(a, k[6])) {\n h = x;\n c = w(a, k[8]);\n k = w(a, k[9 + c]);\n k = 2 * c + k;\n c = 0;\n h = Jf[k];\n var n;\n for (n = 0; n < h.length - 1; ++n) c += c + w(a, h[n]);\n c += 3 + (8 << k);\n } else w(a, k[7]) ? (c = 7 + 2 * w(a, 165), c += w(a, 145)) : c = 5 + w(a, 159);\n } else c = w(a, k[4]) ? 3 + w(a, k[5]) : 2;\n k = b[Nc[e]][2];\n } else k = b[Nc[e]][1], c = 1;\n h = Kf[e - 1];\n g[g[g.length - 1] + h] = (w(a, 128) ? -c : c) * d[(h > 0) + 0];\n if (e == 16 || !w(a, k[0])) return e;\n } else k = b[Nc[e]][0];\n if (e == 16) return 16;\n }\n }\n\n function ob(a, b) {\n return ((16777216 * a[0] + 65536 * a[1] + 256 * a[2] + 1 * a[3]) * Lf\n & 4278190080) >> b;\n }\n\n function Mf(a, b) {\n let c = 0;\n if (a == p) return 0;\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'NULL VP8Io parameter in VP8Decode().');\n if (!a.za && !Hd(a, b)) return 0;\n $(a.za);\n let d;\n if (b.Mb && !b.Mb(b)) Y(a, Nf, 'Frame setup failed'), d = a.a;\n else {\n b.Za && (a.A = 0);\n const e = uc[a.A];\n a.A == 2 ? (a.lb = 0, a.mb = 0) : (a.lb = b.t - e >> 4, a.mb = b.k - e >> 4, a.lb < 0 && (a.lb = 0), a.mb < 0 && (a.mb = 0));\n a.Ya = b.K + 15 + e >> 4;\n a.wb = b.Ka + 15 + e >> 4;\n a.wb > a.Ma && (a.wb = a.Ma);\n a.Ya > a.hb && (a.Ya = a.hb);\n d = L;\n }\n if (c = d == L) {\n if (c) {\n let g;\n b: {\n a.Ja = 0;\n if (a.qb) {\n const k = a.rc;\n if (!WebPWorkerReset(k)) {\n g = Y(a, cb, 'thread initialization failed.');\n break b;\n }\n k.Qd = a;\n k.Rd = a.oa.N;\n k.Ud = FinishRow;\n a.jb = a.A > 0 ? Od : Od - 1;\n } else a.jb = Of;\n g = 1;\n }\n let h;\n if (!(h = !g)) {\n let n;\n b: {\n const l = a.jb;\n const m = a.Ma;\n const t = 4 * m;\n const q = 32 * m;\n const r = m + 1;\n const u = a.A > 0 ? m * (a.qb ? 2 : 1) : 0;\n const v = Pf;\n const C = q * (16 * l + parseInt(3 * uc[a.A] / 2, 10));\n const A = a.Ga != p ? a.P.l * a.P.v : 0;\n const z = t + q + r + u + v + 384 + C + A + Pd;\n if (z != z) n = 0;\n else {\n if (z > a.Gb) {\n a.ib = 0;\n a.Gb = 0;\n if (a.ib == p) {\n n = Y(a, 'VP8_STATUS_OUT_OF_MEMORY', 'no memory during frame initialization.');\n break b;\n }\n a.Gb = z;\n }\n a.dc = 205;\n a.Xc = rc(205, 16 * m);\n a.Sc = rc(205, 8 * m);\n a.Vc = rc(205, 8 * m);\n a.M = u ? ic(Oc, u) : p;\n a.Sd = u ? 0 : p;\n a.oa.ha = 0;\n a.oa.M = a.M;\n $((v & Pd) == 0);\n a.Ea = rc(205, 1 * v);\n a.z = -12851;\n a.H = 16 * m;\n a.r = 8 * m;\n const Ha = uc[a.A];\n const G = Ha * a.H;\n const y = Ha / 2 * a.r;\n a.ca = U(C, 205);\n a.da = +G;\n a.aa = a.ca;\n a.ba = a.da + 16 * l * a.H + y;\n a.ra = a.aa;\n a.sa = a.ba + 8 * l * a.r + y;\n a.Xb = A ? U(A, x) : p;\n a.La = ic(Qd, r);\n a.dc = rc($b, t);\n n = 1;\n }\n }\n h = !n;\n }\n if (h) c = 0;\n else {\n b.width = a.P.l;\n b.height = a.P.v;\n b.w = 0;\n b.y = a.ca;\n b.D = a.da;\n b.c = a.aa;\n b.B = a.ba;\n b.S = a.ra;\n b.C = a.sa;\n b.F = a.H;\n b.Da = a.r;\n b.p = p;\n b.q = p;\n if (!Rd) {\n let B;\n for (B = -255; B <= 255; ++B) va[255 + B] = B < 0 ? -B : B, tc[255 + B] = va[255 + B] >> 1;\n for (B = -1020; B\n <= 1020; ++B) sc[1020 + B] = B < -128 ? -128 : B > 127 ? 127 : B;\n for (B = -112; B <= 112; ++B) oc[112 + B] = B < -16 ? -16 : B > 15 ? 15 : B;\n for (B = -255; B <= 510; ++B) oa[255 + B] = B < 0 ? 0 : B > 255 ? 255 : B;\n Rd = 1;\n }\n mc = pf;\n Pc = qf;\n Qc = nc;\n Rc = rf;\n Sd = uf;\n Td = vf;\n Ud = yf;\n Vd = zf;\n Wd = wf;\n Xd = xf;\n Yd = Af;\n Zd = Bf;\n $d = Dd;\n ae = Ed;\n be = sf;\n ce = tf;\n c = 1;\n }\n }\n if (c) {\n a: {\n for (a.d = 0; a.d < a.Ya; ++a.d) {\n const Qf = a.ic[a.d & a.Hb - 1];\n const db = a;\n const F = db.La[0];\n F.X = 0;\n F.ua = 0;\n jd(db.cc, 0, $b, db.cc.length);\n db.W = (db.A > 0 && db.d >= db.mb && db.d <= db.Ya) + 0;\n for (a.i = 0; a.i < a.Ma; a.i++) {\n var D;\n const H = a;\n const T = Qf;\n const ya = H.o;\n const S = H.La[0];\n const J = H.La[1 + H.i];\n H.Ca.ob && (H.Lb = !w(ya,\n H.R.Ta[0]) ? 0 + w(ya, H.R.Ta[1]) : 2 + w(ya, H.R.Ta[2]));\n J.Nb = H.pc ? w(ya, H.Pc) : 0;\n const O = H.dc;\n O[O.length - 1] = 0 + 4 * H.i;\n const Sc = H.cc;\n H.wa = !w(ya, 145);\n if (H.wa) {\n for (var ga = H.Eb, ja = 0, Z = ca, Z = 0; Z < 4; ++Z) {\n var V = Sc[Z];\n var R;\n for (R = 0; R < 4; ++R) {\n const ta = Rf[O[O[O.length - 1] + R]][V];\n var za = 0;\n do za = Sf[2 * za + w(ya, ta[za])]; while (za > 0);\n V = -za;\n O[O[O.length - 1] + R] = V;\n ga[ja] = V;\n ja++;\n }\n Sc[Z] = V;\n }\n } else {\n var V = w(ya, 156) ? w(ya, 128) ? de : ee : w(ya, 163) ? fe : ge;\n H.Eb[0] = V;\n for (za = 0; za < 4; ++za) O[za + O[O.length - 1]] = V;\n for (za = 0; za < 4; ++za) Sc[za] = V;\n }\n H.Tc = !w(ya, 142) ? ge : !w(ya, 114) ? fe\n : w(ya, 183) ? de : ee;\n if (ya.Ab) D = 0;\n else {\n if (J.Nb) S.X = J.X = 0, H.wa || (S.ua = J.ua = 0), H.ja = 0, H.Oa = 0;\n else {\n let ia = ca;\n let ka = ca;\n var sa = ca;\n var wa = Tf;\n const Aa = H.yb[H.Lb];\n var aa = H.z;\n const ma = H.La[0];\n const ua = U(4, 0);\n const xa = U(4, 0);\n let ea = U(4, 0);\n let pb = U(4, 0);\n let na = 0;\n let Ba = 0;\n var pa = ca;\n let qa = ca;\n let Sa = ca;\n var aa = rc(0, 384);\n if (H.wa) sa = 0, wa = H.R.z[3];\n else {\n const ab = U(16, 0);\n var Ca = J.ua + ma.ua;\n J.ua = ma.ua = (Mc(T, H.R.z[1], Ca, Aa.sb, 0, ab) > 0) + 0;\n for (var sa = 1, wa = H.R.z[0], qb = ab, Ta = aa, La = U(16, s), X = s, X = 0; X < 4; ++X) {\n var Da = qb[0 + X] + qb[12 + X];\n var Ea = qb[4 + X] + qb[8 + X];\n var Fa = qb[4 + X] - qb[8 + X];\n var Ga = qb[0 + X] - qb[12 + X];\n La[0 + X] = Da + Ea;\n La[8\n + X] = Da - Ea;\n La[4 + X] = Ga + Fa;\n La[12 + X] = Ga - Fa;\n }\n for (X = 0; X < 4; ++X) {\n const Oa = Ta[Ta.length - 1];\n const lb = La[0 + 4 * X] + 3;\n var Da = lb + La[3 + 4 * X];\n var Ea = La[1 + 4 * X] + La[2 + 4 * X];\n var Fa = La[1 + 4 * X] - La[2 + 4 * X];\n var Ga = lb - La[3 + 4 * X];\n Ta[Oa + 0] = Da + Ea >> 3;\n Ta[Oa + 16] = Ga + Fa >> 3;\n Ta[Oa + 32] = Da - Ea >> 3;\n Ta[Oa + 48] = Ga - Fa >> 3;\n Ta[Ta.length - 1] += 64;\n }\n aa[aa.length - 1] = 0;\n }\n ea = Nb(vc[J.X & 15]);\n pb = Nb(vc[ma.X & 15]);\n for (qa = 0; qa < 4; ++qa) {\n for (var Eb = pb[qa], pa = 0; pa < 4; ++pa) {\n var Ca = Eb + ea[pa];\n var Ka = Mc(T, wa, Ca, Aa.sc, sa, aa);\n ea[pa] = Eb = (Ka > 0) + 0;\n xa[pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0;\n ua[pa] = (Ka > 1) + 0;\n aa[aa.length\n - 1] += 16;\n }\n pb[qa] = Eb;\n Ba |= ob(xa, 24 - 4 * qa);\n na |= ob(ua, 24 - 4 * qa);\n }\n ia = ob(ea, 24);\n ka = ob(pb, 24);\n ea = Nb(vc[J.X >> 4]);\n pb = Nb(vc[ma.X >> 4]);\n for (Sa = 0; Sa < 4; Sa += 2) {\n for (qa = 0; qa < 2; ++qa) {\n Eb = pb[Sa + qa];\n for (pa = 0; pa < 2; ++pa) Ca = Eb + ea[Sa + pa], Ka = Mc(T, H.R.z[2], Ca, Aa.qc, 0, aa), ea[Sa + pa] = Eb = (Ka > 0) + 0, xa[2 * qa + pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0, ua[2 * qa + pa] = (Ka > 1) + 0, aa[aa.length - 1] += 16;\n pb[Sa + qa] = Eb;\n }\n Ba |= ob(xa, 8 - 2 * Sa);\n na |= ob(ua, 8 - 2 * Sa);\n }\n ia |= ob(ea, 20);\n ka |= ob(pb, 20);\n J.X = ia;\n ma.X = ka;\n H.z = aa;\n H.Oa = na + 0;\n H.ja = na | Ba;\n J.Nb = !H.ja + 0;\n }\n D = !T.Ab;\n }\n if (!D) {\n c = Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA',\n `Premature end-of-file encountered.${a.i} ${a.d}`);\n break a;\n }\n const P = a;\n const da = P.Ea;\n const Ma = Tc;\n const Ua = P.Ea;\n const Va = Uc;\n const Wa = P.Ea;\n const Xa = he;\n if (P.i > 0) {\n for (var ba = ca, ba = -1; ba < 16; ++ba) Ec(da, Ma + ba * f - 4, da, Ma + ba * f + 12);\n for (ba = -1; ba < 8; ++ba) Ec(Ua, Va + ba * f - 4, Ua, Va + ba * f + 4), Ec(Wa, Xa + ba * f - 4, Wa, Xa + ba * f + 4);\n } else {\n for (ba = 0; ba < 16; ++ba) da[Ma + ba * f - 1] = 129;\n for (ba = 0; ba < 8; ++ba) Ua[Va + ba * f - 1] = 129, Wa[Xa + ba * f - 1] = 129;\n P.d > 0 && (da[Ma - 1 - f] = Ua[Va - 1 - f] = Wa[Xa - 1 - f] = 129);\n }\n const Qa = P.Xc;\n const Ra = 16 * +P.i;\n const mb = P.Sc;\n const vb = 8 * +P.i;\n const wb = P.Vc;\n const xb = 8 * +P.i;\n const Za = P.z;\n let fa = ca;\n if (P.d > 0) {\n N(da, Ma - f, Qa, Ra,\n 16), N(Ua, Va - f, mb, vb, 8), N(Wa, Xa - f, wb, xb, 8);\n } else if (P.i == 0) {\n for (i = 0; i < 21; ++i) da[Ma - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Ua[Va - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Wa[Xa - f - 1 + i] = 127;\n }\n if (P.wa) {\n const Ya = Ma - f + 16;\n P.d > 0 && (P.i >= P.Ma - 1 ? da[Ya + 0] = da[Ya + 1] = da[Ya + 2] = da[Ya + 3] = Qa[Ra + 15] : N(da, Ya + 0, Qa, Ra + 16, 4));\n for (let Fb = 0; Fb < 4; ++Fb) da[Fb + Ya + 4 * f] = da[Fb + Ya + 4 * f] = da[Fb + Ya + 8 * f] = da[Fb + Ya + 12 * f] = da[Fb + Ya + 0];\n for (fa = 0; fa < 16; fa++) {\n var ac = da;\n var bc = Ma + ie[fa];\n Uf[P.Eb[fa]](ac, bc);\n P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n } else {\n var $a = Fd(P, P.Eb[0]);\n Vf[$a](da, Ma);\n if (P.ja) for (fa = 0; fa < 16; fa++) ac = da, bc = Ma + ie[fa], P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n $a = Fd(P, P.Tc);\n je[$a](Ua, Va);\n je[$a](Wa, Xa);\n if (P.ja & 983040) {\n const zb = P.z;\n var Pa = 256;\n P.Oa & 983040 ? Pc(zb, Pa, Ua, Va) : Rc(zb, Pa, Ua, Va);\n }\n if (P.ja & 15728640) {\n const Ab = P.z;\n var Pa = 320;\n P.Oa & 15728640 ? Pc(Ab, Pa, Wa, Xa) : Rc(Ab, Pa, Wa, Xa);\n }\n P.d < P.hb - 1 && (N(Qa, Ra, da, Ma + 15 * f, 16), N(mb, vb, Ua, Va + 7 * f, 8), N(wb, xb, Wa, Xa + 7 * f, 8));\n const Q = a;\n if (Q.A > 0) {\n const kb = Q.M[1 + Q.i];\n const Kb = Q.La[1 + Q.i].Nb;\n let ha = Q.Zb[Q.Lb];\n Q.ga.oc && (ha\n += Q.ga.Lc[0], Q.wa && (ha += Q.ga.Gc[0]));\n ha = ha < 0 ? 0 : ha > 63 ? 63 : ha;\n kb.zc = ha;\n Q.ga.kb > 0 && (ha = Q.ga.kb > 4 ? ha >> 2 : ha >> 1, ha > 9 - Q.ga.kb && (ha = 9 - Q.ga.kb));\n kb.yc = ha < 1 ? 1 : ha;\n kb.ab = (!Kb || Q.wa) + 0;\n }\n for (var Ia = ca, Bb = 8 * Q.Ja * Q.r, Qb = Q.ca, Ub = Q.da + 16 * Q.i + 16 * Q.Ja * Q.H, Wb = Q.aa, Xb = Q.ba + 8 * Q.i + Bb, Yb = Q.ra, Zb = Q.sa + 8 * Q.i + Bb, Ia = 0; Ia < 16; ++Ia) N(Qb, Ub + Ia * Q.H, Q.Ea, +Tc + Ia * f, 16);\n for (Ia = 0; Ia < 8; ++Ia) N(Wb, Xb + Ia * Q.r, Q.Ea, +Uc + Ia * f, 8), N(Yb, Zb + Ia * Q.r, Q.Ea, +he + Ia * f, 8);\n }\n const K = a;\n const I = b;\n var cc = 1;\n const eb = K.oa;\n if (K.qb) {\n const nb = K.rc;\n var cc = cc & WebPWorkerSync(nb);\n $(nb.a == OK);\n if (cc) {\n eb.N = I;\n eb.ha = K.Ja;\n eb.d = K.d;\n eb.W = K.W;\n if (eb.W) {\n const hc = eb.M;\n eb.M = K.M;\n K.M = hc;\n }\n WebPWorkerLaunch(nb);\n ++K.Ja == K.jb && (K.Ja = 0);\n }\n } else {\n eb.d = K.d;\n eb.W = K.W;\n b: {\n let Hb = 1;\n const rb = K.oa;\n const ib = uc[K.A];\n const yb = ib * K.H;\n const dc = parseInt(ib / 2) * K.r;\n const Ib = 16 * rb.ha * K.H;\n const jb = 8 * rb.ha * K.r;\n const Jb = K.ca;\n const Lb = K.da - yb + Ib;\n const Ob = K.aa;\n const Pb = K.ba - dc + jb;\n const Rb = K.ra;\n const Sb = K.sa - dc + jb;\n const jc = rb.d == 0;\n const Tb = (rb.d >= K.hb - 1) + 0;\n var ra = 16 * rb.d;\n let fb = 16 * (rb.d + 1);\n if (rb.W) {\n const pc = K;\n let wc = s;\n const kc = pc.oa.d;\n $(pc.oa.W);\n for (wc = pc.lb; wc < pc.wb; ++wc) {\n const Na = pc;\n const ec = wc;\n const Vb = kc;\n const xc = Na.oa;\n const gb = Na.H;\n const fc = xc.M[1 + ec];\n const sb = Na.ca;\n const tb = Na.da + 16 * xc.ha\n * gb + 16 * ec;\n const Gb = fc.zc;\n const hb = fc.yc;\n const Ja = 2 * Gb + hb;\n if (Gb != 0) {\n if (Na.A == 1) ec > 0 && ae(sb, tb, gb, Ja + 4), fc.ab && ce(sb, tb, gb, Ja), Vb > 0 && $d(sb, tb, gb, Ja + 4), fc.ab && be(sb, tb, gb, Ja);\n else {\n const gc = Na.r;\n const yc = Na.aa;\n const zc = Na.ba + 8 * xc.ha * gc + 8 * ec;\n const Ac = Na.ra;\n const Bc = Na.sa + 8 * xc.ha * gc + 8 * ec;\n const ub = Na.Ac.fb ? Gb >= 40 ? 2 : Gb >= 15 ? 1 : 0 : Gb >= 40 ? 3 : Gb >= 20 ? 2 : Gb >= 15 ? 1 : 0;\n ec > 0 && (Td(sb, tb, gb, Ja + 4, hb, ub), Vd(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Xd(sb, tb, gb, Ja, hb, ub), Zd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n Vb > 0 && (Sd(sb, tb, gb, Ja + 4, hb, ub), Ud(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Wd(sb, tb, gb,\n Ja, hb, ub), Yd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n }\n }\n }\n }\n if (I.put) {\n jc ? (I.y = K.ca, I.D = K.da + Ib, I.c = K.aa, I.B = K.ba + jb, I.S = K.ra, I.C = K.sa + jb) : (ra -= ib, I.y = Jb, I.D = Lb, I.c = Ob, I.B = Pb, I.S = Rb, I.C = Sb);\n Tb || (fb -= ib);\n fb > I.K && (fb = I.K);\n if (K.Ga != p && ra < fb && (ra == 0 ? (I.p = qd(K, ra, fb - ra), I.q = 0) : I.q = qd(K, ra, fb - ra), I.p == p)) {\n cc = Y(K, W, 'Could not decode alpha data.');\n break b;\n }\n if (ra < I.k) {\n const qc = I.k - ra;\n var ra = I.k;\n $(!(qc & 1));\n I.D += K.H * qc;\n I.B += K.r * (qc >> 1);\n I.C += K.r * (qc >> 1);\n I.p != p && (I.q += I.width * qc);\n }\n ra < fb && (I.D += I.t, I.B += I.t >> 1, I.C += I.t >> 1, I.p != p && (I.q += I.t),\n I.w = ra - I.k, I.m = I.Ka - I.t, I.h = fb - ra, Hb = I.put(I));\n }\n rb.ha + 1 == K.jb && !Tb && (N(K.ca, K.da - yb, Jb, Lb + 16 * K.H, yb), N(K.aa, K.ba - dc, Ob, Pb + 8 * K.r, dc), N(K.ra, K.sa - dc, Rb, Sb + 8 * K.r, dc));\n cc = Hb;\n }\n }\n if (!cc) {\n c = Y(a, 'VP8_STATUS_USER_ABORT', 'Output aborted.');\n break a;\n }\n }\n let Cb;\n if (!(Cb = a.qb && !WebPWorkerSync(a.rc))) {\n let Db;\n if (Db = a.fc > 0) $(a), $(a.fc > 0), Db = !1;\n Cb = Db;\n }\n c = Cb ? 0 : 1;\n }\n }\n const lc = c;\n b.Pb && b.Pb(b);\n c = lc & 1;\n }\n if (!c) return ke(a), 0;\n a.za = 0;\n return c;\n }\n\n function ke(a) {\n a != p && (a.ib && (a.ib = 0), a.ib = p, a.Gb = 0, a.za = 0);\n }\n\n function Aa(a, b) {\n return a + (1 << b) - 1 >> b;\n }\n\n function hc(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J];\n d[e + 1] = ia[a + g - J];\n d[e + 2] = ia[a + b - J];\n }\n\n function le(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J] & 248 | ia[a + g - J] >> 5;\n d[e + 1] = ia[a + g - J] << 3 & 224 | ia[a + b - J] >> 3;\n }\n\n function me(a, b, c, d, e) {\n d[e + 0] = 255;\n hc(a, b, c, d, e + 1);\n }\n\n function ne(a, b, c, d, e) {\n const g = xb[b];\n d[e + 0] = Hb[a + Za[c] - J] << 4 | Hb[a + (vb[c] + wb[b] >> ea) - J];\n d[e + 1] = 15 | Hb[a + g - J] << 4;\n }\n\n function Vc(a, b, c, d, e) {\n const g = Za[c];\n c = vb[c] + wb[b] >> ea;\n d[e + 0] = ia[a + xb[b] - J];\n d[e + 1] = ia[a + c - J];\n d[e + 2] = ia[a + g - J];\n }\n\n function oe(a, b, c, d, e) {\n Vc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function pe(a, b, c, d, e) {\n hc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function ib(a, b, c) {\n a[b] = ((((a[b] & 4278255360) >>> 0) + ((c & 4278255360) >>> 0) & 4278255360) >>> 0 | (a[b] & 16711935) + (c & 16711935) & 16711935) >>> 0;\n }\n\n function ka(a, b) {\n return (((a ^ b) & 4278124286) >>> 1) + ((a & b) >>> 0) >>> 0;\n }\n\n function $a(a) {\n return a < 256 && a > 0 ? a : a <= 0 ? 0 : ~a >> 24 & 255;\n }\n\n function yb(a, b) {\n return $a(a + parseInt((a - b) / 2, 10));\n }\n\n function Wc() {\n return qe;\n }\n\n function Xc(a, b) {\n a &= 255;\n b &= 255;\n a > 127 && (a -= 256);\n b > 127 && (b -= 256);\n return a * b >>> 5;\n }\n\n function re(a,\n b, c, d, e, g, k) {\n var h = s;\n const n = 8 >> a.n;\n const l = a.U;\n const f = a.u;\n if (n < 8) {\n a = (1 << a.n) - 1;\n for (var t = (1 << n) - 1, h = b; h < c; ++h) {\n b = 0;\n for (var q = s, q = 0; q < l; ++q) (q & a) == 0 && (b = d[e++] >> 8 & 255), g[k++] = f[b & t], b >>= n;\n }\n } else for (h = b; h < c; ++h) for (q = 0; q < l; ++q) g[k++] = f[d[e++] >> 8 & 255];\n }\n\n function se(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n d[e++] = g >> 24 & 255;\n }\n }\n\n function te(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 240 | g >> 12 & 15;\n d[e++] = g >> 0 & 240 | g >> 28 & 15;\n }\n }\n\n function Ib(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 24 & 255;\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n }\n }\n\n function ue(a, b, c, d) {\n if (T(a, 8) != ve) return 0;\n b[0] = T(a, we) + 1;\n c[0] = T(a, we) + 1;\n d[0] = T(a, 1);\n T(a, Wf);\n return 1;\n }\n\n function xe(a, b) {\n let c = s;\n if (a < 4) return a + 1;\n c = a - 2 >> 1;\n return (2 + (a & 1) << c) + T(b, c) + 1;\n }\n\n function Oa(a, b) {\n if (b.Q + 8 > b.ya) {\n var c = a.Y;\n var d = 0;\n for ($(c != p); c[d].s != 0;) {\n var e = c;\n var g = b;\n const k = g.T >> g.g & 1;\n g.L ? g.fa = 1 : (++g.g, g.g >= 8 && Sb(g), g.Q == g.ya && g.g == 32 && (g.L = 1));\n d = d + e[d].s + k;\n }\n return c[d].kc;\n }\n c = a.Y;\n d = 0;\n for ($(c != p); c[d].s != 0;) {\n e = c, g = b.T >> b.g & 1, ++b.g, d = d\n + e[d].s + g;\n }\n return c[d].kc;\n }\n\n function zb(a, b) {\n if (a != p) for (var c = s, d = s, c = 0; c < b; ++c) for (var e = a[c].va, d = 0; d < Yc; ++d) ja(e[d]);\n }\n\n function ye(a, b, c) {\n b = a.eb == 0 ? 0 : a.ac[a.bd + a.Ec * (c >> a.eb) + (b >> a.eb)];\n $(b < a.hc);\n return a.Db[+b];\n }\n\n function ze(a, b, c, d) {\n let e = a.Na;\n const g = a.O;\n const k = g + b;\n var h = c;\n var f = d;\n d = a.Xa;\n c = a.vb;\n for (N(d, c, h, f, a.l * b); e-- > 0;) {\n b = a.nc[e];\n let l = g;\n var m = k;\n var t = h;\n var q = f;\n var f = d;\n var h = c;\n $(l < m);\n $(m <= b.Vb);\n switch (b.Qc) {\n case Ae:\n t = 0;\n for (b = h + (m - l) * b.U; h < b;) {\n var m = f;\n var q = h;\n var r = m[q] >> 8 & 255;\n var u = (m[q] & 16711935) >>> 0;\n var u = u + (r << 16 | r);\n var u = u & 16711935;\n f[h++] = ((m[q] & 4278255360)\n >>> 0 | u) >>> 0;\n l == 32 && t++;\n }\n break;\n case Be:\n var v = b;\n var C = l;\n var t = m;\n var q = f;\n var r = h;\n var u = v.U;\n if (C == 0) {\n var A = s;\n ib(q, r, qe);\n for (A = 1; A < u; ++A) ib(q, r + A, q[r + A - 1]);\n r += u;\n ++C;\n }\n for (var z = (1 << v.n) - 1, Ha = Aa(u, v.n), w = v.u, v = +(C >> v.n) * Ha; C < t;) {\n var y = w;\n var B = v;\n let G = p;\n ib(q, r, q[r - u + 0]);\n G = Ce[y[B++] >> 8 & 15];\n for (A = 1; A < u; ++A) {\n let F = E;\n (A & z) == 0 && (G = Ce[y[B++] >> 8 & 15]);\n F = G(q[r + A - 1], q, r + A - u);\n ib(q, r + A, F);\n }\n r += u;\n ++C;\n (C & z) == 0 && (v += Ha);\n }\n m != b.Vb && (b = b.U, N(f, h - b, f, h + (m - l - 1) * b, b));\n break;\n case De:\n t = b.U;\n q = (1 << b.n) - 1;\n r = Aa(t, b.n);\n u = b.u;\n for (b = +(l >> b.n) * r; l < m;) {\n A = u;\n C = b;\n z = M(Xf);\n Ha = s;\n for (Ha = 0; Ha < t; ++Ha) (Ha & q) == 0 && (w = A[C++], v = z, v.Cc = w >> 0 & 255, v.Bc = w >> 8 & 255, v.Kc = w >> 16 & 255), w = f[h + Ha], v = w >>> 8, y = w >>> 16, B = w, y += Xc(z.Cc, v), y &= 255, B += Xc(z.Bc, v), B += Xc(z.Kc, y), B &= 255, f[h + Ha] = (w & 4278255360 | y << 16 | B) >>> 0;\n h += t;\n ++l;\n (l & q) == 0 && (b += r);\n }\n break;\n case Ee:\n t == f && b.n > 0 ? (t = (m - l) * Aa(b.U, b.n), q = h + (m - l) * b.U - t, memmove(f, q, f, h, t), re(b, l, m, f, q, f, h)) : re(b, l, m, t, q, f, h);\n }\n h = d;\n f = c;\n }\n }\n\n function Yf(a, b) {\n var c = a.V;\n var d = a.Ha + a.l * a.O;\n var e = b - a.O;\n if (!(e <= 0)) {\n ze(a, e, c, d);\n var g = a.N;\n var c = a.Xa;\n let k = [a.vb];\n var d = a.O;\n var e = b;\n var h = k;\n var f = g.width;\n $(d < e);\n $(g.t < g.Ka);\n e > g.K && (e = g.K);\n if (d < g.k) {\n var l = g.k - d;\n var d = g.k;\n h[0] += f * l;\n }\n d >= e ? d = 0 : (h[0] += g.t, g.w = d - g.k, g.m = g.Ka - g.t, g.h = e - d, d = 1);\n if (d) {\n k = k[0];\n d = a.Ib;\n e = g.width;\n if (d.J < ua) {\n var m = d.c.RGBA;\n var h = m.ma;\n let t = m.Sa + a.xa * m.f;\n if (g.I) c = EmitRescaledRows(a, c, k, e, g.h, h, t, m.f);\n else {\n for (var f = d.J, l = g.m, g = g.h, m = m.f, q = g; q-- > 0;) {\n const r = c;\n let u = k;\n let v = l;\n const C = h;\n let A = t;\n switch (f) {\n case Qa:\n for (v = u + v; u < v;) {\n var z = r[u++];\n C[A++] = z >> 16 & 255;\n C[A++] = z >> 8 & 255;\n C[A++] = z >> 0 & 255;\n }\n break;\n case jb:\n se(r, u, v, C, A);\n break;\n case Ob:\n se(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v,\n 1, 0);\n break;\n case Zc:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 0 & 255, C[A++] = z >> 8 & 255, C[A++] = z >> 16 & 255;\n break;\n case Pa:\n Ib(r, u, v, C, A);\n break;\n case Pb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v, 1, 0);\n break;\n case Ab:\n Ib(r, u, v, C, A);\n break;\n case Bb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 1, v, 1, 0);\n break;\n case kb:\n te(r, u, v, C, A);\n break;\n case Qb:\n te(r, u, v, C, A);\n WebPApplyAlphaMultiply4444(C, v, 1, 0);\n break;\n case Fe:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 16 & 248 | z >> 13 & 7, C[A++] = z >> 5 & 224 | z >> 3 & 31;\n break;\n default:\n $(0);\n }\n k += e;\n t += m;\n }\n c = g;\n }\n a.xa += c;\n } else {\n a.xa = g.I ? EmitRescaledRowsYUVA(a, c, k, e, g.h) : EmitRowsYUVA(a, c, k, e, g.m, g.h);\n }\n $(a.xa <= d.height);\n }\n a.O = b;\n $(a.O <= a.v);\n }\n }\n\n function lc(a, b, c, d, e, g) {\n let k = 1;\n let h = 0;\n let f = 0;\n const l = a.o;\n const m = a.cb;\n let t = m.Db;\n let q = c;\n let r = c;\n c += d * e;\n e = Ba + Ge;\n const u = e + m.xb;\n const v = m.xb > 0 ? m.Yb : p;\n const C = m.Dc;\n let A = !1;\n $(t != p);\n for (; !l.L && q < c;) {\n let z = s;\n A || ((h & C) == 0 && (t = ye(m, h, f)), Da(l), z = Oa(t.va[Zf], l));\n if (z < Ba || A) {\n if (!A) {\n var w = k = A = s;\n var y = s;\n Da(l);\n A = Oa(t.va[$f], l);\n k = z;\n Da(l);\n w = Oa(t.va[ag], l);\n Da(l);\n y = Oa(t.va[bg], l);\n b[q] = (y << 24 >>> 0) + (A << 16) + (k << 8) + w;\n }\n A = !1;\n ++q;\n ++h;\n if (h >= d && (h = 0, ++f, g != p && f\n % $c == 0 && g(a, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < e) {\n w = w = s;\n k = xe(z - Ba, l);\n z = Oa(t.va[cg], l);\n Da(l);\n w = xe(z, l);\n w > He ? w -= He : (z = dg[w - 1], z = (z >> 4) * d + (8 - (z & 15)), w = z >= 1 ? z : 1);\n z = s;\n for (z = 0; z < k; ++z) b[q + z] = b[q + z - w];\n q += k;\n for (h += k; h >= d;) h -= d, ++f, g != p && f % $c == 0 && g(a, f);\n if (q < c && (t = ye(m, h, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < u) {\n A = z - e;\n for ($(v != p); r < q;) z = b[r++], v.ea[ad * z >>> v.bb] = z;\n z = b;\n w = q;\n y = v;\n $(A <= -1 >>> y.bb);\n z[w] = y.ea[A];\n A = !0;\n continue;\n }(k = !l.fa) || End;\n }\n g != p && g(a, f);\n l.fa || !k || l.L && q < c ? (k = 0, a.a = !l.L ? W : Ie) : q == c && (a.Ob = Db);\n return k;\n }\n\n function bd(a) {\n $(a);\n a.ac = p;\n zb(a.Db, a.hc);\n const b = a.Yb;\n b != p && (b.ea = p, b.ea = p);\n $(a);\n }\n\n function sd() {\n const a = M(eg);\n if (a == p) return p;\n a.a = L;\n a.Wa = cd;\n a.Ob = cd;\n return a;\n }\n\n function sa(a) {\n let b = s;\n if (a != p) {\n bd(a.cb);\n a.V = p;\n a.V = p;\n for (b = 0; b < a.Na; ++b) {\n const c = a.nc[b];\n c.u = p;\n c.u = p;\n }\n a.Na = 0;\n a.Ub = 0;\n a.Mc = p;\n a.Mc = p;\n a.Ib = p;\n }\n }\n\n function Ka(a, b, c, d, e) {\n var g = 1;\n a = [a];\n b = [b];\n for (var k = d.o, h = d.cb, f = p, l = p, l = 0; ;) {\n if (c) {\n for (; g && T(k, 1);) {\n var m = a;\n var t = b;\n var q = d;\n var r = 1;\n var u = q.o;\n var g = q.nc[q.Na];\n var v = T(u, 2);\n if (q.Ub & 1 << v) g = 0;\n else {\n q.Ub\n |= 1 << v;\n g.Qc = v;\n g.U = m[0];\n g.Vb = t[0];\n g.u = [p];\n g.b = 0;\n ++q.Na;\n $(q.Na <= Je);\n switch (v) {\n case Be:\n case De:\n g.n = T(u, 3) + 2;\n r = Ka(Aa(g.U, g.n), Aa(g.Vb, g.n), 0, q, g.u);\n break;\n case Ee:\n t = T(u, 8) + 1;\n r = t > 16 ? 0 : t > 4 ? 1 : t > 2 ? 2 : 3;\n m[0] = Aa(g.U, r);\n g.n = r;\n if (m = r = Ka(t, 1, 0, q, g.u)) {\n if (m = t, q = g, r = s, t = 1 << (8 >>> q.n) >>> 0, u = Array(t), u == p) m = 0;\n else {\n var v = q.u[0];\n var C = q.b;\n u[0] = q.u[0][q.b + 0];\n for (r = 1; r < m; ++r) u[r] = ((((v[C + r] & 4278255360) >>> 0) + ((u[r - 1] & 4278255360) >>> 0) & 4278255360) >>> 0 | (v[C + r] & 16711935) + (u[r - 1] & 16711935) & 16711935) >>> 0;\n for (; r < t; ++r) u[r] = 0;\n q.u[0] = p;\n q.b = p;\n q.u[0] = u;\n q.b = 0;\n m = 1;\n }\n }\n r = m;\n break;\n case Ae:\n break;\n default:\n $(0);\n }\n g.u = g.u[0];\n g = r;\n }\n }\n }\n if (g && T(k, 1) && (l = T(k, 4), g = l >= 1 && l <= fg, !g)) {\n d.a = W;\n break;\n }\n if (g) {\n a: {\n var g = d;\n var A = a[0];\n var z = b[0];\n var m = l;\n var C = v = s;\n var C = g.o;\n var q = g.cb;\n var r = [p];\n var t = p;\n var u = 1;\n if (c && T(C, 1)) {\n var v = T(C, 3) + 2;\n var A = Aa(A, v);\n var w = Aa(z, v);\n var z = A * w;\n if (!Ka(A, w, 0, g, r)) {\n g.a = W;\n zb(t, u);\n g = 0;\n break a;\n }\n r = r[0];\n q.eb = v;\n for (v = 0; v < z; ++v) A = r[v] >>> 8 & 65535, r[v] = A, A >= u && (u = A + 1);\n }\n if (C.fa) zb(t, u), g = 0;\n else if ($(u <= 65536), t = ld(u, gg), t == p) g.a = cb, zb(t, u), g = 0;\n else {\n for (v = 0; v < u; ++v) {\n z = t[v].va;\n for (C = 0; C < Yc; ++C) {\n A = hg[C];\n C == 0 && m > 0 && (A += 1 << m);\n b: {\n const y = A;\n var A = g;\n const G = z[+C];\n var B = 0;\n var w = A.o;\n if (T(w, 1)) {\n var F = Array(2);\n var D = Array(2);\n var L = Array(2);\n var B = T(w, 1) + 1;\n var J = T(w, 1);\n F[0] = T(w, J == 0 ? 1 : 8);\n D[0] = 0;\n L[0] = B - 1;\n B == 2 && (F[1] = T(w, 8), D[1] = 1, L[1] = B - 1);\n c: {\n var J = 0;\n var H = s;\n $(G != p);\n $(L != p);\n $(D != p);\n $(F != p);\n if (nd(G, B)) {\n for (H = 0; H < B; ++H) {\n if (D[H] != pd) {\n if (F[H] < 0 || F[H] >= y) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n if (!jc(G, F[H], D[H], L[H])) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n }\n }(J = (J = 1) && ma(G)) || ja(G);\n B = J;\n } else B = 0;\n }\n } else {\n B = s;\n D = [];\n F = T(w, 4) + 4;\n if (F > Ke) {\n A.a = W;\n A = 0;\n break b;\n }\n L = Array(y);\n if (L == p) {\n A.a = cb;\n A = 0;\n break b;\n }\n for (B = 0; B < F; ++B) D[ig[B]] = T(w, 3);\n c: {\n var B = A;\n var O = D;\n var D = y;\n var F = L;\n var J = 0;\n var H = B.o;\n let S = s;\n let V = s;\n let Y = jg;\n const Z = M(Le);\n if (od(Z, O, Ke)) {\n if (T(H, 1)) {\n if (S = 2 + 2 * T(H, 3), V = 2 + T(H, S), V > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n } else V = D;\n for (S = 0; S < D;) {\n var R = s;\n if (V-- == 0) break;\n Da(H);\n R = Oa(Z, H);\n if (R < Me) F[S++] = R, R != 0 && (Y = R);\n else {\n var O = R == kg;\n var R = R - Me;\n const ea = lg[R];\n var R = T(H, mg[R]) + ea;\n if (S + R > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n for (O = O ? Y : 0; R-- > 0;) F[S++] = O;\n }\n }\n J = 1;\n ja(Z);\n B = J;\n } else B.a = W, B = 0;\n }\n B && (B = od(G, L, y));\n }(B = B && !w.fa) ? A = 1 : (A.a = W, A = 0);\n }\n if (!A) {\n zb(t, u);\n g = 0;\n break a;\n }\n }\n }\n q.ac = r;\n q.hc = u;\n q.Db = t;\n g = 1;\n }\n }\n }\n if (!g) {\n d.a = W;\n break;\n }\n if (l > 0) {\n if (h.xb = 1 << l, m = h.Yb, q = 1 << l, $(m != p), $(l > 0), m.ea = U(q, 0), m.ea == p ? l = 0 : (m.bb = 32 - l, l = 1), !l) {\n d.a = cb;\n g = 0;\n break;\n }\n } else h.xb = 0;\n l = d;\n m = a[0];\n q = b[0];\n r = l.cb;\n t = r.eb;\n l.l = m;\n l.v = q;\n r.Ec = Aa(m, t);\n r.Dc = t == 0 ? -1 : (1 << t) - 1;\n if (c) {\n d.Ob = Cb;\n break;\n }\n f = Array(a * b);\n l = 0;\n if (f == p) {\n d.a = cb;\n g = 0;\n break;\n }\n g = (g = lc(d, f, l, a, b, p)) && !k.fa;\n break;\n }\n g ? (e != p ? e[0] = f : ($(f == p), $(c)), c || bd(h)) : (bd(h), d.a == W && d.o.L && (d.a = Ie));\n return g;\n }\n\n function xd(a, b) {\n const c = a.l * a.v;\n const d = c + b + b * $c;\n $(a.l <= b);\n a.V = Array(d);\n a.Ha = 0;\n if (a.V == p) {\n return a.Xa = p, a.a = cb, 0;\n }\n a.Xa = a.V;\n a.vb = a.Ha + c + b;\n return 1;\n }\n\n function mf(a, b) {\n var c = b - a.O;\n var d = a.V;\n var e = a.Ha + a.l * a.O;\n if (!(c <= 0)) {\n ze(a, c, d, e);\n for (var e = a.N.width, c = e * c, d = a.N.ka, e = a.N.fd + e * a.O, g = a.Xa, k = a.vb, h = s, h = 0; h < c; ++h) d[e + h] = g[k + h] >>> 8 & 255;\n a.O = a.xa = b;\n }\n }\n\n function ng(a, b) {\n const c = [s];\n const d = [s];\n const e = [s];\n if (a == p) return 0;\n if (b == p) return a.a = ta, 0;\n a.N = b;\n a.a = L;\n Rb(a.o, b.data, b.b, b.e);\n if (!ue(a.o, c, d, e)) return a.a = W, sa(a), $(a.a != L), 0;\n a.Ob = cd;\n b.width = c[0];\n b.height = d[0];\n a.Wa = Cb;\n return !Ka(c[0], d[0], 1, a, p) ? (sa(a), $(a.a != L), 0) : 1;\n }\n\n function og(a) {\n let b = p;\n let c = p;\n if (a == p) return 0;\n b = a.N;\n $(b != p);\n c = b.ka;\n $(c != p);\n a.Ib = c.j;\n a.Hc = c.Hc;\n $(a.Ib != p);\n if (!Ne(c.Qa, b, Pa)) return a.a = ta, sa(a), $(a.a != L), 0;\n if (!xd(a, b.width) || b.I && !AllocateAndInitRescaler(a, b)) return sa(a), $(a.a != L), 0;\n a.Wa = Db;\n if (!lc(a, a.V, a.Ha, a.l, a.v, Yf)) return sa(a), $(a.a != L), 0;\n c.ec = a.xa;\n sa(a);\n return 1;\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, C, w, z) {\n let y; const G = C - 1 >> 1;\n let F = e[g + 0] | k[h + 0] << 16;\n let B = f[l + 0] | m[t + 0] << 16;\n if (a) {\n var D = 3 * F + B + 131074 >> 2;\n w(a[b + 0], D & 255, D >> 16, q, r);\n }\n c && (D = 3 * B + F + 131074 >> 2, w(c[d + 0], D & 255, D >> 16, u, v));\n for (y = 1; y <= G; ++y) {\n const J = e[g + y] | k[h + y] << 16;\n const L = f[l + y] | m[t + y] << 16;\n var D = F + J + B + L + 524296;\n const O = D + 2 * (J + B) >> 3;\n const H = D + 2 * (F + L) >> 3;\n a && (D = O + F >> 1, F = H + J >> 1, w(a[b + 2 * y - 1], D & 255, D >> 16, q, r + (2 * y - 1) * z), w(a[b + 2 * y - 0], F & 255, F >> 16, q, r + (2 * y - 0) * z));\n c && (D = H + B >> 1, F = O + L >> 1, w(c[d + 2 * y - 1], D & 255, D >> 16, u, v + (2 * y - 1) * z), w(c[d + 2 * y + 0], F & 255, F >> 16, u, v + (2 * y + 0) * z));\n F = J;\n B = L;\n }\n C & 1 || (a && (D = 3 * F + B + 131074 >> 2, w(a[b + C - 1], D & 255, D >> 16, q, r + (C - 1) * z)), c && (D = 3 * B + F + 131074 >> 2, w(c[d + C - 1], D & 255, D >> 16, u, v + (C - 1) * z)));\n }\n\n function pg(a,\n b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, hc, 3);\n }\n\n function qg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, Vc, 3);\n }\n\n function Oe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, pe, 4);\n }\n\n function Pe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, oe, 4);\n }\n\n function Qe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, me, 4);\n }\n\n function Re(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h,\n f, l, m, t, q, r, u, v, w, ne, 2);\n }\n\n function rg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, le, 2);\n }\n\n function Ca(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u) {\n let v;\n for (v = 0; v < q - 1; v += 2) r(a[b + 0], e[g + 0], k[h + 0], f, l), r(a[b + 1], e[g + 0], k[h + 0], f, l + u), r(c[d + 0], e[g + 0], k[h + 0], m, t), r(c[d + 1], e[g + 0], k[h + 0], m, t + u), b += 2, d += 2, g++, h++, l += 2 * u, t += 2 * u;\n v == q - 1 && (r(a[b + 0], e[g + 0], k[h + 0], f, l), r(c[d + 0], e[g + 0], k[h + 0], m, t));\n }\n\n function Se(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, pe, 4);\n }\n\n function Te(a, b, c, d, e, g, k, f, n, l,\n m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, oe, 4);\n }\n\n function Ue(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, me, 4);\n }\n\n function Ve(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, ne, 2);\n }\n\n function sg(a, b, c, d, e, g) {\n for (; e-- > 0;) {\n for (var k = a, f = b + (c ? 1 : 0), n = a, l = b + (c ? 0 : 3), m = s, m = 0; m < d; ++m) {\n var t = n[l + 4 * m];\n if (t != 255) {\n var t = 32897 * t;\n let q = k;\n let r = f + 4 * m + 0;\n k[f + 4 * m + 0] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 1;\n k[f + 4 * m + 1] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 2;\n k[f + 4 * m + 2] * t >>> 23;\n q[r] = ca;\n }\n }\n b += g;\n }\n }\n\n function tg(a, b) {\n const c = b.j.c.Va;\n const d = c.y;\n const e = c.D + a.w * c.F;\n const g = c.c;\n const k = c.B + (a.w >> 1) * c.nb;\n const f = c.S;\n const n = c.C + (a.w >> 1) * c.rb;\n const l = a.m;\n const m = a.h;\n const t = parseInt((l + 1) / 2, 10);\n const q = parseInt((m + 1) / 2, 10);\n let r;\n for (r = 0; r < m; ++r) N(d, e + r * c.F, a.y, a.D + r * a.F, l);\n for (r = 0; r < q; ++r) N(g, k + r * c.nb, a.c, a.B + r * a.Da, t), N(f, n + r * c.rb, a.S, a.C + r * a.Da, t);\n return a.h;\n }\n\n function ug(a, b) {\n var c = b.j;\n const d = c.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = a.y;\n let f = a.D;\n const n = a.c;\n let l = a.B;\n const m = a.S;\n let t = a.C;\n var c = vg[c.J];\n const q = a.m;\n const r = a.h - 1;\n let u;\n for (u = 0; u < r; u += 2) c(k, f, k, f + a.F, n, l, m, t, e, g, e, g + d.f, q), f += 2 * a.F, l += a.Da, t += a.Da, g += 2 * d.f;\n u == r && c(k, f, k, f, n, l, m, t, e, g, e, g, q);\n return a.h;\n }\n\n function wg(a, b) {\n let c = a.h;\n const d = b.j.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = V[b.j.J];\n const f = a.y;\n let n = a.D;\n const l = a.c;\n let m = a.B;\n const t = a.S;\n let q = a.C;\n let r = b.Qb;\n let u = b.Rb;\n let v = b.lc;\n let w = b.mc;\n let A = a.w;\n const z = a.w + a.h;\n const y = a.m;\n const D = parseInt((y + 1) / 2, 10);\n A == 0 ? k(p, p, f, n, l, m, t, q, l, m, t, q, p, p, e, g, y) : (k(b.Sb, b.Tb, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y), ++c);\n for (; A + 2 < z; A += 2) r = l, u = m, v = t, w = q, m += a.Da, q += a.Da, g += 2 * d.f, n += 2 * a.F, k(f, n - a.F, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y);\n n += a.F;\n a.k + z < a.K ? (N(b.Sb, b.Tb, f, n, 1 * y), N(b.Qb, b.Rb, l, m, 1 * D), N(b.lc, b.mc, t, q, 1 * D), c--) : z & 1 || k(f, n, p, p, l, m, t, q, l, m,\n t, q, e, g + d.f, p, p, y);\n return c;\n }\n\n function xg(a, b) {\n var c = a.p;\n var d = a.q;\n const e = b.j.c.Va;\n const g = a.m;\n const f = a.h;\n const h = e.p;\n let n = e.q + a.w * e.Fa;\n var c = a.p;\n var d = a.q;\n let l = s;\n if (c != p) for (l = 0; l < f; ++l) N(h, n, c, d, 1 * g), d += a.width, n += e.Fa;\n else if (e.p != p) for (l = 0; l < f; ++l) jd(h, n, 255, g), n += e.Fa;\n return 0;\n }\n\n function We(a, b, c) {\n let d = a.w;\n c[0] = a.h;\n a.Bb && (d == 0 ? --c[0] : (--d, b[0] -= a.width), a.k + a.w + a.h == a.K && (c[0] = a.K - a.k - d));\n return d;\n }\n\n function yg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n for (var e = a.m, g = b.j.J, f = g == Ab || g == Bb, h = b.j.c.RGBA, n = [s], l = We(a, d, n), d = d[0], m = h.ma, l = h.Sa + l * h.f,\n t = l + (f ? 0 : 3), q = 255, r = s, u = s, u = 0; u < n[0]; ++u) {\n for (r = 0; r < e; ++r) {\n const v = c[d + r];\n m[t + 4 * r] = v;\n q &= v;\n }\n d += a.width;\n t += h.f;\n }\n q != 255 && F(g) && WebPApplyAlphaMultiply(m, l, f, e, n, h.f);\n }\n return 0;\n }\n\n function zg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n const e = a.m;\n const g = b.j.J;\n const f = b.j.c.RGBA;\n const h = [s];\n var n = We(a, d, h);\n var d = d[0];\n const l = f.ma;\n var n = f.Sa + n * f.f;\n let m = n + 1;\n let t = 15;\n let q = s;\n for (j = 0; j < h[0]; ++j) {\n for (q = 0; q < e; ++q) {\n const r = c[d + q] >> 4;\n l[m + 2 * q] = l[m + 2 * q] & 240 | r;\n t &= r;\n }\n d += a.width;\n m += f.f;\n }\n t != 15 && F(g) && WebPApplyAlphaMultiply4444(l, n, e, h, f.f);\n }\n return 0;\n }\n\n function vd(a) {\n let b = a.ka;\n const c = b.j.J;\n const d = c\n < ua;\n const e = c == jb || c == Pa || c == Ab || c == kb || c == Ra || F(c);\n b.memory = p;\n b.$a = p;\n b.zb = p;\n b.ad = p;\n if (!Ne(b.Qa, a, e ? ua : Ra)) return 0;\n if (a.I) {\n if (!(d ? InitRGBRescaler(a, b) : InitYUVRescaler(a, b))) return alert('memory error #1'), 0;\n } else {\n if (d) {\n if (b.$a = ug, a.Bb) {\n const g = a.m + 1 >> 1;\n const f = a.m + 2 * g;\n let h; const\n n = [];\n for (h = 0; h < f; ++h) n.push(205);\n n.push(0);\n b.memory = n;\n if (b.memory == p) return alert('memory error #2'), 0;\n b.Sb = b.memory;\n b.Tb = 0;\n b.Qb = b.Sb;\n b.Rb = b.Tb + a.m;\n b.lc = b.Qb;\n b.mc = b.Rb + g;\n b.$a = wg;\n V[Qa] = pg;\n V[jb] = Oe;\n V[Zc] = qg;\n V[Pa] = Pe;\n V[Ab] = Qe;\n V[kb] = Re;\n V[Fe] = rg;\n }\n } else {\n b.$a = tg;\n }\n e && (F(c) && (WebPApplyAlphaMultiply = sg, V[Ob] = Oe, V[Pb] = Pe, V[Bb] = Qe, V[Qb] = Re), b.zb = c == kb || c == Qb ? zg : d ? yg : xg);\n }\n if (d && !Xe) {\n for (a = 0; a < 256; ++a) Za[a] = 89858 * (a - 128) + Jb >> ea, wb[a] = -22014 * (a - 128) + Jb, vb[a] = -45773 * (a - 128), xb[a] = 113618 * (a - 128) + Jb >> ea;\n for (a = J; a < dd; ++a) b = 76283 * (a - 16) + Jb >> ea, ia[a - J] = wa(b, 255), Hb[a - J] = wa(b + 8 >> 4, 15);\n Xe = 1;\n }\n return 1;\n }\n\n function ud(a) {\n const b = a.ka;\n let c = a.m;\n const d = a.h;\n $(!(a.w & 1));\n if (c <= 0 || d <= 0) return 0;\n c = b.$a(a, b);\n b.ec += c;\n b.zb && b.zb(a, b);\n return 1;\n }\n\n function wd(a) {\n a = a.ka;\n a.memory = '';\n a.memory = p;\n }\n\n function ed(a,\n b) {\n return a[b + 0] | a[b + 1] << 8 | a[b + 2] << 16;\n }\n\n function Kb(a, b) {\n return (ed(a, b) | a[b + 3] << 24) >>> 0;\n }\n\n function Ye(a, b, c, d, e, g, f) {\n var h = 0;\n var n = [0];\n var l = 'VP8StatusCode';\n const m = M(Gc);\n if (a == p || c[0] < Lb) return Z;\n m.data = a;\n m.b = [b[0]];\n m.e = [c[0]];\n m.na = [m.na];\n a: {\n h = m.na;\n $(a != p);\n $(c != p);\n $(h != p);\n h[0] = 0;\n if (c[0] >= Lb && !kd(a, b[0], 'RIFF', O)) {\n if (kd(a, b[0] + 8, 'WEBP', O)) {\n l = W;\n break a;\n }\n var t = Kb(a, b[0] + O);\n if (t < O + R) {\n l = W;\n break a;\n }\n h[0] = t;\n b[0] += Lb;\n c[0] -= Lb;\n } else h[0] = 0;\n l = L;\n }\n m.na = m.na[0];\n if (l != L) return l;\n h = m.na > 0;\n t = [0];\n a: if (l = R + fd, $(a != p), $(c != p), $(n != p), n[0] = 0, c[0] < R) l = Z;\n else {\n if (!kd(a, b[0], 'VP8X', O)) {\n var q = s;\n var r = s;\n var u = E;\n if (Kb(a, b[0] + O) != fd) {\n l = W;\n break a;\n }\n if (c[0] < l) {\n l = Z;\n break a;\n }\n u = Kb(a, b[0] + 8);\n q = 1 + ed(a, b[0] + 12);\n r = 1 + ed(a, b[0] + 15);\n if (q * r >= Ag) {\n l = W;\n break a;\n }\n t != p && (t[0] = u);\n d != p && (d[0] = q);\n e != p && (e[0] = r);\n b[0] += l;\n c[0] -= l;\n n[0] = 1;\n }\n l = L;\n }\n if (l != L) return l;\n if (!h && n[0]) return W;\n g != p && (g[0] = !!(t[0] & Bg));\n if (n && f == p) return L;\n if (c < O) return Z;\n if (h && n[0] || !h && !n[0] && !kd(a, b[0], 'ALPH', O)) {\n m.$ = [m.$];\n m.G = [m.G];\n m.pa = [m.pa];\n a: {\n var n = m.na;\n var h = m.$;\n var t = m.G;\n var l = m.pa;\n var q = x;\n var r = 0;\n var u = Mb;\n let v = O + R + fd;\n $(a != p);\n $(c != p);\n q = a;\n r = b[0];\n u = c[0];\n $(h != p);\n $(l != p);\n h[0] = p;\n t[0] = p;\n for (l[0] = 0; ;) {\n let w = E;\n let y = E;\n b[0] = r;\n c[0] = u;\n if (u < R) {\n l = Z;\n break a;\n }\n w = Kb(q, r + O);\n y = R + w + 1 & -2;\n v += y;\n if (n > 0 && v > n) {\n l = W;\n break a;\n }\n if (u < y) {\n l = Z;\n break a;\n }\n if (kd(q, r, 'ALPH', O)) {\n if (!kd(q, r, 'VP8 ', O) || !kd(q, 'VP8L', O)) {\n l = L;\n break a;\n }\n } else h[0] = q, t[0] = r + R, l[0] = w;\n r += y;\n u -= y;\n }\n l = ca;\n }\n m.$ = m.$[0];\n m.G = m.G[0];\n m.pa = m.pa[0];\n if (l != L) return l;\n }\n m.ta = [m.ta];\n m.ia = [m.ia];\n a: if (n = m.na, h = m.ta, t = m.ia, r = !kd(a, b[0], 'VP8 ', O), l = !kd(a, b[0], 'VP8L', O), q = O + R, $(a != p), $(c != p), $(h != p), $(t != p), c[0] < R) l = Z;\n else {\n if (r || l) {\n r = Kb(a, b[0] + O);\n if (n >= q && r > n - q) {\n l = W;\n break a;\n }\n h[0] = r;\n b[0] += R;\n c[0] -= R;\n t[0] = l;\n } else t[0] = c >= 1 && a[b + 0] == ve, h[0] = c[0];\n l = L;\n }\n m.ta = m.ta[0];\n m.ia = m.ia[0];\n if (l != L) return l;\n if (m.ta > Ze) return W;\n if (m.ia) {\n if (c[0] < $e) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n t = g ? g[0] : p;\n a == p || h < $e ? a = 0 : (l = [s], q = [s], r = [s], u = M(af), Rb(u, a, n, h), ue(u, l, q, r) ? (d != p && (d[0] = l[0]), e != p && (e[0] = q[0]), t != p && (t[0] = r[0]), a = 1) : a = 0);\n } else {\n if (c < bf) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n !(a == p || h < bf) && h - 3 >= 3 && a[n + 3 + 0] == 157 && a[n\n + 3 + 1] == 1 && a[n + 3 + 2] == 42 ? (h = a[n + 0] | a[n + 1] << 8 | a[n + 2] << 16, t = (a[n + 7] << 8 | a[n + 6]) & 16383, a = (a[n + 9] << 8 | a[n + 8]) & 16383, !(!(h & 1) + 0) || (h >> 1 & 7) > 3 || !(h >> 4 & 1) || h >> 5 >= m.ta ? a = 0 : (d && (d[0] = t), e && (e[0] = a), a = 1)) : a = 0;\n }\n if (!a) return W;\n g != p && (g[0] |= m.$ != p);\n f != p && (f[0] = m, f[0].offset = b[0] - f[0].b, $(b[0] - f[0].b < Ze), $(f[0].offset == f[0].e - c[0]));\n return L;\n }\n\n function Kd(a) {\n $(a != p);\n return Ye(a[0].data, a[0].b, a[0].e, p, p, p, a);\n }\n\n function cf(a, b, c, d) {\n let e = 'VP8StatusCode';\n const g = M(Vb);\n let f = M(Gc);\n f.data = a;\n f.b = b;\n f.e = c;\n f.b = [f.b];\n f.e = [f.e];\n f = [f];\n e = Kd(f);\n if (e\n != L) return e;\n f = f[0];\n f.b = f.b[0];\n f.e = f.e[0];\n $(d != p);\n td(na);\n g.data = f.data;\n g.b = b + f.offset;\n g.e = f.e - f.offset;\n g.put = ud;\n g.Mb = vd;\n g.Pb = wd;\n g.ka = d;\n if (f.ia) {\n a = sd();\n if (a == p) return cb;\n ng(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !og(a) && (e = a.a)) : e = a.a;\n a != p && sa(a);\n } else {\n e = M(Cg);\n e != p && (Gd(e), e.za = 0, e.Hb = 1);\n a = e;\n if (a == p) return cb;\n a.qb = 0;\n a.Ga = f.$;\n a.G = f.G;\n a.ub = f.pa;\n Hd(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !Mf(a, g) && (e = a.a)) : e = a.a;\n a != p && ke(a);\n }\n e != L && (self || this).Yc(d.j);\n return e;\n }\n\n function lb(a, b, c, d, e) {\n const g = {\n value: 0,\n };\n c = {\n value: c,\n };\n const f = M(df);\n const h = M(gd);\n f.j = h;\n h.J = a;\n const n = {\n value: h.width,\n };\n const l = {\n value: h.height,\n };\n let m;\n m = c;\n const t = M(ef);\n hd(b, g, m, t) != L ? m = 0 : (n != p && (n.value = t.width), l != p && (l.value = t.height), m = 1);\n if (!m) return p;\n h.width = n.value;\n h.height = l.value;\n d != p && (d.value = h.width.value);\n e != p && (e.value = h.height.value);\n return cf(b, g.value, c.value, f) != L ? p : a < ua ? h.c.RGBA.ma : h.c.Va.y;\n }\n\n function hd(a, b, c, d) {\n if (d == p || a == p) return ta;\n $(d != p);\n d.tc = 0;\n d.width = [d.width];\n d.height = [d.height];\n d.$b = [d.$b];\n return Ye(a, b, c, d.width, d.height, d.$b, p);\n }\n\n function Ne(a,\n b, c) {\n const d = b.width;\n const e = b.height;\n let g = 0;\n let f = 0;\n let h = d;\n let n = e;\n b.Ua = a != p && a.Ua > 0;\n if (b.Ua && (h = a.wc, n = a.vc, g = a.t, f = a.k, c < ua || (g &= -2, f &= -2), g < 0 || f < 0 || h <= 0 || n <= 0 || g + h > d || f + n > e)) return 0;\n b.t = g;\n b.k = f;\n b.Ka = g + h;\n b.K = f + n;\n b.m = h;\n b.h = n;\n b.I = a != p && a.I > 0;\n if (b.I) {\n if (a.Ba <= 0 || a.Aa <= 0) return 0;\n b.Ba = a.Ba;\n b.Aa = a.Aa;\n }\n b.Za = a && a.Za;\n b.Bb = a == p || !a.ed;\n b.I && (b.Za = b.Ba < 3 * d / 4 && b.Aa < 3 * e / 4, b.Bb = 0);\n return 1;\n }\n var na = 512;\n var Qa = 0;\n var jb = 1;\n var Zc = 2;\n var Pa = 3;\n var Ab = 4;\n var kb = 5;\n var Fe = 6;\n var Ob = 7;\n var Pb = 8;\n var Bb = 9;\n var Qb = 10;\n var ua = 11;\n var Ra = 12;\n var Cc = 13;\n this.WEBP_CSP_MODE = this.Cd = {\n nd: 0,\n od: 1,\n kd: 2,\n ld: 3,\n jd: 4,\n pd: 5,\n qd: 6,\n rd: 7,\n sd: 8,\n md: 9,\n };\n var gd = {\n J: 'WEBP_CSP_MODE',\n width: s,\n height: s,\n Fc: s,\n c: {\n RGBA: {\n ma: x,\n Sa: 0,\n f: s,\n size: Mb,\n },\n Va: {\n y: x,\n c: x,\n S: x,\n p: x,\n D: x,\n B: x,\n C: x,\n q: x,\n F: s,\n nb: s,\n rb: s,\n Fa: s,\n Wc: Mb,\n Rc: Mb,\n Uc: Mb,\n Wb: Mb,\n },\n },\n Ic: U(4, E),\n Jb: p,\n jc: x,\n };\n var L = 0;\n var cb = 1;\n var ta = 2;\n var W = 3;\n var Hf = 4;\n var Ie = 5;\n var Nf = 6;\n var Z = 7;\n this.VP8StatusCode = this.td = {\n xd: 0,\n yd: 1,\n vd: 2,\n ud: 3,\n Ad: 4,\n zd: 5,\n Bd: 6,\n wd: 7,\n };\n var ef = {\n width: {\n value: s,\n },\n height: {\n value: s,\n },\n $b: {\n value: s,\n },\n tc: s,\n Yd: s,\n rotate: s,\n be: s,\n Ic: U(3, E),\n };\n this.WebPGetFeatures = this.Md = function (a, b, c) {\n let d = 'VP8StatusCode';\n na >>> 8 != na >>> 8 || c == p ? a = ta : (b = [b], d = hd(a, [0], b, c), a = d == Z ? W : d);\n return a;\n };\n const ff = {\n Za: s,\n ed: s,\n Ua: s,\n t: s,\n k: s,\n wc: s,\n vc: s,\n I: s,\n Ba: s,\n Aa: s,\n ae: s,\n Td: s,\n Xd: s,\n Ic: U(6, E),\n };\n this.WebPDecoderConfig = this.Kd = {\n input: M(ef),\n j: M(gd),\n options: M(ff),\n };\n this.WebPInitDecoderConfig = this.Nd = function (a) {\n na >>> 8 != na >>> 8 || a == p ? a = 0 : (a = a.input, $(a != p), a.tc = 0, a = 1);\n return a;\n };\n var Vb = {\n width: s,\n height: s,\n w: s,\n m: s,\n h: s,\n y: x,\n c: x,\n S: x,\n D: 0,\n B: 0,\n C: 0,\n F: s,\n Da: s,\n ka: 0,\n put: 0,\n Mb: 0,\n Pb: 0,\n Bb: s,\n e: Mb,\n data: x,\n b: 0,\n Za: s,\n Ua: s,\n t: s,\n Ka: s,\n k: s,\n K: s,\n I: s,\n Ba: s,\n Aa: s,\n p: x,\n q: 0,\n };\n var df = {\n j: M(gd),\n Sb: x,\n Qb: x,\n lc: x,\n Tb: 0,\n Rb: 0,\n mc: 0,\n ec: s,\n Qa: M(ff),\n memory: 0,\n $a: '(OutputFunc)',\n zb: '(OutputFunc)',\n ad: '(OutputRowFunc)',\n };\n var Gc = {\n data: x,\n b: x,\n e: Mb,\n offset: Mb,\n $: p,\n G: x,\n pa: Mb,\n ta: Mb,\n na: Mb,\n ia: s,\n };\n var Fc = {\n qa: x,\n Ia: p,\n Pd: x,\n Ab: s,\n la: E,\n Z: E,\n gc: s,\n };\n var af = {\n T: bb,\n qa: x,\n Ia: x,\n ya: Mb,\n Q: Mb,\n g: s,\n L: s,\n fa: s,\n };\n var gf = 25;\n var hf = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215];\n var bf = 10;\n var ve = 47;\n var we = 14;\n var Wf = 3;\n var $e = 5;\n var fg = 11;\n var Yc = 5;\n var qe = 4278190080;\n var jg = 8;\n var Tb = 15;\n var Ba = 256;\n var Ge = 24;\n var Je = 4;\n var Be = 0;\n var De = 1;\n var Ae = 2;\n var Ee = 3;\n var Ub = 1;\n var kc = 0;\n var kf = 1;\n var rd = 1;\n var O = 4;\n var R = 8;\n var Lb = 12;\n var fd = 10;\n var Bg = 16;\n var Ag = 1 * Math.pow(2, 32);\n var Ze = -1 - R - 1 >>> 0;\n var jf = {\n kc: s,\n s,\n };\n var Le = {\n Y: 'HuffmanTreeNode*',\n gb: s,\n Pa: s,\n };\n var pd = -1;\n const Dg = {\n ea: E,\n bb: s,\n };\n var ad = 506832829;\n var $b = 0;\n var ge = $b;\n var fe = 2;\n var ee = 3;\n var de = 1;\n var Ef = 4;\n var Df = 5;\n var Cf = 6;\n var Ld = 3;\n var xa = 4;\n var Hc = 4;\n var Gf = 4;\n var Md = 4;\n var Nd = 8;\n var Kc = 3;\n var Lc = 11;\n var f = 32;\n var Pf = 17 * f + 9 * f;\n var Tc = 1 * f + 8;\n var Uc = Tc + 16 * f + f;\n var he = Uc + 16;\n var Id = {\n fb: x,\n Jc: x,\n Nc: x,\n Ra: E,\n };\n var Jd = {\n l: 0,\n v: 0,\n gd: x,\n hd: x,\n uc: x,\n $c: x,\n };\n const Eg = {\n pb: s,\n ob: s,\n tb: s,\n Kb: U(xa, 0),\n Cb: U(xa, 0),\n };\n const Fg = {\n Ta: U(Ld, x),\n z: md([Md, Nd, Kc, Lc], x),\n };\n const Gg = {\n Oc: s,\n Fb: s,\n kb: s,\n oc: s,\n Lc: U(Hc, s),\n Gc: U(Hc, s),\n };\n var Oc = {\n zc: s,\n yc: s,\n ab: s,\n };\n var Qd = {\n X: s,\n ua: s,\n Nb: s,\n };\n const id = U(2, s);\n const Hg = {\n sc: M(id),\n sb: M(id),\n qc: M(id),\n };\n const Ig = {\n ha: s,\n d: s,\n W: s,\n M: Oc,\n N: Vb,\n };\n var Cg = {\n a: 'VP8StatusCode',\n za: s,\n xc: 0,\n o: M(Fc),\n Ac: M(Id),\n P: M(Jd),\n ga: M(Gg),\n Ca: M(Eg),\n rc: 'WebPWorker',\n qb: s,\n Ja: s,\n jb: s,\n oa: Ig,\n Ma: s,\n hb: s,\n lb: s,\n mb: s,\n wb: s,\n Ya: s,\n Hb: s,\n ic: ld(8, Fc),\n Zc: E,\n yb: ld(xa, Hg),\n R: M(Fg),\n pc: s,\n Pc: x,\n dc: x,\n cc: U(4, x),\n Xc: x,\n Sc: x,\n Vc: x,\n La: M(Qd),\n M: M(Oc),\n Ea: x,\n z: 0,\n ca: x,\n aa: x,\n ra: x,\n da: s,\n ba: s,\n sa: s,\n H: s,\n r: s,\n ib: 0,\n Gb: Mb,\n i: s,\n d: s,\n wa: x,\n Eb: U(16, x),\n Vd: 0,\n Tc: x,\n Lb: x,\n ja: E,\n Oa: E,\n A: s,\n W: s,\n Zb: U(xa, x),\n Ga: p,\n G: 0,\n ub: Mb,\n Xb: x,\n Od: 0,\n cd: s,\n dd: x,\n Wd: 0,\n fc: Mb,\n };\n var Db = 0;\n var Cb = 1;\n var cd = 2;\n const Jg = {\n Qc: 'VP8LImageTransformType',\n n: s,\n U: s,\n Vb: s,\n u: E,\n b: E,\n };\n var gg = {\n va: ld(Yc, Le),\n };\n const Kg = {\n xb: s,\n Yb: M(Dg),\n Dc: s,\n eb: s,\n Ec: s,\n ac: E,\n bd: E,\n hc: s,\n Db: 'HTreeGroup',\n };\n var eg = {\n a: 'VP8StatusCode',\n Wa: 'VP8LDecodeState',\n Ob: 'VP8LDecodeState',\n N: 'VP8Io',\n Ib: 'WebPDecBuffer',\n Hc: 'WebPDecBuffer',\n V: E,\n Ha: E,\n Xa: E,\n vb: E,\n o: M(af),\n l: s,\n v: s,\n O: s,\n xa: s,\n cb: M(Kg),\n Na: s,\n nc: ld(Je, Jg),\n Ub: E,\n Mc: x,\n $d: x,\n Zd: '*WebPRescaler',\n };\n var lf = 4;\n var nf = [p, function (a, b, c, d, e, g, f, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(f != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(g >= c * e);\n for (n = 0; n < d; ++n) {\n n == 0 ? N(f, h, a, b, e) : Ea(a, b, f, l - g, f, h, e), Ea(a, b + e, f, l, f, h + e, e * (c - 1)),\n l += g, b += g, h += g;\n }\n }, function (a, b, c, d, e, f, k, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, l, k, h + e, e * (c - 1));\n for (n = 1; n < d; ++n) b += f, h += f, Ea(a, b, k, l, k, h, e * c), l += f;\n }, function (a, b, c, d, e, f, k, h) {\n var n = h;\n let l = s;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, n, k, h + e, e * (c - 1));\n for (l = 1; l < d; ++l) {\n let m = s;\n var n = n + f;\n b += f;\n h += f;\n Ea(a, b, k, n - f, k, h, e);\n for (m = e; m < c * e; ++m) {\n const t = k[n + m - e] + k[n + m - f] - k[n + m - f - e];\n k[h + m] = a[b + m] + (t < 0 ? 0 : t > 255 ? 255 : t) & 255;\n }\n }\n }];\n var yd = [3, 4, 3, 4, 4, 2, 2, 4, 4, 4,\n 2, 1, 1,\n ];\n this.WebPFreeDecBuffer = this.Yc = function (a) {\n a != p && (a.Fc || (a.Jb = ''), a.jc = 0, a.Jb = a.jc = p);\n };\n self = this;\n var va = U(511, x);\n var tc = U(511, x);\n var sc = U(2041, 0);\n var oc = U(225, 0);\n var oa = U(766, x);\n var Rd = 0;\n var Xb = 85627;\n var Wb = 35468;\n var Uf = [function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 4; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n c >>= 3;\n for (d = 0; d < 4; ++d) jd(a, b + d * f, c, 4);\n }, function (a, b) {\n Dc(a, b, 4);\n }, function (a, b) {\n let c = b - f;\n const d = [];\n d.push(y(a[c - 1], a[c + 0], a[c + 1]));\n d.push(y(a[c + 0], a[c + 1], a[c + 2]));\n d.push(y(a[c + 1], a[c + 2], a[c + 3]));\n d.push(y(a[c + 2], a[c + 3], a[c + 4]));\n for (c = 0; c < 4; ++c) N(a, b + c * f, d, 0, 4);\n },\n function (a, b) {\n const c = a[b - 1];\n const d = a[b - 1 + f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = a[b + 1 + 0 * f] = a[b + 2 + 0 * f] = a[b + 3 + 0 * f] = y(a[b - 1 - f], c, d);\n a[b + 0 + 1 * f] = a[b + 1 + 1 * f] = a[b + 2 + 1 * f] = a[b + 3 + 1 * f] = y(c, d, e);\n a[b + 0 + 2 * f] = a[b + 1 + 2 * f] = a[b + 2 + 2 * f] = a[b + 3 + 2 * f] = y(d, e, g);\n a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = y(e, g, g);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 3 * f] = y(d, e, a[b - 1 + 3 * f]);\n a[b + 0 + 2 * f] = a[b + 1 + 3 * f] = y(c, d, e);\n a[b + 0 + 1 * f] = a[b + 1 + 2 * f] = a[b + 2 + 3 * f] = y(g, c, d);\n a[b\n + 0 + 0 * f] = a[b + 1 + 1 * f] = a[b + 2 + 2 * f] = a[b + 3 + 3 * f] = y(k, g, c);\n a[b + 1 + 0 * f] = a[b + 2 + 1 * f] = a[b + 3 + 2 * f] = y(h, k, g);\n a[b + 2 + 0 * f] = a[b + 3 + 1 * f] = y(n, h, k);\n a[b + 3 + 0 * f] = y(l, n, h);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 0 * f] = a[b + 1 + 2 * f] = g + k + 1 >> 1;\n a[b + 1 + 0 * f] = a[b + 2 + 2 * f] = k + h + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 3 + 2 * f] = h + n + 1 >> 1;\n a[b + 3 + 0 * f] = n + l + 1 >> 1;\n a[b + 0 + 3 * f] = y(e, d, c);\n a[b + 0 + 2 * f] = y(d, c, g);\n a[b + 0 + 1 * f] = a[b + 1 + 3 * f] = y(c, g, k);\n a[b + 1 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 2 + 1 * f] = a[b + 3 + 3 * f] = y(k, h, n);\n a[b + 3 + 1 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b + 1 - f];\n const d = a[b + 2 - f];\n const e = a[b + 3 - f];\n const g = a[b + 4 - f];\n const k = a[b + 5 - f];\n const h = a[b + 6 - f];\n const n = a[b + 7 - f];\n a[b + 0 + 0 * f] = y(a[b + 0 - f], c, d);\n a[b + 1 + 0 * f] = a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 2 + 0 * f] = a[b + 1 + 1 * f] = a[b + 0 + 2 * f] = y(d, e, g);\n a[b + 3 + 0 * f] = a[b + 2 + 1 * f] = a[b + 1 + 2 * f] = a[b + 0 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 2 * f] = a[b + 1 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = a[b + 2 + 3 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, n);\n },\n function (a, b) {\n const c = a[b + 0 - f];\n const d = a[b + 1 - f];\n const e = a[b + 2 - f];\n const g = a[b + 3 - f];\n const k = a[b + 4 - f];\n const h = a[b + 5 - f];\n const n = a[b + 6 - f];\n const l = a[b + 7 - f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 1 + 0 * f] = a[b\n + 0 + 2 * f] = d + e + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 1 + 2 * f] = e + g + 1 >> 1;\n a[b + 3 + 0 * f] = a[b + 2 + 2 * f] = g + k + 1 >> 1;\n a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 1 + 1 * f] = a[b + 0 + 3 * f] = y(d, e, g);\n a[b + 2 + 1 * f] = a[b + 1 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n const k = a[b - 1 - f];\n const h = a[b + 0 - f];\n const n = a[b + 1 - f];\n const l = a[b + 2 - f];\n a[b + 0 + 0 * f] = a[b + 2 + 1 * f] = c + k + 1 >> 1;\n a[b + 0 + 1 * f] = a[b + 2 + 2 * f] = d + c + 1 >> 1;\n a[b + 0 + 2 * f] = a[b + 2 + 3 * f] = e + d + 1 >> 1;\n a[b + 0 + 3 * f] = g + e + 1 >> 1;\n a[b + 3 + 0 * f] = y(h, n, l);\n a[b + 2 + 0 * f] = y(k, h, n);\n a[b\n + 1 + 0 * f] = a[b + 3 + 1 * f] = y(c, k, h);\n a[b + 1 + 1 * f] = a[b + 3 + 2 * f] = y(d, c, k);\n a[b + 1 + 2 * f] = a[b + 3 + 3 * f] = y(e, d, c);\n a[b + 1 + 3 * f] = y(g, e, d);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 0 + 1 * f] = d + e + 1 >> 1;\n a[b + 2 + 1 * f] = a[b + 0 + 2 * f] = e + g + 1 >> 1;\n a[b + 1 + 0 * f] = y(c, d, e);\n a[b + 3 + 0 * f] = a[b + 1 + 1 * f] = y(d, e, g);\n a[b + 3 + 1 * f] = a[b + 1 + 2 * f] = y(e, g, g);\n a[b + 3 + 2 * f] = a[b + 2 + 2 * f] = a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = g;\n },\n ];\n var Vf = [function (a, b) {\n let c = 16;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f] + a[b + d - f];\n Yb(c >> 5, a, b);\n }, function (a,\n b) {\n Dc(a, b, 16);\n }, function (a, b) {\n let c;\n for (c = 0; c < 16; ++c) N(a, b + c * f, a, b - f, 16);\n }, function (a, b) {\n let c;\n for (c = 16; c > 0; --c) jd(a, b + 0, a[b - 1], 16), b += f;\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b + d - f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n Yb(128, a, b);\n }];\n var je = [function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n Zb(1 * (c >> 4), a, b);\n }, function (a, b) {\n Dc(a, b, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) N(a, b + c * f, a, b - f, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) {\n jd(a,\n b + 0, a[b - 1], 8), b += f;\n }\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b - 1 + d * f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n Zb(128, a, b);\n }];\n let mc; let Pc; let Qc; let Rc; let Sd; let Td; let Ud; let Vd; let Wd; let Xd; let Yd; let Zd; let $d; let ae; let be; let ce; var Pd = 31;\n var uc = [0, 2, 8];\n var Od = 3;\n var Of = 1;\n var ie = [0 + 0 * f, 4 + 0 * f, 8 + 0 * f, 12 + 0 * f, 0 + 4 * f, 4 + 4 * f, 8 + 4 * f, 12 + 4 * f, 0 + 8 * f, 4 + 8 * f, 8 + 8 * f, 12 + 8 * f, 0 + 12 * f, 4 + 12 * f, 8 + 12 * f, 12 + 12 * f];\n var Ic = [4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38,\n 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157,\n ];\n var Jc = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96,\n 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284,\n ];\n var Sf = [-$b, 1, -1, 2, -2, 3, 4, 6, -3, 5, -4, -5, -6, 7, -7, 8, -8, -9];\n var Ff = [\n [\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128],\n [189, 129, 242, 255, 227, 213, 255, 219, 128, 128,\n 128,\n ],\n [106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128],\n ],\n [\n [1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128],\n [181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128],\n [78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128],\n ],\n [\n [1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128],\n [184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128],\n [77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128],\n ],\n [\n [1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128],\n [170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128],\n [37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128],\n ],\n [\n [1, 204, 254, 255, 245, 255, 128, 128, 128, 128,\n 128,\n ],\n [207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128],\n [102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128],\n ],\n [\n [1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128],\n [177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128],\n [80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62],\n [131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1],\n [68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128],\n ],\n [\n [1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128],\n [184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128],\n [81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128],\n ],\n [\n [1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128],\n [99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128],\n [23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128],\n ],\n [\n [1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128],\n [109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128],\n [44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128],\n ],\n [\n [1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128],\n [94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128],\n [22,\n 100, 174, 245, 186, 161, 255, 199, 128, 128, 128,\n ],\n ],\n [\n [1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128],\n [124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128],\n [35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128],\n ],\n [\n [1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128],\n [121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128],\n [45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128],\n ],\n [\n [1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128],\n [203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n [137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128],\n [175, 13,\n 224, 243, 193, 185, 249, 198, 255, 255, 128,\n ],\n [73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128],\n ],\n [\n [1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128],\n [239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128],\n [155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128],\n ],\n [\n [1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128],\n [201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128],\n [69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128],\n ],\n [\n [1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128],\n [223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128],\n [141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 16, 248, 255,\n 255, 128, 128, 128, 128, 128, 128,\n ],\n [190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128],\n [149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128],\n [213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128],\n [55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128,\n 128, 128, 128, 128, 128, 128, 128,\n ],\n ],\n ],\n [\n [\n [202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255],\n [126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128],\n [61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128],\n ],\n [\n [1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128],\n [166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128],\n [39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128],\n ],\n [\n [1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128],\n [124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128],\n [24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128],\n ],\n [\n [1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128],\n [149, 150, 226, 252, 216,\n 205, 255, 171, 128, 128, 128,\n ],\n [28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128],\n ],\n [\n [1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128],\n [123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128],\n [20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128],\n ],\n [\n [1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128],\n [168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128],\n [47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128],\n ],\n [\n [1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128],\n [141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128],\n [42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128,\n 128, 128, 128, 128,\n ],\n [244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n ];\n var Rf = [\n [\n [231, 120, 48, 89, 115, 113, 120, 152, 112],\n [152, 179, 64, 126, 170, 118, 46, 70, 95],\n [175, 69, 143, 80, 85, 82, 72, 155, 103],\n [56, 58, 10, 171, 218, 189, 17, 13, 152],\n [114, 26, 17, 163, 44, 195, 21, 10, 173],\n [121, 24, 80, 195, 26, 62, 44, 64, 85],\n [144, 71, 10, 38, 171, 213, 144, 34, 26],\n [170, 46, 55, 19, 136, 160, 33, 206, 71],\n [63, 20, 8, 114, 114, 208, 12, 9, 226],\n [81, 40, 11, 96, 182, 84, 29, 16, 36],\n ],\n [\n [134, 183, 89, 137, 98, 101, 106, 165, 148],\n [72, 187, 100, 130, 157, 111,\n 32, 75, 80,\n ],\n [66, 102, 167, 99, 74, 62, 40, 234, 128],\n [41, 53, 9, 178, 241, 141, 26, 8, 107],\n [74, 43, 26, 146, 73, 166, 49, 23, 157],\n [65, 38, 105, 160, 51, 52, 31, 115, 128],\n [104, 79, 12, 27, 217, 255, 87, 17, 7],\n [87, 68, 71, 44, 114, 51, 15, 186, 23],\n [47, 41, 14, 110, 182, 183, 21, 17, 194],\n [66, 45, 25, 102, 197, 189, 23, 18, 22],\n ],\n [\n [88, 88, 147, 150, 42, 46, 45, 196, 205],\n [43, 97, 183, 117, 85, 38, 35, 179, 61],\n [39, 53, 200, 87, 26, 21, 43, 232, 171],\n [56, 34, 51, 104, 114, 102, 29, 93, 77],\n [39, 28, 85, 171, 58, 165, 90, 98, 64],\n [34, 22, 116, 206, 23, 34, 43, 166, 73],\n [107, 54, 32, 26, 51, 1, 81, 43, 31],\n [68, 25, 106, 22,\n 64, 171, 36, 225, 114,\n ],\n [34, 19, 21, 102, 132, 188, 16, 76, 124],\n [62, 18, 78, 95, 85, 57, 50, 48, 51],\n ],\n [\n [193, 101, 35, 159, 215, 111, 89, 46, 111],\n [60, 148, 31, 172, 219, 228, 21, 18, 111],\n [112, 113, 77, 85, 179, 255, 38, 120, 114],\n [40, 42, 1, 196, 245, 209, 10, 25, 109],\n [88, 43, 29, 140, 166, 213, 37, 43, 154],\n [61, 63, 30, 155, 67, 45, 68, 1, 209],\n [100, 80, 8, 43, 154, 1, 51, 26, 71],\n [142, 78, 78, 16, 255, 128, 34, 197, 171],\n [41, 40, 5, 102, 211, 183, 4, 1, 221],\n [51, 50, 17, 168, 209, 192, 23, 25, 82],\n ],\n [\n [138, 31, 36, 171, 27, 166, 38, 44, 229],\n [67, 87, 58, 169, 82, 115, 26, 59, 179],\n [63, 59, 90, 180, 59, 166, 93, 73,\n 154,\n ],\n [40, 40, 21, 116, 143, 209, 34, 39, 175],\n [47, 15, 16, 183, 34, 223, 49, 45, 183],\n [46, 17, 33, 183, 6, 98, 15, 32, 183],\n [57, 46, 22, 24, 128, 1, 54, 17, 37],\n [65, 32, 73, 115, 28, 128, 23, 128, 205],\n [40, 3, 9, 115, 51, 192, 18, 6, 223],\n [87, 37, 9, 115, 59, 77, 64, 21, 47],\n ],\n [\n [104, 55, 44, 218, 9, 54, 53, 130, 226],\n [64, 90, 70, 205, 40, 41, 23, 26, 57],\n [54, 57, 112, 184, 5, 41, 38, 166, 213],\n [30, 34, 26, 133, 152, 116, 10, 32, 134],\n [39, 19, 53, 221, 26, 114, 32, 73, 255],\n [31, 9, 65, 234, 2, 15, 1, 118, 73],\n [75, 32, 12, 51, 192, 255, 160, 43, 51],\n [88, 31, 35, 67, 102, 85, 55, 186, 85],\n [56, 21, 23, 111, 59, 205, 45, 37, 192],\n [55, 38, 70, 124, 73, 102, 1, 34, 98],\n ],\n [\n [125, 98, 42, 88, 104, 85, 117, 175, 82],\n [95, 84, 53, 89, 128, 100, 113, 101, 45],\n [75, 79, 123, 47, 51, 128, 81, 171, 1],\n [57, 17, 5, 71, 102, 57, 53, 41, 49],\n [38, 33, 13, 121, 57, 73, 26, 1, 85],\n [41, 10, 67, 138, 77, 110, 90, 47, 114],\n [115, 21, 2, 10, 102, 255, 166, 23, 6],\n [101, 29, 16, 10, 85, 128, 101, 196, 26],\n [57, 18, 10, 102, 102, 213, 34, 20, 43],\n [117, 20, 15, 36, 163, 128, 68, 1, 26],\n ],\n [\n [102, 61, 71, 37, 34, 53, 31, 243, 192],\n [69, 60, 71, 38, 73, 119, 28, 222, 37],\n [68, 45, 128, 34, 1, 47, 11, 245, 171],\n [62, 17, 19, 70, 146, 85, 55, 62, 70],\n [37, 43, 37, 154, 100, 163, 85, 160,\n 1,\n ],\n [63, 9, 92, 136, 28, 64, 32, 201, 85],\n [75, 15, 9, 9, 64, 255, 184, 119, 16],\n [86, 6, 28, 5, 64, 255, 25, 248, 1],\n [56, 8, 17, 132, 137, 255, 55, 116, 128],\n [58, 15, 20, 82, 135, 57, 26, 121, 40],\n ],\n [\n [164, 50, 31, 137, 154, 133, 25, 35, 218],\n [51, 103, 44, 131, 131, 123, 31, 6, 158],\n [86, 40, 64, 135, 148, 224, 45, 183, 128],\n [22, 26, 17, 131, 240, 154, 14, 1, 209],\n [45, 16, 21, 91, 64, 222, 7, 1, 197],\n [56, 21, 39, 155, 60, 138, 23, 102, 213],\n [83, 12, 13, 54, 192, 255, 68, 47, 28],\n [85, 26, 85, 85, 128, 128, 32, 146, 171],\n [18, 11, 7, 63, 144, 171, 4, 4, 246],\n [35, 27, 10, 146, 174, 171, 12, 26, 128],\n ],\n [\n [190, 80, 35, 99, 180, 80,\n 126, 54, 45,\n ],\n [85, 126, 47, 87, 176, 51, 41, 20, 32],\n [101, 75, 128, 139, 118, 146, 116, 128, 85],\n [56, 41, 15, 176, 236, 85, 37, 9, 62],\n [71, 30, 17, 119, 118, 255, 17, 18, 138],\n [101, 38, 60, 138, 55, 70, 43, 26, 142],\n [146, 36, 19, 30, 171, 255, 97, 27, 20],\n [138, 45, 61, 62, 219, 1, 81, 188, 64],\n [32, 41, 20, 117, 151, 142, 20, 21, 163],\n [112, 19, 12, 61, 195, 128, 48, 4, 24],\n ],\n ];\n var If = [\n [\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 241,\n 252, 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255],\n [250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [225, 252, 241, 253, 255, 255, 254, 255,\n 255, 255, 255,\n ],\n [234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255,\n 255, 255, 255, 255, 255, 255,\n ],\n [252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n ],\n ],\n [\n [\n [186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255],\n [251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255,\n 255, 255,\n ],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 253, 255, 255, 255,\n 255, 255, 255, 255, 255,\n ],\n [253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 253,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n ];\n this.WebPGetDecoderVersion = this.Ld = function () {\n return 512;\n };\n var Nc = [0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0];\n var Jf = [\n [173, 148, 140, 0],\n [176, 155, 140, 135, 0],\n [180, 157, 141, 134, 130, 0],\n [254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0],\n ];\n var Kf = [0, 1, 4, 8, 5, 2, 3, 6,\n 9, 12, 13, 10, 7, 11, 14, 15,\n ];\n var Tf = md([Kc, Lc], '');\n U(4, x);\n var vc = [\n [0, 0, 0, 0],\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [1, 1, 0, 0],\n [0, 0, 1, 0],\n [1, 0, 1, 0],\n [0, 1, 1, 0],\n [1, 1, 1, 0],\n [0, 0, 0, 1],\n [1, 0, 0, 1],\n [0, 1, 0, 1],\n [1, 1, 0, 1],\n [0, 0, 1, 1],\n [1, 0, 1, 1],\n [0, 1, 1, 1],\n [1, 1, 1, 1],\n ];\n var Lf = 134480385;\n var ea = 16;\n var J = -227;\n var dd = 482;\n var Ce = [Wc, function (a) {\n return a;\n }, function (a, b, c) {\n return b[c + 0];\n }, function (a, b, c) {\n return b[c + 1];\n }, function (a, b, c) {\n return b[c - 1];\n }, function (a, b, c) {\n return ka(ka(a, b[c + 1]), b[c + 0]);\n }, function (a, b, c) {\n return ka(a, b[c - 1]);\n }, function (a, b, c) {\n return ka(a, b[c + 0]);\n }, function (a,\n b, c) {\n return ka(b[c - 1], b[c + 0]);\n }, function (a, b, c) {\n return ka(b[c + 0], b[c + 1]);\n }, function (a, b, c) {\n return ka(ka(a, b[c - 1]), ka(b[c + 0], b[c + 1]));\n }, function (a, b, c) {\n return Math.abs((a >> 24 & 255) - (b[c - 1] >> 24 & 255)) - Math.abs((b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) + (Math.abs((a >> 16 & 255) - (b[c - 1] >> 16 & 255)) - Math.abs((b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255))) + (Math.abs((a >> 8 & 255) - (b[c - 1] >> 8 & 255)) - Math.abs((b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255))) + (Math.abs((a & 255) - (b[c - 1] & 255)) - Math.abs((b[c + 0] & 255) - (b[c - 1] & 255))) <= 0 ? b[c + 0] : a;\n }, function (a, b, c) {\n return ($a((a\n >> 24 & 255) + (b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) << 24 | $a((a >> 16 & 255) + (b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255)) << 16 | $a((a >> 8 & 255) + (b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255)) << 8 | $a((a & 255) + (b[c + 0] & 255) - (b[c - 1] & 255))) >>> 0;\n }, function (a, b, c) {\n const d = b[c - 1];\n a = ka(a, b[c + 0]);\n return (yb(a >> 24 & 255, d >> 24 & 255) << 24 | yb(a >> 16 & 255, d >> 16 & 255) << 16 | yb(a >> 8 & 255, d >> 8 & 255) << 8 | yb(a >> 0 & 255, d >> 0 & 255)) >>> 0;\n }, Wc, Wc];\n var Xf = {\n Cc: x,\n Bc: x,\n Kc: x,\n };\n var $c = 16;\n var Me = 16;\n var kg = 16;\n var mg = [2, 3, 7];\n var lg = [3, 3, 11];\n var Zf = 0;\n var $f = 1;\n var ag = 2;\n var bg = 3;\n var cg = 4;\n var hg = [Ba + Ge, Ba, Ba, Ba, 40];\n var Ke = 19;\n var ig = [17, 18, 0, 1, 2, 3, 4, 5, 16,\n 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n ];\n var He = 120;\n var dg = [24, 7, 23, 25, 40, 6, 39, 41, 22, 26, 38, 42, 56, 5, 55, 57, 21, 27, 54, 58, 37, 43, 72, 4, 71, 73, 20, 28, 53, 59, 70, 74, 36, 44, 88, 69, 75, 52, 60, 3, 87, 89, 19, 29, 86, 90, 35, 45, 68, 76, 85, 91, 51, 61, 104, 2, 103, 105, 18, 30, 102, 106, 34, 46, 84, 92, 67, 77, 101, 107, 50, 62, 120, 1, 119, 121, 83, 93, 17, 31, 100, 108, 66, 78, 118, 122, 33, 47, 117, 123, 49, 63, 99, 109, 82, 94, 0, 116, 124, 65, 79, 16, 32, 98, 110, 48, 115, 125, 81, 95, 64, 114, 126, 97, 111, 80, 113, 127, 96, 112];\n var Jb = 1 << ea - 1;\n var Za = U(256, 0);\n var xb = U(256, 0);\n var vb = U(256, la);\n var wb = U(256, la);\n var ia = U(dd - J, x);\n var Hb = U(dd\n - J, x);\n var Xe = 0;\n var V = Array(Cc);\n var vg = [function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, hc, 3);\n }, Se, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, Vc, 3);\n }, Te, Ue, Ve, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, le, 2);\n }, Se, Te, Ue, Ve];\n this.Hd = function (a, b, c, d) {\n return lb(Qa, a, b, c, d);\n };\n this.Id = function (a, b, c, d) {\n return lb(jb, a, b, c, d);\n };\n this.Jd = function (a, b, c, d) {\n return lb(kb, a, b, c, d);\n };\n this.Ed = function (a, b, c, d) {\n return lb(Ab, a, b, c, d);\n };\n this.Fd = function (a, b, c, d) {\n return lb(Zc,\n a, b, c, d);\n };\n this.Gd = function (a, b, c, d) {\n return lb(Pa, a, b, c, d);\n };\n this.WebPDecode = this.Dd = function (a, b, c) {\n const d = M(df);\n let e = 'VP8StatusCode';\n if (c == p) return ta;\n e = hd(a, [0], [b], c.input);\n if (e != L) return e == Z ? W : e;\n d.j = c.j;\n d.Qa = c.Qa;\n return e = cf(a, 0, [b], d);\n };\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {webp2png} from './webp';\nimport type {ConvertWebPTask} from './webpWorkerController';\n\nconst ctx = self as any as DedicatedWorkerGlobalScope;\nconst tasks: ConvertWebPTask[] = [];\n// let isProcessing = false;\n\nfunction finishTask() {\n // isProcessing = false;\n processTasks();\n}\n\nfunction processTasks() {\n // if(isProcessing) return;\n\n const task = tasks.shift();\n if(!task) return;\n\n // isProcessing = true;\n\n switch(task.type) {\n case 'convertWebp': {\n const {fileName, bytes} = task.payload;\n\n let convertedBytes: Uint8Array;\n try {\n convertedBytes = webp2png(bytes).bytes;\n } catch(err) {\n console.error('Convert webp2png error:', err, 'payload:', task.payload);\n }\n\n ctx.postMessage({\n type: 'convertWebp',\n payload: {\n fileName,\n bytes: convertedBytes\n }\n });\n\n finishTask();\n\n break;\n }\n\n default:\n finishTask();\n }\n}\n\nfunction scheduleTask(task: ConvertWebPTask) {\n tasks.push(task);\n /* if(task.payload.fileName.indexOf('main-') === 0) {\n tasks.push(task);\n } else {\n tasks.unshift(task);\n } */\n\n processTasks();\n}\n\nctx.addEventListener('message', (event) => {\n scheduleTask(event.data);\n});\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {WebPDecoder} from '../../vendor/libwebp-0.2.0';\nimport {encode} from 'fast-png';\n\nexport function webp2png(data: Uint8Array) {\n const decoder = new WebPDecoder();\n const config: any = decoder.WebPDecoderConfig;\n const buffer = config.j || config.output;\n const bitstream = config.input;\n\n decoder.WebPInitDecoderConfig(config);\n decoder.WebPGetFeatures(data, data.length, bitstream);\n\n /** MODE_RGBA = 1 MODE_ARGB = 4, */\n buffer.J = 1;\n\n let status;\n try {\n status = decoder.WebPDecode(data, data.length, config);\n } catch(e) {\n status = e;\n }\n\n if(status === 0) {\n const rgbaData = buffer.Jb;\n const pngData = encode({\n data: rgbaData,\n width: buffer.width,\n height: buffer.height,\n channels: 4,\n depth: 8\n });\n\n return {status, bytes: pngData};\n }\n\n return {status, bytes: data};\n}\n\nexport function webp2pngAsBlob(data: Uint8Array) {\n const {status, bytes} = webp2png(data);\n return new Blob([bytes], {type: status === 0 ? 'image/png' : 'image/webp'});\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,866,158], () => (__webpack_require__(2061)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + {\"158\":\"npm.iobuffer\",\"699\":\"npm.pako\",\"866\":\"npm.fast-png\"}[chunkId] + \".\" + {\"158\":\"061a9f8cc247dc1dbb8d\",\"699\":\"85f88e27b023cbb2ca51\",\"866\":\"8cb0a7aa9c4ab1eb9f54\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t61: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","i","p","M","F","JSON","parse","stringify","N","G","w","D","S","Nb","length","push","ic","rc","memmove","arr1","index1","arr2","index2","jd","kd","ga","String","fromCharCode","U","ld","md","$","Error","WebPDecoder","a","Ob","Pb","Bb","Qb","b","c","la","d","e","Z","gc","bc","qa","Ia","Rb","ya","T","Q","g","L","fa","Sb","Da","gf","hf","ma","Pa","gb","nd","Y","jf","s","ja","jc","k","h","n","l","kc","od","Tb","pd","Ea","qd","P","v","Ga","ub","Xb","m","f","q","r","u","C","Ub","kf","lf","rd","Vb","A","z","sd","td","na","put","ud","Mb","vd","wd","ka","fd","width","height","o","Wa","Cb","Ka","xd","Db","lc","V","Ha","mf","sa","nf","zd","ta","Ua","wc","vc","t","I","Ba","Aa","J","Qa","Cc","Fc","Jb","yd","ua","parseInt","Ra","cb","RGBA","Sa","size","Va","y","Wc","B","nb","Rc","rb","Uc","Wb","Fa","of","mb","Ad","pf","qf","mc","nc","rf","Dc","oa","Yb","Zb","sc","oc","Bd","va","Cd","tc","Dd","Ed","sf","tf","uf","vf","wf","xf","yf","zf","Af","Bf","Fd","$b","Cf","Df","Ef","Ec","wa","Gd","xc","alert","za","Hd","Id","Jd","Gc","data","Kd","ia","W","pa","offset","Ac","fb","Jc","Nc","gd","hd","Ma","hb","K","R","Ta","Ff","Ca","pb","ob","tb","Kb","Lb","uc","$c","xa","Ld","Ab","Oc","Fb","kb","Hc","Lc","Gf","Hb","yb","Ic","sb","qc","Hf","Zc","Md","Nd","Kc","If","pc","Pc","fc","dd","cd","Mc","Jf","Kf","Lf","Mf","Nf","Za","lb","Ya","wb","Ja","qb","WebPWorkerReset","Qd","Rd","Ud","FinishRow","jb","Od","Of","Pf","Pd","Gb","ib","dc","Xc","Sc","Vc","Sd","ha","H","ca","da","aa","ba","ra","La","Qc","Td","Vd","Wd","Xd","Yd","Zd","$d","ae","be","ce","Qf","db","X","cc","O","Eb","Rf","Sf","de","ee","fe","ge","Tc","Oa","Tf","ea","ab","Xa","he","vb","xb","ac","ie","Uf","$a","Vf","je","zb","zc","yc","eb","WebPWorkerSync","OK","hc","WebPWorkerLaunch","Ib","Na","ec","Bc","ke","le","me","ne","oe","pe","qe","re","se","te","ue","ve","we","Wf","xe","Yc","ye","bd","ze","Ae","Be","Ce","De","Xf","Ee","Yf","EmitRescaledRows","WebPApplyAlphaMultiply","WebPApplyAlphaMultiply4444","Fe","EmitRescaledRowsYUVA","EmitRowsYUVA","Ge","Zf","$f","ag","bg","ad","bb","cg","He","dg","End","Ie","eg","Je","Array","fg","gg","hg","Ke","ig","jg","Le","Me","kg","lg","mg","pg","qg","Oe","Pe","Qe","Re","rg","Se","Te","Ue","Ve","sg","tg","j","ug","vg","wg","xg","We","yg","zg","memory","Ne","InitRGBRescaler","InitYUVRescaler","Xe","ed","Ye","Ag","Bg","Ze","$e","af","bf","cf","ng","AllocateAndInitRescaler","og","Cg","this","value","df","ef","WEBP_CSP_MODE","VP8StatusCode","rotate","WebPGetFeatures","ff","WebPDecoderConfig","input","options","WebPInitDecoderConfig","Math","pow","Eg","Fg","Gg","id","Hg","Ig","Kg","WebPFreeDecBuffer","WebPGetDecoderVersion","abs","WebPDecode","ctx","self","tasks","finishTask","processTasks","task","shift","type","fileName","bytes","payload","convertedBytes","decoder","config","buffer","output","bitstream","status","rgbaData","channels","depth","webp2png","err","console","error","postMessage","addEventListener","event","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","call","x","__webpack_exports__","result","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","Object","keys","every","key","splice","definition","defineProperty","enumerable","get","chunkId","Promise","all","reduce","promises","miniCssF","globalThis","Function","window","obj","prop","prototype","hasOwnProperty","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","replace","oldGetScript","oldLoadScript","queryMap","countMap","catch","retries","realSrc","message","request","resolve","setTimeout","cacheBust","Date","now","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","bind","moreModules","runtime","pop","map","then"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"61.3cfffcdc0849ca3fc87c.chunk.js","mappings":"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,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAGvD,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClC,IAAK,IAAK,KAEZ,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IACnB,IAAK,IAAK,IAAK,IAAK,IAAK,KAE3B,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IACT,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAIzC,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACvC,IAAK,MAGT,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,OAGvD,CACE,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IACxB,IAAK,IAAK,IAAK,IAAK,KAEtB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,MAErD,CACE,CAAC,IAAK,IAAK,IACT,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAErC,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACnD,CAAC,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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/vendor/libwebp-0.2.0.js","webpack://tweb/./src/lib/webp/webp.worker.ts","webpack://tweb/./src/lib/webp/webp.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,866,158].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","// Copyright 2011 Google Inc.\n//\n// This code is licensed under the same terms as WebM:\n// Software License Agreement: http://www.webmproject.org/license/software/\n// Additional IP Rights Grant: http://www.webmproject.org/license/additional/\n// -----------------------------------------------------------------------------\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\n// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// -----------------------------------------------------------------------------\n//\n// Copyright 2011-2013 Dominik Homberger\n// Libwebp Javascript / libwebpjs - the libwebp implementation in javascript (v0.2.0)\n//\n// Author: Dominik Homberger (dominik.homberger@gmail.com)\n\nlet i;\nlet a;\nlet self;\nconst ca = 0;\nconst p = null;\nconst s = 0;\nconst x = 0;\nconst la = s;\nconst E = s;\nconst bb = 0;\nconst Mb = 0;\n\nfunction M(F) {\n return JSON.parse(JSON.stringify(F));\n}\n\nfunction N(F, G, w, D, S) {\n for (i = 0; i < S; ++i) F[G + i] = w[D + i];\n}\n\nfunction Nb(F) {\n const G = [];\n const w = F.length;\n let D;\n for (D = 0; D < w; ++D) G.push(F[D]);\n return G;\n}\n\nfunction ic(F, G) {\n const w = [];\n w.push(M(F));\n let D;\n for (D = 0; D < G; ++D) w.push(M(F));\n w.push(0);\n return w;\n}\n\nfunction rc(F, G) {\n const w = [];\n let D;\n for (D = 0; D < G; ++D) w.push(F);\n w.push(0);\n return w;\n}\n\nfunction memmove(arr1, index1, arr2, index2, length) {\n let i;\n for (i = 0; i < length; i++) {\n arr1[index1 + i] = arr2[index2 + i];\n }\n}\n\nfunction jd(F, G, w, D) {\n let S;\n for (S = 0; S < D; ++S) F[G + S] = w;\n}\n\nfunction kd(F, G, w, D) {\n let S = '';\n let ga;\n for (ga = 0; ga < D; ++ga) S += String.fromCharCode(F[G + ga]);\n return w == S ? 0 : 1;\n}\n\nfunction U(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(G);\n return D;\n}\n\nfunction ld(F, G) {\n let w; const\n D = [];\n for (w = 0; w < F; ++w) D.push(M(G));\n return D;\n}\n\nfunction md(F, G) {\n let w;\n for (w = F.length - 1; w >= 0; --w) G = M(U(F[w], G));\n return G;\n}\n\nfunction $(F) {\n if (!F) throw Error('assert :P');\n}\nexport const WebPDecoder = function () {\n function F(a) {\n return a == Ob || a == Pb || a == Bb || a == Qb;\n }\n\n function G(a) {\n return S(a, 1);\n }\n\n function w(a, b) {\n const c = 1 + ((a.la - 1) * b >> 8);\n const d = c << 8;\n let e = s;\n a.Z >= d ? (e = 1, a.la -= c, a.Z -= d) : (e = 0, a.la = c);\n for (; a.la < 128;) a.Z <<= 1, a.la <<= 1, ++a.gc == 8 && (a.gc = 0, a.bc && (a.Z += a.qa[a.Ia++], a.bc--));\n return e;\n }\n\n function D(a, b, c, d) {\n d -= c;\n d >= 2 ? (a.Z = b[c + 0] << 8 | b[c + 1], a.qa = b, a.Ia = c + 2, a.bc = d - 2) : (a.Z = 0, a.qa = p, a.bc = 0);\n a.la = 255;\n a.gc = 0;\n }\n\n function S(a, b) {\n for (var c = 0, d = s, d = b - 1; d >= 0; d--) c |= w(a, 128) << d;\n return c;\n }\n\n function ga(a, b) {\n const c = S(a, b);\n return G(a) ? -c : c;\n }\n\n function Rb(a, b, c, d) {\n let e = Mb;\n $(a != p);\n $(b != p);\n $(d < 4294967288);\n a.qa = b;\n a.Ia = c;\n a.ya = d;\n a.T = 0;\n a.Q = 0;\n a.g = 0;\n a.L = 0;\n for (e = a.fa = 0; e < 4 && e < a.ya; ++e) a.T |= a.qa[a.Ia + a.Q] << 8 * e, ++a.Q;\n }\n\n function Sb(a) {\n for (; a.g >= 8 && a.Q < a.ya;) a.T >>>= 8, a.T += a.qa[a.Ia + a.Q] << 24 >>> 0, ++a.Q, a.g -= 8;\n }\n\n function Da(a) {\n a.g >= 8 && Sb(a);\n a.Q == a.ya && a.g == 32 && (a.L = 1);\n }\n\n function T(a, b) {\n let c = 0;\n $(b >= 0);\n if (!a.L && b < gf) {\n if (a.Q == a.ya && a.g + b >= 32 && (a.L = 1, a.g + b > 32)) return c;\n c = a.T >> a.g & hf[b];\n a.g += b;\n a.g >= 8 && a.g >= 8 && Sb(a);\n } else a.fa = 1;\n return c;\n }\n\n function ma(a) {\n return a.Pa == a.gb;\n }\n\n function nd(a, b) {\n $(a != p);\n if (b == 0) return 0;\n a.gb = 2 * b - 1;\n a.Y = ld(a.gb, jf);\n if (a.Y == p) return 0;\n a.Y[0].s = -1;\n return a.Pa = 1;\n }\n\n function ja(a) {\n a != p && (a.Y = p, a.Y = p, a.gb = 0, a.Pa = 0);\n }\n\n function jc(a, b, c, d) {\n for (var e = a.Y, g = 0, k = +a.gb; d-- > 0;) {\n if (g >= k) return 0;\n if (e[g].s < 0) {\n if (ma(a)) return 0;\n const h = a;\n const n = h.Y;\n const l = +h.Pa;\n e[g].s = l - g;\n h.Pa += 2;\n n[l + 0].s = -1;\n n[l + 1].s = -1;\n } else if (e[g].s == 0) return 0;\n g += e[g].s + (c >> d & 1);\n }\n if (e[g].s < 0) e[g].s = 0;\n else if (e[g].s != 0) return 0;\n e[g].kc = b;\n return 1;\n }\n\n function od(a, b, c) {\n var d = s;\n let e = 0;\n let g = 0;\n $(a != p);\n $(b != p);\n for (d = 0; d < c; ++d) b[d] > 0 && (++e, g = d);\n if (!nd(a, e)) return 0;\n if (e == 1) return g < 0 || g >= c ? (ja(a), 0) : jc(a, g, 0, 0);\n e = 0;\n g = U(c, s);\n if (g == p) return (e = e && ma(a)) || ja(a), e;\n var k = s;\n var k = s;\n var d = U(Tb + 1, 0);\n let h = s;\n const n = U(Tb + 1, 0);\n let l = 0;\n $(b != p);\n $(c > 0);\n $(g != p);\n for (k = 0; k < c; ++k) b[k] > l && (l = b[k]);\n if (l > Tb) d = 0;\n else {\n for (k = 0; k < c; ++k) ++d[b[k]];\n h = d[0] = 0;\n n[0] = -1;\n for (k = 1; k <= l; ++k) h = h + d[k - 1] << 1, n[k] = h;\n for (k = 0; k < c; ++k) g[k] = b[k] > 0 ? n[b[k]]++ : pd;\n d = 1;\n }\n if (!d) return (e = e && ma(a)) || ja(a), e;\n for (d = 0; d < c; ++d) {\n if (b[d] > 0 && !jc(a, d, g[d], b[d])) {\n return (e = e && ma(a)) || ja(a), e;\n }\n }\n (e = ma(a)) || ja(a);\n return e;\n }\n\n function Ea(a, b, c, d, e, g, k) {\n for (var h = s, h = 0; h < k; ++h) e[g + h] = a[b + h] + c[d + h] & 255;\n }\n\n function qd(a, b, c) {\n const d = a.P.l;\n if (!(c = b < 0 || c < 0 || b + c > a.P.v)) {\n if (c = b == 0) {\n a: {\n let e = a.Ga;\n var g = a.G;\n var k = a.ub;\n c = a.P.l;\n let h = a.P.v;\n const n = a.Xb;\n var l = [p];\n let m = p;\n let f = h * c;\n var q = p;\n var r = p;\n var r = 'WEBP_FILTER_TYPE';\n let u = s;\n var l = s;\n var v = 0;\n let C = s;\n $(c > 0 && h > 0 && d >= c);\n $(e != p && n != p);\n if (k <= Ub) c = 0;\n else if (C = e[g + 0] >> 0 & 3, r = e[g + 0] >> 2 & 3, u = e[g + 0] >> 4 & 3, l = e[g + 0] >> 6 & 3, C < kc || C > kf || r >= lf || u > rd || l != 0) c = 0;\n else {\n if (C == kc) v = k >= f, l = e, m = g + Ub;\n else {\n l = U(f, 0);\n m = 0;\n if (l\n == p) {\n c = 0;\n break a;\n }\n var v = g + Ub;\n var k = k - Ub;\n var g = l;\n var q = M(Vb);\n let A = 0;\n const z = sd();\n z == p ? v = 0 : (z.l = c, z.v = h, z.N = q, td(na), q.put = ud, q.Mb = vd, q.Pb = wd, q.ka = p, q.ka = g, q.fd = 0, q.width = c, q.height = h, z.a = L, Rb(z.o, e, v, k), z.Wa = Cb, Ka(c, h, 1, z, p) && xd(z, c) && (z.Wa = Db, A = lc(z, z.V, z.Ha, z.l, z.v, mf)), z != p && sa(z), v = A);\n }\n if (v) {\n e = nf[r];\n e != p ? (q = U(f, 0), r = 0, q == p && (v = 0, C != kc && (m = l = p)), e(l, m, c, h, 1, c, q, r), f = q, C = r) : (f = l, C = m);\n for (e = 0; h-- > 0;) N(n, e, f, C, c), C += c, e += d;\n u == rd && (v = l == p || m <= 0 || c <= 0 ? 0 : 1);\n }\n c = v;\n }\n }\n c = !c;\n }\n }\n return c ? p : b == 0 ? a.Xb : +b * d;\n }\n\n function of(a) {\n let b = a.width;\n const c = a.height;\n let d = a.J;\n if (b <= 0 || c <= 0 || !(d >= Qa && d < Cc)) return ta;\n if (!a.Fc && a.Jb == p) {\n var e = p;\n var g = 0;\n var k = 0;\n var h = 0;\n var n = 0;\n var e = bb;\n var l = b * yd[d];\n var m = l * c;\n d < ua || (g = parseInt((b + 1) / 2, 10), h = g * parseInt((c + 1) / 2, 10), d == Ra && (k = b, n = k * c));\n e = m + 2 * h + n;\n if (e != e) return ta;\n e = U(e, 205);\n if (e == p) return cb;\n a.Jb = e;\n a.jc = p;\n d < ua ? (b = a.c.RGBA, b.ma = e, b.Sa = p, b.f = l, b.size = m) : (b = a.c.Va, b.y = e, b.D = p, b.F = l, b.Wc = m, b.c = e, b.B = p + m, b.nb = g, b.Rc = h, b.S = e, b.C = p + m + h, b.rb = g, b.Uc = h, d == Ra && (b.p = e, b.q = p + m + 2 * h), b.Wb = n, b.Fa = k);\n }\n d = 1;\n g = a.J;\n k = a.width;\n h = a.height;\n g >= Qa && g < Cc ? g < ua ? (a = a.c.RGBA, d\n &= a.f * h <= a.size, d &= a.f >= k * yd[g], d &= a.ma != p) : (a = a.c.Va, n = a.nb * parseInt((h + 1) / 2, 10), l = a.rb * parseInt((h + 1) / 2, 10), m = a.Fa * h, d &= a.F * h <= a.Wc, d &= n <= a.Rc, d &= l <= a.Uc, d &= m <= a.Wb, d &= a.F >= k, d &= a.nb >= parseInt((k + 1) / 2, 10), d &= a.rb >= parseInt((k + 1) / 2, 10), d &= a.y != p, d &= a.c != p, d &= a.S != p, g == Ra && (d &= a.Fa >= k, d &= m <= a.Wb, d &= a.p != p)) : d = 0;\n return d ? L : ta;\n }\n\n function zd(a, b, c, d) {\n if (d == p || a <= 0 || b <= 0) return ta;\n if (c != p) {\n if (c.Ua) {\n const e = c.wc;\n const g = c.vc;\n const k = c.t & -2;\n const h = c.k & -2;\n if (k < 0 || h < 0 || e <= 0 || g <= 0 || k + e > a || h + g > b) return ta;\n a = e;\n b = g;\n }\n if (c.I) {\n if (c.Ba <= 0\n || c.Aa <= 0) return ta;\n a = c.Ba;\n b = c.Aa;\n }\n }\n d.width = a;\n d.height = b;\n return of(d);\n }\n\n function mb(a) {\n return !(a & -256) ? a : a < 0 ? 0 : 255;\n }\n\n function Ad(a, b, c, d) {\n const e = U(16, 0);\n let g;\n g = 0;\n let k;\n for (k = 0; k < 4; ++k) {\n var h = a[b + 0] + a[b + 8];\n var n = a[b + 0] - a[b + 8];\n var l = (a[b + 4] * Wb >> 16) - (a[b + 12] * Xb >> 16);\n var m = (a[b + 4] * Xb >> 16) + (a[b + 12] * Wb >> 16);\n e[g + 0] = h + m;\n e[g + 1] = n + l;\n e[g + 2] = n - l;\n e[g + 3] = h - m;\n g += 4;\n b++;\n }\n for (k = g = 0; k < 4; ++k) {\n a = e[g + 0] + 4, h = a + e[g + 8], n = a - e[g + 8], l = (e[g + 4] * Wb >> 16) - (e[g + 12] * Xb >> 16), m = (e[g + 4] * Xb >> 16) + (e[g + 12] * Wb >> 16), c[d + 0 + 0 * f] = mb(c[d + 0 + 0 * f] + (h + m >> 3)), c[d + 1 + 0 * f] = mb(c[d\n + 1 + 0 * f] + (n + l >> 3)), c[d + 2 + 0 * f] = mb(c[d + 2 + 0 * f] + (n - l >> 3)), c[d + 3 + 0 * f] = mb(c[d + 3 + 0 * f] + (h - m >> 3)), g++, d += f;\n }\n }\n\n function pf(a, b, c, d, e) {\n Ad(a, b, c, d);\n e && Ad(a, b + 16, c, d + 4);\n }\n\n function qf(a, b, c, d) {\n mc(a, b + 0, c, d + 0, 1);\n mc(a, b + 32, c, d + 4 * f, 1);\n }\n\n function nc(a, b, c, d) {\n a = a[b + 0] + 4;\n let e;\n for (e = 0; e < 4; ++e) for (b = 0; b < 4; ++b) c[d + b + e * f] = mb(c[d + b + e * f] + (a >> 3));\n }\n\n function rf(a, b, c, d) {\n a[b + 0] && nc(a, b + 0, c, d + 0);\n a[b + 16] && nc(a, b + 16, c, d + 4);\n a[b + 32] && nc(a, b + 32, c, d + 4 * f);\n a[b + 48] && nc(a, b + 48, c, d + 4 * f + 4);\n }\n\n function Dc(a, b, c) {\n const d = b - f;\n const e = oa;\n const g = 255 - a[d - 1];\n let k;\n for (k = 0; k\n < c; ++k) {\n const h = e;\n const n = g + a[b - 1];\n var l;\n for (l = 0; l < c; ++l) a[b + l] = h[n + a[d + l]];\n b += f;\n }\n }\n\n function Yb(a, b, c) {\n let d;\n for (d = 0; d < 16; ++d) for (i = 0; i < 16; ++i) b[c + d * f + i] = a;\n }\n\n function y(a, b, c) {\n return a + 2 * b + c + 2 >> 2;\n }\n\n function Zb(a, b, c) {\n let d; let\n e;\n for (d = 0; d < 8; ++d) for (e = 0; e < 8; ++e) b[c + e + d * f] = a;\n }\n\n function nb(a, b, c) {\n const d = a[b - c];\n const e = a[b + 0];\n const g = 3 * (e - d) + sc[1020 + a[b - 2 * c] - a[b + c]];\n const k = oc[112 + (g + 4 >> 3)];\n a[b - c] = oa[255 + d + oc[112 + (g + 3 >> 3)]];\n a[b + 0] = oa[255 + e - k];\n }\n\n function Bd(a, b, c, d) {\n const e = a[b + 0];\n const g = a[b + c];\n return va[255 + a[b - 2 * c] - a[b - c]] > d || va[255 + g - e] > d;\n }\n\n function Cd(a,\n b, c, d, e) {\n const g = a[b - 3 * c];\n const k = a[b - 2 * c];\n const h = a[b - c];\n const n = a[b + 0];\n const l = a[b + c];\n const m = a[b + 2 * c];\n const f = a[b + 3 * c];\n return 2 * va[255 + h - n] + tc[255 + k - l] > d ? 0 : va[255 + a[b - 4 * c] - g] <= e && va[255 + g - k] <= e && va[255 + k - h] <= e && va[255 + f - m] <= e && va[255 + m - l] <= e && va[255 + l - n] <= e;\n }\n\n function Dd(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e - c] - a[b + e + 0]] + tc[255 + a[b + e - 2 * c] - a[b + e + c]] <= d && nb(a, b + e, c);\n }\n\n function Ed(a, b, c, d) {\n let e;\n for (e = 0; e < 16; ++e) 2 * va[255 + a[b + e * c - 1] - a[b + e * c + 0]] + tc[255 + a[b + e * c - 2] - a[b + e * c + 1]] <= d && nb(a, b + e * c, 1);\n }\n\n function sf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) {\n b\n += 4 * c, Dd(a, b + 0, c, d);\n }\n }\n\n function tf(a, b, c, d) {\n let e;\n for (e = 3; e > 0; --e) b += 4, Ed(a, b + 0, c, d);\n }\n\n function Fa(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c, g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - 2 * m];\n const q = n[l - m];\n const r = n[l + 0];\n const u = n[l + m];\n const v = n[l + 2 * m];\n var C = sc[1020 + 3 * (r - q) + sc[1020 + f - u]];\n const A = 27 * C + 63 >> 7;\n const z = 18 * C + 63 >> 7;\n var C = 9 * C + 63 >> 7;\n n[l - 3 * m] = oa[255 + n[l - 3 * m] + C];\n n[l - 2 * m] = oa[255 + f + z];\n n[l - m] = oa[255 + q + A];\n n[l + 0] = oa[255 + r - A];\n n[l + m] = oa[255 + u - z];\n n[l + 2 * m] = oa[255 + v - C];\n }\n }\n b += d;\n }\n }\n\n function Ga(a, b, c, d, e, g, k, h) {\n for (; e-- > 0;) {\n if (Cd(a, b + 0, c,\n g, k)) {\n if (Bd(a, b + 0, c, h)) nb(a, b + 0, c);\n else {\n const n = a;\n const l = b + 0;\n const m = c;\n const f = n[l - m];\n const q = n[l + 0];\n const r = n[l + m];\n var u = 3 * (q - f);\n const v = oc[112 + (u + 4 >> 3)];\n var u = oc[112 + (u + 3 >> 3)];\n const C = v + 1 >> 1;\n n[l - 2 * m] = oa[255 + n[l - 2 * m] + C];\n n[l - m] = oa[255 + f + u];\n n[l + 0] = oa[255 + q - v];\n n[l + m] = oa[255 + r - C];\n }\n }\n b += d;\n }\n }\n\n function uf(a, b, c, d, e, g) {\n Fa(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function vf(a, b, c, d, e, g) {\n Fa(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function wf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4 * c, Ga(a, b + 0, c, 1, 16, d, e, g);\n }\n\n function xf(a, b, c, d, e, g) {\n let k;\n for (k = 3; k > 0; --k) b += 4, Ga(a, b + 0, 1, c, 16, d, e, g);\n }\n\n function yf(a, b, c, d, e,\n g, k, h) {\n Fa(a, b, e, 1, 8, g, k, h);\n Fa(c, d, e, 1, 8, g, k, h);\n }\n\n function zf(a, b, c, d, e, g, k, h) {\n Fa(a, b, 1, e, 8, g, k, h);\n Fa(c, d, 1, e, 8, g, k, h);\n }\n\n function Af(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4 * e, e, 1, 8, g, k, h);\n Ga(c, d + 4 * e, e, 1, 8, g, k, h);\n }\n\n function Bf(a, b, c, d, e, g, k, h) {\n Ga(a, b + 4, 1, e, 8, g, k, h);\n Ga(c, d + 4, 1, e, 8, g, k, h);\n }\n\n function Fd(a, b) {\n return b == $b ? a.i == 0 ? a.d == 0 ? Cf : Df : a.d == 0 ? Ef : $b : b;\n }\n\n function Ec(a, b, c, d) {\n for (i = 0; i < 4; ++i) a[b + i] = c[d + i];\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function Gd(a) {\n a.a = 'VP8_STATUS_OK';\n a.xc = 'OK';\n }\n\n function td(a) {\n a >>> 8 != na >>> 8 && alert('mismatch error');\n }\n\n function Y(a, b, c) {\n a.a == L && (a.a = b, a.xc = c, a.za = 0);\n // alert(b + \": \" + c);\n return 0;\n }\n\n function Hd(a, b) {\n let c = [0];\n let d = x;\n var e = [Mb];\n var g = M(Id);\n var k = M(Jd);\n let h = M(Fc);\n var e = 'VP8StatusCode';\n var g = M(Gc);\n if (a == p) return alert('(dec == null)'), 0;\n Gd(a);\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'null VP8Io passed to VP8GetHeaders()');\n g.data = b.data;\n g.b = b.b;\n g.e = b.e;\n g.b = [g.b];\n g.e = [g.e];\n g = [g];\n e = Kd(g);\n if (e != L) return Y(a, e, 'Incorrect/incomplete header.');\n g = g[0];\n g.b = g.b[0];\n g.e = g.e[0];\n if (g.ia) return Y(a, W, 'Unexpected lossless format encountered.');\n a.Ga == p && ($(a.ub == 0), a.Ga = g.$, a.G = g.G, a.ub = g.pa);\n d = g.data;\n c = g.b + g.offset;\n e = g.e - g.offset;\n $(g.e >= g.offset);\n if (e[0] < 4) return Y(a, Z, 'Truncated header.');\n h = d[c + 0] | d[c + 1] << 8 | d[c + 2] << 16;\n g = a.Ac;\n g.fb = !(h & 1) + 0;\n g.Jc = h >> 1 & 7;\n g.Nc = h >> 4 & 1;\n g.Ra = h >> 5;\n if (g.Jc > 3) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Incorrect keyframe parameters.');\n if (!g.Nc) return Y(a, 'VP8_STATUS_UNSUPPORTED_FEATURE', 'Frame not displayable.');\n c += 3;\n e -= 3;\n k = a.P;\n if (g.fb) {\n if (e < 7) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'cannot parse picture header');\n if (!(e\n >= 3 && d[c + 0] == 157 && d[c + 1] == 1 && d[c + 2] == 42)) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'Bad code word');\n k.l = (d[c + 4] << 8 | d[c + 3]) & 16383;\n k.gd = d[c + 4] >> 6;\n k.v = (d[c + 6] << 8 | d[c + 5]) & 16383;\n k.hd = d[c + 6] >> 6;\n c += 7;\n e -= 7;\n a.Ma = k.l + 15 >> 4;\n a.hb = k.v + 15 >> 4;\n b.width = k.l;\n b.height = k.v;\n b.I = 0;\n b.Ua = 0;\n b.k = 0;\n b.t = 0;\n b.Ka = b.width;\n b.K = b.height;\n b.m = b.width;\n b.h = b.height;\n h = a.R;\n for (i = 0; i < h.Ta.length; ++i) h.Ta[i] = 255;\n h.z = M(Ff);\n h = a.Ca;\n $(h != p);\n h.pb = 0;\n h.ob = 0;\n h.tb = 1;\n for (i = 0; i < h.Kb.length; ++i) h.Kb[i] = 0;\n for (i = 0; i < h.Cb.length; ++i) h.Cb[i] = 0;\n a.Lb = 0;\n }\n if (g.Ra\n > e) return Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA', 'bad partition length');\n h = a.o;\n D(h, d, c, c + g.Ra);\n c += g.Ra;\n e -= g.Ra;\n g.fb && (k.uc = G(h), k.$c = G(h));\n var k = h;\n var n = a.Ca;\n let l = a.R;\n $(k != p);\n $(n != p);\n n.pb = G(k);\n if (n.pb) {\n n.ob = G(k);\n if (G(k)) {\n var m;\n n.tb = G(k);\n for (m = 0; m < xa; ++m) n.Kb[m] = G(k) ? ga(k, 7) : 0;\n for (m = 0; m < xa; ++m) n.Cb[m] = G(k) ? ga(k, 6) : 0;\n }\n if (n.ob) for (m = 0; m < Ld; ++m) l.Ta[m] = G(k) ? S(k, 8) : 255;\n } else n.ob = 0;\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse segment header');\n k = h;\n n = a.ga;\n n.Oc = G(k);\n n.Fb = S(k, 6);\n n.kb = S(k, 3);\n n.oc = G(k);\n if (n.oc\n && G(k)) {\n for (l = 0; l < Hc; ++l) G(k) && (n.Lc[l] = ga(k, 6));\n for (l = 0; l < Gf; ++l) G(k) && (n.Gc[l] = ga(k, 6));\n }\n a.A = n.Fb == 0 ? 0 : n.Oc ? 1 : 2;\n if (a.A > 0) {\n if (a.Ca.pb) for (l = 0; l < xa; ++l) m = a.Ca.Cb[l], a.Ca.tb || (m += n.Fb), a.Zb[l] = m;\n else a.Zb[0] = n.Fb;\n }\n if (k.Ab) return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse filter header');\n var k = d;\n var f = c;\n var n = f;\n var e = f + e;\n m = 0;\n let q = s;\n let r = s;\n a.Hb = 1 << S(a.o, 2);\n q = a.Hb - 1;\n l = k;\n m = f + 3 * q;\n if (e < m) e = 'VP8_STATUS_NOT_ENOUGH_DATA';\n else {\n for (r = 0; r < q; ++r) {\n var f = l;\n var u = m + (k[n + 0] | k[n + 1] << 8 | k[n + 2] << 16);\n u > e && (f = k);\n D(a.ic[+r], l, m, u);\n l = f;\n m = u;\n n += 3;\n }\n D(a.ic[+q], l, m, e);\n e = m < e ? 'VP8_STATUS_OK' : 'VP8_STATUS_SUSPENDED';\n }\n if (e != 'VP8_STATUS_OK') return Y(a, 'VP8_STATUS_BITSTREAM_ERROR', 'cannot parse partitions');\n q = a.o;\n e = S(q, 7);\n k = G(q) ? ga(q, 4) : 0;\n n = G(q) ? ga(q, 4) : 0;\n l = G(q) ? ga(q, 4) : 0;\n m = G(q) ? ga(q, 4) : 0;\n q = G(q) ? ga(q, 4) : 0;\n r = a.Ca;\n f = s;\n for (f = 0; f < xa; ++f) {\n u = s;\n if (r.pb) u = r.Kb[f], r.tb || (u += e);\n else if (f > 0) {\n a.yb[f] = a.yb[0];\n continue;\n } else u = e;\n const v = a.yb[f];\n v.sc[0] = Ic[wa(u + k, 127)];\n v.sc[1] = Jc[wa(u + 0, 127)];\n v.sb[0] = 2 * Ic[wa(u + n, 127)];\n v.sb[1] = 101581 * Jc[wa(u + l, 127)] >> 16;\n v.sb[1] < 8\n && (v.sb[1] = 8);\n v.qc[0] = Ic[wa(u + m, 117)];\n v.qc[1] = Jc[wa(u + q, 127)];\n }\n if (g.fb) a.Zc = 259;\n else return Y(a, Hf, 'Not a key frame.');\n G(h);\n e = a.R;\n for (k = 0; k < Md; ++k) for (n = 0; n < Nd; ++n) for (l = 0; l < Kc; ++l) for (m = 0; m < Lc; ++m) w(h, If[k][n][l][m]) && (e.z[k][n][l][m] = S(h, 8));\n a.pc = G(h);\n a.pc && (a.Pc = S(h, 8));\n if (a.P.uc) {\n c -= 8;\n h = Mb;\n if (g.Ra < 8 || d[c + 8 - 1] != 1) return Y(a, W, 'RIFF: Inconsistent extra information.');\n h = d[c + 0] << 0 | d[c + 1] << 8 | d[c + 2] << 16;\n a.fc = h;\n a.dd = p;\n a.cd = d[c + 3];\n }\n return a.za = 1;\n }\n\n function Mc(a, b, c, d, e, g) {\n let k = b[e][c];\n if (!w(a, k[0])) return 0;\n for (;;) {\n ++e;\n if (w(a, k[1])) {\n var h;\n if (w(a, k[2])) {\n if (w(a, k[3])) {\n if (w(a, k[6])) {\n h = x;\n c = w(a, k[8]);\n k = w(a, k[9 + c]);\n k = 2 * c + k;\n c = 0;\n h = Jf[k];\n var n;\n for (n = 0; n < h.length - 1; ++n) c += c + w(a, h[n]);\n c += 3 + (8 << k);\n } else w(a, k[7]) ? (c = 7 + 2 * w(a, 165), c += w(a, 145)) : c = 5 + w(a, 159);\n } else c = w(a, k[4]) ? 3 + w(a, k[5]) : 2;\n k = b[Nc[e]][2];\n } else k = b[Nc[e]][1], c = 1;\n h = Kf[e - 1];\n g[g[g.length - 1] + h] = (w(a, 128) ? -c : c) * d[(h > 0) + 0];\n if (e == 16 || !w(a, k[0])) return e;\n } else k = b[Nc[e]][0];\n if (e == 16) return 16;\n }\n }\n\n function ob(a, b) {\n return ((16777216 * a[0] + 65536 * a[1] + 256 * a[2] + 1 * a[3]) * Lf\n & 4278190080) >> b;\n }\n\n function Mf(a, b) {\n let c = 0;\n if (a == p) return 0;\n if (b == p) return Y(a, 'VP8_STATUS_INVALID_PARAM', 'NULL VP8Io parameter in VP8Decode().');\n if (!a.za && !Hd(a, b)) return 0;\n $(a.za);\n let d;\n if (b.Mb && !b.Mb(b)) Y(a, Nf, 'Frame setup failed'), d = a.a;\n else {\n b.Za && (a.A = 0);\n const e = uc[a.A];\n a.A == 2 ? (a.lb = 0, a.mb = 0) : (a.lb = b.t - e >> 4, a.mb = b.k - e >> 4, a.lb < 0 && (a.lb = 0), a.mb < 0 && (a.mb = 0));\n a.Ya = b.K + 15 + e >> 4;\n a.wb = b.Ka + 15 + e >> 4;\n a.wb > a.Ma && (a.wb = a.Ma);\n a.Ya > a.hb && (a.Ya = a.hb);\n d = L;\n }\n if (c = d == L) {\n if (c) {\n let g;\n b: {\n a.Ja = 0;\n if (a.qb) {\n const k = a.rc;\n if (!WebPWorkerReset(k)) {\n g = Y(a, cb, 'thread initialization failed.');\n break b;\n }\n k.Qd = a;\n k.Rd = a.oa.N;\n k.Ud = FinishRow;\n a.jb = a.A > 0 ? Od : Od - 1;\n } else a.jb = Of;\n g = 1;\n }\n let h;\n if (!(h = !g)) {\n let n;\n b: {\n const l = a.jb;\n const m = a.Ma;\n const t = 4 * m;\n const q = 32 * m;\n const r = m + 1;\n const u = a.A > 0 ? m * (a.qb ? 2 : 1) : 0;\n const v = Pf;\n const C = q * (16 * l + parseInt(3 * uc[a.A] / 2, 10));\n const A = a.Ga != p ? a.P.l * a.P.v : 0;\n const z = t + q + r + u + v + 384 + C + A + Pd;\n if (z != z) n = 0;\n else {\n if (z > a.Gb) {\n a.ib = 0;\n a.Gb = 0;\n if (a.ib == p) {\n n = Y(a, 'VP8_STATUS_OUT_OF_MEMORY', 'no memory during frame initialization.');\n break b;\n }\n a.Gb = z;\n }\n a.dc = 205;\n a.Xc = rc(205, 16 * m);\n a.Sc = rc(205, 8 * m);\n a.Vc = rc(205, 8 * m);\n a.M = u ? ic(Oc, u) : p;\n a.Sd = u ? 0 : p;\n a.oa.ha = 0;\n a.oa.M = a.M;\n $((v & Pd) == 0);\n a.Ea = rc(205, 1 * v);\n a.z = -12851;\n a.H = 16 * m;\n a.r = 8 * m;\n const Ha = uc[a.A];\n const G = Ha * a.H;\n const y = Ha / 2 * a.r;\n a.ca = U(C, 205);\n a.da = +G;\n a.aa = a.ca;\n a.ba = a.da + 16 * l * a.H + y;\n a.ra = a.aa;\n a.sa = a.ba + 8 * l * a.r + y;\n a.Xb = A ? U(A, x) : p;\n a.La = ic(Qd, r);\n a.dc = rc($b, t);\n n = 1;\n }\n }\n h = !n;\n }\n if (h) c = 0;\n else {\n b.width = a.P.l;\n b.height = a.P.v;\n b.w = 0;\n b.y = a.ca;\n b.D = a.da;\n b.c = a.aa;\n b.B = a.ba;\n b.S = a.ra;\n b.C = a.sa;\n b.F = a.H;\n b.Da = a.r;\n b.p = p;\n b.q = p;\n if (!Rd) {\n let B;\n for (B = -255; B <= 255; ++B) va[255 + B] = B < 0 ? -B : B, tc[255 + B] = va[255 + B] >> 1;\n for (B = -1020; B\n <= 1020; ++B) sc[1020 + B] = B < -128 ? -128 : B > 127 ? 127 : B;\n for (B = -112; B <= 112; ++B) oc[112 + B] = B < -16 ? -16 : B > 15 ? 15 : B;\n for (B = -255; B <= 510; ++B) oa[255 + B] = B < 0 ? 0 : B > 255 ? 255 : B;\n Rd = 1;\n }\n mc = pf;\n Pc = qf;\n Qc = nc;\n Rc = rf;\n Sd = uf;\n Td = vf;\n Ud = yf;\n Vd = zf;\n Wd = wf;\n Xd = xf;\n Yd = Af;\n Zd = Bf;\n $d = Dd;\n ae = Ed;\n be = sf;\n ce = tf;\n c = 1;\n }\n }\n if (c) {\n a: {\n for (a.d = 0; a.d < a.Ya; ++a.d) {\n const Qf = a.ic[a.d & a.Hb - 1];\n const db = a;\n const F = db.La[0];\n F.X = 0;\n F.ua = 0;\n jd(db.cc, 0, $b, db.cc.length);\n db.W = (db.A > 0 && db.d >= db.mb && db.d <= db.Ya) + 0;\n for (a.i = 0; a.i < a.Ma; a.i++) {\n var D;\n const H = a;\n const T = Qf;\n const ya = H.o;\n const S = H.La[0];\n const J = H.La[1 + H.i];\n H.Ca.ob && (H.Lb = !w(ya,\n H.R.Ta[0]) ? 0 + w(ya, H.R.Ta[1]) : 2 + w(ya, H.R.Ta[2]));\n J.Nb = H.pc ? w(ya, H.Pc) : 0;\n const O = H.dc;\n O[O.length - 1] = 0 + 4 * H.i;\n const Sc = H.cc;\n H.wa = !w(ya, 145);\n if (H.wa) {\n for (var ga = H.Eb, ja = 0, Z = ca, Z = 0; Z < 4; ++Z) {\n var V = Sc[Z];\n var R;\n for (R = 0; R < 4; ++R) {\n const ta = Rf[O[O[O.length - 1] + R]][V];\n var za = 0;\n do za = Sf[2 * za + w(ya, ta[za])]; while (za > 0);\n V = -za;\n O[O[O.length - 1] + R] = V;\n ga[ja] = V;\n ja++;\n }\n Sc[Z] = V;\n }\n } else {\n var V = w(ya, 156) ? w(ya, 128) ? de : ee : w(ya, 163) ? fe : ge;\n H.Eb[0] = V;\n for (za = 0; za < 4; ++za) O[za + O[O.length - 1]] = V;\n for (za = 0; za < 4; ++za) Sc[za] = V;\n }\n H.Tc = !w(ya, 142) ? ge : !w(ya, 114) ? fe\n : w(ya, 183) ? de : ee;\n if (ya.Ab) D = 0;\n else {\n if (J.Nb) S.X = J.X = 0, H.wa || (S.ua = J.ua = 0), H.ja = 0, H.Oa = 0;\n else {\n let ia = ca;\n let ka = ca;\n var sa = ca;\n var wa = Tf;\n const Aa = H.yb[H.Lb];\n var aa = H.z;\n const ma = H.La[0];\n const ua = U(4, 0);\n const xa = U(4, 0);\n let ea = U(4, 0);\n let pb = U(4, 0);\n let na = 0;\n let Ba = 0;\n var pa = ca;\n let qa = ca;\n let Sa = ca;\n var aa = rc(0, 384);\n if (H.wa) sa = 0, wa = H.R.z[3];\n else {\n const ab = U(16, 0);\n var Ca = J.ua + ma.ua;\n J.ua = ma.ua = (Mc(T, H.R.z[1], Ca, Aa.sb, 0, ab) > 0) + 0;\n for (var sa = 1, wa = H.R.z[0], qb = ab, Ta = aa, La = U(16, s), X = s, X = 0; X < 4; ++X) {\n var Da = qb[0 + X] + qb[12 + X];\n var Ea = qb[4 + X] + qb[8 + X];\n var Fa = qb[4 + X] - qb[8 + X];\n var Ga = qb[0 + X] - qb[12 + X];\n La[0 + X] = Da + Ea;\n La[8\n + X] = Da - Ea;\n La[4 + X] = Ga + Fa;\n La[12 + X] = Ga - Fa;\n }\n for (X = 0; X < 4; ++X) {\n const Oa = Ta[Ta.length - 1];\n const lb = La[0 + 4 * X] + 3;\n var Da = lb + La[3 + 4 * X];\n var Ea = La[1 + 4 * X] + La[2 + 4 * X];\n var Fa = La[1 + 4 * X] - La[2 + 4 * X];\n var Ga = lb - La[3 + 4 * X];\n Ta[Oa + 0] = Da + Ea >> 3;\n Ta[Oa + 16] = Ga + Fa >> 3;\n Ta[Oa + 32] = Da - Ea >> 3;\n Ta[Oa + 48] = Ga - Fa >> 3;\n Ta[Ta.length - 1] += 64;\n }\n aa[aa.length - 1] = 0;\n }\n ea = Nb(vc[J.X & 15]);\n pb = Nb(vc[ma.X & 15]);\n for (qa = 0; qa < 4; ++qa) {\n for (var Eb = pb[qa], pa = 0; pa < 4; ++pa) {\n var Ca = Eb + ea[pa];\n var Ka = Mc(T, wa, Ca, Aa.sc, sa, aa);\n ea[pa] = Eb = (Ka > 0) + 0;\n xa[pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0;\n ua[pa] = (Ka > 1) + 0;\n aa[aa.length\n - 1] += 16;\n }\n pb[qa] = Eb;\n Ba |= ob(xa, 24 - 4 * qa);\n na |= ob(ua, 24 - 4 * qa);\n }\n ia = ob(ea, 24);\n ka = ob(pb, 24);\n ea = Nb(vc[J.X >> 4]);\n pb = Nb(vc[ma.X >> 4]);\n for (Sa = 0; Sa < 4; Sa += 2) {\n for (qa = 0; qa < 2; ++qa) {\n Eb = pb[Sa + qa];\n for (pa = 0; pa < 2; ++pa) Ca = Eb + ea[Sa + pa], Ka = Mc(T, H.R.z[2], Ca, Aa.qc, 0, aa), ea[Sa + pa] = Eb = (Ka > 0) + 0, xa[2 * qa + pa] = (aa[aa[aa.length - 1] + 0] != 0) + 0, ua[2 * qa + pa] = (Ka > 1) + 0, aa[aa.length - 1] += 16;\n pb[Sa + qa] = Eb;\n }\n Ba |= ob(xa, 8 - 2 * Sa);\n na |= ob(ua, 8 - 2 * Sa);\n }\n ia |= ob(ea, 20);\n ka |= ob(pb, 20);\n J.X = ia;\n ma.X = ka;\n H.z = aa;\n H.Oa = na + 0;\n H.ja = na | Ba;\n J.Nb = !H.ja + 0;\n }\n D = !T.Ab;\n }\n if (!D) {\n c = Y(a, 'VP8_STATUS_NOT_ENOUGH_DATA',\n `Premature end-of-file encountered.${a.i} ${a.d}`);\n break a;\n }\n const P = a;\n const da = P.Ea;\n const Ma = Tc;\n const Ua = P.Ea;\n const Va = Uc;\n const Wa = P.Ea;\n const Xa = he;\n if (P.i > 0) {\n for (var ba = ca, ba = -1; ba < 16; ++ba) Ec(da, Ma + ba * f - 4, da, Ma + ba * f + 12);\n for (ba = -1; ba < 8; ++ba) Ec(Ua, Va + ba * f - 4, Ua, Va + ba * f + 4), Ec(Wa, Xa + ba * f - 4, Wa, Xa + ba * f + 4);\n } else {\n for (ba = 0; ba < 16; ++ba) da[Ma + ba * f - 1] = 129;\n for (ba = 0; ba < 8; ++ba) Ua[Va + ba * f - 1] = 129, Wa[Xa + ba * f - 1] = 129;\n P.d > 0 && (da[Ma - 1 - f] = Ua[Va - 1 - f] = Wa[Xa - 1 - f] = 129);\n }\n const Qa = P.Xc;\n const Ra = 16 * +P.i;\n const mb = P.Sc;\n const vb = 8 * +P.i;\n const wb = P.Vc;\n const xb = 8 * +P.i;\n const Za = P.z;\n let fa = ca;\n if (P.d > 0) {\n N(da, Ma - f, Qa, Ra,\n 16), N(Ua, Va - f, mb, vb, 8), N(Wa, Xa - f, wb, xb, 8);\n } else if (P.i == 0) {\n for (i = 0; i < 21; ++i) da[Ma - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Ua[Va - f - 1 + i] = 127;\n for (i = 0; i < 9; ++i) Wa[Xa - f - 1 + i] = 127;\n }\n if (P.wa) {\n const Ya = Ma - f + 16;\n P.d > 0 && (P.i >= P.Ma - 1 ? da[Ya + 0] = da[Ya + 1] = da[Ya + 2] = da[Ya + 3] = Qa[Ra + 15] : N(da, Ya + 0, Qa, Ra + 16, 4));\n for (let Fb = 0; Fb < 4; ++Fb) da[Fb + Ya + 4 * f] = da[Fb + Ya + 4 * f] = da[Fb + Ya + 8 * f] = da[Fb + Ya + 12 * f] = da[Fb + Ya + 0];\n for (fa = 0; fa < 16; fa++) {\n var ac = da;\n var bc = Ma + ie[fa];\n Uf[P.Eb[fa]](ac, bc);\n P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n } else {\n var $a = Fd(P, P.Eb[0]);\n Vf[$a](da, Ma);\n if (P.ja) for (fa = 0; fa < 16; fa++) ac = da, bc = Ma + ie[fa], P.Oa & 1 << fa ? mc(Za, 16 * +fa, ac, bc, 0) : P.ja & 1 << fa && Qc(Za, 16 * +fa, ac, bc);\n }\n $a = Fd(P, P.Tc);\n je[$a](Ua, Va);\n je[$a](Wa, Xa);\n if (P.ja & 983040) {\n const zb = P.z;\n var Pa = 256;\n P.Oa & 983040 ? Pc(zb, Pa, Ua, Va) : Rc(zb, Pa, Ua, Va);\n }\n if (P.ja & 15728640) {\n const Ab = P.z;\n var Pa = 320;\n P.Oa & 15728640 ? Pc(Ab, Pa, Wa, Xa) : Rc(Ab, Pa, Wa, Xa);\n }\n P.d < P.hb - 1 && (N(Qa, Ra, da, Ma + 15 * f, 16), N(mb, vb, Ua, Va + 7 * f, 8), N(wb, xb, Wa, Xa + 7 * f, 8));\n const Q = a;\n if (Q.A > 0) {\n const kb = Q.M[1 + Q.i];\n const Kb = Q.La[1 + Q.i].Nb;\n let ha = Q.Zb[Q.Lb];\n Q.ga.oc && (ha\n += Q.ga.Lc[0], Q.wa && (ha += Q.ga.Gc[0]));\n ha = ha < 0 ? 0 : ha > 63 ? 63 : ha;\n kb.zc = ha;\n Q.ga.kb > 0 && (ha = Q.ga.kb > 4 ? ha >> 2 : ha >> 1, ha > 9 - Q.ga.kb && (ha = 9 - Q.ga.kb));\n kb.yc = ha < 1 ? 1 : ha;\n kb.ab = (!Kb || Q.wa) + 0;\n }\n for (var Ia = ca, Bb = 8 * Q.Ja * Q.r, Qb = Q.ca, Ub = Q.da + 16 * Q.i + 16 * Q.Ja * Q.H, Wb = Q.aa, Xb = Q.ba + 8 * Q.i + Bb, Yb = Q.ra, Zb = Q.sa + 8 * Q.i + Bb, Ia = 0; Ia < 16; ++Ia) N(Qb, Ub + Ia * Q.H, Q.Ea, +Tc + Ia * f, 16);\n for (Ia = 0; Ia < 8; ++Ia) N(Wb, Xb + Ia * Q.r, Q.Ea, +Uc + Ia * f, 8), N(Yb, Zb + Ia * Q.r, Q.Ea, +he + Ia * f, 8);\n }\n const K = a;\n const I = b;\n var cc = 1;\n const eb = K.oa;\n if (K.qb) {\n const nb = K.rc;\n var cc = cc & WebPWorkerSync(nb);\n $(nb.a == OK);\n if (cc) {\n eb.N = I;\n eb.ha = K.Ja;\n eb.d = K.d;\n eb.W = K.W;\n if (eb.W) {\n const hc = eb.M;\n eb.M = K.M;\n K.M = hc;\n }\n WebPWorkerLaunch(nb);\n ++K.Ja == K.jb && (K.Ja = 0);\n }\n } else {\n eb.d = K.d;\n eb.W = K.W;\n b: {\n let Hb = 1;\n const rb = K.oa;\n const ib = uc[K.A];\n const yb = ib * K.H;\n const dc = parseInt(ib / 2) * K.r;\n const Ib = 16 * rb.ha * K.H;\n const jb = 8 * rb.ha * K.r;\n const Jb = K.ca;\n const Lb = K.da - yb + Ib;\n const Ob = K.aa;\n const Pb = K.ba - dc + jb;\n const Rb = K.ra;\n const Sb = K.sa - dc + jb;\n const jc = rb.d == 0;\n const Tb = (rb.d >= K.hb - 1) + 0;\n var ra = 16 * rb.d;\n let fb = 16 * (rb.d + 1);\n if (rb.W) {\n const pc = K;\n let wc = s;\n const kc = pc.oa.d;\n $(pc.oa.W);\n for (wc = pc.lb; wc < pc.wb; ++wc) {\n const Na = pc;\n const ec = wc;\n const Vb = kc;\n const xc = Na.oa;\n const gb = Na.H;\n const fc = xc.M[1 + ec];\n const sb = Na.ca;\n const tb = Na.da + 16 * xc.ha\n * gb + 16 * ec;\n const Gb = fc.zc;\n const hb = fc.yc;\n const Ja = 2 * Gb + hb;\n if (Gb != 0) {\n if (Na.A == 1) ec > 0 && ae(sb, tb, gb, Ja + 4), fc.ab && ce(sb, tb, gb, Ja), Vb > 0 && $d(sb, tb, gb, Ja + 4), fc.ab && be(sb, tb, gb, Ja);\n else {\n const gc = Na.r;\n const yc = Na.aa;\n const zc = Na.ba + 8 * xc.ha * gc + 8 * ec;\n const Ac = Na.ra;\n const Bc = Na.sa + 8 * xc.ha * gc + 8 * ec;\n const ub = Na.Ac.fb ? Gb >= 40 ? 2 : Gb >= 15 ? 1 : 0 : Gb >= 40 ? 3 : Gb >= 20 ? 2 : Gb >= 15 ? 1 : 0;\n ec > 0 && (Td(sb, tb, gb, Ja + 4, hb, ub), Vd(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Xd(sb, tb, gb, Ja, hb, ub), Zd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n Vb > 0 && (Sd(sb, tb, gb, Ja + 4, hb, ub), Ud(yc, zc, Ac, Bc, gc, Ja + 4, hb, ub));\n fc.ab && (Wd(sb, tb, gb,\n Ja, hb, ub), Yd(yc, zc, Ac, Bc, gc, Ja, hb, ub));\n }\n }\n }\n }\n if (I.put) {\n jc ? (I.y = K.ca, I.D = K.da + Ib, I.c = K.aa, I.B = K.ba + jb, I.S = K.ra, I.C = K.sa + jb) : (ra -= ib, I.y = Jb, I.D = Lb, I.c = Ob, I.B = Pb, I.S = Rb, I.C = Sb);\n Tb || (fb -= ib);\n fb > I.K && (fb = I.K);\n if (K.Ga != p && ra < fb && (ra == 0 ? (I.p = qd(K, ra, fb - ra), I.q = 0) : I.q = qd(K, ra, fb - ra), I.p == p)) {\n cc = Y(K, W, 'Could not decode alpha data.');\n break b;\n }\n if (ra < I.k) {\n const qc = I.k - ra;\n var ra = I.k;\n $(!(qc & 1));\n I.D += K.H * qc;\n I.B += K.r * (qc >> 1);\n I.C += K.r * (qc >> 1);\n I.p != p && (I.q += I.width * qc);\n }\n ra < fb && (I.D += I.t, I.B += I.t >> 1, I.C += I.t >> 1, I.p != p && (I.q += I.t),\n I.w = ra - I.k, I.m = I.Ka - I.t, I.h = fb - ra, Hb = I.put(I));\n }\n rb.ha + 1 == K.jb && !Tb && (N(K.ca, K.da - yb, Jb, Lb + 16 * K.H, yb), N(K.aa, K.ba - dc, Ob, Pb + 8 * K.r, dc), N(K.ra, K.sa - dc, Rb, Sb + 8 * K.r, dc));\n cc = Hb;\n }\n }\n if (!cc) {\n c = Y(a, 'VP8_STATUS_USER_ABORT', 'Output aborted.');\n break a;\n }\n }\n let Cb;\n if (!(Cb = a.qb && !WebPWorkerSync(a.rc))) {\n let Db;\n if (Db = a.fc > 0) $(a), $(a.fc > 0), Db = !1;\n Cb = Db;\n }\n c = Cb ? 0 : 1;\n }\n }\n const lc = c;\n b.Pb && b.Pb(b);\n c = lc & 1;\n }\n if (!c) return ke(a), 0;\n a.za = 0;\n return c;\n }\n\n function ke(a) {\n a != p && (a.ib && (a.ib = 0), a.ib = p, a.Gb = 0, a.za = 0);\n }\n\n function Aa(a, b) {\n return a + (1 << b) - 1 >> b;\n }\n\n function hc(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J];\n d[e + 1] = ia[a + g - J];\n d[e + 2] = ia[a + b - J];\n }\n\n function le(a, b, c, d, e) {\n const g = vb[c] + wb[b] >> ea;\n b = xb[b];\n d[e + 0] = ia[a + Za[c] - J] & 248 | ia[a + g - J] >> 5;\n d[e + 1] = ia[a + g - J] << 3 & 224 | ia[a + b - J] >> 3;\n }\n\n function me(a, b, c, d, e) {\n d[e + 0] = 255;\n hc(a, b, c, d, e + 1);\n }\n\n function ne(a, b, c, d, e) {\n const g = xb[b];\n d[e + 0] = Hb[a + Za[c] - J] << 4 | Hb[a + (vb[c] + wb[b] >> ea) - J];\n d[e + 1] = 15 | Hb[a + g - J] << 4;\n }\n\n function Vc(a, b, c, d, e) {\n const g = Za[c];\n c = vb[c] + wb[b] >> ea;\n d[e + 0] = ia[a + xb[b] - J];\n d[e + 1] = ia[a + c - J];\n d[e + 2] = ia[a + g - J];\n }\n\n function oe(a, b, c, d, e) {\n Vc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function pe(a, b, c, d, e) {\n hc(a, b, c, d, e);\n d[e + 3] = 255;\n }\n\n function ib(a, b, c) {\n a[b] = ((((a[b] & 4278255360) >>> 0) + ((c & 4278255360) >>> 0) & 4278255360) >>> 0 | (a[b] & 16711935) + (c & 16711935) & 16711935) >>> 0;\n }\n\n function ka(a, b) {\n return (((a ^ b) & 4278124286) >>> 1) + ((a & b) >>> 0) >>> 0;\n }\n\n function $a(a) {\n return a < 256 && a > 0 ? a : a <= 0 ? 0 : ~a >> 24 & 255;\n }\n\n function yb(a, b) {\n return $a(a + parseInt((a - b) / 2, 10));\n }\n\n function Wc() {\n return qe;\n }\n\n function Xc(a, b) {\n a &= 255;\n b &= 255;\n a > 127 && (a -= 256);\n b > 127 && (b -= 256);\n return a * b >>> 5;\n }\n\n function re(a,\n b, c, d, e, g, k) {\n var h = s;\n const n = 8 >> a.n;\n const l = a.U;\n const f = a.u;\n if (n < 8) {\n a = (1 << a.n) - 1;\n for (var t = (1 << n) - 1, h = b; h < c; ++h) {\n b = 0;\n for (var q = s, q = 0; q < l; ++q) (q & a) == 0 && (b = d[e++] >> 8 & 255), g[k++] = f[b & t], b >>= n;\n }\n } else for (h = b; h < c; ++h) for (q = 0; q < l; ++q) g[k++] = f[d[e++] >> 8 & 255];\n }\n\n function se(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n d[e++] = g >> 24 & 255;\n }\n }\n\n function te(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 16 & 240 | g >> 12 & 15;\n d[e++] = g >> 0 & 240 | g >> 28 & 15;\n }\n }\n\n function Ib(a, b, c, d, e) {\n for (c = b + c; b < c;) {\n const g = a[b++];\n d[e++] = g >> 24 & 255;\n d[e++] = g >> 16 & 255;\n d[e++] = g >> 8 & 255;\n d[e++] = g >> 0 & 255;\n }\n }\n\n function ue(a, b, c, d) {\n if (T(a, 8) != ve) return 0;\n b[0] = T(a, we) + 1;\n c[0] = T(a, we) + 1;\n d[0] = T(a, 1);\n T(a, Wf);\n return 1;\n }\n\n function xe(a, b) {\n let c = s;\n if (a < 4) return a + 1;\n c = a - 2 >> 1;\n return (2 + (a & 1) << c) + T(b, c) + 1;\n }\n\n function Oa(a, b) {\n if (b.Q + 8 > b.ya) {\n var c = a.Y;\n var d = 0;\n for ($(c != p); c[d].s != 0;) {\n var e = c;\n var g = b;\n const k = g.T >> g.g & 1;\n g.L ? g.fa = 1 : (++g.g, g.g >= 8 && Sb(g), g.Q == g.ya && g.g == 32 && (g.L = 1));\n d = d + e[d].s + k;\n }\n return c[d].kc;\n }\n c = a.Y;\n d = 0;\n for ($(c != p); c[d].s != 0;) {\n e = c, g = b.T >> b.g & 1, ++b.g, d = d\n + e[d].s + g;\n }\n return c[d].kc;\n }\n\n function zb(a, b) {\n if (a != p) for (var c = s, d = s, c = 0; c < b; ++c) for (var e = a[c].va, d = 0; d < Yc; ++d) ja(e[d]);\n }\n\n function ye(a, b, c) {\n b = a.eb == 0 ? 0 : a.ac[a.bd + a.Ec * (c >> a.eb) + (b >> a.eb)];\n $(b < a.hc);\n return a.Db[+b];\n }\n\n function ze(a, b, c, d) {\n let e = a.Na;\n const g = a.O;\n const k = g + b;\n var h = c;\n var f = d;\n d = a.Xa;\n c = a.vb;\n for (N(d, c, h, f, a.l * b); e-- > 0;) {\n b = a.nc[e];\n let l = g;\n var m = k;\n var t = h;\n var q = f;\n var f = d;\n var h = c;\n $(l < m);\n $(m <= b.Vb);\n switch (b.Qc) {\n case Ae:\n t = 0;\n for (b = h + (m - l) * b.U; h < b;) {\n var m = f;\n var q = h;\n var r = m[q] >> 8 & 255;\n var u = (m[q] & 16711935) >>> 0;\n var u = u + (r << 16 | r);\n var u = u & 16711935;\n f[h++] = ((m[q] & 4278255360)\n >>> 0 | u) >>> 0;\n l == 32 && t++;\n }\n break;\n case Be:\n var v = b;\n var C = l;\n var t = m;\n var q = f;\n var r = h;\n var u = v.U;\n if (C == 0) {\n var A = s;\n ib(q, r, qe);\n for (A = 1; A < u; ++A) ib(q, r + A, q[r + A - 1]);\n r += u;\n ++C;\n }\n for (var z = (1 << v.n) - 1, Ha = Aa(u, v.n), w = v.u, v = +(C >> v.n) * Ha; C < t;) {\n var y = w;\n var B = v;\n let G = p;\n ib(q, r, q[r - u + 0]);\n G = Ce[y[B++] >> 8 & 15];\n for (A = 1; A < u; ++A) {\n let F = E;\n (A & z) == 0 && (G = Ce[y[B++] >> 8 & 15]);\n F = G(q[r + A - 1], q, r + A - u);\n ib(q, r + A, F);\n }\n r += u;\n ++C;\n (C & z) == 0 && (v += Ha);\n }\n m != b.Vb && (b = b.U, N(f, h - b, f, h + (m - l - 1) * b, b));\n break;\n case De:\n t = b.U;\n q = (1 << b.n) - 1;\n r = Aa(t, b.n);\n u = b.u;\n for (b = +(l >> b.n) * r; l < m;) {\n A = u;\n C = b;\n z = M(Xf);\n Ha = s;\n for (Ha = 0; Ha < t; ++Ha) (Ha & q) == 0 && (w = A[C++], v = z, v.Cc = w >> 0 & 255, v.Bc = w >> 8 & 255, v.Kc = w >> 16 & 255), w = f[h + Ha], v = w >>> 8, y = w >>> 16, B = w, y += Xc(z.Cc, v), y &= 255, B += Xc(z.Bc, v), B += Xc(z.Kc, y), B &= 255, f[h + Ha] = (w & 4278255360 | y << 16 | B) >>> 0;\n h += t;\n ++l;\n (l & q) == 0 && (b += r);\n }\n break;\n case Ee:\n t == f && b.n > 0 ? (t = (m - l) * Aa(b.U, b.n), q = h + (m - l) * b.U - t, memmove(f, q, f, h, t), re(b, l, m, f, q, f, h)) : re(b, l, m, t, q, f, h);\n }\n h = d;\n f = c;\n }\n }\n\n function Yf(a, b) {\n var c = a.V;\n var d = a.Ha + a.l * a.O;\n var e = b - a.O;\n if (!(e <= 0)) {\n ze(a, e, c, d);\n var g = a.N;\n var c = a.Xa;\n let k = [a.vb];\n var d = a.O;\n var e = b;\n var h = k;\n var f = g.width;\n $(d < e);\n $(g.t < g.Ka);\n e > g.K && (e = g.K);\n if (d < g.k) {\n var l = g.k - d;\n var d = g.k;\n h[0] += f * l;\n }\n d >= e ? d = 0 : (h[0] += g.t, g.w = d - g.k, g.m = g.Ka - g.t, g.h = e - d, d = 1);\n if (d) {\n k = k[0];\n d = a.Ib;\n e = g.width;\n if (d.J < ua) {\n var m = d.c.RGBA;\n var h = m.ma;\n let t = m.Sa + a.xa * m.f;\n if (g.I) c = EmitRescaledRows(a, c, k, e, g.h, h, t, m.f);\n else {\n for (var f = d.J, l = g.m, g = g.h, m = m.f, q = g; q-- > 0;) {\n const r = c;\n let u = k;\n let v = l;\n const C = h;\n let A = t;\n switch (f) {\n case Qa:\n for (v = u + v; u < v;) {\n var z = r[u++];\n C[A++] = z >> 16 & 255;\n C[A++] = z >> 8 & 255;\n C[A++] = z >> 0 & 255;\n }\n break;\n case jb:\n se(r, u, v, C, A);\n break;\n case Ob:\n se(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v,\n 1, 0);\n break;\n case Zc:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 0 & 255, C[A++] = z >> 8 & 255, C[A++] = z >> 16 & 255;\n break;\n case Pa:\n Ib(r, u, v, C, A);\n break;\n case Pb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 0, v, 1, 0);\n break;\n case Ab:\n Ib(r, u, v, C, A);\n break;\n case Bb:\n Ib(r, u, v, C, A);\n WebPApplyAlphaMultiply(C, 1, v, 1, 0);\n break;\n case kb:\n te(r, u, v, C, A);\n break;\n case Qb:\n te(r, u, v, C, A);\n WebPApplyAlphaMultiply4444(C, v, 1, 0);\n break;\n case Fe:\n for (v = u + v; u < v;) z = r[u++], C[A++] = z >> 16 & 248 | z >> 13 & 7, C[A++] = z >> 5 & 224 | z >> 3 & 31;\n break;\n default:\n $(0);\n }\n k += e;\n t += m;\n }\n c = g;\n }\n a.xa += c;\n } else {\n a.xa = g.I ? EmitRescaledRowsYUVA(a, c, k, e, g.h) : EmitRowsYUVA(a, c, k, e, g.m, g.h);\n }\n $(a.xa <= d.height);\n }\n a.O = b;\n $(a.O <= a.v);\n }\n }\n\n function lc(a, b, c, d, e, g) {\n let k = 1;\n let h = 0;\n let f = 0;\n const l = a.o;\n const m = a.cb;\n let t = m.Db;\n let q = c;\n let r = c;\n c += d * e;\n e = Ba + Ge;\n const u = e + m.xb;\n const v = m.xb > 0 ? m.Yb : p;\n const C = m.Dc;\n let A = !1;\n $(t != p);\n for (; !l.L && q < c;) {\n let z = s;\n A || ((h & C) == 0 && (t = ye(m, h, f)), Da(l), z = Oa(t.va[Zf], l));\n if (z < Ba || A) {\n if (!A) {\n var w = k = A = s;\n var y = s;\n Da(l);\n A = Oa(t.va[$f], l);\n k = z;\n Da(l);\n w = Oa(t.va[ag], l);\n Da(l);\n y = Oa(t.va[bg], l);\n b[q] = (y << 24 >>> 0) + (A << 16) + (k << 8) + w;\n }\n A = !1;\n ++q;\n ++h;\n if (h >= d && (h = 0, ++f, g != p && f\n % $c == 0 && g(a, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < e) {\n w = w = s;\n k = xe(z - Ba, l);\n z = Oa(t.va[cg], l);\n Da(l);\n w = xe(z, l);\n w > He ? w -= He : (z = dg[w - 1], z = (z >> 4) * d + (8 - (z & 15)), w = z >= 1 ? z : 1);\n z = s;\n for (z = 0; z < k; ++z) b[q + z] = b[q + z - w];\n q += k;\n for (h += k; h >= d;) h -= d, ++f, g != p && f % $c == 0 && g(a, f);\n if (q < c && (t = ye(m, h, f), v != p)) for (; r < q;) k = b[r++], v.ea[ad * k >>> v.bb] = k;\n } else if (z < u) {\n A = z - e;\n for ($(v != p); r < q;) z = b[r++], v.ea[ad * z >>> v.bb] = z;\n z = b;\n w = q;\n y = v;\n $(A <= -1 >>> y.bb);\n z[w] = y.ea[A];\n A = !0;\n continue;\n }(k = !l.fa) || End;\n }\n g != p && g(a, f);\n l.fa || !k || l.L && q < c ? (k = 0, a.a = !l.L ? W : Ie) : q == c && (a.Ob = Db);\n return k;\n }\n\n function bd(a) {\n $(a);\n a.ac = p;\n zb(a.Db, a.hc);\n const b = a.Yb;\n b != p && (b.ea = p, b.ea = p);\n $(a);\n }\n\n function sd() {\n const a = M(eg);\n if (a == p) return p;\n a.a = L;\n a.Wa = cd;\n a.Ob = cd;\n return a;\n }\n\n function sa(a) {\n let b = s;\n if (a != p) {\n bd(a.cb);\n a.V = p;\n a.V = p;\n for (b = 0; b < a.Na; ++b) {\n const c = a.nc[b];\n c.u = p;\n c.u = p;\n }\n a.Na = 0;\n a.Ub = 0;\n a.Mc = p;\n a.Mc = p;\n a.Ib = p;\n }\n }\n\n function Ka(a, b, c, d, e) {\n var g = 1;\n a = [a];\n b = [b];\n for (var k = d.o, h = d.cb, f = p, l = p, l = 0; ;) {\n if (c) {\n for (; g && T(k, 1);) {\n var m = a;\n var t = b;\n var q = d;\n var r = 1;\n var u = q.o;\n var g = q.nc[q.Na];\n var v = T(u, 2);\n if (q.Ub & 1 << v) g = 0;\n else {\n q.Ub\n |= 1 << v;\n g.Qc = v;\n g.U = m[0];\n g.Vb = t[0];\n g.u = [p];\n g.b = 0;\n ++q.Na;\n $(q.Na <= Je);\n switch (v) {\n case Be:\n case De:\n g.n = T(u, 3) + 2;\n r = Ka(Aa(g.U, g.n), Aa(g.Vb, g.n), 0, q, g.u);\n break;\n case Ee:\n t = T(u, 8) + 1;\n r = t > 16 ? 0 : t > 4 ? 1 : t > 2 ? 2 : 3;\n m[0] = Aa(g.U, r);\n g.n = r;\n if (m = r = Ka(t, 1, 0, q, g.u)) {\n if (m = t, q = g, r = s, t = 1 << (8 >>> q.n) >>> 0, u = Array(t), u == p) m = 0;\n else {\n var v = q.u[0];\n var C = q.b;\n u[0] = q.u[0][q.b + 0];\n for (r = 1; r < m; ++r) u[r] = ((((v[C + r] & 4278255360) >>> 0) + ((u[r - 1] & 4278255360) >>> 0) & 4278255360) >>> 0 | (v[C + r] & 16711935) + (u[r - 1] & 16711935) & 16711935) >>> 0;\n for (; r < t; ++r) u[r] = 0;\n q.u[0] = p;\n q.b = p;\n q.u[0] = u;\n q.b = 0;\n m = 1;\n }\n }\n r = m;\n break;\n case Ae:\n break;\n default:\n $(0);\n }\n g.u = g.u[0];\n g = r;\n }\n }\n }\n if (g && T(k, 1) && (l = T(k, 4), g = l >= 1 && l <= fg, !g)) {\n d.a = W;\n break;\n }\n if (g) {\n a: {\n var g = d;\n var A = a[0];\n var z = b[0];\n var m = l;\n var C = v = s;\n var C = g.o;\n var q = g.cb;\n var r = [p];\n var t = p;\n var u = 1;\n if (c && T(C, 1)) {\n var v = T(C, 3) + 2;\n var A = Aa(A, v);\n var w = Aa(z, v);\n var z = A * w;\n if (!Ka(A, w, 0, g, r)) {\n g.a = W;\n zb(t, u);\n g = 0;\n break a;\n }\n r = r[0];\n q.eb = v;\n for (v = 0; v < z; ++v) A = r[v] >>> 8 & 65535, r[v] = A, A >= u && (u = A + 1);\n }\n if (C.fa) zb(t, u), g = 0;\n else if ($(u <= 65536), t = ld(u, gg), t == p) g.a = cb, zb(t, u), g = 0;\n else {\n for (v = 0; v < u; ++v) {\n z = t[v].va;\n for (C = 0; C < Yc; ++C) {\n A = hg[C];\n C == 0 && m > 0 && (A += 1 << m);\n b: {\n const y = A;\n var A = g;\n const G = z[+C];\n var B = 0;\n var w = A.o;\n if (T(w, 1)) {\n var F = Array(2);\n var D = Array(2);\n var L = Array(2);\n var B = T(w, 1) + 1;\n var J = T(w, 1);\n F[0] = T(w, J == 0 ? 1 : 8);\n D[0] = 0;\n L[0] = B - 1;\n B == 2 && (F[1] = T(w, 8), D[1] = 1, L[1] = B - 1);\n c: {\n var J = 0;\n var H = s;\n $(G != p);\n $(L != p);\n $(D != p);\n $(F != p);\n if (nd(G, B)) {\n for (H = 0; H < B; ++H) {\n if (D[H] != pd) {\n if (F[H] < 0 || F[H] >= y) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n if (!jc(G, F[H], D[H], L[H])) {\n (J = J && ma(G)) || ja(G);\n B = J;\n break c;\n }\n }\n }(J = (J = 1) && ma(G)) || ja(G);\n B = J;\n } else B = 0;\n }\n } else {\n B = s;\n D = [];\n F = T(w, 4) + 4;\n if (F > Ke) {\n A.a = W;\n A = 0;\n break b;\n }\n L = Array(y);\n if (L == p) {\n A.a = cb;\n A = 0;\n break b;\n }\n for (B = 0; B < F; ++B) D[ig[B]] = T(w, 3);\n c: {\n var B = A;\n var O = D;\n var D = y;\n var F = L;\n var J = 0;\n var H = B.o;\n let S = s;\n let V = s;\n let Y = jg;\n const Z = M(Le);\n if (od(Z, O, Ke)) {\n if (T(H, 1)) {\n if (S = 2 + 2 * T(H, 3), V = 2 + T(H, S), V > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n } else V = D;\n for (S = 0; S < D;) {\n var R = s;\n if (V-- == 0) break;\n Da(H);\n R = Oa(Z, H);\n if (R < Me) F[S++] = R, R != 0 && (Y = R);\n else {\n var O = R == kg;\n var R = R - Me;\n const ea = lg[R];\n var R = T(H, mg[R]) + ea;\n if (S + R > D) {\n B.a = W;\n ja(Z);\n B = J;\n break c;\n }\n for (O = O ? Y : 0; R-- > 0;) F[S++] = O;\n }\n }\n J = 1;\n ja(Z);\n B = J;\n } else B.a = W, B = 0;\n }\n B && (B = od(G, L, y));\n }(B = B && !w.fa) ? A = 1 : (A.a = W, A = 0);\n }\n if (!A) {\n zb(t, u);\n g = 0;\n break a;\n }\n }\n }\n q.ac = r;\n q.hc = u;\n q.Db = t;\n g = 1;\n }\n }\n }\n if (!g) {\n d.a = W;\n break;\n }\n if (l > 0) {\n if (h.xb = 1 << l, m = h.Yb, q = 1 << l, $(m != p), $(l > 0), m.ea = U(q, 0), m.ea == p ? l = 0 : (m.bb = 32 - l, l = 1), !l) {\n d.a = cb;\n g = 0;\n break;\n }\n } else h.xb = 0;\n l = d;\n m = a[0];\n q = b[0];\n r = l.cb;\n t = r.eb;\n l.l = m;\n l.v = q;\n r.Ec = Aa(m, t);\n r.Dc = t == 0 ? -1 : (1 << t) - 1;\n if (c) {\n d.Ob = Cb;\n break;\n }\n f = Array(a * b);\n l = 0;\n if (f == p) {\n d.a = cb;\n g = 0;\n break;\n }\n g = (g = lc(d, f, l, a, b, p)) && !k.fa;\n break;\n }\n g ? (e != p ? e[0] = f : ($(f == p), $(c)), c || bd(h)) : (bd(h), d.a == W && d.o.L && (d.a = Ie));\n return g;\n }\n\n function xd(a, b) {\n const c = a.l * a.v;\n const d = c + b + b * $c;\n $(a.l <= b);\n a.V = Array(d);\n a.Ha = 0;\n if (a.V == p) {\n return a.Xa = p, a.a = cb, 0;\n }\n a.Xa = a.V;\n a.vb = a.Ha + c + b;\n return 1;\n }\n\n function mf(a, b) {\n var c = b - a.O;\n var d = a.V;\n var e = a.Ha + a.l * a.O;\n if (!(c <= 0)) {\n ze(a, c, d, e);\n for (var e = a.N.width, c = e * c, d = a.N.ka, e = a.N.fd + e * a.O, g = a.Xa, k = a.vb, h = s, h = 0; h < c; ++h) d[e + h] = g[k + h] >>> 8 & 255;\n a.O = a.xa = b;\n }\n }\n\n function ng(a, b) {\n const c = [s];\n const d = [s];\n const e = [s];\n if (a == p) return 0;\n if (b == p) return a.a = ta, 0;\n a.N = b;\n a.a = L;\n Rb(a.o, b.data, b.b, b.e);\n if (!ue(a.o, c, d, e)) return a.a = W, sa(a), $(a.a != L), 0;\n a.Ob = cd;\n b.width = c[0];\n b.height = d[0];\n a.Wa = Cb;\n return !Ka(c[0], d[0], 1, a, p) ? (sa(a), $(a.a != L), 0) : 1;\n }\n\n function og(a) {\n let b = p;\n let c = p;\n if (a == p) return 0;\n b = a.N;\n $(b != p);\n c = b.ka;\n $(c != p);\n a.Ib = c.j;\n a.Hc = c.Hc;\n $(a.Ib != p);\n if (!Ne(c.Qa, b, Pa)) return a.a = ta, sa(a), $(a.a != L), 0;\n if (!xd(a, b.width) || b.I && !AllocateAndInitRescaler(a, b)) return sa(a), $(a.a != L), 0;\n a.Wa = Db;\n if (!lc(a, a.V, a.Ha, a.l, a.v, Yf)) return sa(a), $(a.a != L), 0;\n c.ec = a.xa;\n sa(a);\n return 1;\n }\n\n function wa(a, b) {\n return a < 0 ? 0 : a > b ? b : a;\n }\n\n function ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, C, w, z) {\n let y; const G = C - 1 >> 1;\n let F = e[g + 0] | k[h + 0] << 16;\n let B = f[l + 0] | m[t + 0] << 16;\n if (a) {\n var D = 3 * F + B + 131074 >> 2;\n w(a[b + 0], D & 255, D >> 16, q, r);\n }\n c && (D = 3 * B + F + 131074 >> 2, w(c[d + 0], D & 255, D >> 16, u, v));\n for (y = 1; y <= G; ++y) {\n const J = e[g + y] | k[h + y] << 16;\n const L = f[l + y] | m[t + y] << 16;\n var D = F + J + B + L + 524296;\n const O = D + 2 * (J + B) >> 3;\n const H = D + 2 * (F + L) >> 3;\n a && (D = O + F >> 1, F = H + J >> 1, w(a[b + 2 * y - 1], D & 255, D >> 16, q, r + (2 * y - 1) * z), w(a[b + 2 * y - 0], F & 255, F >> 16, q, r + (2 * y - 0) * z));\n c && (D = H + B >> 1, F = O + L >> 1, w(c[d + 2 * y - 1], D & 255, D >> 16, u, v + (2 * y - 1) * z), w(c[d + 2 * y + 0], F & 255, F >> 16, u, v + (2 * y + 0) * z));\n F = J;\n B = L;\n }\n C & 1 || (a && (D = 3 * F + B + 131074 >> 2, w(a[b + C - 1], D & 255, D >> 16, q, r + (C - 1) * z)), c && (D = 3 * B + F + 131074 >> 2, w(c[d + C - 1], D & 255, D >> 16, u, v + (C - 1) * z)));\n }\n\n function pg(a,\n b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, hc, 3);\n }\n\n function qg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, Vc, 3);\n }\n\n function Oe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, pe, 4);\n }\n\n function Pe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, oe, 4);\n }\n\n function Qe(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, me, 4);\n }\n\n function Re(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h,\n f, l, m, t, q, r, u, v, w, ne, 2);\n }\n\n function rg(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w) {\n ab(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u, v, w, le, 2);\n }\n\n function Ca(a, b, c, d, e, g, k, h, f, l, m, t, q, r, u) {\n let v;\n for (v = 0; v < q - 1; v += 2) r(a[b + 0], e[g + 0], k[h + 0], f, l), r(a[b + 1], e[g + 0], k[h + 0], f, l + u), r(c[d + 0], e[g + 0], k[h + 0], m, t), r(c[d + 1], e[g + 0], k[h + 0], m, t + u), b += 2, d += 2, g++, h++, l += 2 * u, t += 2 * u;\n v == q - 1 && (r(a[b + 0], e[g + 0], k[h + 0], f, l), r(c[d + 0], e[g + 0], k[h + 0], m, t));\n }\n\n function Se(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, pe, 4);\n }\n\n function Te(a, b, c, d, e, g, k, f, n, l,\n m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, oe, 4);\n }\n\n function Ue(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, me, 4);\n }\n\n function Ve(a, b, c, d, e, g, k, f, n, l, m, t, q) {\n Ca(a, b, c, d, e, g, k, f, n, l, m, t, q, ne, 2);\n }\n\n function sg(a, b, c, d, e, g) {\n for (; e-- > 0;) {\n for (var k = a, f = b + (c ? 1 : 0), n = a, l = b + (c ? 0 : 3), m = s, m = 0; m < d; ++m) {\n var t = n[l + 4 * m];\n if (t != 255) {\n var t = 32897 * t;\n let q = k;\n let r = f + 4 * m + 0;\n k[f + 4 * m + 0] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 1;\n k[f + 4 * m + 1] * t >>> 23;\n q[r] = ca;\n q = k;\n r = f + 4 * m + 2;\n k[f + 4 * m + 2] * t >>> 23;\n q[r] = ca;\n }\n }\n b += g;\n }\n }\n\n function tg(a, b) {\n const c = b.j.c.Va;\n const d = c.y;\n const e = c.D + a.w * c.F;\n const g = c.c;\n const k = c.B + (a.w >> 1) * c.nb;\n const f = c.S;\n const n = c.C + (a.w >> 1) * c.rb;\n const l = a.m;\n const m = a.h;\n const t = parseInt((l + 1) / 2, 10);\n const q = parseInt((m + 1) / 2, 10);\n let r;\n for (r = 0; r < m; ++r) N(d, e + r * c.F, a.y, a.D + r * a.F, l);\n for (r = 0; r < q; ++r) N(g, k + r * c.nb, a.c, a.B + r * a.Da, t), N(f, n + r * c.rb, a.S, a.C + r * a.Da, t);\n return a.h;\n }\n\n function ug(a, b) {\n var c = b.j;\n const d = c.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = a.y;\n let f = a.D;\n const n = a.c;\n let l = a.B;\n const m = a.S;\n let t = a.C;\n var c = vg[c.J];\n const q = a.m;\n const r = a.h - 1;\n let u;\n for (u = 0; u < r; u += 2) c(k, f, k, f + a.F, n, l, m, t, e, g, e, g + d.f, q), f += 2 * a.F, l += a.Da, t += a.Da, g += 2 * d.f;\n u == r && c(k, f, k, f, n, l, m, t, e, g, e, g, q);\n return a.h;\n }\n\n function wg(a, b) {\n let c = a.h;\n const d = b.j.c.RGBA;\n const e = d.ma;\n let g = d.Sa + a.w * d.f;\n const k = V[b.j.J];\n const f = a.y;\n let n = a.D;\n const l = a.c;\n let m = a.B;\n const t = a.S;\n let q = a.C;\n let r = b.Qb;\n let u = b.Rb;\n let v = b.lc;\n let w = b.mc;\n let A = a.w;\n const z = a.w + a.h;\n const y = a.m;\n const D = parseInt((y + 1) / 2, 10);\n A == 0 ? k(p, p, f, n, l, m, t, q, l, m, t, q, p, p, e, g, y) : (k(b.Sb, b.Tb, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y), ++c);\n for (; A + 2 < z; A += 2) r = l, u = m, v = t, w = q, m += a.Da, q += a.Da, g += 2 * d.f, n += 2 * a.F, k(f, n - a.F, f, n, r, u, v, w, l, m, t, q, e, g - d.f, e, g, y);\n n += a.F;\n a.k + z < a.K ? (N(b.Sb, b.Tb, f, n, 1 * y), N(b.Qb, b.Rb, l, m, 1 * D), N(b.lc, b.mc, t, q, 1 * D), c--) : z & 1 || k(f, n, p, p, l, m, t, q, l, m,\n t, q, e, g + d.f, p, p, y);\n return c;\n }\n\n function xg(a, b) {\n var c = a.p;\n var d = a.q;\n const e = b.j.c.Va;\n const g = a.m;\n const f = a.h;\n const h = e.p;\n let n = e.q + a.w * e.Fa;\n var c = a.p;\n var d = a.q;\n let l = s;\n if (c != p) for (l = 0; l < f; ++l) N(h, n, c, d, 1 * g), d += a.width, n += e.Fa;\n else if (e.p != p) for (l = 0; l < f; ++l) jd(h, n, 255, g), n += e.Fa;\n return 0;\n }\n\n function We(a, b, c) {\n let d = a.w;\n c[0] = a.h;\n a.Bb && (d == 0 ? --c[0] : (--d, b[0] -= a.width), a.k + a.w + a.h == a.K && (c[0] = a.K - a.k - d));\n return d;\n }\n\n function yg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n for (var e = a.m, g = b.j.J, f = g == Ab || g == Bb, h = b.j.c.RGBA, n = [s], l = We(a, d, n), d = d[0], m = h.ma, l = h.Sa + l * h.f,\n t = l + (f ? 0 : 3), q = 255, r = s, u = s, u = 0; u < n[0]; ++u) {\n for (r = 0; r < e; ++r) {\n const v = c[d + r];\n m[t + 4 * r] = v;\n q &= v;\n }\n d += a.width;\n t += h.f;\n }\n q != 255 && F(g) && WebPApplyAlphaMultiply(m, l, f, e, n, h.f);\n }\n return 0;\n }\n\n function zg(a, b) {\n const c = a.p;\n var d = [a.q];\n if (c != p) {\n const e = a.m;\n const g = b.j.J;\n const f = b.j.c.RGBA;\n const h = [s];\n var n = We(a, d, h);\n var d = d[0];\n const l = f.ma;\n var n = f.Sa + n * f.f;\n let m = n + 1;\n let t = 15;\n let q = s;\n for (j = 0; j < h[0]; ++j) {\n for (q = 0; q < e; ++q) {\n const r = c[d + q] >> 4;\n l[m + 2 * q] = l[m + 2 * q] & 240 | r;\n t &= r;\n }\n d += a.width;\n m += f.f;\n }\n t != 15 && F(g) && WebPApplyAlphaMultiply4444(l, n, e, h, f.f);\n }\n return 0;\n }\n\n function vd(a) {\n let b = a.ka;\n const c = b.j.J;\n const d = c\n < ua;\n const e = c == jb || c == Pa || c == Ab || c == kb || c == Ra || F(c);\n b.memory = p;\n b.$a = p;\n b.zb = p;\n b.ad = p;\n if (!Ne(b.Qa, a, e ? ua : Ra)) return 0;\n if (a.I) {\n if (!(d ? InitRGBRescaler(a, b) : InitYUVRescaler(a, b))) return alert('memory error #1'), 0;\n } else {\n if (d) {\n if (b.$a = ug, a.Bb) {\n const g = a.m + 1 >> 1;\n const f = a.m + 2 * g;\n let h; const\n n = [];\n for (h = 0; h < f; ++h) n.push(205);\n n.push(0);\n b.memory = n;\n if (b.memory == p) return alert('memory error #2'), 0;\n b.Sb = b.memory;\n b.Tb = 0;\n b.Qb = b.Sb;\n b.Rb = b.Tb + a.m;\n b.lc = b.Qb;\n b.mc = b.Rb + g;\n b.$a = wg;\n V[Qa] = pg;\n V[jb] = Oe;\n V[Zc] = qg;\n V[Pa] = Pe;\n V[Ab] = Qe;\n V[kb] = Re;\n V[Fe] = rg;\n }\n } else {\n b.$a = tg;\n }\n e && (F(c) && (WebPApplyAlphaMultiply = sg, V[Ob] = Oe, V[Pb] = Pe, V[Bb] = Qe, V[Qb] = Re), b.zb = c == kb || c == Qb ? zg : d ? yg : xg);\n }\n if (d && !Xe) {\n for (a = 0; a < 256; ++a) Za[a] = 89858 * (a - 128) + Jb >> ea, wb[a] = -22014 * (a - 128) + Jb, vb[a] = -45773 * (a - 128), xb[a] = 113618 * (a - 128) + Jb >> ea;\n for (a = J; a < dd; ++a) b = 76283 * (a - 16) + Jb >> ea, ia[a - J] = wa(b, 255), Hb[a - J] = wa(b + 8 >> 4, 15);\n Xe = 1;\n }\n return 1;\n }\n\n function ud(a) {\n const b = a.ka;\n let c = a.m;\n const d = a.h;\n $(!(a.w & 1));\n if (c <= 0 || d <= 0) return 0;\n c = b.$a(a, b);\n b.ec += c;\n b.zb && b.zb(a, b);\n return 1;\n }\n\n function wd(a) {\n a = a.ka;\n a.memory = '';\n a.memory = p;\n }\n\n function ed(a,\n b) {\n return a[b + 0] | a[b + 1] << 8 | a[b + 2] << 16;\n }\n\n function Kb(a, b) {\n return (ed(a, b) | a[b + 3] << 24) >>> 0;\n }\n\n function Ye(a, b, c, d, e, g, f) {\n var h = 0;\n var n = [0];\n var l = 'VP8StatusCode';\n const m = M(Gc);\n if (a == p || c[0] < Lb) return Z;\n m.data = a;\n m.b = [b[0]];\n m.e = [c[0]];\n m.na = [m.na];\n a: {\n h = m.na;\n $(a != p);\n $(c != p);\n $(h != p);\n h[0] = 0;\n if (c[0] >= Lb && !kd(a, b[0], 'RIFF', O)) {\n if (kd(a, b[0] + 8, 'WEBP', O)) {\n l = W;\n break a;\n }\n var t = Kb(a, b[0] + O);\n if (t < O + R) {\n l = W;\n break a;\n }\n h[0] = t;\n b[0] += Lb;\n c[0] -= Lb;\n } else h[0] = 0;\n l = L;\n }\n m.na = m.na[0];\n if (l != L) return l;\n h = m.na > 0;\n t = [0];\n a: if (l = R + fd, $(a != p), $(c != p), $(n != p), n[0] = 0, c[0] < R) l = Z;\n else {\n if (!kd(a, b[0], 'VP8X', O)) {\n var q = s;\n var r = s;\n var u = E;\n if (Kb(a, b[0] + O) != fd) {\n l = W;\n break a;\n }\n if (c[0] < l) {\n l = Z;\n break a;\n }\n u = Kb(a, b[0] + 8);\n q = 1 + ed(a, b[0] + 12);\n r = 1 + ed(a, b[0] + 15);\n if (q * r >= Ag) {\n l = W;\n break a;\n }\n t != p && (t[0] = u);\n d != p && (d[0] = q);\n e != p && (e[0] = r);\n b[0] += l;\n c[0] -= l;\n n[0] = 1;\n }\n l = L;\n }\n if (l != L) return l;\n if (!h && n[0]) return W;\n g != p && (g[0] = !!(t[0] & Bg));\n if (n && f == p) return L;\n if (c < O) return Z;\n if (h && n[0] || !h && !n[0] && !kd(a, b[0], 'ALPH', O)) {\n m.$ = [m.$];\n m.G = [m.G];\n m.pa = [m.pa];\n a: {\n var n = m.na;\n var h = m.$;\n var t = m.G;\n var l = m.pa;\n var q = x;\n var r = 0;\n var u = Mb;\n let v = O + R + fd;\n $(a != p);\n $(c != p);\n q = a;\n r = b[0];\n u = c[0];\n $(h != p);\n $(l != p);\n h[0] = p;\n t[0] = p;\n for (l[0] = 0; ;) {\n let w = E;\n let y = E;\n b[0] = r;\n c[0] = u;\n if (u < R) {\n l = Z;\n break a;\n }\n w = Kb(q, r + O);\n y = R + w + 1 & -2;\n v += y;\n if (n > 0 && v > n) {\n l = W;\n break a;\n }\n if (u < y) {\n l = Z;\n break a;\n }\n if (kd(q, r, 'ALPH', O)) {\n if (!kd(q, r, 'VP8 ', O) || !kd(q, 'VP8L', O)) {\n l = L;\n break a;\n }\n } else h[0] = q, t[0] = r + R, l[0] = w;\n r += y;\n u -= y;\n }\n l = ca;\n }\n m.$ = m.$[0];\n m.G = m.G[0];\n m.pa = m.pa[0];\n if (l != L) return l;\n }\n m.ta = [m.ta];\n m.ia = [m.ia];\n a: if (n = m.na, h = m.ta, t = m.ia, r = !kd(a, b[0], 'VP8 ', O), l = !kd(a, b[0], 'VP8L', O), q = O + R, $(a != p), $(c != p), $(h != p), $(t != p), c[0] < R) l = Z;\n else {\n if (r || l) {\n r = Kb(a, b[0] + O);\n if (n >= q && r > n - q) {\n l = W;\n break a;\n }\n h[0] = r;\n b[0] += R;\n c[0] -= R;\n t[0] = l;\n } else t[0] = c >= 1 && a[b + 0] == ve, h[0] = c[0];\n l = L;\n }\n m.ta = m.ta[0];\n m.ia = m.ia[0];\n if (l != L) return l;\n if (m.ta > Ze) return W;\n if (m.ia) {\n if (c[0] < $e) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n t = g ? g[0] : p;\n a == p || h < $e ? a = 0 : (l = [s], q = [s], r = [s], u = M(af), Rb(u, a, n, h), ue(u, l, q, r) ? (d != p && (d[0] = l[0]), e != p && (e[0] = q[0]), t != p && (t[0] = r[0]), a = 1) : a = 0);\n } else {\n if (c < bf) return Z;\n n = b[0];\n h = c[0];\n d = d ? d[0] : p;\n e = e ? e[0] : p;\n !(a == p || h < bf) && h - 3 >= 3 && a[n + 3 + 0] == 157 && a[n\n + 3 + 1] == 1 && a[n + 3 + 2] == 42 ? (h = a[n + 0] | a[n + 1] << 8 | a[n + 2] << 16, t = (a[n + 7] << 8 | a[n + 6]) & 16383, a = (a[n + 9] << 8 | a[n + 8]) & 16383, !(!(h & 1) + 0) || (h >> 1 & 7) > 3 || !(h >> 4 & 1) || h >> 5 >= m.ta ? a = 0 : (d && (d[0] = t), e && (e[0] = a), a = 1)) : a = 0;\n }\n if (!a) return W;\n g != p && (g[0] |= m.$ != p);\n f != p && (f[0] = m, f[0].offset = b[0] - f[0].b, $(b[0] - f[0].b < Ze), $(f[0].offset == f[0].e - c[0]));\n return L;\n }\n\n function Kd(a) {\n $(a != p);\n return Ye(a[0].data, a[0].b, a[0].e, p, p, p, a);\n }\n\n function cf(a, b, c, d) {\n let e = 'VP8StatusCode';\n const g = M(Vb);\n let f = M(Gc);\n f.data = a;\n f.b = b;\n f.e = c;\n f.b = [f.b];\n f.e = [f.e];\n f = [f];\n e = Kd(f);\n if (e\n != L) return e;\n f = f[0];\n f.b = f.b[0];\n f.e = f.e[0];\n $(d != p);\n td(na);\n g.data = f.data;\n g.b = b + f.offset;\n g.e = f.e - f.offset;\n g.put = ud;\n g.Mb = vd;\n g.Pb = wd;\n g.ka = d;\n if (f.ia) {\n a = sd();\n if (a == p) return cb;\n ng(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !og(a) && (e = a.a)) : e = a.a;\n a != p && sa(a);\n } else {\n e = M(Cg);\n e != p && (Gd(e), e.za = 0, e.Hb = 1);\n a = e;\n if (a == p) return cb;\n a.qb = 0;\n a.Ga = f.$;\n a.G = f.G;\n a.ub = f.pa;\n Hd(a, g) ? (e = zd(g.width, g.height, d.Qa, d.j), e == L && !Mf(a, g) && (e = a.a)) : e = a.a;\n a != p && ke(a);\n }\n e != L && (self || this).Yc(d.j);\n return e;\n }\n\n function lb(a, b, c, d, e) {\n const g = {\n value: 0,\n };\n c = {\n value: c,\n };\n const f = M(df);\n const h = M(gd);\n f.j = h;\n h.J = a;\n const n = {\n value: h.width,\n };\n const l = {\n value: h.height,\n };\n let m;\n m = c;\n const t = M(ef);\n hd(b, g, m, t) != L ? m = 0 : (n != p && (n.value = t.width), l != p && (l.value = t.height), m = 1);\n if (!m) return p;\n h.width = n.value;\n h.height = l.value;\n d != p && (d.value = h.width.value);\n e != p && (e.value = h.height.value);\n return cf(b, g.value, c.value, f) != L ? p : a < ua ? h.c.RGBA.ma : h.c.Va.y;\n }\n\n function hd(a, b, c, d) {\n if (d == p || a == p) return ta;\n $(d != p);\n d.tc = 0;\n d.width = [d.width];\n d.height = [d.height];\n d.$b = [d.$b];\n return Ye(a, b, c, d.width, d.height, d.$b, p);\n }\n\n function Ne(a,\n b, c) {\n const d = b.width;\n const e = b.height;\n let g = 0;\n let f = 0;\n let h = d;\n let n = e;\n b.Ua = a != p && a.Ua > 0;\n if (b.Ua && (h = a.wc, n = a.vc, g = a.t, f = a.k, c < ua || (g &= -2, f &= -2), g < 0 || f < 0 || h <= 0 || n <= 0 || g + h > d || f + n > e)) return 0;\n b.t = g;\n b.k = f;\n b.Ka = g + h;\n b.K = f + n;\n b.m = h;\n b.h = n;\n b.I = a != p && a.I > 0;\n if (b.I) {\n if (a.Ba <= 0 || a.Aa <= 0) return 0;\n b.Ba = a.Ba;\n b.Aa = a.Aa;\n }\n b.Za = a && a.Za;\n b.Bb = a == p || !a.ed;\n b.I && (b.Za = b.Ba < 3 * d / 4 && b.Aa < 3 * e / 4, b.Bb = 0);\n return 1;\n }\n var na = 512;\n var Qa = 0;\n var jb = 1;\n var Zc = 2;\n var Pa = 3;\n var Ab = 4;\n var kb = 5;\n var Fe = 6;\n var Ob = 7;\n var Pb = 8;\n var Bb = 9;\n var Qb = 10;\n var ua = 11;\n var Ra = 12;\n var Cc = 13;\n this.WEBP_CSP_MODE = this.Cd = {\n nd: 0,\n od: 1,\n kd: 2,\n ld: 3,\n jd: 4,\n pd: 5,\n qd: 6,\n rd: 7,\n sd: 8,\n md: 9,\n };\n var gd = {\n J: 'WEBP_CSP_MODE',\n width: s,\n height: s,\n Fc: s,\n c: {\n RGBA: {\n ma: x,\n Sa: 0,\n f: s,\n size: Mb,\n },\n Va: {\n y: x,\n c: x,\n S: x,\n p: x,\n D: x,\n B: x,\n C: x,\n q: x,\n F: s,\n nb: s,\n rb: s,\n Fa: s,\n Wc: Mb,\n Rc: Mb,\n Uc: Mb,\n Wb: Mb,\n },\n },\n Ic: U(4, E),\n Jb: p,\n jc: x,\n };\n var L = 0;\n var cb = 1;\n var ta = 2;\n var W = 3;\n var Hf = 4;\n var Ie = 5;\n var Nf = 6;\n var Z = 7;\n this.VP8StatusCode = this.td = {\n xd: 0,\n yd: 1,\n vd: 2,\n ud: 3,\n Ad: 4,\n zd: 5,\n Bd: 6,\n wd: 7,\n };\n var ef = {\n width: {\n value: s,\n },\n height: {\n value: s,\n },\n $b: {\n value: s,\n },\n tc: s,\n Yd: s,\n rotate: s,\n be: s,\n Ic: U(3, E),\n };\n this.WebPGetFeatures = this.Md = function (a, b, c) {\n let d = 'VP8StatusCode';\n na >>> 8 != na >>> 8 || c == p ? a = ta : (b = [b], d = hd(a, [0], b, c), a = d == Z ? W : d);\n return a;\n };\n const ff = {\n Za: s,\n ed: s,\n Ua: s,\n t: s,\n k: s,\n wc: s,\n vc: s,\n I: s,\n Ba: s,\n Aa: s,\n ae: s,\n Td: s,\n Xd: s,\n Ic: U(6, E),\n };\n this.WebPDecoderConfig = this.Kd = {\n input: M(ef),\n j: M(gd),\n options: M(ff),\n };\n this.WebPInitDecoderConfig = this.Nd = function (a) {\n na >>> 8 != na >>> 8 || a == p ? a = 0 : (a = a.input, $(a != p), a.tc = 0, a = 1);\n return a;\n };\n var Vb = {\n width: s,\n height: s,\n w: s,\n m: s,\n h: s,\n y: x,\n c: x,\n S: x,\n D: 0,\n B: 0,\n C: 0,\n F: s,\n Da: s,\n ka: 0,\n put: 0,\n Mb: 0,\n Pb: 0,\n Bb: s,\n e: Mb,\n data: x,\n b: 0,\n Za: s,\n Ua: s,\n t: s,\n Ka: s,\n k: s,\n K: s,\n I: s,\n Ba: s,\n Aa: s,\n p: x,\n q: 0,\n };\n var df = {\n j: M(gd),\n Sb: x,\n Qb: x,\n lc: x,\n Tb: 0,\n Rb: 0,\n mc: 0,\n ec: s,\n Qa: M(ff),\n memory: 0,\n $a: '(OutputFunc)',\n zb: '(OutputFunc)',\n ad: '(OutputRowFunc)',\n };\n var Gc = {\n data: x,\n b: x,\n e: Mb,\n offset: Mb,\n $: p,\n G: x,\n pa: Mb,\n ta: Mb,\n na: Mb,\n ia: s,\n };\n var Fc = {\n qa: x,\n Ia: p,\n Pd: x,\n Ab: s,\n la: E,\n Z: E,\n gc: s,\n };\n var af = {\n T: bb,\n qa: x,\n Ia: x,\n ya: Mb,\n Q: Mb,\n g: s,\n L: s,\n fa: s,\n };\n var gf = 25;\n var hf = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535, 131071, 262143, 524287, 1048575, 2097151, 4194303, 8388607, 16777215];\n var bf = 10;\n var ve = 47;\n var we = 14;\n var Wf = 3;\n var $e = 5;\n var fg = 11;\n var Yc = 5;\n var qe = 4278190080;\n var jg = 8;\n var Tb = 15;\n var Ba = 256;\n var Ge = 24;\n var Je = 4;\n var Be = 0;\n var De = 1;\n var Ae = 2;\n var Ee = 3;\n var Ub = 1;\n var kc = 0;\n var kf = 1;\n var rd = 1;\n var O = 4;\n var R = 8;\n var Lb = 12;\n var fd = 10;\n var Bg = 16;\n var Ag = 1 * Math.pow(2, 32);\n var Ze = -1 - R - 1 >>> 0;\n var jf = {\n kc: s,\n s,\n };\n var Le = {\n Y: 'HuffmanTreeNode*',\n gb: s,\n Pa: s,\n };\n var pd = -1;\n const Dg = {\n ea: E,\n bb: s,\n };\n var ad = 506832829;\n var $b = 0;\n var ge = $b;\n var fe = 2;\n var ee = 3;\n var de = 1;\n var Ef = 4;\n var Df = 5;\n var Cf = 6;\n var Ld = 3;\n var xa = 4;\n var Hc = 4;\n var Gf = 4;\n var Md = 4;\n var Nd = 8;\n var Kc = 3;\n var Lc = 11;\n var f = 32;\n var Pf = 17 * f + 9 * f;\n var Tc = 1 * f + 8;\n var Uc = Tc + 16 * f + f;\n var he = Uc + 16;\n var Id = {\n fb: x,\n Jc: x,\n Nc: x,\n Ra: E,\n };\n var Jd = {\n l: 0,\n v: 0,\n gd: x,\n hd: x,\n uc: x,\n $c: x,\n };\n const Eg = {\n pb: s,\n ob: s,\n tb: s,\n Kb: U(xa, 0),\n Cb: U(xa, 0),\n };\n const Fg = {\n Ta: U(Ld, x),\n z: md([Md, Nd, Kc, Lc], x),\n };\n const Gg = {\n Oc: s,\n Fb: s,\n kb: s,\n oc: s,\n Lc: U(Hc, s),\n Gc: U(Hc, s),\n };\n var Oc = {\n zc: s,\n yc: s,\n ab: s,\n };\n var Qd = {\n X: s,\n ua: s,\n Nb: s,\n };\n const id = U(2, s);\n const Hg = {\n sc: M(id),\n sb: M(id),\n qc: M(id),\n };\n const Ig = {\n ha: s,\n d: s,\n W: s,\n M: Oc,\n N: Vb,\n };\n var Cg = {\n a: 'VP8StatusCode',\n za: s,\n xc: 0,\n o: M(Fc),\n Ac: M(Id),\n P: M(Jd),\n ga: M(Gg),\n Ca: M(Eg),\n rc: 'WebPWorker',\n qb: s,\n Ja: s,\n jb: s,\n oa: Ig,\n Ma: s,\n hb: s,\n lb: s,\n mb: s,\n wb: s,\n Ya: s,\n Hb: s,\n ic: ld(8, Fc),\n Zc: E,\n yb: ld(xa, Hg),\n R: M(Fg),\n pc: s,\n Pc: x,\n dc: x,\n cc: U(4, x),\n Xc: x,\n Sc: x,\n Vc: x,\n La: M(Qd),\n M: M(Oc),\n Ea: x,\n z: 0,\n ca: x,\n aa: x,\n ra: x,\n da: s,\n ba: s,\n sa: s,\n H: s,\n r: s,\n ib: 0,\n Gb: Mb,\n i: s,\n d: s,\n wa: x,\n Eb: U(16, x),\n Vd: 0,\n Tc: x,\n Lb: x,\n ja: E,\n Oa: E,\n A: s,\n W: s,\n Zb: U(xa, x),\n Ga: p,\n G: 0,\n ub: Mb,\n Xb: x,\n Od: 0,\n cd: s,\n dd: x,\n Wd: 0,\n fc: Mb,\n };\n var Db = 0;\n var Cb = 1;\n var cd = 2;\n const Jg = {\n Qc: 'VP8LImageTransformType',\n n: s,\n U: s,\n Vb: s,\n u: E,\n b: E,\n };\n var gg = {\n va: ld(Yc, Le),\n };\n const Kg = {\n xb: s,\n Yb: M(Dg),\n Dc: s,\n eb: s,\n Ec: s,\n ac: E,\n bd: E,\n hc: s,\n Db: 'HTreeGroup',\n };\n var eg = {\n a: 'VP8StatusCode',\n Wa: 'VP8LDecodeState',\n Ob: 'VP8LDecodeState',\n N: 'VP8Io',\n Ib: 'WebPDecBuffer',\n Hc: 'WebPDecBuffer',\n V: E,\n Ha: E,\n Xa: E,\n vb: E,\n o: M(af),\n l: s,\n v: s,\n O: s,\n xa: s,\n cb: M(Kg),\n Na: s,\n nc: ld(Je, Jg),\n Ub: E,\n Mc: x,\n $d: x,\n Zd: '*WebPRescaler',\n };\n var lf = 4;\n var nf = [p, function (a, b, c, d, e, g, f, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(f != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(g >= c * e);\n for (n = 0; n < d; ++n) {\n n == 0 ? N(f, h, a, b, e) : Ea(a, b, f, l - g, f, h, e), Ea(a, b + e, f, l, f, h + e, e * (c - 1)),\n l += g, b += g, h += g;\n }\n }, function (a, b, c, d, e, f, k, h) {\n let n = s;\n let l = h;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, l, k, h + e, e * (c - 1));\n for (n = 1; n < d; ++n) b += f, h += f, Ea(a, b, k, l, k, h, e * c), l += f;\n }, function (a, b, c, d, e, f, k, h) {\n var n = h;\n let l = s;\n $(a != p);\n $(k != p);\n $(c > 0);\n $(d > 0);\n $(e > 0);\n $(f >= c * e);\n N(k, h, a, b, e);\n Ea(a, b + e, k, n, k, h + e, e * (c - 1));\n for (l = 1; l < d; ++l) {\n let m = s;\n var n = n + f;\n b += f;\n h += f;\n Ea(a, b, k, n - f, k, h, e);\n for (m = e; m < c * e; ++m) {\n const t = k[n + m - e] + k[n + m - f] - k[n + m - f - e];\n k[h + m] = a[b + m] + (t < 0 ? 0 : t > 255 ? 255 : t) & 255;\n }\n }\n }];\n var yd = [3, 4, 3, 4, 4, 2, 2, 4, 4, 4,\n 2, 1, 1,\n ];\n this.WebPFreeDecBuffer = this.Yc = function (a) {\n a != p && (a.Fc || (a.Jb = ''), a.jc = 0, a.Jb = a.jc = p);\n };\n self = this;\n var va = U(511, x);\n var tc = U(511, x);\n var sc = U(2041, 0);\n var oc = U(225, 0);\n var oa = U(766, x);\n var Rd = 0;\n var Xb = 85627;\n var Wb = 35468;\n var Uf = [function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 4; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n c >>= 3;\n for (d = 0; d < 4; ++d) jd(a, b + d * f, c, 4);\n }, function (a, b) {\n Dc(a, b, 4);\n }, function (a, b) {\n let c = b - f;\n const d = [];\n d.push(y(a[c - 1], a[c + 0], a[c + 1]));\n d.push(y(a[c + 0], a[c + 1], a[c + 2]));\n d.push(y(a[c + 1], a[c + 2], a[c + 3]));\n d.push(y(a[c + 2], a[c + 3], a[c + 4]));\n for (c = 0; c < 4; ++c) N(a, b + c * f, d, 0, 4);\n },\n function (a, b) {\n const c = a[b - 1];\n const d = a[b - 1 + f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = a[b + 1 + 0 * f] = a[b + 2 + 0 * f] = a[b + 3 + 0 * f] = y(a[b - 1 - f], c, d);\n a[b + 0 + 1 * f] = a[b + 1 + 1 * f] = a[b + 2 + 1 * f] = a[b + 3 + 1 * f] = y(c, d, e);\n a[b + 0 + 2 * f] = a[b + 1 + 2 * f] = a[b + 2 + 2 * f] = a[b + 3 + 2 * f] = y(d, e, g);\n a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = y(e, g, g);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 3 * f] = y(d, e, a[b - 1 + 3 * f]);\n a[b + 0 + 2 * f] = a[b + 1 + 3 * f] = y(c, d, e);\n a[b + 0 + 1 * f] = a[b + 1 + 2 * f] = a[b + 2 + 3 * f] = y(g, c, d);\n a[b\n + 0 + 0 * f] = a[b + 1 + 1 * f] = a[b + 2 + 2 * f] = a[b + 3 + 3 * f] = y(k, g, c);\n a[b + 1 + 0 * f] = a[b + 2 + 1 * f] = a[b + 3 + 2 * f] = y(h, k, g);\n a[b + 2 + 0 * f] = a[b + 3 + 1 * f] = y(n, h, k);\n a[b + 3 + 0 * f] = y(l, n, h);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 - f];\n const k = a[b + 0 - f];\n const h = a[b + 1 - f];\n const n = a[b + 2 - f];\n const l = a[b + 3 - f];\n a[b + 0 + 0 * f] = a[b + 1 + 2 * f] = g + k + 1 >> 1;\n a[b + 1 + 0 * f] = a[b + 2 + 2 * f] = k + h + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 3 + 2 * f] = h + n + 1 >> 1;\n a[b + 3 + 0 * f] = n + l + 1 >> 1;\n a[b + 0 + 3 * f] = y(e, d, c);\n a[b + 0 + 2 * f] = y(d, c, g);\n a[b + 0 + 1 * f] = a[b + 1 + 3 * f] = y(c, g, k);\n a[b + 1 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 2 + 1 * f] = a[b + 3 + 3 * f] = y(k, h, n);\n a[b + 3 + 1 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b + 1 - f];\n const d = a[b + 2 - f];\n const e = a[b + 3 - f];\n const g = a[b + 4 - f];\n const k = a[b + 5 - f];\n const h = a[b + 6 - f];\n const n = a[b + 7 - f];\n a[b + 0 + 0 * f] = y(a[b + 0 - f], c, d);\n a[b + 1 + 0 * f] = a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 2 + 0 * f] = a[b + 1 + 1 * f] = a[b + 0 + 2 * f] = y(d, e, g);\n a[b + 3 + 0 * f] = a[b + 2 + 1 * f] = a[b + 1 + 2 * f] = a[b + 0 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 2 * f] = a[b + 1 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = a[b + 2 + 3 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, n);\n },\n function (a, b) {\n const c = a[b + 0 - f];\n const d = a[b + 1 - f];\n const e = a[b + 2 - f];\n const g = a[b + 3 - f];\n const k = a[b + 4 - f];\n const h = a[b + 5 - f];\n const n = a[b + 6 - f];\n const l = a[b + 7 - f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 1 + 0 * f] = a[b\n + 0 + 2 * f] = d + e + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 1 + 2 * f] = e + g + 1 >> 1;\n a[b + 3 + 0 * f] = a[b + 2 + 2 * f] = g + k + 1 >> 1;\n a[b + 0 + 1 * f] = y(c, d, e);\n a[b + 1 + 1 * f] = a[b + 0 + 3 * f] = y(d, e, g);\n a[b + 2 + 1 * f] = a[b + 1 + 3 * f] = y(e, g, k);\n a[b + 3 + 1 * f] = a[b + 2 + 3 * f] = y(g, k, h);\n a[b + 3 + 2 * f] = y(k, h, n);\n a[b + 3 + 3 * f] = y(h, n, l);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n const k = a[b - 1 - f];\n const h = a[b + 0 - f];\n const n = a[b + 1 - f];\n const l = a[b + 2 - f];\n a[b + 0 + 0 * f] = a[b + 2 + 1 * f] = c + k + 1 >> 1;\n a[b + 0 + 1 * f] = a[b + 2 + 2 * f] = d + c + 1 >> 1;\n a[b + 0 + 2 * f] = a[b + 2 + 3 * f] = e + d + 1 >> 1;\n a[b + 0 + 3 * f] = g + e + 1 >> 1;\n a[b + 3 + 0 * f] = y(h, n, l);\n a[b + 2 + 0 * f] = y(k, h, n);\n a[b\n + 1 + 0 * f] = a[b + 3 + 1 * f] = y(c, k, h);\n a[b + 1 + 1 * f] = a[b + 3 + 2 * f] = y(d, c, k);\n a[b + 1 + 2 * f] = a[b + 3 + 3 * f] = y(e, d, c);\n a[b + 1 + 3 * f] = y(g, e, d);\n },\n function (a, b) {\n const c = a[b - 1 + 0 * f];\n const d = a[b - 1 + 1 * f];\n const e = a[b - 1 + 2 * f];\n const g = a[b - 1 + 3 * f];\n a[b + 0 + 0 * f] = c + d + 1 >> 1;\n a[b + 2 + 0 * f] = a[b + 0 + 1 * f] = d + e + 1 >> 1;\n a[b + 2 + 1 * f] = a[b + 0 + 2 * f] = e + g + 1 >> 1;\n a[b + 1 + 0 * f] = y(c, d, e);\n a[b + 3 + 0 * f] = a[b + 1 + 1 * f] = y(d, e, g);\n a[b + 3 + 1 * f] = a[b + 1 + 2 * f] = y(e, g, g);\n a[b + 3 + 2 * f] = a[b + 2 + 2 * f] = a[b + 0 + 3 * f] = a[b + 1 + 3 * f] = a[b + 2 + 3 * f] = a[b + 3 + 3 * f] = g;\n },\n ];\n var Vf = [function (a, b) {\n let c = 16;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f] + a[b + d - f];\n Yb(c >> 5, a, b);\n }, function (a,\n b) {\n Dc(a, b, 16);\n }, function (a, b) {\n let c;\n for (c = 0; c < 16; ++c) N(a, b + c * f, a, b - f, 16);\n }, function (a, b) {\n let c;\n for (c = 16; c > 0; --c) jd(a, b + 0, a[b - 1], 16), b += f;\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b - 1 + d * f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 16; ++d) c += a[b + d - f];\n Yb(c >> 4, a, b);\n }, function (a, b) {\n Yb(128, a, b);\n }];\n var je = [function (a, b) {\n let c = 8;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f] + a[b - 1 + d * f];\n Zb(1 * (c >> 4), a, b);\n }, function (a, b) {\n Dc(a, b, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) N(a, b + c * f, a, b - f, 8);\n }, function (a, b) {\n let c;\n for (c = 0; c < 8; ++c) {\n jd(a,\n b + 0, a[b - 1], 8), b += f;\n }\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b - 1 + d * f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n let c = 4;\n let d;\n for (d = 0; d < 8; ++d) c += a[b + d - f];\n Zb(1 * (c >> 3), a, b);\n }, function (a, b) {\n Zb(128, a, b);\n }];\n let mc; let Pc; let Qc; let Rc; let Sd; let Td; let Ud; let Vd; let Wd; let Xd; let Yd; let Zd; let $d; let ae; let be; let ce; var Pd = 31;\n var uc = [0, 2, 8];\n var Od = 3;\n var Of = 1;\n var ie = [0 + 0 * f, 4 + 0 * f, 8 + 0 * f, 12 + 0 * f, 0 + 4 * f, 4 + 4 * f, 8 + 4 * f, 12 + 4 * f, 0 + 8 * f, 4 + 8 * f, 8 + 8 * f, 12 + 8 * f, 0 + 12 * f, 4 + 12 * f, 8 + 12 * f, 12 + 12 * f];\n var Ic = [4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38,\n 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 91, 93, 95, 96, 98, 100, 101, 102, 104, 106, 108, 110, 112, 114, 116, 118, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 143, 145, 148, 151, 154, 157,\n ];\n var Jc = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96,\n 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 119, 122, 125, 128, 131, 134, 137, 140, 143, 146, 149, 152, 155, 158, 161, 164, 167, 170, 173, 177, 181, 185, 189, 193, 197, 201, 205, 209, 213, 217, 221, 225, 229, 234, 239, 245, 249, 254, 259, 264, 269, 274, 279, 284,\n ];\n var Sf = [-$b, 1, -1, 2, -2, 3, 4, 6, -3, 5, -4, -5, -6, 7, -7, 8, -8, -9];\n var Ff = [\n [\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128],\n [189, 129, 242, 255, 227, 213, 255, 219, 128, 128,\n 128,\n ],\n [106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128],\n ],\n [\n [1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128],\n [181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128],\n [78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128],\n ],\n [\n [1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128],\n [184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128],\n [77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128],\n ],\n [\n [1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128],\n [170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128],\n [37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128],\n ],\n [\n [1, 204, 254, 255, 245, 255, 128, 128, 128, 128,\n 128,\n ],\n [207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128],\n [102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128],\n ],\n [\n [1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128],\n [177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128],\n [80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62],\n [131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1],\n [68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128],\n ],\n [\n [1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128],\n [184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128],\n [81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128],\n ],\n [\n [1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128],\n [99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128],\n [23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128],\n ],\n [\n [1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128],\n [109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128],\n [44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128],\n ],\n [\n [1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128],\n [94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128],\n [22,\n 100, 174, 245, 186, 161, 255, 199, 128, 128, 128,\n ],\n ],\n [\n [1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128],\n [124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128],\n [35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128],\n ],\n [\n [1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128],\n [121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128],\n [45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128],\n ],\n [\n [1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128],\n [203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n [137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128],\n ],\n ],\n [\n [\n [253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128],\n [175, 13,\n 224, 243, 193, 185, 249, 198, 255, 255, 128,\n ],\n [73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128],\n ],\n [\n [1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128],\n [239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128],\n [155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128],\n ],\n [\n [1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128],\n [201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128],\n [69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128],\n ],\n [\n [1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128],\n [223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128],\n [141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 16, 248, 255,\n 255, 128, 128, 128, 128, 128, 128,\n ],\n [190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128],\n [149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128],\n [213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128],\n [55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n [\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128],\n [128, 128, 128, 128,\n 128, 128, 128, 128, 128, 128, 128,\n ],\n ],\n ],\n [\n [\n [202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255],\n [126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128],\n [61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128],\n ],\n [\n [1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128],\n [166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128],\n [39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128],\n ],\n [\n [1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128],\n [124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128],\n [24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128],\n ],\n [\n [1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128],\n [149, 150, 226, 252, 216,\n 205, 255, 171, 128, 128, 128,\n ],\n [28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128],\n ],\n [\n [1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128],\n [123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128],\n [20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128],\n ],\n [\n [1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128],\n [168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128],\n [47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128],\n ],\n [\n [1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128],\n [141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128],\n [42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128],\n ],\n [\n [1, 1, 255, 128, 128, 128, 128,\n 128, 128, 128, 128,\n ],\n [244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n [238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128],\n ],\n ],\n ];\n var Rf = [\n [\n [231, 120, 48, 89, 115, 113, 120, 152, 112],\n [152, 179, 64, 126, 170, 118, 46, 70, 95],\n [175, 69, 143, 80, 85, 82, 72, 155, 103],\n [56, 58, 10, 171, 218, 189, 17, 13, 152],\n [114, 26, 17, 163, 44, 195, 21, 10, 173],\n [121, 24, 80, 195, 26, 62, 44, 64, 85],\n [144, 71, 10, 38, 171, 213, 144, 34, 26],\n [170, 46, 55, 19, 136, 160, 33, 206, 71],\n [63, 20, 8, 114, 114, 208, 12, 9, 226],\n [81, 40, 11, 96, 182, 84, 29, 16, 36],\n ],\n [\n [134, 183, 89, 137, 98, 101, 106, 165, 148],\n [72, 187, 100, 130, 157, 111,\n 32, 75, 80,\n ],\n [66, 102, 167, 99, 74, 62, 40, 234, 128],\n [41, 53, 9, 178, 241, 141, 26, 8, 107],\n [74, 43, 26, 146, 73, 166, 49, 23, 157],\n [65, 38, 105, 160, 51, 52, 31, 115, 128],\n [104, 79, 12, 27, 217, 255, 87, 17, 7],\n [87, 68, 71, 44, 114, 51, 15, 186, 23],\n [47, 41, 14, 110, 182, 183, 21, 17, 194],\n [66, 45, 25, 102, 197, 189, 23, 18, 22],\n ],\n [\n [88, 88, 147, 150, 42, 46, 45, 196, 205],\n [43, 97, 183, 117, 85, 38, 35, 179, 61],\n [39, 53, 200, 87, 26, 21, 43, 232, 171],\n [56, 34, 51, 104, 114, 102, 29, 93, 77],\n [39, 28, 85, 171, 58, 165, 90, 98, 64],\n [34, 22, 116, 206, 23, 34, 43, 166, 73],\n [107, 54, 32, 26, 51, 1, 81, 43, 31],\n [68, 25, 106, 22,\n 64, 171, 36, 225, 114,\n ],\n [34, 19, 21, 102, 132, 188, 16, 76, 124],\n [62, 18, 78, 95, 85, 57, 50, 48, 51],\n ],\n [\n [193, 101, 35, 159, 215, 111, 89, 46, 111],\n [60, 148, 31, 172, 219, 228, 21, 18, 111],\n [112, 113, 77, 85, 179, 255, 38, 120, 114],\n [40, 42, 1, 196, 245, 209, 10, 25, 109],\n [88, 43, 29, 140, 166, 213, 37, 43, 154],\n [61, 63, 30, 155, 67, 45, 68, 1, 209],\n [100, 80, 8, 43, 154, 1, 51, 26, 71],\n [142, 78, 78, 16, 255, 128, 34, 197, 171],\n [41, 40, 5, 102, 211, 183, 4, 1, 221],\n [51, 50, 17, 168, 209, 192, 23, 25, 82],\n ],\n [\n [138, 31, 36, 171, 27, 166, 38, 44, 229],\n [67, 87, 58, 169, 82, 115, 26, 59, 179],\n [63, 59, 90, 180, 59, 166, 93, 73,\n 154,\n ],\n [40, 40, 21, 116, 143, 209, 34, 39, 175],\n [47, 15, 16, 183, 34, 223, 49, 45, 183],\n [46, 17, 33, 183, 6, 98, 15, 32, 183],\n [57, 46, 22, 24, 128, 1, 54, 17, 37],\n [65, 32, 73, 115, 28, 128, 23, 128, 205],\n [40, 3, 9, 115, 51, 192, 18, 6, 223],\n [87, 37, 9, 115, 59, 77, 64, 21, 47],\n ],\n [\n [104, 55, 44, 218, 9, 54, 53, 130, 226],\n [64, 90, 70, 205, 40, 41, 23, 26, 57],\n [54, 57, 112, 184, 5, 41, 38, 166, 213],\n [30, 34, 26, 133, 152, 116, 10, 32, 134],\n [39, 19, 53, 221, 26, 114, 32, 73, 255],\n [31, 9, 65, 234, 2, 15, 1, 118, 73],\n [75, 32, 12, 51, 192, 255, 160, 43, 51],\n [88, 31, 35, 67, 102, 85, 55, 186, 85],\n [56, 21, 23, 111, 59, 205, 45, 37, 192],\n [55, 38, 70, 124, 73, 102, 1, 34, 98],\n ],\n [\n [125, 98, 42, 88, 104, 85, 117, 175, 82],\n [95, 84, 53, 89, 128, 100, 113, 101, 45],\n [75, 79, 123, 47, 51, 128, 81, 171, 1],\n [57, 17, 5, 71, 102, 57, 53, 41, 49],\n [38, 33, 13, 121, 57, 73, 26, 1, 85],\n [41, 10, 67, 138, 77, 110, 90, 47, 114],\n [115, 21, 2, 10, 102, 255, 166, 23, 6],\n [101, 29, 16, 10, 85, 128, 101, 196, 26],\n [57, 18, 10, 102, 102, 213, 34, 20, 43],\n [117, 20, 15, 36, 163, 128, 68, 1, 26],\n ],\n [\n [102, 61, 71, 37, 34, 53, 31, 243, 192],\n [69, 60, 71, 38, 73, 119, 28, 222, 37],\n [68, 45, 128, 34, 1, 47, 11, 245, 171],\n [62, 17, 19, 70, 146, 85, 55, 62, 70],\n [37, 43, 37, 154, 100, 163, 85, 160,\n 1,\n ],\n [63, 9, 92, 136, 28, 64, 32, 201, 85],\n [75, 15, 9, 9, 64, 255, 184, 119, 16],\n [86, 6, 28, 5, 64, 255, 25, 248, 1],\n [56, 8, 17, 132, 137, 255, 55, 116, 128],\n [58, 15, 20, 82, 135, 57, 26, 121, 40],\n ],\n [\n [164, 50, 31, 137, 154, 133, 25, 35, 218],\n [51, 103, 44, 131, 131, 123, 31, 6, 158],\n [86, 40, 64, 135, 148, 224, 45, 183, 128],\n [22, 26, 17, 131, 240, 154, 14, 1, 209],\n [45, 16, 21, 91, 64, 222, 7, 1, 197],\n [56, 21, 39, 155, 60, 138, 23, 102, 213],\n [83, 12, 13, 54, 192, 255, 68, 47, 28],\n [85, 26, 85, 85, 128, 128, 32, 146, 171],\n [18, 11, 7, 63, 144, 171, 4, 4, 246],\n [35, 27, 10, 146, 174, 171, 12, 26, 128],\n ],\n [\n [190, 80, 35, 99, 180, 80,\n 126, 54, 45,\n ],\n [85, 126, 47, 87, 176, 51, 41, 20, 32],\n [101, 75, 128, 139, 118, 146, 116, 128, 85],\n [56, 41, 15, 176, 236, 85, 37, 9, 62],\n [71, 30, 17, 119, 118, 255, 17, 18, 138],\n [101, 38, 60, 138, 55, 70, 43, 26, 142],\n [146, 36, 19, 30, 171, 255, 97, 27, 20],\n [138, 45, 61, 62, 219, 1, 81, 188, 64],\n [32, 41, 20, 117, 151, 142, 20, 21, 163],\n [112, 19, 12, 61, 195, 128, 48, 4, 24],\n ],\n ];\n var If = [\n [\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 241,\n 252, 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255],\n [250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [225, 252, 241, 253, 255, 255, 254, 255,\n 255, 255, 255,\n ],\n [234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255,\n 255, 255, 255, 255, 255, 255,\n ],\n [252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n ],\n ],\n [\n [\n [186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255],\n [234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255],\n [251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255],\n ],\n [\n [255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255,\n 255, 255,\n ],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n [\n [\n [248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255],\n [248, 254, 253, 255, 255, 255,\n 255, 255, 255, 255, 255,\n ],\n [253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255],\n [252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 253,\n 255, 255, 255, 255, 255, 255, 255, 255,\n ],\n [250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n [\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],\n ],\n ],\n ];\n this.WebPGetDecoderVersion = this.Ld = function () {\n return 512;\n };\n var Nc = [0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0];\n var Jf = [\n [173, 148, 140, 0],\n [176, 155, 140, 135, 0],\n [180, 157, 141, 134, 130, 0],\n [254, 254, 243, 230, 196, 177, 153, 140, 133, 130, 129, 0],\n ];\n var Kf = [0, 1, 4, 8, 5, 2, 3, 6,\n 9, 12, 13, 10, 7, 11, 14, 15,\n ];\n var Tf = md([Kc, Lc], '');\n U(4, x);\n var vc = [\n [0, 0, 0, 0],\n [1, 0, 0, 0],\n [0, 1, 0, 0],\n [1, 1, 0, 0],\n [0, 0, 1, 0],\n [1, 0, 1, 0],\n [0, 1, 1, 0],\n [1, 1, 1, 0],\n [0, 0, 0, 1],\n [1, 0, 0, 1],\n [0, 1, 0, 1],\n [1, 1, 0, 1],\n [0, 0, 1, 1],\n [1, 0, 1, 1],\n [0, 1, 1, 1],\n [1, 1, 1, 1],\n ];\n var Lf = 134480385;\n var ea = 16;\n var J = -227;\n var dd = 482;\n var Ce = [Wc, function (a) {\n return a;\n }, function (a, b, c) {\n return b[c + 0];\n }, function (a, b, c) {\n return b[c + 1];\n }, function (a, b, c) {\n return b[c - 1];\n }, function (a, b, c) {\n return ka(ka(a, b[c + 1]), b[c + 0]);\n }, function (a, b, c) {\n return ka(a, b[c - 1]);\n }, function (a, b, c) {\n return ka(a, b[c + 0]);\n }, function (a,\n b, c) {\n return ka(b[c - 1], b[c + 0]);\n }, function (a, b, c) {\n return ka(b[c + 0], b[c + 1]);\n }, function (a, b, c) {\n return ka(ka(a, b[c - 1]), ka(b[c + 0], b[c + 1]));\n }, function (a, b, c) {\n return Math.abs((a >> 24 & 255) - (b[c - 1] >> 24 & 255)) - Math.abs((b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) + (Math.abs((a >> 16 & 255) - (b[c - 1] >> 16 & 255)) - Math.abs((b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255))) + (Math.abs((a >> 8 & 255) - (b[c - 1] >> 8 & 255)) - Math.abs((b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255))) + (Math.abs((a & 255) - (b[c - 1] & 255)) - Math.abs((b[c + 0] & 255) - (b[c - 1] & 255))) <= 0 ? b[c + 0] : a;\n }, function (a, b, c) {\n return ($a((a\n >> 24 & 255) + (b[c + 0] >> 24 & 255) - (b[c - 1] >> 24 & 255)) << 24 | $a((a >> 16 & 255) + (b[c + 0] >> 16 & 255) - (b[c - 1] >> 16 & 255)) << 16 | $a((a >> 8 & 255) + (b[c + 0] >> 8 & 255) - (b[c - 1] >> 8 & 255)) << 8 | $a((a & 255) + (b[c + 0] & 255) - (b[c - 1] & 255))) >>> 0;\n }, function (a, b, c) {\n const d = b[c - 1];\n a = ka(a, b[c + 0]);\n return (yb(a >> 24 & 255, d >> 24 & 255) << 24 | yb(a >> 16 & 255, d >> 16 & 255) << 16 | yb(a >> 8 & 255, d >> 8 & 255) << 8 | yb(a >> 0 & 255, d >> 0 & 255)) >>> 0;\n }, Wc, Wc];\n var Xf = {\n Cc: x,\n Bc: x,\n Kc: x,\n };\n var $c = 16;\n var Me = 16;\n var kg = 16;\n var mg = [2, 3, 7];\n var lg = [3, 3, 11];\n var Zf = 0;\n var $f = 1;\n var ag = 2;\n var bg = 3;\n var cg = 4;\n var hg = [Ba + Ge, Ba, Ba, Ba, 40];\n var Ke = 19;\n var ig = [17, 18, 0, 1, 2, 3, 4, 5, 16,\n 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n ];\n var He = 120;\n var dg = [24, 7, 23, 25, 40, 6, 39, 41, 22, 26, 38, 42, 56, 5, 55, 57, 21, 27, 54, 58, 37, 43, 72, 4, 71, 73, 20, 28, 53, 59, 70, 74, 36, 44, 88, 69, 75, 52, 60, 3, 87, 89, 19, 29, 86, 90, 35, 45, 68, 76, 85, 91, 51, 61, 104, 2, 103, 105, 18, 30, 102, 106, 34, 46, 84, 92, 67, 77, 101, 107, 50, 62, 120, 1, 119, 121, 83, 93, 17, 31, 100, 108, 66, 78, 118, 122, 33, 47, 117, 123, 49, 63, 99, 109, 82, 94, 0, 116, 124, 65, 79, 16, 32, 98, 110, 48, 115, 125, 81, 95, 64, 114, 126, 97, 111, 80, 113, 127, 96, 112];\n var Jb = 1 << ea - 1;\n var Za = U(256, 0);\n var xb = U(256, 0);\n var vb = U(256, la);\n var wb = U(256, la);\n var ia = U(dd - J, x);\n var Hb = U(dd\n - J, x);\n var Xe = 0;\n var V = Array(Cc);\n var vg = [function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, hc, 3);\n }, Se, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, Vc, 3);\n }, Te, Ue, Ve, function (a, b, c, d, e, f, k, h, n, l, m, t, q) {\n Ca(a, b, c, d, e, f, k, h, n, l, m, t, q, le, 2);\n }, Se, Te, Ue, Ve];\n this.Hd = function (a, b, c, d) {\n return lb(Qa, a, b, c, d);\n };\n this.Id = function (a, b, c, d) {\n return lb(jb, a, b, c, d);\n };\n this.Jd = function (a, b, c, d) {\n return lb(kb, a, b, c, d);\n };\n this.Ed = function (a, b, c, d) {\n return lb(Ab, a, b, c, d);\n };\n this.Fd = function (a, b, c, d) {\n return lb(Zc,\n a, b, c, d);\n };\n this.Gd = function (a, b, c, d) {\n return lb(Pa, a, b, c, d);\n };\n this.WebPDecode = this.Dd = function (a, b, c) {\n const d = M(df);\n let e = 'VP8StatusCode';\n if (c == p) return ta;\n e = hd(a, [0], [b], c.input);\n if (e != L) return e == Z ? W : e;\n d.j = c.j;\n d.Qa = c.Qa;\n return e = cf(a, 0, [b], d);\n };\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {webp2png} from './webp';\nimport type {ConvertWebPTask} from './webpWorkerController';\n\nconst ctx = self as any as DedicatedWorkerGlobalScope;\nconst tasks: ConvertWebPTask[] = [];\n// let isProcessing = false;\n\nfunction finishTask() {\n // isProcessing = false;\n processTasks();\n}\n\nfunction processTasks() {\n // if(isProcessing) return;\n\n const task = tasks.shift();\n if(!task) return;\n\n // isProcessing = true;\n\n switch(task.type) {\n case 'convertWebp': {\n const {fileName, bytes} = task.payload;\n\n let convertedBytes: Uint8Array;\n try {\n convertedBytes = webp2png(bytes).bytes;\n } catch(err) {\n console.error('Convert webp2png error:', err, 'payload:', task.payload);\n }\n\n ctx.postMessage({\n type: 'convertWebp',\n payload: {\n fileName,\n bytes: convertedBytes\n }\n });\n\n finishTask();\n\n break;\n }\n\n default:\n finishTask();\n }\n}\n\nfunction scheduleTask(task: ConvertWebPTask) {\n tasks.push(task);\n /* if(task.payload.fileName.indexOf('main-') === 0) {\n tasks.push(task);\n } else {\n tasks.unshift(task);\n } */\n\n processTasks();\n}\n\nctx.addEventListener('message', (event) => {\n scheduleTask(event.data);\n});\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {WebPDecoder} from '../../vendor/libwebp-0.2.0';\nimport {encode} from 'fast-png';\n\nexport function webp2png(data: Uint8Array) {\n const decoder = new WebPDecoder();\n const config: any = decoder.WebPDecoderConfig;\n const buffer = config.j || config.output;\n const bitstream = config.input;\n\n decoder.WebPInitDecoderConfig(config);\n decoder.WebPGetFeatures(data, data.length, bitstream);\n\n /** MODE_RGBA = 1 MODE_ARGB = 4, */\n buffer.J = 1;\n\n let status;\n try {\n status = decoder.WebPDecode(data, data.length, config);\n } catch(e) {\n status = e;\n }\n\n if(status === 0) {\n const rgbaData = buffer.Jb;\n const pngData = encode({\n data: rgbaData,\n width: buffer.width,\n height: buffer.height,\n channels: 4,\n depth: 8\n });\n\n return {status, bytes: pngData};\n }\n\n return {status, bytes: data};\n}\n\nexport function webp2pngAsBlob(data: Uint8Array) {\n const {status, bytes} = webp2png(data);\n return new Blob([bytes], {type: status === 0 ? 'image/png' : 'image/webp'});\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,866,158], () => (__webpack_require__(2061)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + {\"158\":\"npm.iobuffer\",\"699\":\"npm.pako\",\"866\":\"npm.fast-png\"}[chunkId] + \".\" + {\"158\":\"061a9f8cc247dc1dbb8d\",\"699\":\"85f88e27b023cbb2ca51\",\"866\":\"8cb0a7aa9c4ab1eb9f54\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t61: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","i","p","M","F","JSON","parse","stringify","N","G","w","D","S","Nb","length","push","ic","rc","memmove","arr1","index1","arr2","index2","jd","kd","ga","String","fromCharCode","U","ld","md","$","Error","WebPDecoder","a","Ob","Pb","Bb","Qb","b","c","la","d","e","Z","gc","bc","qa","Ia","Rb","ya","T","Q","g","L","fa","Sb","Da","gf","hf","ma","Pa","gb","nd","Y","jf","s","ja","jc","k","h","n","l","kc","od","Tb","pd","Ea","qd","P","v","Ga","ub","Xb","m","f","q","r","u","C","Ub","kf","lf","rd","Vb","A","z","sd","td","na","put","ud","Mb","vd","wd","ka","fd","width","height","o","Wa","Cb","Ka","xd","Db","lc","V","Ha","mf","sa","nf","zd","ta","Ua","wc","vc","t","I","Ba","Aa","J","Qa","Cc","Fc","Jb","yd","ua","parseInt","Ra","cb","RGBA","Sa","size","Va","y","Wc","B","nb","Rc","rb","Uc","Wb","Fa","of","mb","Ad","pf","qf","mc","nc","rf","Dc","oa","Yb","Zb","sc","oc","Bd","va","Cd","tc","Dd","Ed","sf","tf","uf","vf","wf","xf","yf","zf","Af","Bf","Fd","$b","Cf","Df","Ef","Ec","wa","Gd","xc","alert","za","Hd","Id","Jd","Gc","data","Kd","ia","W","pa","offset","Ac","fb","Jc","Nc","gd","hd","Ma","hb","K","R","Ta","Ff","Ca","pb","ob","tb","Kb","Lb","uc","$c","xa","Ld","Ab","Oc","Fb","kb","Hc","Lc","Gf","Hb","yb","Ic","sb","qc","Hf","Zc","Md","Nd","Kc","If","pc","Pc","fc","dd","cd","Mc","Jf","Kf","Lf","Mf","Nf","Za","lb","Ya","wb","Ja","qb","WebPWorkerReset","Qd","Rd","Ud","FinishRow","jb","Od","Of","Pf","Pd","Gb","ib","dc","Xc","Sc","Vc","Sd","ha","H","ca","da","aa","ba","ra","La","Qc","Td","Vd","Wd","Xd","Yd","Zd","$d","ae","be","ce","Qf","db","X","cc","O","Eb","Rf","Sf","de","ee","fe","ge","Tc","Oa","Tf","ea","ab","Xa","he","vb","xb","ac","ie","Uf","$a","Vf","je","zb","zc","yc","eb","WebPWorkerSync","OK","hc","WebPWorkerLaunch","Ib","Na","ec","Bc","ke","le","me","ne","oe","pe","qe","re","se","te","ue","ve","we","Wf","xe","Yc","ye","bd","ze","Ae","Be","Ce","De","Xf","Ee","Yf","EmitRescaledRows","WebPApplyAlphaMultiply","WebPApplyAlphaMultiply4444","Fe","EmitRescaledRowsYUVA","EmitRowsYUVA","Ge","Zf","$f","ag","bg","ad","bb","cg","He","dg","End","Ie","eg","Je","Array","fg","gg","hg","Ke","ig","jg","Le","Me","kg","lg","mg","pg","qg","Oe","Pe","Qe","Re","rg","Se","Te","Ue","Ve","sg","tg","j","ug","vg","wg","xg","We","yg","zg","memory","Ne","InitRGBRescaler","InitYUVRescaler","Xe","ed","Ye","Ag","Bg","Ze","$e","af","bf","cf","ng","AllocateAndInitRescaler","og","Cg","this","value","df","ef","WEBP_CSP_MODE","VP8StatusCode","rotate","WebPGetFeatures","ff","WebPDecoderConfig","input","options","WebPInitDecoderConfig","Math","pow","Eg","Fg","Gg","id","Hg","Ig","Kg","WebPFreeDecBuffer","WebPGetDecoderVersion","abs","WebPDecode","ctx","self","tasks","finishTask","processTasks","task","shift","type","fileName","bytes","payload","convertedBytes","decoder","config","buffer","output","bitstream","status","rgbaData","channels","depth","webp2png","err","console","error","postMessage","addEventListener","event","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","call","x","__webpack_exports__","result","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","Object","keys","every","key","splice","definition","defineProperty","enumerable","get","chunkId","Promise","all","reduce","promises","miniCssF","globalThis","Function","window","obj","prop","prototype","hasOwnProperty","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","replace","oldGetScript","oldLoadScript","queryMap","countMap","catch","retries","realSrc","message","request","resolve","setTimeout","cacheBust","Date","now","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","bind","moreModules","runtime","pop","map","then"],"sourceRoot":""} \ No newline at end of file diff --git a/public/946.03f0ef26aad0c7635d9b.bundle.js b/public/946.d26679f97a8960b11df8.bundle.js similarity index 99% rename from public/946.03f0ef26aad0c7635d9b.bundle.js rename to public/946.d26679f97a8960b11df8.bundle.js index 708b0fc53..65eac0b9e 100644 --- a/public/946.03f0ef26aad0c7635d9b.bundle.js +++ b/public/946.d26679f97a8960b11df8.bundle.js @@ -1,2 +1,2 @@ -"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[946],{4159:(d,e,u)=>{var t;u.d(e,{Z:()=>s});const f=["web.telegram.org","webk.telegram.org"],r=Math.min(4,null!==(t=navigator.hardwareConcurrency)&&void 0!==t?t:4),c={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.7.0",versionFull:"1.7.0 (288)",build:288,langPackVersion:"0.7.9",langPack:"webk",langPackCode:"en",domains:f,baseDcId:2,isMainDomain:f.includes(location.hostname),suffix:"K",threads:r,cryptoWorkers:r};c.isMainDomain&&(c.id=2496,c.hash="8da85b0d5bfe62527e5b244c209159c3");const s=c},3127:(d,e,u)=>{u.d(e,{Z:()=>t});const t={name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]}},8975:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(7119);function f(d,e=""){Array.isArray(d)||(d=[d]);const u=(0,t.Z)(e);return new Blob(d,{type:u})}},7119:(d,e,u)=>{function t(d){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","audio/wav","application/json","application/pdf"].indexOf(d)?"application/octet-stream":d}u.d(e,{Z:()=>t})},4903:(d,e,u)=>{function t(...d){const e=d.reduce(((d,e)=>d+(e.byteLength||e.length)),0),u=new Uint8Array(e);let t=0;return d.forEach((d=>{u.set(d instanceof ArrayBuffer?new Uint8Array(d):d,t),t+=d.byteLength||d.length})),u}u.d(e,{Z:()=>t})},3725:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(319);function f(){const d={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...e)=>{d.lastNotify=e,d.listeners.forEach((d=>d(...e)))},listeners:[],addNotifyListener:e=>{d.lastNotify&&e(...d.lastNotify),d.listeners.push(e)}},e=new Promise(((u,t)=>{d.resolve=d=>{e.isFulfilled||e.isRejected||(e.isFulfilled=!0,u(d))},d.reject=(...d)=>{e.isRejected||e.isFulfilled||(e.isRejected=!0,t(...d))}}));return e.catch(t.Z).finally((()=>{e.notify=e.notifyAll=e.lastNotify=null,e.listeners.length=0,e.cancel&&(e.cancel=t.Z)})),Object.assign(e,d),e}},1352:(d,e,u)=>{u.d(e,{N5:()=>f,SU:()=>t,kC:()=>r});const t="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,f="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!t,r=f||t,c=(d,...e)=>{try{d.postMessage(...e)}catch(d){console.error("[worker] postMessage error:",d,e)}},s=(d,...e)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then((u=>{u.length&&u.slice(d?0:-1).forEach((d=>{c(d,...e)}))}))};t&&s.bind(null,!1),t&&s.bind(null,!0)},319:(d,e,u)=>{function t(){}u.d(e,{Z:()=>t})},8479:(d,e,u)=>{function t(d){if(null===d||"object"!=typeof d)return d;if(d instanceof Date)return new Date(d.getTime());if(Array.isArray(d))return d.map((d=>t(d)));if(ArrayBuffer.isView(d))return d.slice();const e=new d.constructor;for(var u in d)d.hasOwnProperty(u)&&(e[u]=t(d[u]));return e}u.d(e,{Z:()=>t})},6848:(d,e,u)=>{function t(d,e){const u=Object.keys,f=typeof d;return d&&e&&"object"===f&&f===typeof e?u(d).length===u(e).length&&u(d).every((u=>t(d[u],e[u]))):d===e}u.d(e,{Z:()=>t})},5880:(d,e,u)=>{function t(d){return"object"==typeof d&&null!==d}u.d(e,{Z:()=>t})},5953:(d,e,u)=>{function t(d,e){if(e)for(const u in e)void 0!==e[u]&&(d[u]=e[u]);return d}u.d(e,{Z:()=>t})},946:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(8479),f=u(5880);function r(d,e,u,c){for(const s in d)typeof e[s]!=typeof d[s]?(e[s]=(0,t.Z)(d[s]),u&&u(c||s)):(0,f.Z)(d[s])&&r(d[s],e[s],u,c||s)}},4110:(d,e,u)=>{var t=u(7361),f=u(617);String.prototype.toUserId=function(){return(+this).toUserId()},String.prototype.toChatId=function(){return(+this).toChatId()},String.prototype.toPeerId=function(d){return(+this).toPeerId(d)},String.prototype.isPeerId=function(){return/^[\d-]/.test(this.toString())},Number.prototype.toUserId=function(){return this},Number.prototype.toChatId=function(){return Math.abs(this)},Number.prototype.toPeerId=function(d){return void 0===d?this:d?-Math.abs(this):this},Number.prototype.isPeerId=function(){return!0},[["isUser",f.Z],["isAnyChat",t.Z]].forEach((d=>{const e=Array.isArray(d)?d[0]:d,u=Array.isArray(d)?d[1]:d;String.prototype[e]=function(){return u.call(null,this.toString())},Number.prototype[e]=function(){return u.call(null,this)}}))},144:(d,e,u)=>{u.d(e,{a:()=>r,d:()=>f});const t={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function f(d){const e=t[d];return crypto.getRandomValues(e),e[0]}function r(){return""+f(32)+f(32)%16777215}},5466:(d,e,u)=>{u.d(e,{$:()=>f});var t=u(5289);function f(d){return(...e)=>function(d,e,u){const f=performance.now();return(u||console).warn((0,t.Z)(),"start",e),d.then((()=>{(u||console).warn((0,t.Z)(),"end",e,performance.now()-f)})),d}(...e,d)}},5418:(d,e,u)=>{function t(d){return new Promise((e=>{setTimeout(e,d)}))}u.d(e,{Z:()=>t})},6724:(d,e,u)=>{function t(d,e,u=!0){let t,f,r=null;return(...c)=>{t=!0,f=c,r||(u&&(t=!1,d(...f)),r=setInterval((()=>{if(!t)return clearInterval(r),void(r=null);t=!1,d(...f)}),e))}}u.d(e,{Z:()=>t})},9005:(d,e,u)=>{function t(d){return d.charAt(0).toUpperCase()+d.slice(1)}u.d(e,{Z:()=>t})},8453:(d,e,u)=>{u.d(e,{Z:()=>s});var t=u(5936),f=u(3989),r=u(7487),c=u(319);function s(d,e){return Promise.all([f.Z.toggleStorage(d,e),t.Z.toggleStorage(d,e),r.Z.toggleStorage(d,e)]).then(c.Z,c.Z)}},7298:(d,e,u)=>{function t(d){const e=Date.now();return d?e/1e3|0:e}u.d(e,{Z:()=>t})},7361:(d,e,u)=>{function t(d){return+d<0}u.d(e,{Z:()=>t})},617:(d,e,u)=>{function t(d){return+d>=0}u.d(e,{Z:()=>t})},8630:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(153),f=u(410),r=u(1352);class c extends t.Z{constructor(){super("CRYPTO"),this.lastIndex=-1}invokeCryptoNew({method:d,args:e,transfer:u}){const t={method:d,args:e},f=this.listeners.invoke;if(null==f?void 0:f.length){let d=f[0].callback(t);return r.kC||d instanceof Promise||(d=Promise.resolve(d)),d}const c="aes-encrypt"===d||"aes-decrypt"===d?this.lastIndex=(this.lastIndex+1)%this.sendPorts.length:0;return this.invoke("invoke",t,void 0,this.sendPorts[c],u)}invokeCrypto(d,...e){return this.invokeCryptoNew({method:d,args:e})}}const s=new c;f.GO&&(f.GO.cryptoMessagePort=s);const n=s},5936:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(1267),f=u(8975),r=u(5753),c=u(5471),s=u(3725);class n{constructor(d){this.dbName=d,this.useStorage=!0,t.Z.test&&(this.dbName+="_test"),n.STORAGES.length&&(this.useStorage=n.STORAGES[0].useStorage),this.openDatabase(),n.STORAGES.push(this)}openDatabase(){var d;return null!==(d=this.openDbPromise)&&void 0!==d?d:this.openDbPromise=caches.open(this.dbName)}delete(d){return this.timeoutOperation((e=>e.delete("/"+d)))}deleteAll(){return caches.delete(this.dbName)}get(d){return this.timeoutOperation((e=>e.match("/"+d)))}save(d,e){return this.timeoutOperation((u=>u.put("/"+d,e)))}getFile(d,e="blob"){return this.get(d).then((d=>{if(!d)throw(0,c.Z)("NO_ENTRY_FOUND");return d[e]()}))}saveFile(d,e){e instanceof Blob||(e=(0,f.Z)(e));const u=new Response(e,{headers:{"Content-Length":""+e.size}});return this.save(d,u).then((()=>e))}timeoutOperation(d){return this.useStorage?new Promise(((e,u)=>{return t=this,f=void 0,c=function*(){let t=!1;const f=setTimeout((()=>{u(),t=!0}),15e3);try{const u=yield this.openDatabase();if(!u)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const f=yield d(u);if(t)return;e(f)}catch(d){u(d)}clearTimeout(f)},new((r=void 0)||(r=Promise))((function(d,e){function u(d){try{n(c.next(d))}catch(d){e(d)}}function s(d){try{n(c.throw(d))}catch(d){e(d)}}function n(e){var t;e.done?d(e.value):(t=e.value,t instanceof r?t:new r((function(d){d(t)}))).then(u,s)}n((c=c.apply(t,f||[])).next())}));var t,f,r,c})):Promise.reject((0,c.Z)("STORAGE_OFFLINE"))}prepareWriting(d,e,u){return{deferred:(0,s.Z)(),getWriter:()=>new r.Z(u,e,(e=>this.saveFile(d,e).catch((()=>e))))}}static toggleStorage(d,e){return Promise.all(this.STORAGES.map((u=>{if(u.useStorage=d,e)return d?void 0:u.deleteAll()})))}}n.STORAGES=[]},5753:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(8975);class f{constructor(d,e,u){this.mimeType=d,this.size=e,this.saveFileCallback=u,this.bytes=new Uint8Array(e)}write(d,e){return u=this,t=void 0,r=function*(){const u=e+d.byteLength;if(u>this.bytes.byteLength){const d=new Uint8Array(u);d.set(this.bytes,0),this.bytes=d}this.bytes.set(d,e)},new((f=void 0)||(f=Promise))((function(d,e){function c(d){try{n(r.next(d))}catch(d){e(d)}}function s(d){try{n(r.throw(d))}catch(d){e(d)}}function n(e){var u;e.done?d(e.value):(u=e.value,u instanceof f?u:new f((function(d){d(u)}))).then(c,s)}n((r=r.apply(u,t||[])).next())}));var u,t,f,r}truncate(){this.bytes=new Uint8Array}trim(d){this.bytes=this.bytes.slice(0,d)}finalize(d=!0){const e=(0,t.Z)(this.bytes,this.mimeType);return d&&this.saveFileCallback&&this.saveFileCallback(e),e}getParts(){return this.bytes}replaceParts(d){this.bytes=d}}},5003:(d,e,u)=>{u.d(e,{kg:()=>l,v9:()=>t});var t,f=u(410),r=u(4762),c=u(1352),s=u(5289);!function(d){d[d.None=0]="None",d[d.Error=1]="Error",d[d.Warn=2]="Warn",d[d.Log=4]="Log",d[d.Debug=8]="Debug"}(t||(t={}));const n=[t.None,t.Error,t.Warn,t.Log,t.Debug],o=!(r.IS_SAFARI||r.IS_FIREFOX),i="",a="",h=[["debug",t.Debug],["info",t.Log],["warn",t.Warn],["error",t.Error],["assert",t.Error],["trace",t.Log],["group",t.Log],["groupCollapsed",t.Log],["groupEnd",t.Log]];function l(d,e=t.Log|t.Warn|t.Error,u=!1,r=""){let b;f.ZP||u||(e=t.Error),o?r||(c.SU?r=i:c.N5&&(r=a)):r="";const g=r;r=r?`%s ${r}%s`:"%s";const p=function(...u){return e&t.Log&&console.log(r,(0,s.Z)(),d,...u)};return h.forEach((([u,t])=>{p[u]=function(...f){return e&t&&console[u](r,(0,s.Z)(),d,...f)}})),p.setPrefix=function(e){b=e,d="["+e+"]"},p.setPrefix(d),p.setLevel=function(d){e=n.slice(0,d+1).reduce(((d,e)=>d|e),0)},p.bindPrefix=function(d){return l(`${b}] [${d}`,e,u,g)},p}},3206:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(410),f=u(153);class r extends f.Z{constructor(){super("MTPROTO"),r.INSTANCE=this,t.GO&&(t.GO.mtprotoMessagePort=this)}static getInstance(){return this.INSTANCE}}},690:(d,e,u)=>{var t=u(4903);Uint8Array.prototype.concat=function(...d){return(0,t.Z)(this,...d)},Uint8Array.prototype.toJSON=function(){return[...this]},Promise.prototype.finally=Promise.prototype.finally||function(d){const e=e=>Promise.resolve(d()).then(e);return this.then((d=>e((()=>d))),(d=>e((()=>Promise.reject(d)))))}},6637:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(2423);function f(d){return d?d.match(t.bu):null}},3655:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(153),f=u(410);class r extends t.Z{constructor(){super("SERVICE"),f.GO&&(f.GO.serviceMessagePort=this)}}},7487:(d,e,u)=>{u.d(e,{Z:()=>i});var t=u(410),f=u(1267),r=u(1352),c=u(3206);class s{constructor(){this.prefix="",this.cache={},this.useStorage=!0,f.Z.test&&(this.prefix="t_")}get(d,e=!0){if(this.cache.hasOwnProperty(d)&&e)return this.cache[d];if(this.useStorage){let e;try{e=localStorage.getItem(this.prefix+d)}catch(d){this.useStorage=!1}if(null!==e)try{e=JSON.parse(e)}catch(d){}else e=void 0;return e}}set(d,e=!1){for(const u in d)if(d.hasOwnProperty(u)){const t=d[u];if(this.cache[u]=t,this.useStorage&&!e)try{const d=JSON.stringify(t);localStorage.setItem(this.prefix+u,d)}catch(d){this.useStorage=!1}}}delete(d,e=!1){d=""+d,e||delete this.cache[d];try{localStorage.removeItem(this.prefix+d)}catch(d){}}clear(){const d=["dc","server_time_offset","xt_instance","user_auth","state_id","k_build"];for(let e=1;e<=5;++e)d.push(`dc${e}_server_salt`),d.push(`dc${e}_auth_key`);for(const e of d)this.delete(e,!0)}toggleStorage(d,e){if(this.useStorage=d,e)return d?this.set(this.cache):void this.clear()}}class n{constructor(){n.STORAGES.push(this),r.kC||(this.storage=new s)}proxy(d,...e){return u=this,t=void 0,s=function*(){return r.kC?c.Z.getInstance().invoke("localStorageProxy",{type:d,args:e}):(e=Array.prototype.slice.call(e),this.storage[d].apply(this.storage,e))},new((f=void 0)||(f=Promise))((function(d,e){function r(d){try{n(s.next(d))}catch(d){e(d)}}function c(d){try{n(s.throw(d))}catch(d){e(d)}}function n(e){var u;e.done?d(e.value):(u=e.value,u instanceof f?u:new f((function(d){d(u)}))).then(r,c)}n((s=s.apply(u,t||[])).next())}));var u,t,f,s}get(d,e){return this.proxy("get",d,e)}set(d,e){return this.proxy("set",d,e)}delete(d,e){return this.proxy("delete",d,e)}clear(){return this.proxy("clear")}toggleStorage(d,e){return this.proxy("toggleStorage",d,e)}}n.STORAGES=[];const o=new n;t.GO.appStorage=o;const i=o},7922:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(410),f=u(3989),r=u(3127);class c extends f.Z{constructor(){super(r.Z,"session")}}const s=new c;t.GO.stateStorage=s;const n=s},3989:(d,e,u)=>{u.d(e,{Z:()=>i});var t=u(410),f=u(3725),r=u(1352),c=u(6724),s=u(6666),n=function(d,e,u,t){return new(u||(u=Promise))((function(f,r){function c(d){try{n(t.next(d))}catch(d){r(d)}}function s(d){try{n(t.throw(d))}catch(d){r(d)}}function n(d){var e;d.done?f(d.value):(e=d.value,e instanceof u?e:new u((function(d){d(e)}))).then(c,s)}n((t=t.apply(d,e||[])).next())}))};function o(){}class i{constructor(d,e){this.db=d,this.storeName=e,this.cache={},this.getPromises=new Map,this.keysToSet=new Set,this.saveDeferred=(0,f.Z)(),this.keysToDelete=new Set,this.deleteDeferred=(0,f.Z)(),this.storage=new s.Z(d,e),i.STORAGES.length?this.useStorage=i.STORAGES[0].useStorage:this.useStorage=!0,this.savingFreezed=!1,i.STORAGES.push(this),this.saveThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=this.saveDeferred;this.saveDeferred=(0,f.Z)();const e=this.keysToSet;if(e.size){const d=Array.from(e.values());e.clear();const u=d.map((d=>this.cache[d]));try{yield this.storage.save(d,u)}catch(e){console.error("[AS]: set error:",e,d,u)}}d.resolve(),e.size&&this.saveThrottled()}))),16,!1),this.deleteThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=this.deleteDeferred;this.deleteDeferred=(0,f.Z)();const e=this.keysToDelete;if(e.size){const d=Array.from(e.values());e.clear();try{yield this.storage.delete(d)}catch(e){console.error("[AS]: delete error:",e,d)}}d.resolve(),e.size&&this.deleteThrottled()}))),16,!1),this.getThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=Array.from(this.getPromises.keys());this.storage.get(d).then((e=>{for(let u=0,t=d.length;u{new Set(["NO_ENTRY_FOUND","STORAGE_OFFLINE"]).has(u.type)||(this.useStorage=!1,console.error("[AS]: get error:",u,d,e));for(let e=0,u=d.length;e{this.getPromises.size&&this.getThrottled()}))}))),16,!1)}isAvailable(){return this.useStorage}getCache(){return this.cache}getFromCache(d){return this.cache[d]}setToCache(d,e){return this.cache[d]=e}get(d,e=!0){return n(this,void 0,void 0,(function*(){if(this.cache.hasOwnProperty(d)&&e)return this.getFromCache(d);if(this.useStorage){const e=this.getPromises.get(d);if(e)return e;const u=(0,f.Z)();return this.getPromises.set(d,u),this.getThrottled(),u}}))}getAll(){return this.storage.getAll().catch((()=>[]))}set(d,e=!1){const u=this.useStorage&&!e&&!this.savingFreezed;for(const e in d)if(d.hasOwnProperty(e)){const t=d[e];this.setToCache(e,t),u&&(this.keysToSet.add(e),this.keysToDelete.delete(e),this.saveThrottled())}return u?this.saveDeferred:Promise.resolve()}delete(d,e=!1){return d=""+d,e||delete this.cache[d],this.useStorage&&(this.keysToSet.delete(d),this.keysToDelete.add(d),this.deleteThrottled()),this.useStorage?this.deleteDeferred:Promise.resolve()}clear(d=!1){if(!d)for(const d in this.cache)delete this.cache[d];return this.storage.clear().catch(o)}static toggleStorage(d,e){return Promise.all(this.STORAGES.map((u=>{if(u.useStorage=d,r.kC&&e)return d?u.set(u.cache):(u.keysToSet.clear(),u.keysToDelete.clear(),u.getPromises.forEach((d=>d.resolve(void 0))),u.getPromises.clear(),u.clear(!0))}))).catch(o)}static freezeSaving(d,e){this.STORAGES.forEach((d=>d.savingFreezed=!0));try{d()}catch(d){console.error("freezeSaving callback error:",d)}this.STORAGES.forEach((d=>d.savingFreezed=!1))}}i.STORAGES=[],t.GO&&(t.GO.AppStorage=i)},1229:(d,e,u)=>{u.d(e,{Z:()=>t});const t="((?:👨🏻‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏼‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏽‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏾‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏿‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|🧑🏻‍❤️?‍💋‍🧑\ud83c[\udffc-\udfff]|🧑🏼‍❤️?‍💋‍🧑\ud83c[\udffb\udffd-\udfff]|🧑🏽‍❤️?‍💋‍🧑\ud83c[\udffb\udffc\udffe\udfff]|🧑🏾‍❤️?‍💋‍🧑\ud83c[\udffb-\udffd\udfff]|🧑🏿‍❤️?‍💋‍🧑\ud83c[\udffb-\udffe]|👨🏻‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👨🏼‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👨🏽‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👨🏾‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👨🏿‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏻‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👩🏻‍🤝‍👩\ud83c[\udffc-\udfff]|👩🏼‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👩🏼‍🤝‍👩\ud83c[\udffb\udffd-\udfff]|👩🏽‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👩🏽‍🤝‍👩\ud83c[\udffb\udffc\udffe\udfff]|👩🏾‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👩🏾‍🤝‍👩\ud83c[\udffb-\udffd\udfff]|👩🏿‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏿‍🤝‍👩\ud83c[\udffb-\udffe]|🧑🏻‍❤️?‍🧑\ud83c[\udffc-\udfff]|🧑🏻‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏼‍❤️?‍🧑\ud83c[\udffb\udffd-\udfff]|🧑🏼‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏽‍❤️?‍🧑\ud83c[\udffb\udffc\udffe\udfff]|🧑🏽‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏾‍❤️?‍🧑\ud83c[\udffb-\udffd\udfff]|🧑🏾‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏿‍❤️?‍🧑\ud83c[\udffb-\udffe]|🧑🏿‍🤝‍🧑\ud83c[\udffb-\udfff]|👨‍❤️?‍💋‍👨|👩‍❤️?‍💋‍\ud83d[\udc68\udc69]|🫱🏻‍🫲\ud83c[\udffc-\udfff]|🫱🏼‍🫲\ud83c[\udffb\udffd-\udfff]|🫱🏽‍🫲\ud83c[\udffb\udffc\udffe\udfff]|🫱🏾‍🫲\ud83c[\udffb-\udffd\udfff]|🫱🏿‍🫲\ud83c[\udffb-\udffe]|👨‍❤️?‍👨|👩‍❤️?‍\ud83d[\udc68\udc69]|🧑‍🤝‍🧑|👫\ud83c[\udffb-\udfff]|👬\ud83c[\udffb-\udfff]|👭\ud83c[\udffb-\udfff]|💏\ud83c[\udffb-\udfff]|💑\ud83c[\udffb-\udfff]|🤝\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91]|🤝)|(?:\ud83d[\udc68\udc69]|🧑)(?:\ud83c[\udffb-\udfff])?‍(?:⚕️?|⚖️?|✈️?|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|⛹)(?:(?:\ud83c[\udffb-\udfff]|️?)‍[♀♂]️?)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd4\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?‍[♀♂]️?|(?:👨‍👨‍👦‍👦|👨‍👨‍👧‍\ud83d[\udc66\udc67]|👨‍👩‍👦‍👦|👨‍👩‍👧‍\ud83d[\udc66\udc67]|👩‍👩‍👦‍👦|👩‍👩‍👧‍\ud83d[\udc66\udc67]|👨‍👦‍👦|👨‍👧‍\ud83d[\udc66\udc67]|👨‍👨‍\ud83d[\udc66\udc67]|👨‍👩‍\ud83d[\udc66\udc67]|👩‍👦‍👦|👩‍👧‍\ud83d[\udc66\udc67]|👩‍👩‍\ud83d[\udc66\udc67]|🏳️?‍⚧️?|🏳️?‍🌈|😶‍🌫️?|❤️?‍🔥|❤️?‍🩹|🏴‍☠️?|🐕‍🦺|🐻‍❄️?|👁‍🗨|👨‍\ud83d[\udc66\udc67]|👩‍\ud83d[\udc66\udc67]|👯‍♀️?|👯‍♂️?|😮‍💨|😵‍💫|🤼‍♀️?|🤼‍♂️?|🧞‍♀️?|🧞‍♂️?|🧟‍♀️?|🧟‍♂️?|🐈‍⬛)|[#*0-9]️??⃣|(?:[©®™♟]️?)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[‼⁉ℹ↔-↙↩↪⌚⌛⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☠☢☣☦☪☮☯☸-☺♀♂♈-♓♠♣♥♦♨♻♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛏⛑⛓⛔⛩⛪⛰-⛵⛸⛺⛽✂✈✉✏✒✔✖✝✡✳✴❄❇❗❣❤➡⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙])(?:️?|(?!︎))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[☝⛷⛹✌✍])(?:️?|(?!︎))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd\udec3-\udec5\udef0-\udef6]|[✊✋]))(?:\ud83c[\udffb-\udfff])?|(?:🏴󠁧󠁢󠁥󠁮󠁧󠁿|🏴󠁧󠁢󠁳󠁣󠁴󠁿|🏴󠁧󠁢󠁷󠁬󠁳󠁿|🇦\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|🇧\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|🇨\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|🇩\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|🇪\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|🇫\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|🇬\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|🇭\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|🇮\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|🇯\ud83c[\uddea\uddf2\uddf4\uddf5]|🇰\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|🇱\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|🇲\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|🇳\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|🇴🇲|🇵\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|🇶🇦|🇷\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|🇸\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|🇹\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|🇺\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|🇻\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|🇼\ud83c[\uddeb\uddf8]|🇽🇰|🇾\ud83c[\uddea\uddf9]|🇿\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udc8e\udc90\udc92-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udedd-\udedf\udeeb\udeec\udef4-\udefc\udfe0-\udfeb\udff0]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78-\uddb4\uddb7\uddba\uddbc-\uddcc\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7c\ude80-\ude86\ude90-\udeac\udeb0-\udeba\udec0-\udec2\uded0-\uded9\udee0-\udee7]|[⏩-⏬⏰⏳♾⛎✅✨❌❎❓-❕➕-➗➰➿])|️)"}}]); -//# sourceMappingURL=946.03f0ef26aad0c7635d9b.bundle.js.map \ No newline at end of file +"use strict";(this.webpackChunktweb=this.webpackChunktweb||[]).push([[946],{4159:(d,e,u)=>{var t;u.d(e,{Z:()=>s});const f=["web.telegram.org","webk.telegram.org"],r=Math.min(4,null!==(t=navigator.hardwareConcurrency)&&void 0!==t?t:4),c={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.7.0",versionFull:"1.7.0 (289)",build:289,langPackVersion:"0.8.0",langPack:"webk",langPackCode:"en",domains:f,baseDcId:2,isMainDomain:f.includes(location.hostname),suffix:"K",threads:r,cryptoWorkers:r};c.isMainDomain&&(c.id=2496,c.hash="8da85b0d5bfe62527e5b244c209159c3");const s=c},3127:(d,e,u)=>{u.d(e,{Z:()=>t});const t={name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]}},8975:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(7119);function f(d,e=""){Array.isArray(d)||(d=[d]);const u=(0,t.Z)(e);return new Blob(d,{type:u})}},7119:(d,e,u)=>{function t(d){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","audio/wav","application/json","application/pdf"].indexOf(d)?"application/octet-stream":d}u.d(e,{Z:()=>t})},4903:(d,e,u)=>{function t(...d){const e=d.reduce(((d,e)=>d+(e.byteLength||e.length)),0),u=new Uint8Array(e);let t=0;return d.forEach((d=>{u.set(d instanceof ArrayBuffer?new Uint8Array(d):d,t),t+=d.byteLength||d.length})),u}u.d(e,{Z:()=>t})},3725:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(319);function f(){const d={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...e)=>{d.lastNotify=e,d.listeners.forEach((d=>d(...e)))},listeners:[],addNotifyListener:e=>{d.lastNotify&&e(...d.lastNotify),d.listeners.push(e)}},e=new Promise(((u,t)=>{d.resolve=d=>{e.isFulfilled||e.isRejected||(e.isFulfilled=!0,u(d))},d.reject=(...d)=>{e.isRejected||e.isFulfilled||(e.isRejected=!0,t(...d))}}));return e.catch(t.Z).finally((()=>{e.notify=e.notifyAll=e.lastNotify=null,e.listeners.length=0,e.cancel&&(e.cancel=t.Z)})),Object.assign(e,d),e}},1352:(d,e,u)=>{u.d(e,{N5:()=>f,SU:()=>t,kC:()=>r});const t="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,f="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!t,r=f||t,c=(d,...e)=>{try{d.postMessage(...e)}catch(d){console.error("[worker] postMessage error:",d,e)}},s=(d,...e)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then((u=>{u.length&&u.slice(d?0:-1).forEach((d=>{c(d,...e)}))}))};t&&s.bind(null,!1),t&&s.bind(null,!0)},319:(d,e,u)=>{function t(){}u.d(e,{Z:()=>t})},8479:(d,e,u)=>{function t(d){if(null===d||"object"!=typeof d)return d;if(d instanceof Date)return new Date(d.getTime());if(Array.isArray(d))return d.map((d=>t(d)));if(ArrayBuffer.isView(d))return d.slice();const e=new d.constructor;for(var u in d)d.hasOwnProperty(u)&&(e[u]=t(d[u]));return e}u.d(e,{Z:()=>t})},6848:(d,e,u)=>{function t(d,e){const u=Object.keys,f=typeof d;return d&&e&&"object"===f&&f===typeof e?u(d).length===u(e).length&&u(d).every((u=>t(d[u],e[u]))):d===e}u.d(e,{Z:()=>t})},5880:(d,e,u)=>{function t(d){return"object"==typeof d&&null!==d}u.d(e,{Z:()=>t})},5953:(d,e,u)=>{function t(d,e){if(e)for(const u in e)void 0!==e[u]&&(d[u]=e[u]);return d}u.d(e,{Z:()=>t})},946:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(8479),f=u(5880);function r(d,e,u,c){for(const s in d)typeof e[s]!=typeof d[s]?(e[s]=(0,t.Z)(d[s]),u&&u(c||s)):(0,f.Z)(d[s])&&r(d[s],e[s],u,c||s)}},4110:(d,e,u)=>{var t=u(7361),f=u(617);String.prototype.toUserId=function(){return(+this).toUserId()},String.prototype.toChatId=function(){return(+this).toChatId()},String.prototype.toPeerId=function(d){return(+this).toPeerId(d)},String.prototype.isPeerId=function(){return/^[\d-]/.test(this.toString())},Number.prototype.toUserId=function(){return this},Number.prototype.toChatId=function(){return Math.abs(this)},Number.prototype.toPeerId=function(d){return void 0===d?this:d?-Math.abs(this):this},Number.prototype.isPeerId=function(){return!0},[["isUser",f.Z],["isAnyChat",t.Z]].forEach((d=>{const e=Array.isArray(d)?d[0]:d,u=Array.isArray(d)?d[1]:d;String.prototype[e]=function(){return u.call(null,this.toString())},Number.prototype[e]=function(){return u.call(null,this)}}))},144:(d,e,u)=>{u.d(e,{a:()=>r,d:()=>f});const t={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function f(d){const e=t[d];return crypto.getRandomValues(e),e[0]}function r(){return""+f(32)+f(32)%16777215}},5466:(d,e,u)=>{u.d(e,{$:()=>f});var t=u(5289);function f(d){return(...e)=>function(d,e,u){const f=performance.now();return(u||console).warn((0,t.Z)(),"start",e),d.then((()=>{(u||console).warn((0,t.Z)(),"end",e,performance.now()-f)})),d}(...e,d)}},5418:(d,e,u)=>{function t(d){return new Promise((e=>{setTimeout(e,d)}))}u.d(e,{Z:()=>t})},6724:(d,e,u)=>{function t(d,e,u=!0){let t,f,r=null;return(...c)=>{t=!0,f=c,r||(u&&(t=!1,d(...f)),r=setInterval((()=>{if(!t)return clearInterval(r),void(r=null);t=!1,d(...f)}),e))}}u.d(e,{Z:()=>t})},9005:(d,e,u)=>{function t(d){return d.charAt(0).toUpperCase()+d.slice(1)}u.d(e,{Z:()=>t})},8453:(d,e,u)=>{u.d(e,{Z:()=>s});var t=u(5936),f=u(3989),r=u(7487),c=u(319);function s(d,e){return Promise.all([f.Z.toggleStorage(d,e),t.Z.toggleStorage(d,e),r.Z.toggleStorage(d,e)]).then(c.Z,c.Z)}},7298:(d,e,u)=>{function t(d){const e=Date.now();return d?e/1e3|0:e}u.d(e,{Z:()=>t})},7361:(d,e,u)=>{function t(d){return+d<0}u.d(e,{Z:()=>t})},617:(d,e,u)=>{function t(d){return+d>=0}u.d(e,{Z:()=>t})},8630:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(153),f=u(410),r=u(1352);class c extends t.Z{constructor(){super("CRYPTO"),this.lastIndex=-1}invokeCryptoNew({method:d,args:e,transfer:u}){const t={method:d,args:e},f=this.listeners.invoke;if(null==f?void 0:f.length){let d=f[0].callback(t);return r.kC||d instanceof Promise||(d=Promise.resolve(d)),d}const c="aes-encrypt"===d||"aes-decrypt"===d?this.lastIndex=(this.lastIndex+1)%this.sendPorts.length:0;return this.invoke("invoke",t,void 0,this.sendPorts[c],u)}invokeCrypto(d,...e){return this.invokeCryptoNew({method:d,args:e})}}const s=new c;f.GO&&(f.GO.cryptoMessagePort=s);const n=s},5936:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(1267),f=u(8975),r=u(5753),c=u(5471),s=u(3725);class n{constructor(d){this.dbName=d,this.useStorage=!0,t.Z.test&&(this.dbName+="_test"),n.STORAGES.length&&(this.useStorage=n.STORAGES[0].useStorage),this.openDatabase(),n.STORAGES.push(this)}openDatabase(){var d;return null!==(d=this.openDbPromise)&&void 0!==d?d:this.openDbPromise=caches.open(this.dbName)}delete(d){return this.timeoutOperation((e=>e.delete("/"+d)))}deleteAll(){return caches.delete(this.dbName)}get(d){return this.timeoutOperation((e=>e.match("/"+d)))}save(d,e){return this.timeoutOperation((u=>u.put("/"+d,e)))}getFile(d,e="blob"){return this.get(d).then((d=>{if(!d)throw(0,c.Z)("NO_ENTRY_FOUND");return d[e]()}))}saveFile(d,e){e instanceof Blob||(e=(0,f.Z)(e));const u=new Response(e,{headers:{"Content-Length":""+e.size}});return this.save(d,u).then((()=>e))}timeoutOperation(d){return this.useStorage?new Promise(((e,u)=>{return t=this,f=void 0,c=function*(){let t=!1;const f=setTimeout((()=>{u(),t=!0}),15e3);try{const u=yield this.openDatabase();if(!u)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const f=yield d(u);if(t)return;e(f)}catch(d){u(d)}clearTimeout(f)},new((r=void 0)||(r=Promise))((function(d,e){function u(d){try{n(c.next(d))}catch(d){e(d)}}function s(d){try{n(c.throw(d))}catch(d){e(d)}}function n(e){var t;e.done?d(e.value):(t=e.value,t instanceof r?t:new r((function(d){d(t)}))).then(u,s)}n((c=c.apply(t,f||[])).next())}));var t,f,r,c})):Promise.reject((0,c.Z)("STORAGE_OFFLINE"))}prepareWriting(d,e,u){return{deferred:(0,s.Z)(),getWriter:()=>new r.Z(u,e,(e=>this.saveFile(d,e).catch((()=>e))))}}static toggleStorage(d,e){return Promise.all(this.STORAGES.map((u=>{if(u.useStorage=d,e)return d?void 0:u.deleteAll()})))}}n.STORAGES=[]},5753:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(8975);class f{constructor(d,e,u){this.mimeType=d,this.size=e,this.saveFileCallback=u,this.bytes=new Uint8Array(e)}write(d,e){return u=this,t=void 0,r=function*(){const u=e+d.byteLength;if(u>this.bytes.byteLength){const d=new Uint8Array(u);d.set(this.bytes,0),this.bytes=d}this.bytes.set(d,e)},new((f=void 0)||(f=Promise))((function(d,e){function c(d){try{n(r.next(d))}catch(d){e(d)}}function s(d){try{n(r.throw(d))}catch(d){e(d)}}function n(e){var u;e.done?d(e.value):(u=e.value,u instanceof f?u:new f((function(d){d(u)}))).then(c,s)}n((r=r.apply(u,t||[])).next())}));var u,t,f,r}truncate(){this.bytes=new Uint8Array}trim(d){this.bytes=this.bytes.slice(0,d)}finalize(d=!0){const e=(0,t.Z)(this.bytes,this.mimeType);return d&&this.saveFileCallback&&this.saveFileCallback(e),e}getParts(){return this.bytes}replaceParts(d){this.bytes=d}}},5003:(d,e,u)=>{u.d(e,{kg:()=>l,v9:()=>t});var t,f=u(410),r=u(4762),c=u(1352),s=u(5289);!function(d){d[d.None=0]="None",d[d.Error=1]="Error",d[d.Warn=2]="Warn",d[d.Log=4]="Log",d[d.Debug=8]="Debug"}(t||(t={}));const n=[t.None,t.Error,t.Warn,t.Log,t.Debug],o=!(r.IS_SAFARI||r.IS_FIREFOX),i="",a="",h=[["debug",t.Debug],["info",t.Log],["warn",t.Warn],["error",t.Error],["assert",t.Error],["trace",t.Log],["group",t.Log],["groupCollapsed",t.Log],["groupEnd",t.Log]];function l(d,e=t.Log|t.Warn|t.Error,u=!1,r=""){let b;f.ZP||u||(e=t.Error),o?r||(c.SU?r=i:c.N5&&(r=a)):r="";const g=r;r=r?`%s ${r}%s`:"%s";const p=function(...u){return e&t.Log&&console.log(r,(0,s.Z)(),d,...u)};return h.forEach((([u,t])=>{p[u]=function(...f){return e&t&&console[u](r,(0,s.Z)(),d,...f)}})),p.setPrefix=function(e){b=e,d="["+e+"]"},p.setPrefix(d),p.setLevel=function(d){e=n.slice(0,d+1).reduce(((d,e)=>d|e),0)},p.bindPrefix=function(d){return l(`${b}] [${d}`,e,u,g)},p}},3206:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(410),f=u(153);class r extends f.Z{constructor(){super("MTPROTO"),r.INSTANCE=this,t.GO&&(t.GO.mtprotoMessagePort=this)}static getInstance(){return this.INSTANCE}}},690:(d,e,u)=>{var t=u(4903);Uint8Array.prototype.concat=function(...d){return(0,t.Z)(this,...d)},Uint8Array.prototype.toJSON=function(){return[...this]},Promise.prototype.finally=Promise.prototype.finally||function(d){const e=e=>Promise.resolve(d()).then(e);return this.then((d=>e((()=>d))),(d=>e((()=>Promise.reject(d)))))}},6637:(d,e,u)=>{u.d(e,{Z:()=>f});var t=u(2423);function f(d){return d?d.match(t.bu):null}},3655:(d,e,u)=>{u.d(e,{Z:()=>r});var t=u(153),f=u(410);class r extends t.Z{constructor(){super("SERVICE"),f.GO&&(f.GO.serviceMessagePort=this)}}},7487:(d,e,u)=>{u.d(e,{Z:()=>i});var t=u(410),f=u(1267),r=u(1352),c=u(3206);class s{constructor(){this.prefix="",this.cache={},this.useStorage=!0,f.Z.test&&(this.prefix="t_")}get(d,e=!0){if(this.cache.hasOwnProperty(d)&&e)return this.cache[d];if(this.useStorage){let e;try{e=localStorage.getItem(this.prefix+d)}catch(d){this.useStorage=!1}if(null!==e)try{e=JSON.parse(e)}catch(d){}else e=void 0;return e}}set(d,e=!1){for(const u in d)if(d.hasOwnProperty(u)){const t=d[u];if(this.cache[u]=t,this.useStorage&&!e)try{const d=JSON.stringify(t);localStorage.setItem(this.prefix+u,d)}catch(d){this.useStorage=!1}}}delete(d,e=!1){d=""+d,e||delete this.cache[d];try{localStorage.removeItem(this.prefix+d)}catch(d){}}clear(){const d=["dc","server_time_offset","xt_instance","user_auth","state_id","k_build"];for(let e=1;e<=5;++e)d.push(`dc${e}_server_salt`),d.push(`dc${e}_auth_key`);for(const e of d)this.delete(e,!0)}toggleStorage(d,e){if(this.useStorage=d,e)return d?this.set(this.cache):void this.clear()}}class n{constructor(){n.STORAGES.push(this),r.kC||(this.storage=new s)}proxy(d,...e){return u=this,t=void 0,s=function*(){return r.kC?c.Z.getInstance().invoke("localStorageProxy",{type:d,args:e}):(e=Array.prototype.slice.call(e),this.storage[d].apply(this.storage,e))},new((f=void 0)||(f=Promise))((function(d,e){function r(d){try{n(s.next(d))}catch(d){e(d)}}function c(d){try{n(s.throw(d))}catch(d){e(d)}}function n(e){var u;e.done?d(e.value):(u=e.value,u instanceof f?u:new f((function(d){d(u)}))).then(r,c)}n((s=s.apply(u,t||[])).next())}));var u,t,f,s}get(d,e){return this.proxy("get",d,e)}set(d,e){return this.proxy("set",d,e)}delete(d,e){return this.proxy("delete",d,e)}clear(){return this.proxy("clear")}toggleStorage(d,e){return this.proxy("toggleStorage",d,e)}}n.STORAGES=[];const o=new n;t.GO.appStorage=o;const i=o},7922:(d,e,u)=>{u.d(e,{Z:()=>n});var t=u(410),f=u(3989),r=u(3127);class c extends f.Z{constructor(){super(r.Z,"session")}}const s=new c;t.GO.stateStorage=s;const n=s},3989:(d,e,u)=>{u.d(e,{Z:()=>i});var t=u(410),f=u(3725),r=u(1352),c=u(6724),s=u(6666),n=function(d,e,u,t){return new(u||(u=Promise))((function(f,r){function c(d){try{n(t.next(d))}catch(d){r(d)}}function s(d){try{n(t.throw(d))}catch(d){r(d)}}function n(d){var e;d.done?f(d.value):(e=d.value,e instanceof u?e:new u((function(d){d(e)}))).then(c,s)}n((t=t.apply(d,e||[])).next())}))};function o(){}class i{constructor(d,e){this.db=d,this.storeName=e,this.cache={},this.getPromises=new Map,this.keysToSet=new Set,this.saveDeferred=(0,f.Z)(),this.keysToDelete=new Set,this.deleteDeferred=(0,f.Z)(),this.storage=new s.Z(d,e),i.STORAGES.length?this.useStorage=i.STORAGES[0].useStorage:this.useStorage=!0,this.savingFreezed=!1,i.STORAGES.push(this),this.saveThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=this.saveDeferred;this.saveDeferred=(0,f.Z)();const e=this.keysToSet;if(e.size){const d=Array.from(e.values());e.clear();const u=d.map((d=>this.cache[d]));try{yield this.storage.save(d,u)}catch(e){console.error("[AS]: set error:",e,d,u)}}d.resolve(),e.size&&this.saveThrottled()}))),16,!1),this.deleteThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=this.deleteDeferred;this.deleteDeferred=(0,f.Z)();const e=this.keysToDelete;if(e.size){const d=Array.from(e.values());e.clear();try{yield this.storage.delete(d)}catch(e){console.error("[AS]: delete error:",e,d)}}d.resolve(),e.size&&this.deleteThrottled()}))),16,!1),this.getThrottled=(0,c.Z)((()=>n(this,void 0,void 0,(function*(){const d=Array.from(this.getPromises.keys());this.storage.get(d).then((e=>{for(let u=0,t=d.length;u{new Set(["NO_ENTRY_FOUND","STORAGE_OFFLINE"]).has(u.type)||(this.useStorage=!1,console.error("[AS]: get error:",u,d,e));for(let e=0,u=d.length;e{this.getPromises.size&&this.getThrottled()}))}))),16,!1)}isAvailable(){return this.useStorage}getCache(){return this.cache}getFromCache(d){return this.cache[d]}setToCache(d,e){return this.cache[d]=e}get(d,e=!0){return n(this,void 0,void 0,(function*(){if(this.cache.hasOwnProperty(d)&&e)return this.getFromCache(d);if(this.useStorage){const e=this.getPromises.get(d);if(e)return e;const u=(0,f.Z)();return this.getPromises.set(d,u),this.getThrottled(),u}}))}getAll(){return this.storage.getAll().catch((()=>[]))}set(d,e=!1){const u=this.useStorage&&!e&&!this.savingFreezed;for(const e in d)if(d.hasOwnProperty(e)){const t=d[e];this.setToCache(e,t),u&&(this.keysToSet.add(e),this.keysToDelete.delete(e),this.saveThrottled())}return u?this.saveDeferred:Promise.resolve()}delete(d,e=!1){return d=""+d,e||delete this.cache[d],this.useStorage&&(this.keysToSet.delete(d),this.keysToDelete.add(d),this.deleteThrottled()),this.useStorage?this.deleteDeferred:Promise.resolve()}clear(d=!1){if(!d)for(const d in this.cache)delete this.cache[d];return this.storage.clear().catch(o)}static toggleStorage(d,e){return Promise.all(this.STORAGES.map((u=>{if(u.useStorage=d,r.kC&&e)return d?u.set(u.cache):(u.keysToSet.clear(),u.keysToDelete.clear(),u.getPromises.forEach((d=>d.resolve(void 0))),u.getPromises.clear(),u.clear(!0))}))).catch(o)}static freezeSaving(d,e){this.STORAGES.forEach((d=>d.savingFreezed=!0));try{d()}catch(d){console.error("freezeSaving callback error:",d)}this.STORAGES.forEach((d=>d.savingFreezed=!1))}}i.STORAGES=[],t.GO&&(t.GO.AppStorage=i)},1229:(d,e,u)=>{u.d(e,{Z:()=>t});const t="((?:👨🏻‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏼‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏽‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏾‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👨🏿‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍💋‍👨\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍💋‍👩\ud83c[\udffb-\udfff]|🧑🏻‍❤️?‍💋‍🧑\ud83c[\udffc-\udfff]|🧑🏼‍❤️?‍💋‍🧑\ud83c[\udffb\udffd-\udfff]|🧑🏽‍❤️?‍💋‍🧑\ud83c[\udffb\udffc\udffe\udfff]|🧑🏾‍❤️?‍💋‍🧑\ud83c[\udffb-\udffd\udfff]|🧑🏿‍❤️?‍💋‍🧑\ud83c[\udffb-\udffe]|👨🏻‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👨🏼‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👨🏽‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👨🏾‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👨🏿‍❤️?‍👨\ud83c[\udffb-\udfff]|👨🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏻‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏻‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏻‍🤝‍👨\ud83c[\udffc-\udfff]|👩🏻‍🤝‍👩\ud83c[\udffc-\udfff]|👩🏼‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏼‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏼‍🤝‍👨\ud83c[\udffb\udffd-\udfff]|👩🏼‍🤝‍👩\ud83c[\udffb\udffd-\udfff]|👩🏽‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏽‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏽‍🤝‍👨\ud83c[\udffb\udffc\udffe\udfff]|👩🏽‍🤝‍👩\ud83c[\udffb\udffc\udffe\udfff]|👩🏾‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏾‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏾‍🤝‍👨\ud83c[\udffb-\udffd\udfff]|👩🏾‍🤝‍👩\ud83c[\udffb-\udffd\udfff]|👩🏿‍❤️?‍👨\ud83c[\udffb-\udfff]|👩🏿‍❤️?‍👩\ud83c[\udffb-\udfff]|👩🏿‍🤝‍👨\ud83c[\udffb-\udffe]|👩🏿‍🤝‍👩\ud83c[\udffb-\udffe]|🧑🏻‍❤️?‍🧑\ud83c[\udffc-\udfff]|🧑🏻‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏼‍❤️?‍🧑\ud83c[\udffb\udffd-\udfff]|🧑🏼‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏽‍❤️?‍🧑\ud83c[\udffb\udffc\udffe\udfff]|🧑🏽‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏾‍❤️?‍🧑\ud83c[\udffb-\udffd\udfff]|🧑🏾‍🤝‍🧑\ud83c[\udffb-\udfff]|🧑🏿‍❤️?‍🧑\ud83c[\udffb-\udffe]|🧑🏿‍🤝‍🧑\ud83c[\udffb-\udfff]|👨‍❤️?‍💋‍👨|👩‍❤️?‍💋‍\ud83d[\udc68\udc69]|🫱🏻‍🫲\ud83c[\udffc-\udfff]|🫱🏼‍🫲\ud83c[\udffb\udffd-\udfff]|🫱🏽‍🫲\ud83c[\udffb\udffc\udffe\udfff]|🫱🏾‍🫲\ud83c[\udffb-\udffd\udfff]|🫱🏿‍🫲\ud83c[\udffb-\udffe]|👨‍❤️?‍👨|👩‍❤️?‍\ud83d[\udc68\udc69]|🧑‍🤝‍🧑|👫\ud83c[\udffb-\udfff]|👬\ud83c[\udffb-\udfff]|👭\ud83c[\udffb-\udfff]|💏\ud83c[\udffb-\udfff]|💑\ud83c[\udffb-\udfff]|🤝\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d\udc8f\udc91]|🤝)|(?:\ud83d[\udc68\udc69]|🧑)(?:\ud83c[\udffb-\udfff])?‍(?:⚕️?|⚖️?|✈️?|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|⛹)(?:(?:\ud83c[\udffb-\udfff]|️?)‍[♀♂]️?)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd4\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?‍[♀♂]️?|(?:👨‍👨‍👦‍👦|👨‍👨‍👧‍\ud83d[\udc66\udc67]|👨‍👩‍👦‍👦|👨‍👩‍👧‍\ud83d[\udc66\udc67]|👩‍👩‍👦‍👦|👩‍👩‍👧‍\ud83d[\udc66\udc67]|👨‍👦‍👦|👨‍👧‍\ud83d[\udc66\udc67]|👨‍👨‍\ud83d[\udc66\udc67]|👨‍👩‍\ud83d[\udc66\udc67]|👩‍👦‍👦|👩‍👧‍\ud83d[\udc66\udc67]|👩‍👩‍\ud83d[\udc66\udc67]|🏳️?‍⚧️?|🏳️?‍🌈|😶‍🌫️?|❤️?‍🔥|❤️?‍🩹|🏴‍☠️?|🐕‍🦺|🐻‍❄️?|👁‍🗨|👨‍\ud83d[\udc66\udc67]|👩‍\ud83d[\udc66\udc67]|👯‍♀️?|👯‍♂️?|😮‍💨|😵‍💫|🤼‍♀️?|🤼‍♂️?|🧞‍♀️?|🧞‍♂️?|🧟‍♀️?|🧟‍♂️?|🐈‍⬛)|[#*0-9]️??⃣|(?:[©®™♟]️?)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[‼⁉ℹ↔-↙↩↪⌚⌛⌨⏏⏭-⏯⏱⏲⏸-⏺Ⓜ▪▫▶◀◻-◾☀-☄☎☑☔☕☘☠☢☣☦☪☮☯☸-☺♀♂♈-♓♠♣♥♦♨♻♿⚒-⚗⚙⚛⚜⚠⚡⚧⚪⚫⚰⚱⚽⚾⛄⛅⛈⛏⛑⛓⛔⛩⛪⛰-⛵⛸⛺⛽✂✈✉✏✒✔✖✝✡✳✴❄❇❗❣❤➡⤴⤵⬅-⬇⬛⬜⭐⭕〰〽㊗㊙])(?:️?|(?!︎))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[☝⛷⛹✌✍])(?:️?|(?!︎))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd\udec3-\udec5\udef0-\udef6]|[✊✋]))(?:\ud83c[\udffb-\udfff])?|(?:🏴󠁧󠁢󠁥󠁮󠁧󠁿|🏴󠁧󠁢󠁳󠁣󠁴󠁿|🏴󠁧󠁢󠁷󠁬󠁳󠁿|🇦\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|🇧\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|🇨\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|🇩\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|🇪\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|🇫\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|🇬\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|🇭\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|🇮\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|🇯\ud83c[\uddea\uddf2\uddf4\uddf5]|🇰\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|🇱\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|🇲\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|🇳\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|🇴🇲|🇵\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|🇶🇦|🇷\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|🇸\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|🇹\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|🇺\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|🇻\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|🇼\ud83c[\uddeb\uddf8]|🇽🇰|🇾\ud83c[\uddea\uddf9]|🇿\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udc8e\udc90\udc92-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udedd-\udedf\udeeb\udeec\udef4-\udefc\udfe0-\udfeb\udff0]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78-\uddb4\uddb7\uddba\uddbc-\uddcc\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7c\ude80-\ude86\ude90-\udeac\udeb0-\udeba\udec0-\udec2\uded0-\uded9\udee0-\udee7]|[⏩-⏬⏰⏳♾⛎✅✨❌❎❓-❕➕-➗➰➿])|️)"}}]); +//# sourceMappingURL=946.d26679f97a8960b11df8.bundle.js.map \ No newline at end of file diff --git a/public/946.03f0ef26aad0c7635d9b.bundle.js.map b/public/946.d26679f97a8960b11df8.bundle.js.map similarity index 99% rename from public/946.03f0ef26aad0c7635d9b.bundle.js.map rename to public/946.d26679f97a8960b11df8.bundle.js.map index 93eb20e74..0bafa0c37 100644 --- a/public/946.03f0ef26aad0c7635d9b.bundle.js.map +++ b/public/946.d26679f97a8960b11df8.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"946.03f0ef26aad0c7635d9b.bundle.js","mappings":"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","sources":["webpack://tweb/./src/config/app.ts","webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/helpers/bytes/bufferConcats.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/object/copy.ts","webpack://tweb/./src/helpers/object/deepEqual.ts","webpack://tweb/./src/helpers/object/isObject.ts","webpack://tweb/./src/helpers/object/safeAssign.ts","webpack://tweb/./src/helpers/object/validateInitObject.ts","webpack://tweb/./src/helpers/peerIdPolyfill.ts","webpack://tweb/./src/helpers/random.ts","webpack://tweb/./src/helpers/recordPromise.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/helpers/schedulers/throttle.ts","webpack://tweb/./src/helpers/string/capitalizeFirstLetter.ts","webpack://tweb/./src/helpers/toggleStorages.ts","webpack://tweb/./src/helpers/tsNow.ts","webpack://tweb/./src/lib/appManagers/utils/peers/isAnyChat.ts","webpack://tweb/./src/lib/appManagers/utils/peers/isUser.ts","webpack://tweb/./src/lib/crypto/cryptoMessagePort.ts","webpack://tweb/./src/lib/files/cacheStorage.ts","webpack://tweb/./src/lib/files/memoryWriter.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/lib/mtproto/mtprotoMessagePort.ts","webpack://tweb/./src/lib/polyfill.ts","webpack://tweb/./src/lib/richTextProcessor/matchUrlProtocol.ts","webpack://tweb/./src/lib/serviceWorker/serviceMessagePort.ts","webpack://tweb/./src/lib/localStorage.ts","webpack://tweb/./src/lib/sessionStorage.ts","webpack://tweb/./src/lib/stateStorage.ts","webpack://tweb/./src/lib/storage.ts","webpack://tweb/./src/vendor/emoji/regex.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {DcId} from '../types';\n\nexport const MAIN_DOMAINS = ['web.telegram.org', 'webk.telegram.org'];\n\nconst threads = Math.min(4, navigator.hardwareConcurrency ?? 4);\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.7.9',\n langPack: 'webk',\n langPackCode: 'en',\n domains: MAIN_DOMAINS,\n baseDcId: 2 as DcId,\n isMainDomain: MAIN_DOMAINS.includes(location.hostname),\n suffix: 'K',\n threads,\n cryptoWorkers: threads\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Database} from '.';\nimport type {IDBIndex} from '../../lib/files/idb';\n\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\n name: 'tweb',\n version: 7,\n stores: [{\n name: 'session'\n }, {\n name: 'stickerSets'\n }, {\n name: 'users'\n }, {\n name: 'chats'\n }, {\n name: 'dialogs'\n // indexes: [\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\n // const name = `index_${idx}`;\n // const index: IDBIndex = {\n // indexName: name,\n // keyPath: name,\n // objectParameters: {}\n // };\n\n // return index\n // })\n // ]\n }, {\n name: 'messages'\n }]\n};\n\nexport default DATABASE_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport blobSafeMimeType from './blobSafeMimeType';\n\nexport default function blobConstruct(blobParts: Array | T, mimeType: string = ''): Blob {\n if(!Array.isArray(blobParts)) {\n blobParts = [blobParts];\n }\n\n const safeMimeType = blobSafeMimeType(mimeType);\n const blob = new Blob(blobParts, {type: safeMimeType});\n return blob;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'audio/wav', // though it is not in list\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n\n let lastLength = 0;\n args.forEach((b) => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from './noop';\n\nexport interface CancellablePromise extends Promise {\n resolve?: (value: T) => void,\n reject?: (...args: any[]) => void,\n cancel?: (reason?: any) => void,\n\n notify?: (...args: any[]) => void,\n notifyAll?: (...args: any[]) => void,\n lastNotify?: any,\n listeners?: Array<(...args: any[]) => void>,\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\n\n isFulfilled?: boolean,\n isRejected?: boolean\n}\n\nexport default function deferredPromise() {\n const deferredHelper: any = {\n isFulfilled: false,\n isRejected: false,\n\n notify: () => {},\n notifyAll: (...args: any[]) => {\n deferredHelper.lastNotify = args;\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\n },\n\n listeners: [],\n addNotifyListener: (callback: (...args: any[]) => void) => {\n if(deferredHelper.lastNotify) {\n callback(...deferredHelper.lastNotify);\n }\n\n deferredHelper.listeners.push(callback);\n }\n };\n\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\n deferredHelper.resolve = (value: T) => {\n if(deferred.isFulfilled || deferred.isRejected) return;\n\n deferred.isFulfilled = true;\n resolve(value);\n };\n\n deferredHelper.reject = (...args: any[]) => {\n if(deferred.isRejected || deferred.isFulfilled) return;\n\n deferred.isRejected = true;\n reject(...args);\n };\n });\n\n // @ts-ignore\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\n const n = deferredPromise>();\n\n }; */\n\n deferred.catch(noop).finally(() => {\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\n deferred.listeners.length = 0;\n\n if(deferred.cancel) {\n deferred.cancel = noop;\n }\n });\n\n Object.assign(deferred, deferredHelper);\n\n return deferred;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// в SW может быть сразу две переменных TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","export default function noop() {}\n","export default function copy(obj: T): T {\n // in case of premitives\n if(obj === null || typeof(obj) !== 'object') {\n return obj;\n }\n\n // date objects should be\n if(obj instanceof Date) {\n return new Date(obj.getTime()) as any;\n }\n\n // handle Array\n if(Array.isArray(obj)) {\n // @ts-ignore\n const clonedArr: T = obj.map((el) => copy(el)) as any as T;\n return clonedArr;\n }\n\n if(ArrayBuffer.isView(obj)) {\n // @ts-ignore\n return obj.slice();\n }\n\n // lastly, handle objects\n // @ts-ignore\n const clonedObj = new obj.constructor();\n for(var prop in obj) {\n if(obj.hasOwnProperty(prop)) {\n clonedObj[prop] = copy(obj[prop]);\n }\n }\n return clonedObj;\n}\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every((key) => deepEqual(x[key], y[key]))\n ) : (x === y);\n}\n","export default function isObject>(object: any): object is T {\n return typeof(object) === 'object' && object !== null;\n}\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(const i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","import copy from './copy';\nimport isObject from './isObject';\n\nexport default function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\n for(const key in initObject) {\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\n currentObject[key] = copy(initObject[key]);\n onReplace && onReplace(previousKey || key);\n } else if(isObject(initObject[key])) {\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport isAnyChat from '../lib/appManagers/utils/peers/isAnyChat';\nimport isUser from '../lib/appManagers/utils/peers/isUser';\n\nString.prototype.toUserId = function() {\n return (+this).toUserId();\n};\n\nString.prototype.toChatId = function() {\n return (+this).toChatId();\n};\n\nString.prototype.toPeerId = function(isChat?: boolean) {\n return (+this).toPeerId(isChat);\n};\n\nString.prototype.isPeerId = function() {\n return /^[\\d-]/.test(this.toString());\n};\n\nNumber.prototype.toUserId = function() {\n return this as any;\n};\n\nNumber.prototype.toChatId = function() {\n return Math.abs(this as any);\n};\n\nNumber.prototype.toPeerId = function(isChat?: boolean) {\n return isChat === undefined ? this as number : (isChat ? -Math.abs(this as number) : this as number);\n};\n\nNumber.prototype.isPeerId = function() {\n return true;\n};\n\n[\n ['isUser' as const, isUser],\n ['isAnyChat' as const, isAnyChat]\n].forEach((value) => {\n const newMethod = Array.isArray(value) ? value[0] : value;\n const originMethod = Array.isArray(value) ? value[1] : value;\n // @ts-ignore\n String.prototype[newMethod] = function() {\n // @ts-ignore\n // eslint-disable-next-line no-useless-call\n return originMethod.call(null, this.toString());\n };\n\n // @ts-ignore\n Number.prototype[newMethod] = function() {\n // @ts-ignore\n // eslint-disable-next-line no-useless-call\n return originMethod.call(null, this);\n };\n});\n\ndeclare global {\n interface String {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is string;\n\n isUser(): boolean;\n isAnyChat(): boolean;\n }\n\n interface Number {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is PeerId;\n\n isUser(): boolean;\n isAnyChat(): boolean;\n }\n}\n\nexport {};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1)\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","import {logger} from '../lib/logger';\nimport dT from './dT';\n\nexport function recordPromise>(promise: T, description: string, log?: ReturnType | Console) {\n const perf = performance.now();\n (log || console).warn(dT(), 'start', description);\n promise.then(() => {\n (log || console).warn(dT(), 'end', description, performance.now() - perf);\n });\n return promise;\n}\n\nexport function recordPromiseBound(log: ReturnType | Console) {\n return (...args: [Parameters[0], Parameters[1]]) => {\n return recordPromise(...args, log);\n };\n}\n","export default function pause(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","// * Jolly Cobra's schedulers\n\nimport {AnyToVoidFunction} from '../../types';\n\nexport default function throttle(\n fn: F,\n ms: number,\n shouldRunFirst = true\n) {\n let interval: number | null = null;\n let isPending: boolean;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n isPending = true;\n args = _args;\n\n if(!interval) {\n if(shouldRunFirst) {\n isPending = false;\n // @ts-ignore\n fn(...args);\n }\n\n interval = setInterval(() => {\n if(!isPending) {\n clearInterval(interval!);\n interval = null;\n return;\n }\n\n isPending = false;\n // @ts-ignore\n fn(...args);\n }, ms) as any;\n }\n };\n}\n","export default function capitalizeFirstLetter(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CacheStorageController from '../lib/files/cacheStorage';\nimport AppStorage from '../lib/storage';\nimport sessionStorage from '../lib/sessionStorage';\nimport noop from './noop';\n\nexport default function toggleStorages(enabled: boolean, clearWrite: boolean) {\n return Promise.all([\n AppStorage.toggleStorage(enabled, clearWrite),\n CacheStorageController.toggleStorage(enabled, clearWrite),\n sessionStorage.toggleStorage(enabled, clearWrite)\n ]).then(noop, noop);\n}\n","export default function tsNow(seconds?: true) {\n const t = Date.now();\n return seconds ? t / 1000 | 0 : t;\n}\n","export default function isAnyChat(peerId: PeerId) {\n return +peerId < 0;\n}\n","export default function isUser(peerId: PeerId) {\n return +peerId >= 0;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {CryptoMethods} from './crypto_methods';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {Awaited} from '../../types';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IS_WORKER} from '../../helpers/context';\n\ntype CryptoEvent = {\n invoke: (payload: {method: T, args: Parameters}) => ReturnType,\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n terminate: () => void\n};\n\nexport class CryptoMessagePort extends SuperMessagePort {\n private lastIndex: number;\n\n constructor() {\n super('CRYPTO');\n this.lastIndex = -1;\n }\n\n public invokeCryptoNew({method, args, transfer}: {\n method: T,\n args: Parameters,\n transfer?: Transferable[]\n }): Promise>> {\n const payload = {method, args};\n const listeners = this.listeners['invoke'];\n if(listeners?.length) { // already in worker\n // try {\n // @ts-ignore\n let result: any = listeners[0].callback(payload);\n if(!IS_WORKER && !(result instanceof Promise)) {\n result = Promise.resolve(result);\n }\n\n return result;\n // } catch(err) {\n // return Promise.reject(err);\n // }\n }\n\n const sendPortIndex = method === 'aes-encrypt' || method === 'aes-decrypt' ?\n this.lastIndex = (this.lastIndex + 1) % this.sendPorts.length :\n 0;\n // @ts-ignore\n return this.invoke('invoke', payload, undefined, this.sendPorts[sendPortIndex], transfer);\n }\n\n public invokeCrypto(method: T, ...args: Parameters): Promise>> {\n return this.invokeCryptoNew({method, args});\n }\n}\n\nconst cryptoMessagePort = new CryptoMessagePort();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);\nexport default cryptoMessagePort;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from '../../config/modes';\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport MemoryWriter from './memoryWriter';\nimport FileManager from './memoryWriter';\nimport FileStorage from './fileStorage';\nimport makeError from '../../helpers/makeError';\nimport deferredPromise from '../../helpers/cancellablePromise';\n\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\n\nexport default class CacheStorageController implements FileStorage {\n private static STORAGES: CacheStorageController[] = [];\n private openDbPromise: Promise;\n\n private useStorage = true;\n\n // private log: ReturnType = logger('CS');\n\n constructor(private dbName: CacheStorageDbName) {\n if(Modes.test) {\n this.dbName += '_test';\n }\n\n if(CacheStorageController.STORAGES.length) {\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\n }\n\n this.openDatabase();\n CacheStorageController.STORAGES.push(this);\n }\n\n private openDatabase(): Promise {\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\n }\n\n public delete(entryName: string) {\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\n }\n\n public deleteAll() {\n return caches.delete(this.dbName);\n }\n\n public get(entryName: string) {\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\n }\n\n public save(entryName: string, response: Response) {\n // return new Promise((resolve) => {}); // DEBUG\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\n }\n\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\n /* if(method === 'blob') {\n return Promise.reject();\n } */\n\n // const str = `get fileName: ${fileName}`;\n // console.time(str);\n return this.get(fileName).then((response) => {\n if(!response) {\n // console.warn('getFile:', response, fileName);\n throw makeError('NO_ENTRY_FOUND');\n }\n\n const promise = response[method]();\n // promise.then(() => {\n // console.timeEnd(str);\n // });\n return promise;\n });\n }\n\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // return Promise.resolve(blobConstruct([blob]));\n if(!(blob instanceof Blob)) {\n blob = blobConstruct(blob);\n }\n\n const response = new Response(blob, {\n headers: {\n 'Content-Length': '' + blob.size\n }\n });\n\n return this.save(fileName, response).then(() => blob as Blob);\n }\n\n public timeoutOperation(callback: (cache: Cache) => Promise) {\n if(!this.useStorage) {\n return Promise.reject(makeError('STORAGE_OFFLINE'));\n }\n\n return new Promise(async(resolve, reject) => {\n let rejected = false;\n const timeout = setTimeout(() => {\n reject();\n // console.warn('CACHESTORAGE TIMEOUT');\n rejected = true;\n }, 15e3);\n\n try {\n const cache = await this.openDatabase();\n if(!cache) {\n this.useStorage = false;\n this.openDbPromise = undefined;\n throw 'no cache?';\n }\n\n const res = await callback(cache);\n\n if(rejected) return;\n resolve(res);\n } catch(err) {\n reject(err);\n }\n\n clearTimeout(timeout);\n });\n }\n\n public prepareWriting(fileName: string, fileSize: number, mimeType: string) {\n return {\n deferred: deferredPromise(),\n getWriter: () => {\n const writer = new MemoryWriter(mimeType, fileSize, (blob) => {\n return this.saveFile(fileName, blob).catch(() => blob);\n });\n\n return writer;\n }\n };\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n return storage.deleteAll();\n }\n }));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport StreamWriter from './streamWriter';\n\nexport default class MemoryWriter implements StreamWriter {\n private bytes: Uint8Array;\n\n constructor(\n private mimeType: string,\n private size: number,\n private saveFileCallback?: (blob: Blob) => Promise\n ) {\n this.bytes = new Uint8Array(size);\n }\n\n public async write(part: Uint8Array, offset: number) {\n // sometimes file size can be bigger than the prov\n const endOffset = offset + part.byteLength;\n if(endOffset > this.bytes.byteLength) {\n const newBytes = new Uint8Array(endOffset);\n newBytes.set(this.bytes, 0);\n this.bytes = newBytes;\n }\n\n this.bytes.set(part, offset);\n };\n\n public truncate() {\n this.bytes = new Uint8Array();\n }\n\n public trim(size: number) {\n this.bytes = this.bytes.slice(0, size);\n }\n\n public finalize(saveToStorage = true) {\n const blob = blobConstruct(this.bytes, this.mimeType);\n\n if(saveToStorage && this.saveFileCallback) {\n this.saveFileCallback(blob);\n }\n\n return blob;\n }\n\n public getParts() {\n return this.bytes;\n }\n\n public replaceParts(parts: Uint8Array) {\n this.bytes = parts;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n underscore: '\\x1b[4m',\n blink: '\\x1b[5m',\n reverse: '\\x1b[7m',\n hidden: '\\x1b[8m',\n // Foreground (text) colors\n fg: {\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m'\n },\n // Background colors\n bg: {\n black: '\\x1b[40m',\n red: '\\x1b[41m',\n green: '\\x1b[42m',\n yellow: '\\x1b[43m',\n blue: '\\x1b[44m',\n magenta: '\\x1b[45m',\n cyan: '\\x1b[46m',\n white: '\\x1b[47m'\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n ['debug', LogTypes.Debug],\n ['info', LogTypes.Log],\n ['warn', LogTypes.Warn],\n ['error', LogTypes.Error],\n ['assert', LogTypes.Error],\n ['trace', LogTypes.Log],\n ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n const originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n // level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport type {getEnvironment} from '../../environment/utils';\nimport type loadState from '../appManagers/utils/state/loadState';\nimport type {StoragesResults} from '../appManagers/utils/storages/loadStorages';\nimport type {LocalStorageProxyTask} from '../localStorage';\nimport type {Awaited} from '../../types';\nimport type {Mirrors, MirrorTaskPayload, NotificationBuildTaskPayload, TabState} from './mtprotoworker';\nimport type toggleStorages from '../../helpers/toggleStorages';\nimport SuperMessagePort from './superMessagePort';\n\nexport type MTProtoManagerTaskPayload = {name: string, method: string, args: any[]};\n\ntype MTProtoBroadcastEvent = {\n event: (payload: {name: string, args: any[]}, source: MessageEventSource) => void\n};\n\nexport default class MTProtoMessagePort extends SuperMessagePort<{\n environment: (environment: ReturnType) => void,\n crypto: (payload: {method: string, args: any[]}) => Promise,\n state: (payload: {userId: UserId} & Awaited> & {storagesResults?: StoragesResults}) => void,\n manager: (payload: MTProtoManagerTaskPayload) => any,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => ReturnType,\n serviceWorkerOnline: (online: boolean) => void,\n serviceWorkerPort: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n cryptoPort: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n createObjectURL: (blob: Blob) => string,\n tabState: (payload: TabState, source: MessageEventSource) => void,\n createProxyWorkerURLs: (payload: {originalUrl: string, blob: Blob}) => string[],\n} & MTProtoBroadcastEvent, {\n convertWebp: (payload: {fileName: string, bytes: Uint8Array}) => Promise,\n convertOpus: (payload: {fileName: string, bytes: Uint8Array}) => Promise,\n localStorageProxy: (payload: LocalStorageProxyTask['payload']) => Promise,\n mirror: (payload: MirrorTaskPayload) => void,\n notificationBuild: (payload: NotificationBuildTaskPayload) => void,\n // hello: () => void\n} & MTProtoBroadcastEvent, Master> {\n private static INSTANCE: MTProtoMessagePort;\n\n constructor() {\n super('MTPROTO');\n\n MTProtoMessagePort.INSTANCE = this;\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.mtprotoMessagePort = this);\n }\n\n public static getInstance() {\n return this.INSTANCE as MTProtoMessagePort;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bufferConcats from '../helpers/bytes/bufferConcats';\n\nUint8Array.prototype.concat = function(...args: Array) {\n return bufferConcats(this, ...args);\n};\n\n/* Uint8Array.prototype.toString = function() {\n return String.fromCharCode.apply(null, [...this]);\n}; */\n\nUint8Array.prototype.toJSON = function() {\n return [...this];\n // return {type: 'bytes', value: [...this]};\n};\n\nPromise.prototype.finally = Promise.prototype.finally || function(this: Promise, fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n};\n\ndeclare global {\n interface Uint8Array {\n concat: (...args: Array) => Uint8Array,\n // toString: () => string,\n toJSON: () => number[],\n // toJSON: () => {type: 'bytes', value: number[]},\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n }\n}\n","import {URL_ANY_PROTOCOL_REG_EXP} from '.';\n\nexport default function matchUrlProtocol(text: string) {\n return !text ? null : text.match(URL_ANY_PROTOCOL_REG_EXP);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {WebPushApiManager} from '../mtproto/webPushApiManager';\nimport type {PushNotificationObject} from './push';\nimport type {MyUploadFile} from '../mtproto/apiFileManager';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\n\nexport type ServicePushPingTaskPayload = {\n localNotifications: boolean,\n lang: {\n push_action_mute1d: string\n push_action_settings: string\n push_message_nopreview: string\n },\n settings: WebPushApiManager['settings']\n};\n\nexport type ServiceRequestFilePartTaskPayload = {\n docId: DocId,\n dcId: number,\n offset: number,\n limit: number\n};\n\nexport type ServiceDownloadTaskPayload = {\n headers: any,\n id: string\n};\n\nexport type ServiceEvent = {\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void\n};\n\nexport default class ServiceMessagePort extends SuperMessagePort<{\n // from main thread to service worker\n notificationsClear: () => void,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => void,\n pushPing: (payload: ServicePushPingTaskPayload, source: MessageEventSource, event: MessageEvent) => void,\n hello: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n\n // from mtproto worker\n download: (payload: ServiceDownloadTaskPayload) => void,\n downloadChunk: (payload: {id: ServiceDownloadTaskPayload['id'], chunk: Uint8Array}) => void\n downloadFinalize: (payload: ServiceDownloadTaskPayload['id']) => void,\n downloadCancel: (payload: ServiceDownloadTaskPayload['id']) => void\n}, {\n // to main thread\n pushClick: (payload: PushNotificationObject) => void,\n hello: (payload: void, source: MessageEventSource) => void,\n\n // to mtproto worker\n requestFilePart: (payload: ServiceRequestFilePartTaskPayload) => Promise | MyUploadFile\n} & ServiceEvent, Master> {\n constructor() {\n super('SERVICE');\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.serviceMessagePort = this);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Modes from '../config/modes';\nimport {IS_WORKER} from '../helpers/context';\nimport {WorkerTaskTemplate} from '../types';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\n// import { stringify } from '../helpers/json';\n\nclass LocalStorage> {\n private prefix = '';\n private cache: Partial = {};\n private useStorage = true;\n\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\n if(Modes.test) {\n this.prefix = 't_';\n }\n }\n\n public get(key: T, useCache = true): Storage[T] {\n if(this.cache.hasOwnProperty(key) && useCache) {\n return this.cache[key];\n } else if(this.useStorage) {\n let value: Storage[T];\n try {\n value = localStorage.getItem(this.prefix + (key as string)) as any;\n } catch(err) {\n this.useStorage = false;\n }\n\n if(value !== null) {\n try {\n value = JSON.parse(value);\n } catch(err) {\n // console.error(err);\n }\n } else {\n value = undefined;\n }\n\n return value;\n }/* else {\n throw 'something went wrong';\n } */\n }\n\n public set(obj: Partial, onlyLocal = false) {\n for(const key in obj) {\n if(obj.hasOwnProperty(key)) {\n const value = obj[key];\n this.cache[key] = value;\n\n if(this.useStorage && !onlyLocal) {\n try {\n const stringified = JSON.stringify(value);\n localStorage.setItem(this.prefix + key, stringified);\n } catch(err) {\n this.useStorage = false;\n }\n }\n }\n }\n }\n\n public delete(key: keyof Storage, saveLocal = false) {\n // ! it is needed here\n key = '' + (key as string);\n\n if(!saveLocal) {\n delete this.cache[key];\n }\n\n // if(this.useStorage) {\n try {\n localStorage.removeItem(this.prefix + (key as string));\n } catch(err) {\n\n }\n // }\n }\n\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\n // if(this.useStorage) {\n try {\n let obj: Partial = {};\n if(preserveKeys) {\n preserveKeys.forEach((key) => {\n const value = this.get(key);\n if(value !== undefined) {\n obj[key] = value;\n }\n });\n }\n\n localStorage.clear();\n\n if(preserveKeys) {\n this.set(obj);\n }\n } catch(err) {\n\n }\n // }\n } */\n\n public clear() {\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id', 'k_build'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n for(const key of keys) {\n this.delete(key, true);\n }\n }\n\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\n this.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n this.clear();\n } else {\n return this.set(this.cache);\n }\n }\n}\n\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\n args: any[]\n }\n};\n\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: any\n};\n\nexport default class LocalStorageController> {\n private static STORAGES: LocalStorageController[] = [];\n // private log = (...args: any[]) => console.log('[SW LS]', ...args);\n // private log = (...args: any[]) => {};\n\n private storage: LocalStorage;\n\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\n LocalStorageController.STORAGES.push(this);\n\n if(!IS_WORKER) {\n this.storage = new LocalStorage(/* preserveKeys */);\n }\n }\n\n private async proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']): Promise {\n if(IS_WORKER) {\n const port = MTProtoMessagePort.getInstance();\n return port.invoke('localStorageProxy', {type, args});\n }\n\n args = Array.prototype.slice.call(args);\n\n // @ts-ignore\n return this.storage[type].apply(this.storage, args as any);\n }\n\n public get(key: T, useCache?: boolean) {\n return this.proxy('get', key, useCache);\n }\n\n public set(obj: Partial, onlyLocal?: boolean) {\n return this.proxy('set', obj, onlyLocal);\n }\n\n public delete(key: keyof Storage, saveLocal?: boolean) {\n return this.proxy('delete', key, saveLocal);\n }\n\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\n return this.proxy('clear'/* , preserveKeys */);\n }\n\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\n return this.proxy('toggleStorage', enabled, clearWrite);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppInstance} from './mtproto/singleInstance';\nimport type {UserAuth} from './mtproto/mtproto_config';\nimport type {DcId} from '../types';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport LocalStorageController from './localStorage';\n\nconst sessionStorage = new LocalStorageController<{\n dc: DcId,\n user_auth: UserAuth,\n state_id: number,\n dc1_auth_key: string,\n dc2_auth_key: string,\n dc3_auth_key: string,\n dc4_auth_key: string,\n dc5_auth_key: string,\n dc1_server_salt: string,\n dc2_server_salt: string,\n dc3_server_salt: string,\n dc4_server_salt: string,\n dc5_server_salt: string,\n server_time_offset: number,\n xt_instance: AppInstance,\n kz_version: 'K' | 'Z',\n tgme_sync: {\n canRedirect: boolean,\n ts: number\n },\n k_build: number\n}>(/* ['kz_version'] */);\nMOUNT_CLASS_TO.appStorage = sessionStorage;\nexport default sessionStorage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ChatSavedPosition} from './appManagers/appImManager';\nimport type {AppDraftsManager} from './appManagers/appDraftsManager';\nimport type {State} from '../config/state';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {LangPackDifference} from '../layer';\nimport AppStorage from './storage';\nimport DATABASE_STATE from '../config/databases/state';\n\nclass StateStorage extends AppStorage<{\n chatPositions: {\n [peerId_threadId: string]: ChatSavedPosition\n },\n langPack: LangPackDifference,\n drafts: AppDraftsManager['drafts'],\n user_auth: any, // support old webk format\n} & State, typeof DATABASE_STATE> {\n constructor() {\n super(DATABASE_STATE, 'session');\n }\n}\n\nconst stateStorage = new StateStorage();\nMOUNT_CLASS_TO.stateStorage = stateStorage;\nexport default stateStorage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../config/databases';\nimport {MOUNT_CLASS_TO} from '../config/debug';\n// import DATABASE_SESSION from \"../config/databases/session\";\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {IS_WORKER} from '../helpers/context';\nimport throttle from '../helpers/schedulers/throttle';\n// import { WorkerTaskTemplate } from \"../types\";\nimport IDBStorage from './files/idb';\n\nfunction noop() {}\n\n/* export interface LocalStorageProxySetTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'set',\n keys: string[],\n values: any[]\n }\n};\n\nexport interface LocalStorageProxyDeleteTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'delete',\n keys: string[]\n }\n}; */\n\nconst THROTTLE_TIME = 16;\n\n/* Storage extends {[name: string]: any} *//* Storage extends Record */\nexport default class AppStorage<\n Storage extends Record,\n T extends Database\n> {\n private static STORAGES: AppStorage>[] = [];\n private storage: IDBStorage;// new CacheStorageController('session');\n\n // private cache: Partial<{[key: string]: Storage[typeof key]}> = {};\n private cache: Partial = {};\n private useStorage: boolean;\n private savingFreezed: boolean;\n\n private getPromises: Map> = new Map();\n private getThrottled: () => void;\n\n private keysToSet: Set = new Set();\n private saveThrottled: () => void;\n private saveDeferred = deferredPromise();\n\n private keysToDelete: Set = new Set();\n private deleteThrottled: () => void;\n private deleteDeferred = deferredPromise();\n\n constructor(private db: T, private storeName: typeof db['stores'][number]['name']) {\n this.storage = new IDBStorage(db, storeName);\n\n if(AppStorage.STORAGES.length) {\n this.useStorage = AppStorage.STORAGES[0].useStorage;\n } else {\n this.useStorage = true;\n }\n\n this.savingFreezed = false;\n\n AppStorage.STORAGES.push(this);\n\n this.saveThrottled = throttle(async() => {\n const deferred = this.saveDeferred;\n this.saveDeferred = deferredPromise();\n\n const set = this.keysToSet;\n if(set.size) {\n const keys = Array.from(set.values()) as string[];\n set.clear();\n\n const values = keys.map((key) => this.cache[key]);\n try {\n // console.log('setItem: will set', key/* , value */);\n // await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.'\n // await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}}));\n\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\n self.postMessage({\n type: 'localStorageProxy',\n payload: {\n type: 'set',\n keys,\n values\n }\n } as LocalStorageProxySetTask);\n } */\n\n await this.storage.save(keys, values);\n // console.log('setItem: have set', key/* , value */);\n } catch(e) {\n // this.useCS = false;\n console.error('[AS]: set error:', e, keys, values);\n }\n }\n\n deferred.resolve();\n\n if(set.size) {\n this.saveThrottled();\n }\n }, THROTTLE_TIME, false);\n\n this.deleteThrottled = throttle(async() => {\n const deferred = this.deleteDeferred;\n this.deleteDeferred = deferredPromise();\n\n const set = this.keysToDelete;\n if(set.size) {\n const keys = Array.from(set.values()) as string[];\n set.clear();\n\n try {\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\n self.postMessage({\n type: 'localStorageProxy',\n payload: {\n type: 'delete',\n keys\n }\n } as LocalStorageProxyDeleteTask);\n } */\n\n await this.storage.delete(keys);\n } catch(e) {\n console.error('[AS]: delete error:', e, keys);\n }\n }\n\n deferred.resolve();\n\n if(set.size) {\n this.deleteThrottled();\n }\n }, THROTTLE_TIME, false);\n\n this.getThrottled = throttle(async() => {\n const keys = Array.from(this.getPromises.keys());\n\n // const perf = performance.now();\n this.storage.get(keys as string[]).then((values) => {\n for(let i = 0, length = keys.length; i < length; ++i) {\n const key = keys[i];\n const deferred = this.getPromises.get(key);\n if(deferred) {\n // @ts-ignore\n deferred.resolve(this.cache[key] = values[i]);\n this.getPromises.delete(key);\n }\n }\n\n // console.log('[AS]: get time', keys, performance.now() - perf);\n }, (error: ApiError) => {\n const ignoreErrors: Set = new Set(['NO_ENTRY_FOUND', 'STORAGE_OFFLINE']);\n if(!ignoreErrors.has(error.type)) {\n this.useStorage = false;\n console.error('[AS]: get error:', error, keys, storeName);\n }\n\n for(let i = 0, length = keys.length; i < length; ++i) {\n const key = keys[i];\n const deferred = this.getPromises.get(key);\n if(deferred) {\n // deferred.reject(error);\n deferred.resolve(undefined);\n this.getPromises.delete(key);\n }\n }\n }).finally(() => {\n if(this.getPromises.size) {\n this.getThrottled();\n }\n });\n }, THROTTLE_TIME, false);\n }\n\n public isAvailable() {\n return this.useStorage;\n }\n\n public getCache() {\n return this.cache;\n }\n\n public getFromCache(key: T) {\n return this.cache[key];\n }\n\n public setToCache(key: keyof Storage, value: Storage[typeof key]) {\n return this.cache[key] = value;\n }\n\n public async get(key: T, useCache = true): Promise {\n if(this.cache.hasOwnProperty(key) && useCache) {\n return this.getFromCache(key);\n } else if(this.useStorage) {\n const r = this.getPromises.get(key);\n if(r) return r as any;\n\n const p = deferredPromise();\n this.getPromises.set(key, p as any);\n\n this.getThrottled();\n\n return p;\n }/* else {\n throw 'something went wrong';\n } */\n }\n\n public getAll() {\n return this.storage.getAll().catch(() => []);\n }\n\n public set(obj: Partial, onlyLocal = false) {\n // console.log('storageSetValue', obj, callback, arguments);\n\n const canUseStorage = this.useStorage && !onlyLocal && !this.savingFreezed;\n for(const key in obj) {\n if(obj.hasOwnProperty(key)) {\n const value = obj[key];\n this.setToCache(key, value);\n\n // let perf = /* DEBUG */false ? performance.now() : 0;\n // value = JSON.stringify(value);\n\n // if(perf) {\n // let elapsedTime = performance.now() - perf;\n // if(elapsedTime > 10) {\n // console.warn('LocalStorage set: stringify time by JSON.stringify:', elapsedTime, key);\n // }\n // }\n\n /* perf = performance.now();\n value = stringify(value);\n console.log('LocalStorage set: stringify time by own stringify:', performance.now() - perf); */\n\n if(canUseStorage) {\n this.keysToSet.add(key);\n this.keysToDelete.delete(key);\n this.saveThrottled();\n }\n }\n }\n\n return canUseStorage ? this.saveDeferred : Promise.resolve();\n }\n\n public delete(key: keyof Storage, saveLocal = false) {\n /* if(!this.cache.hasOwnProperty(key)) {\n return;\n } */\n\n // ! it is needed here\n key = '' + (key as string);\n\n if(!saveLocal) {\n delete this.cache[key];\n }\n\n if(this.useStorage) {\n this.keysToSet.delete(key);\n this.keysToDelete.add(key);\n this.deleteThrottled();\n }\n\n return this.useStorage ? this.deleteDeferred : Promise.resolve();\n }\n\n public clear(saveLocal = false) {\n if(!saveLocal) {\n for(const i in this.cache) {\n delete this.cache[i];\n }\n }\n\n return this.storage.clear().catch(noop);\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!IS_WORKER || !clearWrite) {\n return;\n }\n\n if(!enabled) {\n storage.keysToSet.clear();\n storage.keysToDelete.clear();\n storage.getPromises.forEach((deferred) => deferred.resolve(undefined));\n storage.getPromises.clear();\n return storage.clear(true);\n } else {\n return storage.set(storage.cache);\n }\n })).catch(noop);\n }\n\n public static freezeSaving>(callback: () => any, names: T['stores'][number]['name'][]) {\n this.STORAGES.forEach((storage) => storage.savingFreezed = true);\n try {\n callback();\n } catch(err) {\n console.error('freezeSaving callback error:', err);\n }\n this.STORAGES.forEach((storage) => storage.savingFreezed = false);\n }\n\n /* public deleteDatabase() {\n return IDBStorage.deleteDatabase().catch(noop);\n } */\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.AppStorage = AppStorage);\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n\nconst originalString = '((?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\udef1\\ud83c\\udffb\\u200d\\ud83e\\udef2\\ud83c[\\udffc-\\udfff]|\\ud83e\\udef1\\ud83c\\udffc\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\udef1\\ud83c\\udffd\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\udef1\\ud83c\\udffe\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\udef1\\ud83c\\udfff\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83e\\udd1d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91]|\\ud83e\\udd1d)|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f?|\\u2696\\ufe0f?|\\u2708\\ufe0f?|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)(?:(?:\\ud83c[\\udffb-\\udfff]|\\ufe0f?)\\u200d[\\u2640\\u2642]\\ufe0f?)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f?|(?:\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f?\\u200d\\u26a7\\ufe0f?|\\ud83c\\udff3\\ufe0f?\\u200d\\ud83c\\udf08|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f?|\\u2764\\ufe0f?\\u200d\\ud83d\\udd25|\\u2764\\ufe0f?\\u200d\\ud83e\\ude79|\\ud83c\\udff4\\u200d\\u2620\\ufe0f?|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f?|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f?|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f?|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f?|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f?|\\ud83e\\uddde\\u200d\\u2640\\ufe0f?|\\ud83e\\uddde\\u200d\\u2642\\ufe0f?|\\ud83e\\udddf\\u200d\\u2640\\ufe0f?|\\ud83e\\udddf\\u200d\\u2642\\ufe0f?|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f??\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f?)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f?|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f?|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd\\udec3-\\udec5\\udef0-\\udef6]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udc8e\\udc90\\udc92-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udedd-\\udedf\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb\\udff0]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcc\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7c\\ude80-\\ude86\\ude90-\\udeac\\udeb0-\\udeba\\udec0-\\udec2\\uded0-\\uded9\\udee0-\\udee7]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f)';\nexport default originalString;\n"],"names":["MAIN_DOMAINS","threads","Math","min","navigator","hardwareConcurrency","App","id","hash","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","includes","location","hostname","suffix","cryptoWorkers","name","stores","blobConstruct","blobParts","mimeType","Array","isArray","safeMimeType","Blob","type","blobSafeMimeType","indexOf","bufferConcats","args","length","reduce","acc","v","byteLength","tmp","Uint8Array","lastLength","forEach","b","set","ArrayBuffer","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","listeners","callback","addNotifyListener","push","deferred","Promise","resolve","reject","value","catch","finally","cancel","Object","assign","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","self","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","postMessage","listener","err","console","error","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","then","slice","bind","noop","copy","obj","Date","getTime","map","el","isView","clonedObj","constructor","prop","hasOwnProperty","deepEqual","x","y","ok","keys","tx","every","key","isObject","object","safeAssign","fromObject","i","undefined","validateInitObject","initObject","currentObject","onReplace","previousKey","String","prototype","toUserId","this","toChatId","toPeerId","isChat","isPeerId","test","toString","Number","abs","newMethod","originMethod","call","arrays","Uint16Array","Uint32Array","nextRandomUint","bits","array","crypto","getRandomValues","randomLong","recordPromiseBound","log","promise","description","perf","performance","now","warn","recordPromise","pause","ms","setTimeout","throttle","fn","shouldRunFirst","isPending","interval","_args","setInterval","clearInterval","capitalizeFirstLetter","string","charAt","toUpperCase","toggleStorages","enabled","clearWrite","tsNow","seconds","t","isAnyChat","peerId","isUser","CryptoMessagePort","super","lastIndex","invokeCryptoNew","method","transfer","payload","result","sendPortIndex","sendPorts","invoke","invokeCrypto","cryptoMessagePort","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","get","match","save","response","put","getFile","fileName","saveFile","blob","Response","headers","size","rejected","timeout","res","clearTimeout","prepareWriting","fileSize","getWriter","static","storage","MemoryWriter","saveFileCallback","bytes","write","part","offset","endOffset","newBytes","truncate","trim","finalize","saveToStorage","getParts","replaceParts","parts","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","STYLES_SUPPORTED","IS_SAFARI","IS_FIREFOX","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","MTProtoMessagePort","INSTANCE","concat","toJSON","onFinally","reason","matchUrlProtocol","text","ServiceMessagePort","LocalStorage","useCache","localStorage","getItem","JSON","parse","onlyLocal","stringified","stringify","setItem","saveLocal","removeItem","clear","toggleStorage","LocalStorageController","proxy","apply","sessionStorage","StateStorage","stateStorage","AppStorage","db","storeName","getPromises","Map","keysToSet","Set","saveDeferred","keysToDelete","deleteDeferred","savingFreezed","saveThrottled","from","values","e","deleteThrottled","getThrottled","has","isAvailable","getCache","getFromCache","setToCache","r","p","getAll","canUseStorage","add","names"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"946.d26679f97a8960b11df8.bundle.js","mappings":"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","sources":["webpack://tweb/./src/config/app.ts","webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/helpers/bytes/bufferConcats.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/object/copy.ts","webpack://tweb/./src/helpers/object/deepEqual.ts","webpack://tweb/./src/helpers/object/isObject.ts","webpack://tweb/./src/helpers/object/safeAssign.ts","webpack://tweb/./src/helpers/object/validateInitObject.ts","webpack://tweb/./src/helpers/peerIdPolyfill.ts","webpack://tweb/./src/helpers/random.ts","webpack://tweb/./src/helpers/recordPromise.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/helpers/schedulers/throttle.ts","webpack://tweb/./src/helpers/string/capitalizeFirstLetter.ts","webpack://tweb/./src/helpers/toggleStorages.ts","webpack://tweb/./src/helpers/tsNow.ts","webpack://tweb/./src/lib/appManagers/utils/peers/isAnyChat.ts","webpack://tweb/./src/lib/appManagers/utils/peers/isUser.ts","webpack://tweb/./src/lib/crypto/cryptoMessagePort.ts","webpack://tweb/./src/lib/files/cacheStorage.ts","webpack://tweb/./src/lib/files/memoryWriter.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/lib/mtproto/mtprotoMessagePort.ts","webpack://tweb/./src/lib/polyfill.ts","webpack://tweb/./src/lib/richTextProcessor/matchUrlProtocol.ts","webpack://tweb/./src/lib/serviceWorker/serviceMessagePort.ts","webpack://tweb/./src/lib/localStorage.ts","webpack://tweb/./src/lib/sessionStorage.ts","webpack://tweb/./src/lib/stateStorage.ts","webpack://tweb/./src/lib/storage.ts","webpack://tweb/./src/vendor/emoji/regex.ts"],"sourcesContent":["/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {DcId} from '../types';\n\nexport const MAIN_DOMAINS = ['web.telegram.org', 'webk.telegram.org'];\n\nconst threads = Math.min(4, navigator.hardwareConcurrency ?? 4);\n\nconst App = {\n id: +process.env.API_ID,\n hash: process.env.API_HASH,\n version: process.env.VERSION,\n versionFull: process.env.VERSION_FULL,\n build: +process.env.BUILD,\n langPackVersion: '0.8.0',\n langPack: 'webk',\n langPackCode: 'en',\n domains: MAIN_DOMAINS,\n baseDcId: 2 as DcId,\n isMainDomain: MAIN_DOMAINS.includes(location.hostname),\n suffix: 'K',\n threads,\n cryptoWorkers: threads\n};\n\nif(App.isMainDomain) { // use Webogram credentials then\n App.id = 2496;\n App.hash = '8da85b0d5bfe62527e5b244c209159c3';\n}\n\nexport default App;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Database} from '.';\nimport type {IDBIndex} from '../../lib/files/idb';\n\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\n name: 'tweb',\n version: 7,\n stores: [{\n name: 'session'\n }, {\n name: 'stickerSets'\n }, {\n name: 'users'\n }, {\n name: 'chats'\n }, {\n name: 'dialogs'\n // indexes: [\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\n // const name = `index_${idx}`;\n // const index: IDBIndex = {\n // indexName: name,\n // keyPath: name,\n // objectParameters: {}\n // };\n\n // return index\n // })\n // ]\n }, {\n name: 'messages'\n }]\n};\n\nexport default DATABASE_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport blobSafeMimeType from './blobSafeMimeType';\n\nexport default function blobConstruct(blobParts: Array | T, mimeType: string = ''): Blob {\n if(!Array.isArray(blobParts)) {\n blobParts = [blobParts];\n }\n\n const safeMimeType = blobSafeMimeType(mimeType);\n const blob = new Blob(blobParts, {type: safeMimeType});\n return blob;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'audio/wav', // though it is not in list\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n\n let lastLength = 0;\n args.forEach((b) => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from './noop';\n\nexport interface CancellablePromise extends Promise {\n resolve?: (value: T) => void,\n reject?: (...args: any[]) => void,\n cancel?: (reason?: any) => void,\n\n notify?: (...args: any[]) => void,\n notifyAll?: (...args: any[]) => void,\n lastNotify?: any,\n listeners?: Array<(...args: any[]) => void>,\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\n\n isFulfilled?: boolean,\n isRejected?: boolean\n}\n\nexport default function deferredPromise() {\n const deferredHelper: any = {\n isFulfilled: false,\n isRejected: false,\n\n notify: () => {},\n notifyAll: (...args: any[]) => {\n deferredHelper.lastNotify = args;\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\n },\n\n listeners: [],\n addNotifyListener: (callback: (...args: any[]) => void) => {\n if(deferredHelper.lastNotify) {\n callback(...deferredHelper.lastNotify);\n }\n\n deferredHelper.listeners.push(callback);\n }\n };\n\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\n deferredHelper.resolve = (value: T) => {\n if(deferred.isFulfilled || deferred.isRejected) return;\n\n deferred.isFulfilled = true;\n resolve(value);\n };\n\n deferredHelper.reject = (...args: any[]) => {\n if(deferred.isRejected || deferred.isFulfilled) return;\n\n deferred.isRejected = true;\n reject(...args);\n };\n });\n\n // @ts-ignore\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\n const n = deferredPromise>();\n\n }; */\n\n deferred.catch(noop).finally(() => {\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\n deferred.listeners.length = 0;\n\n if(deferred.cancel) {\n deferred.cancel = noop;\n }\n });\n\n Object.assign(deferred, deferredHelper);\n\n return deferred;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// в SW может быть сразу две переменных TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","export default function noop() {}\n","export default function copy(obj: T): T {\n // in case of premitives\n if(obj === null || typeof(obj) !== 'object') {\n return obj;\n }\n\n // date objects should be\n if(obj instanceof Date) {\n return new Date(obj.getTime()) as any;\n }\n\n // handle Array\n if(Array.isArray(obj)) {\n // @ts-ignore\n const clonedArr: T = obj.map((el) => copy(el)) as any as T;\n return clonedArr;\n }\n\n if(ArrayBuffer.isView(obj)) {\n // @ts-ignore\n return obj.slice();\n }\n\n // lastly, handle objects\n // @ts-ignore\n const clonedObj = new obj.constructor();\n for(var prop in obj) {\n if(obj.hasOwnProperty(prop)) {\n clonedObj[prop] = copy(obj[prop]);\n }\n }\n return clonedObj;\n}\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every((key) => deepEqual(x[key], y[key]))\n ) : (x === y);\n}\n","export default function isObject>(object: any): object is T {\n return typeof(object) === 'object' && object !== null;\n}\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(const i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","import copy from './copy';\nimport isObject from './isObject';\n\nexport default function validateInitObject(initObject: any, currentObject: any, onReplace?: (key: string) => void, previousKey?: string) {\n for(const key in initObject) {\n if(typeof(currentObject[key]) !== typeof(initObject[key])) {\n currentObject[key] = copy(initObject[key]);\n onReplace && onReplace(previousKey || key);\n } else if(isObject(initObject[key])) {\n validateInitObject(initObject[key], currentObject[key], onReplace, previousKey || key);\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport isAnyChat from '../lib/appManagers/utils/peers/isAnyChat';\nimport isUser from '../lib/appManagers/utils/peers/isUser';\n\nString.prototype.toUserId = function() {\n return (+this).toUserId();\n};\n\nString.prototype.toChatId = function() {\n return (+this).toChatId();\n};\n\nString.prototype.toPeerId = function(isChat?: boolean) {\n return (+this).toPeerId(isChat);\n};\n\nString.prototype.isPeerId = function() {\n return /^[\\d-]/.test(this.toString());\n};\n\nNumber.prototype.toUserId = function() {\n return this as any;\n};\n\nNumber.prototype.toChatId = function() {\n return Math.abs(this as any);\n};\n\nNumber.prototype.toPeerId = function(isChat?: boolean) {\n return isChat === undefined ? this as number : (isChat ? -Math.abs(this as number) : this as number);\n};\n\nNumber.prototype.isPeerId = function() {\n return true;\n};\n\n[\n ['isUser' as const, isUser],\n ['isAnyChat' as const, isAnyChat]\n].forEach((value) => {\n const newMethod = Array.isArray(value) ? value[0] : value;\n const originMethod = Array.isArray(value) ? value[1] : value;\n // @ts-ignore\n String.prototype[newMethod] = function() {\n // @ts-ignore\n // eslint-disable-next-line no-useless-call\n return originMethod.call(null, this.toString());\n };\n\n // @ts-ignore\n Number.prototype[newMethod] = function() {\n // @ts-ignore\n // eslint-disable-next-line no-useless-call\n return originMethod.call(null, this);\n };\n});\n\ndeclare global {\n interface String {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is string;\n\n isUser(): boolean;\n isAnyChat(): boolean;\n }\n\n interface Number {\n toUserId(): UserId;\n toChatId(): ChatId;\n toPeerId(isChat?: boolean): PeerId;\n isPeerId(): this is PeerId;\n\n isUser(): boolean;\n isAnyChat(): boolean;\n }\n}\n\nexport {};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1)\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","import {logger} from '../lib/logger';\nimport dT from './dT';\n\nexport function recordPromise>(promise: T, description: string, log?: ReturnType | Console) {\n const perf = performance.now();\n (log || console).warn(dT(), 'start', description);\n promise.then(() => {\n (log || console).warn(dT(), 'end', description, performance.now() - perf);\n });\n return promise;\n}\n\nexport function recordPromiseBound(log: ReturnType | Console) {\n return (...args: [Parameters[0], Parameters[1]]) => {\n return recordPromise(...args, log);\n };\n}\n","export default function pause(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","// * Jolly Cobra's schedulers\n\nimport {AnyToVoidFunction} from '../../types';\n\nexport default function throttle(\n fn: F,\n ms: number,\n shouldRunFirst = true\n) {\n let interval: number | null = null;\n let isPending: boolean;\n let args: Parameters;\n\n return (..._args: Parameters) => {\n isPending = true;\n args = _args;\n\n if(!interval) {\n if(shouldRunFirst) {\n isPending = false;\n // @ts-ignore\n fn(...args);\n }\n\n interval = setInterval(() => {\n if(!isPending) {\n clearInterval(interval!);\n interval = null;\n return;\n }\n\n isPending = false;\n // @ts-ignore\n fn(...args);\n }, ms) as any;\n }\n };\n}\n","export default function capitalizeFirstLetter(string: string) {\n return string.charAt(0).toUpperCase() + string.slice(1);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CacheStorageController from '../lib/files/cacheStorage';\nimport AppStorage from '../lib/storage';\nimport sessionStorage from '../lib/sessionStorage';\nimport noop from './noop';\n\nexport default function toggleStorages(enabled: boolean, clearWrite: boolean) {\n return Promise.all([\n AppStorage.toggleStorage(enabled, clearWrite),\n CacheStorageController.toggleStorage(enabled, clearWrite),\n sessionStorage.toggleStorage(enabled, clearWrite)\n ]).then(noop, noop);\n}\n","export default function tsNow(seconds?: true) {\n const t = Date.now();\n return seconds ? t / 1000 | 0 : t;\n}\n","export default function isAnyChat(peerId: PeerId) {\n return +peerId < 0;\n}\n","export default function isUser(peerId: PeerId) {\n return +peerId >= 0;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {CryptoMethods} from './crypto_methods';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {Awaited} from '../../types';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IS_WORKER} from '../../helpers/context';\n\ntype CryptoEvent = {\n invoke: (payload: {method: T, args: Parameters}) => ReturnType,\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n terminate: () => void\n};\n\nexport class CryptoMessagePort extends SuperMessagePort {\n private lastIndex: number;\n\n constructor() {\n super('CRYPTO');\n this.lastIndex = -1;\n }\n\n public invokeCryptoNew({method, args, transfer}: {\n method: T,\n args: Parameters,\n transfer?: Transferable[]\n }): Promise>> {\n const payload = {method, args};\n const listeners = this.listeners['invoke'];\n if(listeners?.length) { // already in worker\n // try {\n // @ts-ignore\n let result: any = listeners[0].callback(payload);\n if(!IS_WORKER && !(result instanceof Promise)) {\n result = Promise.resolve(result);\n }\n\n return result;\n // } catch(err) {\n // return Promise.reject(err);\n // }\n }\n\n const sendPortIndex = method === 'aes-encrypt' || method === 'aes-decrypt' ?\n this.lastIndex = (this.lastIndex + 1) % this.sendPorts.length :\n 0;\n // @ts-ignore\n return this.invoke('invoke', payload, undefined, this.sendPorts[sendPortIndex], transfer);\n }\n\n public invokeCrypto(method: T, ...args: Parameters): Promise>> {\n return this.invokeCryptoNew({method, args});\n }\n}\n\nconst cryptoMessagePort = new CryptoMessagePort();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);\nexport default cryptoMessagePort;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from '../../config/modes';\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport MemoryWriter from './memoryWriter';\nimport FileManager from './memoryWriter';\nimport FileStorage from './fileStorage';\nimport makeError from '../../helpers/makeError';\nimport deferredPromise from '../../helpers/cancellablePromise';\n\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\n\nexport default class CacheStorageController implements FileStorage {\n private static STORAGES: CacheStorageController[] = [];\n private openDbPromise: Promise;\n\n private useStorage = true;\n\n // private log: ReturnType = logger('CS');\n\n constructor(private dbName: CacheStorageDbName) {\n if(Modes.test) {\n this.dbName += '_test';\n }\n\n if(CacheStorageController.STORAGES.length) {\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\n }\n\n this.openDatabase();\n CacheStorageController.STORAGES.push(this);\n }\n\n private openDatabase(): Promise {\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\n }\n\n public delete(entryName: string) {\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\n }\n\n public deleteAll() {\n return caches.delete(this.dbName);\n }\n\n public get(entryName: string) {\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\n }\n\n public save(entryName: string, response: Response) {\n // return new Promise((resolve) => {}); // DEBUG\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\n }\n\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\n /* if(method === 'blob') {\n return Promise.reject();\n } */\n\n // const str = `get fileName: ${fileName}`;\n // console.time(str);\n return this.get(fileName).then((response) => {\n if(!response) {\n // console.warn('getFile:', response, fileName);\n throw makeError('NO_ENTRY_FOUND');\n }\n\n const promise = response[method]();\n // promise.then(() => {\n // console.timeEnd(str);\n // });\n return promise;\n });\n }\n\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // return Promise.resolve(blobConstruct([blob]));\n if(!(blob instanceof Blob)) {\n blob = blobConstruct(blob);\n }\n\n const response = new Response(blob, {\n headers: {\n 'Content-Length': '' + blob.size\n }\n });\n\n return this.save(fileName, response).then(() => blob as Blob);\n }\n\n public timeoutOperation(callback: (cache: Cache) => Promise) {\n if(!this.useStorage) {\n return Promise.reject(makeError('STORAGE_OFFLINE'));\n }\n\n return new Promise(async(resolve, reject) => {\n let rejected = false;\n const timeout = setTimeout(() => {\n reject();\n // console.warn('CACHESTORAGE TIMEOUT');\n rejected = true;\n }, 15e3);\n\n try {\n const cache = await this.openDatabase();\n if(!cache) {\n this.useStorage = false;\n this.openDbPromise = undefined;\n throw 'no cache?';\n }\n\n const res = await callback(cache);\n\n if(rejected) return;\n resolve(res);\n } catch(err) {\n reject(err);\n }\n\n clearTimeout(timeout);\n });\n }\n\n public prepareWriting(fileName: string, fileSize: number, mimeType: string) {\n return {\n deferred: deferredPromise(),\n getWriter: () => {\n const writer = new MemoryWriter(mimeType, fileSize, (blob) => {\n return this.saveFile(fileName, blob).catch(() => blob);\n });\n\n return writer;\n }\n };\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n return storage.deleteAll();\n }\n }));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport StreamWriter from './streamWriter';\n\nexport default class MemoryWriter implements StreamWriter {\n private bytes: Uint8Array;\n\n constructor(\n private mimeType: string,\n private size: number,\n private saveFileCallback?: (blob: Blob) => Promise\n ) {\n this.bytes = new Uint8Array(size);\n }\n\n public async write(part: Uint8Array, offset: number) {\n // sometimes file size can be bigger than the prov\n const endOffset = offset + part.byteLength;\n if(endOffset > this.bytes.byteLength) {\n const newBytes = new Uint8Array(endOffset);\n newBytes.set(this.bytes, 0);\n this.bytes = newBytes;\n }\n\n this.bytes.set(part, offset);\n };\n\n public truncate() {\n this.bytes = new Uint8Array();\n }\n\n public trim(size: number) {\n this.bytes = this.bytes.slice(0, size);\n }\n\n public finalize(saveToStorage = true) {\n const blob = blobConstruct(this.bytes, this.mimeType);\n\n if(saveToStorage && this.saveFileCallback) {\n this.saveFileCallback(blob);\n }\n\n return blob;\n }\n\n public getParts() {\n return this.bytes;\n }\n\n public replaceParts(parts: Uint8Array) {\n this.bytes = parts;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n underscore: '\\x1b[4m',\n blink: '\\x1b[5m',\n reverse: '\\x1b[7m',\n hidden: '\\x1b[8m',\n // Foreground (text) colors\n fg: {\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m'\n },\n // Background colors\n bg: {\n black: '\\x1b[40m',\n red: '\\x1b[41m',\n green: '\\x1b[42m',\n yellow: '\\x1b[43m',\n blue: '\\x1b[44m',\n magenta: '\\x1b[45m',\n cyan: '\\x1b[46m',\n white: '\\x1b[47m'\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n ['debug', LogTypes.Debug],\n ['info', LogTypes.Log],\n ['warn', LogTypes.Warn],\n ['error', LogTypes.Error],\n ['assert', LogTypes.Error],\n ['trace', LogTypes.Log],\n ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n const originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n // level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport type {getEnvironment} from '../../environment/utils';\nimport type loadState from '../appManagers/utils/state/loadState';\nimport type {StoragesResults} from '../appManagers/utils/storages/loadStorages';\nimport type {LocalStorageProxyTask} from '../localStorage';\nimport type {Awaited} from '../../types';\nimport type {Mirrors, MirrorTaskPayload, NotificationBuildTaskPayload, TabState} from './mtprotoworker';\nimport type toggleStorages from '../../helpers/toggleStorages';\nimport SuperMessagePort from './superMessagePort';\n\nexport type MTProtoManagerTaskPayload = {name: string, method: string, args: any[]};\n\ntype MTProtoBroadcastEvent = {\n event: (payload: {name: string, args: any[]}, source: MessageEventSource) => void\n};\n\nexport default class MTProtoMessagePort extends SuperMessagePort<{\n environment: (environment: ReturnType) => void,\n crypto: (payload: {method: string, args: any[]}) => Promise,\n state: (payload: {userId: UserId} & Awaited> & {storagesResults?: StoragesResults}) => void,\n manager: (payload: MTProtoManagerTaskPayload) => any,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => ReturnType,\n serviceWorkerOnline: (online: boolean) => void,\n serviceWorkerPort: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n cryptoPort: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n createObjectURL: (blob: Blob) => string,\n tabState: (payload: TabState, source: MessageEventSource) => void,\n createProxyWorkerURLs: (payload: {originalUrl: string, blob: Blob}) => string[],\n} & MTProtoBroadcastEvent, {\n convertWebp: (payload: {fileName: string, bytes: Uint8Array}) => Promise,\n convertOpus: (payload: {fileName: string, bytes: Uint8Array}) => Promise,\n localStorageProxy: (payload: LocalStorageProxyTask['payload']) => Promise,\n mirror: (payload: MirrorTaskPayload) => void,\n notificationBuild: (payload: NotificationBuildTaskPayload) => void,\n // hello: () => void\n} & MTProtoBroadcastEvent, Master> {\n private static INSTANCE: MTProtoMessagePort;\n\n constructor() {\n super('MTPROTO');\n\n MTProtoMessagePort.INSTANCE = this;\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.mtprotoMessagePort = this);\n }\n\n public static getInstance() {\n return this.INSTANCE as MTProtoMessagePort;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bufferConcats from '../helpers/bytes/bufferConcats';\n\nUint8Array.prototype.concat = function(...args: Array) {\n return bufferConcats(this, ...args);\n};\n\n/* Uint8Array.prototype.toString = function() {\n return String.fromCharCode.apply(null, [...this]);\n}; */\n\nUint8Array.prototype.toJSON = function() {\n return [...this];\n // return {type: 'bytes', value: [...this]};\n};\n\nPromise.prototype.finally = Promise.prototype.finally || function(this: Promise, fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n};\n\ndeclare global {\n interface Uint8Array {\n concat: (...args: Array) => Uint8Array,\n // toString: () => string,\n toJSON: () => number[],\n // toJSON: () => {type: 'bytes', value: number[]},\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n }\n}\n","import {URL_ANY_PROTOCOL_REG_EXP} from '.';\n\nexport default function matchUrlProtocol(text: string) {\n return !text ? null : text.match(URL_ANY_PROTOCOL_REG_EXP);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {WebPushApiManager} from '../mtproto/webPushApiManager';\nimport type {PushNotificationObject} from './push';\nimport type {MyUploadFile} from '../mtproto/apiFileManager';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\n\nexport type ServicePushPingTaskPayload = {\n localNotifications: boolean,\n lang: {\n push_action_mute1d: string\n push_action_settings: string\n push_message_nopreview: string\n },\n settings: WebPushApiManager['settings']\n};\n\nexport type ServiceRequestFilePartTaskPayload = {\n docId: DocId,\n dcId: number,\n offset: number,\n limit: number\n};\n\nexport type ServiceDownloadTaskPayload = {\n headers: any,\n id: string\n};\n\nexport type ServiceEvent = {\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void\n};\n\nexport default class ServiceMessagePort extends SuperMessagePort<{\n // from main thread to service worker\n notificationsClear: () => void,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => void,\n pushPing: (payload: ServicePushPingTaskPayload, source: MessageEventSource, event: MessageEvent) => void,\n hello: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n\n // from mtproto worker\n download: (payload: ServiceDownloadTaskPayload) => void,\n downloadChunk: (payload: {id: ServiceDownloadTaskPayload['id'], chunk: Uint8Array}) => void\n downloadFinalize: (payload: ServiceDownloadTaskPayload['id']) => void,\n downloadCancel: (payload: ServiceDownloadTaskPayload['id']) => void\n}, {\n // to main thread\n pushClick: (payload: PushNotificationObject) => void,\n hello: (payload: void, source: MessageEventSource) => void,\n\n // to mtproto worker\n requestFilePart: (payload: ServiceRequestFilePartTaskPayload) => Promise | MyUploadFile\n} & ServiceEvent, Master> {\n constructor() {\n super('SERVICE');\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.serviceMessagePort = this);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Modes from '../config/modes';\nimport {IS_WORKER} from '../helpers/context';\nimport {WorkerTaskTemplate} from '../types';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\n// import { stringify } from '../helpers/json';\n\nclass LocalStorage> {\n private prefix = '';\n private cache: Partial = {};\n private useStorage = true;\n\n constructor(/* private preserveKeys: (keyof Storage)[] */) {\n if(Modes.test) {\n this.prefix = 't_';\n }\n }\n\n public get(key: T, useCache = true): Storage[T] {\n if(this.cache.hasOwnProperty(key) && useCache) {\n return this.cache[key];\n } else if(this.useStorage) {\n let value: Storage[T];\n try {\n value = localStorage.getItem(this.prefix + (key as string)) as any;\n } catch(err) {\n this.useStorage = false;\n }\n\n if(value !== null) {\n try {\n value = JSON.parse(value);\n } catch(err) {\n // console.error(err);\n }\n } else {\n value = undefined;\n }\n\n return value;\n }/* else {\n throw 'something went wrong';\n } */\n }\n\n public set(obj: Partial, onlyLocal = false) {\n for(const key in obj) {\n if(obj.hasOwnProperty(key)) {\n const value = obj[key];\n this.cache[key] = value;\n\n if(this.useStorage && !onlyLocal) {\n try {\n const stringified = JSON.stringify(value);\n localStorage.setItem(this.prefix + key, stringified);\n } catch(err) {\n this.useStorage = false;\n }\n }\n }\n }\n }\n\n public delete(key: keyof Storage, saveLocal = false) {\n // ! it is needed here\n key = '' + (key as string);\n\n if(!saveLocal) {\n delete this.cache[key];\n }\n\n // if(this.useStorage) {\n try {\n localStorage.removeItem(this.prefix + (key as string));\n } catch(err) {\n\n }\n // }\n }\n\n /* public clear(preserveKeys: (keyof Storage)[] = this.preserveKeys) {\n // if(this.useStorage) {\n try {\n let obj: Partial = {};\n if(preserveKeys) {\n preserveKeys.forEach((key) => {\n const value = this.get(key);\n if(value !== undefined) {\n obj[key] = value;\n }\n });\n }\n\n localStorage.clear();\n\n if(preserveKeys) {\n this.set(obj);\n }\n } catch(err) {\n\n }\n // }\n } */\n\n public clear() {\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance', 'user_auth', 'state_id', 'k_build'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n for(const key of keys) {\n this.delete(key, true);\n }\n }\n\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\n this.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n this.clear();\n } else {\n return this.set(this.cache);\n }\n }\n}\n\nexport interface LocalStorageProxyTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'set' | 'get' | 'delete' | 'clear' | 'toggleStorage',\n args: any[]\n }\n};\n\nexport interface LocalStorageProxyTaskResponse extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: any\n};\n\nexport default class LocalStorageController> {\n private static STORAGES: LocalStorageController[] = [];\n // private log = (...args: any[]) => console.log('[SW LS]', ...args);\n // private log = (...args: any[]) => {};\n\n private storage: LocalStorage;\n\n constructor(/* private preserveKeys: (keyof Storage)[] = [] */) {\n LocalStorageController.STORAGES.push(this);\n\n if(!IS_WORKER) {\n this.storage = new LocalStorage(/* preserveKeys */);\n }\n }\n\n private async proxy(type: LocalStorageProxyTask['payload']['type'], ...args: LocalStorageProxyTask['payload']['args']): Promise {\n if(IS_WORKER) {\n const port = MTProtoMessagePort.getInstance();\n return port.invoke('localStorageProxy', {type, args});\n }\n\n args = Array.prototype.slice.call(args);\n\n // @ts-ignore\n return this.storage[type].apply(this.storage, args as any);\n }\n\n public get(key: T, useCache?: boolean) {\n return this.proxy('get', key, useCache);\n }\n\n public set(obj: Partial, onlyLocal?: boolean) {\n return this.proxy('set', obj, onlyLocal);\n }\n\n public delete(key: keyof Storage, saveLocal?: boolean) {\n return this.proxy('delete', key, saveLocal);\n }\n\n public clear(/* preserveKeys?: (keyof Storage)[] */) {\n return this.proxy('clear'/* , preserveKeys */);\n }\n\n public toggleStorage(enabled: boolean, clearWrite: boolean) {\n return this.proxy('toggleStorage', enabled, clearWrite);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {AppInstance} from './mtproto/singleInstance';\nimport type {UserAuth} from './mtproto/mtproto_config';\nimport type {DcId} from '../types';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport LocalStorageController from './localStorage';\n\nconst sessionStorage = new LocalStorageController<{\n dc: DcId,\n user_auth: UserAuth,\n state_id: number,\n dc1_auth_key: string,\n dc2_auth_key: string,\n dc3_auth_key: string,\n dc4_auth_key: string,\n dc5_auth_key: string,\n dc1_server_salt: string,\n dc2_server_salt: string,\n dc3_server_salt: string,\n dc4_server_salt: string,\n dc5_server_salt: string,\n server_time_offset: number,\n xt_instance: AppInstance,\n kz_version: 'K' | 'Z',\n tgme_sync: {\n canRedirect: boolean,\n ts: number\n },\n k_build: number\n}>(/* ['kz_version'] */);\nMOUNT_CLASS_TO.appStorage = sessionStorage;\nexport default sessionStorage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ChatSavedPosition} from './appManagers/appImManager';\nimport type {AppDraftsManager} from './appManagers/appDraftsManager';\nimport type {State} from '../config/state';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport {LangPackDifference} from '../layer';\nimport AppStorage from './storage';\nimport DATABASE_STATE from '../config/databases/state';\n\nclass StateStorage extends AppStorage<{\n chatPositions: {\n [peerId_threadId: string]: ChatSavedPosition\n },\n langPack: LangPackDifference,\n drafts: AppDraftsManager['drafts'],\n user_auth: any, // support old webk format\n} & State, typeof DATABASE_STATE> {\n constructor() {\n super(DATABASE_STATE, 'session');\n }\n}\n\nconst stateStorage = new StateStorage();\nMOUNT_CLASS_TO.stateStorage = stateStorage;\nexport default stateStorage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../config/databases';\nimport {MOUNT_CLASS_TO} from '../config/debug';\n// import DATABASE_SESSION from \"../config/databases/session\";\nimport deferredPromise, {CancellablePromise} from '../helpers/cancellablePromise';\nimport {IS_WORKER} from '../helpers/context';\nimport throttle from '../helpers/schedulers/throttle';\n// import { WorkerTaskTemplate } from \"../types\";\nimport IDBStorage from './files/idb';\n\nfunction noop() {}\n\n/* export interface LocalStorageProxySetTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'set',\n keys: string[],\n values: any[]\n }\n};\n\nexport interface LocalStorageProxyDeleteTask extends WorkerTaskTemplate {\n type: 'localStorageProxy',\n payload: {\n type: 'delete',\n keys: string[]\n }\n}; */\n\nconst THROTTLE_TIME = 16;\n\n/* Storage extends {[name: string]: any} *//* Storage extends Record */\nexport default class AppStorage<\n Storage extends Record,\n T extends Database\n> {\n private static STORAGES: AppStorage>[] = [];\n private storage: IDBStorage;// new CacheStorageController('session');\n\n // private cache: Partial<{[key: string]: Storage[typeof key]}> = {};\n private cache: Partial = {};\n private useStorage: boolean;\n private savingFreezed: boolean;\n\n private getPromises: Map> = new Map();\n private getThrottled: () => void;\n\n private keysToSet: Set = new Set();\n private saveThrottled: () => void;\n private saveDeferred = deferredPromise();\n\n private keysToDelete: Set = new Set();\n private deleteThrottled: () => void;\n private deleteDeferred = deferredPromise();\n\n constructor(private db: T, private storeName: typeof db['stores'][number]['name']) {\n this.storage = new IDBStorage(db, storeName);\n\n if(AppStorage.STORAGES.length) {\n this.useStorage = AppStorage.STORAGES[0].useStorage;\n } else {\n this.useStorage = true;\n }\n\n this.savingFreezed = false;\n\n AppStorage.STORAGES.push(this);\n\n this.saveThrottled = throttle(async() => {\n const deferred = this.saveDeferred;\n this.saveDeferred = deferredPromise();\n\n const set = this.keysToSet;\n if(set.size) {\n const keys = Array.from(set.values()) as string[];\n set.clear();\n\n const values = keys.map((key) => this.cache[key]);\n try {\n // console.log('setItem: will set', key/* , value */);\n // await this.cacheStorage.delete(key); // * try to prevent memory leak in Chrome leading to 'Unexpected internal error.'\n // await this.storage.save(key, new Response(value, {headers: {'Content-Type': 'application/json'}}));\n\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\n self.postMessage({\n type: 'localStorageProxy',\n payload: {\n type: 'set',\n keys,\n values\n }\n } as LocalStorageProxySetTask);\n } */\n\n await this.storage.save(keys, values);\n // console.log('setItem: have set', key/* , value */);\n } catch(e) {\n // this.useCS = false;\n console.error('[AS]: set error:', e, keys, values);\n }\n }\n\n deferred.resolve();\n\n if(set.size) {\n this.saveThrottled();\n }\n }, THROTTLE_TIME, false);\n\n this.deleteThrottled = throttle(async() => {\n const deferred = this.deleteDeferred;\n this.deleteDeferred = deferredPromise();\n\n const set = this.keysToDelete;\n if(set.size) {\n const keys = Array.from(set.values()) as string[];\n set.clear();\n\n try {\n /* if(db === DATABASE_SESSION && !('localStorage' in self)) { // * support legacy Webogram's localStorage\n self.postMessage({\n type: 'localStorageProxy',\n payload: {\n type: 'delete',\n keys\n }\n } as LocalStorageProxyDeleteTask);\n } */\n\n await this.storage.delete(keys);\n } catch(e) {\n console.error('[AS]: delete error:', e, keys);\n }\n }\n\n deferred.resolve();\n\n if(set.size) {\n this.deleteThrottled();\n }\n }, THROTTLE_TIME, false);\n\n this.getThrottled = throttle(async() => {\n const keys = Array.from(this.getPromises.keys());\n\n // const perf = performance.now();\n this.storage.get(keys as string[]).then((values) => {\n for(let i = 0, length = keys.length; i < length; ++i) {\n const key = keys[i];\n const deferred = this.getPromises.get(key);\n if(deferred) {\n // @ts-ignore\n deferred.resolve(this.cache[key] = values[i]);\n this.getPromises.delete(key);\n }\n }\n\n // console.log('[AS]: get time', keys, performance.now() - perf);\n }, (error: ApiError) => {\n const ignoreErrors: Set = new Set(['NO_ENTRY_FOUND', 'STORAGE_OFFLINE']);\n if(!ignoreErrors.has(error.type)) {\n this.useStorage = false;\n console.error('[AS]: get error:', error, keys, storeName);\n }\n\n for(let i = 0, length = keys.length; i < length; ++i) {\n const key = keys[i];\n const deferred = this.getPromises.get(key);\n if(deferred) {\n // deferred.reject(error);\n deferred.resolve(undefined);\n this.getPromises.delete(key);\n }\n }\n }).finally(() => {\n if(this.getPromises.size) {\n this.getThrottled();\n }\n });\n }, THROTTLE_TIME, false);\n }\n\n public isAvailable() {\n return this.useStorage;\n }\n\n public getCache() {\n return this.cache;\n }\n\n public getFromCache(key: T) {\n return this.cache[key];\n }\n\n public setToCache(key: keyof Storage, value: Storage[typeof key]) {\n return this.cache[key] = value;\n }\n\n public async get(key: T, useCache = true): Promise {\n if(this.cache.hasOwnProperty(key) && useCache) {\n return this.getFromCache(key);\n } else if(this.useStorage) {\n const r = this.getPromises.get(key);\n if(r) return r as any;\n\n const p = deferredPromise();\n this.getPromises.set(key, p as any);\n\n this.getThrottled();\n\n return p;\n }/* else {\n throw 'something went wrong';\n } */\n }\n\n public getAll() {\n return this.storage.getAll().catch(() => []);\n }\n\n public set(obj: Partial, onlyLocal = false) {\n // console.log('storageSetValue', obj, callback, arguments);\n\n const canUseStorage = this.useStorage && !onlyLocal && !this.savingFreezed;\n for(const key in obj) {\n if(obj.hasOwnProperty(key)) {\n const value = obj[key];\n this.setToCache(key, value);\n\n // let perf = /* DEBUG */false ? performance.now() : 0;\n // value = JSON.stringify(value);\n\n // if(perf) {\n // let elapsedTime = performance.now() - perf;\n // if(elapsedTime > 10) {\n // console.warn('LocalStorage set: stringify time by JSON.stringify:', elapsedTime, key);\n // }\n // }\n\n /* perf = performance.now();\n value = stringify(value);\n console.log('LocalStorage set: stringify time by own stringify:', performance.now() - perf); */\n\n if(canUseStorage) {\n this.keysToSet.add(key);\n this.keysToDelete.delete(key);\n this.saveThrottled();\n }\n }\n }\n\n return canUseStorage ? this.saveDeferred : Promise.resolve();\n }\n\n public delete(key: keyof Storage, saveLocal = false) {\n /* if(!this.cache.hasOwnProperty(key)) {\n return;\n } */\n\n // ! it is needed here\n key = '' + (key as string);\n\n if(!saveLocal) {\n delete this.cache[key];\n }\n\n if(this.useStorage) {\n this.keysToSet.delete(key);\n this.keysToDelete.add(key);\n this.deleteThrottled();\n }\n\n return this.useStorage ? this.deleteDeferred : Promise.resolve();\n }\n\n public clear(saveLocal = false) {\n if(!saveLocal) {\n for(const i in this.cache) {\n delete this.cache[i];\n }\n }\n\n return this.storage.clear().catch(noop);\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!IS_WORKER || !clearWrite) {\n return;\n }\n\n if(!enabled) {\n storage.keysToSet.clear();\n storage.keysToDelete.clear();\n storage.getPromises.forEach((deferred) => deferred.resolve(undefined));\n storage.getPromises.clear();\n return storage.clear(true);\n } else {\n return storage.set(storage.cache);\n }\n })).catch(noop);\n }\n\n public static freezeSaving>(callback: () => any, names: T['stores'][number]['name'][]) {\n this.STORAGES.forEach((storage) => storage.savingFreezed = true);\n try {\n callback();\n } catch(err) {\n console.error('freezeSaving callback error:', err);\n }\n this.STORAGES.forEach((storage) => storage.savingFreezed = false);\n }\n\n /* public deleteDatabase() {\n return IDBStorage.deleteDatabase().catch(noop);\n } */\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.AppStorage = AppStorage);\n","// Copyright Twitter Inc. Licensed under MIT\n// https://github.com/twitter/twemoji-parser/blob/master/LICENSE.md\n\nconst originalString = '((?:\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffc-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc68\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc69\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83d\\udc69\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffc-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffb\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffc\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\uddd1\\ud83c\\udffd\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\uddd1\\ud83c\\udffe\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\u2764\\ufe0f?\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udffe]|\\ud83e\\uddd1\\ud83c\\udfff\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc8b\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\udef1\\ud83c\\udffb\\u200d\\ud83e\\udef2\\ud83c[\\udffc-\\udfff]|\\ud83e\\udef1\\ud83c\\udffc\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffd-\\udfff]|\\ud83e\\udef1\\ud83c\\udffd\\u200d\\ud83e\\udef2\\ud83c[\\udffb\\udffc\\udffe\\udfff]|\\ud83e\\udef1\\ud83c\\udffe\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffd\\udfff]|\\ud83e\\udef1\\ud83c\\udfff\\u200d\\ud83e\\udef2\\ud83c[\\udffb-\\udffe]|\\ud83d\\udc68\\u200d\\u2764\\ufe0f?\\u200d\\ud83d\\udc68|\\ud83d\\udc69\\u200d\\u2764\\ufe0f?\\u200d\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1\\u200d\\ud83e\\udd1d\\u200d\\ud83e\\uddd1|\\ud83d\\udc6b\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6c\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc6d\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc8f\\ud83c[\\udffb-\\udfff]|\\ud83d\\udc91\\ud83c[\\udffb-\\udfff]|\\ud83e\\udd1d\\ud83c[\\udffb-\\udfff]|\\ud83d[\\udc6b-\\udc6d\\udc8f\\udc91]|\\ud83e\\udd1d)|(?:\\ud83d[\\udc68\\udc69]|\\ud83e\\uddd1)(?:\\ud83c[\\udffb-\\udfff])?\\u200d(?:\\u2695\\ufe0f?|\\u2696\\ufe0f?|\\u2708\\ufe0f?|\\ud83c[\\udf3e\\udf73\\udf7c\\udf84\\udf93\\udfa4\\udfa8\\udfeb\\udfed]|\\ud83d[\\udcbb\\udcbc\\udd27\\udd2c\\ude80\\ude92]|\\ud83e[\\uddaf-\\uddb3\\uddbc\\uddbd])|(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75]|\\u26f9)(?:(?:\\ud83c[\\udffb-\\udfff]|\\ufe0f?)\\u200d[\\u2640\\u2642]\\ufe0f?)|(?:\\ud83c[\\udfc3\\udfc4\\udfca]|\\ud83d[\\udc6e\\udc70\\udc71\\udc73\\udc77\\udc81\\udc82\\udc86\\udc87\\ude45-\\ude47\\ude4b\\ude4d\\ude4e\\udea3\\udeb4-\\udeb6]|\\ud83e[\\udd26\\udd35\\udd37-\\udd39\\udd3d\\udd3e\\uddb8\\uddb9\\uddcd-\\uddcf\\uddd4\\uddd6-\\udddd])(?:\\ud83c[\\udffb-\\udfff])?\\u200d[\\u2640\\u2642]\\ufe0f?|(?:\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc68\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc68\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc66\\u200d\\ud83d\\udc66|\\ud83d\\udc69\\u200d\\ud83d\\udc67\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83c\\udff3\\ufe0f?\\u200d\\u26a7\\ufe0f?|\\ud83c\\udff3\\ufe0f?\\u200d\\ud83c\\udf08|\\ud83d\\ude36\\u200d\\ud83c\\udf2b\\ufe0f?|\\u2764\\ufe0f?\\u200d\\ud83d\\udd25|\\u2764\\ufe0f?\\u200d\\ud83e\\ude79|\\ud83c\\udff4\\u200d\\u2620\\ufe0f?|\\ud83d\\udc15\\u200d\\ud83e\\uddba|\\ud83d\\udc3b\\u200d\\u2744\\ufe0f?|\\ud83d\\udc41\\u200d\\ud83d\\udde8|\\ud83d\\udc68\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc69\\u200d\\ud83d[\\udc66\\udc67]|\\ud83d\\udc6f\\u200d\\u2640\\ufe0f?|\\ud83d\\udc6f\\u200d\\u2642\\ufe0f?|\\ud83d\\ude2e\\u200d\\ud83d\\udca8|\\ud83d\\ude35\\u200d\\ud83d\\udcab|\\ud83e\\udd3c\\u200d\\u2640\\ufe0f?|\\ud83e\\udd3c\\u200d\\u2642\\ufe0f?|\\ud83e\\uddde\\u200d\\u2640\\ufe0f?|\\ud83e\\uddde\\u200d\\u2642\\ufe0f?|\\ud83e\\udddf\\u200d\\u2640\\ufe0f?|\\ud83e\\udddf\\u200d\\u2642\\ufe0f?|\\ud83d\\udc08\\u200d\\u2b1b)|[#*0-9]\\ufe0f??\\u20e3|(?:[©®\\u2122\\u265f]\\ufe0f?)|(?:\\ud83c[\\udc04\\udd70\\udd71\\udd7e\\udd7f\\ude02\\ude1a\\ude2f\\ude37\\udf21\\udf24-\\udf2c\\udf36\\udf7d\\udf96\\udf97\\udf99-\\udf9b\\udf9e\\udf9f\\udfcd\\udfce\\udfd4-\\udfdf\\udff3\\udff5\\udff7]|\\ud83d[\\udc3f\\udc41\\udcfd\\udd49\\udd4a\\udd6f\\udd70\\udd73\\udd76-\\udd79\\udd87\\udd8a-\\udd8d\\udda5\\udda8\\uddb1\\uddb2\\uddbc\\uddc2-\\uddc4\\uddd1-\\uddd3\\udddc-\\uddde\\udde1\\udde3\\udde8\\uddef\\uddf3\\uddfa\\udecb\\udecd-\\udecf\\udee0-\\udee5\\udee9\\udef0\\udef3]|[\\u203c\\u2049\\u2139\\u2194-\\u2199\\u21a9\\u21aa\\u231a\\u231b\\u2328\\u23cf\\u23ed-\\u23ef\\u23f1\\u23f2\\u23f8-\\u23fa\\u24c2\\u25aa\\u25ab\\u25b6\\u25c0\\u25fb-\\u25fe\\u2600-\\u2604\\u260e\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262a\\u262e\\u262f\\u2638-\\u263a\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267b\\u267f\\u2692-\\u2697\\u2699\\u269b\\u269c\\u26a0\\u26a1\\u26a7\\u26aa\\u26ab\\u26b0\\u26b1\\u26bd\\u26be\\u26c4\\u26c5\\u26c8\\u26cf\\u26d1\\u26d3\\u26d4\\u26e9\\u26ea\\u26f0-\\u26f5\\u26f8\\u26fa\\u26fd\\u2702\\u2708\\u2709\\u270f\\u2712\\u2714\\u2716\\u271d\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u2764\\u27a1\\u2934\\u2935\\u2b05-\\u2b07\\u2b1b\\u2b1c\\u2b50\\u2b55\\u3030\\u303d\\u3297\\u3299])(?:\\ufe0f?|(?!\\ufe0e))|(?:(?:\\ud83c[\\udfcb\\udfcc]|\\ud83d[\\udd74\\udd75\\udd90]|[\\u261d\\u26f7\\u26f9\\u270c\\u270d])(?:\\ufe0f?|(?!\\ufe0e))|(?:\\ud83c[\\udf85\\udfc2-\\udfc4\\udfc7\\udfca]|\\ud83d[\\udc42\\udc43\\udc46-\\udc50\\udc66-\\udc69\\udc6e\\udc70-\\udc78\\udc7c\\udc81-\\udc83\\udc85-\\udc87\\udcaa\\udd7a\\udd95\\udd96\\ude45-\\ude47\\ude4b-\\ude4f\\udea3\\udeb4-\\udeb6\\udec0\\udecc]|\\ud83e[\\udd0c\\udd0f\\udd18-\\udd1c\\udd1e\\udd1f\\udd26\\udd30-\\udd39\\udd3d\\udd3e\\udd77\\uddb5\\uddb6\\uddb8\\uddb9\\uddbb\\uddcd-\\uddcf\\uddd1-\\udddd\\udec3-\\udec5\\udef0-\\udef6]|[\\u270a\\u270b]))(?:\\ud83c[\\udffb-\\udfff])?|(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc65\\udb40\\udc6e\\udb40\\udc67\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc73\\udb40\\udc63\\udb40\\udc74\\udb40\\udc7f|\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40\\udc77\\udb40\\udc6c\\udb40\\udc73\\udb40\\udc7f|\\ud83c\\udde6\\ud83c[\\udde8-\\uddec\\uddee\\uddf1\\uddf2\\uddf4\\uddf6-\\uddfa\\uddfc\\uddfd\\uddff]|\\ud83c\\udde7\\ud83c[\\udde6\\udde7\\udde9-\\uddef\\uddf1-\\uddf4\\uddf6-\\uddf9\\uddfb\\uddfc\\uddfe\\uddff]|\\ud83c\\udde8\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\uddee\\uddf0-\\uddf5\\uddf7\\uddfa-\\uddff]|\\ud83c\\udde9\\ud83c[\\uddea\\uddec\\uddef\\uddf0\\uddf2\\uddf4\\uddff]|\\ud83c\\uddea\\ud83c[\\udde6\\udde8\\uddea\\uddec\\udded\\uddf7-\\uddfa]|\\ud83c\\uddeb\\ud83c[\\uddee-\\uddf0\\uddf2\\uddf4\\uddf7]|\\ud83c\\uddec\\ud83c[\\udde6\\udde7\\udde9-\\uddee\\uddf1-\\uddf3\\uddf5-\\uddfa\\uddfc\\uddfe]|\\ud83c\\udded\\ud83c[\\uddf0\\uddf2\\uddf3\\uddf7\\uddf9\\uddfa]|\\ud83c\\uddee\\ud83c[\\udde8-\\uddea\\uddf1-\\uddf4\\uddf6-\\uddf9]|\\ud83c\\uddef\\ud83c[\\uddea\\uddf2\\uddf4\\uddf5]|\\ud83c\\uddf0\\ud83c[\\uddea\\uddec-\\uddee\\uddf2\\uddf3\\uddf5\\uddf7\\uddfc\\uddfe\\uddff]|\\ud83c\\uddf1\\ud83c[\\udde6-\\udde8\\uddee\\uddf0\\uddf7-\\uddfb\\uddfe]|\\ud83c\\uddf2\\ud83c[\\udde6\\udde8-\\udded\\uddf0-\\uddff]|\\ud83c\\uddf3\\ud83c[\\udde6\\udde8\\uddea-\\uddec\\uddee\\uddf1\\uddf4\\uddf5\\uddf7\\uddfa\\uddff]|\\ud83c\\uddf4\\ud83c\\uddf2|\\ud83c\\uddf5\\ud83c[\\udde6\\uddea-\\udded\\uddf0-\\uddf3\\uddf7-\\uddf9\\uddfc\\uddfe]|\\ud83c\\uddf6\\ud83c\\udde6|\\ud83c\\uddf7\\ud83c[\\uddea\\uddf4\\uddf8\\uddfa\\uddfc]|\\ud83c\\uddf8\\ud83c[\\udde6-\\uddea\\uddec-\\uddf4\\uddf7-\\uddf9\\uddfb\\uddfd-\\uddff]|\\ud83c\\uddf9\\ud83c[\\udde6\\udde8\\udde9\\uddeb-\\udded\\uddef-\\uddf4\\uddf7\\uddf9\\uddfb\\uddfc\\uddff]|\\ud83c\\uddfa\\ud83c[\\udde6\\uddec\\uddf2\\uddf3\\uddf8\\uddfe\\uddff]|\\ud83c\\uddfb\\ud83c[\\udde6\\udde8\\uddea\\uddec\\uddee\\uddf3\\uddfa]|\\ud83c\\uddfc\\ud83c[\\uddeb\\uddf8]|\\ud83c\\uddfd\\ud83c\\uddf0|\\ud83c\\uddfe\\ud83c[\\uddea\\uddf9]|\\ud83c\\uddff\\ud83c[\\udde6\\uddf2\\uddfc]|\\ud83c[\\udccf\\udd8e\\udd91-\\udd9a\\udde6-\\uddff\\ude01\\ude32-\\ude36\\ude38-\\ude3a\\ude50\\ude51\\udf00-\\udf20\\udf2d-\\udf35\\udf37-\\udf7c\\udf7e-\\udf84\\udf86-\\udf93\\udfa0-\\udfc1\\udfc5\\udfc6\\udfc8\\udfc9\\udfcf-\\udfd3\\udfe0-\\udff0\\udff4\\udff8-\\udfff]|\\ud83d[\\udc00-\\udc3e\\udc40\\udc44\\udc45\\udc51-\\udc65\\udc6a\\udc6f\\udc79-\\udc7b\\udc7d-\\udc80\\udc84\\udc88-\\udc8e\\udc90\\udc92-\\udca9\\udcab-\\udcfc\\udcff-\\udd3d\\udd4b-\\udd4e\\udd50-\\udd67\\udda4\\uddfb-\\ude44\\ude48-\\ude4a\\ude80-\\udea2\\udea4-\\udeb3\\udeb7-\\udebf\\udec1-\\udec5\\uded0-\\uded2\\uded5-\\uded7\\udedd-\\udedf\\udeeb\\udeec\\udef4-\\udefc\\udfe0-\\udfeb\\udff0]|\\ud83e[\\udd0d\\udd0e\\udd10-\\udd17\\udd20-\\udd25\\udd27-\\udd2f\\udd3a\\udd3c\\udd3f-\\udd45\\udd47-\\udd76\\udd78-\\uddb4\\uddb7\\uddba\\uddbc-\\uddcc\\uddd0\\uddde-\\uddff\\ude70-\\ude74\\ude78-\\ude7c\\ude80-\\ude86\\ude90-\\udeac\\udeb0-\\udeba\\udec0-\\udec2\\uded0-\\uded9\\udee0-\\udee7]|[\\u23e9-\\u23ec\\u23f0\\u23f3\\u267e\\u26ce\\u2705\\u2728\\u274c\\u274e\\u2753-\\u2755\\u2795-\\u2797\\u27b0\\u27bf\\ue50a])|\\ufe0f)';\nexport default originalString;\n"],"names":["MAIN_DOMAINS","threads","Math","min","navigator","hardwareConcurrency","App","id","hash","version","versionFull","build","langPackVersion","langPack","langPackCode","domains","baseDcId","isMainDomain","includes","location","hostname","suffix","cryptoWorkers","name","stores","blobConstruct","blobParts","mimeType","Array","isArray","safeMimeType","Blob","type","blobSafeMimeType","indexOf","bufferConcats","args","length","reduce","acc","v","byteLength","tmp","Uint8Array","lastLength","forEach","b","set","ArrayBuffer","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","listeners","callback","addNotifyListener","push","deferred","Promise","resolve","reject","value","catch","finally","cancel","Object","assign","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","self","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","postMessage","listener","err","console","error","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","then","slice","bind","noop","copy","obj","Date","getTime","map","el","isView","clonedObj","constructor","prop","hasOwnProperty","deepEqual","x","y","ok","keys","tx","every","key","isObject","object","safeAssign","fromObject","i","undefined","validateInitObject","initObject","currentObject","onReplace","previousKey","String","prototype","toUserId","this","toChatId","toPeerId","isChat","isPeerId","test","toString","Number","abs","newMethod","originMethod","call","arrays","Uint16Array","Uint32Array","nextRandomUint","bits","array","crypto","getRandomValues","randomLong","recordPromiseBound","log","promise","description","perf","performance","now","warn","recordPromise","pause","ms","setTimeout","throttle","fn","shouldRunFirst","isPending","interval","_args","setInterval","clearInterval","capitalizeFirstLetter","string","charAt","toUpperCase","toggleStorages","enabled","clearWrite","tsNow","seconds","t","isAnyChat","peerId","isUser","CryptoMessagePort","super","lastIndex","invokeCryptoNew","method","transfer","payload","result","sendPortIndex","sendPorts","invoke","invokeCrypto","cryptoMessagePort","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","get","match","save","response","put","getFile","fileName","saveFile","blob","Response","headers","size","rejected","timeout","res","clearTimeout","prepareWriting","fileSize","getWriter","static","storage","MemoryWriter","saveFileCallback","bytes","write","part","offset","endOffset","newBytes","truncate","trim","finalize","saveToStorage","getParts","replaceParts","parts","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","STYLES_SUPPORTED","IS_SAFARI","IS_FIREFOX","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","MTProtoMessagePort","INSTANCE","concat","toJSON","onFinally","reason","matchUrlProtocol","text","ServiceMessagePort","LocalStorage","useCache","localStorage","getItem","JSON","parse","onlyLocal","stringified","stringify","setItem","saveLocal","removeItem","clear","toggleStorage","LocalStorageController","proxy","apply","sessionStorage","StateStorage","stateStorage","AppStorage","db","storeName","getPromises","Map","keysToSet","Set","saveDeferred","keysToDelete","deleteDeferred","savingFreezed","saveThrottled","from","values","e","deleteThrottled","getThrottled","has","isAvailable","getCache","getFromCache","setToCache","r","p","getAll","canUseStorage","add","names"],"sourceRoot":""} \ No newline at end of file diff --git a/public/crypto.worker.eebc3997154695b54c25.chunk.js b/public/crypto.worker.4909ec7e814298d58e2b.chunk.js similarity index 99% rename from public/crypto.worker.eebc3997154695b54c25.chunk.js rename to public/crypto.worker.4909ec7e814298d58e2b.chunk.js index ecd1571a0..6d54c877d 100644 --- a/public/crypto.worker.eebc3997154695b54c25.chunk.js +++ b/public/crypto.worker.4909ec7e814298d58e2b.chunk.js @@ -1,2 +1,2 @@ (()=>{"use strict";var e,t,n={410:(e,t,n)=>{n.d(t,{GO:()=>o,ZP:()=>i});const r=n(1267).Z.debug,o="undefined"!=typeof window?window:self,i=r},4762:(e,t,n)=>{n.d(t,{IS_FIREFOX:()=>f,IS_SAFARI:()=>i});var r=n(6761);const o=navigator?navigator.userAgent:null,i=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&r.Z.MSStream,!!("safari"in r.Z)||!(!o||!(/\b(iPad|iPhone|iPod)\b/.test(o)||o.match("Safari")&&!o.match("Chrome")))),f=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},1352:(e,t,n)=>{n.d(t,{N5:()=>o,SU:()=>r,kC:()=>i});const r="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,o="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!r,i=o||r,f=(e,...t)=>{try{e.postMessage(...t)}catch(e){console.error("[worker] postMessage error:",e,t)}},c=(e,...t)=>{self.clients.matchAll({includeUncontrolled:!1,type:"window"}).then((n=>{n.length&&n.slice(e?0:-1).forEach((e=>{f(e,...t)}))}))};r&&c.bind(null,!1),r&&c.bind(null,!0)},6991:(e,t,n)=>{function r(...e){const t=e.reduce(((e,t)=>e+(t.byteLength||t.length)),0),n=new Uint8Array(t);let r=0;return e.forEach((e=>{n.set(e instanceof ArrayBuffer?new Uint8Array(e):e,r),r+=e.byteLength||e.length})),n}Uint8Array.prototype.concat=function(...e){return r(this,...e)},Uint8Array.prototype.toJSON=function(){return[...this]},Promise.prototype.finally=Promise.prototype.finally||function(e){const t=t=>Promise.resolve(e()).then(t);return this.then((e=>t((()=>e))),(e=>t((()=>Promise.reject(e)))))};var o=n(4736),i=n.n(o);i()(Number.MAX_SAFE_INTEGER);const f=i()(i()[2]).pow(64),c=f.divide(i()[2]);function a(e,t=256){return i().fromArray(e instanceof Uint8Array?[...e]:e,t)}function s(e){return new Uint8Array(e.toArray(256).value)}function u(e,t,n){const r=a(e),o=a(t),i=a(n);return s(r.modPow(o,i))}var h=n(745),l=n.n(h),d=n(6761),y=n(153),p=n(410),v=n(1352);class g extends y.Z{constructor(){super("CRYPTO"),this.lastIndex=-1}invokeCryptoNew({method:e,args:t,transfer:n}){const r={method:e,args:t},o=this.listeners.invoke;if(null==o?void 0:o.length){let e=o[0].callback(r);return v.kC||e instanceof Promise||(e=Promise.resolve(e)),e}const i="aes-encrypt"===e||"aes-decrypt"===e?this.lastIndex=(this.lastIndex+1)%this.sendPorts.length:0;return this.invoke("invoke",r,void 0,this.sendPorts[i],n)}invokeCrypto(e,...t){return this.invokeCryptoNew({method:e,args:t})}}const w=new g;p.GO&&(p.GO.cryptoMessagePort=w);const b=w;function m(e){const t=e.length,n=8*t;let r=i()(e[0]).and(127).shiftLeft(n-8);for(let o=1;o0&&c>7),f[i[s]^s]=s;for(;!x[c];c^=e||1)n=(n=a^a<<1^a<<2^a<<3^a<<4)>>8^255&n^99,x[c]=n,K[n]=c,o=16843009*i[t=i[e=i[c]]]^65537*t^257*e^16843008*c,r=257*i[n]^16843008*n,E[c]=r=r<<24^r>>>8,L[c]=r=r<<24^r>>>8,O[c]=r=r<<24^r>>>8,F[c]=r=r<<24^r>>>8,_[n]=o=o<<24^o>>>8,I[n]=o=o<<24^o>>>8,z[n]=o=o<<24^o>>>8,N[n]=o=o<<24^o>>>8,a=f[a]||1}();var R=function(){function e(e){var t=Z(e);if(4!==t.length&&6!==t.length&&8!==t.length)throw new Error("Invalid key size");this.encKey=new Uint32Array(4*t.length+28),this.decKey=new Uint32Array(4*t.length+28),this.encKey.set(t);for(var n,r=1,o=t.length;o<4*t.length+28;o++)n=this.encKey[o-1],(o%t.length==0||8===t.length&&o%t.length==4)&&(n=x[n>>>24]<<24^x[n>>16&255]<<16^x[n>>8&255]<<8^x[255&n],o%t.length==0&&(n=n<<8^n>>>24^r<<24,r=r<<1^283*(r>>7))),this.encKey[o]=this.encKey[o-t.length]^n;for(var i=0;o;i++,o--)n=this.encKey[3&i?o:o-4],this.decKey[i]=o<=4||i<4?n:_[x[n>>>24]]^I[x[n>>16&255]]^z[x[n>>8&255]]^N[x[255&n]]}return e.prototype.encrypt=function(e){for(var t,n,r,o=Z(e),i=new Uint32Array(4),f=o[0]^this.encKey[0],c=o[1]^this.encKey[1],a=o[2]^this.encKey[2],s=o[3]^this.encKey[3],u=this.encKey.length/4-2,h=4,l=0;l>>24]^L[c>>16&255]^O[a>>8&255]^F[255&s]^this.encKey[h],n=E[c>>>24]^L[a>>16&255]^O[s>>8&255]^F[255&f]^this.encKey[h+1],r=E[a>>>24]^L[s>>16&255]^O[f>>8&255]^F[255&c]^this.encKey[h+2],s=E[s>>>24]^L[f>>16&255]^O[c>>8&255]^F[255&a]^this.encKey[h+3],f=t,c=n,a=r,h+=4;for(l=0;l<4;l++)i[l]=x[f>>>24]<<24^x[c>>16&255]<<16^x[a>>8&255]<<8^x[255&s]^this.encKey[h++],t=f,f=c,c=a,a=s,s=t;return i},e.prototype.decrypt=function(e){for(var t,n,r,o=Z(e),i=new Uint32Array(4),f=o[0]^this.decKey[0],c=o[3]^this.decKey[1],a=o[2]^this.decKey[2],s=o[1]^this.decKey[3],u=this.decKey.length/4-2,h=4,l=0;l>>24]^I[c>>16&255]^z[a>>8&255]^N[255&s]^this.decKey[h],n=_[c>>>24]^I[a>>16&255]^z[s>>8&255]^N[255&f]^this.decKey[h+1],r=_[a>>>24]^I[s>>16&255]^z[f>>8&255]^N[255&c]^this.decKey[h+2],s=_[s>>>24]^I[f>>16&255]^z[c>>8&255]^N[255&a]^this.decKey[h+3],f=t,c=n,a=r,h+=4;for(l=0;l<4;l++)i[3&-l]=K[f>>>24]<<24^K[c>>16&255]<<16^K[a>>8&255]<<8^K[255&s]^this.decKey[h++],t=f,f=c,c=a,a=s,s=t;return i},e}(),B=function(){function e(e,t,n){void 0===n&&(n=16),this.key=Z(e),this.iv=Z(t),this.cipher=new R(e),this.blockSize=n/4}return e.prototype.encrypt=function(e,t){for(var n=Z(e),r=t||new Uint32Array(n.length),o=this.iv.subarray(this.blockSize,this.iv.length),i=this.iv.subarray(0,this.blockSize),f=new Uint32Array(this.blockSize),c=0;c>>2]|=t[e]<<24-e%4*8;return new Uint32Array(n)}function W(e,t,n,r=!0){return function(e){const t=new Uint8Array(e.byteLength);for(let n=0,r=4*e.length;n>>2]>>>24-n%4*8&255;return t}(new B(T(t),T(n))[r?"encrypt":"decrypt"](T(e)))}!function(){function e(e,t,n){if(void 0===n&&(n=16),this.offset=0,this.key=Z(e),this.counter=Z(t),this.cipher=new R(e),this.blockSize=n/4,4!==this.counter.length)throw new Error("AES-CTR mode counter must be 16 bytes length")}e.prototype.encrypt=function(e,t){for(var n=Z(e),r=t||new Uint32Array(n.length),o=this.offset,i=0;i=this.blockSize&&this.incrementCounter(),o&&(i-=o,o=0)}return this.offset=(this.offset+n.length%4)%4,r},e.prototype.decrypt=function(e,t){return this.encrypt(e,t)},e.prototype.incrementCounter=function(){for(var e=this.counter.length-1;e>=0&&!(++this.counter[e]<4294967295);e--);}}();const G={8:new Uint8Array(1),16:new Uint16Array(1),32:new Uint32Array(1)};function j(e,t){return i().randBetween(e,t,(()=>function(e){const t=G[e];return crypto.getRandomValues(t),t[0]}(32)/4294967295))}function q(e){const t=i()[2];if(e.remainder(t).isZero())return t;const n=i()(1e3);let r,o,f,c,a,s,u;do{r=j(i().one,e.minus(1))}while(r.isZero()||r.eq(e.minus(t)));f=j(i().one,e.minus(1)),a=i().one,s=i().one;const h=i()("FFFFFFFFFFFFFFFF",16).minus(e).plus(1),l=n=>((n=(n=n.pow(t).mod(e)).add(r)).lesser(r)&&(n=n.add(h)),n.mod(e));do{o=f;for(let e=0;i()(e).lesser(a);++e)f=l(f);let t=i().zero;do{c=f;const r=i().min(n,a.minus(t));for(let t=0;i()(t).lesser(r);++t)f=l(f),s=s.multiply(o.greater(f)?o.minus(f):f.minus(o)).mod(e);u=i().gcd(s,e),t=t.add(n)}while(t.lesser(a)&&u.eq(i().one));a=a.shiftLeft(i().one)}while(u.eq(i().one));if(u.eq(e))do{c=l(c),u=i().gcd(o.minus(c).abs(),e)}while(u.eq(i().one));return u}const D="undefined"!=typeof window&&"crypto"in window?window.crypto.subtle:self.crypto.subtle;var J=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function f(e){try{a(r.next(e))}catch(e){i(e)}}function c(e){try{a(r.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(f,c)}a((r=r.apply(e,t||[])).next())}))};class ${constructor(e,t,n){this.mode=e,this.cryptoKey=t,this.queue=[],this.counter=a(n)}update(e){return J(this,void 0,void 0,(function*(){return new Promise((t=>{this.queue.push({data:e,resolve:t}),this.release()}))}))}release(){return J(this,void 0,void 0,(function*(){if(!this.releasing){for(this.releasing=!0;this.queue.length;){const{data:e,resolve:t}=this.queue.shift();t(yield this._update(e))}this.releasing=!1}}))}perform(e){return J(this,void 0,void 0,(function*(){return yield D[this.mode]({name:"AES-CTR",counter:S(s(this.counter),16,!0,!0,!0),length:128},this.cryptoKey,e)}))}_update(e){return J(this,void 0,void 0,(function*(){let t,n=e;if(this.leftLength){const e=this.leftLength,r=16-e,o=new Uint8Array(e).concat(n.slice(0,r)),i=yield this.perform(o);t=new Uint8Array(i.slice(e)),n=n.slice(r),this.counter=this.counter.add(1)}const r=new Uint8Array(yield this.perform(n)),o=t?t.concat(r):r;let i=n.length;const f=i%16;i-=f;const c=i/16;return this.counter=this.counter.add(c),this.leftLength=f||void 0,o}))}}var V=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function f(e){try{a(r.next(e))}catch(e){i(e)}}function c(e){try{a(r.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(f,c)}a((r=r.apply(e,t||[])).next())}))};const X=new Map;let H=-1;console.log("CryptoWorker start");const Y={sha1:function(e){return D.digest("SHA-1",U(e)).then((e=>new Uint8Array(e)))},sha256:function(e){return D.digest("SHA-256",U(e)).then((e=>new Uint8Array(e)))},pbkdf2:function(e,t,n){return r=this,o=void 0,f=function*(){const r=yield D.importKey("raw",e,{name:"PBKDF2"},!1,["deriveBits"]);return D.deriveBits({name:"PBKDF2",salt:t,iterations:n,hash:{name:"SHA-512"}},r,512).then((e=>new Uint8Array(e)))},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{a(f.next(e))}catch(e){t(e)}}function c(e){try{a(f.throw(e))}catch(e){t(e)}}function a(t){var r;t.done?e(t.value):(r=t.value,r instanceof i?r:new i((function(e){e(r)}))).then(n,c)}a((f=f.apply(r,o||[])).next())}));var r,o,i,f},"aes-encrypt":function(e,t,n){return W(S(e),t,n,!0)},"aes-decrypt":function(e,t,n){return W(e,t,n,!1)},"rsa-encrypt":function(e,t){return u(e,P(t.exponent),P(t.modulus))},factorize:function(e){let t=function(e){const t=a(e),n=[],r=[];let o=q(t);n.push(t.divide(o)),n.push(o);do{const e=n.pop();if(!e.eq(i().one))if(e.isPrime(!0)){r.push(e);for(let t=0;te.compare(t))),t.length>2&&(t=[t.splice(t.length-2,1)[0],t.reduce(((e,t)=>e.multiply(t)),i().one)]);const n=t[0],r=t[t.length-1];return(n.lesser(r)?[n,r]:[r,n]).map((e=>s(e)))},"mod-pow":u,gzipUncompress:function(e,t){return l().inflate(e,t?{to:"string"}:void 0)},computeSRP:function(e,t,n){return C(this,void 0,void 0,(function*(){const o=n?t.new_algo:t.current_algo,f=a(o.p),c=i()(o.g),u=yield function(e,t,n){return C(this,void 0,void 0,(function*(){let o=yield b.invokeCrypto("sha256",r(t,(new TextEncoder).encode(e),t));o=r(n,o,n),o=yield b.invokeCrypto("sha256",o);let i=yield b.invokeCrypto("pbkdf2",new Uint8Array(o),t,1e5);return i=r(n,i,n),o=yield b.invokeCrypto("sha256",i),o}))}(e,o.salt1,o.salt2),h=i()(function(e){const t=e.length,n=new Array(t);for(let r=0;r{const t=new Uint8Array(e.length);for(let n=0;n{const n=t.subtract(e);return!(n.isNegative()||n.bitLength().toJSNumber()<1984||e.bitLength().toJSNumber()<1984||Math.floor((e.bitLength().toJSNumber()+7)/8)>256)},{a:k,a_for_hash:P,u:x}=yield(()=>C(this,void 0,void 0,(function*(){for(;;){const e=a(y(t.secure_random)),n=c.modPow(e,f);if(A(n,f)){const t=s(n),o=a(yield b.invokeCrypto("sha256",r(t,w)));if(!o.isZero()&&!o.isNegative())return{a:e,a_for_hash:t,u:o}}}})))();let K;K=p.greater(m)?p:p.add(f),K=K.subtract(m).mod(f);const E=x.multiply(h),L=k.add(E),O=K.modPow(L,f),F=yield b.invokeCrypto("sha256",l(s(O),256));let _=yield b.invokeCrypto("sha256",v);_=function(e,t){const n=e.length,r=new Uint8Array(n);for(let o=0;o{for(;;){const t=k(new Uint8Array(e.length)),n=a(t);if(!n.greater(i().one))continue;const r=a(e);if(n.lesser(r.subtract(i().one)))return t}})(t),o=P(n.toString(16)),f=S(yield b.invokeCrypto("mod-pow",o,r,t),256,!0,!0,!0);return{a:r,g_a:f,g_a_hash:yield b.invokeCrypto("sha256",f),p:t}},new((r=void 0)||(r=Promise))((function(e,i){function f(e){try{a(o.next(e))}catch(e){i(e)}}function c(e){try{a(o.throw(e))}catch(e){i(e)}}function a(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(f,c)}a((o=o.apply(t,n||[])).next())}));var t,n,r,o},"compute-dh-key":function(e,t,n){return r=this,o=void 0,s=function*(){const r=yield b.invokeCrypto("mod-pow",e,t,n);var o;return{key:r,key_fingerprint:(o=a((yield b.invokeCrypto("sha1",r)).slice(-8).reverse()),o.greater(c)?o.minus(f):o).toString(10)}},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{c(s.next(e))}catch(e){t(e)}}function f(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var r;t.done?e(t.value):(r=t.value,r instanceof i?r:new i((function(e){e(r)}))).then(n,f)}c((s=s.apply(r,o||[])).next())}));var r,o,i,s},"get-emojis-fingerprint":function(e,t){return n=this,r=void 0,i=function*(){const n=e.concat(t),r=yield b.invokeCrypto("sha256",n),o=[],i=A.length;for(let e=0;e!=r.length;e+=8){const t=m(r.slice(e,e+8)).mod(i).toJSNumber(),n=A[t];o.push(n)}return o},new((o=void 0)||(o=Promise))((function(e,t){function f(e){try{a(i.next(e))}catch(e){t(e)}}function c(e){try{a(i.throw(e))}catch(e){t(e)}}function a(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(f,c)}a((i=i.apply(n,r||[])).next())}));var n,r,o,i},"aes-ctr-prepare":function({encKey:e,encIv:t,decKey:n,decIv:r}){return V(this,void 0,void 0,(function*(){const o=++H,i=[["encrypt",e],["decrypt",n]].map((([e,t])=>D.importKey("raw",t,{name:"AES-CTR"},!1,[e]))),[f,c]=yield Promise.all(i),a={enc:new $("encrypt",f,t.slice()),dec:new $("decrypt",c,r.slice())};return X.set(o,a),o}))},"aes-ctr-process":function({id:e,data:t,operation:n}){return V(this,void 0,void 0,(function*(){const r=X.get(e);return yield("encrypt"===n?r.enc:r.dec).update(t)}))},"aes-ctr-destroy":function(e){X.delete(e)}};b.addMultipleEventsListeners({invoke:({method:e,args:t})=>Y[e](...t),terminate:()=>{d.Z.close()}}),"undefined"!=typeof MessageChannel&&function(e,t,n){const r=(n,r)=>{e.attachListenPort(n),r&&e.attachSendPort(r),null==t||t(n)};e.setOnPortDisconnect(void 0),"undefined"!=typeof SharedWorkerGlobalScope?d.Z.addEventListener("connect",(e=>r(e.source,e.source))):"undefined"!=typeof ServiceWorkerGlobalScope?r(d.Z,null):r(d.Z,d.Z)}(b,(e=>{const t=new MessageChannel;b.attachPort(t.port1),b.invokeVoid("port",void 0,e,[t.port2])}))},5003:(e,t,n)=>{n.d(t,{kg:()=>d});var r,o=n(410),i=n(4762),f=n(1352),c=n(5289);!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(r||(r={}));const a=[r.None,r.Error,r.Warn,r.Log,r.Debug],s=!(i.IS_SAFARI||i.IS_FIREFOX),u="",h="",l=[["debug",r.Debug],["info",r.Log],["warn",r.Warn],["error",r.Error],["assert",r.Error],["trace",r.Log],["group",r.Log],["groupCollapsed",r.Log],["groupEnd",r.Log]];function d(e,t=r.Log|r.Warn|r.Error,n=!1,i=""){let y;o.ZP||n||(t=r.Error),s?i||(f.SU?i=u:f.N5&&(i=h)):i="";const p=i;i=i?`%s ${i}%s`:"%s";const v=function(...n){return t&r.Log&&console.log(i,(0,c.Z)(),e,...n)};return l.forEach((([n,r])=>{v[n]=function(...o){return t&r&&console[n](i,(0,c.Z)(),e,...o)}})),v.setPrefix=function(t){y=t,e="["+t+"]"},v.setPrefix(e),v.setLevel=function(e){t=a.slice(0,e+1).reduce(((e,t)=>e|t),0)},v.bindPrefix=function(e){return d(`${y}] [${e}`,t,n,p)},v}}},r={};function o(e){var t=r[e];if(void 0!==t)return t.exports;var i=r[e]={id:e,loaded:!1,exports:{}};return n[e].call(i.exports,i,i.exports,o),i.loaded=!0,i.exports}o.m=n,o.x=()=>{var e=o.O(void 0,[699,211,85],(()=>o(6991)));return o.O(e)},e=[],o.O=(t,n,r,i)=>{if(!n){var f=1/0;for(u=0;u=i)&&Object.keys(o.O).every((e=>o.O[e](n[a])))?n.splice(a--,1):(c=!1,i0&&e[u-1][2]>i;u--)e[u]=e[u-1];e[u]=[n,r,i]},o.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return o.d(t,{a:t}),t},o.d=(e,t)=>{for(var n in t)o.o(t,n)&&!o.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},o.f={},o.e=e=>Promise.all(Object.keys(o.f).reduce(((t,n)=>(o.f[n](e,t),t)),[])),o.u=e=>85===e?"85.952a9f12a6b3dcdd3f0e.bundle.js":{211:"npm.big-integer",699:"npm.pako"}[e]+"."+{211:"780c206f3e1257ccad6a",699:"85f88e27b023cbb2ca51"}[e]+".chunk.js",o.miniCssF=e=>{},o.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),o.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),o.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;o.g.importScripts&&(e=o.g.location+"");var t=o.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),o.p=e})(),(()=>{if(void 0!==o){var e=o.u,t=o.e,n={},r={};o.u=function(t){return e(t)+(n.hasOwnProperty(t)?"?"+n[t]:"")},o.e=function(i){return t(i).catch((function(t){var f=r.hasOwnProperty(i)?r[i]:999999;if(f<1){var c=e(i);throw t.message="Loading chunk "+i+" failed after 999999 retries.\n("+c+")",t.request=c,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();n[i]=t,r[i]=f-1,e(o.e(i))}),3e3)}))}))}}})(),(()=>{var e={589:1};o.f.i=(t,n)=>{e[t]||importScripts(o.p+o.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],n=t.push.bind(t);t.push=t=>{var[r,i,f]=t;for(var c in i)o.o(i,c)&&(o.m[c]=i[c]);for(f&&f(o);r.length;)e[r.pop()]=1;n(t)}})(),t=o.x,o.x=()=>Promise.all([699,211,85].map(o.e,o)).then(t),o.x()})(); -//# sourceMappingURL=crypto.worker.eebc3997154695b54c25.chunk.js.map \ No newline at end of file +//# sourceMappingURL=crypto.worker.4909ec7e814298d58e2b.chunk.js.map \ No newline at end of file diff --git a/public/crypto.worker.eebc3997154695b54c25.chunk.js.map b/public/crypto.worker.4909ec7e814298d58e2b.chunk.js.map similarity index 99% rename from public/crypto.worker.eebc3997154695b54c25.chunk.js.map rename to public/crypto.worker.4909ec7e814298d58e2b.chunk.js.map index 29ea3cf90..df5e8c9ca 100644 --- a/public/crypto.worker.eebc3997154695b54c25.chunk.js.map +++ b/public/crypto.worker.4909ec7e814298d58e2b.chunk.js.map @@ -1 +1 @@ -{"version":3,"file":"crypto.worker.eebc3997154695b54c25.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/helpers/bytes/bufferConcats.ts","webpack://tweb/./src/lib/polyfill.ts","webpack://tweb/./src/helpers/bigInt/bigIntConstants.ts","webpack://tweb/./src/helpers/bigInt/bigIntConversion.ts","webpack://tweb/./src/helpers/bytes/bytesModPow.ts","webpack://tweb/./src/lib/crypto/cryptoMessagePort.ts","webpack://tweb/./src/lib/calls/helpers/getEmojisFingerprint.ts","webpack://tweb/./src/helpers/array/randomize.ts","webpack://tweb/./src/helpers/bytes/addPadding.ts","webpack://tweb/./src/helpers/bytes/bytesFromHex.ts","webpack://tweb/./src/helpers/bytes/convertToUint8Array.ts","webpack://tweb/./node_modules/@cryptography/aes/dist/es/aes.js","webpack://tweb/./src/helpers/bytes/bytesToWordss.ts","webpack://tweb/./src/lib/crypto/utils/aesIGE.ts","webpack://tweb/./src/helpers/bytes/bytesFromWordss.ts","webpack://tweb/./src/helpers/random.ts","webpack://tweb/./src/helpers/bigInt/bigIntRandom.ts","webpack://tweb/./src/lib/crypto/utils/factorize/BrentPollard.ts","webpack://tweb/./src/lib/crypto/subtle.ts","webpack://tweb/./src/lib/crypto/utils/aesCTR.ts","webpack://tweb/./src/lib/crypto/aesCtrUtils.ts","webpack://tweb/./src/lib/crypto/crypto.worker.ts","webpack://tweb/./src/lib/crypto/utils/sha1.ts","webpack://tweb/./src/lib/crypto/utils/sha256.ts","webpack://tweb/./src/lib/crypto/utils/pbkdf2.ts","webpack://tweb/./src/lib/crypto/utils/rsa.ts","webpack://tweb/./src/helpers/gzipUncompress.ts","webpack://tweb/./src/lib/crypto/srp.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/helpers/bytes/bytesXor.ts","webpack://tweb/./src/lib/crypto/generateDh.ts","webpack://tweb/./src/lib/crypto/computeDhKey.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/node module decorator","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,85].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// в SW может быть сразу две переменных TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n\n let lastLength = 0;\n args.forEach((b) => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bufferConcats from '../helpers/bytes/bufferConcats';\n\nUint8Array.prototype.concat = function(...args: Array) {\n return bufferConcats(this, ...args);\n};\n\n/* Uint8Array.prototype.toString = function() {\n return String.fromCharCode.apply(null, [...this]);\n}; */\n\nUint8Array.prototype.toJSON = function() {\n return [...this];\n // return {type: 'bytes', value: [...this]};\n};\n\nPromise.prototype.finally = Promise.prototype.finally || function(this: Promise, fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n};\n\ndeclare global {\n interface Uint8Array {\n concat: (...args: Array) => Uint8Array,\n // toString: () => string,\n toJSON: () => number[],\n // toJSON: () => {type: 'bytes', value: number[]},\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n }\n}\n","import bigInt from 'big-integer';\n\nexport const safeBigInt = bigInt(Number.MAX_SAFE_INTEGER);\nexport const ulongBigInt = bigInt(bigInt[2]).pow(64);\nexport const longBigInt = ulongBigInt.divide(bigInt[2]);\n","import bigInt from 'big-integer';\nimport { longBigInt, ulongBigInt } from './bigIntConstants';\n\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\n}\n\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\n return new Uint8Array(bigInt.toArray(256).value);\n}\n\nexport function bigIntToSigned(bigInt: bigInt.BigInteger) {\n return bigInt.greater(longBigInt) ? bigInt.minus(ulongBigInt) : bigInt;\n}\n\nexport function bigIntToUnsigned(bigInt: bigInt.BigInteger) {\n return bigInt.isNegative() ? ulongBigInt.add(bigInt) : bigInt;\n}\n","import {bigIntFromBytes, bigIntToBytes} from '../bigInt/bigIntConversion';\n\nexport default function bytesModPow(bytes: number[] | Uint8Array, exp: number[] | Uint8Array, mod: number[] | Uint8Array) {\n const bytesBigInt = bigIntFromBytes(bytes);\n const expBigInt = bigIntFromBytes(exp);\n const modBigInt = bigIntFromBytes(mod);\n const resBigInt = bytesBigInt.modPow(expBigInt, modBigInt);\n return bigIntToBytes(resBigInt);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {CryptoMethods} from './crypto_methods';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {Awaited} from '../../types';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IS_WORKER} from '../../helpers/context';\n\ntype CryptoEvent = {\n invoke: (payload: {method: T, args: Parameters}) => ReturnType,\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n terminate: () => void\n};\n\nexport class CryptoMessagePort extends SuperMessagePort {\n private lastIndex: number;\n\n constructor() {\n super('CRYPTO');\n this.lastIndex = -1;\n }\n\n public invokeCryptoNew({method, args, transfer}: {\n method: T,\n args: Parameters,\n transfer?: Transferable[]\n }): Promise>> {\n const payload = {method, args};\n const listeners = this.listeners['invoke'];\n if(listeners?.length) { // already in worker\n // try {\n // @ts-ignore\n let result: any = listeners[0].callback(payload);\n if(!IS_WORKER && !(result instanceof Promise)) {\n result = Promise.resolve(result);\n }\n\n return result;\n // } catch(err) {\n // return Promise.reject(err);\n // }\n }\n\n const sendPortIndex = method === 'aes-encrypt' || method === 'aes-decrypt' ?\n this.lastIndex = (this.lastIndex + 1) % this.sendPorts.length :\n 0;\n // @ts-ignore\n return this.invoke('invoke', payload, undefined, this.sendPorts[sendPortIndex], transfer);\n }\n\n public invokeCrypto(method: T, ...args: Parameters): Promise>> {\n return this.invokeCryptoNew({method, args});\n }\n}\n\nconst cryptoMessagePort = new CryptoMessagePort();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);\nexport default cryptoMessagePort;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cryptoWorker from '../../crypto/cryptoMessagePort';\nimport bigInt from 'big-integer';\n\nfunction readBigIntFromBytesBE(bytes: Uint8Array) {\n const length = bytes.length;\n const bits = length * 8;\n let value = bigInt(bytes[0]).and(0x7F).shiftLeft(bits - 8);\n for(let i = 1; i < length; ++i) {\n const _bits = bits - (i + 1) * 8;\n const b = bigInt(bytes[i]);\n value = value.or(_bits ? b.shiftLeft(_bits) : b);\n }\n\n return value;\n}\n\n// Emojis were taken from tdlib\nconst emojis = [\n '1f609', '1f60d', '1f61b', '1f62d', '1f631', '1f621', '1f60e',\n '1f634', '1f635', '1f608', '1f62c', '1f607', '1f60f', '1f46e',\n '1f477', '1f482', '1f476', '1f468', '1f469', '1f474', '1f475',\n '1f63b', '1f63d', '1f640', '1f47a', '1f648', '1f649', '1f64a',\n '1f480', '1f47d', '1f4a9', '1f525', '1f4a5', '1f4a4', '1f442',\n '1f440', '1f443', '1f445', '1f444', '1f44d', '1f44e', '1f44c',\n '1f44a', '270c', '270b', '1f450', '1f446', '1f447', '1f449',\n '1f448', '1f64f', '1f44f', '1f4aa', '1f6b6', '1f3c3', '1f483',\n '1f46b', '1f46a', '1f46c', '1f46d', '1f485', '1f3a9', '1f451',\n '1f452', '1f45f', '1f45e', '1f460', '1f455', '1f457', '1f456',\n '1f459', '1f45c', '1f453', '1f380', '1f484', '1f49b', '1f499',\n '1f49c', '1f49a', '1f48d', '1f48e', '1f436', '1f43a', '1f431',\n '1f42d', '1f439', '1f430', '1f438', '1f42f', '1f428', '1f43b',\n '1f437', '1f42e', '1f417', '1f434', '1f411', '1f418', '1f43c',\n '1f427', '1f425', '1f414', '1f40d', '1f422', '1f41b', '1f41d',\n '1f41c', '1f41e', '1f40c', '1f419', '1f41a', '1f41f', '1f42c',\n '1f40b', '1f410', '1f40a', '1f42b', '1f340', '1f339', '1f33b',\n '1f341', '1f33e', '1f344', '1f335', '1f334', '1f333', '1f31e',\n '1f31a', '1f319', '1f30e', '1f30b', '26a1', '2614', '2744', '26c4',\n '1f300', '1f308', '1f30a', '1f393', '1f386', '1f383', '1f47b',\n '1f385', '1f384', '1f381', '1f388', '1f52e', '1f3a5', '1f4f7',\n '1f4bf', '1f4bb', '260e', '1f4e1', '1f4fa', '1f4fb', '1f509',\n '1f514', '23f3', '23f0', '231a', '1f512', '1f511', '1f50e',\n '1f4a1', '1f526', '1f50c', '1f50b', '1f6bf', '1f6bd', '1f527',\n '1f528', '1f6aa', '1f6ac', '1f4a3', '1f52b', '1f52a', '1f48a',\n '1f489', '1f4b0', '1f4b5', '1f4b3', '2709', '1f4eb', '1f4e6',\n '1f4c5', '1f4c1', '2702', '1f4cc', '1f4ce', '2712', '270f',\n '1f4d0', '1f4da', '1f52c', '1f52d', '1f3a8', '1f3ac', '1f3a4',\n '1f3a7', '1f3b5', '1f3b9', '1f3bb', '1f3ba', '1f3b8', '1f47e',\n '1f3ae', '1f0cf', '1f3b2', '1f3af', '1f3c8', '1f3c0', '26bd',\n '26be', '1f3be', '1f3b1', '1f3c9', '1f3b3', '1f3c1', '1f3c7',\n '1f3c6', '1f3ca', '1f3c4', '2615', '1f37c', '1f37a', '1f377',\n '1f374', '1f355', '1f354', '1f35f', '1f357', '1f371', '1f35a',\n '1f35c', '1f361', '1f373', '1f35e', '1f369', '1f366', '1f382',\n '1f370', '1f36a', '1f36b', '1f36d', '1f36f', '1f34e', '1f34f',\n '1f34a', '1f34b', '1f352', '1f347', '1f349', '1f353', '1f351',\n '1f34c', '1f350', '1f34d', '1f346', '1f345', '1f33d', '1f3e1',\n '1f3e5', '1f3e6', '26ea', '1f3f0', '26fa', '1f3ed', '1f5fb',\n '1f5fd', '1f3a0', '1f3a1', '26f2', '1f3a2', '1f6a2', '1f6a4',\n '2693', '1f680', '2708', '1f681', '1f682', '1f68b', '1f68e',\n '1f68c', '1f699', '1f697', '1f695', '1f69b', '1f6a8', '1f694',\n '1f692', '1f691', '1f6b2', '1f6a0', '1f69c', '1f6a6', '26a0',\n '1f6a7', '26fd', '1f3b0', '1f5ff', '1f3aa', '1f3ad',\n '1f1ef-1f1f5', '1f1f0-1f1f7', '1f1e9-1f1ea', '1f1e8-1f1f3',\n '1f1fa-1f1f8', '1f1eb-1f1f7', '1f1ea-1f1f8', '1f1ee-1f1f9',\n '1f1f7-1f1fa', '1f1ec-1f1e7', '0031-20e3', '0032-20e3', '0033-20e3',\n '0034-20e3', '0035-20e3', '0036-20e3', '0037-20e3', '0038-20e3', '0039-20e3',\n '0030-20e3', '1f51f', '2757', '2753', '2665', '2666', '1f4af', '1f517',\n '1f531', '1f534', '1f535', '1f536', '1f537'\n];\n\nexport default async function getEmojisFingerprint(key: Uint8Array, g_a: Uint8Array) {\n const arr = key.concat(g_a);\n const hash = await cryptoWorker.invokeCrypto('sha256', arr);\n\n const result: [string, string, string, string] = [] as any;\n const emojisLength = emojis.length;\n\n const kPartSize = 8;\n for(let partOffset = 0; partOffset != hash.length; partOffset += kPartSize) {\n const bytes = hash.slice(partOffset, partOffset + kPartSize);\n const value = readBigIntFromBytesBE(bytes);\n const index = value.mod(emojisLength).toJSNumber();\n\n // const emoji = emojiFromCodePoints(emojis[index]);\n const codePoints = emojis[index];\n result.push(codePoints);\n }\n\n return result;\n}\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n\n return arr;\n}\n","import randomize from '../array/randomize';\nimport bufferConcats from './bufferConcats';\n\nexport default function addPadding(\n bytes: T,\n blockSize: number = 16,\n zeroes?: boolean,\n blockSizeAsTotalLength = false,\n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n // //console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n randomize(padding);\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","export default function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\n if(bytes instanceof Uint8Array) {\n return bytes;\n } else if(typeof(bytes) === 'string') {\n return new TextEncoder().encode(bytes);\n }\n\n return new Uint8Array(bytes);\n}\n","var S = new Uint8Array(256);\nvar Si = new Uint8Array(256);\nvar T1 = new Uint32Array(256);\nvar T2 = new Uint32Array(256);\nvar T3 = new Uint32Array(256);\nvar T4 = new Uint32Array(256);\nvar T5 = new Uint32Array(256);\nvar T6 = new Uint32Array(256);\nvar T7 = new Uint32Array(256);\nvar T8 = new Uint32Array(256);\nfunction computeTables() {\n var d = new Uint8Array(256);\n var t = new Uint8Array(256);\n var x2;\n var x4;\n var x8;\n var s;\n var tEnc;\n var tDec;\n var x = 0;\n var xInv = 0;\n // Compute double and third tables\n for (var i = 0; i < 256; i++) {\n d[i] = i << 1 ^ (i >> 7) * 283;\n t[d[i] ^ i] = i;\n }\n for (; !S[x]; x ^= x2 || 1) {\n // Compute sbox\n s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;\n s = s >> 8 ^ s & 255 ^ 99;\n S[x] = s;\n Si[s] = x;\n // Compute MixColumns\n x8 = d[x4 = d[x2 = d[x]]];\n tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;\n tEnc = d[s] * 0x101 ^ s * 0x1010100;\n T1[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T2[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T3[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T4[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T5[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T6[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T7[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T8[s] = tDec = tDec << 24 ^ tDec >>> 8;\n xInv = t[xInv] || 1;\n }\n}\n\n/**\n * Gets a uint32 from string in big-endian order order\n */\nfunction s2i(str, pos) {\n return (str.charCodeAt(pos) << 24\n ^ str.charCodeAt(pos + 1) << 16\n ^ str.charCodeAt(pos + 2) << 8\n ^ str.charCodeAt(pos + 3));\n}\n\n/* eslint-disable import/prefer-default-export */\n/**\n * Helper function for transforming string key to Uint32Array\n */\nfunction getWords(key) {\n if (key instanceof Uint32Array) {\n return key;\n }\n if (typeof key === 'string') {\n if (key.length % 4 !== 0)\n for (var i = key.length % 4; i <= 4; i++)\n key += '\\0x00';\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4)\n buf[i / 4] = s2i(key, i);\n return buf;\n }\n if (key instanceof Uint8Array) {\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4) {\n buf[i / 4] = (key[i] << 24\n ^ key[i + 1] << 16\n ^ key[i + 2] << 8\n ^ key[i + 3]);\n }\n return buf;\n }\n throw new Error('Unable to create 32-bit words');\n}\nfunction xor(left, right, to) {\n if (to === void 0) { to = left; }\n for (var i = 0; i < left.length; i++)\n to[i] = left[i] ^ right[i];\n}\n\ncomputeTables();\n/**\n * Low-level AES Cipher\n */\nvar AES = /** @class */ (function () {\n function AES(_key) {\n var key = getWords(_key);\n if (key.length !== 4 && key.length !== 6 && key.length !== 8) {\n throw new Error('Invalid key size');\n }\n this.encKey = new Uint32Array(4 * key.length + 28);\n this.decKey = new Uint32Array(4 * key.length + 28);\n this.encKey.set(key);\n var rcon = 1;\n var i = key.length;\n var tmp;\n // schedule encryption keys\n for (; i < 4 * key.length + 28; i++) {\n tmp = this.encKey[i - 1];\n // apply sbox\n if (i % key.length === 0 || (key.length === 8 && i % key.length === 4)) {\n tmp = S[tmp >>> 24] << 24 ^ S[(tmp >> 16) & 255] << 16 ^ S[(tmp >> 8) & 255] << 8 ^ S[tmp & 255];\n // shift rows and add rcon\n if (i % key.length === 0) {\n tmp = tmp << 8 ^ tmp >>> 24 ^ (rcon << 24);\n rcon = rcon << 1 ^ (rcon >> 7) * 283;\n }\n }\n this.encKey[i] = this.encKey[i - key.length] ^ tmp;\n }\n // schedule decryption keys\n for (var j = 0; i; j++, i--) {\n tmp = this.encKey[j & 3 ? i : i - 4];\n if (i <= 4 || j < 4) {\n this.decKey[j] = tmp;\n }\n else {\n this.decKey[j] = (T5[S[tmp >>> 24]]\n ^ T6[S[(tmp >> 16) & 255]]\n ^ T7[S[(tmp >> 8) & 255]]\n ^ T8[S[tmp & 255]]);\n }\n }\n }\n AES.prototype.encrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.encKey[0];\n var b = message[1] ^ this.encKey[1];\n var c = message[2] ^ this.encKey[2];\n var d = message[3] ^ this.encKey[3];\n var rounds = this.encKey.length / 4 - 2;\n var k = 4;\n var a2;\n var b2;\n var c2;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T1[a >>> 24] ^ T2[(b >> 16) & 255] ^ T3[(c >> 8) & 255] ^ T4[d & 255] ^ this.encKey[k];\n b2 = T1[b >>> 24] ^ T2[(c >> 16) & 255] ^ T3[(d >> 8) & 255] ^ T4[a & 255] ^ this.encKey[k + 1];\n c2 = T1[c >>> 24] ^ T2[(d >> 16) & 255] ^ T3[(a >> 8) & 255] ^ T4[b & 255] ^ this.encKey[k + 2];\n d = T1[d >>> 24] ^ T2[(a >> 16) & 255] ^ T3[(b >> 8) & 255] ^ T4[c & 255] ^ this.encKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n // console.log(a, b, c, d);\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[i] = (S[a >>> 24] << 24\n ^ S[(b >> 16) & 255] << 16\n ^ S[(c >> 8) & 255] << 8\n ^ S[d & 255]\n ^ this.encKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n AES.prototype.decrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.decKey[0];\n var b = message[3] ^ this.decKey[1];\n var c = message[2] ^ this.decKey[2];\n var d = message[1] ^ this.decKey[3];\n var rounds = this.decKey.length / 4 - 2;\n var a2;\n var b2;\n var c2;\n var k = 4;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T5[a >>> 24] ^ T6[(b >> 16) & 255] ^ T7[(c >> 8) & 255] ^ T8[d & 255] ^ this.decKey[k];\n b2 = T5[b >>> 24] ^ T6[(c >> 16) & 255] ^ T7[(d >> 8) & 255] ^ T8[a & 255] ^ this.decKey[k + 1];\n c2 = T5[c >>> 24] ^ T6[(d >> 16) & 255] ^ T7[(a >> 8) & 255] ^ T8[b & 255] ^ this.decKey[k + 2];\n d = T5[d >>> 24] ^ T6[(a >> 16) & 255] ^ T7[(b >> 8) & 255] ^ T8[c & 255] ^ this.decKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[3 & -i] = (Si[a >>> 24] << 24\n ^ Si[(b >> 16) & 255] << 16\n ^ Si[(c >> 8) & 255] << 8\n ^ Si[d & 255]\n ^ this.decKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n return AES;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE = /** @class */ (function () {\n function AES_IGE(key, iv, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.key = getWords(key);\n this.iv = getWords(iv);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var prevX = this.iv.subarray(this.blockSize, this.iv.length);\n var prevY = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = text.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.encrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n cipherText[j] = y[k];\n }\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n var cipherText = getWords(message);\n var text = buf || new Uint32Array(cipherText.length);\n var prevY = this.iv.subarray(this.blockSize, this.iv.length);\n var prevX = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = cipherText.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.decrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n text[j] = y[k];\n }\n return text;\n };\n return AES_IGE;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE$1 = /** @class */ (function () {\n function AES_IGE(key, counter, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.offset = 0;\n this.key = getWords(key);\n this.counter = getWords(counter);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n if (this.counter.length !== 4) {\n throw new Error('AES-CTR mode counter must be 16 bytes length');\n }\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var offset = this.offset;\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = this.cipher.encrypt(this.counter);\n for (var j = i, k = offset; j < text.length && k < this.blockSize; j++, k++)\n cipherText[j] = x[k] ^ text[j];\n if (text.length - i >= this.blockSize)\n this.incrementCounter();\n if (offset) {\n i -= offset;\n offset = 0;\n }\n }\n this.offset = (this.offset + (text.length % 4)) % 4;\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n return this.encrypt(message, buf);\n };\n AES_IGE.prototype.incrementCounter = function () {\n // increment counter\n for (var carry = this.counter.length - 1; carry >= 0; carry--) {\n if (++this.counter[carry] < 0xFFFFFFFF)\n break; // If overflowing, it'll be 0 and we'll have to continue propagating the carry\n }\n };\n return AES_IGE;\n}());\n\nexport default AES;\nexport { AES_IGE$1 as CTR, AES_IGE as IGE };\n","import convertToUint8Array from './convertToUint8Array';\n\nexport default function bytesToWordss(input: Parameters[0]) {\n const bytes = convertToUint8Array(input);\n\n const words: number[] = [];\n for(let i = 0, len = bytes.length; i < len; ++i) {\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\n }\n\n return new Uint32Array(words);\n}\n","import {IGE} from '@cryptography/aes';\nimport addPadding from '../../../helpers/bytes/addPadding';\nimport bytesFromWordss from '../../../helpers/bytes/bytesFromWordss';\nimport bytesToWordss from '../../../helpers/bytes/bytesToWordss';\n\nexport default function aesSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array, encrypt = true) {\n // console.log(dT(), 'AES start', bytes, keyBytes, ivBytes);\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const performedBytes = cipher[encrypt ? 'encrypt' : 'decrypt'](bytesToWordss(bytes));\n // console.log(dT(), 'AES finish');\n\n return bytesFromWordss(performedBytes);\n}\n\nexport function aesEncryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(addPadding(bytes), keyBytes, ivBytes, true);\n}\n\nexport function aesDecryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(bytes, keyBytes, ivBytes, false);\n}\n","export default function bytesFromWordss(input: Uint32Array) {\n const o = new Uint8Array(input.byteLength);\n for(let i = 0, length = input.length * 4; i < length; ++i) {\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\n }\n\n return o;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1)\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","import bigInt from 'big-integer';\nimport {nextRandomUint} from '../random';\n\nexport default function bigIntRandom(min: bigInt.BigNumber, max: bigInt.BigNumber) {\n return bigInt.randBetween(min, max, () => {\n return nextRandomUint(32) / 0xFFFFFFFF;\n /* const bits = 32;\n const randomBytes = new Uint8Array(bits / 8);\n crypto.getRandomValues(randomBytes);\n const r = bigIntFromBytes(randomBytes).mod(bigInt(2).pow(bits));\n return r.toJSNumber(); */\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// Thanks to https://xn--2-umb.com/09/12/brent-pollard-rho-factorisation/\n\nimport bigInt from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../../../helpers/bigInt/bigIntConversion';\nimport bigIntRandom from '../../../../helpers/bigInt/bigIntRandom';\n\n// let test = 0;\nfunction BrentPollardFactor(n: bigInt.BigInteger) {\n const two = bigInt[2];\n if(n.remainder(two).isZero()) {\n return two;\n }\n\n const m = bigInt(1000);\n let a: bigInt.BigInteger,\n x: bigInt.BigInteger,\n y: bigInt.BigInteger,\n ys: bigInt.BigInteger,\n r: bigInt.BigInteger,\n q: bigInt.BigInteger,\n g: bigInt.BigInteger;\n do\n a = bigIntRandom(bigInt.one, n.minus(1));\n while(a.isZero() || a.eq(n.minus(two)));\n y = bigIntRandom(bigInt.one, n.minus(1));\n r = bigInt.one;\n q = bigInt.one;\n\n // if(!test++) {\n // a = bigInt(3);\n // y = bigInt(3);\n // }\n\n const bigIntUint64 = bigInt('FFFFFFFFFFFFFFFF', 16);\n const bigIntUint64MinusPqPlusOne = bigIntUint64.minus(n).plus(1);\n\n const performY = (y: bigInt.BigInteger) => {\n y = y.pow(two).mod(n);\n y = y.add(a);\n if(y.lesser(a)) { // it slows down the script\n y = y.add(bigIntUint64MinusPqPlusOne);\n }\n y = y.mod(n);\n return y;\n };\n\n do {\n x = y;\n for(let i = 0; bigInt(i).lesser(r); ++i) {\n y = performY(y);\n }\n\n let k = bigInt.zero;\n do {\n ys = y;\n const condition = bigInt.min(m, r.minus(k));\n for(let i = 0; bigInt(i).lesser(condition); ++i) {\n y = performY(y);\n q = q.multiply(x.greater(y) ? x.minus(y) : y.minus(x)).mod(n);\n }\n g = bigInt.gcd(q, n);\n k = k.add(m);\n } while(k.lesser(r) && g.eq(bigInt.one));\n\n r = r.shiftLeft(bigInt.one);\n } while(g.eq(bigInt.one));\n\n if(g.eq(n)) {\n do {\n ys = performY(ys);\n g = bigInt.gcd(x.minus(ys).abs(), n);\n } while(g.eq(bigInt.one));\n }\n\n return g;\n}\n\nfunction primeFactors(pqBytes: Uint8Array | number[]) {\n const n = bigIntFromBytes(pqBytes);\n\n const factors: bigInt.BigInteger[] = [];\n const primes: bigInt.BigInteger[] = [];\n\n let factor = BrentPollardFactor(n);\n factors.push(n.divide(factor));\n factors.push(factor);\n\n // return [factor];\n\n do {\n const m = factors.pop();\n\n if(m.eq(bigInt.one))\n continue;\n\n if(m.isPrime(true)) {\n primes.push(m);\n\n // Remove the prime from the other factors\n for(let i = 0; i < factors.length; ++i) {\n let k = factors[i];\n if(k.mod(m).isZero()) {\n do\n k = k.divide(m);\n while(k.mod(m).isZero());\n factors[i] = k;\n }\n }\n } else {\n // factor = m.lesser(100) ? bigInt(PollardRho(m.toJSNumber())) : this.brentPollardFactor(m);\n factor = BrentPollardFactor(m);\n factors.push(m.divide(factor));\n factors.push(factor);\n }\n } while(factors.length);\n\n return primes;\n}\n\nexport default function factorizeBrentPollardPQ(pqBytes: Uint8Array | number[]): [Uint8Array, Uint8Array] {\n let factors = primeFactors(pqBytes);\n factors.sort((a, b) => a.compare(b));\n if(factors.length > 2) {\n factors = [\n factors.splice(factors.length - 2, 1)[0],\n factors.reduce((acc, v) => acc.multiply(v), bigInt.one)\n ];\n }\n\n const p = factors[0], q = factors[factors.length - 1];\n return (p.lesser(q) ? [p, q] : [q, p]).map((b) => bigIntToBytes(b)) as any;\n}\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {BigInteger} from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../../helpers/bigInt/bigIntConversion';\nimport addPadding from '../../../helpers/bytes/addPadding';\nimport subtle from '../subtle';\n\nconst COUNTER_LENGTH = 16;\n\nexport default class CTR {\n private cryptoKey: CryptoKey;\n // private encLeft: Uint8Array;\n private leftLength: number;\n private mode: 'encrypt' | 'decrypt';\n private counter: BigInteger;\n private queue: {data: Uint8Array, resolve: (data: Uint8Array) => void}[];\n private releasing: boolean;\n\n constructor(mode: 'encrypt' | 'decrypt', cryptoKey: CryptoKey, counter: Uint8Array) {\n this.mode = mode;\n this.cryptoKey = cryptoKey;\n this.queue = [];\n this.counter = bigIntFromBytes(counter);\n }\n\n public async update(data: Uint8Array) {\n return new Promise((resolve) => {\n this.queue.push({data, resolve});\n this.release();\n });\n }\n\n private async release() {\n if(this.releasing) {\n return;\n }\n\n this.releasing = true;\n while(this.queue.length) {\n const {data, resolve} = this.queue.shift();\n resolve(await this._update(data));\n }\n this.releasing = false;\n }\n\n private async perform(data: Uint8Array) {\n const arrayBuffer: ArrayBuffer = await subtle[this.mode]({\n name: 'AES-CTR',\n counter: addPadding(bigIntToBytes(this.counter), COUNTER_LENGTH, true, true, true),\n length: 128\n },\n this.cryptoKey,\n data\n );\n\n return arrayBuffer;\n }\n\n private async _update(data: Uint8Array) {\n let toEncrypt = data;\n let head: Uint8Array/* , tail: Uint8Array */;\n if(this.leftLength) {\n // const leftLength = this.encLeft.byteLength;\n const leftLength = this.leftLength;\n const leftLength2 = COUNTER_LENGTH - leftLength;\n // const left = this.encLeft.concat(toEncrypt.slice(0, leftLength2));\n const left = (new Uint8Array(leftLength)).concat(toEncrypt.slice(0, leftLength2));\n\n const performed = await this.perform(left);\n\n head = new Uint8Array(performed.slice(leftLength));\n\n toEncrypt = toEncrypt.slice(leftLength2);\n\n this.counter = this.counter.add(1);\n }\n\n const tail = new Uint8Array(await this.perform(toEncrypt));\n\n const result = head ? head.concat(tail) : tail;\n\n let length = toEncrypt.length;\n const leftAfter = length % COUNTER_LENGTH;\n length -= leftAfter;\n\n const a = length / COUNTER_LENGTH;\n this.counter = this.counter.add(a);\n\n this.leftLength = leftAfter || undefined;\n // this.encLeft = leftAfter ? toEncrypt.slice(-leftAfter) : undefined;\n\n return result;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CTR from './utils/aesCTR';\nimport subtle from './subtle';\n\nconst aesCTRs: Map = new Map();\nlet lastCTRId = -1;\n\ntype K = {\n enc: CTR,\n dec: CTR,\n};\n\nexport async function aesCtrPrepare({encKey, encIv, decKey, decIv}: {[k in 'encKey' | 'encIv' | 'decKey' | 'decIv']: Uint8Array}) {\n const id = ++lastCTRId;\n\n const a = [['encrypt', encKey], ['decrypt', decKey]] as ['encrypt' | 'decrypt', Uint8Array][];\n const promises = a.map(([mode, key]) => {\n return subtle.importKey(\n 'raw',\n key,\n {name: 'AES-CTR'},\n false,\n [mode]\n )\n });\n\n const [encCryptoKey, decCryptoKey] = await Promise.all(promises);\n const enc = new CTR('encrypt', encCryptoKey, encIv.slice());\n const dec = new CTR('decrypt', decCryptoKey, decIv.slice());\n\n const k: K = {\n enc,\n dec\n };\n\n aesCTRs.set(id, k);\n\n return id;\n}\n\nexport async function aesCtrProcess({id, data, operation}: {id: number, data: Uint8Array, operation: 'encrypt' | 'decrypt'}) {\n const ctrs = aesCTRs.get(id);\n const result = await (operation === 'encrypt' ? ctrs.enc : ctrs.dec).update(data);\n return result;\n}\n\nexport function aesCtrDestroy(id: number) {\n aesCTRs.delete(id);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport '../polyfill'; // just to include\n\nimport bytesModPow from '../../helpers/bytes/bytesModPow';\nimport gzipUncompress from '../../helpers/gzipUncompress';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport getEmojisFingerprint from '../calls/helpers/getEmojisFingerprint';\nimport computeDhKey from './computeDhKey';\nimport cryptoMessagePort from './cryptoMessagePort';\nimport {CryptoMethods} from './crypto_methods';\nimport generateDh from './generateDh';\nimport computeSRP from './srp';\nimport {aesEncryptSync, aesDecryptSync} from './utils/aesIGE';\nimport factorizeBrentPollardPQ from './utils/factorize/BrentPollard';\nimport pbkdf2 from './utils/pbkdf2';\nimport rsaEncrypt from './utils/rsa';\nimport sha1 from './utils/sha1';\nimport sha256 from './utils/sha256';\nimport {aesCtrDestroy, aesCtrPrepare, aesCtrProcess} from './aesCtrUtils';\nimport ctx from '../../environment/ctx';\n\nconsole.log('CryptoWorker start');\n\nconst cryptoMethods: CryptoMethods = {\n 'sha1': sha1,\n 'sha256': sha256,\n 'pbkdf2': pbkdf2,\n 'aes-encrypt': aesEncryptSync,\n 'aes-decrypt': aesDecryptSync,\n 'rsa-encrypt': rsaEncrypt,\n 'factorize': factorizeBrentPollardPQ,\n // 'factorize-tdlib': factorizeTdlibPQ,\n // 'factorize-new-new': pqPrimeLeemonNew,\n 'mod-pow': bytesModPow,\n 'gzipUncompress': gzipUncompress,\n 'computeSRP': computeSRP,\n 'generate-dh': generateDh,\n 'compute-dh-key': computeDhKey,\n 'get-emojis-fingerprint': getEmojisFingerprint,\n 'aes-ctr-prepare': aesCtrPrepare,\n 'aes-ctr-process': aesCtrProcess,\n 'aes-ctr-destroy': aesCtrDestroy\n};\n\ncryptoMessagePort.addMultipleEventsListeners({\n invoke: ({method, args}) => {\n // @ts-ignore\n const result: any = cryptoMethods[method](...args);\n return result;\n },\n\n terminate: () => {\n ctx.close();\n }\n});\n\nif(typeof(MessageChannel) !== 'undefined') listenMessagePort(cryptoMessagePort, (source) => {\n const channel = new MessageChannel();\n cryptoMessagePort.attachPort(channel.port1);\n cryptoMessagePort.invokeVoid('port', undefined, source, [channel.port2]);\n});\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha1 from '@cryptography/sha1';\n\nexport default function sha1(bytes: Parameters[0]) {\n return subtle.digest('SHA-1', convertToUint8Array(bytes)).then((b) => {\n return new Uint8Array(b);\n });\n /* //console.trace(dT(), 'SHA-1 hash start', bytes);\n\n const hashBytes: number[] = [];\n\n let hash = sha1(String.fromCharCode.apply(null,\n bytes instanceof Uint8Array ? [...bytes] : [...new Uint8Array(bytes)]));\n for(let i = 0; i < hash.length; ++i) {\n hashBytes.push(hash.charCodeAt(i));\n }\n\n //console.log(dT(), 'SHA-1 hash finish', hashBytes, bytesToHex(hashBytes));\n\n return new Uint8Array(hashBytes); */\n}\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha256 from '@cryptography/sha256';\n\nexport default function sha256(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then((b) => {\n // console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n\n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n","import subtle from '../subtle';\n\nexport default async function pbkdf2(buffer: Parameters[1], salt: HkdfParams['salt'], iterations: number) {\n const importKey = await subtle.importKey(\n 'raw',\n buffer,\n {name: 'PBKDF2'},\n false,\n [/* 'deriveKey', */'deriveBits']\n );\n\n /* await subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'}\n },\n importKey,\n {\n name: 'AES-CTR',\n length: 256\n },\n false,\n ['encrypt', 'decrypt']\n ); */\n\n const bits = subtle.deriveBits({\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'}\n },\n importKey,\n 512\n );\n\n return bits.then((buffer) => new Uint8Array(buffer));\n}\n","import type {RSAPublicKeyHex} from '../../mtproto/rsaKeysManager';\nimport bytesModPow from '../../../helpers/bytes/bytesModPow';\nimport bytesFromHex from '../../../helpers/bytes/bytesFromHex';\n\nexport default function rsaEncrypt(bytes: Uint8Array, publicKey: RSAPublicKeyHex) {\n return bytesModPow(bytes, bytesFromHex(publicKey.exponent), bytesFromHex(publicKey.modulus));\n}\n","// export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n// import dT from './dT';\n\n// export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport default function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n // console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n // console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cryptoWorker from './cryptoMessagePort';\nimport {AccountPassword, InputCheckPasswordSRP, PasswordKdfAlgo} from '../../layer';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\nimport bytesXor from '../../helpers/bytes/bytesXor';\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\nimport bigInt from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../helpers/bigInt/bigIntConversion';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\n\nexport async function makePasswordHash(password: string, client_salt: Uint8Array, server_salt: Uint8Array) {\n // ! look into crypto_methods.test.ts\n let buffer = await cryptoWorker.invokeCrypto('sha256', bufferConcats(client_salt, new TextEncoder().encode(password), client_salt));\n buffer = bufferConcats(server_salt, buffer, server_salt);\n buffer = await cryptoWorker.invokeCrypto('sha256', buffer);\n\n let hash = await cryptoWorker.invokeCrypto('pbkdf2', new Uint8Array(buffer), client_salt, 100000);\n hash = bufferConcats(server_salt, hash, server_salt);\n\n buffer = await cryptoWorker.invokeCrypto('sha256', hash);\n\n return buffer;\n}\n\nexport default async function computeSRP(password: string, state: AccountPassword, isNew: boolean) {\n const algo = (isNew ? state.new_algo : state.current_algo) as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\n\n const p = bigIntFromBytes(algo.p);\n const g = bigInt(algo.g);\n\n /* if(B.compareTo(BigInteger.ZERO) < 0) {\n console.error('srp_B < 0')\n }\n\n if(B.compareTo(p) <= 0) {\n console.error('srp_B <= p');\n } */\n\n /* let check_prime_and_good = (bytes: any, g: number) => {\n let good_prime = 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b';\n\n if(bytesToHex(bytes) === good_prime && [3, 4, 5, 7].indexOf(g) !== -1) {\n return true;\n }\n\n // TO-DO check_prime_and_good_check\n }; */\n\n // check_prime_and_good(algo.p, g);\n\n const pw_hash = await makePasswordHash(password, algo.salt1, algo.salt2);\n const x = bigInt(bytesToHex(pw_hash), 16);\n\n const padArray = function(arr: number[] | Uint8Array, len: number) {\n if(!(arr instanceof Uint8Array)) {\n arr = convertToUint8Array(arr);\n }\n\n return addPadding(arr, len, true, true, true);\n };\n\n const v = g.modPow(x, p);\n\n const flipper = (arr: Uint8Array | number[]) => {\n const out = new Uint8Array(arr.length);\n for(let i = 0; i < arr.length; i += 4) {\n out[i] = arr[i + 3];\n out[i + 1] = arr[i + 2];\n out[i + 2] = arr[i + 1];\n out[i + 3] = arr[i];\n }\n\n return out;\n };\n\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password\n if(isNew) {\n const bytes = bigIntToBytes(v);\n return padArray(/* (isBigEndian ? bytes.reverse() : bytes) */bytes, 256);\n }\n\n const B = bigIntFromBytes(state.srp_B);\n\n const pForHash = padArray(bigIntToBytes(p), 256);\n const gForHash = padArray(bigIntToBytes(g), 256);\n const b_for_hash = padArray(bigIntToBytes(B), 256);\n\n const kHash = await cryptoWorker.invokeCrypto('sha256', bufferConcats(pForHash, gForHash));\n const k = bigIntFromBytes(kHash);\n\n const k_v = k.multiply(v).mod(p);\n\n const is_good_mod_exp_first = (modexp: bigInt.BigInteger, prime: bigInt.BigInteger) => {\n const diff = prime.subtract(modexp);\n const min_diff_bits_count = 2048 - 64;\n const max_mod_exp_size = 256;\n if(diff.isNegative() ||\n diff.bitLength().toJSNumber() < min_diff_bits_count ||\n modexp.bitLength().toJSNumber() < min_diff_bits_count ||\n Math.floor((modexp.bitLength().toJSNumber() + 7) / 8) > max_mod_exp_size)\n return false;\n return true;\n };\n\n const generate_and_check_random = async() => {\n while(true) {\n const a = bigIntFromBytes(flipper(state.secure_random));\n // const a = str2bigInt('9153faef8f2bb6da91f6e5bc96bc00860a530a572a0f45aac0842b4602d711f8bda8d59fb53705e4ae3e31a3c4f0681955425f224297b8e9efd898fec22046debb7ba8a0bcf2be1ada7b100424ea318fdcef6ccfe6d7ab7d978c0eb76a807d4ab200eb767a22de0d828bc53f42c5a35c2df6e6ceeef9a3487aae8e9ef2271f2f6742e83b8211161fb1a0e037491ab2c2c73ad63c8bd1d739de1b523fe8d461270cedcf240de8da75f31be4933576532955041dc5770c18d3e75d0b357df9da4a5c8726d4fced87d15752400883dc57fa1937ac17608c5446c4774dcd123676d683ce3a1ab9f7e020ca52faafc99969822717c8e07ea383d5fb1a007ba0d170cb', 16);\n\n const A = g.modPow(a, p);\n if(is_good_mod_exp_first(A, p)) {\n const a_for_hash = bigIntToBytes(A);\n\n const s = await cryptoWorker.invokeCrypto('sha256', bufferConcats(a_for_hash, b_for_hash));\n // const u = bigInt(s.hex, 16);\n const u = bigIntFromBytes(s);\n if(!u.isZero() && !u.isNegative())\n return {a, a_for_hash, u};\n }\n }\n }\n\n const {a, a_for_hash, u} = await generate_and_check_random();\n\n let g_b: bigInt.BigInteger;\n if(!B.greater(k_v)) {\n g_b = B.add(p);\n } else g_b = B;\n g_b = g_b.subtract(k_v).mod(p);\n\n const ux = u.multiply(x);\n const a_ux = a.add(ux);\n const S = g_b.modPow(a_ux, p);\n\n const K = await cryptoWorker.invokeCrypto('sha256', padArray(bigIntToBytes(S), 256));\n\n let h1 = await cryptoWorker.invokeCrypto('sha256', pForHash);\n const h2 = await cryptoWorker.invokeCrypto('sha256', gForHash);\n h1 = bytesXor(h1, h2);\n\n const buff = bufferConcats(\n h1,\n await cryptoWorker.invokeCrypto('sha256', algo.salt1),\n await cryptoWorker.invokeCrypto('sha256', algo.salt2),\n a_for_hash,\n b_for_hash,\n K\n );\n\n const M1 = await cryptoWorker.invokeCrypto('sha256', buff);\n\n const out: InputCheckPasswordSRP.inputCheckPasswordSRP = {\n _: 'inputCheckPasswordSRP',\n srp_id: state.srp_id,\n A: new Uint8Array(a_for_hash),\n M1\n };\n\n return out;\n}\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\n","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\n const len = bytes1.length;\n const bytes = new Uint8Array(len);\n\n for(let i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bigInt from 'big-integer';\nimport randomize from '../../helpers/array/randomize';\nimport {bigIntFromBytes} from '../../helpers/bigInt/bigIntConversion';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport {MessagesDhConfig} from '../../layer';\nimport CallInstance from '../calls/callInstance';\nimport cryptoWorker from './cryptoMessagePort';\n\nexport default async function generateDh(dhConfig: MessagesDhConfig.messagesDhConfig) {\n const {p, g} = dhConfig;\n\n const generateA = (p: Uint8Array) => {\n for(;;) {\n const a = randomize(new Uint8Array(p.length));\n // const a = new Uint8Array(4).randomize();\n\n const aBigInt = bigIntFromBytes(a); // str2bigInt(bytesToHex(a), 16);\n if(!aBigInt.greater(bigInt.one)) {\n continue;\n }\n\n const pBigInt = bigIntFromBytes(p); // str2bigInt(bytesToHex(p), 16);\n if(!aBigInt.lesser(pBigInt.subtract(bigInt.one))) {\n continue;\n }\n\n return a;\n }\n };\n\n const a = generateA(p);\n // const a = new Uint8Array([0]);\n\n const gBytes = bytesFromHex(g.toString(16));\n const g_a = addPadding(await cryptoWorker.invokeCrypto('mod-pow', gBytes, a, p), 256, true, true, true);\n const g_a_hash = await cryptoWorker.invokeCrypto('sha256', g_a);\n\n const dh: CallInstance['dh'] = {\n a: a,\n g_a: g_a,\n g_a_hash: g_a_hash,\n p\n };\n\n return dh;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {bigIntFromBytes, bigIntToSigned} from '../../helpers/bigInt/bigIntConversion';\nimport cryptoWorker from './cryptoMessagePort';\n\nexport default async function computeDhKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n const key = await cryptoWorker.invokeCrypto('mod-pow', g_b, a, p);\n const keySha1Hashed = await cryptoWorker.invokeCrypto('sha1', key);\n const key_fingerprint = keySha1Hashed.slice(-8).reverse();\n const key_fingerprint_long = bigIntToSigned(bigIntFromBytes(key_fingerprint)).toString(10);\n\n return {key, key_fingerprint: key_fingerprint_long};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type SuperMessagePort from '../lib/mtproto/superMessagePort';\nimport ctx from '../environment/ctx';\n\nexport default function listenMessagePort(\n messagePort: SuperMessagePort,\n onConnect?: (source: MessageEventSource) => void,\n onDisconnect?: (source: MessageEventSource) => void\n) {\n const attachPort = (listenPort: any, sendPort: any) => {\n messagePort.attachListenPort(listenPort);\n sendPort && messagePort.attachSendPort(sendPort);\n onConnect?.(listenPort);\n };\n\n messagePort.setOnPortDisconnect(onDisconnect);\n\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\n attachPort(ctx, null);\n } else {\n attachPort(ctx, ctx);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n underscore: '\\x1b[4m',\n blink: '\\x1b[5m',\n reverse: '\\x1b[7m',\n hidden: '\\x1b[8m',\n // Foreground (text) colors\n fg: {\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m'\n },\n // Background colors\n bg: {\n black: '\\x1b[40m',\n red: '\\x1b[41m',\n green: '\\x1b[42m',\n yellow: '\\x1b[43m',\n blue: '\\x1b[44m',\n magenta: '\\x1b[45m',\n cyan: '\\x1b[46m',\n white: '\\x1b[47m'\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n ['debug', LogTypes.Debug],\n ['info', LogTypes.Log],\n ['warn', LogTypes.Warn],\n ['error', LogTypes.Error],\n ['assert', LogTypes.Error],\n ['trace', LogTypes.Log],\n ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n const originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n // level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,211,85], () => (__webpack_require__(6991)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === 85) return \"85.952a9f12a6b3dcdd3f0e.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + {\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] + \".\" + {\"211\":\"780c206f3e1257ccad6a\",\"699\":\"85f88e27b023cbb2ca51\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t589: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","DEBUG","MOUNT_CLASS_TO","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","postMessage","listener","args","err","console","error","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","type","then","listeners","length","slice","forEach","bind","bufferConcats","reduce","acc","v","byteLength","tmp","Uint8Array","lastLength","b","set","ArrayBuffer","prototype","concat","this","toJSON","Promise","finally","fn","onFinally","callback","resolve","result","reason","reject","Number","MAX_SAFE_INTEGER","pow","longBigInt","divide","bigIntFromBytes","bytes","base","bigIntToBytes","bigInt","toArray","value","bytesModPow","exp","mod","bytesBigInt","expBigInt","modBigInt","modPow","CryptoMessagePort","constructor","super","lastIndex","invokeCryptoNew","method","transfer","payload","sendPortIndex","sendPorts","invoke","undefined","invokeCrypto","cryptoMessagePort","readBigIntFromBytesBE","bits","and","shiftLeft","i","_bits","or","emojis","randomize","arr","crypto","Error","getRandomValues","addPadding","blockSize","zeroes","blockSizeAsTotalLength","prepend","len","needPadding","padding","buffer","bytesFromHex","hexString","Math","ceil","start","parseInt","charAt","substr","convertToUint8Array","TextEncoder","encode","S","Si","T1","Uint32Array","T2","T3","T4","T5","T6","T7","T8","getWords","key","buf","pos","str","charCodeAt","xor","left","right","to","x2","x4","s","tEnc","tDec","d","t","x","xInv","computeTables","AES","_key","encKey","decKey","rcon","j","encrypt","_message","a2","b2","c2","message","out","a","c","rounds","k","decrypt","AES_IGE","iv","cipher","text","cipherText","prevX","subarray","prevY","yXOR","y","bytesToWordss","input","words","aesSync","keyBytes","ivBytes","o","bytesFromWordss","counter","offset","incrementCounter","carry","arrays","Uint16Array","bigIntRandom","min","max","array","nextRandomUint","BrentPollardFactor","n","two","remainder","isZero","m","ys","r","q","g","minus","eq","bigIntUint64MinusPqPlusOne","plus","performY","add","lesser","condition","multiply","greater","abs","subtle","CTR","mode","cryptoKey","queue","update","data","push","release","releasing","shift","_update","perform","name","head","toEncrypt","leftLength","leftLength2","performed","tail","leftAfter","aesCTRs","Map","lastCTRId","log","cryptoMethods","salt","iterations","importKey","hash","publicKey","exponent","modulus","pqBytes","factors","primes","factor","pop","isPrime","primeFactors","sort","compare","splice","p","map","toString","password","state","isNew","algo","new_algo","current_algo","pw_hash","client_salt","server_salt","makePasswordHash","salt1","salt2","Array","join","bytesToHex","padArray","flipper","B","srp_B","pForHash","gForHash","b_for_hash","k_v","is_good_mod_exp_first","modexp","prime","diff","subtract","isNegative","bitLength","toJSNumber","floor","a_for_hash","u","secure_random","A","generate_and_check_random","g_b","ux","a_ux","K","h1","bytes1","bytes2","bytesXor","buff","M1","_","srp_id","dhConfig","aBigInt","pBigInt","generateA","gBytes","g_a","g_a_hash","key_fingerprint","reverse","emojisLength","partOffset","index","codePoints","encIv","decIv","id","promises","encCryptoKey","decCryptoKey","enc","dec","operation","ctrs","get","delete","terminate","ctx","messagePort","onConnect","onDisconnect","attachPort","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","listenMessagePort","e","source","channel","MessageChannel","port1","port2","LogTypes","LOG_LEVELS","None","Warn","Log","Debug","STYLES_SUPPORTED","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","loaded","__webpack_modules__","call","__webpack_exports__","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","Object","keys","every","getter","__esModule","definition","defineProperty","enumerable","f","chunkId","miniCssF","globalThis","Function","obj","prop","hasOwnProperty","nmd","paths","children","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","replace","oldGetScript","oldLoadScript","queryMap","countMap","catch","retries","realSrc","request","setTimeout","cacheBust","Date","now","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"crypto.worker.4909ec7e814298d58e2b.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/helpers/bytes/bufferConcats.ts","webpack://tweb/./src/lib/polyfill.ts","webpack://tweb/./src/helpers/bigInt/bigIntConstants.ts","webpack://tweb/./src/helpers/bigInt/bigIntConversion.ts","webpack://tweb/./src/helpers/bytes/bytesModPow.ts","webpack://tweb/./src/lib/crypto/cryptoMessagePort.ts","webpack://tweb/./src/lib/calls/helpers/getEmojisFingerprint.ts","webpack://tweb/./src/helpers/array/randomize.ts","webpack://tweb/./src/helpers/bytes/addPadding.ts","webpack://tweb/./src/helpers/bytes/bytesFromHex.ts","webpack://tweb/./src/helpers/bytes/convertToUint8Array.ts","webpack://tweb/./node_modules/@cryptography/aes/dist/es/aes.js","webpack://tweb/./src/helpers/bytes/bytesToWordss.ts","webpack://tweb/./src/lib/crypto/utils/aesIGE.ts","webpack://tweb/./src/helpers/bytes/bytesFromWordss.ts","webpack://tweb/./src/helpers/random.ts","webpack://tweb/./src/helpers/bigInt/bigIntRandom.ts","webpack://tweb/./src/lib/crypto/utils/factorize/BrentPollard.ts","webpack://tweb/./src/lib/crypto/subtle.ts","webpack://tweb/./src/lib/crypto/utils/aesCTR.ts","webpack://tweb/./src/lib/crypto/aesCtrUtils.ts","webpack://tweb/./src/lib/crypto/crypto.worker.ts","webpack://tweb/./src/lib/crypto/utils/sha1.ts","webpack://tweb/./src/lib/crypto/utils/sha256.ts","webpack://tweb/./src/lib/crypto/utils/pbkdf2.ts","webpack://tweb/./src/lib/crypto/utils/rsa.ts","webpack://tweb/./src/helpers/gzipUncompress.ts","webpack://tweb/./src/lib/crypto/srp.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/helpers/bytes/bytesXor.ts","webpack://tweb/./src/lib/crypto/generateDh.ts","webpack://tweb/./src/lib/crypto/computeDhKey.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/node module decorator","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,85].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// в SW может быть сразу две переменных TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","export default function bufferConcats(...args: (ArrayBuffer | Uint8Array | number[])[]) {\n const length = args.reduce((acc, v) => acc + ((v as ArrayBuffer).byteLength || (v as Uint8Array).length), 0);\n\n const tmp = new Uint8Array(length);\n\n let lastLength = 0;\n args.forEach((b) => {\n tmp.set(b instanceof ArrayBuffer ? new Uint8Array(b) : b, lastLength);\n lastLength += (b as ArrayBuffer).byteLength || (b as Uint8Array).length;\n });\n\n return tmp/* .buffer */;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bufferConcats from '../helpers/bytes/bufferConcats';\n\nUint8Array.prototype.concat = function(...args: Array) {\n return bufferConcats(this, ...args);\n};\n\n/* Uint8Array.prototype.toString = function() {\n return String.fromCharCode.apply(null, [...this]);\n}; */\n\nUint8Array.prototype.toJSON = function() {\n return [...this];\n // return {type: 'bytes', value: [...this]};\n};\n\nPromise.prototype.finally = Promise.prototype.finally || function(this: Promise, fn: () => any) {\n const onFinally = (callback: typeof fn) => Promise.resolve(fn()).then(callback);\n return this.then(\n result => onFinally(() => result),\n reason => onFinally(() => Promise.reject(reason))\n );\n};\n\ndeclare global {\n interface Uint8Array {\n concat: (...args: Array) => Uint8Array,\n // toString: () => string,\n toJSON: () => number[],\n // toJSON: () => {type: 'bytes', value: number[]},\n }\n\n interface Promise {\n finally: (onfinally?: () => void) => Promise;\n }\n}\n","import bigInt from 'big-integer';\n\nexport const safeBigInt = bigInt(Number.MAX_SAFE_INTEGER);\nexport const ulongBigInt = bigInt(bigInt[2]).pow(64);\nexport const longBigInt = ulongBigInt.divide(bigInt[2]);\n","import bigInt from 'big-integer';\nimport { longBigInt, ulongBigInt } from './bigIntConstants';\n\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\n}\n\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\n return new Uint8Array(bigInt.toArray(256).value);\n}\n\nexport function bigIntToSigned(bigInt: bigInt.BigInteger) {\n return bigInt.greater(longBigInt) ? bigInt.minus(ulongBigInt) : bigInt;\n}\n\nexport function bigIntToUnsigned(bigInt: bigInt.BigInteger) {\n return bigInt.isNegative() ? ulongBigInt.add(bigInt) : bigInt;\n}\n","import {bigIntFromBytes, bigIntToBytes} from '../bigInt/bigIntConversion';\n\nexport default function bytesModPow(bytes: number[] | Uint8Array, exp: number[] | Uint8Array, mod: number[] | Uint8Array) {\n const bytesBigInt = bigIntFromBytes(bytes);\n const expBigInt = bigIntFromBytes(exp);\n const modBigInt = bigIntFromBytes(mod);\n const resBigInt = bytesBigInt.modPow(expBigInt, modBigInt);\n return bigIntToBytes(resBigInt);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {CryptoMethods} from './crypto_methods';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {Awaited} from '../../types';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IS_WORKER} from '../../helpers/context';\n\ntype CryptoEvent = {\n invoke: (payload: {method: T, args: Parameters}) => ReturnType,\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n terminate: () => void\n};\n\nexport class CryptoMessagePort extends SuperMessagePort {\n private lastIndex: number;\n\n constructor() {\n super('CRYPTO');\n this.lastIndex = -1;\n }\n\n public invokeCryptoNew({method, args, transfer}: {\n method: T,\n args: Parameters,\n transfer?: Transferable[]\n }): Promise>> {\n const payload = {method, args};\n const listeners = this.listeners['invoke'];\n if(listeners?.length) { // already in worker\n // try {\n // @ts-ignore\n let result: any = listeners[0].callback(payload);\n if(!IS_WORKER && !(result instanceof Promise)) {\n result = Promise.resolve(result);\n }\n\n return result;\n // } catch(err) {\n // return Promise.reject(err);\n // }\n }\n\n const sendPortIndex = method === 'aes-encrypt' || method === 'aes-decrypt' ?\n this.lastIndex = (this.lastIndex + 1) % this.sendPorts.length :\n 0;\n // @ts-ignore\n return this.invoke('invoke', payload, undefined, this.sendPorts[sendPortIndex], transfer);\n }\n\n public invokeCrypto(method: T, ...args: Parameters): Promise>> {\n return this.invokeCryptoNew({method, args});\n }\n}\n\nconst cryptoMessagePort = new CryptoMessagePort();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.cryptoMessagePort = cryptoMessagePort);\nexport default cryptoMessagePort;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cryptoWorker from '../../crypto/cryptoMessagePort';\nimport bigInt from 'big-integer';\n\nfunction readBigIntFromBytesBE(bytes: Uint8Array) {\n const length = bytes.length;\n const bits = length * 8;\n let value = bigInt(bytes[0]).and(0x7F).shiftLeft(bits - 8);\n for(let i = 1; i < length; ++i) {\n const _bits = bits - (i + 1) * 8;\n const b = bigInt(bytes[i]);\n value = value.or(_bits ? b.shiftLeft(_bits) : b);\n }\n\n return value;\n}\n\n// Emojis were taken from tdlib\nconst emojis = [\n '1f609', '1f60d', '1f61b', '1f62d', '1f631', '1f621', '1f60e',\n '1f634', '1f635', '1f608', '1f62c', '1f607', '1f60f', '1f46e',\n '1f477', '1f482', '1f476', '1f468', '1f469', '1f474', '1f475',\n '1f63b', '1f63d', '1f640', '1f47a', '1f648', '1f649', '1f64a',\n '1f480', '1f47d', '1f4a9', '1f525', '1f4a5', '1f4a4', '1f442',\n '1f440', '1f443', '1f445', '1f444', '1f44d', '1f44e', '1f44c',\n '1f44a', '270c', '270b', '1f450', '1f446', '1f447', '1f449',\n '1f448', '1f64f', '1f44f', '1f4aa', '1f6b6', '1f3c3', '1f483',\n '1f46b', '1f46a', '1f46c', '1f46d', '1f485', '1f3a9', '1f451',\n '1f452', '1f45f', '1f45e', '1f460', '1f455', '1f457', '1f456',\n '1f459', '1f45c', '1f453', '1f380', '1f484', '1f49b', '1f499',\n '1f49c', '1f49a', '1f48d', '1f48e', '1f436', '1f43a', '1f431',\n '1f42d', '1f439', '1f430', '1f438', '1f42f', '1f428', '1f43b',\n '1f437', '1f42e', '1f417', '1f434', '1f411', '1f418', '1f43c',\n '1f427', '1f425', '1f414', '1f40d', '1f422', '1f41b', '1f41d',\n '1f41c', '1f41e', '1f40c', '1f419', '1f41a', '1f41f', '1f42c',\n '1f40b', '1f410', '1f40a', '1f42b', '1f340', '1f339', '1f33b',\n '1f341', '1f33e', '1f344', '1f335', '1f334', '1f333', '1f31e',\n '1f31a', '1f319', '1f30e', '1f30b', '26a1', '2614', '2744', '26c4',\n '1f300', '1f308', '1f30a', '1f393', '1f386', '1f383', '1f47b',\n '1f385', '1f384', '1f381', '1f388', '1f52e', '1f3a5', '1f4f7',\n '1f4bf', '1f4bb', '260e', '1f4e1', '1f4fa', '1f4fb', '1f509',\n '1f514', '23f3', '23f0', '231a', '1f512', '1f511', '1f50e',\n '1f4a1', '1f526', '1f50c', '1f50b', '1f6bf', '1f6bd', '1f527',\n '1f528', '1f6aa', '1f6ac', '1f4a3', '1f52b', '1f52a', '1f48a',\n '1f489', '1f4b0', '1f4b5', '1f4b3', '2709', '1f4eb', '1f4e6',\n '1f4c5', '1f4c1', '2702', '1f4cc', '1f4ce', '2712', '270f',\n '1f4d0', '1f4da', '1f52c', '1f52d', '1f3a8', '1f3ac', '1f3a4',\n '1f3a7', '1f3b5', '1f3b9', '1f3bb', '1f3ba', '1f3b8', '1f47e',\n '1f3ae', '1f0cf', '1f3b2', '1f3af', '1f3c8', '1f3c0', '26bd',\n '26be', '1f3be', '1f3b1', '1f3c9', '1f3b3', '1f3c1', '1f3c7',\n '1f3c6', '1f3ca', '1f3c4', '2615', '1f37c', '1f37a', '1f377',\n '1f374', '1f355', '1f354', '1f35f', '1f357', '1f371', '1f35a',\n '1f35c', '1f361', '1f373', '1f35e', '1f369', '1f366', '1f382',\n '1f370', '1f36a', '1f36b', '1f36d', '1f36f', '1f34e', '1f34f',\n '1f34a', '1f34b', '1f352', '1f347', '1f349', '1f353', '1f351',\n '1f34c', '1f350', '1f34d', '1f346', '1f345', '1f33d', '1f3e1',\n '1f3e5', '1f3e6', '26ea', '1f3f0', '26fa', '1f3ed', '1f5fb',\n '1f5fd', '1f3a0', '1f3a1', '26f2', '1f3a2', '1f6a2', '1f6a4',\n '2693', '1f680', '2708', '1f681', '1f682', '1f68b', '1f68e',\n '1f68c', '1f699', '1f697', '1f695', '1f69b', '1f6a8', '1f694',\n '1f692', '1f691', '1f6b2', '1f6a0', '1f69c', '1f6a6', '26a0',\n '1f6a7', '26fd', '1f3b0', '1f5ff', '1f3aa', '1f3ad',\n '1f1ef-1f1f5', '1f1f0-1f1f7', '1f1e9-1f1ea', '1f1e8-1f1f3',\n '1f1fa-1f1f8', '1f1eb-1f1f7', '1f1ea-1f1f8', '1f1ee-1f1f9',\n '1f1f7-1f1fa', '1f1ec-1f1e7', '0031-20e3', '0032-20e3', '0033-20e3',\n '0034-20e3', '0035-20e3', '0036-20e3', '0037-20e3', '0038-20e3', '0039-20e3',\n '0030-20e3', '1f51f', '2757', '2753', '2665', '2666', '1f4af', '1f517',\n '1f531', '1f534', '1f535', '1f536', '1f537'\n];\n\nexport default async function getEmojisFingerprint(key: Uint8Array, g_a: Uint8Array) {\n const arr = key.concat(g_a);\n const hash = await cryptoWorker.invokeCrypto('sha256', arr);\n\n const result: [string, string, string, string] = [] as any;\n const emojisLength = emojis.length;\n\n const kPartSize = 8;\n for(let partOffset = 0; partOffset != hash.length; partOffset += kPartSize) {\n const bytes = hash.slice(partOffset, partOffset + kPartSize);\n const value = readBigIntFromBytesBE(bytes);\n const index = value.mod(emojisLength).toJSNumber();\n\n // const emoji = emojiFromCodePoints(emojis[index]);\n const codePoints = emojis[index];\n result.push(codePoints);\n }\n\n return result;\n}\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n\n return arr;\n}\n","import randomize from '../array/randomize';\nimport bufferConcats from './bufferConcats';\n\nexport default function addPadding(\n bytes: T,\n blockSize: number = 16,\n zeroes?: boolean,\n blockSizeAsTotalLength = false,\n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n // //console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n randomize(padding);\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","export default function bytesFromHex(hexString: string) {\n const len = hexString.length;\n const bytes = new Uint8Array(Math.ceil(len / 2));\n let start = 0;\n\n if(len % 2) { // read 0x581 as 0x0581\n bytes[start++] = parseInt(hexString.charAt(0), 16);\n }\n\n for(let i = start; i < len; i += 2) {\n bytes[start++] = parseInt(hexString.substr(i, 2), 16);\n }\n\n return bytes;\n}\n","export default function convertToUint8Array(bytes: Uint8Array | ArrayBuffer | number[] | string): Uint8Array {\n if(bytes instanceof Uint8Array) {\n return bytes;\n } else if(typeof(bytes) === 'string') {\n return new TextEncoder().encode(bytes);\n }\n\n return new Uint8Array(bytes);\n}\n","var S = new Uint8Array(256);\nvar Si = new Uint8Array(256);\nvar T1 = new Uint32Array(256);\nvar T2 = new Uint32Array(256);\nvar T3 = new Uint32Array(256);\nvar T4 = new Uint32Array(256);\nvar T5 = new Uint32Array(256);\nvar T6 = new Uint32Array(256);\nvar T7 = new Uint32Array(256);\nvar T8 = new Uint32Array(256);\nfunction computeTables() {\n var d = new Uint8Array(256);\n var t = new Uint8Array(256);\n var x2;\n var x4;\n var x8;\n var s;\n var tEnc;\n var tDec;\n var x = 0;\n var xInv = 0;\n // Compute double and third tables\n for (var i = 0; i < 256; i++) {\n d[i] = i << 1 ^ (i >> 7) * 283;\n t[d[i] ^ i] = i;\n }\n for (; !S[x]; x ^= x2 || 1) {\n // Compute sbox\n s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;\n s = s >> 8 ^ s & 255 ^ 99;\n S[x] = s;\n Si[s] = x;\n // Compute MixColumns\n x8 = d[x4 = d[x2 = d[x]]];\n tDec = x8 * 0x1010101 ^ x4 * 0x10001 ^ x2 * 0x101 ^ x * 0x1010100;\n tEnc = d[s] * 0x101 ^ s * 0x1010100;\n T1[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T2[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T3[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T4[x] = tEnc = tEnc << 24 ^ tEnc >>> 8;\n T5[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T6[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T7[s] = tDec = tDec << 24 ^ tDec >>> 8;\n T8[s] = tDec = tDec << 24 ^ tDec >>> 8;\n xInv = t[xInv] || 1;\n }\n}\n\n/**\n * Gets a uint32 from string in big-endian order order\n */\nfunction s2i(str, pos) {\n return (str.charCodeAt(pos) << 24\n ^ str.charCodeAt(pos + 1) << 16\n ^ str.charCodeAt(pos + 2) << 8\n ^ str.charCodeAt(pos + 3));\n}\n\n/* eslint-disable import/prefer-default-export */\n/**\n * Helper function for transforming string key to Uint32Array\n */\nfunction getWords(key) {\n if (key instanceof Uint32Array) {\n return key;\n }\n if (typeof key === 'string') {\n if (key.length % 4 !== 0)\n for (var i = key.length % 4; i <= 4; i++)\n key += '\\0x00';\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4)\n buf[i / 4] = s2i(key, i);\n return buf;\n }\n if (key instanceof Uint8Array) {\n var buf = new Uint32Array(key.length / 4);\n for (var i = 0; i < key.length; i += 4) {\n buf[i / 4] = (key[i] << 24\n ^ key[i + 1] << 16\n ^ key[i + 2] << 8\n ^ key[i + 3]);\n }\n return buf;\n }\n throw new Error('Unable to create 32-bit words');\n}\nfunction xor(left, right, to) {\n if (to === void 0) { to = left; }\n for (var i = 0; i < left.length; i++)\n to[i] = left[i] ^ right[i];\n}\n\ncomputeTables();\n/**\n * Low-level AES Cipher\n */\nvar AES = /** @class */ (function () {\n function AES(_key) {\n var key = getWords(_key);\n if (key.length !== 4 && key.length !== 6 && key.length !== 8) {\n throw new Error('Invalid key size');\n }\n this.encKey = new Uint32Array(4 * key.length + 28);\n this.decKey = new Uint32Array(4 * key.length + 28);\n this.encKey.set(key);\n var rcon = 1;\n var i = key.length;\n var tmp;\n // schedule encryption keys\n for (; i < 4 * key.length + 28; i++) {\n tmp = this.encKey[i - 1];\n // apply sbox\n if (i % key.length === 0 || (key.length === 8 && i % key.length === 4)) {\n tmp = S[tmp >>> 24] << 24 ^ S[(tmp >> 16) & 255] << 16 ^ S[(tmp >> 8) & 255] << 8 ^ S[tmp & 255];\n // shift rows and add rcon\n if (i % key.length === 0) {\n tmp = tmp << 8 ^ tmp >>> 24 ^ (rcon << 24);\n rcon = rcon << 1 ^ (rcon >> 7) * 283;\n }\n }\n this.encKey[i] = this.encKey[i - key.length] ^ tmp;\n }\n // schedule decryption keys\n for (var j = 0; i; j++, i--) {\n tmp = this.encKey[j & 3 ? i : i - 4];\n if (i <= 4 || j < 4) {\n this.decKey[j] = tmp;\n }\n else {\n this.decKey[j] = (T5[S[tmp >>> 24]]\n ^ T6[S[(tmp >> 16) & 255]]\n ^ T7[S[(tmp >> 8) & 255]]\n ^ T8[S[tmp & 255]]);\n }\n }\n }\n AES.prototype.encrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.encKey[0];\n var b = message[1] ^ this.encKey[1];\n var c = message[2] ^ this.encKey[2];\n var d = message[3] ^ this.encKey[3];\n var rounds = this.encKey.length / 4 - 2;\n var k = 4;\n var a2;\n var b2;\n var c2;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T1[a >>> 24] ^ T2[(b >> 16) & 255] ^ T3[(c >> 8) & 255] ^ T4[d & 255] ^ this.encKey[k];\n b2 = T1[b >>> 24] ^ T2[(c >> 16) & 255] ^ T3[(d >> 8) & 255] ^ T4[a & 255] ^ this.encKey[k + 1];\n c2 = T1[c >>> 24] ^ T2[(d >> 16) & 255] ^ T3[(a >> 8) & 255] ^ T4[b & 255] ^ this.encKey[k + 2];\n d = T1[d >>> 24] ^ T2[(a >> 16) & 255] ^ T3[(b >> 8) & 255] ^ T4[c & 255] ^ this.encKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n // console.log(a, b, c, d);\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[i] = (S[a >>> 24] << 24\n ^ S[(b >> 16) & 255] << 16\n ^ S[(c >> 8) & 255] << 8\n ^ S[d & 255]\n ^ this.encKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n AES.prototype.decrypt = function (_message) {\n var message = getWords(_message);\n var out = new Uint32Array(4);\n var a = message[0] ^ this.decKey[0];\n var b = message[3] ^ this.decKey[1];\n var c = message[2] ^ this.decKey[2];\n var d = message[1] ^ this.decKey[3];\n var rounds = this.decKey.length / 4 - 2;\n var a2;\n var b2;\n var c2;\n var k = 4;\n // Inner rounds. Cribbed from OpenSSL.\n for (var i = 0; i < rounds; i++) {\n a2 = T5[a >>> 24] ^ T6[(b >> 16) & 255] ^ T7[(c >> 8) & 255] ^ T8[d & 255] ^ this.decKey[k];\n b2 = T5[b >>> 24] ^ T6[(c >> 16) & 255] ^ T7[(d >> 8) & 255] ^ T8[a & 255] ^ this.decKey[k + 1];\n c2 = T5[c >>> 24] ^ T6[(d >> 16) & 255] ^ T7[(a >> 8) & 255] ^ T8[b & 255] ^ this.decKey[k + 2];\n d = T5[d >>> 24] ^ T6[(a >> 16) & 255] ^ T7[(b >> 8) & 255] ^ T8[c & 255] ^ this.decKey[k + 3];\n a = a2;\n b = b2;\n c = c2;\n k += 4;\n }\n // Last round.\n for (var i = 0; i < 4; i++) {\n out[3 & -i] = (Si[a >>> 24] << 24\n ^ Si[(b >> 16) & 255] << 16\n ^ Si[(c >> 8) & 255] << 8\n ^ Si[d & 255]\n ^ this.decKey[k++]);\n a2 = a;\n a = b;\n b = c;\n c = d;\n d = a2;\n }\n return out;\n };\n return AES;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE = /** @class */ (function () {\n function AES_IGE(key, iv, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.key = getWords(key);\n this.iv = getWords(iv);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var prevX = this.iv.subarray(this.blockSize, this.iv.length);\n var prevY = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = text.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.encrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n cipherText[j] = y[k];\n }\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n var cipherText = getWords(message);\n var text = buf || new Uint32Array(cipherText.length);\n var prevY = this.iv.subarray(this.blockSize, this.iv.length);\n var prevX = this.iv.subarray(0, this.blockSize);\n var yXOR = new Uint32Array(this.blockSize);\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = cipherText.subarray(i, i + this.blockSize);\n xor(x, prevY, yXOR);\n var y = this.cipher.decrypt(yXOR);\n xor(y, prevX);\n prevX = x;\n prevY = y;\n for (var j = i, k = 0; j < text.length && k < 4; j++, k++)\n text[j] = y[k];\n }\n return text;\n };\n return AES_IGE;\n}());\n\n/**\n * AES-IGE mode.\n */\nvar AES_IGE$1 = /** @class */ (function () {\n function AES_IGE(key, counter, blockSize) {\n if (blockSize === void 0) { blockSize = 16; }\n this.offset = 0;\n this.key = getWords(key);\n this.counter = getWords(counter);\n this.cipher = new AES(key);\n this.blockSize = blockSize / 4;\n if (this.counter.length !== 4) {\n throw new Error('AES-CTR mode counter must be 16 bytes length');\n }\n }\n /**\n * Encrypts plain text with AES-IGE mode.\n */\n AES_IGE.prototype.encrypt = function (message, buf) {\n var text = getWords(message);\n var cipherText = buf || new Uint32Array(text.length);\n var offset = this.offset;\n for (var i = 0; i < text.length; i += this.blockSize) {\n var x = this.cipher.encrypt(this.counter);\n for (var j = i, k = offset; j < text.length && k < this.blockSize; j++, k++)\n cipherText[j] = x[k] ^ text[j];\n if (text.length - i >= this.blockSize)\n this.incrementCounter();\n if (offset) {\n i -= offset;\n offset = 0;\n }\n }\n this.offset = (this.offset + (text.length % 4)) % 4;\n return cipherText;\n };\n /**\n * Decrypts cipher text with AES-IGE mode.\n */\n AES_IGE.prototype.decrypt = function (message, buf) {\n return this.encrypt(message, buf);\n };\n AES_IGE.prototype.incrementCounter = function () {\n // increment counter\n for (var carry = this.counter.length - 1; carry >= 0; carry--) {\n if (++this.counter[carry] < 0xFFFFFFFF)\n break; // If overflowing, it'll be 0 and we'll have to continue propagating the carry\n }\n };\n return AES_IGE;\n}());\n\nexport default AES;\nexport { AES_IGE$1 as CTR, AES_IGE as IGE };\n","import convertToUint8Array from './convertToUint8Array';\n\nexport default function bytesToWordss(input: Parameters[0]) {\n const bytes = convertToUint8Array(input);\n\n const words: number[] = [];\n for(let i = 0, len = bytes.length; i < len; ++i) {\n words[i >>> 2] |= bytes[i] << (24 - (i % 4) * 8);\n }\n\n return new Uint32Array(words);\n}\n","import {IGE} from '@cryptography/aes';\nimport addPadding from '../../../helpers/bytes/addPadding';\nimport bytesFromWordss from '../../../helpers/bytes/bytesFromWordss';\nimport bytesToWordss from '../../../helpers/bytes/bytesToWordss';\n\nexport default function aesSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array, encrypt = true) {\n // console.log(dT(), 'AES start', bytes, keyBytes, ivBytes);\n\n const cipher = new IGE(bytesToWordss(keyBytes), bytesToWordss(ivBytes));\n const performedBytes = cipher[encrypt ? 'encrypt' : 'decrypt'](bytesToWordss(bytes));\n // console.log(dT(), 'AES finish');\n\n return bytesFromWordss(performedBytes);\n}\n\nexport function aesEncryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(addPadding(bytes), keyBytes, ivBytes, true);\n}\n\nexport function aesDecryptSync(bytes: Uint8Array, keyBytes: Uint8Array, ivBytes: Uint8Array) {\n return aesSync(bytes, keyBytes, ivBytes, false);\n}\n","export default function bytesFromWordss(input: Uint32Array) {\n const o = new Uint8Array(input.byteLength);\n for(let i = 0, length = input.length * 4; i < length; ++i) {\n o[i] = ((input[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff);\n }\n\n return o;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nconst arrays = {\n 8: new Uint8Array(1),\n 16: new Uint16Array(1),\n 32: new Uint32Array(1)\n};\nexport function nextRandomUint(bits: 8 | 16 | 32) {\n const array = arrays[bits];\n crypto.getRandomValues(array);\n return array[0];\n}\n\nexport function randomLong() {\n return '' + nextRandomUint(32) + nextRandomUint(32) % 0xFFFFFF;\n}\n","import bigInt from 'big-integer';\nimport {nextRandomUint} from '../random';\n\nexport default function bigIntRandom(min: bigInt.BigNumber, max: bigInt.BigNumber) {\n return bigInt.randBetween(min, max, () => {\n return nextRandomUint(32) / 0xFFFFFFFF;\n /* const bits = 32;\n const randomBytes = new Uint8Array(bits / 8);\n crypto.getRandomValues(randomBytes);\n const r = bigIntFromBytes(randomBytes).mod(bigInt(2).pow(bits));\n return r.toJSNumber(); */\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// Thanks to https://xn--2-umb.com/09/12/brent-pollard-rho-factorisation/\n\nimport bigInt from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../../../helpers/bigInt/bigIntConversion';\nimport bigIntRandom from '../../../../helpers/bigInt/bigIntRandom';\n\n// let test = 0;\nfunction BrentPollardFactor(n: bigInt.BigInteger) {\n const two = bigInt[2];\n if(n.remainder(two).isZero()) {\n return two;\n }\n\n const m = bigInt(1000);\n let a: bigInt.BigInteger,\n x: bigInt.BigInteger,\n y: bigInt.BigInteger,\n ys: bigInt.BigInteger,\n r: bigInt.BigInteger,\n q: bigInt.BigInteger,\n g: bigInt.BigInteger;\n do\n a = bigIntRandom(bigInt.one, n.minus(1));\n while(a.isZero() || a.eq(n.minus(two)));\n y = bigIntRandom(bigInt.one, n.minus(1));\n r = bigInt.one;\n q = bigInt.one;\n\n // if(!test++) {\n // a = bigInt(3);\n // y = bigInt(3);\n // }\n\n const bigIntUint64 = bigInt('FFFFFFFFFFFFFFFF', 16);\n const bigIntUint64MinusPqPlusOne = bigIntUint64.minus(n).plus(1);\n\n const performY = (y: bigInt.BigInteger) => {\n y = y.pow(two).mod(n);\n y = y.add(a);\n if(y.lesser(a)) { // it slows down the script\n y = y.add(bigIntUint64MinusPqPlusOne);\n }\n y = y.mod(n);\n return y;\n };\n\n do {\n x = y;\n for(let i = 0; bigInt(i).lesser(r); ++i) {\n y = performY(y);\n }\n\n let k = bigInt.zero;\n do {\n ys = y;\n const condition = bigInt.min(m, r.minus(k));\n for(let i = 0; bigInt(i).lesser(condition); ++i) {\n y = performY(y);\n q = q.multiply(x.greater(y) ? x.minus(y) : y.minus(x)).mod(n);\n }\n g = bigInt.gcd(q, n);\n k = k.add(m);\n } while(k.lesser(r) && g.eq(bigInt.one));\n\n r = r.shiftLeft(bigInt.one);\n } while(g.eq(bigInt.one));\n\n if(g.eq(n)) {\n do {\n ys = performY(ys);\n g = bigInt.gcd(x.minus(ys).abs(), n);\n } while(g.eq(bigInt.one));\n }\n\n return g;\n}\n\nfunction primeFactors(pqBytes: Uint8Array | number[]) {\n const n = bigIntFromBytes(pqBytes);\n\n const factors: bigInt.BigInteger[] = [];\n const primes: bigInt.BigInteger[] = [];\n\n let factor = BrentPollardFactor(n);\n factors.push(n.divide(factor));\n factors.push(factor);\n\n // return [factor];\n\n do {\n const m = factors.pop();\n\n if(m.eq(bigInt.one))\n continue;\n\n if(m.isPrime(true)) {\n primes.push(m);\n\n // Remove the prime from the other factors\n for(let i = 0; i < factors.length; ++i) {\n let k = factors[i];\n if(k.mod(m).isZero()) {\n do\n k = k.divide(m);\n while(k.mod(m).isZero());\n factors[i] = k;\n }\n }\n } else {\n // factor = m.lesser(100) ? bigInt(PollardRho(m.toJSNumber())) : this.brentPollardFactor(m);\n factor = BrentPollardFactor(m);\n factors.push(m.divide(factor));\n factors.push(factor);\n }\n } while(factors.length);\n\n return primes;\n}\n\nexport default function factorizeBrentPollardPQ(pqBytes: Uint8Array | number[]): [Uint8Array, Uint8Array] {\n let factors = primeFactors(pqBytes);\n factors.sort((a, b) => a.compare(b));\n if(factors.length > 2) {\n factors = [\n factors.splice(factors.length - 2, 1)[0],\n factors.reduce((acc, v) => acc.multiply(v), bigInt.one)\n ];\n }\n\n const p = factors[0], q = factors[factors.length - 1];\n return (p.lesser(q) ? [p, q] : [q, p]).map((b) => bigIntToBytes(b)) as any;\n}\n","const subtle = typeof(window) !== 'undefined' && 'crypto' in window ? window.crypto.subtle : self.crypto.subtle;\n\nexport default subtle;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {BigInteger} from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../../helpers/bigInt/bigIntConversion';\nimport addPadding from '../../../helpers/bytes/addPadding';\nimport subtle from '../subtle';\n\nconst COUNTER_LENGTH = 16;\n\nexport default class CTR {\n private cryptoKey: CryptoKey;\n // private encLeft: Uint8Array;\n private leftLength: number;\n private mode: 'encrypt' | 'decrypt';\n private counter: BigInteger;\n private queue: {data: Uint8Array, resolve: (data: Uint8Array) => void}[];\n private releasing: boolean;\n\n constructor(mode: 'encrypt' | 'decrypt', cryptoKey: CryptoKey, counter: Uint8Array) {\n this.mode = mode;\n this.cryptoKey = cryptoKey;\n this.queue = [];\n this.counter = bigIntFromBytes(counter);\n }\n\n public async update(data: Uint8Array) {\n return new Promise((resolve) => {\n this.queue.push({data, resolve});\n this.release();\n });\n }\n\n private async release() {\n if(this.releasing) {\n return;\n }\n\n this.releasing = true;\n while(this.queue.length) {\n const {data, resolve} = this.queue.shift();\n resolve(await this._update(data));\n }\n this.releasing = false;\n }\n\n private async perform(data: Uint8Array) {\n const arrayBuffer: ArrayBuffer = await subtle[this.mode]({\n name: 'AES-CTR',\n counter: addPadding(bigIntToBytes(this.counter), COUNTER_LENGTH, true, true, true),\n length: 128\n },\n this.cryptoKey,\n data\n );\n\n return arrayBuffer;\n }\n\n private async _update(data: Uint8Array) {\n let toEncrypt = data;\n let head: Uint8Array/* , tail: Uint8Array */;\n if(this.leftLength) {\n // const leftLength = this.encLeft.byteLength;\n const leftLength = this.leftLength;\n const leftLength2 = COUNTER_LENGTH - leftLength;\n // const left = this.encLeft.concat(toEncrypt.slice(0, leftLength2));\n const left = (new Uint8Array(leftLength)).concat(toEncrypt.slice(0, leftLength2));\n\n const performed = await this.perform(left);\n\n head = new Uint8Array(performed.slice(leftLength));\n\n toEncrypt = toEncrypt.slice(leftLength2);\n\n this.counter = this.counter.add(1);\n }\n\n const tail = new Uint8Array(await this.perform(toEncrypt));\n\n const result = head ? head.concat(tail) : tail;\n\n let length = toEncrypt.length;\n const leftAfter = length % COUNTER_LENGTH;\n length -= leftAfter;\n\n const a = length / COUNTER_LENGTH;\n this.counter = this.counter.add(a);\n\n this.leftLength = leftAfter || undefined;\n // this.encLeft = leftAfter ? toEncrypt.slice(-leftAfter) : undefined;\n\n return result;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport CTR from './utils/aesCTR';\nimport subtle from './subtle';\n\nconst aesCTRs: Map = new Map();\nlet lastCTRId = -1;\n\ntype K = {\n enc: CTR,\n dec: CTR,\n};\n\nexport async function aesCtrPrepare({encKey, encIv, decKey, decIv}: {[k in 'encKey' | 'encIv' | 'decKey' | 'decIv']: Uint8Array}) {\n const id = ++lastCTRId;\n\n const a = [['encrypt', encKey], ['decrypt', decKey]] as ['encrypt' | 'decrypt', Uint8Array][];\n const promises = a.map(([mode, key]) => {\n return subtle.importKey(\n 'raw',\n key,\n {name: 'AES-CTR'},\n false,\n [mode]\n )\n });\n\n const [encCryptoKey, decCryptoKey] = await Promise.all(promises);\n const enc = new CTR('encrypt', encCryptoKey, encIv.slice());\n const dec = new CTR('decrypt', decCryptoKey, decIv.slice());\n\n const k: K = {\n enc,\n dec\n };\n\n aesCTRs.set(id, k);\n\n return id;\n}\n\nexport async function aesCtrProcess({id, data, operation}: {id: number, data: Uint8Array, operation: 'encrypt' | 'decrypt'}) {\n const ctrs = aesCTRs.get(id);\n const result = await (operation === 'encrypt' ? ctrs.enc : ctrs.dec).update(data);\n return result;\n}\n\nexport function aesCtrDestroy(id: number) {\n aesCTRs.delete(id);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport '../polyfill'; // just to include\n\nimport bytesModPow from '../../helpers/bytes/bytesModPow';\nimport gzipUncompress from '../../helpers/gzipUncompress';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport getEmojisFingerprint from '../calls/helpers/getEmojisFingerprint';\nimport computeDhKey from './computeDhKey';\nimport cryptoMessagePort from './cryptoMessagePort';\nimport {CryptoMethods} from './crypto_methods';\nimport generateDh from './generateDh';\nimport computeSRP from './srp';\nimport {aesEncryptSync, aesDecryptSync} from './utils/aesIGE';\nimport factorizeBrentPollardPQ from './utils/factorize/BrentPollard';\nimport pbkdf2 from './utils/pbkdf2';\nimport rsaEncrypt from './utils/rsa';\nimport sha1 from './utils/sha1';\nimport sha256 from './utils/sha256';\nimport {aesCtrDestroy, aesCtrPrepare, aesCtrProcess} from './aesCtrUtils';\nimport ctx from '../../environment/ctx';\n\nconsole.log('CryptoWorker start');\n\nconst cryptoMethods: CryptoMethods = {\n 'sha1': sha1,\n 'sha256': sha256,\n 'pbkdf2': pbkdf2,\n 'aes-encrypt': aesEncryptSync,\n 'aes-decrypt': aesDecryptSync,\n 'rsa-encrypt': rsaEncrypt,\n 'factorize': factorizeBrentPollardPQ,\n // 'factorize-tdlib': factorizeTdlibPQ,\n // 'factorize-new-new': pqPrimeLeemonNew,\n 'mod-pow': bytesModPow,\n 'gzipUncompress': gzipUncompress,\n 'computeSRP': computeSRP,\n 'generate-dh': generateDh,\n 'compute-dh-key': computeDhKey,\n 'get-emojis-fingerprint': getEmojisFingerprint,\n 'aes-ctr-prepare': aesCtrPrepare,\n 'aes-ctr-process': aesCtrProcess,\n 'aes-ctr-destroy': aesCtrDestroy\n};\n\ncryptoMessagePort.addMultipleEventsListeners({\n invoke: ({method, args}) => {\n // @ts-ignore\n const result: any = cryptoMethods[method](...args);\n return result;\n },\n\n terminate: () => {\n ctx.close();\n }\n});\n\nif(typeof(MessageChannel) !== 'undefined') listenMessagePort(cryptoMessagePort, (source) => {\n const channel = new MessageChannel();\n cryptoMessagePort.attachPort(channel.port1);\n cryptoMessagePort.invokeVoid('port', undefined, source, [channel.port2]);\n});\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha1 from '@cryptography/sha1';\n\nexport default function sha1(bytes: Parameters[0]) {\n return subtle.digest('SHA-1', convertToUint8Array(bytes)).then((b) => {\n return new Uint8Array(b);\n });\n /* //console.trace(dT(), 'SHA-1 hash start', bytes);\n\n const hashBytes: number[] = [];\n\n let hash = sha1(String.fromCharCode.apply(null,\n bytes instanceof Uint8Array ? [...bytes] : [...new Uint8Array(bytes)]));\n for(let i = 0; i < hash.length; ++i) {\n hashBytes.push(hash.charCodeAt(i));\n }\n\n //console.log(dT(), 'SHA-1 hash finish', hashBytes, bytesToHex(hashBytes));\n\n return new Uint8Array(hashBytes); */\n}\n","import convertToUint8Array from '../../../helpers/bytes/convertToUint8Array';\nimport subtle from '../subtle';\n// import sha256 from '@cryptography/sha256';\n\nexport default function sha256(bytes: Parameters[0]) {\n return subtle.digest('SHA-256', convertToUint8Array(bytes)).then((b) => {\n // console.log('legacy', performance.now() - perfS);\n return new Uint8Array(b);\n });\n /* //console.log('SHA-256 hash start');\n\n let perfS = performance.now();\n\n\n let perfD = performance.now();\n let words = typeof(bytes) === 'string' ? bytes : bytesToWordss(bytes as any);\n let hash = sha256(words);\n console.log('darutkin', performance.now() - perfD);\n\n //console.log('SHA-256 hash finish', hash, sha256(words, 'hex'));\n\n return bytesFromWordss(hash); */\n}\n","import subtle from '../subtle';\n\nexport default async function pbkdf2(buffer: Parameters[1], salt: HkdfParams['salt'], iterations: number) {\n const importKey = await subtle.importKey(\n 'raw',\n buffer,\n {name: 'PBKDF2'},\n false,\n [/* 'deriveKey', */'deriveBits']\n );\n\n /* await subtle.deriveKey(\n {\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'}\n },\n importKey,\n {\n name: 'AES-CTR',\n length: 256\n },\n false,\n ['encrypt', 'decrypt']\n ); */\n\n const bits = subtle.deriveBits({\n name: 'PBKDF2',\n salt,\n iterations,\n hash: {name: 'SHA-512'}\n },\n importKey,\n 512\n );\n\n return bits.then((buffer) => new Uint8Array(buffer));\n}\n","import type {RSAPublicKeyHex} from '../../mtproto/rsaKeysManager';\nimport bytesModPow from '../../../helpers/bytes/bytesModPow';\nimport bytesFromHex from '../../../helpers/bytes/bytesFromHex';\n\nexport default function rsaEncrypt(bytes: Uint8Array, publicKey: RSAPublicKeyHex) {\n return bytesModPow(bytes, bytesFromHex(publicKey.exponent), bytesFromHex(publicKey.modulus));\n}\n","// export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n// import dT from './dT';\n\n// export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport default function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n // console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n // console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport cryptoWorker from './cryptoMessagePort';\nimport {AccountPassword, InputCheckPasswordSRP, PasswordKdfAlgo} from '../../layer';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\nimport bytesXor from '../../helpers/bytes/bytesXor';\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\nimport bigInt from 'big-integer';\nimport {bigIntFromBytes, bigIntToBytes} from '../../helpers/bigInt/bigIntConversion';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\n\nexport async function makePasswordHash(password: string, client_salt: Uint8Array, server_salt: Uint8Array) {\n // ! look into crypto_methods.test.ts\n let buffer = await cryptoWorker.invokeCrypto('sha256', bufferConcats(client_salt, new TextEncoder().encode(password), client_salt));\n buffer = bufferConcats(server_salt, buffer, server_salt);\n buffer = await cryptoWorker.invokeCrypto('sha256', buffer);\n\n let hash = await cryptoWorker.invokeCrypto('pbkdf2', new Uint8Array(buffer), client_salt, 100000);\n hash = bufferConcats(server_salt, hash, server_salt);\n\n buffer = await cryptoWorker.invokeCrypto('sha256', hash);\n\n return buffer;\n}\n\nexport default async function computeSRP(password: string, state: AccountPassword, isNew: boolean) {\n const algo = (isNew ? state.new_algo : state.current_algo) as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\n\n const p = bigIntFromBytes(algo.p);\n const g = bigInt(algo.g);\n\n /* if(B.compareTo(BigInteger.ZERO) < 0) {\n console.error('srp_B < 0')\n }\n\n if(B.compareTo(p) <= 0) {\n console.error('srp_B <= p');\n } */\n\n /* let check_prime_and_good = (bytes: any, g: number) => {\n let good_prime = 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b';\n\n if(bytesToHex(bytes) === good_prime && [3, 4, 5, 7].indexOf(g) !== -1) {\n return true;\n }\n\n // TO-DO check_prime_and_good_check\n }; */\n\n // check_prime_and_good(algo.p, g);\n\n const pw_hash = await makePasswordHash(password, algo.salt1, algo.salt2);\n const x = bigInt(bytesToHex(pw_hash), 16);\n\n const padArray = function(arr: number[] | Uint8Array, len: number) {\n if(!(arr instanceof Uint8Array)) {\n arr = convertToUint8Array(arr);\n }\n\n return addPadding(arr, len, true, true, true);\n };\n\n const v = g.modPow(x, p);\n\n const flipper = (arr: Uint8Array | number[]) => {\n const out = new Uint8Array(arr.length);\n for(let i = 0; i < arr.length; i += 4) {\n out[i] = arr[i + 3];\n out[i + 1] = arr[i + 2];\n out[i + 2] = arr[i + 1];\n out[i + 3] = arr[i];\n }\n\n return out;\n };\n\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password\n if(isNew) {\n const bytes = bigIntToBytes(v);\n return padArray(/* (isBigEndian ? bytes.reverse() : bytes) */bytes, 256);\n }\n\n const B = bigIntFromBytes(state.srp_B);\n\n const pForHash = padArray(bigIntToBytes(p), 256);\n const gForHash = padArray(bigIntToBytes(g), 256);\n const b_for_hash = padArray(bigIntToBytes(B), 256);\n\n const kHash = await cryptoWorker.invokeCrypto('sha256', bufferConcats(pForHash, gForHash));\n const k = bigIntFromBytes(kHash);\n\n const k_v = k.multiply(v).mod(p);\n\n const is_good_mod_exp_first = (modexp: bigInt.BigInteger, prime: bigInt.BigInteger) => {\n const diff = prime.subtract(modexp);\n const min_diff_bits_count = 2048 - 64;\n const max_mod_exp_size = 256;\n if(diff.isNegative() ||\n diff.bitLength().toJSNumber() < min_diff_bits_count ||\n modexp.bitLength().toJSNumber() < min_diff_bits_count ||\n Math.floor((modexp.bitLength().toJSNumber() + 7) / 8) > max_mod_exp_size)\n return false;\n return true;\n };\n\n const generate_and_check_random = async() => {\n while(true) {\n const a = bigIntFromBytes(flipper(state.secure_random));\n // const a = str2bigInt('9153faef8f2bb6da91f6e5bc96bc00860a530a572a0f45aac0842b4602d711f8bda8d59fb53705e4ae3e31a3c4f0681955425f224297b8e9efd898fec22046debb7ba8a0bcf2be1ada7b100424ea318fdcef6ccfe6d7ab7d978c0eb76a807d4ab200eb767a22de0d828bc53f42c5a35c2df6e6ceeef9a3487aae8e9ef2271f2f6742e83b8211161fb1a0e037491ab2c2c73ad63c8bd1d739de1b523fe8d461270cedcf240de8da75f31be4933576532955041dc5770c18d3e75d0b357df9da4a5c8726d4fced87d15752400883dc57fa1937ac17608c5446c4774dcd123676d683ce3a1ab9f7e020ca52faafc99969822717c8e07ea383d5fb1a007ba0d170cb', 16);\n\n const A = g.modPow(a, p);\n if(is_good_mod_exp_first(A, p)) {\n const a_for_hash = bigIntToBytes(A);\n\n const s = await cryptoWorker.invokeCrypto('sha256', bufferConcats(a_for_hash, b_for_hash));\n // const u = bigInt(s.hex, 16);\n const u = bigIntFromBytes(s);\n if(!u.isZero() && !u.isNegative())\n return {a, a_for_hash, u};\n }\n }\n }\n\n const {a, a_for_hash, u} = await generate_and_check_random();\n\n let g_b: bigInt.BigInteger;\n if(!B.greater(k_v)) {\n g_b = B.add(p);\n } else g_b = B;\n g_b = g_b.subtract(k_v).mod(p);\n\n const ux = u.multiply(x);\n const a_ux = a.add(ux);\n const S = g_b.modPow(a_ux, p);\n\n const K = await cryptoWorker.invokeCrypto('sha256', padArray(bigIntToBytes(S), 256));\n\n let h1 = await cryptoWorker.invokeCrypto('sha256', pForHash);\n const h2 = await cryptoWorker.invokeCrypto('sha256', gForHash);\n h1 = bytesXor(h1, h2);\n\n const buff = bufferConcats(\n h1,\n await cryptoWorker.invokeCrypto('sha256', algo.salt1),\n await cryptoWorker.invokeCrypto('sha256', algo.salt2),\n a_for_hash,\n b_for_hash,\n K\n );\n\n const M1 = await cryptoWorker.invokeCrypto('sha256', buff);\n\n const out: InputCheckPasswordSRP.inputCheckPasswordSRP = {\n _: 'inputCheckPasswordSRP',\n srp_id: state.srp_id,\n A: new Uint8Array(a_for_hash),\n M1\n };\n\n return out;\n}\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\n","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\n const len = bytes1.length;\n const bytes = new Uint8Array(len);\n\n for(let i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport bigInt from 'big-integer';\nimport randomize from '../../helpers/array/randomize';\nimport {bigIntFromBytes} from '../../helpers/bigInt/bigIntConversion';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport {MessagesDhConfig} from '../../layer';\nimport CallInstance from '../calls/callInstance';\nimport cryptoWorker from './cryptoMessagePort';\n\nexport default async function generateDh(dhConfig: MessagesDhConfig.messagesDhConfig) {\n const {p, g} = dhConfig;\n\n const generateA = (p: Uint8Array) => {\n for(;;) {\n const a = randomize(new Uint8Array(p.length));\n // const a = new Uint8Array(4).randomize();\n\n const aBigInt = bigIntFromBytes(a); // str2bigInt(bytesToHex(a), 16);\n if(!aBigInt.greater(bigInt.one)) {\n continue;\n }\n\n const pBigInt = bigIntFromBytes(p); // str2bigInt(bytesToHex(p), 16);\n if(!aBigInt.lesser(pBigInt.subtract(bigInt.one))) {\n continue;\n }\n\n return a;\n }\n };\n\n const a = generateA(p);\n // const a = new Uint8Array([0]);\n\n const gBytes = bytesFromHex(g.toString(16));\n const g_a = addPadding(await cryptoWorker.invokeCrypto('mod-pow', gBytes, a, p), 256, true, true, true);\n const g_a_hash = await cryptoWorker.invokeCrypto('sha256', g_a);\n\n const dh: CallInstance['dh'] = {\n a: a,\n g_a: g_a,\n g_a_hash: g_a_hash,\n p\n };\n\n return dh;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {bigIntFromBytes, bigIntToSigned} from '../../helpers/bigInt/bigIntConversion';\nimport cryptoWorker from './cryptoMessagePort';\n\nexport default async function computeDhKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n const key = await cryptoWorker.invokeCrypto('mod-pow', g_b, a, p);\n const keySha1Hashed = await cryptoWorker.invokeCrypto('sha1', key);\n const key_fingerprint = keySha1Hashed.slice(-8).reverse();\n const key_fingerprint_long = bigIntToSigned(bigIntFromBytes(key_fingerprint)).toString(10);\n\n return {key, key_fingerprint: key_fingerprint_long};\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type SuperMessagePort from '../lib/mtproto/superMessagePort';\nimport ctx from '../environment/ctx';\n\nexport default function listenMessagePort(\n messagePort: SuperMessagePort,\n onConnect?: (source: MessageEventSource) => void,\n onDisconnect?: (source: MessageEventSource) => void\n) {\n const attachPort = (listenPort: any, sendPort: any) => {\n messagePort.attachListenPort(listenPort);\n sendPort && messagePort.attachSendPort(sendPort);\n onConnect?.(listenPort);\n };\n\n messagePort.setOnPortDisconnect(onDisconnect);\n\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\n attachPort(ctx, null);\n } else {\n attachPort(ctx, ctx);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n underscore: '\\x1b[4m',\n blink: '\\x1b[5m',\n reverse: '\\x1b[7m',\n hidden: '\\x1b[8m',\n // Foreground (text) colors\n fg: {\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m'\n },\n // Background colors\n bg: {\n black: '\\x1b[40m',\n red: '\\x1b[41m',\n green: '\\x1b[42m',\n yellow: '\\x1b[43m',\n blue: '\\x1b[44m',\n magenta: '\\x1b[45m',\n cyan: '\\x1b[46m',\n white: '\\x1b[47m'\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n ['debug', LogTypes.Debug],\n ['info', LogTypes.Log],\n ['warn', LogTypes.Warn],\n ['error', LogTypes.Error],\n ['assert', LogTypes.Error],\n ['trace', LogTypes.Log],\n ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n const originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n // level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,211,85], () => (__webpack_require__(6991)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === 85) return \"85.952a9f12a6b3dcdd3f0e.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + {\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] + \".\" + {\"211\":\"780c206f3e1257ccad6a\",\"699\":\"85f88e27b023cbb2ca51\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t589: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","DEBUG","MOUNT_CLASS_TO","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","postMessage","listener","args","err","console","error","notifyServiceWorker","all","clients","matchAll","includeUncontrolled","type","then","listeners","length","slice","forEach","bind","bufferConcats","reduce","acc","v","byteLength","tmp","Uint8Array","lastLength","b","set","ArrayBuffer","prototype","concat","this","toJSON","Promise","finally","fn","onFinally","callback","resolve","result","reason","reject","Number","MAX_SAFE_INTEGER","pow","longBigInt","divide","bigIntFromBytes","bytes","base","bigIntToBytes","bigInt","toArray","value","bytesModPow","exp","mod","bytesBigInt","expBigInt","modBigInt","modPow","CryptoMessagePort","constructor","super","lastIndex","invokeCryptoNew","method","transfer","payload","sendPortIndex","sendPorts","invoke","undefined","invokeCrypto","cryptoMessagePort","readBigIntFromBytesBE","bits","and","shiftLeft","i","_bits","or","emojis","randomize","arr","crypto","Error","getRandomValues","addPadding","blockSize","zeroes","blockSizeAsTotalLength","prepend","len","needPadding","padding","buffer","bytesFromHex","hexString","Math","ceil","start","parseInt","charAt","substr","convertToUint8Array","TextEncoder","encode","S","Si","T1","Uint32Array","T2","T3","T4","T5","T6","T7","T8","getWords","key","buf","pos","str","charCodeAt","xor","left","right","to","x2","x4","s","tEnc","tDec","d","t","x","xInv","computeTables","AES","_key","encKey","decKey","rcon","j","encrypt","_message","a2","b2","c2","message","out","a","c","rounds","k","decrypt","AES_IGE","iv","cipher","text","cipherText","prevX","subarray","prevY","yXOR","y","bytesToWordss","input","words","aesSync","keyBytes","ivBytes","o","bytesFromWordss","counter","offset","incrementCounter","carry","arrays","Uint16Array","bigIntRandom","min","max","array","nextRandomUint","BrentPollardFactor","n","two","remainder","isZero","m","ys","r","q","g","minus","eq","bigIntUint64MinusPqPlusOne","plus","performY","add","lesser","condition","multiply","greater","abs","subtle","CTR","mode","cryptoKey","queue","update","data","push","release","releasing","shift","_update","perform","name","head","toEncrypt","leftLength","leftLength2","performed","tail","leftAfter","aesCTRs","Map","lastCTRId","log","cryptoMethods","salt","iterations","importKey","hash","publicKey","exponent","modulus","pqBytes","factors","primes","factor","pop","isPrime","primeFactors","sort","compare","splice","p","map","toString","password","state","isNew","algo","new_algo","current_algo","pw_hash","client_salt","server_salt","makePasswordHash","salt1","salt2","Array","join","bytesToHex","padArray","flipper","B","srp_B","pForHash","gForHash","b_for_hash","k_v","is_good_mod_exp_first","modexp","prime","diff","subtract","isNegative","bitLength","toJSNumber","floor","a_for_hash","u","secure_random","A","generate_and_check_random","g_b","ux","a_ux","K","h1","bytes1","bytes2","bytesXor","buff","M1","_","srp_id","dhConfig","aBigInt","pBigInt","generateA","gBytes","g_a","g_a_hash","key_fingerprint","reverse","emojisLength","partOffset","index","codePoints","encIv","decIv","id","promises","encCryptoKey","decCryptoKey","enc","dec","operation","ctrs","get","delete","terminate","ctx","messagePort","onConnect","onDisconnect","attachPort","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","listenMessagePort","e","source","channel","MessageChannel","port1","port2","LogTypes","LOG_LEVELS","None","Warn","Log","Debug","STYLES_SUPPORTED","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","logType","setPrefix","newPrefix","setLevel","level","bindPrefix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","loaded","__webpack_modules__","call","__webpack_exports__","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","Object","keys","every","getter","__esModule","definition","defineProperty","enumerable","f","chunkId","miniCssF","globalThis","Function","obj","prop","hasOwnProperty","nmd","paths","children","scriptUrl","importScripts","location","document","currentScript","src","scripts","getElementsByTagName","replace","oldGetScript","oldLoadScript","queryMap","countMap","catch","retries","realSrc","request","setTimeout","cacheBust","Date","now","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""} \ No newline at end of file diff --git a/public/index.html b/public/index.html index c51c5b3a7..bb634d637 100644 --- a/public/index.html +++ b/public/index.html @@ -1,3 +1,3 @@ -Telegram Web \ No newline at end of file + \ No newline at end of file diff --git a/public/main.7560b2e0691f11f45725.css b/public/main.7560b2e0691f11f45725.css deleted file mode 100644 index 6212b4542..000000000 --- a/public/main.7560b2e0691f11f45725.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{-webkit-text-decoration-skip:objects;background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){list-style-type:none;padding-left:0}ul:not(.browser-default)>li{list-style-type:none}a{-webkit-tap-highlight-color:rgba(0,0,0,0)}button{background:none;border:none;cursor:pointer;outline:none;padding:0}img,video{-webkit-user-drag:none}.valign-wrapper{align-items:center;display:flex}.z-depth-0{box-shadow:none!important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none!important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;user-select:none}.no-transition,.no-transition:after,.no-transition:before{transition:none!important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start!important}.justify-self-start{justify-self:flex-start!important}.justify-self-end{justify-self:flex-end!important}.position-center{position:absolute!important}.position-center{left:50%;top:50%;transform:translate(-50%,-50%)}.text-bold{font-weight:500!important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap!important}.no-wrap{white-space:nowrap!important}.no-border-radius{border-radius:0!important}.disable-hover{pointer-events:none!important}.reflect-x{transform:scaleX(-1)}[dir=auto]{unicode-bidi:plaintext}.is-rtl [dir=auto]{direction:inherit}a{text-decoration:none}html{font-weight:400;line-height:1.5}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}code,pre{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap} -:root{--vh:1vh;--z-below:-1;--hover-alpha:0.08;--transition-standard-easing:cubic-bezier(.4,.0,.2,1);--transition-standard-in-time:.3s;--transition-standard-out-time:.25s;--transition-standard-in:var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out:var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition:.2s ease-in-out;--layer-transition:.2s cubic-bezier(.4,.0,.2,1);--slide-header-transition:.4s ease-in-out;--tabs-transition:.2s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--input-transition:.2s ease-out;--sticker-viewer-open-transition-in:.2s var(--transition-standard-easing);--sticker-viewer-open-transition-out:.2s var(--transition-standard-easing);--sticker-viewer-switch-transition:.2s cubic-bezier(.12,1.1,.56,1.2);--popup-transition-function:cubic-bezier(.4,0,.2,1);--popup-transition-time:.15s;--btn-corner-transition:.2s cubic-bezier(.34,1.56,.64,1);--chatlist-badge-transition-in:.25s cubic-bezier(.35,.35,.47,1.34);--chatlist-badge-transition-out:.25s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin:5.5625rem;--message-beside-button-size:2.375rem;--message-beside-button-margin:calc((var(--message-beside-button-size) + 0.5rem)*-1);--message-time-background:rgba(0,0,0,.35);--message-highlightning-color:rgba(109,141,65,.4);--messages-container-width:728px;--messages-text-size:16px;--messages-line-height:1.3125;--messages-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-text-size) + 4px);--messages-time-text-size:calc(var(--messages-text-size) - 4px);--messages-service-text-size:calc(var(--messages-text-size) - 1px);--messages-custom-emoji-size:calc(var(--messages-text-size) + 4px);--bubble-transition-in:transform var(--transition-standard-in),opacity var(--transition-standard-in);--bubble-transition-out:transform var(--transition-standard-out),opacity var(--transition-standard-out);--line-height-20:26px;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--line-height:1.3125;--font-size-20:20px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--font-size:var(--font-size-16);--esg-sticker-size:72px;--esg-custom-emoji-size:36px;--popup-sticker-size:80px;--disabled-opacity:.3;--round-video-size:280px;--menu-box-shadow:0px 0px 10px var(--menu-box-shadow-color);--menu-backdrop-filter:blur(50px);--font-monospace:"Roboto Mono",monospace;--font-weight-bold:500;--font-weight-normal:400;--selection-background-color:rgba(var(--primary-color-rgb),.4);--selection-color:inherit;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--custom-emoji-size:1.25rem;--peer-avatar-red-top:#ff845e;--peer-avatar-red-bottom:#d45246;--peer-avatar-orange-top:#febb5b;--peer-avatar-orange-bottom:#f68136;--peer-avatar-violet-top:#b694f9;--peer-avatar-violet-bottom:#6c61df;--peer-avatar-green-top:#9ad164;--peer-avatar-green-bottom:#46ba43;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#5bcbe3;--peer-avatar-blue-bottom:#359ad4;--peer-avatar-pink-top:#ff8aac;--peer-avatar-pink-bottom:#d95574;--peer-avatar-saved-top:#69bffa;--peer-avatar-saved-bottom:#3d9de0;--peer-avatar-archive-top:#b8c2cc;--peer-avatar-archive-bottom:#9eaab5;--avatar-color-top:var(--peer-avatar-saved-top);--avatar-color-bottom:var(--peer-avatar-saved-bottom);--avatar-border-radius-forum:37%;--premium-gradient:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%)}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-sticker-size:68px;--popup-sticker-size:68px;--round-video-size:200px;--chat-input-size:2.875rem;--chat-input-padding:0.5rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:601px){:root{--right-column-width:420px;--chat-input-size:3.375rem;--chat-input-padding:0.8125rem;--chat-input-inner-padding:0.5rem}}@media only screen and (max-height:569px){:root{--chat-input-size:2.875rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:1276px)and (max-width:1680px){:root{--right-column-width:25vw}}:root{--body-background-color:#fff;--background-color-true:#f4f4f5;--background-color:var(--background-color-true);--border-color:#dfe1e5;--surface-color-rgb:255,255,255;--surface-color:#fff;--scrollbar-color:rgba(0,0,0,.2);--section-box-shadow-color:rgba(0,0,0,.06);--menu-box-shadow-color:rgba(0,0,0,.15);--input-search-background-color:#fff;--input-search-border-color:#dfe1e5;--primary-color:#3390ec;--light-primary-color:rgba(51,144,236,.08);--light-filled-primary-color:#eff6fd;--dark-primary-color:#2086ea;--primary-color-rgb:51,144,236;--primary-text-color:#000;--primary-text-color-rgb:0,0,0;--secondary-color:#c4c9cc;--secondary-text-color:#707579;--light-secondary-text-color:hsla(207,4%,46%,.08);--light-filled-secondary-text-color:#f4f4f4;--danger-color:#df3f40;--light-danger-color:rgba(223,63,64,.08);--dark-danger-color:#d22324;--avatar-online-color:#0ac630;--chatlist-status-color:var(--avatar-online-color);--chatlist-pinned-color:#a2abb2;--badge-text-color:#fff;--link-color:#00488f;--ripple-color:rgba(0,0,0,.08);--poll-circle-color:var(--border-color);--spoiler-background-color:#e3e5e8;--spoiler-draft-background-color:#d9d9d9;--monospace-text-color:var(--danger-color);--backdrop-opacity:.85;--menu-background-color:rgba(var(--surface-color-rgb),var(--backdrop-opacity));--message-background-color:var(--surface-color);--message-checkbox-color:#61c642;--message-checkbox-border-color:#fff;--message-primary-color:var(--primary-color);--light-filled-message-primary-color:var(--light-filled-primary-color);--message-secondary-color:var(--secondary-color);--message-error-color:var(--danger-color);--message-out-background-color:#eeffde;--light-message-out-background-color:rgba(238,255,222,.08);--dark-message-out-background-color:#d9ffb5;--message-out-link-color:var(--link-color);--message-out-primary-color:#4fae4e;--light-filled-message-out-primary-color:#e1f9d2;--message-out-status-color:var(--message-out-primary-color);--message-out-audio-play-button-color:#fff;--message-out-selection-background-color:var(--selection-background-color);--gc-background-color:#212121;--gc-button-leave-color:rgba(255,89,90,.3);--gc-button-unmuted-color:rgba(1,200,80,.2);--gc-button-muted-color:rgba(60,135,247,.2);--gc-button-hand-color:rgba(223,68,184,.2);--gc-button-unmuted-fill-color:#195530;--gc-button-muted-fill-color:#3c87f7;--gc-green-color:#195530;--gc-blue-color:#3c87f7;--gc-red-color:#643333;--gc-primary-text-color:#fff;--gc-secondary-text-color:#aaa;--gc-green-text-color:#5cc85e;--gc-blue-text-color:#3390ec;--gc-red-text-color:#ff595a;--gc-right-column-width:26.25rem}.night{--body-background-color:#181818;--background-color-true:#181818;--background-color:var(--background-color-true);--border-color:#0f0f0f;--surface-color-rgb:33,33,33;--surface-color:#212121;--scrollbar-color:hsla(0,0%,100%,.2);--section-box-shadow-color:rgba(0,0,0,.12);--input-search-background-color:#181818;--input-search-border-color:#2f2f2f;--primary-color:#8774e1;--light-primary-color:rgba(135,116,225,.08);--light-filled-primary-color:#292830;--dark-primary-color:#6a52da;--primary-color-rgb:135,116,225;--primary-text-color:#fff;--primary-text-color-rgb:255,255,255;--secondary-color:#707579;--secondary-text-color:#aaa;--light-secondary-text-color:hsla(0,0%,67%,.08);--light-filled-secondary-text-color:#2c2c2c;--danger-color:#ff595a;--light-danger-color:rgba(255,89,90,.08);--dark-danger-color:#ff3031;--avatar-online-color:#0ac630;--chatlist-status-color:var(--primary-color);--chatlist-pinned-color:var(--secondary-color);--badge-text-color:#fff;--link-color:var(--primary-color);--ripple-color:hsla(0,0%,100%,.08);--poll-circle-color:#fff;--spoiler-background-color:#373e4e;--spoiler-draft-background-color:#484848;--monospace-text-color:var(--primary-text-color);--menu-background-color:rgba(var(--surface-color-rgb),.75);--message-background-color:var(--surface-color);--message-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--message-error-color:#fff;--message-out-background-color:#8774e1;--light-message-out-background-color:rgba(135,116,225,.08);--dark-message-out-background-color:#6a52da;--message-out-link-color:#fff;--message-out-primary-color:#fff;--light-filled-message-out-primary-color:#917fe3;--message-out-status-color:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color);--message-out-selection-background-color:rgba(var(--surface-color-rgb),.4)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?ivbp49) format("truetype"),url(assets/fonts/tgico.woff?ivbp49) format("woff"),url(assets/fonts/tgico.svg?ivbp49#tgico) format("svg")}.tgico:after,.tgico:before,[class*=" tgico-"]:after,[class*=" tgico-"]:before,[class^=tgico-]{font-family:tgico!important}.tgico:after,.tgico:before,[class*=" tgico-"]:after,[class*=" tgico-"]:before,[class^=tgico-]{speak:never;font-feature-settings:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.tgico-check:before{content:""}.tgico-checks:before{content:""}.tgico-activesessions:before{content:""}.tgico-add:before{content:""}.tgico-add_reaction:before{content:""}.tgico-addmember_filled:before{content:""}.tgico-adduser:before{content:""}.tgico-admin:before{content:""}.tgico-animals:before{content:""}.tgico-animations:before{content:""}.tgico-archive:before{content:""}.tgico-arrow_down:before{content:""}.tgico-arrow_next:before{content:""}.tgico-attach:before{content:""}.tgico-audio_repeat:before{content:""}.tgico-audio_repeat_single:before{content:""}.tgico-avatarnext:before{content:""}.tgico-avatarprevious:before{content:""}.tgico-binfilled:before{content:""}.tgico-bold:before{content:""}.tgico-botcom:before{content:""}.tgico-bots:before{content:""}.tgico-bug:before{content:""}.tgico-calendar:before{content:""}.tgico-calendarfilter:before{content:""}.tgico-camera:before{content:""}.tgico-cameraadd:before{content:""}.tgico-car:before{content:""}.tgico-card:before{content:""}.tgico-card_outline:before{content:""}.tgico-channel:before{content:""}.tgico-channelviews:before{content:""}.tgico-chatspinned:before{content:""}.tgico-chatsplaceholder:before{content:""}.tgico-check1:before{content:""}.tgico-checkbox:before{content:""}.tgico-checkboxblock:before{content:""}.tgico-checkboxempty:before{content:""}.tgico-checkboxon:before{content:""}.tgico-checkretract:before{content:""}.tgico-checkround:before{content:""}.tgico-close:before{content:""}.tgico-clouddownload:before{content:""}.tgico-colorize:before{content:""}.tgico-comments:before{content:""}.tgico-commentssticker:before{content:""}.tgico-copy:before{content:""}.tgico-darkmode:before{content:""}.tgico-data:before{content:""}.tgico-delete:before{content:""}.tgico-delete_filled:before{content:""}.tgico-deletedaccount:before{content:""}.tgico-deleteleft:before{content:""}.tgico-deleteuser:before{content:""}.tgico-devices:before{content:""}.tgico-document:before{content:""}.tgico-down:before{content:""}.tgico-download:before{content:""}.tgico-dragfiles:before{content:""}.tgico-dragmedia:before{content:""}.tgico-eats:before{content:""}.tgico-edit:before{content:""}.tgico-email:before{content:""}.tgico-endcall_filled:before{content:""}.tgico-enter:before{content:""}.tgico-eye1:before{content:""}.tgico-eye2:before{content:""}.tgico-fast_forward:before{content:""}.tgico-fast_rewind:before{content:""}.tgico-favourites:before{content:""}.tgico-flag:before{content:""}.tgico-flip:before{content:""}.tgico-folder:before{content:""}.tgico-fontsize:before{content:""}.tgico-forward:before{content:""}.tgico-forward_filled:before{content:""}.tgico-fullscreen:before{content:""}.tgico-gc_microphone:before{content:""}.tgico-gc_microphoneoff:before{content:""}.tgico-gifs:before{content:""}.tgico-group:before{content:""}.tgico-groupmedia:before{content:""}.tgico-groupmediaoff:before{content:""}.tgico-help:before{content:""}.tgico-hide:before{content:""}.tgico-image:before{content:""}.tgico-info:before{content:""}.tgico-info2:before{content:""}.tgico-italic:before{content:""}.tgico-keyboard:before{content:""}.tgico-lamp:before{content:""}.tgico-language:before{content:""}.tgico-largepause:before{content:""}.tgico-largeplay:before{content:""}.tgico-left:before{content:""}.tgico-limit_chat:before{content:""}.tgico-limit_chats:before{content:""}.tgico-limit_file:before{content:""}.tgico-limit_folders:before{content:""}.tgico-limit_link:before{content:""}.tgico-limit_pin:before{content:""}.tgico-link:before{content:""}.tgico-listscreenshare:before{content:""}.tgico-livelocation:before{content:""}.tgico-location:before{content:""}.tgico-lock:before{content:""}.tgico-lockoff:before{content:""}.tgico-loginlogodesktop:before{content:""}.tgico-loginlogomobile:before{content:""}.tgico-logout:before{content:""}.tgico-mediaspoiler:before{content:""}.tgico-mediaspoileroff:before{content:""}.tgico-mention:before{content:""}.tgico-menu:before{content:""}.tgico-message:before{content:""}.tgico-messageunread:before{content:""}.tgico-microphone:before{content:""}.tgico-microphone_crossed:before{content:""}.tgico-microphone_crossed_filled:before{content:""}.tgico-microphone_filled:before{content:""}.tgico-minus:before{content:""}.tgico-monospace:before{content:""}.tgico-more:before{content:""}.tgico-mute:before{content:""}.tgico-muted:before{content:""}.tgico-newchannel:before{content:""}.tgico-newchat_filled:before{content:""}.tgico-newgroup:before{content:""}.tgico-newprivate:before{content:""}.tgico-next:before{content:""}.tgico-noncontacts:before{content:""}.tgico-nosound:before{content:""}.tgico-passwordoff:before{content:""}.tgico-pause:before{content:""}.tgico-permissions:before{content:""}.tgico-phone:before{content:""}.tgico-pin:before{content:""}.tgico-pinlist:before{content:""}.tgico-pinned_filled:before{content:""}.tgico-pinnedchat:before{content:""}.tgico-pip:before{content:""}.tgico-play:before{content:""}.tgico-playback_05:before{content:""}.tgico-playback_15:before{content:""}.tgico-playback_1x:before{content:""}.tgico-playback_2x:before{content:""}.tgico-plus:before{content:""}.tgico-poll:before{content:""}.tgico-premium_addone:before{content:""}.tgico-premium_double:before{content:""}.tgico-premium_lock:before{content:""}.tgico-premium_unlock:before{content:""}.tgico-previous:before{content:""}.tgico-radiooff:before{content:""}.tgico-radioon:before{content:""}.tgico-reactions:before{content:""}.tgico-readchats:before{content:""}.tgico-recent:before{content:""}.tgico-replace:before{content:""}.tgico-reply:before{content:""}.tgico-reply_filled:before{content:""}.tgico-rightpanel:before{content:""}.tgico-rotate_left:before{content:""}.tgico-rotate_right:before{content:""}.tgico-saved:before{content:""}.tgico-savedmessages:before{content:""}.tgico-schedule:before{content:""}.tgico-scheduled:before{content:""}.tgico-search:before{content:""}.tgico-select:before{content:""}.tgico-send:before{content:""}.tgico-send2:before{content:""}.tgico-sending:before{content:""}.tgico-sendingerror:before{content:""}.tgico-settings:before{content:""}.tgico-settings_filled:before{content:""}.tgico-sharescreen_filled:before{content:""}.tgico-shipping:before{content:""}.tgico-shuffle:before{content:""}.tgico-smallscreen:before{content:""}.tgico-smile:before{content:""}.tgico-spoiler:before{content:""}.tgico-sport:before{content:""}.tgico-star:before{content:""}.tgico-stickers:before{content:""}.tgico-stickers_face:before{content:""}.tgico-stop:before{content:""}.tgico-strikethrough:before{content:""}.tgico-textedit:before{content:""}.tgico-tip:before{content:""}.tgico-tools:before{content:""}.tgico-topics:before{content:""}.tgico-unarchive:before{content:""}.tgico-underline:before{content:""}.tgico-unmute:before{content:""}.tgico-unpin:before{content:""}.tgico-unread:before{content:""}.tgico-up:before{content:""}.tgico-user:before{content:""}.tgico-username:before{content:""}.tgico-videocamera:before{content:""}.tgico-videocamera_crossed_filled:before{content:""}.tgico-videocamera_filled:before{content:""}.tgico-videochat:before{content:""}.tgico-volume_down:before{content:""}.tgico-volume_mute:before{content:""}.tgico-volume_off:before{content:""}.tgico-volume_up:before{content:""}.tgico-zoomin:before{content:""}.tgico-zoomout:before{content:""}.tgico-phone_filled:before{content:"";transform:rotate(-135deg)}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}.input-wrapper{margin:0 auto;width:360px}.input-field{--height:54px;--border-radius:10px;position:relative}@media only screen and (max-width:600px){.input-field{--height:50px}}.input-field .arrow-down{border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;bottom:0;content:" ";cursor:pointer;display:inline-block;height:0;margin-top:-9px;padding:5px;position:absolute;right:21px;top:50%;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:all .2s;vertical-align:middle;width:0;z-index:2}[dir=ltr] .input-field label{left:1rem}[dir=rtl] .input-field label{right:1rem}.input-field label{background-color:#fff;background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;margin-top:calc((var(--height) - 1.5rem)/2);pointer-events:none;position:absolute;right:auto;top:0;transform:translate(0);transform-origin:left center;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap;z-index:2}.is-rtl .input-field label{transform-origin:right center}body.animation-level-2 .input-field label{transition:transform .2s,padding .2s,opacity .1s,font-weight 0s .1s}.input-field-border{border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:var(--border-radius);bottom:0;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-icon{border-radius:.375rem;height:1.5rem;pointer-events:none;position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:1.5rem;z-index:1}.input-field-input{--padding:1rem;--padding-horizontal:1rem;--border-width:1px;background-color:#fff;background-color:var(--surface-color);border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);box-sizing:border-box;line-height:1.3125;line-height:var(--line-height);min-height:var(--height);padding:calc(var(--padding) - var(--border-width)) calc(var(--padding-horizontal) - var(--border-width));position:relative;transition:border-color 0s;width:100%;z-index:1}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{-webkit-box-shadow:inset 0 0 0 1000px #fff;-webkit-box-shadow:0 0 0 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:first-line,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{color:#000!important;color:var(--primary-text-color)!important;font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important;font-size:1rem!important}@media only screen and (max-width:600px){.input-field-input{--padding:.9375rem;--padding-horizontal:.9375rem}}body.animation-level-0 .input-field-input{transition:none!important}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:border-color .2s}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40!important;color:var(--danger-color)!important}.input-field-input.error~.input-field-border{border-color:#df3f40!important;border-color:var(--danger-color)!important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f!important}.input-field-input.valid~.input-field-border{border-color:#26962f!important}.input-field-input:focus~.arrow-down{border-color:#3390ec;border-color:var(--primary-color);margin-top:-4px;transform:rotate(225deg)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:disabled~label,.input-field-input:focus~label,.input-field-input:not(:empty)~label,.input-field-input:valid~label{opacity:1;padding:0 .3125rem;transform:translate(-.1875rem,calc(var(--height)/-2 + .0625rem)) scale(.75)}.input-field-input-fake{bottom:auto!important;height:auto!important;position:absolute!important;right:auto!important}.input-field-input-fake{left:0;opacity:0;pointer-events:none;top:0;z-index:-3}.input-fields-row{display:flex}.input-fields-row .input-field{flex:1 1 auto;width:1%}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}button:focus,input:focus{outline:none}.input-clear{border:none;outline:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40!important;color:var(--danger-color)!important}body:not(.animation-level-0) .input-clear.error{animation:input-shake .2s ease-in-out forwards}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}.input-search{--border-radius:22px;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){[dir=ltr] .input-search{margin-left:1rem}[dir=rtl] .input-search{margin-right:1rem}}.input-search-input{max-height:var(--height)!important;min-height:var(--height)!important}.input-search-input{--height:42px;background-color:#fff;background-color:var(--input-search-background-color);border-color:#dfe1e5;border-color:var(--input-search-border-color);height:var(--height);line-height:var(--height);padding:0 calc(var(--height) + 3px - var(--border-width))}body.animation-level-2 .input-search-input{transition:border-color .2s ease-in-out}html.no-touch .input-search-input:active:not(:focus),html.no-touch .input-search-input:hover:not(:focus){border-color:#c4c9cc!important;border-color:var(--secondary-color)!important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:active,html.no-touch .input-search-input:focus~.btn-icon:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;line-height:1;opacity:.6;position:absolute;text-align:center;top:50%;transform:translateY(-50%);z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}[dir=ltr] .input-search>.tgico-search{left:.8125rem}[dir=rtl] .input-search>.tgico-search{right:.8125rem}.input-search>.tgico-search{height:1.5rem;pointer-events:none;width:1.5rem}[dir=ltr] .input-search>.tgico-close{right:0}[dir=rtl] .input-search>.tgico-close{left:0}.input-search>.tgico-close{height:42px;width:42px;z-index:1}[dir=ltr] .input-search>.tgico-close:before{margin-right:-1px}[dir=rtl] .input-search>.tgico-close:before{margin-left:-1px}[dir=ltr] .input-field-password .input-field-input{padding-right:2.5rem}[dir=rtl] .input-field-password .input-field-input{padding-left:2.5rem}.input-field-password .input-field-input{max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-family:Arial,Helvetica,sans-serif;font-size:2.25rem;line-height:1;padding-bottom:0;padding-left:calc(.875rem - var(--border-width));padding-top:0}@media(-webkit-min-device-pixel-ratio:2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{align-items:center;color:#9e9e9e;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;padding:.5rem;position:absolute;right:.375rem;top:50%;transform:translateY(-50%);transition:color .2s;z-index:2}.input-field-password .toggle-visible:before{content:""}.input-field-password .toggle-visible.eye-hidden:before{content:""}html.no-touch .input-field-password .toggle-visible:active,html.no-touch .input-field-password .toggle-visible:hover{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing:.24px}.input-field-phone .input-field-input:after{color:#9e9e9e;content:attr(data-left-pattern);letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;border:none;cursor:pointer;outline:none}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn-icon:active,html.no-touch .btn-icon:hover,html.no-touch .btn:active,html.no-touch .btn:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-icon.active:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn.active:active,html.no-touch .btn.active:hover,html.no-touch .btn.blue:active,html.no-touch .btn.blue:hover,html.no-touch .btn.primary:active,html.no-touch .btn.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-icon.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-icon:disabled,.btn:disabled{pointer-events:none!important}.btn-icon:disabled,.btn:disabled{opacity:.3;opacity:var(--disabled-opacity)}.btn-icon{border-radius:50%!important}.btn-icon{align-items:center;background-color:transparent;border:none;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;line-height:1;padding:.5rem;position:relative;text-align:center;transition:color .15s ease-in-out,opacity .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}[dir=ltr] .btn-corner{right:var(--offset)}[dir=rtl] .btn-corner{left:var(--offset)}.btn-corner{box-shadow:none!important;padding:0!important;position:absolute!important;transition:transform .2s cubic-bezier(.34,1.56,.64,1)!important;transition:transform var(--btn-corner-transition)!important}.btn-corner{--offset:1.25rem;--translateY:calc(54px + var(--offset));align-items:center;background-color:#3390ec;background-color:var(--primary-color);border:none;bottom:var(--offset);color:#fff;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;outline:none;text-align:center;transform:translate3d(0,var(--translateY),0);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}html.no-touch .btn-corner:active,html.no-touch .btn-corner:hover{background-color:#2086ea;background-color:var(--dark-primary-color)}.btn-corner.is-visible{--translateY:0}body.animation-level-0 .btn-corner{transition:none!important}.btn-corner:disabled{opacity:1!important;pointer-events:all!important}.btn-corner .preloader-circular{height:2.5rem;width:2.5rem}.btn-menu{transform:scale(.8)!important}.btn-menu{-webkit-touch-callout:none;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:10px;font-size:1rem;min-width:11.25rem;opacity:0;padding:.3125rem 0;position:absolute;top:100%;transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),visibility .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);-webkit-user-select:none;visibility:hidden;z-index:4}.btn-menu-old{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:#fff;background-color:var(--surface-color);min-width:auto;padding:.5rem 0}.btn-menu-old .btn-menu-item{transform:none!important}.btn-menu-old .btn-menu-item{--padding-left:1rem;--padding-right:2.5rem;--icon-margin:1.5rem;--icon-size:1.5rem;border-radius:0;font-size:16px;font-size:var(--font-size-16);font-weight:400;height:3rem;line-height:21px;line-height:var(--line-height-16);margin:0}.btn-menu-old .btn-menu-item:before{color:#707579;color:var(--secondary-text-color)}.btn-menu{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{transform:scaleX(1)!important}.btn-menu.active{opacity:1;visibility:visible}.btn-menu.bottom-left,.is-rtl .btn-menu.bottom-right{left:auto;right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right,.is-rtl .btn-menu.bottom-left{left:0;right:auto;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;left:auto;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right,.is-rtl .btn-menu.top-left{bottom:100%;left:0;right:auto;top:auto;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}[dir=ltr] .btn-menu-item{text-align:left}[dir=rtl] .btn-menu-item{text-align:right}.btn-menu-item{cursor:pointer!important;pointer-events:all!important}.btn-menu-item{--padding-vertical:.25rem;--padding-left:.75rem;--padding-right:.75rem;--icon-margin:1.25rem;--icon-size:1.25rem;align-items:center;border-radius:.3125rem;color:#000;color:var(--primary-text-color);display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;height:2rem;line-height:18px;line-height:var(--line-height-14);margin-left:.3125rem;margin-right:.3125rem;padding:var(--padding-vertical) var(--padding-right) var(--padding-vertical) var(--padding-left);position:relative;text-transform:none;transform:scale(1);white-space:nowrap}body.animation-level-2 .btn-menu-item{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--btn-menu-transition)}.btn-menu-item:active{transform:scale(.96)}html.no-touch .btn-menu-item:active,html.no-touch .btn-menu-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:active,html.no-touch .btn-menu-item.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-menu-item:before{align-self:flex-start;color:#000;color:var(--primary-text-color);font-size:var(--icon-size);margin-top:.125rem}[dir=ltr] .btn-menu-item-icon,[dir=ltr] .btn-menu-item:before{margin-right:var(--icon-margin)}[dir=rtl] .btn-menu-item-icon,[dir=rtl] .btn-menu-item:before{margin-left:var(--icon-margin)}.btn-menu-item-icon,.btn-menu-item:before{position:relative}[dir=ltr] .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - var(--add)/2)}[dir=rtl] .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - var(--add)/2)}[dir=ltr] .btn-menu-item-icon{margin-left:calc(var(--add)/-2)}[dir=rtl] .btn-menu-item-icon{margin-right:calc(var(--add)/-2)}.btn-menu-item-icon{--add:.25rem;--total:calc(var(--icon-size) + var(--add));flex:0 0 auto;height:var(--total);width:var(--total)}.btn-menu-item-icon .media-photo{height:inherit;width:inherit}@media only screen and (max-width:600px){.btn-menu-item{--padding-right:1.875rem}}.btn-menu-item-text{flex:1 1 auto;position:relative}.btn-menu-item-text,.btn-menu-item-text-fake{pointer-events:none}[dir=ltr] .btn-menu-item-text-fake{margin-left:var(--margin-left)}[dir=rtl] .btn-menu-item-text-fake{margin-right:var(--margin-left)}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.btn-menu-item-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.btn-menu-item-header{pointer-events:none!important}.btn-menu-item-header{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);height:2rem}[dir=ltr] .btn-menu-item .stacked-avatars{right:.5rem}[dir=rtl] .btn-menu-item .stacked-avatars{left:.5rem}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute}.btn-menu-item.is-multiline{font-size:.75rem;height:auto;max-width:16.25rem;min-width:calc(100% - .625rem);width:-moz-fit-content;width:fit-content}.btn-menu-item.is-multiline .btn-menu-item-text{white-space:pre-wrap;width:-moz-fit-content;width:fit-content}.btn-menu-item .checkbox-field-toggle{padding:0}.btn-menu-overlay{max-width:none!important;position:fixed!important;width:auto!important}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:4}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:currentColor;display:flex;font-size:.875rem;height:2.5rem;justify-content:center}.btn-menu hr{display:block!important}.btn-menu hr{margin:.3125rem auto;opacity:.6;padding:0;width:calc(100% - 1.875rem)}.btn-menu .badge{background-color:transparent;color:#707579;color:var(--secondary-text-color)}.btn-menu-reactions{--inner-shadow-degree:90deg;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:var(--height);filter:drop-shadow(0 .125rem .5rem rgba(0,0,0,.24));height:inherit;max-height:100%;max-width:100%;opacity:0;position:absolute;transform:scale(.8);transform-origin:bottom left}[dir=ltr] .btn-menu-reactions-container{margin-left:var(--other-side-offset)}[dir=rtl] .btn-menu-reactions-container{margin-right:var(--other-side-offset)}.btn-menu-reactions-container{--height:2.25rem;--bubble-side-offset:0rem;--other-side-offset:0rem;--menu-offset:calc((var(--height) + 0.5rem)*-1);--width:calc(var(--menu-width) + (var(--bubble-side-offset) + var(--other-side-offset))*-1);display:flex;height:var(--height);justify-content:flex-start;margin-top:var(--menu-offset);max-width:var(--width);position:fixed;width:var(--width);z-index:4}.contextmenu.bottom-left+.btn-menu-reactions-container .btn-menu-reactions,.contextmenu.center-left+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom right!important}.contextmenu.bottom-center+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom center!important}[dir=ltr] .btn-menu-reactions-container-vertical{margin-left:var(--menu-offset)}[dir=rtl] .btn-menu-reactions-container-vertical{margin-right:var(--menu-offset)}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-top:0;max-height:var(--width);max-width:var(--height);width:var(--height)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree:180deg;display:flex;flex-direction:column;height:auto;transform-origin:top right;width:inherit}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical:var(--padding-base);--padding-horizontal:0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{bottom:var(--offset);right:calc(var(--size)/-2)}body.animation-level-2 .btn-menu-reactions{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{background-color:inherit;border-radius:50%;position:absolute;z-index:-1}.btn-menu-reactions-bubble-big{--size:1rem;--offset:calc(var(--height)/2);bottom:calc(var(--size)/-2);height:var(--size);right:var(--offset);width:var(--size)}.btn-menu-reactions:after{background:linear-gradient(var(--inner-shadow-degree),#fff 0,hsla(0,0%,100%,0) 1rem,hsla(0,0%,100%,0) calc(100% - 1rem),#fff 100%);background:linear-gradient(var(--inner-shadow-degree),var(--surface-color) 0,rgba(var(--surface-color-rgb),0) 1rem,rgba(var(--surface-color-rgb),0) calc(100% - 1rem),var(--surface-color) 100%);border-radius:inherit;bottom:0;content:" ";left:0;pointer-events:none;position:absolute;right:0;top:0}.btn-menu-reactions .scrollable{border-radius:inherit;display:flex;position:relative}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 .25rem}.btn-menu-reactions .scrollable-y{align-items:center;flex-direction:column;padding:.25rem 0}.btn-menu-reactions-reaction{--size:1.625rem;--padding-base:.25rem;--padding-vertical:0rem;--padding-horizontal:var(--padding-base);cursor:pointer;flex:0 0 auto;height:calc(var(--size) + var(--padding-vertical)*2);padding:var(--padding-vertical) var(--padding-horizontal);width:calc(var(--size) + var(--padding-horizontal)*2)}.btn-menu-reactions-reaction-scale{height:100%;width:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{height:100%;position:relative;width:100%}.btn-primary{border:none;border-radius:10px;cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold);height:54px;overflow:hidden;padding:0;position:relative;text-align:center;transition:opacity .2s;width:100%}html.no-touch .btn-primary:active,html.no-touch .btn-primary:hover{background:#2086ea;background:var(--dark-primary-color);transition:opacity .2s}.btn-primary-transparent{background-color:transparent;color:#3390ec;color:var(--primary-color)}html.no-touch .btn-primary-transparent:active,html.no-touch .btn-primary-transparent:hover{background:rgba(51,144,236,.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:active,html.no-touch .btn-primary-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}[dir=ltr] .btn-primary use,[dir=ltr] .btn-primary>svg{right:15px}[dir=rtl] .btn-primary use,[dir=rtl] .btn-primary>svg{left:15px}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto}.btn-primary:disabled{pointer-events:none!important}.btn-primary:disabled{opacity:.3;opacity:var(--disabled-opacity)}[dir=ltr] .btn-control{padding-left:.75rem;padding-right:1.5rem}[dir=rtl] .btn-control{padding-left:1.5rem;padding-right:.75rem}.btn-control{align-items:center;border-radius:1.25rem;display:flex;height:2.5rem;line-height:2.5rem;margin:.9375rem auto 1rem;width:auto}[dir=ltr] .btn-control.tgico:before{margin-right:.375rem}[dir=rtl] .btn-control.tgico:before{margin-left:.375rem}.btn-control.tgico:before{font-size:1.5rem}.btn-transparent{align-items:center;background-color:transparent;color:#000;color:var(--primary-text-color);display:flex;font-weight:400;height:3rem;line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width:600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:active,html.no-touch .btn-transparent:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:active,html.no-touch .btn-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:active,html.no-touch .btn-transparent.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}[dir=ltr] .btn-transparent:before{margin-right:2rem}[dir=rtl] .btn-transparent:before{margin-left:2rem}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem}@media only screen and (max-width:600px){[dir=ltr] .btn-transparent:before{margin-right:1.5rem}[dir=rtl] .btn-transparent:before{margin-left:1.5rem}}[dir=ltr] .btn-transparent.btn-short:before{margin-right:1rem}[dir=rtl] .btn-transparent.btn-short:before{margin-left:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);left:auto;margin:0;right:auto;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{cursor:pointer!important;font-weight:400!important;overflow:visible!important;pointer-events:all!important}.btn-menu-toggle{position:relative}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size:54px;border-radius:50%;height:var(--size);line-height:var(--size);width:var(--size)}@media only screen and (max-width:600px){.btn-circle{--size:46px}}.btn-circle path{fill:#fff}.btn-disabled{color:#707579!important;color:var(--secondary-text-color)!important;cursor:default!important;pointer-events:none!important}.btn-disabled:before{color:inherit!important}.btn-secondary:not(:first-child){margin-top:.5rem!important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border-radius:50%;font-size:1.5rem;height:3.375rem;height:var(--call-button-size);justify-content:center;position:relative}.call-button,.call-button-container{align-items:center;cursor:pointer;display:flex;width:3.375rem;width:var(--call-button-size)}.call-button-container{flex-direction:column}.call-button-container.disabled,.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{font-size:.875rem;margin-top:.25rem;white-space:nowrap}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}[dir=ltr] .call-button+.call-button,[dir=ltr] .call-button-container+.call-button-container{margin-left:var(--call-button-margin)}[dir=rtl] .call-button+.call-button,[dir=rtl] .call-button-container+.call-button-container{margin-right:var(--call-button-margin)}[dir=ltr] .call-button+.call-button,[dir=ltr] .call-button-container+.call-button-container{margin-left:2rem}[dir=rtl] .call-button+.call-button,[dir=rtl] .call-button-container+.call-button-container{margin-right:2rem}[dir=ltr] .btn-update{right:auto}[dir=rtl] .btn-update{left:auto}.btn-update{padding:0 2rem!important}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);width:auto}.animated-close-icon{pointer-events:none;position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{background-color:#707579;background-color:var(--secondary-text-color);border-radius:.125rem;height:.125rem;width:1.125rem}.animated-close-icon:after,.animated-close-icon:before{content:"";left:0;position:absolute;top:0}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:after,body.animation-level-2 .animated-close-icon:before{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.animated-menu-icon{--color:var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:after,.animated-menu-icon:before{background-color:var(--color);border-radius:.125rem;height:.125rem;transform:rotate(0);width:1.125rem}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:after,body.animation-level-2 .animated-menu-icon:before{transition:transform .25s}.animated-menu-icon:after,.animated-menu-icon:before{content:"";left:0;position:absolute}.animated-menu-icon:before{top:-.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translate(.375rem,-.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}.animated-menu-close-icon{margin-top:-.625rem}.animated-menu-close-icon:before{opacity:1;top:.3125rem}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translateY(.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{opacity:0;transform:rotate(45deg)}.animated-menu-close-icon.state-back:after{transform:translateY(-.625rem) rotate(90deg)}.animated-button-icon>.tgico{height:24px;line-height:24px;position:absolute}body:not(.animation-level-0) .animated-button-icon>.tgico{animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{animation:none!important}body.animation-level-0 .animated-button-icon>.tgico{visibility:hidden}.autocomplete-helper{border-radius:var(--border-radius)!important;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper{--border-radius:10px;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width:319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal)*4)}}.autocomplete-peer-helper .scrollable{max-height:232px;position:relative}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{align-items:center;cursor:pointer;display:flex;height:3.125rem;line-height:1.3125;line-height:var(--line-height);padding:0 2.125rem 0 .75rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{flex:0 0 auto;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.875rem}.autocomplete-peer-helper-list-element-description{color:#707579;color:var(--secondary-text-color);margin-left:.5625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{line-height:var(--size)!important}.badge{--size:1.375rem;--padding:.4375rem;border-radius:calc(var(--size)/2);color:#fff;color:var(--badge-text-color);font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);min-width:var(--size);padding:0 var(--padding);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{--size:1.25rem;--padding:.375rem}.badge-24{--size:1.5rem;--padding:.5rem}.badge.tgico:before{font-size:var(--size)}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{border-radius:0!important}.ckin__player.ckin__fullscreen{background:#000;bottom:0;display:flex;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:10000000}.ckin__player.ckin__fullscreen video{height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.ckin__player .time{color:#fff;font-size:.875rem;margin-left:.875rem}@media only screen and (max-width:600px){.ckin__player .time{margin-left:1.125rem}}.default{align-items:center;display:flex;font-size:0;justify-content:center;position:relative}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;color:#fff;font-size:4rem;left:50%;line-height:1;opacity:1;outline:0;padding:0;position:absolute;text-align:center;top:50%;transform:translate3d(-50%,-50%,0) scale(1)}@media only screen and (min-width:601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}@media only screen and (max-width:600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0}[dir=ltr] .default__controls{text-align:left}[dir=rtl] .default__controls{text-align:right}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}.default__controls .progress-line{border-radius:var(--border-radius);margin:0 16px}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:hsla(0,0%,100%,.38)}@media only screen and (max-width:600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x;bottom:0;height:49px;padding-top:93px;pointer-events:none;position:absolute;width:100%;z-index:2}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}@media only screen and (max-width:600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:""}.default .default__gradient-bottom{transform:translate3d(0,50px,0)}.default .default__controls{transform:translate3d(0,52px,0)}@media only screen and (max-width:600px){.default .default__controls{transform:translate3d(0,65px,0)}}.default.show-controls .default__controls,.default.show-controls .default__gradient-bottom{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:""}.default .player-volume{--icon-size:2.25rem;--icon-margin-right:.5rem;--selector-size:50px;--selector-thumb-size:.75rem;--hide-width:var(--icon-size);--show-width:calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size)*0.75);align-items:center;display:flex;overflow:hidden;width:var(--hide-width)}body.animation-level-2 .default .player-volume{transition:width .2s cubic-bezier(.4,0,.2,1);transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:active,html.no-touch .default .player-volume:hover{width:var(--show-width)}.default .player-volume__icon{color:#fff;cursor:pointer;display:flex;font-size:1.5rem;height:var(--icon-size);margin-right:var(--icon-margin-right);padding:.375rem;width:var(--icon-size)}.default .player-volume .progress-line{--color:#fff;--thumb-size:var(--selector-thumb-size);--height:4px;margin:0;min-width:var(--selector-size);width:var(--selector-size)}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none!important}video::-webkit-media-controls-enclosure{display:none!important}.progress-line{--color:var(--primary-color);--height:5px;--border-radius:6px;--thumb-size:13px;border-radius:var(--border-radius);cursor:pointer;height:var(--height);position:relative}.progress-line:before{border-radius:inherit;bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;bottom:-.5rem;caret-color:var(--color);cursor:pointer;margin:0;outline:none;padding:0;position:absolute;top:-.5rem;width:100%}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;height:0;width:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{background-color:var(--color);border-radius:50%;content:" ";cursor:pointer;display:block;height:var(--thumb-size);position:absolute;right:0;top:calc((var(--thumb-size) - var(--height))/-2);transform:translateX(calc(var(--thumb-size)/2)) scale(1);width:var(--thumb-size)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translateX(calc(var(--thumb-size)/2)) scale(1.125)}.progress-line:before,.progress-line__loaded{background-color:#c4c9cc;background-color:var(--secondary-color);opacity:.3}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);bottom:0;position:absolute;top:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{transform-origin:left center;width:100%}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;border:none;color:none}input[type=range]::-ms-thumb,input[type=range]::-ms-tooltip{visibility:hidden}.bottom-controls,.left-controls,.right-controls{align-items:center;display:flex}.bottom-controls{height:2.25rem;justify-content:space-between;padding:0 .625rem}@media only screen and (max-width:600px){.bottom-controls{height:3.625rem}}[dir=ltr] .checkbox-field{text-align:left}[dir=rtl] .checkbox-field{text-align:right}.checkbox-field{--size:1.25rem;--offset-left:0px;cursor:pointer;display:block;margin:1.5rem 1.1875rem;min-height:var(--size);min-width:var(--size);position:relative}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{pointer-events:none!important}.checkbox-field.checkbox-disabled{opacity:.3;opacity:var(--disabled-opacity)}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}[dir=ltr] .checkbox-field .checkbox-box{left:var(--offset-left)}[dir=rtl] .checkbox-field .checkbox-box{right:var(--offset-left)}.checkbox-field .checkbox-box{border-radius:.3125rem;height:var(--size);overflow:hidden;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border,.checkbox-field .checkbox-box-check{left:0;position:absolute;top:0}.checkbox-field .checkbox-box-border{border:2px solid #8d969c;border-radius:inherit;bottom:0;left:0;right:0}.checkbox-field .checkbox-box-background{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;bottom:-15%;left:-15%;right:-15%;top:-15%;transform:scale(1);transition:transform .2s ease-in-out 0s}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none!important}.checkbox-field .checkbox-box-check{--offset:7px;height:calc(var(--size) - var(--offset));left:50%;top:50%;transform:translate(-50%,-50%);width:calc(var(--size) - var(--offset))}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:3.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s ease-in-out .15s,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none!important}[dir=ltr] .checkbox-field .checkbox-caption{padding-left:3.375rem}[dir=rtl] .checkbox-field .checkbox-caption{padding-right:3.375rem}.checkbox-field .checkbox-caption{color:inherit;line-height:1.3125;line-height:var(--line-height);pointer-events:none;position:relative;transition:opacity .2s}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{align-items:center;display:flex;height:3.5rem;margin-left:0;margin-right:0;padding:0 1.1875rem}[dir=ltr] .checkbox-field.hover-effect .checkbox-box{left:auto}[dir=rtl] .checkbox-field.hover-effect .checkbox-box{right:auto}.checkbox-field .anchor-url{pointer-events:all}.checkbox-ripple{border-radius:10px;overflow:hidden}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size:1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{bottom:0;left:0;right:0;top:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset:calc(var(--size) - var(--size)/2 - 0.125rem)}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}[dir=ltr] .radio-field{text-align:left}[dir=rtl] .radio-field{text-align:right}.radio-field{--size:1.375rem;--offset-left:0px;cursor:pointer;line-height:1.3125;line-height:var(--line-height);margin:1.25rem 0;position:relative}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main:after,.radio-field.hidden-widget .radio-field-main:before{visibility:hidden}.radio-field>input:checked~.radio-field-main:before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main:after{transform:translateY(-50%) scale(1)}[dir=ltr] .radio-field .radio-field-main{padding-left:3.5rem}[dir=rtl] .radio-field .radio-field-main{padding-right:3.5rem}.radio-field .radio-field-main{color:inherit;position:relative}[dir=ltr] .radio-field .radio-field-main:after,[dir=ltr] .radio-field .radio-field-main:before{left:var(--offset-left)}[dir=rtl] .radio-field .radio-field-main:after,[dir=rtl] .radio-field .radio-field-main:before{right:var(--offset-left)}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:"";display:block;height:var(--size);position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}.radio-field .radio-field-main:before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main:before{transition:border-color .1s ease,opacity .1s ease}[dir=ltr] .radio-field .radio-field-main:after{left:calc(var(--offset-left) + .3125rem)}[dir=rtl] .radio-field .radio-field-main:after{right:calc(var(--offset-left) + .3125rem)}.radio-field .radio-field-main:after{background:#3390ec;background:var(--primary-color);border-radius:50%;height:.75rem;transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}[dir=ltr] .radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}[dir=rtl] .radio-field.radio-field-right .radio-field-main:before{left:0;right:auto}[dir=ltr] .radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[dir=rtl] .radio-field.radio-field-right .radio-field-main:after{left:.3125rem;right:auto}[type=checkbox],[type=radio]{box-sizing:border-box;opacity:0;padding:0;position:absolute;z-index:-1;z-index:var(--z-below)}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s;visibility:hidden}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transform:scale(0);transition:transform .2s ease-in-out .05s}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none!important;transition:background-color .2s!important}.checkbox-field-restriction .checkbox-box-check use{stroke-dasharray:24.19,24.19!important;transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out!important;visibility:visible!important}.checkbox-field-restriction .checkbox-box-check use{transform:rotate(0) translateY(0)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dashoffset:35.5;transform:rotate(45deg) translateY(-10px)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size:20px;align-items:center;display:flex;margin:0 .3125rem;padding:0 .25rem;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset:3px;--toggle-width:1.9375rem;align-items:center;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;display:flex;height:.875rem;margin:0 var(--offset);position:relative;width:var(--toggle-width)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{background-color:#fff;background-color:var(--surface-color);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:50%;content:" ";height:1.25rem;position:absolute;transform:translateX(calc(var(--offset)*-1));width:1.25rem}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s cubic-bezier(.22,.75,.7,1.44)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width:600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{margin-bottom:17px;padding:1rem 0 .5rem;width:100%}@media only screen and (max-width:600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:0 23px 1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.chatlist-container .search-group__name{font-size:15px;padding:5px 9px 0 16px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width:600px){.chatlist-container .search-group-contacts{padding:0 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0!important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0;padding:0 0 .5rem}.chatlist-container .search-super .search-group__name{display:flex;justify-content:space-between;padding-top:1rem}ul.chatlist{padding:0 .5rem}@media only screen and (max-width:600px){ul.chatlist{padding:0}}.chatlist{-webkit-touch-callout:none;background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;margin:0;position:relative;-moz-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist-chat{background:var(--background)!important}.chatlist-chat{--background:unset;-webkit-user-drag:none}.chatlist-chat.is-forum-open,.chatlist-chat.menu-open,html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-filled-secondary-text-color)}[dir=ltr] .chatlist-chat.is-muted .user-title:after{margin-left:.125rem}[dir=rtl] .chatlist-chat.is-muted .user-title:after{margin-right:.125rem}.chatlist-chat.is-muted .user-title:after{color:#a2abb2;color:var(--chatlist-pinned-color);content:"";flex:0 0 auto;font-size:1.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat i{font-style:normal}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat .premium-icon{margin-top:-.125rem}.chatlist-chat .topic-icon{flex:0 0 auto}[dir=ltr] .chatlist-chat .row-title .topic-icon{margin-right:.25rem}[dir=rtl] .chatlist-chat .row-title .topic-icon{margin-left:.25rem}.chatlist-chat .row-title .topic-icon{--size:1.375rem}.chatlist-chat .topic-name .topic-icon{line-height:1!important}.chatlist-chat .topic-name .topic-icon{display:inline}.chatlist-chat .topic-name .topic-icon-svg{position:relative}.chatlist-chat .topic-name .topic-icon-content{left:0;margin-top:-6px;position:absolute;right:0;top:0}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .premium-icon,.chatlist-chat.active .row-subtitle,.chatlist-chat.active .row-title,.chatlist-chat.active .sending-status-icon,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .verified-icon{color:#fff!important}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active .danger,.chatlist-chat.active .primary-text{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-icon-background{fill:#fff!important}.chatlist-chat.active .verified-icon-check{visibility:hidden}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff!important}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color:#fff}}.chatlist .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .sending-status-icon.tgico-premium_lock{color:#c4c9cc;color:var(--secondary-color);font-size:.8125rem;margin:.1875rem 0 0 .5rem}[dir=ltr] .chatlist .dialog-title-details{margin-left:.5rem}[dir=rtl] .chatlist .dialog-title-details{margin-right:.5rem}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;padding:1px 0 0}[dir=ltr] .chatlist .dialog-subtitle-badge{margin-left:.5rem}[dir=rtl] .chatlist .dialog-subtitle-badge{margin-right:.5rem}.chatlist .dialog-subtitle-badge{display:block!important}.chatlist .dialog-subtitle-badge{flex:0 0 auto}.chatlist .dialog-subtitle-badge.avatar-badge{line-height:23px!important}.chatlist .dialog-subtitle-badge.avatar-badge{--size:1.625rem;border:2px solid #fff;border:2px solid var(--background,var(--surface-color));margin:0;pointer-events:none;position:absolute;right:calc(100% - 4.0625rem);top:2.4375rem}[dir=ltr] .chatlist .dialog-subtitle-media{margin-right:.375rem}[dir=rtl] .chatlist .dialog-subtitle-media{margin-left:.375rem}.chatlist .dialog-subtitle-media{border-radius:.25rem;display:inline-block;flex:0 0 auto;height:1.25rem;line-height:1.25rem;position:relative;width:1.25rem}.chatlist .dialog-subtitle-media:before{content:" ";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.chatlist .dialog-subtitle-media.is-round{border-radius:50%}.chatlist .dialog-subtitle-media.is-round .tgico-play{font-size:.875rem}.chatlist .dialog-subtitle-media .tgico-play{color:#fff;font-size:1rem;left:50%;line-height:1;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.chatlist .dialog-subtitle-media .media-photo{border-radius:inherit;bottom:auto;height:inherit;-o-object-fit:cover;object-fit:cover;top:auto;width:inherit}.chatlist .dialog-group-call-icon{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;height:20px;left:45px;overflow:hidden;position:absolute;top:45px;width:20px;z-index:2}body.animation-level-2 .chatlist .dialog-group-call-icon,body.animation-level-2 .chatlist .dialog-subtitle-badge{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-group-call-icon.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-group-call-icon.animating,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating{transition:background-color .25s cubic-bezier(.35,.35,.47,1.34),transform .25s cubic-bezier(.35,.35,.47,1.34);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards{transition:background-color .25s cubic-bezier(.35,.35,.7,1),transform .25s cubic-bezier(.35,.35,.7,1),opacity .25s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .25s cubic-bezier(.35,.35,.47,1.34),transform .25s cubic-bezier(.35,.35,.47,1.34);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .25s cubic-bezier(.35,.35,.7,1),transform .25s cubic-bezier(.35,.35,.7,1),opacity .25s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .dialog-avatar,.chatlist .row-row{pointer-events:none;position:relative}.chatlist .user-title{display:flex!important}.chatlist .user-title{align-items:center}.chatlist .user-title img.emoji{height:18px;margin-top:1px;vertical-align:top;width:18px}.chatlist .user-last-message img.emoji{height:20px;margin-top:-3px;width:20px}.chatlist .user-last-message,.chatlist .user-title{flex-grow:1;position:relative}[dir=ltr] .chatlist .message-status{margin-right:.125rem}[dir=rtl] .chatlist .message-status{margin-left:.125rem}.chatlist .message-status{color:#0ac630;color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-top:-.0625rem;position:relative;vertical-align:middle;width:1.25rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{left:0;position:absolute;top:0}.chatlist .mention{background-color:#0ac630!important;background-color:var(--chatlist-status-color)!important}.chatlist .mention{padding:0}html.is-mac .chatlist .mention{line-height:1.25rem!important}[dir=ltr] .chatlist .mention-badge{margin-right:-.125rem}[dir=rtl] .chatlist .mention-badge{margin-left:-.125rem}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread,.chatlist .no-unmuted-topic .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist .not-visited{background-color:#c4c9cc!important;background-color:var(--secondary-color)!important}.chatlist .not-visited{--size:.5rem;--padding:0}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{margin-bottom:0!important}.chatlist-bottom .sidebar-left-section{padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chat-input{--translateY:0;--padding-bottom:0.5rem;--bottom:var(--padding-bottom);display:flex;flex:0 0 auto;flex-direction:column;max-width:100%;padding-top:.25rem;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .chat-input{transition:none!important}@media only screen and (min-height:570px)and (min-width:601px){.chat-input{max-width:728px!important;max-width:var(--messages-container-width)!important}}@media only screen and (min-width:601px){.chat-input{--padding-bottom:1.25rem}}@media only screen and (max-height:569px){.chat-input{--padding-bottom:0.5rem}}@media only screen and (min-width:1276px){.chat-input{width:calc(100% - var(--right-column-width))!important}body.is-right-column-shown .chat-input{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0)!important}body.is-right-column-shown .chat-input{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{position:absolute!important;transform:translate3d(0,var(--translateY),0)!important}.chat-input.is-hidden{--translateY:100%;bottom:0;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY:0}.chat-input-container{--padding-horizontal:var(--chat-input-padding);align-items:flex-end;display:flex;flex:0 0 auto;justify-content:center;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);padding:0 var(--padding-horizontal);padding-bottom:var(--bottom);position:relative;width:100%}.chat-input-container .btn-circle{height:var(--chat-input-size);width:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{border-bottom-right-radius:12px;max-height:var(--chat-input-size)}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{opacity:0;transform:scaleX(-1) translateX(1.125rem)}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0!important}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s 75ms}.chat-input-container.is-centering.animating .btn-send{transition:transform .2s}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 75ms}.chat-input .menu-send{bottom:calc(100% + .5rem);top:auto}.chat-input .input-message-input{--custom-emoji-size:var(--messages-custom-emoji-size);background:none;border:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);margin-top:-1px;max-height:27.5rem;outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height:30rem){.chat-input .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.chat-input .toggle-emoticons:before{content:""}.chat-input .toggle-emoticons.flip-icon:before{content:""!important}[dir=ltr] .chat-input .btn-record-cancel{right:0}[dir=rtl] .chat-input .btn-record-cancel{left:0}.chat-input .btn-record-cancel{--multiplier:-1;opacity:0;padding:0;position:absolute;top:0;transform:translateX(calc((100% + var(--padding-horizontal) + .5rem)*var(--multiplier)));visibility:hidden;z-index:3}.chat-input .btn-record-cancel .c-ripple__circle,html.no-touch .chat-input .btn-record-cancel:active:after,html.no-touch .chat-input .btn-record-cancel:hover:after{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.chat-input .btn-record-cancel:before{color:#df3f40;color:var(--danger-color)}.is-rtl .chat-input .btn-record-cancel{--multiplier:1}[dir=ltr] .chat-input .btn-scheduled:after{right:5px}[dir=rtl] .chat-input .btn-scheduled:after{left:5px}.chat-input .btn-scheduled:after{background:#61c642;background:var(--message-checkbox-color);border-radius:50%;content:"";height:.5rem;position:absolute;top:5px;width:.5rem}.chat-input .btn-preloader .preloader{height:1.5rem;width:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{animation:hide-icon .4s ease-in-out forwards!important}[dir=ltr] .chat-input .float{margin-right:.75rem!important}[dir=rtl] .chat-input .float{margin-left:.75rem!important}.chat-input .float{display:none!important;margin:0!important}.chat-input .float{align-self:center}body.animation-level-2 .chat-input .float{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){[dir=ltr] .chat-input .float{margin-right:.125rem!important}[dir=rtl] .chat-input .float{margin-left:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}[dir=ltr] .chat-input .btn-send-container{right:var(--padding-horizontal)}[dir=rtl] .chat-input .btn-send-container{left:var(--padding-horizontal)}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-cancel-record,.chat-input .btn-send{box-shadow:0 1px 8px 1px rgba(0,0,0,.12)}.chat-input .btn-send{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important}.chat-input .btn-send{z-index:3}html.no-touch .chat-input .btn-send:active,html.no-touch .chat-input .btn-send:hover{background-color:#2086ea!important;background-color:var(--dark-primary-color)!important}.chat-input .btn-send .tgico-check{height:32px!important}.chat-input .btn-send .tgico-check{font-size:2rem}.chat-input .btn-send .tgico-check:before{font-weight:500;font-weight:var(--font-weight-bold)}.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.record .tgico-microphone_filled,.chat-input .btn-send.schedule .tgico-schedule,.chat-input .btn-send.send .tgico-send{visibility:visible!important}body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone_filled,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule,body.animation-level-2 .chat-input .btn-send.send .tgico-send{animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem}.chat-input .record-time{display:none;height:44px;line-height:44px}.chat-input .record-time:after{background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;content:" ";display:inline-block;height:10px;margin-left:9px;margin-right:9px;width:10px}body.animation-level-2 .chat-input .record-time:after{animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;height:300px;opacity:.5;position:absolute;transform:scale(0);visibility:hidden;width:300px}@media only screen and (max-width:600px){.chat-input .record-ripple{height:240px;width:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-record-cancel,.chat-input.is-recording:not(.backwards) .btn-send{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - var(--chat-input-size)*2 - 1rem)}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}[dir=ltr] .chat-input:not(.is-recording) .btn-record-cancel{margin-right:0}[dir=rtl] .chat-input:not(.is-recording) .btn-record-cancel{margin-left:0}.chat-input:not(.is-recording) .btn-record-cancel{width:0}.chat-input .new-message-wrapper{opacity:1}.chat-input .reply-in-topic-overlay{align-items:center;background-color:inherit;border-radius:inherit;color:#707579;color:var(--secondary-text-color);display:flex;justify-content:center;padding:0 1rem;pointer-events:none;z-index:3}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}#column-center{flex:3;position:relative;width:100%}@media only screen and (max-width:600px){body.is-left-column-shown #column-center{transform:translate3d(100vw,0,0)}body.is-right-column-shown #column-center{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px)and (max-width:925px){#column-center{position:fixed!important}#column-center{bottom:0;left:0;right:0;top:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem,0,0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{display:flex!important}.chat{align-items:center;flex-direction:column;transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition);width:100%}body.animation-level-0 .chat{transition:none!important}.chat:not(.active):not(:last-child){filter:brightness(.8)}@media only screen and (min-width:926px){.chat:not(.active){transform:translate3d(calc((100vw - min(40vw, 420px))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(40vw, 420px)),0,0)}}@media only screen and (min-width:1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)),0,0)}}@media only screen and (min-width:1276px)and (max-width:1680px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(75vw,0,0)}}@media only screen and (max-width:925px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(100vw,0,0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.chat-background{background-color:#e6ebee;overflow:hidden}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none!important}.chat-background,.chat-background-item{position:absolute!important}.chat-background,.chat-background-item{bottom:0;left:0;right:0;top:0}.chat-background-item.is-image{background-color:inherit;background-image:url(assets/img/bg.jpeg);background-position:50%;background-size:cover}.chat-background-item.is-pattern{background-color:#000!important;background-image:none!important;margin:0!important}.chat-background-item.is-pattern{align-items:center;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center}@media only screen and (min-width:1276px){.chat-background-item.is-pattern{height:150%;top:-25%}}body.animation-level-2 .chat-background-item{opacity:0;transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}@media only screen and (min-width:1276px){body.animation-level-2 .chat-background-item{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)!important}body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center}body.animation-level-2.is-right-column-shown .chat-background-item{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)!important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(.666666667)}}.chat-background-item-canvas{--opacity-max:1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item:not(.is-dark) .chat-background-item-pattern-canvas{mix-blend-mode:soft-light}.chat-background-item-color-canvas{height:100%;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:cover;mask-size:cover}.chat .drops-container{--padding:20px;--pinned-floating-height:0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width:1276px){[dir=ltr] body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}[dir=rtl] body.is-right-column-shown .chat .drops-container{left:calc(var(--right-column-width))}}@media only screen and (max-width:600px){.chat .drops-container{--padding:10px}}.chat .drop{--wrapper-padding:15px;max-width:696px}.chat[data-type=chat] .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat-input-wrapper{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);--button-size:2.125rem;--button-horizontal-margin:.125rem;align-items:center;border-radius:1rem;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;max-height:30rem;max-width:calc(100% - var(--chat-input-size) - .5rem);min-height:var(--chat-input-size);position:relative;width:calc(100% - var(--chat-input-size) - .5rem);z-index:3}.chat-input-wrapper:before{border-radius:inherit;bottom:0;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);content:" ";left:0;opacity:1;right:0;top:0}.chat-input-control,.chat-input-wrapper:before{background-color:#fff;background-color:var(--surface-color);position:absolute}.chat-input-control{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);height:var(--chat-input-size);margin:0 auto;padding:var(--padding);visibility:hidden;width:auto;z-index:3}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;justify-content:center;padding:0 .625rem}@media only screen and (max-width:600px){.chat-input-control-button{font-size:15px}}[dir=ltr] .chat-input-control-button:before{margin-right:10px}[dir=rtl] .chat-input-control-button:before{margin-left:10px}.fake-selection-wrapper,.selection-wrapper{max-width:calc(100% - var(--chat-input-padding)*2);position:absolute;top:0;width:28.75rem}.chat-input-control,.selection-wrapper{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{align-items:center;border-radius:inherit;display:flex;font-size:15px;height:100%;justify-content:space-between;padding:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{align-items:center;display:flex;justify-content:space-between;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);text-transform:capitalize;white-space:nowrap}[dir=ltr] .selection-wrapper .selection-container .btn-icon{margin-left:6px;margin-right:5px}[dir=rtl] .selection-wrapper .selection-container .btn-icon{margin-left:5px;margin-right:6px}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;width:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width:600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width:380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}[dir=ltr] .selection-wrapper .selection-container-forward:before{margin-right:14px}[dir=rtl] .selection-wrapper .selection-container-forward:before{margin-left:14px}[dir=ltr] .selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}[dir=rtl] .selection-wrapper .selection-container-delete{margin-left:.625rem;margin-right:.375rem}[dir=ltr] .selection-wrapper .selection-container-delete:before{margin-right:10px}[dir=rtl] .selection-wrapper .selection-container-delete:before{margin-left:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}[dir=ltr] .fake-rows-wrapper{left:var(--padding-horizontal)}[dir=rtl] .fake-rows-wrapper{right:var(--padding-horizontal)}.fake-rows-wrapper{top:0;width:calc(100% - var(--chat-input-size) - var(--padding-horizontal)*2 - .5rem)}.rows-wrapper-wrapper{display:flex;width:100%}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s .15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s 75ms,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity .1s 0s,visibility 0s .2s}[dir=ltr] .rows-wrapper{border-bottom-right-radius:0}[dir=rtl] .rows-wrapper{border-bottom-left-radius:0}.rows-wrapper{transform:translateX(0) scaleX(1)}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width:600px){.rows-wrapper{--padding-vertical:1px}}@media only screen and (max-width:420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height:569px){.rows-wrapper{--padding-vertical:1px}}[dir=ltr] .rows-wrapper .bubble-tail{right:-8.4px}[dir=rtl] .rows-wrapper .bubble-tail{left:-8.4px}.rows-wrapper .bubble-tail{fill:#fff;fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;transform:scaleX(-1);width:11px}.is-rtl .rows-wrapper .bubble-tail{transform:scaleX(1)}.rows-wrapper .attach-file.menu-open{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important}.rows-wrapper .attach-file.menu-open{color:#3390ec;color:var(--primary-color)}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:1rem;display:flex;justify-content:space-between;padding:var(--padding);position:relative;width:100%}.rows-wrapper .reply-wrapper{align-items:center;height:0;justify-content:flex-start;margin-bottom:-.5625rem;opacity:0;padding:.5625rem var(--padding-horizontal) 0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .reply-wrapper{margin-bottom:-.3125rem;padding-top:.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{height:45px;opacity:1;pointer-events:inherit}.rows-wrapper .reply-wrapper .reply{flex:1 1 auto;margin-left:.625rem;margin-right:.625rem;order:1}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579!important;color:var(--secondary-text-color)!important}.rows-wrapper .reply-wrapper .reply-subtitle{height:1.125rem}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:3.125rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:3.125rem}.rows-wrapper .reply-wrapper .btn-menu{transform:scale(1)!important}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);top:auto}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item{padding-left:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-right:var(--icon-margin)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-left:var(--icon-margin)}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0;order:0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#000;stroke:var(--primary-text-color)}@media only screen and (max-width:600px){[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:calc(var(--padding-horizontal)*-1)}}.rows-wrapper .new-message-wrapper{--send-as-size:1.875rem;--send-as-margin-left:.25rem;--send-as-margin-right:.375rem;--send-as-total-size:calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size:2.375rem;--commands-margin-left:.25rem;--commands-margin-right:.375rem;--commands-total-size:calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX:0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;flex:0 0 auto;opacity:0;position:absolute;transform:scale(0);z-index:2}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-left:var(--commands-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-right:var(--commands-margin-left)}.rows-wrapper .new-message-wrapper .new-message-bot-commands{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:1.875rem;cursor:pointer;display:flex;height:1.875rem;justify-content:center;width:var(--commands-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{align-items:center;display:flex;justify-content:center;transform:scale(.875)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color:#fff}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-left:var(--send-as-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-right:var(--send-as-margin-left)}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container{height:var(--send-as-size);width:var(--send-as-size)}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:auto}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:auto}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:calc(var(--padding-horizontal)*-1 - .25rem)!important}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:calc(var(--padding-horizontal)*-1 - .25rem)!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;max-height:20rem;max-width:20rem;top:auto;transform:scaleX(1);width:auto}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item{height:2.25rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-header{height:1.875rem}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset:-.125rem;border:.0625rem solid #3390ec;border:.0625rem solid var(--primary-color);border-radius:inherit;bottom:var(--offset);content:" ";left:var(--offset);position:absolute;right:var(--offset);top:var(--offset)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{line-height:1!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{display:flex;flex-direction:column;justify-content:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-subtitle{font-size:.8125rem;font-weight:400}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{opacity:0;pointer-events:none;position:absolute;transform:scale(0)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;color:#fff;display:flex;font-size:1.375rem;height:inherit;justify-content:center;width:inherit;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX:var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX:48px}.rows-wrapper .new-message-wrapper.has-offset .input-message-container,.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}[dir=ltr] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-right:var(--translateX)}[dir=rtl] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-left:var(--translateX)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container{opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .input-message-container{align-items:center;align-self:center;display:flex;flex:1 1 auto;max-height:inherit;min-height:calc(var(--chat-input-size) - var(--padding-vertical)*2);overflow:hidden;position:relative;width:1%}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin-bottom:5px;margin-left:var(--button-horizontal-margin);margin-right:var(--button-horizontal-margin);margin-top:0;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY:0;flex:1 1 auto;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles{transition:none!important}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-78px;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}@media only screen and (max-width:600px){.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transform:translateY(calc(var(--translateY)*-1));transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles>.scrollable{display:block;height:auto}@media only screen and (min-width:1276px){body.is-right-column-shown .bubbles{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}body.animation-level-2 .bubbles.is-selecting .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting .is-in .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.animation-level-2 .bubbles.is-selecting:not(.backwards) .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:translateX(2.5rem) scale(1)}.bubbles.is-selecting:not(.backwards) .bubbles-group-avatar{transform:translate3d(2.5rem,0,0) scale3d(.76,.76,1)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:opacity var(--layer-transition),visibility 0s 0s!important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY:calc(var(--chat-input-size)*-1 - 0.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{display:flex;flex-direction:column;justify-content:flex-end;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);min-height:100%;padding:0 .8125rem;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles-inner{transition:none!important}@media only screen and (min-width:1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width:600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner:after{content:" ";height:.125rem}[dir=ltr] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}[dir=rtl] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-right:45px}@media only screen and (max-width:600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - 2.875rem)!important;max-width:calc(100% - var(--message-beside-button-margin)*-1)!important}.bubbles-inner.is-chat .message,.bubbles-inner.is-chat .name,.bubbles-inner:not(.is-channel) .message,.bubbles-inner:not(.is-channel) .name{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999!important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY)*-1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width:1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{transform:none!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-down{cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-mention{--translateY:0;cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention.is-visible{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s!important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;visibility:visible}.chat-secondary-button{background-color:#fff!important;background-color:var(--surface-color)!important;box-shadow:0 1px 8px 1px rgba(0,0,0,.12)!important}.chat-secondary-button{align-items:center;border-radius:50%;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;position:absolute}body.animation-level-0 .chat-secondary-button{transition:none!important}.chat-secondary-button:before{position:relative}.chat-secondary-button:after{border-radius:inherit;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}html.no-touch .chat-secondary-button:active:after,html.no-touch .chat-secondary-button:hover:after{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}[dir=ltr] .bubbles-corner-button{right:var(--chat-input-padding)}[dir=rtl] .bubbles-corner-button{left:var(--chat-input-padding)}.bubbles-corner-button{bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);overflow:visible;z-index:2}[dir=ltr] .bubbles-corner-button .badge{right:-.25rem}[dir=rtl] .bubbles-corner-button .badge{left:-.25rem}.bubbles-corner-button .badge{position:absolute;top:-.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width:600px){[dir=ltr] .bubbles-corner-button .badge{right:.1875rem}[dir=rtl] .bubbles-corner-button .badge{left:.1875rem}.bubbles-corner-button .badge{top:-.75rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height:var(--topbar-call-height)}@media only screen and (min-width:1276px){body.is-right-column-shown{--topbar-floating-scaleX:calc(1 - var(--right-column-proportion))}}.topbar{cursor:pointer!important;max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important}.topbar{--topbar-height:3.5rem;--pinned-floating-audio-height:0px;--pinned-floating-message-height:0px;--pinned-floating-height:calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height:52px;--pinned-message-height:52px;margin-bottom:var(--pinned-floating-height);position:relative;width:100%;z-index:1}.topbar:before{box-shadow:0 1px 5px -1px rgba(0,0,0,.21);content:" ";height:calc(var(--topbar-height) + var(--pinned-floating-height));height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));left:0;pointer-events:none;position:absolute;right:0;top:0}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height:var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height:var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width:601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width:926px){.chat:first-child .topbar .sidebar-close-button{display:none}[dir=ltr] .chat:first-child .topbar .chat-info{padding-left:.1875rem}[dir=rtl] .chat:first-child .topbar .chat-info{padding-right:.1875rem}}@media only screen and (min-width:1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{align-items:center;display:flex;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.5rem;max-width:calc(100% - 1.5rem)}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .info,.topbar .peer-title{line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 4.375rem);max-height:calc(var(--vh)*100 - 4.375rem);top:calc(100% + 7px)}@media only screen and (max-width:600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);top:29px}.topbar .btn-menu-toggle{margin-left:0}}[dir=ltr] .topbar .chat-info{padding-left:49px}[dir=rtl] .topbar .chat-info{padding-right:49px}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden}@media only screen and (max-width:600px){[dir=ltr] .topbar .chat-info{padding-left:52px}[dir=rtl] .topbar .chat-info{padding-right:52px}}@media only screen and (min-width:1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{align-items:center;display:flex;flex:1 1 auto;height:3.5rem;justify-content:space-between;max-height:3.5rem;max-width:100%}.topbar .chat-utils{align-items:center;display:flex;flex:0 0 auto}@media only screen and (min-width:1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width:600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}[dir=ltr] .topbar .chat-join{margin-right:.5rem}[dir=rtl] .topbar .chat-join{margin-left:.5rem}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}[dir=ltr] .topbar .content{padding-left:1.125rem}[dir=rtl] .topbar .content{padding-right:1.125rem}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden}.topbar .person{align-items:center;display:flex}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height:0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}[dir=ltr] .chat:not([data-type=chat]) .topbar .content{padding-left:16px}[dir=rtl] .chat:not([data-type=chat]) .topbar .content{padding-right:16px}[dir=ltr] .topbar-call-container{left:1px;right:0}[dir=rtl] .topbar-call-container{left:0;right:1px}.topbar-call-container{cursor:pointer!important;height:3rem!important;height:var(--topbar-call-height)!important;min-height:auto!important}.topbar-call-container{color:#fff;position:absolute;top:-3rem;top:calc(var(--topbar-call-height)*-1);z-index:2}body:not(.has-chat) .topbar-call-container{background:none!important}@media only screen and (max-width:925px){[dir=ltr] .topbar-call-container{left:0}[dir=rtl] .topbar-call-container{right:0}}.topbar-call-container .btn-icon{color:inherit;flex:0 0 auto;height:2.5rem;padding:0;width:2.5rem}.topbar-call-container .peer-title{font-weight:500;font-weight:var(--font-weight-bold);white-space:nowrap}@media only screen and (max-width:480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{align-items:center;display:flex}[dir=ltr] .topbar-call-left .btn-icon{margin-right:.375rem}[dir=rtl] .topbar-call-left .btn-icon{margin-left:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:500;font-weight:var(--font-weight-bold)}.topbar-call-center{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media only screen and (min-width:1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width)*-.5),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}.topbar-call-center{padding:0 calc(var(--right-column-width)/2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width:1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{bottom:-1.125rem;left:0;pointer-events:none;position:absolute;right:0;top:0;transform:scaleY(-1);transform:scale(var(--topbar-floating-scaleX),-1);transform-origin:left center;z-index:-1}.is-rtl .topbar-call-weave{transform-origin:right center}@media only screen and (min-width:1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{height:100%;width:100%}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubbles-group{position:relative}.bubbles-group-avatar{position:sticky!important}.bubbles-group-avatar{bottom:.25rem;cursor:pointer;pointer-events:all;top:0}.bubbles.is-selecting .bubbles-group-avatar{transform:translateZ(0) scaleX(1);transform-origin:bottom}.bubbles-group-avatar-container{bottom:0;display:flex;flex-direction:column-reverse;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:2}.bubble{--line-height:var(--messages-line-height);display:flex;flex-wrap:wrap;margin:0 auto .125rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:1}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;color:#fff;display:flex;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;opacity:0;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);top:50%;transform:translateY(-50%);transform:translateY(-50%) scale(.6);visibility:hidden;width:2.375rem;width:var(--message-beside-button-size)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem!important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{transform:translateY(-50%) scale(1);visibility:visible}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{bottom:-.0625rem;content:" ";left:-50%;position:absolute;top:-.0625rem;z-index:-1}.bubble.is-highlighted:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{animation:bubbleSelected 2s linear}@media only screen and (max-width:600px){.bubble.is-first-unread{max-width:none}}.bubble.is-first-unread:before{background-color:#fff;background-color:var(--surface-color);color:#3390ec;color:var(--primary-color);content:"Unread messages";font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);height:30px;line-height:2.1;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;position:relative;text-align:center;z-index:2}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(.0625rem + 30px)}.bubble.is-selected:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{display:block;width:200%}.bubble.is-multiple-documents:after,.bubble.is-multiple-documents:before{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0!important}.bubble-select-checkbox{display:flex;left:0;margin:0;position:absolute;z-index:3}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none!important}.bubbles.is-selecting .bubble a,.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video{pointer-events:none}.bubble-content{background-color:#fff;background-color:var(--message-background-color);border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);display:flex;flex-direction:column-reverse;max-width:100%;min-width:56px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}body.animation-level-0 .bubble-content{transition:none}html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content,html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content{-webkit-user-select:text;-moz-user-select:text;user-select:text}.bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(-1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button.goto-original{transform:translateX(-1.125rem) rotate(180deg)}.bubble-hover-reaction{--size:1.875rem;--offset:calc(var(--size)*-0.75);align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:var(--size);bottom:0;box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);cursor:pointer;display:flex;height:1.625rem;justify-content:center;opacity:0;position:absolute;right:var(--offset);transform:scale(.8);width:var(--size);z-index:2}body.animation-level-2 .bubble-hover-reaction{transition:opacity .2s cubic-bezier(.34,1.56,.64,1),transform .2s cubic-bezier(.34,1.56,.64,1);transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){opacity:1;transform:scale(1)}.bubble-hover-reaction-sticker{height:1.125rem;position:relative;width:1.125rem}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{box-shadow:none;margin:0 auto;max-width:100%}.bubble.is-date{font-weight:500;font-weight:var(--font-weight-bold);opacity:.99999;padding-bottom:.375rem;pointer-events:none;position:sticky;top:.25rem;transition:opacity .3s ease;z-index:2}.bubble.is-date:after,.bubble.is-date:before{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat[data-type=chat] .bubble.is-date .bubble-content,.chat[data-type=discussion] .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubbles:not(.has-sticky-dates) .bubble.is-date{visibility:hidden}.bubbles.has-sticky-dates .bubble.is-date.is-fake{display:none}.bubble.is-date.is-fake{opacity:1!important;transition:none!important;visibility:visible!important}.bubble.is-date.is-fake{left:50%;position:absolute;top:0;transform:translateX(-50%)}.bubble-beside-button{align-items:center;background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border-radius:50%;bottom:0;color:#fff;color:var(--badge-text-color);cursor:pointer;display:flex;font-size:1.5rem;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);transform:translateX(0);width:2.375rem;width:var(--message-beside-button-size)}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.bubble-view-button{text-decoration:none!important}.bubble-view-button{align-items:center;border:1px solid #3390ec;border:1px solid var(--message-primary-color);border-radius:6px;color:#3390ec;color:var(--message-primary-color);display:flex;height:2rem;justify-content:center;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble-view-button:active,html.no-touch .bubble-view-button:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble-view-button .c-ripple__circle{background-color:#3390ec;background-color:var(--message-primary-color);opacity:.08}.message .bubble-view-button{margin:.375rem 0 -.375rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}html.no-touch .bubble:active .bubble-beside-button,html.no-touch .bubble:hover .bubble-beside-button{opacity:1}.bubble .forward{font-size:1.25rem}.bubble.is-group-last{margin-bottom:.5rem}.bubble.is-group-last:after{bottom:-.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0!important}.bubble.webpage .preview-with-document{min-width:100%}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width:600px){.bubble.webpage .document{padding-left:44px}}.bubble.webpage .has-document{display:flex;flex-direction:column}.bubble.webpage .has-document .preview-resizer{order:1}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;vertical-align:bottom;width:18px}.bubble .thumbnail{position:absolute}.bubble .canvas-thumbnail{border-radius:inherit}.bubble .canvas-dots{z-index:1}.bubble.emoji-big{--emoji-size:1rem;font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big .attachment{border-radius:0!important}.bubble.emoji-big .attachment{--custom-emoji-size:var(--emoji-size)}.bubble.emoji-big .attachment img.emoji{height:var(--emoji-size);max-height:64px;max-width:64px;width:var(--emoji-size)}.bubble.emoji-big .attachment .custom-emoji,.bubble.emoji-big .attachment .emoji{display:inline-block}.bubble.emoji-big:not(.sticker) .attachment{max-height:-moz-fit-content!important;max-height:fit-content!important}.bubble.emoji-big:not(.sticker) .attachment{display:block;font-size:var(--emoji-size);padding-bottom:1.25rem;padding-top:.25rem;white-space:pre-wrap;word-break:break-word}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-big:not(.sticker) .bubble-content{max-width:min(420px,100%)}.bubble.just-media .bubble-content{background:none!important}.bubble.just-media .bubble-content{box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:rgba(109,141,65,.4);background:var(--message-highlightning-color)}.bubble.emoji-big:not(.sticker) .bubble-content,.bubble.sticker .bubble-content{align-self:flex-start}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{position:relative!important;right:0!important}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{margin-left:auto}.bubble.sticker .attachment{border-radius:0;position:absolute;z-index:1}.bubble.round .attachment{height:280px!important;height:var(--round-video-size)!important;max-height:280px!important;max-height:var(--round-video-size)!important;max-width:280px!important;max-width:var(--round-video-size)!important;width:280px!important;width:var(--round-video-size)!important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{border-radius:inherit;cursor:pointer;display:flex;justify-content:center;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.bubble .attachment .download span{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;font-size:23px;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{margin:0 auto;position:relative;z-index:1}.bubble .media-container-fitted{background-color:transparent!important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-height:min(340px,100%);max-width:min(420px,100%);width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-height:none;max-width:min(451px,100%)}.bubble .album-item{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);cursor:pointer;max-width:100%;overflow:hidden;position:absolute}body.animation-level-0 .bubble .album-item{transition:none!important}.bubble .album-item img,.bubble .album-item video,.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none!important}.bubble .album-item .bubble-select-checkbox{bottom:auto!important}.bubble .album-item .bubble-select-checkbox{left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4,0,.2,1),border-radius .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transform:scale(.883333);transition:transform .3s cubic-bezier(.4,0,.2,1),border-radius .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:active,html.no-touch .bubble a:hover{text-decoration:underline}.bubble-first{align-items:center;justify-content:center;margin-top:.5rem;max-width:100%;order:-1}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .attachment{pointer-events:none}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{align-items:flex-start!important;padding:.75rem 1rem .875rem!important}.bubble-first.empty-bubble-placeholder.has-description .service-msg{flex-direction:column}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-size:1rem!important}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{font-size:1.25rem;margin-left:-.1875rem;margin-right:.25rem;vertical-align:bottom}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubbles.has-groups .bubble-first.empty-bubble-placeholder{pointer-events:none}.bubbles.has-groups .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem!important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{margin-top:.75rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{cursor:pointer;height:200px;position:relative;width:200px}.bubble-first .time{display:none!important}.bubble-first:after,.bubble-first:before{display:none}.bubble .web{line-height:1.3125;line-height:var(--line-height);margin:.125rem 0 0;max-width:100%;overflow:hidden}.bubble .web+.time{display:block}.bubble .web .preview{border-radius:4px;cursor:pointer;max-height:min(340px,100%);max-width:min(420px,100%);overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .text,.bubble .web .title,.bubble .web .webpage-name{font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:active,html.no-touch .bubble .web .webpage-name:hover{text-decoration:underline}.bubble .web .text{margin-top:1px;word-break:break-word}.bubble .web .quote{display:flex;max-width:100%;overflow:hidden;width:100%}.bubble .web .quote-text{margin-left:-.625rem;max-width:100%;padding-left:.625rem;width:100%}.bubble .web .quote:before{background-color:#3390ec;background-color:var(--primary-color);border-radius:.125rem;content:" ";flex:0 0 auto;margin:.1875rem .5rem .125rem 0;width:.125rem}.bubble .reply{--font-size:var(--messages-secondary-text-size)}.bubble .document-name{font-size:16px;font-size:var(--messages-text-size)}.bubble .document-size{font-size:14px;font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{float:right;height:3rem;margin:.1875rem 0 0 .625rem;width:3rem}.bubble.is-square-photo .web .preview{margin:0;max-height:min(3rem,100%);max-width:min(3rem,100%)}.bubble .reply{border-radius:.25rem;cursor:pointer;margin:0 .375rem .375rem;min-width:10rem;padding:.25rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{height:auto;max-width:calc(100% - 1.25rem);min-height:32px;overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.bubble .message+.reply{margin-bottom:0}.bubble:not(.just-media) .reply{border-radius:6px}html.no-touch .bubble:not(.just-media) .reply:active,html.no-touch .bubble:not(.just-media) .reply:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble.just-media .floating-part{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:12px;margin:0;max-width:15rem;padding:.375rem .625rem;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .floating-part{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important}.bubble.just-media .name{line-height:1.3125;line-height:var(--line-height);padding:.375rem .625rem}.bubble.just-media .name .peer-title{font-weight:400!important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width:600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{max-width:none!important}.bubble.just-media .reply-content{margin-top:0;position:relative}.bubble.just-media .reply i,.bubble.just-media .reply-subtitle,.bubble.just-media .reply-title{color:#fff!important}.bubble.just-media .reply-border{background:#fff!important}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message,.bubble .service-msg{--custom-emoji-size:var(--messages-custom-emoji-size)}.bubble .message{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);max-width:100%;padding:0 .5rem .375rem .625rem;position:relative;white-space:pre-wrap;word-break:break-word}.bubble .message .custom-emoji{display:inline-flex}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width:600px){.bubble .audio,.bubble .document{--icon-size:2.25rem}}.bubble .audio .audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width:600px){.bubble .audio{--icon-margin:.6875rem;height:2.375rem}.bubble .audio .audio-details{margin-bottom:0;margin-top:2px}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{max-width:min(100%,335px)!important}.bubble .message.audio-message{width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{max-width:min(100%,300px)!important}.bubble .message.audio-message{width:280px}}.bubble .message.voice-message .document-message{max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px!important}.bubble .message.call-message,.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{cursor:pointer;display:flex;padding:2px 0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{display:flex;flex-direction:column;margin-top:8px;padding-left:12px}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold)}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px!important}.bubble .message.document-message .document{--icon-margin:.75rem;height:58px}@media only screen and (max-width:600px){.bubble .message.document-message .document{--icon-margin:.5rem;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.125rem 0 .125rem 2.5625rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble-call:before{font-size:1.5rem;left:.3125rem;position:absolute}.bubble-call-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-call-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height);margin-left:-.1875rem;margin-top:.0625rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:"";display:inline-block;font-size:1rem;transform:rotate(135deg)}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document .time{align-self:flex-start;height:0}.bubble .document-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{padding:0!important}.bubble.is-multiple-documents .message{border-radius:inherit}.bubble.is-multiple-documents .document-container{border-radius:inherit;position:relative}.bubble.is-multiple-documents .document-container .document-selection{bottom:0;left:-75vw;position:absolute;top:0;width:200vw;z-index:-2}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:#fff;background-color:var(--message-background-color);border-radius:inherit;bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection{animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection{animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top:.25rem;--margin-left:.125rem;background:#fff;border-radius:50%;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size:1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size:.125rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit;content:" ";height:calc(var(--size) - var(--inner-size)*2);left:var(--inner-size);position:absolute;top:var(--inner-size);width:calc(var(--size) - var(--inner-size)*2)}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-.0625rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{border-top-left-radius:inherit;border-top-right-radius:inherit;padding-top:.5rem}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-.0625rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding-bottom:.5rem}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-.25rem}.bubble.is-multiple-documents .document{height:54px!important}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document{height:38px!important}}.bubble.is-multiple-documents .document-wrapper{padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{margin-top:-.1875rem;padding:0 0 .25rem}.bubble .message .audio .time,.bubble .message.contact-message .time,.bubble .message.poll-message .time{bottom:0;position:absolute;right:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:.75rem;bottom:.1875rem;padding:0 .3125rem;position:absolute;right:.1875rem;z-index:2}.bubble.is-message-empty .message .time{align-items:center;display:flex;height:calc(12px + .375rem);height:calc(var(--messages-time-text-size) + .375rem);margin:0;padding:0;white-space:nowrap}.bubble.is-message-empty .message .time .inner{bottom:auto;color:#fff;margin:inherit;right:auto}.bubble.is-message-empty .message .time .inner:after{color:#fff!important}.bubble.is-message-empty.with-replies:not(.sticker):not(.with-beside-replies) .message{bottom:55px}.bubble.is-message-empty.emoji-big .message,.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):active:after,html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):hover:after{background-color:#fff}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble.with-beside-replies .bubble-content{min-height:5.5rem}.bubble .colored-name .premium-icon{color:inherit;opacity:.6}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:12px;font-size:var(--messages-time-text-size);height:12px;height:var(--messages-time-text-size);line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;visibility:hidden;z-index:1}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{font-size:inherit;overflow:visible}.bubble .time .inner{align-items:center;bottom:0;display:flex;height:12px;height:var(--messages-time-text-size);line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble .time.is-block{display:block;float:none}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{--height:calc(var(--messages-time-text-size) + 0.375rem);align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:var(--height);color:#fff;display:flex;font-size:12px;font-size:var(--messages-time-text-size);height:var(--height);left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:"";font-size:20px;font-size:calc(var(--messages-time-text-size) + 8px);padding:0 1px 0 3px}[dir=ltr] .bubble .video-time.is-error:after{margin-left:1px}[dir=rtl] .bubble .video-time.is-error:after{margin-right:1px}.bubble .video-time.is-error:after{content:"";font-size:16px;font-size:calc(var(--messages-time-text-size) + 4px);padding:0}.bubble .extended-media-buy{align-items:center;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(0,0,0,.3);border-radius:2rem;color:#fff;display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;left:50%;padding:0 1rem;position:absolute;top:50%;transform:translate(-50%,-50%);white-space:nowrap;z-index:2}.bubble .extended-media-buy:before{font-size:1.125rem;margin-right:.25rem}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;display:flex;font-size:2.125rem;justify-content:center;text-align:center;z-index:2}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.bubble .name{color:#3390ec;color:var(--primary-color);font-size:14px;font-size:var(--messages-secondary-text-size);line-height:calc(14px + .25rem);line-height:calc(var(--messages-secondary-text-size) + .25rem);max-width:100%;overflow:hidden;padding:.375rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo:not(.is-reply) .bubble-content>.name,.bubble:not(.webpage).video:not(.is-reply) .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big):not(.forwarded).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.forwarded):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{fill:#fff;fill:var(--message-background-color);display:block;height:20px;position:absolute;transform:translateY(1px);width:11px;z-index:-2}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail,.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{border-radius:inherit;cursor:pointer}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.bubble .replies .rp{border-radius:inherit;cursor:pointer;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.bubble .replies-beside{border-radius:2rem;bottom:47px;flex-direction:column;height:auto;max-height:52px;min-height:36px;padding:.375rem 0 .5rem;right:-44px;width:36px}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top:.0625rem solid #dfe1e5;border-top:.0625rem solid var(--border-color);color:#3390ec;color:var(--primary-color);display:flex;height:3.0625rem;min-width:15rem;padding:0 .5rem;position:relative}html.no-touch .bubble .replies-footer:active,html.no-touch .bubble .replies-footer:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .bubble .replies-footer:active~.bubble-tail,html.no-touch .bubble .replies-footer:hover~.bubble-tail{fill:#eff6fd;fill:var(--light-filled-message-primary-color)}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{align-items:center;color:#3390ec;color:var(--primary-color);display:flex;font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin-left:.5rem}.bubble .replies-footer-avatars{--margin-right:-.875rem;--border-size:2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:" ";height:.5rem;margin-left:.75rem;width:.5rem}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color:var(--light-filled-message-primary-color)}.bubble .message .reaction.is-chosen.backwards,.bubble .message .reaction:not(.is-chosen){--counter-color:var(--message-primary-color)}.bubble .message .reaction.is-chosen.backwards .stacked-avatars,.bubble .message .reaction:not(.is-chosen) .stacked-avatars{--border-color:var(--background-color)}.bubble .message .reactions-block .time{bottom:auto!important;position:static!important;right:auto!important}.bubble .message .reactions-block .time{order:100}.bubble code{cursor:pointer}.bubble.is-invoice .attachment{background-color:inherit!important}.bubble.with-reply-markup .bubble-content{border-bottom-left-radius:6px!important;border-bottom-right-radius:6px!important}.bubble .name-with-reply .name{padding:0!important}.bubble .name-with-reply .name:not(:last-child) .hide-ol{display:none}.bubble .name-with-reply .name:not(:last-child) .peer-title{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.bubble .name-with-reply .reply{height:auto;margin:.25rem 0 0;max-height:none;padding:0}.bubble .topic-name-button{--color:var(--message-primary-color)}.bubble .name .topic-name-button-container{margin:.25rem -.125rem}.bubble .name .topic-name-button-container:first-child{margin-top:0}.bubble.is-message-empty:not(.is-reply) .name .topic-name-button-container{margin-bottom:0}.bubble:not(.is-group-first) .topic-name-button-container{display:none!important}.bubble .topic-name-button-container.floating-part{font-size:14px;font-size:var(--messages-secondary-text-size);padding-bottom:0;padding-top:0}.bubble .topic-name-button-container.floating-part .topic-name-button{--color:#fff;padding:0}.bubble .topic-name-button-container.floating-part .topic-name-button:before{content:none}.bubble .topic-name-button-container.floating-part+.floating-part{margin-top:1.75rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.0625rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type .document-container:last-of-type .document-selection,.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type:after{bottom:-.0625rem}.can-zoom-fade{opacity:1;transform:scale(1) translateX(0);transform-origin:center}body.animation-level-2 .can-zoom-fade{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}.bubbles-inner.zoom-fading .can-zoom-fade{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.can-zoom-fade.zoom-fade{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-content-wrapper{display:flex;flex-direction:column}@media only screen and (min-width:601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width:600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:inherit;color:#fff;display:flex;font-size:15px;font-size:var(--messages-service-text-size);justify-content:center;line-height:20px;line-height:calc(var(--messages-service-text-size) + 5px);padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg .peer-title,.bubble.service .service-msg [data-saved-from],.bubble.service .service-msg a{cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold)}.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{text-decoration:underline}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0!important}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .floating-part{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .floating-part{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .audio-time,.bubble.is-in .contact-number{color:#707579!important;color:var(--secondary-text-color)!important}.bubble.is-in code,.bubble.is-in pre{color:#df3f40;color:var(--monospace-text-color)}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-border{background-color:rgb(var(--override-color))}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-title{color:rgb(var(--override-color))}html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:active,html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:hover{background-color:rgba(var(--override-color),.08)}.bubble.is-out{--message-background-color:var(--message-out-background-color);--light-message-background-color:var(--light-message-out-background-color);--dark-message-background-color:var(--dark-message-out-background-color);--link-color:var(--message-out-link-color);--message-primary-color:var(--message-out-primary-color);--light-filled-message-primary-color:var(--light-filled-message-out-primary-color);--selection-background-color:var(--message-out-selection-background-color);flex-direction:row-reverse}.bubble.is-out .bubble-content{margin-left:auto}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width:1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}body.animation-level-2 .bubble.is-out .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0!important}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .floating-part{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e!important;background-color:var(--message-out-primary-color)!important}.bubble.is-out:not(.just-media) .reply i,.bubble.is-out:not(.just-media) .reply-title{color:#4fae4e!important;color:var(--message-out-primary-color)!important}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{margin-left:-4px;padding-right:5px}.bubble.is-out .time .inner{bottom:4px;color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{color:#4fae4e;color:var(--message-out-primary-color);font-size:19px;font-size:calc(var(--messages-text-size) + 3px);line-height:12px;line-height:var(--messages-time-text-size);margin-left:1px}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time .inner:after,.bubble.is-out.is-read .time:after{content:""}.bubble.is-out.is-sent .time .inner:after,.bubble.is-out.is-sent .time:after{content:""}.bubble.is-out.is-sending .time .inner:after,.bubble.is-out.is-sending .time:after{content:""}.bubble.is-out.is-error .time .inner:after,.bubble.is-out.is-error .time:after{color:#df3f40;color:var(--message-error-color);content:""}.bubble.is-out .document-ico:after{border-right-color:#fff;border-right-color:var(--message-background-color);border-top-color:#fff;border-top-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e!important;fill:var(--message-out-primary-color)!important}.bubble.is-out .audio-subtitle,.bubble.is-out .audio-time{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-download,.bubble.is-out .audio-toggle,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color:var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .bubble-call-subtitle,.bubble.is-out .contact-number,.bubble.is-out .document-size{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#eeffde;color:var(--message-out-background-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-avatars .stacked-avatars{--border-color:var(--message-background-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color:var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color:var(--message-background-color)}.bubble.is-out .bubble-beside-button{left:-2.875rem;left:var(--message-beside-button-margin);right:auto}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{margin-top:.0625rem;width:100%}.bubble:not(.is-group-last) .reply-markup{margin-bottom:.125rem}.reply-markup-row{display:flex;margin-top:.125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child .reply-markup-button:first-child{border-bottom-left-radius:12px}.reply-markup-row:last-child .reply-markup-button:last-child{border-bottom-right-radius:12px}.reply-markup-button{color:#fff!important}.reply-markup-button{background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border:none;border-radius:.375rem;cursor:pointer;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button-text{pointer-events:none;position:relative}.reply-markup-button.anchor-url{text-decoration:none!important}.reply-markup-button+.reply-markup-button{margin-left:.125rem}.reply-markup-button .forward-icon,.reply-markup-button.tgico:before{display:block;position:absolute;right:.125rem;top:.125rem}.reply-markup-button.is-link:before{content:"";transform:rotate(-45deg)}.reply-markup-button.is-buy:before{content:""}.reply-markup-button.is-switch-inline:before{content:""}.bubble-beside-button:after,.bubble.just-media .reply:after,.reply-markup-button:after{background-color:#fff;border-radius:inherit;bottom:0;content:" ";display:block;left:0;opacity:0;position:absolute;right:0;top:0;z-index:-1}html.no-touch .bubble-beside-button:active:after,html.no-touch .bubble-beside-button:hover:after,html.no-touch .bubble.just-media .reply:active:after,html.no-touch .bubble.just-media .reply:hover:after,html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:.08;opacity:var(--hover-alpha)}.bubble-primary-color{color:#3390ec;color:var(--message-primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.pinned-message{--custom-emoji-size:calc(var(--font-size) + 2px)!important}.pinned-message-border{flex:0 0 auto;height:2rem;position:relative;width:.125rem}.pinned-message-border-wrapper-1{background:#3390ec;background:var(--primary-color);border-radius:1px;height:2rem;position:relative;top:50%;transform:translateY(-50%);width:.125rem}.pinned-message-border-mask{--mask-height:.375rem;--height:2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:after,.pinned-message-border-mask:before{content:" ";display:block;height:var(--mask-height);left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .pinned-message-border-mask:after,body.animation-level-2 .pinned-message-border-mask:before{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{background:linear-gradient(#fff,transparent);background:linear-gradient(var(--surface-color),transparent);top:0}.pinned-message-border-mask:after{background:linear-gradient(transparent,#fff);background:linear-gradient(transparent,var(--surface-color));bottom:0}.pinned-message-border-mask.mask-bottom:after,.pinned-message-border-mask.mask-top:before{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{background:#3390ec;background:var(--primary-color);bottom:0;content:" ";display:block;left:0;opacity:.4;position:absolute;right:0;top:0}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{background:currentColor;border-radius:1px;left:0;position:absolute;top:0;width:2px}body:not(.animation-level-0) .pinned-message-border-mark,body:not(.animation-level-0) .pinned-message-border-wrapper{transition:transform .25s ease-in-out;will-change:transform}.pinned-message-content{--height:32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{--font-size:var(--font-size-14);--custom-emoji-size:calc(var(--font-size) + 4px);--line-height:calc(var(--font-size) + 4px);align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.pinned-message-content,.reply-content{display:flex;flex-direction:column;flex-grow:1;flex-shrink:1;justify-content:center;margin-left:.5rem;overflow:hidden;pointer-events:none;position:relative}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-subtitle,.pinned-message-title,.reply-subtitle,.reply-title{font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;width:2rem!important}.pinned-message-media,.reply-media{left:0;overflow:hidden;position:absolute;top:.125rem}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.pinned-message-media>video,.reply-media>img,.reply-media>video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.pinned-message i,.reply i{color:#707579;color:var(--secondary-text-color);font-style:normal}.pinned-message img.emoji,.reply img.emoji{height:1rem;vertical-align:top;width:1rem}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{background:#3390ec;background:var(--primary-color);border-radius:1px;height:calc(32px + .25rem);height:calc(var(--font-size)*2 + .25rem);min-width:2px}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0!important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-container{--container-height:3.25rem;align-items:center;cursor:pointer;display:flex;flex:0 0 auto;justify-content:space-between;overflow:visible}.pinned-container.is-floating{background-color:#fff!important;background-color:var(--surface-color)!important;position:absolute!important}.pinned-container.is-floating{height:var(--container-height);left:0;margin:0;max-height:var(--container-height);right:0;top:var(--topbar-height);width:auto}.pinned-container.is-floating .pinned-container-wrapper{border-radius:0;height:100%;max-width:100%;order:0;padding:0 1rem;z-index:0}@media only screen and (max-width:600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width:1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;pointer-events:none;position:relative}.pinned-container .btn-icon{display:flex;flex:0 0 auto;font-size:1.5rem;justify-content:center}.pinned-container-wrapper{align-items:center;border-radius:.25rem;display:flex;flex:1 1 auto;order:1;overflow:hidden;padding:.25rem}.pinned-container-wrapper-utils{align-items:center;display:flex;flex:0 0 auto;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible!important}.pinned-message-media-container{height:2rem;margin-left:-.25rem;position:absolute;width:2rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-subtitle,.pinned-message-title{transform:translateX(0)}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height:var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-subtitle,.pinned-message-content .pinned-message-title{height:calc(var(--height)/2);min-height:calc(var(--height)/2);overflow:visible;position:relative}body.animation-level-2 .pinned-message-content .pinned-message-subtitle,body.animation-level-2 .pinned-message-content .pinned-message-title{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:14px;font-size:var(--font-size-14);line-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:"#"}.pinned-message .animated-counter.is-last:not(.backwards){opacity:0;transform:scale(.68)}.pinned-message .animated-super-row{--translateY:16px}.pinned-message .pinned-message-media{--translateY:32px}.pinned-message.hide~.tgico-pinlist,.pinned-message.is-many .pinned-message-close,.pinned-message.is-many.is-floating .pinned-message-close,.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist,.pinned-message:not(.is-many) .pinned-message-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message-pinlist{order:2}.chat[data-type=discussion] .pinned-message .pinned-container-close{display:none!important}.pinned-audio{--progress-height:.25rem}.pinned-audio.is-floating{--container-height:var(--pinned-audio-height)}.pinned-audio:not(.is-floating){max-width:210px;padding-right:1.75rem;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible!important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0!important}.pinned-audio-ico:before{content:""}.pinned-audio-ico.flip-icon:before{content:""}.pinned-audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-subtitle,.pinned-audio-title{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius:0;--height:var(--progress-height);--translateY:.125rem;bottom:0;left:0;position:absolute;right:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width:1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:active,html.no-touch .pinned-audio-progress:hover{--translateY:0}.pinned-audio-progress .progress-line__filled:after{display:none!important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{bottom:0;height:.5rem;left:0;overflow:hidden;position:absolute;right:0}.pinned-audio-volume{align-items:center;height:2.5rem;position:relative;width:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{bottom:-1rem;content:" ";left:0;position:absolute;right:0;top:100%}.pinned-audio-volume .player-volume__icon{cursor:pointer;display:flex}.pinned-audio-volume .progress-line-container{background-color:#fff;background-color:var(--surface-color);border-radius:10px;box-shadow:0 1px 5px 0 rgba(0,0,0,.15);margin-top:2.25rem;opacity:0;padding:.75rem 1rem;position:absolute;top:100%;transform:rotate(270deg);transition:opacity .2s ease-in-out,visibility 0s .2s;visibility:hidden;width:5rem}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none!important}.pinned-audio-volume:active .progress-line-container,.pinned-audio-volume:hover .progress-line-container{opacity:1;transition:opacity .2s ease-in-out,visibility 0s 0s;visibility:visible}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;bottom:0;display:flex;height:44px;justify-content:flex-start;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transform:translateZ(0);transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),width .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);width:252px;z-index:1}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{align-items:center;display:flex;height:100%;justify-content:flex-start;left:0;max-width:100%;position:absolute;top:0;transform:translateX(0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:672px}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{align-items:center;display:flex;flex:0 0 auto;justify-content:space-between;max-width:100%;padding:7px}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{background-color:#dfe1e5;background-color:var(--border-color);height:25px;width:1px}.markup-tooltip .btn-icon{border-radius:8px!important}.markup-tooltip .btn-icon{height:30px;padding:0;width:30px}.markup-tooltip .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-252px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{align-items:center;display:flex;opacity:0;pointer-events:none;transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;margin:0 .5rem;text-overflow:ellipsis}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{max-height:13.75rem;min-height:72px;min-height:var(--esg-sticker-size);padding:.4375rem;position:relative}.stickers-helper-stickers{border-radius:var(--border-radius);max-width:100%}html.no-touch .stickers-helper .super-sticker:not(.active):active,html.no-touch .stickers-helper .super-sticker:not(.active):hover{background:none}.emoji-helper{padding:.25rem 0!important}.emoji-helper{height:50px}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:after,.emoji-helper .super-emojis:before{content:" ";display:inline-block;width:.25rem}html.no-touch .emoji-helper .super-emoji:not(.active):active,html.no-touch .emoji-helper .super-emoji:not(.active):hover{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec!important;background-color:var(--primary-color)!important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem,100%)}.inline-helper .scrollable{max-height:232px;position:relative}.inline-helper-separator{background-color:#dfe1e5;background-color:var(--border-color);height:1px;margin-left:4rem;width:100%}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:0;border-radius:initial}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem .5rem .5rem 4rem}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{height:3rem!important;width:3rem!important}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{left:.5rem;overflow:hidden;position:absolute}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;color:#fff;display:flex;font-size:1.75rem;justify-content:center;text-transform:uppercase}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-poster,.inline-helper .media-video{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.inline-helper .gif{height:auto!important;width:auto!important}.inline-helper .gif{bottom:0;left:0;position:absolute;right:0;top:0}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(72px,1fr));grid-template-columns:repeat(auto-fill,minmax(var(--esg-sticker-size),1fr));max-width:100%}.inline-helper-results.is-gallery .inline-helper-result{height:auto!important;width:auto!important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;font-weight:var(--font-weight-bold);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inline-helper-result-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:#707579;color:var(--secondary-text-color);display:-webkit-box;font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap}.chat-search{position:absolute!important}.chat-search{left:0;right:0;top:0;z-index:2}.chat-search-footer{align-items:center;background-color:#fff;background-color:var(--surface-color);box-shadow:0 -1px 5px -1px rgba(0,0,0,.21);display:flex;flex:0 0 auto;height:46px;justify-content:space-between;overflow:hidden;padding:0 8px;width:100%}.chat-search-footer .chat-search-count{color:#707579;color:var(--secondary-text-color);margin-left:8px}.chat-search-count:empty,.chat-search-count:not(:empty)+.btn-icon,.chat-search-footer+.chat-input{display:none}.chat-search-controls{display:flex}.chat-search-results{background-color:#fff;background-color:var(--surface-color);height:100%;left:0;max-height:100%;opacity:0;overflow:hidden;position:absolute;top:0;transition:.2s ease;visibility:hidden;width:100%}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{position:absolute!important;width:auto!important}.drops-container{--padding:0px;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding:-4px;align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:12px;color:#a2acb4;display:flex;flex:1 1 auto;flex-direction:column;justify-content:center;max-width:100%;pointer-events:all;position:relative;transition:color .2s ease-in-out;width:100%}.drop-outline-wrapper{bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none;position:absolute;right:var(--wrapper-padding);top:var(--wrapper-padding)}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;stroke-dashoffset:0;transition:stroke .2s ease-in-out}.drop.is-dragover .drop-outline-path{stroke:#3390ec;stroke:var(--primary-color);animation:drop-outline-move .5s linear infinite}.drop-icon{font-size:6rem}.drop-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height:670px){.drop-icon{font-size:0}.drop-header{margin-top:0}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.bot-commands{animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;padding:var(--offset) var(--offset) 0!important;position:absolute!important;transition:none!important;visibility:visible!important;width:auto!important}.bot-commands{--border-radius-padding:24px;--offset:.5rem;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;pointer-events:none;right:calc(var(--offset)*-1)}body.animation-level-2 .bot-commands{display:flex!important}.bot-commands .scrollable{max-height:207px!important}.bot-commands .scrollable{background-color:#fff;background-color:var(--surface-color);border-radius:inherit;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);height:auto;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{opacity:1;transform:translateY(0)}.bot-commands-list{border-radius:inherit;height:var(--height);padding-bottom:0;width:100%}.bot-commands-list-element{border-radius:0!important}.bot-commands-list-element{align-items:flex-start;flex-direction:column;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{left:.75rem;position:absolute}.bot-commands-list-element-description,.bot-commands-list-element-name{font-size:.875rem;line-height:18px;line-height:var(--line-height-14);margin-left:0}.crop .overlay::-moz-selection,.crop-component::-moz-selection{background:transparent}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{display:block;height:auto;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center;width:auto}.crop-image{display:block;pointer-events:none;position:relative}.crop-component{background-color:#fff;margin:0 auto;overflow:hidden;position:relative;z-index:999}.crop-component>img{max-width:100%}.crop-overlay{border-radius:50%;box-sizing:content-box;overflow:hidden;position:absolute;z-index:999}.crop-overlay:active,html.no-touch .crop-overlay:hover{cursor:move}.crop-overlay-image{display:block;position:absolute}.crop-overlay-color{background-color:hsla(0,0%,100%,.7);border-radius:8px;height:100%;left:0;position:absolute;top:0;width:100%}.crop.is-forum .crop-overlay{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}.sidebar-header{align-items:center;background-color:#fff;background-color:var(--surface-color);cursor:default;display:flex;flex:0 0 auto;justify-content:space-between;min-height:3.5rem;padding-left:1rem;padding-right:1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding-left:.5rem;padding-right:.5rem}}[dir=ltr] .sidebar-header__title{padding-left:1.5rem}[dir=rtl] .sidebar-header__title{padding-right:1.5rem}.sidebar-header__title{color:#000;color:var(--primary-text-color);flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}[dir=ltr] .sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}[dir=rtl] .sidebar-header .btn-icon+.btn-icon{margin-right:.5rem}.sidebar-header-right{flex:0 0 auto}.scrollable-y-bordered .sidebar-header{position:relative}.scrollable-y-bordered .sidebar-header:after{background-color:#dfe1e5;background-color:var(--border-color);bottom:-1px;content:" ";height:1px;left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .scrollable-y-bordered .sidebar-header:after{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.scrollable-y-bordered:not(.scrolled-top) .sidebar-header:after{opacity:1}.sidebar-close-button{overflow:inherit!important}.sidebar-close-button{flex:0 0 auto;height:2.5rem;width:2.5rem}.sidebar-content{display:flex;flex:1 1 auto;height:100%;max-height:100%;overflow:hidden;position:relative;width:100%}.profile-avatars-container{cursor:pointer;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}html.no-touch .profile-avatars-container:active .profile-avatars-arrow,html.no-touch .profile-avatars-container:hover .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0!important}.profile-avatars-avatars{display:flex;flex-wrap:nowrap;height:100%;position:absolute;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;width:100%}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0)}.profile-avatars-avatars:before{bottom:0;content:" ";left:0;right:0;top:0}.profile-avatars-avatar{background-color:#000;display:flex;height:inherit;min-height:100%;min-width:100%;position:relative;width:inherit}.profile-avatars-avatar .avatar-photo{height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none;width:100%}.profile-avatars-gradient{background:linear-gradient(1turn,rgba(0,0,0,.3) 8.98%,transparent);bottom:0;height:80px;left:0;position:absolute;right:0}[dir=ltr] .profile-avatars-info{left:1.5rem}[dir=rtl] .profile-avatars-info{right:1.5rem}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;pointer-events:none;position:absolute}[dir=ltr] .profile-avatars-info .profile-name,[dir=ltr] .profile-avatars-info .profile-subtitle{text-align:left}[dir=rtl] .profile-avatars-info .profile-name,[dir=rtl] .profile-avatars-info .profile-subtitle{text-align:right}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .premium-icon{color:#fff}.profile-avatars-info .verified-icon-background{fill:#fff}.profile-avatars-info .verified-icon-check{visibility:hidden}.profile-avatars-info .premium-icon,.profile-avatars-info .profile-subtitle,.profile-avatars-info .verified-icon{opacity:.7}.profile-avatars-info .online{color:inherit!important}.profile-avatars-tabs{display:flex;height:.125rem;left:.375rem;pointer-events:none;position:absolute;right:.375rem;top:.5rem}.profile-avatars-tab{background-color:#fff;border-radius:4px;flex:1 1 auto;height:inherit;margin:0 .125rem;opacity:.2;transition:opacity .2s ease-in-out}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{bottom:0;left:0;opacity:0;position:absolute;top:0;width:33.3333333333%}.profile-avatars-arrow:before{color:#fff;font-size:2.1875rem;left:.625rem;position:absolute;top:50%;transform:translateY(-50%)}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover{opacity:1!important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{display:flex;flex:0 0 auto;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem;position:relative}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width:600px){.profile-button{border-radius:0}}[dir=ltr] .profile-change-avatar{right:1.25rem}[dir=rtl] .profile-change-avatar{left:1.25rem}.profile-change-avatar{position:absolute!important;transition:none!important}.profile-change-avatar{--size:3.375rem;top:calc(var(--size)/-2);transform:none}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{align-items:flex-end;color:#000;color:var(--primary-text-color);display:flex;font-size:20px;font-size:var(--font-size-20);font-weight:500;font-weight:var(--font-weight-bold);line-height:26px;line-height:var(--line-height-20);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-moz-min-content;min-width:min-content;vertical-align:inherit}.profile-name .peer-title{overflow:hidden;text-overflow:ellipsis;word-break:break-word}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem;justify-content:center;margin-bottom:.875rem;margin-top:1px;text-align:center}@media only screen and (max-width:600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{display:block;margin:.5rem auto 10px}@media only screen and (max-width:600px){.profile-avatar{--size:100px;--multiplier:.54;margin:0 auto 10px}}.profile-avatar,.profile-name,.profile-subtitle{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size:3rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;content:" ";height:1px;left:0;position:absolute;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size:var(--scrollable-size,3rem);--padding-horizontal:0px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);display:flex;flex-direction:row;height:var(--size);justify-content:space-around;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.menu-horizontal-div:not(.no-stripe):after,.menu-horizontal-div:not(.no-stripe):before{content:" ";flex:0 0 auto;width:var(--padding-horizontal)}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px 10px 0 0}.menu-horizontal-div-item{transition:none!important}.menu-horizontal-div-item{align-items:center;border-radius:0;cursor:pointer;display:flex;flex:1 1 auto;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;justify-content:center;line-height:1.3125;line-height:var(--line-height);padding:0 1rem;position:relative;text-align:center}html.no-touch .menu-horizontal-div-item:active,html.no-touch .menu-horizontal-div-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle,html.no-touch .menu-horizontal-div-item.active:active,html.no-touch .menu-horizontal-div-item.active:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{align-items:center;display:inline-flex;overflow:visible;pointer-events:none;position:relative}.menu-horizontal-div i{background-color:#3390ec;background-color:var(--primary-color);border-radius:.1875rem .1875rem 0 0;bottom:-.8125rem;box-sizing:content-box;height:.1875rem;left:0;opacity:0;pointer-events:none;position:absolute;transform-origin:left;width:100%;z-index:1}.menu-horizontal-div i.animate{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{display:grid;grid-template-columns:100%;grid-template-rows:100%;min-width:100%;width:100%}.tabs-container .tabs-tab{background-color:#f4f4f5;background-color:var(--background-color);display:none;flex-direction:column;grid-column-start:1;grid-row-start:1;overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none!important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4,0,.2,1),filter .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex:1 1 auto;flex-direction:column;max-width:420px;min-width:min(100%,18rem)}@media only screen and (max-width:600px){#column-left{max-width:100%;width:100%}body:not(.is-left-column-shown) #column-left{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px){#column-left{overflow:visible}[dir=ltr] #column-left:after{right:-1px}[dir=rtl] #column-left:after{left:-1px}#column-left:after{background-color:#dfe1e5;background-color:var(--border-color);content:" ";display:block;height:100vh;position:absolute;top:0;width:1px;z-index:2}}@media only screen and (min-width:601px)and (max-width:925px){#column-left{display:flex;left:0;max-width:none;position:fixed;top:0;transform:translate3d(-5rem,0,0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:26.5rem}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width:926px){#column-left{display:flex}}@media only screen and (max-width:1275px){#column-left{flex:2}}@media only screen and (min-width:1681px){html.is-safari #column-left{max-width:418.75px}}#column-left .item-main .menu-horizontal-scrollable{background-color:#fff;background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .item-main .menu-horizontal-scrollable .scrollable{position:relative}[dir=ltr] #column-left .item-main .menu-horizontal-scrollable .badge{margin-left:5px}[dir=rtl] #column-left .item-main .menu-horizontal-scrollable .badge{margin-right:5px}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--scrollable-size));position:relative}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .item-main .menu-horizontal-div{position:relative!important}#column-left .item-main .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;z-index:0}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .item-main .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .item-main .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main{--offset-top:0;background-color:#fff;background-color:var(--surface-color)}[dir=ltr] #column-left .item-main .input-search .selector-user{left:6px}[dir=rtl] #column-left .item-main .input-search .selector-user{right:6px}[dir=ltr] #column-left .item-main .input-search .selector-user{margin-left:0}[dir=rtl] #column-left .item-main .input-search .selector-user{margin-right:0}#column-left .item-main .input-search .selector-user{position:absolute!important}#column-left .item-main .input-search .selector-user{height:30px;line-height:1.875rem;top:6px;z-index:1}[dir=ltr] #column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}[dir=rtl] #column-left .item-main .input-search.is-picked .input-search-input{padding-right:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block!important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}[dir=ltr] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}[dir=rtl] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{right:38px}[dir=ltr] #column-left .item-main .search-helper{margin-left:28px}[dir=rtl] #column-left .item-main .search-helper{margin-right:28px}#column-left .item-main .search-helper{display:flex}@media only screen and (max-width:600px){[dir=ltr] #column-left .item-main .search-helper{margin-left:20px}[dir=rtl] #column-left .item-main .search-helper{margin-right:20px}}#column-left .item-main .search-helper .selector-user{font-size:14px;margin-top:7px}html.no-touch #column-left .item-main .search-helper .selector-user:active,html.no-touch #column-left .item-main .search-helper .selector-user:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none!important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{position:relative!important}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto!important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%,-50%)}#column-left #chatlist-container{background-color:#fff;background-color:var(--surface-color);max-height:100%;position:relative}#column-left #chatlist-container.has-filters .connection-status-bottom{height:calc(100% + var(--offset-top)*-1)}#column-left #folders-container{flex:1 1 auto}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .dialogs-placeholder-canvas{position:absolute;top:0;z-index:2}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{align-items:center;display:flex;flex:0 0 auto;height:2.5rem;justify-content:center;position:relative;width:2.5rem}#column-left .sidebar-header__btn-container>.btn-icon{bottom:0;left:0;margin:0;opacity:0;position:absolute;right:0;top:0;visibility:hidden;z-index:4}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width:600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);min-width:260px}[dir=ltr] #column-left .sidebar-tools-button .btn-menu .archived-count{margin-left:.625rem}[dir=rtl] #column-left .sidebar-tools-button .btn-menu .archived-count{margin-right:.625rem}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end}@media only screen and (max-width:600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}[dir=ltr] #column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:.375rem}[dir=rtl] #column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-left:.375rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding:0 0 1px}#column-left .search-group-people .chatlist:after,#column-left .search-group-people .chatlist:before{content:" ";display:inline-block;flex:0 0 auto;width:.3125rem}#column-left .search-group-people .chatlist-chat{padding:0!important}#column-left .search-group-people .chatlist-chat{align-items:center;display:flex;flex:0 0 auto;flex-direction:column;height:6.125rem;justify-content:flex-end;max-width:4.875rem;width:4.875rem}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .dialog-title{max-width:65px;padding-bottom:.75rem}#column-left .search-group-people .dialog-title .user-title{font-size:.75rem!important}#column-left .search-group-people .dialog-title .peer-title{font-weight:400!important;font-weight:var(--font-weight-normal)!important}[dir=ltr] #column-left .search-group-people .dialog-avatar{left:auto!important}[dir=rtl] #column-left .search-group-people .dialog-avatar{right:auto!important}#column-left .search-group-people .dialog-avatar{top:.75rem!important}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){[dir=ltr] #column-left .search-group-people .search-group-scrollable{margin-left:-7px}[dir=rtl] #column-left .search-group-people .search-group-scrollable{margin-right:-7px}#column-left .search-group-people .search-group-scrollable{margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{visibility:visible!important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{position:fixed!important}#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;right:14px;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{flex:0 0 auto;overflow:hidden;padding:0 .5rem .5rem;width:100%}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}[dir=ltr] #column-left .connection-status-button{padding-left:4.5rem}[dir=rtl] #column-left .connection-status-button{padding-right:4.5rem}[dir=ltr] #column-left .connection-status-button{text-align:left}[dir=rtl] #column-left .connection-status-button{text-align:right}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}[dir=ltr] #column-left .connection-status-button .preloader-container{left:1rem}[dir=rtl] #column-left .connection-status-button .preloader-container{right:1rem}#column-left .connection-status-button .preloader-container{height:1.5rem;right:auto;width:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top:0px;background-color:#fff;background-color:var(--surface-color);bottom:0;display:flex;flex-direction:column;height:100%;left:0;overflow:hidden;position:absolute;right:0;top:0;transform:translateY(var(--offset-top))}#column-left .input-wrapper{flex:0 0 auto;margin:.75rem 0;max-width:100%;padding:0 .75rem;width:420px}@media only screen and (max-width:600px){#column-left .input-wrapper{width:100%}}#search-container{top:var(--offset-top)!important}#search-container{display:flex}#search-container .scrollable-y{flex:1 1 auto;position:relative}.edit-profile-container .sidebar-content,.new-channel-container .sidebar-content,.new-group-container .sidebar-content{flex-direction:column}.edit-profile-container .chatlist-container,.new-channel-container .chatlist-container,.new-group-container .chatlist-container{flex:1 1 auto}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{margin-left:23px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{margin-right:23px}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{padding-right:24px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{padding-left:24px}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:14px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}.settings-container .profile-avatars-container{height:15rem;padding-bottom:0}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:0 auto;max-width:20rem;text-align:center}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width:600px){.edit-folder-container .input-wrapper{padding:0 16px;width:100%}}.edit-folder-container .sidebar-left-section{padding-bottom:0}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-categories .checkbox-field{right:1.125rem!important}.folder-categories .checkbox-field{position:absolute}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}[dir=ltr] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}[dir=rtl] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-right:26px}.search-group-recent .search-group__name{align-items:center;display:flex;justify-content:space-between}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width:600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width:601px){.search-group-recent.search-group.search-group-contacts{padding:0 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{padding-top:0!important}.sidebar-left-section.with-fake-delimiter{box-shadow:none}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0!important}@media only screen and (max-width:600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width:601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}[dir=ltr] .sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}[dir=rtl] .sidebar-left-section-content>.checkbox-field .checkbox-box{right:auto}@media only screen and (max-width:600px){.sidebar-left-section-content>.btn-primary,.sidebar-left-section-content>.checkbox-ripple{border-radius:0}}.sidebar-left-section-content.full-width{margin:0!important}.sidebar-left-section-content>.media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width:600px){.sidebar-left-section-name{font-size:.875rem;padding:.5rem 1rem}}.sidebar-left-section-caption{color:#707579;color:var(--secondary-text-color);font-size:1rem;line-height:1.3125;line-height:var(--line-height);margin-top:1rem;padding:0 1rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{font-size:.875rem;margin:.5rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{align-items:center;display:flex;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{pointer-events:none!important}.sidebar-left-section-disabled{opacity:.25}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500;font-weight:var(--font-weight-bold)}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,#poll-results-container,#search-gifs-container,#search-private-container,#stickers-container,.add-members-container{background-color:#fff!important;background-color:var(--surface-color)!important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff!important;background-color:var(--surface-color)!important}.two-step-verification .sidebar-left-section{box-shadow:none!important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{margin-bottom:1.125rem;margin-left:auto;margin-right:auto;max-width:342px;text-align:center}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem!important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{height:168px;margin:.625rem auto 1.1875rem;width:168px}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{height:157px;margin:1.125rem auto 1.8125rem;width:157px}.two-step-verification-hint .media-sticker-wrapper{height:160px;margin:.5rem auto 2.25rem;width:160px}.two-step-verification-email .media-sticker-wrapper{height:160px;margin:.5625rem auto 2.1875rem;width:160px}.two-step-verification-set .media-sticker-wrapper{height:160px;margin:1rem auto 1.3125rem;width:160px}[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{right:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width:601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row-title:first-child{font-weight:500;font-weight:var(--font-weight-bold)}.active-sessions-container .row-title-right{color:#707579;color:var(--secondary-text-color);font-size:12px;font-size:var(--font-size-12);line-height:16px;line-height:var(--line-height-12)}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (min-width:601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height:2px;--color:var(--primary-color);--border-radius:4px;--thumb-size:12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .grid-item:after{border:3px solid #3390ec;border:3px solid var(--primary-color);bottom:0;content:" ";display:block;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(.91)}.background-container .grid-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .grid-item-media.is-pattern{background-color:#000}.background-container .grid-item-media.is-pattern .media-photo{mix-blend-mode:overlay}.background-container .grid .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-container .grid .preloader-container{z-index:1}.background-container .background-colors-canvas{height:100%;-webkit-mask-position:center;-webkit-mask-size:contain;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{width:21rem!important}.empty-placeholder{line-height:1.3125;line-height:var(--line-height);margin:0 auto;padding:0 1rem;position:relative;text-align:center;top:40%;transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;user-select:none}.empty-placeholder .media-sticker-wrapper{height:128px;margin:0 auto 1.9375rem;position:relative;width:128px}.empty-placeholder-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}[dir=ltr] .empty-placeholder .btn-control:before{margin-right:.625rem}[dir=rtl] .empty-placeholder .btn-control:before{margin-left:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}.is-forum-visible .can-have-forum .input-search,.is-forum-visible .can-have-forum .row-row,.is-forum-visible .can-have-forum .sidebar-header__title{opacity:0}.is-forum-visible .folders-tabs-scrollable{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none}.is-forum-visible.backwards .can-have-forum .input-search,.is-forum-visible.backwards .can-have-forum .row-row,.is-forum-visible.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.backwards .folders-tabs-scrollable{opacity:1}.is-forum-visible.animating .can-have-forum .input-search,.is-forum-visible.animating .can-have-forum .row-row,.is-forum-visible.animating .can-have-forum .sidebar-header__title,.is-forum-visible.animating .folders-tabs-scrollable{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.is-forum-visible.animating.backwards .can-have-forum .input-search,.is-forum-visible.animating.backwards .can-have-forum .row-row,.is-forum-visible.animating.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.animating.backwards .folders-tabs-scrollable{transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}#column-right{overflow:visible;overflow:initial;position:relative}@media only screen and (min-width:601px)and (max-width:1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width:600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw,0,0)}}@media only screen and (min-width:601px){#column-right{position:absolute;right:0;transform:translate3d(var(--right-column-width),0,0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:calc(var(--right-column-width));z-index:3}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transform:translateZ(0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width:1276px){#column-right{border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);transform:translate3d(calc(var(--right-column-width) + 1px),0,0);width:calc(var(--right-column-width) + 1px)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}@media only screen and (min-width:601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}}#column-right #search-private-container .chatlist-container{flex:1 1 auto;position:relative}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{margin:.75rem 0;max-width:100%;padding:0 .75rem;width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0;perspective-origin:0 0}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .profile-content.is-me .profile-name{margin-bottom:.9375rem}.shared-media-container .profile-content.is-me .profile-subtitle{display:none}.shared-media-container .search-super{min-height:calc(100vh - 56px);min-height:calc(var(--vh, 1vh)*100 - 56px);top:100%}.shared-media-container .search-super-tabs{--padding-horizontal:0}.shared-media-container .search-super-tabs .menu-horizontal-div-item{border-radius:0!important}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{align-items:center;display:flex}.shared-media-container .btn-corner.menu-open:before{content:""}@media only screen and (max-width:600px){.shared-media-container .btn-corner{position:fixed!important}.shared-media-container .btn-corner{bottom:14px;height:54px;right:14px;width:54px;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;max-width:100%;min-height:100%;position:absolute;width:100%}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:24px 0 0 24px}@media only screen and (max-width:600px){.search-super .search-super-month-name{padding:18px 0 0 16px}}.search-super.sliding{max-height:none!important}.search-super-tabs{flex:1 1 auto;width:auto}.search-super-tabs-scrollable{box-shadow:none!important;position:sticky!important}.search-super-tabs-scrollable{background-color:#fff;background-color:var(--surface-color);top:0;z-index:2}.search-super-tabs-scrollable:before{background-color:inherit;content:" ";display:block;height:1px;left:0;position:absolute;top:0;width:100%;z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{display:flex;position:relative}.search-super-tabs-container{flex:1 1 auto;grid-template-rows:100%;min-height:calc(100% - 49px)}.search-super-tabs-container>div{background-color:#fff!important;background-color:var(--surface-color)!important}.search-super-tabs-container>div{min-height:150px;position:relative}.search-super-tabs-container>div>div:first-child{min-height:calc(100vh - 111px);transform:translateY(0)}.search-super-tabs-container .preloader{position:absolute!important}.search-super-tabs-container .preloader{padding:0;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .audio-title,.search-super .document-name,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:12px;margin-left:8px;margin-top:3px}.search-super-content-media .search-super-month-name{border:none;padding:9px 0 7px 24px}.search-super-content-media .video-time{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:4px;color:#fff;font-size:12px;height:18px;left:5px;line-height:18px;padding:0 6px 0 5px;position:absolute;top:4px;z-index:2}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{position:absolute!important}.search-super .checkbox-field{margin:0;z-index:2}.search-super-content-media .search-super-month-items{grid-gap:1px;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);padding-top:1px;width:100%}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width:600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{--icon-size:3rem;--icon-margin:.75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-download,.search-super-content-files .document-ico{border-radius:5px!important}.search-super-content-files .document-name{font-weight:400;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.search-super-content-links .search-super-item{cursor:pointer;display:flex;flex-direction:column;justify-content:flex-start;min-height:4.375rem;overflow:hidden;padding-left:4.4375rem;position:relative}.search-super-content-links .row-media{border-radius:.375rem;height:3rem;left:.6875rem;overflow:hidden;position:absolute;width:3rem}.search-super-content-links .row-media.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);color:#fff;display:flex;font-size:2rem;justify-content:center;text-transform:uppercase}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:static}.search-super-content-links .anchor-url:last-child:before{bottom:0;content:" ";cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:1}.search-super-content-links .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{--offset-left:0!important;margin:2rem 0 0 -1.75rem!important;padding:0!important}@media only screen and (min-width:601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width:600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 20px}@media only screen and (max-width:600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:normal;margin-bottom:1.5rem}@media only screen and (min-width:601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-bottom:.5rem;padding-top:.5rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent!important}.search-super-selection-container{align-items:center;bottom:0;display:flex;justify-content:space-between;left:0;opacity:0;padding:0 1rem;position:absolute;right:0;top:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width:600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);margin-left:1.5rem;text-transform:capitalize;white-space:nowrap}#search-container .search-group.is-short .chatlist-chat:nth-child(n+4),#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time{display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{cursor:pointer;display:flex;flex-direction:column;height:140px}#stickers-container .sticker-set-name{font-weight:500;font-weight:var(--font-weight-bold)}#stickers-container .sticker-set-count{color:#707579;color:var(--secondary-text-color);font-size:14px}#stickers-container .sticker-set-header{display:flex;justify-content:space-between;padding-bottom:12px;padding-left:16px}#stickers-container .sticker-set-button{border-radius:16px;font-size:15px;font-weight:400;height:30px;margin-right:16px;padding-left:12px;padding-right:13px;transition:width .2s;width:auto}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{height:68px;position:relative;width:68px}#stickers-container .sticker-set-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}#stickers-container .sticker-set-sticker img{max-height:100%;max-width:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);display:flex;font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);justify-content:space-between;margin:0;padding:0 16px 8px;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-answer{padding:0 24px 8px}}#poll-results-container .poll-results-more{margin:0 .5rem;width:auto}@media only screen and (max-width:600px){#poll-results-container .poll-results-more{border-radius:0;margin:0}}#poll-results-container .poll-results h3{font-size:20px;margin-bottom:16px;margin-top:15px;padding:0 16px}@media only screen and (min-width:601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{display:block!important}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem!important}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem!important}.edit-contact-container .avatar-placeholder{filter:none!important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem!important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem!important}.media-viewer{align-items:center;background:rgba(0,0,0,.88);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0}@media only screen and (max-width:600px){.media-viewer{background:#000}}.media-viewer-author{align-items:center;cursor:pointer;display:flex;height:100%}@media only screen and (max-width:600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width:600px){.media-viewer-userpic{display:none}}.media-viewer-name{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.0625rem 0}@media only screen and (min-width:601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.media-viewer-buttons{display:flex;flex-flow:row nowrap;padding:.5rem .75rem;position:absolute;right:0;top:0}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:active,html.no-touch .media-viewer-buttons .btn-icon:hover{color:#fff}@media only screen and (max-width:600px){.media-viewer-buttons{display:none}}.media-viewer-content{flex-direction:column;height:100%;justify-content:center}.media-viewer-container,.media-viewer-content{align-items:center;display:flex;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;flex:1 1 auto;position:relative}.media-viewer-media{visibility:hidden}.media-viewer-caption{background-color:transparent;bottom:0;color:#fff;left:0;line-height:1.3125;line-height:var(--line-height);opacity:0;overflow:hidden;padding:.5rem .5rem 0;position:absolute;right:0;text-align:center;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word;z-index:4}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9!important}.media-viewer-caption .scrollable{height:6rem;margin:0 auto;max-height:6rem;max-width:50rem;padding:.5rem .875rem;position:relative}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width:600px){.media-viewer-caption{bottom:1.0625rem;text-align:inherit;transform:translateZ(0);width:100%}.media-viewer-caption .scrollable{height:auto;padding:0 .5rem}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0,-69px,0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{opacity:1!important}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{background-color:#000}}.media-viewer-caption.is-focused{opacity:1!important}.media-viewer-caption.is-focused{background-color:#000}.media-viewer-switcher{cursor:pointer;height:calc(100% - 7.5rem);left:0;position:absolute;top:3.75rem;width:7rem;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width:600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-next-button,.media-viewer-prev-button{color:#fff;cursor:pointer;font-size:2rem;left:1rem;opacity:0;position:absolute;top:50%;transform:translateY(-50%) rotate(90deg);transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width:601px){.media-viewer-next-button,.media-viewer-prev-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width:601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{min-height:auto!important;position:fixed!important}.media-viewer-mover{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;overflow:hidden;top:0;transform:translateZ(0) scaleX(1);transform-origin:top left}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}@media only screen and (max-width:600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{height:100%;left:0;position:absolute;top:0;width:100%}.media-viewer-mover>svg{height:100%;width:100%}.media-viewer-mover .canvas-thumbnail,.media-viewer-mover img,.media-viewer-mover video{height:100%;max-height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;opacity:1;position:absolute;transition:var(--open-duration) opacity;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.media-viewer-mover svg img,.media-viewer-mover svg video{position:static}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration)/8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none!important}.media-viewer-mover.center{left:50%!important;top:50%!important;transform:translate3d(-50%,-50%,0)!important}.media-viewer-mover.center{max-height:calc(100vh - 15rem);max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-width:100vw!important;width:100%!important}.media-viewer-mover.center{max-height:calc(100vh - 120px);max-height:calc(var(--vh, 1vh)*100 - 120px)}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center .canvas-thumbnail,.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{-o-object-fit:contain;object-fit:contain;width:auto}.media-viewer-mover.hiding .canvas-thumbnail,.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{align-items:center;display:flex;height:3.5rem;justify-content:space-between;left:0;padding:0 1.25rem;position:absolute;right:0;top:0;z-index:5}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover{opacity:1}.media-viewer-topbar-left{align-items:center;display:flex}@media only screen and (max-width:600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{align-items:center;border-radius:0;display:flex;height:100%;justify-content:center;position:absolute;transform:scaleX(1);width:100%}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{position:fixed!important}.media-viewer-whole{--open-duration:.2s;--move-duration:.35s;display:block;height:100%;left:0;top:0;transition:visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}body.animation-level-0 .media-viewer-whole{--open-duration:0s;--move-duration:0s}.media-viewer-whole.active{transition-delay:0s;visibility:visible}.media-viewer-whole.active .media-viewer-appear,.media-viewer-whole.active .overlays{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .media-viewer-appear,body.animation-level-2 .media-viewer-whole.active .overlays{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width:600px){.media-viewer-whole .btn-menu-toggle:not(.playback-rate){color:hsla(0,0%,100%,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{background-color:hsla(207,4%,46%,.2)!important}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important}.media-viewer-whole.hide-caption .media-viewer-caption{pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards .canvas-thumbnail,.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;user-select:none}.media-viewer-movers{bottom:0;left:0;position:absolute;right:0;top:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:""}.tgico-zoom.zoom-in:before{content:""}.zoom-container{align-items:center;background-color:rgba(0,0,0,.4);border-radius:12px;bottom:1.25rem;display:flex;height:3.375rem;justify-content:space-between;left:50%;opacity:1;padding:.5rem;position:absolute;transform:translateX(-50%);width:17.125rem;z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{opacity:.4;pointer-events:none}.zoom-container .progress-line{--color:#fff;--height:2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.media-viewer-whole:not(.active) .zoom-container,.zoom-container:not(.is-visible){opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0!important}.zoom-container.is-visible~.media-viewer-caption{pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0!important}.overlays{position:fixed!important}.overlays{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{background:#fff;background:var(--surface-color);display:flex;flex:1 1 auto;flex-direction:column;height:min(282px,calc(100vh - 135px));height:min(282px,calc(var(--vh)*100 - 135px));max-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{position:absolute!important;width:23.875rem!important}.emoji-dropdown{-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:1.25rem;bottom:5.125rem;box-shadow:0 5px 10px 5px rgba(16,35,47,.14);height:26.25rem;left:.8125rem;max-height:26.25rem;opacity:0;transform:scale(0);transform-origin:0 100%;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);z-index:3}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{height:100%;max-width:100%;overflow:hidden;width:100%}.emoji-dropdown .emoji-tabs{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);justify-content:center}.emoji-dropdown .emoji-tabs:after{content:none}.emoji-dropdown .emoji-tabs-search{margin-left:.5rem!important}.emoji-dropdown .emoji-tabs-search{left:0;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:.5rem!important}.emoji-dropdown .emoji-tabs-delete{position:absolute;right:0}.emoji-dropdown .emoji-tabs .menu-horizontal-div-item{margin:0 .75rem}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .stickers-padding .category-items{gap:.25rem;padding:0 .1875rem}.emoji-dropdown #content-gifs .scrollable-y{padding:0 .1875rem}.emoji-dropdown .gifs-masonry{border-radius:10px;overflow:hidden}.emoticons-container{background-color:transparent;flex-direction:column;height:100%;min-height:100%}.emoticons-menu{--item-size:1.875rem;align-items:center;min-height:3.0625rem;padding:0 .3125rem;width:100%;z-index:4}.emoticons-menu,.emoticons-menu-wrapper{background-color:transparent;height:3.0625rem}.emoticons-menu-wrapper{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);max-width:100%;padding:0;position:relative}.emoticons-menu:after{content:" ";display:block;flex:0 0 auto;height:1px;width:.1875rem}.emoticons-menu .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:var(--item-size);line-height:var(--item-size);margin:0 .3125rem;padding:0;width:var(--item-size)}.emoticons-menu .menu-horizontal-div-item.not-local{border-radius:.25rem!important}.emoticons-menu .menu-horizontal-div-item.not-local{--item-size:2.375rem;padding:.25rem}.emoticons-menu .menu-horizontal-div-item.active{background-color:rgba(0,0,0,.06)!important;background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-div-item.active,html.no-touch .emoticons-menu .menu-horizontal-div-item:active,html.no-touch .emoticons-menu .menu-horizontal-div-item:hover{color:rgba(0,0,0,.8)!important;color:rgba(var(--primary-text-color-rgb),.8)!important}.emoticons-menu .menu-horizontal-div-item-padding{height:100%;position:relative;width:100%}.emoticons-menu .menu-horizontal-div-item.active:not(.tgico){background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.emoticons-menu .menu-horizontal-inner{border-radius:15px;flex:0 0 auto;margin:0 .3125rem;overflow:hidden;width:1.875rem}html.is-safari .emoticons-menu .menu-horizontal-inner{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner{transition:width .2s ease-in-out}.emoticons-menu .menu-horizontal-inner-scroll{align-items:center;display:flex;height:100%;position:relative;width:8.5rem}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{margin:0!important}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transform:scale(1)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transition:transform .2s ease-in-out!important}.emoticons-menu .menu-horizontal-inner.active{background-color:rgba(0,0,0,.06)!important;background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-inner.active{width:8.5rem}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item{transform:scale(.8)}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item.active{background-color:transparent!important}.emoticons-menu .menu-horizontal-inner:not(.active){cursor:pointer}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-inner-scroll{pointer-events:none}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-div-item:first-child{pointer-events:all}.emoticons-content{flex:1;padding:0;position:relative}.emoticons-content .emoji-category{position:relative}.emoticons-content .sticky_sentinel--top{height:1px;top:0}.emoticons-content .category-title{color:rgba(0,0,0,.42);color:rgba(var(--primary-text-color-rgb),.42);cursor:pointer;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:1.1875rem;padding:.75rem .875rem .375rem;position:relative;text-align:center;width:100%}.emoticons-content .category-title .btn-icon{font-size:1.25rem;pointer-events:all;position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}.emoticons-content:not(.has-premium) .is-premium-set .category-title:before{content:"";line-height:inherit;margin-right:.125rem;vertical-align:middle}.emoji-padding .super-emojis{padding:0 .5rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{height:0;opacity:0;width:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{display:none;height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover{scrollbar-color:rgba(0,0,0,.2) transparent;scrollbar-color:var(--scrollbar-color) transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);background-color:rgba(0,0,0,.2);background-color:var(--scrollbar-color);border-radius:10px;max-height:12.5rem;min-height:5rem;opacity:1}.no-scrollbar::-webkit-scrollbar,.scrollable-x::-webkit-scrollbar{display:none}.scrollable{-webkit-overflow-scrolling:touch;bottom:0;height:100%;left:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;position:absolute;right:0;top:0;width:100%}.scrollable.scrollable-x{-ms-overflow-style:none;overflow-x:auto;scrollbar-width:none}.scrollable.scrollable-y{-ms-overflow-style:none;overflow-y:auto;overflow-y:overlay;scrollbar-color:transparent transparent;scrollbar-width:thin;transform:translateZ(0)}.scrollable.scrollable-y.scrollable-y-bordered{border-bottom:1px solid transparent;border-top:1px solid transparent}body.animation-level-2 .scrollable.scrollable-y.scrollable-y-bordered{transition:border-top-color .3s cubic-bezier(.4,0,.2,1),border-bottom-color .3s cubic-bezier(.4,0,.2,1);transition:border-top-color var(--transition-standard-in),border-bottom-color var(--transition-standard-in)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-top){border-top-color:#dfe1e5;border-top-color:var(--border-color)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-bottom){border-bottom-color:#dfe1e5;border-bottom-color:var(--border-color)}.scrollable-padding{height:100%;min-width:100%}@keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}.selector{display:flex;flex-direction:column;height:100%;width:100%}.selector .selector-search-section{margin-bottom:0!important;padding:0!important}.selector .selector-search-section{position:relative;z-index:1}.selector-search-container{flex:0 0 auto;max-height:132px;overflow:hidden;position:relative}.selector-search-container .scrollable{max-height:inherit;position:relative}.selector-search{display:flex;flex-flow:wrap;padding-left:1rem;padding-right:1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}[dir=ltr] .selector-user{padding-right:17px}[dir=rtl] .selector-user{padding-left:17px}[dir=ltr] .selector-user{margin-left:-.25rem;margin-right:.75rem}[dir=rtl] .selector-user{margin-left:.75rem;margin-right:-.25rem}.selector-user{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:1.5rem;color:#000;color:var(--primary-text-color);flex:0 0 auto;font-size:1rem;height:2rem;line-height:2rem;margin-bottom:7px;max-width:11.25rem;overflow:hidden;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:active,html.no-touch .selector-user:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:active .selector-user-avatar:after,html.no-touch .selector-user:hover .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{animation:scaleIn .1s ease forwards;animation-direction:reverse}[dir=ltr] .selector-user-avatar{margin-right:8px}[dir=rtl] .selector-user-avatar{margin-left:8px}.selector-user-avatar{border-radius:50%!important}.selector-user-avatar{float:left;overflow:hidden;position:relative}.is-rtl .selector-user-avatar{float:right}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}[dir=ltr] .selector-user-avatar:after{left:0}[dir=rtl] .selector-user-avatar:after{right:0}.selector-user-avatar:after{line-height:32px!important}.selector-user-avatar:after{background-color:#df3f40;background-color:var(--danger-color);content:"";font-size:23px;height:100%;opacity:0;position:absolute;top:0;transform:scaleX(-1) rotate(0deg);transition:opacity .2s,transform .2s;width:100%;z-index:2}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{flex:1 1 auto;height:100%}.selector>hr{margin:0;padding:0}[dir=ltr] .selector .checkbox{padding-left:11px}[dir=rtl] .selector .checkbox{padding-right:11px}.selector .checkbox{margin-top:11px}.selector .checkbox-field{--offset-left:0!important;margin:0!important;padding:0!important;position:absolute!important}.selector .checkbox-field{pointer-events:none;top:50%;transform:translateY(-50%);z-index:1}[dir=ltr] .selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}[dir=rtl] .selector .checkbox-field:first-child{margin-left:1.6875rem;margin-right:.6875rem}[dir=ltr] .selector .checkbox-field-round{right:1.125rem}[dir=rtl] .selector .checkbox-field-round{left:1.125rem}.selector .checkbox-field-round{--size:1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}[dir=ltr] .selector-square .checkbox-field{left:1.25rem!important}[dir=rtl] .selector-square .checkbox-field{right:1.25rem!important}[dir=ltr] .selector-square .chatlist-chat.row-with-padding{padding-left:7.5rem!important}[dir=rtl] .selector-square .chatlist-chat.row-with-padding{padding-right:7.5rem!important}[dir=ltr] .selector-square .dialog-avatar{margin-left:3rem!important}[dir=rtl] .selector-square .dialog-avatar{margin-right:3rem!important}.gifs-masonry{grid-gap:.125rem;display:grid;gap:.125rem;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr)}.gifs-masonry .gif img,.gifs-masonry .gif video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gifs-masonry .gif img{left:0;position:absolute;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{animation:rotate 1s linear infinite;bottom:0;height:100%;left:0;margin:auto;position:absolute;right:0;top:0;transform-origin:center center}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{bottom:0;cursor:pointer;display:flex;height:54px;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transform:scale(0);width:54px}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color:#fff}.preloader-container .you-spin-me-round{height:100%;width:100%}.preloader-container .preloader-circular{animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;height:100%;width:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round{animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new,body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{animation:rotate 1s linear infinite!important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{bottom:0;color:var(--color);height:56%;left:0;margin:auto;opacity:1;position:absolute;right:0;top:0;width:56%}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-download:active,html.no-touch .preloader-container .preloader-download:hover{background:none}.preloader-container.manual .preloader-close,.preloader-container:not(.manual) .preloader-download{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{height:1.5rem;width:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer!important}.preloader-container.preloader-streamable circle{stroke-width:2.5!important}.preloader-container.preloader-streamable:after{background-color:var(--color);border-radius:.125rem;content:"";height:.8125rem;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:.8125rem}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@keyframes rotate{to{transform:rotate(1turn)}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.btn-corner.rp .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple,.rp-overflow .c-ripple{border-radius:inherit;height:100%;overflow:hidden;width:100%}.btn-corner.rp .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle,.rp-overflow .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration:.7s;bottom:0;left:0;position:absolute;right:0;top:0}html.is-safari .c-ripple:not(:empty){border-radius:inherit;-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.c-ripple__circle{animation:ripple-effect .7s forwards;background-color:rgba(0,0,0,.08);background-color:var(--ripple-color);border-radius:50%;display:block;pointer-events:none;position:absolute;transform:scale(0);transition:opacity .35s,background-color .35s}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{animation-duration:.2s;animation-name:ripple-effect-handhelds;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration:.2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration:.2s}.chatlist-container ul li>.rp .c-ripple__circle{animation-duration:.2s;animation-name:ripple-effect-handhelds;transition-duration:.1s}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}.avatar-like{line-height:var(--size)!important}.avatar-like{--size:54px;--multiplier:1;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--size)}avatar-element{--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%}avatar-element[data-color=red]{--color-top:var(--peer-avatar-red-top);--color-bottom:var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top:var(--peer-avatar-orange-top);--color-bottom:var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top:var(--peer-avatar-violet-top);--color-bottom:var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top:var(--peer-avatar-green-top);--color-bottom:var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top:var(--peer-avatar-cyan-top);--color-bottom:var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top:var(--peer-avatar-pink-top);--color-bottom:var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top:var(--peer-avatar-blue-top);--color-bottom:var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px/var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px/var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(30px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount{--color-top:var(--peer-avatar-archive-top);--color-bottom:var(--peer-avatar-archive-bottom);overflow:hidden}avatar-element.tgico-deletedaccount:before{font-size:calc(30px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;height:var(--size)!important;width:var(--size)!important}avatar-element img{display:block}avatar-element img.fade-in{animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{height:calc(1.125rem/var(--multiplier))!important;vertical-align:middle!important;width:calc(1.125rem/var(--multiplier))!important}avatar-element.is-forum{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}avatar-element.is-topic{background:none;border-radius:0;position:relative}avatar-element.is-topic .topic-icon{--size:inherit}avatar-element.is-online{position:relative}avatar-element.is-online:after{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;content:" ";display:block;height:14px;left:2.4375rem;position:absolute;top:2.4375rem;width:14px}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size:120px;--multiplier:.45}avatar-element.avatar-100{--size:100px;--multiplier:.54}avatar-element.avatar-48{--size:48px;--multiplier:1.125}avatar-element.avatar-46{--size:46px;--multiplier:1.173913}avatar-element.avatar-44{--size:44px;--multiplier:1.227272}avatar-element.avatar-42{--size:42px;--multiplier:1.285714}avatar-element.avatar-40{--size:40px;--multiplier:1.35}avatar-element.avatar-36{--size:36px;--multiplier:1.5}avatar-element.avatar-35{--size:35px;--multiplier:1.542857}avatar-element.avatar-34{--size:34px;--multiplier:1.588235}avatar-element.avatar-32{--size:32px;--multiplier:1.6875}avatar-element.avatar-30{--size:30px;--multiplier:1.6875}avatar-element.avatar-26{--size:26px;--multiplier:2.076923}avatar-element.avatar-24{--size:24px;--multiplier:2.25}avatar-element.avatar-22{--size:22px;--multiplier:2.454545}avatar-element.avatar-18{--size:18px;--multiplier:3}avatar-element.avatar-16{--size:16px;--multiplier:3.375}.avatar-relative .avatar-photo{left:0;position:absolute;top:0}.avatar-full{align-items:center;border-radius:inherit;display:inline-flex;height:100%;justify-content:center;position:absolute;width:100%}.avatar-full .avatar-photo{height:100%!important;width:100%!important}.avatar-full .avatar-photo{-o-object-fit:cover;object-fit:cover}.document{--background-color:var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}html.is-safari .document-ico{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.document-ico-text{opacity:0}body.animation-level-2 .document-ico-text{transition:opacity .2s ease-in-out}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0}@media only screen and (max-width:600px){.document:not(.document-with-thumb) .document-ico{font-size:14px;padding:1.5rem 0 0}.document:not(.document-with-thumb) .document-ico:after{--size:.875rem}}.document-ico:after{--size:1.125rem;border-bottom-color:rgba(0,0,0,.25);border-bottom-left-radius:.25rem;border-left-color:rgba(0,0,0,.25);border-right-color:#fff;border-right-color:var(--message-background-color);border-style:solid;border-top-color:#fff;border-top-color:var(--message-background-color);border-width:calc(var(--size)/2);content:"";display:block;position:absolute;right:0;top:0}body.animation-level-2 .document-ico:after{transition:border-width .2s ease-in-out}html.no-touch .document:not(.downloaded):active .document-ico:after,html.no-touch .document:not(.downloaded):hover .document-ico:after{border-width:0}html.no-touch .document:not(.downloaded):active .document-ico-text,html.no-touch .document:not(.downloaded):hover .document-ico-text{opacity:0}html.no-touch .document:not(.downloaded):active .preloader-container,html.no-touch .document:not(.downloaded):hover .preloader-container{opacity:1!important}.document:not(.downloading) .document-ico-text{opacity:1}.document:not(.downloading) .preloader-container{opacity:0!important}.document.downloading .document-ico:after{border-width:0}.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name,.document-size{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document.ext-zip{--background-color:#fb8c00}.document.ext-pdf{--background-color:#df3f40}.document.ext-apk{--background-color:#43a047}.document.document-with-thumb{--background-color:#fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.2);border-radius:.375rem}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3)!important}.document-thumb{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.document-name{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16);white-space:nowrap}.document-size{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);pointer-events:none;position:relative}.document .preloader-container{height:2.5rem;width:2.5rem}@media only screen and (max-width:600px){.document .preloader-container{height:1.625rem;width:1.625rem}}.document .preloader-circular{background-color:transparent!important}.document .preloader-path-new{stroke-width:2.5}.audio,.document{--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding-left:var(--padding-left);-webkit-user-select:none;-moz-user-select:none;user-select:none}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);margin-left:calc(var(--padding-left)*-1);position:absolute;width:var(--icon-size)}.audio-download,.document-download{align-items:center;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;opacity:1;transition:opacity .2s ease-in-out;z-index:1}.audio-download.downloaded,.document-download.downloaded{opacity:0}.audio-description,.document-description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio:not(.corner-download) .preloader-container:not(.preloader-streamable),.document:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1)!important}.audio .checkbox-field-round,.document .checkbox-field-round{--margin-top:.25rem;--margin-left:.125rem;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent!important}.audio .preloader-container:not(.preloader-streamable){height:100%;width:100%}.audio{overflow:visible!important}.audio{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size)}.audio-download,.audio-toggle{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{display:flex!important;margin:0!important}.audio.corner-download .audio-download{background:none;height:1.375rem;left:57.5%;top:57.5%;width:1.375rem}.audio.corner-download .preloader-container{background-color:#3390ec;background-color:var(--primary-color);border-radius:inherit}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{border-radius:inherit;bottom:0;left:0;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0;transform:rotate(-119deg)}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{background-color:#fff;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out,-webkit-clip-path .25s ease-in-out}@media only screen and (min-width:601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width:600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width:601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width:600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:active,html.no-touch .audio-waveform-background rect:hover{opacity:1}.audio-waveform-fake{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;width:0}.audio-waveform-container{height:23px;margin-top:1px;position:relative}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color)}.audio .audio-details{margin-bottom:0;margin-top:3px}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px!important;width:112px!important}@media only screen and (max-width:600px){.audio .part{height:100px!important;width:100px!important}}.audio-title{color:#000;color:var(--primary-text-color);font-size:1rem}.audio-description:not(:empty):before{content:" • "}.audio-subtitle,.audio-time{color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem}@media only screen and (max-width:600px){.audio-subtitle,.audio-time{font-size:.75rem}}.audio-subtitle,.audio-time,.audio-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-subtitle,.audio-title{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{align-items:center;line-height:1;margin-left:-1px;margin-top:7px}@media only screen and (max-width:600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:" ";height:.5rem;margin-left:.375rem;width:.5rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.audio .progress-line{--height:2px;--border-radius:4px;--thumb-size:.75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{background-color:transparent;opacity:1;z-index:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff!important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;width:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:8px;transform:translate3d(0,calc(-100% - 10px),0);transition:transform .2s ease;width:100%}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translateZ(0)}[dir=ltr] .quiz-hint .container{text-align:left}[dir=rtl] .quiz-hint .container{text-align:right}.quiz-hint .container{align-items:center;background:rgba(0,0,0,.7);border-radius:12px;color:#fff;display:flex;flex-wrap:wrap;font-size:15px;line-height:1.5;max-width:400px;min-height:48px;overflow:hidden;padding:10px 18px 12px 50px;position:relative;text-align:center;width:auto}@media only screen and (max-width:600px){.quiz-hint .container{font-size:14px;margin:0 10px;padding:10px 18px 12px 54px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:"";font-size:1.5rem;left:15px;position:absolute;top:12px}.quiz-hint .container a{border-bottom:1px solid #fff;color:#fff}.peer-typing{margin-right:4px}.peer-typing-container{--color:var(--primary-color);color:var(--color)}.peer-typing-flex{align-items:center;display:flex}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;transform:translateY(-1px);vertical-align:middle}.peer-typing-text-dot{animation-duration:.6s;animation-iteration-count:infinite;animation-name:dotMiddle;animation-timing-function:linear;background-color:var(--color);border-radius:50%;display:inline-block;height:6px;margin:0 .5px;vertical-align:middle;width:6px}.peer-typing-text-dot:first-child{animation-name:dotFirst}.peer-typing-text-dot:last-child{animation-name:dotLast}.peer-typing-upload{border-radius:2px;height:5px;margin-right:.375rem;overflow:hidden;position:relative;width:13px}.peer-typing-upload:after,.peer-typing-upload:before{background-color:var(--color);border-radius:inherit;bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{animation:recordBlink 1.25s infinite;background-color:var(--color);border-radius:50%;content:" ";display:block;height:6px;width:6px}.peer-typing-choosing-sticker{align-items:center;display:flex;flex:0 0 auto;height:16px;margin-right:.375rem}.peer-typing-choosing-sticker-eye{animation:eye 1.8s ease-in-out infinite;border:1px solid var(--color);border-radius:50%;display:inline-block;height:14px;margin:0 .0625rem;position:relative;vertical-align:middle;width:8px}.peer-typing-choosing-sticker-eye:before{animation:eye-move 1.8s ease-in-out infinite;background-color:var(--color);border-radius:50%;content:" ";display:block;height:.25rem;position:absolute;top:50%;transform:translate(-1px,-50%);width:.25rem}@keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}poll-element{color:#000;color:var(--primary-text-color);display:block;margin-top:-1px;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:330px}@media only screen and (max-width:600px){poll-element{max-width:100%;width:240px}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (max-width:600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;margin-bottom:5px;margin-top:2px;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1.5rem;position:absolute;right:2px;top:-4px;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{pointer-events:none;transform:scale(0)}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{cursor:pointer;display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;height:18px;width:18px}poll-element .poll-answer{display:flex;margin-top:1px;padding-bottom:20px;padding-left:28px;position:relative}poll-element .poll-answer-text{margin-left:12px;margin-top:6px}[dir=ltr] poll-element .poll-answer-percents{text-align:right}[dir=rtl] poll-element .poll-answer-percents{text-align:left}poll-element .poll-answer-percents{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);left:0;margin-left:-9px;margin-top:7px;opacity:0;position:absolute;top:0;width:40px}poll-element .poll-answer-selected{align-items:center;background:#3390ec;background:var(--primary-color);border-radius:50%;bottom:1px;color:#fff;display:flex;font-size:.75rem;font-weight:500;font-weight:var(--font-weight-bold);height:16px;justify-content:center;left:15px;opacity:1;position:absolute;width:16px}poll-element .poll-answer-selected:before{content:"";font-weight:500;font-weight:var(--font-weight-bold)}html.no-touch poll-element .poll-answer:active .animation-ring,html.no-touch poll-element .poll-answer:hover .animation-ring{transform:scale(1);visibility:visible}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-.5rem}poll-element .poll-line{stroke-dashoffset:0;stroke-dasharray:0,485.9;bottom:2px;height:35px;left:10px;position:absolute}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{height:2.875rem;margin:-.375rem -.5rem -.375rem -.625rem;text-align:center}poll-element .poll-footer-button{border-top-left-radius:0!important;border-top-right-radius:0!important}poll-element .poll-footer-button{color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;overflow:hidden;width:100%}poll-element .poll-footer,poll-element .poll-footer-button{align-items:center;display:flex;justify-content:center}poll-element .poll-quiz-timer{stroke:#a3adb6;fill:none;stroke-linecap:round;height:32px;position:absolute;right:-2px;top:-7px;transform:rotate(270deg);width:32px}poll-element .poll-time{color:#a3adb6;font-size:12px;font-weight:500;font-weight:var(--font-weight-bold);position:absolute;right:27px}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:"";font-size:12px}poll-element .circle-hover{align-items:center;display:flex;height:34px;justify-content:center;left:-1px;position:absolute;top:-1px;transform:scale(1);width:34px}poll-element .circle-hover .poll-answer-selected{display:flex!important}poll-element .circle-hover .poll-answer-selected{animation:none;font-size:20px;height:20px;left:50%;line-height:16px;opacity:0;top:50%;transform:translate(-50%,-50%);width:20px}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;display:block;height:34px;transform:scale(.1);visibility:hidden;width:34px}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;left:auto;top:auto;width:26px}poll-element .progress-ring__circle{stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent;transform:rotate(-90deg);transform-origin:center}poll-element.is-voted .animation-ring,poll-element.is-voted .circle-hover{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity forwards .1s ease}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:opacity .34s}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:transform .1s}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{animation-fill-mode:forwards!important}.transition>.transition-item{height:100%;left:0;position:absolute;top:0;width:100%}.transition>.transition-item:not(.active):not(.from):not(.to){display:none!important}.transition.zoom-fade>.from{opacity:1;transform:scale(1);transform-origin:center}.transition.zoom-fade>.to{opacity:0;transform-origin:center}.transition.zoom-fade.animating>.from{animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(.95)}.transition.zoom-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine:cubic-bezier(.39,.575,.565,1);--easeInSine:cubic-bezier(.47,0,.745,.715);position:relative}.transition.slide-fade>.from{opacity:1;transform:translateX(0);transform-origin:left center}.transition.slide-fade>.to{opacity:0;transform:translateX(1.5rem);transform-origin:left center}.transition.slide-fade.animating>.from{animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{opacity:1;transform:translateX(0)}.transition.slide-fade.backwards>.to{opacity:0;transform:translateX(-1.5rem)}.transition.slide-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}.row{display:flex;flex-direction:column;justify-content:center;min-height:3.5rem;padding:.4375rem 1rem;position:relative}.row.no-subtitle,.row.row-small{min-height:3rem;padding-bottom:.1875rem;padding-top:.1875rem}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.row.is-disabled{pointer-events:none!important}.row.is-disabled{opacity:.3;opacity:var(--disabled-opacity)}.row.no-wrap{padding-bottom:0!important;padding-top:0!important}.row a{pointer-events:all;position:relative;z-index:1}.row-title-row,.row>.row-title{order:0}[dir=ltr] .row-big{padding-left:1rem;padding-right:.75rem}[dir=rtl] .row-big{padding-left:.75rem;padding-right:1rem}.row-big{min-height:4.5rem;padding-bottom:.5625rem;padding-top:.5625rem}.row-row{align-items:center;display:flex;justify-content:space-between}.row-row .row-subtitle,.row-row .row-title{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row-subtitle-row,.row>.row-subtitle{order:1}.row-title{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;word-break:break-word}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}[dir=ltr] .row-subtitle-right,[dir=ltr] .row-title-right{margin-left:1rem}[dir=rtl] .row-subtitle-right,[dir=rtl] .row-title-right{margin-right:1rem}.row-subtitle-right,.row-title-right{flex:0 0 auto!important}.row-midtitle,.row-subtitle,.row-title{pointer-events:none;position:relative}.row-midtitle{font-size:14px;font-size:var(--font-size-14);margin-top:.125rem;order:1}[dir=ltr] .row-with-padding{padding-left:4.5rem}[dir=rtl] .row-with-padding{padding-right:4.5rem}@media only screen and (max-width:600px){[dir=ltr] .row-with-padding{padding-left:4rem}[dir=rtl] .row-with-padding{padding-right:4rem}}[dir=ltr] .row-with-padding.tgico:before{left:1rem}[dir=rtl] .row-with-padding.tgico:before{right:1rem}.row-with-padding.tgico:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);z-index:1}.row-with-padding:not(.row-with-icon):before{display:none}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}[dir=ltr] .row-sortable .row-subtitle,[dir=ltr] .row-sortable .row-title{padding-right:2.5rem}[dir=rtl] .row-sortable .row-subtitle,[dir=rtl] .row-sortable .row-title{padding-left:2.5rem}[dir=ltr] .row-sortable-icon{right:.75rem}[dir=rtl] .row-sortable-icon{left:.75rem}.row-sortable-icon{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;height:1.5rem;line-height:1;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.row-sortable.cant-sort .row-sortable-icon{display:none}.row-sortable.is-dragging{background-color:#fff!important;background-color:var(--surface-color)!important}.row-sortable.is-dragging{z-index:1}html.no-touch .row-sortable.is-dragging:active,html.no-touch .row-sortable.is-dragging:hover{background-color:#f4f4f4!important;background-color:var(--light-filled-secondary-text-color)!important}body.animation-level-2 .is-reordering .row-sortable{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{padding-left:3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{padding-right:3.375rem}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{margin-left:-3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{margin-right:-3.375rem}.row .checkbox-field,.row .radio-field,.row .radio-field:not(.radio-field-right) .radio-field-main{position:static}.row .checkbox-field,.row .radio-field{--offset-left:1rem}.row .radio-field{margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field{margin-right:0}[dir=rtl] .row .checkbox-field{margin-left:0}.row .checkbox-field{height:auto;margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field .checkbox-caption{padding-left:0}[dir=rtl] .row .checkbox-field .checkbox-caption{padding-right:0}.row .checkbox-field .checkbox-caption{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row .checkbox-field-toggle{margin-left:.125rem;margin-right:.125rem;padding:0}.row-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;font-size:14px!important;font-size:var(--font-size-14)!important}.row-subtitle{line-height:18px;line-height:var(--line-height-14);margin-top:.1875rem}.row-subtitle:empty{display:none}[dir=ltr] .row-media{left:.75rem}[dir=rtl] .row-media{right:.75rem}.row-media{height:2.25rem!important;margin:0!important;position:absolute!important;width:2.25rem!important}.row-media{align-items:center;display:flex;justify-content:center;pointer-events:none}[dir=ltr] .row-media-small{left:.75rem!important}[dir=rtl] .row-media-small{right:.75rem!important}.row-media-small{height:2rem!important;width:2rem!important}[dir=ltr] .row-media-abitbigger{left:.75rem!important}[dir=rtl] .row-media-abitbigger{right:.75rem!important}.row-media-abitbigger{height:2.625rem!important;width:2.625rem!important}[dir=ltr] .row-media-big{left:.5rem!important}[dir=rtl] .row-media-big{right:.5rem!important}.row-media-big{height:3rem!important;width:3rem!important}[dir=ltr] .row-media-bigger{left:.5625rem!important}[dir=rtl] .row-media-bigger{right:.5625rem!important}.row-media-bigger{height:3.375rem!important;width:3.375rem!important}.row.menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}[dir=ltr] .row>.btn-primary{right:1rem}[dir=rtl] .row>.btn-primary{left:1rem}.row>.btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding-left:.75rem;padding-right:.75rem;position:absolute;top:50%;transform:translateY(-50%);width:auto}body.animation-level-2 .row>.btn-primary{transition:width .2s,background-color .2s,color .2s}.row>.btn-primary.active{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important}.row>.btn-primary.active{color:#3390ec;color:var(--primary-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:380px}.color-picker-box{height:198px;width:100%}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible!important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{display:flex!important;padding:0!important;position:absolute!important;width:26.25rem!important}.reply-keyboard{background:#fff;background:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);flex-direction:column;max-height:26.25rem;max-width:100%;opacity:0;overflow:hidden;right:0;transform:scale(0);transform-origin:bottom right;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);z-index:3}@media only screen and (max-height:569px),only screen and (max-width:600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{background-color:transparent;border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:.375rem;color:#3390ec;color:var(--primary-color);font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);height:3rem;text-align:center;width:100%}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:active,html.no-touch .reply-keyboard-button:hover{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.reply-keyboard .scrollable-y{padding:.625rem!important}.reply-keyboard .scrollable-y{bottom:auto;height:auto;left:auto;max-height:100%;position:relative;right:auto;top:auto}.peoplenearby-container div.text.nearby-description{color:#000;color:var(--primary-text-color);margin-top:15px;text-align:center}.peoplenearby-container div.text.nearby-error{color:#aaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{align-items:center;display:flex;justify-content:center;min-height:140px;width:100%}.peoplenearby-container .locating-animation-container .tgico.tgico-location{align-items:center;background:#3d9de0;background:var(--avatar-color-bottom);border-radius:50%;display:flex;height:140px;justify-content:center;padding:50px;width:140px}.peoplenearby-container .locating-animation-container .tgico.tgico-location:before{color:#fff;font-size:58px}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{animation:waves-animation 3s infinite;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:50px;margin-left:36px;width:50px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{animation:waves-animation 5s infinite;animation-delay:2s;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:71px;margin-left:51px;margin-top:1px;width:66px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px!important}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px!important}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{transform:rotateY(180deg)}@keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}.spoiler{--anim:.4s ease;background-color:#e3e5e8;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}.spoilers-container .custom-emoji-canvas{z-index:-1}.spoilers-container.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.spoilers-container.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim)}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler-text{opacity:1}.spoilers-container:not(.is-spoiler-visible) .spoiler{cursor:pointer}.spoilers-container:not(.is-spoiler-visible) .spoiler-text{pointer-events:none}.emoji-animation,.emoji-animation-container{pointer-events:none;position:absolute}.emoji-animation-container{bottom:0;left:0;overflow:hidden;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:inline;display:initial}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction,.reaction-sticker{align-items:center;display:flex}.reaction-sticker{--custom-emoji-size:var(--reaction-size);height:var(--reaction-size);justify-content:center;position:relative;width:var(--reaction-size)}.reaction-sticker-activate{bottom:var(--reaction-offset);left:var(--reaction-offset);position:absolute;right:var(--reaction-offset);top:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{height:var(--size)!important;width:var(--size)!important}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto}.reaction-sticker.is-custom{border-radius:.3125rem}.reaction-sticker.is-custom .custom-emoji,.reaction-sticker.is-custom .media-sticker{border-radius:inherit}.reaction-sticker.is-custom .custom-emoji-canvas{z-index:auto}.reaction-inline{--reaction-size:.875rem;--reaction-offset:-.4375rem;min-height:var(--reaction-size);min-width:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit!important;margin-right:.0625rem!important}.reaction-inline .reaction-counter{order:-1}.reaction-block{--additional-height:.5rem;--margin:.375rem;--reaction-size:1.375rem;--reaction-offset:-.5625rem;--background-color:var(--message-highlightning-color);--chosen-background-color:var(--message-primary-color);--counter-color:#fff;--reaction-total-size:calc(var(--reaction-size) + var(--additional-height));background-color:#f4f4f5;background-color:var(--background-color);border-radius:var(--reaction-total-size);color:var(--counter-color);cursor:pointer;height:var(--reaction-total-size);margin-right:var(--margin);margin-top:var(--margin);padding:0 .5rem;position:relative}html.no-touch .reaction-block:active:after,html.no-touch .reaction-block:hover:after{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:" ";left:0;opacity:.08;position:absolute;right:0;top:0}.reaction-block .reaction-counter,.reaction-block .reaction-sticker{z-index:1}.reaction-block:last-child{margin-right:0}.reaction-block:before{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:" ";left:0;opacity:0;position:absolute;right:0;top:0;transform:scale(0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scale(1)}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color:var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color .3s cubic-bezier(.4,0,.2,1);transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color .3s cubic-bezier(.4,0,.2,1);transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color:transparent;--border-size:.125rem;--margin-right:-.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem!important}.reaction-block .reaction-counter{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin:0 .0625rem 0 .375rem;position:relative}.stacked-avatars{--border-color:var(--surface-color);--border-size:1px;--margin-right:-.3125rem;--avatar-size:1rem;--avatar-total-size:calc(var(--avatar-size) + var(--border-size)*2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{height:var(--avatar-size);width:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{align-items:center;border:var(--border-size) solid var(--border-color);border-radius:50%;display:flex;height:var(--avatar-total-size);justify-content:center;position:relative;width:var(--avatar-total-size)}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.sticker-viewer{align-items:center;bottom:0;display:flex;justify-content:center;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:4}.sticker-viewer:before{background-color:rgba(0,0,0,.6);bottom:0;content:" ";left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .sticker-viewer:before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.sticker-viewer.is-visible:not(.backwards):before{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards):before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .emoji-animation,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .emoji-animation,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker:not(.is-overflow){transition:opacity 0s}.sticker-viewer-transformer{--translateX:0;align-items:center;display:flex;height:360px;justify-content:center;position:absolute;width:360px}.sticker-viewer-transformer.has-effect{height:280px;width:280px}.sticker-viewer-transformer.has-effect .sticker-viewer-emoji{top:-5.5rem}body.animation-level-2 .sticker-viewer-transformer{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-out)}.sticker-viewer-transformer.is-switching{opacity:1!important;transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer-transformer.is-switching{transition:transform .2s cubic-bezier(.12,1.1,.56,1.2),opacity .2s cubic-bezier(.12,1.1,.56,1.2)!important;transition:transform var(--sticker-viewer-switch-transition),opacity var(--sticker-viewer-switch-transition)!important}.sticker-viewer-transformer.is-switching:not(.backwards){opacity:0!important;transform:scale(.4) translateX(var(--translateX))!important}.sticker-viewer-emoji{position:absolute;top:-3rem;transform:translateX(var(--translateX)) scale(2)}.sticker-viewer-sticker{position:absolute}.sticker-viewer .emoji-animation,.sticker-viewer-emoji,.sticker-viewer-sticker{opacity:0}body.animation-level-2 .sticker-viewer .emoji-animation,body.animation-level-2 .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.custom-emoji{height:1.25rem!important;height:var(--custom-emoji-size)!important;min-height:1.25rem!important;min-height:var(--custom-emoji-size)!important;min-width:1.25rem!important;min-width:var(--custom-emoji-size)!important;width:1.25rem!important;width:var(--custom-emoji-size)!important}.custom-emoji{display:inline;position:relative}.custom-emoji:before{content:" ";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.custom-emoji .media-sticker,.custom-emoji .rlottie{height:inherit!important;max-height:inherit!important;max-width:inherit!important;width:inherit!important}.custom-emoji .media-sticker,.custom-emoji .rlottie{margin:0;pointer-events:none;text-indent:-9999px}.custom-emoji-canvas{height:100%;width:100%}.custom-emoji-canvas,.custom-emoji-renderer{bottom:0;left:0;position:absolute;right:0;top:0}.custom-emoji-renderer{pointer-events:none}.custom-emoji-placeholder{display:inline;height:20px;height:var(--messages-custom-emoji-size);margin-top:-.125rem;vertical-align:middle;width:20px;width:var(--messages-custom-emoji-size)}.usernames-username-icon{background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:50%;color:#fff;font-size:1.25rem}.usernames-username-icon:before{content:""}.usernames-username.active .usernames-username-status{color:#3390ec!important;color:var(--primary-color)!important}.usernames-username.active .usernames-username-icon{background-color:#3390ec;background-color:var(--primary-color)}.topics-slider{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0}.topics-container{background-color:#fff!important;background-color:var(--surface-color)!important;width:var(--width)!important}.topics-container{--offset:0;--width:100%}.topics-container.is-floating{overflow:visible!important;overflow:initial!important}.topics-container.is-floating{--offset:5.0625rem;--width:calc(var(--left-column-width) - var(--offset));border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);bottom:0;pointer-events:all;position:absolute;right:0;top:0;transform:translateX(var(--width));z-index:3}.topics-container.is-visible:not(.backwards){transform:translateX(0)}.topics-container.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.topics-container.is-visible.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.topics-container .sidebar-header{padding:0 .75rem}.topics-container .sidebar-header__rows{flex:1 1 auto;overflow:hidden;padding-left:.5rem}.topics-container .sidebar-header__rows .sidebar-header__title{padding-left:0!important}.topics-container .sidebar-header__rows .sidebar-header__title{font-size:16px;font-size:var(--font-size-16);line-height:21px;line-height:var(--line-height-16);margin-bottom:.125rem}.topics-container .sidebar-header__subtitle,.topics-container .sidebar-header__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topics-container .sidebar-header__subtitle{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14)}.topics-container .chatlist-chat{min-height:4rem;padding-left:.75rem}.topic-name .topic-icon{margin-right:.25rem}.topic-name-button{text-decoration:none!important}.topic-name-button{--color:var(--primary-color);align-items:center;color:var(--color);cursor:pointer;display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:1.5rem;justify-content:center;max-width:100%;padding:0 .5rem;position:relative}.topic-name-button-container{display:flex!important}.topic-name-button-container{align-items:flex-start;justify-content:flex-start}.topic-name-button .peer-title,.topic-name-button .topic-name{position:relative}.topic-name-button:before{background-color:var(--color);border-radius:1.5rem;bottom:0;content:" ";left:0;opacity:.08;position:absolute;right:0;top:0}html.no-touch .topic-name-button:active:before,html.no-touch .topic-name-button:hover:before{opacity:.16}.topic-icon{line-height:1.875!important}.topic-icon{--size:1.25rem;--custom-emoji-size:var(--size);display:inline-flex;font-size:calc(var(--size)/2);justify-content:center;position:relative;vertical-align:middle}.topic-icon-general{fill:#c4c9cc;fill:var(--secondary-color);height:var(--size);width:var(--size)}.topic-icon-svg{height:inherit;position:absolute;width:inherit}.topic-icon-content{position:relative}.edit-topic-container .scrollable-y{display:flex;flex-direction:column}.edit-topic-icon{position:absolute}.edit-topic-icon .topic-icon{--size:4rem}.edit-topic-icon-container{align-items:center;cursor:pointer;display:flex;height:100px;justify-content:center;margin:0 auto;position:relative;width:100px}.edit-topic-emoticons-container{flex:1 1 auto}.edit-topic-emoticons-container .sidebar-left-section{padding:0!important}.edit-topic-emoticons-container .sidebar-left-section{height:100%}.edit-topic-emoticons-container .emoji-padding{display:flex;flex-direction:column}.edit-topic-emoticons-container .super-emoji-topic-icon .topic-icon{--size:var(--esg-emoji-size);--custom-emoji-size:inherit;margin-left:calc((var(--custom-emoji-size) - var(--esg-emoji-size))/2)}.popup{position:fixed!important}.popup{background-color:rgba(0,0,0,.3);bottom:0;box-shadow:none;display:flex;left:0;margin:0;max-width:none;opacity:0;overflow:auto;padding:1.875rem;right:0;top:0;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-property:opacity,visibility;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:var(--popup-transition-function);-webkit-user-select:none;-moz-user-select:none;user-select:none;visibility:hidden;z-index:3}.popup.no-overlay{background-color:transparent;overflow:visible;padding:0}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;transition-delay:0s,0s;visibility:visible;z-index:4}.popup.active .popup-container,.popup.hiding .popup-container{transform:translate3d(var(--translateX),0,0)}[dir=ltr] .popup-title{padding-left:1.5rem;padding-right:1rem}[dir=rtl] .popup-title{padding-left:1rem;padding-right:1.5rem}.popup-title{flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1;margin:0}.popup-title:first-child{padding-left:0}.popup-container{--translateX:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;margin:auto;overflow:hidden;padding:1rem;position:relative;transform:translate3d(var(--translateX),3rem,0);transition:transform .15s cubic-bezier(.4,0,.2,1);transition:transform var(--popup-transition-time) var(--popup-transition-function)}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-centerer{margin:auto}.popup-close{flex:0 0 auto;justify-self:center;z-index:3}.popup-header{align-items:center;display:flex;flex:0 0 auto;margin-bottom:2rem;position:relative}.popup-body{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{align-items:center;display:flex;flex-direction:row-reverse;height:3rem;justify-content:flex-start;padding:0 .5rem}.popup-buttons .btn{border-radius:10px;font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;max-width:100%;overflow:hidden;padding:0 1rem;position:relative;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}[dir=ltr] .popup-buttons .btn+.btn{margin-right:.625rem}[dir=rtl] .popup-buttons .btn+.btn{margin-left:.625rem}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{bottom:20px;position:absolute;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}[dir=ltr] .popup-avatar h6{text-align:left}[dir=rtl] .popup-avatar h6{text-align:right}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem}.popup-avatar .crop{border-radius:8px;max-height:100%;max-width:100%;padding:24px 54px 46px 46px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{max-height:100%;max-width:420px;padding:12px 20px 32.5px;width:420px}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{align-items:center;flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{border-radius:10px;font-size:14px;font-size:var(--font-size-14);height:2.25rem;line-height:2.25rem;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-photo{border-radius:10px;max-width:380px;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{flex:0 0 auto;margin-top:25px;width:100%}.popup-new-media .input-field-input{border-radius:10px;font-size:1rem}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{top:calc(100% + .25rem);z-index:4}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{border-radius:inherit;overflow:hidden;position:relative}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{cursor:default;height:4.5rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{font-weight:400;line-height:1.5;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{font-size:16px;font-weight:400;height:48px;letter-spacing:0;line-height:11px;width:48px}.popup-create-contact .name-fields{display:flex;flex-direction:column;margin-top:1rem;padding-left:116px;position:relative}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{left:0;position:absolute;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{align-items:center;display:flex;height:2.5rem;margin:0;padding:0 1rem}.popup-peer .popup-container{max-width:min(400px,100%);min-width:min(100%,17.5rem);padding:.75rem .5rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.popup-peer .popup-title:not(:first-child){padding-left:1rem}.popup-peer .popup-description{line-height:1.3125;line-height:var(--line-height);margin-bottom:0;margin-top:0;max-width:-moz-fit-content;max-width:fit-content;min-width:min(100%,15rem);overflow:hidden;padding:.625rem 1rem .5rem;text-overflow:ellipsis;word-break:break-word}.popup-peer .checkbox-field{align-items:center;display:flex;height:3rem;margin:0;padding:0 1.125rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-stickers .sticker-set-footer{color:#3390ec;color:var(--primary-color);text-align:center}.popup-stickers .sticker-set-footer .btn-primary{height:44px;line-height:44px;padding:0 1.0625rem;text-transform:uppercase;width:auto}.popup-stickers .scrollable.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .super-emojis{padding:0 .5rem}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}[dir=ltr] .popup-stickers .popup-close{margin-left:1rem}[dir=rtl] .popup-stickers .popup-close{margin-right:1rem}.popup-stickers .popup-close{font-size:1.5rem}.popup-stickers .popup-header{flex:0 0 auto;margin:.625rem 0}.popup-stickers .sticker-set{margin:.0625rem 0}.popup-stickers .sticker-set .row-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-stickers .sticker-set-stickers{--per-row:5;--item-size:var(--popup-sticker-size);display:grid;grid-template-columns:repeat(var(--per-row),1fr);padding:0 5px;position:relative}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{--per-row:4}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper{cursor:pointer;height:var(--item-size);justify-self:center;margin-bottom:2px;position:relative;width:var(--item-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers .media-sticker-wrapper{margin-bottom:8px}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height:470px){.popup-date-picker .popup-container[data-lines="7"]{top:19px}.popup-date-picker .popup-container[data-lines="5"]{top:-19px}}.popup-date-picker .popup-header{margin-bottom:1.375rem;margin-left:6px;margin-top:4px}.popup-date-picker .popup-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .popup-buttons{margin-right:-2px;order:2}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{align-items:center;display:flex;justify-content:space-between}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-next:disabled,.popup-date-picker .date-picker-prev:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-bottom:1.5rem;margin-top:7px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7,1fr);justify-content:center;width:100%}.popup-date-picker .date-picker-month .btn-icon{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:12px;height:38px;justify-content:center;justify-self:center;width:38px}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7!important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important}.popup-date-picker .date-picker-month .btn-icon.active{border-radius:50%;color:#fff;color:var(--badge-text-color)}.popup-schedule .popup-header{justify-content:space-between;margin-bottom:17px;margin-left:0;margin-top:5px}@media only screen and (max-width:600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;padding:4px 16px 16px;width:420px}@media only screen and (max-width:600px){.popup-schedule .popup-container{min-width:312px;padding:4px 14px 14px;width:312px}}.popup-schedule .popup-container[data-lines="5"]{top:-16px}.popup-schedule .popup-container[data-lines="7"]{top:16px}.popup-schedule .date-picker-month{margin-left:2px;margin-right:-20px;width:auto}@media only screen and (max-width:600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold);margin-left:-5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);height:36px;justify-self:auto;margin-top:-4px;width:36px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8!important}.popup-schedule .date-picker-month-day{color:#000!important;color:var(--primary-text-color)!important;font-size:14px!important}.popup-schedule .date-picker-month-day{font-weight:500;font-weight:var(--font-weight-bold)}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width:600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:400}@media only screen and (max-width:600px){.popup-schedule .btn-primary{widtH:280px;height:50px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px,100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main:before{left:.25rem}.popup-create-poll .radio-field .radio-field-main:after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{opacity:0!important}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{pointer-events:none}.popup-create-poll .input-field .btn-icon{opacity:1;position:absolute;right:.4375rem;top:.4375rem;transition:opacity .2s ease;z-index:1}@media only screen and (max-width:600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{font-size:.875rem;line-height:1.2;margin-top:.875rem}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{right:20px;top:54px}.popup-create-poll hr:not(.hide){display:block!important}.popup-forward .popup-container{height:40.625rem;max-height:min(40.625rem,100%);max-width:420px;padding:7px 0 0;width:420px}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:7px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.8125rem}}.popup-forward .popup-title{flex-grow:1;height:100%;padding:0}.popup-forward .chatlist-container,.popup-forward .selector{display:flex;flex:1 1 auto;flex-direction:row;height:auto;overflow:hidden;width:100%}.popup-forward .selector-search-input{font-size:20px;font-size:var(--font-size-20);height:100%;line-height:1;padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.1875rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{margin-bottom:0!important;padding-top:0!important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;pointer-events:none;text-align:center}.popup-instance-deactivated .header{color:#fff;font-size:2rem}.popup-instance-deactivated .subtitle{color:#fff;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height);opacity:.6}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.75rem 0 .25rem}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{height:100px;margin:0 auto;position:relative;width:100px}.popup-report-messages-confirm .popup-body{margin:1em -.5rem .375rem;overflow:visible;overflow:initial}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-call .popup-header{justify-content:space-between;width:100%}.popup-call .popup-title{flex:1 1 auto}.call{align-items:center;color:#fff;height:100%;width:100%}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state,.call.no-video .call-subtitle,.call.no-video .call-title,.call.no-video .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.show-controls .call-subtitle,.call.show-controls .call-title,.call.show-controls .popup-header{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{margin-right:1rem;transform:scale(1.3125)}.call-avatar{border-radius:inherit;bottom:0;left:0;opacity:.7;position:absolute;right:0;top:0;z-index:-1}.call-avatar .avatar-full{font-size:6rem}.call-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.call-subtitle{font-size:1rem}.call .popup-header,.call-emojis,.call-subtitle,.call-title{opacity:0}body.animation-level-2 .call .popup-header,body.animation-level-2 .call-emojis,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-title{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;pointer-events:none;position:absolute;z-index:1}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale:1}.call-buttons .call-button-container.hide-me{--scale:0!important}.call-buttons .call-button-container.hide-me{transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(-2.6875rem);transform:translateX(calc(var(--call-button-size)*-.5 + var(--call-button-margin)*-.5))}.call-buttons.is-second{--margin-length:2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(6.75rem + 2rem*var(--margin-length)));transform:translateX(calc(var(--call-button-size)*2 + var(--call-button-margin)*var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length:.656875}.call-button{background-color:hsla(0,0%,100%,.1)}.call-button-red{background-color:#df3f40!important;background-color:var(--danger-color)!important}.call-button-green{background-color:#5cc85e!important;background-color:var(--gc-green-text-color)!important}.call-button.active{background-color:#fff!important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{border-radius:inherit;height:100%;-o-object-fit:contain;object-fit:contain;opacity:1;position:absolute;width:100%}.call-video-container{align-items:center;background-color:#000;bottom:0;display:flex;left:0;position:absolute;right:0;top:0;z-index:-1}.call-video-container.small{border-radius:10px;bottom:8rem;cursor:pointer;left:auto;right:1rem;top:auto;z-index:1}.call-video-blur{border-radius:inherit;height:100%;opacity:.7;position:absolute;width:100%}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{align-items:center;bottom:7.625rem;bottom:calc(4.25rem + var(--call-button-size));display:flex;flex-direction:column;padding:0 1rem;pointer-events:none;position:absolute;width:100%;z-index:2}.call-party-state{align-items:center;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:hsla(0,0%,100%,.2);border-radius:1.625rem;color:#fff;display:flex;font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:1.625rem;line-height:1.625rem;margin-top:1rem;max-width:100%;opacity:0;padding:0 .625rem;transform:scale(0) translateY(0)}body.animation-level-2 .call-party-state{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{height:1.875rem!important;width:1.875rem!important}.call-party-state .rlottie-icon{flex:0 0 auto;margin-left:-.25rem;margin-right:.25rem}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(-6.5rem);transform:translateY(calc(var(--call-button-size)*-1 + var(--call-button-margin)*-1 + -1.125rem))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-left-radius:0;border-bottom-right-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin:1.25rem;height:100%;padding:0 .5rem;width:100%}.group-call:after{background:linear-gradient(180deg,rgba(33,33,33,0),rgba(33,33,33,.65) 48.54%,#212121);background:linear-gradient(180deg,rgba(33,33,33,0) 0,rgba(33,33,33,.65) 48.54%,var(--gc-background-color) 100%);bottom:0;content:" ";height:7.5rem;left:0;position:absolute;right:0}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{color:inherit;flex:0 0 auto}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-header-subtitle,.group-call-header-title{font-size:16px;font-size:var(--font-size-16);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-header-subtitle{color:#aaa;color:var(--gc-secondary-text-color);font-size:.875rem}.group-call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;justify-content:space-between;position:absolute;z-index:1}.group-call-button{background-color:rgba(1,200,80,.2);background-color:var(--gc-button-unmuted-color);color:#fff;color:var(--gc-primary-text-color);opacity:1}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60,135,247,.2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223,68,184,.2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255,89,90,.3)!important;background-color:var(--gc-button-leave-color)!important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg,#00a3b4 12.94%,#00cb47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg,#4eabf8 14.73%,#3478f6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg,#df44b8 14.73%,#3851eb 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{padding-right:.5rem}.group-call-participant-status-icon{display:inline-block;font-size:1.125rem;height:1.125rem;line-height:1;margin-right:6px;vertical-align:middle;width:1.125rem}.group-call-participant-status-container{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant .dialog-subtitle,.group-call-participant .dialog-title{padding-right:2.5rem}.group-call-participant-muted-icon-container{position:absolute!important}.group-call-participant-muted-icon-container{right:.5rem}.group-call-participant-video-container{align-items:center;background-color:#000;border-radius:10px;cursor:pointer;display:flex;flex:1 1 auto;height:15rem;margin:.25rem;overflow:hidden;position:relative;width:100%;width:33%}.group-call-participant-video-container:after{background:linear-gradient(180deg,transparent 55.62%,rgba(0,0,0,.5) 86.46%);bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;height:1.25rem;width:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-header,.group-call-participant-video-info{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-header,body.animation-level-2 .group-call-participant-video-info{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-header,.group-call-participant-video-info{align-items:center;bottom:.25rem;display:flex;justify-content:space-between;left:0;padding:0 .5rem 0 .75rem;position:absolute;right:0;z-index:1}.group-call-participant-video-header{bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem;top:0}.group-call-participant-video-header .group-call-pin-icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-video-info .group-call-participant-status-container{margin-top:-1px;opacity:.6}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;height:2rem;margin-left:.75rem;width:2rem}.group-call-participant .is-speaking{color:#5cc85e;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;flex:1 1 auto;overflow:hidden}.group-call-participants-scrollable{border-radius:inherit;height:auto;padding-bottom:6rem;position:relative}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-.25rem -.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2),.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container{flex:1 0 auto;height:auto}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2):before,.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container:before{content:" ";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-header,.group-call-participants-video-container.show-controls .group-call-participant-video-info{opacity:1}.group-call-participants .chatlist{background:none;margin:0 auto;max-width:600px;padding:0}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaa;color:var(--gc-secondary-text-color)}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{margin-bottom:.25rem;min-height:100%}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25%!important}.group-call-cfs,.group-call:not(.is-big-layout) .group-call-big-video-container,.group-call:not(.is-big-layout) .popup-body .group-call-header,.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width:17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover{background-color:hsla(207,4%,46%,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(-13.125rem);transform:translateX(calc(var(--gc-right-column-width)/-2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX:calc(var(--gc-right-column-width)/-2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{background-color:#212121;background-color:var(--gc-background-color);bottom:0;padding:inherit;position:absolute;right:-26.25rem;right:calc(var(--gc-right-column-width)*-1);top:0;width:26.25rem;width:var(--gc-right-column-width)}.group-call.is-big-layout .group-call-buttons{bottom:2.5rem;padding:.75rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-sponsored .scrollable-y{margin:0 -1.5rem;max-height:25rem;padding:.5rem 1.5rem;position:relative;-webkit-user-select:text;-moz-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-mute .popup-container{min-width:16rem}.popup-reacted-list{--size:1.5rem;--custom-emoji-size:var(--size)}.popup-reacted-list .popup-container{height:600px;max-height:600px;padding:0;width:25rem}.popup-reacted-list .popup-header{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);margin:0;min-height:3.5625rem;padding:.25rem .75rem .75rem}.popup-reacted-list .popup-close{height:40px;margin-right:.5rem;margin-top:.375rem;order:-1}.popup-reacted-list .reaction{--reaction-size:var(--size);--additional-height:.75rem;--margin:.5rem;--background-color:var(--light-filled-primary-color);--counter-color:var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color:#fff}.popup-reacted-list .reaction-sticker-icon{font-size:1.25rem!important}.popup-reacted-list .reaction-sticker-icon{align-items:center;display:flex;margin:0}.popup-reacted-list .sidebar-left-section{margin-bottom:0!important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:#fff;background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{display:flex;height:var(--size);position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:var(--size)}.popup-reacted-list .chatlist-chat{padding-right:3.25rem!important}.popup-payment .popup-container{border-radius:16px;max-height:min(100%,43.5rem);max-width:26.25rem;padding:0;width:26.25rem}.popup-payment .popup-header{height:3.5rem;margin:0;padding:0 1rem}.popup-payment.is-loading .popup-container{min-height:26.25rem}.popup-payment .scrollable{display:flex;flex:1 1 auto;flex-direction:column}.popup-payment hr{display:block!important;margin:.5rem 0!important;padding:0!important}.popup-payment .input-field{--height:3rem;margin:.75rem .5rem 0}.popup-payment .input-field-input{--padding:.75rem}.popup-payment .input-fields-row .input-field{margin-top:1.25rem}.popup-payment .sidebar-left-section{padding:0!important}.popup-payment .sidebar-left-section-name+.input-field,.popup-payment .sidebar-left-section-name+.input-fields-row .input-field{margin-top:.75rem}.popup-payment .sidebar-left-section .row{margin-top:.5rem}.popup-payment .sidebar-left-section-content{margin:0 .5rem!important}.popup-payment .select-wrapper{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);max-height:10rem}.popup-payment .select-wrapper li{grid-template-columns:calc(26px + 2rem) 1fr;height:3rem}.popup-payment .payment-verification{border:none;flex:1 1 auto;height:40rem;max-height:100%;width:100%}.popup-payment .row{border-radius:10px}.payment-item{padding:0 1.25rem;width:100%}.payment-item-details{display:flex;flex:0 0 auto;justify-content:space-between;margin-bottom:1rem;overflow:hidden}.payment-item-details:last-child{margin-bottom:0}.payment-item-details-photo{border-radius:10px;flex:0 0 auto;height:6.25rem;margin-right:1rem;width:6.25rem}.payment-item-details-photo .media-photo{border-radius:inherit}.payment-item-details-lines{display:flex;flex:1 1 auto;flex-direction:column}.payment-item-details-lines-title{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16)}.payment-item-details-lines-bot-name,.payment-item-details-lines-description{font-size:14px;font-size:var(--font-size-14);line-height:1.25rem}.payment-item-details-lines-bot-name{color:#707579;color:var(--secondary-text-color)}.payment-item-prices{display:flex;flex-direction:column;margin:1rem .25rem .5rem}.payment-item-prices-price{color:#707579;color:var(--secondary-text-color);display:flex;font-weight:500;justify-content:space-between;line-height:1.1875rem}.payment-item-prices-price+.payment-item-prices-price{margin-top:1.5rem}.payment-item-prices-price.is-total{color:#000;color:var(--primary-text-color)}.payment-item-tips{display:flex;justify-content:space-between;margin:.75rem -.5rem 1.5rem}.payment-item-tips-tip{--background-intensity:.1;background-color:rgba(84,190,97,var(--background-intensity));border-radius:1.25rem;color:#3ba748;flex:1 1 auto;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;line-height:2.5rem;text-align:center}body.animation-level-2 .payment-item-tips-tip{transition:color .1s ease-in-out,background-color .1s ease-in-out}.payment-item-tips-tip+.payment-item-tips-tip{margin-left:.5rem}html.no-touch .payment-item-tips-tip:not(.active):active,html.no-touch .payment-item-tips-tip:not(.active):hover{--background-intensity:.3}.payment-item-tips-tip.active{--background-intensity:1;color:#fff}.payment-item-tips-input{color:inherit!important;font-weight:inherit!important}.payment-item-tips-input{display:inline}.payment-item-row{margin:0 .5rem;padding-bottom:0;padding-top:0}.payment-item-method-row .media-photo{border-radius:10px}.payment-item-pay{flex:0 0 auto;height:3rem;margin:1rem;text-transform:uppercase;width:auto}.payment-item-preloader-container{flex:1 1 auto;position:relative}.popup-payment-shipping-methods .popup-container{min-height:auto}.popup-payment-shipping-methods .row{margin-top:0!important}.popup-payment-verification .popup-header:after{background-color:#dfe1e5;background-color:var(--border-color);bottom:-1px;content:" ";height:1px;left:0;position:absolute;right:0}.popup-payment-card-confirmation .popup-container{min-height:auto}.popup-payment-card-confirmation .input-field-password{margin-top:.5rem!important}.popup-limit .popup-container{min-width:min(100%,22.5rem)}.popup-limit-line{align-items:center;display:flex;flex-direction:column;margin:.75rem 0}.popup-limit-hint{align-items:center;color:#fff;display:flex;font-weight:500;font-weight:var(--font-weight-bold);justify-content:center;transform:scale(.6) translate(-280px,16px) rotate(-30deg)}body.animation-level-2 .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.2)}.popup-limit-hint.active{transform:scale(1) translate(0) rotate(0)}.popup-limit-hint-icon{display:flex;font-size:1.25rem;margin-right:.25rem}.popup-limit-button.primary{color:#fff!important}.popup-limit-button.primary{align-items:center;background:linear-gradient(88.39deg,#6c93ff -2.56%,#976fff 51.27%,#df69d1 107.39%);display:flex}.popup-limit-button-icon{display:flex;font-size:1.5rem;margin-left:.625rem}.popup-limit .limit-line{align-self:stretch;margin:1rem .5rem 0}.popup-limit:not(.is-locked) .popup-limit-hint{background:linear-gradient(73.4deg,#6c93ff -7.21%,#976fff 114.57%,#df69d1 241.52%);background-size:200px 2rem;border-radius:1rem;height:2rem;padding:0 .75rem;position:relative}.popup-limit:not(.is-locked) .popup-limit-hint:after{background:inherit;background-position-x:calc(-50% - 86px);background-repeat:no-repeat;background-size:inherit;bottom:-9px;-webkit-clip-path:path("M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z");clip-path:path("M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z");content:" ";display:block;height:9px;left:50%;margin-left:-13px;position:absolute;width:100%}.popup-limit.is-locked .popup-limit-hint{background-color:#3390ec;background-color:var(--primary-color);border-radius:1.375rem;height:2.75rem;margin-right:-.25rem;padding:0 1.25rem 0 1rem}.popup-limit.is-premium .popup-limit-hint{align-self:flex-end;background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);background-position-x:100%;background-size:200px 2rem;border-bottom-right-radius:0;margin-right:.5rem}body.animation-level-2 .popup-limit.is-premium .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.1)}.popup-limit.is-premium .popup-limit-hint:after{background-position-x:134%;bottom:-11.5px;-webkit-clip-path:path("M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z");clip-path:path("M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z");height:12px;left:100%;margin-left:-20.6px}#auth-pages{background:#fff;background:var(--surface-color);max-width:100%;overflow:hidden}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width:600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width:600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width:600px){#auth-pages .input-wrapper{margin-top:41px;padding:0 16px;width:100%}}#auth-pages .auth-image,#auth-pages .input-wrapper,#auth-pages .subtitle{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;margin:0 auto;max-width:720px;position:relative}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height:810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{margin:0 auto;max-width:720px;min-width:auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{display:flex;flex:1 1 auto;flex-direction:column;height:810px;padding:0;width:100%}@media screen and (max-height:810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width:600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-bottom:.5rem;margin-top:.5rem}.page-sign .auth-image,.page-signUp .auth-image{height:7.5rem;margin-bottom:1.5rem;width:7.5rem}@media only screen and (min-width:601px){.page-sign .auth-image,.page-signUp .auth-image{height:10rem;margin-bottom:1.5rem;width:10rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{fill:#3390ec;fill:var(--primary-color);max-height:100%;max-width:100%}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:400}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:visible!important;overflow:initial!important}.page-signQR .auth-image{height:240px!important;width:240px!important}.page-signQR .auth-image{align-items:center;display:flex;justify-content:center}.page-signQR .auth-image .preloader{left:auto;top:auto;transform:none}.page-signQR .auth-image .qr-canvas{height:100%;width:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem!important}.page-signQR h4{flex:0 0 auto}[dir=ltr] .page-signQR .qr-description{text-align:left}[dir=rtl] .page-signQR .qr-description{text-align:right}.page-signQR .qr-description{line-height:1.3125;line-height:var(--line-height);margin:1rem auto;max-width:480px}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-bottom:14px;margin-top:10px}@media only screen and (max-width:600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width:600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{align-items:center;display:flex;justify-content:center;margin:1.375rem 0 .875rem}.page-authCode .phone-wrapper h4[contenteditable]{border:none;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color);outline:none;padding:0 1rem}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40!important;border-color:var(--danger-color)!important}.page-authCode .phone-wrapper .phone{margin:0}.page-authCode .subtitle{margin:0 auto!important}.page-authCode .subtitle{max-width:300px}.page-chats{max-width:1682px!important}.page-chats{display:flex}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{height:100%;max-height:100%;min-height:100%;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.page-chats .main-column{display:flex!important}.page-chats .main-column{width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{display:flex!important}.page-chats #column-center{background-color:#e6ebee;width:100%}.page-chats #column-right{display:flex!important}.page-chats .main-column{height:100%;max-height:100%;min-height:100%;position:relative}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;height:100%;left:0;max-height:100%;overflow:hidden;position:absolute;top:0;width:100%;z-index:3}@media only screen and (min-width:1681px){.page-chats{border-color:#dfe1e5;border-color:var(--border-color);border-style:solid;border-width:0 1px}}.page-chats .avatar-edit{flex:0 0 auto;height:120px;margin:1rem auto 2rem;width:120px}body.animation-level-2 .page-chats .main-column{transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;overflow:hidden;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:100vh;height:calc(var(--vh, 1vh)*100)}}html.is-ios{-webkit-touch-callout:none;position:fixed;-webkit-user-select:none}html.no-backdrop{--menu-background-color:var(--surface-color);--menu-backdrop-filter:none}@supports(padding:max(0px)){html{padding:0 min(16px,env(safe-area-inset-right)) 0 min(16px,env(safe-area-inset-left))}}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:16px}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,html,input,optgroup,select,textarea{font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}a,button,div,input,select,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}code,kbd,pre,samp{font-family:Roboto Mono,monospace;font-family:var(--font-monospace)}.whole{height:100%;margin:0 auto;max-width:1680px;min-height:100%;width:100%}@media only screen and (min-width:601px){.only-handhelds{display:none!important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500;font-weight:var(--font-weight-bold)}h4{font-size:2rem;line-height:110%;margin:22px 0 14px}@media only screen and (max-width:600px){h4{font-size:20px;margin:2px 0 8px}}[contenteditable=true],input{background-color:transparent;caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color)}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{position:absolute;right:0;visibility:hidden}input:-webkit-autofill:first-line{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial;font-size:16px}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40!important;color:var(--danger-color)!important}.danger .c-ripple__circle{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec!important;color:var(--primary-color)!important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.primary-text{color:#000!important;color:var(--primary-text-color)!important}.color-premium{-webkit-text-fill-color:transparent;background:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%);background:var(--premium-gradient);-webkit-background-clip:text}.blue:before,.danger:before,.primary:before{color:inherit!important}.bg-warning{background:#fed85a!important}.contextmenu{bottom:auto!important;position:fixed!important;right:auto!important;width:auto!important;z-index:4!important}.preloader{height:50px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:50px}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:min(30rem,calc(100vw - 2rem));opacity:0;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast.is-visible{opacity:1}body.animation-level-2 .toast{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.toast b{color:inherit}.toast a{color:#60a5e9!important}.toast a{cursor:pointer}hr{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}b{font-weight:500;font-weight:var(--font-weight-bold)}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit.is-forum{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}.avatar-edit-canvas{background:linear-gradient(#69bffa,#3d9de0);background:linear-gradient(var(--avatar-color-top),var(--avatar-color-bottom));height:100%;max-height:100%;max-width:100%;width:100%}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{color:#fff;font-size:3rem;height:3rem;left:50%;line-height:1;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);width:3rem;z-index:2}.avatar-edit .avatar-placeholder{filter:brightness(.7);height:100%;left:0;position:absolute;top:0;width:100%}.missing-icon{height:1.5rem;width:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;left:0;max-height:23.5rem;opacity:0;overflow:hidden;position:absolute;top:calc(100% + .5rem);transform:scale(.95);transform-origin:top center;transition:opacity .2s ease-out,transform .2s ease-out;width:100%;z-index:3}.select-wrapper.active{opacity:1;transform:scale(1)}.select-wrapper ul{margin:.5rem 0}[dir=ltr] .select-wrapper li{text-align:left}[dir=rtl] .select-wrapper li{text-align:right}.select-wrapper li{align-items:center;cursor:pointer;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px;height:3.5rem;justify-content:space-between;padding:0 1rem}html.no-touch .select-wrapper li:active,html.no-touch .select-wrapper li:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{font-size:26px;height:26px;line-height:1;width:26px}.select-wrapper .scrollable{position:relative}[dir=ltr] .phone-code{text-align:right}[dir=rtl] .phone-code{text-align:left}.phone-code{color:#9e9e9e}.auth-image{height:166px;margin:0 auto 18px;position:relative;width:166px}@media only screen and (max-width:600px){.auth-image{height:120px;width:120px}}[dir=ltr] .phone-edit{margin-left:.4rem}[dir=rtl] .phone-edit{margin-right:.4rem}.phone-edit{cursor:pointer;font-size:1.5rem;height:1.5rem;line-height:1;opacity:.5;transition:opacity .2s;width:1.5rem}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!important;line-height:1!important;vertical-align:baseline!important;vertical-align:initial!important}span.emoji{font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol}@media not screen and (-webkit-min-device-pixel-ratio:2),not screen and (min-device-pixel-ratio:2),not screen and (min-resolution:192dpi),not screen and (min-resolution:2dppx){html[dir=ltr]:not(.is-safari) span.emoji{margin-right:5px!important}html[dir=rtl]:not(.is-safari) span.emoji{margin-left:5px!important}html[dir=ltr]:not(.is-safari) avatar-element span.emoji{margin-right:0!important}html[dir=rtl]:not(.is-safari) avatar-element span.emoji{margin-left:0!important}}img.emoji{display:inline-block;height:18px;max-height:100%;max-width:100%;vertical-align:middle;width:18px}[contenteditable=true]{cursor:text;outline:none;-webkit-user-select:text;-moz-user-select:text;user-select:text;white-space:pre-wrap}[contenteditable=true] .custom-emoji{display:inline-block;margin-bottom:-2px}[contenteditable=true] .custom-emoji:before{content:none}[contenteditable=true] [style*=markup]{font-family:inherit!important}[contenteditable=true] [style*=bold]{font-weight:700}[contenteditable=true] [style*=italic]{font-style:italic}[contenteditable=true] [style*=underline]{text-decoration-line:underline}[contenteditable=true] [style*=strikethrough]{text-decoration-line:line-through}[contenteditable=true] [style*=underline][style*=strikethrough]{text-decoration-line:underline line-through}[contenteditable=true] [style*=monospace]{font-family:Roboto Mono,monospace!important;font-family:var(--font-monospace)!important}[contenteditable=true] [style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color)}[contenteditable][data-placeholder]:before{color:#a2acb4;content:attr(data-placeholder);display:block;opacity:0;pointer-events:none;position:absolute}body.animation-level-2 [contenteditable][data-placeholder]:before{transform:translateX(1.75rem);transition:opacity .2s ease-out .01s,transform .2s ease-out .01s;transition:opacity var(--input-transition) .01s,transform var(--input-transition) .01s}[contenteditable][data-placeholder]:empty:before{opacity:1}body.animation-level-2 [contenteditable][data-placeholder]:empty:before{transform:translateX(0)}.sticky_sentinel{left:0;pointer-events:none;position:absolute;right:0;visibility:hidden}.super-stickers{display:grid;grid-template-columns:repeat(auto-fill,72px);grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}html.no-touch .super-sticker:active,html.no-touch .super-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){[dir=ltr] .show-more{padding-left:8px}[dir=rtl] .show-more{padding-right:8px}}[dir=ltr] .show-more .tgico-down{padding-left:1rem;padding-right:2rem}[dir=rtl] .show-more .tgico-down{padding-left:2rem;padding-right:1rem}.show-more .tgico-down{float:left;font-size:24px}.content-empty,.show-more .tgico-down{color:#707579;color:var(--secondary-text-color)}::-moz-selection{background:rgba(51,144,236,.4);background:var(--selection-background-color)}.selection:after,::selection{background:rgba(51,144,236,.4);background:var(--selection-background-color)}.selection:after{bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.input-something{display:inline-block}.input-selectable{position:relative}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{grid-gap:.25rem;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);width:100%}.grid-item{cursor:pointer;height:0;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-item-media{height:100%;left:0;-o-object-fit:cover;object-fit:cover;position:absolute;top:0;width:100%}.animated-super-row{--translateY:100%;bottom:0;left:0;position:absolute;right:0;top:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0,calc(var(--translateY)*-1),0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0,var(--translateY),0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{bottom:0;left:0;position:absolute;right:0;top:0}middle-ellipsis-element{display:block;overflow:hidden;width:100%}.album-item-media{height:100%;width:100%}html.no-touch .hover-effect:active,html.no-touch .hover-effect:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.progress-ring{left:0;pointer-events:none;position:absolute;top:0}.progress-ring__circle{stroke-linecap:round;transition:stroke-dashoffset}.rlottie,.rlottie-vector{bottom:0;height:100%;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0;width:100%}.rlottie-icon{pointer-events:none;position:relative}body.animation-level-2 .rlottie.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.canvas-thumbnail{height:100%;position:absolute;width:100%}.media-container-contain{position:relative}.media-container-contain .media-photo{max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain}.media-container-cover{position:relative}.media-container-cover .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.media-photo,.media-poster,.media-round,.media-sticker,.media-video{bottom:0;left:0;position:absolute;right:0;top:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-poster.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-video.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-poster.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-video.fade-out{animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{height:100%;margin:auto;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;width:100%}.media-sticker-wrapper.is-premium-sticker:before{align-items:center;background:rgba(0,0,0,.2);background-image:var(--lock-url);background-repeat:no-repeat;background-size:cover;border-radius:50%;bottom:.125rem;color:#fff;display:flex;height:1.25rem;justify-content:center;left:50%;position:absolute;transform:translateX(-50%);width:1.25rem;z-index:1}body.is-premium .media-sticker-wrapper.is-premium-sticker:after,body.is-premium .media-sticker-wrapper.is-premium-sticker:before{content:none}.media-round{max-height:280px;max-height:var(--round-video-size);max-width:280px;max-width:var(--round-video-size);z-index:1}.media-round canvas{border-radius:50%;height:100%;position:relative;width:100%}.media-round .video-time{background-color:rgba(109,141,65,.4)!important;background-color:var(--message-highlightning-color)!important}.media-round .video-time{padding:0 .375rem}[dir=ltr] .media-round .video-time:after,[dir=ltr] .media-round .video-time:before{margin-left:.25rem}[dir=rtl] .media-round .video-time:after,[dir=rtl] .media-round .video-time:before{margin-right:.25rem}.media-round.is-unread .video-time:before{background-color:#fff;border-radius:50%;content:" ";height:.5rem;order:1;width:.5rem}.media-round.is-paused .video-time:after{align-items:center;content:"";display:flex;font-size:1.125rem;order:2}.gradient-delimiter{background-color:#f4f4f5;background-color:var(--background-color-true);height:.75rem;position:relative;width:100%}.gradient-delimiter:before{background:linear-gradient(180deg,rgba(0,0,0,.06),transparent 20%,transparent 94%,rgba(0,0,0,.06));bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.sidebar-left-section{padding:.5rem 0!important}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);box-shadow:0 1px 3px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 var(--section-box-shadow-color);margin-bottom:.75rem}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{padding:0 1rem}}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-left-section-container a{cursor:pointer}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important}.tgico-admin:before,.tgico-fontsize:before{padding:2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px!important}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.navigable-list .active{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{--esg-emoji-total-size:calc(var(--esg-emoji-size) + 0.5rem);--custom-emoji-size:var(--esg-emoji-size);grid-column-gap:2.44px;--esg-emoji-size:2.125rem;--esg-emoji-total-size:2.625rem;--custom-emoji-size:2.25rem;-moz-column-gap:2.44px;column-gap:2.44px;-moz-column-gap:.25rem;column-gap:.25rem;display:grid;font-size:var(--esg-emoji-size);grid-template-columns:repeat(auto-fill,var(--esg-emoji-total-size));justify-content:space-between;line-height:var(--esg-emoji-size);position:relative}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:var(--esg-emoji-total-size);line-height:inherit;margin-left:.0625rem;margin-right:.0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:var(--esg-emoji-total-size)}.super-emojis .super-emoji .emoji-placeholder{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;height:1.75rem;left:7px;pointer-events:none;position:absolute;top:7px;width:1.75rem}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{height:100%;margin:0;vertical-align:baseline;vertical-align:initial;width:100%}.super-emojis .super-emoji.active,html.no-touch .super-emojis .super-emoji:active,html.no-touch .super-emojis .super-emoji:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.super-emojis.not-local .super-emoji{padding:.1875rem}.super-emojis .super-emoji{margin:0}.super-emojis:not(.not-local) .super-emoji{overflow:hidden}html.native-emoji .super-emojis:not(.not-local) .super-emoji{padding-bottom:.3125rem;padding-top:.3125rem}.super-emojis .custom-emoji{display:block}.super-emojis .custom-emoji-renderer{z-index:1}.super-emojis .custom-emoji:before{content:none}.tgico-char:before{font-family:Roboto!important}.tgico-char:before{font-weight:500;font-weight:var(--font-weight-bold);text-align:center;width:1.5rem}.tgico-char.z:before{content:"Z"}.tgico-char.w:before{content:"W"}.sending-status:empty{display:none}.sending-status .tgico-sendingerror{color:#df3f40;color:var(--danger-color)}.sending-status-icon{line-height:1!important}.sending-status-icon{position:absolute}.quick-reaction-title{align-items:center;display:flex}.quick-reaction-sticker{height:32px!important;margin:0 .5rem 0 0!important;position:relative!important;width:32px!important}.verified-icon-svg{height:1rem;width:1rem}.verified-icon-check{fill:#fff}.verified-icon-background{fill:#3390ec;fill:var(--primary-color)}[dir=ltr] .emoji-status,[dir=ltr] .premium-icon,[dir=ltr] .verified-icon{margin-left:.125rem}[dir=rtl] .emoji-status,[dir=rtl] .premium-icon,[dir=rtl] .verified-icon{margin-right:.125rem}.emoji-status,.premium-icon,.verified-icon{align-items:center;display:flex;flex:0 0 auto;font-size:1rem;height:1.25rem;justify-content:center;width:1.25rem}[dir=ltr] .emoji-status{margin-left:.25rem}[dir=rtl] .emoji-status{margin-right:.25rem}.emoji-status{height:1.125rem;position:relative;width:1.125rem}.premium-icon{color:#3390ec;color:var(--primary-color);margin-top:-.0625rem}.badge-fake{line-height:1!important}.badge-fake{border:1px solid #df3f40;border:1px solid var(--danger-color);border-radius:.185rem;color:#df3f40;color:var(--danger-color);flex:0 0 auto;font-size:.625rem;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.25rem;margin-right:.25rem;padding:.125rem .25rem}.peer-title.with-icons{align-items:center;display:flex;overflow:hidden}.peer-title-inner{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.limit-line{display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:2rem}.limit-line-free{color:#000}.limit-line-premium{color:#fff}.limit-line-free{background-color:#f1f3f5;border-bottom-left-radius:10px;border-top-left-radius:10px}.limit-line-premium{background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);border-bottom-right-radius:10px;border-top-right-radius:10px}.limit-line-free,.limit-line-premium{align-items:center;display:flex;flex:1 1 0;justify-content:space-between;padding:0 .75rem}.movable-element{--size:.5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{cursor:row-resize;height:var(--size);left:0;right:0}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{bottom:0;cursor:col-resize;top:0;width:var(--size)}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-sw{height:var(--size);width:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se{cursor:nwse-resize}.movable-element-resize-handler-side-ne{right:0;top:0}.movable-element-resize-handler-side-se{bottom:0;right:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{left:0;top:0}[dir=ltr] .chatlist-chat.row-with-padding{padding-left:4.5rem!important}[dir=rtl] .chatlist-chat.row-with-padding{padding-right:4.5rem!important}.chatlist-chat span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist-chat .row-title{font-size:16px!important;font-size:var(--font-size-16)!important}.chatlist-chat .row-title{line-height:1.375rem}.chatlist-chat .row-title-right-secondary{font-size:12px!important;font-size:var(--font-size-12)!important;line-height:16px!important;line-height:var(--line-height-12)!important}.chatlist-chat .row-title-right-secondary{margin-top:-.4375rem}.chatlist-chat .row-subtitle{display:block!important}.chatlist-chat .row-row{height:1.375rem}.chatlist-chat.chatlist-chat-abitbigger .row-subtitle{margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle{font-size:16px!important;font-size:var(--font-size-16)!important}.chatlist-chat.chatlist-chat-bigger .row-subtitle{line-height:1.375rem;margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle-row{margin-top:.125rem}.chatlist-chat.chatlist-chat-bigger .row-title .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.username-purchase-help b{color:#df3f40!important;color:var(--danger-color)!important;font-weight:400!important;font-weight:var(--font-weight-normal)!important}.media-spoiler-container{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.media-spoiler-container.is-revealing{opacity:1}.media-spoiler-container.is-revealing:not(.backwards){opacity:0}.media-spoiler-container.is-revealing.animating{transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}.media-spoiler .canvas-thumbnail,.media-spoiler-thumbnail{-o-object-fit:initial!important;object-fit:fill!important}.media-spoiler .canvas-thumbnail,.media-spoiler-thumbnail{height:100%;position:absolute;width:100%} - -/*# sourceMappingURL=main.7560b2e0691f11f45725.css.map*/ \ No newline at end of file diff --git a/public/main.7560b2e0691f11f45725.css.map b/public/main.7560b2e0691f11f45725.css.map deleted file mode 100644 index 07af40cc9..000000000 --- a/public/main.7560b2e0691f11f45725.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"main.7560b2e0691f11f45725.css","mappings":"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","sources":["webpack://tweb/./src/materialize.scss","webpack://tweb/./src/scss/style.scss"],"sourcesContent":["/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{-webkit-text-decoration-skip:objects;background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){list-style-type:none;padding-left:0}ul:not(.browser-default)>li{list-style-type:none}a{-webkit-tap-highlight-color:rgba(0,0,0,0)}button{background:none;border:none;cursor:pointer;outline:none;padding:0}img,video{-webkit-user-drag:none}.valign-wrapper{align-items:center;display:flex}.z-depth-0{box-shadow:none!important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none!important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;user-select:none}.no-transition,.no-transition:after,.no-transition:before{transition:none!important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start!important}.justify-self-start{justify-self:flex-start!important}.justify-self-end{justify-self:flex-end!important}.position-center{position:absolute!important}.position-center{left:50%;top:50%;transform:translate(-50%,-50%)}.text-bold{font-weight:500!important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap!important}.no-wrap{white-space:nowrap!important}.no-border-radius{border-radius:0!important}.disable-hover{pointer-events:none!important}.reflect-x{transform:scaleX(-1)}[dir=auto]{unicode-bidi:plaintext}.is-rtl [dir=auto]{direction:inherit}a{text-decoration:none}html{font-weight:400;line-height:1.5}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}code,pre{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap}",":root{--vh:1vh;--z-below:-1;--hover-alpha:0.08;--transition-standard-easing:cubic-bezier(.4,.0,.2,1);--transition-standard-in-time:.3s;--transition-standard-out-time:.25s;--transition-standard-in:var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out:var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition:.2s ease-in-out;--layer-transition:.2s cubic-bezier(.4,.0,.2,1);--slide-header-transition:.4s ease-in-out;--tabs-transition:.2s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--input-transition:.2s ease-out;--sticker-viewer-open-transition-in:.2s var(--transition-standard-easing);--sticker-viewer-open-transition-out:.2s var(--transition-standard-easing);--sticker-viewer-switch-transition:.2s cubic-bezier(.12,1.1,.56,1.2);--popup-transition-function:cubic-bezier(.4,0,.2,1);--popup-transition-time:.15s;--btn-corner-transition:.2s cubic-bezier(.34,1.56,.64,1);--chatlist-badge-transition-in:.25s cubic-bezier(.35,.35,.47,1.34);--chatlist-badge-transition-out:.25s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin:5.5625rem;--message-beside-button-size:2.375rem;--message-beside-button-margin:calc((var(--message-beside-button-size) + 0.5rem)*-1);--message-time-background:rgba(0,0,0,.35);--message-highlightning-color:rgba(109,141,65,.4);--messages-container-width:728px;--messages-text-size:16px;--messages-line-height:1.3125;--messages-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-text-size) + 4px);--messages-time-text-size:calc(var(--messages-text-size) - 4px);--messages-service-text-size:calc(var(--messages-text-size) - 1px);--messages-custom-emoji-size:calc(var(--messages-text-size) + 4px);--bubble-transition-in:transform var(--transition-standard-in),opacity var(--transition-standard-in);--bubble-transition-out:transform var(--transition-standard-out),opacity var(--transition-standard-out);--line-height-20:26px;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--line-height:1.3125;--font-size-20:20px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--font-size:var(--font-size-16);--esg-sticker-size:72px;--esg-custom-emoji-size:36px;--popup-sticker-size:80px;--disabled-opacity:.3;--round-video-size:280px;--menu-box-shadow:0px 0px 10px var(--menu-box-shadow-color);--menu-backdrop-filter:blur(50px);--font-monospace:\"Roboto Mono\",monospace;--font-weight-bold:500;--font-weight-normal:400;--selection-background-color:rgba(var(--primary-color-rgb),.4);--selection-color:inherit;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--custom-emoji-size:1.25rem;--peer-avatar-red-top:#ff845e;--peer-avatar-red-bottom:#d45246;--peer-avatar-orange-top:#febb5b;--peer-avatar-orange-bottom:#f68136;--peer-avatar-violet-top:#b694f9;--peer-avatar-violet-bottom:#6c61df;--peer-avatar-green-top:#9ad164;--peer-avatar-green-bottom:#46ba43;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#5bcbe3;--peer-avatar-blue-bottom:#359ad4;--peer-avatar-pink-top:#ff8aac;--peer-avatar-pink-bottom:#d95574;--peer-avatar-saved-top:#69bffa;--peer-avatar-saved-bottom:#3d9de0;--peer-avatar-archive-top:#b8c2cc;--peer-avatar-archive-bottom:#9eaab5;--avatar-color-top:var(--peer-avatar-saved-top);--avatar-color-bottom:var(--peer-avatar-saved-bottom);--avatar-border-radius-forum:37%;--premium-gradient:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%)}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-sticker-size:68px;--popup-sticker-size:68px;--round-video-size:200px;--chat-input-size:2.875rem;--chat-input-padding:0.5rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:601px){:root{--right-column-width:420px;--chat-input-size:3.375rem;--chat-input-padding:0.8125rem;--chat-input-inner-padding:0.5rem}}@media only screen and (max-height:569px){:root{--chat-input-size:2.875rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:1276px)and (max-width:1680px){:root{--right-column-width:25vw}}:root{--body-background-color:#fff;--background-color-true:#f4f4f5;--background-color:var(--background-color-true);--border-color:#dfe1e5;--surface-color-rgb:255,255,255;--surface-color:#fff;--scrollbar-color:rgba(0,0,0,.2);--section-box-shadow-color:rgba(0,0,0,.06);--menu-box-shadow-color:rgba(0,0,0,.15);--input-search-background-color:#fff;--input-search-border-color:#dfe1e5;--primary-color:#3390ec;--light-primary-color:rgba(51,144,236,.08);--light-filled-primary-color:#eff6fd;--dark-primary-color:#2086ea;--primary-color-rgb:51,144,236;--primary-text-color:#000;--primary-text-color-rgb:0,0,0;--secondary-color:#c4c9cc;--secondary-text-color:#707579;--light-secondary-text-color:hsla(207,4%,46%,.08);--light-filled-secondary-text-color:#f4f4f4;--danger-color:#df3f40;--light-danger-color:rgba(223,63,64,.08);--dark-danger-color:#d22324;--avatar-online-color:#0ac630;--chatlist-status-color:var(--avatar-online-color);--chatlist-pinned-color:#a2abb2;--badge-text-color:#fff;--link-color:#00488f;--ripple-color:rgba(0,0,0,.08);--poll-circle-color:var(--border-color);--spoiler-background-color:#e3e5e8;--spoiler-draft-background-color:#d9d9d9;--monospace-text-color:var(--danger-color);--backdrop-opacity:.85;--menu-background-color:rgba(var(--surface-color-rgb),var(--backdrop-opacity));--message-background-color:var(--surface-color);--message-checkbox-color:#61c642;--message-checkbox-border-color:#fff;--message-primary-color:var(--primary-color);--light-filled-message-primary-color:var(--light-filled-primary-color);--message-secondary-color:var(--secondary-color);--message-error-color:var(--danger-color);--message-out-background-color:#eeffde;--light-message-out-background-color:rgba(238,255,222,.08);--dark-message-out-background-color:#d9ffb5;--message-out-link-color:var(--link-color);--message-out-primary-color:#4fae4e;--light-filled-message-out-primary-color:#e1f9d2;--message-out-status-color:var(--message-out-primary-color);--message-out-audio-play-button-color:#fff;--message-out-selection-background-color:var(--selection-background-color);--gc-background-color:#212121;--gc-button-leave-color:rgba(255,89,90,.3);--gc-button-unmuted-color:rgba(1,200,80,.2);--gc-button-muted-color:rgba(60,135,247,.2);--gc-button-hand-color:rgba(223,68,184,.2);--gc-button-unmuted-fill-color:#195530;--gc-button-muted-fill-color:#3c87f7;--gc-green-color:#195530;--gc-blue-color:#3c87f7;--gc-red-color:#643333;--gc-primary-text-color:#fff;--gc-secondary-text-color:#aaa;--gc-green-text-color:#5cc85e;--gc-blue-text-color:#3390ec;--gc-red-text-color:#ff595a;--gc-right-column-width:26.25rem}.night{--body-background-color:#181818;--background-color-true:#181818;--background-color:var(--background-color-true);--border-color:#0f0f0f;--surface-color-rgb:33,33,33;--surface-color:#212121;--scrollbar-color:hsla(0,0%,100%,.2);--section-box-shadow-color:rgba(0,0,0,.12);--input-search-background-color:#181818;--input-search-border-color:#2f2f2f;--primary-color:#8774e1;--light-primary-color:rgba(135,116,225,.08);--light-filled-primary-color:#292830;--dark-primary-color:#6a52da;--primary-color-rgb:135,116,225;--primary-text-color:#fff;--primary-text-color-rgb:255,255,255;--secondary-color:#707579;--secondary-text-color:#aaa;--light-secondary-text-color:hsla(0,0%,67%,.08);--light-filled-secondary-text-color:#2c2c2c;--danger-color:#ff595a;--light-danger-color:rgba(255,89,90,.08);--dark-danger-color:#ff3031;--avatar-online-color:#0ac630;--chatlist-status-color:var(--primary-color);--chatlist-pinned-color:var(--secondary-color);--badge-text-color:#fff;--link-color:var(--primary-color);--ripple-color:hsla(0,0%,100%,.08);--poll-circle-color:#fff;--spoiler-background-color:#373e4e;--spoiler-draft-background-color:#484848;--monospace-text-color:var(--primary-text-color);--menu-background-color:rgba(var(--surface-color-rgb),.75);--message-background-color:var(--surface-color);--message-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--message-error-color:#fff;--message-out-background-color:#8774e1;--light-message-out-background-color:rgba(135,116,225,.08);--dark-message-out-background-color:#6a52da;--message-out-link-color:#fff;--message-out-primary-color:#fff;--light-filled-message-out-primary-color:#917fe3;--message-out-status-color:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color);--message-out-selection-background-color:rgba(var(--surface-color-rgb),.4)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?ivbp49) format(\"truetype\"),url(assets/fonts/tgico.woff?ivbp49) format(\"woff\"),url(assets/fonts/tgico.svg?ivbp49#tgico) format(\"svg\")}.tgico:after,.tgico:before,[class*=\" tgico-\"]:after,[class*=\" tgico-\"]:before,[class^=tgico-]{font-family:tgico!important}.tgico:after,.tgico:before,[class*=\" tgico-\"]:after,[class*=\" tgico-\"]:before,[class^=tgico-]{speak:never;font-feature-settings:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.tgico-check:before{content:\"\"}.tgico-checks:before{content:\"\"}.tgico-activesessions:before{content:\"\"}.tgico-add:before{content:\"\"}.tgico-add_reaction:before{content:\"\"}.tgico-addmember_filled:before{content:\"\"}.tgico-adduser:before{content:\"\"}.tgico-admin:before{content:\"\"}.tgico-animals:before{content:\"\"}.tgico-animations:before{content:\"\"}.tgico-archive:before{content:\"\"}.tgico-arrow_down:before{content:\"\"}.tgico-arrow_next:before{content:\"\"}.tgico-attach:before{content:\"\"}.tgico-audio_repeat:before{content:\"\"}.tgico-audio_repeat_single:before{content:\"\"}.tgico-avatarnext:before{content:\"\"}.tgico-avatarprevious:before{content:\"\"}.tgico-binfilled:before{content:\"\"}.tgico-bold:before{content:\"\"}.tgico-botcom:before{content:\"\"}.tgico-bots:before{content:\"\"}.tgico-bug:before{content:\"\"}.tgico-calendar:before{content:\"\"}.tgico-calendarfilter:before{content:\"\"}.tgico-camera:before{content:\"\"}.tgico-cameraadd:before{content:\"\"}.tgico-car:before{content:\"\"}.tgico-card:before{content:\"\"}.tgico-card_outline:before{content:\"\"}.tgico-channel:before{content:\"\"}.tgico-channelviews:before{content:\"\"}.tgico-chatspinned:before{content:\"\"}.tgico-chatsplaceholder:before{content:\"\"}.tgico-check1:before{content:\"\"}.tgico-checkbox:before{content:\"\"}.tgico-checkboxblock:before{content:\"\"}.tgico-checkboxempty:before{content:\"\"}.tgico-checkboxon:before{content:\"\"}.tgico-checkretract:before{content:\"\"}.tgico-checkround:before{content:\"\"}.tgico-close:before{content:\"\"}.tgico-clouddownload:before{content:\"\"}.tgico-colorize:before{content:\"\"}.tgico-comments:before{content:\"\"}.tgico-commentssticker:before{content:\"\"}.tgico-copy:before{content:\"\"}.tgico-darkmode:before{content:\"\"}.tgico-data:before{content:\"\"}.tgico-delete:before{content:\"\"}.tgico-delete_filled:before{content:\"\"}.tgico-deletedaccount:before{content:\"\"}.tgico-deleteleft:before{content:\"\"}.tgico-deleteuser:before{content:\"\"}.tgico-devices:before{content:\"\"}.tgico-document:before{content:\"\"}.tgico-down:before{content:\"\"}.tgico-download:before{content:\"\"}.tgico-dragfiles:before{content:\"\"}.tgico-dragmedia:before{content:\"\"}.tgico-eats:before{content:\"\"}.tgico-edit:before{content:\"\"}.tgico-email:before{content:\"\"}.tgico-endcall_filled:before{content:\"\"}.tgico-enter:before{content:\"\"}.tgico-eye1:before{content:\"\"}.tgico-eye2:before{content:\"\"}.tgico-fast_forward:before{content:\"\"}.tgico-fast_rewind:before{content:\"\"}.tgico-favourites:before{content:\"\"}.tgico-flag:before{content:\"\"}.tgico-flip:before{content:\"\"}.tgico-folder:before{content:\"\"}.tgico-fontsize:before{content:\"\"}.tgico-forward:before{content:\"\"}.tgico-forward_filled:before{content:\"\"}.tgico-fullscreen:before{content:\"\"}.tgico-gc_microphone:before{content:\"\"}.tgico-gc_microphoneoff:before{content:\"\"}.tgico-gifs:before{content:\"\"}.tgico-group:before{content:\"\"}.tgico-groupmedia:before{content:\"\"}.tgico-groupmediaoff:before{content:\"\"}.tgico-help:before{content:\"\"}.tgico-hide:before{content:\"\"}.tgico-image:before{content:\"\"}.tgico-info:before{content:\"\"}.tgico-info2:before{content:\"\"}.tgico-italic:before{content:\"\"}.tgico-keyboard:before{content:\"\"}.tgico-lamp:before{content:\"\"}.tgico-language:before{content:\"\"}.tgico-largepause:before{content:\"\"}.tgico-largeplay:before{content:\"\"}.tgico-left:before{content:\"\"}.tgico-limit_chat:before{content:\"\"}.tgico-limit_chats:before{content:\"\"}.tgico-limit_file:before{content:\"\"}.tgico-limit_folders:before{content:\"\"}.tgico-limit_link:before{content:\"\"}.tgico-limit_pin:before{content:\"\"}.tgico-link:before{content:\"\"}.tgico-listscreenshare:before{content:\"\"}.tgico-livelocation:before{content:\"\"}.tgico-location:before{content:\"\"}.tgico-lock:before{content:\"\"}.tgico-lockoff:before{content:\"\"}.tgico-loginlogodesktop:before{content:\"\"}.tgico-loginlogomobile:before{content:\"\"}.tgico-logout:before{content:\"\"}.tgico-mediaspoiler:before{content:\"\"}.tgico-mediaspoileroff:before{content:\"\"}.tgico-mention:before{content:\"\"}.tgico-menu:before{content:\"\"}.tgico-message:before{content:\"\"}.tgico-messageunread:before{content:\"\"}.tgico-microphone:before{content:\"\"}.tgico-microphone_crossed:before{content:\"\"}.tgico-microphone_crossed_filled:before{content:\"\"}.tgico-microphone_filled:before{content:\"\"}.tgico-minus:before{content:\"\"}.tgico-monospace:before{content:\"\"}.tgico-more:before{content:\"\"}.tgico-mute:before{content:\"\"}.tgico-muted:before{content:\"\"}.tgico-newchannel:before{content:\"\"}.tgico-newchat_filled:before{content:\"\"}.tgico-newgroup:before{content:\"\"}.tgico-newprivate:before{content:\"\"}.tgico-next:before{content:\"\"}.tgico-noncontacts:before{content:\"\"}.tgico-nosound:before{content:\"\"}.tgico-passwordoff:before{content:\"\"}.tgico-pause:before{content:\"\"}.tgico-permissions:before{content:\"\"}.tgico-phone:before{content:\"\"}.tgico-pin:before{content:\"\"}.tgico-pinlist:before{content:\"\"}.tgico-pinned_filled:before{content:\"\"}.tgico-pinnedchat:before{content:\"\"}.tgico-pip:before{content:\"\"}.tgico-play:before{content:\"\"}.tgico-playback_05:before{content:\"\"}.tgico-playback_15:before{content:\"\"}.tgico-playback_1x:before{content:\"\"}.tgico-playback_2x:before{content:\"\"}.tgico-plus:before{content:\"\"}.tgico-poll:before{content:\"\"}.tgico-premium_addone:before{content:\"\"}.tgico-premium_double:before{content:\"\"}.tgico-premium_lock:before{content:\"\"}.tgico-premium_unlock:before{content:\"\"}.tgico-previous:before{content:\"\"}.tgico-radiooff:before{content:\"\"}.tgico-radioon:before{content:\"\"}.tgico-reactions:before{content:\"\"}.tgico-readchats:before{content:\"\"}.tgico-recent:before{content:\"\"}.tgico-replace:before{content:\"\"}.tgico-reply:before{content:\"\"}.tgico-reply_filled:before{content:\"\"}.tgico-rightpanel:before{content:\"\"}.tgico-rotate_left:before{content:\"\"}.tgico-rotate_right:before{content:\"\"}.tgico-saved:before{content:\"\"}.tgico-savedmessages:before{content:\"\"}.tgico-schedule:before{content:\"\"}.tgico-scheduled:before{content:\"\"}.tgico-search:before{content:\"\"}.tgico-select:before{content:\"\"}.tgico-send:before{content:\"\"}.tgico-send2:before{content:\"\"}.tgico-sending:before{content:\"\"}.tgico-sendingerror:before{content:\"\"}.tgico-settings:before{content:\"\"}.tgico-settings_filled:before{content:\"\"}.tgico-sharescreen_filled:before{content:\"\"}.tgico-shipping:before{content:\"\"}.tgico-shuffle:before{content:\"\"}.tgico-smallscreen:before{content:\"\"}.tgico-smile:before{content:\"\"}.tgico-spoiler:before{content:\"\"}.tgico-sport:before{content:\"\"}.tgico-star:before{content:\"\"}.tgico-stickers:before{content:\"\"}.tgico-stickers_face:before{content:\"\"}.tgico-stop:before{content:\"\"}.tgico-strikethrough:before{content:\"\"}.tgico-textedit:before{content:\"\"}.tgico-tip:before{content:\"\"}.tgico-tools:before{content:\"\"}.tgico-topics:before{content:\"\"}.tgico-unarchive:before{content:\"\"}.tgico-underline:before{content:\"\"}.tgico-unmute:before{content:\"\"}.tgico-unpin:before{content:\"\"}.tgico-unread:before{content:\"\"}.tgico-up:before{content:\"\"}.tgico-user:before{content:\"\"}.tgico-username:before{content:\"\"}.tgico-videocamera:before{content:\"\"}.tgico-videocamera_crossed_filled:before{content:\"\"}.tgico-videocamera_filled:before{content:\"\"}.tgico-videochat:before{content:\"\"}.tgico-volume_down:before{content:\"\"}.tgico-volume_mute:before{content:\"\"}.tgico-volume_off:before{content:\"\"}.tgico-volume_up:before{content:\"\"}.tgico-zoomin:before{content:\"\"}.tgico-zoomout:before{content:\"\"}.tgico-phone_filled:before{content:\"\";transform:rotate(-135deg)}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}.input-wrapper{margin:0 auto;width:360px}.input-field{--height:54px;--border-radius:10px;position:relative}@media only screen and (max-width:600px){.input-field{--height:50px}}.input-field .arrow-down{border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;bottom:0;content:\" \";cursor:pointer;display:inline-block;height:0;margin-top:-9px;padding:5px;position:absolute;right:21px;top:50%;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:all .2s;vertical-align:middle;width:0;z-index:2}[dir=ltr] .input-field label{left:1rem}[dir=rtl] .input-field label{right:1rem}.input-field label{background-color:#fff;background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;margin-top:calc((var(--height) - 1.5rem)/2);pointer-events:none;position:absolute;right:auto;top:0;transform:translate(0);transform-origin:left center;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap;z-index:2}.is-rtl .input-field label{transform-origin:right center}body.animation-level-2 .input-field label{transition:transform .2s,padding .2s,opacity .1s,font-weight 0s .1s}.input-field-border{border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:var(--border-radius);bottom:0;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-icon{border-radius:.375rem;height:1.5rem;pointer-events:none;position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:1.5rem;z-index:1}.input-field-input{--padding:1rem;--padding-horizontal:1rem;--border-width:1px;background-color:#fff;background-color:var(--surface-color);border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);box-sizing:border-box;line-height:1.3125;line-height:var(--line-height);min-height:var(--height);padding:calc(var(--padding) - var(--border-width)) calc(var(--padding-horizontal) - var(--border-width));position:relative;transition:border-color 0s;width:100%;z-index:1}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{-webkit-box-shadow:inset 0 0 0 1000px #fff;-webkit-box-shadow:0 0 0 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:first-line,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{color:#000!important;color:var(--primary-text-color)!important;font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important;font-size:1rem!important}@media only screen and (max-width:600px){.input-field-input{--padding:.9375rem;--padding-horizontal:.9375rem}}body.animation-level-0 .input-field-input{transition:none!important}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:border-color .2s}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40!important;color:var(--danger-color)!important}.input-field-input.error~.input-field-border{border-color:#df3f40!important;border-color:var(--danger-color)!important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f!important}.input-field-input.valid~.input-field-border{border-color:#26962f!important}.input-field-input:focus~.arrow-down{border-color:#3390ec;border-color:var(--primary-color);margin-top:-4px;transform:rotate(225deg)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:disabled~label,.input-field-input:focus~label,.input-field-input:not(:empty)~label,.input-field-input:valid~label{opacity:1;padding:0 .3125rem;transform:translate(-.1875rem,calc(var(--height)/-2 + .0625rem)) scale(.75)}.input-field-input-fake{bottom:auto!important;height:auto!important;position:absolute!important;right:auto!important}.input-field-input-fake{left:0;opacity:0;pointer-events:none;top:0;z-index:-3}.input-fields-row{display:flex}.input-fields-row .input-field{flex:1 1 auto;width:1%}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}button:focus,input:focus{outline:none}.input-clear{border:none;outline:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40!important;color:var(--danger-color)!important}body:not(.animation-level-0) .input-clear.error{animation:input-shake .2s ease-in-out forwards}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}.input-search{--border-radius:22px;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){[dir=ltr] .input-search{margin-left:1rem}[dir=rtl] .input-search{margin-right:1rem}}.input-search-input{max-height:var(--height)!important;min-height:var(--height)!important}.input-search-input{--height:42px;background-color:#fff;background-color:var(--input-search-background-color);border-color:#dfe1e5;border-color:var(--input-search-border-color);height:var(--height);line-height:var(--height);padding:0 calc(var(--height) + 3px - var(--border-width))}body.animation-level-2 .input-search-input{transition:border-color .2s ease-in-out}html.no-touch .input-search-input:active:not(:focus),html.no-touch .input-search-input:hover:not(:focus){border-color:#c4c9cc!important;border-color:var(--secondary-color)!important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:active,html.no-touch .input-search-input:focus~.btn-icon:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;line-height:1;opacity:.6;position:absolute;text-align:center;top:50%;transform:translateY(-50%);z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}[dir=ltr] .input-search>.tgico-search{left:.8125rem}[dir=rtl] .input-search>.tgico-search{right:.8125rem}.input-search>.tgico-search{height:1.5rem;pointer-events:none;width:1.5rem}[dir=ltr] .input-search>.tgico-close{right:0}[dir=rtl] .input-search>.tgico-close{left:0}.input-search>.tgico-close{height:42px;width:42px;z-index:1}[dir=ltr] .input-search>.tgico-close:before{margin-right:-1px}[dir=rtl] .input-search>.tgico-close:before{margin-left:-1px}[dir=ltr] .input-field-password .input-field-input{padding-right:2.5rem}[dir=rtl] .input-field-password .input-field-input{padding-left:2.5rem}.input-field-password .input-field-input{max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-family:Arial,Helvetica,sans-serif;font-size:2.25rem;line-height:1;padding-bottom:0;padding-left:calc(.875rem - var(--border-width));padding-top:0}@media(-webkit-min-device-pixel-ratio:2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{align-items:center;color:#9e9e9e;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;padding:.5rem;position:absolute;right:.375rem;top:50%;transform:translateY(-50%);transition:color .2s;z-index:2}.input-field-password .toggle-visible:before{content:\"\"}.input-field-password .toggle-visible.eye-hidden:before{content:\"\"}html.no-touch .input-field-password .toggle-visible:active,html.no-touch .input-field-password .toggle-visible:hover{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing:.24px}.input-field-phone .input-field-input:after{color:#9e9e9e;content:attr(data-left-pattern);letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;border:none;cursor:pointer;outline:none}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn-icon:active,html.no-touch .btn-icon:hover,html.no-touch .btn:active,html.no-touch .btn:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-icon.active:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn.active:active,html.no-touch .btn.active:hover,html.no-touch .btn.blue:active,html.no-touch .btn.blue:hover,html.no-touch .btn.primary:active,html.no-touch .btn.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-icon.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-icon:disabled,.btn:disabled{pointer-events:none!important}.btn-icon:disabled,.btn:disabled{opacity:.3;opacity:var(--disabled-opacity)}.btn-icon{border-radius:50%!important}.btn-icon{align-items:center;background-color:transparent;border:none;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;line-height:1;padding:.5rem;position:relative;text-align:center;transition:color .15s ease-in-out,opacity .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}[dir=ltr] .btn-corner{right:var(--offset)}[dir=rtl] .btn-corner{left:var(--offset)}.btn-corner{box-shadow:none!important;padding:0!important;position:absolute!important;transition:transform .2s cubic-bezier(.34,1.56,.64,1)!important;transition:transform var(--btn-corner-transition)!important}.btn-corner{--offset:1.25rem;--translateY:calc(54px + var(--offset));align-items:center;background-color:#3390ec;background-color:var(--primary-color);border:none;bottom:var(--offset);color:#fff;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;outline:none;text-align:center;transform:translate3d(0,var(--translateY),0);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}html.no-touch .btn-corner:active,html.no-touch .btn-corner:hover{background-color:#2086ea;background-color:var(--dark-primary-color)}.btn-corner.is-visible{--translateY:0}body.animation-level-0 .btn-corner{transition:none!important}.btn-corner:disabled{opacity:1!important;pointer-events:all!important}.btn-corner .preloader-circular{height:2.5rem;width:2.5rem}.btn-menu{transform:scale(.8)!important}.btn-menu{-webkit-touch-callout:none;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:10px;font-size:1rem;min-width:11.25rem;opacity:0;padding:.3125rem 0;position:absolute;top:100%;transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),visibility .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);-webkit-user-select:none;visibility:hidden;z-index:4}.btn-menu-old{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:#fff;background-color:var(--surface-color);min-width:auto;padding:.5rem 0}.btn-menu-old .btn-menu-item{transform:none!important}.btn-menu-old .btn-menu-item{--padding-left:1rem;--padding-right:2.5rem;--icon-margin:1.5rem;--icon-size:1.5rem;border-radius:0;font-size:16px;font-size:var(--font-size-16);font-weight:400;height:3rem;line-height:21px;line-height:var(--line-height-16);margin:0}.btn-menu-old .btn-menu-item:before{color:#707579;color:var(--secondary-text-color)}.btn-menu{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{transform:scaleX(1)!important}.btn-menu.active{opacity:1;visibility:visible}.btn-menu.bottom-left,.is-rtl .btn-menu.bottom-right{left:auto;right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right,.is-rtl .btn-menu.bottom-left{left:0;right:auto;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;left:auto;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right,.is-rtl .btn-menu.top-left{bottom:100%;left:0;right:auto;top:auto;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}[dir=ltr] .btn-menu-item{text-align:left}[dir=rtl] .btn-menu-item{text-align:right}.btn-menu-item{cursor:pointer!important;pointer-events:all!important}.btn-menu-item{--padding-vertical:.25rem;--padding-left:.75rem;--padding-right:.75rem;--icon-margin:1.25rem;--icon-size:1.25rem;align-items:center;border-radius:.3125rem;color:#000;color:var(--primary-text-color);display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;height:2rem;line-height:18px;line-height:var(--line-height-14);margin-left:.3125rem;margin-right:.3125rem;padding:var(--padding-vertical) var(--padding-right) var(--padding-vertical) var(--padding-left);position:relative;text-transform:none;transform:scale(1);white-space:nowrap}body.animation-level-2 .btn-menu-item{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--btn-menu-transition)}.btn-menu-item:active{transform:scale(.96)}html.no-touch .btn-menu-item:active,html.no-touch .btn-menu-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:active,html.no-touch .btn-menu-item.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-menu-item:before{align-self:flex-start;color:#000;color:var(--primary-text-color);font-size:var(--icon-size);margin-top:.125rem}[dir=ltr] .btn-menu-item-icon,[dir=ltr] .btn-menu-item:before{margin-right:var(--icon-margin)}[dir=rtl] .btn-menu-item-icon,[dir=rtl] .btn-menu-item:before{margin-left:var(--icon-margin)}.btn-menu-item-icon,.btn-menu-item:before{position:relative}[dir=ltr] .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - var(--add)/2)}[dir=rtl] .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - var(--add)/2)}[dir=ltr] .btn-menu-item-icon{margin-left:calc(var(--add)/-2)}[dir=rtl] .btn-menu-item-icon{margin-right:calc(var(--add)/-2)}.btn-menu-item-icon{--add:.25rem;--total:calc(var(--icon-size) + var(--add));flex:0 0 auto;height:var(--total);width:var(--total)}.btn-menu-item-icon .media-photo{height:inherit;width:inherit}@media only screen and (max-width:600px){.btn-menu-item{--padding-right:1.875rem}}.btn-menu-item-text{flex:1 1 auto;position:relative}.btn-menu-item-text,.btn-menu-item-text-fake{pointer-events:none}[dir=ltr] .btn-menu-item-text-fake{margin-left:var(--margin-left)}[dir=rtl] .btn-menu-item-text-fake{margin-right:var(--margin-left)}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.btn-menu-item-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.btn-menu-item-header{pointer-events:none!important}.btn-menu-item-header{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);height:2rem}[dir=ltr] .btn-menu-item .stacked-avatars{right:.5rem}[dir=rtl] .btn-menu-item .stacked-avatars{left:.5rem}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute}.btn-menu-item.is-multiline{font-size:.75rem;height:auto;max-width:16.25rem;min-width:calc(100% - .625rem);width:-moz-fit-content;width:fit-content}.btn-menu-item.is-multiline .btn-menu-item-text{white-space:pre-wrap;width:-moz-fit-content;width:fit-content}.btn-menu-item .checkbox-field-toggle{padding:0}.btn-menu-overlay{max-width:none!important;position:fixed!important;width:auto!important}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:4}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:currentColor;display:flex;font-size:.875rem;height:2.5rem;justify-content:center}.btn-menu hr{display:block!important}.btn-menu hr{margin:.3125rem auto;opacity:.6;padding:0;width:calc(100% - 1.875rem)}.btn-menu .badge{background-color:transparent;color:#707579;color:var(--secondary-text-color)}.btn-menu-reactions{--inner-shadow-degree:90deg;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:var(--height);filter:drop-shadow(0 .125rem .5rem rgba(0,0,0,.24));height:inherit;max-height:100%;max-width:100%;opacity:0;position:absolute;transform:scale(.8);transform-origin:bottom left}[dir=ltr] .btn-menu-reactions-container{margin-left:var(--other-side-offset)}[dir=rtl] .btn-menu-reactions-container{margin-right:var(--other-side-offset)}.btn-menu-reactions-container{--height:2.25rem;--bubble-side-offset:0rem;--other-side-offset:0rem;--menu-offset:calc((var(--height) + 0.5rem)*-1);--width:calc(var(--menu-width) + (var(--bubble-side-offset) + var(--other-side-offset))*-1);display:flex;height:var(--height);justify-content:flex-start;margin-top:var(--menu-offset);max-width:var(--width);position:fixed;width:var(--width);z-index:4}.contextmenu.bottom-left+.btn-menu-reactions-container .btn-menu-reactions,.contextmenu.center-left+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom right!important}.contextmenu.bottom-center+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom center!important}[dir=ltr] .btn-menu-reactions-container-vertical{margin-left:var(--menu-offset)}[dir=rtl] .btn-menu-reactions-container-vertical{margin-right:var(--menu-offset)}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-top:0;max-height:var(--width);max-width:var(--height);width:var(--height)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree:180deg;display:flex;flex-direction:column;height:auto;transform-origin:top right;width:inherit}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical:var(--padding-base);--padding-horizontal:0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{bottom:var(--offset);right:calc(var(--size)/-2)}body.animation-level-2 .btn-menu-reactions{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{background-color:inherit;border-radius:50%;position:absolute;z-index:-1}.btn-menu-reactions-bubble-big{--size:1rem;--offset:calc(var(--height)/2);bottom:calc(var(--size)/-2);height:var(--size);right:var(--offset);width:var(--size)}.btn-menu-reactions:after{background:linear-gradient(var(--inner-shadow-degree),#fff 0,hsla(0,0%,100%,0) 1rem,hsla(0,0%,100%,0) calc(100% - 1rem),#fff 100%);background:linear-gradient(var(--inner-shadow-degree),var(--surface-color) 0,rgba(var(--surface-color-rgb),0) 1rem,rgba(var(--surface-color-rgb),0) calc(100% - 1rem),var(--surface-color) 100%);border-radius:inherit;bottom:0;content:\" \";left:0;pointer-events:none;position:absolute;right:0;top:0}.btn-menu-reactions .scrollable{border-radius:inherit;display:flex;position:relative}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 .25rem}.btn-menu-reactions .scrollable-y{align-items:center;flex-direction:column;padding:.25rem 0}.btn-menu-reactions-reaction{--size:1.625rem;--padding-base:.25rem;--padding-vertical:0rem;--padding-horizontal:var(--padding-base);cursor:pointer;flex:0 0 auto;height:calc(var(--size) + var(--padding-vertical)*2);padding:var(--padding-vertical) var(--padding-horizontal);width:calc(var(--size) + var(--padding-horizontal)*2)}.btn-menu-reactions-reaction-scale{height:100%;width:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{height:100%;position:relative;width:100%}.btn-primary{border:none;border-radius:10px;cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold);height:54px;overflow:hidden;padding:0;position:relative;text-align:center;transition:opacity .2s;width:100%}html.no-touch .btn-primary:active,html.no-touch .btn-primary:hover{background:#2086ea;background:var(--dark-primary-color);transition:opacity .2s}.btn-primary-transparent{background-color:transparent;color:#3390ec;color:var(--primary-color)}html.no-touch .btn-primary-transparent:active,html.no-touch .btn-primary-transparent:hover{background:rgba(51,144,236,.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:active,html.no-touch .btn-primary-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}[dir=ltr] .btn-primary use,[dir=ltr] .btn-primary>svg{right:15px}[dir=rtl] .btn-primary use,[dir=rtl] .btn-primary>svg{left:15px}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto}.btn-primary:disabled{pointer-events:none!important}.btn-primary:disabled{opacity:.3;opacity:var(--disabled-opacity)}[dir=ltr] .btn-control{padding-left:.75rem;padding-right:1.5rem}[dir=rtl] .btn-control{padding-left:1.5rem;padding-right:.75rem}.btn-control{align-items:center;border-radius:1.25rem;display:flex;height:2.5rem;line-height:2.5rem;margin:.9375rem auto 1rem;width:auto}[dir=ltr] .btn-control.tgico:before{margin-right:.375rem}[dir=rtl] .btn-control.tgico:before{margin-left:.375rem}.btn-control.tgico:before{font-size:1.5rem}.btn-transparent{align-items:center;background-color:transparent;color:#000;color:var(--primary-text-color);display:flex;font-weight:400;height:3rem;line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width:600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:active,html.no-touch .btn-transparent:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:active,html.no-touch .btn-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:active,html.no-touch .btn-transparent.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}[dir=ltr] .btn-transparent:before{margin-right:2rem}[dir=rtl] .btn-transparent:before{margin-left:2rem}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem}@media only screen and (max-width:600px){[dir=ltr] .btn-transparent:before{margin-right:1.5rem}[dir=rtl] .btn-transparent:before{margin-left:1.5rem}}[dir=ltr] .btn-transparent.btn-short:before{margin-right:1rem}[dir=rtl] .btn-transparent.btn-short:before{margin-left:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);left:auto;margin:0;right:auto;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{cursor:pointer!important;font-weight:400!important;overflow:visible!important;pointer-events:all!important}.btn-menu-toggle{position:relative}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size:54px;border-radius:50%;height:var(--size);line-height:var(--size);width:var(--size)}@media only screen and (max-width:600px){.btn-circle{--size:46px}}.btn-circle path{fill:#fff}.btn-disabled{color:#707579!important;color:var(--secondary-text-color)!important;cursor:default!important;pointer-events:none!important}.btn-disabled:before{color:inherit!important}.btn-secondary:not(:first-child){margin-top:.5rem!important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border-radius:50%;font-size:1.5rem;height:3.375rem;height:var(--call-button-size);justify-content:center;position:relative}.call-button,.call-button-container{align-items:center;cursor:pointer;display:flex;width:3.375rem;width:var(--call-button-size)}.call-button-container{flex-direction:column}.call-button-container.disabled,.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{font-size:.875rem;margin-top:.25rem;white-space:nowrap}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}[dir=ltr] .call-button+.call-button,[dir=ltr] .call-button-container+.call-button-container{margin-left:var(--call-button-margin)}[dir=rtl] .call-button+.call-button,[dir=rtl] .call-button-container+.call-button-container{margin-right:var(--call-button-margin)}[dir=ltr] .call-button+.call-button,[dir=ltr] .call-button-container+.call-button-container{margin-left:2rem}[dir=rtl] .call-button+.call-button,[dir=rtl] .call-button-container+.call-button-container{margin-right:2rem}[dir=ltr] .btn-update{right:auto}[dir=rtl] .btn-update{left:auto}.btn-update{padding:0 2rem!important}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);width:auto}.animated-close-icon{pointer-events:none;position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{background-color:#707579;background-color:var(--secondary-text-color);border-radius:.125rem;height:.125rem;width:1.125rem}.animated-close-icon:after,.animated-close-icon:before{content:\"\";left:0;position:absolute;top:0}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:after,body.animation-level-2 .animated-close-icon:before{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.animated-menu-icon{--color:var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:after,.animated-menu-icon:before{background-color:var(--color);border-radius:.125rem;height:.125rem;transform:rotate(0);width:1.125rem}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:after,body.animation-level-2 .animated-menu-icon:before{transition:transform .25s}.animated-menu-icon:after,.animated-menu-icon:before{content:\"\";left:0;position:absolute}.animated-menu-icon:before{top:-.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translate(.375rem,-.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}.animated-menu-close-icon{margin-top:-.625rem}.animated-menu-close-icon:before{opacity:1;top:.3125rem}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translateY(.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{opacity:0;transform:rotate(45deg)}.animated-menu-close-icon.state-back:after{transform:translateY(-.625rem) rotate(90deg)}.animated-button-icon>.tgico{height:24px;line-height:24px;position:absolute}body:not(.animation-level-0) .animated-button-icon>.tgico{animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{animation:none!important}body.animation-level-0 .animated-button-icon>.tgico{visibility:hidden}.autocomplete-helper{border-radius:var(--border-radius)!important;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper{--border-radius:10px;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width:319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal)*4)}}.autocomplete-peer-helper .scrollable{max-height:232px;position:relative}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{align-items:center;cursor:pointer;display:flex;height:3.125rem;line-height:1.3125;line-height:var(--line-height);padding:0 2.125rem 0 .75rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{flex:0 0 auto;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.875rem}.autocomplete-peer-helper-list-element-description{color:#707579;color:var(--secondary-text-color);margin-left:.5625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{line-height:var(--size)!important}.badge{--size:1.375rem;--padding:.4375rem;border-radius:calc(var(--size)/2);color:#fff;color:var(--badge-text-color);font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);min-width:var(--size);padding:0 var(--padding);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{--size:1.25rem;--padding:.375rem}.badge-24{--size:1.5rem;--padding:.5rem}.badge.tgico:before{font-size:var(--size)}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{border-radius:0!important}.ckin__player.ckin__fullscreen{background:#000;bottom:0;display:flex;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:10000000}.ckin__player.ckin__fullscreen video{height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.ckin__player .time{color:#fff;font-size:.875rem;margin-left:.875rem}@media only screen and (max-width:600px){.ckin__player .time{margin-left:1.125rem}}.default{align-items:center;display:flex;font-size:0;justify-content:center;position:relative}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;color:#fff;font-size:4rem;left:50%;line-height:1;opacity:1;outline:0;padding:0;position:absolute;text-align:center;top:50%;transform:translate3d(-50%,-50%,0) scale(1)}@media only screen and (min-width:601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}@media only screen and (max-width:600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0}[dir=ltr] .default__controls{text-align:left}[dir=rtl] .default__controls{text-align:right}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}.default__controls .progress-line{border-radius:var(--border-radius);margin:0 16px}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:hsla(0,0%,100%,.38)}@media only screen and (max-width:600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x;bottom:0;height:49px;padding-top:93px;pointer-events:none;position:absolute;width:100%;z-index:2}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}@media only screen and (max-width:600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:\"\"}.default .default__gradient-bottom{transform:translate3d(0,50px,0)}.default .default__controls{transform:translate3d(0,52px,0)}@media only screen and (max-width:600px){.default .default__controls{transform:translate3d(0,65px,0)}}.default.show-controls .default__controls,.default.show-controls .default__gradient-bottom{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:\"\"}.default .player-volume{--icon-size:2.25rem;--icon-margin-right:.5rem;--selector-size:50px;--selector-thumb-size:.75rem;--hide-width:var(--icon-size);--show-width:calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size)*0.75);align-items:center;display:flex;overflow:hidden;width:var(--hide-width)}body.animation-level-2 .default .player-volume{transition:width .2s cubic-bezier(.4,0,.2,1);transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:active,html.no-touch .default .player-volume:hover{width:var(--show-width)}.default .player-volume__icon{color:#fff;cursor:pointer;display:flex;font-size:1.5rem;height:var(--icon-size);margin-right:var(--icon-margin-right);padding:.375rem;width:var(--icon-size)}.default .player-volume .progress-line{--color:#fff;--thumb-size:var(--selector-thumb-size);--height:4px;margin:0;min-width:var(--selector-size);width:var(--selector-size)}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none!important}video::-webkit-media-controls-enclosure{display:none!important}.progress-line{--color:var(--primary-color);--height:5px;--border-radius:6px;--thumb-size:13px;border-radius:var(--border-radius);cursor:pointer;height:var(--height);position:relative}.progress-line:before{border-radius:inherit;bottom:0;content:\" \";display:block;left:0;position:absolute;right:0;top:0}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;bottom:-.5rem;caret-color:var(--color);cursor:pointer;margin:0;outline:none;padding:0;position:absolute;top:-.5rem;width:100%}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;height:0;width:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{background-color:var(--color);border-radius:50%;content:\" \";cursor:pointer;display:block;height:var(--thumb-size);position:absolute;right:0;top:calc((var(--thumb-size) - var(--height))/-2);transform:translateX(calc(var(--thumb-size)/2)) scale(1);width:var(--thumb-size)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translateX(calc(var(--thumb-size)/2)) scale(1.125)}.progress-line:before,.progress-line__loaded{background-color:#c4c9cc;background-color:var(--secondary-color);opacity:.3}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);bottom:0;position:absolute;top:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{transform-origin:left center;width:100%}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;border:none;color:none}input[type=range]::-ms-thumb,input[type=range]::-ms-tooltip{visibility:hidden}.bottom-controls,.left-controls,.right-controls{align-items:center;display:flex}.bottom-controls{height:2.25rem;justify-content:space-between;padding:0 .625rem}@media only screen and (max-width:600px){.bottom-controls{height:3.625rem}}[dir=ltr] .checkbox-field{text-align:left}[dir=rtl] .checkbox-field{text-align:right}.checkbox-field{--size:1.25rem;--offset-left:0px;cursor:pointer;display:block;margin:1.5rem 1.1875rem;min-height:var(--size);min-width:var(--size);position:relative}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{pointer-events:none!important}.checkbox-field.checkbox-disabled{opacity:.3;opacity:var(--disabled-opacity)}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}[dir=ltr] .checkbox-field .checkbox-box{left:var(--offset-left)}[dir=rtl] .checkbox-field .checkbox-box{right:var(--offset-left)}.checkbox-field .checkbox-box{border-radius:.3125rem;height:var(--size);overflow:hidden;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border,.checkbox-field .checkbox-box-check{left:0;position:absolute;top:0}.checkbox-field .checkbox-box-border{border:2px solid #8d969c;border-radius:inherit;bottom:0;left:0;right:0}.checkbox-field .checkbox-box-background{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;bottom:-15%;left:-15%;right:-15%;top:-15%;transform:scale(1);transition:transform .2s ease-in-out 0s}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none!important}.checkbox-field .checkbox-box-check{--offset:7px;height:calc(var(--size) - var(--offset));left:50%;top:50%;transform:translate(-50%,-50%);width:calc(var(--size) - var(--offset))}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:3.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s ease-in-out .15s,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none!important}[dir=ltr] .checkbox-field .checkbox-caption{padding-left:3.375rem}[dir=rtl] .checkbox-field .checkbox-caption{padding-right:3.375rem}.checkbox-field .checkbox-caption{color:inherit;line-height:1.3125;line-height:var(--line-height);pointer-events:none;position:relative;transition:opacity .2s}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{align-items:center;display:flex;height:3.5rem;margin-left:0;margin-right:0;padding:0 1.1875rem}[dir=ltr] .checkbox-field.hover-effect .checkbox-box{left:auto}[dir=rtl] .checkbox-field.hover-effect .checkbox-box{right:auto}.checkbox-field .anchor-url{pointer-events:all}.checkbox-ripple{border-radius:10px;overflow:hidden}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size:1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{bottom:0;left:0;right:0;top:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset:calc(var(--size) - var(--size)/2 - 0.125rem)}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}[dir=ltr] .radio-field{text-align:left}[dir=rtl] .radio-field{text-align:right}.radio-field{--size:1.375rem;--offset-left:0px;cursor:pointer;line-height:1.3125;line-height:var(--line-height);margin:1.25rem 0;position:relative}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main:after,.radio-field.hidden-widget .radio-field-main:before{visibility:hidden}.radio-field>input:checked~.radio-field-main:before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main:after{transform:translateY(-50%) scale(1)}[dir=ltr] .radio-field .radio-field-main{padding-left:3.5rem}[dir=rtl] .radio-field .radio-field-main{padding-right:3.5rem}.radio-field .radio-field-main{color:inherit;position:relative}[dir=ltr] .radio-field .radio-field-main:after,[dir=ltr] .radio-field .radio-field-main:before{left:var(--offset-left)}[dir=rtl] .radio-field .radio-field-main:after,[dir=rtl] .radio-field .radio-field-main:before{right:var(--offset-left)}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:\"\";display:block;height:var(--size);position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}.radio-field .radio-field-main:before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main:before{transition:border-color .1s ease,opacity .1s ease}[dir=ltr] .radio-field .radio-field-main:after{left:calc(var(--offset-left) + .3125rem)}[dir=rtl] .radio-field .radio-field-main:after{right:calc(var(--offset-left) + .3125rem)}.radio-field .radio-field-main:after{background:#3390ec;background:var(--primary-color);border-radius:50%;height:.75rem;transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}[dir=ltr] .radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}[dir=rtl] .radio-field.radio-field-right .radio-field-main:before{left:0;right:auto}[dir=ltr] .radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[dir=rtl] .radio-field.radio-field-right .radio-field-main:after{left:.3125rem;right:auto}[type=checkbox],[type=radio]{box-sizing:border-box;opacity:0;padding:0;position:absolute;z-index:-1;z-index:var(--z-below)}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s;visibility:hidden}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transform:scale(0);transition:transform .2s ease-in-out .05s}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none!important;transition:background-color .2s!important}.checkbox-field-restriction .checkbox-box-check use{stroke-dasharray:24.19,24.19!important;transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out!important;visibility:visible!important}.checkbox-field-restriction .checkbox-box-check use{transform:rotate(0) translateY(0)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dashoffset:35.5;transform:rotate(45deg) translateY(-10px)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size:20px;align-items:center;display:flex;margin:0 .3125rem;padding:0 .25rem;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset:3px;--toggle-width:1.9375rem;align-items:center;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;display:flex;height:.875rem;margin:0 var(--offset);position:relative;width:var(--toggle-width)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{background-color:#fff;background-color:var(--surface-color);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:50%;content:\" \";height:1.25rem;position:absolute;transform:translateX(calc(var(--offset)*-1));width:1.25rem}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s cubic-bezier(.22,.75,.7,1.44)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width:600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{margin-bottom:17px;padding:1rem 0 .5rem;width:100%}@media only screen and (max-width:600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:0 23px 1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.chatlist-container .search-group__name{font-size:15px;padding:5px 9px 0 16px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width:600px){.chatlist-container .search-group-contacts{padding:0 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0!important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0;padding:0 0 .5rem}.chatlist-container .search-super .search-group__name{display:flex;justify-content:space-between;padding-top:1rem}ul.chatlist{padding:0 .5rem}@media only screen and (max-width:600px){ul.chatlist{padding:0}}.chatlist{-webkit-touch-callout:none;background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;margin:0;position:relative;-moz-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist-chat{background:var(--background)!important}.chatlist-chat{--background:unset;-webkit-user-drag:none}.chatlist-chat.is-forum-open,.chatlist-chat.menu-open,html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-filled-secondary-text-color)}[dir=ltr] .chatlist-chat.is-muted .user-title:after{margin-left:.125rem}[dir=rtl] .chatlist-chat.is-muted .user-title:after{margin-right:.125rem}.chatlist-chat.is-muted .user-title:after{color:#a2abb2;color:var(--chatlist-pinned-color);content:\"\";flex:0 0 auto;font-size:1.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat i{font-style:normal}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat .premium-icon{margin-top:-.125rem}.chatlist-chat .topic-icon{flex:0 0 auto}[dir=ltr] .chatlist-chat .row-title .topic-icon{margin-right:.25rem}[dir=rtl] .chatlist-chat .row-title .topic-icon{margin-left:.25rem}.chatlist-chat .row-title .topic-icon{--size:1.375rem}.chatlist-chat .topic-name .topic-icon{line-height:1!important}.chatlist-chat .topic-name .topic-icon{display:inline}.chatlist-chat .topic-name .topic-icon-svg{position:relative}.chatlist-chat .topic-name .topic-icon-content{left:0;margin-top:-6px;position:absolute;right:0;top:0}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .premium-icon,.chatlist-chat.active .row-subtitle,.chatlist-chat.active .row-title,.chatlist-chat.active .sending-status-icon,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .verified-icon{color:#fff!important}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active .danger,.chatlist-chat.active .primary-text{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-icon-background{fill:#fff!important}.chatlist-chat.active .verified-icon-check{visibility:hidden}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff!important}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color:#fff}}.chatlist .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .sending-status-icon.tgico-premium_lock{color:#c4c9cc;color:var(--secondary-color);font-size:.8125rem;margin:.1875rem 0 0 .5rem}[dir=ltr] .chatlist .dialog-title-details{margin-left:.5rem}[dir=rtl] .chatlist .dialog-title-details{margin-right:.5rem}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;padding:1px 0 0}[dir=ltr] .chatlist .dialog-subtitle-badge{margin-left:.5rem}[dir=rtl] .chatlist .dialog-subtitle-badge{margin-right:.5rem}.chatlist .dialog-subtitle-badge{display:block!important}.chatlist .dialog-subtitle-badge{flex:0 0 auto}.chatlist .dialog-subtitle-badge.avatar-badge{line-height:23px!important}.chatlist .dialog-subtitle-badge.avatar-badge{--size:1.625rem;border:2px solid #fff;border:2px solid var(--background,var(--surface-color));margin:0;pointer-events:none;position:absolute;right:calc(100% - 4.0625rem);top:2.4375rem}[dir=ltr] .chatlist .dialog-subtitle-media{margin-right:.375rem}[dir=rtl] .chatlist .dialog-subtitle-media{margin-left:.375rem}.chatlist .dialog-subtitle-media{border-radius:.25rem;display:inline-block;flex:0 0 auto;height:1.25rem;line-height:1.25rem;position:relative;width:1.25rem}.chatlist .dialog-subtitle-media:before{content:\" \";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.chatlist .dialog-subtitle-media.is-round{border-radius:50%}.chatlist .dialog-subtitle-media.is-round .tgico-play{font-size:.875rem}.chatlist .dialog-subtitle-media .tgico-play{color:#fff;font-size:1rem;left:50%;line-height:1;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.chatlist .dialog-subtitle-media .media-photo{border-radius:inherit;bottom:auto;height:inherit;-o-object-fit:cover;object-fit:cover;top:auto;width:inherit}.chatlist .dialog-group-call-icon{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;height:20px;left:45px;overflow:hidden;position:absolute;top:45px;width:20px;z-index:2}body.animation-level-2 .chatlist .dialog-group-call-icon,body.animation-level-2 .chatlist .dialog-subtitle-badge{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-group-call-icon.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-group-call-icon.animating,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating{transition:background-color .25s cubic-bezier(.35,.35,.47,1.34),transform .25s cubic-bezier(.35,.35,.47,1.34);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards{transition:background-color .25s cubic-bezier(.35,.35,.7,1),transform .25s cubic-bezier(.35,.35,.7,1),opacity .25s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .25s cubic-bezier(.35,.35,.47,1.34),transform .25s cubic-bezier(.35,.35,.47,1.34);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .25s cubic-bezier(.35,.35,.7,1),transform .25s cubic-bezier(.35,.35,.7,1),opacity .25s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .dialog-avatar,.chatlist .row-row{pointer-events:none;position:relative}.chatlist .user-title{display:flex!important}.chatlist .user-title{align-items:center}.chatlist .user-title img.emoji{height:18px;margin-top:1px;vertical-align:top;width:18px}.chatlist .user-last-message img.emoji{height:20px;margin-top:-3px;width:20px}.chatlist .user-last-message,.chatlist .user-title{flex-grow:1;position:relative}[dir=ltr] .chatlist .message-status{margin-right:.125rem}[dir=rtl] .chatlist .message-status{margin-left:.125rem}.chatlist .message-status{color:#0ac630;color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-top:-.0625rem;position:relative;vertical-align:middle;width:1.25rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{left:0;position:absolute;top:0}.chatlist .mention{background-color:#0ac630!important;background-color:var(--chatlist-status-color)!important}.chatlist .mention{padding:0}html.is-mac .chatlist .mention{line-height:1.25rem!important}[dir=ltr] .chatlist .mention-badge{margin-right:-.125rem}[dir=rtl] .chatlist .mention-badge{margin-left:-.125rem}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread,.chatlist .no-unmuted-topic .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist .not-visited{background-color:#c4c9cc!important;background-color:var(--secondary-color)!important}.chatlist .not-visited{--size:.5rem;--padding:0}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{margin-bottom:0!important}.chatlist-bottom .sidebar-left-section{padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chat-input{--translateY:0;--padding-bottom:0.5rem;--bottom:var(--padding-bottom);display:flex;flex:0 0 auto;flex-direction:column;max-width:100%;padding-top:.25rem;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .chat-input{transition:none!important}@media only screen and (min-height:570px)and (min-width:601px){.chat-input{max-width:728px!important;max-width:var(--messages-container-width)!important}}@media only screen and (min-width:601px){.chat-input{--padding-bottom:1.25rem}}@media only screen and (max-height:569px){.chat-input{--padding-bottom:0.5rem}}@media only screen and (min-width:1276px){.chat-input{width:calc(100% - var(--right-column-width))!important}body.is-right-column-shown .chat-input{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0)!important}body.is-right-column-shown .chat-input{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{position:absolute!important;transform:translate3d(0,var(--translateY),0)!important}.chat-input.is-hidden{--translateY:100%;bottom:0;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY:0}.chat-input-container{--padding-horizontal:var(--chat-input-padding);align-items:flex-end;display:flex;flex:0 0 auto;justify-content:center;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);padding:0 var(--padding-horizontal);padding-bottom:var(--bottom);position:relative;width:100%}.chat-input-container .btn-circle{height:var(--chat-input-size);width:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{border-bottom-right-radius:12px;max-height:var(--chat-input-size)}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{opacity:0;transform:scaleX(-1) translateX(1.125rem)}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0!important}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s 75ms}.chat-input-container.is-centering.animating .btn-send{transition:transform .2s}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 75ms}.chat-input .menu-send{bottom:calc(100% + .5rem);top:auto}.chat-input .input-message-input{--custom-emoji-size:var(--messages-custom-emoji-size);background:none;border:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);margin-top:-1px;max-height:27.5rem;outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height:30rem){.chat-input .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.chat-input .toggle-emoticons:before{content:\"\"}.chat-input .toggle-emoticons.flip-icon:before{content:\"\"!important}[dir=ltr] .chat-input .btn-record-cancel{right:0}[dir=rtl] .chat-input .btn-record-cancel{left:0}.chat-input .btn-record-cancel{--multiplier:-1;opacity:0;padding:0;position:absolute;top:0;transform:translateX(calc((100% + var(--padding-horizontal) + .5rem)*var(--multiplier)));visibility:hidden;z-index:3}.chat-input .btn-record-cancel .c-ripple__circle,html.no-touch .chat-input .btn-record-cancel:active:after,html.no-touch .chat-input .btn-record-cancel:hover:after{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.chat-input .btn-record-cancel:before{color:#df3f40;color:var(--danger-color)}.is-rtl .chat-input .btn-record-cancel{--multiplier:1}[dir=ltr] .chat-input .btn-scheduled:after{right:5px}[dir=rtl] .chat-input .btn-scheduled:after{left:5px}.chat-input .btn-scheduled:after{background:#61c642;background:var(--message-checkbox-color);border-radius:50%;content:\"\";height:.5rem;position:absolute;top:5px;width:.5rem}.chat-input .btn-preloader .preloader{height:1.5rem;width:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{animation:hide-icon .4s ease-in-out forwards!important}[dir=ltr] .chat-input .float{margin-right:.75rem!important}[dir=rtl] .chat-input .float{margin-left:.75rem!important}.chat-input .float{display:none!important;margin:0!important}.chat-input .float{align-self:center}body.animation-level-2 .chat-input .float{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){[dir=ltr] .chat-input .float{margin-right:.125rem!important}[dir=rtl] .chat-input .float{margin-left:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}[dir=ltr] .chat-input .btn-send-container{right:var(--padding-horizontal)}[dir=rtl] .chat-input .btn-send-container{left:var(--padding-horizontal)}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-cancel-record,.chat-input .btn-send{box-shadow:0 1px 8px 1px rgba(0,0,0,.12)}.chat-input .btn-send{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important}.chat-input .btn-send{z-index:3}html.no-touch .chat-input .btn-send:active,html.no-touch .chat-input .btn-send:hover{background-color:#2086ea!important;background-color:var(--dark-primary-color)!important}.chat-input .btn-send .tgico-check{height:32px!important}.chat-input .btn-send .tgico-check{font-size:2rem}.chat-input .btn-send .tgico-check:before{font-weight:500;font-weight:var(--font-weight-bold)}.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.record .tgico-microphone_filled,.chat-input .btn-send.schedule .tgico-schedule,.chat-input .btn-send.send .tgico-send{visibility:visible!important}body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone_filled,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule,body.animation-level-2 .chat-input .btn-send.send .tgico-send{animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem}.chat-input .record-time{display:none;height:44px;line-height:44px}.chat-input .record-time:after{background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;content:\" \";display:inline-block;height:10px;margin-left:9px;margin-right:9px;width:10px}body.animation-level-2 .chat-input .record-time:after{animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;height:300px;opacity:.5;position:absolute;transform:scale(0);visibility:hidden;width:300px}@media only screen and (max-width:600px){.chat-input .record-ripple{height:240px;width:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-record-cancel,.chat-input.is-recording:not(.backwards) .btn-send{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - var(--chat-input-size)*2 - 1rem)}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}[dir=ltr] .chat-input:not(.is-recording) .btn-record-cancel{margin-right:0}[dir=rtl] .chat-input:not(.is-recording) .btn-record-cancel{margin-left:0}.chat-input:not(.is-recording) .btn-record-cancel{width:0}.chat-input .new-message-wrapper{opacity:1}.chat-input .reply-in-topic-overlay{align-items:center;background-color:inherit;border-radius:inherit;color:#707579;color:var(--secondary-text-color);display:flex;justify-content:center;padding:0 1rem;pointer-events:none;z-index:3}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}#column-center{flex:3;position:relative;width:100%}@media only screen and (max-width:600px){body.is-left-column-shown #column-center{transform:translate3d(100vw,0,0)}body.is-right-column-shown #column-center{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px)and (max-width:925px){#column-center{position:fixed!important}#column-center{bottom:0;left:0;right:0;top:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem,0,0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{display:flex!important}.chat{align-items:center;flex-direction:column;transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition);width:100%}body.animation-level-0 .chat{transition:none!important}.chat:not(.active):not(:last-child){filter:brightness(.8)}@media only screen and (min-width:926px){.chat:not(.active){transform:translate3d(calc((100vw - min(40vw, 420px))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(40vw, 420px)),0,0)}}@media only screen and (min-width:1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)),0,0)}}@media only screen and (min-width:1276px)and (max-width:1680px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(75vw,0,0)}}@media only screen and (max-width:925px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(100vw,0,0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.chat-background{background-color:#e6ebee;overflow:hidden}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none!important}.chat-background,.chat-background-item{position:absolute!important}.chat-background,.chat-background-item{bottom:0;left:0;right:0;top:0}.chat-background-item.is-image{background-color:inherit;background-image:url(assets/img/bg.jpeg);background-position:50%;background-size:cover}.chat-background-item.is-pattern{background-color:#000!important;background-image:none!important;margin:0!important}.chat-background-item.is-pattern{align-items:center;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center}@media only screen and (min-width:1276px){.chat-background-item.is-pattern{height:150%;top:-25%}}body.animation-level-2 .chat-background-item{opacity:0;transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}@media only screen and (min-width:1276px){body.animation-level-2 .chat-background-item{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)!important}body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center}body.animation-level-2.is-right-column-shown .chat-background-item{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)!important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(.666666667)}}.chat-background-item-canvas{--opacity-max:1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item:not(.is-dark) .chat-background-item-pattern-canvas{mix-blend-mode:soft-light}.chat-background-item-color-canvas{height:100%;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:cover;mask-size:cover}.chat .drops-container{--padding:20px;--pinned-floating-height:0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width:1276px){[dir=ltr] body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}[dir=rtl] body.is-right-column-shown .chat .drops-container{left:calc(var(--right-column-width))}}@media only screen and (max-width:600px){.chat .drops-container{--padding:10px}}.chat .drop{--wrapper-padding:15px;max-width:696px}.chat[data-type=chat] .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat-input-wrapper{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);--button-size:2.125rem;--button-horizontal-margin:.125rem;align-items:center;border-radius:1rem;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;max-height:30rem;max-width:calc(100% - var(--chat-input-size) - .5rem);min-height:var(--chat-input-size);position:relative;width:calc(100% - var(--chat-input-size) - .5rem);z-index:3}.chat-input-wrapper:before{border-radius:inherit;bottom:0;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);content:\" \";left:0;opacity:1;right:0;top:0}.chat-input-control,.chat-input-wrapper:before{background-color:#fff;background-color:var(--surface-color);position:absolute}.chat-input-control{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);height:var(--chat-input-size);margin:0 auto;padding:var(--padding);visibility:hidden;width:auto;z-index:3}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;justify-content:center;padding:0 .625rem}@media only screen and (max-width:600px){.chat-input-control-button{font-size:15px}}[dir=ltr] .chat-input-control-button:before{margin-right:10px}[dir=rtl] .chat-input-control-button:before{margin-left:10px}.fake-selection-wrapper,.selection-wrapper{max-width:calc(100% - var(--chat-input-padding)*2);position:absolute;top:0;width:28.75rem}.chat-input-control,.selection-wrapper{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{align-items:center;border-radius:inherit;display:flex;font-size:15px;height:100%;justify-content:space-between;padding:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{align-items:center;display:flex;justify-content:space-between;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);text-transform:capitalize;white-space:nowrap}[dir=ltr] .selection-wrapper .selection-container .btn-icon{margin-left:6px;margin-right:5px}[dir=rtl] .selection-wrapper .selection-container .btn-icon{margin-left:5px;margin-right:6px}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;width:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width:600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width:380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}[dir=ltr] .selection-wrapper .selection-container-forward:before{margin-right:14px}[dir=rtl] .selection-wrapper .selection-container-forward:before{margin-left:14px}[dir=ltr] .selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}[dir=rtl] .selection-wrapper .selection-container-delete{margin-left:.625rem;margin-right:.375rem}[dir=ltr] .selection-wrapper .selection-container-delete:before{margin-right:10px}[dir=rtl] .selection-wrapper .selection-container-delete:before{margin-left:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}[dir=ltr] .fake-rows-wrapper{left:var(--padding-horizontal)}[dir=rtl] .fake-rows-wrapper{right:var(--padding-horizontal)}.fake-rows-wrapper{top:0;width:calc(100% - var(--chat-input-size) - var(--padding-horizontal)*2 - .5rem)}.rows-wrapper-wrapper{display:flex;width:100%}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s .15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s 75ms,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity .1s 0s,visibility 0s .2s}[dir=ltr] .rows-wrapper{border-bottom-right-radius:0}[dir=rtl] .rows-wrapper{border-bottom-left-radius:0}.rows-wrapper{transform:translateX(0) scaleX(1)}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width:600px){.rows-wrapper{--padding-vertical:1px}}@media only screen and (max-width:420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height:569px){.rows-wrapper{--padding-vertical:1px}}[dir=ltr] .rows-wrapper .bubble-tail{right:-8.4px}[dir=rtl] .rows-wrapper .bubble-tail{left:-8.4px}.rows-wrapper .bubble-tail{fill:#fff;fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;transform:scaleX(-1);width:11px}.is-rtl .rows-wrapper .bubble-tail{transform:scaleX(1)}.rows-wrapper .attach-file.menu-open{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important}.rows-wrapper .attach-file.menu-open{color:#3390ec;color:var(--primary-color)}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:1rem;display:flex;justify-content:space-between;padding:var(--padding);position:relative;width:100%}.rows-wrapper .reply-wrapper{align-items:center;height:0;justify-content:flex-start;margin-bottom:-.5625rem;opacity:0;padding:.5625rem var(--padding-horizontal) 0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .reply-wrapper{margin-bottom:-.3125rem;padding-top:.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{height:45px;opacity:1;pointer-events:inherit}.rows-wrapper .reply-wrapper .reply{flex:1 1 auto;margin-left:.625rem;margin-right:.625rem;order:1}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579!important;color:var(--secondary-text-color)!important}.rows-wrapper .reply-wrapper .reply-subtitle{height:1.125rem}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:3.125rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:3.125rem}.rows-wrapper .reply-wrapper .btn-menu{transform:scale(1)!important}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);top:auto}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item{padding-left:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-right:var(--icon-margin)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-left:var(--icon-margin)}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0;order:0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#000;stroke:var(--primary-text-color)}@media only screen and (max-width:600px){[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:calc(var(--padding-horizontal)*-1)}}.rows-wrapper .new-message-wrapper{--send-as-size:1.875rem;--send-as-margin-left:.25rem;--send-as-margin-right:.375rem;--send-as-total-size:calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size:2.375rem;--commands-margin-left:.25rem;--commands-margin-right:.375rem;--commands-total-size:calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX:0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;flex:0 0 auto;opacity:0;position:absolute;transform:scale(0);z-index:2}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-left:var(--commands-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-right:var(--commands-margin-left)}.rows-wrapper .new-message-wrapper .new-message-bot-commands{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:1.875rem;cursor:pointer;display:flex;height:1.875rem;justify-content:center;width:var(--commands-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{align-items:center;display:flex;justify-content:center;transform:scale(.875)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color:#fff}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-left:var(--send-as-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-right:var(--send-as-margin-left)}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container{height:var(--send-as-size);width:var(--send-as-size)}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:auto}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:auto}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:calc(var(--padding-horizontal)*-1 - .25rem)!important}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:calc(var(--padding-horizontal)*-1 - .25rem)!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;max-height:20rem;max-width:20rem;top:auto;transform:scaleX(1);width:auto}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item{height:2.25rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-header{height:1.875rem}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset:-.125rem;border:.0625rem solid #3390ec;border:.0625rem solid var(--primary-color);border-radius:inherit;bottom:var(--offset);content:\" \";left:var(--offset);position:absolute;right:var(--offset);top:var(--offset)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{line-height:1!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{display:flex;flex-direction:column;justify-content:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-subtitle{font-size:.8125rem;font-weight:400}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{opacity:0;pointer-events:none;position:absolute;transform:scale(0)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;color:#fff;display:flex;font-size:1.375rem;height:inherit;justify-content:center;width:inherit;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX:var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX:48px}.rows-wrapper .new-message-wrapper.has-offset .input-message-container,.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}[dir=ltr] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-right:var(--translateX)}[dir=rtl] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-left:var(--translateX)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container{opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .input-message-container{align-items:center;align-self:center;display:flex;flex:1 1 auto;max-height:inherit;min-height:calc(var(--chat-input-size) - var(--padding-vertical)*2);overflow:hidden;position:relative;width:1%}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin-bottom:5px;margin-left:var(--button-horizontal-margin);margin-right:var(--button-horizontal-margin);margin-top:0;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY:0;flex:1 1 auto;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles{transition:none!important}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-78px;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}@media only screen and (max-width:600px){.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transform:translateY(calc(var(--translateY)*-1));transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles>.scrollable{display:block;height:auto}@media only screen and (min-width:1276px){body.is-right-column-shown .bubbles{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}body.animation-level-2 .bubbles.is-selecting .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting .is-in .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.animation-level-2 .bubbles.is-selecting:not(.backwards) .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:translateX(2.5rem) scale(1)}.bubbles.is-selecting:not(.backwards) .bubbles-group-avatar{transform:translate3d(2.5rem,0,0) scale3d(.76,.76,1)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:opacity var(--layer-transition),visibility 0s 0s!important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY:calc(var(--chat-input-size)*-1 - 0.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{display:flex;flex-direction:column;justify-content:flex-end;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);min-height:100%;padding:0 .8125rem;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles-inner{transition:none!important}@media only screen and (min-width:1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width:600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner:after{content:\" \";height:.125rem}[dir=ltr] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}[dir=rtl] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-right:45px}@media only screen and (max-width:600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - 2.875rem)!important;max-width:calc(100% - var(--message-beside-button-margin)*-1)!important}.bubbles-inner.is-chat .message,.bubbles-inner.is-chat .name,.bubbles-inner:not(.is-channel) .message,.bubbles-inner:not(.is-channel) .name{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999!important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY)*-1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width:1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{transform:none!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-down{cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-mention{--translateY:0;cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention.is-visible{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s!important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;visibility:visible}.chat-secondary-button{background-color:#fff!important;background-color:var(--surface-color)!important;box-shadow:0 1px 8px 1px rgba(0,0,0,.12)!important}.chat-secondary-button{align-items:center;border-radius:50%;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;position:absolute}body.animation-level-0 .chat-secondary-button{transition:none!important}.chat-secondary-button:before{position:relative}.chat-secondary-button:after{border-radius:inherit;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}html.no-touch .chat-secondary-button:active:after,html.no-touch .chat-secondary-button:hover:after{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}[dir=ltr] .bubbles-corner-button{right:var(--chat-input-padding)}[dir=rtl] .bubbles-corner-button{left:var(--chat-input-padding)}.bubbles-corner-button{bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);overflow:visible;z-index:2}[dir=ltr] .bubbles-corner-button .badge{right:-.25rem}[dir=rtl] .bubbles-corner-button .badge{left:-.25rem}.bubbles-corner-button .badge{position:absolute;top:-.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width:600px){[dir=ltr] .bubbles-corner-button .badge{right:.1875rem}[dir=rtl] .bubbles-corner-button .badge{left:.1875rem}.bubbles-corner-button .badge{top:-.75rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height:var(--topbar-call-height)}@media only screen and (min-width:1276px){body.is-right-column-shown{--topbar-floating-scaleX:calc(1 - var(--right-column-proportion))}}.topbar{cursor:pointer!important;max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important}.topbar{--topbar-height:3.5rem;--pinned-floating-audio-height:0px;--pinned-floating-message-height:0px;--pinned-floating-height:calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height:52px;--pinned-message-height:52px;margin-bottom:var(--pinned-floating-height);position:relative;width:100%;z-index:1}.topbar:before{box-shadow:0 1px 5px -1px rgba(0,0,0,.21);content:\" \";height:calc(var(--topbar-height) + var(--pinned-floating-height));height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));left:0;pointer-events:none;position:absolute;right:0;top:0}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height:var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height:var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width:601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width:926px){.chat:first-child .topbar .sidebar-close-button{display:none}[dir=ltr] .chat:first-child .topbar .chat-info{padding-left:.1875rem}[dir=rtl] .chat:first-child .topbar .chat-info{padding-right:.1875rem}}@media only screen and (min-width:1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{align-items:center;display:flex;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.5rem;max-width:calc(100% - 1.5rem)}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .info,.topbar .peer-title{line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 4.375rem);max-height:calc(var(--vh)*100 - 4.375rem);top:calc(100% + 7px)}@media only screen and (max-width:600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);top:29px}.topbar .btn-menu-toggle{margin-left:0}}[dir=ltr] .topbar .chat-info{padding-left:49px}[dir=rtl] .topbar .chat-info{padding-right:49px}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden}@media only screen and (max-width:600px){[dir=ltr] .topbar .chat-info{padding-left:52px}[dir=rtl] .topbar .chat-info{padding-right:52px}}@media only screen and (min-width:1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{align-items:center;display:flex;flex:1 1 auto;height:3.5rem;justify-content:space-between;max-height:3.5rem;max-width:100%}.topbar .chat-utils{align-items:center;display:flex;flex:0 0 auto}@media only screen and (min-width:1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width:600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}[dir=ltr] .topbar .chat-join{margin-right:.5rem}[dir=rtl] .topbar .chat-join{margin-left:.5rem}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}[dir=ltr] .topbar .content{padding-left:1.125rem}[dir=rtl] .topbar .content{padding-right:1.125rem}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden}.topbar .person{align-items:center;display:flex}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height:0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}[dir=ltr] .chat:not([data-type=chat]) .topbar .content{padding-left:16px}[dir=rtl] .chat:not([data-type=chat]) .topbar .content{padding-right:16px}[dir=ltr] .topbar-call-container{left:1px;right:0}[dir=rtl] .topbar-call-container{left:0;right:1px}.topbar-call-container{cursor:pointer!important;height:3rem!important;height:var(--topbar-call-height)!important;min-height:auto!important}.topbar-call-container{color:#fff;position:absolute;top:-3rem;top:calc(var(--topbar-call-height)*-1);z-index:2}body:not(.has-chat) .topbar-call-container{background:none!important}@media only screen and (max-width:925px){[dir=ltr] .topbar-call-container{left:0}[dir=rtl] .topbar-call-container{right:0}}.topbar-call-container .btn-icon{color:inherit;flex:0 0 auto;height:2.5rem;padding:0;width:2.5rem}.topbar-call-container .peer-title{font-weight:500;font-weight:var(--font-weight-bold);white-space:nowrap}@media only screen and (max-width:480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{align-items:center;display:flex}[dir=ltr] .topbar-call-left .btn-icon{margin-right:.375rem}[dir=rtl] .topbar-call-left .btn-icon{margin-left:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:500;font-weight:var(--font-weight-bold)}.topbar-call-center{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media only screen and (min-width:1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width)*-.5),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}.topbar-call-center{padding:0 calc(var(--right-column-width)/2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width:1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{bottom:-1.125rem;left:0;pointer-events:none;position:absolute;right:0;top:0;transform:scaleY(-1);transform:scale(var(--topbar-floating-scaleX),-1);transform-origin:left center;z-index:-1}.is-rtl .topbar-call-weave{transform-origin:right center}@media only screen and (min-width:1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{height:100%;width:100%}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubbles-group{position:relative}.bubbles-group-avatar{position:sticky!important}.bubbles-group-avatar{bottom:.25rem;cursor:pointer;pointer-events:all;top:0}.bubbles.is-selecting .bubbles-group-avatar{transform:translateZ(0) scaleX(1);transform-origin:bottom}.bubbles-group-avatar-container{bottom:0;display:flex;flex-direction:column-reverse;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:2}.bubble{--line-height:var(--messages-line-height);display:flex;flex-wrap:wrap;margin:0 auto .125rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:1}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;color:#fff;display:flex;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;opacity:0;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);top:50%;transform:translateY(-50%);transform:translateY(-50%) scale(.6);visibility:hidden;width:2.375rem;width:var(--message-beside-button-size)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem!important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{transform:translateY(-50%) scale(1);visibility:visible}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{bottom:-.0625rem;content:\" \";left:-50%;position:absolute;top:-.0625rem;z-index:-1}.bubble.is-highlighted:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{animation:bubbleSelected 2s linear}@media only screen and (max-width:600px){.bubble.is-first-unread{max-width:none}}.bubble.is-first-unread:before{background-color:#fff;background-color:var(--surface-color);color:#3390ec;color:var(--primary-color);content:\"Unread messages\";font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);height:30px;line-height:2.1;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;position:relative;text-align:center;z-index:2}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(.0625rem + 30px)}.bubble.is-selected:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{display:block;width:200%}.bubble.is-multiple-documents:after,.bubble.is-multiple-documents:before{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0!important}.bubble-select-checkbox{display:flex;left:0;margin:0;position:absolute;z-index:3}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none!important}.bubbles.is-selecting .bubble a,.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video{pointer-events:none}.bubble-content{background-color:#fff;background-color:var(--message-background-color);border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);display:flex;flex-direction:column-reverse;max-width:100%;min-width:56px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}body.animation-level-0 .bubble-content{transition:none}html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content,html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content{-webkit-user-select:text;-moz-user-select:text;user-select:text}.bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(-1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button.goto-original{transform:translateX(-1.125rem) rotate(180deg)}.bubble-hover-reaction{--size:1.875rem;--offset:calc(var(--size)*-0.75);align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:var(--size);bottom:0;box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);cursor:pointer;display:flex;height:1.625rem;justify-content:center;opacity:0;position:absolute;right:var(--offset);transform:scale(.8);width:var(--size);z-index:2}body.animation-level-2 .bubble-hover-reaction{transition:opacity .2s cubic-bezier(.34,1.56,.64,1),transform .2s cubic-bezier(.34,1.56,.64,1);transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){opacity:1;transform:scale(1)}.bubble-hover-reaction-sticker{height:1.125rem;position:relative;width:1.125rem}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{box-shadow:none;margin:0 auto;max-width:100%}.bubble.is-date{font-weight:500;font-weight:var(--font-weight-bold);opacity:.99999;padding-bottom:.375rem;pointer-events:none;position:sticky;top:.25rem;transition:opacity .3s ease;z-index:2}.bubble.is-date:after,.bubble.is-date:before{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat[data-type=chat] .bubble.is-date .bubble-content,.chat[data-type=discussion] .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubbles:not(.has-sticky-dates) .bubble.is-date{visibility:hidden}.bubbles.has-sticky-dates .bubble.is-date.is-fake{display:none}.bubble.is-date.is-fake{opacity:1!important;transition:none!important;visibility:visible!important}.bubble.is-date.is-fake{left:50%;position:absolute;top:0;transform:translateX(-50%)}.bubble-beside-button{align-items:center;background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border-radius:50%;bottom:0;color:#fff;color:var(--badge-text-color);cursor:pointer;display:flex;font-size:1.5rem;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);transform:translateX(0);width:2.375rem;width:var(--message-beside-button-size)}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.bubble-view-button{text-decoration:none!important}.bubble-view-button{align-items:center;border:1px solid #3390ec;border:1px solid var(--message-primary-color);border-radius:6px;color:#3390ec;color:var(--message-primary-color);display:flex;height:2rem;justify-content:center;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble-view-button:active,html.no-touch .bubble-view-button:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble-view-button .c-ripple__circle{background-color:#3390ec;background-color:var(--message-primary-color);opacity:.08}.message .bubble-view-button{margin:.375rem 0 -.375rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}html.no-touch .bubble:active .bubble-beside-button,html.no-touch .bubble:hover .bubble-beside-button{opacity:1}.bubble .forward{font-size:1.25rem}.bubble.is-group-last{margin-bottom:.5rem}.bubble.is-group-last:after{bottom:-.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0!important}.bubble.webpage .preview-with-document{min-width:100%}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width:600px){.bubble.webpage .document{padding-left:44px}}.bubble.webpage .has-document{display:flex;flex-direction:column}.bubble.webpage .has-document .preview-resizer{order:1}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;vertical-align:bottom;width:18px}.bubble .thumbnail{position:absolute}.bubble .canvas-thumbnail{border-radius:inherit}.bubble .canvas-dots{z-index:1}.bubble.emoji-big{--emoji-size:1rem;font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big .attachment{border-radius:0!important}.bubble.emoji-big .attachment{--custom-emoji-size:var(--emoji-size)}.bubble.emoji-big .attachment img.emoji{height:var(--emoji-size);max-height:64px;max-width:64px;width:var(--emoji-size)}.bubble.emoji-big .attachment .custom-emoji,.bubble.emoji-big .attachment .emoji{display:inline-block}.bubble.emoji-big:not(.sticker) .attachment{max-height:-moz-fit-content!important;max-height:fit-content!important}.bubble.emoji-big:not(.sticker) .attachment{display:block;font-size:var(--emoji-size);padding-bottom:1.25rem;padding-top:.25rem;white-space:pre-wrap;word-break:break-word}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-big:not(.sticker) .bubble-content{max-width:min(420px,100%)}.bubble.just-media .bubble-content{background:none!important}.bubble.just-media .bubble-content{box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:rgba(109,141,65,.4);background:var(--message-highlightning-color)}.bubble.emoji-big:not(.sticker) .bubble-content,.bubble.sticker .bubble-content{align-self:flex-start}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{position:relative!important;right:0!important}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{margin-left:auto}.bubble.sticker .attachment{border-radius:0;position:absolute;z-index:1}.bubble.round .attachment{height:280px!important;height:var(--round-video-size)!important;max-height:280px!important;max-height:var(--round-video-size)!important;max-width:280px!important;max-width:var(--round-video-size)!important;width:280px!important;width:var(--round-video-size)!important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{border-radius:inherit;cursor:pointer;display:flex;justify-content:center;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.bubble .attachment .download span{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;font-size:23px;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{margin:0 auto;position:relative;z-index:1}.bubble .media-container-fitted{background-color:transparent!important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-height:min(340px,100%);max-width:min(420px,100%);width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-height:none;max-width:min(451px,100%)}.bubble .album-item{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);cursor:pointer;max-width:100%;overflow:hidden;position:absolute}body.animation-level-0 .bubble .album-item{transition:none!important}.bubble .album-item img,.bubble .album-item video,.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none!important}.bubble .album-item .bubble-select-checkbox{bottom:auto!important}.bubble .album-item .bubble-select-checkbox{left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4,0,.2,1),border-radius .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transform:scale(.883333);transition:transform .3s cubic-bezier(.4,0,.2,1),border-radius .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:active,html.no-touch .bubble a:hover{text-decoration:underline}.bubble-first{align-items:center;justify-content:center;margin-top:.5rem;max-width:100%;order:-1}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .attachment{pointer-events:none}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{align-items:flex-start!important;padding:.75rem 1rem .875rem!important}.bubble-first.empty-bubble-placeholder.has-description .service-msg{flex-direction:column}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-size:1rem!important}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{font-size:1.25rem;margin-left:-.1875rem;margin-right:.25rem;vertical-align:bottom}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubbles.has-groups .bubble-first.empty-bubble-placeholder{pointer-events:none}.bubbles.has-groups .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem!important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{margin-top:.75rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{cursor:pointer;height:200px;position:relative;width:200px}.bubble-first .time{display:none!important}.bubble-first:after,.bubble-first:before{display:none}.bubble .web{line-height:1.3125;line-height:var(--line-height);margin:.125rem 0 0;max-width:100%;overflow:hidden}.bubble .web+.time{display:block}.bubble .web .preview{border-radius:4px;cursor:pointer;max-height:min(340px,100%);max-width:min(420px,100%);overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .text,.bubble .web .title,.bubble .web .webpage-name{font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:active,html.no-touch .bubble .web .webpage-name:hover{text-decoration:underline}.bubble .web .text{margin-top:1px;word-break:break-word}.bubble .web .quote{display:flex;max-width:100%;overflow:hidden;width:100%}.bubble .web .quote-text{margin-left:-.625rem;max-width:100%;padding-left:.625rem;width:100%}.bubble .web .quote:before{background-color:#3390ec;background-color:var(--primary-color);border-radius:.125rem;content:\" \";flex:0 0 auto;margin:.1875rem .5rem .125rem 0;width:.125rem}.bubble .reply{--font-size:var(--messages-secondary-text-size)}.bubble .document-name{font-size:16px;font-size:var(--messages-text-size)}.bubble .document-size{font-size:14px;font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{float:right;height:3rem;margin:.1875rem 0 0 .625rem;width:3rem}.bubble.is-square-photo .web .preview{margin:0;max-height:min(3rem,100%);max-width:min(3rem,100%)}.bubble .reply{border-radius:.25rem;cursor:pointer;margin:0 .375rem .375rem;min-width:10rem;padding:.25rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{height:auto;max-width:calc(100% - 1.25rem);min-height:32px;overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.bubble .message+.reply{margin-bottom:0}.bubble:not(.just-media) .reply{border-radius:6px}html.no-touch .bubble:not(.just-media) .reply:active,html.no-touch .bubble:not(.just-media) .reply:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble.just-media .floating-part{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:12px;margin:0;max-width:15rem;padding:.375rem .625rem;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .floating-part{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important}.bubble.just-media .name{line-height:1.3125;line-height:var(--line-height);padding:.375rem .625rem}.bubble.just-media .name .peer-title{font-weight:400!important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width:600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{max-width:none!important}.bubble.just-media .reply-content{margin-top:0;position:relative}.bubble.just-media .reply i,.bubble.just-media .reply-subtitle,.bubble.just-media .reply-title{color:#fff!important}.bubble.just-media .reply-border{background:#fff!important}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message,.bubble .service-msg{--custom-emoji-size:var(--messages-custom-emoji-size)}.bubble .message{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);max-width:100%;padding:0 .5rem .375rem .625rem;position:relative;white-space:pre-wrap;word-break:break-word}.bubble .message .custom-emoji{display:inline-flex}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width:600px){.bubble .audio,.bubble .document{--icon-size:2.25rem}}.bubble .audio .audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width:600px){.bubble .audio{--icon-margin:.6875rem;height:2.375rem}.bubble .audio .audio-details{margin-bottom:0;margin-top:2px}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{max-width:min(100%,335px)!important}.bubble .message.audio-message{width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{max-width:min(100%,300px)!important}.bubble .message.audio-message{width:280px}}.bubble .message.voice-message .document-message{max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px!important}.bubble .message.call-message,.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{cursor:pointer;display:flex;padding:2px 0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{display:flex;flex-direction:column;margin-top:8px;padding-left:12px}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold)}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px!important}.bubble .message.document-message .document{--icon-margin:.75rem;height:58px}@media only screen and (max-width:600px){.bubble .message.document-message .document{--icon-margin:.5rem;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.125rem 0 .125rem 2.5625rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble-call:before{font-size:1.5rem;left:.3125rem;position:absolute}.bubble-call-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-call-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height);margin-left:-.1875rem;margin-top:.0625rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:\"\";display:inline-block;font-size:1rem;transform:rotate(135deg)}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document .time{align-self:flex-start;height:0}.bubble .document-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{padding:0!important}.bubble.is-multiple-documents .message{border-radius:inherit}.bubble.is-multiple-documents .document-container{border-radius:inherit;position:relative}.bubble.is-multiple-documents .document-container .document-selection{bottom:0;left:-75vw;position:absolute;top:0;width:200vw;z-index:-2}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:#fff;background-color:var(--message-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0;z-index:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection{animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection{animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top:.25rem;--margin-left:.125rem;background:#fff;border-radius:50%;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size:1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size:.125rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit;content:\" \";height:calc(var(--size) - var(--inner-size)*2);left:var(--inner-size);position:absolute;top:var(--inner-size);width:calc(var(--size) - var(--inner-size)*2)}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-.0625rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{border-top-left-radius:inherit;border-top-right-radius:inherit;padding-top:.5rem}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-.0625rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding-bottom:.5rem}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-.25rem}.bubble.is-multiple-documents .document{height:54px!important}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document{height:38px!important}}.bubble.is-multiple-documents .document-wrapper{padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{margin-top:-.1875rem;padding:0 0 .25rem}.bubble .message .audio .time,.bubble .message.contact-message .time,.bubble .message.poll-message .time{bottom:0;position:absolute;right:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .message{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:.75rem;bottom:.1875rem;padding:0 .3125rem;position:absolute;right:.1875rem;z-index:2}.bubble.is-message-empty .message .time{align-items:center;display:flex;height:calc(12px + .375rem);height:calc(var(--messages-time-text-size) + .375rem);margin:0;padding:0;white-space:nowrap}.bubble.is-message-empty .message .time .inner{bottom:auto;color:#fff;margin:inherit;right:auto}.bubble.is-message-empty .message .time .inner:after{color:#fff!important}.bubble.is-message-empty.with-replies:not(.sticker):not(.with-beside-replies) .message{bottom:55px}.bubble.is-message-empty.emoji-big .message,.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):active:after,html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):hover:after{background-color:#fff}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble.with-beside-replies .bubble-content{min-height:5.5rem}.bubble .colored-name .premium-icon{color:inherit;opacity:.6}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:12px;font-size:var(--messages-time-text-size);height:12px;height:var(--messages-time-text-size);line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;visibility:hidden;z-index:1}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{font-size:inherit;overflow:visible}.bubble .time .inner{align-items:center;bottom:0;display:flex;height:12px;height:var(--messages-time-text-size);line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble .time.is-block{display:block;float:none}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{--height:calc(var(--messages-time-text-size) + 0.375rem);align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:var(--height);color:#fff;display:flex;font-size:12px;font-size:var(--messages-time-text-size);height:var(--height);left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:\"\";font-size:20px;font-size:calc(var(--messages-time-text-size) + 8px);padding:0 1px 0 3px}[dir=ltr] .bubble .video-time.is-error:after{margin-left:1px}[dir=rtl] .bubble .video-time.is-error:after{margin-right:1px}.bubble .video-time.is-error:after{content:\"\";font-size:16px;font-size:calc(var(--messages-time-text-size) + 4px);padding:0}.bubble .extended-media-buy{align-items:center;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(0,0,0,.3);border-radius:2rem;color:#fff;display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;left:50%;padding:0 1rem;position:absolute;top:50%;transform:translate(-50%,-50%);white-space:nowrap;z-index:2}.bubble .extended-media-buy:before{font-size:1.125rem;margin-right:.25rem}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;display:flex;font-size:2.125rem;justify-content:center;text-align:center;z-index:2}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.bubble .name{color:#3390ec;color:var(--primary-color);font-size:14px;font-size:var(--messages-secondary-text-size);line-height:calc(14px + .25rem);line-height:calc(var(--messages-secondary-text-size) + .25rem);max-width:100%;overflow:hidden;padding:.375rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo:not(.is-reply) .bubble-content>.name,.bubble:not(.webpage).video:not(.is-reply) .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big):not(.forwarded).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.forwarded):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{fill:#fff;fill:var(--message-background-color);display:block;height:20px;position:absolute;transform:translateY(1px);width:11px;z-index:-2}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail,.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{border-radius:inherit;cursor:pointer}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.bubble .replies .rp{border-radius:inherit;cursor:pointer;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.bubble .replies-beside{border-radius:2rem;bottom:47px;flex-direction:column;height:auto;max-height:52px;min-height:36px;padding:.375rem 0 .5rem;right:-44px;width:36px}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top:.0625rem solid #dfe1e5;border-top:.0625rem solid var(--border-color);color:#3390ec;color:var(--primary-color);display:flex;height:3.0625rem;min-width:15rem;padding:0 .5rem;position:relative}html.no-touch .bubble .replies-footer:active,html.no-touch .bubble .replies-footer:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .bubble .replies-footer:active~.bubble-tail,html.no-touch .bubble .replies-footer:hover~.bubble-tail{fill:#eff6fd;fill:var(--light-filled-message-primary-color)}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{align-items:center;color:#3390ec;color:var(--primary-color);display:flex;font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin-left:.5rem}.bubble .replies-footer-avatars{--margin-right:-.875rem;--border-size:2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:\" \";height:.5rem;margin-left:.75rem;width:.5rem}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color:var(--light-filled-message-primary-color)}.bubble .message .reaction.is-chosen.backwards,.bubble .message .reaction:not(.is-chosen){--counter-color:var(--message-primary-color)}.bubble .message .reaction.is-chosen.backwards .stacked-avatars,.bubble .message .reaction:not(.is-chosen) .stacked-avatars{--border-color:var(--background-color)}.bubble .message .reactions-block .time{bottom:auto!important;position:static!important;right:auto!important}.bubble .message .reactions-block .time{order:100}.bubble code{cursor:pointer}.bubble.is-invoice .attachment{background-color:inherit!important}.bubble.with-reply-markup .bubble-content{border-bottom-left-radius:6px!important;border-bottom-right-radius:6px!important}.bubble .name-with-reply .name{padding:0!important}.bubble .name-with-reply .name:not(:last-child) .hide-ol{display:none}.bubble .name-with-reply .name:not(:last-child) .peer-title{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.bubble .name-with-reply .reply{height:auto;margin:.25rem 0 0;max-height:none;padding:0}.bubble .topic-name-button{--color:var(--message-primary-color)}.bubble .name .topic-name-button-container{margin:.25rem -.125rem}.bubble .name .topic-name-button-container:first-child{margin-top:0}.bubble.is-message-empty:not(.is-reply) .name .topic-name-button-container{margin-bottom:0}.bubble:not(.is-group-first) .topic-name-button-container{display:none!important}.bubble .topic-name-button-container.floating-part{font-size:14px;font-size:var(--messages-secondary-text-size);padding-bottom:0;padding-top:0}.bubble .topic-name-button-container.floating-part .topic-name-button{--color:#fff;padding:0}.bubble .topic-name-button-container.floating-part .topic-name-button:before{content:none}.bubble .topic-name-button-container.floating-part+.floating-part{margin-top:1.75rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.0625rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type .document-container:last-of-type .document-selection,.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type:after{bottom:-.0625rem}.can-zoom-fade{opacity:1;transform:scale(1) translateX(0);transform-origin:center}body.animation-level-2 .can-zoom-fade{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}.bubbles-inner.zoom-fading .can-zoom-fade{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.can-zoom-fade.zoom-fade{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-content-wrapper{display:flex;flex-direction:column}@media only screen and (min-width:601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width:600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:inherit;color:#fff;display:flex;font-size:15px;font-size:var(--messages-service-text-size);justify-content:center;line-height:20px;line-height:calc(var(--messages-service-text-size) + 5px);padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg .peer-title,.bubble.service .service-msg [data-saved-from],.bubble.service .service-msg a{cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold)}.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{text-decoration:underline}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0!important}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .floating-part{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .floating-part{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .audio-time,.bubble.is-in .contact-number{color:#707579!important;color:var(--secondary-text-color)!important}.bubble.is-in code,.bubble.is-in pre{color:#df3f40;color:var(--monospace-text-color)}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-border{background-color:rgb(var(--override-color))}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-title{color:rgb(var(--override-color))}html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:active,html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:hover{background-color:rgba(var(--override-color),.08)}.bubble.is-out{--message-background-color:var(--message-out-background-color);--light-message-background-color:var(--light-message-out-background-color);--dark-message-background-color:var(--dark-message-out-background-color);--link-color:var(--message-out-link-color);--message-primary-color:var(--message-out-primary-color);--light-filled-message-primary-color:var(--light-filled-message-out-primary-color);--selection-background-color:var(--message-out-selection-background-color);flex-direction:row-reverse}.bubble.is-out .bubble-content{margin-left:auto}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width:1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}body.animation-level-2 .bubble.is-out .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0!important}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .floating-part{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e!important;background-color:var(--message-out-primary-color)!important}.bubble.is-out:not(.just-media) .reply i,.bubble.is-out:not(.just-media) .reply-title{color:#4fae4e!important;color:var(--message-out-primary-color)!important}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{margin-left:-4px;padding-right:5px}.bubble.is-out .time .inner{bottom:4px;color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{color:#4fae4e;color:var(--message-out-primary-color);font-size:19px;font-size:calc(var(--messages-text-size) + 3px);line-height:12px;line-height:var(--messages-time-text-size);margin-left:1px}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time .inner:after,.bubble.is-out.is-read .time:after{content:\"\"}.bubble.is-out.is-sent .time .inner:after,.bubble.is-out.is-sent .time:after{content:\"\"}.bubble.is-out.is-sending .time .inner:after,.bubble.is-out.is-sending .time:after{content:\"\"}.bubble.is-out.is-error .time .inner:after,.bubble.is-out.is-error .time:after{color:#df3f40;color:var(--message-error-color);content:\"\"}.bubble.is-out .document-ico:after{border-right-color:#fff;border-right-color:var(--message-background-color);border-top-color:#fff;border-top-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e!important;fill:var(--message-out-primary-color)!important}.bubble.is-out .audio-subtitle,.bubble.is-out .audio-time{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-download,.bubble.is-out .audio-toggle,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color:var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .bubble-call-subtitle,.bubble.is-out .contact-number,.bubble.is-out .document-size{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#eeffde;color:var(--message-out-background-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-avatars .stacked-avatars{--border-color:var(--message-background-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color:var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color:var(--message-background-color)}.bubble.is-out .bubble-beside-button{left:-2.875rem;left:var(--message-beside-button-margin);right:auto}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{margin-top:.0625rem;width:100%}.bubble:not(.is-group-last) .reply-markup{margin-bottom:.125rem}.reply-markup-row{display:flex;margin-top:.125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child .reply-markup-button:first-child{border-bottom-left-radius:12px}.reply-markup-row:last-child .reply-markup-button:last-child{border-bottom-right-radius:12px}.reply-markup-button{color:#fff!important}.reply-markup-button{background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border:none;border-radius:.375rem;cursor:pointer;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button-text{pointer-events:none;position:relative}.reply-markup-button.anchor-url{text-decoration:none!important}.reply-markup-button+.reply-markup-button{margin-left:.125rem}.reply-markup-button .forward-icon,.reply-markup-button.tgico:before{display:block;position:absolute;right:.125rem;top:.125rem}.reply-markup-button.is-link:before{content:\"\";transform:rotate(-45deg)}.reply-markup-button.is-buy:before{content:\"\"}.reply-markup-button.is-switch-inline:before{content:\"\"}.bubble-beside-button:after,.bubble.just-media .reply:after,.reply-markup-button:after{background-color:#fff;border-radius:inherit;bottom:0;content:\" \";display:block;left:0;opacity:0;position:absolute;right:0;top:0;z-index:-1}html.no-touch .bubble-beside-button:active:after,html.no-touch .bubble-beside-button:hover:after,html.no-touch .bubble.just-media .reply:active:after,html.no-touch .bubble.just-media .reply:hover:after,html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:.08;opacity:var(--hover-alpha)}.bubble-primary-color{color:#3390ec;color:var(--message-primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.pinned-message{--custom-emoji-size:calc(var(--font-size) + 2px)!important}.pinned-message-border{flex:0 0 auto;height:2rem;position:relative;width:.125rem}.pinned-message-border-wrapper-1{background:#3390ec;background:var(--primary-color);border-radius:1px;height:2rem;position:relative;top:50%;transform:translateY(-50%);width:.125rem}.pinned-message-border-mask{--mask-height:.375rem;--height:2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:after,.pinned-message-border-mask:before{content:\" \";display:block;height:var(--mask-height);left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .pinned-message-border-mask:after,body.animation-level-2 .pinned-message-border-mask:before{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{background:linear-gradient(#fff,transparent);background:linear-gradient(var(--surface-color),transparent);top:0}.pinned-message-border-mask:after{background:linear-gradient(transparent,#fff);background:linear-gradient(transparent,var(--surface-color));bottom:0}.pinned-message-border-mask.mask-bottom:after,.pinned-message-border-mask.mask-top:before{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{background:#3390ec;background:var(--primary-color);bottom:0;content:\" \";display:block;left:0;opacity:.4;position:absolute;right:0;top:0}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{background:currentColor;border-radius:1px;left:0;position:absolute;top:0;width:2px}body:not(.animation-level-0) .pinned-message-border-mark,body:not(.animation-level-0) .pinned-message-border-wrapper{transition:transform .25s ease-in-out;will-change:transform}.pinned-message-content{--height:32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{--font-size:var(--font-size-14);--custom-emoji-size:calc(var(--font-size) + 4px);--line-height:calc(var(--font-size) + 4px);align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.pinned-message-content,.reply-content{display:flex;flex-direction:column;flex-grow:1;flex-shrink:1;justify-content:center;margin-left:.5rem;overflow:hidden;pointer-events:none;position:relative}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-subtitle,.pinned-message-title,.reply-subtitle,.reply-title{font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;width:2rem!important}.pinned-message-media,.reply-media{left:0;overflow:hidden;position:absolute;top:.125rem}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.pinned-message-media>video,.reply-media>img,.reply-media>video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.pinned-message i,.reply i{color:#707579;color:var(--secondary-text-color);font-style:normal}.pinned-message img.emoji,.reply img.emoji{height:1rem;vertical-align:top;width:1rem}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{background:#3390ec;background:var(--primary-color);border-radius:1px;height:calc(32px + .25rem);height:calc(var(--font-size)*2 + .25rem);min-width:2px}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0!important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-container{--container-height:3.25rem;align-items:center;cursor:pointer;display:flex;flex:0 0 auto;justify-content:space-between;overflow:visible}.pinned-container.is-floating{background-color:#fff!important;background-color:var(--surface-color)!important;position:absolute!important}.pinned-container.is-floating{height:var(--container-height);left:0;margin:0;max-height:var(--container-height);right:0;top:var(--topbar-height);width:auto}.pinned-container.is-floating .pinned-container-wrapper{border-radius:0;height:100%;max-width:100%;order:0;padding:0 1rem;z-index:0}@media only screen and (max-width:600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width:1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;pointer-events:none;position:relative}.pinned-container .btn-icon{display:flex;flex:0 0 auto;font-size:1.5rem;justify-content:center}.pinned-container-wrapper{align-items:center;border-radius:.25rem;display:flex;flex:1 1 auto;order:1;overflow:hidden;padding:.25rem}.pinned-container-wrapper-utils{align-items:center;display:flex;flex:0 0 auto;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible!important}.pinned-message-media-container{height:2rem;margin-left:-.25rem;position:absolute;width:2rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-subtitle,.pinned-message-title{transform:translateX(0)}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height:var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-subtitle,.pinned-message-content .pinned-message-title{height:calc(var(--height)/2);min-height:calc(var(--height)/2);overflow:visible;position:relative}body.animation-level-2 .pinned-message-content .pinned-message-subtitle,body.animation-level-2 .pinned-message-content .pinned-message-title{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:14px;font-size:var(--font-size-14);line-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:\"#\"}.pinned-message .animated-counter.is-last:not(.backwards){opacity:0;transform:scale(.68)}.pinned-message .animated-super-row{--translateY:16px}.pinned-message .pinned-message-media{--translateY:32px}.pinned-message.hide~.tgico-pinlist,.pinned-message.is-many .pinned-message-close,.pinned-message.is-many.is-floating .pinned-message-close,.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist,.pinned-message:not(.is-many) .pinned-message-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message-pinlist{order:2}.chat[data-type=discussion] .pinned-message .pinned-container-close{display:none!important}.pinned-audio{--progress-height:.25rem}.pinned-audio.is-floating{--container-height:var(--pinned-audio-height)}.pinned-audio:not(.is-floating){max-width:210px;padding-right:1.75rem;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible!important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0!important}.pinned-audio-ico:before{content:\"\"}.pinned-audio-ico.flip-icon:before{content:\"\"}.pinned-audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-subtitle,.pinned-audio-title{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius:0;--height:var(--progress-height);--translateY:.125rem;bottom:0;left:0;position:absolute;right:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width:1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:active,html.no-touch .pinned-audio-progress:hover{--translateY:0}.pinned-audio-progress .progress-line__filled:after{display:none!important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{bottom:0;height:.5rem;left:0;overflow:hidden;position:absolute;right:0}.pinned-audio-volume{align-items:center;height:2.5rem;position:relative;width:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{bottom:-1rem;content:\" \";left:0;position:absolute;right:0;top:100%}.pinned-audio-volume .player-volume__icon{cursor:pointer;display:flex}.pinned-audio-volume .progress-line-container{background-color:#fff;background-color:var(--surface-color);border-radius:10px;box-shadow:0 1px 5px 0 rgba(0,0,0,.15);margin-top:2.25rem;opacity:0;padding:.75rem 1rem;position:absolute;top:100%;transform:rotate(270deg);transition:opacity .2s ease-in-out,visibility 0s .2s;visibility:hidden;width:5rem}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none!important}.pinned-audio-volume:active .progress-line-container,.pinned-audio-volume:hover .progress-line-container{opacity:1;transition:opacity .2s ease-in-out,visibility 0s 0s;visibility:visible}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;bottom:0;display:flex;height:44px;justify-content:flex-start;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transform:translateZ(0);transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),width .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);width:252px;z-index:1}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{align-items:center;display:flex;height:100%;justify-content:flex-start;left:0;max-width:100%;position:absolute;top:0;transform:translateX(0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:672px}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{align-items:center;display:flex;flex:0 0 auto;justify-content:space-between;max-width:100%;padding:7px}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{background-color:#dfe1e5;background-color:var(--border-color);height:25px;width:1px}.markup-tooltip .btn-icon{border-radius:8px!important}.markup-tooltip .btn-icon{height:30px;padding:0;width:30px}.markup-tooltip .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-252px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{align-items:center;display:flex;opacity:0;pointer-events:none;transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;margin:0 .5rem;text-overflow:ellipsis}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{max-height:13.75rem;min-height:72px;min-height:var(--esg-sticker-size);padding:.4375rem;position:relative}.stickers-helper-stickers{border-radius:var(--border-radius);max-width:100%}html.no-touch .stickers-helper .super-sticker:not(.active):active,html.no-touch .stickers-helper .super-sticker:not(.active):hover{background:none}.emoji-helper{padding:.25rem 0!important}.emoji-helper{height:50px}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:after,.emoji-helper .super-emojis:before{content:\" \";display:inline-block;width:.25rem}html.no-touch .emoji-helper .super-emoji:not(.active):active,html.no-touch .emoji-helper .super-emoji:not(.active):hover{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec!important;background-color:var(--primary-color)!important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem,100%)}.inline-helper .scrollable{max-height:232px;position:relative}.inline-helper-separator{background-color:#dfe1e5;background-color:var(--border-color);height:1px;margin-left:4rem;width:100%}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:0;border-radius:initial}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem .5rem .5rem 4rem}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{height:3rem!important;width:3rem!important}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{left:.5rem;overflow:hidden;position:absolute}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;color:#fff;display:flex;font-size:1.75rem;justify-content:center;text-transform:uppercase}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-poster,.inline-helper .media-video{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.inline-helper .gif{height:auto!important;width:auto!important}.inline-helper .gif{bottom:0;left:0;position:absolute;right:0;top:0}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(72px,1fr));grid-template-columns:repeat(auto-fill,minmax(var(--esg-sticker-size),1fr));max-width:100%}.inline-helper-results.is-gallery .inline-helper-result{height:auto!important;width:auto!important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;font-weight:var(--font-weight-bold);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inline-helper-result-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:#707579;color:var(--secondary-text-color);display:-webkit-box;font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap}.chat-search{position:absolute!important}.chat-search{left:0;right:0;top:0;z-index:2}.chat-search-footer{align-items:center;background-color:#fff;background-color:var(--surface-color);box-shadow:0 -1px 5px -1px rgba(0,0,0,.21);display:flex;flex:0 0 auto;height:46px;justify-content:space-between;overflow:hidden;padding:0 8px;width:100%}.chat-search-footer .chat-search-count{color:#707579;color:var(--secondary-text-color);margin-left:8px}.chat-search-count:empty,.chat-search-count:not(:empty)+.btn-icon,.chat-search-footer+.chat-input{display:none}.chat-search-controls{display:flex}.chat-search-results{background-color:#fff;background-color:var(--surface-color);height:100%;left:0;max-height:100%;opacity:0;overflow:hidden;position:absolute;top:0;transition:.2s ease;visibility:hidden;width:100%}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{position:absolute!important;width:auto!important}.drops-container{--padding:0px;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding:-4px;align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:12px;color:#a2acb4;display:flex;flex:1 1 auto;flex-direction:column;justify-content:center;max-width:100%;pointer-events:all;position:relative;transition:color .2s ease-in-out;width:100%}.drop-outline-wrapper{bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none;position:absolute;right:var(--wrapper-padding);top:var(--wrapper-padding)}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;stroke-dashoffset:0;transition:stroke .2s ease-in-out}.drop.is-dragover .drop-outline-path{stroke:#3390ec;stroke:var(--primary-color);animation:drop-outline-move .5s linear infinite}.drop-icon{font-size:6rem}.drop-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height:670px){.drop-icon{font-size:0}.drop-header{margin-top:0}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.bot-commands{animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;padding:var(--offset) var(--offset) 0!important;position:absolute!important;transition:none!important;visibility:visible!important;width:auto!important}.bot-commands{--border-radius-padding:24px;--offset:.5rem;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;pointer-events:none;right:calc(var(--offset)*-1)}body.animation-level-2 .bot-commands{display:flex!important}.bot-commands .scrollable{max-height:207px!important}.bot-commands .scrollable{background-color:#fff;background-color:var(--surface-color);border-radius:inherit;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);height:auto;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{opacity:1;transform:translateY(0)}.bot-commands-list{border-radius:inherit;height:var(--height);padding-bottom:0;width:100%}.bot-commands-list-element{border-radius:0!important}.bot-commands-list-element{align-items:flex-start;flex-direction:column;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{left:.75rem;position:absolute}.bot-commands-list-element-description,.bot-commands-list-element-name{font-size:.875rem;line-height:18px;line-height:var(--line-height-14);margin-left:0}.crop .overlay::-moz-selection,.crop-component::-moz-selection{background:transparent}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{display:block;height:auto;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center;width:auto}.crop-image{display:block;pointer-events:none;position:relative}.crop-component{background-color:#fff;margin:0 auto;overflow:hidden;position:relative;z-index:999}.crop-component>img{max-width:100%}.crop-overlay{border-radius:50%;box-sizing:content-box;overflow:hidden;position:absolute;z-index:999}.crop-overlay:active,html.no-touch .crop-overlay:hover{cursor:move}.crop-overlay-image{display:block;position:absolute}.crop-overlay-color{background-color:hsla(0,0%,100%,.7);border-radius:8px;height:100%;left:0;position:absolute;top:0;width:100%}.crop.is-forum .crop-overlay{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}.sidebar-header{align-items:center;background-color:#fff;background-color:var(--surface-color);cursor:default;display:flex;flex:0 0 auto;justify-content:space-between;min-height:3.5rem;padding-left:1rem;padding-right:1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding-left:.5rem;padding-right:.5rem}}[dir=ltr] .sidebar-header__title{padding-left:1.5rem}[dir=rtl] .sidebar-header__title{padding-right:1.5rem}.sidebar-header__title{color:#000;color:var(--primary-text-color);flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}[dir=ltr] .sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}[dir=rtl] .sidebar-header .btn-icon+.btn-icon{margin-right:.5rem}.sidebar-header-right{flex:0 0 auto}.scrollable-y-bordered .sidebar-header{position:relative}.scrollable-y-bordered .sidebar-header:after{background-color:#dfe1e5;background-color:var(--border-color);bottom:-1px;content:\" \";height:1px;left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .scrollable-y-bordered .sidebar-header:after{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.scrollable-y-bordered:not(.scrolled-top) .sidebar-header:after{opacity:1}.sidebar-close-button{overflow:inherit!important}.sidebar-close-button{flex:0 0 auto;height:2.5rem;width:2.5rem}.sidebar-content{display:flex;flex:1 1 auto;height:100%;max-height:100%;overflow:hidden;position:relative;width:100%}.profile-avatars-container{cursor:pointer;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}html.no-touch .profile-avatars-container:active .profile-avatars-arrow,html.no-touch .profile-avatars-container:hover .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0!important}.profile-avatars-avatars{display:flex;flex-wrap:nowrap;height:100%;position:absolute;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;width:100%}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0)}.profile-avatars-avatars:before{bottom:0;content:\" \";left:0;right:0;top:0}.profile-avatars-avatar{background-color:#000;display:flex;height:inherit;min-height:100%;min-width:100%;position:relative;width:inherit}.profile-avatars-avatar .avatar-photo{height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none;width:100%}.profile-avatars-gradient{background:linear-gradient(1turn,rgba(0,0,0,.3) 8.98%,transparent);bottom:0;height:80px;left:0;position:absolute;right:0}[dir=ltr] .profile-avatars-info{left:1.5rem}[dir=rtl] .profile-avatars-info{right:1.5rem}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;pointer-events:none;position:absolute}[dir=ltr] .profile-avatars-info .profile-name,[dir=ltr] .profile-avatars-info .profile-subtitle{text-align:left}[dir=rtl] .profile-avatars-info .profile-name,[dir=rtl] .profile-avatars-info .profile-subtitle{text-align:right}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .premium-icon{color:#fff}.profile-avatars-info .verified-icon-background{fill:#fff}.profile-avatars-info .verified-icon-check{visibility:hidden}.profile-avatars-info .premium-icon,.profile-avatars-info .profile-subtitle,.profile-avatars-info .verified-icon{opacity:.7}.profile-avatars-info .online{color:inherit!important}.profile-avatars-tabs{display:flex;height:.125rem;left:.375rem;pointer-events:none;position:absolute;right:.375rem;top:.5rem}.profile-avatars-tab{background-color:#fff;border-radius:4px;flex:1 1 auto;height:inherit;margin:0 .125rem;opacity:.2;transition:opacity .2s ease-in-out}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{bottom:0;left:0;opacity:0;position:absolute;top:0;width:33.3333333333%}.profile-avatars-arrow:before{color:#fff;font-size:2.1875rem;left:.625rem;position:absolute;top:50%;transform:translateY(-50%)}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover{opacity:1!important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{display:flex;flex:0 0 auto;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem;position:relative}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width:600px){.profile-button{border-radius:0}}[dir=ltr] .profile-change-avatar{right:1.25rem}[dir=rtl] .profile-change-avatar{left:1.25rem}.profile-change-avatar{position:absolute!important;transition:none!important}.profile-change-avatar{--size:3.375rem;top:calc(var(--size)/-2);transform:none}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{align-items:flex-end;color:#000;color:var(--primary-text-color);display:flex;font-size:20px;font-size:var(--font-size-20);font-weight:500;font-weight:var(--font-weight-bold);line-height:26px;line-height:var(--line-height-20);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-moz-min-content;min-width:min-content;vertical-align:inherit}.profile-name .peer-title{overflow:hidden;text-overflow:ellipsis;word-break:break-word}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem;justify-content:center;margin-bottom:.875rem;margin-top:1px;text-align:center}@media only screen and (max-width:600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{display:block;margin:.5rem auto 10px}@media only screen and (max-width:600px){.profile-avatar{--size:100px;--multiplier:.54;margin:0 auto 10px}}.profile-avatar,.profile-name,.profile-subtitle{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size:3rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;content:\" \";height:1px;left:0;position:absolute;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size:var(--scrollable-size,3rem);--padding-horizontal:0px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);display:flex;flex-direction:row;height:var(--size);justify-content:space-around;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.menu-horizontal-div:not(.no-stripe):after,.menu-horizontal-div:not(.no-stripe):before{content:\" \";flex:0 0 auto;width:var(--padding-horizontal)}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px 10px 0 0}.menu-horizontal-div-item{transition:none!important}.menu-horizontal-div-item{align-items:center;border-radius:0;cursor:pointer;display:flex;flex:1 1 auto;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;justify-content:center;line-height:1.3125;line-height:var(--line-height);padding:0 1rem;position:relative;text-align:center}html.no-touch .menu-horizontal-div-item:active,html.no-touch .menu-horizontal-div-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle,html.no-touch .menu-horizontal-div-item.active:active,html.no-touch .menu-horizontal-div-item.active:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{align-items:center;display:inline-flex;overflow:visible;pointer-events:none;position:relative}.menu-horizontal-div i{background-color:#3390ec;background-color:var(--primary-color);border-radius:.1875rem .1875rem 0 0;bottom:-.8125rem;box-sizing:content-box;height:.1875rem;left:0;opacity:0;pointer-events:none;position:absolute;transform-origin:left;width:100%;z-index:1}.menu-horizontal-div i.animate{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{display:grid;grid-template-columns:100%;grid-template-rows:100%;min-width:100%;width:100%}.tabs-container .tabs-tab{background-color:#f4f4f5;background-color:var(--background-color);display:none;flex-direction:column;grid-column-start:1;grid-row-start:1;overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none!important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4,0,.2,1),filter .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex:1 1 auto;flex-direction:column;max-width:420px;min-width:min(100%,18rem)}@media only screen and (max-width:600px){#column-left{max-width:100%;width:100%}body:not(.is-left-column-shown) #column-left{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px){#column-left{overflow:visible}[dir=ltr] #column-left:after{right:-1px}[dir=rtl] #column-left:after{left:-1px}#column-left:after{background-color:#dfe1e5;background-color:var(--border-color);content:\" \";display:block;height:100vh;position:absolute;top:0;width:1px;z-index:2}}@media only screen and (min-width:601px)and (max-width:925px){#column-left{display:flex;left:0;max-width:none;position:fixed;top:0;transform:translate3d(-5rem,0,0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:26.5rem}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width:926px){#column-left{display:flex}}@media only screen and (max-width:1275px){#column-left{flex:2}}@media only screen and (min-width:1681px){html.is-safari #column-left{max-width:418.75px}}#column-left .item-main .menu-horizontal-scrollable{background-color:#fff;background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .item-main .menu-horizontal-scrollable .scrollable{position:relative}[dir=ltr] #column-left .item-main .menu-horizontal-scrollable .badge{margin-left:5px}[dir=rtl] #column-left .item-main .menu-horizontal-scrollable .badge{margin-right:5px}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--scrollable-size));position:relative}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .item-main .menu-horizontal-div{position:relative!important}#column-left .item-main .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;z-index:0}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .item-main .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .item-main .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main{--offset-top:0;background-color:#fff;background-color:var(--surface-color)}[dir=ltr] #column-left .item-main .input-search .selector-user{left:6px}[dir=rtl] #column-left .item-main .input-search .selector-user{right:6px}[dir=ltr] #column-left .item-main .input-search .selector-user{margin-left:0}[dir=rtl] #column-left .item-main .input-search .selector-user{margin-right:0}#column-left .item-main .input-search .selector-user{position:absolute!important}#column-left .item-main .input-search .selector-user{height:30px;line-height:1.875rem;top:6px;z-index:1}[dir=ltr] #column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}[dir=rtl] #column-left .item-main .input-search.is-picked .input-search-input{padding-right:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block!important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}[dir=ltr] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}[dir=rtl] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{right:38px}[dir=ltr] #column-left .item-main .search-helper{margin-left:28px}[dir=rtl] #column-left .item-main .search-helper{margin-right:28px}#column-left .item-main .search-helper{display:flex}@media only screen and (max-width:600px){[dir=ltr] #column-left .item-main .search-helper{margin-left:20px}[dir=rtl] #column-left .item-main .search-helper{margin-right:20px}}#column-left .item-main .search-helper .selector-user{font-size:14px;margin-top:7px}html.no-touch #column-left .item-main .search-helper .selector-user:active,html.no-touch #column-left .item-main .search-helper .selector-user:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none!important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{position:relative!important}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto!important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%,-50%)}#column-left #chatlist-container{background-color:#fff;background-color:var(--surface-color);max-height:100%;position:relative}#column-left #chatlist-container.has-filters .connection-status-bottom{height:calc(100% + var(--offset-top)*-1)}#column-left #folders-container{flex:1 1 auto}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .dialogs-placeholder-canvas{position:absolute;top:0;z-index:2}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{align-items:center;display:flex;flex:0 0 auto;height:2.5rem;justify-content:center;position:relative;width:2.5rem}#column-left .sidebar-header__btn-container>.btn-icon{bottom:0;left:0;margin:0;opacity:0;position:absolute;right:0;top:0;visibility:hidden;z-index:4}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width:600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);min-width:260px}[dir=ltr] #column-left .sidebar-tools-button .btn-menu .archived-count{margin-left:.625rem}[dir=rtl] #column-left .sidebar-tools-button .btn-menu .archived-count{margin-right:.625rem}#column-left .sidebar-tools-button .btn-menu .archived-count{justify-self:flex-end}@media only screen and (max-width:600px){#column-left .sidebar-tools-button .btn-menu .archived-count{font-weight:600}}[dir=ltr] #column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-right:.375rem}[dir=rtl] #column-left .sidebar-tools-button .btn-menu .btn-menu-item{padding-left:.375rem}#column-left .sidebar-tools-button .btn-menu .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding:0 0 1px}#column-left .search-group-people .chatlist:after,#column-left .search-group-people .chatlist:before{content:\" \";display:inline-block;flex:0 0 auto;width:.3125rem}#column-left .search-group-people .chatlist-chat{padding:0!important}#column-left .search-group-people .chatlist-chat{align-items:center;display:flex;flex:0 0 auto;flex-direction:column;height:6.125rem;justify-content:flex-end;max-width:4.875rem;width:4.875rem}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .dialog-title{max-width:65px;padding-bottom:.75rem}#column-left .search-group-people .dialog-title .user-title{font-size:.75rem!important}#column-left .search-group-people .dialog-title .peer-title{font-weight:400!important;font-weight:var(--font-weight-normal)!important}[dir=ltr] #column-left .search-group-people .dialog-avatar{left:auto!important}[dir=rtl] #column-left .search-group-people .dialog-avatar{right:auto!important}#column-left .search-group-people .dialog-avatar{top:.75rem!important}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){[dir=ltr] #column-left .search-group-people .search-group-scrollable{margin-left:-7px}[dir=rtl] #column-left .search-group-people .search-group-scrollable{margin-right:-7px}#column-left .search-group-people .search-group-scrollable{margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{visibility:visible!important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{position:fixed!important}#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;right:14px;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{flex:0 0 auto;overflow:hidden;padding:0 .5rem .5rem;width:100%}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}[dir=ltr] #column-left .connection-status-button{padding-left:4.5rem}[dir=rtl] #column-left .connection-status-button{padding-right:4.5rem}[dir=ltr] #column-left .connection-status-button{text-align:left}[dir=rtl] #column-left .connection-status-button{text-align:right}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}[dir=ltr] #column-left .connection-status-button .preloader-container{left:1rem}[dir=rtl] #column-left .connection-status-button .preloader-container{right:1rem}#column-left .connection-status-button .preloader-container{height:1.5rem;right:auto;width:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top:0px;background-color:#fff;background-color:var(--surface-color);bottom:0;display:flex;flex-direction:column;height:100%;left:0;overflow:hidden;position:absolute;right:0;top:0;transform:translateY(var(--offset-top))}#column-left .input-wrapper{flex:0 0 auto;margin:.75rem 0;max-width:100%;padding:0 .75rem;width:420px}@media only screen and (max-width:600px){#column-left .input-wrapper{width:100%}}#search-container{top:var(--offset-top)!important}#search-container{display:flex}#search-container .scrollable-y{flex:1 1 auto;position:relative}.edit-profile-container .sidebar-content,.new-channel-container .sidebar-content,.new-group-container .sidebar-content{flex-direction:column}.edit-profile-container .chatlist-container,.new-channel-container .chatlist-container,.new-group-container .chatlist-container{flex:1 1 auto}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{margin-left:23px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{margin-right:23px}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{padding-right:24px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{padding-left:24px}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:14px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}.settings-container .profile-avatars-container{height:15rem;padding-bottom:0}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:0 auto;max-width:20rem;text-align:center}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width:600px){.edit-folder-container .input-wrapper{padding:0 16px;width:100%}}.edit-folder-container .sidebar-left-section{padding-bottom:0}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-categories .checkbox-field{right:1.125rem!important}.folder-categories .checkbox-field{position:absolute}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}[dir=ltr] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}[dir=rtl] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-right:26px}.search-group-recent .search-group__name{align-items:center;display:flex;justify-content:space-between}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width:600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width:601px){.search-group-recent.search-group.search-group-contacts{padding:0 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{padding-top:0!important}.sidebar-left-section.with-fake-delimiter{box-shadow:none}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0!important}@media only screen and (max-width:600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width:601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}[dir=ltr] .sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}[dir=rtl] .sidebar-left-section-content>.checkbox-field .checkbox-box{right:auto}@media only screen and (max-width:600px){.sidebar-left-section-content>.btn-primary,.sidebar-left-section-content>.checkbox-ripple{border-radius:0}}.sidebar-left-section-content.full-width{margin:0!important}.sidebar-left-section-content>.media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width:600px){.sidebar-left-section-name{font-size:.875rem;padding:.5rem 1rem}}.sidebar-left-section-caption{color:#707579;color:var(--secondary-text-color);font-size:1rem;line-height:1.3125;line-height:var(--line-height);margin-top:1rem;padding:0 1rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{font-size:.875rem;margin:.5rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{align-items:center;display:flex;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{pointer-events:none!important}.sidebar-left-section-disabled{opacity:.25}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500;font-weight:var(--font-weight-bold)}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,#poll-results-container,#search-gifs-container,#search-private-container,#stickers-container,.add-members-container{background-color:#fff!important;background-color:var(--surface-color)!important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff!important;background-color:var(--surface-color)!important}.two-step-verification .sidebar-left-section{box-shadow:none!important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{margin-bottom:1.125rem;margin-left:auto;margin-right:auto;max-width:342px;text-align:center}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem!important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{height:168px;margin:.625rem auto 1.1875rem;width:168px}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{height:157px;margin:1.125rem auto 1.8125rem;width:157px}.two-step-verification-hint .media-sticker-wrapper{height:160px;margin:.5rem auto 2.25rem;width:160px}.two-step-verification-email .media-sticker-wrapper{height:160px;margin:.5625rem auto 2.1875rem;width:160px}.two-step-verification-set .media-sticker-wrapper{height:160px;margin:1rem auto 1.3125rem;width:160px}[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{right:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width:601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row-title:first-child{font-weight:500;font-weight:var(--font-weight-bold)}.active-sessions-container .row-title-right{color:#707579;color:var(--secondary-text-color);font-size:12px;font-size:var(--font-size-12);line-height:16px;line-height:var(--line-height-12)}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (min-width:601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height:2px;--color:var(--primary-color);--border-radius:4px;--thumb-size:12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .grid-item:after{border:3px solid #3390ec;border:3px solid var(--primary-color);bottom:0;content:\" \";display:block;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(.91)}.background-container .grid-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .grid-item-media.is-pattern{background-color:#000}.background-container .grid-item-media.is-pattern .media-photo{mix-blend-mode:overlay}.background-container .grid .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-container .grid .preloader-container{z-index:1}.background-container .background-colors-canvas{height:100%;-webkit-mask-position:center;-webkit-mask-size:contain;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{width:21rem!important}.empty-placeholder{line-height:1.3125;line-height:var(--line-height);margin:0 auto;padding:0 1rem;position:relative;text-align:center;top:40%;transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;user-select:none}.empty-placeholder .media-sticker-wrapper{height:128px;margin:0 auto 1.9375rem;position:relative;width:128px}.empty-placeholder-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}[dir=ltr] .empty-placeholder .btn-control:before{margin-right:.625rem}[dir=rtl] .empty-placeholder .btn-control:before{margin-left:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}.is-forum-visible .can-have-forum .input-search,.is-forum-visible .can-have-forum .row-row,.is-forum-visible .can-have-forum .sidebar-header__title{opacity:0}.is-forum-visible .folders-tabs-scrollable{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none}.is-forum-visible.backwards .can-have-forum .input-search,.is-forum-visible.backwards .can-have-forum .row-row,.is-forum-visible.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.backwards .folders-tabs-scrollable{opacity:1}.is-forum-visible.animating .can-have-forum .input-search,.is-forum-visible.animating .can-have-forum .row-row,.is-forum-visible.animating .can-have-forum .sidebar-header__title,.is-forum-visible.animating .folders-tabs-scrollable{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.is-forum-visible.animating.backwards .can-have-forum .input-search,.is-forum-visible.animating.backwards .can-have-forum .row-row,.is-forum-visible.animating.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.animating.backwards .folders-tabs-scrollable{transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}#column-right{overflow:visible;overflow:initial;position:relative}@media only screen and (min-width:601px)and (max-width:1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width:600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw,0,0)}}@media only screen and (min-width:601px){#column-right{position:absolute;right:0;transform:translate3d(var(--right-column-width),0,0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:calc(var(--right-column-width));z-index:3}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transform:translateZ(0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width:1276px){#column-right{border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);transform:translate3d(calc(var(--right-column-width) + 1px),0,0);width:calc(var(--right-column-width) + 1px)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}@media only screen and (min-width:601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}}#column-right #search-private-container .chatlist-container{flex:1 1 auto;position:relative}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{margin:.75rem 0;max-width:100%;padding:0 .75rem;width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0;perspective-origin:0 0}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .profile-content.is-me .profile-name{margin-bottom:.9375rem}.shared-media-container .profile-content.is-me .profile-subtitle{display:none}.shared-media-container .search-super{min-height:calc(100vh - 56px);min-height:calc(var(--vh, 1vh)*100 - 56px);top:100%}.shared-media-container .search-super-tabs{--padding-horizontal:0}.shared-media-container .search-super-tabs .menu-horizontal-div-item{border-radius:0!important}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{align-items:center;display:flex}.shared-media-container .btn-corner.menu-open:before{content:\"\"}@media only screen and (max-width:600px){.shared-media-container .btn-corner{position:fixed!important}.shared-media-container .btn-corner{bottom:14px;height:54px;right:14px;width:54px;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;max-width:100%;min-height:100%;position:absolute;width:100%}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:24px 0 0 24px}@media only screen and (max-width:600px){.search-super .search-super-month-name{padding:18px 0 0 16px}}.search-super.sliding{max-height:none!important}.search-super-tabs{flex:1 1 auto;width:auto}.search-super-tabs-scrollable{box-shadow:none!important;position:sticky!important}.search-super-tabs-scrollable{background-color:#fff;background-color:var(--surface-color);top:0;z-index:2}.search-super-tabs-scrollable:before{background-color:inherit;content:\" \";display:block;height:1px;left:0;position:absolute;top:0;width:100%;z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{display:flex;position:relative}.search-super-tabs-container{flex:1 1 auto;grid-template-rows:100%;min-height:calc(100% - 49px)}.search-super-tabs-container>div{background-color:#fff!important;background-color:var(--surface-color)!important}.search-super-tabs-container>div{min-height:150px;position:relative}.search-super-tabs-container>div>div:first-child{min-height:calc(100vh - 111px);transform:translateY(0)}.search-super-tabs-container .preloader{position:absolute!important}.search-super-tabs-container .preloader{padding:0;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .audio-title,.search-super .document-name,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:12px;margin-left:8px;margin-top:3px}.search-super-content-media .search-super-month-name{border:none;padding:9px 0 7px 24px}.search-super-content-media .video-time{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:4px;color:#fff;font-size:12px;height:18px;left:5px;line-height:18px;padding:0 6px 0 5px;position:absolute;top:4px;z-index:2}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{position:absolute!important}.search-super .checkbox-field{margin:0;z-index:2}.search-super-content-media .search-super-month-items{grid-gap:1px;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);padding-top:1px;width:100%}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width:600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{--icon-size:3rem;--icon-margin:.75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-download,.search-super-content-files .document-ico{border-radius:5px!important}.search-super-content-files .document-name{font-weight:400;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.search-super-content-links .search-super-item{cursor:pointer;display:flex;flex-direction:column;justify-content:flex-start;min-height:4.375rem;overflow:hidden;padding-left:4.4375rem;position:relative}.search-super-content-links .row-media{border-radius:.375rem;height:3rem;left:.6875rem;overflow:hidden;position:absolute;width:3rem}.search-super-content-links .row-media.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);color:#fff;display:flex;font-size:2rem;justify-content:center;text-transform:uppercase}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:static}.search-super-content-links .anchor-url:last-child:before{bottom:0;content:\" \";cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:1}.search-super-content-links .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{--offset-left:0!important;margin:2rem 0 0 -1.75rem!important;padding:0!important}@media only screen and (min-width:601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width:600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 20px}@media only screen and (max-width:600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:normal;margin-bottom:1.5rem}@media only screen and (min-width:601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-bottom:.5rem;padding-top:.5rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent!important}.search-super-selection-container{align-items:center;bottom:0;display:flex;justify-content:space-between;left:0;opacity:0;padding:0 1rem;position:absolute;right:0;top:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width:600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);margin-left:1.5rem;text-transform:capitalize;white-space:nowrap}#search-container .search-group.is-short .chatlist-chat:nth-child(n+4),#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time{display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{cursor:pointer;display:flex;flex-direction:column;height:140px}#stickers-container .sticker-set-name{font-weight:500;font-weight:var(--font-weight-bold)}#stickers-container .sticker-set-count{color:#707579;color:var(--secondary-text-color);font-size:14px}#stickers-container .sticker-set-header{display:flex;justify-content:space-between;padding-bottom:12px;padding-left:16px}#stickers-container .sticker-set-button{border-radius:16px;font-size:15px;font-weight:400;height:30px;margin-right:16px;padding-left:12px;padding-right:13px;transition:width .2s;width:auto}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{height:68px;position:relative;width:68px}#stickers-container .sticker-set-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}#stickers-container .sticker-set-sticker img{max-height:100%;max-width:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);display:flex;font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);justify-content:space-between;margin:0;padding:0 16px 8px;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-answer{padding:0 24px 8px}}#poll-results-container .poll-results-more{margin:0 .5rem;width:auto}@media only screen and (max-width:600px){#poll-results-container .poll-results-more{border-radius:0;margin:0}}#poll-results-container .poll-results h3{font-size:20px;margin-bottom:16px;margin-top:15px;padding:0 16px}@media only screen and (min-width:601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{display:block!important}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem!important}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem!important}.edit-contact-container .avatar-placeholder{filter:none!important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem!important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem!important}.media-viewer{align-items:center;background:rgba(0,0,0,.88);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0}@media only screen and (max-width:600px){.media-viewer{background:#000}}.media-viewer-author{align-items:center;cursor:pointer;display:flex;height:100%}@media only screen and (max-width:600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width:600px){.media-viewer-userpic{display:none}}.media-viewer-name{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.0625rem 0}@media only screen and (min-width:601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.media-viewer-buttons{display:flex;flex-flow:row nowrap;padding:.5rem .75rem;position:absolute;right:0;top:0}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:active,html.no-touch .media-viewer-buttons .btn-icon:hover{color:#fff}@media only screen and (max-width:600px){.media-viewer-buttons{display:none}}.media-viewer-content{flex-direction:column;height:100%;justify-content:center}.media-viewer-container,.media-viewer-content{align-items:center;display:flex;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;flex:1 1 auto;position:relative}.media-viewer-media{visibility:hidden}.media-viewer-caption{background-color:transparent;bottom:0;color:#fff;left:0;line-height:1.3125;line-height:var(--line-height);opacity:0;overflow:hidden;padding:.5rem .5rem 0;position:absolute;right:0;text-align:center;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word;z-index:4}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9!important}.media-viewer-caption .scrollable{height:6rem;margin:0 auto;max-height:6rem;max-width:50rem;padding:.5rem .875rem;position:relative}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width:600px){.media-viewer-caption{bottom:1.0625rem;text-align:inherit;transform:translateZ(0);width:100%}.media-viewer-caption .scrollable{height:auto;padding:0 .5rem}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0,-69px,0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{opacity:1!important}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{background-color:#000}}.media-viewer-caption.is-focused{opacity:1!important}.media-viewer-caption.is-focused{background-color:#000}.media-viewer-switcher{cursor:pointer;height:calc(100% - 7.5rem);left:0;position:absolute;top:3.75rem;width:7rem;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width:600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-next-button,.media-viewer-prev-button{color:#fff;cursor:pointer;font-size:2rem;left:1rem;opacity:0;position:absolute;top:50%;transform:translateY(-50%) rotate(90deg);transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width:601px){.media-viewer-next-button,.media-viewer-prev-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width:601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{min-height:auto!important;position:fixed!important}.media-viewer-mover{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;overflow:hidden;top:0;transform:translateZ(0) scaleX(1);transform-origin:top left}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}@media only screen and (max-width:600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{height:100%;left:0;position:absolute;top:0;width:100%}.media-viewer-mover>svg{height:100%;width:100%}.media-viewer-mover .canvas-thumbnail,.media-viewer-mover img,.media-viewer-mover video{height:100%;max-height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;opacity:1;position:absolute;transition:var(--open-duration) opacity;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.media-viewer-mover svg img,.media-viewer-mover svg video{position:static}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration)/8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none!important}.media-viewer-mover.center{left:50%!important;top:50%!important;transform:translate3d(-50%,-50%,0)!important}.media-viewer-mover.center{max-height:calc(100vh - 15rem);max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-width:100vw!important;width:100%!important}.media-viewer-mover.center{max-height:calc(100vh - 120px);max-height:calc(var(--vh, 1vh)*100 - 120px)}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center .canvas-thumbnail,.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{-o-object-fit:contain;object-fit:contain;width:auto}.media-viewer-mover.hiding .canvas-thumbnail,.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{align-items:center;display:flex;height:3.5rem;justify-content:space-between;left:0;padding:0 1.25rem;position:absolute;right:0;top:0;z-index:5}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover{opacity:1}.media-viewer-topbar-left{align-items:center;display:flex}@media only screen and (max-width:600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{align-items:center;border-radius:0;display:flex;height:100%;justify-content:center;position:absolute;transform:scaleX(1);width:100%}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{position:fixed!important}.media-viewer-whole{--open-duration:.2s;--move-duration:.35s;display:block;height:100%;left:0;top:0;transition:visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}body.animation-level-0 .media-viewer-whole{--open-duration:0s;--move-duration:0s}.media-viewer-whole.active{transition-delay:0s;visibility:visible}.media-viewer-whole.active .media-viewer-appear,.media-viewer-whole.active .overlays{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .media-viewer-appear,body.animation-level-2 .media-viewer-whole.active .overlays{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width:600px){.media-viewer-whole .btn-menu-toggle:not(.playback-rate){color:hsla(0,0%,100%,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{background-color:hsla(207,4%,46%,.2)!important}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important}.media-viewer-whole.hide-caption .media-viewer-caption{pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards .canvas-thumbnail,.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;user-select:none}.media-viewer-movers{bottom:0;left:0;position:absolute;right:0;top:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:\"\"}.tgico-zoom.zoom-in:before{content:\"\"}.zoom-container{align-items:center;background-color:rgba(0,0,0,.4);border-radius:12px;bottom:1.25rem;display:flex;height:3.375rem;justify-content:space-between;left:50%;opacity:1;padding:.5rem;position:absolute;transform:translateX(-50%);width:17.125rem;z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{opacity:.4;pointer-events:none}.zoom-container .progress-line{--color:#fff;--height:2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.media-viewer-whole:not(.active) .zoom-container,.zoom-container:not(.is-visible){opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0!important}.zoom-container.is-visible~.media-viewer-caption{pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0!important}.overlays{position:fixed!important}.overlays{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{background:#fff;background:var(--surface-color);display:flex;flex:1 1 auto;flex-direction:column;height:min(282px,calc(100vh - 135px));height:min(282px,calc(var(--vh)*100 - 135px));max-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{position:absolute!important;width:23.875rem!important}.emoji-dropdown{-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:1.25rem;bottom:5.125rem;box-shadow:0 5px 10px 5px rgba(16,35,47,.14);height:26.25rem;left:.8125rem;max-height:26.25rem;opacity:0;transform:scale(0);transform-origin:0 100%;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);z-index:3}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{height:100%;max-width:100%;overflow:hidden;width:100%}.emoji-dropdown .emoji-tabs{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);justify-content:center}.emoji-dropdown .emoji-tabs:after{content:none}.emoji-dropdown .emoji-tabs-search{margin-left:.5rem!important}.emoji-dropdown .emoji-tabs-search{left:0;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:.5rem!important}.emoji-dropdown .emoji-tabs-delete{position:absolute;right:0}.emoji-dropdown .emoji-tabs .menu-horizontal-div-item{margin:0 .75rem}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .stickers-padding .category-items{gap:.25rem;padding:0 .1875rem}.emoji-dropdown #content-gifs .scrollable-y{padding:0 .1875rem}.emoji-dropdown .gifs-masonry{border-radius:10px;overflow:hidden}.emoticons-container{background-color:transparent;flex-direction:column;height:100%;min-height:100%}.emoticons-menu{--item-size:1.875rem;align-items:center;min-height:3.0625rem;padding:0 .3125rem;width:100%;z-index:4}.emoticons-menu,.emoticons-menu-wrapper{background-color:transparent;height:3.0625rem}.emoticons-menu-wrapper{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);max-width:100%;padding:0;position:relative}.emoticons-menu:after{content:\" \";display:block;flex:0 0 auto;height:1px;width:.1875rem}.emoticons-menu .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:var(--item-size);line-height:var(--item-size);margin:0 .3125rem;padding:0;width:var(--item-size)}.emoticons-menu .menu-horizontal-div-item.not-local{border-radius:.25rem!important}.emoticons-menu .menu-horizontal-div-item.not-local{--item-size:2.375rem;padding:.25rem}.emoticons-menu .menu-horizontal-div-item.active{background-color:rgba(0,0,0,.06)!important;background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-div-item.active,html.no-touch .emoticons-menu .menu-horizontal-div-item:active,html.no-touch .emoticons-menu .menu-horizontal-div-item:hover{color:rgba(0,0,0,.8)!important;color:rgba(var(--primary-text-color-rgb),.8)!important}.emoticons-menu .menu-horizontal-div-item-padding{height:100%;position:relative;width:100%}.emoticons-menu .menu-horizontal-div-item.active:not(.tgico){background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.emoticons-menu .menu-horizontal-inner{border-radius:15px;flex:0 0 auto;margin:0 .3125rem;overflow:hidden;width:1.875rem}html.is-safari .emoticons-menu .menu-horizontal-inner{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner{transition:width .2s ease-in-out}.emoticons-menu .menu-horizontal-inner-scroll{align-items:center;display:flex;height:100%;position:relative;width:8.5rem}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{margin:0!important}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transform:scale(1)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transition:transform .2s ease-in-out!important}.emoticons-menu .menu-horizontal-inner.active{background-color:rgba(0,0,0,.06)!important;background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-inner.active{width:8.5rem}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item{transform:scale(.8)}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item.active{background-color:transparent!important}.emoticons-menu .menu-horizontal-inner:not(.active){cursor:pointer}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-inner-scroll{pointer-events:none}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-div-item:first-child{pointer-events:all}.emoticons-content{flex:1;padding:0;position:relative}.emoticons-content .emoji-category{position:relative}.emoticons-content .sticky_sentinel--top{height:1px;top:0}.emoticons-content .category-title{color:rgba(0,0,0,.42);color:rgba(var(--primary-text-color-rgb),.42);cursor:pointer;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:1.1875rem;padding:.75rem .875rem .375rem;position:relative;text-align:center;width:100%}.emoticons-content .category-title .btn-icon{font-size:1.25rem;pointer-events:all;position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}.emoticons-content:not(.has-premium) .is-premium-set .category-title:before{content:\"\";line-height:inherit;margin-right:.125rem;vertical-align:middle}.emoji-padding .super-emojis{padding:0 .5rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{height:0;opacity:0;width:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{display:none;height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover{scrollbar-color:rgba(0,0,0,.2) transparent;scrollbar-color:var(--scrollbar-color) transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);background-color:rgba(0,0,0,.2);background-color:var(--scrollbar-color);border-radius:10px;max-height:12.5rem;min-height:5rem;opacity:1}.no-scrollbar::-webkit-scrollbar,.scrollable-x::-webkit-scrollbar{display:none}.scrollable{-webkit-overflow-scrolling:touch;bottom:0;height:100%;left:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;position:absolute;right:0;top:0;width:100%}.scrollable.scrollable-x{-ms-overflow-style:none;overflow-x:auto;scrollbar-width:none}.scrollable.scrollable-y{-ms-overflow-style:none;overflow-y:auto;overflow-y:overlay;scrollbar-color:transparent transparent;scrollbar-width:thin;transform:translateZ(0)}.scrollable.scrollable-y.scrollable-y-bordered{border-bottom:1px solid transparent;border-top:1px solid transparent}body.animation-level-2 .scrollable.scrollable-y.scrollable-y-bordered{transition:border-top-color .3s cubic-bezier(.4,0,.2,1),border-bottom-color .3s cubic-bezier(.4,0,.2,1);transition:border-top-color var(--transition-standard-in),border-bottom-color var(--transition-standard-in)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-top){border-top-color:#dfe1e5;border-top-color:var(--border-color)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-bottom){border-bottom-color:#dfe1e5;border-bottom-color:var(--border-color)}.scrollable-padding{height:100%;min-width:100%}@keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}.selector{display:flex;flex-direction:column;height:100%;width:100%}.selector .selector-search-section{margin-bottom:0!important;padding:0!important}.selector .selector-search-section{position:relative;z-index:1}.selector-search-container{flex:0 0 auto;max-height:132px;overflow:hidden;position:relative}.selector-search-container .scrollable{max-height:inherit;position:relative}.selector-search{display:flex;flex-flow:wrap;padding-left:1rem;padding-right:1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}[dir=ltr] .selector-user{padding-right:17px}[dir=rtl] .selector-user{padding-left:17px}[dir=ltr] .selector-user{margin-left:-.25rem;margin-right:.75rem}[dir=rtl] .selector-user{margin-left:.75rem;margin-right:-.25rem}.selector-user{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:1.5rem;color:#000;color:var(--primary-text-color);flex:0 0 auto;font-size:1rem;height:2rem;line-height:2rem;margin-bottom:7px;max-width:11.25rem;overflow:hidden;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:active,html.no-touch .selector-user:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:active .selector-user-avatar:after,html.no-touch .selector-user:hover .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{animation:scaleIn .1s ease forwards;animation-direction:reverse}[dir=ltr] .selector-user-avatar{margin-right:8px}[dir=rtl] .selector-user-avatar{margin-left:8px}.selector-user-avatar{border-radius:50%!important}.selector-user-avatar{float:left;overflow:hidden;position:relative}.is-rtl .selector-user-avatar{float:right}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}[dir=ltr] .selector-user-avatar:after{left:0}[dir=rtl] .selector-user-avatar:after{right:0}.selector-user-avatar:after{line-height:32px!important}.selector-user-avatar:after{background-color:#df3f40;background-color:var(--danger-color);content:\"\";font-size:23px;height:100%;opacity:0;position:absolute;top:0;transform:scaleX(-1) rotate(0deg);transition:opacity .2s,transform .2s;width:100%;z-index:2}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{flex:1 1 auto;height:100%}.selector>hr{margin:0;padding:0}[dir=ltr] .selector .checkbox{padding-left:11px}[dir=rtl] .selector .checkbox{padding-right:11px}.selector .checkbox{margin-top:11px}.selector .checkbox-field{--offset-left:0!important;margin:0!important;padding:0!important;position:absolute!important}.selector .checkbox-field{pointer-events:none;top:50%;transform:translateY(-50%);z-index:1}[dir=ltr] .selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}[dir=rtl] .selector .checkbox-field:first-child{margin-left:1.6875rem;margin-right:.6875rem}[dir=ltr] .selector .checkbox-field-round{right:1.125rem}[dir=rtl] .selector .checkbox-field-round{left:1.125rem}.selector .checkbox-field-round{--size:1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}[dir=ltr] .selector-square .checkbox-field{left:1.25rem!important}[dir=rtl] .selector-square .checkbox-field{right:1.25rem!important}[dir=ltr] .selector-square .chatlist-chat.row-with-padding{padding-left:7.5rem!important}[dir=rtl] .selector-square .chatlist-chat.row-with-padding{padding-right:7.5rem!important}[dir=ltr] .selector-square .dialog-avatar{margin-left:3rem!important}[dir=rtl] .selector-square .dialog-avatar{margin-right:3rem!important}.gifs-masonry{grid-gap:.125rem;display:grid;gap:.125rem;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr)}.gifs-masonry .gif img,.gifs-masonry .gif video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gifs-masonry .gif img{left:0;position:absolute;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{animation:rotate 1s linear infinite;bottom:0;height:100%;left:0;margin:auto;position:absolute;right:0;top:0;transform-origin:center center}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{bottom:0;cursor:pointer;display:flex;height:54px;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transform:scale(0);width:54px}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color:#fff}.preloader-container .you-spin-me-round{height:100%;width:100%}.preloader-container .preloader-circular{animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;height:100%;width:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round{animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new,body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{animation:rotate 1s linear infinite!important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{bottom:0;color:var(--color);height:56%;left:0;margin:auto;opacity:1;position:absolute;right:0;top:0;width:56%}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-download:active,html.no-touch .preloader-container .preloader-download:hover{background:none}.preloader-container.manual .preloader-close,.preloader-container:not(.manual) .preloader-download{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{height:1.5rem;width:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer!important}.preloader-container.preloader-streamable circle{stroke-width:2.5!important}.preloader-container.preloader-streamable:after{background-color:var(--color);border-radius:.125rem;content:\"\";height:.8125rem;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:.8125rem}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@keyframes rotate{to{transform:rotate(1turn)}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.btn-corner.rp .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple,.rp-overflow .c-ripple{border-radius:inherit;height:100%;overflow:hidden;width:100%}.btn-corner.rp .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle,.rp-overflow .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration:.7s;bottom:0;left:0;position:absolute;right:0;top:0}html.is-safari .c-ripple:not(:empty){border-radius:inherit;-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.c-ripple__circle{animation:ripple-effect .7s forwards;background-color:rgba(0,0,0,.08);background-color:var(--ripple-color);border-radius:50%;display:block;pointer-events:none;position:absolute;transform:scale(0);transition:opacity .35s,background-color .35s}.btn-menu .c-ripple__circle,.c-ripple.is-square .c-ripple__circle{animation-duration:.2s;animation-name:ripple-effect-handhelds;transition-duration:.1s}.btn-menu .c-ripple,.c-ripple.is-square{--ripple-duration:.2s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.chatlist-container ul li>.rp .c-ripple{--ripple-duration:.2s}.chatlist-container ul li>.rp .c-ripple__circle{animation-duration:.2s;animation-name:ripple-effect-handhelds;transition-duration:.1s}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}.avatar-like{line-height:var(--size)!important}.avatar-like{--size:54px;--multiplier:1;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--size)}avatar-element{--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%}avatar-element[data-color=red]{--color-top:var(--peer-avatar-red-top);--color-bottom:var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top:var(--peer-avatar-orange-top);--color-bottom:var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top:var(--peer-avatar-violet-top);--color-bottom:var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top:var(--peer-avatar-green-top);--color-bottom:var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top:var(--peer-avatar-cyan-top);--color-bottom:var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top:var(--peer-avatar-pink-top);--color-bottom:var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top:var(--peer-avatar-blue-top);--color-bottom:var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px/var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px/var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(30px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount{--color-top:var(--peer-avatar-archive-top);--color-bottom:var(--peer-avatar-archive-bottom);overflow:hidden}avatar-element.tgico-deletedaccount:before{font-size:calc(30px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;height:var(--size)!important;width:var(--size)!important}avatar-element img{display:block}avatar-element img.fade-in{animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{height:calc(1.125rem/var(--multiplier))!important;vertical-align:middle!important;width:calc(1.125rem/var(--multiplier))!important}avatar-element.is-forum{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}avatar-element.is-topic{background:none;border-radius:0;position:relative}avatar-element.is-topic .topic-icon{--size:inherit}avatar-element.is-online{position:relative}avatar-element.is-online:after{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;content:\" \";display:block;height:14px;left:2.4375rem;position:absolute;top:2.4375rem;width:14px}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size:120px;--multiplier:.45}avatar-element.avatar-100{--size:100px;--multiplier:.54}avatar-element.avatar-48{--size:48px;--multiplier:1.125}avatar-element.avatar-46{--size:46px;--multiplier:1.173913}avatar-element.avatar-44{--size:44px;--multiplier:1.227272}avatar-element.avatar-42{--size:42px;--multiplier:1.285714}avatar-element.avatar-40{--size:40px;--multiplier:1.35}avatar-element.avatar-36{--size:36px;--multiplier:1.5}avatar-element.avatar-35{--size:35px;--multiplier:1.542857}avatar-element.avatar-34{--size:34px;--multiplier:1.588235}avatar-element.avatar-32{--size:32px;--multiplier:1.6875}avatar-element.avatar-30{--size:30px;--multiplier:1.6875}avatar-element.avatar-26{--size:26px;--multiplier:2.076923}avatar-element.avatar-24{--size:24px;--multiplier:2.25}avatar-element.avatar-22{--size:22px;--multiplier:2.454545}avatar-element.avatar-18{--size:18px;--multiplier:3}avatar-element.avatar-16{--size:16px;--multiplier:3.375}.avatar-relative .avatar-photo{left:0;position:absolute;top:0}.avatar-full{align-items:center;border-radius:inherit;display:inline-flex;height:100%;justify-content:center;position:absolute;width:100%}.avatar-full .avatar-photo{height:100%!important;width:100%!important}.avatar-full .avatar-photo{-o-object-fit:cover;object-fit:cover}.document{--background-color:var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}html.is-safari .document-ico{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.document-ico-text{opacity:0}body.animation-level-2 .document-ico-text{transition:opacity .2s ease-in-out}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0}@media only screen and (max-width:600px){.document:not(.document-with-thumb) .document-ico{font-size:14px;padding:1.5rem 0 0}.document:not(.document-with-thumb) .document-ico:after{--size:.875rem}}.document-ico:after{--size:1.125rem;border-bottom-color:rgba(0,0,0,.25);border-bottom-left-radius:.25rem;border-left-color:rgba(0,0,0,.25);border-right-color:#fff;border-right-color:var(--message-background-color);border-style:solid;border-top-color:#fff;border-top-color:var(--message-background-color);border-width:calc(var(--size)/2);content:\"\";display:block;position:absolute;right:0;top:0}body.animation-level-2 .document-ico:after{transition:border-width .2s ease-in-out}html.no-touch .document:not(.downloaded):active .document-ico:after,html.no-touch .document:not(.downloaded):hover .document-ico:after{border-width:0}html.no-touch .document:not(.downloaded):active .document-ico-text,html.no-touch .document:not(.downloaded):hover .document-ico-text{opacity:0}html.no-touch .document:not(.downloaded):active .preloader-container,html.no-touch .document:not(.downloaded):hover .preloader-container{opacity:1!important}.document:not(.downloading) .document-ico-text{opacity:1}.document:not(.downloading) .preloader-container{opacity:0!important}.document.downloading .document-ico:after{border-width:0}.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name,.document-size{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document.ext-zip{--background-color:#fb8c00}.document.ext-pdf{--background-color:#df3f40}.document.ext-apk{--background-color:#43a047}.document.document-with-thumb{--background-color:#fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.2);border-radius:.375rem}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3)!important}.document-thumb{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.document-name{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16);white-space:nowrap}.document-size{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);pointer-events:none;position:relative}.document .preloader-container{height:2.5rem;width:2.5rem}@media only screen and (max-width:600px){.document .preloader-container{height:1.625rem;width:1.625rem}}.document .preloader-circular{background-color:transparent!important}.document .preloader-path-new{stroke-width:2.5}.audio,.document{--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding-left:var(--padding-left);-webkit-user-select:none;-moz-user-select:none;user-select:none}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);margin-left:calc(var(--padding-left)*-1);position:absolute;width:var(--icon-size)}.audio-download,.document-download{align-items:center;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;opacity:1;transition:opacity .2s ease-in-out;z-index:1}.audio-download.downloaded,.document-download.downloaded{opacity:0}.audio-description,.document-description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio:not(.corner-download) .preloader-container:not(.preloader-streamable),.document:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1)!important}.audio .checkbox-field-round,.document .checkbox-field-round{--margin-top:.25rem;--margin-left:.125rem;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent!important}.audio .preloader-container:not(.preloader-streamable){height:100%;width:100%}.audio{overflow:visible!important}.audio{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size)}.audio-download,.audio-toggle{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{display:flex!important;margin:0!important}.audio.corner-download .audio-download{background:none;height:1.375rem;left:57.5%;top:57.5%;width:1.375rem}.audio.corner-download .preloader-container{background-color:#3390ec;background-color:var(--primary-color);border-radius:inherit}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{border-radius:inherit;bottom:0;left:0;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0;transform:rotate(-119deg)}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{background-color:#fff;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out,-webkit-clip-path .25s ease-in-out}@media only screen and (min-width:601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width:600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width:601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width:600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:active,html.no-touch .audio-waveform-background rect:hover{opacity:1}.audio-waveform-fake{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;width:0}.audio-waveform-container{height:23px;margin-top:1px;position:relative}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color)}.audio .audio-details{margin-bottom:0;margin-top:3px}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px!important;width:112px!important}@media only screen and (max-width:600px){.audio .part{height:100px!important;width:100px!important}}.audio-title{color:#000;color:var(--primary-text-color);font-size:1rem}.audio-description:not(:empty):before{content:\" • \"}.audio-subtitle,.audio-time{color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem}@media only screen and (max-width:600px){.audio-subtitle,.audio-time{font-size:.75rem}}.audio-subtitle,.audio-time,.audio-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-subtitle,.audio-title{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{align-items:center;line-height:1;margin-left:-1px;margin-top:7px}@media only screen and (max-width:600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:\" \";height:.5rem;margin-left:.375rem;width:.5rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.audio .progress-line{--height:2px;--border-radius:4px;--thumb-size:.75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{background-color:transparent;opacity:1;z-index:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff!important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;width:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:8px;transform:translate3d(0,calc(-100% - 10px),0);transition:transform .2s ease;width:100%}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translateZ(0)}[dir=ltr] .quiz-hint .container{text-align:left}[dir=rtl] .quiz-hint .container{text-align:right}.quiz-hint .container{align-items:center;background:rgba(0,0,0,.7);border-radius:12px;color:#fff;display:flex;flex-wrap:wrap;font-size:15px;line-height:1.5;max-width:400px;min-height:48px;overflow:hidden;padding:10px 18px 12px 50px;position:relative;text-align:center;width:auto}@media only screen and (max-width:600px){.quiz-hint .container{font-size:14px;margin:0 10px;padding:10px 18px 12px 54px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:\"\";font-size:1.5rem;left:15px;position:absolute;top:12px}.quiz-hint .container a{border-bottom:1px solid #fff;color:#fff}.peer-typing{margin-right:4px}.peer-typing-container{--color:var(--primary-color);color:var(--color)}.peer-typing-flex{align-items:center;display:flex}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;transform:translateY(-1px);vertical-align:middle}.peer-typing-text-dot{animation-duration:.6s;animation-iteration-count:infinite;animation-name:dotMiddle;animation-timing-function:linear;background-color:var(--color);border-radius:50%;display:inline-block;height:6px;margin:0 .5px;vertical-align:middle;width:6px}.peer-typing-text-dot:first-child{animation-name:dotFirst}.peer-typing-text-dot:last-child{animation-name:dotLast}.peer-typing-upload{border-radius:2px;height:5px;margin-right:.375rem;overflow:hidden;position:relative;width:13px}.peer-typing-upload:after,.peer-typing-upload:before{background-color:var(--color);border-radius:inherit;bottom:0;content:\" \";display:block;left:0;position:absolute;right:0;top:0}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{animation:recordBlink 1.25s infinite;background-color:var(--color);border-radius:50%;content:\" \";display:block;height:6px;width:6px}.peer-typing-choosing-sticker{align-items:center;display:flex;flex:0 0 auto;height:16px;margin-right:.375rem}.peer-typing-choosing-sticker-eye{animation:eye 1.8s ease-in-out infinite;border:1px solid var(--color);border-radius:50%;display:inline-block;height:14px;margin:0 .0625rem;position:relative;vertical-align:middle;width:8px}.peer-typing-choosing-sticker-eye:before{animation:eye-move 1.8s ease-in-out infinite;background-color:var(--color);border-radius:50%;content:\" \";display:block;height:.25rem;position:absolute;top:50%;transform:translate(-1px,-50%);width:.25rem}@keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}poll-element{color:#000;color:var(--primary-text-color);display:block;margin-top:-1px;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:330px}@media only screen and (max-width:600px){poll-element{max-width:100%;width:240px}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (max-width:600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;margin-bottom:5px;margin-top:2px;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1.5rem;position:absolute;right:2px;top:-4px;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{pointer-events:none;transform:scale(0)}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{cursor:pointer;display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;height:18px;width:18px}poll-element .poll-answer{display:flex;margin-top:1px;padding-bottom:20px;padding-left:28px;position:relative}poll-element .poll-answer-text{margin-left:12px;margin-top:6px}[dir=ltr] poll-element .poll-answer-percents{text-align:right}[dir=rtl] poll-element .poll-answer-percents{text-align:left}poll-element .poll-answer-percents{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);left:0;margin-left:-9px;margin-top:7px;opacity:0;position:absolute;top:0;width:40px}poll-element .poll-answer-selected{align-items:center;background:#3390ec;background:var(--primary-color);border-radius:50%;bottom:1px;color:#fff;display:flex;font-size:.75rem;font-weight:500;font-weight:var(--font-weight-bold);height:16px;justify-content:center;left:15px;opacity:1;position:absolute;width:16px}poll-element .poll-answer-selected:before{content:\"\";font-weight:500;font-weight:var(--font-weight-bold)}html.no-touch poll-element .poll-answer:active .animation-ring,html.no-touch poll-element .poll-answer:hover .animation-ring{transform:scale(1);visibility:visible}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-.5rem}poll-element .poll-line{stroke-dashoffset:0;stroke-dasharray:0,485.9;bottom:2px;height:35px;left:10px;position:absolute}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{height:2.875rem;margin:-.375rem -.5rem -.375rem -.625rem;text-align:center}poll-element .poll-footer-button{border-top-left-radius:0!important;border-top-right-radius:0!important}poll-element .poll-footer-button{color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;overflow:hidden;width:100%}poll-element .poll-footer,poll-element .poll-footer-button{align-items:center;display:flex;justify-content:center}poll-element .poll-quiz-timer{stroke:#a3adb6;fill:none;stroke-linecap:round;height:32px;position:absolute;right:-2px;top:-7px;transform:rotate(270deg);width:32px}poll-element .poll-time{color:#a3adb6;font-size:12px;font-weight:500;font-weight:var(--font-weight-bold);position:absolute;right:27px}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:\"\";font-size:12px}poll-element .circle-hover{align-items:center;display:flex;height:34px;justify-content:center;left:-1px;position:absolute;top:-1px;transform:scale(1);width:34px}poll-element .circle-hover .poll-answer-selected{display:flex!important}poll-element .circle-hover .poll-answer-selected{animation:none;font-size:20px;height:20px;left:50%;line-height:16px;opacity:0;top:50%;transform:translate(-50%,-50%);width:20px}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;display:block;height:34px;transform:scale(.1);visibility:hidden;width:34px}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;left:auto;top:auto;width:26px}poll-element .progress-ring__circle{stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent;transform:rotate(-90deg);transform-origin:center}poll-element.is-voted .animation-ring,poll-element.is-voted .circle-hover{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity forwards .1s ease}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:opacity .34s}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:transform .1s}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{animation-fill-mode:forwards!important}.transition>.transition-item{height:100%;left:0;position:absolute;top:0;width:100%}.transition>.transition-item:not(.active):not(.from):not(.to){display:none!important}.transition.zoom-fade>.from{opacity:1;transform:scale(1);transform-origin:center}.transition.zoom-fade>.to{opacity:0;transform-origin:center}.transition.zoom-fade.animating>.from{animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(.95)}.transition.zoom-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine:cubic-bezier(.39,.575,.565,1);--easeInSine:cubic-bezier(.47,0,.745,.715);position:relative}.transition.slide-fade>.from{opacity:1;transform:translateX(0);transform-origin:left center}.transition.slide-fade>.to{opacity:0;transform:translateX(1.5rem);transform-origin:left center}.transition.slide-fade.animating>.from{animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{opacity:1;transform:translateX(0)}.transition.slide-fade.backwards>.to{opacity:0;transform:translateX(-1.5rem)}.transition.slide-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}.row{display:flex;flex-direction:column;justify-content:center;min-height:3.5rem;padding:.4375rem 1rem;position:relative}.row.no-subtitle,.row.row-small{min-height:3rem;padding-bottom:.1875rem;padding-top:.1875rem}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.row.is-disabled{pointer-events:none!important}.row.is-disabled{opacity:.3;opacity:var(--disabled-opacity)}.row.no-wrap{padding-bottom:0!important;padding-top:0!important}.row a{pointer-events:all;position:relative;z-index:1}.row-title-row,.row>.row-title{order:0}[dir=ltr] .row-big{padding-left:1rem;padding-right:.75rem}[dir=rtl] .row-big{padding-left:.75rem;padding-right:1rem}.row-big{min-height:4.5rem;padding-bottom:.5625rem;padding-top:.5625rem}.row-row{align-items:center;display:flex;justify-content:space-between}.row-row .row-subtitle,.row-row .row-title{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row-subtitle-row,.row>.row-subtitle{order:1}.row-title{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;word-break:break-word}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}[dir=ltr] .row-subtitle-right,[dir=ltr] .row-title-right{margin-left:1rem}[dir=rtl] .row-subtitle-right,[dir=rtl] .row-title-right{margin-right:1rem}.row-subtitle-right,.row-title-right{flex:0 0 auto!important}.row-midtitle,.row-subtitle,.row-title{pointer-events:none;position:relative}.row-midtitle{font-size:14px;font-size:var(--font-size-14);margin-top:.125rem;order:1}[dir=ltr] .row-with-padding{padding-left:4.5rem}[dir=rtl] .row-with-padding{padding-right:4.5rem}@media only screen and (max-width:600px){[dir=ltr] .row-with-padding{padding-left:4rem}[dir=rtl] .row-with-padding{padding-right:4rem}}[dir=ltr] .row-with-padding.tgico:before{left:1rem}[dir=rtl] .row-with-padding.tgico:before{right:1rem}.row-with-padding.tgico:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);z-index:1}.row-with-padding:not(.row-with-icon):before{display:none}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}[dir=ltr] .row-sortable .row-subtitle,[dir=ltr] .row-sortable .row-title{padding-right:2.5rem}[dir=rtl] .row-sortable .row-subtitle,[dir=rtl] .row-sortable .row-title{padding-left:2.5rem}[dir=ltr] .row-sortable-icon{right:.75rem}[dir=rtl] .row-sortable-icon{left:.75rem}.row-sortable-icon{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;height:1.5rem;line-height:1;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.row-sortable.cant-sort .row-sortable-icon{display:none}.row-sortable.is-dragging{background-color:#fff!important;background-color:var(--surface-color)!important}.row-sortable.is-dragging{z-index:1}html.no-touch .row-sortable.is-dragging:active,html.no-touch .row-sortable.is-dragging:hover{background-color:#f4f4f4!important;background-color:var(--light-filled-secondary-text-color)!important}body.animation-level-2 .is-reordering .row-sortable{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{padding-left:3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{padding-right:3.375rem}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{margin-left:-3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{margin-right:-3.375rem}.row .checkbox-field,.row .radio-field,.row .radio-field:not(.radio-field-right) .radio-field-main{position:static}.row .checkbox-field,.row .radio-field{--offset-left:1rem}.row .radio-field{margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field{margin-right:0}[dir=rtl] .row .checkbox-field{margin-left:0}.row .checkbox-field{height:auto;margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field .checkbox-caption{padding-left:0}[dir=rtl] .row .checkbox-field .checkbox-caption{padding-right:0}.row .checkbox-field .checkbox-caption{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row .checkbox-field-toggle{margin-left:.125rem;margin-right:.125rem;padding:0}.row-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;font-size:14px!important;font-size:var(--font-size-14)!important}.row-subtitle{line-height:18px;line-height:var(--line-height-14);margin-top:.1875rem}.row-subtitle:empty{display:none}[dir=ltr] .row-media{left:.75rem}[dir=rtl] .row-media{right:.75rem}.row-media{height:2.25rem!important;margin:0!important;position:absolute!important;width:2.25rem!important}.row-media{align-items:center;display:flex;justify-content:center;pointer-events:none}[dir=ltr] .row-media-small{left:.75rem!important}[dir=rtl] .row-media-small{right:.75rem!important}.row-media-small{height:2rem!important;width:2rem!important}[dir=ltr] .row-media-abitbigger{left:.75rem!important}[dir=rtl] .row-media-abitbigger{right:.75rem!important}.row-media-abitbigger{height:2.625rem!important;width:2.625rem!important}[dir=ltr] .row-media-big{left:.5rem!important}[dir=rtl] .row-media-big{right:.5rem!important}.row-media-big{height:3rem!important;width:3rem!important}[dir=ltr] .row-media-bigger{left:.5625rem!important}[dir=rtl] .row-media-bigger{right:.5625rem!important}.row-media-bigger{height:3.375rem!important;width:3.375rem!important}.row.menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}[dir=ltr] .row>.btn-primary{right:1rem}[dir=rtl] .row>.btn-primary{left:1rem}.row>.btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding-left:.75rem;padding-right:.75rem;position:absolute;top:50%;transform:translateY(-50%);width:auto}body.animation-level-2 .row>.btn-primary{transition:width .2s,background-color .2s,color .2s}.row>.btn-primary.active{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important}.row>.btn-primary.active{color:#3390ec;color:var(--primary-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:380px}.color-picker-box{height:198px;width:100%}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible!important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{display:flex!important;padding:0!important;position:absolute!important;width:26.25rem!important}.reply-keyboard{background:#fff;background:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);flex-direction:column;max-height:26.25rem;max-width:100%;opacity:0;overflow:hidden;right:0;transform:scale(0);transform-origin:bottom right;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);z-index:3}@media only screen and (max-height:569px),only screen and (max-width:600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{background-color:transparent;border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:.375rem;color:#3390ec;color:var(--primary-color);font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);height:3rem;text-align:center;width:100%}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:active,html.no-touch .reply-keyboard-button:hover{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.reply-keyboard .scrollable-y{padding:.625rem!important}.reply-keyboard .scrollable-y{bottom:auto;height:auto;left:auto;max-height:100%;position:relative;right:auto;top:auto}.peoplenearby-container div.text.nearby-description{color:#000;color:var(--primary-text-color);margin-top:15px;text-align:center}.peoplenearby-container div.text.nearby-error{color:#aaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{align-items:center;display:flex;justify-content:center;min-height:140px;width:100%}.peoplenearby-container .locating-animation-container .tgico.tgico-location{align-items:center;background:#3d9de0;background:var(--avatar-color-bottom);border-radius:50%;display:flex;height:140px;justify-content:center;padding:50px;width:140px}.peoplenearby-container .locating-animation-container .tgico.tgico-location:before{color:#fff;font-size:58px}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{animation:waves-animation 3s infinite;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:50px;margin-left:36px;width:50px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{animation:waves-animation 5s infinite;animation-delay:2s;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:71px;margin-left:51px;margin-top:1px;width:66px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px!important}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px!important}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{transform:rotateY(180deg)}@keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}.spoiler{--anim:.4s ease;background-color:#e3e5e8;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}.spoilers-container .custom-emoji-canvas{z-index:-1}.spoilers-container.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.spoilers-container.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim)}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler-text{opacity:1}.spoilers-container:not(.is-spoiler-visible) .spoiler{cursor:pointer}.spoilers-container:not(.is-spoiler-visible) .spoiler-text{pointer-events:none}.emoji-animation,.emoji-animation-container{pointer-events:none;position:absolute}.emoji-animation-container{bottom:0;left:0;overflow:hidden;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:inline;display:initial}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction,.reaction-sticker{align-items:center;display:flex}.reaction-sticker{--custom-emoji-size:var(--reaction-size);height:var(--reaction-size);justify-content:center;position:relative;width:var(--reaction-size)}.reaction-sticker-activate{bottom:var(--reaction-offset);left:var(--reaction-offset);position:absolute;right:var(--reaction-offset);top:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{height:var(--size)!important;width:var(--size)!important}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto}.reaction-sticker.is-custom{border-radius:.3125rem}.reaction-sticker.is-custom .custom-emoji,.reaction-sticker.is-custom .media-sticker{border-radius:inherit}.reaction-sticker.is-custom .custom-emoji-canvas{z-index:auto}.reaction-inline{--reaction-size:.875rem;--reaction-offset:-.4375rem;min-height:var(--reaction-size);min-width:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit!important;margin-right:.0625rem!important}.reaction-inline .reaction-counter{order:-1}.reaction-block{--additional-height:.5rem;--margin:.375rem;--reaction-size:1.375rem;--reaction-offset:-.5625rem;--background-color:var(--message-highlightning-color);--chosen-background-color:var(--message-primary-color);--counter-color:#fff;--reaction-total-size:calc(var(--reaction-size) + var(--additional-height));background-color:#f4f4f5;background-color:var(--background-color);border-radius:var(--reaction-total-size);color:var(--counter-color);cursor:pointer;height:var(--reaction-total-size);margin-right:var(--margin);margin-top:var(--margin);padding:0 .5rem;position:relative}html.no-touch .reaction-block:active:after,html.no-touch .reaction-block:hover:after{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;opacity:.08;position:absolute;right:0;top:0}.reaction-block .reaction-counter,.reaction-block .reaction-sticker{z-index:1}.reaction-block:last-child{margin-right:0}.reaction-block:before{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;opacity:0;position:absolute;right:0;top:0;transform:scale(0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scale(1)}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color:var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color .3s cubic-bezier(.4,0,.2,1);transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color .3s cubic-bezier(.4,0,.2,1);transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color:transparent;--border-size:.125rem;--margin-right:-.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem!important}.reaction-block .reaction-counter{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin:0 .0625rem 0 .375rem;position:relative}.stacked-avatars{--border-color:var(--surface-color);--border-size:1px;--margin-right:-.3125rem;--avatar-size:1rem;--avatar-total-size:calc(var(--avatar-size) + var(--border-size)*2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{height:var(--avatar-size);width:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{align-items:center;border:var(--border-size) solid var(--border-color);border-radius:50%;display:flex;height:var(--avatar-total-size);justify-content:center;position:relative;width:var(--avatar-total-size)}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.sticker-viewer{align-items:center;bottom:0;display:flex;justify-content:center;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:4}.sticker-viewer:before{background-color:rgba(0,0,0,.6);bottom:0;content:\" \";left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .sticker-viewer:before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.sticker-viewer.is-visible:not(.backwards):before{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards):before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .emoji-animation,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .emoji-animation,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker:not(.is-overflow){transition:opacity 0s}.sticker-viewer-transformer{--translateX:0;align-items:center;display:flex;height:360px;justify-content:center;position:absolute;width:360px}.sticker-viewer-transformer.has-effect{height:280px;width:280px}.sticker-viewer-transformer.has-effect .sticker-viewer-emoji{top:-5.5rem}body.animation-level-2 .sticker-viewer-transformer{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-out)}.sticker-viewer-transformer.is-switching{opacity:1!important;transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer-transformer.is-switching{transition:transform .2s cubic-bezier(.12,1.1,.56,1.2),opacity .2s cubic-bezier(.12,1.1,.56,1.2)!important;transition:transform var(--sticker-viewer-switch-transition),opacity var(--sticker-viewer-switch-transition)!important}.sticker-viewer-transformer.is-switching:not(.backwards){opacity:0!important;transform:scale(.4) translateX(var(--translateX))!important}.sticker-viewer-emoji{position:absolute;top:-3rem;transform:translateX(var(--translateX)) scale(2)}.sticker-viewer-sticker{position:absolute}.sticker-viewer .emoji-animation,.sticker-viewer-emoji,.sticker-viewer-sticker{opacity:0}body.animation-level-2 .sticker-viewer .emoji-animation,body.animation-level-2 .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.custom-emoji{height:1.25rem!important;height:var(--custom-emoji-size)!important;min-height:1.25rem!important;min-height:var(--custom-emoji-size)!important;min-width:1.25rem!important;min-width:var(--custom-emoji-size)!important;width:1.25rem!important;width:var(--custom-emoji-size)!important}.custom-emoji{display:inline;position:relative}.custom-emoji:before{content:\" \";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.custom-emoji .media-sticker,.custom-emoji .rlottie{height:inherit!important;max-height:inherit!important;max-width:inherit!important;width:inherit!important}.custom-emoji .media-sticker,.custom-emoji .rlottie{margin:0;pointer-events:none;text-indent:-9999px}.custom-emoji-canvas{height:100%;width:100%}.custom-emoji-canvas,.custom-emoji-renderer{bottom:0;left:0;position:absolute;right:0;top:0}.custom-emoji-renderer{pointer-events:none}.custom-emoji-placeholder{display:inline;height:20px;height:var(--messages-custom-emoji-size);margin-top:-.125rem;vertical-align:middle;width:20px;width:var(--messages-custom-emoji-size)}.usernames-username-icon{background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:50%;color:#fff;font-size:1.25rem}.usernames-username-icon:before{content:\"\"}.usernames-username.active .usernames-username-status{color:#3390ec!important;color:var(--primary-color)!important}.usernames-username.active .usernames-username-icon{background-color:#3390ec;background-color:var(--primary-color)}.topics-slider{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0}.topics-container{background-color:#fff!important;background-color:var(--surface-color)!important;width:var(--width)!important}.topics-container{--offset:0;--width:100%}.topics-container.is-floating{overflow:visible!important;overflow:initial!important}.topics-container.is-floating{--offset:5.0625rem;--width:calc(var(--left-column-width) - var(--offset));border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);bottom:0;pointer-events:all;position:absolute;right:0;top:0;transform:translateX(var(--width));z-index:3}.topics-container.is-visible:not(.backwards){transform:translateX(0)}.topics-container.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.topics-container.is-visible.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.topics-container .sidebar-header{padding:0 .75rem}.topics-container .sidebar-header__rows{flex:1 1 auto;overflow:hidden;padding-left:.5rem}.topics-container .sidebar-header__rows .sidebar-header__title{padding-left:0!important}.topics-container .sidebar-header__rows .sidebar-header__title{font-size:16px;font-size:var(--font-size-16);line-height:21px;line-height:var(--line-height-16);margin-bottom:.125rem}.topics-container .sidebar-header__subtitle,.topics-container .sidebar-header__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topics-container .sidebar-header__subtitle{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14)}.topics-container .chatlist-chat{min-height:4rem;padding-left:.75rem}.topic-name .topic-icon{margin-right:.25rem}.topic-name-button{text-decoration:none!important}.topic-name-button{--color:var(--primary-color);align-items:center;color:var(--color);cursor:pointer;display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:1.5rem;justify-content:center;max-width:100%;padding:0 .5rem;position:relative}.topic-name-button-container{display:flex!important}.topic-name-button-container{align-items:flex-start;justify-content:flex-start}.topic-name-button .peer-title,.topic-name-button .topic-name{position:relative}.topic-name-button:before{background-color:var(--color);border-radius:1.5rem;bottom:0;content:\" \";left:0;opacity:.08;position:absolute;right:0;top:0}html.no-touch .topic-name-button:active:before,html.no-touch .topic-name-button:hover:before{opacity:.16}.topic-icon{line-height:1.875!important}.topic-icon{--size:1.25rem;--custom-emoji-size:var(--size);display:inline-flex;font-size:calc(var(--size)/2);justify-content:center;position:relative;vertical-align:middle}.topic-icon-general{fill:#c4c9cc;fill:var(--secondary-color);height:var(--size);width:var(--size)}.topic-icon-svg{height:inherit;position:absolute;width:inherit}.topic-icon-content{position:relative}.edit-topic-container .scrollable-y{display:flex;flex-direction:column}.edit-topic-icon{position:absolute}.edit-topic-icon .topic-icon{--size:4rem}.edit-topic-icon-container{align-items:center;cursor:pointer;display:flex;height:100px;justify-content:center;margin:0 auto;position:relative;width:100px}.edit-topic-emoticons-container{flex:1 1 auto}.edit-topic-emoticons-container .sidebar-left-section{padding:0!important}.edit-topic-emoticons-container .sidebar-left-section{height:100%}.edit-topic-emoticons-container .emoji-padding{display:flex;flex-direction:column}.edit-topic-emoticons-container .super-emoji-topic-icon .topic-icon{--size:var(--esg-emoji-size);--custom-emoji-size:inherit;margin-left:calc((var(--custom-emoji-size) - var(--esg-emoji-size))/2)}.popup{position:fixed!important}.popup{background-color:rgba(0,0,0,.3);bottom:0;box-shadow:none;display:flex;left:0;margin:0;max-width:none;opacity:0;overflow:auto;padding:1.875rem;right:0;top:0;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-property:opacity,visibility;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:var(--popup-transition-function);-webkit-user-select:none;-moz-user-select:none;user-select:none;visibility:hidden;z-index:3}.popup.no-overlay{background-color:transparent;overflow:visible;padding:0}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;transition-delay:0s,0s;visibility:visible;z-index:4}.popup.active .popup-container,.popup.hiding .popup-container{transform:translate3d(var(--translateX),0,0)}[dir=ltr] .popup-title{padding-left:1.5rem;padding-right:1rem}[dir=rtl] .popup-title{padding-left:1rem;padding-right:1.5rem}.popup-title{flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1;margin:0}.popup-title:first-child{padding-left:0}.popup-container{--translateX:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;margin:auto;overflow:hidden;padding:1rem;position:relative;transform:translate3d(var(--translateX),3rem,0);transition:transform .15s cubic-bezier(.4,0,.2,1);transition:transform var(--popup-transition-time) var(--popup-transition-function)}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-centerer{margin:auto}.popup-close{flex:0 0 auto;justify-self:center;z-index:3}.popup-header{align-items:center;display:flex;flex:0 0 auto;margin-bottom:2rem;position:relative}.popup-body{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{align-items:center;display:flex;flex-direction:row-reverse;height:3rem;justify-content:flex-start;padding:0 .5rem}.popup-buttons .btn{border-radius:10px;font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;max-width:100%;overflow:hidden;padding:0 1rem;position:relative;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}[dir=ltr] .popup-buttons .btn+.btn{margin-right:.625rem}[dir=rtl] .popup-buttons .btn+.btn{margin-left:.625rem}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{bottom:20px;position:absolute;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}[dir=ltr] .popup-avatar h6{text-align:left}[dir=rtl] .popup-avatar h6{text-align:right}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem}.popup-avatar .crop{border-radius:8px;max-height:100%;max-width:100%;padding:24px 54px 46px 46px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{max-height:100%;max-width:420px;padding:12px 20px 32.5px;width:420px}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{align-items:center;flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{border-radius:10px;font-size:14px;font-size:var(--font-size-14);height:2.25rem;line-height:2.25rem;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-photo{border-radius:10px;max-width:380px;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{flex:0 0 auto;margin-top:25px;width:100%}.popup-new-media .input-field-input{border-radius:10px;font-size:1rem}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{top:calc(100% + .25rem);z-index:4}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{border-radius:inherit;overflow:hidden;position:relative}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{cursor:default;height:4.5rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{font-weight:400;line-height:1.5;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{font-size:16px;font-weight:400;height:48px;letter-spacing:0;line-height:11px;width:48px}.popup-create-contact .name-fields{display:flex;flex-direction:column;margin-top:1rem;padding-left:116px;position:relative}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{left:0;position:absolute;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{align-items:center;display:flex;height:2.5rem;margin:0;padding:0 1rem}.popup-peer .popup-container{max-width:min(400px,100%);min-width:min(100%,17.5rem);padding:.75rem .5rem}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.popup-peer .popup-title:not(:first-child){padding-left:1rem}.popup-peer .popup-description{line-height:1.3125;line-height:var(--line-height);margin-bottom:0;margin-top:0;max-width:-moz-fit-content;max-width:fit-content;min-width:min(100%,15rem);overflow:hidden;padding:.625rem 1rem .5rem;text-overflow:ellipsis;word-break:break-word}.popup-peer .checkbox-field{align-items:center;display:flex;height:3rem;margin:0;padding:0 1.125rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-stickers .sticker-set-footer{color:#3390ec;color:var(--primary-color);text-align:center}.popup-stickers .sticker-set-footer .btn-primary{height:44px;line-height:44px;padding:0 1.0625rem;text-transform:uppercase;width:auto}.popup-stickers .scrollable.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .super-emojis{padding:0 .5rem}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}[dir=ltr] .popup-stickers .popup-close{margin-left:1rem}[dir=rtl] .popup-stickers .popup-close{margin-right:1rem}.popup-stickers .popup-close{font-size:1.5rem}.popup-stickers .popup-header{flex:0 0 auto;margin:.625rem 0}.popup-stickers .sticker-set{margin:.0625rem 0}.popup-stickers .sticker-set .row-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-stickers .sticker-set-stickers{--per-row:5;--item-size:var(--popup-sticker-size);display:grid;grid-template-columns:repeat(var(--per-row),1fr);padding:0 5px;position:relative}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{--per-row:4}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper{cursor:pointer;height:var(--item-size);justify-self:center;margin-bottom:2px;position:relative;width:var(--item-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers .media-sticker-wrapper{margin-bottom:8px}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height:470px){.popup-date-picker .popup-container[data-lines=\"7\"]{top:19px}.popup-date-picker .popup-container[data-lines=\"5\"]{top:-19px}}.popup-date-picker .popup-header{margin-bottom:1.375rem;margin-left:6px;margin-top:4px}.popup-date-picker .popup-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .popup-buttons{margin-right:-2px;order:2}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{align-items:center;display:flex;justify-content:space-between}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-next:disabled,.popup-date-picker .date-picker-prev:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-bottom:1.5rem;margin-top:7px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7,1fr);justify-content:center;width:100%}.popup-date-picker .date-picker-month .btn-icon{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:12px;height:38px;justify-content:center;justify-self:center;width:38px}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7!important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important}.popup-date-picker .date-picker-month .btn-icon.active{border-radius:50%;color:#fff;color:var(--badge-text-color)}.popup-schedule .popup-header{justify-content:space-between;margin-bottom:17px;margin-left:0;margin-top:5px}@media only screen and (max-width:600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;padding:4px 16px 16px;width:420px}@media only screen and (max-width:600px){.popup-schedule .popup-container{min-width:312px;padding:4px 14px 14px;width:312px}}.popup-schedule .popup-container[data-lines=\"5\"]{top:-16px}.popup-schedule .popup-container[data-lines=\"7\"]{top:16px}.popup-schedule .date-picker-month{margin-left:2px;margin-right:-20px;width:auto}@media only screen and (max-width:600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold);margin-left:-5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);height:36px;justify-self:auto;margin-top:-4px;width:36px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8!important}.popup-schedule .date-picker-month-day{color:#000!important;color:var(--primary-text-color)!important;font-size:14px!important}.popup-schedule .date-picker-month-day{font-weight:500;font-weight:var(--font-weight-bold)}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width:600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:400}@media only screen and (max-width:600px){.popup-schedule .btn-primary{widtH:280px;height:50px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px,100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main:before{left:.25rem}.popup-create-poll .radio-field .radio-field-main:after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{opacity:0!important}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{pointer-events:none}.popup-create-poll .input-field .btn-icon{opacity:1;position:absolute;right:.4375rem;top:.4375rem;transition:opacity .2s ease;z-index:1}@media only screen and (max-width:600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{font-size:.875rem;line-height:1.2;margin-top:.875rem}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{right:20px;top:54px}.popup-create-poll hr:not(.hide){display:block!important}.popup-forward .popup-container{height:40.625rem;max-height:min(40.625rem,100%);max-width:420px;padding:7px 0 0;width:420px}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:7px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.8125rem}}.popup-forward .popup-title{flex-grow:1;height:100%;padding:0}.popup-forward .chatlist-container,.popup-forward .selector{display:flex;flex:1 1 auto;flex-direction:row;height:auto;overflow:hidden;width:100%}.popup-forward .selector-search-input{font-size:20px;font-size:var(--font-size-20);height:100%;line-height:1;padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.1875rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{margin-bottom:0!important;padding-top:0!important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;pointer-events:none;text-align:center}.popup-instance-deactivated .header{color:#fff;font-size:2rem}.popup-instance-deactivated .subtitle{color:#fff;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height);opacity:.6}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.75rem 0 .25rem}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{height:100px;margin:0 auto;position:relative;width:100px}.popup-report-messages-confirm .popup-body{margin:1em -.5rem .375rem;overflow:visible;overflow:initial}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-call .popup-header{justify-content:space-between;width:100%}.popup-call .popup-title{flex:1 1 auto}.call{align-items:center;color:#fff;height:100%;width:100%}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state,.call.no-video .call-subtitle,.call.no-video .call-title,.call.no-video .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.show-controls .call-subtitle,.call.show-controls .call-title,.call.show-controls .popup-header{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{margin-right:1rem;transform:scale(1.3125)}.call-avatar{border-radius:inherit;bottom:0;left:0;opacity:.7;position:absolute;right:0;top:0;z-index:-1}.call-avatar .avatar-full{font-size:6rem}.call-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.call-subtitle{font-size:1rem}.call .popup-header,.call-emojis,.call-subtitle,.call-title{opacity:0}body.animation-level-2 .call .popup-header,body.animation-level-2 .call-emojis,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-title{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;pointer-events:none;position:absolute;z-index:1}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale:1}.call-buttons .call-button-container.hide-me{--scale:0!important}.call-buttons .call-button-container.hide-me{transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(-2.6875rem);transform:translateX(calc(var(--call-button-size)*-.5 + var(--call-button-margin)*-.5))}.call-buttons.is-second{--margin-length:2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(6.75rem + 2rem*var(--margin-length)));transform:translateX(calc(var(--call-button-size)*2 + var(--call-button-margin)*var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length:.656875}.call-button{background-color:hsla(0,0%,100%,.1)}.call-button-red{background-color:#df3f40!important;background-color:var(--danger-color)!important}.call-button-green{background-color:#5cc85e!important;background-color:var(--gc-green-text-color)!important}.call-button.active{background-color:#fff!important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{border-radius:inherit;height:100%;-o-object-fit:contain;object-fit:contain;opacity:1;position:absolute;width:100%}.call-video-container{align-items:center;background-color:#000;bottom:0;display:flex;left:0;position:absolute;right:0;top:0;z-index:-1}.call-video-container.small{border-radius:10px;bottom:8rem;cursor:pointer;left:auto;right:1rem;top:auto;z-index:1}.call-video-blur{border-radius:inherit;height:100%;opacity:.7;position:absolute;width:100%}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{align-items:center;bottom:7.625rem;bottom:calc(4.25rem + var(--call-button-size));display:flex;flex-direction:column;padding:0 1rem;pointer-events:none;position:absolute;width:100%;z-index:2}.call-party-state{align-items:center;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:hsla(0,0%,100%,.2);border-radius:1.625rem;color:#fff;display:flex;font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:1.625rem;line-height:1.625rem;margin-top:1rem;max-width:100%;opacity:0;padding:0 .625rem;transform:scale(0) translateY(0)}body.animation-level-2 .call-party-state{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{height:1.875rem!important;width:1.875rem!important}.call-party-state .rlottie-icon{flex:0 0 auto;margin-left:-.25rem;margin-right:.25rem}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(-6.5rem);transform:translateY(calc(var(--call-button-size)*-1 + var(--call-button-margin)*-1 + -1.125rem))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-left-radius:0;border-bottom-right-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin:1.25rem;height:100%;padding:0 .5rem;width:100%}.group-call:after{background:linear-gradient(180deg,rgba(33,33,33,0),rgba(33,33,33,.65) 48.54%,#212121);background:linear-gradient(180deg,rgba(33,33,33,0) 0,rgba(33,33,33,.65) 48.54%,var(--gc-background-color) 100%);bottom:0;content:\" \";height:7.5rem;left:0;position:absolute;right:0}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{color:inherit;flex:0 0 auto}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-header-subtitle,.group-call-header-title{font-size:16px;font-size:var(--font-size-16);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-header-subtitle{color:#aaa;color:var(--gc-secondary-text-color);font-size:.875rem}.group-call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;justify-content:space-between;position:absolute;z-index:1}.group-call-button{background-color:rgba(1,200,80,.2);background-color:var(--gc-button-unmuted-color);color:#fff;color:var(--gc-primary-text-color);opacity:1}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60,135,247,.2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223,68,184,.2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255,89,90,.3)!important;background-color:var(--gc-button-leave-color)!important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg,#00a3b4 12.94%,#00cb47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg,#4eabf8 14.73%,#3478f6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg,#df44b8 14.73%,#3851eb 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{padding-right:.5rem}.group-call-participant-status-icon{display:inline-block;font-size:1.125rem;height:1.125rem;line-height:1;margin-right:6px;vertical-align:middle;width:1.125rem}.group-call-participant-status-container{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant .dialog-subtitle,.group-call-participant .dialog-title{padding-right:2.5rem}.group-call-participant-muted-icon-container{position:absolute!important}.group-call-participant-muted-icon-container{right:.5rem}.group-call-participant-video-container{align-items:center;background-color:#000;border-radius:10px;cursor:pointer;display:flex;flex:1 1 auto;height:15rem;margin:.25rem;overflow:hidden;position:relative;width:100%;width:33%}.group-call-participant-video-container:after{background:linear-gradient(180deg,transparent 55.62%,rgba(0,0,0,.5) 86.46%);bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;height:1.25rem;width:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-header,.group-call-participant-video-info{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-header,body.animation-level-2 .group-call-participant-video-info{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-header,.group-call-participant-video-info{align-items:center;bottom:.25rem;display:flex;justify-content:space-between;left:0;padding:0 .5rem 0 .75rem;position:absolute;right:0;z-index:1}.group-call-participant-video-header{bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem;top:0}.group-call-participant-video-header .group-call-pin-icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-video-info .group-call-participant-status-container{margin-top:-1px;opacity:.6}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;height:2rem;margin-left:.75rem;width:2rem}.group-call-participant .is-speaking{color:#5cc85e;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;flex:1 1 auto;overflow:hidden}.group-call-participants-scrollable{border-radius:inherit;height:auto;padding-bottom:6rem;position:relative}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-.25rem -.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2),.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container{flex:1 0 auto;height:auto}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2):before,.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container:before{content:\" \";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-header,.group-call-participants-video-container.show-controls .group-call-participant-video-info{opacity:1}.group-call-participants .chatlist{background:none;margin:0 auto;max-width:600px;padding:0}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaa;color:var(--gc-secondary-text-color)}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{margin-bottom:.25rem;min-height:100%}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25%!important}.group-call-cfs,.group-call:not(.is-big-layout) .group-call-big-video-container,.group-call:not(.is-big-layout) .popup-body .group-call-header,.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width:17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover{background-color:hsla(207,4%,46%,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(-13.125rem);transform:translateX(calc(var(--gc-right-column-width)/-2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX:calc(var(--gc-right-column-width)/-2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{background-color:#212121;background-color:var(--gc-background-color);bottom:0;padding:inherit;position:absolute;right:-26.25rem;right:calc(var(--gc-right-column-width)*-1);top:0;width:26.25rem;width:var(--gc-right-column-width)}.group-call.is-big-layout .group-call-buttons{bottom:2.5rem;padding:.75rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-sponsored .scrollable-y{margin:0 -1.5rem;max-height:25rem;padding:.5rem 1.5rem;position:relative;-webkit-user-select:text;-moz-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-mute .popup-container{min-width:16rem}.popup-reacted-list{--size:1.5rem;--custom-emoji-size:var(--size)}.popup-reacted-list .popup-container{height:600px;max-height:600px;padding:0;width:25rem}.popup-reacted-list .popup-header{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);margin:0;min-height:3.5625rem;padding:.25rem .75rem .75rem}.popup-reacted-list .popup-close{height:40px;margin-right:.5rem;margin-top:.375rem;order:-1}.popup-reacted-list .reaction{--reaction-size:var(--size);--additional-height:.75rem;--margin:.5rem;--background-color:var(--light-filled-primary-color);--counter-color:var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color:#fff}.popup-reacted-list .reaction-sticker-icon{font-size:1.25rem!important}.popup-reacted-list .reaction-sticker-icon{align-items:center;display:flex;margin:0}.popup-reacted-list .sidebar-left-section{margin-bottom:0!important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:#fff;background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{display:flex;height:var(--size);position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:var(--size)}.popup-reacted-list .chatlist-chat{padding-right:3.25rem!important}.popup-payment .popup-container{border-radius:16px;max-height:min(100%,43.5rem);max-width:26.25rem;padding:0;width:26.25rem}.popup-payment .popup-header{height:3.5rem;margin:0;padding:0 1rem}.popup-payment.is-loading .popup-container{min-height:26.25rem}.popup-payment .scrollable{display:flex;flex:1 1 auto;flex-direction:column}.popup-payment hr{display:block!important;margin:.5rem 0!important;padding:0!important}.popup-payment .input-field{--height:3rem;margin:.75rem .5rem 0}.popup-payment .input-field-input{--padding:.75rem}.popup-payment .input-fields-row .input-field{margin-top:1.25rem}.popup-payment .sidebar-left-section{padding:0!important}.popup-payment .sidebar-left-section-name+.input-field,.popup-payment .sidebar-left-section-name+.input-fields-row .input-field{margin-top:.75rem}.popup-payment .sidebar-left-section .row{margin-top:.5rem}.popup-payment .sidebar-left-section-content{margin:0 .5rem!important}.popup-payment .select-wrapper{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);max-height:10rem}.popup-payment .select-wrapper li{grid-template-columns:calc(26px + 2rem) 1fr;height:3rem}.popup-payment .payment-verification{border:none;flex:1 1 auto;height:40rem;max-height:100%;width:100%}.popup-payment .row{border-radius:10px}.payment-item{padding:0 1.25rem;width:100%}.payment-item-details{display:flex;flex:0 0 auto;justify-content:space-between;margin-bottom:1rem;overflow:hidden}.payment-item-details:last-child{margin-bottom:0}.payment-item-details-photo{border-radius:10px;flex:0 0 auto;height:6.25rem;margin-right:1rem;width:6.25rem}.payment-item-details-photo .media-photo{border-radius:inherit}.payment-item-details-lines{display:flex;flex:1 1 auto;flex-direction:column}.payment-item-details-lines-title{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16)}.payment-item-details-lines-bot-name,.payment-item-details-lines-description{font-size:14px;font-size:var(--font-size-14);line-height:1.25rem}.payment-item-details-lines-bot-name{color:#707579;color:var(--secondary-text-color)}.payment-item-prices{display:flex;flex-direction:column;margin:1rem .25rem .5rem}.payment-item-prices-price{color:#707579;color:var(--secondary-text-color);display:flex;font-weight:500;justify-content:space-between;line-height:1.1875rem}.payment-item-prices-price+.payment-item-prices-price{margin-top:1.5rem}.payment-item-prices-price.is-total{color:#000;color:var(--primary-text-color)}.payment-item-tips{display:flex;justify-content:space-between;margin:.75rem -.5rem 1.5rem}.payment-item-tips-tip{--background-intensity:.1;background-color:rgba(84,190,97,var(--background-intensity));border-radius:1.25rem;color:#3ba748;flex:1 1 auto;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;line-height:2.5rem;text-align:center}body.animation-level-2 .payment-item-tips-tip{transition:color .1s ease-in-out,background-color .1s ease-in-out}.payment-item-tips-tip+.payment-item-tips-tip{margin-left:.5rem}html.no-touch .payment-item-tips-tip:not(.active):active,html.no-touch .payment-item-tips-tip:not(.active):hover{--background-intensity:.3}.payment-item-tips-tip.active{--background-intensity:1;color:#fff}.payment-item-tips-input{color:inherit!important;font-weight:inherit!important}.payment-item-tips-input{display:inline}.payment-item-row{margin:0 .5rem;padding-bottom:0;padding-top:0}.payment-item-method-row .media-photo{border-radius:10px}.payment-item-pay{flex:0 0 auto;height:3rem;margin:1rem;text-transform:uppercase;width:auto}.payment-item-preloader-container{flex:1 1 auto;position:relative}.popup-payment-shipping-methods .popup-container{min-height:auto}.popup-payment-shipping-methods .row{margin-top:0!important}.popup-payment-verification .popup-header:after{background-color:#dfe1e5;background-color:var(--border-color);bottom:-1px;content:\" \";height:1px;left:0;position:absolute;right:0}.popup-payment-card-confirmation .popup-container{min-height:auto}.popup-payment-card-confirmation .input-field-password{margin-top:.5rem!important}.popup-limit .popup-container{min-width:min(100%,22.5rem)}.popup-limit-line{align-items:center;display:flex;flex-direction:column;margin:.75rem 0}.popup-limit-hint{align-items:center;color:#fff;display:flex;font-weight:500;font-weight:var(--font-weight-bold);justify-content:center;transform:scale(.6) translate(-280px,16px) rotate(-30deg)}body.animation-level-2 .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.2)}.popup-limit-hint.active{transform:scale(1) translate(0) rotate(0)}.popup-limit-hint-icon{display:flex;font-size:1.25rem;margin-right:.25rem}.popup-limit-button.primary{color:#fff!important}.popup-limit-button.primary{align-items:center;background:linear-gradient(88.39deg,#6c93ff -2.56%,#976fff 51.27%,#df69d1 107.39%);display:flex}.popup-limit-button-icon{display:flex;font-size:1.5rem;margin-left:.625rem}.popup-limit .limit-line{align-self:stretch;margin:1rem .5rem 0}.popup-limit:not(.is-locked) .popup-limit-hint{background:linear-gradient(73.4deg,#6c93ff -7.21%,#976fff 114.57%,#df69d1 241.52%);background-size:200px 2rem;border-radius:1rem;height:2rem;padding:0 .75rem;position:relative}.popup-limit:not(.is-locked) .popup-limit-hint:after{background:inherit;background-position-x:calc(-50% - 86px);background-repeat:no-repeat;background-size:inherit;bottom:-9px;-webkit-clip-path:path(\"M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z\");clip-path:path(\"M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z\");content:\" \";display:block;height:9px;left:50%;margin-left:-13px;position:absolute;width:100%}.popup-limit.is-locked .popup-limit-hint{background-color:#3390ec;background-color:var(--primary-color);border-radius:1.375rem;height:2.75rem;margin-right:-.25rem;padding:0 1.25rem 0 1rem}.popup-limit.is-premium .popup-limit-hint{align-self:flex-end;background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);background-position-x:100%;background-size:200px 2rem;border-bottom-right-radius:0;margin-right:.5rem}body.animation-level-2 .popup-limit.is-premium .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.1)}.popup-limit.is-premium .popup-limit-hint:after{background-position-x:134%;bottom:-11.5px;-webkit-clip-path:path(\"M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z\");clip-path:path(\"M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z\");height:12px;left:100%;margin-left:-20.6px}#auth-pages{background:#fff;background:var(--surface-color);max-width:100%;overflow:hidden}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width:600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width:600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width:600px){#auth-pages .input-wrapper{margin-top:41px;padding:0 16px;width:100%}}#auth-pages .auth-image,#auth-pages .input-wrapper,#auth-pages .subtitle{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;margin:0 auto;max-width:720px;position:relative}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height:810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{margin:0 auto;max-width:720px;min-width:auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{display:flex;flex:1 1 auto;flex-direction:column;height:810px;padding:0;width:100%}@media screen and (max-height:810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width:600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-bottom:.5rem;margin-top:.5rem}.page-sign .auth-image,.page-signUp .auth-image{height:7.5rem;margin-bottom:1.5rem;width:7.5rem}@media only screen and (min-width:601px){.page-sign .auth-image,.page-signUp .auth-image{height:10rem;margin-bottom:1.5rem;width:10rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{fill:#3390ec;fill:var(--primary-color);max-height:100%;max-width:100%}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:400}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:visible!important;overflow:initial!important}.page-signQR .auth-image{height:240px!important;width:240px!important}.page-signQR .auth-image{align-items:center;display:flex;justify-content:center}.page-signQR .auth-image .preloader{left:auto;top:auto;transform:none}.page-signQR .auth-image .qr-canvas{height:100%;width:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem!important}.page-signQR h4{flex:0 0 auto}[dir=ltr] .page-signQR .qr-description{text-align:left}[dir=rtl] .page-signQR .qr-description{text-align:right}.page-signQR .qr-description{line-height:1.3125;line-height:var(--line-height);margin:1rem auto;max-width:480px}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-bottom:14px;margin-top:10px}@media only screen and (max-width:600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width:600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{align-items:center;display:flex;justify-content:center;margin:1.375rem 0 .875rem}.page-authCode .phone-wrapper h4[contenteditable]{border:none;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color);outline:none;padding:0 1rem}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40!important;border-color:var(--danger-color)!important}.page-authCode .phone-wrapper .phone{margin:0}.page-authCode .subtitle{margin:0 auto!important}.page-authCode .subtitle{max-width:300px}.page-chats{max-width:1682px!important}.page-chats{display:flex}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{height:100%;max-height:100%;min-height:100%;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.page-chats .main-column{display:flex!important}.page-chats .main-column{width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{display:flex!important}.page-chats #column-center{background-color:#e6ebee;width:100%}.page-chats #column-right{display:flex!important}.page-chats .main-column{height:100%;max-height:100%;min-height:100%;position:relative}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;height:100%;left:0;max-height:100%;overflow:hidden;position:absolute;top:0;width:100%;z-index:3}@media only screen and (min-width:1681px){.page-chats{border-color:#dfe1e5;border-color:var(--border-color);border-style:solid;border-width:0 1px}}.page-chats .avatar-edit{flex:0 0 auto;height:120px;margin:1rem auto 2rem;width:120px}body.animation-level-2 .page-chats .main-column{transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;overflow:hidden;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:100vh;height:calc(var(--vh, 1vh)*100)}}html.is-ios{-webkit-touch-callout:none;position:fixed;-webkit-user-select:none}html.no-backdrop{--menu-background-color:var(--surface-color);--menu-backdrop-filter:none}@supports(padding:max(0px)){html{padding:0 min(16px,env(safe-area-inset-right)) 0 min(16px,env(safe-area-inset-left))}}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:16px}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,html,input,optgroup,select,textarea{font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}a,button,div,input,select,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}code,kbd,pre,samp{font-family:Roboto Mono,monospace;font-family:var(--font-monospace)}.whole{height:100%;margin:0 auto;max-width:1680px;min-height:100%;width:100%}@media only screen and (min-width:601px){.only-handhelds{display:none!important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500;font-weight:var(--font-weight-bold)}h4{font-size:2rem;line-height:110%;margin:22px 0 14px}@media only screen and (max-width:600px){h4{font-size:20px;margin:2px 0 8px}}[contenteditable=true],input{background-color:transparent;caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color)}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{position:absolute;right:0;visibility:hidden}input:-webkit-autofill:first-line{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial;font-size:16px}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40!important;color:var(--danger-color)!important}.danger .c-ripple__circle{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec!important;color:var(--primary-color)!important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.primary-text{color:#000!important;color:var(--primary-text-color)!important}.color-premium{-webkit-text-fill-color:transparent;background:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%);background:var(--premium-gradient);-webkit-background-clip:text}.blue:before,.danger:before,.primary:before{color:inherit!important}.bg-warning{background:#fed85a!important}.contextmenu{bottom:auto!important;position:fixed!important;right:auto!important;width:auto!important;z-index:4!important}.preloader{height:50px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:50px}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:min(30rem,calc(100vw - 2rem));opacity:0;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast.is-visible{opacity:1}body.animation-level-2 .toast{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.toast b{color:inherit}.toast a{color:#60a5e9!important}.toast a{cursor:pointer}hr{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}b{font-weight:500;font-weight:var(--font-weight-bold)}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit.is-forum{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}.avatar-edit-canvas{background:linear-gradient(#69bffa,#3d9de0);background:linear-gradient(var(--avatar-color-top),var(--avatar-color-bottom));height:100%;max-height:100%;max-width:100%;width:100%}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{color:#fff;font-size:3rem;height:3rem;left:50%;line-height:1;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);width:3rem;z-index:2}.avatar-edit .avatar-placeholder{filter:brightness(.7);height:100%;left:0;position:absolute;top:0;width:100%}.missing-icon{height:1.5rem;width:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;left:0;max-height:23.5rem;opacity:0;overflow:hidden;position:absolute;top:calc(100% + .5rem);transform:scale(.95);transform-origin:top center;transition:opacity .2s ease-out,transform .2s ease-out;width:100%;z-index:3}.select-wrapper.active{opacity:1;transform:scale(1)}.select-wrapper ul{margin:.5rem 0}[dir=ltr] .select-wrapper li{text-align:left}[dir=rtl] .select-wrapper li{text-align:right}.select-wrapper li{align-items:center;cursor:pointer;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px;height:3.5rem;justify-content:space-between;padding:0 1rem}html.no-touch .select-wrapper li:active,html.no-touch .select-wrapper li:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{font-size:26px;height:26px;line-height:1;width:26px}.select-wrapper .scrollable{position:relative}[dir=ltr] .phone-code{text-align:right}[dir=rtl] .phone-code{text-align:left}.phone-code{color:#9e9e9e}.auth-image{height:166px;margin:0 auto 18px;position:relative;width:166px}@media only screen and (max-width:600px){.auth-image{height:120px;width:120px}}[dir=ltr] .phone-edit{margin-left:.4rem}[dir=rtl] .phone-edit{margin-right:.4rem}.phone-edit{cursor:pointer;font-size:1.5rem;height:1.5rem;line-height:1;opacity:.5;transition:opacity .2s;width:1.5rem}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!important;line-height:1!important;vertical-align:baseline!important;vertical-align:initial!important}span.emoji{font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol}@media not screen and (-webkit-min-device-pixel-ratio:2),not screen and (min-device-pixel-ratio:2),not screen and (min-resolution:192dpi),not screen and (min-resolution:2dppx){html[dir=ltr]:not(.is-safari) span.emoji{margin-right:5px!important}html[dir=rtl]:not(.is-safari) span.emoji{margin-left:5px!important}html[dir=ltr]:not(.is-safari) avatar-element span.emoji{margin-right:0!important}html[dir=rtl]:not(.is-safari) avatar-element span.emoji{margin-left:0!important}}img.emoji{display:inline-block;height:18px;max-height:100%;max-width:100%;vertical-align:middle;width:18px}[contenteditable=true]{cursor:text;outline:none;-webkit-user-select:text;-moz-user-select:text;user-select:text;white-space:pre-wrap}[contenteditable=true] .custom-emoji{display:inline-block;margin-bottom:-2px}[contenteditable=true] .custom-emoji:before{content:none}[contenteditable=true] [style*=markup]{font-family:inherit!important}[contenteditable=true] [style*=bold]{font-weight:700}[contenteditable=true] [style*=italic]{font-style:italic}[contenteditable=true] [style*=underline]{text-decoration-line:underline}[contenteditable=true] [style*=strikethrough]{text-decoration-line:line-through}[contenteditable=true] [style*=underline][style*=strikethrough]{text-decoration-line:underline line-through}[contenteditable=true] [style*=monospace]{font-family:Roboto Mono,monospace!important;font-family:var(--font-monospace)!important}[contenteditable=true] [style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color)}[contenteditable][data-placeholder]:before{color:#a2acb4;content:attr(data-placeholder);display:block;opacity:0;pointer-events:none;position:absolute}body.animation-level-2 [contenteditable][data-placeholder]:before{transform:translateX(1.75rem);transition:opacity .2s ease-out .01s,transform .2s ease-out .01s;transition:opacity var(--input-transition) .01s,transform var(--input-transition) .01s}[contenteditable][data-placeholder]:empty:before{opacity:1}body.animation-level-2 [contenteditable][data-placeholder]:empty:before{transform:translateX(0)}.sticky_sentinel{left:0;pointer-events:none;position:absolute;right:0;visibility:hidden}.super-stickers{display:grid;grid-template-columns:repeat(auto-fill,72px);grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}html.no-touch .super-sticker:active,html.no-touch .super-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){[dir=ltr] .show-more{padding-left:8px}[dir=rtl] .show-more{padding-right:8px}}[dir=ltr] .show-more .tgico-down{padding-left:1rem;padding-right:2rem}[dir=rtl] .show-more .tgico-down{padding-left:2rem;padding-right:1rem}.show-more .tgico-down{float:left;font-size:24px}.content-empty,.show-more .tgico-down{color:#707579;color:var(--secondary-text-color)}::-moz-selection{background:rgba(51,144,236,.4);background:var(--selection-background-color)}.selection:after,::selection{background:rgba(51,144,236,.4);background:var(--selection-background-color)}.selection:after{bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.input-something{display:inline-block}.input-selectable{position:relative}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{grid-gap:.25rem;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);width:100%}.grid-item{cursor:pointer;height:0;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-item-media{height:100%;left:0;-o-object-fit:cover;object-fit:cover;position:absolute;top:0;width:100%}.animated-super-row{--translateY:100%;bottom:0;left:0;position:absolute;right:0;top:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0,calc(var(--translateY)*-1),0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0,var(--translateY),0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{bottom:0;left:0;position:absolute;right:0;top:0}middle-ellipsis-element{display:block;overflow:hidden;width:100%}.album-item-media{height:100%;width:100%}html.no-touch .hover-effect:active,html.no-touch .hover-effect:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.progress-ring{left:0;pointer-events:none;position:absolute;top:0}.progress-ring__circle{stroke-linecap:round;transition:stroke-dashoffset}.rlottie,.rlottie-vector{bottom:0;height:100%;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0;width:100%}.rlottie-icon{pointer-events:none;position:relative}body.animation-level-2 .rlottie.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.canvas-thumbnail{height:100%;position:absolute;width:100%}.media-container-contain{position:relative}.media-container-contain .media-photo{max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain}.media-container-cover{position:relative}.media-container-cover .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.media-photo,.media-poster,.media-round,.media-sticker,.media-video{bottom:0;left:0;position:absolute;right:0;top:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-poster.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-video.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-poster.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-video.fade-out{animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{height:100%;margin:auto;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;width:100%}.media-sticker-wrapper.is-premium-sticker:before{align-items:center;background:rgba(0,0,0,.2);background-image:var(--lock-url);background-repeat:no-repeat;background-size:cover;border-radius:50%;bottom:.125rem;color:#fff;display:flex;height:1.25rem;justify-content:center;left:50%;position:absolute;transform:translateX(-50%);width:1.25rem;z-index:1}body.is-premium .media-sticker-wrapper.is-premium-sticker:after,body.is-premium .media-sticker-wrapper.is-premium-sticker:before{content:none}.media-round{max-height:280px;max-height:var(--round-video-size);max-width:280px;max-width:var(--round-video-size);z-index:1}.media-round canvas{border-radius:50%;height:100%;position:relative;width:100%}.media-round .video-time{background-color:rgba(109,141,65,.4)!important;background-color:var(--message-highlightning-color)!important}.media-round .video-time{padding:0 .375rem}[dir=ltr] .media-round .video-time:after,[dir=ltr] .media-round .video-time:before{margin-left:.25rem}[dir=rtl] .media-round .video-time:after,[dir=rtl] .media-round .video-time:before{margin-right:.25rem}.media-round.is-unread .video-time:before{background-color:#fff;border-radius:50%;content:\" \";height:.5rem;order:1;width:.5rem}.media-round.is-paused .video-time:after{align-items:center;content:\"\";display:flex;font-size:1.125rem;order:2}.gradient-delimiter{background-color:#f4f4f5;background-color:var(--background-color-true);height:.75rem;position:relative;width:100%}.gradient-delimiter:before{background:linear-gradient(180deg,rgba(0,0,0,.06),transparent 20%,transparent 94%,rgba(0,0,0,.06));bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.sidebar-left-section{padding:.5rem 0!important}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);box-shadow:0 1px 3px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 var(--section-box-shadow-color);margin-bottom:.75rem}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{padding:0 1rem}}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-left-section-container a{cursor:pointer}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important}.tgico-admin:before,.tgico-fontsize:before{padding:2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px!important}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.navigable-list .active{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{--esg-emoji-total-size:calc(var(--esg-emoji-size) + 0.5rem);--custom-emoji-size:var(--esg-emoji-size);grid-column-gap:2.44px;--esg-emoji-size:2.125rem;--esg-emoji-total-size:2.625rem;--custom-emoji-size:2.25rem;-moz-column-gap:2.44px;column-gap:2.44px;-moz-column-gap:.25rem;column-gap:.25rem;display:grid;font-size:var(--esg-emoji-size);grid-template-columns:repeat(auto-fill,var(--esg-emoji-total-size));justify-content:space-between;line-height:var(--esg-emoji-size);position:relative}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:var(--esg-emoji-total-size);line-height:inherit;margin-left:.0625rem;margin-right:.0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:var(--esg-emoji-total-size)}.super-emojis .super-emoji .emoji-placeholder{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;height:1.75rem;left:7px;pointer-events:none;position:absolute;top:7px;width:1.75rem}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{height:100%;margin:0;vertical-align:baseline;vertical-align:initial;width:100%}.super-emojis .super-emoji.active,html.no-touch .super-emojis .super-emoji:active,html.no-touch .super-emojis .super-emoji:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.super-emojis.not-local .super-emoji{padding:.1875rem}.super-emojis .super-emoji{margin:0}.super-emojis:not(.not-local) .super-emoji{overflow:hidden}html.native-emoji .super-emojis:not(.not-local) .super-emoji{padding-bottom:.3125rem;padding-top:.3125rem}.super-emojis .custom-emoji{display:block}.super-emojis .custom-emoji-renderer{z-index:1}.super-emojis .custom-emoji:before{content:none}.tgico-char:before{font-family:Roboto!important}.tgico-char:before{font-weight:500;font-weight:var(--font-weight-bold);text-align:center;width:1.5rem}.tgico-char.z:before{content:\"Z\"}.tgico-char.w:before{content:\"W\"}.sending-status:empty{display:none}.sending-status .tgico-sendingerror{color:#df3f40;color:var(--danger-color)}.sending-status-icon{line-height:1!important}.sending-status-icon{position:absolute}.quick-reaction-title{align-items:center;display:flex}.quick-reaction-sticker{height:32px!important;margin:0 .5rem 0 0!important;position:relative!important;width:32px!important}.verified-icon-svg{height:1rem;width:1rem}.verified-icon-check{fill:#fff}.verified-icon-background{fill:#3390ec;fill:var(--primary-color)}[dir=ltr] .emoji-status,[dir=ltr] .premium-icon,[dir=ltr] .verified-icon{margin-left:.125rem}[dir=rtl] .emoji-status,[dir=rtl] .premium-icon,[dir=rtl] .verified-icon{margin-right:.125rem}.emoji-status,.premium-icon,.verified-icon{align-items:center;display:flex;flex:0 0 auto;font-size:1rem;height:1.25rem;justify-content:center;width:1.25rem}[dir=ltr] .emoji-status{margin-left:.25rem}[dir=rtl] .emoji-status{margin-right:.25rem}.emoji-status{height:1.125rem;position:relative;width:1.125rem}.premium-icon{color:#3390ec;color:var(--primary-color);margin-top:-.0625rem}.badge-fake{line-height:1!important}.badge-fake{border:1px solid #df3f40;border:1px solid var(--danger-color);border-radius:.185rem;color:#df3f40;color:var(--danger-color);flex:0 0 auto;font-size:.625rem;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.25rem;margin-right:.25rem;padding:.125rem .25rem}.peer-title.with-icons{align-items:center;display:flex;overflow:hidden}.peer-title-inner{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.limit-line{display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:2rem}.limit-line-free{color:#000}.limit-line-premium{color:#fff}.limit-line-free{background-color:#f1f3f5;border-bottom-left-radius:10px;border-top-left-radius:10px}.limit-line-premium{background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);border-bottom-right-radius:10px;border-top-right-radius:10px}.limit-line-free,.limit-line-premium{align-items:center;display:flex;flex:1 1 0;justify-content:space-between;padding:0 .75rem}.movable-element{--size:.5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{cursor:row-resize;height:var(--size);left:0;right:0}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{bottom:0;cursor:col-resize;top:0;width:var(--size)}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-sw{height:var(--size);width:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se{cursor:nwse-resize}.movable-element-resize-handler-side-ne{right:0;top:0}.movable-element-resize-handler-side-se{bottom:0;right:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{left:0;top:0}[dir=ltr] .chatlist-chat.row-with-padding{padding-left:4.5rem!important}[dir=rtl] .chatlist-chat.row-with-padding{padding-right:4.5rem!important}.chatlist-chat span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist-chat .row-title{font-size:16px!important;font-size:var(--font-size-16)!important}.chatlist-chat .row-title{line-height:1.375rem}.chatlist-chat .row-title-right-secondary{font-size:12px!important;font-size:var(--font-size-12)!important;line-height:16px!important;line-height:var(--line-height-12)!important}.chatlist-chat .row-title-right-secondary{margin-top:-.4375rem}.chatlist-chat .row-subtitle{display:block!important}.chatlist-chat .row-row{height:1.375rem}.chatlist-chat.chatlist-chat-abitbigger .row-subtitle{margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle{font-size:16px!important;font-size:var(--font-size-16)!important}.chatlist-chat.chatlist-chat-bigger .row-subtitle{line-height:1.375rem;margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle-row{margin-top:.125rem}.chatlist-chat.chatlist-chat-bigger .row-title .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.username-purchase-help b{color:#df3f40!important;color:var(--danger-color)!important;font-weight:400!important;font-weight:var(--font-weight-normal)!important}.media-spoiler-container{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.media-spoiler-container.is-revealing{opacity:1}.media-spoiler-container.is-revealing:not(.backwards){opacity:0}.media-spoiler-container.is-revealing.animating{transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}.media-spoiler .canvas-thumbnail,.media-spoiler-thumbnail{-o-object-fit:initial!important;object-fit:fill!important}.media-spoiler .canvas-thumbnail,.media-spoiler-thumbnail{height:100%;position:absolute;width:100%}"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.8b794e152e99613b8f6c.css b/public/main.8b794e152e99613b8f6c.css new file mode 100644 index 000000000..7b51c52c3 --- /dev/null +++ b/public/main.8b794e152e99613b8f6c.css @@ -0,0 +1,4 @@ +/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{-webkit-text-decoration-skip:objects;background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){list-style-type:none;padding-left:0}ul:not(.browser-default)>li{list-style-type:none}a{-webkit-tap-highlight-color:rgba(0,0,0,0)}button{background:none;border:none;cursor:pointer;outline:none;padding:0}img,video{-webkit-user-drag:none}.valign-wrapper{align-items:center;display:flex}.z-depth-0{box-shadow:none!important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none!important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;user-select:none}.no-transition,.no-transition:after,.no-transition:before{transition:none!important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start!important}.justify-self-start{justify-self:flex-start!important}.justify-self-end{justify-self:flex-end!important}.position-center{position:absolute!important}.position-center{left:50%;top:50%;transform:translate(-50%,-50%)}.text-bold{font-weight:500!important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap!important}.no-wrap{white-space:nowrap!important}.no-border-radius{border-radius:0!important}.disable-hover{pointer-events:none!important}.reflect-x{transform:scaleX(-1)}[dir=auto]{unicode-bidi:plaintext}.is-rtl [dir=auto]{direction:inherit}a{text-decoration:none}html{font-weight:400;line-height:1.5}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}code,pre{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap} +:root{--vh:1vh;--z-below:-1;--hover-alpha:0.08;--transition-standard-easing:cubic-bezier(.4,.0,.2,1);--transition-standard-in-time:.3s;--transition-standard-out-time:.25s;--transition-standard-in:var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out:var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition:.2s ease-in-out;--layer-transition:.2s cubic-bezier(.4,.0,.2,1);--slide-header-transition:.4s ease-in-out;--tabs-transition:.2s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--input-transition:.2s ease-out;--sticker-viewer-open-transition-in:.2s var(--transition-standard-easing);--sticker-viewer-open-transition-out:.2s var(--transition-standard-easing);--sticker-viewer-switch-transition:.2s cubic-bezier(.12,1.1,.56,1.2);--popup-transition-function:cubic-bezier(.4,0,.2,1);--popup-transition-time:.15s;--btn-corner-transition:.2s cubic-bezier(.34,1.56,.64,1);--chatlist-badge-transition-in:.25s cubic-bezier(.35,.35,.47,1.34);--chatlist-badge-transition-out:.25s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin:5.5625rem;--message-beside-button-size:2.375rem;--message-beside-button-margin:calc((var(--message-beside-button-size) + 0.5rem)*-1);--message-time-background:rgba(0,0,0,.35);--message-highlightning-color:rgba(109,141,65,.4);--messages-container-width:728px;--messages-text-size:16px;--messages-line-height:1.3125;--messages-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-text-size) + 4px);--messages-time-text-size:calc(var(--messages-text-size) - 4px);--messages-service-text-size:calc(var(--messages-text-size) - 1px);--messages-custom-emoji-size:calc(var(--messages-text-size) + 4px);--bubble-transition-in:transform var(--transition-standard-in),opacity var(--transition-standard-in);--bubble-transition-out:transform var(--transition-standard-out),opacity var(--transition-standard-out);--line-height-20:26px;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--line-height:1.3125;--font-size-20:20px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--font-size:var(--font-size-16);--esg-sticker-size:72px;--esg-custom-emoji-size:36px;--popup-sticker-size:80px;--disabled-opacity:.3;--round-video-size:280px;--menu-box-shadow:0px 0px 10px var(--menu-box-shadow-color);--menu-backdrop-filter:blur(50px);--font-monospace:"Roboto Mono",monospace;--font-weight-bold:500;--font-weight-normal:400;--selection-background-color:rgba(var(--primary-color-rgb),.4);--selection-color:inherit;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--custom-emoji-size:1.25rem;--peer-avatar-red-top:#ff845e;--peer-avatar-red-bottom:#d45246;--peer-avatar-orange-top:#febb5b;--peer-avatar-orange-bottom:#f68136;--peer-avatar-violet-top:#b694f9;--peer-avatar-violet-bottom:#6c61df;--peer-avatar-green-top:#9ad164;--peer-avatar-green-bottom:#46ba43;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#5bcbe3;--peer-avatar-blue-bottom:#359ad4;--peer-avatar-pink-top:#ff8aac;--peer-avatar-pink-bottom:#d95574;--peer-avatar-saved-top:#69bffa;--peer-avatar-saved-bottom:#3d9de0;--peer-avatar-archive-top:#b8c2cc;--peer-avatar-archive-bottom:#9eaab5;--avatar-color-top:var(--peer-avatar-saved-top);--avatar-color-bottom:var(--peer-avatar-saved-bottom);--avatar-border-radius-forum:37%;--premium-gradient:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%)}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-sticker-size:68px;--popup-sticker-size:68px;--round-video-size:200px;--chat-input-size:2.875rem;--chat-input-padding:0.5rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:601px){:root{--right-column-width:420px;--chat-input-size:3.375rem;--chat-input-padding:0.8125rem;--chat-input-inner-padding:0.5rem}}@media only screen and (max-height:569px){:root{--chat-input-size:2.875rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:1276px)and (max-width:1680px){:root{--right-column-width:25vw}}:root{--body-background-color:#fff;--background-color-true:#f4f4f5;--background-color:var(--background-color-true);--border-color:#dfe1e5;--surface-color-rgb:255,255,255;--surface-color:#fff;--scrollbar-color:rgba(0,0,0,.2);--section-box-shadow-color:rgba(0,0,0,.06);--menu-box-shadow-color:rgba(0,0,0,.15);--input-search-background-color:#fff;--input-search-border-color:#dfe1e5;--primary-color:#3390ec;--light-primary-color:rgba(51,144,236,.08);--light-filled-primary-color:#eff6fd;--dark-primary-color:#2086ea;--primary-color-rgb:51,144,236;--primary-text-color:#000;--primary-text-color-rgb:0,0,0;--secondary-color:#c4c9cc;--secondary-text-color:#707579;--light-secondary-text-color:hsla(207,4%,46%,.08);--light-filled-secondary-text-color:#f4f4f4;--danger-color:#df3f40;--light-danger-color:rgba(223,63,64,.08);--dark-danger-color:#d22324;--avatar-online-color:#0ac630;--chatlist-status-color:var(--avatar-online-color);--chatlist-pinned-color:#a2abb2;--badge-text-color:#fff;--link-color:#00488f;--ripple-color:rgba(0,0,0,.08);--poll-circle-color:var(--border-color);--spoiler-background-color:#e3e5e8;--spoiler-draft-background-color:#d9d9d9;--monospace-text-color:var(--danger-color);--backdrop-opacity:.85;--menu-background-color:rgba(var(--surface-color-rgb),var(--backdrop-opacity));--message-background-color:var(--surface-color);--message-checkbox-color:#61c642;--message-checkbox-border-color:#fff;--message-primary-color:var(--primary-color);--light-filled-message-primary-color:var(--light-filled-primary-color);--message-secondary-color:var(--secondary-color);--message-error-color:var(--danger-color);--message-out-background-color:#eeffde;--light-message-out-background-color:rgba(238,255,222,.08);--dark-message-out-background-color:#d9ffb5;--message-out-link-color:var(--link-color);--message-out-primary-color:#4fae4e;--light-filled-message-out-primary-color:#e1f9d2;--message-out-status-color:var(--message-out-primary-color);--message-out-audio-play-button-color:#fff;--message-out-selection-background-color:var(--selection-background-color);--gc-background-color:#212121;--gc-button-leave-color:rgba(255,89,90,.3);--gc-button-unmuted-color:rgba(1,200,80,.2);--gc-button-muted-color:rgba(60,135,247,.2);--gc-button-hand-color:rgba(223,68,184,.2);--gc-button-unmuted-fill-color:#195530;--gc-button-muted-fill-color:#3c87f7;--gc-green-color:#195530;--gc-blue-color:#3c87f7;--gc-red-color:#643333;--gc-primary-text-color:#fff;--gc-secondary-text-color:#aaa;--gc-green-text-color:#5cc85e;--gc-blue-text-color:#3390ec;--gc-red-text-color:#ff595a;--gc-right-column-width:26.25rem}.night{--body-background-color:#181818;--background-color-true:#181818;--background-color:var(--background-color-true);--border-color:#0f0f0f;--surface-color-rgb:33,33,33;--surface-color:#212121;--scrollbar-color:hsla(0,0%,100%,.2);--section-box-shadow-color:rgba(0,0,0,.12);--input-search-background-color:#181818;--input-search-border-color:#2f2f2f;--primary-color:#8774e1;--light-primary-color:rgba(135,116,225,.08);--light-filled-primary-color:#292830;--dark-primary-color:#6a52da;--primary-color-rgb:135,116,225;--primary-text-color:#fff;--primary-text-color-rgb:255,255,255;--secondary-color:#707579;--secondary-text-color:#aaa;--light-secondary-text-color:hsla(0,0%,67%,.08);--light-filled-secondary-text-color:#2c2c2c;--danger-color:#ff595a;--light-danger-color:rgba(255,89,90,.08);--dark-danger-color:#ff3031;--avatar-online-color:#0ac630;--chatlist-status-color:var(--primary-color);--chatlist-pinned-color:var(--secondary-color);--badge-text-color:#fff;--link-color:var(--primary-color);--ripple-color:hsla(0,0%,100%,.08);--poll-circle-color:#fff;--spoiler-background-color:#373e4e;--spoiler-draft-background-color:#484848;--monospace-text-color:var(--primary-text-color);--menu-background-color:rgba(var(--surface-color-rgb),.75);--message-background-color:var(--surface-color);--message-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--message-error-color:#fff;--message-out-background-color:#8774e1;--light-message-out-background-color:rgba(135,116,225,.08);--dark-message-out-background-color:#6a52da;--message-out-link-color:#fff;--message-out-primary-color:#fff;--light-filled-message-out-primary-color:#917fe3;--message-out-status-color:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color);--message-out-selection-background-color:rgba(var(--surface-color-rgb),.4)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?ivbp49) format("truetype"),url(assets/fonts/tgico.woff?ivbp49) format("woff"),url(assets/fonts/tgico.svg?ivbp49#tgico) format("svg")}.tgico:after,.tgico:before,[class*=" tgico-"]:after,[class*=" tgico-"]:before,[class^=tgico-]{font-family:tgico!important}.tgico:after,.tgico:before,[class*=" tgico-"]:after,[class*=" tgico-"]:before,[class^=tgico-]{speak:never;font-feature-settings:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.tgico-check:before{content:""}.tgico-checks:before{content:""}.tgico-activesessions:before{content:""}.tgico-add:before{content:""}.tgico-add_reaction:before{content:""}.tgico-addmember_filled:before{content:""}.tgico-adduser:before{content:""}.tgico-admin:before{content:""}.tgico-animals:before{content:""}.tgico-animations:before{content:""}.tgico-archive:before{content:""}.tgico-arrow_down:before{content:""}.tgico-arrow_next:before{content:""}.tgico-attach:before{content:""}.tgico-audio_repeat:before{content:""}.tgico-audio_repeat_single:before{content:""}.tgico-avatarnext:before{content:""}.tgico-avatarprevious:before{content:""}.tgico-binfilled:before{content:""}.tgico-bold:before{content:""}.tgico-botcom:before{content:""}.tgico-bots:before{content:""}.tgico-bug:before{content:""}.tgico-calendar:before{content:""}.tgico-calendarfilter:before{content:""}.tgico-camera:before{content:""}.tgico-cameraadd:before{content:""}.tgico-car:before{content:""}.tgico-card:before{content:""}.tgico-card_outline:before{content:""}.tgico-channel:before{content:""}.tgico-channelviews:before{content:""}.tgico-chatspinned:before{content:""}.tgico-chatsplaceholder:before{content:""}.tgico-check1:before{content:""}.tgico-checkbox:before{content:""}.tgico-checkboxblock:before{content:""}.tgico-checkboxempty:before{content:""}.tgico-checkboxon:before{content:""}.tgico-checkretract:before{content:""}.tgico-checkround:before{content:""}.tgico-close:before{content:""}.tgico-clouddownload:before{content:""}.tgico-colorize:before{content:""}.tgico-comments:before{content:""}.tgico-commentssticker:before{content:""}.tgico-copy:before{content:""}.tgico-darkmode:before{content:""}.tgico-data:before{content:""}.tgico-delete:before{content:""}.tgico-delete_filled:before{content:""}.tgico-deletedaccount:before{content:""}.tgico-deleteleft:before{content:""}.tgico-deleteuser:before{content:""}.tgico-devices:before{content:""}.tgico-document:before{content:""}.tgico-down:before{content:""}.tgico-download:before{content:""}.tgico-dragfiles:before{content:""}.tgico-dragmedia:before{content:""}.tgico-eats:before{content:""}.tgico-edit:before{content:""}.tgico-email:before{content:""}.tgico-endcall_filled:before{content:""}.tgico-enter:before{content:""}.tgico-eye1:before{content:""}.tgico-eye2:before{content:""}.tgico-fast_forward:before{content:""}.tgico-fast_rewind:before{content:""}.tgico-favourites:before{content:""}.tgico-flag:before{content:""}.tgico-flip:before{content:""}.tgico-folder:before{content:""}.tgico-fontsize:before{content:""}.tgico-forward:before{content:""}.tgico-forward_filled:before{content:""}.tgico-fullscreen:before{content:""}.tgico-gc_microphone:before{content:""}.tgico-gc_microphoneoff:before{content:""}.tgico-gifs:before{content:""}.tgico-group:before{content:""}.tgico-groupmedia:before{content:""}.tgico-groupmediaoff:before{content:""}.tgico-help:before{content:""}.tgico-hide:before{content:""}.tgico-image:before{content:""}.tgico-info:before{content:""}.tgico-info2:before{content:""}.tgico-italic:before{content:""}.tgico-keyboard:before{content:""}.tgico-lamp:before{content:""}.tgico-language:before{content:""}.tgico-largepause:before{content:""}.tgico-largeplay:before{content:""}.tgico-left:before{content:""}.tgico-limit_chat:before{content:""}.tgico-limit_chats:before{content:""}.tgico-limit_file:before{content:""}.tgico-limit_folders:before{content:""}.tgico-limit_link:before{content:""}.tgico-limit_pin:before{content:""}.tgico-link:before{content:""}.tgico-listscreenshare:before{content:""}.tgico-livelocation:before{content:""}.tgico-location:before{content:""}.tgico-lock:before{content:""}.tgico-lockoff:before{content:""}.tgico-loginlogodesktop:before{content:""}.tgico-loginlogomobile:before{content:""}.tgico-logout:before{content:""}.tgico-mediaspoiler:before{content:""}.tgico-mediaspoileroff:before{content:""}.tgico-mention:before{content:""}.tgico-menu:before{content:""}.tgico-message:before{content:""}.tgico-messageunread:before{content:""}.tgico-microphone:before{content:""}.tgico-microphone_crossed:before{content:""}.tgico-microphone_crossed_filled:before{content:""}.tgico-microphone_filled:before{content:""}.tgico-minus:before{content:""}.tgico-monospace:before{content:""}.tgico-more:before{content:""}.tgico-mute:before{content:""}.tgico-muted:before{content:""}.tgico-newchannel:before{content:""}.tgico-newchat_filled:before{content:""}.tgico-newgroup:before{content:""}.tgico-newprivate:before{content:""}.tgico-next:before{content:""}.tgico-noncontacts:before{content:""}.tgico-nosound:before{content:""}.tgico-passwordoff:before{content:""}.tgico-pause:before{content:""}.tgico-permissions:before{content:""}.tgico-phone:before{content:""}.tgico-pin:before{content:""}.tgico-pinlist:before{content:""}.tgico-pinned_filled:before{content:""}.tgico-pinnedchat:before{content:""}.tgico-pip:before{content:""}.tgico-play:before{content:""}.tgico-playback_05:before{content:""}.tgico-playback_15:before{content:""}.tgico-playback_1x:before{content:""}.tgico-playback_2x:before{content:""}.tgico-plus:before{content:""}.tgico-poll:before{content:""}.tgico-premium_addone:before{content:""}.tgico-premium_double:before{content:""}.tgico-premium_lock:before{content:""}.tgico-premium_unlock:before{content:""}.tgico-previous:before{content:""}.tgico-radiooff:before{content:""}.tgico-radioon:before{content:""}.tgico-reactions:before{content:""}.tgico-readchats:before{content:""}.tgico-recent:before{content:""}.tgico-replace:before{content:""}.tgico-reply:before{content:""}.tgico-reply_filled:before{content:""}.tgico-rightpanel:before{content:""}.tgico-rotate_left:before{content:""}.tgico-rotate_right:before{content:""}.tgico-saved:before{content:""}.tgico-savedmessages:before{content:""}.tgico-schedule:before{content:""}.tgico-scheduled:before{content:""}.tgico-search:before{content:""}.tgico-select:before{content:""}.tgico-send:before{content:""}.tgico-send2:before{content:""}.tgico-sending:before{content:""}.tgico-sendingerror:before{content:""}.tgico-settings:before{content:""}.tgico-settings_filled:before{content:""}.tgico-sharescreen_filled:before{content:""}.tgico-shipping:before{content:""}.tgico-shuffle:before{content:""}.tgico-smallscreen:before{content:""}.tgico-smile:before{content:""}.tgico-spoiler:before{content:""}.tgico-sport:before{content:""}.tgico-star:before{content:""}.tgico-stickers:before{content:""}.tgico-stickers_face:before{content:""}.tgico-stop:before{content:""}.tgico-strikethrough:before{content:""}.tgico-textedit:before{content:""}.tgico-tip:before{content:""}.tgico-tools:before{content:""}.tgico-topics:before{content:""}.tgico-unarchive:before{content:""}.tgico-underline:before{content:""}.tgico-unmute:before{content:""}.tgico-unpin:before{content:""}.tgico-unread:before{content:""}.tgico-up:before{content:""}.tgico-user:before{content:""}.tgico-username:before{content:""}.tgico-videocamera:before{content:""}.tgico-videocamera_crossed_filled:before{content:""}.tgico-videocamera_filled:before{content:""}.tgico-videochat:before{content:""}.tgico-volume_down:before{content:""}.tgico-volume_mute:before{content:""}.tgico-volume_off:before{content:""}.tgico-volume_up:before{content:""}.tgico-zoomin:before{content:""}.tgico-zoomout:before{content:""}.tgico-phone_filled:before{content:"";transform:rotate(-135deg)}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local("Roboto"),local("Roboto-Regular"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format("woff2");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format("woff2");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local("Roboto Medium"),local("Roboto-Medium"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format("woff2");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format("woff2");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}.input-wrapper{margin:0 auto;width:360px}.input-field{--height:54px;--border-radius:10px;position:relative}@media only screen and (max-width:600px){.input-field{--height:50px}}.input-field .arrow-down{border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;bottom:0;content:" ";cursor:pointer;display:inline-block;height:0;margin-top:-9px;padding:5px;position:absolute;right:21px;top:50%;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:all .2s;vertical-align:middle;width:0;z-index:2}[dir=ltr] .input-field label{left:1rem}[dir=rtl] .input-field label{right:1rem}.input-field label{background-color:#fff;background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;margin-top:calc((var(--height) - 1.5rem)/2);pointer-events:none;position:absolute;right:auto;top:0;transform:translate(0);transform-origin:left center;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap;z-index:2}.is-rtl .input-field label{transform-origin:right center}body.animation-level-2 .input-field label{transition:transform .2s,padding .2s,opacity .1s,font-weight 0s .1s}.input-field-border{border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:var(--border-radius);bottom:0;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-icon{border-radius:.375rem;height:1.5rem;pointer-events:none;position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:1.5rem;z-index:1}.input-field-input{--padding:1rem;--padding-horizontal:1rem;--border-width:1px;background-color:#fff;background-color:var(--surface-color);border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);box-sizing:border-box;line-height:1.3125;line-height:var(--line-height);min-height:var(--height);padding:calc(var(--padding) - var(--border-width)) calc(var(--padding-horizontal) - var(--border-width));position:relative;transition:border-color 0s;width:100%;z-index:1}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{-webkit-box-shadow:inset 0 0 0 1000px #fff;-webkit-box-shadow:0 0 0 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:first-line,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{color:#000!important;color:var(--primary-text-color)!important;font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important;font-size:1rem!important}@media only screen and (max-width:600px){.input-field-input{--padding:.9375rem;--padding-horizontal:.9375rem}}body.animation-level-0 .input-field-input{transition:none!important}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:border-color .2s}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40!important;color:var(--danger-color)!important}.input-field-input.error~.input-field-border{border-color:#df3f40!important;border-color:var(--danger-color)!important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f!important}.input-field-input.valid~.input-field-border{border-color:#26962f!important}.input-field-input:focus~.arrow-down{border-color:#3390ec;border-color:var(--primary-color);margin-top:-4px;transform:rotate(225deg)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:disabled~label,.input-field-input:focus~label,.input-field-input:not(:empty)~label,.input-field-input:valid~label{opacity:1;padding:0 .3125rem;transform:translate(-.1875rem,calc(var(--height)/-2 + .0625rem)) scale(.75)}.input-field-input-fake{bottom:auto!important;height:auto!important;position:absolute!important;right:auto!important}.input-field-input-fake{left:0;opacity:0;pointer-events:none;top:0;z-index:-3}.input-fields-row{display:flex}.input-fields-row .input-field{flex:1 1 auto;width:1%}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}button:focus,input:focus{outline:none}.input-clear{border:none;outline:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40!important;color:var(--danger-color)!important}body:not(.animation-level-0) .input-clear.error{animation:input-shake .2s ease-in-out forwards}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}.input-search{--border-radius:22px;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){[dir=ltr] .input-search{margin-left:1rem}[dir=rtl] .input-search{margin-right:1rem}}.input-search-input{max-height:var(--height)!important;min-height:var(--height)!important}.input-search-input{--height:42px;background-color:#fff;background-color:var(--input-search-background-color);border-color:#dfe1e5;border-color:var(--input-search-border-color);height:var(--height);line-height:var(--height);padding:0 calc(var(--height) + 3px - var(--border-width))}body.animation-level-2 .input-search-input{transition:border-color .2s ease-in-out}html.no-touch .input-search-input:active:not(:focus),html.no-touch .input-search-input:hover:not(:focus){border-color:#c4c9cc!important;border-color:var(--secondary-color)!important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:active,html.no-touch .input-search-input:focus~.btn-icon:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;line-height:1;opacity:.6;position:absolute;text-align:center;top:50%;transform:translateY(-50%);z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}[dir=ltr] .input-search>.tgico-search{left:.8125rem}[dir=rtl] .input-search>.tgico-search{right:.8125rem}.input-search>.tgico-search{height:1.5rem;pointer-events:none;width:1.5rem}[dir=ltr] .input-search>.tgico-close{right:0}[dir=rtl] .input-search>.tgico-close{left:0}.input-search>.tgico-close{height:42px;width:42px;z-index:1}[dir=ltr] .input-search>.tgico-close:before{margin-right:-1px}[dir=rtl] .input-search>.tgico-close:before{margin-left:-1px}[dir=ltr] .input-field-password .input-field-input{padding-right:2.5rem}[dir=rtl] .input-field-password .input-field-input{padding-left:2.5rem}.input-field-password .input-field-input{max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-family:Arial,Helvetica,sans-serif;font-size:2.25rem;line-height:1;padding-bottom:0;padding-left:calc(.875rem - var(--border-width));padding-top:0}@media(-webkit-min-device-pixel-ratio:2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{align-items:center;color:#9e9e9e;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;padding:.5rem;position:absolute;right:.375rem;top:50%;transform:translateY(-50%);transition:color .2s;z-index:2}.input-field-password .toggle-visible:before{content:""}.input-field-password .toggle-visible.eye-hidden:before{content:""}html.no-touch .input-field-password .toggle-visible:active,html.no-touch .input-field-password .toggle-visible:hover{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing:.24px}.input-field-phone .input-field-input:after{color:#9e9e9e;content:attr(data-left-pattern);letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;border:none;cursor:pointer;outline:none}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn-icon:active,html.no-touch .btn-icon:hover,html.no-touch .btn:active,html.no-touch .btn:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-icon.active:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn.active:active,html.no-touch .btn.active:hover,html.no-touch .btn.blue:active,html.no-touch .btn.blue:hover,html.no-touch .btn.primary:active,html.no-touch .btn.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-icon.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-icon:disabled,.btn:disabled{pointer-events:none!important}.btn-icon:disabled,.btn:disabled{opacity:.3;opacity:var(--disabled-opacity)}.btn-icon{border-radius:50%!important}.btn-icon{align-items:center;background-color:transparent;border:none;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;line-height:1;padding:.5rem;position:relative;text-align:center;transition:color .15s ease-in-out,opacity .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}[dir=ltr] .btn-corner{right:var(--offset)}[dir=rtl] .btn-corner{left:var(--offset)}.btn-corner{box-shadow:none!important;padding:0!important;position:absolute!important;transition:transform .2s cubic-bezier(.34,1.56,.64,1)!important;transition:transform var(--btn-corner-transition)!important}.btn-corner{--offset:1.25rem;--translateY:calc(54px + var(--offset));align-items:center;background-color:#3390ec;background-color:var(--primary-color);border:none;bottom:var(--offset);color:#fff;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;outline:none;text-align:center;transform:translate3d(0,var(--translateY),0);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}html.no-touch .btn-corner:active,html.no-touch .btn-corner:hover{background-color:#2086ea;background-color:var(--dark-primary-color)}.btn-corner.is-visible{--translateY:0}body.animation-level-0 .btn-corner{transition:none!important}.btn-corner:disabled{opacity:1!important;pointer-events:all!important}.btn-corner .preloader-circular{height:2.5rem;width:2.5rem}.btn-menu{transform:scale(.8)!important}.btn-menu{-webkit-touch-callout:none;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:10px;font-size:1rem;min-width:11.25rem;opacity:0;padding:.3125rem 0;position:absolute;top:100%;transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),visibility .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);-webkit-user-select:none;visibility:hidden;z-index:4}.btn-menu-old,.is-mobile .btn-menu{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:#fff;background-color:var(--surface-color);min-width:auto;padding:.5rem 0}.btn-menu-old .btn-menu-item,.is-mobile .btn-menu .btn-menu-item{transform:none!important}.btn-menu-old .btn-menu-item,.is-mobile .btn-menu .btn-menu-item{--padding-left:1rem;--padding-right:2.5rem;--icon-margin:1.5rem;--icon-size:1.5rem;border-radius:0;font-size:16px;font-size:var(--font-size-16);font-weight:400;height:3rem;line-height:21px;line-height:var(--line-height-16);margin:0}.btn-menu-old .btn-menu-item:before,.is-mobile .btn-menu .btn-menu-item:before{align-self:auto;color:#707579;color:var(--secondary-text-color);margin-top:0}.btn-menu-old .btn-menu-footer,.is-mobile .btn-menu .btn-menu-footer{background-color:#f4f4f5;background-color:var(--background-color)}.btn-menu{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{opacity:1;visibility:visible}.btn-menu.active,.is-mobile .btn-menu.was-open{transform:scaleX(1)!important}.btn-menu.bottom-left,.is-rtl .btn-menu.bottom-right{left:auto;right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right,.is-rtl .btn-menu.bottom-left{left:0;right:auto;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;left:auto;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right,.is-rtl .btn-menu.top-left{bottom:100%;left:0;right:auto;top:auto;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}[dir=ltr] .btn-menu-item{text-align:left}[dir=rtl] .btn-menu-item{text-align:right}.btn-menu-item{cursor:pointer!important;pointer-events:all!important}.btn-menu-item{--padding-vertical:.25rem;--padding-left:.75rem;--padding-right:.75rem;--icon-margin:1.25rem;--icon-size:1.25rem;align-items:center;border-radius:.3125rem;color:#000;color:var(--primary-text-color);display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;height:2rem;line-height:18px;line-height:var(--line-height-14);margin-left:.3125rem;margin-right:.3125rem;padding:var(--padding-vertical) var(--padding-right) var(--padding-vertical) var(--padding-left);position:relative;text-transform:none;transform:scale(1);white-space:nowrap}body.animation-level-2 .btn-menu-item{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--btn-menu-transition)}.btn-menu-item:active{transform:scale(.96)}html.no-touch .btn-menu-item:active,html.no-touch .btn-menu-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:active,html.no-touch .btn-menu-item.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-menu-item:before{align-self:flex-start;color:#000;color:var(--primary-text-color);font-size:var(--icon-size);margin-top:.125rem}[dir=ltr] .btn-menu-item-icon,[dir=ltr] .btn-menu-item:before{margin-right:var(--icon-margin)}[dir=rtl] .btn-menu-item-icon,[dir=rtl] .btn-menu-item:before{margin-left:var(--icon-margin)}.btn-menu-item-icon,.btn-menu-item:before{position:relative}[dir=ltr] .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - var(--add)/2)}[dir=rtl] .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - var(--add)/2)}[dir=ltr] .btn-menu-item-icon{margin-left:calc(var(--add)/-2)}[dir=rtl] .btn-menu-item-icon{margin-right:calc(var(--add)/-2)}.btn-menu-item-icon{--add:.25rem;--total:calc(var(--icon-size) + var(--add));flex:0 0 auto;height:var(--total);width:var(--total)}.btn-menu-item-icon .media-photo{height:inherit;width:inherit}@media only screen and (max-width:600px){.btn-menu-item{--padding-right:1.875rem}}.btn-menu-item-text{flex:1 1 auto;position:relative}.btn-menu-item-text,.btn-menu-item-text-fake{pointer-events:none}[dir=ltr] .btn-menu-item-text-fake{margin-left:var(--margin-left)}[dir=rtl] .btn-menu-item-text-fake{margin-right:var(--margin-left)}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.btn-menu-item-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.btn-menu-item-header{pointer-events:none!important}.btn-menu-item-header{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);height:2rem}[dir=ltr] .btn-menu-item .stacked-avatars{right:.5rem}[dir=rtl] .btn-menu-item .stacked-avatars{left:.5rem}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute}.btn-menu-item.is-multiline{font-size:.75rem;height:auto;max-width:16.25rem;min-width:calc(100% - .625rem);width:-moz-fit-content;width:fit-content}.btn-menu-item.is-multiline .btn-menu-item-text{white-space:pre-wrap;width:-moz-fit-content;width:fit-content}.btn-menu-item .checkbox-field-toggle{padding:0}.btn-menu-overlay{max-width:none!important;position:fixed!important;width:auto!important}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:4}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:currentColor;display:flex;font-size:.875rem;height:2.5rem;justify-content:center}.btn-menu hr{display:block!important}.btn-menu hr{margin:.3125rem auto;opacity:.6;padding:0;width:calc(100% - 1.875rem)}html:not(.is-mobile) .btn-menu .badge{background-color:transparent;color:#707579;color:var(--secondary-text-color)}.btn-menu-reactions{--inner-shadow-degree:90deg;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:var(--height);filter:drop-shadow(0 .125rem .5rem rgba(0,0,0,.24));height:inherit;max-height:100%;max-width:100%;opacity:0;position:absolute;transform:scale(.8);transform-origin:bottom left}[dir=ltr] .btn-menu-reactions-container{margin-left:var(--other-side-offset)}[dir=rtl] .btn-menu-reactions-container{margin-right:var(--other-side-offset)}.btn-menu-reactions-container{--height:2.25rem;--bubble-side-offset:0rem;--other-side-offset:0rem;--menu-offset:calc((var(--height) + 0.5rem)*-1);--width:calc(var(--menu-width) + (var(--bubble-side-offset) + var(--other-side-offset))*-1);display:flex;height:var(--height);justify-content:flex-start;margin-top:var(--menu-offset);max-width:var(--width);position:fixed;width:var(--width);z-index:4}.contextmenu.bottom-left+.btn-menu-reactions-container .btn-menu-reactions,.contextmenu.center-left+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom right!important}.contextmenu.bottom-center+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom center!important}[dir=ltr] .btn-menu-reactions-container-vertical{margin-left:var(--menu-offset)}[dir=rtl] .btn-menu-reactions-container-vertical{margin-right:var(--menu-offset)}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-top:0;max-height:var(--width);max-width:var(--height);width:var(--height)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree:180deg;display:flex;flex-direction:column;height:auto;transform-origin:top right;width:inherit}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical:var(--padding-base);--padding-horizontal:0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{bottom:var(--offset);right:calc(var(--size)/-2)}body.animation-level-2 .btn-menu-reactions{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{background-color:inherit;border-radius:50%;position:absolute;z-index:-1}.btn-menu-reactions-bubble-big{--size:1rem;--offset:calc(var(--height)/2);bottom:calc(var(--size)/-2);height:var(--size);right:var(--offset);width:var(--size)}.btn-menu-reactions:after{background:linear-gradient(var(--inner-shadow-degree),#fff 0,hsla(0,0%,100%,0) 1rem,hsla(0,0%,100%,0) calc(100% - 1rem),#fff 100%);background:linear-gradient(var(--inner-shadow-degree),var(--surface-color) 0,rgba(var(--surface-color-rgb),0) 1rem,rgba(var(--surface-color-rgb),0) calc(100% - 1rem),var(--surface-color) 100%);border-radius:inherit;bottom:0;content:" ";left:0;pointer-events:none;position:absolute;right:0;top:0}.btn-menu-reactions .scrollable{border-radius:inherit;display:flex;position:relative}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 .25rem}.btn-menu-reactions .scrollable-y{align-items:center;flex-direction:column;padding:.25rem 0}.btn-menu-reactions-reaction{--size:1.625rem;--padding-base:.25rem;--padding-vertical:0rem;--padding-horizontal:var(--padding-base);cursor:pointer;flex:0 0 auto;height:calc(var(--size) + var(--padding-vertical)*2);padding:var(--padding-vertical) var(--padding-horizontal);width:calc(var(--size) + var(--padding-horizontal)*2)}.btn-menu-reactions-reaction-scale{height:100%;width:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{height:100%;position:relative;width:100%}.btn-primary{border:none;border-radius:10px;cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold);height:54px;overflow:hidden;padding:0;position:relative;text-align:center;transition:opacity .2s;width:100%}html.no-touch .btn-primary:active,html.no-touch .btn-primary:hover{background:#2086ea;background:var(--dark-primary-color);transition:opacity .2s}.btn-primary-transparent{background-color:transparent;color:#3390ec;color:var(--primary-color)}html.no-touch .btn-primary-transparent:active,html.no-touch .btn-primary-transparent:hover{background:rgba(51,144,236,.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:active,html.no-touch .btn-primary-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}[dir=ltr] .btn-primary use,[dir=ltr] .btn-primary>svg{right:15px}[dir=rtl] .btn-primary use,[dir=rtl] .btn-primary>svg{left:15px}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto}.btn-primary:disabled{pointer-events:none!important}.btn-primary:disabled{opacity:.3;opacity:var(--disabled-opacity)}[dir=ltr] .btn-control{padding-left:.75rem;padding-right:1.5rem}[dir=rtl] .btn-control{padding-left:1.5rem;padding-right:.75rem}.btn-control{align-items:center;border-radius:1.25rem;display:flex;height:2.5rem;line-height:2.5rem;margin:.9375rem auto 1rem;width:auto}[dir=ltr] .btn-control.tgico:before{margin-right:.375rem}[dir=rtl] .btn-control.tgico:before{margin-left:.375rem}.btn-control.tgico:before{font-size:1.5rem}.btn-transparent{align-items:center;background-color:transparent;color:#000;color:var(--primary-text-color);display:flex;font-weight:400;height:3rem;line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width:600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:active,html.no-touch .btn-transparent:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:active,html.no-touch .btn-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:active,html.no-touch .btn-transparent.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}[dir=ltr] .btn-transparent:before{margin-right:2rem}[dir=rtl] .btn-transparent:before{margin-left:2rem}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem}@media only screen and (max-width:600px){[dir=ltr] .btn-transparent:before{margin-right:1.5rem}[dir=rtl] .btn-transparent:before{margin-left:1.5rem}}[dir=ltr] .btn-transparent.btn-short:before{margin-right:1rem}[dir=rtl] .btn-transparent.btn-short:before{margin-left:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);left:auto;margin:0;right:auto;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{cursor:pointer!important;font-weight:400!important;overflow:visible!important;pointer-events:all!important}.btn-menu-toggle{position:relative}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size:54px;border-radius:50%;height:var(--size);line-height:var(--size);width:var(--size)}@media only screen and (max-width:600px){.btn-circle{--size:46px}}.btn-circle path{fill:#fff}.btn-disabled{color:#707579!important;color:var(--secondary-text-color)!important;cursor:default!important;pointer-events:none!important}.btn-disabled:before{color:inherit!important}.btn-secondary:not(:first-child){margin-top:.5rem!important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border-radius:50%;font-size:1.5rem;height:3.375rem;height:var(--call-button-size);justify-content:center;position:relative}.call-button,.call-button-container{align-items:center;cursor:pointer;display:flex;width:3.375rem;width:var(--call-button-size)}.call-button-container{flex-direction:column}.call-button-container.disabled,.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{font-size:.875rem;margin-top:.25rem;white-space:nowrap}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}[dir=ltr] .call-button+.call-button,[dir=ltr] .call-button-container+.call-button-container{margin-left:var(--call-button-margin)}[dir=rtl] .call-button+.call-button,[dir=rtl] .call-button-container+.call-button-container{margin-right:var(--call-button-margin)}[dir=ltr] .call-button+.call-button,[dir=ltr] .call-button-container+.call-button-container{margin-left:2rem}[dir=rtl] .call-button+.call-button,[dir=rtl] .call-button-container+.call-button-container{margin-right:2rem}[dir=ltr] .btn-update{right:auto!important}[dir=rtl] .btn-update{left:auto!important}.btn-update{padding:0 2rem!important}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);width:auto}.animated-close-icon{pointer-events:none;position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{background-color:#707579;background-color:var(--secondary-text-color);border-radius:.125rem;height:.125rem;width:1.125rem}.animated-close-icon:after,.animated-close-icon:before{content:"";left:0;position:absolute;top:0}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:after,body.animation-level-2 .animated-close-icon:before{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.animated-menu-icon{--color:var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:after,.animated-menu-icon:before{background-color:var(--color);border-radius:.125rem;height:.125rem;transform:rotate(0);width:1.125rem}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:after,body.animation-level-2 .animated-menu-icon:before{transition:transform .25s}.animated-menu-icon:after,.animated-menu-icon:before{content:"";left:0;position:absolute}.animated-menu-icon:before{top:-.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translate(.375rem,-.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}.animated-menu-close-icon{margin-top:-.625rem}.animated-menu-close-icon:before{opacity:1;top:.3125rem}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translateY(.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{opacity:0;transform:rotate(45deg)}.animated-menu-close-icon.state-back:after{transform:translateY(-.625rem) rotate(90deg)}.animated-button-icon>.tgico{height:24px;line-height:24px;position:absolute}body:not(.animation-level-0) .animated-button-icon>.tgico{animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{animation:none!important}body.animation-level-0 .animated-button-icon>.tgico{visibility:hidden}.autocomplete-helper{border-radius:var(--border-radius)!important;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper{--border-radius:10px;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width:319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal)*4)}}.autocomplete-peer-helper .scrollable{max-height:232px;position:relative}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{align-items:center;cursor:pointer;display:flex;height:3.125rem;line-height:1.3125;line-height:var(--line-height);padding:0 2.125rem 0 .75rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{flex:0 0 auto;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.875rem}.autocomplete-peer-helper-list-element-description{color:#707579;color:var(--secondary-text-color);margin-left:.5625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{line-height:var(--size)!important}.badge{--size:1.375rem;--padding:.4375rem;border-radius:calc(var(--size)/2);color:#fff;color:var(--badge-text-color);font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);min-width:var(--size);padding:0 var(--padding);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{--size:1.25rem;--padding:.375rem}.badge-24{--size:1.5rem;--padding:.5rem}.badge.tgico:before{font-size:var(--size)}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{border-radius:0!important}.ckin__player.ckin__fullscreen{background:#000;bottom:0;display:flex;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:10000000}.ckin__player.ckin__fullscreen video{height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.ckin__player .time{color:#fff;font-size:.875rem;margin-left:.875rem}@media only screen and (max-width:600px){.ckin__player .time{margin-left:1.125rem}}.default{align-items:center;display:flex;font-size:0;justify-content:center;position:relative}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;color:#fff;font-size:4rem;left:50%;line-height:1;opacity:1;outline:0;padding:0;position:absolute;text-align:center;top:50%;transform:translate3d(-50%,-50%,0) scale(1)}@media only screen and (min-width:601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}@media only screen and (max-width:600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0}[dir=ltr] .default__controls{text-align:left}[dir=rtl] .default__controls{text-align:right}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}.default__controls .progress-line{border-radius:var(--border-radius);margin:0 16px}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:hsla(0,0%,100%,.38)}@media only screen and (max-width:600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x;bottom:0;height:49px;padding-top:93px;pointer-events:none;position:absolute;width:100%;z-index:2}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}@media only screen and (max-width:600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:""}.default .default__gradient-bottom{transform:translate3d(0,50px,0)}.default .default__controls{transform:translate3d(0,52px,0)}@media only screen and (max-width:600px){.default .default__controls{transform:translate3d(0,65px,0)}}.default.show-controls .default__controls,.default.show-controls .default__gradient-bottom{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:""}.default .player-volume{--icon-size:2.25rem;--icon-margin-right:.5rem;--selector-size:50px;--selector-thumb-size:.75rem;--hide-width:var(--icon-size);--show-width:calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size)*0.75);align-items:center;display:flex;overflow:hidden;width:var(--hide-width)}body.animation-level-2 .default .player-volume{transition:width .2s cubic-bezier(.4,0,.2,1);transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:active,html.no-touch .default .player-volume:hover{width:var(--show-width)}.default .player-volume__icon{color:#fff;cursor:pointer;display:flex;font-size:1.5rem;height:var(--icon-size);margin-right:var(--icon-margin-right);padding:.375rem;width:var(--icon-size)}.default .player-volume .progress-line{--color:#fff;--thumb-size:var(--selector-thumb-size);--height:4px;margin:0;min-width:var(--selector-size);width:var(--selector-size)}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none!important}video::-webkit-media-controls-enclosure{display:none!important}.progress-line{--color:var(--primary-color);--height:5px;--border-radius:6px;--thumb-size:13px;border-radius:var(--border-radius);cursor:pointer;height:var(--height);position:relative}.progress-line:before{border-radius:inherit;bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;bottom:-.5rem;caret-color:var(--color);cursor:pointer;margin:0;outline:none;padding:0;position:absolute;top:-.5rem;width:100%}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;height:0;width:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{background-color:var(--color);border-radius:50%;content:" ";cursor:pointer;display:block;height:var(--thumb-size);position:absolute;right:0;top:calc((var(--thumb-size) - var(--height))/-2);transform:translateX(calc(var(--thumb-size)/2)) scale(1);width:var(--thumb-size)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translateX(calc(var(--thumb-size)/2)) scale(1.125)}.progress-line:before,.progress-line__loaded{background-color:#c4c9cc;background-color:var(--secondary-color);opacity:.3}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);bottom:0;position:absolute;top:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{transform-origin:left center;width:100%}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;border:none;color:none}input[type=range]::-ms-thumb,input[type=range]::-ms-tooltip{visibility:hidden}.bottom-controls,.left-controls,.right-controls{align-items:center;display:flex}.bottom-controls{height:2.25rem;justify-content:space-between;padding:0 .625rem}@media only screen and (max-width:600px){.bottom-controls{height:3.625rem}}[dir=ltr] .checkbox-field{text-align:left}[dir=rtl] .checkbox-field{text-align:right}.checkbox-field{--size:1.25rem;--offset-left:0px;cursor:pointer;display:block;margin:1.5rem 1.1875rem;min-height:var(--size);min-width:var(--size);position:relative}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{pointer-events:none!important}.checkbox-field.checkbox-disabled{opacity:.3;opacity:var(--disabled-opacity)}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}[dir=ltr] .checkbox-field .checkbox-box{left:var(--offset-left)}[dir=rtl] .checkbox-field .checkbox-box{right:var(--offset-left)}.checkbox-field .checkbox-box{border-radius:.3125rem;height:var(--size);overflow:hidden;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border,.checkbox-field .checkbox-box-check{left:0;position:absolute;top:0}.checkbox-field .checkbox-box-border{border:2px solid #8d969c;border-radius:inherit;bottom:0;left:0;right:0}.checkbox-field .checkbox-box-background{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;bottom:-15%;left:-15%;right:-15%;top:-15%;transform:scale(1);transition:transform .2s ease-in-out 0s}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none!important}.checkbox-field .checkbox-box-check{--offset:7px;height:calc(var(--size) - var(--offset));left:50%;top:50%;transform:translate(-50%,-50%);width:calc(var(--size) - var(--offset))}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:3.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s ease-in-out .15s,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none!important}[dir=ltr] .checkbox-field .checkbox-caption{padding-left:3.375rem}[dir=rtl] .checkbox-field .checkbox-caption{padding-right:3.375rem}.checkbox-field .checkbox-caption{color:inherit;line-height:1.3125;line-height:var(--line-height);pointer-events:none;position:relative;transition:opacity .2s}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{align-items:center;display:flex;height:3.5rem;margin-left:0;margin-right:0;padding:0 1.1875rem}[dir=ltr] .checkbox-field.hover-effect .checkbox-box{left:auto}[dir=rtl] .checkbox-field.hover-effect .checkbox-box{right:auto}.checkbox-field .anchor-url{pointer-events:all}.checkbox-ripple{border-radius:10px;overflow:hidden}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size:1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{bottom:0;left:0;right:0;top:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset:calc(var(--size) - var(--size)/2 - 0.125rem)}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}[dir=ltr] .radio-field{text-align:left}[dir=rtl] .radio-field{text-align:right}.radio-field{--size:1.375rem;--offset-left:0px;cursor:pointer;line-height:1.3125;line-height:var(--line-height);margin:1.25rem 0;position:relative}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main:after,.radio-field.hidden-widget .radio-field-main:before{visibility:hidden}.radio-field>input:checked~.radio-field-main:before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main:after{transform:translateY(-50%) scale(1)}[dir=ltr] .radio-field .radio-field-main{padding-left:3.5rem}[dir=rtl] .radio-field .radio-field-main{padding-right:3.5rem}.radio-field .radio-field-main{color:inherit;position:relative}[dir=ltr] .radio-field .radio-field-main:after,[dir=ltr] .radio-field .radio-field-main:before{left:var(--offset-left)}[dir=rtl] .radio-field .radio-field-main:after,[dir=rtl] .radio-field .radio-field-main:before{right:var(--offset-left)}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:"";display:block;height:var(--size);position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}.radio-field .radio-field-main:before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main:before{transition:border-color .1s ease,opacity .1s ease}[dir=ltr] .radio-field .radio-field-main:after{left:calc(var(--offset-left) + .3125rem)}[dir=rtl] .radio-field .radio-field-main:after{right:calc(var(--offset-left) + .3125rem)}.radio-field .radio-field-main:after{background:#3390ec;background:var(--primary-color);border-radius:50%;height:.75rem;transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}[dir=ltr] .radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}[dir=rtl] .radio-field.radio-field-right .radio-field-main:before{left:0;right:auto}[dir=ltr] .radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[dir=rtl] .radio-field.radio-field-right .radio-field-main:after{left:.3125rem;right:auto}[type=checkbox],[type=radio]{box-sizing:border-box;opacity:0;padding:0;position:absolute;z-index:-1;z-index:var(--z-below)}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s;visibility:hidden}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transform:scale(0);transition:transform .2s ease-in-out .05s}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none!important;transition:background-color .2s!important}.checkbox-field-restriction .checkbox-box-check use{stroke-dasharray:24.19,24.19!important;transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out!important;visibility:visible!important}.checkbox-field-restriction .checkbox-box-check use{transform:rotate(0) translateY(0)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dashoffset:35.5;transform:rotate(45deg) translateY(-10px)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size:20px;align-items:center;display:flex;margin:0 .3125rem;padding:0 .25rem;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset:3px;--toggle-width:1.9375rem;align-items:center;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;display:flex;height:.875rem;margin:0 var(--offset);position:relative;width:var(--toggle-width)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{background-color:#fff;background-color:var(--surface-color);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:50%;content:" ";height:1.25rem;position:absolute;transform:translateX(calc(var(--offset)*-1));width:1.25rem}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s cubic-bezier(.22,.75,.7,1.44)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width:600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{margin-bottom:17px;padding:1rem 0 .5rem;width:100%}@media only screen and (max-width:600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:0 23px 1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.chatlist-container .search-group__name{font-size:15px;padding:5px 9px 0 16px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width:600px){.chatlist-container .search-group-contacts{padding:0 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0!important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0;padding:0 0 .5rem}.chatlist-container .search-super .search-group__name{display:flex;justify-content:space-between;padding-top:1rem}ul.chatlist{padding:0 .5rem}@media only screen and (max-width:600px){ul.chatlist{padding:0}}.chatlist{-webkit-touch-callout:none;background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;margin:0;position:relative;-moz-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist-chat{background:var(--background)!important}.chatlist-chat{--background:unset;-webkit-user-drag:none}.chatlist-chat.is-forum-open,.chatlist-chat.menu-open,html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-filled-secondary-text-color)}[dir=ltr] .chatlist-chat.is-muted .user-title:after{margin-left:.125rem}[dir=rtl] .chatlist-chat.is-muted .user-title:after{margin-right:.125rem}.chatlist-chat.is-muted .user-title:after{color:#a2abb2;color:var(--chatlist-pinned-color);content:"";flex:0 0 auto;font-size:1.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat i{font-style:normal}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat .premium-icon{margin-top:-.125rem}.chatlist-chat .topic-icon{flex:0 0 auto}[dir=ltr] .chatlist-chat .row-title .topic-icon{margin-right:.25rem}[dir=rtl] .chatlist-chat .row-title .topic-icon{margin-left:.25rem}.chatlist-chat .row-title .topic-icon{--size:1.375rem}.chatlist-chat .topic-name .topic-icon{line-height:1!important}.chatlist-chat .topic-name .topic-icon{display:inline}.chatlist-chat .topic-name .topic-icon-svg{position:relative}.chatlist-chat .topic-name .topic-icon-content{left:0;margin-top:-6px;position:absolute;right:0;top:0}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .premium-icon,.chatlist-chat.active .row-subtitle,.chatlist-chat.active .row-title,.chatlist-chat.active .sending-status-icon,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .verified-icon{color:#fff!important}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active .danger,.chatlist-chat.active .primary-text{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-icon-background{fill:#fff!important}.chatlist-chat.active .verified-icon-check{visibility:hidden}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff!important}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color:#fff}}.chatlist .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .sending-status-icon.tgico-premium_lock{color:#c4c9cc;color:var(--secondary-color);font-size:.8125rem;margin:.1875rem 0 0 .5rem}[dir=ltr] .chatlist .dialog-title-details{margin-left:.5rem}[dir=rtl] .chatlist .dialog-title-details{margin-right:.5rem}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;padding:1px 0 0}[dir=ltr] .chatlist .dialog-subtitle-badge{margin-left:.5rem}[dir=rtl] .chatlist .dialog-subtitle-badge{margin-right:.5rem}.chatlist .dialog-subtitle-badge{display:block!important}.chatlist .dialog-subtitle-badge{flex:0 0 auto}.chatlist .dialog-subtitle-badge.avatar-badge{line-height:23px!important}.chatlist .dialog-subtitle-badge.avatar-badge{--size:1.625rem;border:2px solid #fff;border:2px solid var(--background,var(--surface-color));margin:0;pointer-events:none;position:absolute;right:calc(100% - 4.0625rem);top:2.4375rem}[dir=ltr] .chatlist .dialog-subtitle-media{margin-right:.375rem}[dir=rtl] .chatlist .dialog-subtitle-media{margin-left:.375rem}.chatlist .dialog-subtitle-media{border-radius:.25rem;display:inline-block;flex:0 0 auto;height:1.25rem;line-height:1.25rem;position:relative;width:1.25rem}.chatlist .dialog-subtitle-media:before{content:" ";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.chatlist .dialog-subtitle-media.is-round{border-radius:50%}.chatlist .dialog-subtitle-media.is-round .tgico-play{font-size:.875rem}.chatlist .dialog-subtitle-media .tgico-play{color:#fff;font-size:1rem;left:50%;line-height:1;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.chatlist .dialog-subtitle-media .media-photo{border-radius:inherit;bottom:auto;height:inherit;-o-object-fit:cover;object-fit:cover;top:auto;width:inherit}.chatlist .dialog-group-call-icon{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;height:20px;left:45px;overflow:hidden;position:absolute;top:45px;width:20px;z-index:2}body.animation-level-2 .chatlist .dialog-group-call-icon,body.animation-level-2 .chatlist .dialog-subtitle-badge{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-group-call-icon.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-group-call-icon.animating,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating{transition:background-color .25s cubic-bezier(.35,.35,.47,1.34),transform .25s cubic-bezier(.35,.35,.47,1.34);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards{transition:background-color .25s cubic-bezier(.35,.35,.7,1),transform .25s cubic-bezier(.35,.35,.7,1),opacity .25s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .25s cubic-bezier(.35,.35,.47,1.34),transform .25s cubic-bezier(.35,.35,.47,1.34);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .25s cubic-bezier(.35,.35,.7,1),transform .25s cubic-bezier(.35,.35,.7,1),opacity .25s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .dialog-avatar,.chatlist .row-row{pointer-events:none;position:relative}.chatlist .user-title{display:flex!important}.chatlist .user-title{align-items:center}.chatlist .user-title img.emoji{height:18px;margin-top:1px;vertical-align:top;width:18px}.chatlist .user-last-message img.emoji{height:20px;margin-top:-3px;width:20px}.chatlist .user-last-message,.chatlist .user-title{flex-grow:1;position:relative}[dir=ltr] .chatlist .message-status{margin-right:.125rem}[dir=rtl] .chatlist .message-status{margin-left:.125rem}.chatlist .message-status{color:#0ac630;color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-top:-.0625rem;position:relative;vertical-align:middle;width:1.25rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{left:0;position:absolute;top:0}.chatlist .mention{background-color:#0ac630!important;background-color:var(--chatlist-status-color)!important;line-height:1.25rem!important}.chatlist .mention{padding:0}[dir=ltr] .chatlist .mention-badge{margin-right:-.125rem}[dir=rtl] .chatlist .mention-badge{margin-left:-.125rem}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread,.chatlist .no-unmuted-topic .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist .not-visited{background-color:#c4c9cc!important;background-color:var(--secondary-color)!important}.chatlist .not-visited{--size:.5rem;--padding:0}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{margin-bottom:0!important}.chatlist-bottom .sidebar-left-section{padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chat-input{--translateY:0;--padding-bottom:0.5rem;--bottom:var(--padding-bottom);display:flex;flex:0 0 auto;flex-direction:column;max-width:100%;padding-top:.25rem;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .chat-input{transition:none!important}@media only screen and (min-height:570px)and (min-width:601px){.chat-input{max-width:728px!important;max-width:var(--messages-container-width)!important}}@media only screen and (min-width:601px){.chat-input{--padding-bottom:1.25rem}}@media only screen and (max-height:569px){.chat-input{--padding-bottom:0.5rem}}@media only screen and (min-width:1276px){.chat-input{width:calc(100% - var(--right-column-width))!important}body.is-right-column-shown .chat-input{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0)!important}body.is-right-column-shown .chat-input{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{position:absolute!important;transform:translate3d(0,var(--translateY),0)!important}.chat-input.is-hidden{--translateY:100%;bottom:0;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY:0}.chat-input-container{--padding-horizontal:var(--chat-input-padding);align-items:flex-end;display:flex;flex:0 0 auto;justify-content:center;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);padding:0 var(--padding-horizontal);padding-bottom:var(--bottom);position:relative;width:100%}.chat-input-container .btn-circle{height:var(--chat-input-size);width:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{border-bottom-right-radius:12px;max-height:var(--chat-input-size)}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{opacity:0;transform:scaleX(-1) translateX(1.125rem)}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0!important}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s 75ms}.chat-input-container.is-centering.animating .btn-send{transition:transform .2s}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 75ms}.chat-input .menu-send{bottom:calc(100% + .5rem);top:auto}.chat-input .input-message-input{--custom-emoji-size:var(--messages-custom-emoji-size);background:none;border:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);margin-top:-1px;max-height:27.5rem;outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height:30rem){.chat-input .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.chat-input .toggle-emoticons:before{content:""}.chat-input .toggle-emoticons.flip-icon:before{content:""!important}[dir=ltr] .chat-input .btn-record-cancel{right:0}[dir=rtl] .chat-input .btn-record-cancel{left:0}.chat-input .btn-record-cancel{--multiplier:-1;opacity:0;padding:0;position:absolute;top:0;transform:translateX(calc((100% + var(--padding-horizontal) + .5rem)*var(--multiplier)));visibility:hidden;z-index:3}.chat-input .btn-record-cancel .c-ripple__circle,html.no-touch .chat-input .btn-record-cancel:active:after,html.no-touch .chat-input .btn-record-cancel:hover:after{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.chat-input .btn-record-cancel:before{color:#df3f40;color:var(--danger-color)}.is-rtl .chat-input .btn-record-cancel{--multiplier:1}[dir=ltr] .chat-input .btn-scheduled:after{right:5px}[dir=rtl] .chat-input .btn-scheduled:after{left:5px}.chat-input .btn-scheduled:after{background:#61c642;background:var(--message-checkbox-color);border-radius:50%;content:"";height:.5rem;position:absolute;top:5px;width:.5rem}.chat-input .btn-preloader .preloader{height:1.5rem;width:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{animation:hide-icon .4s ease-in-out forwards!important}[dir=ltr] .chat-input .float{margin-right:.75rem!important}[dir=rtl] .chat-input .float{margin-left:.75rem!important}.chat-input .float{display:none!important;margin:0!important}.chat-input .float{align-self:center}body.animation-level-2 .chat-input .float{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){[dir=ltr] .chat-input .float{margin-right:.125rem!important}[dir=rtl] .chat-input .float{margin-left:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}[dir=ltr] .chat-input .btn-send-container{right:var(--padding-horizontal)}[dir=rtl] .chat-input .btn-send-container{left:var(--padding-horizontal)}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-cancel-record,.chat-input .btn-send{box-shadow:0 1px 8px 1px rgba(0,0,0,.12)}.chat-input .btn-send{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important}.chat-input .btn-send{z-index:3}html.no-touch .chat-input .btn-send:active,html.no-touch .chat-input .btn-send:hover{background-color:#2086ea!important;background-color:var(--dark-primary-color)!important}.chat-input .btn-send .tgico-check{height:32px!important}.chat-input .btn-send .tgico-check{font-size:2rem}.chat-input .btn-send .tgico-check:before{font-weight:500;font-weight:var(--font-weight-bold)}.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.record .tgico-microphone_filled,.chat-input .btn-send.schedule .tgico-schedule,.chat-input .btn-send.send .tgico-send{visibility:visible!important}body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone_filled,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule,body.animation-level-2 .chat-input .btn-send.send .tgico-send{animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem}.chat-input .record-time{display:none;height:44px;line-height:44px}.chat-input .record-time:after{background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;content:" ";display:inline-block;height:10px;margin-left:9px;margin-right:9px;width:10px}body.animation-level-2 .chat-input .record-time:after{animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;height:300px;opacity:.5;position:absolute;transform:scale(0);visibility:hidden;width:300px}@media only screen and (max-width:600px){.chat-input .record-ripple{height:240px;width:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-record-cancel,.chat-input.is-recording:not(.backwards) .btn-send{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - var(--chat-input-size)*2 - 1rem)}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}[dir=ltr] .chat-input:not(.is-recording) .btn-record-cancel{margin-right:0}[dir=rtl] .chat-input:not(.is-recording) .btn-record-cancel{margin-left:0}.chat-input:not(.is-recording) .btn-record-cancel{width:0}.chat-input .new-message-wrapper{opacity:1}.chat-input .reply-in-topic-overlay{align-items:center;background-color:inherit;border-radius:inherit;color:#707579;color:var(--secondary-text-color);display:flex;justify-content:center;padding:0 1rem;pointer-events:none;z-index:3}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}#column-center{flex:3;position:relative;width:100%}@media only screen and (max-width:600px){body.is-left-column-shown #column-center{transform:translate3d(100vw,0,0)}body.is-right-column-shown #column-center{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px)and (max-width:925px){#column-center{position:fixed!important}#column-center{bottom:0;left:0;right:0;top:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem,0,0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{display:flex!important}.chat{align-items:center;flex-direction:column;transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition);width:100%}body.animation-level-0 .chat{transition:none!important}.chat:not(.active):not(:last-child){filter:brightness(.8)}@media only screen and (min-width:926px){.chat:not(.active){transform:translate3d(calc((100vw - min(40vw, 420px))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(40vw, 420px)),0,0)}}@media only screen and (min-width:1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)),0,0)}}@media only screen and (min-width:1276px)and (max-width:1680px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(75vw,0,0)}}@media only screen and (max-width:925px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(100vw,0,0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.chat-background{background-color:#e6ebee;overflow:hidden}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none!important}.chat-background,.chat-background-item{position:absolute!important}.chat-background,.chat-background-item{bottom:0;left:0;right:0;top:0}.chat-background-item.is-image{background-color:inherit;background-image:url(assets/img/bg.jpeg);background-position:50%;background-size:cover}.chat-background-item.is-pattern{background-color:#000!important;background-image:none!important;margin:0!important}.chat-background-item.is-pattern{align-items:center;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center}@media only screen and (min-width:1276px){.chat-background-item.is-pattern{height:150%;top:-25%}}body.animation-level-2 .chat-background-item{opacity:0;transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}@media only screen and (min-width:1276px){body.animation-level-2 .chat-background-item{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)!important}body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center}body.animation-level-2.is-right-column-shown .chat-background-item{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)!important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(.666666667)}}.chat-background-item-canvas{--opacity-max:1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item:not(.is-dark) .chat-background-item-pattern-canvas{mix-blend-mode:soft-light}.chat-background-item-color-canvas{height:100%;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:cover;mask-size:cover}.chat .drops-container{--padding:20px;--pinned-floating-height:0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width:1276px){[dir=ltr] body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}[dir=rtl] body.is-right-column-shown .chat .drops-container{left:calc(var(--right-column-width))}}@media only screen and (max-width:600px){.chat .drops-container{--padding:10px}}.chat .drop{--wrapper-padding:15px;max-width:696px}.chat[data-type=chat] .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat-input-wrapper{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);--button-size:2.125rem;--button-horizontal-margin:.125rem;align-items:center;border-radius:1rem;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;max-height:30rem;max-width:calc(100% - var(--chat-input-size) - .5rem);min-height:var(--chat-input-size);position:relative;width:calc(100% - var(--chat-input-size) - .5rem);z-index:3}.chat-input-wrapper:before{border-radius:inherit;bottom:0;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);content:" ";left:0;opacity:1;right:0;top:0}.chat-input-control,.chat-input-wrapper:before{background-color:#fff;background-color:var(--surface-color);position:absolute}.chat-input-control{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);height:var(--chat-input-size);margin:0 auto;padding:var(--padding);visibility:hidden;width:auto;z-index:3}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;justify-content:center;padding:0 .625rem}@media only screen and (max-width:600px){.chat-input-control-button{font-size:15px}}[dir=ltr] .chat-input-control-button:before{margin-right:10px}[dir=rtl] .chat-input-control-button:before{margin-left:10px}.fake-selection-wrapper,.selection-wrapper{max-width:calc(100% - var(--chat-input-padding)*2);position:absolute;top:0;width:28.75rem}.chat-input-control,.selection-wrapper{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{align-items:center;border-radius:inherit;display:flex;font-size:15px;height:100%;justify-content:space-between;padding:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{align-items:center;display:flex;justify-content:space-between;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);text-transform:capitalize;white-space:nowrap}[dir=ltr] .selection-wrapper .selection-container .btn-icon{margin-left:6px;margin-right:5px}[dir=rtl] .selection-wrapper .selection-container .btn-icon{margin-left:5px;margin-right:6px}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;width:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width:600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width:380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}[dir=ltr] .selection-wrapper .selection-container-forward:before{margin-right:14px}[dir=rtl] .selection-wrapper .selection-container-forward:before{margin-left:14px}[dir=ltr] .selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}[dir=rtl] .selection-wrapper .selection-container-delete{margin-left:.625rem;margin-right:.375rem}[dir=ltr] .selection-wrapper .selection-container-delete:before{margin-right:10px}[dir=rtl] .selection-wrapper .selection-container-delete:before{margin-left:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}[dir=ltr] .fake-rows-wrapper{left:var(--padding-horizontal)}[dir=rtl] .fake-rows-wrapper{right:var(--padding-horizontal)}.fake-rows-wrapper{top:0;width:calc(100% - var(--chat-input-size) - var(--padding-horizontal)*2 - .5rem)}.rows-wrapper-wrapper{display:flex;width:100%}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s .15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s 75ms,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity .1s 0s,visibility 0s .2s}[dir=ltr] .rows-wrapper{border-bottom-right-radius:0}[dir=rtl] .rows-wrapper{border-bottom-left-radius:0}.rows-wrapper{transform:translateX(0) scaleX(1)}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width:600px){.rows-wrapper{--padding-vertical:1px}}@media only screen and (max-width:420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height:569px){.rows-wrapper{--padding-vertical:1px}}[dir=ltr] .rows-wrapper .bubble-tail{right:-8.4px}[dir=rtl] .rows-wrapper .bubble-tail{left:-8.4px}.rows-wrapper .bubble-tail{fill:#fff;fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;transform:scaleX(-1);width:11px}.is-rtl .rows-wrapper .bubble-tail{transform:scaleX(1)}.rows-wrapper .attach-file.menu-open{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important}.rows-wrapper .attach-file.menu-open{color:#3390ec;color:var(--primary-color)}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:1rem;display:flex;justify-content:space-between;padding:var(--padding);position:relative;width:100%}.rows-wrapper .reply-wrapper{align-items:center;height:0;justify-content:flex-start;margin-bottom:-.5625rem;opacity:0;padding:.5625rem var(--padding-horizontal) 0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .reply-wrapper{margin-bottom:-.3125rem;padding-top:.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{height:45px;opacity:1;pointer-events:inherit}.rows-wrapper .reply-wrapper .reply{flex:1 1 auto;margin-left:.625rem;margin-right:.625rem;order:1}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579!important;color:var(--secondary-text-color)!important}.rows-wrapper .reply-wrapper .reply-subtitle{height:1.125rem}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:3.125rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:3.125rem}.rows-wrapper .reply-wrapper .btn-menu{transform:scale(1)!important}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);top:auto}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item{padding-left:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-right:var(--icon-margin)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-left:var(--icon-margin)}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0;order:0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#000;stroke:var(--primary-text-color)}@media only screen and (max-width:600px){[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:calc(var(--padding-horizontal)*-1)}}.rows-wrapper .new-message-wrapper{--send-as-size:1.875rem;--send-as-margin-left:.25rem;--send-as-margin-right:.375rem;--send-as-total-size:calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size:2.375rem;--commands-margin-left:.25rem;--commands-margin-right:.375rem;--commands-total-size:calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX:0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;flex:0 0 auto;opacity:0;position:absolute;transform:scale(0);z-index:2}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-left:var(--commands-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-right:var(--commands-margin-left)}.rows-wrapper .new-message-wrapper .new-message-bot-commands{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:1.875rem;cursor:pointer;display:flex;height:1.875rem;justify-content:center;width:var(--commands-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{align-items:center;display:flex;justify-content:center;transform:scale(.875)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color:#fff}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-left:var(--send-as-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-right:var(--send-as-margin-left)}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container{height:var(--send-as-size);width:var(--send-as-size)}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:auto}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:auto}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:calc(var(--padding-horizontal)*-1 - .25rem)!important}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:calc(var(--padding-horizontal)*-1 - .25rem)!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;max-height:20rem;max-width:20rem;top:auto;transform:scaleX(1);width:auto}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item{height:2.25rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-header{height:1.875rem}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset:-.125rem;border:.0625rem solid #3390ec;border:.0625rem solid var(--primary-color);border-radius:inherit;bottom:var(--offset);content:" ";left:var(--offset);position:absolute;right:var(--offset);top:var(--offset)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{line-height:1!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{display:flex;flex-direction:column;justify-content:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-subtitle{font-size:.8125rem;font-weight:400}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{opacity:0;pointer-events:none;position:absolute;transform:scale(0)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;color:#fff;display:flex;font-size:1.375rem;height:inherit;justify-content:center;width:inherit;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX:var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX:48px}.rows-wrapper .new-message-wrapper.has-offset .input-message-container,.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}[dir=ltr] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-right:var(--translateX)}[dir=rtl] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-left:var(--translateX)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container{opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .input-message-container{align-items:center;align-self:center;display:flex;flex:1 1 auto;max-height:inherit;min-height:calc(var(--chat-input-size) - var(--padding-vertical)*2);overflow:hidden;position:relative;width:1%}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin-bottom:5px;margin-left:var(--button-horizontal-margin);margin-right:var(--button-horizontal-margin);margin-top:0;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY:0;flex:1 1 auto;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles{transition:none!important}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-78px;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}@media only screen and (max-width:600px){.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transform:translateY(calc(var(--translateY)*-1));transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles>.scrollable{display:block;height:auto}@media only screen and (min-width:1276px){body.is-right-column-shown .bubbles{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}body.animation-level-2 .bubbles.is-selecting .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting .is-in .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.animation-level-2 .bubbles.is-selecting:not(.backwards) .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:translateX(2.5rem) scale(1)}.bubbles.is-selecting:not(.backwards) .bubbles-group-avatar{transform:translate3d(2.5rem,0,0) scale3d(.76,.76,1)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:opacity var(--layer-transition),visibility 0s 0s!important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY:calc(var(--chat-input-size)*-1 - 0.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{display:flex;flex-direction:column;justify-content:flex-end;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);min-height:100%;padding:0 .8125rem;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles-inner{transition:none!important}@media only screen and (min-width:1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width:600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner:after{content:" ";height:.125rem}[dir=ltr] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}[dir=rtl] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-right:45px}@media only screen and (max-width:600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - 2.875rem)!important;max-width:calc(100% - var(--message-beside-button-margin)*-1)!important}.bubbles-inner.is-chat .message,.bubbles-inner.is-chat .name,.bubbles-inner:not(.is-channel) .message,.bubbles-inner:not(.is-channel) .name{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999!important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY)*-1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width:1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{transform:none!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-down{cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-mention{--translateY:0;cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention.is-visible{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s!important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;visibility:visible}.chat-secondary-button{background-color:#fff!important;background-color:var(--surface-color)!important;box-shadow:0 1px 8px 1px rgba(0,0,0,.12)!important}.chat-secondary-button{align-items:center;border-radius:50%;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;position:absolute}body.animation-level-0 .chat-secondary-button{transition:none!important}.chat-secondary-button:before{position:relative}.chat-secondary-button:after{border-radius:inherit;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}html.no-touch .chat-secondary-button:active:after,html.no-touch .chat-secondary-button:hover:after{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}[dir=ltr] .bubbles-corner-button{right:var(--chat-input-padding)}[dir=rtl] .bubbles-corner-button{left:var(--chat-input-padding)}.bubbles-corner-button{bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);overflow:visible;z-index:2}[dir=ltr] .bubbles-corner-button .badge{right:-.25rem}[dir=rtl] .bubbles-corner-button .badge{left:-.25rem}.bubbles-corner-button .badge{position:absolute;top:-.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width:600px){[dir=ltr] .bubbles-corner-button .badge{right:.1875rem}[dir=rtl] .bubbles-corner-button .badge{left:.1875rem}.bubbles-corner-button .badge{top:-.75rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height:var(--topbar-call-height)}@media only screen and (min-width:1276px){body.is-right-column-shown{--topbar-floating-scaleX:calc(1 - var(--right-column-proportion))}}.topbar{cursor:pointer!important;max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important}.topbar{--topbar-height:3.5rem;--pinned-floating-audio-height:0px;--pinned-floating-message-height:0px;--pinned-floating-height:calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height:52px;--pinned-message-height:52px;margin-bottom:var(--pinned-floating-height);position:relative;width:100%;z-index:1}.topbar:before{box-shadow:0 1px 5px -1px rgba(0,0,0,.21);content:" ";height:calc(var(--topbar-height) + var(--pinned-floating-height));height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));left:0;pointer-events:none;position:absolute;right:0;top:0}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height:var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height:var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width:601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width:926px){.chat:first-child .topbar .sidebar-close-button{display:none}[dir=ltr] .chat:first-child .topbar .chat-info{padding-left:.1875rem}[dir=rtl] .chat:first-child .topbar .chat-info{padding-right:.1875rem}}@media only screen and (min-width:1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{align-items:center;display:flex;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.5rem;max-width:calc(100% - 1.5rem)}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .info,.topbar .peer-title{line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 4.375rem);max-height:calc(var(--vh)*100 - 4.375rem);top:calc(100% + 7px)}@media only screen and (max-width:600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);top:29px}.topbar .btn-menu-toggle{margin-left:0}}[dir=ltr] .topbar .chat-info{padding-left:49px}[dir=rtl] .topbar .chat-info{padding-right:49px}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden}@media only screen and (max-width:600px){[dir=ltr] .topbar .chat-info{padding-left:52px}[dir=rtl] .topbar .chat-info{padding-right:52px}}@media only screen and (min-width:1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{align-items:center;display:flex;flex:1 1 auto;height:3.5rem;justify-content:space-between;max-height:3.5rem;max-width:100%}.topbar .chat-utils{align-items:center;display:flex;flex:0 0 auto}@media only screen and (min-width:1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width:600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}[dir=ltr] .topbar .chat-join{margin-right:.5rem}[dir=rtl] .topbar .chat-join{margin-left:.5rem}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}[dir=ltr] .topbar .content{padding-left:1.125rem}[dir=rtl] .topbar .content{padding-right:1.125rem}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden}.topbar .person{align-items:center;display:flex}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height:0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}[dir=ltr] .chat:not([data-type=chat]) .topbar .content{padding-left:16px}[dir=rtl] .chat:not([data-type=chat]) .topbar .content{padding-right:16px}[dir=ltr] .topbar-call-container{left:1px;right:0}[dir=rtl] .topbar-call-container{left:0;right:1px}.topbar-call-container{cursor:pointer!important;height:3rem!important;height:var(--topbar-call-height)!important;min-height:auto!important}.topbar-call-container{color:#fff;position:absolute;top:-3rem;top:calc(var(--topbar-call-height)*-1);z-index:2}body:not(.has-chat) .topbar-call-container{background:none!important}@media only screen and (max-width:925px){[dir=ltr] .topbar-call-container{left:0}[dir=rtl] .topbar-call-container{right:0}}.topbar-call-container .btn-icon{color:inherit;flex:0 0 auto;height:2.5rem;padding:0;width:2.5rem}.topbar-call-container .peer-title{font-weight:500;font-weight:var(--font-weight-bold);white-space:nowrap}@media only screen and (max-width:480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{align-items:center;display:flex}[dir=ltr] .topbar-call-left .btn-icon{margin-right:.375rem}[dir=rtl] .topbar-call-left .btn-icon{margin-left:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:500;font-weight:var(--font-weight-bold)}.topbar-call-center{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media only screen and (min-width:1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width)*-.5),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}.topbar-call-center{padding:0 calc(var(--right-column-width)/2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width:1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{bottom:-1.125rem;left:0;pointer-events:none;position:absolute;right:0;top:0;transform:scaleY(-1);transform:scale(var(--topbar-floating-scaleX),-1);transform-origin:left center;z-index:-1}.is-rtl .topbar-call-weave{transform-origin:right center}@media only screen and (min-width:1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{height:100%;width:100%}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubbles-group{position:relative}.bubbles-group-avatar{position:sticky!important}.bubbles-group-avatar{bottom:.25rem;cursor:pointer;pointer-events:all;top:0}.bubbles.is-selecting .bubbles-group-avatar{transform:translateZ(0) scaleX(1);transform-origin:bottom}.bubbles-group-avatar-container{bottom:0;display:flex;flex-direction:column-reverse;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:2}.bubble{--line-height:var(--messages-line-height);display:flex;flex-wrap:wrap;margin:0 auto .125rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:1}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;color:#fff;display:flex;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;opacity:0;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);top:50%;transform:translateY(-50%);transform:translateY(-50%) scale(.6);visibility:hidden;width:2.375rem;width:var(--message-beside-button-size)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem!important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{transform:translateY(-50%) scale(1);visibility:visible}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{bottom:-.0625rem;content:" ";left:-50%;position:absolute;top:-.0625rem;z-index:-1}.bubble.is-highlighted:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{animation:bubbleSelected 2s linear}@media only screen and (max-width:600px){.bubble.is-first-unread{max-width:none}}.bubble.is-first-unread:before{background-color:#fff;background-color:var(--surface-color);color:#3390ec;color:var(--primary-color);content:"Unread messages";font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);height:30px;line-height:2.1;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;position:relative;text-align:center;z-index:2}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(.0625rem + 30px)}.bubble.is-selected:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{display:block;width:200%}.bubble.is-multiple-documents:after,.bubble.is-multiple-documents:before{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0!important}.bubble-select-checkbox{display:flex;left:0;margin:0;position:absolute;z-index:3}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none!important}.bubbles.is-selecting .bubble a,.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video{pointer-events:none}.bubble-content{background-color:#fff;background-color:var(--message-background-color);border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);display:flex;flex-direction:column-reverse;max-width:100%;min-width:56px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}body.animation-level-0 .bubble-content{transition:none}html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content,html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content{-webkit-user-select:text;-moz-user-select:text;user-select:text}.bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(-1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button.goto-original{transform:translateX(-1.125rem) rotate(180deg)}.bubble-hover-reaction{--size:1.875rem;--offset:calc(var(--size)*-0.75);align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:var(--size);bottom:0;box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);cursor:pointer;display:flex;height:1.625rem;justify-content:center;opacity:0;position:absolute;right:var(--offset);transform:scale(.8);width:var(--size);z-index:2}body.animation-level-2 .bubble-hover-reaction{transition:opacity .2s cubic-bezier(.34,1.56,.64,1),transform .2s cubic-bezier(.34,1.56,.64,1);transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){opacity:1;transform:scale(1)}.bubble-hover-reaction-sticker{height:1.125rem;position:relative;width:1.125rem}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{box-shadow:none;margin:0 auto;max-width:100%}.bubble.is-date{font-weight:500;font-weight:var(--font-weight-bold);opacity:.99999;padding-bottom:.375rem;pointer-events:none;position:sticky;top:.25rem;transition:opacity .3s ease;z-index:2}.bubble.is-date:after,.bubble.is-date:before{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat[data-type=chat] .bubble.is-date .bubble-content,.chat[data-type=discussion] .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubbles:not(.has-sticky-dates) .bubble.is-date{visibility:hidden}.bubbles.has-sticky-dates .bubble.is-date.is-fake{display:none}.bubble.is-date.is-fake{opacity:1!important;transition:none!important;visibility:visible!important}.bubble.is-date.is-fake{left:50%;position:absolute;top:0;transform:translateX(-50%)}.bubble-beside-button{align-items:center;background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border-radius:50%;bottom:0;color:#fff;color:var(--badge-text-color);cursor:pointer;display:flex;font-size:1.5rem;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);transform:translateX(0);width:2.375rem;width:var(--message-beside-button-size)}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.bubble-view-button{text-decoration:none!important}.bubble-view-button{align-items:center;border:1px solid #3390ec;border:1px solid var(--message-primary-color);border-radius:6px;color:#3390ec;color:var(--message-primary-color);display:flex;height:2rem;justify-content:center;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble-view-button:active,html.no-touch .bubble-view-button:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble-view-button .c-ripple__circle{background-color:#3390ec;background-color:var(--message-primary-color);opacity:.08}.message .bubble-view-button{margin:.375rem 0 -.375rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.bubble-view-button+.reactions-block{margin-top:.375rem}html.no-touch .bubble:active .bubble-beside-button,html.no-touch .bubble:hover .bubble-beside-button{opacity:1}.bubble .forward{font-size:1.25rem}.bubble.is-group-last{margin-bottom:.5rem}.bubble.is-group-last:after{bottom:-.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0!important}.bubble.webpage .preview-with-document{min-width:100%}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width:600px){.bubble.webpage .document{padding-left:44px}}.bubble.webpage .has-document{display:flex;flex-direction:column}.bubble.webpage .has-document .preview-resizer{order:1}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;vertical-align:bottom;width:18px}.bubble .thumbnail{position:absolute}.bubble .canvas-thumbnail{border-radius:inherit}.bubble .canvas-dots{z-index:1}.bubble.emoji-big{--emoji-size:1rem;font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big .attachment{border-radius:0!important}.bubble.emoji-big .attachment{--custom-emoji-size:var(--emoji-size)}.bubble.emoji-big .attachment img.emoji{height:var(--emoji-size);max-height:64px;max-width:64px;width:var(--emoji-size)}.bubble.emoji-big .attachment .custom-emoji,.bubble.emoji-big .attachment .emoji{display:inline-block}.bubble.emoji-big:not(.sticker) .attachment{max-height:-moz-fit-content!important;max-height:fit-content!important}.bubble.emoji-big:not(.sticker) .attachment{display:block;font-size:var(--emoji-size);padding-bottom:1.25rem;padding-top:.25rem;white-space:pre-wrap;word-break:break-word}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-big:not(.sticker) .bubble-content{max-width:min(420px,100%)}.bubble.just-media .bubble-content{background:none!important}.bubble.just-media .bubble-content{box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:rgba(109,141,65,.4);background:var(--message-highlightning-color)}.bubble.emoji-big:not(.sticker) .bubble-content,.bubble.sticker .bubble-content{align-self:flex-start}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{position:relative!important;right:0!important}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{margin-left:auto}.bubble.sticker .attachment{border-radius:0;position:absolute;z-index:1}.bubble.round .attachment{height:280px!important;height:var(--round-video-size)!important;max-height:280px!important;max-height:var(--round-video-size)!important;max-width:280px!important;max-width:var(--round-video-size)!important;width:280px!important;width:var(--round-video-size)!important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{border-radius:inherit;cursor:pointer;display:flex;justify-content:center;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.bubble .attachment .download span{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;font-size:23px;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{margin:0 auto;position:relative;z-index:1}.bubble .media-container-fitted{background-color:transparent!important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-height:min(340px,100%);max-width:min(420px,100%);width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-height:none;max-width:min(451px,100%)}.bubble .album-item{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);cursor:pointer;max-width:100%;overflow:hidden;position:absolute}body.animation-level-0 .bubble .album-item{transition:none!important}.bubble .album-item img,.bubble .album-item video,.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none!important}.bubble .album-item .bubble-select-checkbox{bottom:auto!important}.bubble .album-item .bubble-select-checkbox{left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4,0,.2,1),border-radius .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transform:scale(.883333);transition:transform .3s cubic-bezier(.4,0,.2,1),border-radius .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:active,html.no-touch .bubble a:hover{text-decoration:underline}.bubble-first{align-items:center;justify-content:center;margin-top:.5rem;max-width:100%;order:-1}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .attachment{pointer-events:none}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{align-items:flex-start!important;padding:.75rem 1rem .875rem!important}.bubble-first.empty-bubble-placeholder.has-description .service-msg{flex-direction:column}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-size:1rem!important}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{font-size:1.25rem;margin-left:-.1875rem;margin-right:.25rem;vertical-align:bottom}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubbles.has-groups .bubble-first.empty-bubble-placeholder{pointer-events:none}.bubbles.has-groups .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem!important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{margin-top:.75rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{cursor:pointer;height:200px;position:relative;width:200px}.bubble-first .time{display:none!important}.bubble-first:after,.bubble-first:before{display:none}.bubble .web{line-height:1.3125;line-height:var(--line-height);margin:.125rem 0 0;max-width:100%;overflow:hidden}.bubble .web+.time{display:block}.bubble .web .preview{border-radius:4px;cursor:pointer;max-height:min(340px,100%);max-width:min(420px,100%);overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .text,.bubble .web .title,.bubble .web .webpage-name{font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:active,html.no-touch .bubble .web .webpage-name:hover{text-decoration:underline}.bubble .web .text{margin-top:1px;word-break:break-word}.bubble .web .quote{display:flex;max-width:100%;overflow:hidden;width:100%}.bubble .web .quote-text{margin-left:-.625rem;max-width:100%;padding-left:.625rem;width:100%}.bubble .web .quote:before{background-color:#3390ec;background-color:var(--primary-color);border-radius:.125rem;content:" ";flex:0 0 auto;margin:.1875rem .5rem .125rem 0;width:.125rem}.bubble .reply{--font-size:var(--messages-secondary-text-size)}.bubble .document-name{font-size:16px;font-size:var(--messages-text-size)}.bubble .document-size{font-size:14px;font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{float:right;height:3rem;margin:.1875rem 0 0 .625rem;width:3rem}.bubble.is-square-photo .web .preview{margin:0;max-height:min(3rem,100%);max-width:min(3rem,100%)}.bubble .reply{border-radius:.25rem;cursor:pointer;margin:0 .375rem .375rem;min-width:10rem;padding:.25rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{height:auto;max-width:calc(100% - 1.25rem);min-height:32px;overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.bubble .message+.reply{margin-bottom:0}.bubble:not(.just-media) .reply{border-radius:6px}html.no-touch .bubble:not(.just-media) .reply:active,html.no-touch .bubble:not(.just-media) .reply:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble.just-media .floating-part{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:12px;margin:0;max-width:15rem;padding:.375rem .625rem;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .floating-part{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important}.bubble.just-media .name{line-height:1.3125;line-height:var(--line-height);padding:.375rem .625rem}.bubble.just-media .name .peer-title{font-weight:400!important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width:600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{max-width:none!important}.bubble.just-media .reply-content{margin-top:0;position:relative}.bubble.just-media .reply i,.bubble.just-media .reply-subtitle,.bubble.just-media .reply-title{color:#fff!important}.bubble.just-media .reply-border{background:#fff!important}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message,.bubble .service-msg{--custom-emoji-size:var(--messages-custom-emoji-size)}.bubble .message{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);max-width:100%;padding:0 .5rem .375rem .625rem;position:relative;white-space:pre-wrap;word-break:break-word}.bubble .message .custom-emoji{display:inline-flex}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width:600px){.bubble .audio,.bubble .document{--icon-size:2.25rem}}.bubble .audio .audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width:600px){.bubble .audio{--icon-margin:.6875rem;height:2.375rem}.bubble .audio .audio-details{margin-bottom:0;margin-top:2px}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{max-width:min(100%,335px)!important}.bubble .message.audio-message{width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{max-width:min(100%,300px)!important}.bubble .message.audio-message{width:280px}}.bubble .message.voice-message .document-message{max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px!important}.bubble .message.call-message,.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{cursor:pointer;display:flex;padding:2px 0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{display:flex;flex-direction:column;margin-top:8px;padding-left:12px}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold)}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px!important}.bubble .message.document-message .document{--icon-margin:.75rem;height:58px}@media only screen and (max-width:600px){.bubble .message.document-message .document{--icon-margin:.5rem;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.125rem 0 .125rem 2.5625rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble-call:before{font-size:1.5rem;left:.3125rem;position:absolute}.bubble-call-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-call-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height);margin-left:-.1875rem;margin-top:.0625rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:"";display:inline-block;font-size:1rem;transform:rotate(135deg)}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document .time{align-self:flex-start;height:0}.bubble .document-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{padding:0!important}.bubble.is-multiple-documents .message{border-radius:inherit}.bubble.is-multiple-documents .document-container{border-radius:inherit;position:relative}.bubble.is-multiple-documents .document-container .document-selection{bottom:0;left:-75vw;position:absolute;top:0;width:200vw;z-index:-2}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:#fff;background-color:var(--message-background-color);border-radius:inherit;bottom:0;content:" ";left:0;position:absolute;right:0;top:0;z-index:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection{animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection{animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top:.25rem;--margin-left:.125rem;background:#fff;border-radius:50%;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size:1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size:.125rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit;content:" ";height:calc(var(--size) - var(--inner-size)*2);left:var(--inner-size);position:absolute;top:var(--inner-size);width:calc(var(--size) - var(--inner-size)*2)}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-.0625rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{border-top-left-radius:inherit;border-top-right-radius:inherit;padding-top:.5rem}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-.0625rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding-bottom:.5rem}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-.25rem}.bubble.is-multiple-documents .document{height:54px!important}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document{height:38px!important}}.bubble.is-multiple-documents .document-wrapper{padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{margin-top:-.1875rem;padding:0 0 .25rem}.bubble .message .audio .time,.bubble .message.contact-message .time,.bubble .message.poll-message .time{bottom:0;position:absolute;right:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .bubble-content-wrapper{width:-moz-min-content;width:min-content}.bubble.is-message-empty .message{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:.75rem;bottom:.1875rem;padding:0 .3125rem;position:absolute;right:.1875rem;z-index:2}.bubble.is-message-empty .message .time{align-items:center;display:flex;height:calc(12px + .375rem);height:calc(var(--messages-time-text-size) + .375rem);margin:0;padding:0;white-space:nowrap}.bubble.is-message-empty .message .time .inner{bottom:auto;color:#fff;margin:inherit;right:auto}.bubble.is-message-empty .message .time .inner:after{color:#fff!important}.bubble.is-message-empty.with-replies:not(.sticker):not(.with-beside-replies) .message{bottom:55px}.bubble.is-message-empty.emoji-big .message,.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):active:after,html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):hover:after{background-color:#fff}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble.with-beside-replies .bubble-content{min-height:5.5rem}.bubble .colored-name .premium-icon{color:inherit;opacity:.6}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:12px;font-size:var(--messages-time-text-size);height:12px;height:var(--messages-time-text-size);line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;visibility:hidden;z-index:1}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{font-size:inherit;overflow:visible}.bubble .time .inner{align-items:center;bottom:0;display:flex;height:12px;height:var(--messages-time-text-size);line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble .time.is-block{display:block;float:none}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{--height:calc(var(--messages-time-text-size) + 0.375rem);align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:var(--height);color:#fff;display:flex;font-size:12px;font-size:var(--messages-time-text-size);height:var(--height);left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:"";font-size:20px;font-size:calc(var(--messages-time-text-size) + 8px);padding:0 1px 0 3px}[dir=ltr] .bubble .video-time.is-error:after{margin-left:1px}[dir=rtl] .bubble .video-time.is-error:after{margin-right:1px}.bubble .video-time.is-error:after{content:"";font-size:16px;font-size:calc(var(--messages-time-text-size) + 4px);padding:0}.bubble .extended-media-buy{align-items:center;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(0,0,0,.3);border-radius:2rem;color:#fff;display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;left:50%;padding:0 1rem;position:absolute;top:50%;transform:translate(-50%,-50%);white-space:nowrap;z-index:2}.bubble .extended-media-buy:before{font-size:1.125rem;margin-right:.25rem}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;display:flex;font-size:2.125rem;justify-content:center;text-align:center;z-index:2}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.bubble .name{color:#3390ec;color:var(--primary-color);font-size:14px;font-size:var(--messages-secondary-text-size);line-height:calc(14px + .25rem);line-height:calc(var(--messages-secondary-text-size) + .25rem);max-width:100%;overflow:hidden;padding:.375rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo:not(.is-reply) .bubble-content>.name,.bubble:not(.webpage).video:not(.is-reply) .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage).photo .topic-name-button-container,.bubble:not(.webpage).video .topic-name-button-container{margin-bottom:0}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big):not(.forwarded).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.forwarded):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{fill:#fff;fill:var(--message-background-color);display:block;height:20px;position:absolute;transform:translateY(1px);width:11px;z-index:-2}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail,.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{border-radius:inherit;cursor:pointer}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.bubble .replies .rp{border-radius:inherit;cursor:pointer;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.bubble .replies-beside{border-radius:2rem;bottom:47px;flex-direction:column;height:auto;max-height:52px;min-height:36px;padding:.375rem 0 .5rem;right:-44px;width:36px}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top:.0625rem solid #dfe1e5;border-top:.0625rem solid var(--border-color);color:#3390ec;color:var(--primary-color);display:flex;height:3.0625rem;min-width:15rem;padding:0 .5rem;position:relative}html.no-touch .bubble .replies-footer:active,html.no-touch .bubble .replies-footer:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .bubble .replies-footer:active~.bubble-tail,html.no-touch .bubble .replies-footer:hover~.bubble-tail{fill:#eff6fd;fill:var(--light-filled-message-primary-color)}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{align-items:center;color:#3390ec;color:var(--primary-color);display:flex;font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin-left:.5rem}.bubble .replies-footer-avatars{--margin-right:-.875rem;--border-size:2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:" ";height:.5rem;margin-left:.75rem;width:.5rem}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color:var(--light-filled-message-primary-color)}.bubble .message .reaction.is-chosen.backwards,.bubble .message .reaction:not(.is-chosen){--counter-color:var(--message-primary-color)}.bubble .message .reaction.is-chosen.backwards .stacked-avatars,.bubble .message .reaction:not(.is-chosen) .stacked-avatars{--border-color:var(--background-color)}.bubble .message .reactions-block .time{bottom:auto!important;position:static!important;right:auto!important}.bubble .message .reactions-block .time{order:100}.bubble code{cursor:pointer}.bubble.is-invoice .attachment{background-color:inherit!important}.bubble.with-reply-markup .bubble-content{border-bottom-left-radius:6px!important;border-bottom-right-radius:6px!important}.bubble .name-with-reply .name{padding:0!important}.bubble .name-with-reply .name:not(:last-child) .hide-ol{display:none}.bubble .name-with-reply .name:not(:last-child) .peer-title{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.bubble .name-with-reply .reply{height:auto;margin:.25rem 0 0;max-height:none;padding:0}.bubble .topic-name-button{--color:var(--message-primary-color)}.bubble .name .topic-name-button-container{margin:.25rem -.125rem}.bubble .name .topic-name-button-container:first-child{margin-top:0}.bubble.is-message-empty:not(.is-reply) .name .topic-name-button-container{margin-bottom:0}.bubble:not(.is-group-first) .topic-name-button-container{display:none!important}.bubble .topic-name-button-container.floating-part{font-size:14px;font-size:var(--messages-secondary-text-size);padding-bottom:0;padding-top:0}.bubble .topic-name-button-container.floating-part .topic-name-button{--color:#fff;padding:0}.bubble .topic-name-button-container.floating-part .topic-name-button:before{content:none}.bubble .topic-name-button-container.floating-part+.floating-part{margin-top:1.75rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.0625rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type .document-container:last-of-type .document-selection,.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type:after{bottom:-.0625rem}.can-zoom-fade{opacity:1;transform:scale(1) translateX(0);transform-origin:center}body.animation-level-2 .can-zoom-fade{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}.bubbles-inner.zoom-fading .can-zoom-fade{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.can-zoom-fade.zoom-fade{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-content-wrapper{display:flex;flex-direction:column}@media only screen and (min-width:601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width:600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:inherit;color:#fff;display:flex;font-size:15px;font-size:var(--messages-service-text-size);justify-content:center;line-height:20px;line-height:calc(var(--messages-service-text-size) + 5px);padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg .peer-title,.bubble.service .service-msg [data-saved-from],.bubble.service .service-msg a{cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold)}.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{text-decoration:underline}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0!important}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .floating-part{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .floating-part{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .audio-time,.bubble.is-in .contact-number{color:#707579!important;color:var(--secondary-text-color)!important}.bubble.is-in code,.bubble.is-in pre{color:#df3f40;color:var(--monospace-text-color)}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-border{background-color:rgb(var(--override-color))}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-title{color:rgb(var(--override-color))}html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:active,html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:hover{background-color:rgba(var(--override-color),.08)}.bubble.is-out{--message-background-color:var(--message-out-background-color);--light-message-background-color:var(--light-message-out-background-color);--dark-message-background-color:var(--dark-message-out-background-color);--link-color:var(--message-out-link-color);--message-primary-color:var(--message-out-primary-color);--light-filled-message-primary-color:var(--light-filled-message-out-primary-color);--selection-background-color:var(--message-out-selection-background-color);flex-direction:row-reverse}.bubble.is-out .bubble-content{margin-left:auto}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width:1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}body.animation-level-2 .bubble.is-out .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0!important}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .floating-part{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e!important;background-color:var(--message-out-primary-color)!important}.bubble.is-out:not(.just-media) .reply i,.bubble.is-out:not(.just-media) .reply-title{color:#4fae4e!important;color:var(--message-out-primary-color)!important}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{margin-left:-4px;padding-right:5px}.bubble.is-out .time .inner{bottom:4px;color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{color:#4fae4e;color:var(--message-out-primary-color);font-size:19px;font-size:calc(var(--messages-text-size) + 3px);line-height:12px;line-height:var(--messages-time-text-size);margin-left:1px}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time .inner:after,.bubble.is-out.is-read .time:after{content:""}.bubble.is-out.is-sent .time .inner:after,.bubble.is-out.is-sent .time:after{content:""}.bubble.is-out.is-sending .time .inner:after,.bubble.is-out.is-sending .time:after{content:""}.bubble.is-out.is-error .time .inner:after,.bubble.is-out.is-error .time:after{color:#df3f40;color:var(--message-error-color);content:""}.bubble.is-out .document-ico:after{border-right-color:#fff;border-right-color:var(--message-background-color);border-top-color:#fff;border-top-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e!important;fill:var(--message-out-primary-color)!important}.bubble.is-out .audio-subtitle,.bubble.is-out .audio-time{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-download,.bubble.is-out .audio-toggle,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color:var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .bubble-call-subtitle,.bubble.is-out .contact-number,.bubble.is-out .document-size{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#eeffde;color:var(--message-out-background-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-avatars .stacked-avatars{--border-color:var(--message-background-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color:var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color:var(--message-background-color)}.bubble.is-out .bubble-beside-button{left:-2.875rem;left:var(--message-beside-button-margin);right:auto}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{margin-top:.0625rem;width:100%}.bubble:not(.is-group-last) .reply-markup{margin-bottom:.125rem}.reply-markup-row{display:flex;margin-top:.125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child .reply-markup-button:first-child{border-bottom-left-radius:12px}.reply-markup-row:last-child .reply-markup-button:last-child{border-bottom-right-radius:12px}.reply-markup-button{color:#fff!important}.reply-markup-button{background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border:none;border-radius:.375rem;cursor:pointer;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button-text{pointer-events:none;position:relative}.reply-markup-button.anchor-url{text-decoration:none!important}.reply-markup-button+.reply-markup-button{margin-left:.125rem}.reply-markup-button .forward-icon,.reply-markup-button.tgico:before{display:block;position:absolute;right:.125rem;top:.125rem}.reply-markup-button.is-link:before{content:"";transform:rotate(-45deg)}.reply-markup-button.is-buy:before{content:""}.reply-markup-button.is-switch-inline:before{content:""}.bubble-beside-button:after,.bubble.just-media .reply:after,.reply-markup-button:after{background-color:#fff;border-radius:inherit;bottom:0;content:" ";display:block;left:0;opacity:0;position:absolute;right:0;top:0;z-index:-1}html.no-touch .bubble-beside-button:active:after,html.no-touch .bubble-beside-button:hover:after,html.no-touch .bubble.just-media .reply:active:after,html.no-touch .bubble.just-media .reply:hover:after,html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:.08;opacity:var(--hover-alpha)}.bubble-primary-color{color:#3390ec;color:var(--message-primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.pinned-message{--custom-emoji-size:calc(var(--font-size) + 2px)!important}.pinned-message-border{flex:0 0 auto;height:2rem;position:relative;width:.125rem}.pinned-message-border-wrapper-1{background:#3390ec;background:var(--primary-color);border-radius:1px;height:2rem;position:relative;top:50%;transform:translateY(-50%);width:.125rem}.pinned-message-border-mask{--mask-height:.375rem;--height:2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:after,.pinned-message-border-mask:before{content:" ";display:block;height:var(--mask-height);left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .pinned-message-border-mask:after,body.animation-level-2 .pinned-message-border-mask:before{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{background:linear-gradient(#fff,transparent);background:linear-gradient(var(--surface-color),transparent);top:0}.pinned-message-border-mask:after{background:linear-gradient(transparent,#fff);background:linear-gradient(transparent,var(--surface-color));bottom:0}.pinned-message-border-mask.mask-bottom:after,.pinned-message-border-mask.mask-top:before{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{background:#3390ec;background:var(--primary-color);bottom:0;content:" ";display:block;left:0;opacity:.4;position:absolute;right:0;top:0}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{background:currentColor;border-radius:1px;left:0;position:absolute;top:0;width:2px}body:not(.animation-level-0) .pinned-message-border-mark,body:not(.animation-level-0) .pinned-message-border-wrapper{transition:transform .25s ease-in-out;will-change:transform}.pinned-message-content{--height:32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{--font-size:var(--font-size-14);--custom-emoji-size:calc(var(--font-size) + 4px);--line-height:calc(var(--font-size) + 4px);align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.pinned-message-content,.reply-content{display:flex;flex-direction:column;flex-grow:1;flex-shrink:1;justify-content:center;margin-left:.5rem;overflow:hidden;pointer-events:none;position:relative}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-subtitle,.pinned-message-title,.reply-subtitle,.reply-title{font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;width:2rem!important}.pinned-message-media,.reply-media{left:0;overflow:hidden;position:absolute;top:.125rem}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.pinned-message-media>video,.reply-media>img,.reply-media>video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.pinned-message i,.reply i{color:#707579;color:var(--secondary-text-color);font-style:normal}.pinned-message img.emoji,.reply img.emoji{height:1rem;vertical-align:top;width:1rem}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{background:#3390ec;background:var(--primary-color);border-radius:1px;height:calc(32px + .25rem);height:calc(var(--font-size)*2 + .25rem);min-width:2px}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0!important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-container{--container-height:3.25rem;align-items:center;cursor:pointer;display:flex;flex:0 0 auto;justify-content:space-between;overflow:visible}.pinned-container.is-floating{background-color:#fff!important;background-color:var(--surface-color)!important;position:absolute!important}.pinned-container.is-floating{height:var(--container-height);left:0;margin:0;max-height:var(--container-height);right:0;top:var(--topbar-height);width:auto}.pinned-container.is-floating .pinned-container-wrapper{border-radius:0;height:100%;max-width:100%;order:0;padding:0 1rem;z-index:0}@media only screen and (max-width:600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width:1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;pointer-events:none;position:relative}.pinned-container .btn-icon{display:flex;flex:0 0 auto;font-size:1.5rem;justify-content:center}.pinned-container-wrapper{align-items:center;border-radius:.25rem;display:flex;flex:1 1 auto;order:1;overflow:hidden;padding:.25rem}.pinned-container-wrapper-utils{align-items:center;display:flex;flex:0 0 auto;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible!important}.pinned-message-media-container{height:2rem;margin-left:-.25rem;position:absolute;width:2rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-subtitle,.pinned-message-title{transform:translateX(0)}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height:var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-subtitle,.pinned-message-content .pinned-message-title{height:calc(var(--height)/2);min-height:calc(var(--height)/2);overflow:visible;position:relative}body.animation-level-2 .pinned-message-content .pinned-message-subtitle,body.animation-level-2 .pinned-message-content .pinned-message-title{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:14px;font-size:var(--font-size-14);line-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:"#"}.pinned-message .animated-counter.is-last:not(.backwards){opacity:0;transform:scale(.68)}.pinned-message .animated-super-row{--translateY:16px}.pinned-message .pinned-message-media{--translateY:32px}.pinned-message.hide~.tgico-pinlist,.pinned-message.is-many .pinned-message-close,.pinned-message.is-many.is-floating .pinned-message-close,.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist,.pinned-message:not(.is-many) .pinned-message-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message-pinlist{order:2}.chat[data-type=discussion] .pinned-message .pinned-container-close{display:none!important}.pinned-audio{--progress-height:.25rem}.pinned-audio.is-floating{--container-height:var(--pinned-audio-height)}.pinned-audio:not(.is-floating){max-width:210px;padding-right:1.75rem;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible!important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0!important}.pinned-audio-ico:before{content:""}.pinned-audio-ico.flip-icon:before{content:""}.pinned-audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-subtitle,.pinned-audio-title{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius:0;--height:var(--progress-height);--translateY:.125rem;bottom:0;left:0;position:absolute;right:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width:1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:active,html.no-touch .pinned-audio-progress:hover{--translateY:0}.pinned-audio-progress .progress-line__filled:after{display:none!important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{bottom:0;height:.5rem;left:0;overflow:hidden;position:absolute;right:0}.pinned-audio-volume{align-items:center;height:2.5rem;position:relative;width:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{bottom:-1rem;content:" ";left:0;position:absolute;right:0;top:100%}.pinned-audio-volume .player-volume__icon{cursor:pointer;display:flex}.pinned-audio-volume .progress-line-container{background-color:#fff;background-color:var(--surface-color);border-radius:10px;box-shadow:0 1px 5px 0 rgba(0,0,0,.15);margin-top:2.25rem;opacity:0;padding:.75rem 1rem;position:absolute;top:100%;transform:rotate(270deg);transition:opacity .2s ease-in-out,visibility 0s .2s;visibility:hidden;width:5rem}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none!important}.pinned-audio-volume:active .progress-line-container,.pinned-audio-volume:hover .progress-line-container{opacity:1;transition:opacity .2s ease-in-out,visibility 0s 0s;visibility:visible}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;bottom:0;display:flex;height:44px;justify-content:flex-start;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transform:translateZ(0);transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),width .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);width:252px;z-index:1}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{align-items:center;display:flex;height:100%;justify-content:flex-start;left:0;max-width:100%;position:absolute;top:0;transform:translateX(0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:672px}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{align-items:center;display:flex;flex:0 0 auto;justify-content:space-between;max-width:100%;padding:7px}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{background-color:#dfe1e5;background-color:var(--border-color);height:25px;width:1px}.markup-tooltip .btn-icon{border-radius:8px!important}.markup-tooltip .btn-icon{height:30px;padding:0;width:30px}.markup-tooltip .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-252px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{align-items:center;display:flex;opacity:0;pointer-events:none;transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;margin:0 .5rem;text-overflow:ellipsis}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{max-height:13.75rem;min-height:72px;min-height:var(--esg-sticker-size);padding:.4375rem;position:relative}.stickers-helper-stickers{border-radius:var(--border-radius);max-width:100%}html.no-touch .stickers-helper .super-sticker:not(.active):active,html.no-touch .stickers-helper .super-sticker:not(.active):hover{background:none}.emoji-helper{padding:.25rem 0!important}.emoji-helper{height:50px}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:after,.emoji-helper .super-emojis:before{content:" ";display:inline-block;width:.25rem}html.no-touch .emoji-helper .super-emoji:not(.active):active,html.no-touch .emoji-helper .super-emoji:not(.active):hover{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec!important;background-color:var(--primary-color)!important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem,100%)}.inline-helper .scrollable{max-height:232px;position:relative}.inline-helper-separator{background-color:#dfe1e5;background-color:var(--border-color);height:1px;margin-left:4rem;width:100%}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:0;border-radius:initial}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem .5rem .5rem 4rem}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{height:3rem!important;width:3rem!important}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{left:.5rem;overflow:hidden;position:absolute}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;color:#fff;display:flex;font-size:1.75rem;justify-content:center;text-transform:uppercase}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-poster,.inline-helper .media-video{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.inline-helper .gif{height:auto!important;width:auto!important}.inline-helper .gif{bottom:0;left:0;position:absolute;right:0;top:0}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(72px,1fr));grid-template-columns:repeat(auto-fill,minmax(var(--esg-sticker-size),1fr));max-width:100%}.inline-helper-results.is-gallery .inline-helper-result{height:auto!important;width:auto!important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;font-weight:var(--font-weight-bold);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inline-helper-result-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:#707579;color:var(--secondary-text-color);display:-webkit-box;font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap}.chat-search{position:absolute!important}.chat-search{left:0;right:0;top:0;z-index:2}.chat-search-footer{align-items:center;background-color:#fff;background-color:var(--surface-color);box-shadow:0 -1px 5px -1px rgba(0,0,0,.21);display:flex;flex:0 0 auto;height:46px;justify-content:space-between;overflow:hidden;padding:0 8px;width:100%}.chat-search-footer .chat-search-count{color:#707579;color:var(--secondary-text-color);margin-left:8px}.chat-search-count:empty,.chat-search-count:not(:empty)+.btn-icon,.chat-search-footer+.chat-input{display:none}.chat-search-controls{display:flex}.chat-search-results{background-color:#fff;background-color:var(--surface-color);height:100%;left:0;max-height:100%;opacity:0;overflow:hidden;position:absolute;top:0;transition:.2s ease;visibility:hidden;width:100%}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{position:absolute!important;width:auto!important}.drops-container{--padding:0px;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding:-4px;align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:12px;color:#a2acb4;display:flex;flex:1 1 auto;flex-direction:column;justify-content:center;max-width:100%;pointer-events:all;position:relative;transition:color .2s ease-in-out;width:100%}.drop-outline-wrapper{bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none;position:absolute;right:var(--wrapper-padding);top:var(--wrapper-padding)}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;stroke-dashoffset:0;transition:stroke .2s ease-in-out}.drop.is-dragover .drop-outline-path{stroke:#3390ec;stroke:var(--primary-color);animation:drop-outline-move .5s linear infinite}.drop-icon{font-size:6rem}.drop-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height:670px){.drop-icon{font-size:0}.drop-header{margin-top:0}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.bot-commands{animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;padding:var(--offset) var(--offset) 0!important;position:absolute!important;transition:none!important;visibility:visible!important;width:auto!important}.bot-commands{--border-radius-padding:24px;--offset:.5rem;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;pointer-events:none;right:calc(var(--offset)*-1)}body.animation-level-2 .bot-commands{display:flex!important}.bot-commands .scrollable{max-height:207px!important}.bot-commands .scrollable{background-color:#fff;background-color:var(--surface-color);border-radius:inherit;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);height:auto;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{opacity:1;transform:translateY(0)}.bot-commands-list{border-radius:inherit;height:var(--height);padding-bottom:0;width:100%}.bot-commands-list-element{border-radius:0!important}.bot-commands-list-element{align-items:flex-start;flex-direction:column;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{left:.75rem;position:absolute}.bot-commands-list-element-description,.bot-commands-list-element-name{font-size:.875rem;line-height:18px;line-height:var(--line-height-14);margin-left:0}.crop .overlay::-moz-selection,.crop-component::-moz-selection{background:transparent}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{display:block;height:auto;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center;width:auto}.crop-image{display:block;pointer-events:none;position:relative}.crop-component{background-color:#fff;margin:0 auto;overflow:hidden;position:relative;z-index:999}.crop-component>img{max-width:100%}.crop-overlay{border-radius:50%;box-sizing:content-box;overflow:hidden;position:absolute;z-index:999}.crop-overlay:active,html.no-touch .crop-overlay:hover{cursor:move}.crop-overlay-image{display:block;position:absolute}.crop-overlay-color{background-color:hsla(0,0%,100%,.7);border-radius:8px;height:100%;left:0;position:absolute;top:0;width:100%}.crop.is-forum .crop-overlay{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}.sidebar-header{align-items:center;background-color:#fff;background-color:var(--surface-color);cursor:default;display:flex;flex:0 0 auto;justify-content:space-between;min-height:3.5rem;padding-left:1rem;padding-right:1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding-left:.5rem;padding-right:.5rem}}[dir=ltr] .sidebar-header__title{padding-left:1.5rem}[dir=rtl] .sidebar-header__title{padding-right:1.5rem}.sidebar-header__title{color:#000;color:var(--primary-text-color);flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}[dir=ltr] .sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}[dir=rtl] .sidebar-header .btn-icon+.btn-icon{margin-right:.5rem}.sidebar-header-right{flex:0 0 auto}.scrollable-y-bordered .sidebar-header{position:relative}.scrollable-y-bordered .sidebar-header:after{background-color:#dfe1e5;background-color:var(--border-color);bottom:-1px;content:" ";height:1px;left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .scrollable-y-bordered .sidebar-header:after{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.scrollable-y-bordered:not(.scrolled-top) .sidebar-header:after{opacity:1}.sidebar-close-button{overflow:inherit!important}.sidebar-close-button{flex:0 0 auto;height:2.5rem;width:2.5rem}.sidebar-content{display:flex;flex:1 1 auto;height:100%;max-height:100%;overflow:hidden;position:relative;width:100%}.profile-avatars-container{cursor:pointer;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}html.no-touch .profile-avatars-container:active .profile-avatars-arrow,html.no-touch .profile-avatars-container:hover .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0!important}.profile-avatars-avatars{display:flex;flex-wrap:nowrap;height:100%;position:absolute;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;width:100%}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0)}.profile-avatars-avatars:before{bottom:0;content:" ";left:0;right:0;top:0}.profile-avatars-avatar{background-color:#000;display:flex;height:inherit;min-height:100%;min-width:100%;position:relative;width:inherit}.profile-avatars-avatar .avatar-photo{height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none;width:100%}.profile-avatars-gradient{background:linear-gradient(1turn,rgba(0,0,0,.3) 8.98%,transparent);bottom:0;height:80px;left:0;position:absolute;right:0}[dir=ltr] .profile-avatars-info{left:1.5rem}[dir=rtl] .profile-avatars-info{right:1.5rem}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;pointer-events:none;position:absolute}[dir=ltr] .profile-avatars-info .profile-name,[dir=ltr] .profile-avatars-info .profile-subtitle{text-align:left}[dir=rtl] .profile-avatars-info .profile-name,[dir=rtl] .profile-avatars-info .profile-subtitle{text-align:right}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .premium-icon{color:#fff}.profile-avatars-info .verified-icon-background{fill:#fff}.profile-avatars-info .verified-icon-check{visibility:hidden}.profile-avatars-info .premium-icon,.profile-avatars-info .profile-subtitle,.profile-avatars-info .verified-icon{opacity:.7}.profile-avatars-info .online{color:inherit!important}.profile-avatars-tabs{display:flex;height:.125rem;left:.375rem;pointer-events:none;position:absolute;right:.375rem;top:.5rem}.profile-avatars-tab{background-color:#fff;border-radius:4px;flex:1 1 auto;height:inherit;margin:0 .125rem;opacity:.2;transition:opacity .2s ease-in-out}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{bottom:0;left:0;opacity:0;position:absolute;top:0;width:33.3333333333%}.profile-avatars-arrow:before{color:#fff;font-size:2.1875rem;left:.625rem;position:absolute;top:50%;transform:translateY(-50%)}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover{opacity:1!important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{display:flex;flex:0 0 auto;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem;position:relative}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width:600px){.profile-button{border-radius:0}}[dir=ltr] .profile-change-avatar{right:1.25rem}[dir=rtl] .profile-change-avatar{left:1.25rem}.profile-change-avatar{position:absolute!important;transition:none!important}.profile-change-avatar{--size:3.375rem;top:calc(var(--size)/-2);transform:none}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{align-items:flex-end;color:#000;color:var(--primary-text-color);display:flex;font-size:20px;font-size:var(--font-size-20);font-weight:500;font-weight:var(--font-weight-bold);line-height:26px;line-height:var(--line-height-20);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-moz-min-content;min-width:min-content;vertical-align:inherit}.profile-name .peer-title{overflow:hidden;text-overflow:ellipsis;word-break:break-word}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem;justify-content:center;margin-bottom:.875rem;margin-top:1px;text-align:center}@media only screen and (max-width:600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{display:block;margin:.5rem auto 10px}@media only screen and (max-width:600px){.profile-avatar{--size:100px;--multiplier:.54;margin:0 auto 10px}}.profile-avatar,.profile-name,.profile-subtitle{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size:3rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;content:" ";height:1px;left:0;position:absolute;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size:var(--scrollable-size,3rem);--padding-horizontal:0px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);display:flex;flex-direction:row;height:var(--size);justify-content:space-around;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.menu-horizontal-div:not(.no-stripe):after,.menu-horizontal-div:not(.no-stripe):before{content:" ";flex:0 0 auto;width:var(--padding-horizontal)}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px 10px 0 0}.menu-horizontal-div-item{transition:none!important}.menu-horizontal-div-item{align-items:center;border-radius:0;cursor:pointer;display:flex;flex:1 1 auto;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;justify-content:center;line-height:1.3125;line-height:var(--line-height);padding:0 1rem;position:relative;text-align:center}html.no-touch .menu-horizontal-div-item:active,html.no-touch .menu-horizontal-div-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle,html.no-touch .menu-horizontal-div-item.active:active,html.no-touch .menu-horizontal-div-item.active:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{align-items:center;display:inline-flex;overflow:visible;pointer-events:none;position:relative}.menu-horizontal-div i{background-color:#3390ec;background-color:var(--primary-color);border-radius:.1875rem .1875rem 0 0;bottom:-.8125rem;box-sizing:content-box;height:.1875rem;left:0;opacity:0;pointer-events:none;position:absolute;transform-origin:left;width:100%;z-index:1}.menu-horizontal-div i.animate{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{display:grid;grid-template-columns:100%;grid-template-rows:100%;min-width:100%;width:100%}.tabs-container .tabs-tab{background-color:#f4f4f5;background-color:var(--background-color);display:none;flex-direction:column;grid-column-start:1;grid-row-start:1;overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none!important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4,0,.2,1),filter .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex:1 1 auto;flex-direction:column;max-width:420px;min-width:min(100%,18rem)}@media only screen and (max-width:600px){#column-left{max-width:100%;width:100%}body:not(.is-left-column-shown) #column-left{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px){#column-left{overflow:visible}[dir=ltr] #column-left:after{right:-1px}[dir=rtl] #column-left:after{left:-1px}#column-left:after{background-color:#dfe1e5;background-color:var(--border-color);content:" ";display:block;height:100vh;position:absolute;top:0;width:1px;z-index:2}}@media only screen and (min-width:601px)and (max-width:925px){#column-left{display:flex;left:0;max-width:none;position:fixed;top:0;transform:translate3d(-5rem,0,0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:26.5rem}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width:926px){#column-left{display:flex}}@media only screen and (max-width:1275px){#column-left{flex:2}}@media only screen and (min-width:1681px){html.is-safari #column-left{max-width:418.75px}}#column-left .item-main .menu-horizontal-scrollable{background-color:#fff;background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .item-main .menu-horizontal-scrollable .scrollable{position:relative}[dir=ltr] #column-left .item-main .menu-horizontal-scrollable .badge{margin-left:5px}[dir=rtl] #column-left .item-main .menu-horizontal-scrollable .badge{margin-right:5px}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--scrollable-size));position:relative}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .item-main .menu-horizontal-div{position:relative!important}#column-left .item-main .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;z-index:0}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .item-main .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .item-main .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main{--offset-top:0;background-color:#fff;background-color:var(--surface-color)}[dir=ltr] #column-left .item-main .input-search .selector-user{left:6px}[dir=rtl] #column-left .item-main .input-search .selector-user{right:6px}[dir=ltr] #column-left .item-main .input-search .selector-user{margin-left:0}[dir=rtl] #column-left .item-main .input-search .selector-user{margin-right:0}#column-left .item-main .input-search .selector-user{position:absolute!important}#column-left .item-main .input-search .selector-user{height:30px;line-height:1.875rem;top:6px;z-index:1}[dir=ltr] #column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}[dir=rtl] #column-left .item-main .input-search.is-picked .input-search-input{padding-right:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block!important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}[dir=ltr] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}[dir=rtl] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{right:38px}[dir=ltr] #column-left .item-main .search-helper{margin-left:28px}[dir=rtl] #column-left .item-main .search-helper{margin-right:28px}#column-left .item-main .search-helper{display:flex}@media only screen and (max-width:600px){[dir=ltr] #column-left .item-main .search-helper{margin-left:20px}[dir=rtl] #column-left .item-main .search-helper{margin-right:20px}}#column-left .item-main .search-helper .selector-user{font-size:14px;margin-top:7px}html.no-touch #column-left .item-main .search-helper .selector-user:active,html.no-touch #column-left .item-main .search-helper .selector-user:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none!important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{position:relative!important}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto!important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%,-50%)}#column-left #chatlist-container{background-color:#fff;background-color:var(--surface-color);max-height:100%;position:relative}#column-left #chatlist-container.has-filters .connection-status-bottom{height:calc(100% + var(--offset-top)*-1)}#column-left #folders-container{flex:1 1 auto}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .dialogs-placeholder-canvas{position:absolute;top:0;z-index:2}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{align-items:center;display:flex;flex:0 0 auto;height:2.5rem;justify-content:center;position:relative;width:2.5rem}#column-left .sidebar-header__btn-container>.btn-icon{bottom:0;left:0;margin:0;opacity:0;position:absolute;right:0;top:0;visibility:hidden;z-index:4}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width:600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);min-width:260px}[dir=ltr] #column-left .sidebar-tools-button .btn-menu-item{padding-right:.375rem}[dir=rtl] #column-left .sidebar-tools-button .btn-menu-item{padding-left:.375rem}[dir=ltr] #column-left .archived-count{margin-left:.625rem}[dir=rtl] #column-left .archived-count{margin-right:.625rem}#column-left .archived-count{justify-self:flex-end}html[dir=ltr].is-mobile #column-left .archived-count{margin-right:.375rem}html[dir=rtl].is-mobile #column-left .archived-count{margin-left:.375rem}@media only screen and (max-width:600px){#column-left .archived-count{font-weight:500;font-weight:var(--font-weight-bold)}}#column-left .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding:0 0 1px}#column-left .search-group-people .chatlist:after,#column-left .search-group-people .chatlist:before{content:" ";display:inline-block;flex:0 0 auto;width:.3125rem}#column-left .search-group-people .chatlist-chat{padding:0!important}#column-left .search-group-people .chatlist-chat{align-items:center;display:flex;flex:0 0 auto;flex-direction:column;height:6.125rem;justify-content:flex-end;max-width:4.875rem;width:4.875rem}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .dialog-title{max-width:65px;padding-bottom:.75rem}#column-left .search-group-people .dialog-title .user-title{font-size:.75rem!important}#column-left .search-group-people .dialog-title .peer-title{font-weight:400!important;font-weight:var(--font-weight-normal)!important}[dir=ltr] #column-left .search-group-people .dialog-avatar{left:auto!important}[dir=rtl] #column-left .search-group-people .dialog-avatar{right:auto!important}#column-left .search-group-people .dialog-avatar{top:.75rem!important}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){[dir=ltr] #column-left .search-group-people .search-group-scrollable{margin-left:-7px}[dir=rtl] #column-left .search-group-people .search-group-scrollable{margin-right:-7px}#column-left .search-group-people .search-group-scrollable{margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{visibility:visible!important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{position:fixed!important}#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;right:14px;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{flex:0 0 auto;overflow:hidden;padding:0 .5rem .5rem;width:100%}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}[dir=ltr] #column-left .connection-status-button{padding-left:4.5rem}[dir=rtl] #column-left .connection-status-button{padding-right:4.5rem}[dir=ltr] #column-left .connection-status-button{text-align:left}[dir=rtl] #column-left .connection-status-button{text-align:right}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}[dir=ltr] #column-left .connection-status-button .preloader-container{left:1rem}[dir=rtl] #column-left .connection-status-button .preloader-container{right:1rem}#column-left .connection-status-button .preloader-container{height:1.5rem;right:auto;width:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top:0px;background-color:#fff;background-color:var(--surface-color);bottom:0;display:flex;flex-direction:column;height:100%;left:0;overflow:hidden;position:absolute;right:0;top:0;transform:translateY(var(--offset-top))}#column-left .input-wrapper{flex:0 0 auto;margin:.75rem 0;max-width:100%;padding:0 .75rem;width:420px}@media only screen and (max-width:600px){#column-left .input-wrapper{width:100%}}#search-container{top:var(--offset-top)!important}#search-container{display:flex}#search-container .scrollable-y{flex:1 1 auto;position:relative}.edit-profile-container .sidebar-content,.new-channel-container .sidebar-content,.new-group-container .sidebar-content{flex-direction:column}.edit-profile-container .chatlist-container,.new-channel-container .chatlist-container,.new-group-container .chatlist-container{flex:1 1 auto}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{margin-left:23px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{margin-right:23px}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{padding-right:24px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{padding-left:24px}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:14px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}.settings-container .profile-avatars-container{height:15rem;padding-bottom:0}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:0 auto;max-width:20rem;text-align:center}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width:600px){.edit-folder-container .input-wrapper{padding:0 16px;width:100%}}.edit-folder-container .sidebar-left-section{padding-bottom:0}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-categories .checkbox-field{right:1.125rem!important}.folder-categories .checkbox-field{position:absolute}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}[dir=ltr] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}[dir=rtl] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-right:26px}.search-group-recent .search-group__name{align-items:center;display:flex;justify-content:space-between}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width:600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width:601px){.search-group-recent.search-group.search-group-contacts{padding:0 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{padding-top:0!important}.sidebar-left-section.with-fake-delimiter{box-shadow:none}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0!important}@media only screen and (max-width:600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width:601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}[dir=ltr] .sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}[dir=rtl] .sidebar-left-section-content>.checkbox-field .checkbox-box{right:auto}@media only screen and (max-width:600px){.sidebar-left-section-content>.btn-primary,.sidebar-left-section-content>.checkbox-ripple{border-radius:0}}.sidebar-left-section-content.full-width{margin:0!important}.sidebar-left-section-content>.media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width:600px){.sidebar-left-section-name{font-size:.875rem;padding:.5rem 1rem}}.sidebar-left-section-caption{color:#707579;color:var(--secondary-text-color);font-size:1rem;line-height:1.3125;line-height:var(--line-height);margin-top:1rem;padding:0 1rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{font-size:.875rem;margin:.5rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{align-items:center;display:flex;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{pointer-events:none!important}.sidebar-left-section-disabled{opacity:.25}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500;font-weight:var(--font-weight-bold)}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,#poll-results-container,#search-gifs-container,#search-private-container,#stickers-container,.add-members-container{background-color:#fff!important;background-color:var(--surface-color)!important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff!important;background-color:var(--surface-color)!important}.two-step-verification .sidebar-left-section{box-shadow:none!important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{margin-bottom:1.125rem;margin-left:auto;margin-right:auto;max-width:342px;text-align:center}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem!important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{height:168px;margin:.625rem auto 1.1875rem;width:168px}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{height:157px;margin:1.125rem auto 1.8125rem;width:157px}.two-step-verification-hint .media-sticker-wrapper{height:160px;margin:.5rem auto 2.25rem;width:160px}.two-step-verification-email .media-sticker-wrapper{height:160px;margin:.5625rem auto 2.1875rem;width:160px}.two-step-verification-set .media-sticker-wrapper{height:160px;margin:1rem auto 1.3125rem;width:160px}[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{right:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width:601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row-title:first-child{font-weight:500;font-weight:var(--font-weight-bold)}.active-sessions-container .row-title-right{color:#707579;color:var(--secondary-text-color);font-size:12px;font-size:var(--font-size-12);line-height:16px;line-height:var(--line-height-12)}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (min-width:601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height:2px;--color:var(--primary-color);--border-radius:4px;--thumb-size:12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .grid-item:after{border:3px solid #3390ec;border:3px solid var(--primary-color);bottom:0;content:" ";display:block;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(.91)}.background-container .grid-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .grid-item-media.is-pattern{background-color:#000}.background-container .grid-item-media.is-pattern .media-photo{mix-blend-mode:overlay}.background-container .grid .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-container .grid .preloader-container{z-index:1}.background-container .background-colors-canvas{height:100%;-webkit-mask-position:center;-webkit-mask-size:contain;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{width:21rem!important}.empty-placeholder{line-height:1.3125;line-height:var(--line-height);margin:0 auto;padding:0 1rem;position:relative;text-align:center;top:40%;transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;user-select:none}.empty-placeholder .media-sticker-wrapper{height:128px;margin:0 auto 1.9375rem;position:relative;width:128px}.empty-placeholder-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}[dir=ltr] .empty-placeholder .btn-control:before{margin-right:.625rem}[dir=rtl] .empty-placeholder .btn-control:before{margin-left:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}.is-forum-visible .can-have-forum .input-search,.is-forum-visible .can-have-forum .row-row,.is-forum-visible .can-have-forum .sidebar-header__title{opacity:0}.is-forum-visible .folders-tabs-scrollable{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none}.is-forum-visible.backwards .can-have-forum .input-search,.is-forum-visible.backwards .can-have-forum .row-row,.is-forum-visible.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.backwards .folders-tabs-scrollable{opacity:1}.is-forum-visible.animating .can-have-forum .input-search,.is-forum-visible.animating .can-have-forum .row-row,.is-forum-visible.animating .can-have-forum .sidebar-header__title,.is-forum-visible.animating .folders-tabs-scrollable{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.is-forum-visible.animating.backwards .can-have-forum .input-search,.is-forum-visible.animating.backwards .can-have-forum .row-row,.is-forum-visible.animating.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.animating.backwards .folders-tabs-scrollable{transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}#column-right{overflow:visible;overflow:initial;position:relative}@media only screen and (min-width:601px)and (max-width:1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width:600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw,0,0)}}@media only screen and (min-width:601px){#column-right{position:absolute;right:0;transform:translate3d(var(--right-column-width),0,0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:calc(var(--right-column-width));z-index:3}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transform:translateZ(0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width:1276px){#column-right{border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);transform:translate3d(calc(var(--right-column-width) + 1px),0,0);width:calc(var(--right-column-width) + 1px)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}@media only screen and (min-width:601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:""}}#column-right #search-private-container .chatlist-container{flex:1 1 auto;position:relative}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{margin:.75rem 0;max-width:100%;padding:0 .75rem;width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0;perspective-origin:0 0}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .profile-content.is-me .profile-name{margin-bottom:.9375rem}.shared-media-container .profile-content.is-me .profile-subtitle{display:none}.shared-media-container .search-super{min-height:calc(100vh - 56px);min-height:calc(var(--vh, 1vh)*100 - 56px);top:100%}.shared-media-container .search-super-tabs{--padding-horizontal:0}.shared-media-container .search-super-tabs .menu-horizontal-div-item{border-radius:0!important}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{align-items:center;display:flex}.shared-media-container .btn-corner.menu-open:before{content:""}@media only screen and (max-width:600px){.shared-media-container .btn-corner{position:fixed!important}.shared-media-container .btn-corner{bottom:14px;height:54px;right:14px;width:54px;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;max-width:100%;min-height:100%;position:absolute;width:100%}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:24px 0 0 24px}@media only screen and (max-width:600px){.search-super .search-super-month-name{padding:18px 0 0 16px}}.search-super.sliding{max-height:none!important}.search-super-tabs{flex:1 1 auto;width:auto}.search-super-tabs-scrollable{box-shadow:none!important;position:sticky!important}.search-super-tabs-scrollable{background-color:#fff;background-color:var(--surface-color);top:0;z-index:2}.search-super-tabs-scrollable:before{background-color:inherit;content:" ";display:block;height:1px;left:0;position:absolute;top:0;width:100%;z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{display:flex;position:relative}.search-super-tabs-container{flex:1 1 auto;grid-template-rows:100%;min-height:calc(100% - 49px)}.search-super-tabs-container>div{background-color:#fff!important;background-color:var(--surface-color)!important}.search-super-tabs-container>div{min-height:150px;position:relative}.search-super-tabs-container>div>div:first-child{min-height:calc(100vh - 111px);transform:translateY(0)}.search-super-tabs-container .preloader{position:absolute!important}.search-super-tabs-container .preloader{padding:0;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .audio-title,.search-super .document-name,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:12px;margin-left:8px;margin-top:3px}.search-super-content-media .search-super-month-name{border:none;padding:9px 0 7px 24px}.search-super-content-media .video-time{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:4px;color:#fff;font-size:12px;height:18px;left:5px;line-height:18px;padding:0 6px 0 5px;position:absolute;top:4px;z-index:2}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{position:absolute!important}.search-super .checkbox-field{margin:0;z-index:2}.search-super-content-media .search-super-month-items{grid-gap:1px;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);padding-top:1px;width:100%}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width:600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{--icon-size:3rem;--icon-margin:.75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-download,.search-super-content-files .document-ico{border-radius:5px!important}.search-super-content-files .document-name{font-weight:400;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.search-super-content-links .search-super-item{cursor:pointer;display:flex;flex-direction:column;justify-content:flex-start;min-height:4.375rem;overflow:hidden;padding-left:4.4375rem;position:relative}.search-super-content-links .row-media{border-radius:.375rem;height:3rem;left:.6875rem;overflow:hidden;position:absolute;width:3rem}.search-super-content-links .row-media.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);color:#fff;display:flex;font-size:2rem;justify-content:center;text-transform:uppercase}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:static}.search-super-content-links .anchor-url:last-child:before{bottom:0;content:" ";cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:1}.search-super-content-links .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{--offset-left:0!important;margin:2rem 0 0 -1.75rem!important;padding:0!important}@media only screen and (min-width:601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width:600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 20px}@media only screen and (max-width:600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:normal;margin-bottom:1.5rem}@media only screen and (min-width:601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-bottom:.5rem;padding-top:.5rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent!important}.search-super-selection-container{align-items:center;bottom:0;display:flex;justify-content:space-between;left:0;opacity:0;padding:0 1rem;position:absolute;right:0;top:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width:600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);margin-left:1.5rem;text-transform:capitalize;white-space:nowrap}#search-container .search-group.is-short .chatlist-chat:nth-child(n+4),#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time{display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{cursor:pointer;display:flex;flex-direction:column;height:140px}#stickers-container .sticker-set-name{font-weight:500;font-weight:var(--font-weight-bold)}#stickers-container .sticker-set-count{color:#707579;color:var(--secondary-text-color);font-size:14px}#stickers-container .sticker-set-header{display:flex;justify-content:space-between;padding-bottom:12px;padding-left:16px}#stickers-container .sticker-set-button{border-radius:16px;font-size:15px;font-weight:400;height:30px;margin-right:16px;padding-left:12px;padding-right:13px;transition:width .2s;width:auto}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{height:68px;position:relative;width:68px}#stickers-container .sticker-set-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}#stickers-container .sticker-set-sticker img{max-height:100%;max-width:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);display:flex;font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);justify-content:space-between;margin:0;padding:0 16px 8px;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-answer{padding:0 24px 8px}}#poll-results-container .poll-results-more{margin:0 .5rem;width:auto}@media only screen and (max-width:600px){#poll-results-container .poll-results-more{border-radius:0;margin:0}}#poll-results-container .poll-results h3{font-size:20px;margin-bottom:16px;margin-top:15px;padding:0 16px}@media only screen and (min-width:601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{display:block!important}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem!important}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem!important}.edit-contact-container .avatar-placeholder{filter:none!important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem!important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem!important}.media-viewer{align-items:center;background:rgba(0,0,0,.88);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0}@media only screen and (max-width:600px){.media-viewer{background:#000}}.media-viewer-author{align-items:center;cursor:pointer;display:flex;height:100%}@media only screen and (max-width:600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width:600px){.media-viewer-userpic{display:none}}.media-viewer-name{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.0625rem 0}@media only screen and (min-width:601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.media-viewer-buttons{display:flex;flex-flow:row nowrap;padding:.5rem .75rem;position:absolute;right:0;top:0}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:active,html.no-touch .media-viewer-buttons .btn-icon:hover{color:#fff}@media only screen and (max-width:600px){.media-viewer-buttons{display:none}}.media-viewer-content{flex-direction:column;height:100%;justify-content:center}.media-viewer-container,.media-viewer-content{align-items:center;display:flex;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;flex:1 1 auto;position:relative}.media-viewer-media{visibility:hidden}.media-viewer-caption{background-color:transparent;bottom:0;color:#fff;left:0;line-height:1.3125;line-height:var(--line-height);opacity:0;overflow:hidden;padding:.5rem .5rem 0;position:absolute;right:0;text-align:center;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word;z-index:4}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9!important}.media-viewer-caption .scrollable{height:6rem;margin:0 auto;max-height:6rem;max-width:50rem;padding:.5rem .875rem;position:relative}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width:600px){.media-viewer-caption{bottom:1.0625rem;text-align:inherit;transform:translateZ(0);width:100%}.media-viewer-caption .scrollable{height:auto;padding:0 .5rem}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0,-69px,0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{opacity:1!important}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{background-color:#000}}.media-viewer-caption.is-focused{opacity:1!important}.media-viewer-caption.is-focused{background-color:#000}.media-viewer-switcher{cursor:pointer;height:calc(100% - 7.5rem);left:0;position:absolute;top:3.75rem;width:7rem;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width:600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-next-button,.media-viewer-prev-button{color:#fff;cursor:pointer;font-size:2rem;left:1rem;opacity:0;position:absolute;top:50%;transform:translateY(-50%) rotate(90deg);transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width:601px){.media-viewer-next-button,.media-viewer-prev-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width:601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{min-height:auto!important;position:fixed!important}.media-viewer-mover{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;overflow:hidden;top:0;transform:translateZ(0) scaleX(1);transform-origin:top left}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}@media only screen and (max-width:600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{height:100%;left:0;position:absolute;top:0;width:100%}.media-viewer-mover>svg{height:100%;width:100%}.media-viewer-mover .canvas-thumbnail,.media-viewer-mover img,.media-viewer-mover video{height:100%;max-height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;opacity:1;position:absolute;transition:var(--open-duration) opacity;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.media-viewer-mover svg img,.media-viewer-mover svg video{position:static}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration)/8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none!important}.media-viewer-mover.center{left:50%!important;top:50%!important;transform:translate3d(-50%,-50%,0)!important}.media-viewer-mover.center{max-height:calc(100vh - 15rem);max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-width:100vw!important;width:100%!important}.media-viewer-mover.center{max-height:calc(100vh - 120px);max-height:calc(var(--vh, 1vh)*100 - 120px)}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center .canvas-thumbnail,.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{-o-object-fit:contain;object-fit:contain;width:auto}.media-viewer-mover.hiding .canvas-thumbnail,.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{align-items:center;display:flex;height:3.5rem;justify-content:space-between;left:0;padding:0 1.25rem;position:absolute;right:0;top:0;z-index:5}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover{opacity:1}.media-viewer-topbar-left{align-items:center;display:flex}@media only screen and (max-width:600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{align-items:center;border-radius:0;display:flex;height:100%;justify-content:center;position:absolute;transform:scaleX(1);width:100%}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{position:fixed!important}.media-viewer-whole{--open-duration:.2s;--move-duration:.35s;display:block;height:100%;left:0;top:0;transition:visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}body.animation-level-0 .media-viewer-whole{--open-duration:0s;--move-duration:0s}.media-viewer-whole.active{transition-delay:0s;visibility:visible}.media-viewer-whole.active .media-viewer-appear,.media-viewer-whole.active .overlays{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .media-viewer-appear,body.animation-level-2 .media-viewer-whole.active .overlays{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width:600px){.media-viewer-whole .btn-menu-toggle:not(.playback-rate){color:hsla(0,0%,100%,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{background-color:hsla(207,4%,46%,.2)!important}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important}.media-viewer-whole.hide-caption .media-viewer-caption{pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards .canvas-thumbnail,.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;user-select:none}.media-viewer-movers{bottom:0;left:0;position:absolute;right:0;top:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:""}.tgico-zoom.zoom-in:before{content:""}.zoom-container{align-items:center;background-color:rgba(0,0,0,.4);border-radius:12px;bottom:1.25rem;display:flex;height:3.375rem;justify-content:space-between;left:50%;opacity:1;padding:.5rem;position:absolute;transform:translateX(-50%);width:17.125rem;z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{opacity:.4;pointer-events:none}.zoom-container .progress-line{--color:#fff;--height:2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.media-viewer-whole:not(.active) .zoom-container,.zoom-container:not(.is-visible){opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0!important}.zoom-container.is-visible~.media-viewer-caption{pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0!important}.overlays{position:fixed!important}.overlays{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{background:#fff;background:var(--surface-color);display:flex;flex:1 1 auto;flex-direction:column;height:min(282px,calc(100vh - 135px));height:min(282px,calc(var(--vh)*100 - 135px));max-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{position:absolute!important;width:23.875rem!important}.emoji-dropdown{-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:1.25rem;bottom:5.125rem;box-shadow:0 5px 10px 5px rgba(16,35,47,.14);height:26.25rem;left:.8125rem;max-height:26.25rem;opacity:0;transform:scale(0);transform-origin:0 100%;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);z-index:3}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{height:100%;max-width:100%;overflow:hidden;width:100%}.emoji-dropdown .emoji-tabs{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);justify-content:center}.emoji-dropdown .emoji-tabs:after{content:none}.emoji-dropdown .emoji-tabs-search{margin-left:.5rem!important}.emoji-dropdown .emoji-tabs-search{left:0;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:.5rem!important}.emoji-dropdown .emoji-tabs-delete{position:absolute;right:0}.emoji-dropdown .emoji-tabs .menu-horizontal-div-item{margin:0 .75rem}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .stickers-padding .category-items{gap:.25rem;padding:0 .1875rem}.emoji-dropdown #content-gifs .scrollable-y{padding:0 .1875rem}.emoji-dropdown .gifs-masonry{border-radius:10px;overflow:hidden}.emoticons-container{background-color:transparent;flex-direction:column;height:100%;min-height:100%}.emoticons-menu{--item-size:1.875rem;align-items:center;min-height:3.0625rem;padding:0 .3125rem;width:100%;z-index:4}.emoticons-menu,.emoticons-menu-wrapper{background-color:transparent;height:3.0625rem}.emoticons-menu-wrapper{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);max-width:100%;padding:0;position:relative}.emoticons-menu:after{content:" ";display:block;flex:0 0 auto;height:1px;width:.1875rem}.emoticons-menu .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:var(--item-size);line-height:var(--item-size);margin:0 .3125rem;padding:0;width:var(--item-size)}.emoticons-menu .menu-horizontal-div-item.not-local{border-radius:.25rem!important}.emoticons-menu .menu-horizontal-div-item.not-local{--item-size:2.375rem;padding:.25rem}.emoticons-menu .menu-horizontal-div-item.active{background-color:rgba(0,0,0,.06)!important;background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-div-item.active,html.no-touch .emoticons-menu .menu-horizontal-div-item:active,html.no-touch .emoticons-menu .menu-horizontal-div-item:hover{color:rgba(0,0,0,.8)!important;color:rgba(var(--primary-text-color-rgb),.8)!important}.emoticons-menu .menu-horizontal-div-item-padding{height:100%;position:relative;width:100%}.emoticons-menu .menu-horizontal-div-item.active:not(.tgico){background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.emoticons-menu .menu-horizontal-inner{border-radius:15px;flex:0 0 auto;margin:0 .3125rem;overflow:hidden;width:1.875rem}html.is-safari .emoticons-menu .menu-horizontal-inner{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner{transition:width .2s ease-in-out}.emoticons-menu .menu-horizontal-inner-scroll{align-items:center;display:flex;height:100%;position:relative;width:8.5rem}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{margin:0!important}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transform:scale(1)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transition:transform .2s ease-in-out!important}.emoticons-menu .menu-horizontal-inner.active{background-color:rgba(0,0,0,.06)!important;background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-inner.active{width:8.5rem}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item{transform:scale(.8)}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item.active{background-color:transparent!important}.emoticons-menu .menu-horizontal-inner:not(.active){cursor:pointer}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-inner-scroll{pointer-events:none}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-div-item:first-child{pointer-events:all}.emoticons-content{flex:1;padding:0;position:relative}.emoticons-content .emoji-category{position:relative}.emoticons-content .sticky_sentinel--top{height:1px;top:0}.emoticons-content .category-title{color:rgba(0,0,0,.42);color:rgba(var(--primary-text-color-rgb),.42);cursor:pointer;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:1.1875rem;padding:.75rem .875rem .375rem;position:relative;text-align:center;width:100%}.emoticons-content .category-title .btn-icon{font-size:1.25rem;pointer-events:all;position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}.emoticons-content:not(.has-premium) .is-premium-set .category-title:before{content:"";line-height:inherit;margin-right:.125rem;vertical-align:middle}.emoji-padding .super-emojis{padding:0 .5rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{height:0;opacity:0;width:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{display:none;height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover{scrollbar-color:rgba(0,0,0,.2) transparent;scrollbar-color:var(--scrollbar-color) transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);background-color:rgba(0,0,0,.2);background-color:var(--scrollbar-color);border-radius:10px;max-height:12.5rem;min-height:5rem;opacity:1}.no-scrollbar::-webkit-scrollbar,.scrollable-x::-webkit-scrollbar{display:none}.scrollable{-webkit-overflow-scrolling:touch;bottom:0;height:100%;left:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;position:absolute;right:0;top:0;width:100%}.scrollable.scrollable-x{-ms-overflow-style:none;overflow-x:auto;scrollbar-width:none}.scrollable.scrollable-y{-ms-overflow-style:none;overflow-y:auto;overflow-y:overlay;scrollbar-color:transparent transparent;scrollbar-width:thin;transform:translateZ(0)}.scrollable.scrollable-y.scrollable-y-bordered{border-bottom:1px solid transparent;border-top:1px solid transparent}body.animation-level-2 .scrollable.scrollable-y.scrollable-y-bordered{transition:border-top-color .3s cubic-bezier(.4,0,.2,1),border-bottom-color .3s cubic-bezier(.4,0,.2,1);transition:border-top-color var(--transition-standard-in),border-bottom-color var(--transition-standard-in)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-top){border-top-color:#dfe1e5;border-top-color:var(--border-color)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-bottom){border-bottom-color:#dfe1e5;border-bottom-color:var(--border-color)}.scrollable-padding{height:100%;min-width:100%}@keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}.selector{display:flex;flex-direction:column;height:100%;width:100%}.selector .selector-search-section{margin-bottom:0!important;padding:0!important}.selector .selector-search-section{position:relative;z-index:1}.selector-search-container{flex:0 0 auto;max-height:132px;overflow:hidden;position:relative}.selector-search-container .scrollable{max-height:inherit;position:relative}.selector-search{display:flex;flex-flow:wrap;padding-left:1rem;padding-right:1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}[dir=ltr] .selector-user{padding-right:17px}[dir=rtl] .selector-user{padding-left:17px}[dir=ltr] .selector-user{margin-left:-.25rem;margin-right:.75rem}[dir=rtl] .selector-user{margin-left:.75rem;margin-right:-.25rem}.selector-user{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:1.5rem;color:#000;color:var(--primary-text-color);flex:0 0 auto;font-size:1rem;height:2rem;line-height:2rem;margin-bottom:7px;max-width:11.25rem;overflow:hidden;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:active,html.no-touch .selector-user:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:active .selector-user-avatar:after,html.no-touch .selector-user:hover .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{animation:scaleIn .1s ease forwards;animation-direction:reverse}[dir=ltr] .selector-user-avatar{margin-right:8px}[dir=rtl] .selector-user-avatar{margin-left:8px}.selector-user-avatar{border-radius:50%!important}.selector-user-avatar{float:left;overflow:hidden;position:relative}.is-rtl .selector-user-avatar{float:right}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}[dir=ltr] .selector-user-avatar:after{left:0}[dir=rtl] .selector-user-avatar:after{right:0}.selector-user-avatar:after{line-height:32px!important}.selector-user-avatar:after{background-color:#df3f40;background-color:var(--danger-color);content:"";font-size:23px;height:100%;opacity:0;position:absolute;top:0;transform:scaleX(-1) rotate(0deg);transition:opacity .2s,transform .2s;width:100%;z-index:2}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{flex:1 1 auto;height:100%}.selector>hr{margin:0;padding:0}[dir=ltr] .selector .checkbox{padding-left:11px}[dir=rtl] .selector .checkbox{padding-right:11px}.selector .checkbox{margin-top:11px}.selector .checkbox-field{--offset-left:0!important;margin:0!important;padding:0!important;position:absolute!important}.selector .checkbox-field{pointer-events:none;top:50%;transform:translateY(-50%);z-index:1}[dir=ltr] .selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}[dir=rtl] .selector .checkbox-field:first-child{margin-left:1.6875rem;margin-right:.6875rem}[dir=ltr] .selector .checkbox-field-round{right:1.125rem}[dir=rtl] .selector .checkbox-field-round{left:1.125rem}.selector .checkbox-field-round{--size:1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}[dir=ltr] .selector-square .checkbox-field{left:1.25rem!important}[dir=rtl] .selector-square .checkbox-field{right:1.25rem!important}[dir=ltr] .selector-square .chatlist-chat.row-with-padding{padding-left:7.5rem!important}[dir=rtl] .selector-square .chatlist-chat.row-with-padding{padding-right:7.5rem!important}[dir=ltr] .selector-square .dialog-avatar{margin-left:3rem!important}[dir=rtl] .selector-square .dialog-avatar{margin-right:3rem!important}.gifs-masonry{grid-gap:.125rem;display:grid;gap:.125rem;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr)}.gifs-masonry .gif img,.gifs-masonry .gif video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gifs-masonry .gif img{left:0;position:absolute;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{animation:rotate 1s linear infinite;bottom:0;height:100%;left:0;margin:auto;position:absolute;right:0;top:0;transform-origin:center center}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{bottom:0;cursor:pointer;display:flex;height:54px;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transform:scale(0);width:54px}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color:#fff}.preloader-container .you-spin-me-round{height:100%;width:100%}.preloader-container .preloader-circular{animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;height:100%;width:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round{animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new,body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{animation:rotate 1s linear infinite!important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{bottom:0;color:var(--color);height:56%;left:0;margin:auto;opacity:1;position:absolute;right:0;top:0;width:56%}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-download:active,html.no-touch .preloader-container .preloader-download:hover{background:none}.preloader-container.manual .preloader-close,.preloader-container:not(.manual) .preloader-download{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{height:1.5rem;width:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer!important}.preloader-container.preloader-streamable circle{stroke-width:2.5!important}.preloader-container.preloader-streamable:after{background-color:var(--color);border-radius:.125rem;content:"";height:.8125rem;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:.8125rem}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@keyframes rotate{to{transform:rotate(1turn)}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.btn-corner.rp .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple,.rp-overflow .c-ripple{border-radius:inherit;height:100%;overflow:hidden;width:100%}.btn-corner.rp .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle,.rp-overflow .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration:.7s;bottom:0;left:0;position:absolute;right:0;top:0}html.is-safari .c-ripple:not(:empty){border-radius:inherit;-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.c-ripple__circle{animation:ripple-effect .7s forwards;background-color:rgba(0,0,0,.08);background-color:var(--ripple-color);border-radius:50%;display:block;pointer-events:none;position:absolute;transform:scale(0);transition:opacity .35s,background-color .35s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.c-ripple{--ripple-duration:.4s}.c-ripple__circle{animation-duration:.4s;animation-name:ripple-effect-handhelds;transition-duration:.3s}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}.avatar-like{line-height:var(--size)!important}.avatar-like{--size:54px;--multiplier:1;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--size)}avatar-element{--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%}avatar-element[data-color=red]{--color-top:var(--peer-avatar-red-top);--color-bottom:var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top:var(--peer-avatar-orange-top);--color-bottom:var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top:var(--peer-avatar-violet-top);--color-bottom:var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top:var(--peer-avatar-green-top);--color-bottom:var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top:var(--peer-avatar-cyan-top);--color-bottom:var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top:var(--peer-avatar-pink-top);--color-bottom:var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top:var(--peer-avatar-blue-top);--color-bottom:var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px/var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px/var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(30px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount{--color-top:var(--peer-avatar-archive-top);--color-bottom:var(--peer-avatar-archive-bottom);overflow:hidden}avatar-element.tgico-deletedaccount:before{font-size:calc(30px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;height:var(--size)!important;width:var(--size)!important}avatar-element img{display:block}avatar-element img.fade-in{animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{height:calc(1.125rem/var(--multiplier))!important;vertical-align:middle!important;width:calc(1.125rem/var(--multiplier))!important}avatar-element.is-forum{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}avatar-element.is-topic{background:none;border-radius:0;position:relative}avatar-element.is-topic .topic-icon{--size:inherit}avatar-element.is-online{position:relative}avatar-element.is-online:after{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;content:" ";display:block;height:14px;left:2.4375rem;position:absolute;top:2.4375rem;width:14px}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size:120px;--multiplier:.45}avatar-element.avatar-100{--size:100px;--multiplier:.54}avatar-element.avatar-48{--size:48px;--multiplier:1.125}avatar-element.avatar-46{--size:46px;--multiplier:1.173913}avatar-element.avatar-44{--size:44px;--multiplier:1.227272}avatar-element.avatar-42{--size:42px;--multiplier:1.285714}avatar-element.avatar-40{--size:40px;--multiplier:1.35}avatar-element.avatar-36{--size:36px;--multiplier:1.5}avatar-element.avatar-35{--size:35px;--multiplier:1.542857}avatar-element.avatar-34{--size:34px;--multiplier:1.588235}avatar-element.avatar-32{--size:32px;--multiplier:1.6875}avatar-element.avatar-30{--size:30px;--multiplier:1.6875}avatar-element.avatar-26{--size:26px;--multiplier:2.076923}avatar-element.avatar-24{--size:24px;--multiplier:2.25}avatar-element.avatar-22{--size:22px;--multiplier:2.454545}avatar-element.avatar-18{--size:18px;--multiplier:3}avatar-element.avatar-16{--size:16px;--multiplier:3.375}.avatar-relative .avatar-photo{left:0;position:absolute;top:0}.avatar-full{align-items:center;border-radius:inherit;display:inline-flex;height:100%;justify-content:center;position:absolute;width:100%}.avatar-full .avatar-photo{height:100%!important;width:100%!important}.avatar-full .avatar-photo{-o-object-fit:cover;object-fit:cover}.document{--background-color:var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}html.is-safari .document-ico{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.document-ico-text{opacity:0}body.animation-level-2 .document-ico-text{transition:opacity .2s ease-in-out}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0}@media only screen and (max-width:600px){.document:not(.document-with-thumb) .document-ico{font-size:14px;padding:1.5rem 0 0}.document:not(.document-with-thumb) .document-ico:after{--size:.875rem}}.document-ico:after{--size:1.125rem;border-bottom-color:rgba(0,0,0,.25);border-bottom-left-radius:.25rem;border-left-color:rgba(0,0,0,.25);border-right-color:#fff;border-right-color:var(--message-background-color);border-style:solid;border-top-color:#fff;border-top-color:var(--message-background-color);border-width:calc(var(--size)/2);content:"";display:block;position:absolute;right:0;top:0}body.animation-level-2 .document-ico:after{transition:border-width .2s ease-in-out}html.no-touch .document:not(.downloaded):active .document-ico:after,html.no-touch .document:not(.downloaded):hover .document-ico:after{border-width:0}html.no-touch .document:not(.downloaded):active .document-ico-text,html.no-touch .document:not(.downloaded):hover .document-ico-text{opacity:0}html.no-touch .document:not(.downloaded):active .preloader-container,html.no-touch .document:not(.downloaded):hover .preloader-container{opacity:1!important}.document:not(.downloading) .document-ico-text{opacity:1}.document:not(.downloading) .preloader-container{opacity:0!important}.document.downloading .document-ico:after{border-width:0}.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name,.document-size{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document.ext-zip{--background-color:#fb8c00}.document.ext-pdf{--background-color:#df3f40}.document.ext-apk{--background-color:#43a047}.document.document-with-thumb{--background-color:#fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.2);border-radius:.375rem}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3)!important}.document-thumb{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.document-name{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16);white-space:nowrap}.document-size{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);pointer-events:none;position:relative}.document .preloader-container{height:2.5rem;width:2.5rem}@media only screen and (max-width:600px){.document .preloader-container{height:1.625rem;width:1.625rem}}.document .preloader-circular{background-color:transparent!important}.document .preloader-path-new{stroke-width:2.5}.audio,.document{--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding-left:var(--padding-left);-webkit-user-select:none;-moz-user-select:none;user-select:none}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);margin-left:calc(var(--padding-left)*-1);position:absolute;width:var(--icon-size)}.audio-download,.document-download{align-items:center;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;opacity:1;transition:opacity .2s ease-in-out;z-index:1}.audio-download.downloaded,.document-download.downloaded{opacity:0}.audio-description,.document-description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio:not(.corner-download) .preloader-container:not(.preloader-streamable),.document:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1)!important}.audio .checkbox-field-round,.document .checkbox-field-round{--margin-top:.25rem;--margin-left:.125rem;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent!important}.audio .preloader-container:not(.preloader-streamable){height:100%;width:100%}.audio{overflow:visible!important}.audio{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size)}.audio-download,.audio-toggle{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{display:flex!important;margin:0!important}.audio.corner-download .audio-download{background:none;height:1.375rem;left:57.5%;top:57.5%;width:1.375rem}.audio.corner-download .preloader-container{background-color:#3390ec;background-color:var(--primary-color);border-radius:inherit}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{border-radius:inherit;bottom:0;left:0;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0;transform:rotate(-119deg)}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{background-color:#fff;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out,-webkit-clip-path .25s ease-in-out}@media only screen and (min-width:601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width:600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width:601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width:600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:active,html.no-touch .audio-waveform-background rect:hover{opacity:1}.audio-waveform-fake{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;width:0}.audio-waveform-container{height:23px;margin-top:1px;position:relative}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color)}.audio .audio-details{margin-bottom:0;margin-top:3px}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px!important;width:112px!important}@media only screen and (max-width:600px){.audio .part{height:100px!important;width:100px!important}}.audio-title{color:#000;color:var(--primary-text-color);font-size:1rem}.audio-description:not(:empty):before{content:" • "}.audio-subtitle,.audio-time{color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem}@media only screen and (max-width:600px){.audio-subtitle,.audio-time{font-size:.75rem}}.audio-subtitle,.audio-time,.audio-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-subtitle,.audio-title{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{align-items:center;line-height:1;margin-left:-1px;margin-top:7px}@media only screen and (max-width:600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:" ";height:.5rem;margin-left:.375rem;width:.5rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.audio .progress-line{--height:2px;--border-radius:4px;--thumb-size:.75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{background-color:transparent;opacity:1;z-index:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff!important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;width:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:8px;transform:translate3d(0,calc(-100% - 10px),0);transition:transform .2s ease;width:100%}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translateZ(0)}[dir=ltr] .quiz-hint .container{text-align:left}[dir=rtl] .quiz-hint .container{text-align:right}.quiz-hint .container{align-items:center;background:rgba(0,0,0,.7);border-radius:12px;color:#fff;display:flex;flex-wrap:wrap;font-size:15px;line-height:1.5;max-width:400px;min-height:48px;overflow:hidden;padding:10px 18px 12px 50px;position:relative;text-align:center;width:auto}@media only screen and (max-width:600px){.quiz-hint .container{font-size:14px;margin:0 10px;padding:10px 18px 12px 54px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:"";font-size:1.5rem;left:15px;position:absolute;top:12px}.quiz-hint .container a{border-bottom:1px solid #fff;color:#fff}.peer-typing{margin-right:4px}.peer-typing-container{--color:var(--primary-color);color:var(--color)}.peer-typing-flex{align-items:center;display:flex}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;transform:translateY(-1px);vertical-align:middle}.peer-typing-text-dot{animation-duration:.6s;animation-iteration-count:infinite;animation-name:dotMiddle;animation-timing-function:linear;background-color:var(--color);border-radius:50%;display:inline-block;height:6px;margin:0 .5px;vertical-align:middle;width:6px}.peer-typing-text-dot:first-child{animation-name:dotFirst}.peer-typing-text-dot:last-child{animation-name:dotLast}.peer-typing-upload{border-radius:2px;height:5px;margin-right:.375rem;overflow:hidden;position:relative;width:13px}.peer-typing-upload:after,.peer-typing-upload:before{background-color:var(--color);border-radius:inherit;bottom:0;content:" ";display:block;left:0;position:absolute;right:0;top:0}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{animation:recordBlink 1.25s infinite;background-color:var(--color);border-radius:50%;content:" ";display:block;height:6px;width:6px}.peer-typing-choosing-sticker{align-items:center;display:flex;flex:0 0 auto;height:16px;margin-right:.375rem}.peer-typing-choosing-sticker-eye{animation:eye 1.8s ease-in-out infinite;border:1px solid var(--color);border-radius:50%;display:inline-block;height:14px;margin:0 .0625rem;position:relative;vertical-align:middle;width:8px}.peer-typing-choosing-sticker-eye:before{animation:eye-move 1.8s ease-in-out infinite;background-color:var(--color);border-radius:50%;content:" ";display:block;height:.25rem;position:absolute;top:50%;transform:translate(-1px,-50%);width:.25rem}@keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}poll-element{color:#000;color:var(--primary-text-color);display:block;margin-top:-1px;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:330px}@media only screen and (max-width:600px){poll-element{max-width:100%;width:240px}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (max-width:600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;margin-bottom:5px;margin-top:2px;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1.5rem;position:absolute;right:2px;top:-4px;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{pointer-events:none;transform:scale(0)}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{cursor:pointer;display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;height:18px;width:18px}poll-element .poll-answer{display:flex;margin-top:1px;padding-bottom:20px;padding-left:28px;position:relative}poll-element .poll-answer-text{margin-left:12px;margin-top:6px}[dir=ltr] poll-element .poll-answer-percents{text-align:right}[dir=rtl] poll-element .poll-answer-percents{text-align:left}poll-element .poll-answer-percents{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);left:0;margin-left:-9px;margin-top:7px;opacity:0;position:absolute;top:0;width:40px}poll-element .poll-answer-selected{align-items:center;background:#3390ec;background:var(--primary-color);border-radius:50%;bottom:1px;color:#fff;display:flex;font-size:.75rem;font-weight:500;font-weight:var(--font-weight-bold);height:16px;justify-content:center;left:15px;opacity:1;position:absolute;width:16px}poll-element .poll-answer-selected:before{content:"";font-weight:500;font-weight:var(--font-weight-bold)}html.no-touch poll-element .poll-answer:active .animation-ring,html.no-touch poll-element .poll-answer:hover .animation-ring{transform:scale(1);visibility:visible}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-.5rem}poll-element .poll-line{stroke-dashoffset:0;stroke-dasharray:0,485.9;bottom:2px;height:35px;left:10px;position:absolute}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{height:2.875rem;margin:-.375rem -.5rem -.375rem -.625rem;text-align:center}poll-element .poll-footer-button{border-top-left-radius:0!important;border-top-right-radius:0!important}poll-element .poll-footer-button{color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;overflow:hidden;width:100%}poll-element .poll-footer,poll-element .poll-footer-button{align-items:center;display:flex;justify-content:center}poll-element .poll-quiz-timer{stroke:#a3adb6;fill:none;stroke-linecap:round;height:32px;position:absolute;right:-2px;top:-7px;transform:rotate(270deg);width:32px}poll-element .poll-time{color:#a3adb6;font-size:12px;font-weight:500;font-weight:var(--font-weight-bold);position:absolute;right:27px}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:"";font-size:12px}poll-element .circle-hover{align-items:center;display:flex;height:34px;justify-content:center;left:-1px;position:absolute;top:-1px;transform:scale(1);width:34px}poll-element .circle-hover .poll-answer-selected{display:flex!important}poll-element .circle-hover .poll-answer-selected{animation:none;font-size:20px;height:20px;left:50%;line-height:16px;opacity:0;top:50%;transform:translate(-50%,-50%);width:20px}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;display:block;height:34px;transform:scale(.1);visibility:hidden;width:34px}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;left:auto;top:auto;width:26px}poll-element .progress-ring__circle{stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent;transform:rotate(-90deg);transform-origin:center}poll-element.is-voted .animation-ring,poll-element.is-voted .circle-hover{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity forwards .1s ease}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:opacity .34s}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:transform .1s}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{animation-fill-mode:forwards!important}.transition>.transition-item{height:100%;left:0;position:absolute;top:0;width:100%}.transition>.transition-item:not(.active):not(.from):not(.to){display:none!important}.transition.zoom-fade>.from{opacity:1;transform:scale(1);transform-origin:center}.transition.zoom-fade>.to{opacity:0;transform-origin:center}.transition.zoom-fade.animating>.from{animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(.95)}.transition.zoom-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine:cubic-bezier(.39,.575,.565,1);--easeInSine:cubic-bezier(.47,0,.745,.715);position:relative}.transition.slide-fade>.from{opacity:1;transform:translateX(0);transform-origin:left center}.transition.slide-fade>.to{opacity:0;transform:translateX(1.5rem);transform-origin:left center}.transition.slide-fade.animating>.from{animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{opacity:1;transform:translateX(0)}.transition.slide-fade.backwards>.to{opacity:0;transform:translateX(-1.5rem)}.transition.slide-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}.row{display:flex;flex-direction:column;justify-content:center;min-height:3.5rem;padding:.4375rem 1rem;position:relative}.row.no-subtitle,.row.row-small{min-height:3rem;padding-bottom:.1875rem;padding-top:.1875rem}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.row.is-disabled{pointer-events:none!important}.row.is-disabled{opacity:.3;opacity:var(--disabled-opacity)}.row.no-wrap{padding-bottom:0!important;padding-top:0!important}.row a{pointer-events:all;position:relative;z-index:1}.row-title-row,.row>.row-title{order:0}[dir=ltr] .row-big{padding-left:1rem;padding-right:.75rem}[dir=rtl] .row-big{padding-left:.75rem;padding-right:1rem}.row-big{min-height:4.5rem;padding-bottom:.5625rem;padding-top:.5625rem}.row-row{align-items:center;display:flex;justify-content:space-between}.row-row .row-subtitle,.row-row .row-title{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row-subtitle-row,.row>.row-subtitle{order:1}.row-title{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;word-break:break-word}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}[dir=ltr] .row-subtitle-right,[dir=ltr] .row-title-right{margin-left:1rem}[dir=rtl] .row-subtitle-right,[dir=rtl] .row-title-right{margin-right:1rem}.row-subtitle-right,.row-title-right{flex:0 0 auto!important}.row-midtitle,.row-subtitle,.row-title{pointer-events:none;position:relative}.row-midtitle{font-size:14px;font-size:var(--font-size-14);margin-top:.125rem;order:1}[dir=ltr] .row-with-padding{padding-left:4.5rem}[dir=rtl] .row-with-padding{padding-right:4.5rem}@media only screen and (max-width:600px){[dir=ltr] .row-with-padding{padding-left:4rem}[dir=rtl] .row-with-padding{padding-right:4rem}}[dir=ltr] .row-with-padding.tgico:before{left:1rem}[dir=rtl] .row-with-padding.tgico:before{right:1rem}.row-with-padding.tgico:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);z-index:1}.row-with-padding:not(.row-with-icon):before{display:none}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}[dir=ltr] .row-sortable .row-subtitle,[dir=ltr] .row-sortable .row-title{padding-right:2.5rem}[dir=rtl] .row-sortable .row-subtitle,[dir=rtl] .row-sortable .row-title{padding-left:2.5rem}[dir=ltr] .row-sortable-icon{right:.75rem}[dir=rtl] .row-sortable-icon{left:.75rem}.row-sortable-icon{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;height:1.5rem;line-height:1;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.row-sortable.cant-sort .row-sortable-icon{display:none}.row-sortable.is-dragging{background-color:#fff!important;background-color:var(--surface-color)!important}.row-sortable.is-dragging{z-index:1}html.no-touch .row-sortable.is-dragging:active,html.no-touch .row-sortable.is-dragging:hover{background-color:#f4f4f4!important;background-color:var(--light-filled-secondary-text-color)!important}body.animation-level-2 .is-reordering .row-sortable{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{padding-left:3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{padding-right:3.375rem}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{margin-left:-3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{margin-right:-3.375rem}.row .checkbox-field,.row .radio-field,.row .radio-field:not(.radio-field-right) .radio-field-main{position:static}.row .checkbox-field,.row .radio-field{--offset-left:1rem}.row .radio-field{margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field{margin-right:0}[dir=rtl] .row .checkbox-field{margin-left:0}.row .checkbox-field{height:auto;margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field .checkbox-caption{padding-left:0}[dir=rtl] .row .checkbox-field .checkbox-caption{padding-right:0}.row .checkbox-field .checkbox-caption{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row .checkbox-field-toggle{margin-left:.125rem;margin-right:.125rem;padding:0}.row-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;font-size:14px!important;font-size:var(--font-size-14)!important}.row-subtitle{line-height:18px;line-height:var(--line-height-14);margin-top:.1875rem}.row-subtitle:empty{display:none}[dir=ltr] .row-media{left:.75rem}[dir=rtl] .row-media{right:.75rem}.row-media{height:2.25rem!important;margin:0!important;position:absolute!important;width:2.25rem!important}.row-media{align-items:center;display:flex;justify-content:center;pointer-events:none}[dir=ltr] .row-media-small{left:.75rem!important}[dir=rtl] .row-media-small{right:.75rem!important}.row-media-small{height:2rem!important;width:2rem!important}[dir=ltr] .row-media-abitbigger{left:.75rem!important}[dir=rtl] .row-media-abitbigger{right:.75rem!important}.row-media-abitbigger{height:2.625rem!important;width:2.625rem!important}[dir=ltr] .row-media-big{left:.5rem!important}[dir=rtl] .row-media-big{right:.5rem!important}.row-media-big{height:3rem!important;width:3rem!important}[dir=ltr] .row-media-bigger{left:.5625rem!important}[dir=rtl] .row-media-bigger{right:.5625rem!important}.row-media-bigger{height:3.375rem!important;width:3.375rem!important}.row.menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}[dir=ltr] .row>.btn-primary{right:1rem}[dir=rtl] .row>.btn-primary{left:1rem}.row>.btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding-left:.75rem;padding-right:.75rem;position:absolute;top:50%;transform:translateY(-50%);width:auto}body.animation-level-2 .row>.btn-primary{transition:width .2s,background-color .2s,color .2s}.row>.btn-primary.active{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important}.row>.btn-primary.active{color:#3390ec;color:var(--primary-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:380px}@media only screen and (max-width:600px){.color-picker{padding:0 .75rem}}.color-picker-box{height:198px;width:100%}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible!important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{display:flex!important;padding:0!important;position:absolute!important;width:26.25rem!important}.reply-keyboard{background:#fff;background:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);flex-direction:column;max-height:26.25rem;max-width:100%;opacity:0;overflow:hidden;right:0;transform:scale(0);transform-origin:bottom right;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);z-index:3}@media only screen and (max-height:569px),only screen and (max-width:600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{background-color:transparent;border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:.375rem;color:#3390ec;color:var(--primary-color);font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);height:3rem;text-align:center;width:100%}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:active,html.no-touch .reply-keyboard-button:hover{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.reply-keyboard .scrollable-y{padding:.625rem!important}.reply-keyboard .scrollable-y{bottom:auto;height:auto;left:auto;max-height:100%;position:relative;right:auto;top:auto}.peoplenearby-container div.text.nearby-description{color:#000;color:var(--primary-text-color);margin-top:15px;text-align:center}.peoplenearby-container div.text.nearby-error{color:#aaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{align-items:center;display:flex;justify-content:center;min-height:140px;width:100%}.peoplenearby-container .locating-animation-container .tgico.tgico-location{align-items:center;background:#3d9de0;background:var(--avatar-color-bottom);border-radius:50%;display:flex;height:140px;justify-content:center;padding:50px;width:140px}.peoplenearby-container .locating-animation-container .tgico.tgico-location:before{color:#fff;font-size:58px}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{animation:waves-animation 3s infinite;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:50px;margin-left:36px;width:50px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{animation:waves-animation 5s infinite;animation-delay:2s;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:71px;margin-left:51px;margin-top:1px;width:66px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px!important}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px!important}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{transform:rotateY(180deg)}@keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}.spoiler{--anim:.4s ease;background-color:#e3e5e8;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}.spoilers-container .custom-emoji-canvas{z-index:-1}.spoilers-container.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.spoilers-container.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim)}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler-text{opacity:1}.spoilers-container:not(.is-spoiler-visible) .spoiler{cursor:pointer}.spoilers-container:not(.is-spoiler-visible) .spoiler-text{pointer-events:none}.emoji-animation,.emoji-animation-container{pointer-events:none;position:absolute}.emoji-animation-container{bottom:0;left:0;overflow:hidden;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:inline;display:initial}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction,.reaction-sticker{align-items:center;display:flex}.reaction-sticker{--custom-emoji-size:var(--reaction-size);height:var(--reaction-size);justify-content:center;position:relative;width:var(--reaction-size)}.reaction-sticker-activate{bottom:var(--reaction-offset);left:var(--reaction-offset);position:absolute;right:var(--reaction-offset);top:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{height:var(--size)!important;width:var(--size)!important}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto}.reaction-sticker.is-custom{border-radius:.3125rem}.reaction-sticker.is-custom .custom-emoji,.reaction-sticker.is-custom .media-sticker{border-radius:inherit}.reaction-sticker.is-custom .custom-emoji-canvas{z-index:auto}.reaction-inline{--reaction-size:.875rem;--reaction-offset:-.4375rem;min-height:var(--reaction-size);min-width:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit!important;margin-right:.0625rem!important}.reaction-inline .reaction-counter{order:-1}.reaction-block{--additional-height:.5rem;--margin:.375rem;--reaction-size:1.375rem;--reaction-offset:-.5625rem;--background-color:var(--message-highlightning-color);--chosen-background-color:var(--message-primary-color);--counter-color:#fff;--reaction-total-size:calc(var(--reaction-size) + var(--additional-height));background-color:#f4f4f5;background-color:var(--background-color);border-radius:var(--reaction-total-size);color:var(--counter-color);cursor:pointer;height:var(--reaction-total-size);margin-right:var(--margin);margin-top:var(--margin);padding:0 .5rem;position:relative}html.no-touch .reaction-block:active:after,html.no-touch .reaction-block:hover:after{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:" ";left:0;opacity:.08;position:absolute;right:0;top:0}.reaction-block .reaction-counter,.reaction-block .reaction-sticker{z-index:1}.reaction-block:last-child{margin-right:0}.reaction-block:before{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:" ";left:0;opacity:0;position:absolute;right:0;top:0;transform:scale(0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scale(1)}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color:var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color .3s cubic-bezier(.4,0,.2,1);transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color .3s cubic-bezier(.4,0,.2,1);transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color:transparent;--border-size:.125rem;--margin-right:-.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem!important}.reaction-block .reaction-counter{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin:0 .0625rem 0 .375rem;position:relative}.stacked-avatars{--border-color:var(--surface-color);--border-size:1px;--margin-right:-.3125rem;--avatar-size:1rem;--avatar-total-size:calc(var(--avatar-size) + var(--border-size)*2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{height:var(--avatar-size);width:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{align-items:center;border:var(--border-size) solid var(--border-color);border-radius:50%;display:flex;height:var(--avatar-total-size);justify-content:center;position:relative;width:var(--avatar-total-size)}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.sticker-viewer{align-items:center;bottom:0;display:flex;justify-content:center;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:4}.sticker-viewer:before{background-color:rgba(0,0,0,.6);bottom:0;content:" ";left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .sticker-viewer:before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.sticker-viewer.is-visible:not(.backwards):before{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards):before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .emoji-animation,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .emoji-animation,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker:not(.is-overflow){transition:opacity 0s}.sticker-viewer-transformer{--translateX:0;align-items:center;display:flex;height:360px;justify-content:center;position:absolute;width:360px}.sticker-viewer-transformer.has-effect{height:280px;width:280px}.sticker-viewer-transformer.has-effect .sticker-viewer-emoji{top:-5.5rem}body.animation-level-2 .sticker-viewer-transformer{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-out)}.sticker-viewer-transformer.is-switching{opacity:1!important;transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer-transformer.is-switching{transition:transform .2s cubic-bezier(.12,1.1,.56,1.2),opacity .2s cubic-bezier(.12,1.1,.56,1.2)!important;transition:transform var(--sticker-viewer-switch-transition),opacity var(--sticker-viewer-switch-transition)!important}.sticker-viewer-transformer.is-switching:not(.backwards){opacity:0!important;transform:scale(.4) translateX(var(--translateX))!important}.sticker-viewer-emoji{position:absolute;top:-3rem;transform:translateX(var(--translateX)) scale(2)}.sticker-viewer-sticker{position:absolute}.sticker-viewer .emoji-animation,.sticker-viewer-emoji,.sticker-viewer-sticker{opacity:0}body.animation-level-2 .sticker-viewer .emoji-animation,body.animation-level-2 .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.custom-emoji{height:1.25rem!important;height:var(--custom-emoji-size)!important;min-height:1.25rem!important;min-height:var(--custom-emoji-size)!important;min-width:1.25rem!important;min-width:var(--custom-emoji-size)!important;width:1.25rem!important;width:var(--custom-emoji-size)!important}.custom-emoji{display:inline;position:relative}.custom-emoji:before{content:" ";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.custom-emoji .media-sticker,.custom-emoji .rlottie{height:inherit!important;max-height:inherit!important;max-width:inherit!important;width:inherit!important}.custom-emoji .media-sticker,.custom-emoji .rlottie{margin:0;pointer-events:none;text-indent:-9999px}.custom-emoji-canvas{height:100%;width:100%}.custom-emoji-canvas,.custom-emoji-renderer{bottom:0;left:0;position:absolute;right:0;top:0}.custom-emoji-renderer{pointer-events:none}.custom-emoji-placeholder{display:inline;height:20px;height:var(--messages-custom-emoji-size);margin-top:-.125rem;vertical-align:middle;width:20px;width:var(--messages-custom-emoji-size)}.usernames-username-icon{background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:50%;color:#fff;font-size:1.25rem}.usernames-username-icon:before{content:""}.usernames-username.active .usernames-username-status{color:#3390ec!important;color:var(--primary-color)!important}.usernames-username.active .usernames-username-icon{background-color:#3390ec;background-color:var(--primary-color)}.topics-slider{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0}.topics-container{background-color:#fff!important;background-color:var(--surface-color)!important;width:var(--width)!important}.topics-container{--offset:0;--width:100%}.topics-container.is-floating{overflow:visible!important;overflow:initial!important}.topics-container.is-floating{--offset:5.0625rem;--width:calc(var(--left-column-width) - var(--offset));border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);bottom:0;pointer-events:all;position:absolute;right:0;top:0;transform:translateX(var(--width));z-index:3}.topics-container.is-visible:not(.backwards){transform:translateX(0)}.topics-container.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.topics-container.is-visible.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.topics-container .sidebar-header{padding:0 .75rem}.topics-container .sidebar-header__rows{flex:1 1 auto;overflow:hidden;padding-left:.5rem}.topics-container .sidebar-header__rows .sidebar-header__title{padding-left:0!important}.topics-container .sidebar-header__rows .sidebar-header__title{font-size:16px;font-size:var(--font-size-16);line-height:21px;line-height:var(--line-height-16);margin-bottom:.125rem}.topics-container .sidebar-header__subtitle,.topics-container .sidebar-header__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topics-container .sidebar-header__subtitle{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14)}.topics-container .chatlist-chat{min-height:4rem;padding-left:.75rem}.topic-name .topic-icon{margin-right:.25rem}.topic-name-button{text-decoration:none!important}.topic-name-button{--color:var(--primary-color);align-items:center;color:var(--color);cursor:pointer;display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:1.5rem;justify-content:center;max-width:100%;padding:0 .5rem;position:relative}.topic-name-button-container{display:flex!important}.topic-name-button-container{align-items:flex-start;justify-content:flex-start}.topic-name-button .peer-title,.topic-name-button .topic-name{position:relative}.topic-name-button:before{background-color:var(--color);border-radius:1.5rem;bottom:0;content:" ";left:0;opacity:.08;position:absolute;right:0;top:0}html.no-touch .topic-name-button:active:before,html.no-touch .topic-name-button:hover:before{opacity:.16}.topic-icon{line-height:1.875!important}.topic-icon{--size:1.25rem;--custom-emoji-size:var(--size);display:inline-flex;font-size:calc(var(--size)/2);justify-content:center;position:relative;vertical-align:middle}.topic-icon-general{fill:#c4c9cc;fill:var(--secondary-color);height:var(--size);width:var(--size)}.topic-icon-svg{height:inherit;position:absolute;width:inherit}.topic-icon-content{position:relative}.edit-topic-container .scrollable-y{display:flex;flex-direction:column}.edit-topic-icon{position:absolute}.edit-topic-icon .topic-icon{--size:4rem}.edit-topic-icon-container{align-items:center;cursor:pointer;display:flex;height:100px;justify-content:center;margin:0 auto;position:relative;width:100px}.edit-topic-emoticons-container{flex:1 1 auto}.edit-topic-emoticons-container .sidebar-left-section{padding:0!important}.edit-topic-emoticons-container .sidebar-left-section{height:100%}.edit-topic-emoticons-container .emoji-padding{display:flex;flex-direction:column}.edit-topic-emoticons-container .super-emoji-topic-icon .topic-icon{--size:var(--esg-emoji-size);--custom-emoji-size:inherit;margin-left:calc((var(--custom-emoji-size) - var(--esg-emoji-size))/2)}.popup{position:fixed!important}.popup{background-color:rgba(0,0,0,.3);bottom:0;box-shadow:none;display:flex;left:0;margin:0;max-width:none;opacity:0;overflow:auto;padding:1.875rem;right:0;top:0;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-property:opacity,visibility;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:var(--popup-transition-function);-webkit-user-select:none;-moz-user-select:none;user-select:none;visibility:hidden;z-index:3}.popup.no-overlay{background-color:transparent;overflow:visible;padding:0}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;transition-delay:0s,0s;visibility:visible;z-index:4}.popup.active .popup-container,.popup.hiding .popup-container{transform:translate3d(var(--translateX),0,0)}[dir=ltr] .popup-title{padding-left:1.5rem;padding-right:1rem}[dir=rtl] .popup-title{padding-left:1rem;padding-right:1.5rem}.popup-title{flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1;margin:0}.popup-title:first-child{padding-left:0}.popup-container{--translateX:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;margin:auto;overflow:hidden;padding:1rem;position:relative;transform:translate3d(var(--translateX),3rem,0);transition:transform .15s cubic-bezier(.4,0,.2,1);transition:transform var(--popup-transition-time) var(--popup-transition-function)}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-centerer{margin:auto}.popup-close{flex:0 0 auto;justify-self:center;z-index:3}.popup-header{align-items:center;display:flex;flex:0 0 auto;margin-bottom:2rem;position:relative}.popup-body{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{align-items:center;display:flex;flex-direction:row-reverse;height:3rem;justify-content:flex-start;padding:0 .5rem}.popup-buttons .btn{border-radius:10px;font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;max-width:100%;overflow:hidden;padding:0 1rem;position:relative;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}[dir=ltr] .popup-buttons .btn+.btn{margin-right:.625rem}[dir=rtl] .popup-buttons .btn+.btn{margin-left:.625rem}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{bottom:20px;position:absolute;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}[dir=ltr] .popup-avatar h6{text-align:left}[dir=rtl] .popup-avatar h6{text-align:right}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem}.popup-avatar .crop{border-radius:8px;max-height:100%;max-width:100%;padding:24px 54px 46px 46px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{max-height:100%;max-width:420px;padding:12px 20px 32.5px;width:420px}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{align-items:center;flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{border-radius:10px;font-size:14px;font-size:var(--font-size-14);height:2.25rem;line-height:2.25rem;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-photo{border-radius:10px;max-width:380px;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{flex:0 0 auto;margin-top:25px;width:100%}.popup-new-media .input-field-input{border-radius:10px;font-size:1rem}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{top:calc(100% + .25rem);z-index:4}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{border-radius:inherit;overflow:hidden;position:relative}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{cursor:default;height:4.5rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{font-weight:400;line-height:1.5;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{font-size:16px;font-weight:400;height:48px;letter-spacing:0;line-height:11px;width:48px}.popup-create-contact .name-fields{display:flex;flex-direction:column;margin-top:1rem;padding-left:116px;position:relative}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{left:0;position:absolute;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{align-items:center;display:flex;height:2.5rem;margin:0;padding:0 1rem;width:-moz-max-content;width:max-content}.popup-peer .popup-container{max-width:min(400px,100%);min-width:min(100%,17.5rem);padding:.75rem .5rem;width:-moz-min-content;width:min-content}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.popup-peer .popup-title:not(:first-child){padding-left:1rem}.popup-peer .popup-description{line-height:1.3125;line-height:var(--line-height);margin-bottom:0;margin-top:0;max-width:-moz-fit-content;max-width:fit-content;min-width:min(100%,15rem);overflow:hidden;padding:.625rem 1rem .5rem;text-overflow:ellipsis;word-break:break-word}.popup-peer .checkbox-field{align-items:center;display:flex;height:3rem;margin:0;padding:0 1.125rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-stickers .sticker-set-footer{color:#3390ec;color:var(--primary-color);text-align:center}.popup-stickers .sticker-set-footer .btn-primary{height:44px;line-height:44px;padding:0 1.0625rem;text-transform:uppercase;width:auto}.popup-stickers .scrollable.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .super-emojis{padding:0 .5rem}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}[dir=ltr] .popup-stickers .popup-close{margin-left:1rem}[dir=rtl] .popup-stickers .popup-close{margin-right:1rem}.popup-stickers .popup-close{font-size:1.5rem}.popup-stickers .popup-header{flex:0 0 auto;margin:.625rem 0}.popup-stickers .sticker-set{margin:.0625rem 0}.popup-stickers .sticker-set .row-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-stickers .sticker-set-stickers{--per-row:5;--item-size:var(--popup-sticker-size);display:grid;grid-template-columns:repeat(var(--per-row),1fr);padding:0 5px;position:relative}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{--per-row:4}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper{cursor:pointer;height:var(--item-size);justify-self:center;margin-bottom:2px;position:relative;width:var(--item-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers .media-sticker-wrapper{margin-bottom:8px}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height:470px){.popup-date-picker .popup-container[data-lines="7"]{top:19px}.popup-date-picker .popup-container[data-lines="5"]{top:-19px}}.popup-date-picker .popup-header{margin-bottom:1.375rem;margin-left:6px;margin-top:4px}.popup-date-picker .popup-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .popup-buttons{margin-right:-2px;order:2}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{align-items:center;display:flex;justify-content:space-between}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-next:disabled,.popup-date-picker .date-picker-prev:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-bottom:1.5rem;margin-top:7px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7,1fr);justify-content:center;width:100%}.popup-date-picker .date-picker-month .btn-icon{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:12px;height:38px;justify-content:center;justify-self:center;width:38px}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7!important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important}.popup-date-picker .date-picker-month .btn-icon.active{border-radius:50%;color:#fff;color:var(--badge-text-color)}.popup-schedule .popup-header{justify-content:space-between;margin-bottom:17px;margin-left:0;margin-top:5px}@media only screen and (max-width:600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;padding:4px 16px 16px;width:420px}@media only screen and (max-width:600px){.popup-schedule .popup-container{min-width:312px;padding:4px 14px 14px;width:312px}}.popup-schedule .popup-container[data-lines="5"]{top:-16px}.popup-schedule .popup-container[data-lines="7"]{top:16px}.popup-schedule .date-picker-month{margin-left:2px;margin-right:-20px;width:auto}@media only screen and (max-width:600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold);margin-left:-5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);height:36px;justify-self:auto;margin-top:-4px;width:36px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8!important}.popup-schedule .date-picker-month-day{color:#000!important;color:var(--primary-text-color)!important;font-size:14px!important}.popup-schedule .date-picker-month-day{font-weight:500;font-weight:var(--font-weight-bold)}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width:600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:400}@media only screen and (max-width:600px){.popup-schedule .btn-primary{widtH:280px;height:50px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px,100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main:before{left:.25rem}.popup-create-poll .radio-field .radio-field-main:after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{opacity:0!important}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{pointer-events:none}.popup-create-poll .input-field .btn-icon{opacity:1;position:absolute;right:.4375rem;top:.4375rem;transition:opacity .2s ease;z-index:1}@media only screen and (max-width:600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{font-size:.875rem;line-height:1.2;margin-top:.875rem}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{right:20px;top:54px}.popup-create-poll hr:not(.hide){display:block!important}.popup-forward .popup-container{height:40.625rem;max-height:min(40.625rem,100%);max-width:420px;padding:7px 0 0;width:420px}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:7px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.8125rem}}.popup-forward .popup-title{flex-grow:1;height:100%;padding:0}.popup-forward .chatlist-container,.popup-forward .selector{display:flex;flex:1 1 auto;flex-direction:row;height:auto;overflow:hidden;width:100%}.popup-forward .selector-search-input{font-size:20px;font-size:var(--font-size-20);height:100%;line-height:1;padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.1875rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{margin-bottom:0!important;padding-top:0!important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;pointer-events:none;text-align:center}.popup-instance-deactivated .header{color:#fff;font-size:2rem}.popup-instance-deactivated .subtitle{color:#fff;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height);opacity:.6}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.75rem 0 .25rem}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{height:100px;margin:0 auto;position:relative;width:100px}.popup-report-messages-confirm .popup-body{margin:1em -.5rem .375rem;overflow:visible;overflow:initial}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-call .popup-header{justify-content:space-between;width:100%}.popup-call .popup-title{flex:1 1 auto}.call{align-items:center;color:#fff;height:100%;width:100%}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state,.call.no-video .call-subtitle,.call.no-video .call-title,.call.no-video .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.show-controls .call-subtitle,.call.show-controls .call-title,.call.show-controls .popup-header{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{margin-right:1rem;transform:scale(1.3125)}.call-avatar{border-radius:inherit;bottom:0;left:0;opacity:.7;position:absolute;right:0;top:0;z-index:-1}.call-avatar .avatar-full{font-size:6rem}.call-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.call-subtitle{font-size:1rem}.call .popup-header,.call-emojis,.call-subtitle,.call-title{opacity:0}body.animation-level-2 .call .popup-header,body.animation-level-2 .call-emojis,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-title{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;pointer-events:none;position:absolute;z-index:1}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale:1}.call-buttons .call-button-container.hide-me{--scale:0!important}.call-buttons .call-button-container.hide-me{transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(-2.6875rem);transform:translateX(calc(var(--call-button-size)*-.5 + var(--call-button-margin)*-.5))}.call-buttons.is-second{--margin-length:2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(6.75rem + 2rem*var(--margin-length)));transform:translateX(calc(var(--call-button-size)*2 + var(--call-button-margin)*var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length:.656875}.call-button{background-color:hsla(0,0%,100%,.1)}.call-button-red{background-color:#df3f40!important;background-color:var(--danger-color)!important}.call-button-green{background-color:#5cc85e!important;background-color:var(--gc-green-text-color)!important}.call-button.active{background-color:#fff!important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{border-radius:inherit;height:100%;-o-object-fit:contain;object-fit:contain;opacity:1;position:absolute;width:100%}.call-video-container{align-items:center;background-color:#000;bottom:0;display:flex;left:0;position:absolute;right:0;top:0;z-index:-1}.call-video-container.small{border-radius:10px;bottom:8rem;cursor:pointer;left:auto;right:1rem;top:auto;z-index:1}.call-video-blur{border-radius:inherit;height:100%;opacity:.7;position:absolute;width:100%}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{align-items:center;bottom:7.625rem;bottom:calc(4.25rem + var(--call-button-size));display:flex;flex-direction:column;padding:0 1rem;pointer-events:none;position:absolute;width:100%;z-index:2}.call-party-state{align-items:center;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:hsla(0,0%,100%,.2);border-radius:1.625rem;color:#fff;display:flex;font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:1.625rem;line-height:1.625rem;margin-top:1rem;max-width:100%;opacity:0;padding:0 .625rem;transform:scale(0) translateY(0)}body.animation-level-2 .call-party-state{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{height:1.875rem!important;width:1.875rem!important}.call-party-state .rlottie-icon{flex:0 0 auto;margin-left:-.25rem;margin-right:.25rem}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(-6.5rem);transform:translateY(calc(var(--call-button-size)*-1 + var(--call-button-margin)*-1 + -1.125rem))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-left-radius:0;border-bottom-right-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin:1.25rem;height:100%;padding:0 .5rem;width:100%}.group-call:after{background:linear-gradient(180deg,rgba(33,33,33,0),rgba(33,33,33,.65) 48.54%,#212121);background:linear-gradient(180deg,rgba(33,33,33,0) 0,rgba(33,33,33,.65) 48.54%,var(--gc-background-color) 100%);bottom:0;content:" ";height:7.5rem;left:0;position:absolute;right:0}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{color:inherit;flex:0 0 auto}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-header-subtitle,.group-call-header-title{font-size:16px;font-size:var(--font-size-16);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-header-subtitle{color:#aaa;color:var(--gc-secondary-text-color);font-size:.875rem}.group-call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;justify-content:space-between;position:absolute;z-index:1}.group-call-button{background-color:rgba(1,200,80,.2);background-color:var(--gc-button-unmuted-color);color:#fff;color:var(--gc-primary-text-color);opacity:1}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60,135,247,.2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223,68,184,.2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255,89,90,.3)!important;background-color:var(--gc-button-leave-color)!important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg,#00a3b4 12.94%,#00cb47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg,#4eabf8 14.73%,#3478f6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg,#df44b8 14.73%,#3851eb 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{padding-right:.5rem}.group-call-participant-status-icon{display:inline-block;font-size:1.125rem;height:1.125rem;line-height:1;margin-right:6px;vertical-align:middle;width:1.125rem}.group-call-participant-status-container{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant .dialog-subtitle,.group-call-participant .dialog-title{padding-right:2.5rem}.group-call-participant-muted-icon-container{position:absolute!important}.group-call-participant-muted-icon-container{right:.5rem}.group-call-participant-video-container{align-items:center;background-color:#000;border-radius:10px;cursor:pointer;display:flex;flex:1 1 auto;height:15rem;margin:.25rem;overflow:hidden;position:relative;width:100%;width:33%}.group-call-participant-video-container:after{background:linear-gradient(180deg,transparent 55.62%,rgba(0,0,0,.5) 86.46%);bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;height:1.25rem;width:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-header,.group-call-participant-video-info{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-header,body.animation-level-2 .group-call-participant-video-info{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-header,.group-call-participant-video-info{align-items:center;bottom:.25rem;display:flex;justify-content:space-between;left:0;padding:0 .5rem 0 .75rem;position:absolute;right:0;z-index:1}.group-call-participant-video-header{bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem;top:0}.group-call-participant-video-header .group-call-pin-icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-video-info .group-call-participant-status-container{margin-top:-1px;opacity:.6}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;height:2rem;margin-left:.75rem;width:2rem}.group-call-participant .is-speaking{color:#5cc85e;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;flex:1 1 auto;overflow:hidden}.group-call-participants-scrollable{border-radius:inherit;height:auto;padding-bottom:6rem;position:relative}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-.25rem -.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2),.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container{flex:1 0 auto;height:auto}.group-call-participants-video-container[data-layout="3"] .group-call-participant-video-container:nth-child(n+2):before,.group-call-participants-video-container[data-layout="4"] .group-call-participant-video-container:before{content:" ";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-header,.group-call-participants-video-container.show-controls .group-call-participant-video-info{opacity:1}.group-call-participants .chatlist{background:none;margin:0 auto;max-width:600px;padding:0}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaa;color:var(--gc-secondary-text-color)}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{margin-bottom:.25rem;min-height:100%}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25%!important}.group-call-cfs,.group-call:not(.is-big-layout) .group-call-big-video-container,.group-call:not(.is-big-layout) .popup-body .group-call-header,.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width:17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover{background-color:hsla(207,4%,46%,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(-13.125rem);transform:translateX(calc(var(--gc-right-column-width)/-2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX:calc(var(--gc-right-column-width)/-2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{background-color:#212121;background-color:var(--gc-background-color);bottom:0;padding:inherit;position:absolute;right:-26.25rem;right:calc(var(--gc-right-column-width)*-1);top:0;width:26.25rem;width:var(--gc-right-column-width)}.group-call.is-big-layout .group-call-buttons{bottom:2.5rem;padding:.75rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem;bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-sponsored .scrollable-y{margin:0 -1.5rem;max-height:25rem;padding:.5rem 1.5rem;position:relative;-webkit-user-select:text;-moz-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-mute .popup-container{min-width:16rem}.popup-reacted-list{--size:1.5rem;--custom-emoji-size:var(--size)}.popup-reacted-list .popup-container{height:600px;max-height:600px;padding:0;width:25rem}.popup-reacted-list .popup-header{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);margin:0;min-height:3.5625rem;padding:.25rem .75rem .75rem}.popup-reacted-list .popup-close{height:40px;margin-right:.5rem;margin-top:.375rem;order:-1}.popup-reacted-list .reaction{--reaction-size:var(--size);--additional-height:.75rem;--margin:.5rem;--background-color:var(--light-filled-primary-color);--counter-color:var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color:#fff}.popup-reacted-list .reaction-sticker-icon{font-size:1.25rem!important}.popup-reacted-list .reaction-sticker-icon{align-items:center;display:flex;margin:0}.popup-reacted-list .sidebar-left-section{margin-bottom:0!important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:#fff;background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{display:flex;height:var(--size);position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:var(--size)}.popup-reacted-list .chatlist-chat{padding-right:3.25rem!important}.popup-payment .popup-container{border-radius:16px;max-height:min(100%,43.5rem);max-width:26.25rem;padding:0;width:26.25rem}.popup-payment .popup-header{height:3.5rem;margin:0;padding:0 1rem}.popup-payment.is-loading .popup-container{min-height:26.25rem}.popup-payment .scrollable{display:flex;flex:1 1 auto;flex-direction:column}.popup-payment hr{display:block!important;margin:.5rem 0!important;padding:0!important}.popup-payment .input-field{--height:3rem;margin:.75rem .5rem 0}.popup-payment .input-field-input{--padding:.75rem}.popup-payment .input-fields-row .input-field{margin-top:1.25rem}.popup-payment .sidebar-left-section{padding:0!important}.popup-payment .sidebar-left-section-name+.input-field,.popup-payment .sidebar-left-section-name+.input-fields-row .input-field{margin-top:.75rem}.popup-payment .sidebar-left-section .row{margin-top:.5rem}.popup-payment .sidebar-left-section-content{margin:0 .5rem!important}.popup-payment .select-wrapper{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);max-height:10rem}.popup-payment .select-wrapper li{grid-template-columns:calc(26px + 2rem) 1fr;height:3rem}.popup-payment .payment-verification{border:none;flex:1 1 auto;height:40rem;max-height:100%;width:100%}.popup-payment .row{border-radius:10px}.payment-item{padding:0 1.25rem;width:100%}.payment-item-details{display:flex;flex:0 0 auto;justify-content:space-between;margin-bottom:1rem;overflow:hidden}.payment-item-details:last-child{margin-bottom:0}.payment-item-details-photo{border-radius:10px;flex:0 0 auto;height:6.25rem;margin-right:1rem;width:6.25rem}.payment-item-details-photo .media-photo{border-radius:inherit}.payment-item-details-lines{display:flex;flex:1 1 auto;flex-direction:column}.payment-item-details-lines-title{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16)}.payment-item-details-lines-bot-name,.payment-item-details-lines-description{font-size:14px;font-size:var(--font-size-14);line-height:1.25rem}.payment-item-details-lines-bot-name{color:#707579;color:var(--secondary-text-color)}.payment-item-prices{display:flex;flex-direction:column;margin:1rem .25rem .5rem}.payment-item-prices-price{color:#707579;color:var(--secondary-text-color);display:flex;font-weight:500;justify-content:space-between;line-height:1.1875rem}.payment-item-prices-price+.payment-item-prices-price{margin-top:1.5rem}.payment-item-prices-price.is-total{color:#000;color:var(--primary-text-color)}.payment-item-tips{display:flex;justify-content:space-between;margin:.75rem -.5rem 1.5rem}.payment-item-tips-tip{--background-intensity:.1;background-color:rgba(84,190,97,var(--background-intensity));border-radius:1.25rem;color:#3ba748;flex:1 1 auto;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;line-height:2.5rem;text-align:center}body.animation-level-2 .payment-item-tips-tip{transition:color .1s ease-in-out,background-color .1s ease-in-out}.payment-item-tips-tip+.payment-item-tips-tip{margin-left:.5rem}html.no-touch .payment-item-tips-tip:not(.active):active,html.no-touch .payment-item-tips-tip:not(.active):hover{--background-intensity:.3}.payment-item-tips-tip.active{--background-intensity:1;color:#fff}.payment-item-tips-input{color:inherit!important;font-weight:inherit!important}.payment-item-tips-input{display:inline}.payment-item-row{margin:0 .5rem;padding-bottom:0;padding-top:0}.payment-item-method-row .media-photo{border-radius:10px}.payment-item-pay{flex:0 0 auto;height:3rem;margin:1rem;text-transform:uppercase;width:auto}.payment-item-preloader-container{flex:1 1 auto;position:relative}.popup-payment-shipping-methods .popup-container{min-height:auto}.popup-payment-shipping-methods .row{margin-top:0!important}.popup-payment-verification .popup-header:after{background-color:#dfe1e5;background-color:var(--border-color);bottom:-1px;content:" ";height:1px;left:0;position:absolute;right:0}.popup-payment-card-confirmation .popup-container{min-height:auto}.popup-payment-card-confirmation .input-field-password{margin-top:.5rem!important}.popup-limit .popup-container{min-width:min(100%,22.5rem)}.popup-limit-line{align-items:center;display:flex;flex-direction:column;margin:.75rem 0}.popup-limit-hint{align-items:center;color:#fff;display:flex;font-weight:500;font-weight:var(--font-weight-bold);justify-content:center;transform:scale(.6) translate(-280px,16px) rotate(-30deg)}body.animation-level-2 .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.2)}.popup-limit-hint.active{transform:scale(1) translate(0) rotate(0)}.popup-limit-hint-icon{display:flex;font-size:1.25rem;margin-right:.25rem}.popup-limit-button.primary{color:#fff!important}.popup-limit-button.primary{align-items:center;background:linear-gradient(88.39deg,#6c93ff -2.56%,#976fff 51.27%,#df69d1 107.39%);display:flex}.popup-limit-button-icon{display:flex;font-size:1.5rem;margin-left:.625rem}.popup-limit .limit-line{align-self:stretch;margin:1rem .5rem 0}.popup-limit:not(.is-locked) .popup-limit-hint{background:linear-gradient(73.4deg,#6c93ff -7.21%,#976fff 114.57%,#df69d1 241.52%);background-size:200px 2rem;border-radius:1rem;height:2rem;padding:0 .75rem;position:relative}.popup-limit:not(.is-locked) .popup-limit-hint:after{background:inherit;background-position-x:calc(-50% - 86px);background-repeat:no-repeat;background-size:inherit;bottom:-9px;-webkit-clip-path:path("M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z");clip-path:path("M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z");content:" ";display:block;height:9px;left:50%;margin-left:-13px;position:absolute;width:100%}.popup-limit.is-locked .popup-limit-hint{background-color:#3390ec;background-color:var(--primary-color);border-radius:1.375rem;height:2.75rem;margin-right:-.25rem;padding:0 1.25rem 0 1rem}.popup-limit.is-premium .popup-limit-hint{align-self:flex-end;background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);background-position-x:100%;background-size:200px 2rem;border-bottom-right-radius:0;margin-right:.5rem}body.animation-level-2 .popup-limit.is-premium .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.1)}.popup-limit.is-premium .popup-limit-hint:after{background-position-x:134%;bottom:-11.3px;-webkit-clip-path:path("M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z");clip-path:path("M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z");height:12px;left:100%;margin-left:-20.6px}#auth-pages{background:#fff;background:var(--surface-color);max-width:100%;overflow:hidden}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width:600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width:600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width:600px){#auth-pages .input-wrapper{margin-top:41px;padding:0 16px;width:100%}}#auth-pages .auth-image,#auth-pages .input-wrapper,#auth-pages .subtitle{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;margin:0 auto;max-width:720px;position:relative}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height:810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{margin:0 auto;max-width:720px;min-width:auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{display:flex;flex:1 1 auto;flex-direction:column;height:810px;padding:0;width:100%}@media screen and (max-height:810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width:600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-bottom:.5rem;margin-top:.5rem}.page-sign .auth-image,.page-signUp .auth-image{height:7.5rem;margin-bottom:1.5rem;width:7.5rem}@media only screen and (min-width:601px){.page-sign .auth-image,.page-signUp .auth-image{height:10rem;margin-bottom:1.5rem;width:10rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{fill:#3390ec;fill:var(--primary-color);max-height:100%;max-width:100%}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:400}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:visible!important;overflow:initial!important}.page-signQR .auth-image{height:240px!important;width:240px!important}.page-signQR .auth-image{align-items:center;display:flex;justify-content:center}.page-signQR .auth-image .preloader{left:auto;top:auto;transform:none}.page-signQR .auth-image .qr-canvas{height:100%;width:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem!important}.page-signQR h4{flex:0 0 auto}[dir=ltr] .page-signQR .qr-description{text-align:left}[dir=rtl] .page-signQR .qr-description{text-align:right}.page-signQR .qr-description{line-height:1.3125;line-height:var(--line-height);margin:1rem auto;max-width:480px}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-bottom:14px;margin-top:10px}@media only screen and (max-width:600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width:600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{align-items:center;display:flex;justify-content:center;margin:1.375rem 0 .875rem}.page-authCode .phone-wrapper h4[contenteditable]{border:none;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color);outline:none;padding:0 1rem}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40!important;border-color:var(--danger-color)!important}.page-authCode .phone-wrapper .phone{margin:0}.page-authCode .subtitle{margin:0 auto!important}.page-authCode .subtitle{max-width:300px}.page-chats{max-width:1682px!important}.page-chats{display:flex}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{height:100%;max-height:100%;min-height:100%;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.page-chats .main-column{display:flex!important}.page-chats .main-column{width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{display:flex!important}.page-chats #column-center{background-color:#e6ebee;width:100%}.page-chats #column-right{display:flex!important}.page-chats .main-column{height:100%;max-height:100%;min-height:100%;position:relative}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;height:100%;left:0;max-height:100%;overflow:hidden;position:absolute;top:0;width:100%;z-index:3}@media only screen and (min-width:1681px){.page-chats{border-color:#dfe1e5;border-color:var(--border-color);border-style:solid;border-width:0 1px}}.page-chats .avatar-edit{flex:0 0 auto;height:120px;margin:1rem auto 2rem;width:120px}body.animation-level-2 .page-chats .main-column{transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;overflow:hidden;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:100vh;height:calc(var(--vh, 1vh)*100)}}html.is-ios{-webkit-touch-callout:none;position:fixed;-webkit-user-select:none}html.no-backdrop{--menu-background-color:var(--surface-color);--menu-backdrop-filter:none}@supports(padding:max(0px)){html{padding:0 min(16px,env(safe-area-inset-right)) 0 min(16px,env(safe-area-inset-left))}}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:16px}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,html,input,optgroup,select,textarea{font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}a,button,div,input,select,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}code,kbd,pre,samp{font-family:Roboto Mono,monospace;font-family:var(--font-monospace)}.whole{height:100%;margin:0 auto;max-width:1680px;min-height:100%;width:100%}@media only screen and (min-width:601px){.only-handhelds{display:none!important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500;font-weight:var(--font-weight-bold)}h4{font-size:2rem;line-height:110%;margin:22px 0 14px}@media only screen and (max-width:600px){h4{font-size:20px;margin:2px 0 8px}}[contenteditable=true],input{background-color:transparent;caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color)}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{position:absolute;right:0;visibility:hidden}input:-webkit-autofill:first-line{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial;font-size:16px}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40!important;color:var(--danger-color)!important}.danger .c-ripple__circle{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec!important;color:var(--primary-color)!important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.primary-text{color:#000!important;color:var(--primary-text-color)!important}.color-premium{-webkit-text-fill-color:transparent;background:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%);background:var(--premium-gradient);-webkit-background-clip:text}.blue:before,.danger:before,.primary:before{color:inherit!important}.bg-warning{background:#fed85a!important}.contextmenu{bottom:auto!important;position:fixed!important;right:auto!important;width:auto!important;z-index:4!important}.preloader{height:50px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:50px}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:min(30rem,calc(100vw - 2rem));opacity:0;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast.is-visible{opacity:1}body.animation-level-2 .toast{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.toast b{color:inherit}.toast a{color:#60a5e9!important}.toast a{cursor:pointer}hr{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}b{font-weight:500;font-weight:var(--font-weight-bold)}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit.is-forum{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}.avatar-edit-canvas{background:linear-gradient(#69bffa,#3d9de0);background:linear-gradient(var(--avatar-color-top),var(--avatar-color-bottom));height:100%;max-height:100%;max-width:100%;width:100%}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{color:#fff;font-size:3rem;height:3rem;left:50%;line-height:1;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);width:3rem;z-index:2}.avatar-edit .avatar-placeholder{filter:brightness(.7);height:100%;left:0;position:absolute;top:0;width:100%}.missing-icon{height:1.5rem;width:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;left:0;max-height:23.5rem;opacity:0;overflow:hidden;position:absolute;top:calc(100% + .5rem);transform:scale(.95);transform-origin:top center;transition:opacity .2s ease-out,transform .2s ease-out;width:100%;z-index:3}.select-wrapper.active{opacity:1;transform:scale(1)}.select-wrapper ul{margin:.5rem 0}[dir=ltr] .select-wrapper li{text-align:left}[dir=rtl] .select-wrapper li{text-align:right}.select-wrapper li{align-items:center;cursor:pointer;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px;height:3.5rem;justify-content:space-between;padding:0 1rem}html.no-touch .select-wrapper li:active,html.no-touch .select-wrapper li:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{font-size:26px;height:26px;line-height:1;width:26px}.select-wrapper .scrollable{position:relative}[dir=ltr] .phone-code{text-align:right}[dir=rtl] .phone-code{text-align:left}.phone-code{color:#9e9e9e}.auth-image{height:166px;margin:0 auto 18px;position:relative;width:166px}@media only screen and (max-width:600px){.auth-image{height:120px;width:120px}}[dir=ltr] .phone-edit{margin-left:.4rem}[dir=rtl] .phone-edit{margin-right:.4rem}.phone-edit{cursor:pointer;font-size:1.5rem;height:1.5rem;line-height:1;opacity:.5;transition:opacity .2s;width:1.5rem}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!important;line-height:1!important;vertical-align:baseline!important;vertical-align:initial!important}span.emoji{font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol}@media not screen and (-webkit-min-device-pixel-ratio:2),not screen and (min-device-pixel-ratio:2),not screen and (min-resolution:192dpi),not screen and (min-resolution:2dppx){html[dir=ltr]:not(.is-safari) span.emoji{margin-right:5px!important}html[dir=rtl]:not(.is-safari) span.emoji{margin-left:5px!important}html[dir=ltr]:not(.is-safari) avatar-element span.emoji{margin-right:0!important}html[dir=rtl]:not(.is-safari) avatar-element span.emoji{margin-left:0!important}}img.emoji{display:inline-block;height:18px;max-height:100%;max-width:100%;vertical-align:middle;width:18px}[contenteditable=true]{cursor:text;outline:none;-webkit-user-select:text;-moz-user-select:text;user-select:text;white-space:pre-wrap}[contenteditable=true] .custom-emoji{display:inline-block;margin-bottom:-2px}[contenteditable=true] .custom-emoji:before{content:none}[contenteditable=true] [style*=markup]{font-family:inherit!important}[contenteditable=true] [style*=bold]{font-weight:700}[contenteditable=true] [style*=italic]{font-style:italic}[contenteditable=true] [style*=underline]{text-decoration-line:underline}[contenteditable=true] [style*=strikethrough]{text-decoration-line:line-through}[contenteditable=true] [style*=underline][style*=strikethrough]{text-decoration-line:underline line-through}[contenteditable=true] [style*=monospace]{font-family:Roboto Mono,monospace!important;font-family:var(--font-monospace)!important}[contenteditable=true] [style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color)}[contenteditable][data-placeholder]:before{color:#a2acb4;content:attr(data-placeholder);display:block;opacity:0;pointer-events:none;position:absolute}body.animation-level-2 [contenteditable][data-placeholder]:before{transform:translateX(1.75rem);transition:opacity .2s ease-out .01s,transform .2s ease-out .01s;transition:opacity var(--input-transition) .01s,transform var(--input-transition) .01s}[contenteditable][data-placeholder]:empty:before{opacity:1}body.animation-level-2 [contenteditable][data-placeholder]:empty:before{transform:translateX(0)}.sticky_sentinel{left:0;pointer-events:none;position:absolute;right:0;visibility:hidden}.super-stickers{display:grid;grid-template-columns:repeat(auto-fill,72px);grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}html.no-touch .super-sticker:active,html.no-touch .super-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){[dir=ltr] .show-more{padding-left:8px}[dir=rtl] .show-more{padding-right:8px}}[dir=ltr] .show-more .tgico-down{padding-left:1rem;padding-right:2rem}[dir=rtl] .show-more .tgico-down{padding-left:2rem;padding-right:1rem}.show-more .tgico-down{float:left;font-size:24px}.content-empty,.show-more .tgico-down{color:#707579;color:var(--secondary-text-color)}::-moz-selection{background:rgba(51,144,236,.4);background:var(--selection-background-color)}.selection:after,::selection{background:rgba(51,144,236,.4);background:var(--selection-background-color)}.selection:after{bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.input-something{display:inline-block}.input-selectable{position:relative}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{grid-gap:.25rem;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);width:100%}.grid-item{cursor:pointer;height:0;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-item-media{height:100%;left:0;-o-object-fit:cover;object-fit:cover;position:absolute;top:0;width:100%}.animated-super-row{--translateY:100%;bottom:0;left:0;position:absolute;right:0;top:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0,calc(var(--translateY)*-1),0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0,var(--translateY),0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{bottom:0;left:0;position:absolute;right:0;top:0}middle-ellipsis-element{display:block;overflow:hidden;width:100%}.album-item-media{height:100%;width:100%}html.no-touch .hover-effect:active,html.no-touch .hover-effect:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.progress-ring{left:0;pointer-events:none;position:absolute;top:0}.progress-ring__circle{stroke-linecap:round;transition:stroke-dashoffset}.rlottie,.rlottie-vector{bottom:0;height:100%;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0;width:100%}.rlottie-icon{pointer-events:none;position:relative}body.animation-level-2 .rlottie.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.canvas-thumbnail{height:100%;position:absolute;width:100%}.media-container-contain{position:relative}.media-container-contain .media-photo{max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain}.media-container-cover{position:relative}.media-container-cover .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.media-photo,.media-poster,.media-round,.media-sticker,.media-video{bottom:0;left:0;position:absolute;right:0;top:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-poster.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-video.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-poster.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-video.fade-out{animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{height:100%;margin:auto;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;width:100%}.media-sticker-wrapper.is-premium-sticker:before{align-items:center;background:rgba(0,0,0,.2);background-image:var(--lock-url);background-repeat:no-repeat;background-size:cover;border-radius:50%;bottom:.125rem;color:#fff;display:flex;height:1.25rem;justify-content:center;left:50%;position:absolute;transform:translateX(-50%);width:1.25rem;z-index:1}body.is-premium .media-sticker-wrapper.is-premium-sticker:after,body.is-premium .media-sticker-wrapper.is-premium-sticker:before{content:none}.media-round{max-height:280px;max-height:var(--round-video-size);max-width:280px;max-width:var(--round-video-size);z-index:1}.media-round canvas{border-radius:50%;height:100%;position:relative;width:100%}.media-round .video-time{background-color:rgba(109,141,65,.4)!important;background-color:var(--message-highlightning-color)!important}.media-round .video-time{padding:0 .375rem}[dir=ltr] .media-round .video-time:after,[dir=ltr] .media-round .video-time:before{margin-left:.25rem}[dir=rtl] .media-round .video-time:after,[dir=rtl] .media-round .video-time:before{margin-right:.25rem}.media-round.is-unread .video-time:before{background-color:#fff;border-radius:50%;content:" ";height:.5rem;order:1;width:.5rem}.media-round.is-paused .video-time:after{align-items:center;content:"";display:flex;font-size:1.125rem;order:2}.gradient-delimiter{background-color:#f4f4f5;background-color:var(--background-color-true);height:.75rem;position:relative;width:100%}.gradient-delimiter:before{background:linear-gradient(180deg,rgba(0,0,0,.06),transparent 20%,transparent 94%,rgba(0,0,0,.06));bottom:0;content:" ";left:0;position:absolute;right:0;top:0}.sidebar-left-section{padding:.5rem 0!important}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);box-shadow:0 1px 3px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 var(--section-box-shadow-color);margin-bottom:.75rem}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{padding:0 1rem}}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-left-section-container a{cursor:pointer}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important}.tgico-admin:before,.tgico-fontsize:before{padding:2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px!important}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.navigable-list .active{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{--esg-emoji-total-size:calc(var(--esg-emoji-size) + 0.5rem);--custom-emoji-size:var(--esg-emoji-size);grid-column-gap:2.44px;--esg-emoji-size:2.125rem;--esg-emoji-total-size:2.625rem;--custom-emoji-size:2.25rem;-moz-column-gap:2.44px;column-gap:2.44px;-moz-column-gap:.25rem;column-gap:.25rem;display:grid;font-size:var(--esg-emoji-size);grid-template-columns:repeat(auto-fill,var(--esg-emoji-total-size));justify-content:space-between;line-height:var(--esg-emoji-size);position:relative}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:var(--esg-emoji-total-size);line-height:inherit;margin-left:.0625rem;margin-right:.0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:var(--esg-emoji-total-size)}.super-emojis .super-emoji .emoji-placeholder{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;height:1.75rem;left:7px;pointer-events:none;position:absolute;top:7px;width:1.75rem}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{height:100%;margin:0;vertical-align:baseline;vertical-align:initial;width:100%}.super-emojis .super-emoji.active,html.no-touch .super-emojis .super-emoji:active,html.no-touch .super-emojis .super-emoji:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.super-emojis.not-local .super-emoji{padding:.1875rem}.super-emojis .super-emoji{margin:0}.super-emojis:not(.not-local) .super-emoji{overflow:hidden}html.native-emoji .super-emojis:not(.not-local) .super-emoji{padding-bottom:.3125rem;padding-top:.3125rem}.super-emojis .custom-emoji{display:block}.super-emojis .custom-emoji-renderer{z-index:1}.super-emojis .custom-emoji:before{content:none}.tgico-char:before{font-family:Roboto!important}.tgico-char:before{font-weight:500;font-weight:var(--font-weight-bold);text-align:center;width:1.5rem}.tgico-char.z:before{content:"Z"}.tgico-char.w:before{content:"W"}.sending-status:empty{display:none}.sending-status .tgico-sendingerror{color:#df3f40;color:var(--danger-color)}.sending-status-icon{line-height:1!important}.sending-status-icon{position:absolute}.quick-reaction-title{align-items:center;display:flex}.quick-reaction-sticker{height:32px!important;margin:0 .5rem 0 0!important;position:relative!important;width:32px!important}.verified-icon-svg{height:1rem;width:1rem}.verified-icon-check{fill:#fff}.verified-icon-background{fill:#3390ec;fill:var(--primary-color)}[dir=ltr] .emoji-status,[dir=ltr] .premium-icon,[dir=ltr] .verified-icon{margin-left:.125rem}[dir=rtl] .emoji-status,[dir=rtl] .premium-icon,[dir=rtl] .verified-icon{margin-right:.125rem}.emoji-status,.premium-icon,.verified-icon{align-items:center;display:flex;flex:0 0 auto;font-size:1rem;height:1.25rem;justify-content:center;width:1.25rem}[dir=ltr] .emoji-status{margin-left:.25rem}[dir=rtl] .emoji-status{margin-right:.25rem}.emoji-status{height:1.125rem;position:relative;width:1.125rem}.premium-icon{color:#3390ec;color:var(--primary-color);margin-top:-.0625rem}.badge-fake{line-height:1!important}.badge-fake{border:1px solid #df3f40;border:1px solid var(--danger-color);border-radius:.185rem;color:#df3f40;color:var(--danger-color);flex:0 0 auto;font-size:.625rem;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.25rem;margin-right:.25rem;padding:.125rem .25rem}.peer-title.with-icons{align-items:center;display:flex;overflow:hidden}.peer-title-inner{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.limit-line{display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:2rem}.limit-line-free{color:#000}.limit-line-premium{color:#fff}.limit-line-free{background-color:#f1f3f5;border-bottom-left-radius:10px;border-top-left-radius:10px}.limit-line-premium{background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);border-bottom-right-radius:10px;border-top-right-radius:10px}.limit-line-free,.limit-line-premium{align-items:center;display:flex;flex:1 1 0;justify-content:space-between;padding:0 .75rem}.movable-element{--size:.5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{cursor:row-resize;height:var(--size);left:0;right:0}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{bottom:0;cursor:col-resize;top:0;width:var(--size)}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-sw{height:var(--size);width:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se{cursor:nwse-resize}.movable-element-resize-handler-side-ne{right:0;top:0}.movable-element-resize-handler-side-se{bottom:0;right:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{left:0;top:0}[dir=ltr] .chatlist-chat.row-with-padding{padding-left:4.5rem!important}[dir=rtl] .chatlist-chat.row-with-padding{padding-right:4.5rem!important}.chatlist-chat span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist-chat .row-title{font-size:16px!important;font-size:var(--font-size-16)!important}.chatlist-chat .row-title{line-height:1.375rem}.chatlist-chat .row-title-right-secondary{font-size:12px!important;font-size:var(--font-size-12)!important;line-height:16px!important;line-height:var(--line-height-12)!important}.chatlist-chat .row-title-right-secondary{margin-top:-.4375rem}.chatlist-chat .row-subtitle{display:block!important}.chatlist-chat .row-row{height:1.375rem}.chatlist-chat.chatlist-chat-abitbigger .row-subtitle{margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle{font-size:16px!important;font-size:var(--font-size-16)!important}.chatlist-chat.chatlist-chat-bigger .row-subtitle{line-height:1.375rem;margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle-row{margin-top:.125rem}.chatlist-chat.chatlist-chat-bigger .row-title .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.username-purchase-help b{color:#df3f40!important;color:var(--danger-color)!important;font-weight:400!important;font-weight:var(--font-weight-normal)!important}.media-spoiler-container{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.media-spoiler-container.is-revealing{opacity:1}.media-spoiler-container.is-revealing:not(.backwards){opacity:0}.media-spoiler-container.is-revealing.animating{transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}.media-spoiler .canvas-thumbnail,.media-spoiler-thumbnail{-o-object-fit:initial!important;object-fit:fill!important}.media-spoiler .canvas-thumbnail,.media-spoiler-thumbnail{height:100%;position:absolute;width:100%} + +/*# sourceMappingURL=main.8b794e152e99613b8f6c.css.map*/ \ No newline at end of file diff --git a/public/main.8b794e152e99613b8f6c.css.map b/public/main.8b794e152e99613b8f6c.css.map new file mode 100644 index 000000000..6b8a1a602 --- /dev/null +++ b/public/main.8b794e152e99613b8f6c.css.map @@ -0,0 +1 @@ +{"version":3,"file":"main.8b794e152e99613b8f6c.css","mappings":"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","sources":["webpack://tweb/./src/materialize.scss","webpack://tweb/./src/scss/style.scss"],"sourcesContent":["/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{-webkit-text-decoration-skip:objects;background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){list-style-type:none;padding-left:0}ul:not(.browser-default)>li{list-style-type:none}a{-webkit-tap-highlight-color:rgba(0,0,0,0)}button{background:none;border:none;cursor:pointer;outline:none;padding:0}img,video{-webkit-user-drag:none}.valign-wrapper{align-items:center;display:flex}.z-depth-0{box-shadow:none!important}.z-depth-1{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.12),0 1px 5px 0 rgba(0,0,0,.2)}.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 8px 17px 2px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.2)}.z-depth-4{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -7px rgba(0,0,0,.2)}.z-depth-5{box-shadow:0 24px 38px 3px rgba(0,0,0,.14),0 9px 46px 8px rgba(0,0,0,.12),0 11px 15px -7px rgba(0,0,0,.2)}.hide{display:none!important}.hide-overflow{overflow:hidden}.no-select{-webkit-user-select:none;-moz-user-select:none;user-select:none}.no-transition,.no-transition:after,.no-transition:before{transition:none!important}.inline{display:inline}.center-align,.text-center{text-align:center}.justify-start{justify-content:flex-start!important}.justify-self-start{justify-self:flex-start!important}.justify-self-end{justify-self:flex-end!important}.position-center{position:absolute!important}.position-center{left:50%;top:50%;transform:translate(-50%,-50%)}.text-bold{font-weight:500!important}.text-super{display:inline-table}.text-uppercase{text-transform:uppercase}.pre-wrap{white-space:pre-wrap!important}.no-wrap{white-space:nowrap!important}.no-border-radius{border-radius:0!important}.disable-hover{pointer-events:none!important}.reflect-x{transform:scaleX(-1)}[dir=auto]{unicode-bidi:plaintext}.is-rtl [dir=auto]{direction:inherit}a{text-decoration:none}html{font-weight:400;line-height:1.5}h1,h2,h3,h4,h5,h6{line-height:1.3}em{font-style:italic}strong{font-weight:500}small{font-size:75%}code,pre{word-wrap:break-word;white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap}",":root{--vh:1vh;--z-below:-1;--hover-alpha:0.08;--transition-standard-easing:cubic-bezier(.4,.0,.2,1);--transition-standard-in-time:.3s;--transition-standard-out-time:.25s;--transition-standard-in:var(--transition-standard-in-time) var(--transition-standard-easing);--transition-standard-out:var(--transition-standard-out-time) var(--transition-standard-easing);--pm-transition:.2s ease-in-out;--layer-transition:.2s cubic-bezier(.4,.0,.2,1);--slide-header-transition:.4s ease-in-out;--tabs-transition:.2s ease-in-out;--btn-menu-transition:.2s cubic-bezier(.4,0,.2,1);--esg-transition:var(--btn-menu-transition);--input-transition:.2s ease-out;--sticker-viewer-open-transition-in:.2s var(--transition-standard-easing);--sticker-viewer-open-transition-out:.2s var(--transition-standard-easing);--sticker-viewer-switch-transition:.2s cubic-bezier(.12,1.1,.56,1.2);--popup-transition-function:cubic-bezier(.4,0,.2,1);--popup-transition-time:.15s;--btn-corner-transition:.2s cubic-bezier(.34,1.56,.64,1);--chatlist-badge-transition-in:.25s cubic-bezier(.35,.35,.47,1.34);--chatlist-badge-transition-out:.25s cubic-bezier(.35,.35,.7,1);--message-handhelds-margin:5.5625rem;--message-beside-button-size:2.375rem;--message-beside-button-margin:calc((var(--message-beside-button-size) + 0.5rem)*-1);--message-time-background:rgba(0,0,0,.35);--message-highlightning-color:rgba(109,141,65,.4);--messages-container-width:728px;--messages-text-size:16px;--messages-line-height:1.3125;--messages-secondary-text-size:calc(var(--messages-text-size) - 2px);--messages-secondary-line-height:calc(var(--messages-secondary-text-size) + 4px);--messages-time-text-size:calc(var(--messages-text-size) - 4px);--messages-service-text-size:calc(var(--messages-text-size) - 1px);--messages-custom-emoji-size:calc(var(--messages-text-size) + 4px);--bubble-transition-in:transform var(--transition-standard-in),opacity var(--transition-standard-in);--bubble-transition-out:transform var(--transition-standard-out),opacity var(--transition-standard-out);--line-height-20:26px;--line-height-16:21px;--line-height-14:18px;--line-height-12:16px;--line-height:1.3125;--font-size-20:20px;--font-size-16:16px;--font-size-14:14px;--font-size-12:12px;--font-size:var(--font-size-16);--esg-sticker-size:72px;--esg-custom-emoji-size:36px;--popup-sticker-size:80px;--disabled-opacity:.3;--round-video-size:280px;--menu-box-shadow:0px 0px 10px var(--menu-box-shadow-color);--menu-backdrop-filter:blur(50px);--font-monospace:\"Roboto Mono\",monospace;--font-weight-bold:500;--font-weight-normal:400;--selection-background-color:rgba(var(--primary-color-rgb),.4);--selection-color:inherit;--topbar-floating-scaleX:1;--topbar-call-height:3rem;--topbar-floating-call-height:0px;--call-button-size:3.375rem;--call-button-margin:2rem;--custom-emoji-size:1.25rem;--peer-avatar-red-top:#ff845e;--peer-avatar-red-bottom:#d45246;--peer-avatar-orange-top:#febb5b;--peer-avatar-orange-bottom:#f68136;--peer-avatar-violet-top:#b694f9;--peer-avatar-violet-bottom:#6c61df;--peer-avatar-green-top:#9ad164;--peer-avatar-green-bottom:#46ba43;--peer-avatar-cyan-top:#53edd6;--peer-avatar-cyan-bottom:#28c9b7;--peer-avatar-blue-top:#5bcbe3;--peer-avatar-blue-bottom:#359ad4;--peer-avatar-pink-top:#ff8aac;--peer-avatar-pink-bottom:#d95574;--peer-avatar-saved-top:#69bffa;--peer-avatar-saved-bottom:#3d9de0;--peer-avatar-archive-top:#b8c2cc;--peer-avatar-archive-bottom:#9eaab5;--avatar-color-top:var(--peer-avatar-saved-top);--avatar-color-bottom:var(--peer-avatar-saved-bottom);--avatar-border-radius-forum:37%;--premium-gradient:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%)}@media only screen and (max-width:600px){:root{--right-column-width:100vw;--esg-sticker-size:68px;--popup-sticker-size:68px;--round-video-size:200px;--chat-input-size:2.875rem;--chat-input-padding:0.5rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:601px){:root{--right-column-width:420px;--chat-input-size:3.375rem;--chat-input-padding:0.8125rem;--chat-input-inner-padding:0.5rem}}@media only screen and (max-height:569px){:root{--chat-input-size:2.875rem;--chat-input-inner-padding:0.25rem}}@media only screen and (min-width:1276px)and (max-width:1680px){:root{--right-column-width:25vw}}:root{--body-background-color:#fff;--background-color-true:#f4f4f5;--background-color:var(--background-color-true);--border-color:#dfe1e5;--surface-color-rgb:255,255,255;--surface-color:#fff;--scrollbar-color:rgba(0,0,0,.2);--section-box-shadow-color:rgba(0,0,0,.06);--menu-box-shadow-color:rgba(0,0,0,.15);--input-search-background-color:#fff;--input-search-border-color:#dfe1e5;--primary-color:#3390ec;--light-primary-color:rgba(51,144,236,.08);--light-filled-primary-color:#eff6fd;--dark-primary-color:#2086ea;--primary-color-rgb:51,144,236;--primary-text-color:#000;--primary-text-color-rgb:0,0,0;--secondary-color:#c4c9cc;--secondary-text-color:#707579;--light-secondary-text-color:hsla(207,4%,46%,.08);--light-filled-secondary-text-color:#f4f4f4;--danger-color:#df3f40;--light-danger-color:rgba(223,63,64,.08);--dark-danger-color:#d22324;--avatar-online-color:#0ac630;--chatlist-status-color:var(--avatar-online-color);--chatlist-pinned-color:#a2abb2;--badge-text-color:#fff;--link-color:#00488f;--ripple-color:rgba(0,0,0,.08);--poll-circle-color:var(--border-color);--spoiler-background-color:#e3e5e8;--spoiler-draft-background-color:#d9d9d9;--monospace-text-color:var(--danger-color);--backdrop-opacity:.85;--menu-background-color:rgba(var(--surface-color-rgb),var(--backdrop-opacity));--message-background-color:var(--surface-color);--message-checkbox-color:#61c642;--message-checkbox-border-color:#fff;--message-primary-color:var(--primary-color);--light-filled-message-primary-color:var(--light-filled-primary-color);--message-secondary-color:var(--secondary-color);--message-error-color:var(--danger-color);--message-out-background-color:#eeffde;--light-message-out-background-color:rgba(238,255,222,.08);--dark-message-out-background-color:#d9ffb5;--message-out-link-color:var(--link-color);--message-out-primary-color:#4fae4e;--light-filled-message-out-primary-color:#e1f9d2;--message-out-status-color:var(--message-out-primary-color);--message-out-audio-play-button-color:#fff;--message-out-selection-background-color:var(--selection-background-color);--gc-background-color:#212121;--gc-button-leave-color:rgba(255,89,90,.3);--gc-button-unmuted-color:rgba(1,200,80,.2);--gc-button-muted-color:rgba(60,135,247,.2);--gc-button-hand-color:rgba(223,68,184,.2);--gc-button-unmuted-fill-color:#195530;--gc-button-muted-fill-color:#3c87f7;--gc-green-color:#195530;--gc-blue-color:#3c87f7;--gc-red-color:#643333;--gc-primary-text-color:#fff;--gc-secondary-text-color:#aaa;--gc-green-text-color:#5cc85e;--gc-blue-text-color:#3390ec;--gc-red-text-color:#ff595a;--gc-right-column-width:26.25rem}.night{--body-background-color:#181818;--background-color-true:#181818;--background-color:var(--background-color-true);--border-color:#0f0f0f;--surface-color-rgb:33,33,33;--surface-color:#212121;--scrollbar-color:hsla(0,0%,100%,.2);--section-box-shadow-color:rgba(0,0,0,.12);--input-search-background-color:#181818;--input-search-border-color:#2f2f2f;--primary-color:#8774e1;--light-primary-color:rgba(135,116,225,.08);--light-filled-primary-color:#292830;--dark-primary-color:#6a52da;--primary-color-rgb:135,116,225;--primary-text-color:#fff;--primary-text-color-rgb:255,255,255;--secondary-color:#707579;--secondary-text-color:#aaa;--light-secondary-text-color:hsla(0,0%,67%,.08);--light-filled-secondary-text-color:#2c2c2c;--danger-color:#ff595a;--light-danger-color:rgba(255,89,90,.08);--dark-danger-color:#ff3031;--avatar-online-color:#0ac630;--chatlist-status-color:var(--primary-color);--chatlist-pinned-color:var(--secondary-color);--badge-text-color:#fff;--link-color:var(--primary-color);--ripple-color:hsla(0,0%,100%,.08);--poll-circle-color:#fff;--spoiler-background-color:#373e4e;--spoiler-draft-background-color:#484848;--monospace-text-color:var(--primary-text-color);--menu-background-color:rgba(var(--surface-color-rgb),.75);--message-background-color:var(--surface-color);--message-checkbox-color:var(--primary-color);--message-checkbox-border-color:#fff;--message-secondary-color:var(--secondary-color);--message-error-color:#fff;--message-out-background-color:#8774e1;--light-message-out-background-color:rgba(135,116,225,.08);--dark-message-out-background-color:#6a52da;--message-out-link-color:#fff;--message-out-primary-color:#fff;--light-filled-message-out-primary-color:#917fe3;--message-out-status-color:hsla(0,0%,100%,.6);--message-out-audio-play-button-color:var(--message-out-background-color);--message-out-selection-background-color:rgba(var(--surface-color-rgb),.4)}@font-face{font-display:block;font-family:tgico;font-style:normal;font-weight:400;src:url(assets/fonts/tgico.ttf?ivbp49) format(\"truetype\"),url(assets/fonts/tgico.woff?ivbp49) format(\"woff\"),url(assets/fonts/tgico.svg?ivbp49#tgico) format(\"svg\")}.tgico:after,.tgico:before,[class*=\" tgico-\"]:after,[class*=\" tgico-\"]:before,[class^=tgico-]{font-family:tgico!important}.tgico:after,.tgico:before,[class*=\" tgico-\"]:after,[class*=\" tgico-\"]:before,[class^=tgico-]{speak:never;font-feature-settings:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-style:normal;font-variant:normal;font-weight:400;line-height:1;text-transform:none}.tgico-check:before{content:\"\"}.tgico-checks:before{content:\"\"}.tgico-activesessions:before{content:\"\"}.tgico-add:before{content:\"\"}.tgico-add_reaction:before{content:\"\"}.tgico-addmember_filled:before{content:\"\"}.tgico-adduser:before{content:\"\"}.tgico-admin:before{content:\"\"}.tgico-animals:before{content:\"\"}.tgico-animations:before{content:\"\"}.tgico-archive:before{content:\"\"}.tgico-arrow_down:before{content:\"\"}.tgico-arrow_next:before{content:\"\"}.tgico-attach:before{content:\"\"}.tgico-audio_repeat:before{content:\"\"}.tgico-audio_repeat_single:before{content:\"\"}.tgico-avatarnext:before{content:\"\"}.tgico-avatarprevious:before{content:\"\"}.tgico-binfilled:before{content:\"\"}.tgico-bold:before{content:\"\"}.tgico-botcom:before{content:\"\"}.tgico-bots:before{content:\"\"}.tgico-bug:before{content:\"\"}.tgico-calendar:before{content:\"\"}.tgico-calendarfilter:before{content:\"\"}.tgico-camera:before{content:\"\"}.tgico-cameraadd:before{content:\"\"}.tgico-car:before{content:\"\"}.tgico-card:before{content:\"\"}.tgico-card_outline:before{content:\"\"}.tgico-channel:before{content:\"\"}.tgico-channelviews:before{content:\"\"}.tgico-chatspinned:before{content:\"\"}.tgico-chatsplaceholder:before{content:\"\"}.tgico-check1:before{content:\"\"}.tgico-checkbox:before{content:\"\"}.tgico-checkboxblock:before{content:\"\"}.tgico-checkboxempty:before{content:\"\"}.tgico-checkboxon:before{content:\"\"}.tgico-checkretract:before{content:\"\"}.tgico-checkround:before{content:\"\"}.tgico-close:before{content:\"\"}.tgico-clouddownload:before{content:\"\"}.tgico-colorize:before{content:\"\"}.tgico-comments:before{content:\"\"}.tgico-commentssticker:before{content:\"\"}.tgico-copy:before{content:\"\"}.tgico-darkmode:before{content:\"\"}.tgico-data:before{content:\"\"}.tgico-delete:before{content:\"\"}.tgico-delete_filled:before{content:\"\"}.tgico-deletedaccount:before{content:\"\"}.tgico-deleteleft:before{content:\"\"}.tgico-deleteuser:before{content:\"\"}.tgico-devices:before{content:\"\"}.tgico-document:before{content:\"\"}.tgico-down:before{content:\"\"}.tgico-download:before{content:\"\"}.tgico-dragfiles:before{content:\"\"}.tgico-dragmedia:before{content:\"\"}.tgico-eats:before{content:\"\"}.tgico-edit:before{content:\"\"}.tgico-email:before{content:\"\"}.tgico-endcall_filled:before{content:\"\"}.tgico-enter:before{content:\"\"}.tgico-eye1:before{content:\"\"}.tgico-eye2:before{content:\"\"}.tgico-fast_forward:before{content:\"\"}.tgico-fast_rewind:before{content:\"\"}.tgico-favourites:before{content:\"\"}.tgico-flag:before{content:\"\"}.tgico-flip:before{content:\"\"}.tgico-folder:before{content:\"\"}.tgico-fontsize:before{content:\"\"}.tgico-forward:before{content:\"\"}.tgico-forward_filled:before{content:\"\"}.tgico-fullscreen:before{content:\"\"}.tgico-gc_microphone:before{content:\"\"}.tgico-gc_microphoneoff:before{content:\"\"}.tgico-gifs:before{content:\"\"}.tgico-group:before{content:\"\"}.tgico-groupmedia:before{content:\"\"}.tgico-groupmediaoff:before{content:\"\"}.tgico-help:before{content:\"\"}.tgico-hide:before{content:\"\"}.tgico-image:before{content:\"\"}.tgico-info:before{content:\"\"}.tgico-info2:before{content:\"\"}.tgico-italic:before{content:\"\"}.tgico-keyboard:before{content:\"\"}.tgico-lamp:before{content:\"\"}.tgico-language:before{content:\"\"}.tgico-largepause:before{content:\"\"}.tgico-largeplay:before{content:\"\"}.tgico-left:before{content:\"\"}.tgico-limit_chat:before{content:\"\"}.tgico-limit_chats:before{content:\"\"}.tgico-limit_file:before{content:\"\"}.tgico-limit_folders:before{content:\"\"}.tgico-limit_link:before{content:\"\"}.tgico-limit_pin:before{content:\"\"}.tgico-link:before{content:\"\"}.tgico-listscreenshare:before{content:\"\"}.tgico-livelocation:before{content:\"\"}.tgico-location:before{content:\"\"}.tgico-lock:before{content:\"\"}.tgico-lockoff:before{content:\"\"}.tgico-loginlogodesktop:before{content:\"\"}.tgico-loginlogomobile:before{content:\"\"}.tgico-logout:before{content:\"\"}.tgico-mediaspoiler:before{content:\"\"}.tgico-mediaspoileroff:before{content:\"\"}.tgico-mention:before{content:\"\"}.tgico-menu:before{content:\"\"}.tgico-message:before{content:\"\"}.tgico-messageunread:before{content:\"\"}.tgico-microphone:before{content:\"\"}.tgico-microphone_crossed:before{content:\"\"}.tgico-microphone_crossed_filled:before{content:\"\"}.tgico-microphone_filled:before{content:\"\"}.tgico-minus:before{content:\"\"}.tgico-monospace:before{content:\"\"}.tgico-more:before{content:\"\"}.tgico-mute:before{content:\"\"}.tgico-muted:before{content:\"\"}.tgico-newchannel:before{content:\"\"}.tgico-newchat_filled:before{content:\"\"}.tgico-newgroup:before{content:\"\"}.tgico-newprivate:before{content:\"\"}.tgico-next:before{content:\"\"}.tgico-noncontacts:before{content:\"\"}.tgico-nosound:before{content:\"\"}.tgico-passwordoff:before{content:\"\"}.tgico-pause:before{content:\"\"}.tgico-permissions:before{content:\"\"}.tgico-phone:before{content:\"\"}.tgico-pin:before{content:\"\"}.tgico-pinlist:before{content:\"\"}.tgico-pinned_filled:before{content:\"\"}.tgico-pinnedchat:before{content:\"\"}.tgico-pip:before{content:\"\"}.tgico-play:before{content:\"\"}.tgico-playback_05:before{content:\"\"}.tgico-playback_15:before{content:\"\"}.tgico-playback_1x:before{content:\"\"}.tgico-playback_2x:before{content:\"\"}.tgico-plus:before{content:\"\"}.tgico-poll:before{content:\"\"}.tgico-premium_addone:before{content:\"\"}.tgico-premium_double:before{content:\"\"}.tgico-premium_lock:before{content:\"\"}.tgico-premium_unlock:before{content:\"\"}.tgico-previous:before{content:\"\"}.tgico-radiooff:before{content:\"\"}.tgico-radioon:before{content:\"\"}.tgico-reactions:before{content:\"\"}.tgico-readchats:before{content:\"\"}.tgico-recent:before{content:\"\"}.tgico-replace:before{content:\"\"}.tgico-reply:before{content:\"\"}.tgico-reply_filled:before{content:\"\"}.tgico-rightpanel:before{content:\"\"}.tgico-rotate_left:before{content:\"\"}.tgico-rotate_right:before{content:\"\"}.tgico-saved:before{content:\"\"}.tgico-savedmessages:before{content:\"\"}.tgico-schedule:before{content:\"\"}.tgico-scheduled:before{content:\"\"}.tgico-search:before{content:\"\"}.tgico-select:before{content:\"\"}.tgico-send:before{content:\"\"}.tgico-send2:before{content:\"\"}.tgico-sending:before{content:\"\"}.tgico-sendingerror:before{content:\"\"}.tgico-settings:before{content:\"\"}.tgico-settings_filled:before{content:\"\"}.tgico-sharescreen_filled:before{content:\"\"}.tgico-shipping:before{content:\"\"}.tgico-shuffle:before{content:\"\"}.tgico-smallscreen:before{content:\"\"}.tgico-smile:before{content:\"\"}.tgico-spoiler:before{content:\"\"}.tgico-sport:before{content:\"\"}.tgico-star:before{content:\"\"}.tgico-stickers:before{content:\"\"}.tgico-stickers_face:before{content:\"\"}.tgico-stop:before{content:\"\"}.tgico-strikethrough:before{content:\"\"}.tgico-textedit:before{content:\"\"}.tgico-tip:before{content:\"\"}.tgico-tools:before{content:\"\"}.tgico-topics:before{content:\"\"}.tgico-unarchive:before{content:\"\"}.tgico-underline:before{content:\"\"}.tgico-unmute:before{content:\"\"}.tgico-unpin:before{content:\"\"}.tgico-unread:before{content:\"\"}.tgico-up:before{content:\"\"}.tgico-user:before{content:\"\"}.tgico-username:before{content:\"\"}.tgico-videocamera:before{content:\"\"}.tgico-videocamera_crossed_filled:before{content:\"\"}.tgico-videocamera_filled:before{content:\"\"}.tgico-videochat:before{content:\"\"}.tgico-volume_down:before{content:\"\"}.tgico-volume_mute:before{content:\"\"}.tgico-volume_off:before{content:\"\"}.tgico-volume_up:before{content:\"\"}.tgico-zoomin:before{content:\"\"}.tgico-zoomout:before{content:\"\"}.tgico-phone_filled:before{content:\"\";transform:rotate(-135deg)}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:local(\"Roboto\"),local(\"Roboto-Regular\"),url(assets/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U400-45F,U490-491,U4B0-4B1,U2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2) format(\"woff2\");unicode-range:U100-24F,U259,U1-1EFF,U2020,U20A0-20AB,U20AD-20CF,U2113,U2C60-2C7F,UA720-A7FF}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:600;src:local(\"Roboto Medium\"),local(\"Roboto-Medium\"),url(assets/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2) format(\"woff2\");unicode-range:U0-0FF,U131,U152-153,U2BB-2BC,U2C6,U2DA,U2DC,U2000-206F,U2074,U20AC,U2122,U2191,U2193,U2212,U2215,UFEFF,UFFFD}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:400;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEluUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEn-Ulco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEmOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtElOUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEleUlco8VkKjG.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:italic;font-weight:500;src:url(assets/fonts/L0xdDF4xlVMF-BfR8bXMIjhOsXG-q2oeuFoqFrlnAIe2Imhk1T8rbociImtEm-Ulco8VkA.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:400;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSV0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0460-052f,u+1c80-1c88,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSx0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSt0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0370-03ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSd0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSZ0me8iUI0lkQ.woff2) format(\"woff2\");unicode-range:u+0100-024f,u+0259,u+1e??,u+2020,u+20a0-20ab,u+20ad-20cf,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto Mono;font-style:normal;font-weight:500;src:url(assets/fonts/L0xTDF4xlVMF-BfR8bXMIhJHg45mwgGEFl0_3vrtSM1J-gEPT5Ese6hmHSh0me8iUI0.woff2) format(\"woff2\");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+2000-206f,u+2074,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}.input-wrapper{margin:0 auto;width:360px}.input-field{--height:54px;--border-radius:10px;position:relative}@media only screen and (max-width:600px){.input-field{--height:50px}}.input-field .arrow-down{border:solid #707579;border:solid var(--secondary-text-color);border-radius:1px;border-width:0 2px 2px 0;bottom:0;content:\" \";cursor:pointer;display:inline-block;height:0;margin-top:-9px;padding:5px;position:absolute;right:21px;top:50%;transform:rotate(45deg);-webkit-transform:rotate(45deg);transition:all .2s;vertical-align:middle;width:0;z-index:2}[dir=ltr] .input-field label{left:1rem}[dir=rtl] .input-field label{right:1rem}.input-field label{background-color:#fff;background-color:var(--surface-color);color:#9e9e9e;height:1.5rem;margin-top:calc((var(--height) - 1.5rem)/2);pointer-events:none;position:absolute;right:auto;top:0;transform:translate(0);transform-origin:left center;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap;z-index:2}.is-rtl .input-field label{transform-origin:right center}body.animation-level-2 .input-field label{transition:transform .2s,padding .2s,opacity .1s,font-weight 0s .1s}.input-field-border{border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:var(--border-radius);bottom:0;left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;z-index:1}body.animation-level-2 .input-field-border{transition:opacity .2s}.input-field-icon{border-radius:.375rem;height:1.5rem;pointer-events:none;position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:1.5rem;z-index:1}.input-field-input{--padding:1rem;--padding-horizontal:1rem;--border-width:1px;background-color:#fff;background-color:var(--surface-color);border:var(--border-width) solid var(--input-search-border-color);border-radius:var(--border-radius);box-sizing:border-box;line-height:1.3125;line-height:var(--line-height);min-height:var(--height);padding:calc(var(--padding) - var(--border-width)) calc(var(--padding-horizontal) - var(--border-width));position:relative;transition:border-color 0s;width:100%;z-index:1}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{-webkit-box-shadow:inset 0 0 0 1000px #fff;-webkit-box-shadow:0 0 0 1000px var(--surface-color) inset}.input-field-input:-webkit-autofill,.input-field-input:-webkit-autofill:active,.input-field-input:-webkit-autofill:first-line,.input-field-input:-webkit-autofill:focus,.input-field-input:-webkit-autofill:hover{color:#000!important;color:var(--primary-text-color)!important;font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif!important;font-size:1rem!important}@media only screen and (max-width:600px){.input-field-input{--padding:.9375rem;--padding-horizontal:.9375rem}}body.animation-level-0 .input-field-input{transition:none!important}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid),html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid){border-color:#3390ec;border-color:var(--primary-color);transition:border-color .2s}html.no-touch .input-field-input:active:not(:focus):not(.error):not(.valid)~label,html.no-touch .input-field-input:hover:not(:focus):not(.error):not(.valid)~label{color:#3390ec;color:var(--primary-color)}.input-field-input:focus{border-color:#3390ec;border-color:var(--primary-color)}.input-field-input.error{border-color:#df3f40;border-color:var(--danger-color)}.input-field-input.error~label{color:#df3f40!important;color:var(--danger-color)!important}.input-field-input.error~.input-field-border{border-color:#df3f40!important;border-color:var(--danger-color)!important}.input-field-input.valid{border-color:#26962f}.input-field-input.valid~label{color:#26962f!important}.input-field-input.valid~.input-field-border{border-color:#26962f!important}.input-field-input:focus~.arrow-down{border-color:#3390ec;border-color:var(--primary-color);margin-top:-4px;transform:rotate(225deg)}.input-field-input:focus~label{color:#3390ec;color:var(--primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.input-field-input:focus~.input-field-border{opacity:1}.input-field-input:disabled~label,.input-field-input:focus~label,.input-field-input:not(:empty)~label,.input-field-input:valid~label{opacity:1;padding:0 .3125rem;transform:translate(-.1875rem,calc(var(--height)/-2 + .0625rem)) scale(.75)}.input-field-input-fake{bottom:auto!important;height:auto!important;position:absolute!important;right:auto!important}.input-field-input-fake{left:0;opacity:0;pointer-events:none;top:0;z-index:-3}.input-fields-row{display:flex}.input-fields-row .input-field{flex:1 1 auto;width:1%}.input-wrapper>*+*{margin-top:1.5rem}::-moz-placeholder{color:#909192;opacity:1}::placeholder{color:#909192;opacity:1}:-ms-input-placeholder{color:#909192}::-ms-input-placeholder{color:#909192}button:focus,input:focus{outline:none}.input-clear{border:none;outline:none;padding:0}body.animation-level-0 .input-clear.error{color:#df3f40!important;color:var(--danger-color)!important}body:not(.animation-level-0) .input-clear.error{animation:input-shake .2s ease-in-out forwards}@keyframes input-shake{0%{transform:translateX(0)}25%{transform:translateX(-.5rem)}75%{transform:translateX(.5rem)}to{transform:translateX(0)}}.input-search{--border-radius:22px;margin-left:.4375rem;margin-right:.4375rem;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){[dir=ltr] .input-search{margin-left:1rem}[dir=rtl] .input-search{margin-right:1rem}}.input-search-input{max-height:var(--height)!important;min-height:var(--height)!important}.input-search-input{--height:42px;background-color:#fff;background-color:var(--input-search-background-color);border-color:#dfe1e5;border-color:var(--input-search-border-color);height:var(--height);line-height:var(--height);padding:0 calc(var(--height) + 3px - var(--border-width))}body.animation-level-2 .input-search-input{transition:border-color .2s ease-in-out}html.no-touch .input-search-input:active:not(:focus),html.no-touch .input-search-input:hover:not(:focus){border-color:#c4c9cc!important;border-color:var(--secondary-color)!important}.input-search-input:focus{background-color:transparent;border-color:#3390ec;border-color:var(--primary-color)}.input-search-input:focus~.tgico{color:#3390ec;color:var(--primary-color);opacity:1}html.no-touch .input-search-input:focus~.btn-icon:active,html.no-touch .input-search-input:focus~.btn-icon:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.input-search-input:-moz-placeholder-shown~.tgico-close{display:none}.input-search-input:placeholder-shown~.tgico-close{display:none}.input-search>.tgico{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;line-height:1;opacity:.6;position:absolute;text-align:center;top:50%;transform:translateY(-50%);z-index:1}body.animation-level-2 .input-search>.tgico{transition:opacity .2s ease-out,color .2s ease-out}[dir=ltr] .input-search>.tgico-search{left:.8125rem}[dir=rtl] .input-search>.tgico-search{right:.8125rem}.input-search>.tgico-search{height:1.5rem;pointer-events:none;width:1.5rem}[dir=ltr] .input-search>.tgico-close{right:0}[dir=rtl] .input-search>.tgico-close{left:0}.input-search>.tgico-close{height:42px;width:42px;z-index:1}[dir=ltr] .input-search>.tgico-close:before{margin-right:-1px}[dir=rtl] .input-search>.tgico-close:before{margin-left:-1px}[dir=ltr] .input-field-password .input-field-input{padding-right:2.5rem}[dir=rtl] .input-field-password .input-field-input{padding-left:2.5rem}.input-field-password .input-field-input{max-height:var(--height)}.input-field-password .input-field-input[type=password]{font-family:Arial,Helvetica,sans-serif;font-size:2.25rem;line-height:1;padding-bottom:0;padding-left:calc(.875rem - var(--border-width));padding-top:0}@media(-webkit-min-device-pixel-ratio:2){.input-field-password .input-field-input[type=password]{font-size:1.75rem;letter-spacing:.125rem}}html.is-ios .input-field-password .input-field-input[type=password]{font-size:1rem}.input-field-password .toggle-visible{align-items:center;color:#9e9e9e;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;padding:.5rem;position:absolute;right:.375rem;top:50%;transform:translateY(-50%);transition:color .2s;z-index:2}.input-field-password .toggle-visible:before{content:\"\"}.input-field-password .toggle-visible.eye-hidden:before{content:\"\"}html.no-touch .input-field-password .toggle-visible:active,html.no-touch .input-field-password .toggle-visible:hover{color:#000;color:var(--primary-text-color)}.input-field-phone .input-field-input{--letter-spacing:.24px}.input-field-phone .input-field-input:after{color:#9e9e9e;content:attr(data-left-pattern);letter-spacing:var(--letter-spacing)}.btn,.btn-icon{background:none;border:none;cursor:pointer;outline:none}body.animation-level-0 .btn,body.animation-level-0 .btn-icon{transition:none}html.no-touch .btn-icon:active,html.no-touch .btn-icon:hover,html.no-touch .btn:active,html.no-touch .btn:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-icon.active:active,html.no-touch .btn-icon.active:hover,html.no-touch .btn-icon.blue:active,html.no-touch .btn-icon.blue:hover,html.no-touch .btn-icon.primary:active,html.no-touch .btn-icon.primary:hover,html.no-touch .btn.active:active,html.no-touch .btn.active:hover,html.no-touch .btn.blue:active,html.no-touch .btn.blue:hover,html.no-touch .btn.primary:active,html.no-touch .btn.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-icon.danger:active,html.no-touch .btn-icon.danger:hover,html.no-touch .btn.danger:active,html.no-touch .btn.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-icon:disabled,.btn:disabled{pointer-events:none!important}.btn-icon:disabled,.btn:disabled{opacity:.3;opacity:var(--disabled-opacity)}.btn-icon{border-radius:50%!important}.btn-icon{align-items:center;background-color:transparent;border:none;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;line-height:1;padding:.5rem;position:relative;text-align:center;transition:color .15s ease-in-out,opacity .15s ease-in-out}.btn-icon.rp{overflow:hidden}.btn-icon.active{color:#3390ec;color:var(--primary-color)}[dir=ltr] .btn-corner{right:var(--offset)}[dir=rtl] .btn-corner{left:var(--offset)}.btn-corner{box-shadow:none!important;padding:0!important;position:absolute!important;transition:transform .2s cubic-bezier(.34,1.56,.64,1)!important;transition:transform var(--btn-corner-transition)!important}.btn-corner{--offset:1.25rem;--translateY:calc(54px + var(--offset));align-items:center;background-color:#3390ec;background-color:var(--primary-color);border:none;bottom:var(--offset);color:#fff;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;outline:none;text-align:center;transform:translate3d(0,var(--translateY),0);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}html.no-touch .btn-corner:active,html.no-touch .btn-corner:hover{background-color:#2086ea;background-color:var(--dark-primary-color)}.btn-corner.is-visible{--translateY:0}body.animation-level-0 .btn-corner{transition:none!important}.btn-corner:disabled{opacity:1!important;pointer-events:all!important}.btn-corner .preloader-circular{height:2.5rem;width:2.5rem}.btn-menu{transform:scale(.8)!important}.btn-menu{-webkit-touch-callout:none;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:10px;font-size:1rem;min-width:11.25rem;opacity:0;padding:.3125rem 0;position:absolute;top:100%;transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),visibility .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--btn-menu-transition),transform var(--btn-menu-transition),visibility var(--btn-menu-transition);-webkit-user-select:none;visibility:hidden;z-index:4}.btn-menu-old,.is-mobile .btn-menu{-webkit-backdrop-filter:none;backdrop-filter:none;background-color:#fff;background-color:var(--surface-color);min-width:auto;padding:.5rem 0}.btn-menu-old .btn-menu-item,.is-mobile .btn-menu .btn-menu-item{transform:none!important}.btn-menu-old .btn-menu-item,.is-mobile .btn-menu .btn-menu-item{--padding-left:1rem;--padding-right:2.5rem;--icon-margin:1.5rem;--icon-size:1.5rem;border-radius:0;font-size:16px;font-size:var(--font-size-16);font-weight:400;height:3rem;line-height:21px;line-height:var(--line-height-16);margin:0}.btn-menu-old .btn-menu-item:before,.is-mobile .btn-menu .btn-menu-item:before{align-self:auto;color:#707579;color:var(--secondary-text-color);margin-top:0}.btn-menu-old .btn-menu-footer,.is-mobile .btn-menu .btn-menu-footer{background-color:#f4f4f5;background-color:var(--background-color)}.btn-menu{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow)}body.animation-level-0 .btn-menu{transition:none}.btn-menu.active{opacity:1;visibility:visible}.btn-menu.active,.is-mobile .btn-menu.was-open{transform:scaleX(1)!important}.btn-menu.bottom-left,.is-rtl .btn-menu.bottom-right{left:auto;right:0;top:100%;transform-origin:top right}.btn-menu.bottom-right,.is-rtl .btn-menu.bottom-left{left:0;right:auto;top:100%;transform-origin:top left}.btn-menu.bottom-center{transform-origin:top center}.btn-menu.top-left{bottom:100%;left:auto;right:0;top:auto;transform-origin:bottom right}.btn-menu.top-right,.is-rtl .btn-menu.top-left{bottom:100%;left:0;right:auto;top:auto;transform-origin:bottom left}.btn-menu.top-center{transform-origin:bottom center}.btn-menu.center-left{transform-origin:center right}.btn-menu.center-right{transform-origin:center left}[dir=ltr] .btn-menu-item{text-align:left}[dir=rtl] .btn-menu-item{text-align:right}.btn-menu-item{cursor:pointer!important;pointer-events:all!important}.btn-menu-item{--padding-vertical:.25rem;--padding-left:.75rem;--padding-right:.75rem;--icon-margin:1.25rem;--icon-size:1.25rem;align-items:center;border-radius:.3125rem;color:#000;color:var(--primary-text-color);display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;height:2rem;line-height:18px;line-height:var(--line-height-14);margin-left:.3125rem;margin-right:.3125rem;padding:var(--padding-vertical) var(--padding-right) var(--padding-vertical) var(--padding-left);position:relative;text-transform:none;transform:scale(1);white-space:nowrap}body.animation-level-2 .btn-menu-item{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--btn-menu-transition)}.btn-menu-item:active{transform:scale(.96)}html.no-touch .btn-menu-item:active,html.no-touch .btn-menu-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-menu-item.danger:active,html.no-touch .btn-menu-item.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-menu-item:before{align-self:flex-start;color:#000;color:var(--primary-text-color);font-size:var(--icon-size);margin-top:.125rem}[dir=ltr] .btn-menu-item-icon,[dir=ltr] .btn-menu-item:before{margin-right:var(--icon-margin)}[dir=rtl] .btn-menu-item-icon,[dir=rtl] .btn-menu-item:before{margin-left:var(--icon-margin)}.btn-menu-item-icon,.btn-menu-item:before{position:relative}[dir=ltr] .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - var(--add)/2)}[dir=rtl] .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - var(--add)/2)}[dir=ltr] .btn-menu-item-icon{margin-left:calc(var(--add)/-2)}[dir=rtl] .btn-menu-item-icon{margin-right:calc(var(--add)/-2)}.btn-menu-item-icon{--add:.25rem;--total:calc(var(--icon-size) + var(--add));flex:0 0 auto;height:var(--total);width:var(--total)}.btn-menu-item-icon .media-photo{height:inherit;width:inherit}@media only screen and (max-width:600px){.btn-menu-item{--padding-right:1.875rem}}.btn-menu-item-text{flex:1 1 auto;position:relative}.btn-menu-item-text,.btn-menu-item-text-fake{pointer-events:none}[dir=ltr] .btn-menu-item-text-fake{margin-left:var(--margin-left)}[dir=rtl] .btn-menu-item-text-fake{margin-right:var(--margin-left)}.btn-menu-item-text-fake{--margin-left:calc(var(--icon-size) + var(--icon-margin));max-width:calc(100% - var(--margin-left) - var(--padding-left) - var(--padding-right));overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.btn-menu-item-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.btn-menu-item-header{pointer-events:none!important}.btn-menu-item-header{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);height:2rem}[dir=ltr] .btn-menu-item .stacked-avatars{right:.5rem}[dir=rtl] .btn-menu-item .stacked-avatars{left:.5rem}.btn-menu-item .stacked-avatars{--margin-right:-.6875rem;flex:0 0 auto;pointer-events:none;position:absolute}.btn-menu-item.is-multiline{font-size:.75rem;height:auto;max-width:16.25rem;min-width:calc(100% - .625rem);width:-moz-fit-content;width:fit-content}.btn-menu-item.is-multiline .btn-menu-item-text{white-space:pre-wrap;width:-moz-fit-content;width:fit-content}.btn-menu-item .checkbox-field-toggle{padding:0}.btn-menu-overlay{max-width:none!important;position:fixed!important;width:auto!important}.btn-menu-overlay{bottom:0;bottom:-100vh;cursor:default;left:0;left:-100vw;right:0;right:-100vw;top:0;top:-100vh;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:4}.btn-menu.has-footer{padding-bottom:0}.btn-menu-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;color:currentColor;display:flex;font-size:.875rem;height:2.5rem;justify-content:center}.btn-menu hr{display:block!important}.btn-menu hr{margin:.3125rem auto;opacity:.6;padding:0;width:calc(100% - 1.875rem)}html:not(.is-mobile) .btn-menu .badge{background-color:transparent;color:#707579;color:var(--secondary-text-color)}.btn-menu-reactions{--inner-shadow-degree:90deg;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:var(--height);filter:drop-shadow(0 .125rem .5rem rgba(0,0,0,.24));height:inherit;max-height:100%;max-width:100%;opacity:0;position:absolute;transform:scale(.8);transform-origin:bottom left}[dir=ltr] .btn-menu-reactions-container{margin-left:var(--other-side-offset)}[dir=rtl] .btn-menu-reactions-container{margin-right:var(--other-side-offset)}.btn-menu-reactions-container{--height:2.25rem;--bubble-side-offset:0rem;--other-side-offset:0rem;--menu-offset:calc((var(--height) + 0.5rem)*-1);--width:calc(var(--menu-width) + (var(--bubble-side-offset) + var(--other-side-offset))*-1);display:flex;height:var(--height);justify-content:flex-start;margin-top:var(--menu-offset);max-width:var(--width);position:fixed;width:var(--width);z-index:4}.contextmenu.bottom-left+.btn-menu-reactions-container .btn-menu-reactions,.contextmenu.center-left+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom right!important}.contextmenu.bottom-center+.btn-menu-reactions-container .btn-menu-reactions{transform-origin:bottom center!important}[dir=ltr] .btn-menu-reactions-container-vertical{margin-left:var(--menu-offset)}[dir=rtl] .btn-menu-reactions-container-vertical{margin-right:var(--menu-offset)}.btn-menu-reactions-container-vertical{flex-direction:column;height:var(--width);margin-top:0;max-height:var(--width);max-width:var(--height);width:var(--height)}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree:180deg;display:flex;flex-direction:column;height:auto;transform-origin:top right;width:inherit}.btn-menu-reactions-container-vertical .btn-menu-reactions-reaction{--padding-vertical:var(--padding-base);--padding-horizontal:0rem}.btn-menu-reactions-container-vertical .btn-menu-reactions-bubble-big{bottom:var(--offset);right:calc(var(--size)/-2)}body.animation-level-2 .btn-menu-reactions{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.btn-menu-reactions.is-visible{opacity:1;transform:scale(1)}.btn-menu-reactions-bubble{background-color:inherit;border-radius:50%;position:absolute;z-index:-1}.btn-menu-reactions-bubble-big{--size:1rem;--offset:calc(var(--height)/2);bottom:calc(var(--size)/-2);height:var(--size);right:var(--offset);width:var(--size)}.btn-menu-reactions:after{background:linear-gradient(var(--inner-shadow-degree),#fff 0,hsla(0,0%,100%,0) 1rem,hsla(0,0%,100%,0) calc(100% - 1rem),#fff 100%);background:linear-gradient(var(--inner-shadow-degree),var(--surface-color) 0,rgba(var(--surface-color-rgb),0) 1rem,rgba(var(--surface-color-rgb),0) calc(100% - 1rem),var(--surface-color) 100%);border-radius:inherit;bottom:0;content:\" \";left:0;pointer-events:none;position:absolute;right:0;top:0}.btn-menu-reactions .scrollable{border-radius:inherit;display:flex;position:relative}.btn-menu-reactions .scrollable-x{align-items:center;padding:0 .25rem}.btn-menu-reactions .scrollable-y{align-items:center;flex-direction:column;padding:.25rem 0}.btn-menu-reactions-reaction{--size:1.625rem;--padding-base:.25rem;--padding-vertical:0rem;--padding-horizontal:var(--padding-base);cursor:pointer;flex:0 0 auto;height:calc(var(--size) + var(--padding-vertical)*2);padding:var(--padding-vertical) var(--padding-horizontal);width:calc(var(--size) + var(--padding-horizontal)*2)}.btn-menu-reactions-reaction-scale{height:100%;width:100%}html:not(.is-safari) .btn-menu-reactions-reaction-scale{transform:scale(1)}html:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-scale{transition:transform .1s linear}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select{transform:scale(1)}html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:active,html.no-touch:not(.is-safari) .btn-menu-reactions-reaction-select:hover{transform:scale(1.25)}html.no-touch:not(.is-safari) body.animation-level-2 .btn-menu-reactions-reaction-select{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.btn-menu-reactions-reaction .media-sticker-wrapper{height:100%;position:relative;width:100%}.btn-primary{border:none;border-radius:10px;cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold);height:54px;overflow:hidden;padding:0;position:relative;text-align:center;transition:opacity .2s;width:100%}html.no-touch .btn-primary:active,html.no-touch .btn-primary:hover{background:#2086ea;background:var(--dark-primary-color);transition:opacity .2s}.btn-primary-transparent{background-color:transparent;color:#3390ec;color:var(--primary-color)}html.no-touch .btn-primary-transparent:active,html.no-touch .btn-primary-transparent:hover{background:rgba(51,144,236,.08);background:var(--light-primary-color)}.btn-primary-transparent .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .btn-primary-transparent.danger:active,html.no-touch .btn-primary-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.btn-primary-transparent .preloader-circular .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}body.animation-level-0 .btn-primary{transition:none}[dir=ltr] .btn-primary use,[dir=ltr] .btn-primary>svg{right:15px}[dir=rtl] .btn-primary use,[dir=rtl] .btn-primary>svg{left:15px}.btn-primary use,.btn-primary>svg{height:calc(100% - 20px);left:auto}.btn-primary:disabled{pointer-events:none!important}.btn-primary:disabled{opacity:.3;opacity:var(--disabled-opacity)}[dir=ltr] .btn-control{padding-left:.75rem;padding-right:1.5rem}[dir=rtl] .btn-control{padding-left:1.5rem;padding-right:.75rem}.btn-control{align-items:center;border-radius:1.25rem;display:flex;height:2.5rem;line-height:2.5rem;margin:.9375rem auto 1rem;width:auto}[dir=ltr] .btn-control.tgico:before{margin-right:.375rem}[dir=rtl] .btn-control.tgico:before{margin-left:.375rem}.btn-control.tgico:before{font-size:1.5rem}.btn-transparent{align-items:center;background-color:transparent;color:#000;color:var(--primary-text-color);display:flex;font-weight:400;height:3rem;line-height:1.3125;line-height:var(--line-height);padding:0 1rem}@media only screen and (max-width:600px){.btn-transparent{height:3rem}}html.no-touch .btn-transparent:active,html.no-touch .btn-transparent:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}html.no-touch .btn-transparent.danger:active,html.no-touch .btn-transparent.danger:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}html.no-touch .btn-transparent.primary:active,html.no-touch .btn-transparent.primary:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}[dir=ltr] .btn-transparent:before{margin-right:2rem}[dir=rtl] .btn-transparent:before{margin-left:2rem}.btn-transparent:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem}@media only screen and (max-width:600px){[dir=ltr] .btn-transparent:before{margin-right:1.5rem}[dir=rtl] .btn-transparent:before{margin-left:1.5rem}}[dir=ltr] .btn-transparent.btn-short:before{margin-right:1rem}[dir=rtl] .btn-transparent.btn-short:before{margin-left:1rem}.btn-primary.btn-circle .preloader-circular{height:calc(100% - 20px);left:auto;margin:0;right:auto;top:10px}.btn-primary.btn-circle .preloader-circular .preloader-path{stroke:#fff}.btn-menu-toggle{cursor:pointer!important;font-weight:400!important;overflow:visible!important;pointer-events:all!important}.btn-menu-toggle{position:relative}.btn-menu-toggle:not(.btn-primary):not(.btn-corner).menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.btn-menu-toggle .btn-menu{margin-top:.5rem}.btn-circle{--size:54px;border-radius:50%;height:var(--size);line-height:var(--size);width:var(--size)}@media only screen and (max-width:600px){.btn-circle{--size:46px}}.btn-circle path{fill:#fff}.btn-disabled{color:#707579!important;color:var(--secondary-text-color)!important;cursor:default!important;pointer-events:none!important}.btn-disabled:before{color:inherit!important}.btn-secondary:not(:first-child){margin-top:.5rem!important}.btn-color-primary{background:#3390ec;background:var(--primary-color);color:#fff}.call-button{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border-radius:50%;font-size:1.5rem;height:3.375rem;height:var(--call-button-size);justify-content:center;position:relative}.call-button,.call-button-container{align-items:center;cursor:pointer;display:flex;width:3.375rem;width:var(--call-button-size)}.call-button-container{flex-direction:column}.call-button-container.disabled,.call-button-container.disabled .call-button{pointer-events:none}.call-button-container.disabled .call-button,.call-button-container.disabled .call-button-text{opacity:.8}.call-button-text{font-size:.875rem;margin-top:.25rem;white-space:nowrap}body.animation-level-2 .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .call-button{transition:background-color .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:background-color var(--transition-standard-in),opacity var(--transition-standard-in)}[dir=ltr] .call-button+.call-button,[dir=ltr] .call-button-container+.call-button-container{margin-left:var(--call-button-margin)}[dir=rtl] .call-button+.call-button,[dir=rtl] .call-button-container+.call-button-container{margin-right:var(--call-button-margin)}[dir=ltr] .call-button+.call-button,[dir=ltr] .call-button-container+.call-button-container{margin-left:2rem}[dir=rtl] .call-button+.call-button,[dir=rtl] .call-button-container+.call-button-container{margin-right:2rem}[dir=ltr] .btn-update{right:auto!important}[dir=rtl] .btn-update{left:auto!important}.btn-update{padding:0 2rem!important}.btn-update{border-radius:var(--size);font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);width:auto}.animated-close-icon{pointer-events:none;position:absolute;transform:rotate(-45deg)}.animated-close-icon,.animated-close-icon:after,.animated-close-icon:before{background-color:#707579;background-color:var(--secondary-text-color);border-radius:.125rem;height:.125rem;width:1.125rem}.animated-close-icon:after,.animated-close-icon:before{content:\"\";left:0;position:absolute;top:0}.animated-close-icon:before{transform:rotate(90deg)}body.animation-level-2 .animated-close-icon,body.animation-level-2 .animated-close-icon:after,body.animation-level-2 .animated-close-icon:before{transition:transform .4s ease-in-out;transition:transform var(--slide-header-transition)}.animated-close-icon.state-back{transform:rotate(180deg)}.animated-close-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translateY(-.375rem)}.animated-close-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translateY(.375rem)}.animated-menu-icon{--color:var(--secondary-text-color);position:absolute}.animated-menu-icon,.animated-menu-icon:after,.animated-menu-icon:before{background-color:var(--color);border-radius:.125rem;height:.125rem;transform:rotate(0);width:1.125rem}body.animation-level-2 .animated-menu-icon,body.animation-level-2 .animated-menu-icon:after,body.animation-level-2 .animated-menu-icon:before{transition:transform .25s}.animated-menu-icon:after,.animated-menu-icon:before{content:\"\";left:0;position:absolute}.animated-menu-icon:before{top:-.3125rem}.animated-menu-icon:after{top:.3125rem}.animated-menu-icon.state-back{transform:rotate(180deg)}.animated-menu-icon.state-back:before{transform:rotate(45deg) scaleX(.75) translate(.375rem,-.1875rem)}.animated-menu-icon.state-back:after{transform:rotate(-45deg) scaleX(.75) translate(.375rem,.1875rem)}.animated-menu-close-icon{margin-top:-.625rem}.animated-menu-close-icon:before{opacity:1;top:.3125rem}body.animation-level-2 .animated-menu-close-icon:before{transition:transform .25s,opacity .125s 0s}.animated-menu-close-icon:after{top:.625rem}.animated-menu-close-icon.state-back{transform:translateY(.3125rem) rotate(135deg)}.animated-menu-close-icon.state-back:before{opacity:0;transform:rotate(45deg)}.animated-menu-close-icon.state-back:after{transform:translateY(-.625rem) rotate(90deg)}.animated-button-icon>.tgico{height:24px;line-height:24px;position:absolute}body:not(.animation-level-0) .animated-button-icon>.tgico{animation:hide-icon .4s ease-in-out forwards}body.animation-level-0 .animated-button-icon>.tgico{animation:none!important}body.animation-level-0 .animated-button-icon>.tgico{visibility:hidden}.autocomplete-helper{border-radius:var(--border-radius)!important;padding:0!important;position:absolute!important;width:auto!important}.autocomplete-helper{--border-radius:10px;bottom:calc(100% + .5rem);left:0;max-width:100%;overflow:hidden}.autocomplete-helper:not(.is-visible){display:none}.autocomplete-helper.is-visible{visibility:hidden}body.animation-level-2 .autocomplete-helper.is-visible{animation:fade-out-opacity .2s ease-in-out forwards;transition:visibility 0s .2s}.bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){visibility:visible}body.animation-level-2 .bubbles:not(.is-selecting)~.chat-input .autocomplete-helper.is-visible:not(.backwards){animation-name:fade-in-opacity;transition:visibility 0s 0s}@media only screen and (max-width:319px){.autocomplete-helper{max-width:calc(100vw - var(--padding-horizontal)*4)}}.autocomplete-peer-helper .scrollable{max-height:232px;position:relative}.autocomplete-peer-helper-list{padding:.5rem 0}.autocomplete-peer-helper-list-element{align-items:center;cursor:pointer;display:flex;height:3.125rem;line-height:1.3125;line-height:var(--line-height);padding:0 2.125rem 0 .75rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.autocomplete-peer-helper-list-element{padding-right:.75rem}}.autocomplete-peer-helper-list-element-name{flex:0 0 auto;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.875rem}.autocomplete-peer-helper-list-element-description{color:#707579;color:var(--secondary-text-color);margin-left:.5625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.autocomplete-peer-helper-list-element-avatar{flex:0 0 auto}.badge{line-height:var(--size)!important}.badge{--size:1.375rem;--padding:.4375rem;border-radius:calc(var(--size)/2);color:#fff;color:var(--badge-text-color);font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);min-width:var(--size);padding:0 var(--padding);text-align:center}body.animation-level-2 .badge{transition:background-color .2s ease-in-out}.badge:not(.tgico):empty{display:none}.badge-20{--size:1.25rem;--padding:.375rem}.badge-24{--size:1.5rem;--padding:.5rem}.badge.tgico:before{font-size:var(--size)}.badge-primary{background-color:#3390ec;background-color:var(--primary-color)}.badge-gray{background-color:#c4c9cc;background-color:var(--secondary-color)}.ckin__player{letter-spacing:.02em;-webkit-user-select:none;-moz-user-select:none;user-select:none}.ckin__player.ckin__fullscreen{border-radius:0!important}.ckin__player.ckin__fullscreen{background:#000;bottom:0;display:flex;height:100%;left:0;position:fixed;right:0;top:0;width:100%;z-index:10000000}.ckin__player.ckin__fullscreen video{height:100%;-o-object-fit:contain;object-fit:contain;width:100%}.ckin__player .time{color:#fff;font-size:.875rem;margin-left:.875rem}@media only screen and (max-width:600px){.ckin__player .time{margin-left:1.125rem}}.default{align-items:center;display:flex;font-size:0;justify-content:center;position:relative}.default.show-controls video{cursor:pointer}.default__button{color:#fff;padding:.375rem}.default__button i{align-self:center}.default__button--big{background:none;border:0;color:#fff;font-size:4rem;left:50%;line-height:1;opacity:1;outline:0;padding:0;position:absolute;text-align:center;top:50%;transform:translate3d(-50%,-50%,0) scale(1)}@media only screen and (min-width:601px){.default__button--big{pointer-events:none}}body.animation-level-2 .default__button--big{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}@media only screen and (max-width:600px){.default__button--big{font-size:3rem}}.default:not(.played) .default__button--big{opacity:0}[dir=ltr] .default__controls{text-align:left}[dir=rtl] .default__controls{text-align:right}.default__controls{bottom:0;direction:ltr;left:0;position:absolute;right:0;z-index:6}body.animation-level-2 .default__controls{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}.default__controls .progress-line{border-radius:var(--border-radius);margin:0 16px}.default__controls .progress-line__filled{background:#3390ec;background:var(--primary-color)}.default__controls .progress-line__loaded{background-color:#fff}.default__controls .progress-line{background:hsla(0,0%,100%,.38)}@media only screen and (max-width:600px){.default__controls .progress-line{margin-bottom:-1px}}.default__gradient-bottom{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAADGCAYAAAAT+OqFAAAAdklEQVQoz42QQQ7AIAgEF/T/D+kbq/RWAlnQyyazA4aoAB4FsBSA/bFjuF1EOL7VbrIrBuusmrt4ZZORfb6ehbWdnRHEIiITaEUKa5EJqUakRSaEYBJSCY2dEstQY7AuxahwXFrvZmWl2rh4JZ07z9dLtesfNj5q0FU3A5ObbwAAAABJRU5ErkJggg==);background-position:bottom;background-repeat:repeat-x;bottom:0;height:49px;padding-top:93px;pointer-events:none;position:absolute;width:100%;z-index:2}body.animation-level-2 .default__gradient-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}@media only screen and (max-width:600px){.default:not(.ckin__fullscreen) .default__gradient-bottom{display:none}}.default .toggle:before{content:\"\"}.default .default__gradient-bottom{transform:translate3d(0,50px,0)}.default .default__controls{transform:translate3d(0,52px,0)}@media only screen and (max-width:600px){.default .default__controls{transform:translate3d(0,65px,0)}}.default.show-controls .default__controls,.default.show-controls .default__gradient-bottom{transform:translateZ(0)}.default.is-playing:not(.show-controls){cursor:none}.default.is-playing .default__button--big,.default:not(.played) .default__button--big{opacity:0}.default.is-playing .toggle:not(.default__button--big):before,.default:not(.played) .toggle:not(.default__button--big):before{content:\"\"}.default .player-volume{--icon-size:2.25rem;--icon-margin-right:.5rem;--selector-size:50px;--selector-thumb-size:.75rem;--hide-width:var(--icon-size);--show-width:calc(var(--icon-size) + var(--icon-margin-right) + var(--selector-size) + var(--selector-thumb-size)*0.75);align-items:center;display:flex;overflow:hidden;width:var(--hide-width)}body.animation-level-2 .default .player-volume{transition:width .2s cubic-bezier(.4,0,.2,1);transition:width var(--layer-transition)}html.is-touch .default .player-volume{display:none}html:not(.is-touch) .default .player-volume+.time{margin-left:.5rem}html.no-touch .default .player-volume:active,html.no-touch .default .player-volume:hover{width:var(--show-width)}.default .player-volume__icon{color:#fff;cursor:pointer;display:flex;font-size:1.5rem;height:var(--icon-size);margin-right:var(--icon-margin-right);padding:.375rem;width:var(--icon-size)}.default .player-volume .progress-line{--color:#fff;--thumb-size:var(--selector-thumb-size);--height:4px;margin:0;min-width:var(--selector-size);width:var(--selector-size)}html.is-ios .default .player-volume .progress-line{display:none}.default.is-buffering>.toggle{display:none!important}video::-webkit-media-controls-enclosure{display:none!important}.progress-line{--color:var(--primary-color);--height:5px;--border-radius:6px;--thumb-size:13px;border-radius:var(--border-radius);cursor:pointer;height:var(--height);position:relative}.progress-line:before{border-radius:inherit;bottom:0;content:\" \";display:block;left:0;position:absolute;right:0;top:0}.progress-line__seek{-webkit-appearance:none;-moz-appearance:none;background:transparent;bottom:-.5rem;caret-color:var(--color);cursor:pointer;margin:0;outline:none;padding:0;position:absolute;top:-.5rem;width:100%}.progress-line__seek:focus{outline:none}.progress-line__seek::-webkit-slider-thumb{display:none}.progress-line__seek::-moz-range-thumb{display:none;height:0;width:0}.progress-line__seek::-moz-range-track{display:none}.progress-line__seek::-webkit-slider-runnable-track{display:none}.progress-line__filled{max-width:100%}.progress-line__filled:not(.progress-line__loaded){background-color:var(--color);z-index:1}.progress-line__filled:not(.progress-line__loaded):after{background-color:var(--color);border-radius:50%;content:\" \";cursor:pointer;display:block;height:var(--thumb-size);position:absolute;right:0;top:calc((var(--thumb-size) - var(--height))/-2);transform:translateX(calc(var(--thumb-size)/2)) scale(1);width:var(--thumb-size)}body.animation-level-2 .progress-line__filled:not(.progress-line__loaded):after{transition:transform .125s ease-in-out}.progress-line.is-focused .progress-line__filled:not(.progress-line__loaded):after{transform:translateX(calc(var(--thumb-size)/2)) scale(1.125)}.progress-line:before,.progress-line__loaded{background-color:#c4c9cc;background-color:var(--secondary-color);opacity:.3}.progress-line__filled,.progress-line__loaded{border-radius:var(--border-radius);bottom:0;position:absolute;top:0}body.animation-level-2 .progress-line.with-transition .progress-line__filled{transition:width .2s}.progress-line.use-transform .progress-line__filled{transform-origin:left center;width:100%}input[type=range]::-ms-track{visibility:hidden}input[type=range]::-ms-ticks{background:none;border:none;color:none}input[type=range]::-ms-thumb,input[type=range]::-ms-tooltip{visibility:hidden}.bottom-controls,.left-controls,.right-controls{align-items:center;display:flex}.bottom-controls{height:2.25rem;justify-content:space-between;padding:0 .625rem}@media only screen and (max-width:600px){.bottom-controls{height:3.625rem}}[dir=ltr] .checkbox-field{text-align:left}[dir=rtl] .checkbox-field{text-align:right}.checkbox-field{--size:1.25rem;--offset-left:0px;cursor:pointer;display:block;margin:1.5rem 1.1875rem;min-height:var(--size);min-width:var(--size);position:relative}body.animation-level-2 .checkbox-field{transition:opacity .2s}.checkbox-field.checkbox-disabled{pointer-events:none!important}.checkbox-field.checkbox-disabled{opacity:.3;opacity:var(--disabled-opacity)}@media only screen and (max-width:600px){.checkbox-field{margin-bottom:27px}}[dir=ltr] .checkbox-field .checkbox-box{left:var(--offset-left)}[dir=rtl] .checkbox-field .checkbox-box{right:var(--offset-left)}.checkbox-field .checkbox-box{border-radius:.3125rem;height:var(--size);overflow:hidden;position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}html.is-safari .checkbox-field .checkbox-box{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.checkbox-field .checkbox-box-background,.checkbox-field .checkbox-box-border,.checkbox-field .checkbox-box-check{left:0;position:absolute;top:0}.checkbox-field .checkbox-box-border{border:2px solid #8d969c;border-radius:inherit;bottom:0;left:0;right:0}.checkbox-field .checkbox-box-background{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;bottom:-15%;left:-15%;right:-15%;top:-15%;transform:scale(1);transition:transform .2s ease-in-out 0s}body.animation-level-0 .checkbox-field .checkbox-box-background{transition:none!important}.checkbox-field .checkbox-box-check{--offset:7px;height:calc(var(--size) - var(--offset));left:50%;top:50%;transform:translate(-50%,-50%);width:calc(var(--size) - var(--offset))}.checkbox-field .checkbox-box-check use{stroke:#fff;stroke-width:3.75;stroke-linecap:round;stroke-dasharray:24.19,24.19;stroke-dashoffset:0;transition:stroke-dasharray .1s ease-in-out .15s,visibility 0s .15s;visibility:visible}body.animation-level-0 .checkbox-field .checkbox-box-check use{transition:none!important}[dir=ltr] .checkbox-field .checkbox-caption{padding-left:3.375rem}[dir=rtl] .checkbox-field .checkbox-caption{padding-right:3.375rem}.checkbox-field .checkbox-caption{color:inherit;line-height:1.3125;line-height:var(--line-height);pointer-events:none;position:relative;transition:opacity .2s}body.animation-level-0 .checkbox-field .checkbox-caption{transition:none}.checkbox-field.hover-effect{align-items:center;display:flex;height:3.5rem;margin-left:0;margin-right:0;padding:0 1.1875rem}[dir=ltr] .checkbox-field.hover-effect .checkbox-box{left:auto}[dir=rtl] .checkbox-field.hover-effect .checkbox-box{right:auto}.checkbox-field .anchor-url{pointer-events:all}.checkbox-ripple{border-radius:10px;overflow:hidden}.checkbox-ripple .checkbox-box,.checkbox-ripple .checkbox-caption{pointer-events:none}.checkbox-field-round{--size:1.5rem}.checkbox-field-round .checkbox-box{border-radius:50%;overflow:auto}.checkbox-field-round .checkbox-box-background{bottom:0;left:0;right:0;top:0}.checkbox-field-round .checkbox-box-border{border:2px solid #c4c9cc;border:2px solid var(--secondary-color);z-index:1}.checkbox-field-round .checkbox-box-check{--offset:calc(var(--size) - var(--size)/2 - 0.125rem)}html.is-safari .checkbox-field-round .checkbox-box{-webkit-mask-image:none}[dir=ltr] .radio-field{text-align:left}[dir=rtl] .radio-field{text-align:right}.radio-field{--size:1.375rem;--offset-left:0px;cursor:pointer;line-height:1.3125;line-height:var(--line-height);margin:1.25rem 0;position:relative}.radio-field.hidden-widget{cursor:default}.radio-field.hidden-widget .radio-field-main:after,.radio-field.hidden-widget .radio-field-main:before{visibility:hidden}.radio-field>input:checked~.radio-field-main:before{border-color:#3390ec;border-color:var(--primary-color)}.radio-field>input:checked~.radio-field-main:after{transform:translateY(-50%) scale(1)}[dir=ltr] .radio-field .radio-field-main{padding-left:3.5rem}[dir=rtl] .radio-field .radio-field-main{padding-right:3.5rem}.radio-field .radio-field-main{color:inherit;position:relative}[dir=ltr] .radio-field .radio-field-main:after,[dir=ltr] .radio-field .radio-field-main:before{left:var(--offset-left)}[dir=rtl] .radio-field .radio-field-main:after,[dir=rtl] .radio-field .radio-field-main:before{right:var(--offset-left)}.radio-field .radio-field-main:after,.radio-field .radio-field-main:before{content:\"\";display:block;height:var(--size);position:absolute;top:50%;transform:translateY(-50%);width:var(--size)}.radio-field .radio-field-main:before{border:2px solid #707579;border:2px solid var(--secondary-text-color);border-radius:50%;opacity:1}body.animation-level-2 .radio-field .radio-field-main:before{transition:border-color .1s ease,opacity .1s ease}[dir=ltr] .radio-field .radio-field-main:after{left:calc(var(--offset-left) + .3125rem)}[dir=rtl] .radio-field .radio-field-main:after{right:calc(var(--offset-left) + .3125rem)}.radio-field .radio-field-main:after{background:#3390ec;background:var(--primary-color);border-radius:50%;height:.75rem;transform:translateY(-50%) scale(0);transform-origin:center;width:.75rem}body.animation-level-2 .radio-field .radio-field-main:after{transition:transform .1s ease}[dir=ltr] .radio-field.radio-field-right .radio-field-main:before{left:auto;right:0}[dir=rtl] .radio-field.radio-field-right .radio-field-main:before{left:0;right:auto}[dir=ltr] .radio-field.radio-field-right .radio-field-main:after{left:auto;right:.3125rem}[dir=rtl] .radio-field.radio-field-right .radio-field-main:after{left:.3125rem;right:auto}[type=checkbox],[type=radio]{box-sizing:border-box;opacity:0;padding:0;position:absolute;z-index:-1;z-index:var(--z-below)}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dasharray:0,24.19;transition:stroke-dasharray .1s ease-in-out,visibility 0s .1s;visibility:hidden}.checkbox-field .checkbox-field-input:not(:checked)+.checkbox-box .checkbox-box-background{transform:scale(0);transition:transform .2s ease-in-out .05s}.checkbox-field .checkbox-field-input:disabled+.checkbox-box,.checkbox-field .checkbox-field-input:disabled~.checkbox-caption{cursor:default;opacity:.3;opacity:var(--disabled-opacity)}.checkbox-field-restriction .checkbox-box-border{display:none}.checkbox-field-restriction .checkbox-box-background{transform:none!important;transition:background-color .2s!important}.checkbox-field-restriction .checkbox-box-check use{stroke-dasharray:24.19,24.19!important;transition:stroke-dashoffset .2s ease-in-out,transform .2s ease-in-out!important;visibility:visible!important}.checkbox-field-restriction .checkbox-box-check use{transform:rotate(0) translateY(0)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-check use{stroke-dashoffset:35.5;transform:rotate(45deg) translateY(-10px)}.checkbox-field-restriction [type=checkbox]:not(:checked)+.checkbox-box .checkbox-box-background{background-color:#df3f40;background-color:var(--danger-color)}.checkbox-field-toggle{--size:20px;align-items:center;display:flex;margin:0 .3125rem;padding:0 .25rem;pointer-events:none}.checkbox-field-toggle .checkbox-toggle{--offset:3px;--toggle-width:1.9375rem;align-items:center;background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:12px;display:flex;height:.875rem;margin:0 var(--offset);position:relative;width:var(--toggle-width)}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle{transition:background-color .1s}.checkbox-field-toggle .checkbox-toggle:before{background-color:#fff;background-color:var(--surface-color);border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:50%;content:\" \";height:1.25rem;position:absolute;transform:translateX(calc(var(--offset)*-1));width:1.25rem}body.animation-level-2 .checkbox-field-toggle .checkbox-toggle:before{transition:border-color .1s,transform .1s cubic-bezier(.22,.75,.7,1.44)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle{background-color:#3390ec;background-color:var(--primary-color)}.checkbox-field-toggle [type=checkbox]:checked+.checkbox-toggle:before{border-color:#3390ec;border-color:var(--primary-color);transform:translateX(calc(var(--toggle-width) - 1.25rem + var(--offset)))}.chatlist-container{position:relative}@media only screen and (max-width:600px){.chatlist-container .search-group-recent.search-group{padding:2px 0 0}}.chatlist-container .search-group{margin-bottom:17px;padding:1rem 0 .5rem;width:100%}@media only screen and (max-width:600px){.chatlist-container .search-group{margin-bottom:0}}.chatlist-container .search-group__name{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:0 23px 1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (max-width:600px){.chatlist-container .search-group__name{font-size:15px;padding:5px 9px 0 16px}}.chatlist-container .search-group-contacts{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color)}@media only screen and (max-width:600px){.chatlist-container .search-group-contacts{padding:0 0 2px}}.chatlist-container .search-group-people.search-group-contacts{padding:5px 0!important}.chatlist-container .search-group:last-child{border-bottom:none}.chatlist-container .search-super .search-group{margin-bottom:0;padding:0 0 .5rem}.chatlist-container .search-super .search-group__name{display:flex;justify-content:space-between;padding-top:1rem}ul.chatlist{padding:0 .5rem}@media only screen and (max-width:600px){ul.chatlist{padding:0}}.chatlist{-webkit-touch-callout:none;background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;margin:0;position:relative;-moz-user-select:none;user-select:none;-webkit-user-select:none;width:100%}.chatlist-chat{background:var(--background)!important}.chatlist-chat{--background:unset;-webkit-user-drag:none}.chatlist-chat.is-forum-open,.chatlist-chat.menu-open,html.no-touch .chatlist-chat:active,html.no-touch .chatlist-chat:hover{--background:var(--light-filled-secondary-text-color)}[dir=ltr] .chatlist-chat.is-muted .user-title:after{margin-left:.125rem}[dir=rtl] .chatlist-chat.is-muted .user-title:after{margin-right:.125rem}.chatlist-chat.is-muted .user-title:after{color:#a2abb2;color:var(--chatlist-pinned-color);content:\"\";flex:0 0 auto;font-size:1.125rem}body:not(.animation-level-0) .chatlist-chat.is-muted.animating:not(.backwards) .user-title:after{animation:fade-in-opacity .2s ease-in-out forwards}body:not(.animation-level-0) .chatlist-chat.is-muted.animating.backwards .user-title:after{animation:fade-in-backwards-opacity .2s ease-in-out forwards}.chatlist-chat i{font-style:normal}.chatlist-chat .text-highlight{color:#000;color:var(--primary-text-color)}.chatlist-chat .premium-icon{margin-top:-.125rem}.chatlist-chat .topic-icon{flex:0 0 auto}[dir=ltr] .chatlist-chat .row-title .topic-icon{margin-right:.25rem}[dir=rtl] .chatlist-chat .row-title .topic-icon{margin-left:.25rem}.chatlist-chat .row-title .topic-icon{--size:1.375rem}.chatlist-chat .topic-name .topic-icon{line-height:1!important}.chatlist-chat .topic-name .topic-icon{display:inline}.chatlist-chat .topic-name .topic-icon-svg{position:relative}.chatlist-chat .topic-name .topic-icon-content{left:0;margin-top:-6px;position:absolute;right:0;top:0}@media only screen and (min-width:601px){.chatlist-chat.active{--background:var(--primary-color)!important}.chatlist-chat.active .message-status,.chatlist-chat.active .premium-icon,.chatlist-chat.active .row-subtitle,.chatlist-chat.active .row-title,.chatlist-chat.active .sending-status-icon,.chatlist-chat.active .text-highlight,.chatlist-chat.active .tgico-chatspinned:before,.chatlist-chat.active .user-title,.chatlist-chat.active .verified-icon{color:#fff!important}.chatlist-chat.active .badge-fake{border-color:#fff;color:#fff}.chatlist-chat.active .danger,.chatlist-chat.active .primary-text{color:#fff!important}.chatlist-chat.active .user-title:after{color:hsla(0,0%,100%,.7)}.chatlist-chat.active .verified-icon-background{fill:#fff!important}.chatlist-chat.active .verified-icon-check{visibility:hidden}.chatlist-chat.active .dialog-avatar.is-online:after,.chatlist-chat.active .dialog-group-call-icon{background-color:#fff;border-color:#3390ec;border-color:var(--primary-color)}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{background-color:#fff!important}.chatlist-chat.active .badge.unread,.chatlist-chat.active .mention{color:#3390ec;color:var(--primary-color)}.chatlist-chat.active .peer-typing-container{--color:#fff}}.chatlist .peer-typing-container{--color:var(--secondary-text-color)}.chatlist .peer-typing-container .peer-typing-text{display:inline-flex;transform:translateY(-2px)}.chatlist .sending-status-icon.tgico-premium_lock{color:#c4c9cc;color:var(--secondary-color);font-size:.8125rem;margin:.1875rem 0 0 .5rem}[dir=ltr] .chatlist .dialog-title-details{margin-left:.5rem}[dir=rtl] .chatlist .dialog-title-details{margin-right:.5rem}.chatlist .dialog-title-details{flex:0 0 auto;font-size:.75rem;padding:1px 0 0}[dir=ltr] .chatlist .dialog-subtitle-badge{margin-left:.5rem}[dir=rtl] .chatlist .dialog-subtitle-badge{margin-right:.5rem}.chatlist .dialog-subtitle-badge{display:block!important}.chatlist .dialog-subtitle-badge{flex:0 0 auto}.chatlist .dialog-subtitle-badge.avatar-badge{line-height:23px!important}.chatlist .dialog-subtitle-badge.avatar-badge{--size:1.625rem;border:2px solid #fff;border:2px solid var(--background,var(--surface-color));margin:0;pointer-events:none;position:absolute;right:calc(100% - 4.0625rem);top:2.4375rem}[dir=ltr] .chatlist .dialog-subtitle-media{margin-right:.375rem}[dir=rtl] .chatlist .dialog-subtitle-media{margin-left:.375rem}.chatlist .dialog-subtitle-media{border-radius:.25rem;display:inline-block;flex:0 0 auto;height:1.25rem;line-height:1.25rem;position:relative;width:1.25rem}.chatlist .dialog-subtitle-media:before{content:\" \";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.chatlist .dialog-subtitle-media.is-round{border-radius:50%}.chatlist .dialog-subtitle-media.is-round .tgico-play{font-size:.875rem}.chatlist .dialog-subtitle-media .tgico-play{color:#fff;font-size:1rem;left:50%;line-height:1;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:1}.chatlist .dialog-subtitle-media .media-photo{border-radius:inherit;bottom:auto;height:inherit;-o-object-fit:cover;object-fit:cover;top:auto;width:inherit}.chatlist .dialog-group-call-icon{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;height:20px;left:45px;overflow:hidden;position:absolute;top:45px;width:20px;z-index:2}body.animation-level-2 .chatlist .dialog-group-call-icon,body.animation-level-2 .chatlist .dialog-subtitle-badge{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-group-call-icon.is-visible:not(.backwards),body.animation-level-2 .chatlist .dialog-subtitle-badge.is-visible:not(.backwards){transform:scale(1)}body.animation-level-2 .chatlist .dialog-group-call-icon.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.backwards{opacity:0}body.animation-level-2 .chatlist .dialog-group-call-icon.animating,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating{transition:background-color .25s cubic-bezier(.35,.35,.47,1.34),transform .25s cubic-bezier(.35,.35,.47,1.34);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-group-call-icon.animating.backwards,body.animation-level-2 .chatlist .dialog-subtitle-badge.animating.backwards{transition:background-color .25s cubic-bezier(.35,.35,.7,1),transform .25s cubic-bezier(.35,.35,.7,1),opacity .25s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}body.animation-level-2 .chatlist .dialog-avatar:after{opacity:1;transform:scale(0);transition:none}body.animation-level-2 .chatlist .dialog-avatar.is-visible:not(.backwards):after{transform:scale(1)}body.animation-level-2 .chatlist .dialog-avatar.backwards:after{opacity:0}body.animation-level-2 .chatlist .dialog-avatar.animating:after{transition:background-color .25s cubic-bezier(.35,.35,.47,1.34),transform .25s cubic-bezier(.35,.35,.47,1.34);transition:background-color var(--chatlist-badge-transition-in),transform var(--chatlist-badge-transition-in)}body.animation-level-2 .chatlist .dialog-avatar.animating.backwards:after{transition:background-color .25s cubic-bezier(.35,.35,.7,1),transform .25s cubic-bezier(.35,.35,.7,1),opacity .25s cubic-bezier(.35,.35,.7,1);transition:background-color var(--chatlist-badge-transition-out),transform var(--chatlist-badge-transition-out),opacity var(--chatlist-badge-transition-out)}.chatlist .dialog-avatar{flex:0 0 auto}.chatlist .dialog-avatar,.chatlist .row-row{pointer-events:none;position:relative}.chatlist .user-title{display:flex!important}.chatlist .user-title{align-items:center}.chatlist .user-title img.emoji{height:18px;margin-top:1px;vertical-align:top;width:18px}.chatlist .user-last-message img.emoji{height:20px;margin-top:-3px;width:20px}.chatlist .user-last-message,.chatlist .user-title{flex-grow:1;position:relative}[dir=ltr] .chatlist .message-status{margin-right:.125rem}[dir=rtl] .chatlist .message-status{margin-left:.125rem}.chatlist .message-status{color:#0ac630;color:var(--chatlist-status-color);display:inline-block;font-size:1.25rem;height:1.25rem;line-height:1;margin-top:-.0625rem;position:relative;vertical-align:middle;width:1.25rem}.chatlist .message-status:before{vertical-align:middle}.chatlist .tgico-chatspinned{background:transparent}body.animation-level-2 .chatlist .tgico-chatspinned:before{transition:opacity .2s ease-in-out}.chatlist .tgico-chatspinned:before{color:#a2abb2;color:var(--chatlist-pinned-color);opacity:1}.chatlist .tgico-chatspinned.unread:before{opacity:0}.chatlist .tgico-chatspinned{position:relative}.chatlist .tgico-chatspinned:before{left:0;position:absolute;top:0}.chatlist .mention{background-color:#0ac630!important;background-color:var(--chatlist-status-color)!important;line-height:1.25rem!important}.chatlist .mention{padding:0}[dir=ltr] .chatlist .mention-badge{margin-right:-.125rem}[dir=rtl] .chatlist .mention-badge{margin-left:-.125rem}.chatlist .is-muted.backwards .unread,.chatlist .unread{background-color:#0ac630;background-color:var(--chatlist-status-color)}.chatlist .is-muted .unread,.chatlist .no-unmuted-topic .unread{background-color:#c4c9cc;background-color:var(--secondary-color)}.chatlist .not-visited{background-color:#c4c9cc!important;background-color:var(--secondary-color)!important}.chatlist .not-visited{--size:.5rem;--padding:0}.chatlist-parts.with-contacts .chatlist-top:not(.with-placeholder){height:auto;padding-bottom:.5rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder.has-contacts{height:24.125rem}.chatlist-parts.with-contacts .chatlist-top.with-placeholder .empty-placeholder-dialogs{top:50%}.chatlist-top{height:100%}.chatlist-bottom{max-height:36.375rem}.chatlist-bottom .sidebar-left-section{margin-bottom:0!important}.chatlist-bottom .sidebar-left-section{padding-bottom:0}.chatlist-bottom .chatlist-new{padding:0}.chat-input{--translateY:0;--padding-bottom:0.5rem;--bottom:var(--padding-bottom);display:flex;flex:0 0 auto;flex-direction:column;max-width:100%;padding-top:.25rem;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .chat-input{transition:none!important}@media only screen and (min-height:570px)and (min-width:601px){.chat-input{max-width:728px!important;max-width:var(--messages-container-width)!important}}@media only screen and (min-width:601px){.chat-input{--padding-bottom:1.25rem}}@media only screen and (max-height:569px){.chat-input{--padding-bottom:0.5rem}}@media only screen and (min-width:1276px){.chat-input{width:calc(100% - var(--right-column-width))!important}body.is-right-column-shown .chat-input{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0)!important}body.is-right-column-shown .chat-input{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}.chat-input.is-hidden{position:absolute!important;transform:translate3d(0,var(--translateY),0)!important}.chat-input.is-hidden{--translateY:100%;bottom:0;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles.is-selecting:not(.backwards)~.chat-input.is-hidden{--translateY:0}.chat-input-container{--padding-horizontal:var(--chat-input-padding);align-items:flex-end;display:flex;flex:0 0 auto;justify-content:center;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);padding:0 var(--padding-horizontal);padding-bottom:var(--bottom);position:relative;width:100%}.chat-input-container .btn-circle{height:var(--chat-input-size);width:var(--chat-input-size)}.chat-input-container.is-centering .new-message-wrapper{pointer-events:none}.chat-input-container.is-centering:not(.backwards) .new-message-wrapper{opacity:0}.chat-input-container.is-centering:not(.backwards) .rows-wrapper{border-bottom-right-radius:12px;max-height:var(--chat-input-size)}.chat-input-container.is-centering:not(.backwards) .rows-wrapper .bubble-tail{opacity:0;transform:scaleX(-1) translateX(1.125rem)}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{height:0!important}.chat-input-container.is-centering:not(.backwards) .reply-wrapper{opacity:0;pointer-events:none}.chat-input-container.is-centering:not(.backwards) .btn-send{transform:scale(0)}.chat-input-container.is-centering.animating .rows-wrapper{transition:transform .2s,max-height .2s,border-radius .1s}.chat-input-container.is-centering.animating .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 0s}.chat-input-container.is-centering.animating .selection-wrapper{transition:opacity .1s 75ms}.chat-input-container.is-centering.animating .btn-send{transition:transform .2s}.chat-input-container.is-centering.animating:not(.backwards) .rows-wrapper .bubble-tail{transition:transform .1s,opacity 25ms 75ms}.chat-input .menu-send{bottom:calc(100% + .5rem);top:auto}.chat-input .input-message-input{--custom-emoji-size:var(--messages-custom-emoji-size);background:none;border:none;font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);margin-top:-1px;max-height:27.5rem;outline:none;overflow-y:none;padding:.5rem .5625rem;resize:none;width:100%}.chat-input .input-message-input pre{display:inline;margin:0}body.animation-level-2 .chat-input .input-message-input{transition:height .1s}@media only screen and (max-height:30rem){.chat-input .input-message-input{max-height:max(36px,calc(100vh - 10rem))}}@media only screen and (max-width:600px){.chat-input .input-message-input{max-height:10rem}}.chat-input .input-message-input[data-inline-placeholder]:after{color:#a2acb4;content:attr(data-inline-placeholder);pointer-events:none}.chat-input .toggle-emoticons:before{content:\"\"}.chat-input .toggle-emoticons.flip-icon:before{content:\"\"!important}[dir=ltr] .chat-input .btn-record-cancel{right:0}[dir=rtl] .chat-input .btn-record-cancel{left:0}.chat-input .btn-record-cancel{--multiplier:-1;opacity:0;padding:0;position:absolute;top:0;transform:translateX(calc((100% + var(--padding-horizontal) + .5rem)*var(--multiplier)));visibility:hidden;z-index:3}.chat-input .btn-record-cancel .c-ripple__circle,html.no-touch .chat-input .btn-record-cancel:active:after,html.no-touch .chat-input .btn-record-cancel:hover:after{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.chat-input .btn-record-cancel:before{color:#df3f40;color:var(--danger-color)}.is-rtl .chat-input .btn-record-cancel{--multiplier:1}[dir=ltr] .chat-input .btn-scheduled:after{right:5px}[dir=rtl] .chat-input .btn-scheduled:after{left:5px}.chat-input .btn-scheduled:after{background:#61c642;background:var(--message-checkbox-color);border-radius:50%;content:\"\";height:.5rem;position:absolute;top:5px;width:.5rem}.chat-input .btn-preloader .preloader{height:1.5rem;width:1.5rem}.chat-input .btn-preloader .preloader .preloader-path{stroke:#707579;stroke:var(--secondary-text-color)}body.animation-level-2 .chat-input .btn-preloader.show.backwards{animation:hide-icon .4s ease-in-out forwards!important}[dir=ltr] .chat-input .float{margin-right:.75rem!important}[dir=rtl] .chat-input .float{margin-left:.75rem!important}.chat-input .float{display:none!important;margin:0!important}.chat-input .float{align-self:center}body.animation-level-2 .chat-input .float{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-height:569px),only screen and (max-width:600px){[dir=ltr] .chat-input .float{margin-right:.125rem!important}[dir=rtl] .chat-input .float{margin-left:.125rem!important}}.chat-input:not(.is-recording) .float.show:not(.hide){display:flex!important}[dir=ltr] .chat-input .btn-send-container{right:var(--padding-horizontal)}[dir=rtl] .chat-input .btn-send-container{left:var(--padding-horizontal)}.chat-input .btn-send-container{align-items:center;bottom:0;display:flex;justify-content:center;padding-bottom:inherit;position:absolute}.chat-input .btn-send-container .btn-menu-overlay{z-index:3}.chat-input .btn-icon{transition:opacity .2s}body.animation-level-0 .chat-input .btn-icon{transition:none}.chat-input .btn-cancel-record,.chat-input .btn-send{box-shadow:0 1px 8px 1px rgba(0,0,0,.12)}.chat-input .btn-send{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important}.chat-input .btn-send{z-index:3}html.no-touch .chat-input .btn-send:active,html.no-touch .chat-input .btn-send:hover{background-color:#2086ea!important;background-color:var(--dark-primary-color)!important}.chat-input .btn-send .tgico-check{height:32px!important}.chat-input .btn-send .tgico-check{font-size:2rem}.chat-input .btn-send .tgico-check:before{font-weight:500;font-weight:var(--font-weight-bold)}.chat-input .btn-send.edit .tgico-check,.chat-input .btn-send.record .tgico-microphone_filled,.chat-input .btn-send.schedule .tgico-schedule,.chat-input .btn-send.send .tgico-send{visibility:visible!important}body.animation-level-2 .chat-input .btn-send.edit .tgico-check,body.animation-level-2 .chat-input .btn-send.record .tgico-microphone_filled,body.animation-level-2 .chat-input .btn-send.schedule .tgico-schedule,body.animation-level-2 .chat-input .btn-send.send .tgico-send{animation:grow-icon .4s ease-in-out forwards!important}.chat-input .btn-record-cancel,.chat-input .btn-send{font-size:1.5rem;line-height:1.5rem}.chat-input .record-time{display:none;height:44px;line-height:44px}.chat-input .record-time:after{background-color:#df3f40;background-color:var(--danger-color);border-radius:50%;content:\" \";display:inline-block;height:10px;margin-left:9px;margin-right:9px;width:10px}body.animation-level-2 .chat-input .record-time:after{animation:recordBlink 1.25s infinite}.chat-input .record-ripple{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;height:300px;opacity:.5;position:absolute;transform:scale(0);visibility:hidden;width:300px}@media only screen and (max-width:600px){.chat-input .record-ripple{height:240px;width:240px}}.chat-input.is-locked{pointer-events:none}.chat-input.is-locked .btn-icon,.chat-input.is-locked:not(.is-recording) .btn-send{color:#c6cbce}.chat-input.is-recording:not(.backwards) .btn-record-cancel{opacity:1;visibility:visible}.chat-input.is-recording:not(.backwards) .btn-record-cancel,.chat-input.is-recording:not(.backwards) .btn-send{pointer-events:all}.chat-input.is-recording:not(.backwards) .record-ripple{visibility:visible}.chat-input.is-recording:not(.backwards) .rows-wrapper{width:calc(100% - var(--chat-input-size)*2 - 1rem)}.chat-input.is-recording:not(.backwards) .attach-file{display:none}.chat-input.is-recording:not(.backwards) .record-time{display:block}.chat-input.is-recording.animating .btn-record-cancel{transition:visibility 0s .1s,opacity .1s 0s}.chat-input.is-recording.animating .record-ripple{transition:transform .03s ease-in-out,visibility .1s}.chat-input.is-recording.animating .rows-wrapper{transition:width .2s}.chat-input.is-recording.animating:not(.backwards) .btn-record-cancel{transition:visibility 0s .1s,opacity .1s .1s}.chat-input.is-recording.animating:not(.backwards) .record-ripple{transition:transform .03s,visibility 0s}[dir=ltr] .chat-input:not(.is-recording) .btn-record-cancel{margin-right:0}[dir=rtl] .chat-input:not(.is-recording) .btn-record-cancel{margin-left:0}.chat-input:not(.is-recording) .btn-record-cancel{width:0}.chat-input .new-message-wrapper{opacity:1}.chat-input .reply-in-topic-overlay{align-items:center;background-color:inherit;border-radius:inherit;color:#707579;color:var(--secondary-text-color);display:flex;justify-content:center;padding:0 1rem;pointer-events:none;z-index:3}.bubbles.is-selecting:not(.backwards)~.chat-input .selection-wrapper{opacity:1}.bubbles.is-selecting.animating~.chat-input .new-message-wrapper{transition:opacity .1s 0s}.bubbles.is-selecting.animating~.chat-input .selection-container-left,.bubbles.is-selecting.animating~.chat-input .selection-container-right{transition:transform .2s}.bubbles.is-selecting.animating.backwards~.chat-input .new-message-wrapper{transition:opacity .1s .1s}.bubbles.is-selecting.animating.backwards~.chat-input .selection-wrapper{transition:opacity .1s 0s}@keyframes recordBlink{0%{opacity:1}50%{opacity:.2}to{opacity:1}}#column-center{flex:3;position:relative;width:100%}@media only screen and (max-width:600px){body.is-left-column-shown #column-center{transform:translate3d(100vw,0,0)}body.is-right-column-shown #column-center{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px)and (max-width:925px){#column-center{position:fixed!important}#column-center{bottom:0;left:0;right:0;top:0;transform:translateZ(0)}body.animation-level-2 #column-center{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}body.is-left-column-shown #column-center{transform:translate3d(26.5625rem,0,0)}body.is-left-column-shown #column-center .sidebar-close-button{transform:rotate(180deg)}}.chats-container{height:100%}.chat{display:flex!important}.chat{align-items:center;flex-direction:column;transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition);width:100%}body.animation-level-0 .chat{transition:none!important}.chat:not(.active):not(:last-child){filter:brightness(.8)}@media only screen and (min-width:926px){.chat:not(.active){transform:translate3d(calc((100vw - min(40vw, 420px))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(100vw - min(40vw, 420px)),0,0)}}@media only screen and (min-width:1681px){.chat:not(.active){transform:translate3d(calc((1680px - var(--right-column-width))*-.25),0,0)}.chat:not(.active):last-child{transform:translate3d(calc(1680px - var(--right-column-width)),0,0)}}@media only screen and (min-width:1276px)and (max-width:1680px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(75vw,0,0)}}@media only screen and (max-width:925px){.chat:not(.active){transform:translate3d(-25vw,0,0)}.chat:not(.active):last-child{transform:translate3d(100vw,0,0)}}.chat.no-forwards .bubble-beside-button.forward{display:none}.chat.no-forwards .bubbles{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.chat-background{background-color:#e6ebee;overflow:hidden}html.night .chat-background{background-color:#dfe1e5;background-color:var(--border-color)}.chat-background.no-transition:before{transition:none!important}.chat-background,.chat-background-item{position:absolute!important}.chat-background,.chat-background-item{bottom:0;left:0;right:0;top:0}.chat-background-item.is-image{background-color:inherit;background-image:url(assets/img/bg.jpeg);background-position:50%;background-size:cover}.chat-background-item.is-pattern{background-color:#000!important;background-image:none!important;margin:0!important}.chat-background-item.is-pattern{align-items:center;background-repeat:repeat-x;background-size:contain;display:flex;justify-content:center}@media only screen and (min-width:1276px){.chat-background-item.is-pattern{height:150%;top:-25%}}body.animation-level-2 .chat-background-item{opacity:0;transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}body.animation-level-2 .chat-background-item.is-visible:not(.backwards){opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}@media only screen and (min-width:1276px){body.animation-level-2 .chat-background-item{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-out),opacity var(--transition-standard-out)!important}body.animation-level-2 .chat-background-item{margin:-18.5rem 0 -22rem;transform:scale(1);transform-origin:left center}body.animation-level-2.is-right-column-shown .chat-background-item{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1)!important;transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)!important}body.animation-level-2.is-right-column-shown .chat-background-item{transform:scale(.666666667)}}.chat-background-item-canvas{--opacity-max:1;opacity:var(--opacity-max);position:absolute;width:100%}.chat-background-item:not(.is-dark) .chat-background-item-pattern-canvas{mix-blend-mode:soft-light}.chat-background-item-color-canvas{height:100%;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:cover;mask-size:cover}.chat .drops-container{--padding:20px;--pinned-floating-height:0px;top:calc(56px + var(--pinned-floating-height) + var(--padding))}@media only screen and (min-width:1276px){[dir=ltr] body.is-right-column-shown .chat .drops-container{right:calc(var(--right-column-width))}[dir=rtl] body.is-right-column-shown .chat .drops-container{left:calc(var(--right-column-width))}}@media only screen and (max-width:600px){.chat .drops-container{--padding:10px}}.chat .drop{--wrapper-padding:15px;max-width:696px}.chat[data-type=chat] .bubbles.is-chat-input-hidden .bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:1.25rem}.chat-input-wrapper{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);--button-size:2.125rem;--button-horizontal-margin:.125rem;align-items:center;border-radius:1rem;display:flex;flex:0 0 auto;flex-direction:column;justify-content:center;max-height:30rem;max-width:calc(100% - var(--chat-input-size) - .5rem);min-height:var(--chat-input-size);position:relative;width:calc(100% - var(--chat-input-size) - .5rem);z-index:3}.chat-input-wrapper:before{border-radius:inherit;bottom:0;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);content:\" \";left:0;opacity:1;right:0;top:0}.chat-input-control,.chat-input-wrapper:before{background-color:#fff;background-color:var(--surface-color);position:absolute}.chat-input-control{--padding-vertical:.3125rem;--padding-horizontal:var(--chat-input-inner-padding);--padding:var(--padding-vertical) var(--padding-horizontal);height:var(--chat-input-size);margin:0 auto;padding:var(--padding);visibility:hidden;width:auto;z-index:3}.chat-input-control:before{opacity:0}.chat-input-control-button{height:2.5rem;justify-content:center;padding:0 .625rem}@media only screen and (max-width:600px){.chat-input-control-button{font-size:15px}}[dir=ltr] .chat-input-control-button:before{margin-right:10px}[dir=rtl] .chat-input-control-button:before{margin-left:10px}.fake-selection-wrapper,.selection-wrapper{max-width:calc(100% - var(--chat-input-padding)*2);position:absolute;top:0;width:28.75rem}.chat-input-control,.selection-wrapper{opacity:0}.selection-wrapper{background-color:#fff;background-color:var(--surface-color)}.selection-wrapper:before{content:none}.selection-wrapper .selection-container{align-items:center;border-radius:inherit;display:flex;font-size:15px;height:100%;justify-content:space-between;padding:inherit;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.selection-wrapper .selection-container-left,.selection-wrapper .selection-container-right{align-items:center;display:flex;justify-content:space-between;transform:translateX(0)}.selection-wrapper .selection-container-right{flex:0 0 auto}.selection-wrapper .selection-container-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);text-transform:capitalize;white-space:nowrap}[dir=ltr] .selection-wrapper .selection-container .btn-icon{margin-left:6px;margin-right:5px}[dir=rtl] .selection-wrapper .selection-container .btn-icon{margin-left:5px;margin-right:6px}.selection-wrapper .selection-container .btn-icon{height:42px;line-height:42px;width:42px}.selection-wrapper .selection-container .btn-primary{height:2.5rem;width:auto}@media only screen and (max-width:600px){.selection-wrapper .selection-container .btn-primary{padding:0 .5rem}.selection-wrapper .selection-container .btn-primary.tgico-send2{padding:0 2px}}@media only screen and (max-width:380px){.selection-wrapper .selection-container .btn-primary{font-size:0}.selection-wrapper .selection-container .btn-primary:before{margin:0}}[dir=ltr] .selection-wrapper .selection-container-forward:before{margin-right:14px}[dir=rtl] .selection-wrapper .selection-container-forward:before{margin-left:14px}[dir=ltr] .selection-wrapper .selection-container-delete{margin-left:.375rem;margin-right:.625rem}[dir=rtl] .selection-wrapper .selection-container-delete{margin-left:.625rem;margin-right:.375rem}[dir=ltr] .selection-wrapper .selection-container-delete:before{margin-right:10px}[dir=rtl] .selection-wrapper .selection-container-delete:before{margin-left:10px}.fake-wrapper{position:absolute;visibility:hidden;z-index:-1}[dir=ltr] .fake-rows-wrapper{left:var(--padding-horizontal)}[dir=rtl] .fake-rows-wrapper{right:var(--padding-horizontal)}.fake-rows-wrapper{top:0;width:calc(100% - var(--chat-input-size) - var(--padding-horizontal)*2 - .5rem)}.rows-wrapper-wrapper{display:flex;width:100%}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards) .rows-wrapper:before{opacity:0}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control{opacity:1;visibility:visible}.rows-wrapper-wrapper.is-centering-to-control:not(.backwards)~.chat-input-control:before{opacity:1}.rows-wrapper-wrapper.is-centering-to-control.animating .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control:before{transition:opacity .05s .15s}.rows-wrapper-wrapper.is-centering-to-control.animating~.chat-input-control{transition:opacity .1s 75ms,visibility 0s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards .rows-wrapper:before,.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control:before{transition:opacity .05s 0s}.rows-wrapper-wrapper.is-centering-to-control.animating.backwards~.chat-input-control{transition:opacity .1s 0s,visibility 0s .2s}[dir=ltr] .rows-wrapper{border-bottom-right-radius:0}[dir=rtl] .rows-wrapper{border-bottom-left-radius:0}.rows-wrapper{transform:translateX(0) scaleX(1)}.rows-wrapper .bubble-tail{opacity:1}@media only screen and (max-width:600px){.rows-wrapper{--padding-vertical:1px}}@media only screen and (max-width:420px){.rows-wrapper{max-width:100%}}@media only screen and (max-height:569px){.rows-wrapper{--padding-vertical:1px}}[dir=ltr] .rows-wrapper .bubble-tail{right:-8.4px}[dir=rtl] .rows-wrapper .bubble-tail{left:-8.4px}.rows-wrapper .bubble-tail{fill:#fff;fill:var(--surface-color);bottom:-1px;height:20px;position:absolute;transform:scaleX(-1);width:11px}.is-rtl .rows-wrapper .bubble-tail{transform:scaleX(1)}.rows-wrapper .attach-file.menu-open{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important}.rows-wrapper .attach-file.menu-open{color:#3390ec;color:var(--primary-color)}.rows-wrapper .attach-file.btn-disabled{opacity:.3;opacity:var(--disabled-opacity)}.rows-wrapper>div{align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:1rem;display:flex;justify-content:space-between;padding:var(--padding);position:relative;width:100%}.rows-wrapper .reply-wrapper{align-items:center;height:0;justify-content:flex-start;margin-bottom:-.5625rem;opacity:0;padding:.5625rem var(--padding-horizontal) 0;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}body.animation-level-2 .rows-wrapper .reply-wrapper{transition:height .15s ease-out,opacity .15s ease-out}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .reply-wrapper{margin-bottom:-.3125rem;padding-top:.3125rem}}.chat.is-helper-active .rows-wrapper .reply-wrapper{height:45px;opacity:1;pointer-events:inherit}.rows-wrapper .reply-wrapper .reply{flex:1 1 auto;margin-left:.625rem;margin-right:.625rem;order:1}.rows-wrapper .reply-wrapper .reply-icon{order:0;pointer-events:none}.rows-wrapper .reply-wrapper .reply-cancel{order:2}.rows-wrapper .reply-wrapper .reply-subtitle{color:#707579!important;color:var(--secondary-text-color)!important}.rows-wrapper .reply-wrapper .reply-subtitle{height:1.125rem}.rows-wrapper .reply-wrapper .reply .peer-title{font-weight:400}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:3.125rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:3.125rem}.rows-wrapper .reply-wrapper .btn-menu{transform:scale(1)!important}.rows-wrapper .reply-wrapper .btn-menu{bottom:calc(100% + .5rem);top:auto}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item{padding-right:1.5rem}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item{padding-left:1.5rem}.rows-wrapper .reply-wrapper .btn-menu-item-text{order:1}[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-right:var(--icon-margin)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{margin-left:var(--icon-margin)}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-field{--size:1.25rem;margin:0;order:0}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-background,.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-border{display:none}.rows-wrapper .reply-wrapper .btn-menu-item .checkbox-box-check use{stroke:#000;stroke:var(--primary-text-color)}@media only screen and (max-width:600px){[dir=ltr] .rows-wrapper .reply-wrapper .btn-menu{left:calc(var(--padding-horizontal)*-1)}[dir=rtl] .rows-wrapper .reply-wrapper .btn-menu{right:calc(var(--padding-horizontal)*-1)}}.rows-wrapper .new-message-wrapper{--send-as-size:1.875rem;--send-as-margin-left:.25rem;--send-as-margin-right:.375rem;--send-as-total-size:calc(var(--send-as-size) + var(--send-as-margin-left) + var(--send-as-margin-right));--commands-size:2.375rem;--commands-margin-left:.25rem;--commands-margin-right:.375rem;--commands-total-size:calc(var(--commands-size) + var(--commands-margin-left) + var(--commands-margin-right));--offset-translateX:0px;align-items:flex-end;min-height:var(--chat-input-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands,.rows-wrapper .new-message-wrapper .new-message-send-as-container{bottom:calc(var(--padding-vertical) + .4375rem);cursor:pointer;flex:0 0 auto;opacity:0;position:absolute;transform:scale(0);z-index:2}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-left:var(--commands-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-bot-commands{margin-right:var(--commands-margin-left)}.rows-wrapper .new-message-wrapper .new-message-bot-commands{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:1.875rem;cursor:pointer;display:flex;height:1.875rem;justify-content:center;width:var(--commands-size)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{position:relative}.rows-wrapper .new-message-wrapper .new-message-bot-commands-icon-scale{align-items:center;display:flex;justify-content:center;transform:scale(.875)}.rows-wrapper .new-message-wrapper .new-message-bot-commands .animated-menu-close-icon{--color:#fff}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-left:var(--send-as-margin-left)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container{margin-right:var(--send-as-margin-left)}.rows-wrapper .new-message-wrapper .new-message-send-as-container{background:none!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container{height:var(--send-as-size);width:var(--send-as-size)}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:auto}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:auto}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{left:calc(var(--padding-horizontal)*-1 - .25rem)!important}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{right:calc(var(--padding-horizontal)*-1 - .25rem)!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu{height:auto;max-height:20rem;max-width:20rem;top:auto;transform:scaleX(1);width:auto}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item{height:2.25rem}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-header{height:1.875rem}[dir=ltr] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-right:calc(var(--icon-margin) - .5rem)}[dir=rtl] .rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon{margin-left:calc(var(--icon-margin) - .5rem)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-icon.active:before{--offset:-.125rem;border:.0625rem solid #3390ec;border:.0625rem solid var(--primary-color);border-radius:inherit;bottom:var(--offset);content:\" \";left:var(--offset);position:absolute;right:var(--offset);top:var(--offset)}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{line-height:1!important}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-text{display:flex;flex-direction:column;justify-content:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rows-wrapper .new-message-wrapper .new-message-send-as-container .btn-menu-item-subtitle{font-size:.8125rem;font-weight:400}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar{opacity:0;pointer-events:none;position:absolute;transform:scale(0)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible:not(.backwards){opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper .new-message-send-as-avatar.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .new-message-send-as-close{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;color:#fff;display:flex;font-size:1.375rem;height:inherit;justify-content:center;width:inherit;z-index:1}.rows-wrapper .new-message-wrapper.has-offset[data-offset=as]{--offset-translateX:var(--send-as-total-size)}.rows-wrapper .new-message-wrapper.has-offset[data-offset=commands]{--offset-translateX:48px}.rows-wrapper .new-message-wrapper.has-offset .input-message-container,.rows-wrapper .new-message-wrapper.has-offset .toggle-emoticons{transform:translateX(0)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .toggle-emoticons{transform:translateX(var(--offset-translateX))}[dir=ltr] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-right:var(--translateX)}[dir=rtl] .rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{margin-left:var(--translateX)}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .input-message-container{--translateX:calc(var(--offset-translateX));transform:translate(var(--translateX))}.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset:not(.backwards) .new-message-send-as-container{opacity:1;transform:scale(1)}.rows-wrapper .new-message-wrapper.has-offset.animating .input-message-container,.rows-wrapper .new-message-wrapper.has-offset.animating .toggle-emoticons{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-bot-commands,.rows-wrapper .new-message-wrapper.has-offset.animating .new-message-send-as-container{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + 1.125rem)}@media only screen and (max-height:569px),only screen and (max-width:600px){.rows-wrapper .new-message-wrapper .btn-menu{bottom:calc(100% + .875rem)}}.rows-wrapper .new-message-wrapper .btn-menu.top-left{right:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .new-message-wrapper .btn-menu.top-right{left:calc(var(--padding-horizontal)*-1 - .125rem)}.rows-wrapper .input-message-container{align-items:center;align-self:center;display:flex;flex:1 1 auto;max-height:inherit;min-height:calc(var(--chat-input-size) - var(--padding-vertical)*2);overflow:hidden;position:relative;width:1%}.rows-wrapper .input-message-container>.scrollable{position:relative}.rows-wrapper .btn-icon{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:1.5rem;height:var(--button-size);margin-bottom:5px;margin-left:var(--button-horizontal-margin);margin-right:var(--button-horizontal-margin);margin-top:0;padding:0;width:var(--button-size)}.rows-wrapper .btn-icon.active{color:#3390ec;color:var(--primary-color)}.bubbles{--translateY:0;flex:1 1 auto;position:relative;transform:translate3d(0,var(--translateY),0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles{transition:none!important}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-78px;transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}@media only screen and (max-width:600px){.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards){--translateY:-58px}}.chat[data-type=chat] .bubbles.is-chat-input-hidden.is-selecting:not(.backwards) .bubbles-inner{transform:translateY(calc(var(--translateY)*-1));transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles>.scrollable{display:block;height:auto}@media only screen and (min-width:1276px){body.is-right-column-shown .bubbles{transform:translate3d(calc(var(--right-column-width)/-2),var(--translateY),0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}}body.animation-level-2 .bubbles.is-selecting .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting .is-in .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.animation-level-2 .bubbles.is-selecting:not(.backwards) .bubbles-group-avatar,body.animation-level-2 .bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubbles.is-selecting:not(.backwards) .is-in .bubble-content-wrapper{transform:translateX(2.5rem) scale(1)}.bubbles.is-selecting:not(.backwards) .bubbles-group-avatar{transform:translate3d(2.5rem,0,0) scale3d(.76,.76,1)}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{cursor:pointer;opacity:1;visibility:visible}body.animation-level-2 .bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-down{transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:opacity var(--layer-transition),visibility 0s 0s!important}.bubbles:not(.scrolled-down):not(.search-results-active)+.chat-input .bubbles-go-mention{--translateY:calc(var(--chat-input-size)*-1 - 0.625rem)}.bubbles .search-group.search-group-messages{padding:.25rem 0 .5rem}.bubbles-inner{display:flex;flex-direction:column;justify-content:flex-end;margin:0 auto;max-width:728px;max-width:var(--messages-container-width);min-height:100%;padding:0 .8125rem;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:100%}body.animation-level-0 .bubbles-inner{transition:none!important}@media only screen and (min-width:1276px){.bubbles-inner{width:calc(100% - var(--right-column-width))}}@media only screen and (max-width:600px){.bubbles-inner{padding:0 .5rem}}.bubbles-inner:after{content:\" \";height:.125rem}[dir=ltr] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-left:45px}[dir=rtl] .bubbles-inner.is-chat .is-in .bubble-content-wrapper{margin-right:45px}@media only screen and (max-width:600px){.bubbles-inner.is-chat .is-in .bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubbles-inner.is-channel:not(.is-chat) .bubble-content-wrapper{max-width:100%}.bubbles-inner.is-channel:not(.is-chat) .bubble.with-beside-button .bubble-content-wrapper{max-width:calc(100% - 2.875rem)!important;max-width:calc(100% - var(--message-beside-button-margin)*-1)!important}.bubbles-inner.is-chat .message,.bubbles-inner.is-chat .name,.bubbles-inner:not(.is-channel) .message,.bubbles-inner:not(.is-channel) .name{max-width:480px}.bubbles-inner.is-scrolling .is-sticky{opacity:.99999!important}html.is-safari .bubbles-inner.is-scrolling .is-sticky{transform:translateY(calc(var(--translateY)*-1))}body.animation-level-2 html.is-safari .bubbles-inner.is-scrolling .is-sticky{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.bubbles-inner>.bubble.is-in{width:100%}@media only screen and (min-width:1276px){.bubbles-inner>.bubble.is-in .bubble-content-wrapper{max-width:85%}}.bubbles-go-down{transform:none!important;transition:opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-down{cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s .2s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s .2s!important}.bubbles-go-mention{--translateY:0;cursor:default;opacity:0;visibility:hidden}.bubbles-go-mention.is-visible{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1),visibility 0s 0s!important;transition:transform var(--layer-transition),opacity var(--layer-transition),visibility 0s 0s!important}.bubbles-go-mention.is-visible{cursor:pointer;opacity:1;visibility:visible}.chat-secondary-button{background-color:#fff!important;background-color:var(--surface-color)!important;box-shadow:0 1px 8px 1px rgba(0,0,0,.12)!important}.chat-secondary-button{align-items:center;border-radius:50%;color:#707579;color:var(--secondary-text-color);display:flex;font-size:1.5rem;justify-content:center;position:absolute}body.animation-level-0 .chat-secondary-button{transition:none!important}.chat-secondary-button:before{position:relative}.chat-secondary-button:after{border-radius:inherit;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}html.no-touch .chat-secondary-button:active:after,html.no-touch .chat-secondary-button:hover:after{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}[dir=ltr] .bubbles-corner-button{right:var(--chat-input-padding)}[dir=rtl] .bubbles-corner-button{left:var(--chat-input-padding)}.bubbles-corner-button{bottom:calc(var(--chat-input-size) + var(--bottom) + 10px);overflow:visible;z-index:2}[dir=ltr] .bubbles-corner-button .badge{right:-.25rem}[dir=rtl] .bubbles-corner-button .badge{left:-.25rem}.bubbles-corner-button .badge{position:absolute;top:-.25rem}.bubbles-corner-button .badge.badge-primary:not(.badge-gray){background-color:#0ac630;background-color:var(--chatlist-status-color)}@media only screen and (max-width:600px){[dir=ltr] .bubbles-corner-button .badge{right:.1875rem}[dir=rtl] .bubbles-corner-button .badge{left:.1875rem}.bubbles-corner-button .badge{top:-.75rem}}.popup.popup-delete-message .popup-header{margin-bottom:1rem}body.is-calling .topbar,body.is-calling .topbar-call-container{transform:translateY(0)}body.is-calling.animation-level-2 .topbar,body.is-calling.animation-level-2 .topbar-call-container{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-calling:not(.backwards) .topbar,body.is-calling:not(.backwards) .topbar-call-container{transform:translateY(3rem);transform:translateY(var(--topbar-call-height))}body.is-calling:not(.backwards):not(.animating){--topbar-floating-call-height:var(--topbar-call-height)}@media only screen and (min-width:1276px){body.is-right-column-shown{--topbar-floating-scaleX:calc(1 - var(--right-column-proportion))}}.topbar{cursor:pointer!important;max-height:var(--topbar-height)!important;min-height:var(--topbar-height)!important}.topbar{--topbar-height:3.5rem;--pinned-floating-audio-height:0px;--pinned-floating-message-height:0px;--pinned-floating-height:calc(var(--pinned-floating-audio-height) + var(--pinned-floating-message-height) + var(--topbar-floating-call-height));--pinned-audio-height:52px;--pinned-message-height:52px;margin-bottom:var(--pinned-floating-height);position:relative;width:100%;z-index:1}.topbar:before{box-shadow:0 1px 5px -1px rgba(0,0,0,.21);content:\" \";height:calc(var(--topbar-height) + var(--pinned-floating-height));height:calc(var(--topbar-height) + var(--pinned-floating-height) - var(--topbar-floating-call-height));left:0;pointer-events:none;position:absolute;right:0;top:0}.topbar.is-pinned-audio-floating{--pinned-floating-audio-height:var(--pinned-audio-height)}.topbar.is-pinned-message-floating{--pinned-floating-message-height:var(--pinned-message-height)}.topbar:not(.is-pinned-message-floating) .chat-utils{position:relative;z-index:1}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message{top:calc(var(--topbar-height) + var(--pinned-audio-height))}.topbar.is-pinned-audio-floating.is-pinned-message-floating .pinned-message:before{border-top:none}@media only screen and (min-width:601px){.topbar .menu-search{display:none}.topbar.is-pinned-message-shown:not(.hide-pinned) .pinned-message{display:flex}}@media only screen and (min-width:926px){.chat:first-child .topbar .sidebar-close-button{display:none}[dir=ltr] .chat:first-child .topbar .chat-info{padding-left:.1875rem}[dir=rtl] .chat:first-child .topbar .chat-info{padding-right:.1875rem}}@media only screen and (min-width:1276px){.topbar .pinned-container-wrapper-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .pinned-container-wrapper-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .pinned-container-wrapper-utils{transition:none}}.topbar .sidebar-close-button{position:absolute}.topbar .user-title{align-items:center;display:flex;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.5rem;max-width:calc(100% - 1.5rem)}.topbar .user-title span.emoji{vertical-align:inherit}.topbar .info,.topbar .peer-title{line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar .info:not(:empty){margin-top:1px}.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 4.375rem);max-height:calc(var(--vh)*100 - 4.375rem);top:calc(100% + 7px)}@media only screen and (max-width:600px){.topbar .btn-menu-toggle .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);top:29px}.topbar .btn-menu-toggle{margin-left:0}}[dir=ltr] .topbar .chat-info{padding-left:49px}[dir=rtl] .topbar .chat-info{padding-right:49px}.topbar .chat-info{flex:1 1 auto;max-width:calc(100% - var(--utils-width));overflow:hidden}@media only screen and (max-width:600px){[dir=ltr] .topbar .chat-info{padding-left:52px}[dir=rtl] .topbar .chat-info{padding-right:52px}}@media only screen and (min-width:1276px){body.is-right-column-shown .topbar .chat-info{max-width:calc(100% - var(--right-column-width) - var(--utils-width))}}.topbar .chat-info-container{align-items:center;display:flex;flex:1 1 auto;height:3.5rem;justify-content:space-between;max-height:3.5rem;max-width:100%}.topbar .chat-utils{align-items:center;display:flex;flex:0 0 auto}@media only screen and (min-width:1276px){.topbar .chat-utils{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar .chat-utils{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar .chat-utils{transition:none}}@media only screen and (max-width:600px){.topbar .chat-utils>.btn-icon:not(.btn-menu-toggle){display:none}}[dir=ltr] .topbar .chat-join{margin-right:.5rem}[dir=rtl] .topbar .chat-join{margin-left:.5rem}.topbar .chat-join{font-size:.875rem;font-weight:400;height:2.25rem;padding:0 1.375rem;width:auto}.topbar .chat-join:not(.hide)+.chat-mute-button{display:none}[dir=ltr] .topbar .content{padding-left:1.125rem}[dir=rtl] .topbar .content{padding-right:1.125rem}.topbar .content{flex:1 1 auto;max-width:100%;overflow:hidden}.topbar .person{align-items:center;display:flex}.topbar .person-avatar{flex:0 0 auto}.topbar .person .bottom{color:#707579;color:var(--secondary-text-color);font-size:.875rem}.topbar .person .bottom .online{color:#3390ec;color:var(--primary-color)}.topbar.hide-pinned{--pinned-floating-height:0px}.topbar.hide-pinned .pinned-container{display:none}.topbar.hide-pinned+.bubbles .bubbles-inner{margin-bottom:.25rem}[dir=ltr] .chat:not([data-type=chat]) .topbar .content{padding-left:16px}[dir=rtl] .chat:not([data-type=chat]) .topbar .content{padding-right:16px}[dir=ltr] .topbar-call-container{left:1px;right:0}[dir=rtl] .topbar-call-container{left:0;right:1px}.topbar-call-container{cursor:pointer!important;height:3rem!important;height:var(--topbar-call-height)!important;min-height:auto!important}.topbar-call-container{color:#fff;position:absolute;top:-3rem;top:calc(var(--topbar-call-height)*-1);z-index:2}body:not(.has-chat) .topbar-call-container{background:none!important}@media only screen and (max-width:925px){[dir=ltr] .topbar-call-container{left:0}[dir=rtl] .topbar-call-container{right:0}}.topbar-call-container .btn-icon{color:inherit;flex:0 0 auto;height:2.5rem;padding:0;width:2.5rem}.topbar-call-container .peer-title{font-weight:500;font-weight:var(--font-weight-bold);white-space:nowrap}@media only screen and (max-width:480px){.topbar-call-container:not(.is-call) .topbar-call-left,.topbar-call-container:not(.is-call) .topbar-call-right{width:auto}.topbar-call-container:not(.is-call) .group-call-description{display:none}.topbar-call-container.is-call .topbar-call-left,.topbar-call-container.is-call .topbar-call-right{width:6.25rem}.topbar-call-container.is-call .call-description:not(.has-duration){display:none}}.topbar-call-left,.topbar-call-right{flex:0 0 auto;width:12rem}.topbar-call-left{align-items:center;display:flex}[dir=ltr] .topbar-call-left .btn-icon{margin-right:.375rem}[dir=rtl] .topbar-call-left .btn-icon{margin-left:.375rem}.topbar-call-left .call-description{white-space:nowrap}.topbar-call-left .call-description-duration{font-weight:500;font-weight:var(--font-weight-bold)}.topbar-call-center{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media only screen and (min-width:1276px){.topbar-call-center{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-center{transform:translate3d(calc(var(--right-column-width)*-.5),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-center{transition:none}.topbar-call-center{padding:0 calc(var(--right-column-width)/2)}}.topbar-call-right{display:flex;justify-content:flex-end}@media only screen and (min-width:1276px){.topbar-call-right{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-right{transform:translate3d(calc(var(--right-column-width)*-1),0,0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-right{transition:none}}.topbar-call-weave{bottom:-1.125rem;left:0;pointer-events:none;position:absolute;right:0;top:0;transform:scaleY(-1);transform:scale(var(--topbar-floating-scaleX),-1);transform-origin:left center;z-index:-1}.is-rtl .topbar-call-weave{transform-origin:right center}@media only screen and (min-width:1276px){.topbar-call-weave{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .topbar-call-weave{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .topbar-call-weave{transition:none}}.topbar-call-weave-canvas{height:100%;width:100%}@keyframes bubbleSelected{0%{opacity:0}25%{opacity:1}to{opacity:0}}.bubbles-date-group{position:relative}.bubbles-date-group .sticky_sentinel--top{height:.25rem;top:0}.bubbles-group{position:relative}.bubbles-group-avatar{position:sticky!important}.bubbles-group-avatar{bottom:.25rem;cursor:pointer;pointer-events:all;top:0}.bubbles.is-selecting .bubbles-group-avatar{transform:translateZ(0) scaleX(1);transform-origin:bottom}.bubbles-group-avatar-container{bottom:0;display:flex;flex-direction:column-reverse;left:0;pointer-events:none;position:absolute;right:0;top:0;z-index:2}.bubble{--line-height:var(--messages-line-height);display:flex;flex-wrap:wrap;margin:0 auto .125rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:1}.bubble.is-gesturing-reply{transform:translateX(0)}.bubble.is-gesturing-reply.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:50%;color:#fff;display:flex;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;opacity:0;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);top:50%;transform:translateY(-50%);transform:translateY(-50%) scale(.6);visibility:hidden;width:2.375rem;width:var(--message-beside-button-size)}.bubble.is-gesturing-reply .bubble-gesture-reply-icon:before{font-size:1.125rem!important}body.animation-level-2 .bubble.is-gesturing-reply .bubble-gesture-reply-icon{transition:transform .1s ease-in-out}.bubble.is-gesturing-reply .bubble-gesture-reply-icon.is-visible{transform:translateY(-50%) scale(1);visibility:visible}.bubble.is-highlighted:after,.bubble.is-selected:after,.bubble:after{bottom:-.0625rem;content:\" \";left:-50%;position:absolute;top:-.0625rem;z-index:-1}.bubble.is-highlighted:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-highlighted:after{animation:bubbleSelected 2s linear}@media only screen and (max-width:600px){.bubble.is-first-unread{max-width:none}}.bubble.is-first-unread:before{background-color:#fff;background-color:var(--surface-color);color:#3390ec;color:var(--primary-color);content:\"Unread messages\";font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);height:30px;line-height:2.1;margin-bottom:.25rem;margin-left:-50%;margin-right:-50%;position:relative;text-align:center;z-index:2}.bubble.is-first-unread.is-highlighted:after,.bubble.is-first-unread.is-selected:after{top:calc(.0625rem + 30px)}.bubble.is-selected:after{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-selected:after{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-selected.backwards:after{animation:fade-in-backwards-opacity .2s linear forwards}.bubble:after,.bubble:before{display:block;width:200%}.bubble.is-multiple-documents:after,.bubble.is-multiple-documents:before{display:none}.bubble.is-multiple-documents .user-avatar{z-index:2}.bubble .replies-footer+.poll-message .poll-footer-button{border-radius:0!important}.bubble-select-checkbox{display:flex;left:0;margin:0;position:absolute;z-index:3}.bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.bubble-select-checkbox .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.bubble-select-checkbox .checkbox-box-check use{stroke-width:3.5}.bubble>.bubble-select-checkbox{bottom:.3125rem}.bubble>.bubble-select-checkbox .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.bubbles.is-selecting .bubble:not(.is-album) .attachment,.bubbles.is-selecting .bubble:not(.is-album) .audio,.bubbles.is-selecting .bubble:not(.is-album) .document,.bubbles.is-selecting .bubble:not(.is-album) poll-element{pointer-events:none!important}.bubbles.is-selecting .bubble a,.bubbles.is-selecting .bubble img,.bubbles.is-selecting .bubble video{pointer-events:none}.bubble-content{background-color:#fff;background-color:var(--message-background-color);border-radius:12px;box-shadow:0 1px 2px 0 rgba(16,35,47,.15);display:flex;flex-direction:column-reverse;max-width:100%;min-width:56px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}body.animation-level-0 .bubble-content{transition:none}html.is-touch body:not(.no-select) .chat:not(.no-forwards) .bubbles.is-selecting .bubble-content,html.no-touch .chat:not(.no-forwards) .bubbles:not(.is-selecting) .bubble-content{-webkit-user-select:text;-moz-user-select:text;user-select:text}.bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button{transform:translateX(-1.125rem)}.bubble.is-out .bubble-content.hover-reaction-visible .bubble-beside-button.goto-original{transform:translateX(-1.125rem) rotate(180deg)}.bubble-hover-reaction{--size:1.875rem;--offset:calc(var(--size)*-0.75);align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:var(--size);bottom:0;box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);cursor:pointer;display:flex;height:1.625rem;justify-content:center;opacity:0;position:absolute;right:var(--offset);transform:scale(.8);width:var(--size);z-index:2}body.animation-level-2 .bubble-hover-reaction{transition:opacity .2s cubic-bezier(.34,1.56,.64,1),transform .2s cubic-bezier(.34,1.56,.64,1);transition:opacity var(--btn-corner-transition),transform var(--btn-corner-transition)}.bubble-hover-reaction.is-visible:not(.backwards){opacity:1;transform:scale(1)}.bubble-hover-reaction-sticker{height:1.125rem;position:relative;width:1.125rem}.bubble.service{max-width:728px;max-width:var(--messages-container-width)}.bubble.service .bubble-content{box-shadow:none;margin:0 auto;max-width:100%}.bubble.is-date{font-weight:500;font-weight:var(--font-weight-bold);opacity:.99999;padding-bottom:.375rem;pointer-events:none;position:sticky;top:.25rem;transition:opacity .3s ease;z-index:2}.bubble.is-date:after,.bubble.is-date:before{display:none}body.animation-level-0 .bubble.is-date{transition:none}.bubble.is-date.is-sticky{opacity:.00001}.bubbles-inner:not(.is-scrolling) .bubble.is-date.is-sticky .bubble-content{cursor:default}.chat[data-type=chat] .bubble.is-date .bubble-content,.chat[data-type=discussion] .bubble.is-date .bubble-content{cursor:pointer;pointer-events:all}.bubbles:not(.has-sticky-dates) .bubble.is-date{visibility:hidden}.bubbles.has-sticky-dates .bubble.is-date.is-fake{display:none}.bubble.is-date.is-fake{opacity:1!important;transition:none!important;visibility:visible!important}.bubble.is-date.is-fake{left:50%;position:absolute;top:0;transform:translateX(-50%)}.bubble-beside-button{align-items:center;background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border-radius:50%;bottom:0;color:#fff;color:var(--badge-text-color);cursor:pointer;display:flex;font-size:1.5rem;height:2.375rem;height:var(--message-beside-button-size);justify-content:center;position:absolute;right:-2.875rem;right:var(--message-beside-button-margin);transform:translateX(0);width:2.375rem;width:var(--message-beside-button-size)}html.no-touch .bubble-beside-button{opacity:0}html.no-touch body.animation-level-2 .bubble-beside-button{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.bubble-view-button{text-decoration:none!important}.bubble-view-button{align-items:center;border:1px solid #3390ec;border:1px solid var(--message-primary-color);border-radius:6px;color:#3390ec;color:var(--message-primary-color);display:flex;height:2rem;justify-content:center;margin:0 .5625rem .5rem;width:auto}html.no-touch .bubble-view-button:active,html.no-touch .bubble-view-button:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble-view-button .c-ripple__circle{background-color:#3390ec;background-color:var(--message-primary-color);opacity:.08}.message .bubble-view-button{margin:.375rem 0 -.375rem;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.bubble-view-button+.reactions-block{margin-top:.375rem}html.no-touch .bubble:active .bubble-beside-button,html.no-touch .bubble:hover .bubble-beside-button{opacity:1}.bubble .forward{font-size:1.25rem}.bubble.is-group-last{margin-bottom:.5rem}.bubble.is-group-last:after{bottom:-.25rem}.bubbles-inner.is-chat .bubble.is-group-last.is-in>.bubble-select-checkbox{bottom:.1875rem}.bubble.is-group-first:after{top:-.25rem}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first) .name{display:none}.bubble:not(.forwarded):not(.must-have-name):not(.is-group-first):not(.is-message-empty):not(.is-reply) .message{padding-top:6px}.bubble:not(.is-group-last) .bubble-content-wrapper>.user-avatar{display:none}.bubble.photo .bubble-content,.bubble.video .bubble-content{width:-moz-min-content;width:min-content}.bubble.photo .web,.bubble.video .web{max-width:100%}.bubble.photo .message,.bubble.video .message{max-width:420px}.bubble.webpage .preview-with-document{margin-bottom:0!important}.bubble.webpage .preview-with-document{min-width:100%}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width:600px){.bubble.webpage .document{padding-left:44px}}.bubble.webpage .has-document{display:flex;flex-direction:column}.bubble.webpage .has-document .preview-resizer{order:1}.bubble .preview-resizer{display:flex}.bubble img.emoji{height:18px;vertical-align:bottom;width:18px}.bubble .thumbnail{position:absolute}.bubble .canvas-thumbnail{border-radius:inherit}.bubble .canvas-dots{z-index:1}.bubble.emoji-big{--emoji-size:1rem;font-size:0}.bubble.emoji-big .bubble-content{line-height:1}.bubble.emoji-big .attachment{border-radius:0!important}.bubble.emoji-big .attachment{--custom-emoji-size:var(--emoji-size)}.bubble.emoji-big .attachment img.emoji{height:var(--emoji-size);max-height:64px;max-width:64px;width:var(--emoji-size)}.bubble.emoji-big .attachment .custom-emoji,.bubble.emoji-big .attachment .emoji{display:inline-block}.bubble.emoji-big:not(.sticker) .attachment{max-height:-moz-fit-content!important;max-height:fit-content!important}.bubble.emoji-big:not(.sticker) .attachment{display:block;font-size:var(--emoji-size);padding-bottom:1.25rem;padding-top:.25rem;white-space:pre-wrap;word-break:break-word}.bubble.emoji-big:not(.sticker) .attachment span.emoji{height:auto;width:auto}.bubble.emoji-big:not(.sticker) .message{margin-top:-1.125rem}.bubble.emoji-big:not(.sticker) .bubble-content{max-width:min(420px,100%)}.bubble.just-media .bubble-content{background:none!important}.bubble.just-media .bubble-content{box-shadow:none}.bubble.just-media img{-o-object-fit:contain;object-fit:contain}.bubble.just-media.is-message-empty .message{background:rgba(109,141,65,.4);background:var(--message-highlightning-color)}.bubble.emoji-big:not(.sticker) .bubble-content,.bubble.sticker .bubble-content{align-self:flex-start}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{position:relative!important;right:0!important}.bubble.emoji-big:not(.sticker) .message,.bubble.sticker .message{margin-left:auto}.bubble.sticker .attachment{border-radius:0;position:absolute;z-index:1}.bubble.round .attachment{height:280px!important;height:var(--round-video-size)!important;max-height:280px!important;max-height:var(--round-video-size)!important;max-width:280px!important;max-width:var(--round-video-size)!important;width:280px!important;width:var(--round-video-size)!important}.bubble.round .media-photo,.bubble.round .media-video{border-radius:50%;pointer-events:none}.bubble:not(.is-message-empty) .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble:not(.emoji-big) .attachment{font-size:0}.bubble .attachment{border-radius:inherit;cursor:pointer;display:flex;justify-content:center;max-width:100%;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .attachment img,.bubble .attachment video{max-width:100%}.bubble .attachment .download{align-items:center;cursor:pointer;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.bubble .attachment .download span{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;font-size:23px;text-align:center}.bubble .attachment .download~.video-play,.bubble .attachment .preloader-container~.video-play{display:none}.bubble .media-container-aspecter{margin:0 auto;position:relative;z-index:1}.bubble .media-container-fitted{background-color:transparent!important}.bubble .media-container-fitted>.thumbnail{opacity:.8}.bubble .media-container-fitted>.thumbnail.fade-in{animation:thumbnail-fade-in-opacity .2s ease-in-out forwards}.bubble .preloader-container{z-index:2}.bubble:not(.sticker) .attachment{max-height:min(340px,100%);max-width:min(420px,100%);width:-moz-max-content;width:max-content}.bubble img:not(.emoji),.bubble video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}html.is-safari .bubble:not(.round) img:not(.emoji),html.is-safari .bubble:not(.round) video{border-radius:inherit}.bubble.is-album .attachment{max-height:none;max-width:min(451px,100%)}.bubble .album-item{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);cursor:pointer;max-width:100%;overflow:hidden;position:absolute}body.animation-level-0 .bubble .album-item{transition:none!important}.bubble .album-item img,.bubble .album-item video,.bubble .album-item-media{border-radius:inherit}body.animation-level-0 .bubble .album-item-media{transition:none!important}.bubble .album-item .bubble-select-checkbox{bottom:auto!important}.bubble .album-item .bubble-select-checkbox{left:auto;right:.5rem;top:.5rem}.bubble .album-item.is-selected{border-radius:0}.bubble .album-item.is-selected .album-item-media{transform:scale(1)}.bubble .album-item.is-selected.animating{transition:border-radius .25s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-out)}.bubble .album-item.is-selected.animating .album-item-media{transition:transform .25s cubic-bezier(.4,0,.2,1),border-radius .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),border-radius var(--transition-standard-out)}.bubble .album-item.is-selected:not(.backwards){transition:border-radius .3s cubic-bezier(.4,0,.2,1);transition:border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards) .album-item-media{transform:scale(.883333);transition:transform .3s cubic-bezier(.4,0,.2,1),border-radius .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),border-radius var(--transition-standard-in)}.bubble .album-item.is-selected:not(.backwards),.bubble .album-item.is-selected:not(.backwards) .album-item-media{border-radius:0}html.no-touch .bubble a:active,html.no-touch .bubble a:hover{text-decoration:underline}.bubble-first{align-items:center;justify-content:center;margin-top:.5rem;max-width:100%;order:-1}body.animation-level-0 .bubble-first{flex:1 1 auto}.bubble-first .attachment{pointer-events:none}.bubble-first .bubble-content-wrapper{max-width:100%}.bubble-first.empty-bubble-placeholder{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.bubble-first.empty-bubble-placeholder.has-description .service-msg{align-items:flex-start!important;padding:.75rem 1rem .875rem!important}.bubble-first.empty-bubble-placeholder.has-description .service-msg{flex-direction:column}.bubble-first.empty-bubble-placeholder.has-description .center{align-self:center}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-size:1rem!important}.bubble-first.empty-bubble-placeholder.has-description .empty-bubble-placeholder-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-first.empty-bubble-placeholder.has-description .bubble-content{border-radius:1.5rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line{color:#fff}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-line+.empty-bubble-placeholder-line{margin-top:.5rem}.bubble-first.empty-bubble-placeholder .tgico-check{font-size:1.25rem;margin-left:-.1875rem;margin-right:.25rem;vertical-align:bottom}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-list-bullet{margin-right:.3125rem}.bubbles.has-groups .bubble-first.empty-bubble-placeholder{pointer-events:none}.bubbles.has-groups .bubble-first.empty-bubble-placeholder .bubble-content-wrapper{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-group .empty-bubble-placeholder-list-item{margin-top:.4375rem!important}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .service-msg{max-width:232px}.bubble-first.empty-bubble-placeholder.empty-bubble-placeholder-greeting .empty-bubble-placeholder-subtitle{margin-top:.25rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{margin-top:.75rem!important}.bubble-first.empty-bubble-placeholder .empty-bubble-placeholder-sticker{cursor:pointer;height:200px;position:relative;width:200px}.bubble-first .time{display:none!important}.bubble-first:after,.bubble-first:before{display:none}.bubble .web{line-height:1.3125;line-height:var(--line-height);margin:.125rem 0 0;max-width:100%;overflow:hidden}.bubble .web+.time{display:block}.bubble .web .preview{border-radius:4px;cursor:pointer;max-height:min(340px,100%);max-width:min(420px,100%);overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:-moz-max-content;width:max-content}.bubble .web .preview img,.bubble .web .preview video{max-width:100%}.bubble .web .preview-resizer:first-child{margin:3px 0}.bubble .web .preview-resizer:first-child:last-child{margin-bottom:2px}.bubble .web .preview.is-round .media-photo,.bubble .web .preview.is-round .media-video{border-radius:50%}.bubble .web.no-text{margin-bottom:.75rem}.bubble .web .title:not(:first-child){margin-top:1px}.bubble .web .text,.bubble .web .title,.bubble .web .webpage-name{font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height)}.bubble .web .webpage-name{text-decoration:none}html.no-touch .bubble .web .webpage-name:active,html.no-touch .bubble .web .webpage-name:hover{text-decoration:underline}.bubble .web .text{margin-top:1px;word-break:break-word}.bubble .web .quote{display:flex;max-width:100%;overflow:hidden;width:100%}.bubble .web .quote-text{margin-left:-.625rem;max-width:100%;padding-left:.625rem;width:100%}.bubble .web .quote:before{background-color:#3390ec;background-color:var(--primary-color);border-radius:.125rem;content:\" \";flex:0 0 auto;margin:.1875rem .5rem .125rem 0;width:.125rem}.bubble .reply{--font-size:var(--messages-secondary-text-size)}.bubble .document-name{font-size:16px;font-size:var(--messages-text-size)}.bubble .document-size{font-size:14px;font-size:var(--messages-secondary-text-size)}.bubble.is-square-photo .bubble-content{width:-moz-fit-content;width:fit-content}.bubble.is-square-photo .web .webpage-name{margin-right:1rem}.bubble.is-square-photo .web .preview-resizer{float:right;height:3rem;margin:.1875rem 0 0 .625rem;width:3rem}.bubble.is-square-photo .web .preview{margin:0;max-height:min(3rem,100%);max-width:min(3rem,100%)}.bubble .reply{border-radius:.25rem;cursor:pointer;margin:0 .375rem .375rem;min-width:10rem;padding:.25rem;width:auto}.bubble .reply-media{top:.125rem}.bubble .reply-content{height:auto;max-width:calc(100% - 1.25rem);min-height:32px;overflow:hidden;position:absolute;text-overflow:ellipsis;white-space:nowrap}.bubble .message+.reply{margin-bottom:0}.bubble:not(.just-media) .reply{border-radius:6px}html.no-touch .bubble:not(.just-media) .reply:active,html.no-touch .bubble:not(.just-media) .reply:hover{background-color:#eff6fd;background-color:var(--light-filled-message-primary-color)}.bubble.just-media .floating-part{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:12px;margin:0;max-width:15rem;padding:.375rem .625rem;position:absolute;top:0;white-space:nowrap}@media only screen and (max-width:600px){.bubble.just-media .floating-part{max-width:calc(100vw - 1rem - 10px - 100%)}}.bubble.just-media .name{color:#fff!important}.bubble.just-media .name{line-height:1.3125;line-height:var(--line-height);padding:.375rem .625rem}.bubble.just-media .name .peer-title{font-weight:400!important}.bubble.just-media .reply{height:54px;max-height:54px}@media only screen and (max-width:600px){.bubble.just-media .reply{padding:8px 6px 8px 8px}}.bubble.just-media .reply-content{max-width:none!important}.bubble.just-media .reply-content{margin-top:0;position:relative}.bubble.just-media .reply i,.bubble.just-media .reply-subtitle,.bubble.just-media .reply-title{color:#fff!important}.bubble.just-media .reply-border{background:#fff!important}.bubble.forwarded .attachment,.bubble.is-reply .attachment,.bubble:not(.hide-name) .attachment{border-top-left-radius:0;border-top-right-radius:0}.bubble .message,.bubble .service-msg{--custom-emoji-size:var(--messages-custom-emoji-size)}.bubble .message{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--messages-text-size);line-height:1.3125;line-height:var(--line-height);max-width:100%;padding:0 .5rem .375rem .625rem;position:relative;white-space:pre-wrap;word-break:break-word}.bubble .message .custom-emoji{display:inline-flex}.bubble .message:last-child{padding-top:6px}@media only screen and (max-width:600px){.bubble .audio,.bubble .document{--icon-size:2.25rem}}.bubble .audio .audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble .audio .audio-ico{font-size:0}@media only screen and (max-width:600px){.bubble .audio{--icon-margin:.6875rem;height:2.375rem}.bubble .audio .audio-details{margin-bottom:0;margin-top:2px}.bubble .audio .audio-subtitle{margin-top:-1px}}.bubble .message.audio-message{max-width:min(100%,335px)!important}.bubble .message.audio-message{width:335px}@media only screen and (max-width:600px){.bubble .message.audio-message{max-width:min(100%,300px)!important}.bubble .message.audio-message{width:280px}}.bubble .message.voice-message .document-message{max-width:-moz-fit-content;max-width:fit-content}.bubble .message.audio-message,.bubble .message.voice-message{padding:8px!important}.bubble .message.call-message,.bubble .message.contact-message{min-width:200px;padding-left:8px}.bubble .message.contact-message .contact{cursor:pointer;display:flex;padding:2px 0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .message.contact-message .contact-avatar{color:#fff}.bubble .message.contact-message .contact-details{display:flex;flex-direction:column;margin-top:8px;padding-left:12px}.bubble .message.contact-message .contact-name{font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold)}.bubble .message.contact-message .contact-number{font-size:14px;line-height:1.4}.bubble .message.poll-message{max-width:400px}.bubble .message.document-message{max-width:325px!important}.bubble .message.document-message .document{--icon-margin:.75rem;height:58px}@media only screen and (max-width:600px){.bubble .message.document-message .document{--icon-margin:.5rem;height:44px}.bubble .message.document-message .document .document-size{font-size:.75rem}.bubble .message.document-message .document:not(.document-with-thumb) .document-ico{padding:1.125rem 0 0}}.bubble .message.document-message .document-name{line-height:1.4;margin-top:1px;overflow:hidden;text-overflow:ellipsis}.bubble-call{cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding:.125rem 0 .125rem 2.5625rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble-call:before{font-size:1.5rem;left:.3125rem;position:absolute}.bubble-call-title{font-weight:500;font-weight:var(--font-weight-bold)}.bubble-call-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;font-size:var(--messages-secondary-text-size);line-height:18px;line-height:var(--messages-secondary-line-height);margin-left:-.1875rem;margin-top:.0625rem}.bubble-call-subtitle.is-reason:before{margin-right:.0625rem}.bubble-call-subtitle:before{content:\"\";display:inline-block;font-size:1rem;transform:rotate(135deg)}.bubble-call-subtitle.arrow-red:before{color:#df3f40;color:var(--danger-color)}.bubble-call-subtitle.arrow-green:before{color:#4fae4e;color:var(--message-out-primary-color)}.bubble .document-wrapper{display:flex;flex-direction:column-reverse}.bubble .document-wrapper .document-message{margin-top:.25rem}.bubble .document .time{align-self:flex-start;height:0}.bubble .document-message+.audio .time,.bubble .document-message+.document .time{display:none!important}.bubble.is-multiple-documents .message{padding:0!important}.bubble.is-multiple-documents .message{border-radius:inherit}.bubble.is-multiple-documents .document-container{border-radius:inherit;position:relative}.bubble.is-multiple-documents .document-container .document-selection{bottom:0;left:-75vw;position:absolute;top:0;width:200vw;z-index:-2}.bubble.is-multiple-documents .document-container.is-highlighted .document-wrapper:before,.bubble.is-multiple-documents .document-container.is-selected .document-wrapper:before{background-color:#fff;background-color:var(--message-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0;z-index:-1}.bubble.is-multiple-documents .document-container.is-highlighted .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-highlighted .document-selection{animation:bubbleSelected 2s linear}.bubble.is-multiple-documents .document-container.is-selected .document-selection{background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color)}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected .document-selection{animation:fade-in-opacity .2s linear forwards}body:not(.animation-level-0) .bubble.is-multiple-documents .document-container.is-selected.backwards .document-selection{animation:fade-in-backwards-opacity .2s linear forwards}.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--margin-top:.25rem;--margin-left:.125rem;background:#fff;border-radius:50%;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document-container .bubble-select-checkbox{--size:1.125rem}}.bubble.is-multiple-documents .document-container .bubble-select-checkbox:before{--inner-size:.125rem;border:2px solid #c4c9cc;border:2px solid var(--secondary-color);border-radius:inherit;content:\" \";height:calc(var(--size) - var(--inner-size)*2);left:var(--inner-size);position:absolute;top:var(--inner-size);width:calc(var(--size) - var(--inner-size)*2)}.bubble.is-multiple-documents .document-container:first-of-type .document-selection{top:-.0625rem}.bubble.is-multiple-documents .document-container:first-of-type .document-wrapper{border-top-left-radius:inherit;border-top-right-radius:inherit;padding-top:.5rem}.bubble.is-multiple-documents .document-container:last-of-type .document-selection{bottom:-.0625rem}.bubble.is-multiple-documents .document-container:last-of-type .document-wrapper{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;padding-bottom:.5rem}.bubble.is-multiple-documents.is-group-first .document-container:first-of-type .document-selection{top:-.25rem}.bubble.is-multiple-documents.is-group-last .document-container:last-of-type .document-selection{bottom:-.25rem}.bubble.is-multiple-documents .document{height:54px!important}@media only screen and (max-width:600px){.bubble.is-multiple-documents .document{height:38px!important}}.bubble.is-multiple-documents .document-wrapper{padding:.25rem .5rem}.bubble.is-multiple-documents .document-wrapper>.name{margin-top:-.1875rem;padding:0 0 .25rem}.bubble .message .audio .time,.bubble .message.contact-message .time,.bubble .message.poll-message .time{bottom:0;position:absolute;right:0}html:not(.is-safari) .bubble .message.voice-message{overflow:hidden}.bubble.is-message-empty .bubble-content-wrapper{width:-moz-min-content;width:min-content}.bubble.is-message-empty .message{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:.75rem;bottom:.1875rem;padding:0 .3125rem;position:absolute;right:.1875rem;z-index:2}.bubble.is-message-empty .message .time{align-items:center;display:flex;height:calc(12px + .375rem);height:calc(var(--messages-time-text-size) + .375rem);margin:0;padding:0;white-space:nowrap}.bubble.is-message-empty .message .time .inner{bottom:auto;color:#fff;margin:inherit;right:auto}.bubble.is-message-empty .message .time .inner:after{color:#fff!important}.bubble.is-message-empty.with-replies:not(.sticker):not(.with-beside-replies) .message{bottom:55px}.bubble.is-message-empty.emoji-big .message,.bubble.is-message-empty.sticker .message,.bubble.is-message-empty.with-replies.round .message{bottom:0}.bubble.is-message-empty:not(.emoji-big) .reactions-block{max-width:-moz-fit-content;max-width:fit-content}.bubble.is-message-empty .reaction-block{--chosen-background-color:var(--primary-color)}html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):active:after,html.no-touch .bubble.is-message-empty .reaction-block:not(.is-chosen):hover:after{background-color:#fff}.bubble.with-reply-markup .bubble-content{min-width:100%}.bubble.with-replies .attachment{border-bottom-left-radius:0;border-bottom-right-radius:0}.bubble.with-beside-replies .bubble-content{min-height:5.5rem}.bubble .colored-name .premium-icon{color:inherit;opacity:.6}.bubble .time{cursor:pointer;direction:ltr;display:inline-flex;float:right;font-size:12px;font-size:var(--messages-time-text-size);height:12px;height:var(--messages-time-text-size);line-height:1;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;visibility:hidden;z-index:1}.bubble .time i{font-size:1.125rem;margin-right:.375rem}.bubble .time-icon{pointer-events:none}.bubble .time-icon:not(:first-child){margin-left:2px}.bubble .time i.edited{font-size:inherit;overflow:visible}.bubble .time .inner{align-items:center;bottom:0;display:flex;height:12px;height:var(--messages-time-text-size);line-height:1;padding:inherit;pointer-events:all;position:absolute;right:0;visibility:visible;white-space:nowrap}.bubble .time .tgico-pinnedchat{margin-right:.125rem}.bubble .time.is-block{display:block;float:none}.bubble.webpage .time{float:none}.bubble .video-play,.bubble .video-time{pointer-events:none}.bubble .video-time{--height:calc(var(--messages-time-text-size) + 0.375rem);align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:var(--height);color:#fff;display:flex;font-size:12px;font-size:var(--messages-time-text-size);height:var(--height);left:3px;line-height:1;padding:0 6px;position:absolute;top:3px;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:2}.bubble .video-time.can-autoplay:after{color:#fff;content:\"\";font-size:20px;font-size:calc(var(--messages-time-text-size) + 8px);padding:0 1px 0 3px}[dir=ltr] .bubble .video-time.is-error:after{margin-left:1px}[dir=rtl] .bubble .video-time.is-error:after{margin-right:1px}.bubble .video-time.is-error:after{content:\"\";font-size:16px;font-size:calc(var(--messages-time-text-size) + 4px);padding:0}.bubble .extended-media-buy{align-items:center;-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:rgba(0,0,0,.3);border-radius:2rem;color:#fff;display:flex;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;left:50%;padding:0 1rem;position:absolute;top:50%;transform:translate(-50%,-50%);white-space:nowrap;z-index:2}.bubble .extended-media-buy:before{font-size:1.125rem;margin-right:.25rem}.bubble pre{display:inline;margin:0}.bubble .anchor-url{text-decoration:underline}.bubble .video-play{align-items:center;background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);color:#fff;display:flex;font-size:2.125rem;justify-content:center;text-align:center;z-index:2}.bubble .ckin__player.circle{z-index:1}.bubble:not(.forwarded).hide-name .name{display:none}.bubble .name{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .peer-title{cursor:pointer}.bubble .name{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.bubble .name{color:#3390ec;color:var(--primary-color);font-size:14px;font-size:var(--messages-secondary-text-size);line-height:calc(14px + .25rem);line-height:calc(var(--messages-secondary-text-size) + .25rem);max-width:100%;overflow:hidden;padding:.375rem .625rem 0;text-overflow:ellipsis}.bubble .name .badge-fake{display:inline-block;margin-top:-2px;vertical-align:middle}.bubble:not(.webpage).photo:not(.is-reply) .bubble-content>.name,.bubble:not(.webpage).video:not(.is-reply) .bubble-content>.name{padding-bottom:6px}.bubble:not(.webpage).photo:not(.is-message-empty) .message,.bubble:not(.webpage).video:not(.is-message-empty) .message{padding-top:6px}.bubble:not(.webpage).photo .topic-name-button-container,.bubble:not(.webpage).video .topic-name-button-container{margin-bottom:0}.bubble:not(.webpage):not(.is-album):not(.sticker):not(.round):not(.emoji-big) .attachment{background-color:#000}.bubble.hide-name:not(.is-reply):not(.is-message-empty) .message{padding-top:6px}.bubble:not(.sticker):not(.emoji-big):not(.forwarded).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):not(.forwarded):not(.is-group-first) .reply{margin-top:6px}.bubble .bubble-tail{display:none}.bubble.can-have-tail.is-group-last .bubble-tail{fill:#fff;fill:var(--message-background-color);display:block;height:20px;position:absolute;transform:translateY(1px);width:11px;z-index:-2}.bubble.is-message-empty.is-group-last.with-media-tail .bubble-tail,.bubble.photo.is-message-empty.is-group-last:not(.with-replies) .bubble-tail,.bubble.video.is-message-empty.is-group-last:not(.with-replies) .bubble-tail{display:none}.bubble.is-message-empty.is-group-last.with-media-tail .attachment{overflow:visible}.bubble__media-container{border-radius:inherit;cursor:pointer}.bubble audio-element,.bubble poll-element{white-space:normal}.bubble .replies{-webkit-user-select:none;-moz-user-select:none;user-select:none}.bubble .replies .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.bubble .replies .rp{border-radius:inherit;cursor:pointer;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.bubble .replies-beside{border-radius:2rem;bottom:47px;flex-direction:column;height:auto;max-height:52px;min-height:36px;padding:.375rem 0 .5rem;right:-44px;width:36px}.bubble .replies-beside-text{font-size:.75rem;margin-top:.125rem}.bubble .replies-footer{align-items:center;border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;border-top:.0625rem solid #dfe1e5;border-top:.0625rem solid var(--border-color);color:#3390ec;color:var(--primary-color);display:flex;height:3.0625rem;min-width:15rem;padding:0 .5rem;position:relative}html.no-touch .bubble .replies-footer:active,html.no-touch .bubble .replies-footer:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}html.no-touch .bubble .replies-footer:active~.bubble-tail,html.no-touch .bubble .replies-footer:hover~.bubble-tail{fill:#eff6fd;fill:var(--light-filled-message-primary-color)}.bubble .replies-footer .tgico-comments,.bubble .replies-footer .tgico-next{font-size:1.5rem}.bubble .replies-footer .tgico-comments{margin-left:.125rem;margin-right:.375rem}.bubble .replies-footer-text{align-items:center;color:#3390ec;color:var(--primary-color);display:flex;font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin-left:.5rem}.bubble .replies-footer-avatars{--margin-right:-.875rem;--border-size:2px}.bubble .replies-footer .tgico-next{position:absolute;right:.1875rem}.bubble .replies-footer.is-unread .replies-footer-text:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:\" \";height:.5rem;margin-left:.75rem;width:.5rem}.bubble.is-thread-starter .user-avatar{display:none}.bubble.is-thread-starter.is-in .bubble-content-wrapper{margin-left:0}.bubble .message .reaction{--background-color:var(--light-filled-message-primary-color)}.bubble .message .reaction.is-chosen.backwards,.bubble .message .reaction:not(.is-chosen){--counter-color:var(--message-primary-color)}.bubble .message .reaction.is-chosen.backwards .stacked-avatars,.bubble .message .reaction:not(.is-chosen) .stacked-avatars{--border-color:var(--background-color)}.bubble .message .reactions-block .time{bottom:auto!important;position:static!important;right:auto!important}.bubble .message .reactions-block .time{order:100}.bubble code{cursor:pointer}.bubble.is-invoice .attachment{background-color:inherit!important}.bubble.with-reply-markup .bubble-content{border-bottom-left-radius:6px!important;border-bottom-right-radius:6px!important}.bubble .name-with-reply .name{padding:0!important}.bubble .name-with-reply .name:not(:last-child) .hide-ol{display:none}.bubble .name-with-reply .name:not(:last-child) .peer-title{font-weight:500!important;font-weight:var(--font-weight-bold)!important}.bubble .name-with-reply .reply{height:auto;margin:.25rem 0 0;max-height:none;padding:0}.bubble .topic-name-button{--color:var(--message-primary-color)}.bubble .name .topic-name-button-container{margin:.25rem -.125rem}.bubble .name .topic-name-button-container:first-child{margin-top:0}.bubble.is-message-empty:not(.is-reply) .name .topic-name-button-container{margin-bottom:0}.bubble:not(.is-group-first) .topic-name-button-container{display:none!important}.bubble .topic-name-button-container.floating-part{font-size:14px;font-size:var(--messages-secondary-text-size);padding-bottom:0;padding-top:0}.bubble .topic-name-button-container.floating-part .topic-name-button{--color:#fff;padding:0}.bubble .topic-name-button-container.floating-part .topic-name-button:before{content:none}.bubble .topic-name-button-container.floating-part+.floating-part{margin-top:1.75rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type{margin-bottom:.0625rem}.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type .document-container:last-of-type .document-selection,.bubbles-date-group:last-of-type .bubbles-group:last-of-type .bubble:last-of-type:after{bottom:-.0625rem}.can-zoom-fade{opacity:1;transform:scale(1) translateX(0);transform-origin:center}body.animation-level-2 .can-zoom-fade{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}.bubbles-inner.zoom-fading .can-zoom-fade{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}.can-zoom-fade.zoom-fade{opacity:0;transform:scale3d(.8,.8,1) translateX(0)}.bubble-content-wrapper{display:flex;flex-direction:column}@media only screen and (min-width:601px){.bubble:not(.service) .bubble-content-wrapper{max-width:85%}}@media only screen and (max-width:600px){.bubble-content-wrapper{max-width:calc(100% - 5.5625rem);max-width:calc(100% - var(--message-handhelds-margin))}}.bubble.service{align-self:center;justify-content:center}.bubble.service b{color:inherit}.bubble.service .bubble-content{background-color:transparent;border-radius:.875rem}.bubble.service .bubble-content-wrapper{max-width:100%;padding:0 2rem}.bubble.service .service-msg{align-items:center;background-color:rgba(109,141,65,.4);background-color:var(--message-highlightning-color);border-radius:inherit;color:#fff;display:flex;font-size:15px;font-size:var(--messages-service-text-size);justify-content:center;line-height:20px;line-height:calc(var(--messages-service-text-size) + 5px);padding:.28125rem .625rem;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;word-break:break-word}.bubble.service .service-msg i{font-style:normal}.bubble.service .service-msg a{color:#fff}.bubble.service .service-msg .peer-title,.bubble.service .service-msg [data-saved-from],.bubble.service .service-msg a{cursor:pointer;font-weight:500;font-weight:var(--font-weight-bold)}.bubble.service .service-msg .peer-title:hover,.bubble.service .service-msg [data-saved-from]:hover,.bubble.service .service-msg a:hover{text-decoration:underline}.bubble.service .service-msg img.emoji{margin-bottom:3px}.bubble.is-in .bubble-content,.bubble.is-in .bubble-content .poll-footer-button{border-radius:6px 12px 12px 6px}.bubble.is-in.is-group-first .bubble-content,.bubble.is-in.is-group-first .poll-footer-button{border-top-left-radius:12px}.bubble.is-in.is-group-last.can-have-tail .bubble-content,.bubble.is-in.is-group-last.can-have-tail .poll-footer-button{border-bottom-left-radius:0!important}.bubble.is-in.is-group-last.can-have-tail .bubble-tail{margin-left:-8.4px}.bubble.is-in.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-in.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-left-radius:12px}.bubble.is-in.just-media .floating-part{left:calc(100% + 10px)}@media only screen and (max-width:600px){.bubble.is-in.just-media .floating-part{left:calc(100% + 1px)}}.bubble.is-in .quote .webpage-name,.bubble.is-in .reply-title{color:#3390ec;color:var(--primary-color)}.bubble.is-in .time{margin-left:-3px;padding-right:8px}.bubble.is-in .time .inner{color:#707579;color:var(--secondary-text-color);margin-bottom:4px}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-left-radius:0}.bubble.is-in.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-left:-9px}.bubble.is-in .audio-subtitle,.bubble.is-in .audio-time,.bubble.is-in .contact-number{color:#707579!important;color:var(--secondary-text-color)!important}.bubble.is-in code,.bubble.is-in pre{color:#df3f40;color:var(--monospace-text-color)}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-border{background-color:rgb(var(--override-color))}.bubble.is-in:not(.just-media) .reply.is-overriding-color .reply-title{color:rgb(var(--override-color))}html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:active,html.no-touch .bubble.is-in:not(.just-media) .reply.is-overriding-color:hover{background-color:rgba(var(--override-color),.08)}.bubble.is-out{--message-background-color:var(--message-out-background-color);--light-message-background-color:var(--light-message-out-background-color);--dark-message-background-color:var(--dark-message-out-background-color);--link-color:var(--message-out-link-color);--message-primary-color:var(--message-out-primary-color);--light-filled-message-primary-color:var(--light-filled-message-out-primary-color);--selection-background-color:var(--message-out-selection-background-color);flex-direction:row-reverse}.bubble.is-out .bubble-content{margin-left:auto}.bubble.is-out .bubble-content,.bubble.is-out .bubble-content .poll-footer-button{border-radius:12px 6px 6px 12px}.bubble.is-out .bubble-content .name{color:#4fae4e;color:var(--message-out-primary-color)}@media only screen and (min-width:1276px){.bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}.bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(calc((var(--chat-input-size) + .5rem)*-1))}body.animation-level-2 .bubble.is-out .bubble-content-wrapper{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-out)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transform:scale(1) translateX(0)}body.animation-level-2 body.is-right-column-shown .bubble.is-out .bubble-content-wrapper{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:var(--bubble-transition-in)}body.is-right-column-shown .bubble.is-out .bubble-content-wrapper.zoom-fade{transform:scale3d(.8,.8,1) translateX(0)}}.bubble.is-out.is-group-first .bubble-content,.bubble.is-out.is-group-first .poll-footer-button{border-top-right-radius:12px}.bubble.is-out.is-group-last.can-have-tail .bubble-content,.bubble.is-out.is-group-last.can-have-tail .poll-footer-button{border-bottom-right-radius:0!important}.bubble.is-out.is-group-last.can-have-tail .bubble-tail{right:-8.4px;transform:translateY(1px) scaleX(-1)}.bubble.is-out.is-group-last:not(.can-have-tail) .bubble-content,.bubble.is-out.is-group-last:not(.can-have-tail) .poll-footer-button{border-bottom-right-radius:12px}.bubble.is-out.just-media .floating-part{right:calc(100% + 10px)}.bubble.is-out.just-media .message{right:0}.bubble.is-out:not(.just-media) .reply-border{background-color:#4fae4e!important;background-color:var(--message-out-primary-color)!important}.bubble.is-out:not(.just-media) .reply i,.bubble.is-out:not(.just-media) .reply-title{color:#4fae4e!important;color:var(--message-out-primary-color)!important}.bubble.is-out .quote:before{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .quote .webpage-name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out .time{margin-left:-4px;padding-right:5px}.bubble.is-out .time .inner{bottom:4px;color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .time .inner:after,.bubble.is-out .time:after{color:#4fae4e;color:var(--message-out-primary-color);font-size:19px;font-size:calc(var(--messages-text-size) + 3px);line-height:12px;line-height:var(--messages-time-text-size);margin-left:1px}.bubble.is-out.forwarded .name{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out.is-read .time .inner:after,.bubble.is-out.is-read .time:after{content:\"\"}.bubble.is-out.is-sent .time .inner:after,.bubble.is-out.is-sent .time:after{content:\"\"}.bubble.is-out.is-sending .time .inner:after,.bubble.is-out.is-sending .time:after{content:\"\"}.bubble.is-out.is-error .time .inner:after,.bubble.is-out.is-error .time:after{color:#df3f40;color:var(--message-error-color);content:\"\"}.bubble.is-out .document-ico:after{border-right-color:#fff;border-right-color:var(--message-background-color);border-top-color:#fff;border-top-color:var(--message-background-color)}.bubble.is-out .audio-waveform rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio-waveform rect.active{fill:#4fae4e!important;fill:var(--message-out-primary-color)!important}.bubble.is-out .audio-subtitle,.bubble.is-out .audio-time{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .audio-download,.bubble.is-out .audio-toggle,.bubble.is-out .audio.corner-download .preloader-container{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-download:empty{display:none}.bubble.is-out .audio.is-unread rect{fill:#4fae4e;fill:var(--message-out-primary-color)}.bubble.is-out .audio.is-unread .audio-time:after{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio-toggle .part{background-color:#fff;background-color:var(--message-out-audio-play-button-color)}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .attachment{border-bottom-right-radius:0}.bubble.is-out.is-message-empty.is-group-last.with-media-tail .bubble__media-container{margin-right:-9px}.bubble.is-out.is-message-empty .reactions-block{justify-content:flex-end}.bubble.is-out.is-message-empty .reaction-block{margin-right:.25rem}.bubble.is-out.is-message-empty .reaction-block:last-child{margin-right:0}.bubble.is-out.is-message-empty .reaction-block.is-chosen{--chosen-background-color:var(--surface-color)}.bubble.is-out.is-message-empty:not(.emoji-big) .reactions-block{margin-left:auto}.bubble.is-out .bubble-call-subtitle,.bubble.is-out .contact-number,.bubble.is-out .document-size{color:#4fae4e;color:var(--message-out-status-color)}.bubble.is-out .bubble-call-subtitle:before{transform:rotate(-45deg)}.bubble.is-out poll-element .poll-desc,.bubble.is-out poll-element .poll-votes-count{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-line use{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-answer-selected{background-color:#4fae4e;background-color:var(--message-out-primary-color);color:#eeffde;color:var(--message-out-background-color)}html.no-touch .bubble.is-out poll-element .poll-answer:hover .animation-ring{background-color:#4fae4e;background-color:var(--message-out-primary-color);opacity:.08}.bubble.is-out poll-element .poll-footer-button,.bubble.is-out poll-element .poll-hint{color:#4fae4e;color:var(--message-out-primary-color)}.bubble.is-out poll-element .poll-avatars .stacked-avatars{--border-color:var(--message-background-color)}.bubble.is-out poll-element .progress-ring__circle{stroke:#4fae4e;stroke:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out poll-element .c-ripple__circle:not(.hiding){opacity:.08}.bubble.is-out.is-sending poll-element{pointer-events:none}.bubble.is-out .audio .progress-line{--color:var(--message-out-primary-color)}.bubble.is-out .audio .progress-line:before,.bubble.is-out .audio .progress-line__loaded{background-color:#4fae4e;background-color:var(--message-out-primary-color)}.bubble.is-out .audio .preloader-container{--color:var(--message-background-color)}.bubble.is-out .bubble-beside-button{left:-2.875rem;left:var(--message-beside-button-margin);right:auto}.bubble.is-out .bubble-beside-button.goto-original{transform:rotate(180deg)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox{background-color:#fff;background-color:var(--message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox:before{border-color:var(--dark-message-background-color)}.bubble.is-out.is-multiple-documents .document-container .bubble-select-checkbox .checkbox-box-border{border-color:#fff;border-color:var(--message-background-color)}.bubble.is-out .bubble-hover-reaction{left:var(--offset);right:auto}.reply-markup{margin-top:.0625rem;width:100%}.bubble:not(.is-group-last) .reply-markup{margin-bottom:.125rem}.reply-markup-row{display:flex;margin-top:.125rem;min-height:2.5rem;overflow:hidden}.reply-markup-row:last-child .reply-markup-button:first-child{border-bottom-left-radius:12px}.reply-markup-row:last-child .reply-markup-button:last-child{border-bottom-right-radius:12px}.reply-markup-button{color:#fff!important}.reply-markup-button{background:rgba(109,141,65,.4);background:var(--message-highlightning-color);border:none;border-radius:.375rem;cursor:pointer;font-size:14px;font-size:var(--font-size-14);font-weight:500;font-weight:var(--font-weight-bold);outline:none;overflow:hidden;padding:.5625rem 0;position:relative;text-align:center;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.reply-markup-button-text{pointer-events:none;position:relative}.reply-markup-button.anchor-url{text-decoration:none!important}.reply-markup-button+.reply-markup-button{margin-left:.125rem}.reply-markup-button .forward-icon,.reply-markup-button.tgico:before{display:block;position:absolute;right:.125rem;top:.125rem}.reply-markup-button.is-link:before{content:\"\";transform:rotate(-45deg)}.reply-markup-button.is-buy:before{content:\"\"}.reply-markup-button.is-switch-inline:before{content:\"\"}.bubble-beside-button:after,.bubble.just-media .reply:after,.reply-markup-button:after{background-color:#fff;border-radius:inherit;bottom:0;content:\" \";display:block;left:0;opacity:0;position:absolute;right:0;top:0;z-index:-1}html.no-touch .bubble-beside-button:active:after,html.no-touch .bubble-beside-button:hover:after,html.no-touch .bubble.just-media .reply:active:after,html.no-touch .bubble.just-media .reply:hover:after,html.no-touch .reply-markup-button:active:after,html.no-touch .reply-markup-button:hover:after{opacity:.08;opacity:var(--hover-alpha)}.bubble-primary-color{color:#3390ec;color:var(--message-primary-color);font-weight:500;font-weight:var(--font-weight-bold)}.pinned-message{--custom-emoji-size:calc(var(--font-size) + 2px)!important}.pinned-message-border{flex:0 0 auto;height:2rem;position:relative;width:.125rem}.pinned-message-border-wrapper-1{background:#3390ec;background:var(--primary-color);border-radius:1px;height:2rem;position:relative;top:50%;transform:translateY(-50%);width:.125rem}.pinned-message-border-mask{--mask-height:.375rem;--height:2.5rem;height:var(--height);overflow:hidden}.pinned-message-border-mask:after,.pinned-message-border-mask:before{content:\" \";display:block;height:var(--mask-height);left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .pinned-message-border-mask:after,body.animation-level-2 .pinned-message-border-mask:before{transition:opacity .2s ease-in-out}.pinned-message-border-mask:before{background:linear-gradient(#fff,transparent);background:linear-gradient(var(--surface-color),transparent);top:0}.pinned-message-border-mask:after{background:linear-gradient(transparent,#fff);background:linear-gradient(transparent,var(--surface-color));bottom:0}.pinned-message-border-mask.mask-bottom:after,.pinned-message-border-mask.mask-top:before{opacity:1}.pinned-message-border-wrapper{color:#3390ec;color:var(--primary-color);position:relative}.pinned-message-border-wrapper:before{background:#3390ec;background:var(--primary-color);bottom:0;content:\" \";display:block;left:0;opacity:.4;position:absolute;right:0;top:0}.pinned-message-border-bars{stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round}.pinned-message-border-mark{background:currentColor;border-radius:1px;left:0;position:absolute;top:0;width:2px}body:not(.animation-level-0) .pinned-message-border-mark,body:not(.animation-level-0) .pinned-message-border-wrapper{transition:transform .25s ease-in-out;will-change:transform}.pinned-message-content{--height:32px;height:var(--height)}.pinned-message-media{border-radius:.1875rem}.pinned-message,.reply{--font-size:var(--font-size-14);--custom-emoji-size:calc(var(--font-size) + 4px);--line-height:calc(var(--font-size) + 4px);align-items:center;cursor:pointer;display:flex;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.pinned-message-content,.reply-content{display:flex;flex-direction:column;flex-grow:1;flex-shrink:1;justify-content:center;margin-left:.5rem;overflow:hidden;pointer-events:none;position:relative}.pinned-message-title,.reply-title{color:#3390ec;color:var(--primary-color)}.pinned-message-subtitle,.pinned-message-title,.reply-subtitle,.reply-title{font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap}.pinned-message-media,.reply-media{height:2rem!important;width:2rem!important}.pinned-message-media,.reply-media{left:0;overflow:hidden;position:absolute;top:.125rem}.pinned-message-media.is-round,.reply-media.is-round{border-radius:50%}.pinned-message-media>img,.pinned-message-media>video,.reply-media>img,.reply-media>video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.pinned-message i,.reply i{color:#707579;color:var(--secondary-text-color);font-style:normal}.pinned-message img.emoji,.reply img.emoji{height:1rem;vertical-align:top;width:1rem}.reply.is-media .reply-content{padding-left:2.5rem}.reply-border{background:#3390ec;background:var(--primary-color);border-radius:1px;height:calc(32px + .25rem);height:calc(var(--font-size)*2 + .25rem);min-width:2px}.reply-content{margin-left:.625rem}.reply-media{border-radius:.25rem}.reply-cancel{margin-bottom:0!important}.reply-title{margin:-1px 0 1px}.reply .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-container{--container-height:3.25rem;align-items:center;cursor:pointer;display:flex;flex:0 0 auto;justify-content:space-between;overflow:visible}.pinned-container.is-floating{background-color:#fff!important;background-color:var(--surface-color)!important;position:absolute!important}.pinned-container.is-floating{height:var(--container-height);left:0;margin:0;max-height:var(--container-height);right:0;top:var(--topbar-height);width:auto}.pinned-container.is-floating .pinned-container-wrapper{border-radius:0;height:100%;max-width:100%;order:0;padding:0 1rem;z-index:0}@media only screen and (max-width:600px){.pinned-container.is-floating .pinned-container-wrapper{padding:0 .5rem}}.pinned-container.is-floating .pinned-container-content{margin-right:.5rem}@media only screen and (min-width:1276px){body.is-right-column-shown .pinned-container.is-floating .pinned-container-content{padding-right:var(--right-column-width)}}.pinned-container.is-floating:before{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.pinned-container-content{flex:1 1 auto;overflow:hidden;pointer-events:none;position:relative}.pinned-container .btn-icon{display:flex;flex:0 0 auto;font-size:1.5rem;justify-content:center}.pinned-container-wrapper{align-items:center;border-radius:.25rem;display:flex;flex:1 1 auto;order:1;overflow:hidden;padding:.25rem}.pinned-container-wrapper-utils{align-items:center;display:flex;flex:0 0 auto;position:relative}.pinned-message{display:flex;width:auto}.pinned-message-content{overflow:visible!important}.pinned-message-media-container{height:2rem;margin-left:-.25rem;position:absolute;width:2rem}body.animation-level-2 .pinned-message-media-container{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-subtitle,.pinned-message-title{transform:translateX(0)}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{transform:translateX(2.25rem)}.pinned-message:not(.is-media) .pinned-message-media-container{transform:scale(0)}.pinned-message .pinned-container-wrapper{min-width:16rem}.pinned-message:not(.is-floating){margin-right:1rem}.pinned-message:not(.is-floating) .pinned-container-wrapper-utils{display:none}.pinned-message:not(.is-floating)>.pinned-message-close{display:flex;margin-right:.75rem;order:0}.pinned-message.is-media .pinned-message-subtitle,.pinned-message.is-media .pinned-message-title{width:calc(100% - 2.25rem)}.pinned-message.is-floating{--container-height:var(--pinned-message-height)}.pinned-message.is-floating>.btn-icon{display:none}.pinned-message.is-floating .pinned-container-wrapper{padding-left:1rem}.pinned-message.is-floating .pinned-container-content{margin-right:0}.pinned-message-content .pinned-message-subtitle,.pinned-message-content .pinned-message-title{height:calc(var(--height)/2);min-height:calc(var(--height)/2);overflow:visible;position:relative}body.animation-level-2 .pinned-message-content .pinned-message-subtitle,body.animation-level-2 .pinned-message-content .pinned-message-title{transition:transform .2s ease-in-out;transition:transform var(--pm-transition)}.pinned-message-title{margin-bottom:.25rem}.pinned-message-subtitle .animated-super-row{font-size:14px;font-size:var(--font-size-14);line-height:16px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pinned-message .animated-counter{transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .pinned-message .animated-counter{transition:none}.pinned-message .animated-counter:before{content:\"#\"}.pinned-message .animated-counter.is-last:not(.backwards){opacity:0;transform:scale(.68)}.pinned-message .animated-super-row{--translateY:16px}.pinned-message .pinned-message-media{--translateY:32px}.pinned-message.hide~.tgico-pinlist,.pinned-message.is-many .pinned-message-close,.pinned-message.is-many.is-floating .pinned-message-close,.pinned-message.is-many:not(.is-floating) .pinned-message-pinlist,.pinned-message:not(.is-many) .pinned-message-pinlist,.pinned-message:not(.is-many)~.tgico-pinlist{display:none}.pinned-message-pinlist{order:2}.chat[data-type=discussion] .pinned-message .pinned-container-close{display:none!important}.pinned-audio{--progress-height:.25rem}.pinned-audio.is-floating{--container-height:var(--pinned-audio-height)}.pinned-audio:not(.is-floating){max-width:210px;padding-right:1.75rem;position:relative}.pinned-audio .pinned-container-wrapper{overflow:visible!important}.pinned-audio .pinned-container-wrapper>.btn-icon{margin-left:0!important}.pinned-audio-ico:before{content:\"\"}.pinned-audio-ico.flip-icon:before{content:\"\"}.pinned-audio-title{font-weight:500;font-weight:var(--font-weight-bold)}.pinned-audio-subtitle{color:#707579;color:var(--secondary-text-color)}.pinned-audio-subtitle,.pinned-audio-title{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.pinned-audio-content{margin-left:.75rem}.pinned-audio-progress{--border-radius:0;--height:var(--progress-height);--translateY:.125rem;bottom:0;left:0;position:absolute;right:0;transform:scaleX(1) translateY(var(--translateY));transform:scaleX(var(--topbar-floating-scaleX)) translateY(var(--translateY));transform-origin:left center}@media only screen and (min-width:1276px){.pinned-audio-progress{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}body.is-right-column-shown .pinned-audio-progress{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 .pinned-audio-progress{transition:none}}body.animation-level-2 .pinned-audio-progress:before{transition:opacity .2s ease-in-out}.pinned-audio-progress:not(:hover):before{opacity:0}html.no-touch .pinned-audio-progress:active,html.no-touch .pinned-audio-progress:hover{--translateY:0}.pinned-audio-progress .progress-line__filled:after{display:none!important}.pinned-audio-progress .progress-line__seek{top:-1rem}.pinned-audio-progress-wrapper{bottom:0;height:.5rem;left:0;overflow:hidden;position:absolute;right:0}.pinned-audio-volume{align-items:center;height:2.5rem;position:relative;width:2.5rem}html.is-touch .pinned-audio-volume{display:none}.pinned-audio-volume-tunnel{bottom:-1rem;content:\" \";left:0;position:absolute;right:0;top:100%}.pinned-audio-volume .player-volume__icon{cursor:pointer;display:flex}.pinned-audio-volume .progress-line-container{background-color:#fff;background-color:var(--surface-color);border-radius:10px;box-shadow:0 1px 5px 0 rgba(0,0,0,.15);margin-top:2.25rem;opacity:0;padding:.75rem 1rem;position:absolute;top:100%;transform:rotate(270deg);transition:opacity .2s ease-in-out,visibility 0s .2s;visibility:hidden;width:5rem}body.animation-level-0 .pinned-audio-volume .progress-line-container{transition:none!important}.pinned-audio-volume:active .progress-line-container,.pinned-audio-volume:hover .progress-line-container{opacity:1;transition:opacity .2s ease-in-out,visibility 0s 0s;visibility:visible}.markup-tooltip{background:#fff;background:var(--surface-color);border-radius:10px;bottom:0;display:flex;height:44px;justify-content:flex-start;left:0;opacity:0;overflow:hidden;position:fixed;right:0;top:0;transform:translateZ(0);transition:opacity .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),width .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition),transform var(--layer-transition),width var(--layer-transition);width:252px;z-index:1}body.animation-level-0 .markup-tooltip{transition:none}.markup-tooltip-wrapper{align-items:center;display:flex;height:100%;justify-content:flex-start;left:0;max-width:100%;position:absolute;top:0;transform:translateX(0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:672px}body.animation-level-0 .markup-tooltip-wrapper{transition:none}.markup-tooltip-tools{align-items:center;display:flex;flex:0 0 auto;justify-content:space-between;max-width:100%;padding:7px}.markup-tooltip-tools:first-child{width:252px}.markup-tooltip-tools:last-child{width:420px}.markup-tooltip-tools:last-child .markup-tooltip-delimiter{margin:0 .25rem}.markup-tooltip-delimiter{background-color:#dfe1e5;background-color:var(--border-color);height:25px;width:1px}.markup-tooltip .btn-icon{border-radius:8px!important}.markup-tooltip .btn-icon{height:30px;padding:0;width:30px}.markup-tooltip .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important;color:#fff!important}.markup-tooltip:not(.is-visible){pointer-events:none}.markup-tooltip.is-visible{opacity:1}.markup-tooltip.is-link{width:420px}.markup-tooltip.is-link .markup-tooltip-wrapper{transform:translateX(-252px)}.markup-tooltip-link-apply{color:#3390ec;color:var(--primary-color);font-size:2rem}.markup-tooltip-link-apply-container{align-items:center;display:flex;opacity:0;pointer-events:none;transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--layer-transition)}body.animation-level-0 .markup-tooltip-link-apply-container{transition:none}.markup-tooltip .input-clear{flex:1 1 auto;margin:0 .5rem;text-overflow:ellipsis}.markup-tooltip .input-clear.is-valid+.markup-tooltip-link-apply-container{opacity:1;pointer-events:all}.stickers-helper>.scrollable{max-height:13.75rem;min-height:72px;min-height:var(--esg-sticker-size);padding:.4375rem;position:relative}.stickers-helper-stickers{border-radius:var(--border-radius);max-width:100%}html.no-touch .stickers-helper .super-sticker:not(.active):active,html.no-touch .stickers-helper .super-sticker:not(.active):hover{background:none}.emoji-helper{padding:.25rem 0!important}.emoji-helper{height:50px}.emoji-helper>.scrollable{position:relative;width:auto}.emoji-helper .super-emojis{display:block;white-space:nowrap}.emoji-helper .super-emojis:after,.emoji-helper .super-emojis:before{content:\" \";display:inline-block;width:.25rem}html.no-touch .emoji-helper .super-emoji:not(.active):active,html.no-touch .emoji-helper .super-emoji:not(.active):hover{background:none}.emoji-helper .super-emoji.active{background-color:#3390ec!important;background-color:var(--primary-color)!important}.inline-helper{-webkit-user-select:none;-moz-user-select:none;user-select:none}.inline-helper:not(.is-gallery){min-width:min(20rem,100%)}.inline-helper .scrollable{max-height:232px;position:relative}.inline-helper-separator{background-color:#dfe1e5;background-color:var(--border-color);height:1px;margin-left:4rem;width:100%}.inline-helper-separator:last-child{display:none}.inline-helper .btn-primary{border-radius:0;border-radius:initial}.inline-helper-results:not(.is-gallery){cursor:pointer}.inline-helper-results:not(.is-gallery) .inline-helper-result{height:4rem;line-height:1.3125;line-height:var(--line-height);padding:.5rem .5rem .5rem 4rem}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{height:3rem!important;width:3rem!important}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview{left:.5rem;overflow:hidden;position:absolute}.inline-helper-results:not(.is-gallery) .inline-helper-result-preview.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:.375rem;color:#fff;display:flex;font-size:1.75rem;justify-content:center;text-transform:uppercase}.inline-helper .media-container{border-radius:inherit}.inline-helper .media-photo,.inline-helper .media-poster,.inline-helper .media-video{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.inline-helper .gif{height:auto!important;width:auto!important}.inline-helper .gif{bottom:0;left:0;position:absolute;right:0;top:0}.inline-helper-results.is-gallery{grid-gap:1px;border-radius:var(--border-radius);grid-template-columns:repeat(auto-fill,minmax(72px,1fr));grid-template-columns:repeat(auto-fill,minmax(var(--esg-sticker-size),1fr));max-width:100%}.inline-helper-results.is-gallery .inline-helper-result{height:auto!important;width:auto!important}.inline-helper-result{position:relative}.inline-helper-result-title{font-weight:500;font-weight:var(--font-weight-bold);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inline-helper-result-description{-webkit-line-clamp:2;-webkit-box-orient:vertical;color:#707579;color:var(--secondary-text-color);display:-webkit-box;font-size:.875rem;overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap}.chat-search{position:absolute!important}.chat-search{left:0;right:0;top:0;z-index:2}.chat-search-footer{align-items:center;background-color:#fff;background-color:var(--surface-color);box-shadow:0 -1px 5px -1px rgba(0,0,0,.21);display:flex;flex:0 0 auto;height:46px;justify-content:space-between;overflow:hidden;padding:0 8px;width:100%}.chat-search-footer .chat-search-count{color:#707579;color:var(--secondary-text-color);margin-left:8px}.chat-search-count:empty,.chat-search-count:not(:empty)+.btn-icon,.chat-search-footer+.chat-input{display:none}.chat-search-controls{display:flex}.chat-search-results{background-color:#fff;background-color:var(--surface-color);height:100%;left:0;max-height:100%;opacity:0;overflow:hidden;position:absolute;top:0;transition:.2s ease;visibility:hidden;width:100%}body.animation-level-0 .chat-search-results{transition:none}.chat-search-results.active{opacity:1;visibility:visible}.chat-search .tgico-up{margin-right:2px}.drops-container{position:absolute!important;width:auto!important}.drops-container{--padding:0px;align-items:center;bottom:var(--padding);display:flex;flex-direction:column;justify-content:center;left:var(--padding);right:var(--padding);top:var(--padding);-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}.drops-container:not(.is-visible){display:none}.drops-container.is-visible{animation:fade-in-opacity .2s linear forwards}.drops-container.is-visible.backwards{animation:fade-in-backwards-opacity .2s linear forwards}.drop{--wrapper-padding:-4px;align-items:center;background-color:#fff;background-color:var(--surface-color);border-radius:12px;color:#a2acb4;display:flex;flex:1 1 auto;flex-direction:column;justify-content:center;max-width:100%;pointer-events:all;position:relative;transition:color .2s ease-in-out;width:100%}.drop-outline-wrapper{bottom:var(--wrapper-padding);left:var(--wrapper-padding);pointer-events:none;position:absolute;right:var(--wrapper-padding);top:var(--wrapper-padding)}.drop-outline-path{fill:none;stroke-dasharray:13.5,11;stroke:#a2acb4;stroke-width:2;stroke-linecap:round;stroke-dashoffset:0;transition:stroke .2s ease-in-out}.drop.is-dragover .drop-outline-path{stroke:#3390ec;stroke:var(--primary-color);animation:drop-outline-move .5s linear infinite}.drop-icon{font-size:6rem}.drop-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.drop-header:not(:last-child){margin-top:-10px}@media only screen and (max-height:670px){.drop-icon{font-size:0}.drop-header{margin-top:0}}.drop.is-dragover{color:#3390ec;color:var(--primary-color)}.drop+.drop{margin-top:10px}@keyframes drop-outline-move{0%{stroke-dashoffset:0}to{stroke-dashoffset:-24.5}}body.is-dragging .page-chats{pointer-events:none}.bot-commands{animation:none!important;background-color:transparent!important;border-radius:12px 12px 0 0!important;padding:var(--offset) var(--offset) 0!important;position:absolute!important;transition:none!important;visibility:visible!important;width:auto!important}.bot-commands{--border-radius-padding:24px;--offset:.5rem;bottom:calc(100% - var(--border-radius-padding));box-shadow:none;left:calc(var(--offset)*-1);max-height:20rem;max-width:none;overflow:hidden;pointer-events:none;right:calc(var(--offset)*-1)}body.animation-level-2 .bot-commands{display:flex!important}.bot-commands .scrollable{max-height:207px!important}.bot-commands .scrollable{background-color:#fff;background-color:var(--surface-color);border-radius:inherit;box-shadow:0 1px 8px 1px rgba(0,0,0,.12);height:auto;pointer-events:all}body.animation-level-2 .bot-commands .scrollable{opacity:0;transform:translateY(var(--height))}.bot-commands.is-visible.animating .scrollable{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.bot-commands.is-visible:not(.backwards) .scrollable{opacity:1;transform:translateY(0)}.bot-commands-list{border-radius:inherit;height:var(--height);padding-bottom:0;width:100%}.bot-commands-list-element{border-radius:0!important}.bot-commands-list-element{align-items:flex-start;flex-direction:column;justify-content:center;padding-left:3.375rem}.bot-commands-list-element-avatar{left:.75rem;position:absolute}.bot-commands-list-element-description,.bot-commands-list-element-name{font-size:.875rem;line-height:18px;line-height:var(--line-height-14);margin-left:0}.crop .overlay::-moz-selection,.crop-component::-moz-selection{background:transparent}.crop .overlay::-moz-selection, .crop-component::-moz-selection{background:transparent}.crop .overlay::selection,.crop-component::selection{background:transparent}.crop-image,.crop-overlay-image{display:block;height:auto;-o-object-fit:contain;object-fit:contain;-o-object-position:center;object-position:center;width:auto}.crop-image{display:block;pointer-events:none;position:relative}.crop-component{background-color:#fff;margin:0 auto;overflow:hidden;position:relative;z-index:999}.crop-component>img{max-width:100%}.crop-overlay{border-radius:50%;box-sizing:content-box;overflow:hidden;position:absolute;z-index:999}.crop-overlay:active,html.no-touch .crop-overlay:hover{cursor:move}.crop-overlay-image{display:block;position:absolute}.crop-overlay-color{background-color:hsla(0,0%,100%,.7);border-radius:8px;height:100%;left:0;position:absolute;top:0;width:100%}.crop.is-forum .crop-overlay{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}.sidebar-header{align-items:center;background-color:#fff;background-color:var(--surface-color);cursor:default;display:flex;flex:0 0 auto;justify-content:space-between;min-height:3.5rem;padding-left:1rem;padding-right:1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-header .btn-menu{overflow-y:overlay}@media only screen and (max-width:600px){.sidebar-header{padding-left:.5rem;padding-right:.5rem}}[dir=ltr] .sidebar-header__title{padding-left:1.5rem}[dir=rtl] .sidebar-header__title{padding-right:1.5rem}.sidebar-header__title{color:#000;color:var(--primary-text-color);flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}[dir=ltr] .sidebar-header .btn-icon+.btn-icon{margin-left:.5rem}[dir=rtl] .sidebar-header .btn-icon+.btn-icon{margin-right:.5rem}.sidebar-header-right{flex:0 0 auto}.scrollable-y-bordered .sidebar-header{position:relative}.scrollable-y-bordered .sidebar-header:after{background-color:#dfe1e5;background-color:var(--border-color);bottom:-1px;content:\" \";height:1px;left:0;opacity:0;position:absolute;right:0;z-index:1}body.animation-level-2 .scrollable-y-bordered .sidebar-header:after{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.scrollable-y-bordered:not(.scrolled-top) .sidebar-header:after{opacity:1}.sidebar-close-button{overflow:inherit!important}.sidebar-close-button{flex:0 0 auto;height:2.5rem;width:2.5rem}.sidebar-content{display:flex;flex:1 1 auto;height:100%;max-height:100%;overflow:hidden;position:relative;width:100%}.profile-avatars-container{cursor:pointer;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}html.no-touch .profile-avatars-container:active .profile-avatars-arrow,html.no-touch .profile-avatars-container:hover .profile-avatars-arrow{opacity:.2}.profile-avatars-container.is-single .profile-avatars-arrow,.profile-avatars-container.is-single .profile-avatars-tabs{display:none}.profile-avatars-container.is-swiping .profile-avatars-arrow{opacity:0!important}.profile-avatars-avatars{display:flex;flex-wrap:nowrap;height:100%;position:absolute;transform:translateZ(-1px) scale(2);transform-origin:left top;transition:transform .2s ease-in-out;width:100%}.scrollable.no-parallax .profile-avatars-avatars{transform:translate(0)}.profile-avatars-avatars:before{bottom:0;content:\" \";left:0;right:0;top:0}.profile-avatars-avatar{background-color:#000;display:flex;height:inherit;min-height:100%;min-width:100%;position:relative;width:inherit}.profile-avatars-avatar .avatar-photo{height:100%;-o-object-fit:cover;object-fit:cover;pointer-events:none;width:100%}.profile-avatars-gradient{background:linear-gradient(1turn,rgba(0,0,0,.3) 8.98%,transparent);bottom:0;height:80px;left:0;position:absolute;right:0}[dir=ltr] .profile-avatars-info{left:1.5rem}[dir=rtl] .profile-avatars-info{right:1.5rem}.profile-avatars-info{align-items:flex-start;bottom:0;bottom:.5625rem;display:flex;flex-direction:column;pointer-events:none;position:absolute}[dir=ltr] .profile-avatars-info .profile-name,[dir=ltr] .profile-avatars-info .profile-subtitle{text-align:left}[dir=rtl] .profile-avatars-info .profile-name,[dir=rtl] .profile-avatars-info .profile-subtitle{text-align:right}.profile-avatars-info .profile-name,.profile-avatars-info .profile-subtitle{color:#fff;margin:0}.profile-avatars-info .peer-typing-container{--color:#fff}.profile-avatars-info .premium-icon{color:#fff}.profile-avatars-info .verified-icon-background{fill:#fff}.profile-avatars-info .verified-icon-check{visibility:hidden}.profile-avatars-info .premium-icon,.profile-avatars-info .profile-subtitle,.profile-avatars-info .verified-icon{opacity:.7}.profile-avatars-info .online{color:inherit!important}.profile-avatars-tabs{display:flex;height:.125rem;left:.375rem;pointer-events:none;position:absolute;right:.375rem;top:.5rem}.profile-avatars-tab{background-color:#fff;border-radius:4px;flex:1 1 auto;height:inherit;margin:0 .125rem;opacity:.2;transition:opacity .2s ease-in-out}.profile-avatars-tab.active{opacity:.6}.profile-avatars-arrow{bottom:0;left:0;opacity:0;position:absolute;top:0;width:33.3333333333%}.profile-avatars-arrow:before{color:#fff;font-size:2.1875rem;left:.625rem;position:absolute;top:50%;transform:translateY(-50%)}body.animation-level-2 .profile-avatars-arrow{transition:opacity .2s ease-in-out}html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:active,html.no-touch .profile-avatars-container:not(.is-swiping) .profile-avatars-arrow:hover{opacity:1!important}.profile-avatars-arrow-next{left:auto;right:0}.profile-avatars-arrow-next:before{left:auto;right:.625rem}.profile-content{display:flex;flex:0 0 auto;flex-direction:column;position:relative;width:100%}.profile-content .sidebar-left-section{background-color:#fff;background-color:var(--surface-color);padding-bottom:.5rem;position:relative}.profile-content .sidebar-left-section .profile-subtitle .peer-typing-container{justify-content:center}.profile-content.search-empty .gradient-delimiter{display:none}@media only screen and (max-width:600px){.profile-button{border-radius:0}}[dir=ltr] .profile-change-avatar{right:1.25rem}[dir=rtl] .profile-change-avatar{left:1.25rem}.profile-change-avatar{position:absolute!important;transition:none!important}.profile-change-avatar{--size:3.375rem;top:calc(var(--size)/-2);transform:none}.profile-container>.scrollable{display:flex;flex-direction:column}.profile-name{align-items:flex-end;color:#000;color:var(--primary-text-color);display:flex;font-size:20px;font-size:var(--font-size-20);font-weight:500;font-weight:var(--font-weight-bold);line-height:26px;line-height:var(--line-height-20);margin:0 auto;max-width:21.25rem;overflow:hidden;text-align:center}.profile-name span.emoji{min-width:-moz-min-content;min-width:min-content;vertical-align:inherit}.profile-name .peer-title{overflow:hidden;text-overflow:ellipsis;word-break:break-word}.sidebar-left-section-content>.profile-name{justify-content:center}.profile-name .badge-fake{align-self:center}.profile-subtitle{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem;justify-content:center;margin-bottom:.875rem;margin-top:1px;text-align:center}@media only screen and (max-width:600px){.profile-subtitle{margin-top:3px}}.profile-subtitle .online{color:#3390ec;color:var(--primary-color)}.profile-avatar{display:block;margin:.5rem auto 10px}@media only screen and (max-width:600px){.profile-avatar{--size:100px;--multiplier:.54;margin:0 auto 10px}}.profile-avatar,.profile-name,.profile-subtitle{flex:0 0 auto}.menu-horizontal-scrollable{--scrollable-size:3rem;height:var(--scrollable-size)}.menu-horizontal-scrollable:after{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);bottom:0;content:\" \";height:1px;left:0;position:absolute;right:0;z-index:-1}.menu-horizontal-scrollable .menu-horizontal-div{border-bottom:none}.menu-horizontal-div{--size:var(--scrollable-size,3rem);--padding-horizontal:0px;border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);display:flex;flex-direction:row;height:var(--size);justify-content:space-around;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%;z-index:2}.menu-horizontal-div:not(.no-stripe):after,.menu-horizontal-div:not(.no-stripe):before{content:\" \";flex:0 0 auto;width:var(--padding-horizontal)}.menu-horizontal-div:not(.no-stripe) .menu-horizontal-div-item{border-radius:10px 10px 0 0}.menu-horizontal-div-item{transition:none!important}.menu-horizontal-div-item{align-items:center;border-radius:0;cursor:pointer;display:flex;flex:1 1 auto;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;justify-content:center;line-height:1.3125;line-height:var(--line-height);padding:0 1rem;position:relative;text-align:center}html.no-touch .menu-horizontal-div-item:active,html.no-touch .menu-horizontal-div-item:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.menu-horizontal-div-item.active{color:#3390ec;color:var(--primary-color)}.menu-horizontal-div-item.active i{opacity:1}.menu-horizontal-div-item.active .c-ripple__circle,html.no-touch .menu-horizontal-div-item.active:active,html.no-touch .menu-horizontal-div-item.active:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.menu-horizontal-div-item.active .badge{background-color:#3390ec;background-color:var(--primary-color)}.menu-horizontal-div-item>span{align-items:center;display:inline-flex;overflow:visible;pointer-events:none;position:relative}.menu-horizontal-div i{background-color:#3390ec;background-color:var(--primary-color);border-radius:.1875rem .1875rem 0 0;bottom:-.8125rem;box-sizing:content-box;height:.1875rem;left:0;opacity:0;pointer-events:none;position:absolute;transform-origin:left;width:100%;z-index:1}.menu-horizontal-div i.animate{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container{display:grid;grid-template-columns:100%;grid-template-rows:100%;min-width:100%;width:100%}.tabs-container .tabs-tab{background-color:#f4f4f5;background-color:var(--background-color);display:none;flex-direction:column;grid-column-start:1;grid-row-start:1;overflow:hidden}body.animation-level-0 .tabs-container .tabs-tab{transition:none!important}.tabs-container .tabs-tab.active{display:flex}.tabs-container[data-animation=tabs] .tabs-tab{transition:transform .2s ease-in-out;transition:transform var(--tabs-transition)}.tabs-container[data-animation=navigation].animating .tabs-tab{transition:transform .3s cubic-bezier(.4,0,.2,1),filter .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),filter var(--transition-standard-in)}.tabs-container[data-animation=navigation].animating.backwards .tabs-tab{transition:transform .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out),filter var(--transition-standard-out)}#column-left{flex:1 1 auto;flex-direction:column;max-width:420px;min-width:min(100%,18rem)}@media only screen and (max-width:600px){#column-left{max-width:100%;width:100%}body:not(.is-left-column-shown) #column-left{filter:brightness(80%);transform:translate3d(-25vw,0,0)}}@media only screen and (min-width:601px){#column-left{overflow:visible}[dir=ltr] #column-left:after{right:-1px}[dir=rtl] #column-left:after{left:-1px}#column-left:after{background-color:#dfe1e5;background-color:var(--border-color);content:\" \";display:block;height:100vh;position:absolute;top:0;width:1px;z-index:2}}@media only screen and (min-width:601px)and (max-width:925px){#column-left{display:flex;left:0;max-width:none;position:fixed;top:0;transform:translate3d(-5rem,0,0);transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition);width:26.5rem}body.animation-level-0 #column-left{transition:none}body.is-left-column-shown #column-left{transform:translateZ(0)}}@media only screen and (min-width:926px){#column-left{display:flex}}@media only screen and (max-width:1275px){#column-left{flex:2}}@media only screen and (min-width:1681px){html.is-safari #column-left{max-width:418.75px}}#column-left .item-main .menu-horizontal-scrollable{background-color:#fff;background-color:var(--surface-color);position:relative;top:auto;z-index:1}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-scrollable{box-shadow:0 1px 5px -1px rgba(0,0,0,.16)}}#column-left .item-main .menu-horizontal-scrollable .scrollable{position:relative}[dir=ltr] #column-left .item-main .menu-horizontal-scrollable .badge{margin-left:5px}[dir=rtl] #column-left .item-main .menu-horizontal-scrollable .badge{margin-right:5px}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container{height:calc(100% - var(--scrollable-size));position:relative}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .scrollable{padding-top:.5rem}#column-left .item-main .menu-horizontal-scrollable:not(.hide)+#folders-container .dialogs-placeholder-canvas{top:.5rem}#column-left .item-main .menu-horizontal-div{position:relative!important}#column-left .item-main .menu-horizontal-div{--padding-horizontal:.6875rem;justify-content:flex-start;z-index:0}@media only screen and (max-width:600px){#column-left .item-main .menu-horizontal-div{--padding-horizontal:.1875rem}}#column-left .item-main .menu-horizontal-div-item{flex:0 0 auto;min-width:3rem}#column-left .item-main .menu-horizontal-div__stripe{display:none}#column-left .folders-tabs-scrollable{flex:0 0 auto}#column-left .item-main{--offset-top:0;background-color:#fff;background-color:var(--surface-color)}[dir=ltr] #column-left .item-main .input-search .selector-user{left:6px}[dir=rtl] #column-left .item-main .input-search .selector-user{right:6px}[dir=ltr] #column-left .item-main .input-search .selector-user{margin-left:0}[dir=rtl] #column-left .item-main .input-search .selector-user{margin-right:0}#column-left .item-main .input-search .selector-user{position:absolute!important}#column-left .item-main .input-search .selector-user{height:30px;line-height:1.875rem;top:6px;z-index:1}[dir=ltr] #column-left .item-main .input-search.is-picked .input-search-input{padding-left:calc(var(--paddingLeft) + 12px - var(--border-width))}[dir=rtl] #column-left .item-main .input-search.is-picked .input-search-input{padding-right:calc(var(--paddingLeft) + 12px - var(--border-width))}#column-left .item-main .input-search.is-picked .tgico-close{display:block!important}#column-left .item-main .input-search.is-picked-twice .selector-user:first-of-type{width:30px}[dir=ltr] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{left:38px}[dir=rtl] #column-left .item-main .input-search.is-picked-twice .selector-user:last-of-type{right:38px}[dir=ltr] #column-left .item-main .search-helper{margin-left:28px}[dir=rtl] #column-left .item-main .search-helper{margin-right:28px}#column-left .item-main .search-helper{display:flex}@media only screen and (max-width:600px){[dir=ltr] #column-left .item-main .search-helper{margin-left:20px}[dir=rtl] #column-left .item-main .search-helper{margin-right:20px}}#column-left .item-main .search-helper .selector-user{font-size:14px;margin-top:7px}html.no-touch #column-left .item-main .search-helper .selector-user:active,html.no-touch #column-left .item-main .search-helper .selector-user:hover{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}#column-left .item-main .search-helper .selector-user-avatar:after{display:none!important}#column-left .item-main .search-helper:empty{display:none}#column-left .item-main .search-super-tabs-scrollable{position:relative!important}#column-left .item-main .search-super-tabs-scrollable{flex:0 0 auto}#column-left .item-main .search-super-tabs-scrollable:before{display:none}#column-left .item-main .search-super-tabs-scrollable .menu-horizontal-div-item{flex:1 0 auto!important}#column-left .item-main .search-super .preloader{height:100%;top:50%;transform:translate(-50%,-50%)}#column-left #chatlist-container{background-color:#fff;background-color:var(--surface-color);max-height:100%;position:relative}#column-left #chatlist-container.has-filters .connection-status-bottom{height:calc(100% + var(--offset-top)*-1)}#column-left #folders-container{flex:1 1 auto}#column-left #folders-container .scrollable-y{background-color:transparent;position:absolute}#column-left #folders-container .scrollable-y.active{display:block}#column-left .dialogs-placeholder-canvas{position:absolute;top:0;z-index:2}#column-left .sidebar-slider{height:100%}#column-left .sidebar-header__btn-container{align-items:center;display:flex;flex:0 0 auto;height:2.5rem;justify-content:center;position:relative;width:2.5rem}#column-left .sidebar-header__btn-container>.btn-icon{bottom:0;left:0;margin:0;opacity:0;position:absolute;right:0;top:0;visibility:hidden;z-index:4}body.animation-level-0 #column-left .sidebar-header__btn-container>.btn-icon:before{transition:none}#column-left .sidebar-header__btn-container>.btn-icon.is-visible{opacity:1;visibility:visible}@media only screen and (max-width:600px){#column-left .sidebar-header__btn-container .btn-menu{margin-top:-.25rem}}#column-left .sidebar-tools-button{width:100%}#column-left .sidebar-tools-button .btn-menu{max-height:calc(100vh - 3.75rem);max-height:calc(var(--vh)*100 - 3.75rem);min-width:260px}[dir=ltr] #column-left .sidebar-tools-button .btn-menu-item{padding-right:.375rem}[dir=rtl] #column-left .sidebar-tools-button .btn-menu-item{padding-left:.375rem}[dir=ltr] #column-left .archived-count{margin-left:.625rem}[dir=rtl] #column-left .archived-count{margin-right:.625rem}#column-left .archived-count{justify-self:flex-end}html[dir=ltr].is-mobile #column-left .archived-count{margin-right:.375rem}html[dir=rtl].is-mobile #column-left .archived-count{margin-left:.375rem}@media only screen and (max-width:600px){#column-left .archived-count{font-weight:500;font-weight:var(--font-weight-bold)}}#column-left .archived-count:empty{display:none}#column-left .search-group-people .chatlist{display:flex;flex-direction:row;margin-top:-1px;padding:0 0 1px}#column-left .search-group-people .chatlist:after,#column-left .search-group-people .chatlist:before{content:\" \";display:inline-block;flex:0 0 auto;width:.3125rem}#column-left .search-group-people .chatlist-chat{padding:0!important}#column-left .search-group-people .chatlist-chat{align-items:center;display:flex;flex:0 0 auto;flex-direction:column;height:6.125rem;justify-content:flex-end;max-width:4.875rem;width:4.875rem}#column-left .search-group-people .dialog-subtitle,#column-left .search-group-people .dialog-title-details{display:none}#column-left .search-group-people .dialog-title{max-width:65px;padding-bottom:.75rem}#column-left .search-group-people .dialog-title .user-title{font-size:.75rem!important}#column-left .search-group-people .dialog-title .peer-title{font-weight:400!important;font-weight:var(--font-weight-normal)!important}[dir=ltr] #column-left .search-group-people .dialog-avatar{left:auto!important}[dir=rtl] #column-left .search-group-people .dialog-avatar{right:auto!important}#column-left .search-group-people .dialog-avatar{top:.75rem!important}#column-left .search-group-people .search-group-scrollable{position:relative}@media only screen and (max-width:600px){[dir=ltr] #column-left .search-group-people .search-group-scrollable{margin-left:-7px}[dir=rtl] #column-left .search-group-people .search-group-scrollable{margin-right:-7px}#column-left .search-group-people .search-group-scrollable{margin-top:4px}}#column-left .search-group-people .search-group-scrollable>.scrollable{position:relative}#column-left .item-main .sidebar-content{justify-content:center}#column-left .item-main .sidebar-content .btn-menu{bottom:calc(100% + 10px)}#column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,#column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{visibility:visible!important}body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner.menu-open .tgico-close,body.animation-level-2 #column-left .item-main .sidebar-content .btn-corner:not(.menu-open) .tgico-newchat_filled{animation:grow-icon .4s ease-in-out forwards!important}@media only screen and (max-width:600px){#column-left .item-main .sidebar-content .btn-corner{position:fixed!important}#column-left .item-main .sidebar-content .btn-corner{--size:54px;bottom:14px;right:14px;z-index:1}}#column-left .item-main .sidebar-content .btn-corner:not(.is-hidden){transform:translateZ(0)}#column-left .connection-status{flex:0 0 auto;overflow:hidden;padding:0 .5rem .5rem;width:100%}#column-left .connection-status:not(.is-shown) .connection-status-button{display:none}#column-left .connection-status.is-shown.animating .connection-status-button,#column-left .connection-status.is-shown.animating+.connection-status-bottom{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--layer-transition)}#column-left .connection-status.is-shown:not(.backwards) .connection-status-button{transform:translateY(0)}#column-left .connection-status.is-shown:not(.backwards)+.connection-status-bottom{transform:translateY(calc(64px + var(--offset-top)))}#column-left .connection-status.is-shown:not(.animating):not(.backwards)+.connection-status-bottom{height:calc(100% - 64px + var(--offset-top))}[dir=ltr] #column-left .connection-status-button{padding-left:4.5rem}[dir=rtl] #column-left .connection-status-button{padding-right:4.5rem}[dir=ltr] #column-left .connection-status-button{text-align:left}[dir=rtl] #column-left .connection-status-button{text-align:right}#column-left .connection-status-button{align-self:center;color:#2e3939;cursor:default;height:3.5rem;transform:translateY(-100%)}#column-left .connection-status-button .force-reconnect{color:inherit;cursor:pointer;text-decoration:underline}[dir=ltr] #column-left .connection-status-button .preloader-container{left:1rem}[dir=rtl] #column-left .connection-status-button .preloader-container{right:1rem}#column-left .connection-status-button .preloader-container{height:1.5rem;right:auto;width:1.5rem}#column-left .connection-status-button .preloader-container .preloader-path-new{stroke:#2e3939}#column-left .connection-status-bottom{--offset-top:0px;background-color:#fff;background-color:var(--surface-color);bottom:0;display:flex;flex-direction:column;height:100%;left:0;overflow:hidden;position:absolute;right:0;top:0;transform:translateY(var(--offset-top))}#column-left .input-wrapper{flex:0 0 auto;margin:.75rem 0;max-width:100%;padding:0 .75rem;width:420px}@media only screen and (max-width:600px){#column-left .input-wrapper{width:100%}}#search-container{top:var(--offset-top)!important}#search-container{display:flex}#search-container .scrollable-y{flex:1 1 auto;position:relative}.edit-profile-container .sidebar-content,.new-channel-container .sidebar-content,.new-group-container .sidebar-content{flex-direction:column}.edit-profile-container .chatlist-container,.new-channel-container .chatlist-container,.new-group-container .chatlist-container{flex:1 1 auto}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{margin-left:23px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{margin-right:23px}[dir=ltr] .edit-profile-container .caption,[dir=ltr] .new-channel-container .caption,[dir=ltr] .new-group-container .caption{padding-right:24px}[dir=rtl] .edit-profile-container .caption,[dir=rtl] .new-channel-container .caption,[dir=rtl] .new-group-container .caption{padding-left:24px}.edit-profile-container .caption,.new-channel-container .caption,.new-group-container .caption{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:14px}.language-container .sidebar-left-section{padding-bottom:.5rem}.new-group-container .search-group{margin-top:.5rem}.edit-folder-container .chatlist{padding:0}.edit-folder-container .folder-categories .folder-category-button:nth-child(n+2){pointer-events:none}.new-group-members{padding:1.5rem 0 .4375rem}.new-group-members .search-group__name{text-transform:capitalize}.settings-container .profile-avatars-container{height:15rem;padding-bottom:0}.edit-profile-container .scroll-wrapper{width:100%}.chat-folders-container,.edit-folder-container,.people-nearby-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.chat-folders-container .sticker-container,.edit-folder-container .sticker-container,.people-nearby-container .sticker-container{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.chat-folders-container .caption,.edit-folder-container .caption,.people-nearby-container .caption{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:0 auto;max-width:20rem;text-align:center}.people-nearby-container .sticker-container{margin:1rem auto}.people-nearby-container .caption{margin-bottom:1rem}.chat-folders-container .sidebar-left-section:not(:last-child){padding-bottom:0}.chat-folders-container .sidebar-left-section:last-child{padding-bottom:.5rem}.edit-folder-container .caption{margin-bottom:18px}@media only screen and (max-width:600px){.edit-folder-container .input-wrapper{padding:0 16px;width:100%}}.edit-folder-container .sidebar-left-section{padding-bottom:0}.edit-folder-container .sidebar-left-section:last-child{padding-bottom:.5rem}.folder-categories .checkbox-field{right:1.125rem!important}.folder-categories .checkbox-field{position:absolute}.included-chatlist-container .sidebar-left-section{padding-bottom:0}.included-chatlist-container .sidebar-left-section:first-child{padding-top:0}.included-chatlist-container .sidebar-left-section:last-child{padding-bottom:.5rem}.included-chatlist-container .sidebar-left-section .chatlist{padding:0}.included-chatlist-container .selector .chatlist .checkbox{margin-top:10px}[dir=ltr] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-left:26px}[dir=rtl] .included-chatlist-container .selector .chatlist [type=checkbox]+span{padding-right:26px}.search-group-recent .search-group__name{align-items:center;display:flex;justify-content:space-between}.search-group-recent .btn-icon{font-size:22px}@media only screen and (max-width:600px){.search-group-recent.search-group.search-group-contacts ul{margin-top:0}.search-group.search-group-contacts ul,.search-group.search-group-messages ul{margin-top:7px}.search-group.search-group-messages{margin-top:-6px}}@media only screen and (min-width:601px){.search-group-recent.search-group.search-group-contacts{padding:0 0 7px}}.sidebar-left-section{padding:.5rem 0 1rem}.sidebar-left-section.with-fake-delimiter{padding-top:0!important}.sidebar-left-section.with-fake-delimiter{box-shadow:none}.sidebar-left-section.with-fake-delimiter .gradient-delimiter{margin-bottom:.5rem}.sidebar-left-section.no-padding-top{padding-top:0!important}@media only screen and (max-width:600px){.sidebar-left-section{padding-bottom:.5rem}}@media only screen and (min-width:601px){.sidebar-left-section-content{margin:0 .5rem}}.sidebar-left-section-content>.btn-primary{margin:0}[dir=ltr] .sidebar-left-section-content>.checkbox-field .checkbox-box{left:auto}[dir=rtl] .sidebar-left-section-content>.checkbox-field .checkbox-box{right:auto}@media only screen and (max-width:600px){.sidebar-left-section-content>.btn-primary,.sidebar-left-section-content>.checkbox-ripple{border-radius:0}}.sidebar-left-section-content.full-width{margin:0!important}.sidebar-left-section-content>.media-sticker-wrapper{flex:0 0 auto;height:86px;margin:1px auto 29px;position:relative;width:86px}.sidebar-left-section-name{padding:1rem}@media only screen and (max-width:600px){.sidebar-left-section-name{font-size:.875rem;padding:.5rem 1rem}}.sidebar-left-section-caption{color:#707579;color:var(--secondary-text-color);font-size:1rem;line-height:1.3125;line-height:var(--line-height);margin-top:1rem;padding:0 1rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{font-size:.875rem;margin:.5rem}}.sidebar-left-section .checkbox-field,.sidebar-left-section .radio-field{margin:0}.sidebar-left-section:first-child:not(.no-delimiter){padding-top:0}.sidebar-left-section .checkbox-field{align-items:center;display:flex;height:3.5rem;padding:0 1.125rem}.sidebar-left-section-disabled{pointer-events:none!important}.sidebar-left-section-disabled{opacity:.25}.sidebar-left-section .chatlist{padding:0}.sidebar-left-h2{color:#3390ec;color:var(--primary-color);font-size:16px;font-weight:500;font-weight:var(--font-weight-bold)}.general-settings-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.general-settings-container .sidebar-left-section{padding-bottom:0}.general-settings-container .sidebar-left-section:last-child{padding-bottom:.5rem}#chats-archived-container,#contacts-container,#poll-results-container,#search-gifs-container,#search-private-container,#stickers-container,.add-members-container{background-color:#fff!important;background-color:var(--surface-color)!important}.chat-folders-container .btn-control{margin-bottom:1.5rem}.two-step-verification{background-color:#fff!important;background-color:var(--surface-color)!important}.two-step-verification .sidebar-left-section{box-shadow:none!important}.two-step-verification .sidebar-left-section:first-child{padding-top:0}.two-step-verification .sidebar-left-section-caption{margin-bottom:1.125rem;margin-left:auto;margin-right:auto;max-width:342px;text-align:center}.two-step-verification-main .btn-primary+.btn-primary{margin-top:.125rem!important}.two-step-verification .btn-primary:not(.btn-transparent){text-transform:uppercase}.two-step-verification .media-sticker-wrapper{height:168px;margin:.625rem auto 1.1875rem;width:168px}.two-step-verification .input-wrapper .btn-primary:first-child:last-child{margin-top:.25rem}.two-step-verification-enter-password .media-sticker-wrapper{height:157px;margin:1.125rem auto 1.8125rem;width:157px}.two-step-verification-hint .media-sticker-wrapper{height:160px;margin:.5rem auto 2.25rem;width:160px}.two-step-verification-email .media-sticker-wrapper{height:160px;margin:.5625rem auto 2.1875rem;width:160px}.two-step-verification-set .media-sticker-wrapper{height:160px;margin:1rem auto 1.3125rem;width:160px}[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=ltr] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{left:.625rem}[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie,[dir=rtl] .two-step-verification-set .media-sticker-wrapper .rlottie-vector{right:.625rem}.dont-u-dare-block-me .sidebar-left-section.no-delimiter{padding-top:.75rem}.dont-u-dare-block-me .sidebar-left-section{padding:0 0 .5rem}@media only screen and (min-width:601px){.privacy-tab .sidebar-left-section:first-child{padding-bottom:1.125rem}}.privacy-tab form{padding-bottom:.0625rem}.active-sessions-container .row-title:first-child{font-weight:500;font-weight:var(--font-weight-bold)}.active-sessions-container .row-title-right{color:#707579;color:var(--secondary-text-color);font-size:12px;font-size:var(--font-size-12);line-height:16px;line-height:var(--line-height-12)}.active-sessions-container .row-midtitle,.active-sessions-container .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.active-sessions-container .sidebar-left-section:first-child{padding-bottom:0}.active-sessions-container .sidebar-left-section:first-child .row-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (min-width:601px){.blocked-users-container ul{padding:0 .6875rem}}.notifications-container .sidebar-left-section{padding-bottom:0}.range-setting-selector{padding:1rem .875rem}.range-setting-selector-details{display:flex;justify-content:space-between;margin-bottom:1rem}.range-setting-selector-name{color:#000;color:var(--primary-text-color)}.range-setting-selector-value{color:#707579;color:var(--secondary-text-color)}.range-setting-selector .progress-line{--height:2px;--color:var(--primary-color);--border-radius:4px;--thumb-size:12px;background-color:#e6ecf0}.range-setting-selector .progress-line__filled{background-color:#3390ec;background-color:var(--primary-color)}.background-container .grid-item:after{border:3px solid #3390ec;border:3px solid var(--primary-color);bottom:0;content:\" \";display:block;left:0;opacity:0;position:absolute;right:0;top:0;transition:opacity .2s ease-in-out}.background-container .grid-item.active:after{opacity:1}.background-container .grid-item.active .grid-item-media{transform:scale(.91)}.background-container .grid-item-media{transform:scale(1);transition:transform .2s ease-in-out}.background-container .grid-item-media.is-pattern{background-color:#000}.background-container .grid-item-media.is-pattern .media-photo{mix-blend-mode:overlay}.background-container .grid .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.background-container .grid .preloader-container{z-index:1}.background-container .background-colors-canvas{height:100%;-webkit-mask-position:center;-webkit-mask-size:contain;position:absolute;width:100%}.background-image-container .sidebar-left-section{padding-bottom:.5rem}.empty-placeholder{width:21rem!important}.empty-placeholder{line-height:1.3125;line-height:var(--line-height);margin:0 auto;padding:0 1rem;position:relative;text-align:center;top:40%;transform:translateY(-50%);-webkit-user-select:none;-moz-user-select:none;user-select:none}.empty-placeholder .media-sticker-wrapper{height:128px;margin:0 auto 1.9375rem;position:relative;width:128px}.empty-placeholder-header{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.empty-placeholder-subtitle{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:.375rem}.empty-placeholder .btn-control{margin-top:1.75rem;padding:0 1.0625rem 0 .8125rem}[dir=ltr] .empty-placeholder .btn-control:before{margin-right:.625rem}[dir=rtl] .empty-placeholder .btn-control:before{margin-left:.625rem}.empty-placeholder-dialogs{opacity:0}body.animation-level-2 .empty-placeholder-dialogs{transition:opacity .2s ease-in-out}.empty-placeholder-dialogs-icon{margin-bottom:1.0625rem}.empty-placeholder-dialogs.visible{opacity:1}.is-forum-visible .can-have-forum .input-search,.is-forum-visible .can-have-forum .row-row,.is-forum-visible .can-have-forum .sidebar-header__title{opacity:0}.is-forum-visible .folders-tabs-scrollable{opacity:.3;opacity:var(--disabled-opacity);pointer-events:none}.is-forum-visible.backwards .can-have-forum .input-search,.is-forum-visible.backwards .can-have-forum .row-row,.is-forum-visible.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.backwards .folders-tabs-scrollable{opacity:1}.is-forum-visible.animating .can-have-forum .input-search,.is-forum-visible.animating .can-have-forum .row-row,.is-forum-visible.animating .can-have-forum .sidebar-header__title,.is-forum-visible.animating .folders-tabs-scrollable{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.is-forum-visible.animating.backwards .can-have-forum .input-search,.is-forum-visible.animating.backwards .can-have-forum .row-row,.is-forum-visible.animating.backwards .can-have-forum .sidebar-header__title,.is-forum-visible.animating.backwards .folders-tabs-scrollable{transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}#column-right{overflow:visible;overflow:initial;position:relative}@media only screen and (min-width:601px)and (max-width:1275px){#column-right{box-shadow:0 .25rem .5rem .1rem rgba(0,0,0,.2)}}@media only screen and (max-width:600px){body:not(.is-right-column-shown) #column-right{transform:translate3d(100vw,0,0)}}@media only screen and (min-width:601px){#column-right{position:absolute;right:0;transform:translate3d(var(--right-column-width),0,0);transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out);width:calc(var(--right-column-width));z-index:3}#column-right .sidebar-content{min-width:var(--right-column-width)}body.is-right-column-shown:not(.is-left-column-shown) #column-right{transform:translateZ(0);transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}body.animation-level-0 #column-right{transition:none}}@media only screen and (min-width:1276px){#column-right{border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);transform:translate3d(calc(var(--right-column-width) + 1px),0,0);width:calc(var(--right-column-width) + 1px)}}#column-right .sidebar-header{flex:0 0 auto}#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}@media only screen and (min-width:601px){#column-right .sidebar-header .sidebar-close-button.tgico:before{content:\"\"}}#column-right #search-private-container .chatlist-container{flex:1 1 auto;position:relative}#column-right .sidebar-search{display:none}#column-right .sidebar-search.active{display:flex}#column-right .input-wrapper{margin:.75rem 0;max-width:100%;padding:0 .75rem;width:100%}.shared-media-container .scrollable:not(.no-parallax){perspective:0;perspective-origin:0 0}.shared-media-container .scrollable:not(.no-parallax).parallax{perspective:1px}.shared-media-container .profile-content.is-me .profile-name{margin-bottom:.9375rem}.shared-media-container .profile-content.is-me .profile-subtitle{display:none}.shared-media-container .search-super{min-height:calc(100vh - 56px);min-height:calc(var(--vh, 1vh)*100 - 56px);top:100%}.shared-media-container .search-super-tabs{--padding-horizontal:0}.shared-media-container .search-super-tabs .menu-horizontal-div-item{border-radius:0!important}.shared-media-container .sidebar-header .transition{flex-grow:1}.shared-media-container .sidebar-header .transition .transition-item{align-items:center;display:flex}.shared-media-container .btn-corner.menu-open:before{content:\"\"}@media only screen and (max-width:600px){.shared-media-container .btn-corner{position:fixed!important}.shared-media-container .btn-corner{bottom:14px;height:54px;right:14px;width:54px;z-index:1}}.shared-media-container.can-add-members .btn-corner:not(.is-hidden){transform:translateZ(0)}.search-super{background-color:#fff;background-color:var(--surface-color);display:flex;flex-direction:column;max-width:100%;min-height:100%;position:absolute;width:100%}.search-super .search-group__show-more{color:#3390ec;color:var(--primary-color);cursor:pointer;font-weight:400}.search-super .search-super-month-name{border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:24px 0 0 24px}@media only screen and (max-width:600px){.search-super .search-super-month-name{padding:18px 0 0 16px}}.search-super.sliding{max-height:none!important}.search-super-tabs{flex:1 1 auto;width:auto}.search-super-tabs-scrollable{box-shadow:none!important;position:sticky!important}.search-super-tabs-scrollable{background-color:#fff;background-color:var(--surface-color);top:0;z-index:2}.search-super-tabs-scrollable:before{background-color:inherit;content:\" \";display:block;height:1px;left:0;position:absolute;top:0;width:100%;z-index:-1}.search-super.is-full-viewport .search-super-tabs-scrollable:before{top:-1px}.search-super-tabs-scrollable .scrollable{display:flex;position:relative}.search-super-tabs-container{flex:1 1 auto;grid-template-rows:100%;min-height:calc(100% - 49px)}.search-super-tabs-container>div{background-color:#fff!important;background-color:var(--surface-color)!important}.search-super-tabs-container>div{min-height:150px;position:relative}.search-super-tabs-container>div>div:first-child{min-height:calc(100vh - 111px);transform:translateY(0)}.search-super-tabs-container .preloader{position:absolute!important}.search-super-tabs-container .preloader{padding:0;top:100px;transform:translate(-50%)}.search-super-tabs-container .preloader>svg{height:50px;width:50px}.search-super-month:first-of-type .search-super-month-name{display:none}.search-super .audio-title,.search-super .document-name,.search-super .title{display:flex;justify-content:space-between}.search-super .sent-time{color:#707579;color:var(--secondary-text-color);flex:0 0 auto;font-size:12px;margin-left:8px;margin-top:3px}.search-super-content-media .search-super-month-name{border:none;padding:9px 0 7px 24px}.search-super-content-media .video-time{background-color:rgba(0,0,0,.35);background-color:var(--message-time-background);border-radius:4px;color:#fff;font-size:12px;height:18px;left:5px;line-height:18px;padding:0 6px 0 5px;position:absolute;top:4px;z-index:2}.search-super-content-media .grid-item{overflow:hidden}.search-super-content-media .checkbox-field{right:.25rem;top:.25rem}.search-super .checkbox-box{box-shadow:0 0 3px 0 rgba(0,0,0,.4)}.search-super .checkbox-box-border{border-color:#fff;border-color:var(--message-checkbox-border-color)}.search-super .checkbox-box-background{background-color:#61c642;background-color:var(--message-checkbox-color)}.search-super .checkbox-field{position:absolute!important}.search-super .checkbox-field{margin:0;z-index:2}.search-super-content-media .search-super-month-items{grid-gap:1px;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);padding-top:1px;width:100%}.search-super-content-files .search-super-month-items{padding:8px 24px 16px 20px}@media only screen and (max-width:600px){.search-super-content-files .search-super-month-items{padding:8px 16px 8px 12px}}.search-super-content-files .document{--icon-size:3rem;--icon-margin:.75rem;height:calc(48px + 1.5rem)}.search-super-content-files .document-download,.search-super-content-files .document-ico{border-radius:5px!important}.search-super-content-files .document-name{font-weight:400;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.search-super-content-links .search-super-item{cursor:pointer;display:flex;flex-direction:column;justify-content:flex-start;min-height:4.375rem;overflow:hidden;padding-left:4.4375rem;position:relative}.search-super-content-links .row-media{border-radius:.375rem;height:3rem;left:.6875rem;overflow:hidden;position:absolute;width:3rem}.search-super-content-links .row-media.empty{align-items:center;background-color:#3390ec;background-color:var(--primary-color);color:#fff;display:flex;font-size:2rem;justify-content:center;text-transform:uppercase}.search-super-content-links a:not(:last-child){position:relative;z-index:2}.search-super-content-links .anchor-url:last-child{position:static}.search-super-content-links .anchor-url:last-child:before{bottom:0;content:\" \";cursor:pointer;left:0;position:absolute;right:0;top:0;z-index:1}.search-super-content-links .media-photo{border-radius:inherit;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.search-super-content-links .row-title{margin-top:.1875rem}.search-super-content-links .row-subtitle{overflow:hidden;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word}.search-super-content-links .sent-time{margin:1px 0 0}.search-super-content-links .sender-title{display:block;margin-top:.25rem}.search-super-content-links .checkbox-field{--offset-left:0!important;margin:2rem 0 0 -1.75rem!important;padding:0!important}@media only screen and (min-width:601px){.search-super-content-links .search-super-month-items{margin:.5625rem}}@media only screen and (max-width:600px){.search-super-content-links .search-super-month-name{padding:.875rem 1rem}}.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 20px}@media only screen and (max-width:600px){.search-super-content-music .search-super-month-items,.search-super-content-voice .search-super-month-items{padding:20px 15px 0 12px}}.search-super-content-music .audio,.search-super-content-voice .audio{justify-content:normal;margin-bottom:1.5rem}@media only screen and (min-width:601px){.search-super-content-music .audio,.search-super-content-voice .audio{max-width:377px}}.search-super-content-music .audio.audio-show-progress .audio-subtitle,.search-super-content-voice .audio.audio-show-progress .audio-subtitle{overflow:visible}.search-super-content-members .chatlist{padding-bottom:.5rem;padding-top:.5rem}.search-super-tabs-scrollable .search-super-nav-scrollable{opacity:1}body.animation-level-2 .search-super-tabs-scrollable .search-super-nav-scrollable,body.animation-level-2 .search-super-tabs-scrollable .search-super-selection-container{transition:opacity .2s ease-in-out}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-nav-scrollable{opacity:0}.search-super-tabs-scrollable.is-selecting:not(.backwards) .search-super-selection-container{opacity:1}.search-super.is-selecting a{pointer-events:none}.search-super.is-selecting .row:not(.menu-open){background-color:transparent!important}.search-super-selection-container{align-items:center;bottom:0;display:flex;justify-content:space-between;left:0;opacity:0;padding:0 1rem;position:absolute;right:0;top:0}.search-super-selection-container .btn-icon+.btn-icon{margin-left:.5rem}@media only screen and (max-width:600px){.search-super-selection-container{padding:0 .5rem}}.search-super-selection-count{color:#000;color:var(--primary-text-color);flex-grow:1;font-weight:500;font-weight:var(--font-weight-bold);margin-left:1.5rem;text-transform:capitalize;white-space:nowrap}#search-container .search-group.is-short .chatlist-chat:nth-child(n+4),#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-description:before,#search-container .search-super-content-music .audio:not(.audio-show-progress) .audio-time{display:none}#stickers-container .sticker-sets{display:flex;flex-direction:column;margin-top:16px}#stickers-container .sticker-set{cursor:pointer;display:flex;flex-direction:column;height:140px}#stickers-container .sticker-set-name{font-weight:500;font-weight:var(--font-weight-bold)}#stickers-container .sticker-set-count{color:#707579;color:var(--secondary-text-color);font-size:14px}#stickers-container .sticker-set-header{display:flex;justify-content:space-between;padding-bottom:12px;padding-left:16px}#stickers-container .sticker-set-button{border-radius:16px;font-size:15px;font-weight:400;height:30px;margin-right:16px;padding-left:12px;padding-right:13px;transition:width .2s;width:auto}#stickers-container .sticker-set-button.gray{background:#f1f3f4;color:#707579;color:var(--secondary-text-color)}#stickers-container .sticker-set-stickers{display:flex;justify-content:space-around}#stickers-container .sticker-set-sticker{height:68px;position:relative;width:68px}#stickers-container .sticker-set-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}#stickers-container .sticker-set-sticker img{max-height:100%;max-width:100%}#poll-results-container .poll-results{display:flex;flex-direction:column;position:relative;width:100%}#poll-results-container .poll-results-answer{color:#707579;color:var(--secondary-text-color);display:flex;font-size:15px;font-weight:500;font-weight:var(--font-weight-bold);justify-content:space-between;margin:0;padding:0 16px 8px;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){#poll-results-container .poll-results-answer{padding:0 24px 8px}}#poll-results-container .poll-results-more{margin:0 .5rem;width:auto}@media only screen and (max-width:600px){#poll-results-container .poll-results-more{border-radius:0;margin:0}}#poll-results-container .poll-results h3{font-size:20px;margin-bottom:16px;margin-top:15px;padding:0 16px}@media only screen and (min-width:601px){#poll-results-container .poll-results h3{padding:0 24px}}#poll-results-container .poll-results hr{display:block!important}#poll-results-container .poll-results hr{margin-bottom:15px;margin-top:7px}.edit-peer-container .input-wrapper{margin-bottom:.5625rem!important}.edit-peer-container .sidebar-left-section{padding:0 0 .5rem}.edit-peer-container .chatlist-new{padding:0}.edit-contact-container .input-wrapper{margin-top:1.8125rem!important}.edit-contact-container .avatar-placeholder{filter:none!important}.edit-contact-container .avatar-edit{margin-bottom:1.375rem!important}.edit-contact-container .profile-name{font-size:1.5rem;line-height:1.3125;line-height:var(--line-height)}.group-type-container .sidebar-left-section-caption{font-size:.875rem;margin-top:.8125rem}.group-type-container .input-wrapper{margin-top:.875rem!important}.media-viewer{align-items:center;background:rgba(0,0,0,.88);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0}@media only screen and (max-width:600px){.media-viewer{background:#000}}.media-viewer-author{align-items:center;cursor:pointer;display:flex;height:100%}@media only screen and (max-width:600px){.media-viewer-author{margin-left:1.5rem}}.media-viewer-userpic{margin-right:1rem}@media only screen and (max-width:600px){.media-viewer-userpic{display:none}}.media-viewer-name{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.0625rem 0}@media only screen and (min-width:601px){.media-viewer-name{margin:.0625rem 0 .125rem}}.media-viewer-date{font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.media-viewer-buttons{display:flex;flex-flow:row nowrap;padding:.5rem .75rem;position:absolute;right:0;top:0}.media-viewer-buttons .btn-icon{margin:0 .25rem;transition:var(--open-duration)}html.no-touch .media-viewer-buttons .btn-icon:active,html.no-touch .media-viewer-buttons .btn-icon:hover{color:#fff}@media only screen and (max-width:600px){.media-viewer-buttons{display:none}}.media-viewer-content{flex-direction:column;height:100%;justify-content:center}.media-viewer-container,.media-viewer-content{align-items:center;display:flex;max-height:100%;max-width:100%;overflow:hidden}.media-viewer-container{align-self:center;flex:1 1 auto;position:relative}.media-viewer-media{visibility:hidden}.media-viewer-caption{background-color:transparent;bottom:0;color:#fff;left:0;line-height:1.3125;line-height:var(--line-height);opacity:0;overflow:hidden;padding:.5rem .5rem 0;position:absolute;right:0;text-align:center;text-overflow:ellipsis;white-space:pre-wrap;word-break:break-word;z-index:4}body.animation-level-2 .media-viewer-caption{transition:transform .2s cubic-bezier(.4,0,.2,1),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out;transition:transform var(--layer-transition),opacity var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}.media-viewer-caption a{color:#60a5e9!important}.media-viewer-caption .scrollable{height:6rem;margin:0 auto;max-height:6rem;max-width:50rem;padding:.5rem .875rem;position:relative}html.no-touch .media-viewer-whole.active .media-viewer-caption{opacity:.4}html.no-touch .media-viewer-whole.active .media-viewer-caption:hover{opacity:1}html.is-touch .media-viewer-whole.active .media-viewer-caption{opacity:.6}@media only screen and (max-width:600px){.media-viewer-caption{bottom:1.0625rem;text-align:inherit;transform:translateZ(0);width:100%}.media-viewer-caption .scrollable{height:auto;padding:0 .5rem}.media-viewer-whole.has-video-controls .media-viewer-caption{transform:translate3d(0,-69px,0)}.media-viewer-whole.backwards .media-viewer-caption{visibility:hidden}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{opacity:1!important}html.no-touch .media-viewer-caption:active,html.no-touch .media-viewer-caption:hover{background-color:#000}}.media-viewer-caption.is-focused{opacity:1!important}.media-viewer-caption.is-focused{background-color:#000}.media-viewer-switcher{cursor:pointer;height:calc(100% - 7.5rem);left:0;position:absolute;top:3.75rem;width:7rem;z-index:5}html.no-touch .media-viewer-switcher{height:calc(100% - 3.75rem)}html.no-touch .media-viewer-switcher:hover .tgico-down{opacity:1}@media only screen and (max-width:600px){.media-viewer-switcher{width:4rem}}.media-viewer-switcher-right{left:auto;right:0}.media-viewer-next-button,.media-viewer-prev-button{color:#fff;cursor:pointer;font-size:2rem;left:1rem;opacity:0;position:absolute;top:50%;transform:translateY(-50%) rotate(90deg);transition:var(--open-duration) opacity;z-index:5}@media only screen and (min-width:601px){.media-viewer-next-button,.media-viewer-prev-button{font-size:3rem;left:2rem}}.media-viewer-next-button{left:auto;right:1rem;transform:translateY(-50%) rotate(-90deg)}@media only screen and (min-width:601px){.media-viewer-next-button{right:2rem}}.media-viewer-mover{min-height:auto!important;position:fixed!important}.media-viewer-mover{align-items:center;border-radius:0;display:flex;justify-content:center;left:0;overflow:hidden;top:0;transform:translateZ(0) scaleX(1);transform-origin:top left}.media-viewer-mover:not(.center){-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}@media only screen and (max-width:600px){.media-viewer-mover{overflow:visible}}.media-viewer-mover .ckin__player{height:100%;left:0;position:absolute;top:0;width:100%}.media-viewer-mover>svg{height:100%;width:100%}.media-viewer-mover .canvas-thumbnail,.media-viewer-mover img,.media-viewer-mover video{height:100%;max-height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;opacity:1;position:absolute;transition:var(--open-duration) opacity;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.media-viewer-mover svg img,.media-viewer-mover svg video{position:static}.media-viewer-mover.active{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) calc(var(--open-duration)/8)}.media-viewer-mover.active.opening{transition:transform var(--open-duration),border-radius var(--open-duration),opacity var(--open-duration) 0s}.media-viewer-mover.moving{transition:transform var(--move-duration) ease}.media-viewer-mover.no-transition{transition:none!important}.media-viewer-mover.center{left:50%!important;top:50%!important;transform:translate3d(-50%,-50%,0)!important}.media-viewer-mover.center{max-height:calc(100vh - 15rem);max-height:calc(var(--vh, 1vh)*100 - 15rem);max-width:100vw}@media only screen and (max-width:600px){.media-viewer-mover.center{height:100%!important;max-width:100vw!important;width:100%!important}.media-viewer-mover.center{max-height:calc(100vh - 120px);max-height:calc(var(--vh, 1vh)*100 - 120px)}.media-viewer-mover.center .ckin__player:not(.ckin__fullscreen) .default__controls{bottom:-62px}}.media-viewer-mover.center .canvas-thumbnail,.media-viewer-mover.center img:not(.thumbnail),.media-viewer-mover.center video{-o-object-fit:contain;object-fit:contain}.media-viewer-mover.center img.thumbnail{-o-object-fit:contain;object-fit:contain;width:auto}.media-viewer-mover.hiding .canvas-thumbnail,.media-viewer-mover.hiding img,.media-viewer-mover.hiding video{opacity:0}.media-viewer-appear{opacity:0;visibility:hidden}body.animation-level-2 .media-viewer-appear{transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration)}.media-viewer-topbar{align-items:center;display:flex;height:3.5rem;justify-content:space-between;left:0;padding:0 1.25rem;position:absolute;right:0;top:0;z-index:5}.media-viewer-topbar .btn-icon,.media-viewer-topbar .media-viewer-author{color:#fff;opacity:.4}body.animation-level-2 .media-viewer-topbar .btn-icon,body.animation-level-2 .media-viewer-topbar .media-viewer-author{transition:opacity var(--open-duration) ease-in-out,color var(--open-duration) ease-in-out,background-color var(--open-duration) ease-in-out}html.no-touch .media-viewer-topbar .btn-icon:active,html.no-touch .media-viewer-topbar .btn-icon:hover,html.no-touch .media-viewer-topbar .media-viewer-author:active,html.no-touch .media-viewer-topbar .media-viewer-author:hover{opacity:1}.media-viewer-topbar-left{align-items:center;display:flex}@media only screen and (max-width:600px){.media-viewer-topbar{padding:0 .5rem}}.media-viewer-aspecter{align-items:center;border-radius:0;display:flex;height:100%;justify-content:center;position:absolute;transform:scaleX(1);width:100%}.media-viewer-mover.active .media-viewer-aspecter{transition:width var(--open-duration),height var(--open-duration),transform var(--open-duration),border-radius var(--open-duration)}.media-viewer-whole{position:fixed!important}.media-viewer-whole{--open-duration:.2s;--move-duration:.35s;display:block;height:100%;left:0;top:0;transition:visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}body.animation-level-0 .media-viewer-whole{--open-duration:0s;--move-duration:0s}.media-viewer-whole.active{transition-delay:0s;visibility:visible}.media-viewer-whole.active .media-viewer-appear,.media-viewer-whole.active .overlays{opacity:1;visibility:visible}body.animation-level-2 .media-viewer-whole.active .media-viewer-appear,body.animation-level-2 .media-viewer-whole.active .overlays{transition:opacity var(--open-duration) 0s,visibility 0s 0s}.media-viewer-whole.active .media-viewer-caption{visibility:visible}@media only screen and (max-width:600px){.media-viewer-whole .btn-menu-toggle:not(.playback-rate){color:hsla(0,0%,100%,.4);opacity:1}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{background-color:hsla(207,4%,46%,.2)!important}.media-viewer-whole .btn-menu-toggle:not(.playback-rate).menu-open{color:#fff}.media-viewer-whole.hide-caption .media-viewer-caption{opacity:0!important}.media-viewer-whole.hide-caption .media-viewer-caption{pointer-events:none}}.media-viewer-whole.highlight-switchers .media-viewer-switcher>span{opacity:1}.media-viewer-whole.no-forwards .canvas-thumbnail,.media-viewer-whole.no-forwards img{pointer-events:none}.media-viewer-whole.no-forwards .media-viewer-caption{-webkit-user-select:none;-moz-user-select:none;user-select:none}.media-viewer-movers{bottom:0;left:0;position:absolute;right:0;top:0;z-index:4}body.animation-level-2 .media-viewer-movers{transition:transform var(--open-duration)}.tgico-zoom:before{content:\"\"}.tgico-zoom.zoom-in:before{content:\"\"}.zoom-container{align-items:center;background-color:rgba(0,0,0,.4);border-radius:12px;bottom:1.25rem;display:flex;height:3.375rem;justify-content:space-between;left:50%;opacity:1;padding:.5rem;position:absolute;transform:translateX(-50%);width:17.125rem;z-index:5}body.animation-level-2 .zoom-container{transition:opacity var(--open-duration)}.zoom-container .btn-icon{color:#fff}.zoom-container .btn-icon.inactive{opacity:.4;pointer-events:none}.zoom-container .progress-line{--color:#fff;--height:2px;flex:1 1 auto;margin:0 1px}.zoom-container .progress-line:before{opacity:1}.media-viewer-whole:not(.active) .zoom-container,.zoom-container:not(.is-visible){opacity:0;pointer-events:none}.zoom-container.is-visible{opacity:1}.zoom-container.is-visible~.media-viewer-caption{opacity:0!important}.zoom-container.is-visible~.media-viewer-caption{pointer-events:none}.zoom-container.is-visible~.media-viewer-movers .default__button--big{opacity:0!important}.overlays{position:fixed!important}.overlays{background-color:rgba(0,0,0,.2);height:100%;left:0;opacity:0;top:0;transition:opacity var(--open-duration) 0s,visibility 0s var(--open-duration);visibility:hidden;width:100%;z-index:4}.emoji-dropdown{background:#fff;background:var(--surface-color);display:flex;flex:1 1 auto;flex-direction:column;height:min(282px,calc(100vh - 135px));height:min(282px,calc(var(--vh)*100 - 135px));max-height:100%;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}@media only screen and (min-height:570px)and (min-width:601px){.emoji-dropdown{position:absolute!important;width:23.875rem!important}.emoji-dropdown{-webkit-backdrop-filter:blur(50px);backdrop-filter:blur(50px);-webkit-backdrop-filter:var(--menu-backdrop-filter);backdrop-filter:var(--menu-backdrop-filter);background-color:hsla(0,0%,100%,.85);background-color:var(--menu-background-color);border-radius:1.25rem;bottom:5.125rem;box-shadow:0 5px 10px 5px rgba(16,35,47,.14);height:26.25rem;left:.8125rem;max-height:26.25rem;opacity:0;transform:scale(0);transform-origin:0 100%;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);z-index:3}.emoji-dropdown.active{opacity:1;transform:scale(1)}body.animation-level-0 .emoji-dropdown{transition:none}}.emoji-dropdown .emoji-container{height:100%;max-width:100%;overflow:hidden;width:100%}.emoji-dropdown .emoji-tabs{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);justify-content:center}.emoji-dropdown .emoji-tabs:after{content:none}.emoji-dropdown .emoji-tabs-search{margin-left:.5rem!important}.emoji-dropdown .emoji-tabs-search{left:0;position:absolute}.emoji-dropdown .emoji-tabs-delete{margin-right:.5rem!important}.emoji-dropdown .emoji-tabs-delete{position:absolute;right:0}.emoji-dropdown .emoji-tabs .menu-horizontal-div-item{margin:0 .75rem}.emoji-dropdown .tabs-container{height:100%}.emoji-dropdown .stickers-padding .category-items{gap:.25rem;padding:0 .1875rem}.emoji-dropdown #content-gifs .scrollable-y{padding:0 .1875rem}.emoji-dropdown .gifs-masonry{border-radius:10px;overflow:hidden}.emoticons-container{background-color:transparent;flex-direction:column;height:100%;min-height:100%}.emoticons-menu{--item-size:1.875rem;align-items:center;min-height:3.0625rem;padding:0 .3125rem;width:100%;z-index:4}.emoticons-menu,.emoticons-menu-wrapper{background-color:transparent;height:3.0625rem}.emoticons-menu-wrapper{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);max-width:100%;padding:0;position:relative}.emoticons-menu:after{content:\" \";display:block;flex:0 0 auto;height:1px;width:.1875rem}.emoticons-menu .menu-horizontal-div-item{align-items:center;display:flex;flex:0 0 auto;font-size:1.5rem;height:var(--item-size);line-height:var(--item-size);margin:0 .3125rem;padding:0;width:var(--item-size)}.emoticons-menu .menu-horizontal-div-item.not-local{border-radius:.25rem!important}.emoticons-menu .menu-horizontal-div-item.not-local{--item-size:2.375rem;padding:.25rem}.emoticons-menu .menu-horizontal-div-item.active{background-color:rgba(0,0,0,.06)!important;background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-div-item.active,html.no-touch .emoticons-menu .menu-horizontal-div-item:active,html.no-touch .emoticons-menu .menu-horizontal-div-item:hover{color:rgba(0,0,0,.8)!important;color:rgba(var(--primary-text-color-rgb),.8)!important}.emoticons-menu .menu-horizontal-div-item-padding{height:100%;position:relative;width:100%}.emoticons-menu .menu-horizontal-div-item.active:not(.tgico){background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.emoticons-menu .menu-horizontal-inner{border-radius:15px;flex:0 0 auto;margin:0 .3125rem;overflow:hidden;width:1.875rem}html.is-safari .emoticons-menu .menu-horizontal-inner{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner{transition:width .2s ease-in-out}.emoticons-menu .menu-horizontal-inner-scroll{align-items:center;display:flex;height:100%;position:relative;width:8.5rem}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{margin:0!important}.emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transform:scale(1)}body.animation-level-2 .emoticons-menu .menu-horizontal-inner .menu-horizontal-div-item{transition:transform .2s ease-in-out!important}.emoticons-menu .menu-horizontal-inner.active{background-color:rgba(0,0,0,.06)!important;background-color:rgba(var(--primary-text-color-rgb),.06)!important}.emoticons-menu .menu-horizontal-inner.active{width:8.5rem}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item{transform:scale(.8)}.emoticons-menu .menu-horizontal-inner.active .menu-horizontal-div-item.active{background-color:transparent!important}.emoticons-menu .menu-horizontal-inner:not(.active){cursor:pointer}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-inner-scroll{pointer-events:none}.emoticons-menu .menu-horizontal-inner:not(.active) .menu-horizontal-div-item:first-child{pointer-events:all}.emoticons-content{flex:1;padding:0;position:relative}.emoticons-content .emoji-category{position:relative}.emoticons-content .sticky_sentinel--top{height:1px;top:0}.emoticons-content .category-title{color:rgba(0,0,0,.42);color:rgba(var(--primary-text-color-rgb),.42);cursor:pointer;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:1.1875rem;padding:.75rem .875rem .375rem;position:relative;text-align:center;width:100%}.emoticons-content .category-title .btn-icon{font-size:1.25rem;pointer-events:all;position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}.emoticons-content:not(.has-premium) .is-premium-set .category-title:before{content:\"\";line-height:inherit;margin-right:.125rem;vertical-align:middle}.emoji-padding .super-emojis{padding:0 .5rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar{height:0;opacity:0;width:0;width:.375rem}html:not(.is-safari):not(.is-ios) .scrollable::-webkit-scrollbar-thumb{height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-thumb{opacity:0;-webkit-transition:.2s ease-in-out;transition:.2s ease-in-out}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-button{display:none;height:0;width:0}html:not(.is-safari):not(.is-ios) ::-webkit-scrollbar-corner{background-color:transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover{scrollbar-color:rgba(0,0,0,.2) transparent;scrollbar-color:var(--scrollbar-color) transparent}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar{opacity:1}html:not(.is-safari):not(.is-ios) .scrollable:hover::-webkit-scrollbar-thumb{-webkit-backdrop-filter:blur(100);backdrop-filter:blur(100);background-color:rgba(0,0,0,.2);background-color:var(--scrollbar-color);border-radius:10px;max-height:12.5rem;min-height:5rem;opacity:1}.no-scrollbar::-webkit-scrollbar,.scrollable-x::-webkit-scrollbar{display:none}.scrollable{-webkit-overflow-scrolling:touch;bottom:0;height:100%;left:0;max-height:100%;overflow-x:hidden;overflow-y:hidden;position:absolute;right:0;top:0;width:100%}.scrollable.scrollable-x{-ms-overflow-style:none;overflow-x:auto;scrollbar-width:none}.scrollable.scrollable-y{-ms-overflow-style:none;overflow-y:auto;overflow-y:overlay;scrollbar-color:transparent transparent;scrollbar-width:thin;transform:translateZ(0)}.scrollable.scrollable-y.scrollable-y-bordered{border-bottom:1px solid transparent;border-top:1px solid transparent}body.animation-level-2 .scrollable.scrollable-y.scrollable-y-bordered{transition:border-top-color .3s cubic-bezier(.4,0,.2,1),border-bottom-color .3s cubic-bezier(.4,0,.2,1);transition:border-top-color var(--transition-standard-in),border-bottom-color var(--transition-standard-in)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-top){border-top-color:#dfe1e5;border-top-color:var(--border-color)}.scrollable.scrollable-y.scrollable-y-bordered:not(.scrolled-bottom){border-bottom-color:#dfe1e5;border-bottom-color:var(--border-color)}.scrollable-padding{height:100%;min-width:100%}@keyframes scaleIn{0%{transform:scale(.2)}to{transform:scale(1)}}.selector{display:flex;flex-direction:column;height:100%;width:100%}.selector .selector-search-section{margin-bottom:0!important;padding:0!important}.selector .selector-search-section{position:relative;z-index:1}.selector-search-container{flex:0 0 auto;max-height:132px;overflow:hidden;position:relative}.selector-search-container .scrollable{max-height:inherit;position:relative}.selector-search{display:flex;flex-flow:wrap;padding-left:1rem;padding-right:1rem;position:relative}.selector-search-input{border:none;flex:1 1 auto;outline:none}.selector-search .selector-search-input{padding:7px 0 19px}[dir=ltr] .selector-user{padding-right:17px}[dir=rtl] .selector-user{padding-left:17px}[dir=ltr] .selector-user{margin-left:-.25rem;margin-right:.75rem}[dir=rtl] .selector-user{margin-left:.75rem;margin-right:-.25rem}.selector-user{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:1.5rem;color:#000;color:var(--primary-text-color);flex:0 0 auto;font-size:1rem;height:2rem;line-height:2rem;margin-bottom:7px;max-width:11.25rem;overflow:hidden;text-overflow:ellipsis;transition:opacity .2s,transform .2s,background-color .2s;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}body.animation-level-0 .selector-user{transition:none}html.no-touch .selector-user:active,html.no-touch .selector-user:hover{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color);cursor:pointer}html.no-touch .selector-user:active .selector-user-avatar:after,html.no-touch .selector-user:hover .selector-user-avatar:after{opacity:1;transform:scaleX(-1) rotate(-90deg)}body:not(.animation-level-0) .selector-user.scale-in{animation:scaleIn .15s ease forwards}body:not(.animation-level-0) .selector-user.scale-out{animation:scaleIn .1s ease forwards;animation-direction:reverse}[dir=ltr] .selector-user-avatar{margin-right:8px}[dir=rtl] .selector-user-avatar{margin-left:8px}.selector-user-avatar{border-radius:50%!important}.selector-user-avatar{float:left;overflow:hidden;position:relative}.is-rtl .selector-user-avatar{float:right}html.is-safari .selector-user-avatar{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}[dir=ltr] .selector-user-avatar:after{left:0}[dir=rtl] .selector-user-avatar:after{right:0}.selector-user-avatar:after{line-height:32px!important}.selector-user-avatar:after{background-color:#df3f40;background-color:var(--danger-color);content:\"\";font-size:23px;height:100%;opacity:0;position:absolute;top:0;transform:scaleX(-1) rotate(0deg);transition:opacity .2s,transform .2s;width:100%;z-index:2}body.animation-level-0 .selector-user-avatar:after{transition:none}.selector .chatlist-container{flex:1 1 auto;height:100%}.selector>hr{margin:0;padding:0}[dir=ltr] .selector .checkbox{padding-left:11px}[dir=rtl] .selector .checkbox{padding-right:11px}.selector .checkbox{margin-top:11px}.selector .checkbox-field{--offset-left:0!important;margin:0!important;padding:0!important;position:absolute!important}.selector .checkbox-field{pointer-events:none;top:50%;transform:translateY(-50%);z-index:1}[dir=ltr] .selector .checkbox-field:first-child{margin-left:.6875rem;margin-right:1.6875rem}[dir=rtl] .selector .checkbox-field:first-child{margin-left:1.6875rem;margin-right:.6875rem}[dir=ltr] .selector .checkbox-field-round{right:1.125rem}[dir=rtl] .selector .checkbox-field-round{left:1.125rem}.selector .checkbox-field-round{--size:1.25rem}.selector .checkbox-field-round .checkbox-box-border{z-index:auto}.selector .checkbox-field-round .checkbox-box-check{--offset:6px}[dir=ltr] .selector-square .checkbox-field{left:1.25rem!important}[dir=rtl] .selector-square .checkbox-field{right:1.25rem!important}[dir=ltr] .selector-square .chatlist-chat.row-with-padding{padding-left:7.5rem!important}[dir=rtl] .selector-square .chatlist-chat.row-with-padding{padding-right:7.5rem!important}[dir=ltr] .selector-square .dialog-avatar{margin-left:3rem!important}[dir=rtl] .selector-square .dialog-avatar{margin-right:3rem!important}.gifs-masonry{grid-gap:.125rem;display:grid;gap:.125rem;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr)}.gifs-masonry .gif img,.gifs-masonry .gif video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.gifs-masonry .gif img{left:0;position:absolute;top:0}.gifs-masonry .preloader-container{z-index:2}.preloader-circular{animation:rotate 1s linear infinite;bottom:0;height:100%;left:0;margin:auto;position:absolute;right:0;top:0;transform-origin:center center}.preloader-path{stroke-dasharray:93.6375,124.85;stroke-dashoffset:0;stroke-linecap:round;stroke:#fff;stroke-width:3}.preloader-container{bottom:0;cursor:pointer;display:flex;height:54px;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transform:scale(0);width:54px}body:not(.animation-level-0) .preloader-container{transition:opacity .2s ease-in-out,transform .2s ease-in-out}.preloader-container.is-visible:not(.backwards){opacity:1;transform:scale(1)}.preloader-container{--color:#fff}.preloader-container .you-spin-me-round{height:100%;width:100%}.preloader-container .preloader-circular{animation:none;background-color:rgba(0,0,0,.3);border-radius:50%;height:100%;width:100%}.preloader-container .preloader-path-new{stroke-dasharray:5,149.82;stroke-dashoffset:0;stroke-linecap:round;stroke:var(--color);stroke-width:2}body.animation-level-2 .preloader-container.is-visible.animating .you-spin-me-round,body.animation-level-2 .preloader-container.is-visible:not(.manual) .you-spin-me-round{animation:rotate 2s linear infinite}body.animation-level-2 .preloader-container.is-visible.animating .preloader-path-new,body.animation-level-2 .preloader-container.is-visible:not(.manual) .preloader-path-new{transition:stroke-dasharray .2s ease-in-out,stroke-width .2s ease-in-out}.preloader-container.preloader-swing{cursor:default}.preloader-container.preloader-swing .you-spin-me-round{animation:rotate 1s linear infinite!important}.preloader-container.preloader-swing .preloader-path-new{stroke-dasharray:112.36,149.82}.preloader-container.preloader-swing.preloader-streamable .preloader-path-new{stroke-dasharray:88.95,118.61}.preloader-container .preloader-close,.preloader-container .preloader-download{bottom:0;color:var(--color);height:56%;left:0;margin:auto;opacity:1;position:absolute;right:0;top:0;width:56%}body.animation-level-2 .preloader-container .preloader-close,body.animation-level-2 .preloader-container .preloader-download{transition:opacity .2s ease-in-out}.preloader-container .preloader-close path,.preloader-container .preloader-download path{fill:var(--color)}html.no-touch .preloader-container .preloader-close:active,html.no-touch .preloader-container .preloader-close:hover,html.no-touch .preloader-container .preloader-download:active,html.no-touch .preloader-container .preloader-download:hover{background:none}.preloader-container.manual .preloader-close,.preloader-container:not(.manual) .preloader-download{opacity:0}.preloader-container.manual .preloader-path-new{stroke-width:0}.preloader-container .preloader-download{height:1.5rem;width:1.5rem}.preloader-container.preloader-streamable,.preloader-container.preloader-streamable svg{cursor:pointer!important}.preloader-container.preloader-streamable circle{stroke-width:2.5!important}.preloader-container.preloader-streamable:after{background-color:var(--color);border-radius:.125rem;content:\"\";height:.8125rem;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:.8125rem}.preloader-container.preloader-transparent .preloader-circular{background-color:transparent}.preloader-container.preloader-bold .preloader-path-new{stroke-width:3.5}@keyframes rotate{to{transform:rotate(1turn)}}@keyframes dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes dashNew{0%{stroke-dasharray:1,149.82;stroke-dashoffset:0}50%{stroke-dasharray:112.36,149.82;stroke-dashoffset:-38}to{stroke-dasharray:112.36,149.82;stroke-dashoffset:-149.82}}@keyframes dashNewStreamable{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-237%}}.rp{position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.btn-corner.rp .c-ripple,.btn-menu-toggle.rp .c-ripple,.menu-horizontal-div-item.rp .c-ripple,.pinned-container-wrapper.rp .c-ripple,.rp-overflow .c-ripple{border-radius:inherit;height:100%;overflow:hidden;width:100%}.btn-corner.rp .c-ripple__circle,.btn-menu-toggle.rp .c-ripple__circle,.menu-horizontal-div-item.rp .c-ripple__circle,.pinned-container-wrapper.rp .c-ripple__circle,.rp-overflow .c-ripple__circle{overflow:hidden}.c-ripple{--ripple-duration:.7s;bottom:0;left:0;position:absolute;right:0;top:0}html.is-safari .c-ripple:not(:empty){border-radius:inherit;-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.c-ripple__circle{animation:ripple-effect .7s forwards;background-color:rgba(0,0,0,.08);background-color:var(--ripple-color);border-radius:50%;display:block;pointer-events:none;position:absolute;transform:scale(0);transition:opacity .35s,background-color .35s}.c-ripple__circle.hiding,.c-ripple__square.hiding{opacity:0}@media only screen and (max-width:925px){.c-ripple{--ripple-duration:.4s}.c-ripple__circle{animation-duration:.4s;animation-name:ripple-effect-handhelds;transition-duration:.3s}}@keyframes ripple-effect{0%{transform:scale(0)}to{transform:scale(2)}}@keyframes ripple-effect-handhelds{0%{transform:scale(.27)}to{transform:scale(2)}}.avatar-like{line-height:var(--size)!important}.avatar-like{--size:54px;--multiplier:1;color:#fff;font-size:calc(1.25rem/var(--multiplier));font-weight:500;font-weight:var(--font-weight-bold);height:var(--size);text-align:center;text-transform:uppercase;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--size)}avatar-element{--color-top:var(--avatar-color-top);--color-bottom:var(--avatar-color-bottom);background:linear-gradient(var(--color-top),var(--color-bottom));border-radius:50%}avatar-element[data-color=red]{--color-top:var(--peer-avatar-red-top);--color-bottom:var(--peer-avatar-red-bottom)}avatar-element[data-color=orange]{--color-top:var(--peer-avatar-orange-top);--color-bottom:var(--peer-avatar-orange-bottom)}avatar-element[data-color=violet]{--color-top:var(--peer-avatar-violet-top);--color-bottom:var(--peer-avatar-violet-bottom)}avatar-element[data-color=green]{--color-top:var(--peer-avatar-green-top);--color-bottom:var(--peer-avatar-green-bottom)}avatar-element[data-color=cyan]{--color-top:var(--peer-avatar-cyan-top);--color-bottom:var(--peer-avatar-cyan-bottom)}avatar-element[data-color=pink]{--color-top:var(--peer-avatar-pink-top);--color-bottom:var(--peer-avatar-pink-bottom)}avatar-element[data-color=blue]{--color-top:var(--peer-avatar-blue-top);--color-bottom:var(--peer-avatar-blue-bottom)}avatar-element.tgico:before{font-size:calc(32px/var(--multiplier))}avatar-element.tgico-calendarfilter:before{font-size:calc(36px/var(--multiplier))}avatar-element.tgico-saved:before{font-size:calc(30px/var(--multiplier))!important}avatar-element.tgico-reply_filled:before{font-size:calc(28px/var(--multiplier))!important}avatar-element.tgico-deletedaccount{--color-top:var(--peer-avatar-archive-top);--color-bottom:var(--peer-avatar-archive-bottom);overflow:hidden}avatar-element.tgico-deletedaccount:before{font-size:calc(30px/var(--multiplier))}avatar-element:before{line-height:inherit!important}avatar-element.media-container{position:relative}avatar-element img{border-radius:inherit!important;height:var(--size)!important;width:var(--size)!important}avatar-element img{display:block}avatar-element img.fade-in{animation:fade-in-opacity .2s ease forwards}avatar-element img.emoji{height:calc(1.125rem/var(--multiplier))!important;vertical-align:middle!important;width:calc(1.125rem/var(--multiplier))!important}avatar-element.is-forum{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}avatar-element.is-topic{background:none;border-radius:0;position:relative}avatar-element.is-topic .topic-icon{--size:inherit}avatar-element.is-online{position:relative}avatar-element.is-online:after{background-color:#0ac630;background-color:var(--avatar-online-color);border:2px solid #fff;border:2px solid var(--surface-color);border-radius:50%;content:\" \";display:block;height:14px;left:2.4375rem;position:absolute;top:2.4375rem;width:14px}avatar-element[clickable]{cursor:pointer}avatar-element.avatar-relative{position:relative}avatar-element.avatar-120{--size:120px;--multiplier:.45}avatar-element.avatar-100{--size:100px;--multiplier:.54}avatar-element.avatar-48{--size:48px;--multiplier:1.125}avatar-element.avatar-46{--size:46px;--multiplier:1.173913}avatar-element.avatar-44{--size:44px;--multiplier:1.227272}avatar-element.avatar-42{--size:42px;--multiplier:1.285714}avatar-element.avatar-40{--size:40px;--multiplier:1.35}avatar-element.avatar-36{--size:36px;--multiplier:1.5}avatar-element.avatar-35{--size:35px;--multiplier:1.542857}avatar-element.avatar-34{--size:34px;--multiplier:1.588235}avatar-element.avatar-32{--size:32px;--multiplier:1.6875}avatar-element.avatar-30{--size:30px;--multiplier:1.6875}avatar-element.avatar-26{--size:26px;--multiplier:2.076923}avatar-element.avatar-24{--size:24px;--multiplier:2.25}avatar-element.avatar-22{--size:22px;--multiplier:2.454545}avatar-element.avatar-18{--size:18px;--multiplier:3}avatar-element.avatar-16{--size:16px;--multiplier:3.375}.avatar-relative .avatar-photo{left:0;position:absolute;top:0}.avatar-full{align-items:center;border-radius:inherit;display:inline-flex;height:100%;justify-content:center;position:absolute;width:100%}.avatar-full .avatar-photo{height:100%!important;width:100%!important}.avatar-full .avatar-photo{-o-object-fit:cover;object-fit:cover}.document{--background-color:var(--primary-color);height:70px}.document .media-photo{border-radius:inherit}.document .media-photo.thumbnail{left:0}.document-ico{background-color:#f4f4f5;background-color:var(--background-color);border-radius:.375rem;line-height:1;text-align:center}html.is-safari .document-ico{-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.document-ico-text{opacity:0}body.animation-level-2 .document-ico-text{transition:opacity .2s ease-in-out}.document:not(.document-with-thumb) .document-ico{padding:1.5625rem .25rem 0}@media only screen and (max-width:600px){.document:not(.document-with-thumb) .document-ico{font-size:14px;padding:1.5rem 0 0}.document:not(.document-with-thumb) .document-ico:after{--size:.875rem}}.document-ico:after{--size:1.125rem;border-bottom-color:rgba(0,0,0,.25);border-bottom-left-radius:.25rem;border-left-color:rgba(0,0,0,.25);border-right-color:#fff;border-right-color:var(--message-background-color);border-style:solid;border-top-color:#fff;border-top-color:var(--message-background-color);border-width:calc(var(--size)/2);content:\"\";display:block;position:absolute;right:0;top:0}body.animation-level-2 .document-ico:after{transition:border-width .2s ease-in-out}html.no-touch .document:not(.downloaded):active .document-ico:after,html.no-touch .document:not(.downloaded):hover .document-ico:after{border-width:0}html.no-touch .document:not(.downloaded):active .document-ico-text,html.no-touch .document:not(.downloaded):hover .document-ico-text{opacity:0}html.no-touch .document:not(.downloaded):active .preloader-container,html.no-touch .document:not(.downloaded):hover .preloader-container{opacity:1!important}.document:not(.downloading) .document-ico-text{opacity:1}.document:not(.downloading) .preloader-container{opacity:0!important}.document.downloading .document-ico:after{border-width:0}.document-ico{background-size:contain;font-size:1.125rem}.document-ico,.document-name,.document-size{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.document.ext-zip{--background-color:#fb8c00}.document.ext-pdf{--background-color:#df3f40}.document.ext-apk{--background-color:#43a047}.document.document-with-thumb{--background-color:#fff}.document.document-with-thumb .document-ico:after{display:none}.document.document-with-thumb .document-download{background-color:rgba(0,0,0,.2);border-radius:.375rem}.document.document-with-thumb .preloader-circular{transition:background-color .2s}.document.document-with-thumb .preloader-container:not(.manual) .preloader-circular{background-color:rgba(0,0,0,.3)!important}.document-thumb{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.document-name{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16);white-space:nowrap}.document-size{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);pointer-events:none;position:relative}.document .preloader-container{height:2.5rem;width:2.5rem}@media only screen and (max-width:600px){.document .preloader-container{height:1.625rem;width:1.625rem}}.document .preloader-circular{background-color:transparent!important}.document .preloader-path-new{stroke-width:2.5}.audio,.document{--icon-size:3.375rem;--icon-margin:.875rem;--padding-left:calc(var(--icon-size) + var(--icon-margin));cursor:pointer;display:flex;flex-direction:column;justify-content:center;padding-left:var(--padding-left);-webkit-user-select:none;-moz-user-select:none;user-select:none}.audio-download,.audio-ico,.document-download,.document-ico{color:#fff;height:var(--icon-size);margin-left:calc(var(--padding-left)*-1);position:absolute;width:var(--icon-size)}.audio-download,.document-download{align-items:center;cursor:pointer;display:flex;font-size:1.5rem;justify-content:center;opacity:1;transition:opacity .2s ease-in-out;z-index:1}.audio-download.downloaded,.document-download.downloaded{opacity:0}.audio-description,.document-description{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio:not(.corner-download) .preloader-container:not(.preloader-streamable),.document:not(.corner-download) .preloader-container:not(.preloader-streamable){transform:scale(1)!important}.audio .checkbox-field-round,.document .checkbox-field-round{--margin-top:.25rem;--margin-left:.125rem;left:auto;margin-left:calc(var(--padding-left)*-1 + var(--icon-size) - var(--size) + var(--margin-left));margin-top:calc(var(--icon-size) - var(--size) + var(--margin-top));top:auto}.audio-ico{display:flex;justify-content:center}.audio-ico.tgico-largeplay:before{margin-right:-1px}.audio .preloader-circular{background-color:transparent!important}.audio .preloader-container:not(.preloader-streamable){height:100%;width:100%}.audio{overflow:visible!important}.audio{--icon-size:3rem;--icon-margin:.5625rem;height:var(--icon-size)}.audio-download,.audio-toggle{align-items:center;background-color:#3390ec;background-color:var(--primary-color);border-radius:50%}.audio.corner-download .audio-download{display:flex!important;margin:0!important}.audio.corner-download .audio-download{background:none;height:1.375rem;left:57.5%;top:57.5%;width:1.375rem}.audio.corner-download .preloader-container{background-color:#3390ec;background-color:var(--primary-color);border-radius:inherit}.audio.corner-download .preloader-path-new{stroke-width:.25rem}.audio-play-icon{border-radius:inherit;bottom:0;left:0;max-height:100%;max-width:100%;overflow:hidden;position:absolute;right:0;top:0;transform:rotate(-119deg)}body.animation-level-2 .audio-play-icon{transition:transform .25s ease-in-out}.audio-toggle .part{background-color:#fff;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}body.animation-level-2 .audio-toggle .part{transition:-webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out, -webkit-clip-path .25s ease-in-out;transition:clip-path .25s ease-in-out,-webkit-clip-path .25s ease-in-out}@media only screen and (min-width:601px){.audio-toggle .part{height:140px;width:140px}}@media only screen and (max-width:600px){.audio-toggle .part{height:92px;width:92px}}.audio-toggle .part.one{-webkit-clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%);clip-path:polygon(56.42249% 57.01763%,54.93283% 57.0175%,53.00511% 57.01738%,50.83554% 57.01727%,48.62036% 57.01718%,46.55585% 57.01709%,44.83822% 57.01702%,43.66373% 57.01698%,43.22863% 57.01696%,42.86372% 57.01904%,42.56988% 57.01621%,42.3402% 56.99486%,42.16778% 56.94152%,42.0457% 56.84267%,41.96705% 56.68478%,41.92493% 56.45432%,41.91246% 56.13777%,41.91258% 55.76282%,41.9129% 55.37058%,41.91335% 54.96757%,41.91387% 54.56032%,41.91439% 54.15537%,41.91485% 53.75926%,41.91517% 53.3785%,41.91529% 53.01965%,41.94275% 52.72355%,42.02117% 52.51653%,42.14465% 52.38328%,42.30727% 52.30854%,42.50308% 52.27699%,42.72619% 52.27341%,42.97065% 52.28248%,43.23056% 52.2889%,43.94949% 52.28896%,45.45083% 52.28912%,47.47445% 52.28932%,49.76027% 52.28957%,52.04818% 52.28981%,54.07805% 52.29003%,55.5898% 52.29019%,56.32332% 52.29024%,56.58221% 52.28816%,56.83726% 52.28948%,57.07897% 52.30593%,57.29794% 52.34898%,57.48468% 52.43029%,57.62978% 52.56146%,57.72375% 52.7541%,57.75718% 53.01981%,57.75713% 53.37763%,57.75699% 53.81831%,57.75679% 54.31106%,57.75657% 54.82507%,57.75635% 55.32958%,57.75615% 55.79377%,57.75601% 56.18684%,57.75596% 56.47801%,57.7549% 56.50122%,57.74034% 56.5624%,57.6955% 56.64887%,57.60334% 56.748%,57.44691% 56.84712%,57.20925% 56.93358%,56.87342% 56.99471%)}.audio-toggle .part.two{-webkit-clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%);clip-path:polygon(56.42249% 42.44625%,54.93283% 42.44637%,53.00511% 42.44649%,50.83554% 42.4466%,48.62036% 42.4467%,46.55585% 42.44679%,44.83822% 42.44685%,43.66373% 42.4469%,43.22863% 42.44691%,42.86372% 42.44483%,42.56988% 42.44767%,42.3402% 42.46902%,42.16778% 42.52235%,42.0457% 42.6212%,41.96705% 42.77909%,41.92493% 43.00956%,41.91246% 43.32611%,41.91258% 43.70105%,41.9129% 44.0933%,41.91335% 44.49631%,41.91387% 44.90355%,41.91439% 45.3085%,41.91485% 45.70462%,41.91517% 46.08537%,41.91529% 46.44422%,41.94275% 46.74032%,42.02117% 46.94735%,42.14465% 47.0806%,42.30727% 47.15534%,42.50308% 47.18688%,42.72619% 47.19047%,42.97065% 47.1814%,43.23056% 47.17497%,43.94949% 47.17491%,45.45083% 47.17476%,47.47445% 47.17455%,49.76027% 47.1743%,52.04818% 47.17406%,54.07805% 47.17384%,55.5898% 47.17369%,56.32332% 47.17363%,56.58221% 47.17571%,56.83726% 47.17439%,57.07897% 47.15795%,57.29794% 47.1149%,57.48468% 47.03359%,57.62978% 46.90242%,57.72375% 46.70977%,57.75718% 46.44406%,57.75713% 46.08625%,57.75699% 45.64557%,57.75679% 45.15282%,57.75657% 44.6388%,57.75635% 44.1343%,57.75615% 43.6701%,57.75601% 43.27703%,57.75596% 42.98586%,57.7549% 42.96265%,57.74034% 42.90148%,57.6955% 42.815%,57.60334% 42.71587%,57.44691% 42.61675%,57.20925% 42.53029%,56.87342% 42.46916%)}.audio-toggle.playing .audio-play-icon{transform:rotate(-90deg)}@media only screen and (min-width:601px){.audio-toggle:not(.playing) .part{height:136px;width:136px}}@media only screen and (max-width:600px){.audio-toggle:not(.playing) .part{height:92px;width:92px}}.audio-toggle:not(.playing) .part.one{-webkit-clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%);clip-path:polygon(43.77666% 55.85251%,43.77874% 55.46331%,43.7795% 55.09177%,43.77934% 54.74844%,43.77855% 54.44389%,43.77741% 54.18863%,43.77625% 53.99325%,43.77533% 53.86828%,43.77495% 53.82429%,43.77518% 53.55329%,43.7754% 53.2823%,43.77563% 53.01131%,43.77585% 52.74031%,43.77608% 52.46932%,43.7763% 52.19832%,43.77653% 51.92733%,43.77675% 51.65633%,43.77653% 51.38533%,43.7763% 51.11434%,43.77608% 50.84334%,43.77585% 50.57235%,43.77563% 50.30136%,43.7754% 50.03036%,43.77518% 49.75936%,43.77495% 49.48837%,44.48391% 49.4885%,45.19287% 49.48865%,45.90183% 49.48878%,46.61079% 49.48892%,47.31975% 49.48906%,48.0287% 49.4892%,48.73766% 49.48934%,49.44662% 49.48948%,50.72252% 49.48934%,51.99842% 49.4892%,53.27432% 49.48906%,54.55022% 49.48892%,55.82611% 49.48878%,57.10201% 49.48865%,58.3779% 49.4885%,59.6538% 49.48837%,59.57598% 49.89151%,59.31883% 50.28598%,58.84686% 50.70884%,58.12456% 51.19714%,57.11643% 51.78793%,55.78697% 52.51828%,54.10066% 53.42522%,52.02202% 54.54581%,49.96525% 55.66916%,48.3319% 56.57212%,47.06745% 57.27347%,46.11739% 57.79191%,45.42719% 58.14619%,44.94235% 58.35507%,44.60834% 58.43725%,44.37066% 58.41149%,44.15383% 58.27711%,43.99617% 58.0603%,43.88847% 57.77578%,43.82151% 57.43825%,43.78608% 57.06245%,43.77304% 56.66309%,43.773% 56.25486%)}.audio-toggle:not(.playing) .part.two{-webkit-clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%);clip-path:polygon(43.77666% 43.83035%,43.77874% 44.21955%,43.7795% 44.59109%,43.77934% 44.93442%,43.77855% 45.23898%,43.77741% 45.49423%,43.77625% 45.68961%,43.77533% 45.81458%,43.77495% 45.85858%,43.77518% 46.12957%,43.7754% 46.40056%,43.77563% 46.67156%,43.77585% 46.94255%,43.77608% 47.21355%,43.7763% 47.48454%,43.77653% 47.75554%,43.77675% 48.02654%,43.77653% 48.29753%,43.7763% 48.56852%,43.77608% 48.83952%,43.77585% 49.11051%,43.77563% 49.38151%,43.7754% 49.65251%,43.77518% 49.9235%,43.77495% 50.1945%,44.48391% 50.19436%,45.19287% 50.19422%,45.90183% 50.19408%,46.61079% 50.19394%,47.31975% 50.1938%,48.0287% 50.19366%,48.73766% 50.19353%,49.44662% 50.19338%,50.72252% 50.19353%,51.99842% 50.19366%,53.27432% 50.1938%,54.55022% 50.19394%,55.82611% 50.19408%,57.10201% 50.19422%,58.3779% 50.19436%,59.6538% 50.1945%,59.57598% 49.79136%,59.31883% 49.39688%,58.84686% 48.97402%,58.12456% 48.48572%,57.11643% 47.89493%,55.78697% 47.16458%,54.10066% 46.25764%,52.02202% 45.13705%,49.96525% 44.01371%,48.3319% 43.11074%,47.06745% 42.4094%,46.11739% 41.89096%,45.42719% 41.53667%,44.94235% 41.3278%,44.60834% 41.24561%,44.37066% 41.27137%,44.15383% 41.40575%,43.99617% 41.62256%,43.88847% 41.90709%,43.82151% 42.24461%,43.78608% 42.62041%,43.77304% 43.01978%,43.773% 43.428%)}.audio-download{z-index:2}.audio-waveform{height:100%}.audio-waveform-background rect{opacity:.3}html.no-touch .audio-waveform-background rect:active,html.no-touch .audio-waveform-background rect:hover{opacity:1}.audio-waveform-fake{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;width:0}.audio-waveform-container{height:23px;margin-top:1px;position:relative}.audio-waveform rect{fill:#3390ec;fill:var(--primary-color)}.audio .audio-details{margin-bottom:0;margin-top:3px}.audio .audio-title{margin-bottom:-2px}.audio .part{height:112px!important;width:112px!important}@media only screen and (max-width:600px){.audio .part{height:100px!important;width:100px!important}}.audio-title{color:#000;color:var(--primary-text-color);font-size:1rem}.audio-description:not(:empty):before{content:\" • \"}.audio-subtitle,.audio-time{color:#707579;color:var(--secondary-text-color);display:flex;font-size:.875rem}@media only screen and (max-width:600px){.audio-subtitle,.audio-time{font-size:.75rem}}.audio-subtitle,.audio-time,.audio-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.audio-subtitle{align-items:center}.audio-subtitle .audio-time{flex:0 0 auto;margin-right:.25rem}.audio-subtitle,.audio-title{margin-left:-1px}.audio-title,.audio:not(.audio-show-progress) .audio-subtitle{max-width:100%}.audio.is-voice .audio-time{align-items:center;line-height:1;margin-left:-1px;margin-top:7px}@media only screen and (max-width:600px){.audio.is-voice .audio-time{margin-top:.3125rem}.audio.is-voice .audio-waveform-container{height:16px;margin-top:0}}.audio.is-voice.is-unread .audio-time:after{background-color:#3390ec;background-color:var(--primary-color);border-radius:50%;content:\" \";height:.5rem;margin-left:.375rem;width:.5rem}.audio.is-voice.is-unread:not(.is-out) .audio-toggle:not(.playing)+.audio-waveform-container .audio-waveform-background rect{opacity:1}.audio .progress-line{--height:2px;--border-radius:4px;--thumb-size:.75rem;flex:1 1 auto;margin:0 6px 0 5px}.audio-with-thumb .audio-play-icon{background-color:transparent;opacity:1;z-index:1}body.animation-level-2 .audio-with-thumb .audio-play-icon{transition:transform .25s ease-in-out,background-color .2s ease-in-out,opacity .2s ease-in-out}.audio-with-thumb .audio-play-icon .part{background-color:#fff!important}.audio-with-thumb .audio-play-icon:not(:last-child){background-color:rgba(0,0,0,.3)}.audio-with-thumb .media-photo{border-radius:inherit;height:inherit;-o-object-fit:cover;object-fit:cover;width:inherit}.audio-with-thumb:not(.corner-download) .audio-download{background-color:rgba(0,0,0,.3)}.audio-with-thumb:not(.corner-download).downloading .audio-play-icon{opacity:0}.quiz-hint{align-items:center;display:flex;justify-content:center;left:0;position:absolute;top:8px;transform:translate3d(0,calc(-100% - 10px),0);transition:transform .2s ease;width:100%}body.animation-level-0 .quiz-hint{transition:none}.quiz-hint.active{transform:translateZ(0)}[dir=ltr] .quiz-hint .container{text-align:left}[dir=rtl] .quiz-hint .container{text-align:right}.quiz-hint .container{align-items:center;background:rgba(0,0,0,.7);border-radius:12px;color:#fff;display:flex;flex-wrap:wrap;font-size:15px;line-height:1.5;max-width:400px;min-height:48px;overflow:hidden;padding:10px 18px 12px 50px;position:relative;text-align:center;width:auto}@media only screen and (max-width:600px){.quiz-hint .container{font-size:14px;margin:0 10px;padding:10px 18px 12px 54px}}.quiz-hint .container .text{word-break:break-word}.quiz-hint .container:before{content:\"\";font-size:1.5rem;left:15px;position:absolute;top:12px}.quiz-hint .container a{border-bottom:1px solid #fff;color:#fff}.peer-typing{margin-right:4px}.peer-typing-container{--color:var(--primary-color);color:var(--color)}.peer-typing-flex{align-items:center;display:flex}.peer-typing:not(.peer-typing-text):not(.peer-typing-choosing-sticker){display:inline-block;transform:translateY(-1px);vertical-align:middle}.peer-typing-text-dot{animation-duration:.6s;animation-iteration-count:infinite;animation-name:dotMiddle;animation-timing-function:linear;background-color:var(--color);border-radius:50%;display:inline-block;height:6px;margin:0 .5px;vertical-align:middle;width:6px}.peer-typing-text-dot:first-child{animation-name:dotFirst}.peer-typing-text-dot:last-child{animation-name:dotLast}.peer-typing-upload{border-radius:2px;height:5px;margin-right:.375rem;overflow:hidden;position:relative;width:13px}.peer-typing-upload:after,.peer-typing-upload:before{background-color:var(--color);border-radius:inherit;bottom:0;content:\" \";display:block;left:0;position:absolute;right:0;top:0}.peer-typing-upload:before{opacity:.3}.peer-typing-upload:after{animation:upload 1s ease-in-out infinite}.peer-typing-record{margin-right:.375rem}.peer-typing-record:before{animation:recordBlink 1.25s infinite;background-color:var(--color);border-radius:50%;content:\" \";display:block;height:6px;width:6px}.peer-typing-choosing-sticker{align-items:center;display:flex;flex:0 0 auto;height:16px;margin-right:.375rem}.peer-typing-choosing-sticker-eye{animation:eye 1.8s ease-in-out infinite;border:1px solid var(--color);border-radius:50%;display:inline-block;height:14px;margin:0 .0625rem;position:relative;vertical-align:middle;width:8px}.peer-typing-choosing-sticker-eye:before{animation:eye-move 1.8s ease-in-out infinite;background-color:var(--color);border-radius:50%;content:\" \";display:block;height:.25rem;position:absolute;top:50%;transform:translate(-1px,-50%);width:.25rem}@keyframes dotFirst{0%{opacity:.8;transform:scale(.6666666667)}50%{opacity:.8;transform:scale(.6666666667)}75%{opacity:1;transform:scale(1)}to{opacity:.8;transform:scale(.6666666667)}}@keyframes dotMiddle{0%{opacity:.9;transform:scale(.8333333333)}12.5%{opacity:.8;transform:scale(.6666666667)}62.5%{opacity:.8;transform:scale(.6666666667)}87.5%{opacity:1;transform:scale(1)}to{opacity:.9;transform:scale(.8333333333)}}@keyframes dotLast{0%{opacity:1;transform:scale(1)}25%{opacity:.8;transform:scale(.6666666667)}75%{opacity:.8;transform:scale(.6666666667)}to{opacity:1;transform:scale(1)}}@keyframes upload{0%{transform:translateX(-13px)}to{transform:translate(13px)}}@keyframes eye{0%{transform:scale(1.1) translateX(-.75px)}12.5%{transform:scale(1) translateX(0)}25%{transform:scale(1.1) translateX(.375px)}50%{transform:scale(1.1) translateX(.75px)}62.5%{transform:scale(1) translateX(0)}75%{transform:scale(1.1) translateX(-.375px)}to{transform:scale(1.1) translateX(-.75px)}}@keyframes eye-move{0%{transform:translate(-1px,-50%)}25%{transform:translate(3px,-50%)}50%{transform:translate(3px,-50%)}75%{transform:translate(-1px,-50%)}to{transform:translate(-1px,-50%)}}poll-element{color:#000;color:var(--primary-text-color);display:block;margin-top:-1px;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:330px}@media only screen and (max-width:600px){poll-element{max-width:100%;width:240px}}poll-element:not(.is-closed):not(.is-voted) .poll-answer{cursor:pointer}poll-element .poll-title{font-weight:500;font-weight:var(--font-weight-bold)}@media only screen and (max-width:600px){poll-element .poll-title{max-width:88%;white-space:normal}}poll-element .poll-desc{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:14px;margin-bottom:5px;margin-top:2px;position:relative}poll-element .poll-type{margin-top:2px}poll-element .poll-hint{color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1.5rem;position:absolute;right:2px;top:-4px;transform:scale(1)}body.animation-level-2 poll-element .poll-hint{transition:transform .2s ease}poll-element .poll-hint.active{pointer-events:none;transform:scale(0)}poll-element .poll-send-vote{cursor:default}poll-element .poll-avatars{cursor:pointer;display:flex;margin-left:18px}poll-element .poll-avatar{border:1px solid #dfe1e5;border:1px solid var(--border-color);cursor:pointer;height:18px;width:18px}poll-element .poll-answer{display:flex;margin-top:1px;padding-bottom:20px;padding-left:28px;position:relative}poll-element .poll-answer-text{margin-left:12px;margin-top:6px}[dir=ltr] poll-element .poll-answer-percents{text-align:right}[dir=rtl] poll-element .poll-answer-percents{text-align:left}poll-element .poll-answer-percents{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);left:0;margin-left:-9px;margin-top:7px;opacity:0;position:absolute;top:0;width:40px}poll-element .poll-answer-selected{align-items:center;background:#3390ec;background:var(--primary-color);border-radius:50%;bottom:1px;color:#fff;display:flex;font-size:.75rem;font-weight:500;font-weight:var(--font-weight-bold);height:16px;justify-content:center;left:15px;opacity:1;position:absolute;width:16px}poll-element .poll-answer-selected:before{content:\"\";font-weight:500;font-weight:var(--font-weight-bold)}html.no-touch poll-element .poll-answer:active .animation-ring,html.no-touch poll-element .poll-answer:hover .animation-ring{transform:scale(1);visibility:visible}poll-element .poll-answer.is-voting .progress-ring__circle{stroke-dashoffset:-19.792;animation:pollAnswerRotate .65s linear infinite}poll-element .poll-answer:not(.is-correct):not(.is-chosen) .poll-answer-selected{opacity:0}poll-element .poll-answer.is-chosing .circle-hover .poll-answer-selected{opacity:1}poll-element .poll-answer.is-chosing~.poll-footer .poll-send-vote{cursor:pointer}poll-element .poll-votes-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;margin-top:-.5rem}poll-element .poll-line{stroke-dashoffset:0;stroke-dasharray:0,485.9;bottom:2px;height:35px;left:10px;position:absolute}poll-element .poll-line use{stroke-width:4px;stroke-linecap:round;stroke:#3390ec;stroke:var(--primary-color);fill:none}poll-element .poll-footer{height:2.875rem;margin:-.375rem -.5rem -.375rem -.625rem;text-align:center}poll-element .poll-footer-button{border-top-left-radius:0!important;border-top-right-radius:0!important}poll-element .poll-footer-button{color:#3390ec;color:var(--primary-color);cursor:pointer;font-size:1rem;font-weight:500;font-weight:var(--font-weight-bold);height:100%;overflow:hidden;width:100%}poll-element .poll-footer,poll-element .poll-footer-button{align-items:center;display:flex;justify-content:center}poll-element .poll-quiz-timer{stroke:#a3adb6;fill:none;stroke-linecap:round;height:32px;position:absolute;right:-2px;top:-7px;transform:rotate(270deg);width:32px}poll-element .poll-time{color:#a3adb6;font-size:12px;font-weight:500;font-weight:var(--font-weight-bold);position:absolute;right:27px}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) use{stroke:#df3f40;stroke:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected{background:#df3f40;background:var(--danger-color)}poll-element.is-quiz .poll-answer.is-chosen:not(.is-correct) .poll-answer-selected:before{content:\"\";font-size:12px}poll-element .circle-hover{align-items:center;display:flex;height:34px;justify-content:center;left:-1px;position:absolute;top:-1px;transform:scale(1);width:34px}poll-element .circle-hover .poll-answer-selected{display:flex!important}poll-element .circle-hover .poll-answer-selected{animation:none;font-size:20px;height:20px;left:50%;line-height:16px;opacity:0;top:50%;transform:translate(-50%,-50%);width:20px}body.animation-level-2 poll-element .circle-hover .poll-answer-selected{transition:opacity .2s ease}poll-element .animation-ring{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;display:block;height:34px;transform:scale(.1);visibility:hidden;width:34px}body.animation-level-2 poll-element .animation-ring{transition:transform .12s ease}poll-element .progress-ring{height:26px;left:auto;top:auto;width:26px}poll-element .progress-ring__circle{stroke-dasharray:56.5487,56.5487;stroke-dashoffset:0;stroke-opacity:1;stroke-width:2;stroke:#dfe1e5;stroke:var(--poll-circle-color);fill:transparent;transform:rotate(-90deg);transform-origin:center}poll-element.is-voted .animation-ring,poll-element.is-voted .circle-hover{transform:scale(0)}poll-element.is-voted .poll-answer-percents{opacity:1}poll-element.is-retracting .circle-hover{transition-delay:.24s}poll-element.is-retracting .animation-ring{transition-delay:.22s}poll-element.animating .poll-line{transition:stroke-dashoffset .34s linear,stroke-dasharray .34s linear}poll-element.animating .poll-answer-selected{transition-delay:.24s;transition:opacity forwards .1s ease}poll-element.animating.is-retracting .poll-answer-selected{transition-delay:0s}poll-element.animating .poll-answer-percents{transition:opacity .34s}poll-element.animating .progress-ring__circle{transition:stroke-dashoffset .15s}poll-element.animating .circle-hover{transition:transform .1s}poll-element.is-multiple .poll-desc{margin-bottom:.5rem}poll-element .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}@keyframes pollAnswerRotate{to{transform:rotate(270deg)}}.transition>.transition-item{animation-fill-mode:forwards!important}.transition>.transition-item{height:100%;left:0;position:absolute;top:0;width:100%}.transition>.transition-item:not(.active):not(.from):not(.to){display:none!important}.transition.zoom-fade>.from{opacity:1;transform:scale(1);transform-origin:center}.transition.zoom-fade>.to{opacity:0;transform-origin:center}.transition.zoom-fade.animating>.from{animation:fade-out-opacity .15s ease}.transition.zoom-fade.animating>.to{animation:fade-in-opacity .15s ease,zoom-fade-in-move .15s ease}.transition.zoom-fade.backwards>.from{transform:scale(1)}.transition.zoom-fade.backwards>.to{transform:scale(.95)}.transition.zoom-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .1s ease,zoom-fade-in-backwards-move .15s ease}.transition.zoom-fade.backwards.animating>.to{animation:fade-out-backwards-opacity .15s ease,zoom-fade-out-backwards-move .15s ease}.transition.slide-fade{--easeOutSine:cubic-bezier(.39,.575,.565,1);--easeInSine:cubic-bezier(.47,0,.745,.715);position:relative}.transition.slide-fade>.from{opacity:1;transform:translateX(0);transform-origin:left center}.transition.slide-fade>.to{opacity:0;transform:translateX(1.5rem);transform-origin:left center}.transition.slide-fade.animating>.from{animation:fade-out-opacity .4s ease-out,slide-fade-out-move .4s}.transition.slide-fade.animating>.to{animation:fade-in-opacity .4s var(--easeInSine),slide-fade-in-move .4s}.transition.slide-fade.backwards>.from{opacity:1;transform:translateX(0)}.transition.slide-fade.backwards>.to{opacity:0;transform:translateX(-1.5rem)}.transition.slide-fade.backwards.animating>.from{animation:fade-in-backwards-opacity .4s ease-out,slide-fade-in-backwards-move .4s}.transition.slide-fade.backwards.animating>.to{animation:fade-out-backwards-opacity .4s var(--easeOutSine),slide-fade-out-backwards-move .4s}@keyframes zoom-fade-in-move{0%{transform:scale(1.1)}to{transform:scale(1)}}@keyframes zoom-fade-in-backwards-move{0%{transform:scale(1)}to{transform:scale(1.1)}}@keyframes zoom-fade-out-backwards-move{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes slide-fade-in-move{0%{transform:translateX(1.5rem)}to{transform:translateX(0)}}@keyframes slide-fade-out-move{0%{transform:translateX(0)}to{transform:translateX(-1.5rem)}}@keyframes slide-fade-in-backwards-move{0%{transform:translateX(0)}to{transform:translateX(1.5rem)}}@keyframes slide-fade-out-backwards-move{0%{transform:translateX(-1.5rem)}to{transform:translateX(0)}}.row{display:flex;flex-direction:column;justify-content:center;min-height:3.5rem;padding:.4375rem 1rem;position:relative}.row.no-subtitle,.row.row-small{min-height:3rem;padding-bottom:.1875rem;padding-top:.1875rem}body.animation-level-2 .row{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.row.is-disabled{pointer-events:none!important}.row.is-disabled{opacity:.3;opacity:var(--disabled-opacity)}.row.no-wrap{padding-bottom:0!important;padding-top:0!important}.row a{pointer-events:all;position:relative;z-index:1}.row-title-row,.row>.row-title{order:0}[dir=ltr] .row-big{padding-left:1rem;padding-right:.75rem}[dir=rtl] .row-big{padding-left:.75rem;padding-right:1rem}.row-big{min-height:4.5rem;padding-bottom:.5625rem;padding-top:.5625rem}.row-row{align-items:center;display:flex;justify-content:space-between}.row-row .row-subtitle,.row-row .row-title{flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row-subtitle-row,.row>.row-subtitle{order:1}.row-title{color:#000;color:var(--primary-text-color);font-size:16px;font-size:var(--font-size);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;word-break:break-word}.row-title-right-secondary{color:#707579;color:var(--secondary-text-color)}[dir=ltr] .row-subtitle-right,[dir=ltr] .row-title-right{margin-left:1rem}[dir=rtl] .row-subtitle-right,[dir=rtl] .row-title-right{margin-right:1rem}.row-subtitle-right,.row-title-right{flex:0 0 auto!important}.row-midtitle,.row-subtitle,.row-title{pointer-events:none;position:relative}.row-midtitle{font-size:14px;font-size:var(--font-size-14);margin-top:.125rem;order:1}[dir=ltr] .row-with-padding{padding-left:4.5rem}[dir=rtl] .row-with-padding{padding-right:4.5rem}@media only screen and (max-width:600px){[dir=ltr] .row-with-padding{padding-left:4rem}[dir=rtl] .row-with-padding{padding-right:4rem}}[dir=ltr] .row-with-padding.tgico:before{left:1rem}[dir=rtl] .row-with-padding.tgico:before{right:1rem}.row-with-padding.tgico:before{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%);z-index:1}.row-with-padding:not(.row-with-icon):before{display:none}.row-clickable{cursor:pointer;overflow:hidden}@media only screen and (min-width:601px){.row-clickable{border-radius:10px}}[dir=ltr] .row-sortable .row-subtitle,[dir=ltr] .row-sortable .row-title{padding-right:2.5rem}[dir=rtl] .row-sortable .row-subtitle,[dir=rtl] .row-sortable .row-title{padding-left:2.5rem}[dir=ltr] .row-sortable-icon{right:.75rem}[dir=rtl] .row-sortable-icon{left:.75rem}.row-sortable-icon{color:#707579;color:var(--secondary-text-color);font-size:1.5rem;height:1.5rem;line-height:1;pointer-events:none;position:absolute;top:50%;transform:translateY(-50%)}.row-sortable.cant-sort .row-sortable-icon{display:none}.row-sortable.is-dragging{background-color:#fff!important;background-color:var(--surface-color)!important}.row-sortable.is-dragging{z-index:1}html.no-touch .row-sortable.is-dragging:active,html.no-touch .row-sortable.is-dragging:hover{background-color:#f4f4f4!important;background-color:var(--light-filled-secondary-text-color)!important}body.animation-level-2 .is-reordering .row-sortable{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{padding-left:3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{padding-right:3.375rem}[dir=ltr] .row .checkbox-field,[dir=ltr] .row .radio-field-main{margin-left:-3.375rem}[dir=rtl] .row .checkbox-field,[dir=rtl] .row .radio-field-main{margin-right:-3.375rem}.row .checkbox-field,.row .radio-field,.row .radio-field:not(.radio-field-right) .radio-field-main{position:static}.row .checkbox-field,.row .radio-field{--offset-left:1rem}.row .radio-field{margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field{margin-right:0}[dir=rtl] .row .checkbox-field{margin-left:0}.row .checkbox-field{height:auto;margin-bottom:0;margin-top:0}[dir=ltr] .row .checkbox-field .checkbox-caption{padding-left:0}[dir=rtl] .row .checkbox-field .checkbox-caption{padding-right:0}.row .checkbox-field .checkbox-caption{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.row .checkbox-field-toggle{margin-left:.125rem;margin-right:.125rem;padding:0}.row-subtitle{color:#707579!important;color:var(--secondary-text-color)!important;font-size:14px!important;font-size:var(--font-size-14)!important}.row-subtitle{line-height:18px;line-height:var(--line-height-14);margin-top:.1875rem}.row-subtitle:empty{display:none}[dir=ltr] .row-media{left:.75rem}[dir=rtl] .row-media{right:.75rem}.row-media{height:2.25rem!important;margin:0!important;position:absolute!important;width:2.25rem!important}.row-media{align-items:center;display:flex;justify-content:center;pointer-events:none}[dir=ltr] .row-media-small{left:.75rem!important}[dir=rtl] .row-media-small{right:.75rem!important}.row-media-small{height:2rem!important;width:2rem!important}[dir=ltr] .row-media-abitbigger{left:.75rem!important}[dir=rtl] .row-media-abitbigger{right:.75rem!important}.row-media-abitbigger{height:2.625rem!important;width:2.625rem!important}[dir=ltr] .row-media-big{left:.5rem!important}[dir=rtl] .row-media-big{right:.5rem!important}.row-media-big{height:3rem!important;width:3rem!important}[dir=ltr] .row-media-bigger{left:.5625rem!important}[dir=rtl] .row-media-bigger{right:.5625rem!important}.row-media-bigger{height:3.375rem!important;width:3.375rem!important}.row.menu-open{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}[dir=ltr] .row>.btn-primary{right:1rem}[dir=rtl] .row>.btn-primary{left:1rem}.row>.btn-primary{border-radius:.9375rem;font-size:.9375rem;height:1.875rem;line-height:1.875rem;margin:0;padding-left:.75rem;padding-right:.75rem;position:absolute;top:50%;transform:translateY(-50%);width:auto}body.animation-level-2 .row>.btn-primary{transition:width .2s,background-color .2s,color .2s}.row>.btn-primary.active{background-color:rgba(51,144,236,.08)!important;background-color:var(--light-primary-color)!important}.row>.btn-primary.active{color:#3390ec;color:var(--primary-color)}.color-picker{margin:1.1875rem auto .25rem;max-width:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:380px}@media only screen and (max-width:600px){.color-picker{padding:0 .75rem}}.color-picker-box{height:198px;width:100%}.color-picker-box,.color-picker-color-slider,.color-picker-dragger{overflow:visible!important}.color-picker-sliders{margin:1rem 0 1.125rem}.color-picker-dragger{cursor:grab}.color-picker-inputs{display:flex}.color-picker-inputs .input-field{flex:1 1 auto}.color-picker-inputs .input-field:not(:first-child){margin-left:1.25rem}.reply-keyboard{display:flex!important;padding:0!important;position:absolute!important;width:26.25rem!important}.reply-keyboard{background:#fff;background:var(--surface-color);border-radius:10px;bottom:calc(100% + .625rem);box-shadow:0 5px 10px 5px rgba(16,35,47,.14);flex-direction:column;max-height:26.25rem;max-width:100%;opacity:0;overflow:hidden;right:0;transform:scale(0);transform-origin:bottom right;transition:transform .2s cubic-bezier(.4,0,.2,1),opacity .2s cubic-bezier(.4,0,.2,1);transition:transform var(--esg-transition),opacity var(--esg-transition);z-index:3}@media only screen and (max-height:569px),only screen and (max-width:600px){.reply-keyboard{bottom:calc(100% + .5rem)}}.reply-keyboard.active{opacity:1;transform:scale(1)}body.animation-level-0 .reply-keyboard{transition:none}.reply-keyboard-row{display:flex}.reply-keyboard-row+.reply-keyboard-row{margin-top:.3125rem}.reply-keyboard-button{background-color:transparent;border:2px solid #3390ec;border:2px solid var(--primary-color);border-radius:.375rem;color:#3390ec;color:var(--primary-color);font-size:.9375rem;font-weight:500;font-weight:var(--font-weight-bold);height:3rem;text-align:center;width:100%}body.animation-level-2 .reply-keyboard-button{transition:color .15s,background-color .15s}html.no-touch .reply-keyboard-button:active,html.no-touch .reply-keyboard-button:hover{background-color:#3390ec;background-color:var(--primary-color);color:#fff}.reply-keyboard-button+.reply-keyboard-button{margin-left:.3125rem}.reply-keyboard .scrollable-y{padding:.625rem!important}.reply-keyboard .scrollable-y{bottom:auto;height:auto;left:auto;max-height:100%;position:relative;right:auto;top:auto}.peoplenearby-container div.text.nearby-description{color:#000;color:var(--primary-text-color);margin-top:15px;text-align:center}.peoplenearby-container div.text.nearby-error{color:#aaa;color:var(--gc-secondary-text-color);margin-top:10px;text-align:center}.peoplenearby-container .locating-animation-container{align-items:center;display:flex;justify-content:center;min-height:140px;width:100%}.peoplenearby-container .locating-animation-container .tgico.tgico-location{align-items:center;background:#3d9de0;background:var(--avatar-color-bottom);border-radius:50%;display:flex;height:140px;justify-content:center;padding:50px;width:140px}.peoplenearby-container .locating-animation-container .tgico.tgico-location:before{color:#fff;font-size:58px}.peoplenearby-container .locating-animation-container .locating-animation-waves{position:fixed}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-1,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{animation:waves-animation 3s infinite;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:50px;margin-left:36px;width:50px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-2,.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{animation:waves-animation 5s infinite;animation-delay:2s;border:5px solid #fff;border-radius:50%;-webkit-clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);clip-path:polygon(72% 0,100% 0,100% 100%,72% 100%);height:71px;margin-left:51px;margin-top:1px;width:66px}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{margin-left:-36px!important}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-3{transform:rotateY(180deg)}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{margin-left:-51px!important}.peoplenearby-container .locating-animation-container .locating-animation-waves.wave-4{transform:rotateY(180deg)}@keyframes waves-animation{0%{opacity:1}50%{opacity:0}to{opacity:1}}.spoiler{--anim:.4s ease;background-color:#e3e5e8;background-color:var(--spoiler-background-color)}.spoiler-text{opacity:0}.spoilers-container .custom-emoji-canvas{z-index:-1}.spoilers-container.is-spoiler-visible.animating .spoiler{transition:background-color var(--anim)}.spoilers-container.is-spoiler-visible.animating .spoiler-text{transition:opacity var(--anim)}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler{background-color:transparent}.spoilers-container.is-spoiler-visible:not(.backwards) .spoiler-text{opacity:1}.spoilers-container:not(.is-spoiler-visible) .spoiler{cursor:pointer}.spoilers-container:not(.is-spoiler-visible) .spoiler-text{pointer-events:none}.emoji-animation,.emoji-animation-container{pointer-events:none;position:absolute}.emoji-animation-container{bottom:0;left:0;overflow:hidden;right:0;top:0;z-index:3}.reactions-block{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;user-select:none}.reactions-block.has-no-reactions{display:inline;display:initial}.reactions-inline{display:inline-flex}.reactions-inline:not(:empty){margin-right:.125rem}.reaction,.reaction-sticker{align-items:center;display:flex}.reaction-sticker{--custom-emoji-size:var(--reaction-size);height:var(--reaction-size);justify-content:center;position:relative;width:var(--reaction-size)}.reaction-sticker-activate{bottom:var(--reaction-offset);left:var(--reaction-offset);position:absolute;right:var(--reaction-offset);top:var(--reaction-offset);z-index:1}.reaction-sticker.has-animation>.media-sticker{opacity:0}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{height:var(--size)!important;width:var(--size)!important}.reaction-sticker:not(.is-static):not(.is-custom) .media-sticker{--size:calc(var(--reaction-size) + var(--reaction-offset)*-2);bottom:auto;left:auto;max-height:var(--size);max-width:var(--size);right:auto;top:auto}.reaction-sticker.is-custom{border-radius:.3125rem}.reaction-sticker.is-custom .custom-emoji,.reaction-sticker.is-custom .media-sticker{border-radius:inherit}.reaction-sticker.is-custom .custom-emoji-canvas{z-index:auto}.reaction-inline{--reaction-size:.875rem;--reaction-offset:-.4375rem;min-height:var(--reaction-size);min-width:var(--reaction-size)}.reaction-inline .reaction-counter{font-size:inherit!important;margin-right:.0625rem!important}.reaction-inline .reaction-counter{order:-1}.reaction-block{--additional-height:.5rem;--margin:.375rem;--reaction-size:1.375rem;--reaction-offset:-.5625rem;--background-color:var(--message-highlightning-color);--chosen-background-color:var(--message-primary-color);--counter-color:#fff;--reaction-total-size:calc(var(--reaction-size) + var(--additional-height));background-color:#f4f4f5;background-color:var(--background-color);border-radius:var(--reaction-total-size);color:var(--counter-color);cursor:pointer;height:var(--reaction-total-size);margin-right:var(--margin);margin-top:var(--margin);padding:0 .5rem;position:relative}html.no-touch .reaction-block:active:after,html.no-touch .reaction-block:hover:after{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;opacity:.08;position:absolute;right:0;top:0}.reaction-block .reaction-counter,.reaction-block .reaction-sticker{z-index:1}.reaction-block:last-child{margin-right:0}.reaction-block:before{background-color:var(--chosen-background-color);border-radius:inherit;bottom:0;content:\" \";left:0;opacity:0;position:absolute;right:0;top:0;transform:scale(0)}.reaction-block.is-chosen:not(.backwards):before{opacity:1;transform:scale(1)}.reaction-block.is-chosen:not(.backwards) .stacked-avatars{--border-color:var(--chosen-background-color)}.reaction-block.is-chosen.animating:before{transition:transform .3s cubic-bezier(.4,0,.2,1),opacity .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in),opacity var(--transition-standard-in)}.reaction-block.is-chosen.animating .reaction-counter{transition:color .3s cubic-bezier(.4,0,.2,1);transition:color var(--transition-standard-in)}.reaction-block.is-chosen.animating .stacked-avatars-avatar-container{transition:border-color .3s cubic-bezier(.4,0,.2,1);transition:border-color var(--transition-standard-in)}.reaction-block .stacked-avatars{--border-color:transparent;--border-size:.125rem;--margin-right:-.875rem;margin-left:.1875rem}.reaction-block .reaction-counter{font-size:.9375rem!important}.reaction-block .reaction-counter{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.125rem;margin:0 .0625rem 0 .375rem;position:relative}.stacked-avatars{--border-color:var(--surface-color);--border-size:1px;--margin-right:-.3125rem;--avatar-size:1rem;--avatar-total-size:calc(var(--avatar-size) + var(--border-size)*2);display:flex;flex-direction:row-reverse}.stacked-avatars-avatar{height:var(--avatar-size);width:var(--avatar-size);z-index:0}.stacked-avatars-avatar-container{align-items:center;border:var(--border-size) solid var(--border-color);border-radius:50%;display:flex;height:var(--avatar-total-size);justify-content:center;position:relative;width:var(--avatar-total-size)}.stacked-avatars-avatar-container:not(:first-child){margin-right:var(--margin-right)}.sticker-viewer{align-items:center;bottom:0;display:flex;justify-content:center;left:0;pointer-events:none;position:fixed;right:0;top:0;z-index:4}.sticker-viewer:before{background-color:rgba(0,0,0,.6);bottom:0;content:\" \";left:0;opacity:0;position:absolute;right:0;top:0}body.animation-level-2 .sticker-viewer:before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.sticker-viewer.is-visible:not(.backwards):before{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards):before{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-transformer:not(.is-switching){transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-in)}.sticker-viewer.is-visible:not(.backwards) .emoji-animation,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,.sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{opacity:1}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .emoji-animation,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-in)}body.animation-level-2 .sticker-viewer.is-visible:not(.backwards) .sticker-viewer-sticker:not(.is-overflow){transition:opacity 0s}.sticker-viewer-transformer{--translateX:0;align-items:center;display:flex;height:360px;justify-content:center;position:absolute;width:360px}.sticker-viewer-transformer.has-effect{height:280px;width:280px}.sticker-viewer-transformer.has-effect .sticker-viewer-emoji{top:-5.5rem}body.animation-level-2 .sticker-viewer-transformer{transition:transform .2s cubic-bezier(.4,0,.2,1);transition:transform var(--sticker-viewer-open-transition-out)}.sticker-viewer-transformer.is-switching{opacity:1!important;transform:translateX(var(--translateX)) scale(1)!important}body.animation-level-2 .sticker-viewer-transformer.is-switching{transition:transform .2s cubic-bezier(.12,1.1,.56,1.2),opacity .2s cubic-bezier(.12,1.1,.56,1.2)!important;transition:transform var(--sticker-viewer-switch-transition),opacity var(--sticker-viewer-switch-transition)!important}.sticker-viewer-transformer.is-switching:not(.backwards){opacity:0!important;transform:scale(.4) translateX(var(--translateX))!important}.sticker-viewer-emoji{position:absolute;top:-3rem;transform:translateX(var(--translateX)) scale(2)}.sticker-viewer-sticker{position:absolute}.sticker-viewer .emoji-animation,.sticker-viewer-emoji,.sticker-viewer-sticker{opacity:0}body.animation-level-2 .sticker-viewer .emoji-animation,body.animation-level-2 .sticker-viewer-emoji,body.animation-level-2 .sticker-viewer-sticker{transition:opacity .2s cubic-bezier(.4,0,.2,1);transition:opacity var(--sticker-viewer-open-transition-out)}.custom-emoji{height:1.25rem!important;height:var(--custom-emoji-size)!important;min-height:1.25rem!important;min-height:var(--custom-emoji-size)!important;min-width:1.25rem!important;min-width:var(--custom-emoji-size)!important;width:1.25rem!important;width:var(--custom-emoji-size)!important}.custom-emoji{display:inline;position:relative}.custom-emoji:before{content:\" \";display:inline-block;height:inherit;min-height:inherit;min-width:inherit;width:inherit}.custom-emoji .media-sticker,.custom-emoji .rlottie{height:inherit!important;max-height:inherit!important;max-width:inherit!important;width:inherit!important}.custom-emoji .media-sticker,.custom-emoji .rlottie{margin:0;pointer-events:none;text-indent:-9999px}.custom-emoji-canvas{height:100%;width:100%}.custom-emoji-canvas,.custom-emoji-renderer{bottom:0;left:0;position:absolute;right:0;top:0}.custom-emoji-renderer{pointer-events:none}.custom-emoji-placeholder{display:inline;height:20px;height:var(--messages-custom-emoji-size);margin-top:-.125rem;vertical-align:middle;width:20px;width:var(--messages-custom-emoji-size)}.usernames-username-icon{background-color:#c4c9cc;background-color:var(--secondary-color);border-radius:50%;color:#fff;font-size:1.25rem}.usernames-username-icon:before{content:\"\"}.usernames-username.active .usernames-username-status{color:#3390ec!important;color:var(--primary-color)!important}.usernames-username.active .usernames-username-icon{background-color:#3390ec;background-color:var(--primary-color)}.topics-slider{bottom:0;left:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0}.topics-container{background-color:#fff!important;background-color:var(--surface-color)!important;width:var(--width)!important}.topics-container{--offset:0;--width:100%}.topics-container.is-floating{overflow:visible!important;overflow:initial!important}.topics-container.is-floating{--offset:5.0625rem;--width:calc(var(--left-column-width) - var(--offset));border-left:1px solid #dfe1e5;border-left:1px solid var(--border-color);bottom:0;pointer-events:all;position:absolute;right:0;top:0;transform:translateX(var(--width));z-index:3}.topics-container.is-visible:not(.backwards){transform:translateX(0)}.topics-container.is-visible.animating{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.topics-container.is-visible.animating.backwards{transition:transform .25s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-out)}.topics-container .sidebar-header{padding:0 .75rem}.topics-container .sidebar-header__rows{flex:1 1 auto;overflow:hidden;padding-left:.5rem}.topics-container .sidebar-header__rows .sidebar-header__title{padding-left:0!important}.topics-container .sidebar-header__rows .sidebar-header__title{font-size:16px;font-size:var(--font-size-16);line-height:21px;line-height:var(--line-height-16);margin-bottom:.125rem}.topics-container .sidebar-header__subtitle,.topics-container .sidebar-header__title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topics-container .sidebar-header__subtitle{color:#707579;color:var(--secondary-text-color);font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14)}.topics-container .chatlist-chat{min-height:4rem;padding-left:.75rem}.topic-name .topic-icon{margin-right:.25rem}.topic-name-button{text-decoration:none!important}.topic-name-button{--color:var(--primary-color);align-items:center;color:var(--color);cursor:pointer;display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:1.5rem;justify-content:center;max-width:100%;padding:0 .5rem;position:relative}.topic-name-button-container{display:flex!important}.topic-name-button-container{align-items:flex-start;justify-content:flex-start}.topic-name-button .peer-title,.topic-name-button .topic-name{position:relative}.topic-name-button:before{background-color:var(--color);border-radius:1.5rem;bottom:0;content:\" \";left:0;opacity:.08;position:absolute;right:0;top:0}html.no-touch .topic-name-button:active:before,html.no-touch .topic-name-button:hover:before{opacity:.16}.topic-icon{line-height:1.875!important}.topic-icon{--size:1.25rem;--custom-emoji-size:var(--size);display:inline-flex;font-size:calc(var(--size)/2);justify-content:center;position:relative;vertical-align:middle}.topic-icon-general{fill:#c4c9cc;fill:var(--secondary-color);height:var(--size);width:var(--size)}.topic-icon-svg{height:inherit;position:absolute;width:inherit}.topic-icon-content{position:relative}.edit-topic-container .scrollable-y{display:flex;flex-direction:column}.edit-topic-icon{position:absolute}.edit-topic-icon .topic-icon{--size:4rem}.edit-topic-icon-container{align-items:center;cursor:pointer;display:flex;height:100px;justify-content:center;margin:0 auto;position:relative;width:100px}.edit-topic-emoticons-container{flex:1 1 auto}.edit-topic-emoticons-container .sidebar-left-section{padding:0!important}.edit-topic-emoticons-container .sidebar-left-section{height:100%}.edit-topic-emoticons-container .emoji-padding{display:flex;flex-direction:column}.edit-topic-emoticons-container .super-emoji-topic-icon .topic-icon{--size:var(--esg-emoji-size);--custom-emoji-size:inherit;margin-left:calc((var(--custom-emoji-size) - var(--esg-emoji-size))/2)}.popup{position:fixed!important}.popup{background-color:rgba(0,0,0,.3);bottom:0;box-shadow:none;display:flex;left:0;margin:0;max-width:none;opacity:0;overflow:auto;padding:1.875rem;right:0;top:0;transition-delay:0s,.15s;transition-delay:0s,var(--popup-transition-time);transition-duration:.15s,0s;transition-duration:var(--popup-transition-time),0s;transition-property:opacity,visibility;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:var(--popup-transition-function);-webkit-user-select:none;-moz-user-select:none;user-select:none;visibility:hidden;z-index:3}.popup.no-overlay{background-color:transparent;overflow:visible;padding:0}body.animation-level-0 .popup{transition:none}.popup.active{opacity:1;transition-delay:0s,0s;visibility:visible;z-index:4}.popup.active .popup-container,.popup.hiding .popup-container{transform:translate3d(var(--translateX),0,0)}[dir=ltr] .popup-title{padding-left:1.5rem;padding-right:1rem}[dir=rtl] .popup-title{padding-left:1rem;padding-right:1.5rem}.popup-title{flex:1;font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold);line-height:1;margin:0}.popup-title:first-child{padding-left:0}.popup-container{--translateX:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;margin:auto;overflow:hidden;padding:1rem;position:relative;transform:translate3d(var(--translateX),3rem,0);transition:transform .15s cubic-bezier(.4,0,.2,1);transition:transform var(--popup-transition-time) var(--popup-transition-function)}body.animation-level-0 .popup-container{transition:none}.popup-description .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-centerer{margin:auto}.popup-close{flex:0 0 auto;justify-self:center;z-index:3}.popup-header{align-items:center;display:flex;flex:0 0 auto;margin-bottom:2rem;position:relative}.popup-body{display:flex;flex:1 1 auto;flex-direction:column;overflow:hidden}.popup-body .scrollable{position:relative}.popup-buttons{align-items:center;display:flex;flex-direction:row-reverse;height:3rem;justify-content:flex-start;padding:0 .5rem}.popup-buttons .btn{border-radius:10px;font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;max-width:100%;overflow:hidden;padding:0 1rem;position:relative;text-overflow:ellipsis;text-transform:uppercase;white-space:nowrap}[dir=ltr] .popup-buttons .btn+.btn{margin-right:.625rem}[dir=rtl] .popup-buttons .btn+.btn{margin-left:.625rem}.popup-avatar .popup-container{max-width:600px;padding:15px 16px 16px 24px}.popup-avatar .popup-container>button{bottom:20px;position:absolute;right:20px}.popup-avatar .popup-close{font-size:1.5rem;margin-top:4px}.popup-avatar .popup-header{margin-bottom:1px}[dir=ltr] .popup-avatar h6{text-align:left}[dir=rtl] .popup-avatar h6{text-align:right}.popup-avatar h6{font-size:1.25rem;margin:0 0 0 2rem}.popup-avatar .crop{border-radius:8px;max-height:100%;max-width:100%;padding:24px 54px 46px 46px}.popup-avatar .crop>img{display:none}.popup-avatar .crop img{border-radius:8px}.popup-new-media .popup-container{max-height:100%;max-width:420px;padding:12px 20px 32.5px;width:420px}.popup-new-media .popup-container img,.popup-new-media .popup-container video{border-radius:inherit}.popup-new-media .popup-header{align-items:center;flex:0 0 auto;flex-wrap:wrap;justify-content:space-between;margin-bottom:9px;padding:12px 20px 15px;position:relative}.popup-new-media .popup-header .btn-primary{border-radius:10px;font-size:14px;font-size:var(--font-size-14);height:2.25rem;line-height:2.25rem;padding:0 1.375rem;text-transform:uppercase;width:auto}.popup-new-media .popup-close{font-size:1.5rem;margin:-1px 0 0 -4px}.popup-new-media .popup-photo{border-radius:10px;max-width:380px;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.popup-new-media .scrollable{position:relative}.popup-new-media .input-field{flex:0 0 auto;margin-top:25px;width:100%}.popup-new-media .input-field-input{border-radius:10px;font-size:1rem}.popup-new-media .input-field-input[data-placeholder]:not(:focus):empty~label{opacity:0}.popup-new-media .input-field label{font-size:inherit}.popup-new-media .btn-menu-overlay{z-index:3}.popup-new-media .menu-send{top:calc(100% + .25rem);z-index:4}.popup-new-media.popup-send-photo .popup-header{padding:0}.popup-new-media.popup-send-photo .popup-body{position:relative}.popup-new-media.popup-send-photo .checkbox-field{margin-bottom:0;margin-left:0}.popup-new-media.popup-send-photo .popup-item-album{position:relative}.popup-new-media.popup-send-photo .popup-item-album .album-item{position:absolute}.popup-new-media.popup-send-photo .popup-item-album img,.popup-new-media.popup-send-photo .popup-item-album video{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media{display:flex;justify-content:center;margin:0 auto}.popup-new-media.popup-send-photo .popup-photo>.popup-item-media img{-o-object-fit:contain;object-fit:contain}.popup-new-media.popup-send-photo .popup-photo>.popup-item{border-radius:inherit;overflow:hidden;position:relative}.popup-new-media.popup-send-photo .popup-photo>.popup-item+.popup-item{margin-top:.5rem}.popup-new-media.popup-send-photo .drop{border-radius:0}.popup-new-media.popup-send-photo .document{cursor:default;height:4.5rem;max-width:100%;overflow:hidden}.popup-new-media.popup-send-photo .document-name{font-weight:400;line-height:1.5;max-width:100%;overflow:hidden;text-overflow:ellipsis;width:100%}.popup-new-media.popup-send-photo .document-ico{font-size:16px;font-weight:400;height:48px;letter-spacing:0;line-height:11px;width:48px}.popup-create-contact .name-fields{display:flex;flex-direction:column;margin-top:1rem;padding-left:116px;position:relative}.popup-create-contact .name-fields .input-field:first-child{margin-top:0}.popup-create-contact .avatar-placeholder{left:0;position:absolute;top:50%;transform:translateY(-50%)}.popup-peer .popup-header{align-items:center;display:flex;height:2.5rem;margin:0;padding:0 1rem;width:-moz-max-content;width:max-content}.popup-peer .popup-container{max-width:min(400px,100%);min-width:min(100%,17.5rem);padding:.75rem .5rem;width:-moz-min-content;width:min-content}.popup-peer .popup-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.popup-peer .popup-title:not(:first-child){padding-left:1rem}.popup-peer .popup-description{line-height:1.3125;line-height:var(--line-height);margin-bottom:0;margin-top:0;max-width:-moz-fit-content;max-width:fit-content;min-width:min(100%,15rem);overflow:hidden;padding:.625rem 1rem .5rem;text-overflow:ellipsis;word-break:break-word}.popup-peer .checkbox-field{align-items:center;display:flex;height:3rem;margin:0;padding:0 1.125rem}.popup-peer .checkbox-field .checkbox-box{left:auto}.popup-stickers{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-stickers .sticker-set-footer{color:#3390ec;color:var(--primary-color);text-align:center}.popup-stickers .sticker-set-footer .btn-primary{height:44px;line-height:44px;padding:0 1.0625rem;text-transform:uppercase;width:auto}.popup-stickers .scrollable.is-loading{min-height:9rem;position:relative}.popup-stickers .sticker-set-footer{padding:8px 0}.popup-stickers .super-emojis{padding:0 .5rem}.popup-stickers .popup-container{max-height:420px;max-width:420px;padding:0;width:420px}[dir=ltr] .popup-stickers .popup-close{margin-left:1rem}[dir=rtl] .popup-stickers .popup-close{margin-right:1rem}.popup-stickers .popup-close{font-size:1.5rem}.popup-stickers .popup-header{flex:0 0 auto;margin:.625rem 0}.popup-stickers .sticker-set{margin:.0625rem 0}.popup-stickers .sticker-set .row-title{font-weight:500;font-weight:var(--font-weight-bold)}.popup-stickers .sticker-set-stickers{--per-row:5;--item-size:var(--popup-sticker-size);display:grid;grid-template-columns:repeat(var(--per-row),1fr);padding:0 5px;position:relative}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers{--per-row:4}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper{cursor:pointer;height:var(--item-size);justify-self:center;margin-bottom:2px;position:relative;width:var(--item-size)}@media only screen and (max-width:600px){.popup-stickers .sticker-set-stickers .media-sticker-wrapper{margin-bottom:8px}}.popup-stickers .sticker-set-stickers .media-sticker-wrapper:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:12px}.popup-date-picker{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-date-picker .popup-container{padding:12px 14px}@media(min-height:470px){.popup-date-picker .popup-container[data-lines=\"7\"]{top:19px}.popup-date-picker .popup-container[data-lines=\"5\"]{top:-19px}}.popup-date-picker .popup-header{margin-bottom:1.375rem;margin-left:6px;margin-top:4px}.popup-date-picker .popup-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .popup-buttons{margin-right:-2px;order:2}.popup-date-picker .popup-buttons button+button{margin-left:9px;margin-top:0}.popup-date-picker .date-picker-controls{align-items:center;display:flex;justify-content:space-between}.popup-date-picker .date-picker-controls .date-picker-month-title{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold)}.popup-date-picker .date-picker-prev{transform:rotate(90deg)}.popup-date-picker .date-picker-next{transform:rotate(-90deg)}.popup-date-picker .date-picker-next:disabled,.popup-date-picker .date-picker-prev:disabled{visibility:hidden}.popup-date-picker .date-picker-months{margin-bottom:1.5rem;margin-top:7px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-date-picker .date-picker-month{display:grid;grid-template-columns:repeat(7,1fr);justify-content:center;width:100%}.popup-date-picker .date-picker-month .btn-icon{align-items:center;color:#707579;color:var(--secondary-text-color);display:flex;font-size:12px;height:38px;justify-content:center;justify-self:center;width:38px}.popup-date-picker .date-picker-month .btn-icon:disabled{opacity:1}.popup-date-picker .date-picker-month-date:disabled{opacity:.7!important}.popup-date-picker .date-picker-month .btn-icon:not(:disabled){color:#000;color:var(--primary-text-color)}.popup-date-picker .date-picker-month .btn-icon.active{background-color:#3390ec!important;background-color:var(--primary-color)!important}.popup-date-picker .date-picker-month .btn-icon.active{border-radius:50%;color:#fff;color:var(--badge-text-color)}.popup-schedule .popup-header{justify-content:space-between;margin-bottom:17px;margin-left:0;margin-top:5px}@media only screen and (max-width:600px){.popup-schedule .popup-header{margin-left:3px}}.popup-schedule .popup-header .btn-icon{font-size:22px}.popup-schedule .popup-container{min-width:420px;padding:4px 16px 16px;width:420px}@media only screen and (max-width:600px){.popup-schedule .popup-container{min-width:312px;padding:4px 14px 14px;width:312px}}.popup-schedule .popup-container[data-lines=\"5\"]{top:-16px}.popup-schedule .popup-container[data-lines=\"7\"]{top:16px}.popup-schedule .date-picker-month{margin-left:2px;margin-right:-20px;width:auto}@media only screen and (max-width:600px){.popup-schedule .date-picker-month{margin-left:0;margin-right:-6px}}.popup-schedule .date-picker-month-title{font-size:20px;font-weight:500;font-weight:var(--font-weight-bold);margin-left:-5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-month-title{margin-left:-2rem}}.popup-schedule .date-picker-month .btn-icon{font-size:14px;font-weight:500;font-weight:var(--font-weight-bold);height:36px;justify-self:auto;margin-top:-4px;width:36px}.popup-schedule .date-picker-month-date:disabled{color:#9ba3a8!important}.popup-schedule .date-picker-month-day{color:#000!important;color:var(--primary-text-color)!important;font-size:14px!important}.popup-schedule .date-picker-month-day{font-weight:500;font-weight:var(--font-weight-bold)}.popup-schedule .date-picker-months{margin-bottom:14px}@media only screen and (max-width:600px){.popup-schedule .date-picker-months{margin-bottom:13px}}.popup-schedule .date-picker-time{display:flex;justify-content:center;margin-bottom:1.5rem}@media only screen and (max-width:600px){.popup-schedule .date-picker-time{margin-bottom:22px}}.popup-schedule .date-picker-time .input-field{width:80px}.popup-schedule .date-picker-time .input-field-input{text-align:center}.popup-schedule .date-picker-time-delimiter{padding:14px 20px}.popup-schedule .date-picker-controls .btn-icon:disabled{visibility:visible}.popup-schedule .btn-primary{font-weight:400}@media only screen and (max-width:600px){.popup-schedule .btn-primary{widtH:280px;height:50px;margin-left:2px}}.popup-create-poll .popup-container{max-height:min(640px,100%);padding:0}.popup-create-poll .radio-field{margin:0}.popup-create-poll .radio-field .radio-field-main:before{left:.25rem}.popup-create-poll .radio-field .radio-field-main:after{left:.5625rem}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{opacity:0!important}.popup-create-poll .hidden-widget .btn-icon,.popup-create-poll .radio-field:first-child:last-child .btn-icon{pointer-events:none}.popup-create-poll .input-field .btn-icon{opacity:1;position:absolute;right:.4375rem;top:.4375rem;transition:opacity .2s ease;z-index:1}@media only screen and (max-width:600px){.popup-create-poll .input-field .btn-icon{right:.3125rem;top:.3125rem}}.popup-create-poll .caption{color:#707579;color:var(--secondary-text-color);font-weight:500;font-weight:var(--font-weight-bold);padding:1rem 1.5rem 0}.popup-create-poll .poll-create-questions{padding:0 1.25rem 1.5rem}.popup-create-poll .poll-create-questions:not(:last-child) .input-field-input{padding-right:3.25rem}.popup-create-poll .poll-create-settings{padding:0 .5rem .5rem}.popup-create-poll .subtitle{font-size:.875rem;line-height:1.2;margin-top:.875rem}.popup-create-poll .btn-primary{width:94px}.popup-create-poll .menu-send{right:20px;top:54px}.popup-create-poll hr:not(.hide){display:block!important}.popup-forward .popup-container{height:40.625rem;max-height:min(40.625rem,100%);max-width:420px;padding:7px 0 0;width:420px}.popup-forward .popup-header{flex:0 0 auto;margin-bottom:7px;padding:0 1rem}@media only screen and (max-width:600px){.popup-forward .popup-header{padding-left:.8125rem}}.popup-forward .popup-title{flex-grow:1;height:100%;padding:0}.popup-forward .chatlist-container,.popup-forward .selector{display:flex;flex:1 1 auto;flex-direction:row;height:auto;overflow:hidden;width:100%}.popup-forward .selector-search-input{font-size:20px;font-size:var(--font-size-20);height:100%;line-height:1;padding:.5rem 1.5rem;width:100%}@media only screen and (max-width:600px){.popup-forward .selector-search-input{padding-left:1.1875rem}}.popup-forward .selector .chatlist{margin-top:0!important}.popup-forward .gradient-delimiter{display:none}.popup-forward .sidebar-left-section{margin-bottom:0!important;padding-top:0!important}.popup-instance-deactivated{background-color:rgba(0,0,0,.6)}.popup-instance-deactivated .instance-deactivated-container{margin:auto;pointer-events:none;text-align:center}.popup-instance-deactivated .header{color:#fff;font-size:2rem}.popup-instance-deactivated .subtitle{color:#fff;font-size:1.5rem;line-height:1.3125;line-height:var(--line-height);opacity:.6}.popup-join-chat-invite{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-join-chat-invite .popup-container{max-width:420px}.popup-join-chat-invite .popup-body{align-items:center;padding:.5rem 0 1.25rem}.popup-join-chat-invite .chat-title{font-weight:500;font-weight:var(--font-weight-bold);line-height:1.3125;line-height:var(--line-height);margin:.75rem 0 .25rem}.popup-join-chat-invite .chat-participants-count{color:#707579;color:var(--secondary-text-color);font-size:.875rem;line-height:1.3125;line-height:var(--line-height)}.popup-join-chat-invite .request-caption{margin-top:1rem;text-align:center}.popup-report-messages-confirm{-webkit-user-select:none;-moz-user-select:none;user-select:none}.popup-report-messages-confirm .media-sticker-wrapper{height:100px;margin:0 auto;position:relative;width:100px}.popup-report-messages-confirm .popup-body{margin:1em -.5rem .375rem;overflow:visible;overflow:initial}.popup-report-messages-confirm .popup-description{font-size:.875rem;text-align:center}.popup-report-messages-confirm .popup-buttons{margin-top:.625rem}.popup-report-messages-confirm .input-field{width:100%}.popup-call .popup-header{justify-content:space-between;width:100%}.popup-call .popup-title{flex:1 1 auto}.call{align-items:center;color:#fff;height:100%;width:100%}.call.is-full-screen,html.is-mobile .call{border-radius:0}.call.is-full-screen:not(.show-controls){cursor:none}.call.no-video .call-button,.call.no-video .call-button-text,.call.no-video .call-emojis,.call.no-video .call-party-state,.call.no-video .call-subtitle,.call.no-video .call-title,.call.no-video .popup-header,.call.show-controls .call-button,.call.show-controls .call-button-text,.call.show-controls .call-emojis,.call.show-controls .call-party-state,.call.show-controls .call-subtitle,.call.show-controls .call-title,.call.show-controls .popup-header{opacity:1}.call.show-controls .call-video{opacity:.8}.call.show-controls .call-video-blur{opacity:.56}.call .popup-header .btn-icon{color:#fff}.call .popup-header .call-emojis{margin-right:1rem;transform:scale(1.3125)}.call-avatar{border-radius:inherit;bottom:0;left:0;opacity:.7;position:absolute;right:0;top:0;z-index:-1}.call-avatar .avatar-full{font-size:6rem}.call-title{font-size:1.25rem;font-weight:500;font-weight:var(--font-weight-bold)}.call-subtitle{font-size:1rem}.call .popup-header,.call-emojis,.call-subtitle,.call-title{opacity:0}body.animation-level-2 .call .popup-header,body.animation-level-2 .call-emojis,body.animation-level-2 .call-subtitle,body.animation-level-2 .call-title{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;pointer-events:none;position:absolute;z-index:1}.call-buttons .call-button{pointer-events:all}.call-buttons .call-button-container{--scale:1}.call-buttons .call-button-container.hide-me{--scale:0!important}.call-buttons .call-button-container.hide-me{transform:scale(var(--scale))}body.animation-level-2 .call-buttons .call-button-container.hide-me{transition:transform .3s cubic-bezier(.4,0,.2,1);transition:transform var(--transition-standard-in)}.call-buttons .call-button-container.hide-me .call-button,.call-buttons .call-button-container.hide-me .call-button-text{opacity:0}body.animation-level-2 .call-buttons .call-button,body.animation-level-2 .call-buttons .call-button-text{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-buttons.is-first .call-button,.call-buttons.is-first .call-button-text{transform:translateX(-2.6875rem);transform:translateX(calc(var(--call-button-size)*-.5 + var(--call-button-margin)*-.5))}.call-buttons.is-second{--margin-length:2}.call-buttons.is-second .call-button,.call-buttons.is-second .call-button-text{transform:translateX(calc(6.75rem + 2rem*var(--margin-length)));transform:translateX(calc(var(--call-button-size)*2 + var(--call-button-margin)*var(--margin-length)))}.call.no-screen .call-buttons.is-second{--margin-length:.656875}.call-button{background-color:hsla(0,0%,100%,.1)}.call-button-red{background-color:#df3f40!important;background-color:var(--danger-color)!important}.call-button-green{background-color:#5cc85e!important;background-color:var(--gc-green-text-color)!important}.call-button.active{background-color:#fff!important}.call-button.active:before{color:#9e9e9e}.call-button,.call-button-text{opacity:0}.call-video{border-radius:inherit;height:100%;-o-object-fit:contain;object-fit:contain;opacity:1;position:absolute;width:100%}.call-video-container{align-items:center;background-color:#000;bottom:0;display:flex;left:0;position:absolute;right:0;top:0;z-index:-1}.call-video-container.small{border-radius:10px;bottom:8rem;cursor:pointer;left:auto;right:1rem;top:auto;z-index:1}.call-video-blur{border-radius:inherit;height:100%;opacity:.7;position:absolute;width:100%}body.animation-level-2 .call-video,body.animation-level-2 .call-video-blur{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.call .call-emojis{transform:scale(1.125)}.call .call-emojis .emoji{margin:0 .125rem}.call-party-states{align-items:center;bottom:7.625rem;bottom:calc(4.25rem + var(--call-button-size));display:flex;flex-direction:column;padding:0 1rem;pointer-events:none;position:absolute;width:100%;z-index:2}.call-party-state{align-items:center;-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:hsla(0,0%,100%,.2);border-radius:1.625rem;color:#fff;display:flex;font-size:.875rem;font-weight:500;font-weight:var(--font-weight-bold);height:1.625rem;line-height:1.625rem;margin-top:1rem;max-width:100%;opacity:0;padding:0 .625rem;transform:scale(0) translateY(0)}body.animation-level-2 .call-party-state{transition:opacity .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),transform var(--transition-standard-in)}.call-party-state .rlottie-icon{height:1.875rem!important;width:1.875rem!important}.call-party-state .rlottie-icon{flex:0 0 auto;margin-left:-.25rem;margin-right:.25rem}.call-party-state.is-visible:not(.backwards){transform:scale(1) translateY(0)}.call-party-state-text,.call-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.call.two-button-rows .call-buttons.is-first .call-button,.call.two-button-rows .call-buttons.is-first .call-button-text{transform:translateY(-6.5rem);transform:translateY(calc(var(--call-button-size)*-1 + var(--call-button-margin)*-1 + -1.125rem))}.call.two-button-rows .call-buttons.is-second .call-button,.call.two-button-rows .call-buttons.is-second .call-button-text{transform:translateX(0)}.popup-group-call:not(.movable-element){top:7rem}.popup-group-call:not(.movable-element) .group-call{border-bottom-left-radius:0;border-bottom-right-radius:0}.popup-group-call .popup-body{justify-content:space-between}.popup-group-call .popup-container{background-color:#212121;background-color:var(--gc-background-color);color:#fff;color:var(--gc-primary-text-color)}.popup-group-call .popup{z-index:6}.group-call{--call-button-margin:1.25rem;height:100%;padding:0 .5rem;width:100%}.group-call:after{background:linear-gradient(180deg,rgba(33,33,33,0),rgba(33,33,33,.65) 48.54%,#212121);background:linear-gradient(180deg,rgba(33,33,33,0) 0,rgba(33,33,33,.65) 48.54%,var(--gc-background-color) 100%);bottom:0;content:\" \";height:7.5rem;left:0;position:absolute;right:0}.group-call-header{height:3.5rem;margin-bottom:.125rem;padding:0 .5rem}.group-call-header .btn-icon{color:inherit;flex:0 0 auto}.group-call-header-info{flex:1 1 auto;margin-left:1.5rem;overflow:hidden}.group-call-header-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-header-subtitle,.group-call-header-title{font-size:16px;font-size:var(--font-size-16);line-height:1.3125;line-height:var(--line-height);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-header-subtitle{color:#aaa;color:var(--gc-secondary-text-color);font-size:.875rem}.group-call-buttons{align-items:center;align-self:center;bottom:1.75rem;display:flex;justify-content:space-between;position:absolute;z-index:1}.group-call-button{background-color:rgba(1,200,80,.2);background-color:var(--gc-button-unmuted-color);color:#fff;color:var(--gc-primary-text-color);opacity:1}.group-call[data-mic-state=muted] .group-call-button{background-color:rgba(60,135,247,.2);background-color:var(--gc-button-muted-color)}.group-call[data-mic-state=hand] .group-call-button{background-color:rgba(223,68,184,.2);background-color:var(--gc-button-hand-color)}.group-call:not(.is-big-layout)[data-mic-state=unmuted] .group-call-button{background-color:#195530;background-color:var(--gc-button-unmuted-fill-color)}.group-call-button-red{background-color:rgba(255,89,90,.3)!important;background-color:var(--gc-button-leave-color)!important}.group-call[data-mic-state=unmuted] .group-call-microphone-button{background:linear-gradient(230.46deg,#00a3b4 12.94%,#00cb47 86.29%)}.group-call[data-mic-state=muted] .group-call-microphone-button{background:linear-gradient(225deg,#4eabf8 14.73%,#3478f6 85.27%)}.group-call[data-mic-state=hand] .group-call-microphone-button{background:linear-gradient(225deg,#df44b8 14.73%,#3851eb 85.27%)}.group-call-participant-menu{z-index:5}.group-call-participant{padding-right:.5rem}.group-call-participant-status-icon{display:inline-block;font-size:1.125rem;height:1.125rem;line-height:1;margin-right:6px;vertical-align:middle;width:1.125rem}.group-call-participant-status-container{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant .dialog-subtitle,.group-call-participant .dialog-title{padding-right:2.5rem}.group-call-participant-muted-icon-container{position:absolute!important}.group-call-participant-muted-icon-container{right:.5rem}.group-call-participant-video-container{align-items:center;background-color:#000;border-radius:10px;cursor:pointer;display:flex;flex:1 1 auto;height:15rem;margin:.25rem;overflow:hidden;position:relative;width:100%;width:33%}.group-call-participant-video-container:after{background:linear-gradient(180deg,transparent 55.62%,rgba(0,0,0,.5) 86.46%);bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.group-call-participant-video-container .group-call-participant-status-icon{font-size:1.25rem;height:1.25rem;width:1.25rem}.group-call-participant-video-container:after,.group-call-participant-video-header,.group-call-participant-video-info{opacity:0}body.animation-level-2 .group-call-participant-video-container:after,body.animation-level-2 .group-call-participant-video-header,body.animation-level-2 .group-call-participant-video-info{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call-participant-video-header,.group-call-participant-video-info{align-items:center;bottom:.25rem;display:flex;justify-content:space-between;left:0;padding:0 .5rem 0 .75rem;position:absolute;right:0;z-index:1}.group-call-participant-video-header{bottom:auto;justify-content:flex-end;padding-right:.75rem;padding-top:.875rem;top:0}.group-call-participant-video-header .group-call-pin-icon{font-size:1.5rem;height:1.5rem;width:1.5rem}.group-call-participant-video-info .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.group-call-participant-video-info .peer-title,.group-call-participant-video-info-left{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-call-participant-video-info .group-call-participant-status-container{margin-top:-1px;opacity:.6}.group-call-participant-video-info-left{flex:1 1 auto}.group-call-participant-video-info-right{flex:0 0 auto;height:2rem;margin-left:.75rem;width:2rem}.group-call-participant .is-speaking{color:#5cc85e;color:var(--gc-green-text-color)}.group-call-participant .is-waiting{color:#3390ec;color:var(--gc-blue-text-color)}.group-call-participants{border-radius:10px;flex:1 1 auto;overflow:hidden}.group-call-participants-scrollable{border-radius:inherit;height:auto;padding-bottom:6rem;position:relative}.group-call-participants-video-container{display:flex;flex-wrap:wrap;margin:-.25rem -.25rem 0}.group-call-participants-video-container:not(.show-controls),.group-call-participants-video-container:not(.show-controls) .group-call-participant-video-container{cursor:none}.group-call-participants-video-container:empty{display:none}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:first-child{width:100%}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2),.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container{flex:1 0 auto;height:auto}.group-call-participants-video-container[data-layout=\"3\"] .group-call-participant-video-container:nth-child(n+2):before,.group-call-participants-video-container[data-layout=\"4\"] .group-call-participant-video-container:before{content:\" \";display:block;padding-top:100%}.group-call-participants-video-container.show-controls .group-call-participant-video-container:after,.group-call-participants-video-container.show-controls .group-call-participant-video-header,.group-call-participants-video-container.show-controls .group-call-participant-video-info{opacity:1}.group-call-participants .chatlist{background:none;margin:0 auto;max-width:600px;padding:0}.group-call-participants .user-title{color:#fff;color:var(--gc-primary-text-color)}.group-call-participants .user-last-message{color:#aaa;color:var(--gc-secondary-text-color)}.group-call-big-video-container{position:relative}.group-call-big-video-container .group-call-participants-video-container{margin-bottom:.25rem;min-height:100%}.group-call-big-video-container .group-call-participant-video-container{height:auto}.group-call-big-video-container .group-call-participant-video-container:before{padding-top:56.25%!important}.group-call-cfs,.group-call:not(.is-big-layout) .group-call-big-video-container,.group-call:not(.is-big-layout) .popup-body .group-call-header,.group-call:not(.is-big-layout).has-pinned .group-call-participant-video-container:not(.video-hidden){display:none}.group-call.is-full-screen{border-radius:0}.group-call.is-big-layout>.group-call-header,.group-call.is-full-screen>.group-call-header{padding:0 1rem}.group-call.is-big-layout:not(.is-full-screen){--gc-right-column-width:17.5rem}.group-call.is-big-layout:not(.is-full-screen) .group-call-cfs{display:flex}.group-call.is-big-layout{background-color:#000}.group-call.is-big-layout:after{content:none}html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:active,html.no-touch .group-call.is-big-layout>.group-call-header .btn-icon:hover{background-color:hsla(207,4%,46%,.3)}.group-call.is-big-layout .video-hidden{display:none}.group-call.is-big-layout.is-right-column-shown .popup-body{right:0}.group-call.is-big-layout.is-right-column-shown .group-call-big-video-container{width:calc(100% - 26.25rem);width:calc(100% - var(--gc-right-column-width))}.group-call.is-big-layout.is-right-column-shown .group-call-buttons{transform:translateX(-13.125rem);transform:translateX(calc(var(--gc-right-column-width)/-2))}.group-call.is-big-layout.is-right-column-shown .popup-container{--translateX:calc(var(--gc-right-column-width)/-2)}.group-call.is-big-layout .group-call-header-title{font-size:1.25rem}.group-call.is-big-layout .popup-body{background-color:#212121;background-color:var(--gc-background-color);bottom:0;padding:inherit;position:absolute;right:-26.25rem;right:calc(var(--gc-right-column-width)*-1);top:0;width:26.25rem;width:var(--gc-right-column-width)}.group-call.is-big-layout .group-call-buttons{bottom:2.5rem;padding:.75rem}body.animation-level-2 .group-call.is-big-layout .group-call-buttons{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.group-call.is-big-layout .group-call-buttons:before{-webkit-backdrop-filter:blur(100px);backdrop-filter:blur(100px);background:rgba(0,0,0,.5);border-radius:1.25rem;bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.group-call.is-big-layout .group-call-buttons .group-call-button,.group-call.is-big-layout .group-call-buttons:before{opacity:0}.group-call.is-big-layout .group-call-buttons.show-controls .group-call-button,.group-call.is-big-layout .group-call-buttons.show-controls:before{opacity:1}body.animation-level-2 .group-call.is-big-layout .group-call-buttons:before{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}body.animation-level-2 .group-call.is-big-layout .group-call-buttons .group-call-button{transition:opacity .3s cubic-bezier(.4,0,.2,1),background-color .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in),background-color var(--transition-standard-in)}.group-call.is-big-layout .group-call-participants-scrollable{padding-bottom:.5rem}.group-call.is-big-layout .group-call-header-subtitle{display:none}.popup-sponsored .scrollable-y{margin:0 -1.5rem;max-height:25rem;padding:.5rem 1.5rem;position:relative;-webkit-user-select:text;-moz-user-select:text;user-select:text;width:calc(100% + 3rem)}.popup-mute .popup-container{min-width:16rem}.popup-reacted-list{--size:1.5rem;--custom-emoji-size:var(--size)}.popup-reacted-list .popup-container{height:600px;max-height:600px;padding:0;width:25rem}.popup-reacted-list .popup-header{border-bottom:1px solid #dfe1e5;border-bottom:1px solid var(--border-color);margin:0;min-height:3.5625rem;padding:.25rem .75rem .75rem}.popup-reacted-list .popup-close{height:40px;margin-right:.5rem;margin-top:.375rem;order:-1}.popup-reacted-list .reaction{--reaction-size:var(--size);--additional-height:.75rem;--margin:.5rem;--background-color:var(--light-filled-primary-color);--counter-color:var(--primary-color);flex:1 0 auto;justify-content:space-evenly}.popup-reacted-list .reaction.is-chosen:not(.backwards){--counter-color:#fff}.popup-reacted-list .reaction-sticker-icon{font-size:1.25rem!important}.popup-reacted-list .reaction-sticker-icon{align-items:center;display:flex;margin:0}.popup-reacted-list .sidebar-left-section{margin-bottom:0!important}.popup-reacted-list .tabs-container{flex:1 1 auto;overflow:hidden}.popup-reacted-list .tabs-tab{background-color:#fff;background-color:var(--surface-color)}.popup-reacted-list .reacted-list-reaction-icon{display:flex;height:var(--size);position:absolute;right:1rem;top:50%;transform:translateY(-50%);width:var(--size)}.popup-reacted-list .chatlist-chat{padding-right:3.25rem!important}.popup-payment .popup-container{border-radius:16px;max-height:min(100%,43.5rem);max-width:26.25rem;padding:0;width:26.25rem}.popup-payment .popup-header{height:3.5rem;margin:0;padding:0 1rem}.popup-payment.is-loading .popup-container{min-height:26.25rem}.popup-payment .scrollable{display:flex;flex:1 1 auto;flex-direction:column}.popup-payment hr{display:block!important;margin:.5rem 0!important;padding:0!important}.popup-payment .input-field{--height:3rem;margin:.75rem .5rem 0}.popup-payment .input-field-input{--padding:.75rem}.popup-payment .input-fields-row .input-field{margin-top:1.25rem}.popup-payment .sidebar-left-section{padding:0!important}.popup-payment .sidebar-left-section-name+.input-field,.popup-payment .sidebar-left-section-name+.input-fields-row .input-field{margin-top:.75rem}.popup-payment .sidebar-left-section .row{margin-top:.5rem}.popup-payment .sidebar-left-section-content{margin:0 .5rem!important}.popup-payment .select-wrapper{box-shadow:0 0 10px rgba(0,0,0,.15);box-shadow:var(--menu-box-shadow);max-height:10rem}.popup-payment .select-wrapper li{grid-template-columns:calc(26px + 2rem) 1fr;height:3rem}.popup-payment .payment-verification{border:none;flex:1 1 auto;height:40rem;max-height:100%;width:100%}.popup-payment .row{border-radius:10px}.payment-item{padding:0 1.25rem;width:100%}.payment-item-details{display:flex;flex:0 0 auto;justify-content:space-between;margin-bottom:1rem;overflow:hidden}.payment-item-details:last-child{margin-bottom:0}.payment-item-details-photo{border-radius:10px;flex:0 0 auto;height:6.25rem;margin-right:1rem;width:6.25rem}.payment-item-details-photo .media-photo{border-radius:inherit}.payment-item-details-lines{display:flex;flex:1 1 auto;flex-direction:column}.payment-item-details-lines-title{font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);line-height:21px;line-height:var(--line-height-16)}.payment-item-details-lines-bot-name,.payment-item-details-lines-description{font-size:14px;font-size:var(--font-size-14);line-height:1.25rem}.payment-item-details-lines-bot-name{color:#707579;color:var(--secondary-text-color)}.payment-item-prices{display:flex;flex-direction:column;margin:1rem .25rem .5rem}.payment-item-prices-price{color:#707579;color:var(--secondary-text-color);display:flex;font-weight:500;justify-content:space-between;line-height:1.1875rem}.payment-item-prices-price+.payment-item-prices-price{margin-top:1.5rem}.payment-item-prices-price.is-total{color:#000;color:var(--primary-text-color)}.payment-item-tips{display:flex;justify-content:space-between;margin:.75rem -.5rem 1.5rem}.payment-item-tips-tip{--background-intensity:.1;background-color:rgba(84,190,97,var(--background-intensity));border-radius:1.25rem;color:#3ba748;flex:1 1 auto;font-size:16px;font-size:var(--font-size-16);font-weight:500;font-weight:var(--font-weight-bold);height:2.5rem;line-height:2.5rem;text-align:center}body.animation-level-2 .payment-item-tips-tip{transition:color .1s ease-in-out,background-color .1s ease-in-out}.payment-item-tips-tip+.payment-item-tips-tip{margin-left:.5rem}html.no-touch .payment-item-tips-tip:not(.active):active,html.no-touch .payment-item-tips-tip:not(.active):hover{--background-intensity:.3}.payment-item-tips-tip.active{--background-intensity:1;color:#fff}.payment-item-tips-input{color:inherit!important;font-weight:inherit!important}.payment-item-tips-input{display:inline}.payment-item-row{margin:0 .5rem;padding-bottom:0;padding-top:0}.payment-item-method-row .media-photo{border-radius:10px}.payment-item-pay{flex:0 0 auto;height:3rem;margin:1rem;text-transform:uppercase;width:auto}.payment-item-preloader-container{flex:1 1 auto;position:relative}.popup-payment-shipping-methods .popup-container{min-height:auto}.popup-payment-shipping-methods .row{margin-top:0!important}.popup-payment-verification .popup-header:after{background-color:#dfe1e5;background-color:var(--border-color);bottom:-1px;content:\" \";height:1px;left:0;position:absolute;right:0}.popup-payment-card-confirmation .popup-container{min-height:auto}.popup-payment-card-confirmation .input-field-password{margin-top:.5rem!important}.popup-limit .popup-container{min-width:min(100%,22.5rem)}.popup-limit-line{align-items:center;display:flex;flex-direction:column;margin:.75rem 0}.popup-limit-hint{align-items:center;color:#fff;display:flex;font-weight:500;font-weight:var(--font-weight-bold);justify-content:center;transform:scale(.6) translate(-280px,16px) rotate(-30deg)}body.animation-level-2 .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.2)}.popup-limit-hint.active{transform:scale(1) translate(0) rotate(0)}.popup-limit-hint-icon{display:flex;font-size:1.25rem;margin-right:.25rem}.popup-limit-button.primary{color:#fff!important}.popup-limit-button.primary{align-items:center;background:linear-gradient(88.39deg,#6c93ff -2.56%,#976fff 51.27%,#df69d1 107.39%);display:flex}.popup-limit-button-icon{display:flex;font-size:1.5rem;margin-left:.625rem}.popup-limit .limit-line{align-self:stretch;margin:1rem .5rem 0}.popup-limit:not(.is-locked) .popup-limit-hint{background:linear-gradient(73.4deg,#6c93ff -7.21%,#976fff 114.57%,#df69d1 241.52%);background-size:200px 2rem;border-radius:1rem;height:2rem;padding:0 .75rem;position:relative}.popup-limit:not(.is-locked) .popup-limit-hint:after{background:inherit;background-position-x:calc(-50% - 86px);background-repeat:no-repeat;background-size:inherit;bottom:-9px;-webkit-clip-path:path(\"M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z\");clip-path:path(\"M0 0H26H24.4853C22.894 0 21.3679 0.632141 20.2426 1.75736L14.4142 7.58579C13.6332 8.36684 12.3668 8.36683 11.5858 7.58579L5.75736 1.75736C4.63214 0.632139 3.10602 0 1.51472 0H0Z\");content:\" \";display:block;height:9px;left:50%;margin-left:-13px;position:absolute;width:100%}.popup-limit.is-locked .popup-limit-hint{background-color:#3390ec;background-color:var(--primary-color);border-radius:1.375rem;height:2.75rem;margin-right:-.25rem;padding:0 1.25rem 0 1rem}.popup-limit.is-premium .popup-limit-hint{align-self:flex-end;background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);background-position-x:100%;background-size:200px 2rem;border-bottom-right-radius:0;margin-right:.5rem}body.animation-level-2 .popup-limit.is-premium .popup-limit-hint{transition:transform .3s cubic-bezier(.12,1.1,.56,1.1)}.popup-limit.is-premium .popup-limit-hint:after{background-position-x:134%;bottom:-11.3px;-webkit-clip-path:path(\"M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z\");clip-path:path(\"M8.44528 0.5H20.5V10.1943C20.5 10.9154 19.9154 11.5 19.1943 11.5C18.8178 11.5 18.4597 11.3375 18.2117 11.0541L10.2274 1.92918C9.75146 1.38523 9.18812 0.924478 8.56057 0.565879L8.44528 0.5Z\");height:12px;left:100%;margin-left:-20.6px}#auth-pages{background:#fff;background:var(--surface-color);max-width:100%;overflow:hidden}#auth-pages .btn-primary{text-transform:uppercase}@media only screen and (max-width:600px){#auth-pages .btn-primary{height:50px}}#auth-pages .subtitle{margin:0}@media only screen and (max-width:600px){#auth-pages .subtitle{font-size:14px}}#auth-pages .input-wrapper{margin-top:49px}@media only screen and (max-width:600px){#auth-pages .input-wrapper{margin-top:41px;padding:0 16px;width:100%}}#auth-pages .auth-image,#auth-pages .input-wrapper,#auth-pages .subtitle{flex:0 0 auto}#auth-pages>.scrollable{display:flex;flex-direction:column;margin:0 auto;max-width:720px;position:relative}#auth-pages>.scrollable .auth-placeholder{flex:1;min-height:3rem;width:100%}@media screen and (max-height:810px){#auth-pages>.scrollable .auth-placeholder:last-child{display:none}}#auth-pages .tabs-container{margin:0 auto;max-width:720px;min-width:auto;position:relative}#auth-pages .tabs-container .tabs-tab{background-color:#fff;background-color:var(--surface-color)}#auth-pages .tabs-container .tabs-tab .container{display:flex;flex:1 1 auto;flex-direction:column;height:810px;padding:0;width:100%}@media screen and (max-height:810px){#auth-pages .tabs-container .tabs-tab .container{height:760px}}@media only screen and (max-width:600px){#auth-pages .page-password .input-wrapper{margin-top:31px}}#auth-pages .page-password .input-wrapper .btn-primary{margin-top:1rem}.page-sign .checkbox-field{margin-bottom:.5rem;margin-top:.5rem}.page-sign .auth-image,.page-signUp .auth-image{height:7.5rem;margin-bottom:1.5rem;width:7.5rem}@media only screen and (min-width:601px){.page-sign .auth-image,.page-signUp .auth-image{height:10rem;margin-bottom:1.5rem;width:10rem}}.page-authCode .phone-wrapper{flex:0 0 auto}.sign-logo{fill:#3390ec;fill:var(--primary-color);max-height:100%;max-width:100%}.page-sign .btn-secondary,.page-signQR .btn-secondary{font-weight:400}.page-sign .qr,.page-signQR .qr{margin-top:1.5rem}.page-signQR{overflow:visible!important;overflow:initial!important}.page-signQR .auth-image{height:240px!important;width:240px!important}.page-signQR .auth-image{align-items:center;display:flex;justify-content:center}.page-signQR .auth-image .preloader{left:auto;top:auto;transform:none}.page-signQR .auth-image .qr-canvas{height:100%;width:100%}.page-signQR .auth-image .qr-canvas+.qr-canvas{display:none}.page-signQR .input-wrapper{margin-top:1rem!important}.page-signQR h4{flex:0 0 auto}[dir=ltr] .page-signQR .qr-description{text-align:left}[dir=rtl] .page-signQR .qr-description{text-align:right}.page-signQR .qr-description{line-height:1.3125;line-height:var(--line-height);margin:1rem auto;max-width:480px}.page-signQR .qr-description li{margin-top:.5rem}.page-signUp .auth-image{margin-bottom:14px;margin-top:10px}@media only screen and (max-width:600px){.page-signUp .auth-image{margin-bottom:24px}}.page-signUp .fullName{flex:0 0 auto}@media only screen and (max-width:600px){.page-signUp #signUp{margin-top:100px}}.page-signUp .input-field{text-align:left;text-align:initial}.page-sign .btn-primary{margin-top:1.1875rem}#auth-pages>.scrollable,#main-columns{opacity:1;transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.page-authCode .auth-image{transform:translateY(12px)}.page-authCode .phone-wrapper{align-items:center;display:flex;justify-content:center;margin:1.375rem 0 .875rem}.page-authCode .phone-wrapper h4[contenteditable]{border:none;border-bottom:2px solid #3390ec;border-bottom:2px solid var(--primary-color);outline:none;padding:0 1rem}.page-authCode .phone-wrapper .phone.error{border-color:#df3f40!important;border-color:var(--danger-color)!important}.page-authCode .phone-wrapper .phone{margin:0}.page-authCode .subtitle{margin:0 auto!important}.page-authCode .subtitle{max-width:300px}.page-chats{max-width:1682px!important}.page-chats{display:flex}.page-chats .avatar-edit .tgico-cameraadd{top:52%}.page-chats #main-columns{height:100%;max-height:100%;min-height:100%;overflow:hidden;position:relative;width:100%}@media only screen and (max-width:600px){.page-chats .main-column{display:flex!important}.page-chats .main-column{width:100%;z-index:1}}@media only screen and (min-width:601px){.page-chats #column-center{display:flex!important}.page-chats #column-center{background-color:#e6ebee;width:100%}.page-chats #column-right{display:flex!important}.page-chats .main-column{height:100%;max-height:100%;min-height:100%;position:relative}.page-chats #main-columns{display:flex}}.page-chats #search-container,.page-chats .sidebar-search{flex-direction:column;height:100%;left:0;max-height:100%;overflow:hidden;position:absolute;top:0;width:100%;z-index:3}@media only screen and (min-width:1681px){.page-chats{border-color:#dfe1e5;border-color:var(--border-color);border-style:solid;border-width:0 1px}}.page-chats .avatar-edit{flex:0 0 auto;height:120px;margin:1rem auto 2rem;width:120px}body.animation-level-2 .page-chats .main-column{transition:transform .2s ease-in-out,filter .2s ease-in-out;transition:transform var(--tabs-transition),filter var(--tabs-transition)}body,html{height:100%;margin:0;overflow:hidden;padding:0;width:100%}@media only screen and (max-width:600px){body,html{height:100vh;height:calc(var(--vh, 1vh)*100)}}html.is-ios{-webkit-touch-callout:none;position:fixed;-webkit-user-select:none}html.no-backdrop{--menu-background-color:var(--surface-color);--menu-backdrop-filter:none}@supports(padding:max(0px)){html{padding:0 min(16px,env(safe-area-inset-right)) 0 min(16px,env(safe-area-inset-left))}}html{-webkit-font-smoothing:antialiased;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:16px}body{background-color:#fff;background-color:var(--body-background-color);color:#000;color:var(--primary-text-color)}body.deactivated{animation:grayscale-in .3s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-in var(--transition-standard-in) forwards}body.deactivated-backwards{animation:grayscale-out .25s cubic-bezier(.4,0,.2,1) forwards;animation:grayscale-out var(--transition-standard-out) forwards}@keyframes grayscale-in{0%{filter:grayscale(0)}to{filter:grayscale(1)}}@keyframes grayscale-out{0%{filter:grayscale(1)}to{filter:grayscale(0)}}a{color:#00488f;color:var(--link-color)}button,html,input,optgroup,select,textarea{font-family:Roboto,-apple-system,apple color emoji,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}a,button,div,input,select,textarea{-webkit-tap-highlight-color:rgba(0,0,0,0)}code,kbd,pre,samp{font-family:Roboto Mono,monospace;font-family:var(--font-monospace)}.whole{height:100%;margin:0 auto;max-width:1680px;min-height:100%;width:100%}@media only screen and (min-width:601px){.only-handhelds{display:none!important}}.container{margin:0 auto}h1,h2,h3,h4,h5,h6{font-weight:500;font-weight:var(--font-weight-bold)}h4{font-size:2rem;line-height:110%;margin:22px 0 14px}@media only screen and (max-width:600px){h4{font-size:20px;margin:2px 0 8px}}[contenteditable=true],input{background-color:transparent;caret-color:#3390ec;caret-color:var(--primary-color);color:#000;color:var(--primary-text-color)}input,textarea{-webkit-appearance:none}input::-webkit-contacts-auto-fill-button,input::-webkit-credentials-auto-fill-button{position:absolute;right:0;visibility:hidden}input:-webkit-autofill:first-line{font-family:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,Helvetica Neue,Arial;font-size:16px}.subtitle{color:#707579;color:var(--secondary-text-color);line-height:1.35}.danger{color:#df3f40!important;color:var(--danger-color)!important}.danger .c-ripple__circle{background-color:rgba(223,63,64,.08);background-color:var(--light-danger-color)}.blue,.primary{color:#3390ec!important;color:var(--primary-color)!important}.blue .c-ripple__circle,.primary .c-ripple__circle{background-color:rgba(51,144,236,.08);background-color:var(--light-primary-color)}.primary-text{color:#000!important;color:var(--primary-text-color)!important}.color-premium{-webkit-text-fill-color:transparent;background:linear-gradient(52.62deg,#6b93ff 12.22%,#976fff 50.25%,#e46ace 98.83%);background:var(--premium-gradient);-webkit-background-clip:text}.blue:before,.danger:before,.primary:before{color:inherit!important}.bg-warning{background:#fed85a!important}.contextmenu{bottom:auto!important;position:fixed!important;right:auto!important;width:auto!important;z-index:4!important}.preloader{height:50px;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:50px}.preloader .preloader-path{stroke:#3390ec;stroke:var(--primary-color)}@keyframes thumbnail-fade-in-opacity{0%{opacity:0}to{opacity:.8}}@keyframes fade-in-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-out-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-in-backwards-opacity{0%{opacity:1}to{opacity:0}}@keyframes fade-out-backwards-opacity{0%{opacity:0}to{opacity:1}}@keyframes fade-in-opacity-fade-out-opacity{0%{opacity:0}10%{opacity:1}50%{opacity:1}to{opacity:0}}.toast{-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);background-color:rgba(0,0,0,.66);border-radius:10px;color:#fff;font-size:1rem;left:50%;max-width:min(30rem,calc(100vw - 2rem));opacity:0;padding:.5rem 1rem;position:fixed;top:50%;transform:translate(-50%,-50%);z-index:5}.toast.is-visible{opacity:1}body.animation-level-2 .toast{transition:opacity .3s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-in)}.toast b{color:inherit}.toast a{color:#60a5e9!important}.toast a{cursor:pointer}hr{border:none;border-top:1px solid #dfe1e5;border-top:1px solid var(--border-color);margin:0;padding-bottom:.5rem;width:100%}b{font-weight:500;font-weight:var(--font-weight-bold)}.avatar-edit{border-radius:50%;cursor:pointer;overflow:hidden;position:relative}.avatar-edit.is-forum{border-radius:37%;border-radius:var(--avatar-border-radius-forum)}.avatar-edit-canvas{background:linear-gradient(#69bffa,#3d9de0);background:linear-gradient(var(--avatar-color-top),var(--avatar-color-bottom));height:100%;max-height:100%;max-width:100%;width:100%}html.no-touch body.animation-level-2 .avatar-edit .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1);transition:transform .2s ease-in-out}html.no-touch body.animation-level-2 .avatar-edit:hover .tgico-cameraadd{transform:translateY(-50%) translateX(-50%) scale(1.2)}.avatar-edit .tgico-cameraadd{color:#fff;font-size:3rem;height:3rem;left:50%;line-height:1;position:absolute;top:50%;transform:translateY(-50%) translateX(-50%);width:3rem;z-index:2}.avatar-edit .avatar-placeholder{filter:brightness(.7);height:100%;left:0;position:absolute;top:0;width:100%}.missing-icon{height:1.5rem;width:1.5rem}.missing-icon-path{fill:currentColor}.select-wrapper{background-color:#fff;background-color:var(--surface-color);border-radius:10px;display:flex;flex-direction:column;flex-wrap:wrap;left:0;max-height:23.5rem;opacity:0;overflow:hidden;position:absolute;top:calc(100% + .5rem);transform:scale(.95);transform-origin:top center;transition:opacity .2s ease-out,transform .2s ease-out;width:100%;z-index:3}.select-wrapper.active{opacity:1;transform:scale(1)}.select-wrapper ul{margin:.5rem 0}[dir=ltr] .select-wrapper li{text-align:left}[dir=rtl] .select-wrapper li{text-align:right}.select-wrapper li{align-items:center;cursor:pointer;display:grid;grid-template-columns:calc(26px + 2rem) 1fr 80px;height:3.5rem;justify-content:space-between;padding:0 1rem}html.no-touch .select-wrapper li:active,html.no-touch .select-wrapper li:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.select-wrapper .emoji{font-size:26px;height:26px;line-height:1;width:26px}.select-wrapper .scrollable{position:relative}[dir=ltr] .phone-code{text-align:right}[dir=rtl] .phone-code{text-align:left}.phone-code{color:#9e9e9e}.auth-image{height:166px;margin:0 auto 18px;position:relative;width:166px}@media only screen and (max-width:600px){.auth-image{height:120px;width:120px}}[dir=ltr] .phone-edit{margin-left:.4rem}[dir=rtl] .phone-edit{margin-right:.4rem}.phone-edit{cursor:pointer;font-size:1.5rem;height:1.5rem;line-height:1;opacity:.5;transition:opacity .2s;width:1.5rem}html.no-touch .phone-edit:active,html.no-touch .phone-edit:hover{opacity:1}span.emoji{display:inline!important;line-height:1!important;vertical-align:baseline!important;vertical-align:initial!important}span.emoji{font-family:apple color emoji,segoe ui emoji,noto color emoji,android emoji,emojisymbols,emojione mozilla,twemoji mozilla,segoe ui symbol}@media not screen and (-webkit-min-device-pixel-ratio:2),not screen and (min-device-pixel-ratio:2),not screen and (min-resolution:192dpi),not screen and (min-resolution:2dppx){html[dir=ltr]:not(.is-safari) span.emoji{margin-right:5px!important}html[dir=rtl]:not(.is-safari) span.emoji{margin-left:5px!important}html[dir=ltr]:not(.is-safari) avatar-element span.emoji{margin-right:0!important}html[dir=rtl]:not(.is-safari) avatar-element span.emoji{margin-left:0!important}}img.emoji{display:inline-block;height:18px;max-height:100%;max-width:100%;vertical-align:middle;width:18px}[contenteditable=true]{cursor:text;outline:none;-webkit-user-select:text;-moz-user-select:text;user-select:text;white-space:pre-wrap}[contenteditable=true] .custom-emoji{display:inline-block;margin-bottom:-2px}[contenteditable=true] .custom-emoji:before{content:none}[contenteditable=true] [style*=markup]{font-family:inherit!important}[contenteditable=true] [style*=bold]{font-weight:700}[contenteditable=true] [style*=italic]{font-style:italic}[contenteditable=true] [style*=underline]{text-decoration-line:underline}[contenteditable=true] [style*=strikethrough]{text-decoration-line:line-through}[contenteditable=true] [style*=underline][style*=strikethrough]{text-decoration-line:underline line-through}[contenteditable=true] [style*=monospace]{font-family:Roboto Mono,monospace!important;font-family:var(--font-monospace)!important}[contenteditable=true] [style*=spoiler]{background-color:#d9d9d9;background-color:var(--spoiler-draft-background-color)}[contenteditable][data-placeholder]:before{color:#a2acb4;content:attr(data-placeholder);display:block;opacity:0;pointer-events:none;position:absolute}body.animation-level-2 [contenteditable][data-placeholder]:before{transform:translateX(1.75rem);transition:opacity .2s ease-out .01s,transform .2s ease-out .01s;transition:opacity var(--input-transition) .01s,transform var(--input-transition) .01s}[contenteditable][data-placeholder]:empty:before{opacity:1}body.animation-level-2 [contenteditable][data-placeholder]:empty:before{transform:translateX(0)}.sticky_sentinel{left:0;pointer-events:none;position:absolute;right:0;visibility:hidden}.super-stickers{display:grid;grid-template-columns:repeat(auto-fill,72px);grid-template-columns:repeat(auto-fill,var(--esg-sticker-size));justify-content:space-between;width:100%}html.no-touch .super-sticker:active,html.no-touch .super-sticker:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:10px}.fade-in-transition{opacity:1}body.animation-level-2 .fade-in-transition{transition:opacity .2s ease-in-out}.show-more{cursor:pointer;padding-bottom:13px;padding-top:13px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}@media only screen and (min-width:601px){[dir=ltr] .show-more{padding-left:8px}[dir=rtl] .show-more{padding-right:8px}}[dir=ltr] .show-more .tgico-down{padding-left:1rem;padding-right:2rem}[dir=rtl] .show-more .tgico-down{padding-left:2rem;padding-right:1rem}.show-more .tgico-down{float:left;font-size:24px}.content-empty,.show-more .tgico-down{color:#707579;color:var(--secondary-text-color)}::-moz-selection{background:rgba(51,144,236,.4);background:var(--selection-background-color)}.selection:after,::selection{background:rgba(51,144,236,.4);background:var(--selection-background-color)}.selection:after{bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.input-something{display:inline-block}.input-selectable{position:relative}@keyframes grow-icon{0%{opacity:.8;transform:scale(.5)}50%{opacity:1;transform:scale(1.1)}to{transform:scale(1)}}@keyframes hide-icon{0%{opacity:.4;transform:scale(1)}to{opacity:0;transform:scale(.5)}}.popup-disable-password .popup-description,.popup-skip-email .popup-description{max-width:284px}.grid{grid-gap:.25rem;display:grid;grid-auto-rows:1fr;grid-template-columns:repeat(3,1fr);width:100%}.grid-item{cursor:pointer;height:0;padding-bottom:100%;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-item-media{height:100%;left:0;-o-object-fit:cover;object-fit:cover;position:absolute;top:0;width:100%}.animated-super-row{--translateY:100%;bottom:0;left:0;position:absolute;right:0;top:0;transition:transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform var(--pm-transition),opacity var(--pm-transition)}body.animation-level-0 .animated-super-row{transition:none}.animated-super-row.is-hiding{opacity:0}.animated-super-row.is-hiding.from-top{transform:translate3d(0,calc(var(--translateY)*-1),0)}.animated-super-row.is-hiding.from-bottom{transform:translate3d(0,var(--translateY),0)}.animated-counter{display:inline-flex}.animated-counter-decimal{position:relative}.animated-counter-decimal-placeholder{color:transparent}.animated-counter-decimal-wrapper{bottom:0;left:0;position:absolute;right:0;top:0}middle-ellipsis-element{display:block;overflow:hidden;width:100%}.album-item-media{height:100%;width:100%}html.no-touch .hover-effect:active,html.no-touch .hover-effect:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.progress-ring{left:0;pointer-events:none;position:absolute;top:0}.progress-ring__circle{stroke-linecap:round;transition:stroke-dashoffset}.rlottie,.rlottie-vector{bottom:0;height:100%;left:0;max-height:100%;max-width:100%;position:absolute;right:0;top:0;width:100%}.rlottie-icon{pointer-events:none;position:relative}body.animation-level-2 .rlottie.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}.rlottie-vector{fill:rgba(0,0,0,.08)}.canvas-thumbnail{height:100%;position:absolute;width:100%}.media-container-contain{position:relative}.media-container-contain .media-photo{max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain}.media-container-cover{position:relative}.media-container-cover .media-photo{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.media-photo,.media-poster,.media-round,.media-sticker,.media-video{bottom:0;left:0;position:absolute;right:0;top:0}body.animation-level-2 .media-photo.fade-in,body.animation-level-2 .media-poster.fade-in,body.animation-level-2 .media-round.fade-in,body.animation-level-2 .media-sticker.fade-in,body.animation-level-2 .media-video.fade-in{animation:fade-in-opacity .2s ease-in-out forwards}body.animation-level-2 .media-photo.fade-out,body.animation-level-2 .media-poster.fade-out,body.animation-level-2 .media-round.fade-out,body.animation-level-2 .media-sticker.fade-out,body.animation-level-2 .media-video.fade-out{animation:fade-out-opacity .2s ease-in-out forwards}.media-video{z-index:1}.media-sticker{height:100%;margin:auto;max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;width:100%}.media-sticker-wrapper.is-premium-sticker:before{align-items:center;background:rgba(0,0,0,.2);background-image:var(--lock-url);background-repeat:no-repeat;background-size:cover;border-radius:50%;bottom:.125rem;color:#fff;display:flex;height:1.25rem;justify-content:center;left:50%;position:absolute;transform:translateX(-50%);width:1.25rem;z-index:1}body.is-premium .media-sticker-wrapper.is-premium-sticker:after,body.is-premium .media-sticker-wrapper.is-premium-sticker:before{content:none}.media-round{max-height:280px;max-height:var(--round-video-size);max-width:280px;max-width:var(--round-video-size);z-index:1}.media-round canvas{border-radius:50%;height:100%;position:relative;width:100%}.media-round .video-time{background-color:rgba(109,141,65,.4)!important;background-color:var(--message-highlightning-color)!important}.media-round .video-time{padding:0 .375rem}[dir=ltr] .media-round .video-time:after,[dir=ltr] .media-round .video-time:before{margin-left:.25rem}[dir=rtl] .media-round .video-time:after,[dir=rtl] .media-round .video-time:before{margin-right:.25rem}.media-round.is-unread .video-time:before{background-color:#fff;border-radius:50%;content:\" \";height:.5rem;order:1;width:.5rem}.media-round.is-paused .video-time:after{align-items:center;content:\"\";display:flex;font-size:1.125rem;order:2}.gradient-delimiter{background-color:#f4f4f5;background-color:var(--background-color-true);height:.75rem;position:relative;width:100%}.gradient-delimiter:before{background:linear-gradient(180deg,rgba(0,0,0,.06),transparent 20%,transparent 94%,rgba(0,0,0,.06));bottom:0;content:\" \";left:0;position:absolute;right:0;top:0}.sidebar-left-section{padding:.5rem 0!important}.sidebar-left-section{background-color:#fff;background-color:var(--surface-color);box-shadow:0 1px 3px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 var(--section-box-shadow-color);margin-bottom:.75rem}.sidebar-left-section.no-shadow{box-shadow:none!important}.sidebar-left-section-name{padding:.5rem 1rem}.sidebar-left-section-caption{font-size:14px;font-size:var(--font-size-14);line-height:18px;line-height:var(--line-height-14);margin:-.1875rem 0 1rem;padding:0 1.5rem}.sidebar-left-section-caption:first-child{margin-bottom:.8125rem;margin-top:.8125rem}@media only screen and (max-width:600px){.sidebar-left-section-caption{padding:0 1rem}}.sidebar-left-section-container{-webkit-user-select:none;-moz-user-select:none;user-select:none}.sidebar-left-section-container a{cursor:pointer}hr{display:none!important}.tgico-admin:before,.tgico-fontsize:before{font-size:20px!important}.tgico-admin:before,.tgico-fontsize:before{padding:2px}.tgico-endcall_filled,.tgico-phone_filled{font-size:26px!important}.stealthy{left:0;margin:0;max-height:1px;max-width:1px;opacity:0;outline:none;overflow:hidden;pointer-events:none;position:absolute;top:0;z-index:-1}.navigable-list .active{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:inherit}.super-emojis{--esg-emoji-total-size:calc(var(--esg-emoji-size) + 0.5rem);--custom-emoji-size:var(--esg-emoji-size);grid-column-gap:2.44px;--esg-emoji-size:2.125rem;--esg-emoji-total-size:2.625rem;--custom-emoji-size:2.25rem;-moz-column-gap:2.44px;column-gap:2.44px;-moz-column-gap:.25rem;column-gap:.25rem;display:grid;font-size:var(--esg-emoji-size);grid-template-columns:repeat(auto-fill,var(--esg-emoji-total-size));justify-content:space-between;line-height:var(--esg-emoji-size);position:relative}.super-emojis .super-emoji{border-radius:8px;cursor:pointer;display:inline-block;height:var(--esg-emoji-total-size);line-height:inherit;margin-left:.0625rem;margin-right:.0625rem;padding:.25rem;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;width:var(--esg-emoji-total-size)}.super-emojis .super-emoji .emoji-placeholder{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color);border-radius:50%;height:1.75rem;left:7px;pointer-events:none;position:absolute;top:7px;width:1.75rem}body.animation-level-2 .super-emojis .super-emoji .emoji-placeholder{opacity:0;transition:opacity .2s ease-in-out}body.animation-level-2 .super-emojis .super-emoji img{opacity:1;transition:opacity .2s ease-in-out}.super-emojis .super-emoji .emoji{height:100%;margin:0;vertical-align:baseline;vertical-align:initial;width:100%}.super-emojis .super-emoji.active,html.no-touch .super-emojis .super-emoji:active,html.no-touch .super-emojis .super-emoji:hover{background-color:hsla(207,4%,46%,.08);background-color:var(--light-secondary-text-color)}.super-emojis.not-local .super-emoji{padding:.1875rem}.super-emojis .super-emoji{margin:0}.super-emojis:not(.not-local) .super-emoji{overflow:hidden}html.native-emoji .super-emojis:not(.not-local) .super-emoji{padding-bottom:.3125rem;padding-top:.3125rem}.super-emojis .custom-emoji{display:block}.super-emojis .custom-emoji-renderer{z-index:1}.super-emojis .custom-emoji:before{content:none}.tgico-char:before{font-family:Roboto!important}.tgico-char:before{font-weight:500;font-weight:var(--font-weight-bold);text-align:center;width:1.5rem}.tgico-char.z:before{content:\"Z\"}.tgico-char.w:before{content:\"W\"}.sending-status:empty{display:none}.sending-status .tgico-sendingerror{color:#df3f40;color:var(--danger-color)}.sending-status-icon{line-height:1!important}.sending-status-icon{position:absolute}.quick-reaction-title{align-items:center;display:flex}.quick-reaction-sticker{height:32px!important;margin:0 .5rem 0 0!important;position:relative!important;width:32px!important}.verified-icon-svg{height:1rem;width:1rem}.verified-icon-check{fill:#fff}.verified-icon-background{fill:#3390ec;fill:var(--primary-color)}[dir=ltr] .emoji-status,[dir=ltr] .premium-icon,[dir=ltr] .verified-icon{margin-left:.125rem}[dir=rtl] .emoji-status,[dir=rtl] .premium-icon,[dir=rtl] .verified-icon{margin-right:.125rem}.emoji-status,.premium-icon,.verified-icon{align-items:center;display:flex;flex:0 0 auto;font-size:1rem;height:1.25rem;justify-content:center;width:1.25rem}[dir=ltr] .emoji-status{margin-left:.25rem}[dir=rtl] .emoji-status{margin-right:.25rem}.emoji-status{height:1.125rem;position:relative;width:1.125rem}.premium-icon{color:#3390ec;color:var(--primary-color);margin-top:-.0625rem}.badge-fake{line-height:1!important}.badge-fake{border:1px solid #df3f40;border:1px solid var(--danger-color);border-radius:.185rem;color:#df3f40;color:var(--danger-color);flex:0 0 auto;font-size:.625rem;font-weight:500;font-weight:var(--font-weight-bold);margin-left:.25rem;margin-right:.25rem;padding:.125rem .25rem}.peer-title.with-icons{align-items:center;display:flex;overflow:hidden}.peer-title-inner{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.limit-line{display:flex;font-weight:500;font-weight:var(--font-weight-bold);height:2rem}.limit-line-free{color:#000}.limit-line-premium{color:#fff}.limit-line-free{background-color:#f1f3f5;border-bottom-left-radius:10px;border-top-left-radius:10px}.limit-line-premium{background:linear-gradient(84.4deg,#6c93ff -4.85%,#976fff 51.72%,#df69d1 110.7%);border-bottom-right-radius:10px;border-top-right-radius:10px}.limit-line-free,.limit-line-premium{align-items:center;display:flex;flex:1 1 0;justify-content:space-between;padding:0 .75rem}.movable-element{--size:.5rem;position:relative}.movable-element-resize-handler{position:absolute}.movable-element-resize-handler-side-n,.movable-element-resize-handler-side-s{cursor:row-resize;height:var(--size);left:0;right:0}.movable-element-resize-handler-side-e,.movable-element-resize-handler-side-w{bottom:0;cursor:col-resize;top:0;width:var(--size)}.movable-element-resize-handler-side-n{top:0}.movable-element-resize-handler-side-e{right:0}.movable-element-resize-handler-side-s{bottom:0}.movable-element-resize-handler-side-w{left:0}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se,.movable-element-resize-handler-side-sw{height:var(--size);width:var(--size);z-index:1}.movable-element-resize-handler-side-ne,.movable-element-resize-handler-side-sw{cursor:nesw-resize}.movable-element-resize-handler-side-nw,.movable-element-resize-handler-side-se{cursor:nwse-resize}.movable-element-resize-handler-side-ne{right:0;top:0}.movable-element-resize-handler-side-se{bottom:0;right:0}.movable-element-resize-handler-side-sw{bottom:0;left:0}.movable-element-resize-handler-side-nw{left:0;top:0}[dir=ltr] .chatlist-chat.row-with-padding{padding-left:4.5rem!important}[dir=rtl] .chatlist-chat.row-with-padding{padding-right:4.5rem!important}.chatlist-chat span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatlist-chat .row-title{font-size:16px!important;font-size:var(--font-size-16)!important}.chatlist-chat .row-title{line-height:1.375rem}.chatlist-chat .row-title-right-secondary{font-size:12px!important;font-size:var(--font-size-12)!important;line-height:16px!important;line-height:var(--line-height-12)!important}.chatlist-chat .row-title-right-secondary{margin-top:-.4375rem}.chatlist-chat .row-subtitle{display:block!important}.chatlist-chat .row-row{height:1.375rem}.chatlist-chat.chatlist-chat-abitbigger .row-subtitle{margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle{font-size:16px!important;font-size:var(--font-size-16)!important}.chatlist-chat.chatlist-chat-bigger .row-subtitle{line-height:1.375rem;margin-top:0}.chatlist-chat.chatlist-chat-bigger .row-subtitle-row{margin-top:.125rem}.chatlist-chat.chatlist-chat-bigger .row-title .peer-title{font-weight:500;font-weight:var(--font-weight-bold)}.username-purchase-help b{color:#df3f40!important;color:var(--danger-color)!important;font-weight:400!important;font-weight:var(--font-weight-normal)!important}.media-spoiler-container{border-radius:inherit;bottom:0;left:0;position:absolute;right:0;top:0;z-index:1}.media-spoiler-container.is-revealing{opacity:1}.media-spoiler-container.is-revealing:not(.backwards){opacity:0}.media-spoiler-container.is-revealing.animating{transition:opacity .25s cubic-bezier(.4,0,.2,1);transition:opacity var(--transition-standard-out)}.media-spoiler .canvas-thumbnail,.media-spoiler-thumbnail{-o-object-fit:initial!important;object-fit:fill!important}.media-spoiler .canvas-thumbnail,.media-spoiler-thumbnail{height:100%;position:absolute;width:100%}"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.b54fef5f67745c10b82c.bundle.js b/public/main.b54fef5f67745c10b82c.bundle.js new file mode 100644 index 000000000..3d6421689 --- /dev/null +++ b/public/main.b54fef5f67745c10b82c.bundle.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var e,t,n,s,i,o={410:(e,t,n)=>{n.d(t,{GO:()=>r,Tj:()=>i,ZP:()=>a});var s=n(1267);const i=!1,o=i||s.Z.debug,r="undefined"!=typeof window?window:self,a=o},236:(e,t,n)=>{n.d(t,{h:()=>c});var s=n(4762),i=n(144),o=n(4159);const r=o.Z.version,a=o.Z.build,c={allDialogsLoaded:{},pinnedOrders:{},contactsListCachedTime:0,updates:{},filtersArr:[],maxSeenMsgId:0,stateCreatedTime:Date.now(),recentEmoji:[],recentCustomEmoji:[],topPeersCache:{},recentSearch:[],version:r,build:a,authState:{_:s.IS_MOBILE?"authStateSignIn":"authStateSignQr"},hiddenPinnedMessages:{},settings:{messagesTextSize:16,distanceUnit:"kilometers",sendShortcut:"enter",animationsEnabled:!0,autoDownload:{photo:{contacts:!0,private:!0,groups:!0,channels:!0},video:{contacts:!0,private:!0,groups:!0,channels:!0},file:{contacts:!0,private:!0,groups:!0,channels:!0}},autoDownloadNew:{_:"autoDownloadSettings",file_size_max:3145728,pFlags:{video_preload_large:!0,audio_preload_next:!0},photo_size_max:1048576,video_size_max:15728640,video_upload_maxbitrate:100},autoPlay:{gifs:!0,videos:!0},stickers:{suggest:!0,loop:!0},emoji:{suggest:!0,big:!0},themes:[{name:"day",background:s.IS_MOBILE?{blur:!1,slug:"",color:"#dbddbb,#6ba587,#d5d88d,#88b884",highlightningColor:"hsla(86.4, 43.846153%, 45.117647%, .4)",intensity:0,id:"1"}:{blur:!1,slug:"pattern",color:"#dbddbb,#6ba587,#d5d88d,#88b884",highlightningColor:"hsla(86.4, 43.846153%, 45.117647%, .4)",intensity:50,id:"1"}},{name:"night",background:s.IS_MOBILE?{blur:!1,slug:"",color:"#0f0f0f",highlightningColor:"hsla(0, 0%, 3.82353%, 0.4)",intensity:0,id:"-1"}:{blur:!1,slug:"pattern",color:"#fec496,#dd6cb9,#962fbf,#4f5bd5",highlightningColor:"hsla(299.142857, 44.166666%, 37.470588%, .4)",intensity:-50,id:"-1"}}],theme:"system",notifications:{sound:!1},timeFormat:(new Date).toLocaleString().match(/\s(AM|PM)/)?"h12":"h23"},playbackParams:{volume:1,muted:!1,playbackRate:1,playbackRates:{voice:1,video:1,audio:1},loop:!1,round:!1},keepSigned:!0,chatContextMenuHintWasShown:!1,stateId:(0,i.d)(32),notifySettings:{}}},8189:(e,t,n)=>{n.d(t,{Z:()=>i});let s=!1;try{const e=document.createElement("canvas").getContext("webgl"),t=e.getExtension("WEBGL_debug_renderer_info"),n=t&&e.getParameter(t.UNMASKED_RENDERER_WEBGL)||"";(n.match(/Apple/)&&!n.match(/Apple GPU/)||-1===e.getSupportedExtensions().indexOf("WEBGL_compressed_texture_s3tc_srgb"))&&(s=!0)}catch(e){}const i=s},993:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n(4089).Z},7328:(e,t,n)=>{let s;if(n.d(t,{Z:()=>i}),n(4762).IS_SAFARI)try{s=+navigator.userAgent.match(/Version\/(.+?) /)[1]>=14}catch(e){s=!1}else s=!0;const i=s},6663:(e,t,n)=>{n.d(t,{Z:()=>s});const s="filter"in(document.createElement("canvas").getContext("2d")||{})},9976:(e,t,n)=>{n.d(t,{Z:()=>s});const s=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i)},3731:(e,t,n)=>{var s;n.d(t,{Z:()=>i});const i=!!(null===(s=null===navigator||void 0===navigator?void 0:navigator.geolocation)||void 0===s?void 0:s.getCurrentPosition)&&!1},6818:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n(4089).Z},1174:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(5269);const i=new Set(["image/jpeg","image/png","image/bmp"]);s.Z&&i.add("image/webp");const o=i},2341:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(1174),i=n(554);const o=[...s.Z].concat([...i.Z]),r=new Set(o)},9030:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!!document.createElement("video").canPlayType("video/quicktime")||s.IS_SAFARI||s.IS_APPLE_MOBILE},5783:(e,t,n)=>{n.d(t,{Z:()=>i});const s=document.createElement("audio"),i=!(!s.canPlayType||!s.canPlayType("audio/ogg;").replace(/no/,""))},2365:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!n(4762).IS_FIREFOX&&!1},2820:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!!("getDisplayMedia"in((null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||{}))},2045:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(1267);const i="undefined"!=typeof SharedWorker&&!s.Z.noSharedWorker},5432:(e,t,n)=>{n.d(t,{Z:()=>s});const s="ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch},4762:(e,t,n)=>{n.r(t),n.d(t,{IS_ANDROID:()=>r,IS_APPLE:()=>o,IS_APPLE_MOBILE:()=>c,IS_CHROMIUM:()=>a,IS_FIREFOX:()=>d,IS_MOBILE:()=>h,IS_MOBILE_SAFARI:()=>u,IS_SAFARI:()=>l,USER_AGENT:()=>i});var s=n(6761);const i=navigator?navigator.userAgent:null,o=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),r=-1!==navigator.userAgent.toLowerCase().indexOf("android"),a=/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),c=(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&!s.Z.MSStream,l=!!("safari"in s.Z)||!(!i||!(/\b(iPad|iPhone|iPod)\b/.test(i)||i.match("Safari")&&!i.match("Chrome"))),d=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,u=l&&c,h=navigator.maxTouchPoints>0&&-1!=navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},2131:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!!(null===navigator||void 0===navigator?void 0:navigator.vibrate)},554:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(9030);const i=new Set(["image/gif","video/mp4","video/webm"]);s.Z&&i.add("video/quicktime");const o=i},393:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!!document.createElement("video").canPlayType("video/webm")&&!s.IS_SAFARI&&!s.IS_APPLE_MOBILE},5269:(e,t,n)=>{n.d(t,{Z:()=>s});const s=document.createElement("canvas").toDataURL("image/webp").startsWith("data:image/webp")},4089:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!("undefined"==typeof RTCPeerConnection||s.IS_FIREFOX)},2064:(e,t,n)=>{function s(e,t,n,s=1){e/=255,t/=255,n/=255;const i=Math.max(e,t,n),o=Math.min(e,t,n);let r,a;const c=(i+o)/2;if(i===o)r=a=0;else{const s=i-o;switch(a=c>.5?s/(2-i-o):s/(i+o),i){case e:r=(t-n)/s+(t1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e},a=n<.5?n*(1+t):n+t-n*t,c=2*n-a;i=s(c,a,e+1/3),o=s(c,a,e),r=s(c,a,e-1/3)}return[Math.round(255*i),Math.round(255*o),Math.round(255*r),Math.round(255*s)]}function o(e){const t=[],n="#"===e[0]?1:0;if(e.length===5+n&&(e=(n?"#":"")+"0"+e.slice(n)),e.length===3+n)for(let s=n;s("0"+e.toString(16)).slice(-2))).join("")}function l(e){return function(e){return c(function(e){const t=e.slice(5,-1).split(", "),n=+t.pop(),s=t.map((e=>e.endsWith("%")?+e.slice(0,-1):+e));return i(s[0],s[1],s[2],n)}(e))}(e).slice(0,-2)}n.d(t,{K5:()=>l,Pi:()=>o,Y6:()=>i,cw:()=>a,dI:()=>s,oo:()=>r,t1:()=>c})},6009:(e,t,n)=>{function s(e,t){e=e.split(" ",1)[0],t=t.split(" ",1)[0];const n=e.split("."),s=t.split(".");for(let e=0;ei)return 1;if(ts})},8799:(e,t,n)=>{function s(){var e;return!!(null===(e=document.activeElement)||void 0===e?void 0:e.blur)&&(document.activeElement.blur(),!0)}n.d(t,{Z:()=>s})},3910:(e,t,n)=>{function s(e){if(e||(e=window.event),e){if(!e.cancelable)return!1;e=e.originalEvent||e;try{e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault(),e.returnValue=!1,e.cancelBubble=!0}catch(e){}}return!1}n.d(t,{Z:()=>s})},8497:(e,t,n)=>{function s(e,t){return e.closest("."+t)}n.d(t,{Z:()=>s})},5494:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(3035);function i(e){e.style.transform="translateY(-99999px)",e.focus(),(0,s.d1)().then((()=>{e.style.transform=""}))}},8090:(e,t,n)=>{n.d(t,{T:()=>a,Z:()=>c});var s=n(5432),i=n(4762),o=n(8497),r=n(5494);const a=i.IS_SAFARI&&i.IS_MOBILE&&s.Z;if(a){const e="clientY";let t=0;const n={capture:!0,passive:!1},s=n=>{const s=n.touches[0],i=(0,o.Z)(s.target,"scrollable-y");if(i){const o=s[e],r=t-o,a=i.scrollTop,c=i.scrollHeight,l=i.clientHeight,d=a?Math.round(a+i.clientHeight+r):a+r;(c===l||d>=c||d<=0)&&n.preventDefault()}else n.preventDefault()};let i=0;document.addEventListener("focusin",(o=>{!o.target.classList.contains("is-sticky-input-bugged")||o.timeStamp-i<50||((0,r.Z)(o.target),document.addEventListener("touchmove",s,n),document.addEventListener("touchstart",(n=>{if(n.touches.length>1)return;const s=n.touches[0];t=s[e]})))}),{passive:!0}),document.addEventListener("focusout",(e=>{document.removeEventListener("touchmove",s,n),i=e.timeStamp}),{passive:!0}),document.addEventListener("visibilitychange",(()=>{document.activeElement&&document.activeElement.classList.contains("is-sticky-input-bugged")&&document.activeElement.blur&&(0,r.Z)(document.activeElement)}),{passive:!0})}function c(e){a&&e.classList.add("is-sticky-input-bugged")}},4541:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(319),i=n(5418);const o=["b","б"],r={},a={text:"Roboto",icons:"tgico",monospace:"Roboto Mono"};function c(e={text:o,icons:void 0,monospace:o}){if(!("fonts"in document))return Promise.resolve();const t=[];for(const n in e){let s=e[n];"all"===s&&(s=o);const i=a[n],c="icons"===n?[500]:[400,500];for(const e of c){const n=(s||[void 0]).map((t=>{var n,s,o,a;const c=[e,"1rem",i].join(" ");return null!==(s=(o=null!==(n=r[c])&&void 0!==n?n:r[c]={})[a=t||""])&&void 0!==s?s:o[a]=document.fonts.load(c,t)}));t.push(...n)}}return Promise.race([Promise.all(t).catch(s.Z),(0,i.Z)(1e3)])}},130:(e,t,n)=>{function s(e,t){i(e),"string"==typeof t?t?e.innerHTML=t:e.replaceChildren():e.replaceChildren(t)}function i(e){e.setAttribute("dir","auto")}n.d(t,{Z:()=>s,m:()=>i})},2586:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(5432),i=n(3241);const o=s.Z?"touchstart":"mousemove";class r extends i.Z{constructor(){super(),this._isIdle=!0,this.focusPromise=Promise.resolve(),this.focusResolve=()=>{},window.addEventListener("blur",(()=>{this.isIdle=!0,window.addEventListener("focus",(()=>{this.isIdle=!1}),{once:!0})})),window.addEventListener(o,(()=>{this.isIdle=!1}),{once:!0,passive:!0}),this.addEventListener("change",(e=>{e?this.focusPromise=new Promise((e=>{this.focusResolve=e})):this.focusResolve()}))}getFocusPromise(){return this.focusPromise}get isIdle(){return this._isIdle}set isIdle(e){this._isIdle!==e&&(this._isIdle=e,this.dispatchEvent("change",e))}}const a=new r},3815:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(3241);class i extends s.Z{constructor(){super(...arguments),this.overlaysActive=0}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("change",this.isOverlayActive)}}const o=new i},3035:(e,t,n)=>{let s;function i(e){s?s.push(e):(s=[e],requestAnimationFrame((()=>{const e=s;s=void 0,e.forEach((e=>e()))})))}n.d(t,{AD:()=>l,T2:()=>i,TR:()=>c,d1:()=>d});let o,r,a=!1;function c(e){o?a?e():o.push(e):(o=[e],requestAnimationFrame((()=>{a=!0;for(let e=0;ei((()=>e())))),r.then((()=>{r=void 0})),r)}function d(){return new Promise((e=>{i((()=>{i(e)}))}))}},764:(e,t,n)=>{function s(e,t=e.split("?")){const n={};return t[1]?(t[1].split("&").forEach((e=>{n[e.split("=")[0]]=decodeURIComponent(e.split("=")[1])})),n):n}n.d(t,{Z:()=>s})},6714:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(5432),i=n(3512),o=n(2064);const r=new class{constructor(){i.Z.addEventListener("theme_change",(()=>{this.setTheme()}))}get themeColorElem(){return void 0!==this._themeColorElem?this._themeColorElem:this._themeColorElem=document.head.querySelector('[name="theme-color"]')||null}setThemeColor(e=this.themeColor){e||(e=this.isNight()?"#212121":"#ffffff");const t=this.themeColorElem;t&&t.setAttribute("content",e)}setThemeListener(){try{const e=window.matchMedia("(prefers-color-scheme: dark)"),t=()=>{this.systemTheme=e.matches?"night":"day",i.Z.myId?i.Z.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(e){}}applyHighlightningColor(){let e;const t=r.getTheme();t.background.highlightningColor?(e=t.background.highlightningColor,document.documentElement.style.setProperty("--message-highlightning-color",e)):document.documentElement.style.removeProperty("--message-highlightning-color"),!s.Z&&e&&(r.themeColor=(0,o.K5)(e))}setTheme(){const e=this.isNight(),t=document.head.querySelector('[name="color-scheme"]');t&&t.setAttribute("content",e?"dark":"light"),document.documentElement.classList.toggle("night",e),this.setThemeColor(),this.applyHighlightningColor()}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===i.Z.settings.theme?this.systemTheme:i.Z.settings.theme)){return i.Z.settings.themes.find((t=>t.name===e))}},a=r},6873:(e,t,n)=>{var s=n(4159),i=n(8799),o=n(3910),r=n(8090),a=n(4541),c=n(9976),l=n(4762),d=n(5418);!function(){const e={construct(e,t){let n=t[0]+"";return 0!==n.indexOf("blob:")&&(n+=location.search),new e(n)}};[Worker,"undefined"!=typeof SharedWorker&&SharedWorker].filter(Boolean).forEach((t=>{window[t.name]=new Proxy(t,e)}))}();var u=n(3512),h=n(5432),g=n(2325),m=(n(4110),n(690),n(3855)),f=n(2554),p=n(6714),v=n(3815),b=n(490),S=n(764),w=n(1267),y=n(410);document.addEventListener("DOMContentLoaded",(()=>{return e=void 0,t=void 0,k=function*(){Element.prototype.toggleAttribute||(Element.prototype.toggleAttribute=function(e,t){return void 0!==t&&(t=!!t),this.hasAttribute(e)?!!t||(this.removeAttribute(e),!1):!1!==t&&(this.setAttribute(e,""),!0)}),void 0===Node.prototype.replaceChildren&&(Node.prototype.replaceChildren=function(...e){this.textContent="",e&&this.append(...e)}),u.Z.managers=(0,f.Z)(),document.getElementById("manifest").href=`site${l.IS_APPLE&&!l.IS_APPLE_MOBILE?"_apple":""}.webmanifest?v=jw3mK7G9Aq`,b.Z.start();const e=window.visualViewport||window;let t,P=!1;const k=()=>{const n=.01*(P&&!v.Z.isOverlayActive?e.height||e.innerHeight:window.innerHeight);t!==n&&(h.Z&&t1&&(0,i.Z)(),t=n,document.documentElement.style.setProperty("--vh",`${n}px`))};if(window.addEventListener("resize",k),k(),r.T){const t=()=>{P=1===n&&r.T&&!v.Z.isOverlayActive,k(),e!==window&&(P?(window.removeEventListener("resize",k),e.addEventListener("resize",k)):(e.removeEventListener("resize",k),window.addEventListener("resize",k)))};let n;window.onImTabChange=e=>{const s=void 0!==n;n=e,(s||1===n)&&t()},v.Z.addEventListener("change",(()=>{t()}))}l.IS_FIREFOX&&!c.Z&&document.addEventListener("dragstart",(e=>{const t=e.target;if("IMG"===t.tagName&&t.classList.contains("emoji"))return(0,o.Z)(e),!1})),c.Z&&document.documentElement.classList.add("native-emoji"),document.addEventListener("dragstart",(e=>{var t;if("IMG"===(null===(t=e.target)||void 0===t?void 0:t.tagName))return e.preventDefault(),!1})),document.addEventListener("contextmenu",(e=>{"IMG"!==e.target.tagName||window.appMediaViewer||(0,o.Z)(e)})),l.IS_FIREFOX&&document.documentElement.classList.add("is-firefox","no-backdrop"),l.IS_MOBILE&&document.documentElement.classList.add("is-mobile"),l.IS_APPLE?(l.IS_SAFARI&&document.documentElement.classList.add("is-safari"),l.IS_APPLE_MOBILE?document.documentElement.classList.add("is-ios"):document.documentElement.classList.add("is-mac")):l.IS_ANDROID&&document.documentElement.classList.add("is-android"),h.Z?document.documentElement.classList.add("is-touch"):document.documentElement.classList.add("no-touch");const E=performance.now(),A=g.ZP.getCacheLangPack(),[_,Z]=yield Promise.all([m.Z.sendState().then((([e])=>e)),A]);function I(e,t){e.style.opacity="0",t.then((()=>{window.requestAnimationFrame((()=>{e.style.opacity=""}))}))}g.ZP.setTimeFormat(_.state.settings.timeFormat),u.Z.managers.rootScope.getPremium().then((e=>{u.Z.premium=e})),p.Z.setThemeListener(),Z.appVersion!==s.Z.langPackVersion&&g.ZP.getLangPack(Z.lang_code),console.log("got state, time:",performance.now()-E),"ar"===Z.lang_code&&y.Tj,document.documentElement.dir="ltr";let C=_.state.authState;const L=location.hash,T=L.split("?"),O=(0,S.Z)(L,T);if(O.tgWebAuthToken&&"authStateSignedIn"!==C._){const e={token:O.tgWebAuthToken,dcId:+O.tgWebAuthDcId,userId:O.tgWebAuthUserId.toUserId(),isTest:void 0!==O.tgWebAuthTest&&!!+O.tgWebAuthTest,tgAddr:O.tgaddr};if(e.isTest!==w.Z.test){const e=new URLSearchParams(location.search);return+O.tgWebAuthTest?e.set("test","1"):e.delete("test"),void(location.search=e.toString())}u.Z.managers.appStateManager.pushToState("authState",C={_:"authStateSignImport",data:e})}if("authStateSignedIn"!==C._){console.log("Will mount auth page:",C._,Date.now()/1e3);const e=document.getElementById("auth-pages");let t,s;if(e){t=e.querySelector(".scrollable"),h.Z&&!l.IS_MOBILE_SAFARI||t.classList.add("no-scrollbar"),t.style.opacity="0";const n=document.createElement("div");n.classList.add("auth-placeholder"),t.prepend(n),t.append(n.cloneNode())}try{yield Promise.all([Promise.resolve().then(n.bind(n,2831)),Promise.resolve().then(n.bind(n,6702))]).then((([e,t])=>{e.default.setAuthorized(!1),t.default.forceUnsubscribe()}))}catch(e){}switch(C._){case"authStateSignIn":s=(yield Promise.all([n.e(539),n.e(460),n.e(63)]).then(n.bind(n,810))).default.mount();break;case"authStateSignQr":s=(yield Promise.all([n.e(539),n.e(460),n.e(709)]).then(n.bind(n,9709))).default.mount();break;case"authStateAuthCode":s=(yield Promise.all([n.e(539),n.e(460),n.e(53)]).then(n.bind(n,6392))).default.mount(C.sentCode);break;case"authStatePassword":s=(yield Promise.all([n.e(539),n.e(460),n.e(437)]).then(n.bind(n,9437))).default.mount();break;case"authStateSignUp":s=(yield Promise.all([n.e(539),n.e(460),n.e(339)]).then(n.bind(n,8339))).default.mount(C.authCode);break;case"authStateSignImport":s=(yield Promise.all([n.e(539),n.e(460),n.e(231)]).then(n.bind(n,3231))).default.mount(C.data)}t&&(s&&(yield s),I(t,"fonts"in document?Promise.race([(0,d.Z)(1e3),document.fonts.ready]):Promise.resolve()))}else console.log("Will mount IM page:",Date.now()/1e3),I(document.getElementById("main-columns"),(0,a.Z)()),(yield Promise.all([n.e(539),n.e(460),n.e(436)]).then(n.bind(n,5436))).default.mount()},new((P=void 0)||(P=Promise))((function(n,s){function i(e){try{r(k.next(e))}catch(e){s(e)}}function o(e){try{r(k.throw(e))}catch(e){s(e)}}function r(e){var t;e.done?n(e.value):(t=e.value,t instanceof P?t:new P((function(e){e(t)}))).then(i,o)}r((k=k.apply(e,t||[])).next())}));var e,t,P,k}))},1722:(e,t,n)=>{n.d(t,{Z:()=>s});const s=new class{reload(){try{location.reload()}catch(e){}}close(){try{window.close()}catch(e){}}focus(){window.focus()}}},2554:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(3855),i=n(410);const o={};function r(e,t){return new Proxy(e,{get:(e,n,r)=>{var a;return null!==(a=e[n])&&void 0!==a?a:e[n]=function(e,t){return new Proxy({},{get:(n,r,a)=>(...n)=>{var a;const c=s.Z.invoke("manager",{name:e,method:r,args:n},t);return i.ZP&&(null===(a=o[e])||void 0===a?void 0:a.has(r))&&console.warn("manager request",e,r,n),c}})}(n,t)}})}let a;function c(){return a||(a=r({},!1),a.acknowledged=r({},!0),a)}i.ZP&&(window.DEBUG_MANAGER_REQUESTS=o)},6666:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(1267),i=n(5471),o=n(5953),r=n(5003);class a{constructor(e){(0,o.Z)(this,e),s.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,r.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),a.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var n;const s=Array.from(e.indexNames);for(const t of s)e.deleteIndex(t);if(null===(n=t.indexes)||void 0===n?void 0:n.length)for(const n of t.indexes)e.indexNames.contains(n.indexName)||e.createIndex(n.indexName,n.keyPath,n.objectParameters)};try{var n=indexedDB.open(this.name,this.version);if(!n)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let s=!1;return setTimeout((()=>{s||n.onerror((0,i.Z)("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,i)=>{n.onsuccess=t=>{s=!0;const o=n.result;let r=!1;this.log("Opened"),o.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),i(e)},o.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},o.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),o.close()},o.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=o)},n.onerror=e=>{s=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),i(e)},n.onupgradeneeded=e=>{s=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const n=e.target,i=n.result;this.stores.forEach((e=>{if(i.objectStoreNames.contains(e.name)){const s=n.transaction.objectStore(e.name);t(s,e)}else((e,n)=>{const s=e.createObjectStore(n.name);t(s,n)})(i,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new a(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())}))}}a.INSTANCES=[];class c{constructor(e,t){this.storeName=t,this.log=(0,r.kg)(["IDB",e.name,t].join("-")),this.idb=a.create(e)}delete(e,t){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,n){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(n=>e.map(((e,s)=>n.put(t[s],e)))),"",n)}get(e,t){return Array.isArray(e)||(e=[].concat(e)),e.length?this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"",t):Promise.resolve([])}getObjectStore(e,t,n,s=this.storeName){let i;return n&&(i=performance.now(),this.log(n+": start")),this.idb.openDatabase().then((o=>new Promise(((r,a)=>{const c=o.transaction([s],e),l=()=>{clearTimeout(h),a(c.error)},d=()=>{clearTimeout(h),n&&this.log(n+": end",performance.now()-i);const e=f.map((e=>e.result));r(m?e:e[0])};c.onerror=l;const u="readwrite"===e;u&&(c.oncomplete=()=>d());const h=setTimeout((()=>{this.log.error("transaction not finished",c,n)}),1e4),g=t(c.objectStore(s)),m=Array.isArray(g),f=m?g:[].concat(g);if(u)return;const p=f.length;let v=p;const b=()=>{c.error||--v||d()};for(let e=0;ee.getAll()),"",e)}}},2325:(e,t,n)=>{n.d(t,{$d:()=>w,A1:()=>y,Hz:()=>m,XZ:()=>S,ZP:()=>v,ag:()=>b,nK:()=>f,v_:()=>P});var s=n(410),i=n(7922),o=n(4159),r=n(3512),a=n(4762),c=n(6848),l=n(5953),d=n(9005),u=n(6637),h=n(3591),g=n(130);const m={messageActionChatCreate:"ActionCreateGroup",messageActionChatCreateYou:"ActionYouCreateGroup",messageActionChatEditTitle:"ActionChangedTitle",messageActionChatEditPhoto:"ActionChangedPhoto",messageActionChatEditVideo:"ActionChangedVideo",messageActionChatDeletePhoto:"ActionRemovedPhoto",messageActionChatReturn:"ActionAddUserSelf",messageActionChatReturnYou:"ActionAddUserSelfYou",messageActionChatJoined:"ActionAddUserSelfMega",messageActionChatJoinedYou:"ChannelMegaJoined",messageActionChatAddUser:"ActionAddUser",messageActionChatAddUsers:"ActionAddUser",messageActionChatLeave:"ActionLeftUser",messageActionChatLeaveYou:"YouLeft",messageActionChatDeleteUser:"ActionKickUser",messageActionChatJoinedByLink:"ActionInviteUser",messageActionPinMessage:"Chat.Service.Group.UpdatedPinnedMessage",messageActionContactSignUp:"Chat.Service.PeerJoinedTelegram",messageActionChannelCreate:"ActionCreateChannel",messageActionChannelEditTitle:"Chat.Service.Channel.UpdatedTitle",messageActionChannelEditPhoto:"Chat.Service.Channel.UpdatedPhoto",messageActionChannelEditVideo:"Chat.Service.Channel.UpdatedVideo",messageActionChannelDeletePhoto:"Chat.Service.Channel.RemovedPhoto",messageActionHistoryClear:"HistoryCleared",messageActionDiscussionStarted:"DiscussionStarted",messageActionChannelMigrateFrom:"ActionMigrateFromGroup","messageActionPhoneCall.video_in_ok":"ChatList.Service.VideoCall.incoming","messageActionPhoneCall.video_out_ok":"ChatList.Service.VideoCall.outgoing","messageActionPhoneCall.video_missed":"ChatList.Service.VideoCall.Missed","messageActionPhoneCall.video_cancelled":"ChatList.Service.VideoCall.Cancelled","messageActionPhoneCall.in_ok":"ChatList.Service.Call.incoming","messageActionPhoneCall.out_ok":"ChatList.Service.Call.outgoing","messageActionPhoneCall.missed":"ChatList.Service.Call.Missed","messageActionPhoneCall.cancelled":"ChatList.Service.Call.Cancelled","messageActionGroupCall.started":"Chat.Service.VoiceChatStarted.Channel","messageActionGroupCall.started_by":"Chat.Service.VoiceChatStarted","messageActionGroupCall.started_byYou":"Chat.Service.VoiceChatStartedYou","messageActionGroupCall.ended":"Chat.Service.VoiceChatFinished.Channel","messageActionGroupCall.ended_by":"Chat.Service.VoiceChatFinished","messageActionGroupCall.ended_byYou":"Chat.Service.VoiceChatFinishedYou",messageActionBotAllowed:"Chat.Service.BotPermissionAllowed"},f=a.IS_MOBILE?"Message.Unsupported.Mobile":"Message.Unsupported.Desktop";var p;!function(e){let t,a;function m(t){e.lastRequestedLangCode=t,e.lastRequestedNormalizedLangCode=t.split("-")[0]}function f(){if("h12"===e.timeFormat)try{const t=_({hour:"numeric",minute:"numeric",hour12:!0}),n=new Date;n.setHours(0);const s=t.format(n);e.amPmCache.am=s.split(" ")[1],n.setHours(12);const i=t.format(n);e.amPmCache.pm=i.split(" ")[1]}catch(t){console.error("cannot get am/pm",t),e.amPmCache={am:"AM",pm:"PM"}}}function p(){const e=o.Z.langPackCode;return m(e),Promise.all([n.e(104).then(n.bind(n,9104)),n.e(301).then(n.bind(n,9301)),n.e(8).then(n.bind(n,9179))]).then((([t,n,s])=>{const i=[];return b(t.default,i),b(n.default,i),S({_:"langPackDifference",from_version:0,lang_code:e,strings:i,version:0,local:!0,countries:s.default})}))}function v(t,s){e.requestedServerLanguage=!0;const i=r.Z.managers;return Promise.all([i.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"web"}),!1,n.e(104).then(n.bind(n,9104)),n.e(301).then(n.bind(n,9301)),i.apiManager.invokeApiCacheable("help.getCountriesList",{lang_code:t,hash:0}),e.polyfillPromise])}function b(e,t=[]){for(const n in e){const s=e[n];"string"==typeof s?t.push({_:"langPackString",key:n,value:s}):t.push(Object.assign({_:"langPackStringPluralized",key:n},s))}return t}function S(e){return e.appVersion=o.Z.langPackVersion,i.Z.set({langPack:e}).then((()=>(w(e),e)))}function w(n){const s=e.lastRequestedLangCode;if(n.lang_code===s){try{t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode)}catch(n){console.error("pluralRules error",n),t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode.split("-",1)[0])}try{t=new Intl.PluralRules(n.lang_code)}catch(e){console.error("pluralRules error",e),t=new Intl.PluralRules(n.lang_code.split("-",1)[0])}e.strings.clear();for(const t of n.strings)e.strings.set(t.key,t);n.countries&&(e.countriesList.length=0,e.countriesList.push(...n.countries.countries),n.countries.countries.forEach((t=>{if(t.name){const n=t.default_name;e.strings.set(n,{_:"langPackString",key:n,value:t.name})}}))),e.lastAppliedLangCode!==s&&(r.Z.dispatchEvent("language_change",s),e.lastAppliedLangCode=s,A.clear(),f()),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const n=e.weakMap.get(t);n&&n.update()}))}}function y(e,t,n={i:0}){const s=[];let i=0;return e.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,((e,o,r,a,c,l,d)=>{if(s.push(d.slice(i,l)),o){let e;switch(o){case"**":e=document.createElement("b");break;case"__":e=document.createElement("i")}e.append(...y(r,t,n)),s.push(e)}else if(a)s.push(document.createElement("br"));else if(c){const e=c.lastIndexOf("]"),i=c.slice(1,e),o=c.slice(e+2,c.length-1);let r;if(o&&(0,u.Z)(o)){r=document.createElement("a");const e=(0,h.Z)(o);r.href=e.url,e.onclick&&r.setAttribute("onclick",e.onclick),r.target="_blank"}else r=t[n.i++],r instanceof DocumentFragment&&(r=r.firstChild),r.textContent="";r.append(...y(i,t,n)),s.push(r)}else t&&function(e,t,n){const s=t[n.i++];Array.isArray(s)?e.push(...s):e.push(s)}(s,t,n);return i=l+e.length,""})),i!==e.length&&s.push(e.slice(i)),s}function P(n,s=!1,i){const o=e.strings.get(n);let r;if(o)if("langPackStringPluralized"===o._&&(null==i?void 0:i.length)){let e=i[0];"string"==typeof e&&(e=+e.replace(/\D/g,"")),r=o[t.select(e)+"_value"]||o.other_value}else r="langPackString"===o._?o.value:n;else r=n;const a=y(r,i);return s?a.map((e=>e instanceof Node?e.textContent:e)).join(""):a}e.strings=new Map,e.countriesList=[],e.requestedServerLanguage=!1,e.isRTL=!1,e.setRTL=function(t){e.isRTL=t},e.getCacheLangPack=function(){return a||(a=Promise.all([i.Z.get("langPack"),e.polyfillPromise]).then((([t])=>t?(s.ZP,e.lastRequestedLangCode||m(t.lang_code),w(t),t):p())).finally((()=>{a=void 0})))},e.setTimeFormat=function(t,n=!!e.timeFormat&&e.timeFormat!==t){e.timeFormat=t,f(),n&&(A.clear(),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const n=e.weakMap.get(t);n instanceof Z&&n.update()})))},e.loadLocalLangPack=p,e.loadLangPack=v,e.getStrings=function(e,t){return r.Z.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:o.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=b,e.getLangPack=function(e,t){return m(e),v(e).then((([e,t,n,s,i,o])=>{let r=[];return[n,s].forEach((e=>{b(e.default,r)})),r=r.concat(...[e.strings,t.strings].filter(Boolean)),e.strings=r,e.countries=i,S(e)}))},e.saveLangPack=S,e.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():n.e(642).then(n.bind(n,4642)).then((e=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},e.default)})),e.applyLangPack=w,e.superFormatter=y,e.format=P,e.weakMap=new WeakMap;class k{constructor(t){this.element=(null==t?void 0:t.element)||document.createElement("span"),this.element.classList.add("i18n"),this.property=null==t?void 0:t.property,t&&(t.key||t.date)&&this.update(t),e.weakMap.set(this.element,this)}}class E extends k{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"innerHTML"}))}update(e){if((0,l.Z)(this,e),"innerHTML"===this.property)this.element.textContent="",this.element.append(...P(this.key,!1,this.args));else{const e=this.element[this.property],t=P(this.key,!0,this.args);void 0===e?this.element.dataset[this.property]=t:this.element[this.property]=t}}compareAndUpdate(e){if(this.key!==e.key||!(0,c.Z)(this.args,e.args))return this.update(e)}}e.IntlElement=E;const A=new Map;function _(t={}){const n=JSON.stringify(t);let s=A.get(n);return s||(s=new Intl.DateTimeFormat(e.lastRequestedNormalizedLangCode+"-u-hc-"+e.timeFormat,t),A.set(n,s)),s}e.amPmCache={am:"AM",pm:"PM"};class Z extends k{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"})),(0,g.m)(this.element)}update(t){let n;if((0,l.Z)(this,t),this.options.hour&&this.options.minute&&2===Object.keys(this.options).length){const t=this.date.getHours();n=("0"+("h12"===e.timeFormat?t%12||12:t)).slice(-2)+":"+("0"+this.date.getMinutes()).slice(-2),"h12"===e.timeFormat&&(n+=" "+(t<12?e.amPmCache.am:e.amPmCache.pm))}else{const e=_(this.options);n=(0,d.Z)(e.format(this.date))}this.element[this.property]=n}}e.IntlDateElement=Z,e.i18n=function(e,t){return new E({key:e,args:t}).element},e.i18n_=function(e){return new E(e).element},e._i18n=function(e,t,n,s){return new E({element:e,key:t,args:n,property:s}).element}}(p||(p={}));const v=p,b=p.i18n,S=p.i18n_,w=p._i18n;function y(e,t){const n=e.slice(0,1);for(let s=1;s{const s=e&&t?"AutoDownloadSettings.LastDelimeter":"AutoDownloadSettings.Delimeter";return n?p.format(s,!0):b(s)}));return n?s.join(""):s}s.GO.I18n=p},1507:(e,t,n)=>{n.d(t,{BP:()=>h,BX:()=>m,DZ:()=>v,IA:()=>o,Iw:()=>l,J$:()=>f,NM:()=>s,OS:()=>u,Ox:()=>g,Pt:()=>d,Zi:()=>p,gZ:()=>c,hj:()=>i,rU:()=>a,yF:()=>r});const s=0,i=1271266957,o=777,r=777e3,a=2147483647,c="",l=20971520,d="",u=[7322096,16766590,13338331,9367192,16749490,16478047],h="default_static",g=4295032831,m=new Set(["web","k","z"]),f=0,p=1,v=new Set([f,p]);Math.max(...Array.from(v))},3855:(e,t,n)=>{n.d(t,{Z:()=>se});var s=n(3512),i=n(7730),o=n(410),r=n(7487),a=n(6702),c=n(1722),l=n(2831),d=n(5418),u=n(993),h=n(7328),g=n(6663),m=n(9976),f=n(3731),p=n(6818),v=n(1174),b=n(2341),S=n(9030),w=n(2365),y=n(2820),P=n(5432),k=n(2131),E=n(554),A=n(393),_=n(5269),Z=n(4089),I=n(4762),C=n(5783),L=n(2045),T=n(8189);const O=Object.assign({CAN_USE_TRANSFERABLES:h.Z,IS_APPLE_MX:T.Z,IS_CALL_SUPPORTED:u.Z,IS_CANVAS_FILTER_SUPPORTED:g.Z,IS_EMOJI_SUPPORTED:m.Z,IS_GEOLOCATION_SUPPORTED:f.Z,IS_GROUP_CALL_SUPPORTED:p.Z,IS_MOV_SUPPORTED:S.Z,IS_PARALLAX_SUPPORTED:w.Z,IS_SCREEN_SHARING_SUPPORTED:y.Z,IS_TOUCH_SUPPORTED:P.Z,IS_VIBRATE_SUPPORTED:k.Z,IS_OPUS_SUPPORTED:C.Z,IS_SHARED_WORKER_SUPPORTED:L.Z,IS_WEBM_SUPPORTED:A.Z,IS_WEBP_SUPPORTED:_.Z,IS_WEBRTC_SUPPORTED:Z.Z,IMAGE_MIME_TYPES_SUPPORTED:v.Z,MEDIA_MIME_TYPES_SUPPORTED:b.Z,VIDEO_MIME_TYPES_SUPPORTED:E.Z},I);var M=n(4159),W=n(236),R=n(6009),D=n(8479),x=n(946),N=n(7922),U=n(5466),j=n(5003);const F=W.h.version,B=W.h.build,V=Object.keys(W.h),G=["contactsListCachedTime","stateCreatedTime","maxSeenMsgId","filtersArr"];function z(){return e=this,t=void 0,i=function*(){const e=(0,j.kg)("STATE-LOADER"),t=performance.now(),n=(0,U.$)(e),i=V.map((e=>n(N.Z.get(e),"state "+e))).concat(n(r.Z.get("user_auth"),"auth"),n(r.Z.get("state_id"),"auth"),n(r.Z.get("k_build"),"auth")).concat(n(N.Z.get("user_auth"),"old auth")),a=yield Promise.all(i);e.warn("promises",performance.now()-t);const c=[],l=(e,t)=>{d[e]=t,c.push(e)};let d={};for(let e=0,t=V.length;eN.Z.get(e))));e.push("user_auth"),t.push("number"==typeof u||"string"==typeof u?{dcID:t[0]||M.Z.baseDcId,date:Date.now()/1e3|0,id:u.toPeerId(!1)}:u);const n={};e.forEach(((e,s)=>{n[e]=t[s]})),yield r.Z.set(n)}u&&(d.authState={_:"authStateSignedIn"},s.Z.dispatchEvent("user_auth","number"==typeof u||"string"==typeof u?{dcID:0,date:Date.now()/1e3|0,id:u.toPeerId(!1)}:u));const f=new Set;if(d.stateId!==h){if(void 0!==h){const e=new Map([["authState",void 0],["stateId",void 0]]);e.forEach(((t,n)=>{e.set(n,(0,D.Z)(d[n]))})),d=(0,D.Z)(W.h),e.forEach(((e,t)=>{d[t]=e}));const t={chats:1,dialogs:1,users:1};for(const e in t)f.add(e);p=d,c.length=0,d=p,c.push(...Object.keys(d))}yield r.Z.set({state_id:d.stateId})}var p;const v=Date.now();if(d.stateCreatedTime+864e5{l(e,(0,D.Z)(W.h[e]))}))),!d.settings.hasOwnProperty("theme")&&d.settings.hasOwnProperty("nightTheme")&&(d.settings.theme=d.settings.nightTheme?"night":"day",l("settings",d.settings)),!d.settings.hasOwnProperty("themes")&&d.settings.background){d.settings.themes=(0,D.Z)(W.h.settings.themes);const e=d.settings.themes.find((e=>e.name===d.settings.theme));e&&(e.background=d.settings.background,l("settings",d.settings))}const b=d.settings.autoDownload;if(void 0!==(null==b?void 0:b.private)){const e=["contacts","private","groups","channels"];["photo","video","file"].forEach((t=>{const n=b[t]={};e.forEach((e=>{n[e]=b[e]}))})),e.forEach((e=>{delete b[e]})),l("settings",d.settings)}let S,w;if((0,x.Z)(W.h,d,(e=>{l(e,d[e])})),d.version!==F||d.build!==B){if(d.build<217&&(d.allDialogsLoaded=(0,D.Z)(W.h.allDialogsLoaded),d.pinnedOrders=(0,D.Z)(W.h.pinnedOrders),d.filtersArr=(0,D.Z)(W.h.filtersArr),f.add("dialogs")),-1===(0,R.Z)(d.version,"1.3.0")){let e=!1;d.settings.themes.forEach(((t,n,s)=>{if("day"===t.name&&"ByxGo2lrMFAIAAAAmkJxZabh8eM"===t.background.slug&&"image"===t.background.type||"night"===t.name&&"#0f0f0f"===t.background.color&&"color"===t.background.type){const i=W.h.settings.themes.find((e=>e.name===t.name));i&&(s[n]=(0,D.Z)(i),e=!0)}})),e&&l("settings",d.settings)}0!==(0,R.Z)(d.version,F)&&(S=F,w=d.version),l("version",F),l("build",B)}return g!==B&&(!g||g{var t,n;const{name:s,key:i,value:o}=e;if(!e.hasOwnProperty("key"))return void(this.mirrors[s]=o);const r=null!==(t=(n=this.mirrors)[s])&&void 0!==t?t:n[s]={};void 0===o?delete r[i]:r[i]=o},this.mirrors={},this.tabState={chatPeerIds:[],idleStartTime:0},this.log("constructor"),this.registerWorker(),this.registerServiceWorker(),this.registerCryptoWorker(),this.addMultipleEventsListeners({convertWebp:({fileName:e,bytes:t})=>i.Z.convert(e,t),convertOpus:({fileName:e,bytes:t})=>q.Z.pushDecodeTask(t,!1).then((e=>e.bytes)),event:({name:e,args:t})=>{s.Z.dispatchEventSingle(e,...t)},localStorageProxy:e=>{const t=e;return r.Z[t.type](...t.args)},mirror:this.onMirrorTask}),s.Z.addEventListener("language_change",(e=>{s.Z.managers.networkerFactory.setLanguage(e)})),window.addEventListener("online",(()=>{s.Z.managers.networkerFactory.forceReconnectTimeout()})),s.Z.addEventListener("logging_out",(()=>{Promise.all([(0,J.Z)(!1,!0),r.Z.clear(),Promise.race([l.default.setAuthorized(!1),(0,d.Z)(3e3)]),a.default.forceUnsubscribe(),Promise.all(["cachedFiles","cachedStreamChunks"].map((e=>caches.delete(e))))]).finally((()=>{c.Z.reload()}))})),X.Z.addEventListener("change",(e=>{this.updateTabStateIdle(e)})),this.updateTabStateIdle(X.Z.isIdle),this.log("Passing environment:",O),this.invoke("environment",O)}pingServiceWorkerWithIframe(){if(this.pingServiceWorkerPromise)return this.pingServiceWorkerPromise;const e=this.pingServiceWorkerPromise=(0,Q.Z)(),t=document.createElement("iframe");t.hidden=!0;const n=()=>{setTimeout((()=>{this.pingServiceWorkerPromise=void 0}),1e4),clearTimeout(s),t.remove(),t.removeEventListener("load",n),t.removeEventListener("error",n),e.resolve()};t.addEventListener("load",n),t.addEventListener("error",n),t.src="ping/"+(4294967295*Math.random()|0),document.body.append(t);const s=window.setTimeout(n,1e3);return e}attachServiceWorker(e){this.lastServiceWorker&&this.serviceMessagePort.detachPort(this.lastServiceWorker),this.serviceMessagePort.attachSendPort(this.lastServiceWorker=e),this.serviceMessagePort.invokeVoid("hello",void 0)}_registerServiceWorker(){navigator.serviceWorker.register(new URL(n.p+n.u(670),n.b),{scope:"./"}).then((e=>{if(this.log("SW registered",e),e.active&&!navigator.serviceWorker.controller)return e.unregister().then((()=>{window.location.reload()}));(e.installing||e.waiting||e.active).addEventListener("statechange",(e=>{this.log("SW statechange",e)}));const t=navigator.serviceWorker.controller||e.installing||e.waiting||e.active;this.attachServiceWorker(t)}),(e=>{this.log.error("SW registration failed!",e),this.invokeVoid("serviceWorkerOnline",!1)}))}registerServiceWorker(){if(!("serviceWorker"in navigator))return;this.serviceMessagePort=new K.Z;const e=navigator.serviceWorker;this._registerServiceWorker(),e.addEventListener("controllerchange",(()=>{this.log.warn("controllerchange");const t=e.controller;this.attachServiceWorker(t),t.addEventListener("error",(e=>{this.log.error("controller error:",e)}))})),this.serviceMessagePort.attachListenPort(e),this.serviceMessagePort.addMultipleEventsListeners({port:(e,t,n)=>{this.invokeVoid("serviceWorkerPort",void 0,void 0,[n.ports[0]])},hello:(e,t)=>{this.serviceMessagePort.resendLockTask(t)}}),e.addEventListener("messageerror",(e=>{this.log.error("SW messageerror:",e)}))}registerCryptoWorker(){return ee(this,void 0,void 0,(function*(){const e={construct:(e,t)=>({url:t[0]+location.search})},t=[Worker,"undefined"!=typeof SharedWorker&&SharedWorker].filter(Boolean);t.forEach((t=>window[t.name]=new Proxy(t,e)));const s=new Worker(new URL(n.p+n.u(589),n.b),{type:void 0});t.forEach((e=>window[e.name]=e));const i=s.url,o=e=>new a(e,{type:"module"}),r=e=>this.attachWorkerToPort(e,Y.Z,"crypto"),a=L.Z?SharedWorker:Worker;Y.Z.addEventListener("port",((e,t,n)=>{this.invokeVoid("cryptoPort",void 0,void 0,[n.ports[0]])})),r(o(i));const c=yield(l=i,fetch(l).then((e=>e.text())).then((e=>{const t=location.pathname.split("/");return t[t.length-1]="",e=`\n var originalImportScripts = importScripts; \n importScripts = (url) => {\n console.log('importScripts', url);\n var newUrl = '${location.origin+t.join("/")}' + url.split('/').pop();\n return originalImportScripts(newUrl);\n };\n ${e}`,new Blob([e],{type:"application/javascript"})})));var l;(yield this.invoke("createProxyWorkerURLs",{originalUrl:i,blob:c})).slice(1).map(o).forEach(r)}))}registerWorker(){let e;e=L.Z?new SharedWorker(new URL(n.p+n.u(678),n.b),{type:void 0}):new Worker(new URL(n.p+n.u(678),n.b),{type:void 0}),this.onWorkerFirstMessage(e)}attachWorkerToPort(e,t,n){const s=e.port||e;t.attachPort(s),e.addEventListener("error",(e=>{this.log.error(n,"worker error",e)}))}onWorkerFirstMessage(e){this.log("set webWorker"),this.attachWorkerToPort(e,this,"mtproto")}loadState(){return Promise.all([(null!=$?$:$=z()).then((e=>(this.newVersion=e.newVersion,this.oldVersion=e.oldVersion,this.mirrors.state=e.state,e)))])}sendState(){return this.loadState().then((e=>{const[t]=e;return this.invoke("state",Object.assign(Object.assign({},t),{userId:s.Z.myId.toUserId()})),e}))}invokeCrypto(e,...t){return Y.Z.invokeCrypto(e,...t)}toggleStorages(e,t){return ee(this,void 0,void 0,(function*(){yield(0,J.Z)(e,t),this.invoke("toggleStorages",{enabled:e,clearWrite:t}),this.serviceMessagePort.invokeVoid("toggleStorages",{enabled:e,clearWrite:t})}))}getMirror(e){return ee(this,void 0,void 0,(function*(){return this.mirrors[e]}))}getState(){return this.getMirror("state")}updateTabState(e,t){this.tabState[e]=t,this.invokeVoid("tabState",this.tabState)}updateTabStateIdle(e){this.updateTabState("idleStartTime",e?Date.now():0)}}const ne=new te;o.GO.apiManagerProxy=ne;const se=ne},490:(e,t,n)=>{n.d(t,{Z:()=>p});var s=n(4159),i=n(410),o=n(2219),r=n(2045),a=n(3241),c=n(2586),l=n(5003),d=n(3512),u=n(7487),h=n(3855);const g=r.Z;class m extends a.Z{constructor(){super(!1),this.log=(0,l.kg)("INSTANCE"),this.clearInstance=()=>{this.masterInstance&&!this.deactivated&&(this.log.warn("clear master instance"),u.Z.delete("xt_instance"))},this.checkInstance=(e=c.Z.isIdle)=>{return t=this,n=void 0,o=function*(){if(this.deactivated)return;const t=Date.now(),n={id:this.instanceId,idle:e,time:t},[i,o=s.Z.build]=yield Promise.all([u.Z.get("xt_instance",!1),u.Z.get("k_build",!1)]);if(o>s.Z.build)return this.masterInstance=!1,d.Z.managers.networkerFactory.stopAll(),this.deactivateInstance("version"),void h.Z.toggleStorages(!1,!1);g?u.Z.set({xt_instance:n}):!e||!i||i.id===this.instanceId||i.timethis.deactivateInstance("tabs")),3e4)))},new((i=void 0)||(i=Promise))((function(e,s){function r(e){try{c(o.next(e))}catch(e){s(e)}}function a(e){try{c(o.throw(e))}catch(e){s(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(r,a)}c((o=o.apply(t,n||[])).next())}));var t,n,i,o},this.log=(0,l.kg)("INSTANCE"),this.instanceId=o.Z}get deactivatedReason(){return this.deactivated}start(){if(this.reset(),!this.started){this.started=!0,c.Z.addEventListener("change",this.checkInstance),setInterval(this.checkInstance,5e3),this.checkInstance();try{document.documentElement.addEventListener("beforeunload",this.clearInstance)}catch(e){}}}reset(){this.masterInstance=!1,this.clearDeactivateTimeout(),this.deactivated=void 0}activateInstance(){this.deactivated&&(this.reset(),this.checkInstance(!1),this.dispatchEvent("activated"))}deactivateInstance(e){this.masterInstance||this.deactivated||(this.log.warn("deactivate",e),this.clearDeactivateTimeout(),this.deactivated=e,this.dispatchEvent("deactivated",e))}clearDeactivateTimeout(){this.deactivateTimeout&&(clearTimeout(this.deactivateTimeout),this.deactivateTimeout=0)}}const f=new m;i.GO&&(i.GO.singleInstance=f);const p=f},2831:(e,t,n)=>{n.r(t),n.d(t,{TelegramMeWebManager:()=>c,default:()=>d});var s=n(4159),i=n(410),o=n(1267),r=n(7298),a=n(7487);class c{constructor(){this.disabled=o.Z.test||!s.Z.domains.includes(location.hostname)}setAuthorized(e){if(!this.disabled)return a.Z.get("tgme_sync").then((t=>{const n=(0,r.Z)(!0);if(e&&(null==t?void 0:t.canRedirect)===e&&t.ts+86400>n)return;a.Z.set({tgme_sync:{canRedirect:e,ts:n}});const i=`_websync_?authed=${e?"1":"0"}&version=${encodeURIComponent(s.Z.version+" "+s.Z.suffix)}`,o=["//telegram.me/"+i,"//t.me/"+i].map((e=>function(e){const t=document.createElement("script"),n=new Promise((e=>{t.onload=t.onerror=()=>{e(t)}}));return t.src=e,document.body.appendChild(t),n}(e).then((e=>{e.remove()}))));return Promise.all(o)}))}}const l=new c;i.GO&&(i.GO.telegramMeWebManager=l);const d=l},6702:(e,t,n)=>{n.r(t),n.d(t,{WebPushApiManager:()=>h,default:()=>m});var s=n(410),i=n(5003),o=n(3855),r=n(2325),a=n(4762),c=n(1722),l=n(8479),d=n(490),u=n(3241);class h extends u.Z{constructor(){super(!1),this.isAvailable=!0,this.isPushEnabled=!1,this.localNotificationsAvailable=!0,this.started=!1,this.settings={},this.isFirefox=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,this.userVisibleOnly=!this.isFirefox,this.log=(0,i.kg)("PM"),this.subscribe=()=>{this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.subscribe({userVisibleOnly:this.userVisibleOnly}).then((e=>{this.isPushEnabled=!0,this.pushSubscriptionNotify("subscribe",e)})).catch((e=>{"denied"===Notification.permission?this.log("Permission for Notifications was denied"):(this.log("Unable to subscribe to push.",e),this.userVisibleOnly||(this.userVisibleOnly=!0,setTimeout(this.subscribe,0)))}))}))},this.isAliveNotify=()=>{if(!this.isAvailable||d.Z.deactivatedReason)return;this.settings.baseUrl=(location.href||"").replace(/#.*$/,"");const e={},t={push_action_mute1d:a.IS_MOBILE?"PushNotification.Action.Mute1d.Mobile":"PushNotification.Action.Mute1d",push_action_settings:a.IS_MOBILE?"PushNotification.Action.Settings.Mobile":"PushNotification.Action.Settings",push_message_nopreview:"PushNotification.Message.NoPreview"};for(const n in t)e[n]=r.ZP.format(t[n],!0);o.Z.serviceMessagePort.invokeVoid("pushPing",{localNotifications:this.localNotificationsAvailable,lang:e,settings:this.settings}),this.isAliveTO=setTimeout(this.isAliveNotify,1e4)},"PushManager"in window&&"Notification"in window&&"serviceWorker"in navigator||(this.log.warn("Push messaging is not supported."),this.isAvailable=!1,this.localNotificationsAvailable=!1),this.isAvailable&&"denied"===Notification.permission&&this.log.warn("The user has blocked notifications.")}start(){this.started||(this.started=!0,this.getSubscription(),this.setUpServiceWorkerChannel())}setLocalNotificationsDisabled(){this.localNotificationsAvailable=!1}getSubscription(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.isPushEnabled=!!e,this.pushSubscriptionNotify("init",e)})).catch((e=>{this.log.error("Error during getSubscription()",e)}))}))}unsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.isPushEnabled=!1,e&&(this.pushSubscriptionNotify("unsubscribe",e),setTimeout((()=>{e.unsubscribe().then((e=>{this.isPushEnabled=!1})).catch((e=>{this.log.error("Unsubscription error: ",e)}))}),3e3))})).catch((e=>{this.log.error("Error thrown while unsubscribing from push messaging.",e)}))}))}forceUnsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.log.warn("force unsubscribe",e),e&&e.unsubscribe().then((e=>{this.log.warn("force unsubscribe successful",e),this.isPushEnabled=!1})).catch((e=>{this.log.error("Unsubscription error: ",e)}))})).catch((e=>{this.log.error("Error thrown while unsubscribing from push messaging.",e)}))}))}setSettings(e){this.settings=(0,l.Z)(e),clearTimeout(this.isAliveTO),this.isAliveNotify()}hidePushNotifications(){this.isAvailable&&o.Z.serviceMessagePort.invokeVoid("notificationsClear",void 0)}setUpServiceWorkerChannel(){this.isAvailable&&(o.Z.serviceMessagePort.addEventListener("pushClick",(e=>{d.Z.deactivatedReason?c.Z.reload():this.dispatchEvent("push_notification_click",e)})),navigator.serviceWorker.ready.then(this.isAliveNotify))}pushSubscriptionNotify(e,t){if(t){const n=t.toJSON();if(!(n&&n.endpoint&&n.keys&&n.keys.p256dh&&n.keys.auth))return this.log.warn("Invalid push subscription",n),this.unsubscribe(),this.isAvailable=!1,void this.pushSubscriptionNotify(e);this.log.warn("Push",e,n),this.dispatchEvent("push_"+e,{tokenType:10,tokenValue:JSON.stringify(n)})}else this.log.warn("Push",e,!1),this.dispatchEvent("push_"+e,!1)}}const g=new h;s.GO&&(s.GO.webPushApiManager=g);const m=g},9043:(e,t,n)=>{n.d(t,{Z:()=>d});var s=n(410),i=n(5783),o=n(4762),r=n(5003),a=n(3855),c=function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function r(e){try{c(s.next(e))}catch(e){o(e)}}function a(e){try{c(s.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,a)}c((s=s.apply(e,t||[])).next())}))};const l=new class{constructor(){this.sampleRate=48e3,this.tasks=[],this.keepAlive=!1,this.log=(0,r.kg)("OPUS",r.v9.Error)}isPlaySupported(){return i.Z}loadWavWorker(){this.wavWorker||(this.wavWorker=new Worker("waveWorker.min.js"),this.wavWorker.addEventListener("message",(e=>{const t=e.data;if(this.log("[WAV] got message:",t),t&&t.page){const e=t.page;this.onTaskEnd(this.tasks.shift(),e)}})))}loadWorker(){this.worker||(this.worker=new Worker("decoderWorker.min.js"),this.worker.addEventListener("message",(e=>{const t=e.data;this.log("[DECODER] got message",t),"done"===t.type?(this.wavWorker.postMessage({command:"done"}),t.waveform&&(this.tasks[0].waveform=t.waveform)):this.wavWorker.postMessage({command:"encode",buffers:e.data},o.IS_SAFARI?void 0:t.map((e=>e.buffer)))})))}setKeepAlive(e){this.keepAlive=e,this.keepAlive?(this.loadWorker(),this.loadWavWorker()):this.tasks.length||this.terminateWorkers()}onTaskEnd(e,t){t?(clearTimeout(e.timeout),e.callback.resolve({bytes:t,waveform:e.waveform})):e.callback.reject("timeout"),this.tasks.length&&this.executeNewTask(this.tasks[0]),this.terminateWorkers()}terminateWorkers(e=!1){(!this.keepAlive&&!this.tasks.length||e)&&(this.worker&&(this.worker.terminate(),this.worker=null),this.wavWorker&&(this.wavWorker.terminate(),this.wavWorker=null))}executeNewTask(e){this.worker.postMessage({command:"init",decoderSampleRate:this.sampleRate,outputBufferSampleRate:this.sampleRate}),this.wavWorker.postMessage({command:"init",wavBitDepth:16,wavSampleRate:this.sampleRate}),this.log("[DECODER] send decode"),this.worker.postMessage({command:"decode",pages:e.pages,waveform:e.withWaveform},o.IS_SAFARI?void 0:[e.pages.buffer]),e.timeout=window.setTimeout((()=>{this.log.error("decode timeout"),this.terminateWorkers(!0),this.tasks.length&&(this.loadWorker(),this.loadWavWorker()),this.onTaskEnd(this.tasks.shift())}),1e4)}pushDecodeTask(e,t){return new Promise(((n,s)=>{const i={pages:e,withWaveform:t,callback:{resolve:n,reject:s},timeout:0};this.loadWorker(),this.loadWavWorker(),1===this.tasks.push(i)&&this.executeNewTask(i)}))}decode(e,t=!1){return c(this,void 0,void 0,(function*(){return this.pushDecodeTask(e,t).then((e=>c(this,void 0,void 0,(function*(){const t=new Blob([e.bytes],{type:"audio/wav"});return{url:yield a.Z.invoke("createObjectURL",t),waveform:e.waveform}}))))}))}};s.GO.opusDecodeController=l;const d=l},2423:(e,t,n)=>{n.d(t,{$2:()=>h,E:()=>g,Hk:()=>f,QB:()=>m,SC:()=>p,bu:()=>l,it:()=>c,kO:()=>b,tY:()=>v});var s=n(1229);const i="a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc",o="0-9_"+i,r="["+i+"0-9]",a="((?:https?|ftp)://|mailto:)?",c=a+"(?:"+r+"{1,64}(?::"+r+"{0,64})?@)?(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|"+r+"["+i+"·0-9-]{0,64}(?:\\."+r+"["+i+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+i+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",l=(new RegExp("^"+a.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),d="[a-zA-Z\\d_]{5,32}",u="\\/([a-zA-Z\\d_]{1,32})(?:@("+d+"))?(\\b|$)",h=new RegExp("(^| )(@)("+d+")|("+c+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#["+o+"]{2,64})|(^|\\s)"+u,"i"),g=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,m=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,f={Telegram:"tg://search_hashtag?hashtag={1}",Twitter:"https://twitter.com/hashtag/{1}",Instagram:"https://instagram.com/explore/tags/{1}/","Google Plus":"https://plus.google.com/explore/{1}"},p={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},v=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(const e in p)v.add(p[e]);const b=/^\+\d+$/},3591:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(2423),i=n(410),o=n(6637),r=n(1507);function a(e,t){(0,o.Z)(e)||(e="https://"+e);const n={url:e};let i,a,c,l;if(i=e.match(/^(?:https?:\/\/)?(?:(.+?)\.)?(?:(?:web|k|z)\.)?t(?:elegram)?\.me(?:\/(.+))?/)){const t=new URL(e);let n=i[1];n&&r.BX.has(i[1])&&(n=void 0),n&&(t.pathname=n+("/"===t.pathname?"":t.pathname));const o=t.pathname.slice(1),a=o.split("/");if(a[0]&&"$"===a[0][0]&&a[0].length>1)l="invoice";else if(/^\W/.test(o)&&!s.kO.test(o))l="joinchat";else switch(a[0]){case"joinchat":case"addstickers":case"addemoji":case"voicechat":case"invoice":if(1!==a.length&&!n){l=a[0];break}default:if(a[1]&&a[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===a.length){l="im";break}}}else(a=e.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?l="im":(c=e.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(l="tg_"+c[1]);return window[l]||(l=void 0),n.onclick=l,n}i.GO&&(i.GO.wrapUrl=a)},3512:(e,t,n)=>{n.d(t,{Z:()=>d});var s=n(1507),i=n(3241),o=n(410),r=n(3206),a=n(1352);class c extends i.Z{constructor(){super(),this.myId=s.NM,this.connectionStatus={},this.premium=!1,this.addEventListener("user_auth",(({id:e})=>{this.myId=e.toPeerId()})),this.addEventListener("premium_toggle_private",(({isNew:e,isPremium:t})=>{this.premium=t,e||this.dispatchEventSingle("premium_toggle",t)})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.dispatchEvent=(e,...t)=>{super.dispatchEvent(e,...t),r.Z.getInstance().invokeVoid("event",{name:e,args:t})},a.kC||this.addEventListener("settings_updated",(({settings:e})=>{this.settings=e}))}getConnectionStatus(){return this.connectionStatus}getPremium(){return this.premium}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const l=new c;o.GO.rootScope=l;const d=l},7730:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(410),i=n(3725);const o=new class{constructor(){this.convertPromises={}}init(){this.worker=new Worker(new URL(n.p+n.u(61),n.b)),this.worker.addEventListener("message",(e=>{const t=e.data.payload,n=this.convertPromises[t.fileName];n&&(t.bytes?n.resolve(t.bytes):n.reject(),delete this.convertPromises[t.fileName])}))}postMessage(e){this.init&&(this.init(),this.init=null),this.worker.postMessage(e)}convert(e,t){if(this.convertPromises.hasOwnProperty(e))return this.convertPromises[e];const n=(0,i.Z)();return this.postMessage({type:"convertWebp",payload:{fileName:e,bytes:t}}),this.convertPromises[e]=n}};s.GO.webpWorkerController=o;const r=o}},r={};function a(e){var t=r[e];if(void 0!==t)return t.exports;var n=r[e]={exports:{}};return o[e].call(n.exports,n,n.exports,a),n.exports}a.m=o,e=[],a.O=(t,n,s,i)=>{if(!n){var o=1/0;for(d=0;d=i)&&Object.keys(a.O).every((e=>a.O[e](n[c])))?n.splice(c--,1):(r=!1,i0&&e[d-1][2]>i;d--)e[d]=e[d-1];e[d]=[n,s,i]},a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},n=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,a.t=function(e,s){if(1&s&&(e=this(e)),8&s)return e;if("object"==typeof e&&e){if(4&s&&e.__esModule)return e;if(16&s&&"function"==typeof e.then)return e}var i=Object.create(null);a.r(i);var o={};t=t||[null,n({}),n([]),n(n)];for(var r=2&s&&e;"object"==typeof r&&!~t.indexOf(r);r=n(r))Object.getOwnPropertyNames(r).forEach((t=>o[t]=()=>e[t]));return o.default=()=>e,a.d(i,o),i},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((t,n)=>(a.f[n](e,t),t)),[])),a.u=e=>(({589:"crypto.worker",630:"npm.qr-code-styling",670:"sw",678:"mtproto.worker"}[e]||e)+"."+{8:"570e6da51a125009c156",53:"77c5dab45a68d1851187",61:"3cfffcdc0849ca3fc87c",63:"0d39a81590990db74d39",77:"18305e1bd331a0fdd36c",104:"c914ddc183166c9696a7",231:"1462b405fc6da56ba47b",301:"42dc636f96a62f6a08c8",339:"79c7f9c2341eeff66b88",392:"198d4679664c1bf4c989",436:"47558d0a092967b3c966",437:"d40e517d52e5dcf3b754",442:"645fe71c30545d9700d2",460:"67f684b92b25fc4ed361",508:"ffe1001d2cc7df6d2eb6",539:"17a0b07b4e6476f19654",589:"4909ec7e814298d58e2b",630:"2c5d57550714b1a9e42e",641:"11406cec52b05304f14f",642:"fd1ade69544ad78671c6",670:"33885da34018d6fb111e",678:"a47a496f3c7a877087bb",709:"73c949c4c6702cdf349b",776:"b547f5293903351f3ec7",781:"af546badf2c525815889",783:"827711558099e62fd694",810:"f272bad8a3948af5c8d0",813:"06763bece6721fb81fde"}[e]+".chunk.js"),a.miniCssF=e=>{},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),s={},i="tweb:",a.l=(e,t,n,o)=>{if(s[e])s[e].push(t);else{var r,c;if(void 0!==n)for(var l=document.getElementsByTagName("script"),d=0;d{r.onerror=r.onload=null,clearTimeout(g);var i=s[e];if(delete s[e],r.parentNode&&r.parentNode.removeChild(r),i&&i.forEach((e=>e(n))),t)return t(n)},g=setTimeout(h.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=h.bind(null,r.onerror),r.onload=h.bind(null,r.onload),c&&document.head.appendChild(r)}},a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var t=a.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})(),(()=>{if(void 0!==a){var e=a.u,t=a.e,n={},s={};a.u=function(t){return e(t)+(n.hasOwnProperty(t)?"?"+n[t]:"")},a.e=function(i){return t(i).catch((function(t){var o=s.hasOwnProperty(i)?s[i]:999999;if(o<1){var r=e(i);throw t.message="Loading chunk "+i+" failed after 999999 retries.\n("+r+")",t.request=r,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();n[i]=t,s[i]=o-1,e(a.e(i))}),3e3)}))}))}}})(),(()=>{a.b=document.baseURI||self.location.href;var e={179:0};a.f.j=(t,n)=>{var s=a.o(e,t)?e[t]:void 0;if(0!==s)if(s)n.push(s[2]);else{var i=new Promise(((n,i)=>s=e[t]=[n,i]));n.push(s[2]=i);var o=a.p+a.u(t),r=new Error;a.l(o,(n=>{if(a.o(e,t)&&(0!==(s=e[t])&&(e[t]=void 0),s)){var i=n&&("load"===n.type?"missing":n.type),o=n&&n.target&&n.target.src;r.message="Loading chunk "+t+" failed.\n("+i+": "+o+")",r.name="ChunkLoadError",r.type=i,r.request=o,s[1](r)}}),"chunk-"+t,t)}},a.O.j=t=>0===e[t];var t=(t,n)=>{var s,i,[o,r,c]=n,l=0;if(o.some((t=>0!==e[t]))){for(s in r)a.o(r,s)&&(a.m[s]=r[s]);if(c)var d=c(a)}for(t&&t(n);la(6873)));c=a.O(c)})(); +//# sourceMappingURL=main.b54fef5f67745c10b82c.bundle.js.map \ No newline at end of file diff --git a/public/main.b54fef5f67745c10b82c.bundle.js.map b/public/main.b54fef5f67745c10b82c.bundle.js.map new file mode 100644 index 000000000..7cd9186f0 --- /dev/null +++ b/public/main.b54fef5f67745c10b82c.bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"main.b54fef5f67745c10b82c.bundle.js","mappings":"uBAAIA,ECCAC,EADAC,ECAAC,EACAC,E,mECOG,MAAMC,GAAU,EACVC,EAASD,GAAW,UAEpBE,EADuB,oBAAb,OAA2BC,OAASC,KAE3D,G,kECKA,MAAMC,EAAgB,YAChBC,EAAQ,UAmIDC,EAAoB,CAC/BC,iBAAkB,CAAC,EACnBC,aAAc,CAAC,EAEfC,uBAAwB,EACxBC,QAAS,CAAC,EACVC,WAAY,GACZC,aAAc,EACdC,iBAAkBC,KAAKC,MACvBC,YAAa,GACbC,kBAAmB,GACnBC,cAAe,CAAC,EAChBC,aAAc,GACdC,QAAShB,EACTiB,MAAOhB,EACPiB,UAAW,CACTC,EAAG,EAAAC,UAAY,kBAAoB,mBAErCC,qBAAsB,CAAC,EACvBC,SAAU,CACRC,iBAAkB,GAClBC,aAAc,aACdC,aAAc,QACdC,mBAAmB,EACnBC,aAAc,CACZC,MAAO,CACLC,UAAU,EACVC,SAAS,EACTC,QAAQ,EACRC,UAAU,GAEZC,MAAO,CACLJ,UAAU,EACVC,SAAS,EACTC,QAAQ,EACRC,UAAU,GAEZE,KAAM,CACJL,UAAU,EACVC,SAAS,EACTC,QAAQ,EACRC,UAAU,IAGdG,gBAAiB,CACfhB,EAAG,uBACHiB,cAAe,QACfC,OAAQ,CACNC,qBAAqB,EACrBC,oBAAoB,GAEtBC,eAAgB,QAChBC,eAAgB,SAChBC,wBAAyB,KAE3BC,SAAU,CACRC,MAAM,EACNC,QAAQ,GAEVC,SAAU,CACRC,SAAS,EACTC,MAAM,GAERC,MAAO,CACLF,SAAS,EACTG,KAAK,GAEPC,OAAQ,CAAC,CACPC,KAAM,MACNC,WAAY,EAAAjC,UAjGwB,CACxCkC,MAAM,EACNC,KAAM,GACNC,MAAO,kCACPC,mBAAoB,yCACpBC,UAAW,EACXC,GAAI,KAfqC,CACzCL,MAAM,EACNC,KAAM,UACNC,MAAO,kCACPC,mBAAoB,yCACpBC,UAAW,GACXC,GAAI,MAqGC,CACDP,KAAM,QACNC,WAAY,EAAAjC,UAjF0B,CAC1CkC,MAAM,EACNC,KAAM,GACNC,MAAO,UACPC,mBAAoB,6BACpBC,UAAW,EACXC,GAAI,MAhBuC,CAC3CL,MAAM,EACNC,KAAM,UAENC,MAAO,kCACPC,mBAAoB,+CACpBC,WAAY,GACZC,GAAI,QAsFFC,MAAO,SACPC,cAAe,CACbC,OAAO,GAETC,YC1NK,IAAIrD,MAAOsD,iBAAiBC,MAAM,aAAe,MAAQ,OD4NhEC,eAAgB,CACdC,OAAQ,EACRC,OAAO,EACPC,aAAc,EACdC,cAAe,CACbC,MAAO,EACPtC,MAAO,EACPuC,MAAO,GAETxB,MAAM,EACNyB,OAAO,GAETC,YAAY,EACZC,6BAA6B,EAC7BC,SAAS,OAAe,IACxBC,eAAgB,CAAC,E,kCEpPnB,IAAIC,GAAc,EAElB,IAEE,MAAMC,EAAMC,SAASC,cAAc,UAAUC,WAAW,SAClDC,EAAYJ,EAAIK,aAAa,6BAC7BC,EAAmBF,GAAaJ,EAAIO,aAAaH,EAAUI,0BAA4B,IACzFF,EAASpB,MAAM,WAAaoB,EAASpB,MAAM,eACmC,IAAhFc,EAAIS,yBAAyBC,QAAQ,yCACrCX,GAAc,E,CAEhB,MAAMY,G,CAIR,S,iCCbA,MAEA,E,QAF0B,C,iBCQ1B,IAAIC,EACJ,G,yBAAIC,UAEF,IAEED,GADcE,UAAUC,UAAU7B,MAAM,mBACT,IAAM,E,CACrC,MAAMyB,GACNC,GAAwB,C,MANbA,GAAwB,EAUvC,S,kCCrBA,MAEA,EAFmC,WAAaX,SAASC,cAAc,UAAUC,WAAW,OAAS,CAAC,E,kCCAtG,MAEA,GAFoF,IAAzDW,UAAUC,UAAUC,OAAO,wB,wCCAtD,MAEA,KAFyD,QAAtB,EAAS,OAATF,gBAAS,IAATA,eAAS,EAATA,UAAWG,mBAAW,eAAEC,sBAAsB,C,kCCEjF,MAEA,E,QAFgC,C,gDCAhC,MAAMC,EAA6B,IAAIC,IAAI,CACzC,aACA,YACA,cAGC,KACDD,EAA2BE,IAAI,cAGjC,S,yDCTA,MAAMC,EAAM,IAAI,KAA4BC,OAAO,IAAI,MAIvD,EAFmC,IAAIH,IAAIE,E,gDCF3C,MAEA,IAF2BrB,SAASC,cAAc,SAASsB,YAAY,oBAAsB,EAAAX,WAAa,EAAAY,e,kCCH1G,MAAMhC,EAAQQ,SAASC,cAAc,SAGrC,KAF6BT,EAAM+B,cAAe/B,EAAM+B,YAAY,cAAcE,QAAQ,KAAM,I,kCCChG,MAEA,G,QAF+BC,aAAc,C,kCCF7C,MAEA,KAFuC,qBAA+B,OAATb,gBAAS,IAATA,eAAS,EAATA,UAAWc,eAAgB,CAAC,G,gDCEzF,MAEA,EAF4D,oBAAnB,eAAmC,kB,kCCK5E,MACA,EAD4B,iBAAkB7G,QAAYA,OAAO8G,eAAiB5B,oBAAoB4B,a,gNCC/F,MAAMC,EAAahB,UAAYA,UAAUC,UAAY,KAC/CgB,GAAoE,IAAzDjB,UAAUC,UAAUC,OAAO,yBACtCgB,GAAuE,IAA1DlB,UAAUC,UAAUkB,cAAcvB,QAAQ,WACvDwB,EAAc,SAASC,KAAKrB,UAAUC,YAAc,aAAaoB,KAAKrB,UAAUsB,QAGhFX,GAAmB,mBAAmBU,KAAKrB,UAAUuB,WACxC,aAAvBvB,UAAUuB,UAA2BvB,UAAUwB,eAAiB,KAC/D,aAESzB,KAAe,oBAAuBiB,KAAe,yBAAyBK,KAAKL,IAAkBA,EAAW5C,MAAM,YAAc4C,EAAW5C,MAAM,YACrJyC,EAAab,UAAUC,UAAUkB,cAAcvB,QAAQ,YAAc,EAErE6B,EAAmB1B,GAAaY,EAEhCpF,EAAwDyE,UAAUwB,eAAiB,IAAsJ,GAAjJxB,UAAUC,UAAUC,OAAO,iH,kCCvBhI,MAEA,KAFwC,OAATF,gBAAS,IAATA,eAAS,EAATA,UAAW0B,Q,+CCE1C,MAAMC,EAA6B,IAAIrB,IAAI,CACzC,YACA,YACA,eAGC,KACDqB,EAA2BpB,IAAI,mBAGjC,S,+CCVA,MAEA,IAF4BpB,SAASC,cAAc,SAASsB,YAAY,gBAAkB,EAAAX,YAAc,EAAAY,e,kCCFxG,MAEA,EAF0BxB,SAASC,cAAc,UAAUwC,UAAU,cAAcC,WAAW,kB,gDCE9F,MAEA,IAF6D,oBAAxB,mBAAwC,EAAAhB,W,iBCiBtE,SAASiB,EAAWC,EAAWC,EAAWC,EAAWC,EAAY,GACtEH,GAAK,IAAKC,GAAK,IAAKC,GAAK,IACzB,MAAME,EAAMC,KAAKD,IAAIJ,EAAGC,EAAGC,GACzBI,EAAMD,KAAKC,IAAIN,EAAGC,EAAGC,GACvB,IAAIK,EAAWC,EACf,MAAMC,GAAKL,EAAME,GAAO,EAExB,GAAGF,IAAQE,EACTC,EAAIC,EAAI,MACH,CACL,MAAME,EAAIN,EAAME,EAEhB,OADAE,EAAIC,EAAI,GAAMC,GAAK,EAAIN,EAAME,GAAOI,GAAKN,EAAME,GACxCF,GACL,KAAKJ,EACHO,GAAKN,EAAIC,GAAKQ,GAAKT,EAAIC,EAAI,EAAI,GAC/B,MACF,KAAKD,EACHM,GAAKL,EAAIF,GAAKU,EAAI,EAClB,MACF,KAAKR,EACHK,GAAKP,EAAIC,GAAKS,EAAI,EAGtBH,GAAK,C,CAGP,MAAO,CACLA,EAAO,IAAJA,EACHC,EAAO,IAAJA,EACHC,EAAO,IAAJA,EACHN,IAEJ,CAcO,SAASQ,EAAWJ,EAAWC,EAAWC,EAAWN,GAE1D,IAAIH,EAAWC,EAAWC,EAE1B,GAHAK,GAAK,IAAeE,GAAK,IAGhB,IAHCD,GAAK,KAIbR,EAAIC,EAAIC,EAAIO,MACP,CACL,MAAMG,EAAU,SAAiBC,EAAWC,EAAWC,GAGrD,OAFGA,EAAI,IAAGA,GAAK,GACZA,EAAI,IAAGA,GAAK,GACZA,EAAI,EAAE,EAAUF,EAAc,GAATC,EAAID,GAASE,EAClCA,EAAI,GAAYD,EAChBC,EAAI,EAAE,EAAUF,GAAKC,EAAID,IAAM,EAAE,EAAIE,GAAK,EACtCF,CACT,EAEMC,EAAIL,EAAI,GAAMA,GAAK,EAAID,GAAKC,EAAID,EAAIC,EAAID,EACxCK,EAAI,EAAIJ,EAAIK,EAClBd,EAAIY,EAAQC,EAAGC,EAAGP,EAAI,EAAE,GACxBN,EAAIW,EAAQC,EAAGC,EAAGP,GAClBL,EAAIU,EAAQC,EAAGC,EAAGP,EAAI,EAAE,E,CAG1B,MAAO,CAACF,KAAKxD,MAAU,IAAJmD,GAAUK,KAAKxD,MAAU,IAAJoD,GAAUI,KAAKxD,MAAU,IAAJqD,GAAUG,KAAKxD,MAAU,IAAJsD,GACpF,CAgBO,SAASa,EAAWC,GACzB,MAAMxC,EAAiB,GACjByC,EAAqB,MAAZD,EAAK,GAAa,EAAI,EAKrC,GAJGA,EAAKE,SAAY,EAAID,IACtBD,GAAQC,EAAS,IAAM,IAAM,IAAMD,EAAKG,MAAMF,IAG7CD,EAAKE,SAAY,EAAID,EACtB,IAAI,IAAIG,EAAIH,EAAQG,EAAIJ,EAAKE,SAAUE,EACrC5C,EAAI6C,KAAKC,SAASN,EAAKI,GAAKJ,EAAKI,GAAI,UAElC,GAAGJ,EAAKE,SAAY,EAAID,EAAS,CACtC,IAAI,IAAIG,EAAIH,EAAQG,EAAKJ,EAAKE,OAAS,IAAME,EAC3C5C,EAAI6C,KAAKC,SAASN,EAAKI,GAAKJ,EAAKI,GAAI,KAGvC5C,EAAI6C,KAAKC,SAASN,EAAKA,EAAKE,OAAS,GAAI,I,MAEzC,IAAI,IAAIE,EAAIH,EAAQG,EAAIJ,EAAKE,OAAQE,GAAK,EACxC5C,EAAI6C,KAAKC,SAASN,EAAKG,MAAMC,EAAGA,EAAI,GAAI,KAI5C,OAAO5C,CACT,CAEO,SAAS+C,EAASC,GACvB,OAAOT,EAAWS,EAAIL,MAAM,EAAG,GACjC,CAEO,SAASM,EAAWT,GACzB,MAAMU,EAAOX,EAAWC,GACxB,OAAOlB,EAAW4B,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAIA,EAAK,GACpD,CAEO,SAASC,EAAWD,GACzB,MAAO,IAAMA,EAAKE,KAAKC,IAAO,IAAMA,EAAEC,SAAS,KAAKX,OAAO,KAAIY,KAAK,GACtE,CAMO,SAASC,EAAgBC,GAC9B,OALK,SAA0BA,GAC/B,OAAON,EAtDF,SAA0BM,GAC/B,MAAMC,EAAWD,EAAKd,MAAM,GAAI,GAAGgB,MAAM,MACnCC,GAASF,EAASG,MAClB7D,EAAM0D,EAASN,KAAKU,GACrBA,EAAIC,SAAS,MACND,EAAInB,MAAM,GAAI,IAGhBmB,IAGV,OAAO5B,EAAWlC,EAAI,GAAIA,EAAI,GAAIA,EAAI,GAAI4D,EAC5C,CA0CoBI,CAAiBP,GACrC,CAGSQ,CAAiBR,GAAMd,MAAM,GAAI,EAC1C,C,wFCtJe,SAASuB,EAAeC,EAAYC,GACjDD,EAAKA,EAAGR,MAAM,IAAK,GAAG,GACtBS,EAAKA,EAAGT,MAAM,IAAK,GAAG,GACtB,MAAMU,EAAKF,EAAGR,MAAM,KACdW,EAAKF,EAAGT,MAAM,KAEpB,IAAI,IAAIf,EAAI,EAAGA,EAAIyB,EAAG3B,SAAUE,EAAG,CACjC,MAAMuB,GAAME,EAAGzB,GACTwB,GAAME,EAAG1B,GACf,GAAGuB,EAAKC,EAAI,OAAO,EACd,GAAGD,EAAKC,EAAI,OAAQ,C,CAG3B,OAAO,CACT,C,iCCRe,SAASG,I,MACtB,SAA+C,QAA3C,EAAA5F,SAAS6F,qBAAkC,eAAEvH,QAC9C0B,SAAS6F,cAAmCvH,QACtC,EAIX,C,iCCFe,SAASwH,EAAYC,GAElC,GADAA,IAAAA,EAAUjL,OAAOiL,OACdA,EAAO,CACR,IAAIA,EAAMC,WACR,OAAO,EAITD,EAAQA,EAAME,eAAiBF,EAE/B,IACKA,EAAMG,iBAAiBH,EAAMG,kBAC7BH,EAAMI,gBAAgBJ,EAAMI,iBAC/BJ,EAAMK,aAAc,EACpBL,EAAMM,cAAe,CACV,CAAX,MAAM3F,GAAK,C,CAGf,OAAO,CACT,C,iCCvBe,SAAS4F,EAAgBC,EAAwDC,GAC9F,OAAQD,EAAWE,QAAQ,IAAMD,EASnC,C,gECTe,SAASE,EAAqBC,GAC3CA,EAAMC,MAAMC,UAAY,uBAIxBF,EAAMG,SAGN,UAAYC,MAAK,KAIfJ,EAAMC,MAAMC,UAAY,EAAE,GAQ9B,C,sFCjBO,MAAMG,EAAyB,EAAApG,WAAa,EAAAxE,WAAa,IAEhE,GAAG4K,EAAwB,CACzB,MAAMC,EAA2B,UACjC,IAAIC,EAAS,EACb,MAAMC,EAAI,CAACC,SAAS,EAAMC,SAAS,GAC7BC,EAAeC,IACnB,MAAMC,EAAQD,EAAEE,QAAQ,GAIlBC,GAAa,OAAgBF,EAAMG,OAAQ,gBACjD,GAAGD,EAAY,CACb,MAAME,EAAIJ,EAAMP,GACVY,EAAWX,EAASU,EAMpBE,EAAYJ,EAAWI,UACvBC,EAAeL,EAAWK,aAC1BC,EAAeN,EAAWM,aAC1BC,EAAgBH,EAAY7E,KAAKxD,MAAMqI,EAAYJ,EAAWM,aAAeH,GAAYC,EAAYD,GAExFE,IAAiBC,GAAgBC,GAAiBF,GAAgBE,GAAiB,IAEpGV,EAAEpB,gB,MAKJoB,EAAEpB,gB,EAaN,IAAI+B,EAAwB,EAC5BlI,SAASmI,iBAAiB,WAAYZ,KAC/BA,EAAEI,OAAuBS,UAAUC,SAAS,2BAA8Bd,EAAEe,UAAYJ,EAAyB,MAWvG,OAAqBX,EAAEI,QAEtC3H,SAASmI,iBAAiB,YAAab,EAAaH,GACpDnH,SAASmI,iBAAiB,cAAeZ,IACvC,GAAGA,EAAEE,QAAQ1D,OAAS,EAAG,OACzB,MAAMwE,EAAahB,EAAEE,QAAQ,GAE7BP,EAASqB,EAAWtB,EAAI,IACxB,GACD,CAACI,SAAS,IAEbrH,SAASmI,iBAAiB,YAAaZ,IAErCvH,SAASwI,oBAAoB,YAAalB,EAAaH,GAEvDe,EAAwBX,EAAEe,SAAS,GAQlC,CAACjB,SAAS,IAEbrH,SAASmI,iBAAiB,oBAAoB,KAEzCnI,SAAS6F,eACV7F,SAAS6F,cAAcuC,UAAUC,SAAS,2BACzCrI,SAAS6F,cAA8BvH,OACxC,OAAqB0B,SAAS6F,c,GAM/B,CAACwB,SAAS,G,CAGA,SAASoB,EAA6B9B,GAC/CK,GACJL,EAAMyB,UAAUhH,IAAI,yBACtB,C,yDCtGA,MAAMsH,EAAQ,CAAC,IAAK,KAGdC,EAIF,CAAC,EAECC,EAAsC,CAC1CC,KAAM,SACNC,MAAO,QACPC,UAAW,eAGE,SAASC,EAAUC,EAAiD,CACjFJ,KAAMH,EACNI,WAAOI,EACPH,UAAWL,IAEX,KAAK,UAAW1I,UACd,OAAOmJ,QAAQC,UAGjB,MAAMC,EAA2B,GACjC,IAAI,MAAMC,KAAQL,EAAO,CACvB,IAAIM,EAASN,EAAMK,GACL,QAAXC,IACDA,EAASb,GAGX,MAAMc,EAAOZ,EAAMU,GACbG,EAAmB,UAATH,EAAmB,CAAC,KAAO,CAAC,IAAK,KACjD,IAAI,MAAMI,KAAUD,EAAS,CAC3B,MAAME,GAAaJ,GAAU,MAACL,IAAYzE,KAAKoE,I,YAC7C,MAAM5B,EAAM,CAACyC,EAAQ,OAAQF,GAAM5E,KAAK,KAExC,OAD8C,QAA7B,GAAJ,EAAa,QAAV,EAAC+D,EAAM1B,UAAG,QAAT0B,EAAM1B,GAAS,CAAC,GAAE,EAAC4B,GAAQ,WAAE,aAAM7I,SAAS4I,MAAMgB,KAAK3C,EAAK4B,EAC/D,IAEhBQ,EAASnF,QAAQyF,E,EAIrB,OAAOR,QAAQU,KAAK,CAClBV,QAAQW,IAAIT,GAAUU,MAAM,MAC5B,OAAM,MAEV,C,gBChDe,SAASC,EAAaC,EAAeC,GAClDC,EAAaF,GACO,iBAAX,EACHC,EACCD,EAAKG,UAAYF,EADZD,EAAKI,kBAGfJ,EAAKI,gBAAgBH,EAEzB,CAEO,SAASC,EAAaF,GAE3BA,EAAKK,aAAa,MAAO,OAE3B,C,kFCbA,MAAMC,EAAmB,IAAqB,aAAe,YAGtD,MAAMC,UAAuB,IAQlCC,cACEC,QAEAC,KAAKC,SAAU,EACfD,KAAKE,aAAe1B,QAAQC,UAC5BuB,KAAKG,aAAe,OAEpBhQ,OAAOqN,iBAAiB,QAAQ,KAC9BwC,KAAKI,QAAS,EAEdjQ,OAAOqN,iBAAiB,SAAS,KAC/BwC,KAAKI,QAAS,CAAK,GAClB,CAACC,MAAM,GAAM,IAIlBlQ,OAAOqN,iBAAiBoC,GAAkB,KACxCI,KAAKI,QAAS,CAAK,GAClB,CAACC,MAAM,EAAM3D,SAAS,IAEzBsD,KAAKxC,iBAAiB,UAAW8C,IAC5BA,EACDN,KAAKE,aAAe,IAAI1B,SAASC,IAC/BuB,KAAKG,aAAe1B,CAAO,IAG7BuB,KAAKG,c,GAGX,CAEOI,kBACL,OAAOP,KAAKE,YACd,CAEWE,aACT,OAAOJ,KAAKC,OACd,CAEWG,WAAOI,GACbR,KAAKC,UAAYO,IAQpBR,KAAKC,QAAUO,EACfR,KAAKS,cAAc,SAAUD,GAC/B,EAGF,MACA,EADuB,IAAIX,C,gDCjEpB,MAAMa,UAAuB,IAApC,c,oBAGS,KAAAC,eAAiB,CAU1B,CARMC,sBACF,OAAOZ,KAAKW,eAAiB,CAC/B,CAEIC,oBAAgBJ,GAClBR,KAAKW,gBAAkBH,EAAQ,GAAK,EACpCR,KAAKS,cAAc,SAAUT,KAAKY,gBACpC,EAGF,MACA,EADuB,IAAIF,C,iBCG3B,IAAIG,EACG,SAASC,EAAQC,GAClBF,EASFA,EAAiBtH,KAAKwH,IARtBF,EAAmB,CAACE,GAEpBC,uBAAsB,KACpB,MAAMC,EAAmBJ,EACzBA,OAAmBtC,EACnB0C,EAAiBC,SAASC,GAAOA,KAAK,IAK5C,C,6CAEA,IAAIC,EAqBAC,EArBgEC,GAAa,EAC1E,SAASC,EAAoBR,GAC9BK,EAYME,EACRP,IAEAK,EAA6B7H,KAAKwH,IAdlCK,EAA+B,CAACL,GAEhCC,uBAAsB,KACpBM,GAAa,EACb,IAAI,IAAIhI,EAAI,EAAGA,EAAI8H,EAA6BhI,SAAUE,EACxD8H,EAA6B9H,KAG/B8H,OAA+B7C,EAC/B+C,GAAa,CAAK,IAOxB,CAGO,SAASE,IACd,OAAGH,IAEHA,EAAa,IAAI7C,SAAeC,GAAYqC,GAAQ,IAAMrC,QAC1D4C,EAAWjF,MAAK,KACdiF,OAAa9C,CAAS,IAGjB8C,EACT,CAEO,SAASI,IACd,OAAO,IAAIjD,SAAeC,IACxBqC,GAAQ,KACNA,EAAQrC,EAAQ,GAChB,GAEN,C,gBC1Ee,SAASiD,EAAeC,EAAavH,EAAWuH,EAAItH,MAAM,MACvE,MAAMuH,EAAc,CAAC,EACrB,OAAIxH,EAAS,IACbA,EAAS,GAAGC,MAAM,KAAK6G,SAASW,IAC9BD,EAAOC,EAAKxH,MAAM,KAAK,IAAMyH,mBAAmBD,EAAKxH,MAAM,KAAK,GAAG,IAG9DuH,GALiBA,CAM1B,C,oFC6FA,MAAMG,EAAkB,IAhGjB,MAKLjC,cACE,qBAA2B,gBAAgB,KACzCE,KAAKgC,UAAU,GAInB,CAEYC,qBACV,YAA4B1D,IAAzByB,KAAKkC,gBACClC,KAAKkC,gBAGPlC,KAAKkC,gBAAkB7M,SAAS8M,KAAKC,cAAc,yBAAsC,IAClG,CAEOC,cAAcxO,EAAQmM,KAAKsC,YAC5BzO,IACFA,EAAQmM,KAAKuC,UAAY,UAAY,WAGvC,MAAMN,EAAiBjC,KAAKiC,eACzBA,GACDA,EAAetC,aAAa,UAAW9L,EAE3C,CAEO2O,mBACL,IACE,MAAMC,EAAqBtS,OAAOuS,WAAW,gCACvCC,EAAgB,KAEpB3C,KAAK4C,YAAcH,EAAmBI,QAAU,QAAU,MAGvD,SACD,kBAAwB,gBAExB7C,KAAKgC,U,EAIN,qBAAsBS,EACvBA,EAAmBjF,iBAAiB,SAAUmF,GACtC,gBAAiBF,GACxBA,EAA2BK,YAAYH,GAG1CA,G,CACA,MAAM5M,G,CAGV,CAEOgN,0BACL,IAAI5I,EACJ,MAAMlG,EAAQ8N,EAAgBiB,WAC3B/O,EAAMP,WAAWI,oBAClBqG,EAAOlG,EAAMP,WAAWI,mBACxBuB,SAAS4N,gBAAgBhH,MAAMiH,YAAY,gCAAiC/I,IAE5E9E,SAAS4N,gBAAgBhH,MAAMkH,eAAe,kCAG5C,KAAsBhJ,IACxB4H,EAAgBO,YAAa,QAAgBnI,GAEjD,CAEO6H,WACL,MAAMO,EAAUvC,KAAKuC,UACfa,EAAc/N,SAAS8M,KAAKC,cAAc,yBAC7CgB,GACDA,EAAYzD,aAAa,UAAW4C,EAAU,OAAS,SAGzDlN,SAAS4N,gBAAgBxF,UAAU4F,OAAO,QAASd,GACnDvC,KAAKqC,gBAELrC,KAAK+C,yBACP,CAEOR,UACL,MAAgC,UAAzBvC,KAAKgD,WAAWvP,IACzB,CAEOuP,SAASvP,GAAmD,WAA7B,mBAAwCuM,KAAK4C,YAAc,qBAC/F,OAAO,0BAAgC5J,GAAMA,EAAEvF,OAASA,GAC1D,GAIF,G,sGCtGe,WAEb,MAAM6P,EAAgB,CACpBC,UAAUvG,EAAawG,GACrB,IAAIC,EAAMD,EAAK,GAAK,GAKpB,OAJ4B,IAAzBC,EAAI3N,QAAQ,WACb2N,GAAOC,SAAStN,QAGX,IAAI4G,EAAOyG,EACpB,GAGF,CACEE,OACyB,oBAAnB,cAAkCC,cACxCC,OAAOC,SAAS5C,SAAS6C,IACzB5T,OAAO4T,EAAEtQ,MAAe,IAAIuQ,MAAMD,EAAGT,EAAc,GAEvD,CAEAW,G,gICOA5O,SAASmI,iBAAiB,oBAAoB,KAAW,O,OAAD,E,OAAA,E,EAAA,YCjClD0G,QAAQC,UAAUC,kBACpBF,QAAQC,UAAUC,gBAAkB,SAAS3Q,EAAM4Q,GAGjD,YAFa,IAAVA,IAAkBA,IAAUA,GAE5BrE,KAAKsE,aAAa7Q,KAChB4Q,IAEHrE,KAAKuE,gBAAgB9Q,IACd,IAEI,IAAV4Q,IAEHrE,KAAKL,aAAalM,EAAM,KACjB,EACT,QDuB6C8K,IAA3CiG,KAAaL,UAAUzE,kBACxB8E,KAAaL,UAAUzE,gBAAkB,YAAY+E,GACpDzE,KAAK0E,YAAc,GAIhBD,GACDzE,KAAK2E,UAAUF,EAEnB,GAGFG,EAAA,YAAqB,EAAAC,EAAA,KAEJxP,SAASyP,eAAe,YAChCC,KAAO,OAAO,EAAA5N,WAAa,EAAAN,gBAAkB,SAAW,8BAEjEmO,EAAA,UAGA,MAAMjB,EAAI5T,OAAO8U,gBAAkB9U,OACnC,IACI+U,EADAC,GAAgB,EAEpB,MAAMC,EAAQ,KACZ,MAAMC,EAA2I,KAArIF,IAAkBG,EAAA,kBAAkCvB,EAAqBwB,QAAWxB,EAAayB,YAAcrV,OAAOqV,aAC/HN,IAAWG,IAEJ,KAAsBH,EAASG,GAAOA,EAAKH,EAAU,IAC7D,EAAAjK,EAAA,KAGFiK,EAASG,EAGThQ,SAAS4N,gBAAgBhH,MAAMiH,YAAY,OAAQ,GAAGmC,OAAO,EAkC/D,GAHAlV,OAAOqN,iBAAiB,SAAU4H,GAClCA,IAEG,IAAwB,CACzB,MAAMK,EAAmB,KACvBN,EAA0B,IAAVO,GAAe,MAA2BJ,EAAA,kBAC1DF,IAEGrB,IAAM5T,SACJgV,GACDhV,OAAO0N,oBAAoB,SAAUuH,GACrCrB,EAAEvG,iBAAiB,SAAU4H,KAE7BrB,EAAElG,oBAAoB,SAAUuH,GAChCjV,OAAOqN,iBAAiB,SAAU4H,I,EAKxC,IAAIM,EACHvV,OAAewV,cAAiB3R,IAC/B,MAAM4R,OAAqBrH,IAAVmH,EACjBA,EAAQ1R,GAEL4R,GAAsB,IAAVF,IACbD,G,EAIJH,EAAA,mBAAgC,UAAU,KACxCG,GAAkB,G,CAInB,EAAA1O,aAAe,KAChB1B,SAASmI,iBAAiB,aAAcZ,IACtC,MAAMI,EAASJ,EAAEI,OACjB,GAAsB,QAAnBA,EAAO6I,SAAqB7I,EAAOS,UAAUC,SAAS,SAEvD,OADA,EAAAvC,EAAA,GAAYyB,IACL,C,IAKV,KACDvH,SAAS4N,gBAAgBxF,UAAUhH,IAAI,gBAIzCpB,SAASmI,iBAAiB,aAAcZ,I,MACtC,GAA0C,SAAd,QAAzB,EAACA,EAAEI,cAAsB,eAAE6I,SAE5B,OADAjJ,EAAEpB,kBACK,C,IAKXnG,SAASmI,iBAAiB,eAAgBZ,IACC,QAArCA,EAAEI,OAAuB6I,SAAuB1V,OAAe2V,iBACjE,EAAA3K,EAAA,GAAYyB,E,IAIb,EAAA7F,YACD1B,SAAS4N,gBAAgBxF,UAAUhH,IAAI,aAAc,eAGpD,EAAAhF,WACD4D,SAAS4N,gBAAgBxF,UAAUhH,IAAI,aAGtC,EAAAU,UACE,EAAAlB,WACDZ,SAAS4N,gBAAgBxF,UAAUhH,IAAI,aAKtC,EAAAI,gBACDxB,SAAS4N,gBAAgBxF,UAAUhH,IAAI,UAEvCpB,SAAS4N,gBAAgBxF,UAAUhH,IAAI,WAEjC,EAAAW,YACR/B,SAAS4N,gBAAgBxF,UAAUhH,IAAI,cAYrC,IAGFpB,SAAS4N,gBAAgBxF,UAAUhH,IAAI,YAFvCpB,SAAS4N,gBAAgBxF,UAAUhH,IAAI,YAWzC,MAAMsP,EAAOC,YAAYhV,MAInBiV,EAAc,yBAEbC,EAAaC,SAAkB3H,QAAQW,IAAI,CAEhD,gBAA4B/C,MAAK,EAAE8J,KAAiBA,IACpDD,IAiBF,SAASG,EAAqB9G,EAAmB+G,GAC/C/G,EAAKrD,MAAMqK,QAAU,IAErBD,EAAQjK,MAAK,KACXjM,OAAO6Q,uBAAsB,KAC3B1B,EAAKrD,MAAMqK,QAAU,EAAE,GACvB,GAEN,CAvBA,mBAAmBJ,EAAYK,MAAM5U,SAASyC,YAE9CwQ,EAAA,WAAAA,UAAA,aAA0CxI,MAAMoK,IAC9C5B,EAAA,UAAoB4B,CAAS,IAG/BzE,EAAA,qBAEGoE,EAASM,aAAe,qBACzB,iBAAiBN,EAASO,WAgB5BC,QAAQC,IAAI,mBAAoBZ,YAAYhV,MAAQ+U,GAE1B,OAAvBI,EAASO,WAAsB,KAMhCrR,SAAS4N,gBAAgB4D,IAAM,MAGjC,IAAItV,EAAY2U,EAAYK,MAAMhV,UAElC,MAAMuV,EAAOpD,SAASoD,KAChB1M,EAAW0M,EAAKzM,MAAM,KACtBuH,GAAS,EAAAF,EAAA,GAAeoF,EAAM1M,GACpC,GAAGwH,EAAOmF,gBAAkC,sBAAhBxV,EAAUC,EAA2B,CAC/D,MAAMwV,EAAqC,CACzCC,MAAOrF,EAAOmF,eACdG,MAAOtF,EAAOuF,cACdC,OAAQxF,EAAOyF,gBAAgBC,WAC/BC,YAAiChJ,IAAzBqD,EAAO4F,kBAAkC5F,EAAO4F,cACxDC,OAAQ7F,EAAO8F,QAGjB,GAAGV,EAAKO,SAAW,SAAY,CAC7B,MAAMI,EAAkB,IAAIC,gBAAgBlE,SAAStN,QAQrD,OAPIwL,EAAO4F,cACTG,EAAgBE,IAAI,OAAQ,KAE5BF,EAAgBG,OAAO,aAGzBpE,SAAStN,OAASuR,EAAgB3N,W,CAIpC4K,EAAA,uCAA+C,YAAarT,EAAY,CAACC,EAAG,sBAAuBwV,Q,CAKrG,GAAmB,sBAAhBzV,EAAUC,EAA4C,CACvDmV,QAAQC,IAAI,wBAAyBrV,EAAUC,EAAGT,KAAKC,MAAQ,KAE/D,MAAM4K,EAAKvG,SAASyP,eAAe,cACnC,IAAI/H,EA6BAgL,EA5BJ,GAAGnM,EAAI,CACLmB,EAAanB,EAAGwG,cAAc,eACzB,MAAsB,EAAAzK,kBACzBoF,EAAWU,UAAUhH,IAAI,gBAI3BsG,EAAWd,MAAMqK,QAAU,IAE3B,MAAM0B,EAAc3S,SAASC,cAAc,OAC3C0S,EAAYvK,UAAUhH,IAAI,oBAE1BsG,EAAWkL,QAAQD,GACnBjL,EAAW4H,OAAOqD,EAAYE,Y,CAGhC,UACQ1J,QAAQW,IAAI,CAChB,uCACA,yCACC/C,MAAK,EAAE+L,EAAUC,MAClBD,EAASE,QAAQC,eAAc,GAC/BF,EAAWC,QAAQE,kBAAkB,G,CAEvC,MAAMxS,G,CAMR,OAAOxE,EAAUC,GACf,IAAK,kBACHuW,SAAqB,8DAA8BM,QAAQG,QAC3D,MACF,IAAK,kBACHT,SAAqB,gEAA8BM,QAAQG,QAC3D,MACF,IAAK,oBACHT,SAAqB,+DAAgCM,QAAQG,MAAMjX,EAAUkX,UAC7E,MACF,IAAK,oBACHV,SAAqB,gEAAgCM,QAAQG,QAC7D,MACF,IAAK,kBACHT,SAAqB,gEAA8BM,QAAQG,MAAMjX,EAAUmX,UAC3E,MACF,IAAK,sBACHX,SAAqB,gEAAkCM,QAAQG,MAAMjX,EAAUyV,MAKhFjK,IAEEgL,UACKA,GASR3B,EAAqBrJ,EANL,UAAW1H,SACzBmJ,QAAQU,KAAK,EACX,EAAAyJ,EAAA,GAAM,KACNtT,SAAS4I,MAAM2K,QAEjBpK,QAAQC,W,MA+BZkI,QAAQC,IAAI,sBAAuB7V,KAAKC,MAAQ,KAChDoV,EAAqB/Q,SAASyP,eAAe,iBAAiB,EAAAzG,EAAA,aACvD,gEAA0BgK,QAAQG,OAE7C,E,YAtWwD,K,6QAsWtD,G,kCErVF,MACA,EAD0B,IAxCnB,MACEK,SACL,IACEnF,SAASmF,QACA,CAAT,MAAMjM,GAAG,CAKb,CAEOkM,QACL,IACE3Y,OAAO2Y,OACE,CAAT,MAAMlM,GAAG,CACb,CAKOT,QAeLhM,OAAOgM,OAET,E,yDCaF,MAAM4M,EAA+D,CAAC,EAsDtE,SAASC,EAAiBC,EAAcC,GACtC,OAAO,IAAIlF,MAAMiF,EAAS,CACxBE,IAAK,CAACnM,EAAQlE,EAAGsQ,K,MAEf,OAAe,QAAf,EAAOpM,EAAOlE,UAAC,QAARkE,EAAOlE,GArDpB,SAAsCrF,EAAcyV,GAiClD,OAhCc,IAAIlF,MAAM,CAAC,EAAG,CAC1BmF,IAAK,CAACnM,EAAQlE,EAAGsQ,IAQR,IAAI5F,K,MACT,MAAM6C,EAAU,WAAuB,UAAW,CAChD5S,OACA4V,OAAQvQ,EACR0K,QACC0F,GAUH,OARG,OAC8B,QAA5B,EAAAH,EAAuBtV,UAAK,eAAE6V,IAAIxQ,KACnC6N,QAAQ4C,KAAK,kBAAmB9V,EAAMqF,EAAG0K,GAMtC6C,CAAO,GAStB,CAmB2BmD,CAAY1Q,EAAaoQ,EAAI,GAGxD,CAEA,IAAID,EACW,SAASpE,IACtB,OAAGoE,IAIHA,EAAUD,EAAiB,CAAC,GAAG,GAC/BC,EAAQQ,aAAeT,EAAiB,CAAC,GAAG,GACrCC,EACT,CAvEG,OACA9Y,OAAe4Y,uBAAyBA,E,8ECvBpC,MAAMW,EAUX5J,YAAY6J,IACV,OAAW3J,KAAM2J,GAEd,WACD3J,KAAKvM,MAAQ,SAGfuM,KAAK4J,oBAAqB,EAC1B5J,KAAK4G,KAAM,QAAO,CAAC,MAAO+C,EAAGlW,MAAMwG,KAAK,MACxC+F,KAAK4G,IAAI,eAET5G,KAAK6J,cAAa,GAElBH,EAAII,UAAUvQ,KAAKyG,KACrB,CAEO+J,cACL,OAAO/J,KAAK4J,kBACd,CAEOC,aAAaG,GAAY,GAC9B,GAAGhK,KAAKiK,gBAAkBD,EACxB,OAAOhK,KAAKiK,cAGd,MAAMC,EAAgB,CAACC,EAAoBC,K,MACzC,MAAMC,EAAaC,MAAMC,KAAKJ,EAAGE,YACjC,IAAI,MAAMG,KAAaH,EACrBF,EAAGM,YAAYD,GAGjB,GAAiB,QAAb,EAAAJ,EAAMM,eAAO,eAAEtR,OAInB,IAAI,MAAMuR,KAASP,EAAMM,QACpBP,EAAGE,WAAW3M,SAASiN,EAAMH,YAIhCL,EAAGS,YAAYD,EAAMH,UAAWG,EAAME,QAASF,EAAMG,iB,EASzD,IACE,IAAIC,EAAUC,UAAUC,KAAKjL,KAAKvM,KAAMuM,KAAK3O,SAE7C,IAAI0Z,EACF,OAAOvM,QAAQ0M,Q,CAEjB,MAAMC,GAGN,OAFAnL,KAAK4G,IAAIuE,MAAM,mBAAqBA,EAAgBC,SACpDpL,KAAK4J,oBAAqB,EACnBpL,QAAQ0M,OAAOC,E,CAGxB,IAAIE,GAAW,EAOf,OANAC,YAAW,KACLD,GACFN,EAAQQ,SAAQ,OAAU,sB,GAE3B,KAEIvL,KAAKiK,cAAgB,IAAIzL,SAAqB,CAACC,EAASyM,KAC7DH,EAAQS,UAAapQ,IACnBiQ,GAAW,EACX,MAAM1B,EAAKoB,EAAQU,OACnB,IAAIC,GAAY,EAEhB1L,KAAK4G,IAAI,UAET+C,EAAG4B,QAAWJ,IACZnL,KAAK4J,oBAAqB,EAC1B5J,KAAK4G,IAAIuE,MAAM,8CAA+CA,GAC9DD,EAAOC,EAAM,EAGfxB,EAAGgC,QAAW/O,IACZoD,KAAK4G,IAAIuE,MAAM,UAAWvO,IACzB8O,GAAa1L,KAAK6J,cAAc,EAGnCF,EAAGiC,QAAWhP,IACZoD,KAAK4G,IAAIuE,MAAM,SAAUvO,GACzB,MAAMiP,EAAcjP,EAAEI,OAEtBgD,KAAK6J,aAAa6B,GAAY,GAE3BG,EAAYN,SACbM,EAAYN,QAAQ3O,GAGtB+M,EAAGb,OAAO,EAGZa,EAAGmC,gBAAmBlP,IACpBoD,KAAK4G,IAAIuE,MAAM,wBAAwB,EAGzC1M,EAAQuB,KAAK2J,GAAKA,EAAG,EAGvBoB,EAAQQ,QAAWnQ,IACjBiQ,GAAW,EACXrL,KAAK4J,oBAAqB,EAC1B5J,KAAK4G,IAAIuE,MAAM,8CAA+C/P,GAC9D8P,EAAO9P,EAAM,EAGf2P,EAAQgB,gBAAmB3Q,IACzBiQ,GAAW,EACXrL,KAAK4G,IAAI2C,KAAK,8BAA+BnO,EAAM4Q,WAAY,KAAM5Q,EAAM6Q,YAE3E,MAAMjP,EAAS5B,EAAM4B,OACf2M,EAAK3M,EAAOyO,OAClBzL,KAAKkM,OAAOhL,SAASkJ,IAOnB,GAAIT,EAAGwC,iBAAiBzO,SAAS0M,EAAM3W,MAEhC,CACL,MACM0W,EADMnN,EAAO6O,YACJO,YAAYhC,EAAM3W,MACjCyW,EAAcC,EAAIC,E,KAxFA,EAACT,EAAiBS,KAC1C,MAAMD,EAAKR,EAAG0C,kBAAkBjC,EAAM3W,MACtCyW,EAAcC,EAAIC,EAAM,EAkFlBiC,CAAkB1C,EAAIS,E,GAMxB,CACH,GAEL,CAEOkC,cAAuC3C,G,MAC5C,OAAmE,QAA5D,EAAA3J,KAAK8J,UAAUyC,MAAMC,GAAaA,EAAS/Y,OAASkW,EAAGlW,cAAK,QAAI,IAAIiW,EAAIC,EACjF,CAEO2C,sBAAsBG,GAC3BzM,KAAK8J,UAAU5I,SAASwL,IACtB,GAAGD,GAAYA,IAAaC,EAC1B,OAGF,MAAM/C,EAAK+C,EAAQ/C,GAChBA,IACDA,EAAGgC,QAAU,OACbhC,EAAGb,Q,GAGT,EApKe,EAAAgB,UAAmB,GAuKrB,MAAM6C,EAKnB7M,YAAY6J,EAAOiD,GACjB5M,KAAK4M,UAAYA,EACjB5M,KAAK4G,KAAM,QAAO,CAAC,MAAO+C,EAAGlW,KAAMmZ,GAAW3S,KAAK,MACnD+F,KAAK6M,IAAMnD,EAAIoD,OAAOnD,EACxB,CAoCO7B,OAAOiF,EAA8BH,GAM1C,OAJItC,MAAM0C,QAAQD,KAChBA,EAAY,GAAGpW,OAAOoW,IAGjB/M,KAAKiN,eAAe,aAAcb,GAC/BW,EAAuBjT,KAAKiT,GAAcX,EAAYtE,OAAOiF,MACxB,GAAIH,EACrD,CAEOM,MAAMN,GACX,OAAO5M,KAAKiN,eAAe,aAAcb,GAAgBA,EAAYc,SAA2B,GAAIN,EACtG,CAEOO,KAAKJ,EAA8BvM,EAAoBoM,GAiB5D,OALItC,MAAM0C,QAAQD,KAChBA,EAAY,GAAGpW,OAAOoW,GACtBvM,EAAQ,GAAG7J,OAAO6J,IAGbR,KAAKiN,eAAe,aAAcb,GAC/BW,EAAuBjT,KAAI,CAACiT,EAAWK,IAAQhB,EAAYiB,IAAI7M,EAAM4M,GAAML,MACxC,GAAIH,EACnD,CA6EOzD,IAAO4D,EAA8BH,GAO1C,OAJItC,MAAM0C,QAAQD,KAChBA,EAAY,GAAGpW,OAAOoW,IAGpBA,EAAU3T,OAIP4G,KAAKiN,eAAkB,YAAab,GACjCW,EAAuBjT,KAAKiT,GAAcX,EAAYjD,IAAI4D,MACxB,GAAIH,GALvCpO,QAAQC,QAAQ,GAM3B,CAEQwO,eACNK,EACAvM,EACA6F,EACAgG,EAAY5M,KAAK4M,WAEjB,IAAI7G,EAOJ,OALGa,IACDb,EAAOC,YAAYhV,MACnBgP,KAAK4G,IAAIA,EAAM,YAGV5G,KAAK6M,IAAIhD,eAAezN,MAAMuN,GAC5B,IAAInL,SAAW,CAACC,EAASyM,KAK9B,MAAMW,EAAclC,EAAGkC,YAAY,CAACe,GAAYU,GAE1CC,EAAU,KACdC,aAAaC,GACbvC,EAAOW,EAAYV,MAAM,EAIrBuC,EAAa,KACjBF,aAAaC,GAEV7G,GACD5G,KAAK4G,IAAIA,EAAM,QAASZ,YAAYhV,MAAQ+U,GAQ9C,MAAM4H,EAAUC,EAAS9T,KAAK7B,GAAMA,EAAEwT,SACtChN,EAAQuO,EAAUW,EAAUA,EAAQ,GAAG,EAGzC9B,EAAYN,QAAUgC,EAGtB,MAAMM,EAAsC,cAATP,EAChCO,IACDhC,EAAYiC,WAAa,IAAMJ,KAGjC,MAAMD,EAAUnC,YAAW,KACzBtL,KAAK4G,IAAIuE,MAAM,2BAA4BU,EAAajF,EAAI,GAC3D,KAOGmH,EAAiBhN,EAAS8K,EAAYO,YAAYQ,IAElDI,EAAU1C,MAAM0C,QAAQe,GACxBH,EAAyBZ,EAAUe,EAAiB,GAAGpX,OAAOoX,GAEpE,GAAGF,EACD,OAGF,MAAMzU,EAASwU,EAASxU,OACxB,IAAI4U,EAAO5U,EAEX,MAAM6U,EAAoB,KACrBpC,EAAYV,SAIT6C,GACJN,G,EAIJ,IAAI,IAAIpU,EAAI,EAAGA,EAAIF,IAAUE,EAAG,CAC9B,MAAMyR,EAAU6C,EAAStU,GACzByR,EAAQQ,QAAUgC,EAClBxC,EAAQS,UAAYyC,C,MAI5B,CAEOC,OAAUtB,GACf,OAAO5M,KAAKiN,eAAoB,YAAab,GAAgBA,EAAY8B,UAA6B,GAAItB,EAC5G,E,kNCpcK,MAAMzG,EAAgD,CAC3D,wBAA2B,oBAC3B,2BAA8B,uBAC9B,2BAA8B,qBAC9B,2BAA8B,qBAC9B,2BAA8B,qBAC9B,6BAAgC,qBAChC,wBAA2B,oBAC3B,2BAA8B,uBAC9B,wBAA2B,wBAC3B,2BAA8B,oBAC9B,yBAA4B,gBAC5B,0BAA6B,gBAC7B,uBAA0B,iBAC1B,0BAA6B,UAC7B,4BAA+B,iBAC/B,8BAAiC,mBACjC,wBAA2B,0CAC3B,2BAA8B,kCAC9B,2BAA8B,sBAC9B,8BAAiC,oCACjC,8BAAiC,oCACjC,8BAAiC,oCACjC,gCAAmC,oCACnC,0BAA6B,iBAC7B,+BAAkC,oBAElC,gCAAmC,yBAEnC,qCAAsC,sCACtC,sCAAuC,sCACvC,sCAAuC,oCACvC,yCAA0C,uCAC1C,+BAAgC,iCAChC,gCAAiC,iCACjC,gCAAiC,+BACjC,mCAAoC,kCAEpC,iCAAkC,wCAClC,oCAAqC,gCACrC,uCAAwC,mCACxC,+BAAgC,yCAChC,kCAAmC,iCACnC,qCAAsC,oCAEtC,wBAA2B,qCAQhBgI,EAAyC,EAAA1c,UAAY,6BAA+B,8BAEjG,IAAU2c,GAAV,SAAUA,GAGR,IAAIC,EAEAC,EAYJ,SAASC,EAAYC,GACnB,EAAAC,sBAAwBD,EACxB,EAAAE,gCAAkCF,EAASnU,MAAM,KAAK,EACxD,CA2BA,SAASsU,IACP,GAAkB,QAAf,EAAAva,WACD,IACE,MAAMwa,EAAiBC,EAAkB,CAACC,KAAM,UAAWC,OAAQ,UAAWC,QAAQ,IAChFC,EAAO,IAAIle,KACjBke,EAAKC,SAAS,GACd,MAAMC,EAASP,EAAeQ,OAAOH,GACrC,EAAAI,UAAUC,GAAKH,EAAO9U,MAAM,KAAK,GACjC4U,EAAKC,SAAS,IACd,MAAMK,EAASX,EAAeQ,OAAOH,GACrC,EAAAI,UAAUG,GAAKD,EAAOlV,MAAM,KAAK,E,CACjC,MAAMtE,GACN4Q,QAAQwE,MAAM,mBAAoBpV,GAClC,EAAAsZ,UAAY,CAACC,GAAI,KAAME,GAAI,K,CAGjC,CAuBA,SAAgBC,IACd,MAAMC,EAAc,iBAEpB,OADAnB,EAAYmB,GACLlR,QAAQW,IAAI,CACjB,8BACA,8BACA,8BACC/C,MAAK,EAAEuT,EAAMC,EAAUC,MACxB,MAAMC,EAA4B,GAalC,OAZAC,EAAmBJ,EAAKtH,QAASyH,GACjCC,EAAmBH,EAASvH,QAASyH,GAW9BE,EAT8B,CACnCxe,EAAG,qBACHye,aAAc,EACdvJ,UAAWgJ,EACXI,UACAze,QAAS,EACT6e,OAAO,EACPL,UAAWA,EAAUxH,SAEM,GAEjC,CAEA,SAAgB8H,EAAa3B,EAAkB4B,GAE7C,EAAAC,yBAA0B,EAC1B,MAAMC,EAAW,aACjB,OAAO9R,QAAQW,IAAI,CACjBmR,EAASC,WAAWC,mBAAmB,uBAAwB,CAC7D9J,UAAW8H,EACXiC,UAAiB,SAEnB,EAIA,8BACA,8BACAH,EAASC,WAAWC,mBAAmB,wBAAyB,CAC9D9J,UAAW8H,EACX1H,KAAM,IAER,EAAA4J,iBAEJ,CAUA,SAAgBX,EAAmBD,EAAca,EAA2B,IAC1E,IAAI,MAAMrX,KAAKwW,EAAS,CAEtB,MAAM/V,EAAI+V,EAAQxW,GACD,iBAAR,EACPqX,EAAOpX,KAAK,CACV/H,EAAG,iBACH8K,IAAKhD,EACLkH,MAAOzG,IAGT4W,EAAOpX,KAAK,OAAD,QACT/H,EAAG,2BACH8K,IAAKhD,GACFS,G,CAKT,OAAO4W,CACT,CAmBA,SAAgBX,EAAa7J,GAG3B,OAFAA,EAASM,WAAa,oBAEf,QAAiB,CAACN,aAAW/J,MAAK,KACvCwU,EAAczK,GACPA,IAEX,CAYA,SAAgByK,EAAczK,GAC5B,MAAM0K,EAAkB,EAAApC,sBACxB,GAAGtI,EAASO,YAAcmK,EAA1B,CAIA,IACExC,EAAc,IAAIyC,KAAKC,YAAY,EAAArC,gC,CACnC,MAAM3Y,GACN4Q,QAAQwE,MAAM,oBAAqBpV,GACnCsY,EAAc,IAAIyC,KAAKC,YAAY,EAAArC,gCAAgCrU,MAAM,IAAK,GAAG,G,CAGnF,IACEgU,EAAc,IAAIyC,KAAKC,YAAY5K,EAASO,U,CAC5C,MAAM3Q,GACN4Q,QAAQwE,MAAM,oBAAqBpV,GACnCsY,EAAc,IAAIyC,KAAKC,YAAY5K,EAASO,UAAUrM,MAAM,IAAK,GAAG,G,CAGtE,EAAAyV,QAAQ5C,QAER,IAAI,MAAM8D,KAAU7K,EAAS2J,QAC3B,EAAAA,QAAQjI,IAAImJ,EAAO1U,IAAoB0U,GAGtC7K,EAAS0J,YACV,EAAAoB,cAAc7X,OAAS,EACvB,EAAA6X,cAAc1X,QAAQ4M,EAAS0J,UAAUA,WAEzC1J,EAAS0J,UAAUA,UAAU3O,SAASgQ,IACpC,GAAGA,EAAQzd,KAAM,CACf,MAAM0d,EAAmBD,EAAQE,aACjC,EAAAtB,QAAQjI,IAAIsJ,EAAa,CACvB3f,EAAG,iBACH8K,IAAK6U,EACL3Q,MAAO0Q,EAAQzd,M,MAMpB,EAAA4d,sBAAwBR,IACzB,kBAAwB,kBAAmBA,GAC3C,EAAAQ,oBAAsBR,EACtBS,EAAsBpE,QACtByB,KAGerE,MAAMC,KAAKlV,SAASkc,iBAAiB,UAC7CrQ,SAASsQ,IAChB,MAAMhF,EAAW,EAAAiF,QAAQtI,IAAIqI,GAE1BhF,GACDA,EAASkF,Q,IAGf,CAWA,SAAgBC,EAAe3V,EAAewH,EAA2BoO,EAAc,CAACtY,EAAG,IACzF,MAAMuY,EAAyC,GAG/C,IAAIC,EAAY,EA8DhB,OA7DA9V,EAAMlF,QAHS,0DAGO,CAACxC,EAAOyd,EAASC,EAASC,EAASC,EAAY/Y,EAAgB6X,KAKnF,GAFAa,EAAItY,KAAKyX,EAAO3X,MAAMyY,EAAW3Y,IAE9B4Y,EAAI,CAEL,IAAIP,EACJ,OAAOO,GACL,IAAK,KACHP,EAAUnc,SAASC,cAAc,KACjC,MAGF,IAAK,KACHkc,EAAUnc,SAASC,cAAc,KAKrCkc,EAAQ7M,UAAUgN,EAAeK,EAAIxO,EAAMoO,IAC3CC,EAAItY,KAAKiY,E,MACJ,GAAGS,EACRJ,EAAItY,KAAKlE,SAASC,cAAc,YAC3B,GAAG4c,EAAI,CACZ,MAAM9E,EAAM8E,EAAGC,YAAY,KACrBjU,EAAOgU,EAAG7Y,MAAM,EAAG+T,GAEnB3J,EAAMyO,EAAG7Y,MAAM+T,EAAM,EAAG8E,EAAG9Y,OAAS,GAC1C,IAAIhB,EACJ,GAAGqL,IAAO,OAAiBA,GAAM,CAC/BrL,EAAI/C,SAASC,cAAc,KAC3B,MAAM8c,GAAa,OAAQ3O,GAC3BrL,EAAE2M,KAAOqN,EAAW3O,IACjB2O,EAAWC,SAASja,EAAEuH,aAAa,UAAWyS,EAAWC,SAC5Dja,EAAE4E,OAAS,Q,MAEX5E,EAAIoL,EAAKoO,EAAYtY,KAElBlB,aAAaka,mBACdla,EAAIA,EAAEma,YAGRna,EAAEsM,YAAc,GAGlBtM,EAAEuM,UAAUgN,EAAezT,EAAMsF,EAAMoO,IAEvCC,EAAItY,KAAKnB,E,MACDoL,GA/Dd,SAA0BqO,EAAwCrO,EAA0BoO,GAC1F,MAAMY,EAAMhP,EAAKoO,EAAYtY,KAC1BgR,MAAM0C,QAAQwF,GACfX,EAAItY,QAAQiZ,GAEZX,EAAItY,KAAKiZ,EAEb,CAyDMC,CAAiBZ,EAAKrO,EAAMoO,GAI9B,OADAE,EAAY3Y,EAAS7E,EAAM8E,OACpB,EAAE,IAGR0Y,IAAc9V,EAAM5C,QACrByY,EAAItY,KAAKyC,EAAM3C,MAAMyY,IAGhBD,CACT,CAIA,SAAgBzC,EAAO9S,EAAkBoW,GAAQ,EAAOlP,GACtD,MAAMmP,EAAM,EAAA7C,QAAQ3G,IAAI7M,GACxB,IAAIN,EACJ,GAAG2W,EACD,GAAa,6BAAVA,EAAInhB,IAAoCgS,aAAI,EAAJA,EAAMpK,QAAQ,CACvD,IAAIW,EAAIyJ,EAAK,GACI,iBAAR,IAAkBzJ,GAAKA,EAAEjD,QAAQ,MAAO,KAGjDkF,EAAQ2W,EAFEtE,EAAYuE,OAAO7Y,GAEb,WAAa4Y,EAAiB,W,MAE9C3W,EADkB,mBAAV2W,EAAInhB,EACJmhB,EAAInS,MAGJlE,OAIVN,EAAQM,EAGV,MAAMmP,EAASkG,EAAe3V,EAAOwH,GACrC,OAAGkP,EACMjH,EAAO3R,KAAK+H,GAASA,aAAgB2C,KAAO3C,EAAK6C,YAAc7C,IAAM5H,KAAK,IAE1EwR,CAgBX,CA3Xa,EAAAqE,QAA4C,IAAI+C,IAChD,EAAA5B,cAA+B,GAOjC,EAAAZ,yBAA0B,EAE1B,EAAAyC,OAAQ,EAEH,EAAAC,OAAhB,SAAuBC,GACrB,EAAAF,MAAQE,CACV,EAOgB,EAAAC,iBAAhB,WACE,OAAG3E,IACIA,EAAuB9P,QAAQW,IAAI,CACxC,QAAiB,YACjB,EAAAuR,kBACCtU,MAAK,EAAE+J,KACJA,GAEM,KAMN,EAAAsI,uBACFF,EAAYpI,EAASO,WAGvBkK,EAAczK,GACPA,GAZEsJ,MAaRyD,SAAQ,KACT5E,OAAuB/P,CAAS,IAEpC,EAoBgB,EAAA4U,cAAhB,SACE/D,EACAgE,IAAiB,EAAAhf,YAAc,EAAAA,aAAegb,GAE9C,EAAAhb,WAAagb,EAEbT,IAEGyE,IACD9B,EAAsBpE,QACL5C,MAAMC,KAAKlV,SAASkc,iBAAiB,UAC7CrQ,SAASsQ,IAChB,MAAMhF,EAAW,EAAAiF,QAAQtI,IAAIqI,GAE1BhF,aAAoB6G,GACrB7G,EAASkF,Q,IAIjB,EAEgB,EAAAjC,kBAAiB,EAyBjB,EAAAU,aAAY,EAuBZ,EAAAmD,WAAhB,SAA2B9E,EAAkBsB,GAC3C,OAAO,kCAAwC,sBAAuB,CACpEW,UAAW,aACX/J,UAAW8H,EACX+E,KAAMzD,GAEV,EAEgB,EAAAC,mBAAkB,EAsBlB,EAAAyD,YAAhB,SAA4BhF,EAAkB4B,GAE5C,OADA7B,EAAYC,GACL2B,EAAa3B,GAAepS,MAAK,EAAEqX,EAAWC,EAAWC,EAAgBC,EAAgB/D,EAAWre,MACzG,IAAIse,EAA4B,GAUhC,MARA,CAAC6D,EAAgBC,GAAgB1S,SAASxI,IACxCqX,EAAmBrX,EAAE2P,QAAgByH,EAAQ,IAG/CA,EAAUA,EAAQnZ,UAAU,CAAC8c,EAAU3D,QAAS4D,EAAU5D,SAASjM,OAAOC,UAE1E2P,EAAU3D,QAAUA,EACpB2D,EAAU5D,UAAYA,EACfG,EAAayD,EAAU,GAElC,EAEgB,EAAAzD,aAAY,EASf,EAAAU,gBACS,oBAAX,WAAuD,IAAtBI,KAAgB,YACjDtS,QAAQC,UAER,8BAA2BrC,MAAMyX,IACrC1jB,OAAe2gB,KAAOgD,OAAOC,OAAwB,oBAAX,KAAyBjD,KAAO,CAAC,EAAG+C,EAAMxL,QAAQ,IAKnF,EAAAuI,cAAa,EAoEb,EAAAe,eAAc,EAuEd,EAAAvC,OAAM,EA2CT,EAAAqC,QAAyE,IAAIuC,QAO1F,MAAeC,EAIbnU,YAAYoU,GACVlU,KAAKwR,SAAU0C,aAAO,EAAPA,EAAS1C,UAAWnc,SAASC,cAAc,QAC1D0K,KAAKwR,QAAQ/T,UAAUhH,IAAI,QAE3BuJ,KAAKmU,SAAWD,aAAO,EAAPA,EAASC,SACtBD,IAAaA,EAAsC5X,KAAQ4X,EAA0CjF,OACtGjP,KAAK0R,OAAOwC,GAGd,EAAAzC,QAAQ5J,IAAI7H,KAAKwR,QAASxR,KAC5B,EASF,MAAaoU,UAAoBH,EAI/BnU,YAAYoU,EAA8B,CAAC,G,MACzCnU,MAAM,OAAD,wBAAKmU,GAAO,CAAEC,SAA0B,QAAhB,EAAAD,EAAQC,gBAAQ,QAAI,cACnD,CAEOzC,OAAOwC,GAGZ,IAFA,OAAWlU,KAAMkU,GAEI,cAAlBlU,KAAKmU,SACNnU,KAAKwR,QAAQ9M,YAAc,GAC3B1E,KAAKwR,QAAQ7M,UAAUyK,EAAOpP,KAAK1D,KAAK,EAAO0D,KAAKwD,WAC/C,CAEL,MAAMzJ,EAAIiG,KAAKwR,QAAQxR,KAAKmU,UACtBE,EAAYjF,EAAOpP,KAAK1D,KAAK,EAAM0D,KAAKwD,WAGrCjF,IAANxE,EAAiBiG,KAAKwR,QAAQ8C,QAAQtU,KAAKmU,UAAYE,EACpDrU,KAAKwR,QAA6BxR,KAAKmU,UAAYE,C,CAE7D,CAEOE,iBAAiBL,GACtB,GAAGlU,KAAK1D,MAAQ4X,EAAQ5X,OAAO,OAAU0D,KAAKwD,KAAM0Q,EAAQ1Q,MAI5D,OAAOxD,KAAK0R,OAAOwC,EACrB,EA/BW,EAAAE,YAAW,EAkCxB,MAAM9C,EAA0D,IAAIuB,IACpE,SAAShE,EAAkBqF,EAAsC,CAAC,GAChE,MAAMM,EAAOC,KAAKC,UAAUR,GAC5B,IAAItF,EAAiB0C,EAAsBnI,IAAIqL,GAM/C,OALI5F,IACFA,EAAiB,IAAIkC,KAAK6D,eAAe,EAAAjG,gCAAkC,SAAW,EAAAta,WAAY8f,GAClG5C,EAAsBzJ,IAAI2M,EAAM5F,IAG3BA,CACT,CAEW,EAAAS,UAAY,CAACC,GAAI,KAAME,GAAI,MAKtC,MAAa6D,UAAwBY,EAInCnU,YAAYoU,G,MACVnU,MAAM,OAAD,wBAAKmU,GAAO,CAAEC,SAA0B,QAAhB,EAAAD,EAAQC,gBAAQ,QAAI,kBACjD,OAAanU,KAAKwR,QACpB,CAEOE,OAAOwC,GAGZ,IAAIhW,EACJ,IAHA,OAAW8B,KAAMkU,GAGdlU,KAAKkU,QAAQpF,MAAQ9O,KAAKkU,QAAQnF,QAA+C,IAArC+E,OAAOP,KAAKvT,KAAKkU,SAAS9a,OAA6B,CACpG,MAAMwb,EAAQ5U,KAAKiP,KAAK4F,WACxB3W,GAAQ,KAAsB,QAAf,EAAA9J,WAAwBwgB,EAAQ,IAAO,GAAKA,IAAQvb,OAAO,GAAK,KAAO,IAAM2G,KAAKiP,KAAK6F,cAAczb,OAAO,GAKzG,QAAf,EAAAjF,aACD8J,GAAQ,KAAO0W,EAAQ,GAAK,EAAAvF,UAAUC,GAAK,EAAAD,UAAUG,I,KAElD,CAEL,MAAMZ,EAAiBC,EAAkB7O,KAAKkU,SAC9ChW,GAAO,OAAsB0Q,EAAeQ,OAAOpP,KAAKiP,M,CAGzDjP,KAAKwR,QAAgBxR,KAAKmU,UAAYjW,CACzC,EA9BW,EAAAmV,gBAAe,EAiCZ,EAAA0B,KAAhB,SAAqBzY,EAAkBkH,GACrC,OAAO,IAAI4Q,EAAY,CAAC9X,MAAKkH,SAAOgO,OACtC,EAEgB,EAAAwD,MAAhB,SAAsBd,GACpB,OAAO,IAAIE,EAAYF,GAAS1C,OAClC,EAEgB,EAAAyD,MAAhB,SAAsBzD,EAAsBlV,EAAkBkH,EAA2B2Q,GACvF,OAAO,IAAIC,EAAY,CAAC5C,UAASlV,MAAKkH,OAAM2Q,aAAW3C,OACzD,CACD,CA3fD,CAAUpD,IAAAA,EAAI,KA8fd,UAEM2G,EAAO3G,EAAK2G,KAGZC,EAAQ5G,EAAK4G,MAGbC,EAAQ7G,EAAK6G,MAGZ,SAASC,EAAiBC,EAA6BC,GAC5D,MAAM1e,EAAMye,EAAS9b,MAAM,EAAG,GAC9B,IAAI,IAAIC,EAAI,EAAGA,EAAI6b,EAAS/b,SAAUE,EAAG,CACvC,MAAM+b,EAAUF,EAAS/b,OAAS,IAAOE,EACzC5C,EAAI6C,KAAwB,mBAAb,EAA0B6b,EAAOC,GAAUD,GAC1D1e,EAAI6C,KAAK4b,EAAS7b,G,CAGpB,OAAO5C,CACT,CAMO,SAASuD,EAAKkb,EAA6BG,GAAU,EAAM5C,GAChE,MAAM6C,EAASL,EAAiBC,GAAWE,IACzC,MAAMlE,EAA2BkE,GAAUC,EAAU,qCAAuC,iCAC5F,OAAO5C,EAAQtE,EAAKgB,OAAO+B,GAAa,GAAQ4D,EAAK5D,EAAY,IAGnE,OAAOuB,EAAQ6C,EAAOtb,KAAK,IAAMsb,CACnC,CAEA,UAAsBnH,C,iKChmBf,MAAMoH,EAAuB,EACvBC,EAA0B,WAC1BC,EAAoC,IACpCC,EAA0B,MAC1BC,EAAa,WACbC,EAAkB,GAClBC,EAAqB,SACrBC,EAAkB,GAClBC,EAAe,CAAC,QAAU,SAAU,SAAU,QAAU,SAAU,UAClEC,EAA4B,iBAC5BC,EAAmB,WACnBC,EAAgB,IAAI3f,IAAI,CAAC,MAAO,IAAK,MAErC4f,EAAgC,EAChCC,EAAoC,EACpCC,EAA4B,IAAI9f,IAAI,CAAC4f,EAAeC,IACnC/d,KAAKD,OAAOiS,MAAMC,KAAK+L,G,qUCRrD,MAwBA,EAxBoB,OAAH,QACftgB,sBAAqB,IACrBb,YAAW,IACXohB,kBAAiB,IACjBC,2BAA0B,IAC1BC,mBAAkB,IAClBC,yBAAwB,IACxBC,wBAAuB,IACvBC,iBAAgB,IAChBC,sBAAqB,IACrBC,4BAA2B,IAC3BC,mBAAkB,IAClBC,qBAAoB,IACpBC,kBAAiB,IACjBC,2BAA0B,IAC1BC,kBAAiB,IACjBC,kBAAiB,IACjBC,oBAAmB,IACnB9gB,2BAA0B,IAC1B+gB,2BAA0B,IAC1Bzf,2BAA0B,KACvB1B,G,kFCtBL,MAIM9F,EAAgB,YAChBC,EAAQ,UAERinB,EAAWzD,OAAOP,KAAK,KAEvBiE,EAAmC,CACvC,yBACA,mBACA,eACA,cAKF,SAAeC,I,qCACb,MAAM7Q,GAAM,EAAA8Q,EAAA,IAAO,gBAEbC,EAAY3R,YAAYhV,MACxB4mB,GAAgB,OAAmBhR,GAEnClI,EAAW6Y,EAASzd,KAAKwC,GAAQsb,EAAcC,EAAA,MAAiBvb,GAAM,SAAWA,KACtF3F,OACCihB,EAAcE,EAAA,MAAmB,aAAc,QAC/CF,EAAcE,EAAA,MAAmB,YAAa,QAC9CF,EAAcE,EAAA,MAAmB,WAAY,SAE9CnhB,OAAOihB,EAAcC,EAAA,MAAiB,aAAc,aAE/CnhB,QAAY8H,QAAQW,IAAIT,GAC9BkI,EAAI2C,KAAK,WAAYvD,YAAYhV,MAAQ2mB,GAkCzC,MAAMI,EAA8B,GAC9BC,EAAc,CAAwB1b,EAAQkE,KAElD+F,EAAMjK,GAAOkE,EAEbuX,EAAWxe,KAAK+C,EAAI,EAatB,IAAIiK,EAAe,CAAC,EAGpB,IAAI,IAAIjN,EAAI,EAAGF,EAASme,EAASne,OAAQE,EAAIF,IAAUE,EAAG,CACxD,MAAMgD,EAAMib,EAASje,GACfkH,EAAQ9J,EAAI4C,QACLiF,IAAViC,EAED+F,EAAMjK,GAAOkE,EAEbwX,EAAY1b,GAAK,EAAA2b,EAAA,GAAK,IAAW3b,I,CAIrC5F,EAAIwhB,OAAO,EAAGX,EAASne,QAGvB,IAAI+e,EAAOzhB,EAAI0hB,QACf,MAAMnjB,EAAUyB,EAAI0hB,QACdC,EAAe3hB,EAAI0hB,QACnBE,EAAkB5hB,EAAI0hB,QAC5B,IAAID,GAAQG,EAAiB,CAC3BH,EAAOG,EACP,MAAM/E,EAAiB,CAAC,KAAM,qBAAsB,eACpD,IAAI,IAAIja,EAAI,EAAGA,GAAK,IAAKA,EACvBia,EAAKha,KAAK,KAAKD,iBACfia,EAAKha,KAAK,KAAKD,cAGjB,MAAMif,QAAe/Z,QAAQW,IAAIoU,EAAKzZ,KAAKwC,GAAQub,EAAA,MAAiBvb,MACpEiX,EAAKha,KAAK,aACVgf,EAAOhf,KAAsB,iBAAX,GAAwC,iBAAX,EAAsB,CAACif,KAAMD,EAAO,IAAM,aAActJ,KAAMle,KAAKC,MAAQ,IAAO,EAAGgD,GAAImkB,EAAKM,UAAS,IAAsBN,GAE5K,MAAMO,EAAW,CAAC,EAClBnF,EAAKrS,SAAQ,CAAC5E,EAAK8Q,KACjBsL,EAAIpc,GAAOic,EAAOnL,EAAI,UAGlB0K,EAAA,MAAmBY,E,CA2BxBP,IAED5R,EAAMhV,UAAY,CAACC,EAAG,qBACtBoT,EAAA,gBAAwB,YAA8B,iBAAX,GAAwC,iBAAX,EACtE,CAAC4T,KAAM,EAAGvJ,KAAMle,KAAKC,MAAQ,IAAO,EAAGgD,GAAImkB,EAAKM,UAAS,IACzDN,IAGJ,MAAMQ,EAA4C,IAAIniB,IACtD,GAAG+P,EAAMtR,UAAYA,EAAS,CAC5B,QAAesJ,IAAZtJ,EAAuB,CACxB,MAAMwX,EAAiD,IAAIoG,IAAI,CAC7D,CAAC,iBAAatU,GACd,CAAC,eAAWA,KAGdkO,EAASvL,SAAQ,CAAC1P,EAAG8K,KACnBmQ,EAAS5E,IAAIvL,GAAK,EAAA2b,EAAA,GAAK1R,EAAMjK,IAAM,IAGrCiK,GAAQ,EAAA0R,EAAA,GAAK,KAEbxL,EAASvL,SAAQ,CAACV,EAAOlE,KAEvBiK,EAAMjK,GAAOkE,CAAK,IAGpB,MAAMvI,EAA4C,CAChD2gB,MAAO,EACPC,QAAS,EACTC,MAAO,GAET,IAAI,MAAMxc,KAAOrE,EACf0gB,EAAcliB,IAAI6F,GA5GFyc,EAgHLxS,EA9GfwR,EAAW3e,OAAS,EACpBmN,EAAQwS,EACRhB,EAAWxe,QAAQua,OAAOP,KAAKhN,G,OA+GzBuR,EAAA,MAAmB,CACvBkB,SAAUzS,EAAMtR,S,CApHC,IAAC8jB,EAwHtB,MAAME,EAAOloB,KAAKC,MAsClB,GArCIuV,EAAMzV,iBApMU,MAoM0BmoB,IACzC,MACDrS,EAAI,qBAAsBL,EAAMzV,iBAAkBmoB,GAelDzB,EAXKtW,SAAS5E,IACZ0b,EAAY1b,GAAK,EAAA2b,EAAA,GAAK,IAAW3b,IAAM,MAwBzCiK,EAAM5U,SAASunB,eAAe,UAAY3S,EAAM5U,SAASunB,eAAe,gBAC1E3S,EAAM5U,SAASsC,MAAQsS,EAAM5U,SAASwnB,WAAa,QAAU,MAC7DnB,EAAY,WAAYzR,EAAM5U,YAI5B4U,EAAM5U,SAASunB,eAAe,WAAa3S,EAAM5U,SAAS+B,WAAY,CACxE6S,EAAM5U,SAAS6B,QAAS,EAAAykB,EAAA,GAAK,qBAC7B,MAAMhkB,EAAQsS,EAAM5U,SAAS6B,OAAO+Y,MAAMvT,GAAMA,EAAEvF,OAAS8S,EAAM5U,SAASsC,QACvEA,IACDA,EAAMP,WAAa6S,EAAM5U,SAAS+B,WAClCskB,EAAY,WAAYzR,EAAM5U,U,CAKlC,MAAMynB,EAAuB7S,EAAM5U,SAASK,aAC5C,QAAqCuM,KAAlC6a,aAAoB,EAApBA,EAAsBjnB,SAAuB,CAC9C,MAAMknB,EAAW,CACf,WACA,UACA,SACA,YAGiB,CACjB,QACA,QACA,QAGSnY,SAASoY,IAClB,MAAMC,EAAiDH,EAAqBE,GAAa,CAAC,EAC1FD,EAASnY,SAASsY,IAChBD,EAAiBC,GAAYJ,EAAqBI,EAAS,GAC3D,IAGJH,EAASnY,SAASsY,WACTJ,EAAqBI,EAAS,IAGvCxB,EAAY,WAAYzR,EAAM5U,S,CAOhC,IAAIsa,EAAoBD,EACxB,IALA,EAAAyN,EAAA,GAAmB,IAAYlT,GAAQmT,IACrC1B,EAAY0B,EAA2BnT,EAAMmT,GAA2B,IAIvEnT,EAAMlV,UAAYhB,GAAiBkW,EAAMjV,QAAUhB,EAAqB,CAWzE,GAT+EiW,EAAMjV,MAAQ,MAC3FiV,EAAM/V,kBAAmB,EAAAynB,EAAA,GAAK,sBAC9B1R,EAAM9V,cAAe,EAAAwnB,EAAA,GAAK,kBAC1B1R,EAAM3V,YAAa,EAAAqnB,EAAA,GAAK,gBAExBU,EAAcliB,IAAI,aAI2B,KAA5C,EAAAmE,EAAA,GAAe2L,EAAMlV,QAAS,SAAiB,CAChD,IAAIsoB,GAAW,EACfpT,EAAM5U,SAAS6B,OAAO0N,SAAQ,CAACjN,EAAOmZ,EAAK1W,KACzC,GACiB,QAAfzC,EAAMR,MACoB,gCAA1BQ,EAAMP,WAAWE,MACS,UAA1BK,EAAMP,WAAWiL,MAEF,UAAf1K,EAAMR,MACqB,YAA3BQ,EAAMP,WAAWG,OACS,UAA1BI,EAAMP,WAAWiL,KAChB,CACD,MAAMib,EAAW,0BAAiCA,GAAaA,EAASnmB,OAASQ,EAAMR,OACpFmmB,IACDljB,EAAI0W,IAAO,EAAA6K,EAAA,GAAK2B,GAChBD,GAAW,E,KAKdA,GACD3B,EAAY,WAAYzR,EAAM5U,S,CAIkB,KAAjD,EAAAiJ,EAAA,GAAe2L,EAAMlV,QAAShB,KAC/B4b,EAAa5b,EACb2b,EAAazF,EAAMlV,SAGrB2mB,EAAY,UAAW3nB,GACvB2nB,EAAY,QAAS1nB,E,CAoBvB,OAjBG+nB,IAAiB/nB,KAAW+nB,GAAgBA,EAAe/nB,IAC5DwnB,EAAA,MAAmB,CAAC+B,QAASvpB,IAI/BsU,EAAA,WAAqB2B,EAAM5U,SAExB,MACDiV,EAAI,YAAaL,GAAO,EAAA0R,EAAA,GAAK1R,IAK/BK,EAAI2C,KAAK,QAASvD,YAAYhV,MAAQ2mB,GAI/B,CAACpR,QAAOoS,gBAAe1M,aAAYD,aAAY+L,aACxD,E,+RAEA,IAAI1R,E,iXCrTJ,MAAMyT,WAAwB,IAe5Bha,cACEC,QA6ZM,KAAAga,aAAgBC,I,QACtB,MAAM,KAACvmB,EAAI,IAAE6I,EAAG,MAAEkE,GAASwZ,EAC3B,IAAIA,EAAQd,eAAe,OAEzB,YADAlZ,KAAKia,QAAQxmB,GAAQ+M,GAIvB,MAAM0Z,EAA0B,QAApB,KAAGla,KAAKia,SAAQxmB,UAAI,UAAJA,GAAU,CAAC,OAC1B8K,IAAViC,SACM0Z,EAAO5d,GAEd4d,EAAO5d,GAAOkE,C,EAtahBR,KAAKia,QAAU,CAAC,EAChBja,KAAKma,SAAW,CACdC,YAAa,GACbC,cAAe,GAGjBra,KAAK4G,IAAI,eAGT5G,KAAKsa,iBAGLta,KAAKua,wBACLva,KAAKwa,uBAGLxa,KAAKya,2BAA2B,CAC9BC,YAAa,EAAEC,WAAUC,WAChBC,EAAA,UAA6BF,EAAUC,GAGhDE,YAAa,EAAEH,WAAUC,WAChBG,EAAA,iBAAoCH,GAAO,GAAOxe,MAAMqP,GAAWA,EAAOmP,QAGnFxf,MAAO,EAAE3H,OAAM+P,WAEboB,EAAA,sBAA8BnR,KAAS+P,EAAK,EAG9CwX,kBAAoBhB,IAClB,MAAMiB,EAAcjB,EACpB,OAAQlC,EAAA,EAAemD,EAAYtc,SAAiBsc,EAAYzX,KAAK,EAGvE0W,OAAQla,KAAK+Z,eA+DfnV,EAAA,mBAA2B,mBAAoBsW,IAC7CtW,EAAA,wCAAgDsW,EAAS,IAG3D/qB,OAAOqN,iBAAiB,UAAU,KAChCoH,EAAA,mDAA2D,IAG7DA,EAAA,mBAA2B,eAAe,KAExCpG,QAAQW,IAAI,EACV,EAAAgc,EAAA,IAAe,GAAO,GACtBrD,EAAA,UACAtZ,QAAQU,KAAK,CACXkc,EAAA,uBAAmC,IACnC,EAAAzS,EAAA,GAAM,OAER0S,EAAA,2BACA7c,QAAQW,IAT4B,CAAC,cAAe,sBAShCrF,KAAKwhB,GAAcC,OAAOzT,OAAOwT,QACpDpI,SAAQ,KACTsI,EAAA,UAA0B,GAC1B,IAGJC,EAAA,mBAAgC,UAAWnb,IACzCN,KAAK0b,mBAAmBpb,EAAK,IAE/BN,KAAK0b,mBAAmBD,EAAA,UAExBzb,KAAK4G,IAAI,uBAAwB,GACjC5G,KAAK2b,OAAO,cAAe,EAE7B,CAEOC,8BACL,GAAG5b,KAAK6b,yBACN,OAAO7b,KAAK6b,yBAGd,MAAMxV,EAAUrG,KAAK6b,0BAA2B,SAC1CC,EAASzmB,SAASC,cAAc,UACtCwmB,EAAOC,QAAS,EAChB,MAAMC,EAAS,KACb1Q,YAAW,KACTtL,KAAK6b,8BAA2Btd,CAAS,GACxC,KAEHiP,aAAaC,GACbqO,EAAOG,SACPH,EAAOje,oBAAoB,OAAQme,GACnCF,EAAOje,oBAAoB,QAASme,GACpC3V,EAAQ5H,SAAS,EAEnBqd,EAAOte,iBAAiB,OAAQwe,GAChCF,EAAOte,iBAAiB,QAASwe,GACjCF,EAAOI,IAAM,SAA2B,WAAhB5jB,KAAK6jB,SAAwB,GACrD9mB,SAAS+mB,KAAKzX,OAAOmX,GAErB,MAAMrO,EAAUtd,OAAOmb,WAAW0Q,EAAQ,KAC1C,OAAO3V,CACT,CAEQgW,oBAAoBC,GAC1Btc,KAAKuc,mBAAqBvc,KAAKwc,mBAAmBC,WAAWzc,KAAKuc,mBAClEvc,KAAKwc,mBAAmBE,eAAe1c,KAAKuc,kBAAoBD,GAChEtc,KAAKwc,mBAAmBG,WAAW,aAASpe,EAC9C,CAEQqe,yBACN1mB,UAAUomB,cAAcO,SAEtB,IAAIC,IAAI,kBACR,CAACC,MAAO,OACR3gB,MAAM4gB,IAIN,GAHAhd,KAAK4G,IAAI,gBAAiBoW,GAGvBA,EAAaC,SAAW/mB,UAAUomB,cAAcY,WACjD,OAAOF,EAAaG,aAAa/gB,MAAK,KACpCjM,OAAOuT,SAASmF,QAAQ,KAIjBmU,EAAaI,YAAcJ,EAAaK,SAAWL,EAAaC,QACxEzf,iBAAiB,eAAgBZ,IAClCoD,KAAK4G,IAAI,iBAAkBhK,EAAE,IAG/B,MAAMsgB,EAAahnB,UAAUomB,cAAcY,YAAcF,EAAaI,YAAcJ,EAAaK,SAAWL,EAAaC,OACzHjd,KAAKqc,oBAAoBa,EAAW,IAKlCnnB,IACFiK,KAAK4G,IAAIuE,MAAM,0BAA2BpV,GAE1CiK,KAAK2c,WAAW,uBAAuB,EAAM,GAEjD,CAEQpC,wBACN,KAAK,kBAAmBrkB,WAAY,OAEpC8J,KAAKwc,mBAAqB,IAAI,IAS9B,MAAMc,EAASpnB,UAAUomB,cACzBtc,KAAK4c,yBAILU,EAAO9f,iBAAiB,oBAAoB,KAC1CwC,KAAK4G,IAAI2C,KAAK,oBAEd,MAAM2T,EAAaI,EAAOJ,WAC1Bld,KAAKqc,oBAAoBa,GAEzBA,EAAW1f,iBAAiB,SAAUZ,IACpCoD,KAAK4G,IAAIuE,MAAM,oBAAqBvO,EAAE,GACtC,IAMJoD,KAAKwc,mBAAmBe,iBAAiBD,GACzCtd,KAAKwc,mBAAmB/B,2BAA2B,CACjD+C,KAAM,CAACxD,EAASyD,EAAQriB,KACtB4E,KAAK2c,WAAW,yBAAqBpe,OAAWA,EAAW,CAACnD,EAAMsiB,MAAM,IAAI,EAG9EC,MAAO,CAAC3D,EAASyD,KACfzd,KAAKwc,mBAAmBoB,eAAeH,EAAO,IAKlDH,EAAO9f,iBAAiB,gBAAiBZ,IACvCoD,KAAK4G,IAAIuE,MAAM,mBAAoBvO,EAAE,GAEzC,CAEc4d,uB,0CACZ,MAkBMlX,EAAgB,CACpBC,UAAS,CAACvG,EAAawG,KAEd,CAACC,IADID,EAAK,GAAKE,SAAStN,UAK7BynB,EAAY,CAChBla,OACyB,oBAAnB,cAAkCC,cACxCC,OAAOC,SACT+Z,EAAU3c,SAAS6C,GAAM5T,OAAO4T,EAAEtQ,MAAe,IAAIuQ,MAAMD,EAAGT,KAE9D,MAAMga,EAAgC,IAAI3Z,OAExC,IAAImZ,IAAI,kBACR,CAACne,UAAM,IAGTkf,EAAU3c,SAAS6C,GAAM5T,OAAO4T,EAAEtQ,MAAesQ,IAEjD,MAAM+Z,EAAeR,EAAe7Z,IAE9Bsa,EAAgBta,GAAgB,IAAI3D,EAAY2D,EAAK,CAAC9E,KAAM,WAC5Dqf,EAAsBV,GAAkCtd,KAAKge,mBAAmBV,EAAQW,EAAA,EAAmB,UAC3Gne,EAAc,IAA6B8D,aAAeD,OAGhEsa,EAAA,mBAAmC,QAAQ,CAACjE,EAASyD,EAAQriB,KAC3D4E,KAAK2c,WAAW,kBAAcpe,OAAWA,EAAW,CAACnD,EAAMsiB,MAAM,IAAI,IAevEM,EADoBD,EAAaD,IAGjC,MAAMI,QAhEOza,EAgEUqa,EA/DdK,MAAM1a,GAAKrH,MAAMgiB,GAAaA,EAASlgB,SAAQ9B,MAAM8B,IAC1D,MAAMmgB,EAAmB3a,SAAS4a,SAASjkB,MAAM,KAYjD,OAXAgkB,EAAiBA,EAAiBjlB,OAAS,GAAK,GAEhD8E,EAAO,oKADKwF,SAAS6a,OAASF,EAAiBpkB,KAAK,uGAQlDiE,IACW,IAAIsgB,KAAK,CAACtgB,GAAO,CAACS,KAAM,0BAC1B,KAdH,IAAC8E,SAiEazD,KAAK2b,OAAO,wBAAyB,CAACmC,cAAaI,UACjD7kB,MAAM,GAAGS,IAAIikB,GACjC7c,QAAQ8c,EAClB,G,CAGQ1D,iBAGN,IAAIgD,EAEFA,EADC,IACQ,IAAI1Z,aAEX,IAAIkZ,IAAI,kBACR,CAACne,UAAM,IAGA,IAAIgF,OAEX,IAAImZ,IAAI,kBACR,CAACne,UAAM,IAIXqB,KAAKye,qBAAqBnB,EAC5B,CAGQU,mBAAmBV,EAA+BoB,EAA8C/f,GACtG,MAAM6e,EAAqBF,EAAwBE,MAAQF,EAC3DoB,EAAYC,WAAWnB,GAEvBF,EAAO9f,iBAAiB,SAAUzH,IAChCiK,KAAK4G,IAAIuE,MAAMxM,EAAM,eAAgB5I,EAAI,GAE7C,CAEQ0oB,qBAAqBnB,GAC3Btd,KAAK4G,IAAI,iBAMT5G,KAAKge,mBAAmBV,EAAQtd,KAAM,UAExC,CAEQ4e,YACN,OAAOpgB,QAAQW,IAAI,EDrEdkH,QAAAA,EAAAA,EAAYoR,KCsEHrb,MAAM8J,IAChBlG,KAAKiM,WAAa/F,EAAY+F,WAC9BjM,KAAKgM,WAAa9F,EAAY8F,WAC9BhM,KAAKia,QAAe,MAAI/T,EAAYK,MAC7BL,MAIb,CAEO2Y,YACL,OAAO7e,KAAK4e,YAAYxiB,MAAMqP,IAC5B,MAAOvF,GAAeuF,EAEtB,OADAzL,KAAK2b,OAAO,QAAS,OAAF,wBAAMzV,GAAW,CAAEkB,OAAQxC,EAAA,qBACvC6G,CAAM,GAEjB,CAGOqT,aAAiDzV,KAAmB7F,GACzE,OAAOya,EAAA,eAA+B5U,KAAW7F,EACnD,CAGa2X,eAAe4D,EAAkBC,G,gDACtC,EAAA7D,EAAA,GAAe4D,EAASC,GAC9Bhf,KAAK2b,OAAO,iBAAkB,CAACoD,UAASC,eACxChf,KAAKwc,mBAAmBG,WAAW,iBAAkB,CAACoC,UAASC,cACjE,G,CAEaC,UAAmCxrB,G,0CAE9C,OADeuM,KAAKia,QAAQxmB,EAE9B,G,CAEOyrB,WACL,OAAOlf,KAAKif,UAAU,QACxB,CAEOE,eAAyC7iB,EAAQkE,GACtDR,KAAKma,SAAS7d,GAAOkE,EACrBR,KAAK2c,WAAW,WAAY3c,KAAKma,SACnC,CAEOuB,mBAAmBpb,GACxBN,KAAKmf,eAAe,gBAAiB7e,EAAOvP,KAAKC,MAAQ,EAC3D,EAoBF,MAAMouB,GAAkB,IAAItF,GAC5B,qBAAiCsF,GACjC,W,wICzdA,MAGMC,EAA6B,IAE5B,MAAMC,UAAuB,IAWlCxf,cACEC,OAAM,GAHA,KAAA6G,KAAM,QAAO,YAmCb,KAAA2Y,cAAgB,KACnBvf,KAAKwf,iBAAmBxf,KAAKyf,cAC9Bzf,KAAK4G,IAAI2C,KAAK,yBACd,WAAsB,e,EA+BlB,KAAAmW,cAAgB,CAAMpf,EAAO,cAA0B,O,EAAD,K,OAAA,E,EAAA,YAC5D,GAAGN,KAAKyf,YACN,OAGF,MAAMxG,EAAOloB,KAAKC,MACZ2uB,EAA2B,CAC/B3rB,GAAIgM,KAAK4f,WACTtf,OACA2Y,SAGK4G,EAAavuB,EAAQ,iBAAmBkN,QAAQW,IAAI,CACzD,QAAmB,eAAe,GAClC,QAAmB,WAAW,KAGhC,GAAG7N,EAAQ,UAKT,OAJA0O,KAAKwf,gBAAiB,EACtB,wCACAxf,KAAK8f,mBAAmB,gBACxB,oBAA+B,GAAO,GAE9BT,EACR,QAAmB,CAACU,YAAaJ,KAK/Brf,IACCuf,GACDA,EAAY7rB,KAAOgM,KAAK4f,YACxBC,EAAY5G,KAAQA,EAjHI,KAkH1B,QAAmB,CAAC8G,YAAaJ,IAE7B3f,KAAKwf,iBACPxf,KAAKwf,gBAAiB,EACtB,yCACAxf,KAAK4G,IAAI2C,KAAK,sBAAuBoW,IAGvC3f,KAAKggB,0BACGhgB,KAAKwf,iBACbxf,KAAKwf,gBAAiB,EACtB,wCACAxf,KAAK4G,IAAI2C,KAAK,oBAAqBoW,GACnC3f,KAAKigB,oBAALjgB,KAAKigB,kBAAsB9vB,OAAOmb,YAAW,IAAMtL,KAAK8f,mBAAmB,SAhItD,MAkIzB,E,YAhD8D,K,6QAgD7D,EAhHC9f,KAAK4G,KAAM,QAAO,YAClB5G,KAAK4f,WAAa,GACpB,CAEWM,wBACT,OAAOlgB,KAAKyf,WACd,CAEOU,QAGL,GAFAngB,KAAKogB,SAEDpgB,KAAKqgB,QAAmE,CAC1ErgB,KAAKqgB,SAAU,EAEf,qBAAgC,SAAUrgB,KAAK0f,eAC/CY,YAAYtgB,KAAK0f,cAlCS,KAmC1B1f,KAAK0f,gBAEL,IACErqB,SAAS4N,gBAAgBzF,iBAAiB,eAAgBwC,KAAKuf,cACtD,CAAT,MAAM3iB,GAAG,C,CAEf,CAEQwjB,QACNpgB,KAAKwf,gBAAiB,EACtBxf,KAAKggB,yBACLhgB,KAAKyf,iBAAclhB,CACrB,CASOgiB,mBACFvgB,KAAKyf,cACNzf,KAAKogB,QACLpgB,KAAK0f,eAAc,GACnB1f,KAAKS,cAAc,aAEvB,CAEQqf,mBAAmBU,GACtBxgB,KAAKwf,gBAAkBxf,KAAKyf,cAI/Bzf,KAAK4G,IAAI2C,KAAK,aAAciX,GAC5BxgB,KAAKggB,yBACLhgB,KAAKyf,YAAce,EAEnBxgB,KAAKS,cAAc,cAAe+f,GACpC,CAEQR,yBACHhgB,KAAKigB,oBACNzS,aAAaxN,KAAKigB,mBAClBjgB,KAAKigB,kBAAoB,EAE7B,EAqDF,MAAMjb,EAAiB,IAAIsa,EAC3B,OAAmB,oBAAgCta,GACnD,S,+HCpJO,MAAMyb,EAAb,cACU,KAAAC,SAA2B,WAAe,qBAAqBhd,SAASid,SAuClF,CArCSrY,cAAcsY,GACnB,IAAG5gB,KAAK0gB,SAIR,OAAO5I,EAAA,MAAmB,aAAa1b,MAAMykB,IAC3C,MAAMC,GAAK,EAAAC,EAAA,IAAM,GACjB,GACEH,IACAC,aAAQ,EAARA,EAAUD,eAAgBA,GACzBC,EAASC,GAAK,MAASA,EAExB,OAGFhJ,EAAA,MAAmB,CACjBkJ,UAAW,CACTJ,cACAE,QAIJ,MAAMG,EAAO,oBAAoBL,EAAc,IAAM,eAAeM,mBAAmB,YAAc,IAAM,cAMrGxiB,EALO,CACX,iBAAmBuiB,EACnB,UAAYA,GAGQnnB,KAAK2J,GC3ClB,SAAoBA,GACjC,MAAM0d,EAAS9rB,SAASC,cAAc,UAChC+Q,EAAU,IAAI7H,SAA4BC,IAC9C0iB,EAAOC,OAASD,EAAO5V,QAAU,KAC/B9M,EAAQ0iB,EAAO,CAChB,IAIH,OAFAA,EAAOjF,IAAMzY,EACbpO,SAAS+mB,KAAKiF,YAAYF,GACnB9a,CACT,CDkCeib,CAAW7d,GAAKrH,MAAM+kB,IAC3BA,EAAOlF,QAAQ,MAInB,OAAOzd,QAAQW,IAAIT,EAAS,GAEhC,EAGF,MAAM0c,EAAuB,IAAIqF,EACjC,OAAmB,0BAAsCrF,GACzD,S,mKE9BO,MAAMmG,UAA0B,IAgBrCzhB,cACEC,OAAM,GAXD,KAAAgK,aAAc,EACb,KAAAyX,eAAgB,EAChB,KAAAC,6BAA8B,EAC9B,KAAApB,SAAU,EACV,KAAA1uB,SAAsD,CAAC,EAEvD,KAAA+vB,UAAYxrB,UAAUC,UAAUkB,cAAcvB,QAAQ,YAAc,EACpE,KAAA6rB,iBAAkB3hB,KAAK0hB,UACvB,KAAA9a,KAAM,QAAO,MA6Cd,KAAAgb,UAAY,KACb5hB,KAAK+J,aAIT7T,UAAUomB,cAAc1T,MAAMxM,MAAMylB,IAClCA,EAAIC,YAAYF,UAAU,CAACD,gBAAiB3hB,KAAK2hB,kBAAkBvlB,MAAM2lB,IAEvE/hB,KAAKwhB,eAAgB,EACrBxhB,KAAKgiB,uBAAuB,YAAaD,EAAa,IACrD3iB,OAAOxC,IACuB,WAA5BqlB,aAAaC,WACdliB,KAAK4G,IAAI,4CAET5G,KAAK4G,IAAI,+BAAgChK,GACrCoD,KAAK2hB,kBACP3hB,KAAK2hB,iBAAkB,EACvBrW,WAAWtL,KAAK4hB,UAAW,I,GAG/B,GACF,EAqDG,KAAAO,cAAgB,KACrB,IAAIniB,KAAK+J,aAAe,sBACtB,OAGF/J,KAAKrO,SAASywB,SAAW1e,SAASqB,MAAQ,IAAIjO,QAAQ,OAAQ,IAE9D,MAAM6Y,EAA2C,CAAC,EAC5C0S,EAAkF,CACtFC,mBAAoB,EAAA7wB,UAAY,wCAA0C,iCAC1E8wB,qBAAsB,EAAA9wB,UAAY,0CAA4C,mCAC9E+wB,uBAAwB,sCAG1B,IAAI,MAAMC,KAAUJ,EAClB1S,EAAK8S,GAA2C,YAAYJ,EAAiBI,IAA0C,GAGzH,kCAA8C,WAAY,CACxDC,mBAAoB1iB,KAAKyhB,4BACzB9R,KAAMA,EACNhe,SAAUqO,KAAKrO,WAGjBqO,KAAK2iB,UAAYrX,WAAWtL,KAAKmiB,cAAe,IAAM,EA1IjD,gBAAiBhyB,QAClB,iBAAkBA,QAClB,kBAAmB+F,YACrB8J,KAAK4G,IAAI2C,KAAK,oCACdvJ,KAAK+J,aAAc,EACnB/J,KAAKyhB,6BAA8B,GAGlCzhB,KAAK+J,aAA2C,WAA5BkY,aAAaC,YAClCliB,KAAK4G,IAAI2C,KAAK,sCAElB,CAEO4W,QACDngB,KAAKqgB,UACPrgB,KAAKqgB,SAAU,EACfrgB,KAAK4iB,kBACL5iB,KAAK6iB,4BAET,CAEOC,gCACL9iB,KAAKyhB,6BAA8B,CACrC,CAEOmB,kBACD5iB,KAAK+J,aAIT7T,UAAUomB,cAAc1T,MAAMxM,MAAMylB,IAClCA,EAAIC,YAAYc,kBAAkBxmB,MAAM2lB,IACtC/hB,KAAKwhB,gBAAkBO,EACvB/hB,KAAKgiB,uBAAuB,OAAQD,EAAa,IAChD3iB,OAAOrJ,IACRiK,KAAK4G,IAAIuE,MAAM,iCAAkCpV,EAAI,GACrD,GAEN,CA0BOgtB,cACD/iB,KAAK+J,aAIT7T,UAAUomB,cAAc1T,MAAMxM,MAAMylB,IAClCA,EAAIC,YAAYc,kBAAkBxmB,MAAM2lB,IACtC/hB,KAAKwhB,eAAgB,EAElBO,IACD/hB,KAAKgiB,uBAAuB,cAAeD,GAE3CzW,YAAW,KACTyW,EAAagB,cAAc3mB,MAAM4mB,IAC/BhjB,KAAKwhB,eAAgB,CAAK,IACzBpiB,OAAOxC,IACRoD,KAAK4G,IAAIuE,MAAM,yBAA0BvO,EAAE,GAC3C,GACD,K,IAEJwC,OAAOxC,IACRoD,KAAK4G,IAAIuE,MAAM,wDACMvO,EAAE,GACvB,GAEN,CAEO2L,mBACDvI,KAAK+J,aAIT7T,UAAUomB,cAAc1T,MAAMxM,MAAMylB,IAClCA,EAAIC,YAAYc,kBAAkBxmB,MAAM2lB,IACtC/hB,KAAK4G,IAAI2C,KAAK,oBAAqBwY,GAChCA,GACDA,EAAagB,cAAc3mB,MAAM4mB,IAC/BhjB,KAAK4G,IAAI2C,KAAK,+BAAgCyZ,GAC9ChjB,KAAKwhB,eAAgB,CAAK,IACzBpiB,OAAOxC,IACRoD,KAAK4G,IAAIuE,MAAM,yBAA0BvO,EAAE,G,IAG9CwC,OAAOxC,IACRoD,KAAK4G,IAAIuE,MAAM,wDACMvO,EAAE,GACvB,GAEN,CA6BOqmB,YAAYC,GACjBljB,KAAKrO,UAAW,OAAKuxB,GACrB1V,aAAaxN,KAAK2iB,WAClB3iB,KAAKmiB,eACP,CAEOgB,wBACDnjB,KAAK+J,aAIT,kCAA8C,0BAAsBxL,EACtE,CAEOskB,4BACD7iB,KAAK+J,cAIT,wCAAoD,aAAciQ,IAC7D,sBACD,aAIFha,KAAKS,cAAc,0BAA2BuZ,EAAQ,IAGxD9jB,UAAUomB,cAAc1T,MAAMxM,KAAK4D,KAAKmiB,eAC1C,CAEOH,uBAAuB5mB,EAAmC2mB,GAC/D,GAAGA,EAAc,CACf,MAAMqB,EAAwCrB,EAAasB,SAC3D,KAAID,GACDA,EAAgBE,UAChBF,EAAgB7P,MAChB6P,EAAgB7P,KAAKgQ,QACrBH,EAAgB7P,KAAK4E,MAKtB,OAJAnY,KAAK4G,IAAI2C,KAAK,4BAA6B6Z,GAC3CpjB,KAAK+iB,cACL/iB,KAAK+J,aAAc,OACnB/J,KAAKgiB,uBAAuB5mB,GAI9B4E,KAAK4G,IAAI2C,KAAK,OAAQnO,EAAOgoB,GAC7BpjB,KAAKS,cAAe,QAAUrF,EAAuC,CACnEooB,UAAW,GACXC,WAAYhP,KAAKC,UAAU0O,I,MAG7BpjB,KAAK4G,IAAI2C,KAAK,OAAQnO,GAAO,GAC7B4E,KAAKS,cAAe,QAAUrF,GAAuC,EAEzE,EAGF,MAAMigB,EAAoB,IAAIkG,EAC9B,OAAmB,uBAAmClG,GACtD,S,6XCpEA,MAAMN,EAAuB,IAzJtB,MAAP,cAGU,KAAA2I,WAAa,KACb,KAAAC,MAAqB,GACrB,KAAAC,WAAY,EACZ,KAAAhd,KAAM,QAAO,OAAQ,WAiJ/B,CA/ISid,kBACL,OAAO,GACT,CAEOC,gBACF9jB,KAAK+jB,YAER/jB,KAAK+jB,UAAY,IAAIpgB,OAAO,qBAC5B3D,KAAK+jB,UAAUvmB,iBAAiB,WAAYZ,IAC1C,MAAMoK,EAAOpK,EAAEoK,KAGf,GADAhH,KAAK4G,IAAI,qBAAsBI,GAC5BA,GAAQA,EAAKgd,KAAM,CACpB,MAAMpJ,EAAQ5T,EAAKgd,KACnBhkB,KAAKikB,UAAUjkB,KAAK2jB,MAAMvL,QAASwC,E,KAGzC,CAEOsJ,aACFlkB,KAAKsd,SAERtd,KAAKsd,OAAS,IAAI3Z,OAAO,wBACzB3D,KAAKsd,OAAO9f,iBAAiB,WAAYZ,IACvC,MAAMoK,EAAOpK,EAAEoK,KAEfhH,KAAK4G,IAAI,wBAAyBI,GACjB,SAAdA,EAAKrI,MAENqB,KAAK+jB,UAAUI,YAAY,CAACC,QAAS,SAElCpd,EAAKqd,WACNrkB,KAAK2jB,MAAM,GAAGU,SAAWrd,EAAKqd,WAIhCrkB,KAAK+jB,UAAUI,YAAY,CACzBC,QAAS,SACTE,QAAS1nB,EAAEoK,MACV,EAAA/Q,eAAYsI,EAAYyI,EAAKlN,KAAKyqB,GAA2BA,EAAWC,S,IAGjF,CAEOC,aAAab,GAClB5jB,KAAK4jB,UAAYA,EACd5jB,KAAK4jB,WACN5jB,KAAKkkB,aACLlkB,KAAK8jB,iBACI9jB,KAAK2jB,MAAMvqB,QACpB4G,KAAK0kB,kBAET,CAEOT,UAAUU,EAAYlZ,GACvBA,GAGF+B,aAAamX,EAAKlX,SAClBkX,EAAK5jB,SAAStC,QAAQ,CAACmc,MAAOnP,EAAQ4Y,SAAUM,EAAKN,YAHrDM,EAAK5jB,SAASmK,OAAO,WAMpBlL,KAAK2jB,MAAMvqB,QACZ4G,KAAK4kB,eAAe5kB,KAAK2jB,MAAM,IAGjC3jB,KAAK0kB,kBACP,CAEOA,iBAAiBG,GAAO,KACzB7kB,KAAK4jB,YAAa5jB,KAAK2jB,MAAMvqB,QAAYyrB,KAE1C7kB,KAAKsd,SACNtd,KAAKsd,OAAOwH,YACZ9kB,KAAKsd,OAAS,MAGbtd,KAAK+jB,YACN/jB,KAAK+jB,UAAUe,YACf9kB,KAAK+jB,UAAY,MAErB,CAEOa,eAAeD,GACpB3kB,KAAKsd,OAAO6G,YAAY,CACtBC,QAAS,OACTW,kBAAmB/kB,KAAK0jB,WACxBsB,uBAAwBhlB,KAAK0jB,aAG/B1jB,KAAK+jB,UAAUI,YAAY,CACzBC,QAAS,OACTa,YAAa,GACbC,cAAellB,KAAK0jB,aAKtB1jB,KAAK4G,IAAI,yBACT5G,KAAKsd,OAAO6G,YAAY,CACtBC,QAAS,SACTe,MAAOR,EAAKQ,MACZd,SAAUM,EAAKS,cACd,EAAAnvB,eAAYsI,EAAY,CAAComB,EAAKQ,MAAMX,SAGvCG,EAAKlX,QAAUtd,OAAOmb,YAAW,KAC/BtL,KAAK4G,IAAIuE,MAAM,kBAEfnL,KAAK0kB,kBAAiB,GACnB1kB,KAAK2jB,MAAMvqB,SACZ4G,KAAKkkB,aACLlkB,KAAK8jB,iBAGP9jB,KAAKikB,UAAUjkB,KAAK2jB,MAAMvL,QAAQ,GACjC,IACL,CAEOiN,eAAeF,EAAmBC,GACvC,OAAO,IAAI5mB,SAAgB,CAACC,EAASyM,KACnC,MAAMyZ,EAAO,CACXQ,QACAC,eACArkB,SAAU,CAACtC,UAASyM,UACpBuC,QAAS,GAGXzN,KAAKkkB,aACLlkB,KAAK8jB,gBAEwB,IAA1B9jB,KAAK2jB,MAAMpqB,KAAKorB,IACjB3kB,KAAK4kB,eAAeD,E,GAG1B,CAEaW,OAAOf,EAAwBa,GAAe,G,yCACzD,OAAOplB,KAAKqlB,eAAed,EAAYa,GAAchpB,MAAWqP,GAAW,EAAD,gCACxE,MAAM8Z,EAAW,IAAI/G,KAAK,CAAC/S,EAAOmP,OAAQ,CAACjc,KAAM,cACjD,MAAO,CAAC8E,UAAW,WAAuB,kBAAmB8hB,GAAWlB,SAAU5Y,EAAO4Y,SAC3F,KACF,G,GAIF,0BAAsCtJ,EACtC,S,wHC5KA,MAMayK,EAAsB,w3BAyBtBC,EAAwB,OAAUD,EAGlCE,EAAgC,IAAMF,EAAsB,OAC5DG,EAA4B,+BAC5BC,EAAcD,EAEzB,MAAQD,EAAgC,aAAeA,EAF9BC,oIAQzBD,EAAgC,IAAMF,EARbG,qBAUdD,EAAgC,IAAMF,EAVxBG,iDAYOH,EAZPG,uEAmBdE,GADuB,IAAIC,OAAO,IAAMH,EAA0BtsB,MAAM,GAAI,GAAI,KACrD,+BAC3B0sB,EAAmB,qBACnBC,EAAsB,+BAAiCD,EAAmB,aAC1EE,EAAe,IAAIH,OAAO,YAAcC,EAAmB,MAAQH,EAAc,YAAc,IAAc,uBAAyBH,EAAwB,mBAAqBO,EAAqB,KACxME,EAAgB,4JAEhBC,EAAmB,+JACnBC,EAA8C,CACzD,SAAY,kCACZ,QAAW,kCACX,UAAa,0CACb,cAAe,uCAUJC,EAA8D,CACzE,IAAK,oBACL,KAAM,mBACN,KAAM,oBACN,GAAM,sBACN,KAAM,sBACN,MAAO,yBACP,KAAM,wBAGKC,EAAqD,IAAI9vB,IAAI,CACxE,qBACA,yBACA,uBAEF,IAAI,MAAM8C,KAAK+sB,EACbC,EAA0B7vB,IAAI4vB,EAAkB/sB,IAG3C,MAAMitB,EAAuB,S,6ECjGrB,SAASC,EAAQ/iB,EAAagjB,IACvC,OAAiBhjB,KACnBA,EAAM,WAAaA,GAGrB,MAAMoO,EAAgF,CAACpO,OACvF,IAAIijB,EAAWC,EAAgBC,EAC3BvU,EAGM,GAAIqU,EAAYjjB,EAAInP,MAAM,+EAAiF,CACnH,MAAMuyB,EAAI,IAAI/J,IAAIrZ,GAClB,IAAIqjB,EAASJ,EAAU,GACpBI,GAAU,SAAkBJ,EAAU,MACvCI,OAASvoB,GAGRuoB,IACDD,EAAEvI,SAAWwI,GAAyB,MAAfD,EAAEvI,SAAmB,GAAKuI,EAAEvI,WAGrD,MAAMyI,EAAWF,EAAEvI,SAASjlB,MAAM,GAC5B4nB,EAAO8F,EAAS1sB,MAAM,KAE5B,GAAG4mB,EAAK,IAAqB,MAAfA,EAAK,GAAG,IAAcA,EAAK,GAAG7nB,OAAS,EACnDiZ,EAAU,eACL,GAAG,MAAM9a,KAAKwvB,KAAc,UAA0BA,GAC3D1U,EAAU,gBACL,OAAO4O,EAAK,IACjB,IAAK,WACL,IAAK,cACL,IAAK,WACL,IAAK,YACL,IAAK,UACH,GAAmB,IAAhBA,EAAK7nB,SAAiB0tB,EAAQ,CAC/BzU,EAAU4O,EAAK,GACf,K,CAGJ,QACE,GAAIA,EAAK,IAAMA,EAAK,GAAG3sB,MAAM,uCAA0D,IAAhB2sB,EAAK7nB,OAAc,CACxFiZ,EAAU,KACV,K,QAKGsU,EAAiBljB,EAAInP,MAAM,kDACpC+d,EAAU,MACDuU,EAAUnjB,EAAInP,MAAM,gCAC7B+d,EAAU,MAAQuU,EAAQ,IAU5B,OALKz2B,OAAekiB,KAClBA,OAAU9T,GAGZsT,EAAIQ,QAAUA,EACPR,CACT,CAEA,OAAmB,aAAyB2U,E,uFCqFrC,MAAMQ,UAAkB,IAO7BlnB,cACEC,QAEAC,KAAKinB,KAAO,KACZjnB,KAAKknB,iBAAmB,CAAC,EACzBlnB,KAAKmnB,SAAU,EAEfnnB,KAAKxC,iBAAiB,aAAa,EAAExJ,SACnCgM,KAAKinB,KAAOjzB,EAAGykB,UAAU,IAG3BzY,KAAKxC,iBAAiB,0BAA0B,EAAE4pB,QAAO5gB,gBACvDxG,KAAKmnB,QAAU3gB,EAEX4gB,GACFpnB,KAAKqnB,oBAAoB,iBAAkB7gB,E,IAI/CxG,KAAKxC,iBAAiB,4BAA6B8pB,IACjDtnB,KAAKknB,iBAAiBI,EAAO7zB,MAAQ6zB,CAAM,IAG7CtnB,KAAKS,cAAgB,CAAC7D,KAAM4G,KAC1BzD,MAAMU,cAAc7D,KAAM4G,GAC1B,kBAAiCmZ,WAAW,QAAS,CAAClpB,KAAMmJ,EAAa4G,QAAM,EAG7E,MACFxD,KAAKxC,iBAAiB,oBAAoB,EAAE7L,eAC1CqO,KAAKrO,SAAWA,CAAQ,GAG9B,CAEO41B,sBACL,OAAOvnB,KAAKknB,gBACd,CAEOM,aACL,OAAOxnB,KAAKmnB,OACd,CAEOE,uBAAuB7jB,GAE5BzD,MAAMU,iBAAiB+C,EACzB,EAGF,MAAMoB,EAAY,IAAIoiB,EACtB,eAA2BpiB,EAC3B,S,yDChKA,MAAMiW,EAAuB,IAxCtB,MAAP,cAEU,KAAA4M,gBAAwE,CAAC,CAoCnF,CAlCUC,OACN1nB,KAAKsd,OAAS,IAAI3Z,OAAO,IAAImZ,IAAI,kBACjC9c,KAAKsd,OAAO9f,iBAAiB,WAAYZ,IACvC,MACMod,EADOpd,EAAEoK,KACMgT,QAEf3T,EAAUrG,KAAKynB,gBAAgBzN,EAAQW,UAC1CtU,IACD2T,EAAQY,MAAQvU,EAAQ5H,QAAQub,EAAQY,OAASvU,EAAQ6E,gBAClDlL,KAAKynB,gBAAgBzN,EAAQW,U,GAG1C,CAEQwJ,YAAYnd,GACfhH,KAAK0nB,OACN1nB,KAAK0nB,OACL1nB,KAAK0nB,KAAO,MAGd1nB,KAAKsd,OAAO6G,YAAYnd,EAC1B,CAEO2gB,QAAQhN,EAAkBC,GAC/B,GAAG5a,KAAKynB,gBAAgBvO,eAAeyB,GACrC,OAAO3a,KAAKynB,gBAAgB9M,GAG9B,MAAMiN,GAAiB,SAIvB,OAFA5nB,KAAKmkB,YAAY,CAACxlB,KAAM,cAAeqb,QAAS,CAACW,WAAUC,WAEpD5a,KAAKynB,gBAAgB9M,GAAYiN,CAC1C,GAIF,0BAAsC/M,EACtC,S,GC3DIgN,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBxpB,IAAjBypB,EACH,OAAOA,EAAaC,QAGrB,IAAIC,EAASL,EAAyBE,GAAY,CAGjDE,QAAS,CAAC,GAOX,OAHAE,EAAoBJ,GAAUK,KAAKF,EAAOD,QAASC,EAAQA,EAAOD,QAASH,GAGpEI,EAAOD,OACf,CAGAH,EAAoBO,EAAIF,E7DzBpBx4B,EAAW,GACfm4B,EAAoBQ,EAAI,CAAC7c,EAAQ8c,EAAUC,EAAIC,KAC9C,IAAGF,EAAH,CAMA,IAAIG,EAAeC,IACnB,IAASrvB,EAAI,EAAGA,EAAI3J,EAASyJ,OAAQE,IAAK,CAGzC,IAFA,IAAKivB,EAAUC,EAAIC,GAAY94B,EAAS2J,GACpCsvB,GAAY,EACPC,EAAI,EAAGA,EAAIN,EAASnvB,OAAQyvB,MACpB,EAAXJ,GAAsBC,GAAgBD,IAAa3U,OAAOP,KAAKuU,EAAoBQ,GAAGQ,OAAOxsB,GAASwrB,EAAoBQ,EAAEhsB,GAAKisB,EAASM,MAC9IN,EAASrQ,OAAO2Q,IAAK,IAErBD,GAAY,EACTH,EAAWC,IAAcA,EAAeD,IAG7C,GAAGG,EAAW,CACbj5B,EAASuoB,OAAO5e,IAAK,GACrB,IAAIrB,EAAIuwB,SACEjqB,IAANtG,IAAiBwT,EAASxT,EAC/B,CACD,CACA,OAAOwT,CAnBP,CAJCgd,EAAWA,GAAY,EACvB,IAAI,IAAInvB,EAAI3J,EAASyJ,OAAQE,EAAI,GAAK3J,EAAS2J,EAAI,GAAG,GAAKmvB,EAAUnvB,IAAK3J,EAAS2J,GAAK3J,EAAS2J,EAAI,GACrG3J,EAAS2J,GAAK,CAACivB,EAAUC,EAAIC,EAqBjB,E8DzBdX,EAAoBiB,EAAKb,IACxB,IAAIc,EAASd,GAAUA,EAAOe,WAC7B,IAAOf,EAAiB,QACxB,IAAM,EAEP,OADAJ,EAAoBnvB,EAAEqwB,EAAQ,CAAE5wB,EAAG4wB,IAC5BA,CAAM,E7DNVn5B,EAAWikB,OAAOoV,eAAkBxQ,GAAS5E,OAAOoV,eAAexQ,GAASA,GAASA,EAAa,UAQtGoP,EAAoB9uB,EAAI,SAASwH,EAAO8M,GAEvC,GADU,EAAPA,IAAU9M,EAAQR,KAAKQ,IAChB,EAAP8M,EAAU,OAAO9M,EACpB,GAAoB,iBAAVA,GAAsBA,EAAO,CACtC,GAAW,EAAP8M,GAAa9M,EAAMyoB,WAAY,OAAOzoB,EAC1C,GAAW,GAAP8M,GAAoC,mBAAf9M,EAAMpE,KAAqB,OAAOoE,CAC5D,CACA,IAAI2oB,EAAKrV,OAAOhH,OAAO,MACvBgb,EAAoB7vB,EAAEkxB,GACtB,IAAIC,EAAM,CAAC,EACXx5B,EAAiBA,GAAkB,CAAC,KAAMC,EAAS,CAAC,GAAIA,EAAS,IAAKA,EAASA,IAC/E,IAAI,IAAIw5B,EAAiB,EAAP/b,GAAY9M,EAAyB,iBAAX6oB,KAAyBz5B,EAAekG,QAAQuzB,GAAUA,EAAUx5B,EAASw5B,GACxHvV,OAAOwV,oBAAoBD,GAASnoB,SAAS5E,GAAS8sB,EAAI9sB,GAAO,IAAOkE,EAAMlE,KAI/E,OAFA8sB,EAAa,QAAI,IAAM,EACvBtB,EAAoBnvB,EAAEwwB,EAAIC,GACnBD,CACR,E8DxBArB,EAAoBnvB,EAAI,CAACsvB,EAASsB,KACjC,IAAI,IAAIjtB,KAAOitB,EACXzB,EAAoBtrB,EAAE+sB,EAAYjtB,KAASwrB,EAAoBtrB,EAAEyrB,EAAS3rB,IAC5EwX,OAAO0V,eAAevB,EAAS3rB,EAAK,CAAEmtB,YAAY,EAAMtgB,IAAKogB,EAAWjtB,IAE1E,ECNDwrB,EAAoB4B,EAAI,CAAC,EAGzB5B,EAAoBlrB,EAAK+sB,GACjBnrB,QAAQW,IAAI2U,OAAOP,KAAKuU,EAAoB4B,GAAGE,QAAO,CAAClrB,EAAUpC,KACvEwrB,EAAoB4B,EAAEptB,GAAKqtB,EAASjrB,GAC7BA,IACL,KCNJopB,EAAoBjB,EAAK8C,KAEX,CAAC,IAAM,gBAAgB,IAAM,sBAAsB,IAAM,KAAK,IAAM,kBAAkBA,IAAYA,GAAW,IAAM,CAAC,EAAI,uBAAuB,GAAK,uBAAuB,GAAK,uBAAuB,GAAK,uBAAuB,GAAK,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,wBAAwBA,GAAW,aCFp7B7B,EAAoB+B,SAAYF,IAEf,ECHjB7B,EAAoB5vB,EAAI,WACvB,GAA0B,iBAAf4xB,WAAyB,OAAOA,WAC3C,IACC,OAAO9pB,MAAQ,IAAI+pB,SAAS,cAAb,EAGhB,CAFE,MAAOntB,GACR,GAAsB,iBAAXzM,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxB23B,EAAoBtrB,EAAI,CAACkc,EAAKsR,IAAUlW,OAAO3P,UAAU+U,eAAekP,KAAK1P,EAAKsR,GlEA9El6B,EAAa,CAAC,EACdC,EAAoB,QAExB+3B,EAAoBpvB,EAAI,CAAC+K,EAAKwmB,EAAM3tB,EAAKqtB,KACxC,GAAG75B,EAAW2T,GAAQ3T,EAAW2T,GAAKlK,KAAK0wB,OAA3C,CACA,IAAI9I,EAAQ+I,EACZ,QAAW3rB,IAARjC,EAEF,IADA,IAAI6tB,EAAU90B,SAAS+0B,qBAAqB,UACpC9wB,EAAI,EAAGA,EAAI6wB,EAAQ/wB,OAAQE,IAAK,CACvC,IAAIb,EAAI0xB,EAAQ7wB,GAChB,GAAGb,EAAE4xB,aAAa,QAAU5mB,GAAOhL,EAAE4xB,aAAa,iBAAmBt6B,EAAoBuM,EAAK,CAAE6kB,EAAS1oB,EAAG,KAAO,CACpH,CAEG0oB,IACH+I,GAAa,GACb/I,EAAS9rB,SAASC,cAAc,WAEzBg1B,QAAU,QACjBnJ,EAAO1T,QAAU,IACbqa,EAAoByC,IACvBpJ,EAAOxhB,aAAa,QAASmoB,EAAoByC,IAElDpJ,EAAOxhB,aAAa,eAAgB5P,EAAoBuM,GACxD6kB,EAAOjF,IAAMzY,GAEd3T,EAAW2T,GAAO,CAACwmB,GACnB,IAAIO,EAAmB,CAACC,EAAMrvB,KAE7B+lB,EAAO5V,QAAU4V,EAAOC,OAAS,KACjC5T,aAAaC,GACb,IAAIid,EAAU56B,EAAW2T,GAIzB,UAHO3T,EAAW2T,GAClB0d,EAAOwJ,YAAcxJ,EAAOwJ,WAAWC,YAAYzJ,GACnDuJ,GAAWA,EAAQxpB,SAASsnB,GAAQA,EAAGptB,KACpCqvB,EAAM,OAAOA,EAAKrvB,EAAM,EAExBqS,EAAUnC,WAAWkf,EAAiBK,KAAK,UAAMtsB,EAAW,CAAEI,KAAM,UAAW3B,OAAQmkB,IAAW,MACtGA,EAAO5V,QAAUif,EAAiBK,KAAK,KAAM1J,EAAO5V,SACpD4V,EAAOC,OAASoJ,EAAiBK,KAAK,KAAM1J,EAAOC,QACnD8I,GAAc70B,SAAS8M,KAAKkf,YAAYF,EAnCkB,CAmCX,EmEtChD2G,EAAoB7vB,EAAKgwB,IACH,oBAAX6C,QAA0BA,OAAOC,aAC1CjX,OAAO0V,eAAevB,EAAS6C,OAAOC,YAAa,CAAEvqB,MAAO,WAE7DsT,OAAO0V,eAAevB,EAAS,aAAc,CAAEznB,OAAO,GAAO,E,MCL9D,IAAIwqB,EACAlD,EAAoB5vB,EAAE+yB,gBAAeD,EAAYlD,EAAoB5vB,EAAEwL,SAAW,IACtF,IAAIrO,EAAWyyB,EAAoB5vB,EAAE7C,SACrC,IAAK21B,GAAa31B,IACbA,EAAS61B,gBACZF,EAAY31B,EAAS61B,cAAchP,MAC/B8O,GAAW,CACf,IAAIb,EAAU90B,EAAS+0B,qBAAqB,UACzCD,EAAQ/wB,SAAQ4xB,EAAYb,EAAQA,EAAQ/wB,OAAS,GAAG8iB,IAC5D,CAID,IAAK8O,EAAW,MAAM,IAAIG,MAAM,yDAChCH,EAAYA,EAAUl0B,QAAQ,OAAQ,IAAIA,QAAQ,QAAS,IAAIA,QAAQ,YAAa,KACpFgxB,EAAoBhvB,EAAIkyB,C,KCfxB,MACE,QAAmC,IAAxBlD,EAAqC,CAC9C,IAAIsD,EAAetD,EAAoBjB,EACnCwE,EAAgBvD,EAAoBlrB,EACpC0uB,EAAW,CAAC,EACZC,EAAW,CAAC,EAIhBzD,EAAoBjB,EAAI,SAAU8C,GAEhC,OADayB,EAAazB,IAGvB2B,EAASpS,eAAeyQ,GAAW,IAAM2B,EAAS3B,GAAW,GAElE,EACA7B,EAAoBlrB,EAAI,SAAU+sB,GAEhC,OADa0B,EAAc1B,GACbvqB,OAAM,SAAU+L,GAC5B,IAAIqgB,EAAUD,EAASrS,eAAeyQ,GAClC4B,EAAS5B,GACT,OACJ,GAAI6B,EAAU,EAAG,CACf,IAAIC,EAAUL,EAAazB,GAQ3B,MAPAxe,EAAMC,QACJ,iBACAue,EACA,mCACA8B,EACA,IACFtgB,EAAMJ,QAAU0gB,EACVtgB,CACR,CACA,OAAO,IAAI3M,SAAQ,SAAUC,GAE3B6M,YAAW,WACT,IACIogB,EACK36B,KAAKC,MAGds6B,EAAS3B,GAAW+B,EACpBH,EAAS5B,GAAW6B,EAAU,EAC9B/sB,EAAQqpB,EAAoBlrB,EAAE+sB,GAChC,GArCG,IAsCL,GACF,GACF,CACF,CACD,EAjDD,G,MCAA7B,EAAoB3vB,EAAI9C,SAASs2B,SAAWv7B,KAAKsT,SAASqB,KAK1D,IAAI6mB,EAAkB,CACrB,IAAK,GAGN9D,EAAoB4B,EAAEb,EAAI,CAACc,EAASjrB,KAElC,IAAImtB,EAAqB/D,EAAoBtrB,EAAEovB,EAAiBjC,GAAWiC,EAAgBjC,QAAWprB,EACtG,GAA0B,IAAvBstB,EAGF,GAAGA,EACFntB,EAASnF,KAAKsyB,EAAmB,QAC3B,CAGL,IAAIxlB,EAAU,IAAI7H,SAAQ,CAACC,EAASyM,IAAY2gB,EAAqBD,EAAgBjC,GAAW,CAAClrB,EAASyM,KAC1GxM,EAASnF,KAAKsyB,EAAmB,GAAKxlB,GAGtC,IAAI5C,EAAMqkB,EAAoBhvB,EAAIgvB,EAAoBjB,EAAE8C,GAEpDxe,EAAQ,IAAIggB,MAgBhBrD,EAAoBpvB,EAAE+K,GAfFrI,IACnB,GAAG0sB,EAAoBtrB,EAAEovB,EAAiBjC,KAEf,KAD1BkC,EAAqBD,EAAgBjC,MACRiC,EAAgBjC,QAAWprB,GACrDstB,GAAoB,CACtB,IAAIC,EAAY1wB,IAAyB,SAAfA,EAAMuD,KAAkB,UAAYvD,EAAMuD,MAChE8sB,EAAUrwB,GAASA,EAAM4B,QAAU5B,EAAM4B,OAAOkf,IACpD/Q,EAAMC,QAAU,iBAAmBue,EAAU,cAAgBmC,EAAY,KAAOL,EAAU,IAC1FtgB,EAAM1X,KAAO,iBACb0X,EAAMxM,KAAOmtB,EACb3gB,EAAMJ,QAAU0gB,EAChBI,EAAmB,GAAG1gB,EACvB,CACD,GAEwC,SAAWwe,EAASA,EAE/D,CACD,EAWF7B,EAAoBQ,EAAEO,EAAKc,GAA0C,IAA7BiC,EAAgBjC,GAGxD,IAAIoC,EAAuB,CAACC,EAA4BhlB,KACvD,IAGI+gB,EAAU4B,GAHTpB,EAAU0D,EAAaC,GAAWllB,EAGhB1N,EAAI,EAC3B,GAAGivB,EAAS4D,MAAMn4B,GAAgC,IAAxB43B,EAAgB53B,KAAa,CACtD,IAAI+zB,KAAYkE,EACZnE,EAAoBtrB,EAAEyvB,EAAalE,KACrCD,EAAoBO,EAAEN,GAAYkE,EAAYlE,IAGhD,GAAGmE,EAAS,IAAIzgB,EAASygB,EAAQpE,EAClC,CAEA,IADGkE,GAA4BA,EAA2BhlB,GACrD1N,EAAIivB,EAASnvB,OAAQE,IACzBqwB,EAAUpB,EAASjvB,GAChBwuB,EAAoBtrB,EAAEovB,EAAiBjC,IAAYiC,EAAgBjC,IACrEiC,EAAgBjC,GAAS,KAE1BiC,EAAgBjC,GAAW,EAE5B,OAAO7B,EAAoBQ,EAAE7c,EAAO,EAGjC2gB,EAAqBpsB,KAAuB,iBAAIA,KAAuB,kBAAK,GAChFosB,EAAmBlrB,QAAQ6qB,EAAqBlB,KAAK,KAAM,IAC3DuB,EAAmB7yB,KAAOwyB,EAAqBlB,KAAK,KAAMuB,EAAmB7yB,KAAKsxB,KAAKuB,G,KClFvF,IAAIC,EAAsBvE,EAAoBQ,OAAE/pB,EAAW,CAAC,GAAG,MAAM,IAAOupB,EAAoB,QAChGuE,EAAsBvE,EAAoBQ,EAAE+D,E","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/create fake namespace object","webpack://tweb/webpack/runtime/load script","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/config/state.ts","webpack://tweb/./src/helpers/getTimeFormat.ts","webpack://tweb/./src/environment/appleMx.ts","webpack://tweb/./src/environment/callSupport.ts","webpack://tweb/./src/environment/canUseTransferables.ts","webpack://tweb/./src/environment/canvasFilterSupport.ts","webpack://tweb/./src/environment/emojiSupport.ts","webpack://tweb/./src/environment/geolocationSupport.ts","webpack://tweb/./src/environment/groupCallSupport.ts","webpack://tweb/./src/environment/imageMimeTypesSupport.ts","webpack://tweb/./src/environment/mediaMimeTypesSupport.ts","webpack://tweb/./src/environment/movSupport.ts","webpack://tweb/./src/environment/opusSupport.ts","webpack://tweb/./src/environment/parallaxSupport.ts","webpack://tweb/./src/environment/screenSharingSupport.ts","webpack://tweb/./src/environment/sharedWorkerSupport.ts","webpack://tweb/./src/environment/touchSupport.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/environment/vibrateSupport.ts","webpack://tweb/./src/environment/videoMimeTypesSupport.ts","webpack://tweb/./src/environment/webmSupport.ts","webpack://tweb/./src/environment/webpSupport.ts","webpack://tweb/./src/environment/webrtcSupport.ts","webpack://tweb/./src/helpers/color.ts","webpack://tweb/./src/helpers/compareVersion.ts","webpack://tweb/./src/helpers/dom/blurActiveElement.ts","webpack://tweb/./src/helpers/dom/cancelEvent.ts","webpack://tweb/./src/helpers/dom/findUpClassName.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInput.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInputFocusing.ts","webpack://tweb/./src/helpers/dom/loadFonts.ts","webpack://tweb/./src/helpers/dom/setInnerHTML.ts","webpack://tweb/./src/helpers/idleController.ts","webpack://tweb/./src/helpers/overlayCounter.ts","webpack://tweb/./src/helpers/schedulers.ts","webpack://tweb/./src/helpers/string/parseUriParams.ts","webpack://tweb/./src/helpers/themeController.ts","webpack://tweb/./src/helpers/setWorkerProxy.ts","webpack://tweb/./src/index.ts","webpack://tweb/./src/helpers/dom/toggleAttributePolyfill.ts","webpack://tweb/./src/lib/appManagers/appRuntimeManager.ts","webpack://tweb/./src/lib/appManagers/getProxiedManagers.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/environment/index.ts","webpack://tweb/./src/lib/appManagers/utils/state/loadState.ts","webpack://tweb/./src/lib/mtproto/mtprotoworker.ts","webpack://tweb/./src/lib/mtproto/singleInstance.ts","webpack://tweb/./src/lib/mtproto/telegramMeWebManager.ts","webpack://tweb/./src/helpers/dom/loadScript.ts","webpack://tweb/./src/lib/mtproto/webPushApiManager.ts","webpack://tweb/./src/lib/opusDecodeController.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/lib/richTextProcessor/wrapUrl.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/webp/webpWorkerController.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/make namespace object","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/jsonp chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"tweb:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t};\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AppMediaPlaybackController} from '../components/appMediaPlaybackController';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport getTimeFormat from '../helpers/getTimeFormat';\nimport {nextRandomUint} from '../helpers/random';\nimport {AutoDownloadSettings, NotifyPeer, PeerNotifySettings} from '../layer';\nimport {TopPeerType, MyTopPeer} from '../lib/appManagers/appUsersManager';\nimport DialogsStorage from '../lib/storages/dialogs';\nimport FiltersStorage from '../lib/storages/filters';\nimport {AuthState} from '../types';\nimport App from './app';\n\nconst STATE_VERSION = App.version;\nconst BUILD = App.build;\n\nexport type Background = {\n type?: 'color' | 'image' | 'default', // ! DEPRECATED\n blur: boolean,\n highlightningColor?: string,\n color?: string,\n slug?: string, // image slug\n intensity?: number, // pattern intensity\n id: string | number, // wallpaper id\n};\n\nexport type Theme = {\n name: 'day' | 'night' | 'system',\n background: Background\n};\n\nexport type AutoDownloadPeerTypeSettings = {\n contacts: boolean,\n private: boolean,\n groups: boolean,\n channels: boolean\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n // contactsList: UserId[],\n contactsListCachedTime: number,\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n // filters?: FiltersStorage['filters'], // ! DEPRECATED\n filtersArr?: FiltersStorage['filtersArr'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n recentCustomEmoji: DocId[],\n topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n distanceUnit: 'kilometers' | 'miles',\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts?: boolean, // ! DEPRECATED\n private?: boolean, // ! DEPRECATED\n groups?: boolean, // ! DEPRECATED\n channels?: boolean, // ! DEPRECATED\n photo: AutoDownloadPeerTypeSettings,\n video: AutoDownloadPeerTypeSettings,\n file: AutoDownloadPeerTypeSettings\n },\n autoDownloadNew: AutoDownloadSettings,\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n playbackParams: ReturnType,\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number,\n notifySettings: {[k in Exclude]?: PeerNotifySettings.peerNotifySettings}\n};\n\nconst BACKGROUND_DAY_DESKTOP: Background = {\n blur: false,\n slug: 'pattern',\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n intensity: 50,\n id: '1'\n};\n\nconst BACKGROUND_DAY_MOBILE: Background = {\n blur: false,\n slug: '',\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n intensity: 0,\n id: '1'\n};\n\nconst BACKGROUND_NIGHT_DESKTOP: Background = {\n blur: false,\n slug: 'pattern',\n // color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n color: '#fec496,#dd6cb9,#962fbf,#4f5bd5',\n highlightningColor: 'hsla(299.142857, 44.166666%, 37.470588%, .4)',\n intensity: -50,\n id: '-1'\n};\n\nconst BACKGROUND_NIGHT_MOBILE: Background = {\n blur: false,\n slug: '',\n color: '#0f0f0f',\n highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)',\n intensity: 0,\n id: '-1'\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n // contactsList: [],\n contactsListCachedTime: 0,\n updates: {},\n filtersArr: [],\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n recentCustomEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n distanceUnit: 'kilometers',\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n photo: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n video: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n file: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n }\n },\n autoDownloadNew: {\n _: 'autoDownloadSettings',\n file_size_max: 3145728,\n pFlags: {\n video_preload_large: true,\n audio_preload_next: true\n },\n photo_size_max: 1048576,\n video_size_max: 15728640,\n video_upload_maxbitrate: 100\n },\n autoPlay: {\n gifs: true,\n videos: true\n },\n stickers: {\n suggest: true,\n loop: true\n },\n emoji: {\n suggest: true,\n big: true\n },\n themes: [{\n name: 'day',\n background: IS_MOBILE ? BACKGROUND_DAY_MOBILE : BACKGROUND_DAY_DESKTOP\n }, {\n name: 'night',\n background: IS_MOBILE ? BACKGROUND_NIGHT_MOBILE : BACKGROUND_NIGHT_DESKTOP\n }],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: getTimeFormat()\n },\n playbackParams: {\n volume: 1,\n muted: false,\n playbackRate: 1,\n playbackRates: {\n voice: 1,\n video: 1,\n audio: 1\n },\n loop: false,\n round: false\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32),\n notifySettings: {}\n};\n","export default function getTimeFormat(): 'h12' | 'h23' {\n // try {\n // const resolvedOptions = Intl.DateTimeFormat(navigator.language, {hour: 'numeric'}).resolvedOptions();\n // if('hourCycle' in resolvedOptions) {\n // return (resolvedOptions as any).hourCycle === 'h12' ? 'h12' : 'h23';\n // } else {\n // return resolvedOptions.hour12 ? 'h12' : 'h23';\n // }\n // } catch(err) {\n return new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23';\n // }\n}\n","let IS_APPLE_MX = false;\n\ntry {\n // Awesome detect from https://stackoverflow.com/a/65412357\n const ctx = document.createElement('canvas').getContext('webgl');\n const extension = ctx.getExtension('WEBGL_debug_renderer_info');\n const renderer: string = extension && ctx.getParameter(extension.UNMASKED_RENDERER_WEBGL) || '';\n if((renderer.match(/Apple/) && !renderer.match(/Apple GPU/)) ||\n ctx.getSupportedExtensions().indexOf('WEBGL_compressed_texture_s3tc_srgb') === -1) {\n IS_APPLE_MX = true;\n }\n} catch(err) {\n\n}\n\nexport default IS_APPLE_MX;\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\n\nconst IS_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_CALL_SUPPORTED;\n","import {IS_SAFARI} from './userAgent';\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","const IS_CANVAS_FILTER_SUPPORTED = 'filter' in (document.createElement('canvas').getContext('2d') || {});\n\nexport default IS_CANVAS_FILTER_SUPPORTED;\n","const IS_EMOJI_SUPPORTED = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1/* && false *//* || true */;\n\nexport default IS_EMOJI_SUPPORTED;\n","const IS_GEOLOCATION_SUPPORTED = !!navigator?.geolocation?.getCurrentPosition && false;\n\nexport default IS_GEOLOCATION_SUPPORTED;\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\n\nconst IS_GROUP_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_GROUP_CALL_SUPPORTED;\n","import IS_WEBP_SUPPORTED from './webpSupport';\n\nconst IMAGE_MIME_TYPES_SUPPORTED = new Set([\n 'image/jpeg',\n 'image/png',\n 'image/bmp'\n]);\n\nif(IS_WEBP_SUPPORTED) {\n IMAGE_MIME_TYPES_SUPPORTED.add('image/webp');\n}\n\nexport default IMAGE_MIME_TYPES_SUPPORTED;\n","import IMAGE_MIME_TYPES_SUPPORTED from './imageMimeTypesSupport';\nimport VIDEO_MIME_TYPES_SUPPORTED from './videoMimeTypesSupport';\n\nconst arr = [...IMAGE_MIME_TYPES_SUPPORTED].concat([...VIDEO_MIME_TYPES_SUPPORTED]);\n\nconst MEDIA_MIME_TYPES_SUPPORTED = new Set(arr);\n\nexport default MEDIA_MIME_TYPES_SUPPORTED;\n","import {IS_APPLE_MOBILE, IS_SAFARI} from './userAgent';\n\n// mov is not supported in Chrome on macOS\nconst IS_MOV_SUPPORTED = !!document.createElement('video').canPlayType('video/quicktime') || IS_SAFARI || IS_APPLE_MOBILE;\n\nexport default IS_MOV_SUPPORTED;\n","const audio = document.createElement('audio');\nconst IS_OPUS_SUPPORTED = !!(audio.canPlayType && audio.canPlayType('audio/ogg;').replace(/no/, ''))/* && false */;\n\nexport default IS_OPUS_SUPPORTED;\n","import {IS_FIREFOX} from './userAgent';\n\nconst IS_PARALLAX_SUPPORTED = !IS_FIREFOX && false;\n\nexport default IS_PARALLAX_SUPPORTED;\n","const IS_SCREEN_SHARING_SUPPORTED = !!('getDisplayMedia' in (navigator?.mediaDevices || {}));\n\nexport default IS_SCREEN_SHARING_SUPPORTED;\n","import Modes from '../config/modes';\n\nconst IS_SHARED_WORKER_SUPPORTED = typeof(SharedWorker) !== 'undefined' && !Modes.noSharedWorker/* && false */;\n\nexport default IS_SHARED_WORKER_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// @ts-ignore\nconst IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;\nexport default IS_TOUCH_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\n","const IS_VIBRATE_SUPPORTED = !!navigator?.vibrate;\n\nexport default IS_VIBRATE_SUPPORTED;\n","import IS_MOV_SUPPORTED from './movSupport';\n\nconst VIDEO_MIME_TYPES_SUPPORTED = new Set([\n 'image/gif', // have to display it as video\n 'video/mp4',\n 'video/webm'\n]);\n\nif(IS_MOV_SUPPORTED) {\n VIDEO_MIME_TYPES_SUPPORTED.add('video/quicktime');\n}\n\nexport default VIDEO_MIME_TYPES_SUPPORTED;\n","import {IS_APPLE_MOBILE, IS_SAFARI} from './userAgent';\n\nconst IS_WEBM_SUPPORTED = !!document.createElement('video').canPlayType('video/webm') && !IS_SAFARI && !IS_APPLE_MOBILE;\n\nexport default IS_WEBM_SUPPORTED;\n","const IS_WEBP_SUPPORTED = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');\n\nexport default IS_WEBP_SUPPORTED;\n","import {IS_FIREFOX} from './userAgent';\n\nconst IS_WEBRTC_SUPPORTED = !!(typeof(RTCPeerConnection) !== 'undefined' && !IS_FIREFOX);\n\nexport default IS_WEBRTC_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type ColorHsla = {\n h: number,\n s: number,\n l: number,\n a: number\n};\n\nexport type ColorRgba = [number, number, number, number];\nexport type ColorRgb = [number, number, number];\n\n/**\n * @returns h [0, 360], s [0, 100], l [0, 100], a [0, 1]\n */\nexport function rgbaToHsla(r: number, g: number, b: number, a: number = 1): ColorHsla {\n r /= 255, g /= 255, b /= 255;\n const max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n let h: number, s: number;\n const l = (max + min) / 2;\n\n if(max === min) {\n h = s = 0; // achromatic\n } else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch(max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return {\n h: h * 360,\n s: s * 100,\n l: l * 100,\n a\n };\n}\n\n// * https://stackoverflow.com/a/9493060/6758968\n/**\n * Converts an HSL color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n * Assumes h in [0, 360], s, and l are contained in the set [0, 1], a in [0, 1] and\n * returns r, g, and b in the set [0, 255].\n *\n * @param {number} h The hue\n * @param {number} s The saturation\n * @param {number} l The lightness\n * @return {Array} The RGB representation\n */\nexport function hslaToRgba(h: number, s: number, l: number, a: number): ColorRgba {\n h /= 360, s /= 100, l /= 100;\n let r: number, g: number, b: number;\n\n if(s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = function hue2rgb(p: number, q: number, t: number) {\n if(t < 0) t += 1;\n if(t > 1) t -= 1;\n if(t < 1/6) return p + (q - p) * 6 * t;\n if(t < 1/2) return q;\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n return p;\n }\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1/3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1/3);\n }\n\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255), Math.round(a * 255)];\n}\n\nexport function hslaStringToRgba(hsla: string) {\n const splitted = hsla.slice(5, -1).split(', ');\n const alpha = +splitted.pop();\n const arr = splitted.map((val) => {\n if(val.endsWith('%')) {\n return +val.slice(0, -1);\n }\n\n return +val;\n });\n\n return hslaToRgba(arr[0], arr[1], arr[2], alpha);\n}\n\nexport function hexaToRgba(hexa: string) {\n const arr: ColorRgba = [] as any;\n const offset = hexa[0] === '#' ? 1 : 0;\n if(hexa.length === (5 + offset)) {\n hexa = (offset ? '#' : '') + '0' + hexa.slice(offset);\n }\n\n if(hexa.length === (3 + offset)) {\n for(let i = offset; i < hexa.length; ++i) {\n arr.push(parseInt(hexa[i] + hexa[i], 16));\n }\n } else if(hexa.length === (4 + offset)) {\n for(let i = offset; i < (hexa.length - 1); ++i) {\n arr.push(parseInt(hexa[i] + hexa[i], 16));\n }\n\n arr.push(parseInt(hexa[hexa.length - 1], 16));\n } else {\n for(let i = offset; i < hexa.length; i += 2) {\n arr.push(parseInt(hexa.slice(i, i + 2), 16));\n }\n }\n\n return arr;\n}\n\nexport function hexToRgb(hex: string) {\n return hexaToRgba(hex.slice(0, 7)) as any as ColorRgb;\n}\n\nexport function hexaToHsla(hexa: string) {\n const rgba = hexaToRgba(hexa);\n return rgbaToHsla(rgba[0], rgba[1], rgba[2], rgba[3]);\n}\n\nexport function rgbaToHexa(rgba: ColorRgba | ColorRgb) {\n return '#' + rgba.map((v) => ('0' + v.toString(16)).slice(-2)).join('');\n}\n\nexport function hslaStringToHexa(hsla: string) {\n return rgbaToHexa(hslaStringToRgba(hsla));\n}\n\nexport function hslaStringToHex(hsla: string) {\n return hslaStringToHexa(hsla).slice(0, -2);\n}\n","export default function compareVersion(v1: string, v2: string): number {\n v1 = v1.split(' ', 1)[0];\n v2 = v2.split(' ', 1)[0];\n const s1 = v1.split('.');\n const s2 = v2.split('.');\n\n for(let i = 0; i < s1.length; ++i) {\n const v1 = +s1[i];\n const v2 = +s2[i];\n if(v1 > v2) return 1;\n else if(v1 < v2) return -1;\n }\n\n return 0;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function blurActiveElement() {\n if((document.activeElement as HTMLInputElement)?.blur) {\n (document.activeElement as HTMLInputElement).blur();\n return true;\n }\n\n return false;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport default function cancelEvent(event?: Event) {\n event ||= window.event;\n if(event) {\n if(!event.cancelable) {\n return false;\n }\n\n // @ts-ignore\n event = event.originalEvent || event;\n\n try {\n if(event.stopPropagation) event.stopPropagation();\n if(event.preventDefault) event.preventDefault();\n event.returnValue = false;\n event.cancelBubble = true;\n } catch(err) {}\n }\n\n return false;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// export function findUpClassName(el: any, className: string): T;\nexport default function findUpClassName(el: EventTarget | {closest: (selector: string) => any}, className: string): HTMLElement {\n return (el as any).closest('.' + className);\n /* if(el.classList.contains(className)) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.classList.contains(className))\n return el;\n }\n return null; */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {doubleRaf} from '../schedulers';\n\nexport default function fixSafariStickyInput(input: HTMLElement) {\n input.style.transform = 'translateY(-99999px)';\n /* input.style.position = 'fixed';\n input.style.top = '-99999px';\n input.style.left = '0'; */\n input.focus();\n\n // setTimeout(() => {\n doubleRaf().then(() => {\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\n /* input.style.position = '';\n input.style.top = ''; */\n input.style.transform = '';\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\n\n /* setTimeout(() => {\n fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4);\n }, 50); */\n });\n // }, 0);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\nimport findUpClassName from './findUpClassName';\nimport fixSafariStickyInput from './fixSafariStickyInput';\n\nexport const IS_STICKY_INPUT_BUGGED = IS_SAFARI && IS_MOBILE && IS_TOUCH_SUPPORTED;\n\nif(IS_STICKY_INPUT_BUGGED) {\n const key: 'clientY' | 'pageY' = 'clientY';\n let startY = 0;\n const o = {capture: true, passive: false};\n const onTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0];\n\n // console.log('touchmove y', touch[key], startY);\n\n const scrollable = findUpClassName(touch.target, 'scrollable-y');\n if(scrollable) {\n const y = touch[key];\n const scrolled = startY - y;\n\n /* if(y < startY) {\n startY = y;\n } */\n\n const scrollTop = scrollable.scrollTop;\n const scrollHeight = scrollable.scrollHeight;\n const clientHeight = scrollable.clientHeight;\n const nextScrollTop = scrollTop ? Math.round(scrollTop + scrollable.clientHeight + scrolled) : scrollTop + scrolled;\n // const needCancel = scrollHeight !== clientHeight ? (scrollTop && diff <= 1) || (scrollTop - diff) < 0 : true;\n const needCancel = scrollHeight === clientHeight || nextScrollTop >= scrollHeight || nextScrollTop <= 0;\n if(needCancel) {\n e.preventDefault();\n }\n\n // console.log('touchmove with scrollable', scrollTop, startY, scrolled, nextScrollTop, needCancel, e.cancelable);\n } else {\n e.preventDefault();\n\n // console.log('touchmove no scrollable', e, touch);\n }\n\n // if(e.target === document.documentElement || e.target === document.body) e.preventDefault();\n };\n\n // let el = document.createElement('div');\n // document.body.prepend(el);\n // let a = 0;\n\n // let hasFocus = false;\n let lastFocusOutTimeStamp = 0;\n document.addEventListener('focusin', (e) => {\n if(!(e.target as HTMLElement).classList.contains('is-sticky-input-bugged') || (e.timeStamp - lastFocusOutTimeStamp) < 50/* && document.activeElement === input */) {\n return;\n }\n\n // console.log('focusin', e, e.timeStamp);\n\n // hasFocus = true;\n // document.body.classList.add('is-keyboard-opened');\n\n // el.innerText = 'focusin ' + ++a;\n\n /* a < 2 && */fixSafariStickyInput(e.target as HTMLElement);\n\n document.addEventListener('touchmove', onTouchMove, o);\n document.addEventListener('touchstart', (e) => {\n if(e.touches.length > 1) return;\n const touchStart = e.touches[0];\n\n startY = touchStart[key];\n });\n }, {passive: true});\n\n document.addEventListener('focusout', (e) => {\n // console.log('focusout', e, e.timeStamp);\n document.removeEventListener('touchmove', onTouchMove, o);\n\n lastFocusOutTimeStamp = e.timeStamp;\n\n // el.innerText = 'focusout ' + ++a;\n\n // if(hasFocus) {\n // hasFocus = false;\n // document.body.classList.remove('is-keyboard-opened');\n // }\n }, {passive: true});\n\n document.addEventListener('visibilitychange', () => {\n // console.log('window visibilitychange');\n if(document.activeElement &&\n document.activeElement.classList.contains('is-sticky-input-bugged') &&\n (document.activeElement as HTMLElement).blur) {\n fixSafariStickyInput(document.activeElement as HTMLElement);\n }\n\n /* blurActiveElement();\n window.scrollTo(0, 0);\n setVH(); */\n }, {passive: true});\n}\n\nexport default function fixSafariStickyInputFocusing(input: HTMLElement) {\n if(!IS_STICKY_INPUT_BUGGED) return;\n input.classList.add('is-sticky-input-bugged');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from '../noop';\nimport pause from '../schedulers/pause';\n\nconst texts = ['b', 'б'];\ntype FontType = 'text' | 'icons' | 'monospace';\n\nconst cache: {\n [key: string]: {\n [text: string]: Promise\n }\n} = {};\n\nconst fonts: {[type in FontType]: string} = {\n text: 'Roboto',\n icons: 'tgico',\n monospace: 'Roboto Mono'\n};\n\nexport default function loadFonts(types: {[type in FontType]?: string[] | 'all'} = {\n text: texts,\n icons: undefined,\n monospace: texts\n}): Promise {\n if(!('fonts' in document)) {\n return Promise.resolve();\n }\n\n const promises: Promise[] = [];\n for(const type in types) {\n let _texts = types[type as FontType];\n if(_texts === 'all') {\n _texts = texts;\n }\n\n const font = fonts[type as FontType];\n const weights = type === 'icons' ? [500] : [400, 500];\n for(const weight of weights) {\n const _promises = (_texts || [undefined]).map((text) => {\n const key = [weight, '1rem', font].join(' ');\n const promise = (cache[key] ??= {})[text || ''] ??= document.fonts.load(key, text);\n return promise;\n });\n promises.push(..._promises);\n }\n }\n\n return Promise.race([\n Promise.all(promises).catch(noop),\n pause(1000)\n ]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import I18n from '../../lib/langPack';\n\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment | Element) {\n setDirection(elem);\n if(typeof(html) === 'string') {\n if(!html) elem.replaceChildren();\n else elem.innerHTML = html;\n } else {\n elem.replaceChildren(html);\n }\n}\n\nexport function setDirection(elem: Element) {\n // if(!I18n.isRTL) {\n elem.setAttribute('dir', 'auto');\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport EventListenerBase from './eventListenerBase';\n\nconst FOCUS_EVENT_NAME = IS_TOUCH_SUPPORTED ? 'touchstart' : 'mousemove';\nconst DO_NOT_IDLE = false;\n\nexport class IdleController extends EventListenerBase<{\n change: (idle: boolean) => void\n}> {\n private _isIdle: boolean;\n\n private focusPromise: Promise;\n private focusResolve: () => void;\n\n constructor() {\n super();\n\n this._isIdle = true;\n this.focusPromise = Promise.resolve();\n this.focusResolve = () => {};\n\n window.addEventListener('blur', () => {\n this.isIdle = true;\n\n window.addEventListener('focus', () => {\n this.isIdle = false;\n }, {once: true});\n });\n\n // * Prevent setting online after reloading page\n window.addEventListener(FOCUS_EVENT_NAME, () => {\n this.isIdle = false;\n }, {once: true, passive: true});\n\n this.addEventListener('change', (idle) => {\n if(idle) {\n this.focusPromise = new Promise((resolve) => {\n this.focusResolve = resolve;\n });\n } else {\n this.focusResolve();\n }\n });\n }\n\n public getFocusPromise() {\n return this.focusPromise;\n }\n\n public get isIdle() {\n return this._isIdle;\n }\n\n public set isIdle(value: boolean) {\n if(this._isIdle === value) {\n return;\n }\n\n if(DO_NOT_IDLE && value) {\n return;\n }\n\n this._isIdle = value;\n this.dispatchEvent('change', value);\n }\n}\n\nconst idleController = new IdleController();\nexport default idleController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase from './eventListenerBase';\n\nexport class OverlayCounter extends EventListenerBase<{\n change: (isActive: boolean) => void\n}> {\n public overlaysActive = 0;\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('change', this.isOverlayActive);\n }\n}\n\nconst overlayCounter = new OverlayCounter();\nexport default overlayCounter;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's schedulers\nimport {NoneToVoidFunction} from '../types';\n\n/*\nexport function throttleWithTickEnd(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function onTickEnd(cb: NoneToVoidFunction) {\n Promise.resolve().then(cb);\n}\n\nfunction runNow(fn: NoneToVoidFunction) {\n fn();\n} */\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nexport function fastRaf(callback: NoneToVoidFunction) {\n if(!fastRafCallbacks) {\n fastRafCallbacks = [callback];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n fastRafCallbacks = undefined;\n currentCallbacks.forEach((cb) => cb());\n });\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nlet fastRafConventionalCallbacks: NoneToVoidFunction[] | undefined, processing = false;\nexport function fastRafConventional(callback: NoneToVoidFunction) {\n if(!fastRafConventionalCallbacks) {\n fastRafConventionalCallbacks = [callback];\n\n requestAnimationFrame(() => {\n processing = true;\n for(let i = 0; i < fastRafConventionalCallbacks.length; ++i) {\n fastRafConventionalCallbacks[i]();\n }\n\n fastRafConventionalCallbacks = undefined;\n processing = false;\n });\n } else if(processing) {\n callback();\n } else {\n fastRafConventionalCallbacks.push(callback);\n }\n}\n\nlet rafPromise: Promise;\nexport function fastRafPromise() {\n if(rafPromise) return rafPromise;\n\n rafPromise = new Promise((resolve) => fastRaf(() => resolve()));\n rafPromise.then(() => {\n rafPromise = undefined;\n });\n\n return rafPromise;\n}\n\nexport function doubleRaf() {\n return new Promise((resolve) => {\n fastRaf(() => {\n fastRaf(resolve);\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function parseUriParams(uri: string, splitted = uri.split('?')) {\n const params: any = {};\n if(!splitted[1]) return params;\n splitted[1].split('&').forEach((item) => {\n params[item.split('=')[0]] = decodeURIComponent(item.split('=')[1]);\n });\n\n return params;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Theme} from '../config/state';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport rootScope from '../lib/rootScope';\nimport {hslaStringToHex} from './color';\n\nexport class ThemeController {\n private themeColor: string;\n private _themeColorElem: Element;\n private systemTheme: Theme['name'];\n\n constructor() {\n rootScope.addEventListener('theme_change', () => {\n this.setTheme();\n });\n\n // rootScope.addEventListener('settings_updated', ())\n }\n\n private get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n // const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n // const newTheme = this.getTheme();\n\n if(rootScope.myId) {\n rootScope.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public applyHighlightningColor() {\n let hsla: string;\n const theme = themeController.getTheme();\n if(theme.background.highlightningColor) {\n hsla = theme.background.highlightningColor;\n document.documentElement.style.setProperty('--message-highlightning-color', hsla);\n } else {\n document.documentElement.style.removeProperty('--message-highlightning-color');\n }\n\n if(!IS_TOUCH_SUPPORTED && hsla) {\n themeController.themeColor = hslaStringToHex(hsla);\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n\n this.applyHighlightningColor();\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: Theme['name'] = rootScope.settings.theme === 'system' ? this.systemTheme : rootScope.settings.theme) {\n return rootScope.settings.themes.find((t) => t.name === name);\n }\n}\n\nconst themeController = new ThemeController();\nexport default themeController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function setWorkerProxy() {\n // * hook worker constructor to set search parameters (test, debug, etc)\n const workerHandler = {\n construct(target: any, args: any) {\n let url = args[0] + '';\n if(url.indexOf('blob:') !== 0) {\n url += location.search;\n }\n\n return new target(url);\n }\n };\n\n [\n Worker,\n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].filter(Boolean).forEach((w) => {\n window[w.name as any] = new Proxy(w, workerHandler);\n });\n}\n\nsetWorkerProxy();\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from './config/app';\nimport blurActiveElement from './helpers/dom/blurActiveElement';\nimport cancelEvent from './helpers/dom/cancelEvent';\nimport {IS_STICKY_INPUT_BUGGED} from './helpers/dom/fixSafariStickyInputFocusing';\nimport loadFonts from './helpers/dom/loadFonts';\nimport IS_EMOJI_SUPPORTED from './environment/emojiSupport';\nimport {IS_ANDROID, IS_APPLE, IS_APPLE_MOBILE, IS_FIREFOX, IS_MOBILE, IS_MOBILE_SAFARI, IS_SAFARI} from './environment/userAgent';\nimport './materialize.scss';\nimport './scss/style.scss';\nimport pause from './helpers/schedulers/pause';\nimport setWorkerProxy from './helpers/setWorkerProxy';\nimport toggleAttributePolyfill from './helpers/dom/toggleAttributePolyfill';\nimport rootScope from './lib/rootScope';\nimport IS_TOUCH_SUPPORTED from './environment/touchSupport';\nimport I18n from './lib/langPack';\nimport './helpers/peerIdPolyfill';\nimport './lib/polyfill';\nimport apiManagerProxy from './lib/mtproto/mtprotoworker';\nimport getProxiedManagers from './lib/appManagers/getProxiedManagers';\nimport themeController from './helpers/themeController';\nimport overlayCounter from './helpers/overlayCounter';\nimport singleInstance from './lib/mtproto/singleInstance';\nimport parseUriParams from './helpers/string/parseUriParams';\nimport Modes from './config/modes';\nimport {AuthState} from './types';\nimport {IS_BETA} from './config/debug';\n// import appNavigationController from './components/appNavigationController';\n\ndocument.addEventListener('DOMContentLoaded', async() => {\n toggleAttributePolyfill();\n\n // polyfill for replaceChildren\n if((Node as any).prototype.replaceChildren === undefined) {\n (Node as any).prototype.replaceChildren = function(...nodes: any[]) {\n this.textContent = '';\n // while(this.lastChild) {\n // this.removeChild(this.lastChild);\n // }\n if(nodes) {\n this.append(...nodes);\n }\n }\n }\n\n rootScope.managers = getProxiedManagers();\n\n const manifest = document.getElementById('manifest') as HTMLLinkElement;\n manifest.href = `site${IS_APPLE && !IS_APPLE_MOBILE ? '_apple' : ''}.webmanifest?v=jw3mK7G9Aq`;\n\n singleInstance.start();\n\n // We listen to the resize event (https://css-tricks.com/the-trick-to-viewport-units-on-mobile/)\n const w = window.visualViewport || window; // * handle iOS keyboard\n let setViewportVH = false/* , hasFocus = false */;\n let lastVH: number;\n const setVH = () => {\n const vh = (setViewportVH && !overlayCounter.isOverlayActive ? (w as VisualViewport).height || (w as Window).innerHeight : window.innerHeight) * 0.01;\n if(lastVH === vh) {\n return;\n } else if(IS_TOUCH_SUPPORTED && lastVH < vh && (vh - lastVH) > 1) {\n blurActiveElement(); // (Android) fix blurring inputs when keyboard is being closed (e.g. closing keyboard by back arrow and touching a bubble)\n }\n\n lastVH = vh;\n\n // const vh = document.documentElement.scrollHeight * 0.01;\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n // console.log('setVH', vh, setViewportVH ? w : window);\n\n /* if(setViewportVH && userAgent.isSafari && touchSupport.isTouchSupported && document.activeElement && (document.activeElement as HTMLElement).blur) {\n const rect = document.activeElement.getBoundingClientRect();\n if(rect.top < 0 || rect.bottom >= (w as any).height) {\n fastSmoothScroll(findUpClassName(document.activeElement, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'center', 4, undefined, FocusDirection.Static);\n }\n } */\n };\n\n setWorkerProxy;\n\n // const [_, touchSupport, userAgent, _rootScope, _appStateManager, _I18n, __/* , ___ */] = await Promise.all([\n // import('./lib/polyfill'),\n // import('./environment/touchSupport'),\n // import('./environment/userAgent'),\n // import('./lib/rootScope'),\n // import('./lib/appManagers/appStateManager'),\n // import('./lib/langPack'),\n // import('./helpers/peerIdPolyfill'),\n // // import('./helpers/cacheFunctionPolyfill')\n // ]);\n\n /* const {IS_TOUCH_SUPPORTED} = touchSupport;\n const {IS_FIREFOX, IS_MOBILE, IS_APPLE, IS_SAFARI, IS_APPLE_MOBILE, IS_ANDROID} = userAgent;\n const rootScope = _rootScope.default;\n const appStateManager = _appStateManager.default;\n const I18n = _I18n.default; */\n\n window.addEventListener('resize', setVH);\n setVH();\n\n if(IS_STICKY_INPUT_BUGGED) {\n const toggleResizeMode = () => {\n setViewportVH = tabId === 1 && IS_STICKY_INPUT_BUGGED && !overlayCounter.isOverlayActive;\n setVH();\n\n if(w !== window) {\n if(setViewportVH) {\n window.removeEventListener('resize', setVH);\n w.addEventListener('resize', setVH);\n } else {\n w.removeEventListener('resize', setVH);\n window.addEventListener('resize', setVH);\n }\n }\n };\n\n let tabId: number;\n (window as any).onImTabChange = (id: number) => {\n const wasTabId = tabId !== undefined;\n tabId = id;\n\n if(wasTabId || tabId === 1) {\n toggleResizeMode();\n }\n };\n\n overlayCounter.addEventListener('change', () => {\n toggleResizeMode();\n });\n }\n\n if(IS_FIREFOX && !IS_EMOJI_SUPPORTED) {\n document.addEventListener('dragstart', (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'IMG' && target.classList.contains('emoji')) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n if(IS_EMOJI_SUPPORTED) {\n document.documentElement.classList.add('native-emoji');\n }\n\n // prevent firefox image dragging\n document.addEventListener('dragstart', (e) => {\n if((e.target as HTMLElement)?.tagName === 'IMG') {\n e.preventDefault();\n return false;\n }\n });\n\n // restrict contextmenu on images (e.g. webp stickers)\n document.addEventListener('contextmenu', (e) => {\n if((e.target as HTMLElement).tagName === 'IMG' && !(window as any).appMediaViewer) {\n cancelEvent(e);\n }\n });\n\n if(IS_FIREFOX) {\n document.documentElement.classList.add('is-firefox', 'no-backdrop');\n }\n\n if(IS_MOBILE) {\n document.documentElement.classList.add('is-mobile');\n }\n\n if(IS_APPLE) {\n if(IS_SAFARI) {\n document.documentElement.classList.add('is-safari');\n }\n\n // document.documentElement.classList.add('emoji-supported');\n\n if(IS_APPLE_MOBILE) {\n document.documentElement.classList.add('is-ios');\n } else {\n document.documentElement.classList.add('is-mac');\n }\n } else if(IS_ANDROID) {\n document.documentElement.classList.add('is-android');\n\n /* document.addEventListener('focusin', (e) => {\n hasFocus = true;\n focusTime = Date.now();\n }, {passive: true});\n\n document.addEventListener('focusout', () => {\n hasFocus = false;\n }, {passive: true}); */\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n document.documentElement.classList.add('no-touch');\n } else {\n document.documentElement.classList.add('is-touch');\n /* document.addEventListener('touchmove', (event: any) => {\n event = event.originalEvent || event;\n if(event.scale && event.scale !== 1) {\n event.preventDefault();\n }\n }, {capture: true, passive: false}); */\n }\n\n const perf = performance.now();\n\n // await pause(1000000);\n\n const langPromise = I18n.getCacheLangPack();\n\n const [stateResult, langPack] = await Promise.all([\n // loadState(),\n apiManagerProxy.sendState().then(([stateResult]) => stateResult),\n langPromise\n ]);\n I18n.setTimeFormat(stateResult.state.settings.timeFormat);\n\n rootScope.managers.rootScope.getPremium().then((isPremium) => {\n rootScope.premium = isPremium;\n });\n\n themeController.setThemeListener();\n\n if(langPack.appVersion !== App.langPackVersion) {\n I18n.getLangPack(langPack.lang_code);\n }\n\n /**\n * won't fire if font is loaded too fast\n */\n function fadeInWhenFontsReady(elem: HTMLElement, promise: Promise) {\n elem.style.opacity = '0';\n\n promise.then(() => {\n window.requestAnimationFrame(() => {\n elem.style.opacity = '';\n });\n });\n }\n\n console.log('got state, time:', performance.now() - perf);\n\n if(langPack.lang_code === 'ar' && IS_BETA && false) {\n document.body.classList.add('is-rtl');\n document.documentElement.dir = 'rtl';\n document.documentElement.lang = langPack.lang_code;\n I18n.setRTL(true);\n } else {\n document.documentElement.dir = 'ltr';\n }\n\n let authState = stateResult.state.authState;\n\n const hash = location.hash;\n const splitted = hash.split('?');\n const params = parseUriParams(hash, splitted);\n if(params.tgWebAuthToken && authState._ !== 'authStateSignedIn') {\n const data: AuthState.signImport['data'] = {\n token: params.tgWebAuthToken,\n dcId: +params.tgWebAuthDcId,\n userId: params.tgWebAuthUserId.toUserId(),\n isTest: params.tgWebAuthTest !== undefined && !!+params.tgWebAuthTest,\n tgAddr: params.tgaddr\n };\n\n if(data.isTest !== Modes.test) {\n const urlSearchParams = new URLSearchParams(location.search);\n if(+params.tgWebAuthTest) {\n urlSearchParams.set('test', '1');\n } else {\n urlSearchParams.delete('test');\n }\n\n location.search = urlSearchParams.toString();\n return;\n }\n\n rootScope.managers.appStateManager.pushToState('authState', authState = {_: 'authStateSignImport', data});\n\n // appNavigationController.overrideHash('?tgaddr=' + encodeURIComponent(params.tgaddr));\n }\n\n if(authState._ !== 'authStateSignedIn'/* || 1 === 1 */) {\n console.log('Will mount auth page:', authState._, Date.now() / 1000);\n\n const el = document.getElementById('auth-pages');\n let scrollable: HTMLElement;\n if(el) {\n scrollable = el.querySelector('.scrollable') as HTMLElement;\n if((!IS_TOUCH_SUPPORTED || IS_MOBILE_SAFARI)) {\n scrollable.classList.add('no-scrollbar');\n }\n\n // * don't remove this line\n scrollable.style.opacity = '0';\n\n const placeholder = document.createElement('div');\n placeholder.classList.add('auth-placeholder');\n\n scrollable.prepend(placeholder);\n scrollable.append(placeholder.cloneNode());\n }\n\n try {\n await Promise.all([\n import('./lib/mtproto/telegramMeWebManager'),\n import('./lib/mtproto/webPushApiManager')\n ]).then(([meModule, pushModule]) => {\n meModule.default.setAuthorized(false);\n pushModule.default.forceUnsubscribe();\n });\n } catch(err) {\n\n }\n\n let pagePromise: Promise;\n // langPromise.then(async() => {\n switch(authState._) {\n case 'authStateSignIn':\n pagePromise = (await import('./pages/pageSignIn')).default.mount();\n break;\n case 'authStateSignQr':\n pagePromise = (await import('./pages/pageSignQR')).default.mount();\n break;\n case 'authStateAuthCode':\n pagePromise = (await import('./pages/pageAuthCode')).default.mount(authState.sentCode);\n break;\n case 'authStatePassword':\n pagePromise = (await import('./pages/pagePassword')).default.mount();\n break;\n case 'authStateSignUp':\n pagePromise = (await import('./pages/pageSignUp')).default.mount(authState.authCode);\n break;\n case 'authStateSignImport':\n pagePromise = (await import('./pages/pageSignImport')).default.mount(authState.data);\n break;\n }\n // });\n\n if(scrollable) {\n // wait for text appear\n if(pagePromise) {\n await pagePromise;\n }\n\n const promise = 'fonts' in document ?\n Promise.race([\n pause(1000),\n document.fonts.ready\n ]) :\n Promise.resolve();\n fadeInWhenFontsReady(scrollable, promise);\n }\n\n /* setTimeout(async() => {\n (await import('./pages/pageAuthCode')).default.mount({\n \"_\": \"auth.sentCode\",\n \"pFlags\": {},\n \"flags\": 6,\n \"type\": {\n \"_\": \"auth.sentCodeTypeSms\",\n \"length\": 5\n },\n \"phone_code_hash\": \"\",\n \"next_type\": {\n \"_\": \"auth.codeTypeCall\"\n },\n \"timeout\": 120,\n \"phone_number\": \"\"\n });\n\n (await import('./pages/pageSignQR')).default.mount();\n\n (await import('./pages/pagePassword')).default.mount();\n\n (await import('./pages/pageSignUp')).default.mount({\n \"phone_code_hash\": \"\",\n \"phone_number\": \"\"\n });\n }, 500); */\n } else {\n console.log('Will mount IM page:', Date.now() / 1000);\n fadeInWhenFontsReady(document.getElementById('main-columns'), loadFonts());\n (await import('./pages/pageIm')).default.mount();\n }\n});\n","export default function toggleAttributePolyfill() {\n if(!Element.prototype.toggleAttribute) {\n Element.prototype.toggleAttribute = function(name, force) {\n if(force !== void 0) force = !!force;\n\n if(this.hasAttribute(name)) {\n if(force) return true;\n\n this.removeAttribute(name);\n return false;\n }\n if(force === false) return false;\n\n this.setAttribute(name, '');\n return true;\n };\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport class AppRuntimeManager {\n public reload() {\n try {\n location.reload();\n } catch(e) {};\n\n // if(window.chrome && chrome.runtime && chrome.runtime.reload) {\n // chrome.runtime.reload();\n // }\n }\n\n public close() {\n try {\n window.close();\n } catch(e) {}\n }\n\n /**\n * Better to call from event\n */\n public focus() {\n // // @ts-ignore\n // if(window.navigator.mozApps && document.hidden) {\n // // Get app instance and launch it to bring app to foreground\n // // @ts-ignore\n // window.navigator.mozApps.getSelf().onsuccess = function() {\n // this.result.launch();\n // };\n // } else {\n // // @ts-ignore\n // if(window.chrome && chrome.app && chrome.app.window) {\n // // @ts-ignore\n // chrome.app.window.current().focus();\n // }\n\n window.focus();\n // }\n }\n}\n\nconst appRuntimeManager = new AppRuntimeManager();\nexport default appRuntimeManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type createManagers from './createManagers';\nimport {ModifyFunctionsToAsync} from '../../types';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport noop from '../../helpers/noop';\nimport dT from '../../helpers/dT';\nimport DEBUG from '../../config/debug';\n\n// let stats: {\n// [manager: string]: {\n// [method: string]: {\n// times: number[],\n// byArgs: {\n// [args: string]: number[]\n// }\n// }\n// }\n// } = {};\n\n// let sentCount = 0;\n// let sentMethods: {[key: string]: number} = {};\n// let sentMethods2: {[key: string]: number} = {};\n// function collectStats(manager: string, method: string, args: any[], promise: Promise) {\n// ++sentCount;\n\n// const key = [manager, method].join('-');\n// if(!sentMethods[key]) sentMethods[key] = 0;\n// ++sentMethods[key];\n\n// const key2 = [('00000' + sentCount).slice(-5), key].join('-');\n\n// let byManager = stats[manager] ??= {};\n// let byMethod = byManager[method] ??= {times: [], byArgs: {}};\n\n// const perf = performance.now();\n// promise.catch(noop).finally(() => {\n// const time = performance.now() - perf;\n// byMethod.times.push(time);\n\n// sentMethods2[key2] = time;\n\n// try {\n// const argsString = JSON.stringify(args);\n// byMethod.byArgs[argsString].push(time);\n// } catch(err) {}\n// });\n// }\n\n// setInterval(() => {\n// // console.log(dT(), '[PROXY] stats', stats, sentCount, sentMethods, sentMethods2);\n// sentCount = 0;\n// sentMethods = {};\n// sentMethods2 = {};\n// }, 2000);\n\nconst DEBUG_MANAGER_REQUESTS: {[managerName: string]: Set} = {};\nif(DEBUG) {\n (window as any).DEBUG_MANAGER_REQUESTS = DEBUG_MANAGER_REQUESTS;\n}\n\nfunction createProxy(/* source: T, */name: string, ack?: boolean) {\n const proxy = new Proxy({}, {\n get: (target, p, receiver) => {\n // console.log('get', target, p, receiver);\n // @ts-ignore\n // const value = source[p];\n // if(typeof(value) !== 'function') {\n // return value;\n // }\n\n return (...args: any[]) => {\n const promise = apiManagerProxy.invoke('manager', {\n name,\n method: p as string,\n args\n }, ack as any);\n\n if(DEBUG) {\n if(DEBUG_MANAGER_REQUESTS[name]?.has(p as any)) {\n console.warn('manager request', name, p, args);\n }\n }\n\n // collectStats(name, p as string, args, promise);\n\n return promise;\n\n // @ts-ignore\n // return Promise.resolve(value.call(source, ...args));\n };\n }\n });\n\n return proxy;\n}\n\ntype AA = {\n [key in keyof T]: T[key] extends (...args: infer A) => infer R ? (...args: A) => Promise>> : never\n};\n\ntype T = Awaited>;\ntype ProxiedManagers = {\n [name in keyof T]?: ModifyFunctionsToAsync;\n} & {\n acknowledged?: {\n [name in keyof T]?: AA;\n }\n};\n\nfunction createProxyProxy(proxied: any, ack?: boolean) {\n return new Proxy(proxied, {\n get: (target, p, receiver) => {\n // @ts-ignore\n return target[p] ??= createProxy(p as string, ack);\n }\n });\n}\n\nlet proxied: ProxiedManagers;\nexport default function getProxiedManagers() {\n if(proxied) {\n return proxied;\n }\n\n proxied = createProxyProxy({}, false);\n proxied.acknowledged = createProxyProxy({}, true);\n return proxied;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type lang from '../lang';\nimport type langSign from '../langSign';\nimport type {State} from '../config/state';\nimport DEBUG, {MOUNT_CLASS_TO} from '../config/debug';\nimport {HelpCountriesList, HelpCountry, LangPackDifference, LangPackString} from '../layer';\nimport stateStorage from './stateStorage';\nimport App from '../config/app';\nimport rootScope from './rootScope';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport deepEqual from '../helpers/object/deepEqual';\nimport safeAssign from '../helpers/object/safeAssign';\nimport capitalizeFirstLetter from '../helpers/string/capitalizeFirstLetter';\nimport matchUrlProtocol from './richTextProcessor/matchUrlProtocol';\nimport wrapUrl from './richTextProcessor/wrapUrl';\nimport {setDirection} from '../helpers/dom/setInnerHTML';\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n 'messageActionChatCreate': 'ActionCreateGroup',\n 'messageActionChatCreateYou': 'ActionYouCreateGroup',\n 'messageActionChatEditTitle': 'ActionChangedTitle',\n 'messageActionChatEditPhoto': 'ActionChangedPhoto',\n 'messageActionChatEditVideo': 'ActionChangedVideo',\n 'messageActionChatDeletePhoto': 'ActionRemovedPhoto',\n 'messageActionChatReturn': 'ActionAddUserSelf',\n 'messageActionChatReturnYou': 'ActionAddUserSelfYou',\n 'messageActionChatJoined': 'ActionAddUserSelfMega',\n 'messageActionChatJoinedYou': 'ChannelMegaJoined',\n 'messageActionChatAddUser': 'ActionAddUser',\n 'messageActionChatAddUsers': 'ActionAddUser',\n 'messageActionChatLeave': 'ActionLeftUser',\n 'messageActionChatLeaveYou': 'YouLeft',\n 'messageActionChatDeleteUser': 'ActionKickUser',\n 'messageActionChatJoinedByLink': 'ActionInviteUser',\n 'messageActionPinMessage': 'Chat.Service.Group.UpdatedPinnedMessage',\n 'messageActionContactSignUp': 'Chat.Service.PeerJoinedTelegram',\n 'messageActionChannelCreate': 'ActionCreateChannel',\n 'messageActionChannelEditTitle': 'Chat.Service.Channel.UpdatedTitle',\n 'messageActionChannelEditPhoto': 'Chat.Service.Channel.UpdatedPhoto',\n 'messageActionChannelEditVideo': 'Chat.Service.Channel.UpdatedVideo',\n 'messageActionChannelDeletePhoto': 'Chat.Service.Channel.RemovedPhoto',\n 'messageActionHistoryClear': 'HistoryCleared',\n 'messageActionDiscussionStarted': 'DiscussionStarted',\n\n 'messageActionChannelMigrateFrom': 'ActionMigrateFromGroup',\n\n 'messageActionPhoneCall.video_in_ok': 'ChatList.Service.VideoCall.incoming',\n 'messageActionPhoneCall.video_out_ok': 'ChatList.Service.VideoCall.outgoing',\n 'messageActionPhoneCall.video_missed': 'ChatList.Service.VideoCall.Missed',\n 'messageActionPhoneCall.video_cancelled': 'ChatList.Service.VideoCall.Cancelled',\n 'messageActionPhoneCall.in_ok': 'ChatList.Service.Call.incoming',\n 'messageActionPhoneCall.out_ok': 'ChatList.Service.Call.outgoing',\n 'messageActionPhoneCall.missed': 'ChatList.Service.Call.Missed',\n 'messageActionPhoneCall.cancelled': 'ChatList.Service.Call.Cancelled',\n\n 'messageActionGroupCall.started': 'Chat.Service.VoiceChatStarted.Channel',\n 'messageActionGroupCall.started_by': 'Chat.Service.VoiceChatStarted',\n 'messageActionGroupCall.started_byYou': 'Chat.Service.VoiceChatStartedYou',\n 'messageActionGroupCall.ended': 'Chat.Service.VoiceChatFinished.Channel',\n 'messageActionGroupCall.ended_by': 'Chat.Service.VoiceChatFinished',\n 'messageActionGroupCall.ended_byYou': 'Chat.Service.VoiceChatFinishedYou',\n\n 'messageActionBotAllowed': 'Chat.Service.BotPermissionAllowed'\n};\n\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\n\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\nexport type FormatterArguments = FormatterArgument[];\n\nexport const UNSUPPORTED_LANG_PACK_KEY: LangPackKey = IS_MOBILE ? 'Message.Unsupported.Mobile' : 'Message.Unsupported.Desktop';\n\nnamespace I18n {\n export const strings: Map = new Map();\n export const countriesList: HelpCountry[] = [];\n let pluralRules: Intl.PluralRules;\n\n let cacheLangPackPromise: Promise;\n export let lastRequestedLangCode: string;\n export let lastRequestedNormalizedLangCode: string;\n export let lastAppliedLangCode: string;\n export let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n export let isRTL = false;\n\n export function setRTL(rtl: boolean) {\n isRTL = rtl;\n }\n\n function setLangCode(langCode: string) {\n lastRequestedLangCode = langCode;\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\n }\n\n export function getCacheLangPack(): Promise {\n if(cacheLangPackPromise) return cacheLangPackPromise;\n return cacheLangPackPromise = Promise.all([\n stateStorage.get('langPack') as Promise,\n polyfillPromise\n ]).then(([langPack]) => {\n if(!langPack/* || true */) {\n return loadLocalLangPack();\n } else if(DEBUG && false) {\n return getLangPack(langPack.lang_code);\n }/* else if(langPack.appVersion !== App.langPackVersion) {\n return getLangPack(langPack.lang_code);\n } */\n\n if(!lastRequestedLangCode) {\n setLangCode(langPack.lang_code);\n }\n\n applyLangPack(langPack);\n return langPack;\n }).finally(() => {\n cacheLangPackPromise = undefined;\n });\n }\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(' ')[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(' ')[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n export function loadLocalLangPack() {\n const defaultCode = App.langPackCode;\n setLangCode(defaultCode);\n return Promise.all([\n import('../lang'),\n import('../langSign'),\n import('../countries')\n ]).then(([lang, langSign, countries]) => {\n const strings: LangPackString[] = [];\n formatLocalStrings(lang.default, strings);\n formatLocalStrings(langSign.default, strings);\n\n const langPack: LangPackDifference = {\n _: 'langPackDifference',\n from_version: 0,\n lang_code: defaultCode,\n strings,\n version: 0,\n local: true,\n countries: countries.default\n };\n return saveLangPack(langPack);\n });\n }\n\n export function loadLangPack(langCode: string, web?: boolean) {\n web = true;\n requestedServerLanguage = true;\n const managers = rootScope.managers;\n return Promise.all([\n managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: web ? 'web' : App.langPack\n }),\n !web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: 'android'\n }),\n import('../lang'),\n import('../langSign'),\n managers.apiManager.invokeApiCacheable('help.getCountriesList', {\n lang_code: langCode,\n hash: 0\n }) as Promise,\n polyfillPromise\n ]);\n }\n\n export function getStrings(langCode: string, strings: string[]) {\n return rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n lang_pack: App.langPack,\n lang_code: langCode,\n keys: strings\n });\n }\n\n export function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n for(const i in strings) {\n // @ts-ignore\n const v = strings[i];\n if(typeof(v) === 'string') {\n pushTo.push({\n _: 'langPackString',\n key: i,\n value: v\n });\n } else {\n pushTo.push({\n _: 'langPackStringPluralized',\n key: i,\n ...v\n });\n }\n }\n\n return pushTo;\n }\n\n export function getLangPack(langCode: string, web?: boolean) {\n setLangCode(langCode);\n return loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n let strings: LangPackString[] = [];\n\n [localLangPack1, localLangPack2].forEach((l) => {\n formatLocalStrings(l.default as any, strings);\n });\n\n strings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\n\n langPack1.strings = strings;\n langPack1.countries = countries;\n return saveLangPack(langPack1);\n });\n }\n\n export function saveLangPack(langPack: LangPackDifference) {\n langPack.appVersion = App.langPackVersion;\n\n return stateStorage.set({langPack}).then(() => {\n applyLangPack(langPack);\n return langPack;\n });\n }\n\n export const polyfillPromise = (function checkIfPolyfillNeeded() {\n if(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n return Promise.resolve();\n } else {\n return import('./pluralPolyfill').then((_Intl) => {\n (window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n });\n }\n })();\n\n export function applyLangPack(langPack: LangPackDifference) {\n const currentLangCode = lastRequestedLangCode;\n if(langPack.lang_code !== currentLangCode) {\n return;\n }\n\n try {\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\n }\n\n try {\n pluralRules = new Intl.PluralRules(langPack.lang_code);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n }\n\n strings.clear();\n\n for(const string of langPack.strings) {\n strings.set(string.key as LangPackKey, string);\n }\n\n if(langPack.countries) {\n countriesList.length = 0;\n countriesList.push(...langPack.countries.countries);\n\n langPack.countries.countries.forEach((country) => {\n if(country.name) {\n const langPackKey: any = country.default_name;\n strings.set(langPackKey, {\n _: 'langPackString',\n key: langPackKey,\n value: country.name\n });\n }\n });\n }\n\n if(lastAppliedLangCode !== currentLangCode) {\n rootScope.dispatchEvent('language_change', currentLangCode);\n lastAppliedLangCode = currentLangCode;\n cachedDateTimeFormats.clear();\n updateAmPm();\n }\n\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance) {\n instance.update();\n }\n });\n }\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n if(Array.isArray(arg)) {\n out.push(...arg as any);\n } else {\n out.push(arg);\n }\n }\n\n export function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n const out: ReturnType = [];\n const regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n let lastIndex = 0;\n input.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n // console.table({match, p1, p2, offset, string});\n\n out.push(string.slice(lastIndex, offset));\n\n if(p1) {\n // offset += p1.length;\n let element: HTMLElement;\n switch(p1) {\n case '**': {\n element = document.createElement('b');\n break;\n }\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n }\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n } else if(p3) {\n out.push(document.createElement('br'));\n } else if(p4) {\n const idx = p4.lastIndexOf(']');\n const text = p4.slice(1, idx);\n\n const url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n if(url && matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n } else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n\n if(a instanceof DocumentFragment) { // right after wrapRichText\n a = a.firstChild as any;\n }\n\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n out.push(a);\n } else if(args) {\n pushNextArgument(out, args, indexHolder);\n }\n\n lastIndex = offset + match.length;\n return '';\n });\n\n if(lastIndex !== input.length) {\n out.push(input.slice(lastIndex));\n }\n\n return out;\n }\n\n export function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n export function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n export function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n const str = strings.get(key);\n let input: string;\n if(str) {\n if(str._ === 'langPackStringPluralized' && args?.length) {\n let v = args[0] as number | string;\n if(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n const s = pluralRules.select(v);\n // @ts-ignore\n input = str[s + '_value'] || str['other_value'];\n } else if(str._ === 'langPackString') {\n input = str.value;\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n\n const result = superFormatter(input, args);\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\n return result.map((item) => item instanceof Node ? item.textContent : item).join('');\n } else {\n return result;\n }\n\n /* if(plain) {\n if(args?.length) {\n const regExp = /un\\d|%\\d\\$.|%./g;\n let i = 0;\n input = input.replace(regExp, (match, offset, string) => {\n return '' + args[i++];\n });\n }\n\n return input;\n } else {\n return superFormatter(input, args);\n } */\n }\n\n export const weakMap: WeakMap> = new WeakMap();\n\n export type IntlElementBaseOptions = {\n element?: HTMLElement,\n property?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n };\n\n abstract class IntlElementBase {\n public element: IntlElementBaseOptions['element'];\n public property: IntlElementBaseOptions['property'];\n\n constructor(options?: Options) {\n this.element = options?.element || document.createElement('span');\n this.element.classList.add('i18n');\n\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n abstract update(options?: Options): void;\n }\n\n export type IntlElementOptions = IntlElementBaseOptions & {\n key?: LangPackKey,\n args?: FormatterArguments\n };\n export class IntlElement extends IntlElementBase {\n public key: IntlElementOptions['key'];\n public args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n public update(options?: IntlElementOptions) {\n safeAssign(this, options);\n\n if(this.property === 'innerHTML') {\n this.element.textContent = '';\n this.element.append(...format(this.key, false, this.args) as any);\n } else {\n // @ts-ignore\n const v = this.element[this.property];\n const formatted = format(this.key, true, this.args);\n\n // * hasOwnProperty won't work here\n if(v === undefined) this.element.dataset[this.property] = formatted;\n else (this.element as HTMLInputElement)[this.property] = formatted;\n }\n }\n\n public compareAndUpdate(options?: IntlElementOptions) {\n if(this.key === options.key && deepEqual(this.args, options.args)) {\n return;\n }\n\n return this.update(options);\n }\n }\n\n const cachedDateTimeFormats: Map = new Map();\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n const json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n dateTimeFormat = new Intl.DateTimeFormat(lastRequestedNormalizedLangCode + '-u-hc-' + timeFormat, options);\n cachedDateTimeFormats.set(json, dateTimeFormat);\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n export type IntlDateElementOptions = IntlElementBaseOptions & {\n date?: Date,\n options: Intl.DateTimeFormatOptions\n };\n export class IntlDateElement extends IntlElementBase {\n public date: IntlDateElementOptions['date'];\n public options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n setDirection(this.element);\n }\n\n public update(options?: IntlDateElementOptions) {\n safeAssign(this, options);\n\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n const hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n }\n }\n\n export function i18n(key: LangPackKey, args?: FormatterArguments) {\n return new IntlElement({key, args}).element;\n }\n\n export function i18n_(options: IntlElementOptions) {\n return new IntlElement(options).element;\n }\n\n export function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n return new IntlElement({element, key, args, property}).element;\n }\n}\n\nexport {I18n};\nexport default I18n;\n\nconst i18n = I18n.i18n;\nexport {i18n};\n\nconst i18n_ = I18n.i18n_;\nexport {i18n_};\n\nconst _i18n = I18n._i18n;\nexport {_i18n};\n\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\n const arr = elements.slice(0, 1);\n for(let i = 1; i < elements.length; ++i) {\n const isLast = (elements.length - 1) === i;\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\n arr.push(elements[i]);\n }\n\n return arr;\n}\n\n\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\n const joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\n });\n\n return plain ? joined.join('') : joined;\n}\n\nMOUNT_CLASS_TO.I18n = I18n;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDialogFilter} from '../storages/filters';\n\n/**\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\n */\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\nexport type REAL_FOLDER_ID = 0 | 1;\n\nexport const NULL_PEER_ID: PeerId = 0;\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\nexport const SERVICE_PEER_ID: PeerId = 777000;\nexport const MUTE_UNTIL = 0x7FFFFFFF;\nexport const BOT_START_PARAM = '';\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\nexport const THUMB_TYPE_FULL = '';\nexport const TOPIC_COLORS = [0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, 0xFB6F5F];\nexport const ATTACH_MENU_BOT_ICON_NAME = 'default_static';\nexport const GENERAL_TOPIC_ID = 4295032831;\nexport const T_ME_PREFIXES = new Set(['web', 'k', 'z']);\n\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\nexport const REAL_FOLDERS: Set = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\n","import IS_CALL_SUPPORTED from './callSupport';\nimport CAN_USE_TRANSFERABLES from './canUseTransferables';\nimport IS_CANVAS_FILTER_SUPPORTED from './canvasFilterSupport';\nimport IS_EMOJI_SUPPORTED from './emojiSupport';\nimport IS_GEOLOCATION_SUPPORTED from './geolocationSupport';\nimport IS_GROUP_CALL_SUPPORTED from './groupCallSupport';\nimport IMAGE_MIME_TYPES_SUPPORTED from './imageMimeTypesSupport';\nimport MEDIA_MIME_TYPES_SUPPORTED from './mediaMimeTypesSupport';\nimport IS_MOV_SUPPORTED from './movSupport';\nimport IS_PARALLAX_SUPPORTED from './parallaxSupport';\nimport IS_SCREEN_SHARING_SUPPORTED from './screenSharingSupport';\nimport IS_TOUCH_SUPPORTED from './touchSupport';\nimport IS_VIBRATE_SUPPORTED from './vibrateSupport';\nimport VIDEO_MIME_TYPES_SUPPORTED from './videoMimeTypesSupport';\nimport IS_WEBM_SUPPORTED from './webmSupport';\nimport IS_WEBP_SUPPORTED from './webpSupport';\nimport IS_WEBRTC_SUPPORTED from './webrtcSupport';\nimport * as userAgent from './userAgent';\nimport IS_OPUS_SUPPORTED from './opusSupport';\nimport IS_SHARED_WORKER_SUPPORTED from './sharedWorkerSupport';\nimport IS_APPLE_MX from './appleMx';\n\nconst ENVIRONMENT = {\n CAN_USE_TRANSFERABLES,\n IS_APPLE_MX,\n IS_CALL_SUPPORTED,\n IS_CANVAS_FILTER_SUPPORTED,\n IS_EMOJI_SUPPORTED,\n IS_GEOLOCATION_SUPPORTED,\n IS_GROUP_CALL_SUPPORTED,\n IS_MOV_SUPPORTED,\n IS_PARALLAX_SUPPORTED,\n IS_SCREEN_SHARING_SUPPORTED,\n IS_TOUCH_SUPPORTED,\n IS_VIBRATE_SUPPORTED,\n IS_OPUS_SUPPORTED,\n IS_SHARED_WORKER_SUPPORTED,\n IS_WEBM_SUPPORTED,\n IS_WEBP_SUPPORTED,\n IS_WEBRTC_SUPPORTED,\n IMAGE_MIME_TYPES_SUPPORTED,\n MEDIA_MIME_TYPES_SUPPORTED,\n VIDEO_MIME_TYPES_SUPPORTED,\n ...userAgent\n};\n\nexport default ENVIRONMENT;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../../../../config/app';\nimport DEBUG from '../../../../config/debug';\nimport {AutoDownloadPeerTypeSettings, State, STATE_INIT} from '../../../../config/state';\nimport compareVersion from '../../../../helpers/compareVersion';\nimport copy from '../../../../helpers/object/copy';\nimport validateInitObject from '../../../../helpers/object/validateInitObject';\nimport {UserAuth} from '../../../mtproto/mtproto_config';\nimport rootScope from '../../../rootScope';\nimport stateStorage from '../../../stateStorage';\nimport sessionStorage from '../../../sessionStorage';\nimport {recordPromiseBound} from '../../../../helpers/recordPromise';\n// import RESET_STORAGES_PROMISE from \"../storages/resetStoragesPromise\";\nimport {StoragesResults} from '../storages/loadStorages';\nimport {logger} from '../../../logger';\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\n// const REFRESH_EVERY = 1e3;\n// const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days\n\nconst STATE_VERSION = STATE_INIT.version;\nconst BUILD = STATE_INIT.build;\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\n\nconst REFRESH_KEYS: Array = [\n 'contactsListCachedTime',\n 'stateCreatedTime',\n 'maxSeenMsgId',\n 'filtersArr'\n];\n\n// const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\n\nasync function loadStateInner() {\n const log = logger('STATE-LOADER');\n\n const totalPerf = performance.now();\n const recordPromise = recordPromiseBound(log);\n\n const promises = ALL_KEYS.map((key) => recordPromise(stateStorage.get(key), 'state ' + key))\n .concat(\n recordPromise(sessionStorage.get('user_auth'), 'auth'),\n recordPromise(sessionStorage.get('state_id'), 'auth'),\n recordPromise(sessionStorage.get('k_build'), 'auth')\n )\n .concat(recordPromise(stateStorage.get('user_auth'), 'old auth')); // support old webk format\n\n const arr = await Promise.all(promises);\n log.warn('promises', performance.now() - totalPerf);\n // await new Promise((resolve) => setTimeout(resolve, 3e3));\n /* const self = this;\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\n const getHandler = (path?: string) => {\n return {\n get(target: any, key: any) {\n if(key === 'isProxy') {\n return true;\n }\n\n const prop = target[key];\n\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\n target[key] = new Proxy(prop, getHandler(path || key));\n return target[key];\n }\n\n return prop;\n },\n set(target: any, key: any, value: any) {\n console.log('Setting', target, `.${key} to equal`, value, path);\n\n target[key] = value;\n\n // @ts-ignore\n self.pushToState(path || key, path ? self.state[path] : value, false);\n\n return true;\n }\n };\n }; */\n\n // const pushed: {key: keyof State, value: State[keyof State]}[] = [];\n const pushedKeys: (keyof State)[] = [];\n const pushToState = (key: T, value: State[T]) => {\n // appStateManager.pushToState(key, value);\n state[key] = value;\n // pushed.push({key, value});\n pushedKeys.push(key);\n };\n\n const replaceState = (_state: State) => {\n // pushed.length = 0;\n pushedKeys.length = 0;\n state = _state;\n pushedKeys.push(...Object.keys(state) as any as typeof pushedKeys);\n // state = appStateManager.setState(_state);\n // appStateManager.storage.set(state);\n };\n\n // let state: State = appStateManager.setState({} as any);\n let state: State = {} as any;\n\n // ! then can't store false values\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\n const key = ALL_KEYS[i];\n const value = arr[i];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n let auth = arr.shift() as UserAuth | number;\n const stateId = arr.shift() as number;\n const sessionBuild = arr.shift() as number;\n const shiftedWebKAuth = arr.shift() as UserAuth | number;\n if(!auth && shiftedWebKAuth) { // support old webk auth\n auth = shiftedWebKAuth;\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n const values = await Promise.all(keys.map((key) => stateStorage.get(key as any)));\n keys.push('user_auth');\n values.push(typeof(auth) === 'number' || typeof(auth) === 'string' ? {dcID: values[0] || App.baseDcId, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} as UserAuth : auth);\n\n const obj: any = {};\n keys.forEach((key, idx) => {\n obj[key] = values[idx];\n });\n\n await sessionStorage.set(obj);\n }\n\n /* if(!auth) { // try to read Webogram's session from localStorage\n try {\n const keys = Object.keys(localStorage);\n for(let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let value: any;\n try {\n value = localStorage.getItem(key);\n value = JSON.parse(value);\n } catch(err) {\n //console.error(err);\n }\n\n sessionStorage.set({\n [key as any]: value\n });\n }\n\n auth = sessionStorage.getFromCache('user_auth');\n } catch(err) {\n this.log.error('localStorage import error', err);\n }\n } */\n\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ?\n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} :\n auth); // * support old version\n }\n\n const resetStorages: Set = new Set();\n if(state.stateId !== stateId) {\n if(stateId !== undefined) {\n const preserve: Map = new Map([\n ['authState', undefined],\n ['stateId', undefined]\n ]);\n\n preserve.forEach((_, key) => {\n preserve.set(key, copy(state[key]));\n });\n\n state = copy(STATE_INIT);\n\n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n const r: {[k in keyof StoragesResults]: number} = {\n chats: 1,\n dialogs: 1,\n users: 1\n };\n for(const key in r) {\n resetStorages.add(key as keyof StoragesResults);\n // this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n replaceState(state);\n }\n\n await sessionStorage.set({\n state_id: state.stateId\n });\n }\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach((key) => {\n pushToState(key, copy(STATE_INIT[key]));\n\n // const s = appStateManager.storagesResults[key as keyof AppStateManager['storagesResults']];\n // if(s?.length) {\n // appStateManager.resetStorages.add(key as keyof AppStateManager['storagesResults']);\n // s.length = 0;\n // }\n });\n };\n\n r(REFRESH_KEYS);\n\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\n if(DEBUG) {\n this.log('will refresh updates');\n }\n\n r(REFRESH_KEYS_WEEK);\n } */\n }\n\n // state = this.state = new Proxy(state, getHandler());\n\n // * support old version\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n pushToState('settings', state.settings);\n }\n\n // * support old version\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n state.settings.themes = copy(STATE_INIT.settings.themes);\n const theme = state.settings.themes.find((t) => t.name === state.settings.theme);\n if(theme) {\n theme.background = state.settings.background;\n pushToState('settings', state.settings);\n }\n }\n\n // * migrate auto download settings\n const autoDownloadSettings = state.settings.autoDownload;\n if(autoDownloadSettings?.private !== undefined) {\n const oldTypes = [\n 'contacts' as const,\n 'private' as const,\n 'groups' as const,\n 'channels' as const\n ];\n\n const mediaTypes = [\n 'photo' as const,\n 'video' as const,\n 'file' as const\n ];\n\n mediaTypes.forEach((mediaType) => {\n const peerTypeSettings: AutoDownloadPeerTypeSettings = autoDownloadSettings[mediaType] = {} as any;\n oldTypes.forEach((peerType) => {\n peerTypeSettings[peerType] = autoDownloadSettings[peerType];\n });\n });\n\n oldTypes.forEach((peerType) => {\n delete autoDownloadSettings[peerType];\n });\n\n pushToState('settings', state.settings);\n }\n\n validateInitObject(STATE_INIT, state, (missingKey) => {\n pushToState(missingKey as keyof State, state[missingKey as keyof State]);\n });\n\n let newVersion: string, oldVersion: string;\n if(state.version !== STATE_VERSION || state.build !== BUILD/* || true */) {\n // reset filters and dialogs if version is older\n if(/* compareVersion(state.version, '0.8.7') === -1 || state.build < 179 || */state.build < 217) {\n state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n state.pinnedOrders = copy(STATE_INIT.pinnedOrders);\n state.filtersArr = copy(STATE_INIT.filtersArr);\n\n resetStorages.add('dialogs');\n }\n\n // * migrate backgrounds (March 13, 2022; to version 1.3.0)\n if(compareVersion(state.version, '1.3.0') === -1) {\n let migrated = false;\n state.settings.themes.forEach((theme, idx, arr) => {\n if((\n theme.name === 'day' &&\n theme.background.slug === 'ByxGo2lrMFAIAAAAmkJxZabh8eM' &&\n theme.background.type === 'image'\n ) || (\n theme.name === 'night' &&\n theme.background.color === '#0f0f0f' &&\n theme.background.type === 'color'\n )) {\n const newTheme = STATE_INIT.settings.themes.find((newTheme) => newTheme.name === theme.name);\n if(newTheme) {\n arr[idx] = copy(newTheme);\n migrated = true;\n }\n }\n });\n\n if(migrated) {\n pushToState('settings', state.settings);\n }\n }\n\n if(compareVersion(state.version, STATE_VERSION) !== 0) {\n newVersion = STATE_VERSION;\n oldVersion = state.version;\n }\n\n pushToState('version', STATE_VERSION);\n pushToState('build', BUILD);\n }\n\n if(sessionBuild !== BUILD && (!sessionBuild || sessionBuild < BUILD)) {\n sessionStorage.set({k_build: BUILD});\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n log('state res', state, copy(state));\n }\n\n // return resolve();\n\n log.warn('total', performance.now() - totalPerf);\n\n // RESET_STORAGES_PROMISE.resolve(appStateManager.resetStorages);\n\n return {state, resetStorages, newVersion, oldVersion, pushedKeys};\n}\n\nlet promise: ReturnType;\nexport default function loadState() {\n return promise ??= loadStateInner();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Awaited} from '../../types';\nimport type {CacheStorageDbName} from '../files/cacheStorage';\nimport type {State} from '../../config/state';\nimport type {Message, MessagePeerReaction, PeerNotifySettings} from '../../layer';\nimport {CryptoMethods} from '../crypto/crypto_methods';\nimport rootScope from '../rootScope';\nimport webpWorkerController from '../webp/webpWorkerController';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport sessionStorage from '../sessionStorage';\nimport webPushApiManager from './webPushApiManager';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport telegramMeWebManager from './telegramMeWebManager';\nimport pause from '../../helpers/schedulers/pause';\nimport ENVIRONMENT from '../../environment';\nimport loadState from '../appManagers/utils/state/loadState';\nimport opusDecodeController from '../opusDecodeController';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport SuperMessagePort from './superMessagePort';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport toggleStorages from '../../helpers/toggleStorages';\nimport idleController from '../../helpers/idleController';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport App from '../../config/app';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\n\nexport type Mirrors = {\n state: State\n};\n\nexport type MirrorTaskPayload = {\n name: T,\n key?: K,\n value: any\n};\n\nexport type NotificationBuildTaskPayload = {\n message: Message.message | Message.messageService,\n fwdCount?: number,\n peerReaction?: MessagePeerReaction,\n peerTypeNotifySettings?: PeerNotifySettings\n};\n\nexport type TabState = {\n chatPeerIds: PeerId[],\n idleStartTime: number,\n};\n\nclass ApiManagerProxy extends MTProtoMessagePort {\n // private worker: /* Window */Worker;\n // private sockets: Map = new Map();\n private mirrors: Mirrors;\n\n public newVersion: string;\n public oldVersion: string;\n\n private tabState: TabState;\n\n public serviceMessagePort: ServiceMessagePort;\n private lastServiceWorker: ServiceWorker;\n\n private pingServiceWorkerPromise: CancellablePromise;\n\n constructor() {\n super();\n\n this.mirrors = {} as any;\n this.tabState = {\n chatPeerIds: [],\n idleStartTime: 0\n };\n\n this.log('constructor');\n\n \n this.registerWorker();\n \n\n this.registerServiceWorker();\n this.registerCryptoWorker();\n\n // const perf = performance.now();\n this.addMultipleEventsListeners({\n convertWebp: ({fileName, bytes}) => {\n return webpWorkerController.convert(fileName, bytes);\n },\n\n convertOpus: ({fileName, bytes}) => {\n return opusDecodeController.pushDecodeTask(bytes, false).then((result) => result.bytes);\n },\n\n event: ({name, args}) => {\n // @ts-ignore\n rootScope.dispatchEventSingle(name, ...args);\n },\n\n localStorageProxy: (payload) => {\n const storageTask = payload;\n return (sessionStorage[storageTask.type] as any)(...storageTask.args);\n },\n\n mirror: this.onMirrorTask\n\n // hello: () => {\n // this.log.error('time hello', performance.now() - perf);\n // }\n });\n\n // this.addTaskListener('socketProxy', (task) => {\n // const socketTask = task.payload;\n // const id = socketTask.id;\n // //console.log('socketProxy', socketTask, id);\n\n // if(socketTask.type === 'send') {\n // const socket = this.sockets.get(id);\n // socket.send(socketTask.payload);\n // } else if(socketTask.type === 'close') { // will remove from map in onClose\n // const socket = this.sockets.get(id);\n // socket.close();\n // } else if(socketTask.type === 'setup') {\n // const socket = new Socket(socketTask.payload.dcId, socketTask.payload.url, socketTask.payload.logSuffix);\n\n // const onOpen = () => {\n // //console.log('socketProxy onOpen');\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'open',\n // id\n // }\n // });\n // };\n // const onClose = () => {\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'close',\n // id\n // }\n // });\n\n // socket.removeEventListener('open', onOpen);\n // socket.removeEventListener('close', onClose);\n // socket.removeEventListener('message', onMessage);\n // this.sockets.delete(id);\n // };\n // const onMessage = (buffer: ArrayBuffer) => {\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'message',\n // id,\n // payload: buffer\n // }\n // });\n // };\n\n // socket.addEventListener('open', onOpen);\n // socket.addEventListener('close', onClose);\n // socket.addEventListener('message', onMessage);\n // this.sockets.set(id, socket);\n // }\n // });\n\n rootScope.addEventListener('language_change', (language) => {\n rootScope.managers.networkerFactory.setLanguage(language);\n });\n\n window.addEventListener('online', () => {\n rootScope.managers.networkerFactory.forceReconnectTimeout();\n });\n\n rootScope.addEventListener('logging_out', () => {\n const toClear: CacheStorageDbName[] = ['cachedFiles', 'cachedStreamChunks'];\n Promise.all([\n toggleStorages(false, true),\n sessionStorage.clear(),\n Promise.race([\n telegramMeWebManager.setAuthorized(false),\n pause(3000)\n ]),\n webPushApiManager.forceUnsubscribe(),\n Promise.all(toClear.map((cacheName) => caches.delete(cacheName)))\n ]).finally(() => {\n appRuntimeManager.reload();\n });\n });\n\n idleController.addEventListener('change', (idle) => {\n this.updateTabStateIdle(idle);\n });\n this.updateTabStateIdle(idleController.isIdle);\n\n this.log('Passing environment:', ENVIRONMENT);\n this.invoke('environment', ENVIRONMENT);\n // this.sendState();\n }\n\n public pingServiceWorkerWithIframe() {\n if(this.pingServiceWorkerPromise) {\n return this.pingServiceWorkerPromise;\n }\n\n const promise = this.pingServiceWorkerPromise = deferredPromise();\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n const onLoad = () => {\n setTimeout(() => { // ping once in 10 seconds\n this.pingServiceWorkerPromise = undefined;\n }, 10e3);\n\n clearTimeout(timeout);\n iframe.remove();\n iframe.removeEventListener('load', onLoad);\n iframe.removeEventListener('error', onLoad);\n promise.resolve();\n };\n iframe.addEventListener('load', onLoad);\n iframe.addEventListener('error', onLoad);\n iframe.src = 'ping/' + (Math.random() * 0xFFFFFFFF | 0);\n document.body.append(iframe);\n\n const timeout = window.setTimeout(onLoad, 1e3);\n return promise;\n }\n\n private attachServiceWorker(serviceWorker: ServiceWorker) {\n this.lastServiceWorker && this.serviceMessagePort.detachPort(this.lastServiceWorker);\n this.serviceMessagePort.attachSendPort(this.lastServiceWorker = serviceWorker);\n this.serviceMessagePort.invokeVoid('hello', undefined);\n }\n\n private _registerServiceWorker() {\n navigator.serviceWorker.register(\n /* webpackChunkName: \"sw\" */\n new URL('../serviceWorker/index.service', import.meta.url),\n {scope: './'}\n ).then((registration) => {\n this.log('SW registered', registration);\n\n // ! doubtful fix for hard refresh\n if(registration.active && !navigator.serviceWorker.controller) {\n return registration.unregister().then(() => {\n window.location.reload();\n });\n }\n\n const sw = registration.installing || registration.waiting || registration.active;\n sw.addEventListener('statechange', (e) => {\n this.log('SW statechange', e);\n });\n\n const controller = navigator.serviceWorker.controller || registration.installing || registration.waiting || registration.active;\n this.attachServiceWorker(controller);\n\n \n \n \n }, (err) => {\n this.log.error('SW registration failed!', err);\n\n this.invokeVoid('serviceWorkerOnline', false);\n });\n }\n\n private registerServiceWorker() {\n if(!('serviceWorker' in navigator)) return;\n\n this.serviceMessagePort = new ServiceMessagePort();\n\n // this.addMultipleEventsListeners({\n // hello: () => {\n // // this.serviceMessagePort.invokeVoid('port', undefined);\n // }\n // });\n\n // ! I hate webpack - it won't load it by using worker.register, only navigator.serviceWorker will do it.\n const worker = navigator.serviceWorker;\n this._registerServiceWorker();\n\n // worker.startMessages();\n\n worker.addEventListener('controllerchange', () => {\n this.log.warn('controllerchange');\n\n const controller = worker.controller;\n this.attachServiceWorker(controller);\n\n controller.addEventListener('error', (e) => {\n this.log.error('controller error:', e);\n });\n });\n\n \n \n \n this.serviceMessagePort.attachListenPort(worker);\n this.serviceMessagePort.addMultipleEventsListeners({\n port: (payload, source, event) => {\n this.invokeVoid('serviceWorkerPort', undefined, undefined, [event.ports[0]]);\n },\n\n hello: (payload, source) => {\n this.serviceMessagePort.resendLockTask(source);\n }\n });\n \n\n worker.addEventListener('messageerror', (e) => {\n this.log.error('SW messageerror:', e);\n });\n }\n\n private async registerCryptoWorker() {\n const get = (url: string) => {\n return fetch(url).then((response) => response.text()).then((text) => {\n const pathnameSplitted = location.pathname.split('/');\n pathnameSplitted[pathnameSplitted.length - 1] = '';\n const pre = location.origin + pathnameSplitted.join('/');\n text = `\n var originalImportScripts = importScripts; \n importScripts = (url) => {\n console.log('importScripts', url);\n var newUrl = '${pre}' + url.split('/').pop();\n return originalImportScripts(newUrl);\n };\n ${text}`;\n const blob = new Blob([text], {type: 'application/javascript'});\n return blob;\n });\n };\n\n const workerHandler = {\n construct(target: any, args: any): any {\n const url = args[0] + location.search;\n return {url};\n }\n };\n\n const originals = [\n Worker,\n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].filter(Boolean);\n originals.forEach((w) => window[w.name as any] = new Proxy(w, workerHandler));\n\n const worker: SharedWorker | Worker = new Worker(\n /* webpackChunkName: \"crypto.worker\" */\n new URL('../crypto/crypto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n\n originals.forEach((w) => window[w.name as any] = w as any);\n\n const originalUrl = (worker as any).url;\n\n const createWorker = (url: string) => new constructor(url, {type: 'module'});\n const attachWorkerToPort = (worker: SharedWorker | Worker) => this.attachWorkerToPort(worker, cryptoMessagePort, 'crypto');\n const constructor = IS_SHARED_WORKER_SUPPORTED ? SharedWorker : Worker;\n\n // let cryptoWorkers = workers.length;\n cryptoMessagePort.addEventListener('port', (payload, source, event) => {\n this.invokeVoid('cryptoPort', undefined, undefined, [event.ports[0]]);\n // .then((attached) => {\n // if(!attached && cryptoWorkers-- > 1) {\n // this.log.error('terminating unneeded crypto worker');\n\n // cryptoMessagePort.invokeVoid('terminate', undefined, source);\n // const worker = workers.find((worker) => (worker as SharedWorker).port === source || (worker as any) === source);\n // if((worker as SharedWorker).port) (worker as SharedWorker).port.close();\n // else (worker as Worker).terminate();\n // cryptoMessagePort.detachPort(source);\n // }\n // });\n });\n\n const firstWorker = createWorker(originalUrl);\n attachWorkerToPort(firstWorker);\n\n const blob = await get(originalUrl);\n const urlsPromise = await this.invoke('createProxyWorkerURLs', {originalUrl, blob});\n const workers = urlsPromise.slice(1).map(createWorker);\n workers.forEach(attachWorkerToPort);\n }\n\n \n private registerWorker() {\n // return;\n\n let worker: SharedWorker | Worker;\n if(IS_SHARED_WORKER_SUPPORTED) {\n worker = new SharedWorker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n } else {\n worker = new Worker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n }\n\n this.onWorkerFirstMessage(worker);\n }\n \n\n private attachWorkerToPort(worker: SharedWorker | Worker, messagePort: SuperMessagePort, type: string) {\n const port: MessagePort = (worker as SharedWorker).port || worker as any;\n messagePort.attachPort(port);\n\n worker.addEventListener('error', (err) => {\n this.log.error(type, 'worker error', err);\n });\n }\n\n private onWorkerFirstMessage(worker: any) {\n this.log('set webWorker');\n\n // this.worker = worker;\n \n \n \n this.attachWorkerToPort(worker, this, 'mtproto');\n \n }\n\n private loadState() {\n return Promise.all([\n loadState().then((stateResult) => {\n this.newVersion = stateResult.newVersion;\n this.oldVersion = stateResult.oldVersion;\n this.mirrors['state'] = stateResult.state;\n return stateResult;\n })\n // loadStorages(createStorages()),\n ]);\n }\n\n public sendState() {\n return this.loadState().then((result) => {\n const [stateResult] = result;\n this.invoke('state', {...stateResult, userId: rootScope.myId.toUserId()});\n return result;\n });\n }\n\n \n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\n return cryptoMessagePort.invokeCrypto(method, ...args);\n }\n \n\n public async toggleStorages(enabled: boolean, clearWrite: boolean) {\n await toggleStorages(enabled, clearWrite);\n this.invoke('toggleStorages', {enabled, clearWrite});\n this.serviceMessagePort.invokeVoid('toggleStorages', {enabled, clearWrite});\n }\n\n public async getMirror(name: T) {\n const mirror = this.mirrors[name];\n return mirror;\n }\n\n public getState() {\n return this.getMirror('state');\n }\n\n public updateTabState(key: T, value: TabState[T]) {\n this.tabState[key] = value;\n this.invokeVoid('tabState', this.tabState);\n }\n\n public updateTabStateIdle(idle: boolean) {\n this.updateTabState('idleStartTime', idle ? Date.now() : 0);\n }\n\n private onMirrorTask = (payload: MirrorTaskPayload) => {\n const {name, key, value} = payload;\n if(!payload.hasOwnProperty('key')) {\n this.mirrors[name] = value;\n return;\n }\n\n const mirror = this.mirrors[name] ??= {} as any;\n if(value === undefined) {\n delete mirror[key];\n } else {\n mirror[key] = value;\n }\n };\n}\n\ninterface ApiManagerProxy extends MTProtoMessagePort {}\n\nconst apiManagerProxy = new ApiManagerProxy();\nMOUNT_CLASS_TO.apiManagerProxy = apiManagerProxy;\nexport default apiManagerProxy;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport tabId from '../../config/tabId';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport idleController from '../../helpers/idleController';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport sessionStorage from '../sessionStorage';\nimport apiManagerProxy from './mtprotoworker';\n\nexport type AppInstance = {\n id: number,\n idle: boolean,\n time: number\n};\n\nexport type InstanceDeactivateReason = 'version' | 'tabs';\n\nconst CHECK_INSTANCE_INTERVAL = 5000;\nconst DEACTIVATE_TIMEOUT = 30000;\nconst MULTIPLE_TABS_THRESHOLD = 20000;\nconst IS_MULTIPLE_TABS_SUPPORTED = IS_SHARED_WORKER_SUPPORTED;\n\nexport class SingleInstance extends EventListenerBase<{\n activated: () => void,\n deactivated: (reason: InstanceDeactivateReason) => void\n}> {\n private instanceId: number;\n private started: boolean;\n private masterInstance: boolean;\n private deactivateTimeout: number;\n private deactivated: InstanceDeactivateReason;\n private log = logger('INSTANCE');\n\n constructor() {\n super(false);\n\n this.log = logger('INSTANCE');\n this.instanceId = tabId;\n }\n\n public get deactivatedReason() {\n return this.deactivated;\n }\n\n public start() {\n this.reset();\n\n if(!this.started/* && !Config.Navigator.mobile && !Config.Modes.packed */) {\n this.started = true;\n\n idleController.addEventListener('change', this.checkInstance);\n setInterval(this.checkInstance, CHECK_INSTANCE_INTERVAL);\n this.checkInstance();\n\n try {\n document.documentElement.addEventListener('beforeunload', this.clearInstance);\n } catch(e) {}\n }\n }\n\n private reset() {\n this.masterInstance = false;\n this.clearDeactivateTimeout();\n this.deactivated = undefined;\n }\n\n private clearInstance = () => {\n if(this.masterInstance && !this.deactivated) {\n this.log.warn('clear master instance');\n sessionStorage.delete('xt_instance');\n }\n };\n\n public activateInstance() {\n if(this.deactivated) {\n this.reset();\n this.checkInstance(false);\n this.dispatchEvent('activated');\n }\n }\n\n private deactivateInstance(reason: InstanceDeactivateReason) {\n if(this.masterInstance || this.deactivated) {\n return;\n }\n\n this.log.warn('deactivate', reason);\n this.clearDeactivateTimeout();\n this.deactivated = reason;\n\n this.dispatchEvent('deactivated', reason);\n }\n\n private clearDeactivateTimeout() {\n if(this.deactivateTimeout) {\n clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n }\n }\n\n private checkInstance = async(idle = idleController.isIdle) => {\n if(this.deactivated) {\n return;\n }\n\n const time = Date.now();\n const newInstance: AppInstance = {\n id: this.instanceId,\n idle,\n time\n };\n\n const [curInstance, build = App.build] = await Promise.all([\n sessionStorage.get('xt_instance', false),\n sessionStorage.get('k_build', false)\n ]);\n\n if(build > App.build) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.deactivateInstance('version');\n apiManagerProxy.toggleStorages(false, false);\n return;\n } else if(IS_MULTIPLE_TABS_SUPPORTED) {\n sessionStorage.set({xt_instance: newInstance});\n return;\n }\n\n // this.log('check instance', newInstance, curInstance)\n if(!idle ||\n !curInstance ||\n curInstance.id === this.instanceId ||\n curInstance.time < (time - MULTIPLE_TABS_THRESHOLD)) {\n sessionStorage.set({xt_instance: newInstance});\n\n if(!this.masterInstance) {\n this.masterInstance = true;\n rootScope.managers.networkerFactory.startAll();\n this.log.warn('now master instance', newInstance);\n }\n\n this.clearDeactivateTimeout();\n } else if(this.masterInstance) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.log.warn('now idle instance', newInstance);\n this.deactivateTimeout ||= window.setTimeout(() => this.deactivateInstance('tabs'), DEACTIVATE_TIMEOUT);\n }\n };\n}\n\nconst singleInstance = new SingleInstance();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.singleInstance = singleInstance);\nexport default singleInstance;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport Modes from '../../config/modes';\nimport loadScript from '../../helpers/dom/loadScript';\nimport tsNow from '../../helpers/tsNow';\nimport sessionStorage from '../sessionStorage';\n\nexport class TelegramMeWebManager {\n private disabled = /* false && */(Modes.test || !App.domains.includes(location.hostname));\n\n public setAuthorized(canRedirect: boolean) {\n if(this.disabled) {\n return;\n }\n\n return sessionStorage.get('tgme_sync').then((curValue) => {\n const ts = tsNow(true);\n if(\n canRedirect &&\n curValue?.canRedirect === canRedirect &&\n (curValue.ts + 86400) > ts\n ) {\n return;\n }\n\n sessionStorage.set({\n tgme_sync: {\n canRedirect,\n ts\n }\n });\n\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\n const urls = [\n '//telegram.me/' + path,\n '//t.me/' + path\n ];\n\n const promises = urls.map((url) => {\n return loadScript(url).then((script) => {\n script.remove();\n });\n });\n\n return Promise.all(promises);\n });\n }\n}\n\nconst telegramMeWebManager = new TelegramMeWebManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\nexport default telegramMeWebManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function loadScript(url: string) {\n const script = document.createElement('script');\n const promise = new Promise((resolve) => {\n script.onload = script.onerror = () => {\n resolve(script);\n };\n });\n script.src = url;\n document.body.appendChild(script);\n return promise;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {PushNotificationObject} from '../serviceWorker/push';\nimport type {ServicePushPingTaskPayload} from '../serviceWorker/serviceMessagePort';\nimport type {NotificationSettings} from '../appManagers/uiNotificationsManager';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {logger} from '../logger';\nimport apiManagerProxy from './mtprotoworker';\nimport I18n, {LangPackKey} from '../langPack';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport copy from '../../helpers/object/copy';\nimport singleInstance from './singleInstance';\nimport EventListenerBase from '../../helpers/eventListenerBase';\n\nexport type PushSubscriptionNotifyType = 'init' | 'subscribe' | 'unsubscribe';\nexport type PushSubscriptionNotifyEvent = `push_${PushSubscriptionNotifyType}`;\n\nexport type PushSubscriptionNotify = {\n tokenType: number,\n tokenValue: string\n};\n\nexport class WebPushApiManager extends EventListenerBase<{\n push_notification_click: (n: PushNotificationObject) => void,\n push_init: (n: PushSubscriptionNotify) => void,\n push_subscribe: (n: PushSubscriptionNotify) => void,\n push_unsubscribe: (n: PushSubscriptionNotify) => void\n}> {\n public isAvailable = true;\n private isPushEnabled = false;\n private localNotificationsAvailable = true;\n private started = false;\n private settings: NotificationSettings & {baseUrl?: string} = {} as any;\n private isAliveTO: any;\n private isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n private userVisibleOnly = this.isFirefox ? false : true;\n private log = logger('PM');\n\n constructor() {\n super(false);\n\n if(!('PushManager' in window) ||\n !('Notification' in window) ||\n !('serviceWorker' in navigator)) {\n this.log.warn('Push messaging is not supported.');\n this.isAvailable = false;\n this.localNotificationsAvailable = false;\n }\n\n if(this.isAvailable && Notification.permission === 'denied') {\n this.log.warn('The user has blocked notifications.');\n }\n }\n\n public start() {\n if(!this.started) {\n this.started = true;\n this.getSubscription();\n this.setUpServiceWorkerChannel();\n }\n }\n\n public setLocalNotificationsDisabled() {\n this.localNotificationsAvailable = false;\n }\n\n public getSubscription() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.isPushEnabled = !!subscription;\n this.pushSubscriptionNotify('init', subscription);\n }).catch((err) => {\n this.log.error('Error during getSubscription()', err);\n });\n });\n }\n\n public subscribe = () => {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.subscribe({userVisibleOnly: this.userVisibleOnly}).then((subscription) => {\n // The subscription was successful\n this.isPushEnabled = true;\n this.pushSubscriptionNotify('subscribe', subscription);\n }).catch((e) => {\n if(Notification.permission === 'denied') {\n this.log('Permission for Notifications was denied');\n } else {\n this.log('Unable to subscribe to push.', e);\n if(!this.userVisibleOnly) {\n this.userVisibleOnly = true;\n setTimeout(this.subscribe, 0);\n }\n }\n });\n });\n }\n\n public unsubscribe() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.isPushEnabled = false;\n\n if(subscription) {\n this.pushSubscriptionNotify('unsubscribe', subscription);\n\n setTimeout(() => {\n subscription.unsubscribe().then((successful) => {\n this.isPushEnabled = false;\n }).catch((e) => {\n this.log.error('Unsubscription error: ', e);\n });\n }, 3000);\n }\n }).catch((e) => {\n this.log.error('Error thrown while unsubscribing from ' +\n 'push messaging.', e);\n });\n });\n }\n\n public forceUnsubscribe() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.log.warn('force unsubscribe', subscription);\n if(subscription) {\n subscription.unsubscribe().then((successful) => {\n this.log.warn('force unsubscribe successful', successful);\n this.isPushEnabled = false;\n }).catch((e) => {\n this.log.error('Unsubscription error: ', e);\n });\n }\n }).catch((e) => {\n this.log.error('Error thrown while unsubscribing from ' +\n 'push messaging.', e);\n });\n });\n }\n\n public isAliveNotify = () => {\n if(!this.isAvailable || singleInstance.deactivatedReason) {\n return;\n }\n\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '');\n\n const lang: ServicePushPingTaskPayload['lang'] = {} as any;\n const ACTIONS_LANG_MAP: Record = {\n push_action_mute1d: IS_MOBILE ? 'PushNotification.Action.Mute1d.Mobile' : 'PushNotification.Action.Mute1d',\n push_action_settings: IS_MOBILE ? 'PushNotification.Action.Settings.Mobile' : 'PushNotification.Action.Settings',\n push_message_nopreview: 'PushNotification.Message.NoPreview'\n };\n\n for(const action in ACTIONS_LANG_MAP) {\n lang[action as keyof typeof ACTIONS_LANG_MAP] = I18n.format(ACTIONS_LANG_MAP[action as keyof typeof ACTIONS_LANG_MAP], true);\n }\n\n apiManagerProxy.serviceMessagePort.invokeVoid('pushPing', {\n localNotifications: this.localNotificationsAvailable,\n lang: lang,\n settings: this.settings\n });\n\n this.isAliveTO = setTimeout(this.isAliveNotify, 10000);\n }\n\n public setSettings(newSettings: WebPushApiManager['settings']) {\n this.settings = copy(newSettings);\n clearTimeout(this.isAliveTO);\n this.isAliveNotify();\n }\n\n public hidePushNotifications() {\n if(!this.isAvailable) {\n return;\n }\n\n apiManagerProxy.serviceMessagePort.invokeVoid('notificationsClear', undefined);\n }\n\n public setUpServiceWorkerChannel() {\n if(!this.isAvailable) {\n return;\n }\n\n apiManagerProxy.serviceMessagePort.addEventListener('pushClick', (payload) => {\n if(singleInstance.deactivatedReason) {\n appRuntimeManager.reload();\n return;\n }\n\n this.dispatchEvent('push_notification_click', payload);\n });\n\n navigator.serviceWorker.ready.then(this.isAliveNotify);\n }\n\n public pushSubscriptionNotify(event: PushSubscriptionNotifyType, subscription?: PushSubscription) {\n if(subscription) {\n const subscriptionObj: PushSubscriptionJSON = subscription.toJSON();\n if(!subscriptionObj ||\n !subscriptionObj.endpoint ||\n !subscriptionObj.keys ||\n !subscriptionObj.keys.p256dh ||\n !subscriptionObj.keys.auth) {\n this.log.warn('Invalid push subscription', subscriptionObj);\n this.unsubscribe();\n this.isAvailable = false;\n this.pushSubscriptionNotify(event);\n return;\n }\n\n this.log.warn('Push', event, subscriptionObj);\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, {\n tokenType: 10,\n tokenValue: JSON.stringify(subscriptionObj)\n });\n } else {\n this.log.warn('Push', event, false);\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, false as any);\n }\n }\n}\n\nconst webPushApiManager = new WebPushApiManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.webPushApiManager = webPushApiManager);\nexport default webPushApiManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport IS_OPUS_SUPPORTED from '../environment/opusSupport';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport {Modify} from '../types';\nimport {logger, LogTypes} from './logger';\nimport apiManagerProxy from './mtproto/mtprotoworker';\nimport type {ConvertWebPTask} from './webp/webpWorkerController';\n\ntype Result = {\n bytes: Uint8Array,\n waveform?: Uint8Array\n};\n\ntype Task = {\n pages: Uint8Array,\n withWaveform: boolean,\n waveform?: Uint8Array,\n callback: {resolve: (result: Result) => void, reject: (err: any) => void},\n timeout: number\n};\n\nexport interface ConvertOpusTask extends Modify {\n type: 'convertOpus'\n}\n\nexport class OpusDecodeController {\n private worker: Worker;\n private wavWorker: Worker;\n private sampleRate = 48000;\n private tasks: Array = [];\n private keepAlive = false;\n private log = logger('OPUS', LogTypes.Error);\n\n public isPlaySupported() {\n return IS_OPUS_SUPPORTED;\n }\n\n public loadWavWorker() {\n if(this.wavWorker) return;\n\n this.wavWorker = new Worker('waveWorker.min.js');\n this.wavWorker.addEventListener('message', (e) => {\n const data = e.data;\n\n this.log('[WAV] got message:', data);\n if(data && data.page) {\n const bytes = data.page;\n this.onTaskEnd(this.tasks.shift(), bytes);\n }\n });\n }\n\n public loadWorker() {\n if(this.worker) return;\n\n this.worker = new Worker('decoderWorker.min.js');\n this.worker.addEventListener('message', (e) => {\n const data = e.data;\n\n this.log('[DECODER] got message', data);\n if(data.type === 'done') {\n // this.log('[DECODER] send done to wav');\n this.wavWorker.postMessage({command: 'done'});\n\n if(data.waveform) {\n this.tasks[0].waveform = data.waveform;\n }\n } else { // e.data contains decoded buffers as float32 values\n // this.log('[DECODER] send encode to wav');\n this.wavWorker.postMessage({\n command: 'encode',\n buffers: e.data\n }, IS_SAFARI ? undefined : data.map((typedArray: Uint8Array) => typedArray.buffer));\n }\n });\n }\n\n public setKeepAlive(keepAlive: boolean) {\n this.keepAlive = keepAlive;\n if(this.keepAlive) {\n this.loadWorker();\n this.loadWavWorker();\n } else if(!this.tasks.length) {\n this.terminateWorkers();\n }\n }\n\n public onTaskEnd(task: Task, result?: Uint8Array) {\n if(!result) {\n task.callback.reject('timeout');\n } else {\n clearTimeout(task.timeout);\n task.callback.resolve({bytes: result, waveform: task.waveform});\n }\n\n if(this.tasks.length) {\n this.executeNewTask(this.tasks[0]);\n }\n\n this.terminateWorkers();\n }\n\n public terminateWorkers(kill = false) {\n if((this.keepAlive || this.tasks.length) && !kill) return;\n\n if(this.worker) {\n this.worker.terminate();\n this.worker = null;\n }\n\n if(this.wavWorker) {\n this.wavWorker.terminate();\n this.wavWorker = null;\n }\n }\n\n public executeNewTask(task: Task) {\n this.worker.postMessage({\n command: 'init',\n decoderSampleRate: this.sampleRate,\n outputBufferSampleRate: this.sampleRate\n });\n\n this.wavWorker.postMessage({\n command: 'init',\n wavBitDepth: 16,\n wavSampleRate: this.sampleRate\n });\n\n // console.log('sending command to worker:', task);\n // setTimeout(() => {\n this.log('[DECODER] send decode');\n this.worker.postMessage({\n command: 'decode',\n pages: task.pages,\n waveform: task.withWaveform\n }, IS_SAFARI ? undefined : [task.pages.buffer]);\n // }, 1e3);\n\n task.timeout = window.setTimeout(() => {\n this.log.error('decode timeout'/* , task */);\n\n this.terminateWorkers(true);\n if(this.tasks.length) {\n this.loadWorker();\n this.loadWavWorker();\n }\n\n this.onTaskEnd(this.tasks.shift());\n }, 10e3);\n }\n\n public pushDecodeTask(pages: Uint8Array, withWaveform: boolean) {\n return new Promise((resolve, reject) => {\n const task = {\n pages,\n withWaveform,\n callback: {resolve, reject},\n timeout: 0\n };\n\n this.loadWorker();\n this.loadWavWorker();\n\n if(this.tasks.push(task) === 1) {\n this.executeNewTask(task);\n }\n });\n }\n\n public async decode(typedArray: Uint8Array, withWaveform = false) {\n return this.pushDecodeTask(typedArray, withWaveform).then(async(result) => {\n const dataBlob = new Blob([result.bytes], {type: 'audio/wav'});\n return {url: await apiManagerProxy.invoke('createObjectURL', dataBlob), waveform: result.waveform};\n });\n }\n}\n\nconst opusDecodeController = new OpusDecodeController();\nMOUNT_CLASS_TO.opusDecodeController = opusDecodeController;\nexport default opusDecodeController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport emojiRegExp from '../../vendor/emoji/regex';\nimport {MessageEntity} from '../../layer';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nexport const ALPHA_CHARS_REG_EXP = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\n // user:pass authentication\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n '|' +\n // host name\n URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\nexport const URL_ANY_PROTOCOL_REG_EXP = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP, 'i');\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n// const markdownTestRegExp = /[`_*@~]/;\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nexport const SITE_HASHTAGS: {[siteName: string]: string} = {\n 'Telegram': 'tg://search_hashtag?hashtag={1}',\n 'Twitter': 'https://twitter.com/hashtag/{1}',\n 'Instagram': 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\n// Telegram: '#{1}',\n// Twitter: 'https://twitter.com/{1}',\n// Instagram: 'https://instagram.com/{1}/',\n// GitHub: 'https://github.com/{1}'\n// };\n\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nexport const PASS_CONFLICTING_ENTITIES: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(const i in MARKDOWN_ENTITIES) {\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\n}\n\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\n\n/* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n} */\n\n\n/* export function replaceUrlEncodings(urlWithEncoded: string) {\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, (str) => {\n try {\n return decodeURIComponent(str);\n } catch (e) {\n return str;\n }\n });\n} */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type addAnchorListener from '../../helpers/addAnchorListener';\nimport {PHONE_NUMBER_REG_EXP} from '.';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport matchUrlProtocol from './matchUrlProtocol';\nimport {T_ME_PREFIXES} from '../mtproto/mtproto_config';\n\nexport default function wrapUrl(url: string, unsafe?: number | boolean) {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n\n const out: {url: string, onclick?: Parameters[0]['name']} = {url};\n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: typeof out['onclick'];\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?(?:(.+?)\\.)?(?:(?:web|k|z)\\.)?t(?:elegram)?\\.me(?:\\/(.+))?/))) {\n const u = new URL(url);\n let prefix = tgMeMatch[1];\n if(prefix && T_ME_PREFIXES.has(tgMeMatch[1])) {\n prefix = undefined;\n }\n\n if(prefix) {\n u.pathname = prefix + (u.pathname === '/' ? '' : u.pathname);\n }\n\n const fullPath = u.pathname.slice(1);\n const path = fullPath.split('/');\n\n if(path[0] && path[0][0] === '$' && path[0].length > 1) {\n onclick = 'invoice';\n } else if(/^\\W/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) { // second regexp is for phone numbers (t.me/+38050...)\n onclick = 'joinchat';\n } else switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'addemoji':\n case 'voicechat':\n case 'invoice':\n if(path.length !== 1 && !prefix) {\n onclick = path[0];\n break;\n }\n\n default:\n if((path[1] && path[1].match(/^\\d+(?:\\?(?:comment|thread)=\\d+)?$/)) || path.length === 1) {\n onclick = 'im';\n break;\n }\n\n break;\n }\n } else if((telescoPeMatch = url.match(/^(?:https?:\\/\\/)?telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\n onclick = 'im';\n } else if((tgMatch = url.match(/tg:(?:\\/\\/)?(.+?)(?:\\?|$)/))) {\n onclick = 'tg_' + tgMatch[1] as any;\n }/* else if(unsafe) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } */\n\n if(!(window as any)[onclick]) {\n onclick = undefined;\n }\n\n out.onclick = onclick;\n return out;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.wrapUrl = wrapUrl);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall, Config, Reaction} from '../layer';\nimport type {Dialog, ForumTopic, MessagesStorageKey, MyMessage} from './appManagers/appMessagesManager';\nimport type {MyDialogFilter} from './storages/filters';\nimport type {Folder} from './storages/dialogs';\nimport type {UserTyping} from './appManagers/appProfileManager';\nimport type {MyDraftMessage} from './appManagers/appDraftsManager';\nimport type {ConnectionStatusChange} from './mtproto/connectionStatus';\nimport type {GroupCallId} from './appManagers/appGroupCallsManager';\nimport type {AppManagers} from './appManagers/managers';\nimport type {State} from '../config/state';\nimport type {Progress} from './appManagers/appDownloadManager';\nimport type {CallId} from './appManagers/appCallsManager';\nimport type {MyDocument} from './appManagers/appDocsManager';\nimport type {MTAppConfig} from './mtproto/appConfig';\nimport {NULL_PEER_ID, UserAuth} from './mtproto/mtproto_config';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\nimport {IS_WORKER} from '../helpers/context';\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n 'chat_toggle_forum': {chatId: ChatId, enabled: boolean},\n\n 'channel_update': ChatId,\n\n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, threadId?: number, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': {peerId: PeerId, threadId?: number},\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Omit,\n\n 'dialog_draft': {peerId: PeerId, dialog: Dialog | ForumTopic, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog | ForumTopic},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': Dialog | ForumTopic,\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n // 'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog | ForumTopic,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': Map}>,\n\n 'history_append': {storageKey: MessagesStorageKey, message: Message.message},\n 'history_update': {storageKey: MessagesStorageKey, message: MyMessage, sequential?: boolean},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': MyMessage,\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n // 'history_request': void,\n\n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_error': {storageKey: MessagesStorageKey, tempId: number, error: ApiError},\n 'messages_views': {peerId: PeerId, mid: number, views: number}[],\n 'messages_reactions': {message: Message.message, changedResults: ReactionCount[]}[],\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': Message.message,\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n 'stickers_updated': {type: 'recent' | 'faved', stickers: MyDocument[]},\n 'stickers_top': Long,\n 'sticker_updated': {type: 'recent' | 'faved', document: MyDocument, faved: boolean},\n\n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n\n 'contacts_update': UserId,\n 'avatar_update': {peerId: PeerId, threadId?: number},\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n // 'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any, settings: State['settings']},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n\n 'background_change': void,\n\n 'privacy_update': Update.updatePrivacy,\n\n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n\n 'notification_reset': string,\n 'notification_cancel': string,\n\n 'language_change': string,\n\n 'theme_change': void,\n\n 'media_play': void,\n\n 'emoji_recent': AppEmoji,\n\n 'download_progress': Progress,\n 'document_downloading': DocId,\n 'document_downloaded': DocId,\n\n 'choosing_sticker': boolean\n\n 'group_call_update': GroupCall,\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_update': PhoneCall,\n 'call_signaling': {callId: CallId, data: Uint8Array},\n\n 'quick_reaction': Reaction,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void,\n\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService}\n\n 'premium_toggle': boolean,\n 'premium_toggle_private': {isNew: boolean, isPremium: boolean},\n\n 'config': Config,\n 'app_config': MTAppConfig\n};\n\nexport type BroadcastEventsListeners = {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n};\n\nexport class RootScope extends EventListenerBase {\n public myId: PeerId;\n private connectionStatus: {[name: string]: ConnectionStatusChange};\n public settings: State['settings'];\n public managers: AppManagers;\n public premium: boolean;\n\n constructor() {\n super();\n\n this.myId = NULL_PEER_ID;\n this.connectionStatus = {};\n this.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\n });\n\n this.addEventListener('premium_toggle_private', ({isNew, isPremium}) => {\n this.premium = isPremium;\n\n if(!isNew) {\n this.dispatchEventSingle('premium_toggle', isPremium);\n }\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n\n public getPremium() {\n return this.premium;\n }\n\n public dispatchEventSingle(...args: any[]) {\n // @ts-ignore\n super.dispatchEvent(...args);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {WorkerTaskVoidTemplate} from '../../types';\n\nexport interface ConvertWebPTask extends WorkerTaskVoidTemplate {\n type: 'convertWebp',\n payload: {\n fileName: string,\n bytes: Uint8Array\n }\n};\n\nexport class WebpWorkerController {\n private worker: Worker;\n private convertPromises: {[fileName: string]: CancellablePromise} = {};\n\n private init() {\n this.worker = new Worker(new URL('./webp.worker.ts', import.meta.url));\n this.worker.addEventListener('message', (e) => {\n const task = e.data as ConvertWebPTask;\n const payload = task.payload;\n\n const promise = this.convertPromises[payload.fileName];\n if(promise) {\n payload.bytes ? promise.resolve(payload.bytes) : promise.reject();\n delete this.convertPromises[payload.fileName];\n }\n });\n }\n\n private postMessage(data: ConvertWebPTask) {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.worker.postMessage(data);\n }\n\n public convert(fileName: string, bytes: Uint8Array) {\n if(this.convertPromises.hasOwnProperty(fileName)) {\n return this.convertPromises[fileName];\n }\n\n const convertPromise = deferredPromise();\n\n this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});\n\n return this.convertPromises[fileName] = convertPromise;\n }\n}\n\nconst webpWorkerController = new WebpWorkerController();\nMOUNT_CLASS_TO.webpWorkerController = webpWorkerController;\nexport default webpWorkerController;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"589\":\"crypto.worker\",\"630\":\"npm.qr-code-styling\",\"670\":\"sw\",\"678\":\"mtproto.worker\"}[chunkId] || chunkId) + \".\" + {\"8\":\"570e6da51a125009c156\",\"53\":\"77c5dab45a68d1851187\",\"61\":\"3cfffcdc0849ca3fc87c\",\"63\":\"0d39a81590990db74d39\",\"77\":\"18305e1bd331a0fdd36c\",\"104\":\"c914ddc183166c9696a7\",\"231\":\"1462b405fc6da56ba47b\",\"301\":\"42dc636f96a62f6a08c8\",\"339\":\"79c7f9c2341eeff66b88\",\"392\":\"198d4679664c1bf4c989\",\"436\":\"47558d0a092967b3c966\",\"437\":\"d40e517d52e5dcf3b754\",\"442\":\"645fe71c30545d9700d2\",\"460\":\"67f684b92b25fc4ed361\",\"508\":\"ffe1001d2cc7df6d2eb6\",\"539\":\"17a0b07b4e6476f19654\",\"589\":\"4909ec7e814298d58e2b\",\"630\":\"2c5d57550714b1a9e42e\",\"641\":\"11406cec52b05304f14f\",\"642\":\"fd1ade69544ad78671c6\",\"670\":\"33885da34018d6fb111e\",\"678\":\"a47a496f3c7a877087bb\",\"709\":\"73c949c4c6702cdf349b\",\"776\":\"b547f5293903351f3ec7\",\"781\":\"af546badf2c525815889\",\"783\":\"827711558099e62fd694\",\"810\":\"f272bad8a3948af5c8d0\",\"813\":\"06763bece6721fb81fde\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [85,946], () => (__webpack_require__(6873)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","IS_BETA","DEBUG","MOUNT_CLASS_TO","window","self","STATE_VERSION","BUILD","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsListCachedTime","updates","filtersArr","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","recentCustomEmoji","topPeersCache","recentSearch","version","build","authState","_","IS_MOBILE","hiddenPinnedMessages","settings","messagesTextSize","distanceUnit","sendShortcut","animationsEnabled","autoDownload","photo","contacts","private","groups","channels","video","file","autoDownloadNew","file_size_max","pFlags","video_preload_large","audio_preload_next","photo_size_max","video_size_max","video_upload_maxbitrate","autoPlay","gifs","videos","stickers","suggest","loop","emoji","big","themes","name","background","blur","slug","color","highlightningColor","intensity","id","theme","notifications","sound","timeFormat","toLocaleString","match","playbackParams","volume","muted","playbackRate","playbackRates","voice","audio","round","keepSigned","chatContextMenuHintWasShown","stateId","notifySettings","IS_APPLE_MX","ctx","document","createElement","getContext","extension","getExtension","renderer","getParameter","UNMASKED_RENDERER_WEBGL","getSupportedExtensions","indexOf","err","CAN_USE_TRANSFERABLES","IS_SAFARI","navigator","userAgent","search","geolocation","getCurrentPosition","IMAGE_MIME_TYPES_SUPPORTED","Set","add","arr","concat","canPlayType","IS_APPLE_MOBILE","replace","IS_FIREFOX","mediaDevices","DocumentTouch","USER_AGENT","IS_APPLE","IS_ANDROID","toLowerCase","IS_CHROMIUM","test","vendor","platform","maxTouchPoints","IS_MOBILE_SAFARI","vibrate","VIDEO_MIME_TYPES_SUPPORTED","toDataURL","startsWith","rgbaToHsla","r","g","b","a","max","Math","min","h","s","l","d","hslaToRgba","hue2rgb","p","q","t","hexaToRgba","hexa","offset","length","slice","i","push","parseInt","hexToRgb","hex","hexaToHsla","rgba","rgbaToHexa","map","v","toString","join","hslaStringToHex","hsla","splitted","split","alpha","pop","val","endsWith","hslaStringToRgba","hslaStringToHexa","compareVersion","v1","v2","s1","s2","blurActiveElement","activeElement","cancelEvent","event","cancelable","originalEvent","stopPropagation","preventDefault","returnValue","cancelBubble","findUpClassName","el","className","closest","fixSafariStickyInput","input","style","transform","focus","then","IS_STICKY_INPUT_BUGGED","key","startY","o","capture","passive","onTouchMove","e","touch","touches","scrollable","target","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","lastFocusOutTimeStamp","addEventListener","classList","contains","timeStamp","touchStart","removeEventListener","fixSafariStickyInputFocusing","texts","cache","fonts","text","icons","monospace","loadFonts","types","undefined","Promise","resolve","promises","type","_texts","font","weights","weight","_promises","load","race","all","catch","setInnerHTML","elem","html","setDirection","innerHTML","replaceChildren","setAttribute","FOCUS_EVENT_NAME","IdleController","constructor","super","this","_isIdle","focusPromise","focusResolve","isIdle","once","idle","getFocusPromise","value","dispatchEvent","OverlayCounter","overlaysActive","isOverlayActive","fastRafCallbacks","fastRaf","callback","requestAnimationFrame","currentCallbacks","forEach","cb","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","doubleRaf","parseUriParams","uri","params","item","decodeURIComponent","themeController","setTheme","themeColorElem","_themeColorElem","head","querySelector","setThemeColor","themeColor","isNight","setThemeListener","darkModeMediaQuery","matchMedia","checkDarkMode","systemTheme","matches","addListener","applyHighlightningColor","getTheme","documentElement","setProperty","removeProperty","colorScheme","toggle","workerHandler","construct","args","url","location","Worker","SharedWorker","filter","Boolean","w","Proxy","setWorkerProxy","Element","prototype","toggleAttribute","force","hasAttribute","removeAttribute","Node","nodes","textContent","append","rootScope","getProxiedManagers","getElementById","href","singleInstance","visualViewport","lastVH","setViewportVH","setVH","vh","overlayCounter","height","innerHeight","toggleResizeMode","tabId","onImTabChange","wasTabId","tagName","appMediaViewer","perf","performance","langPromise","stateResult","langPack","fadeInWhenFontsReady","promise","opacity","state","isPremium","appVersion","lang_code","console","log","dir","hash","tgWebAuthToken","data","token","dcId","tgWebAuthDcId","userId","tgWebAuthUserId","toUserId","isTest","tgWebAuthTest","tgAddr","tgaddr","urlSearchParams","URLSearchParams","set","delete","pagePromise","placeholder","prepend","cloneNode","meModule","pushModule","default","setAuthorized","forceUnsubscribe","mount","sentCode","authCode","pause","ready","reload","close","DEBUG_MANAGER_REQUESTS","createProxyProxy","proxied","ack","get","receiver","method","has","warn","createProxy","acknowledged","IDB","db","storageIsAvailable","openDatabase","INSTANCES","isAvailable","createNew","openDbPromise","createIndexes","os","store","indexNames","Array","from","indexName","deleteIndex","indexes","index","createIndex","keyPath","objectParameters","request","indexedDB","open","reject","error","message","finished","setTimeout","onerror","onsuccess","result","calledNew","onclose","onabort","transaction","onversionchange","onupgradeneeded","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","static","find","instance","preserve","storage","IDBStorage","storeName","idb","create","entryName","isArray","getObjectStore","clear","save","idx","put","mode","onError","clearTimeout","timeout","onComplete","results","requests","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","getAll","UNSUPPORTED_LANG_PACK_KEY","I18n","pluralRules","cacheLangPackPromise","setLangCode","langCode","lastRequestedLangCode","lastRequestedNormalizedLangCode","updateAmPm","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","date","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","lang","langSign","countries","strings","formatLocalStrings","saveLangPack","from_version","local","loadLangPack","web","requestedServerLanguage","managers","apiManager","invokeApiCacheable","lang_pack","polyfillPromise","pushTo","applyLangPack","currentLangCode","Intl","PluralRules","string","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","querySelectorAll","element","weakMap","update","superFormatter","indexHolder","out","lastIndex","p1","p2","p3","p4","lastIndexOf","wrappedUrl","onclick","DocumentFragment","firstChild","arg","pushNextArgument","plain","str","select","Map","isRTL","setRTL","rtl","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","keys","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","_Intl","Object","assign","WeakMap","IntlElementBase","options","property","IntlElement","formatted","dataset","compareAndUpdate","json","JSON","stringify","DateTimeFormat","hours","getHours","getMinutes","i18n","i18n_","_i18n","joinElementsWith","elements","joiner","isLast","useLast","joined","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","MAX_FILE_SAVE_SIZE","THUMB_TYPE_FULL","TOPIC_COLORS","ATTACH_MENU_BOT_ICON_NAME","GENERAL_TOPIC_ID","T_ME_PREFIXES","FOLDER_ID_ALL","FOLDER_ID_ARCHIVE","REAL_FOLDERS","IS_CALL_SUPPORTED","IS_CANVAS_FILTER_SUPPORTED","IS_EMOJI_SUPPORTED","IS_GEOLOCATION_SUPPORTED","IS_GROUP_CALL_SUPPORTED","IS_MOV_SUPPORTED","IS_PARALLAX_SUPPORTED","IS_SCREEN_SHARING_SUPPORTED","IS_TOUCH_SUPPORTED","IS_VIBRATE_SUPPORTED","IS_OPUS_SUPPORTED","IS_SHARED_WORKER_SUPPORTED","IS_WEBM_SUPPORTED","IS_WEBP_SUPPORTED","IS_WEBRTC_SUPPORTED","MEDIA_MIME_TYPES_SUPPORTED","ALL_KEYS","REFRESH_KEYS","loadStateInner","logger","totalPerf","recordPromise","stateStorage","sessionStorage","pushedKeys","pushToState","copy","splice","auth","shift","sessionBuild","shiftedWebKAuth","values","dcID","toPeerId","obj","resetStorages","chats","dialogs","users","_state","state_id","time","hasOwnProperty","nightTheme","autoDownloadSettings","oldTypes","mediaType","peerTypeSettings","peerType","validateInitObject","missingKey","migrated","newTheme","k_build","ApiManagerProxy","onMirrorTask","payload","mirrors","mirror","tabState","chatPeerIds","idleStartTime","registerWorker","registerServiceWorker","registerCryptoWorker","addMultipleEventsListeners","convertWebp","fileName","bytes","webpWorkerController","convertOpus","opusDecodeController","localStorageProxy","storageTask","language","toggleStorages","telegramMeWebManager","webPushApiManager","cacheName","caches","appRuntimeManager","idleController","updateTabStateIdle","invoke","pingServiceWorkerWithIframe","pingServiceWorkerPromise","iframe","hidden","onLoad","remove","src","random","body","attachServiceWorker","serviceWorker","lastServiceWorker","serviceMessagePort","detachPort","attachSendPort","invokeVoid","_registerServiceWorker","register","URL","scope","registration","active","controller","unregister","installing","waiting","worker","attachListenPort","port","source","ports","hello","resendLockTask","originals","originalUrl","createWorker","attachWorkerToPort","cryptoMessagePort","blob","fetch","response","pathnameSplitted","pathname","origin","Blob","onWorkerFirstMessage","messagePort","attachPort","loadState","sendState","invokeCrypto","enabled","clearWrite","getMirror","getState","updateTabState","apiManagerProxy","IS_MULTIPLE_TABS_SUPPORTED","SingleInstance","clearInstance","masterInstance","deactivated","checkInstance","newInstance","instanceId","curInstance","deactivateInstance","xt_instance","clearDeactivateTimeout","deactivateTimeout","deactivatedReason","start","reset","started","setInterval","activateInstance","reason","TelegramMeWebManager","disabled","hostname","canRedirect","curValue","ts","tsNow","tgme_sync","path","encodeURIComponent","script","onload","appendChild","loadScript","WebPushApiManager","isPushEnabled","localNotificationsAvailable","isFirefox","userVisibleOnly","subscribe","reg","pushManager","subscription","pushSubscriptionNotify","Notification","permission","isAliveNotify","baseUrl","ACTIONS_LANG_MAP","push_action_mute1d","push_action_settings","push_message_nopreview","action","localNotifications","isAliveTO","getSubscription","setUpServiceWorkerChannel","setLocalNotificationsDisabled","unsubscribe","successful","setSettings","newSettings","hidePushNotifications","subscriptionObj","toJSON","endpoint","p256dh","tokenType","tokenValue","sampleRate","tasks","keepAlive","isPlaySupported","loadWavWorker","wavWorker","page","onTaskEnd","loadWorker","postMessage","command","waveform","buffers","typedArray","buffer","setKeepAlive","terminateWorkers","task","executeNewTask","kill","terminate","decoderSampleRate","outputBufferSampleRate","wavBitDepth","wavSampleRate","pages","withWaveform","pushDecodeTask","decode","dataBlob","ALPHA_CHARS_REG_EXP","ALPHA_NUMERIC_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","RegExp","USERNAME_REG_EXP","BOT_COMMAND_REG_EXP","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","SITE_HASHTAGS","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","wrapUrl","unsafe","tgMeMatch","telescoPeMatch","tgMatch","u","prefix","fullPath","RootScope","myId","connectionStatus","premium","isNew","dispatchEventSingle","status","getConnectionStatus","getPremium","convertPromises","init","convert","convertPromise","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","every","n","getter","__esModule","getPrototypeOf","ns","def","current","getOwnPropertyNames","definition","defineProperty","enumerable","f","chunkId","reduce","miniCssF","globalThis","Function","prop","done","needAttach","scripts","getElementsByTagName","getAttribute","charset","nc","onScriptComplete","prev","doneFns","parentNode","removeChild","bind","Symbol","toStringTag","scriptUrl","importScripts","currentScript","Error","oldGetScript","oldLoadScript","queryMap","countMap","retries","realSrc","cacheBust","baseURI","installedChunks","installedChunkData","errorType","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.dcfbf05ad6e4f6f73d42.bundle.js b/public/main.dcfbf05ad6e4f6f73d42.bundle.js deleted file mode 100644 index c42744a9f..000000000 --- a/public/main.dcfbf05ad6e4f6f73d42.bundle.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{"use strict";var e,t,n,s,i,o={410:(e,t,n)=>{n.d(t,{GO:()=>r,Tj:()=>i,ZP:()=>a});var s=n(1267);const i=!1,o=i||s.Z.debug,r="undefined"!=typeof window?window:self,a=o},236:(e,t,n)=>{n.d(t,{h:()=>c});var s=n(4762),i=n(144),o=n(4159);const r=o.Z.version,a=o.Z.build,c={allDialogsLoaded:{},pinnedOrders:{},contactsListCachedTime:0,updates:{},filtersArr:[],maxSeenMsgId:0,stateCreatedTime:Date.now(),recentEmoji:[],recentCustomEmoji:[],topPeersCache:{},recentSearch:[],version:r,build:a,authState:{_:s.IS_MOBILE?"authStateSignIn":"authStateSignQr"},hiddenPinnedMessages:{},settings:{messagesTextSize:16,distanceUnit:"kilometers",sendShortcut:"enter",animationsEnabled:!0,autoDownload:{photo:{contacts:!0,private:!0,groups:!0,channels:!0},video:{contacts:!0,private:!0,groups:!0,channels:!0},file:{contacts:!0,private:!0,groups:!0,channels:!0}},autoDownloadNew:{_:"autoDownloadSettings",file_size_max:3145728,pFlags:{video_preload_large:!0,audio_preload_next:!0},photo_size_max:1048576,video_size_max:15728640,video_upload_maxbitrate:100},autoPlay:{gifs:!0,videos:!0},stickers:{suggest:!0,loop:!0},emoji:{suggest:!0,big:!0},themes:[{name:"day",background:s.IS_MOBILE?{blur:!1,slug:"",color:"#dbddbb,#6ba587,#d5d88d,#88b884",highlightningColor:"hsla(86.4, 43.846153%, 45.117647%, .4)",intensity:0,id:"1"}:{blur:!1,slug:"pattern",color:"#dbddbb,#6ba587,#d5d88d,#88b884",highlightningColor:"hsla(86.4, 43.846153%, 45.117647%, .4)",intensity:50,id:"1"}},{name:"night",background:s.IS_MOBILE?{blur:!1,slug:"",color:"#0f0f0f",highlightningColor:"hsla(0, 0%, 3.82353%, 0.4)",intensity:0,id:"-1"}:{blur:!1,slug:"pattern",color:"#fec496,#dd6cb9,#962fbf,#4f5bd5",highlightningColor:"hsla(299.142857, 44.166666%, 37.470588%, .4)",intensity:-50,id:"-1"}}],theme:"system",notifications:{sound:!1},timeFormat:(new Date).toLocaleString().match(/\s(AM|PM)/)?"h12":"h23"},playbackParams:{volume:1,muted:!1,playbackRate:1,playbackRates:{voice:1,video:1,audio:1},loop:!1,round:!1},keepSigned:!0,chatContextMenuHintWasShown:!1,stateId:(0,i.d)(32),notifySettings:{}}},8189:(e,t,n)=>{n.d(t,{Z:()=>i});let s=!1;try{const e=document.createElement("canvas").getContext("webgl"),t=e.getExtension("WEBGL_debug_renderer_info"),n=t&&e.getParameter(t.UNMASKED_RENDERER_WEBGL)||"";(n.match(/Apple/)&&!n.match(/Apple GPU/)||-1===e.getSupportedExtensions().indexOf("WEBGL_compressed_texture_s3tc_srgb"))&&(s=!0)}catch(e){}const i=s},993:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n(4089).Z},7328:(e,t,n)=>{let s;if(n.d(t,{Z:()=>i}),n(4762).IS_SAFARI)try{s=+navigator.userAgent.match(/Version\/(.+?) /)[1]>=14}catch(e){s=!1}else s=!0;const i=s},6663:(e,t,n)=>{n.d(t,{Z:()=>s});const s="filter"in(document.createElement("canvas").getContext("2d")||{})},9976:(e,t,n)=>{n.d(t,{Z:()=>s});const s=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i)},3731:(e,t,n)=>{var s;n.d(t,{Z:()=>i});const i=!!(null===(s=null===navigator||void 0===navigator?void 0:navigator.geolocation)||void 0===s?void 0:s.getCurrentPosition)&&!1},6818:(e,t,n)=>{n.d(t,{Z:()=>s});const s=n(4089).Z},1174:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(5269);const i=new Set(["image/jpeg","image/png","image/bmp"]);s.Z&&i.add("image/webp");const o=i},2341:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(1174),i=n(554);const o=[...s.Z].concat([...i.Z]),r=new Set(o)},9030:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!!document.createElement("video").canPlayType("video/quicktime")||s.IS_SAFARI||s.IS_APPLE_MOBILE},5783:(e,t,n)=>{n.d(t,{Z:()=>i});const s=document.createElement("audio"),i=!(!s.canPlayType||!s.canPlayType("audio/ogg;").replace(/no/,""))},2365:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!n(4762).IS_FIREFOX&&!1},2820:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!!("getDisplayMedia"in((null===navigator||void 0===navigator?void 0:navigator.mediaDevices)||{}))},2045:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(1267);const i="undefined"!=typeof SharedWorker&&!s.Z.noSharedWorker},5432:(e,t,n)=>{n.d(t,{Z:()=>s});const s="ontouchstart"in window||window.DocumentTouch&&document instanceof DocumentTouch},4762:(e,t,n)=>{n.r(t),n.d(t,{IS_ANDROID:()=>r,IS_APPLE:()=>o,IS_APPLE_MOBILE:()=>c,IS_CHROMIUM:()=>a,IS_FIREFOX:()=>d,IS_MOBILE:()=>h,IS_MOBILE_SAFARI:()=>u,IS_SAFARI:()=>l,USER_AGENT:()=>i});var s=n(6761);const i=navigator?navigator.userAgent:null,o=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),r=-1!==navigator.userAgent.toLowerCase().indexOf("android"),a=/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),c=(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&!s.Z.MSStream,l=!!("safari"in s.Z)||!(!i||!(/\b(iPad|iPhone|iPod)\b/.test(i)||i.match("Safari")&&!i.match("Chrome"))),d=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,u=l&&c,h=navigator.maxTouchPoints>0&&-1!=navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},2131:(e,t,n)=>{n.d(t,{Z:()=>s});const s=!!(null===navigator||void 0===navigator?void 0:navigator.vibrate)},554:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(9030);const i=new Set(["image/gif","video/mp4","video/webm"]);s.Z&&i.add("video/quicktime");const o=i},393:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!!document.createElement("video").canPlayType("video/webm")&&!s.IS_SAFARI&&!s.IS_APPLE_MOBILE},5269:(e,t,n)=>{n.d(t,{Z:()=>s});const s=document.createElement("canvas").toDataURL("image/webp").startsWith("data:image/webp")},4089:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(4762);const i=!("undefined"==typeof RTCPeerConnection||s.IS_FIREFOX)},2064:(e,t,n)=>{function s(e,t,n,s=1){e/=255,t/=255,n/=255;const i=Math.max(e,t,n),o=Math.min(e,t,n);let r,a;const c=(i+o)/2;if(i===o)r=a=0;else{const s=i-o;switch(a=c>.5?s/(2-i-o):s/(i+o),i){case e:r=(t-n)/s+(t1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e},a=n<.5?n*(1+t):n+t-n*t,c=2*n-a;i=s(c,a,e+1/3),o=s(c,a,e),r=s(c,a,e-1/3)}return[Math.round(255*i),Math.round(255*o),Math.round(255*r),Math.round(255*s)]}function o(e){const t=[],n="#"===e[0]?1:0;if(e.length===5+n&&(e=(n?"#":"")+"0"+e.slice(n)),e.length===3+n)for(let s=n;s("0"+e.toString(16)).slice(-2))).join("")}function l(e){return function(e){return c(function(e){const t=e.slice(5,-1).split(", "),n=+t.pop(),s=t.map((e=>e.endsWith("%")?+e.slice(0,-1):+e));return i(s[0],s[1],s[2],n)}(e))}(e).slice(0,-2)}n.d(t,{K5:()=>l,Pi:()=>o,Y6:()=>i,cw:()=>a,dI:()=>s,oo:()=>r,t1:()=>c})},6009:(e,t,n)=>{function s(e,t){e=e.split(" ",1)[0],t=t.split(" ",1)[0];const n=e.split("."),s=t.split(".");for(let e=0;ei)return 1;if(ts})},8799:(e,t,n)=>{function s(){var e;return!!(null===(e=document.activeElement)||void 0===e?void 0:e.blur)&&(document.activeElement.blur(),!0)}n.d(t,{Z:()=>s})},3910:(e,t,n)=>{function s(e){if(e||(e=window.event),e){if(!e.cancelable)return!1;e=e.originalEvent||e;try{e.stopPropagation&&e.stopPropagation(),e.preventDefault&&e.preventDefault(),e.returnValue=!1,e.cancelBubble=!0}catch(e){}}return!1}n.d(t,{Z:()=>s})},8497:(e,t,n)=>{function s(e,t){return e.closest("."+t)}n.d(t,{Z:()=>s})},5494:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(3035);function i(e){e.style.transform="translateY(-99999px)",e.focus(),(0,s.d1)().then((()=>{e.style.transform=""}))}},8090:(e,t,n)=>{n.d(t,{T:()=>a,Z:()=>c});var s=n(5432),i=n(4762),o=n(8497),r=n(5494);const a=i.IS_SAFARI&&i.IS_MOBILE&&s.Z;if(a){const e="clientY";let t=0;const n={capture:!0,passive:!1},s=n=>{const s=n.touches[0],i=(0,o.Z)(s.target,"scrollable-y");if(i){const o=s[e],r=t-o,a=i.scrollTop,c=i.scrollHeight,l=i.clientHeight,d=a?Math.round(a+i.clientHeight+r):a+r;(c===l||d>=c||d<=0)&&n.preventDefault()}else n.preventDefault()};let i=0;document.addEventListener("focusin",(o=>{!o.target.classList.contains("is-sticky-input-bugged")||o.timeStamp-i<50||((0,r.Z)(o.target),document.addEventListener("touchmove",s,n),document.addEventListener("touchstart",(n=>{if(n.touches.length>1)return;const s=n.touches[0];t=s[e]})))}),{passive:!0}),document.addEventListener("focusout",(e=>{document.removeEventListener("touchmove",s,n),i=e.timeStamp}),{passive:!0}),document.addEventListener("visibilitychange",(()=>{document.activeElement&&document.activeElement.classList.contains("is-sticky-input-bugged")&&document.activeElement.blur&&(0,r.Z)(document.activeElement)}),{passive:!0})}function c(e){a&&e.classList.add("is-sticky-input-bugged")}},4541:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(319),i=n(5418);const o=["b","б"],r={},a={text:"Roboto",icons:"tgico",monospace:"Roboto Mono"};function c(e={text:o,icons:void 0,monospace:o}){if(!("fonts"in document))return Promise.resolve();const t=[];for(const n in e){let s=e[n];"all"===s&&(s=o);const i=a[n],c="icons"===n?[500]:[400,500];for(const e of c){const n=(s||[void 0]).map((t=>{var n,s,o,a;const c=[e,"1rem",i].join(" ");return null!==(s=(o=null!==(n=r[c])&&void 0!==n?n:r[c]={})[a=t||""])&&void 0!==s?s:o[a]=document.fonts.load(c,t)}));t.push(...n)}}return Promise.race([Promise.all(t).catch(s.Z),(0,i.Z)(1e3)])}},2586:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(5432),i=n(3241);const o=s.Z?"touchstart":"mousemove";class r extends i.Z{constructor(){super(),this._isIdle=!0,this.focusPromise=Promise.resolve(),this.focusResolve=()=>{},window.addEventListener("blur",(()=>{this.isIdle=!0,window.addEventListener("focus",(()=>{this.isIdle=!1}),{once:!0})})),window.addEventListener(o,(()=>{this.isIdle=!1}),{once:!0,passive:!0}),this.addEventListener("change",(e=>{e?this.focusPromise=new Promise((e=>{this.focusResolve=e})):this.focusResolve()}))}getFocusPromise(){return this.focusPromise}get isIdle(){return this._isIdle}set isIdle(e){this._isIdle!==e&&(this._isIdle=e,this.dispatchEvent("change",e))}}const a=new r},3815:(e,t,n)=>{n.d(t,{Z:()=>o});var s=n(3241);class i extends s.Z{constructor(){super(...arguments),this.overlaysActive=0}get isOverlayActive(){return this.overlaysActive>0}set isOverlayActive(e){this.overlaysActive+=e?1:-1,this.dispatchEvent("change",this.isOverlayActive)}}const o=new i},3035:(e,t,n)=>{let s;function i(e){s?s.push(e):(s=[e],requestAnimationFrame((()=>{const e=s;s=void 0,e.forEach((e=>e()))})))}n.d(t,{AD:()=>l,T2:()=>i,TR:()=>c,d1:()=>d});let o,r,a=!1;function c(e){o?a?e():o.push(e):(o=[e],requestAnimationFrame((()=>{a=!0;for(let e=0;ei((()=>e())))),r.then((()=>{r=void 0})),r)}function d(){return new Promise((e=>{i((()=>{i(e)}))}))}},764:(e,t,n)=>{function s(e,t=e.split("?")){const n={};return t[1]?(t[1].split("&").forEach((e=>{n[e.split("=")[0]]=decodeURIComponent(e.split("=")[1])})),n):n}n.d(t,{Z:()=>s})},6714:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(5432),i=n(3512),o=n(2064);const r=new class{constructor(){i.Z.addEventListener("theme_change",(()=>{this.setTheme()}))}get themeColorElem(){return void 0!==this._themeColorElem?this._themeColorElem:this._themeColorElem=document.head.querySelector('[name="theme-color"]')||null}setThemeColor(e=this.themeColor){e||(e=this.isNight()?"#212121":"#ffffff");const t=this.themeColorElem;t&&t.setAttribute("content",e)}setThemeListener(){try{const e=window.matchMedia("(prefers-color-scheme: dark)"),t=()=>{this.systemTheme=e.matches?"night":"day",i.Z.myId?i.Z.dispatchEvent("theme_change"):this.setTheme()};"addEventListener"in e?e.addEventListener("change",t):"addListener"in e&&e.addListener(t),t()}catch(e){}}applyHighlightningColor(){let e;const t=r.getTheme();t.background.highlightningColor?(e=t.background.highlightningColor,document.documentElement.style.setProperty("--message-highlightning-color",e)):document.documentElement.style.removeProperty("--message-highlightning-color"),!s.Z&&e&&(r.themeColor=(0,o.K5)(e))}setTheme(){const e=this.isNight(),t=document.head.querySelector('[name="color-scheme"]');t&&t.setAttribute("content",e?"dark":"light"),document.documentElement.classList.toggle("night",e),this.setThemeColor(),this.applyHighlightningColor()}isNight(){return"night"===this.getTheme().name}getTheme(e=("system"===i.Z.settings.theme?this.systemTheme:i.Z.settings.theme)){return i.Z.settings.themes.find((t=>t.name===e))}},a=r},6873:(e,t,n)=>{var s=n(4159),i=n(8799),o=n(3910),r=n(8090),a=n(4541),c=n(9976),l=n(4762),d=n(5418);!function(){const e={construct(e,t){let n=t[0]+"";return 0!==n.indexOf("blob:")&&(n+=location.search),new e(n)}};[Worker,"undefined"!=typeof SharedWorker&&SharedWorker].filter(Boolean).forEach((t=>{window[t.name]=new Proxy(t,e)}))}();var u=n(3512),h=n(5432),g=n(2325),m=(n(4110),n(690),n(3855)),f=n(2554),v=n(6714),p=n(3815),b=n(490),S=n(764),w=n(1267),y=n(410);document.addEventListener("DOMContentLoaded",(()=>{return e=void 0,t=void 0,k=function*(){Element.prototype.toggleAttribute||(Element.prototype.toggleAttribute=function(e,t){return void 0!==t&&(t=!!t),this.hasAttribute(e)?!!t||(this.removeAttribute(e),!1):!1!==t&&(this.setAttribute(e,""),!0)}),void 0===Node.prototype.replaceChildren&&(Node.prototype.replaceChildren=function(...e){this.textContent="",e&&this.append(...e)}),u.Z.managers=(0,f.Z)(),document.getElementById("manifest").href=`site${l.IS_APPLE&&!l.IS_APPLE_MOBILE?"_apple":""}.webmanifest?v=jw3mK7G9Aq`,b.Z.start();const e=window.visualViewport||window;let t,P=!1;const k=()=>{const n=.01*(P&&!p.Z.isOverlayActive?e.height||e.innerHeight:window.innerHeight);t!==n&&(h.Z&&t1&&(0,i.Z)(),t=n,document.documentElement.style.setProperty("--vh",`${n}px`))};if(window.addEventListener("resize",k),k(),r.T){const t=()=>{P=1===n&&r.T&&!p.Z.isOverlayActive,k(),e!==window&&(P?(window.removeEventListener("resize",k),e.addEventListener("resize",k)):(e.removeEventListener("resize",k),window.addEventListener("resize",k)))};let n;window.onImTabChange=e=>{const s=void 0!==n;n=e,(s||1===n)&&t()},p.Z.addEventListener("change",(()=>{t()}))}l.IS_FIREFOX&&!c.Z&&document.addEventListener("dragstart",(e=>{const t=e.target;if("IMG"===t.tagName&&t.classList.contains("emoji"))return(0,o.Z)(e),!1})),c.Z&&document.documentElement.classList.add("native-emoji"),document.addEventListener("dragstart",(e=>{var t;if("IMG"===(null===(t=e.target)||void 0===t?void 0:t.tagName))return e.preventDefault(),!1})),document.addEventListener("contextmenu",(e=>{"IMG"!==e.target.tagName||window.appMediaViewer||(0,o.Z)(e)})),l.IS_FIREFOX&&document.documentElement.classList.add("is-firefox","no-backdrop"),l.IS_MOBILE&&document.documentElement.classList.add("is-mobile"),l.IS_APPLE?(l.IS_SAFARI&&document.documentElement.classList.add("is-safari"),l.IS_APPLE_MOBILE?document.documentElement.classList.add("is-ios"):document.documentElement.classList.add("is-mac")):l.IS_ANDROID&&document.documentElement.classList.add("is-android"),h.Z?document.documentElement.classList.add("is-touch"):document.documentElement.classList.add("no-touch");const E=performance.now(),A=g.ZP.getCacheLangPack(),[_,Z]=yield Promise.all([m.Z.sendState().then((([e])=>e)),A]);function I(e,t){e.style.opacity="0",t.then((()=>{window.requestAnimationFrame((()=>{e.style.opacity=""}))}))}g.ZP.setTimeFormat(_.state.settings.timeFormat),u.Z.managers.rootScope.getPremium().then((e=>{u.Z.premium=e})),v.Z.setThemeListener(),Z.appVersion!==s.Z.langPackVersion&&g.ZP.getLangPack(Z.lang_code),console.log("got state, time:",performance.now()-E),"ar"===Z.lang_code&&y.Tj,document.documentElement.dir="ltr";let C=_.state.authState;const L=location.hash,T=L.split("?"),O=(0,S.Z)(L,T);if(O.tgWebAuthToken&&"authStateSignedIn"!==C._){const e={token:O.tgWebAuthToken,dcId:+O.tgWebAuthDcId,userId:O.tgWebAuthUserId.toUserId(),isTest:void 0!==O.tgWebAuthTest&&!!+O.tgWebAuthTest,tgAddr:O.tgaddr};if(e.isTest!==w.Z.test){const e=new URLSearchParams(location.search);return+O.tgWebAuthTest?e.set("test","1"):e.delete("test"),void(location.search=e.toString())}u.Z.managers.appStateManager.pushToState("authState",C={_:"authStateSignImport",data:e})}if("authStateSignedIn"!==C._){console.log("Will mount auth page:",C._,Date.now()/1e3);const e=document.getElementById("auth-pages");let t,s;if(e){t=e.querySelector(".scrollable"),h.Z&&!l.IS_MOBILE_SAFARI||t.classList.add("no-scrollbar"),t.style.opacity="0";const n=document.createElement("div");n.classList.add("auth-placeholder"),t.prepend(n),t.append(n.cloneNode())}try{yield Promise.all([Promise.resolve().then(n.bind(n,2831)),Promise.resolve().then(n.bind(n,6702))]).then((([e,t])=>{e.default.setAuthorized(!1),t.default.forceUnsubscribe()}))}catch(e){}switch(C._){case"authStateSignIn":s=(yield Promise.all([n.e(539),n.e(460),n.e(63)]).then(n.bind(n,810))).default.mount();break;case"authStateSignQr":s=(yield Promise.all([n.e(539),n.e(460),n.e(709)]).then(n.bind(n,9709))).default.mount();break;case"authStateAuthCode":s=(yield Promise.all([n.e(539),n.e(460),n.e(53)]).then(n.bind(n,6392))).default.mount(C.sentCode);break;case"authStatePassword":s=(yield Promise.all([n.e(539),n.e(460),n.e(437)]).then(n.bind(n,9437))).default.mount();break;case"authStateSignUp":s=(yield Promise.all([n.e(539),n.e(460),n.e(339)]).then(n.bind(n,8339))).default.mount(C.authCode);break;case"authStateSignImport":s=(yield Promise.all([n.e(539),n.e(460),n.e(231)]).then(n.bind(n,3231))).default.mount(C.data)}t&&(s&&(yield s),I(t,"fonts"in document?Promise.race([(0,d.Z)(1e3),document.fonts.ready]):Promise.resolve()))}else console.log("Will mount IM page:",Date.now()/1e3),I(document.getElementById("main-columns"),(0,a.Z)()),(yield Promise.all([n.e(539),n.e(460),n.e(436)]).then(n.bind(n,5436))).default.mount()},new((P=void 0)||(P=Promise))((function(n,s){function i(e){try{r(k.next(e))}catch(e){s(e)}}function o(e){try{r(k.throw(e))}catch(e){s(e)}}function r(e){var t;e.done?n(e.value):(t=e.value,t instanceof P?t:new P((function(e){e(t)}))).then(i,o)}r((k=k.apply(e,t||[])).next())}));var e,t,P,k}))},1722:(e,t,n)=>{n.d(t,{Z:()=>s});const s=new class{reload(){try{location.reload()}catch(e){}}close(){try{window.close()}catch(e){}}focus(){window.focus()}}},2554:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(3855),i=n(410);const o={};function r(e,t){return new Proxy(e,{get:(e,n,r)=>{var a;return null!==(a=e[n])&&void 0!==a?a:e[n]=function(e,t){return new Proxy({},{get:(n,r,a)=>(...n)=>{var a;const c=s.Z.invoke("manager",{name:e,method:r,args:n},t);return i.ZP&&(null===(a=o[e])||void 0===a?void 0:a.has(r))&&console.warn("manager request",e,r,n),c}})}(n,t)}})}let a;function c(){return a||(a=r({},!1),a.acknowledged=r({},!0),a)}i.ZP&&(window.DEBUG_MANAGER_REQUESTS=o)},6666:(e,t,n)=>{n.d(t,{Z:()=>c});var s=n(1267),i=n(5471),o=n(5953),r=n(5003);class a{constructor(e){(0,o.Z)(this,e),s.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,r.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),a.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var n;const s=Array.from(e.indexNames);for(const t of s)e.deleteIndex(t);if(null===(n=t.indexes)||void 0===n?void 0:n.length)for(const n of t.indexes)e.indexNames.contains(n.indexName)||e.createIndex(n.indexName,n.keyPath,n.objectParameters)};try{var n=indexedDB.open(this.name,this.version);if(!n)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let s=!1;return setTimeout((()=>{s||n.onerror((0,i.Z)("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,i)=>{n.onsuccess=t=>{s=!0;const o=n.result;let r=!1;this.log("Opened"),o.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),i(e)},o.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},o.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),o.close()},o.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=o)},n.onerror=e=>{s=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),i(e)},n.onupgradeneeded=e=>{s=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const n=e.target,i=n.result;this.stores.forEach((e=>{if(i.objectStoreNames.contains(e.name)){const s=n.transaction.objectStore(e.name);t(s,e)}else((e,n)=>{const s=e.createObjectStore(n.name);t(s,n)})(i,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new a(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())}))}}a.INSTANCES=[];class c{constructor(e,t){this.storeName=t,this.log=(0,r.kg)(["IDB",e.name,t].join("-")),this.idb=a.create(e)}delete(e,t){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,n){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(n=>e.map(((e,s)=>n.put(t[s],e)))),"",n)}get(e,t){return Array.isArray(e)||(e=[].concat(e)),e.length?this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"",t):Promise.resolve([])}getObjectStore(e,t,n,s=this.storeName){let i;return n&&(i=performance.now(),this.log(n+": start")),this.idb.openDatabase().then((o=>new Promise(((r,a)=>{const c=o.transaction([s],e),l=()=>{clearTimeout(h),a(c.error)},d=()=>{clearTimeout(h),n&&this.log(n+": end",performance.now()-i);const e=f.map((e=>e.result));r(m?e:e[0])};c.onerror=l;const u="readwrite"===e;u&&(c.oncomplete=()=>d());const h=setTimeout((()=>{this.log.error("transaction not finished",c,n)}),1e4),g=t(c.objectStore(s)),m=Array.isArray(g),f=m?g:[].concat(g);if(u)return;const v=f.length;let p=v;const b=()=>{c.error||--p||d()};for(let e=0;ee.getAll()),"",e)}}},2325:(e,t,n)=>{n.d(t,{$d:()=>S,A1:()=>w,Hz:()=>g,XZ:()=>b,ZP:()=>v,ag:()=>p,nK:()=>m,v_:()=>y});var s=n(410),i=n(7922),o=n(4159),r=n(3512),a=n(4762),c=n(6848),l=n(5953),d=n(9005),u=n(6637),h=n(3591);const g={messageActionChatCreate:"ActionCreateGroup",messageActionChatCreateYou:"ActionYouCreateGroup",messageActionChatEditTitle:"ActionChangedTitle",messageActionChatEditPhoto:"ActionChangedPhoto",messageActionChatEditVideo:"ActionChangedVideo",messageActionChatDeletePhoto:"ActionRemovedPhoto",messageActionChatReturn:"ActionAddUserSelf",messageActionChatReturnYou:"ActionAddUserSelfYou",messageActionChatJoined:"ActionAddUserSelfMega",messageActionChatJoinedYou:"ChannelMegaJoined",messageActionChatAddUser:"ActionAddUser",messageActionChatAddUsers:"ActionAddUser",messageActionChatLeave:"ActionLeftUser",messageActionChatLeaveYou:"YouLeft",messageActionChatDeleteUser:"ActionKickUser",messageActionChatJoinedByLink:"ActionInviteUser",messageActionPinMessage:"Chat.Service.Group.UpdatedPinnedMessage",messageActionContactSignUp:"Chat.Service.PeerJoinedTelegram",messageActionChannelCreate:"ActionCreateChannel",messageActionChannelEditTitle:"Chat.Service.Channel.UpdatedTitle",messageActionChannelEditPhoto:"Chat.Service.Channel.UpdatedPhoto",messageActionChannelEditVideo:"Chat.Service.Channel.UpdatedVideo",messageActionChannelDeletePhoto:"Chat.Service.Channel.RemovedPhoto",messageActionHistoryClear:"HistoryCleared",messageActionDiscussionStarted:"DiscussionStarted",messageActionChannelMigrateFrom:"ActionMigrateFromGroup","messageActionPhoneCall.video_in_ok":"ChatList.Service.VideoCall.incoming","messageActionPhoneCall.video_out_ok":"ChatList.Service.VideoCall.outgoing","messageActionPhoneCall.video_missed":"ChatList.Service.VideoCall.Missed","messageActionPhoneCall.video_cancelled":"ChatList.Service.VideoCall.Cancelled","messageActionPhoneCall.in_ok":"ChatList.Service.Call.incoming","messageActionPhoneCall.out_ok":"ChatList.Service.Call.outgoing","messageActionPhoneCall.missed":"ChatList.Service.Call.Missed","messageActionPhoneCall.cancelled":"ChatList.Service.Call.Cancelled","messageActionGroupCall.started":"Chat.Service.VoiceChatStarted.Channel","messageActionGroupCall.started_by":"Chat.Service.VoiceChatStarted","messageActionGroupCall.started_byYou":"Chat.Service.VoiceChatStartedYou","messageActionGroupCall.ended":"Chat.Service.VoiceChatFinished.Channel","messageActionGroupCall.ended_by":"Chat.Service.VoiceChatFinished","messageActionGroupCall.ended_byYou":"Chat.Service.VoiceChatFinishedYou",messageActionBotAllowed:"Chat.Service.BotPermissionAllowed"},m=a.IS_MOBILE?"Message.Unsupported.Mobile":"Message.Unsupported.Desktop";var f;!function(e){let t,a;function g(t){e.lastRequestedLangCode=t,e.lastRequestedNormalizedLangCode=t.split("-")[0]}function m(){if("h12"===e.timeFormat)try{const t=A({hour:"numeric",minute:"numeric",hour12:!0}),n=new Date;n.setHours(0);const s=t.format(n);e.amPmCache.am=s.split(" ")[1],n.setHours(12);const i=t.format(n);e.amPmCache.pm=i.split(" ")[1]}catch(t){console.error("cannot get am/pm",t),e.amPmCache={am:"AM",pm:"PM"}}}function f(){const e=o.Z.langPackCode;return g(e),Promise.all([n.e(104).then(n.bind(n,9104)),n.e(301).then(n.bind(n,9301)),n.e(8).then(n.bind(n,9179))]).then((([t,n,s])=>{const i=[];return p(t.default,i),p(n.default,i),b({_:"langPackDifference",from_version:0,lang_code:e,strings:i,version:0,local:!0,countries:s.default})}))}function v(t,s){e.requestedServerLanguage=!0;const i=r.Z.managers;return Promise.all([i.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"web"}),!1,n.e(104).then(n.bind(n,9104)),n.e(301).then(n.bind(n,9301)),i.apiManager.invokeApiCacheable("help.getCountriesList",{lang_code:t,hash:0}),e.polyfillPromise])}function p(e,t=[]){for(const n in e){const s=e[n];"string"==typeof s?t.push({_:"langPackString",key:n,value:s}):t.push(Object.assign({_:"langPackStringPluralized",key:n},s))}return t}function b(e){return e.appVersion=o.Z.langPackVersion,i.Z.set({langPack:e}).then((()=>(S(e),e)))}function S(n){const s=e.lastRequestedLangCode;if(n.lang_code===s){try{t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode)}catch(n){console.error("pluralRules error",n),t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode.split("-",1)[0])}try{t=new Intl.PluralRules(n.lang_code)}catch(e){console.error("pluralRules error",e),t=new Intl.PluralRules(n.lang_code.split("-",1)[0])}e.strings.clear();for(const t of n.strings)e.strings.set(t.key,t);n.countries&&(e.countriesList.length=0,e.countriesList.push(...n.countries.countries),n.countries.countries.forEach((t=>{if(t.name){const n=t.default_name;e.strings.set(n,{_:"langPackString",key:n,value:t.name})}}))),e.lastAppliedLangCode!==s&&(r.Z.dispatchEvent("language_change",s),e.lastAppliedLangCode=s,E.clear(),m()),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const n=e.weakMap.get(t);n&&n.update()}))}}function w(e,t,n={i:0}){const s=[];let i=0;return e.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,((e,o,r,a,c,l,d)=>{if(s.push(d.slice(i,l)),o){let e;switch(o){case"**":e=document.createElement("b");break;case"__":e=document.createElement("i")}e.append(...w(r,t,n)),s.push(e)}else if(a)s.push(document.createElement("br"));else if(c){const e=c.lastIndexOf("]"),i=c.slice(1,e),o=c.slice(e+2,c.length-1);let r;if(o&&(0,u.Z)(o)){r=document.createElement("a");const e=(0,h.Z)(o);r.href=e.url,e.onclick&&r.setAttribute("onclick",e.onclick),r.target="_blank"}else r=t[n.i++],r instanceof DocumentFragment&&(r=r.firstChild),r.textContent="";r.append(...w(i,t,n)),s.push(r)}else t&&function(e,t,n){const s=t[n.i++];Array.isArray(s)?e.push(...s):e.push(s)}(s,t,n);return i=l+e.length,""})),i!==e.length&&s.push(e.slice(i)),s}function y(n,s=!1,i){const o=e.strings.get(n);let r;if(o)if("langPackStringPluralized"===o._&&(null==i?void 0:i.length)){let e=i[0];"string"==typeof e&&(e=+e.replace(/\D/g,"")),r=o[t.select(e)+"_value"]||o.other_value}else r="langPackString"===o._?o.value:n;else r=n;const a=w(r,i);return s?a.map((e=>e instanceof Node?e.textContent:e)).join(""):a}e.strings=new Map,e.countriesList=[],e.requestedServerLanguage=!1,e.isRTL=!1,e.setRTL=function(t){e.isRTL=t},e.getCacheLangPack=function(){return a||(a=Promise.all([i.Z.get("langPack"),e.polyfillPromise]).then((([t])=>t?(s.ZP,e.lastRequestedLangCode||g(t.lang_code),S(t),t):f())).finally((()=>{a=void 0})))},e.setTimeFormat=function(t,n=!!e.timeFormat&&e.timeFormat!==t){e.timeFormat=t,m(),n&&(E.clear(),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const n=e.weakMap.get(t);n instanceof _&&n.update()})))},e.loadLocalLangPack=f,e.loadLangPack=v,e.getStrings=function(e,t){return r.Z.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:o.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=p,e.getLangPack=function(e,t){return g(e),v(e).then((([e,t,n,s,i,o])=>{let r=[];return[n,s].forEach((e=>{p(e.default,r)})),r=r.concat(...[e.strings,t.strings].filter(Boolean)),e.strings=r,e.countries=i,b(e)}))},e.saveLangPack=b,e.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():n.e(642).then(n.bind(n,4642)).then((e=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},e.default)})),e.applyLangPack=S,e.superFormatter=w,e.format=y,e.weakMap=new WeakMap;class P{constructor(t){this.element=(null==t?void 0:t.element)||document.createElement("span"),this.element.classList.add("i18n"),this.property=null==t?void 0:t.property,t&&(t.key||t.date)&&this.update(t),e.weakMap.set(this.element,this)}}class k extends P{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"innerHTML"}))}update(e){if((0,l.Z)(this,e),"innerHTML"===this.property)this.element.textContent="",this.element.append(...y(this.key,!1,this.args));else{const e=this.element[this.property],t=y(this.key,!0,this.args);void 0===e?this.element.dataset[this.property]=t:this.element[this.property]=t}}compareAndUpdate(e){if(this.key!==e.key||!(0,c.Z)(this.args,e.args))return this.update(e)}}e.IntlElement=k;const E=new Map;function A(t={}){const n=JSON.stringify(t);let s=E.get(n);return s||(s=new Intl.DateTimeFormat(e.lastRequestedNormalizedLangCode+"-u-hc-"+e.timeFormat,t),E.set(n,s)),s}e.amPmCache={am:"AM",pm:"PM"};class _ extends P{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"}))}update(t){let n;if((0,l.Z)(this,t),this.options.hour&&this.options.minute&&2===Object.keys(this.options).length){const t=this.date.getHours();n=("0"+("h12"===e.timeFormat?t%12||12:t)).slice(-2)+":"+("0"+this.date.getMinutes()).slice(-2),"h12"===e.timeFormat&&(n+=" "+(t<12?e.amPmCache.am:e.amPmCache.pm))}else{const e=A(this.options);n=(0,d.Z)(e.format(this.date))}this.element[this.property]=n}}e.IntlDateElement=_,e.i18n=function(e,t){return new k({key:e,args:t}).element},e.i18n_=function(e){return new k(e).element},e._i18n=function(e,t,n,s){return new k({element:e,key:t,args:n,property:s}).element}}(f||(f={}));const v=f,p=f.i18n,b=f.i18n_,S=f._i18n;function w(e,t){const n=e.slice(0,1);for(let s=1;s{const s=e&&t?"AutoDownloadSettings.LastDelimeter":"AutoDownloadSettings.Delimeter";return n?f.format(s,!0):p(s)}));return n?s.join(""):s}s.GO.I18n=f},1507:(e,t,n)=>{n.d(t,{BP:()=>h,BX:()=>m,DZ:()=>p,IA:()=>o,Iw:()=>l,J$:()=>f,NM:()=>s,OS:()=>u,Ox:()=>g,Pt:()=>d,Zi:()=>v,gZ:()=>c,hj:()=>i,rU:()=>a,yF:()=>r});const s=0,i=1271266957,o=777,r=777e3,a=2147483647,c="",l=20971520,d="",u=[7322096,16766590,13338331,9367192,16749490,16478047],h="default_static",g=4295032831,m=new Set(["web","k","z"]),f=0,v=1,p=new Set([f,v]);Math.max(...Array.from(p))},3855:(e,t,n)=>{n.d(t,{Z:()=>se});var s=n(3512),i=n(7730),o=n(410),r=n(7487),a=n(6702),c=n(1722),l=n(2831),d=n(5418),u=n(993),h=n(7328),g=n(6663),m=n(9976),f=n(3731),v=n(6818),p=n(1174),b=n(2341),S=n(9030),w=n(2365),y=n(2820),P=n(5432),k=n(2131),E=n(554),A=n(393),_=n(5269),Z=n(4089),I=n(4762),C=n(5783),L=n(2045),T=n(8189);const O=Object.assign({CAN_USE_TRANSFERABLES:h.Z,IS_APPLE_MX:T.Z,IS_CALL_SUPPORTED:u.Z,IS_CANVAS_FILTER_SUPPORTED:g.Z,IS_EMOJI_SUPPORTED:m.Z,IS_GEOLOCATION_SUPPORTED:f.Z,IS_GROUP_CALL_SUPPORTED:v.Z,IS_MOV_SUPPORTED:S.Z,IS_PARALLAX_SUPPORTED:w.Z,IS_SCREEN_SHARING_SUPPORTED:y.Z,IS_TOUCH_SUPPORTED:P.Z,IS_VIBRATE_SUPPORTED:k.Z,IS_OPUS_SUPPORTED:C.Z,IS_SHARED_WORKER_SUPPORTED:L.Z,IS_WEBM_SUPPORTED:A.Z,IS_WEBP_SUPPORTED:_.Z,IS_WEBRTC_SUPPORTED:Z.Z,IMAGE_MIME_TYPES_SUPPORTED:p.Z,MEDIA_MIME_TYPES_SUPPORTED:b.Z,VIDEO_MIME_TYPES_SUPPORTED:E.Z},I);var M=n(4159),W=n(236),R=n(6009),D=n(8479),x=n(946),N=n(7922),U=n(5466),j=n(5003);const F=W.h.version,B=W.h.build,V=Object.keys(W.h),G=["contactsListCachedTime","stateCreatedTime","maxSeenMsgId","filtersArr"];function z(){return e=this,t=void 0,i=function*(){const e=(0,j.kg)("STATE-LOADER"),t=performance.now(),n=(0,U.$)(e),i=V.map((e=>n(N.Z.get(e),"state "+e))).concat(n(r.Z.get("user_auth"),"auth"),n(r.Z.get("state_id"),"auth"),n(r.Z.get("k_build"),"auth")).concat(n(N.Z.get("user_auth"),"old auth")),a=yield Promise.all(i);e.warn("promises",performance.now()-t);const c=[],l=(e,t)=>{d[e]=t,c.push(e)};let d={};for(let e=0,t=V.length;eN.Z.get(e))));e.push("user_auth"),t.push("number"==typeof u||"string"==typeof u?{dcID:t[0]||M.Z.baseDcId,date:Date.now()/1e3|0,id:u.toPeerId(!1)}:u);const n={};e.forEach(((e,s)=>{n[e]=t[s]})),yield r.Z.set(n)}u&&(d.authState={_:"authStateSignedIn"},s.Z.dispatchEvent("user_auth","number"==typeof u||"string"==typeof u?{dcID:0,date:Date.now()/1e3|0,id:u.toPeerId(!1)}:u));const f=new Set;if(d.stateId!==h){if(void 0!==h){const e=new Map([["authState",void 0],["stateId",void 0]]);e.forEach(((t,n)=>{e.set(n,(0,D.Z)(d[n]))})),d=(0,D.Z)(W.h),e.forEach(((e,t)=>{d[t]=e}));const t={chats:1,dialogs:1,users:1};for(const e in t)f.add(e);v=d,c.length=0,d=v,c.push(...Object.keys(d))}yield r.Z.set({state_id:d.stateId})}var v;const p=Date.now();if(d.stateCreatedTime+864e5{l(e,(0,D.Z)(W.h[e]))}))),!d.settings.hasOwnProperty("theme")&&d.settings.hasOwnProperty("nightTheme")&&(d.settings.theme=d.settings.nightTheme?"night":"day",l("settings",d.settings)),!d.settings.hasOwnProperty("themes")&&d.settings.background){d.settings.themes=(0,D.Z)(W.h.settings.themes);const e=d.settings.themes.find((e=>e.name===d.settings.theme));e&&(e.background=d.settings.background,l("settings",d.settings))}const b=d.settings.autoDownload;if(void 0!==(null==b?void 0:b.private)){const e=["contacts","private","groups","channels"];["photo","video","file"].forEach((t=>{const n=b[t]={};e.forEach((e=>{n[e]=b[e]}))})),e.forEach((e=>{delete b[e]})),l("settings",d.settings)}let S,w;if((0,x.Z)(W.h,d,(e=>{l(e,d[e])})),d.version!==F||d.build!==B){if(d.build<217&&(d.allDialogsLoaded=(0,D.Z)(W.h.allDialogsLoaded),d.pinnedOrders=(0,D.Z)(W.h.pinnedOrders),d.filtersArr=(0,D.Z)(W.h.filtersArr),f.add("dialogs")),-1===(0,R.Z)(d.version,"1.3.0")){let e=!1;d.settings.themes.forEach(((t,n,s)=>{if("day"===t.name&&"ByxGo2lrMFAIAAAAmkJxZabh8eM"===t.background.slug&&"image"===t.background.type||"night"===t.name&&"#0f0f0f"===t.background.color&&"color"===t.background.type){const i=W.h.settings.themes.find((e=>e.name===t.name));i&&(s[n]=(0,D.Z)(i),e=!0)}})),e&&l("settings",d.settings)}0!==(0,R.Z)(d.version,F)&&(S=F,w=d.version),l("version",F),l("build",B)}return g!==B&&(!g||g{var t,n;const{name:s,key:i,value:o}=e;if(!e.hasOwnProperty("key"))return void(this.mirrors[s]=o);const r=null!==(t=(n=this.mirrors)[s])&&void 0!==t?t:n[s]={};void 0===o?delete r[i]:r[i]=o},this.mirrors={},this.tabState={chatPeerIds:[],idleStartTime:0},this.log("constructor"),this.registerWorker(),this.registerServiceWorker(),this.registerCryptoWorker(),this.addMultipleEventsListeners({convertWebp:({fileName:e,bytes:t})=>i.Z.convert(e,t),convertOpus:({fileName:e,bytes:t})=>q.Z.pushDecodeTask(t,!1).then((e=>e.bytes)),event:({name:e,args:t})=>{s.Z.dispatchEventSingle(e,...t)},localStorageProxy:e=>{const t=e;return r.Z[t.type](...t.args)},mirror:this.onMirrorTask}),s.Z.addEventListener("language_change",(e=>{s.Z.managers.networkerFactory.setLanguage(e)})),window.addEventListener("online",(()=>{s.Z.managers.networkerFactory.forceReconnectTimeout()})),s.Z.addEventListener("logging_out",(()=>{Promise.all([(0,J.Z)(!1,!0),r.Z.clear(),Promise.race([l.default.setAuthorized(!1),(0,d.Z)(3e3)]),a.default.forceUnsubscribe(),Promise.all(["cachedFiles","cachedStreamChunks"].map((e=>caches.delete(e))))]).finally((()=>{c.Z.reload()}))})),X.Z.addEventListener("change",(e=>{this.updateTabStateIdle(e)})),this.updateTabStateIdle(X.Z.isIdle),this.log("Passing environment:",O),this.invoke("environment",O)}pingServiceWorkerWithIframe(){if(this.pingServiceWorkerPromise)return this.pingServiceWorkerPromise;const e=this.pingServiceWorkerPromise=(0,Q.Z)(),t=document.createElement("iframe");t.hidden=!0;const n=()=>{setTimeout((()=>{this.pingServiceWorkerPromise=void 0}),1e4),clearTimeout(s),t.remove(),t.removeEventListener("load",n),t.removeEventListener("error",n),e.resolve()};t.addEventListener("load",n),t.addEventListener("error",n),t.src="ping/"+(4294967295*Math.random()|0),document.body.append(t);const s=window.setTimeout(n,1e3);return e}attachServiceWorker(e){this.lastServiceWorker&&this.serviceMessagePort.detachPort(this.lastServiceWorker),this.serviceMessagePort.attachSendPort(this.lastServiceWorker=e),this.serviceMessagePort.invokeVoid("hello",void 0)}_registerServiceWorker(){navigator.serviceWorker.register(new URL(n.p+n.u(670),n.b),{scope:"./"}).then((e=>{if(this.log("SW registered",e),e.active&&!navigator.serviceWorker.controller)return e.unregister().then((()=>{window.location.reload()}));(e.installing||e.waiting||e.active).addEventListener("statechange",(e=>{this.log("SW statechange",e)}));const t=navigator.serviceWorker.controller||e.installing||e.waiting||e.active;this.attachServiceWorker(t)}),(e=>{this.log.error("SW registration failed!",e),this.invokeVoid("serviceWorkerOnline",!1)}))}registerServiceWorker(){if(!("serviceWorker"in navigator))return;this.serviceMessagePort=new K.Z;const e=navigator.serviceWorker;this._registerServiceWorker(),e.addEventListener("controllerchange",(()=>{this.log.warn("controllerchange");const t=e.controller;this.attachServiceWorker(t),t.addEventListener("error",(e=>{this.log.error("controller error:",e)}))})),this.serviceMessagePort.attachListenPort(e),this.serviceMessagePort.addMultipleEventsListeners({port:(e,t,n)=>{this.invokeVoid("serviceWorkerPort",void 0,void 0,[n.ports[0]])},hello:(e,t)=>{this.serviceMessagePort.resendLockTask(t)}}),e.addEventListener("messageerror",(e=>{this.log.error("SW messageerror:",e)}))}registerCryptoWorker(){return ee(this,void 0,void 0,(function*(){const e={construct:(e,t)=>({url:t[0]+location.search})},t=[Worker,"undefined"!=typeof SharedWorker&&SharedWorker].filter(Boolean);t.forEach((t=>window[t.name]=new Proxy(t,e)));const s=new Worker(new URL(n.p+n.u(589),n.b),{type:void 0});t.forEach((e=>window[e.name]=e));const i=s.url,o=e=>new a(e,{type:"module"}),r=e=>this.attachWorkerToPort(e,Y.Z,"crypto"),a=L.Z?SharedWorker:Worker;Y.Z.addEventListener("port",((e,t,n)=>{this.invokeVoid("cryptoPort",void 0,void 0,[n.ports[0]])})),r(o(i));const c=yield(l=i,fetch(l).then((e=>e.text())).then((e=>{const t=location.pathname.split("/");return t[t.length-1]="",e=`\n var originalImportScripts = importScripts; \n importScripts = (url) => {\n console.log('importScripts', url);\n var newUrl = '${location.origin+t.join("/")}' + url.split('/').pop();\n return originalImportScripts(newUrl);\n };\n ${e}`,new Blob([e],{type:"application/javascript"})})));var l;(yield this.invoke("createProxyWorkerURLs",{originalUrl:i,blob:c})).slice(1).map(o).forEach(r)}))}registerWorker(){let e;e=L.Z?new SharedWorker(new URL(n.p+n.u(678),n.b),{type:void 0}):new Worker(new URL(n.p+n.u(678),n.b),{type:void 0}),this.onWorkerFirstMessage(e)}attachWorkerToPort(e,t,n){const s=e.port||e;t.attachPort(s),e.addEventListener("error",(e=>{this.log.error(n,"worker error",e)}))}onWorkerFirstMessage(e){this.log("set webWorker"),this.attachWorkerToPort(e,this,"mtproto")}loadState(){return Promise.all([(null!=$?$:$=z()).then((e=>(this.newVersion=e.newVersion,this.oldVersion=e.oldVersion,this.mirrors.state=e.state,e)))])}sendState(){return this.loadState().then((e=>{const[t]=e;return this.invoke("state",Object.assign(Object.assign({},t),{userId:s.Z.myId.toUserId()})),e}))}invokeCrypto(e,...t){return Y.Z.invokeCrypto(e,...t)}toggleStorages(e,t){return ee(this,void 0,void 0,(function*(){yield(0,J.Z)(e,t),this.invoke("toggleStorages",{enabled:e,clearWrite:t}),this.serviceMessagePort.invokeVoid("toggleStorages",{enabled:e,clearWrite:t})}))}getMirror(e){return ee(this,void 0,void 0,(function*(){return this.mirrors[e]}))}getState(){return this.getMirror("state")}updateTabState(e,t){this.tabState[e]=t,this.invokeVoid("tabState",this.tabState)}updateTabStateIdle(e){this.updateTabState("idleStartTime",e?Date.now():0)}}const ne=new te;o.GO.apiManagerProxy=ne;const se=ne},490:(e,t,n)=>{n.d(t,{Z:()=>v});var s=n(4159),i=n(410),o=n(2219),r=n(2045),a=n(3241),c=n(2586),l=n(5003),d=n(3512),u=n(7487),h=n(3855);const g=r.Z;class m extends a.Z{constructor(){super(!1),this.log=(0,l.kg)("INSTANCE"),this.clearInstance=()=>{this.masterInstance&&!this.deactivated&&(this.log.warn("clear master instance"),u.Z.delete("xt_instance"))},this.checkInstance=(e=c.Z.isIdle)=>{return t=this,n=void 0,o=function*(){if(this.deactivated)return;const t=Date.now(),n={id:this.instanceId,idle:e,time:t},[i,o=s.Z.build]=yield Promise.all([u.Z.get("xt_instance",!1),u.Z.get("k_build",!1)]);if(o>s.Z.build)return this.masterInstance=!1,d.Z.managers.networkerFactory.stopAll(),this.deactivateInstance("version"),void h.Z.toggleStorages(!1,!1);g?u.Z.set({xt_instance:n}):!e||!i||i.id===this.instanceId||i.timethis.deactivateInstance("tabs")),3e4)))},new((i=void 0)||(i=Promise))((function(e,s){function r(e){try{c(o.next(e))}catch(e){s(e)}}function a(e){try{c(o.throw(e))}catch(e){s(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof i?n:new i((function(e){e(n)}))).then(r,a)}c((o=o.apply(t,n||[])).next())}));var t,n,i,o},this.log=(0,l.kg)("INSTANCE"),this.instanceId=o.Z}get deactivatedReason(){return this.deactivated}start(){if(this.reset(),!this.started){this.started=!0,c.Z.addEventListener("change",this.checkInstance),setInterval(this.checkInstance,5e3),this.checkInstance();try{document.documentElement.addEventListener("beforeunload",this.clearInstance)}catch(e){}}}reset(){this.masterInstance=!1,this.clearDeactivateTimeout(),this.deactivated=void 0}activateInstance(){this.deactivated&&(this.reset(),this.checkInstance(!1),this.dispatchEvent("activated"))}deactivateInstance(e){this.masterInstance||this.deactivated||(this.log.warn("deactivate",e),this.clearDeactivateTimeout(),this.deactivated=e,this.dispatchEvent("deactivated",e))}clearDeactivateTimeout(){this.deactivateTimeout&&(clearTimeout(this.deactivateTimeout),this.deactivateTimeout=0)}}const f=new m;i.GO&&(i.GO.singleInstance=f);const v=f},2831:(e,t,n)=>{n.r(t),n.d(t,{TelegramMeWebManager:()=>c,default:()=>d});var s=n(4159),i=n(410),o=n(1267),r=n(7298),a=n(7487);class c{constructor(){this.disabled=o.Z.test||!s.Z.domains.includes(location.hostname)}setAuthorized(e){if(!this.disabled)return a.Z.get("tgme_sync").then((t=>{const n=(0,r.Z)(!0);if(e&&(null==t?void 0:t.canRedirect)===e&&t.ts+86400>n)return;a.Z.set({tgme_sync:{canRedirect:e,ts:n}});const i=`_websync_?authed=${e?"1":"0"}&version=${encodeURIComponent(s.Z.version+" "+s.Z.suffix)}`,o=["//telegram.me/"+i,"//t.me/"+i].map((e=>function(e){const t=document.createElement("script"),n=new Promise((e=>{t.onload=t.onerror=()=>{e(t)}}));return t.src=e,document.body.appendChild(t),n}(e).then((e=>{e.remove()}))));return Promise.all(o)}))}}const l=new c;i.GO&&(i.GO.telegramMeWebManager=l);const d=l},6702:(e,t,n)=>{n.r(t),n.d(t,{WebPushApiManager:()=>h,default:()=>m});var s=n(410),i=n(5003),o=n(3855),r=n(2325),a=n(4762),c=n(1722),l=n(8479),d=n(490),u=n(3241);class h extends u.Z{constructor(){super(!1),this.isAvailable=!0,this.isPushEnabled=!1,this.localNotificationsAvailable=!0,this.started=!1,this.settings={},this.isFirefox=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,this.userVisibleOnly=!this.isFirefox,this.log=(0,i.kg)("PM"),this.subscribe=()=>{this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.subscribe({userVisibleOnly:this.userVisibleOnly}).then((e=>{this.isPushEnabled=!0,this.pushSubscriptionNotify("subscribe",e)})).catch((e=>{"denied"===Notification.permission?this.log("Permission for Notifications was denied"):(this.log("Unable to subscribe to push.",e),this.userVisibleOnly||(this.userVisibleOnly=!0,setTimeout(this.subscribe,0)))}))}))},this.isAliveNotify=()=>{if(!this.isAvailable||d.Z.deactivatedReason)return;this.settings.baseUrl=(location.href||"").replace(/#.*$/,"");const e={},t={push_action_mute1d:a.IS_MOBILE?"PushNotification.Action.Mute1d.Mobile":"PushNotification.Action.Mute1d",push_action_settings:a.IS_MOBILE?"PushNotification.Action.Settings.Mobile":"PushNotification.Action.Settings",push_message_nopreview:"PushNotification.Message.NoPreview"};for(const n in t)e[n]=r.ZP.format(t[n],!0);o.Z.serviceMessagePort.invokeVoid("pushPing",{localNotifications:this.localNotificationsAvailable,lang:e,settings:this.settings}),this.isAliveTO=setTimeout(this.isAliveNotify,1e4)},"PushManager"in window&&"Notification"in window&&"serviceWorker"in navigator||(this.log.warn("Push messaging is not supported."),this.isAvailable=!1,this.localNotificationsAvailable=!1),this.isAvailable&&"denied"===Notification.permission&&this.log.warn("The user has blocked notifications.")}start(){this.started||(this.started=!0,this.getSubscription(),this.setUpServiceWorkerChannel())}setLocalNotificationsDisabled(){this.localNotificationsAvailable=!1}getSubscription(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.isPushEnabled=!!e,this.pushSubscriptionNotify("init",e)})).catch((e=>{this.log.error("Error during getSubscription()",e)}))}))}unsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.isPushEnabled=!1,e&&(this.pushSubscriptionNotify("unsubscribe",e),setTimeout((()=>{e.unsubscribe().then((e=>{this.isPushEnabled=!1})).catch((e=>{this.log.error("Unsubscription error: ",e)}))}),3e3))})).catch((e=>{this.log.error("Error thrown while unsubscribing from push messaging.",e)}))}))}forceUnsubscribe(){this.isAvailable&&navigator.serviceWorker.ready.then((e=>{e.pushManager.getSubscription().then((e=>{this.log.warn("force unsubscribe",e),e&&e.unsubscribe().then((e=>{this.log.warn("force unsubscribe successful",e),this.isPushEnabled=!1})).catch((e=>{this.log.error("Unsubscription error: ",e)}))})).catch((e=>{this.log.error("Error thrown while unsubscribing from push messaging.",e)}))}))}setSettings(e){this.settings=(0,l.Z)(e),clearTimeout(this.isAliveTO),this.isAliveNotify()}hidePushNotifications(){this.isAvailable&&o.Z.serviceMessagePort.invokeVoid("notificationsClear",void 0)}setUpServiceWorkerChannel(){this.isAvailable&&(o.Z.serviceMessagePort.addEventListener("pushClick",(e=>{d.Z.deactivatedReason?c.Z.reload():this.dispatchEvent("push_notification_click",e)})),navigator.serviceWorker.ready.then(this.isAliveNotify))}pushSubscriptionNotify(e,t){if(t){const n=t.toJSON();if(!(n&&n.endpoint&&n.keys&&n.keys.p256dh&&n.keys.auth))return this.log.warn("Invalid push subscription",n),this.unsubscribe(),this.isAvailable=!1,void this.pushSubscriptionNotify(e);this.log.warn("Push",e,n),this.dispatchEvent("push_"+e,{tokenType:10,tokenValue:JSON.stringify(n)})}else this.log.warn("Push",e,!1),this.dispatchEvent("push_"+e,!1)}}const g=new h;s.GO&&(s.GO.webPushApiManager=g);const m=g},9043:(e,t,n)=>{n.d(t,{Z:()=>d});var s=n(410),i=n(5783),o=n(4762),r=n(5003),a=n(3855),c=function(e,t,n,s){return new(n||(n=Promise))((function(i,o){function r(e){try{c(s.next(e))}catch(e){o(e)}}function a(e){try{c(s.throw(e))}catch(e){o(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(r,a)}c((s=s.apply(e,t||[])).next())}))};const l=new class{constructor(){this.sampleRate=48e3,this.tasks=[],this.keepAlive=!1,this.log=(0,r.kg)("OPUS",r.v9.Error)}isPlaySupported(){return i.Z}loadWavWorker(){this.wavWorker||(this.wavWorker=new Worker("waveWorker.min.js"),this.wavWorker.addEventListener("message",(e=>{const t=e.data;if(this.log("[WAV] got message:",t),t&&t.page){const e=t.page;this.onTaskEnd(this.tasks.shift(),e)}})))}loadWorker(){this.worker||(this.worker=new Worker("decoderWorker.min.js"),this.worker.addEventListener("message",(e=>{const t=e.data;this.log("[DECODER] got message",t),"done"===t.type?(this.wavWorker.postMessage({command:"done"}),t.waveform&&(this.tasks[0].waveform=t.waveform)):this.wavWorker.postMessage({command:"encode",buffers:e.data},o.IS_SAFARI?void 0:t.map((e=>e.buffer)))})))}setKeepAlive(e){this.keepAlive=e,this.keepAlive?(this.loadWorker(),this.loadWavWorker()):this.tasks.length||this.terminateWorkers()}onTaskEnd(e,t){t?(clearTimeout(e.timeout),e.callback.resolve({bytes:t,waveform:e.waveform})):e.callback.reject("timeout"),this.tasks.length&&this.executeNewTask(this.tasks[0]),this.terminateWorkers()}terminateWorkers(e=!1){(!this.keepAlive&&!this.tasks.length||e)&&(this.worker&&(this.worker.terminate(),this.worker=null),this.wavWorker&&(this.wavWorker.terminate(),this.wavWorker=null))}executeNewTask(e){this.worker.postMessage({command:"init",decoderSampleRate:this.sampleRate,outputBufferSampleRate:this.sampleRate}),this.wavWorker.postMessage({command:"init",wavBitDepth:16,wavSampleRate:this.sampleRate}),this.log("[DECODER] send decode"),this.worker.postMessage({command:"decode",pages:e.pages,waveform:e.withWaveform},o.IS_SAFARI?void 0:[e.pages.buffer]),e.timeout=window.setTimeout((()=>{this.log.error("decode timeout"),this.terminateWorkers(!0),this.tasks.length&&(this.loadWorker(),this.loadWavWorker()),this.onTaskEnd(this.tasks.shift())}),1e4)}pushDecodeTask(e,t){return new Promise(((n,s)=>{const i={pages:e,withWaveform:t,callback:{resolve:n,reject:s},timeout:0};this.loadWorker(),this.loadWavWorker(),1===this.tasks.push(i)&&this.executeNewTask(i)}))}decode(e,t=!1){return c(this,void 0,void 0,(function*(){return this.pushDecodeTask(e,t).then((e=>c(this,void 0,void 0,(function*(){const t=new Blob([e.bytes],{type:"audio/wav"});return{url:yield a.Z.invoke("createObjectURL",t),waveform:e.waveform}}))))}))}};s.GO.opusDecodeController=l;const d=l},2423:(e,t,n)=>{n.d(t,{$2:()=>h,E:()=>g,Hk:()=>f,QB:()=>m,SC:()=>v,bu:()=>l,it:()=>c,kO:()=>b,tY:()=>p});var s=n(1229);const i="a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc",o="0-9_"+i,r="["+i+"0-9]",a="((?:https?|ftp)://|mailto:)?",c=a+"(?:"+r+"{1,64}(?::"+r+"{0,64})?@)?(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|"+r+"["+i+"·0-9-]{0,64}(?:\\."+r+"["+i+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+i+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",l=(new RegExp("^"+a.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),d="[a-zA-Z\\d_]{5,32}",u="\\/([a-zA-Z\\d_]{1,32})(?:@("+d+"))?(\\b|$)",h=new RegExp("(^| )(@)("+d+")|("+c+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#["+o+"]{2,64})|(^|\\s)"+u,"i"),g=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,m=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,f={Telegram:"tg://search_hashtag?hashtag={1}",Twitter:"https://twitter.com/hashtag/{1}",Instagram:"https://instagram.com/explore/tags/{1}/","Google Plus":"https://plus.google.com/explore/{1}"},v={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},p=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(const e in v)p.add(v[e]);const b=/^\+\d+$/},3591:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(2423),i=n(410),o=n(6637),r=n(1507);function a(e,t){(0,o.Z)(e)||(e="https://"+e);const n={url:e};let i,a,c,l;if(i=e.match(/^(?:https?:\/\/)?(?:(.+?)\.)?(?:(?:web|k|z)\.)?t(?:elegram)?\.me(?:\/(.+))?/)){const t=new URL(e);let n=i[1];n&&r.BX.has(i[1])&&(n=void 0),n&&(t.pathname=n+("/"===t.pathname?"":t.pathname));const o=t.pathname.slice(1),a=o.split("/");if(a[0]&&"$"===a[0][0]&&a[0].length>1)l="invoice";else if(/^\W/.test(o)&&!s.kO.test(o))l="joinchat";else switch(a[0]){case"joinchat":case"addstickers":case"addemoji":case"voicechat":case"invoice":if(1!==a.length&&!n){l=a[0];break}default:if(a[1]&&a[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===a.length){l="im";break}}}else(a=e.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?l="im":(c=e.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(l="tg_"+c[1]);return window[l]||(l=void 0),n.onclick=l,n}i.GO&&(i.GO.wrapUrl=a)},3512:(e,t,n)=>{n.d(t,{Z:()=>d});var s=n(1507),i=n(3241),o=n(410),r=n(3206),a=n(1352);class c extends i.Z{constructor(){super(),this.myId=s.NM,this.connectionStatus={},this.premium=!1,this.addEventListener("user_auth",(({id:e})=>{this.myId=e.toPeerId()})),this.addEventListener("premium_toggle_private",(({isNew:e,isPremium:t})=>{this.premium=t,e||this.dispatchEventSingle("premium_toggle",t)})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.dispatchEvent=(e,...t)=>{super.dispatchEvent(e,...t),r.Z.getInstance().invokeVoid("event",{name:e,args:t})},a.kC||this.addEventListener("settings_updated",(({settings:e})=>{this.settings=e}))}getConnectionStatus(){return this.connectionStatus}getPremium(){return this.premium}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const l=new c;o.GO.rootScope=l;const d=l},7730:(e,t,n)=>{n.d(t,{Z:()=>r});var s=n(410),i=n(3725);const o=new class{constructor(){this.convertPromises={}}init(){this.worker=new Worker(new URL(n.p+n.u(61),n.b)),this.worker.addEventListener("message",(e=>{const t=e.data.payload,n=this.convertPromises[t.fileName];n&&(t.bytes?n.resolve(t.bytes):n.reject(),delete this.convertPromises[t.fileName])}))}postMessage(e){this.init&&(this.init(),this.init=null),this.worker.postMessage(e)}convert(e,t){if(this.convertPromises.hasOwnProperty(e))return this.convertPromises[e];const n=(0,i.Z)();return this.postMessage({type:"convertWebp",payload:{fileName:e,bytes:t}}),this.convertPromises[e]=n}};s.GO.webpWorkerController=o;const r=o}},r={};function a(e){var t=r[e];if(void 0!==t)return t.exports;var n=r[e]={exports:{}};return o[e].call(n.exports,n,n.exports,a),n.exports}a.m=o,e=[],a.O=(t,n,s,i)=>{if(!n){var o=1/0;for(d=0;d=i)&&Object.keys(a.O).every((e=>a.O[e](n[c])))?n.splice(c--,1):(r=!1,i0&&e[d-1][2]>i;d--)e[d]=e[d-1];e[d]=[n,s,i]},a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},n=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,a.t=function(e,s){if(1&s&&(e=this(e)),8&s)return e;if("object"==typeof e&&e){if(4&s&&e.__esModule)return e;if(16&s&&"function"==typeof e.then)return e}var i=Object.create(null);a.r(i);var o={};t=t||[null,n({}),n([]),n(n)];for(var r=2&s&&e;"object"==typeof r&&!~t.indexOf(r);r=n(r))Object.getOwnPropertyNames(r).forEach((t=>o[t]=()=>e[t]));return o.default=()=>e,a.d(i,o),i},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((t,n)=>(a.f[n](e,t),t)),[])),a.u=e=>(({589:"crypto.worker",630:"npm.qr-code-styling",670:"sw",678:"mtproto.worker"}[e]||e)+"."+{8:"570e6da51a125009c156",53:"77c5dab45a68d1851187",61:"9f135819bd5af1b57a36",63:"0d39a81590990db74d39",77:"18305e1bd331a0fdd36c",104:"91dd6279f1f693880508",231:"1462b405fc6da56ba47b",301:"42dc636f96a62f6a08c8",339:"79c7f9c2341eeff66b88",392:"198d4679664c1bf4c989",436:"47558d0a092967b3c966",437:"d40e517d52e5dcf3b754",442:"645fe71c30545d9700d2",460:"057266426d36dd34300a",508:"56e4692b095fba8d9cdf",539:"17a0b07b4e6476f19654",589:"eebc3997154695b54c25",630:"2c5d57550714b1a9e42e",641:"11406cec52b05304f14f",642:"fd1ade69544ad78671c6",670:"e5e5d5146fea89f484d2",678:"e39165afafd615d2ebc1",709:"73c949c4c6702cdf349b",776:"b547f5293903351f3ec7",781:"af546badf2c525815889",783:"827711558099e62fd694",810:"f272bad8a3948af5c8d0",813:"06763bece6721fb81fde"}[e]+".chunk.js"),a.miniCssF=e=>{},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),s={},i="tweb:",a.l=(e,t,n,o)=>{if(s[e])s[e].push(t);else{var r,c;if(void 0!==n)for(var l=document.getElementsByTagName("script"),d=0;d{r.onerror=r.onload=null,clearTimeout(g);var i=s[e];if(delete s[e],r.parentNode&&r.parentNode.removeChild(r),i&&i.forEach((e=>e(n))),t)return t(n)},g=setTimeout(h.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=h.bind(null,r.onerror),r.onload=h.bind(null,r.onload),c&&document.head.appendChild(r)}},a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var t=a.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})(),(()=>{if(void 0!==a){var e=a.u,t=a.e,n={},s={};a.u=function(t){return e(t)+(n.hasOwnProperty(t)?"?"+n[t]:"")},a.e=function(i){return t(i).catch((function(t){var o=s.hasOwnProperty(i)?s[i]:999999;if(o<1){var r=e(i);throw t.message="Loading chunk "+i+" failed after 999999 retries.\n("+r+")",t.request=r,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();n[i]=t,s[i]=o-1,e(a.e(i))}),3e3)}))}))}}})(),(()=>{a.b=document.baseURI||self.location.href;var e={179:0};a.f.j=(t,n)=>{var s=a.o(e,t)?e[t]:void 0;if(0!==s)if(s)n.push(s[2]);else{var i=new Promise(((n,i)=>s=e[t]=[n,i]));n.push(s[2]=i);var o=a.p+a.u(t),r=new Error;a.l(o,(n=>{if(a.o(e,t)&&(0!==(s=e[t])&&(e[t]=void 0),s)){var i=n&&("load"===n.type?"missing":n.type),o=n&&n.target&&n.target.src;r.message="Loading chunk "+t+" failed.\n("+i+": "+o+")",r.name="ChunkLoadError",r.type=i,r.request=o,s[1](r)}}),"chunk-"+t,t)}},a.O.j=t=>0===e[t];var t=(t,n)=>{var s,i,[o,r,c]=n,l=0;if(o.some((t=>0!==e[t]))){for(s in r)a.o(r,s)&&(a.m[s]=r[s]);if(c)var d=c(a)}for(t&&t(n);la(6873)));c=a.O(c)})(); -//# sourceMappingURL=main.dcfbf05ad6e4f6f73d42.bundle.js.map \ No newline at end of file diff --git a/public/main.dcfbf05ad6e4f6f73d42.bundle.js.map b/public/main.dcfbf05ad6e4f6f73d42.bundle.js.map deleted file mode 100644 index 0182c430f..000000000 --- a/public/main.dcfbf05ad6e4f6f73d42.bundle.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"main.dcfbf05ad6e4f6f73d42.bundle.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/create fake namespace object","webpack://tweb/webpack/runtime/load script","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/config/state.ts","webpack://tweb/./src/helpers/getTimeFormat.ts","webpack://tweb/./src/environment/appleMx.ts","webpack://tweb/./src/environment/callSupport.ts","webpack://tweb/./src/environment/canUseTransferables.ts","webpack://tweb/./src/environment/canvasFilterSupport.ts","webpack://tweb/./src/environment/emojiSupport.ts","webpack://tweb/./src/environment/geolocationSupport.ts","webpack://tweb/./src/environment/groupCallSupport.ts","webpack://tweb/./src/environment/imageMimeTypesSupport.ts","webpack://tweb/./src/environment/mediaMimeTypesSupport.ts","webpack://tweb/./src/environment/movSupport.ts","webpack://tweb/./src/environment/opusSupport.ts","webpack://tweb/./src/environment/parallaxSupport.ts","webpack://tweb/./src/environment/screenSharingSupport.ts","webpack://tweb/./src/environment/sharedWorkerSupport.ts","webpack://tweb/./src/environment/touchSupport.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/environment/vibrateSupport.ts","webpack://tweb/./src/environment/videoMimeTypesSupport.ts","webpack://tweb/./src/environment/webmSupport.ts","webpack://tweb/./src/environment/webpSupport.ts","webpack://tweb/./src/environment/webrtcSupport.ts","webpack://tweb/./src/helpers/color.ts","webpack://tweb/./src/helpers/compareVersion.ts","webpack://tweb/./src/helpers/dom/blurActiveElement.ts","webpack://tweb/./src/helpers/dom/cancelEvent.ts","webpack://tweb/./src/helpers/dom/findUpClassName.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInput.ts","webpack://tweb/./src/helpers/dom/fixSafariStickyInputFocusing.ts","webpack://tweb/./src/helpers/dom/loadFonts.ts","webpack://tweb/./src/helpers/idleController.ts","webpack://tweb/./src/helpers/overlayCounter.ts","webpack://tweb/./src/helpers/schedulers.ts","webpack://tweb/./src/helpers/string/parseUriParams.ts","webpack://tweb/./src/helpers/themeController.ts","webpack://tweb/./src/helpers/setWorkerProxy.ts","webpack://tweb/./src/index.ts","webpack://tweb/./src/helpers/dom/toggleAttributePolyfill.ts","webpack://tweb/./src/lib/appManagers/appRuntimeManager.ts","webpack://tweb/./src/lib/appManagers/getProxiedManagers.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/environment/index.ts","webpack://tweb/./src/lib/appManagers/utils/state/loadState.ts","webpack://tweb/./src/lib/mtproto/mtprotoworker.ts","webpack://tweb/./src/lib/mtproto/singleInstance.ts","webpack://tweb/./src/lib/mtproto/telegramMeWebManager.ts","webpack://tweb/./src/helpers/dom/loadScript.ts","webpack://tweb/./src/lib/mtproto/webPushApiManager.ts","webpack://tweb/./src/lib/opusDecodeController.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/lib/richTextProcessor/wrapUrl.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/webp/webpWorkerController.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/make namespace object","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/jsonp chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"tweb:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t};\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {AppMediaPlaybackController} from '../components/appMediaPlaybackController';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport getTimeFormat from '../helpers/getTimeFormat';\nimport {nextRandomUint} from '../helpers/random';\nimport {AutoDownloadSettings, NotifyPeer, PeerNotifySettings} from '../layer';\nimport {TopPeerType, MyTopPeer} from '../lib/appManagers/appUsersManager';\nimport DialogsStorage from '../lib/storages/dialogs';\nimport FiltersStorage from '../lib/storages/filters';\nimport {AuthState} from '../types';\nimport App from './app';\n\nconst STATE_VERSION = App.version;\nconst BUILD = App.build;\n\nexport type Background = {\n type?: 'color' | 'image' | 'default', // ! DEPRECATED\n blur: boolean,\n highlightningColor?: string,\n color?: string,\n slug?: string, // image slug\n intensity?: number, // pattern intensity\n id: string | number, // wallpaper id\n};\n\nexport type Theme = {\n name: 'day' | 'night' | 'system',\n background: Background\n};\n\nexport type AutoDownloadPeerTypeSettings = {\n contacts: boolean,\n private: boolean,\n groups: boolean,\n channels: boolean\n};\n\nexport type State = {\n allDialogsLoaded: DialogsStorage['allDialogsLoaded'],\n pinnedOrders: DialogsStorage['pinnedOrders'],\n // contactsList: UserId[],\n contactsListCachedTime: number,\n updates: Partial<{\n seq: number,\n pts: number,\n date: number\n }>,\n // filters?: FiltersStorage['filters'], // ! DEPRECATED\n filtersArr?: FiltersStorage['filtersArr'],\n maxSeenMsgId: number,\n stateCreatedTime: number,\n recentEmoji: string[],\n recentCustomEmoji: DocId[],\n topPeersCache: {\n [type in TopPeerType]?: {\n peers: MyTopPeer[],\n cachedTime: number\n }\n },\n recentSearch: PeerId[],\n version: typeof STATE_VERSION,\n build: typeof BUILD,\n authState: AuthState,\n hiddenPinnedMessages: {[peerId: PeerId]: number},\n settings: {\n messagesTextSize: number,\n distanceUnit: 'kilometers' | 'miles',\n sendShortcut: 'enter' | 'ctrlEnter',\n animationsEnabled: boolean,\n autoDownload: {\n contacts?: boolean, // ! DEPRECATED\n private?: boolean, // ! DEPRECATED\n groups?: boolean, // ! DEPRECATED\n channels?: boolean, // ! DEPRECATED\n photo: AutoDownloadPeerTypeSettings,\n video: AutoDownloadPeerTypeSettings,\n file: AutoDownloadPeerTypeSettings\n },\n autoDownloadNew: AutoDownloadSettings,\n autoPlay: {\n gifs: boolean,\n videos: boolean\n },\n stickers: {\n suggest: boolean,\n loop: boolean\n },\n emoji: {\n suggest: boolean,\n big: boolean\n },\n background?: Background, // ! DEPRECATED\n themes: Theme[],\n theme: Theme['name'],\n notifications: {\n sound: boolean\n },\n nightTheme?: boolean, // ! DEPRECATED\n timeFormat: 'h12' | 'h23'\n },\n playbackParams: ReturnType,\n keepSigned: boolean,\n chatContextMenuHintWasShown: boolean,\n stateId: number,\n notifySettings: {[k in Exclude]?: PeerNotifySettings.peerNotifySettings}\n};\n\nconst BACKGROUND_DAY_DESKTOP: Background = {\n blur: false,\n slug: 'pattern',\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n intensity: 50,\n id: '1'\n};\n\nconst BACKGROUND_DAY_MOBILE: Background = {\n blur: false,\n slug: '',\n color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n highlightningColor: 'hsla(86.4, 43.846153%, 45.117647%, .4)',\n intensity: 0,\n id: '1'\n};\n\nconst BACKGROUND_NIGHT_DESKTOP: Background = {\n blur: false,\n slug: 'pattern',\n // color: '#dbddbb,#6ba587,#d5d88d,#88b884',\n color: '#fec496,#dd6cb9,#962fbf,#4f5bd5',\n highlightningColor: 'hsla(299.142857, 44.166666%, 37.470588%, .4)',\n intensity: -50,\n id: '-1'\n};\n\nconst BACKGROUND_NIGHT_MOBILE: Background = {\n blur: false,\n slug: '',\n color: '#0f0f0f',\n highlightningColor: 'hsla(0, 0%, 3.82353%, 0.4)',\n intensity: 0,\n id: '-1'\n};\n\nexport const STATE_INIT: State = {\n allDialogsLoaded: {},\n pinnedOrders: {},\n // contactsList: [],\n contactsListCachedTime: 0,\n updates: {},\n filtersArr: [],\n maxSeenMsgId: 0,\n stateCreatedTime: Date.now(),\n recentEmoji: [],\n recentCustomEmoji: [],\n topPeersCache: {},\n recentSearch: [],\n version: STATE_VERSION,\n build: BUILD,\n authState: {\n _: IS_MOBILE ? 'authStateSignIn' : 'authStateSignQr'\n },\n hiddenPinnedMessages: {},\n settings: {\n messagesTextSize: 16,\n distanceUnit: 'kilometers',\n sendShortcut: 'enter',\n animationsEnabled: true,\n autoDownload: {\n photo: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n video: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n },\n file: {\n contacts: true,\n private: true,\n groups: true,\n channels: true\n }\n },\n autoDownloadNew: {\n _: 'autoDownloadSettings',\n file_size_max: 3145728,\n pFlags: {\n video_preload_large: true,\n audio_preload_next: true\n },\n photo_size_max: 1048576,\n video_size_max: 15728640,\n video_upload_maxbitrate: 100\n },\n autoPlay: {\n gifs: true,\n videos: true\n },\n stickers: {\n suggest: true,\n loop: true\n },\n emoji: {\n suggest: true,\n big: true\n },\n themes: [{\n name: 'day',\n background: IS_MOBILE ? BACKGROUND_DAY_MOBILE : BACKGROUND_DAY_DESKTOP\n }, {\n name: 'night',\n background: IS_MOBILE ? BACKGROUND_NIGHT_MOBILE : BACKGROUND_NIGHT_DESKTOP\n }],\n theme: 'system',\n notifications: {\n sound: false\n },\n timeFormat: getTimeFormat()\n },\n playbackParams: {\n volume: 1,\n muted: false,\n playbackRate: 1,\n playbackRates: {\n voice: 1,\n video: 1,\n audio: 1\n },\n loop: false,\n round: false\n },\n keepSigned: true,\n chatContextMenuHintWasShown: false,\n stateId: nextRandomUint(32),\n notifySettings: {}\n};\n","export default function getTimeFormat(): 'h12' | 'h23' {\n // try {\n // const resolvedOptions = Intl.DateTimeFormat(navigator.language, {hour: 'numeric'}).resolvedOptions();\n // if('hourCycle' in resolvedOptions) {\n // return (resolvedOptions as any).hourCycle === 'h12' ? 'h12' : 'h23';\n // } else {\n // return resolvedOptions.hour12 ? 'h12' : 'h23';\n // }\n // } catch(err) {\n return new Date().toLocaleString().match(/\\s(AM|PM)/) ? 'h12' : 'h23';\n // }\n}\n","let IS_APPLE_MX = false;\n\ntry {\n // Awesome detect from https://stackoverflow.com/a/65412357\n const ctx = document.createElement('canvas').getContext('webgl');\n const extension = ctx.getExtension('WEBGL_debug_renderer_info');\n const renderer: string = extension && ctx.getParameter(extension.UNMASKED_RENDERER_WEBGL) || '';\n if((renderer.match(/Apple/) && !renderer.match(/Apple GPU/)) ||\n ctx.getSupportedExtensions().indexOf('WEBGL_compressed_texture_s3tc_srgb') === -1) {\n IS_APPLE_MX = true;\n }\n} catch(err) {\n\n}\n\nexport default IS_APPLE_MX;\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\n\nconst IS_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_CALL_SUPPORTED;\n","import {IS_SAFARI} from './userAgent';\n\n/*\n * This is used as a workaround for a memory leak in Safari caused by using Transferable objects to\n * transfer data between WebWorkers and the main thread.\n * https://github.com/mapbox/mapbox-gl-js/issues/8771\n *\n * This should be removed once the underlying Safari issue is fixed.\n */\n\nlet CAN_USE_TRANSFERABLES: boolean;\nif(!IS_SAFARI) CAN_USE_TRANSFERABLES = true;\nelse {\n try {\n const match = navigator.userAgent.match(/Version\\/(.+?) /);\n CAN_USE_TRANSFERABLES = +match[1] >= 14;\n } catch(err) {\n CAN_USE_TRANSFERABLES = false;\n }\n}\n\nexport default CAN_USE_TRANSFERABLES;\n","const IS_CANVAS_FILTER_SUPPORTED = 'filter' in (document.createElement('canvas').getContext('2d') || {});\n\nexport default IS_CANVAS_FILTER_SUPPORTED;\n","const IS_EMOJI_SUPPORTED = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1/* && false *//* || true */;\n\nexport default IS_EMOJI_SUPPORTED;\n","const IS_GEOLOCATION_SUPPORTED = !!navigator?.geolocation?.getCurrentPosition && false;\n\nexport default IS_GEOLOCATION_SUPPORTED;\n","import IS_WEBRTC_SUPPORTED from './webrtcSupport';\n\nconst IS_GROUP_CALL_SUPPORTED = IS_WEBRTC_SUPPORTED;\n\nexport default IS_GROUP_CALL_SUPPORTED;\n","import IS_WEBP_SUPPORTED from './webpSupport';\n\nconst IMAGE_MIME_TYPES_SUPPORTED = new Set([\n 'image/jpeg',\n 'image/png',\n 'image/bmp'\n]);\n\nif(IS_WEBP_SUPPORTED) {\n IMAGE_MIME_TYPES_SUPPORTED.add('image/webp');\n}\n\nexport default IMAGE_MIME_TYPES_SUPPORTED;\n","import IMAGE_MIME_TYPES_SUPPORTED from './imageMimeTypesSupport';\nimport VIDEO_MIME_TYPES_SUPPORTED from './videoMimeTypesSupport';\n\nconst arr = [...IMAGE_MIME_TYPES_SUPPORTED].concat([...VIDEO_MIME_TYPES_SUPPORTED]);\n\nconst MEDIA_MIME_TYPES_SUPPORTED = new Set(arr);\n\nexport default MEDIA_MIME_TYPES_SUPPORTED;\n","import {IS_APPLE_MOBILE, IS_SAFARI} from './userAgent';\n\n// mov is not supported in Chrome on macOS\nconst IS_MOV_SUPPORTED = !!document.createElement('video').canPlayType('video/quicktime') || IS_SAFARI || IS_APPLE_MOBILE;\n\nexport default IS_MOV_SUPPORTED;\n","const audio = document.createElement('audio');\nconst IS_OPUS_SUPPORTED = !!(audio.canPlayType && audio.canPlayType('audio/ogg;').replace(/no/, ''))/* && false */;\n\nexport default IS_OPUS_SUPPORTED;\n","import {IS_FIREFOX} from './userAgent';\n\nconst IS_PARALLAX_SUPPORTED = !IS_FIREFOX && false;\n\nexport default IS_PARALLAX_SUPPORTED;\n","const IS_SCREEN_SHARING_SUPPORTED = !!('getDisplayMedia' in (navigator?.mediaDevices || {}));\n\nexport default IS_SCREEN_SHARING_SUPPORTED;\n","import Modes from '../config/modes';\n\nconst IS_SHARED_WORKER_SUPPORTED = typeof(SharedWorker) !== 'undefined' && !Modes.noSharedWorker/* && false */;\n\nexport default IS_SHARED_WORKER_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// @ts-ignore\nconst IS_TOUCH_SUPPORTED = ('ontouchstart' in window) || (window.DocumentTouch && document instanceof DocumentTouch)/* || true */;\nexport default IS_TOUCH_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\n","const IS_VIBRATE_SUPPORTED = !!navigator?.vibrate;\n\nexport default IS_VIBRATE_SUPPORTED;\n","import IS_MOV_SUPPORTED from './movSupport';\n\nconst VIDEO_MIME_TYPES_SUPPORTED = new Set([\n 'image/gif', // have to display it as video\n 'video/mp4',\n 'video/webm'\n]);\n\nif(IS_MOV_SUPPORTED) {\n VIDEO_MIME_TYPES_SUPPORTED.add('video/quicktime');\n}\n\nexport default VIDEO_MIME_TYPES_SUPPORTED;\n","import {IS_APPLE_MOBILE, IS_SAFARI} from './userAgent';\n\nconst IS_WEBM_SUPPORTED = !!document.createElement('video').canPlayType('video/webm') && !IS_SAFARI && !IS_APPLE_MOBILE;\n\nexport default IS_WEBM_SUPPORTED;\n","const IS_WEBP_SUPPORTED = document.createElement('canvas').toDataURL('image/webp').startsWith('data:image/webp');\n\nexport default IS_WEBP_SUPPORTED;\n","import {IS_FIREFOX} from './userAgent';\n\nconst IS_WEBRTC_SUPPORTED = !!(typeof(RTCPeerConnection) !== 'undefined' && !IS_FIREFOX);\n\nexport default IS_WEBRTC_SUPPORTED;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type ColorHsla = {\n h: number,\n s: number,\n l: number,\n a: number\n};\n\nexport type ColorRgba = [number, number, number, number];\nexport type ColorRgb = [number, number, number];\n\n/**\n * @returns h [0, 360], s [0, 100], l [0, 100], a [0, 1]\n */\nexport function rgbaToHsla(r: number, g: number, b: number, a: number = 1): ColorHsla {\n r /= 255, g /= 255, b /= 255;\n const max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n let h: number, s: number;\n const l = (max + min) / 2;\n\n if(max === min) {\n h = s = 0; // achromatic\n } else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch(max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n }\n h /= 6;\n }\n\n return {\n h: h * 360,\n s: s * 100,\n l: l * 100,\n a\n };\n}\n\n// * https://stackoverflow.com/a/9493060/6758968\n/**\n * Converts an HSL color value to RGB. Conversion formula\n * adapted from http://en.wikipedia.org/wiki/HSL_color_space.\n * Assumes h in [0, 360], s, and l are contained in the set [0, 1], a in [0, 1] and\n * returns r, g, and b in the set [0, 255].\n *\n * @param {number} h The hue\n * @param {number} s The saturation\n * @param {number} l The lightness\n * @return {Array} The RGB representation\n */\nexport function hslaToRgba(h: number, s: number, l: number, a: number): ColorRgba {\n h /= 360, s /= 100, l /= 100;\n let r: number, g: number, b: number;\n\n if(s === 0) {\n r = g = b = l; // achromatic\n } else {\n const hue2rgb = function hue2rgb(p: number, q: number, t: number) {\n if(t < 0) t += 1;\n if(t > 1) t -= 1;\n if(t < 1/6) return p + (q - p) * 6 * t;\n if(t < 1/2) return q;\n if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;\n return p;\n }\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1/3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1/3);\n }\n\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255), Math.round(a * 255)];\n}\n\nexport function hslaStringToRgba(hsla: string) {\n const splitted = hsla.slice(5, -1).split(', ');\n const alpha = +splitted.pop();\n const arr = splitted.map((val) => {\n if(val.endsWith('%')) {\n return +val.slice(0, -1);\n }\n\n return +val;\n });\n\n return hslaToRgba(arr[0], arr[1], arr[2], alpha);\n}\n\nexport function hexaToRgba(hexa: string) {\n const arr: ColorRgba = [] as any;\n const offset = hexa[0] === '#' ? 1 : 0;\n if(hexa.length === (5 + offset)) {\n hexa = (offset ? '#' : '') + '0' + hexa.slice(offset);\n }\n\n if(hexa.length === (3 + offset)) {\n for(let i = offset; i < hexa.length; ++i) {\n arr.push(parseInt(hexa[i] + hexa[i], 16));\n }\n } else if(hexa.length === (4 + offset)) {\n for(let i = offset; i < (hexa.length - 1); ++i) {\n arr.push(parseInt(hexa[i] + hexa[i], 16));\n }\n\n arr.push(parseInt(hexa[hexa.length - 1], 16));\n } else {\n for(let i = offset; i < hexa.length; i += 2) {\n arr.push(parseInt(hexa.slice(i, i + 2), 16));\n }\n }\n\n return arr;\n}\n\nexport function hexToRgb(hex: string) {\n return hexaToRgba(hex.slice(0, 7)) as any as ColorRgb;\n}\n\nexport function hexaToHsla(hexa: string) {\n const rgba = hexaToRgba(hexa);\n return rgbaToHsla(rgba[0], rgba[1], rgba[2], rgba[3]);\n}\n\nexport function rgbaToHexa(rgba: ColorRgba | ColorRgb) {\n return '#' + rgba.map((v) => ('0' + v.toString(16)).slice(-2)).join('');\n}\n\nexport function hslaStringToHexa(hsla: string) {\n return rgbaToHexa(hslaStringToRgba(hsla));\n}\n\nexport function hslaStringToHex(hsla: string) {\n return hslaStringToHexa(hsla).slice(0, -2);\n}\n","export default function compareVersion(v1: string, v2: string): number {\n v1 = v1.split(' ', 1)[0];\n v2 = v2.split(' ', 1)[0];\n const s1 = v1.split('.');\n const s2 = v2.split('.');\n\n for(let i = 0; i < s1.length; ++i) {\n const v1 = +s1[i];\n const v2 = +s2[i];\n if(v1 > v2) return 1;\n else if(v1 < v2) return -1;\n }\n\n return 0;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function blurActiveElement() {\n if((document.activeElement as HTMLInputElement)?.blur) {\n (document.activeElement as HTMLInputElement).blur();\n return true;\n }\n\n return false;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport default function cancelEvent(event?: Event) {\n event ||= window.event;\n if(event) {\n if(!event.cancelable) {\n return false;\n }\n\n // @ts-ignore\n event = event.originalEvent || event;\n\n try {\n if(event.stopPropagation) event.stopPropagation();\n if(event.preventDefault) event.preventDefault();\n event.returnValue = false;\n event.cancelBubble = true;\n } catch(err) {}\n }\n\n return false;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// export function findUpClassName(el: any, className: string): T;\nexport default function findUpClassName(el: EventTarget | {closest: (selector: string) => any}, className: string): HTMLElement {\n return (el as any).closest('.' + className);\n /* if(el.classList.contains(className)) return el; // 03.02.2020\n\n while(el.parentElement) {\n el = el.parentElement;\n if(el.classList.contains(className))\n return el;\n }\n return null; */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {doubleRaf} from '../schedulers';\n\nexport default function fixSafariStickyInput(input: HTMLElement) {\n input.style.transform = 'translateY(-99999px)';\n /* input.style.position = 'fixed';\n input.style.top = '-99999px';\n input.style.left = '0'; */\n input.focus();\n\n // setTimeout(() => {\n doubleRaf().then(() => {\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\n /* input.style.position = '';\n input.style.top = ''; */\n input.style.transform = '';\n // fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4, undefined, FocusDirection.Static);\n\n /* setTimeout(() => {\n fastSmoothScroll(findUpClassName(input, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'start', 4);\n }, 50); */\n });\n // }, 0);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../../environment/touchSupport';\nimport {IS_MOBILE, IS_SAFARI} from '../../environment/userAgent';\nimport findUpClassName from './findUpClassName';\nimport fixSafariStickyInput from './fixSafariStickyInput';\n\nexport const IS_STICKY_INPUT_BUGGED = IS_SAFARI && IS_MOBILE && IS_TOUCH_SUPPORTED;\n\nif(IS_STICKY_INPUT_BUGGED) {\n const key: 'clientY' | 'pageY' = 'clientY';\n let startY = 0;\n const o = {capture: true, passive: false};\n const onTouchMove = (e: TouchEvent) => {\n const touch = e.touches[0];\n\n // console.log('touchmove y', touch[key], startY);\n\n const scrollable = findUpClassName(touch.target, 'scrollable-y');\n if(scrollable) {\n const y = touch[key];\n const scrolled = startY - y;\n\n /* if(y < startY) {\n startY = y;\n } */\n\n const scrollTop = scrollable.scrollTop;\n const scrollHeight = scrollable.scrollHeight;\n const clientHeight = scrollable.clientHeight;\n const nextScrollTop = scrollTop ? Math.round(scrollTop + scrollable.clientHeight + scrolled) : scrollTop + scrolled;\n // const needCancel = scrollHeight !== clientHeight ? (scrollTop && diff <= 1) || (scrollTop - diff) < 0 : true;\n const needCancel = scrollHeight === clientHeight || nextScrollTop >= scrollHeight || nextScrollTop <= 0;\n if(needCancel) {\n e.preventDefault();\n }\n\n // console.log('touchmove with scrollable', scrollTop, startY, scrolled, nextScrollTop, needCancel, e.cancelable);\n } else {\n e.preventDefault();\n\n // console.log('touchmove no scrollable', e, touch);\n }\n\n // if(e.target === document.documentElement || e.target === document.body) e.preventDefault();\n };\n\n // let el = document.createElement('div');\n // document.body.prepend(el);\n // let a = 0;\n\n // let hasFocus = false;\n let lastFocusOutTimeStamp = 0;\n document.addEventListener('focusin', (e) => {\n if(!(e.target as HTMLElement).classList.contains('is-sticky-input-bugged') || (e.timeStamp - lastFocusOutTimeStamp) < 50/* && document.activeElement === input */) {\n return;\n }\n\n // console.log('focusin', e, e.timeStamp);\n\n // hasFocus = true;\n // document.body.classList.add('is-keyboard-opened');\n\n // el.innerText = 'focusin ' + ++a;\n\n /* a < 2 && */fixSafariStickyInput(e.target as HTMLElement);\n\n document.addEventListener('touchmove', onTouchMove, o);\n document.addEventListener('touchstart', (e) => {\n if(e.touches.length > 1) return;\n const touchStart = e.touches[0];\n\n startY = touchStart[key];\n });\n }, {passive: true});\n\n document.addEventListener('focusout', (e) => {\n // console.log('focusout', e, e.timeStamp);\n document.removeEventListener('touchmove', onTouchMove, o);\n\n lastFocusOutTimeStamp = e.timeStamp;\n\n // el.innerText = 'focusout ' + ++a;\n\n // if(hasFocus) {\n // hasFocus = false;\n // document.body.classList.remove('is-keyboard-opened');\n // }\n }, {passive: true});\n\n document.addEventListener('visibilitychange', () => {\n // console.log('window visibilitychange');\n if(document.activeElement &&\n document.activeElement.classList.contains('is-sticky-input-bugged') &&\n (document.activeElement as HTMLElement).blur) {\n fixSafariStickyInput(document.activeElement as HTMLElement);\n }\n\n /* blurActiveElement();\n window.scrollTo(0, 0);\n setVH(); */\n }, {passive: true});\n}\n\nexport default function fixSafariStickyInputFocusing(input: HTMLElement) {\n if(!IS_STICKY_INPUT_BUGGED) return;\n input.classList.add('is-sticky-input-bugged');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from '../noop';\nimport pause from '../schedulers/pause';\n\nconst texts = ['b', 'б'];\ntype FontType = 'text' | 'icons' | 'monospace';\n\nconst cache: {\n [key: string]: {\n [text: string]: Promise\n }\n} = {};\n\nconst fonts: {[type in FontType]: string} = {\n text: 'Roboto',\n icons: 'tgico',\n monospace: 'Roboto Mono'\n};\n\nexport default function loadFonts(types: {[type in FontType]?: string[] | 'all'} = {\n text: texts,\n icons: undefined,\n monospace: texts\n}): Promise {\n if(!('fonts' in document)) {\n return Promise.resolve();\n }\n\n const promises: Promise[] = [];\n for(const type in types) {\n let _texts = types[type as FontType];\n if(_texts === 'all') {\n _texts = texts;\n }\n\n const font = fonts[type as FontType];\n const weights = type === 'icons' ? [500] : [400, 500];\n for(const weight of weights) {\n const _promises = (_texts || [undefined]).map((text) => {\n const key = [weight, '1rem', font].join(' ');\n const promise = (cache[key] ??= {})[text || ''] ??= document.fonts.load(key, text);\n return promise;\n });\n promises.push(..._promises);\n }\n }\n\n return Promise.race([\n Promise.all(promises).catch(noop),\n pause(1000)\n ]);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport EventListenerBase from './eventListenerBase';\n\nconst FOCUS_EVENT_NAME = IS_TOUCH_SUPPORTED ? 'touchstart' : 'mousemove';\nconst DO_NOT_IDLE = false;\n\nexport class IdleController extends EventListenerBase<{\n change: (idle: boolean) => void\n}> {\n private _isIdle: boolean;\n\n private focusPromise: Promise;\n private focusResolve: () => void;\n\n constructor() {\n super();\n\n this._isIdle = true;\n this.focusPromise = Promise.resolve();\n this.focusResolve = () => {};\n\n window.addEventListener('blur', () => {\n this.isIdle = true;\n\n window.addEventListener('focus', () => {\n this.isIdle = false;\n }, {once: true});\n });\n\n // * Prevent setting online after reloading page\n window.addEventListener(FOCUS_EVENT_NAME, () => {\n this.isIdle = false;\n }, {once: true, passive: true});\n\n this.addEventListener('change', (idle) => {\n if(idle) {\n this.focusPromise = new Promise((resolve) => {\n this.focusResolve = resolve;\n });\n } else {\n this.focusResolve();\n }\n });\n }\n\n public getFocusPromise() {\n return this.focusPromise;\n }\n\n public get isIdle() {\n return this._isIdle;\n }\n\n public set isIdle(value: boolean) {\n if(this._isIdle === value) {\n return;\n }\n\n if(DO_NOT_IDLE && value) {\n return;\n }\n\n this._isIdle = value;\n this.dispatchEvent('change', value);\n }\n}\n\nconst idleController = new IdleController();\nexport default idleController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport EventListenerBase from './eventListenerBase';\n\nexport class OverlayCounter extends EventListenerBase<{\n change: (isActive: boolean) => void\n}> {\n public overlaysActive = 0;\n\n get isOverlayActive() {\n return this.overlaysActive > 0;\n }\n\n set isOverlayActive(value: boolean) {\n this.overlaysActive += value ? 1 : -1;\n this.dispatchEvent('change', this.isOverlayActive);\n }\n}\n\nconst overlayCounter = new OverlayCounter();\nexport default overlayCounter;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// * Jolly Cobra's schedulers\nimport {NoneToVoidFunction} from '../types';\n\n/*\nexport function throttleWithTickEnd(fn: F) {\n return throttleWith(onTickEnd, fn);\n}\n\nexport function throttleWithNow(fn: F) {\n return throttleWith(runNow, fn);\n}\n\nexport function onTickEnd(cb: NoneToVoidFunction) {\n Promise.resolve().then(cb);\n}\n\nfunction runNow(fn: NoneToVoidFunction) {\n fn();\n} */\n\nlet fastRafCallbacks: NoneToVoidFunction[] | undefined;\nexport function fastRaf(callback: NoneToVoidFunction) {\n if(!fastRafCallbacks) {\n fastRafCallbacks = [callback];\n\n requestAnimationFrame(() => {\n const currentCallbacks = fastRafCallbacks!;\n fastRafCallbacks = undefined;\n currentCallbacks.forEach((cb) => cb());\n });\n } else {\n fastRafCallbacks.push(callback);\n }\n}\n\nlet fastRafConventionalCallbacks: NoneToVoidFunction[] | undefined, processing = false;\nexport function fastRafConventional(callback: NoneToVoidFunction) {\n if(!fastRafConventionalCallbacks) {\n fastRafConventionalCallbacks = [callback];\n\n requestAnimationFrame(() => {\n processing = true;\n for(let i = 0; i < fastRafConventionalCallbacks.length; ++i) {\n fastRafConventionalCallbacks[i]();\n }\n\n fastRafConventionalCallbacks = undefined;\n processing = false;\n });\n } else if(processing) {\n callback();\n } else {\n fastRafConventionalCallbacks.push(callback);\n }\n}\n\nlet rafPromise: Promise;\nexport function fastRafPromise() {\n if(rafPromise) return rafPromise;\n\n rafPromise = new Promise((resolve) => fastRaf(() => resolve()));\n rafPromise.then(() => {\n rafPromise = undefined;\n });\n\n return rafPromise;\n}\n\nexport function doubleRaf() {\n return new Promise((resolve) => {\n fastRaf(() => {\n fastRaf(resolve);\n });\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function parseUriParams(uri: string, splitted = uri.split('?')) {\n const params: any = {};\n if(!splitted[1]) return params;\n splitted[1].split('&').forEach((item) => {\n params[item.split('=')[0]] = decodeURIComponent(item.split('=')[1]);\n });\n\n return params;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Theme} from '../config/state';\nimport IS_TOUCH_SUPPORTED from '../environment/touchSupport';\nimport rootScope from '../lib/rootScope';\nimport {hslaStringToHex} from './color';\n\nexport class ThemeController {\n private themeColor: string;\n private _themeColorElem: Element;\n private systemTheme: Theme['name'];\n\n constructor() {\n rootScope.addEventListener('theme_change', () => {\n this.setTheme();\n });\n\n // rootScope.addEventListener('settings_updated', ())\n }\n\n private get themeColorElem() {\n if(this._themeColorElem !== undefined) {\n return this._themeColorElem;\n }\n\n return this._themeColorElem = document.head.querySelector('[name=\"theme-color\"]') as Element || null;\n }\n\n public setThemeColor(color = this.themeColor) {\n if(!color) {\n color = this.isNight() ? '#212121' : '#ffffff';\n }\n\n const themeColorElem = this.themeColorElem;\n if(themeColorElem) {\n themeColorElem.setAttribute('content', color);\n }\n }\n\n public setThemeListener() {\n try {\n const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const checkDarkMode = () => {\n // const theme = this.getTheme();\n this.systemTheme = darkModeMediaQuery.matches ? 'night' : 'day';\n // const newTheme = this.getTheme();\n\n if(rootScope.myId) {\n rootScope.dispatchEvent('theme_change');\n } else {\n this.setTheme();\n }\n };\n\n if('addEventListener' in darkModeMediaQuery) {\n darkModeMediaQuery.addEventListener('change', checkDarkMode);\n } else if('addListener' in darkModeMediaQuery) {\n (darkModeMediaQuery as any).addListener(checkDarkMode);\n }\n\n checkDarkMode();\n } catch(err) {\n\n }\n }\n\n public applyHighlightningColor() {\n let hsla: string;\n const theme = themeController.getTheme();\n if(theme.background.highlightningColor) {\n hsla = theme.background.highlightningColor;\n document.documentElement.style.setProperty('--message-highlightning-color', hsla);\n } else {\n document.documentElement.style.removeProperty('--message-highlightning-color');\n }\n\n if(!IS_TOUCH_SUPPORTED && hsla) {\n themeController.themeColor = hslaStringToHex(hsla);\n }\n }\n\n public setTheme() {\n const isNight = this.isNight();\n const colorScheme = document.head.querySelector('[name=\"color-scheme\"]');\n if(colorScheme) {\n colorScheme.setAttribute('content', isNight ? 'dark' : 'light');\n }\n\n document.documentElement.classList.toggle('night', isNight);\n this.setThemeColor();\n\n this.applyHighlightningColor();\n }\n\n public isNight() {\n return this.getTheme().name === 'night';\n }\n\n public getTheme(name: Theme['name'] = rootScope.settings.theme === 'system' ? this.systemTheme : rootScope.settings.theme) {\n return rootScope.settings.themes.find((t) => t.name === name);\n }\n}\n\nconst themeController = new ThemeController();\nexport default themeController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function setWorkerProxy() {\n // * hook worker constructor to set search parameters (test, debug, etc)\n const workerHandler = {\n construct(target: any, args: any) {\n let url = args[0] + '';\n if(url.indexOf('blob:') !== 0) {\n url += location.search;\n }\n\n return new target(url);\n }\n };\n\n [\n Worker,\n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].filter(Boolean).forEach((w) => {\n window[w.name as any] = new Proxy(w, workerHandler);\n });\n}\n\nsetWorkerProxy();\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from './config/app';\nimport blurActiveElement from './helpers/dom/blurActiveElement';\nimport cancelEvent from './helpers/dom/cancelEvent';\nimport {IS_STICKY_INPUT_BUGGED} from './helpers/dom/fixSafariStickyInputFocusing';\nimport loadFonts from './helpers/dom/loadFonts';\nimport IS_EMOJI_SUPPORTED from './environment/emojiSupport';\nimport {IS_ANDROID, IS_APPLE, IS_APPLE_MOBILE, IS_FIREFOX, IS_MOBILE, IS_MOBILE_SAFARI, IS_SAFARI} from './environment/userAgent';\nimport './materialize.scss';\nimport './scss/style.scss';\nimport pause from './helpers/schedulers/pause';\nimport setWorkerProxy from './helpers/setWorkerProxy';\nimport toggleAttributePolyfill from './helpers/dom/toggleAttributePolyfill';\nimport rootScope from './lib/rootScope';\nimport IS_TOUCH_SUPPORTED from './environment/touchSupport';\nimport I18n from './lib/langPack';\nimport './helpers/peerIdPolyfill';\nimport './lib/polyfill';\nimport apiManagerProxy from './lib/mtproto/mtprotoworker';\nimport getProxiedManagers from './lib/appManagers/getProxiedManagers';\nimport themeController from './helpers/themeController';\nimport overlayCounter from './helpers/overlayCounter';\nimport singleInstance from './lib/mtproto/singleInstance';\nimport parseUriParams from './helpers/string/parseUriParams';\nimport Modes from './config/modes';\nimport {AuthState} from './types';\nimport {IS_BETA} from './config/debug';\n// import appNavigationController from './components/appNavigationController';\n\ndocument.addEventListener('DOMContentLoaded', async() => {\n toggleAttributePolyfill();\n\n // polyfill for replaceChildren\n if((Node as any).prototype.replaceChildren === undefined) {\n (Node as any).prototype.replaceChildren = function(...nodes: any[]) {\n this.textContent = '';\n // while(this.lastChild) {\n // this.removeChild(this.lastChild);\n // }\n if(nodes) {\n this.append(...nodes);\n }\n }\n }\n\n rootScope.managers = getProxiedManagers();\n\n const manifest = document.getElementById('manifest') as HTMLLinkElement;\n manifest.href = `site${IS_APPLE && !IS_APPLE_MOBILE ? '_apple' : ''}.webmanifest?v=jw3mK7G9Aq`;\n\n singleInstance.start();\n\n // We listen to the resize event (https://css-tricks.com/the-trick-to-viewport-units-on-mobile/)\n const w = window.visualViewport || window; // * handle iOS keyboard\n let setViewportVH = false/* , hasFocus = false */;\n let lastVH: number;\n const setVH = () => {\n const vh = (setViewportVH && !overlayCounter.isOverlayActive ? (w as VisualViewport).height || (w as Window).innerHeight : window.innerHeight) * 0.01;\n if(lastVH === vh) {\n return;\n } else if(IS_TOUCH_SUPPORTED && lastVH < vh && (vh - lastVH) > 1) {\n blurActiveElement(); // (Android) fix blurring inputs when keyboard is being closed (e.g. closing keyboard by back arrow and touching a bubble)\n }\n\n lastVH = vh;\n\n // const vh = document.documentElement.scrollHeight * 0.01;\n document.documentElement.style.setProperty('--vh', `${vh}px`);\n\n // console.log('setVH', vh, setViewportVH ? w : window);\n\n /* if(setViewportVH && userAgent.isSafari && touchSupport.isTouchSupported && document.activeElement && (document.activeElement as HTMLElement).blur) {\n const rect = document.activeElement.getBoundingClientRect();\n if(rect.top < 0 || rect.bottom >= (w as any).height) {\n fastSmoothScroll(findUpClassName(document.activeElement, 'scrollable-y') || window as any, document.activeElement as HTMLElement, 'center', 4, undefined, FocusDirection.Static);\n }\n } */\n };\n\n setWorkerProxy;\n\n // const [_, touchSupport, userAgent, _rootScope, _appStateManager, _I18n, __/* , ___ */] = await Promise.all([\n // import('./lib/polyfill'),\n // import('./environment/touchSupport'),\n // import('./environment/userAgent'),\n // import('./lib/rootScope'),\n // import('./lib/appManagers/appStateManager'),\n // import('./lib/langPack'),\n // import('./helpers/peerIdPolyfill'),\n // // import('./helpers/cacheFunctionPolyfill')\n // ]);\n\n /* const {IS_TOUCH_SUPPORTED} = touchSupport;\n const {IS_FIREFOX, IS_MOBILE, IS_APPLE, IS_SAFARI, IS_APPLE_MOBILE, IS_ANDROID} = userAgent;\n const rootScope = _rootScope.default;\n const appStateManager = _appStateManager.default;\n const I18n = _I18n.default; */\n\n window.addEventListener('resize', setVH);\n setVH();\n\n if(IS_STICKY_INPUT_BUGGED) {\n const toggleResizeMode = () => {\n setViewportVH = tabId === 1 && IS_STICKY_INPUT_BUGGED && !overlayCounter.isOverlayActive;\n setVH();\n\n if(w !== window) {\n if(setViewportVH) {\n window.removeEventListener('resize', setVH);\n w.addEventListener('resize', setVH);\n } else {\n w.removeEventListener('resize', setVH);\n window.addEventListener('resize', setVH);\n }\n }\n };\n\n let tabId: number;\n (window as any).onImTabChange = (id: number) => {\n const wasTabId = tabId !== undefined;\n tabId = id;\n\n if(wasTabId || tabId === 1) {\n toggleResizeMode();\n }\n };\n\n overlayCounter.addEventListener('change', () => {\n toggleResizeMode();\n });\n }\n\n if(IS_FIREFOX && !IS_EMOJI_SUPPORTED) {\n document.addEventListener('dragstart', (e) => {\n const target = e.target as HTMLElement;\n if(target.tagName === 'IMG' && target.classList.contains('emoji')) {\n cancelEvent(e);\n return false;\n }\n });\n }\n\n if(IS_EMOJI_SUPPORTED) {\n document.documentElement.classList.add('native-emoji');\n }\n\n // prevent firefox image dragging\n document.addEventListener('dragstart', (e) => {\n if((e.target as HTMLElement)?.tagName === 'IMG') {\n e.preventDefault();\n return false;\n }\n });\n\n // restrict contextmenu on images (e.g. webp stickers)\n document.addEventListener('contextmenu', (e) => {\n if((e.target as HTMLElement).tagName === 'IMG' && !(window as any).appMediaViewer) {\n cancelEvent(e);\n }\n });\n\n if(IS_FIREFOX) {\n document.documentElement.classList.add('is-firefox', 'no-backdrop');\n }\n\n if(IS_MOBILE) {\n document.documentElement.classList.add('is-mobile');\n }\n\n if(IS_APPLE) {\n if(IS_SAFARI) {\n document.documentElement.classList.add('is-safari');\n }\n\n // document.documentElement.classList.add('emoji-supported');\n\n if(IS_APPLE_MOBILE) {\n document.documentElement.classList.add('is-ios');\n } else {\n document.documentElement.classList.add('is-mac');\n }\n } else if(IS_ANDROID) {\n document.documentElement.classList.add('is-android');\n\n /* document.addEventListener('focusin', (e) => {\n hasFocus = true;\n focusTime = Date.now();\n }, {passive: true});\n\n document.addEventListener('focusout', () => {\n hasFocus = false;\n }, {passive: true}); */\n }\n\n if(!IS_TOUCH_SUPPORTED) {\n document.documentElement.classList.add('no-touch');\n } else {\n document.documentElement.classList.add('is-touch');\n /* document.addEventListener('touchmove', (event: any) => {\n event = event.originalEvent || event;\n if(event.scale && event.scale !== 1) {\n event.preventDefault();\n }\n }, {capture: true, passive: false}); */\n }\n\n const perf = performance.now();\n\n // await pause(1000000);\n\n const langPromise = I18n.getCacheLangPack();\n\n const [stateResult, langPack] = await Promise.all([\n // loadState(),\n apiManagerProxy.sendState().then(([stateResult]) => stateResult),\n langPromise\n ]);\n I18n.setTimeFormat(stateResult.state.settings.timeFormat);\n\n rootScope.managers.rootScope.getPremium().then((isPremium) => {\n rootScope.premium = isPremium;\n });\n\n themeController.setThemeListener();\n\n if(langPack.appVersion !== App.langPackVersion) {\n I18n.getLangPack(langPack.lang_code);\n }\n\n /**\n * won't fire if font is loaded too fast\n */\n function fadeInWhenFontsReady(elem: HTMLElement, promise: Promise) {\n elem.style.opacity = '0';\n\n promise.then(() => {\n window.requestAnimationFrame(() => {\n elem.style.opacity = '';\n });\n });\n }\n\n console.log('got state, time:', performance.now() - perf);\n\n if(langPack.lang_code === 'ar' && IS_BETA && false) {\n document.body.classList.add('is-rtl');\n document.documentElement.dir = 'rtl';\n document.documentElement.lang = langPack.lang_code;\n I18n.setRTL(true);\n } else {\n document.documentElement.dir = 'ltr';\n }\n\n let authState = stateResult.state.authState;\n\n const hash = location.hash;\n const splitted = hash.split('?');\n const params = parseUriParams(hash, splitted);\n if(params.tgWebAuthToken && authState._ !== 'authStateSignedIn') {\n const data: AuthState.signImport['data'] = {\n token: params.tgWebAuthToken,\n dcId: +params.tgWebAuthDcId,\n userId: params.tgWebAuthUserId.toUserId(),\n isTest: params.tgWebAuthTest !== undefined && !!+params.tgWebAuthTest,\n tgAddr: params.tgaddr\n };\n\n if(data.isTest !== Modes.test) {\n const urlSearchParams = new URLSearchParams(location.search);\n if(+params.tgWebAuthTest) {\n urlSearchParams.set('test', '1');\n } else {\n urlSearchParams.delete('test');\n }\n\n location.search = urlSearchParams.toString();\n return;\n }\n\n rootScope.managers.appStateManager.pushToState('authState', authState = {_: 'authStateSignImport', data});\n\n // appNavigationController.overrideHash('?tgaddr=' + encodeURIComponent(params.tgaddr));\n }\n\n if(authState._ !== 'authStateSignedIn'/* || 1 === 1 */) {\n console.log('Will mount auth page:', authState._, Date.now() / 1000);\n\n const el = document.getElementById('auth-pages');\n let scrollable: HTMLElement;\n if(el) {\n scrollable = el.querySelector('.scrollable') as HTMLElement;\n if((!IS_TOUCH_SUPPORTED || IS_MOBILE_SAFARI)) {\n scrollable.classList.add('no-scrollbar');\n }\n\n // * don't remove this line\n scrollable.style.opacity = '0';\n\n const placeholder = document.createElement('div');\n placeholder.classList.add('auth-placeholder');\n\n scrollable.prepend(placeholder);\n scrollable.append(placeholder.cloneNode());\n }\n\n try {\n await Promise.all([\n import('./lib/mtproto/telegramMeWebManager'),\n import('./lib/mtproto/webPushApiManager')\n ]).then(([meModule, pushModule]) => {\n meModule.default.setAuthorized(false);\n pushModule.default.forceUnsubscribe();\n });\n } catch(err) {\n\n }\n\n let pagePromise: Promise;\n // langPromise.then(async() => {\n switch(authState._) {\n case 'authStateSignIn':\n pagePromise = (await import('./pages/pageSignIn')).default.mount();\n break;\n case 'authStateSignQr':\n pagePromise = (await import('./pages/pageSignQR')).default.mount();\n break;\n case 'authStateAuthCode':\n pagePromise = (await import('./pages/pageAuthCode')).default.mount(authState.sentCode);\n break;\n case 'authStatePassword':\n pagePromise = (await import('./pages/pagePassword')).default.mount();\n break;\n case 'authStateSignUp':\n pagePromise = (await import('./pages/pageSignUp')).default.mount(authState.authCode);\n break;\n case 'authStateSignImport':\n pagePromise = (await import('./pages/pageSignImport')).default.mount(authState.data);\n break;\n }\n // });\n\n if(scrollable) {\n // wait for text appear\n if(pagePromise) {\n await pagePromise;\n }\n\n const promise = 'fonts' in document ?\n Promise.race([\n pause(1000),\n document.fonts.ready\n ]) :\n Promise.resolve();\n fadeInWhenFontsReady(scrollable, promise);\n }\n\n /* setTimeout(async() => {\n (await import('./pages/pageAuthCode')).default.mount({\n \"_\": \"auth.sentCode\",\n \"pFlags\": {},\n \"flags\": 6,\n \"type\": {\n \"_\": \"auth.sentCodeTypeSms\",\n \"length\": 5\n },\n \"phone_code_hash\": \"\",\n \"next_type\": {\n \"_\": \"auth.codeTypeCall\"\n },\n \"timeout\": 120,\n \"phone_number\": \"\"\n });\n\n (await import('./pages/pageSignQR')).default.mount();\n\n (await import('./pages/pagePassword')).default.mount();\n\n (await import('./pages/pageSignUp')).default.mount({\n \"phone_code_hash\": \"\",\n \"phone_number\": \"\"\n });\n }, 500); */\n } else {\n console.log('Will mount IM page:', Date.now() / 1000);\n fadeInWhenFontsReady(document.getElementById('main-columns'), loadFonts());\n (await import('./pages/pageIm')).default.mount();\n }\n});\n","export default function toggleAttributePolyfill() {\n if(!Element.prototype.toggleAttribute) {\n Element.prototype.toggleAttribute = function(name, force) {\n if(force !== void 0) force = !!force;\n\n if(this.hasAttribute(name)) {\n if(force) return true;\n\n this.removeAttribute(name);\n return false;\n }\n if(force === false) return false;\n\n this.setAttribute(name, '');\n return true;\n };\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport class AppRuntimeManager {\n public reload() {\n try {\n location.reload();\n } catch(e) {};\n\n // if(window.chrome && chrome.runtime && chrome.runtime.reload) {\n // chrome.runtime.reload();\n // }\n }\n\n public close() {\n try {\n window.close();\n } catch(e) {}\n }\n\n /**\n * Better to call from event\n */\n public focus() {\n // // @ts-ignore\n // if(window.navigator.mozApps && document.hidden) {\n // // Get app instance and launch it to bring app to foreground\n // // @ts-ignore\n // window.navigator.mozApps.getSelf().onsuccess = function() {\n // this.result.launch();\n // };\n // } else {\n // // @ts-ignore\n // if(window.chrome && chrome.app && chrome.app.window) {\n // // @ts-ignore\n // chrome.app.window.current().focus();\n // }\n\n window.focus();\n // }\n }\n}\n\nconst appRuntimeManager = new AppRuntimeManager();\nexport default appRuntimeManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type createManagers from './createManagers';\nimport {ModifyFunctionsToAsync} from '../../types';\nimport apiManagerProxy from '../mtproto/mtprotoworker';\nimport {AckedResult} from '../mtproto/superMessagePort';\nimport noop from '../../helpers/noop';\nimport dT from '../../helpers/dT';\nimport DEBUG from '../../config/debug';\n\n// let stats: {\n// [manager: string]: {\n// [method: string]: {\n// times: number[],\n// byArgs: {\n// [args: string]: number[]\n// }\n// }\n// }\n// } = {};\n\n// let sentCount = 0;\n// let sentMethods: {[key: string]: number} = {};\n// let sentMethods2: {[key: string]: number} = {};\n// function collectStats(manager: string, method: string, args: any[], promise: Promise) {\n// ++sentCount;\n\n// const key = [manager, method].join('-');\n// if(!sentMethods[key]) sentMethods[key] = 0;\n// ++sentMethods[key];\n\n// const key2 = [('00000' + sentCount).slice(-5), key].join('-');\n\n// let byManager = stats[manager] ??= {};\n// let byMethod = byManager[method] ??= {times: [], byArgs: {}};\n\n// const perf = performance.now();\n// promise.catch(noop).finally(() => {\n// const time = performance.now() - perf;\n// byMethod.times.push(time);\n\n// sentMethods2[key2] = time;\n\n// try {\n// const argsString = JSON.stringify(args);\n// byMethod.byArgs[argsString].push(time);\n// } catch(err) {}\n// });\n// }\n\n// setInterval(() => {\n// // console.log(dT(), '[PROXY] stats', stats, sentCount, sentMethods, sentMethods2);\n// sentCount = 0;\n// sentMethods = {};\n// sentMethods2 = {};\n// }, 2000);\n\nconst DEBUG_MANAGER_REQUESTS: {[managerName: string]: Set} = {};\nif(DEBUG) {\n (window as any).DEBUG_MANAGER_REQUESTS = DEBUG_MANAGER_REQUESTS;\n}\n\nfunction createProxy(/* source: T, */name: string, ack?: boolean) {\n const proxy = new Proxy({}, {\n get: (target, p, receiver) => {\n // console.log('get', target, p, receiver);\n // @ts-ignore\n // const value = source[p];\n // if(typeof(value) !== 'function') {\n // return value;\n // }\n\n return (...args: any[]) => {\n const promise = apiManagerProxy.invoke('manager', {\n name,\n method: p as string,\n args\n }, ack as any);\n\n if(DEBUG) {\n if(DEBUG_MANAGER_REQUESTS[name]?.has(p as any)) {\n console.warn('manager request', name, p, args);\n }\n }\n\n // collectStats(name, p as string, args, promise);\n\n return promise;\n\n // @ts-ignore\n // return Promise.resolve(value.call(source, ...args));\n };\n }\n });\n\n return proxy;\n}\n\ntype AA = {\n [key in keyof T]: T[key] extends (...args: infer A) => infer R ? (...args: A) => Promise>> : never\n};\n\ntype T = Awaited>;\ntype ProxiedManagers = {\n [name in keyof T]?: ModifyFunctionsToAsync;\n} & {\n acknowledged?: {\n [name in keyof T]?: AA;\n }\n};\n\nfunction createProxyProxy(proxied: any, ack?: boolean) {\n return new Proxy(proxied, {\n get: (target, p, receiver) => {\n // @ts-ignore\n return target[p] ??= createProxy(p as string, ack);\n }\n });\n}\n\nlet proxied: ProxiedManagers;\nexport default function getProxiedManagers() {\n if(proxied) {\n return proxied;\n }\n\n proxied = createProxyProxy({}, false);\n proxied.acknowledged = createProxyProxy({}, true);\n return proxied;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type lang from '../lang';\nimport type langSign from '../langSign';\nimport type {State} from '../config/state';\nimport DEBUG, {MOUNT_CLASS_TO} from '../config/debug';\nimport {HelpCountriesList, HelpCountry, LangPackDifference, LangPackString} from '../layer';\nimport stateStorage from './stateStorage';\nimport App from '../config/app';\nimport rootScope from './rootScope';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport deepEqual from '../helpers/object/deepEqual';\nimport safeAssign from '../helpers/object/safeAssign';\nimport capitalizeFirstLetter from '../helpers/string/capitalizeFirstLetter';\nimport matchUrlProtocol from './richTextProcessor/matchUrlProtocol';\nimport wrapUrl from './richTextProcessor/wrapUrl';\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n 'messageActionChatCreate': 'ActionCreateGroup',\n 'messageActionChatCreateYou': 'ActionYouCreateGroup',\n 'messageActionChatEditTitle': 'ActionChangedTitle',\n 'messageActionChatEditPhoto': 'ActionChangedPhoto',\n 'messageActionChatEditVideo': 'ActionChangedVideo',\n 'messageActionChatDeletePhoto': 'ActionRemovedPhoto',\n 'messageActionChatReturn': 'ActionAddUserSelf',\n 'messageActionChatReturnYou': 'ActionAddUserSelfYou',\n 'messageActionChatJoined': 'ActionAddUserSelfMega',\n 'messageActionChatJoinedYou': 'ChannelMegaJoined',\n 'messageActionChatAddUser': 'ActionAddUser',\n 'messageActionChatAddUsers': 'ActionAddUser',\n 'messageActionChatLeave': 'ActionLeftUser',\n 'messageActionChatLeaveYou': 'YouLeft',\n 'messageActionChatDeleteUser': 'ActionKickUser',\n 'messageActionChatJoinedByLink': 'ActionInviteUser',\n 'messageActionPinMessage': 'Chat.Service.Group.UpdatedPinnedMessage',\n 'messageActionContactSignUp': 'Chat.Service.PeerJoinedTelegram',\n 'messageActionChannelCreate': 'ActionCreateChannel',\n 'messageActionChannelEditTitle': 'Chat.Service.Channel.UpdatedTitle',\n 'messageActionChannelEditPhoto': 'Chat.Service.Channel.UpdatedPhoto',\n 'messageActionChannelEditVideo': 'Chat.Service.Channel.UpdatedVideo',\n 'messageActionChannelDeletePhoto': 'Chat.Service.Channel.RemovedPhoto',\n 'messageActionHistoryClear': 'HistoryCleared',\n 'messageActionDiscussionStarted': 'DiscussionStarted',\n\n 'messageActionChannelMigrateFrom': 'ActionMigrateFromGroup',\n\n 'messageActionPhoneCall.video_in_ok': 'ChatList.Service.VideoCall.incoming',\n 'messageActionPhoneCall.video_out_ok': 'ChatList.Service.VideoCall.outgoing',\n 'messageActionPhoneCall.video_missed': 'ChatList.Service.VideoCall.Missed',\n 'messageActionPhoneCall.video_cancelled': 'ChatList.Service.VideoCall.Cancelled',\n 'messageActionPhoneCall.in_ok': 'ChatList.Service.Call.incoming',\n 'messageActionPhoneCall.out_ok': 'ChatList.Service.Call.outgoing',\n 'messageActionPhoneCall.missed': 'ChatList.Service.Call.Missed',\n 'messageActionPhoneCall.cancelled': 'ChatList.Service.Call.Cancelled',\n\n 'messageActionGroupCall.started': 'Chat.Service.VoiceChatStarted.Channel',\n 'messageActionGroupCall.started_by': 'Chat.Service.VoiceChatStarted',\n 'messageActionGroupCall.started_byYou': 'Chat.Service.VoiceChatStartedYou',\n 'messageActionGroupCall.ended': 'Chat.Service.VoiceChatFinished.Channel',\n 'messageActionGroupCall.ended_by': 'Chat.Service.VoiceChatFinished',\n 'messageActionGroupCall.ended_byYou': 'Chat.Service.VoiceChatFinishedYou',\n\n 'messageActionBotAllowed': 'Chat.Service.BotPermissionAllowed'\n};\n\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\n\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\nexport type FormatterArguments = FormatterArgument[];\n\nexport const UNSUPPORTED_LANG_PACK_KEY: LangPackKey = IS_MOBILE ? 'Message.Unsupported.Mobile' : 'Message.Unsupported.Desktop';\n\nnamespace I18n {\n export const strings: Map = new Map();\n export const countriesList: HelpCountry[] = [];\n let pluralRules: Intl.PluralRules;\n\n let cacheLangPackPromise: Promise;\n export let lastRequestedLangCode: string;\n export let lastRequestedNormalizedLangCode: string;\n export let lastAppliedLangCode: string;\n export let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n export let isRTL = false;\n\n export function setRTL(rtl: boolean) {\n isRTL = rtl;\n }\n\n function setLangCode(langCode: string) {\n lastRequestedLangCode = langCode;\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\n }\n\n export function getCacheLangPack(): Promise {\n if(cacheLangPackPromise) return cacheLangPackPromise;\n return cacheLangPackPromise = Promise.all([\n stateStorage.get('langPack') as Promise,\n polyfillPromise\n ]).then(([langPack]) => {\n if(!langPack/* || true */) {\n return loadLocalLangPack();\n } else if(DEBUG && false) {\n return getLangPack(langPack.lang_code);\n }/* else if(langPack.appVersion !== App.langPackVersion) {\n return getLangPack(langPack.lang_code);\n } */\n\n if(!lastRequestedLangCode) {\n setLangCode(langPack.lang_code);\n }\n\n applyLangPack(langPack);\n return langPack;\n }).finally(() => {\n cacheLangPackPromise = undefined;\n });\n }\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(' ')[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(' ')[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n export function loadLocalLangPack() {\n const defaultCode = App.langPackCode;\n setLangCode(defaultCode);\n return Promise.all([\n import('../lang'),\n import('../langSign'),\n import('../countries')\n ]).then(([lang, langSign, countries]) => {\n const strings: LangPackString[] = [];\n formatLocalStrings(lang.default, strings);\n formatLocalStrings(langSign.default, strings);\n\n const langPack: LangPackDifference = {\n _: 'langPackDifference',\n from_version: 0,\n lang_code: defaultCode,\n strings,\n version: 0,\n local: true,\n countries: countries.default\n };\n return saveLangPack(langPack);\n });\n }\n\n export function loadLangPack(langCode: string, web?: boolean) {\n web = true;\n requestedServerLanguage = true;\n const managers = rootScope.managers;\n return Promise.all([\n managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: web ? 'web' : App.langPack\n }),\n !web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: 'android'\n }),\n import('../lang'),\n import('../langSign'),\n managers.apiManager.invokeApiCacheable('help.getCountriesList', {\n lang_code: langCode,\n hash: 0\n }) as Promise,\n polyfillPromise\n ]);\n }\n\n export function getStrings(langCode: string, strings: string[]) {\n return rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n lang_pack: App.langPack,\n lang_code: langCode,\n keys: strings\n });\n }\n\n export function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n for(const i in strings) {\n // @ts-ignore\n const v = strings[i];\n if(typeof(v) === 'string') {\n pushTo.push({\n _: 'langPackString',\n key: i,\n value: v\n });\n } else {\n pushTo.push({\n _: 'langPackStringPluralized',\n key: i,\n ...v\n });\n }\n }\n\n return pushTo;\n }\n\n export function getLangPack(langCode: string, web?: boolean) {\n setLangCode(langCode);\n return loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n let strings: LangPackString[] = [];\n\n [localLangPack1, localLangPack2].forEach((l) => {\n formatLocalStrings(l.default as any, strings);\n });\n\n strings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\n\n langPack1.strings = strings;\n langPack1.countries = countries;\n return saveLangPack(langPack1);\n });\n }\n\n export function saveLangPack(langPack: LangPackDifference) {\n langPack.appVersion = App.langPackVersion;\n\n return stateStorage.set({langPack}).then(() => {\n applyLangPack(langPack);\n return langPack;\n });\n }\n\n export const polyfillPromise = (function checkIfPolyfillNeeded() {\n if(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n return Promise.resolve();\n } else {\n return import('./pluralPolyfill').then((_Intl) => {\n (window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n });\n }\n })();\n\n export function applyLangPack(langPack: LangPackDifference) {\n const currentLangCode = lastRequestedLangCode;\n if(langPack.lang_code !== currentLangCode) {\n return;\n }\n\n try {\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\n }\n\n try {\n pluralRules = new Intl.PluralRules(langPack.lang_code);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n }\n\n strings.clear();\n\n for(const string of langPack.strings) {\n strings.set(string.key as LangPackKey, string);\n }\n\n if(langPack.countries) {\n countriesList.length = 0;\n countriesList.push(...langPack.countries.countries);\n\n langPack.countries.countries.forEach((country) => {\n if(country.name) {\n const langPackKey: any = country.default_name;\n strings.set(langPackKey, {\n _: 'langPackString',\n key: langPackKey,\n value: country.name\n });\n }\n });\n }\n\n if(lastAppliedLangCode !== currentLangCode) {\n rootScope.dispatchEvent('language_change', currentLangCode);\n lastAppliedLangCode = currentLangCode;\n cachedDateTimeFormats.clear();\n updateAmPm();\n }\n\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance) {\n instance.update();\n }\n });\n }\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n if(Array.isArray(arg)) {\n out.push(...arg as any);\n } else {\n out.push(arg);\n }\n }\n\n export function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n const out: ReturnType = [];\n const regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n let lastIndex = 0;\n input.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n // console.table({match, p1, p2, offset, string});\n\n out.push(string.slice(lastIndex, offset));\n\n if(p1) {\n // offset += p1.length;\n let element: HTMLElement;\n switch(p1) {\n case '**': {\n element = document.createElement('b');\n break;\n }\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n }\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n } else if(p3) {\n out.push(document.createElement('br'));\n } else if(p4) {\n const idx = p4.lastIndexOf(']');\n const text = p4.slice(1, idx);\n\n const url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n if(url && matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n } else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n\n if(a instanceof DocumentFragment) { // right after wrapRichText\n a = a.firstChild as any;\n }\n\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n out.push(a);\n } else if(args) {\n pushNextArgument(out, args, indexHolder);\n }\n\n lastIndex = offset + match.length;\n return '';\n });\n\n if(lastIndex !== input.length) {\n out.push(input.slice(lastIndex));\n }\n\n return out;\n }\n\n export function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n export function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n export function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n const str = strings.get(key);\n let input: string;\n if(str) {\n if(str._ === 'langPackStringPluralized' && args?.length) {\n let v = args[0] as number | string;\n if(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n const s = pluralRules.select(v);\n // @ts-ignore\n input = str[s + '_value'] || str['other_value'];\n } else if(str._ === 'langPackString') {\n input = str.value;\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n\n const result = superFormatter(input, args);\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\n return result.map((item) => item instanceof Node ? item.textContent : item).join('');\n } else {\n return result;\n }\n\n /* if(plain) {\n if(args?.length) {\n const regExp = /un\\d|%\\d\\$.|%./g;\n let i = 0;\n input = input.replace(regExp, (match, offset, string) => {\n return '' + args[i++];\n });\n }\n\n return input;\n } else {\n return superFormatter(input, args);\n } */\n }\n\n export const weakMap: WeakMap> = new WeakMap();\n\n export type IntlElementBaseOptions = {\n element?: HTMLElement,\n property?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n };\n\n abstract class IntlElementBase {\n public element: IntlElementBaseOptions['element'];\n public property: IntlElementBaseOptions['property'];\n\n constructor(options?: Options) {\n this.element = options?.element || document.createElement('span');\n this.element.classList.add('i18n');\n\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n abstract update(options?: Options): void;\n }\n\n export type IntlElementOptions = IntlElementBaseOptions & {\n key?: LangPackKey,\n args?: FormatterArguments\n };\n export class IntlElement extends IntlElementBase {\n public key: IntlElementOptions['key'];\n public args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n public update(options?: IntlElementOptions) {\n safeAssign(this, options);\n\n if(this.property === 'innerHTML') {\n this.element.textContent = '';\n this.element.append(...format(this.key, false, this.args) as any);\n } else {\n // @ts-ignore\n const v = this.element[this.property];\n const formatted = format(this.key, true, this.args);\n\n // * hasOwnProperty won't work here\n if(v === undefined) this.element.dataset[this.property] = formatted;\n else (this.element as HTMLInputElement)[this.property] = formatted;\n }\n }\n\n public compareAndUpdate(options?: IntlElementOptions) {\n if(this.key === options.key && deepEqual(this.args, options.args)) {\n return;\n }\n\n return this.update(options);\n }\n }\n\n const cachedDateTimeFormats: Map = new Map();\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n const json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n dateTimeFormat = new Intl.DateTimeFormat(lastRequestedNormalizedLangCode + '-u-hc-' + timeFormat, options);\n cachedDateTimeFormats.set(json, dateTimeFormat);\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n export type IntlDateElementOptions = IntlElementBaseOptions & {\n date?: Date,\n options: Intl.DateTimeFormatOptions\n };\n export class IntlDateElement extends IntlElementBase {\n public date: IntlDateElementOptions['date'];\n public options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n }\n\n public update(options?: IntlDateElementOptions) {\n safeAssign(this, options);\n\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n const hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n }\n }\n\n export function i18n(key: LangPackKey, args?: FormatterArguments) {\n return new IntlElement({key, args}).element;\n }\n\n export function i18n_(options: IntlElementOptions) {\n return new IntlElement(options).element;\n }\n\n export function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n return new IntlElement({element, key, args, property}).element;\n }\n}\n\nexport {I18n};\nexport default I18n;\n\nconst i18n = I18n.i18n;\nexport {i18n};\n\nconst i18n_ = I18n.i18n_;\nexport {i18n_};\n\nconst _i18n = I18n._i18n;\nexport {_i18n};\n\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\n const arr = elements.slice(0, 1);\n for(let i = 1; i < elements.length; ++i) {\n const isLast = (elements.length - 1) === i;\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\n arr.push(elements[i]);\n }\n\n return arr;\n}\n\n\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\n const joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\n });\n\n return plain ? joined.join('') : joined;\n}\n\nMOUNT_CLASS_TO.I18n = I18n;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDialogFilter} from '../storages/filters';\n\n/**\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\n */\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\nexport type REAL_FOLDER_ID = 0 | 1;\n\nexport const NULL_PEER_ID: PeerId = 0;\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\nexport const SERVICE_PEER_ID: PeerId = 777000;\nexport const MUTE_UNTIL = 0x7FFFFFFF;\nexport const BOT_START_PARAM = '';\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\nexport const THUMB_TYPE_FULL = '';\nexport const TOPIC_COLORS = [0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, 0xFB6F5F];\nexport const ATTACH_MENU_BOT_ICON_NAME = 'default_static';\nexport const GENERAL_TOPIC_ID = 4295032831;\nexport const T_ME_PREFIXES = new Set(['web', 'k', 'z']);\n\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\nexport const REAL_FOLDERS: Set = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\n","import IS_CALL_SUPPORTED from './callSupport';\nimport CAN_USE_TRANSFERABLES from './canUseTransferables';\nimport IS_CANVAS_FILTER_SUPPORTED from './canvasFilterSupport';\nimport IS_EMOJI_SUPPORTED from './emojiSupport';\nimport IS_GEOLOCATION_SUPPORTED from './geolocationSupport';\nimport IS_GROUP_CALL_SUPPORTED from './groupCallSupport';\nimport IMAGE_MIME_TYPES_SUPPORTED from './imageMimeTypesSupport';\nimport MEDIA_MIME_TYPES_SUPPORTED from './mediaMimeTypesSupport';\nimport IS_MOV_SUPPORTED from './movSupport';\nimport IS_PARALLAX_SUPPORTED from './parallaxSupport';\nimport IS_SCREEN_SHARING_SUPPORTED from './screenSharingSupport';\nimport IS_TOUCH_SUPPORTED from './touchSupport';\nimport IS_VIBRATE_SUPPORTED from './vibrateSupport';\nimport VIDEO_MIME_TYPES_SUPPORTED from './videoMimeTypesSupport';\nimport IS_WEBM_SUPPORTED from './webmSupport';\nimport IS_WEBP_SUPPORTED from './webpSupport';\nimport IS_WEBRTC_SUPPORTED from './webrtcSupport';\nimport * as userAgent from './userAgent';\nimport IS_OPUS_SUPPORTED from './opusSupport';\nimport IS_SHARED_WORKER_SUPPORTED from './sharedWorkerSupport';\nimport IS_APPLE_MX from './appleMx';\n\nconst ENVIRONMENT = {\n CAN_USE_TRANSFERABLES,\n IS_APPLE_MX,\n IS_CALL_SUPPORTED,\n IS_CANVAS_FILTER_SUPPORTED,\n IS_EMOJI_SUPPORTED,\n IS_GEOLOCATION_SUPPORTED,\n IS_GROUP_CALL_SUPPORTED,\n IS_MOV_SUPPORTED,\n IS_PARALLAX_SUPPORTED,\n IS_SCREEN_SHARING_SUPPORTED,\n IS_TOUCH_SUPPORTED,\n IS_VIBRATE_SUPPORTED,\n IS_OPUS_SUPPORTED,\n IS_SHARED_WORKER_SUPPORTED,\n IS_WEBM_SUPPORTED,\n IS_WEBP_SUPPORTED,\n IS_WEBRTC_SUPPORTED,\n IMAGE_MIME_TYPES_SUPPORTED,\n MEDIA_MIME_TYPES_SUPPORTED,\n VIDEO_MIME_TYPES_SUPPORTED,\n ...userAgent\n};\n\nexport default ENVIRONMENT;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../../../../config/app';\nimport DEBUG from '../../../../config/debug';\nimport {AutoDownloadPeerTypeSettings, State, STATE_INIT} from '../../../../config/state';\nimport compareVersion from '../../../../helpers/compareVersion';\nimport copy from '../../../../helpers/object/copy';\nimport validateInitObject from '../../../../helpers/object/validateInitObject';\nimport {UserAuth} from '../../../mtproto/mtproto_config';\nimport rootScope from '../../../rootScope';\nimport stateStorage from '../../../stateStorage';\nimport sessionStorage from '../../../sessionStorage';\nimport {recordPromiseBound} from '../../../../helpers/recordPromise';\n// import RESET_STORAGES_PROMISE from \"../storages/resetStoragesPromise\";\nimport {StoragesResults} from '../storages/loadStorages';\nimport {logger} from '../../../logger';\n\nconst REFRESH_EVERY = 24 * 60 * 60 * 1000; // 1 day\n// const REFRESH_EVERY = 1e3;\n// const REFRESH_EVERY_WEEK = 24 * 60 * 60 * 1000 * 7; // 7 days\n\nconst STATE_VERSION = STATE_INIT.version;\nconst BUILD = STATE_INIT.build;\n\nconst ALL_KEYS = Object.keys(STATE_INIT) as any as Array;\n\nconst REFRESH_KEYS: Array = [\n 'contactsListCachedTime',\n 'stateCreatedTime',\n 'maxSeenMsgId',\n 'filtersArr'\n];\n\n// const REFRESH_KEYS_WEEK = ['dialogs', 'allDialogsLoaded', 'updates', 'pinnedOrders'] as any as Array;\n\nasync function loadStateInner() {\n const log = logger('STATE-LOADER');\n\n const totalPerf = performance.now();\n const recordPromise = recordPromiseBound(log);\n\n const promises = ALL_KEYS.map((key) => recordPromise(stateStorage.get(key), 'state ' + key))\n .concat(\n recordPromise(sessionStorage.get('user_auth'), 'auth'),\n recordPromise(sessionStorage.get('state_id'), 'auth'),\n recordPromise(sessionStorage.get('k_build'), 'auth')\n )\n .concat(recordPromise(stateStorage.get('user_auth'), 'old auth')); // support old webk format\n\n const arr = await Promise.all(promises);\n log.warn('promises', performance.now() - totalPerf);\n // await new Promise((resolve) => setTimeout(resolve, 3e3));\n /* const self = this;\n const skipHandleKeys = new Set(['isProxy', 'filters', 'drafts']);\n const getHandler = (path?: string) => {\n return {\n get(target: any, key: any) {\n if(key === 'isProxy') {\n return true;\n }\n\n const prop = target[key];\n\n if(prop !== undefined && !skipHandleKeys.has(key) && !prop.isProxy && typeof(prop) === 'object') {\n target[key] = new Proxy(prop, getHandler(path || key));\n return target[key];\n }\n\n return prop;\n },\n set(target: any, key: any, value: any) {\n console.log('Setting', target, `.${key} to equal`, value, path);\n\n target[key] = value;\n\n // @ts-ignore\n self.pushToState(path || key, path ? self.state[path] : value, false);\n\n return true;\n }\n };\n }; */\n\n // const pushed: {key: keyof State, value: State[keyof State]}[] = [];\n const pushedKeys: (keyof State)[] = [];\n const pushToState = (key: T, value: State[T]) => {\n // appStateManager.pushToState(key, value);\n state[key] = value;\n // pushed.push({key, value});\n pushedKeys.push(key);\n };\n\n const replaceState = (_state: State) => {\n // pushed.length = 0;\n pushedKeys.length = 0;\n state = _state;\n pushedKeys.push(...Object.keys(state) as any as typeof pushedKeys);\n // state = appStateManager.setState(_state);\n // appStateManager.storage.set(state);\n };\n\n // let state: State = appStateManager.setState({} as any);\n let state: State = {} as any;\n\n // ! then can't store false values\n for(let i = 0, length = ALL_KEYS.length; i < length; ++i) {\n const key = ALL_KEYS[i];\n const value = arr[i];\n if(value !== undefined) {\n // @ts-ignore\n state[key] = value;\n } else {\n pushToState(key, copy(STATE_INIT[key]));\n }\n }\n\n arr.splice(0, ALL_KEYS.length);\n\n // * Read auth\n let auth = arr.shift() as UserAuth | number;\n const stateId = arr.shift() as number;\n const sessionBuild = arr.shift() as number;\n const shiftedWebKAuth = arr.shift() as UserAuth | number;\n if(!auth && shiftedWebKAuth) { // support old webk auth\n auth = shiftedWebKAuth;\n const keys: string[] = ['dc', 'server_time_offset', 'xt_instance'];\n for(let i = 1; i <= 5; ++i) {\n keys.push(`dc${i}_server_salt`);\n keys.push(`dc${i}_auth_key`);\n }\n\n const values = await Promise.all(keys.map((key) => stateStorage.get(key as any)));\n keys.push('user_auth');\n values.push(typeof(auth) === 'number' || typeof(auth) === 'string' ? {dcID: values[0] || App.baseDcId, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} as UserAuth : auth);\n\n const obj: any = {};\n keys.forEach((key, idx) => {\n obj[key] = values[idx];\n });\n\n await sessionStorage.set(obj);\n }\n\n /* if(!auth) { // try to read Webogram's session from localStorage\n try {\n const keys = Object.keys(localStorage);\n for(let i = 0; i < keys.length; ++i) {\n const key = keys[i];\n let value: any;\n try {\n value = localStorage.getItem(key);\n value = JSON.parse(value);\n } catch(err) {\n //console.error(err);\n }\n\n sessionStorage.set({\n [key as any]: value\n });\n }\n\n auth = sessionStorage.getFromCache('user_auth');\n } catch(err) {\n this.log.error('localStorage import error', err);\n }\n } */\n\n if(auth) {\n // ! Warning ! DON'T delete this\n state.authState = {_: 'authStateSignedIn'};\n rootScope.dispatchEvent('user_auth', typeof(auth) === 'number' || typeof(auth) === 'string' ?\n {dcID: 0, date: Date.now() / 1000 | 0, id: auth.toPeerId(false)} :\n auth); // * support old version\n }\n\n const resetStorages: Set = new Set();\n if(state.stateId !== stateId) {\n if(stateId !== undefined) {\n const preserve: Map = new Map([\n ['authState', undefined],\n ['stateId', undefined]\n ]);\n\n preserve.forEach((_, key) => {\n preserve.set(key, copy(state[key]));\n });\n\n state = copy(STATE_INIT);\n\n preserve.forEach((value, key) => {\n // @ts-ignore\n state[key] = value;\n });\n\n const r: {[k in keyof StoragesResults]: number} = {\n chats: 1,\n dialogs: 1,\n users: 1\n };\n for(const key in r) {\n resetStorages.add(key as keyof StoragesResults);\n // this.storagesResults[key as keyof AppStateManager['storagesResults']].length = 0;\n }\n\n replaceState(state);\n }\n\n await sessionStorage.set({\n state_id: state.stateId\n });\n }\n\n const time = Date.now();\n if((state.stateCreatedTime + REFRESH_EVERY) < time) {\n if(DEBUG) {\n log('will refresh state', state.stateCreatedTime, time);\n }\n\n const r = (keys: typeof REFRESH_KEYS) => {\n keys.forEach((key) => {\n pushToState(key, copy(STATE_INIT[key]));\n\n // const s = appStateManager.storagesResults[key as keyof AppStateManager['storagesResults']];\n // if(s?.length) {\n // appStateManager.resetStorages.add(key as keyof AppStateManager['storagesResults']);\n // s.length = 0;\n // }\n });\n };\n\n r(REFRESH_KEYS);\n\n /* if((state.stateCreatedTime + REFRESH_EVERY_WEEK) < time) {\n if(DEBUG) {\n this.log('will refresh updates');\n }\n\n r(REFRESH_KEYS_WEEK);\n } */\n }\n\n // state = this.state = new Proxy(state, getHandler());\n\n // * support old version\n if(!state.settings.hasOwnProperty('theme') && state.settings.hasOwnProperty('nightTheme')) {\n state.settings.theme = state.settings.nightTheme ? 'night' : 'day';\n pushToState('settings', state.settings);\n }\n\n // * support old version\n if(!state.settings.hasOwnProperty('themes') && state.settings.background) {\n state.settings.themes = copy(STATE_INIT.settings.themes);\n const theme = state.settings.themes.find((t) => t.name === state.settings.theme);\n if(theme) {\n theme.background = state.settings.background;\n pushToState('settings', state.settings);\n }\n }\n\n // * migrate auto download settings\n const autoDownloadSettings = state.settings.autoDownload;\n if(autoDownloadSettings?.private !== undefined) {\n const oldTypes = [\n 'contacts' as const,\n 'private' as const,\n 'groups' as const,\n 'channels' as const\n ];\n\n const mediaTypes = [\n 'photo' as const,\n 'video' as const,\n 'file' as const\n ];\n\n mediaTypes.forEach((mediaType) => {\n const peerTypeSettings: AutoDownloadPeerTypeSettings = autoDownloadSettings[mediaType] = {} as any;\n oldTypes.forEach((peerType) => {\n peerTypeSettings[peerType] = autoDownloadSettings[peerType];\n });\n });\n\n oldTypes.forEach((peerType) => {\n delete autoDownloadSettings[peerType];\n });\n\n pushToState('settings', state.settings);\n }\n\n validateInitObject(STATE_INIT, state, (missingKey) => {\n pushToState(missingKey as keyof State, state[missingKey as keyof State]);\n });\n\n let newVersion: string, oldVersion: string;\n if(state.version !== STATE_VERSION || state.build !== BUILD/* || true */) {\n // reset filters and dialogs if version is older\n if(/* compareVersion(state.version, '0.8.7') === -1 || state.build < 179 || */state.build < 217) {\n state.allDialogsLoaded = copy(STATE_INIT.allDialogsLoaded);\n state.pinnedOrders = copy(STATE_INIT.pinnedOrders);\n state.filtersArr = copy(STATE_INIT.filtersArr);\n\n resetStorages.add('dialogs');\n }\n\n // * migrate backgrounds (March 13, 2022; to version 1.3.0)\n if(compareVersion(state.version, '1.3.0') === -1) {\n let migrated = false;\n state.settings.themes.forEach((theme, idx, arr) => {\n if((\n theme.name === 'day' &&\n theme.background.slug === 'ByxGo2lrMFAIAAAAmkJxZabh8eM' &&\n theme.background.type === 'image'\n ) || (\n theme.name === 'night' &&\n theme.background.color === '#0f0f0f' &&\n theme.background.type === 'color'\n )) {\n const newTheme = STATE_INIT.settings.themes.find((newTheme) => newTheme.name === theme.name);\n if(newTheme) {\n arr[idx] = copy(newTheme);\n migrated = true;\n }\n }\n });\n\n if(migrated) {\n pushToState('settings', state.settings);\n }\n }\n\n if(compareVersion(state.version, STATE_VERSION) !== 0) {\n newVersion = STATE_VERSION;\n oldVersion = state.version;\n }\n\n pushToState('version', STATE_VERSION);\n pushToState('build', BUILD);\n }\n\n if(sessionBuild !== BUILD && (!sessionBuild || sessionBuild < BUILD)) {\n sessionStorage.set({k_build: BUILD});\n }\n\n // ! probably there is better place for it\n rootScope.settings = state.settings;\n\n if(DEBUG) {\n log('state res', state, copy(state));\n }\n\n // return resolve();\n\n log.warn('total', performance.now() - totalPerf);\n\n // RESET_STORAGES_PROMISE.resolve(appStateManager.resetStorages);\n\n return {state, resetStorages, newVersion, oldVersion, pushedKeys};\n}\n\nlet promise: ReturnType;\nexport default function loadState() {\n return promise ??= loadStateInner();\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Awaited} from '../../types';\nimport type {CacheStorageDbName} from '../files/cacheStorage';\nimport type {State} from '../../config/state';\nimport type {Message, MessagePeerReaction, PeerNotifySettings} from '../../layer';\nimport {CryptoMethods} from '../crypto/crypto_methods';\nimport rootScope from '../rootScope';\nimport webpWorkerController from '../webp/webpWorkerController';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport sessionStorage from '../sessionStorage';\nimport webPushApiManager from './webPushApiManager';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport telegramMeWebManager from './telegramMeWebManager';\nimport pause from '../../helpers/schedulers/pause';\nimport ENVIRONMENT from '../../environment';\nimport loadState from '../appManagers/utils/state/loadState';\nimport opusDecodeController from '../opusDecodeController';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport SuperMessagePort from './superMessagePort';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport toggleStorages from '../../helpers/toggleStorages';\nimport idleController from '../../helpers/idleController';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport App from '../../config/app';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\n\nexport type Mirrors = {\n state: State\n};\n\nexport type MirrorTaskPayload = {\n name: T,\n key?: K,\n value: any\n};\n\nexport type NotificationBuildTaskPayload = {\n message: Message.message | Message.messageService,\n fwdCount?: number,\n peerReaction?: MessagePeerReaction,\n peerTypeNotifySettings?: PeerNotifySettings\n};\n\nexport type TabState = {\n chatPeerIds: PeerId[],\n idleStartTime: number,\n};\n\nclass ApiManagerProxy extends MTProtoMessagePort {\n // private worker: /* Window */Worker;\n // private sockets: Map = new Map();\n private mirrors: Mirrors;\n\n public newVersion: string;\n public oldVersion: string;\n\n private tabState: TabState;\n\n public serviceMessagePort: ServiceMessagePort;\n private lastServiceWorker: ServiceWorker;\n\n private pingServiceWorkerPromise: CancellablePromise;\n\n constructor() {\n super();\n\n this.mirrors = {} as any;\n this.tabState = {\n chatPeerIds: [],\n idleStartTime: 0\n };\n\n this.log('constructor');\n\n \n this.registerWorker();\n \n\n this.registerServiceWorker();\n this.registerCryptoWorker();\n\n // const perf = performance.now();\n this.addMultipleEventsListeners({\n convertWebp: ({fileName, bytes}) => {\n return webpWorkerController.convert(fileName, bytes);\n },\n\n convertOpus: ({fileName, bytes}) => {\n return opusDecodeController.pushDecodeTask(bytes, false).then((result) => result.bytes);\n },\n\n event: ({name, args}) => {\n // @ts-ignore\n rootScope.dispatchEventSingle(name, ...args);\n },\n\n localStorageProxy: (payload) => {\n const storageTask = payload;\n return (sessionStorage[storageTask.type] as any)(...storageTask.args);\n },\n\n mirror: this.onMirrorTask\n\n // hello: () => {\n // this.log.error('time hello', performance.now() - perf);\n // }\n });\n\n // this.addTaskListener('socketProxy', (task) => {\n // const socketTask = task.payload;\n // const id = socketTask.id;\n // //console.log('socketProxy', socketTask, id);\n\n // if(socketTask.type === 'send') {\n // const socket = this.sockets.get(id);\n // socket.send(socketTask.payload);\n // } else if(socketTask.type === 'close') { // will remove from map in onClose\n // const socket = this.sockets.get(id);\n // socket.close();\n // } else if(socketTask.type === 'setup') {\n // const socket = new Socket(socketTask.payload.dcId, socketTask.payload.url, socketTask.payload.logSuffix);\n\n // const onOpen = () => {\n // //console.log('socketProxy onOpen');\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'open',\n // id\n // }\n // });\n // };\n // const onClose = () => {\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'close',\n // id\n // }\n // });\n\n // socket.removeEventListener('open', onOpen);\n // socket.removeEventListener('close', onClose);\n // socket.removeEventListener('message', onMessage);\n // this.sockets.delete(id);\n // };\n // const onMessage = (buffer: ArrayBuffer) => {\n // this.postMessage({\n // type: 'socketProxy',\n // payload: {\n // type: 'message',\n // id,\n // payload: buffer\n // }\n // });\n // };\n\n // socket.addEventListener('open', onOpen);\n // socket.addEventListener('close', onClose);\n // socket.addEventListener('message', onMessage);\n // this.sockets.set(id, socket);\n // }\n // });\n\n rootScope.addEventListener('language_change', (language) => {\n rootScope.managers.networkerFactory.setLanguage(language);\n });\n\n window.addEventListener('online', () => {\n rootScope.managers.networkerFactory.forceReconnectTimeout();\n });\n\n rootScope.addEventListener('logging_out', () => {\n const toClear: CacheStorageDbName[] = ['cachedFiles', 'cachedStreamChunks'];\n Promise.all([\n toggleStorages(false, true),\n sessionStorage.clear(),\n Promise.race([\n telegramMeWebManager.setAuthorized(false),\n pause(3000)\n ]),\n webPushApiManager.forceUnsubscribe(),\n Promise.all(toClear.map((cacheName) => caches.delete(cacheName)))\n ]).finally(() => {\n appRuntimeManager.reload();\n });\n });\n\n idleController.addEventListener('change', (idle) => {\n this.updateTabStateIdle(idle);\n });\n this.updateTabStateIdle(idleController.isIdle);\n\n this.log('Passing environment:', ENVIRONMENT);\n this.invoke('environment', ENVIRONMENT);\n // this.sendState();\n }\n\n public pingServiceWorkerWithIframe() {\n if(this.pingServiceWorkerPromise) {\n return this.pingServiceWorkerPromise;\n }\n\n const promise = this.pingServiceWorkerPromise = deferredPromise();\n const iframe = document.createElement('iframe');\n iframe.hidden = true;\n const onLoad = () => {\n setTimeout(() => { // ping once in 10 seconds\n this.pingServiceWorkerPromise = undefined;\n }, 10e3);\n\n clearTimeout(timeout);\n iframe.remove();\n iframe.removeEventListener('load', onLoad);\n iframe.removeEventListener('error', onLoad);\n promise.resolve();\n };\n iframe.addEventListener('load', onLoad);\n iframe.addEventListener('error', onLoad);\n iframe.src = 'ping/' + (Math.random() * 0xFFFFFFFF | 0);\n document.body.append(iframe);\n\n const timeout = window.setTimeout(onLoad, 1e3);\n return promise;\n }\n\n private attachServiceWorker(serviceWorker: ServiceWorker) {\n this.lastServiceWorker && this.serviceMessagePort.detachPort(this.lastServiceWorker);\n this.serviceMessagePort.attachSendPort(this.lastServiceWorker = serviceWorker);\n this.serviceMessagePort.invokeVoid('hello', undefined);\n }\n\n private _registerServiceWorker() {\n navigator.serviceWorker.register(\n /* webpackChunkName: \"sw\" */\n new URL('../serviceWorker/index.service', import.meta.url),\n {scope: './'}\n ).then((registration) => {\n this.log('SW registered', registration);\n\n // ! doubtful fix for hard refresh\n if(registration.active && !navigator.serviceWorker.controller) {\n return registration.unregister().then(() => {\n window.location.reload();\n });\n }\n\n const sw = registration.installing || registration.waiting || registration.active;\n sw.addEventListener('statechange', (e) => {\n this.log('SW statechange', e);\n });\n\n const controller = navigator.serviceWorker.controller || registration.installing || registration.waiting || registration.active;\n this.attachServiceWorker(controller);\n\n \n \n \n }, (err) => {\n this.log.error('SW registration failed!', err);\n\n this.invokeVoid('serviceWorkerOnline', false);\n });\n }\n\n private registerServiceWorker() {\n if(!('serviceWorker' in navigator)) return;\n\n this.serviceMessagePort = new ServiceMessagePort();\n\n // this.addMultipleEventsListeners({\n // hello: () => {\n // // this.serviceMessagePort.invokeVoid('port', undefined);\n // }\n // });\n\n // ! I hate webpack - it won't load it by using worker.register, only navigator.serviceWorker will do it.\n const worker = navigator.serviceWorker;\n this._registerServiceWorker();\n\n // worker.startMessages();\n\n worker.addEventListener('controllerchange', () => {\n this.log.warn('controllerchange');\n\n const controller = worker.controller;\n this.attachServiceWorker(controller);\n\n controller.addEventListener('error', (e) => {\n this.log.error('controller error:', e);\n });\n });\n\n \n \n \n this.serviceMessagePort.attachListenPort(worker);\n this.serviceMessagePort.addMultipleEventsListeners({\n port: (payload, source, event) => {\n this.invokeVoid('serviceWorkerPort', undefined, undefined, [event.ports[0]]);\n },\n\n hello: (payload, source) => {\n this.serviceMessagePort.resendLockTask(source);\n }\n });\n \n\n worker.addEventListener('messageerror', (e) => {\n this.log.error('SW messageerror:', e);\n });\n }\n\n private async registerCryptoWorker() {\n const get = (url: string) => {\n return fetch(url).then((response) => response.text()).then((text) => {\n const pathnameSplitted = location.pathname.split('/');\n pathnameSplitted[pathnameSplitted.length - 1] = '';\n const pre = location.origin + pathnameSplitted.join('/');\n text = `\n var originalImportScripts = importScripts; \n importScripts = (url) => {\n console.log('importScripts', url);\n var newUrl = '${pre}' + url.split('/').pop();\n return originalImportScripts(newUrl);\n };\n ${text}`;\n const blob = new Blob([text], {type: 'application/javascript'});\n return blob;\n });\n };\n\n const workerHandler = {\n construct(target: any, args: any): any {\n const url = args[0] + location.search;\n return {url};\n }\n };\n\n const originals = [\n Worker,\n typeof(SharedWorker) !== 'undefined' && SharedWorker\n ].filter(Boolean);\n originals.forEach((w) => window[w.name as any] = new Proxy(w, workerHandler));\n\n const worker: SharedWorker | Worker = new Worker(\n /* webpackChunkName: \"crypto.worker\" */\n new URL('../crypto/crypto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n\n originals.forEach((w) => window[w.name as any] = w as any);\n\n const originalUrl = (worker as any).url;\n\n const createWorker = (url: string) => new constructor(url, {type: 'module'});\n const attachWorkerToPort = (worker: SharedWorker | Worker) => this.attachWorkerToPort(worker, cryptoMessagePort, 'crypto');\n const constructor = IS_SHARED_WORKER_SUPPORTED ? SharedWorker : Worker;\n\n // let cryptoWorkers = workers.length;\n cryptoMessagePort.addEventListener('port', (payload, source, event) => {\n this.invokeVoid('cryptoPort', undefined, undefined, [event.ports[0]]);\n // .then((attached) => {\n // if(!attached && cryptoWorkers-- > 1) {\n // this.log.error('terminating unneeded crypto worker');\n\n // cryptoMessagePort.invokeVoid('terminate', undefined, source);\n // const worker = workers.find((worker) => (worker as SharedWorker).port === source || (worker as any) === source);\n // if((worker as SharedWorker).port) (worker as SharedWorker).port.close();\n // else (worker as Worker).terminate();\n // cryptoMessagePort.detachPort(source);\n // }\n // });\n });\n\n const firstWorker = createWorker(originalUrl);\n attachWorkerToPort(firstWorker);\n\n const blob = await get(originalUrl);\n const urlsPromise = await this.invoke('createProxyWorkerURLs', {originalUrl, blob});\n const workers = urlsPromise.slice(1).map(createWorker);\n workers.forEach(attachWorkerToPort);\n }\n\n \n private registerWorker() {\n // return;\n\n let worker: SharedWorker | Worker;\n if(IS_SHARED_WORKER_SUPPORTED) {\n worker = new SharedWorker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n } else {\n worker = new Worker(\n /* webpackChunkName: \"mtproto.worker\" */\n new URL('./mtproto.worker.ts', import.meta.url),\n {type: 'module'}\n );\n }\n\n this.onWorkerFirstMessage(worker);\n }\n \n\n private attachWorkerToPort(worker: SharedWorker | Worker, messagePort: SuperMessagePort, type: string) {\n const port: MessagePort = (worker as SharedWorker).port || worker as any;\n messagePort.attachPort(port);\n\n worker.addEventListener('error', (err) => {\n this.log.error(type, 'worker error', err);\n });\n }\n\n private onWorkerFirstMessage(worker: any) {\n this.log('set webWorker');\n\n // this.worker = worker;\n \n \n \n this.attachWorkerToPort(worker, this, 'mtproto');\n \n }\n\n private loadState() {\n return Promise.all([\n loadState().then((stateResult) => {\n this.newVersion = stateResult.newVersion;\n this.oldVersion = stateResult.oldVersion;\n this.mirrors['state'] = stateResult.state;\n return stateResult;\n })\n // loadStorages(createStorages()),\n ]);\n }\n\n public sendState() {\n return this.loadState().then((result) => {\n const [stateResult] = result;\n this.invoke('state', {...stateResult, userId: rootScope.myId.toUserId()});\n return result;\n });\n }\n\n \n public invokeCrypto(method: Method, ...args: Parameters): Promise>> {\n return cryptoMessagePort.invokeCrypto(method, ...args);\n }\n \n\n public async toggleStorages(enabled: boolean, clearWrite: boolean) {\n await toggleStorages(enabled, clearWrite);\n this.invoke('toggleStorages', {enabled, clearWrite});\n this.serviceMessagePort.invokeVoid('toggleStorages', {enabled, clearWrite});\n }\n\n public async getMirror(name: T) {\n const mirror = this.mirrors[name];\n return mirror;\n }\n\n public getState() {\n return this.getMirror('state');\n }\n\n public updateTabState(key: T, value: TabState[T]) {\n this.tabState[key] = value;\n this.invokeVoid('tabState', this.tabState);\n }\n\n public updateTabStateIdle(idle: boolean) {\n this.updateTabState('idleStartTime', idle ? Date.now() : 0);\n }\n\n private onMirrorTask = (payload: MirrorTaskPayload) => {\n const {name, key, value} = payload;\n if(!payload.hasOwnProperty('key')) {\n this.mirrors[name] = value;\n return;\n }\n\n const mirror = this.mirrors[name] ??= {} as any;\n if(value === undefined) {\n delete mirror[key];\n } else {\n mirror[key] = value;\n }\n };\n}\n\ninterface ApiManagerProxy extends MTProtoMessagePort {}\n\nconst apiManagerProxy = new ApiManagerProxy();\nMOUNT_CLASS_TO.apiManagerProxy = apiManagerProxy;\nexport default apiManagerProxy;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport tabId from '../../config/tabId';\nimport IS_SHARED_WORKER_SUPPORTED from '../../environment/sharedWorkerSupport';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport idleController from '../../helpers/idleController';\nimport {logger} from '../logger';\nimport rootScope from '../rootScope';\nimport sessionStorage from '../sessionStorage';\nimport apiManagerProxy from './mtprotoworker';\n\nexport type AppInstance = {\n id: number,\n idle: boolean,\n time: number\n};\n\nexport type InstanceDeactivateReason = 'version' | 'tabs';\n\nconst CHECK_INSTANCE_INTERVAL = 5000;\nconst DEACTIVATE_TIMEOUT = 30000;\nconst MULTIPLE_TABS_THRESHOLD = 20000;\nconst IS_MULTIPLE_TABS_SUPPORTED = IS_SHARED_WORKER_SUPPORTED;\n\nexport class SingleInstance extends EventListenerBase<{\n activated: () => void,\n deactivated: (reason: InstanceDeactivateReason) => void\n}> {\n private instanceId: number;\n private started: boolean;\n private masterInstance: boolean;\n private deactivateTimeout: number;\n private deactivated: InstanceDeactivateReason;\n private log = logger('INSTANCE');\n\n constructor() {\n super(false);\n\n this.log = logger('INSTANCE');\n this.instanceId = tabId;\n }\n\n public get deactivatedReason() {\n return this.deactivated;\n }\n\n public start() {\n this.reset();\n\n if(!this.started/* && !Config.Navigator.mobile && !Config.Modes.packed */) {\n this.started = true;\n\n idleController.addEventListener('change', this.checkInstance);\n setInterval(this.checkInstance, CHECK_INSTANCE_INTERVAL);\n this.checkInstance();\n\n try {\n document.documentElement.addEventListener('beforeunload', this.clearInstance);\n } catch(e) {}\n }\n }\n\n private reset() {\n this.masterInstance = false;\n this.clearDeactivateTimeout();\n this.deactivated = undefined;\n }\n\n private clearInstance = () => {\n if(this.masterInstance && !this.deactivated) {\n this.log.warn('clear master instance');\n sessionStorage.delete('xt_instance');\n }\n };\n\n public activateInstance() {\n if(this.deactivated) {\n this.reset();\n this.checkInstance(false);\n this.dispatchEvent('activated');\n }\n }\n\n private deactivateInstance(reason: InstanceDeactivateReason) {\n if(this.masterInstance || this.deactivated) {\n return;\n }\n\n this.log.warn('deactivate', reason);\n this.clearDeactivateTimeout();\n this.deactivated = reason;\n\n this.dispatchEvent('deactivated', reason);\n }\n\n private clearDeactivateTimeout() {\n if(this.deactivateTimeout) {\n clearTimeout(this.deactivateTimeout);\n this.deactivateTimeout = 0;\n }\n }\n\n private checkInstance = async(idle = idleController.isIdle) => {\n if(this.deactivated) {\n return;\n }\n\n const time = Date.now();\n const newInstance: AppInstance = {\n id: this.instanceId,\n idle,\n time\n };\n\n const [curInstance, build = App.build] = await Promise.all([\n sessionStorage.get('xt_instance', false),\n sessionStorage.get('k_build', false)\n ]);\n\n if(build > App.build) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.deactivateInstance('version');\n apiManagerProxy.toggleStorages(false, false);\n return;\n } else if(IS_MULTIPLE_TABS_SUPPORTED) {\n sessionStorage.set({xt_instance: newInstance});\n return;\n }\n\n // this.log('check instance', newInstance, curInstance)\n if(!idle ||\n !curInstance ||\n curInstance.id === this.instanceId ||\n curInstance.time < (time - MULTIPLE_TABS_THRESHOLD)) {\n sessionStorage.set({xt_instance: newInstance});\n\n if(!this.masterInstance) {\n this.masterInstance = true;\n rootScope.managers.networkerFactory.startAll();\n this.log.warn('now master instance', newInstance);\n }\n\n this.clearDeactivateTimeout();\n } else if(this.masterInstance) {\n this.masterInstance = false;\n rootScope.managers.networkerFactory.stopAll();\n this.log.warn('now idle instance', newInstance);\n this.deactivateTimeout ||= window.setTimeout(() => this.deactivateInstance('tabs'), DEACTIVATE_TIMEOUT);\n }\n };\n}\n\nconst singleInstance = new SingleInstance();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.singleInstance = singleInstance);\nexport default singleInstance;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport Modes from '../../config/modes';\nimport loadScript from '../../helpers/dom/loadScript';\nimport tsNow from '../../helpers/tsNow';\nimport sessionStorage from '../sessionStorage';\n\nexport class TelegramMeWebManager {\n private disabled = /* false && */(Modes.test || !App.domains.includes(location.hostname));\n\n public setAuthorized(canRedirect: boolean) {\n if(this.disabled) {\n return;\n }\n\n return sessionStorage.get('tgme_sync').then((curValue) => {\n const ts = tsNow(true);\n if(\n canRedirect &&\n curValue?.canRedirect === canRedirect &&\n (curValue.ts + 86400) > ts\n ) {\n return;\n }\n\n sessionStorage.set({\n tgme_sync: {\n canRedirect,\n ts\n }\n });\n\n const path = `_websync_?authed=${canRedirect ? '1' : '0'}&version=${encodeURIComponent(App.version + ' ' + App.suffix)}`;\n const urls = [\n '//telegram.me/' + path,\n '//t.me/' + path\n ];\n\n const promises = urls.map((url) => {\n return loadScript(url).then((script) => {\n script.remove();\n });\n });\n\n return Promise.all(promises);\n });\n }\n}\n\nconst telegramMeWebManager = new TelegramMeWebManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.telegramMeWebManager = telegramMeWebManager);\nexport default telegramMeWebManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function loadScript(url: string) {\n const script = document.createElement('script');\n const promise = new Promise((resolve) => {\n script.onload = script.onerror = () => {\n resolve(script);\n };\n });\n script.src = url;\n document.body.appendChild(script);\n return promise;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {PushNotificationObject} from '../serviceWorker/push';\nimport type {ServicePushPingTaskPayload} from '../serviceWorker/serviceMessagePort';\nimport type {NotificationSettings} from '../appManagers/uiNotificationsManager';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {logger} from '../logger';\nimport apiManagerProxy from './mtprotoworker';\nimport I18n, {LangPackKey} from '../langPack';\nimport {IS_MOBILE} from '../../environment/userAgent';\nimport appRuntimeManager from '../appManagers/appRuntimeManager';\nimport copy from '../../helpers/object/copy';\nimport singleInstance from './singleInstance';\nimport EventListenerBase from '../../helpers/eventListenerBase';\n\nexport type PushSubscriptionNotifyType = 'init' | 'subscribe' | 'unsubscribe';\nexport type PushSubscriptionNotifyEvent = `push_${PushSubscriptionNotifyType}`;\n\nexport type PushSubscriptionNotify = {\n tokenType: number,\n tokenValue: string\n};\n\nexport class WebPushApiManager extends EventListenerBase<{\n push_notification_click: (n: PushNotificationObject) => void,\n push_init: (n: PushSubscriptionNotify) => void,\n push_subscribe: (n: PushSubscriptionNotify) => void,\n push_unsubscribe: (n: PushSubscriptionNotify) => void\n}> {\n public isAvailable = true;\n private isPushEnabled = false;\n private localNotificationsAvailable = true;\n private started = false;\n private settings: NotificationSettings & {baseUrl?: string} = {} as any;\n private isAliveTO: any;\n private isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n private userVisibleOnly = this.isFirefox ? false : true;\n private log = logger('PM');\n\n constructor() {\n super(false);\n\n if(!('PushManager' in window) ||\n !('Notification' in window) ||\n !('serviceWorker' in navigator)) {\n this.log.warn('Push messaging is not supported.');\n this.isAvailable = false;\n this.localNotificationsAvailable = false;\n }\n\n if(this.isAvailable && Notification.permission === 'denied') {\n this.log.warn('The user has blocked notifications.');\n }\n }\n\n public start() {\n if(!this.started) {\n this.started = true;\n this.getSubscription();\n this.setUpServiceWorkerChannel();\n }\n }\n\n public setLocalNotificationsDisabled() {\n this.localNotificationsAvailable = false;\n }\n\n public getSubscription() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.isPushEnabled = !!subscription;\n this.pushSubscriptionNotify('init', subscription);\n }).catch((err) => {\n this.log.error('Error during getSubscription()', err);\n });\n });\n }\n\n public subscribe = () => {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.subscribe({userVisibleOnly: this.userVisibleOnly}).then((subscription) => {\n // The subscription was successful\n this.isPushEnabled = true;\n this.pushSubscriptionNotify('subscribe', subscription);\n }).catch((e) => {\n if(Notification.permission === 'denied') {\n this.log('Permission for Notifications was denied');\n } else {\n this.log('Unable to subscribe to push.', e);\n if(!this.userVisibleOnly) {\n this.userVisibleOnly = true;\n setTimeout(this.subscribe, 0);\n }\n }\n });\n });\n }\n\n public unsubscribe() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.isPushEnabled = false;\n\n if(subscription) {\n this.pushSubscriptionNotify('unsubscribe', subscription);\n\n setTimeout(() => {\n subscription.unsubscribe().then((successful) => {\n this.isPushEnabled = false;\n }).catch((e) => {\n this.log.error('Unsubscription error: ', e);\n });\n }, 3000);\n }\n }).catch((e) => {\n this.log.error('Error thrown while unsubscribing from ' +\n 'push messaging.', e);\n });\n });\n }\n\n public forceUnsubscribe() {\n if(!this.isAvailable) {\n return;\n }\n\n navigator.serviceWorker.ready.then((reg) => {\n reg.pushManager.getSubscription().then((subscription) => {\n this.log.warn('force unsubscribe', subscription);\n if(subscription) {\n subscription.unsubscribe().then((successful) => {\n this.log.warn('force unsubscribe successful', successful);\n this.isPushEnabled = false;\n }).catch((e) => {\n this.log.error('Unsubscription error: ', e);\n });\n }\n }).catch((e) => {\n this.log.error('Error thrown while unsubscribing from ' +\n 'push messaging.', e);\n });\n });\n }\n\n public isAliveNotify = () => {\n if(!this.isAvailable || singleInstance.deactivatedReason) {\n return;\n }\n\n this.settings.baseUrl = (location.href || '').replace(/#.*$/, '');\n\n const lang: ServicePushPingTaskPayload['lang'] = {} as any;\n const ACTIONS_LANG_MAP: Record = {\n push_action_mute1d: IS_MOBILE ? 'PushNotification.Action.Mute1d.Mobile' : 'PushNotification.Action.Mute1d',\n push_action_settings: IS_MOBILE ? 'PushNotification.Action.Settings.Mobile' : 'PushNotification.Action.Settings',\n push_message_nopreview: 'PushNotification.Message.NoPreview'\n };\n\n for(const action in ACTIONS_LANG_MAP) {\n lang[action as keyof typeof ACTIONS_LANG_MAP] = I18n.format(ACTIONS_LANG_MAP[action as keyof typeof ACTIONS_LANG_MAP], true);\n }\n\n apiManagerProxy.serviceMessagePort.invokeVoid('pushPing', {\n localNotifications: this.localNotificationsAvailable,\n lang: lang,\n settings: this.settings\n });\n\n this.isAliveTO = setTimeout(this.isAliveNotify, 10000);\n }\n\n public setSettings(newSettings: WebPushApiManager['settings']) {\n this.settings = copy(newSettings);\n clearTimeout(this.isAliveTO);\n this.isAliveNotify();\n }\n\n public hidePushNotifications() {\n if(!this.isAvailable) {\n return;\n }\n\n apiManagerProxy.serviceMessagePort.invokeVoid('notificationsClear', undefined);\n }\n\n public setUpServiceWorkerChannel() {\n if(!this.isAvailable) {\n return;\n }\n\n apiManagerProxy.serviceMessagePort.addEventListener('pushClick', (payload) => {\n if(singleInstance.deactivatedReason) {\n appRuntimeManager.reload();\n return;\n }\n\n this.dispatchEvent('push_notification_click', payload);\n });\n\n navigator.serviceWorker.ready.then(this.isAliveNotify);\n }\n\n public pushSubscriptionNotify(event: PushSubscriptionNotifyType, subscription?: PushSubscription) {\n if(subscription) {\n const subscriptionObj: PushSubscriptionJSON = subscription.toJSON();\n if(!subscriptionObj ||\n !subscriptionObj.endpoint ||\n !subscriptionObj.keys ||\n !subscriptionObj.keys.p256dh ||\n !subscriptionObj.keys.auth) {\n this.log.warn('Invalid push subscription', subscriptionObj);\n this.unsubscribe();\n this.isAvailable = false;\n this.pushSubscriptionNotify(event);\n return;\n }\n\n this.log.warn('Push', event, subscriptionObj);\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, {\n tokenType: 10,\n tokenValue: JSON.stringify(subscriptionObj)\n });\n } else {\n this.log.warn('Push', event, false);\n this.dispatchEvent(('push_' + event) as PushSubscriptionNotifyEvent, false as any);\n }\n }\n}\n\nconst webPushApiManager = new WebPushApiManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.webPushApiManager = webPushApiManager);\nexport default webPushApiManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport IS_OPUS_SUPPORTED from '../environment/opusSupport';\nimport {IS_SAFARI} from '../environment/userAgent';\nimport {Modify} from '../types';\nimport {logger, LogTypes} from './logger';\nimport apiManagerProxy from './mtproto/mtprotoworker';\nimport type {ConvertWebPTask} from './webp/webpWorkerController';\n\ntype Result = {\n bytes: Uint8Array,\n waveform?: Uint8Array\n};\n\ntype Task = {\n pages: Uint8Array,\n withWaveform: boolean,\n waveform?: Uint8Array,\n callback: {resolve: (result: Result) => void, reject: (err: any) => void},\n timeout: number\n};\n\nexport interface ConvertOpusTask extends Modify {\n type: 'convertOpus'\n}\n\nexport class OpusDecodeController {\n private worker: Worker;\n private wavWorker: Worker;\n private sampleRate = 48000;\n private tasks: Array = [];\n private keepAlive = false;\n private log = logger('OPUS', LogTypes.Error);\n\n public isPlaySupported() {\n return IS_OPUS_SUPPORTED;\n }\n\n public loadWavWorker() {\n if(this.wavWorker) return;\n\n this.wavWorker = new Worker('waveWorker.min.js');\n this.wavWorker.addEventListener('message', (e) => {\n const data = e.data;\n\n this.log('[WAV] got message:', data);\n if(data && data.page) {\n const bytes = data.page;\n this.onTaskEnd(this.tasks.shift(), bytes);\n }\n });\n }\n\n public loadWorker() {\n if(this.worker) return;\n\n this.worker = new Worker('decoderWorker.min.js');\n this.worker.addEventListener('message', (e) => {\n const data = e.data;\n\n this.log('[DECODER] got message', data);\n if(data.type === 'done') {\n // this.log('[DECODER] send done to wav');\n this.wavWorker.postMessage({command: 'done'});\n\n if(data.waveform) {\n this.tasks[0].waveform = data.waveform;\n }\n } else { // e.data contains decoded buffers as float32 values\n // this.log('[DECODER] send encode to wav');\n this.wavWorker.postMessage({\n command: 'encode',\n buffers: e.data\n }, IS_SAFARI ? undefined : data.map((typedArray: Uint8Array) => typedArray.buffer));\n }\n });\n }\n\n public setKeepAlive(keepAlive: boolean) {\n this.keepAlive = keepAlive;\n if(this.keepAlive) {\n this.loadWorker();\n this.loadWavWorker();\n } else if(!this.tasks.length) {\n this.terminateWorkers();\n }\n }\n\n public onTaskEnd(task: Task, result?: Uint8Array) {\n if(!result) {\n task.callback.reject('timeout');\n } else {\n clearTimeout(task.timeout);\n task.callback.resolve({bytes: result, waveform: task.waveform});\n }\n\n if(this.tasks.length) {\n this.executeNewTask(this.tasks[0]);\n }\n\n this.terminateWorkers();\n }\n\n public terminateWorkers(kill = false) {\n if((this.keepAlive || this.tasks.length) && !kill) return;\n\n if(this.worker) {\n this.worker.terminate();\n this.worker = null;\n }\n\n if(this.wavWorker) {\n this.wavWorker.terminate();\n this.wavWorker = null;\n }\n }\n\n public executeNewTask(task: Task) {\n this.worker.postMessage({\n command: 'init',\n decoderSampleRate: this.sampleRate,\n outputBufferSampleRate: this.sampleRate\n });\n\n this.wavWorker.postMessage({\n command: 'init',\n wavBitDepth: 16,\n wavSampleRate: this.sampleRate\n });\n\n // console.log('sending command to worker:', task);\n // setTimeout(() => {\n this.log('[DECODER] send decode');\n this.worker.postMessage({\n command: 'decode',\n pages: task.pages,\n waveform: task.withWaveform\n }, IS_SAFARI ? undefined : [task.pages.buffer]);\n // }, 1e3);\n\n task.timeout = window.setTimeout(() => {\n this.log.error('decode timeout'/* , task */);\n\n this.terminateWorkers(true);\n if(this.tasks.length) {\n this.loadWorker();\n this.loadWavWorker();\n }\n\n this.onTaskEnd(this.tasks.shift());\n }, 10e3);\n }\n\n public pushDecodeTask(pages: Uint8Array, withWaveform: boolean) {\n return new Promise((resolve, reject) => {\n const task = {\n pages,\n withWaveform,\n callback: {resolve, reject},\n timeout: 0\n };\n\n this.loadWorker();\n this.loadWavWorker();\n\n if(this.tasks.push(task) === 1) {\n this.executeNewTask(task);\n }\n });\n }\n\n public async decode(typedArray: Uint8Array, withWaveform = false) {\n return this.pushDecodeTask(typedArray, withWaveform).then(async(result) => {\n const dataBlob = new Blob([result.bytes], {type: 'audio/wav'});\n return {url: await apiManagerProxy.invoke('createObjectURL', dataBlob), waveform: result.waveform};\n });\n }\n}\n\nconst opusDecodeController = new OpusDecodeController();\nMOUNT_CLASS_TO.opusDecodeController = opusDecodeController;\nexport default opusDecodeController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport emojiRegExp from '../../vendor/emoji/regex';\nimport {MessageEntity} from '../../layer';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nexport const ALPHA_CHARS_REG_EXP = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\n // user:pass authentication\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n '|' +\n // host name\n URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\nexport const URL_ANY_PROTOCOL_REG_EXP = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP, 'i');\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n// const markdownTestRegExp = /[`_*@~]/;\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nexport const SITE_HASHTAGS: {[siteName: string]: string} = {\n 'Telegram': 'tg://search_hashtag?hashtag={1}',\n 'Twitter': 'https://twitter.com/hashtag/{1}',\n 'Instagram': 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\n// Telegram: '#{1}',\n// Twitter: 'https://twitter.com/{1}',\n// Instagram: 'https://instagram.com/{1}/',\n// GitHub: 'https://github.com/{1}'\n// };\n\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nexport const PASS_CONFLICTING_ENTITIES: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(const i in MARKDOWN_ENTITIES) {\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\n}\n\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\n\n/* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n} */\n\n\n/* export function replaceUrlEncodings(urlWithEncoded: string) {\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, (str) => {\n try {\n return decodeURIComponent(str);\n } catch (e) {\n return str;\n }\n });\n} */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type addAnchorListener from '../../helpers/addAnchorListener';\nimport {PHONE_NUMBER_REG_EXP} from '.';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport matchUrlProtocol from './matchUrlProtocol';\nimport {T_ME_PREFIXES} from '../mtproto/mtproto_config';\n\nexport default function wrapUrl(url: string, unsafe?: number | boolean) {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n\n const out: {url: string, onclick?: Parameters[0]['name']} = {url};\n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: typeof out['onclick'];\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?(?:(.+?)\\.)?(?:(?:web|k|z)\\.)?t(?:elegram)?\\.me(?:\\/(.+))?/))) {\n const u = new URL(url);\n let prefix = tgMeMatch[1];\n if(prefix && T_ME_PREFIXES.has(tgMeMatch[1])) {\n prefix = undefined;\n }\n\n if(prefix) {\n u.pathname = prefix + (u.pathname === '/' ? '' : u.pathname);\n }\n\n const fullPath = u.pathname.slice(1);\n const path = fullPath.split('/');\n\n if(path[0] && path[0][0] === '$' && path[0].length > 1) {\n onclick = 'invoice';\n } else if(/^\\W/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) { // second regexp is for phone numbers (t.me/+38050...)\n onclick = 'joinchat';\n } else switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'addemoji':\n case 'voicechat':\n case 'invoice':\n if(path.length !== 1 && !prefix) {\n onclick = path[0];\n break;\n }\n\n default:\n if((path[1] && path[1].match(/^\\d+(?:\\?(?:comment|thread)=\\d+)?$/)) || path.length === 1) {\n onclick = 'im';\n break;\n }\n\n break;\n }\n } else if((telescoPeMatch = url.match(/^(?:https?:\\/\\/)?telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\n onclick = 'im';\n } else if((tgMatch = url.match(/tg:(?:\\/\\/)?(.+?)(?:\\?|$)/))) {\n onclick = 'tg_' + tgMatch[1] as any;\n }/* else if(unsafe) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } */\n\n if(!(window as any)[onclick]) {\n onclick = undefined;\n }\n\n out.onclick = onclick;\n return out;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.wrapUrl = wrapUrl);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall, Config, Reaction} from '../layer';\nimport type {Dialog, ForumTopic, MessagesStorageKey, MyMessage} from './appManagers/appMessagesManager';\nimport type {MyDialogFilter} from './storages/filters';\nimport type {Folder} from './storages/dialogs';\nimport type {UserTyping} from './appManagers/appProfileManager';\nimport type {MyDraftMessage} from './appManagers/appDraftsManager';\nimport type {ConnectionStatusChange} from './mtproto/connectionStatus';\nimport type {GroupCallId} from './appManagers/appGroupCallsManager';\nimport type {AppManagers} from './appManagers/managers';\nimport type {State} from '../config/state';\nimport type {Progress} from './appManagers/appDownloadManager';\nimport type {CallId} from './appManagers/appCallsManager';\nimport type {MyDocument} from './appManagers/appDocsManager';\nimport type {MTAppConfig} from './mtproto/appConfig';\nimport {NULL_PEER_ID, UserAuth} from './mtproto/mtproto_config';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\nimport {IS_WORKER} from '../helpers/context';\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n 'chat_toggle_forum': {chatId: ChatId, enabled: boolean},\n\n 'channel_update': ChatId,\n\n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, threadId?: number, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': {peerId: PeerId, threadId?: number},\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Omit,\n\n 'dialog_draft': {peerId: PeerId, dialog: Dialog | ForumTopic, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog | ForumTopic},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': Dialog | ForumTopic,\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n // 'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog | ForumTopic,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': Map}>,\n\n 'history_append': {storageKey: MessagesStorageKey, message: Message.message},\n 'history_update': {storageKey: MessagesStorageKey, message: MyMessage, sequential?: boolean},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': MyMessage,\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n // 'history_request': void,\n\n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_error': {storageKey: MessagesStorageKey, tempId: number, error: ApiError},\n 'messages_views': {peerId: PeerId, mid: number, views: number}[],\n 'messages_reactions': {message: Message.message, changedResults: ReactionCount[]}[],\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': Message.message,\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n 'stickers_updated': {type: 'recent' | 'faved', stickers: MyDocument[]},\n 'stickers_top': Long,\n 'sticker_updated': {type: 'recent' | 'faved', document: MyDocument, faved: boolean},\n\n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n\n 'contacts_update': UserId,\n 'avatar_update': {peerId: PeerId, threadId?: number},\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n // 'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any, settings: State['settings']},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n\n 'background_change': void,\n\n 'privacy_update': Update.updatePrivacy,\n\n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n\n 'notification_reset': string,\n 'notification_cancel': string,\n\n 'language_change': string,\n\n 'theme_change': void,\n\n 'media_play': void,\n\n 'emoji_recent': AppEmoji,\n\n 'download_progress': Progress,\n 'document_downloading': DocId,\n 'document_downloaded': DocId,\n\n 'choosing_sticker': boolean\n\n 'group_call_update': GroupCall,\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_update': PhoneCall,\n 'call_signaling': {callId: CallId, data: Uint8Array},\n\n 'quick_reaction': Reaction,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void,\n\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService}\n\n 'premium_toggle': boolean,\n 'premium_toggle_private': {isNew: boolean, isPremium: boolean},\n\n 'config': Config,\n 'app_config': MTAppConfig\n};\n\nexport type BroadcastEventsListeners = {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n};\n\nexport class RootScope extends EventListenerBase {\n public myId: PeerId;\n private connectionStatus: {[name: string]: ConnectionStatusChange};\n public settings: State['settings'];\n public managers: AppManagers;\n public premium: boolean;\n\n constructor() {\n super();\n\n this.myId = NULL_PEER_ID;\n this.connectionStatus = {};\n this.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\n });\n\n this.addEventListener('premium_toggle_private', ({isNew, isPremium}) => {\n this.premium = isPremium;\n\n if(!isNew) {\n this.dispatchEventSingle('premium_toggle', isPremium);\n }\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n\n public getPremium() {\n return this.premium;\n }\n\n public dispatchEventSingle(...args: any[]) {\n // @ts-ignore\n super.dispatchEvent(...args);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {WorkerTaskVoidTemplate} from '../../types';\n\nexport interface ConvertWebPTask extends WorkerTaskVoidTemplate {\n type: 'convertWebp',\n payload: {\n fileName: string,\n bytes: Uint8Array\n }\n};\n\nexport class WebpWorkerController {\n private worker: Worker;\n private convertPromises: {[fileName: string]: CancellablePromise} = {};\n\n private init() {\n this.worker = new Worker(new URL('./webp.worker.ts', import.meta.url));\n this.worker.addEventListener('message', (e) => {\n const task = e.data as ConvertWebPTask;\n const payload = task.payload;\n\n const promise = this.convertPromises[payload.fileName];\n if(promise) {\n payload.bytes ? promise.resolve(payload.bytes) : promise.reject();\n delete this.convertPromises[payload.fileName];\n }\n });\n }\n\n private postMessage(data: ConvertWebPTask) {\n if(this.init) {\n this.init();\n this.init = null;\n }\n\n this.worker.postMessage(data);\n }\n\n public convert(fileName: string, bytes: Uint8Array) {\n if(this.convertPromises.hasOwnProperty(fileName)) {\n return this.convertPromises[fileName];\n }\n\n const convertPromise = deferredPromise();\n\n this.postMessage({type: 'convertWebp', payload: {fileName, bytes}});\n\n return this.convertPromises[fileName] = convertPromise;\n }\n}\n\nconst webpWorkerController = new WebpWorkerController();\nMOUNT_CLASS_TO.webpWorkerController = webpWorkerController;\nexport default webpWorkerController;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + ({\"589\":\"crypto.worker\",\"630\":\"npm.qr-code-styling\",\"670\":\"sw\",\"678\":\"mtproto.worker\"}[chunkId] || chunkId) + \".\" + {\"8\":\"570e6da51a125009c156\",\"53\":\"77c5dab45a68d1851187\",\"61\":\"9f135819bd5af1b57a36\",\"63\":\"0d39a81590990db74d39\",\"77\":\"18305e1bd331a0fdd36c\",\"104\":\"91dd6279f1f693880508\",\"231\":\"1462b405fc6da56ba47b\",\"301\":\"42dc636f96a62f6a08c8\",\"339\":\"79c7f9c2341eeff66b88\",\"392\":\"198d4679664c1bf4c989\",\"436\":\"47558d0a092967b3c966\",\"437\":\"d40e517d52e5dcf3b754\",\"442\":\"645fe71c30545d9700d2\",\"460\":\"057266426d36dd34300a\",\"508\":\"56e4692b095fba8d9cdf\",\"539\":\"17a0b07b4e6476f19654\",\"589\":\"eebc3997154695b54c25\",\"630\":\"2c5d57550714b1a9e42e\",\"641\":\"11406cec52b05304f14f\",\"642\":\"fd1ade69544ad78671c6\",\"670\":\"e5e5d5146fea89f484d2\",\"678\":\"e39165afafd615d2ebc1\",\"709\":\"73c949c4c6702cdf349b\",\"776\":\"b547f5293903351f3ec7\",\"781\":\"af546badf2c525815889\",\"783\":\"827711558099e62fd694\",\"810\":\"f272bad8a3948af5c8d0\",\"813\":\"06763bece6721fb81fde\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","__webpack_require__.b = document.baseURI || self.location.href;\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [85,946], () => (__webpack_require__(6873)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","IS_BETA","DEBUG","MOUNT_CLASS_TO","window","self","STATE_VERSION","BUILD","STATE_INIT","allDialogsLoaded","pinnedOrders","contactsListCachedTime","updates","filtersArr","maxSeenMsgId","stateCreatedTime","Date","now","recentEmoji","recentCustomEmoji","topPeersCache","recentSearch","version","build","authState","_","IS_MOBILE","hiddenPinnedMessages","settings","messagesTextSize","distanceUnit","sendShortcut","animationsEnabled","autoDownload","photo","contacts","private","groups","channels","video","file","autoDownloadNew","file_size_max","pFlags","video_preload_large","audio_preload_next","photo_size_max","video_size_max","video_upload_maxbitrate","autoPlay","gifs","videos","stickers","suggest","loop","emoji","big","themes","name","background","blur","slug","color","highlightningColor","intensity","id","theme","notifications","sound","timeFormat","toLocaleString","match","playbackParams","volume","muted","playbackRate","playbackRates","voice","audio","round","keepSigned","chatContextMenuHintWasShown","stateId","notifySettings","IS_APPLE_MX","ctx","document","createElement","getContext","extension","getExtension","renderer","getParameter","UNMASKED_RENDERER_WEBGL","getSupportedExtensions","indexOf","err","CAN_USE_TRANSFERABLES","IS_SAFARI","navigator","userAgent","search","geolocation","getCurrentPosition","IMAGE_MIME_TYPES_SUPPORTED","Set","add","arr","concat","canPlayType","IS_APPLE_MOBILE","replace","IS_FIREFOX","mediaDevices","DocumentTouch","USER_AGENT","IS_APPLE","IS_ANDROID","toLowerCase","IS_CHROMIUM","test","vendor","platform","maxTouchPoints","IS_MOBILE_SAFARI","vibrate","VIDEO_MIME_TYPES_SUPPORTED","toDataURL","startsWith","rgbaToHsla","r","g","b","a","max","Math","min","h","s","l","d","hslaToRgba","hue2rgb","p","q","t","hexaToRgba","hexa","offset","length","slice","i","push","parseInt","hexToRgb","hex","hexaToHsla","rgba","rgbaToHexa","map","v","toString","join","hslaStringToHex","hsla","splitted","split","alpha","pop","val","endsWith","hslaStringToRgba","hslaStringToHexa","compareVersion","v1","v2","s1","s2","blurActiveElement","activeElement","cancelEvent","event","cancelable","originalEvent","stopPropagation","preventDefault","returnValue","cancelBubble","findUpClassName","el","className","closest","fixSafariStickyInput","input","style","transform","focus","then","IS_STICKY_INPUT_BUGGED","key","startY","o","capture","passive","onTouchMove","e","touch","touches","scrollable","target","y","scrolled","scrollTop","scrollHeight","clientHeight","nextScrollTop","lastFocusOutTimeStamp","addEventListener","classList","contains","timeStamp","touchStart","removeEventListener","fixSafariStickyInputFocusing","texts","cache","fonts","text","icons","monospace","loadFonts","types","undefined","Promise","resolve","promises","type","_texts","font","weights","weight","_promises","load","race","all","catch","FOCUS_EVENT_NAME","IdleController","constructor","super","this","_isIdle","focusPromise","focusResolve","isIdle","once","idle","getFocusPromise","value","dispatchEvent","OverlayCounter","overlaysActive","isOverlayActive","fastRafCallbacks","fastRaf","callback","requestAnimationFrame","currentCallbacks","forEach","cb","fastRafConventionalCallbacks","rafPromise","processing","fastRafConventional","fastRafPromise","doubleRaf","parseUriParams","uri","params","item","decodeURIComponent","themeController","setTheme","themeColorElem","_themeColorElem","head","querySelector","setThemeColor","themeColor","isNight","setAttribute","setThemeListener","darkModeMediaQuery","matchMedia","checkDarkMode","systemTheme","matches","addListener","applyHighlightningColor","getTheme","documentElement","setProperty","removeProperty","colorScheme","toggle","workerHandler","construct","args","url","location","Worker","SharedWorker","filter","Boolean","w","Proxy","setWorkerProxy","Element","prototype","toggleAttribute","force","hasAttribute","removeAttribute","Node","replaceChildren","nodes","textContent","append","rootScope","getProxiedManagers","getElementById","href","singleInstance","visualViewport","lastVH","setViewportVH","setVH","vh","overlayCounter","height","innerHeight","toggleResizeMode","tabId","onImTabChange","wasTabId","tagName","appMediaViewer","perf","performance","langPromise","stateResult","langPack","fadeInWhenFontsReady","elem","promise","opacity","state","isPremium","appVersion","lang_code","console","log","dir","hash","tgWebAuthToken","data","token","dcId","tgWebAuthDcId","userId","tgWebAuthUserId","toUserId","isTest","tgWebAuthTest","tgAddr","tgaddr","urlSearchParams","URLSearchParams","set","delete","pagePromise","placeholder","prepend","cloneNode","meModule","pushModule","default","setAuthorized","forceUnsubscribe","mount","sentCode","authCode","pause","ready","reload","close","DEBUG_MANAGER_REQUESTS","createProxyProxy","proxied","ack","get","receiver","method","has","warn","createProxy","acknowledged","IDB","db","storageIsAvailable","openDatabase","INSTANCES","isAvailable","createNew","openDbPromise","createIndexes","os","store","indexNames","Array","from","indexName","deleteIndex","indexes","index","createIndex","keyPath","objectParameters","request","indexedDB","open","reject","error","message","finished","setTimeout","onerror","onsuccess","result","calledNew","onclose","onabort","transaction","onversionchange","onupgradeneeded","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","static","find","instance","preserve","storage","IDBStorage","storeName","idb","create","entryName","isArray","getObjectStore","clear","save","idx","put","mode","onError","clearTimeout","timeout","onComplete","results","requests","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","getAll","UNSUPPORTED_LANG_PACK_KEY","I18n","pluralRules","cacheLangPackPromise","setLangCode","langCode","lastRequestedLangCode","lastRequestedNormalizedLangCode","updateAmPm","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","date","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","lang","langSign","countries","strings","formatLocalStrings","saveLangPack","from_version","local","loadLangPack","web","requestedServerLanguage","managers","apiManager","invokeApiCacheable","lang_pack","polyfillPromise","pushTo","applyLangPack","currentLangCode","Intl","PluralRules","string","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","querySelectorAll","element","weakMap","update","superFormatter","indexHolder","out","lastIndex","p1","p2","p3","p4","lastIndexOf","wrappedUrl","onclick","DocumentFragment","firstChild","arg","pushNextArgument","plain","str","select","Map","isRTL","setRTL","rtl","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","keys","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","_Intl","Object","assign","WeakMap","IntlElementBase","options","property","IntlElement","formatted","dataset","compareAndUpdate","json","JSON","stringify","DateTimeFormat","hours","getHours","getMinutes","i18n","i18n_","_i18n","joinElementsWith","elements","joiner","isLast","useLast","joined","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","BOT_START_PARAM","MAX_FILE_SAVE_SIZE","THUMB_TYPE_FULL","TOPIC_COLORS","ATTACH_MENU_BOT_ICON_NAME","GENERAL_TOPIC_ID","T_ME_PREFIXES","FOLDER_ID_ALL","FOLDER_ID_ARCHIVE","REAL_FOLDERS","IS_CALL_SUPPORTED","IS_CANVAS_FILTER_SUPPORTED","IS_EMOJI_SUPPORTED","IS_GEOLOCATION_SUPPORTED","IS_GROUP_CALL_SUPPORTED","IS_MOV_SUPPORTED","IS_PARALLAX_SUPPORTED","IS_SCREEN_SHARING_SUPPORTED","IS_TOUCH_SUPPORTED","IS_VIBRATE_SUPPORTED","IS_OPUS_SUPPORTED","IS_SHARED_WORKER_SUPPORTED","IS_WEBM_SUPPORTED","IS_WEBP_SUPPORTED","IS_WEBRTC_SUPPORTED","MEDIA_MIME_TYPES_SUPPORTED","ALL_KEYS","REFRESH_KEYS","loadStateInner","logger","totalPerf","recordPromise","stateStorage","sessionStorage","pushedKeys","pushToState","copy","splice","auth","shift","sessionBuild","shiftedWebKAuth","values","dcID","toPeerId","obj","resetStorages","chats","dialogs","users","_state","state_id","time","hasOwnProperty","nightTheme","autoDownloadSettings","oldTypes","mediaType","peerTypeSettings","peerType","validateInitObject","missingKey","migrated","newTheme","k_build","ApiManagerProxy","onMirrorTask","payload","mirrors","mirror","tabState","chatPeerIds","idleStartTime","registerWorker","registerServiceWorker","registerCryptoWorker","addMultipleEventsListeners","convertWebp","fileName","bytes","webpWorkerController","convertOpus","opusDecodeController","localStorageProxy","storageTask","language","toggleStorages","telegramMeWebManager","webPushApiManager","cacheName","caches","appRuntimeManager","idleController","updateTabStateIdle","invoke","pingServiceWorkerWithIframe","pingServiceWorkerPromise","iframe","hidden","onLoad","remove","src","random","body","attachServiceWorker","serviceWorker","lastServiceWorker","serviceMessagePort","detachPort","attachSendPort","invokeVoid","_registerServiceWorker","register","URL","scope","registration","active","controller","unregister","installing","waiting","worker","attachListenPort","port","source","ports","hello","resendLockTask","originals","originalUrl","createWorker","attachWorkerToPort","cryptoMessagePort","blob","fetch","response","pathnameSplitted","pathname","origin","Blob","onWorkerFirstMessage","messagePort","attachPort","loadState","sendState","invokeCrypto","enabled","clearWrite","getMirror","getState","updateTabState","apiManagerProxy","IS_MULTIPLE_TABS_SUPPORTED","SingleInstance","clearInstance","masterInstance","deactivated","checkInstance","newInstance","instanceId","curInstance","deactivateInstance","xt_instance","clearDeactivateTimeout","deactivateTimeout","deactivatedReason","start","reset","started","setInterval","activateInstance","reason","TelegramMeWebManager","disabled","hostname","canRedirect","curValue","ts","tsNow","tgme_sync","path","encodeURIComponent","script","onload","appendChild","loadScript","WebPushApiManager","isPushEnabled","localNotificationsAvailable","isFirefox","userVisibleOnly","subscribe","reg","pushManager","subscription","pushSubscriptionNotify","Notification","permission","isAliveNotify","baseUrl","ACTIONS_LANG_MAP","push_action_mute1d","push_action_settings","push_message_nopreview","action","localNotifications","isAliveTO","getSubscription","setUpServiceWorkerChannel","setLocalNotificationsDisabled","unsubscribe","successful","setSettings","newSettings","hidePushNotifications","subscriptionObj","toJSON","endpoint","p256dh","tokenType","tokenValue","sampleRate","tasks","keepAlive","isPlaySupported","loadWavWorker","wavWorker","page","onTaskEnd","loadWorker","postMessage","command","waveform","buffers","typedArray","buffer","setKeepAlive","terminateWorkers","task","executeNewTask","kill","terminate","decoderSampleRate","outputBufferSampleRate","wavBitDepth","wavSampleRate","pages","withWaveform","pushDecodeTask","decode","dataBlob","ALPHA_CHARS_REG_EXP","ALPHA_NUMERIC_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","RegExp","USERNAME_REG_EXP","BOT_COMMAND_REG_EXP","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","SITE_HASHTAGS","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","wrapUrl","unsafe","tgMeMatch","telescoPeMatch","tgMatch","u","prefix","fullPath","RootScope","myId","connectionStatus","premium","isNew","dispatchEventSingle","status","getConnectionStatus","getPremium","convertPromises","init","convert","convertPromise","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","call","m","O","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","every","n","getter","__esModule","getPrototypeOf","ns","def","current","getOwnPropertyNames","definition","defineProperty","enumerable","f","chunkId","reduce","miniCssF","globalThis","Function","prop","done","needAttach","scripts","getElementsByTagName","getAttribute","charset","nc","onScriptComplete","prev","doneFns","parentNode","removeChild","bind","Symbol","toStringTag","scriptUrl","importScripts","currentScript","Error","oldGetScript","oldLoadScript","queryMap","countMap","retries","realSrc","cacheBust","baseURI","installedChunks","installedChunkData","errorType","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","__webpack_exports__"],"sourceRoot":""} \ No newline at end of file diff --git a/public/mtproto.worker.a47a496f3c7a877087bb.chunk.js b/public/mtproto.worker.a47a496f3c7a877087bb.chunk.js new file mode 100644 index 000000000..fa648335a --- /dev/null +++ b/public/mtproto.worker.a47a496f3c7a877087bb.chunk.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var e,t,a={410:(e,t,a)=>{a.d(t,{GO:()=>n,ZP:()=>i});const s=a(1267).Z.debug,n="undefined"!=typeof window?window:self,i=s},3447:(e,t,a)=>{a.d(t,{Z:()=>i});const s={14:{"1f6dd":4867,"1f6de":4916,"1f6df":4923,"1f7f0":62832,"1f979":183,"1f9cc":1557,"1fa7b":61332,"1fa7c":61330,"1faa9":51093,"1faaa":61364,"1faab":61189,"1faac":51085,"1fab7":2651,"1fab8":2631,"1fab9":2672,"1faba":2673,"1fac3":1520,"1fac4":1521,"1fac5":1505,"1fad7":3793,"1fad8":3707,"1fad9":3804,"1fae0":111,"1fae1":136,"1fae2":132,"1fae3":133,"1fae4":174,"1fae5":142,"1fae6":1385,"1fae7":61353,"1faf0":1341,"1faf1":1332,"1faf2":1333,"1faf3":1334,"1faf4":1335,"1faf5":1351,"1faf6":1360,"1faf1-1f3fb-200d-1faf2-1f3fc":0,"1faf1-1f3fb-200d-1faf2-1f3fd":0,"1faf1-1f3fb-200d-1faf2-1f3fe":0,"1faf1-1f3fb-200d-1faf2-1f3ff":0,"1faf1-1f3fc-200d-1faf2-1f3fb":0,"1faf1-1f3fc-200d-1faf2-1f3fd":0,"1faf1-1f3fc-200d-1faf2-1f3fe":0,"1faf1-1f3fc-200d-1faf2-1f3ff":0,"1faf1-1f3fd-200d-1faf2-1f3fb":0,"1faf1-1f3fd-200d-1faf2-1f3fc":0,"1faf1-1f3fd-200d-1faf2-1f3fe":0,"1faf1-1f3fd-200d-1faf2-1f3ff":0,"1faf1-1f3fe-200d-1faf2-1f3fb":0,"1faf1-1f3fe-200d-1faf2-1f3fc":0,"1faf1-1f3fe-200d-1faf2-1f3fd":0,"1faf1-1f3fe-200d-1faf2-1f3ff":0,"1faf1-1f3ff-200d-1faf2-1f3fb":0,"1faf1-1f3ff-200d-1faf2-1f3fc":0,"1faf1-1f3ff-200d-1faf2-1f3fd":0,"1faf1-1f3ff-200d-1faf2-1f3fe":0,"1fac3-1f3fb":0,"1fac3-1f3fc":0,"1fac3-1f3fd":0,"1fac3-1f3fe":0,"1fac3-1f3ff":0,"1fac4-1f3fb":0,"1fac4-1f3fc":0,"1fac4-1f3fd":0,"1fac4-1f3fe":0,"1fac4-1f3ff":0,"1fac5-1f3fb":0,"1fac5-1f3fc":0,"1fac5-1f3fd":0,"1fac5-1f3fe":0,"1fac5-1f3ff":0,"1faf0-1f3fb":0,"1faf0-1f3fc":0,"1faf0-1f3fd":0,"1faf0-1f3fe":0,"1faf0-1f3ff":0,"1faf1-1f3fb":0,"1faf1-1f3fc":0,"1faf1-1f3fd":0,"1faf1-1f3fe":0,"1faf1-1f3ff":0,"1faf2-1f3fb":0,"1faf2-1f3fc":0,"1faf2-1f3fd":0,"1faf2-1f3fe":0,"1faf2-1f3ff":0,"1faf3-1f3fb":0,"1faf3-1f3fc":0,"1faf3-1f3fd":0,"1faf3-1f3fe":0,"1faf3-1f3ff":0,"1faf4-1f3fb":0,"1faf4-1f3fc":0,"1faf4-1f3fd":0,"1faf4-1f3fe":0,"1faf4-1f3ff":0,"1faf5-1f3fb":0,"1faf5-1f3fc":0,"1faf5-1f3fd":0,"1faf5-1f3fe":0,"1faf5-1f3ff":0,"1faf6-1f3fb":0,"1faf6-1f3fc":0,"1faf6-1f3fd":0,"1faf6-1f3fe":0,"1faf6-1f3ff":0},"":{2049:62835,2122:62863,2139:62888,2194:62764,2195:62763,2196:62762,2197:62756,2198:62758,2199:62760,2328:61194,2600:4990,2601:4998,2602:41013,2603:41018,2604:41020,2611:62851,2614:41014,2615:3781,2618:2667,2620:1106,2622:62753,2623:62754,2626:62783,2638:62780,2639:177,2648:62788,2649:62789,2650:62796,2651:62797,2652:62798,2653:62799,2660:51095,2663:51098,2665:51096,2666:51097,2668:4865,2692:61297,2693:4922,2694:61300,2696:61311,2697:61319,2699:61309,2702:61284,2705:62850,2708:4931,2709:61245,2712:61259,2714:62852,2716:62828,2721:62779,2728:51029,2733:62858,2734:62859,2744:41017,2747:62860,2753:62836,2754:62837,2755:62838,2757:62839,2763:1137,2764:1141,2795:62829,2796:62830,2797:62831,2934:62767,2935:62768,3030:62840,3297:62912,3299:62913,"0023-20e3":62864,"002a-20e3":62865,"0030-20e3":62866,"0031-20e3":62867,"0032-20e3":62868,"0033-20e3":62869,"0034-20e3":62870,"0035-20e3":62871,"0036-20e3":62872,"0037-20e3":62873,"0038-20e3":62874,"0039-20e3":62875,"00a9":62861,"00ae":62862,"1f004":51101,"1f0cf":51100,"1f170":62882,"1f171":62884,"1f17e":62893,"1f17f":62895,"1f18e":62883,"1f191":62885,"1f192":62886,"1f193":62887,"1f194":62889,"1f195":62891,"1f196":62892,"1f197":62894,"1f198":62896,"1f199":62897,"1f19a":62898,"1f1e6-1f1e8":71594,"1f1e6-1f1e9":71595,"1f1e6-1f1ea":71596,"1f1e6-1f1eb":71597,"1f1e6-1f1ec":71598,"1f1e6-1f1ee":71599,"1f1e6-1f1f1":71600,"1f1e6-1f1f2":71601,"1f1e6-1f1f4":71602,"1f1e6-1f1f6":71603,"1f1e6-1f1f7":71604,"1f1e6-1f1f8":71605,"1f1e6-1f1f9":71606,"1f1e6-1f1fa":71607,"1f1e6-1f1fc":71608,"1f1e6-1f1fd":71609,"1f1e6-1f1ff":71610,"1f1e7-1f1e6":71611,"1f1e7-1f1e7":71612,"1f1e7-1f1e9":71613,"1f1e7-1f1ea":71614,"1f1e7-1f1eb":71615,"1f1e7-1f1ec":71616,"1f1e7-1f1ed":71617,"1f1e7-1f1ee":71618,"1f1e7-1f1ef":71619,"1f1e7-1f1f1":71620,"1f1e7-1f1f2":71621,"1f1e7-1f1f3":71622,"1f1e7-1f1f4":71623,"1f1e7-1f1f6":71624,"1f1e7-1f1f7":71625,"1f1e7-1f1f8":71626,"1f1e7-1f1f9":71627,"1f1e7-1f1fb":71628,"1f1e7-1f1fc":71629,"1f1e7-1f1fe":71630,"1f1e7-1f1ff":71631,"1f1e8-1f1e6":71632,"1f1e8-1f1e8":71633,"1f1e8-1f1e9":71634,"1f1e8-1f1eb":71635,"1f1e8-1f1ec":71636,"1f1e8-1f1ed":71637,"1f1e8-1f1ee":71638,"1f1e8-1f1f0":71639,"1f1e8-1f1f1":71640,"1f1e8-1f1f2":71641,"1f1e8-1f1f3":71642,"1f1e8-1f1f4":71643,"1f1e8-1f1f5":71644,"1f1e8-1f1f7":71645,"1f1e8-1f1fa":71646,"1f1e8-1f1fb":71647,"1f1e8-1f1fc":71648,"1f1e8-1f1fd":71649,"1f1e8-1f1fe":71650,"1f1e8-1f1ff":71651,"1f1e9-1f1ea":71652,"1f1e9-1f1ec":71653,"1f1e9-1f1ef":71654,"1f1e9-1f1f0":71655,"1f1e9-1f1f2":71656,"1f1e9-1f1f4":71657,"1f1e9-1f1ff":71658,"1f1ea-1f1e6":71659,"1f1ea-1f1e8":71660,"1f1ea-1f1ea":71661,"1f1ea-1f1ec":71662,"1f1ea-1f1ed":71663,"1f1ea-1f1f7":71664,"1f1ea-1f1f8":71665,"1f1ea-1f1f9":71666,"1f1ea-1f1fa":71667,"1f1eb-1f1ee":71668,"1f1eb-1f1ef":71669,"1f1eb-1f1f0":71670,"1f1eb-1f1f2":71671,"1f1eb-1f1f4":71672,"1f1eb-1f1f7":71673,"1f1ec-1f1e6":71674,"1f1ec-1f1e7":71675,"1f1ec-1f1e9":71676,"1f1ec-1f1ea":71677,"1f1ec-1f1eb":71678,"1f1ec-1f1ec":71679,"1f1ec-1f1ed":71680,"1f1ec-1f1ee":71681,"1f1ec-1f1f1":71682,"1f1ec-1f1f2":71683,"1f1ec-1f1f3":71684,"1f1ec-1f1f5":71685,"1f1ec-1f1f6":71686,"1f1ec-1f1f7":71687,"1f1ec-1f1f8":71688,"1f1ec-1f1f9":71689,"1f1ec-1f1fa":71690,"1f1ec-1f1fc":71691,"1f1ec-1f1fe":71692,"1f1ed-1f1f0":71693,"1f1ed-1f1f2":71694,"1f1ed-1f1f3":71695,"1f1ed-1f1f7":71696,"1f1ed-1f1f9":71697,"1f1ed-1f1fa":71698,"1f1ee-1f1e8":71699,"1f1ee-1f1e9":71700,"1f1ee-1f1ea":71701,"1f1ee-1f1f1":71702,"1f1ee-1f1f2":71703,"1f1ee-1f1f3":71704,"1f1ee-1f1f4":71705,"1f1ee-1f1f6":71706,"1f1ee-1f1f7":71707,"1f1ee-1f1f8":71708,"1f1ee-1f1f9":71709,"1f1ef-1f1ea":71710,"1f1ef-1f1f2":71711,"1f1ef-1f1f4":71712,"1f1ef-1f1f5":71713,"1f1f0-1f1ea":71714,"1f1f0-1f1ec":71715,"1f1f0-1f1ed":71716,"1f1f0-1f1ee":71717,"1f1f0-1f1f2":71718,"1f1f0-1f1f3":71719,"1f1f0-1f1f5":71720,"1f1f0-1f1f7":71721,"1f1f0-1f1fc":71722,"1f1f0-1f1fe":71723,"1f1f0-1f1ff":71724,"1f1f1-1f1e6":71725,"1f1f1-1f1e7":71726,"1f1f1-1f1e8":71727,"1f1f1-1f1ee":71728,"1f1f1-1f1f0":71729,"1f1f1-1f1f7":71730,"1f1f1-1f1f8":71731,"1f1f1-1f1f9":71732,"1f1f1-1f1fa":71733,"1f1f1-1f1fb":71734,"1f1f1-1f1fe":71735,"1f1f2-1f1e6":71736,"1f1f2-1f1e8":71737,"1f1f2-1f1e9":71738,"1f1f2-1f1ea":71739,"1f1f2-1f1eb":71740,"1f1f2-1f1ec":71741,"1f1f2-1f1ed":71742,"1f1f2-1f1f0":71743,"1f1f2-1f1f1":71744,"1f1f2-1f1f2":71745,"1f1f2-1f1f3":71746,"1f1f2-1f1f4":71747,"1f1f2-1f1f5":71748,"1f1f2-1f1f6":71749,"1f1f2-1f1f7":71750,"1f1f2-1f1f8":71751,"1f1f2-1f1f9":71752,"1f1f2-1f1fa":71753,"1f1f2-1f1fb":71754,"1f1f2-1f1fc":71755,"1f1f2-1f1fd":71756,"1f1f2-1f1fe":71757,"1f1f2-1f1ff":71758,"1f1f3-1f1e6":71759,"1f1f3-1f1e8":71760,"1f1f3-1f1ea":71761,"1f1f3-1f1eb":71762,"1f1f3-1f1ec":71763,"1f1f3-1f1ee":71764,"1f1f3-1f1f1":71765,"1f1f3-1f1f4":71766,"1f1f3-1f1f5":71767,"1f1f3-1f1f7":71768,"1f1f3-1f1fa":71769,"1f1f3-1f1ff":71770,"1f1f4-1f1f2":71771,"1f1f5-1f1e6":71772,"1f1f5-1f1ea":71773,"1f1f5-1f1eb":71774,"1f1f5-1f1ec":71775,"1f1f5-1f1ed":71776,"1f1f5-1f1f0":71777,"1f1f5-1f1f1":71778,"1f1f5-1f1f2":71779,"1f1f5-1f1f3":71780,"1f1f5-1f1f7":71781,"1f1f5-1f1f8":71782,"1f1f5-1f1f9":71783,"1f1f5-1f1fc":71784,"1f1f5-1f1fe":71785,"1f1f6-1f1e6":71786,"1f1f7-1f1ea":71787,"1f1f7-1f1f4":71788,"1f1f7-1f1f8":71789,"1f1f7-1f1fa":71790,"1f1f7-1f1fc":71791,"1f1f8-1f1e6":71792,"1f1f8-1f1e7":71793,"1f1f8-1f1e8":71794,"1f1f8-1f1e9":71795,"1f1f8-1f1ea":71796,"1f1f8-1f1ec":71797,"1f1f8-1f1ed":71798,"1f1f8-1f1ee":71799,"1f1f8-1f1ef":71800,"1f1f8-1f1f0":71801,"1f1f8-1f1f1":71802,"1f1f8-1f1f2":71803,"1f1f8-1f1f3":71804,"1f1f8-1f1f4":71805,"1f1f8-1f1f7":71806,"1f1f8-1f1f8":71807,"1f1f8-1f1f9":71808,"1f1f8-1f1fb":71809,"1f1f8-1f1fd":71810,"1f1f8-1f1fe":71811,"1f1f8-1f1ff":71812,"1f1f9-1f1e6":71813,"1f1f9-1f1e8":71814,"1f1f9-1f1e9":71815,"1f1f9-1f1eb":71816,"1f1f9-1f1ec":71817,"1f1f9-1f1ed":71818,"1f1f9-1f1ef":71819,"1f1f9-1f1f0":71820,"1f1f9-1f1f1":71821,"1f1f9-1f1f2":71822,"1f1f9-1f1f3":71823,"1f1f9-1f1f4":71824,"1f1f9-1f1f7":71825,"1f1f9-1f1f9":71826,"1f1f9-1f1fb":71827,"1f1f9-1f1fc":71828,"1f1f9-1f1ff":71829,"1f1fa-1f1e6":71830,"1f1fa-1f1ec":71831,"1f1fa-1f1f2":71832,"1f1fa-1f1f3":71833,"1f1fa-1f1f8":71834,"1f1fa-1f1fe":71835,"1f1fa-1f1ff":71836,"1f1fb-1f1e6":71837,"1f1fb-1f1e8":71838,"1f1fb-1f1ea":71839,"1f1fb-1f1ec":71840,"1f1fb-1f1ee":71841,"1f1fb-1f1f3":71842,"1f1fb-1f1fa":71843,"1f1fc-1f1eb":71844,"1f1fc-1f1f8":71845,"1f1fd-1f1f0":71846,"1f1fe-1f1ea":71847,"1f1fe-1f1f9":71848,"1f1ff-1f1e6":71849,"1f1ff-1f1f2":71850,"1f1ff-1f1fc":71851,"1f201":62899,"1f202":62900,"1f21a":62906,"1f22f":62903,"1f232":62907,"1f233":62911,"1f234":62910,"1f235":62915,"1f236":62902,"1f237":62901,"1f238":62909,"1f239":62905,"1f23a":62914,"1f250":62904,"1f251":62908,"1f300":41010,"1f301":4857,"1f302":41012,"1f303":4858,"1f304":4860,"1f305":4861,"1f306":4862,"1f307":4863,"1f308":41011,"1f309":4864,"1f30a":41023,"1f30b":4815,"1f30c":4997,"1f30d":4806,"1f30e":4807,"1f30f":4808,"1f310":4809,"1f311":4977,"1f312":4978,"1f313":4979,"1f314":4980,"1f315":4981,"1f316":4982,"1f317":4983,"1f318":4984,"1f319":4985,"1f31a":4986,"1f31b":4987,"1f31c":4988,"1f31d":4991,"1f31e":4992,"1f31f":4995,"1f320":4996,"1f321":4989,"1f324":41001,"1f325":41002,"1f326":41003,"1f327":41004,"1f328":41005,"1f329":41006,"1f32a":41007,"1f32b":41008,"1f32c":41009,"1f32d":3725,"1f32e":3727,"1f32f":3728,"1f330":3708,"1f331":2659,"1f332":2661,"1f333":2662,"1f334":2663,"1f335":2664,"1f336":3698,"1f337":2658,"1f338":2649,"1f339":2653,"1f33a":2655,"1f33b":2656,"1f33c":2657,"1f33d":3697,"1f33e":2665,"1f33f":2666,"1f340":2668,"1f341":2669,"1f342":2670,"1f343":2671,"1f344":3705,"1f345":3690,"1f346":3694,"1f347":3674,"1f348":3675,"1f349":3676,"1f34a":3677,"1f34b":3678,"1f34c":3679,"1f34d":3680,"1f34e":3682,"1f34f":3683,"1f350":3684,"1f351":3685,"1f352":3686,"1f353":3687,"1f354":3722,"1f355":3724,"1f356":3718,"1f357":3719,"1f358":3744,"1f359":3745,"1f35a":3746,"1f35b":3747,"1f35c":3748,"1f35d":3749,"1f35e":3709,"1f35f":3723,"1f360":3750,"1f361":3756,"1f362":3751,"1f363":3752,"1f364":3753,"1f365":3754,"1f366":3765,"1f367":3766,"1f368":3767,"1f369":3768,"1f36a":3769,"1f36b":3774,"1f36c":3775,"1f36d":3776,"1f36e":3777,"1f36f":3778,"1f370":3771,"1f371":3743,"1f372":3735,"1f373":3733,"1f374":3801,"1f375":3783,"1f376":3784,"1f377":3786,"1f378":3787,"1f379":3788,"1f37a":3789,"1f37b":3790,"1f37c":3779,"1f37d":3800,"1f37e":3785,"1f37f":3739,"1f380":51040,"1f381":51041,"1f382":3770,"1f383":51024,"1f384":51025,"1f385":1527,"1f386":51026,"1f387":51027,"1f388":51030,"1f389":51031,"1f38a":51032,"1f38b":51033,"1f38c":71588,"1f38d":51034,"1f38e":51035,"1f38f":51036,"1f390":51037,"1f391":51038,"1f392":61134,"1f393":61147,"1f396":51045,"1f397":51042,"1f399":61167,"1f39a":61168,"1f39b":61169,"1f39e":61203,"1f39f":51043,"1f3a0":4866,"1f3a1":4868,"1f3a2":4869,"1f3a3":51072,"1f3a4":61170,"1f3a5":61202,"1f3a6":62819,"1f3a7":61171,"1f3a8":51105,"1f3a9":61146,"1f3aa":4871,"1f3ab":51044,"1f3ac":61205,"1f3ad":51103,"1f3ae":51086,"1f3af":51078,"1f3b0":51088,"1f3b1":51081,"1f3b2":51089,"1f3b3":51060,"1f3b4":51102,"1f3b5":61165,"1f3b6":61166,"1f3b7":61173,"1f3b8":61175,"1f3b9":61176,"1f3ba":61177,"1f3bb":61178,"1f3bc":61164,"1f3bd":51074,"1f3be":51058,"1f3bf":51075,"1f3c0":51054,"1f3c1":71586,"1f3c2":1600,"1f3c3-200d-2640":1584,"1f3c3-200d-2642":1583,"1f3c3":1582,"1f3c4-200d-2640":1606,"1f3c4-200d-2642":1605,"1f3c4":1604,"1f3c5":51047,"1f3c6":51046,"1f3c7":1598,"1f3c8":51056,"1f3c9":51057,"1f3ca-200d-2640":1612,"1f3ca-200d-2642":1611,"1f3ca":1610,"1f3cb-200d-2640":1618,"1f3cb-200d-2642":1617,"1f3cb":1616,"1f3cc-200d-2640":1603,"1f3cc-200d-2642":1602,"1f3cc":1601,"1f3cd":4902,"1f3ce":4901,"1f3cf":51061,"1f3d0":51055,"1f3d1":51062,"1f3d2":51063,"1f3d3":51065,"1f3d4":4813,"1f3d5":4817,"1f3d6":4818,"1f3d7":4824,"1f3d8":4829,"1f3d9":4859,"1f3da":4830,"1f3db":4823,"1f3dc":4819,"1f3dd":4820,"1f3de":4821,"1f3df":4822,"1f3e0":4831,"1f3e1":4832,"1f3e2":4833,"1f3e3":4834,"1f3e4":4835,"1f3e5":4836,"1f3e6":4837,"1f3e7":62729,"1f3e8":4838,"1f3e9":4839,"1f3ea":4840,"1f3eb":4841,"1f3ec":4842,"1f3ed":4843,"1f3ee":61216,"1f3ef":4844,"1f3f0":4845,"1f3f3-200d-1f308":71591,"1f3f3-200d-26a7":71592,"1f3f3":71590,"1f3f4-200d-2620":71593,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71852,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71853,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71854,"1f3f4":71589,"1f3f5":2652,"1f3f7":61234,"1f3f8":51066,"1f3f9":61303,"1f3fa":3805,"1f3fb":9525,"1f3fc":9526,"1f3fd":9527,"1f3fe":9528,"1f3ff":9529,"1f400":2576,"1f401":2575,"1f402":2556,"1f403":2557,"1f404":2558,"1f405":2547,"1f406":2548,"1f407":2579,"1f408-200d-2b1b":2544,"1f408":2543,"1f409":2618,"1f40a":2613,"1f40b":2622,"1f40c":2632,"1f40d":2616,"1f40e":2550,"1f40f":2563,"1f410":2565,"1f411":2564,"1f412":2531,"1f413":2596,"1f414":2595,"1f415-200d-1f9ba":2537,"1f415":2535,"1f416":2560,"1f417":2561,"1f418":2570,"1f419":2629,"1f41a":2630,"1f41b":2634,"1f41c":2635,"1f41d":2636,"1f41e":2638,"1f41f":2625,"1f420":2626,"1f421":2627,"1f422":2614,"1f423":2597,"1f424":2598,"1f425":2599,"1f426":2600,"1f427":2601,"1f428":2586,"1f429":2538,"1f42a":2566,"1f42b":2567,"1f42c":2623,"1f42d":2574,"1f42e":2555,"1f42f":2546,"1f430":2578,"1f431":2542,"1f432":2617,"1f433":2621,"1f434":2549,"1f435":2530,"1f436":2534,"1f437":2559,"1f438":2612,"1f439":2577,"1f43a":2539,"1f43b-200d-2744":2585,"1f43b":2584,"1f43c":2587,"1f43d":2562,"1f43e":2593,"1f43f":2580,"1f440":1381,"1f441-200d-1f5e8":1159,"1f441":1382,"1f442":1373,"1f443":1375,"1f444":1384,"1f445":1383,"1f446":1347,"1f447":1349,"1f448":1345,"1f449":1346,"1f44a":1355,"1f44b":1327,"1f44c":1336,"1f44d":1352,"1f44e":1353,"1f44f":1358,"1f450":1361,"1f451":61144,"1f452":61145,"1f453":61110,"1f454":61115,"1f455":61116,"1f456":61117,"1f457":61122,"1f458":61123,"1f459":61128,"1f45a":61129,"1f45b":61130,"1f45c":61131,"1f45d":61132,"1f45e":61136,"1f45f":61137,"1f460":61140,"1f461":61141,"1f462":61143,"1f463":1687,"1f464":1684,"1f465":1685,"1f466":1388,"1f467":1389,"1f468-200d-1f33e":1457,"1f468-200d-1f373":1460,"1f468-200d-1f37c":1524,"1f468-200d-1f393":1448,"1f468-200d-1f3a4":1478,"1f468-200d-1f3a8":1481,"1f468-200d-1f3eb":1451,"1f468-200d-1f3ed":1466,"1f468-200d-1f466-200d-1f466":1674,"1f468-200d-1f466":1673,"1f468-200d-1f467-200d-1f466":1676,"1f468-200d-1f467-200d-1f467":1677,"1f468-200d-1f467":1675,"1f468-200d-1f468-200d-1f466":1663,"1f468-200d-1f468-200d-1f466-200d-1f466":1666,"1f468-200d-1f468-200d-1f467":1664,"1f468-200d-1f468-200d-1f467-200d-1f466":1665,"1f468-200d-1f468-200d-1f467-200d-1f467":1667,"1f468-200d-1f469-200d-1f466":1658,"1f468-200d-1f469-200d-1f466-200d-1f466":1661,"1f468-200d-1f469-200d-1f467":1659,"1f468-200d-1f469-200d-1f467-200d-1f466":1660,"1f468-200d-1f469-200d-1f467-200d-1f467":1662,"1f468-200d-1f4bb":1475,"1f468-200d-1f4bc":1469,"1f468-200d-1f527":1463,"1f468-200d-1f52c":1472,"1f468-200d-1f680":1487,"1f468-200d-1f692":1490,"1f468-200d-1f9af":1574,"1f468-200d-1f9b0":1396,"1f468-200d-1f9b1":1397,"1f468-200d-1f9b2":1399,"1f468-200d-1f9b3":1398,"1f468-200d-1f9bc":1577,"1f468-200d-1f9bd":1580,"1f468-200d-2695":1445,"1f468-200d-2696":1454,"1f468-200d-2708":1484,"1f468-200d-2764-200d-1f468":1655,"1f468-200d-2764-200d-1f48b-200d-1f468":1651,"1f468":1392,"1f469-200d-1f33e":1458,"1f469-200d-1f373":1461,"1f469-200d-1f37c":1523,"1f469-200d-1f393":1449,"1f469-200d-1f3a4":1479,"1f469-200d-1f3a8":1482,"1f469-200d-1f3eb":1452,"1f469-200d-1f3ed":1467,"1f469-200d-1f466-200d-1f466":1679,"1f469-200d-1f466":1678,"1f469-200d-1f467-200d-1f466":1681,"1f469-200d-1f467-200d-1f467":1682,"1f469-200d-1f467":1680,"1f469-200d-1f469-200d-1f466":1668,"1f469-200d-1f469-200d-1f466-200d-1f466":1671,"1f469-200d-1f469-200d-1f467":1669,"1f469-200d-1f469-200d-1f467-200d-1f466":1670,"1f469-200d-1f469-200d-1f467-200d-1f467":1672,"1f469-200d-1f4bb":1476,"1f469-200d-1f4bc":1470,"1f469-200d-1f527":1464,"1f469-200d-1f52c":1473,"1f469-200d-1f680":1488,"1f469-200d-1f692":1491,"1f469-200d-1f9af":1575,"1f469-200d-1f9b0":1401,"1f469-200d-1f9b1":1403,"1f469-200d-1f9b2":1407,"1f469-200d-1f9b3":1405,"1f469-200d-1f9bc":1578,"1f469-200d-1f9bd":1581,"1f469-200d-2695":1446,"1f469-200d-2696":1455,"1f469-200d-2708":1485,"1f469-200d-2764-200d-1f468":1654,"1f469-200d-2764-200d-1f469":1656,"1f469-200d-2764-200d-1f48b-200d-1f468":1650,"1f469-200d-2764-200d-1f48b-200d-1f469":1652,"1f469":1400,"1f46a":1657,"1f46b":1647,"1f46c":1648,"1f46d":1646,"1f46e-200d-2640":1494,"1f46e-200d-2642":1493,"1f46e":1492,"1f46f-200d-2640":1590,"1f46f-200d-2642":1589,"1f46f":1588,"1f470-200d-2640":1518,"1f470-200d-2642":1517,"1f470":1516,"1f471-200d-2640":1409,"1f471-200d-2642":1410,"1f471":1391,"1f472":1511,"1f473-200d-2640":1510,"1f473-200d-2642":1509,"1f473":1508,"1f474":1412,"1f475":1413,"1f476":1386,"1f477-200d-2640":1504,"1f477-200d-2642":1503,"1f477":1502,"1f478":1507,"1f479":1109,"1f47a":1110,"1f47b":1111,"1f47c":1526,"1f47d":1112,"1f47e":1113,"1f47f":1104,"1f480":1105,"1f481-200d-2640":1428,"1f481-200d-2642":1427,"1f481":1426,"1f482-200d-2640":1500,"1f482-200d-2642":1499,"1f482":1498,"1f483":1585,"1f484":61152,"1f485":1366,"1f486-200d-2640":1560,"1f486-200d-2642":1559,"1f486":1558,"1f487-200d-2640":1563,"1f487-200d-2642":1562,"1f487":1561,"1f488":4870,"1f489":61326,"1f48a":61328,"1f48b":1127,"1f48c":1128,"1f48d":61153,"1f48e":61154,"1f48f":1649,"1f490":2648,"1f491":1653,"1f492":4846,"1f493":1133,"1f494":1138,"1f495":1135,"1f496":1131,"1f497":1132,"1f498":1129,"1f499":1145,"1f49a":1144,"1f49b":1143,"1f49c":1146,"1f49d":1130,"1f49e":1134,"1f49f":1136,"1f4a0":62946,"1f4a1":61214,"1f4a2":1151,"1f4a3":1157,"1f4a4":1163,"1f4a5":1152,"1f4a6":1154,"1f4a7":41022,"1f4a8":1155,"1f4a9":1107,"1f4aa":1368,"1f4ab":1153,"1f4ac":1158,"1f4ad":1162,"1f4ae":2650,"1f4af":1150,"1f4b0":61235,"1f4b1":62841,"1f4b2":62842,"1f4b3":61242,"1f4b4":61237,"1f4b5":61238,"1f4b6":61239,"1f4b7":61240,"1f4b8":61241,"1f4b9":61244,"1f4ba":4936,"1f4bb":61191,"1f4bc":61265,"1f4bd":61197,"1f4be":61198,"1f4bf":61199,"1f4c0":61200,"1f4c1":61266,"1f4c2":61267,"1f4c3":61227,"1f4c4":61229,"1f4c5":61269,"1f4c6":61270,"1f4c7":61273,"1f4c8":61274,"1f4c9":61275,"1f4ca":61276,"1f4cb":61277,"1f4cc":61278,"1f4cd":61279,"1f4ce":61280,"1f4cf":61282,"1f4d0":61283,"1f4d1":61232,"1f4d2":61226,"1f4d3":61225,"1f4d4":61218,"1f4d5":61219,"1f4d6":61220,"1f4d7":61221,"1f4d8":61222,"1f4d9":61223,"1f4da":61224,"1f4db":62847,"1f4dc":61228,"1f4dd":61264,"1f4de":61185,"1f4df":61186,"1f4e0":61187,"1f4e1":61325,"1f4e2":61159,"1f4e3":61160,"1f4e4":61249,"1f4e5":61250,"1f4e6":61251,"1f4e7":61246,"1f4e8":61247,"1f4e9":61248,"1f4ea":61253,"1f4eb":61252,"1f4ec":61254,"1f4ed":61255,"1f4ee":61256,"1f4ef":61161,"1f4f0":61230,"1f4f1":61182,"1f4f2":61183,"1f4f3":62823,"1f4f4":62824,"1f4f5":62751,"1f4f6":62822,"1f4f7":61207,"1f4f8":61208,"1f4f9":61209,"1f4fa":61206,"1f4fb":61172,"1f4fc":61210,"1f4fd":61204,"1f4ff":61151,"1f500":62801,"1f501":62802,"1f502":62803,"1f503":62769,"1f504":62770,"1f505":62820,"1f506":62821,"1f507":61155,"1f508":61156,"1f509":61157,"1f50a":61158,"1f50b":61188,"1f50c":61190,"1f50d":61211,"1f50e":61212,"1f50f":61290,"1f510":61291,"1f511":61292,"1f512":61288,"1f513":61289,"1f514":61162,"1f515":61163,"1f516":61233,"1f517":61313,"1f518":62947,"1f519":62771,"1f51a":62772,"1f51b":62773,"1f51c":62774,"1f51d":62775,"1f51e":62752,"1f51f":62876,"1f520":62877,"1f521":62878,"1f522":62879,"1f523":62880,"1f524":62881,"1f525":41021,"1f526":61215,"1f527":61306,"1f528":61294,"1f529":61308,"1f52a":3803,"1f52b":61301,"1f52c":61323,"1f52d":61324,"1f52e":51082,"1f52f":62787,"1f530":62848,"1f531":62846,"1f532":62949,"1f533":62948,"1f534":62916,"1f535":62920,"1f536":62940,"1f537":62941,"1f538":62942,"1f539":62943,"1f53a":62944,"1f53b":62945,"1f53c":62811,"1f53d":62813,"1f549":62778,"1f54a":2602,"1f54b":4854,"1f54c":4850,"1f54d":4852,"1f54e":62786,"1f550":4955,"1f551":4957,"1f552":4959,"1f553":4961,"1f554":4963,"1f555":4965,"1f556":4967,"1f557":4969,"1f558":4971,"1f559":4973,"1f55a":4975,"1f55b":4953,"1f55c":4956,"1f55d":4958,"1f55e":4960,"1f55f":4962,"1f560":4964,"1f561":4966,"1f562":4968,"1f563":4970,"1f564":4972,"1f565":4974,"1f566":4976,"1f567":4954,"1f56f":61213,"1f570":4952,"1f573":1156,"1f574":1587,"1f575-200d-2640":1497,"1f575-200d-2642":1496,"1f575":1495,"1f576":61111,"1f577":2641,"1f578":2642,"1f579":51087,"1f57a":1586,"1f587":61281,"1f58a":61261,"1f58b":61260,"1f58c":61262,"1f58d":61263,"1f590":1329,"1f595":1348,"1f596":1331,"1f5a4":1148,"1f5a5":61192,"1f5a8":61193,"1f5b1":61195,"1f5b2":61196,"1f5bc":51104,"1f5c2":61268,"1f5c3":61285,"1f5c4":61286,"1f5d1":61287,"1f5d2":61271,"1f5d3":61272,"1f5dc":61310,"1f5dd":61293,"1f5de":61231,"1f5e1":61299,"1f5e3":1683,"1f5e8":1160,"1f5ef":1161,"1f5f3":61257,"1f5fa":4810,"1f5fb":4816,"1f5fc":4847,"1f5fd":4848,"1f5fe":4811,"1f5ff":61362,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":114,"1f608":1103,"1f609":112,"1f60a":113,"1f60b":124,"1f60c":150,"1f60d":116,"1f60e":170,"1f60f":144,"1f610":139,"1f611":140,"1f612":145,"1f613":195,"1f614":151,"1f615":173,"1f616":192,"1f617":119,"1f618":118,"1f619":122,"1f61a":121,"1f61b":125,"1f61c":126,"1f61d":128,"1f61e":194,"1f61f":175,"1f620":1101,"1f621":1100,"1f622":189,"1f623":193,"1f624":199,"1f625":188,"1f626":184,"1f627":185,"1f628":186,"1f629":196,"1f62a":152,"1f62b":197,"1f62c":147,"1f62d":190,"1f62e-200d-1f4a8":148,"1f62e":178,"1f62f":179,"1f630":187,"1f631":191,"1f632":180,"1f633":181,"1f634":154,"1f635-200d-1f4ab":165,"1f635":164,"1f636-200d-1f32b":143,"1f636":141,"1f637":155,"1f638":1116,"1f639":1117,"1f63a":1115,"1f63b":1118,"1f63c":1119,"1f63d":1120,"1f63e":1123,"1f63f":1122,"1f640":1121,"1f641":176,"1f642":19,"1f643":110,"1f644":146,"1f645-200d-2640":1422,"1f645-200d-2642":1421,"1f645":1420,"1f646-200d-2640":1425,"1f646-200d-2642":1424,"1f646":1423,"1f647-200d-2640":1437,"1f647-200d-2642":1436,"1f647":1435,"1f648":1124,"1f649":1125,"1f64a":1126,"1f64b-200d-2640":1431,"1f64b-200d-2642":1430,"1f64b":1429,"1f64c":1359,"1f64d-200d-2640":1416,"1f64d-200d-2642":1415,"1f64d":1414,"1f64e-200d-2640":1419,"1f64e-200d-2642":1418,"1f64e":1417,"1f64f":1364,"1f680":4942,"1f681":4937,"1f682":4872,"1f683":4873,"1f684":4874,"1f685":4875,"1f686":4876,"1f687":4877,"1f688":4878,"1f689":4879,"1f68a":4880,"1f68b":4883,"1f68c":4884,"1f68d":4885,"1f68e":4886,"1f68f":4911,"1f690":4887,"1f691":4888,"1f692":4889,"1f693":4890,"1f694":4891,"1f695":4892,"1f696":4893,"1f697":4894,"1f698":4895,"1f699":4896,"1f69a":4898,"1f69b":4899,"1f69c":4900,"1f69d":4881,"1f69e":4882,"1f69f":4938,"1f6a0":4939,"1f6a1":4940,"1f6a2":4930,"1f6a3-200d-2640":1609,"1f6a3-200d-2642":1608,"1f6a3":1607,"1f6a4":4926,"1f6a5":4918,"1f6a6":4919,"1f6a7":4921,"1f6a8":4917,"1f6a9":71587,"1f6aa":61333,"1f6ab":62745,"1f6ac":61358,"1f6ad":62747,"1f6ae":62730,"1f6af":62748,"1f6b0":62731,"1f6b1":62749,"1f6b2":4907,"1f6b3":62746,"1f6b4-200d-2640":1621,"1f6b4-200d-2642":1620,"1f6b4":1619,"1f6b5-200d-2640":1624,"1f6b5-200d-2642":1623,"1f6b5":1622,"1f6b6-200d-2640":1566,"1f6b6-200d-2642":1565,"1f6b6":1564,"1f6b7":62750,"1f6b8":62743,"1f6b9":62733,"1f6ba":62734,"1f6bb":62735,"1f6bc":62736,"1f6bd":61340,"1f6be":62737,"1f6bf":61342,"1f6c0":1643,"1f6c1":61343,"1f6c2":62738,"1f6c3":62739,"1f6c4":62740,"1f6c5":62741,"1f6cb":61338,"1f6cc":1644,"1f6cd":61133,"1f6ce":4944,"1f6cf":61337,"1f6d0":62776,"1f6d1":4920,"1f6d2":61357,"1f6d5":4851,"1f6d6":4828,"1f6d7":61334,"1f6e0":61298,"1f6e1":61304,"1f6e2":4914,"1f6e3":4912,"1f6e4":4913,"1f6e5":4929,"1f6e9":4932,"1f6eb":4933,"1f6ec":4934,"1f6f0":4941,"1f6f3":4927,"1f6f4":4908,"1f6f5":4903,"1f6f6":4925,"1f6f7":51076,"1f6f8":4943,"1f6f9":4909,"1f6fa":4906,"1f6fb":4897,"1f6fc":4910,"1f7e0":62917,"1f7e1":62918,"1f7e2":62919,"1f7e3":62921,"1f7e4":62922,"1f7e5":62925,"1f7e6":62929,"1f7e7":62926,"1f7e8":62927,"1f7e9":62928,"1f7ea":62930,"1f7eb":62931,"1f90c":1337,"1f90d":1149,"1f90e":1147,"1f90f":1338,"1f910":137,"1f911":129,"1f912":156,"1f913":171,"1f914":135,"1f915":157,"1f916":1114,"1f917":130,"1f918":1343,"1f919":1344,"1f91a":1328,"1f91b":1356,"1f91c":1357,"1f91d":1363,"1f91e":1340,"1f91f":1342,"1f920":167,"1f921":1108,"1f922":158,"1f923":17,"1f924":153,"1f925":149,"1f926-200d-2640":1440,"1f926-200d-2642":1439,"1f926":1438,"1f927":160,"1f928":138,"1f929":117,"1f92a":127,"1f92b":134,"1f92c":1102,"1f92d":131,"1f92e":159,"1f92f":166,"1f930":1519,"1f931":1522,"1f932":1362,"1f933":1367,"1f934":1506,"1f935-200d-2640":1515,"1f935-200d-2642":1514,"1f935":1513,"1f936":1528,"1f937-200d-2640":1443,"1f937-200d-2642":1442,"1f937":1441,"1f938-200d-2640":1627,"1f938-200d-2642":1626,"1f938":1625,"1f939-200d-2640":1639,"1f939-200d-2642":1638,"1f939":1637,"1f93a":1597,"1f93c-200d-2640":1630,"1f93c-200d-2642":1629,"1f93c":1628,"1f93d-200d-2640":1633,"1f93d-200d-2642":1632,"1f93d":1631,"1f93e-200d-2640":1636,"1f93e-200d-2642":1635,"1f93e":1634,"1f93f":51073,"1f940":2654,"1f941":61180,"1f942":3791,"1f943":3792,"1f944":3802,"1f945":51069,"1f947":51048,"1f948":51049,"1f949":51050,"1f94a":51067,"1f94b":51068,"1f94c":51077,"1f94d":51064,"1f94e":51053,"1f94f":51059,"1f950":3710,"1f951":3693,"1f952":3700,"1f953":3721,"1f954":3695,"1f955":3696,"1f956":3711,"1f957":3738,"1f958":3734,"1f959":3730,"1f95a":3732,"1f95b":3780,"1f95c":3706,"1f95d":3689,"1f95e":3715,"1f95f":3757,"1f960":3758,"1f961":3759,"1f962":3799,"1f963":3737,"1f964":3794,"1f965":3692,"1f966":3702,"1f967":3773,"1f968":3713,"1f969":3720,"1f96a":3726,"1f96b":3742,"1f96c":3701,"1f96d":3681,"1f96e":3755,"1f96f":3714,"1f970":115,"1f971":198,"1f972":123,"1f973":168,"1f974":163,"1f975":161,"1f976":162,"1f977":1501,"1f978":169,"1f97a":182,"1f97b":61124,"1f97c":61113,"1f97d":61112,"1f97e":61138,"1f97f":61139,"1f980":3760,"1f981":2545,"1f982":2643,"1f983":2594,"1f984":2551,"1f985":2603,"1f986":2604,"1f987":2583,"1f988":2628,"1f989":2606,"1f98a":2540,"1f98b":2633,"1f98c":2553,"1f98d":2532,"1f98e":2615,"1f98f":2572,"1f990":3762,"1f991":3763,"1f992":2569,"1f993":2552,"1f994":2582,"1f995":2619,"1f996":2620,"1f997":2639,"1f998":2591,"1f999":2568,"1f99a":2610,"1f99b":2573,"1f99c":2611,"1f99d":2541,"1f99e":3761,"1f99f":2644,"1f9a0":2647,"1f9a1":2592,"1f9a2":2605,"1f9a3":2571,"1f9a4":2607,"1f9a5":2588,"1f9a6":2589,"1f9a7":2533,"1f9a8":2590,"1f9a9":2609,"1f9aa":3764,"1f9ab":2581,"1f9ac":2554,"1f9ad":2624,"1f9ae":2536,"1f9af":61312,"1f9b4":1380,"1f9b5":1371,"1f9b6":1372,"1f9b7":1379,"1f9b8-200d-2640":1532,"1f9b8-200d-2642":1531,"1f9b8":1530,"1f9b9-200d-2640":1535,"1f9b9-200d-2642":1534,"1f9b9":1533,"1f9ba":61114,"1f9bb":1374,"1f9bc":4905,"1f9bd":4904,"1f9be":1369,"1f9bf":1370,"1f9c0":3717,"1f9c1":3772,"1f9c2":3741,"1f9c3":3796,"1f9c4":3703,"1f9c5":3704,"1f9c6":3731,"1f9c7":3716,"1f9c8":3740,"1f9c9":3797,"1f9ca":3798,"1f9cb":3795,"1f9cd-200d-2640":1569,"1f9cd-200d-2642":1568,"1f9cd":1567,"1f9ce-200d-2640":1572,"1f9ce-200d-2642":1571,"1f9ce":1570,"1f9cf-200d-2640":1434,"1f9cf-200d-2642":1433,"1f9cf":1432,"1f9d0":172,"1f9d1-200d-1f33e":1456,"1f9d1-200d-1f373":1459,"1f9d1-200d-1f37c":1525,"1f9d1-200d-1f384":1529,"1f9d1-200d-1f393":1447,"1f9d1-200d-1f3a4":1477,"1f9d1-200d-1f3a8":1480,"1f9d1-200d-1f3eb":1450,"1f9d1-200d-1f3ed":1465,"1f9d1-200d-1f4bb":1474,"1f9d1-200d-1f4bc":1468,"1f9d1-200d-1f527":1462,"1f9d1-200d-1f52c":1471,"1f9d1-200d-1f680":1486,"1f9d1-200d-1f692":1489,"1f9d1-200d-1f91d-200d-1f9d1":1645,"1f9d1-200d-1f9af":1573,"1f9d1-200d-1f9b0":1402,"1f9d1-200d-1f9b1":1404,"1f9d1-200d-1f9b2":1408,"1f9d1-200d-1f9b3":1406,"1f9d1-200d-1f9bc":1576,"1f9d1-200d-1f9bd":1579,"1f9d1-200d-2695":1444,"1f9d1-200d-2696":1453,"1f9d1-200d-2708":1483,"1f9d1":1390,"1f9d2":1387,"1f9d3":1411,"1f9d4-200d-2640":1395,"1f9d4-200d-2642":1394,"1f9d4":1393,"1f9d5":1512,"1f9d6-200d-2640":1593,"1f9d6-200d-2642":1592,"1f9d6":1591,"1f9d7-200d-2640":1596,"1f9d7-200d-2642":1595,"1f9d7":1594,"1f9d8-200d-2640":1642,"1f9d8-200d-2642":1641,"1f9d8":1640,"1f9d9-200d-2640":1538,"1f9d9-200d-2642":1537,"1f9d9":1536,"1f9da-200d-2640":1541,"1f9da-200d-2642":1540,"1f9da":1539,"1f9db-200d-2640":1544,"1f9db-200d-2642":1543,"1f9db":1542,"1f9dc-200d-2640":1547,"1f9dc-200d-2642":1546,"1f9dc":1545,"1f9dd-200d-2640":1550,"1f9dd-200d-2642":1549,"1f9dd":1548,"1f9de-200d-2640":1553,"1f9de-200d-2642":1552,"1f9de":1551,"1f9df-200d-2640":1556,"1f9df-200d-2642":1555,"1f9df":1554,"1f9e0":1376,"1f9e1":1142,"1f9e2":61148,"1f9e3":61118,"1f9e4":61119,"1f9e5":61120,"1f9e6":61121,"1f9e7":51039,"1f9e8":51028,"1f9e9":51090,"1f9ea":61320,"1f9eb":61321,"1f9ec":61322,"1f9ed":4812,"1f9ee":61201,"1f9ef":61356,"1f9f0":61316,"1f9f1":4825,"1f9f2":61317,"1f9f3":4945,"1f9f4":61346,"1f9f5":51106,"1f9f6":51108,"1f9f7":61347,"1f9f8":51091,"1f9f9":61348,"1f9fa":61349,"1f9fb":61350,"1f9fc":61352,"1f9fd":61355,"1f9fe":61243,"1f9ff":51084,"1fa70":61142,"1fa71":61125,"1fa72":61126,"1fa73":61127,"1fa74":61135,"1fa78":61327,"1fa79":61329,"1fa7a":61331,"1fa80":51079,"1fa81":51080,"1fa82":4935,"1fa83":61302,"1fa84":51083,"1fa85":51092,"1fa86":51094,"1fa90":4993,"1fa91":61339,"1fa92":61345,"1fa93":61295,"1fa94":61217,"1fa95":61179,"1fa96":61149,"1fa97":61174,"1fa98":61181,"1fa99":61236,"1fa9a":61305,"1fa9b":61307,"1fa9c":61318,"1fa9d":61315,"1fa9e":61335,"1fa9f":61336,"1faa0":61341,"1faa1":51107,"1faa2":51109,"1faa3":61351,"1faa4":61344,"1faa5":61354,"1faa6":61360,"1faa7":61363,"1faa8":4826,"1fab0":2645,"1fab1":2646,"1fab2":2637,"1fab3":2640,"1fab4":2660,"1fab5":4827,"1fab6":2608,"1fac0":1377,"1fac1":1378,"1fac2":1686,"1fad0":3688,"1fad1":3699,"1fad2":3691,"1fad3":3712,"1fad4":3729,"1fad5":3736,"1fad6":3782,"203c":62834,"21a9":62765,"21aa":62766,"231a":4948,"231b":4946,"23cf":62818,"23e9":62805,"23ea":62809,"23eb":62812,"23ec":62814,"23ed":62806,"23ee":62810,"23ef":62807,"23f0":4949,"23f1":4950,"23f2":4951,"23f3":4947,"23f8":62815,"23f9":62816,"23fa":62817,"24c2":62890,"25aa":62938,"25ab":62939,"25b6":62804,"25c0":62808,"25fb":62935,"25fc":62934,"25fd":62937,"25fe":62936,"260e":61184,"261d":1350,"262a":62784,"262e":62785,"262f":62781,"263a":120,"264a":62790,"264b":62791,"264c":62792,"264d":62793,"264e":62794,"264f":62795,"265f":51099,"267b":62844,"267e":62833,"267f":62732,"269b":62777,"269c":62845,"26a0":62742,"26a1":41016,"26a7":62827,"26aa":62924,"26ab":62923,"26b0":61359,"26b1":61361,"26bd":51051,"26be":51052,"26c4":41019,"26c5":4999,"26c8":41e3,"26ce":62800,"26cf":61296,"26d1":61150,"26d3":61314,"26d4":62744,"26e9":4853,"26ea":4849,"26f0":4814,"26f1":41015,"26f2":4855,"26f3":51070,"26f4":4928,"26f5":4924,"26f7":1599,"26f8":51071,"26f9-200d-2640":1615,"26f9-200d-2642":1614,"26f9":1613,"26fa":4856,"26fd":4915,"270a":1354,"270b":1330,"270c":1339,"270d":1365,"270f":61258,"271d":62782,"274c":62853,"274e":62854,"2764-200d-1f525":1139,"2764-200d-1fa79":1140,"27a1":62757,"27b0":62855,"27bf":62856,"2b05":62761,"2b06":62755,"2b07":62759,"2b1b":62932,"2b1c":62933,"2b50":4994,"2b55":62849,"303d":62857,"1f385-1f3fb":0,"1f385-1f3fc":0,"1f385-1f3fd":0,"1f385-1f3fe":0,"1f385-1f3ff":0,"1f3c2-1f3fb":0,"1f3c2-1f3fc":0,"1f3c2-1f3fd":0,"1f3c2-1f3fe":0,"1f3c2-1f3ff":0,"1f3c3-1f3fb-200d-2640":0,"1f3c3-1f3fc-200d-2640":0,"1f3c3-1f3fd-200d-2640":0,"1f3c3-1f3fe-200d-2640":0,"1f3c3-1f3ff-200d-2640":0,"1f3c3-1f3fb-200d-2642":0,"1f3c3-1f3fc-200d-2642":0,"1f3c3-1f3fd-200d-2642":0,"1f3c3-1f3fe-200d-2642":0,"1f3c3-1f3ff-200d-2642":0,"1f3c3-1f3fb":0,"1f3c3-1f3fc":0,"1f3c3-1f3fd":0,"1f3c3-1f3fe":0,"1f3c3-1f3ff":0,"1f3c4-1f3fb-200d-2640":0,"1f3c4-1f3fc-200d-2640":0,"1f3c4-1f3fd-200d-2640":0,"1f3c4-1f3fe-200d-2640":0,"1f3c4-1f3ff-200d-2640":0,"1f3c4-1f3fb-200d-2642":0,"1f3c4-1f3fc-200d-2642":0,"1f3c4-1f3fd-200d-2642":0,"1f3c4-1f3fe-200d-2642":0,"1f3c4-1f3ff-200d-2642":0,"1f3c4-1f3fb":0,"1f3c4-1f3fc":0,"1f3c4-1f3fd":0,"1f3c4-1f3fe":0,"1f3c4-1f3ff":0,"1f3c7-1f3fb":0,"1f3c7-1f3fc":0,"1f3c7-1f3fd":0,"1f3c7-1f3fe":0,"1f3c7-1f3ff":0,"1f3ca-1f3fb-200d-2640":0,"1f3ca-1f3fc-200d-2640":0,"1f3ca-1f3fd-200d-2640":0,"1f3ca-1f3fe-200d-2640":0,"1f3ca-1f3ff-200d-2640":0,"1f3ca-1f3fb-200d-2642":0,"1f3ca-1f3fc-200d-2642":0,"1f3ca-1f3fd-200d-2642":0,"1f3ca-1f3fe-200d-2642":0,"1f3ca-1f3ff-200d-2642":0,"1f3ca-1f3fb":0,"1f3ca-1f3fc":0,"1f3ca-1f3fd":0,"1f3ca-1f3fe":0,"1f3ca-1f3ff":0,"1f3cb-1f3fb-200d-2640":0,"1f3cb-1f3fc-200d-2640":0,"1f3cb-1f3fd-200d-2640":0,"1f3cb-1f3fe-200d-2640":0,"1f3cb-1f3ff-200d-2640":0,"1f3cb-1f3fb-200d-2642":0,"1f3cb-1f3fc-200d-2642":0,"1f3cb-1f3fd-200d-2642":0,"1f3cb-1f3fe-200d-2642":0,"1f3cb-1f3ff-200d-2642":0,"1f3cb-1f3fb":0,"1f3cb-1f3fc":0,"1f3cb-1f3fd":0,"1f3cb-1f3fe":0,"1f3cb-1f3ff":0,"1f3cc-1f3fb-200d-2640":0,"1f3cc-1f3fc-200d-2640":0,"1f3cc-1f3fd-200d-2640":0,"1f3cc-1f3fe-200d-2640":0,"1f3cc-1f3ff-200d-2640":0,"1f3cc-1f3fb-200d-2642":0,"1f3cc-1f3fc-200d-2642":0,"1f3cc-1f3fd-200d-2642":0,"1f3cc-1f3fe-200d-2642":0,"1f3cc-1f3ff-200d-2642":0,"1f3cc-1f3fb":0,"1f3cc-1f3fc":0,"1f3cc-1f3fd":0,"1f3cc-1f3fe":0,"1f3cc-1f3ff":0,"1f442-1f3fb":0,"1f442-1f3fc":0,"1f442-1f3fd":0,"1f442-1f3fe":0,"1f442-1f3ff":0,"1f443-1f3fb":0,"1f443-1f3fc":0,"1f443-1f3fd":0,"1f443-1f3fe":0,"1f443-1f3ff":0,"1f446-1f3fb":0,"1f446-1f3fc":0,"1f446-1f3fd":0,"1f446-1f3fe":0,"1f446-1f3ff":0,"1f447-1f3fb":0,"1f447-1f3fc":0,"1f447-1f3fd":0,"1f447-1f3fe":0,"1f447-1f3ff":0,"1f448-1f3fb":0,"1f448-1f3fc":0,"1f448-1f3fd":0,"1f448-1f3fe":0,"1f448-1f3ff":0,"1f449-1f3fb":0,"1f449-1f3fc":0,"1f449-1f3fd":0,"1f449-1f3fe":0,"1f449-1f3ff":0,"1f44a-1f3fb":0,"1f44a-1f3fc":0,"1f44a-1f3fd":0,"1f44a-1f3fe":0,"1f44a-1f3ff":0,"1f44b-1f3fb":0,"1f44b-1f3fc":0,"1f44b-1f3fd":0,"1f44b-1f3fe":0,"1f44b-1f3ff":0,"1f44c-1f3fb":0,"1f44c-1f3fc":0,"1f44c-1f3fd":0,"1f44c-1f3fe":0,"1f44c-1f3ff":0,"1f44d-1f3fb":0,"1f44d-1f3fc":0,"1f44d-1f3fd":0,"1f44d-1f3fe":0,"1f44d-1f3ff":0,"1f44e-1f3fb":0,"1f44e-1f3fc":0,"1f44e-1f3fd":0,"1f44e-1f3fe":0,"1f44e-1f3ff":0,"1f44f-1f3fb":0,"1f44f-1f3fc":0,"1f44f-1f3fd":0,"1f44f-1f3fe":0,"1f44f-1f3ff":0,"1f450-1f3fb":0,"1f450-1f3fc":0,"1f450-1f3fd":0,"1f450-1f3fe":0,"1f450-1f3ff":0,"1f466-1f3fb":0,"1f466-1f3fc":0,"1f466-1f3fd":0,"1f466-1f3fe":0,"1f466-1f3ff":0,"1f467-1f3fb":0,"1f467-1f3fc":0,"1f467-1f3fd":0,"1f467-1f3fe":0,"1f467-1f3ff":0,"1f468-1f3fb-200d-1f33e":0,"1f468-1f3fc-200d-1f33e":0,"1f468-1f3fd-200d-1f33e":0,"1f468-1f3fe-200d-1f33e":0,"1f468-1f3ff-200d-1f33e":0,"1f468-1f3fb-200d-1f373":0,"1f468-1f3fc-200d-1f373":0,"1f468-1f3fd-200d-1f373":0,"1f468-1f3fe-200d-1f373":0,"1f468-1f3ff-200d-1f373":0,"1f468-1f3fb-200d-1f37c":0,"1f468-1f3fc-200d-1f37c":0,"1f468-1f3fd-200d-1f37c":0,"1f468-1f3fe-200d-1f37c":0,"1f468-1f3ff-200d-1f37c":0,"1f468-1f3fb-200d-1f393":0,"1f468-1f3fc-200d-1f393":0,"1f468-1f3fd-200d-1f393":0,"1f468-1f3fe-200d-1f393":0,"1f468-1f3ff-200d-1f393":0,"1f468-1f3fb-200d-1f3a4":0,"1f468-1f3fc-200d-1f3a4":0,"1f468-1f3fd-200d-1f3a4":0,"1f468-1f3fe-200d-1f3a4":0,"1f468-1f3ff-200d-1f3a4":0,"1f468-1f3fb-200d-1f3a8":0,"1f468-1f3fc-200d-1f3a8":0,"1f468-1f3fd-200d-1f3a8":0,"1f468-1f3fe-200d-1f3a8":0,"1f468-1f3ff-200d-1f3a8":0,"1f468-1f3fb-200d-1f3eb":0,"1f468-1f3fc-200d-1f3eb":0,"1f468-1f3fd-200d-1f3eb":0,"1f468-1f3fe-200d-1f3eb":0,"1f468-1f3ff-200d-1f3eb":0,"1f468-1f3fb-200d-1f3ed":0,"1f468-1f3fc-200d-1f3ed":0,"1f468-1f3fd-200d-1f3ed":0,"1f468-1f3fe-200d-1f3ed":0,"1f468-1f3ff-200d-1f3ed":0,"1f468-1f3fb-200d-1f4bb":0,"1f468-1f3fc-200d-1f4bb":0,"1f468-1f3fd-200d-1f4bb":0,"1f468-1f3fe-200d-1f4bb":0,"1f468-1f3ff-200d-1f4bb":0,"1f468-1f3fb-200d-1f4bc":0,"1f468-1f3fc-200d-1f4bc":0,"1f468-1f3fd-200d-1f4bc":0,"1f468-1f3fe-200d-1f4bc":0,"1f468-1f3ff-200d-1f4bc":0,"1f468-1f3fb-200d-1f527":0,"1f468-1f3fc-200d-1f527":0,"1f468-1f3fd-200d-1f527":0,"1f468-1f3fe-200d-1f527":0,"1f468-1f3ff-200d-1f527":0,"1f468-1f3fb-200d-1f52c":0,"1f468-1f3fc-200d-1f52c":0,"1f468-1f3fd-200d-1f52c":0,"1f468-1f3fe-200d-1f52c":0,"1f468-1f3ff-200d-1f52c":0,"1f468-1f3fb-200d-1f680":0,"1f468-1f3fc-200d-1f680":0,"1f468-1f3fd-200d-1f680":0,"1f468-1f3fe-200d-1f680":0,"1f468-1f3ff-200d-1f680":0,"1f468-1f3fb-200d-1f692":0,"1f468-1f3fc-200d-1f692":0,"1f468-1f3fd-200d-1f692":0,"1f468-1f3fe-200d-1f692":0,"1f468-1f3ff-200d-1f692":0,"1f468-1f3fb-200d-1f9af":0,"1f468-1f3fc-200d-1f9af":0,"1f468-1f3fd-200d-1f9af":0,"1f468-1f3fe-200d-1f9af":0,"1f468-1f3ff-200d-1f9af":0,"1f468-1f3fb-200d-1f9b0":0,"1f468-1f3fc-200d-1f9b0":0,"1f468-1f3fd-200d-1f9b0":0,"1f468-1f3fe-200d-1f9b0":0,"1f468-1f3ff-200d-1f9b0":0,"1f468-1f3fb-200d-1f9b1":0,"1f468-1f3fc-200d-1f9b1":0,"1f468-1f3fd-200d-1f9b1":0,"1f468-1f3fe-200d-1f9b1":0,"1f468-1f3ff-200d-1f9b1":0,"1f468-1f3fb-200d-1f9b2":0,"1f468-1f3fc-200d-1f9b2":0,"1f468-1f3fd-200d-1f9b2":0,"1f468-1f3fe-200d-1f9b2":0,"1f468-1f3ff-200d-1f9b2":0,"1f468-1f3fb-200d-1f9b3":0,"1f468-1f3fc-200d-1f9b3":0,"1f468-1f3fd-200d-1f9b3":0,"1f468-1f3fe-200d-1f9b3":0,"1f468-1f3ff-200d-1f9b3":0,"1f468-1f3fb-200d-1f9bc":0,"1f468-1f3fc-200d-1f9bc":0,"1f468-1f3fd-200d-1f9bc":0,"1f468-1f3fe-200d-1f9bc":0,"1f468-1f3ff-200d-1f9bc":0,"1f468-1f3fb-200d-1f9bd":0,"1f468-1f3fc-200d-1f9bd":0,"1f468-1f3fd-200d-1f9bd":0,"1f468-1f3fe-200d-1f9bd":0,"1f468-1f3ff-200d-1f9bd":0,"1f468-1f3fb-200d-2695":0,"1f468-1f3fc-200d-2695":0,"1f468-1f3fd-200d-2695":0,"1f468-1f3fe-200d-2695":0,"1f468-1f3ff-200d-2695":0,"1f468-1f3fb-200d-2696":0,"1f468-1f3fc-200d-2696":0,"1f468-1f3fd-200d-2696":0,"1f468-1f3fe-200d-2696":0,"1f468-1f3ff-200d-2696":0,"1f468-1f3fb-200d-2708":0,"1f468-1f3fc-200d-2708":0,"1f468-1f3fd-200d-2708":0,"1f468-1f3fe-200d-2708":0,"1f468-1f3ff-200d-2708":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fb":0,"1f468-1f3fc":0,"1f468-1f3fd":0,"1f468-1f3fe":0,"1f468-1f3ff":0,"1f469-1f3fb-200d-1f33e":0,"1f469-1f3fc-200d-1f33e":0,"1f469-1f3fd-200d-1f33e":0,"1f469-1f3fe-200d-1f33e":0,"1f469-1f3ff-200d-1f33e":0,"1f469-1f3fb-200d-1f373":0,"1f469-1f3fc-200d-1f373":0,"1f469-1f3fd-200d-1f373":0,"1f469-1f3fe-200d-1f373":0,"1f469-1f3ff-200d-1f373":0,"1f469-1f3fb-200d-1f37c":0,"1f469-1f3fc-200d-1f37c":0,"1f469-1f3fd-200d-1f37c":0,"1f469-1f3fe-200d-1f37c":0,"1f469-1f3ff-200d-1f37c":0,"1f469-1f3fb-200d-1f393":0,"1f469-1f3fc-200d-1f393":0,"1f469-1f3fd-200d-1f393":0,"1f469-1f3fe-200d-1f393":0,"1f469-1f3ff-200d-1f393":0,"1f469-1f3fb-200d-1f3a4":0,"1f469-1f3fc-200d-1f3a4":0,"1f469-1f3fd-200d-1f3a4":0,"1f469-1f3fe-200d-1f3a4":0,"1f469-1f3ff-200d-1f3a4":0,"1f469-1f3fb-200d-1f3a8":0,"1f469-1f3fc-200d-1f3a8":0,"1f469-1f3fd-200d-1f3a8":0,"1f469-1f3fe-200d-1f3a8":0,"1f469-1f3ff-200d-1f3a8":0,"1f469-1f3fb-200d-1f3eb":0,"1f469-1f3fc-200d-1f3eb":0,"1f469-1f3fd-200d-1f3eb":0,"1f469-1f3fe-200d-1f3eb":0,"1f469-1f3ff-200d-1f3eb":0,"1f469-1f3fb-200d-1f3ed":0,"1f469-1f3fc-200d-1f3ed":0,"1f469-1f3fd-200d-1f3ed":0,"1f469-1f3fe-200d-1f3ed":0,"1f469-1f3ff-200d-1f3ed":0,"1f469-1f3fb-200d-1f4bb":0,"1f469-1f3fc-200d-1f4bb":0,"1f469-1f3fd-200d-1f4bb":0,"1f469-1f3fe-200d-1f4bb":0,"1f469-1f3ff-200d-1f4bb":0,"1f469-1f3fb-200d-1f4bc":0,"1f469-1f3fc-200d-1f4bc":0,"1f469-1f3fd-200d-1f4bc":0,"1f469-1f3fe-200d-1f4bc":0,"1f469-1f3ff-200d-1f4bc":0,"1f469-1f3fb-200d-1f527":0,"1f469-1f3fc-200d-1f527":0,"1f469-1f3fd-200d-1f527":0,"1f469-1f3fe-200d-1f527":0,"1f469-1f3ff-200d-1f527":0,"1f469-1f3fb-200d-1f52c":0,"1f469-1f3fc-200d-1f52c":0,"1f469-1f3fd-200d-1f52c":0,"1f469-1f3fe-200d-1f52c":0,"1f469-1f3ff-200d-1f52c":0,"1f469-1f3fb-200d-1f680":0,"1f469-1f3fc-200d-1f680":0,"1f469-1f3fd-200d-1f680":0,"1f469-1f3fe-200d-1f680":0,"1f469-1f3ff-200d-1f680":0,"1f469-1f3fb-200d-1f692":0,"1f469-1f3fc-200d-1f692":0,"1f469-1f3fd-200d-1f692":0,"1f469-1f3fe-200d-1f692":0,"1f469-1f3ff-200d-1f692":0,"1f469-1f3fb-200d-1f9af":0,"1f469-1f3fc-200d-1f9af":0,"1f469-1f3fd-200d-1f9af":0,"1f469-1f3fe-200d-1f9af":0,"1f469-1f3ff-200d-1f9af":0,"1f469-1f3fb-200d-1f9b0":0,"1f469-1f3fc-200d-1f9b0":0,"1f469-1f3fd-200d-1f9b0":0,"1f469-1f3fe-200d-1f9b0":0,"1f469-1f3ff-200d-1f9b0":0,"1f469-1f3fb-200d-1f9b1":0,"1f469-1f3fc-200d-1f9b1":0,"1f469-1f3fd-200d-1f9b1":0,"1f469-1f3fe-200d-1f9b1":0,"1f469-1f3ff-200d-1f9b1":0,"1f469-1f3fb-200d-1f9b2":0,"1f469-1f3fc-200d-1f9b2":0,"1f469-1f3fd-200d-1f9b2":0,"1f469-1f3fe-200d-1f9b2":0,"1f469-1f3ff-200d-1f9b2":0,"1f469-1f3fb-200d-1f9b3":0,"1f469-1f3fc-200d-1f9b3":0,"1f469-1f3fd-200d-1f9b3":0,"1f469-1f3fe-200d-1f9b3":0,"1f469-1f3ff-200d-1f9b3":0,"1f469-1f3fb-200d-1f9bc":0,"1f469-1f3fc-200d-1f9bc":0,"1f469-1f3fd-200d-1f9bc":0,"1f469-1f3fe-200d-1f9bc":0,"1f469-1f3ff-200d-1f9bc":0,"1f469-1f3fb-200d-1f9bd":0,"1f469-1f3fc-200d-1f9bd":0,"1f469-1f3fd-200d-1f9bd":0,"1f469-1f3fe-200d-1f9bd":0,"1f469-1f3ff-200d-1f9bd":0,"1f469-1f3fb-200d-2695":0,"1f469-1f3fc-200d-2695":0,"1f469-1f3fd-200d-2695":0,"1f469-1f3fe-200d-2695":0,"1f469-1f3ff-200d-2695":0,"1f469-1f3fb-200d-2696":0,"1f469-1f3fc-200d-2696":0,"1f469-1f3fd-200d-2696":0,"1f469-1f3fe-200d-2696":0,"1f469-1f3ff-200d-2696":0,"1f469-1f3fb-200d-2708":0,"1f469-1f3fc-200d-2708":0,"1f469-1f3fd-200d-2708":0,"1f469-1f3fe-200d-2708":0,"1f469-1f3ff-200d-2708":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fb":0,"1f469-1f3fc":0,"1f469-1f3fd":0,"1f469-1f3fe":0,"1f469-1f3ff":0,"1f46b-1f3fb":0,"1f46b-1f3fc":0,"1f46b-1f3fd":0,"1f46b-1f3fe":0,"1f46b-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46c-1f3fb":0,"1f46c-1f3fc":0,"1f46c-1f3fd":0,"1f46c-1f3fe":0,"1f46c-1f3ff":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46d-1f3fb":0,"1f46d-1f3fc":0,"1f46d-1f3fd":0,"1f46d-1f3fe":0,"1f46d-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe":0,"1f46e-1f3fb-200d-2640":0,"1f46e-1f3fc-200d-2640":0,"1f46e-1f3fd-200d-2640":0,"1f46e-1f3fe-200d-2640":0,"1f46e-1f3ff-200d-2640":0,"1f46e-1f3fb-200d-2642":0,"1f46e-1f3fc-200d-2642":0,"1f46e-1f3fd-200d-2642":0,"1f46e-1f3fe-200d-2642":0,"1f46e-1f3ff-200d-2642":0,"1f46e-1f3fb":0,"1f46e-1f3fc":0,"1f46e-1f3fd":0,"1f46e-1f3fe":0,"1f46e-1f3ff":0,"1f470-1f3fb-200d-2640":0,"1f470-1f3fc-200d-2640":0,"1f470-1f3fd-200d-2640":0,"1f470-1f3fe-200d-2640":0,"1f470-1f3ff-200d-2640":0,"1f470-1f3fb-200d-2642":0,"1f470-1f3fc-200d-2642":0,"1f470-1f3fd-200d-2642":0,"1f470-1f3fe-200d-2642":0,"1f470-1f3ff-200d-2642":0,"1f470-1f3fb":0,"1f470-1f3fc":0,"1f470-1f3fd":0,"1f470-1f3fe":0,"1f470-1f3ff":0,"1f471-1f3fb-200d-2640":0,"1f471-1f3fc-200d-2640":0,"1f471-1f3fd-200d-2640":0,"1f471-1f3fe-200d-2640":0,"1f471-1f3ff-200d-2640":0,"1f471-1f3fb-200d-2642":0,"1f471-1f3fc-200d-2642":0,"1f471-1f3fd-200d-2642":0,"1f471-1f3fe-200d-2642":0,"1f471-1f3ff-200d-2642":0,"1f471-1f3fb":0,"1f471-1f3fc":0,"1f471-1f3fd":0,"1f471-1f3fe":0,"1f471-1f3ff":0,"1f472-1f3fb":0,"1f472-1f3fc":0,"1f472-1f3fd":0,"1f472-1f3fe":0,"1f472-1f3ff":0,"1f473-1f3fb-200d-2640":0,"1f473-1f3fc-200d-2640":0,"1f473-1f3fd-200d-2640":0,"1f473-1f3fe-200d-2640":0,"1f473-1f3ff-200d-2640":0,"1f473-1f3fb-200d-2642":0,"1f473-1f3fc-200d-2642":0,"1f473-1f3fd-200d-2642":0,"1f473-1f3fe-200d-2642":0,"1f473-1f3ff-200d-2642":0,"1f473-1f3fb":0,"1f473-1f3fc":0,"1f473-1f3fd":0,"1f473-1f3fe":0,"1f473-1f3ff":0,"1f474-1f3fb":0,"1f474-1f3fc":0,"1f474-1f3fd":0,"1f474-1f3fe":0,"1f474-1f3ff":0,"1f475-1f3fb":0,"1f475-1f3fc":0,"1f475-1f3fd":0,"1f475-1f3fe":0,"1f475-1f3ff":0,"1f476-1f3fb":0,"1f476-1f3fc":0,"1f476-1f3fd":0,"1f476-1f3fe":0,"1f476-1f3ff":0,"1f477-1f3fb-200d-2640":0,"1f477-1f3fc-200d-2640":0,"1f477-1f3fd-200d-2640":0,"1f477-1f3fe-200d-2640":0,"1f477-1f3ff-200d-2640":0,"1f477-1f3fb-200d-2642":0,"1f477-1f3fc-200d-2642":0,"1f477-1f3fd-200d-2642":0,"1f477-1f3fe-200d-2642":0,"1f477-1f3ff-200d-2642":0,"1f477-1f3fb":0,"1f477-1f3fc":0,"1f477-1f3fd":0,"1f477-1f3fe":0,"1f477-1f3ff":0,"1f478-1f3fb":0,"1f478-1f3fc":0,"1f478-1f3fd":0,"1f478-1f3fe":0,"1f478-1f3ff":0,"1f47c-1f3fb":0,"1f47c-1f3fc":0,"1f47c-1f3fd":0,"1f47c-1f3fe":0,"1f47c-1f3ff":0,"1f481-1f3fb-200d-2640":0,"1f481-1f3fc-200d-2640":0,"1f481-1f3fd-200d-2640":0,"1f481-1f3fe-200d-2640":0,"1f481-1f3ff-200d-2640":0,"1f481-1f3fb-200d-2642":0,"1f481-1f3fc-200d-2642":0,"1f481-1f3fd-200d-2642":0,"1f481-1f3fe-200d-2642":0,"1f481-1f3ff-200d-2642":0,"1f481-1f3fb":0,"1f481-1f3fc":0,"1f481-1f3fd":0,"1f481-1f3fe":0,"1f481-1f3ff":0,"1f482-1f3fb-200d-2640":0,"1f482-1f3fc-200d-2640":0,"1f482-1f3fd-200d-2640":0,"1f482-1f3fe-200d-2640":0,"1f482-1f3ff-200d-2640":0,"1f482-1f3fb-200d-2642":0,"1f482-1f3fc-200d-2642":0,"1f482-1f3fd-200d-2642":0,"1f482-1f3fe-200d-2642":0,"1f482-1f3ff-200d-2642":0,"1f482-1f3fb":0,"1f482-1f3fc":0,"1f482-1f3fd":0,"1f482-1f3fe":0,"1f482-1f3ff":0,"1f483-1f3fb":0,"1f483-1f3fc":0,"1f483-1f3fd":0,"1f483-1f3fe":0,"1f483-1f3ff":0,"1f485-1f3fb":0,"1f485-1f3fc":0,"1f485-1f3fd":0,"1f485-1f3fe":0,"1f485-1f3ff":0,"1f486-1f3fb-200d-2640":0,"1f486-1f3fc-200d-2640":0,"1f486-1f3fd-200d-2640":0,"1f486-1f3fe-200d-2640":0,"1f486-1f3ff-200d-2640":0,"1f486-1f3fb-200d-2642":0,"1f486-1f3fc-200d-2642":0,"1f486-1f3fd-200d-2642":0,"1f486-1f3fe-200d-2642":0,"1f486-1f3ff-200d-2642":0,"1f486-1f3fb":0,"1f486-1f3fc":0,"1f486-1f3fd":0,"1f486-1f3fe":0,"1f486-1f3ff":0,"1f487-1f3fb-200d-2640":0,"1f487-1f3fc-200d-2640":0,"1f487-1f3fd-200d-2640":0,"1f487-1f3fe-200d-2640":0,"1f487-1f3ff-200d-2640":0,"1f487-1f3fb-200d-2642":0,"1f487-1f3fc-200d-2642":0,"1f487-1f3fd-200d-2642":0,"1f487-1f3fe-200d-2642":0,"1f487-1f3ff-200d-2642":0,"1f487-1f3fb":0,"1f487-1f3fc":0,"1f487-1f3fd":0,"1f487-1f3fe":0,"1f487-1f3ff":0,"1f48f-1f3fb":0,"1f48f-1f3fc":0,"1f48f-1f3fd":0,"1f48f-1f3fe":0,"1f48f-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f491-1f3fb":0,"1f491-1f3fc":0,"1f491-1f3fd":0,"1f491-1f3fe":0,"1f491-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe":0,"1f4aa-1f3fb":0,"1f4aa-1f3fc":0,"1f4aa-1f3fd":0,"1f4aa-1f3fe":0,"1f4aa-1f3ff":0,"1f574-1f3fb":0,"1f574-1f3fc":0,"1f574-1f3fd":0,"1f574-1f3fe":0,"1f574-1f3ff":0,"1f575-1f3fb-200d-2640":0,"1f575-1f3fc-200d-2640":0,"1f575-1f3fd-200d-2640":0,"1f575-1f3fe-200d-2640":0,"1f575-1f3ff-200d-2640":0,"1f575-1f3fb-200d-2642":0,"1f575-1f3fc-200d-2642":0,"1f575-1f3fd-200d-2642":0,"1f575-1f3fe-200d-2642":0,"1f575-1f3ff-200d-2642":0,"1f575-1f3fb":0,"1f575-1f3fc":0,"1f575-1f3fd":0,"1f575-1f3fe":0,"1f575-1f3ff":0,"1f57a-1f3fb":0,"1f57a-1f3fc":0,"1f57a-1f3fd":0,"1f57a-1f3fe":0,"1f57a-1f3ff":0,"1f590-1f3fb":0,"1f590-1f3fc":0,"1f590-1f3fd":0,"1f590-1f3fe":0,"1f590-1f3ff":0,"1f595-1f3fb":0,"1f595-1f3fc":0,"1f595-1f3fd":0,"1f595-1f3fe":0,"1f595-1f3ff":0,"1f596-1f3fb":0,"1f596-1f3fc":0,"1f596-1f3fd":0,"1f596-1f3fe":0,"1f596-1f3ff":0,"1f645-1f3fb-200d-2640":0,"1f645-1f3fc-200d-2640":0,"1f645-1f3fd-200d-2640":0,"1f645-1f3fe-200d-2640":0,"1f645-1f3ff-200d-2640":0,"1f645-1f3fb-200d-2642":0,"1f645-1f3fc-200d-2642":0,"1f645-1f3fd-200d-2642":0,"1f645-1f3fe-200d-2642":0,"1f645-1f3ff-200d-2642":0,"1f645-1f3fb":0,"1f645-1f3fc":0,"1f645-1f3fd":0,"1f645-1f3fe":0,"1f645-1f3ff":0,"1f646-1f3fb-200d-2640":0,"1f646-1f3fc-200d-2640":0,"1f646-1f3fd-200d-2640":0,"1f646-1f3fe-200d-2640":0,"1f646-1f3ff-200d-2640":0,"1f646-1f3fb-200d-2642":0,"1f646-1f3fc-200d-2642":0,"1f646-1f3fd-200d-2642":0,"1f646-1f3fe-200d-2642":0,"1f646-1f3ff-200d-2642":0,"1f646-1f3fb":0,"1f646-1f3fc":0,"1f646-1f3fd":0,"1f646-1f3fe":0,"1f646-1f3ff":0,"1f647-1f3fb-200d-2640":0,"1f647-1f3fc-200d-2640":0,"1f647-1f3fd-200d-2640":0,"1f647-1f3fe-200d-2640":0,"1f647-1f3ff-200d-2640":0,"1f647-1f3fb-200d-2642":0,"1f647-1f3fc-200d-2642":0,"1f647-1f3fd-200d-2642":0,"1f647-1f3fe-200d-2642":0,"1f647-1f3ff-200d-2642":0,"1f647-1f3fb":0,"1f647-1f3fc":0,"1f647-1f3fd":0,"1f647-1f3fe":0,"1f647-1f3ff":0,"1f64b-1f3fb-200d-2640":0,"1f64b-1f3fc-200d-2640":0,"1f64b-1f3fd-200d-2640":0,"1f64b-1f3fe-200d-2640":0,"1f64b-1f3ff-200d-2640":0,"1f64b-1f3fb-200d-2642":0,"1f64b-1f3fc-200d-2642":0,"1f64b-1f3fd-200d-2642":0,"1f64b-1f3fe-200d-2642":0,"1f64b-1f3ff-200d-2642":0,"1f64b-1f3fb":0,"1f64b-1f3fc":0,"1f64b-1f3fd":0,"1f64b-1f3fe":0,"1f64b-1f3ff":0,"1f64c-1f3fb":0,"1f64c-1f3fc":0,"1f64c-1f3fd":0,"1f64c-1f3fe":0,"1f64c-1f3ff":0,"1f64d-1f3fb-200d-2640":0,"1f64d-1f3fc-200d-2640":0,"1f64d-1f3fd-200d-2640":0,"1f64d-1f3fe-200d-2640":0,"1f64d-1f3ff-200d-2640":0,"1f64d-1f3fb-200d-2642":0,"1f64d-1f3fc-200d-2642":0,"1f64d-1f3fd-200d-2642":0,"1f64d-1f3fe-200d-2642":0,"1f64d-1f3ff-200d-2642":0,"1f64d-1f3fb":0,"1f64d-1f3fc":0,"1f64d-1f3fd":0,"1f64d-1f3fe":0,"1f64d-1f3ff":0,"1f64e-1f3fb-200d-2640":0,"1f64e-1f3fc-200d-2640":0,"1f64e-1f3fd-200d-2640":0,"1f64e-1f3fe-200d-2640":0,"1f64e-1f3ff-200d-2640":0,"1f64e-1f3fb-200d-2642":0,"1f64e-1f3fc-200d-2642":0,"1f64e-1f3fd-200d-2642":0,"1f64e-1f3fe-200d-2642":0,"1f64e-1f3ff-200d-2642":0,"1f64e-1f3fb":0,"1f64e-1f3fc":0,"1f64e-1f3fd":0,"1f64e-1f3fe":0,"1f64e-1f3ff":0,"1f64f-1f3fb":0,"1f64f-1f3fc":0,"1f64f-1f3fd":0,"1f64f-1f3fe":0,"1f64f-1f3ff":0,"1f6a3-1f3fb-200d-2640":0,"1f6a3-1f3fc-200d-2640":0,"1f6a3-1f3fd-200d-2640":0,"1f6a3-1f3fe-200d-2640":0,"1f6a3-1f3ff-200d-2640":0,"1f6a3-1f3fb-200d-2642":0,"1f6a3-1f3fc-200d-2642":0,"1f6a3-1f3fd-200d-2642":0,"1f6a3-1f3fe-200d-2642":0,"1f6a3-1f3ff-200d-2642":0,"1f6a3-1f3fb":0,"1f6a3-1f3fc":0,"1f6a3-1f3fd":0,"1f6a3-1f3fe":0,"1f6a3-1f3ff":0,"1f6b4-1f3fb-200d-2640":0,"1f6b4-1f3fc-200d-2640":0,"1f6b4-1f3fd-200d-2640":0,"1f6b4-1f3fe-200d-2640":0,"1f6b4-1f3ff-200d-2640":0,"1f6b4-1f3fb-200d-2642":0,"1f6b4-1f3fc-200d-2642":0,"1f6b4-1f3fd-200d-2642":0,"1f6b4-1f3fe-200d-2642":0,"1f6b4-1f3ff-200d-2642":0,"1f6b4-1f3fb":0,"1f6b4-1f3fc":0,"1f6b4-1f3fd":0,"1f6b4-1f3fe":0,"1f6b4-1f3ff":0,"1f6b5-1f3fb-200d-2640":0,"1f6b5-1f3fc-200d-2640":0,"1f6b5-1f3fd-200d-2640":0,"1f6b5-1f3fe-200d-2640":0,"1f6b5-1f3ff-200d-2640":0,"1f6b5-1f3fb-200d-2642":0,"1f6b5-1f3fc-200d-2642":0,"1f6b5-1f3fd-200d-2642":0,"1f6b5-1f3fe-200d-2642":0,"1f6b5-1f3ff-200d-2642":0,"1f6b5-1f3fb":0,"1f6b5-1f3fc":0,"1f6b5-1f3fd":0,"1f6b5-1f3fe":0,"1f6b5-1f3ff":0,"1f6b6-1f3fb-200d-2640":0,"1f6b6-1f3fc-200d-2640":0,"1f6b6-1f3fd-200d-2640":0,"1f6b6-1f3fe-200d-2640":0,"1f6b6-1f3ff-200d-2640":0,"1f6b6-1f3fb-200d-2642":0,"1f6b6-1f3fc-200d-2642":0,"1f6b6-1f3fd-200d-2642":0,"1f6b6-1f3fe-200d-2642":0,"1f6b6-1f3ff-200d-2642":0,"1f6b6-1f3fb":0,"1f6b6-1f3fc":0,"1f6b6-1f3fd":0,"1f6b6-1f3fe":0,"1f6b6-1f3ff":0,"1f6c0-1f3fb":0,"1f6c0-1f3fc":0,"1f6c0-1f3fd":0,"1f6c0-1f3fe":0,"1f6c0-1f3ff":0,"1f6cc-1f3fb":0,"1f6cc-1f3fc":0,"1f6cc-1f3fd":0,"1f6cc-1f3fe":0,"1f6cc-1f3ff":0,"1f90c-1f3fb":0,"1f90c-1f3fc":0,"1f90c-1f3fd":0,"1f90c-1f3fe":0,"1f90c-1f3ff":0,"1f90f-1f3fb":0,"1f90f-1f3fc":0,"1f90f-1f3fd":0,"1f90f-1f3fe":0,"1f90f-1f3ff":0,"1f918-1f3fb":0,"1f918-1f3fc":0,"1f918-1f3fd":0,"1f918-1f3fe":0,"1f918-1f3ff":0,"1f919-1f3fb":0,"1f919-1f3fc":0,"1f919-1f3fd":0,"1f919-1f3fe":0,"1f919-1f3ff":0,"1f91a-1f3fb":0,"1f91a-1f3fc":0,"1f91a-1f3fd":0,"1f91a-1f3fe":0,"1f91a-1f3ff":0,"1f91b-1f3fb":0,"1f91b-1f3fc":0,"1f91b-1f3fd":0,"1f91b-1f3fe":0,"1f91b-1f3ff":0,"1f91c-1f3fb":0,"1f91c-1f3fc":0,"1f91c-1f3fd":0,"1f91c-1f3fe":0,"1f91c-1f3ff":0,"1f91d-1f3fb":0,"1f91d-1f3fc":0,"1f91d-1f3fd":0,"1f91d-1f3fe":0,"1f91d-1f3ff":0,"1f91e-1f3fb":0,"1f91e-1f3fc":0,"1f91e-1f3fd":0,"1f91e-1f3fe":0,"1f91e-1f3ff":0,"1f91f-1f3fb":0,"1f91f-1f3fc":0,"1f91f-1f3fd":0,"1f91f-1f3fe":0,"1f91f-1f3ff":0,"1f926-1f3fb-200d-2640":0,"1f926-1f3fc-200d-2640":0,"1f926-1f3fd-200d-2640":0,"1f926-1f3fe-200d-2640":0,"1f926-1f3ff-200d-2640":0,"1f926-1f3fb-200d-2642":0,"1f926-1f3fc-200d-2642":0,"1f926-1f3fd-200d-2642":0,"1f926-1f3fe-200d-2642":0,"1f926-1f3ff-200d-2642":0,"1f926-1f3fb":0,"1f926-1f3fc":0,"1f926-1f3fd":0,"1f926-1f3fe":0,"1f926-1f3ff":0,"1f930-1f3fb":0,"1f930-1f3fc":0,"1f930-1f3fd":0,"1f930-1f3fe":0,"1f930-1f3ff":0,"1f931-1f3fb":0,"1f931-1f3fc":0,"1f931-1f3fd":0,"1f931-1f3fe":0,"1f931-1f3ff":0,"1f932-1f3fb":0,"1f932-1f3fc":0,"1f932-1f3fd":0,"1f932-1f3fe":0,"1f932-1f3ff":0,"1f933-1f3fb":0,"1f933-1f3fc":0,"1f933-1f3fd":0,"1f933-1f3fe":0,"1f933-1f3ff":0,"1f934-1f3fb":0,"1f934-1f3fc":0,"1f934-1f3fd":0,"1f934-1f3fe":0,"1f934-1f3ff":0,"1f935-1f3fb-200d-2640":0,"1f935-1f3fc-200d-2640":0,"1f935-1f3fd-200d-2640":0,"1f935-1f3fe-200d-2640":0,"1f935-1f3ff-200d-2640":0,"1f935-1f3fb-200d-2642":0,"1f935-1f3fc-200d-2642":0,"1f935-1f3fd-200d-2642":0,"1f935-1f3fe-200d-2642":0,"1f935-1f3ff-200d-2642":0,"1f935-1f3fb":0,"1f935-1f3fc":0,"1f935-1f3fd":0,"1f935-1f3fe":0,"1f935-1f3ff":0,"1f936-1f3fb":0,"1f936-1f3fc":0,"1f936-1f3fd":0,"1f936-1f3fe":0,"1f936-1f3ff":0,"1f937-1f3fb-200d-2640":0,"1f937-1f3fc-200d-2640":0,"1f937-1f3fd-200d-2640":0,"1f937-1f3fe-200d-2640":0,"1f937-1f3ff-200d-2640":0,"1f937-1f3fb-200d-2642":0,"1f937-1f3fc-200d-2642":0,"1f937-1f3fd-200d-2642":0,"1f937-1f3fe-200d-2642":0,"1f937-1f3ff-200d-2642":0,"1f937-1f3fb":0,"1f937-1f3fc":0,"1f937-1f3fd":0,"1f937-1f3fe":0,"1f937-1f3ff":0,"1f938-1f3fb-200d-2640":0,"1f938-1f3fc-200d-2640":0,"1f938-1f3fd-200d-2640":0,"1f938-1f3fe-200d-2640":0,"1f938-1f3ff-200d-2640":0,"1f938-1f3fb-200d-2642":0,"1f938-1f3fc-200d-2642":0,"1f938-1f3fd-200d-2642":0,"1f938-1f3fe-200d-2642":0,"1f938-1f3ff-200d-2642":0,"1f938-1f3fb":0,"1f938-1f3fc":0,"1f938-1f3fd":0,"1f938-1f3fe":0,"1f938-1f3ff":0,"1f939-1f3fb-200d-2640":0,"1f939-1f3fc-200d-2640":0,"1f939-1f3fd-200d-2640":0,"1f939-1f3fe-200d-2640":0,"1f939-1f3ff-200d-2640":0,"1f939-1f3fb-200d-2642":0,"1f939-1f3fc-200d-2642":0,"1f939-1f3fd-200d-2642":0,"1f939-1f3fe-200d-2642":0,"1f939-1f3ff-200d-2642":0,"1f939-1f3fb":0,"1f939-1f3fc":0,"1f939-1f3fd":0,"1f939-1f3fe":0,"1f939-1f3ff":0,"1f93d-1f3fb-200d-2640":0,"1f93d-1f3fc-200d-2640":0,"1f93d-1f3fd-200d-2640":0,"1f93d-1f3fe-200d-2640":0,"1f93d-1f3ff-200d-2640":0,"1f93d-1f3fb-200d-2642":0,"1f93d-1f3fc-200d-2642":0,"1f93d-1f3fd-200d-2642":0,"1f93d-1f3fe-200d-2642":0,"1f93d-1f3ff-200d-2642":0,"1f93d-1f3fb":0,"1f93d-1f3fc":0,"1f93d-1f3fd":0,"1f93d-1f3fe":0,"1f93d-1f3ff":0,"1f93e-1f3fb-200d-2640":0,"1f93e-1f3fc-200d-2640":0,"1f93e-1f3fd-200d-2640":0,"1f93e-1f3fe-200d-2640":0,"1f93e-1f3ff-200d-2640":0,"1f93e-1f3fb-200d-2642":0,"1f93e-1f3fc-200d-2642":0,"1f93e-1f3fd-200d-2642":0,"1f93e-1f3fe-200d-2642":0,"1f93e-1f3ff-200d-2642":0,"1f93e-1f3fb":0,"1f93e-1f3fc":0,"1f93e-1f3fd":0,"1f93e-1f3fe":0,"1f93e-1f3ff":0,"1f977-1f3fb":0,"1f977-1f3fc":0,"1f977-1f3fd":0,"1f977-1f3fe":0,"1f977-1f3ff":0,"1f9b5-1f3fb":0,"1f9b5-1f3fc":0,"1f9b5-1f3fd":0,"1f9b5-1f3fe":0,"1f9b5-1f3ff":0,"1f9b6-1f3fb":0,"1f9b6-1f3fc":0,"1f9b6-1f3fd":0,"1f9b6-1f3fe":0,"1f9b6-1f3ff":0,"1f9b8-1f3fb-200d-2640":0,"1f9b8-1f3fc-200d-2640":0,"1f9b8-1f3fd-200d-2640":0,"1f9b8-1f3fe-200d-2640":0,"1f9b8-1f3ff-200d-2640":0,"1f9b8-1f3fb-200d-2642":0,"1f9b8-1f3fc-200d-2642":0,"1f9b8-1f3fd-200d-2642":0,"1f9b8-1f3fe-200d-2642":0,"1f9b8-1f3ff-200d-2642":0,"1f9b8-1f3fb":0,"1f9b8-1f3fc":0,"1f9b8-1f3fd":0,"1f9b8-1f3fe":0,"1f9b8-1f3ff":0,"1f9b9-1f3fb-200d-2640":0,"1f9b9-1f3fc-200d-2640":0,"1f9b9-1f3fd-200d-2640":0,"1f9b9-1f3fe-200d-2640":0,"1f9b9-1f3ff-200d-2640":0,"1f9b9-1f3fb-200d-2642":0,"1f9b9-1f3fc-200d-2642":0,"1f9b9-1f3fd-200d-2642":0,"1f9b9-1f3fe-200d-2642":0,"1f9b9-1f3ff-200d-2642":0,"1f9b9-1f3fb":0,"1f9b9-1f3fc":0,"1f9b9-1f3fd":0,"1f9b9-1f3fe":0,"1f9b9-1f3ff":0,"1f9bb-1f3fb":0,"1f9bb-1f3fc":0,"1f9bb-1f3fd":0,"1f9bb-1f3fe":0,"1f9bb-1f3ff":0,"1f9cd-1f3fb-200d-2640":0,"1f9cd-1f3fc-200d-2640":0,"1f9cd-1f3fd-200d-2640":0,"1f9cd-1f3fe-200d-2640":0,"1f9cd-1f3ff-200d-2640":0,"1f9cd-1f3fb-200d-2642":0,"1f9cd-1f3fc-200d-2642":0,"1f9cd-1f3fd-200d-2642":0,"1f9cd-1f3fe-200d-2642":0,"1f9cd-1f3ff-200d-2642":0,"1f9cd-1f3fb":0,"1f9cd-1f3fc":0,"1f9cd-1f3fd":0,"1f9cd-1f3fe":0,"1f9cd-1f3ff":0,"1f9ce-1f3fb-200d-2640":0,"1f9ce-1f3fc-200d-2640":0,"1f9ce-1f3fd-200d-2640":0,"1f9ce-1f3fe-200d-2640":0,"1f9ce-1f3ff-200d-2640":0,"1f9ce-1f3fb-200d-2642":0,"1f9ce-1f3fc-200d-2642":0,"1f9ce-1f3fd-200d-2642":0,"1f9ce-1f3fe-200d-2642":0,"1f9ce-1f3ff-200d-2642":0,"1f9ce-1f3fb":0,"1f9ce-1f3fc":0,"1f9ce-1f3fd":0,"1f9ce-1f3fe":0,"1f9ce-1f3ff":0,"1f9cf-1f3fb-200d-2640":0,"1f9cf-1f3fc-200d-2640":0,"1f9cf-1f3fd-200d-2640":0,"1f9cf-1f3fe-200d-2640":0,"1f9cf-1f3ff-200d-2640":0,"1f9cf-1f3fb-200d-2642":0,"1f9cf-1f3fc-200d-2642":0,"1f9cf-1f3fd-200d-2642":0,"1f9cf-1f3fe-200d-2642":0,"1f9cf-1f3ff-200d-2642":0,"1f9cf-1f3fb":0,"1f9cf-1f3fc":0,"1f9cf-1f3fd":0,"1f9cf-1f3fe":0,"1f9cf-1f3ff":0,"1f9d1-1f3fb-200d-1f33e":0,"1f9d1-1f3fc-200d-1f33e":0,"1f9d1-1f3fd-200d-1f33e":0,"1f9d1-1f3fe-200d-1f33e":0,"1f9d1-1f3ff-200d-1f33e":0,"1f9d1-1f3fb-200d-1f373":0,"1f9d1-1f3fc-200d-1f373":0,"1f9d1-1f3fd-200d-1f373":0,"1f9d1-1f3fe-200d-1f373":0,"1f9d1-1f3ff-200d-1f373":0,"1f9d1-1f3fb-200d-1f37c":0,"1f9d1-1f3fc-200d-1f37c":0,"1f9d1-1f3fd-200d-1f37c":0,"1f9d1-1f3fe-200d-1f37c":0,"1f9d1-1f3ff-200d-1f37c":0,"1f9d1-1f3fb-200d-1f384":0,"1f9d1-1f3fc-200d-1f384":0,"1f9d1-1f3fd-200d-1f384":0,"1f9d1-1f3fe-200d-1f384":0,"1f9d1-1f3ff-200d-1f384":0,"1f9d1-1f3fb-200d-1f393":0,"1f9d1-1f3fc-200d-1f393":0,"1f9d1-1f3fd-200d-1f393":0,"1f9d1-1f3fe-200d-1f393":0,"1f9d1-1f3ff-200d-1f393":0,"1f9d1-1f3fb-200d-1f3a4":0,"1f9d1-1f3fc-200d-1f3a4":0,"1f9d1-1f3fd-200d-1f3a4":0,"1f9d1-1f3fe-200d-1f3a4":0,"1f9d1-1f3ff-200d-1f3a4":0,"1f9d1-1f3fb-200d-1f3a8":0,"1f9d1-1f3fc-200d-1f3a8":0,"1f9d1-1f3fd-200d-1f3a8":0,"1f9d1-1f3fe-200d-1f3a8":0,"1f9d1-1f3ff-200d-1f3a8":0,"1f9d1-1f3fb-200d-1f3eb":0,"1f9d1-1f3fc-200d-1f3eb":0,"1f9d1-1f3fd-200d-1f3eb":0,"1f9d1-1f3fe-200d-1f3eb":0,"1f9d1-1f3ff-200d-1f3eb":0,"1f9d1-1f3fb-200d-1f3ed":0,"1f9d1-1f3fc-200d-1f3ed":0,"1f9d1-1f3fd-200d-1f3ed":0,"1f9d1-1f3fe-200d-1f3ed":0,"1f9d1-1f3ff-200d-1f3ed":0,"1f9d1-1f3fb-200d-1f4bb":0,"1f9d1-1f3fc-200d-1f4bb":0,"1f9d1-1f3fd-200d-1f4bb":0,"1f9d1-1f3fe-200d-1f4bb":0,"1f9d1-1f3ff-200d-1f4bb":0,"1f9d1-1f3fb-200d-1f4bc":0,"1f9d1-1f3fc-200d-1f4bc":0,"1f9d1-1f3fd-200d-1f4bc":0,"1f9d1-1f3fe-200d-1f4bc":0,"1f9d1-1f3ff-200d-1f4bc":0,"1f9d1-1f3fb-200d-1f527":0,"1f9d1-1f3fc-200d-1f527":0,"1f9d1-1f3fd-200d-1f527":0,"1f9d1-1f3fe-200d-1f527":0,"1f9d1-1f3ff-200d-1f527":0,"1f9d1-1f3fb-200d-1f52c":0,"1f9d1-1f3fc-200d-1f52c":0,"1f9d1-1f3fd-200d-1f52c":0,"1f9d1-1f3fe-200d-1f52c":0,"1f9d1-1f3ff-200d-1f52c":0,"1f9d1-1f3fb-200d-1f680":0,"1f9d1-1f3fc-200d-1f680":0,"1f9d1-1f3fd-200d-1f680":0,"1f9d1-1f3fe-200d-1f680":0,"1f9d1-1f3ff-200d-1f680":0,"1f9d1-1f3fb-200d-1f692":0,"1f9d1-1f3fc-200d-1f692":0,"1f9d1-1f3fd-200d-1f692":0,"1f9d1-1f3fe-200d-1f692":0,"1f9d1-1f3ff-200d-1f692":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fb-200d-1f9af":0,"1f9d1-1f3fc-200d-1f9af":0,"1f9d1-1f3fd-200d-1f9af":0,"1f9d1-1f3fe-200d-1f9af":0,"1f9d1-1f3ff-200d-1f9af":0,"1f9d1-1f3fb-200d-1f9b0":0,"1f9d1-1f3fc-200d-1f9b0":0,"1f9d1-1f3fd-200d-1f9b0":0,"1f9d1-1f3fe-200d-1f9b0":0,"1f9d1-1f3ff-200d-1f9b0":0,"1f9d1-1f3fb-200d-1f9b1":0,"1f9d1-1f3fc-200d-1f9b1":0,"1f9d1-1f3fd-200d-1f9b1":0,"1f9d1-1f3fe-200d-1f9b1":0,"1f9d1-1f3ff-200d-1f9b1":0,"1f9d1-1f3fb-200d-1f9b2":0,"1f9d1-1f3fc-200d-1f9b2":0,"1f9d1-1f3fd-200d-1f9b2":0,"1f9d1-1f3fe-200d-1f9b2":0,"1f9d1-1f3ff-200d-1f9b2":0,"1f9d1-1f3fb-200d-1f9b3":0,"1f9d1-1f3fc-200d-1f9b3":0,"1f9d1-1f3fd-200d-1f9b3":0,"1f9d1-1f3fe-200d-1f9b3":0,"1f9d1-1f3ff-200d-1f9b3":0,"1f9d1-1f3fb-200d-1f9bc":0,"1f9d1-1f3fc-200d-1f9bc":0,"1f9d1-1f3fd-200d-1f9bc":0,"1f9d1-1f3fe-200d-1f9bc":0,"1f9d1-1f3ff-200d-1f9bc":0,"1f9d1-1f3fb-200d-1f9bd":0,"1f9d1-1f3fc-200d-1f9bd":0,"1f9d1-1f3fd-200d-1f9bd":0,"1f9d1-1f3fe-200d-1f9bd":0,"1f9d1-1f3ff-200d-1f9bd":0,"1f9d1-1f3fb-200d-2695":0,"1f9d1-1f3fc-200d-2695":0,"1f9d1-1f3fd-200d-2695":0,"1f9d1-1f3fe-200d-2695":0,"1f9d1-1f3ff-200d-2695":0,"1f9d1-1f3fb-200d-2696":0,"1f9d1-1f3fc-200d-2696":0,"1f9d1-1f3fd-200d-2696":0,"1f9d1-1f3fe-200d-2696":0,"1f9d1-1f3ff-200d-2696":0,"1f9d1-1f3fb-200d-2708":0,"1f9d1-1f3fc-200d-2708":0,"1f9d1-1f3fd-200d-2708":0,"1f9d1-1f3fe-200d-2708":0,"1f9d1-1f3ff-200d-2708":0,"1f9d1-1f3fb":0,"1f9d1-1f3fc":0,"1f9d1-1f3fd":0,"1f9d1-1f3fe":0,"1f9d1-1f3ff":0,"1f9d2-1f3fb":0,"1f9d2-1f3fc":0,"1f9d2-1f3fd":0,"1f9d2-1f3fe":0,"1f9d2-1f3ff":0,"1f9d3-1f3fb":0,"1f9d3-1f3fc":0,"1f9d3-1f3fd":0,"1f9d3-1f3fe":0,"1f9d3-1f3ff":0,"1f9d4-1f3fb-200d-2640":0,"1f9d4-1f3fc-200d-2640":0,"1f9d4-1f3fd-200d-2640":0,"1f9d4-1f3fe-200d-2640":0,"1f9d4-1f3ff-200d-2640":0,"1f9d4-1f3fb-200d-2642":0,"1f9d4-1f3fc-200d-2642":0,"1f9d4-1f3fd-200d-2642":0,"1f9d4-1f3fe-200d-2642":0,"1f9d4-1f3ff-200d-2642":0,"1f9d4-1f3fb":0,"1f9d4-1f3fc":0,"1f9d4-1f3fd":0,"1f9d4-1f3fe":0,"1f9d4-1f3ff":0,"1f9d5-1f3fb":0,"1f9d5-1f3fc":0,"1f9d5-1f3fd":0,"1f9d5-1f3fe":0,"1f9d5-1f3ff":0,"1f9d6-1f3fb-200d-2640":0,"1f9d6-1f3fc-200d-2640":0,"1f9d6-1f3fd-200d-2640":0,"1f9d6-1f3fe-200d-2640":0,"1f9d6-1f3ff-200d-2640":0,"1f9d6-1f3fb-200d-2642":0,"1f9d6-1f3fc-200d-2642":0,"1f9d6-1f3fd-200d-2642":0,"1f9d6-1f3fe-200d-2642":0,"1f9d6-1f3ff-200d-2642":0,"1f9d6-1f3fb":0,"1f9d6-1f3fc":0,"1f9d6-1f3fd":0,"1f9d6-1f3fe":0,"1f9d6-1f3ff":0,"1f9d7-1f3fb-200d-2640":0,"1f9d7-1f3fc-200d-2640":0,"1f9d7-1f3fd-200d-2640":0,"1f9d7-1f3fe-200d-2640":0,"1f9d7-1f3ff-200d-2640":0,"1f9d7-1f3fb-200d-2642":0,"1f9d7-1f3fc-200d-2642":0,"1f9d7-1f3fd-200d-2642":0,"1f9d7-1f3fe-200d-2642":0,"1f9d7-1f3ff-200d-2642":0,"1f9d7-1f3fb":0,"1f9d7-1f3fc":0,"1f9d7-1f3fd":0,"1f9d7-1f3fe":0,"1f9d7-1f3ff":0,"1f9d8-1f3fb-200d-2640":0,"1f9d8-1f3fc-200d-2640":0,"1f9d8-1f3fd-200d-2640":0,"1f9d8-1f3fe-200d-2640":0,"1f9d8-1f3ff-200d-2640":0,"1f9d8-1f3fb-200d-2642":0,"1f9d8-1f3fc-200d-2642":0,"1f9d8-1f3fd-200d-2642":0,"1f9d8-1f3fe-200d-2642":0,"1f9d8-1f3ff-200d-2642":0,"1f9d8-1f3fb":0,"1f9d8-1f3fc":0,"1f9d8-1f3fd":0,"1f9d8-1f3fe":0,"1f9d8-1f3ff":0,"1f9d9-1f3fb-200d-2640":0,"1f9d9-1f3fc-200d-2640":0,"1f9d9-1f3fd-200d-2640":0,"1f9d9-1f3fe-200d-2640":0,"1f9d9-1f3ff-200d-2640":0,"1f9d9-1f3fb-200d-2642":0,"1f9d9-1f3fc-200d-2642":0,"1f9d9-1f3fd-200d-2642":0,"1f9d9-1f3fe-200d-2642":0,"1f9d9-1f3ff-200d-2642":0,"1f9d9-1f3fb":0,"1f9d9-1f3fc":0,"1f9d9-1f3fd":0,"1f9d9-1f3fe":0,"1f9d9-1f3ff":0,"1f9da-1f3fb-200d-2640":0,"1f9da-1f3fc-200d-2640":0,"1f9da-1f3fd-200d-2640":0,"1f9da-1f3fe-200d-2640":0,"1f9da-1f3ff-200d-2640":0,"1f9da-1f3fb-200d-2642":0,"1f9da-1f3fc-200d-2642":0,"1f9da-1f3fd-200d-2642":0,"1f9da-1f3fe-200d-2642":0,"1f9da-1f3ff-200d-2642":0,"1f9da-1f3fb":0,"1f9da-1f3fc":0,"1f9da-1f3fd":0,"1f9da-1f3fe":0,"1f9da-1f3ff":0,"1f9db-1f3fb-200d-2640":0,"1f9db-1f3fc-200d-2640":0,"1f9db-1f3fd-200d-2640":0,"1f9db-1f3fe-200d-2640":0,"1f9db-1f3ff-200d-2640":0,"1f9db-1f3fb-200d-2642":0,"1f9db-1f3fc-200d-2642":0,"1f9db-1f3fd-200d-2642":0,"1f9db-1f3fe-200d-2642":0,"1f9db-1f3ff-200d-2642":0,"1f9db-1f3fb":0,"1f9db-1f3fc":0,"1f9db-1f3fd":0,"1f9db-1f3fe":0,"1f9db-1f3ff":0,"1f9dc-1f3fb-200d-2640":0,"1f9dc-1f3fc-200d-2640":0,"1f9dc-1f3fd-200d-2640":0,"1f9dc-1f3fe-200d-2640":0,"1f9dc-1f3ff-200d-2640":0,"1f9dc-1f3fb-200d-2642":0,"1f9dc-1f3fc-200d-2642":0,"1f9dc-1f3fd-200d-2642":0,"1f9dc-1f3fe-200d-2642":0,"1f9dc-1f3ff-200d-2642":0,"1f9dc-1f3fb":0,"1f9dc-1f3fc":0,"1f9dc-1f3fd":0,"1f9dc-1f3fe":0,"1f9dc-1f3ff":0,"1f9dd-1f3fb-200d-2640":0,"1f9dd-1f3fc-200d-2640":0,"1f9dd-1f3fd-200d-2640":0,"1f9dd-1f3fe-200d-2640":0,"1f9dd-1f3ff-200d-2640":0,"1f9dd-1f3fb-200d-2642":0,"1f9dd-1f3fc-200d-2642":0,"1f9dd-1f3fd-200d-2642":0,"1f9dd-1f3fe-200d-2642":0,"1f9dd-1f3ff-200d-2642":0,"1f9dd-1f3fb":0,"1f9dd-1f3fc":0,"1f9dd-1f3fd":0,"1f9dd-1f3fe":0,"1f9dd-1f3ff":0,"261d-1f3fb":0,"261d-1f3fc":0,"261d-1f3fd":0,"261d-1f3fe":0,"261d-1f3ff":0,"26f9-1f3fb-200d-2640":0,"26f9-1f3fc-200d-2640":0,"26f9-1f3fd-200d-2640":0,"26f9-1f3fe-200d-2640":0,"26f9-1f3ff-200d-2640":0,"26f9-1f3fb-200d-2642":0,"26f9-1f3fc-200d-2642":0,"26f9-1f3fd-200d-2642":0,"26f9-1f3fe-200d-2642":0,"26f9-1f3ff-200d-2642":0,"26f9-1f3fb":0,"26f9-1f3fc":0,"26f9-1f3fd":0,"26f9-1f3fe":0,"26f9-1f3ff":0,"270a-1f3fb":0,"270a-1f3fc":0,"270a-1f3fd":0,"270a-1f3fe":0,"270a-1f3ff":0,"270b-1f3fb":0,"270b-1f3fc":0,"270b-1f3fd":0,"270b-1f3fe":0,"270b-1f3ff":0,"270c-1f3fb":0,"270c-1f3fc":0,"270c-1f3fd":0,"270c-1f3fe":0,"270c-1f3ff":0,"270d-1f3fb":0,"270d-1f3fc":0,"270d-1f3fd":0,"270d-1f3fe":0,"270d-1f3ff":0}},n=s[""];for(const e in s)e&&Object.assign(n,s[e]);const i=n},4762:(e,t,a)=>{a.d(t,{IS_FIREFOX:()=>r,IS_SAFARI:()=>i});var s=a(6761);const n=navigator?navigator.userAgent:null,i=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&s.Z.MSStream,!!("safari"in s.Z)||!(!n||!(/\b(iPad|iPhone|iPod)\b/.test(n)||n.match("Safari")&&!n.match("Chrome")))),r=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},467:(e,t,a)=>{a.d(t,{ZP:()=>o,gV:()=>p});var s=a(5813);const n=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,i=/^\s+|\s$/g,r={й:"q",ц:"w",у:"e",к:"r",е:"t",н:"y",г:"u",ш:"i",щ:"o",з:"p",х:"[",ъ:"]",ф:"a",ы:"s",в:"d",а:"f",п:"g",р:"h",о:"j",л:"k",д:"l",ж:";",э:"'",я:"z",ч:"x",с:"c",м:"v",и:"b",т:"n",ь:"m",б:",",ю:".",".":"/"};function o(e,t=!0){return p(e,{clearBadChars:!0,latinize:t,ignoreCase:!0})}function p(e,t={}){const a=t.includeTag&&"%"===e.charAt(0),o=e;return t.clearBadChars&&(e=function(e){return e.replace(n,"").replace(i,"")}(e)),t.latinize&&(e=function(e){return e.replace(/[^A-Za-z0-9]/g,(e=>{const t=s.Z[e];return null!=t?t:e}))}(e)),t.ignoreCase&&(e=e.toLowerCase()),a&&(e="%"+e),t.latinize&&(e+=""+function(e){return e.toLowerCase().replace(/[\wа-я]/g,(e=>{const t=r[e];return null!=t?t:e}))}(o)),e}},8801:(e,t,a)=>{a.d(t,{P:()=>n,q:()=>i});const s="_";function n(e,t){const a=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join(s);break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join(s);break;case"inputFileLocation":n=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":n=["webFile",e.url].join(s);break;default:console.error("Unrecognized location:",e),n=""}return n+((null==t?void 0:t.downloadId)?"_download":"")+(a?"."+a:a)}function i(e,t){return e+"/"+encodeURIComponent(JSON.stringify(t))}},677:(e,t,a)=>{a.d(t,{Ki:()=>o,RP:()=>i,X:()=>r});const s=new Set(["all","web","webk"]),n=new Set;function i(e){return e.find((e=>s.has(e.platform)&&!n.has(e.reason)))}function r(e){return!!i(e)}function o(e){n.clear(),e.forEach((e=>{n.add(e)}))}},2946:(e,t,a)=>{a.d(t,{Z:()=>i});var s=a(5880),n=a(1507);function i(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if((0,s.Z)(e)){const t=e.user_id;if(void 0!==t)return t.toPeerId(!1);const a=e.channel_id||e.chat_id;return void 0!==a?a.toPeerId(!0):n.NM}if(!e)return n.NM;const t="u"===e.charAt(0),a=e.substr(1).split("_");return t?a[0].toPeerId():(a[0]||"").toPeerId(!0)}},6666:(e,t,a)=>{a.d(t,{C:()=>o,Z:()=>p});var s=a(1267),n=a(5471),i=a(5953),r=a(5003);class o{constructor(e){(0,i.Z)(this,e),s.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,r.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),o.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var a;const s=Array.from(e.indexNames);for(const t of s)e.deleteIndex(t);if(null===(a=t.indexes)||void 0===a?void 0:a.length)for(const a of t.indexes)e.indexNames.contains(a.indexName)||e.createIndex(a.indexName,a.keyPath,a.objectParameters)};try{var a=indexedDB.open(this.name,this.version);if(!a)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let s=!1;return setTimeout((()=>{s||a.onerror((0,n.Z)("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,n)=>{a.onsuccess=t=>{s=!0;const i=a.result;let r=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},i.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},a.onerror=e=>{s=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},a.onupgradeneeded=e=>{s=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const a=e.target,n=a.result;this.stores.forEach((e=>{if(n.objectStoreNames.contains(e.name)){const s=a.transaction.objectStore(e.name);t(s,e)}else((e,a)=>{const s=e.createObjectStore(a.name);t(s,a)})(n,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new o(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const a=t.db;a&&(a.onclose=()=>{},a.close())}))}}o.INSTANCES=[];class p{constructor(e,t){this.storeName=t,this.log=(0,r.kg)(["IDB",e.name,t].join("-")),this.idb=o.create(e)}delete(e,t){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,a){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(a=>e.map(((e,s)=>a.put(t[s],e)))),"",a)}get(e,t){return Array.isArray(e)||(e=[].concat(e)),e.length?this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"",t):Promise.resolve([])}getObjectStore(e,t,a,s=this.storeName){let n;return a&&(n=performance.now(),this.log(a+": start")),this.idb.openDatabase().then((i=>new Promise(((r,o)=>{const p=i.transaction([s],e),d=()=>{clearTimeout(l),o(p.error)},f=()=>{clearTimeout(l),a&&this.log(a+": end",performance.now()-n);const e=h.map((e=>e.result));r(g?e:e[0])};p.onerror=d;const c="readwrite"===e;c&&(p.oncomplete=()=>f());const l=setTimeout((()=>{this.log.error("transaction not finished",p,a)}),1e4),m=t(p.objectStore(s)),g=Array.isArray(m),h=g?m:[].concat(m);if(c)return;const u=h.length;let y=u;const _=()=>{p.error||--y||f()};for(let e=0;ee.getAll()),"",e)}}},1082:(e,t,a)=>{a.d(t,{r:()=>Ws,H:()=>Hs}),a(690),a(4110);var s=a(8630);let n;function i(){return n}function r(e){return n=e}var o=a(1507),p=a(3241),d=a(410),f=a(3206),c=a(1352);class l extends p.Z{constructor(){super(),this.myId=o.NM,this.connectionStatus={},this.premium=!1,this.addEventListener("user_auth",(({id:e})=>{this.myId=e.toPeerId()})),this.addEventListener("premium_toggle_private",(({isNew:e,isPremium:t})=>{this.premium=t,e||this.dispatchEventSingle("premium_toggle",t)})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.dispatchEvent=(e,...t)=>{super.dispatchEvent(e,...t),f.Z.getInstance().invokeVoid("event",{name:e,args:t})},c.kC||this.addEventListener("settings_updated",(({settings:e})=>{this.settings=e}))}getConnectionStatus(){return this.connectionStatus}getPremium(){return this.premium}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const m=new l;d.GO.rootScope=m;const g=m;var h=a(7922),u=a(9750);const y=new class{constructor(){this.state={},this.storage=h.Z}getState(){return Promise.resolve(this.state)}setByKey(e,t){!function(e,t,a){const s=t.split(".");(0,u.Z)(e,s.slice(0,-1).join("."))[s.pop()]=a}(this.state,e,t);const a=e.split(".")[0];"settings"===a&&g.dispatchEvent("settings_updated",{key:e,value:t,settings:this.state.settings}),this.pushToState(a,this.state[a])}pushToState(e,t,a=!0,s){a&&(this.state[e]=t),this.setKeyValueToStorage(e,t,s)}setKeyValueToStorage(e,t=this.state[e],a){f.Z.getInstance().invokeVoid("mirror",{name:"state",key:e,value:t}),this.storage.set({[e]:t},a)}};var _=a(4159),v=a(3725),P=a(5418),b=a(1267),M=a(1655),I=a(5003);class S{constructor(e,t,a){this.dcId=e,this.url=t,this.pending=[],this.debug=b.Z.debug&&!1;let s=I.v9.Error|I.v9.Log;this.debug&&(s|=I.v9.Debug),this.log=(0,I.kg)(`HTTP-${e}`+a,s),this.log("constructor"),this.connected=!1}_send(e,t){const a=e.length;return this.debug&&this.log.debug("-> body length to send:",a),fetch(this.url,{method:"POST",body:e,mode:t}).then((e=>{if(200!==e.status&&!t)throw e.arrayBuffer().then((e=>{this.log.error("not 200",new TextDecoder("utf-8").decode(new Uint8Array(e)))})),e;return this.setConnected(!0),e.arrayBuffer().then((e=>new Uint8Array(e)))}),(e=>{throw this.setConnected(!1),e}))}setConnected(e){this.connected===e||this.destroyed||(this.connected=e,Z.setTransportValue("https",e))}destroy(){this.setConnected(!1),this.destroyed=!0,this.pending.forEach((e=>e.reject())),this.pending.length=0}send(e){if(this.networker)return this._send(e);{const t=new Promise(((t,a)=>{this.pending.push({resolve:t,reject:a,body:e})}));return this.releasePending(),t}}releasePending(){return e=this,t=void 0,s=function*(){if(!this.releasing){this.releasing=!0;for(let e=0;e{this.log("opened"),this.debug&&this.log.debug("sending init packet"),this.dispatchEvent("open")},this.handleError=e=>{this.log.error("handleError",e),this.close()},this.handleClose=e=>{this.log("closed",e),this.removeListeners(),this.dispatchEvent("close")},this.handleMessage=e=>{this.debug&&this.log.debug("<-","handleMessage",e.data.byteLength),this.dispatchEvent("message",e.data)},this.send=e=>{this.debug&&this.log.debug("-> body length to send:",e.length),this.ws.send(e)};let s=I.v9.Error|I.v9.Log;return this.debug&&(s|=I.v9.Debug),this.log=(0,I.kg)(`WS-${e}`+a,s),this.log("constructor"),this.connect(),this}removeListeners(){this.ws&&(this.ws.removeEventListener("open",this.handleOpen),this.ws.removeEventListener("close",this.handleClose),this.ws.removeEventListener("error",this.handleError),this.ws.removeEventListener("message",this.handleMessage),this.ws=void 0)}connect(){this.ws=new WebSocket(this.url,"binary"),this.ws.binaryType="arraybuffer",this.ws.addEventListener("open",this.handleOpen),this.ws.addEventListener("close",this.handleClose),this.ws.addEventListener("error",this.handleError),this.ws.addEventListener("message",this.handleMessage)}close(){if(this.ws){this.log("close execution");try{this.ws.close()}catch(e){}this.handleClose()}}}function w(e){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");return crypto.getRandomValues(e),e}var k=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class A{constructor(){this._process=(e,t)=>s.Z.invokeCryptoNew({method:"aes-ctr-process",args:[{id:this.id,data:e,operation:t}],transfer:[e.buffer]})}init(e){return k(this,void 0,void 0,(function*(){void 0!==this.idPromise&&this.release();const t=new Uint8Array(64);for(w(t);;){const e=t[3]<<24|t[2]<<16|t[1]<<8|t[0],a=t[7]<<24|t[6]<<16|t[5]<<8|t[4];if(239!==t[0]&&1145128264!==e&&1414745936!==e&&542393671!==e&&1230262351!==e&&4008636142!==e&&3722304989!==e&&0!==a)break;w(t)}const a=t.slice().reverse(),n=t.slice(8,40),i=t.slice(40,56),r=a.slice(8,40),o=a.slice(40,56),p=this.idPromise=s.Z.invokeCrypto("aes-ctr-prepare",{encKey:n,encIv:i,decKey:r,decIv:o});this.process=(e,t)=>k(this,void 0,void 0,(function*(){return yield p,this._process(e,t)})),this.id=yield p,this.process=this._process,t.set(e.obfuscateTag,56);const d=yield this.encode(t.slice());return t.set(d.slice(56,64),56),t}))}encode(e){return this.process(e,"encrypt")}decode(e){return this.process(e,"decrypt")}release(){return k(this,void 0,void 0,(function*(){const e=this.idPromise;if(void 0===e)return;this.id=void 0,this.idPromise=void 0;const t=yield e;s.Z.invokeCrypto("aes-ctr-destroy",t)}))}destroy(){this.release()}}const D=new class{constructor(){this.tag=239,this.obfuscateTag=new Uint8Array([this.tag,this.tag,this.tag,this.tag])}encodePacket(e){const t=e.byteLength>>2;let a;return a=t<127?new Uint8Array([t]):new Uint8Array([127,255&t,t>>8&255,t>>16&255]),a.concat(e)}readPacket(e){let t=e[0];return t>=127?(t=e[1]|e[2]<<8|e[3]<<16,e.slice(4,t<<3)):e.slice(1,t<<3)}};var U=a(9174);function T(e){const t=e.length,a=new Array(t);for(let s=0;sF(this,void 0,void 0,(function*(){this.connected=!0,Z.setTransportOpened("websocket");const e=yield this.obfuscation.init(this.codec);this.connected&&(this.connection.send(e),this.networker&&(this.pending.length=0,this.networker.setConnectionStatus(U.Q.Connected),this.networker.cleanupSent(),this.networker.resend()),setTimeout((()=>{this.releasePending()}),0))})),this.onMessage=e=>F(this,void 0,void 0,(function*(){let t=yield this.obfuscation.decode(new Uint8Array(e));if(t=this.codec.readPacket(t),this.networker)return this.debug&&this.log.debug("redirecting to networker",t.length),void this.networker.parseResponse(t).then((e=>{this.debug&&this.log.debug("redirecting to networker response:",e);try{this.networker.processMessage(e.response,e.messageId,e.sessionId)}catch(e){this.log.error("handleMessage networker processMessage error",e)}})).catch((e=>{this.log.error("handleMessage networker parseResponse error",e)}));const a=this.pending.shift();a?a.resolve(t):this.debug&&this.log.debug("no pending for res:",T(t))})),this.onClose=()=>{let e,t;if(this.clear(),this.autoReconnect){const a=Date.now(),s=a-this.lastCloseTime;e=!isNaN(s)&&s{if(void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0),!this.connection){if(this.log("trying to reconnect..."),this.lastCloseTime=Date.now(),this.networker)this.networker.setConnectionStatus(U.Q.Connecting);else for(const e of this.pending)e.bodySent&&(e.bodySent=!1);this.connect()}};let i=I.v9.Error|I.v9.Log;this.debug&&(i|=I.v9.Debug),this.log=(0,I.kg)(`TCP-${t}`+s,i),this.log("constructor"),this.connect()}clear(){this.connected&&Z.setTransportClosed("websocket"),this.connected=!1,this.connection&&(this.connection.removeEventListener("open",this.onOpen),this.connection.removeEventListener("close",this.onClose),this.connection.removeEventListener("message",this.onMessage),this.connection=void 0)}forceReconnect(){this.close(),this.reconnect()}destroy(){this.setAutoReconnect(!1),this.close(),this.obfuscation&&this.obfuscation.destroy(),this.pending.forEach((e=>{e.reject&&e.reject()})),this.pending.length=0}close(){const e=this.connection;if(e){const t=this.connected;this.clear(),t&&(e.addEventListener("message",this.onMessage),e.addEventListener("close",(()=>{e.removeEventListener("message",this.onMessage)}),{once:!0}),e.close())}}setAutoReconnect(e){this.autoReconnect=e,e?this.connection||void 0!==this.reconnectTimeout||this.reconnect():void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0)}connect(){this.connection&&this.close(),this.connection=new this.Connection(this.dcId,this.url,this.logSuffix),this.connection.addEventListener("open",this.onOpen),this.connection.addEventListener("close",this.onClose),this.connection.addEventListener("message",this.onMessage)}changeUrl(e){this.url!==e&&(this.url=e,this.forceReconnect())}encodeBody(e){const t=this.codec.encodePacket(e);return this.obfuscation.encode(t)}send(e){this.debug&&this.log.debug("-> body length to pending:",e.length);const t=void 0;if(!this.networker){const a=new Promise(((a,s)=>{this.pending.push({resolve:a,reject:s,body:e,encoded:t})}));return this.releasePending(),a}this.pending.push({body:e,encoded:t}),this.releasePending()}releasePending(){var e;return F(this,void 0,void 0,(function*(){if(!this.connected||this.releasingPending)return;this.releasingPending=!0;let t=this.pending.length,a=!1;for(let s=0;s body length to send:",i.length);const r=null!==(e=n.encoded)&&void 0!==e?e:n.encoded=yield this.encodeBody(i);if(!this.connected)break;this.connection.send(r),n.resolve?n.bodySent=!0:(this.pending.splice(s--,1),t--),a=!0}}this.releasingPending=void 0,this.pending.length&&a&&this.releasePending()}))}}const x=b.Z.test?"_test":"";function B(e){return"client"===e?"":"-1"}function V(e,t,a){const s=B(t),n="client"!==t?"apiws"+x+(a?"_premium":""):"apiws"+x;return`wss://${_.Z.suffix.toLowerCase()}ws${e}${s}.web.telegram.org/${n}`}class O{constructor(){this.sslSubdomains=["pluto","venus","aurora","vesta","flora"],this.dcOptions=b.Z.test?[{id:1,host:"149.154.175.10",port:80},{id:2,host:"149.154.167.40",port:80},{id:3,host:"149.154.175.117",port:80}]:[{id:1,host:"149.154.175.50",port:80},{id:2,host:"149.154.167.50",port:80},{id:3,host:"149.154.175.100",port:80},{id:4,host:"149.154.167.91",port:80},{id:5,host:"149.154.171.5",port:80}],this.chosenServers={},this.transportSocket=(e,t,a)=>{const s=V(e,t,a);let n;return n=C,new R(n,e,s,"upload"===t?"-U":"download"===t?"-D":"",1e4)},this.transportHTTP=(e,t,a)=>{let s;if(b.Z.ssl||!b.Z.http){const a=B(t);s="https://"+(this.sslSubdomains[e-1]+a)+".web.telegram.org/"+(b.Z.test?"apiw_test1":"apiw1")}else for(const t of this.dcOptions)if(t.id===e){s="http://"+t.host+(80!==t.port?":"+t.port:"")+"/apiw1";break}return new S(e,s,"upload"===t?"-U":"download"===t?"-D":"")}}chooseServer(e,t="client",a=b.Z.transport,s=!0,n){this.chosenServers.hasOwnProperty(a)||(this.chosenServers[a]={client:{},download:{},upload:{}});const i=this.chosenServers[a][t];e in i||(i[e]=[]);const r=i[e];if(!r.length||!s){let i;return i=("websocket"===a?this.transportSocket:this.transportHTTP)(e,t,n),i?(s&&r.push(i),i):(console.error("No chosenServer!",e),null)}return r[0]}static removeTransport(e,t){for(const a in e)for(const s in e[a])for(const n in e[a][s]){const i=e[a][s][n];(0,M.Z)(i,t)}}}var L=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class N extends p.Z{constructor(){super(!0),this.opened=new Map,this.addEventListener("change",(e=>{e.get("websocket")||this.waitForWebSocket()}))}pingTransports(){var e;return L(this,void 0,void 0,(function*(){const t=null!==(e=this.dcConfigurator)&&void 0!==e?e:this.dcConfigurator=new O,a=this.transports={https:t.chooseServer(_.Z.baseDcId,"client","https",!1),websocket:t.chooseServer(_.Z.baseDcId,"client","websocket",!1)},s=(0,v.Z)();this.transports.https._send(new Uint8Array,"no-cors").then((()=>s.resolve(!0)),(()=>s.resolve(!1))),setTimeout((()=>s.resolve(!1)),2e3);const n=(0,v.Z)(),i=a.websocket;i.setAutoReconnect(!1),i.connection.addEventListener("close",(()=>n.resolve(!1)),{once:!0}),i.connection.addEventListener("open",(()=>n.resolve(!0)),{once:!0}),setTimeout((()=>{n.isFulfilled||n.isRejected||(i.connection&&i.connection.close(),n.resolve(!1))}),2e3);const[r,o]=yield Promise.all([s,n]);for(const e in a)a[e].destroy();return{https:r||this.opened.get("https")>0,websocket:o||this.opened.get("websocket")>0}}))}waitForWebSocket(){return L(this,void 0,void 0,(function*(){if(!this.pinging){for(this.pinging=!0;;){const{https:e,websocket:t}=yield this.pingTransports();if((e||t)&&this.dispatchEvent("transport",t||!e?"websocket":"https"),t)break;yield(0,P.Z)(1e4)}this.pinging=!1}}))}setTransportValue(e,t){let a=this.opened.get(e)||0;a+=t?1:-1,this.opened.set(e,a),this.dispatchEvent("change",this.opened)}setTransportOpened(e){return this.setTransportValue(e,!0)}setTransportClosed(e){return this.setTransportValue(e,!1)}}const Z=new N,j=(0,v.Z)();var q=a(6654);class G{setManagers(e){Object.assign(this,e)}}var H=a(3127),W=a(3989),z=a(5466);let K;function J(e){return null!=K?K:K=function(e){return t=this,a=void 0,n=function*(){const t=(0,z.$)((0,I.kg)("STORAGES-LOADER")),a=Object.keys(e),s=a.map((a=>{const s=e[a].getAll();return t(s,"storage "+a)})),n={},i=yield Promise.all(s);for(let e=0,t=a.length;e({storage:this.storages[e],results:t[e]})))},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}}class Q extends G{getState(){return this.apiManager.invokeApi("account.getPassword").then((e=>e))}updateSettings(e={}){return this.getState().then((t=>{let a,s;const n={password:null,new_settings:{_:"account.passwordInputSettings",hint:e.hint,email:e.email}};a=e.currentPassword?this.cryptoWorker.invokeCrypto("computeSRP",e.currentPassword,t,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const i=t.new_algo,r=new Uint8Array(i.salt1.length+32);return w(r),r.set(i.salt1,0),i.salt1=r,s=e.newPassword?this.cryptoWorker.invokeCrypto("computeSRP",e.newPassword,t,!0):Promise.resolve(new Uint8Array),Promise.all([a,s]).then((e=>(n.password=e[0],n.new_settings.new_algo=i,n.new_settings.new_password_hash=e[1],this.apiManager.invokeApi("account.updatePasswordSettings",n))))}))}getInputCheckPassword(e,t){return this.cryptoWorker.invokeCrypto("computeSRP",e,t,!1)}check(e,t,a={}){return this.getInputCheckPassword(e,t).then((e=>this.apiManager.invokeApi("auth.checkPassword",{password:e},a).then((e=>("auth.authorization"===e._&&this.apiManager.setUser(e.user),e)))))}confirmPasswordEmail(e){return this.apiManager.invokeApi("account.confirmPasswordEmail",{code:e})}resendPasswordEmail(){return this.apiManager.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return this.apiManager.invokeApi("account.cancelPasswordEmail")}}var Y=a(6848),X=a(5471);class ee extends G{constructor(){super(...arguments),this.contexts=new Map,this.links={},this.log=(0,I.kg)("RD",void 0,!0)}saveContext(e,t,a){[a,e]=this.getContexts(e),a||(a=new Set,this.contexts.set(e,a)),this.links[T(e)]=e;for(const e of a)if((0,Y.Z)(e,t))return;a.add(t)}getReferenceByLink(e){return this.links[T(e)]}getContexts(e){return[this.contexts.get(e)||(e=this.getReferenceByLink(e)||e,this.contexts.get(e)),e]}getContext(e){const t=this.getContexts(e);return t[0]?[t[0].values().next().value,t[1]]:void 0}deleteContext(e,t,a){if([a,e]=this.getContexts(e),a)for(const s of a)if((0,Y.Z)(s,t))return a.delete(s),a.size||(this.contexts.delete(e),delete this.links[T(e)]),!0;return!1}refreshReference(e,t){if(this.log("refreshReference: start",e.slice(),t),!t){const a=this.getContext(e);if(!a)return this.log("refreshReference: got no context for reference:",e.slice()),Promise.reject("NO_CONTEXT");[t,e]=a}let a;switch(null==t?void 0:t.type){case"message":a=this.appMessagesManager.reloadMessages(t.peerId,t.messageId,!0);break;case"emojiesSounds":a=this.refreshEmojiesSoundsPromise||this.appStickersManager.getAnimatedEmojiSounds(!0).then((()=>{this.refreshEmojiesSoundsPromise=void 0}));break;case"userFull":a=Promise.resolve(this.appProfileManager.getProfile(t.userId,!0));break;case"customEmoji":a=this.appEmojiManager.getCustomEmojiDocuments([t.docId]);break;case"attachMenuBotIcon":a=this.appAttachMenuBotsManager.getAttachMenuBot(t.botId,!0);break;default:return this.log.warn("refreshReference: not implemented context",t),Promise.reject()}const s=T(e);return this.log("refreshReference: refreshing reference:",s),a.then((()=>{const a=T(e);if(this.log("refreshReference: refreshed, reference before:",s,"after:",a),s!==a)return e;this.deleteContext(e,t);const n=this.getContext(e);if(n)return this.refreshReference(e,n[0]);throw this.log.error("refreshReference: no new context, reference before:",s,"after:",a,t),(0,X.Z)("NO_NEW_CONTEXT")}))}}var te=a(7298),ae=a(7381),se=a(252),ne=a(7625),ie=a(6519);function re(e,t){if(!e)return t;for(var a in e)t.hasOwnProperty(a)||delete e[a];for(var a in t)e[a]=t[a];return e}var oe=a(2790),pe=a(3781),de=a(3385),fe=a(5880),ce=a(8050),le=a(2946);function me(e){var t,a;const s=[e.fromId,e.viaBotId,e.fwdFromId],n=e.media;if(n){const e=n.user_id;void 0!==e&&s.push(e.toPeerId());const t=n.results,a=null==t?void 0:t.recent_voters;(null==a?void 0:a.length)&&s.push(...a.map((e=>e.toPeerId())))}const i=null===(t=e.reactions)||void 0===t?void 0:t.recent_reactions;(null==i?void 0:i.length)&&s.push(...i.map((e=>(0,le.Z)(e.peer_id))));const r=e.action;if(r){const e=[...r.users||[],r.user_id,r.inviter_id];s.push(...e.filter(Boolean).map((e=>e.toPeerId())));const t=[r.channel_id,r.chat_id];s.push(...t.filter(Boolean).map((e=>e.toPeerId(!0))))}const o=null===(a=e.replies)||void 0===a?void 0:a.recent_repliers;return(null==o?void 0:o.length)&&s.push(...o.map((e=>(0,le.Z)(e)))),new Set(s.filter(Boolean))}var ge=a(8027);function he(e,t,a){return e[t]=a}var ue=a(8938);const ye=void 0;class _e extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e){this.allDialogsLoaded={},this.pinnedOrders={};for(const e of o.DZ)this.pinnedOrders[e]=[]}else{this.storage.clear(),this.allDialogsLoaded={},this.saveAllDialogsLoaded(),this.pinnedOrders=Object.assign({},this.pinnedOrders);for(const e of o.DZ)this.resetPinnedOrder(e);this.savePinnedOrders()}this.forumTopics=new Map,this.folders={},this.dialogsOffsetDate={},this.dialogsNum=0,this.dialogsIndex=new ae.Z({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0}),this.cachedResults={query:"",count:0,dialogs:[],folderId:0}},this.onUpdateFolderPeers=e=>{e.folder_peers.forEach((e=>{var t;const{folder_id:a,peer:s}=e,n=this.appPeersManager.getPeerId(s),i=this.dropDialog(n)[0];i&&((null===(t=i.pFlags)||void 0===t?void 0:t.pinned)&&this.handleDialogUnpinning(i,a),i.folder_id=a,this.generateIndexForDialog(i),this.pushDialog({dialog:i})),this.appMessagesManager.scheduleHandleNewDialogs(n,i)}))},this.onUpdateDialogPinned=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:o.J$,s=this.appPeersManager.getPeerId(e.peer.peer),n=this.getDialogOnly(s);this.handleDialogTogglePinned(n,e.pFlags.pinned,a)},this.onUpdateChannelPinnedTopic=e=>{const t=e.channel_id.toPeerId(!0),a=(0,pe.Z)(e.topic_id),s=this.getForumTopic(t,a);s&&this.handleDialogTogglePinned(s,e.pFlags.pinned,this.getFilterIdForForum(s))},this.onUpdatePinnedDialogs=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:o.J$;e.order?this.handleDialogsPinned(a,e.order.map((e=>this.appPeersManager.getPeerId(e.peer)))):this.apiManager.invokeApi("messages.getPinnedDialogs",{folder_id:a}).then((e=>{this.applyDialogs(e),this.handleDialogsPinned(a,e.dialogs.map((e=>e.peerId)))}))},this.onUpdateChannelPinnedTopics=e=>{return t=this,a=void 0,n=function*(){const t=e.channel_id.toPeerId(!0);if(!this.forumTopics.get(t))return;const a=t;if(e.order){const t=e.order.map((e=>(0,pe.Z)(e)));this.handleDialogsPinned(a,t)}else{const e=yield this.apiManager.getLimit("topicPin",!0),s=this.apiManager.invokeApi("channels.getForumTopics",{channel:this.appChatsManager.getChannelInput(t.toChatId()),limit:e,offset_date:0,offset_id:0,offset_topic:0}),n=(yield this.processTopics(t,s)).topics.filter((e=>e.pFlags.pinned));this.handleDialogsPinned(a,n.map((e=>e.id)))}},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}}after(){this.clear(!0),this.rootScope.addEventListener("language_change",(()=>{const e=this.appUsersManager.getSelf().id.toPeerId(!1);if(this.getDialogOnly(e)){const t=this.appPeersManager.getPeerSearchText(e);this.dialogsIndex.indexObject(e,t)}}));const e=e=>{const t=this.getCachedDialogs(!1);for(let a=0;a{const e=this.getCachedDialogs(!1);for(const e in this.folders)+e>1&&delete this.folders[e];for(let t=0;t{const t=this.getCachedDialogs(!1),a=this.getDialogIndexKeyByFilterId(e.id);for(let e=0;e{this.processChangedUnreadOrUnmuted(e.peerId)})),this.rootScope.addEventListener("chat_update",(e=>{const t=this.appChatsManager.getChat(e),a=e.toPeerId(!0);t.pFlags.left&&this.getDialogOnly(a)&&this.dropDialogOnDeletion(a)})),this.rootScope.addEventListener("chat_toggle_forum",(({chatId:e,enabled:t})=>{const a=e.toPeerId(!0);t||this.flushForumTopicsCache(a),this.processChangedUnreadOrUnmuted(a)})),this.apiUpdatesManager.addMultipleEventsListeners({updateFolderPeers:this.onUpdateFolderPeers,updateDialogPinned:this.onUpdateDialogPinned,updateChannelPinnedTopic:this.onUpdateChannelPinnedTopic,updatePinnedDialogs:this.onUpdatePinnedDialogs,updateChannelPinnedTopics:this.onUpdateChannelPinnedTopics}),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("dialogs")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.dialogs=this.storage.getCache();for(const t of o.DZ){const a=e.pinnedOrders[t];if(!a)continue;const s=this.getPinnedOrders(t);s.splice(0,s.length,...a)}t.length&&W.Z.freezeSaving(this.setDialogsFromState.bind(this,t),["chats","dialogs","messages","users"]),this.allDialogsLoaded=e.allDialogsLoaded||{},t.length&&this.appDraftsManager.addMissedDialogs()}))}setDialogsFromState(e){for(let t=0,a=e.length;tthis.allDialogsLoaded[e]))&&(this.allDialogsLoaded[void 0]=!0),this.saveAllDialogsLoaded())}saveAllDialogsLoaded(){this.appStateManager.pushToState("allDialogsLoaded",this.allDialogsLoaded)}handleDialogUnpinning(e,t){delete e.pFlags.pinned,(0,M.Z)(this.getPinnedOrders(t),this.isFilterIdForForum(t)?e.id:e.peerId),this.savePinnedOrders()}savePinnedOrders(){this.appStateManager.pushToState("pinnedOrders",this.pinnedOrders)}resetPinnedOrder(e){this.getPinnedOrders(e).length=0}getPinnedOrders(e){let t=this.pinnedOrders[e];return!t&&this.isFilterIdForForum(e)&&((0,ge.Z)(this.pinnedOrders,[e]),t=this.pinnedOrders[e]=[]),t}isDialogPinned(e,t){const a=this.filtersStorage.getFilter(t);let s;return s=a?-1!==a.pinnedPeerIds.indexOf(e):!!this.getDialogOnly(e).pFlags.pinned,s}getOffsetDate(e){const t=this.dialogsOffsetDate[e]||0;return e!==ye||t?t:Math.min(...Array.from(o.DZ).sort(((e,t)=>e-t)))}generateFolder(e){const t={dialogs:[],id:e,unreadMessagesCount:0,unreadPeerIds:new Set,unreadUnmutedPeerIds:new Set};return(0,ge.Z)(t,["dispatchUnreadTimeout"]),t}getFolder(e){var t,a;return null!==(t=(a=this.folders)[e])&&void 0!==t?t:a[e]=this.generateFolder(e)}isFilterIdForForum(e){return e&&e<0}getFilterIdForForum(e){return e.peerId}getDialogKey(e){return this.isTopic(e)?e.id:e.peerId}getFolderDialogs(e,t=!0){if(e===ye)return this.getCachedDialogs(t);const a=this.getFolder(e);return this.isFilterIdForForum(e)?t?a.dialogs.filter((e=>!e.pFlags.hidden)):a.dialogs:t?a.dialogs.filter((e=>void 0===e.migratedTo)):a.dialogs}getNextDialog(e,t,a){const s=this.getFolderDialogs(a,!0);let n;if(e){const a=s.findIndex((t=>t.peerId===e));-1!==a&&(n=s[t?a+1:a-1])}else t&&(n=s[0]);return n}getDialogIndexKeyByFilterId(e){if(this.isFilterIdForForum(e))return(0,de.Z)();if(o.DZ.has(e))return(0,de.Z)(e);const t=this.filtersStorage.getFilter(e);return(0,de.Z)(t.localId)}isDialogUnmuted(e){return!this.appNotificationsManager.isPeerLocalMuted({peerId:e.peerId,respectType:!0,threadId:this.isTopic(e)?e.id:void 0})}getFolderUnreadCount(e){const t=this.getFolder(e);return{unreadUnmutedCount:t.unreadUnmutedPeerIds.size,unreadCount:t.unreadPeerIds.size}}getCachedDialogs(e){const t=Array.from(o.DZ).map((t=>this.getFolderDialogs(t,e)));return[].concat(...t)}setDialogIndexInFilter(e,t,a){var s,n;let i;const r=this.isTopic(e),p=r||o.DZ.has(a.id);if(this.filtersStorage.testDialogForFilter(e,a)){const t=r?this.getPinnedOrders(this.getFilterIdForForum(e)):a.pinnedPeerIds,o=this.getDialogKey(e),d=t.indexOf(o);i=-1!==d?this.generateDialogIndex(this.generateDialogPinnedDateByIndex(t.length-1-d),!0):(null===(s=e.pFlags)||void 0===s?void 0:s.pinned)||p?this.generateIndexForDialog(e,!0,void 0,!p):null!==(n=(0,ce.Z)(e))&&void 0!==n?n:this.generateIndexForDialog(e,!0)}return he(e,t,i)}getDialog(e,t,a,s=!0){const n=[];a&&(t=e),void 0===t?n.push(...Array.from(o.DZ).map((e=>this.getFolder(e).dialogs))):n.push(this.getFolderDialogs(t,!1));const i=a?e=>e.id===a:t=>t.peerId===e;for(const e of n){let t=0,a=0;for(let n=e.length;tt.id===e.id:t=>t.peerId===e.peerId,d=r.findIndex(p),f=r[d],c=this.getDialogIndex(f,i);a&&n>o.Zi&&(a=void 0);const l=a?void 0:this.setDialogIndexInFilter(e,i,t);return c!==l&&(!!c!=!!l&&this.prepareFolderUnreadCountModifyingByDialog(n,e,!!l),-1!==d&&r.splice(d,1),l&&(0,ie.Z)(r,e,(e=>this.getDialogIndex(e,i)),-1),!0)}prepareDialogUnreadCountModifying(e,t){const a=this.isTopic(e),s=[],n=a?this.getFilterIdForForum(e):e.folder_id;if(s.push(this.prepareFolderUnreadCountModifyingByDialog(n,e,t)),!a){const a=this.filtersStorage.getFilters();for(const n in a){const i=a[n];this.filtersStorage.testDialogForFilter(e,i)&&s.push(this.prepareFolderUnreadCountModifyingByDialog(i.id,e,t))}}return()=>!t&&s.forEach((e=>e()))}prepareFolderUnreadCountModifyingByDialog(e,t,a){const s=this.appMessagesManager.getDialogUnreadCount(t),n=this.isDialogUnmuted(t);if(void 0===a)return()=>{const a=this.appMessagesManager.getDialogUnreadCount(t),n=this.isDialogUnmuted(t),i=a-s;this.modifyFolderUnreadCount(e,i,!!a,a&&n,t)};{const i=a?s:-s;this.modifyFolderUnreadCount(e,i,!!s,s&&n,t)}}modifyFolderUnreadCount(e,t,a,s,n){var i;const{peerId:r}=n,o=this.appPeersManager.isForum(r),p=this.isTopic(n);if(o&&!p){const i=this.getForumUnreadCount(r);if(i instanceof Promise)return void i.then((({count:t,hasUnmuted:a})=>{n=this.getDialogOnly(r);const s=this.getFolder(e);n&&this.appPeersManager.isForum(r)&&s&&s.dialogs.some((e=>e.peerId===r))&&this.modifyFolderUnreadCount(e,0,!1,!1,n)}));t=0,a=i.count>0,s=i.hasUnmuted}const d=this.getFolder(e);t&&(d.unreadMessagesCount=Math.max(0,d.unreadMessagesCount+t));const f=this.getDialogKey(n);a?d.unreadPeerIds.add(f):d.unreadPeerIds.delete(f),s?d.unreadUnmutedPeerIds.add(f):d.unreadUnmutedPeerIds.delete(f),null!==(i=d.dispatchUnreadTimeout)&&void 0!==i||(d.dispatchUnreadTimeout=E.Z.setTimeout((()=>{d.dispatchUnreadTimeout=void 0;const e=Object.assign({},d);delete e.dialogs,this.rootScope.dispatchEvent("folder_unread",e),p&&this.processChangedUnreadOrUnmuted(r)}),0))}processChangedUnreadOrUnmuted(e){const t=this.getDialogOnly(e);t&&(this.processDialogForFilters(t),this.prepareDialogUnreadCountModifying(t)(),this.rootScope.dispatchEvent("dialog_unread",{peerId:e,dialog:t}))}generateIndexForDialog(e,t,a,s){var n;if(!t)return;const i=this.isTopic(e);let r,o=0;if(e.pFlags.hidden)o=this.generateDialogPinnedDateByIndex(4095),r=!0;else if(e.pFlags.pinned&&!s)o=this.generateDialogPinnedDate(e),r=!0;else{if(a||(a=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message)),o=(null==a?void 0:a.date)||o,!i){const t=this.appPeersManager.isChannel(e.peerId)&&e.peerId.toChatId();if(t){const e=this.appChatsManager.getChat(t);(!o||e.date&&e.date>o)&&(o=e.date)}}"draftMessage"===(null===(n=e.draft)||void 0===n?void 0:n._)&&e.draft.date>o&&(o=e.draft.date)}o||(o=(0,te.Z)(!0));const p=this.generateDialogIndex(o,r);if(t)return p;he(e,(0,de.Z)(e.folder_id),p)}generateDialogPinnedDateByIndex(e){return 2147418112+(65535&e)}generateDialogPinnedDate(e){const t=this.isTopic(e),a=this.getPinnedOrders(t?this.getFilterIdForForum(e):e.folder_id),s=this.getDialogKey(e);let n=a.indexOf(s);return-1===n&&(a.unshift(s),n=0,t||this.savePinnedOrders()),this.generateDialogPinnedDateByIndex(a.length-1-n)}setDialogToState(e){if(this.isTopic(e))return;const{peerId:t,pts:a}=e,s=this.appMessagesManager.getHistoryStorage(t),n=this.appMessagesManager.getHistoryMessagesStorage(t),i=s.history.slice;let r;for(let e=0,a=i.length;e{"dialogFolder"===t._&&e.dialogs.splice(a,1)})),(0,ue.Z)(s),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appMessagesManager.saveMessages(e.messages);const n=new Map;s.forEach((e=>{var t,s;const i=this.appPeersManager.getPeerId(e.peer);let r=e.top_message;const o=this.appMessagesManager.pendingTopMsgs[i];if(o){const t=this.appMessagesManager.getMessageByPeer(i,o),a=this.appMessagesManager.getMessageByPeer(i,r);(!r||t&&(!a||(null==t?void 0:t.date)>(null==a?void 0:a.date)))&&(e.top_message=r=o,this.appMessagesManager.getHistoryStorage(i).maxId=o)}if(r||"draftMessage"===(null===(t=e.draft)||void 0===t?void 0:t._)){if(this.saveDialog({dialog:e})){const t=(e=>{let t=n.get(e);return t||n.set(e,t={}),t})(i);a?(null!==(s=t.topics)&&void 0!==s?s:t.topics=new Map).set(e.id,e):t.dialog=e}}else this.dropDialogWithEvent(i,a?this.getDialogKey(e):void 0);const p=this.appMessagesManager.getUpdateAfterReloadKey(i,a?this.getDialogKey(e):void 0),d=this.appMessagesManager.newUpdatesAfterReloadToHandle[p];if(void 0!==d){for(const e of d)d.delete(e),this.apiUpdatesManager.saveUpdate(e);d.size||delete this.appMessagesManager.newUpdatesAfterReloadToHandle[p]}})),n.size&&this.rootScope.dispatchEvent("dialogs_multiupdate",n)}getDialogOffsetDate(e){const t=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message);return(null==t?void 0:t.date)||0}canSaveDialogByPeerId(e){if(e.isAnyChat()){const t=this.appChatsManager.getChat(e.toChatId());if("channelForbidden"===t._||t.pFlags.left)return!1}return!0}saveDialog({dialog:e,folderId:t,ignoreOffsetDate:a,saveGlobalOffset:s}){var n,i;const r=this.isTopic(e),p=!r,d=r?e.id=(0,pe.Z)(e.id):void 0;r||null!=t||(t=null!==(n=e.folder_id)&&void 0!==n?n:o.J$);const f=this.appPeersManager.getPeerId(e.peer);if(!f)return console.error("saveConversation no peerId???",e,t),!1;if(r||"dialog"===e._||console.error("saveConversation not regular dialog",e,Object.assign({},e)),p&&!this.canSaveDialogByPeerId(f))return!1;const c=this.appPeersManager.isChannel(f)?f.toChatId():o.NM;if(p){const e=this.appPeersManager.getPeerSearchText(f);this.dialogsIndex.indexObject(f,e)}const l=this.getDialogOrTopic(f,d);let m,g;if(e.top_message){m=(0,pe.Z)(e.top_message);const t=(null==l?void 0:l.top_message)&&this.appMessagesManager.getMessageByPeer(f,l.top_message);(null===(i=null==t?void 0:t.pFlags)||void 0===i?void 0:i.is_outgoing)&&l.top_message>=m&&(m=l.top_message),g=this.appMessagesManager.getMessageByPeer(f,m)}else m=this.appMessagesManager.generateTempMessageId(f),g={_:"message",id:m,mid:m,from_id:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(!1)),peer_id:this.appPeersManager.getOutputPeer(f),deleted:!0,pFlags:{out:!0},date:0,message:""},this.appMessagesManager.saveMessages([g],{isOutgoing:!0});if((null==g?void 0:g.pFlags)||this.appMessagesManager.log.error("saveConversation no message:",e,g),p&&!c&&f.isAnyChat()){const t=this.appChatsManager.getChat(f.toChatId());if(t&&t.migrated_to&&t.pFlags.deactivated){const a=this.appPeersManager.getPeerId(t.migrated_to);this.appMessagesManager.migratedFromTo[f]=a,this.appMessagesManager.migratedToFrom[a]=f,e.migratedTo=a}}if(e.top_message=m,e.read_inbox_max_id=(0,pe.Z)(l&&!e.read_inbox_max_id?l.read_inbox_max_id:e.read_inbox_max_id),e.read_outbox_max_id=(0,pe.Z)(l&&!e.read_outbox_max_id?l.read_outbox_max_id:e.read_outbox_max_id),p&&void 0===e.folder_id&&"dialog"===e._&&(e.folder_id=l?l.folder_id:t),e.draft=this.appDraftsManager.saveDraft({peerId:f,threadId:d,draft:e.draft}),e.peerId=f,g&&g.pFlags.is_outgoing){const t=g.pFlags.out;m>e[t?"read_outbox_max_id":"read_inbox_max_id"]?(g.pFlags.unread=!0,e.unread_count||t||++e.unread_count):delete g.pFlags.unread}const h=this.appMessagesManager.getHistoryStorage(f,d),u=h.history.slice;if(u.length?u.isEnd(se.D.Bottom)||(h.history.insertSlice([m]).setEnd(se.D.Bottom),h.count||(h.count=1),this.appMessagesManager.mergeReplyKeyboard(h,g)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:f})):(h.history.unshift(m),h.count||(h.count=1),this.appMessagesManager.mergeReplyKeyboard(h,g)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:f})),h.maxId=m,h.readMaxId=e.read_inbox_max_id,h.readOutboxMaxId=e.read_outbox_max_id,this.appNotificationsManager.savePeerSettings({peerId:f,threadId:r?e.id:void 0,settings:e.notify_settings}),p&&c&&e.pts&&this.apiUpdatesManager.addChannelState(c,e.pts),this.generateIndexForDialog(e),l){const t=this.dialogsStorage.prepareDialogUnreadCountModifying(l);re(l,e),t()}return this.pushDialog({dialog:e,offsetDate:null==g?void 0:g.date,ignoreOffsetDate:a,saveGlobalOffset:s}),r&&this.processTopicUpdate(e,l),!0}processTopicUpdate(e,t){if(!t)return;const{peerId:a,id:s}=e,n=e.icon_emoji_id!==t.icon_emoji_id,i=e.title!==t.title,r=n||i;n&&this.rootScope.dispatchEvent("avatar_update",{peerId:a,threadId:s}),r&&this.rootScope.dispatchEvent("peer_title_edit",{peerId:a,threadId:s})}getDialogs(e){const{query:t="",offsetIndex:a,limit:s=20,filterId:n=o.J$,skipMigrated:i=!1}=e,r=this.isFilterIdForForum(n);if(!r&&!o.DZ.has(n)){const t=[],a=this.appUsersManager.fillContacts();a.cached||t.push(a.promise);const s=this.filtersStorage.reloadMissingPeerIds(n);if(s&&t.push(s),t.length)return Promise.all(t).then((()=>this.getDialogs(e)))}const p=o.DZ.has(n)&&!this.getOffsetDate(n)||r?n:ye;let d=this.getFolderDialogs(n,i);const f=this.getDialogIndexKeyByFilterId(n);if(t&&!r){if(!s||this.cachedResults.query!==t||this.cachedResults.folderId!==n){this.cachedResults.query=t,this.cachedResults.folderId=n;const e=this.dialogsIndex.search(t),a=[];for(const t in this.dialogs){const s=this.dialogs[t];e.has(s.peerId)&&s.folder_id===n&&a.push(s)}a.sort(((e,t)=>this.getDialogIndex(t,f)-this.getDialogIndex(e,f))),this.cachedResults.dialogs=a,this.cachedResults.count=a.length}d=this.cachedResults.dialogs}else this.cachedResults.query="";let c=0;if(a>0)for(let e=d.length;cthis.getDialogIndex(d[c],f));++c);const l=this.isDialogsLoaded(p),m=d.length>=c+s;if(t||l||m){const e=d.slice(c,c+s);return{dialogs:e,count:l?d.length:null,isTopEnd:d.length&&(e[0]&&e[0]===d[0]||this.getDialogIndex(d[0],f)=d.length}}return this.appMessagesManager.getTopMessages({limit:s,folderId:p}).then((e=>{if(i&&(d=this.getFolderDialogs(n,i)),c=0,a>0)for(let e=d.length;cthis.getDialogIndex(d[c],f));++c);const t=d.slice(c,c+s);return{dialogs:t,count:void 0===e.count?d.length:e.count,isTopEnd:d.length&&(t[0]&&t[0]===d[0]||this.getDialogIndex(d[0],f){const t={},a=[];for(const[e,n]of s.getTopicPromises)t[e]=n,a.push((0,oe.Z)(e));s.getTopicPromises.clear();const n=()=>{for(const e in t)t[e].resolve(void 0),s.deletedTopics.add(+e)};if(this.getForumTopicsCache(e)===s)return this.apiManager.invokeApi("channels.getForumTopicsByID",{channel:this.appChatsManager.getChannelInput(e.toChatId()),topics:a}).then((a=>{if(this.getForumTopicsCache(e)===s)return this.applyDialogs(a,e),a.topics.forEach((a=>{"forumTopic"===a._&&(t[a.id].resolve(a),delete t[e])})),a}),(()=>{})).then((()=>{n(),s.getTopicsPromise=void 0,s.getTopicPromises.size&&this.getForumTopicById(e)}));n()}))),n||s.getTopicsPromise}getForumTopic(e,t){var a;const s=this.forumTopics.get(e);return null===(a=null==s?void 0:s.topics)||void 0===a?void 0:a.get(t)}getForumTopicOrReload(e,t){var a;const s=this.getForumTopic(e,t);if(s)return s;const n=this.getForumTopicsCache(e);return(null===(a=null==n?void 0:n.deletedTopics)||void 0===a?void 0:a.has(t))?void 0:this.getForumTopicById(e,t)}processTopics(e,t){return(0,q.Z)(t,(t=>{"pts"in t&&this.apiUpdatesManager.addChannelState(e.toChatId(),t.pts);const a=this.appPeersManager.getOutputPeer(e);return t.topics=t.topics.map((e=>{if("forumTopicDeleted"!==e._)return e.peer=a,e.id=(0,pe.Z)(e.id),e})).filter(Boolean),t}))}processTopicsPromise(e,t){return t.then((t=>(this.processTopics(e,t),t)))}getForumUnreadCount(e){if(!this.appPeersManager.isForum(e))return;const t=this.getFolder(e),a=t.dialogs.length>=20||this.isDialogsLoaded(e)?t.dialogs.slice(0,20):(0,q.Z)(this.getDialogs({filterId:e,limit:20}),(e=>e.dialogs));return(0,q.Z)(a,(e=>({count:e.reduce(((e,t)=>e+ +!!t.unread_count),0),hasUnmuted:e.some((e=>e.unread_count&&this.isDialogUnmuted(e)))})))}handleDialogTogglePinned(e,t,a){e&&(t?e.pFlags.pinned=!0:this.handleDialogUnpinning(e,a),this.generateIndexForDialog(e)),this.appMessagesManager.scheduleHandleNewDialogs(e.peerId,e)}handleDialogsPinned(e,t){const a=this.isFilterIdForForum(e);this.resetPinnedOrder(e),this.getPinnedOrders(e).push(...t),this.savePinnedOrders(),t.reverse();const s={};t.forEach((t=>{s[t]=!0;const n=a?e:t,i=a?t:void 0,r=this.getDialogOrTopic(n,i);this.appMessagesManager.scheduleHandleNewDialogs(n,r),r&&(r.pFlags.pinned=!0,this.generateIndexForDialog(r))}));const n=this.getFolderDialogs(e,!1);for(const e of n){if(!e.pFlags.pinned)break;s[this.getDialogKey(e)]||(delete e.pFlags.pinned,this.generateIndexForDialog(e),this.appMessagesManager.scheduleHandleNewDialogs(e.peerId,e))}}}var ve=a(8479),Pe=a(4064),be=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Me=[["pinned_peers","pinnedPeerIds"],["exclude_peers","excludePeerIds"],["include_peers","includePeerIds"]],Ie=o.DZ.size,Se={_:"dialogFilter",pFlags:{},flags:0,id:0,title:"",exclude_peers:[],include_peers:[],pinned_peers:[],excludePeerIds:[],includePeerIds:[],pinnedPeerIds:[]};class Ce extends G{constructor(){super(...arguments),this.clear=e=>{if(e){this.filters={},this.filtersArr=[],this.reloadedPeerIds=new Set,this.localFilters={};for(const e of o.DZ)this.localFilters[e]=this.generateLocalFilter(e)}else this.reloadedPeerIds.clear(),this.clearFilters();this.localId=o.Gu},this.onUpdateDialogFilter=e=>{e.filter?this.saveDialogFilter(e.filter):this.filters[e.id]&&(this.rootScope.dispatchEvent("filter_delete",this.filters[e.id]),delete this.filters[e.id],(0,Pe.Z)(this.filtersArr,(t=>t.id===e.id))),this.pushToState()},this.onUpdateDialogFilters=e=>{const t=(0,ve.Z)(this.filters);this.getDialogFilters(!0).then((e=>{for(const a in t){const t=+a;e.find((e=>e.id===t))||this.onUpdateDialogFilter({_:"updateDialogFilter",id:t})}this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:e.map((e=>e.id))})}))},this.onUpdateDialogFilterOrder=e=>{const t=e.order.slice();t.includes(o.Zi)||t.splice(t[0]===o.J$?1:0,0,o.Zi),this.localId=o.Gu,t.forEach((e=>{const t=this.filters[e];delete t.localId,this.setLocalId(t)})),this.rootScope.dispatchEvent("filter_order",t),this.pushToState()}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateDialogFilter:this.onUpdateDialogFilter,updateDialogFilters:this.onUpdateDialogFilters,updateDialogFilterOrder:this.onUpdateDialogFilterOrder}),this.rootScope.addEventListener("premium_toggle",(()=>{this.onUpdateDialogFilters({_:"updateDialogFilters"})})),this.appStateManager.getState().then((e=>{this.prependFilters(e.filtersArr).map((e=>{this.saveDialogFilter(e,!1,!0)}))}))}prependFilters(e){e=e.slice();const t=this.localFilters[o.J$],a=this.localFilters[o.Zi],s=e.findIndex((e=>"dialogFilterDefault"===e._||e.id===o.J$));return-1!==s?e[s]=t:e.unshift(t),(0,Pe.Z)(e,(e=>e.id===o.Zi)),e.splice(e[0]===t?1:0,0,a),this.localId=o.Gu,e.forEach((e=>{delete e.localId})),e}generateLocalFilter(e){const t=Object.assign(Object.assign({},(0,ve.Z)(Se)),{id:e});return e===o.J$?t.pFlags.exclude_archived=!0:e===o.Zi&&(t.pFlags.exclude_unarchived=!0),o.DZ.has(e)&&(t.pinnedPeerIds=this.dialogsStorage.getPinnedOrders(e)),t}pushToState(){this.appStateManager.pushToState("filtersArr",this.filtersArr)}testDialogForFilter(e,t){if(!t)return!0;if(o.DZ.has(t.id))return e.folder_id===t.id&&this.dialogsStorage.canSaveDialogByPeerId(e.peerId);const a=e.peerId;if(!this.appMessagesManager.getDialogOnly(a))return!1;if(t.excludePeerIds.includes(a))return!1;if(t.includePeerIds.includes(a))return!0;const s=t.pFlags;if(s.exclude_archived&&e.folder_id===o.Zi)return!1;if(s.exclude_read&&!this.appMessagesManager.isDialogUnread(e))return!1;if(s.exclude_muted&&this.appNotificationsManager.isPeerLocalMuted({peerId:a})&&(!e.unread_mentions_count||!e.unread_count))return!1;if(this.appPeersManager.isAnyChat(a)){if(s.broadcasts&&this.appPeersManager.isBroadcast(a))return!0;if(s.groups&&this.appPeersManager.isAnyGroup(a))return!0}else{const e=a.toUserId();if(this.appUsersManager.isBot(e))return!!s.bots;if(s.non_contacts&&!this.appUsersManager.isContact(e))return!0;if(s.contacts&&this.appUsersManager.isContact(e))return!0}return!1}testDialogForFilterId(e,t){return this.testDialogForFilter(e,this.filters[t])}getFilter(e){return this.filters[e]}getFilters(){return this.filters}clearFilters(){const e=this.getFilters();for(const t in e)o.DZ.has(+t)||this.onUpdateDialogFilter({_:"updateDialogFilter",id:+t})}toggleDialogPin(e,t){return be(this,void 0,void 0,(function*(){const a=this.filters[t],s=a.pinnedPeerIds.indexOf(e),n=-1!==s;if(n&&(a.pinned_peers.splice(s,1),a.pinnedPeerIds.splice(s,1)),!n){if(a.pinned_peers.length>=(yield this.apiManager.getConfig()).pinned_infolder_count_max)return Promise.reject((0,X.Z)("PINNED_DIALOGS_TOO_MUCH"));a.pinned_peers.unshift(this.appPeersManager.getInputPeerById(e)),a.pinnedPeerIds.unshift(e)}return this.updateDialogFilter(a)}))}createDialogFilter(e,t){const a=Math.max(1,...Object.keys(this.filters).map((e=>+e)));return(e=(0,ve.Z)(e)).id=a+1,this.updateDialogFilter(e,void 0,t)}updateDialogFilter(e,t=!1,a=!1){const s=t?0:1;return this.apiManager.invokeApi("messages.updateDialogFilter",{flags:s,id:e.id,filter:t?void 0:this.getOutputDialogFilter(e)}).then((s=>{if(s&&(this.onUpdateDialogFilter({_:"updateDialogFilter",id:e.id,filter:t?void 0:e}),a)){const t=[];for(const e in this.filters){const a=this.filters[e];++a.localId,t.push(a)}e.localId=o.Gu;const a=t.sort(((e,t)=>e.localId-t.localId)).map((e=>e.id));this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:a})}return s}))}updateDialogFiltersOrder(e){return this.apiManager.invokeApi("messages.updateDialogFiltersOrder",{order:e}).then((()=>{this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:e})}))}getOutputDialogFilter(e){const t=(0,ve.Z)(e);return this.filterIncludedPinnedPeers(e),t}filterIncludedPinnedPeers(e){(0,ne.Z)(e.includePeerIds,((t,a)=>{e.pinnedPeerIds.includes(t)&&(e.include_peers.splice(a,1),e.includePeerIds.splice(a,1))}))}reloadMissingPeerIds(e,t="pinned_peers"){const a=this.getFilter(e),s=null==a?void 0:a[t];if(!(null==s?void 0:s.length))return;const n=s.filter((e=>{const t=this.appPeersManager.getPeerId(e),a=this.reloadedPeerIds.has(t),s=this.appMessagesManager.getDialogOnly(t);return!a&&!s}));if(!n.length)return;const i=n.map((e=>{const t=this.appPeersManager.getPeerId(e);return this.appMessagesManager.reloadConversation(e).then((e=>(this.reloadedPeerIds.add(t),e?void 0:t)))}));return Promise.all(i).then((e=>{(e=e.filter(Boolean)).length}))}getDialogFilters(e=!1){return be(this,void 0,void 0,(function*(){const t=Object.keys(this.filters);if(t.length>Ie&&!e)return t.map((e=>this.filters[e])).sort(((e,t)=>e.localId-t.localId));const a=yield this.apiManager.invokeApiSingle("messages.getDialogFilters");return this.prependFilters(a).map((t=>this.saveDialogFilter(t,e))).filter(Boolean)}))}getSuggestedDialogsFilters(){return this.apiManager.invokeApi("messages.getSuggestedDialogFilters")}saveDialogFilter(e,t=!0,a){"dialogFilterDefault"===e._&&(e=this.localFilters[o.J$]),(0,ue.Z)(e),o.DZ.has(e.id)||(Me.forEach((([t,a])=>{(0,ue.Z)(e),e[a]=e[t].map((e=>this.appPeersManager.getPeerId(e)))})),this.filterIncludedPinnedPeers(e),e.include_peers=e.pinned_peers.concat(e.include_peers),e.includePeerIds=e.pinnedPeerIds.concat(e.includePeerIds));const s=this.filters[e.id];return s?Object.assign(s,e):this.filters[e.id]=e,this.setLocalId(e),a||(t?this.rootScope.dispatchEvent("filter_update",e):s||this.rootScope.dispatchEvent("filter_new",e)),e}setLocalId(e){void 0!==e.localId?e.localId>=this.localId&&(this.localId=e.localId+1):(e.localId=this.localId++,(0,Pe.Z)(this.filtersArr,(t=>t.id===e.id)),this.filtersArr.push(e),this.pushToState())}isFilterIdAvailable(e){return be(this,void 0,void 0,(function*(){if(o.DZ.has(e))return!0;const t=yield this.apiManager.getLimit("folders");return this.filtersArr.filter((e=>!o.DZ.has(e.id))).slice(0,t).some((t=>t.id===e))}))}}var we=a(6690),ke=a(2821);function Ae(e,t){t.forEach((t=>{Object.getOwnPropertyNames(t.prototype).forEach((a=>{const s=Object.getOwnPropertyDescriptor(t.prototype,a)||Object.create(null);"constructor"!==a&&Object.defineProperty(e.prototype,a,s)}))}))}class De{constructor(){this.updatesState={pendingPtsUpdates:[],pendingSeqUpdates:{},syncPending:null,syncLoading:null},this.channelStates={},this.attached=!1,this.log=(0,I.kg)("UPDATES",I.v9.Error|I.v9.Warn|I.v9.Log),this.debug=d.ZP,this.subscriptions={},this.processUpdateMessage=(e,t={})=>{const a={date:e.date,seq:e.seq,seqStart:e.seq_start};switch(this.debug&&this.log.debug("processUpdateMessage",e),e._){case"updatesTooLong":case"new_session_created":this.forceGetDifference();break;case"updateShort":this.processUpdate(e.update,a);break;case"updateShortMessage":case"updateShortChatMessage":{(0,ue.Z)(e),this.debug&&this.log.debug("updateShortMessage | updateShortChatMessage",Object.assign({},e));const t=e.pFlags.out,s=e.from_id||(t?this.appPeersManager.peerId:e.user_id),n=e.chat_id?e.chat_id.toPeerId(!0):e.user_id.toPeerId(!1)||this.appPeersManager.peerId;this.processUpdate({_:"updateNewMessage",message:{_:"message",pFlags:e.pFlags,id:e.id,from_id:this.appPeersManager.getOutputPeer(s.toPeerId()),peer_id:this.appPeersManager.getOutputPeer(n),date:e.date,message:e.message,fwd_from:e.fwd_from,reply_to:e.reply_to,entities:e.entities},pts:e.pts,pts_count:e.pts_count},a);break}case"updatesCombined":case"updates":this.appUsersManager.saveApiUsers(e.users,t.override),this.appChatsManager.saveApiChats(e.chats,t.override),e.updates.forEach((e=>{this.processUpdate(e,a)}));break;default:this.log.warn("Unknown update message",e)}},this._constructor(!1)}setProxy(){const e=this;this.updatesState=new Proxy(this.updatesState,{set:function(t,a,s){return t[a]=s,e.saveUpdatesState(),!0}})}saveUpdatesState(){const e=this.updatesState;this.appStateManager.pushToState("updates",{seq:e.seq,pts:e.pts,date:e.date})}popPendingSeqUpdate(){var e;const t=this.updatesState,a=t.seq+1,s=t.pendingSeqUpdates[a];if(!s)return!1;const n=s.updates;for(let e=0,t=n.length;e=t.syncPending.seqAwaiting&&(t.syncPending.ptsAwaiting?delete t.syncPending.seqAwaiting:this.clearStatePendingSync(t)),!0}popPendingPtsUpdate(e){const t=e?this.getChannelState(e):this.updatesState;if(!t.pendingPtsUpdates.length)return!1;t.pendingPtsUpdates.sort(((e,t)=>e.pts-t.pts));let a=t.pts,s=0,n=0;for(let e=0,i=t.pendingPtsUpdates.length;e=i.pts&&(s=i.pts,n=e)}if(!s)return!1;this.debug&&this.log.debug("pop pending pts updates",s,t.pendingPtsUpdates.slice(0,n+1)),t.pts=s;for(let e=0;e<=n;++e){const a=t.pendingPtsUpdates[e];this.saveUpdate(a)}return t.pendingPtsUpdates.splice(0,n+1),!t.pendingPtsUpdates.length&&t.syncPending&&(t.syncPending.seqAwaiting?delete t.syncPending.ptsAwaiting:this.clearStatePendingSync(t)),!0}forceGetDifference(){this.updatesState.syncLoading||this.getDifference()}processLocalUpdate(e){this.processUpdateMessage({_:"updateShort",update:e})}getDifference(e=!1){const t=this.updatesState,a=t.syncLoading;a||(t.pendingSeqUpdates={},t.pendingPtsUpdates=[]),this.clearStatePendingSync(t);const s=this.apiManager.invokeApi("updates.getDifference",{pts:t.pts,pts_total_limit:e?1200:void 0,date:t.date,qts:-1},{timeout:2147483647}).then((a=>{if(this.debug&&this.log.debug("Get diff result",a),"updates.differenceEmpty"===a._)return this.debug&&this.log.debug("apply empty diff",a.seq),t.date=a.date,void(t.seq=a.seq);if(e&&this.rootScope.dispatchEvent("state_synchronizing"),"updates.differenceTooLong"!==a._){this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),a.other_updates.forEach((e=>{switch(e._){case"updateChannelTooLong":case"updateNewChannelMessage":case"updateEditChannelMessage":return void this.processUpdate(e)}this.saveUpdate(e)})),a.new_messages.forEach((e=>{this.saveUpdate({_:"updateNewMessage",message:e,pts:t.pts,pts_count:0})}));const e="updates.difference"===a._?a.state:a.intermediate_state;t.seq=e.seq,t.pts=e.pts,t.date=e.date}else t.pts=a.pts,t.date=(Date.now()/1e3|0)+this.timeManager.getServerTimeOffset(),delete t.seq,this.channelStates={},this.log.warn("getDifference:",a._),this.onDifferenceTooLong();if("updates.differenceSlice"===a._)return this.getDifference();this.debug&&this.log.debug("finished get diff")}));return a||this.justAName(t,s),s}clearStatePendingSync(e){e.syncPending&&(clearTimeout(e.syncPending.timeout),e.syncPending=null)}getChannelDifference(e){const t=this.getChannelState(e),a=t.syncLoading;a||(t.pendingPtsUpdates=[]),this.clearStatePendingSync(t);const s=this.debug?this.log.bindPrefix("getChannelDifference-"+e):void 0,n=this.apiManager.invokeApi("updates.getChannelDifference",{channel:this.appChatsManager.getChannelInput(e),filter:{_:"channelMessagesFilterEmpty"},pts:t.pts,limit:1e3},{timeout:2147483647}).then((a=>{if(null==s||s.debug("diff result",a),t.pts="pts"in a?a.pts:void 0,t.lastDifferenceTime=Date.now(),"updates.channelDifferenceEmpty"!==a._){if("updates.channelDifferenceTooLong"===a._)return delete this.channelStates[e],void this.saveUpdate({_:"updateChannelReload",channel_id:e});if(this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),null==s||s.debug("applying",a.other_updates.length,"channel other updates"),a.other_updates.forEach((e=>{this.saveUpdate(e)})),null==s||s.debug("applying",a.new_messages.length,"channel new messages"),a.new_messages.forEach((e=>{this.saveUpdate({_:"updateNewChannelMessage",message:e,pts:t.pts,pts_count:0})})),null==s||s.debug("apply channel diff",t.pts),"updates.channelDifference"===a._&&!a.pFlags.final)return this.getChannelDifference(e);null==s||s.debug("finished channel get diff")}}));return a||this.justAName(t,n,e),n}onDifferenceTooLong(){this.appUsersManager.clear(),this.appChatsManager.clear(),this.appMessagesManager.clear(),this.rootScope.dispatchEvent("state_cleared")}justAName(e,t,a){e.syncLoading=t,this.rootScope.dispatchEvent("state_synchronizing",a),t.then((()=>{e.syncLoading=null,this.rootScope.dispatchEvent("state_synchronized",a)}),(()=>{e.syncLoading=null}))}addChannelState(e,t){var a,s;if(!t)throw new Error("Add channel state without pts "+e);return null!==(a=(s=this.channelStates)[e])&&void 0!==a?a:s[e]={pts:t,pendingPtsUpdates:[],syncPending:null,syncLoading:null}}getChannelState(e,t){return void 0===this.channelStates[e]&&this.addChannelState(e,t),this.channelStates[e]}processUpdate(e,t={}){var a,s,n,i;let r;switch(e._){case"updateNewChannelMessage":case"updateEditChannelMessage":r=this.appPeersManager.getPeerId(e.message.peer_id).toChatId();break;case"updateChannelTooLong":if(r=e.channel_id,!(r in this.channelStates))return!1;break;default:"channel_id"in e&&"pts"in e&&(r=e.channel_id)}const{pts:o,pts_count:p}=e,d=r?this.getChannelState(r,o):this.updatesState;if(d.syncLoading)return!1;if("updateChannelTooLong"===e._)return(!d.lastPtsUpdateTime||d.lastPtsUpdateTime{d.syncPending=null,d.syncLoading||(r?this.getChannelDifference(r):this.getDifference())}),6)}),d.syncPending.ptsAwaiting=!0,!1;if(o>d.pts)d.pts=o,f=!0,d.lastPtsUpdateTime=Date.now();else if(p)return!1;r&&t.date&&this.updatesState.date0){const a=t.seq,r=t.seqStart||a;if(r!==d.seq+1&&r>d.seq)return this.debug&&this.log.warn("Seq hole",d,null===(s=d.syncPending)||void 0===s?void 0:s.seqAwaiting),null!==(n=(i=d.pendingSeqUpdates)[r])&&void 0!==n||(i[r]={seq:a,date:t.date,updates:[]}),d.pendingSeqUpdates[r].updates.push(e),d.syncPending||(d.syncPending={timeout:E.Z.setTimeout((()=>{d.syncPending=null,d.syncLoading||this.getDifference()}),6)}),(!d.syncPending.seqAwaiting||d.syncPending.seqAwaiting{const t=this.getChannelState(e);t.syncLoading||t.lastDifferenceTime&&!(Date.now()-t.lastDifferenceTime>2500)||this.getChannelDifference(e)};null!==(a=n.interval)&&void 0!==a||(n.interval=E.Z.setInterval(i,3e3)),i()}unsubscribeFromChannelUpdates(e,t){const a=this.subscriptions[e];!(null==a?void 0:a.interval)||--a.count&&!t||(clearInterval(a.interval),a.interval=void 0,delete this.subscriptions[e])}attach(e){this.attached||(this.log("attach"),this.attached=!0,this.appStateManager.getState().then((({updates:t})=>{const a=this.appStateManager.newVersion;t&&t.pts&&t.date?(Object.assign(this.updatesState,t),this.log("will get difference",Object.assign({},t)),this.getDifference(!0)):(this.log("will get new state"),this.updatesState.syncLoading=new Promise((e=>{this.apiManager.invokeApi("updates.getState",{},{noErrorBox:!0}).then((t=>{this.updatesState.seq=t.seq,this.updatesState.pts=t.pts,this.updatesState.date=t.date,this.saveUpdatesState(),this.updatesState.syncLoading=null,e()}))}))),this.apiManager.setUpdatesProcessor(this.processUpdateMessage),this.setProxy(),a&&this.updatesState.syncLoading.then((()=>{return t=this,s=void 0,i=function*(){const t={en:"was updated to version",ru:"обновлён до версии"},s=e=>{fetch(`changelogs/${e}_${a.split(" ")[0]}.md`).then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((s=>{const n=t[e]||t.en;s=`**Telegram Web${_.Z.suffix} ${n} ${a}**\n\n`+s;const i=[],r={_:"updateServiceNotification",entities:i,message:(0,ke.Z)(s,i),type:"local",pFlags:{},inbox_date:Date.now()/1e3|0,media:void 0};this.processLocalUpdate(r)}))},n=(0,we.Z)([e,"en"]);for(const e of n)try{yield s(e);break}catch(e){}},new((n=void 0)||(n=Promise))((function(e,a){function r(e){try{p(i.next(e))}catch(e){a(e)}}function o(e){try{p(i.throw(e))}catch(e){a(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof n?a:new n((function(e){e(a)}))).then(r,o)}p((i=i.apply(t,s||[])).next())}));var t,s,n,i}))})))}}Ae(De,[p.Z,G]);class Ue extends G{constructor(){super(...arguments),this.savedAvatarURLs={}}after(){this.rootScope.addEventListener("avatar_update",(({peerId:e,threadId:t})=>{t||this.removeFromAvatarsCache(e)}))}isAvatarCached(e,t){const a=this.savedAvatarURLs[e];return void 0===t?!!a:!(!a||!a[t]||a[t]instanceof Promise)}removeFromAvatarsCache(e){this.savedAvatarURLs[e]&&delete this.savedAvatarURLs[e]}loadAvatar(e,t,a){var s,n;const i=null!==(s=(n=this.savedAvatarURLs)[e])&&void 0!==s?s:n[e]={};if(i[a])return i[a];{const s={_:"inputPeerPhotoFileLocation",pFlags:{},peer:this.appPeersManager.getInputPeerById(e),photo_id:t.photo_id},n={dcId:t.dc_id,location:s};"photo_big"===a&&(s.pFlags.big=!0,n.limitPart=524288);const r=this.apiFileManager.download(n);return i[a]=r.then((e=>i[a]=URL.createObjectURL(e)))}}}var Te=a(144),Ee=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class Fe extends G{after(){this.calls=new Map,i().IS_CALL_SUPPORTED&&this.apiUpdatesManager.addMultipleEventsListeners({updatePhoneCall:e=>{this.saveCall(e.phone_call)},updatePhoneCallSignalingData:e=>{this.rootScope.dispatchEvent("call_signaling",{callId:e.phone_call_id,data:e.data})}})}computeKey(e,t,a){return this.cryptoWorker.invokeCrypto("compute-dh-key",e,t,a)}saveCall(e){const t="phoneCallDiscarded"===e._,a=this.calls.get(e.id);return a?(re(a,e),t&&this.calls.delete(e.id),e=a):t||this.calls.set(e.id,e),this.rootScope.dispatchEvent("call_update",e),e}getCall(e){return this.calls.get(e)}getCallInput(e){const t=this.getCall(e);return{_:"inputPhoneCall",id:t.id,access_hash:t.access_hash}}savePhonePhoneCall(e){return this.appUsersManager.saveApiUsers(e.users),this.saveCall(e.phone_call)}generateDh(){return this.apiManager.invokeApi("messages.getDhConfig",{version:0,random_length:256}).then((e=>this.cryptoWorker.invokeCrypto("generate-dh",e)))}requestCall(e,t,a,s){return Ee(this,void 0,void 0,(function*(){const n=yield this.apiManager.invokeApi("phone.requestCall",{user_id:this.appUsersManager.getUserInput(e),protocol:t,video:s,random_id:(0,Te.d)(32),g_a_hash:a});return this.savePhonePhoneCall(n)}))}discardCall(e,t,a,s){return Ee(this,void 0,void 0,(function*(){if(!this.getCall(e))return;const n=yield this.apiManager.invokeApi("phone.discardCall",{video:s,peer:this.getCallInput(e),duration:t,reason:{_:a},connection_id:"0"});this.apiUpdatesManager.processUpdateMessage(n)}))}}var Re=a(7120),xe=a(2566);class Be extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e)this.chats={};else for(const e in this.chats)if(e&&!this.peersStorage.isPeerNeeded(e.toPeerId(!0))){const t=this.chats[e];this.appUsersManager.modifyUsernamesCache(t,!1),this.storage.delete(e),delete this.chats[e]}},this.onChatUpdated=(e,t)=>{var a;this.apiUpdatesManager.processUpdateMessage(t),(null===(a=null==t?void 0:t.updates)||void 0===a?void 0:a.length)&&this.isChannel(e)&&this.rootScope.dispatchEvent("invalidate_participants",e)}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateChannelParticipant:e=>{this.apiManager.clearCache("channels.getParticipants",(t=>t.channel.channel_id===e.channel_id))},updateChatDefaultBannedRights:e=>{const t=this.appPeersManager.getPeerId(e.peer).toChatId(),a=this.chats[t];a&&(a.default_banned_rights=e.default_banned_rights,this.rootScope.dispatchEvent("chat_update",t))}}),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("chats")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.saveApiChats(t),this.peersStorage.addEventListener("peerNeeded",(e=>{e.isUser()||this.storage.getFromCache(e.toChatId())||this.storage.set({[e.toChatId()]:this.getChat(e.toChatId())})})),this.peersStorage.addEventListener("peerUnneeded",(e=>{!e.isUser()&&this.storage.getFromCache(e.toChatId())&&this.storage.delete(e.toChatId())}))}))}saveApiChats(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiChat(e,t))))}saveApiChat(e,t){var a,s,n,i,r;if(!e||"chatEmpty"===e._)return;const o=this.chats[e.id];if(null!==(a=(r=e).pFlags)&&void 0!==a||(r.pFlags={}),e.pFlags.min&&void 0!==o)return;"channel"===e._&&void 0===e.participants_count&&void 0!==o&&o.participants_count&&(e.participants_count=o.participants_count),"chatPhotoEmpty"===(null===(s=e.photo)||void 0===s?void 0:s._)&&delete e.photo;const p=this.appUsersManager.setUsernameToCache(e,o),d=e.id.toPeerId(!0);if(void 0===o)this.chats[e.id]=e;else{const t=null===(n=o.photo)||void 0===n?void 0:n.photo_id,a=null===(i=e.photo)||void 0===i?void 0:i.photo_id,s=o.pFlags.forum!==e.pFlags.forum,r=t!==a||s,f=o.title!==e.title||p,c=o.pFlags.verified!==e.pFlags.verified||o.pFlags.scam!==e.pFlags.scam||o.pFlags.fake!==e.pFlags.fake;re(o,e),this.rootScope.dispatchEvent("chat_update",e.id),r&&this.rootScope.dispatchEvent("avatar_update",{peerId:d}),(f||c)&&this.rootScope.dispatchEvent("peer_title_edit",{peerId:d}),s&&this.rootScope.dispatchEvent("chat_toggle_forum",{chatId:e.id,enabled:!!e.pFlags.forum})}this.peersStorage.isPeerNeeded(d)&&this.storage.set({[e.id]:e})}getChat(e){return this.chats[e]}hasRights(e,t,a,s){return(0,Re.Z)(this.getChat(e),t,a,s)}editChatDefaultBannedRights(e,t){const a=this.getChat(e);return a.default_banned_rights&&a.default_banned_rights.until_date===t.until_date&&(0,Y.Z)(a.default_banned_rights.pFlags,t.pFlags)?Promise.resolve():this.apiManager.invokeApi("messages.editChatDefaultBannedRights",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0)),banned_rights:t}).then(this.onChatUpdated.bind(this,e))}isChannel(e){const t=this.chats[e];return!(!t||"channel"!==t._&&"channelForbidden"!==t._)}isMegagroup(e){var t;const a=this.chats[e];return!!(null===(t=null==a?void 0:a.pFlags)||void 0===t?void 0:t.megagroup)}isForum(e){var t;const a=this.chats[e];return!!(null===(t=null==a?void 0:a.pFlags)||void 0===t?void 0:t.forum)}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isInChat(e){let t=!0;const a=this.getChat(e);return(!a||"channelForbidden"===a._||"chatForbidden"===a._||"chatEmpty"===a._||a.pFlags.left||a.pFlags.deactivated)&&(t=!1),t}getChannelInput(e){const t=this.getChat(e);return t&&t.access_hash?{_:"inputChannel",channel_id:e,access_hash:t.access_hash||"0"}:{_:"inputChannelEmpty"}}getInputPeer(e){return this.isChannel(e)?this.getChannelInputPeer(e):this.getChatInputPeer(e)}getChatInputPeer(e){return{_:"inputPeerChat",chat_id:e}}getChannelInputPeer(e){return{_:"inputPeerChannel",channel_id:e,access_hash:this.getChat(e).access_hash||0}}hasChat(e,t){const a=this.chats[e];return(0,fe.Z)(a)&&(t||!a.pFlags.min)}getChatString(e){const t=this.getChat(e);return this.isChannel(e)?(this.isMegagroup(e)?"s":"c")+e+"_"+t.access_hash:"g"+e}createChannel(e){return this.apiManager.invokeApi("channels.createChannel",e).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}inviteToChannel(e,t){const a=this.getChannelInput(e),s=t.map((e=>this.appUsersManager.getUserInput(e)));return this.apiManager.invokeApi("channels.inviteToChannel",{channel:a,users:s}).then(this.onChatUpdated.bind(this,e))}createChat(e,t){return this.apiManager.invokeApi("messages.createChat",{users:t.map((e=>this.appUsersManager.getUserInput(e))),title:e}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}leaveChannel(e){return this.apiManager.invokeApi("channels.leaveChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}joinChannel(e){return this.apiManager.invokeApi("channels.joinChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}addChatUser(e,t,a=100){return this.apiManager.invokeApi("messages.addChatUser",{chat_id:e,user_id:this.appUsersManager.getUserInput(t),fwd_limit:a}).then(this.onChatUpdated.bind(this,e))}deleteChatUser(e,t){return this.apiManager.invokeApi("messages.deleteChatUser",{chat_id:e,user_id:this.appUsersManager.getUserInput(t)}).then(this.onChatUpdated.bind(this,e))}leaveChat(e){return this.deleteChatUser(e,this.appUsersManager.getSelf().id)}leave(e){return this.isChannel(e)?this.leaveChannel(e):this.leaveChat(e)}delete(e){return this.isChannel(e)?this.deleteChannel(e):this.deleteChat(e)}deleteChannel(e){return this.apiManager.invokeApi("channels.deleteChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}deleteChat(e){return this.apiManager.invokeApi("messages.deleteChat",{chat_id:e})}migrateChat(e){const t=this.getChat(e);return"channel"===t._?Promise.resolve(t.id):this.apiManager.invokeApi("messages.migrateChat",{chat_id:e}).then((t=>(this.onChatUpdated(e,t),t.updates.find((e=>"updateChannel"===e._)).channel_id)))}updateUsername(e,t,a){const s=this.apiManager.invokeApi("channels.updateUsername",{channel:this.getChannelInput(e),username:t});return this.refreshChatAfterRequest(e,s,a)}editPhoto(e,t){const a={_:"inputChatUploadedPhoto",file:t};let s;return s=this.isChannel(e)?this.apiManager.invokeApi("channels.editPhoto",{channel:this.getChannelInput(e),photo:a}):this.apiManager.invokeApi("messages.editChatPhoto",{chat_id:e,photo:a}),s.then(this.onChatUpdated.bind(this,e))}editTitle(e,t){let a;return a=this.isChannel(e)?this.apiManager.invokeApi("channels.editTitle",{channel:this.getChannelInput(e),title:t}):this.apiManager.invokeApi("messages.editChatTitle",{chat_id:e,title:t}),a.then(this.onChatUpdated.bind(this,e))}editAbout(e,t){const a=e.toPeerId(!0);return this.apiManager.invokeApi("messages.editChatAbout",{peer:this.appPeersManager.getInputPeerById(a),about:t}).then((e=>(e&&this.rootScope.dispatchEvent("peer_bio_edit",a),e)))}editBanned(e,t,a){const s="object"!=typeof t?t:(0,xe.Z)(t);return this.apiManager.invokeApi("channels.editBanned",{channel:this.getChannelInput(e),participant:this.appPeersManager.getInputPeerById(s),banned_rights:a}).then((n=>{if(this.onChatUpdated(e,n),"object"==typeof t){const n=Date.now()/1e3|0;this.apiUpdatesManager.processLocalUpdate({_:"updateChannelParticipant",channel_id:e,date:n,actor_id:void 0,qts:void 0,user_id:s,prev_participant:t,new_participant:Object.keys(a.pFlags).length?{_:"channelParticipantBanned",date:n,banned_rights:a,kicked_by:this.appUsersManager.getSelf().id,peer:this.appPeersManager.getOutputPeer(s),pFlags:{}}:void 0})}}))}clearChannelParticipantBannedRights(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{}})}kickFromChannel(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{view_messages:!0}})}kickFromChat(e,t){return this.isChannel(e)?this.kickFromChannel(e,t):this.deleteChatUser(e,t.toUserId())}resolveChannel(e){return this.apiManager.invokeApiSingle("channels.getChannels",{id:[{_:"inputChannel",channel_id:e,access_hash:"0"}]}).then((e=>{this.saveApiChats(e.chats)}))}togglePreHistoryHidden(e,t){return this.migrateChat(e).then((e=>this.apiManager.invokeApi("channels.togglePreHistoryHidden",{channel:this.getChannelInput(e),enabled:t}).then(this.onChatUpdated.bind(this,e))))}toggleSignatures(e,t){return this.apiManager.invokeApi("channels.toggleSignatures",{channel:this.getChannelInput(e),enabled:t}).then(this.onChatUpdated.bind(this,e))}toggleNoForwards(e,t){return this.apiManager.invokeApi("messages.toggleNoForwards",{peer:this.getInputPeer(e),enabled:t}).then(this.onChatUpdated.bind(this,e))}setChatAvailableReactions(e,t){const a=this.appProfileManager.getCachedFullChat(e);return a&&(a.available_reactions=t,this.rootScope.dispatchEvent("chat_full_update",e)),this.apiManager.invokeApi("messages.setChatAvailableReactions",{peer:this.getInputPeer(e),available_reactions:t}).then(this.onChatUpdated.bind(this,e))}getSendAs(e){return this.apiManager.invokeApiSingleProcess({method:"channels.getSendAs",params:{peer:this.getChannelInputPeer(e)},processResult:e=>(this.appUsersManager.saveApiUsers(e.users),this.saveApiChats(e.chats),e.peers)})}importChatInvite(e){return this.apiManager.invokeApi("messages.importChatInvite",{hash:e}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}checkUsername(e,t){return this.apiManager.invokeApi("channels.checkUsername",{channel:this.getChannelInput(e),username:t})}getSponsoredMessage(e){return this.apiManager.invokeApiCacheable("channels.getSponsoredMessages",{channel:this.getChannelInput(e)},{cacheSeconds:300}).then((e=>{if("messages.sponsoredMessages"===e._){this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const t=e.messages.shift();e.messages.push(t)}return e}))}viewSponsoredMessage(e,t){return this.apiManager.invokeApiSingle("channels.viewSponsoredMessage",{channel:this.getChannelInput(e),random_id:t})}checkChatInvite(e){return this.apiManager.invokeApi("messages.checkChatInvite",{hash:e}).then((e=>(e.chat&&this.saveApiChat(e.chat,!0),e)))}toggleUsername(e,t,a){const s=this.apiManager.invokeApi("channels.toggleUsername",{channel:this.getChannelInput(e),username:t,active:a});return this.refreshChatAfterRequest(e,s)}reorderUsernames(e,t){const a=this.apiManager.invokeApi("channels.reorderUsernames",{channel:this.getChannelInput(e),order:t});return this.refreshChatAfterRequest(e,a)}deactivateAllUsernames(e,t){const a=this.apiManager.invokeApi("channels.deactivateAllUsernames",{channel:this.getChannelInput(e)});return this.refreshChatAfterRequest(e,a,t)}makeChannelPrivate(e){const t=[this.updateUsername(e,"",!0),this.deactivateAllUsernames(e,!0)],a=Promise.all(t).then((()=>!0));return this.refreshChatAfterRequest(e,a)}refreshChatAfterRequest(e,t,a){return a?t:t.then((t=>this.getChannels([e]).then((()=>t))))}getChannels(e){return this.apiManager.invokeApi("channels.getChannels",{id:e.map((e=>this.getChannelInput(e)))}).then((e=>{this.saveApiChats(e.chats)}))}toggleForum(e,t){return this.migrateChat(e).then((e=>this.apiManager.invokeApi("channels.toggleForum",{channel:this.getChannelInput(e),enabled:t}).then(this.onChatUpdated.bind(this,e))))}editForumTopic(e){const{chatId:t,topicId:a,title:s,iconEmojiId:n,closed:i,hidden:r}=e;return this.apiManager.invokeApi("channels.editForumTopic",{channel:this.getChannelInput(t),topic_id:(0,oe.Z)(a),title:s,icon_emoji_id:n,closed:i,hidden:r}).then(this.onChatUpdated.bind(this,t))}createForumTopic(e){return t=this,a=void 0,n=function*(){const{chatId:t,title:a,iconColor:s,iconEmojiId:n}=e,i=yield this.appProfileManager.getChannelFull(t),r=i.default_send_as&&this.appPeersManager.getInputPeerById(this.appPeersManager.getPeerId(i.default_send_as));return this.apiManager.invokeApi("channels.createForumTopic",{channel:this.getChannelInput(t),title:a,icon_color:s,icon_emoji_id:n,random_id:(0,Te.a)(),send_as:r}).then((e=>{this.onChatUpdated(t,e);const a=e.updates.find((e=>"updateNewChannelMessage"===e._));return(0,pe.Z)(a.message.id)}))},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}updatePinnedForumTopic(e,t,a){return this.apiManager.invokeApi("channels.updatePinnedForumTopic",{channel:this.getChannelInput(e),topic_id:(0,oe.Z)(t),pinned:a}).then(this.onChatUpdated.bind(this,e))}}a(4762);var Ve,Oe=a(5953),Le=a(9005),Ne=a(6637),Ze=a(2423);function je(e,t){(0,Ne.Z)(e)||(e="https://"+e);const a={url:e};let s,n,i,r;if(s=e.match(/^(?:https?:\/\/)?(?:(.+?)\.)?(?:(?:web|k|z)\.)?t(?:elegram)?\.me(?:\/(.+))?/)){const t=new URL(e);let a=s[1];a&&o.BX.has(s[1])&&(a=void 0),a&&(t.pathname=a+("/"===t.pathname?"":t.pathname));const n=t.pathname.slice(1),i=n.split("/");if(i[0]&&"$"===i[0][0]&&i[0].length>1)r="invoice";else if(/^\W/.test(n)&&!Ze.kO.test(n))r="joinchat";else switch(i[0]){case"joinchat":case"addstickers":case"addemoji":case"voicechat":case"invoice":if(1!==i.length&&!a){r=i[0];break}default:if(i[1]&&i[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===i.length){r="im";break}}}else(n=e.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?r="im":(i=e.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(r="tg_"+i[1]);return window[r]||(r=void 0),a.onclick=r,a}d.GO&&(d.GO.wrapUrl=je),function(e){let t,s;function n(t){e.lastRequestedLangCode=t,e.lastRequestedNormalizedLangCode=t.split("-")[0]}function i(){if("h12"===e.timeFormat)try{const t=P({hour:"numeric",minute:"numeric",hour12:!0}),a=new Date;a.setHours(0);const s=t.format(a);e.amPmCache.am=s.split(" ")[1],a.setHours(12);const n=t.format(a);e.amPmCache.pm=n.split(" ")[1]}catch(t){console.error("cannot get am/pm",t),e.amPmCache={am:"AM",pm:"PM"}}}function r(){const e=_.Z.langPackCode;return n(e),Promise.all([a.e(104).then(a.bind(a,9104)),a.e(301).then(a.bind(a,9301)),a.e(8).then(a.bind(a,9179))]).then((([t,a,s])=>{const n=[];return p(t.default,n),p(a.default,n),f({_:"langPackDifference",from_version:0,lang_code:e,strings:n,version:0,local:!0,countries:s.default})}))}function o(t,s){e.requestedServerLanguage=!0;const n=g.managers;return Promise.all([n.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"web"}),!1,a.e(104).then(a.bind(a,9104)),a.e(301).then(a.bind(a,9301)),n.apiManager.invokeApiCacheable("help.getCountriesList",{lang_code:t,hash:0}),e.polyfillPromise])}function p(e,t=[]){for(const a in e){const s=e[a];"string"==typeof s?t.push({_:"langPackString",key:a,value:s}):t.push(Object.assign({_:"langPackStringPluralized",key:a},s))}return t}function f(e){return e.appVersion=_.Z.langPackVersion,h.Z.set({langPack:e}).then((()=>(c(e),e)))}function c(a){const s=e.lastRequestedLangCode;if(a.lang_code===s){try{t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode)}catch(a){console.error("pluralRules error",a),t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode.split("-",1)[0])}try{t=new Intl.PluralRules(a.lang_code)}catch(e){console.error("pluralRules error",e),t=new Intl.PluralRules(a.lang_code.split("-",1)[0])}e.strings.clear();for(const t of a.strings)e.strings.set(t.key,t);a.countries&&(e.countriesList.length=0,e.countriesList.push(...a.countries.countries),a.countries.countries.forEach((t=>{if(t.name){const a=t.default_name;e.strings.set(a,{_:"langPackString",key:a,value:t.name})}}))),e.lastAppliedLangCode!==s&&(g.dispatchEvent("language_change",s),e.lastAppliedLangCode=s,v.clear(),i()),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const a=e.weakMap.get(t);a&&a.update()}))}}function l(e,t,a={i:0}){const s=[];let n=0;return e.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,((e,i,r,o,p,d,f)=>{if(s.push(f.slice(n,d)),i){let e;switch(i){case"**":e=document.createElement("b");break;case"__":e=document.createElement("i")}e.append(...l(r,t,a)),s.push(e)}else if(o)s.push(document.createElement("br"));else if(p){const e=p.lastIndexOf("]"),n=p.slice(1,e),i=p.slice(e+2,p.length-1);let r;if(i&&(0,Ne.Z)(i)){r=document.createElement("a");const e=je(i);r.href=e.url,e.onclick&&r.setAttribute("onclick",e.onclick),r.target="_blank"}else r=t[a.i++],r instanceof DocumentFragment&&(r=r.firstChild),r.textContent="";r.append(...l(n,t,a)),s.push(r)}else t&&function(e,t,a){const s=t[a.i++];Array.isArray(s)?e.push(...s):e.push(s)}(s,t,a);return n=d+e.length,""})),n!==e.length&&s.push(e.slice(n)),s}function m(a,s=!1,n){const i=e.strings.get(a);let r;if(i)if("langPackStringPluralized"===i._&&(null==n?void 0:n.length)){let e=n[0];"string"==typeof e&&(e=+e.replace(/\D/g,"")),r=i[t.select(e)+"_value"]||i.other_value}else r="langPackString"===i._?i.value:a;else r=a;const o=l(r,n);return s?o.map((e=>e instanceof Node?e.textContent:e)).join(""):o}e.strings=new Map,e.countriesList=[],e.requestedServerLanguage=!1,e.isRTL=!1,e.setRTL=function(t){e.isRTL=t},e.getCacheLangPack=function(){return s||(s=Promise.all([h.Z.get("langPack"),e.polyfillPromise]).then((([t])=>t?(d.ZP,e.lastRequestedLangCode||n(t.lang_code),c(t),t):r())).finally((()=>{s=void 0})))},e.setTimeFormat=function(t,a=!!e.timeFormat&&e.timeFormat!==t){e.timeFormat=t,i(),a&&(v.clear(),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const a=e.weakMap.get(t);a instanceof b&&a.update()})))},e.loadLocalLangPack=r,e.loadLangPack=o,e.getStrings=function(e,t){return g.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:_.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=p,e.getLangPack=function(e,t){return n(e),o(e).then((([e,t,a,s,n,i])=>{let r=[];return[a,s].forEach((e=>{p(e.default,r)})),r=r.concat(...[e.strings,t.strings].filter(Boolean)),e.strings=r,e.countries=n,f(e)}))},e.saveLangPack=f,e.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():a.e(642).then(a.bind(a,4642)).then((e=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},e.default)})),e.applyLangPack=c,e.superFormatter=l,e.format=m,e.weakMap=new WeakMap;class u{constructor(t){this.element=(null==t?void 0:t.element)||document.createElement("span"),this.element.classList.add("i18n"),this.property=null==t?void 0:t.property,t&&(t.key||t.date)&&this.update(t),e.weakMap.set(this.element,this)}}class y extends u{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"innerHTML"}))}update(e){if((0,Oe.Z)(this,e),"innerHTML"===this.property)this.element.textContent="",this.element.append(...m(this.key,!1,this.args));else{const e=this.element[this.property],t=m(this.key,!0,this.args);void 0===e?this.element.dataset[this.property]=t:this.element[this.property]=t}}compareAndUpdate(e){if(this.key!==e.key||!(0,Y.Z)(this.args,e.args))return this.update(e)}}e.IntlElement=y;const v=new Map;function P(t={}){const a=JSON.stringify(t);let s=v.get(a);return s||(s=new Intl.DateTimeFormat(e.lastRequestedNormalizedLangCode+"-u-hc-"+e.timeFormat,t),v.set(a,s)),s}e.amPmCache={am:"AM",pm:"PM"};class b extends u{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"})),this.element.setAttribute("dir","auto")}update(t){let a;if((0,Oe.Z)(this,t),this.options.hour&&this.options.minute&&2===Object.keys(this.options).length){const t=this.date.getHours();a=("0"+("h12"===e.timeFormat?t%12||12:t)).slice(-2)+":"+("0"+this.date.getMinutes()).slice(-2),"h12"===e.timeFormat&&(a+=" "+(t<12?e.amPmCache.am:e.amPmCache.pm))}else{const e=P(this.options);a=(0,Le.Z)(e.format(this.date))}this.element[this.property]=a}}e.IntlDateElement=b,e.i18n=function(e,t){return new y({key:e,args:t}).element},e.i18n_=function(e){return new y(e).element},e._i18n=function(e,t,a,s){return new y({element:e,key:t,args:a,property:s}).element}}(Ve||(Ve={}));const qe=Ve;Ve.i18n,Ve.i18n_,Ve._i18n,d.GO.I18n=Ve;const Ge=["January","February","March","April","May","June","July","August","September","October","November","December"],He=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],We=e=>{const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),a=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-a);const s=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-s.getTime())/86400+1)/7)};d.GO&&(d.GO.formatDateAccordingToTodayNew=function(e){const t=new Date,a=t.getTime()/1e3|0,s=e.getTime()/1e3|0,n={};return a-s<86400&&t.getDate()===e.getDate()?n.hour=n.minute="2-digit":t.getFullYear()!==e.getFullYear()?(n.year=n.day="numeric",n.month="2-digit"):a-s<604800&&We(t)===We(e)?n.weekday="short":(n.month="short",n.day="numeric"),new qe.IntlDateElement({date:e,options:n}).element});const ze=2013,Ke=new RegExp("20[0-9]{1,2}"),Je=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),$e=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),Qe=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),Ye=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),Xe=[31,29,31,30,31,30,31,31,30,31,30,31];function et(e,t,a){const s=(new Date).getFullYear(),n=Date.now();if(a>=ze&&a<=s){const s=new Date;s.setFullYear(a,t,1),s.setHours(0,0,0);const i=s.getTime();if(i>n)return;s.setMonth(s.getMonth()+1);const r=s.getTime()-1;e.push({title:at(i),minDate:i,maxDate:r})}}function tt(e,t,a){if(rt(t,a)){const n=(new Date).getFullYear(),i=Date.now();for(let r=n;r>=ze;r--){if(1===a&&28===t&&((s=r)%4!=0||s%100==0)&&s%400!=0)continue;const o=new Date;o.setFullYear(r,a,t+1),o.setHours(0,0,0);const p=o.getTime();if(p>i)continue;o.setFullYear(r,a,t+2),o.setHours(0,0,0);const d=o.getTime()-1;r===n?e.push({title:st(p),minDate:p,maxDate:d}):e.push({title:nt(p),minDate:p,maxDate:d})}}var s}function at(e){const t=new Date(e);return Ge[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function st(e){const t=new Date(e);return Ge[t.getMonth()].slice(0,3)+" "+t.getDate()}function nt(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function it(e){const t=new Date(e);return He[t.getDay()]}function rt(e,t){return t>=0&&t<12&&e>=0&&e{t[e][s]=a})),a[e]=t[e])}d.GO.fillTipDates=function(e,t){const a=e.trim().toLowerCase();if(a.length<3)return;if(0==="today".indexOf(a)){const e=new Date,a=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(a,s,n),e.setHours(0,0,0);const i=e.getTime();e.setFullYear(a,s,n+1),e.setHours(0,0,0);const r=e.getTime()-1;return void t.push({title:"Today",minDate:i,maxDate:r})}if(0==="yesterday".indexOf(a)){const e=new Date,a=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(a,s,n),e.setHours(0,0,0);const i=e.getTime()-864e5;e.setFullYear(a,s,n+1),e.setHours(0,0,0);const r=e.getTime()-86400001;return void t.push({title:"Yesterday",minDate:i,maxDate:r})}const s=function(e){const t=new Date;if(e.length<=3)return-1;for(let a=0;a<7;a++)if(t.setDate(t.getDate()+1),0===it(t.getTime()).toLowerCase().indexOf(e))return t.getDay();return-1}(a);if(s>=0){const e=new Date,a=e.getTime(),n=s-e.getDay();e.setDate(e.getDate()+n),e.getTime()>a&&e.setTime(e.getTime()-6048e5);const i=e.getFullYear(),r=e.getMonth(),o=e.getDate();e.setFullYear(i,r,o),e.setHours(0,0,0);const p=e.getTime();e.setFullYear(i,r,o+1),e.setHours(0,0,0);const d=e.getTime()-1;return void t.push({title:it(p),minDate:p,maxDate:d})}let n;if(null===(n=Qe.exec(a)))if(null===(n=Ye.exec(a)))if(null===(n=Ke.exec(a))){if(null!==(n=Je.exec(a))){const e=n[1],a=n[2],s=ot(e);if(s>=0){const e=+a;if(e>0&&e<=31)return void tt(t,e-1,s);if(e>=ze)return void et(t,s,e)}}if(null!==(n=$e.exec(a))){const e=n[1],a=ot(n[2]);if(a>=0){const s=+e;if(s>0&&s<=31)return void tt(t,s-1,a);s>=ze&&et(t,a,s)}}}else{let e=+a;const s=(new Date).getFullYear();if(e=e;a--){const e=new Date;e.setFullYear(a,0,1),e.setHours(0,0,0);const s=e.getTime();e.setFullYear(a+1,0,1),e.setHours(0,0,0);const n=e.getTime()-1;t.push({title:""+a,minDate:s,maxDate:n})}}else if(e<=s){const a=new Date;a.setFullYear(e,0,1),a.setHours(0,0,0);const s=a.getTime();a.setFullYear(e+1,0,1),a.setHours(0,0,0);const n=a.getTime()-1;t.push({title:""+e,minDate:s,maxDate:n})}}else{const e=n[1],a=n[3],s=n[5];if(!n[2]===n[4])return;const i=parseInt(e),r=parseInt(a)-1;let o=parseInt(s);o>=10&&o<=99&&(o+=2e3);const p=(new Date).getFullYear();if(rt(i-1,r)&&o>=ze&&o<=p){const e=new Date;e.setFullYear(o,r,i),e.setHours(0,0,0);const a=e.getTime();e.setFullYear(o,r,i+1),e.setHours(0,0,0);const s=e.getTime()-1;return void t.push({title:nt(a),minDate:a,maxDate:s})}}else{const e=n[1],a=n[3],s=parseInt(e),i=parseInt(a);if(s>0&&s<=31){if(i>=ze&&s<=12)return void et(t,s-1,i);i<=12&&tt(t,s-1,i-1)}else s>=ze&&i<=12&&et(t,i-1,s)}};var dt=a(2491),ft=a(7072),ct=a(8801),lt=a(6658);const mt={pdf:"application/pdf",tgv:"application/x-tgwallpattern",tgs:"application/x-tgsticker",json:"application/json",wav:"audio/wav",mp3:"audio/mpeg",ogg:"audio/ogg",jpeg:"image/jpeg",jpg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",mp4:"video/mp4",webm:"video/webm",mov:"video/quicktime",svg:"image/svg+xml"},gt={};for(const e in mt)gt[mt[e]]=e;let ht=0;class ut extends G{constructor(){super(...arguments),this.onServiceWorkerFail=()=>{for(const e in this.docs){const t=this.docs[e];t.supportsStreaming&&(delete t.supportsStreaming,this.thumbsStorage.deleteCacheContext(t))}}}after(){this.docs={},this.stickerCachedThumbs={},this.uploadingWallPapers={},f.Z.getInstance().addEventListener("serviceWorkerOnline",(e=>{e||this.onServiceWorkerFail()}))}saveDoc(e,t){if(!e||"documentEmpty"===e._)return;const a=this.docs[e.id];e.file_reference&&(pt("file_reference",a,e),this.referenceDatabase.saveContext(e.file_reference,t)),a||(this.docs[e.id]=e);for(let t=0,a=e.attributes.length;t"documentAttributeFilename"===e._)),a=t&&t.file_name.split(".").pop(),s=((e,t={})=>{const a=t.monthAsNumber?".":" ",s=("0"+e.getHours()).slice(-2)+":"+("0"+e.getMinutes()).slice(-2)+(t.noSeconds?"":":"+("0"+e.getSeconds()).slice(-2));return(t.leadingZero?("0"+e.getDate()).slice(-2):e.getDate())+a+(t.monthAsNumber?("0"+(e.getMonth()+1)).slice(-2):Ge[e.getMonth()])+a+e.getFullYear()+(t.noTime?"":", "+s)})(new Date(1e3*e.date),{monthAsNumber:!0,leadingZero:!0}).replace(/[:\.]/g,"-").replace(", ","_");e.file_name=`${e.type}_${s}${a?"."+a:""}`}return Hs()&&"gif"===e.type&&e.size>8e6||"audio"===e.type||"video"===e.type?(e.supportsStreaming=!0,this.thumbsStorage.getCacheContext(e).url||this.thumbsStorage.setCacheContextURL(e,void 0,function(e,t=!1,a){let s;return s=t?"download":a?"thumb":e.supportsStreaming?"stream":"document",(0,ct.q)(s,(0,lt.Z)(e,a))}(e),0)):e.supportsStreaming=!1,e.file_name||(e.file_name=""),a?Object.assign(a,e):e}getDoc(e){return(0,fe.Z)(e)?e:this.docs[e]}downloadDoc(e,t,a){return this.apiFileManager.downloadMedia({media:e,queueId:t,onlyCache:a})}getLottieCachedThumb(e,t){const a=this.stickerCachedThumbs[e];return a&&a[t]}saveLottiePreview(e,t,a,s,n){var i,r,o;const p=this.getDoc(e);if(!p)return;const d=null!==(i=(r=this.stickerCachedThumbs)[o=p.id])&&void 0!==i?i:r[o]={},f=d[n];f&&f.w>=a&&f.h>=s||(d[n]={url:URL.createObjectURL(t),w:a,h:s})}saveWebPConvertedStrippedThumb(e,t){const a=this.getDoc(e);if(!a)return;const s=a.thumbs&&a.thumbs.find((e=>"photoStrippedSize"===e._));s&&(a.pFlags.stickerThumbConverted=!0,s.bytes=t)}getWallPapers(){return this.apiManager.invokeApiHashable({method:"account.getWallPapers"}).then((e=>{const t=e.wallpapers;return t.forEach((e=>{e.document=this.saveDoc(e.document)})),t}))}prepareWallPaperUpload(e){const t="wallpaper-upload-"+ ++ht,a={_:"photoSize",h:0,w:0,location:{},size:e.size,type:o.Pt};let s={_:"document",access_hash:"",attributes:[],dc_id:0,file_reference:[],id:t,mime_type:e.type,size:e.size,date:Date.now()/1e3,pFlags:{},thumbs:[a],file_name:e.name};s=this.saveDoc(s);const n=this.thumbsStorage.setCacheContextURL(s,void 0,URL.createObjectURL(e),e.size),i={_:"wallPaper",access_hash:"",document:s,id:t,slug:t,pFlags:{}};return this.uploadingWallPapers[t]={cacheContext:n,file:e},i}uploadWallPaper(e){const{cacheContext:t,file:a}=this.uploadingWallPapers[e];return delete this.uploadingWallPapers[e],this.apiFileManager.upload({file:a,fileName:a.name}).then((e=>this.apiManager.invokeApi("account.uploadWallPaper",{file:e,mime_type:a.type,settings:{_:"wallPaperSettings"}}).then((e=>((0,ue.Z)(e),e.document=this.saveDoc(e.document),this.thumbsStorage.setCacheContextURL(e.document,void 0,t.url,t.downloaded),e)))))}getGifs(){return this.apiManager.invokeApiHashable({method:"messages.getSavedGifs",processResult:e=>((0,ue.Z)(e),e.gifs.map((e=>this.saveDoc(e))))})}requestDocPart(e,t,a,s){const n=this.getDoc(e);return n?this.apiFileManager.requestFilePart(t,(0,ft.Z)(n),a,s):Promise.reject((0,X.Z)("NO_DOC"))}}var yt=a(6034);class _t extends G{constructor(){super(...arguments),this.drafts={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateDraftMessage:e=>{const t=this.appPeersManager.getPeerId(e.peer);this.saveDraft({peerId:t,threadId:e.threadId,draft:e.draft,notify:!0})}}),h.Z.get("drafts").then((e=>{this.drafts=e||{}}))}getKey(e,t){return e+(t?"_"+t:"")}getDraft(e,t){return this.drafts[this.getKey(e,t)]}addMissedDialogs(){return this.getAllDrafts().then((()=>{for(const e in this.drafts){if(-1!==e.indexOf("_"))continue;const t=e.toPeerId();this.appMessagesManager.getDialogOnly(t)||this.appMessagesManager.reloadConversation(t)}}))}getAllDrafts(){var e;return null!==(e=this.getAllDraftPromise)&&void 0!==e?e:this.getAllDraftPromise=this.apiManager.invokeApi("messages.getAllDrafts").then((e=>{(this.apiUpdatesManager.updatesState.syncLoading||Promise.resolve()).then((()=>{this.apiUpdatesManager.processUpdateMessage(e)}))}))}saveDraft({peerId:e,threadId:t,draft:a,notify:s,force:n}){const i=this.processApiDraft(a),r=this.getKey(e,t);return i?this.drafts[r]=i:delete this.drafts[r],h.Z.set({drafts:this.drafts}),s&&this.rootScope.dispatchEvent("draft_updated",{peerId:e,threadId:t,draft:i,force:n}),i}isEmptyDraft(e){return"draftMessage"!==(null==e?void 0:e._)||!(void 0!==e.reply_to_msg_id&&e.reply_to_msg_id>0)&&!e.message.length}processApiDraft(e){if(e&&"draftMessage"===e._)return e.reply_to_msg_id&&(e.reply_to_msg_id=(0,pe.Z)(e.reply_to_msg_id)),e}syncDraft(e,t,a,s=!0,n=!1){const i=this.getDraft(e,t);if((0,yt.Z)(i,a))return!0;const r={peer:this.appPeersManager.getInputPeerById(e),message:""};let o;if(this.isEmptyDraft(a))o={_:"draftMessageEmpty"};else{(0,ue.Z)(a);const e=a.message,t=a.entities;a.reply_to_msg_id&&(r.reply_to_msg_id=(0,oe.Z)(a.reply_to_msg_id)),(null==t?void 0:t.length)&&(r.entities=this.appMessagesManager.getInputEntities(t)),a.pFlags.no_webpage&&(r.no_webpage=a.pFlags.no_webpage),r.message=e}t&&(r.top_msg_id=(0,oe.Z)(t));const p=o||a;return p.date=(0,te.Z)(!0)+this.timeManager.getServerTimeOffset(),this.saveDraft({peerId:e,threadId:t,draft:p,notify:!0,force:n}),!s||this.apiManager.invokeApi("messages.saveDraft",r)}clearAllDrafts(){return this.apiManager.invokeApi("messages.clearAllDrafts").then((e=>{if(e)for(const e in this.drafts){const[t,a]=e.split("_");this.rootScope.dispatchEvent("draft_updated",{peerId:t.toPeerId(),threadId:a?+a:void 0,draft:void 0})}}))}clearDraft(e,t){const a={_:"draftMessageEmpty"};t?this.syncDraft(e,t,a,!1,!0):this.saveDraft({peerId:e,threadId:t,draft:a,notify:!0,force:!0})}setDraft(e,t,a,s){const n={_:"draftMessage",date:Date.now()/1e3|0,message:a,pFlags:{},entities:s};t?this.syncDraft(e,t,n,!1,!0):this.saveDraft({peerId:e,threadId:t,draft:n,notify:!0,force:!0})}}var vt=a(946),Pt=a(7746);const bt={keywords:{},version:0,langCode:_.Z.langPackCode};class Mt extends G{constructor(){super(...arguments),this.keywordLangPacks={},this.indexedLangPacks={},this.getKeywordsPromises={},this.recent={},this.getRecentEmojisPromises={},this.getCustomEmojiDocumentPromises=new Map}getEmojiKeywords(e=_.Z.langPackCode){const t=this.getKeywordsPromises[e];if(t)return t;const a="emojiKeywords_"+e;return this.getKeywordsPromises[e]=h.Z.get(a).then((t=>((0,fe.Z)(t)||(t={}),(0,vt.Z)(bt,t),t.langCode=e,this.keywordLangPacks[e]=t,this.apiManager.invokeApi("messages.getEmojiKeywordsDifference",{lang_code:t.langCode,from_version:t.version}).then((e=>{t.version=e.version;const s=t.keywords,n=e.keywords;for(let e=0,t=n.length;et)))))}getBothEmojiKeywords(){const e=[this.getEmojiKeywords()];return this.networkerFactory.language!==_.Z.langPackCode&&e.push(this.getEmojiKeywords(this.networkerFactory.language)),this.recent.native||e.push(this.getRecentEmojis("native")),Promise.all(e)}indexEmojis(){this.index||(this.index=new ae.Z(void 0,2));for(const e in this.keywordLangPacks){if(this.indexedLangPacks[e])continue;const t=this.keywordLangPacks[e].keywords;for(const e in t){const a=t[e];this.index.indexObject(a,e)}this.indexedLangPacks[e]=!0}}searchEmojis(e){let t;if(this.indexEmojis(),(e=e.toLowerCase().replace(/_/g," ")).trim()){const a=this.index.search(e);t=Array.from(a).reduce(((e,t)=>e.concat(t)),[])}else t=this.recent.native.concat(Mt.POPULAR_EMOJI).slice(0,32);return t=Array.from(new Set(t)),t}getRecentEmojis(e){var t;const a=this.getRecentEmojisPromises;return null!==(t=a[e])&&void 0!==t?t:a[e]=this.appStateManager.getState().then((t=>{let a=[];if("native"===e){const{recentEmoji:e}=t;a=Array.isArray(e)&&e.length?e:Mt.POPULAR_EMOJI}else{const{recentCustomEmoji:e}=t;a=Array.isArray(e)&&e.length?e:[]}return this.recent[e]=a}))}pushRecentEmoji(e){const t=e.docId?"custom":"native";e.emoji=(0,Pt.Z)(e.emoji),this.getRecentEmojis(t).then((a=>{const s=e.docId||e.emoji;(0,M.Z)(a,s),a.unshift(s),a.splice(32,a.length-32),this.appStateManager.pushToState("custom"===t?"recentCustomEmoji":"recentEmoji",a),this.rootScope.dispatchEvent("emoji_recent",e)}))}getCustomEmojiDocuments(e){return e.length?this.apiManager.invokeApi("messages.getCustomEmojiDocuments",{document_id:e}).then((e=>e.map((e=>this.appDocsManager.saveDoc(e,{type:"customEmoji",docId:e.id}))))):Promise.resolve([])}getCachedCustomEmojiDocuments(e){return e.map((e=>this.appDocsManager.getDoc(e)))}setDebouncedGetCustomEmojiDocuments(){!this.getCustomEmojiDocumentsPromise&&this.getCustomEmojiDocumentPromises.size&&(this.getCustomEmojiDocumentsPromise=(0,P.Z)(0).then((()=>{const e=[...this.getCustomEmojiDocumentPromises.keys()],t=[];do{const a=e.splice(0,100),s=this.getCustomEmojiDocuments(a).then((e=>{e.forEach(((e,t)=>{const s=a[t],n=this.getCustomEmojiDocumentPromises.get(s);this.getCustomEmojiDocumentPromises.delete(s),n.resolve(e)}))}));t.push(s)}while(e.length);return Promise.all(t)})).finally((()=>{this.getCustomEmojiDocumentsPromise=void 0,this.setDebouncedGetCustomEmojiDocuments()})))}getCustomEmojiDocument(e){let t=this.getCustomEmojiDocumentPromises.get(e);if(t)return t;return this.appDocsManager.getDoc(e)||(t=(0,v.Z)(),this.getCustomEmojiDocumentPromises.set(e,t),this.setDebouncedGetCustomEmojiDocuments(),t)}getCustomEmojis(){return this.appStickersManager.getEmojiStickers()}}Mt.POPULAR_EMOJI=["😂","😘","❤️","😍","😊","😁","👍","☺️","😔","😄","😭","💋","😒","😳","😜","🙈","😉","😃","😢","😝","😱","😡","😏","😞","😅","😚","🙊","😌","😀","😋","😆","👌","😐","😕"];var It=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class St extends G{after(){this.log=(0,I.kg)("GROUP-CALLS"),this.groupCalls=new Map,this.participants=new Map,this.nextOffsets=new Map,this.apiUpdatesManager.addMultipleEventsListeners({updateGroupCall:e=>{this.saveGroupCall(e.call,e.chat_id)},updateGroupCallParticipants:e=>{this.saveGroupCall(e.call);const t=e.call.id;this.saveApiParticipants(t,e.participants)}}),this.rootScope.addEventListener("group_call_update",(e=>{"groupCallDiscarded"===e._&&this.participants.delete(e.id)}))}getCachedParticipants(e){let t=this.participants.get(e);return t||this.participants.set(e,t=new Map),t}prepareToSavingNextOffset(e){const t=this.nextOffsets,a=t.get(e);return{nextOffset:a,setNextOffset:s=>{t.get(e)===a&&t.set(e,s)}}}saveApiParticipant(e,t,a){const s=this.getCachedParticipants(e),n=(0,le.Z)(t.peer),i=s.get(n),r=t.pFlags.left;if(!i&&r)return;t.pFlags.muted||t.pFlags.can_self_unmute||(t.pFlags.can_self_unmute=!0),i?(re(i,t),t=i):s.set(n,t);const o=this.getGroupCall(e);if("groupCall"===(null==o?void 0:o._)){let e=!1;r?(--o.participants_count,e=!0):!t.pFlags.just_joined||i||t.pFlags.self||(++o.participants_count,e=!0),e&&this.rootScope.dispatchEvent("group_call_update",o)}r&&s.delete(n),this.rootScope.dispatchEvent("group_call_participant",{groupCallId:e,participant:t})}saveApiParticipants(e,t,a){t.saved||(t.saved=!0,t.forEach((t=>this.saveApiParticipant(e,t,a))))}editParticipant(e,t,a){return It(this,void 0,void 0,(function*(){this.saveApiParticipant(e,t);const s=t.pFlags.self?o.NM:(0,le.Z)(t.peer),n=yield this.apiManager.invokeApiSingle("phone.editGroupCallParticipant",{call:this.getGroupCallInput(e),participant:s===o.NM?this.appPeersManager.getInputPeerSelf():this.appPeersManager.getInputPeerById(s),muted:a.muted,volume:a.volume,raise_hand:a.raiseHand,video_paused:a.videoPaused,video_stopped:a.videoStopped,presentation_paused:a.presentationPaused});this.apiUpdatesManager.processUpdateMessage(n)}))}getGroupCall(e){return this.groupCalls.get(e)}getGroupCallFull(e,t){return It(this,void 0,void 0,(function*(){const a=this.getGroupCall(e);if(a&&"inputGroupCall"!==a._&&!t)return a;const s=this.getCachedParticipants(e).size?0:100;return this.apiManager.invokeApiSingleProcess({method:"phone.getGroupCall",params:{call:this.getGroupCallInput(e),limit:s},processResult:t=>{this.appUsersManager.saveApiUsers(t.users),this.appChatsManager.saveApiChats(t.chats),this.saveApiParticipants(e,t.participants,!0);const a=this.saveGroupCall(t.call);return s&&void 0===this.nextOffsets.get(e)&&this.nextOffsets.set(e,t.participants_next_offset),a}})}))}saveGroupCall(e,t){const a=this.groupCalls.get(e.id),s="inputGroupCall"!==e._&&(!a||"groupCallDiscarded"!==a._);return a?(s&&re(a,e),e=a):this.groupCalls.set(e.id,e),s&&this.rootScope.dispatchEvent("group_call_update",e),e}createGroupCall(e,t,a){return It(this,void 0,void 0,(function*(){const s=yield this.apiManager.invokeApi("phone.createGroupCall",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0)),random_id:(0,Te.d)(32),schedule_date:t,title:a});return this.apiUpdatesManager.processUpdateMessage(s),s.updates.find((e=>"updateGroupCall"===e._)).call}))}getGroupCallInput(e){const t=this.getGroupCall(e);return{_:"inputGroupCall",id:t.id,access_hash:t.access_hash}}getGroupCallParticipants(e){return It(this,void 0,void 0,(function*(){const{nextOffset:t,setNextOffset:a}=this.prepareToSavingNextOffset(e);return""!==t&&(yield this.apiManager.invokeApiSingleProcess({method:"phone.getGroupParticipants",params:{call:this.getGroupCallInput(e),ids:[],sources:[],offset:t||"",limit:100},processResult:t=>{const s=t.count===t.participants.length?"":t.next_offset;this.appChatsManager.saveApiChats(t.chats),this.appUsersManager.saveApiUsers(t.users),this.saveApiParticipants(e,t.participants),a(s)}})),{participants:this.getCachedParticipants(e),isEnd:""===this.nextOffsets.get(e)}}))}hangUp(e,t){const a=this.getGroupCallInput(e);let s;return s="boolean"==typeof t&&t?this.apiManager.invokeApi("phone.discardGroupCall",{call:a}):"number"==typeof t?this.apiManager.invokeApi("phone.leaveGroupCall",{call:a,source:t}):this.apiManager.invokeApi("phone.joinGroupCall",{call:a,join_as:this.appPeersManager.getInputPeerSelf(),muted:!0,video_stopped:!0,params:{_:"dataJSON",data:""}}),s.then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}joinGroupCall(e,t,a){return It(this,void 0,void 0,(function*(){const s=this.getGroupCallInput(e);let n;if("main"===a.type){const i={call:s,join_as:this.appPeersManager.getInputPeerSelf(),params:t,muted:a.isMuted,video_stopped:!a.joinVideo};n=this.apiManager.invokeApi("phone.joinGroupCall",i),this.log(`[api] joinGroupCall id=${e}`,i)}else{const a={call:s,params:t};n=this.apiManager.invokeApi("phone.joinGroupCallPresentation",a),this.log(`[api] joinGroupCallPresentation id=${e}`,a)}const i=yield n;return this.apiUpdatesManager.processUpdateMessage(i),i.updates.find((e=>"updateGroupCallConnection"===e._))}))}leaveGroupCallPresentation(e){return this.apiManager.invokeApi("phone.leaveGroupCallPresentation",{call:this.getGroupCallInput(e)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}}function Ct(e){return{_:"inputPhoto",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}function wt(e){return{_:"inputMediaPhoto",id:Ct(e),ttl_seconds:0}}var kt=a(515);function At(e){return{_:"inputMediaDocument",id:{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference},ttl_seconds:0}}class Dt extends G{constructor(){super(...arguments),this.inlineResults={},this.setHash={}}getGeoInput(e){return"geoPoint"===e._?{_:"inputGeoPoint",lat:e.lat,long:e.long,accuracy_radius:e.accuracy_radius}:{_:"inputGeoPointEmpty"}}getInlineResults(e,t,a="",s="",n){return this.apiManager.invokeApi("messages.getInlineBotResults",{bot:this.appUsersManager.getUserInput(t),peer:this.appPeersManager.getInputPeerById(e),query:a,geo_point:n?this.getGeoInput(n):void 0,offset:s},{stopTime:-1,noErrorBox:!0}).then((e=>{const t=e.query_id;return e.results.forEach((e=>{"botInlineMediaResult"===e._&&(e.document&&(e.document=this.appDocsManager.saveDoc(e.document)),e.photo&&(e.photo=this.appPhotosManager.savePhoto(e.photo))),this.inlineResults[(0,kt.Z)(t,e.id)]=e})),e}))}pushPopularBot(e){this.appUsersManager.getTopPeers("bots_inline").then((t=>{const a=e.toPeerId(),s=t.findIndex((e=>e.id===a));let n;n=-1!==s?t[s]:{id:a,rating:0},++n.rating,(0,ie.Z)(t,n,"rating"),this.appStateManager.setKeyValueToStorage("topPeersCache")}))}switchToPM(e,t,a){return this.setHash[t]={peerId:e,time:Date.now()},this.appMessagesManager.startBot(t,void 0,a)}checkSwitchReturn(e){return t=this,a=void 0,n=function*(){const t=this.appUsersManager.getUser(e);if(!t||!t.pFlags.bot||!t.bot_inline_placeholder)return;const a=this.setHash[e];return a&&(delete this.setHash[e],Date.now()-a.time<36e5)?a.peerId:void 0},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}switchInlineQuery(e,t,a,s){this.appDraftsManager.setDraft(e,t,"@"+this.appPeersManager.getPeerUsername(a.toPeerId())+" "+s)}callbackButtonClick(e,t,a){return this.apiManager.invokeApi("messages.getBotCallbackAnswer",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t),data:a.data},{stopTime:-1,noErrorBox:!0})}sendInlineResult(e,t,a,s={}){const n=this.inlineResults[a];if(!n)return;this.pushPopularBot(t);const i=a.split("_"),r=i.shift(),o=i.join("_");if(s.viaBotId=t,s.queryId=r,s.resultId=o,n.send_message.reply_markup&&(s.replyMarkup=n.send_message.reply_markup),"botInlineMessageText"===n.send_message._)s.entities=n.send_message.entities,this.appMessagesManager.sendText(e,n.send_message.message,s);else{let t,a,i="";const r=n.send_message;switch(r._){case"botInlineMessageMediaAuto":if(i=r.message,"botInlineMediaResult"===n._){const{document:e,photo:a}=n;t=e?At(e):wt(a)}break;case"botInlineMessageMediaGeo":t={_:"inputMediaGeoPoint",geo_point:this.getGeoInput(r.geo)},s.geoPoint=r.geo;break;case"botInlineMessageMediaVenue":t={_:"inputMediaVenue",geo_point:this.getGeoInput(r.geo),title:r.title,address:r.address,provider:r.provider,venue_id:r.venue_id,venue_type:r.venue_type},s.geoPoint=r.geo;break;case"botInlineMessageMediaContact":t={_:"inputMediaContact",phone_number:r.phone_number,first_name:r.first_name,last_name:r.last_name,vcard:r.vcard};break;case"botInlineMessageMediaInvoice":a={_:"messageMediaInvoice",title:r.title,description:r.description,photo:r.photo,currency:r.currency,total_amount:r.total_amount,pFlags:{shipping_address_requested:r.pFlags.shipping_address_requested,test:r.pFlags.test},start_param:void 0}}!t&&a&&(t={_:"messageMediaPending",messageMedia:a}),this.appMessagesManager.sendOther(e,t,s)}}}var Ut=a(7082);class Tt{constructor(){this.tempNum=0}generateTempMessageId(e){const t=++this.tempNum;return(0,pe.Z)(e)+(t&Ut.o-1)}}var Et=a(4421),Ft=a(3624),Rt=a(7401);function xt(e,t){if(e.length{let o=e.slice(s,r);const p=n++;o.length>t&&(xt(o.slice(t),t).forEach((e=>{i[n++]=e})),o=o.slice(0,t)),s=r,a=0,i[p]=(i[p]||"")+o};let o=0;for(;;){let s=e.indexOf(" ",o);if(-1===s){o!==e.length-1&&r();break}s+=" ".length;const n=s-o;a+n>t&&r(a),o=s,a+=n}return i}var Bt=a(5701),Vt=a(7667),Ot=a(6241),Lt=a(6535),Nt=a(6566),Zt=a(2202),jt=a(319);const qt=new class{constructor(){this.tabs=new Map}start(){f.Z.getInstance().addEventListener("tabState",((e,t)=>{this.tabs.get(t).state=e}))}getTabs(){return[...this.tabs.values()].filter((e=>!!e.state))}addTab(e){const t={source:e,state:void 0};this.tabs.set(e,t)}deleteTab(e){this.tabs.delete(e)}};d.GO&&(d.GO.appTabsManager=qt);const Gt=qt;var Ht=a(2381),Wt=a(13);function zt(e){return{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}var Kt=a(5285),Jt=a(5102);function $t(e,t,a){a?e[t]=!0:delete e[t]}var Qt=a(4993),Yt=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Xt=e=>{e()},ea=!0;class ta extends G{constructor(){super(...arguments),this.pendingByRandomId={},this.pendingByMessageId={},this.pendingAfterMsgs={},this.pendingTopMsgs={},this.tempFinalizeCallbacks={},this.sendSmthLazyLoadQueue=new Et.Z(10),this.needSingleMessages=new Map,this.extendedMedia=new Map,this.maxSeenId=0,this.migratedFromTo={},this.migratedToFrom={},this.newDialogsToHandle=new Map,this.newUpdatesAfterReloadToHandle={},this.notificationsToHandle={},this.reloadConversationsPeers=new Map,this.log=(0,I.kg)("MESSAGES",I.v9.Error|I.v9.Debug|I.v9.Log|I.v9.Warn),this.groupedTempId=0,this.typings={},this.unreadMentions={},this.goToNextMentionPromises={},this.batchUpdates={},this.clear=e=>{this.middleware?this.middleware.clean():(this.middleware=(0,Ft.k)(),this.uploadFilePromises={}),this.messagesStorageByPeerId={},this.groupedMessagesStorage={},this.scheduledMessagesStorage={},this.historiesStorage={},this.threadsStorage={},this.searchesStorage={},this.pinnedMessages={},this.threadsServiceMessagesIdsStorage={},this.threadsToReplies={},this.dialogsStorage&&this.dialogsStorage.clear(e),this.filtersStorage&&this.filtersStorage.clear(e)},this.handleNewDialogs=()=>{let e=0;const t=new Map,a=a=>{var s;const{peerId:n}=a;this.dialogsStorage.pushDialog({dialog:a}),this.appPeersManager.isChannel(n)||(e=Math.max(e,a.top_message||0));let i=t.get(n);i||t.set(n,i={}),"forumTopic"===a._?(null!==(s=i.topics)&&void 0!==s?s:i.topics=new Map).set(a.id,a):i.dialog=a};for(const[e,t]of this.newDialogsToHandle){const s="dialog"in t,{dialog:n,topics:i}=t;s&&(n?this.dialogsStorage.getDialogOnly(e)&&a(n):this.reloadConversation(e.toPeerId())),i&&(null==i||i.forEach(((t,s)=>{t?this.dialogsStorage.getForumTopic(e,s)&&a(t):this.dialogsStorage.getForumTopicById(e,s)})))}0!==e&&this.incrementMaxSeenId(e),this.rootScope.dispatchEvent("dialogs_multiupdate",t),this.newDialogsToHandle.clear()},this.handleNotifications=()=>{E.Z.clearTimeout(this.notificationsHandlePromise),this.notificationsHandlePromise=void 0;for(const e in this.notificationsToHandle){const[t,a]=e.split("_"),s=this.notificationsToHandle[e];this.getNotifyPeerSettings(t.toPeerId(),a?+a:void 0).then((({muted:e,peerTypeNotifySettings:t})=>{const a=s.topMessage;e&&!a.pFlags.mentioned||!a.pFlags.unread||a.pFlags.unread&&this.notifyAboutMessage(a,{fwdCount:s.fwdCount,peerTypeNotifySettings:t})}))}this.notificationsToHandle={}},this.onUpdateMessageId=e=>{const t=e.random_id;if(!this.pendingByRandomId[t])return;const a=(0,pe.Z)(e.id);this.pendingByMessageId[a]=t},this.onUpdateNewMessage=e=>{var t,a,s,n;const i=e.message,r=this.getMessagePeer(i),p=this.getHistoryMessagesStorage(r),d="updateNewDiscussionMessage"===e._;this.saveMessages([i],{storage:this.createMessageStorage(r,"history")});const f=this.appPeersManager.isForum(r),c=this.getThreadKey(i),l=c?+c.split("_")[1]:void 0,m=this.dialogsStorage.getDialogOrTopic(r,d?l:void 0);if((!m||this.reloadConversationsPeers.has(r))&&!d){let t=!0;if(r.isAnyChat()&&(t=this.appChatsManager.isInChat(r.toChatId())),t)return void this.handleNewUpdateAfterReload(r,e)}if(l&&!d){const e=null===(t=this.threadsStorage[r])||void 0===t?void 0:t[l],a={_:"updateNewDiscussionMessage",message:i};this.appChatsManager.isForum(r.toChatId())&&!this.dialogsStorage.getForumTopic(r,l)?this.handleNewUpdateAfterReload(r,a,l):e&&this.onUpdateNewMessage(a)}if("messageService"===i._){const{action:e}=i;if("messageActionPaymentSent"===e._&&i.reply_to&&this.rootScope.dispatchEvent("payment_sent",{peerId:i.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(i.reply_to.reply_to_peer_id):i.peerId,mid:i.reply_to_mid,receiptMessage:i}),"messageActionTopicEdit"===e._&&!d){const t=this.dialogsStorage.getForumTopic(r,l);if(t){const a=(0,ve.Z)(t);void 0!==e.title&&(t.title=e.title),void 0!==e.closed&&$t(t.pFlags,"closed",e.closed),void 0!==e.hidden&&$t(t.pFlags,"hidden",e.hidden),void 0!==e.icon_emoji_id&&(t.icon_emoji_id=e.icon_emoji_id),this.scheduleHandleNewDialogs(r,t),this.dialogsStorage.processTopicUpdate(t,a)}else this.dialogsStorage.getForumTopicById(r,l)}}this.saveMessages([i],{storage:p}),this.checkPendingMessage(i);const g=this.getHistoryStorage(r,d?l:void 0);d||this.updateMessageRepliesIfNeeded(i);const h=e.ignoreExisting;if(g.history.findSlice(i.mid)){if(!h)return!1}else{const e=g.history.first;if(e.isEnd(se.D.Bottom)){let t=0;for(const a=e.length;te[t]);++t);e.splice(t,0,i.mid)}else g.history.unshift(i.mid);null!==g.count&&++g.count}(!g.maxId||i.mid>g.maxId)&&(g.maxId=i.mid),this.mergeReplyKeyboard(g,i)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:r});const u=i.fromId;if(u.isUser()&&!i.pFlags.out&&i.from_id){this.appUsersManager.forceUserOnline(u,i.date);const e={_:"sendMessageCancelAction"};let t;t=r.isUser()?{_:"updateUserTyping",action:e,user_id:u}:this.appPeersManager.isChannel(r)?{_:"updateChannelUserTyping",action:e,channel_id:r.toChatId(),from_id:this.appPeersManager.getOutputPeer(u),top_msg_id:l?(0,oe.Z)(l):void 0}:{_:"updateChatUserTyping",action:e,chat_id:r.toChatId(),from_id:this.appPeersManager.getOutputPeer(u)},this.apiUpdatesManager.processLocalUpdate(t)}this.handleNewMessage(i);const y="forumTopic"===(null==m?void 0:m._);if(d&&!y||!m)return;const _=!i.pFlags.out&&i.pFlags.unread;if(_&&i.mid>m.top_message){const e=this.dialogsStorage.prepareDialogUnreadCountModifying(m);++m.unread_count,i.pFlags.mentioned&&(++m.unread_mentions_count,this.modifyCachedMentions(r,i.mid,!0,y?l:void 0)),e()}if(i.mid>=m.top_message&&this.setDialogTopMessage(i,m),(!d&&!f||y)&&_){const e=c||r,t=null!==(a=(n=this.notificationsToHandle)[e])&&void 0!==a?a:n[e]={fwdCount:0,fromId:o.NM};t.fromId!==u&&(t.fromId=u,t.fwdCount=0),i.fwd_from&&++t.fwdCount,t.topMessage=i,null!==(s=this.notificationsHandlePromise)&&void 0!==s||(this.notificationsHandlePromise=E.Z.setTimeout(this.handleNotifications,0))}},this.onUpdateMessageReactions=e=>{const{peer:t,msg_id:a,reactions:s}=e,n=(0,pe.Z)(a),i=this.appPeersManager.getPeerId(t),r=this.getMessageByPeer(i,n);if("message"!==(null==r?void 0:r._))return;const o=null==s?void 0:s.recent_reactions;if((null==o?void 0:o.length)&&r.pFlags.out){const e=o[o.length-1],t=r.reactions,a=null==t?void 0:t.recent_reactions;this.appPeersManager.getPeerId(e.peer_id)===this.appPeersManager.peerId||a&&!(a.length<=o.length)||a&&(0,Y.Z)(e,a[a.length-1])||this.getNotifyPeerSettings(i).then((({muted:t,peerTypeNotifySettings:a})=>{a.show_previews&&this.notifyAboutMessage(r,{peerReaction:e,peerTypeNotifySettings:a})}))}const p=r.peerId+"_"+r.mid;this.pushBatchUpdate("messages_reactions",this.batchUpdateReactions,p,(()=>(0,ve.Z)(r.reactions))),r.reactions=s,e.local||this.setDialogToStateIfMessageIsTop(r)},this.onUpdateDialogUnreadMark=e=>{const t=this.appPeersManager.getPeerId(e.peer.peer),a=this.getDialogOnly(t);if(a){const s=this.dialogsStorage.prepareDialogUnreadCountModifying(a);e.pFlags.unread?a.pFlags.unread_mark=!0:delete a.pFlags.unread_mark,s(),this.dialogsStorage.setDialogToState(a),this.rootScope.dispatchEvent("dialogs_multiupdate",new Map([[t,{dialog:a}]]))}else this.scheduleHandleNewDialogs(t)},this.onUpdateEditMessage=e=>{var t,a;const s=e.message,n=this.getMessagePeer(s),i=(0,pe.Z)(s.id),r=this.getHistoryMessagesStorage(n);if(!r.has(i))return;const o=this.getMessageFromStorage(r,i);this.saveMessages([s],{storage:r});const p=this.getMessageFromStorage(r,i);this.handleEditedMessage(o,p,r);const d=this.getDialogOnly(n),f=(null==d?void 0:d.top_message)===i;if(s.clear_history)f&&this.rootScope.dispatchEvent("dialog_flush",{peerId:n,dialog:d});else{let e=!0;if("message"===(null==o?void 0:o._)&&!(0,Y.Z)(o.reactions,p.reactions)){const t=p.reactions;p.reactions=o.reactions,this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:this.appPeersManager.getOutputPeer(n),msg_id:s.id,reactions:t}),e=!1}e&&this.rootScope.dispatchEvent("message_edit",{storageKey:r.key,peerId:n,mid:i,message:s}),f&&this.dialogsStorage.setDialogToState(d);const c=new Map,l=()=>{let e=c.get(n);return e||c.set(n,e={}),e};(f||s.grouped_id)&&d&&(l().dialog=d);const m=this.getThreadKey(s);if(m){const e=+m.split("_")[1],s=this.dialogsStorage.getForumTopic(n,e);s&&(null!==(t=(a=l()).topics)&&void 0!==t?t:a.topics=new Map).set(e,s)}c.size&&this.rootScope.dispatchEvent("dialogs_multiupdate",c)}},this.onUpdateReadHistory=e=>{const t=e.channel_id,a=(0,pe.Z)(e.max_id||e.read_max_id),s=(0,pe.Z)(e.top_msg_id),n=t?t.toPeerId(!0):this.appPeersManager.getPeerId(e.peer),i="updateReadHistoryOutbox"===e._||"updateReadChannelOutbox"===e._||"updateReadChannelDiscussionOutbox"===e._||void 0,r=!!t&&this.appChatsManager.isForum(t),o=this.getHistoryMessagesStorage(n),p=(0,Rt.Z)(o,"desc"),d=s&&r?this.dialogsStorage.getForumTopic(n,s):this.getDialogOnly(n),f=e.still_unread_count;let c=0,l=0,m=!1;const g=this.getHistoryStorage(n,s);if(n.isUser()&&i&&this.appUsersManager.forceUserOnline(n.toUserId()),s){const e=this.threadsToReplies[n+"_"+s];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}const h=d&&this.dialogsStorage.prepareDialogUnreadCountModifying(d),u=this.getReadMaxIdIfUnread(n,s);for(let e=0,t=p.length;ea)continue;const g=o.get(t);if(g.pFlags.out!==i)continue;const h=(0,Qt.Z)(g,r);if(!s||h===s){if(!(g.pFlags.unread||u&&u=d.top_message||!u?e=0:c&&d.top_message>a&&(e=c),void 0!==e&&(d.unread_count=e),(l<0||!d.unread_count)&&(d.unread_mentions_count=0)}null==h||h(),this.dialogsStorage.processDialogForFilters(d),this.rootScope.dispatchEvent("dialog_unread",{peerId:n,dialog:d}),this.dialogsStorage.setDialogToState(d),m||void 0!==f||i||!d.unread_count||("forumTopic"===d._?this.dialogsStorage.getForumTopicById(n,s):this.reloadConversation(n))}if(m&&this.rootScope.dispatchEvent("messages_read"),!s&&t){const e=n+"_";for(const t in this.threadsToReplies)if(0===t.indexOf(e)){const[e,a]=this.threadsToReplies[t].split("_");this.rootScope.dispatchEvent("replies_updated",this.getMessageByPeer(e.toPeerId(),+a))}}},this.onUpdateReadMessagesContents=e=>{const t=e.channel_id,a=e.top_msg_id,s=a?(0,pe.Z)(a):void 0,n=e.messages.map((e=>(0,pe.Z)(e))),i=t?t.toPeerId(!0):this.findPeerIdByMids(n);for(let e=0,t=n.length;e{const t=e.channel_id.toPeerId(!0),a=this.getHistoryStorage(t).history.slice,s=(0,pe.Z)(e.available_min_id),n=a.filter((e=>e<=s));e.messages=n,this.onUpdateDeleteMessages(e)},this.onUpdateDeleteMessages=e=>{var t;const a=e.channel_id,s=e.messages.map((e=>(0,pe.Z)(e))),n=a?a.toPeerId(!0):this.findPeerIdByMids(s);if(!n)return;this.apiManager.clearCache("messages.getSearchCounters",(e=>this.appPeersManager.getPeerId(e.peer)===n));const i=new Set,r=new Map;for(const e of s){const a=this.getMessageByPeer(n,e),s=this.getThreadKey(a);if(!s)continue;const o=+s.split("_")[1];if((null===(t=this.threadsStorage[n])||void 0===t?void 0:t[o])&&(i.add(s),!r.has(o))){const e=this.dialogsStorage.getForumTopic(n,o);e&&r.set(o,e)}}const o=this.handleDeletedMessages(n,this.getHistoryMessagesStorage(n),s),p=Array.from(i).map((e=>{const[t,a]=e.split("_");return this.getHistoryStorage(t.toPeerId(),+a)}));[this.getHistoryStorage(n),...p].forEach((e=>{for(const t of o.msgs)e.history.delete(t);o.count&&e.count&&(e.count=Math.max(0,e.count-o.count))})),this.rootScope.dispatchEvent("history_delete",{peerId:n,msgs:o.msgs});const d=[...r.values()],f=this.getDialogOnly(n);f&&d.unshift(f),d.forEach((e=>{const t="forumTopic"===e._,a=o.unreadMentions||o.unread,s=a&&this.dialogsStorage.prepareDialogUnreadCountModifying(e);if(o.unread&&(e.unread_count=Math.max(0,e.unread_count-o.unread)),o.unreadMentions&&(e.unread_mentions_count=e.unread_count?Math.max(0,e.unread_mentions_count-o.unreadMentions):0),a&&(s(),t||this.rootScope.dispatchEvent("dialog_unread",{peerId:n,dialog:e})),o.msgs.has(e.top_message)){const a=this.getHistoryStorage(e.peerId,t?e.id:void 0).history.first;if(a.isEnd(se.D.Bottom)&&a.length){const t=a[0],s=this.getMessageByPeer(n,t);this.setDialogTopMessage(s,e)}else t?this.dialogsStorage.getForumTopicById(n,e.id):this.reloadConversation(n)}}))},this.onUpdateChannel=e=>{const t=e.channel_id,a=t.toPeerId(!0),s=this.appChatsManager.getChat(t),n=this.appChatsManager.isInChat(t);(!!(0,Jt.Z)(s)[0]||!s.pFlags.left)!=(void 0!==this.historiesStorage[a])&&(delete this.historiesStorage[a],this.rootScope.dispatchEvent("history_forbidden",a)),!!this.getDialogOnly(a)!==n&&(n?this.reloadConversation(a):this.dialogsStorage.dropDialogOnDeletion(a)),this.rootScope.dispatchEvent("channel_update",t)},this.onUpdateChannelReload=e=>{const t=e.channel_id.toPeerId(!0);this.flushStoragesByPeerId(t),Promise.all([this.reloadConversation(t)]).then((()=>{this.rootScope.dispatchEvent("history_reload",t)}))},this.onUpdateChannelMessageViews=e=>{var t;const a=e.views,s=null!==(t=e.peerId)&&void 0!==t?t:e.channel_id.toPeerId(!0),n=(0,pe.Z)(e.id),i=this.getMessageByPeer(s,n);void 0!==(null==i?void 0:i.views)&&i.views{var t;if(null===(t=e.pFlags)||void 0===t?void 0:t.popup)return void this.rootScope.dispatchEvent("service_notification",e);const a=o.yF,s=a,n=this.generateTempMessageId(s),i={_:"message",id:n,from_id:this.appPeersManager.getOutputPeer(a),peer_id:this.appPeersManager.getOutputPeer(s),pFlags:{unread:!0},date:(e.inbox_date||(0,te.Z)(!0))+this.timeManager.getServerTimeOffset(),message:e.message,media:e.media,entities:e.entities};this.appUsersManager.hasUser(a)||this.appUsersManager.saveApiUsers([{_:"user",id:a,pFlags:{verified:!0},access_hash:"0",first_name:"Telegram",phone:"42777"}]),this.saveMessages([i],{isOutgoing:!0}),e.inbox_date&&(this.pendingTopMsgs[s]=n,this.onUpdateNewMessage({_:"updateNewMessage",message:i,pts:void 0,pts_count:void 0}))},this.onUpdatePinnedMessages=e=>{const t="updatePinnedChannelMessages"===e._?e.channel_id:void 0,a=t?t.toPeerId(!0):this.appPeersManager.getPeerId(e.peer),s=e.messages.map((e=>(0,pe.Z)(e))),n=this.getHistoryMessagesStorage(a),i=s.filter((e=>!n.has(e)));(i.length?Promise.all(i.map((e=>this.reloadMessages(a,e)))):Promise.resolve()).finally((()=>{var t;const i=null===(t=e.pFlags)||void 0===t?void 0:t.pinned;if(i)for(const e of s)n.get(e).pFlags.pinned=!0;else for(const e of s)delete n.get(e).pFlags.pinned;delete this.pinnedMessages[this.getPinnedMessagesKey(a)],this.appStateManager.getState().then((e=>{delete e.hiddenPinnedMessages[a],this.rootScope.dispatchEvent("peer_pinned_messages",{peerId:a,mids:s,pinned:i})}))}))},this.onUpdateNotifySettings=e=>{const{peer:t,notify_settings:a}=e,s="notifyForumTopic"===t._;if("notifyPeer"!==t._&&!s)return;const n=this.appPeersManager.getPeerId(t.peer),i=this.dialogsStorage.getDialogOrTopic(n,s?(0,pe.Z)(t.top_msg_id):void 0);i&&(i.notify_settings=a,this.rootScope.dispatchEvent("dialog_notify_settings",i),this.dialogsStorage.setDialogToState(i))},this.onUpdateNewScheduledMessage=e=>{const t=e.message,a=this.getMessagePeer(t),s=this.scheduledMessagesStorage[a];if(!s)return;const n=(0,pe.Z)(t.id),i=this.getMessageFromStorage(s,n);this.saveMessages([t],{storage:s,isScheduled:!0});const r=this.getMessageFromStorage(s,n);i?(this.handleEditedMessage(i,r,s),this.rootScope.dispatchEvent("message_edit",{storageKey:s.key,peerId:a,mid:t.mid,message:t})):this.checkPendingMessage(t)||this.rootScope.dispatchEvent("scheduled_new",t)},this.onUpdateDeleteScheduledMessages=e=>{const t=this.appPeersManager.getPeerId(e.peer),a=this.scheduledMessagesStorage[t];if(a){const s=e.messages.map((e=>(0,pe.Z)(e)));this.handleDeletedMessages(t,a,s),this.rootScope.dispatchEvent("scheduled_delete",{peerId:t,mids:s})}},this.onUpdateMessageExtendedMedia=e=>{var t;const a=this.appPeersManager.getPeerId(e.peer),s=(0,pe.Z)(e.msg_id),n=this.getHistoryMessagesStorage(a);if(!n.has(s))return;const i=this.getMessageFromStorage(n,s),r=i.media;"messageExtendedMedia"!==(null===(t=r.extended_media)||void 0===t?void 0:t._)&&(r.extended_media=e.extended_media,this.onUpdateEditMessage({_:"updateEditMessage",message:i,pts:0,pts_count:0}))},this.batchUpdateViews=e=>{const t=[],a=this.getMessagesFromMap(e);for(const[e]of a)t.push({peerId:e.peerId,mid:e.mid,views:e.views});return t},this.batchUpdateReactions=e=>{var t,a,s;const n=[],i=this.getMessagesFromMap(e);for(const[e,r]of i){const i=null!==(a=null===(t=e.reactions)||void 0===t?void 0:t.results)&&void 0!==a?a:[],o=null!==(s=null==r?void 0:r.results)&&void 0!==s?s:[],p=i.filter((t=>{const a=o.find((e=>(0,Kt.Z)(e.reaction,t.reaction)));return e.pFlags.out&&(!a||t.count>a.count)||void 0!==t.chosen_order&&(!a||void 0===a.chosen_order)}));n.push({message:e,changedResults:p})}return n}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateMessageID:this.onUpdateMessageId,updateNewDiscussionMessage:this.onUpdateNewMessage,updateNewMessage:this.onUpdateNewMessage,updateNewChannelMessage:this.onUpdateNewMessage,updateDialogUnreadMark:this.onUpdateDialogUnreadMark,updateEditMessage:this.onUpdateEditMessage,updateEditChannelMessage:this.onUpdateEditMessage,updateMessageReactions:this.onUpdateMessageReactions,updateReadChannelDiscussionInbox:this.onUpdateReadHistory,updateReadChannelDiscussionOutbox:this.onUpdateReadHistory,updateReadHistoryInbox:this.onUpdateReadHistory,updateReadHistoryOutbox:this.onUpdateReadHistory,updateReadChannelInbox:this.onUpdateReadHistory,updateReadChannelOutbox:this.onUpdateReadHistory,updateChannelReadMessagesContents:this.onUpdateReadMessagesContents,updateReadMessagesContents:this.onUpdateReadMessagesContents,updateChannelAvailableMessages:this.onUpdateChannelAvailableMessages,updateDeleteMessages:this.onUpdateDeleteMessages,updateDeleteChannelMessages:this.onUpdateDeleteMessages,updateChannel:this.onUpdateChannel,updateChannelReload:this.onUpdateChannelReload,updateChannelMessageViews:this.onUpdateChannelMessageViews,updateServiceNotification:this.onUpdateServiceNotification,updatePinnedMessages:this.onUpdatePinnedMessages,updatePinnedChannelMessages:this.onUpdatePinnedMessages,updateNotifySettings:this.onUpdateNotifySettings,updateNewScheduledMessage:this.onUpdateNewScheduledMessage,updateDeleteScheduledMessages:this.onUpdateDeleteScheduledMessages,updateMessageExtendedMedia:this.onUpdateMessageExtendedMedia}),this.rootScope.addEventListener("notify_peer_type_settings",(({key:e,settings:t})=>{let a;a="notifyUsers"===e?e=>e.peerId.isUser():"notifyBroadcasts"===e?e=>this.appPeersManager.isBroadcast(e.peerId):e=>this.appPeersManager.isAnyGroup(e.peerId),this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1)).filter(a).forEach((e=>{this.rootScope.dispatchEvent("dialog_notify_settings",e)}))})),this.rootScope.addEventListener("webpage_updated",(({id:e,msgs:t})=>{t.forEach((({peerId:t,mid:a,isScheduled:s})=>{const n=s?this.getScheduledMessagesStorage(t):this.getHistoryMessagesStorage(t),i=this.getMessageFromStorage(n,a);i&&(i.media={_:"messageMediaWebPage",webpage:this.appWebPagesManager.getCachedWebPage(e)},this.rootScope.dispatchEvent("message_edit",{storageKey:n.key,peerId:t,mid:a,message:i}))}))})),this.rootScope.addEventListener("draft_updated",(({peerId:e,threadId:t,draft:a})=>{const s=this.dialogsStorage.getDialogOrTopic(e,t);if(s){s.draft=a;let t=!1;a||(0,oe.Z)(s.top_message)?(this.dialogsStorage.generateIndexForDialog(s),this.dialogsStorage.pushDialog({dialog:s})):(this.dialogsStorage.dropDialog(e),t=!0),this.rootScope.dispatchEvent("dialog_draft",{peerId:e,dialog:s,drop:t,draft:a})}else if(t){const a=this.appChatsManager.getChat(e.toChatId());a?a.pFlags.forum&&this.dialogsStorage.getForumTopicById(e,t):this.reloadConversation(e)}else this.reloadConversation(e)})),this.rootScope.addEventListener("poll_update",(({poll:e})=>{const t=this.appPollsManager.pollToMessages[e.id];if(t)for(const e of t){const[t,a]=e.split("_"),s=this.getMessageByPeer(t.toPeerId(),+a);s&&this.setDialogToStateIfMessageIsTop(s)}})),this.rootScope.addEventListener("chat_toggle_forum",(({chatId:e,enabled:t})=>{const a=e.toPeerId(!0);if(!t){delete this.threadsStorage[a];for(const e in this.pinnedMessages)+e===a&&e.startsWith(a+"_")&&delete this.pinnedMessages[e]}})),this.batchUpdatesDebounced=(0,Bt.Z)((()=>{for(const e in this.batchUpdates){const t=this.batchUpdates[e];delete this.batchUpdates[e];const a=t.callback(t.batch);!a||a instanceof Array&&!a.length||rootScope.dispatchEvent(e,a)}}),33,!1,!0),this.appStateManager.getState().then((e=>{e.maxSeenMsgId&&(this.maxSeenId=e.maxSeenMsgId)}))}getInputEntities(e){const t=(0,ve.Z)(e);return t.forEach((e=>{"messageEntityMentionName"===e._&&(e._="inputMessageEntityMentionName",e.user_id=this.appUsersManager.getUserInput(e.user_id))})),t}invokeAfterMessageIsSent(e,t,a){var s,n,i;const r=null!==(s=(i=this.tempFinalizeCallbacks)[e])&&void 0!==s?s:i[e]={},o=null!==(n=r[t])&&void 0!==n?n:r[t]={deferred:(0,v.Z)()};return o.callback=a,o.deferred}editMessage(e,t,a={}){const{mid:s,peerId:n}=e;if(e.pFlags.is_outgoing)return this.invokeAfterMessageIsSent(s,"edit",(e=>this.editMessage(e,t,a)));const i=a.entities||[];t&&(t=(0,ke.Z)(t,i));const r=a.scheduleDate||(e.pFlags.is_scheduled?e.date:void 0);return this.apiManager.invokeApi("messages.editMessage",{peer:this.appPeersManager.getInputPeerById(n),id:e.id,message:t,media:a.newMedia,entities:i.length?this.getInputEntities(i):void 0,no_webpage:a.noWebPage,schedule_date:r}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{if(this.log.error("editMessage error:",e),!e||"MESSAGE_NOT_MODIFIED"!==e.type)return e&&"MESSAGE_EMPTY"===e.type&&(e.handled=!0),Promise.reject(e);e.handled=!0}))}sendText(e,t,a={}){var s,n;return Yt(this,void 0,void 0,(function*(){if(!t.trim())return;null!==(s=a.entities)&&void 0!==s||(a.entities=[]),a.threadId&&!a.replyToMsgId&&(a.replyToMsgId=a.threadId);const i=(yield this.apiManager.getConfig()).message_length_max,r=xt(t,i);t=r[0],r.length>1&&("webPage"!==(null===(n=a.webPage)||void 0===n?void 0:n._)||t.includes(a.webPage.url)||delete a.webPage),e=this.appPeersManager.getPeerMigratedTo(e)||e;const o=a.entities;a.viaBotId||(t=(0,ke.Z)(t,o));let p=this.getInputEntities(o);p.length||(p=void 0);const d=this.generateOutgoingMessage(e,a);d.entities=o,d.message=t;const f=a.replyToMsgId?(0,oe.Z)(a.replyToMsgId):void 0,c=this.appPeersManager.isChannel(e);a.webPage&&(d.media={_:"messageMediaWebPage",webpage:a.webPage});const l=e=>{this.onMessagesSendError([d],e),this.rootScope.dispatchEvent("messages_pending")};d.send=()=>{l();const s={};this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId);const n=a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0;let i;return i=a.viaBotId?this.apiManager.invokeApiAfter("messages.sendInlineBotResult",{peer:this.appPeersManager.getInputPeerById(e),random_id:d.random_id,reply_to_msg_id:f||void 0,query_id:a.queryId,id:a.resultId,clear_draft:a.clearDraft,send_as:n},s):this.apiManager.invokeApiAfter("messages.sendMessage",{no_webpage:a.noWebPage,peer:this.appPeersManager.getInputPeerById(e),message:t,random_id:d.random_id,reply_to_msg_id:f||void 0,entities:p,clear_draft:a.clearDraft,schedule_date:a.scheduleDate||void 0,silent:a.silent,send_as:n,update_stickersets_order:ea},s),this.pendingAfterMsgs[e]=s,i.then((e=>{if("updateShortSentMessage"===e._){const t=d.promise;delete d.promise;const s=(0,ve.Z)(d);(0,ge.Z)(d,["promise"]),d.promise=t,s.date=e.date,s.id=e.id,s.media=e.media,s.entities=e.entities,this.wrapMessageEntities(s),e.pFlags.out&&(s.pFlags.out=!0),e={_:"updates",users:[],chats:[],seq:0,date:void 0,updates:[{_:"updateMessageID",random_id:d.random_id,id:s.id},{_:a.scheduleDate?"updateNewScheduledMessage":c?"updateNewChannelMessage":"updateNewMessage",message:s,pts:e.pts,pts_count:e.pts_count}]}}else e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)}));this.apiUpdatesManager.processUpdateMessage(e),d.promise.resolve()}),(e=>{throw l(e),d.promise.reject(e),e})).finally((()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]}))},this.beforeMessageSending(d,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,sequential:!0});const m=[d.promise];for(let t=1;t=0){r="audio",p="audio."+("ogg"===d.split("/")[1]?"ogg":"mp3"),P="sendMessageUploadAudioAction",t.isVoiceMessage&&(r="voice",s.pFlags.media_unread=!0);const e={_:"documentAttributeAudio",pFlags:{voice:t.isVoiceMessage||void 0},waveform:t.waveform,duration:t.duration||0};g.push(e)}else if(t.isMedia)if(h){r="photo",p="photo."+d.split("/")[1],P="sendMessageUploadPhotoAction";const e={_:"photoSize",w:t.width,h:t.height,type:o.Pt,location:null,size:a.size};y={_:"photo",id:""+s.id,sizes:[e],w:t.width,h:t.height},u&&y.sizes.unshift(u);const n=this.thumbsStorage.getCacheContext(y,e.type);n.downloaded=a.size,n.url=t.objectURL||"",y=this.appPhotosManager.savePhoto(y)}else if(i().VIDEO_MIME_TYPES_SUPPORTED.has(d)){r="video",p="video.mp4",P="sendMessageUploadVideoAction";const e={_:"documentAttributeVideo",pFlags:{round_message:t.isRoundMessage||void 0,supports_streaming:!0},duration:t.duration,w:t.width,h:t.height};g.push(e),t.noSound&&a.size>10240&&a.size<10485760&&g.push({_:"documentAttributeAnimated"})}else r="document",p="document."+d.split("/")[1],P="sendMessageUploadDocumentAction";else r="document",p="document."+d.split("/")[1],P="sendMessageUploadDocumentAction";if(g.push({_:"documentAttributeFilename",file_name:f||p}),-1!==["document","video","audio","voice"].indexOf(r)&&!c){const e=[];if(_={_:"document",id:""+s.id,duration:t.duration,attributes:g,w:t.width,h:t.height,thumbs:e,mime_type:d,size:a.size},t.objectURL){const e=this.thumbsStorage.getCacheContext(_);e.downloaded=a.size,e.url=t.objectURL}let n;if(h)g.push({_:"documentAttributeImageSize",w:t.width,h:t.height}),n={_:"photoSize",w:t.width,h:t.height,type:o.Pt,size:a.size};else if("video"===r&&t.thumb){n={_:"photoSize",w:t.thumb.size.width,h:t.thumb.size.height,type:"local-thumb",size:t.thumb.blob.size};const e=this.thumbsStorage.getCacheContext(_,n.type);e.downloaded=n.size,e.url=t.thumb.url}n&&e.push(n),u&&e.unshift(u),_=this.appDocsManager.saveDoc(_)}this.log("sendFile",r,p,a.type,t);const b=(0,v.Z)(),M=c?void 0:{_:y?"messageMediaPhoto":"messageMediaDocument",pFlags:{},photo:y,document:_};M&&((0,ge.Z)(M,["promise"]),M.promise=b,t.spoiler&&(M.pFlags.spoiler=!0)),s.entities=m,s.message=l,s.media=c?{_:"messageMediaDocument",pFlags:{},document:a}:M;const I=c?void 0:(0,Zt.Z)(a);s.uploadingFileName=I,I&&(this.uploadFilePromises[I]=b);const S=e=>{this.onMessagesSendError([s],e),this.rootScope.dispatchEvent("messages_pending")};let C=!1,w=null;s.send=()=>{if(c){const e={_:"inputMediaDocument",id:zt(a)};b.resolve(e)}else if(a instanceof File||a instanceof Blob){const n=()=>{var n;let i;return C&&!s.error||(C=!1,w=this.apiFileManager.upload({file:a,fileName:I}),w.catch((a=>{C||(this.log("cancelling upload",M),this.cancelPendingMessage(s.random_id),this.setTyping(e,{_:"sendMessageCancelAction"},void 0,t.threadId),b.reject(a))})),w.addNotifyListener((a=>{const s=Math.max(1,Math.floor(100*a.done/a.total));P&&this.setTyping(e,{_:P,progress:0|s},void 0,t.threadId),b.notifyAll(a)})),b.notifyAll({done:0,total:a.size})),"video"===r&&t.objectURL&&(null===(n=t.thumb)||void 0===n?void 0:n.blob)&&(i=this.apiFileManager.upload({file:t.thumb.blob})),w&&w.then((e=>Yt(this,void 0,void 0,(function*(){let a;if(e.name=p,C=!0,a="photo"===r?{_:"inputMediaUploadedPhoto",file:e,pFlags:{spoiler:t.spoiler||void 0}}:{_:"inputMediaUploadedDocument",file:e,mime_type:d,pFlags:{force_file:"sendMessageUploadDocumentAction"===P||void 0,spoiler:t.spoiler||void 0},attributes:g},i)try{const e=yield i;a.thumb=e}catch(e){this.log.error("sendFile thumb upload error:",e)}b.resolve(a)}))),(e=>{throw S(e),e})),b};t.isGroupedItem?n():this.sendSmthLazyLoadQueue.push({load:n})}return b},this.beforeMessageSending(s,{isGroupedItem:t.isGroupedItem,isScheduled:!!t.scheduleDate||void 0,threadId:t.threadId,clearDraft:t.clearDraft,processAfter:t.processAfter}),t.isGroupedItem||(b.then((a=>(this.setTyping(e,{_:"sendMessageCancelAction"},void 0,t.threadId),this.apiManager.invokeApi("messages.sendMedia",{background:t.background,peer:this.appPeersManager.getInputPeerById(e),media:a,message:l,random_id:s.random_id,reply_to_msg_id:n,schedule_date:t.scheduleDate,silent:t.silent,entities:m,clear_draft:t.clearDraft,send_as:t.sendAsPeerId?this.appPeersManager.getInputPeerById(t.sendAsPeerId):void 0}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{if("photo"===r&&400===e.code&&("PHOTO_INVALID_DIMENSIONS"===e.type||"PHOTO_SAVE_FILE_INVALID"===e.type))return e.handled=!0,r="document",void s.send();throw S(e),e}))))),b.then(s.promise.resolve,s.promise.reject));const k={message:s};return(0,ge.Z)(k,["promise"]),k.promise=b,k}sendAlbum(e,t){return Yt(this,void 0,void 0,(function*(){if(t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId),1===t.sendFileDetails.length)return this.sendFile(e,Object.assign(Object.assign({},t),t.sendFileDetails[0]));e=this.appPeersManager.getPeerMigratedTo(e)||e;const a=t.replyToMsgId?(0,oe.Z)(t.replyToMsgId):void 0;let s=t.caption||"",n=t.entities||[];s&&(s=(0,ke.Z)(s,n)),this.log("sendAlbum",t);const i=""+ ++this.groupedTempId,r=[],o=e=>{r.push(e)},p=t.sendFileDetails.map(((r,p)=>{const d=Object.assign({isGroupedItem:!0,isMedia:t.isMedia,scheduleDate:t.scheduleDate,silent:t.silent,replyToMsgId:a,threadId:t.threadId,sendAsPeerId:t.sendAsPeerId,groupId:i,processAfter:o},r);return 0===p&&(d.caption=s,d.entities=n),this.sendFile(e,d).message}));t.clearDraft&&r.push((()=>{this.appDraftsManager.clearDraft(e,t.threadId)})),r.forEach((e=>{e()}));const d=(e,t)=>{this.onMessagesSendError([e],t),this.rootScope.dispatchEvent("messages_pending")},f=this.appPeersManager.getInputPeerById(e),c=s=>{this.setTyping(e,{_:"sendMessageCancelAction"},void 0,t.threadId);const n=(0,v.Z)();return this.sendSmthLazyLoadQueue.push({load:()=>this.apiManager.invokeApi("messages.sendMultiMedia",{peer:f,multi_media:s,reply_to_msg_id:a,schedule_date:t.scheduleDate,silent:t.silent,clear_draft:t.clearDraft,send_as:t.sendAsPeerId?this.appPeersManager.getInputPeerById(t.sendAsPeerId):void 0,update_stickersets_order:ea}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),n.resolve()}),(e=>{p.forEach((t=>d(t,e))),n.reject(e)}))}),n},l=p.map((e=>e.send().then((e=>Promise.all([e,this.apiManager.invokeApi("messages.uploadMedia",{peer:f,media:e})]))).then((([t,a])=>{let i;if("messageMediaPhoto"===a._){const e=this.appPhotosManager.savePhoto(a.photo);i=wt(e)}else if("messageMediaDocument"===a._){const e=this.appDocsManager.saveDoc(a.document);i=At(e)}["pFlags","ttl_seconds"].forEach((e=>{var a;i[e]=null!==(a=t[e])&&void 0!==a?a:i[e]}));const r={_:"inputSingleMedia",media:i,random_id:e.random_id,message:s,entities:n};return s&&(s="",n=[]),r})).catch((t=>{throw this.log.error("sendAlbum upload item error:",t,e),d(e,t),t}))));return Promise.all(l).then((e=>c(e.filter(Boolean))))}))}sendContact(e,t){return this.sendOther(e,this.appUsersManager.getContactMediaInput(t))}sendOther(e,t,a={}){var s;e=this.appPeersManager.getPeerMigratedTo(e)||e;const n=this.generateOutgoingMessage(e,a),i=a.replyToMsgId?(0,oe.Z)(a.replyToMsgId):void 0;let r;switch(t._){case"inputMediaPoll":{const e=""+n.id;t.poll.id=e,this.appPollsManager.savePoll(t.poll,{_:"pollResults",flags:4,total_voters:0,pFlags:{},recent_voters:[]});const{poll:a,results:s}=this.appPollsManager.getPoll(e);r={_:"messageMediaPoll",poll:a,results:s};break}case"inputMediaPhoto":r={_:"messageMediaPhoto",photo:this.appPhotosManager.getPhoto(t.id.id)};break;case"inputMediaDocument":r={_:"messageMediaDocument",document:this.appDocsManager.getDoc(t.id.id)};break;case"inputMediaContact":r={_:"messageMediaContact",phone_number:t.phone_number,first_name:t.first_name,last_name:t.last_name,user_id:null!==(s=t.user_id)&&void 0!==s?s:"0",vcard:t.vcard};break;case"inputMediaGeoPoint":r={_:"messageMediaGeo",geo:a.geoPoint};break;case"inputMediaVenue":r={_:"messageMediaVenue",geo:a.geoPoint,title:t.title,address:t.address,provider:t.provider,venue_id:t.venue_id,venue_type:t.venue_type};break;case"messageMediaPending":r=t.messageMedia}n.media=r;const o=e=>{this.onMessagesSendError([n],e),this.rootScope.dispatchEvent("messages_pending")};return n.send=()=>{const s={};this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId);const r=a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0;let p;return p=a.viaBotId?this.apiManager.invokeApiAfter("messages.sendInlineBotResult",{peer:this.appPeersManager.getInputPeerById(e),random_id:n.random_id,reply_to_msg_id:i||void 0,query_id:a.queryId,id:a.resultId,clear_draft:a.clearDraft,schedule_date:a.scheduleDate,silent:a.silent,send_as:r},s):this.apiManager.invokeApiAfter("messages.sendMedia",{peer:this.appPeersManager.getInputPeerById(e),media:t,random_id:n.random_id,reply_to_msg_id:i||void 0,message:"",clear_draft:a.clearDraft,schedule_date:a.scheduleDate,silent:a.silent,send_as:r,update_stickersets_order:ea},s),this.pendingAfterMsgs[e]=s,p.then((e=>{e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)})),this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{throw o(e),e})).finally((()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]}))},this.beforeMessageSending(n,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,sequential:!0}),n.promise}beforeMessageSending(e,t={}){const a=e.id,s=this.getMessagePeer(e),n=t.isScheduled?this.getScheduledMessagesStorage(s):this.getHistoryMessagesStorage(s);e.storageKey=n.key;const i=[];if(t.isScheduled)this.saveMessages([e],{storage:n,isScheduled:!0,isOutgoing:!0}),i.push((()=>{this.rootScope.dispatchEvent("scheduled_new",e)}));else{const r=[this.getHistoryStorage(s),t.threadId?this.getHistoryStorage(s,t.threadId):void 0];for(const e of r)e&&e.history.unshift(a);if(this.saveMessages([e],{storage:n,isOutgoing:!0}),this.setDialogTopMessage(e),t.threadId){const a=this.dialogsStorage.getForumTopic(s,t.threadId);a&&this.setDialogTopMessage(e,a)}i.push((()=>{this.rootScope.dispatchEvent("history_append",{storageKey:n.key,message:e})}))}const r=this.pendingByRandomId[e.random_id]={peerId:s,tempId:a,threadId:t.threadId,storage:n,sequential:t.sequential};return this.pendingTopMsgs[s]=a,!t.isGroupedItem&&e.send&&i.push((()=>{t.clearDraft&&this.appDraftsManager.clearDraft(s,t.threadId),e.send()})),i.length&&(t.processAfter||Xt)((()=>{for(const e of i)e()})),r}generateOutgoingMessage(e,t){let a;t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId);const s=this.appPeersManager.isBroadcast(e);if(s&&this.appPeersManager.getPeer(e).pFlags.signatures){const e=this.appUsersManager.getSelf();a=e.first_name+(e.last_name?" "+e.last_name:"")}const n={_:"message",id:this.generateTempMessageId(e),from_id:t.sendAsPeerId?this.appPeersManager.getOutputPeer(t.sendAsPeerId):this.generateFromId(e),peer_id:this.appPeersManager.getOutputPeer(e),post_author:a,pFlags:this.generateFlags(e),date:t.scheduleDate||(0,te.Z)(!0)+this.timeManager.getServerTimeOffset(),message:"",grouped_id:t.groupId,random_id:(0,Te.a)(),reply_to:this.generateReplyHeader(e,t.replyToMsgId,t.threadId),via_bot_id:t.viaBotId,reply_markup:t.replyMarkup,replies:this.generateReplies(e),views:s&&1,pending:!0};return(0,ge.Z)(n,["send","promise"]),void 0===t.groupId&&(n.promise=(0,v.Z)()),n}generateReplyHeader(e,t,a){const s=this.appPeersManager.isForum(e);if(s&&!a){const s=this.getMessageByPeer(e,t);s&&(a=(0,Qt.Z)(s,!0))}const n={_:"messageReplyHeader",reply_to_msg_id:t||a,pFlags:{}};return a&&s&&o.Ox!==a&&(n.pFlags.forum_topic=!0),a&&n.reply_to_msg_id!==a&&(n.reply_to_top_id=a),n}generateReplies(e){let t;if(this.appPeersManager.isBroadcast(e)){const a=this.appProfileManager.getCachedFullChat(e.toChatId());(null==a?void 0:a.linked_chat_id)&&(t={_:"messageReplies",flags:1,pFlags:{comments:!0},channel_id:a.linked_chat_id,replies:0,replies_pts:0})}return t}generateFromId(e){return this.appPeersManager.isAnyChat(e)&&(this.appPeersManager.isBroadcast(e)||this.isAnonymousSending(e))?void 0:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId())}generateFlags(e){const t={};return e!==this.appUsersManager.getSelf().id&&(t.out=!0,this.appPeersManager.isChannel(e)||this.appUsersManager.isBot(e)||(t.unread=!0)),this.appPeersManager.isBroadcast(e)&&(t.post=!0),t}generateForwardHeader(e,t){const a=this.appUsersManager.getSelf().id.toPeerId(),s=t.fromId;if(s===a&&t.peerId===a&&!t.fwd_from)return;const n={_:"messageFwdHeader",flags:0,date:t.date};let i=!1;if(t.fwd_from)n.from_id=t.fwd_from.from_id,n.from_name=t.fwd_from.from_name,n.post_author=t.fwd_from.post_author;else{if(n.post_author=t.post_author,s.isUser()){const e=this.appProfileManager.getCachedFullUser(s.toUserId());(null==e?void 0:e.private_forward_name)&&(n.from_name=e.private_forward_name,i=!0)}i||(n.from_id=this.appPeersManager.getOutputPeer(s))}return this.appPeersManager.isBroadcast(t.peerId)&&(t.post_author&&(n.post_author=t.post_author),n.channel_post=t.id),e!==a||i||(n.saved_from_msg_id=t.id,n.saved_from_peer=this.appPeersManager.getOutputPeer(t.peerId)),n}generateFakeAvatarMessage(e,t){const a=Number.MAX_SAFE_INTEGER,s={_:"messageService",pFlags:{},action:{_:"messageActionChannelEditPhoto",photo:t},id:a,peer_id:this.appPeersManager.getOutputPeer(e),mid:a,peerId:e,date:t.date,fromId:e};return this.getHistoryMessagesStorage(e).set(a,s),s}getUploadPromise(e){return this.uploadFilePromises[e]}isAnonymousSending(e){var t,a;return!!e.isAnyChat()&&(null===(a=null===(t=this.appPeersManager.getPeer(e).admin_rights)||void 0===t?void 0:t.pFlags)||void 0===a?void 0:a.anonymous)}setDialogTopMessage(e,t=this.getDialogOnly(e.peerId)){t&&(t.top_message=e.mid,this.getHistoryStorage(e.peerId,"forumTopic"===t._?t.id:void 0).maxId=e.mid,this.dialogsStorage.generateIndexForDialog(t,!1,e),this.scheduleHandleNewDialogs(e.peerId,t))}cancelPendingMessage(e){const t=this.pendingByRandomId[e];if(t){const{peerId:a,tempId:s,storage:n}=t,i=this.getHistoryStorage(a);return this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteMessages",messages:[s],pts:void 0,pts_count:void 0}),i.history.delete(s),delete this.pendingByRandomId[e],n.delete(s),!0}return!1}fillConversations(e){return Yt(this,void 0,void 0,(function*(){const t=this.middleware.get();for(;!this.dialogsStorage.isDialogsLoaded(e);){const a=yield this.getTopMessages({limit:100,folderId:e});if(!t()||a.isEnd)break}}))}getReadMaxIdIfUnread(e,t){var a,s,n;const i=this.getHistoryStorage(e,t);if(t&&!this.appChatsManager.isForum(e.toChatId())){const t=this.getHistoryStorage(e),n=Math.max(null!==(a=t.readMaxId)&&void 0!==a?a:0,i.readMaxId),r=this.getMessageByPeer(e,i.maxId);return!(null===(s=null==r?void 0:r.pFlags)||void 0===s?void 0:s.out)&&n{if(!n()||"messages.dialogsNotModified"===r._)return null;d.ZP&&this.log("messages.getDialogs result:",r),i||s||t===ye||this.dialogsStorage.resetPinnedOrder(t),i||s||this.appDraftsManager.addMissedDialogs(),this.appUsersManager.saveApiUsers(r.users),this.appChatsManager.saveApiChats(r.chats),this.saveMessages(r.messages);let p=!!s,c=!1;const l=new Map,m=t===ye?o.J$:t,g=!!i||t===ye,h=r.dialogs||r.topics;if((0,ne.Z)(h,(e=>{var t,s;if(e)if(i||null!==(t=(s=e).folder_id)&&void 0!==t||(s.folder_id=m),this.dialogsStorage.saveDialog({dialog:e,ignoreOffsetDate:!0,saveGlobalOffset:g}),void 0!==e.peerId)if(p||this.appPeersManager.isChannel(e.peerId||this.appPeersManager.getPeerId(e.peer))||(this.incrementMaxSeenId(e.top_message),p=!0),a&&(0,ce.Z)(e)>a&&(this.scheduleHandleNewDialogs(e.peerId,e),c=!0),i||(0,oe.Z)(e.read_inbox_max_id)||(0,oe.Z)(e.read_outbox_max_id)){if(e.top_message){const t=this.getMessageByPeer(e.peerId,e.top_message);t&&(this.setMessageUnreadByDialog(t,e),this.dialogsStorage.setDialogToState(e))}}else l.set(e.peerId,{dialog:e}),this.log.error("noIdsDialogs",e,f);else this.log.error("bugged dialog?",e)})),l.size){const e=[...l.keys()],t=e.map((e=>this.reloadConversation(e)));Promise.all(t).then((()=>{this.rootScope.dispatchEvent("dialogs_multiupdate",l);for(let t=0;t=u||!h.length;v&&this.dialogsStorage.setDialogsLoaded(t,!0),c?this.scheduleHandleNewDialogs():this.rootScope.dispatchEvent("dialogs_multiupdate",new Map);const P=h,b=100===e?P:P.slice(0,e);return{isEnd:v&&b[b.length-1]===P[P.length-1],count:u,dialogs:b}};let p,f;return p=i?this.apiManager.invokeApiSingleProcess({method:"channels.getForumTopics",params:f={channel:this.appChatsManager.getChannelInput(i.toChatId()),limit:100,offset_date:s,offset_id:0,offset_topic:0},options:{noErrorBox:!0},processResult:e=>(e=this.dialogsStorage.processTopics(i,e),r(e))}):this.apiManager.invokeApiSingleProcess({method:"messages.getDialogs",params:f={folder_id:t,offset_date:s,offset_id:0,offset_peer:this.appPeersManager.getInputPeerById(undefined),limit:100,hash:"0"},options:{noErrorBox:!0},processResult:r}),p}forwardMessages(e,t,a,s={}){return Yt(this,void 0,void 0,(function*(){delete s.replyToMsgId,delete s.threadId,e=this.appPeersManager.getPeerMigratedTo(e)||e;for(let n=0,i=(a=a.slice().sort(((e,t)=>e-t))).length;n{var i,p,d,f,c;const l=this.getMessageByPeer(t,n),m=this.generateOutgoingMessage(e,s);o.push(m.id);const g=["entities","media"];s.dropAuthor||(m.fwd_from=this.generateForwardHeader(e,l),g.push("views","forwards"),(null===(i=m.fwd_from)||void 0===i?void 0:i.from_name)&&e===this.appPeersManager.peerId&&delete m.from_id),s.dropCaptions&&l.media||g.push("message");const h=null===(p=l.reply_to)||void 0===p?void 0:p.reply_to_msg_id,u=a.indexOf(h);if(h&&-1!==u){const e=o[u];m.reply_to={_:"messageReplyHeader",reply_to_msg_id:e}}g.forEach((e=>{m[e]=(0,ve.Z)(l[e])}));const y=null===(d=m.media)||void 0===d?void 0:d.document;return y&&(["round","voice"].includes(y.type)&&(m.pFlags.media_unread=!0),y.sticker&&!this.rootScope.premium&&(0,Wt.Z)(y)&&(m.media.pFlags.nopremium=!0)),l.grouped_id&&(null!==(f=r[c=l.grouped_id])&&void 0!==f?f:r[c]={tempId:""+ ++this.groupedTempId,messages:[]}).messages.push(m),m}));for(const e in r){const t=r[e];t.messages.length>1&&t.messages.forEach((e=>{e.grouped_id=t.tempId}))}p.forEach((e=>{this.beforeMessageSending(e,{isScheduled:!!s.scheduleDate||void 0,sequential:!0})}));const d={};this.pendingAfterMsgs[e]&&(d.afterMessageId=this.pendingAfterMsgs[e].messageId);const f=this.apiManager.invokeApiAfter("messages.forwardMessages",{from_peer:this.appPeersManager.getInputPeerById(t),id:a.map((e=>(0,oe.Z)(e))),random_id:p.map((e=>e.random_id)),to_peer:this.appPeersManager.getInputPeerById(e),with_my_score:s.withMyScore,silent:s.silent,schedule_date:s.scheduleDate,drop_author:s.dropAuthor,drop_media_captions:s.dropCaptions,send_as:s.sendAsPeerId?this.appPeersManager.getInputPeerById(s.sendAsPeerId):void 0},d).then((e=>{this.log("forwardMessages updates:",e),this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{throw this.onMessagesSendError(p,e),e})).finally((()=>{this.pendingAfterMsgs[e]===d&&delete this.pendingAfterMsgs[e]}));this.pendingAfterMsgs[e]=d;const c=[f];return i.length&&c.push(this.forwardMessages(e,t,i,s)),Promise.all(c).then(jt.Z)}))}generateEmptyMessage(e){}onMessagesSendError(e,t){e.forEach((e=>{if(e.error!==t)if(t){e.error=t,this.rootScope.dispatchEvent("message_error",{storageKey:e.storageKey,tempId:e.mid,error:t});const a=this.getDialogOnly(e.peerId);a&&this.rootScope.dispatchEvent("dialog_unread",{peerId:e.peerId,dialog:a})}else delete e.error}))}getMessagesStorageByKey(e){const t=e.split("_"),a=+t[0];return"scheduled"===t[1]?this.getScheduledMessagesStorage(a):this.getHistoryMessagesStorage(a)}getMessageFromStorage(e,t){return"string"==typeof e&&(e=this.getMessagesStorageByKey(e)),e&&e.get(t)}createMessageStorage(e,t){const a=new Map;return a.peerId=e,a.type=t,a.key=`${e}_${t}`,a}getHistoryMessagesStorage(e){var t,a;return null!==(t=(a=this.messagesStorageByPeerId)[e])&&void 0!==t?t:a[e]=this.createMessageStorage(e,"history")}getMessagesStorage(e){return"object"==typeof e?e:this.getMessagesStorageByKey(e)}getMessageById(e){for(const t in this.messagesStorageByPeerId){if(this.appPeersManager.isChannel(t.toPeerId()))continue;const a=this.messagesStorageByPeerId[t].get(e);if(a)return a}return this.getMessageFromStorage(null,e)}getMessageByPeer(e,t){return e?this.getMessageFromStorage(this.getHistoryMessagesStorage(e),t):this.getMessageById(t)}getMessagePeer(e){return e.peer_id&&this.appPeersManager.getPeerId(e.peer_id)||o.NM}getDialogOnly(e){return this.dialogsStorage.getDialogOnly(e)}cantForwardDeleteMids(e,t){const a=this.getMessagesStorage(e);let s=!t.length,n=!t.length;for(const e of t){const t=this.getMessageFromStorage(a,e);if(s||(s=!this.canForward(t)),n||(n=!this.canDeleteMessage(t)),s&&n)break}return{cantForward:s,cantDelete:n}}reloadConversationOrTopic(e,t){t?this.dialogsStorage.getForumTopicById(e,t):this.reloadConversation(e)}reloadConversation(e){let t;if(void 0!==e){const a=this.appPeersManager.getPeerId(e);this.log.warn("reloadConversation",a);let s=this.reloadConversationsPeers.get(a);if(s&&(t=s.promise),t)return t;t=(0,v.Z)(),this.reloadConversationsPeers.set(a,s={inputDialogPeer:this.appPeersManager.getInputDialogPeerById(e),promise:t})}return this.reloadConversationsPromise||(this.reloadConversationsPromise=(0,P.Z)(0).then((()=>{const e=[],t={};for(const[a,{inputDialogPeer:s,promise:n}]of this.reloadConversationsPeers)e.push(s),t[a]=n;const a=()=>{for(const e in t)this.reloadConversationsPeers.delete(+e),t[e].resolve(void 0)};return(()=>Yt(this,void 0,void 0,(function*(){for(;;){const t=yield this.apiManager.invokeApi("messages.getPeerDialogs",{peers:e}),a=this.apiUpdatesManager.updatesState,{state:s}=t;if(!a.pts||a.pts===s.pts)return t;yield(0,P.Z)(500)}})))().then((e=>{for(const e in t)this.reloadConversationsPeers.delete(+e);this.dialogsStorage.applyDialogs(e),e.dialogs.forEach((e=>{const a=e.peerId;a&&(t[a].resolve(e),delete t[a])}))}),jt.Z).then((()=>{a(),this.reloadConversationsPromise=null,this.reloadConversationsPeers.size&&this.reloadConversation()}))}))),t||this.reloadConversationsPromise}doFlushHistory(e,t,a,s){let n;const i=n=>(this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:n.pts,pts_count:n.pts_count}}),!n.offset||this.doFlushHistory(e,t,a,s));return n=s?this.apiManager.invokeApiSingleProcess({method:"channels.deleteTopicHistory",params:{channel:this.appChatsManager.getChannelInput(e.toChatId()),top_msg_id:(0,oe.Z)(s)},processResult:i}):this.apiManager.invokeApiSingleProcess({method:"messages.deleteHistory",params:{just_clear:t,revoke:a,peer:this.appPeersManager.getInputPeerById(e),max_id:0},processResult:i}),n}flushHistory(e,t,a,s){return Yt(this,void 0,void 0,(function*(){if(this.appPeersManager.isChannel(e)&&!s){const t=this.getHistory(e,0,1),a=yield t,s=e.toChatId(),n=a.history[0]||0;return this.apiManager.invokeApiSingle("channels.deleteHistory",{channel:this.appChatsManager.getChannelInput(s),max_id:(0,oe.Z)(n)}).then((e=>(e&&this.apiUpdatesManager.processLocalUpdate({_:"updateChannelAvailableMessages",channel_id:s,available_min_id:n}),e)))}return this.doFlushHistory(e,t,a,s).then((()=>{if(s||this.flushStoragesByPeerId(e),t)this.rootScope.dispatchEvent("dialog_flush",{peerId:e,dialog:this.getDialogOnly(e)});else{const t=this.getTypingKey(e,s);if(delete this.notificationsToHandle[t],delete this.typings[t],!s){const t=this.reloadConversationsPeers.get(e);t&&(this.reloadConversationsPeers.delete(e),t.promise.resolve(void 0))}this.dialogsStorage.dropDialogOnDeletion(e,s)}}))}))}flushStoragesByPeerId(e){[this.historiesStorage,this.threadsStorage,this.searchesStorage,this.pendingAfterMsgs,this.pendingTopMsgs].forEach((t=>{delete t[e]}));for(const t in this.pinnedMessages)(+t===e||t.startsWith(e+"_"))&&delete this.pinnedMessages[t];const t=this.needSingleMessages.get(e);if(t){for(const[e,a]of t)a.resolve(this.generateEmptyMessage(e));t.clear()}[this.messagesStorageByPeerId,this.scheduledMessagesStorage].forEach((t=>{const a=t[e];a&&a.clear()})),this.dialogsStorage.flushForumTopicsCache(e)}hidePinnedMessages(e){return Promise.all([this.appStateManager.getState(),this.getPinnedMessage(e)]).then((([t,a])=>{t.hiddenPinnedMessages[e]=a.maxId,this.rootScope.dispatchEvent("peer_pinned_hidden",{peerId:e,maxId:a.maxId})}))}getPinnedMessagesKey(e,t){return e+(t?"_"+t:"")}getPinnedMessage(e,t){var a,s,n;const i=null!==(a=(s=this.pinnedMessages)[n=this.getPinnedMessagesKey(e,t)])&&void 0!==a?a:s[n]={};return i.promise?i.promise:i.maxId?Promise.resolve(i):i.promise=this.getSearch({peerId:e,inputFilter:{_:"inputMessagesFilterPinned"},maxId:0,limit:1,threadId:t}).then((e=>{var t;return i.count=e.count,i.maxId=null===(t=e.history[0])||void 0===t?void 0:t.mid,i})).finally((()=>{delete i.promise}))}getPinnedMessagesCount(e,t){var a;return null===(a=this.pinnedMessages[this.getPinnedMessagesKey(e,t)])||void 0===a?void 0:a.count}getPinnedMessagesMaxId(e,t){var a;return null===(a=this.pinnedMessages[this.getPinnedMessagesKey(e,t)])||void 0===a?void 0:a.maxId}updatePinnedMessage(e,t,a,s,n){return this.apiManager.invokeApi("messages.updatePinnedMessage",{peer:this.appPeersManager.getInputPeerById(e),unpin:a,silent:s,pm_oneside:n,id:(0,oe.Z)(t)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}unpinAllMessages(e){return this.apiManager.invokeApiSingle("messages.unpinAllMessages",{peer:this.appPeersManager.getInputPeerById(e)}).then((t=>(this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:t.pts,pts_count:t.pts_count}}),t.offset?this.unpinAllMessages(e):(this.getHistoryMessagesStorage(e).forEach((e=>{e.pFlags.pinned&&delete e.pFlags.pinned})),this.rootScope.dispatchEvent("peer_pinned_messages",{peerId:e,unpinAll:!0}),delete this.pinnedMessages[this.getPinnedMessagesKey(e)],!0))))}getAlbumText(e){const t=this.groupedMessagesStorage[e];return(0,Ht.Z)(Array.from(t.values()))}getGroupsFirstMessage(e){if(!(null==e?void 0:e.grouped_id))return e;const t=this.groupedMessagesStorage[e.grouped_id];let a=Number.MAX_SAFE_INTEGER;for(const[e,s]of t)s.midthis.getMessageFromStorage(a,e)))}getMidsByMessage(e){return e?e.grouped_id?this.getMidsByAlbum(e.grouped_id):[e.mid]:[]}filterMessages(e,t){const a=[];if(e.grouped_id){const s=this.groupedMessagesStorage[e.grouped_id];for(const[e,n]of s)t(n)&&a.push(n)}else t(e)&&a.push(e);return a}generateTempMessageId(e){const t=this.getDialogOnly(e);return this.appMessagesIdsManager.generateTempMessageId((null==t?void 0:t.top_message)||0)}setMessageUnreadByDialog(e,t=this.getDialogOnly(e.peerId)){t&&e.mid&&e.mid>t[e.pFlags.out?"read_outbox_max_id":"read_inbox_max_id"]&&(e.pFlags.unread=!0)}saveMessage(e,t={}){var a,s,n,i,r;if(!e||"messageEmpty"===e._)return;null!==(a=e.pFlags)&&void 0!==a||(e.pFlags={});const p=this.getMessagePeer(e),d=t.storage||this.getHistoryMessagesStorage(p),f="peerChannel"===e.peer_id._,c=f&&this.appChatsManager.isBroadcast(p.toChatId()),l="message"===e._;t.isOutgoing&&(e.pFlags.is_outgoing=!0);const m=(0,pe.Z)(e.id);e.mid=m,l&&(t.isScheduled&&(e.pFlags.is_scheduled=!0),e.grouped_id&&(null!==(s=(i=this.groupedMessagesStorage)[r=e.grouped_id])&&void 0!==s?s:i[r]=this.createMessageStorage(p,"grouped")).set(m,e),e.via_bot_id&&(e.viaBotId=e.via_bot_id));const g=e.reply_to;g&&(g.reply_to_msg_id&&(g.reply_to_msg_id=e.reply_to_mid=(0,pe.Z)(g.reply_to_msg_id)),g.reply_to_top_id&&(g.reply_to_top_id=(0,pe.Z)(g.reply_to_top_id)));const h=l&&e.replies;h&&(h.max_id&&(h.max_id=(0,pe.Z)(h.max_id)),h.read_max_id&&(h.read_max_id=(0,pe.Z)(h.read_max_id)));const u=!!p;u||(e.date-=this.timeManager.getServerTimeOffset());const y=this.appPeersManager.peerId,_=l&&e.fwd_from;if(e.peerId=p,e.fromId=p===y?_?_.from_id?this.appPeersManager.getPeerId(_.from_id):o.NM:y:e.pFlags.post||!e.from_id?p:this.appPeersManager.getPeerId(e.from_id),this.setMessageUnreadByDialog(e),_){_.saved_from_msg_id&&(_.saved_from_msg_id=(0,pe.Z)(_.saved_from_msg_id)),_.channel_post&&(_.channel_post=(0,pe.Z)(_.channel_post));const t=_.saved_from_peer||_.from_id,a=_.saved_from_msg_id||_.channel_post;if(t&&a){const s=this.appPeersManager.getPeerId(t),n=(0,pe.Z)(a);e.savedFrom=s+"_"+n}e.fwdFromId=this.appPeersManager.getPeerId(_.from_id),u||(_.date-=this.timeManager.getServerTimeOffset())}const v={type:"message",peerId:p,messageId:m};let P=!1;const b=l&&e.media;if(b)switch(b._){case"messageMediaEmpty":delete e.media;break;case"messageMediaPhoto":b.ttl_seconds?P=!0:b.photo=this.appPhotosManager.savePhoto(b.photo,v),b.photo||delete e.media;break;case"messageMediaPoll":{const t=this.appPollsManager.savePoll(b.poll,b.results,e);b.poll=t.poll,b.results=t.results;break}case"messageMediaDocument":if(b.ttl_seconds)P=!0;else{const e=b.document;b.document=this.appDocsManager.saveDoc(e,v),b.document||"documentEmpty"===e._||(P=!0)}break;case"messageMediaWebPage":{const a=this.appWebPagesManager.getMessageKeyForPendingWebPage(p,m,t.isScheduled);b.webpage=this.appWebPagesManager.saveWebPage(b.webpage,a,v),b.webpage||delete e.media;break}case"messageMediaInvoice":{b.photo=this.appWebDocsManager.saveWebDocument(b.photo);const e=b.extended_media;if("messageExtendedMedia"===(null==e?void 0:e._)){const t=e.media;t.photo=this.appPhotosManager.savePhoto(t.photo,v),t.document=this.appDocsManager.saveDoc(t.document,v)}break}case"messageMediaUnsupported":P=!0}if(l&&P&&(e.media={_:"messageMediaUnsupported"},e.message="",delete e.entities,delete e.totalEntities),!l&&e.action){const t=e.action,a=e.fromId===this.appUsersManager.getSelf().id?"You":"";let s,i;switch(t.photo&&(t.photo=this.appPhotosManager.savePhoto(t.photo,v)),t.document&&(t.document=this.appDocsManager.saveDoc(t.photo,v)),t._){case"messageActionChatEditPhoto":(null===(n=t.photo)||void 0===n?void 0:n.video_sizes)?t._=c?"messageActionChannelEditVideo":"messageActionChatEditVideo":c&&(t._="messageActionChannelEditPhoto");break;case"messageActionGroupCall":{let e;this.appGroupCallsManager.saveGroupCall(t.call),e=void 0===t.duration?"started":"ended",c||(e+="_by"+a),t.type=e;break}case"messageActionChatEditTitle":c&&(t._="messageActionChannelEditTitle");break;case"messageActionChatDeletePhoto":c&&(t._="messageActionChannelDeletePhoto");break;case"messageActionChatAddUser":1===t.users.length?(t.user_id=t.users[0],e.fromId===t.user_id&&(t._=f?"messageActionChatJoined"+a:"messageActionChatReturn"+a)):t.users.length>1&&(t._="messageActionChatAddUsers");break;case"messageActionChatDeleteUser":e.fromId===t.user_id&&(t._="messageActionChatLeave"+a);break;case"messageActionChannelMigrateFrom":s=t.chat_id.toPeerId(!0),i=p;break;case"messageActionChatMigrateTo":s=p,i=t.channel_id.toPeerId(!0);break;case"messageActionHistoryClear":e.clear_history=!0,delete e.pFlags.out,delete e.pFlags.unread;break;case"messageActionPhoneCall":t.type=(t.pFlags.video?"video_":"")+(void 0!==t.duration?e.pFlags.out?"out_":"in_":"")+(void 0!==t.duration?"ok":"phoneCallDiscardReasonMissed"===t.reason._?"missed":"cancelled")}s&&i&&!this.migratedFromTo[s]&&!this.migratedToFrom[i]&&this.migrateChecks(s,i)}return l&&e.message.length&&!e.totalEntities&&this.wrapMessageEntities(e),d.set(m,e),e}saveMessages(e,t={}){return e.saved||(e.saved=!0,e.forEach(((e,a,s)=>{s[a]=this.saveMessage(e,t)}))),e}getFirstMessageToEdit(e,t){return Yt(this,void 0,void 0,(function*(){const a=this.getHistoryStorage(e,t).history.slice;if(a.isEnd(se.D.Bottom)&&a.length){let t;const s=this.appPeersManager.peerId;for(const n of a){const a=this.getMessageByPeer(e,n);if((s===e?a.fromId===s:a.pFlags.out)&&(yield this.canEditMessage(a,"text"))){t=a;break}}return t}}))}wrapMessageEntities(e){const t=e.entities?e.entities.slice():[];e.message=(0,Pt.Z)(e.message,t);const a=(0,Lt.Z)(e.message);e.totalEntities=(0,Ot.Z)(t,a)}reportMessages(e,t,a,s){return this.apiManager.invokeApiSingle("messages.report",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e))),reason:{_:a},message:s})}startBot(e,t,a){const s=t?t.toPeerId(!0):e.toPeerId();if(a){const t=(0,Te.a)();return this.apiManager.invokeApi("messages.startBot",{bot:this.appUsersManager.getUserInput(e),peer:this.appPeersManager.getInputPeerById(s),random_id:t,start_param:a}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}const n="/start";if(t){let a;return a=this.appChatsManager.isChannel(t)?this.appChatsManager.inviteToChannel(t,[e]):this.appChatsManager.addChatUser(t,e,0),a.catch((e=>{if("USER_ALREADY_PARTICIPANT"!=(null==e?void 0:e.type))throw e;e.handled=!0})).then((()=>this.sendText(s,n+"@"+this.appPeersManager.getPeerUsername(e.toPeerId()))))}return this.sendText(s,n)}editPeerFolders(e,t){this.apiManager.invokeApi("folders.editPeerFolders",{folder_peers:e.map((e=>({_:"inputFolderPeer",peer:this.appPeersManager.getInputPeerById(e),folder_id:t})))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}getFilter(e){return this.filtersStorage.getFilter(e)}toggleDialogPin(e){var t;return Yt(this,void 0,void 0,(function*(){const{peerId:a,topicId:s,filterId:n=(s?a:void 0)}=e;if(void 0===n)throw new Error("No filterId");if(n>1)return this.filtersStorage.toggleDialogPin(a,n);const i=this.dialogsStorage.getDialogOrTopic(a,s);if(!i)throw void 0;const r=!(null===(t=i.pFlags)||void 0===t?void 0:t.pinned)||void 0;if(r){const e=yield this.apiManager.getLimit(s?"topicPin":1===n?"folderPin":"pin");if(this.dialogsStorage.getPinnedOrders(n).length>=e)throw(0,X.Z)(s?"PINNED_TOO_MUCH":"PINNED_DIALOGS_TOO_MUCH")}return s?this.appChatsManager.updatePinnedForumTopic(a.toChatId(),s,r):this.apiManager.invokeApi("messages.toggleDialogPin",{peer:this.appPeersManager.getInputDialogPeerById(a),pinned:r}).then((e=>{const t=r?{pinned:r}:{};this.apiUpdatesManager.saveUpdate({_:"updateDialogPinned",peer:this.appPeersManager.getDialogPeer(a),folder_id:n,pFlags:t})}))}))}markDialogUnread(e,t){var a;const s=this.getDialogOnly(e);if(!s)return Promise.reject();const n=!t&&!(null===(a=s.pFlags)||void 0===a?void 0:a.unread_mark)||void 0;return this.apiManager.invokeApi("messages.markDialogUnread",{peer:this.appPeersManager.getInputDialogPeerById(e),unread:n}).then((t=>{if(t){const t=n?{unread:n}:{};this.onUpdateDialogUnreadMark({_:"updateDialogUnreadMark",peer:this.appPeersManager.getDialogPeer(e),pFlags:t})}}))}migrateChecks(e,t){if(!this.migratedFromTo[e]&&!this.migratedToFrom[t]&&this.appChatsManager.hasChat(t.toChatId())){const a=this.appChatsManager.getChat(e.toChatId());(null==a?void 0:a.migrated_to)&&a.migrated_to.channel_id===t.toChatId()&&(this.migratedFromTo[e]=t,this.migratedToFrom[t]=e,this.rootScope.dispatchEvent("dialog_migrate",{migrateFrom:e,migrateTo:t}),this.dialogsStorage.dropDialogWithEvent(e))}}canMessageBeEdited(e,t){var a,s;if(null===(a=null==e?void 0:e.pFlags)||void 0===a?void 0:a.is_outgoing)return!1;const n=["messageMediaPhoto","messageMediaDocument","messageMediaWebPage"];return"poll"===t&&n.push("messageMediaPoll"),!(!e||"message"!==e._||e.deleted||e.fwd_from||e.via_bot_id||e.media&&-1===n.indexOf(e.media._)||e.fromId&&this.appUsersManager.isBot(e.fromId)||"messageMediaDocument"===(null===(s=e.media)||void 0===s?void 0:s._)&&(e.media.document.sticker||"round"===e.media.document.type))}canEditMessage(e,t="text"){var a;return Yt(this,void 0,void 0,(function*(){return!(!e||!this.canMessageBeEdited(e,t))&&(this.getMessagePeer(e)===this.appUsersManager.getSelf().id||!(!(this.appPeersManager.isBroadcast(e.peerId)?this.appChatsManager.hasRights(e.peerId.toChatId(),"edit_messages"):e.pFlags.out)||"peerChannel"!==e.peer_id._&&e.date<(0,te.Z)(!0)-(yield this.apiManager.getConfig()).edit_time_limit&&"messageMediaPoll"!==(null===(a=e.media)||void 0===a?void 0:a._)))}))}canDeleteMessage(e){return e&&(e.peerId.isUser()||e.pFlags.out||"chat"===this.appChatsManager.getChat(e.peerId.toChatId())._||this.appChatsManager.hasRights(e.peerId.toChatId(),"delete_messages"))&&(!e.pFlags.is_outgoing||!!e.error)}getReplyKeyboard(e){return this.getHistoryStorage(e).replyMarkup}mergeReplyKeyboard(e,t){var a,s;if(!t)return!1;const n=t.reply_markup;if(!n&&!(null===(a=t.pFlags)||void 0===a?void 0:a.out)&&!t.action)return!1;if("replyInlineMarkup"===(null==n?void 0:n._))return!1;const i=e.replyMarkup;if(n)return!(i&&i.mid>=t.mid||n.pFlags.selective||(e.maxOutId&&t.midi.mid||t.pFlags.is_outgoing)&&t.message)return i.pFlags.hidden=!0,!0}else(!e.maxOutId||t.mid>e.maxOutId)&&(e.maxOutId=t.mid);return(0,ue.Z)(t),!("messageActionChatDeleteUser"!==(null===(s=t.action)||void 0===s?void 0:s._)||!(i?t.action.user_id===i.fromId:this.appUsersManager.isBot(t.action.user_id))||(e.replyMarkup={_:"replyKeyboardHide",mid:t.mid,pFlags:{}},0))}getSearchStorage(e,t){return this.searchesStorage[e]||(this.searchesStorage[e]={}),this.searchesStorage[e][t]||(this.searchesStorage[e][t]={history:[]}),this.searchesStorage[e][t]}getSearchCounters(e,t,a=!0,s){return this.appPeersManager.isPeerRestricted(e)?Promise.resolve(t.map((e=>({_:"messages.searchCounter",pFlags:{},filter:e,count:0})))):(a?this.apiManager.invokeApiCacheable:this.apiManager.invokeApi).bind(this.apiManager)("messages.getSearchCounters",{peer:this.appPeersManager.getInputPeerById(e),filters:t,top_msg_id:s?(0,oe.Z)(s):void 0})}filterMessagesByInputFilterFromStorage(e,t,a,s){const n=this.getMessagesStorage(a);return(0,Nt.Z)(e,t.map((e=>n.get(e))),s)}getSearch({peerId:e,query:t,inputFilter:a,maxId:s,limit:n,nextRate:i,backLimit:r,threadId:o,folderId:p,minDate:f,maxDate:c}){if(this.appPeersManager.isPeerRestricted(e))return Promise.resolve({count:0,offset_id_offset:0,next_rate:void 0,history:[]});t||(t=""),a||(a={_:"inputMessagesFilterEmpty"}),void 0===n&&(n=20),i||(i=0),r||(r=0),f=f?f/1e3|0:0,c=c?c/1e3|0:0;let l=[];r&&(n+=r);let m;if(!e||r||s||t||1===n||o||(m=this.getHistoryStorage(e),l=this.filterMessagesByInputFilterFromStorage(a._,m.history.slice,this.getHistoryMessagesStorage(e),n)),l.length){if(!(l.length{this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.saveMessages(e.messages),d.ZP&&this.log("getSearch result:",a,e);const t=e.count||l.length+e.messages.length;return e.messages.forEach((e=>{const t=this.getMessagePeer(e);if(t.isAnyChat()){const e=this.appChatsManager.getChat(t.toChatId());e.migrated_to&&this.migrateChecks(t,e.migrated_to.channel_id.toPeerId(!0))}l.push(e)})),{count:t,offset_id_offset:e.offset_id_offset||0,next_rate:e.next_rate,history:l}}))}subscribeRepliesThread(e,t){const a=e+"_"+t;for(const e in this.threadsToReplies)if(this.threadsToReplies[e]===a)return;this.getDiscussionMessage(e,t)}generateThreadServiceStartMessage(e){const t=e.peerId+"_"+e.mid;if(this.threadsServiceMessagesIdsStorage[t])return;const a=(0,oe.Z)(Math.max(...this.getMidsByMessage(e))),s={_:"messageService",pFlags:{is_single:!0},id:this.appMessagesIdsManager.generateTempMessageId(a),date:e.date,from_id:{_:"peerUser",user_id:o.NM},peer_id:e.peer_id,action:{_:"messageActionDiscussionStarted"},reply_to:this.generateReplyHeader(e.peerId,e.id)};this.saveMessages([s],{isOutgoing:!0}),this.threadsServiceMessagesIdsStorage[t]=s.mid}getThreadServiceMessageId(e,t){return this.threadsServiceMessagesIdsStorage[e+"_"+t]}getDiscussionMessage(e,t){return this.apiManager.invokeApiSingle("messages.getDiscussionMessage",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((a=>{var s;this.appChatsManager.saveApiChats(a.chats),this.appUsersManager.saveApiUsers(a.users),this.saveMessages(a.messages);const n=this.getMessageWithReplies(a.messages[0]),i=n.peerId+"_"+n.mid;this.generateThreadServiceStartMessage(n);const r=this.getHistoryStorage(n.peerId,n.mid),o=a.max_id=(0,pe.Z)(a.max_id)||0;a.read_inbox_max_id=r.readMaxId=(0,pe.Z)(null!==(s=a.read_inbox_max_id)&&void 0!==s?s:n.mid),a.read_outbox_max_id=r.readOutboxMaxId=(0,pe.Z)(a.read_outbox_max_id)||0;const p=r.history.first;return r.maxId&&r.maxId{this.newDialogsHandlePromise=void 0,this.handleNewDialogs()}))}deleteMessages(e,t,a){var s,n;return Yt(this,void 0,void 0,(function*(){let i;const r=yield this.apiManager.getConfig(),o=t.splice(r.forwarded_count_max,t.length-r.forwarded_count_max),p=t.map((e=>(0,oe.Z)(e)));if(e.isAnyChat()&&this.appPeersManager.isChannel(e)){const a=e.toChatId(),r=this.appChatsManager.getChat(a);if(!r.pFlags.creator&&!(null===(n=null===(s=r.admin_rights)||void 0===s?void 0:s.pFlags)||void 0===n?void 0:n.delete_messages)&&!(t=t.filter((t=>!!this.getMessageByPeer(e,t).pFlags.out))).length)return;i=this.apiManager.invokeApi("channels.deleteMessages",{channel:this.appChatsManager.getChannelInput(a),id:p}).then((e=>{this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteChannelMessages",channel_id:a,messages:t,pts:e.pts,pts_count:e.pts_count})}))}else i=this.apiManager.invokeApi("messages.deleteMessages",{revoke:a,id:p}).then((e=>{this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteMessages",messages:t,pts:e.pts,pts_count:e.pts_count})}));const d=[i];return o.length&&d.push(this.deleteMessages(e,o,a)),Promise.all(d).then(jt.Z)}))}readHistory(e,t=0,a,s=!1){if(this.log("readHistory:",e,t,a),!this.getReadMaxIdIfUnread(e,a)){if(a&&!s){const t=this.dialogsStorage.getForumTopic(e,a);(0,oe.Z)(t.read_inbox_max_id)||(s=!0)}if(!s){const t=this.appChatsManager.isForum(e.toChatId())&&a?this.dialogsStorage.getForumTopic(e,a):this.getDialogOnly(e);t&&this.isDialogUnread(t)&&(s=!0)}if(!s)return this.log("readHistory: isn't unread"),Promise.resolve()}const n=this.getHistoryStorage(e,a);if(n.triedToReadMaxId>=t)return Promise.resolve();let i;return a?(n.readPromise||(i=this.apiManager.invokeApi("messages.readDiscussion",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(a),read_max_id:(0,oe.Z)(t)})),this.apiUpdatesManager.processLocalUpdate({_:"updateReadChannelDiscussionInbox",channel_id:e.toChatId(),top_msg_id:a,read_max_id:t})):this.appPeersManager.isChannel(e)?(n.readPromise||(i=this.apiManager.invokeApi("channels.readHistory",{channel:this.appChatsManager.getChannelInput(e.toChatId()),max_id:(0,oe.Z)(t)})),this.apiUpdatesManager.processLocalUpdate({_:"updateReadChannelInbox",max_id:t,channel_id:e.toChatId(),still_unread_count:void 0,pts:void 0})):(n.readPromise||(i=this.apiManager.invokeApi("messages.readHistory",{peer:this.appPeersManager.getInputPeerById(e),max_id:(0,oe.Z)(t)}).then((e=>{this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:e.pts,pts_count:e.pts_count}})}))),this.apiUpdatesManager.processLocalUpdate({_:"updateReadHistoryInbox",max_id:t,peer:this.appPeersManager.getOutputPeer(e),still_unread_count:void 0,pts:void 0,pts_count:void 0})),this.rootScope.dispatchEvent("notification_reset",this.appPeersManager.getPeerString(e)),n.readPromise?n.readPromise:(n.triedToReadMaxId=t,i.finally((()=>{delete n.readPromise;const{readMaxId:s}=n;this.log("readHistory: promise finally",t,s),s>t&&this.readHistory(e,s,a,!0)})),n.readPromise=i)}readAllHistory(e,t,a=!1){const s=this.getHistoryStorage(e,t);s.maxId&&this.readHistory(e,s.maxId,t,a)}getUnreadMentionsKey(e,t){return e+(t?`_${t}`:"")}fixDialogUnreadMentionsIfNoMessage(e,t){const a=this.dialogsStorage.getDialogOrTopic(e,t);(null==a?void 0:a.unread_mentions_count)&&this.reloadConversationOrTopic(e)}modifyCachedMentions(e,t,a,s){const n=this.unreadMentions[this.getUnreadMentionsKey(e,s)];n&&(a?n.first.isEnd(se.D.Top)&&n.insertSlice([t]):n.delete(t))}fixUnreadMentionsCountIfNeeded(e,t,a){const s=this.dialogsStorage.getDialogOrTopic(e,a);!t.length&&(null==s?void 0:s.unread_mentions_count)&&this.reloadConversationOrTopic(e)}goToNextMention(e,t){var a,s;const n=this.getUnreadMentionsKey(e,t),i=this.goToNextMentionPromises[n];if(i)return i;const r=null!==(a=(s=this.unreadMentions)[e])&&void 0!==a?a:s[e]=new se.Z,o=r.length,p=r.first.isEnd(se.D.Top);if(!o&&p)return this.fixUnreadMentionsCountIfNeeded(e,r,t),Promise.resolve();let d=Promise.resolve();return!p&&o<25&&(d=this.loadNextMentions(e,t)),this.goToNextMentionPromises[n]=d.then((()=>{const a=r.last,s=a&&a[a.length-1];if(s)return r.delete(s),s;this.fixUnreadMentionsCountIfNeeded(e,r,t)})).finally((()=>{delete this.goToNextMentionPromises[n]}))}loadNextMentions(e,t){const a=this.unreadMentions[e],s=a.first[0]||1;return this.getUnreadMentions(e,s,-50,50,void 0,void 0,t).then((e=>{this.mergeHistoryResult(a,e,1===s?0:s,50,-50)}))}getUnreadMentions(e,t,a,s,n=0,i=0,r){return this.apiManager.invokeApiSingleProcess({method:"messages.getUnreadMentions",params:{peer:this.appPeersManager.getInputPeerById(e),offset_id:(0,oe.Z)(t),add_offset:a,limit:s,max_id:(0,oe.Z)(n),min_id:(0,oe.Z)(i),top_msg_id:r?(0,oe.Z)(r):void 0},processResult:e=>((0,ue.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.saveMessages(e.messages),e)})}readMessages(e,t){if(!t.length)return Promise.resolve();let a,s;if(t=t.map((e=>(0,oe.Z)(e))),e.isAnyChat()&&this.appPeersManager.isChannel(e)){const n=e.toChatId();s={_:"updateChannelReadMessagesContents",channel_id:n,messages:t},a=this.apiManager.invokeApi("channels.readMessageContents",{channel:this.appChatsManager.getChannelInput(n),id:t})}else s={_:"updateReadMessagesContents",messages:t,pts:void 0,pts_count:void 0},a=this.apiManager.invokeApi("messages.readMessageContents",{id:t}).then((e=>{s.pts=e.pts,s.pts_count=e.pts_count,this.apiUpdatesManager.processLocalUpdate(s)}));return this.apiUpdatesManager.processLocalUpdate(s),a}getHistoryStorage(e,t){var a,s,n,i,r,o;return t?null!==(s=(r=null!==(a=(i=this.threadsStorage)[e])&&void 0!==a?a:i[e]={})[t])&&void 0!==s?s:r[t]={count:null,history:new se.Z}:null!==(n=(o=this.historiesStorage)[e])&&void 0!==n?n:o[e]={count:null,history:new se.Z}}getHistoryStorageTransferable(e,t){const a=this.getHistoryStorage(e,t),{count:s,history:n,maxId:i,readMaxId:r,readOutboxMaxId:o,maxOutId:p,replyMarkup:d}=a;return{count:s,history:void 0,historySerialized:n.toJSON(),maxId:i,readMaxId:r,readOutboxMaxId:o,maxOutId:p,replyMarkup:d}}getNotifyPeerSettings(e,t){const a=this.appPeersManager.getInputNotifyPeerById({peerId:e,ignorePeerId:!0,threadId:t});return Promise.all([this.appNotificationsManager.getNotifyPeerTypeSettings(),this.appNotificationsManager.getNotifySettings(a)]).then((([a,s])=>({muted:this.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!0,threadId:t}),peerTypeNotifySettings:s})))}getUpdateAfterReloadKey(e,t){return e+(t?"_"+t:"")}handleNewUpdateAfterReload(e,t,a){var s,n,i;const r=null!==(s=(n=this.newUpdatesAfterReloadToHandle)[i=this.getUpdateAfterReloadKey(e,a)])&&void 0!==s?s:n[i]=new Set;r.has(t)?this.log.error("here we go again",e):(t.ignoreExisting=!0,r.add(t),this.scheduleHandleNewDialogs(e,a))}setDialogToStateIfMessageIsTop(e){this.isMessageIsTopMessage(e)&&this.dialogsStorage.setDialogToState(this.getDialogOnly(e.peerId))}isMessageIsTopMessage(e){const t=this.getDialogOnly(e.peerId);return t&&t.top_message===e.mid}updateMessageRepliesIfNeeded(e){try{const t=this.getThreadKey(e);if(t){const e=this.threadsToReplies[t];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}}catch(t){this.log.error("incrementMessageReplies err",t,e)}}getThreadKey(e){var t;let a="";if(null===(t=null==e?void 0:e.peerId)||void 0===t?void 0:t.isAnyChat()){const t=(0,Qt.Z)(e,this.appChatsManager.isForum(e.peerId.toChatId()));t&&(a=e.peerId+"_"+t)}return a}updateMessage(e,t,a){return this.reloadMessages(e,t,!0).then((()=>{const s=this.getMessageByPeer(e,t);if(s)return a&&this.rootScope.dispatchEvent(a,s),s}))}checkPendingMessage(e){const t=this.pendingByMessageId[e.mid];let a;if(t){const s=this.pendingByRandomId[t];(a=this.finalizePendingMessage(t,e))&&this.rootScope.dispatchEvent("history_update",{storageKey:s.storage.key,message:e,sequential:s.sequential}),delete this.pendingByMessageId[e.mid]}return a}mutePeer(e){if(!(e=this.appNotificationsManager.validatePeerSettings(e)))return;const{peerId:t,muteUntil:a,threadId:s}=e,n={_:"inputPeerNotifySettings"};n.mute_until=a;const i=this.appPeersManager.getInputPeerById(t);return this.appNotificationsManager.updateNotifySettings(s?{_:"inputNotifyForumTopic",peer:i,top_msg_id:(0,oe.Z)(s)}:{_:"inputNotifyPeer",peer:i},n)}togglePeerMute({peerId:e,mute:t,threadId:a}){return void 0===t&&(t=!this.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!1,threadId:a})),this.mutePeer({peerId:e,muteUntil:t?o.rU:0,threadId:a})}findPeerIdByMids(e){for(let t=e.length-1;t>=0;--t){const a=e[t],s=this.getMessageById(a);if(s)return s.peerId}}canSendToPeer(e,t,a="send_messages"){var s;if(this.appPeersManager.isPeerRestricted(e))return!1;if(e.isAnyChat()){const n=e.toChatId();if(t){const a=this.dialogsStorage.getForumTopic(e,t);if((null===(s=null==a?void 0:a.pFlags)||void 0===s?void 0:s.closed)&&!this.appChatsManager.hasRights(n,"manage_topics"))return!1}const i=this.appChatsManager.getChat(n);return this.appChatsManager.hasRights(n,a,void 0,!!t)&&(!i.pFlags.left||!!t)}return this.appUsersManager.canSendToUser(e)}finalizePendingMessage(e,t){const a=this.pendingByRandomId[e];if(!a)return;const{peerId:s,tempId:n,threadId:i,storage:r}=a;[this.getHistoryStorage(s),i?this.getHistoryStorage(s,i):void 0].filter(Boolean).forEach((e=>{e.history.delete(n)}));const o=this.getMessageFromStorage(r,n);return o&&(delete t.pFlags.is_outgoing,delete t.pending,delete t.error,delete t.random_id,delete t.send),this.rootScope.dispatchEvent("messages_pending"),delete this.pendingByRandomId[e],this.finalizePendingMessageCallbacks(r,n,t),o}finalizePendingMessageCallbacks(e,t,a){const s=this.tempFinalizeCallbacks[t];if(void 0!==s){for(const e in s){const{deferred:t,callback:n}=s[e];n(a).then(t.resolve,t.reject)}delete this.tempFinalizeCallbacks[t]}if(a.media){(0,ue.Z)(a);const{photo:e,document:s}=a.media;if(e){const a=this.appPhotosManager.getPhoto(""+t);if(a){const t=e.sizes[e.sizes.length-1],s=this.thumbsStorage.getCacheContext(e,t.type),n=this.thumbsStorage.getCacheContext(a,o.Pt);Object.assign(s,n);const i=e.sizes[e.sizes.length-1],r=(0,Vt.Z)(e,i);(0,ct.P)(r.location)}}else if(s){const e=this.appDocsManager.getDoc(""+t);if(e){const t=this.thumbsStorage.getCacheContext(e);if(e.type&&"sticker"!==e.type&&"image/gif"!==e.mime_type&&t.url){const e=this.thumbsStorage.getCacheContext(s);Object.assign(e,t),n=s,(0,ct.P)((0,ft.Z)(n,undefined),{fileName:n.file_name})}}}else a.media.poll&&(delete this.appPollsManager.polls[t],delete this.appPollsManager.results[t])}var n;const i=this.getMessageFromStorage(e,t);e.delete(t),!i.reply_markup&&a.reply_markup&&setTimeout((()=>{this.getMessageFromStorage(e,a.mid)&&this.rootScope.dispatchEvent("message_edit",{storageKey:e.key,peerId:a.peerId,mid:a.mid,message:a})}),0),this.handleReleasingMessage(i,e),this.rootScope.dispatchEvent("message_sent",{storageKey:e.key,tempId:t,tempMessage:i,mid:a.mid,message:a})}incrementMaxSeenId(e){if(!e||this.maxSeenId&&!(e>this.maxSeenId))return!1;this.maxSeenId=e,this.appStateManager.pushToState("maxSeenMsgId",e),this.apiManager.invokeApi("messages.receivedMessages",{max_id:(0,oe.Z)(e)})}getMessageReactionsListAndReadParticipants(e,t,a,s,n,i){var r,o;return Yt(this,void 0,void 0,(function*(){const p={reactions:[],count:0,next_offset:void 0},d=yield this.canViewMessageReadParticipants(e);return d&&void 0===t?t=100:void 0===t&&(t=50),Promise.all([!d||a||n?[]:this.getMessageReadParticipants(e.peerId,e.mid).catch((()=>[])),(null===(o=null===(r=e.reactions)||void 0===r?void 0:r.recent_reactions)||void 0===o?void 0:o.length)&&!i?this.appReactionsManager.getMessageReactionsList(e.peerId,e.mid,t,a,s).catch((e=>p)):p]).then((([e,t])=>{const a=e.map((e=>e.toPeerId())),s=a.slice();(0,ne.Z)(s,((e,a,s)=>{t.reactions.some((t=>this.appPeersManager.getPeerId(t.peer_id)===e))&&s.splice(a,1)}));let n=t.reactions.map((e=>({peerId:this.appPeersManager.getPeerId(e.peer_id),reaction:e.reaction})));return n=n.concat(s.map((e=>({peerId:e})))),{reactions:t.reactions,reactionsCount:t.count,readParticipants:a,combined:n,nextOffset:t.next_offset}}))}))}getMessageReadParticipants(e,t){return this.apiManager.invokeApiSingle("messages.getMessageReadParticipants",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((e=>e.map((e=>e.toUserId()))))}canViewMessageReadParticipants(e){return Yt(this,void 0,void 0,(function*(){if("message"!==(null==e?void 0:e._)||e.pFlags.is_outgoing||!e.pFlags.out||!this.appPeersManager.isAnyGroup(e.peerId))return!1;const t=this.appChatsManager.getChat(e.peerId.toChatId()),a=yield this.apiManager.getAppConfig();return t.participants_count<=a.chat_read_mark_size_threshold&&(0,te.Z)(!0)-e.date(0,oe.Z)(e))),increment:!0}).then((a=>{const s=new Array(t.length);for(let n=0,i=t.length;n{const{chatPeerIds:t}=e.state;return t[t.length-1]===a}));n||(s.sort(((e,t)=>e.state.idleStartTime-t.state.idleStartTime)),n=s[0].state.idleStartTime?s[s.length-1]:s[0]),f.Z.getInstance().invokeVoid("notificationBuild",Object.assign({message:e},t),n.source)}getScheduledMessagesStorage(e){var t,a;return null!==(t=(a=this.scheduledMessagesStorage)[e])&&void 0!==t?t:a[e]=this.createMessageStorage(e,"scheduled")}getScheduledMessageByPeer(e,t){return this.getMessageFromStorage(this.getScheduledMessagesStorage(e),t)}getScheduledMessages(e){if(!this.canSendToPeer(e))return;const t=this.getScheduledMessagesStorage(e);return t.size?[...t.keys()]:this.apiManager.invokeApiSingle("messages.getScheduledHistory",{peer:this.appPeersManager.getInputPeerById(e),hash:""}).then((t=>{if("messages.messagesNotModified"!==t._){this.appUsersManager.saveApiUsers(t.users),this.appChatsManager.saveApiChats(t.chats);const a=this.getScheduledMessagesStorage(e);return this.saveMessages(t.messages,{storage:a,isScheduled:!0}),[...a.keys()]}return[]}))}sendScheduledMessages(e,t){return this.apiManager.invokeApi("messages.sendScheduledMessages",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}deleteScheduledMessages(e,t){return this.apiManager.invokeApi("messages.deleteScheduledMessages",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}getMessageWithReplies(e){return this.filterMessages(e,(e=>!!e.replies))[0]}getMessageWithCommentReplies(e){if(e.peerId!==o.hj){const t=null==(e=this.getMessageWithReplies(e))?void 0:e.replies;if(!t||!t.pFlags.comments||t.channel_id.toChatId()===o.IA)return}return e}isFetchIntervalNeeded(e){return e.isAnyChat()&&(!this.appChatsManager.isInChat(e.toChatId())||this.appChatsManager.isForum(e.toChatId()))}getNewHistory(e,t){var a;return Yt(this,void 0,void 0,(function*(){if(!this.isFetchIntervalNeeded(e))return;const s=this.getHistoryStorage(e,t),n=s.history.slice;if(!n.isEnd(se.D.Bottom))return;delete s.maxId,n.unsetEnd(se.D.Bottom);const i=yield this.getHistory(e,null!==(a=n[0])&&void 0!==a?a:1,0,50,t);for(let t=0,a=i.history.length;t{const e=i.history.sliceMe(t,r,a),s=(null==e?void 0:e.slice)||i.history.constructSlice();return{count:i.count,history:Array.from(s),isEnd:s.getEnds(),offsetIdOffset:(null==e?void 0:e.offsetIdOffset)||i.count}})):{count:i.count,history:Array.from(o.slice),isEnd:o.slice.getEnds(),offsetIdOffset:o.offsetIdOffset}}isHistoryResultEnd(e,t,a){const{offset_id_offset:s,messages:n}=e,i=e.count||n.length,r=s||0,o=a<0?t+a:t;return{count:i,offsetIdOffset:r,isTopEnd:r>=i-o||ie.mid));if(a&&(0,oe.Z)(a)&&!c.includes(a)&&pc[e]);++e);c.splice(e,0,a)}const l=e.insertSlice(c)||e.slice;return d&&l.setEnd(se.D.Top),f&&l.setEnd(se.D.Bottom),Object.assign({slice:l,mids:c,messages:i},r)}fillHistoryStorage(e,t,a,s,n,i){const r=n.maxId;return this.requestHistory(e,t,a,s,void 0,i).then((i=>{const{count:o,isBottomEnd:p,slice:d,messages:f}=this.mergeHistoryResult(n.history,i,t,a,s);n.count=o;for(let t=0,a=f.length;t{d.ZP&&this.log("requestHistory result:",e,r,t,a,s),this.appUsersManager.saveApiUsers(r.users),this.appChatsManager.saveApiChats(r.chats),this.saveMessages(r.messages),"pts"in r&&this.apiUpdatesManager.addChannelState(e.toChatId(),r.pts);let o=r.messages.length,p=r.count;o&&!r.messages[o-1]&&(r.messages.splice(o-1,1),o--,p--);const f=this.getHistoryStorage(e,i),c=r.messages[o-1];if(o&&c.grouped_id){const t=f.history.findSlice(c.mid);if(t&&t.slice.length+r.messages.lengthr))}return r}),(t=>{if("CHANNEL_PRIVATE"===t.type){let t=this.appChatsManager.getChat(e.toChatId());"channel"===t._&&(t={_:"channelForbidden",id:e.toChatId(),access_hash:t.access_hash,title:t.title,pFlags:t.pFlags}),this.apiUpdatesManager.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e.toChatId()}],chats:[t],users:[]})}throw t}))}fetchSingleMessages(){return this.fetchSingleMessagesPromise?this.fetchSingleMessagesPromise:this.fetchSingleMessagesPromise=(0,P.Z)(0).then((()=>{const e=[];for(const[t,a]of this.needSingleMessages){const s=[...a.keys()],n=s.map((e=>({_:"inputMessageID",id:(0,oe.Z)(e)})));let i;i=t.isAnyChat()&&this.appPeersManager.isChannel(t)?this.apiManager.invokeApiSingle("channels.getMessages",{channel:this.appChatsManager.getChannelInput(t.toChatId()),id:n}):this.apiManager.invokeApiSingle("messages.getMessages",{id:n});const r=i.then((e=>{(0,ue.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const t=this.saveMessages(e.messages);for(let e=0;e{this.rootScope.dispatchEvent("messages_downloaded",{peerId:t,mids:s})}));e.push(r)}return this.needSingleMessages.clear(),Promise.all(e).then(jt.Z,jt.Z).then((()=>{this.fetchSingleMessagesPromise=void 0,this.needSingleMessages.size&&this.fetchSingleMessages()}))}))}reloadMessages(e,t,a){if(Array.isArray(t))return Promise.all(t.map((t=>this.reloadMessages(e,t,a))));const s=this.getMessageByPeer(e,t);if(s&&!a)return this.rootScope.dispatchEvent("messages_downloaded",{peerId:e,mids:[t]}),Promise.resolve(s);{let a=this.needSingleMessages.get(e);a||this.needSingleMessages.set(e,a=new Map);let s=a.get(t);return s||(s=(0,v.Z)(),a.set(t,s),this.fetchSingleMessages(),s)}}getExtendedMedia(e,t){let a=this.extendedMedia.get(e);a||this.extendedMedia.set(e,a=new Map);const s=(0,v.Z)(),n=[],i=t.map((t=>{let i=a.get(t);return i||(a.set(t,i=s),n.push(t),i.then((()=>{a.delete(t),a.size||this.extendedMedia.get(e)!==a||this.extendedMedia.delete(e)}))),i}));return n.length?this.apiManager.invokeApi("messages.getExtendedMedia",{peer:this.appPeersManager.getInputPeerById(e),id:n.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),s.resolve()})):s.resolve(),Promise.all(i)}fetchMessageReplyTo(e){if(!e.reply_to_mid)return Promise.resolve(this.generateEmptyMessage(0));const t=e.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(e.reply_to.reply_to_peer_id):e.peerId;return this.reloadMessages(t,e.reply_to_mid).then((t=>{if(t||delete(e=this.getMessageByPeer(e.peerId,e.mid)).reply_to_mid,"messageService"===e._){const t=e.peerId;this.rootScope.dispatchEvent("message_edit",{storageKey:`${t}_history`,peerId:t,mid:e.mid,message:e}),this.isMessageIsTopMessage(e)&&this.rootScope.dispatchEvent("dialogs_multiupdate",new Map([[t,{dialog:this.getDialogOnly(t)}]]))}return t}))}getTypingKey(e,t){return t?`${e}_${t}`:e}setTyping(e,t,a,s){var n;s&&!this.appPeersManager.isForum(e)&&(s=void 0);const i=this.getTypingKey(e,s);let r=this.typings[i];return e&&this.canSendToPeer(e)&&e!==this.appPeersManager.peerId&&(a||(null===(n=null==r?void 0:r.action)||void 0===n?void 0:n._)!==t._)?((null==r?void 0:r.timeout)&&clearTimeout(r.timeout),r=this.typings[i]={action:t},this.apiManager.invokeApi("messages.setTyping",{peer:this.appPeersManager.getInputPeerById(e),action:t,top_msg_id:s?(0,oe.Z)(s):void 0}).finally((()=>{r===this.typings[i]&&(r.timeout=E.Z.setTimeout((()=>{delete this.typings[i]}),6e3))}))):Promise.resolve(!1)}handleReleasingMessage(e,t){const a=e.media;if(a){const s=a.webpage||a,n=s.photo||s.document;if((null==n?void 0:n.file_reference)&&this.referenceDatabase.deleteContext(n.file_reference,{type:"message",peerId:e.peerId,messageId:e.mid}),"webpage"in a&&a.webpage){const s=this.getScheduledMessagesStorage(e.peerId)===t,n=this.appWebPagesManager.getMessageKeyForPendingWebPage(e.peerId,e.mid,s);this.appWebPagesManager.deleteWebPageFromPending(a.webpage,n)}a.poll&&this.appPollsManager.updatePollToMessage(e,!1)}}handleDeletedMessages(e,t,a){const s={count:0,unread:0,unreadMentions:0,msgs:new Set};for(const n of a){const a=this.getMessageFromStorage(t,n);if(!a){this.fixDialogUnreadMentionsIfNoMessage(e);continue}this.handleReleasingMessage(a,t),this.updateMessageRepliesIfNeeded(a),a.pFlags.out||a.pFlags.is_outgoing||!a.pFlags.unread||(++s.unread,this.rootScope.dispatchEvent("notification_cancel","msg"+n),a.pFlags.mentioned&&(++s.unreadMentions,this.modifyCachedMentions(e,n,!1))),++s.count,s.msgs.add(n),a.deleted=!0;const i=a.grouped_id;if(i){const e=this.groupedMessagesStorage[i];e&&(e.delete(n),s.albums||(s.albums={}),(s.albums[i]||(s.albums[i]=new Set)).add(n),e.size||(delete s.albums,delete this.groupedMessagesStorage[i]))}t.delete(n)}if(s.albums)for(const e in s.albums)this.dispatchAlbumEdit(e,t,[...s.albums[e]]);return s}handleEditedMessage(e,t,a){var s;if("message"===e._){if(null===(s=e.media)||void 0===s?void 0:s.webpage){const t=this.appWebPagesManager.getMessageKeyForPendingWebPage(e.peerId,e.mid,!!e.pFlags.is_scheduled);this.appWebPagesManager.deleteWebPageFromPending(e.media.webpage,t)}const t=e.grouped_id;t&&this.dispatchAlbumEdit(t,a,[])}}dispatchAlbumEdit(e,t,a){const s=this.getMidsByAlbum(e).map((e=>this.getMessageFromStorage(t,e)));this.rootScope.dispatchEvent("album_edit",{peerId:s[0].peerId,groupId:e,deletedMids:a||[],messages:s})}getDialogUnreadCount(e){let t=e.unread_count;if(!this.dialogsStorage.isTopic(e)&&this.appPeersManager.isForum(e.peerId)){const a=this.dialogsStorage.getForumUnreadCount(e.peerId);t=a instanceof Promise?0:a.count}return t||+!!e.pFlags.unread_mark}isDialogUnread(e){return!!this.getDialogUnreadCount(e)}canForward(e){return"message"===(null==e?void 0:e._)&&!e.pFlags.noforwards&&!this.appPeersManager.noForwards(e.peerId)}pushBatchUpdate(e,t,a,s){let n=this.batchUpdates[e];n||(n=this.batchUpdates[e]={callback:t,batch:new Map}),n.batch.has(a)||(n.batch.set(a,s?s():void 0),this.batchUpdatesDebounced())}getMessagesFromMap(e){const t=new Map;for(const[a,s]of e){const[e,n]=a.split("_"),i=this.getMessageByPeer(e.toPeerId(),+n);i&&t.set(i,s)}return t}saveDefaultSendAs(e,t){return this.appProfileManager.getCachedFullChat(e.toChatId()).default_send_as=this.appPeersManager.getOutputPeer(t),this.apiManager.invokeApi("messages.saveDefaultSendAs",{peer:this.appPeersManager.getInputPeerById(e),send_as:this.appPeersManager.getInputPeerById(t)})}}var aa=a(6724);function sa(e){const t=e.replace("input","");return t[0].toLowerCase()+t.slice(1)}class na extends G{constructor(){super(...arguments),this.peerSettings={notifyPeer:{},notifyUsers:null,notifyChats:null,notifyBroadcasts:null,notifyForumTopic:{}},this.checkMuteUntil=()=>{void 0!==this.checkMuteUntilTimeout&&(clearTimeout(this.checkMuteUntilTimeout),this.checkMuteUntilTimeout=void 0);const e=(0,te.Z)(!0);let t=o.rU;const a=a=>{if(a instanceof Promise)return!1;const s=a.mute_until;return!!s&&(s<=e?(a.mute_until=0,!0):(s{for(const t in this.peerSettings[e]){const s=this.peerSettings[e][t];if(a(s)){const[e,a]=t.split("_"),n=this.appPeersManager.getOutputPeer(e.toPeerId());this.apiUpdatesManager.saveUpdate({_:"updateNotifySettings",peer:a?{_:"notifyForumTopic",peer:n,top_msg_id:+a}:{_:"notifyPeer",peer:n},notify_settings:s})}}}));const s=Math.min(18e5,1e3*(t-e));this.checkMuteUntilTimeout=E.Z.setTimeout(this.checkMuteUntil,s)}}after(){return this.checkMuteUntilThrottled=(0,aa.Z)(this.checkMuteUntil,1e3,!1),this.apiUpdatesManager.addMultipleEventsListeners({updateNotifySettings:e=>{const{peer:t}=e,a="notifyForumTopic"===t._,s="notifyPeer"===t._||a,n=s&&this.appPeersManager.getPeerId(t.peer),i=s?void 0:t._;this.savePeerSettings({key:i,peerId:n,threadId:a?(0,pe.Z)(t.top_msg_id):void 0,settings:e.notify_settings}),this.rootScope.dispatchEvent("notify_settings",e)}}),this.appStateManager.getState().then((e=>{if(e.notifySettings)for(const t in e.notifySettings)(0,ue.Z)(t),this.savePeerSettings({key:t,settings:e.notifySettings[t]})}))}getNotifySettings(e){let t,a=sa(e._),s=this.peerSettings[a];return"inputNotifyPeer"===e._&&(t=a=this.appPeersManager.getPeerId(e.peer),s=s[a]),s||((s||this.peerSettings)[a]=this.apiManager.invokeApi("account.getNotifySettings",{peer:e}).then((e=>(this.savePeerSettings({key:a,peerId:t,settings:e}),e))))}getNotifyPeerTypeSettings(){if(this.getNotifyPeerTypePromise)return this.getNotifyPeerTypePromise;const e=["inputNotifyBroadcasts","inputNotifyUsers","inputNotifyChats"].map((e=>this.getNotifySettings({_:e})));return this.getNotifyPeerTypePromise=Promise.all(e)}updateNotifySettings(e,t){return this.apiManager.invokeApi("account.updateNotifySettings",{peer:e,settings:t}).then((a=>{a&&this.apiUpdatesManager.processLocalUpdate({_:"updateNotifySettings",peer:Object.assign(Object.assign({},e),{_:sa(e._)}),notify_settings:Object.assign(Object.assign({},t),{_:"peerNotifySettings"})})}))}getContactSignUpNotification(){return this.notifyContactsSignUp?this.notifyContactsSignUp:this.notifyContactsSignUp=this.apiManager.invokeApi("account.getContactSignUpNotification")}setContactSignUpNotification(e){this.apiManager.invokeApi("account.setContactSignUpNotification",{silent:e}).then((t=>{this.notifyContactsSignUp=Promise.resolve(!e)}))}getPeerKey(e,t){return e+(t?"_"+t:"")}savePeerSettings({key:e,peerId:t,threadId:a,settings:s}){let n;t&&(e=this.getPeerKey(t,a),n=this.peerSettings[a?"notifyForumTopic":"notifyPeer"]),(n||this.peerSettings)[e]=s,t?this.checkMuteUntilThrottled():(this.rootScope.dispatchEvent("notify_peer_type_settings",{key:e,settings:s}),this.appStateManager.getState().then((t=>{const a=t.notifySettings;a[e]=s,this.appStateManager.pushToState("notifySettings",a)})))}isMuted(e){return"peerNotifySettings"===e._&&(e.silent||void 0!==e.mute_until&&1e3*e.mute_until>(0,te.Z)())}getPeerMuted(e){const t=this.getNotifySettings({_:"inputNotifyPeer",peer:this.appPeersManager.getInputPeerById(e)});return(t instanceof Promise?t:Promise.resolve(t)).then((e=>this.isMuted(e)))}getPeerLocalSettings({peerId:e,respectType:t=!0,threadId:a}){const s={_:"peerNotifySettings"},n=this.getPeerKey(e,a),i=this.peerSettings[a?"notifyForumTopic":"notifyPeer"][n];if(!i||i instanceof Promise||Object.assign(s,i),t){const t=sa(this.appPeersManager.getInputNotifyPeerById({peerId:e,ignorePeerId:!0,threadId:a})._),n=this.peerSettings[t];if(n&&!(n instanceof Promise))for(const e in n)void 0===s[e]&&(s[e]=n[e])}return s}validatePeerSettings(e){if(e.peerId!==this.appPeersManager.peerId)return e.threadId&&!this.appPeersManager.isForum(e.peerId)&&(e.threadId=void 0),e}isPeerLocalMuted(e){if(!(e=this.validatePeerSettings(e)))return!1;if(e.threadId){const t=this.getPeerLocalSettings(Object.assign(Object.assign({},e),{respectType:!1}));return void 0!==t.silent||void 0!==t.mute_until?this.isMuted(t):this.isPeerLocalMuted(Object.assign(Object.assign({},e),{threadId:void 0}))}const t=this.getPeerLocalSettings(e);return this.isMuted(t)}}var ia=a(677),ra=a(617),oa=a(7361),pa=a(7419),da=a(7256);class fa extends G{get peerId(){return this.appUsersManager.userId.toPeerId()}canPinMessage(e){return e.isUser()||this.appChatsManager.hasRights(e.toChatId(),"pin_messages")}getPeerPhoto(e){const t=this.getPeer(e);return(0,da.Z)(t)}getPeerMigratedTo(e){if(e.isUser())return!1;const t=this.appChatsManager.getChat(e.toChatId()),a=null==t?void 0:t.migrated_to;return!(!a||!t.pFlags.deactivated)&&(0,le.Z)(a)}getOutputPeer(e){if(e.isUser())return{_:"peerUser",user_id:e.toUserId()};const t=e.toChatId();return this.appChatsManager.isChannel(t)?{_:"peerChannel",channel_id:t}:{_:"peerChat",chat_id:t}}getPeerString(e){return e.isUser()?this.appUsersManager.getUserString(e.toUserId()):this.appChatsManager.getChatString(e.toChatId())}getPeerUsername(e){return this.getPeerActiveUsernames(e)[0]||""}getPeerActiveUsernames(e){const t=this.getPeer(e);return(0,Jt.Z)(t)}getPeer(e){return e.isUser()?this.appUsersManager.getUser(e.toUserId()):this.appChatsManager.getChat(e.toChatId())}getPeerId(e){return(0,le.Z)(e)||(0,fe.Z)(e)&&"inputPeerSelf"===e._&&this.peerId||o.NM}getDialogPeer(e){return{_:"dialogPeer",peer:this.getOutputPeer(e)}}isChannel(e){return!e.isUser()&&this.appChatsManager.isChannel(e.toChatId())}isMegagroup(e){return!e.isUser()&&this.appChatsManager.isMegagroup(e.toChatId())}isForum(e){return!e.isUser()&&this.appChatsManager.isForum(e.toChatId())}isAnyGroup(e){return!e.isUser()&&!this.appChatsManager.isBroadcast(e.toChatId())}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isBot(e){return e.isUser()&&this.appUsersManager.isBot(e.toUserId())}isContact(e){return e.isUser()&&this.appUsersManager.isContact(e.toUserId())}isUser(e){return(0,ra.Z)(e)}isAnyChat(e){return(0,oa.Z)(e)}isPeerRestricted(e){return(0,pa.Z)(this.getPeer(e))}getRestrictionReasonText(e){const t=this.getPeer(e),a=t.restriction_reason?(0,ia.RP)(t.restriction_reason):void 0;return a?a.text:e.isUser()?"This user is restricted":"This chat is restricted"}getInputNotifyPeerById({peerId:e,ignorePeerId:t,threadId:a}){return t?e.isUser()?{_:"inputNotifyUsers"}:this.isBroadcast(e)?{_:"inputNotifyBroadcasts"}:{_:"inputNotifyChats"}:a?{_:"inputNotifyForumTopic",peer:this.getInputPeerById(e),top_msg_id:(0,oe.Z)(a)}:{_:"inputNotifyPeer",peer:this.getInputPeerById(e)}}getInputPeerById(e){if(!e)return{_:"inputPeerEmpty"};if(!e.isUser()){const t=e.toChatId();return this.appChatsManager.getInputPeer(t)}const t=e.toUserId();return this.appUsersManager.getUserInputPeer(t)}getInputPeerSelf(){return{_:"inputPeerSelf"}}getInputDialogPeerById(e){return{_:"inputDialogPeer",peer:(0,fe.Z)(e)?e:this.getInputPeerById(e)}}getPeerSearchText(e){let t;return t=this.isUser(e)?"%pu "+this.appUsersManager.getUserSearchText(e.toUserId()):"%pg "+(this.appChatsManager.getChat(e.toChatId()).title||""),t}getDialogType(e){return this.isMegagroup(e)?"megagroup":this.isChannel(e)?"channel":this.isUser(e)?e===this.peerId?"saved":"chat":"group"}getDeleteButtonText(e){switch(this.getDialogType(e)){case"channel":return this.appChatsManager.hasRights(e.toChatId(),"delete_chat")?"ChannelDelete":"ChatList.Context.LeaveChannel";case"megagroup":case"group":return this.appChatsManager.hasRights(e.toChatId(),"delete_chat")?"DeleteMega":"ChatList.Context.LeaveGroup";default:return"ChatList.Context.DeleteChat"}}noForwards(e){var t;return!e.isUser()&&!!(null===(t=this.appChatsManager.getChat(e.toChatId()).pFlags)||void 0===t?void 0:t.noforwards)}}class ca extends G{constructor(){super(...arguments),this.photos={}}savePhoto(e,t){var a;if(!e||"photoEmpty"===e._)return;const s=this.photos[e.id];if(e.file_reference&&(pt("file_reference",s,e),this.referenceDatabase.saveContext(e.file_reference,t)),null===(a=e.sizes)||void 0===a?void 0:a.length){e.sizes.sort(((e,t)=>(e.size||(e.sizes?1/0:0))-(t.size||(t.sizes?1/0:0))));const t=e.sizes[e.sizes.length-1];"photoSizeProgressive"===t._&&(t.size=t.sizes[t.sizes.length-1])}return s?Object.assign(s,e):this.photos[e.id]=e}getUserPhotos(e,t="0",a=20){const s=this.appUsersManager.getUserInput(e);return this.apiManager.invokeApiCacheable("photos.getUserPhotos",{user_id:s,offset:0,limit:a,max_id:t},{cacheSeconds:60}).then((a=>{this.appUsersManager.saveApiUsers(a.users);const s=a.photos.map(((t,s)=>(a.photos[s]=this.savePhoto(t,{type:"profilePhoto",peerId:e.toPeerId()}),t.id)));if("0"!==t&&t){const e=s.indexOf(t);-1!==e&&s.splice(e,1)}return{count:a.count||s.length,photos:s}}))}getPhoto(e){return(0,fe.Z)(e)?e:this.photos[e]}}class la extends G{constructor(){super(...arguments),this.polls={},this.results={},this.pollToMessages={},this.log=(0,I.kg)("POLLS",I.v9.Error)}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateMessagePoll:e=>{this.log("updateMessagePoll:",e);let t=e.poll||this.polls[e.poll_id];if(!t)return;let a=e.results;const s=this.savePoll(t,a);t=s.poll,a=s.results,this.rootScope.dispatchEvent("poll_update",{poll:t,results:a})}})}savePoll(e,t,a){a&&this.updatePollToMessage(a,!0);const s=e.id;return this.polls[s]?(e=Object.assign(this.polls[s],e),t=this.saveResults(e,t)):(this.polls[s]=e,e.chosenIndexes=[],t=this.saveResults(e,t)),{poll:e,results:t}}saveResults(e,t){var a;return this.results[e.id]?t=Object.assign(this.results[e.id],t):this.results[e.id]=t,t.pFlags.min||(e.chosenIndexes.length=0,(null===(a=null==t?void 0:t.results)||void 0===a?void 0:a.length)&&t.results.forEach(((t,a)=>{var s;(null===(s=t.pFlags)||void 0===s?void 0:s.chosen)&&e.chosenIndexes.push(a)}))),t}getPoll(e){return{poll:this.polls[e],results:this.results[e]}}getInputMediaPoll(e,t,a,s){return a?(s||(s=[]),a=(0,ke.Z)(a,s)):a=void 0,{_:"inputMediaPoll",poll:e,correct_answers:t,solution:a,solution_entities:a?s:void 0}}updatePollToMessage(e,t){const{id:a}=e.media.poll;let s=this.pollToMessages[a];if(!t&&!s)return;s||(s=this.pollToMessages[a]=new Set);const n=e.peerId+"_"+e.mid;t?s.add(n):s.delete(n),t||s.size||(delete this.polls[a],delete this.results[a],delete this.pollToMessages[a])}sendVote(e,t){const a=e.media.poll,s=t.map((e=>a.answers[e].option)),n=e.mid,i=e.peerId,r=this.appPeersManager.getInputPeerById(i);return e.pFlags.is_outgoing?this.appMessagesManager.invokeAfterMessageIsSent(n,"sendVote",(e=>(this.log("invoke sendVote callback"),this.sendVote(e,t)))):this.apiManager.invokeApi("messages.sendVote",{peer:r,msg_id:(0,oe.Z)(e.mid),options:s}).then((e=>{this.log("sendVote updates:",e),this.apiUpdatesManager.processUpdateMessage(e)}))}getResults(e){const t=this.appPeersManager.getInputPeerById(e.peerId);return this.apiManager.invokeApi("messages.getPollResults",{peer:t,msg_id:(0,oe.Z)(e.mid)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),this.log("getResults updates:",e)}))}getVotes(e,t,a,s=20){return this.apiManager.invokeApi("messages.getPollVotes",{peer:this.appPeersManager.getInputPeerById(e.peerId),id:(0,oe.Z)(e.mid),option:t,offset:a,limit:s}).then((e=>(this.log("getPollVotes messages:",e),this.appUsersManager.saveApiUsers(e.users),e)))}stopPoll(e){const t=e.media.poll;if(t.pFlags.closed)return Promise.resolve();const a=(0,ve.Z)(t);return a.pFlags.closed=!0,this.appMessagesManager.editMessage(e,void 0,{newMedia:this.getInputMediaPoll(a)}).then((()=>{}),(e=>{this.log.error("stopPoll error:",e)}))}}class ma extends G{constructor(){super(...arguments),this.privacy={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updatePrivacy:e=>{const t=e.key._;this.privacy[t]=e.rules,this.rootScope.dispatchEvent("privacy_update",e)}})}setPrivacy(e,t){return this.apiManager.invokeApi("account.setPrivacy",{key:{_:e},rules:t}).then((a=>(this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),this.apiUpdatesManager.processLocalUpdate({_:"updatePrivacy",key:{_:sa(e)},rules:t.map((e=>{const t={};return Object.assign(t,e),t._=sa(t._),t}))}),a.rules)))}getPrivacy(e){const t=sa(e),a=this.privacy[t];return a?Promise.resolve(a):this.privacy[t]=this.apiManager.invokeApi("account.getPrivacy",{key:{_:e}}).then((e=>(this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.privacy[t]=e.rules)))}getGlobalPrivacySettings(){return this.apiManager.invokeApi("account.getGlobalPrivacySettings")}setGlobalPrivacySettings(e){return this.apiManager.invokeApi("account.setGlobalPrivacySettings",{settings:e})}}var ga=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const ha=18e4;class ua extends G{constructor(){super(...arguments),this.usersFull={},this.chatsFull={},this.fullExpiration={},this.onUpdateUserTyping=e=>{var t,a;const s=e.user_id?e.user_id.toPeerId():this.appPeersManager.getPeerId(e.from_id);if(this.appPeersManager.peerId===s||"speakingInGroupCallAction"===e.action._)return;const n=e.top_msg_id,i=n?(0,pe.Z)(n):void 0,r=this.appPeersManager.getPeerId(e),o=this.getTypingsKey(r,i),p=null!==(t=(a=this.typingsInPeer)[o])&&void 0!==t?t:a[o]=[];let d=p.find((e=>e.userId===s));const f=()=>{delete d.timeout;const e=p.indexOf(d);-1!==e&&p.splice(e,1),this.rootScope.dispatchEvent("peer_typings",{peerId:r,threadId:i,typings:p}),p.length||delete this.typingsInPeer[o]};if(void 0!==(null==d?void 0:d.timeout)&&clearTimeout(d.timeout),"sendMessageCancelAction"===e.action._){if(!d)return;return void f()}d||(d={userId:s},p.push(d)),d.action=e.action;const c=this.appUsersManager.hasUser(s);c?this.appUsersManager.forceUserOnline(s):"updateChatUserTyping"===e._&&e.chat_id&&this.appChatsManager.hasChat(e.chat_id)&&!this.appChatsManager.isChannel(e.chat_id)&&Promise.resolve(this.getChatFull(e.chat_id)).then((()=>{void 0!==d.timeout&&this.appUsersManager.hasUser(s)&&this.rootScope.dispatchEvent("peer_typings",{peerId:r,threadId:i,typings:p})})),d.timeout=E.Z.setTimeout(f,6e3),c&&this.rootScope.dispatchEvent("peer_typings",{peerId:r,threadId:i,typings:p})},this.onUpdatePeerBlocked=e=>{const t=this.appPeersManager.getPeerId(e.peer_id);if(this.appPeersManager.isUser(t)){const a=t.toUserId(),s=this.usersFull[a];s&&(e.blocked?s.pFlags.blocked=!0:delete s.pFlags.blocked),this.rootScope.dispatchEvent("user_full_update",a)}this.rootScope.dispatchEvent("peer_block",{peerId:t,blocked:e.blocked})}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateChatParticipants:e=>{const t=e.participants;if("chatParticipants"===t._){const e=t.chat_id,a=this.chatsFull[e];void 0!==a&&(a.participants=t,this.rootScope.dispatchEvent("chat_full_update",e))}},updateChatParticipantAdd:e=>{const t=this.chatsFull[e.chat_id];if(void 0!==t){const a=t.participants,s=a.participants||[];for(let t=0,a=s.length;t{const t=this.chatsFull[e.chat_id];if(void 0!==t){const a=t.participants,s=a.participants||[];for(let t=0,n=s.length;t{var t,a;const s=this.chatsFull[e],n=this.appChatsManager.getChat(e);if(!s||!n)return;let i=!1;!!s.call!=!!(null===(t=n.pFlags)||void 0===t?void 0:t.call_active)&&(i=!0);const{photo:r}=n;if(r){const e="chatPhotoEmpty"!==r._;(e!==!(!s.chat_photo||"photoEmpty"===s.chat_photo._)||e&&r.photo_id!==(null===(a=s.chat_photo)||void 0===a?void 0:a.id))&&(i=!0)}i&&this.refreshFullPeer(e.toPeerId(!0))})),this.rootScope.addEventListener("channel_update",(e=>{this.refreshFullPeer(e.toPeerId(!0))})),this.rootScope.addEventListener("chat_full_update",(e=>{this.rootScope.dispatchEvent("peer_full_update",e.toPeerId(!0))})),this.rootScope.addEventListener("user_full_update",(e=>{this.rootScope.dispatchEvent("peer_full_update",e.toPeerId(!1))})),this.rootScope.addEventListener("invalidate_participants",(e=>{this.invalidateChannelParticipants(e)})),this.typingsInPeer={}}getProfile(e,t){return this.usersFull[e]&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const a=t.full_user,s=e.toPeerId(!1);a.profile_photo&&(a.profile_photo=this.appPhotosManager.savePhoto(a.profile_photo,{type:"profilePhoto",peerId:s}));const n=a.bot_info;if(n){const t={type:"userFull",userId:e};n.description_document=this.appDocsManager.saveDoc(n.description_document,t),n.description_photo=this.appPhotosManager.savePhoto(n.description_photo,t)}return this.appNotificationsManager.savePeerSettings({peerId:s,settings:a.notify_settings}),this.usersFull[e]=a,this.fullExpiration[s]=Date.now()+ha,this.rootScope.dispatchEvent("user_full_update",e),a}})}getProfileByPeerId(e,t){return this.appPeersManager.isAnyChat(e)?this.getChatFull(e.toChatId(),t):this.getProfile(e.toUserId(),t)}getCachedFullChat(e){return this.chatsFull[e]}getCachedFullUser(e){return this.usersFull[e]}getCachedProfileByPeerId(e){return e.isUser()?this.getCachedFullUser(e.toUserId()):this.getCachedFullChat(e.toChatId())}getFullPhoto(e){return ga(this,void 0,void 0,(function*(){const t=yield this.getProfileByPeerId(e);switch(t._){case"userFull":return t.profile_photo;case"channelFull":case"chatFull":return t.chat_photo}}))}getChatFull(e,t){if(this.appChatsManager.isChannel(e))return this.getChannelFull(e,t);const a=e.toPeerId(!0),s=this.chatsFull[e];if(s&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const s=t.full_chat;return s&&s.chat_photo&&s.chat_photo.id&&(s.chat_photo=this.appPhotosManager.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:a})),s.call&&this.appGroupCallsManager.saveGroupCall(s.call,e),this.appNotificationsManager.savePeerSettings({peerId:a,settings:s.notify_settings}),this.chatsFull[e]=s,this.fullExpiration[a]=Date.now()+ha,this.rootScope.dispatchEvent("chat_full_update",e),s}})}getChatInviteLink(e,t){return ga(this,void 0,void 0,(function*(){const a=yield this.getChatFull(e);return!t&&a.exported_invite&&"chatInviteExported"==a.exported_invite._?a.exported_invite.link:this.apiManager.invokeApi("messages.exportChatInvite",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0))}).then((t=>(void 0!==this.chatsFull[e]&&(this.chatsFull[e].exported_invite=t),t.link)))}))}getChannelParticipants(e,t={_:"channelParticipantsRecent"},a=200,s=0){if("channelParticipantsRecent"===t._){const t=this.appChatsManager.getChat(e);if((null==t?void 0:t.pFlags)&&t.pFlags.broadcast&&!t.pFlags.creator&&!t.admin_rights)return Promise.reject()}return this.apiManager.invokeApiCacheable("channels.getParticipants",{channel:this.appChatsManager.getChannelInput(e),filter:t,offset:s,limit:a,hash:"0"},{cacheSeconds:60}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}getChannelParticipant(e,t){return this.apiManager.invokeApiSingle("channels.getParticipant",{channel:this.appChatsManager.getChannelInput(e),participant:this.appPeersManager.getInputPeerById(t)}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e.participant)))}getChannelFull(e,t){const a=e.toPeerId(!0);return void 0!==this.chatsFull[e]&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const s=t.full_chat;return s&&s.chat_photo.id&&(s.chat_photo=this.appPhotosManager.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:a})),s.call&&this.appGroupCallsManager.saveGroupCall(s.call,e),this.appNotificationsManager.savePeerSettings({peerId:a,settings:s.notify_settings}),this.chatsFull[e]=s,this.fullExpiration[a]=Date.now()+ha,this.rootScope.dispatchEvent("chat_full_update",e),s},processError:t=>{if("CHANNEL_PRIVATE"===t.type){const t=this.appChatsManager.getChat(e);this.apiUpdatesManager.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e}],chats:["channelForbidden"===t._?t:{_:"channelForbidden",id:e,access_hash:t.access_hash,title:t.title,pFlags:t.pFlags}],users:[]})}throw t}})}getMentions(e,t,a){const s=e=>{"@"===t.charAt(0)&&(t=t.slice(1));const a=new ae.Z({ignoreCase:!0}),s=new Map;e.forEach((e=>{a.indexObject(e.id,this.appUsersManager.getUserSearchText(e.id)),s.set(e.id,e.rating)}));const n=Array.from(a.search(t));return n.sort(((e,t)=>s.get(t)-s.get(e))),n};let n;return n=this.appChatsManager.isChannel(e)?this.getChannelParticipants(e,{_:"channelParticipantsMentions",q:t,top_msg_id:(0,oe.Z)(a)},50,0).then((e=>e.participants.map((e=>(0,xe.Z)(e))))):e?Promise.resolve(this.getChatFull(e)).then((e=>e.participants.participants.map((e=>e.user_id.toPeerId())))):Promise.resolve([]),Promise.all([this.appUsersManager.getTopPeers("bots_inline").catch((()=>[])),n]).then((e=>{const t=e[0].concat(e[1].map((e=>({id:e,rating:0}))));return s(t)}))}invalidateChannelParticipants(e){this.apiManager.clearCache("channels.getParticipants",(t=>t.channel.channel_id===e)),this.refreshFullPeer(e.toPeerId(!0))}refreshFullPeer(e){if(e.isUser()){const t=e.toUserId();delete this.usersFull[t],this.rootScope.dispatchEvent("user_full_update",t)}else{const t=e.toChatId();delete this.chatsFull[t],this.rootScope.dispatchEvent("chat_full_update",t)}}updateProfile(e,t,a){return this.apiManager.invokeApi("account.updateProfile",{first_name:e,last_name:t,about:a}).then((e=>{if(this.appUsersManager.saveApiUser(e),void 0!==a){const t=e.id.toPeerId(),s=this.usersFull[e.id];s&&(s.about=a),this.rootScope.dispatchEvent("peer_bio_edit",t)}return this.getProfile(e.id,!0)}))}uploadProfilePhoto(e){return this.apiManager.invokeApi("photos.uploadProfilePhoto",{file:e}).then((e=>{const t=e.photo;if(!e.users.length){const a=t.sizes.find((e=>"photoStrippedSize"===e._));e.users.push(Object.assign(Object.assign({},this.appUsersManager.getSelf()),{photo:{_:"userProfilePhoto",dc_id:t.dc_id,photo_id:t.id,stripped_thumb:null==a?void 0:a.bytes,pFlags:{}}}))}this.appUsersManager.saveApiUsers(e.users);const a=this.appPeersManager.peerId;this.appPhotosManager.savePhoto(e.photo,{type:"profilePhoto",peerId:a});const s=a.toUserId();this.apiUpdatesManager.processLocalUpdate({_:"updateUser",user_id:s})}))}deletePhotos(e){return this.apiManager.invokeApiSingle("photos.deletePhotos",{id:e.map((e=>Ct(this.appPhotosManager.getPhoto(e))))}).then((e=>{}))}verifyParticipantForOnlineCount(e){const t=this.appUsersManager.getUser(e.user_id);return!(!t||!t.status||"userStatusOnline"!==t.status._)}reduceParticipantsForOnlineCount(e){return e.reduce(((e,t)=>e+ +this.verifyParticipantForOnlineCount(t)),0)}getOnlines(e){var t;return ga(this,void 0,void 0,(function*(){if(this.appChatsManager.isBroadcast(e))return 1;const a=yield this.getChatFull(e);if(this.appChatsManager.isMegagroup(e)){if(a.participants_count<=100){const t=yield this.getChannelParticipants(e,{_:"channelParticipantsRecent"},100);return this.reduceParticipantsForOnlineCount(t.participants)}const s=yield this.apiManager.invokeApiCacheable("messages.getOnlines",{peer:this.appChatsManager.getChannelInputPeer(e)},{cacheSeconds:60});return null!==(t=s.onlines)&&void 0!==t?t:1}const s=a.participants;return(null==s?void 0:s.participants)?this.reduceParticipantsForOnlineCount(s.participants):1}))}getTypingsKey(e,t){return e+(t?`_${t}`:"")}getPeerTypings(e,t){return this.typingsInPeer[this.getTypingsKey(e,t)]}}function ya(e,t){return e.some((e=>e instanceof Promise))?Promise.all(e).then(t):t(e)}var _a=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const va=["static_icon","appear_animation","select_animation","activate_animation","effect_animation","around_animation","center_icon"],Pa={type:"reactions"};class ba extends G{after(){this.rootScope.addEventListener("language_change",(()=>{this.availableReactions=void 0,this.getAvailableReactions()})),this.sendReactionPromises=new Map,this.lastSendingTimes=new Map,this.rootScope.addEventListener("user_auth",(()=>{setTimeout((()=>{Promise.resolve(this.getAvailableReactions()).then((e=>_a(this,void 0,void 0,(function*(){for(const t of e)yield Promise.all([t.around_animation&&this.apiFileManager.downloadMedia({media:t.around_animation}),t.static_icon&&this.apiFileManager.downloadMedia({media:t.static_icon}),t.appear_animation&&this.apiFileManager.downloadMedia({media:t.appear_animation}),t.center_icon&&this.apiFileManager.downloadMedia({media:t.center_icon})]),yield(0,P.Z)(1e3)}))))}),7500)}))}getAvailableReactions(){return this.availableReactions?this.availableReactions:this.apiManager.invokeApiSingleProcess({method:"messages.getAvailableReactions",processResult:e=>{(0,ue.Z)(e);const t=this.availableReactions=e.reactions;for(const e of t)for(const t of va)e[t]&&(e[t]=this.appDocsManager.saveDoc(e[t],Pa));return t},params:{hash:0}})}getActiveAvailableReactions(){return(0,q.Z)(this.getAvailableReactions(),(e=>e.filter((e=>!e.pFlags.inactive))))}getAvailableReactionsForPeer(e){const t=this.getActiveAvailableReactions();return e.isUser()?this.unshiftQuickReaction(t):ya([t,this.appProfileManager.getChatFull(e.toChatId()),this.getQuickReaction()],(([e,t,a])=>{var s;const n=null!==(s=t.available_reactions)&&void 0!==s?s:{_:"chatReactionsNone"};let i=[];return"chatReactionsAll"===n._?i=e:"chatReactionsSome"===n._&&(i=n.reactions.map((t=>e.find((e=>e.reaction===t.emoticon)))).filter(Boolean)),this.unshiftQuickReactionInner(i,a)}))}unshiftQuickReactionInner(e,t){if(t&&"reactionEmoji"!==t._&&"availableReaction"!==t._)return e;const a=t.emoticon||t.reaction,s=(0,Pe.Z)(e,(e=>e.reaction===a));return s&&e.unshift(s),e}unshiftQuickReaction(e,t=this.getQuickReaction()){return ya([e,t],(([e,t])=>this.unshiftQuickReactionInner(e,t)))}getAvailableReactionsByMessage(e){var t;if(!e)return[];const a=(null===(t=e.fwd_from)||void 0===t?void 0:t.channel_post)&&this.appPeersManager.isMegagroup(e.peerId)&&e.fwdFromId||e.peerId;return this.getAvailableReactionsForPeer(a)}isReactionActive(e){return!!this.availableReactions&&!!this.availableReactions.find((t=>t.reaction===e))}getQuickReaction(){return ya([this.apiManager.getConfig(),this.getAvailableReactions()],(([e,t])=>{const a=e.reactions_default;return"reactionEmoji"===(null==a?void 0:a._)?t.find((e=>e.reaction===a.emoticon)):a}))}getReactionCached(e){return this.availableReactions.find((t=>t.reaction===e))}getReaction(e){return(0,q.Z)(this.getAvailableReactions(),(()=>this.getReactionCached(e)))}getMessagesReactions(e,t){return this.apiManager.invokeApiSingleProcess({method:"messages.getMessagesReactions",params:{id:t.map((e=>(0,oe.Z)(e))),peer:this.appPeersManager.getInputPeerById(e)},processResult:e=>{this.apiUpdatesManager.processUpdateMessage(e)}})}getMessageReactionsList(e,t,a,s,n){return this.apiManager.invokeApiSingleProcess({method:"messages.getMessageReactionsList",params:{peer:this.appPeersManager.getInputPeerById(e),id:(0,oe.Z)(t),limit:a,reaction:s,offset:n},processResult:e=>(this.appUsersManager.saveApiUsers(e.users),e)})}setDefaultReaction(e){return this.apiManager.invokeApi("messages.setDefaultReaction",{reaction:e}).then((t=>_a(this,void 0,void 0,(function*(){if(t){const t=yield this.apiManager.getConfig();t&&(t.reactions_default=e),this.rootScope.dispatchEvent("quick_reaction",e)}return t}))))}sendReaction(e,t,a){var s,n;return _a(this,void 0,void 0,(function*(){"availableReaction"===t._&&(t={_:"reactionEmoji",emoticon:t.reaction});const i=yield this.apiManager.getLimit("reactions"),r=e.peerId+"_"+e.mid;if(this.lastSendingTimes.get(r))return;this.lastSendingTimes.set(r,Date.now()),setTimeout((()=>{this.lastSendingTimes.delete(r)}),333);const{peerId:o,mid:p}=e,d=this.appPeersManager.peerId,f=e=>{--e.count,delete e.chosen_order,(0,Kt.Z)(t,e.reaction)&&(t=void 0),e.count||(0,M.Z)(l.results,e),l.recent_reactions&&(0,Pe.Z)(l.recent_reactions,(t=>(0,Kt.Z)(t.reaction,e.reaction)&&this.appPeersManager.getPeerId(t.peer_id)===d)),l.results.length||(l=void 0)},c=(null===(n=null===(s=e.reactions)||void 0===s?void 0:s.pFlags)||void 0===n?void 0:n.can_see_list)||!this.appPeersManager.isBroadcast(e.peerId)||e.peerId.isUser();e.reactions||(e.reactions={_:"messageReactions",results:[],recent_reactions:c?[]:void 0,pFlags:{can_see_list:c||void 0}});let l=a?e.reactions:(0,ve.Z)(e.reactions);const m=l.results.filter((e=>void 0!==e.chosen_order));m.sort(((e,t)=>t.chosen_order-e.chosen_order));const g=[],h=m.findIndex((e=>(0,Kt.Z)(e.reaction,t)));-1!==h&&g.push(...m.splice(h,1)),g.push(...m.splice(i-+(-1===h))),g.forEach((e=>{m.forEach((t=>{t.chosen_order>e.chosen_order&&--t.chosen_order})),f(e)}));const u=m.length;if(m.forEach(((e,t)=>{e.chosen_order=u-1-t})),t){l||(l={_:"messageReactions",results:[],pFlags:{}},c&&(l.pFlags.can_see_list=!0));let e=l.results.findIndex((e=>(0,Kt.Z)(e.reaction,t))),a=-1!==e&&l.results[e];if(a||(a={_:"reactionCount",count:0,reaction:t},e=l.results.push(a)-1),++a.count,a.chosen_order=m.length?m[0].chosen_order+1:0,m.unshift(a),!l.recent_reactions&&c&&(l.recent_reactions=[]),l.recent_reactions){const e={_:"messagePeerReaction",reaction:t,peer_id:this.appPeersManager.getOutputPeer(d)};this.appPeersManager.isMegagroup(o),l.recent_reactions.unshift(e),l.recent_reactions=l.recent_reactions.slice(0,3)}}const y=this.availableReactions;if(l&&(null==y?void 0:y.length)){const e=new Map;y.forEach(((t,a)=>{e.set(t.reaction,a)})),l.results.sort(((t,a)=>{var s,n;const i=t.reaction.document_id||t.reaction.emoticon,r=a.reaction.document_id||a.reaction.emoticon;return a.count-t.count||(null!==(s=e.get(i))&&void 0!==s?s:0)-(null!==(n=e.get(r))&&void 0!==n?n:0)}))}if(a)return e.reactions=l,this.rootScope.dispatchEvent("messages_reactions",[{message:e,changedResults:[]}]),Promise.resolve();this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:e.peer_id,msg_id:e.id,reactions:l,local:!0});const _=[o,p].join("-"),v=(0,oe.Z)(p),P=this.apiManager.invokeApi("messages.sendReaction",{peer:this.appPeersManager.getInputPeerById(o),msg_id:v,reaction:m.map((e=>e.reaction))}).then((e=>{(0,ue.Z)(e);const t=e.updates.findIndex((e=>"updateEditMessage"===e._||"updateEditChannelMessage"===e._));if(-1!==t){const a=e.updates[t];e.updates[t]={_:"updateMessageReactions",msg_id:v,peer:this.appPeersManager.getOutputPeer(o),reactions:a.message.reactions,pts:a.pts,pts_count:a.pts_count}}this.apiUpdatesManager.processUpdateMessage(e)})).catch((t=>{var a;"REACTION_INVALID"===t.type&&this.sendReactionPromises.get(_)===P&&this.sendReaction(e,null===(a=m[0])||void 0===a?void 0:a.reaction,!0)})).finally((()=>{this.sendReactionPromises.get(_)===P&&this.sendReactionPromises.delete(_)}));return this.sendReactionPromises.set(_,P),P}))}}var Ma=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Ia={EMOJI:"inputStickerSetAnimatedEmoji",EMOJI_ANIMATIONS:"inputStickerSetAnimatedEmojiAnimations",PREMIUM_GIFTS:"inputStickerSetPremiumGifts",GENERIC_ANIMATIONS:"inputStickerSetEmojiGenericAnimations",DEFAULT_STATUSES:"inputStickerSetEmojiDefaultStatuses",DEFAULT_TOPIC_ICONS:"inputStickerSetEmojiDefaultTopicIcons"},Sa=new Set(Object.values(Ia));class Ca extends G{constructor(){super(...arguments),this.storage=new W.Z(H.Z,"stickerSets"),this.processAllStickersResult=e=>((0,ue.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e)}after(){this.getStickerSetPromises={},this.getStickersByEmoticonsPromises={},this.sounds={},this.names={},this.rootScope.addEventListener("user_auth",(()=>{setTimeout((()=>{this.getAnimatedEmojiStickerSet()}),1e3),this.getGreetingStickersPromise||void 0!==this.getGreetingStickersTimeout||(this.getGreetingStickersTimeout=E.Z.setTimeout((()=>{this.getGreetingStickersTimeout=void 0,this.getGreetingSticker(!0)}),5e3))})),this.rootScope.addEventListener("app_config",(()=>this.onStickersUpdated("faved",!0))),this.apiUpdatesManager.addMultipleEventsListeners({updateNewStickerSet:e=>{const t=e.stickerset;this.saveStickerSet(t,t.set.id),this.rootScope.dispatchEvent("stickers_installed",t.set)},updateRecentStickers:()=>this.onStickersUpdated("recent",!0),updateFavedStickers:()=>this.onStickersUpdated("faved",!0),updateMoveStickerSetToTop:e=>{this.rootScope.dispatchEvent("stickers_top",e.stickerset)}})}onStickersUpdated(e,t){return Ma(this,void 0,void 0,(function*(){const a=yield"faved"===e?this.getFavedStickersStickers(t):this.getRecentStickersStickers(t);this.rootScope.dispatchEvent("stickers_updated",{type:e,stickers:a})}))}getGreetingSticker(e=!1){return this.getGreetingStickersTimeout&&(clearTimeout(this.getGreetingStickersTimeout),this.getGreetingStickersTimeout=void 0),this.getGreetingStickersPromise||(this.getGreetingStickersPromise=this.getStickersByEmoticon("👋⭐️",!1).then((e=>{if(!e.length)throw"NO_STICKERS";this.greetingStickers=e.slice(),this.greetingStickers.sort(((e,t)=>Math.random()-Math.random()))}))),this.getGreetingStickersPromise.then((()=>{let t;return e||(t=this.greetingStickers.shift(),this.greetingStickers.push(t)),this.apiFileManager.downloadMedia({media:this.greetingStickers[0]}),t}))}saveStickers(e){(0,ne.Z)(e,((t,a)=>{(t=this.appDocsManager.saveDoc(t))?e[a]=t:e.splice(a,1)}))}canUseStickerSetCache(e,t){var a;return e&&(null===(a=e.documents)||void 0===a?void 0:a.length)&&(Date.now()-e.refreshTime<36e5||t)}getStickerSet(e,t={}){let{id:a}=e;if(e.access_hash||(e=this.names[a]||e,a=e.id),this.getStickerSetPromises[a])return this.getStickerSetPromises[a];if(!t.overwrite){const e=this.storage.getFromCache(a);if(this.canUseStickerSetCache(e,t.useCache))return e}const s=this.getStickerSetPromises[a]=new Promise((n=>Ma(this,void 0,void 0,(function*(){if(!t.overwrite){const e=yield this.storage.get(a);if(this.canUseStickerSetCache(e,t.useCache))return this.saveStickers(e.documents),n(e),void(this.getStickerSetPromises[a]===s&&delete this.getStickerSetPromises[a])}try{const s=yield this.apiManager.invokeApi("messages.getStickerSet",{stickerset:this.getStickerSetInput(e),hash:0}),i=t.saveById?a:s.set.id;this.saveStickerSet(s,i),n(s)}catch(e){n(null)}this.getStickerSetPromises[a]===s&&delete this.getStickerSetPromises[a]}))));return s}getLocalStickerSet(e){return this.getStickerSet({id:e},{saveById:!0})}getAnimatedEmojiStickerSet(){return Promise.all([this.getLocalStickerSet(Ia.EMOJI),this.getLocalStickerSet(Ia.EMOJI_ANIMATIONS),this.getAnimatedEmojiSounds()]).then((([e,t])=>({emoji:e,animations:t})))}getAnimatedEmojiSounds(e){if(this.getAnimatedEmojiSoundsPromise&&!e)return this.getAnimatedEmojiSoundsPromise;const t=this.getAnimatedEmojiSoundsPromise=Promise.all([this.apiManager.getAppConfig(e),this.apiManager.getConfig()]).then((([e,a])=>{if(this.getAnimatedEmojiSoundsPromise===t)for(const t in e.emojies_sounds){const s=e.emojies_sounds[t],n=atob(s.file_reference_base64.replace(/-/g,"+").replace(/_/g,"/")),i=new Uint8Array(n.length);for(let e=0,t=i.length;e((0,ue.Z)(e),this.recentStickers=e.stickers,this.saveStickers(e.stickers),e),overwrite:e})}))}getRecentStickersStickers(e){if(e)this.recentStickers=void 0;else if(this.recentStickers)return this.recentStickers;return this.getRecentStickers(e).then((()=>this.recentStickers))}saveRecentSticker(e,t,a){const s=this.appDocsManager.getDoc(e);if((0,Pe.Z)(this.recentStickers,(t=>t.id===e)),!t){this.recentStickers.unshift(s);const e=(0,Pt.Z)(s.stickerEmojiRaw);for(const t in this.getStickersByEmoticonsPromises)this.getStickersByEmoticonsPromises[t].then((a=>{const n=(0,Pe.Z)(a,(e=>e.id===s.id));n?a.unshift(n):t.includes(e)&&a.unshift(s)}))}return this.rootScope.dispatchEvent("sticker_updated",{type:"recent",faved:!t,document:s}),t&&this.onStickersUpdated("recent",!1),this.apiManager.invokeApi("messages.saveRecentSticker",{id:zt(s),unsave:t,attached:a})}cleanEmoji(e){return e.replace(/\ufe0f/g,"").replace(/🏻|🏼|🏽|🏾|🏿/g,"")}getAnimatedEmojiSticker(e,t){const a=t?Ia.EMOJI_ANIMATIONS:Ia.EMOJI,s=this.storage.getFromCache(a);if(!(null==s?void 0:s.documents))return;t&&["🧡","💛","💚","💙","💜","🖤","🤍","🤎"].includes(e)&&(e="❤️"),e=this.cleanEmoji(e);const n=s.packs.find((t=>t.emoticon===e));return n?this.appDocsManager.getDoc(n.documents[0]):void 0}getAnimatedEmojiSoundDocument(e){return this.sounds[this.cleanEmoji(e)]}preloadAnimatedEmojiSticker(e){const t=this.getAnimatedEmojiStickerSet().then((()=>this.getAnimatedEmojiSticker(e)));return Promise.all([t,this.preloadAnimatedEmojiStickerAnimation(e)]).then((([e,t])=>({doc:e,animation:null==t?void 0:t.doc,sound:null==t?void 0:t.sound})))}preloadAnimatedEmojiStickerAnimation(e){return this.getAnimatedEmojiStickerSet().then((()=>this.getAnimatedEmojiSticker(e,!0))).then((t=>{if(!t)return;const a=this.getAnimatedEmojiSoundDocument(e);return Promise.all([this.preloadSticker(t.id),a?this.preloadSticker(a.id):void 0]).then((()=>({doc:t,sound:a})))}))}preloadSticker(e,t){var a;const s=this.appDocsManager.getDoc(e);return this.apiFileManager.downloadMedia({media:s,thumb:t?null===(a=s.video_thumbs)||void 0===a?void 0:a[0]:void 0})}saveStickerSet(e,t){const a={_:"messages.stickerSet",set:e.set,packs:e.packs,documents:e.documents,keywords:e.keywords};let s=this.storage.getFromCache(t);s?Object.assign(s,a):s=this.storage.setToCache(t,a),s.set.short_name&&(this.names[s.set.short_name]=this.getStickerSetInput(a.set)),this.saveStickers(e.documents);const n=s.set.installed_date||Sa.has(t);s.refreshTime=Date.now(),this.storage.set({[t]:s},!n)}getStickerSetThumbDownloadOptions(e){var t;const a=e.thumbs.find((e=>"photoSize"===e._)),s=e.thumb_dc_id,n=null===(t=e.pFlags)||void 0===t?void 0:t.animated;return{dcId:s,location:{_:"inputStickerSetThumb",stickerset:this.getStickerSetInput(e),thumb_version:e.thumb_version},size:a.size,mimeType:n?"application/x-tgsticker":"image/webp"}}getStickerSetInput(e){return Sa.has(e.id)?{_:e.id}:e.access_hash?{_:"inputStickerSetID",id:e.id,access_hash:e.access_hash}:{_:"inputStickerSetShortName",short_name:""+e.id}}getFeaturedStickers(){return Ma(this,void 0,void 0,(function*(){return(yield this.apiManager.invokeApiHashable({method:"messages.getFeaturedStickers",processResult:e=>((0,ue.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.set.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e.sets.forEach((e=>{this.saveStickerSet({set:e.set,documents:[],packs:[],keywords:[]},e.set.id)})),e)})).sets}))}getPromoPremiumStickers(){return this.getStickersByEmoticon("⭐️⭐️",!1)}getPremiumStickers(){return this.getStickersByEmoticon("📂⭐️",!1)}getFavedStickers(e){return this.apiManager.invokeApiHashable({method:"messages.getFavedStickers",processResult:e=>((0,ue.Z)(e),this.saveStickers(e.stickers),this.favedStickers=e.stickers,e),overwrite:e})}getFavedStickersStickers(e){if(e)this.favedStickers=void 0;else if(this.favedStickers)return this.favedStickers;return this.getFavedStickers(e).then((()=>this.favedStickers))}getFavedStickersLimit(){return this.apiManager.getLimit("favedStickers")}faveSticker(e,t){return Ma(this,void 0,void 0,(function*(){this.favedStickers||(yield this.getFavedStickersStickers());const a=yield this.getFavedStickersLimit(),s=this.appDocsManager.getDoc(e);return(0,Pe.Z)(this.favedStickers,(e=>e.id===s.id)),t||(this.favedStickers.unshift(s),this.favedStickers.splice(a,this.favedStickers.length-a)),this.rootScope.dispatchEvent("sticker_updated",{type:"faved",faved:!t,document:s}),this.apiManager.invokeApi("messages.faveSticker",{id:zt(s),unfave:t}).then((()=>{t&&this.onStickersUpdated("faved",!0)}))}))}toggleStickerSet(e){return Ma(this,void 0,void 0,(function*(){if((e=this.storage.getFromCache(e.id).set).installed_date){if(yield this.apiManager.invokeApi("messages.uninstallStickerSet",{stickerset:this.getStickerSetInput(e)}))return delete e.installed_date,this.rootScope.dispatchEvent("stickers_deleted",e),this.storage.delete(e.id,!0),!0}else if(yield this.apiManager.invokeApi("messages.installStickerSet",{stickerset:this.getStickerSetInput(e),archived:!1}))return e.installed_date=Date.now()/1e3|0,this.rootScope.dispatchEvent("stickers_installed",e),!0;return!1}))}toggleStickerSets(e){return Promise.all(e.map((e=>this.toggleStickerSet(e))))}searchStickerSets(e,t=!0){return Ma(this,void 0,void 0,(function*(){const a=t?1:0,s=yield this.apiManager.invokeApiHashable({method:"messages.searchStickerSets",params:{flags:a,exclude_featured:t||void 0,q:e},processResult:e=>((0,ue.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.set.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e.sets.forEach((e=>{this.saveStickerSet({set:e.set,documents:[],packs:[],keywords:[]},e.set.id)})),e)}),n=[],r=this.storage.getCache();for(const t in r){const{set:a}=r[t];a.title.toLowerCase().includes(e.toLowerCase())&&!s.sets.find((e=>e.set.id===a.id))&&n.push({_:"stickerSetCovered",set:a,cover:null})}return s.sets.concat(n)}))}getAllStickers(){return this.apiManager.invokeApiHashable({method:"messages.getAllStickers",processResult:this.processAllStickersResult})}getEmojiStickers(){return this.apiManager.invokeApiHashable({method:"messages.getEmojiStickers",processResult:this.processAllStickersResult})}preloadStickerSets(){return this.getAllStickers().then((e=>Promise.all(e.sets.map((e=>this.getStickerSet(e,{useCache:!0}))))))}getStickersByEmoticon(e,t=!0){return e=(0,Pt.Z)(e),this.getStickersByEmoticonsPromises[e]?this.getStickersByEmoticonsPromises[e]:this.getStickersByEmoticonsPromises[e]=Promise.all([this.apiManager.invokeApiHashable({method:"messages.getStickers",params:{emoticon:e},processResult:e=>e}),t?this.preloadStickerSets():[],t?this.getRecentStickers():void 0]).then((([t,a,s])=>{const n=t.stickers.map((e=>this.appDocsManager.saveDoc(e))),r=[],o=[],p=t=>{for(const a of t)if((0,Pt.Z)(a.emoticon).includes(e))for(const e of a.documents){const t=this.appDocsManager.getDoc(e);(t.animated?r:o).push(t)}};if(s){p(s.packs);const e=s.stickers;[r,o].forEach((t=>{t.sort(((t,a)=>e.indexOf(t)-e.indexOf(a)))}))}for(const e of a)p(e.packs);const d=[...new Set(r.concat(o,n))];return(0,ne.Z)(d,((e,t,a)=>{(3===e.sticker&&!i().IS_WEBM_SUPPORTED||!this.rootScope.premium&&(0,Wt.Z)(e))&&a.splice(t,1)})),d}))}clearRecentStickers(){return this.recentStickers&&(this.recentStickers.length=0,this.onStickersUpdated("recent",!1)),this.apiManager.invokeApi("messages.clearRecentStickers")}}var wa=a(467),ka=a(8493);class Aa extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e)this.users={},this.usernames={};else for(const e in this.users){if(!e)continue;const t=e.toPeerId();if(!this.peersStorage.isPeerNeeded(t)){const t=this.users[e];this.modifyUsernamesCache(t,!1),this.storage.delete(e),delete this.users[e]}}this.getTopPeersPromises={},this.contactsIndex=this.createSearchIndex(),this.contactsFillPromise=void 0,this.contactsList=new Set,this.updatedContactsList=!1},this.updateUsersStatuses=()=>{const e=(0,te.Z)(!0);for(const t in this.users){const a=this.users[t];this.updateUserStatus(a,e)}}}after(){return this.clear(!0),setInterval(this.updateUsersStatuses,6e4),this.rootScope.addEventListener("state_synchronized",this.updateUsersStatuses),this.apiUpdatesManager.addMultipleEventsListeners({updateUserStatus:e=>{const t=e.user_id,a=this.users[t];a&&(a.status=e.status,a.status&&("expires"in a.status&&(a.status.expires-=this.timeManager.getServerTimeOffset()),"was_online"in a.status&&(a.status.was_online-=this.timeManager.getServerTimeOffset())),this.rootScope.dispatchEvent("user_update",t),this.setUserToStateIfNeeded(a))},updateUserName:e=>{const t=e.user_id,a=this.users[t];a&&(this.forceUserOnline(t),this.saveApiUser(Object.assign(Object.assign({},a),{first_name:e.first_name,last_name:e.last_name,username:void 0,usernames:e.usernames}),!0))}}),this.rootScope.addEventListener("language_change",(e=>{const t=this.getSelf().id;this.contactsIndex.indexObject(t,this.getUserSearchText(t))})),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("users")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.saveApiUsers(t);for(let a=0,s=t.length;a{if(!this.appPeersManager.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)||this.storage.set({[t]:this.getUser(t)})})),this.peersStorage.addEventListener("peerUnneeded",(e=>{if(!this.appPeersManager.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)&&this.storage.delete(t)}))}))}get userId(){return this.rootScope.myId.toUserId()}onContactsModified(e){e&&this.appStateManager.pushToState("contactsListCachedTime",(0,te.Z)(!0))}pushRecentSearch(e){return this.appStateManager.getState().then((t=>{const a=t.recentSearch||[];if(a[0]!==e){(0,M.Z)(a,e),a.unshift(e),a.length>20&&(a.length=20),this.appStateManager.pushToState("recentSearch",a);for(const e of a)this.peersStorage.requestPeer(e,"recentSearch")}}))}clearRecentSearch(){return this.appStateManager.getState().then((e=>{const t=e.recentSearch||[];for(const e of t)this.peersStorage.releasePeer(e,"recentSearch");t.length=0,this.appStateManager.pushToState("recentSearch",t)}))}fillContacts(){var e;if(this.contactsFillPromise&&this.updatedContactsList)return{cached:this.contactsFillPromise.isFulfilled,promise:this.contactsFillPromise};this.updatedContactsList=!0;const t=(0,v.Z)();return this.apiManager.invokeApi("contacts.getContacts").then((e=>{"contacts.contacts"===e._&&(this.contactsList.clear(),this.saveApiUsers(e.users),e.contacts.forEach((e=>{this.pushContact(e.user_id)})),this.onContactsModified(!0),this.contactsFillPromise=t),t.resolve(this.contactsList)}),(()=>{this.updatedContactsList=!1})),{cached:null===(e=this.contactsFillPromise)||void 0===e?void 0:e.isFulfilled,promise:this.contactsFillPromise||(this.contactsFillPromise=t)}}resolveUsername(e){"@"===e[0]&&(e=e.slice(1)),e=e.toLowerCase();const t=this.usernames[e];return t?this.appPeersManager.getPeer(t):this.apiManager.invokeApiSingleProcess({method:"contacts.resolveUsername",params:{username:e},processResult:e=>this.processResolvedPeer(e)})}processResolvedPeer(e){return this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appPeersManager.getPeer((0,le.Z)(e.peer))}resolvePhone(e){return this.apiManager.invokeApi("contacts.resolvePhone",{phone:e}).then((e=>this.processResolvedPeer(e)))}pushContact(e){this.contactsList.add(e),this.contactsIndex.indexObject(e,this.getUserSearchText(e)),this.peersStorage.requestPeer(e.toPeerId(),"contact")}popContact(e){this.contactsList.delete(e),this.contactsIndex.indexObject(e,""),this.peersStorage.releasePeer(e.toPeerId(),"contact")}getUserSearchText(e){const t=this.users[e];return t?[t.first_name,t.last_name,t.phone,...(0,Jt.Z)(t),t.pFlags.self?"Saved Messages":""].filter(Boolean).join(" "):""}getContacts(e,t=!1,a="name"){return this.fillContacts().promise.then((s=>{let n=[...s];if(e){const t=this.contactsIndex.search(e);n=[...n].filter((e=>t.has(e)))}"name"===a?n.sort(((e,t)=>{const a=(this.users[e]||{}).sortName||"",s=(this.users[t]||{}).sortName||"";return a.localeCompare(s)})):"online"===a&&n.sort(((e,t)=>{const a=this.getUserStatusForSort(this.getUser(e).status);return this.getUserStatusForSort(this.getUser(t).status)-a}));const i=this.userId;return(0,M.Z)(n,i),t&&this.testSelfSearch(e)&&n.unshift(i),n}))}getContactsPeerIds(e,t,a,s){return this.getContacts(e,t,a).then((e=>{const t=e.map((e=>e.toPeerId(!1)));return s?t.slice(0,s):t}))}toggleBlock(e,t){return this.apiManager.invokeApiSingle(t?"contacts.block":"contacts.unblock",{id:this.appPeersManager.getInputPeerById(e)}).then((a=>(a&&this.apiUpdatesManager.processLocalUpdate({_:"updatePeerBlocked",peer_id:this.appPeersManager.getOutputPeer(e),blocked:t}),a)))}testSelfSearch(e){const t=this.getSelf(),a=this.createSearchIndex();return a.indexObject(t.id,this.getUserSearchText(t.id)),a.search(e).has(t.id)}createSearchIndex(){return new ae.Z({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0})}saveApiUsers(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiUser(e,t))))}modifyUsernamesCache(e,t){const a=(0,Jt.Z)(e);if(!a.length)return;const s=a.map((e=>function(e){return e&&e.toLowerCase()||""}(e)));t?s.forEach((t=>{this.usernames[t]=e.id.toPeerId("user"!==e._)})):s.forEach((e=>{delete this.usernames[e]}))}setUsernameToCache(e,t){return!(t&&t.username===e.username&&(0,Y.Z)(t.usernames,e.usernames)||(this.modifyUsernamesCache(t,!1),this.modifyUsernamesCache(e,!0),0))}saveApiUser(e,t){var a,s,n,i;if(!e||"userEmpty"===e._)return;const r=e.id,o=this.users[r];if(null!==(a=e.pFlags)&&void 0!==a||(e.pFlags={}),e.pFlags.min&&void 0!==o)return;const p=this.setUsernameToCache(e,o);if(o&&void 0!==o.sortName&&o.first_name===e.first_name&&o.last_name===e.last_name)e.sortName=o.sortName;else{const t=e.first_name+(e.last_name?" "+e.last_name:"");e.sortName=e.pFlags.deleted?"":(0,wa.ZP)(t,!1)}if(e.status&&(e.status.expires&&(e.status.expires-=this.timeManager.getServerTimeOffset()),e.status.was_online&&(e.status.was_online-=this.timeManager.getServerTimeOffset())),"userProfilePhotoEmpty"===(null===(s=e.photo)||void 0===s?void 0:s._)&&delete e.photo,void 0===o)this.users[r]=e;else{const t=e.first_name!==o.first_name||e.last_name!==o.last_name||p,a=(null===(n=o.photo)||void 0===n?void 0:n.photo_id)!==(null===(i=e.photo)||void 0===i?void 0:i.photo_id),s=o.pFlags.premium!==e.pFlags.premium||o.pFlags.verified!==e.pFlags.verified||o.pFlags.scam!==e.pFlags.scam||o.pFlags.fake!==e.pFlags.fake,d=!!o.pFlags.contact,f=!!e.pFlags.contact;re(o,e),this.rootScope.dispatchEvent("user_update",r),d!==f&&this.onContactUpdated(r,f,d),a&&this.rootScope.dispatchEvent("avatar_update",{peerId:e.id.toPeerId()}),(t||s)&&this.rootScope.dispatchEvent("peer_title_edit",{peerId:e.id.toPeerId()})}this.checkPremium(e,o),this.setUserToStateIfNeeded(e)}checkPremium(e,t){if(e.pFlags.self){const a=!!e.pFlags.premium;this.rootScope.premium!==a&&this.rootScope.dispatchEvent("premium_toggle_private",{isNew:!t,isPremium:a})}}setUserToStateIfNeeded(e){this.peersStorage.isPeerNeeded(e.id.toPeerId())&&this.storage.set({[e.id]:e})}isUserOnlineVisible(e){return this.getUserStatusForSort(e)>3}getUserStatusForSort(e){if("object"!=typeof e){const t=this.getUser(e);e=null==t?void 0:t.status}if(e){const t="userStatusOnline"===e._?e.expires:"userStatusOffline"===e._?e.was_online:0;if(t)return t;switch(e._){case"userStatusRecently":return 3;case"userStatusLastWeek":return 2;case"userStatusLastMonth":return 1}}return 0}getUser(e){return(0,fe.Z)(e)?e:this.users[e]}getUserStatus(e){return this.isRegularUser(e)&&!this.users[e].pFlags.self&&this.users[e].status}getUserPhone(e){return t=this,a=void 0,n=function*(){const t=this.getUser(e);if(!(null==t?void 0:t.phone))return;const a=yield this.apiManager.getAppConfig();return{phone:t.phone,isAnonymous:a.fragment_prefixes.some((e=>t.phone.startsWith(e)))}},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}getSelf(){return this.getUser(this.userId)}isBot(e){return this.users[e]&&!!this.users[e].pFlags.bot}isAttachMenuBot(e){return this.isBot(e)&&!!this.users[e].pFlags.bot_attach_menu}isContact(e){return this.contactsList.has(e)||!(!this.users[e]||!this.users[e].pFlags.contact)}isRegularUser(e){const t=this.users[e];return t&&!this.isBot(e)&&!t.pFlags.deleted&&!t.pFlags.support}isNonContactUser(e){return this.isRegularUser(e)&&!this.isContact(e)&&e!==this.userId}hasUser(e,t){const a=this.users[e];return(0,fe.Z)(a)&&(t||!a.pFlags.min)}getUserString(e){const t=this.getUser(e);return"u"+e+(t.access_hash?"_"+t.access_hash:"")}getUserInput(e){const t=this.getUser(e);return t.pFlags&&t.pFlags.self?{_:"inputUserSelf"}:{_:"inputUser",user_id:e,access_hash:t.access_hash}}getUserInputPeer(e){return{_:"inputPeerUser",user_id:e,access_hash:this.getUser(e).access_hash}}getContactMediaInput(e){const t=this.getUser(e);return{_:"inputMediaContact",first_name:t.first_name,last_name:t.last_name,phone_number:t.phone,vcard:"",user_id:e}}updateUserStatus(e,t=(0,te.Z)(!0)){e.status&&"userStatusOnline"===e.status._&&e.status.expires=60)return}else if(this.apiUpdatesManager.updatesState.syncLoading)return;const s=this.getUser(e);!(null==s?void 0:s.status)||"userStatusOnline"===s.status._||"userStatusEmpty"===s.status._||s.pFlags.support||s.pFlags.deleted||(s.status={_:"userStatusOnline",expires:a+60},this.rootScope.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(s))}importContact(e,t,a){return this.importContacts([{first_name:e,last_name:t,phones:[a]}]).then((e=>{if(!e.length){const e=new Error;throw e.type="NO_USER",e}return e[0]}))}importContacts(e){const t=[];for(let a=0;a(this.saveApiUsers(e.users),e.imported.map((e=>(this.onContactUpdated(e.user_id,!0),e.user_id))))))}getTopPeers(e){return this.getTopPeersPromises[e]?this.getTopPeersPromises[e]:this.getTopPeersPromises[e]=this.appStateManager.getState().then((t=>{const a=t.topPeersCache[e];return a&&a.cachedTime+864e5>Date.now()&&a.peers?a.peers:this.apiManager.invokeApi("contacts.getTopPeers",{[e]:!0,offset:0,limit:15,hash:"0"}).then((a=>{let s=[];return"contacts.topPeers"===a._&&(this.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),a.categories.length&&(s=a.categories[0].peers.map((e=>{const t=(0,le.Z)(e.peer);return this.peersStorage.requestPeer(t,"topPeer"),{id:t,rating:e.rating}})))),t.topPeersCache[e]={peers:s,cachedTime:Date.now()},this.appStateManager.pushToState("topPeersCache",t.topPeersCache),s}))}))}getBlocked(e=0,t=0){return this.apiManager.invokeApiSingle("contacts.getBlocked",{offset:e,limit:t}).then((e=>(this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),{count:"contacts.blocked"===e._?e.users.length+e.chats.length:e.count,peerIds:e.users.map((e=>e.id.toPeerId())).concat(e.chats.map((e=>e.id.toPeerId(!0))))})))}getLocated(e,t,a,s=!1,n=0){const i={_:"inputGeoPoint",lat:e,long:t,accuracy_radius:a};return this.apiManager.invokeApi("contacts.getLocated",{geo_point:i,background:s}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e)))}searchContacts(e,t=20){const a=(0,Lt.Z)(e);if(a.length&&a[0].length===e.trim().length&&"messageEntityUrl"===a[0]._)try{const t=new URL(je(e).url).pathname.slice(1);t&&(e=t)}catch(e){}return this.apiManager.invokeApiCacheable("contacts.search",{q:e,limit:t},{cacheSeconds:60}).then((e=>(this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),{my_results:(0,we.Z)(e.my_results.map((e=>(0,le.Z)(e)))),results:e.results.map((e=>(0,le.Z)(e)))})))}onContactUpdated(e,t,a=this.isContact(e)){t!==a&&(t?this.pushContact(e):this.popContact(e),this.onContactsModified(),this.rootScope.dispatchEvent("contacts_update",e))}updateUsername(e){return this.apiManager.invokeApi("account.updateUsername",{username:e}).then((e=>{this.saveApiUser(e)}))}setUserStatus(e,t){if(this.isBot(e))return;const a=this.users[e];if(a){const s=t?{_:"userStatusOffline",was_online:(0,te.Z)(!0)}:{_:"userStatusOnline",expires:(0,te.Z)(!0)+50};a.status=s,this.rootScope.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(a)}}updateMyOnlineStatus(e){return this.setUserStatus(this.getSelf().id,e),this.apiManager.invokeApiSingle("account.updateStatus",{offline:e})}addContact(e,t,a,s,n){return this.apiManager.invokeApi("contacts.addContact",{id:this.getUserInput(e),first_name:t,last_name:a,phone:s,add_phone_privacy_exception:n}).then((t=>{this.apiUpdatesManager.processUpdateMessage(t,{override:!0}),this.onContactUpdated(e,!0)}))}deleteContacts(e){return this.apiManager.invokeApi("contacts.deleteContacts",{id:e.map((e=>this.getUserInput(e)))}).then((t=>{this.apiUpdatesManager.processUpdateMessage(t,{override:!0}),e.forEach((e=>{this.onContactUpdated(e,!1)}))}))}checkUsername(e){return this.apiManager.invokeApi("account.checkUsername",{username:e})}toggleUsername(e,t){return this.apiManager.invokeApi("account.toggleUsername",{username:e,active:t})}reorderUsernames(e){return this.apiManager.invokeApi("account.reorderUsernames",{order:e})}canSendToUser(e){return(0,ka.Z)(this.getUser(e))}}const Da=new Set(["photo","video","gif","document"]);class Ua extends G{constructor(){super(...arguments),this.webpages={},this.pendingWebPages={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateWebPage:e=>{this.saveWebPage(e.webpage)}})}saveWebPage(e,t,a){var s,n;if("webPageNotModified"===e._||"webPageEmpty"===e._)return;const{id:i}=e,r=this.webpages[i],o=r&&r._===e._&&r.hash==r.hash;if("webPage"===e._){"photo"===(null===(s=e.photo)||void 0===s?void 0:s._)?e.photo=this.appPhotosManager.savePhoto(e.photo,a):delete e.photo,"document"===(null===(n=e.document)||void 0===n?void 0:n._)?e.document=this.appDocsManager.saveDoc(e.document,a):("document"===e.type&&delete e.type,delete e.document);const t=e.site_name,i=e.title||e.author||t||"";t&&i===t&&delete e.site_name,Da.has(e.type)||e.description||!e.photo||(e.type="photo")}let p=this.pendingWebPages[i];if(t&&(p||(p=this.pendingWebPages[i]=new Set),p.add(t)),void 0===r?this.webpages[i]=e:re(r,e),!t&&void 0!==p&&o){const e=[];p.forEach((t=>{const[a,s,n]=t.split("_");e.push({peerId:a.toPeerId(),mid:+s,isScheduled:!!n})})),this.rootScope.dispatchEvent("webpage_updated",{id:i,msgs:e})}return e}getMessageKeyForPendingWebPage(e,t,a){return e+"_"+t+(a?"_s":"")}deleteWebPageFromPending(e,t){const a=e.id;if(!a)return;const s=this.pendingWebPages[a];s&&s.has(t)&&(s.delete(t),s.size||delete this.pendingWebPages[a])}getCachedWebPage(e){return this.webpages[e]}getWebPage(e){return this.apiManager.invokeApiHashable({method:"messages.getWebPage",processResult:e=>this.saveWebPage(e),params:{url:e}})}}var Ta=a(5936),Ea=a(3019);function Fa(e){return(0,Ea.Z)(e,"readAsArrayBuffer")}var Ra=a(1243),xa=a(7086);function Ba(e){return encodeURIComponent(e).replace(/['()]/g,escape).replace(/\*/g,"%2A")}class Va{constructor(e,t){this.serviceMessagePort=e,this.downloadId=t,this.serviceMessagePort=Ws()}write(e,t){return a=this,s=void 0,i=function*(){return this.serviceMessagePort.invoke("downloadChunk",{id:this.downloadId,chunk:e})},new((n=void 0)||(n=Promise))((function(e,t){function r(e){try{p(i.next(e))}catch(e){t(e)}}function o(e){try{p(i.throw(e))}catch(e){t(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof n?a:new n((function(e){e(a)}))).then(r,o)}p((i=i.apply(a,s||[])).next())}));var a,s,n,i}finalize(e){return this.serviceMessagePort.invoke("downloadFinalize",this.downloadId).then((()=>{}))}}class Oa{getFile(e){return Promise.reject((0,X.Z)("NO_ENTRY_FOUND"))}prepareWriting({fileName:e,downloadId:t,size:a}){const s=Object.assign({"Content-Type":"application/octet-stream; charset=utf-8","Content-Disposition":"attachment; filename*=UTF-8''"+Ba(e)},a?{"Content-Length":a}:{}),n=Ws(),i=n.invoke("download",{headers:s,id:t}),r=(0,v.Z)();return r.cancel=()=>{r.reject((0,X.Z)("DOWNLOAD_CANCELED"))},r.catch((()=>{Ws().invoke("downloadCancel",t)})),i.then(r.resolve,r.reject),{deferred:r,getWriter:()=>new Va(n,t)}}}var La=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Na=131072,Za=new Set(["DOWNLOAD_CANCELED","UPLOAD_CANCELED","UNKNOWN","NO_NEW_CONTEXT"]);class ja extends G{constructor(){super(...arguments),this.cacheStorage=new Ta.Z("cachedFiles"),this.downloadStorage=new Oa,this.downloadPromises={},this.uploadPromises={},this.downloadPulls={},this.downloadActives={},this.refreshReferencePromises={},this.log=(0,I.kg)("AFM",I.v9.Error|I.v9.Log),this.tempId=0,this.queueId=0,this.debug=b.Z.debug,this.maxUploadParts=4e3,this.maxDownloadParts=8e3,this.uncompressTGS=(e,t)=>this.cryptoWorker.invokeCrypto("gzipUncompress",e.slice().buffer,!1),this.uncompressTGV=(e,t)=>{const a=e.slice().buffer;return i().IS_FIREFOX?this.cryptoWorker.invokeCrypto("gzipUncompress",a,!0).then((e=>function(e){const t=e.indexOf("/,` width="${n}" height="${i}">`).replace(/[^\x00-\x7F]/g,"")}(e))).then((e=>(new TextEncoder).encode(e))):this.cryptoWorker.invokeCrypto("gzipUncompress",a,!1)},this.convertWebp=(e,t)=>f.Z.getInstance().invoke("convertWebp",{fileName:t,bytes:e}),this.convertOpus=(e,t)=>f.Z.getInstance().invoke("convertOpus",{fileName:t,bytes:e})}after(){setInterval((()=>{for(const e in this.refreshReferencePromises){const{deferred:t}=this.refreshReferencePromises[e];(t.isFulfilled||t.isRejected)&&delete this.refreshReferencePromises[e]}}),18e5),this.rootScope.addEventListener("config",(e=>{this.webFileDcId=e.webfile_dc_id})),this.rootScope.addEventListener("app_config",(e=>{this.maxUploadParts=this.rootScope.premium?e.upload_max_fileparts_premium:e.upload_max_fileparts_default,this.maxDownloadParts=e.upload_max_fileparts_premium}))}downloadRequest(e,t,a,s,n=0){void 0===this.downloadPulls[e]&&(this.downloadPulls[e]=[],this.downloadActives[e]=0);const i=this.downloadPulls[e],r=new Promise(((e,r)=>{i.push({id:t,queueId:n,cb:a,deferred:{resolve:e,reject:r},activeDelta:s})}));return setTimeout((()=>{this.downloadCheck(e)}),0),r}downloadCheck(e){const t=this.downloadPulls[e],a=this.rootScope.premium?224:36;if(this.downloadActives[e]>=a||!(null==t?void 0:t.length))return!1;const s=(0,Pe.Z)(t,(e=>0===e.queueId))||(0,Pe.Z)(t,(e=>e.queueId===this.queueId))||t.shift(),n=s.activeDelta||1;this.downloadActives[e]+=n;const i=s.cb();i.then((()=>{this.downloadActives[e]-=n,this.downloadCheck(e)}),(t=>{(null==t?void 0:t.type)&&Za.has(t.type)||this.log.error("downloadCheck error:",t),this.downloadActives[e]-=n,this.downloadCheck(e)})).finally((()=>{i.then(s.deferred.resolve,s.deferred.reject)}))}setQueueId(e){this.queueId=e}getFileStorage(){return this.cacheStorage}cancelDownload(e){const t=[this.downloadPromises[e],this.uploadPromises[e]].filter(Boolean);let a=!1;for(let e=0,s=t.length;eLa(this,void 0,void 0,(function*(){return null==r||r(),this.apiManager.invokeApi("upload.getWebFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0})}))),this.getDelta(s),i)}requestFilePart(e,t,a,s,n=0,i=0,r){return this.downloadRequest(e,n,(()=>La(this,void 0,void 0,(function*(){null==r||r();const n=()=>La(this,void 0,void 0,(function*(){var i;null==r||r();const o=null===(i=t.file_reference)||void 0===i?void 0:i.slice();return this.apiManager.invokeApi("upload.getFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0}).catch((e=>{if(null==r||r(),"FILE_REFERENCE_EXPIRED"===e.type)return this.refreshReference(t,o).then(n);throw e}))}));(0,ue.Z)(t);const i=t.file_reference;if(i&&!t.checkedReference){t.checkedReference=!0;const e=T(i);if(this.refreshReferencePromises[e])return this.refreshReference(t,i).then(n)}return n()}))),this.getDelta(s),i)}getDelta(e){return e/Na}getLimitPart(e,t){if(!e)return 524288;let a=Na;const s=t?this.maxUploadParts:this.maxDownloadParts,n=t?524288:1048576;for(;e/a>s&&a{a===T(t)&&e.reject((0,X.Z)("REFERENCE_IS_NOT_REFRESHED")),e.resolve(t)}),e.reject)}return s.deferred.then((t=>{e.file_reference=t}))}isDownloading(e){return!!this.downloadPromises[e]}getDownload(e){return this.downloadPromises[e]}getUpload(e){return this.uploadPromises[e]}getConvertMethod(e){let t;return"application/x-tgwallpattern"===e?(t=this.uncompressTGV,e="image/svg+xml"):"image/webp"!==e||i().IS_WEBP_SUPPORTED?"application/x-tgsticker"===e?(t=this.uncompressTGS,e="application/json"):"audio/ogg"!==e||i().IS_OPUS_SUPPORTED||(t=this.convertOpus,e="audio/wav"):(t=this.convertWebp,e="image/png"),{mimeType:e,process:t}}allocateDeferredPromises(e,t,a){const s=[];let n,i=e,r=Promise.resolve();do{n=(0,v.Z)(),s.push({offset:i,writePromise:r,writeDeferred:n}),r=n,i+=a}while(i{if(!(null==e?void 0:e.error))for(const a of M)e&&e!==a||(a.error=t,a.deferred.reject(t))},y=this.tempId++,_=e.limitPart||this.getLimitPart(s,!1);let v,P,b=m.getFile.bind(m);const M=[],I=s||_,S=(e,t)=>{const{deferred:a}=e,s=u.bind(null,e);a.cancel=()=>a.reject((0,X.Z)("DOWNLOAD_CANCELED")),a.catch((t=>{var a,n;s(t),null===(n=null===(a=e.writer)||void 0===a?void 0:a.truncate)||void 0===n||n.call(a)})).finally((()=>{this.downloadPromises[t]===a&&delete this.downloadPromises[t],delete e.writer})),this.downloadPromises[t]=a,M.push(e)};if(m&&(!g||I<=o.Iw)&&(v=m.prepareWriting(l,I,e.mimeType),S(v,l)),g){let t=e.fileName;if(!t){t=l;const a=gt[e.mimeType];a&&(t+="."+a)}P=g.prepareWriting({fileName:t,downloadId:r,size:I}),S(P,c),v&&P.deferred.catch((e=>v.deferred.reject(e)))}h=null!==(a=null==P?void 0:P.deferred)&&void 0!==a?a:v.deferred,g&&f&&(b=g.getFile.bind(g)),b(l).then((e=>La(this,void 0,void 0,(function*(){if(C(),P){const t=P.writer=P.getWriter();C();const a=yield function(e){return Fa(e).then((e=>new Uint8Array(e)))}(e);C(),yield t.write(a),C(),P.deferred.resolve(yield t.finalize())}v&&v.deferred.resolve(e)})))).catch((t=>La(this,void 0,void 0,(function*(){if(e.onlyCache)return void u(null,t);M.forEach((e=>{e.writer=e.getWriter()}));const a="inputWebFileLocation"===i._,r=(a?this.requestWebFilePart:this.requestFilePart).bind(this);a&&void 0===this.webFileDcId&&(yield this.apiManager.getConfig(),C());const p=this.allocateDeferredPromises(0,s,_),d={done:0,offset:0,total:s,fileName:c},m=()=>{try{C(),d.done=h,this.rootScope.dispatchEvent("download_progress",d)}catch(e){}},g=(0,aa.Z)(m,50,!0);let h=0;const v=()=>La(this,void 0,void 0,(function*(){const{offset:t,writePromise:a,writeDeferred:d}=p.shift();try{C();performance.now();const u=yield r(n,i,t,_,y,e.queueId,C),P=(performance.now(),u.bytes);p.length&&v();const b=P.byteLength;this.debug&&this.log("downloadFile requestFilePart result:",c,u);const I=t+_>=s||!b;if(b){h+=b,I?m():g();performance.now();yield a,C(),performance.now(),performance.now(),yield Promise.all(M.map((({writer:e})=>null==e?void 0:e.write(P,t)))),C()}if(I&&(!s||h{var t;return null===(t=null==e?void 0:e.trim)||void 0===t?void 0:t.call(e,h)})),I&&f){const e=M.filter((({writer:e})=>(null==e?void 0:e.getParts)&&e.replaceParts)).map((({writer:e})=>La(this,void 0,void 0,(function*(){const t=e.getParts(),a=yield f(t,l);e.replaceParts(a)}))));yield Promise.all(e),C()}if(d.resolve(),I){const e=h<=o.Iw;M.forEach((t=>{const{deferred:a,writer:s}=t;if(a.isFulfilled||a.isRejected||!s)return;const n=s.finalize(e);a.resolve(n)}))}}catch(e){u(null,e)}}));for(let e=0,t=Math.min(1/0,p.length);e{if(M.reduce(((e,t)=>e+ +!!t.error),0)===M.length)throw M[0].error};return h}downloadMedia(e){let{media:t,thumb:a}=e;const s="photo"===t._;if(s&&!a)return Promise.reject("preloadPhoto photoEmpty!");const n="document"===t._;n?t=this.appDocsManager.getDoc(t.id):s&&(t=this.appPhotosManager.getPhoto(t.id));const{fileName:i,downloadOptions:r}=(0,Ra.Z)(e);let o=this.getDownload(i);return o||(o=this.download(r),n&&!a&&(this.rootScope.dispatchEvent("document_downloading",t.id),o.catch(jt.Z).finally((()=>{this.rootScope.dispatchEvent("document_downloaded",t.id)})))),o}downloadMediaURL(e){const{media:t,thumb:a}=e;let s=this.thumbsStorage.getCacheContext(t,null==a?void 0:a.type);return(!a||s.downloaded>=("size"in a?a.size:0))&&s.url?Promise.resolve(s.url):this.downloadMedia(e).then((e=>{if(!s.downloaded||s.downloaded=10485760,n=this.getLimitPart(a,!0),i=this.getDelta(n),r=Math.ceil(a/n),o=(0,Te.a)(),p={_:s?"inputFileBig":"inputFile",id:o,parts:r,name:t,md5_checksum:""},d=(0,v.Z)();if(r>this.maxUploadParts)return d.reject((0,X.Z)("FILE_TOO_BIG")),d;let f=!1,c=!1,l=e=>{"UPLOAD_CANCELED"!==(null==e?void 0:e.type)&&this.log.error("Up Error",e),d.reject(e),f=!0,l=jt.Z};const m=s?"upload.saveBigFilePart":"upload.saveFilePart",g=this.tempId++,h=this,u=function*(){let u=0,y=0;for(let v=0;vLa(this,void 0,void 0,(function*(){_();const i=e.slice(v,v+n),g=yield Fa(i);return _(),h.debug&&h.log("Upload file part, isBig:",s,P,g.byteLength,new Uint8Array(g).length,new Uint8Array(g).slice().length),h.apiManager.invokeApi(m,{file_id:o,file_part:P,file_total_parts:r,bytes:g},{fileUpload:!0}).then((()=>{if(f)return;++y;const e={done:y*n,offset:v,total:a,fileName:t};d.notify(e),y>=r&&(d.resolve(p),c=!0)}),l)}))),i).catch(l)}}(),y=()=>{if(f)return;const e=u.next();e.done||f||e.value.then(y)};for(let e=0,t=Math.min(1/0,r);e{if(f)throw(0,X.Z)("UPLOAD_CANCELED")};return d.cancel=()=>{f||c||(f=!0,l((0,X.Z)("UPLOAD_CANCELED")))},d.notify=e=>{this.rootScope.dispatchEvent("download_progress",e)},d.finally((()=>{this.uploadPromises[t]===d&&delete this.uploadPromises[t]})),this.uploadPromises[t]=d}}var qa=a(7487),Ga=a(6666),Ha=a(3306);class Wa extends G{constructor(){super(),this.hashes={},this.apiPromisesSingleProcess={},this.apiPromisesSingle={},this.apiPromisesCacheable={},this.afterMessageIdTemp=0}setUser(e){return this.setUserAuth(e.id)}invokeApiAfter(e,t={},a={}){let s=a;return s.prepareTempMessageId=""+ ++this.afterMessageIdTemp,s=Object.assign({},a),a.messageId=s.prepareTempMessageId,this.invokeApi(e,t,s)}invokeApiHashable(e){var t,a;null!==(t=e.params)&&void 0!==t||(e.params={}),null!==(a=e.options)&&void 0!==a||(e.options={});const{params:s,options:n,method:i,overwrite:r}=e,o=JSON.stringify(s);let p;return this.hashes[i]&&(p=this.hashes[i][o],p&&(r?(delete this.hashes[i][o],p=void 0):s.hash=p.hash)),this.invokeApiSingleProcess({method:i,processResult:t=>{if(t._.includes("NotModified"))return p.result;if(t.hash){const e=t.hash;this.hashes[i]||(this.hashes[i]={}),p=this.hashes[i][o]={hash:e,result:t}}if(e.processResult){const a=e.processResult(t);return p?p.result=a:a}return t},params:s,options:n})}invokeApiSingle(e,t={},a={}){const s=e+"-"+JSON.stringify(t),n=this.apiPromisesSingle;return n[s]?n[s]:n[s]=this.invokeApi(e,t,a).finally((()=>{delete n[s]}))}invokeApiSingleProcess(e){var t,a,s;null!==(t=e.params)&&void 0!==t||(e.params={}),null!==(a=e.options)&&void 0!==a||(e.options={});const{method:n,processResult:i,processError:r,params:o,options:p}=e,d=this.apiPromisesSingleProcess,f=p.cacheKey||JSON.stringify(o),c=null!==(s=d[n])&&void 0!==s?s:d[n]=new Map,l=c.get(f);if(l)return l;const m=()=>{const e=c.get(f);return e===h?void 0:e},g=this.invokeApi(n,o,p).then((e=>m()||i(e)),(e=>{const t=m();if(t)return t;if(!r)throw e;return r(e)})),h=g.finally((()=>{c.get(f)===h&&(c.delete(f),c.size||delete d[n])}));return c.set(f,h),h}invokeApiCacheable(e,t={},a={}){var s;const n=null!==(s=this.apiPromisesCacheable[e])&&void 0!==s?s:this.apiPromisesCacheable[e]={},i=JSON.stringify(t),r=n[i];if(r&&(!a.override||!r.fulfilled))return r.promise;let o;a.override&&(r&&r.timeout&&(clearTimeout(r.timeout),delete r.timeout),delete a.override),a.cacheSeconds&&(o=E.Z.setTimeout((()=>{delete n[i]}),1e3*a.cacheSeconds),delete a.cacheSeconds);const p=this.invokeApi(e,t,a);return n[i]={timestamp:Date.now(),fulfilled:!1,timeout:o,promise:p,params:t},p}clearCache(e,t){const a=this.apiPromisesCacheable[e];if(a)for(const e in a){const s=a[e];try{t(s.params)&&(s.timeout&&clearTimeout(s.timeout),delete a[e])}catch(e){}}}getConfig(e){return this.config&&!e?this.config:this.invokeApiSingleProcess({method:"help.getConfig",params:{},processResult:e=>(this.config=e,this.rootScope.dispatchEvent("config",e),e),options:{overwrite:e}})}getAppConfig(e){return this.appConfig&&!e?this.appConfig:this.invokeApiSingleProcess({method:"help.getAppConfig",params:{},processResult:e=>{var t;return this.appConfig=e,(0,ia.Ki)(null!==(t=e.ignore_restriction_reasons)&&void 0!==t?t:[]),this.rootScope.dispatchEvent("app_config",e),e},options:{overwrite:e}})}getLimit(e,t){return(0,q.Z)(this.getAppConfig(),(a=>{null!=t||(t=this.rootScope.premium);const s={pin:["dialogs_pinned_limit_default","dialogs_pinned_limit_premium"],folderPin:["dialogs_folder_pinned_limit_default","dialogs_folder_pinned_limit_premium"],folders:["dialog_filters_limit_default","dialog_filters_limit_premium"],favedStickers:["stickers_faved_limit_default","stickers_faved_limit_premium"],reactions:["reactions_user_max_default","reactions_user_max_premium"],bio:["about_length_limit_default","about_length_limit_premium"],topicPin:"topics_pinned_limit",caption:["caption_length_limit_default","caption_length_limit_premium"]}[e];return a[Array.isArray(s)?s[t?1:0]:s]}))}}var za=a(8453),Ka=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class Ja extends Wa{constructor(){super(),this.log=(0,I.kg)("API"),this.cachedNetworkers={},this.cachedExportPromise={},this.gettingNetworkers={},this.baseDcId=0,this.afterMessageTempIds={},this.transportType=b.Z.transport,Z.addEventListener("transport",(e=>{this.changeTransportType(e)})),setInterval((()=>{this.getAppConfig(!0)}),997e4)}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateConfig:()=>{this.getConfig(!0),this.getAppConfig(!0)}}),this.rootScope.addEventListener("user_auth",(()=>{this.config&&this.apiUpdatesManager.processLocalUpdate({_:"updateConfig"})})),this.rootScope.addEventListener("premium_toggle",(e=>{this.iterateNetworkers((({networker:t,connectionType:a,dcId:s,transportType:n})=>{if("client"===a||"websocket"!==n)return;const i=t.transport;if(i){if(i.connection){const t=V(s,a,e);i.changeUrl(t)}}else this.log.error("wow what, no transport?",t)}))}))}getTransportType(e){return this.transportType}iterateNetworkers(e){for(const t in this.cachedNetworkers){const a=this.cachedNetworkers[t];for(const s in a){const n=a[s];for(const a in n)n[a].forEach(((n,i,r)=>{e({networker:n,dcId:+a,connectionType:s,transportType:t,index:i,array:r})}))}}}chooseServer(e,t,a){return this.dcConfigurator.chooseServer(e,t,a,"client"===t,this.rootScope.premium)}changeTransportType(e){const t=this.transportType;if(t===e)return;this.log("changing transport from",t,"to",e);const a=this.cachedNetworkers[t],s=this.cachedNetworkers[e];this.cachedNetworkers[e]=a,this.cachedNetworkers[t]=s,this.transportType=e;for(const a in this.gettingNetworkers){const s=this.gettingNetworkers[a];delete this.gettingNetworkers[a];const n=a.replace(t,e);this.gettingNetworkers[n]=s,this.log("changed networker getKey from",a,"to",n)}this.iterateNetworkers((e=>{const t=this.getTransportType(e.connectionType),a=this.chooseServer(e.dcId,e.connectionType,t);this.changeNetworkerTransport(e.networker,a)}))}getBaseDcId(){return Ka(this,void 0,void 0,(function*(){if(this.baseDcId)return this.baseDcId;const e=yield qa.Z.get("dc");return this.baseDcId||(e?this.baseDcId=e:this.setBaseDcId(_.Z.baseDcId)),this.baseDcId}))}setUserAuth(e){return Ka(this,void 0,void 0,(function*(){if("string"!=typeof e&&"number"!=typeof e||(e={dcID:0,date:Date.now()/1e3|0,id:e.toPeerId(!1)}),this.rootScope.dispatchEvent("user_auth",e),!e.dcID){const t=yield this.getBaseDcId();e.dcID=t}qa.Z.set({user_auth:e})}))}setBaseDcId(e){const t=this.baseDcId;t&&this.getNetworker(t).then((e=>{this.setOnDrainIfNeeded(e)})),this.baseDcId=e,qa.Z.set({dc:this.baseDcId})}logOut(){return Ka(this,void 0,void 0,(function*(){if(this.loggingOut)return;this.loggingOut=!0;const e=[];for(let t=1;t<=5;t++)e.push("dc"+t+"_auth_key");const t=yield Promise.all(e.map((e=>qa.Z.get(e)))),a=[];for(let e=0;eKa(this,void 0,void 0,(function*(){this.baseDcId=void 0,yield(0,za.Z)(!1,!0),Ga.C.closeDatabases(),this.rootScope.dispatchEvent("logging_out")}));return setTimeout(s,1e3),Promise.all(a).catch((e=>{e.handled=!0})).finally(s)}))}generateNetworkerGetKey(e,t,a){return[e,t,a].join("-")}getNetworker(e,t={}){const a=t.fileDownload?"download":t.fileUpload?"upload":"client",n=this.getTransportType(a);this.cachedNetworkers[n]||(this.cachedNetworkers[n]={client:{},download:{},upload:{}});const i=this.cachedNetworkers[n][a];e in i||(i[e]=[]);const r=i[e],o="client"===a||"https"===n?1:this.rootScope.premium?6:3;if(r.length>=o){let e=o-1,t=!1;for(;e>=0;--e)if(r[e].isOnline){t=!0;break}const a=r.splice(t?e:o-1,1)[0];return r.unshift(a),Promise.resolve(a)}let p=this.generateNetworkerGetKey(e,n,a);if(this.gettingNetworkers[p])return this.gettingNetworkers[p];const d=`dc${e}_auth_key`,f=`dc${e}_server_salt`;let c=this.chooseServer(e,a,n);return this.gettingNetworkers[p]=Promise.all([d,f].map((e=>qa.Z.get(e)))).then((([i,o])=>Ka(this,void 0,void 0,(function*(){let l,m;if(i&&512===i.length){o&&16===o.length||(o="AAAAAAAAAAAAAAAA");const a=(0,Ha.Z)(i),n=(yield s.Z.invokeCrypto("sha1",a)).slice(-8),r=(0,Ha.Z)(o);l=this.networkerFactory.getNetworker(e,a,n,r,t)}else try{const a=yield this.authorizer.auth(e);qa.Z.set({[d]:T(a.authKey),[f]:T(a.serverSalt)}),l=this.networkerFactory.getNetworker(e,a.authKey,a.authKeyId,a.serverSalt,t)}catch(e){m=e}const g=this.getTransportType(a);if(g!==n&&(p=this.generateNetworkerGetKey(e,g,a),c.destroy(),O.removeTransport(this.dcConfigurator.chosenServers,c),l&&(c=this.chooseServer(e,a,g)),this.log("transport has been changed during authorization from",n,"to",g)),delete this.gettingNetworkers[p],m)throw this.log("get networker error",m,m.stack),m;return this.changeNetworkerTransport(l,c),r.unshift(l),this.setOnDrainIfNeeded(l),l}))))}getNetworkerVoid(e){return this.getNetworker(e).then(jt.Z,jt.Z)}changeNetworkerTransport(e,t){const a=e.transport;a&&O.removeTransport(this.dcConfigurator.chosenServers,a),e.changeTransport(t)}onNetworkerDrain(e){this.log("networker drain",e.dcId),e.onDrain=void 0,this.changeNetworkerTransport(e),e.destroy(),this.networkerFactory.removeNetworker(e),O.removeTransport(this.cachedNetworkers,e)}setOnDrainIfNeeded(e){e.onDrain||(e.isFileNetworker?Promise.resolve(!0):this.getBaseDcId().then((t=>e.dcId!==t))).then((t=>{e.onDrain||t&&(e.onDrain=()=>this.onNetworkerDrain(e),e.setDrainTimeout())}))}setUpdatesProcessor(e){this.updatesProcessor=e,this.networkerFactory.setUpdatesProcessor(e)}invokeApi(e,t={},a={}){const s=(0,v.Z)();let n,i,{afterMessageId:r,prepareTempMessageId:o}=a;if(o&&s.then((()=>{delete this.afterMessageTempIds[o]})),d.GO){const n=Date.now(),r=E.Z.setInterval((()=>{i&&i.isStopped()||this.log.error("Request is still processing:",e,t,a,"time:",(Date.now()-n)/1e3)}),5e3);s.catch(jt.Z).finally((()=>{clearInterval(r)}))}const p=(new Error).stack||"empty stack",f=()=>{if(r){const e=this.afterMessageTempIds[r];e&&(a.afterMessageId=e.messageId)}const p=i.wrapApiCall(e,t,a);return o&&(this.afterMessageTempIds[o]={messageId:a.messageId,promise:s}),p.catch((s=>{var i;if("FILE_REFERENCE_EXPIRED"!==s.type&&this.log.error("Error",s.code,s.type,this.baseDcId,n,e,t),401===s.code&&this.baseDcId===n)throw"SESSION_PASSWORD_NEEDED"!==s.type&&(qa.Z.delete("dc"),qa.Z.delete("user_auth")),s;if(401===s.code&&this.baseDcId&&n!==this.baseDcId){if(void 0===this.cachedExportPromise[n]){const e=new Promise(((e,t)=>{this.invokeApi("auth.exportAuthorization",{dc_id:n},{noErrorBox:!0}).then((a=>{this.invokeApi("auth.importAuthorization",{id:a.id,bytes:a.bytes},{dcId:n,noErrorBox:!0}).then(e,t)}),t)}));this.cachedExportPromise[n]=e}return this.cachedExportPromise[n].then((()=>f()))}if(303!==s.code){if(400===s.code&&0===s.type.indexOf("FILE_MIGRATE")){const i=+s.type.match(/^(FILE_MIGRATE_)(\d+)/)[2];if(i!==n)return a.dcId=i,this.invokeApi(e,t,a);throw s}if(400===s.code&&"CONNECTION_NOT_INITED"===s.type)return this.networkerFactory.unsetConnectionInited(),f();if(a.rawError||420!==s.code){if(!a.rawError&&["MSG_WAIT_FAILED","MSG_WAIT_TIMEOUT"].includes(s.type)){const e=this.afterMessageTempIds[r];return r=void 0,delete a.afterMessageId,e?e.promise.then((()=>f())):f()}if(a.rawError||500!==s.code){if("UNKNOWN"===s.type||"MTPROTO_CLUSTER_INVALID"===s.type)return(0,P.Z)(1e3).then((()=>f()));throw s}{const e=Date.now();if(a.stopTime&&e>=a.stopTime)throw s;return a.waitTime=a.waitTime?Math.min(60,1.5*a.waitTime):1,(0,P.Z)(1e3*a.waitTime).then((()=>f()))}}{const e=+s.type.match(/^FLOOD_WAIT_(\d+)/)[1]||1;if(e>(null!==(i=a.floodMaxTimeout)&&void 0!==i?i:60)&&!a.prepareTempMessageId)throw s;return(0,P.Z)(1e3*e).then((()=>f()))}}{const i=+s.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\d+)/)[2];if(i!==n)return a.dcId?a.dcId=i:this.setBaseDcId(i),this.invokeApi(e,t,a)}}))};let c;return c=(n=a.dcId||this.baseDcId)?this.getNetworker(n,a):this.getBaseDcId().then((e=>this.getNetworker(n=e,a))),c.then((e=>{i=e;const t=f();return i.attachPromise(s,a),t})).then(s.resolve).catch((t=>Ka(this,void 0,void 0,(function*(){if(t?(0,fe.Z)(t)||(t={message:t}):t={type:"ERROR_EMPTY"},(401===t.code&&"SESSION_REVOKED"===t.type||406===t.code&&"AUTH_KEY_DUPLICATED"===t.type)&&this.logOut(),a.ignoreErrors)throw t;throw 406===t.code&&(t.handled=!0),a.noErrorBox||(t.input=e,t.stack=p||t.originalError&&t.originalError.stack||t.stack||(new Error).stack,setTimeout((()=>{t.handled||(401===t.code&&this.logOut(),t.handled=!0)}),100)),t})))).catch(s.reject),s}}class $a{constructor(){this.neededPeers=new Map,this.singlePeerMap=new Map,this._constructor(!1)}after(){this.rootScope.addEventListener("user_auth",(()=>{this.requestPeer(this.appPeersManager.peerId,"self")}))}requestPeer(e,t){let a=this.neededPeers.get(e);a&&a.has(t)||(a||(a=new Set,this.neededPeers.set(e,a)),a.add(t),this.dispatchEvent("peerNeeded",e))}releasePeer(e,t){const a=this.neededPeers.get(e);a&&(a.delete(t),a.size||(this.neededPeers.delete(e),this.dispatchEvent("peerUnneeded",e)))}requestPeersForKey(e,t){Array.isArray(e)&&(e=new Set(e));let a=this.singlePeerMap.get(t);if(a){for(const s of a)e.has(s)||(this.releasePeer(s,t),a.delete(s));if(!a.size&&!e.size)return void this.singlePeerMap.delete(t)}if(e.size){a||(a=new Set,this.singlePeerMap.set(t,a));for(const s of e)a.has(s)||(this.requestPeer(s,t),a.add(s))}}isPeerNeeded(e){return this.neededPeers.has(e)}}Ae($a,[p.Z,G]);const Qa=$a,Ya=o.Pt;class Xa{constructor(){this.thumbsCache={}}getKey(e){var t;return e._+(null!==(t=e.id)&&void 0!==t?t:e.url)}getCacheContext(e,t=Ya){var a,s,n,i;const r=null!==(a=(n=this.thumbsCache)[i=this.getKey(e)])&&void 0!==a?a:n[i]={};return null!==(s=r[t])&&void 0!==s?s:r[t]={downloaded:0,url:"",type:t}}setCacheContextURL(e,t=Ya,a,s=0){const n=this.getCacheContext(e,t);return n.url=a,n.downloaded=s,n}deleteCacheContext(e,t=Ya){const a=this.thumbsCache[this.getKey(e)];a&&delete a[t]}}const es={MTProto:{constructors:[{id:481674261,predicate:"vector",params:[],type:"Vector t"},{id:85337187,predicate:"resPQ",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"pq",type:"bytes"},{name:"server_public_key_fingerprints",type:"Vector"}],type:"ResPQ"},{id:-1443537003,predicate:"p_q_inner_data_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"}],type:"P_Q_inner_data"},{id:1459478408,predicate:"p_q_inner_data_temp_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"},{name:"expires_in",type:"int"}],type:"P_Q_inner_data"},{id:-790100132,predicate:"server_DH_params_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_answer",type:"bytes"}],type:"Server_DH_Params"},{id:-1249309254,predicate:"server_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"g",type:"int"},{name:"dh_prime",type:"bytes"},{name:"g_a",type:"bytes"},{name:"server_time",type:"int"}],type:"Server_DH_inner_data"},{id:1715713620,predicate:"client_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"retry_id",type:"long"},{name:"g_b",type:"bytes"}],type:"Client_DH_Inner_Data"},{id:1003222836,predicate:"dh_gen_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash1",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1188831161,predicate:"dh_gen_retry",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash2",type:"int128"}],type:"Set_client_DH_params_answer"},{id:-1499615742,predicate:"dh_gen_fail",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash3",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1973679973,predicate:"bind_auth_key_inner",params:[{name:"nonce",type:"long"},{name:"temp_auth_key_id",type:"long"},{name:"perm_auth_key_id",type:"long"},{name:"temp_session_id",type:"long"},{name:"expires_at",type:"int"}],type:"BindAuthKeyInner"},{id:-212046591,predicate:"rpc_result",params:[{name:"req_msg_id",type:"long"},{name:"result",type:"Object"}],type:"RpcResult"},{id:558156313,predicate:"rpc_error",params:[{name:"error_code",type:"int"},{name:"error_message",type:"string"}],type:"RpcError"},{id:1579864942,predicate:"rpc_answer_unknown",params:[],type:"RpcDropAnswer"},{id:-847714938,predicate:"rpc_answer_dropped_running",params:[],type:"RpcDropAnswer"},{id:-1539647305,predicate:"rpc_answer_dropped",params:[{name:"msg_id",type:"long"},{name:"seq_no",type:"int"},{name:"bytes",type:"int"}],type:"RpcDropAnswer"},{id:155834844,predicate:"future_salt",params:[{name:"valid_since",type:"int"},{name:"valid_until",type:"int"},{name:"salt",type:"long"}],type:"FutureSalt"},{id:-1370486635,predicate:"future_salts",params:[{name:"req_msg_id",type:"long"},{name:"now",type:"int"},{name:"salts",type:"vector"}],type:"FutureSalts"},{id:880243653,predicate:"pong",params:[{name:"msg_id",type:"long"},{name:"ping_id",type:"long"}],type:"Pong"},{id:-501201412,predicate:"destroy_session_ok",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:1658015945,predicate:"destroy_session_none",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1631450872,predicate:"new_session_created",params:[{name:"first_msg_id",type:"long"},{name:"unique_id",type:"long"},{name:"server_salt",type:"long"}],type:"NewSession"},{id:1945237724,predicate:"msg_container",params:[{name:"messages",type:"vector<%Message>"}],type:"MessageContainer"},{id:1538843921,predicate:"message",params:[{name:"msg_id",type:"long"},{name:"seqno",type:"int"},{name:"bytes",type:"int"},{name:"body",type:"Object"}],type:"Message"},{id:-530561358,predicate:"msg_copy",params:[{name:"orig_message",type:"Message"}],type:"MessageCopy"},{id:812830625,predicate:"gzip_packed",params:[{name:"packed_data",type:"bytes"}],type:"Object"},{id:1658238041,predicate:"msgs_ack",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsAck"},{id:-1477445615,predicate:"bad_msg_notification",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"}],type:"BadMsgNotification"},{id:-307542917,predicate:"bad_server_salt",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"},{name:"new_server_salt",type:"long"}],type:"BadMsgNotification"},{id:2105940488,predicate:"msg_resend_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgResendReq"},{id:-630588590,predicate:"msgs_state_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsStateReq"},{id:81704317,predicate:"msgs_state_info",params:[{name:"req_msg_id",type:"long"},{name:"info",type:"bytes"}],type:"MsgsStateInfo"},{id:-1933520591,predicate:"msgs_all_info",params:[{name:"msg_ids",type:"Vector"},{name:"info",type:"bytes"}],type:"MsgsAllInfo"},{id:661470918,predicate:"msg_detailed_info",params:[{name:"msg_id",type:"long"},{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-2137147681,predicate:"msg_new_detailed_info",params:[{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-161422892,predicate:"destroy_auth_key_ok",params:[],type:"DestroyAuthKeyRes"},{id:178201177,predicate:"destroy_auth_key_none",params:[],type:"DestroyAuthKeyRes"},{id:-368010477,predicate:"destroy_auth_key_fail",params:[],type:"DestroyAuthKeyRes"}],methods:[{id:-1099002127,method:"req_pq_multi",params:[{name:"nonce",type:"int128"}],type:"ResPQ"},{id:-686627650,method:"req_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"public_key_fingerprint",type:"long"},{name:"encrypted_data",type:"bytes"}],type:"Server_DH_Params"},{id:-184262881,method:"set_client_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_data",type:"bytes"}],type:"Set_client_DH_params_answer"},{id:1491380032,method:"rpc_drop_answer",params:[{name:"req_msg_id",type:"long"}],type:"RpcDropAnswer"},{id:-1188971260,method:"get_future_salts",params:[{name:"num",type:"int"}],type:"FutureSalts"},{id:2059302892,method:"ping",params:[{name:"ping_id",type:"long"}],type:"Pong"},{id:-213746804,method:"ping_delay_disconnect",params:[{name:"ping_id",type:"long"},{name:"disconnect_delay",type:"int"}],type:"Pong"},{id:-414113498,method:"destroy_session",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1835453025,method:"http_wait",params:[{name:"max_delay",type:"int"},{name:"wait_after",type:"int"},{name:"max_wait",type:"int"}],type:"HttpWait"},{id:-784117408,method:"destroy_auth_key",params:[],type:"DestroyAuthKeyRes"}]},API:{constructors:[{id:-1132882121,predicate:"boolFalse",params:[],type:"Bool"},{id:-1720552011,predicate:"boolTrue",params:[],type:"Bool"},{id:1072550713,predicate:"true",params:[],type:"True"},{id:481674261,predicate:"vector",params:[],type:"Vector t"},{id:-994444869,predicate:"error",params:[{name:"code",type:"int"},{name:"text",type:"string"}],type:"Error"},{id:1450380236,predicate:"null",params:[],type:"Null"},{id:2134579434,predicate:"inputPeerEmpty",params:[],type:"InputPeer"},{id:2107670217,predicate:"inputPeerSelf",params:[],type:"InputPeer"},{id:900291769,predicate:"inputPeerChat",params:[{name:"chat_id",type:"long"}],type:"InputPeer"},{id:-1182234929,predicate:"inputUserEmpty",params:[],type:"InputUser"},{id:-138301121,predicate:"inputUserSelf",params:[],type:"InputUser"},{id:-208488460,predicate:"inputPhoneContact",params:[{name:"client_id",type:"long"},{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"InputContact"},{id:-181407105,predicate:"inputFile",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"},{name:"md5_checksum",type:"string"}],type:"InputFile"},{id:-1771768449,predicate:"inputMediaEmpty",params:[],type:"InputMedia"},{id:505969924,predicate:"inputMediaUploadedPhoto",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.2?true"},{name:"file",type:"InputFile"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:-1279654347,predicate:"inputMediaPhoto",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.1?true"},{name:"id",type:"InputPhoto"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-104578748,predicate:"inputMediaGeoPoint",params:[{name:"geo_point",type:"InputGeoPoint"}],type:"InputMedia"},{id:-122978821,predicate:"inputMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"}],type:"InputMedia"},{id:480546647,predicate:"inputChatPhotoEmpty",params:[],type:"InputChatPhoto"},{id:-968723890,predicate:"inputChatUploadedPhoto",params:[{name:"flags",type:"#"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"InputChatPhoto"},{id:-1991004873,predicate:"inputChatPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputChatPhoto"},{id:-457104426,predicate:"inputGeoPointEmpty",params:[],type:"InputGeoPoint"},{id:1210199983,predicate:"inputGeoPoint",params:[{name:"flags",type:"#"},{name:"lat",type:"double"},{name:"long",type:"double"},{name:"accuracy_radius",type:"flags.0?int"}],type:"InputGeoPoint"},{id:483901197,predicate:"inputPhotoEmpty",params:[],type:"InputPhoto"},{id:1001634122,predicate:"inputPhoto",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputPhoto"},{id:-539317279,predicate:"inputFileLocation",params:[{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputFileLocation"},{id:1498486562,predicate:"peerUser",params:[{name:"user_id",type:"long"}],type:"Peer"},{id:918946202,predicate:"peerChat",params:[{name:"chat_id",type:"long"}],type:"Peer"},{id:-1432995067,predicate:"storage.fileUnknown",params:[],type:"storage.FileType"},{id:1086091090,predicate:"storage.filePartial",params:[],type:"storage.FileType"},{id:8322574,predicate:"storage.fileJpeg",params:[],type:"storage.FileType"},{id:-891180321,predicate:"storage.fileGif",params:[],type:"storage.FileType"},{id:172975040,predicate:"storage.filePng",params:[],type:"storage.FileType"},{id:-1373745011,predicate:"storage.filePdf",params:[],type:"storage.FileType"},{id:1384777335,predicate:"storage.fileMp3",params:[],type:"storage.FileType"},{id:1258941372,predicate:"storage.fileMov",params:[],type:"storage.FileType"},{id:-1278304028,predicate:"storage.fileMp4",params:[],type:"storage.FileType"},{id:276907596,predicate:"storage.fileWebp",params:[],type:"storage.FileType"},{id:-742634630,predicate:"userEmpty",params:[{name:"id",type:"long"}],type:"User"},{id:1326562017,predicate:"userProfilePhotoEmpty",params:[],type:"UserProfilePhoto"},{id:-2100168954,predicate:"userProfilePhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"personal",type:"flags.2?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"UserProfilePhoto"},{id:164646985,predicate:"userStatusEmpty",params:[],type:"UserStatus"},{id:-306628279,predicate:"userStatusOnline",params:[{name:"expires",type:"int"}],type:"UserStatus"},{id:9203775,predicate:"userStatusOffline",params:[{name:"was_online",type:"int"}],type:"UserStatus"},{id:693512293,predicate:"chatEmpty",params:[{name:"id",type:"long"}],type:"Chat"},{id:1103884886,predicate:"chat",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"left",type:"flags.2?true"},{name:"deactivated",type:"flags.5?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"noforwards",type:"flags.25?true"},{name:"id",type:"long"},{name:"title",type:"string"},{name:"photo",type:"ChatPhoto"},{name:"participants_count",type:"int"},{name:"date",type:"int"},{name:"version",type:"int"},{name:"migrated_to",type:"flags.6?InputChannel"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"}],type:"Chat"},{id:1704108455,predicate:"chatForbidden",params:[{name:"id",type:"long"},{name:"title",type:"string"}],type:"Chat"},{id:-908914376,predicate:"chatFull",params:[{name:"flags",type:"#"},{name:"can_set_username",type:"flags.7?true"},{name:"has_scheduled",type:"flags.8?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants",type:"ChatParticipants"},{name:"chat_photo",type:"flags.2?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.13?ExportedChatInvite"},{name:"bot_info",type:"flags.3?Vector"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"folder_id",type:"flags.11?int"},{name:"call",type:"flags.12?InputGroupCall"},{name:"ttl_period",type:"flags.14?int"},{name:"groupcall_default_join_as",type:"flags.15?Peer"},{name:"theme_emoticon",type:"flags.16?string"},{name:"requests_pending",type:"flags.17?int"},{name:"recent_requesters",type:"flags.17?Vector"},{name:"available_reactions",type:"flags.18?ChatReactions"}],type:"ChatFull"},{id:-1070776313,predicate:"chatParticipant",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-2023500831,predicate:"chatParticipantsForbidden",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"self_participant",type:"flags.0?ChatParticipant"}],type:"ChatParticipants"},{id:1018991608,predicate:"chatParticipants",params:[{name:"chat_id",type:"long"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"ChatParticipants"},{id:935395612,predicate:"chatPhotoEmpty",params:[],type:"ChatPhoto"},{id:476978193,predicate:"chatPhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"ChatPhoto"},{id:-1868117372,predicate:"messageEmpty",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"peer_id",type:"flags.0?Peer"}],type:"Message"},{id:940666592,predicate:"message",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"from_scheduled",type:"flags.18?true"},{name:"legacy",type:"flags.19?true"},{name:"edit_hide",type:"flags.21?true"},{name:"pinned",type:"flags.24?true"},{name:"noforwards",type:"flags.26?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"message",type:"string"},{name:"media",type:"flags.9?MessageMedia"},{name:"reply_markup",type:"flags.6?ReplyMarkup"},{name:"entities",type:"flags.7?Vector"},{name:"views",type:"flags.10?int"},{name:"forwards",type:"flags.10?int"},{name:"replies",type:"flags.23?MessageReplies"},{name:"edit_date",type:"flags.15?int"},{name:"post_author",type:"flags.16?string"},{name:"grouped_id",type:"flags.17?long"},{name:"reactions",type:"flags.20?MessageReactions"},{name:"restriction_reason",type:"flags.22?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:721967202,predicate:"messageService",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"legacy",type:"flags.19?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"action",type:"MessageAction"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:1038967584,predicate:"messageMediaEmpty",params:[],type:"MessageMedia"},{id:1766936791,predicate:"messageMediaPhoto",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.3?true"},{name:"photo",type:"flags.0?Photo"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:1457575028,predicate:"messageMediaGeo",params:[{name:"geo",type:"GeoPoint"}],type:"MessageMedia"},{id:1882335561,predicate:"messageMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"user_id",type:"long"}],type:"MessageMedia"},{id:-1618676578,predicate:"messageMediaUnsupported",params:[],type:"MessageMedia"},{id:-1230047312,predicate:"messageActionEmpty",params:[],type:"MessageAction"},{id:-1119368275,predicate:"messageActionChatCreate",params:[{name:"title",type:"string"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1247687078,predicate:"messageActionChatEditTitle",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:2144015272,predicate:"messageActionChatEditPhoto",params:[{name:"photo",type:"Photo"}],type:"MessageAction"},{id:-1780220945,predicate:"messageActionChatDeletePhoto",params:[],type:"MessageAction"},{id:365886720,predicate:"messageActionChatAddUser",params:[{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1539362612,predicate:"messageActionChatDeleteUser",params:[{name:"user_id",type:"long"}],type:"MessageAction"},{id:-712374074,predicate:"dialog",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"unread_mark",type:"flags.3?true"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"unread_mentions_count",type:"int"},{name:"unread_reactions_count",type:"int"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"pts",type:"flags.0?int"},{name:"draft",type:"flags.1?DraftMessage"},{name:"folder_id",type:"flags.4?int"},{name:"ttl_period",type:"flags.5?int"}],type:"Dialog"},{id:590459437,predicate:"photoEmpty",params:[{name:"id",type:"long"}],type:"Photo"},{id:-82216347,predicate:"photo",params:[{name:"flags",type:"#"},{name:"has_stickers",type:"flags.0?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"sizes",type:"Vector"},{name:"video_sizes",type:"flags.1?Vector"},{name:"dc_id",type:"int"}],type:"Photo"},{id:236446268,predicate:"photoSizeEmpty",params:[{name:"type",type:"string"}],type:"PhotoSize"},{id:1976012384,predicate:"photoSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"}],type:"PhotoSize"},{id:35527382,predicate:"photoCachedSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:286776671,predicate:"geoPointEmpty",params:[],type:"GeoPoint"},{id:-1297942941,predicate:"geoPoint",params:[{name:"flags",type:"#"},{name:"long",type:"double"},{name:"lat",type:"double"},{name:"access_hash",type:"long"},{name:"accuracy_radius",type:"flags.0?int"}],type:"GeoPoint"},{id:1577067778,predicate:"auth.sentCode",params:[{name:"flags",type:"#"},{name:"type",type:"auth.SentCodeType"},{name:"phone_code_hash",type:"string"},{name:"next_type",type:"flags.1?auth.CodeType"},{name:"timeout",type:"flags.2?int"}],type:"auth.SentCode"},{id:872119224,predicate:"auth.authorization",params:[{name:"flags",type:"#"},{name:"setup_password_required",type:"flags.1?true"},{name:"otherwise_relogin_days",type:"flags.1?int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"user",type:"User"}],type:"auth.Authorization"},{id:-1271602504,predicate:"auth.exportedAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.ExportedAuthorization"},{id:-1195615476,predicate:"inputNotifyPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputNotifyPeer"},{id:423314455,predicate:"inputNotifyUsers",params:[],type:"InputNotifyPeer"},{id:1251338318,predicate:"inputNotifyChats",params:[],type:"InputNotifyPeer"},{id:-551616469,predicate:"inputPeerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?NotificationSound"}],type:"InputPeerNotifySettings"},{id:-1472527322,predicate:"peerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"ios_sound",type:"flags.3?NotificationSound"},{name:"android_sound",type:"flags.4?NotificationSound"},{name:"other_sound",type:"flags.5?NotificationSound"}],type:"PeerNotifySettings"},{id:-1525149427,predicate:"peerSettings",params:[{name:"flags",type:"#"},{name:"report_spam",type:"flags.0?true"},{name:"add_contact",type:"flags.1?true"},{name:"block_contact",type:"flags.2?true"},{name:"share_contact",type:"flags.3?true"},{name:"need_contacts_exception",type:"flags.4?true"},{name:"report_geo",type:"flags.5?true"},{name:"autoarchived",type:"flags.7?true"},{name:"invite_members",type:"flags.8?true"},{name:"request_chat_broadcast",type:"flags.10?true"},{name:"geo_distance",type:"flags.6?int"},{name:"request_chat_title",type:"flags.9?string"},{name:"request_chat_date",type:"flags.9?int"}],type:"PeerSettings"},{id:-1539849235,predicate:"wallPaper",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"pattern",type:"flags.3?true"},{name:"dark",type:"flags.4?true"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"document",type:"Document"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:1490799288,predicate:"inputReportReasonSpam",params:[],type:"ReportReason"},{id:505595789,predicate:"inputReportReasonViolence",params:[],type:"ReportReason"},{id:777640226,predicate:"inputReportReasonPornography",params:[],type:"ReportReason"},{id:-1376497949,predicate:"inputReportReasonChildAbuse",params:[],type:"ReportReason"},{id:-1041980751,predicate:"inputReportReasonOther",params:[],type:"ReportReason"},{id:-120378643,predicate:"userFull",params:[{name:"flags",type:"#"},{name:"blocked",type:"flags.0?true"},{name:"phone_calls_available",type:"flags.4?true"},{name:"phone_calls_private",type:"flags.5?true"},{name:"can_pin_message",type:"flags.7?true"},{name:"has_scheduled",type:"flags.12?true"},{name:"video_calls_available",type:"flags.13?true"},{name:"voice_messages_forbidden",type:"flags.20?true"},{name:"id",type:"long"},{name:"about",type:"flags.1?string"},{name:"settings",type:"PeerSettings"},{name:"personal_photo",type:"flags.21?Photo"},{name:"profile_photo",type:"flags.2?Photo"},{name:"fallback_photo",type:"flags.22?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"bot_info",type:"flags.3?BotInfo"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"common_chats_count",type:"int"},{name:"folder_id",type:"flags.11?int"},{name:"ttl_period",type:"flags.14?int"},{name:"theme_emoticon",type:"flags.15?string"},{name:"private_forward_name",type:"flags.16?string"},{name:"bot_group_admin_rights",type:"flags.17?ChatAdminRights"},{name:"bot_broadcast_admin_rights",type:"flags.18?ChatAdminRights"},{name:"premium_gifts",type:"flags.19?Vector"}],type:"UserFull"},{id:341499403,predicate:"contact",params:[{name:"user_id",type:"long"},{name:"mutual",type:"Bool"}],type:"Contact"},{id:-1052885936,predicate:"importedContact",params:[{name:"user_id",type:"long"},{name:"client_id",type:"long"}],type:"ImportedContact"},{id:383348795,predicate:"contactStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"ContactStatus"},{id:-1219778094,predicate:"contacts.contactsNotModified",params:[],type:"contacts.Contacts"},{id:-353862078,predicate:"contacts.contacts",params:[{name:"contacts",type:"Vector"},{name:"saved_count",type:"int"},{name:"users",type:"Vector"}],type:"contacts.Contacts"},{id:2010127419,predicate:"contacts.importedContacts",params:[{name:"imported",type:"Vector"},{name:"popular_invites",type:"Vector"},{name:"retry_contacts",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ImportedContacts"},{id:182326673,predicate:"contacts.blocked",params:[{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:-513392236,predicate:"contacts.blockedSlice",params:[{name:"count",type:"int"},{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:364538944,predicate:"messages.dialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:1910543603,predicate:"messages.dialogsSlice",params:[{name:"count",type:"int"},{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:-1938715001,predicate:"messages.messages",params:[{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:978610270,predicate:"messages.messagesSlice",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"count",type:"int"},{name:"next_rate",type:"flags.0?int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:1694474197,predicate:"messages.chats",params:[{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-438840932,predicate:"messages.chatFull",params:[{name:"full_chat",type:"ChatFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatFull"},{id:-1269012015,predicate:"messages.affectedHistory",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"}],type:"messages.AffectedHistory"},{id:1474492012,predicate:"inputMessagesFilterEmpty",params:[],type:"MessagesFilter"},{id:-1777752804,predicate:"inputMessagesFilterPhotos",params:[],type:"MessagesFilter"},{id:-1614803355,predicate:"inputMessagesFilterVideo",params:[],type:"MessagesFilter"},{id:1458172132,predicate:"inputMessagesFilterPhotoVideo",params:[],type:"MessagesFilter"},{id:-1629621880,predicate:"inputMessagesFilterDocument",params:[],type:"MessagesFilter"},{id:2129714567,predicate:"inputMessagesFilterUrl",params:[],type:"MessagesFilter"},{id:-3644025,predicate:"inputMessagesFilterGif",params:[],type:"MessagesFilter"},{id:522914557,predicate:"updateNewMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1318109142,predicate:"updateMessageID",params:[{name:"id",type:"int"},{name:"random_id",type:"long"}],type:"Update"},{id:-1576161051,predicate:"updateDeleteMessages",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1071741569,predicate:"updateUserTyping",params:[{name:"user_id",type:"long"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-2092401936,predicate:"updateChatUserTyping",params:[{name:"chat_id",type:"long"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:125178264,predicate:"updateChatParticipants",params:[{name:"participants",type:"ChatParticipants"}],type:"Update"},{id:-440534818,predicate:"updateUserStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"Update"},{id:-1484486364,predicate:"updateUserName",params:[{name:"user_id",type:"long"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"usernames",type:"Vector"}],type:"Update"},{id:-1519637954,predicate:"updates.state",params:[{name:"pts",type:"int"},{name:"qts",type:"int"},{name:"date",type:"int"},{name:"seq",type:"int"},{name:"unread_count",type:"int"}],type:"updates.State"},{id:1567990072,predicate:"updates.differenceEmpty",params:[{name:"date",type:"int"},{name:"seq",type:"int"}],type:"updates.Difference"},{id:16030880,predicate:"updates.difference",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"updates.Difference"},{id:-1459938943,predicate:"updates.differenceSlice",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"intermediate_state",type:"updates.State"}],type:"updates.Difference"},{id:-484987010,predicate:"updatesTooLong",params:[],type:"Updates"},{id:826001400,predicate:"updateShortMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"user_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:1299050149,predicate:"updateShortChatMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"from_id",type:"long"},{name:"chat_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:2027216577,predicate:"updateShort",params:[{name:"update",type:"Update"},{name:"date",type:"int"}],type:"Updates"},{id:1918567619,predicate:"updatesCombined",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq_start",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:1957577280,predicate:"updates",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:-1916114267,predicate:"photos.photos",params:[{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:352657236,predicate:"photos.photosSlice",params:[{name:"count",type:"int"},{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:539045032,predicate:"photos.photo",params:[{name:"photo",type:"Photo"},{name:"users",type:"Vector"}],type:"photos.Photo"},{id:157948117,predicate:"upload.file",params:[{name:"type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.File"},{id:414687501,predicate:"dcOption",params:[{name:"flags",type:"#"},{name:"ipv6",type:"flags.0?true"},{name:"media_only",type:"flags.1?true"},{name:"tcpo_only",type:"flags.2?true"},{name:"cdn",type:"flags.3?true"},{name:"static",type:"flags.4?true"},{name:"this_port_only",type:"flags.5?true"},{name:"id",type:"int"},{name:"ip_address",type:"string"},{name:"port",type:"int"},{name:"secret",type:"flags.10?bytes"}],type:"DcOption"},{id:589653676,predicate:"config",params:[{name:"flags",type:"#"},{name:"phonecalls_enabled",type:"flags.1?true"},{name:"default_p2p_contacts",type:"flags.3?true"},{name:"preload_featured_stickers",type:"flags.4?true"},{name:"ignore_phone_entities",type:"flags.5?true"},{name:"revoke_pm_inbox",type:"flags.6?true"},{name:"blocked_mode",type:"flags.8?true"},{name:"pfs_enabled",type:"flags.13?true"},{name:"force_try_ipv6",type:"flags.14?true"},{name:"date",type:"int"},{name:"expires",type:"int"},{name:"test_mode",type:"Bool"},{name:"this_dc",type:"int"},{name:"dc_options",type:"Vector"},{name:"dc_txt_domain_name",type:"string"},{name:"chat_size_max",type:"int"},{name:"megagroup_size_max",type:"int"},{name:"forwarded_count_max",type:"int"},{name:"online_update_period_ms",type:"int"},{name:"offline_blur_timeout_ms",type:"int"},{name:"offline_idle_timeout_ms",type:"int"},{name:"online_cloud_timeout_ms",type:"int"},{name:"notify_cloud_delay_ms",type:"int"},{name:"notify_default_delay_ms",type:"int"},{name:"push_chat_period_ms",type:"int"},{name:"push_chat_limit",type:"int"},{name:"saved_gifs_limit",type:"int"},{name:"edit_time_limit",type:"int"},{name:"revoke_time_limit",type:"int"},{name:"revoke_pm_time_limit",type:"int"},{name:"rating_e_decay",type:"int"},{name:"stickers_recent_limit",type:"int"},{name:"stickers_faved_limit",type:"int"},{name:"channels_read_media_period",type:"int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"pinned_dialogs_count_max",type:"int"},{name:"pinned_infolder_count_max",type:"int"},{name:"call_receive_timeout_ms",type:"int"},{name:"call_ring_timeout_ms",type:"int"},{name:"call_connect_timeout_ms",type:"int"},{name:"call_packet_timeout_ms",type:"int"},{name:"me_url_prefix",type:"string"},{name:"autoupdate_url_prefix",type:"flags.7?string"},{name:"gif_search_username",type:"flags.9?string"},{name:"venue_search_username",type:"flags.10?string"},{name:"img_search_username",type:"flags.11?string"},{name:"static_maps_provider",type:"flags.12?string"},{name:"caption_length_max",type:"int"},{name:"message_length_max",type:"int"},{name:"webfile_dc_id",type:"int"},{name:"suggested_lang_code",type:"flags.2?string"},{name:"lang_pack_version",type:"flags.2?int"},{name:"base_lang_pack_version",type:"flags.2?int"},{name:"reactions_default",type:"flags.15?Reaction"}],type:"Config"},{id:-1910892683,predicate:"nearestDc",params:[{name:"country",type:"string"},{name:"this_dc",type:"int"},{name:"nearest_dc",type:"int"}],type:"NearestDc"},{id:-860107216,predicate:"help.appUpdate",params:[{name:"flags",type:"#"},{name:"can_not_skip",type:"flags.0?true"},{name:"id",type:"int"},{name:"version",type:"string"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"document",type:"flags.1?Document"},{name:"url",type:"flags.2?string"},{name:"sticker",type:"flags.3?Document"}],type:"help.AppUpdate"},{id:-1000708810,predicate:"help.noAppUpdate",params:[],type:"help.AppUpdate"},{id:415997816,predicate:"help.inviteText",params:[{name:"message",type:"string"}],type:"help.InviteText"},{id:314359194,predicate:"updateNewEncryptedMessage",params:[{name:"message",type:"EncryptedMessage"},{name:"qts",type:"int"}],type:"Update"},{id:386986326,predicate:"updateEncryptedChatTyping",params:[{name:"chat_id",type:"int"}],type:"Update"},{id:-1264392051,predicate:"updateEncryption",params:[{name:"chat",type:"EncryptedChat"},{name:"date",type:"int"}],type:"Update"},{id:956179895,predicate:"updateEncryptedMessagesRead",params:[{name:"chat_id",type:"int"},{name:"max_date",type:"int"},{name:"date",type:"int"}],type:"Update"},{id:-1417756512,predicate:"encryptedChatEmpty",params:[{name:"id",type:"int"}],type:"EncryptedChat"},{id:1722964307,predicate:"encryptedChatWaiting",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"}],type:"EncryptedChat"},{id:1223809356,predicate:"encryptedChatRequested",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1643173063,predicate:"encryptedChat",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:505183301,predicate:"encryptedChatDiscarded",params:[{name:"flags",type:"#"},{name:"history_deleted",type:"flags.0?true"},{name:"id",type:"int"}],type:"EncryptedChat"},{id:-247351839,predicate:"inputEncryptedChat",params:[{name:"chat_id",type:"int"},{name:"access_hash",type:"long"}],type:"InputEncryptedChat"},{id:-1038136962,predicate:"encryptedFileEmpty",params:[],type:"EncryptedFile"},{id:-1476358952,predicate:"encryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"long"},{name:"dc_id",type:"int"},{name:"key_fingerprint",type:"int"}],type:"EncryptedFile"},{id:406307684,predicate:"inputEncryptedFileEmpty",params:[],type:"InputEncryptedFile"},{id:1690108678,predicate:"inputEncryptedFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1511503333,predicate:"inputEncryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputEncryptedFile"},{id:-182231723,predicate:"inputEncryptedFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:-317144808,predicate:"encryptedMessage",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"},{name:"file",type:"EncryptedFile"}],type:"EncryptedMessage"},{id:594758406,predicate:"encryptedMessageService",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"}],type:"EncryptedMessage"},{id:-1058912715,predicate:"messages.dhConfigNotModified",params:[{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:740433629,predicate:"messages.dhConfig",params:[{name:"g",type:"int"},{name:"p",type:"bytes"},{name:"version",type:"int"},{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:1443858741,predicate:"messages.sentEncryptedMessage",params:[{name:"date",type:"int"}],type:"messages.SentEncryptedMessage"},{id:-1802240206,predicate:"messages.sentEncryptedFile",params:[{name:"date",type:"int"},{name:"file",type:"EncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:-95482955,predicate:"inputFileBig",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"}],type:"InputFile"},{id:767652808,predicate:"inputEncryptedFileBigUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1037718609,predicate:"updateChatParticipantAdd",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"},{name:"version",type:"int"}],type:"Update"},{id:-483443337,predicate:"updateChatParticipantDelete",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"version",type:"int"}],type:"Update"},{id:-1906403213,predicate:"updateDcOptions",params:[{name:"dc_options",type:"Vector"}],type:"Update"},{id:1530447553,predicate:"inputMediaUploadedDocument",params:[{name:"flags",type:"#"},{name:"nosound_video",type:"flags.3?true"},{name:"force_file",type:"flags.4?true"},{name:"spoiler",type:"flags.5?true"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.2?InputFile"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:860303448,predicate:"inputMediaDocument",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.2?true"},{name:"id",type:"InputDocument"},{name:"ttl_seconds",type:"flags.0?int"},{name:"query",type:"flags.1?string"}],type:"InputMedia"},{id:-1666158377,predicate:"messageMediaDocument",params:[{name:"flags",type:"#"},{name:"nopremium",type:"flags.3?true"},{name:"spoiler",type:"flags.4?true"},{name:"document",type:"flags.0?Document"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:1928391342,predicate:"inputDocumentEmpty",params:[],type:"InputDocument"},{id:448771445,predicate:"inputDocument",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputDocument"},{id:-1160743548,predicate:"inputDocumentFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:922273905,predicate:"documentEmpty",params:[{name:"id",type:"long"}],type:"Document"},{id:-1881881384,predicate:"document",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"mime_type",type:"string"},{name:"size",type:"long"},{name:"thumbs",type:"flags.0?Vector"},{name:"video_thumbs",type:"flags.1?Vector"},{name:"dc_id",type:"int"},{name:"attributes",type:"Vector"}],type:"Document"},{id:398898678,predicate:"help.support",params:[{name:"phone_number",type:"string"},{name:"user",type:"User"}],type:"help.Support"},{id:-1613493288,predicate:"notifyPeer",params:[{name:"peer",type:"Peer"}],type:"NotifyPeer"},{id:-1261946036,predicate:"notifyUsers",params:[],type:"NotifyPeer"},{id:-1073230141,predicate:"notifyChats",params:[],type:"NotifyPeer"},{id:-1094555409,predicate:"updateNotifySettings",params:[{name:"peer",type:"NotifyPeer"},{name:"notify_settings",type:"PeerNotifySettings"}],type:"Update"},{id:381645902,predicate:"sendMessageTypingAction",params:[],type:"SendMessageAction"},{id:-44119819,predicate:"sendMessageCancelAction",params:[],type:"SendMessageAction"},{id:-1584933265,predicate:"sendMessageRecordVideoAction",params:[],type:"SendMessageAction"},{id:-378127636,predicate:"sendMessageUploadVideoAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-718310409,predicate:"sendMessageRecordAudioAction",params:[],type:"SendMessageAction"},{id:-212740181,predicate:"sendMessageUploadAudioAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-774682074,predicate:"sendMessageUploadPhotoAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-1441998364,predicate:"sendMessageUploadDocumentAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:393186209,predicate:"sendMessageGeoLocationAction",params:[],type:"SendMessageAction"},{id:1653390447,predicate:"sendMessageChooseContactAction",params:[],type:"SendMessageAction"},{id:-1290580579,predicate:"contacts.found",params:[{name:"my_results",type:"Vector"},{name:"results",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Found"},{id:-337352679,predicate:"updateServiceNotification",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"inbox_date",type:"flags.1?int"},{name:"type",type:"string"},{name:"message",type:"string"},{name:"media",type:"MessageMedia"},{name:"entities",type:"Vector"}],type:"Update"},{id:-496024847,predicate:"userStatusRecently",params:[],type:"UserStatus"},{id:129960444,predicate:"userStatusLastWeek",params:[],type:"UserStatus"},{id:2011940674,predicate:"userStatusLastMonth",params:[],type:"UserStatus"},{id:-298113238,predicate:"updatePrivacy",params:[{name:"key",type:"PrivacyKey"},{name:"rules",type:"Vector"}],type:"Update"},{id:1335282456,predicate:"inputPrivacyKeyStatusTimestamp",params:[],type:"InputPrivacyKey"},{id:-1137792208,predicate:"privacyKeyStatusTimestamp",params:[],type:"PrivacyKey"},{id:218751099,predicate:"inputPrivacyValueAllowContacts",params:[],type:"InputPrivacyRule"},{id:407582158,predicate:"inputPrivacyValueAllowAll",params:[],type:"InputPrivacyRule"},{id:320652927,predicate:"inputPrivacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"InputPrivacyRule"},{id:195371015,predicate:"inputPrivacyValueDisallowContacts",params:[],type:"InputPrivacyRule"},{id:-697604407,predicate:"inputPrivacyValueDisallowAll",params:[],type:"InputPrivacyRule"},{id:-1877932953,predicate:"inputPrivacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"InputPrivacyRule"},{id:-123988,predicate:"privacyValueAllowContacts",params:[],type:"PrivacyRule"},{id:1698855810,predicate:"privacyValueAllowAll",params:[],type:"PrivacyRule"},{id:-1198497870,predicate:"privacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:-125240806,predicate:"privacyValueDisallowContacts",params:[],type:"PrivacyRule"},{id:-1955338397,predicate:"privacyValueDisallowAll",params:[],type:"PrivacyRule"},{id:-463335103,predicate:"privacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:1352683077,predicate:"account.privacyRules",params:[{name:"rules",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"account.PrivacyRules"},{id:-1194283041,predicate:"accountDaysTTL",params:[{name:"days",type:"int"}],type:"AccountDaysTTL"},{id:88680979,predicate:"updateUserPhone",params:[{name:"user_id",type:"long"},{name:"phone",type:"string"}],type:"Update"},{id:1815593308,predicate:"documentAttributeImageSize",params:[{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:297109817,predicate:"documentAttributeAnimated",params:[],type:"DocumentAttribute"},{id:1662637586,predicate:"documentAttributeSticker",params:[{name:"flags",type:"#"},{name:"mask",type:"flags.1?true"},{name:"alt",type:"string"},{name:"stickerset",type:"InputStickerSet"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"DocumentAttribute"},{id:250621158,predicate:"documentAttributeVideo",params:[{name:"flags",type:"#"},{name:"round_message",type:"flags.0?true"},{name:"supports_streaming",type:"flags.1?true"},{name:"duration",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:-1739392570,predicate:"documentAttributeAudio",params:[{name:"flags",type:"#"},{name:"voice",type:"flags.10?true"},{name:"duration",type:"int"},{name:"title",type:"flags.0?string"},{name:"performer",type:"flags.1?string"},{name:"waveform",type:"flags.2?bytes"}],type:"DocumentAttribute"},{id:358154344,predicate:"documentAttributeFilename",params:[{name:"file_name",type:"string"}],type:"DocumentAttribute"},{id:-244016606,predicate:"messages.stickersNotModified",params:[],type:"messages.Stickers"},{id:816245886,predicate:"messages.stickers",params:[{name:"hash",type:"long"},{name:"stickers",type:"Vector"}],type:"messages.Stickers"},{id:313694676,predicate:"stickerPack",params:[{name:"emoticon",type:"string"},{name:"documents",type:"Vector"}],type:"StickerPack"},{id:-395967805,predicate:"messages.allStickersNotModified",params:[],type:"messages.AllStickers"},{id:-843329861,predicate:"messages.allStickers",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.AllStickers"},{id:-1667805217,predicate:"updateReadHistoryInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:791617983,predicate:"updateReadHistoryOutbox",params:[{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-2066640507,predicate:"messages.affectedMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"messages.AffectedMessages"},{id:2139689491,predicate:"updateWebPage",params:[{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-350980120,predicate:"webPageEmpty",params:[{name:"id",type:"long"}],type:"WebPage"},{id:-981018084,predicate:"webPagePending",params:[{name:"id",type:"long"},{name:"date",type:"int"}],type:"WebPage"},{id:-392411726,predicate:"webPage",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"url",type:"string"},{name:"display_url",type:"string"},{name:"hash",type:"int"},{name:"type",type:"flags.0?string"},{name:"site_name",type:"flags.1?string"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"photo",type:"flags.4?Photo"},{name:"embed_url",type:"flags.5?string"},{name:"embed_type",type:"flags.5?string"},{name:"embed_width",type:"flags.6?int"},{name:"embed_height",type:"flags.6?int"},{name:"duration",type:"flags.7?int"},{name:"author",type:"flags.8?string"},{name:"document",type:"flags.9?Document"},{name:"cached_page",type:"flags.10?Page"},{name:"attributes",type:"flags.12?Vector"}],type:"WebPage"},{id:-1557277184,predicate:"messageMediaWebPage",params:[{name:"webpage",type:"WebPage"}],type:"MessageMedia"},{id:-1392388579,predicate:"authorization",params:[{name:"flags",type:"#"},{name:"current",type:"flags.0?true"},{name:"official_app",type:"flags.1?true"},{name:"password_pending",type:"flags.2?true"},{name:"encrypted_requests_disabled",type:"flags.3?true"},{name:"call_requests_disabled",type:"flags.4?true"},{name:"hash",type:"long"},{name:"device_model",type:"string"},{name:"platform",type:"string"},{name:"system_version",type:"string"},{name:"api_id",type:"int"},{name:"app_name",type:"string"},{name:"app_version",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"country",type:"string"},{name:"region",type:"string"}],type:"Authorization"},{id:1275039392,predicate:"account.authorizations",params:[{name:"authorization_ttl_days",type:"int"},{name:"authorizations",type:"Vector"}],type:"account.Authorizations"},{id:-1787080453,predicate:"account.password",params:[{name:"flags",type:"#"},{name:"has_recovery",type:"flags.0?true"},{name:"has_secure_values",type:"flags.1?true"},{name:"has_password",type:"flags.2?true"},{name:"current_algo",type:"flags.2?PasswordKdfAlgo"},{name:"srp_B",type:"flags.2?bytes"},{name:"srp_id",type:"flags.2?long"},{name:"hint",type:"flags.3?string"},{name:"email_unconfirmed_pattern",type:"flags.4?string"},{name:"new_algo",type:"PasswordKdfAlgo"},{name:"new_secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_random",type:"bytes"},{name:"pending_reset_date",type:"flags.5?int"},{name:"login_email_pattern",type:"flags.6?string"}],type:"account.Password"},{id:-1705233435,predicate:"account.passwordSettings",params:[{name:"flags",type:"#"},{name:"email",type:"flags.0?string"},{name:"secure_settings",type:"flags.1?SecureSecretSettings"}],type:"account.PasswordSettings"},{id:-1036572727,predicate:"account.passwordInputSettings",params:[{name:"flags",type:"#"},{name:"new_algo",type:"flags.0?PasswordKdfAlgo"},{name:"new_password_hash",type:"flags.0?bytes"},{name:"hint",type:"flags.0?string"},{name:"email",type:"flags.1?string"},{name:"new_secure_settings",type:"flags.2?SecureSecretSettings"}],type:"account.PasswordInputSettings"},{id:326715557,predicate:"auth.passwordRecovery",params:[{name:"email_pattern",type:"string"}],type:"auth.PasswordRecovery"},{id:-1052959727,predicate:"inputMediaVenue",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"InputMedia"},{id:784356159,predicate:"messageMediaVenue",params:[{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"MessageMedia"},{id:-1551583367,predicate:"receivedNotifyMessage",params:[{name:"id",type:"int"},{name:"flags",type:"int"}],type:"ReceivedNotifyMessage"},{id:179611673,predicate:"chatInviteExported",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.0?true"},{name:"permanent",type:"flags.5?true"},{name:"request_needed",type:"flags.6?true"},{name:"link",type:"string"},{name:"admin_id",type:"long"},{name:"date",type:"int"},{name:"start_date",type:"flags.4?int"},{name:"expire_date",type:"flags.1?int"},{name:"usage_limit",type:"flags.2?int"},{name:"usage",type:"flags.3?int"},{name:"requested",type:"flags.7?int"},{name:"title",type:"flags.8?string"}],type:"ExportedChatInvite"},{id:1516793212,predicate:"chatInviteAlready",params:[{name:"chat",type:"Chat"}],type:"ChatInvite"},{id:806110401,predicate:"chatInvite",params:[{name:"flags",type:"#"},{name:"channel",type:"flags.0?true"},{name:"broadcast",type:"flags.1?true"},{name:"public",type:"flags.2?true"},{name:"megagroup",type:"flags.3?true"},{name:"request_needed",type:"flags.6?true"},{name:"title",type:"string"},{name:"about",type:"flags.5?string"},{name:"photo",type:"Photo"},{name:"participants_count",type:"int"},{name:"participants",type:"flags.4?Vector"}],type:"ChatInvite"},{id:51520707,predicate:"messageActionChatJoinedByLink",params:[{name:"inviter_id",type:"long"}],type:"MessageAction"},{id:1757493555,predicate:"updateReadMessagesContents",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-4838507,predicate:"inputStickerSetEmpty",params:[],type:"InputStickerSet"},{id:-1645763991,predicate:"inputStickerSetID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputStickerSet"},{id:-2044933984,predicate:"inputStickerSetShortName",params:[{name:"short_name",type:"string"}],type:"InputStickerSet"},{id:768691932,predicate:"stickerSet",params:[{name:"flags",type:"#"},{name:"archived",type:"flags.1?true"},{name:"official",type:"flags.2?true"},{name:"masks",type:"flags.3?true"},{name:"animated",type:"flags.5?true"},{name:"videos",type:"flags.6?true"},{name:"emojis",type:"flags.7?true"},{name:"installed_date",type:"flags.0?int"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumbs",type:"flags.4?Vector"},{name:"thumb_dc_id",type:"flags.4?int"},{name:"thumb_version",type:"flags.4?int"},{name:"thumb_document_id",type:"flags.8?long"},{name:"count",type:"int"},{name:"hash",type:"int"}],type:"StickerSet"},{id:1846886166,predicate:"messages.stickerSet",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"keywords",type:"Vector"},{name:"documents",type:"Vector"}],type:"messages.StickerSet"},{id:-1885878744,predicate:"user",params:[{name:"flags",type:"#"},{name:"self",type:"flags.10?true"},{name:"contact",type:"flags.11?true"},{name:"mutual_contact",type:"flags.12?true"},{name:"deleted",type:"flags.13?true"},{name:"bot",type:"flags.14?true"},{name:"bot_chat_history",type:"flags.15?true"},{name:"bot_nochats",type:"flags.16?true"},{name:"verified",type:"flags.17?true"},{name:"restricted",type:"flags.18?true"},{name:"min",type:"flags.20?true"},{name:"bot_inline_geo",type:"flags.21?true"},{name:"support",type:"flags.23?true"},{name:"scam",type:"flags.24?true"},{name:"apply_min_photo",type:"flags.25?true"},{name:"fake",type:"flags.26?true"},{name:"bot_attach_menu",type:"flags.27?true"},{name:"premium",type:"flags.28?true"},{name:"attach_menu_enabled",type:"flags.29?true"},{name:"flags2",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"flags.0?long"},{name:"first_name",type:"flags.1?string"},{name:"last_name",type:"flags.2?string"},{name:"username",type:"flags.3?string"},{name:"phone",type:"flags.4?string"},{name:"photo",type:"flags.5?UserProfilePhoto"},{name:"status",type:"flags.6?UserStatus"},{name:"bot_info_version",type:"flags.14?int"},{name:"restriction_reason",type:"flags.18?Vector"},{name:"bot_inline_placeholder",type:"flags.19?string"},{name:"lang_code",type:"flags.22?string"},{name:"emoji_status",type:"flags.30?EmojiStatus"},{name:"usernames",type:"flags2.0?Vector"}],type:"User"},{id:-1032140601,predicate:"botCommand",params:[{name:"command",type:"string"},{name:"description",type:"string"}],type:"BotCommand"},{id:-1892676777,predicate:"botInfo",params:[{name:"flags",type:"#"},{name:"user_id",type:"flags.0?long"},{name:"description",type:"flags.1?string"},{name:"description_photo",type:"flags.4?Photo"},{name:"description_document",type:"flags.5?Document"},{name:"commands",type:"flags.2?Vector"},{name:"menu_button",type:"flags.3?BotMenuButton"}],type:"BotInfo"},{id:-1560655744,predicate:"keyboardButton",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:2002815875,predicate:"keyboardButtonRow",params:[{name:"buttons",type:"Vector"}],type:"KeyboardButtonRow"},{id:-1606526075,predicate:"replyKeyboardHide",params:[{name:"flags",type:"#"},{name:"selective",type:"flags.2?true"}],type:"ReplyMarkup"},{id:-2035021048,predicate:"replyKeyboardForceReply",params:[{name:"flags",type:"#"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-2049074735,predicate:"replyKeyboardMarkup",params:[{name:"flags",type:"#"},{name:"resize",type:"flags.0?true"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"persistent",type:"flags.4?true"},{name:"rows",type:"Vector"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-571955892,predicate:"inputPeerUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-233744186,predicate:"inputUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputUser"},{id:-1148011883,predicate:"messageEntityUnknown",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-100378723,predicate:"messageEntityMention",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1868782349,predicate:"messageEntityHashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1827637959,predicate:"messageEntityBotCommand",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1859134776,predicate:"messageEntityUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1692693954,predicate:"messageEntityEmail",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1117713463,predicate:"messageEntityBold",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-2106619040,predicate:"messageEntityItalic",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:681706865,predicate:"messageEntityCode",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1938967520,predicate:"messageEntityPre",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"language",type:"string"}],type:"MessageEntity"},{id:1990644519,predicate:"messageEntityTextUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"url",type:"string"}],type:"MessageEntity"},{id:-1877614335,predicate:"updateShortSentMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"media",type:"flags.9?MessageMedia"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:-292807034,predicate:"inputChannelEmpty",params:[],type:"InputChannel"},{id:-212145112,predicate:"inputChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputChannel"},{id:-1566230754,predicate:"peerChannel",params:[{name:"channel_id",type:"long"}],type:"Peer"},{id:666680316,predicate:"inputPeerChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-2094689180,predicate:"channel",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"left",type:"flags.2?true"},{name:"broadcast",type:"flags.5?true"},{name:"verified",type:"flags.7?true"},{name:"megagroup",type:"flags.8?true"},{name:"restricted",type:"flags.9?true"},{name:"signatures",type:"flags.11?true"},{name:"min",type:"flags.12?true"},{name:"scam",type:"flags.19?true"},{name:"has_link",type:"flags.20?true"},{name:"has_geo",type:"flags.21?true"},{name:"slowmode_enabled",type:"flags.22?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"fake",type:"flags.25?true"},{name:"gigagroup",type:"flags.26?true"},{name:"noforwards",type:"flags.27?true"},{name:"join_to_send",type:"flags.28?true"},{name:"join_request",type:"flags.29?true"},{name:"forum",type:"flags.30?true"},{name:"flags2",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"flags.13?long"},{name:"title",type:"string"},{name:"username",type:"flags.6?string"},{name:"photo",type:"ChatPhoto"},{name:"date",type:"int"},{name:"restriction_reason",type:"flags.9?Vector"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"banned_rights",type:"flags.15?ChatBannedRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"},{name:"participants_count",type:"flags.17?int"},{name:"usernames",type:"flags2.0?Vector"}],type:"Chat"},{id:399807445,predicate:"channelForbidden",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.5?true"},{name:"megagroup",type:"flags.8?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"until_date",type:"flags.16?int"}],type:"Chat"},{id:2131196633,predicate:"contacts.resolvedPeer",params:[{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ResolvedPeer"},{id:-231385849,predicate:"channelFull",params:[{name:"flags",type:"#"},{name:"can_view_participants",type:"flags.3?true"},{name:"can_set_username",type:"flags.6?true"},{name:"can_set_stickers",type:"flags.7?true"},{name:"hidden_prehistory",type:"flags.10?true"},{name:"can_set_location",type:"flags.16?true"},{name:"has_scheduled",type:"flags.19?true"},{name:"can_view_stats",type:"flags.20?true"},{name:"blocked",type:"flags.22?true"},{name:"flags2",type:"#"},{name:"can_delete_channel",type:"flags2.0?true"},{name:"antispam",type:"flags2.1?true"},{name:"participants_hidden",type:"flags2.2?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants_count",type:"flags.0?int"},{name:"admins_count",type:"flags.1?int"},{name:"kicked_count",type:"flags.2?int"},{name:"banned_count",type:"flags.2?int"},{name:"online_count",type:"flags.13?int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"chat_photo",type:"Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.23?ExportedChatInvite"},{name:"bot_info",type:"Vector"},{name:"migrated_from_chat_id",type:"flags.4?long"},{name:"migrated_from_max_id",type:"flags.4?int"},{name:"pinned_msg_id",type:"flags.5?int"},{name:"stickerset",type:"flags.8?StickerSet"},{name:"available_min_id",type:"flags.9?int"},{name:"folder_id",type:"flags.11?int"},{name:"linked_chat_id",type:"flags.14?long"},{name:"location",type:"flags.15?ChannelLocation"},{name:"slowmode_seconds",type:"flags.17?int"},{name:"slowmode_next_send_date",type:"flags.18?int"},{name:"stats_dc",type:"flags.12?int"},{name:"pts",type:"int"},{name:"call",type:"flags.21?InputGroupCall"},{name:"ttl_period",type:"flags.24?int"},{name:"pending_suggestions",type:"flags.25?Vector"},{name:"groupcall_default_join_as",type:"flags.26?Peer"},{name:"theme_emoticon",type:"flags.27?string"},{name:"requests_pending",type:"flags.28?int"},{name:"recent_requesters",type:"flags.28?Vector"},{name:"default_send_as",type:"flags.29?Peer"},{name:"available_reactions",type:"flags.30?ChatReactions"}],type:"ChatFull"},{id:182649427,predicate:"messageRange",params:[{name:"min_id",type:"int"},{name:"max_id",type:"int"}],type:"MessageRange"},{id:-948520370,predicate:"messages.channelMessages",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"pts",type:"int"},{name:"count",type:"int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"topics",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:-1781355374,predicate:"messageActionChannelCreate",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:277713951,predicate:"updateChannelTooLong",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"pts",type:"flags.0?int"}],type:"Update"},{id:1666927625,predicate:"updateChannel",params:[{name:"channel_id",type:"long"}],type:"Update"},{id:1656358105,predicate:"updateNewChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1842450928,predicate:"updateReadChannelInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"channel_id",type:"long"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"}],type:"Update"},{id:-1020437742,predicate:"updateDeleteChannelMessages",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-232346616,predicate:"updateChannelMessageViews",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"views",type:"int"}],type:"Update"},{id:1041346555,predicate:"updates.channelDifferenceEmpty",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"}],type:"updates.ChannelDifference"},{id:-1531132162,predicate:"updates.channelDifferenceTooLong",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"timeout",type:"flags.1?int"},{name:"dialog",type:"Dialog"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:543450958,predicate:"updates.channelDifference",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"},{name:"new_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:-1798033689,predicate:"channelMessagesFilterEmpty",params:[],type:"ChannelMessagesFilter"},{id:-847783593,predicate:"channelMessagesFilter",params:[{name:"flags",type:"#"},{name:"exclude_new_messages",type:"flags.1?true"},{name:"ranges",type:"Vector"}],type:"ChannelMessagesFilter"},{id:-1072953408,predicate:"channelParticipant",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:900251559,predicate:"channelParticipantSelf",params:[{name:"flags",type:"#"},{name:"via_request",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:803602899,predicate:"channelParticipantCreator",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.0?string"}],type:"ChannelParticipant"},{id:-566281095,predicate:"channelParticipantsRecent",params:[],type:"ChannelParticipantsFilter"},{id:-1268741783,predicate:"channelParticipantsAdmins",params:[],type:"ChannelParticipantsFilter"},{id:-1548400251,predicate:"channelParticipantsKicked",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-1699676497,predicate:"channels.channelParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipants"},{id:-541588713,predicate:"channels.channelParticipant",params:[{name:"participant",type:"ChannelParticipant"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipant"},{id:-462696732,predicate:"chatParticipantCreator",params:[{name:"user_id",type:"long"}],type:"ChatParticipant"},{id:-1600962725,predicate:"chatParticipantAdmin",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-674602590,predicate:"updateChatParticipantAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"is_admin",type:"Bool"},{name:"version",type:"int"}],type:"Update"},{id:-519864430,predicate:"messageActionChatMigrateTo",params:[{name:"channel_id",type:"long"}],type:"MessageAction"},{id:-365344535,predicate:"messageActionChannelMigrateFrom",params:[{name:"title",type:"string"},{name:"chat_id",type:"long"}],type:"MessageAction"},{id:-1328445861,predicate:"channelParticipantsBots",params:[],type:"ChannelParticipantsFilter"},{id:2013922064,predicate:"help.termsOfService",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"id",type:"DataJSON"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"min_age_confirm",type:"flags.1?int"}],type:"help.TermsOfService"},{id:1753886890,predicate:"updateNewStickerSet",params:[{name:"stickerset",type:"messages.StickerSet"}],type:"Update"},{id:196268545,predicate:"updateStickerSetsOrder",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"},{name:"order",type:"Vector"}],type:"Update"},{id:834816008,predicate:"updateStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"}],type:"Update"},{id:-402498398,predicate:"messages.savedGifsNotModified",params:[],type:"messages.SavedGifs"},{id:-2069878259,predicate:"messages.savedGifs",params:[{name:"hash",type:"long"},{name:"gifs",type:"Vector"}],type:"messages.SavedGifs"},{id:-1821035490,predicate:"updateSavedGifs",params:[],type:"Update"},{id:864077702,predicate:"inputBotInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1036876423,predicate:"inputBotInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-2000710887,predicate:"inputBotInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?InputWebDocument"},{name:"content",type:"flags.5?InputWebDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1984755728,predicate:"botInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1937807902,predicate:"botInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:295067450,predicate:"botInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?WebDocument"},{name:"content",type:"flags.5?WebDocument"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:-1803769784,predicate:"messages.botResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"query_id",type:"long"},{name:"next_offset",type:"flags.1?string"},{name:"switch_pm",type:"flags.2?InlineBotSwitchPM"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"users",type:"Vector"}],type:"messages.BotResults"},{id:1232025500,predicate:"updateBotInlineQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"peer_type",type:"flags.1?InlineQueryPeerType"},{name:"offset",type:"string"}],type:"Update"},{id:317794823,predicate:"updateBotInlineSend",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"id",type:"string"},{name:"msg_id",type:"flags.1?InputBotInlineMessageID"}],type:"Update"},{id:1358283666,predicate:"inputMessagesFilterVoice",params:[],type:"MessagesFilter"},{id:928101534,predicate:"inputMessagesFilterMusic",params:[],type:"MessagesFilter"},{id:-1107622874,predicate:"inputPrivacyKeyChatInvite",params:[],type:"InputPrivacyKey"},{id:1343122938,predicate:"privacyKeyChatInvite",params:[],type:"PrivacyKey"},{id:1571494644,predicate:"exportedMessageLink",params:[{name:"link",type:"string"},{name:"html",type:"string"}],type:"ExportedMessageLink"},{id:1601666510,predicate:"messageFwdHeader",params:[{name:"flags",type:"#"},{name:"imported",type:"flags.7?true"},{name:"from_id",type:"flags.0?Peer"},{name:"from_name",type:"flags.5?string"},{name:"date",type:"int"},{name:"channel_post",type:"flags.2?int"},{name:"post_author",type:"flags.3?string"},{name:"saved_from_peer",type:"flags.4?Peer"},{name:"saved_from_msg_id",type:"flags.4?int"},{name:"psa_type",type:"flags.6?string"}],type:"MessageFwdHeader"},{id:457133559,predicate:"updateEditChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1799538451,predicate:"messageActionPinMessage",params:[],type:"MessageAction"},{id:1923290508,predicate:"auth.codeTypeSms",params:[],type:"auth.CodeType"},{id:1948046307,predicate:"auth.codeTypeCall",params:[],type:"auth.CodeType"},{id:577556219,predicate:"auth.codeTypeFlashCall",params:[],type:"auth.CodeType"},{id:1035688326,predicate:"auth.sentCodeTypeApp",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1073693790,predicate:"auth.sentCodeTypeSms",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:1398007207,predicate:"auth.sentCodeTypeCall",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1425815847,predicate:"auth.sentCodeTypeFlashCall",params:[{name:"pattern",type:"string"}],type:"auth.SentCodeType"},{id:629866245,predicate:"keyboardButtonUrl",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:901503851,predicate:"keyboardButtonCallback",params:[{name:"flags",type:"#"},{name:"requires_password",type:"flags.0?true"},{name:"text",type:"string"},{name:"data",type:"bytes"}],type:"KeyboardButton"},{id:-1318425559,predicate:"keyboardButtonRequestPhone",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-59151553,predicate:"keyboardButtonRequestGeoLocation",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:90744648,predicate:"keyboardButtonSwitchInline",params:[{name:"flags",type:"#"},{name:"same_peer",type:"flags.0?true"},{name:"text",type:"string"},{name:"query",type:"string"}],type:"KeyboardButton"},{id:1218642516,predicate:"replyInlineMarkup",params:[{name:"rows",type:"Vector"}],type:"ReplyMarkup"},{id:911761060,predicate:"messages.botCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"has_url",type:"flags.3?true"},{name:"native_ui",type:"flags.4?true"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"messages.BotCallbackAnswer"},{id:-1177566067,predicate:"updateBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:649453030,predicate:"messages.messageEditData",params:[{name:"flags",type:"#"},{name:"caption",type:"flags.0?true"}],type:"messages.MessageEditData"},{id:-469536605,predicate:"updateEditMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1768777083,predicate:"inputBotInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1098628881,predicate:"inputBotInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-1494368259,predicate:"inputBotInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:85477117,predicate:"botInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1970903652,predicate:"botInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:416402882,predicate:"botInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1462213465,predicate:"inputBotInlineResultPhoto",params:[{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"InputPhoto"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:-459324,predicate:"inputBotInlineResultDocument",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"document",type:"InputDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:400266251,predicate:"botInlineMediaResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"flags.0?Photo"},{name:"document",type:"flags.1?Document"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:-1995686519,predicate:"inputBotInlineMessageID",params:[{name:"dc_id",type:"int"},{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:1763610706,predicate:"updateInlineBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"msg_id",type:"InputBotInlineMessageID"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:1008755359,predicate:"inlineBotSwitchPM",params:[{name:"text",type:"string"},{name:"start_param",type:"string"}],type:"InlineBotSwitchPM"},{id:863093588,predicate:"messages.peerDialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"messages.PeerDialogs"},{id:-305282981,predicate:"topPeer",params:[{name:"peer",type:"Peer"},{name:"rating",type:"double"}],type:"TopPeer"},{id:-1419371685,predicate:"topPeerCategoryBotsPM",params:[],type:"TopPeerCategory"},{id:344356834,predicate:"topPeerCategoryBotsInline",params:[],type:"TopPeerCategory"},{id:104314861,predicate:"topPeerCategoryCorrespondents",params:[],type:"TopPeerCategory"},{id:-1122524854,predicate:"topPeerCategoryGroups",params:[],type:"TopPeerCategory"},{id:371037736,predicate:"topPeerCategoryChannels",params:[],type:"TopPeerCategory"},{id:-75283823,predicate:"topPeerCategoryPeers",params:[{name:"category",type:"TopPeerCategory"},{name:"count",type:"int"},{name:"peers",type:"Vector"}],type:"TopPeerCategoryPeers"},{id:-567906571,predicate:"contacts.topPeersNotModified",params:[],type:"contacts.TopPeers"},{id:1891070632,predicate:"contacts.topPeers",params:[{name:"categories",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.TopPeers"},{id:-595914432,predicate:"messageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"long"}],type:"MessageEntity"},{id:546203849,predicate:"inputMessageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"InputUser"}],type:"MessageEntity"},{id:975236280,predicate:"inputMessagesFilterChatPhotos",params:[],type:"MessagesFilter"},{id:-1218471511,predicate:"updateReadChannelOutbox",params:[{name:"channel_id",type:"long"},{name:"max_id",type:"int"}],type:"Update"},{id:457829485,predicate:"updateDraftMessage",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"top_msg_id",type:"flags.0?int"},{name:"draft",type:"DraftMessage"}],type:"Update"},{id:453805082,predicate:"draftMessageEmpty",params:[{name:"flags",type:"#"},{name:"date",type:"flags.0?int"}],type:"DraftMessage"},{id:-40996577,predicate:"draftMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"},{name:"date",type:"int"}],type:"DraftMessage"},{id:-1615153660,predicate:"messageActionHistoryClear",params:[],type:"MessageAction"},{id:-958657434,predicate:"messages.featuredStickersNotModified",params:[{name:"count",type:"int"}],type:"messages.FeaturedStickers"},{id:-1103615738,predicate:"messages.featuredStickers",params:[{name:"flags",type:"#"},{name:"premium",type:"flags.0?true"},{name:"hash",type:"long"},{name:"count",type:"int"},{name:"sets",type:"Vector"},{name:"unread",type:"Vector"}],type:"messages.FeaturedStickers"},{id:1461528386,predicate:"updateReadFeaturedStickers",params:[],type:"Update"},{id:186120336,predicate:"messages.recentStickersNotModified",params:[],type:"messages.RecentStickers"},{id:-1999405994,predicate:"messages.recentStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"},{name:"dates",type:"Vector"}],type:"messages.RecentStickers"},{id:-1706939360,predicate:"updateRecentStickers",params:[],type:"Update"},{id:1338747336,predicate:"messages.archivedStickers",params:[{name:"count",type:"int"},{name:"sets",type:"Vector"}],type:"messages.ArchivedStickers"},{id:946083368,predicate:"messages.stickerSetInstallResultSuccess",params:[],type:"messages.StickerSetInstallResult"},{id:904138920,predicate:"messages.stickerSetInstallResultArchive",params:[{name:"sets",type:"Vector"}],type:"messages.StickerSetInstallResult"},{id:1678812626,predicate:"stickerSetCovered",params:[{name:"set",type:"StickerSet"},{name:"cover",type:"Document"}],type:"StickerSetCovered"},{id:-1574314746,predicate:"updateConfig",params:[],type:"Update"},{id:861169551,predicate:"updatePtsChanged",params:[],type:"Update"},{id:-440664550,predicate:"inputMediaPhotoExternal",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.1?true"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-78455655,predicate:"inputMediaDocumentExternal",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.1?true"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:872932635,predicate:"stickerSetMultiCovered",params:[{name:"set",type:"StickerSet"},{name:"covers",type:"Vector"}],type:"StickerSetCovered"},{id:-1361650766,predicate:"maskCoords",params:[{name:"n",type:"int"},{name:"x",type:"double"},{name:"y",type:"double"},{name:"zoom",type:"double"}],type:"MaskCoords"},{id:-1744710921,predicate:"documentAttributeHasStickers",params:[],type:"DocumentAttribute"},{id:1251549527,predicate:"inputStickeredMediaPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputStickeredMedia"},{id:70813275,predicate:"inputStickeredMediaDocument",params:[{name:"id",type:"InputDocument"}],type:"InputStickeredMedia"},{id:-1107729093,predicate:"game",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"short_name",type:"string"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"Photo"},{name:"document",type:"flags.0?Document"}],type:"Game"},{id:1336154098,predicate:"inputBotInlineResultGame",params:[{name:"id",type:"string"},{name:"short_name",type:"string"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1262639204,predicate:"inputBotInlineMessageGame",params:[{name:"flags",type:"#"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-38694904,predicate:"messageMediaGame",params:[{name:"game",type:"Game"}],type:"MessageMedia"},{id:-750828557,predicate:"inputMediaGame",params:[{name:"id",type:"InputGame"}],type:"InputMedia"},{id:53231223,predicate:"inputGameID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGame"},{id:-1020139510,predicate:"inputGameShortName",params:[{name:"bot_id",type:"InputUser"},{name:"short_name",type:"string"}],type:"InputGame"},{id:1358175439,predicate:"keyboardButtonGame",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1834538890,predicate:"messageActionGameScore",params:[{name:"game_id",type:"long"},{name:"score",type:"int"}],type:"MessageAction"},{id:1940093419,predicate:"highScore",params:[{name:"pos",type:"int"},{name:"user_id",type:"long"},{name:"score",type:"int"}],type:"HighScore"},{id:-1707344487,predicate:"messages.highScores",params:[{name:"scores",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.HighScores"},{id:1258196845,predicate:"updates.differenceTooLong",params:[{name:"pts",type:"int"}],type:"updates.Difference"},{id:791390623,predicate:"updateChannelWebPage",params:[{name:"channel_id",type:"long"},{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1663561404,predicate:"messages.chatsSlice",params:[{name:"count",type:"int"},{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-599948721,predicate:"textEmpty",params:[],type:"RichText"},{id:1950782688,predicate:"textPlain",params:[{name:"text",type:"string"}],type:"RichText"},{id:1730456516,predicate:"textBold",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-653089380,predicate:"textItalic",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1054465340,predicate:"textUnderline",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1678197867,predicate:"textStrike",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1816074681,predicate:"textFixed",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1009288385,predicate:"textUrl",params:[{name:"text",type:"RichText"},{name:"url",type:"string"},{name:"webpage_id",type:"long"}],type:"RichText"},{id:-564523562,predicate:"textEmail",params:[{name:"text",type:"RichText"},{name:"email",type:"string"}],type:"RichText"},{id:2120376535,predicate:"textConcat",params:[{name:"texts",type:"Vector"}],type:"RichText"},{id:324435594,predicate:"pageBlockUnsupported",params:[],type:"PageBlock"},{id:1890305021,predicate:"pageBlockTitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1879401953,predicate:"pageBlockSubtitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1162877472,predicate:"pageBlockAuthorDate",params:[{name:"author",type:"RichText"},{name:"published_date",type:"int"}],type:"PageBlock"},{id:-1076861716,predicate:"pageBlockHeader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-248793375,predicate:"pageBlockSubheader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:1182402406,predicate:"pageBlockParagraph",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1066346178,predicate:"pageBlockPreformatted",params:[{name:"text",type:"RichText"},{name:"language",type:"string"}],type:"PageBlock"},{id:1216809369,predicate:"pageBlockFooter",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-618614392,predicate:"pageBlockDivider",params:[],type:"PageBlock"},{id:-837994576,predicate:"pageBlockAnchor",params:[{name:"name",type:"string"}],type:"PageBlock"},{id:-454524911,predicate:"pageBlockList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:641563686,predicate:"pageBlockBlockquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:1329878739,predicate:"pageBlockPullquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:391759200,predicate:"pageBlockPhoto",params:[{name:"flags",type:"#"},{name:"photo_id",type:"long"},{name:"caption",type:"PageCaption"},{name:"url",type:"flags.0?string"},{name:"webpage_id",type:"flags.0?long"}],type:"PageBlock"},{id:2089805750,predicate:"pageBlockVideo",params:[{name:"flags",type:"#"},{name:"autoplay",type:"flags.0?true"},{name:"loop",type:"flags.1?true"},{name:"video_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:972174080,predicate:"pageBlockCover",params:[{name:"cover",type:"PageBlock"}],type:"PageBlock"},{id:-1468953147,predicate:"pageBlockEmbed",params:[{name:"flags",type:"#"},{name:"full_width",type:"flags.0?true"},{name:"allow_scrolling",type:"flags.3?true"},{name:"url",type:"flags.1?string"},{name:"html",type:"flags.2?string"},{name:"poster_photo_id",type:"flags.4?long"},{name:"w",type:"flags.5?int"},{name:"h",type:"flags.5?int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-229005301,predicate:"pageBlockEmbedPost",params:[{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"author_photo_id",type:"long"},{name:"author",type:"string"},{name:"date",type:"int"},{name:"blocks",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1705048653,predicate:"pageBlockCollage",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:52401552,predicate:"pageBlockSlideshow",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1930545681,predicate:"webPageNotModified",params:[{name:"flags",type:"#"},{name:"cached_page_views",type:"flags.0?int"}],type:"WebPage"},{id:-88417185,predicate:"inputPrivacyKeyPhoneCall",params:[],type:"InputPrivacyKey"},{id:1030105979,predicate:"privacyKeyPhoneCall",params:[],type:"PrivacyKey"},{id:-580219064,predicate:"sendMessageGamePlayAction",params:[],type:"SendMessageAction"},{id:-2048646399,predicate:"phoneCallDiscardReasonMissed",params:[],type:"PhoneCallDiscardReason"},{id:-527056480,predicate:"phoneCallDiscardReasonDisconnect",params:[],type:"PhoneCallDiscardReason"},{id:1471006352,predicate:"phoneCallDiscardReasonHangup",params:[],type:"PhoneCallDiscardReason"},{id:-84416311,predicate:"phoneCallDiscardReasonBusy",params:[],type:"PhoneCallDiscardReason"},{id:1852826908,predicate:"updateDialogPinned",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-99664734,predicate:"updatePinnedDialogs",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.1?int"},{name:"order",type:"flags.0?Vector"}],type:"Update"},{id:2104790276,predicate:"dataJSON",params:[{name:"data",type:"string"}],type:"DataJSON"},{id:-2095595325,predicate:"updateBotWebhookJSON",params:[{name:"data",type:"DataJSON"}],type:"Update"},{id:-1684914010,predicate:"updateBotWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"},{name:"timeout",type:"int"}],type:"Update"},{id:-886477832,predicate:"labeledPrice",params:[{name:"label",type:"string"},{name:"amount",type:"long"}],type:"LabeledPrice"},{id:1048946971,predicate:"invoice",params:[{name:"flags",type:"#"},{name:"test",type:"flags.0?true"},{name:"name_requested",type:"flags.1?true"},{name:"phone_requested",type:"flags.2?true"},{name:"email_requested",type:"flags.3?true"},{name:"shipping_address_requested",type:"flags.4?true"},{name:"flexible",type:"flags.5?true"},{name:"phone_to_provider",type:"flags.6?true"},{name:"email_to_provider",type:"flags.7?true"},{name:"recurring",type:"flags.9?true"},{name:"currency",type:"string"},{name:"prices",type:"Vector"},{name:"max_tip_amount",type:"flags.8?long"},{name:"suggested_tip_amounts",type:"flags.8?Vector"},{name:"recurring_terms_url",type:"flags.9?string"}],type:"Invoice"},{id:-1900697899,predicate:"inputMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"start_param",type:"flags.1?string"},{name:"extended_media",type:"flags.2?InputMedia"}],type:"InputMedia"},{id:-368917890,predicate:"paymentCharge",params:[{name:"id",type:"string"},{name:"provider_charge_id",type:"string"}],type:"PaymentCharge"},{id:-1892568281,predicate:"messageActionPaymentSentMe",params:[{name:"flags",type:"#"},{name:"recurring_init",type:"flags.2?true"},{name:"recurring_used",type:"flags.3?true"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"charge",type:"PaymentCharge"}],type:"MessageAction"},{id:-156940077,predicate:"messageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"receipt_msg_id",type:"flags.2?int"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"start_param",type:"string"},{name:"extended_media",type:"flags.4?MessageExtendedMedia"}],type:"MessageMedia"},{id:512535275,predicate:"postAddress",params:[{name:"street_line1",type:"string"},{name:"street_line2",type:"string"},{name:"city",type:"string"},{name:"state",type:"string"},{name:"country_iso2",type:"string"},{name:"post_code",type:"string"}],type:"PostAddress"},{id:-1868808300,predicate:"paymentRequestedInfo",params:[{name:"flags",type:"#"},{name:"name",type:"flags.0?string"},{name:"phone",type:"flags.1?string"},{name:"email",type:"flags.2?string"},{name:"shipping_address",type:"flags.3?PostAddress"}],type:"PaymentRequestedInfo"},{id:-1344716869,predicate:"keyboardButtonBuy",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1776926890,predicate:"messageActionPaymentSent",params:[{name:"flags",type:"#"},{name:"recurring_init",type:"flags.2?true"},{name:"recurring_used",type:"flags.3?true"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"invoice_slug",type:"flags.0?string"}],type:"MessageAction"},{id:-842892769,predicate:"paymentSavedCredentialsCard",params:[{name:"id",type:"string"},{name:"title",type:"string"}],type:"PaymentSavedCredentials"},{id:475467473,predicate:"webDocument",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:-1678949555,predicate:"inputWebDocument",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"InputWebDocument"},{id:-1036396922,predicate:"inputWebFileLocation",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"}],type:"InputWebFileLocation"},{id:568808380,predicate:"upload.webFile",params:[{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"file_type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.WebFile"},{id:-1610250415,predicate:"payments.paymentForm",params:[{name:"flags",type:"#"},{name:"can_save_credentials",type:"flags.2?true"},{name:"password_missing",type:"flags.3?true"},{name:"form_id",type:"long"},{name:"bot_id",type:"long"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.5?WebDocument"},{name:"invoice",type:"Invoice"},{name:"provider_id",type:"long"},{name:"url",type:"string"},{name:"native_provider",type:"flags.4?string"},{name:"native_params",type:"flags.4?DataJSON"},{name:"additional_methods",type:"flags.6?Vector"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"},{name:"saved_credentials",type:"flags.1?Vector"},{name:"users",type:"Vector"}],type:"payments.PaymentForm"},{id:-784000893,predicate:"payments.validatedRequestedInfo",params:[{name:"flags",type:"#"},{name:"id",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"payments.ValidatedRequestedInfo"},{id:1314881805,predicate:"payments.paymentResult",params:[{name:"updates",type:"Updates"}],type:"payments.PaymentResult"},{id:1891958275,predicate:"payments.paymentReceipt",params:[{name:"flags",type:"#"},{name:"date",type:"int"},{name:"bot_id",type:"long"},{name:"provider_id",type:"long"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.2?WebDocument"},{name:"invoice",type:"Invoice"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping",type:"flags.1?ShippingOption"},{name:"tip_amount",type:"flags.3?long"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"credentials_title",type:"string"},{name:"users",type:"Vector"}],type:"payments.PaymentReceipt"},{id:-74456004,predicate:"payments.savedInfo",params:[{name:"flags",type:"#"},{name:"has_saved_credentials",type:"flags.1?true"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"}],type:"payments.SavedInfo"},{id:-1056001329,predicate:"inputPaymentCredentialsSaved",params:[{name:"id",type:"string"},{name:"tmp_password",type:"bytes"}],type:"InputPaymentCredentials"},{id:873977640,predicate:"inputPaymentCredentials",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-614138572,predicate:"account.tmpPassword",params:[{name:"tmp_password",type:"bytes"},{name:"valid_until",type:"int"}],type:"account.TmpPassword"},{id:-1239335713,predicate:"shippingOption",params:[{name:"id",type:"string"},{name:"title",type:"string"},{name:"prices",type:"Vector"}],type:"ShippingOption"},{id:-1246823043,predicate:"updateBotShippingQuery",params:[{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"shipping_address",type:"PostAddress"}],type:"Update"},{id:-1934976362,predicate:"updateBotPrecheckoutQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"Update"},{id:-6249322,predicate:"inputStickerSetItem",params:[{name:"flags",type:"#"},{name:"document",type:"InputDocument"},{name:"emoji",type:"string"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"InputStickerSetItem"},{id:-1425052898,predicate:"updatePhoneCall",params:[{name:"phone_call",type:"PhoneCall"}],type:"Update"},{id:506920429,predicate:"inputPhoneCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPhoneCall"},{id:1399245077,predicate:"phoneCallEmpty",params:[{name:"id",type:"long"}],type:"PhoneCall"},{id:-987599081,predicate:"phoneCallWaiting",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"receive_date",type:"flags.0?int"}],type:"PhoneCall"},{id:347139340,predicate:"phoneCallRequested",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:912311057,predicate:"phoneCallAccepted",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:-1770029977,predicate:"phoneCall",params:[{name:"flags",type:"#"},{name:"p2p_allowed",type:"flags.5?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"connections",type:"Vector"},{name:"start_date",type:"int"}],type:"PhoneCall"},{id:1355435489,predicate:"phoneCallDiscarded",params:[{name:"flags",type:"#"},{name:"need_rating",type:"flags.2?true"},{name:"need_debug",type:"flags.3?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"PhoneCall"},{id:-1665063993,predicate:"phoneConnection",params:[{name:"flags",type:"#"},{name:"tcp",type:"flags.0?true"},{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"peer_tag",type:"bytes"}],type:"PhoneConnection"},{id:-58224696,predicate:"phoneCallProtocol",params:[{name:"flags",type:"#"},{name:"udp_p2p",type:"flags.0?true"},{name:"udp_reflector",type:"flags.1?true"},{name:"min_layer",type:"int"},{name:"max_layer",type:"int"},{name:"library_versions",type:"Vector"}],type:"PhoneCallProtocol"},{id:-326966976,predicate:"phone.phoneCall",params:[{name:"phone_call",type:"PhoneCall"},{name:"users",type:"Vector"}],type:"phone.PhoneCall"},{id:-2134272152,predicate:"inputMessagesFilterPhoneCalls",params:[{name:"flags",type:"#"},{name:"missed",type:"flags.0?true"}],type:"MessagesFilter"},{id:-2132731265,predicate:"messageActionPhoneCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.2?true"},{name:"call_id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"MessageAction"},{id:2054952868,predicate:"inputMessagesFilterRoundVoice",params:[],type:"MessagesFilter"},{id:-1253451181,predicate:"inputMessagesFilterRoundVideo",params:[],type:"MessagesFilter"},{id:-1997373508,predicate:"sendMessageRecordRoundAction",params:[],type:"SendMessageAction"},{id:608050278,predicate:"sendMessageUploadRoundAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-242427324,predicate:"upload.fileCdnRedirect",params:[{name:"dc_id",type:"int"},{name:"file_token",type:"bytes"},{name:"encryption_key",type:"bytes"},{name:"encryption_iv",type:"bytes"},{name:"file_hashes",type:"Vector"}],type:"upload.File"},{id:-290921362,predicate:"upload.cdnFileReuploadNeeded",params:[{name:"request_token",type:"bytes"}],type:"upload.CdnFile"},{id:-1449145777,predicate:"upload.cdnFile",params:[{name:"bytes",type:"bytes"}],type:"upload.CdnFile"},{id:-914167110,predicate:"cdnPublicKey",params:[{name:"dc_id",type:"int"},{name:"public_key",type:"string"}],type:"CdnPublicKey"},{id:1462101002,predicate:"cdnConfig",params:[{name:"public_keys",type:"Vector"}],type:"CdnConfig"},{id:-283684427,predicate:"pageBlockChannel",params:[{name:"channel",type:"Chat"}],type:"PageBlock"},{id:-892239370,predicate:"langPackString",params:[{name:"key",type:"string"},{name:"value",type:"string"}],type:"LangPackString"},{id:1816636575,predicate:"langPackStringPluralized",params:[{name:"flags",type:"#"},{name:"key",type:"string"},{name:"zero_value",type:"flags.0?string"},{name:"one_value",type:"flags.1?string"},{name:"two_value",type:"flags.2?string"},{name:"few_value",type:"flags.3?string"},{name:"many_value",type:"flags.4?string"},{name:"other_value",type:"string"}],type:"LangPackString"},{id:695856818,predicate:"langPackStringDeleted",params:[{name:"key",type:"string"}],type:"LangPackString"},{id:-209337866,predicate:"langPackDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"strings",type:"Vector"}],type:"LangPackDifference"},{id:-288727837,predicate:"langPackLanguage",params:[{name:"flags",type:"#"},{name:"official",type:"flags.0?true"},{name:"rtl",type:"flags.2?true"},{name:"beta",type:"flags.3?true"},{name:"name",type:"string"},{name:"native_name",type:"string"},{name:"lang_code",type:"string"},{name:"base_lang_code",type:"flags.1?string"},{name:"plural_code",type:"string"},{name:"strings_count",type:"int"},{name:"translated_count",type:"int"},{name:"translations_url",type:"string"}],type:"LangPackLanguage"},{id:1180041828,predicate:"updateLangPackTooLong",params:[{name:"lang_code",type:"string"}],type:"Update"},{id:1442983757,predicate:"updateLangPack",params:[{name:"difference",type:"LangPackDifference"}],type:"Update"},{id:885242707,predicate:"channelParticipantAdmin",params:[{name:"flags",type:"#"},{name:"can_edit",type:"flags.0?true"},{name:"self",type:"flags.1?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"flags.1?long"},{name:"promoted_by",type:"long"},{name:"date",type:"int"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.2?string"}],type:"ChannelParticipant"},{id:1844969806,predicate:"channelParticipantBanned",params:[{name:"flags",type:"#"},{name:"left",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"kicked_by",type:"long"},{name:"date",type:"int"},{name:"banned_rights",type:"ChatBannedRights"}],type:"ChannelParticipant"},{id:338142689,predicate:"channelParticipantsBanned",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:106343499,predicate:"channelParticipantsSearch",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-421545947,predicate:"channelAdminLogEventActionChangeTitle",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1427671598,predicate:"channelAdminLogEventActionChangeAbout",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1783299128,predicate:"channelAdminLogEventActionChangeUsername",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1129042607,predicate:"channelAdminLogEventActionChangePhoto",params:[{name:"prev_photo",type:"Photo"},{name:"new_photo",type:"Photo"}],type:"ChannelAdminLogEventAction"},{id:460916654,predicate:"channelAdminLogEventActionToggleInvites",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:648939889,predicate:"channelAdminLogEventActionToggleSignatures",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-370660328,predicate:"channelAdminLogEventActionUpdatePinned",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1889215493,predicate:"channelAdminLogEventActionEditMessage",params:[{name:"prev_message",type:"Message"},{name:"new_message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1121994683,predicate:"channelAdminLogEventActionDeleteMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:405815507,predicate:"channelAdminLogEventActionParticipantJoin",params:[],type:"ChannelAdminLogEventAction"},{id:-124291086,predicate:"channelAdminLogEventActionParticipantLeave",params:[],type:"ChannelAdminLogEventAction"},{id:-484690728,predicate:"channelAdminLogEventActionParticipantInvite",params:[{name:"participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-422036098,predicate:"channelAdminLogEventActionParticipantToggleBan",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-714643696,predicate:"channelAdminLogEventActionParticipantToggleAdmin",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:531458253,predicate:"channelAdminLogEvent",params:[{name:"id",type:"long"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"action",type:"ChannelAdminLogEventAction"}],type:"ChannelAdminLogEvent"},{id:-309659827,predicate:"channels.adminLogResults",params:[{name:"events",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.AdminLogResults"},{id:-368018716,predicate:"channelAdminLogEventsFilter",params:[{name:"flags",type:"#"},{name:"join",type:"flags.0?true"},{name:"leave",type:"flags.1?true"},{name:"invite",type:"flags.2?true"},{name:"ban",type:"flags.3?true"},{name:"unban",type:"flags.4?true"},{name:"kick",type:"flags.5?true"},{name:"unkick",type:"flags.6?true"},{name:"promote",type:"flags.7?true"},{name:"demote",type:"flags.8?true"},{name:"info",type:"flags.9?true"},{name:"settings",type:"flags.10?true"},{name:"pinned",type:"flags.11?true"},{name:"edit",type:"flags.12?true"},{name:"delete",type:"flags.13?true"},{name:"group_call",type:"flags.14?true"},{name:"invites",type:"flags.15?true"},{name:"send",type:"flags.16?true"},{name:"forums",type:"flags.17?true"}],type:"ChannelAdminLogEventsFilter"},{id:511092620,predicate:"topPeerCategoryPhoneCalls",params:[],type:"TopPeerCategory"},{id:-2143067670,predicate:"pageBlockAudio",params:[{name:"audio_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1558266229,predicate:"popularContact",params:[{name:"client_id",type:"long"},{name:"importers",type:"int"}],type:"PopularContact"},{id:1200788123,predicate:"messageActionScreenshotTaken",params:[],type:"MessageAction"},{id:-1634752813,predicate:"messages.favedStickersNotModified",params:[],type:"messages.FavedStickers"},{id:750063767,predicate:"messages.favedStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"}],type:"messages.FavedStickers"},{id:-451831443,predicate:"updateFavedStickers",params:[],type:"Update"},{id:-366410403,predicate:"updateChannelReadMessagesContents",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"flags.0?int"},{name:"messages",type:"Vector"}],type:"Update"},{id:-1040652646,predicate:"inputMessagesFilterMyMentions",params:[],type:"MessagesFilter"},{id:1887741886,predicate:"updateContactsReset",params:[],type:"Update"},{id:-1312568665,predicate:"channelAdminLogEventActionChangeStickerSet",params:[{name:"prev_stickerset",type:"InputStickerSet"},{name:"new_stickerset",type:"InputStickerSet"}],type:"ChannelAdminLogEventAction"},{id:-85549226,predicate:"messageActionCustomAction",params:[{name:"message",type:"string"}],type:"MessageAction"},{id:178373535,predicate:"inputPaymentCredentialsApplePay",params:[{name:"payment_data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-419271411,predicate:"inputMessagesFilterGeo",params:[],type:"MessagesFilter"},{id:-530392189,predicate:"inputMessagesFilterContacts",params:[],type:"MessagesFilter"},{id:-1304443240,predicate:"updateChannelAvailableMessages",params:[{name:"channel_id",type:"long"},{name:"available_min_id",type:"int"}],type:"Update"},{id:1599903217,predicate:"channelAdminLogEventActionTogglePreHistoryHidden",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-1759532989,predicate:"inputMediaGeoLive",params:[{name:"flags",type:"#"},{name:"stopped",type:"flags.0?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.2?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"}],type:"InputMedia"},{id:-1186937242,predicate:"messageMediaGeoLive",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"int"},{name:"proximity_notification_radius",type:"flags.1?int"}],type:"MessageMedia"},{id:1189204285,predicate:"recentMeUrlUnknown",params:[{name:"url",type:"string"}],type:"RecentMeUrl"},{id:-1188296222,predicate:"recentMeUrlUser",params:[{name:"url",type:"string"},{name:"user_id",type:"long"}],type:"RecentMeUrl"},{id:-1294306862,predicate:"recentMeUrlChat",params:[{name:"url",type:"string"},{name:"chat_id",type:"long"}],type:"RecentMeUrl"},{id:-347535331,predicate:"recentMeUrlChatInvite",params:[{name:"url",type:"string"},{name:"chat_invite",type:"ChatInvite"}],type:"RecentMeUrl"},{id:-1140172836,predicate:"recentMeUrlStickerSet",params:[{name:"url",type:"string"},{name:"set",type:"StickerSetCovered"}],type:"RecentMeUrl"},{id:235081943,predicate:"help.recentMeUrls",params:[{name:"urls",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"help.RecentMeUrls"},{id:-266911767,predicate:"channels.channelParticipantsNotModified",params:[],type:"channels.ChannelParticipants"},{id:1951620897,predicate:"messages.messagesNotModified",params:[{name:"count",type:"int"}],type:"messages.Messages"},{id:482797855,predicate:"inputSingleMedia",params:[{name:"flags",type:"#"},{name:"media",type:"InputMedia"},{name:"random_id",type:"long"},{name:"message",type:"string"},{name:"entities",type:"flags.0?Vector"}],type:"InputSingleMedia"},{id:-1493633966,predicate:"webAuthorization",params:[{name:"hash",type:"long"},{name:"bot_id",type:"long"},{name:"domain",type:"string"},{name:"browser",type:"string"},{name:"platform",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"region",type:"string"}],type:"WebAuthorization"},{id:-313079300,predicate:"account.webAuthorizations",params:[{name:"authorizations",type:"Vector"},{name:"users",type:"Vector"}],type:"account.WebAuthorizations"},{id:-1502174430,predicate:"inputMessageID",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-1160215659,predicate:"inputMessageReplyTo",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-2037963464,predicate:"inputMessagePinned",params:[],type:"InputMessage"},{id:-1687559349,predicate:"messageEntityPhone",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1280209983,predicate:"messageEntityCashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1410748418,predicate:"messageActionBotAllowed",params:[{name:"domain",type:"string"}],type:"MessageAction"},{id:-55902537,predicate:"inputDialogPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputDialogPeer"},{id:-445792507,predicate:"dialogPeer",params:[{name:"peer",type:"Peer"}],type:"DialogPeer"},{id:223655517,predicate:"messages.foundStickerSetsNotModified",params:[],type:"messages.FoundStickerSets"},{id:-1963942446,predicate:"messages.foundStickerSets",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.FoundStickerSets"},{id:-207944868,predicate:"fileHash",params:[{name:"offset",type:"long"},{name:"limit",type:"int"},{name:"hash",type:"bytes"}],type:"FileHash"},{id:-104284986,predicate:"webDocumentNoProxy",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:1968737087,predicate:"inputClientProxy",params:[{name:"address",type:"string"},{name:"port",type:"int"}],type:"InputClientProxy"},{id:-483352705,predicate:"help.termsOfServiceUpdateEmpty",params:[{name:"expires",type:"int"}],type:"help.TermsOfServiceUpdate"},{id:686618977,predicate:"help.termsOfServiceUpdate",params:[{name:"expires",type:"int"},{name:"terms_of_service",type:"help.TermsOfService"}],type:"help.TermsOfServiceUpdate"},{id:859091184,predicate:"inputSecureFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"InputSecureFile"},{id:1399317950,predicate:"inputSecureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputSecureFile"},{id:-876089816,predicate:"inputSecureFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:1679398724,predicate:"secureFileEmpty",params:[],type:"SecureFile"},{id:2097791614,predicate:"secureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"long"},{name:"dc_id",type:"int"},{name:"date",type:"int"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureFile"},{id:-1964327229,predicate:"secureData",params:[{name:"data",type:"bytes"},{name:"data_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureData"},{id:2103482845,predicate:"securePlainPhone",params:[{name:"phone",type:"string"}],type:"SecurePlainData"},{id:569137759,predicate:"securePlainEmail",params:[{name:"email",type:"string"}],type:"SecurePlainData"},{id:-1658158621,predicate:"secureValueTypePersonalDetails",params:[],type:"SecureValueType"},{id:1034709504,predicate:"secureValueTypePassport",params:[],type:"SecureValueType"},{id:115615172,predicate:"secureValueTypeDriverLicense",params:[],type:"SecureValueType"},{id:-1596951477,predicate:"secureValueTypeIdentityCard",params:[],type:"SecureValueType"},{id:-1717268701,predicate:"secureValueTypeInternalPassport",params:[],type:"SecureValueType"},{id:-874308058,predicate:"secureValueTypeAddress",params:[],type:"SecureValueType"},{id:-63531698,predicate:"secureValueTypeUtilityBill",params:[],type:"SecureValueType"},{id:-1995211763,predicate:"secureValueTypeBankStatement",params:[],type:"SecureValueType"},{id:-1954007928,predicate:"secureValueTypeRentalAgreement",params:[],type:"SecureValueType"},{id:-1713143702,predicate:"secureValueTypePassportRegistration",params:[],type:"SecureValueType"},{id:-368907213,predicate:"secureValueTypeTemporaryRegistration",params:[],type:"SecureValueType"},{id:-1289704741,predicate:"secureValueTypePhone",params:[],type:"SecureValueType"},{id:-1908627474,predicate:"secureValueTypeEmail",params:[],type:"SecureValueType"},{id:411017418,predicate:"secureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?SecureFile"},{name:"reverse_side",type:"flags.2?SecureFile"},{name:"selfie",type:"flags.3?SecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"},{name:"hash",type:"bytes"}],type:"SecureValue"},{id:-618540889,predicate:"inputSecureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?InputSecureFile"},{name:"reverse_side",type:"flags.2?InputSecureFile"},{name:"selfie",type:"flags.3?InputSecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"}],type:"InputSecureValue"},{id:-316748368,predicate:"secureValueHash",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"}],type:"SecureValueHash"},{id:-391902247,predicate:"secureValueErrorData",params:[{name:"type",type:"SecureValueType"},{name:"data_hash",type:"bytes"},{name:"field",type:"string"},{name:"text",type:"string"}],type:"SecureValueError"},{id:12467706,predicate:"secureValueErrorFrontSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2037765467,predicate:"secureValueErrorReverseSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-449327402,predicate:"secureValueErrorSelfie",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:2054162547,predicate:"secureValueErrorFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:1717706985,predicate:"secureValueErrorFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:871426631,predicate:"secureCredentialsEncrypted",params:[{name:"data",type:"bytes"},{name:"hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureCredentialsEncrypted"},{id:-1389486888,predicate:"account.authorizationForm",params:[{name:"flags",type:"#"},{name:"required_types",type:"Vector"},{name:"values",type:"Vector"},{name:"errors",type:"Vector"},{name:"users",type:"Vector"},{name:"privacy_policy_url",type:"flags.0?string"}],type:"account.AuthorizationForm"},{id:-2128640689,predicate:"account.sentEmailCode",params:[{name:"email_pattern",type:"string"},{name:"length",type:"int"}],type:"account.SentEmailCode"},{id:455635795,predicate:"messageActionSecureValuesSentMe",params:[{name:"values",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"MessageAction"},{id:-648257196,predicate:"messageActionSecureValuesSent",params:[{name:"types",type:"Vector"}],type:"MessageAction"},{id:1722786150,predicate:"help.deepLinkInfoEmpty",params:[],type:"help.DeepLinkInfo"},{id:1783556146,predicate:"help.deepLinkInfo",params:[{name:"flags",type:"#"},{name:"update_app",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"help.DeepLinkInfo"},{id:289586518,predicate:"savedPhoneContact",params:[{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"date",type:"int"}],type:"SavedContact"},{id:1304052993,predicate:"account.takeout",params:[{name:"id",type:"long"}],type:"account.Takeout"},{id:700340377,predicate:"inputTakeoutFileLocation",params:[],type:"InputFileLocation"},{id:-513517117,predicate:"updateDialogUnreadMark",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-253500010,predicate:"messages.dialogsNotModified",params:[{name:"count",type:"int"}],type:"messages.Dialogs"},{id:-1625153079,predicate:"inputWebFileGeoPointLocation",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"access_hash",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"zoom",type:"int"},{name:"scale",type:"int"}],type:"InputWebFileLocation"},{id:-1255369827,predicate:"contacts.topPeersDisabled",params:[],type:"contacts.TopPeers"},{id:-1685456582,predicate:"inputReportReasonCopyright",params:[],type:"ReportReason"},{id:-732254058,predicate:"passwordKdfAlgoUnknown",params:[],type:"PasswordKdfAlgo"},{id:4883767,predicate:"securePasswordKdfAlgoUnknown",params:[],type:"SecurePasswordKdfAlgo"},{id:-1141711456,predicate:"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:-2042159726,predicate:"securePasswordKdfAlgoSHA512",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:354925740,predicate:"secureSecretSettings",params:[{name:"secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_secret",type:"bytes"},{name:"secure_secret_id",type:"long"}],type:"SecureSecretSettings"},{id:982592842,predicate:"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow",params:[{name:"salt1",type:"bytes"},{name:"salt2",type:"bytes"},{name:"g",type:"int"},{name:"p",type:"bytes"}],type:"PasswordKdfAlgo"},{id:-1736378792,predicate:"inputCheckPasswordEmpty",params:[],type:"InputCheckPasswordSRP"},{id:-763367294,predicate:"inputCheckPasswordSRP",params:[{name:"srp_id",type:"long"},{name:"A",type:"bytes"},{name:"M1",type:"bytes"}],type:"InputCheckPasswordSRP"},{id:-2036501105,predicate:"secureValueError",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-1592506512,predicate:"secureValueErrorTranslationFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:878931416,predicate:"secureValueErrorTranslationFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2103600678,predicate:"secureRequiredType",params:[{name:"flags",type:"#"},{name:"native_names",type:"flags.0?true"},{name:"selfie_required",type:"flags.1?true"},{name:"translation_required",type:"flags.2?true"},{name:"type",type:"SecureValueType"}],type:"SecureRequiredType"},{id:41187252,predicate:"secureRequiredTypeOneOf",params:[{name:"types",type:"Vector"}],type:"SecureRequiredType"},{id:-1078332329,predicate:"help.passportConfigNotModified",params:[],type:"help.PassportConfig"},{id:-1600596305,predicate:"help.passportConfig",params:[{name:"hash",type:"int"},{name:"countries_langs",type:"DataJSON"}],type:"help.PassportConfig"},{id:488313413,predicate:"inputAppEvent",params:[{name:"time",type:"double"},{name:"type",type:"string"},{name:"peer",type:"long"},{name:"data",type:"JSONValue"}],type:"InputAppEvent"},{id:-1059185703,predicate:"jsonObjectValue",params:[{name:"key",type:"string"},{name:"value",type:"JSONValue"}],type:"JSONObjectValue"},{id:1064139624,predicate:"jsonNull",params:[],type:"JSONValue"},{id:-952869270,predicate:"jsonBool",params:[{name:"value",type:"Bool"}],type:"JSONValue"},{id:736157604,predicate:"jsonNumber",params:[{name:"value",type:"double"}],type:"JSONValue"},{id:-1222740358,predicate:"jsonString",params:[{name:"value",type:"string"}],type:"JSONValue"},{id:-146520221,predicate:"jsonArray",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:-1715350371,predicate:"jsonObject",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:-1311015810,predicate:"inputNotifyBroadcasts",params:[],type:"InputNotifyPeer"},{id:-703403793,predicate:"notifyBroadcasts",params:[],type:"NotifyPeer"},{id:-311786236,predicate:"textSubscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-939827711,predicate:"textSuperscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:55281185,predicate:"textMarked",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:483104362,predicate:"textPhone",params:[{name:"text",type:"RichText"},{name:"phone",type:"string"}],type:"RichText"},{id:136105807,predicate:"textImage",params:[{name:"document_id",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"RichText"},{id:504660880,predicate:"pageBlockKicker",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:878078826,predicate:"pageTableCell",params:[{name:"flags",type:"#"},{name:"header",type:"flags.0?true"},{name:"align_center",type:"flags.3?true"},{name:"align_right",type:"flags.4?true"},{name:"valign_middle",type:"flags.5?true"},{name:"valign_bottom",type:"flags.6?true"},{name:"text",type:"flags.7?RichText"},{name:"colspan",type:"flags.1?int"},{name:"rowspan",type:"flags.2?int"}],type:"PageTableCell"},{id:-524237339,predicate:"pageTableRow",params:[{name:"cells",type:"Vector"}],type:"PageTableRow"},{id:-1085412734,predicate:"pageBlockTable",params:[{name:"flags",type:"#"},{name:"bordered",type:"flags.0?true"},{name:"striped",type:"flags.1?true"},{name:"title",type:"RichText"},{name:"rows",type:"Vector"}],type:"PageBlock"},{id:1869903447,predicate:"pageCaption",params:[{name:"text",type:"RichText"},{name:"credit",type:"RichText"}],type:"PageCaption"},{id:-1188055347,predicate:"pageListItemText",params:[{name:"text",type:"RichText"}],type:"PageListItem"},{id:635466748,predicate:"pageListItemBlocks",params:[{name:"blocks",type:"Vector"}],type:"PageListItem"},{id:1577484359,predicate:"pageListOrderedItemText",params:[{name:"num",type:"string"},{name:"text",type:"RichText"}],type:"PageListOrderedItem"},{id:-1730311882,predicate:"pageListOrderedItemBlocks",params:[{name:"num",type:"string"},{name:"blocks",type:"Vector"}],type:"PageListOrderedItem"},{id:-1702174239,predicate:"pageBlockOrderedList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:1987480557,predicate:"pageBlockDetails",params:[{name:"flags",type:"#"},{name:"open",type:"flags.0?true"},{name:"blocks",type:"Vector"},{name:"title",type:"RichText"}],type:"PageBlock"},{id:-1282352120,predicate:"pageRelatedArticle",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"title",type:"flags.0?string"},{name:"description",type:"flags.1?string"},{name:"photo_id",type:"flags.2?long"},{name:"author",type:"flags.3?string"},{name:"published_date",type:"flags.4?int"}],type:"PageRelatedArticle"},{id:370236054,predicate:"pageBlockRelatedArticles",params:[{name:"title",type:"RichText"},{name:"articles",type:"Vector"}],type:"PageBlock"},{id:-1538310410,predicate:"pageBlockMap",params:[{name:"geo",type:"GeoPoint"},{name:"zoom",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-1738178803,predicate:"page",params:[{name:"flags",type:"#"},{name:"part",type:"flags.0?true"},{name:"rtl",type:"flags.1?true"},{name:"v2",type:"flags.2?true"},{name:"url",type:"string"},{name:"blocks",type:"Vector"},{name:"photos",type:"Vector"},{name:"documents",type:"Vector"},{name:"views",type:"flags.3?int"}],type:"Page"},{id:-610373422,predicate:"inputPrivacyKeyPhoneP2P",params:[],type:"InputPrivacyKey"},{id:961092808,predicate:"privacyKeyPhoneP2P",params:[],type:"PrivacyKey"},{id:894777186,predicate:"textAnchor",params:[{name:"text",type:"RichText"},{name:"name",type:"string"}],type:"RichText"},{id:-1945767479,predicate:"help.supportName",params:[{name:"name",type:"string"}],type:"help.SupportName"},{id:-206688531,predicate:"help.userInfoEmpty",params:[],type:"help.UserInfo"},{id:32192344,predicate:"help.userInfo",params:[{name:"message",type:"string"},{name:"entities",type:"Vector"},{name:"author",type:"string"},{name:"date",type:"int"}],type:"help.UserInfo"},{id:-202219658,predicate:"messageActionContactSignUp",params:[],type:"MessageAction"},{id:-1398708869,predicate:"updateMessagePoll",params:[{name:"flags",type:"#"},{name:"poll_id",type:"long"},{name:"poll",type:"flags.0?Poll"},{name:"results",type:"PollResults"}],type:"Update"},{id:1823064809,predicate:"pollAnswer",params:[{name:"text",type:"string"},{name:"option",type:"bytes"}],type:"PollAnswer"},{id:-2032041631,predicate:"poll",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"closed",type:"flags.0?true"},{name:"public_voters",type:"flags.1?true"},{name:"multiple_choice",type:"flags.2?true"},{name:"quiz",type:"flags.3?true"},{name:"question",type:"string"},{name:"answers",type:"Vector"},{name:"close_period",type:"flags.4?int"},{name:"close_date",type:"flags.5?int"}],type:"Poll"},{id:997055186,predicate:"pollAnswerVoters",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"correct",type:"flags.1?true"},{name:"option",type:"bytes"},{name:"voters",type:"int"}],type:"PollAnswerVoters"},{id:-591909213,predicate:"pollResults",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"results",type:"flags.1?Vector"},{name:"total_voters",type:"flags.2?int"},{name:"recent_voters",type:"flags.3?Vector"},{name:"solution",type:"flags.4?string"},{name:"solution_entities",type:"flags.4?Vector"}],type:"PollResults"},{id:261416433,predicate:"inputMediaPoll",params:[{name:"flags",type:"#"},{name:"poll",type:"Poll"},{name:"correct_answers",type:"flags.0?Vector"},{name:"solution",type:"flags.1?string"},{name:"solution_entities",type:"flags.1?Vector"}],type:"InputMedia"},{id:1272375192,predicate:"messageMediaPoll",params:[{name:"poll",type:"Poll"},{name:"results",type:"PollResults"}],type:"MessageMedia"},{id:-264117680,predicate:"chatOnlines",params:[{name:"onlines",type:"int"}],type:"ChatOnlines"},{id:1202287072,predicate:"statsURL",params:[{name:"url",type:"string"}],type:"StatsURL"},{id:-525288402,predicate:"photoStrippedSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:1605510357,predicate:"chatAdminRights",params:[{name:"flags",type:"#"},{name:"change_info",type:"flags.0?true"},{name:"post_messages",type:"flags.1?true"},{name:"edit_messages",type:"flags.2?true"},{name:"delete_messages",type:"flags.3?true"},{name:"ban_users",type:"flags.4?true"},{name:"invite_users",type:"flags.5?true"},{name:"pin_messages",type:"flags.7?true"},{name:"add_admins",type:"flags.9?true"},{name:"anonymous",type:"flags.10?true"},{name:"manage_call",type:"flags.11?true"},{name:"other",type:"flags.12?true"},{name:"manage_topics",type:"flags.13?true"}],type:"ChatAdminRights"},{id:-1626209256,predicate:"chatBannedRights",params:[{name:"flags",type:"#"},{name:"view_messages",type:"flags.0?true"},{name:"send_messages",type:"flags.1?true"},{name:"send_media",type:"flags.2?true"},{name:"send_stickers",type:"flags.3?true"},{name:"send_gifs",type:"flags.4?true"},{name:"send_games",type:"flags.5?true"},{name:"send_inline",type:"flags.6?true"},{name:"embed_links",type:"flags.7?true"},{name:"send_polls",type:"flags.8?true"},{name:"change_info",type:"flags.10?true"},{name:"invite_users",type:"flags.15?true"},{name:"pin_messages",type:"flags.17?true"},{name:"manage_topics",type:"flags.18?true"},{name:"until_date",type:"int"}],type:"ChatBannedRights"},{id:1421875280,predicate:"updateChatDefaultBannedRights",params:[{name:"peer",type:"Peer"},{name:"default_banned_rights",type:"ChatBannedRights"},{name:"version",type:"int"}],type:"Update"},{id:-433014407,predicate:"inputWallPaper",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputWallPaper"},{id:1913199744,predicate:"inputWallPaperSlug",params:[{name:"slug",type:"string"}],type:"InputWallPaper"},{id:-1150621555,predicate:"channelParticipantsContacts",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:771095562,predicate:"channelAdminLogEventActionDefaultBannedRights",params:[{name:"prev_banned_rights",type:"ChatBannedRights"},{name:"new_banned_rights",type:"ChatBannedRights"}],type:"ChannelAdminLogEventAction"},{id:-1895328189,predicate:"channelAdminLogEventActionStopPoll",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:471437699,predicate:"account.wallPapersNotModified",params:[],type:"account.WallPapers"},{id:-842824308,predicate:"account.wallPapers",params:[{name:"hash",type:"long"},{name:"wallpapers",type:"Vector"}],type:"account.WallPapers"},{id:-1973130814,predicate:"codeSettings",params:[{name:"flags",type:"#"},{name:"allow_flashcall",type:"flags.0?true"},{name:"current_number",type:"flags.1?true"},{name:"allow_app_hash",type:"flags.4?true"},{name:"allow_missed_call",type:"flags.5?true"},{name:"logout_tokens",type:"flags.6?Vector"}],type:"CodeSettings"},{id:499236004,predicate:"wallPaperSettings",params:[{name:"flags",type:"#"},{name:"blur",type:"flags.1?true"},{name:"motion",type:"flags.2?true"},{name:"background_color",type:"flags.0?int"},{name:"second_background_color",type:"flags.4?int"},{name:"third_background_color",type:"flags.5?int"},{name:"fourth_background_color",type:"flags.6?int"},{name:"intensity",type:"flags.3?int"},{name:"rotation",type:"flags.4?int"}],type:"WallPaperSettings"},{id:-1896171181,predicate:"autoDownloadSettings",params:[{name:"flags",type:"#"},{name:"disabled",type:"flags.0?true"},{name:"video_preload_large",type:"flags.1?true"},{name:"audio_preload_next",type:"flags.2?true"},{name:"phonecalls_less_data",type:"flags.3?true"},{name:"photo_size_max",type:"int"},{name:"video_size_max",type:"long"},{name:"file_size_max",type:"long"},{name:"video_upload_maxbitrate",type:"int"}],type:"AutoDownloadSettings"},{id:1674235686,predicate:"account.autoDownloadSettings",params:[{name:"low",type:"AutoDownloadSettings"},{name:"medium",type:"AutoDownloadSettings"},{name:"high",type:"AutoDownloadSettings"}],type:"account.AutoDownloadSettings"},{id:-709641735,predicate:"emojiKeyword",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:594408994,predicate:"emojiKeywordDeleted",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:1556570557,predicate:"emojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"keywords",type:"Vector"}],type:"EmojiKeywordsDifference"},{id:-1519029347,predicate:"emojiURL",params:[{name:"url",type:"string"}],type:"EmojiURL"},{id:-1275374751,predicate:"emojiLanguage",params:[{name:"lang_code",type:"string"}],type:"EmojiLanguage"},{id:-1529000952,predicate:"inputPrivacyKeyForwards",params:[],type:"InputPrivacyKey"},{id:1777096355,predicate:"privacyKeyForwards",params:[],type:"PrivacyKey"},{id:1461304012,predicate:"inputPrivacyKeyProfilePhoto",params:[],type:"InputPrivacyKey"},{id:-1777000467,predicate:"privacyKeyProfilePhoto",params:[],type:"PrivacyKey"},{id:1075322878,predicate:"inputPhotoFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:-667654413,predicate:"inputPhotoLegacyFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"}],type:"InputFileLocation"},{id:925204121,predicate:"inputPeerPhotoFileLocation",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"photo_id",type:"long"}],type:"InputFileLocation"},{id:-1652231205,predicate:"inputStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb_version",type:"int"}],type:"InputFileLocation"},{id:-11252123,predicate:"folder",params:[{name:"flags",type:"#"},{name:"autofill_new_broadcasts",type:"flags.0?true"},{name:"autofill_public_groups",type:"flags.1?true"},{name:"autofill_new_correspondents",type:"flags.2?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"photo",type:"flags.3?ChatPhoto"}],type:"Folder"},{id:1908216652,predicate:"dialogFolder",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"folder",type:"Folder"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"unread_muted_peers_count",type:"int"},{name:"unread_unmuted_peers_count",type:"int"},{name:"unread_muted_messages_count",type:"int"},{name:"unread_unmuted_messages_count",type:"int"}],type:"Dialog"},{id:1684014375,predicate:"inputDialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"InputDialogPeer"},{id:1363483106,predicate:"dialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"DialogPeer"},{id:-70073706,predicate:"inputFolderPeer",params:[{name:"peer",type:"InputPeer"},{name:"folder_id",type:"int"}],type:"InputFolderPeer"},{id:-373643672,predicate:"folderPeer",params:[{name:"peer",type:"Peer"},{name:"folder_id",type:"int"}],type:"FolderPeer"},{id:422972864,predicate:"updateFolderPeers",params:[{name:"folder_peers",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:497305826,predicate:"inputUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputUser"},{id:1536380829,predicate:"inputChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputChannel"},{id:-1468331492,predicate:"inputPeerUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputPeer"},{id:-1121318848,predicate:"inputPeerChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputPeer"},{id:55761658,predicate:"inputPrivacyKeyPhoneNumber",params:[],type:"InputPrivacyKey"},{id:-778378131,predicate:"privacyKeyPhoneNumber",params:[],type:"PrivacyKey"},{id:-1472172887,predicate:"topPeerCategoryForwardUsers",params:[],type:"TopPeerCategory"},{id:-68239120,predicate:"topPeerCategoryForwardChats",params:[],type:"TopPeerCategory"},{id:84703944,predicate:"channelAdminLogEventActionChangeLinkedChat",params:[{name:"prev_value",type:"long"},{name:"new_value",type:"long"}],type:"ChannelAdminLogEventAction"},{id:-398136321,predicate:"messages.searchCounter",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"filter",type:"MessagesFilter"},{name:"count",type:"int"}],type:"messages.SearchCounter"},{id:280464681,predicate:"keyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.0?string"},{name:"url",type:"string"},{name:"button_id",type:"int"}],type:"KeyboardButton"},{id:-802258988,predicate:"inputKeyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.1?string"},{name:"url",type:"string"},{name:"bot",type:"InputUser"}],type:"KeyboardButton"},{id:-1831650802,predicate:"urlAuthResultRequest",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"bot",type:"User"},{name:"domain",type:"string"}],type:"UrlAuthResult"},{id:-1886646706,predicate:"urlAuthResultAccepted",params:[{name:"url",type:"string"}],type:"UrlAuthResult"},{id:-1445536993,predicate:"urlAuthResultDefault",params:[],type:"UrlAuthResult"},{id:-2079962673,predicate:"inputPrivacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:-380694650,predicate:"inputPrivacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:1796427406,predicate:"privacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:1103656293,predicate:"privacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:-1672577397,predicate:"messageEntityUnderline",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1090087980,predicate:"messageEntityStrike",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:34469328,predicate:"messageEntityBlockquote",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1786671974,predicate:"updatePeerSettings",params:[{name:"peer",type:"Peer"},{name:"settings",type:"PeerSettings"}],type:"Update"},{id:-1078612597,predicate:"channelLocationEmpty",params:[],type:"ChannelLocation"},{id:547062491,predicate:"channelLocation",params:[{name:"geo_point",type:"GeoPoint"},{name:"address",type:"string"}],type:"ChannelLocation"},{id:-901375139,predicate:"peerLocated",params:[{name:"peer",type:"Peer"},{name:"expires",type:"int"},{name:"distance",type:"int"}],type:"PeerLocated"},{id:-1263546448,predicate:"updatePeerLocated",params:[{name:"peers",type:"Vector"}],type:"Update"},{id:241923758,predicate:"channelAdminLogEventActionChangeLocation",params:[{name:"prev_value",type:"ChannelLocation"},{name:"new_value",type:"ChannelLocation"}],type:"ChannelAdminLogEventAction"},{id:-606798099,predicate:"inputReportReasonGeoIrrelevant",params:[],type:"ReportReason"},{id:1401984889,predicate:"channelAdminLogEventActionToggleSlowMode",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:1148485274,predicate:"auth.authorizationSignUpRequired",params:[{name:"flags",type:"#"},{name:"terms_of_service",type:"flags.0?help.TermsOfService"}],type:"auth.Authorization"},{id:-666824391,predicate:"payments.paymentVerificationNeeded",params:[{name:"url",type:"string"}],type:"payments.PaymentResult"},{id:42402760,predicate:"inputStickerSetAnimatedEmoji",params:[],type:"InputStickerSet"},{id:967122427,predicate:"updateNewScheduledMessage",params:[{name:"message",type:"Message"}],type:"Update"},{id:-1870238482,predicate:"updateDeleteScheduledMessages",params:[{name:"peer",type:"Peer"},{name:"messages",type:"Vector"}],type:"Update"},{id:-797791052,predicate:"restrictionReason",params:[{name:"platform",type:"string"},{name:"reason",type:"string"},{name:"text",type:"string"}],type:"RestrictionReason"},{id:1012306921,predicate:"inputTheme",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputTheme"},{id:-175567375,predicate:"inputThemeSlug",params:[{name:"slug",type:"string"}],type:"InputTheme"},{id:-1609668650,predicate:"theme",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"for_chat",type:"flags.5?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?Document"},{name:"settings",type:"flags.3?Vector"},{name:"emoticon",type:"flags.6?string"},{name:"installs_count",type:"flags.4?int"}],type:"Theme"},{id:-199313886,predicate:"account.themesNotModified",params:[],type:"account.Themes"},{id:-1707242387,predicate:"account.themes",params:[{name:"hash",type:"long"},{name:"themes",type:"Vector"}],type:"account.Themes"},{id:-2112423005,predicate:"updateTheme",params:[{name:"theme",type:"Theme"}],type:"Update"},{id:-786326563,predicate:"inputPrivacyKeyAddedByPhone",params:[],type:"InputPrivacyKey"},{id:1124062251,predicate:"privacyKeyAddedByPhone",params:[],type:"PrivacyKey"},{id:-2027964103,predicate:"updateGeoLiveViewed",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"}],type:"Update"},{id:1448076945,predicate:"updateLoginToken",params:[],type:"Update"},{id:1654593920,predicate:"auth.loginToken",params:[{name:"expires",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:110008598,predicate:"auth.loginTokenMigrateTo",params:[{name:"dc_id",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:957176926,predicate:"auth.loginTokenSuccess",params:[{name:"authorization",type:"auth.Authorization"}],type:"auth.LoginToken"},{id:1474462241,predicate:"account.contentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"},{name:"sensitive_can_change",type:"flags.1?true"}],type:"account.ContentSettings"},{id:-1456996667,predicate:"messages.inactiveChats",params:[{name:"dates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.InactiveChats"},{id:-1012849566,predicate:"baseThemeClassic",params:[],type:"BaseTheme"},{id:-69724536,predicate:"baseThemeDay",params:[],type:"BaseTheme"},{id:-1212997976,predicate:"baseThemeNight",params:[],type:"BaseTheme"},{id:1834973166,predicate:"baseThemeTinted",params:[],type:"BaseTheme"},{id:1527845466,predicate:"baseThemeArctic",params:[],type:"BaseTheme"},{id:-1770371538,predicate:"inputWallPaperNoFile",params:[{name:"id",type:"long"}],type:"InputWallPaper"},{id:-528465642,predicate:"wallPaperNoFile",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"default",type:"flags.1?true"},{name:"dark",type:"flags.4?true"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:-1881255857,predicate:"inputThemeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?InputWallPaper"},{name:"wallpaper_settings",type:"flags.1?WallPaperSettings"}],type:"InputThemeSettings"},{id:-94849324,predicate:"themeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?WallPaper"}],type:"ThemeSettings"},{id:1421174295,predicate:"webPageAttributeTheme",params:[{name:"flags",type:"#"},{name:"documents",type:"flags.0?Vector"},{name:"settings",type:"flags.1?ThemeSettings"}],type:"WebPageAttribute"},{id:274961865,predicate:"updateMessagePollVote",params:[{name:"poll_id",type:"long"},{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"qts",type:"int"}],type:"Update"},{id:886196148,predicate:"messageUserVote",params:[{name:"user_id",type:"long"},{name:"option",type:"bytes"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:1017491692,predicate:"messageUserVoteInputOption",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:-1973033641,predicate:"messageUserVoteMultiple",params:[{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:136574537,predicate:"messages.votesList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"votes",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.VotesList"},{id:-1144565411,predicate:"keyboardButtonRequestPoll",params:[{name:"flags",type:"#"},{name:"quiz",type:"flags.0?Bool"},{name:"text",type:"string"}],type:"KeyboardButton"},{id:1981704948,predicate:"messageEntityBankCard",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-177732982,predicate:"bankCardOpenUrl",params:[{name:"url",type:"string"},{name:"name",type:"string"}],type:"BankCardOpenUrl"},{id:1042605427,predicate:"payments.bankCardData",params:[{name:"title",type:"string"},{name:"open_urls",type:"Vector"}],type:"payments.BankCardData"},{id:-118740917,predicate:"peerSelfLocated",params:[{name:"expires",type:"int"}],type:"PeerLocated"},{id:1949890536,predicate:"dialogFilter",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"non_contacts",type:"flags.1?true"},{name:"groups",type:"flags.2?true"},{name:"broadcasts",type:"flags.3?true"},{name:"bots",type:"flags.4?true"},{name:"exclude_muted",type:"flags.11?true"},{name:"exclude_read",type:"flags.12?true"},{name:"exclude_archived",type:"flags.13?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"emoticon",type:"flags.25?string"},{name:"pinned_peers",type:"Vector"},{name:"include_peers",type:"Vector"},{name:"exclude_peers",type:"Vector"}],type:"DialogFilter"},{id:2004110666,predicate:"dialogFilterSuggested",params:[{name:"filter",type:"DialogFilter"},{name:"description",type:"string"}],type:"DialogFilterSuggested"},{id:654302845,predicate:"updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Update"},{id:-1512627963,predicate:"updateDialogFilterOrder",params:[{name:"order",type:"Vector"}],type:"Update"},{id:889491791,predicate:"updateDialogFilters",params:[],type:"Update"},{id:-1237848657,predicate:"statsDateRangeDays",params:[{name:"min_date",type:"int"},{name:"max_date",type:"int"}],type:"StatsDateRangeDays"},{id:-884757282,predicate:"statsAbsValueAndPrev",params:[{name:"current",type:"double"},{name:"previous",type:"double"}],type:"StatsAbsValueAndPrev"},{id:-875679776,predicate:"statsPercentValue",params:[{name:"part",type:"double"},{name:"total",type:"double"}],type:"StatsPercentValue"},{id:1244130093,predicate:"statsGraphAsync",params:[{name:"token",type:"string"}],type:"StatsGraph"},{id:-1092839390,predicate:"statsGraphError",params:[{name:"error",type:"string"}],type:"StatsGraph"},{id:-1901828938,predicate:"statsGraph",params:[{name:"flags",type:"#"},{name:"json",type:"DataJSON"},{name:"zoom_token",type:"flags.0?string"}],type:"StatsGraph"},{id:-1387279939,predicate:"messageInteractionCounters",params:[{name:"msg_id",type:"int"},{name:"views",type:"int"},{name:"forwards",type:"int"}],type:"MessageInteractionCounters"},{id:-1107852396,predicate:"stats.broadcastStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"followers",type:"StatsAbsValueAndPrev"},{name:"views_per_post",type:"StatsAbsValueAndPrev"},{name:"shares_per_post",type:"StatsAbsValueAndPrev"},{name:"enabled_notifications",type:"StatsPercentValue"},{name:"growth_graph",type:"StatsGraph"},{name:"followers_graph",type:"StatsGraph"},{name:"mute_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"interactions_graph",type:"StatsGraph"},{name:"iv_interactions_graph",type:"StatsGraph"},{name:"views_by_source_graph",type:"StatsGraph"},{name:"new_followers_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"recent_message_interactions",type:"Vector"}],type:"stats.BroadcastStats"},{id:-428884101,predicate:"inputMediaDice",params:[{name:"emoticon",type:"string"}],type:"InputMedia"},{id:1065280907,predicate:"messageMediaDice",params:[{name:"value",type:"int"},{name:"emoticon",type:"string"}],type:"MessageMedia"},{id:-427863538,predicate:"inputStickerSetDice",params:[{name:"emoticon",type:"string"}],type:"InputStickerSet"},{id:-1728664459,predicate:"help.promoDataEmpty",params:[{name:"expires",type:"int"}],type:"help.PromoData"},{id:-1942390465,predicate:"help.promoData",params:[{name:"flags",type:"#"},{name:"proxy",type:"flags.0?true"},{name:"expires",type:"int"},{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"psa_type",type:"flags.1?string"},{name:"psa_message",type:"flags.2?string"}],type:"help.PromoData"},{id:-567037804,predicate:"videoSize",params:[{name:"flags",type:"#"},{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"},{name:"video_start_ts",type:"flags.0?double"}],type:"VideoSize"},{id:643940105,predicate:"updatePhoneCallSignalingData",params:[{name:"phone_call_id",type:"long"},{name:"data",type:"bytes"}],type:"Update"},{id:1634294960,predicate:"chatInvitePeek",params:[{name:"chat",type:"Chat"},{name:"expires",type:"int"}],type:"ChatInvite"},{id:-1660637285,predicate:"statsGroupTopPoster",params:[{name:"user_id",type:"long"},{name:"messages",type:"int"},{name:"avg_chars",type:"int"}],type:"StatsGroupTopPoster"},{id:-682079097,predicate:"statsGroupTopAdmin",params:[{name:"user_id",type:"long"},{name:"deleted",type:"int"},{name:"kicked",type:"int"},{name:"banned",type:"int"}],type:"StatsGroupTopAdmin"},{id:1398765469,predicate:"statsGroupTopInviter",params:[{name:"user_id",type:"long"},{name:"invitations",type:"int"}],type:"StatsGroupTopInviter"},{id:-276825834,predicate:"stats.megagroupStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"members",type:"StatsAbsValueAndPrev"},{name:"messages",type:"StatsAbsValueAndPrev"},{name:"viewers",type:"StatsAbsValueAndPrev"},{name:"posters",type:"StatsAbsValueAndPrev"},{name:"growth_graph",type:"StatsGraph"},{name:"members_graph",type:"StatsGraph"},{name:"new_members_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"messages_graph",type:"StatsGraph"},{name:"actions_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"weekdays_graph",type:"StatsGraph"},{name:"top_posters",type:"Vector"},{name:"top_admins",type:"Vector"},{name:"top_inviters",type:"Vector"},{name:"users",type:"Vector"}],type:"stats.MegagroupStats"},{id:-1096616924,predicate:"globalPrivacySettings",params:[{name:"flags",type:"#"},{name:"archive_and_mute_new_noncontact_peers",type:"flags.0?Bool"}],type:"GlobalPrivacySettings"},{id:1667228533,predicate:"phoneConnectionWebrtc",params:[{name:"flags",type:"#"},{name:"turn",type:"flags.0?true"},{name:"stun",type:"flags.1?true"},{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"username",type:"string"},{name:"password",type:"string"}],type:"PhoneConnection"},{id:1107543535,predicate:"help.countryCode",params:[{name:"flags",type:"#"},{name:"country_code",type:"string"},{name:"prefixes",type:"flags.0?Vector"},{name:"patterns",type:"flags.1?Vector"}],type:"help.CountryCode"},{id:-1014526429,predicate:"help.country",params:[{name:"flags",type:"#"},{name:"hidden",type:"flags.0?true"},{name:"iso2",type:"string"},{name:"default_name",type:"string"},{name:"name",type:"flags.1?string"},{name:"country_codes",type:"Vector"}],type:"help.Country"},{id:-1815339214,predicate:"help.countriesListNotModified",params:[],type:"help.CountriesList"},{id:-2016381538,predicate:"help.countriesList",params:[{name:"countries",type:"Vector"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:1163625789,predicate:"messageViews",params:[{name:"flags",type:"#"},{name:"views",type:"flags.0?int"},{name:"forwards",type:"flags.1?int"},{name:"replies",type:"flags.2?MessageReplies"}],type:"MessageViews"},{id:-761649164,predicate:"updateChannelMessageForwards",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"forwards",type:"int"}],type:"Update"},{id:-96535659,predicate:"photoSizeProgressive",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"sizes",type:"Vector"}],type:"PhotoSize"},{id:-1228606141,predicate:"messages.messageViews",params:[{name:"views",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.MessageViews"},{id:-693004986,predicate:"updateReadChannelDiscussionInbox",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"},{name:"broadcast_id",type:"flags.0?long"},{name:"broadcast_post",type:"flags.0?int"}],type:"Update"},{id:1767677564,predicate:"updateReadChannelDiscussionOutbox",params:[{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Update"},{id:-1506535550,predicate:"messages.discussionMessage",params:[{name:"flags",type:"#"},{name:"messages",type:"Vector"},{name:"max_id",type:"flags.0?int"},{name:"read_inbox_max_id",type:"flags.1?int"},{name:"read_outbox_max_id",type:"flags.2?int"},{name:"unread_count",type:"int"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.DiscussionMessage"},{id:-1495959709,predicate:"messageReplyHeader",params:[{name:"flags",type:"#"},{name:"reply_to_scheduled",type:"flags.2?true"},{name:"forum_topic",type:"flags.3?true"},{name:"reply_to_msg_id",type:"int"},{name:"reply_to_peer_id",type:"flags.0?Peer"},{name:"reply_to_top_id",type:"flags.1?int"}],type:"MessageReplyHeader"},{id:-2083123262,predicate:"messageReplies",params:[{name:"flags",type:"#"},{name:"comments",type:"flags.0?true"},{name:"replies",type:"int"},{name:"replies_pts",type:"int"},{name:"recent_repliers",type:"flags.1?Vector"},{name:"channel_id",type:"flags.0?long"},{name:"max_id",type:"flags.2?int"},{name:"read_max_id",type:"flags.3?int"}],type:"MessageReplies"},{id:610945826,predicate:"updatePeerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"blocked",type:"Bool"}],type:"Update"},{id:-386039788,predicate:"peerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"date",type:"int"}],type:"PeerBlocked"},{id:-1937192669,predicate:"updateChannelUserTyping",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"flags.0?int"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-1392895362,predicate:"inputMessageCallbackQuery",params:[{name:"id",type:"int"},{name:"query_id",type:"long"}],type:"InputMessage"},{id:453242886,predicate:"channelParticipantLeft",params:[{name:"peer",type:"Peer"}],type:"ChannelParticipant"},{id:-531931925,predicate:"channelParticipantsMentions",params:[{name:"flags",type:"#"},{name:"q",type:"flags.0?string"},{name:"top_msg_id",type:"flags.1?int"}],type:"ChannelParticipantsFilter"},{id:-309990731,predicate:"updatePinnedMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1538885128,predicate:"updatePinnedChannelMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:464520273,predicate:"inputMessagesFilterPinned",params:[],type:"MessagesFilter"},{id:-1986399595,predicate:"stats.messageStats",params:[{name:"views_graph",type:"StatsGraph"}],type:"stats.MessageStats"},{id:-1730095465,predicate:"messageActionGeoProximityReached",params:[{name:"from_id",type:"Peer"},{name:"to_id",type:"Peer"},{name:"distance",type:"int"}],type:"MessageAction"},{id:-668906175,predicate:"photoPathSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:-651419003,predicate:"speakingInGroupCallAction",params:[],type:"SendMessageAction"},{id:2004925620,predicate:"groupCallDiscarded",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"duration",type:"int"}],type:"GroupCall"},{id:-711498484,predicate:"groupCall",params:[{name:"flags",type:"#"},{name:"join_muted",type:"flags.1?true"},{name:"can_change_join_muted",type:"flags.2?true"},{name:"join_date_asc",type:"flags.6?true"},{name:"schedule_start_subscribed",type:"flags.8?true"},{name:"can_start_video",type:"flags.9?true"},{name:"record_video_active",type:"flags.11?true"},{name:"rtmp_stream",type:"flags.12?true"},{name:"listeners_hidden",type:"flags.13?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"participants_count",type:"int"},{name:"title",type:"flags.3?string"},{name:"stream_dc_id",type:"flags.4?int"},{name:"record_start_date",type:"flags.5?int"},{name:"schedule_date",type:"flags.7?int"},{name:"unmuted_video_count",type:"flags.10?int"},{name:"unmuted_video_limit",type:"int"},{name:"version",type:"int"}],type:"GroupCall"},{id:-659913713,predicate:"inputGroupCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGroupCall"},{id:2047704898,predicate:"messageActionGroupCall",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"duration",type:"flags.0?int"}],type:"MessageAction"},{id:1345295095,predicate:"messageActionInviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-341428482,predicate:"groupCallParticipant",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"left",type:"flags.1?true"},{name:"can_self_unmute",type:"flags.2?true"},{name:"just_joined",type:"flags.4?true"},{name:"versioned",type:"flags.5?true"},{name:"min",type:"flags.8?true"},{name:"muted_by_you",type:"flags.9?true"},{name:"volume_by_admin",type:"flags.10?true"},{name:"self",type:"flags.12?true"},{name:"video_joined",type:"flags.15?true"},{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"active_date",type:"flags.3?int"},{name:"source",type:"int"},{name:"volume",type:"flags.7?int"},{name:"about",type:"flags.11?string"},{name:"raise_hand_rating",type:"flags.13?long"},{name:"video",type:"flags.6?GroupCallParticipantVideo"},{name:"presentation",type:"flags.14?GroupCallParticipantVideo"}],type:"GroupCallParticipant"},{id:-124097970,predicate:"updateChat",params:[{name:"chat_id",type:"long"}],type:"Update"},{id:-219423922,predicate:"updateGroupCallParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"Update"},{id:347227392,predicate:"updateGroupCall",params:[{name:"chat_id",type:"long"},{name:"call",type:"GroupCall"}],type:"Update"},{id:-1636664659,predicate:"phone.groupCall",params:[{name:"call",type:"GroupCall"},{name:"participants",type:"Vector"},{name:"participants_next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.GroupCall"},{id:-193506890,predicate:"phone.groupParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"version",type:"int"}],type:"phone.GroupParticipants"},{id:813821341,predicate:"inlineQueryPeerTypeSameBotPM",params:[],type:"InlineQueryPeerType"},{id:-2093215828,predicate:"inlineQueryPeerTypePM",params:[],type:"InlineQueryPeerType"},{id:-681130742,predicate:"inlineQueryPeerTypeChat",params:[],type:"InlineQueryPeerType"},{id:1589952067,predicate:"inlineQueryPeerTypeMegagroup",params:[],type:"InlineQueryPeerType"},{id:1664413338,predicate:"inlineQueryPeerTypeBroadcast",params:[],type:"InlineQueryPeerType"},{id:589338437,predicate:"channelAdminLogEventActionStartGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-610299584,predicate:"channelAdminLogEventActionDiscardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-115071790,predicate:"channelAdminLogEventActionParticipantMute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:-431740480,predicate:"channelAdminLogEventActionParticipantUnmute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1456906823,predicate:"channelAdminLogEventActionToggleGroupCallSetting",params:[{name:"join_muted",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-1966921727,predicate:"inputPaymentCredentialsGooglePay",params:[{name:"payment_token",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:375566091,predicate:"messages.historyImport",params:[{name:"id",type:"long"}],type:"messages.HistoryImport"},{id:-606432698,predicate:"sendMessageHistoryImportAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:1578088377,predicate:"messages.historyImportParsed",params:[{name:"flags",type:"#"},{name:"pm",type:"flags.0?true"},{name:"group",type:"flags.1?true"},{name:"title",type:"flags.2?string"}],type:"messages.HistoryImportParsed"},{id:-170010905,predicate:"inputReportReasonFake",params:[],type:"ReportReason"},{id:-275956116,predicate:"messages.affectedFoundMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"},{name:"messages",type:"Vector"}],type:"messages.AffectedFoundMessages"},{id:1007897979,predicate:"messageActionSetMessagesTTL",params:[{name:"flags",type:"#"},{name:"period",type:"int"},{name:"auto_setting_from",type:"flags.0?long"}],type:"MessageAction"},{id:-1147422299,predicate:"updatePeerHistoryTTL",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"ttl_period",type:"flags.0?int"}],type:"Update"},{id:-796432838,predicate:"updateChatParticipant",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChatParticipant"},{name:"new_participant",type:"flags.1?ChatParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-1738720581,predicate:"updateChannelParticipant",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChannelParticipant"},{name:"new_participant",type:"flags.1?ChannelParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-997782967,predicate:"updateBotStopped",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"stopped",type:"Bool"},{name:"qts",type:"int"}],type:"Update"},{id:-1940201511,predicate:"chatInviteImporter",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"about",type:"flags.2?string"},{name:"approved_by",type:"flags.1?long"}],type:"ChatInviteImporter"},{id:-1111085620,predicate:"messages.exportedChatInvites",params:[{name:"count",type:"int"},{name:"invites",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvites"},{id:410107472,predicate:"messages.exportedChatInvite",params:[{name:"invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:572915951,predicate:"messages.exportedChatInviteReplaced",params:[{name:"invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:-2118733814,predicate:"messages.chatInviteImporters",params:[{name:"count",type:"int"},{name:"importers",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatInviteImporters"},{id:-219353309,predicate:"chatAdminWithInvites",params:[{name:"admin_id",type:"long"},{name:"invites_count",type:"int"},{name:"revoked_invites_count",type:"int"}],type:"ChatAdminWithInvites"},{id:-1231326505,predicate:"messages.chatAdminsWithInvites",params:[{name:"admins",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatAdminsWithInvites"},{id:1557846647,predicate:"channelAdminLogEventActionParticipantJoinByInvite",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1515256996,predicate:"channelAdminLogEventActionExportedInviteDelete",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1091179342,predicate:"channelAdminLogEventActionExportedInviteRevoke",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:-384910503,predicate:"channelAdminLogEventActionExportedInviteEdit",params:[{name:"prev_invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1048537159,predicate:"channelAdminLogEventActionParticipantVolume",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1855199800,predicate:"channelAdminLogEventActionChangeHistoryTTL",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:-1571952873,predicate:"messages.checkedHistoryImportPeer",params:[{name:"confirm_text",type:"string"}],type:"messages.CheckedHistoryImportPeer"},{id:93890858,predicate:"inputGroupCallStream",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"time_ms",type:"long"},{name:"scale",type:"int"},{name:"video_channel",type:"flags.0?int"},{name:"video_quality",type:"flags.0?int"}],type:"InputFileLocation"},{id:-1343921601,predicate:"phone.joinAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.JoinAsPeers"},{id:541839704,predicate:"phone.exportedGroupCallInvite",params:[{name:"link",type:"string"}],type:"phone.ExportedGroupCallInvite"},{id:-672693723,predicate:"inputBotInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:894081801,predicate:"botInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1281329567,predicate:"messageActionGroupCallScheduled",params:[{name:"call",type:"InputGroupCall"},{name:"schedule_date",type:"int"}],type:"MessageAction"},{id:-592373577,predicate:"groupCallParticipantVideoSourceGroup",params:[{name:"semantics",type:"string"},{name:"sources",type:"Vector"}],type:"GroupCallParticipantVideoSourceGroup"},{id:1735736008,predicate:"groupCallParticipantVideo",params:[{name:"flags",type:"#"},{name:"paused",type:"flags.0?true"},{name:"endpoint",type:"string"},{name:"source_groups",type:"Vector"},{name:"audio_source",type:"flags.1?int"}],type:"GroupCallParticipantVideo"},{id:192428418,predicate:"updateGroupCallConnection",params:[{name:"flags",type:"#"},{name:"presentation",type:"flags.0?true"},{name:"params",type:"DataJSON"}],type:"Update"},{id:-2046910401,predicate:"stickers.suggestedShortName",params:[{name:"short_name",type:"string"}],type:"stickers.SuggestedShortName"},{id:795652779,predicate:"botCommandScopeDefault",params:[],type:"BotCommandScope"},{id:1011811544,predicate:"botCommandScopeUsers",params:[],type:"BotCommandScope"},{id:1877059713,predicate:"botCommandScopeChats",params:[],type:"BotCommandScope"},{id:-1180016534,predicate:"botCommandScopeChatAdmins",params:[],type:"BotCommandScope"},{id:-610432643,predicate:"botCommandScopePeer",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:1071145937,predicate:"botCommandScopePeerAdmins",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:169026035,predicate:"botCommandScopePeerUser",params:[{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"BotCommandScope"},{id:-478701471,predicate:"account.resetPasswordFailedWait",params:[{name:"retry_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-370148227,predicate:"account.resetPasswordRequestedWait",params:[{name:"until_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-383330754,predicate:"account.resetPasswordOk",params:[],type:"account.ResetPasswordResult"},{id:1299263278,predicate:"updateBotCommands",params:[{name:"peer",type:"Peer"},{name:"bot_id",type:"long"},{name:"commands",type:"Vector"}],type:"Update"},{id:-1434950843,predicate:"messageActionSetChatTheme",params:[{name:"emoticon",type:"string"}],type:"MessageAction"},{id:-1336228175,predicate:"sendMessageChooseStickerAction",params:[],type:"SendMessageAction"},{id:981691896,predicate:"sponsoredMessage",params:[{name:"flags",type:"#"},{name:"recommended",type:"flags.5?true"},{name:"show_peer_photo",type:"flags.6?true"},{name:"random_id",type:"bytes"},{name:"from_id",type:"flags.3?Peer"},{name:"chat_invite",type:"flags.4?ChatInvite"},{name:"chat_invite_hash",type:"flags.4?string"},{name:"channel_post",type:"flags.2?int"},{name:"start_param",type:"flags.0?string"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"SponsoredMessage"},{id:-907141753,predicate:"messages.sponsoredMessages",params:[{name:"flags",type:"#"},{name:"posts_between",type:"flags.0?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SponsoredMessages"},{id:215889721,predicate:"inputStickerSetAnimatedEmojiAnimations",params:[],type:"InputStickerSet"},{id:630664139,predicate:"sendMessageEmojiInteraction",params:[{name:"emoticon",type:"string"},{name:"msg_id",type:"int"},{name:"interaction",type:"DataJSON"}],type:"SendMessageAction"},{id:-1234857938,predicate:"sendMessageEmojiInteractionSeen",params:[{name:"emoticon",type:"string"}],type:"SendMessageAction"},{id:-1227287081,predicate:"inputBotInlineMessageID64",params:[{name:"dc_id",type:"int"},{name:"owner_id",type:"long"},{name:"id",type:"int"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:-911191137,predicate:"searchResultsCalendarPeriod",params:[{name:"date",type:"int"},{name:"min_msg_id",type:"int"},{name:"max_msg_id",type:"int"},{name:"count",type:"int"}],type:"SearchResultsCalendarPeriod"},{id:343859772,predicate:"messages.searchResultsCalendar",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.0?true"},{name:"count",type:"int"},{name:"min_date",type:"int"},{name:"min_msg_id",type:"int"},{name:"offset_id_offset",type:"flags.1?int"},{name:"periods",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SearchResultsCalendar"},{id:2137295719,predicate:"searchResultPosition",params:[{name:"msg_id",type:"int"},{name:"date",type:"int"},{name:"offset",type:"int"}],type:"SearchResultsPosition"},{id:1404185519,predicate:"messages.searchResultsPositions",params:[{name:"count",type:"int"},{name:"positions",type:"Vector"}],type:"messages.SearchResultsPositions"},{id:-339958837,predicate:"messageActionChatJoinedByRequest",params:[],type:"MessageAction"},{id:1885586395,predicate:"updatePendingJoinRequests",params:[{name:"peer",type:"Peer"},{name:"requests_pending",type:"int"},{name:"recent_requesters",type:"Vector"}],type:"Update"},{id:299870598,predicate:"updateBotChatInviteRequester",params:[{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"about",type:"string"},{name:"invite",type:"ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-1347021750,predicate:"channelAdminLogEventActionParticipantJoinByRequest",params:[{name:"invite",type:"ExportedChatInvite"},{name:"approved_by",type:"long"}],type:"ChannelAdminLogEventAction"},{id:-376962181,predicate:"inputKeyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"InputUser"}],type:"KeyboardButton"},{id:814112961,predicate:"keyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"long"}],type:"KeyboardButton"},{id:-191450938,predicate:"channels.sendAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.SendAsPeers"},{id:-886388890,predicate:"channelAdminLogEventActionToggleNoForwards",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-738646805,predicate:"messages.stickerSetNotModified",params:[],type:"messages.StickerSet"},{id:997004590,predicate:"users.userFull",params:[{name:"full_user",type:"UserFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"users.UserFull"},{id:1753266509,predicate:"messages.peerSettings",params:[{name:"settings",type:"PeerSettings"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.PeerSettings"},{id:663693416,predicate:"channelAdminLogEventActionSendMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:-702884114,predicate:"auth.codeTypeMissedCall",params:[],type:"auth.CodeType"},{id:-2113903484,predicate:"auth.sentCodeTypeMissedCall",params:[{name:"prefix",type:"string"},{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1012759713,predicate:"auth.loggedOut",params:[{name:"flags",type:"#"},{name:"future_auth_token",type:"flags.0?bytes"}],type:"auth.LoggedOut"},{id:1578843320,predicate:"updateMessageReactions",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"top_msg_id",type:"flags.0?int"},{name:"reactions",type:"MessageReactions"}],type:"Update"},{id:-1546531968,predicate:"reactionCount",params:[{name:"flags",type:"#"},{name:"chosen_order",type:"flags.0?int"},{name:"reaction",type:"Reaction"},{name:"count",type:"int"}],type:"ReactionCount"},{id:1328256121,predicate:"messageReactions",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"can_see_list",type:"flags.2?true"},{name:"results",type:"Vector"},{name:"recent_reactions",type:"flags.1?Vector"}],type:"MessageReactions"},{id:834488621,predicate:"messages.messageReactionsList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"reactions",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.MessageReactionsList"},{id:-1065882623,predicate:"availableReaction",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"premium",type:"flags.2?true"},{name:"reaction",type:"string"},{name:"title",type:"string"},{name:"static_icon",type:"Document"},{name:"appear_animation",type:"Document"},{name:"select_animation",type:"Document"},{name:"activate_animation",type:"Document"},{name:"effect_animation",type:"Document"},{name:"around_animation",type:"flags.1?Document"},{name:"center_icon",type:"flags.1?Document"}],type:"AvailableReaction"},{id:-1626924713,predicate:"messages.availableReactionsNotModified",params:[],type:"messages.AvailableReactions"},{id:1989032621,predicate:"messages.availableReactions",params:[{name:"hash",type:"int"},{name:"reactions",type:"Vector"}],type:"messages.AvailableReactions"},{id:852137487,predicate:"messageEntitySpoiler",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1102180616,predicate:"channelAdminLogEventActionChangeAvailableReactions",params:[{name:"prev_value",type:"ChatReactions"},{name:"new_value",type:"ChatReactions"}],type:"ChannelAdminLogEventAction"},{id:1741309751,predicate:"messages.translateNoResult",params:[],type:"messages.TranslatedText"},{id:-1575684144,predicate:"messages.translateResultText",params:[{name:"text",type:"string"}],type:"messages.TranslatedText"},{id:-1319698788,predicate:"messagePeerReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"unread",type:"flags.1?true"},{name:"peer_id",type:"Peer"},{name:"reaction",type:"Reaction"}],type:"MessagePeerReaction"},{id:-2132064081,predicate:"groupCallStreamChannel",params:[{name:"channel",type:"int"},{name:"scale",type:"int"},{name:"last_timestamp_ms",type:"long"}],type:"GroupCallStreamChannel"},{id:-790330702,predicate:"phone.groupCallStreamChannels",params:[{name:"channels",type:"Vector"}],type:"phone.GroupCallStreamChannels"},{id:177124030,predicate:"inputReportReasonIllegalDrugs",params:[],type:"ReportReason"},{id:-1631091139,predicate:"inputReportReasonPersonalDetails",params:[],type:"ReportReason"},{id:767505458,predicate:"phone.groupCallStreamRtmpUrl",params:[{name:"url",type:"string"},{name:"key",type:"string"}],type:"phone.GroupCallStreamRtmpUrl"},{id:1165423600,predicate:"attachMenuBotIconColor",params:[{name:"name",type:"string"},{name:"color",type:"int"}],type:"AttachMenuBotIconColor"},{id:-1297663893,predicate:"attachMenuBotIcon",params:[{name:"flags",type:"#"},{name:"name",type:"string"},{name:"icon",type:"Document"},{name:"colors",type:"flags.0?Vector"}],type:"AttachMenuBotIcon"},{id:-928371502,predicate:"attachMenuBot",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"has_settings",type:"flags.1?true"},{name:"request_write_access",type:"flags.2?true"},{name:"bot_id",type:"long"},{name:"short_name",type:"string"},{name:"peer_types",type:"Vector"},{name:"icons",type:"Vector"}],type:"AttachMenuBot"},{id:-237467044,predicate:"attachMenuBotsNotModified",params:[],type:"AttachMenuBots"},{id:1011024320,predicate:"attachMenuBots",params:[{name:"hash",type:"long"},{name:"bots",type:"Vector"},{name:"users",type:"Vector"}],type:"AttachMenuBots"},{id:-1816172929,predicate:"attachMenuBotsBot",params:[{name:"bot",type:"AttachMenuBot"},{name:"users",type:"Vector"}],type:"AttachMenuBotsBot"},{id:397910539,predicate:"updateAttachMenuBots",params:[],type:"Update"},{id:202659196,predicate:"webViewResultUrl",params:[{name:"query_id",type:"long"},{name:"url",type:"string"}],type:"WebViewResult"},{id:-2010155333,predicate:"simpleWebViewResultUrl",params:[{name:"url",type:"string"}],type:"SimpleWebViewResult"},{id:211046684,predicate:"webViewMessageSent",params:[{name:"flags",type:"#"},{name:"msg_id",type:"flags.0?InputBotInlineMessageID"}],type:"WebViewMessageSent"},{id:361936797,predicate:"updateWebViewResultSent",params:[{name:"query_id",type:"long"}],type:"Update"},{id:326529584,predicate:"keyboardButtonWebView",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:-1598009252,predicate:"keyboardButtonSimpleWebView",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:1205698681,predicate:"messageActionWebViewDataSentMe",params:[{name:"text",type:"string"},{name:"data",type:"string"}],type:"MessageAction"},{id:-1262252875,predicate:"messageActionWebViewDataSent",params:[{name:"text",type:"string"}],type:"MessageAction"},{id:347625491,predicate:"updateBotMenuButton",params:[{name:"bot_id",type:"long"},{name:"button",type:"BotMenuButton"}],type:"Update"},{id:1966318984,predicate:"botMenuButtonDefault",params:[],type:"BotMenuButton"},{id:1113113093,predicate:"botMenuButtonCommands",params:[],type:"BotMenuButton"},{id:-944407322,predicate:"botMenuButton",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"BotMenuButton"},{id:-67704655,predicate:"account.savedRingtonesNotModified",params:[],type:"account.SavedRingtones"},{id:-1041683259,predicate:"account.savedRingtones",params:[{name:"hash",type:"long"},{name:"ringtones",type:"Vector"}],type:"account.SavedRingtones"},{id:1960361625,predicate:"updateSavedRingtones",params:[],type:"Update"},{id:-1746354498,predicate:"notificationSoundDefault",params:[],type:"NotificationSound"},{id:1863070943,predicate:"notificationSoundNone",params:[],type:"NotificationSound"},{id:-2096391452,predicate:"notificationSoundLocal",params:[{name:"title",type:"string"},{name:"data",type:"string"}],type:"NotificationSound"},{id:-9666487,predicate:"notificationSoundRingtone",params:[{name:"id",type:"long"}],type:"NotificationSound"},{id:-1222230163,predicate:"account.savedRingtone",params:[],type:"account.SavedRingtone"},{id:523271863,predicate:"account.savedRingtoneConverted",params:[{name:"document",type:"Document"}],type:"account.SavedRingtone"},{id:2104224014,predicate:"attachMenuPeerTypeSameBotPM",params:[],type:"AttachMenuPeerType"},{id:-1020528102,predicate:"attachMenuPeerTypeBotPM",params:[],type:"AttachMenuPeerType"},{id:-247016673,predicate:"attachMenuPeerTypePM",params:[],type:"AttachMenuPeerType"},{id:84480319,predicate:"attachMenuPeerTypeChat",params:[],type:"AttachMenuPeerType"},{id:2080104188,predicate:"attachMenuPeerTypeBroadcast",params:[],type:"AttachMenuPeerType"},{id:-317687113,predicate:"chatInvitePublicJoinRequests",params:[],type:"ExportedChatInvite"},{id:-977967015,predicate:"inputInvoiceMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"InputInvoice"},{id:-1020867857,predicate:"inputInvoiceSlug",params:[{name:"slug",type:"string"}],type:"InputInvoice"},{id:-1362048039,predicate:"payments.exportedInvoice",params:[{name:"url",type:"string"}],type:"payments.ExportedInvoice"},{id:8703322,predicate:"updateTranscribedAudio",params:[{name:"flags",type:"#"},{name:"pending",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"transcription_id",type:"long"},{name:"text",type:"string"}],type:"Update"},{id:-1821037486,predicate:"messages.transcribedAudio",params:[{name:"flags",type:"#"},{name:"pending",type:"flags.0?true"},{name:"transcription_id",type:"long"},{name:"text",type:"string"}],type:"messages.TranscribedAudio"},{id:909284270,predicate:"dialogFilterDefault",params:[],type:"DialogFilter"},{id:1395946908,predicate:"help.premiumPromo",params:[{name:"status_text",type:"string"},{name:"status_entities",type:"Vector"},{name:"video_sections",type:"Vector"},{name:"videos",type:"Vector"},{name:"period_options",type:"Vector"},{name:"users",type:"Vector"}],type:"help.PremiumPromo"},{id:-925956616,predicate:"messageEntityCustomEmoji",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"document_id",type:"long"}],type:"MessageEntity"},{id:-48981863,predicate:"documentAttributeCustomEmoji",params:[{name:"flags",type:"#"},{name:"free",type:"flags.0?true"},{name:"text_color",type:"flags.1?true"},{name:"alt",type:"string"},{name:"stickerset",type:"InputStickerSet"}],type:"DocumentAttribute"},{id:1087454222,predicate:"stickerSetFullCovered",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"keywords",type:"Vector"},{name:"documents",type:"Vector"}],type:"StickerSetCovered"},{id:-1502273946,predicate:"inputStorePaymentPremiumSubscription",params:[{name:"flags",type:"#"},{name:"restore",type:"flags.0?true"}],type:"InputStorePaymentPurpose"},{id:1634697192,predicate:"inputStorePaymentGiftPremium",params:[{name:"user_id",type:"InputUser"},{name:"currency",type:"string"},{name:"amount",type:"long"}],type:"InputStorePaymentPurpose"},{id:-1415514682,predicate:"messageActionGiftPremium",params:[{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"months",type:"int"}],type:"MessageAction"},{id:1958953753,predicate:"premiumGiftOption",params:[{name:"flags",type:"#"},{name:"months",type:"int"},{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"bot_url",type:"string"},{name:"store_product",type:"flags.0?string"}],type:"PremiumGiftOption"},{id:-930399486,predicate:"inputStickerSetPremiumGifts",params:[],type:"InputStickerSet"},{id:-78886548,predicate:"updateReadFeaturedEmojiStickers",params:[],type:"Update"},{id:-1360618136,predicate:"inputPrivacyKeyVoiceMessages",params:[],type:"InputPrivacyKey"},{id:110621716,predicate:"privacyKeyVoiceMessages",params:[],type:"PrivacyKey"},{id:-1996951013,predicate:"paymentFormMethod",params:[{name:"url",type:"string"},{name:"title",type:"string"}],type:"PaymentFormMethod"},{id:-193992412,predicate:"inputWebFileAudioAlbumThumbLocation",params:[{name:"flags",type:"#"},{name:"small",type:"flags.2?true"},{name:"document",type:"flags.0?InputDocument"},{name:"title",type:"flags.1?string"},{name:"performer",type:"flags.1?string"}],type:"InputWebFileLocation"},{id:769727150,predicate:"emojiStatusEmpty",params:[],type:"EmojiStatus"},{id:-1835310691,predicate:"emojiStatus",params:[{name:"document_id",type:"long"}],type:"EmojiStatus"},{id:-97474361,predicate:"emojiStatusUntil",params:[{name:"document_id",type:"long"},{name:"until",type:"int"}],type:"EmojiStatus"},{id:674706841,predicate:"updateUserEmojiStatus",params:[{name:"user_id",type:"long"},{name:"emoji_status",type:"EmojiStatus"}],type:"Update"},{id:821314523,predicate:"updateRecentEmojiStatuses",params:[],type:"Update"},{id:-796072379,predicate:"account.emojiStatusesNotModified",params:[],type:"account.EmojiStatuses"},{id:-1866176559,predicate:"account.emojiStatuses",params:[{name:"hash",type:"long"},{name:"statuses",type:"Vector"}],type:"account.EmojiStatuses"},{id:2046153753,predicate:"reactionEmpty",params:[],type:"Reaction"},{id:455247544,predicate:"reactionEmoji",params:[{name:"emoticon",type:"string"}],type:"Reaction"},{id:-1992950669,predicate:"reactionCustomEmoji",params:[{name:"document_id",type:"long"}],type:"Reaction"},{id:-352570692,predicate:"chatReactionsNone",params:[],type:"ChatReactions"},{id:1385335754,predicate:"chatReactionsAll",params:[{name:"flags",type:"#"},{name:"allow_custom",type:"flags.0?true"}],type:"ChatReactions"},{id:1713193015,predicate:"chatReactionsSome",params:[{name:"reactions",type:"Vector"}],type:"ChatReactions"},{id:-1334846497,predicate:"messages.reactionsNotModified",params:[],type:"messages.Reactions"},{id:-352454890,predicate:"messages.reactions",params:[{name:"hash",type:"long"},{name:"reactions",type:"Vector"}],type:"messages.Reactions"},{id:1870160884,predicate:"updateRecentReactions",params:[],type:"Update"},{id:-2030252155,predicate:"updateMoveStickerSetToTop",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"},{name:"stickerset",type:"long"}],type:"Update"},{id:1511364673,predicate:"auth.sentCodeTypeEmailCode",params:[{name:"flags",type:"#"},{name:"apple_signin_allowed",type:"flags.0?true"},{name:"google_signin_allowed",type:"flags.1?true"},{name:"email_pattern",type:"string"},{name:"length",type:"int"},{name:"next_phone_login_date",type:"flags.2?int"}],type:"auth.SentCodeType"},{id:-1521934870,predicate:"auth.sentCodeTypeSetUpEmailRequired",params:[{name:"flags",type:"#"},{name:"apple_signin_allowed",type:"flags.0?true"},{name:"google_signin_allowed",type:"flags.1?true"}],type:"auth.SentCodeType"},{id:1128644211,predicate:"emailVerifyPurposeLoginSetup",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"EmailVerifyPurpose"},{id:1383932651,predicate:"emailVerifyPurposeLoginChange",params:[],type:"EmailVerifyPurpose"},{id:-1141565819,predicate:"emailVerifyPurposePassport",params:[],type:"EmailVerifyPurpose"},{id:-1842457175,predicate:"emailVerificationCode",params:[{name:"code",type:"string"}],type:"EmailVerification"},{id:-611279166,predicate:"emailVerificationGoogle",params:[{name:"token",type:"string"}],type:"EmailVerification"},{id:-1764723459,predicate:"emailVerificationApple",params:[{name:"token",type:"string"}],type:"EmailVerification"},{id:731303195,predicate:"account.emailVerified",params:[{name:"email",type:"string"}],type:"account.EmailVerified"},{id:-507835039,predicate:"account.emailVerifiedLogin",params:[{name:"email",type:"string"},{name:"sent_code",type:"auth.SentCode"}],type:"account.EmailVerified"},{id:-1225711938,predicate:"premiumSubscriptionOption",params:[{name:"flags",type:"#"},{name:"current",type:"flags.1?true"},{name:"can_purchase_upgrade",type:"flags.2?true"},{name:"months",type:"int"},{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"bot_url",type:"string"},{name:"store_product",type:"flags.0?string"}],type:"PremiumSubscriptionOption"},{id:80008398,predicate:"inputStickerSetEmojiGenericAnimations",params:[],type:"InputStickerSet"},{id:701560302,predicate:"inputStickerSetEmojiDefaultStatuses",params:[],type:"InputStickerSet"},{id:-1206095820,predicate:"sendAsPeer",params:[{name:"flags",type:"#"},{name:"premium_required",type:"flags.0?true"},{name:"peer",type:"Peer"}],type:"SendAsPeer"},{id:-1386050360,predicate:"messageExtendedMediaPreview",params:[{name:"flags",type:"#"},{name:"w",type:"flags.0?int"},{name:"h",type:"flags.0?int"},{name:"thumb",type:"flags.1?PhotoSize"},{name:"video_duration",type:"flags.2?int"}],type:"MessageExtendedMedia"},{id:-297296796,predicate:"messageExtendedMedia",params:[{name:"media",type:"MessageMedia"}],type:"MessageExtendedMedia"},{id:1517529484,predicate:"updateMessageExtendedMedia",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"extended_media",type:"MessageExtendedMedia"}],type:"Update"},{id:-50416996,predicate:"stickerKeyword",params:[{name:"document_id",type:"long"},{name:"keyword",type:"Vector"}],type:"StickerKeyword"},{id:-1274595769,predicate:"username",params:[{name:"flags",type:"#"},{name:"editable",type:"flags.0?true"},{name:"active",type:"flags.1?true"},{name:"username",type:"string"}],type:"Username"},{id:-263212119,predicate:"channelAdminLogEventActionChangeUsernames",params:[{name:"prev_value",type:"Vector"},{name:"new_value",type:"Vector"}],type:"ChannelAdminLogEventAction"},{id:46949251,predicate:"channelAdminLogEventActionToggleForum",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:1483767080,predicate:"channelAdminLogEventActionCreateTopic",params:[{name:"topic",type:"ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:-261103096,predicate:"channelAdminLogEventActionEditTopic",params:[{name:"prev_topic",type:"ForumTopic"},{name:"new_topic",type:"ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:-1374254839,predicate:"channelAdminLogEventActionDeleteTopic",params:[{name:"topic",type:"ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:1569535291,predicate:"channelAdminLogEventActionPinTopic",params:[{name:"flags",type:"#"},{name:"prev_topic",type:"flags.0?ForumTopic"},{name:"new_topic",type:"flags.1?ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:37687451,predicate:"forumTopicDeleted",params:[{name:"id",type:"int"}],type:"ForumTopic"},{id:1903173033,predicate:"forumTopic",params:[{name:"flags",type:"#"},{name:"my",type:"flags.1?true"},{name:"closed",type:"flags.2?true"},{name:"pinned",type:"flags.3?true"},{name:"short",type:"flags.5?true"},{name:"hidden",type:"flags.6?true"},{name:"id",type:"int"},{name:"date",type:"int"},{name:"title",type:"string"},{name:"icon_color",type:"int"},{name:"icon_emoji_id",type:"flags.0?long"},{name:"top_message",type:"int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"unread_mentions_count",type:"int"},{name:"unread_reactions_count",type:"int"},{name:"from_id",type:"Peer"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"draft",type:"flags.4?DraftMessage"}],type:"ForumTopic"},{id:913709011,predicate:"messages.forumTopics",params:[{name:"flags",type:"#"},{name:"order_by_create_date",type:"flags.0?true"},{name:"count",type:"int"},{name:"topics",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"pts",type:"int"}],type:"messages.ForumTopics"},{id:228168278,predicate:"messageActionTopicCreate",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"icon_color",type:"int"},{name:"icon_emoji_id",type:"flags.0?long"}],type:"MessageAction"},{id:-1064024032,predicate:"messageActionTopicEdit",params:[{name:"flags",type:"#"},{name:"title",type:"flags.0?string"},{name:"icon_emoji_id",type:"flags.1?long"},{name:"closed",type:"flags.2?Bool"},{name:"hidden",type:"flags.3?Bool"}],type:"MessageAction"},{id:422509539,predicate:"updateChannelPinnedTopic",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"channel_id",type:"long"},{name:"topic_id",type:"int"}],type:"Update"},{id:1548122514,predicate:"inputNotifyForumTopic",params:[{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"int"}],type:"InputNotifyPeer"},{id:577659656,predicate:"notifyForumTopic",params:[{name:"peer",type:"Peer"},{name:"top_msg_id",type:"int"}],type:"NotifyPeer"},{id:1153562857,predicate:"inputStickerSetEmojiDefaultTopicIcons",params:[],type:"InputStickerSet"},{id:406407439,predicate:"messages.sponsoredMessagesEmpty",params:[],type:"messages.SponsoredMessages"},{id:-31881726,predicate:"updateChannelPinnedTopics",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"order",type:"flags.0?Vector"}],type:"Update"},{id:1135897376,predicate:"defaultHistoryTTL",params:[{name:"period",type:"int"}],type:"DefaultHistoryTTL"},{id:116234636,predicate:"auth.codeTypeFragmentSms",params:[],type:"auth.CodeType"},{id:-648651719,predicate:"auth.sentCodeTypeFragmentSms",params:[{name:"url",type:"string"},{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:1103040667,predicate:"exportedContactToken",params:[{name:"url",type:"string"},{name:"expires",type:"int"}],type:"ExportedContactToken"},{id:1693675004,predicate:"channelAdminLogEventActionToggleAntiSpam",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:1474192222,predicate:"messageActionSuggestProfilePhoto",params:[{name:"photo",type:"Photo"}],type:"MessageAction"},{id:-404267113,predicate:"messageActionAttachMenuBotAllowed",params:[],type:"MessageAction"},{id:2008112412,predicate:"stickerSetNoCovered",params:[{name:"set",type:"StickerSet"}],type:"StickerSetCovered"},{id:542282808,predicate:"updateUser",params:[{name:"user_id",type:"long"}],type:"Update"}],methods:[{id:-878758099,method:"invokeAfterMsg",params:[{name:"msg_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:1036301552,method:"invokeAfterMsgs",params:[{name:"msg_ids",type:"Vector"},{name:"query",type:"!X"}],type:"X"},{id:-1502141361,method:"auth.sendCode",params:[{name:"phone_number",type:"string"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:-2131827673,method:"auth.signUp",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"auth.Authorization"},{id:-1923962543,method:"auth.signIn",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"flags.0?string"},{name:"email_verification",type:"flags.1?EmailVerification"}],type:"auth.Authorization"},{id:1047706137,method:"auth.logOut",params:[],type:"auth.LoggedOut"},{id:-1616179942,method:"auth.resetAuthorizations",params:[],type:"Bool"},{id:-440401971,method:"auth.exportAuthorization",params:[{name:"dc_id",type:"int"}],type:"auth.ExportedAuthorization"},{id:-1518699091,method:"auth.importAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.Authorization"},{id:-841733627,method:"auth.bindTempAuthKey",params:[{name:"perm_auth_key_id",type:"long"},{name:"nonce",type:"long"},{name:"expires_at",type:"int"},{name:"encrypted_message",type:"bytes"}],type:"Bool"},{id:-326762118,method:"account.registerDevice",params:[{name:"flags",type:"#"},{name:"no_muted",type:"flags.0?true"},{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"app_sandbox",type:"Bool"},{name:"secret",type:"bytes"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:1779249670,method:"account.unregisterDevice",params:[{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:-2067899501,method:"account.updateNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"},{name:"settings",type:"InputPeerNotifySettings"}],type:"Bool"},{id:313765169,method:"account.getNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"}],type:"PeerNotifySettings"},{id:-612493497,method:"account.resetNotifySettings",params:[],type:"Bool"},{id:2018596725,method:"account.updateProfile",params:[{name:"flags",type:"#"},{name:"first_name",type:"flags.0?string"},{name:"last_name",type:"flags.1?string"},{name:"about",type:"flags.2?string"}],type:"User"},{id:1713919532,method:"account.updateStatus",params:[{name:"offline",type:"Bool"}],type:"Bool"},{id:127302966,method:"account.getWallPapers",params:[{name:"hash",type:"long"}],type:"account.WallPapers"},{id:-977650298,method:"account.reportPeer",params:[{name:"peer",type:"InputPeer"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:227648840,method:"users.getUsers",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1240508136,method:"users.getFullUser",params:[{name:"id",type:"InputUser"}],type:"users.UserFull"},{id:2061264541,method:"contacts.getContactIDs",params:[{name:"hash",type:"long"}],type:"Vector"},{id:-995929106,method:"contacts.getStatuses",params:[],type:"Vector"},{id:1574346258,method:"contacts.getContacts",params:[{name:"hash",type:"long"}],type:"contacts.Contacts"},{id:746589157,method:"contacts.importContacts",params:[{name:"contacts",type:"Vector"}],type:"contacts.ImportedContacts"},{id:157945344,method:"contacts.deleteContacts",params:[{name:"id",type:"Vector"}],type:"Updates"},{id:269745566,method:"contacts.deleteByPhones",params:[{name:"phones",type:"Vector"}],type:"Bool"},{id:1758204945,method:"contacts.block",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-1096393392,method:"contacts.unblock",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-176409329,method:"contacts.getBlocked",params:[{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"contacts.Blocked"},{id:1673946374,method:"messages.getMessages",params:[{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1594569905,method:"messages.getDialogs",params:[{name:"flags",type:"#"},{name:"exclude_pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"offset_date",type:"int"},{name:"offset_id",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Dialogs"},{id:1143203525,method:"messages.getHistory",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1593989278,method:"messages.search",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"q",type:"string"},{name:"from_id",type:"flags.0?InputPeer"},{name:"top_msg_id",type:"flags.1?int"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:238054714,method:"messages.readHistory",params:[{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"}],type:"messages.AffectedMessages"},{id:-1332768214,method:"messages.deleteHistory",params:[{name:"flags",type:"#"},{name:"just_clear",type:"flags.0?true"},{name:"revoke",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"},{name:"min_date",type:"flags.2?int"},{name:"max_date",type:"flags.3?int"}],type:"messages.AffectedHistory"},{id:-443640366,method:"messages.deleteMessages",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:94983360,method:"messages.receivedMessages",params:[{name:"max_id",type:"int"}],type:"Vector"},{id:1486110434,method:"messages.setTyping",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"action",type:"SendMessageAction"}],type:"Bool"},{id:482476935,method:"messages.sendMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"update_stickersets_order",type:"flags.15?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:1967638886,method:"messages.sendMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"update_stickersets_order",type:"flags.15?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"media",type:"InputMedia"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-966673468,method:"messages.forwardMessages",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"with_my_score",type:"flags.8?true"},{name:"drop_author",type:"flags.11?true"},{name:"drop_media_captions",type:"flags.12?true"},{name:"noforwards",type:"flags.14?true"},{name:"from_peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"random_id",type:"Vector"},{name:"to_peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.9?int"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-820669733,method:"messages.reportSpam",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-270948702,method:"messages.getPeerSettings",params:[{name:"peer",type:"InputPeer"}],type:"messages.PeerSettings"},{id:-1991005362,method:"messages.report",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:1240027791,method:"messages.getChats",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:-1364194508,method:"messages.getFullChat",params:[{name:"chat_id",type:"long"}],type:"messages.ChatFull"},{id:1937260541,method:"messages.editChatTitle",params:[{name:"chat_id",type:"long"},{name:"title",type:"string"}],type:"Updates"},{id:903730804,method:"messages.editChatPhoto",params:[{name:"chat_id",type:"long"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:-230206493,method:"messages.addChatUser",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"fwd_limit",type:"int"}],type:"Updates"},{id:-1575461717,method:"messages.deleteChatUser",params:[{name:"flags",type:"#"},{name:"revoke_history",type:"flags.0?true"},{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:3450904,method:"messages.createChat",params:[{name:"flags",type:"#"},{name:"users",type:"Vector"},{name:"title",type:"string"},{name:"ttl_period",type:"flags.0?int"}],type:"Updates"},{id:-304838614,method:"updates.getState",params:[],type:"updates.State"},{id:630429265,method:"updates.getDifference",params:[{name:"flags",type:"#"},{name:"pts",type:"int"},{name:"pts_total_limit",type:"flags.0?int"},{name:"date",type:"int"},{name:"qts",type:"int"}],type:"updates.Difference"},{id:473782614,method:"photos.updateProfilePhoto",params:[{name:"flags",type:"#"},{name:"fallback",type:"flags.0?true"},{name:"id",type:"InputPhoto"}],type:"photos.Photo"},{id:-1980559511,method:"photos.uploadProfilePhoto",params:[{name:"flags",type:"#"},{name:"fallback",type:"flags.3?true"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"photos.Photo"},{id:-2016444625,method:"photos.deletePhotos",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1291540959,method:"upload.saveFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1101843010,method:"upload.getFile",params:[{name:"flags",type:"#"},{name:"precise",type:"flags.0?true"},{name:"cdn_supported",type:"flags.1?true"},{name:"location",type:"InputFileLocation"},{name:"offset",type:"long"},{name:"limit",type:"int"}],type:"upload.File"},{id:-990308245,method:"help.getConfig",params:[],type:"Config"},{id:531836966,method:"help.getNearestDc",params:[],type:"NearestDc"},{id:1378703997,method:"help.getAppUpdate",params:[{name:"source",type:"string"}],type:"help.AppUpdate"},{id:1295590211,method:"help.getInviteText",params:[],type:"help.InviteText"},{id:-1848823128,method:"photos.getUserPhotos",params:[{name:"user_id",type:"InputUser"},{name:"offset",type:"int"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"photos.Photos"},{id:651135312,method:"messages.getDhConfig",params:[{name:"version",type:"int"},{name:"random_length",type:"int"}],type:"messages.DhConfig"},{id:-162681021,method:"messages.requestEncryption",params:[{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1035731989,method:"messages.acceptEncryption",params:[{name:"peer",type:"InputEncryptedChat"},{name:"g_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:-208425312,method:"messages.discardEncryption",params:[{name:"flags",type:"#"},{name:"delete_history",type:"flags.0?true"},{name:"chat_id",type:"int"}],type:"Bool"},{id:2031374829,method:"messages.setEncryptedTyping",params:[{name:"peer",type:"InputEncryptedChat"},{name:"typing",type:"Bool"}],type:"Bool"},{id:2135648522,method:"messages.readEncryptedHistory",params:[{name:"peer",type:"InputEncryptedChat"},{name:"max_date",type:"int"}],type:"Bool"},{id:1157265941,method:"messages.sendEncrypted",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1431914525,method:"messages.sendEncryptedFile",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"},{name:"file",type:"InputEncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:852769188,method:"messages.sendEncryptedService",params:[{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1436924774,method:"messages.receivedQueue",params:[{name:"max_qts",type:"int"}],type:"Vector"},{id:1259113487,method:"messages.reportEncryptedSpam",params:[{name:"peer",type:"InputEncryptedChat"}],type:"Bool"},{id:-562337987,method:"upload.saveBigFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"file_total_parts",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1043505495,method:"initConnection",params:[{name:"flags",type:"#"},{name:"api_id",type:"int"},{name:"device_model",type:"string"},{name:"system_version",type:"string"},{name:"app_version",type:"string"},{name:"system_lang_code",type:"string"},{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"proxy",type:"flags.0?InputClientProxy"},{name:"params",type:"flags.1?JSONValue"},{name:"query",type:"!X"}],type:"X"},{id:-1663104819,method:"help.getSupport",params:[],type:"help.Support"},{id:916930423,method:"messages.readMessageContents",params:[{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:655677548,method:"account.checkUsername",params:[{name:"username",type:"string"}],type:"Bool"},{id:1040964988,method:"account.updateUsername",params:[{name:"username",type:"string"}],type:"User"},{id:301470424,method:"contacts.search",params:[{name:"q",type:"string"},{name:"limit",type:"int"}],type:"contacts.Found"},{id:-623130288,method:"account.getPrivacy",params:[{name:"key",type:"InputPrivacyKey"}],type:"account.PrivacyRules"},{id:-906486552,method:"account.setPrivacy",params:[{name:"key",type:"InputPrivacyKey"},{name:"rules",type:"Vector"}],type:"account.PrivacyRules"},{id:-1564422284,method:"account.deleteAccount",params:[{name:"flags",type:"#"},{name:"reason",type:"string"},{name:"password",type:"flags.0?InputCheckPasswordSRP"}],type:"Bool"},{id:150761757,method:"account.getAccountTTL",params:[],type:"AccountDaysTTL"},{id:608323678,method:"account.setAccountTTL",params:[{name:"ttl",type:"AccountDaysTTL"}],type:"Bool"},{id:-627372787,method:"invokeWithLayer",params:[{name:"layer",type:"int"},{name:"query",type:"!X"}],type:"X"},{id:-113456221,method:"contacts.resolveUsername",params:[{name:"username",type:"string"}],type:"contacts.ResolvedPeer"},{id:-2108208411,method:"account.sendChangePhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1891839707,method:"account.changePhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"User"},{id:-710552671,method:"messages.getStickers",params:[{name:"emoticon",type:"string"},{name:"hash",type:"long"}],type:"messages.Stickers"},{id:-1197432408,method:"messages.getAllStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:954152242,method:"account.updateDeviceLocked",params:[{name:"period",type:"int"}],type:"Bool"},{id:1738800940,method:"auth.importBotAuthorization",params:[{name:"flags",type:"int"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"bot_auth_token",type:"string"}],type:"auth.Authorization"},{id:-1956073268,method:"messages.getWebPagePreview",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"MessageMedia"},{id:-484392616,method:"account.getAuthorizations",params:[],type:"account.Authorizations"},{id:-545786948,method:"account.resetAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1418342645,method:"account.getPassword",params:[],type:"account.Password"},{id:-1663767815,method:"account.getPasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"account.PasswordSettings"},{id:-1516564433,method:"account.updatePasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"new_settings",type:"account.PasswordInputSettings"}],type:"Bool"},{id:-779399914,method:"auth.checkPassword",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"auth.Authorization"},{id:-661144474,method:"auth.requestPasswordRecovery",params:[],type:"auth.PasswordRecovery"},{id:923364464,method:"auth.recoverPassword",params:[{name:"flags",type:"#"},{name:"code",type:"string"},{name:"new_settings",type:"flags.0?account.PasswordInputSettings"}],type:"auth.Authorization"},{id:-1080796745,method:"invokeWithoutUpdates",params:[{name:"query",type:"!X"}],type:"X"},{id:-1607670315,method:"messages.exportChatInvite",params:[{name:"flags",type:"#"},{name:"legacy_revoke_permanent",type:"flags.2?true"},{name:"request_needed",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"title",type:"flags.4?string"}],type:"ExportedChatInvite"},{id:1051570619,method:"messages.checkChatInvite",params:[{name:"hash",type:"string"}],type:"ChatInvite"},{id:1817183516,method:"messages.importChatInvite",params:[{name:"hash",type:"string"}],type:"Updates"},{id:-928977804,method:"messages.getStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"hash",type:"int"}],type:"messages.StickerSet"},{id:-946871200,method:"messages.installStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"archived",type:"Bool"}],type:"messages.StickerSetInstallResult"},{id:-110209570,method:"messages.uninstallStickerSet",params:[{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:-421563528,method:"messages.startBot",params:[{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"long"},{name:"start_param",type:"string"}],type:"Updates"},{id:-1877938321,method:"help.getAppChangelog",params:[{name:"prev_app_version",type:"string"}],type:"Updates"},{id:1468322785,method:"messages.getMessagesViews",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"increment",type:"Bool"}],type:"messages.MessageViews"},{id:-871347913,method:"channels.readHistory",params:[{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Bool"},{id:-2067661490,method:"channels.deleteMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:-196443371,method:"channels.reportSpam",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Bool"},{id:-1383294429,method:"channels.getMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:2010044880,method:"channels.getParticipants",params:[{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelParticipantsFilter"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"channels.ChannelParticipants"},{id:-1599378234,method:"channels.getParticipant",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"channels.ChannelParticipant"},{id:176122811,method:"channels.getChannels",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:141781513,method:"channels.getFullChannel",params:[{name:"channel",type:"InputChannel"}],type:"messages.ChatFull"},{id:-1862244601,method:"channels.createChannel",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.0?true"},{name:"megagroup",type:"flags.1?true"},{name:"for_import",type:"flags.3?true"},{name:"title",type:"string"},{name:"about",type:"string"},{name:"geo_point",type:"flags.2?InputGeoPoint"},{name:"address",type:"flags.2?string"},{name:"ttl_period",type:"flags.4?int"}],type:"Updates"},{id:-751007486,method:"channels.editAdmin",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"string"}],type:"Updates"},{id:1450044624,method:"channels.editTitle",params:[{name:"channel",type:"InputChannel"},{name:"title",type:"string"}],type:"Updates"},{id:-248621111,method:"channels.editPhoto",params:[{name:"channel",type:"InputChannel"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:283557164,method:"channels.checkUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:890549214,method:"channels.updateUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:615851205,method:"channels.joinChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:-130635115,method:"channels.leaveChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:429865580,method:"channels.inviteToChannel",params:[{name:"channel",type:"InputChannel"},{name:"users",type:"Vector"}],type:"Updates"},{id:-1072619549,method:"channels.deleteChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:51854712,method:"updates.getChannelDifference",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelMessagesFilter"},{name:"pts",type:"int"},{name:"limit",type:"int"}],type:"updates.ChannelDifference"},{id:-1470377534,method:"messages.editChatAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"is_admin",type:"Bool"}],type:"Bool"},{id:-1568189671,method:"messages.migrateChat",params:[{name:"chat_id",type:"long"}],type:"Updates"},{id:1271290010,method:"messages.searchGlobal",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:2016638777,method:"messages.reorderStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"},{name:"order",type:"Vector"}],type:"Bool"},{id:-1309538785,method:"messages.getDocumentByHash",params:[{name:"sha256",type:"bytes"},{name:"size",type:"long"},{name:"mime_type",type:"string"}],type:"Document"},{id:1559270965,method:"messages.getSavedGifs",params:[{name:"hash",type:"long"}],type:"messages.SavedGifs"},{id:846868683,method:"messages.saveGif",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:1364105629,method:"messages.getInlineBotResults",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"geo_point",type:"flags.0?InputGeoPoint"},{name:"query",type:"string"},{name:"offset",type:"string"}],type:"messages.BotResults"},{id:-346119674,method:"messages.setInlineBotResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"private",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"next_offset",type:"flags.2?string"},{name:"switch_pm",type:"flags.3?InlineBotSwitchPM"}],type:"Bool"},{id:-738468661,method:"messages.sendInlineBotResult",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"hide_via",type:"flags.11?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"random_id",type:"long"},{name:"query_id",type:"long"},{name:"id",type:"string"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-432034325,method:"channels.exportMessageLink",params:[{name:"flags",type:"#"},{name:"grouped",type:"flags.0?true"},{name:"thread",type:"flags.1?true"},{name:"channel",type:"InputChannel"},{name:"id",type:"int"}],type:"ExportedMessageLink"},{id:527021574,method:"channels.toggleSignatures",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:1056025023,method:"auth.resendCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"auth.SentCode"},{id:520357240,method:"auth.cancelCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"Bool"},{id:-39416522,method:"messages.getMessageEditData",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"messages.MessageEditData"},{id:1224152952,method:"messages.editMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.15?int"}],type:"Updates"},{id:-2091549254,method:"messages.editInlineBotMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:-1824339449,method:"messages.getBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"game",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"data",type:"flags.0?bytes"},{name:"password",type:"flags.2?InputCheckPasswordSRP"}],type:"messages.BotCallbackAnswer"},{id:-712043766,method:"messages.setBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"Bool"},{id:-1758168906,method:"contacts.getTopPeers",params:[{name:"flags",type:"#"},{name:"correspondents",type:"flags.0?true"},{name:"bots_pm",type:"flags.1?true"},{name:"bots_inline",type:"flags.2?true"},{name:"phone_calls",type:"flags.3?true"},{name:"forward_users",type:"flags.4?true"},{name:"forward_chats",type:"flags.5?true"},{name:"groups",type:"flags.10?true"},{name:"channels",type:"flags.15?true"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"contacts.TopPeers"},{id:451113900,method:"contacts.resetTopPeerRating",params:[{name:"category",type:"TopPeerCategory"},{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-462373635,method:"messages.getPeerDialogs",params:[{name:"peers",type:"Vector"}],type:"messages.PeerDialogs"},{id:-1271718337,method:"messages.saveDraft",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.2?int"},{name:"peer",type:"InputPeer"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:1782549861,method:"messages.getAllDrafts",params:[],type:"Updates"},{id:1685588756,method:"messages.getFeaturedStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:1527873830,method:"messages.readFeaturedStickers",params:[{name:"id",type:"Vector"}],type:"Bool"},{id:-1649852357,method:"messages.getRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"hash",type:"long"}],type:"messages.RecentStickers"},{id:958863608,method:"messages.saveRecentSticker",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-1986437075,method:"messages.clearRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"}],type:"Bool"},{id:1475442322,method:"messages.getArchivedStickers",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"},{name:"offset_id",type:"long"},{name:"limit",type:"int"}],type:"messages.ArchivedStickers"},{id:457157256,method:"account.sendConfirmPhoneCode",params:[{name:"hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1596029123,method:"account.confirmPhone",params:[{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:-122669393,method:"channels.getAdminedPublicChannels",params:[{name:"flags",type:"#"},{name:"by_location",type:"flags.0?true"},{name:"check_limit",type:"flags.1?true"}],type:"messages.Chats"},{id:1678738104,method:"messages.getMaskStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:-866424884,method:"messages.getAttachedStickers",params:[{name:"media",type:"InputStickeredMedia"}],type:"Vector"},{id:-1907842680,method:"auth.dropTempAuthKeys",params:[{name:"except_auth_keys",type:"Vector"}],type:"Bool"},{id:-1896289088,method:"messages.setGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Updates"},{id:363700068,method:"messages.setInlineGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Bool"},{id:-400399203,method:"messages.getGameHighScores",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:258170395,method:"messages.getInlineGameHighScores",params:[{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:-468934396,method:"messages.getCommonChats",params:[{name:"user_id",type:"InputUser"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"messages.Chats"},{id:-2023787330,method:"messages.getAllChats",params:[{name:"except_ids",type:"Vector"}],type:"messages.Chats"},{id:-333262899,method:"help.setBotUpdatesStatus",params:[{name:"pending_updates_count",type:"int"},{name:"message",type:"string"}],type:"Bool"},{id:852135825,method:"messages.getWebPage",params:[{name:"url",type:"string"},{name:"hash",type:"int"}],type:"WebPage"},{id:-1489903017,method:"messages.toggleDialogPin",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:991616823,method:"messages.reorderPinnedDialogs",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"folder_id",type:"int"},{name:"order",type:"Vector"}],type:"Bool"},{id:-692498958,method:"messages.getPinnedDialogs",params:[{name:"folder_id",type:"int"}],type:"messages.PeerDialogs"},{id:-1440257555,method:"bots.sendCustomRequest",params:[{name:"custom_method",type:"string"},{name:"params",type:"DataJSON"}],type:"DataJSON"},{id:-434028723,method:"bots.answerWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"}],type:"Bool"},{id:619086221,method:"upload.getWebFile",params:[{name:"location",type:"InputWebFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.WebFile"},{id:924093883,method:"payments.getPaymentForm",params:[{name:"flags",type:"#"},{name:"invoice",type:"InputInvoice"},{name:"theme_params",type:"flags.0?DataJSON"}],type:"payments.PaymentForm"},{id:611897804,method:"payments.getPaymentReceipt",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"payments.PaymentReceipt"},{id:-1228345045,method:"payments.validateRequestedInfo",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"invoice",type:"InputInvoice"},{name:"info",type:"PaymentRequestedInfo"}],type:"payments.ValidatedRequestedInfo"},{id:755192367,method:"payments.sendPaymentForm",params:[{name:"flags",type:"#"},{name:"form_id",type:"long"},{name:"invoice",type:"InputInvoice"},{name:"requested_info_id",type:"flags.0?string"},{name:"shipping_option_id",type:"flags.1?string"},{name:"credentials",type:"InputPaymentCredentials"},{name:"tip_amount",type:"flags.2?long"}],type:"payments.PaymentResult"},{id:1151208273,method:"account.getTmpPassword",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"period",type:"int"}],type:"account.TmpPassword"},{id:578650699,method:"payments.getSavedInfo",params:[],type:"payments.SavedInfo"},{id:-667062079,method:"payments.clearSavedInfo",params:[{name:"flags",type:"#"},{name:"credentials",type:"flags.0?true"},{name:"info",type:"flags.1?true"}],type:"Bool"},{id:-436833542,method:"messages.setBotShippingResults",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"Bool"},{id:163765653,method:"messages.setBotPrecheckoutResults",params:[{name:"flags",type:"#"},{name:"success",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"}],type:"Bool"},{id:-1876841625,method:"stickers.createStickerSet",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"animated",type:"flags.1?true"},{name:"videos",type:"flags.4?true"},{name:"user_id",type:"InputUser"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumb",type:"flags.2?InputDocument"},{name:"stickers",type:"Vector"},{name:"software",type:"flags.3?string"}],type:"messages.StickerSet"},{id:-143257775,method:"stickers.removeStickerFromSet",params:[{name:"sticker",type:"InputDocument"}],type:"messages.StickerSet"},{id:-4795190,method:"stickers.changeStickerPosition",params:[{name:"sticker",type:"InputDocument"},{name:"position",type:"int"}],type:"messages.StickerSet"},{id:-2041315650,method:"stickers.addStickerToSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"sticker",type:"InputStickerSetItem"}],type:"messages.StickerSet"},{id:1369162417,method:"messages.uploadMedia",params:[{name:"peer",type:"InputPeer"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:1430593449,method:"phone.getCallConfig",params:[],type:"DataJSON"},{id:1124046573,method:"phone.requestCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:1003664544,method:"phone.acceptCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:788404002,method:"phone.confirmCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_a",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:399855457,method:"phone.receivedCall",params:[{name:"peer",type:"InputPhoneCall"}],type:"Bool"},{id:-1295269440,method:"phone.discardCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"duration",type:"int"},{name:"reason",type:"PhoneCallDiscardReason"},{name:"connection_id",type:"long"}],type:"Updates"},{id:1508562471,method:"phone.setCallRating",params:[{name:"flags",type:"#"},{name:"user_initiative",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"rating",type:"int"},{name:"comment",type:"string"}],type:"Updates"},{id:662363518,method:"phone.saveCallDebug",params:[{name:"peer",type:"InputPhoneCall"},{name:"debug",type:"DataJSON"}],type:"Bool"},{id:962554330,method:"upload.getCdnFile",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"long"},{name:"limit",type:"int"}],type:"upload.CdnFile"},{id:-1691921240,method:"upload.reuploadCdnFile",params:[{name:"file_token",type:"bytes"},{name:"request_token",type:"bytes"}],type:"Vector"},{id:1375900482,method:"help.getCdnConfig",params:[],type:"CdnConfig"},{id:-219008246,method:"langpack.getLangPack",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackDifference"},{id:-269862909,method:"langpack.getStrings",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"keys",type:"Vector"}],type:"Vector"},{id:-845657435,method:"langpack.getDifference",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"LangPackDifference"},{id:1120311183,method:"langpack.getLanguages",params:[{name:"lang_pack",type:"string"}],type:"Vector"},{id:-1763259007,method:"channels.editBanned",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:870184064,method:"channels.getAdminLog",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"q",type:"string"},{name:"events_filter",type:"flags.0?ChannelAdminLogEventsFilter"},{name:"admins",type:"flags.1?Vector"},{name:"max_id",type:"long"},{name:"min_id",type:"long"},{name:"limit",type:"int"}],type:"channels.AdminLogResults"},{id:-1847836879,method:"upload.getCdnFileHashes",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"long"}],type:"Vector"},{id:-914493408,method:"messages.sendScreenshotNotification",params:[{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"int"},{name:"random_id",type:"long"}],type:"Updates"},{id:-359881479,method:"channels.setStickers",params:[{name:"channel",type:"InputChannel"},{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:82946729,method:"messages.getFavedStickers",params:[{name:"hash",type:"long"}],type:"messages.FavedStickers"},{id:-1174420133,method:"messages.faveSticker",params:[{name:"id",type:"InputDocument"},{name:"unfave",type:"Bool"}],type:"Bool"},{id:-357180360,method:"channels.readMessageContents",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"Bool"},{id:-2020263951,method:"contacts.resetSaved",params:[],type:"Bool"},{id:-251140208,method:"messages.getUnreadMentions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"}],type:"messages.Messages"},{id:-1683319225,method:"channels.deleteHistory",params:[{name:"flags",type:"#"},{name:"for_everyone",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Updates"},{id:1036054804,method:"help.getRecentMeUrls",params:[{name:"referer",type:"string"}],type:"help.RecentMeUrls"},{id:-356796084,method:"channels.togglePreHistoryHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:921026381,method:"messages.readMentions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"}],type:"messages.AffectedHistory"},{id:1881817312,method:"messages.getRecentLocations",params:[{name:"peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1225713124,method:"messages.sendMultiMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"update_stickersets_order",type:"flags.15?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"multi_media",type:"Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:1347929239,method:"messages.uploadEncryptedFile",params:[{name:"peer",type:"InputEncryptedChat"},{name:"file",type:"InputEncryptedFile"}],type:"EncryptedFile"},{id:405695855,method:"account.getWebAuthorizations",params:[],type:"account.WebAuthorizations"},{id:755087855,method:"account.resetWebAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1747789204,method:"account.resetWebAuthorizations",params:[],type:"Bool"},{id:896555914,method:"messages.searchStickerSets",params:[{name:"flags",type:"#"},{name:"exclude_featured",type:"flags.0?true"},{name:"q",type:"string"},{name:"hash",type:"long"}],type:"messages.FoundStickerSets"},{id:-1856595926,method:"upload.getFileHashes",params:[{name:"location",type:"InputFileLocation"},{name:"offset",type:"long"}],type:"Vector"},{id:749019089,method:"help.getTermsOfServiceUpdate",params:[],type:"help.TermsOfServiceUpdate"},{id:-294455398,method:"help.acceptTermsOfService",params:[{name:"id",type:"DataJSON"}],type:"Bool"},{id:-1299661699,method:"account.getAllSecureValues",params:[],type:"Vector"},{id:1936088002,method:"account.getSecureValue",params:[{name:"types",type:"Vector"}],type:"Vector"},{id:-1986010339,method:"account.saveSecureValue",params:[{name:"value",type:"InputSecureValue"},{name:"secure_secret_id",type:"long"}],type:"SecureValue"},{id:-1199522741,method:"account.deleteSecureValue",params:[{name:"types",type:"Vector"}],type:"Bool"},{id:-1865902923,method:"users.setSecureValueErrors",params:[{name:"id",type:"InputUser"},{name:"errors",type:"Vector"}],type:"Bool"},{id:-1456907910,method:"account.getAuthorizationForm",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"}],type:"account.AuthorizationForm"},{id:-202552205,method:"account.acceptAuthorization",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"},{name:"value_hashes",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"Bool"},{id:-1516022023,method:"account.sendVerifyPhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1305716726,method:"account.verifyPhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:-1730136133,method:"account.sendVerifyEmailCode",params:[{name:"purpose",type:"EmailVerifyPurpose"},{name:"email",type:"string"}],type:"account.SentEmailCode"},{id:53322959,method:"account.verifyEmail",params:[{name:"purpose",type:"EmailVerifyPurpose"},{name:"verification",type:"EmailVerification"}],type:"account.EmailVerified"},{id:1072547679,method:"help.getDeepLinkInfo",params:[{name:"path",type:"string"}],type:"help.DeepLinkInfo"},{id:-2098076769,method:"contacts.getSaved",params:[],type:"Vector"},{id:-2092831552,method:"channels.getLeftChannels",params:[{name:"offset",type:"int"}],type:"messages.Chats"},{id:-1896617296,method:"account.initTakeoutSession",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"message_users",type:"flags.1?true"},{name:"message_chats",type:"flags.2?true"},{name:"message_megagroups",type:"flags.3?true"},{name:"message_channels",type:"flags.4?true"},{name:"files",type:"flags.5?true"},{name:"file_max_size",type:"flags.5?long"}],type:"account.Takeout"},{id:489050862,method:"account.finishTakeoutSession",params:[{name:"flags",type:"#"},{name:"success",type:"flags.0?true"}],type:"Bool"},{id:486505992,method:"messages.getSplitRanges",params:[],type:"Vector"},{id:911373810,method:"invokeWithMessagesRange",params:[{name:"range",type:"MessageRange"},{name:"query",type:"!X"}],type:"X"},{id:-1398145746,method:"invokeWithTakeout",params:[{name:"takeout_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:-1031349873,method:"messages.markDialogUnread",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:585256482,method:"messages.getDialogUnreadMarks",params:[],type:"Vector"},{id:-2062238246,method:"contacts.toggleTopPeers",params:[{name:"enabled",type:"Bool"}],type:"Bool"},{id:2119757468,method:"messages.clearAllDrafts",params:[],type:"Bool"},{id:-1735311088,method:"help.getAppConfig",params:[],type:"JSONValue"},{id:1862465352,method:"help.saveAppLog",params:[{name:"events",type:"Vector"}],type:"Bool"},{id:-966677240,method:"help.getPassportConfig",params:[{name:"hash",type:"int"}],type:"help.PassportConfig"},{id:1784243458,method:"langpack.getLanguage",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackLanguage"},{id:-760547348,method:"messages.updatePinnedMessage",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"unpin",type:"flags.1?true"},{name:"pm_oneside",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"Updates"},{id:-1881204448,method:"account.confirmPasswordEmail",params:[{name:"code",type:"string"}],type:"Bool"},{id:2055154197,method:"account.resendPasswordEmail",params:[],type:"Bool"},{id:-1043606090,method:"account.cancelPasswordEmail",params:[],type:"Bool"},{id:-748624084,method:"help.getSupportName",params:[],type:"help.SupportName"},{id:59377875,method:"help.getUserInfo",params:[{name:"user_id",type:"InputUser"}],type:"help.UserInfo"},{id:1723407216,method:"help.editUserInfo",params:[{name:"user_id",type:"InputUser"},{name:"message",type:"string"},{name:"entities",type:"Vector"}],type:"help.UserInfo"},{id:-1626880216,method:"account.getContactSignUpNotification",params:[],type:"Bool"},{id:-806076575,method:"account.setContactSignUpNotification",params:[{name:"silent",type:"Bool"}],type:"Bool"},{id:1398240377,method:"account.getNotifyExceptions",params:[{name:"flags",type:"#"},{name:"compare_sound",type:"flags.1?true"},{name:"peer",type:"flags.0?InputNotifyPeer"}],type:"Updates"},{id:283795844,method:"messages.sendVote",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"options",type:"Vector"}],type:"Updates"},{id:1941660731,method:"messages.getPollResults",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1848369232,method:"messages.getOnlines",params:[{name:"peer",type:"InputPeer"}],type:"ChatOnlines"},{id:-554301545,method:"messages.editChatAbout",params:[{name:"peer",type:"InputPeer"},{name:"about",type:"string"}],type:"Bool"},{id:-1517917375,method:"messages.editChatDefaultBannedRights",params:[{name:"peer",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:-57811990,method:"account.getWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"}],type:"WallPaper"},{id:-578472351,method:"account.uploadWallPaper",params:[{name:"file",type:"InputFile"},{name:"mime_type",type:"string"},{name:"settings",type:"WallPaperSettings"}],type:"WallPaper"},{id:1817860919,method:"account.saveWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"unsave",type:"Bool"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-18000023,method:"account.installWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-1153722364,method:"account.resetWallPapers",params:[],type:"Bool"},{id:1457130303,method:"account.getAutoDownloadSettings",params:[],type:"account.AutoDownloadSettings"},{id:1995661875,method:"account.saveAutoDownloadSettings",params:[{name:"flags",type:"#"},{name:"low",type:"flags.0?true"},{name:"high",type:"flags.1?true"},{name:"settings",type:"AutoDownloadSettings"}],type:"Bool"},{id:899735650,method:"messages.getEmojiKeywords",params:[{name:"lang_code",type:"string"}],type:"EmojiKeywordsDifference"},{id:352892591,method:"messages.getEmojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"EmojiKeywordsDifference"},{id:1318675378,method:"messages.getEmojiKeywordsLanguages",params:[{name:"lang_codes",type:"Vector"}],type:"Vector"},{id:-709817306,method:"messages.getEmojiURL",params:[{name:"lang_code",type:"string"}],type:"EmojiURL"},{id:1749536939,method:"folders.editPeerFolders",params:[{name:"folder_peers",type:"Vector"}],type:"Updates"},{id:472471681,method:"folders.deleteFolder",params:[{name:"folder_id",type:"int"}],type:"Updates"},{id:11435201,method:"messages.getSearchCounters",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"filters",type:"Vector"}],type:"Vector"},{id:-170208392,method:"channels.getGroupsForDiscussion",params:[],type:"messages.Chats"},{id:1079520178,method:"channels.setDiscussionGroup",params:[{name:"broadcast",type:"InputChannel"},{name:"group",type:"InputChannel"}],type:"Bool"},{id:428848198,method:"messages.requestUrlAuth",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:-1322487515,method:"messages.acceptUrlAuth",params:[{name:"flags",type:"#"},{name:"write_allowed",type:"flags.0?true"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:1336717624,method:"messages.hidePeerSettingsBar",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-386636848,method:"contacts.addContact",params:[{name:"flags",type:"#"},{name:"add_phone_privacy_exception",type:"flags.0?true"},{name:"id",type:"InputUser"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"phone",type:"string"}],type:"Updates"},{id:-130964977,method:"contacts.acceptContact",params:[{name:"id",type:"InputUser"}],type:"Updates"},{id:-1892102881,method:"channels.editCreator",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"password",type:"InputCheckPasswordSRP"}],type:"Updates"},{id:-750207932,method:"contacts.getLocated",params:[{name:"flags",type:"#"},{name:"background",type:"flags.1?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"self_expires",type:"flags.0?int"}],type:"Updates"},{id:1491484525,method:"channels.editLocation",params:[{name:"channel",type:"InputChannel"},{name:"geo_point",type:"InputGeoPoint"},{name:"address",type:"string"}],type:"Bool"},{id:-304832784,method:"channels.toggleSlowMode",params:[{name:"channel",type:"InputChannel"},{name:"seconds",type:"int"}],type:"Updates"},{id:-183077365,method:"messages.getScheduledHistory",params:[{name:"peer",type:"InputPeer"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1111817116,method:"messages.getScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1120369398,method:"messages.sendScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:1504586518,method:"messages.deleteScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:473805619,method:"account.uploadTheme",params:[{name:"flags",type:"#"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.0?InputFile"},{name:"file_name",type:"string"},{name:"mime_type",type:"string"}],type:"Document"},{id:1697530880,method:"account.createTheme",params:[{name:"flags",type:"#"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:737414348,method:"account.updateTheme",params:[{name:"flags",type:"#"},{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"slug",type:"flags.0?string"},{name:"title",type:"flags.1?string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:-229175188,method:"account.saveTheme",params:[{name:"theme",type:"InputTheme"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-953697477,method:"account.installTheme",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"theme",type:"flags.1?InputTheme"},{name:"format",type:"flags.2?string"},{name:"base_theme",type:"flags.3?BaseTheme"}],type:"Bool"},{id:978872812,method:"account.getTheme",params:[{name:"format",type:"string"},{name:"theme",type:"InputTheme"}],type:"Theme"},{id:1913054296,method:"account.getThemes",params:[{name:"format",type:"string"},{name:"hash",type:"long"}],type:"account.Themes"},{id:-1210022402,method:"auth.exportLoginToken",params:[{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"except_ids",type:"Vector"}],type:"auth.LoginToken"},{id:-1783866140,method:"auth.importLoginToken",params:[{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:-392909491,method:"auth.acceptLoginToken",params:[{name:"token",type:"bytes"}],type:"Authorization"},{id:-1250643605,method:"account.setContentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"}],type:"Bool"},{id:-1952756306,method:"account.getContentSettings",params:[],type:"account.ContentSettings"},{id:300429806,method:"channels.getInactiveChannels",params:[],type:"messages.InactiveChats"},{id:1705865692,method:"account.getMultiWallPapers",params:[{name:"wallpapers",type:"Vector"}],type:"Vector"},{id:-1200736242,method:"messages.getPollVotes",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"option",type:"flags.0?bytes"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.VotesList"},{id:-1257951254,method:"messages.toggleStickerSets",params:[{name:"flags",type:"#"},{name:"uninstall",type:"flags.0?true"},{name:"archive",type:"flags.1?true"},{name:"unarchive",type:"flags.2?true"},{name:"stickersets",type:"Vector"}],type:"Bool"},{id:779736953,method:"payments.getBankCardData",params:[{name:"number",type:"string"}],type:"payments.BankCardData"},{id:-241247891,method:"messages.getDialogFilters",params:[],type:"Vector"},{id:-1566780372,method:"messages.getSuggestedDialogFilters",params:[],type:"Vector"},{id:450142282,method:"messages.updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Bool"},{id:-983318044,method:"messages.updateDialogFiltersOrder",params:[{name:"order",type:"Vector"}],type:"Bool"},{id:-1421720550,method:"stats.getBroadcastStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.BroadcastStats"},{id:1646092192,method:"stats.loadAsyncGraph",params:[{name:"flags",type:"#"},{name:"token",type:"string"},{name:"x",type:"flags.0?long"}],type:"StatsGraph"},{id:-1707717072,method:"stickers.setStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb",type:"InputDocument"}],type:"messages.StickerSet"},{id:85399130,method:"bots.setBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"},{name:"commands",type:"Vector"}],type:"Bool"},{id:2127598753,method:"messages.getOldFeaturedStickers",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:-1063816159,method:"help.getPromoData",params:[],type:"help.PromoData"},{id:505748629,method:"help.hidePromoData",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-8744061,method:"phone.sendSignalingData",params:[{name:"peer",type:"InputPhoneCall"},{name:"data",type:"bytes"}],type:"Bool"},{id:-589330937,method:"stats.getMegagroupStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.MegagroupStats"},{id:-349483786,method:"account.getGlobalPrivacySettings",params:[],type:"GlobalPrivacySettings"},{id:517647042,method:"account.setGlobalPrivacySettings",params:[{name:"settings",type:"GlobalPrivacySettings"}],type:"GlobalPrivacySettings"},{id:-183649631,method:"help.dismissSuggestion",params:[{name:"peer",type:"InputPeer"},{name:"suggestion",type:"string"}],type:"Bool"},{id:1935116200,method:"help.getCountriesList",params:[{name:"lang_code",type:"string"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:584962828,method:"messages.getReplies",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:1147761405,method:"messages.getDiscussionMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"messages.DiscussionMessage"},{id:-147740172,method:"messages.readDiscussion",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Bool"},{id:698914348,method:"contacts.blockFromReplies",params:[{name:"flags",type:"#"},{name:"delete_message",type:"flags.0?true"},{name:"delete_history",type:"flags.1?true"},{name:"report_spam",type:"flags.2?true"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1445996571,method:"stats.getMessagePublicForwards",params:[{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:-1226791947,method:"stats.getMessageStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"}],type:"stats.MessageStats"},{id:-299714136,method:"messages.unpinAllMessages",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"}],type:"messages.AffectedHistory"},{id:1221445336,method:"phone.createGroupCall",params:[{name:"flags",type:"#"},{name:"rtmp_stream",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"int"},{name:"title",type:"flags.0?string"},{name:"schedule_date",type:"flags.1?int"}],type:"Updates"},{id:-1322057861,method:"phone.joinGroupCall",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"video_stopped",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"join_as",type:"InputPeer"},{name:"invite_hash",type:"flags.1?string"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:1342404601,method:"phone.leaveGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"source",type:"int"}],type:"Updates"},{id:2067345760,method:"phone.inviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"Updates"},{id:2054648117,method:"phone.discardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1958458429,method:"phone.toggleGroupCallSettings",params:[{name:"flags",type:"#"},{name:"reset_invite_hash",type:"flags.1?true"},{name:"call",type:"InputGroupCall"},{name:"join_muted",type:"flags.0?Bool"}],type:"Updates"},{id:68699611,method:"phone.getGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"limit",type:"int"}],type:"phone.GroupCall"},{id:-984033109,method:"phone.getGroupParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"ids",type:"Vector"},{name:"sources",type:"Vector"},{name:"offset",type:"string"},{name:"limit",type:"int"}],type:"phone.GroupParticipants"},{id:-1248003721,method:"phone.checkGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"sources",type:"Vector"}],type:"Vector"},{id:1540419152,method:"messages.deleteChat",params:[{name:"chat_id",type:"long"}],type:"Bool"},{id:-104078327,method:"messages.deletePhoneCallHistory",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"}],type:"messages.AffectedFoundMessages"},{id:1140726259,method:"messages.checkHistoryImport",params:[{name:"import_head",type:"string"}],type:"messages.HistoryImportParsed"},{id:873008187,method:"messages.initHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"file",type:"InputFile"},{name:"media_count",type:"int"}],type:"messages.HistoryImport"},{id:713433234,method:"messages.uploadImportedMedia",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"},{name:"file_name",type:"string"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:-1271008444,method:"messages.startHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"}],type:"Bool"},{id:-1565154314,method:"messages.getExportedChatInvites",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"},{name:"offset_date",type:"flags.2?int"},{name:"offset_link",type:"flags.2?string"},{name:"limit",type:"int"}],type:"messages.ExportedChatInvites"},{id:1937010524,method:"messages.getExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"messages.ExportedChatInvite"},{id:-1110823051,method:"messages.editExportedChatInvite",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"string"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"request_needed",type:"flags.3?Bool"},{name:"title",type:"flags.4?string"}],type:"messages.ExportedChatInvite"},{id:1452833749,method:"messages.deleteRevokedExportedChatInvites",params:[{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"}],type:"Bool"},{id:-731601877,method:"messages.deleteExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"Bool"},{id:958457583,method:"messages.getAdminsWithInvites",params:[{name:"peer",type:"InputPeer"}],type:"messages.ChatAdminsWithInvites"},{id:-553329330,method:"messages.getChatInviteImporters",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"},{name:"q",type:"flags.2?string"},{name:"offset_date",type:"int"},{name:"offset_user",type:"InputUser"},{name:"limit",type:"int"}],type:"messages.ChatInviteImporters"},{id:-1207017500,method:"messages.setHistoryTTL",params:[{name:"peer",type:"InputPeer"},{name:"period",type:"int"}],type:"Updates"},{id:-91437323,method:"account.reportProfilePhoto",params:[{name:"peer",type:"InputPeer"},{name:"photo_id",type:"InputPhoto"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:187239529,method:"channels.convertToGigagroup",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:1573261059,method:"messages.checkHistoryImportPeer",params:[{name:"peer",type:"InputPeer"}],type:"messages.CheckedHistoryImportPeer"},{id:-248985848,method:"phone.toggleGroupCallRecord",params:[{name:"flags",type:"#"},{name:"start",type:"flags.0?true"},{name:"video",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"title",type:"flags.1?string"},{name:"video_portrait",type:"flags.2?Bool"}],type:"Updates"},{id:-1524155713,method:"phone.editGroupCallParticipant",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"participant",type:"InputPeer"},{name:"muted",type:"flags.0?Bool"},{name:"volume",type:"flags.1?int"},{name:"raise_hand",type:"flags.2?Bool"},{name:"video_stopped",type:"flags.3?Bool"},{name:"video_paused",type:"flags.4?Bool"},{name:"presentation_paused",type:"flags.5?Bool"}],type:"Updates"},{id:480685066,method:"phone.editGroupCallTitle",params:[{name:"call",type:"InputGroupCall"},{name:"title",type:"string"}],type:"Updates"},{id:-277077702,method:"phone.getGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"}],type:"phone.JoinAsPeers"},{id:-425040769,method:"phone.exportGroupCallInvite",params:[{name:"flags",type:"#"},{name:"can_self_unmute",type:"flags.0?true"},{name:"call",type:"InputGroupCall"}],type:"phone.ExportedGroupCallInvite"},{id:563885286,method:"phone.toggleGroupCallStartSubscription",params:[{name:"call",type:"InputGroupCall"},{name:"subscribed",type:"Bool"}],type:"Updates"},{id:1451287362,method:"phone.startScheduledGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1465786252,method:"phone.saveDefaultGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"},{name:"join_as",type:"InputPeer"}],type:"Bool"},{id:-873829436,method:"phone.joinGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:475058500,method:"phone.leaveGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:676017721,method:"stickers.checkShortName",params:[{name:"short_name",type:"string"}],type:"Bool"},{id:1303364867,method:"stickers.suggestShortName",params:[{name:"title",type:"string"}],type:"stickers.SuggestedShortName"},{id:1032708345,method:"bots.resetBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Bool"},{id:-481554986,method:"bots.getBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Vector"},{id:-1828139493,method:"account.resetPassword",params:[],type:"account.ResetPasswordResult"},{id:1284770294,method:"account.declinePasswordReset",params:[],type:"Bool"},{id:221691769,method:"auth.checkRecoveryPassword",params:[{name:"code",type:"string"}],type:"Bool"},{id:-700916087,method:"account.getChatThemes",params:[{name:"hash",type:"long"}],type:"account.Themes"},{id:-432283329,method:"messages.setChatTheme",params:[{name:"peer",type:"InputPeer"},{name:"emoticon",type:"string"}],type:"Updates"},{id:-1095836780,method:"channels.viewSponsoredMessage",params:[{name:"channel",type:"InputChannel"},{name:"random_id",type:"bytes"}],type:"Bool"},{id:-333377601,method:"channels.getSponsoredMessages",params:[{name:"channel",type:"InputChannel"}],type:"messages.SponsoredMessages"},{id:745510839,method:"messages.getMessageReadParticipants",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Vector"},{id:1240514025,method:"messages.getSearchResultsCalendar",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"}],type:"messages.SearchResultsCalendar"},{id:1855292323,method:"messages.getSearchResultsPositions",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.SearchResultsPositions"},{id:2145904661,method:"messages.hideChatJoinRequest",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:-528091926,method:"messages.hideAllChatJoinRequests",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"}],type:"Updates"},{id:-1323389022,method:"messages.toggleNoForwards",params:[{name:"peer",type:"InputPeer"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-855777386,method:"messages.saveDefaultSendAs",params:[{name:"peer",type:"InputPeer"},{name:"send_as",type:"InputPeer"}],type:"Bool"},{id:231174382,method:"channels.getSendAs",params:[{name:"peer",type:"InputPeer"}],type:"channels.SendAsPeers"},{id:-1081501024,method:"account.setAuthorizationTTL",params:[{name:"authorization_ttl_days",type:"int"}],type:"Bool"},{id:1089766498,method:"account.changeAuthorizationSettings",params:[{name:"flags",type:"#"},{name:"hash",type:"long"},{name:"encrypted_requests_disabled",type:"flags.0?Bool"},{name:"call_requests_disabled",type:"flags.1?Bool"}],type:"Bool"},{id:913655003,method:"channels.deleteParticipantHistory",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:-754091820,method:"messages.sendReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.1?true"},{name:"add_to_recent",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"reaction",type:"flags.0?Vector"}],type:"Updates"},{id:-1950707482,method:"messages.getMessagesReactions",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:1176190792,method:"messages.getMessageReactionsList",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction",type:"flags.0?Reaction"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.MessageReactionsList"},{id:-21928079,method:"messages.setChatAvailableReactions",params:[{name:"peer",type:"InputPeer"},{name:"available_reactions",type:"ChatReactions"}],type:"Updates"},{id:417243308,method:"messages.getAvailableReactions",params:[{name:"hash",type:"int"}],type:"messages.AvailableReactions"},{id:1330094102,method:"messages.setDefaultReaction",params:[{name:"reaction",type:"Reaction"}],type:"Bool"},{id:617508334,method:"messages.translateText",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.0?InputPeer"},{name:"msg_id",type:"flags.0?int"},{name:"text",type:"flags.1?string"},{name:"from_lang",type:"flags.2?string"},{name:"to_lang",type:"string"}],type:"messages.TranslatedText"},{id:841173339,method:"messages.getUnreadReactions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"}],type:"messages.Messages"},{id:1420459918,method:"messages.readReactions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"}],type:"messages.AffectedHistory"},{id:-1963375804,method:"contacts.resolvePhone",params:[{name:"phone",type:"string"}],type:"contacts.ResolvedPeer"},{id:447879488,method:"phone.getGroupCallStreamChannels",params:[{name:"call",type:"InputGroupCall"}],type:"phone.GroupCallStreamChannels"},{id:-558650433,method:"phone.getGroupCallStreamRtmpUrl",params:[{name:"peer",type:"InputPeer"},{name:"revoke",type:"Bool"}],type:"phone.GroupCallStreamRtmpUrl"},{id:276705696,method:"messages.searchSentMedia",params:[{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:385663691,method:"messages.getAttachMenuBots",params:[{name:"hash",type:"long"}],type:"AttachMenuBots"},{id:1998676370,method:"messages.getAttachMenuBot",params:[{name:"bot",type:"InputUser"}],type:"AttachMenuBotsBot"},{id:1777704297,method:"messages.toggleBotInAttachMenu",params:[{name:"flags",type:"#"},{name:"write_allowed",type:"flags.0?true"},{name:"bot",type:"InputUser"},{name:"enabled",type:"Bool"}],type:"Bool"},{id:395003915,method:"messages.requestWebView",params:[{name:"flags",type:"#"},{name:"from_bot_menu",type:"flags.4?true"},{name:"silent",type:"flags.5?true"},{name:"peer",type:"InputPeer"},{name:"bot",type:"InputUser"},{name:"url",type:"flags.1?string"},{name:"start_param",type:"flags.3?string"},{name:"theme_params",type:"flags.2?DataJSON"},{name:"platform",type:"string"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"WebViewResult"},{id:2146648841,method:"messages.prolongWebView",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"peer",type:"InputPeer"},{name:"bot",type:"InputUser"},{name:"query_id",type:"long"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Bool"},{id:698084494,method:"messages.requestSimpleWebView",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"url",type:"string"},{name:"theme_params",type:"flags.0?DataJSON"},{name:"platform",type:"string"}],type:"SimpleWebViewResult"},{id:172168437,method:"messages.sendWebViewResultMessage",params:[{name:"bot_query_id",type:"string"},{name:"result",type:"InputBotInlineResult"}],type:"WebViewMessageSent"},{id:-603831608,method:"messages.sendWebViewData",params:[{name:"bot",type:"InputUser"},{name:"random_id",type:"long"},{name:"button_text",type:"string"},{name:"data",type:"string"}],type:"Updates"},{id:1157944655,method:"bots.setBotMenuButton",params:[{name:"user_id",type:"InputUser"},{name:"button",type:"BotMenuButton"}],type:"Bool"},{id:-1671369944,method:"bots.getBotMenuButton",params:[{name:"user_id",type:"InputUser"}],type:"BotMenuButton"},{id:-510647672,method:"account.getSavedRingtones",params:[{name:"hash",type:"long"}],type:"account.SavedRingtones"},{id:1038768899,method:"account.saveRingtone",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"account.SavedRingtone"},{id:-2095414366,method:"account.uploadRingtone",params:[{name:"file",type:"InputFile"},{name:"file_name",type:"string"},{name:"mime_type",type:"string"}],type:"Document"},{id:2021942497,method:"bots.setBotBroadcastDefaultAdminRights",params:[{name:"admin_rights",type:"ChatAdminRights"}],type:"Bool"},{id:-1839281686,method:"bots.setBotGroupDefaultAdminRights",params:[{name:"admin_rights",type:"ChatAdminRights"}],type:"Bool"},{id:1092913030,method:"phone.saveCallLog",params:[{name:"peer",type:"InputPhoneCall"},{name:"file",type:"InputFile"}],type:"Bool"},{id:-456419968,method:"channels.toggleJoinToSend",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:1277789622,method:"channels.toggleJoinRequest",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:261206117,method:"payments.exportInvoice",params:[{name:"invoice_media",type:"InputMedia"}],type:"payments.ExportedInvoice"},{id:647928393,method:"messages.transcribeAudio",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"messages.TranscribedAudio"},{id:2132608815,method:"messages.rateTranscribedAudio",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"transcription_id",type:"long"},{name:"good",type:"Bool"}],type:"Bool"},{id:-2131921795,method:"payments.assignAppStoreTransaction",params:[{name:"receipt",type:"bytes"},{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Updates"},{id:-537046829,method:"payments.assignPlayMarketTransaction",params:[{name:"receipt",type:"DataJSON"},{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Updates"},{id:-1614700874,method:"payments.canPurchasePremium",params:[{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Bool"},{id:-1206152236,method:"help.getPremiumPromo",params:[],type:"help.PremiumPromo"},{id:-643100844,method:"messages.getCustomEmojiDocuments",params:[{name:"document_id",type:"Vector"}],type:"Vector"},{id:-67329649,method:"messages.getEmojiStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:248473398,method:"messages.getFeaturedEmojiStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:-70001045,method:"account.updateEmojiStatus",params:[{name:"emoji_status",type:"EmojiStatus"}],type:"Bool"},{id:-696962170,method:"account.getDefaultEmojiStatuses",params:[{name:"hash",type:"long"}],type:"account.EmojiStatuses"},{id:257392901,method:"account.getRecentEmojiStatuses",params:[{name:"hash",type:"long"}],type:"account.EmojiStatuses"},{id:404757166,method:"account.clearRecentEmojiStatuses",params:[],type:"Bool"},{id:1063567478,method:"messages.reportReaction",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction_peer",type:"InputPeer"}],type:"Bool"},{id:-1149164102,method:"messages.getTopReactions",params:[{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Reactions"},{id:960896434,method:"messages.getRecentReactions",params:[{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Reactions"},{id:-1644236876,method:"messages.clearRecentReactions",params:[],type:"Bool"},{id:-2064119788,method:"messages.getExtendedMedia",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:767062953,method:"auth.importWebTokenAuthorization",params:[{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"web_auth_token",type:"string"}],type:"auth.Authorization"},{id:-279966037,method:"account.reorderUsernames",params:[{name:"order",type:"Vector"}],type:"Bool"},{id:1490465654,method:"account.toggleUsername",params:[{name:"username",type:"string"},{name:"active",type:"Bool"}],type:"Bool"},{id:-1268978403,method:"channels.reorderUsernames",params:[{name:"channel",type:"InputChannel"},{name:"order",type:"Vector"}],type:"Bool"},{id:1358053637,method:"channels.toggleUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"},{name:"active",type:"Bool"}],type:"Bool"},{id:170155475,method:"channels.deactivateAllUsernames",params:[{name:"channel",type:"InputChannel"}],type:"Bool"},{id:-1540781271,method:"channels.toggleForum",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-200539612,method:"channels.createForumTopic",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"title",type:"string"},{name:"icon_color",type:"flags.0?int"},{name:"icon_emoji_id",type:"flags.3?long"},{name:"random_id",type:"long"},{name:"send_as",type:"flags.2?InputPeer"}],type:"Updates"},{id:233136337,method:"channels.getForumTopics",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"q",type:"flags.0?string"},{name:"offset_date",type:"int"},{name:"offset_id",type:"int"},{name:"offset_topic",type:"int"},{name:"limit",type:"int"}],type:"messages.ForumTopics"},{id:-1333584199,method:"channels.getForumTopicsByID",params:[{name:"channel",type:"InputChannel"},{name:"topics",type:"Vector"}],type:"messages.ForumTopics"},{id:-186670715,method:"channels.editForumTopic",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"topic_id",type:"int"},{name:"title",type:"flags.0?string"},{name:"icon_emoji_id",type:"flags.1?long"},{name:"closed",type:"flags.2?Bool"},{name:"hidden",type:"flags.3?Bool"}],type:"Updates"},{id:1814925350,method:"channels.updatePinnedForumTopic",params:[{name:"channel",type:"InputChannel"},{name:"topic_id",type:"int"},{name:"pinned",type:"Bool"}],type:"Updates"},{id:876830509,method:"channels.deleteTopicHistory",params:[{name:"channel",type:"InputChannel"},{name:"top_msg_id",type:"int"}],type:"messages.AffectedHistory"},{id:693150095,method:"channels.reorderPinnedForumTopics",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"order",type:"Vector"}],type:"Updates"},{id:1760814315,method:"channels.toggleAntiSpam",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-1471109485,method:"channels.reportAntiSpamFalsePositive",params:[{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"}],type:"Bool"},{id:-1632299963,method:"messages.setDefaultHistoryTTL",params:[{name:"period",type:"int"}],type:"Bool"},{id:1703637384,method:"messages.getDefaultHistoryTTL",params:[],type:"DefaultHistoryTTL"},{id:-127582169,method:"contacts.exportContactToken",params:[],type:"ExportedContactToken"},{id:318789512,method:"contacts.importContactToken",params:[{name:"token",type:"string"}],type:"User"},{id:-1189444673,method:"photos.uploadContactProfilePhoto",params:[{name:"flags",type:"#"},{name:"suggest",type:"flags.3?true"},{name:"save",type:"flags.4?true"},{name:"user_id",type:"InputUser"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"photos.Photo"},{id:1785624660,method:"channels.toggleParticipantsHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"}]},layer:151};var ts=a(745),as=a.n(ts),ss=a(4736),ns=a.n(ss);function is(e){return e>>>0}function rs(e,t){return e=is(e),t=is(t),ns()(e).shiftLeft(32).add(ns()(t))}const os=ns()(Number.MAX_SAFE_INTEGER),ps=ns()(ns()[2]).pow(64),ds=ps.divide(ns()[2]);function fs(e,t=256){return ns().fromArray(e instanceof Uint8Array?[...e]:e,t)}const cs=+es.API.constructors.find((e=>"boolFalse"===e.predicate)).id,ls=+es.API.constructors.find((e=>"boolTrue"===e.predicate)).id,ms=+es.API.constructors.find((e=>"vector"===e.predicate)).id,gs=+es.MTProto.constructors.find((e=>"gzip_packed"===e.predicate)).id,hs="slice";class us{constructor(e={}){this.maxLength=2048,this.offset=0,this.mtproto=!1,this.debug=!1,this.maxLength=e.startMaxLength||2048,this.mtproto=e.mtproto||!1,this.createBuffer()}createBuffer(){this.buffer=new ArrayBuffer(this.maxLength),this.intView=new Int32Array(this.buffer),this.byteView=new Uint8Array(this.buffer)}getArray(){const e=new ArrayBuffer(this.offset),t=new Int32Array(e);return t.set(this.intView.subarray(0,this.offset/4)),t}getBuffer(){return this.getArray().buffer}getBytes(e=!0){if(e){const e=new ArrayBuffer(this.offset),t=new Uint8Array(e);return t.set(this.byteView.subarray(0,this.offset)),t}const t=new Array(this.offset);for(let e=0;e>>",e.toString(16),e,t);const a=this.offset/4;return this.checkLength(4),this.intView[a]=e,this.offset+=4,a}storeInt(e,t){return this.writeInt(e,(t||"")+":int")}storeBool(e,t){e?this.writeInt(ls,(t||"")+":bool"):this.writeInt(cs,(t||"")+":bool")}storeLongP(e,t,a){this.writeInt(t,(a||"")+":long[low]"),this.writeInt(e,(a||"")+":long[high]")}storeLong(e,t){if(Array.isArray(e))return 2===e.length?this.storeLongP(e[0],e[1],t):this.storeIntBytes(e,64,t);const a=(s=ns()(e)).isNegative()?ps.add(s):s;var s;const{quotient:n,remainder:i}=a.divmod(4294967296),r=n.toJSNumber(),o=i.toJSNumber();this.writeInt(o,(t||"")+":long[low]"),this.writeInt(r,(t||"")+":long[high]")}storeDouble(e,t){const a=new ArrayBuffer(8),s=new Int32Array(a);new Float64Array(a)[0]=e,this.writeInt(s[0],(t||"")+":double[low]"),this.writeInt(s[1],(t||"")+":double[high]")}storeString(e,t){this.debug&&console.log(">>>",e,(t||"")+":string"),void 0===e&&(e="");const a=unescape(encodeURIComponent(e));this.checkLength(a.length+8);const s=a.length;s<=253?this.byteView[this.offset++]=s:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&s,this.byteView[this.offset++]=(65280&s)>>8,this.byteView[this.offset++]=(16711680&s)>>16);for(let e=0;e>>",T(e),(t||"")+":bytes");const a=e.length;for(this.checkLength(a+8),a<=253?this.byteView[this.offset++]=a:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&a,this.byteView[this.offset++]=(65280&a)>>8,this.byteView[this.offset++]=(16711680&a)>>16),this.byteView.set(e,this.offset),this.offset+=a;this.offset%4;)this.byteView[this.offset++]=0}storeIntBytes(e,t,a){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const s=e.length;if(t%32||8*s!==t){const n=new Error("Invalid bits: "+t+", "+s);throw console.error(n,e,a),n}this.debug&&console.log(">>>",T(e),(a||"")+":int"+t),this.checkLength(s),this.byteView.set(e,this.offset),this.offset+=s}storeRawBytes(e,t){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const a=e.length;this.debug&&console.log(">>>",T(e),t||""),this.checkLength(a),this.byteView.set(e,this.offset),this.offset+=a}storeMethod(e,t){const a=(this.mtproto?es.MTProto:es.API).methods.find((t=>t.method===e));if(!a)throw new Error("No method "+e+" found");this.storeInt(a.id,e+"[id]");const s=t.pFlags||t,n={};for(const i of a.params){let a=i.type;if(-1!==a.indexOf("?")){const e=a.split("?"),n=e[0].split(".");if(!(t[n[0]]&1<<+n[1])){if(!("true"===e[1]?s[i.name]:void 0!==t[i.name]))continue;t[n[0]]|=1<<+n[1]}a=e[1]}const r=this.storeObject(t[i.name],a,e+"["+i.name+"]");"#"===a&&(t[i.name]=t[i.name]||0,n[i.name]=r)}for(const e in n)this.intView[n[e]]=t[e];return a.type}storeObject(e,t,a){switch(t){case"#":e=e||0;case"int":return this.storeInt(e,a);case"long":return this.storeLong(e,a);case"int128":return this.storeIntBytes(e,128,a);case"int256":return this.storeIntBytes(e,256,a);case"int512":return this.storeIntBytes(e,512,a);case"string":return this.storeString(e,a);case"bytes":return this.storeBytes(e,a);case"double":return this.storeDouble(e,a);case"Bool":return this.storeBool(e,a);case"true":return}if(Array.isArray(e)){if("Vector"===t.substr(0,6))this.writeInt(ms,a+"[id]");else if("vector"!==t.substr(0,6))throw new Error("Invalid vector type "+t);const s=t.substr(7,t.length-8);this.writeInt(e.length,a+"[count]");for(let t=0;te.predicate===n));if((i="%"===t.charAt(0))&&(t=t.substr(1)),!r)throw new Error("No predicate "+n+" found");n===t&&(i=!0),i||this.writeInt(r.id,a+"["+n+"][id]");const o=e.pFlags,p={};for(const t of r.params){let s=t.type;if(-1!==s.indexOf("?")){const a=s.split("?"),n=a[0].split(".");if(!(e[n[0]]&1<<+n[1])){if(!("true"===a[1]?o&&o[t.name]:void 0!==e[t.name]))continue;e[n[0]]|=1<<+n[1]}s=a[1]}const i=this.storeObject(e[t.name],s,a+"["+n+"]["+t.name+"]");"#"===s&&(e[t.name]=e[t.name]||0,p[t.name]=i)}for(const t in p)this.intView[p[t]]=e[t];return r.type}}class ys{constructor(e,t={}){this.offset=0,this.mtproto=!1,e instanceof ArrayBuffer?(this.buffer=e,this.intView=new Int32Array(e),this.byteView=new Uint8Array(this.buffer)):(this.buffer=e.buffer,this.intView=new Int32Array(e.buffer),this.byteView=e),this.override=t.override||{},this.mtproto=!!t.mtproto,this.debug=void 0!==t.debug&&t.debug}readInt(e){if(this.byteView.length-this.offset<4)throw console.error(this.byteView,this.offset),new Error("Nothing to fetch: "+e);const t=this.intView[this.offset/4];return this.debug&&console.log("<<<",t.toString(16),t,e,this.byteView.slice(this.offset-16,this.offset+16),T(this.byteView.slice(this.offset-16,this.offset+16))),this.offset+=4,t}fetchInt(e){return this.readInt((e||"")+":int")}fetchDouble(e){const t=new ArrayBuffer(8),a=new Int32Array(t),s=new Float64Array(t);return a[0]=this.readInt((e||"")+":double[low]"),a[1]=this.readInt((e||"")+":double[high]"),s[0]}fetchLong(e){const t=this.readInt((e||"")+":long[low]");let a=rs(this.readInt((e||"")+":long[high]"),t);var s;return this.mtproto||(a=(s=a).greater(ds)?s.minus(ps):s),!this.mtproto&&os.greaterOrEquals(a.abs())?a.toJSNumber():a.toString(10)}fetchBool(e){const t=this.readInt((e||"")+":bool");return t===ls||t!==cs&&(this.offset-=4,this.fetchObject("Object",e))}fetchString(e){let t=this.byteView[this.offset++];254===t&&(t=this.byteView[this.offset++]|this.byteView[this.offset++]<<8|this.byteView[this.offset++]<<16);let a,s="";for(let e=0;ethis.byteView.byteLength)throw new Error("Invalid raw bytes length: "+e+", buffer len: "+this.byteView.byteLength);if(t){const t=new Uint8Array(e);return t.set(this.byteView[hs](this.offset,this.offset+e)),this.offset+=e,t}const s=new Array(e);for(let t=0;t0){const n=e.substr(7,e.length-8);for(let e=0;ee.type===t)),!s)throw new Error("Constructor not found for type: "+e)}else{const r=this.readInt(t+"[id]");if(r===gs){const a=(i=this.fetchBytes(t+"[packed_string]"),as().inflate(i,void 0));return new ys(a).fetchObject(e,t)}if(r===ms)return this.fetchVector(e,t);let o=a.constructorsIndex;if(!o){a.constructorsIndex=o={};for(let e=0,t=a.constructors.length;e0&&r{var e;if(this.pingDelayDisconnectDeferred||!this.transport||!this.transport.connected)return;const t=this.pingDelayDisconnectDeferred=(0,v.Z)(),a=this.delays,s=this.delays.pingMaxTime,n=Math.min(null!==(e=this.lastPingTime)&&void 0!==e?e:0,s),i=Math.round(a.disconnectDelayMin+n/s*(a.disconnectDelayMax-a.disconnectDelayMin)),r=1e3*i,o=this.lastPingStartTime=Date.now(),p=this.lastPingDelayDisconnectId=(0,Te.a)(),d={notContentRelated:!0};this.wrapMtpCall("ping_delay_disconnect",{ping_id:p,disconnect_delay:i},d);const f=this.log.bindPrefix("sendPingDelayDisconnect");this.debug&&f.debug(`ping, timeout=${r}, lastPingTime=${this.lastPingTime}, msgId=${d.messageId}, pingId=${p}`);const c=E.Z.setTimeout(t.reject,r);t.then((e=>{clearTimeout(c);const t=Date.now()-o;if(this.lastPingTime=t/1e3,this.debug&&f.debug(`pong, reason='${e}', time=${n}, msgId=${d.messageId}`),t>r)throw void 0;return(0,P.Z)(Math.max(0,this.delays.pingInterval-t))})).catch((()=>{clearTimeout(c);const e=this.transport;this.pingDelayDisconnectDeferred===t&&(null==e?void 0:e.connection)&&(f.error("catch, closing connection",this.lastPingTime,d.messageId),e.connection.close())})).finally((()=>{this.pingDelayDisconnectDeferred===t&&(this.pingDelayDisconnectDeferred=void 0,this.sendPingDelayDisconnect())}))},this.checkLongPoll=()=>{const e=this.cleanupSent();if(this.longPollPending&&Date.now(){e&&(t!==this.dcId||this.sleepAfter&&Date.now()>this.sleepAfter)||this.sendLongPoll()}))},this.checkConnection=e=>{if(this.debug&&this.log("Check connection",e),this.clearCheckConnectionTimeout(),!this.transport)return void this.log.warn("No transport for checkConnection");const t=new us({mtproto:!0}),a=(0,Te.a)();t.storeMethod("ping",{ping_id:a});const s={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(!0),body:t.getBytes(!0)};this.offline&&this.setConnectionStatus(U.Q.Connecting),this.sendEncryptedRequest(s).then((()=>{this.toggleOffline(!1)}),(()=>{this.debug&&this.log("Delay",1e3*this.checkConnectionPeriod),this.checkConnectionTimeout=E.Z.setTimeout((()=>this.checkConnection("from failed checkConnection request")),1e3*this.checkConnectionPeriod|0),this.checkConnectionPeriod=Math.min(60,1.5*this.checkConnectionPeriod)}))},this.authKeyUint8=(0,bs.Z)(this.authKey),this.serverSalt=(0,bs.Z)(i),this.isFileUpload=!!r.fileUpload,this.isFileDownload=!!r.fileDownload,this.isFileNetworker=this.isFileUpload||this.isFileDownload,this.delays=this.isFileNetworker?Is.file:Is.client;const o=this.isFileUpload?"-U":this.isFileDownload?"-D":"";this.name="NET-"+a+o,this.log=(0,I.kg)(this.name+(o?"":"-C")+"-"+ws++,I.v9.Log|I.v9.Error|I.v9.Warn),this.log("constructor"),this.updateSession()}updateSession(){this.seqNo=0,this.prevSessionId=this.sessionId,this.sessionId=w(new Uint8Array(8))}updateSentMessage(e){const t=this.sentMessages[e];return!!t&&(t.container&&(0,ne.Z)(t.inner,((e,a)=>{const s=this.updateSentMessage(e);s?t.inner[a]=s.msg_id:t.inner.splice(a,1)})),t.msg_id=this.timeManager.generateId(),t.seq_no=this.generateSeqNo(t.notContentRelated||t.container),this.debug&&this.log(`updateSentMessage, old=${e}, new=${t.msg_id}`),this.sentMessages[t.msg_id]=t,delete this.sentMessages[e],t)}generateSeqNo(e){let t=2*this.seqNo;return e||(t++,this.seqNo++),t}wrapMtpCall(e,t,a){const s=new us({mtproto:!0});s.storeMethod(e,t);const n=this.timeManager.generateId(),i=this.generateSeqNo(),r={msg_id:n,seq_no:i,body:s.getBytes(!0)};return b.Z.debug&&this.log("MT call",e,t,n,i),this.pushMessage(r,a)}wrapMtpMessage(e,t){const a=new us({mtproto:!0});a.storeObject(e,"Object");const s=this.timeManager.generateId(),n=this.generateSeqNo(t.notContentRelated),i={msg_id:s,seq_no:n,body:a.getBytes(!0)};return b.Z.debug&&this.log("MT message",e,s,n),this.pushMessage(i,t)}wrapApiCall(e,t={},a={}){const s=new us(a);if(!this.connectionInited){const e=es.API.methods.find((e=>"invokeWithLayer"===e.method));if(!e)throw new Error("no invokeWithLayer!");s.storeInt(+e.id,"invokeWithLayer"),s.storeInt(es.layer,"layer");const t=es.API.methods.find((e=>"initConnection"===e.method));if(!t)throw new Error("no initConnection!");s.storeInt(+t.id,"initConnection"),s.storeInt(0,"flags"),s.storeInt(_.Z.id,"api_id"),s.storeString(i().USER_AGENT||"Unknown UserAgent","device_model"),s.storeString(navigator.platform||"Unknown Platform","system_version"),s.storeString(_.Z.version+(_.Z.isMainDomain?" "+_.Z.suffix:""),"app_version"),s.storeString(navigator.language||"en","system_lang_code"),s.storeString(_.Z.langPack,"lang_pack"),s.storeString(this.networkerFactory.language,"lang_code")}if(a.afterMessageId){if(void 0===Cs){const e=es.API.methods.find((e=>"invokeAfterMsg"===e.method));Cs=e?+e.id:0}Cs?(s.storeInt(Cs,"invokeAfterMsg"),s.storeLong(a.afterMessageId,"msg_id")):this.log.error("no invokeAfterMsg!")}a.resultType=s.storeMethod(e,t);const n={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(),body:s.getBytes(!0),isAPI:!0};return b.Z.debug?this.log("Api call",e,n,t,a):this.debug&&this.log("Api call",e,t,a),this.pushMessage(n,a)}changeTransport(e){const t=this.transport;t&&(t.destroy(),this.nextReqTimeout&&(clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0),this.connectionInited=!1,void 0!==this.longPollInterval&&(clearInterval(this.longPollInterval),this.longPollInterval=void 0),this.clearCheckConnectionTimeout()),this.log("change transport",e,t),this.clearPingDelayDisconnect(),this.transport=e,e&&(e.networker=this,e instanceof S&&(this.longPollInterval=E.Z.setInterval(this.checkLongPoll,1e4),this.checkLongPoll(),this.checkConnection("changed transport")),e.connection&&e.connected&&this.setConnectionStatus(U.Q.Connected),this.resend())}destroy(){this.log("destroy")}forceReconnectTimeout(){this.transport.reconnect?this.transport.reconnect():this.resend()}forceReconnect(){this.transport.forceReconnect?this.transport.forceReconnect():this.checkConnection("force reconnect")}clearPingDelayDisconnect(){const e=this.pingDelayDisconnectDeferred;this.pingDelayDisconnectDeferred=void 0,this.lastPingDelayDisconnectId=void 0,e&&e.reject()}sendLongPoll(){this.sendingLongPoll||(this.sendingLongPoll=!0,this.longPollPending=Date.now()+25e3,this.debug&&this.log.debug("sendLongPoll",this.longPollPending),this.wrapMtpCall("http_wait",{max_delay:500,wait_after:150,max_wait:25e3},{noResponse:!0,longPoll:!0}).then((()=>{this.longPollPending=void 0,setTimeout(this.checkLongPoll,0)}),(e=>{this.log("Long-poll failed",e)})).finally((()=>{this.sendingLongPoll=void 0})))}clearCheckConnectionTimeout(){void 0!==this.checkConnectionTimeout&&(clearTimeout(this.checkConnectionTimeout),this.checkConnectionTimeout=void 0)}toggleOffline(e){if(this.offline!==e)if(this.offline=e,this.clearCheckConnectionTimeout(),e){clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0,this.checkConnectionPeriod<1.5&&(this.checkConnectionPeriod=0);const e=1e3*this.checkConnectionPeriod|0;this.checkConnectionRetryAt=Date.now()+e,this.setConnectionStatus(U.Q.Closed,this.checkConnectionRetryAt),this.checkConnectionTimeout=E.Z.setTimeout((()=>this.checkConnection("from toggleOfline")),e),this.checkConnectionPeriod=Math.min(30,1.5*(1+this.checkConnectionPeriod))}else this.setConnectionStatus(U.Q.Connected),this.checkLongPoll(),this.scheduleRequest();this.setConnectionStatus(e?U.Q.Closed:U.Q.Connected,e?this.checkConnectionRetryAt:void 0)}handleSentEncryptedRequestHTTP(e,t,a){e.then((e=>(this.toggleOffline(!1),this.parseResponse(e).then((e=>(this.debug&&this.log.debug("Server response",e),this.processMessage(e.response,e.messageId,e.sessionId),this.checkLongPoll(),this.checkConnectionPeriod=Math.max(1.1,Math.sqrt(this.checkConnectionPeriod)),!0))))),(e=>(this.log.error("Encrypted request failed",e,t),this.pushResend(t.msg_id),this.toggleOffline(!0),!1))).then((e=>{const t=this.sentMessages;a.forEach((a=>{const s=t[a];if(s){const n=s.deferred;delete t[a],delete this.pendingMessages[a],e?n.resolve():n.reject()}}))}))}pushMessage(e,t){let a;return t.notContentRelated&&!t.noResponse||(a=(0,v.Z)()),this.sentMessages[e.msg_id]=Object.assign(e,t,a?{deferred:a}:void 0),this.pendingMessages[e.msg_id]=0,t.noSchedule||this.scheduleRequest(),(0,fe.Z)(t)&&(t.messageId=e.msg_id),a}attachPromise(e,t){const a=setTimeout((()=>{this.lastResponseTime&&Date.now()-this.lastResponseTime{clearTimeout(a),this.setConnectionStatus(U.Q.Connected),--this.activeRequests,this.setDrainTimeout()})),++this.activeRequests,void 0!==this.onDrainTimeout&&(clearTimeout(this.onDrainTimeout),this.onDrainTimeout=void 0)}setDrainTimeout(){!this.activeRequests&&this.onDrain&&void 0===this.onDrainTimeout&&(this.onDrainTimeout=E.Z.setTimeout((()=>{this.onDrainTimeout=void 0,this.log("drain"),this.onDrain()}),1e4))}setConnectionStatus(e,t){var a;const s=e===U.Q.Connected,n=this.status!==e;this.isOnline=s,this.status=e,n&&(this.networkerFactory.onConnectionStatusChange&&this.networkerFactory.onConnectionStatusChange({_:"networkerStatus",status:e,dcId:this.dcId,name:this.name,isFileNetworker:this.isFileNetworker,isFileDownload:this.isFileDownload,isFileUpload:this.isFileUpload,retryAt:t}),this.isOnline&&this.scheduleRequest(),(null===(a=this.transport)||void 0===a?void 0:a.connection)&&(this.clearPingDelayDisconnect(),this.sendPingDelayDisconnect()))}pushResend(e,t=100){const a=t?Date.now()+t:0,s=this.sentMessages[e];if(s.container)for(const e of s.inner)this.pendingMessages[e]=a;else this.pendingMessages[e]=a;s.acked&&this.log.error("pushResend: acked message?",s),this.debug&&this.log.debug("pushResend:",e,s,this.pendingMessages,t),this.scheduleRequest(t)}getMsgKey(e,t){return Ms(this,void 0,void 0,(function*(){const a=t?0:8,n=(0,_s.Z)(this.authKeyUint8.subarray(88+a,88+a+32),e),i=yield s.Z.invokeCrypto("sha256",n);return new Uint8Array(i).subarray(8,24)}))}getAesKeyIv(e,t){const a=t?0:8,n=new Uint8Array(52),i=new Uint8Array(52),r=[];return n.set(e,0),n.set(this.authKeyUint8.subarray(a,a+36),16),r.push(s.Z.invokeCrypto("sha256",n)),i.set(this.authKeyUint8.subarray(40+a,40+a+36),0),i.set(e,36),r.push(s.Z.invokeCrypto("sha256",i)),Promise.all(r).then((e=>{const t=new Uint8Array(32),a=new Uint8Array(32),s=new Uint8Array(e[0]),n=new Uint8Array(e[1]);return t.set(s.subarray(0,8)),t.set(n.subarray(8,24),8),t.set(s.subarray(24,32),24),a.set(n.subarray(0,8)),a.set(s.subarray(8,24),8),a.set(n.subarray(24,32),24),[t,a]}))}isStopped(){return this.networkerFactory.akStopped&&!this.isFileNetworker}performScheduledRequest(){if(this.isStopped())return!1;if(this.pendingAcks.length){const e=this.pendingAcks.slice();this.wrapMtpMessage({_:"msgs_ack",msg_ids:e},{notContentRelated:!0,noSchedule:!0})}const e=this.pendingResendReq.length;if(e){const t=Object.assign({},Ss),a=this.pendingResendReq.splice(0,e);this.wrapMtpMessage({_:"msg_resend_req",msg_ids:a},t),this.log("resend: resending requests",t.messageId,a)}let t;const a=[];let s=0,n=!1,i=!1,r=!1;const o=Object.keys(this.pendingMessages).map((e=>ns()(e))).sort(((e,t)=>e.compare(t))).map((e=>e.toString(10)));for(const e of o){const o=this.sentMessages[e];if(o&&o.body){const e=o.body.length+32;if(s+e>655360&&(this.log.warn("lengthOverflow",o,a),r=!0,t))break;a.push(o),s+=e,o.isAPI?n=!0:o.longPoll&&(i=!0),t=o}delete this.pendingMessages[e]}if(this.transport instanceof S&&n&&!i){const e=new us({mtproto:!0});e.storeMethod("http_wait",{max_delay:500,wait_after:150,max_wait:3e3}),a.push({msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(),body:e.getBytes(!0)})}if(!a.length)return;const p=a.filter((e=>e.noResponse)).map((e=>e.msg_id));if(a.length>1){const e=this.generateContainerMessage(s,a);t=e.messageWithBody,this.sentMessages[t.msg_id]=e.message}else this.sentMessages[t.msg_id]=t;this.pendingAcks=[];const d=this.sendEncryptedRequest(t);this.transport instanceof S&&this.handleSentEncryptedRequestHTTP(d,t,p),this.transport instanceof S||this.cleanupSent(),r&&this.scheduleRequest()}generateContainerMessage(e,t){const a=new us({mtproto:!0,startMaxLength:e+64});a.storeInt(1945237724,"CONTAINER[id]"),a.storeInt(t.length,"CONTAINER[count]");const s=[];t.forEach(((e,t)=>{s.push(e.msg_id),a.storeLong(e.msg_id,"CONTAINER["+t+"][msg_id]"),a.storeInt(e.seq_no,"CONTAINER["+t+"][seq_no]"),a.storeInt(e.body.length,"CONTAINER["+t+"][bytes]"),a.storeRawBytes(e.body,"CONTAINER["+t+"][body]")}));const n={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(!0),container:!0,inner:s};return b.Z.debug&&this.log.warn("Container",s,n.msg_id,n.seq_no),{message:n,messageWithBody:Object.assign({body:a.getBytes(!0)},n)}}getEncryptedMessage(e){return Ms(this,void 0,void 0,(function*(){const t=yield this.getMsgKey(e,!0),a=yield this.getAesKeyIv(t,!0);return{bytes:yield s.Z.invokeCrypto("aes-encrypt",e,a[0],a[1]),msgKey:t}}))}getDecryptedMessage(e,t){return this.getAesKeyIv(e,!1).then((e=>s.Z.invokeCrypto("aes-decrypt",t,e[0],e[1])))}getEncryptedOutput(e){const t=new us({startMaxLength:e.body.length+2048});t.storeIntBytes(this.serverSalt,64,"salt"),t.storeIntBytes(this.sessionId,64,"session_id"),t.storeLong(e.msg_id,"message_id"),t.storeInt(e.seq_no,"seq_no"),t.storeInt(e.body.length,"message_data_length"),t.storeRawBytes(e.body,"message_data");const a=t.getBuffer(),s=16-t.getOffset()%16+16*(1+(0,Te.d)(8)%5),n=w(new Uint8Array(s)),i=(0,_s.Z)(a,n);return this.getEncryptedMessage(i).then((e=>{const t=new us({startMaxLength:e.bytes.length+256});return t.storeIntBytes(this.authKeyId,64,"auth_key_id"),t.storeIntBytes(e.msgKey,128,"msg_key"),t.storeRawBytes(e.bytes,"encrypted_data"),t.getBytes(!0)}))}sendEncryptedRequest(e){return Ms(this,void 0,void 0,(function*(){const t=yield this.getEncryptedOutput(e);this.transport||this.log.error("trying to send something when offline",this.transport,this),this.debug&&this.log.debug("sending:",e,[e.msg_id].concat(e.inner||[]),t.length);const a=this.transport?this.transport.send(t):Promise.reject({});if(!(this.transport instanceof S))return a;const s={code:406,type:"NETWORK_BAD_RESPONSE",transport:this.transport};return a.then((e=>{if(!(null==e?void 0:e.byteLength))throw s;return e}),(e=>{throw e.message||e.type||(e=Object.assign(s,{type:"NETWORK_BAD_REQUEST",originalError:e})),e}))}))}parseResponse(e){this.lastResponseTime=Date.now();const t=new ys(e),a=t.fetchIntBytes(64,!0,"auth_key_id");if(!(0,Ps.Z)(a,this.authKeyId))throw new Error("[MT] Invalid server auth_key_id: "+T(a));const s=t.fetchIntBytes(128,!0,"msg_key"),n=t.fetchRawBytes(e.byteLength-t.getOffset(),!0,"encrypted_data");return this.getDecryptedMessage(s,n).then((e=>this.getMsgKey(e,!1).then((t=>{if(!(0,Ps.Z)(s,t))throw this.log.warn("[MT] msg_keys",s,t),this.updateSession(),new Error("[MT] server msgKey mismatch, updating session");let a=new ys(e,{mtproto:!0});a.fetchIntBytes(64,!0,"salt");const n=a.fetchIntBytes(64,!0,"session_id"),i=a.fetchLong("message_id");if(!((0,Ps.Z)(n,this.sessionId)||this.prevSessionId&&(0,Ps.Z)(n,this.prevSessionId)))throw this.log.warn("Sessions",n,this.sessionId,this.prevSessionId,e),new Error("[MT] Invalid server session_id: "+T(n));const r=a.fetchInt("seq_no"),o=e.byteLength,p=a.fetchInt("message_data[length]");let d=a.getOffset();if(p%4||p>o-d)throw new Error("[MT] Invalid body length: "+p);const f=a.fetchRawBytes(p,!0,"message_data");d=a.getOffset();const c=o-d;if(c<12||c>1024)throw new Error("[MT] Invalid padding length: "+c);return a=new ys(f,{mtproto:!0,override:{mt_message:(e,t)=>{e.msg_id=a.fetchLong(t+"[msg_id]"),e.seqno=a.fetchInt(t+"[seqno]"),e.bytes=a.fetchInt(t+"[bytes]");const s=a.getOffset();try{e.body=a.fetchObject("Object",t+"[body]")}catch(t){this.log.error("parse error",t.message,t.stack),e.body={_:"parse_error",error:t}}a.getOffset()!==s+e.bytes&&a.setOffset(s+e.bytes)},mt_rpc_result:(e,t)=>{e.req_msg_id=a.fetchLong(t+"[req_msg_id]");const s=this.sentMessages[e.req_msg_id],n=s&&s.resultType||"Object";e.req_msg_id&&!s||(e.result=a.fetchObject(n,t+"[result]"))}}}),{response:a.fetchObject("","INPUT"),messageId:i,sessionId:n,seqNo:r}}))))}applyServerSalt(e){const t=(a=e,vs((s=ns()(a),new Uint8Array(s.toArray(256).value)).reverse(),8,!0,!1,!1));var a,s;qa.Z.set({["dc"+this.dcId+"_server_salt"]:T(t)}),this.serverSalt=new Uint8Array(t)}scheduleRequest(e){this.transport instanceof S&&(this.offline&&this.checkConnection("forced schedule"),e||(e=0));const t=Date.now()+(e||0);if(this.nextReq&&(void 0===e||this.nextReq<=t))return;this.nextReqTimeout&&clearTimeout(this.nextReqTimeout);const a=()=>{this.nextReqTimeout=0,this.nextReq=0,this.transport instanceof S&&this.offline||this.performScheduledRequest()};this.nextReq=t,void 0!==e?this.nextReqTimeout=E.Z.setTimeout(a,e):a()}ackMessage(e){let t;this.pendingAcks.push(e),this.transport instanceof S&&(t=3e4),this.scheduleRequest(t)}reqResend(e){this.debug&&this.log.debug("Req resend",e),this.pendingResendReq.push(e),this.scheduleRequest(100)}cleanupSent(){let e=!1;const t=this.sentMessages;return Object.keys(t).forEach((a=>{const s=t[a];if(s.notContentRelated&&void 0===this.pendingMessages[a])delete t[a];else if(s.container){for(const a of s.inner)if(void 0!==t[a])return void(e=!0);delete t[a]}else e=!0})),!e}processMessageAck(e){const t=this.sentMessages[e];t&&!t.acked&&(t.acked=!0)}processError(e){const t=(e.error_message||"").match(/^([A-Z_0-9]+\b)(: (.+))?/)||[];return e.error_code=e.error_code,{code:!e.error_code||e.error_code<=0?500:e.error_code,type:t[1]||"UNKNOWN",description:t[3]||"CODE#"+e.error_code+" "+e.error_message,originalError:e}}resend(){const e=this.sentMessages;for(const t in e){const a=e[t];(a.body||a.container)&&this.pushResend(t)}this.transport.connection&&(this.clearPingDelayDisconnect(),this.sendPingDelayDisconnect())}applyServerTime(e){const t=ns()(e).shiftRight(32).toJSNumber();return this.log("applying server time",t),this.timeManager.applyServerTime(t)}processMessage(e,t,a){if("messageEmpty"!==e._)if(parseInt(t.substr(0,-10),10)%2)this.log.warn("Server even message id: ",t,e);else switch(this.debug&&this.log.debug("process message",e,t),this.pingDelayDisconnectDeferred&&this.pingDelayDisconnectDeferred.resolve("any message"),e._){case"msg_container":for(const t of e.messages)this.processMessage(t,t.msg_id,a);break;case"bad_server_salt":this.log("Bad server salt",e),this.applyServerSalt(e.new_server_salt),this.sentMessages[e.bad_msg_id]&&this.pushResend(e.bad_msg_id),this.ackMessage(t);break;case"bad_msg_notification":switch(this.log.error("Bad msg notification",e),e.error_code){case 16:case 17:case 32:case 33:case 64:{const a=this.applyServerTime(t);(17===e.error_code||a)&&(this.log("Update session"),this.updateSession());const s=this.updateSentMessage(e.bad_msg_id);s&&this.pushResend(s.msg_id)}}break;case"message":if(-1!==this.lastServerMessages.indexOf(t))return void this.ackMessage(t);this.lastServerMessages.push(t),this.lastServerMessages.length>100&&this.lastServerMessages.shift(),this.processMessage(e.body,e.msg_id,a);break;case"new_session_created":this.ackMessage(t),this.debug&&this.log.debug("new_session_created",e),this.processMessageAck(e.first_msg_id),this.applyServerSalt(e.server_salt),qa.Z.get("dc").then((t=>{t===this.dcId&&!this.isFileNetworker&&this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}));break;case"msgs_ack":this.debug&&this.log("got acks",e.msg_ids);for(const t of e.msg_ids)this.processMessageAck(t);break;case"msg_detailed_info":if(!this.sentMessages[e.msg_id]){this.ackMessage(e.answer_msg_id);break}case"msg_new_detailed_info":if(-1!==this.pendingAcks.indexOf(e.answer_msg_id))break;this.reqResend(e.answer_msg_id);break;case"msgs_state_info":{this.ackMessage(e.answer_msg_id);const t=[[this.lastResendReq,this.pendingResendReq]];for(const[a,s]of t)if((null==a?void 0:a.reqMsgId)===e.req_msg_id&&s.length)for(const e of a.msgIds){const t=s.indexOf(e);-1!==t&&s.splice(t,1)}break}case"rpc_result":{this.ackMessage(t);const a=e.req_msg_id,s=this.sentMessages[a];if(this.debug&&this.log("Rpc response",e.result,s),this.processMessageAck(a),s){const t=s.deferred;if("rpc_error"===e.result._){const a=this.processError(e.result);this.log("Rpc error",a),t&&t.reject(a)}else t&&t.resolve(e.result),s.isAPI&&!this.connectionInited&&(this.connectionInited=!0);delete this.sentMessages[a]}else this.debug&&this.log("Rpc result for unknown message:",a,e);break}case"pong":{const t=e.ping_id;if(this.lastPingDelayDisconnectId===t){const e=this.pingDelayDisconnectDeferred;e?e.resolve("pong"):this.log("ping deferred deleted",t)}break}default:this.ackMessage(t),null!==this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}else this.log.warn("processMessage: messageEmpty",e,t)}}class As extends G{constructor(){super(...arguments),this.networkers=[],this.language=navigator.language||_.Z.langPackCode,this.updatesProcessor=null,this.akStopped=!1}onConnectionStatusChange(e){this.rootScope.dispatchEvent("connection_status_change",e)}removeNetworker(e){(0,M.Z)(this.networkers,e)}setUpdatesProcessor(e){this.updatesProcessor=e}getNetworker(e,t,a,s,n){const i=new ks(this,this.timeManager,e,t,a,s,n);return this.networkers.push(i),i}startAll(){if(this.akStopped){const e=this.networkers.filter((e=>e.isStopped()));this.akStopped=!1,this.updatesProcessor&&this.updatesProcessor({_:"new_session_created"});for(const t of e)t.scheduleRequest()}}stopAll(){this.akStopped=!0}setLanguage(e){this.language=e;for(const e of this.networkers)e.isFileNetworker||(e.connectionInited=!1)}unsetConnectionInited(){for(const e of this.networkers)e.connectionInited=!1}forceReconnectTimeout(){for(const e of this.networkers)e.forceReconnectTimeout()}forceReconnect(){for(const e of this.networkers)if(!e.isFileNetworker){e.forceReconnect();break}}}const Ds=new class{constructor(){this.testPublicKeysHex=[{modulus:"c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5",exponent:"010001"}],this.publisKeysHex=[{modulus:"e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3",exponent:"010001"}],this.publicKeysParsed={},this.prepared=!1,this.preparePromise=null,b.Z.test&&(this.publisKeysHex=this.testPublicKeysHex)}prepare(){return this.preparePromise?this.preparePromise:this.prepared?Promise.resolve():this.preparePromise=Promise.all(this.publisKeysHex.map((e=>{const t=new us;t.storeBytes((0,Ha.Z)(e.modulus),"n"),t.storeBytes((0,Ha.Z)(e.exponent),"e");const a=t.getBuffer();return s.Z.invokeCrypto("sha1",a).then((t=>{const a=t.slice(-8);a.reverse(),this.publicKeysParsed[T(a).toLowerCase()]={modulus:e.modulus,exponent:e.exponent}}))}))).then((()=>{this.prepared=!0,this.preparePromise=null}))}select(e){return t=this,a=void 0,n=function*(){yield this.prepare();for(let t=0;t{if(d.ZP&&this.log("mtpSendPlainRequest: in good sector",e),!e||!e.byteLength)throw o;try{const t=new ys(e,{mtproto:!0});if(4===e.length){const e=t.fetchInt();throw this.log.error("mtpSendPlainRequest: wrong response, error code:",e),e}const a=t.fetchLong("auth_key_id");"0"!==a&&this.log.error("auth_key_id !== 0",a);const s=t.fetchLong("msg_id");"0"===s&&this.log.error("msg_id === 0",s);const n=t.fetchInt("msg_len");return n||this.log.error("no msg_len",n),t}catch(e){throw this.log.error("mtpSendPlainRequest: deserialization went bad",e),Object.assign(o,{originalError:e})}}),(e=>{throw e.message||e.type||(e=Object.assign(o,{originalError:e})),e}))}sendReqPQ(e){return Ts(this,void 0,void 0,(function*(){const t=new us({mtproto:!0});let a;t.storeMethod("req_pq_multi",{nonce:e.nonce}),d.ZP&&this.log("Send req_pq",T(e.nonce));try{const s=this.sendPlainRequest(e.dcId,t.getBytes(!0));Ds.prepare(),a=yield s}catch(e){throw this.log.error("req_pq error",e.message),e}const n=a.fetchObject("ResPQ");if("resPQ"!==n._)throw new Error("[MT] resPQ response invalid: "+n._);if(!(0,Ps.Z)(e.nonce,n.nonce))throw this.log.error(e.nonce,n.nonce),new Error("[MT] resPQ nonce mismatch");e.serverNonce=n.server_nonce,e.pq=n.pq,e.fingerprints=n.server_public_key_fingerprints,d.ZP&&this.log("Got ResPQ",T(e.serverNonce),T(e.pq),e.fingerprints);const i=yield Ds.select(e.fingerprints);if(!i)throw new Error("[MT] No public key found");e.publicKey=i,d.ZP&&this.log("PQ factorization start",e.pq);try{var r=yield s.Z.invokeCrypto("factorize",e.pq)}catch(e){throw this.log.error("worker error factorize",e),e}return e.p=r[0],e.q=r[1],d.ZP&&this.log("PQ factorization done",r),this.sendReqDhParams(e)}))}sendReqDhParams(e){return Ts(this,void 0,void 0,(function*(){e.newNonce=w(new Uint8Array(32));const t={_:"p_q_inner_data_dc",pq:e.pq,p:e.p,q:e.q,nonce:e.nonce,server_nonce:e.serverNonce,new_nonce:e.newNonce,dc:0},a=new us({mtproto:!0});a.storeObject(t,"P_Q_inner_data","DECRYPTED_DATA");const n=a.getBytes(!0);if(n.length>144)throw"DH_params: data is more than 144 bytes!";const i=vs(n,192,!1,!0,!1),r=i.slice().reverse(),o=yield(()=>Ts(this,void 0,void 0,(function*(){for(;;){const t=w(new Uint8Array(32)),a=r.concat(yield s.Z.invokeCrypto("sha256",t.concat(i)));if(224!==a.length)throw"DH_params: dataWithHash !== 224 bytes!";const n=yield s.Z.invokeCrypto("aes-encrypt",a,t,new Uint8Array([0])),o=Us(t,yield s.Z.invokeCrypto("sha256",n)).concat(n),p=fs(o),d=ns()(e.publicKey.modulus,16);if(-1===p.compare(d))return o}})))(),p=vs(yield s.Z.invokeCrypto("rsa-encrypt",o,e.publicKey),256,!0,!0,!0),f={nonce:e.nonce,server_nonce:e.serverNonce,p:e.p,q:e.q,public_key_fingerprint:e.publicKey.fingerprint,encrypted_data:p},c=new us({mtproto:!0});c.storeMethod("req_DH_params",f);const l=c.getBytes(!0);let m;d.ZP&&this.log("Send req_DH_params",f);try{m=yield this.sendPlainRequest(e.dcId,l)}catch(e){throw this.log.error("Send req_DH_params FAIL!",e),e}const g=m.fetchObject("Server_DH_Params","RESPONSE");if(d.ZP&&this.log("Sent req_DH_params, response:",g),"server_DH_params_fail"!==g._&&"server_DH_params_ok"!==g._)throw new Error("[MT] Server_DH_Params response invalid: "+g._);if(!(0,Ps.Z)(e.nonce,g.nonce))throw new Error("[MT] Server_DH_Params nonce mismatch");if(!(0,Ps.Z)(e.serverNonce,g.server_nonce))throw new Error("[MT] Server_DH_Params server_nonce mismatch");if("server_DH_params_fail"===g._){const t=(yield s.Z.invokeCrypto("sha1",e.newNonce)).slice(-16);if(!(0,Ps.Z)(t,g.new_nonce_hash))throw new Error("[MT] server_DH_params_fail new_nonce_hash mismatch");throw new Error("[MT] server_DH_params_fail")}try{yield this.decryptServerDhDataAnswer(e,g.encrypted_answer)}catch(e){throw this.log.error("mtpDecryptServerDhDataAnswer FAILED!",e),e}return this.sendSetClientDhParams(e)}))}decryptServerDhDataAnswer(e,t){return Ts(this,void 0,void 0,(function*(){e.localTime=Date.now(),e.tmpAesKey=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat(e.serverNonce))).concat((yield s.Z.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(0,12)),e.tmpAesIv=(yield s.Z.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(12).concat(yield s.Z.invokeCrypto("sha1",e.newNonce.concat(e.newNonce)),e.newNonce.slice(0,4));const a=new Uint8Array(yield s.Z.invokeCrypto("aes-decrypt",t,e.tmpAesKey,e.tmpAesIv)),n=a.slice(0,20),i=a.slice(20),r=new ys(i,{mtproto:!0}),o=r.fetchObject("Server_DH_inner_data");if("server_DH_inner_data"!==o._)throw new Error("[MT] server_DH_inner_data response invalid: "+o);if(!(0,Ps.Z)(e.nonce,o.nonce))throw new Error("[MT] server_DH_inner_data nonce mismatch");if(!(0,Ps.Z)(e.serverNonce,o.server_nonce))throw new Error("[MT] server_DH_inner_data serverNonce mismatch");d.ZP&&this.log("Done decrypting answer"),e.g=o.g,e.dhPrime=o.dh_prime,e.gA=o.g_a,e.serverTime=o.server_time,e.retry=0,this.verifyDhParams(e.g,e.dhPrime,e.gA);const p=r.getOffset();if(!(0,Ps.Z)(n,yield s.Z.invokeCrypto("sha1",i.slice(0,p))))throw new Error("[MT] server_DH_inner_data SHA1 mismatch");this.timeManager.applyServerTime(e.serverTime,e.localTime)}))}verifyDhParams(e,t,a){d.ZP&&this.log("Verifying DH params",e,t,a);const s=T(t);if(3!==e||"c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b"!==s)throw new Error("[MT] DH params are not verified: unknown dhPrime");d.ZP&&this.log("dhPrime cmp OK");const n=fs(a),i=ns()(s,16);if(n.compare(ns().one)<=0)throw new Error("[MT] DH params are not verified: gA <= 1");if(n.compare(i.subtract(ns().one))>=0)throw new Error("[MT] DH params are not verified: gA >= dhPrime - 1");d.ZP&&this.log("1 < gA < dhPrime-1 OK");const r=ns()(2).pow(1984);if(n.compare(r)<0)throw new Error("[MT] DH params are not verified: gA < 2^{2048-64}");if(n.compare(i.subtract(r))>=0)throw new Error("[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}");return d.ZP&&this.log("2^{2048-64} < gA < dhPrime-2^{2048-64} OK"),!0}sendSetClientDhParams(e){return Ts(this,void 0,void 0,(function*(){const t=(0,Ha.Z)(e.g.toString(16));e.b=w(new Uint8Array(256));try{var a=yield s.Z.invokeCrypto("mod-pow",t,e.b,e.dhPrime)}catch(e){throw e}const n=new us({mtproto:!0});n.storeObject({_:"client_DH_inner_data",nonce:e.nonce,server_nonce:e.serverNonce,retry_id:[0,e.retry++],g_b:a},"Client_DH_Inner_Data");const i=(yield s.Z.invokeCrypto("sha1",n.getBuffer())).concat(n.getBytes(!0)),r=yield s.Z.invokeCrypto("aes-encrypt",i,e.tmpAesKey,e.tmpAesIv),o=new us({mtproto:!0});let p;o.storeMethod("set_client_DH_params",{nonce:e.nonce,server_nonce:e.serverNonce,encrypted_data:r}),d.ZP&&this.log("Send set_client_DH_params");try{p=yield this.sendPlainRequest(e.dcId,o.getBytes(!0))}catch(e){throw e}const f=p.fetchObject("Set_client_DH_params_answer");if("dh_gen_ok"!==f._&&"dh_gen_retry"!==f._&&"dh_gen_fail"!==f._)throw new Error("[MT] Set_client_DH_params_answer response invalid: "+f._);if(!(0,Ps.Z)(e.nonce,f.nonce))throw new Error("[MT] Set_client_DH_params_answer nonce mismatch");if(!(0,Ps.Z)(e.serverNonce,f.server_nonce))throw new Error("[MT] Set_client_DH_params_answer server_nonce mismatch");try{var c=yield s.Z.invokeCrypto("mod-pow",e.gA,e.b,e.dhPrime)}catch(e){throw c}const l=yield s.Z.invokeCrypto("sha1",c),m=l.slice(0,8),g=l.slice(-8);switch(d.ZP&&this.log("Got Set_client_DH_params_answer",f._,c),f._){case"dh_gen_ok":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([1],m))).slice(-16);if(!(0,Ps.Z)(t,f.new_nonce_hash1))throw this.log.error("Set_client_DH_params_answer new_nonce_hash1 mismatch",t,f),new Error("new_nonce_hash1 mismatch");const a=Us(e.newNonce.slice(0,8),e.serverNonce.slice(0,8));return d.ZP&&this.log("Auth successfull!",g,c,a),e.authKeyId=g,e.authKey=c,e.serverSalt=a,e}case"dh_gen_retry":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([2],m))).slice(-16);if(!(0,Ps.Z)(t,f.new_nonce_hash2))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch");return this.sendSetClientDhParams(e)}case"dh_gen_fail":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([3],m))).slice(-16);if(!(0,Ps.Z)(t,f.new_nonce_hash3))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch");throw new Error("[MT] Set_client_DH_params_answer fail")}}}))}getTransportType(){return this.getTransportTypePromise?this.getTransportTypePromise:this.getTransportTypePromise=Z.pingTransports().then((({websocket:e})=>{this.transportType=e?"websocket":"https",this.log("will use transport:",this.transportType)}))}auth(e){let t=this.cached[e];return t||(t=new Promise(((t,a)=>Ts(this,void 0,void 0,(function*(){let s;yield this.getTransportType();let n=1;for(;n++<=3;)try{const a={dcId:e,nonce:w(new Uint8Array(16))},s=this.sendReqPQ(a);return void t(yield s)}catch(e){s=e}a(s)})))),this.cached[e]=t)}}class Fs extends G{after(){this.lastMessageId=[0,0],this.timeOffset=0,qa.Z.get("server_time_offset").then((e=>{e&&(this.timeOffset=e)}))}getServerTimeOffset(){return this.timeOffset}generateId(){const e=Date.now();let t=[Math.floor(e/1e3)+this.timeOffset,e%1e3<<21|(0,Te.d)(16)<<3|4];return(this.lastMessageId[0]>t[0]||this.lastMessageId[0]===t[0]&&this.lastMessageId[1]>=t[1])&&(t=[this.lastMessageId[0],this.lastMessageId[1]+4]),this.lastMessageId=t,rs(t[0],t[1]).toString(10)}applyServerTime(e,t){const a=e-(t=(t||Date.now())/1e3|0),s=Math.abs(this.timeOffset-a)>10;return this.lastMessageId=[0,0],this.timeOffset!==a&&(qa.Z.set({server_time_offset:a}),this.timeOffset=a),s}}class Rs{saveWebDocument(e){if(!e)return;const t=e.attributes.find((e=>"documentAttributeImageSize"===e._));return t&&(e.w=t.w,e.h=t.h),e}}class xs extends G{getInputInvoiceBySlug(e){return{_:"inputInvoiceSlug",slug:e}}getInputInvoiceByPeerId(e,t){return{_:"inputInvoiceMessage",peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}}getPaymentForm(e){return this.apiManager.invokeApi("payments.getPaymentForm",{invoice:e}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}getPaymentReceipt(e,t){return this.apiManager.invokeApi("payments.getPaymentReceipt",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}validateRequestedInfo(e,t,a){return this.apiManager.invokeApi("payments.validateRequestedInfo",{save:a,invoice:e,info:t})}sendPaymentForm(e,t,a,s,n,i){return this.apiManager.invokeApi("payments.sendPaymentForm",{form_id:t,invoice:e,requested_info_id:a,shipping_option_id:s,credentials:n,tip_amount:i||void 0}).then((e=>("payments.paymentResult"===e._&&this.apiUpdatesManager.processUpdateMessage(e.updates),e)))}clearSavedInfo(e,t){return this.apiManager.invokeApi("payments.clearSavedInfo",{info:e,credentials:t})}}var Bs=a(8794);class Vs extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{e?this.attachMenuBots=new Map:(this.attachMenuBots.clear(),this.attachMenuBotsArr=void 0)},this.onUpdateAttachMenuBots=e=>{this.clear(),this.getAttachMenuBots()}}after(){this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateAttachMenuBots:this.onUpdateAttachMenuBots})}saveAttachMenuBot(e){this.attachMenuBots.set(e.bot_id,e);const t=(0,Bs.Z)(e);return t.icon=this.appDocsManager.saveDoc(t.icon,{type:"attachMenuBotIcon",botId:e.bot_id}),e}saveAttachMenuBots(e){e.saved||(e.saved=!0,e.forEach((e=>this.saveAttachMenuBot(e))))}getAttachMenuBots(){var e;return null!==(e=this.attachMenuBotsArr)&&void 0!==e?e:this.apiManager.invokeApiSingleProcess({method:"messages.getAttachMenuBots",processResult:e=>((0,ue.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.saveAttachMenuBots(e.bots),this.attachMenuBotsArr=e.bots.slice(0,0))})}getAttachMenuBotCached(e){return this.attachMenuBots.get(e)}getAttachMenuBot(e,t){throw this.appUsersManager.isAttachMenuBot(e),(0,X.Z)("BOT_INVALID")}requestWebView(e){const{botId:t,peerId:a,url:s,fromBotMenu:n,themeParams:i,replyToMsgId:r,silent:o,sendAsPeerId:p,startParam:d,threadId:f}=e;return this.apiManager.invokeApiSingleProcess({method:"messages.requestWebView",params:{peer:this.appPeersManager.getInputPeerById(a),bot:this.appUsersManager.getUserInput(t),silent:o,platform:"web",url:s,reply_to_msg_id:r?(0,oe.Z)(r):void 0,from_bot_menu:n,theme_params:i,send_as:p?this.appPeersManager.getInputPeerById(p):void 0,start_param:d,top_msg_id:f?(0,oe.Z)(f):void 0},processResult:e=>(console.log(e),e)})}prolongWebView(e){return this.apiManager.invokeApiSingleProcess({method:"messages.prolongWebView",params:{peer:this.appPeersManager.getInputPeerById(e.peerId),bot:this.appUsersManager.getUserInput(e.botId),query_id:e.queryId,silent:e.silent,reply_to_msg_id:e.replyToMsgId?(0,oe.Z)(e.replyToMsgId):void 0,send_as:e.sendAsPeerId?this.appPeersManager.getInputPeerById(e.sendAsPeerId):void 0,top_msg_id:e.threadId?(0,oe.Z)(e.threadId):void 0},processResult:e=>{console.log(e)}})}}class Os extends G{requestUrlAuth(e,t,a,s){return this.apiManager.invokeApi("messages.requestUrlAuth",{button_id:s,msg_id:a?(0,oe.Z)(a):void 0,peer:t?this.appPeersManager.getInputPeerById(t):void 0,url:e}).then((e=>("urlAuthResultRequest"===e._&&this.appUsersManager.saveApiUser(e.bot),e)))}acceptUrlAuth(e,t,a,s,n){return this.apiManager.invokeApi("messages.acceptUrlAuth",{button_id:s,msg_id:a?(0,oe.Z)(a):void 0,peer:t?this.appPeersManager.getInputPeerById(t):void 0,url:e,write_allowed:n}).then((e=>e))}getWebAuthorizations(){return this.apiManager.invokeApi("account.getWebAuthorizations").then((e=>(this.appUsersManager.saveApiUsers(e.users),e.authorizations)))}resetWebAuthorization(e){return this.apiManager.invokeApi("account.resetWebAuthorization",{hash:e})}resetWebAuthorizations(){return this.apiManager.invokeApi("account.resetWebAuthorizations")}}const Ls=new class{constructor(){this.cryptoWorkersURLs=[],this.cryptoPortsAttached=0,this.cryptoPortPromise=(0,v.Z)(),this.cryptoPortPromise.then((()=>{this.cryptoPortPromise=void 0}))}start(){const e=f.Z.getInstance();e.addEventListener("manager",(({name:e,method:t,args:a})=>(0,q.Z)(this.getManagers(),(s=>{const n=s[e];return n[t].apply(n,a)})))),e.addEventListener("cryptoPort",((e,t,a)=>{var n;const i=a.ports[0];this.cryptoPortsAttached>=this.cryptoWorkersURLs.length?i.close():(++this.cryptoPortsAttached,s.Z.attachPort(i),null===(n=this.cryptoPortPromise)||void 0===n||n.resolve())})),e.addEventListener("createProxyWorkerURLs",(({originalUrl:e,blob:t})=>{let a=this.cryptoWorkersURLs.length;a||(this.cryptoWorkersURLs.push(e),++a);const s=_.Z.cryptoWorkers;if(a===s)return this.cryptoWorkersURLs;const n=new Array(s-a).fill(void 0).map((()=>URL.createObjectURL(t)));return this.cryptoWorkersURLs.push(...n),this.cryptoWorkersURLs}))}createManagers(){return e=this,t=void 0,n=function*(){const e=new $;yield Promise.all([e.loadStorages(),this.cryptoPortPromise]);const t=yield function(e,t){const a={appPeersManager:new fa,appChatsManager:new Be,appDocsManager:new ut,appPhotosManager:new ca,appPollsManager:new la,appUsersManager:new Aa,appWebPagesManager:new Ua,appDraftsManager:new _t,appProfileManager:new ua,appNotificationsManager:new na,apiUpdatesManager:new De,appAvatarsManager:new Ue,appGroupCallsManager:new St,appCallsManager:new Fe,appReactionsManager:new ba,appMessagesManager:new ta,appMessagesIdsManager:new Tt,appPrivacyManager:new ma,appInlineBotsManager:new Dt,appStickersManager:new Ca,referenceDatabase:new ee,appEmojiManager:new Mt,filtersStorage:new Ce,dialogsStorage:new _e,apiManager:new Ja,cryptoWorker:s.Z,passwordManager:new Q,apiFileManager:new ja,peersStorage:new Qa,thumbsStorage:new Xa,networkerFactory:new As,rootScope:new l,authorizer:new Es,dcConfigurator:new O,timeManager:new Fs,appStoragesManager:e,appStateManager:y,appWebDocsManager:new Rs,appPaymentsManager:new xs,appAttachMenuBotsManager:new Vs,appSeamlessLoginManager:new Os};for(const e in a){const t=a[e];t&&(t.setManagers&&(t.setManagers(a),delete t.setManagers),E.Z[e]=t)}const n=[];let i=Object.keys(a);i.unshift("appUsersManager","appChatsManager","appNotificationsManager","appMessagesManager","dialogsStorage"),i=(0,we.Z)(i);for(const e of i){const t=a[e];if(null==t?void 0:t.after){const e=t.after();n.push(e)}}return t&&a.apiManager.setUserAuth(t),Promise.all(n).then((()=>a))}(e,y.userId);return this.managers=t},new((a=void 0)||(a=Promise))((function(s,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((n=n.apply(e,t||[])).next())}));var e,t,a,n}getManagers(){var e;return null!==(e=this.managers)&&void 0!==e?e:this.managers=this.createManagers()}};d.GO&&(d.GO.appManagersManager=Ls);const Ns=Ls;var Zs=a(3655);let js,qs,Gs=!0;function Hs(){return Gs}function Ws(){return Gs?js:void 0}const zs=(0,I.kg)("MTPROTO"),Ks=new f.Z;Ks.addMultipleEventsListeners({environment:e=>{r(e),Z.waitForWebSocket()},crypto:({method:e,args:t})=>s.Z.invokeCrypto(e,...t),state:({state:e,resetStorages:t,pushedKeys:a,newVersion:s,oldVersion:n,userId:i})=>{zs("got state",e,a),y.userId=i,y.newVersion=s,y.oldVersion=n,Object.keys(e).forEach((t=>{y.pushToState(t,e[t],!0,!a.includes(t))})),j.resolve(t)},toggleStorages:({enabled:e,clearWrite:t})=>(0,za.Z)(e,t),event:(e,t)=>{zs("will redirect event",e,t),Ks.invokeExceptSource("event",e,t)},serviceWorkerOnline:e=>{Gs=e},serviceWorkerPort:(e,t,a)=>{js?(js.detachPort(qs),qs=void 0):(js=new Zs.Z,js.addMultipleEventsListeners({requestFilePart:e=>(0,q.Z)(Ns.getManagers(),(t=>{const{docId:a,dcId:s,offset:n,limit:i}=e;return t.appDocsManager.requestDocPart(a,s,n,i)}))})),(qs=a.ports[0])&&js.attachPort(qs)},createObjectURL:e=>URL.createObjectURL(e)}),zs("MTProto start"),Ns.start(),Ns.getManagers(),Gt.start(),function(e,t,a){const s=(a,s)=>{e.attachListenPort(a),s&&e.attachSendPort(s),null==t||t(a)};e.setOnPortDisconnect((e=>{Gt.deleteTab(e)})),"undefined"!=typeof SharedWorkerGlobalScope?E.Z.addEventListener("connect",(e=>s(e.source,e.source))):"undefined"!=typeof ServiceWorkerGlobalScope?s(E.Z,null):s(E.Z,E.Z)}(Ks,(e=>{Gt.addTab(e)}))},1507:(e,t,a)=>{a.d(t,{BP:()=>f,BX:()=>l,DZ:()=>h,Gu:()=>u,IA:()=>i,Iw:()=>p,J$:()=>m,NM:()=>s,Ox:()=>c,Pt:()=>d,Zi:()=>g,hj:()=>n,rU:()=>o,yF:()=>r});const s=0,n=1271266957,i=777,r=777e3,o=2147483647,p=20971520,d="",f="default_static",c=4295032831,l=new Set(["web","k","z"]),m=0,g=1,h=new Set([m,g]),u=Math.max(...Array.from(h))+1},2423:(e,t,a)=>{a.d(t,{$2:()=>l,E:()=>m,QB:()=>g,SC:()=>h,bu:()=>d,it:()=>p,kO:()=>y,tY:()=>u});var s=a(1229);const n="a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc",i="0-9_"+n,r="["+n+"0-9]",o="((?:https?|ftp)://|mailto:)?",p=o+"(?:"+r+"{1,64}(?::"+r+"{0,64})?@)?(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|"+r+"["+n+"·0-9-]{0,64}(?:\\."+r+"["+n+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+n+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",d=(new RegExp("^"+o.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),f="[a-zA-Z\\d_]{5,32}",c="\\/([a-zA-Z\\d_]{1,32})(?:@("+f+"))?(\\b|$)",l=new RegExp("(^| )(@)("+f+")|("+p+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#["+i+"]{2,64})|(^|\\s)"+c,"i"),m=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,g=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,h={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},u=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(const e in h)u.add(h[e]);const y=/^\+\d+$/},671:(e,t,a)=>{function s(e){return function(e){const t=[];let a=0,s=0,n=0;for(;n55296&&a<=56319?s=a:t.push(a.toString(16));return t.length&&2===t[0].length&&(t[0]="00"+t[0]),t}(r(e)).join("-")}a.d(t,{N0:()=>s});const n=/\uFE0F/g,i=String.fromCharCode(8205),r=e=>e.indexOf(i)<0?e.replace(n,""):e;new Map([["FT","🏴‍☠"]])}},s={};function n(e){var t=s[e];if(void 0!==t)return t.exports;var i=s[e]={id:e,loaded:!1,exports:{}};return a[e].call(i.exports,i,i.exports,n),i.loaded=!0,i.exports}n.m=a,n.x=()=>{var e=n.O(void 0,[699,211,539,85,946],(()=>n(1082)));return n.O(e)},e=[],n.O=(t,a,s,i)=>{if(!a){var r=1/0;for(f=0;f=i)&&Object.keys(n.O).every((e=>n.O[e](a[p])))?a.splice(p--,1):(o=!1,i0&&e[f-1][2]>i;f--)e[f]=e[f-1];e[f]=[a,s,i]},n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var a in t)n.o(t,a)&&!n.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce(((t,a)=>(n.f[a](e,t),t)),[])),n.u=e=>85===e?"85.952a9f12a6b3dcdd3f0e.bundle.js":946===e?"946.d26679f97a8960b11df8.bundle.js":({211:"npm.big-integer",699:"npm.pako"}[e]||e)+"."+{8:"570e6da51a125009c156",104:"c914ddc183166c9696a7",211:"780c206f3e1257ccad6a",301:"42dc636f96a62f6a08c8",539:"17a0b07b4e6476f19654",642:"fd1ade69544ad78671c6",699:"85f88e27b023cbb2ca51"}[e]+".chunk.js",n.miniCssF=e=>{},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;n.g.importScripts&&(e=n.g.location+"");var t=n.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var a=t.getElementsByTagName("script");a.length&&(e=a[a.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=e})(),(()=>{if(void 0!==n){var e=n.u,t=n.e,a={},s={};n.u=function(t){return e(t)+(a.hasOwnProperty(t)?"?"+a[t]:"")},n.e=function(i){return t(i).catch((function(t){var r=s.hasOwnProperty(i)?s[i]:999999;if(r<1){var o=e(i);throw t.message="Loading chunk "+i+" failed after 999999 retries.\n("+o+")",t.request=o,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();a[i]=t,s[i]=r-1,e(n.e(i))}),3e3)}))}))}}})(),(()=>{var e={678:1};n.f.i=(t,a)=>{e[t]||importScripts(n.p+n.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],a=t.push.bind(t);t.push=t=>{var[s,i,r]=t;for(var o in i)n.o(i,o)&&(n.m[o]=i[o]);for(r&&r(n);s.length;)e[s.pop()]=1;a(t)}})(),t=n.x,n.x=()=>Promise.all([699,211,539,85,946].map(n.e,n)).then(t),n.x()})(); +//# sourceMappingURL=mtproto.worker.a47a496f3c7a877087bb.chunk.js.map \ No newline at end of file diff --git a/public/mtproto.worker.a47a496f3c7a877087bb.chunk.js.map b/public/mtproto.worker.a47a496f3c7a877087bb.chunk.js.map new file mode 100644 index 000000000..0154547b8 --- /dev/null +++ b/public/mtproto.worker.a47a496f3c7a877087bb.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"mtproto.worker.a47a496f3c7a877087bb.chunk.js","mappings":"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Ac,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,MAAO,kBAAkB,MAAO,QAAQ,MAAO,kBAAkB,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,wCAAwC,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,IAAK,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,iBAAiB,KAAM,iBAAiB,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/config/emoji.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerId.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/environment/utils.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/appManagers/appStateManager.ts","webpack://tweb/./src/helpers/object/setDeepProperty.ts","webpack://tweb/./src/lib/mtproto/transports/http.ts","webpack://tweb/./src/lib/mtproto/transports/websocket.ts","webpack://tweb/./src/helpers/array/randomize.ts","webpack://tweb/./src/lib/mtproto/transports/obfuscation.ts","webpack://tweb/./src/lib/mtproto/transports/abridged.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/lib/mtproto/transports/tcpObfuscated.ts","webpack://tweb/./src/lib/mtproto/dcConfigurator.ts","webpack://tweb/./src/lib/mtproto/transports/controller.ts","webpack://tweb/./src/lib/appManagers/utils/storages/resetStoragesPromise.ts","webpack://tweb/./src/lib/appManagers/manager.ts","webpack://tweb/./src/lib/appManagers/utils/storages/loadStorages.ts","webpack://tweb/./src/lib/appManagers/appStoragesManager.ts","webpack://tweb/./src/lib/appManagers/utils/storages/createStorages.ts","webpack://tweb/./src/lib/mtproto/passwordManager.ts","webpack://tweb/./src/lib/mtproto/referenceDatabase.ts","webpack://tweb/./src/helpers/object/safeReplaceObject.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getPeerIdsFromMessage.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/setDialogIndex.ts","webpack://tweb/./src/lib/storages/dialogs.ts","webpack://tweb/./src/lib/storages/filters.ts","webpack://tweb/./src/helpers/applyMixins.ts","webpack://tweb/./src/lib/appManagers/apiUpdatesManager.ts","webpack://tweb/./src/lib/appManagers/appAvatarsManager.ts","webpack://tweb/./src/lib/appManagers/appCallsManager.ts","webpack://tweb/./src/lib/appManagers/appChatsManager.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/lib/richTextProcessor/wrapUrl.ts","webpack://tweb/./src/helpers/dom/setInnerHTML.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/helpers/object/safeReplaceArrayInObject.ts","webpack://tweb/./src/environment/mimeTypeMap.ts","webpack://tweb/./src/lib/appManagers/appDocsManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentURL.ts","webpack://tweb/./src/lib/appManagers/appDraftsManager.ts","webpack://tweb/./src/lib/appManagers/appEmojiManager.ts","webpack://tweb/./src/lib/appManagers/appGroupCallsManager.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoInput.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoMediaInput.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentMediaInput.ts","webpack://tweb/./src/lib/appManagers/appInlineBotsManager.ts","webpack://tweb/./src/lib/appManagers/appMessagesIdsManager.ts","webpack://tweb/./src/helpers/string/splitStringByLength.ts","webpack://tweb/./src/lib/appManagers/appTabsManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInput.ts","webpack://tweb/./src/helpers/object/setBooleanFlag.ts","webpack://tweb/./src/lib/appManagers/appMessagesManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInputFileName.ts","webpack://tweb/./src/helpers/string/convertInputKeyToKey.ts","webpack://tweb/./src/lib/appManagers/appNotificationsManager.ts","webpack://tweb/./src/lib/appManagers/appPeersManager.ts","webpack://tweb/./src/lib/appManagers/appPhotosManager.ts","webpack://tweb/./src/lib/appManagers/appPollsManager.ts","webpack://tweb/./src/lib/appManagers/appPrivacyManager.ts","webpack://tweb/./src/lib/appManagers/appProfileManager.ts","webpack://tweb/./src/helpers/callbackifyAll.ts","webpack://tweb/./src/lib/appManagers/appReactionsManager.ts","webpack://tweb/./src/lib/appManagers/appStickersManager.ts","webpack://tweb/./src/helpers/fixBase64String.ts","webpack://tweb/./src/lib/appManagers/appUsersManager.ts","webpack://tweb/./src/helpers/cleanUsername.ts","webpack://tweb/./src/lib/appManagers/appWebPagesManager.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/string/fileNameRFC.ts","webpack://tweb/./src/lib/files/downloadWriter.ts","webpack://tweb/./src/lib/files/downloadStorage.ts","webpack://tweb/./src/lib/mtproto/apiFileManager.ts","webpack://tweb/./src/helpers/fixFirefoxSvg.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/lib/mtproto/api_methods.ts","webpack://tweb/./src/lib/mtproto/apiManager.ts","webpack://tweb/./src/lib/storages/peers.ts","webpack://tweb/./src/lib/storages/thumbs.ts","webpack://tweb/./src/lib/mtproto/schema.ts","webpack://tweb/./src/helpers/number/intToUint.ts","webpack://tweb/./src/helpers/long/ulongFromInts.ts","webpack://tweb/./src/helpers/bigInt/bigIntConstants.ts","webpack://tweb/./src/helpers/bigInt/bigIntConversion.ts","webpack://tweb/./src/lib/mtproto/tl_utils.ts","webpack://tweb/./src/helpers/gzipUncompress.ts","webpack://tweb/./src/helpers/bytes/addPadding.ts","webpack://tweb/./src/lib/mtproto/networker.ts","webpack://tweb/./src/helpers/long/sortLongsArray.ts","webpack://tweb/./src/helpers/long/longToBytes.ts","webpack://tweb/./src/lib/mtproto/networkerFactory.ts","webpack://tweb/./src/lib/mtproto/rsaKeysManager.ts","webpack://tweb/./src/helpers/bytes/bytesXor.ts","webpack://tweb/./src/lib/mtproto/authorizer.ts","webpack://tweb/./src/lib/mtproto/timeManager.ts","webpack://tweb/./src/lib/appManagers/appWebDocsManager.ts","webpack://tweb/./src/lib/appManagers/appPaymentsManager.ts","webpack://tweb/./src/lib/appManagers/appAttachMenuBotsManager.ts","webpack://tweb/./src/lib/appManagers/appSeamlessLoginManager.ts","webpack://tweb/./src/lib/appManagers/appManagersManager.ts","webpack://tweb/./src/lib/appManagers/createManagers.ts","webpack://tweb/./src/lib/mtproto/mtproto.worker.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/vendor/emoji/index.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/make namespace object","webpack://tweb/webpack/runtime/node module decorator","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,539,85,946].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {EMOJI_VERSION} from '../environment/emojiVersionsSupport';\n\nexport const EmojiVersions: {[version in EMOJI_VERSION]: {[emoji: string]: number}} = {'14':{'1f6dd':4867, '1f6de':4916, '1f6df':4923, '1f7f0':62832, '1f979':183, '1f9cc':1557, '1fa7b':61332, '1fa7c':61330, '1faa9':51093, '1faaa':61364, '1faab':61189, '1faac':51085, '1fab7':2651, '1fab8':2631, '1fab9':2672, '1faba':2673, '1fac3':1520, '1fac4':1521, '1fac5':1505, '1fad7':3793, '1fad8':3707, '1fad9':3804, '1fae0':111, '1fae1':136, '1fae2':132, '1fae3':133, '1fae4':174, '1fae5':142, '1fae6':1385, '1fae7':61353, '1faf0':1341, '1faf1':1332, '1faf2':1333, '1faf3':1334, '1faf4':1335, '1faf5':1351, '1faf6':1360, '1faf1-1f3fb-200d-1faf2-1f3fc':0, '1faf1-1f3fb-200d-1faf2-1f3fd':0, '1faf1-1f3fb-200d-1faf2-1f3fe':0, '1faf1-1f3fb-200d-1faf2-1f3ff':0, '1faf1-1f3fc-200d-1faf2-1f3fb':0, '1faf1-1f3fc-200d-1faf2-1f3fd':0, '1faf1-1f3fc-200d-1faf2-1f3fe':0, '1faf1-1f3fc-200d-1faf2-1f3ff':0, '1faf1-1f3fd-200d-1faf2-1f3fb':0, '1faf1-1f3fd-200d-1faf2-1f3fc':0, '1faf1-1f3fd-200d-1faf2-1f3fe':0, '1faf1-1f3fd-200d-1faf2-1f3ff':0, '1faf1-1f3fe-200d-1faf2-1f3fb':0, '1faf1-1f3fe-200d-1faf2-1f3fc':0, '1faf1-1f3fe-200d-1faf2-1f3fd':0, '1faf1-1f3fe-200d-1faf2-1f3ff':0, '1faf1-1f3ff-200d-1faf2-1f3fb':0, '1faf1-1f3ff-200d-1faf2-1f3fc':0, '1faf1-1f3ff-200d-1faf2-1f3fd':0, '1faf1-1f3ff-200d-1faf2-1f3fe':0, '1fac3-1f3fb':0, '1fac3-1f3fc':0, '1fac3-1f3fd':0, '1fac3-1f3fe':0, '1fac3-1f3ff':0, '1fac4-1f3fb':0, '1fac4-1f3fc':0, '1fac4-1f3fd':0, '1fac4-1f3fe':0, '1fac4-1f3ff':0, '1fac5-1f3fb':0, '1fac5-1f3fc':0, '1fac5-1f3fd':0, '1fac5-1f3fe':0, '1fac5-1f3ff':0, '1faf0-1f3fb':0, '1faf0-1f3fc':0, '1faf0-1f3fd':0, '1faf0-1f3fe':0, '1faf0-1f3ff':0, '1faf1-1f3fb':0, '1faf1-1f3fc':0, '1faf1-1f3fd':0, '1faf1-1f3fe':0, '1faf1-1f3ff':0, '1faf2-1f3fb':0, '1faf2-1f3fc':0, '1faf2-1f3fd':0, '1faf2-1f3fe':0, '1faf2-1f3ff':0, '1faf3-1f3fb':0, '1faf3-1f3fc':0, '1faf3-1f3fd':0, '1faf3-1f3fe':0, '1faf3-1f3ff':0, '1faf4-1f3fb':0, '1faf4-1f3fc':0, '1faf4-1f3fd':0, '1faf4-1f3fe':0, '1faf4-1f3ff':0, '1faf5-1f3fb':0, '1faf5-1f3fc':0, '1faf5-1f3fd':0, '1faf5-1f3fe':0, '1faf5-1f3ff':0, '1faf6-1f3fb':0, '1faf6-1f3fc':0, '1faf6-1f3fd':0, '1faf6-1f3fe':0, '1faf6-1f3ff':0}, '':{'2049':62835, '2122':62863, '2139':62888, '2194':62764, '2195':62763, '2196':62762, '2197':62756, '2198':62758, '2199':62760, '2328':61194, '2600':4990, '2601':4998, '2602':41013, '2603':41018, '2604':41020, '2611':62851, '2614':41014, '2615':3781, '2618':2667, '2620':1106, '2622':62753, '2623':62754, '2626':62783, '2638':62780, '2639':177, '2648':62788, '2649':62789, '2650':62796, '2651':62797, '2652':62798, '2653':62799, '2660':51095, '2663':51098, '2665':51096, '2666':51097, '2668':4865, '2692':61297, '2693':4922, '2694':61300, '2696':61311, '2697':61319, '2699':61309, '2702':61284, '2705':62850, '2708':4931, '2709':61245, '2712':61259, '2714':62852, '2716':62828, '2721':62779, '2728':51029, '2733':62858, '2734':62859, '2744':41017, '2747':62860, '2753':62836, '2754':62837, '2755':62838, '2757':62839, '2763':1137, '2764':1141, '2795':62829, '2796':62830, '2797':62831, '2934':62767, '2935':62768, '3030':62840, '3297':62912, '3299':62913, '0023-20e3':62864, '002a-20e3':62865, '0030-20e3':62866, '0031-20e3':62867, '0032-20e3':62868, '0033-20e3':62869, '0034-20e3':62870, '0035-20e3':62871, '0036-20e3':62872, '0037-20e3':62873, '0038-20e3':62874, '0039-20e3':62875, '00a9':62861, '00ae':62862, '1f004':51101, '1f0cf':51100, '1f170':62882, '1f171':62884, '1f17e':62893, '1f17f':62895, '1f18e':62883, '1f191':62885, '1f192':62886, '1f193':62887, '1f194':62889, '1f195':62891, '1f196':62892, '1f197':62894, '1f198':62896, '1f199':62897, '1f19a':62898, '1f1e6-1f1e8':71594, '1f1e6-1f1e9':71595, '1f1e6-1f1ea':71596, '1f1e6-1f1eb':71597, '1f1e6-1f1ec':71598, '1f1e6-1f1ee':71599, '1f1e6-1f1f1':71600, '1f1e6-1f1f2':71601, '1f1e6-1f1f4':71602, '1f1e6-1f1f6':71603, '1f1e6-1f1f7':71604, '1f1e6-1f1f8':71605, '1f1e6-1f1f9':71606, '1f1e6-1f1fa':71607, '1f1e6-1f1fc':71608, '1f1e6-1f1fd':71609, '1f1e6-1f1ff':71610, '1f1e7-1f1e6':71611, '1f1e7-1f1e7':71612, '1f1e7-1f1e9':71613, '1f1e7-1f1ea':71614, '1f1e7-1f1eb':71615, '1f1e7-1f1ec':71616, '1f1e7-1f1ed':71617, '1f1e7-1f1ee':71618, '1f1e7-1f1ef':71619, '1f1e7-1f1f1':71620, '1f1e7-1f1f2':71621, '1f1e7-1f1f3':71622, '1f1e7-1f1f4':71623, '1f1e7-1f1f6':71624, '1f1e7-1f1f7':71625, '1f1e7-1f1f8':71626, '1f1e7-1f1f9':71627, '1f1e7-1f1fb':71628, '1f1e7-1f1fc':71629, '1f1e7-1f1fe':71630, '1f1e7-1f1ff':71631, '1f1e8-1f1e6':71632, '1f1e8-1f1e8':71633, '1f1e8-1f1e9':71634, '1f1e8-1f1eb':71635, '1f1e8-1f1ec':71636, '1f1e8-1f1ed':71637, '1f1e8-1f1ee':71638, '1f1e8-1f1f0':71639, '1f1e8-1f1f1':71640, '1f1e8-1f1f2':71641, '1f1e8-1f1f3':71642, '1f1e8-1f1f4':71643, '1f1e8-1f1f5':71644, '1f1e8-1f1f7':71645, '1f1e8-1f1fa':71646, '1f1e8-1f1fb':71647, '1f1e8-1f1fc':71648, '1f1e8-1f1fd':71649, '1f1e8-1f1fe':71650, '1f1e8-1f1ff':71651, '1f1e9-1f1ea':71652, '1f1e9-1f1ec':71653, '1f1e9-1f1ef':71654, '1f1e9-1f1f0':71655, '1f1e9-1f1f2':71656, '1f1e9-1f1f4':71657, '1f1e9-1f1ff':71658, '1f1ea-1f1e6':71659, '1f1ea-1f1e8':71660, '1f1ea-1f1ea':71661, '1f1ea-1f1ec':71662, '1f1ea-1f1ed':71663, '1f1ea-1f1f7':71664, '1f1ea-1f1f8':71665, '1f1ea-1f1f9':71666, '1f1ea-1f1fa':71667, '1f1eb-1f1ee':71668, '1f1eb-1f1ef':71669, '1f1eb-1f1f0':71670, '1f1eb-1f1f2':71671, '1f1eb-1f1f4':71672, '1f1eb-1f1f7':71673, '1f1ec-1f1e6':71674, '1f1ec-1f1e7':71675, '1f1ec-1f1e9':71676, '1f1ec-1f1ea':71677, '1f1ec-1f1eb':71678, '1f1ec-1f1ec':71679, '1f1ec-1f1ed':71680, '1f1ec-1f1ee':71681, '1f1ec-1f1f1':71682, '1f1ec-1f1f2':71683, '1f1ec-1f1f3':71684, '1f1ec-1f1f5':71685, '1f1ec-1f1f6':71686, '1f1ec-1f1f7':71687, '1f1ec-1f1f8':71688, '1f1ec-1f1f9':71689, '1f1ec-1f1fa':71690, '1f1ec-1f1fc':71691, '1f1ec-1f1fe':71692, '1f1ed-1f1f0':71693, '1f1ed-1f1f2':71694, '1f1ed-1f1f3':71695, '1f1ed-1f1f7':71696, '1f1ed-1f1f9':71697, '1f1ed-1f1fa':71698, '1f1ee-1f1e8':71699, '1f1ee-1f1e9':71700, '1f1ee-1f1ea':71701, '1f1ee-1f1f1':71702, '1f1ee-1f1f2':71703, '1f1ee-1f1f3':71704, '1f1ee-1f1f4':71705, '1f1ee-1f1f6':71706, '1f1ee-1f1f7':71707, '1f1ee-1f1f8':71708, '1f1ee-1f1f9':71709, '1f1ef-1f1ea':71710, '1f1ef-1f1f2':71711, '1f1ef-1f1f4':71712, '1f1ef-1f1f5':71713, '1f1f0-1f1ea':71714, '1f1f0-1f1ec':71715, '1f1f0-1f1ed':71716, '1f1f0-1f1ee':71717, '1f1f0-1f1f2':71718, '1f1f0-1f1f3':71719, '1f1f0-1f1f5':71720, '1f1f0-1f1f7':71721, '1f1f0-1f1fc':71722, '1f1f0-1f1fe':71723, '1f1f0-1f1ff':71724, '1f1f1-1f1e6':71725, '1f1f1-1f1e7':71726, '1f1f1-1f1e8':71727, '1f1f1-1f1ee':71728, '1f1f1-1f1f0':71729, '1f1f1-1f1f7':71730, '1f1f1-1f1f8':71731, '1f1f1-1f1f9':71732, '1f1f1-1f1fa':71733, '1f1f1-1f1fb':71734, '1f1f1-1f1fe':71735, '1f1f2-1f1e6':71736, '1f1f2-1f1e8':71737, '1f1f2-1f1e9':71738, '1f1f2-1f1ea':71739, '1f1f2-1f1eb':71740, '1f1f2-1f1ec':71741, '1f1f2-1f1ed':71742, '1f1f2-1f1f0':71743, '1f1f2-1f1f1':71744, '1f1f2-1f1f2':71745, '1f1f2-1f1f3':71746, '1f1f2-1f1f4':71747, '1f1f2-1f1f5':71748, '1f1f2-1f1f6':71749, '1f1f2-1f1f7':71750, '1f1f2-1f1f8':71751, '1f1f2-1f1f9':71752, '1f1f2-1f1fa':71753, '1f1f2-1f1fb':71754, '1f1f2-1f1fc':71755, '1f1f2-1f1fd':71756, '1f1f2-1f1fe':71757, '1f1f2-1f1ff':71758, '1f1f3-1f1e6':71759, '1f1f3-1f1e8':71760, '1f1f3-1f1ea':71761, '1f1f3-1f1eb':71762, '1f1f3-1f1ec':71763, '1f1f3-1f1ee':71764, '1f1f3-1f1f1':71765, '1f1f3-1f1f4':71766, '1f1f3-1f1f5':71767, '1f1f3-1f1f7':71768, '1f1f3-1f1fa':71769, '1f1f3-1f1ff':71770, '1f1f4-1f1f2':71771, '1f1f5-1f1e6':71772, '1f1f5-1f1ea':71773, '1f1f5-1f1eb':71774, '1f1f5-1f1ec':71775, '1f1f5-1f1ed':71776, '1f1f5-1f1f0':71777, '1f1f5-1f1f1':71778, '1f1f5-1f1f2':71779, '1f1f5-1f1f3':71780, '1f1f5-1f1f7':71781, '1f1f5-1f1f8':71782, '1f1f5-1f1f9':71783, '1f1f5-1f1fc':71784, '1f1f5-1f1fe':71785, '1f1f6-1f1e6':71786, '1f1f7-1f1ea':71787, '1f1f7-1f1f4':71788, '1f1f7-1f1f8':71789, '1f1f7-1f1fa':71790, '1f1f7-1f1fc':71791, '1f1f8-1f1e6':71792, '1f1f8-1f1e7':71793, '1f1f8-1f1e8':71794, '1f1f8-1f1e9':71795, '1f1f8-1f1ea':71796, '1f1f8-1f1ec':71797, '1f1f8-1f1ed':71798, '1f1f8-1f1ee':71799, '1f1f8-1f1ef':71800, '1f1f8-1f1f0':71801, '1f1f8-1f1f1':71802, '1f1f8-1f1f2':71803, '1f1f8-1f1f3':71804, '1f1f8-1f1f4':71805, '1f1f8-1f1f7':71806, '1f1f8-1f1f8':71807, '1f1f8-1f1f9':71808, '1f1f8-1f1fb':71809, '1f1f8-1f1fd':71810, '1f1f8-1f1fe':71811, '1f1f8-1f1ff':71812, '1f1f9-1f1e6':71813, '1f1f9-1f1e8':71814, '1f1f9-1f1e9':71815, '1f1f9-1f1eb':71816, '1f1f9-1f1ec':71817, '1f1f9-1f1ed':71818, '1f1f9-1f1ef':71819, '1f1f9-1f1f0':71820, '1f1f9-1f1f1':71821, '1f1f9-1f1f2':71822, '1f1f9-1f1f3':71823, '1f1f9-1f1f4':71824, '1f1f9-1f1f7':71825, '1f1f9-1f1f9':71826, '1f1f9-1f1fb':71827, '1f1f9-1f1fc':71828, '1f1f9-1f1ff':71829, '1f1fa-1f1e6':71830, '1f1fa-1f1ec':71831, '1f1fa-1f1f2':71832, '1f1fa-1f1f3':71833, '1f1fa-1f1f8':71834, '1f1fa-1f1fe':71835, '1f1fa-1f1ff':71836, '1f1fb-1f1e6':71837, '1f1fb-1f1e8':71838, '1f1fb-1f1ea':71839, '1f1fb-1f1ec':71840, '1f1fb-1f1ee':71841, '1f1fb-1f1f3':71842, '1f1fb-1f1fa':71843, '1f1fc-1f1eb':71844, '1f1fc-1f1f8':71845, '1f1fd-1f1f0':71846, '1f1fe-1f1ea':71847, '1f1fe-1f1f9':71848, '1f1ff-1f1e6':71849, '1f1ff-1f1f2':71850, '1f1ff-1f1fc':71851, '1f201':62899, '1f202':62900, '1f21a':62906, '1f22f':62903, '1f232':62907, '1f233':62911, '1f234':62910, '1f235':62915, '1f236':62902, '1f237':62901, '1f238':62909, '1f239':62905, '1f23a':62914, '1f250':62904, '1f251':62908, '1f300':41010, '1f301':4857, '1f302':41012, '1f303':4858, '1f304':4860, '1f305':4861, '1f306':4862, '1f307':4863, '1f308':41011, '1f309':4864, '1f30a':41023, '1f30b':4815, '1f30c':4997, '1f30d':4806, '1f30e':4807, '1f30f':4808, '1f310':4809, '1f311':4977, '1f312':4978, '1f313':4979, '1f314':4980, '1f315':4981, '1f316':4982, '1f317':4983, '1f318':4984, '1f319':4985, '1f31a':4986, '1f31b':4987, '1f31c':4988, '1f31d':4991, '1f31e':4992, '1f31f':4995, '1f320':4996, '1f321':4989, '1f324':41001, '1f325':41002, '1f326':41003, '1f327':41004, '1f328':41005, '1f329':41006, '1f32a':41007, '1f32b':41008, '1f32c':41009, '1f32d':3725, '1f32e':3727, '1f32f':3728, '1f330':3708, '1f331':2659, '1f332':2661, '1f333':2662, '1f334':2663, '1f335':2664, '1f336':3698, '1f337':2658, '1f338':2649, '1f339':2653, '1f33a':2655, '1f33b':2656, '1f33c':2657, '1f33d':3697, '1f33e':2665, '1f33f':2666, '1f340':2668, '1f341':2669, '1f342':2670, '1f343':2671, '1f344':3705, '1f345':3690, '1f346':3694, '1f347':3674, '1f348':3675, '1f349':3676, '1f34a':3677, '1f34b':3678, '1f34c':3679, '1f34d':3680, '1f34e':3682, '1f34f':3683, '1f350':3684, '1f351':3685, '1f352':3686, '1f353':3687, '1f354':3722, '1f355':3724, '1f356':3718, '1f357':3719, '1f358':3744, '1f359':3745, '1f35a':3746, '1f35b':3747, '1f35c':3748, '1f35d':3749, '1f35e':3709, '1f35f':3723, '1f360':3750, '1f361':3756, '1f362':3751, '1f363':3752, '1f364':3753, '1f365':3754, '1f366':3765, '1f367':3766, '1f368':3767, '1f369':3768, '1f36a':3769, '1f36b':3774, '1f36c':3775, '1f36d':3776, '1f36e':3777, '1f36f':3778, '1f370':3771, '1f371':3743, '1f372':3735, '1f373':3733, '1f374':3801, '1f375':3783, '1f376':3784, '1f377':3786, '1f378':3787, '1f379':3788, '1f37a':3789, '1f37b':3790, '1f37c':3779, '1f37d':3800, '1f37e':3785, '1f37f':3739, '1f380':51040, '1f381':51041, '1f382':3770, '1f383':51024, '1f384':51025, '1f385':1527, '1f386':51026, '1f387':51027, '1f388':51030, '1f389':51031, '1f38a':51032, '1f38b':51033, '1f38c':71588, '1f38d':51034, '1f38e':51035, '1f38f':51036, '1f390':51037, '1f391':51038, '1f392':61134, '1f393':61147, '1f396':51045, '1f397':51042, '1f399':61167, '1f39a':61168, '1f39b':61169, '1f39e':61203, '1f39f':51043, '1f3a0':4866, '1f3a1':4868, '1f3a2':4869, '1f3a3':51072, '1f3a4':61170, '1f3a5':61202, '1f3a6':62819, '1f3a7':61171, '1f3a8':51105, '1f3a9':61146, '1f3aa':4871, '1f3ab':51044, '1f3ac':61205, '1f3ad':51103, '1f3ae':51086, '1f3af':51078, '1f3b0':51088, '1f3b1':51081, '1f3b2':51089, '1f3b3':51060, '1f3b4':51102, '1f3b5':61165, '1f3b6':61166, '1f3b7':61173, '1f3b8':61175, '1f3b9':61176, '1f3ba':61177, '1f3bb':61178, '1f3bc':61164, '1f3bd':51074, '1f3be':51058, '1f3bf':51075, '1f3c0':51054, '1f3c1':71586, '1f3c2':1600, '1f3c3-200d-2640':1584, '1f3c3-200d-2642':1583, '1f3c3':1582, '1f3c4-200d-2640':1606, '1f3c4-200d-2642':1605, '1f3c4':1604, '1f3c5':51047, '1f3c6':51046, '1f3c7':1598, '1f3c8':51056, '1f3c9':51057, '1f3ca-200d-2640':1612, '1f3ca-200d-2642':1611, '1f3ca':1610, '1f3cb-200d-2640':1618, '1f3cb-200d-2642':1617, '1f3cb':1616, '1f3cc-200d-2640':1603, '1f3cc-200d-2642':1602, '1f3cc':1601, '1f3cd':4902, '1f3ce':4901, '1f3cf':51061, '1f3d0':51055, '1f3d1':51062, '1f3d2':51063, '1f3d3':51065, '1f3d4':4813, '1f3d5':4817, '1f3d6':4818, '1f3d7':4824, '1f3d8':4829, '1f3d9':4859, '1f3da':4830, '1f3db':4823, '1f3dc':4819, '1f3dd':4820, '1f3de':4821, '1f3df':4822, '1f3e0':4831, '1f3e1':4832, '1f3e2':4833, '1f3e3':4834, '1f3e4':4835, '1f3e5':4836, '1f3e6':4837, '1f3e7':62729, '1f3e8':4838, '1f3e9':4839, '1f3ea':4840, '1f3eb':4841, '1f3ec':4842, '1f3ed':4843, '1f3ee':61216, '1f3ef':4844, '1f3f0':4845, '1f3f3-200d-1f308':71591, '1f3f3-200d-26a7':71592, '1f3f3':71590, '1f3f4-200d-2620':71593, '1f3f4-e0067-e0062-e0065-e006e-e0067-e007f':71852, '1f3f4-e0067-e0062-e0073-e0063-e0074-e007f':71853, '1f3f4-e0067-e0062-e0077-e006c-e0073-e007f':71854, '1f3f4':71589, '1f3f5':2652, '1f3f7':61234, '1f3f8':51066, '1f3f9':61303, '1f3fa':3805, '1f3fb':9525, '1f3fc':9526, '1f3fd':9527, '1f3fe':9528, '1f3ff':9529, '1f400':2576, '1f401':2575, '1f402':2556, '1f403':2557, '1f404':2558, '1f405':2547, '1f406':2548, '1f407':2579, '1f408-200d-2b1b':2544, '1f408':2543, '1f409':2618, '1f40a':2613, '1f40b':2622, '1f40c':2632, '1f40d':2616, '1f40e':2550, '1f40f':2563, '1f410':2565, '1f411':2564, '1f412':2531, '1f413':2596, '1f414':2595, '1f415-200d-1f9ba':2537, '1f415':2535, '1f416':2560, '1f417':2561, '1f418':2570, '1f419':2629, '1f41a':2630, '1f41b':2634, '1f41c':2635, '1f41d':2636, '1f41e':2638, '1f41f':2625, '1f420':2626, '1f421':2627, '1f422':2614, '1f423':2597, '1f424':2598, '1f425':2599, '1f426':2600, '1f427':2601, '1f428':2586, '1f429':2538, '1f42a':2566, '1f42b':2567, '1f42c':2623, '1f42d':2574, '1f42e':2555, '1f42f':2546, '1f430':2578, '1f431':2542, '1f432':2617, '1f433':2621, '1f434':2549, '1f435':2530, '1f436':2534, '1f437':2559, '1f438':2612, '1f439':2577, '1f43a':2539, '1f43b-200d-2744':2585, '1f43b':2584, '1f43c':2587, '1f43d':2562, '1f43e':2593, '1f43f':2580, '1f440':1381, '1f441-200d-1f5e8':1159, '1f441':1382, '1f442':1373, '1f443':1375, '1f444':1384, '1f445':1383, '1f446':1347, '1f447':1349, '1f448':1345, '1f449':1346, '1f44a':1355, '1f44b':1327, '1f44c':1336, '1f44d':1352, '1f44e':1353, '1f44f':1358, '1f450':1361, '1f451':61144, '1f452':61145, '1f453':61110, '1f454':61115, '1f455':61116, '1f456':61117, '1f457':61122, '1f458':61123, '1f459':61128, '1f45a':61129, '1f45b':61130, '1f45c':61131, '1f45d':61132, '1f45e':61136, '1f45f':61137, '1f460':61140, '1f461':61141, '1f462':61143, '1f463':1687, '1f464':1684, '1f465':1685, '1f466':1388, '1f467':1389, '1f468-200d-1f33e':1457, '1f468-200d-1f373':1460, '1f468-200d-1f37c':1524, '1f468-200d-1f393':1448, '1f468-200d-1f3a4':1478, '1f468-200d-1f3a8':1481, '1f468-200d-1f3eb':1451, '1f468-200d-1f3ed':1466, '1f468-200d-1f466-200d-1f466':1674, '1f468-200d-1f466':1673, '1f468-200d-1f467-200d-1f466':1676, '1f468-200d-1f467-200d-1f467':1677, '1f468-200d-1f467':1675, '1f468-200d-1f468-200d-1f466':1663, '1f468-200d-1f468-200d-1f466-200d-1f466':1666, '1f468-200d-1f468-200d-1f467':1664, '1f468-200d-1f468-200d-1f467-200d-1f466':1665, '1f468-200d-1f468-200d-1f467-200d-1f467':1667, '1f468-200d-1f469-200d-1f466':1658, '1f468-200d-1f469-200d-1f466-200d-1f466':1661, '1f468-200d-1f469-200d-1f467':1659, '1f468-200d-1f469-200d-1f467-200d-1f466':1660, '1f468-200d-1f469-200d-1f467-200d-1f467':1662, '1f468-200d-1f4bb':1475, '1f468-200d-1f4bc':1469, '1f468-200d-1f527':1463, '1f468-200d-1f52c':1472, '1f468-200d-1f680':1487, '1f468-200d-1f692':1490, '1f468-200d-1f9af':1574, '1f468-200d-1f9b0':1396, '1f468-200d-1f9b1':1397, '1f468-200d-1f9b2':1399, '1f468-200d-1f9b3':1398, '1f468-200d-1f9bc':1577, '1f468-200d-1f9bd':1580, '1f468-200d-2695':1445, '1f468-200d-2696':1454, '1f468-200d-2708':1484, '1f468-200d-2764-200d-1f468':1655, '1f468-200d-2764-200d-1f48b-200d-1f468':1651, '1f468':1392, '1f469-200d-1f33e':1458, '1f469-200d-1f373':1461, '1f469-200d-1f37c':1523, '1f469-200d-1f393':1449, '1f469-200d-1f3a4':1479, '1f469-200d-1f3a8':1482, '1f469-200d-1f3eb':1452, '1f469-200d-1f3ed':1467, '1f469-200d-1f466-200d-1f466':1679, '1f469-200d-1f466':1678, '1f469-200d-1f467-200d-1f466':1681, '1f469-200d-1f467-200d-1f467':1682, '1f469-200d-1f467':1680, '1f469-200d-1f469-200d-1f466':1668, '1f469-200d-1f469-200d-1f466-200d-1f466':1671, '1f469-200d-1f469-200d-1f467':1669, '1f469-200d-1f469-200d-1f467-200d-1f466':1670, '1f469-200d-1f469-200d-1f467-200d-1f467':1672, '1f469-200d-1f4bb':1476, '1f469-200d-1f4bc':1470, '1f469-200d-1f527':1464, '1f469-200d-1f52c':1473, '1f469-200d-1f680':1488, '1f469-200d-1f692':1491, '1f469-200d-1f9af':1575, '1f469-200d-1f9b0':1401, '1f469-200d-1f9b1':1403, '1f469-200d-1f9b2':1407, '1f469-200d-1f9b3':1405, '1f469-200d-1f9bc':1578, '1f469-200d-1f9bd':1581, '1f469-200d-2695':1446, '1f469-200d-2696':1455, '1f469-200d-2708':1485, '1f469-200d-2764-200d-1f468':1654, '1f469-200d-2764-200d-1f469':1656, '1f469-200d-2764-200d-1f48b-200d-1f468':1650, '1f469-200d-2764-200d-1f48b-200d-1f469':1652, '1f469':1400, '1f46a':1657, '1f46b':1647, '1f46c':1648, '1f46d':1646, '1f46e-200d-2640':1494, '1f46e-200d-2642':1493, '1f46e':1492, '1f46f-200d-2640':1590, '1f46f-200d-2642':1589, '1f46f':1588, '1f470-200d-2640':1518, '1f470-200d-2642':1517, '1f470':1516, '1f471-200d-2640':1409, '1f471-200d-2642':1410, '1f471':1391, '1f472':1511, '1f473-200d-2640':1510, '1f473-200d-2642':1509, '1f473':1508, '1f474':1412, '1f475':1413, '1f476':1386, '1f477-200d-2640':1504, '1f477-200d-2642':1503, '1f477':1502, '1f478':1507, '1f479':1109, '1f47a':1110, '1f47b':1111, '1f47c':1526, '1f47d':1112, '1f47e':1113, '1f47f':1104, '1f480':1105, '1f481-200d-2640':1428, '1f481-200d-2642':1427, '1f481':1426, '1f482-200d-2640':1500, '1f482-200d-2642':1499, '1f482':1498, '1f483':1585, '1f484':61152, '1f485':1366, '1f486-200d-2640':1560, '1f486-200d-2642':1559, '1f486':1558, '1f487-200d-2640':1563, '1f487-200d-2642':1562, '1f487':1561, '1f488':4870, '1f489':61326, '1f48a':61328, '1f48b':1127, '1f48c':1128, '1f48d':61153, '1f48e':61154, '1f48f':1649, '1f490':2648, '1f491':1653, '1f492':4846, '1f493':1133, '1f494':1138, '1f495':1135, '1f496':1131, '1f497':1132, '1f498':1129, '1f499':1145, '1f49a':1144, '1f49b':1143, '1f49c':1146, '1f49d':1130, '1f49e':1134, '1f49f':1136, '1f4a0':62946, '1f4a1':61214, '1f4a2':1151, '1f4a3':1157, '1f4a4':1163, '1f4a5':1152, '1f4a6':1154, '1f4a7':41022, '1f4a8':1155, '1f4a9':1107, '1f4aa':1368, '1f4ab':1153, '1f4ac':1158, '1f4ad':1162, '1f4ae':2650, '1f4af':1150, '1f4b0':61235, '1f4b1':62841, '1f4b2':62842, '1f4b3':61242, '1f4b4':61237, '1f4b5':61238, '1f4b6':61239, '1f4b7':61240, '1f4b8':61241, '1f4b9':61244, '1f4ba':4936, '1f4bb':61191, '1f4bc':61265, '1f4bd':61197, '1f4be':61198, '1f4bf':61199, '1f4c0':61200, '1f4c1':61266, '1f4c2':61267, '1f4c3':61227, '1f4c4':61229, '1f4c5':61269, '1f4c6':61270, '1f4c7':61273, '1f4c8':61274, '1f4c9':61275, '1f4ca':61276, '1f4cb':61277, '1f4cc':61278, '1f4cd':61279, '1f4ce':61280, '1f4cf':61282, '1f4d0':61283, '1f4d1':61232, '1f4d2':61226, '1f4d3':61225, '1f4d4':61218, '1f4d5':61219, '1f4d6':61220, '1f4d7':61221, '1f4d8':61222, '1f4d9':61223, '1f4da':61224, '1f4db':62847, '1f4dc':61228, '1f4dd':61264, '1f4de':61185, '1f4df':61186, '1f4e0':61187, '1f4e1':61325, '1f4e2':61159, '1f4e3':61160, '1f4e4':61249, '1f4e5':61250, '1f4e6':61251, '1f4e7':61246, '1f4e8':61247, '1f4e9':61248, '1f4ea':61253, '1f4eb':61252, '1f4ec':61254, '1f4ed':61255, '1f4ee':61256, '1f4ef':61161, '1f4f0':61230, '1f4f1':61182, '1f4f2':61183, '1f4f3':62823, '1f4f4':62824, '1f4f5':62751, '1f4f6':62822, '1f4f7':61207, '1f4f8':61208, '1f4f9':61209, '1f4fa':61206, '1f4fb':61172, '1f4fc':61210, '1f4fd':61204, '1f4ff':61151, '1f500':62801, '1f501':62802, '1f502':62803, '1f503':62769, '1f504':62770, '1f505':62820, '1f506':62821, '1f507':61155, '1f508':61156, '1f509':61157, '1f50a':61158, '1f50b':61188, '1f50c':61190, '1f50d':61211, '1f50e':61212, '1f50f':61290, '1f510':61291, '1f511':61292, '1f512':61288, '1f513':61289, '1f514':61162, '1f515':61163, '1f516':61233, '1f517':61313, '1f518':62947, '1f519':62771, '1f51a':62772, '1f51b':62773, '1f51c':62774, '1f51d':62775, '1f51e':62752, '1f51f':62876, '1f520':62877, '1f521':62878, '1f522':62879, '1f523':62880, '1f524':62881, '1f525':41021, '1f526':61215, '1f527':61306, '1f528':61294, '1f529':61308, '1f52a':3803, '1f52b':61301, '1f52c':61323, '1f52d':61324, '1f52e':51082, '1f52f':62787, '1f530':62848, '1f531':62846, '1f532':62949, '1f533':62948, '1f534':62916, '1f535':62920, '1f536':62940, '1f537':62941, '1f538':62942, '1f539':62943, '1f53a':62944, '1f53b':62945, '1f53c':62811, '1f53d':62813, '1f549':62778, '1f54a':2602, '1f54b':4854, '1f54c':4850, '1f54d':4852, '1f54e':62786, '1f550':4955, '1f551':4957, '1f552':4959, '1f553':4961, '1f554':4963, '1f555':4965, '1f556':4967, '1f557':4969, '1f558':4971, '1f559':4973, '1f55a':4975, '1f55b':4953, '1f55c':4956, '1f55d':4958, '1f55e':4960, '1f55f':4962, '1f560':4964, '1f561':4966, '1f562':4968, '1f563':4970, '1f564':4972, '1f565':4974, '1f566':4976, '1f567':4954, '1f56f':61213, '1f570':4952, '1f573':1156, '1f574':1587, '1f575-200d-2640':1497, '1f575-200d-2642':1496, '1f575':1495, '1f576':61111, '1f577':2641, '1f578':2642, '1f579':51087, '1f57a':1586, '1f587':61281, '1f58a':61261, '1f58b':61260, '1f58c':61262, '1f58d':61263, '1f590':1329, '1f595':1348, '1f596':1331, '1f5a4':1148, '1f5a5':61192, '1f5a8':61193, '1f5b1':61195, '1f5b2':61196, '1f5bc':51104, '1f5c2':61268, '1f5c3':61285, '1f5c4':61286, '1f5d1':61287, '1f5d2':61271, '1f5d3':61272, '1f5dc':61310, '1f5dd':61293, '1f5de':61231, '1f5e1':61299, '1f5e3':1683, '1f5e8':1160, '1f5ef':1161, '1f5f3':61257, '1f5fa':4810, '1f5fb':4816, '1f5fc':4847, '1f5fd':4848, '1f5fe':4811, '1f5ff':61362, '1f600':11, '1f601':14, '1f602':18, '1f603':12, '1f604':13, '1f605':16, '1f606':15, '1f607':114, '1f608':1103, '1f609':112, '1f60a':113, '1f60b':124, '1f60c':150, '1f60d':116, '1f60e':170, '1f60f':144, '1f610':139, '1f611':140, '1f612':145, '1f613':195, '1f614':151, '1f615':173, '1f616':192, '1f617':119, '1f618':118, '1f619':122, '1f61a':121, '1f61b':125, '1f61c':126, '1f61d':128, '1f61e':194, '1f61f':175, '1f620':1101, '1f621':1100, '1f622':189, '1f623':193, '1f624':199, '1f625':188, '1f626':184, '1f627':185, '1f628':186, '1f629':196, '1f62a':152, '1f62b':197, '1f62c':147, '1f62d':190, '1f62e-200d-1f4a8':148, '1f62e':178, '1f62f':179, '1f630':187, '1f631':191, '1f632':180, '1f633':181, '1f634':154, '1f635-200d-1f4ab':165, '1f635':164, '1f636-200d-1f32b':143, '1f636':141, '1f637':155, '1f638':1116, '1f639':1117, '1f63a':1115, '1f63b':1118, '1f63c':1119, '1f63d':1120, '1f63e':1123, '1f63f':1122, '1f640':1121, '1f641':176, '1f642':19, '1f643':110, '1f644':146, '1f645-200d-2640':1422, '1f645-200d-2642':1421, '1f645':1420, '1f646-200d-2640':1425, '1f646-200d-2642':1424, '1f646':1423, '1f647-200d-2640':1437, '1f647-200d-2642':1436, '1f647':1435, '1f648':1124, '1f649':1125, '1f64a':1126, '1f64b-200d-2640':1431, '1f64b-200d-2642':1430, '1f64b':1429, '1f64c':1359, '1f64d-200d-2640':1416, '1f64d-200d-2642':1415, '1f64d':1414, '1f64e-200d-2640':1419, '1f64e-200d-2642':1418, '1f64e':1417, '1f64f':1364, '1f680':4942, '1f681':4937, '1f682':4872, '1f683':4873, '1f684':4874, '1f685':4875, '1f686':4876, '1f687':4877, '1f688':4878, '1f689':4879, '1f68a':4880, '1f68b':4883, '1f68c':4884, '1f68d':4885, '1f68e':4886, '1f68f':4911, '1f690':4887, '1f691':4888, '1f692':4889, '1f693':4890, '1f694':4891, '1f695':4892, '1f696':4893, '1f697':4894, '1f698':4895, '1f699':4896, '1f69a':4898, '1f69b':4899, '1f69c':4900, '1f69d':4881, '1f69e':4882, '1f69f':4938, '1f6a0':4939, '1f6a1':4940, '1f6a2':4930, '1f6a3-200d-2640':1609, '1f6a3-200d-2642':1608, '1f6a3':1607, '1f6a4':4926, '1f6a5':4918, '1f6a6':4919, '1f6a7':4921, '1f6a8':4917, '1f6a9':71587, '1f6aa':61333, '1f6ab':62745, '1f6ac':61358, '1f6ad':62747, '1f6ae':62730, '1f6af':62748, '1f6b0':62731, '1f6b1':62749, '1f6b2':4907, '1f6b3':62746, '1f6b4-200d-2640':1621, '1f6b4-200d-2642':1620, '1f6b4':1619, '1f6b5-200d-2640':1624, '1f6b5-200d-2642':1623, '1f6b5':1622, '1f6b6-200d-2640':1566, '1f6b6-200d-2642':1565, '1f6b6':1564, '1f6b7':62750, '1f6b8':62743, '1f6b9':62733, '1f6ba':62734, '1f6bb':62735, '1f6bc':62736, '1f6bd':61340, '1f6be':62737, '1f6bf':61342, '1f6c0':1643, '1f6c1':61343, '1f6c2':62738, '1f6c3':62739, '1f6c4':62740, '1f6c5':62741, '1f6cb':61338, '1f6cc':1644, '1f6cd':61133, '1f6ce':4944, '1f6cf':61337, '1f6d0':62776, '1f6d1':4920, '1f6d2':61357, '1f6d5':4851, '1f6d6':4828, '1f6d7':61334, '1f6e0':61298, '1f6e1':61304, '1f6e2':4914, '1f6e3':4912, '1f6e4':4913, '1f6e5':4929, '1f6e9':4932, '1f6eb':4933, '1f6ec':4934, '1f6f0':4941, '1f6f3':4927, '1f6f4':4908, '1f6f5':4903, '1f6f6':4925, '1f6f7':51076, '1f6f8':4943, '1f6f9':4909, '1f6fa':4906, '1f6fb':4897, '1f6fc':4910, '1f7e0':62917, '1f7e1':62918, '1f7e2':62919, '1f7e3':62921, '1f7e4':62922, '1f7e5':62925, '1f7e6':62929, '1f7e7':62926, '1f7e8':62927, '1f7e9':62928, '1f7ea':62930, '1f7eb':62931, '1f90c':1337, '1f90d':1149, '1f90e':1147, '1f90f':1338, '1f910':137, '1f911':129, '1f912':156, '1f913':171, '1f914':135, '1f915':157, '1f916':1114, '1f917':130, '1f918':1343, '1f919':1344, '1f91a':1328, '1f91b':1356, '1f91c':1357, '1f91d':1363, '1f91e':1340, '1f91f':1342, '1f920':167, '1f921':1108, '1f922':158, '1f923':17, '1f924':153, '1f925':149, '1f926-200d-2640':1440, '1f926-200d-2642':1439, '1f926':1438, '1f927':160, '1f928':138, '1f929':117, '1f92a':127, '1f92b':134, '1f92c':1102, '1f92d':131, '1f92e':159, '1f92f':166, '1f930':1519, '1f931':1522, '1f932':1362, '1f933':1367, '1f934':1506, '1f935-200d-2640':1515, '1f935-200d-2642':1514, '1f935':1513, '1f936':1528, '1f937-200d-2640':1443, '1f937-200d-2642':1442, '1f937':1441, '1f938-200d-2640':1627, '1f938-200d-2642':1626, '1f938':1625, '1f939-200d-2640':1639, '1f939-200d-2642':1638, '1f939':1637, '1f93a':1597, '1f93c-200d-2640':1630, '1f93c-200d-2642':1629, '1f93c':1628, '1f93d-200d-2640':1633, '1f93d-200d-2642':1632, '1f93d':1631, '1f93e-200d-2640':1636, '1f93e-200d-2642':1635, '1f93e':1634, '1f93f':51073, '1f940':2654, '1f941':61180, '1f942':3791, '1f943':3792, '1f944':3802, '1f945':51069, '1f947':51048, '1f948':51049, '1f949':51050, '1f94a':51067, '1f94b':51068, '1f94c':51077, '1f94d':51064, '1f94e':51053, '1f94f':51059, '1f950':3710, '1f951':3693, '1f952':3700, '1f953':3721, '1f954':3695, '1f955':3696, '1f956':3711, '1f957':3738, '1f958':3734, '1f959':3730, '1f95a':3732, '1f95b':3780, '1f95c':3706, '1f95d':3689, '1f95e':3715, '1f95f':3757, '1f960':3758, '1f961':3759, '1f962':3799, '1f963':3737, '1f964':3794, '1f965':3692, '1f966':3702, '1f967':3773, '1f968':3713, '1f969':3720, '1f96a':3726, '1f96b':3742, '1f96c':3701, '1f96d':3681, '1f96e':3755, '1f96f':3714, '1f970':115, '1f971':198, '1f972':123, '1f973':168, '1f974':163, '1f975':161, '1f976':162, '1f977':1501, '1f978':169, '1f97a':182, '1f97b':61124, '1f97c':61113, '1f97d':61112, '1f97e':61138, '1f97f':61139, '1f980':3760, '1f981':2545, '1f982':2643, '1f983':2594, '1f984':2551, '1f985':2603, '1f986':2604, '1f987':2583, '1f988':2628, '1f989':2606, '1f98a':2540, '1f98b':2633, '1f98c':2553, '1f98d':2532, '1f98e':2615, '1f98f':2572, '1f990':3762, '1f991':3763, '1f992':2569, '1f993':2552, '1f994':2582, '1f995':2619, '1f996':2620, '1f997':2639, '1f998':2591, '1f999':2568, '1f99a':2610, '1f99b':2573, '1f99c':2611, '1f99d':2541, '1f99e':3761, '1f99f':2644, '1f9a0':2647, '1f9a1':2592, '1f9a2':2605, '1f9a3':2571, '1f9a4':2607, '1f9a5':2588, '1f9a6':2589, '1f9a7':2533, '1f9a8':2590, '1f9a9':2609, '1f9aa':3764, '1f9ab':2581, '1f9ac':2554, '1f9ad':2624, '1f9ae':2536, '1f9af':61312, '1f9b4':1380, '1f9b5':1371, '1f9b6':1372, '1f9b7':1379, '1f9b8-200d-2640':1532, '1f9b8-200d-2642':1531, '1f9b8':1530, '1f9b9-200d-2640':1535, '1f9b9-200d-2642':1534, '1f9b9':1533, '1f9ba':61114, '1f9bb':1374, '1f9bc':4905, '1f9bd':4904, '1f9be':1369, '1f9bf':1370, '1f9c0':3717, '1f9c1':3772, '1f9c2':3741, '1f9c3':3796, '1f9c4':3703, '1f9c5':3704, '1f9c6':3731, '1f9c7':3716, '1f9c8':3740, '1f9c9':3797, '1f9ca':3798, '1f9cb':3795, '1f9cd-200d-2640':1569, '1f9cd-200d-2642':1568, '1f9cd':1567, '1f9ce-200d-2640':1572, '1f9ce-200d-2642':1571, '1f9ce':1570, '1f9cf-200d-2640':1434, '1f9cf-200d-2642':1433, '1f9cf':1432, '1f9d0':172, '1f9d1-200d-1f33e':1456, '1f9d1-200d-1f373':1459, '1f9d1-200d-1f37c':1525, '1f9d1-200d-1f384':1529, '1f9d1-200d-1f393':1447, '1f9d1-200d-1f3a4':1477, '1f9d1-200d-1f3a8':1480, '1f9d1-200d-1f3eb':1450, '1f9d1-200d-1f3ed':1465, '1f9d1-200d-1f4bb':1474, '1f9d1-200d-1f4bc':1468, '1f9d1-200d-1f527':1462, '1f9d1-200d-1f52c':1471, '1f9d1-200d-1f680':1486, '1f9d1-200d-1f692':1489, '1f9d1-200d-1f91d-200d-1f9d1':1645, '1f9d1-200d-1f9af':1573, '1f9d1-200d-1f9b0':1402, '1f9d1-200d-1f9b1':1404, '1f9d1-200d-1f9b2':1408, '1f9d1-200d-1f9b3':1406, '1f9d1-200d-1f9bc':1576, '1f9d1-200d-1f9bd':1579, '1f9d1-200d-2695':1444, '1f9d1-200d-2696':1453, '1f9d1-200d-2708':1483, '1f9d1':1390, '1f9d2':1387, '1f9d3':1411, '1f9d4-200d-2640':1395, '1f9d4-200d-2642':1394, '1f9d4':1393, '1f9d5':1512, '1f9d6-200d-2640':1593, '1f9d6-200d-2642':1592, '1f9d6':1591, '1f9d7-200d-2640':1596, '1f9d7-200d-2642':1595, '1f9d7':1594, '1f9d8-200d-2640':1642, '1f9d8-200d-2642':1641, '1f9d8':1640, '1f9d9-200d-2640':1538, '1f9d9-200d-2642':1537, '1f9d9':1536, '1f9da-200d-2640':1541, '1f9da-200d-2642':1540, '1f9da':1539, '1f9db-200d-2640':1544, '1f9db-200d-2642':1543, '1f9db':1542, '1f9dc-200d-2640':1547, '1f9dc-200d-2642':1546, '1f9dc':1545, '1f9dd-200d-2640':1550, '1f9dd-200d-2642':1549, '1f9dd':1548, '1f9de-200d-2640':1553, '1f9de-200d-2642':1552, '1f9de':1551, '1f9df-200d-2640':1556, '1f9df-200d-2642':1555, '1f9df':1554, '1f9e0':1376, '1f9e1':1142, '1f9e2':61148, '1f9e3':61118, '1f9e4':61119, '1f9e5':61120, '1f9e6':61121, '1f9e7':51039, '1f9e8':51028, '1f9e9':51090, '1f9ea':61320, '1f9eb':61321, '1f9ec':61322, '1f9ed':4812, '1f9ee':61201, '1f9ef':61356, '1f9f0':61316, '1f9f1':4825, '1f9f2':61317, '1f9f3':4945, '1f9f4':61346, '1f9f5':51106, '1f9f6':51108, '1f9f7':61347, '1f9f8':51091, '1f9f9':61348, '1f9fa':61349, '1f9fb':61350, '1f9fc':61352, '1f9fd':61355, '1f9fe':61243, '1f9ff':51084, '1fa70':61142, '1fa71':61125, '1fa72':61126, '1fa73':61127, '1fa74':61135, '1fa78':61327, '1fa79':61329, '1fa7a':61331, '1fa80':51079, '1fa81':51080, '1fa82':4935, '1fa83':61302, '1fa84':51083, '1fa85':51092, '1fa86':51094, '1fa90':4993, '1fa91':61339, '1fa92':61345, '1fa93':61295, '1fa94':61217, '1fa95':61179, '1fa96':61149, '1fa97':61174, '1fa98':61181, '1fa99':61236, '1fa9a':61305, '1fa9b':61307, '1fa9c':61318, '1fa9d':61315, '1fa9e':61335, '1fa9f':61336, '1faa0':61341, '1faa1':51107, '1faa2':51109, '1faa3':61351, '1faa4':61344, '1faa5':61354, '1faa6':61360, '1faa7':61363, '1faa8':4826, '1fab0':2645, '1fab1':2646, '1fab2':2637, '1fab3':2640, '1fab4':2660, '1fab5':4827, '1fab6':2608, '1fac0':1377, '1fac1':1378, '1fac2':1686, '1fad0':3688, '1fad1':3699, '1fad2':3691, '1fad3':3712, '1fad4':3729, '1fad5':3736, '1fad6':3782, '203c':62834, '21a9':62765, '21aa':62766, '231a':4948, '231b':4946, '23cf':62818, '23e9':62805, '23ea':62809, '23eb':62812, '23ec':62814, '23ed':62806, '23ee':62810, '23ef':62807, '23f0':4949, '23f1':4950, '23f2':4951, '23f3':4947, '23f8':62815, '23f9':62816, '23fa':62817, '24c2':62890, '25aa':62938, '25ab':62939, '25b6':62804, '25c0':62808, '25fb':62935, '25fc':62934, '25fd':62937, '25fe':62936, '260e':61184, '261d':1350, '262a':62784, '262e':62785, '262f':62781, '263a':120, '264a':62790, '264b':62791, '264c':62792, '264d':62793, '264e':62794, '264f':62795, '265f':51099, '267b':62844, '267e':62833, '267f':62732, '269b':62777, '269c':62845, '26a0':62742, '26a1':41016, '26a7':62827, '26aa':62924, '26ab':62923, '26b0':61359, '26b1':61361, '26bd':51051, '26be':51052, '26c4':41019, '26c5':4999, '26c8':41000, '26ce':62800, '26cf':61296, '26d1':61150, '26d3':61314, '26d4':62744, '26e9':4853, '26ea':4849, '26f0':4814, '26f1':41015, '26f2':4855, '26f3':51070, '26f4':4928, '26f5':4924, '26f7':1599, '26f8':51071, '26f9-200d-2640':1615, '26f9-200d-2642':1614, '26f9':1613, '26fa':4856, '26fd':4915, '270a':1354, '270b':1330, '270c':1339, '270d':1365, '270f':61258, '271d':62782, '274c':62853, '274e':62854, '2764-200d-1f525':1139, '2764-200d-1fa79':1140, '27a1':62757, '27b0':62855, '27bf':62856, '2b05':62761, '2b06':62755, '2b07':62759, '2b1b':62932, '2b1c':62933, '2b50':4994, '2b55':62849, '303d':62857, '1f385-1f3fb':0, '1f385-1f3fc':0, '1f385-1f3fd':0, '1f385-1f3fe':0, '1f385-1f3ff':0, '1f3c2-1f3fb':0, '1f3c2-1f3fc':0, '1f3c2-1f3fd':0, '1f3c2-1f3fe':0, '1f3c2-1f3ff':0, '1f3c3-1f3fb-200d-2640':0, '1f3c3-1f3fc-200d-2640':0, '1f3c3-1f3fd-200d-2640':0, '1f3c3-1f3fe-200d-2640':0, '1f3c3-1f3ff-200d-2640':0, '1f3c3-1f3fb-200d-2642':0, '1f3c3-1f3fc-200d-2642':0, '1f3c3-1f3fd-200d-2642':0, '1f3c3-1f3fe-200d-2642':0, '1f3c3-1f3ff-200d-2642':0, '1f3c3-1f3fb':0, '1f3c3-1f3fc':0, '1f3c3-1f3fd':0, '1f3c3-1f3fe':0, '1f3c3-1f3ff':0, '1f3c4-1f3fb-200d-2640':0, '1f3c4-1f3fc-200d-2640':0, '1f3c4-1f3fd-200d-2640':0, '1f3c4-1f3fe-200d-2640':0, '1f3c4-1f3ff-200d-2640':0, '1f3c4-1f3fb-200d-2642':0, '1f3c4-1f3fc-200d-2642':0, '1f3c4-1f3fd-200d-2642':0, '1f3c4-1f3fe-200d-2642':0, '1f3c4-1f3ff-200d-2642':0, '1f3c4-1f3fb':0, '1f3c4-1f3fc':0, '1f3c4-1f3fd':0, '1f3c4-1f3fe':0, '1f3c4-1f3ff':0, '1f3c7-1f3fb':0, '1f3c7-1f3fc':0, '1f3c7-1f3fd':0, '1f3c7-1f3fe':0, '1f3c7-1f3ff':0, '1f3ca-1f3fb-200d-2640':0, '1f3ca-1f3fc-200d-2640':0, '1f3ca-1f3fd-200d-2640':0, '1f3ca-1f3fe-200d-2640':0, '1f3ca-1f3ff-200d-2640':0, '1f3ca-1f3fb-200d-2642':0, '1f3ca-1f3fc-200d-2642':0, '1f3ca-1f3fd-200d-2642':0, '1f3ca-1f3fe-200d-2642':0, '1f3ca-1f3ff-200d-2642':0, '1f3ca-1f3fb':0, '1f3ca-1f3fc':0, '1f3ca-1f3fd':0, '1f3ca-1f3fe':0, '1f3ca-1f3ff':0, '1f3cb-1f3fb-200d-2640':0, '1f3cb-1f3fc-200d-2640':0, '1f3cb-1f3fd-200d-2640':0, '1f3cb-1f3fe-200d-2640':0, '1f3cb-1f3ff-200d-2640':0, '1f3cb-1f3fb-200d-2642':0, '1f3cb-1f3fc-200d-2642':0, '1f3cb-1f3fd-200d-2642':0, '1f3cb-1f3fe-200d-2642':0, '1f3cb-1f3ff-200d-2642':0, '1f3cb-1f3fb':0, '1f3cb-1f3fc':0, '1f3cb-1f3fd':0, '1f3cb-1f3fe':0, '1f3cb-1f3ff':0, '1f3cc-1f3fb-200d-2640':0, '1f3cc-1f3fc-200d-2640':0, '1f3cc-1f3fd-200d-2640':0, '1f3cc-1f3fe-200d-2640':0, '1f3cc-1f3ff-200d-2640':0, '1f3cc-1f3fb-200d-2642':0, '1f3cc-1f3fc-200d-2642':0, '1f3cc-1f3fd-200d-2642':0, '1f3cc-1f3fe-200d-2642':0, '1f3cc-1f3ff-200d-2642':0, '1f3cc-1f3fb':0, '1f3cc-1f3fc':0, '1f3cc-1f3fd':0, '1f3cc-1f3fe':0, '1f3cc-1f3ff':0, '1f442-1f3fb':0, '1f442-1f3fc':0, '1f442-1f3fd':0, '1f442-1f3fe':0, '1f442-1f3ff':0, '1f443-1f3fb':0, '1f443-1f3fc':0, '1f443-1f3fd':0, '1f443-1f3fe':0, '1f443-1f3ff':0, '1f446-1f3fb':0, '1f446-1f3fc':0, '1f446-1f3fd':0, '1f446-1f3fe':0, '1f446-1f3ff':0, '1f447-1f3fb':0, '1f447-1f3fc':0, '1f447-1f3fd':0, '1f447-1f3fe':0, '1f447-1f3ff':0, '1f448-1f3fb':0, '1f448-1f3fc':0, '1f448-1f3fd':0, '1f448-1f3fe':0, '1f448-1f3ff':0, '1f449-1f3fb':0, '1f449-1f3fc':0, '1f449-1f3fd':0, '1f449-1f3fe':0, '1f449-1f3ff':0, '1f44a-1f3fb':0, '1f44a-1f3fc':0, '1f44a-1f3fd':0, '1f44a-1f3fe':0, '1f44a-1f3ff':0, '1f44b-1f3fb':0, '1f44b-1f3fc':0, '1f44b-1f3fd':0, '1f44b-1f3fe':0, '1f44b-1f3ff':0, '1f44c-1f3fb':0, '1f44c-1f3fc':0, '1f44c-1f3fd':0, '1f44c-1f3fe':0, '1f44c-1f3ff':0, '1f44d-1f3fb':0, '1f44d-1f3fc':0, '1f44d-1f3fd':0, '1f44d-1f3fe':0, '1f44d-1f3ff':0, '1f44e-1f3fb':0, '1f44e-1f3fc':0, '1f44e-1f3fd':0, '1f44e-1f3fe':0, '1f44e-1f3ff':0, '1f44f-1f3fb':0, '1f44f-1f3fc':0, '1f44f-1f3fd':0, '1f44f-1f3fe':0, '1f44f-1f3ff':0, '1f450-1f3fb':0, '1f450-1f3fc':0, '1f450-1f3fd':0, '1f450-1f3fe':0, '1f450-1f3ff':0, '1f466-1f3fb':0, '1f466-1f3fc':0, '1f466-1f3fd':0, '1f466-1f3fe':0, '1f466-1f3ff':0, '1f467-1f3fb':0, '1f467-1f3fc':0, '1f467-1f3fd':0, '1f467-1f3fe':0, '1f467-1f3ff':0, '1f468-1f3fb-200d-1f33e':0, '1f468-1f3fc-200d-1f33e':0, '1f468-1f3fd-200d-1f33e':0, '1f468-1f3fe-200d-1f33e':0, '1f468-1f3ff-200d-1f33e':0, '1f468-1f3fb-200d-1f373':0, '1f468-1f3fc-200d-1f373':0, '1f468-1f3fd-200d-1f373':0, '1f468-1f3fe-200d-1f373':0, '1f468-1f3ff-200d-1f373':0, '1f468-1f3fb-200d-1f37c':0, '1f468-1f3fc-200d-1f37c':0, '1f468-1f3fd-200d-1f37c':0, '1f468-1f3fe-200d-1f37c':0, '1f468-1f3ff-200d-1f37c':0, '1f468-1f3fb-200d-1f393':0, '1f468-1f3fc-200d-1f393':0, '1f468-1f3fd-200d-1f393':0, '1f468-1f3fe-200d-1f393':0, '1f468-1f3ff-200d-1f393':0, '1f468-1f3fb-200d-1f3a4':0, '1f468-1f3fc-200d-1f3a4':0, '1f468-1f3fd-200d-1f3a4':0, '1f468-1f3fe-200d-1f3a4':0, '1f468-1f3ff-200d-1f3a4':0, '1f468-1f3fb-200d-1f3a8':0, '1f468-1f3fc-200d-1f3a8':0, '1f468-1f3fd-200d-1f3a8':0, '1f468-1f3fe-200d-1f3a8':0, '1f468-1f3ff-200d-1f3a8':0, '1f468-1f3fb-200d-1f3eb':0, '1f468-1f3fc-200d-1f3eb':0, '1f468-1f3fd-200d-1f3eb':0, '1f468-1f3fe-200d-1f3eb':0, '1f468-1f3ff-200d-1f3eb':0, '1f468-1f3fb-200d-1f3ed':0, '1f468-1f3fc-200d-1f3ed':0, '1f468-1f3fd-200d-1f3ed':0, '1f468-1f3fe-200d-1f3ed':0, '1f468-1f3ff-200d-1f3ed':0, '1f468-1f3fb-200d-1f4bb':0, '1f468-1f3fc-200d-1f4bb':0, '1f468-1f3fd-200d-1f4bb':0, '1f468-1f3fe-200d-1f4bb':0, '1f468-1f3ff-200d-1f4bb':0, '1f468-1f3fb-200d-1f4bc':0, '1f468-1f3fc-200d-1f4bc':0, '1f468-1f3fd-200d-1f4bc':0, '1f468-1f3fe-200d-1f4bc':0, '1f468-1f3ff-200d-1f4bc':0, '1f468-1f3fb-200d-1f527':0, '1f468-1f3fc-200d-1f527':0, '1f468-1f3fd-200d-1f527':0, '1f468-1f3fe-200d-1f527':0, '1f468-1f3ff-200d-1f527':0, '1f468-1f3fb-200d-1f52c':0, '1f468-1f3fc-200d-1f52c':0, '1f468-1f3fd-200d-1f52c':0, '1f468-1f3fe-200d-1f52c':0, '1f468-1f3ff-200d-1f52c':0, '1f468-1f3fb-200d-1f680':0, '1f468-1f3fc-200d-1f680':0, '1f468-1f3fd-200d-1f680':0, '1f468-1f3fe-200d-1f680':0, '1f468-1f3ff-200d-1f680':0, '1f468-1f3fb-200d-1f692':0, '1f468-1f3fc-200d-1f692':0, '1f468-1f3fd-200d-1f692':0, '1f468-1f3fe-200d-1f692':0, '1f468-1f3ff-200d-1f692':0, '1f468-1f3fb-200d-1f9af':0, '1f468-1f3fc-200d-1f9af':0, '1f468-1f3fd-200d-1f9af':0, '1f468-1f3fe-200d-1f9af':0, '1f468-1f3ff-200d-1f9af':0, '1f468-1f3fb-200d-1f9b0':0, '1f468-1f3fc-200d-1f9b0':0, '1f468-1f3fd-200d-1f9b0':0, '1f468-1f3fe-200d-1f9b0':0, '1f468-1f3ff-200d-1f9b0':0, '1f468-1f3fb-200d-1f9b1':0, '1f468-1f3fc-200d-1f9b1':0, '1f468-1f3fd-200d-1f9b1':0, '1f468-1f3fe-200d-1f9b1':0, '1f468-1f3ff-200d-1f9b1':0, '1f468-1f3fb-200d-1f9b2':0, '1f468-1f3fc-200d-1f9b2':0, '1f468-1f3fd-200d-1f9b2':0, '1f468-1f3fe-200d-1f9b2':0, '1f468-1f3ff-200d-1f9b2':0, '1f468-1f3fb-200d-1f9b3':0, '1f468-1f3fc-200d-1f9b3':0, '1f468-1f3fd-200d-1f9b3':0, '1f468-1f3fe-200d-1f9b3':0, '1f468-1f3ff-200d-1f9b3':0, '1f468-1f3fb-200d-1f9bc':0, '1f468-1f3fc-200d-1f9bc':0, '1f468-1f3fd-200d-1f9bc':0, '1f468-1f3fe-200d-1f9bc':0, '1f468-1f3ff-200d-1f9bc':0, '1f468-1f3fb-200d-1f9bd':0, '1f468-1f3fc-200d-1f9bd':0, '1f468-1f3fd-200d-1f9bd':0, '1f468-1f3fe-200d-1f9bd':0, '1f468-1f3ff-200d-1f9bd':0, '1f468-1f3fb-200d-2695':0, '1f468-1f3fc-200d-2695':0, '1f468-1f3fd-200d-2695':0, '1f468-1f3fe-200d-2695':0, '1f468-1f3ff-200d-2695':0, '1f468-1f3fb-200d-2696':0, '1f468-1f3fc-200d-2696':0, '1f468-1f3fd-200d-2696':0, '1f468-1f3fe-200d-2696':0, '1f468-1f3ff-200d-2696':0, '1f468-1f3fb-200d-2708':0, '1f468-1f3fc-200d-2708':0, '1f468-1f3fd-200d-2708':0, '1f468-1f3fe-200d-2708':0, '1f468-1f3ff-200d-2708':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fb':0, '1f468-1f3fc':0, '1f468-1f3fd':0, '1f468-1f3fe':0, '1f468-1f3ff':0, '1f469-1f3fb-200d-1f33e':0, '1f469-1f3fc-200d-1f33e':0, '1f469-1f3fd-200d-1f33e':0, '1f469-1f3fe-200d-1f33e':0, '1f469-1f3ff-200d-1f33e':0, '1f469-1f3fb-200d-1f373':0, '1f469-1f3fc-200d-1f373':0, '1f469-1f3fd-200d-1f373':0, '1f469-1f3fe-200d-1f373':0, '1f469-1f3ff-200d-1f373':0, '1f469-1f3fb-200d-1f37c':0, '1f469-1f3fc-200d-1f37c':0, '1f469-1f3fd-200d-1f37c':0, '1f469-1f3fe-200d-1f37c':0, '1f469-1f3ff-200d-1f37c':0, '1f469-1f3fb-200d-1f393':0, '1f469-1f3fc-200d-1f393':0, '1f469-1f3fd-200d-1f393':0, '1f469-1f3fe-200d-1f393':0, '1f469-1f3ff-200d-1f393':0, '1f469-1f3fb-200d-1f3a4':0, '1f469-1f3fc-200d-1f3a4':0, '1f469-1f3fd-200d-1f3a4':0, '1f469-1f3fe-200d-1f3a4':0, '1f469-1f3ff-200d-1f3a4':0, '1f469-1f3fb-200d-1f3a8':0, '1f469-1f3fc-200d-1f3a8':0, '1f469-1f3fd-200d-1f3a8':0, '1f469-1f3fe-200d-1f3a8':0, '1f469-1f3ff-200d-1f3a8':0, '1f469-1f3fb-200d-1f3eb':0, '1f469-1f3fc-200d-1f3eb':0, '1f469-1f3fd-200d-1f3eb':0, '1f469-1f3fe-200d-1f3eb':0, '1f469-1f3ff-200d-1f3eb':0, '1f469-1f3fb-200d-1f3ed':0, '1f469-1f3fc-200d-1f3ed':0, '1f469-1f3fd-200d-1f3ed':0, '1f469-1f3fe-200d-1f3ed':0, '1f469-1f3ff-200d-1f3ed':0, '1f469-1f3fb-200d-1f4bb':0, '1f469-1f3fc-200d-1f4bb':0, '1f469-1f3fd-200d-1f4bb':0, '1f469-1f3fe-200d-1f4bb':0, '1f469-1f3ff-200d-1f4bb':0, '1f469-1f3fb-200d-1f4bc':0, '1f469-1f3fc-200d-1f4bc':0, '1f469-1f3fd-200d-1f4bc':0, '1f469-1f3fe-200d-1f4bc':0, '1f469-1f3ff-200d-1f4bc':0, '1f469-1f3fb-200d-1f527':0, '1f469-1f3fc-200d-1f527':0, '1f469-1f3fd-200d-1f527':0, '1f469-1f3fe-200d-1f527':0, '1f469-1f3ff-200d-1f527':0, '1f469-1f3fb-200d-1f52c':0, '1f469-1f3fc-200d-1f52c':0, '1f469-1f3fd-200d-1f52c':0, '1f469-1f3fe-200d-1f52c':0, '1f469-1f3ff-200d-1f52c':0, '1f469-1f3fb-200d-1f680':0, '1f469-1f3fc-200d-1f680':0, '1f469-1f3fd-200d-1f680':0, '1f469-1f3fe-200d-1f680':0, '1f469-1f3ff-200d-1f680':0, '1f469-1f3fb-200d-1f692':0, '1f469-1f3fc-200d-1f692':0, '1f469-1f3fd-200d-1f692':0, '1f469-1f3fe-200d-1f692':0, '1f469-1f3ff-200d-1f692':0, '1f469-1f3fb-200d-1f9af':0, '1f469-1f3fc-200d-1f9af':0, '1f469-1f3fd-200d-1f9af':0, '1f469-1f3fe-200d-1f9af':0, '1f469-1f3ff-200d-1f9af':0, '1f469-1f3fb-200d-1f9b0':0, '1f469-1f3fc-200d-1f9b0':0, '1f469-1f3fd-200d-1f9b0':0, '1f469-1f3fe-200d-1f9b0':0, '1f469-1f3ff-200d-1f9b0':0, '1f469-1f3fb-200d-1f9b1':0, '1f469-1f3fc-200d-1f9b1':0, '1f469-1f3fd-200d-1f9b1':0, '1f469-1f3fe-200d-1f9b1':0, '1f469-1f3ff-200d-1f9b1':0, '1f469-1f3fb-200d-1f9b2':0, '1f469-1f3fc-200d-1f9b2':0, '1f469-1f3fd-200d-1f9b2':0, '1f469-1f3fe-200d-1f9b2':0, '1f469-1f3ff-200d-1f9b2':0, '1f469-1f3fb-200d-1f9b3':0, '1f469-1f3fc-200d-1f9b3':0, '1f469-1f3fd-200d-1f9b3':0, '1f469-1f3fe-200d-1f9b3':0, '1f469-1f3ff-200d-1f9b3':0, '1f469-1f3fb-200d-1f9bc':0, '1f469-1f3fc-200d-1f9bc':0, '1f469-1f3fd-200d-1f9bc':0, '1f469-1f3fe-200d-1f9bc':0, '1f469-1f3ff-200d-1f9bc':0, '1f469-1f3fb-200d-1f9bd':0, '1f469-1f3fc-200d-1f9bd':0, '1f469-1f3fd-200d-1f9bd':0, '1f469-1f3fe-200d-1f9bd':0, '1f469-1f3ff-200d-1f9bd':0, '1f469-1f3fb-200d-2695':0, '1f469-1f3fc-200d-2695':0, '1f469-1f3fd-200d-2695':0, '1f469-1f3fe-200d-2695':0, '1f469-1f3ff-200d-2695':0, '1f469-1f3fb-200d-2696':0, '1f469-1f3fc-200d-2696':0, '1f469-1f3fd-200d-2696':0, '1f469-1f3fe-200d-2696':0, '1f469-1f3ff-200d-2696':0, '1f469-1f3fb-200d-2708':0, '1f469-1f3fc-200d-2708':0, '1f469-1f3fd-200d-2708':0, '1f469-1f3fe-200d-2708':0, '1f469-1f3ff-200d-2708':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fb':0, '1f469-1f3fc':0, '1f469-1f3fd':0, '1f469-1f3fe':0, '1f469-1f3ff':0, '1f46b-1f3fb':0, '1f46b-1f3fc':0, '1f46b-1f3fd':0, '1f46b-1f3fe':0, '1f46b-1f3ff':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe':0, '1f46c-1f3fb':0, '1f46c-1f3fc':0, '1f46c-1f3fd':0, '1f46c-1f3fe':0, '1f46c-1f3ff':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe':0, '1f46d-1f3fb':0, '1f46d-1f3fc':0, '1f46d-1f3fd':0, '1f46d-1f3fe':0, '1f46d-1f3ff':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe':0, '1f46e-1f3fb-200d-2640':0, '1f46e-1f3fc-200d-2640':0, '1f46e-1f3fd-200d-2640':0, '1f46e-1f3fe-200d-2640':0, '1f46e-1f3ff-200d-2640':0, '1f46e-1f3fb-200d-2642':0, '1f46e-1f3fc-200d-2642':0, '1f46e-1f3fd-200d-2642':0, '1f46e-1f3fe-200d-2642':0, '1f46e-1f3ff-200d-2642':0, '1f46e-1f3fb':0, '1f46e-1f3fc':0, '1f46e-1f3fd':0, '1f46e-1f3fe':0, '1f46e-1f3ff':0, '1f470-1f3fb-200d-2640':0, '1f470-1f3fc-200d-2640':0, '1f470-1f3fd-200d-2640':0, '1f470-1f3fe-200d-2640':0, '1f470-1f3ff-200d-2640':0, '1f470-1f3fb-200d-2642':0, '1f470-1f3fc-200d-2642':0, '1f470-1f3fd-200d-2642':0, '1f470-1f3fe-200d-2642':0, '1f470-1f3ff-200d-2642':0, '1f470-1f3fb':0, '1f470-1f3fc':0, '1f470-1f3fd':0, '1f470-1f3fe':0, '1f470-1f3ff':0, '1f471-1f3fb-200d-2640':0, '1f471-1f3fc-200d-2640':0, '1f471-1f3fd-200d-2640':0, '1f471-1f3fe-200d-2640':0, '1f471-1f3ff-200d-2640':0, '1f471-1f3fb-200d-2642':0, '1f471-1f3fc-200d-2642':0, '1f471-1f3fd-200d-2642':0, '1f471-1f3fe-200d-2642':0, '1f471-1f3ff-200d-2642':0, '1f471-1f3fb':0, '1f471-1f3fc':0, '1f471-1f3fd':0, '1f471-1f3fe':0, '1f471-1f3ff':0, '1f472-1f3fb':0, '1f472-1f3fc':0, '1f472-1f3fd':0, '1f472-1f3fe':0, '1f472-1f3ff':0, '1f473-1f3fb-200d-2640':0, '1f473-1f3fc-200d-2640':0, '1f473-1f3fd-200d-2640':0, '1f473-1f3fe-200d-2640':0, '1f473-1f3ff-200d-2640':0, '1f473-1f3fb-200d-2642':0, '1f473-1f3fc-200d-2642':0, '1f473-1f3fd-200d-2642':0, '1f473-1f3fe-200d-2642':0, '1f473-1f3ff-200d-2642':0, '1f473-1f3fb':0, '1f473-1f3fc':0, '1f473-1f3fd':0, '1f473-1f3fe':0, '1f473-1f3ff':0, '1f474-1f3fb':0, '1f474-1f3fc':0, '1f474-1f3fd':0, '1f474-1f3fe':0, '1f474-1f3ff':0, '1f475-1f3fb':0, '1f475-1f3fc':0, '1f475-1f3fd':0, '1f475-1f3fe':0, '1f475-1f3ff':0, '1f476-1f3fb':0, '1f476-1f3fc':0, '1f476-1f3fd':0, '1f476-1f3fe':0, '1f476-1f3ff':0, '1f477-1f3fb-200d-2640':0, '1f477-1f3fc-200d-2640':0, '1f477-1f3fd-200d-2640':0, '1f477-1f3fe-200d-2640':0, '1f477-1f3ff-200d-2640':0, '1f477-1f3fb-200d-2642':0, '1f477-1f3fc-200d-2642':0, '1f477-1f3fd-200d-2642':0, '1f477-1f3fe-200d-2642':0, '1f477-1f3ff-200d-2642':0, '1f477-1f3fb':0, '1f477-1f3fc':0, '1f477-1f3fd':0, '1f477-1f3fe':0, '1f477-1f3ff':0, '1f478-1f3fb':0, '1f478-1f3fc':0, '1f478-1f3fd':0, '1f478-1f3fe':0, '1f478-1f3ff':0, '1f47c-1f3fb':0, '1f47c-1f3fc':0, '1f47c-1f3fd':0, '1f47c-1f3fe':0, '1f47c-1f3ff':0, '1f481-1f3fb-200d-2640':0, '1f481-1f3fc-200d-2640':0, '1f481-1f3fd-200d-2640':0, '1f481-1f3fe-200d-2640':0, '1f481-1f3ff-200d-2640':0, '1f481-1f3fb-200d-2642':0, '1f481-1f3fc-200d-2642':0, '1f481-1f3fd-200d-2642':0, '1f481-1f3fe-200d-2642':0, '1f481-1f3ff-200d-2642':0, '1f481-1f3fb':0, '1f481-1f3fc':0, '1f481-1f3fd':0, '1f481-1f3fe':0, '1f481-1f3ff':0, '1f482-1f3fb-200d-2640':0, '1f482-1f3fc-200d-2640':0, '1f482-1f3fd-200d-2640':0, '1f482-1f3fe-200d-2640':0, '1f482-1f3ff-200d-2640':0, '1f482-1f3fb-200d-2642':0, '1f482-1f3fc-200d-2642':0, '1f482-1f3fd-200d-2642':0, '1f482-1f3fe-200d-2642':0, '1f482-1f3ff-200d-2642':0, '1f482-1f3fb':0, '1f482-1f3fc':0, '1f482-1f3fd':0, '1f482-1f3fe':0, '1f482-1f3ff':0, '1f483-1f3fb':0, '1f483-1f3fc':0, '1f483-1f3fd':0, '1f483-1f3fe':0, '1f483-1f3ff':0, '1f485-1f3fb':0, '1f485-1f3fc':0, '1f485-1f3fd':0, '1f485-1f3fe':0, '1f485-1f3ff':0, '1f486-1f3fb-200d-2640':0, '1f486-1f3fc-200d-2640':0, '1f486-1f3fd-200d-2640':0, '1f486-1f3fe-200d-2640':0, '1f486-1f3ff-200d-2640':0, '1f486-1f3fb-200d-2642':0, '1f486-1f3fc-200d-2642':0, '1f486-1f3fd-200d-2642':0, '1f486-1f3fe-200d-2642':0, '1f486-1f3ff-200d-2642':0, '1f486-1f3fb':0, '1f486-1f3fc':0, '1f486-1f3fd':0, '1f486-1f3fe':0, '1f486-1f3ff':0, '1f487-1f3fb-200d-2640':0, '1f487-1f3fc-200d-2640':0, '1f487-1f3fd-200d-2640':0, '1f487-1f3fe-200d-2640':0, '1f487-1f3ff-200d-2640':0, '1f487-1f3fb-200d-2642':0, '1f487-1f3fc-200d-2642':0, '1f487-1f3fd-200d-2642':0, '1f487-1f3fe-200d-2642':0, '1f487-1f3ff-200d-2642':0, '1f487-1f3fb':0, '1f487-1f3fc':0, '1f487-1f3fd':0, '1f487-1f3fe':0, '1f487-1f3ff':0, '1f48f-1f3fb':0, '1f48f-1f3fc':0, '1f48f-1f3fd':0, '1f48f-1f3fe':0, '1f48f-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f491-1f3fb':0, '1f491-1f3fc':0, '1f491-1f3fd':0, '1f491-1f3fe':0, '1f491-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe':0, '1f4aa-1f3fb':0, '1f4aa-1f3fc':0, '1f4aa-1f3fd':0, '1f4aa-1f3fe':0, '1f4aa-1f3ff':0, '1f574-1f3fb':0, '1f574-1f3fc':0, '1f574-1f3fd':0, '1f574-1f3fe':0, '1f574-1f3ff':0, '1f575-1f3fb-200d-2640':0, '1f575-1f3fc-200d-2640':0, '1f575-1f3fd-200d-2640':0, '1f575-1f3fe-200d-2640':0, '1f575-1f3ff-200d-2640':0, '1f575-1f3fb-200d-2642':0, '1f575-1f3fc-200d-2642':0, '1f575-1f3fd-200d-2642':0, '1f575-1f3fe-200d-2642':0, '1f575-1f3ff-200d-2642':0, '1f575-1f3fb':0, '1f575-1f3fc':0, '1f575-1f3fd':0, '1f575-1f3fe':0, '1f575-1f3ff':0, '1f57a-1f3fb':0, '1f57a-1f3fc':0, '1f57a-1f3fd':0, '1f57a-1f3fe':0, '1f57a-1f3ff':0, '1f590-1f3fb':0, '1f590-1f3fc':0, '1f590-1f3fd':0, '1f590-1f3fe':0, '1f590-1f3ff':0, '1f595-1f3fb':0, '1f595-1f3fc':0, '1f595-1f3fd':0, '1f595-1f3fe':0, '1f595-1f3ff':0, '1f596-1f3fb':0, '1f596-1f3fc':0, '1f596-1f3fd':0, '1f596-1f3fe':0, '1f596-1f3ff':0, '1f645-1f3fb-200d-2640':0, '1f645-1f3fc-200d-2640':0, '1f645-1f3fd-200d-2640':0, '1f645-1f3fe-200d-2640':0, '1f645-1f3ff-200d-2640':0, '1f645-1f3fb-200d-2642':0, '1f645-1f3fc-200d-2642':0, '1f645-1f3fd-200d-2642':0, '1f645-1f3fe-200d-2642':0, '1f645-1f3ff-200d-2642':0, '1f645-1f3fb':0, '1f645-1f3fc':0, '1f645-1f3fd':0, '1f645-1f3fe':0, '1f645-1f3ff':0, '1f646-1f3fb-200d-2640':0, '1f646-1f3fc-200d-2640':0, '1f646-1f3fd-200d-2640':0, '1f646-1f3fe-200d-2640':0, '1f646-1f3ff-200d-2640':0, '1f646-1f3fb-200d-2642':0, '1f646-1f3fc-200d-2642':0, '1f646-1f3fd-200d-2642':0, '1f646-1f3fe-200d-2642':0, '1f646-1f3ff-200d-2642':0, '1f646-1f3fb':0, '1f646-1f3fc':0, '1f646-1f3fd':0, '1f646-1f3fe':0, '1f646-1f3ff':0, '1f647-1f3fb-200d-2640':0, '1f647-1f3fc-200d-2640':0, '1f647-1f3fd-200d-2640':0, '1f647-1f3fe-200d-2640':0, '1f647-1f3ff-200d-2640':0, '1f647-1f3fb-200d-2642':0, '1f647-1f3fc-200d-2642':0, '1f647-1f3fd-200d-2642':0, '1f647-1f3fe-200d-2642':0, '1f647-1f3ff-200d-2642':0, '1f647-1f3fb':0, '1f647-1f3fc':0, '1f647-1f3fd':0, '1f647-1f3fe':0, '1f647-1f3ff':0, '1f64b-1f3fb-200d-2640':0, '1f64b-1f3fc-200d-2640':0, '1f64b-1f3fd-200d-2640':0, '1f64b-1f3fe-200d-2640':0, '1f64b-1f3ff-200d-2640':0, '1f64b-1f3fb-200d-2642':0, '1f64b-1f3fc-200d-2642':0, '1f64b-1f3fd-200d-2642':0, '1f64b-1f3fe-200d-2642':0, '1f64b-1f3ff-200d-2642':0, '1f64b-1f3fb':0, '1f64b-1f3fc':0, '1f64b-1f3fd':0, '1f64b-1f3fe':0, '1f64b-1f3ff':0, '1f64c-1f3fb':0, '1f64c-1f3fc':0, '1f64c-1f3fd':0, '1f64c-1f3fe':0, '1f64c-1f3ff':0, '1f64d-1f3fb-200d-2640':0, '1f64d-1f3fc-200d-2640':0, '1f64d-1f3fd-200d-2640':0, '1f64d-1f3fe-200d-2640':0, '1f64d-1f3ff-200d-2640':0, '1f64d-1f3fb-200d-2642':0, '1f64d-1f3fc-200d-2642':0, '1f64d-1f3fd-200d-2642':0, '1f64d-1f3fe-200d-2642':0, '1f64d-1f3ff-200d-2642':0, '1f64d-1f3fb':0, '1f64d-1f3fc':0, '1f64d-1f3fd':0, '1f64d-1f3fe':0, '1f64d-1f3ff':0, '1f64e-1f3fb-200d-2640':0, '1f64e-1f3fc-200d-2640':0, '1f64e-1f3fd-200d-2640':0, '1f64e-1f3fe-200d-2640':0, '1f64e-1f3ff-200d-2640':0, '1f64e-1f3fb-200d-2642':0, '1f64e-1f3fc-200d-2642':0, '1f64e-1f3fd-200d-2642':0, '1f64e-1f3fe-200d-2642':0, '1f64e-1f3ff-200d-2642':0, '1f64e-1f3fb':0, '1f64e-1f3fc':0, '1f64e-1f3fd':0, '1f64e-1f3fe':0, '1f64e-1f3ff':0, '1f64f-1f3fb':0, '1f64f-1f3fc':0, '1f64f-1f3fd':0, '1f64f-1f3fe':0, '1f64f-1f3ff':0, '1f6a3-1f3fb-200d-2640':0, '1f6a3-1f3fc-200d-2640':0, '1f6a3-1f3fd-200d-2640':0, '1f6a3-1f3fe-200d-2640':0, '1f6a3-1f3ff-200d-2640':0, '1f6a3-1f3fb-200d-2642':0, '1f6a3-1f3fc-200d-2642':0, '1f6a3-1f3fd-200d-2642':0, '1f6a3-1f3fe-200d-2642':0, '1f6a3-1f3ff-200d-2642':0, '1f6a3-1f3fb':0, '1f6a3-1f3fc':0, '1f6a3-1f3fd':0, '1f6a3-1f3fe':0, '1f6a3-1f3ff':0, '1f6b4-1f3fb-200d-2640':0, '1f6b4-1f3fc-200d-2640':0, '1f6b4-1f3fd-200d-2640':0, '1f6b4-1f3fe-200d-2640':0, '1f6b4-1f3ff-200d-2640':0, '1f6b4-1f3fb-200d-2642':0, '1f6b4-1f3fc-200d-2642':0, '1f6b4-1f3fd-200d-2642':0, '1f6b4-1f3fe-200d-2642':0, '1f6b4-1f3ff-200d-2642':0, '1f6b4-1f3fb':0, '1f6b4-1f3fc':0, '1f6b4-1f3fd':0, '1f6b4-1f3fe':0, '1f6b4-1f3ff':0, '1f6b5-1f3fb-200d-2640':0, '1f6b5-1f3fc-200d-2640':0, '1f6b5-1f3fd-200d-2640':0, '1f6b5-1f3fe-200d-2640':0, '1f6b5-1f3ff-200d-2640':0, '1f6b5-1f3fb-200d-2642':0, '1f6b5-1f3fc-200d-2642':0, '1f6b5-1f3fd-200d-2642':0, '1f6b5-1f3fe-200d-2642':0, '1f6b5-1f3ff-200d-2642':0, '1f6b5-1f3fb':0, '1f6b5-1f3fc':0, '1f6b5-1f3fd':0, '1f6b5-1f3fe':0, '1f6b5-1f3ff':0, '1f6b6-1f3fb-200d-2640':0, '1f6b6-1f3fc-200d-2640':0, '1f6b6-1f3fd-200d-2640':0, '1f6b6-1f3fe-200d-2640':0, '1f6b6-1f3ff-200d-2640':0, '1f6b6-1f3fb-200d-2642':0, '1f6b6-1f3fc-200d-2642':0, '1f6b6-1f3fd-200d-2642':0, '1f6b6-1f3fe-200d-2642':0, '1f6b6-1f3ff-200d-2642':0, '1f6b6-1f3fb':0, '1f6b6-1f3fc':0, '1f6b6-1f3fd':0, '1f6b6-1f3fe':0, '1f6b6-1f3ff':0, '1f6c0-1f3fb':0, '1f6c0-1f3fc':0, '1f6c0-1f3fd':0, '1f6c0-1f3fe':0, '1f6c0-1f3ff':0, '1f6cc-1f3fb':0, '1f6cc-1f3fc':0, '1f6cc-1f3fd':0, '1f6cc-1f3fe':0, '1f6cc-1f3ff':0, '1f90c-1f3fb':0, '1f90c-1f3fc':0, '1f90c-1f3fd':0, '1f90c-1f3fe':0, '1f90c-1f3ff':0, '1f90f-1f3fb':0, '1f90f-1f3fc':0, '1f90f-1f3fd':0, '1f90f-1f3fe':0, '1f90f-1f3ff':0, '1f918-1f3fb':0, '1f918-1f3fc':0, '1f918-1f3fd':0, '1f918-1f3fe':0, '1f918-1f3ff':0, '1f919-1f3fb':0, '1f919-1f3fc':0, '1f919-1f3fd':0, '1f919-1f3fe':0, '1f919-1f3ff':0, '1f91a-1f3fb':0, '1f91a-1f3fc':0, '1f91a-1f3fd':0, '1f91a-1f3fe':0, '1f91a-1f3ff':0, '1f91b-1f3fb':0, '1f91b-1f3fc':0, '1f91b-1f3fd':0, '1f91b-1f3fe':0, '1f91b-1f3ff':0, '1f91c-1f3fb':0, '1f91c-1f3fc':0, '1f91c-1f3fd':0, '1f91c-1f3fe':0, '1f91c-1f3ff':0, '1f91d-1f3fb':0, '1f91d-1f3fc':0, '1f91d-1f3fd':0, '1f91d-1f3fe':0, '1f91d-1f3ff':0, '1f91e-1f3fb':0, '1f91e-1f3fc':0, '1f91e-1f3fd':0, '1f91e-1f3fe':0, '1f91e-1f3ff':0, '1f91f-1f3fb':0, '1f91f-1f3fc':0, '1f91f-1f3fd':0, '1f91f-1f3fe':0, '1f91f-1f3ff':0, '1f926-1f3fb-200d-2640':0, '1f926-1f3fc-200d-2640':0, '1f926-1f3fd-200d-2640':0, '1f926-1f3fe-200d-2640':0, '1f926-1f3ff-200d-2640':0, '1f926-1f3fb-200d-2642':0, '1f926-1f3fc-200d-2642':0, '1f926-1f3fd-200d-2642':0, '1f926-1f3fe-200d-2642':0, '1f926-1f3ff-200d-2642':0, '1f926-1f3fb':0, '1f926-1f3fc':0, '1f926-1f3fd':0, '1f926-1f3fe':0, '1f926-1f3ff':0, '1f930-1f3fb':0, '1f930-1f3fc':0, '1f930-1f3fd':0, '1f930-1f3fe':0, '1f930-1f3ff':0, '1f931-1f3fb':0, '1f931-1f3fc':0, '1f931-1f3fd':0, '1f931-1f3fe':0, '1f931-1f3ff':0, '1f932-1f3fb':0, '1f932-1f3fc':0, '1f932-1f3fd':0, '1f932-1f3fe':0, '1f932-1f3ff':0, '1f933-1f3fb':0, '1f933-1f3fc':0, '1f933-1f3fd':0, '1f933-1f3fe':0, '1f933-1f3ff':0, '1f934-1f3fb':0, '1f934-1f3fc':0, '1f934-1f3fd':0, '1f934-1f3fe':0, '1f934-1f3ff':0, '1f935-1f3fb-200d-2640':0, '1f935-1f3fc-200d-2640':0, '1f935-1f3fd-200d-2640':0, '1f935-1f3fe-200d-2640':0, '1f935-1f3ff-200d-2640':0, '1f935-1f3fb-200d-2642':0, '1f935-1f3fc-200d-2642':0, '1f935-1f3fd-200d-2642':0, '1f935-1f3fe-200d-2642':0, '1f935-1f3ff-200d-2642':0, '1f935-1f3fb':0, '1f935-1f3fc':0, '1f935-1f3fd':0, '1f935-1f3fe':0, '1f935-1f3ff':0, '1f936-1f3fb':0, '1f936-1f3fc':0, '1f936-1f3fd':0, '1f936-1f3fe':0, '1f936-1f3ff':0, '1f937-1f3fb-200d-2640':0, '1f937-1f3fc-200d-2640':0, '1f937-1f3fd-200d-2640':0, '1f937-1f3fe-200d-2640':0, '1f937-1f3ff-200d-2640':0, '1f937-1f3fb-200d-2642':0, '1f937-1f3fc-200d-2642':0, '1f937-1f3fd-200d-2642':0, '1f937-1f3fe-200d-2642':0, '1f937-1f3ff-200d-2642':0, '1f937-1f3fb':0, '1f937-1f3fc':0, '1f937-1f3fd':0, '1f937-1f3fe':0, '1f937-1f3ff':0, '1f938-1f3fb-200d-2640':0, '1f938-1f3fc-200d-2640':0, '1f938-1f3fd-200d-2640':0, '1f938-1f3fe-200d-2640':0, '1f938-1f3ff-200d-2640':0, '1f938-1f3fb-200d-2642':0, '1f938-1f3fc-200d-2642':0, '1f938-1f3fd-200d-2642':0, '1f938-1f3fe-200d-2642':0, '1f938-1f3ff-200d-2642':0, '1f938-1f3fb':0, '1f938-1f3fc':0, '1f938-1f3fd':0, '1f938-1f3fe':0, '1f938-1f3ff':0, '1f939-1f3fb-200d-2640':0, '1f939-1f3fc-200d-2640':0, '1f939-1f3fd-200d-2640':0, '1f939-1f3fe-200d-2640':0, '1f939-1f3ff-200d-2640':0, '1f939-1f3fb-200d-2642':0, '1f939-1f3fc-200d-2642':0, '1f939-1f3fd-200d-2642':0, '1f939-1f3fe-200d-2642':0, '1f939-1f3ff-200d-2642':0, '1f939-1f3fb':0, '1f939-1f3fc':0, '1f939-1f3fd':0, '1f939-1f3fe':0, '1f939-1f3ff':0, '1f93d-1f3fb-200d-2640':0, '1f93d-1f3fc-200d-2640':0, '1f93d-1f3fd-200d-2640':0, '1f93d-1f3fe-200d-2640':0, '1f93d-1f3ff-200d-2640':0, '1f93d-1f3fb-200d-2642':0, '1f93d-1f3fc-200d-2642':0, '1f93d-1f3fd-200d-2642':0, '1f93d-1f3fe-200d-2642':0, '1f93d-1f3ff-200d-2642':0, '1f93d-1f3fb':0, '1f93d-1f3fc':0, '1f93d-1f3fd':0, '1f93d-1f3fe':0, '1f93d-1f3ff':0, '1f93e-1f3fb-200d-2640':0, '1f93e-1f3fc-200d-2640':0, '1f93e-1f3fd-200d-2640':0, '1f93e-1f3fe-200d-2640':0, '1f93e-1f3ff-200d-2640':0, '1f93e-1f3fb-200d-2642':0, '1f93e-1f3fc-200d-2642':0, '1f93e-1f3fd-200d-2642':0, '1f93e-1f3fe-200d-2642':0, '1f93e-1f3ff-200d-2642':0, '1f93e-1f3fb':0, '1f93e-1f3fc':0, '1f93e-1f3fd':0, '1f93e-1f3fe':0, '1f93e-1f3ff':0, '1f977-1f3fb':0, '1f977-1f3fc':0, '1f977-1f3fd':0, '1f977-1f3fe':0, '1f977-1f3ff':0, '1f9b5-1f3fb':0, '1f9b5-1f3fc':0, '1f9b5-1f3fd':0, '1f9b5-1f3fe':0, '1f9b5-1f3ff':0, '1f9b6-1f3fb':0, '1f9b6-1f3fc':0, '1f9b6-1f3fd':0, '1f9b6-1f3fe':0, '1f9b6-1f3ff':0, '1f9b8-1f3fb-200d-2640':0, '1f9b8-1f3fc-200d-2640':0, '1f9b8-1f3fd-200d-2640':0, '1f9b8-1f3fe-200d-2640':0, '1f9b8-1f3ff-200d-2640':0, '1f9b8-1f3fb-200d-2642':0, '1f9b8-1f3fc-200d-2642':0, '1f9b8-1f3fd-200d-2642':0, '1f9b8-1f3fe-200d-2642':0, '1f9b8-1f3ff-200d-2642':0, '1f9b8-1f3fb':0, '1f9b8-1f3fc':0, '1f9b8-1f3fd':0, '1f9b8-1f3fe':0, '1f9b8-1f3ff':0, '1f9b9-1f3fb-200d-2640':0, '1f9b9-1f3fc-200d-2640':0, '1f9b9-1f3fd-200d-2640':0, '1f9b9-1f3fe-200d-2640':0, '1f9b9-1f3ff-200d-2640':0, '1f9b9-1f3fb-200d-2642':0, '1f9b9-1f3fc-200d-2642':0, '1f9b9-1f3fd-200d-2642':0, '1f9b9-1f3fe-200d-2642':0, '1f9b9-1f3ff-200d-2642':0, '1f9b9-1f3fb':0, '1f9b9-1f3fc':0, '1f9b9-1f3fd':0, '1f9b9-1f3fe':0, '1f9b9-1f3ff':0, '1f9bb-1f3fb':0, '1f9bb-1f3fc':0, '1f9bb-1f3fd':0, '1f9bb-1f3fe':0, '1f9bb-1f3ff':0, '1f9cd-1f3fb-200d-2640':0, '1f9cd-1f3fc-200d-2640':0, '1f9cd-1f3fd-200d-2640':0, '1f9cd-1f3fe-200d-2640':0, '1f9cd-1f3ff-200d-2640':0, '1f9cd-1f3fb-200d-2642':0, '1f9cd-1f3fc-200d-2642':0, '1f9cd-1f3fd-200d-2642':0, '1f9cd-1f3fe-200d-2642':0, '1f9cd-1f3ff-200d-2642':0, '1f9cd-1f3fb':0, '1f9cd-1f3fc':0, '1f9cd-1f3fd':0, '1f9cd-1f3fe':0, '1f9cd-1f3ff':0, '1f9ce-1f3fb-200d-2640':0, '1f9ce-1f3fc-200d-2640':0, '1f9ce-1f3fd-200d-2640':0, '1f9ce-1f3fe-200d-2640':0, '1f9ce-1f3ff-200d-2640':0, '1f9ce-1f3fb-200d-2642':0, '1f9ce-1f3fc-200d-2642':0, '1f9ce-1f3fd-200d-2642':0, '1f9ce-1f3fe-200d-2642':0, '1f9ce-1f3ff-200d-2642':0, '1f9ce-1f3fb':0, '1f9ce-1f3fc':0, '1f9ce-1f3fd':0, '1f9ce-1f3fe':0, '1f9ce-1f3ff':0, '1f9cf-1f3fb-200d-2640':0, '1f9cf-1f3fc-200d-2640':0, '1f9cf-1f3fd-200d-2640':0, '1f9cf-1f3fe-200d-2640':0, '1f9cf-1f3ff-200d-2640':0, '1f9cf-1f3fb-200d-2642':0, '1f9cf-1f3fc-200d-2642':0, '1f9cf-1f3fd-200d-2642':0, '1f9cf-1f3fe-200d-2642':0, '1f9cf-1f3ff-200d-2642':0, '1f9cf-1f3fb':0, '1f9cf-1f3fc':0, '1f9cf-1f3fd':0, '1f9cf-1f3fe':0, '1f9cf-1f3ff':0, '1f9d1-1f3fb-200d-1f33e':0, '1f9d1-1f3fc-200d-1f33e':0, '1f9d1-1f3fd-200d-1f33e':0, '1f9d1-1f3fe-200d-1f33e':0, '1f9d1-1f3ff-200d-1f33e':0, '1f9d1-1f3fb-200d-1f373':0, '1f9d1-1f3fc-200d-1f373':0, '1f9d1-1f3fd-200d-1f373':0, '1f9d1-1f3fe-200d-1f373':0, '1f9d1-1f3ff-200d-1f373':0, '1f9d1-1f3fb-200d-1f37c':0, '1f9d1-1f3fc-200d-1f37c':0, '1f9d1-1f3fd-200d-1f37c':0, '1f9d1-1f3fe-200d-1f37c':0, '1f9d1-1f3ff-200d-1f37c':0, '1f9d1-1f3fb-200d-1f384':0, '1f9d1-1f3fc-200d-1f384':0, '1f9d1-1f3fd-200d-1f384':0, '1f9d1-1f3fe-200d-1f384':0, '1f9d1-1f3ff-200d-1f384':0, '1f9d1-1f3fb-200d-1f393':0, '1f9d1-1f3fc-200d-1f393':0, '1f9d1-1f3fd-200d-1f393':0, '1f9d1-1f3fe-200d-1f393':0, '1f9d1-1f3ff-200d-1f393':0, '1f9d1-1f3fb-200d-1f3a4':0, '1f9d1-1f3fc-200d-1f3a4':0, '1f9d1-1f3fd-200d-1f3a4':0, '1f9d1-1f3fe-200d-1f3a4':0, '1f9d1-1f3ff-200d-1f3a4':0, '1f9d1-1f3fb-200d-1f3a8':0, '1f9d1-1f3fc-200d-1f3a8':0, '1f9d1-1f3fd-200d-1f3a8':0, '1f9d1-1f3fe-200d-1f3a8':0, '1f9d1-1f3ff-200d-1f3a8':0, '1f9d1-1f3fb-200d-1f3eb':0, '1f9d1-1f3fc-200d-1f3eb':0, '1f9d1-1f3fd-200d-1f3eb':0, '1f9d1-1f3fe-200d-1f3eb':0, '1f9d1-1f3ff-200d-1f3eb':0, '1f9d1-1f3fb-200d-1f3ed':0, '1f9d1-1f3fc-200d-1f3ed':0, '1f9d1-1f3fd-200d-1f3ed':0, '1f9d1-1f3fe-200d-1f3ed':0, '1f9d1-1f3ff-200d-1f3ed':0, '1f9d1-1f3fb-200d-1f4bb':0, '1f9d1-1f3fc-200d-1f4bb':0, '1f9d1-1f3fd-200d-1f4bb':0, '1f9d1-1f3fe-200d-1f4bb':0, '1f9d1-1f3ff-200d-1f4bb':0, '1f9d1-1f3fb-200d-1f4bc':0, '1f9d1-1f3fc-200d-1f4bc':0, '1f9d1-1f3fd-200d-1f4bc':0, '1f9d1-1f3fe-200d-1f4bc':0, '1f9d1-1f3ff-200d-1f4bc':0, '1f9d1-1f3fb-200d-1f527':0, '1f9d1-1f3fc-200d-1f527':0, '1f9d1-1f3fd-200d-1f527':0, '1f9d1-1f3fe-200d-1f527':0, '1f9d1-1f3ff-200d-1f527':0, '1f9d1-1f3fb-200d-1f52c':0, '1f9d1-1f3fc-200d-1f52c':0, '1f9d1-1f3fd-200d-1f52c':0, '1f9d1-1f3fe-200d-1f52c':0, '1f9d1-1f3ff-200d-1f52c':0, '1f9d1-1f3fb-200d-1f680':0, '1f9d1-1f3fc-200d-1f680':0, '1f9d1-1f3fd-200d-1f680':0, '1f9d1-1f3fe-200d-1f680':0, '1f9d1-1f3ff-200d-1f680':0, '1f9d1-1f3fb-200d-1f692':0, '1f9d1-1f3fc-200d-1f692':0, '1f9d1-1f3fd-200d-1f692':0, '1f9d1-1f3fe-200d-1f692':0, '1f9d1-1f3ff-200d-1f692':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fb-200d-1f9af':0, '1f9d1-1f3fc-200d-1f9af':0, '1f9d1-1f3fd-200d-1f9af':0, '1f9d1-1f3fe-200d-1f9af':0, '1f9d1-1f3ff-200d-1f9af':0, '1f9d1-1f3fb-200d-1f9b0':0, '1f9d1-1f3fc-200d-1f9b0':0, '1f9d1-1f3fd-200d-1f9b0':0, '1f9d1-1f3fe-200d-1f9b0':0, '1f9d1-1f3ff-200d-1f9b0':0, '1f9d1-1f3fb-200d-1f9b1':0, '1f9d1-1f3fc-200d-1f9b1':0, '1f9d1-1f3fd-200d-1f9b1':0, '1f9d1-1f3fe-200d-1f9b1':0, '1f9d1-1f3ff-200d-1f9b1':0, '1f9d1-1f3fb-200d-1f9b2':0, '1f9d1-1f3fc-200d-1f9b2':0, '1f9d1-1f3fd-200d-1f9b2':0, '1f9d1-1f3fe-200d-1f9b2':0, '1f9d1-1f3ff-200d-1f9b2':0, '1f9d1-1f3fb-200d-1f9b3':0, '1f9d1-1f3fc-200d-1f9b3':0, '1f9d1-1f3fd-200d-1f9b3':0, '1f9d1-1f3fe-200d-1f9b3':0, '1f9d1-1f3ff-200d-1f9b3':0, '1f9d1-1f3fb-200d-1f9bc':0, '1f9d1-1f3fc-200d-1f9bc':0, '1f9d1-1f3fd-200d-1f9bc':0, '1f9d1-1f3fe-200d-1f9bc':0, '1f9d1-1f3ff-200d-1f9bc':0, '1f9d1-1f3fb-200d-1f9bd':0, '1f9d1-1f3fc-200d-1f9bd':0, '1f9d1-1f3fd-200d-1f9bd':0, '1f9d1-1f3fe-200d-1f9bd':0, '1f9d1-1f3ff-200d-1f9bd':0, '1f9d1-1f3fb-200d-2695':0, '1f9d1-1f3fc-200d-2695':0, '1f9d1-1f3fd-200d-2695':0, '1f9d1-1f3fe-200d-2695':0, '1f9d1-1f3ff-200d-2695':0, '1f9d1-1f3fb-200d-2696':0, '1f9d1-1f3fc-200d-2696':0, '1f9d1-1f3fd-200d-2696':0, '1f9d1-1f3fe-200d-2696':0, '1f9d1-1f3ff-200d-2696':0, '1f9d1-1f3fb-200d-2708':0, '1f9d1-1f3fc-200d-2708':0, '1f9d1-1f3fd-200d-2708':0, '1f9d1-1f3fe-200d-2708':0, '1f9d1-1f3ff-200d-2708':0, '1f9d1-1f3fb':0, '1f9d1-1f3fc':0, '1f9d1-1f3fd':0, '1f9d1-1f3fe':0, '1f9d1-1f3ff':0, '1f9d2-1f3fb':0, '1f9d2-1f3fc':0, '1f9d2-1f3fd':0, '1f9d2-1f3fe':0, '1f9d2-1f3ff':0, '1f9d3-1f3fb':0, '1f9d3-1f3fc':0, '1f9d3-1f3fd':0, '1f9d3-1f3fe':0, '1f9d3-1f3ff':0, '1f9d4-1f3fb-200d-2640':0, '1f9d4-1f3fc-200d-2640':0, '1f9d4-1f3fd-200d-2640':0, '1f9d4-1f3fe-200d-2640':0, '1f9d4-1f3ff-200d-2640':0, '1f9d4-1f3fb-200d-2642':0, '1f9d4-1f3fc-200d-2642':0, '1f9d4-1f3fd-200d-2642':0, '1f9d4-1f3fe-200d-2642':0, '1f9d4-1f3ff-200d-2642':0, '1f9d4-1f3fb':0, '1f9d4-1f3fc':0, '1f9d4-1f3fd':0, '1f9d4-1f3fe':0, '1f9d4-1f3ff':0, '1f9d5-1f3fb':0, '1f9d5-1f3fc':0, '1f9d5-1f3fd':0, '1f9d5-1f3fe':0, '1f9d5-1f3ff':0, '1f9d6-1f3fb-200d-2640':0, '1f9d6-1f3fc-200d-2640':0, '1f9d6-1f3fd-200d-2640':0, '1f9d6-1f3fe-200d-2640':0, '1f9d6-1f3ff-200d-2640':0, '1f9d6-1f3fb-200d-2642':0, '1f9d6-1f3fc-200d-2642':0, '1f9d6-1f3fd-200d-2642':0, '1f9d6-1f3fe-200d-2642':0, '1f9d6-1f3ff-200d-2642':0, '1f9d6-1f3fb':0, '1f9d6-1f3fc':0, '1f9d6-1f3fd':0, '1f9d6-1f3fe':0, '1f9d6-1f3ff':0, '1f9d7-1f3fb-200d-2640':0, '1f9d7-1f3fc-200d-2640':0, '1f9d7-1f3fd-200d-2640':0, '1f9d7-1f3fe-200d-2640':0, '1f9d7-1f3ff-200d-2640':0, '1f9d7-1f3fb-200d-2642':0, '1f9d7-1f3fc-200d-2642':0, '1f9d7-1f3fd-200d-2642':0, '1f9d7-1f3fe-200d-2642':0, '1f9d7-1f3ff-200d-2642':0, '1f9d7-1f3fb':0, '1f9d7-1f3fc':0, '1f9d7-1f3fd':0, '1f9d7-1f3fe':0, '1f9d7-1f3ff':0, '1f9d8-1f3fb-200d-2640':0, '1f9d8-1f3fc-200d-2640':0, '1f9d8-1f3fd-200d-2640':0, '1f9d8-1f3fe-200d-2640':0, '1f9d8-1f3ff-200d-2640':0, '1f9d8-1f3fb-200d-2642':0, '1f9d8-1f3fc-200d-2642':0, '1f9d8-1f3fd-200d-2642':0, '1f9d8-1f3fe-200d-2642':0, '1f9d8-1f3ff-200d-2642':0, '1f9d8-1f3fb':0, '1f9d8-1f3fc':0, '1f9d8-1f3fd':0, '1f9d8-1f3fe':0, '1f9d8-1f3ff':0, '1f9d9-1f3fb-200d-2640':0, '1f9d9-1f3fc-200d-2640':0, '1f9d9-1f3fd-200d-2640':0, '1f9d9-1f3fe-200d-2640':0, '1f9d9-1f3ff-200d-2640':0, '1f9d9-1f3fb-200d-2642':0, '1f9d9-1f3fc-200d-2642':0, '1f9d9-1f3fd-200d-2642':0, '1f9d9-1f3fe-200d-2642':0, '1f9d9-1f3ff-200d-2642':0, '1f9d9-1f3fb':0, '1f9d9-1f3fc':0, '1f9d9-1f3fd':0, '1f9d9-1f3fe':0, '1f9d9-1f3ff':0, '1f9da-1f3fb-200d-2640':0, '1f9da-1f3fc-200d-2640':0, '1f9da-1f3fd-200d-2640':0, '1f9da-1f3fe-200d-2640':0, '1f9da-1f3ff-200d-2640':0, '1f9da-1f3fb-200d-2642':0, '1f9da-1f3fc-200d-2642':0, '1f9da-1f3fd-200d-2642':0, '1f9da-1f3fe-200d-2642':0, '1f9da-1f3ff-200d-2642':0, '1f9da-1f3fb':0, '1f9da-1f3fc':0, '1f9da-1f3fd':0, '1f9da-1f3fe':0, '1f9da-1f3ff':0, '1f9db-1f3fb-200d-2640':0, '1f9db-1f3fc-200d-2640':0, '1f9db-1f3fd-200d-2640':0, '1f9db-1f3fe-200d-2640':0, '1f9db-1f3ff-200d-2640':0, '1f9db-1f3fb-200d-2642':0, '1f9db-1f3fc-200d-2642':0, '1f9db-1f3fd-200d-2642':0, '1f9db-1f3fe-200d-2642':0, '1f9db-1f3ff-200d-2642':0, '1f9db-1f3fb':0, '1f9db-1f3fc':0, '1f9db-1f3fd':0, '1f9db-1f3fe':0, '1f9db-1f3ff':0, '1f9dc-1f3fb-200d-2640':0, '1f9dc-1f3fc-200d-2640':0, '1f9dc-1f3fd-200d-2640':0, '1f9dc-1f3fe-200d-2640':0, '1f9dc-1f3ff-200d-2640':0, '1f9dc-1f3fb-200d-2642':0, '1f9dc-1f3fc-200d-2642':0, '1f9dc-1f3fd-200d-2642':0, '1f9dc-1f3fe-200d-2642':0, '1f9dc-1f3ff-200d-2642':0, '1f9dc-1f3fb':0, '1f9dc-1f3fc':0, '1f9dc-1f3fd':0, '1f9dc-1f3fe':0, '1f9dc-1f3ff':0, '1f9dd-1f3fb-200d-2640':0, '1f9dd-1f3fc-200d-2640':0, '1f9dd-1f3fd-200d-2640':0, '1f9dd-1f3fe-200d-2640':0, '1f9dd-1f3ff-200d-2640':0, '1f9dd-1f3fb-200d-2642':0, '1f9dd-1f3fc-200d-2642':0, '1f9dd-1f3fd-200d-2642':0, '1f9dd-1f3fe-200d-2642':0, '1f9dd-1f3ff-200d-2642':0, '1f9dd-1f3fb':0, '1f9dd-1f3fc':0, '1f9dd-1f3fd':0, '1f9dd-1f3fe':0, '1f9dd-1f3ff':0, '261d-1f3fb':0, '261d-1f3fc':0, '261d-1f3fd':0, '261d-1f3fe':0, '261d-1f3ff':0, '26f9-1f3fb-200d-2640':0, '26f9-1f3fc-200d-2640':0, '26f9-1f3fd-200d-2640':0, '26f9-1f3fe-200d-2640':0, '26f9-1f3ff-200d-2640':0, '26f9-1f3fb-200d-2642':0, '26f9-1f3fc-200d-2642':0, '26f9-1f3fd-200d-2642':0, '26f9-1f3fe-200d-2642':0, '26f9-1f3ff-200d-2642':0, '26f9-1f3fb':0, '26f9-1f3fc':0, '26f9-1f3fd':0, '26f9-1f3fe':0, '26f9-1f3ff':0, '270a-1f3fb':0, '270a-1f3fc':0, '270a-1f3fd':0, '270a-1f3fe':0, '270a-1f3ff':0, '270b-1f3fb':0, '270b-1f3fc':0, '270b-1f3fd':0, '270b-1f3fe':0, '270b-1f3ff':0, '270c-1f3fb':0, '270c-1f3fc':0, '270c-1f3fd':0, '270c-1f3fe':0, '270c-1f3ff':0, '270d-1f3fb':0, '270d-1f3fc':0, '270d-1f3fd':0, '270d-1f3fe':0, '270d-1f3ff':0}};\n\nconst Emoji: {[emoji: string]: number} = EmojiVersions[''];\nfor(const version in EmojiVersions) {\n if(version) {\n Object.assign(Emoji, EmojiVersions[version as EMOJI_VERSION]);\n }\n}\n\nexport default Emoji;\n\n/* Emoji[\"00a9-fe0f\"] = 6362;\nEmoji[\"00ae-fe0f\"] = 6363;\nEmoji[\"2122-fe0f\"] = 6364; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport LatinizeMap from '../config/latinizeMap';\n\nexport const badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nconst C2L: {[k: string]: string} = {\n 'й': 'q',\n 'ц': 'w',\n 'у': 'e',\n 'к': 'r',\n 'е': 't',\n 'н': 'y',\n 'г': 'u',\n 'ш': 'i',\n 'щ': 'o',\n 'з': 'p',\n 'х': '[',\n 'ъ': ']',\n 'ф': 'a',\n 'ы': 's',\n 'в': 'd',\n 'а': 'f',\n 'п': 'g',\n 'р': 'h',\n 'о': 'j',\n 'л': 'k',\n 'д': 'l',\n 'ж': ';',\n 'э': '\\'',\n 'я': 'z',\n 'ч': 'x',\n 'с': 'c',\n 'м': 'v',\n 'и': 'b',\n 'т': 'n',\n 'ь': 'm',\n 'б': ',',\n 'ю': '.',\n '.': '/'\n};\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function fixCyrillic(text: string) {\n return text.toLowerCase().replace(/[\\wа-я]/g, (ch) => {\n const latinizeCh = C2L[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = LatinizeMap[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n return processSearchText(text, {\n clearBadChars: true,\n latinize,\n ignoreCase: true\n });\n}\n\nexport type ProcessSearchTextOptions = Partial<{\n clearBadChars: boolean,\n latinize: boolean,\n ignoreCase: boolean,\n includeTag: boolean\n}>;\n\nexport function processSearchText(text: string, options: ProcessSearchTextOptions = {}) {\n const hasTag = options.includeTag && text.charAt(0) === '%';\n const originalText = text;\n if(options.clearBadChars) text = clearBadCharsAndTrim(text);\n if(options.latinize) text = latinizeString(text);\n if(options.ignoreCase) text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n if(options.latinize) text += '\\x01' + fixCyrillic(originalText);\n return text;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {InputFileLocation, InputStickerSet, InputWebFileLocation} from '../layer';\nimport type {DownloadOptions} from '../lib/mtproto/apiFileManager';\n\nconst FILENAME_JOINER = '_';\n\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\n fileName: string,\n downloadId: string\n}>) {\n const fileName = '';// (options?.fileName || '').split('.');\n const ext = fileName[fileName.length - 1] || '';\n\n let str: string;\n switch(location._) {\n case 'inputPhotoFileLocation': {\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputDocumentFileLocation': {\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputPeerPhotoFileLocation':\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\n break;\n\n case 'inputStickerSetThumb': {\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id ||\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name ||\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon ||\n location.stickerset._;\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputFileLocation': {\n str = location.volume_id + '_' + location.local_id;\n break;\n }\n\n case 'inputWebFileLocation': {\n str = ['webFile', location.url].join(FILENAME_JOINER);\n break;\n }\n\n default: {\n console.error('Unrecognized location:', location);\n str = '';\n break;\n }\n }\n\n return str + (options?.downloadId ? '_download' : '') + (ext ? '.' + ext : ext);\n}\n\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\n // console.log('getFileURL', location);\n // const perf = performance.now();\n const encoded = encodeURIComponent(JSON.stringify(options));\n // console.log('getFileURL encode:', performance.now() - perf, encoded);\n\n return /* '/' + */type + '/' + encoded;\n}\n","import {RestrictionReason} from '../layer';\n\nconst platforms = new Set([\n 'all',\n 'web',\n 'webk'\n]);\n\nconst ignore = new Set();\n\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\n // return reasons[0];\n return reasons.find((reason) => platforms.has(reason.platform) && !ignore.has(reason.reason));\n}\n\nexport function isRestricted(reasons: RestrictionReason[]) {\n return !!getRestrictionReason(reasons);\n}\n\nexport function ignoreRestrictionReasons(reasons: string[]) {\n ignore.clear();\n reasons.forEach((reason) => {\n ignore.add(reason);\n });\n}\n","import isObject from '../../../../helpers/object/isObject';\nimport {InputChannel, InputPeer, Peer} from '../../../../layer';\nimport {NULL_PEER_ID} from '../../../mtproto/mtproto_config';\n\nexport default function getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | InputChannel | PeerId | string): PeerId {\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\n // if(typeof(peerId) === 'number') return peerId;\n else if(isObject(peerId)) {\n const userId = (peerId as Peer.peerUser).user_id;\n if(userId !== undefined) {\n return userId.toPeerId(false);\n }\n\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\n if(chatId !== undefined) {\n return chatId.toPeerId(true);\n }\n\n return NULL_PEER_ID; // maybe it is an inputPeerSelf\n // } else if(!peerId) return 'u0';\n } else if(!peerId) return NULL_PEER_ID;\n\n const isUser = (peerId as string).charAt(0) === 'u';\n const peerParams = (peerId as string).substr(1).split('_');\n\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}\n","import type ENVIRONMENT from '.';\n\nlet environment: typeof ENVIRONMENT;\nexport function getEnvironment() {\n return environment;\n}\n\nexport function setEnvironment(env: typeof environment) {\n return environment = env;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall, Config, Reaction} from '../layer';\nimport type {Dialog, ForumTopic, MessagesStorageKey, MyMessage} from './appManagers/appMessagesManager';\nimport type {MyDialogFilter} from './storages/filters';\nimport type {Folder} from './storages/dialogs';\nimport type {UserTyping} from './appManagers/appProfileManager';\nimport type {MyDraftMessage} from './appManagers/appDraftsManager';\nimport type {ConnectionStatusChange} from './mtproto/connectionStatus';\nimport type {GroupCallId} from './appManagers/appGroupCallsManager';\nimport type {AppManagers} from './appManagers/managers';\nimport type {State} from '../config/state';\nimport type {Progress} from './appManagers/appDownloadManager';\nimport type {CallId} from './appManagers/appCallsManager';\nimport type {MyDocument} from './appManagers/appDocsManager';\nimport type {MTAppConfig} from './mtproto/appConfig';\nimport {NULL_PEER_ID, UserAuth} from './mtproto/mtproto_config';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\nimport {IS_WORKER} from '../helpers/context';\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n 'chat_toggle_forum': {chatId: ChatId, enabled: boolean},\n\n 'channel_update': ChatId,\n\n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, threadId?: number, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': {peerId: PeerId, threadId?: number},\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Omit,\n\n 'dialog_draft': {peerId: PeerId, dialog: Dialog | ForumTopic, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog | ForumTopic},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': Dialog | ForumTopic,\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n // 'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog | ForumTopic,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': Map}>,\n\n 'history_append': {storageKey: MessagesStorageKey, message: Message.message},\n 'history_update': {storageKey: MessagesStorageKey, message: MyMessage, sequential?: boolean},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': MyMessage,\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n // 'history_request': void,\n\n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_error': {storageKey: MessagesStorageKey, tempId: number, error: ApiError},\n 'messages_views': {peerId: PeerId, mid: number, views: number}[],\n 'messages_reactions': {message: Message.message, changedResults: ReactionCount[]}[],\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': Message.message,\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n 'stickers_updated': {type: 'recent' | 'faved', stickers: MyDocument[]},\n 'stickers_top': Long,\n 'sticker_updated': {type: 'recent' | 'faved', document: MyDocument, faved: boolean},\n\n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n\n 'contacts_update': UserId,\n 'avatar_update': {peerId: PeerId, threadId?: number},\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n // 'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any, settings: State['settings']},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n\n 'background_change': void,\n\n 'privacy_update': Update.updatePrivacy,\n\n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n\n 'notification_reset': string,\n 'notification_cancel': string,\n\n 'language_change': string,\n\n 'theme_change': void,\n\n 'media_play': void,\n\n 'emoji_recent': AppEmoji,\n\n 'download_progress': Progress,\n 'document_downloading': DocId,\n 'document_downloaded': DocId,\n\n 'choosing_sticker': boolean\n\n 'group_call_update': GroupCall,\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_update': PhoneCall,\n 'call_signaling': {callId: CallId, data: Uint8Array},\n\n 'quick_reaction': Reaction,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void,\n\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService}\n\n 'premium_toggle': boolean,\n 'premium_toggle_private': {isNew: boolean, isPremium: boolean},\n\n 'config': Config,\n 'app_config': MTAppConfig\n};\n\nexport type BroadcastEventsListeners = {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n};\n\nexport class RootScope extends EventListenerBase {\n public myId: PeerId;\n private connectionStatus: {[name: string]: ConnectionStatusChange};\n public settings: State['settings'];\n public managers: AppManagers;\n public premium: boolean;\n\n constructor() {\n super();\n\n this.myId = NULL_PEER_ID;\n this.connectionStatus = {};\n this.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\n });\n\n this.addEventListener('premium_toggle_private', ({isNew, isPremium}) => {\n this.premium = isPremium;\n\n if(!isNew) {\n this.dispatchEventSingle('premium_toggle', isPremium);\n }\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n\n public getPremium() {\n return this.premium;\n }\n\n public dispatchEventSingle(...args: any[]) {\n // @ts-ignore\n super.dispatchEvent(...args);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {State} from '../../config/state';\nimport rootScope from '../rootScope';\nimport stateStorage from '../stateStorage';\nimport setDeepProperty from '../../helpers/object/setDeepProperty';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\n\nexport class AppStateManager {\n private state: State = {} as any;\n private storage = stateStorage;\n\n // ! for mtproto worker use only\n public newVersion: string;\n public oldVersion: string;\n public userId: UserId;\n\n public getState() {\n return Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n\n const first = key.split('.')[0] as keyof State;\n if(first === 'settings') {\n rootScope.dispatchEvent('settings_updated', {key, value, settings: this.state.settings});\n }\n\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState(key: T, value: State[T], direct = true, onlyLocal?: boolean) {\n if(direct) {\n this.state[key] = value;\n }\n\n this.setKeyValueToStorage(key, value, onlyLocal);\n }\n\n public setKeyValueToStorage(key: T, value: State[T] = this.state[key], onlyLocal?: boolean) {\n MTProtoMessagePort.getInstance().invokeVoid('mirror', {name: 'state', key, value});\n\n this.storage.set({\n [key]: value\n }, onlyLocal);\n }\n\n /* public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n } */\n}\n\nconst appStateManager = new AppStateManager();\nexport default appStateManager;\n","import getDeepProperty from './getDeepProperty';\n\nexport default function setDeepProperty(object: any, key: string, value: any) {\n const splitted = key.split('.');\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pause from '../../../helpers/schedulers/pause';\nimport {DcId} from '../../../types';\nimport {logger, LogTypes} from '../../logger';\nimport type MTPNetworker from '../networker';\nimport MTTransport from './transport';\nimport Modes from '../../../config/modes';\n\n \nimport transportController from './controller';\n// import networkStats from '../networkStats';\n \n\nexport default class HTTP implements MTTransport {\n public networker: MTPNetworker;\n private log: ReturnType;\n\n private pending: Array<{\n resolve: (body: Uint8Array) => void,\n reject: any,\n body: Uint8Array\n }> = [];\n private releasing: boolean;\n\n public connected: boolean;\n private destroyed: boolean;\n private debug: boolean;\n\n constructor(protected dcId: DcId, protected url: string, logSuffix: string) {\n this.debug = Modes.debug && false;\n\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n\n this.log = logger(`HTTP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n\n this.connected = false;\n }\n\n public _send(body: Uint8Array, mode?: RequestMode) {\n const length = body.length;\n this.debug && this.log.debug('-> body length to send:', length);\n\n // networkStats.addSent(this.dcId, length);\n return fetch(this.url, {method: 'POST', body, mode}).then((response) => {\n if(response.status !== 200 && !mode) {\n response.arrayBuffer().then((buffer) => {\n this.log.error('not 200',\n new TextDecoder('utf-8').decode(new Uint8Array(buffer)));\n });\n\n throw response;\n }\n\n this.setConnected(true);\n\n // * test resending by dropping random request\n // if(Math.random() > .5) {\n // throw 'asd';\n // }\n\n return response.arrayBuffer().then((buffer) => {\n // networkStats.addReceived(this.dcId, buffer.byteLength);\n return new Uint8Array(buffer);\n });\n }, (err) => {\n this.setConnected(false);\n throw err;\n });\n }\n\n private setConnected(connected: boolean) {\n if(this.connected === connected || this.destroyed) {\n return;\n }\n\n this.connected = connected;\n\n \n transportController.setTransportValue('https', connected);\n \n }\n\n public destroy() {\n this.setConnected(false);\n this.destroyed = true;\n this.pending.forEach((pending) => pending.reject());\n this.pending.length = 0;\n }\n\n public send(body: Uint8Array) {\n if(this.networker) {\n return this._send(body);\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private async releasePending() {\n if(this.releasing) return;\n\n this.releasing = true;\n // this.log('-> messages to send:', this.pending.length);\n for(let i = 0; i < this.pending.length; ++i) {\n const pending = this.pending[i];\n const {body, resolve} = pending;\n\n try {\n const result = await this._send(body);\n resolve(result);\n this.pending.splice(i, 1);\n } catch(err) {\n this.log.error('Send plain request error:', err);\n await pause(5000);\n }\n\n --i;\n }\n\n this.releasing = false;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {logger, LogTypes} from '../../logger';\nimport Modes from '../../../config/modes';\nimport EventListenerBase from '../../../helpers/eventListenerBase';\nimport {MTConnection} from './transport';\n\n// let closeSocketBefore = Date.now() + 30e3;\n// let closeSocketAfter = Date.now() + 10e3;\n\nexport default class Socket extends EventListenerBase<{\n open: () => void,\n message: (buffer: ArrayBuffer) => any,\n close: () => void,\n}> implements MTConnection {\n private ws: WebSocket;\n private log: ReturnType;\n private debug = Modes.debug && false;\n\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\n super();\n\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n this.connect();\n\n return this;\n }\n\n private removeListeners() {\n if(!this.ws) {\n return;\n }\n\n this.ws.removeEventListener('open', this.handleOpen);\n this.ws.removeEventListener('close', this.handleClose);\n this.ws.removeEventListener('error', this.handleError);\n this.ws.removeEventListener('message', this.handleMessage);\n this.ws = undefined;\n }\n\n private connect() {\n this.ws = new WebSocket(this.url, 'binary');\n this.ws.binaryType = 'arraybuffer';\n this.ws.addEventListener('open', this.handleOpen);\n this.ws.addEventListener('close', this.handleClose);\n this.ws.addEventListener('error', this.handleError);\n this.ws.addEventListener('message', this.handleMessage);\n\n // if(Date.now() < closeSocketBefore) {\n // if(Date.now() >= closeSocketAfter) {\n // this.ws.close();\n // }\n }\n\n public close() {\n if(!this.ws) {\n return;\n }\n\n this.log('close execution');\n\n try {\n this.ws.close();\n } catch(err) {\n\n }\n this.handleClose();\n }\n\n private handleOpen = () => {\n this.log('opened');\n\n this.debug && this.log.debug('sending init packet');\n this.dispatchEvent('open');\n };\n\n private handleError = (e: Event) => {\n this.log.error('handleError', e);\n this.close();\n };\n\n private handleClose = (e?: CloseEvent) => {\n this.log('closed', e/* , this.pending, this.ws.bufferedAmount */);\n\n this.removeListeners();\n this.dispatchEvent('close');\n };\n\n private handleMessage = (event: MessageEvent) => {\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\n\n this.dispatchEvent('message', event.data as ArrayBuffer);\n };\n\n public send = (body: Uint8Array) => {\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n this.ws.send(body);\n };\n}\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n\n return arr;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import aesjs from 'aes-js';\nimport randomize from '../../../helpers/array/randomize';\nimport cryptoMessagePort from '../../crypto/cryptoMessagePort';\nimport {Codec} from './codec';\n\n/*\n@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged\n*/\nexport default class Obfuscation {\n /* private enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\n private dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\n\n private id: number;\n private idPromise: Promise;\n private process: (data: Uint8Array, operation: 'encrypt' | 'decrypt') => ReturnType;\n\n // private cryptoEncKey: CryptoKey;\n // private cryptoDecKey: CryptoKey;\n // private cryptoKey: CryptoKey;\n\n // private encIv: Uint8Array;\n // private decIv: Uint8Array;\n\n // private decIvCounter: Counter;\n\n public async init(codec: Codec) {\n if(this.idPromise !== undefined) {\n this.release();\n }\n\n const initPayload = new Uint8Array(64);\n randomize(initPayload);\n\n while(true) {\n const val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | initPayload[0];\n const val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | initPayload[4];\n if(initPayload[0] !== 0xef &&\n val !== 0x44414548 &&\n val !== 0x54534f50 &&\n val !== 0x20544547 &&\n val !== 0x4954504f &&\n val !== 0xeeeeeeee &&\n val !== 0xdddddddd &&\n val2 !== 0x00000000) {\n // initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;\n break;\n }\n randomize(initPayload);\n }\n\n // //////////////////////initPayload.subarray(60, 62).hex = dcId;\n /* initPayload.set(new Uint8Array([161, 208, 67, 71, 118, 109, 20, 111, 113, 255, 134, 10, 159, 241, 7, 44, 217, 82, 187, 76, 108, 131, 200, 186, 33, 57, 177, 251, 52, 34, 18, 54, 65, 105, 37, 89, 38, 20, 47, 168, 126, 181, 24, 138, 212, 68, 60, 150, 225, 37, 181, 4, 201, 50, 72, 151, 168, 143, 204, 169, 81, 187, 241, 23]));\n console.log('initPayload', initPayload); */\n\n const reversedPayload = initPayload.slice().reverse();\n\n const encKey = initPayload.slice(8, 40);\n const encIv = /* this.encIv = */initPayload.slice(40, 56);\n const decKey = reversedPayload.slice(8, 40);\n const decIv = /* this.decIv = */reversedPayload.slice(40, 56);\n\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\n\n // console.log('encKey', encKey.hex, encIv.hex);\n // console.log('decKey', decKey.hex, decIv.hex);\n\n const idPromise = this.idPromise = cryptoMessagePort.invokeCrypto('aes-ctr-prepare', {\n encKey,\n encIv,\n decKey,\n decIv\n });\n\n this.process = async(data, operation) => {\n await idPromise;\n return this._process(data, operation);\n };\n\n this.id = await idPromise;\n\n this.process = this._process;\n\n // this.decIvCounter = new Counter(this.decIv);\n /* const key = this.cryptoEncKey = await subtle.importKey(\n 'raw',\n encKey,\n {name: 'AES-CTR'},\n false,\n ['encrypt']\n ); */\n\n // this.cryptoDecKey = await subtle.importKey(\n // 'raw',\n // decKey,\n // {name: 'AES-CTR'},\n // false,\n // ['encrypt']\n // );\n\n // this.cryptoKey = await subtle.importKey(\n // 'raw',\n // encKey,\n // {name: 'AES-CTR'},\n // false,\n // ['encrypt', 'decrypt']\n // );\n\n initPayload.set(codec.obfuscateTag, 56);\n const encrypted = await this.encode(initPayload.slice());\n\n // console.log('encrypted', encrypted);\n\n initPayload.set(encrypted.slice(56, 64), 56);\n\n return initPayload;\n }\n\n /* public encode(payload: Uint8Array) {\n let startTime = performance.now();\n let res = this.enc.encrypt(payload);\n let time = performance.now() - startTime;\n\n try {\n startTime = performance.now();\n let arr = this.encNew.encrypt(payload);\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\n let resNew = new Uint8Array(bytesFromWordss(arr));\n let time2 = performance.now() - startTime;\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\n } catch(err) {\n console.error('Obfuscation: error:', err);\n }\n\n return res;\n }\n\n public decode(payload: Uint8Array) {\n let res = this.dec.encrypt(payload);\n\n try {\n let arr = this.decNew.decrypt(payload);\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\n let resNew = new Uint8Array(bytesFromWordss(arr));\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\n } catch(err) {\n console.error('Obfuscation: error:', err);\n }\n\n return res;\n } */\n\n private _process = (data: Uint8Array, operation: 'encrypt' | 'decrypt') => {\n return cryptoMessagePort.invokeCryptoNew({\n method: 'aes-ctr-process',\n args: [{id: this.id, data, operation}],\n transfer: [data.buffer]\n }) as Promise;\n };\n\n public encode(payload: Uint8Array) {\n /* return subtle.encrypt({\n name: 'AES-CTR',\n counter: this.encIv,\n length: 64\n },\n this.cryptoEncKey,\n payload\n ); */\n return this.process(payload, 'encrypt');\n }\n\n public decode(payload: Uint8Array) {\n return this.process(payload, 'decrypt');\n }\n\n public async release() {\n const idPromise = this.idPromise;\n if(idPromise === undefined) {\n return;\n }\n\n this.id = undefined;\n this.idPromise = undefined;\n\n const id = await idPromise;\n cryptoMessagePort.invokeCrypto('aes-ctr-destroy', id);\n }\n\n public destroy() {\n this.release();\n }\n\n // public encode(payload: Uint8Array) {\n // let res = this.encNew.encrypt(payload);\n // let bytes = new Uint8Array(bytesFromWordss(res));\n\n // return bytes;\n // }\n\n // public async decode(payload: Uint8Array) {\n // const counter = this.decIvCounter.counter.slice();\n // this.decIvCounter.increment();\n\n // const n: ArrayBuffer = await subtle.encrypt({\n // name: 'AES-CTR',\n // counter: counter,\n // length: 64\n // },\n // this.cryptoDecKey,\n // payload\n // );\n\n // const decoded = this.decNew.update(payload);\n\n // console.log('decode', bytesToHex(decoded), 'new', n, bytesToHex(new Uint8Array(n)));\n\n // return decoded;\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { bytesFromHex, addPadding } from \"../../bin_utils\";\nimport {Codec} from './codec';\n\nclass AbridgedPacketCodec implements Codec {\n public tag = 0xef;\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\n\n public encodePacket(data: Uint8Array) {\n const len = data.byteLength >> 2;\n let header: Uint8Array;\n if(len < 127) {\n header = new Uint8Array([len]);\n } else { // Length: payload length, divided by four, and encoded as 3 length bytes (little endian)\n // header = new Uint8Array([0x7f, ...addPadding(bytesFromHex(len.toString(16)).reverse(), 3, true)/* .reverse() */]);\n header = new Uint8Array([0x7f, len & 0xFF, (len >> 8) & 0xFF, (len >> 16) & 0xFF]);\n // console.log('got nobody cause im braindead', header, len);\n }\n\n return header.concat(data);\n // return new Uint8Array([...header, ...data]);\n }\n\n public readPacket(data: Uint8Array) {\n let length = data[0];\n if(length >= 127) { // 0x7f\n length = data[1] | (data[2] << 8) | (data[3] << 16);\n\n return data.slice(4, length << 2 + 1); // need +1\n }\n\n return data.slice(1, length << 2 + 1); // need +1\n }\n}\n\nexport default new AbridgedPacketCodec();\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from '../../../config/modes';\nimport {logger, LogTypes} from '../../logger';\nimport MTPNetworker from '../networker';\nimport Obfuscation from './obfuscation';\nimport MTTransport, {MTConnection, MTConnectionConstructable} from './transport';\n// import intermediatePacketCodec from './intermediate';\nimport abridgedPacketCodec from './abridged';\n// import paddedIntermediatePacketCodec from './padded';\nimport {ConnectionStatus} from '../connectionStatus';\n\n \nimport transportController from './controller';\nimport bytesToHex from '../../../helpers/bytes/bytesToHex';\n// import networkStats from '../networkStats';\nimport ctx from '../../../environment/ctx';\n \n\nexport default class TcpObfuscated implements MTTransport {\n private codec = abridgedPacketCodec;\n private obfuscation = new Obfuscation();\n public networker: MTPNetworker;\n\n private pending: Array> = [];\n\n private debug = Modes.debug && false/* true */;\n private log: ReturnType;\n public connected = false;\n private lastCloseTime: number;\n public connection: MTConnection;\n\n private autoReconnect = true;\n private reconnectTimeout: number;\n private releasingPending: boolean;\n\n // private debugPayloads: MTPNetworker['debugRequests'] = [];\n\n constructor(\n private Connection: MTConnectionConstructable,\n private dcId: number,\n private url: string,\n private logSuffix: string,\n private retryTimeout: number\n ) {\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`TCP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n\n this.connect();\n }\n\n private onOpen = async() => {\n this.connected = true;\n\n \n transportController.setTransportOpened('websocket');\n \n\n const initPayload = await this.obfuscation.init(this.codec);\n if(!this.connected) {\n return;\n }\n\n this.connection.send(initPayload);\n\n if(this.networker) {\n this.pending.length = 0; // ! clear queue and reformat messages to container, because if sending simultaneously 10+ messages, connection will die\n this.networker.setConnectionStatus(ConnectionStatus.Connected);\n this.networker.cleanupSent();\n this.networker.resend();\n }/* else {\n for(const pending of this.pending) {\n if(pending.encoded && pending.body) {\n pending.encoded = this.encodeBody(pending.body);\n }\n }\n } */\n\n setTimeout(() => {\n this.releasePending();\n }, 0);\n };\n\n private onMessage = async(buffer: ArrayBuffer) => {\n // networkStats.addReceived(this.dcId, buffer.byteLength);\n\n let data = await this.obfuscation.decode(new Uint8Array(buffer));\n data = this.codec.readPacket(data);\n\n if(this.networker) { // authenticated!\n // this.pending = this.pending.filter((p) => p.body); // clear pending\n\n this.debug && this.log.debug('redirecting to networker', data.length);\n this.networker.parseResponse(data).then((response) => {\n this.debug && this.log.debug('redirecting to networker response:', response);\n\n try {\n this.networker.processMessage(response.response, response.messageId, response.sessionId);\n } catch(err) {\n this.log.error('handleMessage networker processMessage error', err);\n }\n\n // this.releasePending();\n }).catch((err) => {\n this.log.error('handleMessage networker parseResponse error', err);\n });\n\n // this.dd();\n return;\n }\n\n // console.log('got hex:', data.hex);\n const pending = this.pending.shift();\n if(!pending) {\n this.debug && this.log.debug('no pending for res:', bytesToHex(data));\n return;\n }\n\n pending.resolve(data);\n };\n\n private onClose = () => {\n this.clear();\n\n let needTimeout: number, retryAt: number;\n if(this.autoReconnect) {\n const time = Date.now();\n const diff = time - this.lastCloseTime;\n needTimeout = !isNaN(diff) && diff < this.retryTimeout ? this.retryTimeout - diff : 0;\n retryAt = time + needTimeout;\n }\n\n if(this.networker) {\n this.networker.setConnectionStatus(ConnectionStatus.Closed, retryAt);\n this.pending.length = 0;\n }\n\n if(this.autoReconnect) {\n this.log('will try to reconnect after timeout:', needTimeout / 1000);\n this.reconnectTimeout = ctx.setTimeout(this.reconnect, needTimeout);\n } else {\n this.log('reconnect isn\\'t needed');\n }\n };\n\n public clear() {\n \n if(this.connected) {\n transportController.setTransportClosed('websocket');\n }\n \n\n this.connected = false;\n\n if(this.connection) {\n this.connection.removeEventListener('open', this.onOpen);\n this.connection.removeEventListener('close', this.onClose);\n this.connection.removeEventListener('message', this.onMessage);\n this.connection = undefined;\n }\n }\n\n /**\n * invoke only when closed\n */\n public reconnect = () => {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n if(this.connection) {\n return;\n }\n\n this.log('trying to reconnect...');\n this.lastCloseTime = Date.now();\n\n if(!this.networker) {\n for(const pending of this.pending) {\n if(pending.bodySent) {\n pending.bodySent = false;\n }\n }\n } else {\n this.networker.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.connect();\n }\n\n public forceReconnect() {\n this.close();\n this.reconnect();\n }\n\n public destroy() {\n this.setAutoReconnect(false);\n this.close();\n\n if(this.obfuscation) {\n this.obfuscation.destroy();\n }\n\n this.pending.forEach((pending) => {\n if(pending.reject) {\n pending.reject();\n }\n });\n this.pending.length = 0;\n }\n\n public close() {\n const connection = this.connection;\n if(connection) {\n const connected = this.connected;\n this.clear();\n if(connected) { // wait for buffered messages if they are there\n connection.addEventListener('message', this.onMessage);\n connection.addEventListener('close', () => {\n connection.removeEventListener('message', this.onMessage);\n }, {once: true});\n connection.close();\n }\n }\n }\n\n /**\n * Will connect if enable and disconnected \\\n * Will reset reconnection timeout if disable\n */\n public setAutoReconnect(enable: boolean) {\n this.autoReconnect = enable;\n\n if(!enable) {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n } else if(!this.connection && this.reconnectTimeout === undefined) {\n this.reconnect();\n }\n }\n\n private connect() {\n if(this.connection) {\n this.close();\n }\n\n this.connection = new this.Connection(this.dcId, this.url, this.logSuffix);\n this.connection.addEventListener('open', this.onOpen);\n this.connection.addEventListener('close', this.onClose);\n this.connection.addEventListener('message', this.onMessage);\n }\n\n public changeUrl(url: string) {\n if(this.url === url) {\n return;\n }\n\n this.url = url;\n this.forceReconnect();\n }\n\n private encodeBody(body: Uint8Array) {\n const toEncode = this.codec.encodePacket(body);\n\n // this.log('send before obf:', /* body.hex, nonce.hex, */ toEncode.hex);\n const encoded = this.obfuscation.encode(toEncode);\n // this.log('send after obf:', enc.hex);\n\n return encoded;\n }\n\n public send(body: Uint8Array) {\n this.debug && this.log.debug('-> body length to pending:', body.length);\n\n const encoded: typeof body = /* this.connected ? this.encodeBody(body) : */undefined;\n\n // return;\n\n if(this.networker) {\n this.pending.push({body, encoded});\n this.releasePending();\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body, encoded});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private async releasePending(/* tt = false */) {\n if(!this.connected || this.releasingPending) {\n // this.connect();\n return;\n }\n\n this.releasingPending = true;\n\n /* if(!tt) {\n this.releasePendingDebounced();\n return;\n } */\n\n // this.log('-> messages to send:', this.pending.length);\n let length = this.pending.length;\n let sent = false;\n // for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const pending = this.pending[i];\n if(!pending) {\n break;\n }\n\n const {body, bodySent} = pending;\n if(body && !bodySent) {\n // this.debugPayloads.push({before: body.slice(), after: enc});\n\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n // if(!encoded) {\n // encoded = pending.encoded = this.encodeBody(body);\n // }\n\n const encoded = pending.encoded ??= await this.encodeBody(body);\n if(!this.connected) {\n break;\n }\n\n // networkStats.addSent(this.dcId, encoded.byteLength);\n this.connection.send(encoded);\n\n if(!pending.resolve) { // remove if no response needed\n this.pending.splice(i--, 1);\n length--;\n } else {\n pending.bodySent = true;\n }\n\n sent = true;\n // delete pending.body;\n }\n }\n\n this.releasingPending = undefined;\n\n if(this.pending.length && sent) {\n this.releasePending();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport MTTransport, {MTConnectionConstructable} from './transports/transport';\nimport Modes from '../../config/modes';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\n\n \nimport HTTP from './transports/http';\n \n\n \nimport Socket from './transports/websocket';\nimport TcpObfuscated from './transports/tcpObfuscated';\nimport {IS_WEB_WORKER} from '../../helpers/context';\nimport {DcId} from '../../types';\nimport {getEnvironment} from '../../environment/utils';\n\n \n \n \n\n \n\nexport type TransportType = 'websocket' | 'https' | 'http';\nexport type ConnectionType = 'client' | 'download' | 'upload';\ntype Servers = {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTTransport[]\n }\n }\n};\n\nconst TEST_SUFFIX = Modes.test ? '_test' : '';\nconst PREMIUM_SUFFIX = '_premium';\n\nexport function getTelegramConnectionSuffix(connectionType: ConnectionType) {\n return connectionType === 'client' ? '' : '-1';\n}\n\n \nexport function constructTelegramWebSocketUrl(dcId: DcId, connectionType: ConnectionType, premium?: boolean) {\n const suffix = getTelegramConnectionSuffix(connectionType);\n const path = connectionType !== 'client' ? 'apiws' + TEST_SUFFIX + (premium ? PREMIUM_SUFFIX : '') : ('apiws' + TEST_SUFFIX);\n const chosenServer = `wss://${App.suffix.toLowerCase()}ws${dcId}${suffix}.web.telegram.org/${path}`;\n\n return chosenServer;\n}\n \n\nexport class DcConfigurator {\n private sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\n\n private dcOptions = Modes.test ?\n [\n {id: 1, host: '149.154.175.10', port: 80},\n {id: 2, host: '149.154.167.40', port: 80},\n {id: 3, host: '149.154.175.117', port: 80}\n ] :\n [\n {id: 1, host: '149.154.175.50', port: 80},\n {id: 2, host: '149.154.167.50', port: 80},\n {id: 3, host: '149.154.175.100', port: 80},\n {id: 4, host: '149.154.167.91', port: 80},\n {id: 5, host: '149.154.171.5', port: 80}\n ];\n\n public chosenServers: Servers = {} as any;\n\n \n private transportSocket = (dcId: DcId, connectionType: ConnectionType, premium?: boolean) => {\n const chosenServer = constructTelegramWebSocketUrl(dcId, connectionType, premium);\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n\n const retryTimeout = connectionType === 'client' ? 10000 : 10000;\n\n let oooohLetMeLive: MTConnectionConstructable;\n \n oooohLetMeLive = Socket;\n \n \n \n\n return new TcpObfuscated(oooohLetMeLive, dcId, chosenServer, logSuffix, retryTimeout);\n };\n \n\n \n private transportHTTP = (dcId: DcId, connectionType: ConnectionType, premium?: boolean) => {\n let chosenServer: string;\n if(Modes.ssl || !Modes.http) {\n const suffix = getTelegramConnectionSuffix(connectionType);\n const subdomain = this.sslSubdomains[dcId - 1] + suffix;\n const path = Modes.test ? 'apiw_test1' : 'apiw1';\n chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path;\n } else {\n for(const dcOption of this.dcOptions) {\n if(dcOption.id === dcId) {\n chosenServer = 'http://' + dcOption.host + (dcOption.port !== 80 ? ':' + dcOption.port : '') + '/apiw1';\n break;\n }\n }\n }\n\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n return new HTTP(dcId, chosenServer, logSuffix);\n };\n \n\n public chooseServer(\n dcId: DcId,\n connectionType: ConnectionType = 'client',\n transportType: TransportType = Modes.transport,\n reuse = true,\n premium?: boolean\n ) {\n /* if(transportType === 'websocket' && !Modes.multipleConnections) {\n connectionType = 'client';\n } */\n\n if(!this.chosenServers.hasOwnProperty(transportType)) {\n this.chosenServers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const servers = this.chosenServers[transportType][connectionType];\n\n if(!(dcId in servers)) {\n servers[dcId] = [];\n }\n\n const transports = servers[dcId];\n\n if(!transports.length || !reuse/* || (upload && transports.length < 1) */) {\n let transport: MTTransport;\n\n \n transport = (transportType === 'websocket' ? this.transportSocket : this.transportHTTP)(dcId, connectionType, premium);\n \n \n \n \n \n\n if(!transport) {\n console.error('No chosenServer!', dcId);\n return null;\n }\n\n if(reuse) {\n transports.push(transport);\n }\n\n return transport;\n }\n\n return transports[0];\n }\n\n public static removeTransport(obj: any, transport: T) {\n for(const transportType in obj) {\n // @ts-ignore\n for(const connectionType in obj[transportType]) {\n // @ts-ignore\n for(const dcId in obj[transportType][connectionType]) {\n // @ts-ignore\n const transports: T[] = obj[transportType][connectionType][dcId];\n indexOfAndSplice(transports, transport);\n }\n }\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../../../config/app';\nimport deferredPromise from '../../../helpers/cancellablePromise';\nimport EventListenerBase from '../../../helpers/eventListenerBase';\nimport pause from '../../../helpers/schedulers/pause';\nimport {TransportType, DcConfigurator} from '../dcConfigurator';\nimport type HTTP from './http';\nimport type TcpObfuscated from './tcpObfuscated';\nimport MTTransport from './transport';\n\nexport class MTTransportController extends EventListenerBase<{\n change: (opened: MTTransportController['opened']) => void,\n transport: (type: TransportType) => void\n}> {\n private opened: Map;\n private transports: {[k in TransportType]?: MTTransport};\n private pinging: boolean;\n private dcConfigurator: DcConfigurator;\n\n constructor() {\n super(true);\n\n this.opened = new Map();\n /* this.addEventListener('change', (opened) => {\n this.dispatchEvent('transport', opened.get('websocket') || !opened.get('https') ? 'websocket' : 'https');\n }); */\n\n this.addEventListener('change', (opened) => {\n if(!opened.get('websocket')) {\n this.waitForWebSocket();\n }\n });\n\n // setTimeout(() => {\n // this.waitForWebSocket();\n // }, 200); // wait for first transport so won't have delay for first WS\n }\n\n public async pingTransports() {\n const dcConfigurator = this.dcConfigurator ??= new DcConfigurator();\n const timeout = 2000;\n const transports: {[k in TransportType]?: MTTransport} = this.transports = {\n https: dcConfigurator.chooseServer(App.baseDcId, 'client', 'https', false),\n websocket: dcConfigurator.chooseServer(App.baseDcId, 'client', 'websocket', false)\n };\n\n const httpPromise = deferredPromise();\n ((this.transports.https as HTTP)._send(new Uint8Array(), 'no-cors') as any as Promise)\n .then(() => httpPromise.resolve(true), () => httpPromise.resolve(false));\n setTimeout(() => httpPromise.resolve(false), timeout);\n\n const websocketPromise = deferredPromise();\n const socket = transports.websocket as TcpObfuscated;\n socket.setAutoReconnect(false);\n socket.connection.addEventListener('close', () => websocketPromise.resolve(false), {once: true});\n socket.connection.addEventListener('open', () => websocketPromise.resolve(true), {once: true});\n setTimeout(() => {\n if(websocketPromise.isFulfilled || websocketPromise.isRejected) {\n return;\n }\n\n if(socket.connection) {\n socket.connection.close();\n }\n\n websocketPromise.resolve(false);\n }, timeout);\n\n const [isHttpAvailable, isWebSocketAvailable] = await Promise.all([httpPromise, websocketPromise]);\n\n for(const transportType in transports) {\n const transport = transports[transportType as TransportType];\n transport.destroy();\n }\n\n const result = {\n https: isHttpAvailable || this.opened.get('https') > 0,\n websocket: isWebSocketAvailable || this.opened.get('websocket') > 0\n };\n\n // result.websocket = false;\n return result;\n }\n\n public async waitForWebSocket() {\n if(this.pinging) return;\n this.pinging = true;\n\n while(true) {\n const {https, websocket} = await this.pingTransports();\n if(https || websocket) {\n this.dispatchEvent('transport', websocket || !https ? 'websocket' : 'https');\n }\n\n if(websocket) {\n break;\n }\n\n await pause(10000);\n }\n\n this.pinging = false;\n }\n\n public setTransportValue(type: TransportType, value: boolean) {\n let length = this.opened.get(type) || 0;\n length += value ? 1 : -1;\n\n this.opened.set(type, length);\n this.dispatchEvent('change', this.opened);\n }\n\n public setTransportOpened(type: TransportType) {\n return this.setTransportValue(type, true);\n }\n\n public setTransportClosed(type: TransportType) {\n return this.setTransportValue(type, false);\n }\n}\n\nconst transportController = new MTTransportController();\nexport default transportController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport deferredPromise, {CancellablePromise} from '../../../../helpers/cancellablePromise';\nimport type {StoragesResults} from './loadStorages';\n\nconst RESET_STORAGES_PROMISE: CancellablePromise> = deferredPromise();\nexport default RESET_STORAGES_PROMISE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {CryptoMessagePort} from '../crypto/cryptoMessagePort';\nimport type {ApiFileManager} from '../mtproto/apiFileManager';\nimport type {ApiManager} from '../mtproto/apiManager';\nimport type {Authorizer} from '../mtproto/authorizer';\nimport type {DcConfigurator} from '../mtproto/dcConfigurator';\nimport type {NetworkerFactory} from '../mtproto/networkerFactory';\nimport type {PasswordManager} from '../mtproto/passwordManager';\nimport type {ReferenceDatabase} from '../mtproto/referenceDatabase';\nimport type {TimeManager} from '../mtproto/timeManager';\nimport type {RootScope} from '../rootScope';\nimport type DialogsStorage from '../storages/dialogs';\nimport type FiltersStorage from '../storages/filters';\nimport type PeersStorage from '../storages/peers';\nimport type ThumbsStorage from '../storages/thumbs';\nimport type {ApiUpdatesManager} from './apiUpdatesManager';\nimport type {AppAvatarsManager} from './appAvatarsManager';\nimport type {AppCallsManager} from './appCallsManager';\nimport type {AppChatsManager} from './appChatsManager';\nimport type {AppDocsManager} from './appDocsManager';\nimport type {AppDraftsManager} from './appDraftsManager';\nimport type {AppEmojiManager} from './appEmojiManager';\nimport type {AppGroupCallsManager} from './appGroupCallsManager';\nimport type {AppInlineBotsManager} from './appInlineBotsManager';\nimport type {AppMessagesIdsManager} from './appMessagesIdsManager';\nimport type {AppMessagesManager} from './appMessagesManager';\nimport type {AppNotificationsManager} from './appNotificationsManager';\nimport type AppPaymentsManager from './appPaymentsManager';\nimport type {AppPeersManager} from './appPeersManager';\nimport type {AppPhotosManager} from './appPhotosManager';\nimport type {AppPollsManager} from './appPollsManager';\nimport type {AppPrivacyManager} from './appPrivacyManager';\nimport type {AppProfileManager} from './appProfileManager';\nimport type {AppReactionsManager} from './appReactionsManager';\nimport type {AppStateManager} from './appStateManager';\nimport type {AppStickersManager} from './appStickersManager';\nimport type {AppStoragesManager} from './appStoragesManager';\nimport type {AppUsersManager} from './appUsersManager';\nimport type AppWebDocsManager from './appWebDocsManager';\nimport type {AppWebPagesManager} from './appWebPagesManager';\nimport type AppAttachMenuBotsManager from './appAttachMenuBotsManager';\nimport type AppSeamlessLoginManager from './appSeamlessLoginManager';\nimport type {AppManagers} from './managers';\n\nexport class AppManager {\n protected appPeersManager: AppPeersManager;\n protected appChatsManager: AppChatsManager;\n protected appDocsManager: AppDocsManager;\n protected appPhotosManager: AppPhotosManager;\n protected appPollsManager: AppPollsManager;\n protected appUsersManager: AppUsersManager;\n protected appWebPagesManager: AppWebPagesManager;\n protected appDraftsManager: AppDraftsManager;\n protected appProfileManager: AppProfileManager;\n protected appNotificationsManager: AppNotificationsManager;\n protected apiUpdatesManager: ApiUpdatesManager;\n protected appAvatarsManager: AppAvatarsManager;\n protected appGroupCallsManager: AppGroupCallsManager;\n protected appCallsManager: AppCallsManager;\n protected appReactionsManager: AppReactionsManager;\n protected appMessagesManager: AppMessagesManager;\n protected appMessagesIdsManager: AppMessagesIdsManager;\n protected appPrivacyManager: AppPrivacyManager;\n protected appInlineBotsManager: AppInlineBotsManager;\n protected appStickersManager: AppStickersManager;\n protected referenceDatabase: ReferenceDatabase;\n protected appEmojiManager: AppEmojiManager;\n protected dialogsStorage: DialogsStorage;\n protected filtersStorage: FiltersStorage;\n protected apiManager: ApiManager;\n // protected apiManager: ApiManagerProxy;\n protected passwordManager: PasswordManager;\n protected cryptoWorker: CryptoMessagePort;\n protected apiFileManager: ApiFileManager;\n protected peersStorage: PeersStorage;\n protected thumbsStorage: ThumbsStorage;\n protected networkerFactory: NetworkerFactory;\n protected rootScope: RootScope;\n protected authorizer: Authorizer;\n protected dcConfigurator: DcConfigurator;\n protected timeManager: TimeManager;\n protected appStoragesManager: AppStoragesManager;\n protected appStateManager: AppStateManager;\n protected appWebDocsManager: AppWebDocsManager;\n protected appPaymentsManager: AppPaymentsManager;\n protected appAttachMenuBotsManager: AppAttachMenuBotsManager;\n protected appSeamlessLoginManager: AppSeamlessLoginManager;\n\n public clear: (init?: boolean) => void;\n\n public setManagers(managers: AppManagers) {\n Object.assign(this, managers);\n // this.after();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type{Chat} from '../../../../layer';\nimport type{Dialog} from '../../appMessagesManager';\nimport type{User} from '../../appUsersManager';\nimport type {StoragesStorages} from './createStorages';\nimport {recordPromiseBound} from '../../../../helpers/recordPromise';\nimport {Awaited} from '../../../../types';\nimport {logger} from '../../../logger';\nimport RESET_STORAGES_PROMISE from './resetStoragesPromise';\n\nexport type StoragesResults = Awaited>;\n\nasync function loadStoragesInner(storages: StoragesStorages) {\n const recordPromise = recordPromiseBound(logger('STORAGES-LOADER'));\n const storagesKeys = Object.keys(storages) as Array;\n const storagesPromises: Promise[] = storagesKeys.map((key) => {\n const promise = storages[key].getAll();\n return recordPromise(promise, 'storage ' + (key as any as string));\n });\n\n const storagesResults: {\n users: User[],\n chats: Chat[],\n dialogs: Dialog[]\n } = {} as any;\n const arr = await Promise.all(storagesPromises);\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\n storagesResults[storagesKeys[i]] = arr[i] as any;\n }\n\n arr.splice(0, storagesKeys.length);\n\n const resetStorages = await RESET_STORAGES_PROMISE;\n if(resetStorages.size) {\n for(const key of resetStorages) {\n storagesResults[key].length = 0;\n }\n\n resetStorages.clear();\n }\n\n return storagesResults;\n}\n\nlet promise: ReturnType;\nexport default function loadStorages(storages: StoragesStorages) {\n return promise ??= loadStoragesInner(storages);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {logger} from '../logger';\nimport {AppManager} from './manager';\nimport createStorages from './utils/storages/createStorages';\nimport loadStorages from './utils/storages/loadStorages';\n\nexport class AppStoragesManager extends AppManager {\n private storages: ReturnType;\n\n // private loadPromise: CancellablePromise;\n\n private log: ReturnType;\n\n constructor() {\n super();\n\n this.log = logger('STORAGES');\n this.storages = createStorages();\n // this.loadPromise = deferredPromise();\n }\n\n public loadStorages() {\n return loadStorages(this.storages);\n // loadStorages(this.storages).then((storagesResults) => {\n // this.loadPromise.resolve(storagesResults);\n // });\n\n // return this.loadPromise;\n }\n\n // public setStoragesResults(storagesResults: StoragesResults) {\n // this.loadPromise.resolve(storagesResults);\n // }\n\n public async loadStorage(name: T) {\n return this.loadStorages().then((storagesResults) => {\n return {\n storage: this.storages[name],\n results: storagesResults[name]\n };\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Chat} from '../../../../layer';\nimport type {Dialog} from '../../appMessagesManager';\nimport type {User} from '../../appUsersManager';\nimport DATABASE_STATE from '../../../../config/databases/state';\nimport AppStorage from '../../../storage';\n\nexport type StoragesStorages = {\n users: AppStorage, typeof DATABASE_STATE>,\n chats: AppStorage, typeof DATABASE_STATE>,\n dialogs: AppStorage, typeof DATABASE_STATE>\n};\n\nexport default function createStorages() {\n const names: (keyof StoragesStorages)[] = ['users', 'chats', 'dialogs'];\n const storages: StoragesStorages = {} as any;\n for(const name of names) {\n // @ts-ignore\n storages[name] = new AppStorage(DATABASE_STATE, name);\n }\n\n return storages;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo} from '../../layer';\nimport randomize from '../../helpers/array/randomize';\nimport {AppManager} from '../appManagers/manager';\n\nexport class PasswordManager extends AppManager {\n public getState(): Promise {\n return this.apiManager.invokeApi('account.getPassword').then((result) => {\n return result;\n });\n }\n\n public updateSettings(settings: {\n hint?: string,\n email?: string,\n newPassword?: string,\n currentPassword?: string\n } = {}) {\n // state = Object.assign({}, state);\n // state.new_algo = Object.assign({}, state.new_algo);\n\n return this.getState().then((state) => {\n let currentHashPromise: Promise;\n let newHashPromise: Promise;\n const params: AccountUpdatePasswordSettings = {\n password: null,\n new_settings: {\n _: 'account.passwordInputSettings',\n hint: settings.hint,\n email: settings.email\n }\n };\n\n if(settings.currentPassword) {\n currentHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\n } else {\n currentHashPromise = Promise.resolve({\n _: 'inputCheckPasswordEmpty'\n });\n }\n\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\n randomize(salt1);\n salt1.set(newAlgo.salt1, 0);\n newAlgo.salt1 = salt1;\n\n if(settings.newPassword) {\n newHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\n } else {\n newHashPromise = Promise.resolve(new Uint8Array());\n }\n\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\n params.password = hashes[0];\n params.new_settings.new_algo = newAlgo;\n params.new_settings.new_password_hash = hashes[1];\n\n return this.apiManager.invokeApi('account.updatePasswordSettings', params);\n });\n });\n }\n\n public getInputCheckPassword(password: string, state: AccountPassword) {\n return this.cryptoWorker.invokeCrypto('computeSRP', password, state, false) as Promise;\n }\n\n public check(password: string, state: AccountPassword, options: any = {}) {\n return this.getInputCheckPassword(password, state).then((inputCheckPassword) => {\n // console.log('SRP', inputCheckPassword);\n return this.apiManager.invokeApi('auth.checkPassword', {\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\n }, options).then((auth) => {\n if(auth._ === 'auth.authorization') {\n this.apiManager.setUser(auth.user);\n }\n\n return auth;\n });\n });\n }\n\n public confirmPasswordEmail(code: string) {\n return this.apiManager.invokeApi('account.confirmPasswordEmail', {code});\n }\n\n public resendPasswordEmail() {\n return this.apiManager.invokeApi('account.resendPasswordEmail');\n }\n\n public cancelPasswordEmail() {\n return this.apiManager.invokeApi('account.cancelPasswordEmail');\n }\n\n /* public requestRecovery(options: any = {}) {\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\n }\n\n public recover(code: any, options: any = {}) {\n return apiManager.invokeApi('auth.recoverPassword', {\n code\n }, options);\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Photo} from '../../layer';\nimport {logger} from '../logger';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport {AppManager} from '../appManagers/manager';\nimport makeError from '../../helpers/makeError';\n\nexport type ReferenceContext = ReferenceContext.referenceContextProfilePhoto | ReferenceContext.referenceContextMessage | ReferenceContext.referenceContextEmojiesSounds | ReferenceContext.referenceContextReactions | ReferenceContext.referenceContextUserFull | ReferenceContext.referenceContextCustomEmoji | ReferenceContext.referenceContextAttachMenuBotIcon;\nexport namespace ReferenceContext {\n export type referenceContextProfilePhoto = {\n type: 'profilePhoto',\n peerId: PeerId\n };\n\n export type referenceContextMessage = {\n type: 'message',\n peerId: PeerId,\n messageId: number\n };\n\n export type referenceContextEmojiesSounds = {\n type: 'emojiesSounds'\n };\n\n export type referenceContextReactions = {\n type: 'reactions'\n };\n\n export type referenceContextUserFull = {\n type: 'userFull',\n userId: UserId\n };\n\n export type referenceContextCustomEmoji = {\n type: 'customEmoji',\n docId: DocId\n };\n\n export type referenceContextAttachMenuBotIcon = {\n type: 'attachMenuBotIcon',\n botId: BotId\n };\n}\n\nexport type ReferenceBytes = Photo.photo['file_reference'];\nexport type ReferenceContexts = Set;\n\n// type ReferenceBytes = Uint8Array;\n\nexport class ReferenceDatabase extends AppManager {\n private contexts: Map = new Map();\n // private references: Map = new Map();\n private links: {[hex: string]: ReferenceBytes} = {};\n private log = logger('RD', undefined, true);\n private refreshEmojiesSoundsPromise: Promise;\n\n // constructor() {\n // super();\n\n // apiManager.addTaskListener('refreshReference', (task: RefreshReferenceTask) => {\n // const originalPayload = task.payload;\n\n // assumeType(task);\n // task.originalPayload = originalPayload;\n\n // this.refreshReference(originalPayload).then((bytes) => {\n // task.payload = bytes;\n // }, (err) => {\n // task.error = err;\n // }).then(() => apiManager.postMessage(task));\n // });\n // }\n\n public saveContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(!contexts) {\n contexts = new Set();\n this.contexts.set(reference, contexts);\n }\n\n this.links[bytesToHex(reference)] = reference;\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n return;\n }\n }\n\n contexts.add(context);\n }\n\n public getReferenceByLink(reference: ReferenceBytes) {\n return this.links[bytesToHex(reference)];\n }\n\n public getContexts(reference: ReferenceBytes): [ReferenceContexts, ReferenceBytes] {\n const contexts = this.contexts.get(reference) || (reference = this.getReferenceByLink(reference) || reference, this.contexts.get(reference));\n return [contexts, reference];\n }\n\n public getContext(reference: ReferenceBytes): [ReferenceContext, ReferenceBytes] {\n const contexts = this.getContexts(reference);\n return contexts[0] ? [contexts[0].values().next().value, contexts[1]] : undefined;\n }\n\n public deleteContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(contexts) {\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n contexts.delete(_context);\n if(!contexts.size) {\n this.contexts.delete(reference);\n delete this.links[bytesToHex(reference)];\n }\n return true;\n }\n }\n }\n\n return false;\n }\n\n public refreshReference(reference: ReferenceBytes, context?: ReferenceContext): Promise {\n this.log('refreshReference: start', reference.slice(), context);\n if(!context) {\n const c = this.getContext(reference);\n if(!c) {\n this.log('refreshReference: got no context for reference:', reference.slice());\n return Promise.reject('NO_CONTEXT');\n }\n\n [context, reference] = c;\n }\n\n let promise: Promise;\n switch(context?.type) {\n case 'message': {\n promise = this.appMessagesManager.reloadMessages(context.peerId, context.messageId, true);\n break;\n // .then(() => {\n // console.log('FILE_REFERENCE_EXPIRED: got message', context, appMessagesManager.getMessage((context as ReferenceContext.referenceContextMessage).messageId).media, reference);\n // });\n }\n\n case 'emojiesSounds': {\n promise = this.refreshEmojiesSoundsPromise || this.appStickersManager.getAnimatedEmojiSounds(true).then(() => {\n this.refreshEmojiesSoundsPromise = undefined;\n });\n break;\n }\n\n case 'userFull': {\n promise = Promise.resolve(this.appProfileManager.getProfile(context.userId, true));\n break;\n }\n\n case 'customEmoji': {\n promise = this.appEmojiManager.getCustomEmojiDocuments([context.docId]);\n break;\n }\n\n case 'attachMenuBotIcon': {\n promise = this.appAttachMenuBotsManager.getAttachMenuBot(context.botId, true) as any;\n break;\n }\n\n default: {\n this.log.warn('refreshReference: not implemented context', context);\n return Promise.reject();\n }\n }\n\n const hex = bytesToHex(reference);\n this.log('refreshReference: refreshing reference:', hex);\n return promise.then(() => {\n const newHex = bytesToHex(reference);\n this.log('refreshReference: refreshed, reference before:', hex, 'after:', newHex);\n if(hex !== newHex) {\n return reference;\n }\n\n this.deleteContext(reference, context);\n\n const newContext = this.getContext(reference);\n if(newContext) {\n return this.refreshReference(reference, newContext[0]);\n }\n\n this.log.error('refreshReference: no new context, reference before:', hex, 'after:', newHex, context);\n\n throw makeError('NO_NEW_CONTEXT');\n });\n }\n\n /* public replaceReference(oldReference: ReferenceBytes, newReference: ReferenceBytes) {\n const contexts = this.contexts.get(oldReference);\n if(contexts) {\n this.contexts.delete(oldReference);\n this.contexts.set(newReference, contexts);\n }\n } */\n}\n","export default function safeReplaceObject(wasObject: any, newObject: any) {\n if(!wasObject) {\n return newObject;\n }\n\n for(var key in wasObject) {\n if(!newObject.hasOwnProperty(key)) {\n delete wasObject[key];\n }\n }\n\n for(var key in newObject) {\n // if (newObject.hasOwnProperty(key)) { // useless\n wasObject[key] = newObject[key];\n // }\n }\n\n return wasObject;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message, MessageAction, MessageMedia} from '../../../../layer';\nimport getPeerId from '../peers/getPeerId';\n\nexport default function getPeerIdsFromMessage(message: Message.message | Message.messageService) {\n const peerIds: number[] = [\n message.fromId,\n message.viaBotId,\n (message as Message.message).fwdFromId\n ];\n\n const media = (message as Message.message).media;\n if(media) {\n const contactUserId = (media as MessageMedia.messageMediaContact).user_id;\n if(contactUserId !== undefined) {\n peerIds.push(contactUserId.toPeerId());\n }\n\n const results = (media as MessageMedia.messageMediaPoll).results;\n const recentVoters = results?.recent_voters;\n if(recentVoters?.length) {\n peerIds.push(...recentVoters.map((userId) => userId.toPeerId()));\n }\n }\n\n const recentReactions = ((message as Message.message).reactions)?.recent_reactions;\n if(recentReactions?.length) {\n peerIds.push(...recentReactions.map((reaction) => getPeerId(reaction.peer_id)));\n }\n\n const action = (message as Message.messageService).action;\n if(action) {\n const userIds: UserId[] = [\n ...((action as MessageAction.messageActionChatAddUser).users || []),\n (action as MessageAction.messageActionChatDeleteUser).user_id,\n (action as MessageAction.messageActionChatJoinedByLink).inviter_id\n ];\n peerIds.push(...userIds.filter(Boolean).map((userId) => userId.toPeerId()));\n\n const chatIds: ChatId[] = [\n (action as MessageAction.messageActionChatMigrateTo).channel_id,\n (action as MessageAction.messageActionChannelMigrateFrom).chat_id\n ];\n peerIds.push(...chatIds.filter(Boolean).map((chatId) => chatId.toPeerId(true)));\n }\n\n const recentRepliers = ((message as Message.message).replies)?.recent_repliers;\n if(recentRepliers?.length) {\n peerIds.push(...recentRepliers.map((reply) => getPeerId(reply)));\n }\n\n return new Set(peerIds.filter(Boolean));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ForumTopic} from '../../../../layer';\nimport type {Dialog} from '../../appMessagesManager';\nimport type getDialogIndexKey from './getDialogIndexKey';\n\nexport default function setDialogIndex(\n dialog: Dialog | ForumTopic.forumTopic,\n indexKey: ReturnType,\n index: number\n) {\n return (dialog as Dialog)[indexKey] = index;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {Chat, ForumTopic as MTForumTopic, DialogPeer, Message, MessageAction, MessageMedia, MessagesForumTopics, MessagesPeerDialogs, Update} from '../../layer';\nimport type {Dialog, ForumTopic, MyMessage} from '../appManagers/appMessagesManager';\nimport tsNow from '../../helpers/tsNow';\nimport SearchIndex from '../searchIndex';\nimport {SliceEnd} from '../../helpers/slicedArray';\nimport {MyDialogFilter} from './filters';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, NULL_PEER_ID, REAL_FOLDERS, REAL_FOLDER_ID} from '../mtproto/mtproto_config';\nimport {MaybePromise, NoneToVoidFunction} from '../../types';\nimport ctx from '../../environment/ctx';\nimport AppStorage from '../storage';\nimport type DATABASE_STATE from '../../config/databases/state';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport getServerMessageId from '../appManagers/utils/messageId/getServerMessageId';\nimport generateMessageId from '../appManagers/utils/messageId/generateMessageId';\nimport {AppManager} from '../appManagers/manager';\nimport getDialogIndexKey from '../appManagers/utils/dialogs/getDialogIndexKey';\nimport isObject from '../../helpers/object/isObject';\nimport getDialogIndex from '../appManagers/utils/dialogs/getDialogIndex';\nimport getPeerIdsFromMessage from '../appManagers/utils/messages/getPeerIdsFromMessage';\nimport {AppStoragesManager} from '../appManagers/appStoragesManager';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport setDialogIndex from '../appManagers/utils/dialogs/setDialogIndex';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\nimport {BroadcastEvents} from '../rootScope';\nimport assumeType from '../../helpers/assumeType';\nimport makeError from '../../helpers/makeError';\nimport callbackify from '../../helpers/callbackify';\n\nexport type FolderDialog = {\n dialog: Dialog,\n index: number\n};\n\nexport type Folder = {\n dialogs: (Dialog | ForumTopic)[],\n id: number,\n unreadMessagesCount: number,\n unreadPeerIds: Set,\n unreadUnmutedPeerIds: Set,\n dispatchUnreadTimeout?: number\n};\n\nexport const GLOBAL_FOLDER_ID: REAL_FOLDER_ID = undefined;\n\n// let spentTime = 0;\nexport default class DialogsStorage extends AppManager {\n private storage: AppStoragesManager['storages']['dialogs'];\n\n private dialogs: {[peerId: PeerId]: Dialog};\n\n private folders: {[folderId: number]: Folder};\n\n private allDialogsLoaded: {[folder_id: number]: boolean};\n private dialogsOffsetDate: {[folder_id: number]: number};\n private pinnedOrders: {[folder_id: number]: PeerId[]};\n private dialogsNum: number;\n\n private dialogsIndex: SearchIndex;\n\n private cachedResults: {\n query: string,\n count: number,\n dialogs: Dialog[],\n folderId: number\n };\n\n private forumTopics: Map,\n deletedTopics: Set,\n getTopicPromises: Map>,\n getTopicsPromise?: Promise\n }>;\n\n protected after() {\n this.clear(true);\n\n this.rootScope.addEventListener('language_change', () => {\n const peerId = this.appUsersManager.getSelf().id.toPeerId(false);\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n });\n\n const onFilterUpdate = (filter: MyDialogFilter) => {\n const dialogs = this.getCachedDialogs(false);\n for(let i = 0; i < dialogs.length; ++i) {\n this.processDialogForFilter(dialogs[i], filter);\n }\n };\n\n this.rootScope.addEventListener('filter_order', () => {\n const dialogs = this.getCachedDialogs(false);\n // const indexKeys: ReturnType[] = [];\n for(const filterId in this.folders) {\n if(+filterId > 1) {\n delete this.folders[filterId];\n }\n\n // indexKeys.push(this.getDialogIndexKey(+filterId));\n }\n\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n // for(const indexKey of indexKeys) {\n // delete dialog[indexKey];\n // }\n\n this.processDialogForFilters(dialog);\n }\n });\n\n this.rootScope.addEventListener('filter_update', onFilterUpdate);\n this.rootScope.addEventListener('filter_new', onFilterUpdate);\n\n this.rootScope.addEventListener('filter_delete', (filter) => {\n const dialogs = this.getCachedDialogs(false);\n\n const indexKey = this.getDialogIndexKeyByFilterId(filter.id);\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n delete dialog[indexKey];\n }\n\n delete this.folders[filter.id];\n });\n\n this.rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.processChangedUnreadOrUnmuted(dialog.peerId);\n });\n\n this.rootScope.addEventListener('chat_update', (chatId) => {\n const chat = this.appChatsManager.getChat(chatId);\n\n const peerId = chatId.toPeerId(true);\n if((chat as Chat.chat).pFlags.left && this.getDialogOnly(peerId)) {\n this.dropDialogOnDeletion(peerId);\n }\n });\n\n this.rootScope.addEventListener('chat_toggle_forum', ({chatId, enabled}) => {\n const peerId = chatId.toPeerId(true);\n if(!enabled) {\n this.flushForumTopicsCache(peerId);\n }\n\n this.processChangedUnreadOrUnmuted(peerId);\n });\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateFolderPeers: this.onUpdateFolderPeers,\n\n updateDialogPinned: this.onUpdateDialogPinned,\n\n updateChannelPinnedTopic: this.onUpdateChannelPinnedTopic,\n\n updatePinnedDialogs: this.onUpdatePinnedDialogs,\n\n updateChannelPinnedTopics: this.onUpdateChannelPinnedTopics\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('dialogs')\n ]).then(([state, {results: dialogs, storage}]) => {\n this.storage = storage;\n this.dialogs = this.storage.getCache();\n\n for(const folderId of REAL_FOLDERS) {\n const order = state.pinnedOrders[folderId];\n if(!order) {\n continue;\n }\n\n const _order = this.getPinnedOrders(folderId);\n _order.splice(0, _order.length, ...order);\n }\n\n if(dialogs.length) {\n AppStorage.freezeSaving(this.setDialogsFromState.bind(this, dialogs), ['chats', 'dialogs', 'messages', 'users']);\n }\n\n this.allDialogsLoaded = state.allDialogsLoaded || {};\n\n if(dialogs.length) {\n this.appDraftsManager.addMissedDialogs();\n }\n });\n }\n\n private setDialogsFromState(dialogs: Dialog[]) {\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n if(!dialog) {\n continue;\n }\n\n // if(dialog.peerId !== SERVICE_PEER_ID) {\n dialog.top_message = getServerMessageId(dialog.top_message); // * fix outgoing message to avoid copying dialog\n // }\n\n if(dialog.topMessage) {\n this.appMessagesManager.saveMessages([dialog.topMessage]);\n }\n\n for(let i = 0; i <= 21; ++i) {\n const indexKey: ReturnType = `index_${i}` as any;\n delete dialog[indexKey];\n }\n // delete dialog.indexes;\n\n this.saveDialog({\n dialog,\n ignoreOffsetDate: true\n });\n\n // ! WARNING, убрать это когда нужно будет делать чтобы pending сообщения сохранялись\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(!message) {\n this.appMessagesManager.reloadConversation(dialog.peerId);\n }\n }\n }\n\n public isDialogsLoaded(folderId: number) {\n return !!this.allDialogsLoaded[folderId];\n }\n\n public setDialogsLoaded(folderId: number, loaded: boolean) {\n const isForum = this.isFilterIdForForum(folderId);\n\n if(folderId === GLOBAL_FOLDER_ID && loaded) {\n this.allDialogsLoaded[FOLDER_ID_ALL] = loaded;\n this.allDialogsLoaded[FOLDER_ID_ARCHIVE] = loaded;\n } else {\n if(isForum) {\n defineNotNumerableProperties(this.allDialogsLoaded, [folderId]);\n }\n\n this.allDialogsLoaded[folderId] = loaded;\n }\n\n if(isForum) {\n return;\n }\n\n if(Array.from(REAL_FOLDERS).every((folderId) => this.allDialogsLoaded[folderId])) {\n this.allDialogsLoaded[GLOBAL_FOLDER_ID] = true;\n }\n\n this.saveAllDialogsLoaded();\n }\n\n private saveAllDialogsLoaded() {\n this.appStateManager.pushToState('allDialogsLoaded', this.allDialogsLoaded);\n }\n\n public clear = (init = false) => {\n if(!init) {\n this.storage.clear();\n\n this.allDialogsLoaded = {};\n this.saveAllDialogsLoaded();\n\n // * clear not numerable properties\n this.pinnedOrders = Object.assign({}, this.pinnedOrders);\n for(const folderId of REAL_FOLDERS) {\n this.resetPinnedOrder(folderId);\n }\n this.savePinnedOrders();\n } else {\n this.allDialogsLoaded = {};\n this.pinnedOrders = {};\n for(const folderId of REAL_FOLDERS) {\n this.pinnedOrders[folderId] = [];\n }\n }\n\n this.forumTopics = new Map();\n this.folders = {};\n this.dialogsOffsetDate = {};\n this.dialogsNum = 0;\n this.dialogsIndex = new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n this.cachedResults = {\n query: '',\n count: 0,\n dialogs: [],\n folderId: 0\n };\n };\n\n public handleDialogUnpinning(dialog: Dialog | ForumTopic, folderId: number) {\n delete dialog.pFlags.pinned;\n indexOfAndSplice(this.getPinnedOrders(folderId), this.isFilterIdForForum(folderId) ? (dialog as ForumTopic).id : dialog.peerId);\n this.savePinnedOrders();\n }\n\n public savePinnedOrders() {\n this.appStateManager.pushToState('pinnedOrders', this.pinnedOrders);\n }\n\n public resetPinnedOrder(folderId: number) {\n this.getPinnedOrders(folderId).length = 0;\n }\n\n public getPinnedOrders(folderId: number) {\n let orders = this.pinnedOrders[folderId];\n if(!orders && this.isFilterIdForForum(folderId)) {\n defineNotNumerableProperties(this.pinnedOrders, [folderId]);\n orders = this.pinnedOrders[folderId] = [];\n }\n\n return orders;\n }\n\n public isDialogPinned(peerId: PeerId, folderId: number) {\n const filter = this.filtersStorage.getFilter(folderId);\n let isPinned: boolean;\n if(filter) {\n isPinned = filter.pinnedPeerIds.indexOf(peerId) !== -1;\n } else {\n isPinned = !!this.getDialogOnly(peerId).pFlags.pinned;\n }\n\n return isPinned;\n }\n\n public getOffsetDate(folderId: number): number {\n const offsetDate = this.dialogsOffsetDate[folderId] || 0;\n if(folderId === GLOBAL_FOLDER_ID && !offsetDate) { // make request not from beginning if we have loaded some dialogs\n return Math.min(...Array.from(REAL_FOLDERS).sort((a, b) => a - b));\n }\n\n return offsetDate;\n }\n\n private generateFolder(id: number) {\n const folder: Folder = {\n dialogs: [],\n id,\n unreadMessagesCount: 0,\n unreadPeerIds: new Set(),\n unreadUnmutedPeerIds: new Set()\n };\n\n defineNotNumerableProperties(folder, ['dispatchUnreadTimeout']);\n\n return folder;\n }\n\n public getFolder(id: number) {\n return this.folders[id] ??= this.generateFolder(id);\n }\n\n public isFilterIdForForum(filterId: number) {\n return filterId && filterId < 0;\n }\n\n public getFilterIdForForum(forumTopic: ForumTopic) {\n return forumTopic.peerId;\n }\n\n public getDialogKey(dialog: Dialog | ForumTopic) {\n return this.isTopic(dialog) ? dialog.id : dialog.peerId;\n }\n\n public getFolderDialogs(id: number, skipMigrated = true): Folder['dialogs'] {\n if(id === GLOBAL_FOLDER_ID) { // * it won't be sorted\n return this.getCachedDialogs(skipMigrated);\n }\n\n const folder = this.getFolder(id);\n if(this.isFilterIdForForum(id)) {\n return skipMigrated ? folder.dialogs.filter((forumTopic) => !(forumTopic as ForumTopic).pFlags.hidden) : folder.dialogs;\n }\n\n return skipMigrated ? folder.dialogs.filter((dialog) => (dialog as Dialog).migratedTo === undefined) : folder.dialogs;\n }\n\n public getNextDialog(currentPeerId: PeerId, next: boolean, filterId: number) {\n const folder = this.getFolderDialogs(filterId, true);\n let dialog: Folder['dialogs'][0];\n if(!currentPeerId) {\n if(next) {\n dialog = folder[0];\n }\n } else {\n const idx = folder.findIndex((dialog) => dialog.peerId === currentPeerId);\n if(idx !== -1) {\n const nextIndex = next ? idx + 1 : idx - 1;\n dialog = folder[nextIndex];\n }\n }\n\n return dialog;\n }\n\n public getDialogIndexKeyByFilterId(filterId: number) {\n if(this.isFilterIdForForum(filterId)) return getDialogIndexKey();\n if(REAL_FOLDERS.has(filterId)) return getDialogIndexKey(filterId as REAL_FOLDER_ID);\n const filter = this.filtersStorage.getFilter(filterId);\n return getDialogIndexKey(filter.localId);\n }\n\n private isDialogUnmuted(dialog: Dialog | ForumTopic) {\n return !this.appNotificationsManager.isPeerLocalMuted({\n peerId: dialog.peerId,\n respectType: true,\n threadId: this.isTopic(dialog) ? (dialog as ForumTopic).id : undefined\n });\n }\n\n public getFolderUnreadCount(filterId: number) {\n const folder = this.getFolder(filterId);\n return {unreadUnmutedCount: folder.unreadUnmutedPeerIds.size, unreadCount: folder.unreadPeerIds.size};\n }\n\n public getCachedDialogs(skipMigrated?: boolean) {\n const arrays = Array.from(REAL_FOLDERS).map((folderId) => this.getFolderDialogs(folderId, skipMigrated));\n return [].concat(...arrays) as Dialog[];\n }\n\n private setDialogIndexInFilter(\n dialog: Dialog | ForumTopic,\n indexKey: ReturnType,\n filter?: MyDialogFilter\n ) {\n // if(this.isTopic(dialog)) {\n // return dialog['index_0'];\n // }\n\n let index: number;\n\n const isTopic = this.isTopic(dialog);\n const isRealFolder = isTopic || REAL_FOLDERS.has(filter.id);\n /* if(isRealFolder) {\n // index = getDialogIndex(dialog, indexKey);\n index = this.generateIndexForDialog(dialog, true);\n } else */if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n const pinnedIds = isTopic ?\n this.getPinnedOrders(this.getFilterIdForForum(dialog)) :\n filter.pinnedPeerIds;\n\n const pinnedKey = this.getDialogKey(dialog);\n const pinnedIndex = pinnedIds.indexOf(pinnedKey);\n\n if(pinnedIndex !== -1) {\n index = this.generateDialogIndex(this.generateDialogPinnedDateByIndex(pinnedIds.length - 1 - pinnedIndex), true);\n } else if(dialog.pFlags?.pinned || isRealFolder) {\n index = this.generateIndexForDialog(dialog, true, undefined, !isRealFolder);\n } else {\n index = getDialogIndex(dialog) ?? this.generateIndexForDialog(dialog, true);\n }\n }\n\n // if(!dialog.hasOwnProperty(indexKey)) {\n // defineNotNumerableProperties(dialog, [indexKey]);\n // }\n\n return setDialogIndex(dialog, indexKey, index);\n }\n\n public getDialog(peerId: PeerId, folderId?: number, topicId?: number, skipMigrated = true): [Folder['dialogs'][0], number] | [] {\n const folders: Folder['dialogs'][] = [];\n\n if(topicId) {\n folderId = peerId;\n // skipMigrated = false;\n }\n\n if(folderId === undefined) {\n folders.push(...Array.from(REAL_FOLDERS).map((folderId) => this.getFolder(folderId).dialogs as Dialog[]));\n } else {\n folders.push(this.getFolderDialogs(folderId, false) as Dialog[]);\n }\n\n const verify: (d: Folder['dialogs'][0]) => boolean = topicId ?\n (d) => (d as ForumTopic).id === topicId :\n (d) => (d as Dialog).peerId === peerId;\n for(const folder of folders) {\n let i = 0, skipped = 0;\n for(let length = folder.length; i < length; ++i) {\n const dialog = folder[i];\n if(verify(dialog)) {\n return [dialog, i - skipped];\n } else if(skipMigrated && ((dialog as ForumTopic).pFlags.hidden || (dialog as Dialog).migratedTo !== undefined)) {\n ++skipped;\n }\n }\n }\n\n return [];\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogs[peerId];\n }\n\n public getDialogOrTopic(peerId: PeerId, topicId?: number) {\n return topicId ? this.getForumTopic(peerId, topicId) : this.dialogs[peerId];\n }\n\n public getDialogIndex(\n peerId: PeerId | Parameters[0],\n indexKey: ReturnType,\n topicId?: number\n ) {\n const dialog = isObject(peerId) ? peerId : this.getDialogOrTopic(peerId, topicId);\n return getDialogIndex(dialog, indexKey);\n }\n\n /*\n var date = Date.now() / 1000 | 0;\n var m = date * 0x10000;\n\n var k = (date + 1) * 0x10000;\n k - m;\n 65536\n */\n public generateDialogIndex(date?: number, isPinned?: boolean) {\n date ??= tsNow(true) + this.timeManager.getServerTimeOffset();\n return (date * 0x10000) + (isPinned ? 0 : (++this.dialogsNum & 0xFFFF));\n }\n\n // public makeFilterForTopics(id: number): MyDialogFilter {\n // return {\n // _: 'dialogFilter',\n // id,\n\n // };\n // }\n\n public isTopic(dialog: Dialog | ForumTopic): dialog is ForumTopic {\n return 'id' in dialog;\n }\n\n public processDialogForFilters(dialog: Dialog | ForumTopic, noIndex?: boolean) {\n // let perf = performance.now();\n if(this.isTopic(dialog)) {\n this.processDialogForFilter(dialog, undefined, noIndex);\n return;\n }\n\n const filters = this.filtersStorage.getFilters();\n for(const id in filters) {\n const filter = filters[id];\n this.processDialogForFilter(dialog, filter, noIndex);\n }\n // spentTime += (performance.now() - perf);\n // console.log('generate index time:', spentTime);\n }\n\n public processDialogForFilter(\n dialog: Dialog | ForumTopic,\n filter?: MyDialogFilter,\n noIndex?: boolean\n ) {\n const isTopic = this.isTopic(dialog);\n const folderId = isTopic ? this.getFilterIdForForum(dialog) : filter.id;\n\n const indexKey = isTopic ? 'index_0' : this.getDialogIndexKeyByFilterId(folderId);\n const folder = this.getFolder(folderId);\n const dialogs = folder.dialogs;\n\n const cmp: (d: typeof dialog) => boolean = isTopic ?\n ((d: ForumTopic) => d.id === dialog.id) as any :\n ((d: Dialog) => d.peerId === dialog.peerId) as any;\n const wasIndex = dialogs.findIndex(cmp);\n const wasDialog = dialogs[wasIndex];\n const wasDialogIndex = this.getDialogIndex(wasDialog, indexKey);\n\n if(noIndex && folderId > FOLDER_ID_ARCHIVE) {\n noIndex = undefined;\n }\n\n const newDialogIndex = noIndex ? undefined : this.setDialogIndexInFilter(dialog, indexKey, filter);\n\n if(wasDialogIndex === newDialogIndex) {\n return false;\n }\n\n if(!!wasDialogIndex !== !!newDialogIndex) {\n this.prepareFolderUnreadCountModifyingByDialog(folderId, dialog, !!newDialogIndex);\n }\n\n if(wasIndex !== -1) {\n dialogs.splice(wasIndex, 1);\n }\n\n if(newDialogIndex) {\n insertInDescendSortedArray(dialogs, dialog, (dialog) => this.getDialogIndex(dialog, indexKey), -1);\n }\n\n return true;\n }\n\n public prepareDialogUnreadCountModifying(dialog: Dialog | ForumTopic, toggle?: boolean) {\n const isTopic = this.isTopic(dialog);\n const callbacks: NoneToVoidFunction[] = [];\n\n const folderId = isTopic ? this.getFilterIdForForum(dialog) : dialog.folder_id;\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(folderId, dialog, toggle));\n\n if(!isTopic) {\n const filters = this.filtersStorage.getFilters();\n for(const id in filters) {\n const filter = filters[id];\n if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog, toggle));\n }\n }\n }\n\n return () => !toggle && callbacks.forEach((callback) => callback());\n }\n\n public prepareFolderUnreadCountModifyingByDialog(folderId: number, dialog: Dialog | ForumTopic, toggle?: boolean) {\n const wasUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const wasUnmuted = this.isDialogUnmuted(dialog);\n\n if(toggle !== undefined) {\n const addMessagesCount = toggle ? wasUnreadCount : -wasUnreadCount;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, !!wasUnreadCount, wasUnreadCount && wasUnmuted, dialog);\n return;\n }\n\n return () => {\n const newUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const newUnmuted = this.isDialogUnmuted(dialog);\n\n const addMessagesCount = newUnreadCount - wasUnreadCount;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, !!newUnreadCount, newUnreadCount && newUnmuted, dialog);\n };\n }\n\n public modifyFolderUnreadCount(\n folderId: number,\n addMessagesCount: number,\n toggleDialog: boolean,\n toggleUnmuted: boolean,\n dialog: Dialog | ForumTopic\n ) {\n const {peerId} = dialog;\n const isForum = this.appPeersManager.isForum(peerId);\n const isTopic = this.isTopic(dialog);\n if(isForum && !isTopic) {\n const forumUnreadCount = this.getForumUnreadCount(peerId);\n if(forumUnreadCount instanceof Promise) {\n forumUnreadCount.then(({count, hasUnmuted}) => {\n dialog = this.getDialogOnly(peerId);\n const folder = this.getFolder(folderId);\n if(\n !dialog ||\n !this.appPeersManager.isForum(peerId) ||\n !folder ||\n !folder.dialogs.some((dialog) => dialog.peerId === peerId)\n ) {\n return;\n }\n\n this.modifyFolderUnreadCount(folderId, 0, false, false, dialog);\n });\n\n return;\n } else {\n addMessagesCount = 0;\n toggleDialog = forumUnreadCount.count > 0;\n toggleUnmuted = forumUnreadCount.hasUnmuted;\n }\n }\n\n const folder = this.getFolder(folderId);\n if(addMessagesCount) {\n folder.unreadMessagesCount = Math.max(0, folder.unreadMessagesCount + addMessagesCount);\n }\n\n const key = this.getDialogKey(dialog);\n if(toggleDialog) {\n folder.unreadPeerIds.add(key);\n } else {\n folder.unreadPeerIds.delete(key);\n }\n\n if(toggleUnmuted) {\n folder.unreadUnmutedPeerIds.add(key);\n } else {\n folder.unreadUnmutedPeerIds.delete(key);\n }\n\n folder.dispatchUnreadTimeout ??= ctx.setTimeout(() => {\n folder.dispatchUnreadTimeout = undefined;\n const _folder = {...folder};\n delete _folder.dialogs;\n this.rootScope.dispatchEvent('folder_unread', _folder);\n\n if(isTopic) { // * refresh forum dialog unread count\n this.processChangedUnreadOrUnmuted(peerId);\n }\n }, 0);\n }\n\n public processChangedUnreadOrUnmuted(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n this.processDialogForFilters(dialog);\n this.prepareDialogUnreadCountModifying(dialog)();\n this.rootScope.dispatchEvent('dialog_unread', {\n peerId,\n dialog\n });\n }\n }\n\n public generateIndexForDialog(\n dialog: Dialog | ForumTopic,\n justReturn?: boolean,\n message?: MyMessage,\n noPinnedOrderUpdate?: boolean\n ) {\n if(!justReturn/* && !isTopic */) {\n return;\n }\n\n const isTopic = this.isTopic(dialog);\n let topDate = 0, isPinned: boolean;\n if((dialog as ForumTopic).pFlags.hidden) { // general topic must be first\n topDate = this.generateDialogPinnedDateByIndex(0xFFF);\n isPinned = true;\n } else if(dialog.pFlags.pinned && !noPinnedOrderUpdate) {\n topDate = this.generateDialogPinnedDate(dialog);\n isPinned = true;\n } else {\n message ||= this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n\n topDate = (message as Message.message)?.date || topDate;\n\n if(!isTopic) {\n const channelId = this.appPeersManager.isChannel(dialog.peerId) && dialog.peerId.toChatId();\n if(channelId) {\n const channel = this.appChatsManager.getChat(channelId) as Chat.channel;\n if(!topDate || (channel.date && channel.date > topDate)) {\n topDate = channel.date;\n }\n }\n }\n\n if(dialog.draft?._ === 'draftMessage' && dialog.draft.date > topDate) {\n topDate = dialog.draft.date;\n }\n }\n\n topDate ||= tsNow(true);\n\n const index = this.generateDialogIndex(topDate, isPinned);\n if(justReturn) {\n return index;\n }\n\n const indexKey = getDialogIndexKey((dialog as Dialog).folder_id);\n setDialogIndex(dialog, indexKey, index);\n }\n\n public generateDialogPinnedDateByIndex(pinnedIndex: number) {\n return 0x7fff0000 + (pinnedIndex & 0xFFFF); // 0xFFFF - потому что в папках может быть бесконечное число пиннедов\n }\n\n public generateDialogPinnedDate(dialog: Dialog | ForumTopic) {\n const isTopic = this.isTopic(dialog);\n const order = this.getPinnedOrders(isTopic ? this.getFilterIdForForum(dialog) : dialog.folder_id);\n\n const dialogKey = this.getDialogKey(dialog);\n let pinnedIndex = order.indexOf(dialogKey);\n if(pinnedIndex === -1) {\n order.unshift(dialogKey);\n pinnedIndex = 0;\n\n if(!isTopic) {\n this.savePinnedOrders();\n }\n }\n\n return this.generateDialogPinnedDateByIndex(order.length - 1 - pinnedIndex);\n }\n\n /* public generateDialog(peerId: PeerId) {\n const dialog: Dialog = {\n _: 'dialog',\n pFlags: {},\n peer: this.appPeersManager.getOutputPeer(peerId),\n top_message: 0,\n read_inbox_max_id: 0,\n read_outbox_max_id: 0,\n unread_count: 0,\n unread_mentions_count: 0,\n notify_settings: {\n _: 'peerNotifySettings',\n },\n };\n\n return dialog;\n } */\n\n public setDialogToState(dialog: Dialog | ForumTopic) {\n if(this.isTopic(dialog)) {\n return;\n }\n\n const {peerId, pts} = dialog;\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const messagesStorage = this.appMessagesManager.getHistoryMessagesStorage(peerId);\n const history = historyStorage.history.slice;\n let incomingMessage: MyMessage;\n for(let i = 0, length = history.length; i < length; ++i) {\n const mid = history[i];\n const message: MyMessage = this.appMessagesManager.getMessageFromStorage(messagesStorage, mid);\n if(message && !message.pFlags.is_outgoing/* || peerId === SERVICE_PEER_ID */) {\n incomingMessage = message;\n\n const peerIds = getPeerIdsFromMessage(message);\n this.peersStorage.requestPeersForKey(peerIds, `topMessage_${peerId}`);\n\n break;\n }\n }\n\n dialog.topMessage = incomingMessage;\n\n // DO NOT TOUCH THESE LINES, SOME REAL MAGIC HERE.\n // * Read service chat when refreshing page with outgoing & getting new service outgoing message\n /* if(incomingMessage && dialog.read_inbox_max_id >= dialog.top_message) {\n dialog.unread_count = 0;\n }\n\n dialog.read_inbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_outbox_max_id); */\n // CAN TOUCH NOW\n\n if(peerId.isAnyChat() && pts) {\n const newPts = this.apiUpdatesManager.getChannelState(peerId.toChatId(), pts).pts;\n dialog.pts = newPts;\n }\n\n this.storage.set({\n [peerId]: dialog\n });\n\n this.peersStorage.requestPeer(peerId, 'dialog');\n\n /* for(let id in this.filtersStorage.filters) {\n const filter = this.filtersStorage.filters[id];\n\n if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n\n }\n } */\n }\n\n public pushDialog({dialog, offsetDate, ignoreOffsetDate, saveGlobalOffset}: {\n dialog: Dialog | ForumTopic,\n offsetDate?: number,\n ignoreOffsetDate?: boolean,\n saveGlobalOffset?: boolean\n }) {\n const isTopic = this.isTopic(dialog);\n const {folder_id, peerId} = dialog as Dialog;\n\n if(isTopic) {\n const forumTopics = this.getForumTopicsCache(peerId);\n forumTopics.topics.set(dialog.id, dialog);\n } else {\n this.dialogs[peerId] = dialog;\n }\n\n offsetDate ??= this.getDialogOffsetDate(dialog);\n\n // if(!isTopic) {\n this.processDialogForFilters(dialog);\n // }\n\n if(offsetDate && !dialog.pFlags.pinned) {\n if(!isTopic && saveGlobalOffset) {\n const savedGlobalOffsetDate = this.dialogsOffsetDate[GLOBAL_FOLDER_ID];\n if(!savedGlobalOffsetDate || offsetDate < savedGlobalOffsetDate) {\n this.dialogsOffsetDate[GLOBAL_FOLDER_ID] = offsetDate;\n }\n }\n\n const folderId = isTopic ? this.getFilterIdForForum(dialog) : folder_id;\n const savedOffsetDate = this.dialogsOffsetDate[folderId];\n if(!savedOffsetDate || offsetDate < savedOffsetDate) {\n // if(pos !== -1) {\n if(!ignoreOffsetDate && !this.isDialogsLoaded(folderId)) {\n this.dropDialog(peerId, isTopic ? this.getDialogKey(dialog) : undefined, true);\n return;\n }\n\n this.dialogsOffsetDate[folderId] = offsetDate;\n }\n }\n\n this.setDialogToState(dialog);\n\n // if(pos === -1) {\n // this.prepareFolderUnreadCountModifyingByDialog(folder_id, dialog, true);\n // }\n\n // const indexKey = getDialogIndexKey(folder_id);\n // /* const newPos = */insertInDescendSortedArray(dialogs, dialog, (dialog) => getDialogIndex(dialog, indexKey), -1);\n /* if(pos !== -1 && pos !== newPos) {\n rootScope.dispatchEvent('dialog_order', {dialog, pos: newPos});\n } */\n }\n\n public dropDialogFromFolders(peerId: PeerId, topicId?: number) {\n const foundDialog = this.getDialog(peerId, undefined, topicId, false);\n const [dialog, index] = foundDialog;\n if(dialog) {\n const filterId = topicId ?\n this.getFilterIdForForum(dialog as ForumTopic) :\n (dialog as Dialog).folder_id;\n\n // const folder = this.getFolder(filterId);\n // folder.dialogs.splice(index, 1);\n const wasPinned = indexOfAndSplice(this.getPinnedOrders(filterId), this.getDialogKey(dialog)) !== undefined;\n\n this.processDialogForFilters(dialog, true);\n\n this.dialogsIndex.indexObject(peerId, '');\n\n if(wasPinned) {\n this.savePinnedOrders();\n }\n }\n\n return foundDialog;\n }\n\n public dropDialog(peerId: PeerId, topicId?: number, keepLocal?: boolean) {\n const dialog = this.getDialogOrTopic(peerId, topicId);\n const foundDialog = this.dropDialogFromFolders(peerId, topicId);\n if(dialog) {\n if(!keepLocal) {\n if(topicId) {\n this.getForumTopicsCache(peerId).topics.delete(topicId);\n } else {\n delete this.dialogs[peerId];\n }\n }\n\n this.clearDialogFromState(dialog, keepLocal);\n }\n\n return foundDialog;\n }\n\n public clearDialogFromState(dialog: Dialog | ForumTopic, keepLocal: boolean) {\n if(dialog._ === 'forumTopic') {\n return;\n }\n\n const {peerId} = dialog;\n this.peersStorage.requestPeersForKey([], `topMessage_${peerId}`);\n this.peersStorage.releasePeer(peerId, 'dialog');\n this.storage.delete(peerId, keepLocal);\n }\n\n public dropDialogWithEvent(peerId: PeerId, topicId?: number) {\n const dropped = this.dropDialog(peerId, topicId);\n if(dropped.length) {\n this.rootScope.dispatchEvent('dialog_drop', dropped[0]);\n }\n\n return dropped;\n }\n\n /**\n * leaving chat, leaving channel, deleting private dialog\n */\n public dropDialogOnDeletion(peerId: PeerId, topicId?: number) {\n this.dropDialogWithEvent(peerId, topicId);\n this.rootScope.dispatchEvent('peer_deleted', peerId);\n }\n\n public applyDialogs(result: MessagesPeerDialogs | MessagesForumTopics, peerId?: PeerId) {\n // * В эту функцию попадут только те диалоги, в которых есть read_inbox_max_id и read_outbox_max_id, в отличие от тех, что будут в getTopMessages\n\n const isForum = result._ === 'messages.forumTopics';\n const items = (result as MessagesPeerDialogs).dialogs || (result as MessagesForumTopics).topics;\n if(!isForum) {\n // ! fix 'dialogFolder', maybe there is better way to do it, this only can happen by 'messages.getPinnedDialogs' by folder_id: 0\n forEachReverse(result.dialogs, (dialog, idx) => {\n if(dialog._ === 'dialogFolder') {\n result.dialogs.splice(idx, 1);\n }\n });\n } else {\n this.processTopics(peerId, result);\n }\n\n assumeType(items);\n\n this.appUsersManager.saveApiUsers(result.users);\n this.appChatsManager.saveApiChats(result.chats);\n this.appMessagesManager.saveMessages(result.messages);\n\n // this.appMessagesManager.log('applyConversation', dialogsResult);\n\n const updatedDialogs: BroadcastEvents['dialogs_multiupdate'] = new Map();\n const getUpdateCache = (peerId: PeerId) => {\n let cache = updatedDialogs.get(peerId);\n if(!cache) {\n updatedDialogs.set(peerId, cache = {});\n }\n\n return cache;\n };\n\n items.forEach((dialog) => {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n let topMid = dialog.top_message;\n\n const topPendingMid = this.appMessagesManager.pendingTopMsgs[peerId];\n if(topPendingMid) {\n const topPendingMessage = this.appMessagesManager.getMessageByPeer(peerId, topPendingMid) as MyMessage;\n const topMessage = this.appMessagesManager.getMessageByPeer(peerId, topMid) as MyMessage;\n if(!topMid || (topPendingMessage && (!topMessage || topPendingMessage?.date > topMessage?.date))) {\n dialog.top_message = topMid = topPendingMid;\n this.appMessagesManager.getHistoryStorage(peerId).maxId = topPendingMid;\n }\n }\n\n /* const d = Object.assign({}, dialog);\n if(peerId === 239602833) {\n this.log.error('applyConversation lun', dialog, d);\n } */\n\n if(topMid || dialog.draft?._ === 'draftMessage') {\n if(this.saveDialog({dialog})) {\n const cache = getUpdateCache(peerId);\n\n if(isForum) {\n (cache.topics ??= new Map()).set(\n (dialog as ForumTopic).id,\n dialog as ForumTopic\n );\n } else {\n cache.dialog = dialog as Dialog;\n }\n }\n } else {\n this.dropDialogWithEvent(peerId, isForum ? this.getDialogKey(dialog) : undefined);\n }\n\n const key = this.appMessagesManager.getUpdateAfterReloadKey(peerId, isForum ? this.getDialogKey(dialog) : undefined);\n const updates = this.appMessagesManager.newUpdatesAfterReloadToHandle[key];\n if(updates !== undefined) {\n for(const update of updates) {\n updates.delete(update);\n this.apiUpdatesManager.saveUpdate(update);\n }\n\n if(!updates.size) {\n delete this.appMessagesManager.newUpdatesAfterReloadToHandle[key];\n }\n }\n });\n\n if(updatedDialogs.size) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n }\n }\n\n private getDialogOffsetDate(dialog: Dialog | ForumTopic) {\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n return message?.date || 0;\n }\n\n public canSaveDialogByPeerId(peerId: PeerId) {\n if(peerId.isAnyChat()) {\n const chat: Chat = this.appChatsManager.getChat(peerId.toChatId());\n // ! chatForbidden stays for chat where you're kicked\n if(\n chat._ === 'channelForbidden' ||\n // || chat._ === 'chatForbidden'\n (chat as Chat.chat).pFlags.left\n // || (chat as any).pFlags.kicked\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Won't save migrated from peer, forbidden peers, left and kicked\n */\n public saveDialog({\n dialog,\n folderId,\n ignoreOffsetDate,\n saveGlobalOffset\n }: {\n dialog: Dialog | ForumTopic,\n folderId?: REAL_FOLDER_ID,\n ignoreOffsetDate?: boolean,\n saveGlobalOffset?: boolean\n }) {\n const isTopic = this.isTopic(dialog);\n const isDialog = !isTopic;\n\n const topicId = isTopic ? dialog.id = generateMessageId(dialog.id) : undefined;\n if(!isTopic) {\n folderId ??= dialog.folder_id ?? FOLDER_ID_ALL;\n }\n\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n if(!peerId) {\n console.error('saveConversation no peerId???', dialog, folderId);\n return false;\n }\n\n if(!isTopic && dialog._ !== 'dialog'/* || peerId === 239602833 */) {\n console.error('saveConversation not regular dialog', dialog, Object.assign({}, dialog));\n }\n\n if(isDialog && !this.canSaveDialogByPeerId(peerId)) {\n return false;\n }\n\n const channelId = this.appPeersManager.isChannel(peerId) ? peerId.toChatId() : NULL_PEER_ID;\n\n if(isDialog) {\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n\n const wasDialogBefore = this.getDialogOrTopic(peerId, topicId);\n\n let mid: number, message: MyMessage;\n if(dialog.top_message) {\n mid = generateMessageId(dialog.top_message);// dialog.top_message;\n\n // preserve outgoing message\n const wasTopMessage = wasDialogBefore?.top_message && this.appMessagesManager.getMessageByPeer(peerId, wasDialogBefore.top_message) as MyMessage;\n if(wasTopMessage?.pFlags?.is_outgoing && wasDialogBefore.top_message >= mid) {\n mid = wasDialogBefore.top_message;\n }\n\n message = this.appMessagesManager.getMessageByPeer(peerId, mid);\n } else {\n mid = this.appMessagesManager.generateTempMessageId(peerId);\n message = {\n _: 'message',\n id: mid,\n mid,\n from_id: this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(false)),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n deleted: true,\n pFlags: {out: true},\n date: 0,\n message: ''\n };\n this.appMessagesManager.saveMessages([message], {isOutgoing: true});\n }\n\n if(!message?.pFlags) {\n this.appMessagesManager.log.error('saveConversation no message:', dialog, message);\n }\n\n if(isDialog && !channelId && peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\n const migratedToPeer = this.appPeersManager.getPeerId(chat.migrated_to);\n this.appMessagesManager.migratedFromTo[peerId] = migratedToPeer;\n this.appMessagesManager.migratedToFrom[migratedToPeer] = peerId;\n dialog.migratedTo = migratedToPeer;\n // return;\n }\n }\n\n dialog.top_message = mid;\n // dialog.unread_count = wasDialogBefore && dialog.read_inbox_max_id === getServerMessageId(wasDialogBefore.read_inbox_max_id) ? wasDialogBefore.unread_count : dialog.unread_count;\n dialog.read_inbox_max_id = generateMessageId(wasDialogBefore && !dialog.read_inbox_max_id ? wasDialogBefore.read_inbox_max_id : dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = generateMessageId(wasDialogBefore && !dialog.read_outbox_max_id ? wasDialogBefore.read_outbox_max_id : dialog.read_outbox_max_id);\n\n if(isDialog && dialog.folder_id === undefined) {\n if(dialog._ === 'dialog') {\n // ! СЛОЖНО ! СМОТРИ В getTopMessages\n dialog.folder_id = wasDialogBefore ? (wasDialogBefore as typeof dialog).folder_id : folderId;\n }/* else if(dialog._ === 'dialogFolder') {\n dialog.folder_id = dialog.folder.id;\n } */\n }\n\n dialog.draft = this.appDraftsManager.saveDraft({peerId, threadId: topicId, draft: dialog.draft});\n dialog.peerId = peerId;\n // dialog.indexes ??= {} as any;\n\n // Because we saved message without dialog present\n if(message && message.pFlags.is_outgoing) {\n const isOut = message.pFlags.out;\n if(mid > dialog[isOut ? 'read_outbox_max_id' : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n\n if(!dialog.unread_count && !isOut) {\n ++dialog.unread_count;\n }\n } else {\n delete message.pFlags.unread;\n }\n }\n\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId, topicId);\n const slice = historyStorage.history.slice;\n /* if(historyStorage === undefined) { // warning\n historyStorage.history.push(mid);\n } else */if(!slice.length) {\n historyStorage.history.unshift(mid);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n } else if(!slice.isEnd(SliceEnd.Bottom)) { // * this will probably never happen, however, if it does, then it will fix slice with top_message\n const slice = historyStorage.history.insertSlice([mid]);\n slice.setEnd(SliceEnd.Bottom);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n historyStorage.maxId = mid;\n historyStorage.readMaxId = dialog.read_inbox_max_id;\n historyStorage.readOutboxMaxId = dialog.read_outbox_max_id;\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n threadId: isTopic ? dialog.id : undefined,\n settings: dialog.notify_settings\n });\n\n if(isDialog && channelId && dialog.pts) {\n this.apiUpdatesManager.addChannelState(channelId, dialog.pts);\n }\n\n this.generateIndexForDialog(dialog);\n\n if(wasDialogBefore) {\n // fix unread count\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(wasDialogBefore);\n safeReplaceObject(wasDialogBefore, dialog);\n releaseUnreadCount();\n }\n\n this.pushDialog({\n dialog,\n offsetDate: message?.date,\n ignoreOffsetDate,\n saveGlobalOffset\n });\n\n if(isTopic) {\n this.processTopicUpdate(dialog, wasDialogBefore as ForumTopic);\n }\n\n return true;\n }\n\n public processTopicUpdate(topic: ForumTopic, oldTopic?: ForumTopic) {\n if(!oldTopic) {\n return;\n }\n\n const {peerId, id: threadId} = topic;\n const isIconChanged = topic.icon_emoji_id !== (oldTopic as ForumTopic).icon_emoji_id;\n const isTitleChanged = topic.title !== (oldTopic as ForumTopic).title;\n const isChanged = isIconChanged || isTitleChanged;\n\n if(isIconChanged) {\n this.rootScope.dispatchEvent('avatar_update', {peerId, threadId});\n }\n\n if(isChanged) {\n this.rootScope.dispatchEvent('peer_title_edit', {peerId, threadId});\n }\n }\n\n public getDialogs(options: {\n query?: string,\n offsetIndex?: number,\n limit?: number,\n filterId?: number,\n skipMigrated?: boolean\n }): MaybePromise<{\n dialogs: Folder['dialogs'],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }> {\n const {\n query = '',\n offsetIndex,\n limit = 20,\n filterId = FOLDER_ID_ALL,\n skipMigrated = false\n } = options;\n\n const isForum = this.isFilterIdForForum(filterId);\n if(!isForum && !REAL_FOLDERS.has(filterId)) {\n const promises: Promise[] = [];\n\n const fillContactsResult = this.appUsersManager.fillContacts();\n if(!fillContactsResult.cached) {\n promises.push(fillContactsResult.promise);\n }\n\n const reloadMissingDialogsPromise = this.filtersStorage.reloadMissingPeerIds(filterId);\n if(reloadMissingDialogsPromise) {\n promises.push(reloadMissingDialogsPromise);\n }\n\n if(promises.length) {\n return Promise.all(promises).then(() => {\n return this.getDialogs(options);\n });\n }\n }\n\n // let's load only first pages by certain folderId. next pages will load without folder filtering\n const realFolderId/* : REAL_FOLDER_ID */ =\n (!REAL_FOLDERS.has(filterId) || this.getOffsetDate(filterId)) && !isForum ?\n GLOBAL_FOLDER_ID :\n filterId/* as REAL_FOLDER_ID */;\n let curDialogStorage = this.getFolderDialogs(filterId, skipMigrated);\n\n const indexKey = this.getDialogIndexKeyByFilterId(filterId);\n\n if(query && !isForum) {\n if(!limit || this.cachedResults.query !== query || this.cachedResults.folderId !== filterId) {\n this.cachedResults.query = query;\n this.cachedResults.folderId = filterId;\n\n const results = this.dialogsIndex.search(query);\n\n const dialogs: Dialog[] = [];\n for(const peerId in this.dialogs) {\n const dialog = this.dialogs[peerId];\n if(results.has(dialog.peerId) && dialog.folder_id === filterId) {\n dialogs.push(dialog);\n }\n }\n\n dialogs.sort((d1, d2) => this.getDialogIndex(d2, indexKey) - this.getDialogIndex(d1, indexKey));\n this.cachedResults.dialogs = dialogs;\n this.cachedResults.count = dialogs.length;\n }\n\n curDialogStorage = this.cachedResults.dialogs;\n } else {\n this.cachedResults.query = '';\n }\n\n let offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > this.getDialogIndex(curDialogStorage[offset], indexKey)) {\n break;\n }\n }\n }\n\n const loadedAll = this.isDialogsLoaded(realFolderId);\n const isEnoughDialogs = curDialogStorage.length >= (offset + limit);\n if(query || loadedAll || isEnoughDialogs) {\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: loadedAll ? curDialogStorage.length : null,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || this.getDialogIndex(curDialogStorage[0], indexKey) < offsetIndex),\n isEnd: (query || loadedAll) && (offset + limit) >= curDialogStorage.length\n };\n }\n\n return this.appMessagesManager.getTopMessages({limit, folderId: realFolderId}).then((result) => {\n // const curDialogStorage = this[folderId];\n if(skipMigrated) {\n curDialogStorage = this.getFolderDialogs(filterId, skipMigrated);\n }\n\n offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > this.getDialogIndex(curDialogStorage[offset], indexKey)) {\n break;\n }\n }\n }\n\n // this.log.warn(offset, offset + limit, curDialogStorage.dialogs.length, this.dialogs.length);\n\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: result.count === undefined ? curDialogStorage.length : result.count,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || this.getDialogIndex(curDialogStorage[0], indexKey) < offsetIndex),\n // isEnd: this.isDialogsLoaded(realFolderId) && (offset + limit) >= curDialogStorage.length\n isEnd: result.isEnd\n };\n });\n }\n\n // * FORUMS SECTION\n\n public flushForumTopicsCache(peerId: PeerId) {\n const cache = this.forumTopics.get(peerId);\n if(!cache) {\n return;\n }\n\n const folder = this.folders[peerId];\n if(folder) {\n if(folder.dispatchUnreadTimeout) {\n clearTimeout(folder.dispatchUnreadTimeout);\n }\n\n delete this.allDialogsLoaded[peerId];\n delete this.pinnedOrders[peerId];\n delete this.dialogsOffsetDate[peerId];\n delete this.folders[peerId];\n }\n\n cache.topics.clear();\n\n // for permanent delete\n // this.forumTopics.delete(peerId);\n }\n\n public getForumTopicsCache(peerId: PeerId) {\n let forumTopics = this.forumTopics.get(peerId);\n if(!forumTopics) {\n forumTopics = {\n topics: new Map(),\n deletedTopics: new Set(),\n getTopicPromises: new Map()\n };\n\n this.forumTopics.set(peerId, forumTopics);\n }\n\n return forumTopics;\n }\n\n public getForumTopicById(peerId: PeerId, topicId?: number): Promise {\n if(!this.appPeersManager.isForum(peerId)) {\n return Promise.reject(makeError('CHANNEL_FORUM_MISSING'));\n }\n\n const cache = this.getForumTopicsCache(peerId);\n let promise: CancellablePromise;\n if(topicId) {\n promise = cache.getTopicPromises.get(topicId);\n if(promise) {\n return promise;\n }\n\n if(cache.deletedTopics.has(topicId)) {\n return Promise.resolve(undefined);\n }\n\n cache.getTopicPromises.set(topicId, promise = deferredPromise());\n }\n\n cache.getTopicsPromise ??= pause(0).then(() => {\n const promises: {[topicId: number]: typeof promise} = {};\n const ids: number[] = [];\n for(const [topicId, promise] of cache.getTopicPromises) {\n promises[topicId] = promise;\n ids.push(getServerMessageId(topicId));\n }\n\n cache.getTopicPromises.clear();\n\n const fullfillLeft = () => {\n for(const topicId in promises) {\n promises[topicId].resolve(undefined);\n cache.deletedTopics.add(+topicId);\n }\n };\n\n if(this.getForumTopicsCache(peerId) !== cache) {\n fullfillLeft();\n return;\n }\n\n return this.apiManager.invokeApi('channels.getForumTopicsByID', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n topics: ids\n }).then((messagesForumTopics) => {\n if(this.getForumTopicsCache(peerId) !== cache) {\n return;\n }\n\n this.applyDialogs(messagesForumTopics, peerId);\n\n messagesForumTopics.topics.forEach((forumTopic) => {\n if(forumTopic._ === 'forumTopic') {\n promises[forumTopic.id].resolve(forumTopic);\n delete promises[peerId];\n }\n });\n\n return messagesForumTopics;\n }, () => {}).then(() => {\n fullfillLeft();\n\n cache.getTopicsPromise = undefined;\n if(cache.getTopicPromises.size) {\n this.getForumTopicById(peerId);\n }\n });\n });\n\n return promise || cache.getTopicsPromise;\n }\n\n // public getForumTopicById(peerId: PeerId, topicId: number) {\n // return this.getForumTopicsByID(peerId, topicId).then((result) => result.topics[0]);\n // }\n\n public getForumTopic(peerId: PeerId, topicId: number) {\n const forumTopics = this.forumTopics.get(peerId);\n return forumTopics?.topics?.get(topicId);\n }\n\n public getForumTopicOrReload(peerId: PeerId, topicId: number) {\n const forumTopic = this.getForumTopic(peerId, topicId);\n if(forumTopic) {\n return forumTopic;\n }\n\n const cache = this.getForumTopicsCache(peerId);\n return cache?.deletedTopics?.has(topicId) ? undefined : this.getForumTopicById(peerId, topicId);\n }\n\n public processTopics>(peerId: PeerId, result: T) {\n return callbackify(result, (result) => {\n if('pts' in result) {\n this.apiUpdatesManager.addChannelState(peerId.toChatId(), result.pts);\n }\n\n const peer = this.appPeersManager.getOutputPeer(peerId);\n result.topics = result.topics.map((topic) => {\n if(topic._ === 'forumTopicDeleted') {\n return;\n }\n\n (topic as ForumTopic).peer = peer;\n topic.id = generateMessageId(topic.id);\n return topic;\n }).filter(Boolean);\n\n return result;\n });\n }\n\n public processTopicsPromise[1]>>(peerId: PeerId, promise: T): T {\n return promise.then((result) => {\n this.processTopics(peerId, result);\n return result;\n }) as any;\n }\n\n public getForumUnreadCount(peerId: PeerId) {\n if(!this.appPeersManager.isForum(peerId)) {\n return;\n }\n\n const folder = this.getFolder(peerId);\n\n const f = folder.dialogs.length >= 20 || this.isDialogsLoaded(peerId) ?\n folder.dialogs.slice(0, 20) :\n callbackify(this.getDialogs({filterId: peerId, limit: 20}), (result) => {\n return result.dialogs;\n });\n\n return callbackify(f, (dialogs) => {\n return {\n count: dialogs.reduce((acc, v) => acc + +!!v.unread_count, 0),\n hasUnmuted: dialogs.some((dialog) => dialog.unread_count && this.isDialogUnmuted(dialog))\n };\n });\n }\n\n // * FORUMS SECTION END\n\n private handleDialogTogglePinned(dialog: Dialog | ForumTopic, pinned: boolean, folderId: number) {\n if(dialog) {\n if(!pinned) {\n this.handleDialogUnpinning(dialog, folderId);\n } else { // means set\n dialog.pFlags.pinned = true;\n }\n\n this.generateIndexForDialog(dialog);\n }\n\n this.appMessagesManager.scheduleHandleNewDialogs(dialog.peerId, dialog);\n }\n\n private handleDialogsPinned(folderId: number, order: (Dialog['peerId'] | ForumTopic['id'])[]) {\n const isForum = this.isFilterIdForForum(folderId);\n this.resetPinnedOrder(folderId);\n this.getPinnedOrders(folderId).push(...order);\n this.savePinnedOrders();\n order.reverse(); // index must be higher\n const newPinned: {[id: typeof order[0]]: true} = {};\n order.forEach((id) => {\n newPinned[id] = true;\n\n const peerId = isForum ? folderId : id;\n const topicId = isForum ? id : undefined;\n\n const dialog = this.getDialogOrTopic(peerId, topicId);\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n if(!dialog) {\n return;\n }\n\n dialog.pFlags.pinned = true;\n this.generateIndexForDialog(dialog);\n });\n\n const dialogs = this.getFolderDialogs(folderId, false);\n for(const dialog of dialogs) {\n if(!dialog.pFlags.pinned) {\n break;\n }\n\n if(!newPinned[this.getDialogKey(dialog)]) {\n delete dialog.pFlags.pinned;\n this.generateIndexForDialog(dialog);\n this.appMessagesManager.scheduleHandleNewDialogs(dialog.peerId, dialog);\n }\n }\n }\n\n // only 0 and 1 folders\n private onUpdateFolderPeers = (update: Update.updateFolderPeers) => {\n // this.log('updateFolderPeers', update);\n const peers = update.folder_peers;\n\n peers.forEach((folderPeer) => {\n const {folder_id, peer} = folderPeer;\n\n const peerId = this.appPeersManager.getPeerId(peer);\n const dialog = this.dropDialog(peerId)[0];\n if(dialog) {\n if(dialog.pFlags?.pinned) {\n this.handleDialogUnpinning(dialog, folder_id);\n }\n\n (dialog as Dialog).folder_id = folder_id as REAL_FOLDER_ID;\n this.generateIndexForDialog(dialog);\n this.pushDialog({dialog}); // need for simultaneously updatePinnedDialogs\n }\n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n });\n };\n\n private onUpdateDialogPinned = (update: Update.updateDialogPinned) => {\n const folderId = update.folder_id ?? FOLDER_ID_ALL;\n // this.log('updateDialogPinned', update);\n const peerId = this.appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n // этот код внизу никогда не сработает, в папках за пиннед отвечает updateDialogFilter\n /* if(update.folder_id > 1) {\n const filter = this.filtersStorage.filters[update.folder_id];\n if(update.pFlags.pinned) {\n filter.pinned_peers.unshift(peerId);\n } else {\n filter.pinned_peers.findAndSplice((p) => p === peerId);\n }\n } */\n\n this.handleDialogTogglePinned(dialog, update.pFlags.pinned, folderId);\n };\n\n private onUpdateChannelPinnedTopic = (update: Update.updateChannelPinnedTopic) => {\n const peerId = update.channel_id.toPeerId(true);\n const topicId = generateMessageId(update.topic_id);\n const topic = this.getForumTopic(peerId, topicId);\n if(!topic) {\n return;\n }\n\n this.handleDialogTogglePinned(topic, update.pFlags.pinned, this.getFilterIdForForum(topic));\n };\n\n private onUpdatePinnedDialogs = (update: Update.updatePinnedDialogs) => {\n const folderId = update.folder_id ?? FOLDER_ID_ALL;\n\n if(update.order) {\n this.handleDialogsPinned(folderId, update.order.map((peer) => this.appPeersManager.getPeerId((peer as DialogPeer.dialogPeer).peer)));\n } else {\n this.apiManager.invokeApi('messages.getPinnedDialogs', {\n folder_id: folderId\n }).then((dialogsResult) => {\n // * for test reordering and rendering\n // dialogsResult.dialogs.reverse();\n\n this.applyDialogs(dialogsResult);\n\n this.handleDialogsPinned(folderId, dialogsResult.dialogs.map((d) => d.peerId));\n });\n }\n };\n\n private onUpdateChannelPinnedTopics = async(update: Update.updateChannelPinnedTopics) => {\n const peerId = update.channel_id.toPeerId(true);\n const forumTopics = this.forumTopics.get(peerId);\n if(!forumTopics) {\n return;\n }\n\n const filterId = peerId;\n if(update.order) {\n const order = update.order.map((topicId) => generateMessageId(topicId));\n this.handleDialogsPinned(filterId, order);\n } else {\n const limit = await this.apiManager.getLimit('topicPin', true);\n\n const promise = this.apiManager.invokeApi('channels.getForumTopics', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n limit,\n offset_date: 0,\n offset_id: 0,\n offset_topic: 0\n });\n\n const result = await this.processTopics(peerId, promise);\n\n const topics = result.topics as ForumTopic[];\n const pinned = topics.filter((topic) => topic.pFlags.pinned);\n this.handleDialogsPinned(filterId, pinned.map((topic) => topic.id));\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {DialogFilter, ForumTopic, Update} from '../../layer';\nimport type {Dialog} from '../appManagers/appMessagesManager';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport copy from '../../helpers/object/copy';\nimport {AppManager} from '../appManagers/manager';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport assumeType from '../../helpers/assumeType';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, REAL_FOLDERS, REAL_FOLDER_ID, START_LOCAL_ID} from '../mtproto/mtproto_config';\nimport makeError from '../../helpers/makeError';\n\nexport type MyDialogFilter = DialogFilter.dialogFilter;\n\nconst convertment = [\n ['pinned_peers', 'pinnedPeerIds'],\n ['exclude_peers', 'excludePeerIds'],\n ['include_peers', 'includePeerIds']\n] as ['pinned_peers' | 'exclude_peers' | 'include_peers', 'pinnedPeerIds' | 'excludePeerIds' | 'includePeerIds'][];\n\nconst PREPENDED_FILTERS = REAL_FOLDERS.size;\n\nconst LOCAL_FILTER: MyDialogFilter = {\n _: 'dialogFilter',\n pFlags: {},\n flags: 0,\n id: 0,\n title: '',\n exclude_peers: [],\n include_peers: [],\n pinned_peers: [],\n excludePeerIds: [],\n includePeerIds: [],\n pinnedPeerIds: []\n};\n\nexport default class FiltersStorage extends AppManager {\n private filters: {[filterId: string]: MyDialogFilter};\n private filtersArr: Array;\n private localFilters: {[filterId: string]: MyDialogFilter};\n private localId: number;\n private reloadedPeerIds: Set;\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateDialogFilter: this.onUpdateDialogFilter,\n\n updateDialogFilters: this.onUpdateDialogFilters,\n\n updateDialogFilterOrder: this.onUpdateDialogFilterOrder\n });\n\n // delete peers when dialog is being dropped\n /* rootScope.addEventListener('peer_deleted', (peerId) => {\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n let modified = false;\n [filter.pinned_peers, filter.include_peers, filter.exclude_peers].forEach((arr) => {\n forEachReverse(arr, (inputPeer, idx) => {\n if(getPeerId(inputPeer) === peerId) {\n arr.splice(idx, 1);\n modified = true;\n }\n });\n });\n\n if(modified) {\n this.saveDialogFilter(filter, true);\n }\n }\n }); */\n\n this.rootScope.addEventListener('premium_toggle', () => {\n this.onUpdateDialogFilters({_: 'updateDialogFilters'});\n });\n\n return this.appStateManager.getState().then((state) => {\n const filtersArr = this.prependFilters(state.filtersArr);\n filtersArr.map((filter) => {\n this.saveDialogFilter(filter, false, true);\n });\n });\n }\n\n /**\n * ! use it only with saving\n */\n private prependFilters(filters: DialogFilter[]) {\n filters = filters.slice();\n\n const allChatsFilter = this.localFilters[FOLDER_ID_ALL];\n const archiveFilter = this.localFilters[FOLDER_ID_ARCHIVE];\n\n const allChatsFilterIndex = filters.findIndex((filter) => filter._ === 'dialogFilterDefault' || filter.id === FOLDER_ID_ALL);\n if(allChatsFilterIndex !== -1) filters[allChatsFilterIndex] = allChatsFilter;\n else filters.unshift(allChatsFilter);\n\n findAndSplice(filters, (filter) => (filter as MyDialogFilter).id === FOLDER_ID_ARCHIVE);\n filters.splice(/* 1 */filters[0] === allChatsFilter ? 1 : 0, 0, archiveFilter);\n\n this.localId = START_LOCAL_ID;\n filters.forEach((filter) => {\n delete filter.localId;\n });\n\n return filters;\n }\n\n private generateLocalFilter(id: REAL_FOLDER_ID) {\n const filter: MyDialogFilter = {...copy(LOCAL_FILTER), id};\n if(id === FOLDER_ID_ALL) {\n filter.pFlags.exclude_archived = true;\n } else if(id === FOLDER_ID_ARCHIVE) {\n filter.pFlags.exclude_unarchived = true;\n }\n\n if(REAL_FOLDERS.has(id)) {\n filter.pinnedPeerIds = this.dialogsStorage.getPinnedOrders(id);\n }\n\n return filter;\n }\n\n // private getLocalFilter(id: number) {\n // return this.filters[id] ??= this.generateLocalFilter(id);\n // }\n\n public clear = (init?: boolean) => {\n if(!init) {\n // safeReplaceObject(this.filters, {});\n this.reloadedPeerIds.clear();\n this.clearFilters();\n } else {\n this.filters = {};\n this.filtersArr = [];\n this.reloadedPeerIds = new Set();\n\n this.localFilters = {};\n for(const filterId of REAL_FOLDERS) {\n this.localFilters[filterId] = this.generateLocalFilter(filterId as REAL_FOLDER_ID);\n }\n }\n\n this.localId = START_LOCAL_ID;\n };\n\n private onUpdateDialogFilter = (update: Update.updateDialogFilter) => {\n if(update.filter) {\n this.saveDialogFilter(update.filter as any);\n } else if(this.filters[update.id]) { // Папка удалена\n // this.getDialogFilters(true);\n this.rootScope.dispatchEvent('filter_delete', this.filters[update.id]);\n delete this.filters[update.id];\n findAndSplice(this.filtersArr, (filter) => (filter as DialogFilter.dialogFilter).id === update.id);\n }\n\n this.pushToState();\n };\n\n private onUpdateDialogFilters = (update: Update.updateDialogFilters) => {\n // console.warn('updateDialogFilters', update);\n\n const oldFilters = copy(this.filters);\n\n this.getDialogFilters(true).then((filters) => {\n for(const _filterId in oldFilters) {\n const filterId = +_filterId;\n if(!filters.find((filter) => filter.id === filterId)) { // * deleted\n this.onUpdateDialogFilter({_: 'updateDialogFilter', id: filterId});\n }\n }\n\n this.onUpdateDialogFilterOrder({_: 'updateDialogFilterOrder', order: filters.map((filter) => filter.id)});\n });\n };\n\n private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => {\n // console.log('updateDialogFilterOrder', update);\n\n const order = update.order.slice();\n if(!order.includes(FOLDER_ID_ARCHIVE)) {\n order.splice(order[0] === FOLDER_ID_ALL ? 1 : 0, 0, FOLDER_ID_ARCHIVE);\n }\n\n this.localId = START_LOCAL_ID;\n order.forEach((filterId) => {\n const filter = this.filters[filterId];\n delete filter.localId;\n this.setLocalId(filter);\n });\n\n this.rootScope.dispatchEvent('filter_order', order);\n\n this.pushToState();\n };\n\n private pushToState() {\n this.appStateManager.pushToState('filtersArr', this.filtersArr);\n }\n\n public testDialogForFilter(dialog: Dialog | ForumTopic.forumTopic, filter?: MyDialogFilter) {\n if(!filter) {\n return true;\n }\n\n if(REAL_FOLDERS.has(filter.id)) {\n return (dialog as Dialog).folder_id === filter.id && this.dialogsStorage.canSaveDialogByPeerId(dialog.peerId);\n }\n\n const peerId = dialog.peerId;\n\n // * check whether dialog exists\n if(!this.appMessagesManager.getDialogOnly(peerId)) {\n return false;\n }\n\n // exclude_peers\n if(filter.excludePeerIds.includes(peerId)) {\n return false;\n }\n\n // include_peers\n if(filter.includePeerIds.includes(peerId)) {\n return true;\n }\n\n const pFlags = filter.pFlags;\n\n // exclude_archived\n if(pFlags.exclude_archived && (dialog as Dialog).folder_id === FOLDER_ID_ARCHIVE) {\n return false;\n }\n\n // exclude_read\n if(pFlags.exclude_read && !this.appMessagesManager.isDialogUnread(dialog)) {\n return false;\n }\n\n // exclude_muted\n if(pFlags.exclude_muted && this.appNotificationsManager.isPeerLocalMuted({peerId}) && !(dialog.unread_mentions_count && dialog.unread_count)) {\n return false;\n }\n\n if(this.appPeersManager.isAnyChat(peerId)) {\n // broadcasts\n if(pFlags.broadcasts && this.appPeersManager.isBroadcast(peerId)) {\n return true;\n }\n\n // groups\n if(pFlags.groups && this.appPeersManager.isAnyGroup(peerId)) {\n return true;\n }\n } else {\n const userId = peerId.toUserId();\n\n // bots\n if(this.appUsersManager.isBot(userId)) {\n return !!pFlags.bots;\n }\n\n // non_contacts\n if(pFlags.non_contacts && !this.appUsersManager.isContact(userId)) {\n return true;\n }\n\n // contacts\n if(pFlags.contacts && this.appUsersManager.isContact(userId)) {\n return true;\n }\n }\n\n return false;\n }\n\n public testDialogForFilterId(dialog: Dialog, filterId: number) {\n return this.testDialogForFilter(dialog, this.filters[filterId]);\n }\n\n public getFilter(filterId: number) {\n return this.filters[filterId];\n }\n\n public getFilters() {\n return this.filters;\n }\n\n public clearFilters() {\n const filters = this.getFilters();\n for(const filterId in filters) { // delete filters\n if(REAL_FOLDERS.has(+filterId)) {\n continue;\n }\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: +filterId\n });\n }\n }\n\n public async toggleDialogPin(peerId: PeerId, filterId: number) {\n const filter = this.filters[filterId];\n\n const index = filter.pinnedPeerIds.indexOf(peerId);\n const wasPinned = index !== -1;\n\n if(wasPinned) {\n filter.pinned_peers.splice(index, 1);\n filter.pinnedPeerIds.splice(index, 1);\n }\n\n if(!wasPinned) {\n if(filter.pinned_peers.length >= (await this.apiManager.getConfig()).pinned_infolder_count_max) {\n return Promise.reject(makeError('PINNED_DIALOGS_TOO_MUCH'));\n }\n\n filter.pinned_peers.unshift(this.appPeersManager.getInputPeerById(peerId));\n filter.pinnedPeerIds.unshift(peerId);\n }\n\n return this.updateDialogFilter(filter);\n }\n\n public createDialogFilter(filter: MyDialogFilter, prepend?: boolean) {\n const maxId = Math.max(1, ...Object.keys(this.filters).map((i) => +i));\n filter = copy(filter);\n filter.id = maxId + 1;\n return this.updateDialogFilter(filter, undefined, prepend);\n }\n\n public updateDialogFilter(filter: MyDialogFilter, remove = false, prepend = false) {\n const flags = remove ? 0 : 1;\n\n return this.apiManager.invokeApi('messages.updateDialogFilter', {\n flags,\n id: filter.id,\n filter: remove ? undefined : this.getOutputDialogFilter(filter)\n }).then((bool: boolean) => { // возможно нужна проверка и откат, если результат не ТРУ\n // console.log('updateDialogFilter bool:', bool);\n\n if(bool) {\n /* if(!this.filters[filter.id]) {\n this.saveDialogFilter(filter);\n }\n\n rootScope.$broadcast('filter_update', filter); */\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: filter.id,\n filter: remove ? undefined : filter as any\n });\n\n if(prepend) {\n const f: MyDialogFilter[] = [];\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n ++filter.localId;\n f.push(filter);\n }\n\n filter.localId = START_LOCAL_ID;\n\n const order = f.sort((a, b) => a.localId - b.localId).map((filter) => filter.id);\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n }\n }\n\n return bool;\n });\n }\n\n public updateDialogFiltersOrder(order: number[]) {\n return this.apiManager.invokeApi('messages.updateDialogFiltersOrder', {\n order\n }).then(() => {\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n });\n }\n\n public getOutputDialogFilter(filter: MyDialogFilter) {\n const c = copy(filter);\n /* convertment.forEach(([from, to]) => {\n c[from] = c[to].map((peerId) => this.appPeersManager.getInputPeerById(peerId));\n }); */\n\n this.filterIncludedPinnedPeers(filter);\n\n return c;\n }\n\n private filterIncludedPinnedPeers(filter: MyDialogFilter) {\n forEachReverse(filter.includePeerIds, (peerId, idx) => {\n if(filter.pinnedPeerIds.includes(peerId)) {\n filter.include_peers.splice(idx, 1);\n filter.includePeerIds.splice(idx, 1);\n }\n });\n }\n\n // private spliceMissingPeerIds(filterId: number, type: ArgumentTypes[1], missingPeerIds: PeerId[]) {\n // const filter = this.getFilter(filterId);\n // const peers = filter && filter[type];\n // if(!peers?.length) {\n // return;\n // }\n\n // let spliced = false;\n // missingPeerIds.forEach((peerId) => {\n // const inputPeer = findAndSplice(peers, (inputPeer) => getPeerId(inputPeer) === peerId);\n // if(inputPeer) {\n // spliced = true;\n // }\n // });\n\n // if(spliced) {\n // this.onUpdateDialogFilter({\n // _: 'updateDialogFilter',\n // id: filterId,\n // filter\n // });\n // }\n // }\n\n public reloadMissingPeerIds(\n filterId: number,\n type: 'pinned_peers' | 'include_peers' | 'exclude_peers' = 'pinned_peers'\n ) {\n const filter = this.getFilter(filterId);\n const peers = filter?.[type];\n if(!peers?.length) {\n return;\n }\n\n // const missingPeerIds: PeerId[] = [];\n const reloadDialogs = peers.filter((inputPeer) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const isAlreadyReloaded = this.reloadedPeerIds.has(peerId);\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\n // if(isAlreadyReloaded && !dialog) {\n // missingPeerIds.push(peerId);\n // }\n\n const reload = !isAlreadyReloaded && !dialog;\n return reload;\n });\n\n if(!reloadDialogs.length) {\n // if(missingPeerIds.length) {\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\n // }\n\n return;\n }\n\n const reloadPromises = reloadDialogs.map((inputPeer) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const promise = this.appMessagesManager.reloadConversation(inputPeer)\n .then((dialog) => {\n this.reloadedPeerIds.add(peerId);\n\n return dialog ? undefined : peerId;\n });\n\n return promise;\n });\n\n const reloadPromise = Promise.all(reloadPromises).then((missingPeerIds) => {\n missingPeerIds = missingPeerIds.filter(Boolean);\n if(!missingPeerIds.length) {\n return;\n }\n\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\n });\n\n return reloadPromise;\n }\n\n public async getDialogFilters(overwrite = false): Promise {\n const keys = Object.keys(this.filters);\n if(keys.length > PREPENDED_FILTERS && !overwrite) {\n return keys.map((filterId) => this.filters[filterId]).sort((a, b) => a.localId - b.localId);\n }\n\n const filters = await this.apiManager.invokeApiSingle('messages.getDialogFilters');\n const prepended = this.prependFilters(filters);\n return prepended.map((filter) => this.saveDialogFilter(filter, overwrite)).filter(Boolean);\n }\n\n public getSuggestedDialogsFilters() {\n return this.apiManager.invokeApi('messages.getSuggestedDialogFilters');\n }\n\n public saveDialogFilter(filter: DialogFilter, update = true, silent?: boolean) {\n // defineNotNumerableProperties(filter, ['includePeerIds', 'excludePeerIds', 'pinnedPeerIds']);\n\n if(filter._ === 'dialogFilterDefault') {\n filter = this.localFilters[FOLDER_ID_ALL];\n }\n\n assumeType(filter);\n if(!REAL_FOLDERS.has(filter.id)) {\n convertment.forEach(([from, to]) => {\n assumeType(filter);\n filter[to] = filter[from].map((peer) => this.appPeersManager.getPeerId(peer));\n });\n\n this.filterIncludedPinnedPeers(filter);\n\n filter.include_peers = filter.pinned_peers.concat(filter.include_peers);\n filter.includePeerIds = filter.pinnedPeerIds.concat(filter.includePeerIds);\n }\n\n const oldFilter = this.filters[filter.id];\n if(oldFilter) {\n Object.assign(oldFilter, filter);\n } else {\n this.filters[filter.id] = filter;\n }\n\n this.setLocalId(filter);\n\n if(!silent) {\n if(update) {\n this.rootScope.dispatchEvent('filter_update', filter);\n } else if(!oldFilter) {\n this.rootScope.dispatchEvent('filter_new', filter);\n }\n }\n\n return filter;\n }\n\n private setLocalId(filter: MyDialogFilter) {\n if(filter.localId !== undefined) {\n if(filter.localId >= this.localId) {\n this.localId = filter.localId + 1;\n }\n } else {\n filter.localId = this.localId++ as MyDialogFilter['localId'];\n findAndSplice(this.filtersArr, (_filter) => _filter.id === filter.id);\n this.filtersArr.push(filter);\n this.pushToState();\n }\n }\n\n public async isFilterIdAvailable(filterId: number) {\n if(REAL_FOLDERS.has(filterId)) {\n return true;\n }\n\n const limit = await this.apiManager.getLimit('folders');\n const isFolderAvailable = this.filtersArr.filter((filter) => !REAL_FOLDERS.has(filter.id)).slice(0, limit).some((filter) => filter.id === filterId);\n\n return isFolderAvailable;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function applyMixins(derivedCtor: any, constructors: any[]) {\n // const callbacks: Array<(...args: any[]) => any> = [];\n\n constructors.forEach((baseCtor) => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n const value: PropertyDescriptor = Object.getOwnPropertyDescriptor(baseCtor.prototype, name) || Object.create(null);\n /* if(name === '_constructor') {\n callbacks.push(value.value);\n return;\n } else */if(name === 'constructor') {\n return;\n }\n\n Object.defineProperty(\n derivedCtor.prototype,\n name,\n value\n );\n });\n });\n\n // if(callbacks.length) {\n // function c(...args: any[]): any {\n // callbacks.forEach((cb, idx) => {\n // // @ts-ignore\n // cb.apply(this, args[idx] || []);\n // });\n // };\n\n // Object.defineProperty(derivedCtor.prototype, 'superConstructor', {\n // configurable: true,\n // enumerable: true,\n // value: c,\n // writable: true\n // });\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport DEBUG from '../../config/debug';\nimport {ConstructorDeclMap, Message, MessageEntity, MessageFwdHeader, Peer, Update, Updates} from '../../layer';\nimport {logger, LogTypes} from '../logger';\nimport assumeType from '../../helpers/assumeType';\nimport App from '../../config/app';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport {AppManager} from './manager';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport ctx from '../../environment/ctx';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport applyMixins from '../../helpers/applyMixins';\n\ntype UpdatesState = {\n pendingPtsUpdates: (Update & {pts: number, pts_count: number})[],\n pendingSeqUpdates?: {[seq: number]: {seq: number, date: number, updates: any[]}},\n syncPending: {\n seqAwaiting?: number,\n ptsAwaiting?: boolean,\n timeout: number\n },\n syncLoading: Promise,\n\n seq?: number,\n pts?: number,\n date?: number,\n lastPtsUpdateTime?: number,\n lastDifferenceTime?: number\n};\n\nconst SYNC_DELAY = 6;\n\nclass ApiUpdatesManager {\n public updatesState: UpdatesState = {\n pendingPtsUpdates: [],\n pendingSeqUpdates: {},\n syncPending: null,\n syncLoading: null\n };\n\n private channelStates: {[channelId: ChatId]: UpdatesState} = {};\n private attached = false;\n\n private log = logger('UPDATES', LogTypes.Error | LogTypes.Warn | LogTypes.Log/* | LogTypes.Debug */);\n private debug = DEBUG;\n\n private subscriptions: {[channelId: ChatId]: {count: number, interval?: number}} = {};\n\n constructor() {\n this._constructor(false);\n }\n\n private setProxy() {\n const self = this;\n this.updatesState = new Proxy(this.updatesState, {\n set: function(target: ApiUpdatesManager['updatesState'], key: keyof ApiUpdatesManager['updatesState'], value: ApiUpdatesManager['updatesState'][typeof key]) {\n // @ts-ignore\n target[key] = value;\n self.saveUpdatesState();\n return true;\n }\n });\n }\n\n public saveUpdatesState() {\n const us = this.updatesState;\n this.appStateManager.pushToState('updates', {\n seq: us.seq,\n pts: us.pts,\n date: us.date\n });\n }\n\n private popPendingSeqUpdate() {\n const state = this.updatesState;\n const nextSeq = state.seq + 1;\n const pendingUpdatesData = state.pendingSeqUpdates[nextSeq];\n if(!pendingUpdatesData) {\n return false;\n }\n\n const updates = pendingUpdatesData.updates;\n for(let i = 0, length = updates.length; i < length; ++i) {\n this.saveUpdate(updates[i]);\n }\n\n state.seq = pendingUpdatesData.seq;\n if(pendingUpdatesData.date && state.date < pendingUpdatesData.date) {\n state.date = pendingUpdatesData.date;\n }\n delete state.pendingSeqUpdates[nextSeq];\n\n if(!this.popPendingSeqUpdate() &&\n state.syncPending?.seqAwaiting &&\n state.seq >= state.syncPending.seqAwaiting) {\n if(!state.syncPending.ptsAwaiting) {\n this.clearStatePendingSync(state);\n } else {\n delete state.syncPending.seqAwaiting;\n }\n }\n\n return true;\n }\n\n private popPendingPtsUpdate(channelId: ChatId) {\n const curState = channelId ? this.getChannelState(channelId) : this.updatesState;\n if(!curState.pendingPtsUpdates.length) {\n return false;\n }\n\n curState.pendingPtsUpdates.sort((a, b) => {\n return a.pts - b.pts;\n });\n // this.log('pop update', channelId, curState.pendingPtsUpdates)\n\n let curPts = curState.pts;\n let goodPts = 0;\n let goodIndex = 0;\n for(let i = 0, length = curState.pendingPtsUpdates.length; i < length; ++i) {\n const update = curState.pendingPtsUpdates[i];\n curPts += update.pts_count;\n if(curPts >= update.pts) {\n goodPts = update.pts;\n goodIndex = i;\n }\n }\n\n if(!goodPts) {\n return false;\n }\n\n this.debug && this.log.debug('pop pending pts updates', goodPts, curState.pendingPtsUpdates.slice(0, goodIndex + 1));\n\n curState.pts = goodPts;\n for(let i = 0; i <= goodIndex; ++i) {\n const update = curState.pendingPtsUpdates[i];\n\n // @ts-ignore\n this.saveUpdate(update);\n }\n curState.pendingPtsUpdates.splice(0, goodIndex + 1);\n\n if(!curState.pendingPtsUpdates.length && curState.syncPending) {\n if(!curState.syncPending.seqAwaiting) {\n this.clearStatePendingSync(curState);\n } else {\n delete curState.syncPending.ptsAwaiting;\n }\n }\n\n return true;\n }\n\n public forceGetDifference() {\n if(!this.updatesState.syncLoading) {\n this.getDifference();\n }\n }\n\n public processLocalUpdate(update: Update) {\n this.processUpdateMessage({\n _: 'updateShort',\n update\n } as Updates);\n }\n\n public processUpdateMessage = (updateMessage: any, options: Partial<{\n override: boolean\n }> = {}) => {\n // return forceGetDifference()\n const processOpts = {\n date: updateMessage.date,\n seq: updateMessage.seq,\n seqStart: updateMessage.seq_start\n // ignoreSyncLoading: options.ignoreSyncLoading\n };\n\n this.debug && this.log.debug('processUpdateMessage', updateMessage);\n\n switch(updateMessage._) {\n case 'updatesTooLong':\n case 'new_session_created':\n this.forceGetDifference();\n break;\n\n case 'updateShort':\n this.processUpdate(updateMessage.update, processOpts);\n break;\n\n case 'updateShortMessage':\n case 'updateShortChatMessage': {\n assumeType(updateMessage);\n this.debug && this.log.debug('updateShortMessage | updateShortChatMessage', {...updateMessage});\n const isOut = updateMessage.pFlags.out;\n const fromId = (updateMessage as Updates.updateShortChatMessage).from_id || (isOut ? this.appPeersManager.peerId : (updateMessage as Updates.updateShortMessage).user_id);\n const toId = (updateMessage as Updates.updateShortChatMessage).chat_id ?\n (updateMessage as Updates.updateShortChatMessage).chat_id.toPeerId(true) :\n ((updateMessage as Updates.updateShortMessage).user_id.toPeerId(false) || this.appPeersManager.peerId);\n\n this.processUpdate({\n _: 'updateNewMessage',\n message: {\n _: 'message',\n pFlags: updateMessage.pFlags,\n id: updateMessage.id,\n from_id: this.appPeersManager.getOutputPeer(fromId.toPeerId()),\n peer_id: this.appPeersManager.getOutputPeer(toId),\n date: updateMessage.date,\n message: updateMessage.message,\n fwd_from: updateMessage.fwd_from,\n reply_to: updateMessage.reply_to,\n entities: updateMessage.entities\n },\n pts: updateMessage.pts,\n pts_count: updateMessage.pts_count\n }, processOpts);\n break;\n }\n\n case 'updatesCombined':\n case 'updates':\n this.appUsersManager.saveApiUsers(updateMessage.users, options.override);\n this.appChatsManager.saveApiChats(updateMessage.chats, options.override);\n\n updateMessage.updates.forEach((update: Update) => {\n this.processUpdate(update, processOpts);\n });\n break;\n\n default:\n this.log.warn('Unknown update message', updateMessage);\n }\n };\n\n private getDifference(first = false): Promise {\n // this.trace('Get full diff')\n const updatesState = this.updatesState;\n const wasSyncing = updatesState.syncLoading;\n if(!wasSyncing) {\n updatesState.pendingSeqUpdates = {};\n updatesState.pendingPtsUpdates = [];\n }\n\n this.clearStatePendingSync(updatesState);\n\n const promise = this.apiManager.invokeApi('updates.getDifference', {\n pts: updatesState.pts,\n pts_total_limit: first /* && false */? /* 50 */1200 : undefined,\n date: updatesState.date,\n qts: -1\n }, {\n timeout: 0x7fffffff\n }).then((differenceResult) => {\n this.debug && this.log.debug('Get diff result', differenceResult);\n\n if(differenceResult._ === 'updates.differenceEmpty') {\n this.debug && this.log.debug('apply empty diff', differenceResult.seq);\n updatesState.date = differenceResult.date;\n updatesState.seq = differenceResult.seq;\n return;\n }\n\n // ! SORRY I'M SORRY I'M SORRY\n if(first) {\n this.rootScope.dispatchEvent('state_synchronizing');\n }\n\n if(differenceResult._ !== 'updates.differenceTooLong') {\n this.appUsersManager.saveApiUsers(differenceResult.users);\n this.appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n // this.log('applying', differenceResult.other_updates.length, 'other updates')\n\n differenceResult.other_updates.forEach((update) => {\n switch(update._) {\n case 'updateChannelTooLong':\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n this.processUpdate(update);\n return;\n }\n\n this.saveUpdate(update);\n });\n\n // this.log('applying', differenceResult.new_messages.length, 'new messages')\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewMessage',\n message: apiMessage,\n pts: updatesState.pts,\n pts_count: 0\n });\n });\n\n const nextState = differenceResult._ === 'updates.difference' ? differenceResult.state : differenceResult.intermediate_state;\n updatesState.seq = nextState.seq;\n updatesState.pts = nextState.pts;\n updatesState.date = nextState.date;\n } else {\n updatesState.pts = differenceResult.pts;\n updatesState.date = (Date.now() / 1000 | 0) + this.timeManager.getServerTimeOffset();\n delete updatesState.seq;\n\n this.channelStates = {};\n\n this.log.warn('getDifference:', differenceResult._);\n this.onDifferenceTooLong();\n }\n\n // this.log('apply diff', updatesState.seq, updatesState.pts)\n\n if(differenceResult._ === 'updates.differenceSlice') {\n return this.getDifference();\n } else {\n this.debug && this.log.debug('finished get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(updatesState, promise);\n }\n\n return promise;\n }\n\n private clearStatePendingSync(state: UpdatesState) {\n if(state.syncPending) {\n clearTimeout(state.syncPending.timeout);\n state.syncPending = null;\n }\n }\n\n private getChannelDifference(channelId: ChatId): Promise {\n const channelState = this.getChannelState(channelId);\n const wasSyncing = channelState.syncLoading;\n if(!wasSyncing) {\n channelState.pendingPtsUpdates = [];\n }\n\n this.clearStatePendingSync(channelState);\n\n const log = this.debug ? this.log.bindPrefix('getChannelDifference-' + channelId) : undefined;\n // this.log.trace('Get channel diff', appChatsManager.getChat(channelId), channelState.pts);\n const promise = this.apiManager.invokeApi('updates.getChannelDifference', {\n channel: this.appChatsManager.getChannelInput(channelId),\n filter: {_: 'channelMessagesFilterEmpty'},\n pts: channelState.pts,\n limit: 1000\n }, {timeout: 0x7fffffff}).then((differenceResult) => {\n log?.debug('diff result', differenceResult)\n channelState.pts = 'pts' in differenceResult ? differenceResult.pts : undefined;\n channelState.lastDifferenceTime = Date.now();\n\n if(differenceResult._ === 'updates.channelDifferenceEmpty') {\n // log?.debug('apply channel empty diff', differenceResult);\n return;\n }\n\n if(differenceResult._ === 'updates.channelDifferenceTooLong') {\n // log?.debug('channel diff too long', differenceResult);\n delete this.channelStates[channelId];\n\n this.saveUpdate({_: 'updateChannelReload', channel_id: channelId});\n return;\n }\n\n this.appUsersManager.saveApiUsers(differenceResult.users);\n this.appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n log?.debug('applying', differenceResult.other_updates.length, 'channel other updates');\n differenceResult.other_updates.forEach((update) => {\n this.saveUpdate(update);\n });\n\n log?.debug('applying', differenceResult.new_messages.length, 'channel new messages');\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewChannelMessage',\n message: apiMessage,\n pts: channelState.pts,\n pts_count: 0\n });\n });\n\n log?.debug('apply channel diff', channelState.pts);\n\n if(differenceResult._ === 'updates.channelDifference' &&\n !differenceResult.pFlags.final) {\n return this.getChannelDifference(channelId);\n } else {\n log?.debug('finished channel get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(channelState, promise, channelId);\n }\n\n return promise;\n }\n\n private onDifferenceTooLong() {\n this.appUsersManager.clear();\n this.appChatsManager.clear();\n this.appMessagesManager.clear();\n\n this.rootScope.dispatchEvent('state_cleared');\n }\n\n private justAName(state: UpdatesState, promise: UpdatesState['syncLoading'], channelId?: ChatId) {\n state.syncLoading = promise;\n this.rootScope.dispatchEvent('state_synchronizing', channelId);\n\n promise.then(() => {\n state.syncLoading = null;\n this.rootScope.dispatchEvent('state_synchronized', channelId);\n }, () => {\n state.syncLoading = null;\n });\n }\n\n public addChannelState(channelId: ChatId, pts: number) {\n if(!pts) {\n throw new Error('Add channel state without pts ' + channelId);\n }\n\n return this.channelStates[channelId] ??= {\n pts,\n pendingPtsUpdates: [],\n syncPending: null,\n syncLoading: null\n };\n }\n\n public getChannelState(channelId: ChatId, pts?: number) {\n if(this.channelStates[channelId] === undefined) {\n this.addChannelState(channelId, pts);\n }\n\n return this.channelStates[channelId];\n }\n\n private processUpdate(update: Update, options: Partial<{\n date: number,\n seq: number,\n seqStart: number/* ,\n ignoreSyncLoading: boolean */\n }> = {}) {\n let channelId: ChatId;\n switch(update._) {\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n channelId = this.appPeersManager.getPeerId(update.message.peer_id).toChatId();\n break;\n /* case 'updateDeleteChannelMessages':\n channelId = update.channel_id;\n break; */\n case 'updateChannelTooLong':\n channelId = update.channel_id;\n if(!(channelId in this.channelStates)) {\n return false;\n }\n break;\n default:\n if('channel_id' in update && 'pts' in update) {\n channelId = update.channel_id;\n }\n break;\n }\n\n const {pts, pts_count} = update as Update.updateNewMessage;\n const curState = channelId ? this.getChannelState(channelId, pts) : this.updatesState;\n\n // this.log.log('process', channelId, curState.pts, update)\n\n if(curState.syncLoading/* && !options.ignoreSyncLoading */) {\n return false;\n }\n\n if(update._ === 'updateChannelTooLong') {\n if(!curState.lastPtsUpdateTime ||\n curState.lastPtsUpdateTime < (Date.now() - SYNC_DELAY)) {\n // this.log.trace('channel too long, get diff', channelId, update)\n this.getChannelDifference(channelId);\n }\n return false;\n }\n\n if(update._ === 'updateNewMessage' ||\n update._ === 'updateEditMessage' ||\n update._ === 'updateNewChannelMessage' ||\n update._ === 'updateEditChannelMessage') {\n const message = update.message as Message.message;\n const toPeerId = this.appPeersManager.getPeerId(message.peer_id);\n const fwdHeader: MessageFwdHeader.messageFwdHeader = message.fwd_from || {} as any;\n let reason: string;\n if(message.from_id && !this.appUsersManager.hasUser(this.appPeersManager.getPeerId(message.from_id), message.pFlags.post/* || channelId*/) && (reason = 'author') ||\n fwdHeader.from_id && !this.appUsersManager.hasUser(this.appPeersManager.getPeerId(fwdHeader.from_id), !!(fwdHeader.from_id as Peer.peerChannel).channel_id) && (reason = 'fwdAuthor') ||\n (fwdHeader.from_id as Peer.peerChannel)?.channel_id && !this.appChatsManager.hasChat((fwdHeader.from_id as Peer.peerChannel).channel_id, true) && (reason = 'fwdChannel') ||\n toPeerId.isUser() && !this.appUsersManager.hasUser(toPeerId) && (reason = 'toPeer User') ||\n toPeerId.isAnyChat() && !this.appChatsManager.hasChat(toPeerId.toChatId()) && (reason = 'toPeer Chat')) {\n this.log.warn('Not enough data for message update', toPeerId, reason, message);\n if(channelId && this.appChatsManager.hasChat(channelId)) {\n this.getChannelDifference(channelId);\n } else {\n this.forceGetDifference();\n }\n return false;\n }\n } else if(channelId && !this.appChatsManager.hasChat(channelId)) {\n // this.log.log('skip update, missing channel', channelId, update)\n return false;\n }\n\n let popPts: boolean;\n let popSeq: boolean;\n\n if(pts) {\n const newPts = curState.pts + (pts_count || 0);\n if(newPts < pts) {\n this.debug && this.log.warn('Pts hole', curState, update, channelId && this.appChatsManager.getChat(channelId));\n curState.pendingPtsUpdates.push(update as Update.updateNewMessage);\n if(!curState.syncPending && !curState.syncLoading) {\n curState.syncPending = {\n timeout: ctx.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n if(channelId) {\n this.getChannelDifference(channelId);\n } else {\n this.getDifference();\n }\n }, SYNC_DELAY)\n };\n }\n\n curState.syncPending.ptsAwaiting = true;\n return false;\n }\n\n if(pts > curState.pts) {\n curState.pts = pts;\n popPts = true;\n\n curState.lastPtsUpdateTime = Date.now();\n } else if(pts_count) {\n // this.log.warn('Duplicate update', update)\n return false;\n }\n\n if(channelId && options.date && this.updatesState.date < options.date) {\n this.updatesState.date = options.date;\n }\n } else if(!channelId && options.seq > 0) {\n const seq = options.seq;\n const seqStart = options.seqStart || seq;\n\n if(seqStart !== curState.seq + 1) {\n if(seqStart > curState.seq) {\n this.debug && this.log.warn('Seq hole', curState, curState.syncPending?.seqAwaiting);\n\n curState.pendingSeqUpdates[seqStart] ??= {seq, date: options.date, updates: []};\n curState.pendingSeqUpdates[seqStart].updates.push(update);\n\n if(!curState.syncPending) {\n curState.syncPending = {\n timeout: ctx.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n this.getDifference();\n }, SYNC_DELAY)\n };\n }\n\n if(!curState.syncPending.seqAwaiting ||\n curState.syncPending.seqAwaiting < seqStart) {\n curState.syncPending.seqAwaiting = seqStart;\n }\n return false;\n }\n }\n\n if(curState.seq !== seq) {\n curState.seq = seq;\n if(options.date && curState.date < options.date) {\n curState.date = options.date;\n }\n\n popSeq = true;\n }\n }\n\n this.saveUpdate(update);\n\n if(popPts) {\n this.popPendingPtsUpdate(channelId);\n } else if(popSeq) {\n this.popPendingSeqUpdate();\n }\n }\n\n public saveUpdate(update: Update) {\n // this.debug && this.log('saveUpdate', update);\n this.dispatchEvent(update._, update as any);\n }\n\n public subscribeToChannelUpdates(channelId: ChatId) {\n const subscription = this.subscriptions[channelId] ??= {count: 0};\n ++subscription.count;\n\n const cb = () => {\n const state = this.getChannelState(channelId);\n if(!state.syncLoading && (!state.lastDifferenceTime || (Date.now() - state.lastDifferenceTime) > 2500)) {\n this.getChannelDifference(channelId);\n }\n };\n\n subscription.interval ??= ctx.setInterval(cb, 3000);\n cb();\n }\n\n public unsubscribeFromChannelUpdates(channelId: ChatId, force?: boolean) {\n const subscription = this.subscriptions[channelId];\n if(!subscription?.interval || (--subscription.count && !force)) {\n return;\n }\n\n clearInterval(subscription.interval);\n subscription.interval = undefined;\n delete this.subscriptions[channelId];\n }\n\n public attach(langCode?: string) {\n if(this.attached) return;\n\n // return;\n\n this.log('attach');\n\n this.attached = true;\n\n this.appStateManager.getState().then(({updates: state}) => {\n const newVersion = this.appStateManager.newVersion/* || '1.6.0' */;\n\n // rootScope.broadcast('state_synchronizing');\n if(!state || !state.pts || !state.date/* || !state.seq */) { // seq can be undefined because of updates.differenceTooLong\n this.log('will get new state');\n\n this.updatesState.syncLoading = new Promise((resolve) => {\n this.apiManager.invokeApi('updates.getState', {}, {noErrorBox: true}).then((stateResult) => {\n this.updatesState.seq = stateResult.seq;\n this.updatesState.pts = stateResult.pts;\n this.updatesState.date = stateResult.date;\n this.saveUpdatesState();\n // setTimeout(() => {\n this.updatesState.syncLoading = null;\n resolve();\n // rootScope.broadcast('state_synchronized');\n // }, 1000);\n\n // ! for testing\n // updatesState.seq = 1\n // updatesState.pts = stateResult.pts - 5000\n // updatesState.date = 1\n // getDifference()\n });\n });\n } else {\n // ! for testing\n /* state.seq = 1;\n state.pts = state.pts - 15;\n state.date = 1; */\n // state.pts -= 100;\n\n // state.date = 1628623682;\n // state.pts = 2007500;\n // state.seq = 503;\n\n Object.assign(this.updatesState, state);\n\n this.log('will get difference', Object.assign({}, state));\n\n this.getDifference(true)/* .finally(() => {\n if(this.updatesState.syncLoading) {\n rootScope.broadcast('state_synchronizing');\n }\n }) */;\n }\n\n this.apiManager.setUpdatesProcessor(this.processUpdateMessage);\n\n // this.updatesState.syncLoading.then(() => {\n this.setProxy();\n // });\n\n if(newVersion) {\n this.updatesState.syncLoading.then(async() => {\n const strs: Record = {\n en: 'was updated to version',\n ru: 'обновлён до версии'\n };\n\n const getChangelog = (lang: string) => {\n fetch(`changelogs/${lang}_${newVersion.split(' ')[0]}.md`)\n .then((res) => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then((text) => {\n const langStr = strs[lang] || strs.en;\n const pre = `**Telegram Web${App.suffix} ${langStr} ${newVersion}**\\n\\n`;\n\n text = pre + text;\n\n const entities: MessageEntity[] = [];\n const message = parseMarkdown(text, entities);\n\n const update: Update.updateServiceNotification = {\n _: 'updateServiceNotification',\n entities,\n message,\n type: 'local',\n pFlags: {},\n inbox_date: Date.now() / 1000 | 0,\n media: undefined\n };\n\n this.processLocalUpdate(update);\n });\n };\n\n const languages = filterUnique([langCode, 'en']);\n for(const language of languages) {\n try {\n await getChangelog(language);\n break;\n } catch(err) {\n\n }\n }\n });\n }\n });\n }\n}\n\ninterface ApiUpdatesManager extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n}>, AppManager {}\napplyMixins(ApiUpdatesManager, [EventListenerBase, AppManager]);\n\nexport {ApiUpdatesManager};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {UserProfilePhoto, ChatPhoto, InputFileLocation} from '../../layer';\nimport {DownloadOptions} from '../mtproto/apiFileManager';\nimport {AppManager} from './manager';\n\nexport type PeerPhotoSize = 'photo_small' | 'photo_big';\n\nexport class AppAvatarsManager extends AppManager {\n private savedAvatarURLs: {\n [peerId: PeerId]: {\n [size in PeerPhotoSize]?: string | Promise\n }\n } = {};\n\n protected after() {\n this.rootScope.addEventListener('avatar_update', ({peerId, threadId}) => {\n if(threadId) {\n return;\n }\n\n this.removeFromAvatarsCache(peerId);\n });\n }\n\n public isAvatarCached(peerId: PeerId, size?: PeerPhotoSize) {\n const saved = this.savedAvatarURLs[peerId];\n if(size === undefined) {\n return !!saved;\n }\n\n return !!(saved && saved[size] && !(saved[size] instanceof Promise));\n }\n\n public removeFromAvatarsCache(peerId: PeerId) {\n if(this.savedAvatarURLs[peerId]) {\n delete this.savedAvatarURLs[peerId];\n }\n }\n\n public loadAvatar(peerId: PeerId, photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, size: PeerPhotoSize) {\n const saved = this.savedAvatarURLs[peerId] ??= {};\n if(!saved[size]) {\n // console.warn('will invoke downloadSmallFile:', peerId);\n const peerPhotoFileLocation: InputFileLocation.inputPeerPhotoFileLocation = {\n _: 'inputPeerPhotoFileLocation',\n pFlags: {},\n peer: this.appPeersManager.getInputPeerById(peerId),\n photo_id: photo.photo_id\n };\n\n const downloadOptions: DownloadOptions = {dcId: photo.dc_id, location: peerPhotoFileLocation};\n if(size === 'photo_big') {\n peerPhotoFileLocation.pFlags.big = true;\n downloadOptions.limitPart = 512 * 1024;\n }\n\n /* let str: string;\n const time = Date.now();\n if(peerId === 0) {\n str = `download avatar ${peerId}`;\n } */\n\n const promise = this.apiFileManager.download(downloadOptions);\n return saved[size] = promise.then((blob) => {\n return saved[size] = URL.createObjectURL(blob);\n\n /* if(str) {\n console.log(str, Date.now() / 1000, Date.now() - time);\n } */\n });\n } else {\n return saved[size];\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getEnvironment} from '../../environment/utils';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {nextRandomUint} from '../../helpers/random';\nimport {InputPhoneCall, MessagesDhConfig, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, PhonePhoneCall} from '../../layer';\nimport {AppManager} from './manager';\n\nexport type CallId = PhoneCall['id'];\n\nexport type MyPhoneCall = Exclude;\n\nexport class AppCallsManager extends AppManager {\n private calls: Map;\n\n protected after() {\n this.calls = new Map();\n\n if(!getEnvironment().IS_CALL_SUPPORTED) {\n return;\n }\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updatePhoneCall: (update) => {\n this.saveCall(update.phone_call);\n },\n\n updatePhoneCallSignalingData: (update) => {\n this.rootScope.dispatchEvent('call_signaling', {callId: update.phone_call_id, data: update.data});\n }\n });\n }\n\n public computeKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n return this.cryptoWorker.invokeCrypto('compute-dh-key', g_b, a, p);\n }\n\n public saveCall(call: PhoneCall) {\n const isDiscarded = call._ === 'phoneCallDiscarded';\n const oldCall = this.calls.get(call.id);\n if(oldCall) {\n // if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n // }\n\n if(isDiscarded) {\n this.calls.delete(call.id);\n }\n\n call = oldCall;\n } else if(!isDiscarded) {\n this.calls.set(call.id, call as any);\n }\n\n this.rootScope.dispatchEvent('call_update', call);\n\n return call;\n }\n\n public getCall(callId: CallId) {\n return this.calls.get(callId);\n }\n\n public getCallInput(id: CallId): InputPhoneCall {\n const call = this.getCall(id);\n return {\n _: 'inputPhoneCall',\n id: call.id,\n access_hash: call.access_hash\n };\n }\n\n public savePhonePhoneCall(phonePhoneCall: PhonePhoneCall) {\n this.appUsersManager.saveApiUsers(phonePhoneCall.users);\n return this.saveCall(phonePhoneCall.phone_call);\n }\n\n public generateDh() {\n return this.apiManager.invokeApi('messages.getDhConfig', {\n version: 0,\n random_length: 256\n }).then((dhConfig) => {\n return this.cryptoWorker.invokeCrypto('generate-dh', dhConfig as MessagesDhConfig.messagesDhConfig);\n });\n }\n\n // private verifyProtocolCompatibility(protocol: PhoneCallProtocol) {\n // const my = getCallProtocol();\n // const myVersion = my.library_versions[0];\n // return !protocol.library_versions.find((version) => {\n // return compareVersion(myVersion, version) > 0;\n // });\n // }\n\n public async requestCall(userId: UserId, protocol: PhoneCallProtocol, g_a_hash: Uint8Array, video?: boolean) {\n const phonePhoneCall = await this.apiManager.invokeApi('phone.requestCall', {\n user_id: this.appUsersManager.getUserInput(userId),\n protocol: protocol,\n video: video,\n random_id: nextRandomUint(32),\n g_a_hash: g_a_hash\n });\n\n return this.savePhonePhoneCall(phonePhoneCall);\n }\n\n public async discardCall(callId: CallId, duration: number, reason: PhoneCallDiscardReason['_'], video?: boolean) {\n if(!this.getCall(callId)) {\n return;\n }\n\n const updates = await this.apiManager.invokeApi('phone.discardCall', {\n video,\n peer: this.getCallInput(callId),\n duration,\n reason: {\n _: reason\n },\n connection_id: '0'\n });\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport deepEqual from '../../helpers/object/deepEqual';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {ChannelParticipant, ChannelsCreateChannel, Chat, ChatAdminRights, ChatBannedRights, ChatInvite, ChatPhoto, ChatReactions, InputChannel, InputChatPhoto, InputFile, InputPeer, MessagesSponsoredMessages, SponsoredMessage, Update, Updates} from '../../layer';\nimport {isRestricted} from '../../helpers/restrictions';\nimport {AppManager} from './manager';\nimport hasRights from './utils/chats/hasRights';\nimport getParticipantPeerId from './utils/chats/getParticipantPeerId';\nimport {AppStoragesManager} from './appStoragesManager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport {randomLong} from '../../helpers/random';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\nexport type Channel = Chat.channel;\nexport type ChatRights = keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags'] | 'change_type' | 'change_permissions' | 'delete_chat' | 'view_participants';\n\nexport class AppChatsManager extends AppManager {\n private storage: AppStoragesManager['storages']['chats'];\n\n private chats: {[id: ChatId]: Exclude};\n // private usernames: any;\n // private channelAccess: any;\n // private megagroups: {[id: number]: true};\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n /* updateChannel: (update) => {\n const channelId = update.channel_id;\n //console.log('updateChannel:', update);\n rootScope.broadcast('channel_settings', {channelId});\n }, */\n\n updateChannelParticipant: (update) => {\n this.apiManager.clearCache('channels.getParticipants', (params) => {\n return (params.channel as InputChannel.inputChannel).channel_id === update.channel_id;\n });\n },\n\n updateChatDefaultBannedRights: (update) => {\n const chatId = this.appPeersManager.getPeerId(update.peer).toChatId();\n const chat = this.chats[chatId] as Chat.chat;\n if(chat) {\n chat.default_banned_rights = update.default_banned_rights;\n this.rootScope.dispatchEvent('chat_update', chatId);\n }\n }\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('chats')\n ]).then(([state, {results: chats, storage}]) => {\n this.storage = storage;\n\n this.saveApiChats(chats);\n\n this.peersStorage.addEventListener('peerNeeded', (peerId) => {\n if(peerId.isUser() || this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.set({\n [peerId.toChatId()]: this.getChat(peerId.toChatId())\n });\n });\n\n this.peersStorage.addEventListener('peerUnneeded', (peerId) => {\n if(peerId.isUser() || !this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.delete(peerId.toChatId());\n });\n });\n }\n\n public clear = (init = false) => {\n if(!init) {\n for(const chatId in this.chats) {\n if(!chatId) continue;\n if(!this.peersStorage.isPeerNeeded(chatId.toPeerId(true))) {\n const chat = this.chats[chatId];\n this.appUsersManager.modifyUsernamesCache(chat, false);\n\n this.storage.delete(chatId);\n delete this.chats[chatId];\n }\n }\n } else {\n this.chats = {};\n }\n };\n\n public saveApiChats(apiChats: any[], override?: boolean) {\n if((apiChats as any).saved) return;\n (apiChats as any).saved = true;\n apiChats.forEach((chat) => this.saveApiChat(chat, override));\n }\n\n public saveApiChat(chat: Chat, override?: boolean) {\n if(!chat || chat._ === 'chatEmpty') return;\n /* if(chat._ !== 'chat' && chat._ !== 'channel') {\n return;\n } */\n\n // * exclude from state\n // defineNotNumerableProperties(chat, ['rTitle', 'initials']);\n\n const oldChat = this.chats[chat.id];\n\n /* if(oldChat && !override) {\n return;\n } */\n\n (chat as Chat.chat).pFlags ??= {};\n\n if((chat as Chat.channel).pFlags.min && oldChat !== undefined) {\n return;\n }\n\n if(chat._ === 'channel' &&\n chat.participants_count === undefined &&\n oldChat !== undefined &&\n (oldChat as Chat.channel).participants_count) {\n chat.participants_count = (oldChat as Chat.channel).participants_count;\n }\n\n if((chat as Chat.channel).photo?._ === 'chatPhotoEmpty') {\n delete (chat as Chat.channel).photo;\n }\n\n const changedUsername = this.appUsersManager.setUsernameToCache(chat, oldChat);\n\n /* if(chat.username) {\n let searchUsername = searchIndexManager.cleanUsername(chat.username);\n this.usernames[searchUsername] = chat.id;\n } */\n\n const peerId = chat.id.toPeerId(true);\n if(oldChat === undefined) {\n this.chats[chat.id] = chat;\n } else {\n const oldPhotoId = ((oldChat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n const newPhotoId = ((chat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n const toggledForum = (oldChat as Chat.channel).pFlags.forum !== (chat as Chat.channel).pFlags.forum;\n const changedPhoto = oldPhotoId !== newPhotoId || toggledForum;\n\n const changedTitle = oldChat.title !== chat.title || changedUsername;\n\n const changedAnyBadge = (oldChat as Chat.channel).pFlags.verified !== (chat as Chat.channel).pFlags.verified ||\n (oldChat as Chat.channel).pFlags.scam !== (chat as Chat.channel).pFlags.scam ||\n (oldChat as Chat.channel).pFlags.fake !== (chat as Chat.channel).pFlags.fake;\n\n safeReplaceObject(oldChat, chat);\n this.rootScope.dispatchEvent('chat_update', chat.id);\n\n if(changedPhoto) {\n this.rootScope.dispatchEvent('avatar_update', {peerId});\n }\n\n if(changedTitle || changedAnyBadge) {\n this.rootScope.dispatchEvent('peer_title_edit', {peerId});\n }\n\n if(toggledForum) {\n this.rootScope.dispatchEvent('chat_toggle_forum', {chatId: chat.id, enabled: !!(chat as Chat.channel).pFlags.forum});\n }\n }\n\n if(this.peersStorage.isPeerNeeded(peerId)) {\n this.storage.set({\n [chat.id]: chat\n });\n }\n }\n\n public getChat(id: ChatId) {\n return this.chats[id];\n }\n\n /**\n * Check the user's ability to do an action in chat\n * @param id\n * @param action creator can still send messages to left channel. so this function shows server rights. see canSendToPeer for local rights in messages manager.\n * @param rights do not provide this parameter when checking rights for self\n * @param isThread\n * @returns\n */\n public hasRights(id: ChatId, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n return hasRights(this.getChat(id), action, rights, isThread);\n }\n\n public editChatDefaultBannedRights(id: ChatId, banned_rights: ChatBannedRights) {\n const chat = this.getChat(id) as Chat.chat;\n if(chat.default_banned_rights) {\n if(chat.default_banned_rights.until_date === banned_rights.until_date && deepEqual(chat.default_banned_rights.pFlags, banned_rights.pFlags)) {\n return Promise.resolve();\n }\n }\n\n return this.apiManager.invokeApi('messages.editChatDefaultBannedRights', {\n peer: this.appPeersManager.getInputPeerById(id.toPeerId(true)),\n banned_rights\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n /* public resolveUsername(username: string) {\n return this.usernames[username] || 0;\n } */\n\n /* public saveChannelAccess(id: ChatId, accessHash: string) {\n this.channelAccess[id] = accessHash;\n } */\n\n /* public saveIsMegagroup(id: ChatId) {\n this.megagroups[id] = true;\n } */\n\n public isChannel(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat && (chat._ === 'channel' || chat._ === 'channelForbidden')/* || this.channelAccess[id] */);\n }\n\n public isMegagroup(id: ChatId) {\n /* if(this.megagroups[id]) {\n return true;\n } */\n\n const chat: Chat = this.chats[id];\n return !!(chat as Chat.channel)?.pFlags?.megagroup;\n }\n\n public isForum(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat as Chat.channel)?.pFlags?.forum;\n }\n\n public isBroadcast(id: ChatId) {\n return this.isChannel(id) && !this.isMegagroup(id);\n }\n\n public isInChat(id: ChatId) {\n let good = true;\n const chat: Chat = this.getChat(id);\n if(!chat ||\n chat._ === 'channelForbidden' ||\n chat._ === 'chatForbidden' ||\n (chat as any as Chat.chatEmpty)._ === 'chatEmpty' ||\n (chat as Chat.chat).pFlags.left ||\n // || (chat as any).pFlags.kicked\n (chat as Chat.chat).pFlags.deactivated) {\n good = false;\n }\n\n return good;\n }\n\n public getChannelInput(id: ChatId): InputChannel {\n const chat: Chat = this.getChat(id);\n if(!chat || !(chat as Chat.channel).access_hash) {\n return {\n _: 'inputChannelEmpty'\n };\n } else {\n return {\n _: 'inputChannel',\n channel_id: id,\n access_hash: (chat as Chat.channel).access_hash/* || this.channelAccess[id] */ || '0'\n };\n }\n }\n\n public getInputPeer(id: ChatId) {\n return this.isChannel(id) ? this.getChannelInputPeer(id) : this.getChatInputPeer(id);\n }\n\n public getChatInputPeer(id: ChatId): InputPeer.inputPeerChat {\n return {\n _: 'inputPeerChat',\n chat_id: id\n };\n }\n\n public getChannelInputPeer(id: ChatId): InputPeer.inputPeerChannel {\n return {\n _: 'inputPeerChannel',\n channel_id: id,\n access_hash: (this.getChat(id) as Chat.channel).access_hash/* || this.channelAccess[id] */ || 0\n };\n }\n\n public hasChat(id: ChatId, allowMin?: true) {\n const chat = this.chats[id];\n return isObject(chat) && (allowMin || !(chat as Chat.channel).pFlags.min);\n }\n\n public getChatString(id: ChatId) {\n const chat = this.getChat(id);\n if(this.isChannel(id)) {\n return (this.isMegagroup(id) ? 's' : 'c') + id + '_' + (chat as Chat.channel).access_hash;\n }\n return 'g' + id;\n }\n\n /* public wrapForFull(id: number, fullChat: any) {\n const chatFull = copy(fullChat);\n const chat = this.getChat(id);\n\n if(!chatFull.participants_count) {\n chatFull.participants_count = chat.participants_count;\n }\n\n if(chatFull.participants &&\n chatFull.participants._ === 'chatParticipants') {\n chatFull.participants.participants = this.wrapParticipants(id, chatFull.participants.participants);\n }\n\n if(chatFull.about) {\n chatFull.rAbout = wrapRichText(chatFull.about, {noLinebreaks: true});\n }\n\n //chatFull.peerString = this.getChatString(id);\n chatFull.chat = chat;\n\n return chatFull;\n }\n\n public wrapParticipants(id: number, participants: any[]) {\n const chat = this.getChat(id);\n const myId = appUsersManager.getSelf().id;\n if(this.isChannel(id)) {\n const isAdmin = chat.pFlags.creator;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = isAdmin && participant._ === 'channelParticipant';\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n } else {\n const isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = !participant.canLeave && (\n chat.pFlags.creator ||\n participant._ === 'chatParticipant' && (isAdmin || myId === participant.inviter_id)\n );\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n }\n\n return participants;\n } */\n\n public createChannel(options: ChannelsCreateChannel): Promise {\n return this.apiManager.invokeApi('channels.createChannel', options).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const channelId = (updates as any).chats[0].id;\n return channelId;\n });\n }\n\n public inviteToChannel(id: ChatId, userIds: UserId[]) {\n const input = this.getChannelInput(id);\n const usersInputs = userIds.map((u) => this.appUsersManager.getUserInput(u));\n\n return this.apiManager.invokeApi('channels.inviteToChannel', {\n channel: input,\n users: usersInputs\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public createChat(title: string, userIds: UserId[]): Promise {\n return this.apiManager.invokeApi('messages.createChat', {\n users: userIds.map((u) => this.appUsersManager.getUserInput(u)),\n title\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const chatId = (updates as any as Updates.updates).chats[0].id;\n return chatId;\n });\n }\n\n private onChatUpdated = (chatId: ChatId, updates?: Updates) => {\n // console.log('onChatUpdated', chatId, updates);\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n if((updates as Updates.updates)?.updates?.length && this.isChannel(chatId)) {\n this.rootScope.dispatchEvent('invalidate_participants', chatId);\n }\n };\n\n public leaveChannel(id: ChatId) {\n return this.apiManager.invokeApi('channels.leaveChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public joinChannel(id: ChatId) {\n return this.apiManager.invokeApi('channels.joinChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public addChatUser(id: ChatId, userId: UserId, fwdLimit = 100) {\n return this.apiManager.invokeApi('messages.addChatUser', {\n chat_id: id,\n user_id: this.appUsersManager.getUserInput(userId),\n fwd_limit: fwdLimit\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChatUser(id: ChatId, userId: UserId) {\n return this.apiManager.invokeApi('messages.deleteChatUser', {\n chat_id: id,\n user_id: this.appUsersManager.getUserInput(userId)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public leaveChat(id: ChatId) {\n return this.deleteChatUser(id, this.appUsersManager.getSelf().id);\n }\n\n public leave(id: ChatId) {\n return this.isChannel(id) ? this.leaveChannel(id) : this.leaveChat(id);\n }\n\n public delete(id: ChatId) {\n return this.isChannel(id) ? this.deleteChannel(id) : this.deleteChat(id);\n }\n\n public deleteChannel(id: ChatId) {\n return this.apiManager.invokeApi('channels.deleteChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChat(id: ChatId) {\n // return this.leaveChat(id).then(() => {\n return this.apiManager.invokeApi('messages.deleteChat', {\n chat_id: id\n });\n // });\n }\n\n public migrateChat(id: ChatId): Promise {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channel') return Promise.resolve(chat.id);\n return this.apiManager.invokeApi('messages.migrateChat', {\n chat_id: id\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n const update: Update.updateChannel = (updates as Updates.updates).updates.find((u) => u._ === 'updateChannel') as any;\n return update.channel_id;\n });\n }\n\n public updateUsername(id: ChatId, username: string, doNotRefresh?: boolean) {\n const promise = this.apiManager.invokeApi('channels.updateUsername', {\n channel: this.getChannelInput(id),\n username\n });\n\n return this.refreshChatAfterRequest(id, promise, doNotRefresh);\n }\n\n public editPhoto(id: ChatId, inputFile: InputFile) {\n const inputChatPhoto: InputChatPhoto = {\n _: 'inputChatUploadedPhoto',\n file: inputFile\n };\n\n let promise: any;\n if(this.isChannel(id)) {\n promise = this.apiManager.invokeApi('channels.editPhoto', {\n channel: this.getChannelInput(id),\n photo: inputChatPhoto\n });\n } else {\n promise = this.apiManager.invokeApi('messages.editChatPhoto', {\n chat_id: id,\n photo: inputChatPhoto\n });\n }\n\n return promise.then(this.onChatUpdated.bind(this, id));\n }\n\n public editTitle(id: ChatId, title: string) {\n let promise: any;\n\n if(this.isChannel(id)) {\n promise = this.apiManager.invokeApi('channels.editTitle', {\n channel: this.getChannelInput(id),\n title\n });\n } else {\n promise = this.apiManager.invokeApi('messages.editChatTitle', {\n chat_id: id,\n title\n });\n }\n\n return promise.then(this.onChatUpdated.bind(this, id));\n }\n\n public editAbout(id: ChatId, about: string) {\n const peerId = id.toPeerId(true);\n return this.apiManager.invokeApi('messages.editChatAbout', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n about\n }).then((bool) => {\n if(bool) {\n this.rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return bool;\n });\n }\n\n public editBanned(id: ChatId, participant: PeerId | ChannelParticipant, banned_rights: ChatBannedRights) {\n const peerId = typeof(participant) !== 'object' ? participant : getParticipantPeerId(participant);\n return this.apiManager.invokeApi('channels.editBanned', {\n channel: this.getChannelInput(id),\n participant: this.appPeersManager.getInputPeerById(peerId),\n banned_rights\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n\n if(typeof(participant) === 'object') {\n const timestamp = Date.now() / 1000 | 0;\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelParticipant',\n channel_id: id,\n date: timestamp,\n actor_id: undefined,\n qts: undefined,\n user_id: peerId,\n prev_participant: participant,\n new_participant: Object.keys(banned_rights.pFlags).length ? {\n _: 'channelParticipantBanned',\n date: timestamp,\n banned_rights,\n kicked_by: this.appUsersManager.getSelf().id,\n peer: this.appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } : undefined\n });\n }\n });\n }\n\n public clearChannelParticipantBannedRights(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {}\n });\n }\n\n public kickFromChannel(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {\n view_messages: true\n }\n });\n }\n\n public kickFromChat(id: ChatId, participant: PeerId | ChannelParticipant) {\n if(this.isChannel(id)) return this.kickFromChannel(id, participant);\n else return this.deleteChatUser(id, (participant as PeerId).toUserId());\n }\n\n public resolveChannel(id: ChatId) {\n return this.apiManager.invokeApiSingle('channels.getChannels', {\n id: [{\n _: 'inputChannel',\n channel_id: id,\n access_hash: '0'\n }]\n }).then((messagesChats) => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public togglePreHistoryHidden(id: ChatId, enabled: boolean) {\n return this.migrateChat(id).then((channelId) => {\n return this.apiManager.invokeApi('channels.togglePreHistoryHidden', {\n channel: this.getChannelInput(channelId),\n enabled\n }).then(this.onChatUpdated.bind(this, channelId));\n });\n }\n\n public toggleSignatures(id: ChatId, enabled: boolean) {\n return this.apiManager.invokeApi('channels.toggleSignatures', {\n channel: this.getChannelInput(id),\n enabled\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public toggleNoForwards(id: ChatId, enabled: boolean) {\n return this.apiManager.invokeApi('messages.toggleNoForwards', {\n peer: this.getInputPeer(id),\n enabled\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public setChatAvailableReactions(id: ChatId, reactions: ChatReactions) {\n const chatFull = this.appProfileManager.getCachedFullChat(id);\n if(chatFull) {\n chatFull.available_reactions = reactions;\n this.rootScope.dispatchEvent('chat_full_update', id);\n }\n\n return this.apiManager.invokeApi('messages.setChatAvailableReactions', {\n peer: this.getInputPeer(id),\n available_reactions: reactions\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public getSendAs(channelId: ChatId) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'channels.getSendAs',\n params: {\n peer: this.getChannelInputPeer(channelId)\n },\n processResult: (sendAsPeers) => {\n this.appUsersManager.saveApiUsers(sendAsPeers.users);\n this.saveApiChats(sendAsPeers.chats);\n\n return sendAsPeers.peers;\n }\n });\n }\n\n public importChatInvite(hash: string) {\n return this.apiManager.invokeApi('messages.importChatInvite', {hash})\n .then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n const chat = (updates as Updates.updates).chats[0];\n return chat.id;\n });\n }\n\n public checkUsername(chatId: ChatId, username: string) {\n return this.apiManager.invokeApi('channels.checkUsername', {\n channel: this.getChannelInput(chatId),\n username\n });\n }\n\n public getSponsoredMessage(chatId: ChatId) {\n // const s: MessagesSponsoredMessages.messagesSponsoredMessages = {\n // '_': 'messages.sponsoredMessages',\n // 'messages': [\n // {\n // '_': 'sponsoredMessage',\n // 'pFlags': {},\n // 'flags': 9,\n // 'random_id': new Uint8Array([\n // 80,\n // 5,\n // 249,\n // 174,\n // 44,\n // 73,\n // 173,\n // 14,\n // 246,\n // 81,\n // 187,\n // 182,\n // 223,\n // 5,\n // 4,\n // 128\n // ]),\n // 'from_id': {\n // '_': 'peerUser',\n // 'user_id': 983000232\n // },\n // 'start_param': 'GreatMinds',\n // 'message': 'This is a long sponsored message. In fact, it has the maximum length allowed on the platform – 160 characters 😬😬. It\\'s promoting a bot with a start parameter.' + chatId\n // }\n // ],\n // 'chats': [],\n // 'users': [\n // {\n // '_': 'user',\n // 'pFlags': {\n // 'bot': true,\n // 'verified': true,\n // 'apply_min_photo': true\n // },\n // 'flags': 34226219,\n // 'id': 983000232,\n // 'access_hash': '-294959558742535650',\n // 'first_name': 'Quiz Bot',\n // 'username': 'QuizBot',\n // 'photo': {\n // '_': 'userProfilePhoto',\n // 'pFlags': {},\n // 'flags': 2,\n // 'photo_id': '4221953848856651689',\n // 'stripped_thumb': new Uint8Array([\n // 1,\n // 8,\n // 8,\n // 155,\n // 247,\n // 95,\n // 103,\n // 255,\n // 0,\n // 110,\n // 138,\n // 40,\n // 174,\n // 132,\n // 142,\n // 6,\n // 238,\n // 127\n // ]),\n // 'dc_id': 2\n // },\n // 'bot_info_version': 11,\n // 'bot_inline_placeholder': 'Search a quiz...',\n // 'sortName': 'quiz bot'\n // }\n // ]\n // };\n\n // const promise = Promise.resolve(s);\n const promise = this.apiManager.invokeApiCacheable('channels.getSponsoredMessages', {\n channel: this.getChannelInput(chatId)\n }, {cacheSeconds: 300});\n\n return promise.then((sponsoredMessages) => {\n if(sponsoredMessages._ === 'messages.sponsoredMessages') {\n this.appUsersManager.saveApiUsers(sponsoredMessages.users);\n this.appChatsManager.saveApiChats(sponsoredMessages.chats);\n\n const sponsoredMessage = sponsoredMessages.messages.shift();\n sponsoredMessages.messages.push(sponsoredMessage);\n }\n\n return sponsoredMessages;\n });\n }\n\n public viewSponsoredMessage(chatId: ChatId, randomId: SponsoredMessage['random_id']) {\n return this.apiManager.invokeApiSingle('channels.viewSponsoredMessage', {\n channel: this.getChannelInput(chatId),\n random_id: randomId\n });\n }\n\n public checkChatInvite(hash: string) {\n return this.apiManager.invokeApi('messages.checkChatInvite', {\n hash: hash\n }).then((chatInvite) => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n this.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n return chatInvite;\n });\n }\n\n public toggleUsername(chatId: ChatId, username: string, active: boolean) {\n const promise = this.apiManager.invokeApi('channels.toggleUsername', {\n channel: this.getChannelInput(chatId),\n username,\n active\n });\n\n return this.refreshChatAfterRequest(chatId, promise);\n }\n\n public reorderUsernames(chatId: ChatId, order: string[]) {\n const promise = this.apiManager.invokeApi('channels.reorderUsernames', {\n channel: this.getChannelInput(chatId),\n order\n });\n\n return this.refreshChatAfterRequest(chatId, promise);\n }\n\n public deactivateAllUsernames(chatId: ChatId, doNotRefresh?: boolean) {\n const promise = this.apiManager.invokeApi('channels.deactivateAllUsernames', {\n channel: this.getChannelInput(chatId)\n });\n\n return this.refreshChatAfterRequest(chatId, promise, doNotRefresh);\n }\n\n public makeChannelPrivate(chatId: ChatId) {\n const promises: Promise[] = [\n this.updateUsername(chatId, '', true),\n this.deactivateAllUsernames(chatId, true)\n ];\n\n const promise = Promise.all(promises).then(() => true);\n return this.refreshChatAfterRequest(chatId, promise);\n }\n\n public refreshChatAfterRequest>(chatId: ChatId, promise: T, doNotRefresh?: boolean): T {\n if(doNotRefresh) {\n return promise;\n }\n\n return promise.then((value) => {\n return this.getChannels([chatId]).then(() => value);\n }) as T;\n }\n\n public getChannels(chatIds: ChatId[]) {\n return this.apiManager.invokeApi('channels.getChannels', {\n id: chatIds.map((chatId) => this.getChannelInput(chatId))\n }).then((messagesChats) => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public toggleForum(chatId: ChatId, enabled: boolean) {\n return this.migrateChat(chatId).then((channelId) => {\n return this.apiManager.invokeApi('channels.toggleForum', {\n channel: this.getChannelInput(channelId),\n enabled\n }).then(this.onChatUpdated.bind(this, channelId));\n });\n }\n\n public editForumTopic(options: {\n chatId: ChatId,\n topicId: number,\n title?: string,\n iconEmojiId?: DocId,\n closed?: boolean,\n hidden?: boolean\n }) {\n const {chatId, topicId, title, iconEmojiId, closed, hidden} = options;\n return this.apiManager.invokeApi('channels.editForumTopic', {\n channel: this.getChannelInput(chatId),\n topic_id: getServerMessageId(topicId),\n title,\n icon_emoji_id: iconEmojiId,\n closed,\n hidden\n }).then(this.onChatUpdated.bind(this, chatId));\n }\n\n public async createForumTopic(options: {\n chatId: ChatId,\n title: string,\n iconColor: number,\n iconEmojiId: DocId\n }) {\n const {chatId, title, iconColor, iconEmojiId} = options;\n\n const channelFull = await this.appProfileManager.getChannelFull(chatId);\n const sendAsInputPeer = channelFull.default_send_as && this.appPeersManager.getInputPeerById(this.appPeersManager.getPeerId(channelFull.default_send_as));\n\n return this.apiManager.invokeApi('channels.createForumTopic', {\n channel: this.getChannelInput(chatId),\n title,\n icon_color: iconColor,\n icon_emoji_id: iconEmojiId,\n random_id: randomLong(),\n send_as: sendAsInputPeer\n }).then((updates) => {\n this.onChatUpdated(chatId, updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateNewChannelMessage') as Update.updateNewChannelMessage;\n return generateMessageId(update.message.id);\n });\n }\n\n public updatePinnedForumTopic(chatId: ChatId, topicId: number, pinned: boolean) {\n return this.apiManager.invokeApi('channels.updatePinnedForumTopic', {\n channel: this.getChannelInput(chatId),\n topic_id: getServerMessageId(topicId),\n pinned\n }).then(this.onChatUpdated.bind(this, chatId));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type lang from '../lang';\nimport type langSign from '../langSign';\nimport type {State} from '../config/state';\nimport DEBUG, {MOUNT_CLASS_TO} from '../config/debug';\nimport {HelpCountriesList, HelpCountry, LangPackDifference, LangPackString} from '../layer';\nimport stateStorage from './stateStorage';\nimport App from '../config/app';\nimport rootScope from './rootScope';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport deepEqual from '../helpers/object/deepEqual';\nimport safeAssign from '../helpers/object/safeAssign';\nimport capitalizeFirstLetter from '../helpers/string/capitalizeFirstLetter';\nimport matchUrlProtocol from './richTextProcessor/matchUrlProtocol';\nimport wrapUrl from './richTextProcessor/wrapUrl';\nimport {setDirection} from '../helpers/dom/setInnerHTML';\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n 'messageActionChatCreate': 'ActionCreateGroup',\n 'messageActionChatCreateYou': 'ActionYouCreateGroup',\n 'messageActionChatEditTitle': 'ActionChangedTitle',\n 'messageActionChatEditPhoto': 'ActionChangedPhoto',\n 'messageActionChatEditVideo': 'ActionChangedVideo',\n 'messageActionChatDeletePhoto': 'ActionRemovedPhoto',\n 'messageActionChatReturn': 'ActionAddUserSelf',\n 'messageActionChatReturnYou': 'ActionAddUserSelfYou',\n 'messageActionChatJoined': 'ActionAddUserSelfMega',\n 'messageActionChatJoinedYou': 'ChannelMegaJoined',\n 'messageActionChatAddUser': 'ActionAddUser',\n 'messageActionChatAddUsers': 'ActionAddUser',\n 'messageActionChatLeave': 'ActionLeftUser',\n 'messageActionChatLeaveYou': 'YouLeft',\n 'messageActionChatDeleteUser': 'ActionKickUser',\n 'messageActionChatJoinedByLink': 'ActionInviteUser',\n 'messageActionPinMessage': 'Chat.Service.Group.UpdatedPinnedMessage',\n 'messageActionContactSignUp': 'Chat.Service.PeerJoinedTelegram',\n 'messageActionChannelCreate': 'ActionCreateChannel',\n 'messageActionChannelEditTitle': 'Chat.Service.Channel.UpdatedTitle',\n 'messageActionChannelEditPhoto': 'Chat.Service.Channel.UpdatedPhoto',\n 'messageActionChannelEditVideo': 'Chat.Service.Channel.UpdatedVideo',\n 'messageActionChannelDeletePhoto': 'Chat.Service.Channel.RemovedPhoto',\n 'messageActionHistoryClear': 'HistoryCleared',\n 'messageActionDiscussionStarted': 'DiscussionStarted',\n\n 'messageActionChannelMigrateFrom': 'ActionMigrateFromGroup',\n\n 'messageActionPhoneCall.video_in_ok': 'ChatList.Service.VideoCall.incoming',\n 'messageActionPhoneCall.video_out_ok': 'ChatList.Service.VideoCall.outgoing',\n 'messageActionPhoneCall.video_missed': 'ChatList.Service.VideoCall.Missed',\n 'messageActionPhoneCall.video_cancelled': 'ChatList.Service.VideoCall.Cancelled',\n 'messageActionPhoneCall.in_ok': 'ChatList.Service.Call.incoming',\n 'messageActionPhoneCall.out_ok': 'ChatList.Service.Call.outgoing',\n 'messageActionPhoneCall.missed': 'ChatList.Service.Call.Missed',\n 'messageActionPhoneCall.cancelled': 'ChatList.Service.Call.Cancelled',\n\n 'messageActionGroupCall.started': 'Chat.Service.VoiceChatStarted.Channel',\n 'messageActionGroupCall.started_by': 'Chat.Service.VoiceChatStarted',\n 'messageActionGroupCall.started_byYou': 'Chat.Service.VoiceChatStartedYou',\n 'messageActionGroupCall.ended': 'Chat.Service.VoiceChatFinished.Channel',\n 'messageActionGroupCall.ended_by': 'Chat.Service.VoiceChatFinished',\n 'messageActionGroupCall.ended_byYou': 'Chat.Service.VoiceChatFinishedYou',\n\n 'messageActionBotAllowed': 'Chat.Service.BotPermissionAllowed'\n};\n\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\n\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\nexport type FormatterArguments = FormatterArgument[];\n\nexport const UNSUPPORTED_LANG_PACK_KEY: LangPackKey = IS_MOBILE ? 'Message.Unsupported.Mobile' : 'Message.Unsupported.Desktop';\n\nnamespace I18n {\n export const strings: Map = new Map();\n export const countriesList: HelpCountry[] = [];\n let pluralRules: Intl.PluralRules;\n\n let cacheLangPackPromise: Promise;\n export let lastRequestedLangCode: string;\n export let lastRequestedNormalizedLangCode: string;\n export let lastAppliedLangCode: string;\n export let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n export let isRTL = false;\n\n export function setRTL(rtl: boolean) {\n isRTL = rtl;\n }\n\n function setLangCode(langCode: string) {\n lastRequestedLangCode = langCode;\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\n }\n\n export function getCacheLangPack(): Promise {\n if(cacheLangPackPromise) return cacheLangPackPromise;\n return cacheLangPackPromise = Promise.all([\n stateStorage.get('langPack') as Promise,\n polyfillPromise\n ]).then(([langPack]) => {\n if(!langPack/* || true */) {\n return loadLocalLangPack();\n } else if(DEBUG && false) {\n return getLangPack(langPack.lang_code);\n }/* else if(langPack.appVersion !== App.langPackVersion) {\n return getLangPack(langPack.lang_code);\n } */\n\n if(!lastRequestedLangCode) {\n setLangCode(langPack.lang_code);\n }\n\n applyLangPack(langPack);\n return langPack;\n }).finally(() => {\n cacheLangPackPromise = undefined;\n });\n }\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(' ')[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(' ')[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n export function loadLocalLangPack() {\n const defaultCode = App.langPackCode;\n setLangCode(defaultCode);\n return Promise.all([\n import('../lang'),\n import('../langSign'),\n import('../countries')\n ]).then(([lang, langSign, countries]) => {\n const strings: LangPackString[] = [];\n formatLocalStrings(lang.default, strings);\n formatLocalStrings(langSign.default, strings);\n\n const langPack: LangPackDifference = {\n _: 'langPackDifference',\n from_version: 0,\n lang_code: defaultCode,\n strings,\n version: 0,\n local: true,\n countries: countries.default\n };\n return saveLangPack(langPack);\n });\n }\n\n export function loadLangPack(langCode: string, web?: boolean) {\n web = true;\n requestedServerLanguage = true;\n const managers = rootScope.managers;\n return Promise.all([\n managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: web ? 'web' : App.langPack\n }),\n !web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: 'android'\n }),\n import('../lang'),\n import('../langSign'),\n managers.apiManager.invokeApiCacheable('help.getCountriesList', {\n lang_code: langCode,\n hash: 0\n }) as Promise,\n polyfillPromise\n ]);\n }\n\n export function getStrings(langCode: string, strings: string[]) {\n return rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n lang_pack: App.langPack,\n lang_code: langCode,\n keys: strings\n });\n }\n\n export function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n for(const i in strings) {\n // @ts-ignore\n const v = strings[i];\n if(typeof(v) === 'string') {\n pushTo.push({\n _: 'langPackString',\n key: i,\n value: v\n });\n } else {\n pushTo.push({\n _: 'langPackStringPluralized',\n key: i,\n ...v\n });\n }\n }\n\n return pushTo;\n }\n\n export function getLangPack(langCode: string, web?: boolean) {\n setLangCode(langCode);\n return loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n let strings: LangPackString[] = [];\n\n [localLangPack1, localLangPack2].forEach((l) => {\n formatLocalStrings(l.default as any, strings);\n });\n\n strings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\n\n langPack1.strings = strings;\n langPack1.countries = countries;\n return saveLangPack(langPack1);\n });\n }\n\n export function saveLangPack(langPack: LangPackDifference) {\n langPack.appVersion = App.langPackVersion;\n\n return stateStorage.set({langPack}).then(() => {\n applyLangPack(langPack);\n return langPack;\n });\n }\n\n export const polyfillPromise = (function checkIfPolyfillNeeded() {\n if(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n return Promise.resolve();\n } else {\n return import('./pluralPolyfill').then((_Intl) => {\n (window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n });\n }\n })();\n\n export function applyLangPack(langPack: LangPackDifference) {\n const currentLangCode = lastRequestedLangCode;\n if(langPack.lang_code !== currentLangCode) {\n return;\n }\n\n try {\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\n }\n\n try {\n pluralRules = new Intl.PluralRules(langPack.lang_code);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n }\n\n strings.clear();\n\n for(const string of langPack.strings) {\n strings.set(string.key as LangPackKey, string);\n }\n\n if(langPack.countries) {\n countriesList.length = 0;\n countriesList.push(...langPack.countries.countries);\n\n langPack.countries.countries.forEach((country) => {\n if(country.name) {\n const langPackKey: any = country.default_name;\n strings.set(langPackKey, {\n _: 'langPackString',\n key: langPackKey,\n value: country.name\n });\n }\n });\n }\n\n if(lastAppliedLangCode !== currentLangCode) {\n rootScope.dispatchEvent('language_change', currentLangCode);\n lastAppliedLangCode = currentLangCode;\n cachedDateTimeFormats.clear();\n updateAmPm();\n }\n\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance) {\n instance.update();\n }\n });\n }\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n if(Array.isArray(arg)) {\n out.push(...arg as any);\n } else {\n out.push(arg);\n }\n }\n\n export function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n const out: ReturnType = [];\n const regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n let lastIndex = 0;\n input.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n // console.table({match, p1, p2, offset, string});\n\n out.push(string.slice(lastIndex, offset));\n\n if(p1) {\n // offset += p1.length;\n let element: HTMLElement;\n switch(p1) {\n case '**': {\n element = document.createElement('b');\n break;\n }\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n }\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n } else if(p3) {\n out.push(document.createElement('br'));\n } else if(p4) {\n const idx = p4.lastIndexOf(']');\n const text = p4.slice(1, idx);\n\n const url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n if(url && matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n } else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n\n if(a instanceof DocumentFragment) { // right after wrapRichText\n a = a.firstChild as any;\n }\n\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n out.push(a);\n } else if(args) {\n pushNextArgument(out, args, indexHolder);\n }\n\n lastIndex = offset + match.length;\n return '';\n });\n\n if(lastIndex !== input.length) {\n out.push(input.slice(lastIndex));\n }\n\n return out;\n }\n\n export function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n export function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n export function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n const str = strings.get(key);\n let input: string;\n if(str) {\n if(str._ === 'langPackStringPluralized' && args?.length) {\n let v = args[0] as number | string;\n if(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n const s = pluralRules.select(v);\n // @ts-ignore\n input = str[s + '_value'] || str['other_value'];\n } else if(str._ === 'langPackString') {\n input = str.value;\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n\n const result = superFormatter(input, args);\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\n return result.map((item) => item instanceof Node ? item.textContent : item).join('');\n } else {\n return result;\n }\n\n /* if(plain) {\n if(args?.length) {\n const regExp = /un\\d|%\\d\\$.|%./g;\n let i = 0;\n input = input.replace(regExp, (match, offset, string) => {\n return '' + args[i++];\n });\n }\n\n return input;\n } else {\n return superFormatter(input, args);\n } */\n }\n\n export const weakMap: WeakMap> = new WeakMap();\n\n export type IntlElementBaseOptions = {\n element?: HTMLElement,\n property?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n };\n\n abstract class IntlElementBase {\n public element: IntlElementBaseOptions['element'];\n public property: IntlElementBaseOptions['property'];\n\n constructor(options?: Options) {\n this.element = options?.element || document.createElement('span');\n this.element.classList.add('i18n');\n\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n abstract update(options?: Options): void;\n }\n\n export type IntlElementOptions = IntlElementBaseOptions & {\n key?: LangPackKey,\n args?: FormatterArguments\n };\n export class IntlElement extends IntlElementBase {\n public key: IntlElementOptions['key'];\n public args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n public update(options?: IntlElementOptions) {\n safeAssign(this, options);\n\n if(this.property === 'innerHTML') {\n this.element.textContent = '';\n this.element.append(...format(this.key, false, this.args) as any);\n } else {\n // @ts-ignore\n const v = this.element[this.property];\n const formatted = format(this.key, true, this.args);\n\n // * hasOwnProperty won't work here\n if(v === undefined) this.element.dataset[this.property] = formatted;\n else (this.element as HTMLInputElement)[this.property] = formatted;\n }\n }\n\n public compareAndUpdate(options?: IntlElementOptions) {\n if(this.key === options.key && deepEqual(this.args, options.args)) {\n return;\n }\n\n return this.update(options);\n }\n }\n\n const cachedDateTimeFormats: Map = new Map();\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n const json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n dateTimeFormat = new Intl.DateTimeFormat(lastRequestedNormalizedLangCode + '-u-hc-' + timeFormat, options);\n cachedDateTimeFormats.set(json, dateTimeFormat);\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n export type IntlDateElementOptions = IntlElementBaseOptions & {\n date?: Date,\n options: Intl.DateTimeFormatOptions\n };\n export class IntlDateElement extends IntlElementBase {\n public date: IntlDateElementOptions['date'];\n public options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n setDirection(this.element);\n }\n\n public update(options?: IntlDateElementOptions) {\n safeAssign(this, options);\n\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n const hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n }\n }\n\n export function i18n(key: LangPackKey, args?: FormatterArguments) {\n return new IntlElement({key, args}).element;\n }\n\n export function i18n_(options: IntlElementOptions) {\n return new IntlElement(options).element;\n }\n\n export function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n return new IntlElement({element, key, args, property}).element;\n }\n}\n\nexport {I18n};\nexport default I18n;\n\nconst i18n = I18n.i18n;\nexport {i18n};\n\nconst i18n_ = I18n.i18n_;\nexport {i18n_};\n\nconst _i18n = I18n._i18n;\nexport {_i18n};\n\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\n const arr = elements.slice(0, 1);\n for(let i = 1; i < elements.length; ++i) {\n const isLast = (elements.length - 1) === i;\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\n arr.push(elements[i]);\n }\n\n return arr;\n}\n\n\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\n const joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\n });\n\n return plain ? joined.join('') : joined;\n}\n\nMOUNT_CLASS_TO.I18n = I18n;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type addAnchorListener from '../../helpers/addAnchorListener';\nimport {PHONE_NUMBER_REG_EXP} from '.';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport matchUrlProtocol from './matchUrlProtocol';\nimport {T_ME_PREFIXES} from '../mtproto/mtproto_config';\n\nexport default function wrapUrl(url: string, unsafe?: number | boolean) {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n\n const out: {url: string, onclick?: Parameters[0]['name']} = {url};\n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: typeof out['onclick'];\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?(?:(.+?)\\.)?(?:(?:web|k|z)\\.)?t(?:elegram)?\\.me(?:\\/(.+))?/))) {\n const u = new URL(url);\n let prefix = tgMeMatch[1];\n if(prefix && T_ME_PREFIXES.has(tgMeMatch[1])) {\n prefix = undefined;\n }\n\n if(prefix) {\n u.pathname = prefix + (u.pathname === '/' ? '' : u.pathname);\n }\n\n const fullPath = u.pathname.slice(1);\n const path = fullPath.split('/');\n\n if(path[0] && path[0][0] === '$' && path[0].length > 1) {\n onclick = 'invoice';\n } else if(/^\\W/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) { // second regexp is for phone numbers (t.me/+38050...)\n onclick = 'joinchat';\n } else switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'addemoji':\n case 'voicechat':\n case 'invoice':\n if(path.length !== 1 && !prefix) {\n onclick = path[0];\n break;\n }\n\n default:\n if((path[1] && path[1].match(/^\\d+(?:\\?(?:comment|thread)=\\d+)?$/)) || path.length === 1) {\n onclick = 'im';\n break;\n }\n\n break;\n }\n } else if((telescoPeMatch = url.match(/^(?:https?:\\/\\/)?telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\n onclick = 'im';\n } else if((tgMatch = url.match(/tg:(?:\\/\\/)?(.+?)(?:\\?|$)/))) {\n onclick = 'tg_' + tgMatch[1] as any;\n }/* else if(unsafe) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } */\n\n if(!(window as any)[onclick]) {\n onclick = undefined;\n }\n\n out.onclick = onclick;\n return out;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.wrapUrl = wrapUrl);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import I18n from '../../lib/langPack';\n\nexport default function setInnerHTML(elem: Element, html: string | DocumentFragment | Element) {\n setDirection(elem);\n if(typeof(html) === 'string') {\n if(!html) elem.replaceChildren();\n else elem.innerHTML = html;\n } else {\n elem.replaceChildren(html);\n }\n}\n\nexport function setDirection(elem: Element) {\n // if(!I18n.isRTL) {\n elem.setAttribute('dir', 'auto');\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport I18n, {i18n} from '../lib/langPack';\n\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\nexport const ONE_DAY = 86400;\n\n// https://stackoverflow.com/a/6117889\nexport const getWeekNumber = (date: Date) => {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n const dayNum = d.getUTCDay() || 7;\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\n};\n\nexport function formatDateAccordingToTodayNew(time: Date) {\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n const timestamp = time.getTime() / 1000 | 0;\n\n const options: Intl.DateTimeFormatOptions = {};\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\n options.hour = options.minute = '2-digit';\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\n options.year = options.day = 'numeric';\n options.month = '2-digit';\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\n options.weekday = 'short';\n } else { // same year\n options.month = 'short';\n options.day = 'numeric';\n }\n\n return new I18n.IntlDateElement({\n date: time,\n options\n }).element;\n}\n\nexport function formatFullSentTimeRaw(timestamp: number, options: {\n capitalize?: boolean\n} = {}) {\n const date = new Date();\n const time = new Date(timestamp * 1000);\n const now = date.getTime() / 1000;\n\n const timeEl = formatTime(time);\n\n let dateEl: Node | string;\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\n\n if(options.capitalize) {\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\n }\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\n } else {\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\n }\n\n return {dateEl, timeEl};\n}\n\nexport function formatFullSentTime(timestamp: number) {\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\n capitalize: true\n });\n\n const fragment = document.createDocumentFragment();\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\n return fragment;\n}\n\nexport function formatTime(date: Date) {\n return new I18n.IntlDateElement({\n date,\n options: {\n hour: '2-digit',\n minute: '2-digit'\n }\n }).element;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\n\nexport const getFullDate = (date: Date, options: Partial<{\n noTime: true,\n noSeconds: true,\n monthAsNumber: true,\n leadingZero: true\n}> = {}) => {\n const joiner = options.monthAsNumber ? '.' : ' ';\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\n\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) +\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) +\n joiner + date.getFullYear() +\n (options.noTime ? '' : ', ' + time);\n};\n\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\nconst minYear = 2013;\nconst yearPattern = new RegExp('20[0-9]{1,2}');\nconst monthYearOrDayPattern = new RegExp('(\\\\w{3,}) ([0-9]{0,4})', 'i');\nconst yearOrDayAndMonthPattern = new RegExp('([0-9]{0,4}) (\\\\w{2,})', 'i');\nconst shortDate = new RegExp('^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst longDate = new RegExp('^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nexport type DateData = {\n title: string,\n minDate: number,\n maxDate: number,\n};\nexport function fillTipDates(query: string, dates: DateData[]) {\n const q = query.trim().toLowerCase();\n\n if(q.length < 3) {\n return;\n }\n\n if('today'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: 'Today',\n minDate,\n maxDate\n });\n return;\n }\n\n if('yesterday'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime() - 86400000;\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 86400001;\n dates.push({\n title: 'Yesterday',\n minDate,\n maxDate\n });\n return;\n }\n\n const dayOfWeek = getDayOfWeek(q);\n if(dayOfWeek >= 0) {\n const date = new Date();\n const now = date.getTime();\n const currentDay = date.getDay();\n const distance = dayOfWeek - currentDay;\n date.setDate(date.getDate() + distance);\n if(date.getTime() > now) {\n date.setTime(date.getTime() - 604800000);\n }\n const year = date.getFullYear()\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatWeekLong(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n let matches: any[];\n if((matches = shortDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const k = parseInt(g1);\n const k1 = parseInt(g2);\n if(k > 0 && k <= 31) {\n if(k1 >= minYear && k <= 12) {\n const selectedYear = k1;\n const month = k - 1;\n createForMonthYear(dates, month, selectedYear);\n return;\n } else if(k1 <= 12) {\n const day = k - 1;\n const month = k1 - 1;\n createForDayMonth(dates, day, month);\n }\n } else if(k >= minYear && k1 <= 12) {\n const selectedYear = k;\n const month = k1 - 1;\n createForMonthYear(dates, month, selectedYear);\n }\n\n return;\n }\n\n if((matches = longDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const g3 = matches[5];\n if(!matches[2] === matches[4]) {\n return;\n }\n\n const day = parseInt(g1);\n const month = parseInt(g2) - 1;\n let year = parseInt(g3);\n if(year >= 10 && year <= 99) {\n year += 2000;\n }\n\n const currentYear = new Date().getFullYear();\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\n const date = new Date();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n return;\n }\n\n if((matches = yearPattern.exec(q)) !== null) {\n let selectedYear = +q;\n const currentYear = new Date().getFullYear();\n if(selectedYear < minYear) {\n selectedYear = minYear;\n for(let i = currentYear; i >= selectedYear; i--) {\n const date = new Date();\n date.setFullYear(i, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(i + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + i,\n minDate,\n maxDate\n });\n }\n } else if(selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(selectedYear + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + selectedYear,\n minDate,\n maxDate\n });\n }\n\n return;\n }\n\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g1);\n if(month >= 0) {\n const k = +g2;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n return;\n }\n }\n }\n\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g2);\n if(month >= 0) {\n const k = +g1;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n }\n }\n }\n}\n\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n if(selectedYear >= minYear && selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, month, 1);\n date.setHours(0, 0, 0);\n const minDate = date.getTime();\n if(minDate > today) {\n return;\n }\n date.setMonth(date.getMonth() + 1);\n const maxDate = date.getTime() - 1;\n\n dates.push({\n title: formatterMonthYear(minDate),\n minDate,\n maxDate\n });\n }\n}\n\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\n if(validDateForMonth(day, month)) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n\n for(let i = currentYear; i >= minYear; i--) {\n if(month === 1 && day === 28 && !isLeapYear(i)) {\n continue;\n }\n\n const date = new Date();\n date.setFullYear(i, month, day + 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n if(minDate > today) {\n continue;\n }\n\n date.setFullYear(i, month, day + 2);\n date.setHours(0, 0, 0);\n const maxDate = date.getTime() - 1;\n if(i === currentYear) {\n dates.push({\n title: formatterDayMonth(minDate),\n minDate,\n maxDate\n });\n } else {\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n }\n }\n }\n}\n\nfunction formatterMonthYear(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\n}\n\nfunction formatterDayMonth(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\n}\n\nfunction formatterYearMax(timestamp: number) {\n const date = new Date(timestamp);\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\n}\n\nfunction formatWeekLong(timestamp: number) {\n const date = new Date(timestamp);\n return days[date.getDay()];\n}\n\nfunction validDateForMonth(day: number, month: number) {\n if(month >= 0 && month < 12) {\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\n return true;\n }\n }\n return false;\n}\n\nfunction isLeapYear(year: number) {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\n}\n\nfunction getMonth(q: string) {\n /* String[] months = new String[]{\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\n }; */\n\n /* String[] monthsEng = new String[12];\n Calendar c = Calendar.getInstance();\n for (int i = 1; i <= 12; i++) {\n c.set(0, 0, 0, 0, 0, 0);\n c.set(Calendar.MONTH, i);\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\n } */\n\n q = q.toLowerCase();\n for(let i = 0; i < 12; i++) {\n const month = months[i].toLowerCase();\n if(month.indexOf(q) === 0) {\n return i;\n }\n }\n return -1;\n}\n\nfunction getDayOfWeek(q: string) {\n const c = new Date();\n if(q.length <= 3) {\n return -1;\n }\n\n for(let i = 0; i < 7; i++) {\n c.setDate(c.getDate() + 1);\n\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\n return c.getDay();\n }\n }\n return -1;\n}\n\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\n","/**\n * Will be used for FILE_REFERENCE_EXPIRED\n * @param key\n * @param wasObject\n * @param newObject\n */\nexport default function safeReplaceArrayInObject(key: K, wasObject: any, newObject: any) {\n if('byteLength' in newObject[key]) { // Uint8Array\n newObject[key] = [...newObject[key]];\n }\n\n if(wasObject && wasObject[key] !== newObject[key]) {\n wasObject[key].length = newObject[key].length;\n (newObject[key] as any[]).forEach((v, i) => {\n wasObject[key][i] = v;\n });\n\n /* wasObject[key].set(newObject[key]); */\n newObject[key] = wasObject[key];\n }\n}\n","export const EXTENSION_MIME_TYPE_MAP: {[ext in MTFileExtension]: MTMimeType} = {\n pdf: 'application/pdf',\n tgv: 'application/x-tgwallpattern',\n tgs: 'application/x-tgsticker',\n json: 'application/json',\n wav: 'audio/wav',\n mp3: 'audio/mpeg',\n ogg: 'audio/ogg',\n jpeg: 'image/jpeg',\n jpg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n mp4: 'video/mp4',\n webm: 'video/webm',\n mov: 'video/quicktime',\n svg: 'image/svg+xml'\n};\n\nexport const MIME_TYPE_EXTENSION_MAP: {[mimeType in MTMimeType]?: MTFileExtension} = {};\n\nfor(const ext in EXTENSION_MIME_TYPE_MAP) {\n MIME_TYPE_EXTENSION_MAP[EXTENSION_MIME_TYPE_MAP[ext as MTFileExtension]] = ext as MTFileExtension;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {ThumbCache} from '../storages/thumbs';\nimport {AccountWallPapers, Document, DocumentAttribute, MessagesSavedGifs, PhotoSize, WallPaper} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {getFullDate} from '../../helpers/date';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\nimport {AppManager} from './manager';\nimport wrapPlainText from '../richTextProcessor/wrapPlainText';\nimport assumeType from '../../helpers/assumeType';\nimport {getEnvironment} from '../../environment/utils';\nimport {isServiceWorkerOnline} from '../mtproto/mtproto.worker';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport getDocumentInputFileLocation from './utils/docs/getDocumentInputFileLocation';\nimport getDocumentURL from './utils/docs/getDocumentURL';\nimport makeError from '../../helpers/makeError';\nimport {EXTENSION_MIME_TYPE_MAP} from '../../environment/mimeTypeMap';\nimport {THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n\nexport type MyDocument = Document.document;\n\n// TODO: если залить картинку файлом, а потом перезайти в диалог - превьюшка заново скачается\n\ntype WallPaperId = WallPaper.wallPaper['id'];\n\nlet uploadWallPaperTempId = 0;\n\nexport class AppDocsManager extends AppManager {\n private docs: {[docId: DocId]: MyDocument};\n\n private stickerCachedThumbs: {[docId: DocId]: {[toneIndex: number]: {url: string, w: number, h: number}}};\n\n private uploadingWallPapers: {[id: WallPaperId]: {cacheContext: ThumbCache, file: File}};\n\n protected after() {\n this.docs = {};\n this.stickerCachedThumbs = {};\n this.uploadingWallPapers = {};\n\n MTProtoMessagePort.getInstance().addEventListener('serviceWorkerOnline', (online) => {\n if(!online) {\n this.onServiceWorkerFail();\n }\n });\n }\n\n private onServiceWorkerFail = () => {\n for(const id in this.docs) {\n const doc = this.docs[id];\n\n if(doc.supportsStreaming) {\n delete doc.supportsStreaming;\n this.thumbsStorage.deleteCacheContext(doc);\n }\n }\n };\n\n public saveDoc(doc: Document, context?: ReferenceContext): MyDocument {\n if(!doc || doc._ === 'documentEmpty') {\n return;\n }\n\n const oldDoc = this.docs[doc.id];\n\n if(doc.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldDoc, doc);\n this.referenceDatabase.saveContext(doc.file_reference, context);\n }\n\n // console.log('saveDoc', apiDoc, this.docs[apiDoc.id]);\n // if(oldDoc) {\n // //if(doc._ !== 'documentEmpty' && doc._ === d._) {\n // if(doc.thumbs) {\n // if(!oldDoc.thumbs) oldDoc.thumbs = doc.thumbs;\n // /* else if(apiDoc.thumbs[0].bytes && !d.thumbs[0].bytes) {\n // d.thumbs.unshift(apiDoc.thumbs[0]);\n // } else if(d.thumbs[0].url) { // fix for converted thumb in safari\n // apiDoc.thumbs[0] = d.thumbs[0];\n // } */\n // }\n\n // //}\n\n // return oldDoc;\n\n // //return Object.assign(d, apiDoc, context);\n // //return context ? Object.assign(d, context) : d;\n // }\n\n if(!oldDoc) {\n this.docs[doc.id] = doc;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(doc, [/* 'thumbs', */'type', 'h', 'w', 'file_name',\n // 'file', 'duration', 'downloaded', 'url', 'audioTitle',\n // 'audioPerformer', 'sticker', 'stickerEmoji', 'stickerEmojiRaw',\n // 'stickerSetInput', 'stickerThumbConverted', 'animated', 'supportsStreaming']);\n\n for(let i = 0, length = doc.attributes.length; i < length; ++i) {\n const attribute = doc.attributes[i];\n switch(attribute._) {\n case 'documentAttributeFilename': {\n doc.file_name = wrapPlainText(attribute.file_name);\n break;\n }\n\n case 'documentAttributeAudio': {\n if(doc.type === 'round') {\n break;\n }\n\n doc.duration = attribute.duration;\n doc.type = attribute.pFlags.voice && doc.mime_type === 'audio/ogg' ? 'voice' : 'audio';\n break;\n }\n\n case 'documentAttributeVideo': {\n doc.duration = attribute.duration;\n doc.w = attribute.w;\n doc.h = attribute.h;\n // apiDoc.supportsStreaming = attribute.pFlags?.supports_streaming/* && apiDoc.size > 524288 */;\n if(/* apiDoc.thumbs && */attribute.pFlags.round_message) {\n doc.type = 'round';\n } else /* if(apiDoc.thumbs) */ {\n doc.type = 'video';\n }\n break;\n }\n\n case 'documentAttributeCustomEmoji':\n case 'documentAttributeSticker': {\n if(attribute.alt !== undefined) {\n doc.stickerEmojiRaw = attribute.alt;\n }\n\n if(attribute.stickerset) {\n if(attribute.stickerset._ === 'inputStickerSetEmpty') {\n delete attribute.stickerset;\n } else if(attribute.stickerset._ === 'inputStickerSetID') {\n doc.stickerSetInput = attribute.stickerset;\n }\n }\n\n // * there can be no thumbs, then it is a document\n if(/* apiDoc.thumbs && */doc.mime_type === 'image/webp' && (doc.thumbs || getEnvironment().IS_WEBP_SUPPORTED)) {\n doc.type = 'sticker';\n doc.sticker = 1;\n } else if(doc.mime_type === 'video/webm') {\n if(!getEnvironment().IS_WEBM_SUPPORTED) {\n break;\n }\n\n doc.type = 'sticker';\n doc.sticker = 3;\n doc.animated = true;\n }\n break;\n }\n\n case 'documentAttributeImageSize': {\n doc.type = 'photo';\n doc.w = attribute.w;\n doc.h = attribute.h;\n break;\n }\n\n case 'documentAttributeAnimated': {\n if((doc.mime_type === 'image/gif' || doc.mime_type === 'video/mp4')/* && apiDoc.thumbs */) {\n doc.type = 'gif';\n }\n\n doc.animated = true;\n break;\n }\n }\n }\n\n if(!doc.mime_type) {\n const ext = (doc.file_name || '').split('.').pop();\n // @ts-ignore\n const mappedMimeType = ext && EXTENSION_MIME_TYPE_MAP[ext.toLowerCase()];\n if(mappedMimeType) {\n doc.mime_type = mappedMimeType;\n } else {\n switch(doc.type) {\n case 'gif':\n case 'video':\n case 'round':\n doc.mime_type = 'video/mp4';\n break;\n case 'sticker':\n doc.mime_type = 'image/webp';\n break;\n case 'audio':\n doc.mime_type = 'audio/mpeg';\n break;\n case 'voice':\n doc.mime_type = 'audio/ogg';\n break;\n default:\n doc.mime_type = 'application/octet-stream';\n break;\n }\n }\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.pdf) {\n doc.type = 'pdf';\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.gif) {\n doc.type = 'gif';\n } else if(doc.mime_type === 'application/x-tgsticker' && doc.file_name === 'AnimatedSticker.tgs') {\n doc.type = 'sticker';\n doc.animated = true;\n doc.sticker = 2;\n }\n\n if(doc.type === 'voice' || doc.type === 'round') {\n // browser will identify extension\n const attribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeFilename') as DocumentAttribute.documentAttributeFilename;\n const ext = attribute && attribute.file_name.split('.').pop();\n const date = getFullDate(new Date(doc.date * 1000), {monthAsNumber: true, leadingZero: true}).replace(/[:\\.]/g, '-').replace(', ', '_');\n doc.file_name = `${doc.type}_${date}${ext ? '.' + ext : ''}`;\n }\n\n if(isServiceWorkerOnline() && (doc.type === 'gif' && doc.size > 8e6) || doc.type === 'audio' || doc.type === 'video'/* || doc.mime_type.indexOf('video/') === 0 */) {\n doc.supportsStreaming = true;\n\n const cacheContext = this.thumbsStorage.getCacheContext(doc);\n if(!cacheContext.url) {\n this.thumbsStorage.setCacheContextURL(doc, undefined, getDocumentURL(doc), 0);\n }\n } else {\n doc.supportsStreaming = false;\n }\n\n // for testing purposes\n // doc.supportsStreaming = false;\n // doc.url = ''; // * this will break upload urls\n\n doc.file_name ||= '';\n\n /* if(!doc.url) {\n doc.url = this.getFileURL(doc);\n } */\n\n if(oldDoc) {\n return Object.assign(oldDoc, doc);\n }\n\n return doc;\n }\n\n public getDoc(docId: DocId | MyDocument): MyDocument {\n return isObject(docId) ? docId : this.docs[docId];\n }\n\n public downloadDoc(doc: MyDocument, queueId?: number, onlyCache?: boolean) {\n return this.apiFileManager.downloadMedia({\n media: doc,\n queueId,\n onlyCache\n });\n }\n\n public getLottieCachedThumb(docId: DocId, toneIndex: number) {\n const cached = this.stickerCachedThumbs[docId];\n return cached && cached[toneIndex];\n }\n\n public saveLottiePreview(docId: DocId, blob: Blob, width: number, height: number, toneIndex: number) {\n const doc = this.getDoc(docId);\n if(!doc) {\n return;\n }\n\n const cached = this.stickerCachedThumbs[doc.id] ??= {};\n\n const thumb = cached[toneIndex];\n if(thumb && thumb.w >= width && thumb.h >= height) {\n return;\n }\n\n cached[toneIndex] = {\n url: URL.createObjectURL(blob),\n w: width,\n h: height\n };\n }\n\n public saveWebPConvertedStrippedThumb(docId: DocId, bytes: Uint8Array) {\n const doc = this.getDoc(docId);\n if(!doc) {\n return;\n }\n\n const thumb = doc.thumbs && doc.thumbs.find((thumb) => thumb._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n if(!thumb) {\n return;\n }\n\n doc.pFlags.stickerThumbConverted = true;\n thumb.bytes = bytes;\n }\n\n public getWallPapers() {\n return this.apiManager.invokeApiHashable({method: 'account.getWallPapers'}).then((accountWallpapers) => {\n const wallPapers = (accountWallpapers as AccountWallPapers.accountWallPapers).wallpapers as WallPaper.wallPaper[];\n wallPapers.forEach((wallPaper) => {\n wallPaper.document = this.saveDoc(wallPaper.document);\n });\n\n return wallPapers;\n });\n }\n\n public prepareWallPaperUpload(file: File) {\n const id = 'wallpaper-upload-' + ++uploadWallPaperTempId;\n\n const thumb = {\n _: 'photoSize',\n h: 0,\n w: 0,\n location: {} as any,\n size: file.size,\n type: THUMB_TYPE_FULL\n } as PhotoSize.photoSize;\n let document: MyDocument = {\n _: 'document',\n access_hash: '',\n attributes: [],\n dc_id: 0,\n file_reference: [],\n id,\n mime_type: file.type as MTMimeType,\n size: file.size,\n date: Date.now() / 1000,\n pFlags: {},\n thumbs: [thumb],\n file_name: file.name\n };\n\n document = this.saveDoc(document);\n\n const cacheContext = this.thumbsStorage.setCacheContextURL(document, undefined, URL.createObjectURL(file), file.size);\n\n const wallpaper: WallPaper.wallPaper = {\n _: 'wallPaper',\n access_hash: '',\n document: document,\n id,\n slug: id,\n pFlags: {}\n };\n\n this.uploadingWallPapers[id] = {\n cacheContext,\n file\n };\n\n return wallpaper;\n }\n\n public uploadWallPaper(id: WallPaperId) {\n const {cacheContext, file} = this.uploadingWallPapers[id];\n delete this.uploadingWallPapers[id];\n\n const upload = this.apiFileManager.upload({file, fileName: file.name});\n return upload.then((inputFile) => {\n return this.apiManager.invokeApi('account.uploadWallPaper', {\n file: inputFile,\n mime_type: file.type,\n settings: {\n _: 'wallPaperSettings'\n\n }\n }).then((wallPaper) => {\n assumeType(wallPaper);\n wallPaper.document = this.saveDoc(wallPaper.document);\n this.thumbsStorage.setCacheContextURL(wallPaper.document, undefined, cacheContext.url, cacheContext.downloaded);\n\n return wallPaper;\n });\n });\n }\n\n public getGifs() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getSavedGifs',\n processResult: (res) => {\n assumeType(res);\n return res.gifs.map((doc) => this.saveDoc(doc));\n }\n });\n }\n\n public requestDocPart(docId: DocId, dcId: number, offset: number, limit: number) {\n const doc = this.getDoc(docId);\n if(!doc) return Promise.reject(makeError('NO_DOC'));\n return this.apiFileManager.requestFilePart(dcId, getDocumentInputFileLocation(doc), offset, limit);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {FileURLType, getFileURL} from '../../../../helpers/fileName';\nimport {Document, PhotoSize} from '../../../../layer';\nimport getDocumentDownloadOptions from './getDocumentDownloadOptions';\n\nexport default function getDocumentURL(doc: Document.document, download = false, thumb?: PhotoSize.photoSize) {\n let type: FileURLType;\n if(download) {\n type = 'download';\n } else if(thumb) {\n type = 'thumb';\n } else if(doc.supportsStreaming) {\n type = 'stream';\n } else {\n type = 'document';\n }\n\n return getFileURL(type, getDocumentDownloadOptions(doc, thumb));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {MessageEntity, DraftMessage, MessagesSaveDraft} from '../../layer';\nimport tsNow from '../../helpers/tsNow';\nimport stateStorage from '../stateStorage';\nimport assumeType from '../../helpers/assumeType';\nimport {AppManager} from './manager';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport draftsAreEqual from './utils/drafts/draftsAreEqual';\n\nexport type MyDraftMessage = DraftMessage.draftMessage;\n\nexport class AppDraftsManager extends AppManager {\n private drafts: {[peerIdAndThreadId: string]: MyDraftMessage} = {};\n private getAllDraftPromise: Promise;\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateDraftMessage: (update) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n this.saveDraft({\n peerId,\n threadId: update.threadId,\n draft: update.draft,\n notify: true\n });\n }\n });\n\n /* return */stateStorage.get('drafts').then((drafts) => {\n this.drafts = drafts || {};\n });\n }\n\n private getKey(peerId: PeerId, threadId?: number) {\n return '' + peerId + (threadId ? '_' + threadId : '');\n }\n\n public getDraft(peerId: PeerId, threadId?: number) {\n return this.drafts[this.getKey(peerId, threadId)];\n }\n\n public addMissedDialogs() {\n return this.getAllDrafts().then(() => {\n for(const key in this.drafts) {\n if(key.indexOf('_') !== -1) { // exclude threads\n continue;\n }\n\n const peerId = key.toPeerId();\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\n if(!dialog) {\n this.appMessagesManager.reloadConversation(peerId);\n /* const dialog = appMessagesManager.generateDialog(peerId);\n dialog.draft = this.drafts[key];\n appMessagesManager.saveConversation(dialog);\n appMessagesManager.newDialogsToHandle[peerId] = dialog;\n appMessagesManager.scheduleHandleNewDialogs(); */\n }\n }\n });\n }\n\n private getAllDrafts() {\n return this.getAllDraftPromise ??= this.apiManager.invokeApi('messages.getAllDrafts')\n .then((updates) => {\n const p = this.apiUpdatesManager.updatesState.syncLoading || Promise.resolve();\n p.then(() => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n });\n }\n\n public saveDraft({peerId, threadId, draft: apiDraft, notify, force}: {\n peerId: PeerId,\n threadId?: number,\n draft: DraftMessage,\n notify?: boolean,\n force?: boolean\n }) {\n const draft = this.processApiDraft(apiDraft);\n\n const key = this.getKey(peerId, threadId);\n if(draft) {\n this.drafts[key] = draft;\n } else {\n delete this.drafts[key];\n }\n\n stateStorage.set({\n drafts: this.drafts\n });\n\n if(notify) {\n // console.warn(dT(), 'save draft', peerId, apiDraft, options)\n this.rootScope.dispatchEvent('draft_updated', {\n peerId,\n threadId,\n draft,\n force\n });\n }\n\n return draft;\n }\n\n private isEmptyDraft(draft: DraftMessage) {\n if(draft?._ !== 'draftMessage') {\n return true;\n }\n\n if(draft.reply_to_msg_id !== undefined && draft.reply_to_msg_id > 0) {\n return false;\n }\n\n if(!draft.message.length) {\n return true;\n }\n\n return false;\n }\n\n private processApiDraft(draft: DraftMessage): MyDraftMessage {\n if(!draft || draft._ !== 'draftMessage') {\n return undefined;\n }\n\n if(draft.reply_to_msg_id) {\n draft.reply_to_msg_id = generateMessageId(draft.reply_to_msg_id);\n }\n\n return draft;\n }\n\n public syncDraft(peerId: PeerId, threadId: number, localDraft?: DraftMessage, saveOnServer = true, force = false) {\n // console.warn(dT(), 'sync draft', peerID)\n const serverDraft = this.getDraft(peerId, threadId);\n if(draftsAreEqual(serverDraft, localDraft)) {\n // console.warn(dT(), 'equal drafts', localDraft, serverDraft)\n return true;\n }\n\n // console.warn(dT(), 'changed draft', localDraft, serverDraft)\n const params: MessagesSaveDraft = {\n peer: this.appPeersManager.getInputPeerById(peerId),\n message: ''\n };\n\n let draftObj: DraftMessage;\n if(this.isEmptyDraft(localDraft)) {\n draftObj = {_: 'draftMessageEmpty'};\n } else {\n assumeType(localDraft);\n const message = localDraft.message;\n const entities: MessageEntity[] = localDraft.entities;\n\n if(localDraft.reply_to_msg_id) {\n params.reply_to_msg_id = getServerMessageId(localDraft.reply_to_msg_id);\n }\n\n if(entities?.length) {\n params.entities = this.appMessagesManager.getInputEntities(entities);\n }\n\n if(localDraft.pFlags.no_webpage) {\n params.no_webpage = localDraft.pFlags.no_webpage;\n }\n\n params.message = message;\n }\n\n if(threadId) {\n params.top_msg_id = getServerMessageId(threadId);\n }\n\n const saveLocalDraft = draftObj || localDraft;\n saveLocalDraft.date = tsNow(true) + this.timeManager.getServerTimeOffset();\n\n this.saveDraft({\n peerId,\n threadId,\n draft: saveLocalDraft,\n notify: true,\n force\n });\n\n if(saveOnServer) {\n return this.apiManager.invokeApi('messages.saveDraft', params);\n }\n\n return true;\n }\n\n public clearAllDrafts() {\n return this.apiManager.invokeApi('messages.clearAllDrafts').then((bool) => {\n if(!bool) {\n return;\n }\n\n for(const combined in this.drafts) {\n const [peerId, threadId] = combined.split('_');\n this.rootScope.dispatchEvent('draft_updated', {\n peerId: peerId.toPeerId(),\n threadId: threadId ? +threadId : undefined,\n draft: undefined\n });\n }\n });\n }\n\n public clearDraft(peerId: PeerId, threadId: number) {\n const emptyDraft: DraftMessage.draftMessageEmpty = {\n _: 'draftMessageEmpty'\n };\n\n if(threadId) {\n this.syncDraft(peerId, threadId, emptyDraft as any, false, true);\n } else {\n this.saveDraft({\n peerId,\n threadId,\n draft: emptyDraft,\n notify: true,\n force: true\n });\n }\n }\n\n public setDraft(peerId: PeerId, threadId: number, message: string, entities?: MessageEntity[]) {\n const draft: DraftMessage.draftMessage = {\n _: 'draftMessage',\n date: Date.now() / 1000 | 0,\n message,\n pFlags: {},\n entities\n };\n\n if(threadId) {\n this.syncDraft(peerId, threadId, draft, false, true);\n } else {\n this.saveDraft({\n peerId,\n threadId,\n draft,\n notify: true,\n force: true\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from './appDocsManager';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport isObject from '../../helpers/object/isObject';\nimport validateInitObject from '../../helpers/object/validateInitObject';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport SearchIndex from '../searchIndex';\nimport stateStorage from '../stateStorage';\nimport {AppManager} from './manager';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\n\ntype EmojiLangPack = {\n keywords: {\n [keyword: string]: string[],\n },\n version: number,\n langCode: string\n};\n\nconst EMOJI_LANG_PACK: EmojiLangPack = {\n keywords: {},\n version: 0,\n langCode: App.langPackCode\n};\n\nconst RECENT_MAX_LENGTH = 32;\n\ntype EmojiType = 'native' | 'custom';\n\nexport class AppEmojiManager extends AppManager {\n private static POPULAR_EMOJI = ['😂', '😘', '❤️', '😍', '😊', '😁', '👍', '☺️', '😔', '😄', '😭', '💋', '😒', '😳', '😜', '🙈', '😉', '😃', '😢', '😝', '😱', '😡', '😏', '😞', '😅', '😚', '🙊', '😌', '😀', '😋', '😆', '👌', '😐', '😕'];\n private keywordLangPacks: {\n [langCode: string]: EmojiLangPack\n } = {};\n\n private index: SearchIndex;\n private indexedLangPacks: {[langCode: string]: boolean} = {};\n\n private getKeywordsPromises: {[langCode: string]: Promise} = {};\n\n private recent: {native?: string[], custom?: DocId[]} = {};\n private getRecentEmojisPromises: {native?: Promise, custom?: Promise} = {};\n\n private getCustomEmojiDocumentsPromise: Promise;\n private getCustomEmojiDocumentPromises: Map> = new Map();\n\n /* public getPopularEmoji() {\n return stateStorage.get('emojis_popular').then((popEmojis) => {\n var result = []\n if (popEmojis && popEmojis.length) {\n for (var i = 0, len = popEmojis.length; i < len; i++) {\n result.push({code: popEmojis[i][0], rate: popEmojis[i][1]})\n }\n callback(result)\n return\n }\n\n return stateStorage.get('emojis_recent').then((recentEmojis) => {\n recentEmojis = recentEmojis || popular || []\n var shortcut\n var code\n for (var i = 0, len = recentEmojis.length; i < len; i++) {\n shortcut = recentEmojis[i]\n if (Array.isArray(shortcut)) {\n shortcut = shortcut[0]\n }\n if (shortcut && typeof shortcut === 'string') {\n if (shortcut.charAt(0) == ':') {\n shortcut = shortcut.substr(1, shortcut.length - 2)\n }\n if (code = shortcuts[shortcut]) {\n result.push({code: code, rate: 1})\n }\n }\n }\n callback(result)\n });\n });\n }\n\n function pushPopularEmoji (code) {\n getPopularEmoji(function (popularEmoji) {\n var exists = false\n var count = popularEmoji.length\n var result = []\n for (var i = 0; i < count; i++) {\n if (popularEmoji[i].code == code) {\n exists = true\n popularEmoji[i].rate++\n }\n result.push([popularEmoji[i].code, popularEmoji[i].rate])\n }\n if (exists) {\n result.sort(function (a, b) {\n return b[1] - a[1]\n })\n } else {\n if (result.length > 41) {\n result = result.slice(0, 41)\n }\n result.push([code, 1])\n }\n ConfigStorage.set({emojis_popular: result})\n })\n } */\n\n public getEmojiKeywords(langCode: string = App.langPackCode) {\n const promise = this.getKeywordsPromises[langCode];\n if(promise) {\n return promise;\n }\n\n const storageKey: any = 'emojiKeywords_' + langCode;\n return this.getKeywordsPromises[langCode] = stateStorage.get(storageKey).then((pack: EmojiLangPack) => {\n if(!isObject(pack)) {\n pack = {} as any;\n }\n\n validateInitObject(EMOJI_LANG_PACK, pack);\n\n // important\n pack.langCode = langCode;\n this.keywordLangPacks[langCode] = pack;\n\n return this.apiManager.invokeApi('messages.getEmojiKeywordsDifference', {\n lang_code: pack.langCode,\n from_version: pack.version\n }).then((keywordsDifference) => {\n pack.version = keywordsDifference.version;\n\n const packKeywords = pack.keywords;\n const keywords = keywordsDifference.keywords;\n for(let i = 0, length = keywords.length; i < length; ++i) {\n const {keyword, emoticons} = keywords[i];\n packKeywords[keyword] = emoticons;\n }\n\n stateStorage.set({\n [storageKey]: pack\n });\n\n return pack;\n }, () => {\n return pack;\n });\n });\n }\n\n public getBothEmojiKeywords() {\n const promises: Promise[] = [\n this.getEmojiKeywords()\n ];\n\n if(this.networkerFactory.language !== App.langPackCode) {\n promises.push(this.getEmojiKeywords(this.networkerFactory.language));\n }\n\n if(!this.recent.native) {\n promises.push(this.getRecentEmojis('native'));\n }\n\n return Promise.all(promises);\n }\n\n private indexEmojis() {\n if(!this.index) {\n this.index = new SearchIndex(undefined, 2);\n }\n\n for(const langCode in this.keywordLangPacks) {\n if(this.indexedLangPacks[langCode]) {\n continue;\n }\n\n const pack = this.keywordLangPacks[langCode];\n const keywords = pack.keywords;\n\n for(const keyword in keywords) {\n const emoticons = keywords[keyword];\n this.index.indexObject(emoticons, keyword);\n }\n\n this.indexedLangPacks[langCode] = true;\n }\n }\n\n public searchEmojis(q: string) {\n this.indexEmojis();\n\n q = q.toLowerCase().replace(/_/g, ' ');\n\n // const perf = performance.now();\n let emojis: Array;\n if(q.trim()) {\n const set = this.index.search(q);\n emojis = Array.from(set).reduce((acc, v) => acc.concat(v), []);\n } else {\n emojis = this.recent.native.concat(AppEmojiManager.POPULAR_EMOJI).slice(0, RECENT_MAX_LENGTH);\n }\n\n emojis = Array.from(new Set(emojis));\n // console.log('searchEmojis', q, 'time', performance.now() - perf);\n\n /* for(let i = 0, length = emojis.length; i < length; ++i) {\n if(emojis[i].includes(zeroWidthJoiner) && !emojis[i].includes('\\ufe0f')) {\n emojis[i] += '\\ufe0f';\n }\n } */\n\n return emojis;\n }\n\n public getRecentEmojis(type: 'custom'): Promise;\n public getRecentEmojis(type: 'native'): Promise;\n public getRecentEmojis(type: T): Promise {\n const promises = this.getRecentEmojisPromises;\n return promises[type] ??= this.appStateManager.getState().then((state) => {\n let recent: string[] | DocId[] = [];\n if(type === 'native') {\n const {recentEmoji} = state;\n recent = Array.isArray(recentEmoji) && recentEmoji.length ? recentEmoji : AppEmojiManager.POPULAR_EMOJI;\n } else {\n const {recentCustomEmoji} = state;\n recent = Array.isArray(recentCustomEmoji) && recentCustomEmoji.length ? recentCustomEmoji : [];\n }\n\n return this.recent[type] = recent as any;\n }) as any;\n }\n\n public pushRecentEmoji(emoji: AppEmoji) {\n const type: EmojiType = emoji.docId ? 'custom' : 'native';\n emoji.emoji = fixEmoji(emoji.emoji);\n // @ts-ignore\n this.getRecentEmojis(type).then((recent) => {\n const i = emoji.docId || emoji.emoji;\n indexOfAndSplice(recent, i);\n recent.unshift(i);\n recent.splice(RECENT_MAX_LENGTH, recent.length - RECENT_MAX_LENGTH);\n\n this.appStateManager.pushToState(type === 'custom' ? 'recentCustomEmoji' : 'recentEmoji', recent);\n this.rootScope.dispatchEvent('emoji_recent', emoji);\n });\n }\n\n public getCustomEmojiDocuments(docIds: DocId[]) {\n if(!docIds.length) return Promise.resolve([] as MyDocument[]);\n return this.apiManager.invokeApi('messages.getCustomEmojiDocuments', {document_id: docIds}).then((documents) => {\n return documents.map((doc) => {\n return this.appDocsManager.saveDoc(doc, {\n type: 'customEmoji',\n docId: doc.id\n });\n });\n });\n }\n\n public getCachedCustomEmojiDocuments(docIds: DocId[]) {\n return docIds.map((docId) => this.appDocsManager.getDoc(docId));\n }\n\n private setDebouncedGetCustomEmojiDocuments() {\n if(this.getCustomEmojiDocumentsPromise || !this.getCustomEmojiDocumentPromises.size) {\n return;\n }\n\n this.getCustomEmojiDocumentsPromise = pause(0).then(() => {\n const allIds = [...this.getCustomEmojiDocumentPromises.keys()];\n const promises: Promise[] = [];\n do {\n const ids = allIds.splice(0, 100);\n const promise = this.getCustomEmojiDocuments(ids).then((docs) => {\n docs.forEach((doc, idx) => {\n const docId = ids[idx];\n const deferred = this.getCustomEmojiDocumentPromises.get(docId);\n this.getCustomEmojiDocumentPromises.delete(docId);\n deferred.resolve(doc);\n });\n });\n\n promises.push(promise);\n } while(allIds.length);\n\n return Promise.all(promises);\n }).finally(() => {\n this.getCustomEmojiDocumentsPromise = undefined;\n this.setDebouncedGetCustomEmojiDocuments();\n });\n }\n\n public getCustomEmojiDocument(id: DocId) {\n let promise = this.getCustomEmojiDocumentPromises.get(id);\n if(promise) {\n return promise;\n }\n\n const doc = this.appDocsManager.getDoc(id);\n if(doc) {\n return doc;\n }\n\n promise = deferredPromise();\n this.getCustomEmojiDocumentPromises.set(id, promise);\n\n this.setDebouncedGetCustomEmojiDocuments();\n\n return promise;\n }\n\n public getCustomEmojis() {\n return this.appStickersManager.getEmojiStickers();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport type GroupCallConnectionInstance from '../calls/groupCallConnectionInstance';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {nextRandomUint} from '../../helpers/random';\nimport {DataJSON, GroupCall, GroupCallParticipant, GroupCallParticipantVideoSourceGroup, InputGroupCall, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update, Updates} from '../../layer';\nimport {logger} from '../logger';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\n\nexport type GroupCallId = GroupCall['id'];\nexport type MyGroupCall = GroupCall | InputGroupCall;\n\nexport type GroupCallConnectionType = 'main' | 'presentation';\n\nexport type JoinGroupCallJsonPayload = {\n fingerprints: {\n fingerprint: string;\n setup: string;\n hash: string;\n }[];\n pwd: string;\n ssrc: number;\n 'ssrc-groups': GroupCallParticipantVideoSourceGroup.groupCallParticipantVideoSourceGroup[];\n ufrag: string;\n};\n\nconst GET_PARTICIPANTS_LIMIT = 100;\n\nexport type GroupCallOutputSource = 'main' | 'presentation' | number;\n\nexport class AppGroupCallsManager extends AppManager {\n private log: ReturnType;\n\n private groupCalls: Map;\n private participants: Map>;\n private nextOffsets: Map;\n\n // private doNotDispatchParticipantUpdate: PeerId;\n\n protected after() {\n this.log = logger('GROUP-CALLS');\n\n this.groupCalls = new Map();\n this.participants = new Map();\n this.nextOffsets = new Map();\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateGroupCall: (update) => {\n this.saveGroupCall(update.call, update.chat_id);\n },\n\n updateGroupCallParticipants: (update) => {\n this.saveGroupCall(update.call);\n\n // this.getGroupCallFull(update.call.id, true); // ! WARNING TEMP\n\n const groupCallId = update.call.id;\n this.saveApiParticipants(groupCallId, update.participants);\n }\n });\n\n this.rootScope.addEventListener('group_call_update', (groupCall) => {\n if(groupCall._ === 'groupCallDiscarded') {\n this.participants.delete(groupCall.id);\n }\n });\n }\n\n public getCachedParticipants(groupCallId: GroupCallId) {\n let participants = this.participants.get(groupCallId);\n if(!participants) {\n this.participants.set(groupCallId, participants = new Map());\n }\n\n return participants;\n }\n\n private prepareToSavingNextOffset(groupCallId: GroupCallId) {\n const nextOffsetsMap = this.nextOffsets;\n\n const setNextOffset = (newNextOffset: string) => {\n if(nextOffsetsMap.get(groupCallId) === nextOffset) {\n nextOffsetsMap.set(groupCallId, newNextOffset);\n }\n };\n\n const nextOffset = nextOffsetsMap.get(groupCallId);\n return {\n nextOffset,\n setNextOffset\n };\n }\n\n public saveApiParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, skipCounterUpdating?: boolean) {\n const participants = this.getCachedParticipants(groupCallId);\n\n const peerId = getPeerId(participant.peer);\n\n const oldParticipant = participants.get(peerId);\n const hasLeft = participant.pFlags.left;\n if(!oldParticipant && hasLeft) {\n return;\n }\n\n // * fix missing flag\n if(!participant.pFlags.muted && !participant.pFlags.can_self_unmute) {\n participant.pFlags.can_self_unmute = true;\n }\n\n if(oldParticipant) {\n safeReplaceObject(oldParticipant, participant);\n participant = oldParticipant;\n } else {\n participants.set(peerId, participant);\n }\n\n // if(!skipCounterUpdating) {\n const groupCall = this.getGroupCall(groupCallId);\n if(groupCall?._ === 'groupCall') {\n let modified = false;\n if(hasLeft) {\n --groupCall.participants_count;\n modified = true;\n } else if(participant.pFlags.just_joined && !oldParticipant && !participant.pFlags.self) {\n ++groupCall.participants_count;\n modified = true;\n }\n\n if(modified) {\n this.rootScope.dispatchEvent('group_call_update', groupCall);\n }\n }\n // }\n\n if(hasLeft) {\n participants.delete(peerId);\n }\n\n if(oldParticipant || true/* && this.doNotDispatchParticipantUpdate !== peerId */) {\n this.rootScope.dispatchEvent('group_call_participant', {\n groupCallId,\n participant\n });\n }\n }\n\n public saveApiParticipants(groupCallId: GroupCallId, apiParticipants: GroupCallParticipant[], skipCounterUpdating?: boolean) {\n if((apiParticipants as any).saved) return;\n (apiParticipants as any).saved = true;\n apiParticipants.forEach((p) => this.saveApiParticipant(groupCallId, p, skipCounterUpdating));\n }\n\n public async editParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, options: Partial<{\n muted: boolean,\n volume: number,\n raiseHand: boolean,\n videoStopped: boolean,\n videoPaused: boolean,\n presentationPaused: boolean\n }>) {\n this.saveApiParticipant(groupCallId, participant);\n\n const peerId = participant.pFlags.self ? NULL_PEER_ID : getPeerId(participant.peer);\n const updates = await this.apiManager.invokeApiSingle('phone.editGroupCallParticipant', {\n call: this.getGroupCallInput(groupCallId),\n participant: peerId === NULL_PEER_ID ? this.appPeersManager.getInputPeerSelf() : this.appPeersManager.getInputPeerById(peerId),\n muted: options.muted,\n volume: options.volume,\n raise_hand: options.raiseHand,\n video_paused: options.videoPaused,\n video_stopped: options.videoStopped,\n presentation_paused: options.presentationPaused\n });\n\n // do not replace with peerId because it can be null\n // if(!processUpdate) this.doNotDispatchParticipantUpdate = getPeerId(participant.peer);\n this.apiUpdatesManager.processUpdateMessage(updates);\n // if(!processUpdate) this.doNotDispatchParticipantUpdate = undefined;\n }\n\n public getGroupCall(id: GroupCallId) {\n return this.groupCalls.get(id);\n }\n\n public async getGroupCallFull(id: GroupCallId, override?: boolean): Promise {\n const call = this.getGroupCall(id);\n if(call && call._ !== 'inputGroupCall' && !override) {\n return call;\n }\n\n const limit = this.getCachedParticipants(id).size ? 0 : GET_PARTICIPANTS_LIMIT;\n return this.apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupCall',\n params: {\n call: this.getGroupCallInput(id),\n limit\n },\n processResult: (groupCall) => {\n // ? maybe I should save group call after participants so I can avoid passing the 'skipCounterUpdating' flag ?\n this.appUsersManager.saveApiUsers(groupCall.users);\n this.appChatsManager.saveApiChats(groupCall.chats);\n this.saveApiParticipants(id, groupCall.participants, true);\n const call = this.saveGroupCall(groupCall.call) as GroupCall;\n\n if(limit && this.nextOffsets.get(id) === undefined) {\n this.nextOffsets.set(id, groupCall.participants_next_offset);\n }\n\n return call;\n }\n });\n }\n\n public saveGroupCall(call: MyGroupCall, chatId?: ChatId) {\n const oldCall = this.groupCalls.get(call.id);\n const shouldUpdate = call._ !== 'inputGroupCall' && (!oldCall || oldCall._ !== 'groupCallDiscarded');\n if(oldCall) {\n if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n }\n\n call = oldCall;\n } else {\n this.groupCalls.set(call.id, call);\n }\n\n if(shouldUpdate) {\n this.rootScope.dispatchEvent('group_call_update', call as any);\n }\n\n return call;\n }\n\n public async createGroupCall(chatId: ChatId, scheduleDate?: number, title?: string) {\n const updates = await this.apiManager.invokeApi('phone.createGroupCall', {\n peer: this.appPeersManager.getInputPeerById(chatId.toPeerId(true)),\n random_id: nextRandomUint(32),\n schedule_date: scheduleDate,\n title\n });\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateGroupCall') as Update.updateGroupCall;\n return update.call;\n }\n\n public getGroupCallInput(id: GroupCallId): InputGroupCall {\n const groupCall = this.getGroupCall(id);\n return {\n _: 'inputGroupCall',\n id: groupCall.id,\n access_hash: groupCall.access_hash\n };\n }\n\n // public generateSelfParticipant(): GroupCallParticipant {\n // const mainSources = this.currentGroupCall.connections.main.sources;\n // const presentationSources = this.currentGroupCall.connections.presentation?.sources;\n // return {\n // _: 'groupCallParticipant',\n // pFlags: {\n // can_self_unmute: true,\n // self: true\n // },\n // source: mainSources.audio.source,\n // video: this.generateSelfVideo(mainSources.video),\n // presentation: presentationSources && this.generateSelfVideo(presentationSources.video, presentationSources.audio?.source),\n // date: tsNow(true),\n // peer: this.appPeersManager.getOutputPeer(rootScope.myId)\n // };\n // }\n\n public async getGroupCallParticipants(id: GroupCallId) {\n const {nextOffset, setNextOffset} = this.prepareToSavingNextOffset(id);\n\n if(nextOffset !== '') {\n await this.apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupParticipants',\n params: {\n call: this.getGroupCallInput(id),\n ids: [],\n sources: [],\n offset: nextOffset || '',\n limit: GET_PARTICIPANTS_LIMIT\n },\n processResult: (groupCallParticipants) => {\n const newNextOffset = groupCallParticipants.count === groupCallParticipants.participants.length ? '' : groupCallParticipants.next_offset;\n\n this.appChatsManager.saveApiChats(groupCallParticipants.chats);\n this.appUsersManager.saveApiUsers(groupCallParticipants.users);\n this.saveApiParticipants(id, groupCallParticipants.participants);\n\n setNextOffset(newNextOffset);\n }\n });\n }\n\n return {\n participants: this.getCachedParticipants(id),\n isEnd: this.nextOffsets.get(id) === ''\n };\n }\n\n public hangUp(id: GroupCallId, discard?: boolean | number) {\n const groupCallInput = this.getGroupCallInput(id);\n let promise: Promise;\n if(typeof(discard) === 'boolean' && discard) {\n promise = this.apiManager.invokeApi('phone.discardGroupCall', {\n call: groupCallInput\n });\n } else if(typeof(discard) === 'number') {\n promise = this.apiManager.invokeApi('phone.leaveGroupCall', {\n call: groupCallInput,\n source: discard\n });\n } else {\n promise = this.apiManager.invokeApi('phone.joinGroupCall', {\n call: groupCallInput,\n join_as: this.appPeersManager.getInputPeerSelf(),\n muted: true,\n video_stopped: true,\n params: {\n _: 'dataJSON',\n data: ''\n }\n });\n }\n\n return promise.then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public async joinGroupCall(groupCallId: GroupCallId, params: DataJSON, options: GroupCallConnectionInstance['options']) {\n const groupCallInput = this.getGroupCallInput(groupCallId);\n let promise: Promise;\n if(options.type === 'main') {\n const request: PhoneJoinGroupCall = {\n call: groupCallInput,\n join_as: this.appPeersManager.getInputPeerSelf(),\n params,\n muted: options.isMuted,\n video_stopped: !options.joinVideo\n };\n\n promise = this.apiManager.invokeApi('phone.joinGroupCall', request);\n this.log(`[api] joinGroupCall id=${groupCallId}`, request);\n } else {\n const request: PhoneJoinGroupCallPresentation = {\n call: groupCallInput,\n params\n };\n\n promise = this.apiManager.invokeApi('phone.joinGroupCallPresentation', request);\n this.log(`[api] joinGroupCallPresentation id=${groupCallId}`, request);\n }\n\n const updates = await promise;\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateGroupCallConnection') as Update.updateGroupCallConnection;\n return update;\n }\n\n public leaveGroupCallPresentation(groupCallId: GroupCallId) {\n return this.apiManager.invokeApi('phone.leaveGroupCallPresentation', {\n call: this.getGroupCallInput(groupCallId)\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputPhoto} from '../../../../layer';\nimport {MyPhoto} from '../../appPhotosManager';\n\nexport default function getPhotoInput(photo: MyPhoto): InputPhoto.inputPhoto {\n return {\n _: 'inputPhoto',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputMedia} from '../../../../layer';\nimport {MyPhoto} from '../../appPhotosManager';\nimport getPhotoInput from './getPhotoInput';\n\nexport default function getPhotoMediaInput(photo: MyPhoto): InputMedia.inputMediaPhoto {\n return {\n _: 'inputMediaPhoto',\n id: getPhotoInput(photo),\n ttl_seconds: 0\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Document, InputMedia} from '../../../../layer';\n\nexport default function getMediaInput(doc: Document.document): InputMedia.inputMediaDocument {\n return {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference\n },\n ttl_seconds: 0\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {MyDocument} from './appDocsManager';\nimport type {MyPhoto} from './appPhotosManager';\nimport type {MyTopPeer} from './appUsersManager';\nimport type {AppMessagesManager, MessageSendingParams} from './appMessagesManager';\nimport {BotInlineResult, GeoPoint, InputGeoPoint, InputMedia, MessageEntity, MessageMedia, MessagesBotResults, ReplyMarkup} from '../../layer';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport {AppManager} from './manager';\nimport getPhotoMediaInput from './utils/photos/getPhotoMediaInput';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport generateQId from './utils/inlineBots/generateQId';\nimport getDocumentMediaInput from './utils/docs/getDocumentMediaInput';\n\nexport class AppInlineBotsManager extends AppManager {\n private inlineResults: {[queryAndResultIds: string]: BotInlineResult} = {};\n private setHash: {\n [botId: UserId]: {\n peerId: PeerId,\n time: number\n }\n } = {};\n\n public getGeoInput(geo: GeoPoint): InputGeoPoint {\n return geo._ === 'geoPoint' ? {\n _: 'inputGeoPoint',\n lat: geo.lat,\n long: geo.long,\n accuracy_radius: geo.accuracy_radius\n } : {\n _: 'inputGeoPointEmpty'\n };\n }\n\n public getInlineResults(peerId: PeerId, botId: BotId, query = '', offset = '', geo?: GeoPoint) {\n return this.apiManager.invokeApi('messages.getInlineBotResults', {\n bot: this.appUsersManager.getUserInput(botId),\n peer: this.appPeersManager.getInputPeerById(peerId),\n query,\n geo_point: geo ? this.getGeoInput(geo) : undefined,\n offset\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then((botResults) => {\n const queryId = botResults.query_id;\n\n /* if(botResults.switch_pm) {\n botResults.switch_pm.rText = wrapRichText(botResults.switch_pm.text, {noLinebreaks: true, noLinks: true});\n } */\n\n botResults.results.forEach((result) => {\n if(result._ === 'botInlineMediaResult') {\n if(result.document) {\n result.document = this.appDocsManager.saveDoc(result.document);\n }\n\n if(result.photo) {\n result.photo = this.appPhotosManager.savePhoto(result.photo);\n }\n }\n\n this.inlineResults[generateQId(queryId, result.id)] = result;\n });\n\n return botResults;\n });\n }\n\n private pushPopularBot(botId: BotId) {\n this.appUsersManager.getTopPeers('bots_inline').then((topPeers) => {\n const botPeerId = botId.toPeerId();\n const index = topPeers.findIndex((topPeer) => topPeer.id === botPeerId);\n let topPeer: MyTopPeer;\n if(index !== -1) {\n topPeer = topPeers[index];\n } else {\n topPeer = {\n id: botPeerId,\n rating: 0\n };\n }\n\n ++topPeer.rating;\n insertInDescendSortedArray(topPeers, topPeer, 'rating');\n\n this.appStateManager.setKeyValueToStorage('topPeersCache');\n\n // rootScope.$broadcast('inline_bots_popular')\n });\n }\n\n public switchToPM(fromPeerId: PeerId, botId: BotId, startParam: string) {\n this.setHash[botId] = {peerId: fromPeerId, time: Date.now()};\n return this.appMessagesManager.startBot(botId, undefined, startParam);\n }\n\n /*\n function resolveInlineMention (username) {\n return AppPeersManager.resolveUsername(username).then(function (peerId) {\n if (peerId.isUser()) {\n var bot = AppUsersManager.getUser(peerId)\n if (bot.pFlags.bot && bot.bot_inline_placeholder !== undefined) {\n var resolvedBot = {\n username: username,\n id: peerId,\n placeholder: bot.bot_inline_placeholder\n }\n if (bot.pFlags.bot_inline_geo &&\n GeoLocationManager.isAvailable()) {\n return checkGeoLocationAccess(peerId).then(function () {\n return GeoLocationManager.getPosition().then(function (coords) {\n resolvedBot.geo = coords\n return qSync.when(resolvedBot)\n })\n })['catch'](function () {\n return qSync.when(resolvedBot)\n })\n }\n return qSync.when(resolvedBot)\n }\n }\n return $q.reject()\n }, function (error) {\n error.handled = true\n return $q.reject(error)\n })\n }\n\n function regroupWrappedResults (results, rowW, rowH) {\n if (!results ||\n !results[0] ||\n ['photo', 'gif', 'sticker'].indexOf(results[0].type) === -1) {\n return\n }\n var ratios = []\n angular.forEach(results, function (result) {\n var w\n var h, doc\n var photo\n if (result._ === 'botInlineMediaResult') {\n if (doc = result.document) {\n w = result.document.w\n h = result.document.h\n }\n else if (photo = result.photo) {\n var photoSize = (photo.sizes || [])[0]\n w = photoSize && photoSize.w\n h = photoSize && photoSize.h\n }\n }else {\n w = result.w\n h = result.h\n }\n if (!w || !h) {\n w = h = 1\n }\n ratios.push(w / h)\n })\n\n var rows = []\n var curCnt = 0\n var curW = 0\n angular.forEach(ratios, function (ratio) {\n var w = ratio * rowH\n curW += w\n if (!curCnt || curCnt < 4 && curW < (rowW * 1.1)) {\n curCnt++\n } else {\n rows.push(curCnt)\n curCnt = 1\n curW = w\n }\n })\n if (curCnt) {\n rows.push(curCnt)\n }\n\n var i = 0\n var thumbs = []\n var lastRowI = rows.length - 1\n angular.forEach(rows, function (rowCnt, rowI) {\n var lastRow = rowI === lastRowI\n var curRatios = ratios.slice(i, i + rowCnt)\n var sumRatios = 0\n angular.forEach(curRatios, function (ratio) {\n sumRatios += ratio\n })\n angular.forEach(curRatios, function (ratio, j) {\n var thumbH = rowH\n var thumbW = rowW * ratio / sumRatios\n var realW = thumbH * ratio\n if (lastRow && thumbW > realW) {\n thumbW = realW\n }\n var result = results[i + j]\n result.thumbW = Math.floor(thumbW) - 2\n result.thumbH = Math.floor(thumbH) - 2\n })\n\n i += rowCnt\n })\n } */\n\n public async checkSwitchReturn(botId: BotId) {\n const bot = this.appUsersManager.getUser(botId);\n if(!bot || !bot.pFlags.bot || !bot.bot_inline_placeholder) {\n return;\n }\n\n const peerData = this.setHash[botId];\n if(peerData) {\n delete this.setHash[botId];\n if((Date.now() - peerData.time) < 3600e3) {\n return peerData.peerId;\n }\n }\n }\n\n public switchInlineQuery(peerId: PeerId, threadId: number, botId: BotId, query: string) {\n this.appDraftsManager.setDraft(peerId, threadId, '@' + this.appPeersManager.getPeerUsername(botId.toPeerId()) + ' ' + query);\n }\n\n public callbackButtonClick(peerId: PeerId, mid: number, button: any) {\n return this.apiManager.invokeApi('messages.getBotCallbackAnswer', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid),\n data: button.data\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true});\n }\n\n /* function gameButtonClick (id) {\n var message = AppMessagesManager.getMessage(id)\n var peerId = AppMessagesManager.getMessagePeer(message)\n\n return MtpApiManager.invokeApi('messages.getBotCallbackAnswer', {\n peer: AppPeersManager.getInputPeerByID(peerId),\n msg_id: AppMessagesIDsManager.getMessageLocalID(id)\n }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (callbackAnswer) {\n if (typeof callbackAnswer.message === 'string' &&\n callbackAnswer.message.length) {\n showCallbackMessage(callbackAnswer.message, callbackAnswer.pFlags.alert)\n }\n else if (typeof callbackAnswer.url === 'string') {\n AppGamesManager.openGame(message.media.game.id, id, callbackAnswer.url)\n }\n })\n } */\n\n public sendInlineResult(peerId: PeerId, botId: BotId, queryAndResultIds: string, options: MessageSendingParams & Partial<{\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n replyMarkup: ReplyMarkup,\n entities: MessageEntity[],\n clearDraft: true,\n geoPoint: GeoPoint\n }> = {}) {\n const inlineResult = this.inlineResults[queryAndResultIds];\n if(!inlineResult) {\n return;\n }\n\n this.pushPopularBot(botId);\n const splitted = queryAndResultIds.split('_');\n const queryID = splitted.shift();\n const resultID = splitted.join('_');\n options.viaBotId = botId;\n options.queryId = queryID;\n options.resultId = resultID;\n if(inlineResult.send_message.reply_markup) {\n options.replyMarkup = inlineResult.send_message.reply_markup;\n }\n\n if(inlineResult.send_message._ === 'botInlineMessageText') {\n options.entities = inlineResult.send_message.entities;\n this.appMessagesManager.sendText(peerId, inlineResult.send_message.message, options);\n } else {\n let caption = '';\n let inputMedia: Parameters[1], messageMedia: MessageMedia;\n const sendMessage = inlineResult.send_message;\n switch(sendMessage._) {\n case 'botInlineMessageMediaAuto': {\n caption = sendMessage.message;\n\n if(inlineResult._ === 'botInlineMediaResult') {\n const {document, photo} = inlineResult;\n if(document) {\n inputMedia = getDocumentMediaInput(document as MyDocument);\n } else {\n inputMedia = getPhotoMediaInput(photo as MyPhoto);\n }\n }\n\n break;\n }\n\n case 'botInlineMessageMediaGeo': {\n inputMedia = {\n _: 'inputMediaGeoPoint',\n geo_point: this.getGeoInput(sendMessage.geo)\n };\n\n options.geoPoint = sendMessage.geo;\n\n break;\n }\n\n case 'botInlineMessageMediaVenue': {\n inputMedia = {\n _: 'inputMediaVenue',\n geo_point: this.getGeoInput(sendMessage.geo),\n title: sendMessage.title,\n address: sendMessage.address,\n provider: sendMessage.provider,\n venue_id: sendMessage.venue_id,\n venue_type: sendMessage.venue_type\n };\n\n options.geoPoint = sendMessage.geo;\n\n break;\n }\n\n case 'botInlineMessageMediaContact': {\n inputMedia = {\n _: 'inputMediaContact',\n phone_number: sendMessage.phone_number,\n first_name: sendMessage.first_name,\n last_name: sendMessage.last_name,\n vcard: sendMessage.vcard\n };\n\n break;\n }\n\n case 'botInlineMessageMediaInvoice': {\n // const photo = sendMessage.photo;\n // inputMedia = {\n // _: 'inputMediaInvoice',\n // description: sendMessage.description,\n // title: sendMessage.title,\n // photo: photo && {\n // _: 'inputWebDocument',\n // attributes: photo.attributes,\n // mime_type: photo.mime_type,\n // size: photo.size,\n // url: photo.url\n // },\n // invoice: undefined,\n // payload: undefined,\n // provider: undefined,\n // provider_data: undefined,\n // start_param: undefined\n // };\n\n messageMedia = {\n _: 'messageMediaInvoice',\n title: sendMessage.title,\n description: sendMessage.description,\n photo: sendMessage.photo,\n currency: sendMessage.currency,\n total_amount: sendMessage.total_amount,\n pFlags: {\n shipping_address_requested: sendMessage.pFlags.shipping_address_requested,\n test: sendMessage.pFlags.test\n },\n start_param: undefined\n };\n\n break;\n }\n }\n\n if(!inputMedia && messageMedia) {\n inputMedia = {\n _: 'messageMediaPending',\n messageMedia\n };\n }\n\n this.appMessagesManager.sendOther(peerId, inputMedia, options);\n }\n }\n\n /* function checkGeoLocationAccess (botID) {\n var key = 'bot_access_geo' + botID\n return Storage.get(key).then(function (geoAccess) {\n if (geoAccess && geoAccess.granted) {\n return true\n }\n return ErrorService.confirm({\n type: 'BOT_ACCESS_GEO_INLINE'\n }).then(function () {\n var setHash = {}\n setHash[key] = {granted: true, time: tsNow()}\n Storage.set(setHash)\n return true\n }, function () {\n var setHash = {}\n setHash[key] = {denied: true, time: tsNow()}\n Storage.set(setHash)\n return $q.reject()\n })\n })\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MESSAGE_ID_INCREMENT} from './utils/messageId';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\nexport class AppMessagesIdsManager {\n private tempNum = 0;\n\n public generateTempMessageId(messageId: number) {\n const num = ++this.tempNum;\n return generateMessageId(messageId) + (num & (MESSAGE_ID_INCREMENT - 1));\n }\n}\n","export default function splitStringByLength(str: string, maxLength: number) {\n if(str.length < maxLength) return [str];\n let length = 0, lastSliceStartIndex = 0, arrayIndex = 0;\n const delimiter = ' ';// '\\n';\n const out: string[] = [];\n\n const cut = (end?: number) => {\n let part = str.slice(lastSliceStartIndex, end);\n const _arrayIndex = arrayIndex++;\n if(part.length > maxLength) {\n const overflowPart = part.slice(maxLength);\n const splitted = splitStringByLength(overflowPart, maxLength);\n splitted.forEach((part) => {\n out[arrayIndex++] = part;\n });\n\n part = part.slice(0, maxLength);\n }\n\n lastSliceStartIndex = end;\n length = 0;\n out[_arrayIndex] = (out[_arrayIndex] || '') + part;\n };\n\n let lastIndex = 0;\n do {\n let index = str.indexOf(delimiter, lastIndex);\n if(index === -1) {\n if(lastIndex !== (str.length - 1)) {\n cut();\n }\n\n break;\n }\n\n index += delimiter.length;\n\n const partLength = index - lastIndex;\n if((length + partLength) > maxLength) {\n cut(length);\n }\n\n lastIndex = index;\n length += partLength;\n } while(true);\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {TabState} from '../mtproto/mtprotoworker';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\n\ntype Tab = {\n source: MessageEventSource,\n state: TabState\n};\n\nexport class AppTabsManager {\n private tabs: Map;\n\n constructor() {\n this.tabs = new Map();\n }\n\n public start() {\n const port = MTProtoMessagePort.getInstance();\n\n port.addEventListener('tabState', (state, source) => {\n const tab = this.tabs.get(source);\n tab.state = state;\n });\n }\n\n public getTabs() {\n return [...this.tabs.values()].filter((tab) => !!tab.state);\n }\n\n public addTab(source: MessageEventSource) {\n const tab: Tab = {\n source,\n state: undefined\n };\n\n this.tabs.set(source, tab);\n }\n\n public deleteTab(source: MessageEventSource) {\n this.tabs.delete(source);\n }\n}\n\nconst appTabsManager = new AppTabsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appTabsManager = appTabsManager);\nexport default appTabsManager;\n","import {InputDocument} from '../../../../layer';\nimport type {MyDocument} from '../../appDocsManager';\n\nexport default function getDocumentInput(doc: MyDocument): InputDocument {\n return {\n _: 'inputDocument',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference\n };\n}\n","export default function setBooleanFlag(obj: T, key: keyof T, value: boolean) {\n // @ts-ignore\n if(value) obj[key] = true;\n else delete obj[key];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport LazyLoadQueueBase from '../../components/lazyLoadQueueBase';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport tsNow from '../../helpers/tsNow';\nimport {randomLong} from '../../helpers/random';\nimport {Chat, ChatFull, Dialog as MTDialog, DialogPeer, DocumentAttribute, InputMedia, InputMessage, InputPeerNotifySettings, InputSingleMedia, Message, MessageAction, MessageEntity, MessageFwdHeader, MessageMedia, MessageReplies, MessageReplyHeader, MessagesDialogs, MessagesFilter, MessagesMessages, MethodDeclMap, NotifyPeer, PeerNotifySettings, PhotoSize, SendMessageAction, Update, Photo, Updates, ReplyMarkup, InputPeer, InputPhoto, InputDocument, InputGeoPoint, WebPage, GeoPoint, ReportReason, MessagesGetDialogs, InputChannel, InputDialogPeer, ReactionCount, MessagePeerReaction, MessagesSearchCounter, Peer, MessageReactions, Document, InputFile, Reaction, ForumTopic as MTForumTopic, MessagesForumTopics, MessagesGetReplies, MessagesGetHistory, MessagesAffectedHistory, UrlAuthResult} from '../../layer';\nimport {ArgumentTypes, InvokeApiOptions} from '../../types';\nimport {logger, LogTypes} from '../logger';\nimport type {ApiFileManager} from '../mtproto/apiFileManager';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport DialogsStorage, {GLOBAL_FOLDER_ID} from '../storages/dialogs';\nimport {ChatRights} from './appChatsManager';\nimport {MyDocument} from './appDocsManager';\nimport {MyPhoto} from './appPhotosManager';\nimport {getFileNameByLocation} from '../../helpers/fileName';\nimport DEBUG from '../../config/debug';\nimport SlicedArray, {Slice, SliceEnd} from '../../helpers/slicedArray';\nimport {FOLDER_ID_ALL, GENERAL_TOPIC_ID, MUTE_UNTIL, NULL_PEER_ID, REAL_FOLDER_ID, REPLIES_HIDDEN_CHANNEL_ID, REPLIES_PEER_ID, SERVICE_PEER_ID, THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n// import telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport {getMiddleware} from '../../helpers/middleware';\nimport assumeType from '../../helpers/assumeType';\nimport copy from '../../helpers/object/copy';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport splitStringByLength from '../../helpers/string/splitStringByLength';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {AppManager} from './manager';\nimport type {MediaSize} from '../../helpers/mediaSize';\nimport getPhotoMediaInput from './utils/photos/getPhotoMediaInput';\nimport getPhotoDownloadOptions from './utils/photos/getPhotoDownloadOptions';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport mergeEntities from '../richTextProcessor/mergeEntities';\nimport parseEntities from '../richTextProcessor/parseEntities';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport filterMessagesByInputFilter from './utils/messages/filterMessagesByInputFilter';\nimport ctx from '../../environment/ctx';\nimport {getEnvironment} from '../../environment/utils';\nimport getDialogIndex from './utils/dialogs/getDialogIndex';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport getDocumentMediaInput from './utils/docs/getDocumentMediaInput';\nimport getDocumentInputFileName from './utils/docs/getDocumentInputFileName';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport type {Progress} from './appDownloadManager';\nimport noop from '../../helpers/noop';\nimport appTabsManager from './appTabsManager';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport getAlbumText from './utils/messages/getAlbumText';\nimport pause from '../../helpers/schedulers/pause';\nimport makeError from '../../helpers/makeError';\nimport getStickerEffectThumb from './utils/stickers/getStickerEffectThumb';\nimport getDocumentInput from './utils/docs/getDocumentInput';\nimport reactionsEqual from './utils/reactions/reactionsEqual';\nimport getPeerActiveUsernames from './utils/peers/getPeerActiveUsernames';\nimport {BroadcastEvents} from '../rootScope';\nimport setBooleanFlag from '../../helpers/object/setBooleanFlag';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\n\n// console.trace('include');\n// TODO: если удалить диалог находясь в папке, то он не удалится из папки и будет виден в настройках\n\nconst APITIMEOUT = 0;\nconst DO_NOT_READ_HISTORY = false;\n\nexport type SendFileDetails = {\n file: File | Blob | MyDocument,\n} & Partial<{\n duration: number,\n width: number,\n height: number,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n strippedBytes: PhotoSize.photoStrippedSize['bytes'],\n spoiler: boolean\n}>;\n\nexport type HistoryStorage = {\n count: number | null,\n history: SlicedArray,\n\n maxId?: number,\n readPromise?: Promise,\n readMaxId?: number,\n readOutboxMaxId?: number,\n triedToReadMaxId?: number,\n\n maxOutId?: number,\n replyMarkup?: Exclude\n};\n\nexport type HistoryResult = {\n count: number,\n history: number[],\n isEnd: ReturnType['getEnds']>,\n offsetIdOffset?: number,\n};\n\nexport type Dialog = MTDialog.dialog;\nexport type ForumTopic = MTForumTopic.forumTopic;\n\nexport type MyMessage = Message.message | Message.messageService;\nexport type MyInputMessagesFilter = 'inputMessagesFilterEmpty'\n | 'inputMessagesFilterPhotos'\n | 'inputMessagesFilterPhotoVideo'\n | 'inputMessagesFilterVideo'\n | 'inputMessagesFilterDocument'\n | 'inputMessagesFilterVoice'\n | 'inputMessagesFilterRoundVoice'\n | 'inputMessagesFilterRoundVideo'\n | 'inputMessagesFilterMusic'\n | 'inputMessagesFilterUrl'\n | 'inputMessagesFilterMyMentions'\n | 'inputMessagesFilterChatPhotos'\n | 'inputMessagesFilterPinned';\n\nexport type PinnedStorage = Partial<{\n promise: Promise,\n count: number,\n maxId: number\n}>;\nexport type MessagesStorage = Map & {peerId: PeerId, type: MessagesStorageType, key: MessagesStorageKey};\nexport type MessagesStorageType = 'scheduled' | 'history' | 'grouped';\nexport type MessagesStorageKey = `${PeerId}_${MessagesStorageType}`;\n\nexport type MyMessageActionType = Message.messageService['action']['_'];\n\ntype PendingAfterMsg = Partial;\n\ntype MapValueType = A extends Map ? V : never;\n\nexport type BatchUpdates = {\n 'messages_reactions': AppMessagesManager['batchUpdateReactions'],\n 'messages_views': AppMessagesManager['batchUpdateViews']\n};\n\ntype PendingMessageDetails = {\n peerId: PeerId,\n tempId: number,\n threadId: number,\n storage: MessagesStorage,\n sequential?: boolean\n};\n\nconst processAfter = (cb: () => void) => {\n // setTimeout(cb, 0);\n cb();\n};\n\nconst UPDATE_STICKERSET_ORDER = true;\n\nexport type MessageSendingParams = Partial<{\n threadId: number,\n replyToMsgId: number,\n scheduleDate: number,\n silent: boolean,\n sendAsPeerId: number,\n}>;\n\nexport class AppMessagesManager extends AppManager {\n private messagesStorageByPeerId: {[peerId: string]: MessagesStorage};\n private groupedMessagesStorage: {[groupId: string]: MessagesStorage}; // will be used for albums\n private scheduledMessagesStorage: {[peerId: PeerId]: MessagesStorage};\n private historiesStorage: {\n [peerId: PeerId]: HistoryStorage\n };\n private threadsStorage: {\n [peerId: PeerId]: {\n [threadId: string]: HistoryStorage\n }\n };\n private searchesStorage: {\n [peerId: PeerId]: Partial<{\n [inputFilter in MyInputMessagesFilter]: {\n count?: number,\n history: number[]\n }\n }>\n };\n private pinnedMessages: {[key: string]: PinnedStorage};\n\n private threadsServiceMessagesIdsStorage: {[peerId_threadId: string]: number};\n private threadsToReplies: {\n [peerId_threadId: string]: string;\n };\n\n private pendingByRandomId: {\n [randomId: string]: PendingMessageDetails\n } = {};\n private pendingByMessageId: {[mid: string]: Long} = {};\n private pendingAfterMsgs: {[peerId: PeerId]: PendingAfterMsg} = {};\n public pendingTopMsgs: {[peerId: PeerId]: number} = {};\n private tempFinalizeCallbacks: {\n [tempId: string]: {\n [callbackName: string]: Partial<{\n deferred: CancellablePromise,\n callback: (message: MyMessage) => Promise\n }>\n }\n } = {};\n\n private sendSmthLazyLoadQueue = new LazyLoadQueueBase(10);\n\n private needSingleMessages: Map>> = new Map();\n private fetchSingleMessagesPromise: Promise;\n private extendedMedia: Map>> = new Map();\n\n private maxSeenId = 0;\n\n public migratedFromTo: {[peerId: PeerId]: PeerId} = {};\n public migratedToFrom: {[peerId: PeerId]: PeerId} = {};\n\n private newDialogsHandlePromise: Promise;\n private newDialogsToHandle: Map}> = new Map();\n public newUpdatesAfterReloadToHandle: {[key: string]: Set} = {};\n\n private notificationsHandlePromise: number;\n private notificationsToHandle: {[key: string]: {\n fwdCount: number,\n fromId: PeerId,\n topMessage?: MyMessage\n }} = {};\n\n private reloadConversationsPromise: Promise;\n private reloadConversationsPeers: Map}> = new Map();\n\n public log = logger('MESSAGES', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\n\n private groupedTempId = 0;\n\n private typings: {[key: string]: {action: SendMessageAction, timeout?: number}} = {};\n\n private middleware: ReturnType;\n\n private unreadMentions: {[key: string]: SlicedArray} = {};\n private goToNextMentionPromises: {[key: string]: Promise} = {};\n\n private batchUpdates: {\n [k in keyof BatchUpdates]?: {\n callback: BatchUpdates[k],\n batch: ArgumentTypes[0]\n }\n } = {};\n private batchUpdatesDebounced: () => Promise;\n\n private uploadFilePromises: {[fileName: string]: CancellablePromise};\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateMessageID: this.onUpdateMessageId,\n\n updateNewDiscussionMessage: this.onUpdateNewMessage,\n updateNewMessage: this.onUpdateNewMessage,\n updateNewChannelMessage: this.onUpdateNewMessage,\n\n updateDialogUnreadMark: this.onUpdateDialogUnreadMark,\n\n updateEditMessage: this.onUpdateEditMessage,\n updateEditChannelMessage: this.onUpdateEditMessage,\n\n updateMessageReactions: this.onUpdateMessageReactions,\n\n updateReadChannelDiscussionInbox: this.onUpdateReadHistory,\n updateReadChannelDiscussionOutbox: this.onUpdateReadHistory,\n updateReadHistoryInbox: this.onUpdateReadHistory,\n updateReadHistoryOutbox: this.onUpdateReadHistory,\n updateReadChannelInbox: this.onUpdateReadHistory,\n updateReadChannelOutbox: this.onUpdateReadHistory,\n\n updateChannelReadMessagesContents: this.onUpdateReadMessagesContents,\n updateReadMessagesContents: this.onUpdateReadMessagesContents,\n\n updateChannelAvailableMessages: this.onUpdateChannelAvailableMessages,\n\n updateDeleteMessages: this.onUpdateDeleteMessages,\n updateDeleteChannelMessages: this.onUpdateDeleteMessages,\n\n updateChannel: this.onUpdateChannel,\n\n updateChannelReload: this.onUpdateChannelReload,\n\n updateChannelMessageViews: this.onUpdateChannelMessageViews,\n\n updateServiceNotification: this.onUpdateServiceNotification,\n\n updatePinnedMessages: this.onUpdatePinnedMessages,\n updatePinnedChannelMessages: this.onUpdatePinnedMessages,\n\n updateNotifySettings: this.onUpdateNotifySettings,\n\n updateNewScheduledMessage: this.onUpdateNewScheduledMessage,\n\n updateDeleteScheduledMessages: this.onUpdateDeleteScheduledMessages,\n\n updateMessageExtendedMedia: this.onUpdateMessageExtendedMedia\n });\n\n // ! Invalidate notify settings, can optimize though\n this.rootScope.addEventListener('notify_peer_type_settings', ({key, settings}) => {\n const dialogs = this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1));\n let filterFunc: (dialog: typeof dialogs[0]) => boolean;\n if(key === 'notifyUsers') filterFunc = (dialog) => dialog.peerId.isUser();\n else if(key === 'notifyBroadcasts') filterFunc = (dialog) => this.appPeersManager.isBroadcast(dialog.peerId);\n else filterFunc = (dialog) => this.appPeersManager.isAnyGroup(dialog.peerId);\n\n dialogs\n .filter(filterFunc)\n .forEach((dialog) => {\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\n });\n });\n\n this.rootScope.addEventListener('webpage_updated', ({id, msgs}) => {\n msgs.forEach(({peerId, mid, isScheduled}) => {\n const storage = isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n if(!message) return;\n message.media = {\n _: 'messageMediaWebPage',\n webpage: this.appWebPagesManager.getCachedWebPage(id)\n };\n\n this.rootScope.dispatchEvent('message_edit', {\n storageKey: storage.key,\n peerId,\n mid,\n message\n });\n });\n });\n\n this.rootScope.addEventListener('draft_updated', ({peerId, threadId, draft}) => {\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, threadId);\n if(dialog) {\n dialog.draft = draft;\n\n let drop = false;\n if(!draft && !getServerMessageId(dialog.top_message)) {\n this.dialogsStorage.dropDialog(peerId);\n drop = true;\n } else {\n this.dialogsStorage.generateIndexForDialog(dialog);\n this.dialogsStorage.pushDialog({dialog});\n }\n\n this.rootScope.dispatchEvent('dialog_draft', {\n peerId,\n dialog,\n drop,\n draft\n });\n } else if(threadId) {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n if(!chat) {\n this.reloadConversation(peerId);\n } else if((chat as Chat.channel).pFlags.forum) {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n }\n } else {\n this.reloadConversation(peerId);\n }\n });\n\n this.rootScope.addEventListener('poll_update', ({poll}) => {\n const set = this.appPollsManager.pollToMessages[poll.id];\n if(set) {\n for(const key of set) {\n const [peerId, mid] = key.split('_');\n\n const message = this.getMessageByPeer(peerId.toPeerId(), +mid);\n if(message) {\n this.setDialogToStateIfMessageIsTop(message);\n }\n }\n }\n });\n\n // * clear forum cache\n this.rootScope.addEventListener('chat_toggle_forum', ({chatId, enabled}) => {\n const peerId = chatId.toPeerId(true);\n if(!enabled) {\n delete this.threadsStorage[peerId];\n\n for(const key in this.pinnedMessages) {\n if(+key === peerId && key.startsWith(peerId + '_')) {\n delete this.pinnedMessages[key];\n }\n }\n }\n });\n\n this.batchUpdatesDebounced = debounce(() => {\n for(const event in this.batchUpdates) {\n const details = this.batchUpdates[event as keyof BatchUpdates];\n delete this.batchUpdates[event as keyof BatchUpdates];\n\n // @ts-ignore\n const result = details.callback(details.batch);\n if(result && (!(result instanceof Array) || result.length)) {\n // @ts-ignore\n rootScope.dispatchEvent(event as keyof BatchUpdates, result);\n }\n }\n }, 33, false, true);\n\n return this.appStateManager.getState().then((state) => {\n if(state.maxSeenMsgId) {\n this.maxSeenId = state.maxSeenMsgId;\n }\n });\n }\n\n public clear = (init?: boolean) => {\n if(this.middleware) {\n this.middleware.clean();\n } else {\n this.middleware = getMiddleware();\n this.uploadFilePromises = {};\n }\n\n this.messagesStorageByPeerId = {};\n this.groupedMessagesStorage = {};\n this.scheduledMessagesStorage = {};\n this.historiesStorage = {};\n this.threadsStorage = {};\n this.searchesStorage = {};\n this.pinnedMessages = {};\n this.threadsServiceMessagesIdsStorage = {};\n this.threadsToReplies = {};\n\n this.dialogsStorage && this.dialogsStorage.clear(init);\n this.filtersStorage && this.filtersStorage.clear(init);\n };\n\n public getInputEntities(entities: MessageEntity[]) {\n const sendEntites = copy(entities);\n sendEntites.forEach((entity) => {\n if(entity._ === 'messageEntityMentionName') {\n (entity as any as MessageEntity.inputMessageEntityMentionName)._ = 'inputMessageEntityMentionName';\n (entity as any as MessageEntity.inputMessageEntityMentionName).user_id = this.appUsersManager.getUserInput(entity.user_id);\n }\n });\n return sendEntites;\n }\n\n public invokeAfterMessageIsSent(tempId: number, callbackName: string, callback: (message: MyMessage) => Promise) {\n const finalize = this.tempFinalizeCallbacks[tempId] ??= {};\n const obj = finalize[callbackName] ??= {deferred: deferredPromise()};\n\n obj.callback = callback;\n\n return obj.deferred;\n }\n\n public editMessage(message: any, text: string, options: Partial<{\n noWebPage: true,\n newMedia: any,\n scheduleDate: number,\n entities: MessageEntity[]\n }> = {}): Promise {\n /* if(!this.canEditMessage(messageId)) {\n return Promise.reject({type: 'MESSAGE_EDIT_FORBIDDEN'});\n } */\n\n const {mid, peerId} = message;\n\n if(message.pFlags.is_outgoing) {\n return this.invokeAfterMessageIsSent(mid, 'edit', (message) => {\n // this.log('invoke editMessage callback', message);\n return this.editMessage(message, text, options);\n });\n }\n\n const entities = options.entities || [];\n if(text) {\n text = parseMarkdown(text, entities);\n }\n\n const schedule_date = options.scheduleDate || (message.pFlags.is_scheduled ? message.date : undefined);\n return this.apiManager.invokeApi('messages.editMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: message.id,\n message: text,\n media: options.newMedia,\n entities: entities.length ? this.getInputEntities(entities) : undefined,\n no_webpage: options.noWebPage,\n schedule_date\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n this.log.error('editMessage error:', error);\n\n if(error && error.type === 'MESSAGE_NOT_MODIFIED') {\n error.handled = true;\n return;\n }\n if(error && error.type === 'MESSAGE_EMPTY') {\n error.handled = true;\n }\n return Promise.reject(error);\n });\n }\n\n public async sendText(peerId: PeerId, text: string, options: MessageSendingParams & Partial<{\n entities: MessageEntity[],\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n noWebPage: true,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n webPage: WebPage,\n }> = {}): Promise {\n if(!text.trim()) {\n return;\n }\n\n options.entities ??= [];\n\n // this.checkSendOptions(options);\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n const config = await this.apiManager.getConfig();\n const MAX_LENGTH = config.message_length_max;\n const splitted = splitStringByLength(text, MAX_LENGTH);\n text = splitted[0];\n if(splitted.length > 1) {\n if(options.webPage?._ === 'webPage' && !text.includes(options.webPage.url)) {\n delete options.webPage;\n }\n }\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n const entities = options.entities;\n if(!options.viaBotId) {\n text = parseMarkdown(text, entities);\n // entities = mergeEntities(entities, parseEntities(text));\n }\n\n let sendEntites = this.getInputEntities(entities);\n if(!sendEntites.length) {\n sendEntites = undefined;\n }\n\n const message = this.generateOutgoingMessage(peerId, options);\n message.entities = entities;\n message.message = text;\n\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n const isChannel = this.appPeersManager.isChannel(peerId);\n\n if(options.webPage) {\n message.media = {\n _: 'messageMediaWebPage',\n webpage: options.webPage\n };\n }\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n toggleError();\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n let apiPromise: any;\n if(options.viaBotId) {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendMessage', {\n no_webpage: options.noWebPage,\n peer: this.appPeersManager.getInputPeerById(peerId),\n message: text,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n entities: sendEntites,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate || undefined,\n silent: options.silent,\n send_as: sendAs,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\n }, sentRequestOptions);\n }\n\n /* function is(value: any, condition: boolean): value is T {\n return condition;\n } */\n\n // this.log('sendText', message.mid);\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates: Updates) => {\n // this.log('sendText sent', message.mid);\n // if(is(updates, updates._ === 'updateShortSentMessage')) {\n if(updates._ === 'updateShortSentMessage') {\n // assumeType(updates);\n\n // * fix copying object with promise\n const promise = message.promise;\n delete message.promise;\n const newMessage = copy(message);\n defineNotNumerableProperties(message, ['promise']);\n message.promise = promise;\n\n newMessage.date = updates.date;\n newMessage.id = updates.id;\n newMessage.media = updates.media;\n newMessage.entities = updates.entities;\n this.wrapMessageEntities(newMessage);\n if(updates.pFlags.out) {\n newMessage.pFlags.out = true;\n }\n\n // * override with new updates\n updates = {\n _: 'updates',\n users: [],\n chats: [],\n seq: 0,\n date: undefined,\n updates: [{\n _: 'updateMessageID',\n random_id: message.random_id,\n id: newMessage.id\n }, {\n _: options.scheduleDate ? 'updateNewScheduledMessage' : (isChannel ? 'updateNewChannelMessage' : 'updateNewMessage'),\n message: newMessage,\n pts: updates.pts,\n pts_count: updates.pts_count\n }]\n };\n } else if((updates as Updates.updates).updates) {\n (updates as Updates.updates).updates.forEach((update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n\n // this.reloadConversation(peerId);\n\n // setTimeout(() => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n // }, 5000);\n message.promise.resolve();\n }, (error: ApiError) => {\n toggleError(error);\n message.promise.reject(error);\n throw error;\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined,\n threadId: options.threadId,\n clearDraft: options.clearDraft,\n sequential: true\n });\n\n const promises: ReturnType[] = [message.promise];\n for(let i = 1; i < splitted.length; ++i) {\n promises.push(this.sendText(peerId, splitted[i], options));\n }\n\n return Promise.all(promises).then(noop);\n }\n\n public sendFile(peerId: PeerId, options: MessageSendingParams & SendFileDetails & Partial<{\n isRoundMessage: boolean,\n isVoiceMessage: boolean,\n isGroupedItem: boolean,\n isMedia: boolean,\n\n groupId: string,\n caption: string,\n entities: MessageEntity[],\n background: boolean,\n clearDraft: boolean,\n noSound: boolean,\n\n waveform: Uint8Array,\n\n // ! only for internal use\n processAfter?: typeof processAfter\n }>) {\n const file = options.file;\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n // this.checkSendOptions(options);\n\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let attachType: 'document' | 'audio' | 'video' | 'voice' | 'photo', apiFileName: string;\n\n const fileType = 'mime_type' in file ? file.mime_type : file.type;\n const fileName = file instanceof File ? file.name : '';\n const isDocument = !(file instanceof File) && !(file instanceof Blob);\n let caption = options.caption || '';\n\n this.log('sendFile', file, fileType);\n\n const entities = options.entities || [];\n if(caption) {\n caption = parseMarkdown(caption, entities);\n }\n\n const attributes: DocumentAttribute[] = [];\n\n const isPhoto = getEnvironment().IMAGE_MIME_TYPES_SUPPORTED.has(fileType);\n\n const strippedPhotoSize: PhotoSize.photoStrippedSize = options.strippedBytes && {\n _: 'photoStrippedSize',\n bytes: options.strippedBytes,\n type: 'i'\n };\n\n let photo: MyPhoto, document: MyDocument;\n\n let actionName: Extract;\n if(isDocument) { // maybe it's a sticker or gif\n attachType = 'document';\n apiFileName = '';\n } else if(fileType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(fileType) >= 0) {\n attachType = 'audio';\n apiFileName = 'audio.' + (fileType.split('/')[1] === 'ogg' ? 'ogg' : 'mp3');\n actionName = 'sendMessageUploadAudioAction';\n\n if(options.isVoiceMessage) {\n attachType = 'voice';\n message.pFlags.media_unread = true;\n }\n\n const attribute: DocumentAttribute.documentAttributeAudio = {\n _: 'documentAttributeAudio',\n pFlags: {\n voice: options.isVoiceMessage || undefined\n },\n waveform: options.waveform,\n duration: options.duration || 0\n };\n\n attributes.push(attribute);\n } else if(!options.isMedia) {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n } else if(isPhoto) {\n attachType = 'photo';\n apiFileName = 'photo.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadPhotoAction';\n\n const photoSize = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: THUMB_TYPE_FULL,\n location: null,\n size: file.size\n } as PhotoSize.photoSize;\n\n photo = {\n _: 'photo',\n id: '' + message.id,\n sizes: [photoSize],\n w: options.width,\n h: options.height\n } as any;\n\n if(strippedPhotoSize) {\n photo.sizes.unshift(strippedPhotoSize);\n }\n\n const cacheContext = this.thumbsStorage.getCacheContext(photo, photoSize.type);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n\n photo = this.appPhotosManager.savePhoto(photo);\n } else if(getEnvironment().VIDEO_MIME_TYPES_SUPPORTED.has(fileType)) {\n attachType = 'video';\n apiFileName = 'video.mp4';\n actionName = 'sendMessageUploadVideoAction';\n\n const videoAttribute: DocumentAttribute.documentAttributeVideo = {\n _: 'documentAttributeVideo',\n pFlags: {\n round_message: options.isRoundMessage || undefined,\n supports_streaming: true\n },\n duration: options.duration,\n w: options.width,\n h: options.height\n };\n\n attributes.push(videoAttribute);\n\n // * must follow after video attribute\n if(options.noSound &&\n file.size > (10 * 1024) &&\n file.size < (10 * 1024 * 1024)) {\n attributes.push({\n _: 'documentAttributeAnimated'\n });\n }\n } else {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n }\n\n attributes.push({_: 'documentAttributeFilename', file_name: fileName || apiFileName});\n\n if((['document', 'video', 'audio', 'voice'] as (typeof attachType)[]).indexOf(attachType) !== -1 && !isDocument) {\n const thumbs: PhotoSize[] = [];\n document = {\n _: 'document',\n id: '' + message.id,\n duration: options.duration,\n attributes,\n w: options.width,\n h: options.height,\n thumbs,\n mime_type: fileType,\n size: file.size\n } as any;\n\n if(options.objectURL) {\n const cacheContext = this.thumbsStorage.getCacheContext(document);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL;\n }\n\n let thumb: PhotoSize.photoSize;\n if(isPhoto) {\n attributes.push({\n _: 'documentAttributeImageSize',\n w: options.width,\n h: options.height\n });\n\n thumb = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: THUMB_TYPE_FULL,\n size: file.size\n };\n } else if(attachType === 'video') {\n if(options.thumb) {\n thumb = {\n _: 'photoSize',\n w: options.thumb.size.width,\n h: options.thumb.size.height,\n type: 'local-thumb',\n size: options.thumb.blob.size\n };\n\n const thumbCacheContext = this.thumbsStorage.getCacheContext(document, thumb.type);\n thumbCacheContext.downloaded = thumb.size;\n thumbCacheContext.url = options.thumb.url;\n }\n }\n\n if(thumb) {\n thumbs.push(thumb);\n }\n\n if(strippedPhotoSize) {\n thumbs.unshift(strippedPhotoSize);\n }\n\n /* if(thumbs.length) {\n const thumb = thumbs[0] as PhotoSize.photoSize;\n const docThumb = appPhotosManager.getDocumentCachedThumb(document.id);\n docThumb.downloaded = thumb.size;\n docThumb.url = thumb.url;\n } */\n\n document = this.appDocsManager.saveDoc(document);\n }\n\n this.log('sendFile', attachType, apiFileName, file.type, options);\n\n const sentDeferred = deferredPromise();\n // sentDeferred.cancel = () => {\n // const error = new Error('Download canceled');\n // error.name = 'AbortError';\n // sentDeferred.reject(error);\n\n // if(uploadPromise?.cancel) {\n // uploadPromise.cancel();\n // }\n // };\n\n const media: MessageMedia = isDocument ? undefined : {\n _: photo ? 'messageMediaPhoto' : 'messageMediaDocument',\n pFlags: {},\n // preloader,\n photo,\n document\n };\n\n if(media) {\n defineNotNumerableProperties(media as any, ['promise']);\n (media as any).promise = sentDeferred;\n\n if(options.spoiler) {\n (media as MessageMedia.messageMediaPhoto).pFlags.spoiler = true;\n }\n }\n\n message.entities = entities;\n message.message = caption;\n message.media = isDocument ? {\n _: 'messageMediaDocument',\n pFlags: {},\n document: file\n } as MessageMedia.messageMediaDocument : media;\n\n const uploadingFileName = !isDocument ? getFileNameForUpload(file) : undefined;\n message.uploadingFileName = uploadingFileName;\n\n if(uploadingFileName) {\n this.uploadFilePromises[uploadingFileName] = sentDeferred;\n }\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n let uploaded = false,\n uploadPromise: ReturnType = null;\n\n message.send = () => {\n if(isDocument) {\n const inputMedia: InputMedia = {\n _: 'inputMediaDocument',\n id: getDocumentInput(file)\n };\n\n sentDeferred.resolve(inputMedia);\n } else if(file instanceof File || file instanceof Blob) {\n const load = () => {\n if(!uploaded || message.error) {\n uploaded = false;\n\n uploadPromise = this.apiFileManager.upload({file, fileName: uploadingFileName});\n uploadPromise.catch((err) => {\n if(!uploaded) {\n this.log('cancelling upload', media);\n\n this.cancelPendingMessage(message.random_id);\n this.setTyping(peerId, {_: 'sendMessageCancelAction'}, undefined, options.threadId);\n sentDeferred.reject(err);\n }\n });\n\n uploadPromise.addNotifyListener((progress: Progress) => {\n /* if(DEBUG) {\n this.log('upload progress', progress);\n } */\n\n const percents = Math.max(1, Math.floor(100 * progress.done / progress.total));\n if(actionName) {\n this.setTyping(peerId, {_: actionName, progress: percents | 0}, undefined, options.threadId);\n }\n sentDeferred.notifyAll(progress);\n });\n\n sentDeferred.notifyAll({done: 0, total: file.size});\n }\n\n let thumbUploadPromise: typeof uploadPromise;\n if(attachType === 'video' && options.objectURL && options.thumb?.blob) {\n thumbUploadPromise = this.apiFileManager.upload({file: options.thumb.blob});\n }\n\n uploadPromise && uploadPromise.then(async(inputFile) => {\n /* if(DEBUG) {\n this.log('appMessagesManager: sendFile uploaded:', inputFile);\n } */\n\n inputFile.name = apiFileName;\n uploaded = true;\n let inputMedia: InputMedia;\n switch(attachType) {\n case 'photo':\n inputMedia = {\n _: 'inputMediaUploadedPhoto',\n file: inputFile,\n pFlags: {\n spoiler: options.spoiler || undefined\n }\n };\n break;\n\n default:\n inputMedia = {\n _: 'inputMediaUploadedDocument',\n file: inputFile,\n mime_type: fileType,\n pFlags: {\n force_file: actionName === 'sendMessageUploadDocumentAction' || undefined,\n spoiler: options.spoiler || undefined\n // nosound_video: options.noSound ? true : undefined\n },\n attributes\n };\n }\n\n if(thumbUploadPromise) {\n try {\n const inputFile = await thumbUploadPromise;\n (inputMedia as InputMedia.inputMediaUploadedDocument).thumb = inputFile;\n } catch(err) {\n this.log.error('sendFile thumb upload error:', err);\n }\n }\n\n sentDeferred.resolve(inputMedia);\n }, (error: ApiError) => {\n toggleError(error);\n throw error;\n });\n\n return sentDeferred;\n };\n\n if(options.isGroupedItem) {\n load();\n } else {\n this.sendSmthLazyLoadQueue.push({\n load\n });\n }\n }\n\n return sentDeferred;\n };\n\n this.beforeMessageSending(message, {\n isGroupedItem: options.isGroupedItem,\n isScheduled: !!options.scheduleDate || undefined,\n threadId: options.threadId,\n clearDraft: options.clearDraft,\n processAfter: options.processAfter\n });\n\n if(!options.isGroupedItem) {\n sentDeferred.then((inputMedia) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'}, undefined, options.threadId);\n\n return this.apiManager.invokeApi('messages.sendMedia', {\n background: options.background,\n peer: this.appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n message: caption,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n entities,\n clear_draft: options.clearDraft,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\n if(attachType === 'photo' &&\n error.code === 400 &&\n (error.type === 'PHOTO_INVALID_DIMENSIONS' ||\n error.type === 'PHOTO_SAVE_FILE_INVALID')) {\n error.handled = true;\n attachType = 'document';\n message.send();\n return;\n }\n\n toggleError(error);\n throw error;\n });\n });\n\n sentDeferred.then(message.promise.resolve, message.promise.reject);\n }\n\n const ret: {\n message: typeof message,\n promise: typeof sentDeferred\n } = {\n message\n } as any;\n\n defineNotNumerableProperties(ret, ['promise']);\n ret.promise = sentDeferred;\n\n return ret;\n }\n\n public async sendAlbum(peerId: PeerId, options: MessageSendingParams & {\n isMedia?: boolean,\n entities?: MessageEntity[],\n caption?: string,\n sendFileDetails: SendFileDetails[],\n clearDraft?: boolean\n }) {\n // this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n if(options.sendFileDetails.length === 1) {\n return this.sendFile(peerId, {...options, ...options.sendFileDetails[0]});\n }\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let caption = options.caption || '';\n let entities = options.entities || [];\n if(caption) {\n caption = parseMarkdown(caption, entities);\n }\n\n this.log('sendAlbum', options);\n\n const groupId = '' + ++this.groupedTempId;\n\n const callbacks: Array<() => void> = [];\n const processAfter = (cb: () => void) => {\n callbacks.push(cb);\n };\n\n const messages = options.sendFileDetails.map((details, idx) => {\n const o: Parameters[1] = {\n isGroupedItem: true,\n isMedia: options.isMedia,\n scheduleDate: options.scheduleDate,\n silent: options.silent,\n replyToMsgId,\n threadId: options.threadId,\n sendAsPeerId: options.sendAsPeerId,\n groupId,\n processAfter,\n ...details\n };\n\n if(idx === 0) {\n o.caption = caption;\n o.entities = entities;\n // o.replyToMsgId = replyToMsgId;\n }\n\n return this.sendFile(peerId, o).message;\n });\n\n if(options.clearDraft) {\n callbacks.push(() => {\n this.appDraftsManager.clearDraft(peerId, options.threadId);\n });\n }\n\n callbacks.forEach((callback) => {\n callback();\n });\n\n // * test pending\n // return;\n\n const toggleError = (message: Message.message, error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\n const invoke = (multiMedia: InputSingleMedia[]) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'}, undefined, options.threadId);\n\n const deferred = deferredPromise();\n this.sendSmthLazyLoadQueue.push({\n load: () => {\n return this.apiManager.invokeApi('messages.sendMultiMedia', {\n peer: inputPeer,\n multi_media: multiMedia,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n clear_draft: options.clearDraft,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n }, (error: ApiError) => {\n messages.forEach((message) => toggleError(message, error));\n deferred.reject(error);\n });\n }\n });\n\n return deferred;\n };\n\n const promises: Promise[] = messages.map((message) => {\n return (message.send() as Promise).then((inputMedia) => {\n return Promise.all([\n inputMedia,\n this.apiManager.invokeApi('messages.uploadMedia', {\n peer: inputPeer,\n media: inputMedia\n })\n ]);\n })\n .then(([originalInputMedia, messageMedia]) => {\n let inputMedia: InputMedia;\n if(messageMedia._ === 'messageMediaPhoto') {\n const photo = this.appPhotosManager.savePhoto(messageMedia.photo);\n inputMedia = getPhotoMediaInput(photo);\n } else if(messageMedia._ === 'messageMediaDocument') {\n const doc = this.appDocsManager.saveDoc(messageMedia.document);\n inputMedia = getDocumentMediaInput(doc);\n }\n\n // copy original flags\n const copyProperties: (keyof InputMedia.inputMediaPhoto)[] = [\n 'pFlags',\n 'ttl_seconds'\n ];\n\n copyProperties.forEach((property) => {\n // @ts-ignore\n inputMedia[property] = originalInputMedia[property] ?? inputMedia[property];\n });\n\n const inputSingleMedia: InputSingleMedia = {\n _: 'inputSingleMedia',\n media: inputMedia,\n random_id: message.random_id,\n message: caption,\n entities\n };\n\n // * only 1 caption for all inputs\n if(caption) {\n caption = '';\n entities = [];\n }\n\n return inputSingleMedia;\n }).catch((err: ApiError) => {\n this.log.error('sendAlbum upload item error:', err, message);\n toggleError(message, err);\n throw err;\n });\n });\n\n return Promise.all(promises).then((inputs) => {\n return invoke(inputs.filter(Boolean));\n });\n }\n\n public sendContact(peerId: PeerId, contactPeerId: PeerId) {\n return this.sendOther(peerId, this.appUsersManager.getContactMediaInput(contactPeerId));\n }\n\n public sendOther(\n peerId: PeerId,\n inputMedia: InputMedia | {_: 'messageMediaPending', messageMedia: MessageMedia},\n options: MessageSendingParams & Partial<{\n viaBotId: BotId,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n queryId: string\n resultId: string,\n geoPoint: GeoPoint\n }> = {}\n ) {\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n // this.checkSendOptions(options);\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let media: MessageMedia;\n switch(inputMedia._) {\n case 'inputMediaPoll': {\n const pollId = '' + message.id;\n inputMedia.poll.id = pollId;\n this.appPollsManager.savePoll(inputMedia.poll, {\n _: 'pollResults',\n flags: 4,\n total_voters: 0,\n pFlags: {},\n recent_voters: []\n });\n\n const {poll, results} = this.appPollsManager.getPoll(pollId);\n media = {\n _: 'messageMediaPoll',\n poll,\n results\n };\n\n break;\n }\n\n case 'inputMediaPhoto': {\n media = {\n _: 'messageMediaPhoto',\n photo: this.appPhotosManager.getPhoto((inputMedia.id as InputPhoto.inputPhoto).id)\n };\n break;\n }\n\n case 'inputMediaDocument': {\n const doc = this.appDocsManager.getDoc((inputMedia.id as InputDocument.inputDocument).id);\n /* if(doc.sticker && doc.stickerSetInput) {\n appStickersManager.pushPopularSticker(doc.id);\n } */\n media = {\n _: 'messageMediaDocument',\n document: doc\n };\n break;\n }\n\n case 'inputMediaContact': {\n media = {\n _: 'messageMediaContact',\n phone_number: inputMedia.phone_number,\n first_name: inputMedia.first_name,\n last_name: inputMedia.last_name,\n user_id: inputMedia.user_id ?? '0',\n vcard: inputMedia.vcard\n };\n break;\n }\n\n case 'inputMediaGeoPoint': {\n media = {\n _: 'messageMediaGeo',\n geo: options.geoPoint\n };\n break;\n }\n\n case 'inputMediaVenue': {\n media = {\n _: 'messageMediaVenue',\n geo: options.geoPoint,\n title: inputMedia.title,\n address: inputMedia.address,\n provider: inputMedia.provider,\n venue_id: inputMedia.venue_id,\n venue_type: inputMedia.venue_type\n };\n break;\n }\n\n case 'messageMediaPending': {\n media = (inputMedia as any).messageMedia;\n break;\n }\n }\n\n message.media = media;\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined;\n let apiPromise: Promise;\n if(options.viaBotId) {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendMedia', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n media: inputMedia as InputMedia,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n message: '',\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n send_as: sendAs,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\n }, sentRequestOptions);\n }\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates) => {\n if(updates.updates) {\n updates.updates.forEach((update: Update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\n toggleError(error);\n throw error;\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined,\n threadId: options.threadId,\n clearDraft: options.clearDraft,\n sequential: true\n });\n\n return message.promise;\n }\n\n /* private checkSendOptions(options: Partial<{\n scheduleDate: number\n }>) {\n if(options.scheduleDate) {\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\n if(options.scheduleDate <= minTimestamp) {\n delete options.scheduleDate;\n }\n }\n } */\n\n private beforeMessageSending(message: Message.message, options: Pick & Partial<{\n isGroupedItem: boolean,\n isScheduled: boolean,\n clearDraft: boolean,\n sequential: boolean,\n processAfter?: (cb: () => void) => void\n }> = {}) {\n const messageId = message.id;\n const peerId = this.getMessagePeer(message);\n const storage = options.isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n message.storageKey = storage.key;\n const callbacks: Array<() => void> = [];\n if(options.isScheduled) {\n // if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isScheduled: true, isOutgoing: true});\n callbacks.push(() => {\n this.rootScope.dispatchEvent('scheduled_new', message);\n });\n } else {\n /* if(options.threadId && this.threadsStorage[peerId]) {\n delete this.threadsStorage[peerId][options.threadId];\n } */\n const storages: HistoryStorage[] = [\n this.getHistoryStorage(peerId),\n options.threadId ? this.getHistoryStorage(peerId, options.threadId) : undefined\n ];\n\n for(const storage of storages) {\n if(storage) {\n storage.history.unshift(messageId);\n }\n }\n\n this.saveMessages([message], {storage, isOutgoing: true});\n this.setDialogTopMessage(message);\n\n if(options.threadId) {\n const forumTopic = this.dialogsStorage.getForumTopic(peerId, options.threadId);\n if(forumTopic) {\n this.setDialogTopMessage(message, forumTopic);\n }\n }\n\n callbacks.push(() => {\n this.rootScope.dispatchEvent('history_append', {storageKey: storage.key, message});\n });\n }\n\n const pending: PendingMessageDetails = this.pendingByRandomId[message.random_id] = {\n peerId,\n tempId: messageId,\n threadId: options.threadId,\n storage,\n sequential: options.sequential\n };\n\n this.pendingTopMsgs[peerId] = messageId;\n\n if(!options.isGroupedItem && message.send) {\n callbacks.push(() => {\n if(options.clearDraft) {\n this.appDraftsManager.clearDraft(peerId, options.threadId);\n }\n\n message.send();\n });\n }\n\n if(callbacks.length) {\n (options.processAfter || processAfter)(() => {\n for(const callback of callbacks) {\n callback();\n }\n });\n }\n\n return pending;\n }\n\n private generateOutgoingMessage(peerId: PeerId, options: MessageSendingParams & Partial<{\n viaBotId: BotId,\n groupId: string,\n replyMarkup: ReplyMarkup,\n }>) {\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n let postAuthor: string;\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\n if(isBroadcast) {\n const chat = this.appPeersManager.getPeer(peerId) as Chat.channel;\n if(chat.pFlags.signatures) {\n const user = this.appUsersManager.getSelf();\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n postAuthor = fullName;\n }\n }\n\n const message: Message.message = {\n _: 'message',\n id: this.generateTempMessageId(peerId),\n from_id: options.sendAsPeerId ? this.appPeersManager.getOutputPeer(options.sendAsPeerId) : this.generateFromId(peerId),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n post_author: postAuthor,\n pFlags: this.generateFlags(peerId),\n date: options.scheduleDate || (tsNow(true) + this.timeManager.getServerTimeOffset()),\n message: '',\n grouped_id: options.groupId,\n random_id: randomLong(),\n reply_to: this.generateReplyHeader(peerId, options.replyToMsgId, options.threadId),\n via_bot_id: options.viaBotId,\n reply_markup: options.replyMarkup,\n replies: this.generateReplies(peerId),\n views: isBroadcast && 1,\n pending: true\n };\n\n defineNotNumerableProperties(message, ['send', 'promise']);\n if(options.groupId === undefined) {\n message.promise = deferredPromise();\n }\n\n return message;\n }\n\n private generateReplyHeader(peerId: PeerId, replyToMsgId: number, replyToTopId?: number) {\n const isForum = this.appPeersManager.isForum(peerId);\n if(isForum && !replyToTopId) {\n const originalMessage = this.getMessageByPeer(peerId, replyToMsgId);\n if(originalMessage) {\n replyToTopId = getMessageThreadId(originalMessage, true);\n }\n }\n\n const header: MessageReplyHeader = {\n _: 'messageReplyHeader',\n reply_to_msg_id: replyToMsgId || replyToTopId,\n pFlags: {}\n };\n\n if(replyToTopId && isForum && GENERAL_TOPIC_ID !== replyToTopId) {\n header.pFlags.forum_topic = true;\n }\n\n if(replyToTopId && header.reply_to_msg_id !== replyToTopId) {\n header.reply_to_top_id = replyToTopId;\n }\n\n return header;\n }\n\n private generateReplies(peerId: PeerId) {\n let replies: MessageReplies.messageReplies;\n if(this.appPeersManager.isBroadcast(peerId)) {\n const channelFull = this.appProfileManager.getCachedFullChat(peerId.toChatId()) as ChatFull.channelFull;\n if(channelFull?.linked_chat_id) {\n replies = {\n _: 'messageReplies',\n flags: 1,\n pFlags: {\n comments: true\n },\n channel_id: channelFull.linked_chat_id,\n replies: 0,\n replies_pts: 0\n };\n }\n }\n\n return replies;\n }\n\n /**\n * Generate correct from_id according to anonymous or broadcast\n */\n private generateFromId(peerId: PeerId) {\n if(this.appPeersManager.isAnyChat(peerId) && (this.appPeersManager.isBroadcast(peerId) || this.isAnonymousSending(peerId))) {\n return undefined;\n } else {\n return this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId());\n }\n }\n\n private generateFlags(peerId: PeerId) {\n const pFlags: Message.message['pFlags'] = {};\n const fromId = this.appUsersManager.getSelf().id;\n if(peerId !== fromId) {\n pFlags.out = true;\n\n if(!this.appPeersManager.isChannel(peerId) && !this.appUsersManager.isBot(peerId)) {\n pFlags.unread = true;\n }\n }\n\n if(this.appPeersManager.isBroadcast(peerId)) {\n pFlags.post = true;\n }\n\n return pFlags;\n }\n\n private generateForwardHeader(peerId: PeerId, originalMessage: Message.message) {\n const myId = this.appUsersManager.getSelf().id.toPeerId();\n const fromId = originalMessage.fromId;\n if(fromId === myId && originalMessage.peerId === myId && !originalMessage.fwd_from) {\n return;\n }\n\n const fwdHeader: MessageFwdHeader.messageFwdHeader = {\n _: 'messageFwdHeader',\n flags: 0,\n date: originalMessage.date\n };\n\n let isUserHidden = false;\n if(originalMessage.fwd_from) {\n fwdHeader.from_id = originalMessage.fwd_from.from_id;\n fwdHeader.from_name = originalMessage.fwd_from.from_name;\n fwdHeader.post_author = originalMessage.fwd_from.post_author;\n } else {\n fwdHeader.post_author = originalMessage.post_author;\n\n if(fromId.isUser()) {\n const userFull = this.appProfileManager.getCachedFullUser(fromId.toUserId());\n if(userFull?.private_forward_name) {\n fwdHeader.from_name = userFull.private_forward_name;\n isUserHidden = true;\n }\n }\n\n if(!isUserHidden) {\n fwdHeader.from_id = this.appPeersManager.getOutputPeer(fromId);\n }\n }\n\n if(this.appPeersManager.isBroadcast(originalMessage.peerId)) {\n if(originalMessage.post_author) {\n fwdHeader.post_author = originalMessage.post_author;\n }\n\n fwdHeader.channel_post = originalMessage.id;\n }\n\n if(peerId === myId && !isUserHidden) {\n fwdHeader.saved_from_msg_id = originalMessage.id;\n fwdHeader.saved_from_peer = this.appPeersManager.getOutputPeer(originalMessage.peerId);\n }\n\n return fwdHeader;\n }\n\n public generateFakeAvatarMessage(peerId: PeerId, photo: Photo) {\n const maxId = Number.MAX_SAFE_INTEGER;\n const message: Message.messageService = {\n _: 'messageService',\n pFlags: {},\n action: {\n _: 'messageActionChannelEditPhoto',\n photo\n },\n id: maxId,\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n mid: maxId,\n peerId,\n date: (photo as Photo.photo).date,\n fromId: peerId\n };\n\n this.getHistoryMessagesStorage(peerId).set(maxId, message);\n return message;\n }\n\n public getUploadPromise(uploadFileName: string) {\n return this.uploadFilePromises[uploadFileName];\n }\n\n public isAnonymousSending(peerId: PeerId): boolean {\n if(!peerId.isAnyChat()) {\n return false;\n }\n\n const chat = this.appPeersManager.getPeer(peerId);\n return (chat as Chat.channel).admin_rights?.pFlags?.anonymous;\n }\n\n public setDialogTopMessage(\n message: MyMessage,\n dialog: MTDialog.dialog | ForumTopic = this.getDialogOnly(message.peerId)\n ) {\n if(!dialog) {\n return;\n }\n\n dialog.top_message = message.mid;\n\n const historyStorage = this.getHistoryStorage(message.peerId, dialog._ === 'forumTopic' ? dialog.id : undefined);\n historyStorage.maxId = message.mid;\n\n this.dialogsStorage.generateIndexForDialog(dialog, false, message);\n\n this.scheduleHandleNewDialogs(message.peerId, dialog);\n }\n\n public cancelPendingMessage(randomId: string) {\n const pendingData = this.pendingByRandomId[randomId];\n\n /* if(DEBUG) {\n this.log('cancelPendingMessage', randomId, pendingData);\n } */\n\n if(pendingData) {\n const {peerId, tempId, storage} = pendingData;\n const historyStorage = this.getHistoryStorage(peerId);\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: [tempId],\n pts: undefined,\n pts_count: undefined\n });\n\n historyStorage.history.delete(tempId);\n\n delete this.pendingByRandomId[randomId];\n storage.delete(tempId);\n\n return true;\n }\n\n return false;\n }\n\n /* public async refreshConversations() {\n const limit = 200, outDialogs: Dialog[] = [];\n for(let folderId = 0; folderId < 2; ++folderId) {\n let offsetDate = 0;\n for(;;) {\n const {dialogs, isEnd} = await this.getTopMessages(limit, folderId, offsetDate);\n\n if(dialogs.length) {\n outDialogs.push(...dialogs as Dialog[]);\n const dialog = dialogs[dialogs.length - 1];\n\n // * get peerId and mid manually, because dialog can be migrated peer and it won't be saved\n const peerId = getPeerId(dialog.peer);\n const mid = generateMessageId(dialog.top_message);\n offsetDate = this.getMessageByPeer(peerId, mid).date;\n\n if(!offsetDate) {\n console.error('refreshConversations: got no offsetDate', dialog);\n break;\n }\n }\n\n if(isEnd) {\n break;\n }\n }\n }\n\n let obj: {[peerId: string]: Dialog} = {};\n outDialogs.forEach((dialog) => {\n obj[dialog.peerId] = dialog;\n });\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n\n return outDialogs;\n } */\n\n public async fillConversations(folderId = GLOBAL_FOLDER_ID): Promise {\n const middleware = this.middleware.get();\n while(!this.dialogsStorage.isDialogsLoaded(folderId)) {\n const result = await this.getTopMessages({limit: 100, folderId});\n if(!middleware() || result.isEnd) {\n break;\n }\n }\n }\n\n /* public async getConversationsAll(query = '', folderId = 0) {\n const limit = 200, outDialogs: Dialog[] = [];\n for(; folderId < 2; ++folderId) {\n let offsetIndex = 0;\n for(;;) {\n const {dialogs} = await appMessagesManager.getConversations(query, offsetIndex, limit, folderId).promise;\n\n if(dialogs.length) {\n outDialogs.push(...dialogs);\n offsetIndex = dialogs[dialogs.length - 1].index || 0;\n } else {\n break;\n }\n }\n }\n\n return outDialogs;\n } */\n\n public getReadMaxIdIfUnread(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(threadId && !this.appChatsManager.isForum(peerId.toChatId())) {\n const chatHistoryStorage = this.getHistoryStorage(peerId);\n const readMaxId = Math.max(chatHistoryStorage.readMaxId ?? 0, historyStorage.readMaxId);\n const message = this.getMessageByPeer(peerId, historyStorage.maxId); // usually message is missing, so pFlags.out won't be there anyway\n return !message?.pFlags?.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n } else {\n const message = this.getMessageByPeer(peerId, historyStorage.maxId);\n const readMaxId = peerId.isUser() ? Math.max(historyStorage.readMaxId, historyStorage.readOutboxMaxId) : historyStorage.readMaxId;\n // readMaxId can be 4294967295 (0)\n return !message?.pFlags?.out && readMaxId < historyStorage.maxId && getServerMessageId(readMaxId) ? readMaxId : 0;\n }\n }\n\n // public lolSet = new Set();\n public getTopMessages({limit, folderId}: {\n limit: number,\n folderId: number\n }) {\n // const dialogs = this.dialogsStorage.getFolder(folderId);\n const offsetId = 0;\n let offsetPeerId: PeerId;\n let offsetIndex = 0;\n\n let offsetDate = this.dialogsStorage.getOffsetDate(folderId);\n if(offsetDate) {\n offsetIndex = offsetDate * 0x10000;\n offsetDate += this.timeManager.getServerTimeOffset();\n }\n\n const useLimit = 100;\n const middleware = this.middleware.get();\n const peerId = this.dialogsStorage.isFilterIdForForum(folderId) ? folderId : undefined;\n\n const processResult = (result: MessagesDialogs | MessagesForumTopics) => {\n if(!middleware() || result._ === 'messages.dialogsNotModified') return null;\n\n if(DEBUG) {\n this.log('messages.getDialogs result:', result);\n }\n\n // can reset pinned order here\n if(!peerId && !offsetId && !offsetDate && !offsetPeerId && folderId !== GLOBAL_FOLDER_ID) {\n this.dialogsStorage.resetPinnedOrder(folderId);\n }\n\n if(!peerId && !offsetDate) {\n // telegramMeWebManager.setAuthorized(true);\n this.appDraftsManager.addMissedDialogs();\n }\n\n this.appUsersManager.saveApiUsers(result.users);\n this.appChatsManager.saveApiChats(result.chats);\n this.saveMessages(result.messages);\n\n let maxSeenIdIncremented = offsetDate ? true : false;\n let hasPrepend = false;\n const noIdsDialogs: BroadcastEvents['dialogs_multiupdate'] = new Map();\n const setFolderId: REAL_FOLDER_ID = folderId === GLOBAL_FOLDER_ID ? FOLDER_ID_ALL : folderId as REAL_FOLDER_ID;\n const saveGlobalOffset = !!peerId || folderId === GLOBAL_FOLDER_ID;\n const items: Array =\n (result as MessagesDialogs.messagesDialogsSlice).dialogs as Dialog[] ||\n (result as MessagesForumTopics).topics as ForumTopic[];\n forEachReverse(items, (dialog) => {\n if(!dialog) {\n return;\n }\n\n // const d = Object.assign({}, dialog);\n // ! нужно передавать folderId, так как по папке !== 0 нет свойства folder_id\n if(!peerId) {\n (dialog as Dialog).folder_id ??= setFolderId;\n }\n\n this.dialogsStorage.saveDialog({\n dialog,\n ignoreOffsetDate: true,\n saveGlobalOffset\n });\n\n if(dialog.peerId === undefined) {\n this.log.error('bugged dialog?', dialog);\n debugger;\n return;\n }\n\n if(!maxSeenIdIncremented &&\n !this.appPeersManager.isChannel(dialog.peerId || this.appPeersManager.getPeerId(dialog.peer))) {\n this.incrementMaxSeenId(dialog.top_message);\n maxSeenIdIncremented = true;\n }\n\n // if(!folderId && !dialog.folder_id) {\n // this.lolSet.add(dialog.peerId);\n // }\n\n if(offsetIndex && getDialogIndex(dialog) > offsetIndex) {\n this.scheduleHandleNewDialogs(dialog.peerId, dialog);\n hasPrepend = true;\n }\n\n // ! это может случиться, если запрос идёт не по папке 0, а по 1. почему-то read'ов нет\n // ! в итоге, чтобы получить 1 диалог, делается первый запрос по папке 0, потом запрос для архивных по папке 1, и потом ещё перезагрузка архивного диалога\n if(!peerId && !getServerMessageId(dialog.read_inbox_max_id) && !getServerMessageId(dialog.read_outbox_max_id)) {\n noIdsDialogs.set(dialog.peerId, {dialog: dialog as Dialog});\n\n this.log.error('noIdsDialogs', dialog, params);\n } else if(dialog.top_message) { // * fix sending status\n const topMessage = this.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(topMessage) {\n this.setMessageUnreadByDialog(topMessage, dialog);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n });\n\n if(noIdsDialogs.size) {\n // setTimeout(() => { // test bad situation\n const peerIds = [...noIdsDialogs.keys()];\n const promises = peerIds.map((peerId) => this.reloadConversation(peerId));\n Promise.all(promises).then(() => {\n this.rootScope.dispatchEvent('dialogs_multiupdate', noIdsDialogs);\n\n for(let i = 0; i < peerIds.length; ++i) {\n const peerId = peerIds[i];\n this.rootScope.dispatchEvent('dialog_unread', {\n peerId,\n dialog: this.getDialogOnly(peerId)\n });\n }\n });\n // }, 10e3);\n }\n\n const count = (result as MessagesDialogs.messagesDialogsSlice).count;\n\n // exclude empty draft dialogs\n const folderDialogs = this.dialogsStorage.getFolderDialogs(folderId, false);\n let dialogsLength = 0;\n for(let i = 0, length = folderDialogs.length; i < length; ++i) {\n const dialog = folderDialogs[i];\n if(getServerMessageId(dialog.top_message)) {\n ++dialogsLength;\n } else {\n this.log.error('something strange with dialog', dialog);\n }\n }\n\n const isEnd = /* limit > dialogsResult.dialogs.length || */\n !count ||\n dialogsLength >= count ||\n !items.length;\n if(isEnd) {\n this.dialogsStorage.setDialogsLoaded(folderId, true);\n }\n\n if(hasPrepend) {\n this.scheduleHandleNewDialogs();\n } else {\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map());\n }\n\n const dialogs = items;\n const slicedDialogs = limit === useLimit ? dialogs : dialogs.slice(0, limit);\n return {\n isEnd: isEnd && slicedDialogs[slicedDialogs.length - 1] === dialogs[dialogs.length - 1],\n count,\n dialogs: slicedDialogs\n };\n };\n\n let promise: Promise>, params: any;\n if(peerId) {\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'channels.getForumTopics',\n params: params = {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n limit: useLimit,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_topic: 0\n },\n options: {\n // timeout: APITIMEOUT,\n noErrorBox: true\n },\n processResult: (result) => {\n result = this.dialogsStorage.processTopics(peerId, result);\n return processResult(result);\n }\n });\n } else {\n // ! ВНИМАНИЕ: ОЧЕНЬ СЛОЖНАЯ ЛОГИКА:\n // ! если делать запрос сначала по папке 0, потом по папке 1, по индексу 0 в массиве будет один и тот же диалог, с dialog.pFlags.pinned, ЛОЛ???\n // ! т.е., с запросом folder_id: 1, и exclude_pinned: 0, в результате будут ещё и закреплённые с папки 0\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'messages.getDialogs',\n params: params = {\n folder_id: folderId,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_peer: this.appPeersManager.getInputPeerById(offsetPeerId),\n limit: useLimit,\n hash: '0'\n },\n options: {\n // timeout: APITIMEOUT,\n noErrorBox: true\n },\n processResult\n });\n }\n\n return promise;\n }\n\n public async forwardMessages(peerId: PeerId, fromPeerId: PeerId, mids: number[], options: MessageSendingParams & Partial<{\n withMyScore: true,\n dropAuthor: boolean,\n dropCaptions: boolean\n }> = {}) {\n delete options.replyToMsgId;\n delete options.threadId;\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n mids = mids.slice().sort((a, b) => a - b);\n\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const originalMessage = this.getMessageByPeer(fromPeerId, mid) as Message.message;\n if(originalMessage.pFlags.is_outgoing) { // this can happen when forwarding a changelog\n this.sendText(peerId, originalMessage.message, {\n entities: originalMessage.entities,\n scheduleDate: options.scheduleDate,\n silent: options.silent\n });\n\n mids.splice(i--, 1);\n --length;\n }\n }\n\n if(!mids.length) {\n return Promise.resolve();\n }\n\n const config = await this.apiManager.getConfig();\n const overflowMids = mids.splice(config.forwarded_count_max, mids.length - config.forwarded_count_max);\n\n if(options.dropCaptions) {\n options.dropAuthor = true;\n }\n\n const groups: {\n [groupId: string]: {\n tempId: string,\n messages: Message.message[]\n }\n } = {};\n\n const newMids: number[] = [];\n const newMessages = mids.map((mid) => {\n const originalMessage = this.getMessageByPeer(fromPeerId, mid) as Message.message;\n const message: Message.message = this.generateOutgoingMessage(peerId, options);\n newMids.push(message.id);\n\n const keys: Array = [\n 'entities',\n 'media'\n // 'reply_markup'\n ];\n\n if(!options.dropAuthor) {\n message.fwd_from = this.generateForwardHeader(peerId, originalMessage);\n keys.push('views', 'forwards');\n\n if(message.fwd_from?.from_name && peerId === this.appPeersManager.peerId) {\n delete message.from_id;\n }\n }\n\n if(!options.dropCaptions || !originalMessage.media) {\n keys.push('message');\n }\n\n const replyToMid = originalMessage.reply_to?.reply_to_msg_id;\n const replyToMessageIdx = mids.indexOf(replyToMid);\n if(replyToMid && replyToMessageIdx !== -1) {\n const newReplyToMid = newMids[replyToMessageIdx];\n message.reply_to = {\n _: 'messageReplyHeader',\n reply_to_msg_id: newReplyToMid\n };\n\n /* this.invokeAfterMessageIsSent(newReplyToMid, 'reply', async(originalMessage) => {\n message.reply_to.reply_to_msg_id = originalMessage.mid;\n }); */\n }\n\n keys.forEach((key) => {\n // @ts-ignore\n message[key] = copy(originalMessage[key]);\n });\n\n const document = (message.media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n if(document) {\n const types: MyDocument['type'][] = ['round', 'voice'];\n if(types.includes(document.type)) {\n (message as MyMessage).pFlags.media_unread = true;\n }\n\n if(document.sticker && !this.rootScope.premium) {\n const effectThumb = getStickerEffectThumb(document);\n if(effectThumb) {\n (message.media as MessageMedia.messageMediaDocument).pFlags.nopremium = true;\n }\n }\n }\n\n if(originalMessage.grouped_id) {\n const group = groups[originalMessage.grouped_id] ??= {tempId: '' + ++this.groupedTempId, messages: []};\n group.messages.push(message);\n }\n\n return message;\n });\n\n for(const groupId in groups) {\n const group = groups[groupId];\n if(group.messages.length > 1) {\n group.messages.forEach((message) => {\n message.grouped_id = group.tempId;\n });\n }\n }\n\n newMessages.forEach((message) => {\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined,\n sequential: true\n });\n });\n\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const promise = /* true ? Promise.resolve() : */this.apiManager.invokeApiAfter('messages.forwardMessages', {\n from_peer: this.appPeersManager.getInputPeerById(fromPeerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n random_id: newMessages.map((message) => message.random_id),\n to_peer: this.appPeersManager.getInputPeerById(peerId),\n with_my_score: options.withMyScore,\n silent: options.silent,\n schedule_date: options.scheduleDate,\n drop_author: options.dropAuthor,\n drop_media_captions: options.dropCaptions,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }, sentRequestOptions).then((updates) => {\n this.log('forwardMessages updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\n this.onMessagesSendError(newMessages, error);\n throw error;\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n const promises: (typeof promise)[] = [promise];\n if(overflowMids.length) {\n promises.push(this.forwardMessages(peerId, fromPeerId, overflowMids, options));\n }\n\n return Promise.all(promises).then(noop);\n }\n\n public generateEmptyMessage(mid: number): Message.message | Message.messageService {\n return undefined;\n // return {\n // _: 'messageEmpty',\n // id: getServerMessageId(mid),\n // mid,\n // deleted: true,\n // pFlags: {}\n // };\n }\n\n private onMessagesSendError(messages: Message.message[], error?: ApiError) {\n messages.forEach((message) => {\n if(message.error === error) {\n return;\n }\n\n if(error) {\n message.error = error;\n this.rootScope.dispatchEvent('message_error', {storageKey: message.storageKey, tempId: message.mid, error});\n\n const dialog = this.getDialogOnly(message.peerId);\n if(dialog) {\n this.rootScope.dispatchEvent('dialog_unread', {peerId: message.peerId, dialog});\n }\n } else {\n delete message.error;\n }\n });\n }\n\n public getMessagesStorageByKey(key: MessagesStorageKey) {\n const s = key.split('_');\n const peerId: PeerId = +s[0];\n const type: MessagesStorageType = s[1] as any;\n return type === 'scheduled' ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n }\n\n public getMessageFromStorage(storage: MessagesStorage | MessagesStorageKey, mid: number) {\n if(typeof(storage) === 'string') {\n storage = this.getMessagesStorageByKey(storage);\n }\n\n return storage && storage.get(mid)/* || this.generateEmptyMessage(mid) */;\n }\n\n private createMessageStorage(peerId: PeerId, type: MessagesStorageType) {\n const storage: MessagesStorage = new Map() as any;\n storage.peerId = peerId;\n storage.type = type;\n storage.key = `${peerId}_${type}`;\n\n /* let num = 0;\n Object.defineProperty(storage, 'num', {\n get: () => ++num,\n set: (_num: number) => num = _num,\n enumerable: false\n });\n\n Object.defineProperty(storage, 'generateIndex', {\n value: (message: any) => {\n if(message.index === undefined) {\n message.index = (message.date * 0x10000) + (storage.num & 0xFFFF);\n }\n },\n enumerable: false\n }); */\n\n return storage;\n }\n\n public getHistoryMessagesStorage(peerId: PeerId) {\n return this.messagesStorageByPeerId[peerId] ??= this.createMessageStorage(peerId, 'history');\n }\n\n public getMessagesStorage(key: MessagesStorageKey | MessagesStorage): MessagesStorage {\n if(typeof(key) === 'object') {\n return key;\n } else {\n return this.getMessagesStorageByKey(key);\n }\n }\n\n public getMessageById(messageId: number) {\n for(const peerId in this.messagesStorageByPeerId) {\n if(this.appPeersManager.isChannel(peerId.toPeerId())) {\n continue;\n }\n\n const message = this.messagesStorageByPeerId[peerId].get(messageId);\n if(message) {\n return message;\n }\n }\n\n return this.getMessageFromStorage(null, messageId);\n }\n\n public getMessageByPeer(peerId: PeerId, messageId: number) {\n if(!peerId) {\n return this.getMessageById(messageId);\n }\n\n return this.getMessageFromStorage(this.getHistoryMessagesStorage(peerId), messageId);\n }\n\n public getMessagePeer(message: any): PeerId {\n const toId = message.peer_id && this.appPeersManager.getPeerId(message.peer_id) || NULL_PEER_ID;\n\n return toId;\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogsStorage.getDialogOnly(peerId);\n }\n\n public cantForwardDeleteMids(storageKey: MessagesStorageKey, mids: number[]) {\n const storage = this.getMessagesStorage(storageKey);\n let cantForward = !mids.length, cantDelete = !mids.length;\n for(const mid of mids) {\n const message = this.getMessageFromStorage(storage, mid);\n if(!cantForward) {\n cantForward = !this.canForward(message);\n }\n\n if(!cantDelete) {\n cantDelete = !this.canDeleteMessage(message);\n }\n\n if(cantForward && cantDelete) break;\n }\n\n return {cantForward, cantDelete};\n }\n\n public reloadConversationOrTopic(peerId: PeerId, threadId?: number) {\n if(threadId) {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n } else {\n this.reloadConversation(peerId);\n }\n }\n\n public reloadConversation(inputPeer?: PeerId | InputPeer): CancellablePromise;\n public reloadConversation(inputPeer: PeerId | InputPeer) {\n let promise: CancellablePromise;\n if(inputPeer !== undefined) {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n this.log.warn('reloadConversation', peerId);\n\n let obj = this.reloadConversationsPeers.get(peerId);\n if(obj) {\n promise = obj.promise;\n }\n\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n this.reloadConversationsPeers.set(peerId, obj = {\n inputDialogPeer: this.appPeersManager.getInputDialogPeerById(inputPeer),\n promise\n });\n }\n\n if(this.reloadConversationsPromise) {\n return promise || this.reloadConversationsPromise;\n }\n\n this.reloadConversationsPromise = pause(0).then(() => {\n const inputDialogPeers: InputDialogPeer[] = [];\n const promises: {[peerId: string]: typeof promise} = {};\n for(const [peerId, {inputDialogPeer, promise}] of this.reloadConversationsPeers) {\n inputDialogPeers.push(inputDialogPeer);\n promises[peerId] = promise;\n }\n\n const fullfillLeft = () => {\n for(const peerId in promises) {\n this.reloadConversationsPeers.delete(+peerId);\n promises[peerId].resolve(undefined);\n }\n };\n\n const invoke = async() => {\n for(;;) {\n const result = await this.apiManager.invokeApi('messages.getPeerDialogs', {peers: inputDialogPeers});\n const currentState = this.apiUpdatesManager.updatesState;\n const {state} = result;\n if(currentState.pts && currentState.pts !== state.pts) {\n await pause(500);\n continue;\n }\n\n return result;\n }\n };\n\n return invoke().then((result) => {\n for(const peerId in promises) {\n this.reloadConversationsPeers.delete(+peerId);\n }\n\n this.dialogsStorage.applyDialogs(result);\n\n result.dialogs.forEach((dialog) => {\n const peerId = dialog.peerId;\n if(peerId) {\n promises[peerId].resolve(dialog as Dialog);\n delete promises[peerId];\n }\n });\n }, noop).then(() => {\n fullfillLeft();\n\n this.reloadConversationsPromise = null;\n if(this.reloadConversationsPeers.size) {\n this.reloadConversation();\n }\n });\n });\n\n return promise || this.reloadConversationsPromise;\n }\n\n private doFlushHistory(peerId: PeerId, just_clear?: boolean, revoke?: boolean, threadId?: number): Promise {\n let promise: Promise;\n const processResult = (affectedHistory: MessagesAffectedHistory) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n return true;\n }\n\n return this.doFlushHistory(peerId, just_clear, revoke, threadId);\n };\n\n if(!threadId) {\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'messages.deleteHistory',\n params: {\n just_clear,\n revoke,\n peer: this.appPeersManager.getInputPeerById(peerId),\n max_id: 0\n },\n processResult\n });\n } else {\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'channels.deleteTopicHistory',\n params: {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n top_msg_id: getServerMessageId(threadId)\n },\n processResult\n });\n }\n\n return promise;\n }\n\n public async flushHistory(peerId: PeerId, justClear?: boolean, revoke?: boolean, threadId?: number) {\n if(this.appPeersManager.isChannel(peerId) && !threadId) {\n const promise = this.getHistory(peerId, 0, 1);\n\n const historyResult = await promise;\n\n const channelId = peerId.toChatId();\n const maxId = historyResult.history[0] || 0;\n return this.apiManager.invokeApiSingle('channels.deleteHistory', {\n channel: this.appChatsManager.getChannelInput(channelId),\n max_id: getServerMessageId(maxId)\n }).then((bool) => {\n if(bool) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelAvailableMessages',\n channel_id: channelId,\n available_min_id: maxId\n });\n }\n\n return bool;\n });\n }\n\n return this.doFlushHistory(peerId, justClear, revoke, threadId).then(() => {\n if(!threadId) {\n this.flushStoragesByPeerId(peerId);\n }\n\n if(justClear) {\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog: this.getDialogOnly(peerId)});\n } else {\n const key = this.getTypingKey(peerId, threadId);\n delete this.notificationsToHandle[key];\n delete this.typings[key];\n\n if(!threadId) {\n const c = this.reloadConversationsPeers.get(peerId);\n if(c) {\n this.reloadConversationsPeers.delete(peerId);\n c.promise.resolve(undefined);\n }\n }\n\n this.dialogsStorage.dropDialogOnDeletion(peerId, threadId);\n }\n });\n }\n\n private flushStoragesByPeerId(peerId: PeerId) {\n [\n this.historiesStorage,\n this.threadsStorage,\n this.searchesStorage,\n this.pendingAfterMsgs,\n this.pendingTopMsgs\n ].forEach((s) => {\n delete s[peerId];\n });\n\n for(const key in this.pinnedMessages) {\n if(+key === peerId || key.startsWith(peerId + '_')) {\n delete this.pinnedMessages[key];\n }\n }\n\n const needSingleMessages = this.needSingleMessages.get(peerId);\n if(needSingleMessages) {\n for(const [mid, promise] of needSingleMessages) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n\n needSingleMessages.clear();\n }\n\n [\n this.messagesStorageByPeerId,\n this.scheduledMessagesStorage\n ].forEach((s) => {\n const ss = s[peerId];\n if(ss) {\n ss.clear();\n }\n });\n\n this.dialogsStorage.flushForumTopicsCache(peerId);\n }\n\n public hidePinnedMessages(peerId: PeerId) {\n return Promise.all([\n this.appStateManager.getState(),\n this.getPinnedMessage(peerId)\n ])\n .then(([state, pinned]) => {\n state.hiddenPinnedMessages[peerId] = pinned.maxId;\n this.rootScope.dispatchEvent('peer_pinned_hidden', {peerId, maxId: pinned.maxId});\n });\n }\n\n public getPinnedMessagesKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n }\n\n public getPinnedMessage(peerId: PeerId, threadId?: number) {\n const p = this.pinnedMessages[this.getPinnedMessagesKey(peerId, threadId)] ??= {};\n if(p.promise) return p.promise;\n else if(p.maxId) return Promise.resolve(p);\n\n return p.promise = this.getSearch({\n peerId,\n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId: 0,\n limit: 1,\n threadId\n }).then((result) => {\n p.count = result.count;\n p.maxId = result.history[0]?.mid;\n return p;\n }).finally(() => {\n delete p.promise;\n });\n }\n\n public getPinnedMessagesCount(peerId: PeerId, threadId?: number) {\n return this.pinnedMessages[this.getPinnedMessagesKey(peerId, threadId)]?.count;\n }\n\n public getPinnedMessagesMaxId(peerId: PeerId, threadId?: number) {\n return this.pinnedMessages[this.getPinnedMessagesKey(peerId, threadId)]?.maxId;\n }\n\n public updatePinnedMessage(peerId: PeerId, mid: number, unpin?: boolean, silent?: boolean, pm_oneside?: boolean) {\n return this.apiManager.invokeApi('messages.updatePinnedMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n unpin,\n silent,\n pm_oneside,\n id: getServerMessageId(mid)\n }).then((updates) => {\n // this.log('pinned updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public unpinAllMessages(peerId: PeerId): Promise {\n return this.apiManager.invokeApiSingle('messages.unpinAllMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId)\n }).then((affectedHistory) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n const storage = this.getHistoryMessagesStorage(peerId);\n storage.forEach((message) => {\n if((message as Message.message).pFlags.pinned) {\n delete (message as Message.message).pFlags.pinned;\n }\n });\n\n this.rootScope.dispatchEvent('peer_pinned_messages', {peerId, unpinAll: true});\n delete this.pinnedMessages[this.getPinnedMessagesKey(peerId)];\n\n return true;\n }\n\n return this.unpinAllMessages(peerId);\n });\n }\n\n public getAlbumText(grouped_id: string) {\n const group = this.groupedMessagesStorage[grouped_id];\n return getAlbumText(Array.from(group.values()) as Message.message[]);\n }\n\n public getGroupsFirstMessage(message: Message.message) {\n if(!message?.grouped_id) return message;\n\n const storage = this.groupedMessagesStorage[message.grouped_id];\n let minMid = Number.MAX_SAFE_INTEGER;\n for(const [mid, message] of storage) {\n if(message.mid < minMid) {\n minMid = message.mid;\n }\n }\n\n return this.getMessageFromStorage(storage, minMid) as Message.message;\n }\n\n public getMidsByAlbum(groupedId: string, sort: 'asc' | 'desc' = 'asc') {\n return getObjectKeysAndSort(this.groupedMessagesStorage[groupedId], sort);\n }\n\n public getMessagesByAlbum(groupedId: string) {\n const mids = this.getMidsByAlbum(groupedId, 'asc');\n const storage = this.groupedMessagesStorage[groupedId];\n return mids.map((mid) => this.getMessageFromStorage(storage, mid) as Message.message);\n }\n\n public getMidsByMessage(message: Message) {\n if(!message) return [];\n else if((message as Message.message).grouped_id) return this.getMidsByAlbum((message as Message.message).grouped_id);\n else return [message.mid];\n }\n\n public filterMessages(message: MyMessage, verify: (message: MyMessage) => boolean) {\n const out: MyMessage[] = [];\n if((message as Message.message).grouped_id) {\n const storage = this.groupedMessagesStorage[(message as Message.message).grouped_id];\n for(const [mid, message] of storage) {\n if(verify(message)) {\n out.push(message);\n }\n }\n } else {\n if(verify(message)) {\n out.push(message);\n }\n }\n\n return out;\n }\n\n public generateTempMessageId(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n return this.appMessagesIdsManager.generateTempMessageId(dialog?.top_message || 0);\n }\n\n public setMessageUnreadByDialog(message: MyMessage, dialog: Dialog | ForumTopic = this.getDialogOnly(message.peerId)) {\n if(dialog && message.mid) {\n if(message.mid > dialog[message.pFlags.out ?\n 'read_outbox_max_id' :\n 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n }\n }\n }\n\n public saveMessage(message: Message, options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n // isNew: boolean, // * new - from update\n }> = {}) {\n if(!message || message._ === 'messageEmpty') {\n return;\n }\n\n message.pFlags ??= {};\n\n // * exclude from state\n // defineNotNumerableProperties(message, ['rReply', 'mid', 'savedFrom', 'fwdFromId', 'fromId', 'peerId', 'reply_to_mid', 'viaBotId']);\n\n const peerId = this.getMessagePeer(message);\n const storage = options.storage || this.getHistoryMessagesStorage(peerId);\n const isChannel = message.peer_id._ === 'peerChannel';\n const isBroadcast = isChannel && this.appChatsManager.isBroadcast(peerId.toChatId());\n const isMessage = message._ === 'message';\n\n if(options.isOutgoing) {\n message.pFlags.is_outgoing = true;\n }\n\n const mid = generateMessageId(message.id);\n message.mid = mid;\n\n if(isMessage) {\n if(options.isScheduled) {\n message.pFlags.is_scheduled = true;\n }\n\n if(message.grouped_id) {\n const storage = this.groupedMessagesStorage[message.grouped_id] ??= this.createMessageStorage(peerId, 'grouped');\n storage.set(mid, message);\n }\n\n if(message.via_bot_id) {\n // ! WARNING\n message.viaBotId = message.via_bot_id as any;\n }\n }\n\n // this.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'])\n\n const replyTo = message.reply_to;\n if(replyTo) {\n if(replyTo.reply_to_msg_id) {\n replyTo.reply_to_msg_id = message.reply_to_mid = generateMessageId(replyTo.reply_to_msg_id);\n }\n\n if(replyTo.reply_to_top_id) {\n replyTo.reply_to_top_id = generateMessageId(replyTo.reply_to_top_id);\n }\n }\n\n const replies = isMessage && message.replies;\n if(replies) {\n if(replies.max_id) replies.max_id = generateMessageId(replies.max_id);\n if(replies.read_max_id) replies.read_max_id = generateMessageId(replies.read_max_id);\n }\n\n const overwriting = !!peerId;\n if(!overwriting) {\n message.date -= this.timeManager.getServerTimeOffset();\n }\n\n // storage.generateIndex(message);\n const myId = this.appPeersManager.peerId;\n\n const fwdHeader = isMessage && (message as Message.message).fwd_from;\n\n message.peerId = peerId;\n if(peerId === myId/* && !message.from_id && !message.fwd_from */) {\n message.fromId = fwdHeader ? (fwdHeader.from_id ? this.appPeersManager.getPeerId(fwdHeader.from_id) : NULL_PEER_ID) : myId;\n } else {\n // message.fromId = message.pFlags.post || (!message.pFlags.out && !message.from_id) ? peerId : appPeersManager.getPeerId(message.from_id);\n message.fromId = message.pFlags.post || !message.from_id ? peerId : this.appPeersManager.getPeerId(message.from_id);\n }\n\n this.setMessageUnreadByDialog(message);\n\n if(fwdHeader) {\n // if(peerId === myID) {\n if(fwdHeader.saved_from_msg_id) fwdHeader.saved_from_msg_id = generateMessageId(fwdHeader.saved_from_msg_id);\n if(fwdHeader.channel_post) fwdHeader.channel_post = generateMessageId(fwdHeader.channel_post);\n\n const peer = fwdHeader.saved_from_peer || fwdHeader.from_id;\n const msgId = fwdHeader.saved_from_msg_id || fwdHeader.channel_post;\n if(peer && msgId) {\n const savedFromPeerId = this.appPeersManager.getPeerId(peer);\n const savedFromMid = generateMessageId(msgId);\n message.savedFrom = savedFromPeerId + '_' + savedFromMid;\n }\n\n /* if(peerId.isAnyChat() || peerId === myID) {\n message.fromId = appPeersManager.getPeerID(!message.from_id || deepEqual(message.from_id, fwdHeader.from_id) ? fwdHeader.from_id : message.from_id);\n } */\n /* } else {\n apiMessage.fwdPostID = fwdHeader.channel_post;\n } */\n\n message.fwdFromId = this.appPeersManager.getPeerId(fwdHeader.from_id);\n\n if(!overwriting) {\n fwdHeader.date -= this.timeManager.getServerTimeOffset();\n }\n }\n\n const mediaContext: ReferenceContext = {\n type: 'message',\n peerId,\n messageId: mid\n };\n\n /* if(isMessage) {\n const entities = message.entities;\n if(entities && entities.find((entity) => entity._ === 'messageEntitySpoiler')) {\n message.media = {_: 'messageMediaUnsupported'};\n }\n } */\n\n let unsupported = false;\n const media = isMessage && message.media;\n if(media) {\n switch(media._) {\n case 'messageMediaEmpty': {\n delete message.media;\n break;\n }\n\n case 'messageMediaPhoto': {\n if(media.ttl_seconds) {\n unsupported = true;\n } else {\n media.photo = this.appPhotosManager.savePhoto(media.photo, mediaContext);\n }\n\n if(!(media as MessageMedia.messageMediaPhoto).photo) { // * found this bug on test DC\n delete message.media;\n }\n\n break;\n }\n\n case 'messageMediaPoll': {\n const result = this.appPollsManager.savePoll(media.poll, media.results, message);\n media.poll = result.poll;\n media.results = result.results;\n break;\n }\n\n case 'messageMediaDocument': {\n if(media.ttl_seconds) {\n unsupported = true;\n } else {\n const originalDoc = media.document;\n media.document = this.appDocsManager.saveDoc(originalDoc, mediaContext); // 11.04.2020 warning\n\n if(!media.document && originalDoc._ !== 'documentEmpty') {\n unsupported = true;\n }\n }\n\n break;\n }\n\n case 'messageMediaWebPage': {\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(peerId, mid, options.isScheduled);\n media.webpage = this.appWebPagesManager.saveWebPage(media.webpage, messageKey, mediaContext);\n\n if(!media.webpage) {\n delete message.media;\n }\n\n break;\n }\n\n /* case 'messageMediaGame':\n AppGamesManager.saveGame(apiMessage.media.game, apiMessage.mid, mediaContext);\n apiMessage.media.handleMessage = true;\n break; */\n\n case 'messageMediaInvoice': {\n media.photo = this.appWebDocsManager.saveWebDocument(media.photo);\n const extendedMedia = media.extended_media;\n if(extendedMedia?._ === 'messageExtendedMedia') {\n const extendedMediaMedia = extendedMedia.media;\n (extendedMediaMedia as MessageMedia.messageMediaPhoto).photo = this.appPhotosManager.savePhoto((extendedMediaMedia as MessageMedia.messageMediaPhoto).photo, mediaContext);\n (extendedMediaMedia as MessageMedia.messageMediaDocument).document = this.appDocsManager.saveDoc((extendedMediaMedia as MessageMedia.messageMediaDocument).document, mediaContext);\n }\n break;\n }\n\n case 'messageMediaUnsupported': {\n unsupported = true;\n break;\n }\n }\n }\n\n // if(isMessage && !unsupported && message.entities) {\n // unsupported = message.entities.some((entity) => entity._ === 'messageEntityCustomEmoji');\n // }\n\n if(isMessage && unsupported) {\n message.media = {_: 'messageMediaUnsupported'};\n message.message = '';\n delete message.entities;\n delete message.totalEntities;\n }\n\n if(!isMessage && message.action) {\n const action = message.action as MessageAction;\n const suffix = message.fromId === this.appUsersManager.getSelf().id ? 'You' : '';\n let migrateFrom: PeerId, migrateTo: PeerId;\n\n if((action as MessageAction.messageActionChatEditPhoto).photo) {\n (action as MessageAction.messageActionChatEditPhoto).photo = this.appPhotosManager.savePhoto((action as MessageAction.messageActionChatEditPhoto).photo, mediaContext);\n }\n\n if((action as any).document) {\n (action as any).document = this.appDocsManager.saveDoc((action as any).photo, mediaContext);\n }\n\n switch(action._) {\n // case 'messageActionChannelEditPhoto':\n case 'messageActionChatEditPhoto':\n // action.photo = appPhotosManager.savePhoto(action.photo, mediaContext);\n if((action.photo as Photo.photo)?.video_sizes) {\n // @ts-ignore\n action._ = isBroadcast ? 'messageActionChannelEditVideo' : 'messageActionChatEditVideo';\n } else {\n if(isBroadcast) { // ! messageActionChannelEditPhoto не существует в принципе, это используется для перевода.\n // @ts-ignore\n action._ = 'messageActionChannelEditPhoto';\n }\n }\n break;\n\n case 'messageActionGroupCall': {\n // assumeType(action);\n\n this.appGroupCallsManager.saveGroupCall(action.call);\n\n let type: string;\n if(action.duration === undefined) {\n type = 'started';\n } else {\n type = 'ended'\n }\n\n if(!isBroadcast) {\n type += '_by' + suffix;\n }\n\n // @ts-ignore\n action.type = type;\n\n break;\n }\n\n case 'messageActionChatEditTitle':\n /* if(options.isNew) {\n const chat = appChatsManager.getChat(peerId.toChatId());\n chat.title = action.title;\n appChatsManager.saveApiChat(chat, true);\n } */\n\n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelEditTitle';\n }\n break;\n\n case 'messageActionChatDeletePhoto':\n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelDeletePhoto';\n }\n break;\n\n case 'messageActionChatAddUser':\n if(action.users.length === 1) {\n // @ts-ignore\n action.user_id = action.users[0];\n // @ts-ignore\n if(message.fromId === action.user_id) {\n if(isChannel) {\n // @ts-ignore\n action._ = 'messageActionChatJoined' + suffix;\n } else {\n // @ts-ignore\n action._ = 'messageActionChatReturn' + suffix;\n }\n }\n } else if(action.users.length > 1) {\n // @ts-ignore\n action._ = 'messageActionChatAddUsers';\n }\n break;\n\n case 'messageActionChatDeleteUser':\n if(message.fromId === action.user_id) {\n // @ts-ignore\n action._ = 'messageActionChatLeave' + suffix;\n }\n break;\n\n case 'messageActionChannelMigrateFrom':\n migrateFrom = action.chat_id.toPeerId(true);\n migrateTo = peerId;\n break\n\n case 'messageActionChatMigrateTo':\n migrateFrom = peerId;\n migrateTo = action.channel_id.toPeerId(true);\n break;\n\n case 'messageActionHistoryClear':\n // apiMessage.deleted = true;\n message.clear_history = true;\n delete message.pFlags.out;\n delete message.pFlags.unread;\n break;\n\n case 'messageActionPhoneCall':\n // @ts-ignore\n action.type =\n (action.pFlags.video ? 'video_' : '') +\n (action.duration !== undefined ? (message.pFlags.out ? 'out_' : 'in_') : '') +\n (\n action.duration !== undefined ? 'ok' : (\n action.reason._ === 'phoneCallDiscardReasonMissed' ?\n 'missed' :\n 'cancelled'\n )\n );\n break;\n }\n\n if(migrateFrom &&\n migrateTo &&\n !this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo]) {\n this.migrateChecks(migrateFrom, migrateTo);\n }\n }\n\n /* if(message.grouped_id) {\n if(!groups) {\n groups = new Set();\n }\n\n groups.add(message.grouped_id);\n } else {\n message.rReply = this.getRichReplyText(message);\n } */\n\n if(isMessage && message.message.length && !message.totalEntities) {\n this.wrapMessageEntities(message);\n }\n\n storage.set(mid, message);\n\n return message;\n }\n\n public saveMessages(messages: any[], options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n // isNew: boolean, // * new - from update\n }> = {}): (Message.message | Message.messageService)[] {\n if((messages as any).saved) return messages;\n (messages as any).saved = true;\n messages.forEach((message, idx, arr) => {\n arr[idx] = this.saveMessage(message, options);\n });\n\n return messages;\n }\n\n public async getFirstMessageToEdit(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n let goodMessage: Message.message | Message.messageService;\n const myPeerId = this.appPeersManager.peerId;\n for(const mid of slice) {\n const message = this.getMessageByPeer(peerId, mid);\n const good = myPeerId === peerId ? message.fromId === myPeerId : message.pFlags.out;\n\n if(good) {\n if(await this.canEditMessage(message, 'text')) {\n goodMessage = message;\n break;\n }\n\n // * this check will allow editing only last message\n // break;\n }\n }\n\n return goodMessage;\n }\n }\n\n private wrapMessageEntities(message: Message.message) {\n const apiEntities = message.entities ? message.entities.slice() : [];\n message.message = fixEmoji(message.message, apiEntities);\n\n const myEntities = parseEntities(message.message);\n message.totalEntities = mergeEntities(apiEntities, myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n }\n\n public reportMessages(peerId: PeerId, mids: number[], reason: ReportReason['_'], message?: string) {\n return this.apiManager.invokeApiSingle('messages.report', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n reason: {\n _: reason\n },\n message\n });\n }\n\n public startBot(botId: BotId, chatId?: ChatId, startParam?: string) {\n const peerId = chatId ? chatId.toPeerId(true) : botId.toPeerId();\n if(startParam) {\n const randomId = randomLong();\n\n return this.apiManager.invokeApi('messages.startBot', {\n bot: this.appUsersManager.getUserInput(botId),\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: randomId,\n start_param: startParam\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n const str = '/start';\n if(chatId) {\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.appChatsManager.inviteToChannel(chatId, [botId]);\n } else {\n promise = this.appChatsManager.addChatUser(chatId, botId, 0);\n }\n\n return promise.catch((error: ApiError) => {\n if(error?.type == 'USER_ALREADY_PARTICIPANT') {\n error.handled = true;\n return;\n }\n\n throw error;\n }).then(() => {\n return this.sendText(peerId, str + '@' + this.appPeersManager.getPeerUsername(botId.toPeerId()));\n });\n }\n\n return this.sendText(peerId, str);\n }\n\n public editPeerFolders(peerIds: PeerId[], folderId: number) {\n this.apiManager.invokeApi('folders.editPeerFolders', {\n folder_peers: peerIds.map((peerId) => {\n return {\n _: 'inputFolderPeer',\n peer: this.appPeersManager.getInputPeerById(peerId),\n folder_id: folderId\n };\n })\n }).then((updates) => {\n // this.log('editPeerFolders updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates); // WARNING! возможно тут нужно добавлять channelId, и вызывать апдейт для каждого канала отдельно\n });\n }\n\n public getFilter(filterId: number) {\n return this.filtersStorage.getFilter(filterId);\n }\n\n public async toggleDialogPin(options: {\n peerId: PeerId,\n filterId?: number,\n topicId?: number\n }) {\n const {peerId, topicId, filterId = topicId ? peerId : undefined} = options;\n if(filterId === undefined) {\n throw new Error('No filterId');\n }\n\n if(filterId > 1) {\n return this.filtersStorage.toggleDialogPin(peerId, filterId);\n }\n\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, topicId);\n if(!dialog) throw undefined;\n\n const pinned = dialog.pFlags?.pinned ? undefined : true;\n\n if(pinned) {\n const max = await this.apiManager.getLimit(topicId ? 'topicPin' : (filterId === 1 ? 'folderPin' : 'pin'));\n if(this.dialogsStorage.getPinnedOrders(filterId).length >= max) {\n throw makeError(topicId ? 'PINNED_TOO_MUCH' : 'PINNED_DIALOGS_TOO_MUCH');\n }\n }\n\n if(topicId) {\n return this.appChatsManager.updatePinnedForumTopic(peerId.toChatId(), topicId, pinned);\n }\n\n return this.apiManager.invokeApi('messages.toggleDialogPin', {\n peer: this.appPeersManager.getInputDialogPeerById(peerId),\n pinned\n }).then((bool) => {\n const pFlags: Update.updateDialogPinned['pFlags'] = pinned ? {pinned} : {};\n this.apiUpdatesManager.saveUpdate({\n _: 'updateDialogPinned',\n peer: this.appPeersManager.getDialogPeer(peerId),\n folder_id: filterId,\n pFlags\n });\n });\n }\n\n public markDialogUnread(peerId: PeerId, read?: true) {\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const unread = read || dialog.pFlags?.unread_mark ? undefined : true;\n return this.apiManager.invokeApi('messages.markDialogUnread', {\n peer: this.appPeersManager.getInputDialogPeerById(peerId),\n unread\n }).then((bool) => {\n if(bool) {\n const pFlags: Update.updateDialogUnreadMark['pFlags'] = unread ? {unread} : {};\n this.onUpdateDialogUnreadMark({\n _: 'updateDialogUnreadMark',\n peer: this.appPeersManager.getDialogPeer(peerId),\n pFlags\n });\n }\n });\n }\n\n public migrateChecks(migrateFrom: PeerId, migrateTo: PeerId) {\n if(!this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo] &&\n this.appChatsManager.hasChat(migrateTo.toChatId())) {\n const fromChat = this.appChatsManager.getChat(migrateFrom.toChatId()) as Chat.chat;\n if(fromChat?.migrated_to && (fromChat.migrated_to as InputChannel.inputChannel).channel_id === migrateTo.toChatId()) {\n this.migratedFromTo[migrateFrom] = migrateTo;\n this.migratedToFrom[migrateTo] = migrateFrom;\n\n this.rootScope.dispatchEvent('dialog_migrate', {migrateFrom, migrateTo});\n\n this.dialogsStorage.dropDialogWithEvent(migrateFrom);\n }\n }\n }\n\n private canMessageBeEdited(message: Message, kind: 'text' | 'poll') {\n if((message as Message.message)?.pFlags?.is_outgoing) {\n return false;\n }\n\n const goodMedias = [\n 'messageMediaPhoto',\n 'messageMediaDocument',\n 'messageMediaWebPage'\n ];\n\n if(kind === 'poll') {\n goodMedias.push('messageMediaPoll');\n }\n\n if(!message ||\n message._ !== 'message' ||\n message.deleted ||\n message.fwd_from ||\n message.via_bot_id ||\n message.media && goodMedias.indexOf(message.media._) === -1 ||\n message.fromId && this.appUsersManager.isBot(message.fromId)) {\n return false;\n }\n\n if(message.media?._ === 'messageMediaDocument' &&\n ((message.media.document as Document.document).sticker || (message.media.document as Document.document).type === 'round')) {\n return false;\n }\n\n return true;\n }\n\n public async canEditMessage(message: Message.message | Message.messageService, kind: 'text' | 'poll' = 'text') {\n if(!message || !this.canMessageBeEdited(message, kind)) {\n return false;\n }\n\n // * second rule for saved messages, because there is no 'out' flag\n if(/* message.pFlags.out || */this.getMessagePeer(message) === this.appUsersManager.getSelf().id) {\n return true;\n }\n\n const canEditMessageInPeer = this.appPeersManager.isBroadcast(message.peerId) ?\n this.appChatsManager.hasRights(message.peerId.toChatId(), 'edit_messages') :\n message.pFlags.out;\n\n if(\n !canEditMessageInPeer || (\n message.peer_id._ !== 'peerChannel' &&\n message.date < (tsNow(true) - (await this.apiManager.getConfig()).edit_time_limit) &&\n (message as Message.message).media?._ !== 'messageMediaPoll'\n )\n ) {\n return false;\n }\n\n return true;\n }\n\n public canDeleteMessage(message: MyMessage) {\n return message && (\n message.peerId.isUser() ||\n message.pFlags.out ||\n this.appChatsManager.getChat(message.peerId.toChatId())._ === 'chat' ||\n this.appChatsManager.hasRights(message.peerId.toChatId(), 'delete_messages')\n ) && (!message.pFlags.is_outgoing || !!message.error);\n }\n\n public getReplyKeyboard(peerId: PeerId) {\n return this.getHistoryStorage(peerId).replyMarkup;\n }\n\n public mergeReplyKeyboard(historyStorage: HistoryStorage, message: Message.messageService | Message.message) {\n // this.log('merge', message.mid, message.reply_markup, historyStorage.reply_markup)\n if(!message) {\n return false;\n }\n\n const messageReplyMarkup = (message as Message.message).reply_markup;\n if(!messageReplyMarkup &&\n !message.pFlags?.out &&\n !(message as Message.messageService).action) {\n return false;\n }\n\n if(messageReplyMarkup?._ === 'replyInlineMarkup') {\n return false;\n }\n\n const lastReplyMarkup = historyStorage.replyMarkup;\n if(messageReplyMarkup) {\n if(lastReplyMarkup && lastReplyMarkup.mid >= message.mid) {\n return false;\n }\n\n if(messageReplyMarkup.pFlags.selective) {\n return false;\n }\n\n if(historyStorage.maxOutId &&\n message.mid < historyStorage.maxOutId &&\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.single_use) {\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.hidden = true;\n }\n\n messageReplyMarkup.mid = message.mid;\n /* messageReplyMarkup = Object.assign({\n mid: message.mid\n }, messageReplyMarkup); */\n\n if(messageReplyMarkup._ !== 'replyKeyboardHide') {\n messageReplyMarkup.fromId = this.appPeersManager.getPeerId(message.from_id);\n }\n\n historyStorage.replyMarkup = messageReplyMarkup;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n if(message.pFlags.out) {\n if(lastReplyMarkup) {\n assumeType(lastReplyMarkup);\n if(lastReplyMarkup.pFlags.single_use &&\n !lastReplyMarkup.pFlags.hidden &&\n (message.mid > lastReplyMarkup.mid || message.pFlags.is_outgoing) &&\n (message as Message.message).message) {\n lastReplyMarkup.pFlags.hidden = true;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n } else if(!historyStorage.maxOutId ||\n message.mid > historyStorage.maxOutId) {\n historyStorage.maxOutId = message.mid;\n }\n }\n\n assumeType(message);\n if(message.action?._ === 'messageActionChatDeleteUser' &&\n (lastReplyMarkup ?\n message.action.user_id === (lastReplyMarkup as ReplyMarkup.replyKeyboardMarkup).fromId :\n this.appUsersManager.isBot(message.action.user_id)\n )\n ) {\n historyStorage.replyMarkup = {\n _: 'replyKeyboardHide',\n mid: message.mid,\n pFlags: {}\n };\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n return false;\n }\n\n public getSearchStorage(peerId: PeerId, inputFilter: MyInputMessagesFilter) {\n if(!this.searchesStorage[peerId]) this.searchesStorage[peerId] = {};\n if(!this.searchesStorage[peerId][inputFilter]) this.searchesStorage[peerId][inputFilter] = {history: []};\n return this.searchesStorage[peerId][inputFilter];\n }\n\n public getSearchCounters(\n peerId: PeerId,\n filters: MessagesFilter[],\n canCache = true,\n threadId?: number\n ): Promise {\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n return Promise.resolve(filters.map((filter) => {\n return {\n _: 'messages.searchCounter',\n pFlags: {},\n filter: filter,\n count: 0\n };\n }));\n }\n\n const func = (canCache ? this.apiManager.invokeApiCacheable : this.apiManager.invokeApi).bind(this.apiManager);\n return func('messages.getSearchCounters', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n filters,\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n });\n }\n\n public filterMessagesByInputFilterFromStorage(inputFilter: MyInputMessagesFilter, history: number[], storage: MessagesStorage | MessagesStorageKey, limit: number) {\n const _storage = this.getMessagesStorage(storage);\n return filterMessagesByInputFilter(inputFilter, history.map((mid) => _storage.get(mid)), limit);\n }\n\n public getSearch({peerId, query, inputFilter, maxId, limit, nextRate, backLimit, threadId, folderId, minDate, maxDate}: {\n peerId?: PeerId,\n maxId?: number,\n limit?: number,\n nextRate?: number,\n backLimit?: number,\n threadId?: number,\n folderId?: number,\n query?: string,\n inputFilter?: {\n _: MyInputMessagesFilter\n },\n minDate?: number,\n maxDate?: number\n }): Promise<{\n count: number,\n next_rate: number,\n offset_id_offset: number,\n history: MyMessage[]\n }> {\n if(this.appPeersManager.isPeerRestricted(peerId)/* || true */) {\n return Promise.resolve({\n count: 0,\n offset_id_offset: 0,\n next_rate: undefined,\n history: []\n });\n }\n\n if(!query) query = '';\n if(!inputFilter) inputFilter = {_: 'inputMessagesFilterEmpty'};\n if(limit === undefined) limit = 20;\n if(!nextRate) nextRate = 0;\n if(!backLimit) backLimit = 0;\n\n minDate = minDate ? minDate / 1000 | 0 : 0;\n maxDate = maxDate ? maxDate / 1000 | 0 : 0;\n\n let foundMsgs: MyMessage[] = [];\n\n // this.log('search', maxId);\n\n if(backLimit) {\n limit += backLimit;\n }\n\n // const beta = inputFilter._ === 'inputMessagesFilterPinned' && !backLimit;\n const beta = false;\n\n let storage: {\n count?: number;\n history: SlicedArray;\n };\n\n // * костыль для limit 1, если нужно и получить сообщение, и узнать количество сообщений\n if(peerId && !backLimit && !maxId && !query && limit !== 1 && !threadId/* && inputFilter._ !== 'inputMessagesFilterPinned' */) {\n storage = beta ?\n this.getSearchStorage(peerId, inputFilter._) as any :\n this.getHistoryStorage(peerId);\n foundMsgs = this.filterMessagesByInputFilterFromStorage(inputFilter._, storage.history.slice, this.getHistoryMessagesStorage(peerId), limit);\n }\n\n if(foundMsgs.length) {\n if(foundMsgs.length < limit && (beta ? storage.count !== storage.history.length : true)) {\n maxId = foundMsgs[foundMsgs.length - 1].mid;\n limit = limit - foundMsgs.length;\n } else {\n return Promise.resolve({\n count: beta ? storage.count : 0,\n next_rate: 0,\n offset_id_offset: 0,\n history: foundMsgs\n });\n }\n } else if(beta && storage?.count) {\n return Promise.resolve({\n count: storage.count,\n next_rate: 0,\n offset_id_offset: 0,\n history: []\n });\n }\n\n const canCache = false && (['inputMessagesFilterChatPhotos', 'inputMessagesFilterPinned'] as MyInputMessagesFilter[]).includes(inputFilter._);\n const method = (canCache ? this.apiManager.invokeApiCacheable : this.apiManager.invokeApi).bind(this.apiManager);\n\n let apiPromise: Promise;\n if(peerId && !nextRate && folderId === undefined/* || !query */) {\n apiPromise = method('messages.search', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n q: query || '',\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n limit,\n offset_id: getServerMessageId(maxId) || 0,\n add_offset: backLimit ? -backLimit : 0,\n max_id: 0,\n min_id: 0,\n hash: '',\n top_msg_id: getServerMessageId(threadId) || 0\n }, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n });\n } else {\n // var offsetDate = 0;\n let offsetPeerId: PeerId;\n let offsetId = 0;\n const offsetMessage = maxId && this.getMessageByPeer(peerId, maxId);\n\n if(offsetMessage && offsetMessage.date) {\n // offsetDate = offsetMessage.date + timeManager.getServerTimeOffset();\n offsetId = offsetMessage.id;\n offsetPeerId = this.getMessagePeer(offsetMessage);\n }\n\n apiPromise = method('messages.searchGlobal', {\n q: query,\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n offset_rate: nextRate,\n offset_peer: this.appPeersManager.getInputPeerById(offsetPeerId),\n offset_id: offsetId,\n limit,\n folder_id: folderId\n }, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n });\n }\n\n return apiPromise.then((searchResult: any) => {\n this.appUsersManager.saveApiUsers(searchResult.users);\n this.appChatsManager.saveApiChats(searchResult.chats);\n this.saveMessages(searchResult.messages);\n\n /* if(beta && storage && (!maxId || storage.history[storage.history.length - 1] === maxId)) {\n const storage = this.getSearchStorage(peerId, inputFilter._);\n const add = (searchResult.messages.map((m: any) => m.mid) as number[]).filter((mid) => storage.history.indexOf(mid) === -1);\n storage.history.push(...add);\n storage.history.sort((a, b) => b - a);\n storage.count = searchResult.count;\n } */\n\n if(DEBUG) {\n this.log('getSearch result:', inputFilter, searchResult);\n }\n\n const foundCount: number = searchResult.count || (foundMsgs.length + searchResult.messages.length);\n\n searchResult.messages.forEach((message: MyMessage) => {\n const peerId = this.getMessagePeer(message);\n if(peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n if(chat.migrated_to) {\n this.migrateChecks(peerId, (chat.migrated_to as InputChannel.inputChannel).channel_id.toPeerId(true));\n }\n }\n\n foundMsgs.push(message);\n });\n\n return {\n count: foundCount,\n offset_id_offset: searchResult.offset_id_offset || 0,\n next_rate: searchResult.next_rate,\n history: foundMsgs\n };\n });\n }\n\n public subscribeRepliesThread(peerId: PeerId, mid: number) {\n const repliesKey = peerId + '_' + mid;\n for(const threadKey in this.threadsToReplies) {\n if(this.threadsToReplies[threadKey] === repliesKey) return;\n }\n\n this.getDiscussionMessage(peerId, mid);\n }\n\n public generateThreadServiceStartMessage(message: Message.message | Message.messageService) {\n const threadKey = message.peerId + '_' + message.mid;\n if(this.threadsServiceMessagesIdsStorage[threadKey]) return;\n\n const maxMessageId = getServerMessageId(Math.max(...this.getMidsByMessage(message)));\n const serviceStartMessage: Message.messageService = {\n _: 'messageService',\n pFlags: {\n is_single: true\n },\n id: this.appMessagesIdsManager.generateTempMessageId(maxMessageId),\n date: message.date,\n from_id: {_: 'peerUser', user_id: NULL_PEER_ID}/* message.from_id */,\n peer_id: message.peer_id,\n action: {\n _: 'messageActionDiscussionStarted'\n },\n reply_to: this.generateReplyHeader(message.peerId, message.id)\n };\n\n this.saveMessages([serviceStartMessage], {isOutgoing: true});\n this.threadsServiceMessagesIdsStorage[threadKey] = serviceStartMessage.mid;\n }\n\n public getThreadServiceMessageId(peerId: PeerId, threadId: number) {\n return this.threadsServiceMessagesIdsStorage[peerId + '_' + threadId];\n }\n\n public getDiscussionMessage(peerId: PeerId, mid: number) {\n return this.apiManager.invokeApiSingle('messages.getDiscussionMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((result) => {\n this.appChatsManager.saveApiChats(result.chats);\n this.appUsersManager.saveApiUsers(result.users);\n this.saveMessages(result.messages);\n\n const message = this.getMessageWithReplies(result.messages[0] as Message.message);\n const threadKey = message.peerId + '_' + message.mid;\n\n this.generateThreadServiceStartMessage(message);\n\n const historyStorage = this.getHistoryStorage(message.peerId, message.mid);\n const newMaxId = result.max_id = generateMessageId(result.max_id) || 0;\n result.read_inbox_max_id = historyStorage.readMaxId = generateMessageId(result.read_inbox_max_id ?? message.mid);\n result.read_outbox_max_id = historyStorage.readOutboxMaxId = generateMessageId(result.read_outbox_max_id) || 0;\n\n const first = historyStorage.history.first;\n if(historyStorage.maxId && historyStorage.maxId < newMaxId && first.isEnd(SliceEnd.Bottom)) {\n first.unsetEnd(SliceEnd.Bottom);\n }\n historyStorage.maxId = newMaxId;\n\n this.threadsToReplies[threadKey] = peerId + '_' + mid;\n\n return message;\n });\n }\n\n private handleNewMessage(message: MyMessage) {\n this.rootScope.dispatchEvent('history_multiappend', message);\n }\n\n private handleNewDialogs = () => {\n let newMaxSeenId = 0;\n const updateMap: BroadcastEvents['dialogs_multiupdate']= new Map();\n\n const processDialog = (dialog: MTDialog.dialog | ForumTopic) => {\n const {peerId} = dialog;\n this.dialogsStorage.pushDialog({dialog});\n if(!this.appPeersManager.isChannel(peerId)) {\n newMaxSeenId = Math.max(newMaxSeenId, dialog.top_message || 0);\n }\n\n let cache = updateMap.get(peerId);\n if(!cache) {\n updateMap.set(peerId, cache = {});\n }\n\n if(dialog._ === 'forumTopic') {\n (cache.topics ??= new Map()).set(dialog.id, dialog);\n } else {\n cache.dialog = dialog;\n }\n };\n\n for(const [peerId, obj] of this.newDialogsToHandle) {\n const isDialogDefined = 'dialog' in obj;\n const {dialog, topics} = obj;\n\n if(isDialogDefined) {\n if(!dialog) {\n this.reloadConversation(peerId.toPeerId());\n } else if(this.dialogsStorage.getDialogOnly(peerId)) { // * can be already dropped\n processDialog(dialog);\n }\n }\n\n if(topics) {\n topics?.forEach((topic, id) => {\n if(!topic) {\n this.dialogsStorage.getForumTopicById(peerId, id);\n } else if(this.dialogsStorage.getForumTopic(peerId, id)) { // * can be already dropped\n processDialog(topic);\n }\n });\n }\n }\n\n // this.log('after order:', this.dialogsStorage[0].map((d) => d.peerId));\n\n if(newMaxSeenId !== 0) {\n this.incrementMaxSeenId(newMaxSeenId);\n }\n\n this.rootScope.dispatchEvent('dialogs_multiupdate', updateMap);\n this.newDialogsToHandle.clear();\n };\n\n public scheduleHandleNewDialogs(peerId?: PeerId, dialog?: Dialog | ForumTopic | ForumTopic['id']) {\n if(peerId !== undefined) {\n let obj = this.newDialogsToHandle.get(peerId);\n if(!obj) {\n this.newDialogsToHandle.set(peerId, obj = {});\n }\n\n const isObject = typeof(dialog) === 'object';\n if(!dialog || (isObject && dialog._ === 'dialog')) {\n obj.dialog = dialog as Dialog;\n } else {\n obj.topics ??= new Map();\n if(isObject) {\n obj.topics.set((dialog as ForumTopic).id, dialog as ForumTopic);\n } else {\n obj.topics.set(dialog as number, undefined);\n }\n }\n }\n\n return this.newDialogsHandlePromise ??= pause(0).then(() => {\n this.newDialogsHandlePromise = undefined;\n this.handleNewDialogs();\n });\n }\n\n public async deleteMessages(peerId: PeerId, mids: number[], revoke?: boolean) {\n let promise: Promise;\n\n const config = await this.apiManager.getConfig();\n const overflowMids = mids.splice(config.forwarded_count_max, mids.length - config.forwarded_count_max);\n\n const localMessageIds = mids.map((mid) => getServerMessageId(mid));\n\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n const channel = this.appChatsManager.getChat(channelId) as Chat.channel;\n if(!channel.pFlags.creator && !channel.admin_rights?.pFlags?.delete_messages) {\n mids = mids.filter((mid) => {\n const message = this.getMessageByPeer(peerId, mid);\n return !!message.pFlags.out;\n });\n\n if(!mids.length) {\n return;\n }\n }\n\n promise = this.apiManager.invokeApi('channels.deleteMessages', {\n channel: this.appChatsManager.getChannelInput(channelId),\n id: localMessageIds\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteChannelMessages',\n channel_id: channelId,\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n } else {\n promise = this.apiManager.invokeApi('messages.deleteMessages', {\n revoke,\n id: localMessageIds\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n }\n\n const promises: (typeof promise)[] = [promise];\n if(overflowMids.length) {\n promises.push(this.deleteMessages(peerId, overflowMids, revoke));\n }\n\n return Promise.all(promises).then(noop);\n }\n\n public readHistory(peerId: PeerId, maxId = 0, threadId?: number, force = false) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n // console.trace('start read')\n this.log('readHistory:', peerId, maxId, threadId);\n const readMaxId = this.getReadMaxIdIfUnread(peerId, threadId);\n if(!readMaxId) {\n if(threadId && !force) {\n const forumTopic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(!getServerMessageId(forumTopic.read_inbox_max_id)) {\n force = true;\n }\n }\n\n if(!force) {\n const dialog = this.appChatsManager.isForum(peerId.toChatId()) && threadId ?\n this.dialogsStorage.getForumTopic(peerId, threadId) :\n this.getDialogOnly(peerId);\n if(dialog && this.isDialogUnread(dialog)) {\n force = true;\n }\n }\n\n if(!force) {\n this.log('readHistory: isn\\'t unread');\n return Promise.resolve();\n }\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(historyStorage.triedToReadMaxId >= maxId) {\n return Promise.resolve();\n }\n\n let apiPromise: Promise;\n if(threadId) {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('messages.readDiscussion', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(threadId),\n read_max_id: getServerMessageId(maxId)\n });\n // apiPromise = new Promise((resolve) => resolve());\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelDiscussionInbox',\n channel_id: peerId.toChatId(),\n top_msg_id: threadId,\n read_max_id: maxId\n });\n } else if(this.appPeersManager.isChannel(peerId)) {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('channels.readHistory', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n max_id: getServerMessageId(maxId)\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelInbox',\n max_id: maxId,\n channel_id: peerId.toChatId(),\n still_unread_count: undefined,\n pts: undefined\n });\n } else {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('messages.readHistory', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n max_id: getServerMessageId(maxId)\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n }\n });\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadHistoryInbox',\n max_id: maxId,\n peer: this.appPeersManager.getOutputPeer(peerId),\n still_unread_count: undefined,\n pts: undefined,\n pts_count: undefined\n });\n }\n\n this.rootScope.dispatchEvent('notification_reset', this.appPeersManager.getPeerString(peerId));\n\n if(historyStorage.readPromise) {\n return historyStorage.readPromise;\n }\n\n historyStorage.triedToReadMaxId = maxId;\n\n apiPromise.finally(() => {\n delete historyStorage.readPromise;\n\n const {readMaxId} = historyStorage;\n this.log('readHistory: promise finally', maxId, readMaxId);\n\n if(readMaxId > maxId) {\n this.readHistory(peerId, readMaxId, threadId, true);\n }\n });\n\n return historyStorage.readPromise = apiPromise;\n }\n\n public readAllHistory(peerId: PeerId, threadId?: number, force = false) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(historyStorage.maxId) {\n this.readHistory(peerId, historyStorage.maxId, threadId, force); // lol\n }\n }\n\n private getUnreadMentionsKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? `_${threadId}` : '');\n }\n\n private fixDialogUnreadMentionsIfNoMessage(peerId: PeerId, threadId?: number) {\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, threadId);\n if(dialog?.unread_mentions_count) {\n this.reloadConversationOrTopic(peerId);\n }\n }\n\n private modifyCachedMentions(peerId: PeerId, mid: number, add: boolean, threadId?: number) {\n const slicedArray = this.unreadMentions[this.getUnreadMentionsKey(peerId, threadId)];\n if(!slicedArray) return;\n\n if(add) {\n if(slicedArray.first.isEnd(SliceEnd.Top)) {\n slicedArray.insertSlice([mid]);\n }\n } else {\n slicedArray.delete(mid);\n }\n }\n\n private fixUnreadMentionsCountIfNeeded(peerId: PeerId, slicedArray: SlicedArray, threadId?: number) {\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, threadId);\n if(!slicedArray.length && dialog?.unread_mentions_count) {\n this.reloadConversationOrTopic(peerId);\n }\n }\n\n public goToNextMention(peerId: PeerId, threadId?: number) {\n /* this.getUnreadMentions(peerId, 1, 2, 0).then((messages) => {\n console.log(messages);\n }); */\n\n const key = this.getUnreadMentionsKey(peerId, threadId);\n const promise = this.goToNextMentionPromises[key];\n if(promise) {\n return promise;\n }\n\n const slicedArray = this.unreadMentions[peerId] ??= new SlicedArray();\n const length = slicedArray.length;\n const isTopEnd = slicedArray.first.isEnd(SliceEnd.Top);\n if(!length && isTopEnd) {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray, threadId);\n return Promise.resolve();\n }\n\n let loadNextPromise = Promise.resolve();\n if(!isTopEnd && length < 25) {\n loadNextPromise = this.loadNextMentions(peerId, threadId);\n }\n\n return this.goToNextMentionPromises[key] = loadNextPromise.then(() => {\n const last = slicedArray.last;\n const mid = last && last[last.length - 1];\n if(mid) {\n slicedArray.delete(mid);\n return mid;\n } else {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray, threadId);\n }\n }).finally(() => {\n delete this.goToNextMentionPromises[key];\n });\n }\n\n private loadNextMentions(peerId: PeerId, threadId?: number) {\n const slicedArray = this.unreadMentions[peerId];\n const maxId = slicedArray.first[0] || 1;\n\n const backLimit = 50;\n const add_offset = -backLimit;\n const limit = backLimit;\n return this.getUnreadMentions(peerId, maxId, add_offset, limit, undefined, undefined, threadId)\n .then((messages) => {\n this.mergeHistoryResult(slicedArray, messages, maxId === 1 ? 0 : maxId, limit, add_offset);\n });\n }\n\n private getUnreadMentions(\n peerId: PeerId,\n offsetId: number,\n add_offset: number,\n limit: number,\n maxId = 0,\n minId = 0,\n threadId?: number\n ) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getUnreadMentions',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n offset_id: getServerMessageId(offsetId),\n add_offset,\n limit,\n max_id: getServerMessageId(maxId),\n min_id: getServerMessageId(minId),\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n },\n processResult: (messagesMessages) => {\n assumeType>(messagesMessages);\n this.appUsersManager.saveApiUsers(messagesMessages.users);\n this.appChatsManager.saveApiChats(messagesMessages.chats);\n this.saveMessages(messagesMessages.messages);\n\n return messagesMessages;\n }\n });\n }\n\n public readMessages(peerId: PeerId, msgIds: number[]) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n if(!msgIds.length) {\n return Promise.resolve();\n }\n\n msgIds = msgIds.map((mid) => getServerMessageId(mid));\n let promise: Promise, update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents;\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n\n update = {\n _: 'updateChannelReadMessagesContents',\n channel_id: channelId,\n messages: msgIds\n };\n\n promise = this.apiManager.invokeApi('channels.readMessageContents', {\n channel: this.appChatsManager.getChannelInput(channelId),\n id: msgIds\n });\n } else {\n update = {\n _: 'updateReadMessagesContents',\n messages: msgIds,\n pts: undefined,\n pts_count: undefined\n };\n\n promise = this.apiManager.invokeApi('messages.readMessageContents', {\n id: msgIds\n }).then((affectedMessages) => {\n (update as Update.updateReadMessagesContents).pts = affectedMessages.pts;\n (update as Update.updateReadMessagesContents).pts_count = affectedMessages.pts_count;\n this.apiUpdatesManager.processLocalUpdate(update);\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate(update);\n\n return promise;\n }\n\n public getHistoryStorage(peerId: PeerId, threadId?: number) {\n if(threadId) {\n // threadId = this.getLocalMessageId(threadId);\n return (this.threadsStorage[peerId] ??= {})[threadId] ??= {count: null, history: new SlicedArray()};\n }\n\n return this.historiesStorage[peerId] ??= {count: null, history: new SlicedArray()};\n }\n\n public getHistoryStorageTransferable(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const {\n count,\n history,\n maxId,\n readMaxId,\n readOutboxMaxId,\n maxOutId,\n replyMarkup\n } = historyStorage;\n\n return {\n count,\n history: undefined as HistoryStorage,\n historySerialized: history.toJSON(),\n maxId,\n readMaxId,\n readOutboxMaxId,\n maxOutId,\n replyMarkup\n };\n }\n\n private getNotifyPeerSettings(peerId: PeerId, threadId?: number) {\n const inputNotifyPeer = this.appPeersManager.getInputNotifyPeerById({peerId, ignorePeerId: true, threadId});\n return Promise.all([\n this.appNotificationsManager.getNotifyPeerTypeSettings(),\n this.appNotificationsManager.getNotifySettings(inputNotifyPeer)\n ]).then(([_, peerTypeNotifySettings]) => {\n return {\n muted: this.appNotificationsManager.isPeerLocalMuted({peerId, respectType: true, threadId}),\n peerTypeNotifySettings\n };\n });\n }\n\n private handleNotifications = () => {\n ctx.clearTimeout(this.notificationsHandlePromise);\n this.notificationsHandlePromise = undefined;\n\n // var timeout = $rootScope.idle.isIDLE && StatusManager.isOtherDeviceActive() ? 30000 : 1000;\n // const timeout = 1000;\n\n for(const key in this.notificationsToHandle) {\n const [peerId, threadId] = key.split('_');\n // if(rootScope.peerId === peerId && !rootScope.idle.isIDLE) {\n // continue;\n // }\n\n const notifyPeerToHandle = this.notificationsToHandle[key];\n this.getNotifyPeerSettings(peerId.toPeerId(), threadId ? +threadId : undefined)\n .then(({muted, peerTypeNotifySettings}) => {\n const topMessage = notifyPeerToHandle.topMessage;\n if((muted && !topMessage.pFlags.mentioned) || !topMessage.pFlags.unread) {\n return;\n }\n\n // setTimeout(() => {\n if(topMessage.pFlags.unread) {\n this.notifyAboutMessage(topMessage, {\n fwdCount: notifyPeerToHandle.fwdCount,\n peerTypeNotifySettings\n });\n }\n // }, timeout);\n });\n }\n\n this.notificationsToHandle = {};\n };\n\n public getUpdateAfterReloadKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n }\n\n private handleNewUpdateAfterReload(peerId: PeerId, update: Update, threadId?: number) {\n const set = this.newUpdatesAfterReloadToHandle[this.getUpdateAfterReloadKey(peerId, threadId)] ??= new Set();\n if(set.has(update)) {\n this.log.error('here we go again', peerId);\n return;\n }\n\n (update as any).ignoreExisting = true;\n set.add(update);\n this.scheduleHandleNewDialogs(peerId, threadId);\n }\n\n private onUpdateMessageId = (update: Update.updateMessageID) => {\n const randomId = update.random_id;\n const pendingData = this.pendingByRandomId[randomId];\n if(!pendingData) {\n return;\n }\n\n const mid = generateMessageId(update.id);\n this.pendingByMessageId[mid] = randomId;\n // const {storage} = pendingData;\n // const message = this.getMessageFromStorage(storage, mid);\n // if(message) { // if message somehow already exists\n // this.checkPendingMessage(message);\n // }\n };\n\n private onUpdateNewMessage = (update: Update.updateNewDiscussionMessage | Update.updateNewMessage | Update.updateNewChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const storage = this.getHistoryMessagesStorage(peerId);\n\n // * local update\n const isLocalThreadUpdate = update._ === 'updateNewDiscussionMessage';\n\n // * temporary save the message for info (peerId, reply mids...)\n this.saveMessages([message], {storage: this.createMessageStorage(peerId, 'history')});\n\n // * check if sent message is already in storage\n // const oldMessage = this.getMessageFromStorage(storage, message.mid);\n // if(\n // (message as Message.message).pFlags.is_outgoing &&\n // oldMessage &&\n // !(oldMessage as Message.message).pFlags.is_outgoing\n // ) {\n // this.checkPendingMessage(message);\n // return;\n // }\n\n const isForum = this.appPeersManager.isForum(peerId);\n const threadKey = this.getThreadKey(message);\n const threadId = threadKey ? +threadKey.split('_')[1] : undefined;\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, isLocalThreadUpdate ? threadId : undefined);\n\n if((!dialog || this.reloadConversationsPeers.has(peerId)) && !isLocalThreadUpdate) {\n let good = true;\n if(peerId.isAnyChat()) {\n good = this.appChatsManager.isInChat(peerId.toChatId());\n }\n\n if(good) {\n this.handleNewUpdateAfterReload(peerId, update);\n return;\n }\n\n // return;\n }\n\n if(threadId && !isLocalThreadUpdate) {\n const threadStorage = this.threadsStorage[peerId]?.[threadId];\n const update = {\n _: 'updateNewDiscussionMessage',\n message\n } as Update.updateNewDiscussionMessage;\n\n if(this.appChatsManager.isForum(peerId.toChatId()) && !this.dialogsStorage.getForumTopic(peerId, threadId)) {\n // this.dialogsStorage.getForumTopicById(peerId, threadId);\n this.handleNewUpdateAfterReload(peerId, update, threadId);\n } else if(threadStorage) {\n this.onUpdateNewMessage(update);\n }\n }\n\n if(message._ === 'messageService') {\n const {action} = message;\n if(action._ === 'messageActionPaymentSent' && message.reply_to) {\n this.rootScope.dispatchEvent('payment_sent', {\n peerId: message.reply_to.reply_to_peer_id ?\n this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) :\n message.peerId,\n mid: message.reply_to_mid,\n receiptMessage: message\n });\n }\n\n if(action._ === 'messageActionTopicEdit' && !isLocalThreadUpdate) {\n const topic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(!topic) {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n } else {\n const oldTopic = copy(topic);\n\n if(action.title !== undefined) {\n topic.title = action.title;\n }\n\n if(action.closed !== undefined) {\n setBooleanFlag(topic.pFlags, 'closed', action.closed);\n }\n\n if(action.hidden !== undefined) {\n setBooleanFlag(topic.pFlags, 'hidden', action.hidden);\n }\n\n if(action.icon_emoji_id !== undefined) {\n topic.icon_emoji_id = action.icon_emoji_id;\n }\n\n this.scheduleHandleNewDialogs(peerId, topic);\n\n this.dialogsStorage.processTopicUpdate(topic, oldTopic);\n }\n }\n }\n\n /* if(update._ === 'updateNewChannelMessage') {\n const chat = appChatsManager.getChat(peerId.toChatId());\n if(chat.pFlags && (chat.pFlags.left || chat.pFlags.kicked)) {\n return;\n }\n } */\n\n this.saveMessages([message], {storage});\n // this.log.warn(dT(), 'message unread', message.mid, message.pFlags.unread)\n\n /* if((message as Message.message).grouped_id) {\n this.log('updateNewMessage', message);\n } */\n\n this.checkPendingMessage(message);\n const historyStorage = this.getHistoryStorage(peerId, isLocalThreadUpdate ? threadId : undefined);\n\n if(!isLocalThreadUpdate) {\n this.updateMessageRepliesIfNeeded(message);\n }\n\n // * so message can exist if reloadConversation came back earlier with mid\n const ignoreExisting: boolean = (update as any).ignoreExisting;\n const isExisting = !!historyStorage.history.findSlice(message.mid);\n if(isExisting) {\n if(!ignoreExisting) {\n return false;\n }\n } else {\n // * catch situation with disconnect. if message's id is lower than we already have (in bottom end slice), will sort it\n const firstSlice = historyStorage.history.first;\n if(firstSlice.isEnd(SliceEnd.Bottom)) {\n let i = 0;\n for(const length = firstSlice.length; i < length; ++i) {\n if(message.mid > firstSlice[i]) {\n break;\n }\n }\n\n firstSlice.splice(i, 0, message.mid);\n } else {\n historyStorage.history.unshift(message.mid);\n }\n\n if(historyStorage.count !== null) {\n ++historyStorage.count;\n }\n }\n\n if(!historyStorage.maxId || message.mid > historyStorage.maxId) {\n historyStorage.maxId = message.mid;\n }\n\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n\n const fromId = message.fromId;\n if(fromId.isUser() && !message.pFlags.out && message.from_id) {\n this.appUsersManager.forceUserOnline(fromId, message.date);\n\n const action: SendMessageAction = {\n _: 'sendMessageCancelAction'\n };\n\n let update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping;\n if(peerId.isUser()) {\n update = {\n _: 'updateUserTyping',\n action,\n user_id: fromId\n };\n } else if(this.appPeersManager.isChannel(peerId)) {\n update = {\n _: 'updateChannelUserTyping',\n action,\n channel_id: peerId.toChatId(),\n from_id: this.appPeersManager.getOutputPeer(fromId),\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n };\n } else {\n update = {\n _: 'updateChatUserTyping',\n action,\n chat_id: peerId.toChatId(),\n from_id: this.appPeersManager.getOutputPeer(fromId)\n };\n }\n\n this.apiUpdatesManager.processLocalUpdate(update);\n }\n\n // commented to render the message if it's been sent faster than history_append came to main thread\n // if(!pendingMessage) {\n this.handleNewMessage(message);\n // }\n\n const isTopic = dialog?._ === 'forumTopic';\n if((isLocalThreadUpdate && !isTopic) || !dialog) {\n return;\n }\n\n const inboxUnread = !message.pFlags.out && message.pFlags.unread;\n\n {\n if(inboxUnread && message.mid > dialog.top_message) {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n ++dialog.unread_count;\n if(message.pFlags.mentioned) {\n ++dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, true, isTopic ? threadId : undefined);\n }\n\n releaseUnreadCount();\n }\n\n if(message.mid >= dialog.top_message) {\n this.setDialogTopMessage(message, dialog);\n }\n }\n\n if(((!isLocalThreadUpdate && !isForum) || isTopic) && inboxUnread) {\n const notifyPeer = threadKey || peerId;\n const notifyPeerToHandle = this.notificationsToHandle[notifyPeer] ??= {\n fwdCount: 0,\n fromId: NULL_PEER_ID\n };\n\n if(notifyPeerToHandle.fromId !== fromId) {\n notifyPeerToHandle.fromId = fromId;\n notifyPeerToHandle.fwdCount = 0;\n }\n\n if((message as Message.message).fwd_from) {\n ++notifyPeerToHandle.fwdCount;\n }\n\n notifyPeerToHandle.topMessage = message;\n\n this.notificationsHandlePromise ??= ctx.setTimeout(this.handleNotifications, 0);\n }\n };\n\n private onUpdateMessageReactions = (update: Update.updateMessageReactions) => {\n const {peer, msg_id, reactions} = update;\n const mid = generateMessageId(msg_id);\n const peerId = this.appPeersManager.getPeerId(peer);\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n\n if(message?._ !== 'message') {\n return;\n }\n\n const recentReactions = reactions?.recent_reactions;\n if(recentReactions?.length && message.pFlags.out) {\n const recentReaction = recentReactions[recentReactions.length - 1];\n const previousReactions = message.reactions;\n const previousRecentReactions = previousReactions?.recent_reactions;\n if(\n this.appPeersManager.getPeerId(recentReaction.peer_id) !== this.appPeersManager.peerId && (\n !previousRecentReactions ||\n previousRecentReactions.length <= recentReactions.length\n ) && (\n !previousRecentReactions ||\n !deepEqual(recentReaction, previousRecentReactions[previousRecentReactions.length - 1])\n )\n ) {\n this.getNotifyPeerSettings(peerId).then(({muted, peerTypeNotifySettings}) => {\n if(/* muted || */!peerTypeNotifySettings.show_previews) return;\n this.notifyAboutMessage(message, {\n peerReaction: recentReaction,\n peerTypeNotifySettings\n });\n });\n }\n }\n\n const key = message.peerId + '_' + message.mid;\n this.pushBatchUpdate('messages_reactions', this.batchUpdateReactions, key, () => copy(message.reactions));\n\n message.reactions = reactions;\n\n if(!update.local) {\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateDialogUnreadMark = (update: Update.updateDialogUnreadMark) => {\n // this.log('updateDialogUnreadMark', update);\n const peerId = this.appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n if(!dialog) {\n this.scheduleHandleNewDialogs(peerId);\n } else {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n if(!update.pFlags.unread) {\n delete dialog.pFlags.unread_mark;\n } else {\n dialog.pFlags.unread_mark = true;\n }\n\n releaseUnreadCount();\n this.dialogsStorage.setDialogToState(dialog);\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map([[peerId, {dialog}]]));\n }\n };\n\n private onUpdateEditMessage = (update: Update.updateEditMessage | Update.updateEditChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const mid = generateMessageId(message.id);\n const storage = this.getHistoryMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n // console.trace(dT(), 'edit message', message)\n\n const oldMessage: Message = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage});\n const newMessage: Message = this.getMessageFromStorage(storage, mid);\n\n this.handleEditedMessage(oldMessage, newMessage, storage);\n\n const dialog = this.getDialogOnly(peerId);\n\n // if sender erased mention\n /* if(dialog.unread_mentions_count && (oldMessage as Message.message)?.pFlags?.mentioned && !message.pFlags.mentioned) {\n --dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, mid, false);\n } */\n\n const isTopMessage = dialog?.top_message === mid;\n if((message as Message.messageService).clear_history) {\n if(isTopMessage) {\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog});\n }\n } else {\n let dispatchEditEvent = true;\n // no sense in dispatching message_edit since only reactions have changed\n if(oldMessage?._ === 'message' && !deepEqual(oldMessage.reactions, (newMessage as Message.message).reactions)) {\n const newReactions = (newMessage as Message.message).reactions;\n (newMessage as Message.message).reactions = oldMessage.reactions;\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: this.appPeersManager.getOutputPeer(peerId),\n msg_id: message.id,\n reactions: newReactions\n });\n\n dispatchEditEvent = false;\n }\n\n dispatchEditEvent && this.rootScope.dispatchEvent('message_edit', {\n storageKey: storage.key,\n peerId,\n mid,\n message\n });\n\n if(isTopMessage) {\n this.dialogsStorage.setDialogToState(dialog);\n }\n\n const map: BroadcastEvents['dialogs_multiupdate'] = new Map();\n const getUpdateCache = () => {\n let cache = map.get(peerId);\n if(!cache) {\n map.set(peerId, cache = {});\n }\n\n return cache;\n };\n\n if((isTopMessage || (message as Message.message).grouped_id) && dialog) {\n getUpdateCache().dialog = dialog;\n }\n\n const threadKey = this.getThreadKey(message);\n if(threadKey) {\n const topicId = +threadKey.split('_')[1];\n const topic = this.dialogsStorage.getForumTopic(peerId, topicId);\n if(topic) {\n (getUpdateCache().topics ??= new Map()).set(topicId, topic);\n }\n }\n\n if(map.size) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', map);\n }\n }\n };\n\n private onUpdateReadHistory = (update: Update.updateReadChannelDiscussionInbox | Update.updateReadChannelDiscussionOutbox\n | Update.updateReadHistoryInbox | Update.updateReadHistoryOutbox\n | Update.updateReadChannelInbox | Update.updateReadChannelOutbox) => {\n const channelId = (update as Update.updateReadChannelInbox).channel_id;\n const maxId = generateMessageId((update as Update.updateReadChannelInbox).max_id || (update as Update.updateReadChannelDiscussionInbox).read_max_id);\n const threadId = generateMessageId((update as Update.updateReadChannelDiscussionInbox).top_msg_id);\n const peerId = channelId ? channelId.toPeerId(true) : this.appPeersManager.getPeerId((update as Update.updateReadHistoryInbox).peer);\n\n const isOut = update._ === 'updateReadHistoryOutbox' ||\n update._ === 'updateReadChannelOutbox' ||\n update._ === 'updateReadChannelDiscussionOutbox' ? true : undefined;\n\n const isForum = channelId ? this.appChatsManager.isForum(channelId) : false;\n const storage = this.getHistoryMessagesStorage(peerId);\n const history = getObjectKeysAndSort(storage, 'desc');\n const foundDialog = threadId && isForum ?\n this.dialogsStorage.getForumTopic(peerId, threadId) :\n this.getDialogOnly(peerId);\n const stillUnreadCount = (update as Update.updateReadChannelInbox).still_unread_count;\n let newUnreadCount = 0;\n let newUnreadMentionsCount = 0;\n let foundAffected = false;\n\n // this.log.warn(dT(), 'read', peerId, isOut ? 'out' : 'in', maxId)\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(peerId.isUser() && isOut) {\n this.appUsersManager.forceUserOnline(peerId.toUserId());\n }\n\n if(threadId) {\n const repliesKey = this.threadsToReplies[peerId + '_' + threadId];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n\n const releaseUnreadCount = foundDialog && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n const readMaxId = this.getReadMaxIdIfUnread(peerId, threadId);\n\n for(let i = 0, length = history.length; i < length; i++) {\n const mid = history[i];\n if(mid > maxId) {\n continue;\n }\n\n const message: MyMessage = storage.get(mid);\n\n if(message.pFlags.out !== isOut) {\n continue;\n }\n\n const messageThreadId = getMessageThreadId(message, isForum);\n if(threadId && messageThreadId !== threadId) {\n continue;\n }\n\n const isUnread = message.pFlags.unread || (readMaxId && readMaxId < mid);\n\n if(!isUnread) {\n break;\n }\n\n // this.log.warn('read', messageId, isUnread, message)\n delete message.pFlags.unread;\n foundAffected ||= true;\n\n if(!message.pFlags.out && foundDialog) {\n if(stillUnreadCount === undefined) {\n newUnreadCount = --foundDialog.unread_count;\n }\n\n if(message.pFlags.mentioned) {\n newUnreadMentionsCount = --foundDialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, false);\n }\n }\n\n this.rootScope.dispatchEvent('notification_cancel', 'msg' + mid);\n }\n\n if(isOut) historyStorage.readOutboxMaxId = maxId;\n else historyStorage.readMaxId = maxId;\n\n if(foundDialog) {\n if(isOut) foundDialog.read_outbox_max_id = maxId;\n else foundDialog.read_inbox_max_id = maxId;\n\n if(!isOut) {\n let setCount: number;\n if(stillUnreadCount !== undefined) {\n setCount = stillUnreadCount;\n } else if(\n newUnreadCount < 0 ||\n maxId >= foundDialog.top_message ||\n !readMaxId\n ) {\n setCount = 0;\n } else if(newUnreadCount && foundDialog.top_message > maxId) {\n setCount = newUnreadCount;\n }\n\n if(setCount !== undefined) {\n foundDialog.unread_count = setCount;\n }\n\n if(newUnreadMentionsCount < 0 || !foundDialog.unread_count) {\n foundDialog.unread_mentions_count = 0;\n }\n }\n\n releaseUnreadCount?.();\n\n this.dialogsStorage.processDialogForFilters(foundDialog);\n\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog: foundDialog});\n this.dialogsStorage.setDialogToState(foundDialog);\n\n if(!foundAffected && stillUnreadCount === undefined && !isOut && foundDialog.unread_count) {\n if(foundDialog._ === 'forumTopic') {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n } else {\n this.reloadConversation(peerId);\n }\n }\n }\n\n if(foundAffected) {\n this.rootScope.dispatchEvent('messages_read');\n }\n\n if(!threadId && channelId) {\n const threadKeyPart = peerId + '_';\n for(const threadKey in this.threadsToReplies) {\n if(threadKey.indexOf(threadKeyPart) === 0) {\n const [peerId, mid] = this.threadsToReplies[threadKey].split('_');\n this.rootScope.dispatchEvent('replies_updated', this.getMessageByPeer(peerId.toPeerId(), +mid) as Message.message);\n }\n }\n }\n };\n\n private onUpdateReadMessagesContents = (update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents) => {\n const channelId = (update as Update.updateChannelReadMessagesContents).channel_id;\n const topMsgId = (update as Update.updateChannelReadMessagesContents).top_msg_id;\n const threadId = topMsgId ? generateMessageId(topMsgId) : undefined;\n const mids = (update as Update.updateReadMessagesContents).messages.map((id) => generateMessageId(id));\n const peerId = channelId ? channelId.toPeerId(true) : this.findPeerIdByMids(mids);\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n if(message) {\n if(message.pFlags.media_unread) {\n delete message.pFlags.media_unread;\n this.setDialogToStateIfMessageIsTop(message);\n\n if(!message.pFlags.out && message.pFlags.mentioned) {\n this.modifyCachedMentions(peerId, mid, false, threadId);\n }\n }\n } else {\n this.fixDialogUnreadMentionsIfNoMessage(peerId, threadId);\n }\n }\n\n this.rootScope.dispatchEvent('messages_media_read', {peerId, mids});\n };\n\n private onUpdateChannelAvailableMessages = (update: Update.updateChannelAvailableMessages) => {\n const peerId = update.channel_id.toPeerId(true);\n const history = this.getHistoryStorage(peerId).history.slice;\n const availableMinId = generateMessageId(update.available_min_id);\n const messages = history.filter((mid) => mid <= availableMinId);\n\n (update as any as Update.updateDeleteChannelMessages).messages = messages;\n this.onUpdateDeleteMessages(update as any as Update.updateDeleteChannelMessages);\n };\n\n private onUpdateDeleteMessages = (update: Update.updateDeleteMessages | Update.updateDeleteChannelMessages) => {\n const channelId = (update as Update.updateDeleteChannelMessages).channel_id;\n // const messages = (update as any as Update.updateDeleteChannelMessages).messages;\n const messages = (update as any as Update.updateDeleteChannelMessages).messages.map((id) => generateMessageId(id));\n const peerId: PeerId = channelId ? channelId.toPeerId(true) : this.findPeerIdByMids(messages);\n\n if(!peerId) {\n return;\n }\n\n this.apiManager.clearCache('messages.getSearchCounters', (params) => {\n return this.appPeersManager.getPeerId(params.peer) === peerId;\n });\n\n const threadKeys: Set = new Set(), topics: Map = new Map();\n for(const mid of messages) {\n const message = this.getMessageByPeer(peerId, mid);\n const threadKey = this.getThreadKey(message);\n if(!threadKey) {\n continue;\n }\n\n const threadId = +threadKey.split('_')[1];\n if(this.threadsStorage[peerId]?.[threadId]) {\n threadKeys.add(threadKey);\n\n if(!topics.has(threadId)) {\n const topic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(topic) {\n topics.set(threadId, topic);\n }\n }\n }\n }\n\n const historyUpdated = this.handleDeletedMessages(\n peerId,\n this.getHistoryMessagesStorage(peerId),\n messages\n );\n\n const threadsStorages = Array.from(threadKeys).map((threadKey) => {\n const [peerId, mid] = threadKey.split('_');\n return this.getHistoryStorage(peerId.toPeerId(), +mid);\n });\n\n const historyStorages = [\n this.getHistoryStorage(peerId),\n ...threadsStorages\n ];\n historyStorages.forEach((historyStorage) => {\n for(const mid of historyUpdated.msgs) {\n historyStorage.history.delete(mid);\n }\n\n if(historyUpdated.count && historyStorage.count) {\n historyStorage.count = Math.max(0, historyStorage.count - historyUpdated.count);\n }\n });\n\n this.rootScope.dispatchEvent('history_delete', {peerId, msgs: historyUpdated.msgs});\n\n const dialogs: (MTDialog.dialog | ForumTopic)[] = [\n ...topics.values()\n ];\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n dialogs.unshift(dialog);\n }\n\n dialogs.forEach((dialog) => {\n const isTopic = dialog._ === 'forumTopic';\n const affected = historyUpdated.unreadMentions || historyUpdated.unread;\n const releaseUnreadCount = affected && this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n if(historyUpdated.unread) {\n dialog.unread_count = Math.max(0, dialog.unread_count - historyUpdated.unread);\n }\n\n if(historyUpdated.unreadMentions) {\n dialog.unread_mentions_count = !dialog.unread_count ? 0 : Math.max(0, dialog.unread_mentions_count - historyUpdated.unreadMentions);\n }\n\n if(affected) {\n releaseUnreadCount();\n\n if(!isTopic) {\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog});\n }\n }\n\n if(historyUpdated.msgs.has(dialog.top_message)) {\n const historyStorage = this.getHistoryStorage(dialog.peerId, isTopic ? dialog.id : undefined);\n const slice = historyStorage.history.first;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n const mid = slice[0];\n const message = this.getMessageByPeer(peerId, mid);\n this.setDialogTopMessage(message, dialog);\n } else if(isTopic) {\n this.dialogsStorage.getForumTopicById(peerId, dialog.id);\n } else {\n this.reloadConversation(peerId);\n }\n }\n });\n };\n\n private onUpdateChannel = (update: Update.updateChannel) => {\n const channelId = update.channel_id;\n const peerId = channelId.toPeerId(true);\n const channel = this.appChatsManager.getChat(channelId) as Chat.channel;\n\n const needDialog = this.appChatsManager.isInChat(channelId);\n\n const canViewHistory = !!getPeerActiveUsernames(channel)[0] || !channel.pFlags.left;\n const hasHistory = this.historiesStorage[peerId] !== undefined;\n\n if(canViewHistory !== hasHistory) {\n delete this.historiesStorage[peerId];\n this.rootScope.dispatchEvent('history_forbidden', peerId);\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(!!dialog !== needDialog) {\n if(needDialog) {\n this.reloadConversation(peerId);\n } else {\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n }\n\n this.rootScope.dispatchEvent('channel_update', channelId);\n };\n\n private onUpdateChannelReload = (update: Update.updateChannelReload) => {\n const peerId = update.channel_id.toPeerId(true);\n\n // if(this.appPeersManager.isForum(peerId)) {\n // const cache = this.dialogsStorage.getForumTopicsCache(peerId);\n // if(cache.topics.size) {\n\n // }\n // }\n\n this.flushStoragesByPeerId(peerId);\n Promise.all([\n this.reloadConversation(peerId)\n ]).then(() => {\n this.rootScope.dispatchEvent('history_reload', peerId);\n });\n };\n\n private onUpdateChannelMessageViews = (update: Update.updateChannelMessageViews) => {\n const views = update.views;\n const peerId = update.peerId ?? update.channel_id.toPeerId(true);\n const mid = generateMessageId(update.id);\n const message = this.getMessageByPeer(peerId, mid) as Message.message;\n if(message?.views !== undefined && message.views < views) {\n message.views = views;\n this.pushBatchUpdate('messages_views', this.batchUpdateViews, message.peerId + '_' + message.mid);\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateServiceNotification = (update: Update.updateServiceNotification) => {\n // this.log('updateServiceNotification', update);\n if(update.pFlags?.popup) {\n this.rootScope.dispatchEvent('service_notification', update);\n return;\n }\n\n const fromId = SERVICE_PEER_ID;\n const peerId = fromId;\n const messageId = this.generateTempMessageId(peerId);\n const message: Message.message = {\n _: 'message',\n id: messageId,\n from_id: this.appPeersManager.getOutputPeer(fromId),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n pFlags: {unread: true},\n date: (update.inbox_date || tsNow(true)) + this.timeManager.getServerTimeOffset(),\n message: update.message,\n media: update.media,\n entities: update.entities\n };\n if(!this.appUsersManager.hasUser(fromId)) {\n this.appUsersManager.saveApiUsers([{\n _: 'user',\n id: fromId,\n pFlags: {verified: true},\n access_hash: '0',\n first_name: 'Telegram',\n phone: '42777'\n }]);\n }\n this.saveMessages([message], {isOutgoing: true});\n\n if(update.inbox_date) {\n this.pendingTopMsgs[peerId] = messageId;\n this.onUpdateNewMessage({\n _: 'updateNewMessage',\n message,\n pts: undefined,\n pts_count: undefined\n });\n }\n };\n\n private onUpdatePinnedMessages = (update: Update.updatePinnedMessages | Update.updatePinnedChannelMessages) => {\n const channelId = update._ === 'updatePinnedChannelMessages' ? update.channel_id : undefined;\n const peerId = channelId ? channelId.toPeerId(true) : this.appPeersManager.getPeerId((update as Update.updatePinnedMessages).peer);\n\n /* const storage = this.getSearchStorage(peerId, 'inputMessagesFilterPinned');\n if(storage.count !== storage.history.length) {\n if(storage.count !== undefined) {\n delete this.searchesStorage[peerId]['inputMessagesFilterPinned'];\n }\n\n rootScope.broadcast('peer_pinned_messages', peerId);\n break;\n } */\n\n const messages = update.messages.map((id) => generateMessageId(id));\n\n const storage = this.getHistoryMessagesStorage(peerId);\n const missingMessages = messages.filter((mid) => !storage.has(mid));\n const getMissingPromise = missingMessages.length ? Promise.all(missingMessages.map((mid) => this.reloadMessages(peerId, mid))) : Promise.resolve();\n getMissingPromise.finally(() => {\n const werePinned = update.pFlags?.pinned;\n if(werePinned) {\n for(const mid of messages) {\n // storage.history.push(mid);\n const message = storage.get(mid) as Message.message;\n message.pFlags.pinned = true;\n }\n\n /* if(this.pinnedMessages[peerId]?.maxId) {\n const maxMid = Math.max(...messages);\n this.pinnedMessages\n } */\n\n // storage.history.sort((a, b) => b - a);\n } else {\n for(const mid of messages) {\n // storage.history.findAndSplice((_mid) => _mid === mid);\n const message = storage.get(mid) as Message.message;\n delete message.pFlags.pinned;\n }\n }\n\n /* const info = this.pinnedMessages[peerId];\n if(info) {\n info.count += messages.length * (werePinned ? 1 : -1);\n } */\n\n delete this.pinnedMessages[this.getPinnedMessagesKey(peerId)];\n this.appStateManager.getState().then((state) => {\n delete state.hiddenPinnedMessages[peerId];\n this.rootScope.dispatchEvent('peer_pinned_messages', {peerId, mids: messages, pinned: werePinned});\n });\n });\n };\n\n private onUpdateNotifySettings = (update: Update.updateNotifySettings) => {\n const {peer, notify_settings} = update;\n const isTopic = peer._ === 'notifyForumTopic';\n const isPeerType = peer._ === 'notifyPeer' || isTopic;\n if(!isPeerType) {\n return;\n }\n\n const peerId = this.appPeersManager.getPeerId(peer.peer);\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, isTopic ? generateMessageId(peer.top_msg_id) : undefined);\n if(!dialog) {\n return;\n }\n\n dialog.notify_settings = notify_settings;\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\n this.dialogsStorage.setDialogToState(dialog);\n };\n\n private onUpdateNewScheduledMessage = (update: Update.updateNewScheduledMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(!storage) {\n return;\n }\n\n const mid = generateMessageId(message.id);\n\n const oldMessage = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage, isScheduled: true});\n const newMessage = this.getMessageFromStorage(storage, mid);\n\n if(oldMessage) {\n this.handleEditedMessage(oldMessage, newMessage, storage);\n this.rootScope.dispatchEvent('message_edit', {storageKey: storage.key, peerId, mid: message.mid, message});\n } else {\n const pendingMessage = this.checkPendingMessage(message);\n if(!pendingMessage) {\n this.rootScope.dispatchEvent('scheduled_new', message as Message.message);\n }\n }\n };\n\n private onUpdateDeleteScheduledMessages = (update: Update.updateDeleteScheduledMessages) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mids = update.messages.map((id) => generateMessageId(id));\n this.handleDeletedMessages(peerId, storage, mids);\n\n this.rootScope.dispatchEvent('scheduled_delete', {peerId, mids});\n }\n };\n\n private onUpdateMessageExtendedMedia = (update: Update.updateMessageExtendedMedia) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n const mid = generateMessageId(update.msg_id);\n const storage = this.getHistoryMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n const messageMedia = message.media as MessageMedia.messageMediaInvoice;\n if(messageMedia.extended_media?._ === 'messageExtendedMedia') {\n return;\n }\n\n messageMedia.extended_media = update.extended_media;\n this.onUpdateEditMessage({\n _: 'updateEditMessage',\n message,\n pts: 0,\n pts_count: 0\n });\n };\n\n public setDialogToStateIfMessageIsTop(message: MyMessage) {\n if(this.isMessageIsTopMessage(message)) {\n this.dialogsStorage.setDialogToState(this.getDialogOnly(message.peerId));\n }\n }\n\n public isMessageIsTopMessage(message: MyMessage) {\n const dialog = this.getDialogOnly(message.peerId);\n return dialog && dialog.top_message === message.mid;\n }\n\n private updateMessageRepliesIfNeeded(threadMessage: MyMessage) {\n try { // * на всякий случай, скорее всего это не понадобится\n const threadKey = this.getThreadKey(threadMessage);\n if(threadKey) {\n const repliesKey = this.threadsToReplies[threadKey];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n } catch(err) {\n this.log.error('incrementMessageReplies err', err, threadMessage);\n }\n }\n\n private getThreadKey(threadMessage: MyMessage) {\n let threadKey = '';\n if(threadMessage?.peerId?.isAnyChat()) {\n const threadId = getMessageThreadId(threadMessage, this.appChatsManager.isForum(threadMessage.peerId.toChatId()));\n if(threadId) {\n threadKey = threadMessage.peerId + '_' + threadId;\n }\n }\n\n return threadKey;\n }\n\n public updateMessage(peerId: PeerId, mid: number, broadcastEventName?: 'replies_updated'): Promise {\n const promise: Promise = this.reloadMessages(peerId, mid, true).then(() => {\n const message = this.getMessageByPeer(peerId, mid) as Message.message;\n if(!message) {\n return;\n }\n\n if(broadcastEventName) {\n this.rootScope.dispatchEvent(broadcastEventName, message);\n }\n\n return message;\n });\n\n return promise;\n }\n\n private checkPendingMessage(message: MyMessage) {\n const randomId = this.pendingByMessageId[message.mid];\n let pendingMessage: ReturnType;\n if(randomId) {\n const pendingData = this.pendingByRandomId[randomId];\n if(pendingMessage = this.finalizePendingMessage(randomId, message)) {\n this.rootScope.dispatchEvent('history_update', {\n storageKey: pendingData.storage.key,\n message,\n sequential: pendingData.sequential\n });\n }\n\n delete this.pendingByMessageId[message.mid];\n }\n\n return pendingMessage;\n }\n\n public mutePeer(options: {peerId: PeerId, muteUntil: number, threadId?: number}) {\n if(!(options = this.appNotificationsManager.validatePeerSettings(options))) {\n return;\n }\n\n const {peerId, muteUntil, threadId} = options;\n const settings: InputPeerNotifySettings = {\n _: 'inputPeerNotifySettings'\n };\n\n settings.mute_until = muteUntil;\n\n const peer = this.appPeersManager.getInputPeerById(peerId);\n return this.appNotificationsManager.updateNotifySettings(threadId ? {\n _: 'inputNotifyForumTopic',\n peer,\n top_msg_id: getServerMessageId(threadId)\n } : {\n _: 'inputNotifyPeer',\n peer\n }, settings);\n }\n\n public togglePeerMute({peerId, mute, threadId}: {peerId: PeerId, mute?: boolean, threadId?: number}) {\n if(mute === undefined) {\n mute = !this.appNotificationsManager.isPeerLocalMuted({peerId, respectType: false, threadId});\n }\n\n return this.mutePeer({peerId, muteUntil: mute ? MUTE_UNTIL : 0, threadId});\n }\n\n private findPeerIdByMids(mids: number[]) {\n for(let length = mids.length, i = length - 1; i >= 0; --i) {\n const mid = mids[i];\n const message = this.getMessageById(mid);\n if(message) {\n return message.peerId;\n }\n }\n }\n\n public canSendToPeer(peerId: PeerId, threadId?: number, action: ChatRights = 'send_messages') {\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n return false;\n }\n\n if(peerId.isAnyChat()) {\n const chatId = peerId.toChatId();\n if(threadId) {\n const topic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(topic?.pFlags?.closed && !this.appChatsManager.hasRights(chatId, 'manage_topics')) {\n return false;\n }\n }\n\n // const isChannel = appPeersManager.isChannel(peerId);\n const chat = this.appChatsManager.getChat(chatId) as Chat.chat;\n const hasRights = /* isChannel && */this.appChatsManager.hasRights(chatId, action, undefined, !!threadId);\n return /* !isChannel || */hasRights && (!chat.pFlags.left || !!threadId);\n } else {\n return this.appUsersManager.canSendToUser(peerId);\n }\n }\n\n public finalizePendingMessage(randomId: Long, finalMessage: MyMessage) {\n const pendingData = this.pendingByRandomId[randomId];\n if(!pendingData) {\n return;\n }\n\n const {peerId, tempId, threadId, storage} = pendingData;\n\n [\n this.getHistoryStorage(peerId),\n threadId ? this.getHistoryStorage(peerId, threadId) : undefined\n ]\n .filter(Boolean)\n .forEach((storage) => {\n storage.history.delete(tempId);\n });\n\n // this.log('pending', randomID, historyStorage.pending)\n\n const tempMessage: MyMessage = this.getMessageFromStorage(storage, tempId);\n if(tempMessage) {\n delete finalMessage.pFlags.is_outgoing;\n delete finalMessage.pending;\n delete finalMessage.error;\n delete finalMessage.random_id;\n delete finalMessage.send;\n }\n\n this.rootScope.dispatchEvent('messages_pending');\n\n delete this.pendingByRandomId[randomId];\n\n this.finalizePendingMessageCallbacks(storage, tempId, finalMessage);\n\n return tempMessage;\n }\n\n public finalizePendingMessageCallbacks(storage: MessagesStorage, tempId: number, message: MyMessage) {\n const callbacks = this.tempFinalizeCallbacks[tempId];\n // this.log.warn(callbacks, tempId);\n if(callbacks !== undefined) {\n for(const name in callbacks) {\n const {deferred, callback} = callbacks[name];\n // this.log(`finalizePendingMessageCallbacks: will invoke ${name} callback`);\n callback(message).then(deferred.resolve, deferred.reject);\n }\n\n delete this.tempFinalizeCallbacks[tempId];\n }\n\n // set cached url to media\n if((message as Message.message).media) {\n assumeType(message);\n const {photo: newPhoto, document: newDoc} = message.media as any;\n if(newPhoto) {\n const photo = this.appPhotosManager.getPhoto('' + tempId);\n if(/* photo._ !== 'photoEmpty' */photo) {\n const newPhotoSize = newPhoto.sizes[newPhoto.sizes.length - 1];\n const cacheContext = this.thumbsStorage.getCacheContext(newPhoto, newPhotoSize.type);\n const oldCacheContext = this.thumbsStorage.getCacheContext(photo, THUMB_TYPE_FULL);\n Object.assign(cacheContext, oldCacheContext);\n\n const photoSize = newPhoto.sizes[newPhoto.sizes.length - 1] as PhotoSize.photoSize;\n\n const downloadOptions = getPhotoDownloadOptions(newPhoto, photoSize);\n const fileName = getFileNameByLocation(downloadOptions.location);\n // this.appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n } else if(newDoc) {\n const oldDoc = this.appDocsManager.getDoc('' + tempId);\n if(oldDoc) {\n const oldCacheContext = this.thumbsStorage.getCacheContext(oldDoc);\n if(\n /* doc._ !== 'documentEmpty' && */\n oldDoc.type &&\n oldDoc.type !== 'sticker' &&\n oldDoc.mime_type !== 'image/gif' &&\n oldCacheContext.url\n ) {\n const cacheContext = this.thumbsStorage.getCacheContext(newDoc);\n Object.assign(cacheContext, oldCacheContext);\n\n const fileName = getDocumentInputFileName(newDoc);\n // this.appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n }\n } else if((message.media as MessageMedia.messageMediaPoll).poll) {\n delete this.appPollsManager.polls[tempId];\n delete this.appPollsManager.results[tempId];\n }\n }\n\n const tempMessage = this.getMessageFromStorage(storage, tempId);\n storage.delete(tempId);\n\n if(!(tempMessage as Message.message).reply_markup && (message as Message.message).reply_markup) {\n setTimeout(() => { // TODO: refactor it to normal buttons adding\n if(!this.getMessageFromStorage(storage, message.mid)) {\n return;\n }\n\n this.rootScope.dispatchEvent('message_edit', {storageKey: storage.key, peerId: message.peerId, mid: message.mid, message});\n }, 0);\n }\n\n this.handleReleasingMessage(tempMessage, storage);\n\n this.rootScope.dispatchEvent('message_sent', {storageKey: storage.key, tempId, tempMessage, mid: message.mid, message});\n }\n\n public incrementMaxSeenId(maxId: number) {\n if(!maxId || !(!this.maxSeenId || maxId > this.maxSeenId)) {\n return false;\n }\n\n this.maxSeenId = maxId;\n this.appStateManager.pushToState('maxSeenMsgId', maxId);\n\n this.apiManager.invokeApi('messages.receivedMessages', {\n max_id: getServerMessageId(maxId)\n });\n }\n\n public async getMessageReactionsListAndReadParticipants(\n message: Message.message,\n limit?: number,\n reaction?: Reaction,\n offset?: string,\n skipReadParticipants?: boolean,\n skipReactionsList?: boolean\n ) {\n const emptyMessageReactionsList = {\n reactions: [] as MessagePeerReaction[],\n count: 0,\n next_offset: undefined as string\n };\n\n const canViewMessageReadParticipants = await this.canViewMessageReadParticipants(message);\n if(canViewMessageReadParticipants && limit === undefined) {\n limit = 100;\n } else if(limit === undefined) {\n limit = 50;\n }\n\n return Promise.all([\n canViewMessageReadParticipants && !reaction && !skipReadParticipants ? this.getMessageReadParticipants(message.peerId, message.mid).catch(() => [] as UserId[]) : [] as UserId[],\n\n message.reactions?.recent_reactions?.length && !skipReactionsList ? this.appReactionsManager.getMessageReactionsList(message.peerId, message.mid, limit, reaction, offset).catch((err) => emptyMessageReactionsList) : emptyMessageReactionsList\n ]).then(([userIds, messageReactionsList]) => {\n const readParticipantsPeerIds = userIds.map((userId) => userId.toPeerId());\n\n const filteredReadParticipants = readParticipantsPeerIds.slice();\n forEachReverse(filteredReadParticipants, (peerId, idx, arr) => {\n if(messageReactionsList.reactions.some((reaction) => this.appPeersManager.getPeerId(reaction.peer_id) === peerId)) {\n arr.splice(idx, 1);\n }\n });\n\n let combined: {peerId: PeerId, reaction?: Reaction}[] = messageReactionsList.reactions.map((reaction) => ({peerId: this.appPeersManager.getPeerId(reaction.peer_id), reaction: reaction.reaction}));\n combined = combined.concat(filteredReadParticipants.map((readPeerId) => ({peerId: readPeerId})));\n\n return {\n reactions: messageReactionsList.reactions,\n reactionsCount: messageReactionsList.count,\n readParticipants: readParticipantsPeerIds,\n combined: combined,\n nextOffset: messageReactionsList.next_offset\n };\n });\n }\n\n public getMessageReadParticipants(peerId: PeerId, mid: number): Promise {\n return this.apiManager.invokeApiSingle('messages.getMessageReadParticipants', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((userIds) => { // ! convert long to number\n return userIds.map((userId) => userId.toUserId());\n });\n }\n\n public async canViewMessageReadParticipants(message: Message) {\n if(\n message?._ !== 'message' ||\n message.pFlags.is_outgoing ||\n !message.pFlags.out ||\n !this.appPeersManager.isAnyGroup(message.peerId)\n ) {\n return false;\n }\n\n const chat = this.appChatsManager.getChat(message.peerId.toChatId()) as Chat.chat | Chat.channel;\n const appConfig = await this.apiManager.getAppConfig();\n return chat.participants_count <= appConfig.chat_read_mark_size_threshold &&\n (tsNow(true) - message.date) < appConfig.chat_read_mark_expire_period;\n }\n\n public incrementMessageViews(peerId: PeerId, mids: number[]) {\n if(!mids.length) {\n return;\n }\n\n return this.apiManager.invokeApiSingle('messages.getMessagesViews', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n increment: true\n }).then((views) => {\n const updates: Update[] = new Array(mids.length);\n for(let i = 0, length = mids.length; i < length; ++i) {\n updates[i] = {\n _: 'updateChannelMessageViews',\n channel_id: NULL_PEER_ID,\n peerId,\n id: mids[i],\n views: views.views[i].views\n };\n }\n\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates,\n chats: views.chats,\n users: views.users\n });\n });\n }\n\n private notifyAboutMessage(message: MyMessage, options: Partial<{\n fwdCount: number,\n peerReaction: MessagePeerReaction,\n peerTypeNotifySettings: PeerNotifySettings\n }> = {}) {\n const peerId = this.getMessagePeer(message);\n\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n return;\n }\n\n const tabs = appTabsManager.getTabs();\n let tab = tabs.find((tab) => {\n const {chatPeerIds} = tab.state;\n return chatPeerIds[chatPeerIds.length - 1] === peerId;\n });\n\n if(!tab) {\n tabs.sort((a, b) => a.state.idleStartTime - b.state.idleStartTime);\n tab = !tabs[0].state.idleStartTime ? tabs[0] : tabs[tabs.length - 1];\n }\n\n const port = MTProtoMessagePort.getInstance();\n port.invokeVoid('notificationBuild', {\n message,\n ...options\n }, tab.source);\n }\n\n public getScheduledMessagesStorage(peerId: PeerId) {\n return this.scheduledMessagesStorage[peerId] ??= this.createMessageStorage(peerId, 'scheduled');\n }\n\n public getScheduledMessageByPeer(peerId: PeerId, mid: number) {\n return this.getMessageFromStorage(this.getScheduledMessagesStorage(peerId), mid);\n }\n\n public getScheduledMessages(peerId: PeerId) {\n if(!this.canSendToPeer(peerId)) return;\n\n const storage = this.getScheduledMessagesStorage(peerId);\n if(storage.size) {\n return [...storage.keys()];\n }\n\n return this.apiManager.invokeApiSingle('messages.getScheduledHistory', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n hash: ''\n }).then((historyResult) => {\n if(historyResult._ !== 'messages.messagesNotModified') {\n this.appUsersManager.saveApiUsers(historyResult.users);\n this.appChatsManager.saveApiChats(historyResult.chats);\n\n const storage = this.getScheduledMessagesStorage(peerId);\n this.saveMessages(historyResult.messages, {storage, isScheduled: true});\n return [...storage.keys()];\n }\n\n return [];\n });\n }\n\n public sendScheduledMessages(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApi('messages.sendScheduledMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public deleteScheduledMessages(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApi('messages.deleteScheduledMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getMessageWithReplies(message: Message.message) {\n return this.filterMessages(message, (message) => !!(message as Message.message).replies)[0] as any;\n }\n\n public getMessageWithCommentReplies(message: Message.message) {\n if(message.peerId !== REPLIES_PEER_ID) {\n message = this.getMessageWithReplies(message);\n const replies = message?.replies;\n if(!(replies && replies.pFlags.comments && replies.channel_id.toChatId() !== REPLIES_HIDDEN_CHANNEL_ID)) {\n return;\n }\n }\n\n return message;\n }\n\n public isFetchIntervalNeeded(peerId: PeerId) {\n return peerId.isAnyChat() && (\n !this.appChatsManager.isInChat(peerId.toChatId()) ||\n this.appChatsManager.isForum(peerId.toChatId())\n );\n }\n\n public async getNewHistory(peerId: PeerId, threadId?: number) {\n if(!this.isFetchIntervalNeeded(peerId)) {\n return;\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(!slice.isEnd(SliceEnd.Bottom)) {\n return;\n }\n\n delete historyStorage.maxId;\n slice.unsetEnd(SliceEnd.Bottom);\n\n // if there is no id - then request by first id because cannot request by id 0 with backLimit\n const historyResult = await this.getHistory(peerId, slice[0] ?? 1, 0, 50, threadId);\n for(let i = 0, length = historyResult.history.length; i < length; ++i) {\n this.handleNewMessage(this.getMessageByPeer(peerId, historyResult.history[i]));\n }\n\n return {isBottomEnd: historyStorage.history.slice.isEnd(SliceEnd.Bottom)};\n }\n\n /**\n * * https://core.telegram.org/api/offsets, offset_id is inclusive\n */\n // public getHistory(peerId: PeerId, maxId?: number, limit?: number, backLimit?: number, threadId?: number, onlyCache?: false): Promise | HistoryResult;\n // public getHistory(peerId: PeerId, maxId?: number, limit?: number, backLimit?: number, threadId?: number, onlyCache?: true): HistoryResult;\n public getHistory(peerId: PeerId, maxId: number = 0, limit?: number, backLimit?: number, threadId?: number/* , onlyCache?: boolean */): Promise | HistoryResult {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n const first = historyStorage.history.first;\n first.setEnd(SliceEnd.Both);\n\n const slice = first.slice(0, 0);\n slice.setEnd(SliceEnd.Both);\n\n return {\n count: 0,\n history: Array.from(slice),\n isEnd: slice.getEnds(),\n offsetIdOffset: 0\n };\n }\n\n let offset = 0;\n /*\n let offsetFound = true;\n\n if(maxId) {\n offsetFound = false;\n for(; offset < historyStorage.history.length; offset++) {\n if(maxId > historyStorage.history.slice[offset]) {\n offsetFound = true;\n break;\n }\n }\n }\n\n if(offsetFound && (\n historyStorage.count !== null && historyStorage.history.length === historyStorage.count ||\n historyStorage.history.length >= offset + limit\n )) {\n if(backLimit) {\n backLimit = Math.min(offset, backLimit);\n offset = Math.max(0, offset - backLimit);\n limit += backLimit;\n } else {\n limit = limit;\n }\n\n const history = historyStorage.history.slice.slice(offset, offset + limit);\n return {\n count: historyStorage.count,\n history: history,\n offsetIdOffset: offset\n };\n }\n\n if(offsetFound) {\n offset = 0;\n } */\n\n if(backLimit) {\n offset = -backLimit;\n limit += backLimit;\n\n /* return this.requestHistory(reqPeerId, maxId, limit, offset, undefined, threadId).then((historyResult) => {\n historyStorage.count = (historyResult as MessagesMessages.messagesMessagesSlice).count || historyResult.messages.length;\n\n const history = (historyResult.messages as MyMessage[]).map((message) => message.mid);\n return {\n count: historyStorage.count,\n history,\n offsetIdOffset: (historyResult as MessagesMessages.messagesMessagesSlice).offset_id_offset || 0\n };\n }); */\n }\n\n const haveSlice = historyStorage.history.sliceMe(maxId, offset, limit);\n if(haveSlice && (haveSlice.slice.length === limit || (haveSlice.fulfilled & SliceEnd.Both) === SliceEnd.Both)) {\n return {\n count: historyStorage.count,\n history: Array.from(haveSlice.slice),\n isEnd: haveSlice.slice.getEnds(),\n offsetIdOffset: haveSlice.offsetIdOffset\n };\n }\n\n // if(onlyCache) {\n // return;\n // }\n\n return this.fillHistoryStorage(peerId, maxId, limit, offset, historyStorage, threadId).then(() => {\n const slice = historyStorage.history.sliceMe(maxId, offset, limit);\n const f = slice?.slice || historyStorage.history.constructSlice();\n return {\n count: historyStorage.count,\n history: Array.from(f),\n isEnd: f.getEnds(),\n offsetIdOffset: slice?.offsetIdOffset || historyStorage.count\n };\n });\n }\n\n public isHistoryResultEnd(historyResult: Exclude, limit: number, add_offset: number) {\n const {offset_id_offset, messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n\n const count = (historyResult as MessagesMessages.messagesMessagesSlice).count || messages.length;\n const offsetIdOffset = offset_id_offset || 0;\n\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\n\n const isTopEnd = offsetIdOffset >= (count - topWasMeantToLoad) || count < topWasMeantToLoad;\n const isBottomEnd = !offsetIdOffset || (add_offset < 0 && (offsetIdOffset + add_offset) <= 0);\n\n return {count, offsetIdOffset, isTopEnd, isBottomEnd};\n }\n\n public mergeHistoryResult(\n slicedArray: SlicedArray,\n historyResult: Parameters[0],\n offset_id: number,\n limit: number,\n add_offset: number\n ) {\n const {messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n const isEnd = this.isHistoryResultEnd(historyResult, limit, add_offset);\n const {count, offsetIdOffset, isTopEnd, isBottomEnd} = isEnd;\n const mids = messages.map((message) => {\n return (message as MyMessage).mid;\n });\n\n // * add bound manually.\n // * offset_id will be inclusive only if there is 'add_offset' <= -1 (-1 - will only include the 'offset_id')\n // * check that offset_id is not 0\n if(offset_id && getServerMessageId(offset_id) && !mids.includes(offset_id) && offsetIdOffset < count) {\n let i = 0;\n for(const length = mids.length; i < length; ++i) {\n if(offset_id > mids[i]) {\n break;\n }\n }\n\n mids.splice(i, 0, offset_id);\n }\n\n const slice = slicedArray.insertSlice(mids) || slicedArray.slice;\n if(isTopEnd) {\n slice.setEnd(SliceEnd.Top);\n }\n\n if(isBottomEnd) {\n slice.setEnd(SliceEnd.Bottom);\n }\n\n return {slice, mids, messages, ...isEnd};\n }\n\n public fillHistoryStorage(peerId: PeerId, offset_id: number, limit: number, add_offset: number, historyStorage: HistoryStorage, threadId?: number): Promise {\n const wasMaxId = historyStorage.maxId;\n return this.requestHistory(peerId, offset_id, limit, add_offset, undefined, threadId).then((historyResult) => {\n const {count, isBottomEnd, slice, messages} = this.mergeHistoryResult(historyStorage.history, historyResult, offset_id, limit, add_offset);\n\n historyStorage.count = count;\n\n /* if(!maxId && historyResult.messages.length) {\n maxId = this.incrementMessageId((historyResult.messages[0] as MyMessage).mid, 1);\n }\n\n const wasTotalCount = historyStorage.history.length; */\n\n for(let i = 0, length = messages.length; i < length; ++i) {\n const message = messages[i] as MyMessage;\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n if(isBottomEnd) {\n const newMaxId = slice[0];\n\n if(historyStorage.maxId === wasMaxId) {\n const first = historyStorage.history.first;\n if(first !== slice) {\n historyStorage.history.deleteSlice(first);\n }\n\n if(historyStorage.maxId !== newMaxId) {\n historyStorage.maxId = slice[0]; // ! WARNING\n\n this.reloadConversation(peerId); // when top_message is deleted but cached\n }\n }\n }\n\n /* const isBackLimit = offset < 0 && -offset !== fullLimit;\n if(isBackLimit) {\n return;\n }\n\n const totalCount = historyStorage.history.length;\n fullLimit -= (totalCount - wasTotalCount);\n\n const migratedNextPeer = this.migratedFromTo[peerId];\n const migratedPrevPeer = this.migratedToFrom[peerId]\n const isMigrated = migratedNextPeer !== undefined || migratedPrevPeer !== undefined;\n\n if(isMigrated) {\n historyStorage.count = Math.max(historyStorage.count, totalCount) + 1;\n }\n\n if(fullLimit > 0) {\n maxId = historyStorage.history.slice[totalCount - 1];\n if(isMigrated) {\n if(!historyResult.messages.length) {\n if(migratedPrevPeer) {\n maxId = 0;\n peerId = migratedPrevPeer;\n } else {\n historyStorage.count = totalCount;\n return true;\n }\n }\n\n return this.fillHistoryStorage(peerId, maxId, fullLimit, historyStorage, threadId);\n } else if(totalCount < historyStorage.count) {\n return this.fillHistoryStorage(peerId, maxId, fullLimit, offset, historyStorage, threadId);\n }\n } */\n });\n }\n\n public requestHistory(peerId: PeerId, maxId: number, limit = 0, offset = 0, offsetDate = 0, threadId = 0): Promise> {\n // console.trace('requestHistory', peerId, maxId, limit, offset);\n\n // rootScope.broadcast('history_request');\n\n const options: MessagesGetReplies | MessagesGetHistory = {\n peer: this.appPeersManager.getInputPeerById(peerId),\n offset_id: getServerMessageId(maxId) || 0,\n offset_date: offsetDate,\n add_offset: offset,\n limit,\n max_id: 0,\n min_id: 0,\n hash: 0\n };\n\n if(threadId) {\n (options as MessagesGetReplies).msg_id = getServerMessageId(threadId) || 0;\n }\n\n const promise: ReturnType = this.apiManager.invokeApiSingle(threadId ? 'messages.getReplies' : 'messages.getHistory', options, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n }) as any;\n\n return promise.then((historyResult) => {\n if(DEBUG) {\n this.log('requestHistory result:', peerId, historyResult, maxId, limit, offset);\n }\n\n this.appUsersManager.saveApiUsers(historyResult.users);\n this.appChatsManager.saveApiChats(historyResult.chats);\n this.saveMessages(historyResult.messages);\n\n if('pts' in historyResult) {\n this.apiUpdatesManager.addChannelState(peerId.toChatId(), historyResult.pts);\n }\n\n let length = historyResult.messages.length, count = (historyResult as MessagesMessages.messagesMessagesSlice).count;\n if(length && !historyResult.messages[length - 1]) {\n historyResult.messages.splice(length - 1, 1);\n length--;\n count--;\n }\n\n // will load more history if last message is album grouped (because it can be not last item)\n // historyResult.messages: desc sorted\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const oldestMessage: Message.message = historyResult.messages[length - 1] as any;\n if(length && oldestMessage.grouped_id) {\n const foundSlice = historyStorage.history.findSlice(oldestMessage.mid);\n if(foundSlice && (foundSlice.slice.length + historyResult.messages.length) < count) {\n return this.requestHistory(peerId, oldestMessage.mid, 10, 0, offsetDate, threadId).then((_historyResult) => {\n return historyResult;\n });\n }\n }\n\n return historyResult;\n }, (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = this.appChatsManager.getChat(peerId.toChatId());\n if(channel._ === 'channel') {\n channel = {\n _: 'channelForbidden',\n id: peerId.toChatId(),\n access_hash: channel.access_hash,\n title: channel.title,\n pFlags: channel.pFlags\n };\n }\n\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: peerId.toChatId()\n }],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n });\n }\n\n public fetchSingleMessages() {\n if(this.fetchSingleMessagesPromise) {\n return this.fetchSingleMessagesPromise;\n }\n\n return this.fetchSingleMessagesPromise = pause(0).then(() => {\n const requestPromises: Promise[] = [];\n\n for(const [peerId, map] of this.needSingleMessages) {\n const mids = [...map.keys()];\n const msgIds: InputMessage[] = mids.map((mid) => {\n return {\n _: 'inputMessageID',\n id: getServerMessageId(mid)\n };\n });\n\n let promise: Promise;\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n promise = this.apiManager.invokeApiSingle('channels.getMessages', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n id: msgIds\n });\n } else {\n promise = this.apiManager.invokeApiSingle('messages.getMessages', {\n id: msgIds\n });\n }\n\n const after = promise.then((getMessagesResult) => {\n assumeType>(getMessagesResult);\n\n this.appUsersManager.saveApiUsers(getMessagesResult.users);\n this.appChatsManager.saveApiChats(getMessagesResult.chats);\n const messages = this.saveMessages(getMessagesResult.messages);\n\n for(let i = 0; i < messages.length; ++i) {\n const message = messages[i];\n if(!message) {\n continue;\n }\n\n const mid = generateMessageId(message.id);\n const promise = map.get(mid);\n promise.resolve(message);\n map.delete(mid);\n }\n\n if(map.size) {\n for(const [mid, promise] of map) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n }\n }).finally(() => {\n this.rootScope.dispatchEvent('messages_downloaded', {peerId, mids});\n });\n\n requestPromises.push(after);\n }\n\n this.needSingleMessages.clear();\n\n return Promise.all(requestPromises).then(noop, noop).then(() => {\n this.fetchSingleMessagesPromise = undefined;\n if(this.needSingleMessages.size) this.fetchSingleMessages();\n });\n });\n }\n\n public reloadMessages(peerId: PeerId, mid: number, overwrite?: boolean): Promise;\n public reloadMessages(peerId: PeerId, mid: number[], overwrite?: boolean): Promise;\n public reloadMessages(peerId: PeerId, mid: number | number[], overwrite?: boolean): Promise {\n if(Array.isArray(mid)) {\n return Promise.all(mid.map((mid) => {\n return this.reloadMessages(peerId, mid, overwrite);\n }));\n }\n\n const message = this.getMessageByPeer(peerId, mid);\n if(message && !overwrite) {\n this.rootScope.dispatchEvent('messages_downloaded', {peerId, mids: [mid]});\n return Promise.resolve(message);\n } else {\n let map = this.needSingleMessages.get(peerId);\n if(!map) {\n this.needSingleMessages.set(peerId, map = new Map());\n }\n\n let promise = map.get(mid);\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n map.set(mid, promise);\n this.fetchSingleMessages();\n return promise;\n }\n }\n\n public getExtendedMedia(peerId: PeerId, mids: number[]) {\n let map = this.extendedMedia.get(peerId);\n if(!map) {\n this.extendedMedia.set(peerId, map = new Map());\n }\n\n const deferred = deferredPromise();\n const toRequest: number[] = [];\n const promises = mids.map((mid) => {\n let promise = map.get(mid);\n if(!promise) {\n map.set(mid, promise = deferred);\n toRequest.push(mid);\n\n promise.then(() => {\n map.delete(mid);\n if(!map.size && this.extendedMedia.get(peerId) === map) {\n this.extendedMedia.delete(peerId);\n }\n });\n }\n\n return promise;\n });\n\n if(!toRequest.length) {\n deferred.resolve();\n } else {\n this.apiManager.invokeApi('messages.getExtendedMedia', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: toRequest.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n });\n }\n\n return Promise.all(promises);\n }\n\n public fetchMessageReplyTo(message: MyMessage) {\n if(!message.reply_to_mid) return Promise.resolve(this.generateEmptyMessage(0));\n const replyToPeerId = message.reply_to.reply_to_peer_id ? this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId;\n return this.reloadMessages(replyToPeerId, message.reply_to_mid).then((originalMessage) => {\n if(!originalMessage) { // ! break the infinite loop\n message = this.getMessageByPeer(message.peerId, message.mid); // message can come from other thread\n delete message.reply_to_mid; // ! WARNING!\n }\n\n if(message._ === 'messageService') {\n const peerId = message.peerId;\n this.rootScope.dispatchEvent('message_edit', {\n storageKey: `${peerId}_history`,\n peerId: peerId,\n mid: message.mid,\n message\n });\n\n if(this.isMessageIsTopMessage(message)) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map([[peerId, {dialog: this.getDialogOnly(peerId)}]]));\n }\n }\n\n return originalMessage;\n });\n }\n\n private getTypingKey(peerId: PeerId, threadId?: number) {\n return threadId ? `${peerId}_${threadId}` : peerId;\n }\n\n public setTyping(\n peerId: PeerId,\n action: SendMessageAction,\n force?: boolean,\n threadId?: number\n ): Promise {\n if(threadId && !this.appPeersManager.isForum(peerId)) {\n threadId = undefined;\n }\n\n const key = this.getTypingKey(peerId, threadId);\n let typing = this.typings[key];\n if(\n !peerId ||\n !this.canSendToPeer(peerId) ||\n peerId === this.appPeersManager.peerId ||\n // (!force && deepEqual(typing?.action, action))\n (!force && typing?.action?._ === action._)\n ) {\n return Promise.resolve(false);\n }\n\n if(typing?.timeout) {\n clearTimeout(typing.timeout);\n }\n\n typing = this.typings[key] = {\n action\n };\n\n return this.apiManager.invokeApi('messages.setTyping', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n action,\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n }).finally(() => {\n if(typing === this.typings[key]) {\n typing.timeout = ctx.setTimeout(() => {\n delete this.typings[key];\n }, 6000);\n }\n });\n }\n\n private handleReleasingMessage(message: MyMessage, storage: MessagesStorage) {\n const media = (message as Message.message).media;\n if(media) {\n const c = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || media as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument;\n const smth: Photo.photo | MyDocument = (c as MessageMedia.messageMediaPhoto).photo as any || (c as MessageMedia.messageMediaDocument).document as any;\n\n if(smth?.file_reference) {\n this.referenceDatabase.deleteContext(smth.file_reference, {type: 'message', peerId: message.peerId, messageId: message.mid});\n }\n\n if('webpage' in media && media.webpage) {\n const isScheduled = this.getScheduledMessagesStorage(message.peerId) === storage;\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(message.peerId, message.mid, isScheduled);\n this.appWebPagesManager.deleteWebPageFromPending(media.webpage, messageKey);\n }\n\n if((media as MessageMedia.messageMediaPoll).poll) {\n this.appPollsManager.updatePollToMessage(message as Message.message, false);\n }\n }\n }\n\n private handleDeletedMessages(peerId: PeerId, storage: MessagesStorage, messages: number[]) {\n const history: {\n count: number,\n unread: number,\n unreadMentions: number,\n msgs: Set,\n albums?: {[groupId: string]: Set},\n } = {\n count: 0,\n unread: 0,\n unreadMentions: 0,\n msgs: new Set()\n };\n\n for(const mid of messages) {\n const message: MyMessage = this.getMessageFromStorage(storage, mid);\n if(!message) {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n continue;\n }\n\n this.handleReleasingMessage(message, storage);\n\n this.updateMessageRepliesIfNeeded(message);\n\n if(!message.pFlags.out && !message.pFlags.is_outgoing && message.pFlags.unread) {\n ++history.unread;\n this.rootScope.dispatchEvent('notification_cancel', 'msg' + mid);\n\n if(message.pFlags.mentioned) {\n ++history.unreadMentions;\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n\n ++history.count;\n history.msgs.add(mid);\n\n message.deleted = true;\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const groupedStorage = this.groupedMessagesStorage[groupedId];\n if(groupedStorage) {\n groupedStorage.delete(mid);\n\n if(!history.albums) history.albums = {};\n (history.albums[groupedId] || (history.albums[groupedId] = new Set())).add(mid);\n\n if(!groupedStorage.size) {\n delete history.albums;\n delete this.groupedMessagesStorage[groupedId];\n }\n }\n }\n\n storage.delete(mid);\n }\n\n if(history.albums) {\n for(const groupedId in history.albums) {\n this.dispatchAlbumEdit(groupedId, storage, [...history.albums[groupedId]]);\n /* const mids = this.getMidsByAlbum(groupId);\n if(mids.length) {\n const mid = Math.max(...mids);\n rootScope.$broadcast('message_edit', {peerId, mid, justMedia: false});\n } */\n }\n }\n\n return history;\n }\n\n private handleEditedMessage(oldMessage: Message, newMessage: Message, storage: MessagesStorage) {\n if(oldMessage._ === 'message') {\n if((oldMessage.media as MessageMedia.messageMediaWebPage)?.webpage) {\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(oldMessage.peerId, oldMessage.mid, !!oldMessage.pFlags.is_scheduled);\n this.appWebPagesManager.deleteWebPageFromPending((oldMessage.media as MessageMedia.messageMediaWebPage).webpage, messageKey);\n }\n\n const groupedId = oldMessage.grouped_id;\n if(groupedId) {\n this.dispatchAlbumEdit(groupedId, storage, []);\n }\n }\n }\n\n private dispatchAlbumEdit(groupedId: string, storage: MessagesStorage, deletedMids?: number[]) {\n const mids = this.getMidsByAlbum(groupedId);\n const messages = mids.map((mid) => this.getMessageFromStorage(storage, mid)) as Message.message[];\n this.rootScope.dispatchEvent('album_edit', {peerId: messages[0].peerId, groupId: groupedId, deletedMids: deletedMids || [], messages});\n }\n\n public getDialogUnreadCount(dialog: Dialog | ForumTopic) {\n let unreadCount = dialog.unread_count;\n if(!this.dialogsStorage.isTopic(dialog) && this.appPeersManager.isForum(dialog.peerId)) {\n const forumUnreadCount = this.dialogsStorage.getForumUnreadCount(dialog.peerId);\n if(forumUnreadCount instanceof Promise) {\n unreadCount = 0;\n } else {\n unreadCount = forumUnreadCount.count;\n }\n }\n\n return unreadCount || +!!(dialog as Dialog).pFlags.unread_mark;\n }\n\n public isDialogUnread(dialog: Dialog | ForumTopic) {\n return !!this.getDialogUnreadCount(dialog);\n }\n\n public canForward(message: Message.message | Message.messageService) {\n return message?._ === 'message' && !(message as Message.message).pFlags.noforwards && !this.appPeersManager.noForwards(message.peerId);\n }\n\n private pushBatchUpdate(\n event: E,\n callback: C,\n key: string,\n getElementCallback?: () => MapValueType[0]>\n ) {\n let details = this.batchUpdates[event];\n if(!details) {\n // @ts-ignore\n details = this.batchUpdates[event] = {\n callback,\n batch: new Map()\n };\n }\n\n if(!details.batch.has(key)) {\n // @ts-ignore\n details.batch.set(key, getElementCallback ? getElementCallback() : undefined);\n this.batchUpdatesDebounced();\n }\n }\n\n private getMessagesFromMap>(map: T) {\n const newMap: Map> = new Map();\n for(const [key, value] of map) {\n const [peerIdStr, mid] = key.split('_');\n const message = this.getMessageByPeer(peerIdStr.toPeerId(), +mid) as Message.message;\n if(!message) {\n continue;\n }\n\n newMap.set(message, value);\n }\n\n return newMap;\n }\n\n private batchUpdateViews = (batch: Map) => {\n const toDispatch: {peerId: PeerId, mid: number, views: number}[] = [];\n\n const map = this.getMessagesFromMap(batch);\n for(const [message] of map) {\n toDispatch.push({\n peerId: message.peerId,\n mid: message.mid,\n views: message.views\n })\n }\n\n return toDispatch;\n };\n\n private batchUpdateReactions = (batch: Map) => {\n const toDispatch: {message: Message.message, changedResults: ReactionCount.reactionCount[]}[] = [];\n\n const map = this.getMessagesFromMap(batch);\n for(const [message, previousReactions] of map) {\n const results = message.reactions?.results ?? [];\n const previousResults = previousReactions?.results ?? [];\n const changedResults = results.filter((reactionCount) => {\n const previousReactionCount = previousResults.find((_reactionCount) => reactionsEqual(_reactionCount.reaction, reactionCount.reaction));\n return (\n message.pFlags.out && (\n !previousReactionCount ||\n reactionCount.count > previousReactionCount.count\n )\n ) || (\n reactionCount.chosen_order !== undefined && (\n !previousReactionCount ||\n previousReactionCount.chosen_order === undefined\n )\n );\n });\n\n toDispatch.push({message, changedResults});\n }\n\n return toDispatch;\n };\n\n public saveDefaultSendAs(peerId: PeerId, sendAsPeerId: PeerId) {\n const channelFull = this.appProfileManager.getCachedFullChat(peerId.toChatId()) as ChatFull.channelFull;\n channelFull.default_send_as = this.appPeersManager.getOutputPeer(sendAsPeerId);\n return this.apiManager.invokeApi('messages.saveDefaultSendAs', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n send_as: this.appPeersManager.getInputPeerById(sendAsPeerId)\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getFileNameByLocation} from '../../../../helpers/fileName';\nimport {Document} from '../../../../layer';\nimport getDocumentInputFileLocation from './getDocumentInputFileLocation';\n\nexport default function getDocumentInputFileName(doc: Document.document, thumbSize?: string) {\n return getFileNameByLocation(getDocumentInputFileLocation(doc, thumbSize), {fileName: doc.file_name});\n}\n","export default function convertInputKeyToKey(inputKey: string) {\n const str = inputKey.replace('input', '');\n return (str[0].toLowerCase() + str.slice(1)) as T;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport tsNow from '../../helpers/tsNow';\nimport {InputNotifyPeer, InputPeerNotifySettings, NotifyPeer, PeerNotifySettings, Update} from '../../layer';\nimport {MUTE_UNTIL} from '../mtproto/mtproto_config';\nimport throttle from '../../helpers/schedulers/throttle';\nimport convertInputKeyToKey from '../../helpers/string/convertInputKeyToKey';\nimport {AppManager} from './manager';\nimport ctx from '../../environment/ctx';\nimport assumeType from '../../helpers/assumeType';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\ntype ImSadAboutIt = Promise | PeerNotifySettings;\ntype MyNotifyPeer = Exclude;\ntype MyInputNotifyPeer = Exclude;\nexport class AppNotificationsManager extends AppManager {\n private peerSettings = {\n notifyPeer: {} as {[peerId: string]: ImSadAboutIt},\n notifyUsers: null as ImSadAboutIt,\n notifyChats: null as ImSadAboutIt,\n notifyBroadcasts: null as ImSadAboutIt,\n notifyForumTopic: {} as {[peerId_threadId: string]: ImSadAboutIt}\n };\n // private exceptions: {[peerId: string]: PeerNotifySettings} = {};\n\n private getNotifyPeerTypePromise: Promise;\n\n private checkMuteUntilTimeout: number;\n private checkMuteUntilThrottled: () => void;\n\n private notifyContactsSignUp: Promise;\n\n protected after() {\n this.checkMuteUntilThrottled = throttle(this.checkMuteUntil, 1000, false);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateNotifySettings: (update) => {\n const {peer} = update;\n const isTopic = peer._ === 'notifyForumTopic';\n const isPeerType = peer._ === 'notifyPeer' || isTopic;\n const peerId = isPeerType && this.appPeersManager.getPeerId(peer.peer);\n const key = !isPeerType ? peer._ : undefined;\n this.savePeerSettings({\n key,\n peerId,\n threadId: isTopic ? generateMessageId(peer.top_msg_id) : undefined,\n settings: update.notify_settings\n });\n this.rootScope.dispatchEvent('notify_settings', update);\n }\n });\n\n return this.appStateManager.getState().then((state) => {\n if(state.notifySettings) {\n for(const key in state.notifySettings) {\n assumeType(key);\n this.savePeerSettings({\n key,\n settings: state.notifySettings[key]\n });\n }\n }\n });\n }\n\n public getNotifySettings(peer: InputNotifyPeer): ImSadAboutIt {\n let key: any = convertInputKeyToKey(peer._);\n let obj: any = this.peerSettings[key as MyNotifyPeer];\n\n let peerId: PeerId;\n if(peer._ === 'inputNotifyPeer') {\n peerId = key = this.appPeersManager.getPeerId(peer.peer);\n obj = obj[key];\n }\n\n if(obj) {\n return obj;\n }\n\n return (obj || this.peerSettings)[key] = this.apiManager.invokeApi('account.getNotifySettings', {peer})\n .then((settings) => {\n this.savePeerSettings({\n key,\n peerId,\n settings\n });\n\n return settings;\n });\n }\n\n public getNotifyPeerTypeSettings() {\n if(this.getNotifyPeerTypePromise) return this.getNotifyPeerTypePromise;\n\n const promises = (['inputNotifyBroadcasts', 'inputNotifyUsers', 'inputNotifyChats'] as MyInputNotifyPeer[])\n .map((inputKey) => {\n return this.getNotifySettings({_: inputKey});\n });\n\n return this.getNotifyPeerTypePromise = Promise.all(promises);\n }\n\n public updateNotifySettings(peer: InputNotifyPeer, settings: InputPeerNotifySettings) {\n // this.savePeerSettings(peerId, settings);\n\n /* const inputSettings: InputPeerNotifySettings = copy(settings) as any;\n inputSettings._ = 'inputPeerNotifySettings'; */\n\n return this.apiManager.invokeApi('account.updateNotifySettings', {\n peer,\n settings\n }).then((value) => {\n if(value) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateNotifySettings',\n peer: {\n ...peer as any,\n _: convertInputKeyToKey(peer._)\n },\n notify_settings: { // ! WOW, IT WORKS !\n ...settings,\n _: 'peerNotifySettings'\n }\n });\n }\n });\n }\n\n // public getNotifyExceptions() {\n // apiManager.invokeApi('account.getNotifyExceptions', {compare_sound: true})\n // .then((updates) => {\n // apiUpdatesManager.processUpdateMessage(updates);\n // });\n // }\n\n public getContactSignUpNotification() {\n if(this.notifyContactsSignUp) return this.notifyContactsSignUp;\n return this.notifyContactsSignUp = this.apiManager.invokeApi('account.getContactSignUpNotification');\n }\n\n public setContactSignUpNotification(silent: boolean) {\n this.apiManager.invokeApi('account.setContactSignUpNotification', {silent})\n .then((value) => {\n this.notifyContactsSignUp = Promise.resolve(!silent);\n });\n }\n\n private checkMuteUntil = () => {\n if(this.checkMuteUntilTimeout !== undefined) {\n clearTimeout(this.checkMuteUntilTimeout);\n this.checkMuteUntilTimeout = undefined;\n }\n\n const timestamp = tsNow(true);\n let closestMuteUntil = MUTE_UNTIL;\n\n const p = (peerNotifySettings: ImSadAboutIt): peerNotifySettings is PeerNotifySettings => {\n if(peerNotifySettings instanceof Promise) {\n return false;\n }\n\n const muteUntil = peerNotifySettings.mute_until;\n if(!muteUntil) {\n return false;\n }\n\n if(muteUntil <= timestamp) {\n // ! do not delete it because peer's unique settings will be overwritten in getPeerLocalSettings with type's settings\n peerNotifySettings.mute_until = 0;\n return true;\n } else if(muteUntil < closestMuteUntil) {\n closestMuteUntil = muteUntil;\n }\n\n return false;\n };\n\n [\n 'notifyPeer' as const,\n 'notifyForumTopic' as const\n ].forEach((typeKey) => {\n for(const key in this.peerSettings[typeKey]) {\n const peerNotifySettings = this.peerSettings[typeKey][key];\n if(p(peerNotifySettings)) {\n const [peerId, topicId] = key.split('_');\n const peer = this.appPeersManager.getOutputPeer(peerId.toPeerId());\n this.apiUpdatesManager.saveUpdate({\n _: 'updateNotifySettings',\n peer: topicId ? {\n _: 'notifyForumTopic',\n peer,\n top_msg_id: +topicId\n } : {\n _: 'notifyPeer',\n peer\n },\n notify_settings: peerNotifySettings\n });\n }\n }\n });\n\n const timeout = Math.min(1800e3, (closestMuteUntil - timestamp) * 1000);\n this.checkMuteUntilTimeout = ctx.setTimeout(this.checkMuteUntil, timeout);\n };\n\n public getPeerKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n }\n\n public savePeerSettings({key, peerId, threadId, settings}: {\n key?: Exclude,\n peerId?: PeerId,\n threadId?: number,\n settings: PeerNotifySettings\n }) {\n let obj: any;\n if(peerId) {\n key = this.getPeerKey(peerId, threadId) as any;\n obj = this.peerSettings[threadId ? 'notifyForumTopic' : 'notifyPeer'];\n }\n\n (obj || this.peerSettings)[key] = settings;\n\n if(!peerId) {\n this.rootScope.dispatchEvent('notify_peer_type_settings', {key, settings});\n this.appStateManager.getState().then((state) => {\n const notifySettings = state.notifySettings;\n notifySettings[key] = settings;\n this.appStateManager.pushToState('notifySettings', notifySettings);\n });\n } else {\n this.checkMuteUntilThrottled();\n }\n\n // rootScope.broadcast('notify_settings', {peerId: peerId});\n }\n\n public isMuted(peerNotifySettings: PeerNotifySettings) {\n return peerNotifySettings._ === 'peerNotifySettings' &&\n (peerNotifySettings.silent || (peerNotifySettings.mute_until !== undefined && (peerNotifySettings.mute_until * 1000) > tsNow()));\n }\n\n private getPeerMuted(peerId: PeerId) {\n const ret = this.getNotifySettings({_: 'inputNotifyPeer', peer: this.appPeersManager.getInputPeerById(peerId)});\n return (ret instanceof Promise ? ret : Promise.resolve(ret))\n .then((peerNotifySettings) => this.isMuted(peerNotifySettings));\n }\n\n private getPeerLocalSettings({\n peerId,\n respectType = true,\n threadId\n }: {\n peerId: PeerId,\n respectType?: boolean,\n threadId?: number\n }): PeerNotifySettings {\n const n: PeerNotifySettings = {\n _: 'peerNotifySettings'\n };\n\n const peerKey = this.getPeerKey(peerId, threadId);\n const notifySettings = this.peerSettings[threadId ? 'notifyForumTopic' : 'notifyPeer'][peerKey];\n // if(!notifySettings || (notifySettings instanceof Promise)) return false;\n if(notifySettings && !(notifySettings instanceof Promise)) {\n Object.assign(n, notifySettings);\n }\n\n if(respectType) {\n const inputNotify = this.appPeersManager.getInputNotifyPeerById({peerId, ignorePeerId: true, threadId});\n const key = convertInputKeyToKey(inputNotify._);\n const typeNotifySettings = this.peerSettings[key as MyNotifyPeer];\n if(typeNotifySettings && !(typeNotifySettings instanceof Promise)) {\n for(const i in typeNotifySettings) {\n // @ts-ignore\n if(n[i] === undefined) {\n // @ts-ignore\n n[i] = typeNotifySettings[i];\n }\n }\n }\n }\n\n return n;\n }\n\n public validatePeerSettings[0]>(options: T): T {\n if(options.peerId === this.appPeersManager.peerId) return;\n if(options.threadId && !this.appPeersManager.isForum(options.peerId)) options.threadId = undefined;\n return options;\n }\n\n public isPeerLocalMuted(options: Parameters[0]): boolean {\n if(!(options = this.validatePeerSettings(options))) return false;\n\n if(options.threadId) {\n const notifySettings = this.getPeerLocalSettings({...options, respectType: false});\n if(notifySettings.silent !== undefined || notifySettings.mute_until !== undefined) {\n return this.isMuted(notifySettings);\n } else {\n return this.isPeerLocalMuted({...options, threadId: undefined});\n }\n }\n\n const notifySettings = this.getPeerLocalSettings(options);\n const isMuted = this.isMuted(notifySettings);\n return isMuted;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {Chat, ChatPhoto, DialogPeer, InputChannel, InputDialogPeer, InputNotifyPeer, InputPeer, Peer, Update, User, UserProfilePhoto} from '../../layer';\nimport type {LangPackKey} from '../langPack';\nimport {getRestrictionReason} from '../../helpers/restrictions';\nimport isObject from '../../helpers/object/isObject';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\nimport isUser from './utils/peers/isUser';\nimport isAnyChat from './utils/peers/isAnyChat';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport getPeerActiveUsernames from './utils/peers/getPeerActiveUsernames';\nimport isPeerRestricted from './utils/peers/isPeerRestricted';\nimport getPeerPhoto from './utils/peers/getPeerPhoto';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved';\nexport class AppPeersManager extends AppManager {\n public get peerId() {\n return this.appUsersManager.userId.toPeerId();\n }\n /* public savePeerInstance(peerId: PeerId, instance: any) {\n if(peerId < 0) appChatsManager.saveApiChat(instance);\n else appUsersManager.saveApiUser(instance);\n } */\n\n public canPinMessage(peerId: PeerId) {\n return peerId.isUser() || this.appChatsManager.hasRights(peerId.toChatId(), 'pin_messages');\n }\n\n public getPeerPhoto(peerId: PeerId) {\n const peer = this.getPeer(peerId) as User.user | Chat.channel;\n return getPeerPhoto(peer);\n }\n\n public getPeerMigratedTo(peerId: PeerId) {\n if(peerId.isUser()) {\n return false;\n }\n\n const chat = this.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n const migratedTo = chat?.migrated_to;\n if(migratedTo && chat.pFlags.deactivated) {\n return getPeerId(migratedTo);\n }\n\n return false;\n }\n\n public getOutputPeer(peerId: PeerId): Peer {\n if(peerId.isUser()) {\n return {_: 'peerUser', user_id: peerId.toUserId()};\n }\n\n const chatId = peerId.toChatId();\n if(this.appChatsManager.isChannel(chatId)) {\n return {_: 'peerChannel', channel_id: chatId};\n }\n\n return {_: 'peerChat', chat_id: chatId};\n }\n\n public getPeerString(peerId: PeerId) {\n if(peerId.isUser()) {\n return this.appUsersManager.getUserString(peerId.toUserId());\n }\n return this.appChatsManager.getChatString(peerId.toChatId());\n }\n\n public getPeerUsername(peerId: PeerId) {\n return this.getPeerActiveUsernames(peerId)[0] || '';\n }\n\n public getPeerActiveUsernames(peerId: PeerId) {\n const peer = this.getPeer(peerId);\n return getPeerActiveUsernames(peer);\n }\n\n public getPeer(peerId: PeerId) {\n return peerId.isUser() ?\n this.appUsersManager.getUser(peerId.toUserId()) :\n this.appChatsManager.getChat(peerId.toChatId());\n }\n\n public getPeerId(peerId: Parameters[0]) {\n return getPeerId(peerId) || (isObject(peerId) && peerId._ === 'inputPeerSelf' && this.peerId) || NULL_PEER_ID;\n }\n\n public getDialogPeer(peerId: PeerId): DialogPeer {\n return {\n _: 'dialogPeer',\n peer: this.getOutputPeer(peerId)\n };\n }\n\n public isChannel(peerId: PeerId): boolean {\n return !peerId.isUser() && this.appChatsManager.isChannel(peerId.toChatId());\n }\n\n public isMegagroup(peerId: PeerId) {\n return !peerId.isUser() && this.appChatsManager.isMegagroup(peerId.toChatId());\n }\n\n public isForum(peerId: PeerId) {\n return !peerId.isUser() && this.appChatsManager.isForum(peerId.toChatId());\n }\n\n public isAnyGroup(peerId: PeerId): boolean {\n return !peerId.isUser() && !this.appChatsManager.isBroadcast(peerId.toChatId());\n }\n\n public isBroadcast(peerId: PeerId): boolean {\n return this.isChannel(peerId) && !this.isMegagroup(peerId);\n }\n\n public isBot(peerId: PeerId): boolean {\n return peerId.isUser() && this.appUsersManager.isBot(peerId.toUserId());\n }\n\n public isContact(peerId: PeerId): boolean {\n return peerId.isUser() && this.appUsersManager.isContact(peerId.toUserId());\n }\n\n public isUser(peerId: PeerId)/* : peerId is UserId */ {\n return isUser(peerId);\n }\n\n public isAnyChat(peerId: PeerId) {\n return isAnyChat(peerId);\n }\n\n public isPeerRestricted(peerId: PeerId) {\n return isPeerRestricted(this.getPeer(peerId));\n }\n\n public getRestrictionReasonText(peerId: PeerId) {\n const peer = this.getPeer(peerId) as Chat.channel | User.user;\n const reason = peer.restriction_reason ? getRestrictionReason(peer.restriction_reason) : undefined;\n if(reason) {\n return reason.text;\n } else {\n return peerId.isUser() ? 'This user is restricted' : 'This chat is restricted';\n }\n }\n\n /* public getInputPeer(peerString: string): InputPeer {\n var firstChar = peerString.charAt(0);\n var peerParams = peerString.substr(1).split('_');\n let id = +peerParams[0];\n\n if(firstChar === 'u') {\n //appUsersManager.saveUserAccess(id, peerParams[1]);\n\n return {\n _: 'inputPeerUser',\n user_id: id,\n access_hash: peerParams[1]\n };\n } else if(firstChar === 'c' || firstChar === 's') {\n //appChatsManager.saveChannelAccess(id, peerParams[1]);\n if(firstChar === 's') {\n appChatsManager.saveIsMegagroup(id);\n }\n\n return {\n _: 'inputPeerChannel',\n channel_id: id,\n access_hash: peerParams[1] || '0'\n };\n } else {\n return {\n _: 'inputPeerChat',\n chat_id: id\n };\n }\n } */\n\n // public getInputNotifyPeerById(peerId: PeerId, ignorePeerId: true): Exclude;\n // public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: false): InputNotifyPeer.inputNotifyPeer;\n // public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: boolean): InputNotifyPeer {\n public getInputNotifyPeerById({\n peerId,\n ignorePeerId,\n threadId\n }: T): T['ignorePeerId'] extends true ? Exclude : (T['threadId'] extends number ? InputNotifyPeer.inputNotifyForumTopic : InputNotifyPeer.inputNotifyPeer) {\n if(ignorePeerId) {\n if(peerId.isUser()) {\n return {_: 'inputNotifyUsers'} as any;\n } else {\n if(this.isBroadcast(peerId)) {\n return {_: 'inputNotifyBroadcasts'} as any;\n } else {\n return {_: 'inputNotifyChats'} as any;\n }\n }\n } else if(threadId) {\n return {\n _: 'inputNotifyForumTopic',\n peer: this.getInputPeerById(peerId),\n top_msg_id: getServerMessageId(threadId)\n } as any;\n } else {\n return {\n _: 'inputNotifyPeer',\n peer: this.getInputPeerById(peerId)\n } as any;\n }\n }\n\n public getInputPeerById(peerId: PeerId): InputPeer {\n if(!peerId) {\n return {_: 'inputPeerEmpty'};\n }\n\n if(!peerId.isUser()) {\n const chatId = peerId.toChatId();\n return this.appChatsManager.getInputPeer(chatId);\n }\n\n const userId = peerId.toUserId();\n return this.appUsersManager.getUserInputPeer(userId);\n }\n\n /**\n * ! use it only in safe places like requests\n */\n public getInputPeerSelf(): InputPeer.inputPeerSelf {\n return {_: 'inputPeerSelf'};\n }\n\n public getInputDialogPeerById(peerId: PeerId | InputPeer): InputDialogPeer {\n return {\n _: 'inputDialogPeer',\n peer: isObject(peerId) ? peerId : this.getInputPeerById(peerId)\n };\n }\n\n public getPeerSearchText(peerId: PeerId) {\n let text: string;\n if(this.isUser(peerId)) {\n text = '%pu ' + this.appUsersManager.getUserSearchText(peerId.toUserId());\n } else {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n text = '%pg ' + (chat.title || '');\n }\n\n return text;\n }\n\n public getDialogType(peerId: PeerId): PeerType {\n if(this.isMegagroup(peerId)) {\n return 'megagroup';\n } else if(this.isChannel(peerId)) {\n return 'channel';\n } else if(!this.isUser(peerId)) {\n return 'group';\n } else {\n return peerId === this.peerId ? 'saved' : 'chat';\n }\n }\n\n public getDeleteButtonText(peerId: PeerId): Extract {\n switch(this.getDialogType(peerId)) {\n case 'channel':\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'ChannelDelete' : 'ChatList.Context.LeaveChannel';\n\n case 'megagroup':\n case 'group':\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'DeleteMega' : 'ChatList.Context.LeaveGroup';\n\n default:\n return 'ChatList.Context.DeleteChat';\n }\n }\n\n public noForwards(peerId: PeerId) {\n if(peerId.isUser()) return false;\n else {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n return !!(chat as Chat.chat).pFlags?.noforwards;\n }\n }\n}\n\nexport type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat';\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Photo, PhotoSize, PhotosPhotos} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\nimport {AppManager} from './manager';\n\nexport type MyPhoto = Photo.photo;\n\n// TIMES = 2 DUE TO SIDEBAR AND CHAT\n// let TEST_FILE_REFERENCE = \"5440692274120994569\", TEST_FILE_REFERENCE_TIMES = 2;\n\nexport class AppPhotosManager extends AppManager {\n private photos: {\n [id: string]: MyPhoto\n } = {};\n\n public savePhoto(photo: Photo, context?: ReferenceContext) {\n if(!photo || photo._ === 'photoEmpty') return;\n\n /* if(photo.id === TEST_FILE_REFERENCE) {\n console.warn('Testing FILE_REFERENCE_EXPIRED');\n const bytes = [2, 67, 175, 43, 190, 0, 0, 20, 62, 95, 111, 33, 45, 99, 220, 116, 218, 11, 167, 127, 213, 18, 127, 32, 243, 202, 117, 80, 30];\n //photo.file_reference = new Uint8Array(bytes);\n photo.file_reference = bytes;\n if(!--TEST_FILE_REFERENCE_TIMES) {\n TEST_FILE_REFERENCE = '';\n }\n } */\n\n const oldPhoto = this.photos[photo.id];\n if(photo.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldPhoto, photo);\n this.referenceDatabase.saveContext(photo.file_reference, context);\n }\n\n if(photo.sizes?.length) {\n // * sometimes photoStrippedSize can be the last item\n photo.sizes.sort((a, b) => {\n return ((a as PhotoSize.photoSize).size || ((a as PhotoSize.photoSizeProgressive).sizes ? Infinity : 0)) - ((b as PhotoSize.photoSize).size || ((b as PhotoSize.photoSizeProgressive).sizes ? Infinity : 0));\n });\n\n const size = photo.sizes[photo.sizes.length - 1];\n if(size._ === 'photoSizeProgressive') {\n size.size = size.sizes[size.sizes.length - 1];\n }\n }\n\n if(oldPhoto) {\n return Object.assign(oldPhoto, photo);\n }\n\n return this.photos[photo.id] = photo;\n }\n\n public getUserPhotos(userId: UserId, maxId: Photo.photo['id'] = '0', limit: number = 20) {\n const inputUser = this.appUsersManager.getUserInput(userId);\n return this.apiManager.invokeApiCacheable('photos.getUserPhotos', {\n user_id: inputUser,\n offset: 0,\n limit,\n max_id: maxId\n }, {cacheSeconds: 60}).then((photosResult) => {\n this.appUsersManager.saveApiUsers(photosResult.users);\n const photoIds = photosResult.photos.map((photo, idx) => {\n photosResult.photos[idx] = this.savePhoto(photo, {type: 'profilePhoto', peerId: userId.toPeerId()});\n return photo.id;\n });\n\n // ! WARNING !\n if(maxId !== '0' && maxId) {\n const idx = photoIds.indexOf(maxId);\n if(idx !== -1) {\n photoIds.splice(idx, 1);\n }\n }\n\n return {\n count: (photosResult as PhotosPhotos.photosPhotosSlice).count || photoIds.length,\n photos: photoIds\n };\n });\n }\n\n /* public getPhotoURL(photo: MTPhoto | MTMyDocument, photoSize: MTPhotoSize) {\n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize);\n\n return {url: getFileURL('photo', downloadOptions), location: downloadOptions.location};\n } */\n\n /* public isDownloaded(media: any) {\n const isPhoto = media._ === 'photo';\n const photo = isPhoto ? this.getPhoto(media.id) : null;\n let isDownloaded: boolean;\n if(photo) {\n isDownloaded = photo.downloaded > 0;\n } else {\n const cachedThumb = this.getDocumentCachedThumb(media.id);\n isDownloaded = cachedThumb?.downloaded > 0;\n }\n\n return isDownloaded;\n } */\n\n public getPhoto(photoId: any/* MyPhoto | string */): MyPhoto {\n return isObject(photoId) ? photoId as MyPhoto : this.photos[photoId as any as string];\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport copy from '../../helpers/object/copy';\nimport {InputMedia, Message, MessageEntity, MessageMedia, Poll, PollResults} from '../../layer';\nimport {logger, LogTypes} from '../logger';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\ntype PollId = Poll['id'];\n\nexport class AppPollsManager extends AppManager {\n public polls: {[id: PollId]: Poll} = {};\n public results: {[id: PollId]: PollResults} = {};\n public pollToMessages: {[id: PollId]: Set} = {};\n\n private log = logger('POLLS', LogTypes.Error);\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateMessagePoll: (update) => {\n this.log('updateMessagePoll:', update);\n\n let poll: Poll = update.poll || this.polls[update.poll_id];\n if(!poll) {\n return;\n }\n\n let results = update.results;\n const ret = this.savePoll(poll, results as any);\n poll = ret.poll;\n results = ret.results;\n\n this.rootScope.dispatchEvent('poll_update', {poll, results: results as any});\n }\n });\n }\n\n public savePoll(poll: Poll, results: PollResults, message?: Message.message) {\n if(message) {\n this.updatePollToMessage(message, true);\n }\n\n const id = poll.id;\n if(this.polls[id]) {\n poll = Object.assign(this.polls[id], poll);\n results = this.saveResults(poll, results);\n } else {\n this.polls[id] = poll;\n\n poll.chosenIndexes = [];\n results = this.saveResults(poll, results);\n }\n\n return {poll, results};\n }\n\n public saveResults(poll: Poll, results: PollResults) {\n if(this.results[poll.id]) {\n results = Object.assign(this.results[poll.id], results);\n } else {\n this.results[poll.id] = results;\n }\n\n if(!results.pFlags.min) { // ! https://core.telegram.org/constructor/pollResults - min\n poll.chosenIndexes.length = 0;\n if(results?.results?.length) {\n results.results.forEach((answer, idx) => {\n if(answer.pFlags?.chosen) {\n poll.chosenIndexes.push(idx);\n }\n });\n }\n }\n\n return results;\n }\n\n public getPoll(pollId: PollId): {poll: Poll, results: PollResults} {\n return {\n poll: this.polls[pollId],\n results: this.results[pollId]\n };\n }\n\n public getInputMediaPoll(poll: Poll, correctAnswers?: Uint8Array[], solution?: string, solutionEntities?: MessageEntity[]): InputMedia.inputMediaPoll {\n if(solution) {\n if(!solutionEntities) {\n solutionEntities = [];\n }\n\n solution = parseMarkdown(solution, solutionEntities);\n } else {\n solution = undefined; // can be string here\n }\n\n return {\n _: 'inputMediaPoll',\n poll,\n correct_answers: correctAnswers,\n solution,\n solution_entities: solution ? solutionEntities : undefined\n };\n }\n\n public updatePollToMessage(message: Message.message, add: boolean) {\n const {id} = (message.media as MessageMedia.messageMediaPoll).poll;\n let set = this.pollToMessages[id];\n\n if(!add && !set) {\n return;\n }\n\n if(!set) {\n set = this.pollToMessages[id] = new Set();\n }\n\n const key = message.peerId + '_' + message.mid;\n if(add) set.add(key);\n else set.delete(key);\n\n if(!add && !set.size) {\n delete this.polls[id];\n delete this.results[id];\n delete this.pollToMessages[id];\n }\n }\n\n public sendVote(message: Message.message, optionIds: number[]): Promise {\n const poll: Poll = (message.media as MessageMedia.messageMediaPoll).poll;\n\n const options: Uint8Array[] = optionIds.map((index) => {\n return poll.answers[index].option;\n });\n\n const messageId = message.mid;\n const peerId = message.peerId;\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\n\n if(message.pFlags.is_outgoing) {\n return this.appMessagesManager.invokeAfterMessageIsSent(messageId, 'sendVote', (message) => {\n this.log('invoke sendVote callback');\n return this.sendVote(message as Message.message, optionIds);\n });\n }\n\n return this.apiManager.invokeApi('messages.sendVote', {\n peer: inputPeer,\n msg_id: getServerMessageId(message.mid),\n options\n }).then((updates) => {\n this.log('sendVote updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getResults(message: Message.message) {\n const inputPeer = this.appPeersManager.getInputPeerById(message.peerId);\n\n return this.apiManager.invokeApi('messages.getPollResults', {\n peer: inputPeer,\n msg_id: getServerMessageId(message.mid)\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n this.log('getResults updates:', updates);\n });\n }\n\n public getVotes(message: Message.message, option?: Uint8Array, offset?: string, limit = 20) {\n return this.apiManager.invokeApi('messages.getPollVotes', {\n peer: this.appPeersManager.getInputPeerById(message.peerId),\n id: getServerMessageId(message.mid),\n option,\n offset,\n limit\n }).then((votesList) => {\n this.log('getPollVotes messages:', votesList);\n\n this.appUsersManager.saveApiUsers(votesList.users);\n\n return votesList;\n });\n }\n\n public stopPoll(message: Message.message) {\n const poll: Poll = (message.media as MessageMedia.messageMediaPoll).poll;\n\n if(poll.pFlags.closed) return Promise.resolve();\n\n const newPoll = copy(poll);\n newPoll.pFlags.closed = true;\n return this.appMessagesManager.editMessage(message, undefined, {\n newMedia: this.getInputMediaPoll(newPoll)\n }).then(() => {\n // console.log('stopped poll');\n }, err => {\n this.log.error('stopPoll error:', err);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputPrivacyKey, InputPrivacyRule, PrivacyRule, PrivacyKey, GlobalPrivacySettings} from '../../layer';\nimport convertInputKeyToKey from '../../helpers/string/convertInputKeyToKey';\nimport {AppManager} from './manager';\n\nexport class AppPrivacyManager extends AppManager {\n private privacy: Partial<{\n [key in PrivacyKey['_']]: PrivacyRule[] | Promise\n }> = {};\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updatePrivacy: (update) => {\n const key = update.key._;\n this.privacy[key] = update.rules;\n this.rootScope.dispatchEvent('privacy_update', update);\n }\n });\n }\n\n public setPrivacy(inputKey: InputPrivacyKey['_'], rules: InputPrivacyRule[]) {\n return this.apiManager.invokeApi('account.setPrivacy', {\n key: {\n _: inputKey\n },\n rules\n }).then((privacyRules) => {\n this.appUsersManager.saveApiUsers(privacyRules.users);\n this.appChatsManager.saveApiChats(privacyRules.chats);\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updatePrivacy',\n key: {\n _: convertInputKeyToKey(inputKey)\n },\n rules: rules.map((inputRule) => {\n const rule: PrivacyRule = {} as any;\n Object.assign(rule, inputRule);\n rule._ = convertInputKeyToKey(rule._) as any;\n return rule;\n })\n });\n\n // console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\n\n return privacyRules.rules;\n });\n }\n\n public getPrivacy(inputKey: InputPrivacyKey['_']) {\n const privacyKey: PrivacyKey['_'] = convertInputKeyToKey(inputKey) as any;\n const rules = this.privacy[privacyKey];\n if(rules) {\n return Promise.resolve(rules);\n }\n\n return this.privacy[privacyKey] = this.apiManager.invokeApi('account.getPrivacy', {\n key: {\n _: inputKey\n }\n }).then((privacyRules) => {\n this.appUsersManager.saveApiUsers(privacyRules.users);\n this.appChatsManager.saveApiChats(privacyRules.chats);\n\n // console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\n\n return this.privacy[privacyKey] = privacyRules.rules;\n });\n }\n\n public getGlobalPrivacySettings() {\n return this.apiManager.invokeApi('account.getGlobalPrivacySettings');\n }\n\n public setGlobalPrivacySettings(settings: GlobalPrivacySettings) {\n return this.apiManager.invokeApi('account.setGlobalPrivacySettings', {settings});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {MyTopPeer} from './appUsersManager';\nimport tsNow from '../../helpers/tsNow';\nimport {ChannelParticipantsFilter, ChannelsChannelParticipants, ChannelParticipant, Chat, ChatFull, ChatParticipants, ChatPhoto, ExportedChatInvite, InputChannel, InputFile, SendMessageAction, Update, UserFull, Photo, PhotoSize, Updates} from '../../layer';\nimport SearchIndex from '../searchIndex';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport getPhotoInput from './utils/photos/getPhotoInput';\nimport getParticipantPeerId from './utils/chats/getParticipantPeerId';\nimport ctx from '../../environment/ctx';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\nexport type UserTyping = Partial<{userId: UserId, action: SendMessageAction, timeout: number}>;\n\nconst PEER_FULL_TTL = 3 * 60e3;\n\nexport class AppProfileManager extends AppManager {\n // private botInfos: any = {};\n private usersFull: {[id: UserId]: UserFull.userFull} = {};\n private chatsFull: {[id: ChatId]: ChatFull} = {};\n private fullExpiration: {[peerId: PeerId]: number} = {};\n private typingsInPeer: {[key: string]: UserTyping[]};\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateChatParticipants: (update) => {\n const participants = update.participants;\n if(participants._ === 'chatParticipants') {\n const chatId = participants.chat_id;\n const chatFull = this.chatsFull[chatId] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n chatFull.participants = participants;\n this.rootScope.dispatchEvent('chat_full_update', chatId);\n }\n }\n },\n\n updateChatParticipantAdd: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n return;\n }\n }\n\n participants.push({\n _: 'chatParticipant',\n user_id: update.user_id,\n inviter_id: update.inviter_id,\n date: tsNow(true)\n });\n\n _participants.version = update.version;\n this.rootScope.dispatchEvent('chat_full_update', update.chat_id);\n }\n },\n\n updateChatParticipantDelete: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n participants.splice(i, 1);\n _participants.version = update.version;\n this.rootScope.dispatchEvent('chat_full_update', update.chat_id);\n return;\n }\n }\n }\n },\n\n updateUserTyping: this.onUpdateUserTyping,\n updateChatUserTyping: this.onUpdateUserTyping,\n updateChannelUserTyping: this.onUpdateUserTyping,\n\n updatePeerBlocked: this.onUpdatePeerBlocked\n });\n\n this.rootScope.addEventListener('chat_update', (chatId) => {\n const fullChat = this.chatsFull[chatId];\n const chat: Chat.chat | Chat.channel | Chat.chatForbidden | Chat.channelForbidden = this.appChatsManager.getChat(chatId);\n if(!fullChat || !chat) {\n return;\n }\n\n let updated = false;\n if(!!fullChat.call !== !!(chat as Chat.chat).pFlags?.call_active) {\n updated = true;\n }\n\n const {photo} = chat as Chat.chat;\n if(photo) {\n const hasChatPhoto = photo._ !== 'chatPhotoEmpty';\n const hasFullChatPhoto = !!(fullChat.chat_photo && fullChat.chat_photo._ !== 'photoEmpty'); // chat_photo can be missing\n if(\n hasChatPhoto !== hasFullChatPhoto || (\n hasChatPhoto &&\n photo.photo_id !== fullChat.chat_photo?.id\n )\n ) {\n updated = true;\n }\n }\n\n if(updated) {\n this.refreshFullPeer(chatId.toPeerId(true));\n }\n });\n\n this.rootScope.addEventListener('channel_update', (chatId) => {\n this.refreshFullPeer(chatId.toPeerId(true));\n });\n\n // * genius\n this.rootScope.addEventListener('chat_full_update', (chatId) => {\n this.rootScope.dispatchEvent('peer_full_update', chatId.toPeerId(true));\n });\n\n // * genius\n this.rootScope.addEventListener('user_full_update', (userId) => {\n this.rootScope.dispatchEvent('peer_full_update', userId.toPeerId(false));\n });\n\n this.rootScope.addEventListener('invalidate_participants', (chatId) => {\n this.invalidateChannelParticipants(chatId);\n });\n\n this.typingsInPeer = {};\n }\n\n /* public saveBotInfo(botInfo: any) {\n const botId = botInfo && botInfo.user_id;\n if(!botId) {\n return null;\n }\n\n const commands: any = {};\n botInfo.commands.forEach((botCommand: any) => {\n commands[botCommand.command] = botCommand.description;\n });\n\n return this.botInfos[botId] = {\n id: botId,\n version: botInfo.version,\n shareText: botInfo.share_text,\n description: botInfo.description,\n commands: commands\n };\n } */\n\n public getProfile(id: UserId, override?: true) {\n if(this.usersFull[id] && !override && Date.now() < this.fullExpiration[id.toPeerId()]) {\n return this.usersFull[id];\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'users.getFullUser',\n params: {\n id: this.appUsersManager.getUserInput(id)\n },\n processResult: (usersUserFull) => {\n this.appChatsManager.saveApiChats(usersUserFull.chats, true);\n this.appUsersManager.saveApiUsers(usersUserFull.users);\n\n const userFull = usersUserFull.full_user;\n const peerId = id.toPeerId(false);\n if(userFull.profile_photo) {\n userFull.profile_photo = this.appPhotosManager.savePhoto(userFull.profile_photo, {type: 'profilePhoto', peerId});\n }\n\n const botInfo = userFull.bot_info;\n if(botInfo) {\n const referenceContext: ReferenceContext = {type: 'userFull', userId: id};\n botInfo.description_document = this.appDocsManager.saveDoc(botInfo.description_document, referenceContext);\n botInfo.description_photo = this.appPhotosManager.savePhoto(botInfo.description_photo, referenceContext);\n }\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: userFull.notify_settings\n });\n\n this.usersFull[id] = userFull;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n\n /* if(userFull.bot_info) {\n userFull.bot_info = this.saveBotInfo(userFull.bot_info) as any;\n } */\n\n // appMessagesManager.savePinnedMessage(id, userFull.pinned_msg_id);\n\n this.rootScope.dispatchEvent('user_full_update', id);\n return userFull;\n }\n });\n }\n\n public getProfileByPeerId(peerId: PeerId, override?: true) {\n if(this.appPeersManager.isAnyChat(peerId)) return this.getChatFull(peerId.toChatId(), override);\n else return this.getProfile(peerId.toUserId(), override);\n }\n\n public getCachedFullChat(chatId: ChatId) {\n return this.chatsFull[chatId];\n }\n\n public getCachedFullUser(userId: UserId) {\n return this.usersFull[userId];\n }\n\n public getCachedProfileByPeerId(peerId: PeerId) {\n return peerId.isUser() ? this.getCachedFullUser(peerId.toUserId()) : this.getCachedFullChat(peerId.toChatId());\n }\n\n public async getFullPhoto(peerId: PeerId) {\n const profile = await this.getProfileByPeerId(peerId);\n switch(profile._) {\n case 'userFull':\n return profile.profile_photo;\n case 'channelFull':\n case 'chatFull':\n return profile.chat_photo;\n }\n }\n\n /* public getPeerBots(peerId: PeerId) {\n var peerBots: any[] = [];\n if(peerId >= 0 && !appUsersManager.isBot(peerId) ||\n (appPeersManager.isChannel(peerId) && !appPeersManager.isMegagroup(peerId))) {\n return Promise.resolve(peerBots);\n }\n if(peerId >= 0) {\n return this.getProfile(peerId).then((userFull: any) => {\n var botInfo = userFull.bot_info;\n if(botInfo && botInfo._ !== 'botInfoEmpty') {\n peerBots.push(botInfo);\n }\n return peerBots;\n });\n }\n\n return this.getChatFull(peerId.toChatId()).then((chatFull: any) => {\n chatFull.bot_info.forEach((botInfo: any) => {\n peerBots.push(this.saveBotInfo(botInfo))\n });\n return peerBots;\n });\n } */\n\n public getChatFull(id: ChatId, override?: true) {\n if(this.appChatsManager.isChannel(id)) {\n return this.getChannelFull(id, override);\n }\n\n const peerId = id.toPeerId(true);\n const fullChat = this.chatsFull[id] as ChatFull.chatFull;\n if(fullChat && !override && Date.now() < this.fullExpiration[peerId]) {\n const chat = this.appChatsManager.getChat(id) as Chat.chat;\n if(\n chat.pFlags.left ||\n chat.pFlags.deactivated ||\n chat.version === (fullChat.participants as ChatParticipants.chatParticipants).version\n ) {\n return fullChat as ChatFull;\n }\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getFullChat',\n params: {\n chat_id: id\n },\n processResult: (result) => {\n this.appChatsManager.saveApiChats(result.chats, true);\n this.appUsersManager.saveApiUsers(result.users);\n const chatFull = result.full_chat as ChatFull.chatFull;\n if(chatFull && chatFull.chat_photo && chatFull.chat_photo.id) {\n chatFull.chat_photo = this.appPhotosManager.savePhoto(chatFull.chat_photo, {type: 'profilePhoto', peerId});\n }\n\n if(chatFull.call) {\n this.appGroupCallsManager.saveGroupCall(chatFull.call, id);\n }\n\n // appMessagesManager.savePinnedMessage(peerId, fullChat.pinned_msg_id);\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: chatFull.notify_settings\n });\n\n this.chatsFull[id] = chatFull;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n this.rootScope.dispatchEvent('chat_full_update', id);\n\n return chatFull;\n }\n });\n }\n\n public async getChatInviteLink(id: ChatId, force?: boolean) {\n const chatFull = await this.getChatFull(id);\n if(!force &&\n chatFull.exported_invite &&\n chatFull.exported_invite._ == 'chatInviteExported') {\n return chatFull.exported_invite.link;\n }\n\n return this.apiManager.invokeApi('messages.exportChatInvite', {\n peer: this.appPeersManager.getInputPeerById(id.toPeerId(true))\n }).then((exportedInvite) => {\n if(this.chatsFull[id] !== undefined) {\n this.chatsFull[id].exported_invite = exportedInvite;\n }\n\n return (exportedInvite as ExportedChatInvite.chatInviteExported).link;\n });\n }\n\n public getChannelParticipants(id: ChatId, filter: ChannelParticipantsFilter = {_: 'channelParticipantsRecent'}, limit = 200, offset = 0) {\n if(filter._ === 'channelParticipantsRecent') {\n const chat = this.appChatsManager.getChat(id);\n if(chat?.pFlags && (\n // chat.pFlags.kicked ||\n (chat as Chat.channel).pFlags.broadcast &&\n !(chat as Chat.channel).pFlags.creator &&\n !(chat as Chat.channel).admin_rights\n )) {\n return Promise.reject();\n }\n }\n\n return this.apiManager.invokeApiCacheable('channels.getParticipants', {\n channel: this.appChatsManager.getChannelInput(id),\n filter,\n offset,\n limit,\n hash: '0'\n }, {cacheSeconds: 60}).then((result) => {\n this.appUsersManager.saveApiUsers((result as ChannelsChannelParticipants.channelsChannelParticipants).users);\n return result as ChannelsChannelParticipants.channelsChannelParticipants;\n });\n /* let maybeAddSelf = (participants: any[]) => {\n let chat = appChatsManager.getChat(id);\n let selfMustBeFirst = filter._ === 'channelParticipantsRecent' &&\n !offset &&\n !chat.pFlags.kicked &&\n !chat.pFlags.left;\n\n if(selfMustBeFirst) {\n participants = copy(participants);\n let myID = appUsersManager.getSelf().id;\n let myIndex = participants.findIndex((p) => p.user_id === myID);\n let myParticipant;\n\n if(myIndex !== -1) {\n myParticipant = participants[myIndex];\n participants.splice(myIndex, 1);\n } else {\n myParticipant = {_: 'channelParticipantSelf', user_id: myID};\n }\n\n participants.unshift(myParticipant);\n }\n\n return participants;\n } */\n }\n\n public getChannelParticipant(id: ChatId, peerId: PeerId) {\n return this.apiManager.invokeApiSingle('channels.getParticipant', {\n channel: this.appChatsManager.getChannelInput(id),\n participant: this.appPeersManager.getInputPeerById(peerId)\n }).then((channelParticipant) => {\n this.appUsersManager.saveApiUsers(channelParticipant.users);\n return channelParticipant.participant;\n });\n }\n\n public getChannelFull(id: ChatId, override?: true) {\n const peerId = id.toPeerId(true);\n if(this.chatsFull[id] !== undefined && !override && Date.now() < this.fullExpiration[peerId]) {\n return this.chatsFull[id] as ChatFull.channelFull;\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'channels.getFullChannel',\n params: {\n channel: this.appChatsManager.getChannelInput(id)\n },\n processResult: (result) => {\n this.appChatsManager.saveApiChats(result.chats, true);\n this.appUsersManager.saveApiUsers(result.users);\n const fullChannel = result.full_chat as ChatFull.channelFull;\n if(fullChannel && fullChannel.chat_photo.id) {\n fullChannel.chat_photo = this.appPhotosManager.savePhoto(fullChannel.chat_photo, {type: 'profilePhoto', peerId});\n // appPhotosManager.savePhoto(fullChannel.chat_photo);\n }\n\n if(fullChannel.call) {\n this.appGroupCallsManager.saveGroupCall(fullChannel.call, id);\n }\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: fullChannel.notify_settings\n });\n\n this.chatsFull[id] = fullChannel;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n this.rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChannel;\n },\n processError: (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n const channel = this.appChatsManager.getChat(id) as Chat.channel | Chat.channelForbidden;\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: id\n }],\n chats: [channel._ === 'channelForbidden' ? channel : {\n _: 'channelForbidden',\n id,\n access_hash: channel.access_hash,\n title: channel.title,\n pFlags: channel.pFlags\n }],\n users: []\n } as Updates.updates);\n break;\n }\n\n throw error;\n }\n });\n }\n\n public getMentions(chatId: ChatId, query: string, threadId?: number): Promise {\n const processUserIds = (topPeers: MyTopPeer[]) => {\n const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n /* const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n\n const index = new SearchIndex(!startsWithAt, !startsWithAt); */\n const index = new SearchIndex({\n ignoreCase: true\n });\n\n const ratingMap: Map = new Map();\n topPeers.forEach((peer) => {\n index.indexObject(peer.id, this.appUsersManager.getUserSearchText(peer.id));\n ratingMap.set(peer.id, peer.rating);\n });\n\n const peerIds = Array.from(index.search(query));\n peerIds.sort((a, b) => ratingMap.get(b) - ratingMap.get(a));\n return peerIds;\n };\n\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.getChannelParticipants(chatId, {\n _: 'channelParticipantsMentions',\n q: query,\n top_msg_id: getServerMessageId(threadId)\n }, 50, 0).then((cP) => {\n return cP.participants.map((p) => getParticipantPeerId(p));\n });\n } else if(chatId) {\n promise = Promise.resolve(this.getChatFull(chatId)).then((chatFull) => {\n return ((chatFull as ChatFull.chatFull).participants as ChatParticipants.chatParticipants).participants.map((p) => p.user_id.toPeerId());\n });\n } else {\n promise = Promise.resolve([]);\n }\n\n return Promise.all([\n // [],\n this.appUsersManager.getTopPeers('bots_inline').catch(() => [] as MyTopPeer[]),\n promise\n ]).then((results) => {\n const peers = results[0].concat(results[1].map((peerId) => ({id: peerId, rating: 0})));\n\n return processUserIds(peers);\n });\n }\n\n private invalidateChannelParticipants(id: ChatId) {\n this.apiManager.clearCache('channels.getParticipants', (params) => (params.channel as InputChannel.inputChannel).channel_id === id);\n this.refreshFullPeer(id.toPeerId(true));\n }\n\n private refreshFullPeer(peerId: PeerId) {\n if(peerId.isUser()) {\n const userId = peerId.toUserId();\n delete this.usersFull[userId];\n this.rootScope.dispatchEvent('user_full_update', userId);\n } else {\n const chatId = peerId.toChatId();\n delete this.chatsFull[chatId];\n this.rootScope.dispatchEvent('chat_full_update', chatId);\n }\n\n // ! эта строчка будет создавать race condition:\n // ! запрос вернёт chat с установленным флагом call_not_empty, хотя сам апдейт уже будет применён\n // this.getProfileByPeerId(peerId, true);\n }\n\n public updateProfile(first_name?: string, last_name?: string, about?: string) {\n return this.apiManager.invokeApi('account.updateProfile', {\n first_name,\n last_name,\n about\n }).then((user) => {\n this.appUsersManager.saveApiUser(user);\n\n if(about !== undefined) {\n const peerId = user.id.toPeerId();\n const userFull = this.usersFull[user.id];\n if(userFull) {\n userFull.about = about;\n }\n\n this.rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return this.getProfile(user.id, true);\n });\n }\n\n public uploadProfilePhoto(inputFile: InputFile) {\n return this.apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile\n }).then((updateResult) => {\n // ! sometimes can have no user in users\n const photo = updateResult.photo as Photo.photo;\n if(!updateResult.users.length) {\n const strippedThumb = photo.sizes.find((size) => size._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n updateResult.users.push({\n ...this.appUsersManager.getSelf(),\n photo: {\n _: 'userProfilePhoto',\n dc_id: photo.dc_id,\n photo_id: photo.id,\n stripped_thumb: strippedThumb?.bytes,\n pFlags: {\n\n }\n }\n });\n }\n this.appUsersManager.saveApiUsers(updateResult.users);\n\n const myId = this.appPeersManager.peerId;\n this.appPhotosManager.savePhoto(updateResult.photo, {\n type: 'profilePhoto',\n peerId: myId\n });\n\n const userId = myId.toUserId();\n // this.apiUpdatesManager.processLocalUpdate({\n // _: 'updateUserPhoto',\n // user_id: userId,\n // date: tsNow(true),\n // photo: this.appUsersManager.getUser(userId).photo,\n // previous: true\n // });\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateUser',\n user_id: userId\n });\n });\n }\n\n public deletePhotos(photoIds: string[]) {\n return this.apiManager.invokeApiSingle('photos.deletePhotos', {\n id: photoIds.map((photoId) => {\n const photo = this.appPhotosManager.getPhoto(photoId);\n return getPhotoInput(photo);\n })\n }).then((deletedList) => {\n\n });\n }\n\n private verifyParticipantForOnlineCount(participant: {user_id: UserId}) {\n const user = this.appUsersManager.getUser(participant.user_id);\n return !!(user && user.status && user.status._ === 'userStatusOnline');\n }\n\n private reduceParticipantsForOnlineCount(participants: {user_id: UserId}[]) {\n return participants.reduce((acc, participant) => {\n return acc + +this.verifyParticipantForOnlineCount(participant);\n }, 0);\n }\n\n public async getOnlines(id: ChatId): Promise {\n const minOnline = 1;\n if(this.appChatsManager.isBroadcast(id)) {\n return minOnline;\n }\n\n const chatInfo = await this.getChatFull(id);\n if(this.appChatsManager.isMegagroup(id)) {\n if((chatInfo as ChatFull.channelFull).participants_count <= 100) {\n const channelParticipants = await this.getChannelParticipants(id, {_: 'channelParticipantsRecent'}, 100);\n return this.reduceParticipantsForOnlineCount(channelParticipants.participants as ChannelParticipant.channelParticipant[]);\n }\n\n const res = await this.apiManager.invokeApiCacheable('messages.getOnlines', {\n peer: this.appChatsManager.getChannelInputPeer(id)\n }, {cacheSeconds: 60});\n\n const onlines = res.onlines ?? minOnline;\n return onlines;\n }\n\n const _participants = (chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants;\n if(_participants?.participants) {\n return this.reduceParticipantsForOnlineCount(_participants.participants);\n } else {\n return minOnline;\n }\n }\n\n private getTypingsKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? `_${threadId}` : '');\n }\n\n private onUpdateUserTyping = (update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping) => {\n const fromId = (update as Update.updateUserTyping).user_id ?\n (update as Update.updateUserTyping).user_id.toPeerId() :\n this.appPeersManager.getPeerId((update as Update.updateChatUserTyping).from_id);\n if(this.appPeersManager.peerId === fromId || update.action._ === 'speakingInGroupCallAction') {\n return;\n }\n\n const topMsgId = (update as Update.updateChannelUserTyping).top_msg_id;\n const threadId = topMsgId ? generateMessageId(topMsgId) : undefined;\n const peerId = this.appPeersManager.getPeerId(update);\n const key = this.getTypingsKey(peerId, threadId);\n const typings = this.typingsInPeer[key] ??= [];\n let typing = typings.find((t) => t.userId === fromId);\n\n const cancelAction = () => {\n delete typing.timeout;\n // typings.findAndSplice((t) => t === typing);\n const idx = typings.indexOf(typing);\n if(idx !== -1) {\n typings.splice(idx, 1);\n }\n\n this.rootScope.dispatchEvent('peer_typings', {peerId, threadId, typings});\n\n if(!typings.length) {\n delete this.typingsInPeer[key];\n }\n };\n\n if(typing?.timeout !== undefined) {\n clearTimeout(typing.timeout);\n }\n\n if(update.action._ === 'sendMessageCancelAction') {\n if(!typing) {\n return;\n }\n\n cancelAction();\n return;\n }\n\n if(!typing) {\n typing = {\n userId: fromId\n };\n\n typings.push(typing);\n }\n\n // console.log('updateChatUserTyping', update, typings);\n\n typing.action = update.action;\n\n const hasUser = this.appUsersManager.hasUser(fromId);\n if(!hasUser) {\n // let's load user here\n if(update._ === 'updateChatUserTyping') {\n if(update.chat_id && this.appChatsManager.hasChat(update.chat_id) && !this.appChatsManager.isChannel(update.chat_id)) {\n Promise.resolve(this.getChatFull(update.chat_id)).then(() => {\n if(typing.timeout !== undefined && this.appUsersManager.hasUser(fromId)) {\n this.rootScope.dispatchEvent('peer_typings', {peerId, threadId, typings});\n }\n });\n }\n }\n\n // return;\n } else {\n this.appUsersManager.forceUserOnline(fromId);\n }\n\n typing.timeout = ctx.setTimeout(cancelAction, 6000);\n if(hasUser) {\n this.rootScope.dispatchEvent('peer_typings', {peerId, threadId, typings});\n }\n };\n\n private onUpdatePeerBlocked = (update: Update.updatePeerBlocked) => {\n const peerId = this.appPeersManager.getPeerId(update.peer_id);\n if(this.appPeersManager.isUser(peerId)) {\n const userId = peerId.toUserId();\n const userFull = this.usersFull[userId];\n if(userFull) {\n if(update.blocked) userFull.pFlags.blocked = true;\n else delete userFull.pFlags.blocked;\n }\n\n this.rootScope.dispatchEvent('user_full_update', userId);\n }\n\n this.rootScope.dispatchEvent('peer_block', {peerId, blocked: update.blocked});\n };\n\n public getPeerTypings(peerId: PeerId, threadId?: number) {\n return this.typingsInPeer[this.getTypingsKey(peerId, threadId)];\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Awaited} from '../types';\n\nexport default function callbackifyAll(\n values: T,\n callback: (result: { -readonly [P in keyof T]: Awaited }) => R\n): Promise> | R {\n if(values.some((value) => value instanceof Promise)) {\n return Promise.all(values).then(callback as any);\n } else {\n return callback(values as any);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport assumeType from '../../helpers/assumeType';\nimport callbackify from '../../helpers/callbackify';\nimport callbackifyAll from '../../helpers/callbackifyAll';\nimport copy from '../../helpers/object/copy';\nimport pause from '../../helpers/schedulers/pause';\nimport {AvailableReaction, Message, MessagePeerReaction, MessagesAvailableReactions, Reaction, ReactionCount, Update, Updates} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport reactionsEqual from './utils/reactions/reactionsEqual';\n\nconst SAVE_DOC_KEYS = [\n 'static_icon' as const,\n 'appear_animation' as const,\n 'select_animation' as const,\n 'activate_animation' as const,\n 'effect_animation' as const,\n 'around_animation' as const,\n 'center_icon' as const\n];\n\nconst REFERENCE_CONTEXT: ReferenceContext = {\n type: 'reactions'\n};\n\nexport class AppReactionsManager extends AppManager {\n private availableReactions: AvailableReaction[];\n private sendReactionPromises: Map>;\n private lastSendingTimes: Map;\n\n protected after() {\n this.rootScope.addEventListener('language_change', () => {\n this.availableReactions = undefined;\n this.getAvailableReactions();\n });\n\n this.sendReactionPromises = new Map();\n this.lastSendingTimes = new Map();\n\n this.rootScope.addEventListener('user_auth', () => {\n setTimeout(() => {\n Promise.resolve(this.getAvailableReactions()).then(async(availableReactions) => {\n for(const availableReaction of availableReactions) {\n await Promise.all([\n availableReaction.around_animation && this.apiFileManager.downloadMedia({media: availableReaction.around_animation}),\n availableReaction.static_icon && this.apiFileManager.downloadMedia({media: availableReaction.static_icon}),\n availableReaction.appear_animation && this.apiFileManager.downloadMedia({media: availableReaction.appear_animation}),\n availableReaction.center_icon && this.apiFileManager.downloadMedia({media: availableReaction.center_icon})\n ]);\n\n await pause(1000);\n }\n });\n }, 7.5e3);\n });\n }\n\n public getAvailableReactions() {\n if(this.availableReactions) return this.availableReactions;\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAvailableReactions',\n processResult: (messagesAvailableReactions) => {\n assumeType(messagesAvailableReactions);\n\n const availableReactions = this.availableReactions = messagesAvailableReactions.reactions;\n for(const reaction of availableReactions) {\n for(const key of SAVE_DOC_KEYS) {\n if(!reaction[key]) {\n continue;\n }\n\n reaction[key] = this.appDocsManager.saveDoc(reaction[key], REFERENCE_CONTEXT);\n }\n }\n\n return availableReactions;\n },\n params: {\n hash: 0\n }\n });\n }\n\n public getActiveAvailableReactions() {\n return callbackify(this.getAvailableReactions(), (availableReactions) => {\n return availableReactions.filter((availableReaction) => !availableReaction.pFlags.inactive);\n });\n }\n\n public getAvailableReactionsForPeer(peerId: PeerId) {\n const activeAvailableReactions = this.getActiveAvailableReactions();\n if(peerId.isUser()) {\n return this.unshiftQuickReaction(activeAvailableReactions);\n }\n\n const chatFull = this.appProfileManager.getChatFull(peerId.toChatId());\n return callbackifyAll([activeAvailableReactions, chatFull, this.getQuickReaction()], ([activeAvailableReactions, chatFull, quickReaction]) => {\n const chatAvailableReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n\n let filteredChatAvailableReactions: AvailableReaction[] = [];\n if(chatAvailableReactions._ === 'chatReactionsAll') {\n filteredChatAvailableReactions = activeAvailableReactions;\n } else if(chatAvailableReactions._ === 'chatReactionsSome') {\n filteredChatAvailableReactions = chatAvailableReactions.reactions.map((reaction) => {\n return activeAvailableReactions.find((availableReaction) => availableReaction.reaction === (reaction as Reaction.reactionEmoji).emoticon);\n }).filter(Boolean);\n }\n\n return this.unshiftQuickReactionInner(filteredChatAvailableReactions, quickReaction);\n });\n }\n\n private unshiftQuickReactionInner(availableReactions: AvailableReaction[], quickReaction: Reaction | AvailableReaction) {\n if(quickReaction && quickReaction._ !== 'reactionEmoji' && quickReaction._ !== 'availableReaction') return availableReactions;\n const emoticon = (quickReaction as Reaction.reactionEmoji).emoticon || (quickReaction as AvailableReaction).reaction;\n const availableReaction = findAndSplice(availableReactions, (availableReaction) => availableReaction.reaction === emoticon);\n if(availableReaction) {\n availableReactions.unshift(availableReaction);\n }\n\n return availableReactions;\n }\n\n private unshiftQuickReaction(\n availableReactions: AvailableReaction[] | PromiseLike,\n quickReaction: ReturnType = this.getQuickReaction()\n ) {\n return callbackifyAll([\n availableReactions,\n quickReaction\n ], ([availableReactions, quickReaction]) => {\n return this.unshiftQuickReactionInner(availableReactions, quickReaction);\n });\n }\n\n public getAvailableReactionsByMessage(message: Message.message) {\n if(!message) return [];\n const peerId = (message.fwd_from?.channel_post && this.appPeersManager.isMegagroup(message.peerId) && message.fwdFromId) || message.peerId;\n return this.getAvailableReactionsForPeer(peerId);\n }\n\n public isReactionActive(reaction: string) {\n if(!this.availableReactions) return false;\n return !!this.availableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n }\n\n public getQuickReaction() {\n return callbackifyAll([\n this.apiManager.getConfig(),\n this.getAvailableReactions()\n ], ([config, availableReactions]) => {\n const reaction = config.reactions_default;\n if(reaction?._ === 'reactionEmoji') {\n return availableReactions.find((availableReaction) => availableReaction.reaction === reaction.emoticon);\n }\n\n return reaction as Reaction.reactionCustomEmoji;\n });\n }\n\n public getReactionCached(reaction: string) {\n return this.availableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n }\n\n public getReaction(reaction: string) {\n return callbackify(this.getAvailableReactions(), () => {\n return this.getReactionCached(reaction);\n });\n }\n\n public getMessagesReactions(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getMessagesReactions',\n params: {\n id: mids.map((mid) => getServerMessageId(mid)),\n peer: this.appPeersManager.getInputPeerById(peerId)\n },\n processResult: (updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n // const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateMessageReactions') as Update.updateMessageReactions;\n // return update.reactions;\n }\n });\n }\n\n public getMessageReactionsList(peerId: PeerId, mid: number, limit: number, reaction?: Reaction, offset?: string) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getMessageReactionsList',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: getServerMessageId(mid),\n limit,\n reaction,\n offset\n },\n processResult: (messageReactionsList) => {\n this.appUsersManager.saveApiUsers(messageReactionsList.users);\n return messageReactionsList;\n }\n });\n }\n\n public setDefaultReaction(reaction: Reaction) {\n return this.apiManager.invokeApi('messages.setDefaultReaction', {reaction}).then(async(value) => {\n if(value) {\n const appConfig = await this.apiManager.getConfig();\n if(appConfig) {\n appConfig.reactions_default = reaction;\n }/* else { // if no config or loading it - overwrite\n this.apiManager.getAppConfig(true);\n } */\n\n this.rootScope.dispatchEvent('quick_reaction', reaction);\n }\n\n return value;\n });\n }\n\n public async sendReaction(message: Message.message, reaction?: Reaction | AvailableReaction, onlyLocal?: boolean) {\n if(reaction._ === 'availableReaction') {\n reaction = {\n _: 'reactionEmoji',\n emoticon: reaction.reaction\n };\n }\n\n const limit = await this.apiManager.getLimit('reactions');\n\n const lastSendingTimeKey = message.peerId + '_' + message.mid;\n const lastSendingTime = this.lastSendingTimes.get(lastSendingTimeKey);\n if(lastSendingTime) {\n return;\n } else {\n this.lastSendingTimes.set(lastSendingTimeKey, Date.now());\n setTimeout(() => {\n this.lastSendingTimes.delete(lastSendingTimeKey);\n }, 333);\n }\n\n const {peerId, mid} = message;\n const myPeerId = this.appPeersManager.peerId;\n\n const unsetReactionCount = (reactionCount: ReactionCount) => {\n --reactionCount.count;\n delete reactionCount.chosen_order;\n\n if(reactionsEqual(reaction as Reaction, reactionCount.reaction)) {\n reaction = undefined as Reaction;\n }\n\n if(!reactionCount.count) {\n indexOfAndSplice(reactions.results, reactionCount);\n }/* else {\n insertInDescendSortedArray(reactions.results, chosenReaction, 'count', chosenReactionIdx);\n } */\n\n if(reactions.recent_reactions) {\n findAndSplice(reactions.recent_reactions, (recentReaction) => reactionsEqual(recentReaction.reaction, reactionCount.reaction) && this.appPeersManager.getPeerId(recentReaction.peer_id) === myPeerId);\n }\n\n if(!reactions.results.length) {\n reactions = undefined;\n }\n };\n\n const canSeeList = message.reactions?.pFlags?.can_see_list || !this.appPeersManager.isBroadcast(message.peerId) || message.peerId.isUser();\n if(!message.reactions) {\n message.reactions = {\n _: 'messageReactions',\n results: [],\n recent_reactions: canSeeList ? [] : undefined,\n pFlags: {\n can_see_list: canSeeList || undefined\n }\n };\n }\n\n let reactions = onlyLocal ? message.reactions : copy(message.reactions);\n const chosenReactions = reactions.results.filter((reactionCount) => reactionCount.chosen_order !== undefined);\n chosenReactions.sort((a, b) => b.chosen_order - a.chosen_order);\n const unsetReactions: ReactionCount[] = [];\n const chosenReactionIdx = chosenReactions.findIndex((reactionCount) => reactionsEqual(reactionCount.reaction, reaction as Reaction));\n if(chosenReactionIdx !== -1) unsetReactions.push(...chosenReactions.splice(chosenReactionIdx, 1));\n unsetReactions.push(...chosenReactions.splice(limit - +(chosenReactionIdx === -1)));\n unsetReactions.forEach((reactionCount) => {\n chosenReactions.forEach((chosenReactionCount) => {\n if(chosenReactionCount.chosen_order > reactionCount.chosen_order) {\n --chosenReactionCount.chosen_order;\n }\n });\n\n unsetReactionCount(reactionCount);\n });\n\n const chosenReactionsLength = chosenReactions.length;\n chosenReactions.forEach((reactionCount, idx) => {\n reactionCount.chosen_order = chosenReactionsLength - 1 - idx;\n });\n\n if(reaction) {\n if(!reactions) {\n reactions/* = message.reactions */ = {\n _: 'messageReactions',\n results: [],\n pFlags: {}\n };\n\n if(canSeeList) {\n reactions.pFlags.can_see_list = true;\n }\n }\n\n let reactionCountIdx = reactions.results.findIndex((reactionCount) => reactionsEqual(reactionCount.reaction, reaction as Reaction));\n let reactionCount = reactionCountIdx !== -1 && reactions.results[reactionCountIdx];\n if(!reactionCount) {\n reactionCount = {\n _: 'reactionCount',\n count: 0,\n reaction\n };\n\n reactionCountIdx = reactions.results.push(reactionCount) - 1;\n }\n\n ++reactionCount.count;\n reactionCount.chosen_order = chosenReactions.length ? chosenReactions[0].chosen_order + 1 : 0;\n chosenReactions.unshift(reactionCount);\n\n if(!reactions.recent_reactions && canSeeList) {\n reactions.recent_reactions = [];\n }\n\n if(reactions.recent_reactions) {\n const peerReaction: MessagePeerReaction = {\n _: 'messagePeerReaction',\n reaction,\n peer_id: this.appPeersManager.getOutputPeer(myPeerId)\n };\n\n if(!this.appPeersManager.isMegagroup(peerId) && false) {\n reactions.recent_reactions.push(peerReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(-3);\n } else {\n reactions.recent_reactions.unshift(peerReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(0, 3);\n }\n }\n\n // insertInDescendSortedArray(reactions.results, reactionCount, 'count', reactionCountIdx);\n }\n\n const availableReactions = this.availableReactions;\n if(reactions && availableReactions?.length) {\n const indexes: Map = new Map();\n availableReactions.forEach((availableReaction, idx) => {\n indexes.set(availableReaction.reaction, idx);\n });\n\n reactions.results.sort((a, b) => {\n const id1 = (a.reaction as Reaction.reactionCustomEmoji).document_id || (a.reaction as Reaction.reactionEmoji).emoticon;\n const id2 = (b.reaction as Reaction.reactionCustomEmoji).document_id || (b.reaction as Reaction.reactionEmoji).emoticon;\n return (b.count - a.count) || ((indexes.get(id1) ?? 0) - (indexes.get(id2) ?? 0));\n });\n }\n\n if(onlyLocal) {\n message.reactions = reactions;\n this.rootScope.dispatchEvent('messages_reactions', [{message, changedResults: []}]);\n return Promise.resolve();\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: message.peer_id,\n msg_id: message.id,\n reactions: reactions,\n local: true\n });\n\n const promiseKey = [peerId, mid].join('-');\n const msgId = getServerMessageId(mid);\n const promise = this.apiManager.invokeApi('messages.sendReaction', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: msgId,\n reaction: chosenReactions.map((reactionCount) => reactionCount.reaction)\n }).then((updates) => {\n assumeType(updates);\n\n const editMessageUpdateIdx = updates.updates.findIndex((update) => update._ === 'updateEditMessage' || update._ === 'updateEditChannelMessage');\n if(editMessageUpdateIdx !== -1) {\n const editMessageUpdate = updates.updates[editMessageUpdateIdx] as Update.updateEditMessage | Update.updateEditChannelMessage;\n updates.updates[editMessageUpdateIdx] = {\n _: 'updateMessageReactions',\n msg_id: msgId,\n peer: this.appPeersManager.getOutputPeer(peerId),\n reactions: (editMessageUpdate.message as Message.message).reactions,\n pts: editMessageUpdate.pts,\n pts_count: editMessageUpdate.pts_count\n };\n }\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }).catch((err) => {\n if(err.type === 'REACTION_INVALID' && this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReaction(message, chosenReactions[0]?.reaction, true);\n }\n }).finally(() => {\n if(this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReactionPromises.delete(promiseKey);\n }\n });\n\n this.sendReactionPromises.set(promiseKey, promise);\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from './appDocsManager';\nimport type {DownloadOptions} from '../mtproto/apiFileManager';\nimport {Document, InputFileLocation, InputStickerSet, MessagesAllStickers, MessagesFavedStickers, MessagesFeaturedStickers, MessagesFoundStickerSets, MessagesRecentStickers, MessagesStickers, MessagesStickerSet, PhotoSize, StickerPack, StickerSet, StickerSetCovered, Update} from '../../layer';\nimport {Modify} from '../../types';\nimport AppStorage from '../storage';\nimport DATABASE_STATE from '../../config/databases/state';\nimport assumeType from '../../helpers/assumeType';\nimport fixBase64String from '../../helpers/fixBase64String';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport {AppManager} from './manager';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport ctx from '../../environment/ctx';\nimport {getEnvironment} from '../../environment/utils';\nimport getDocumentInput from './utils/docs/getDocumentInput';\nimport getStickerEffectThumb from './utils/stickers/getStickerEffectThumb';\n\nconst CACHE_TIME = 3600e3;\n\ntype LOCAL_STICKER_SET_ID = Extract<\n InputStickerSet['_'],\n 'inputStickerSetAnimatedEmoji' | 'inputStickerSetAnimatedEmojiAnimations' |\n 'inputStickerSetPremiumGifts' | 'inputStickerSetEmojiGenericAnimations' |\n 'inputStickerSetEmojiDefaultStatuses' | 'inputStickerSetEmojiDefaultTopicIcons'\n>;\n\ntype LOCAL_ID = 'EMOJI' | 'EMOJI_ANIMATIONS' | 'PREMIUM_GIFTS' | 'GENERIC_ANIMATIONS' | 'DEFAULT_STATUSES' | 'DEFAULT_TOPIC_ICONS';\n\nconst LOCAL_IDS: {[key in LOCAL_ID]: LOCAL_STICKER_SET_ID} = {\n EMOJI: 'inputStickerSetAnimatedEmoji',\n EMOJI_ANIMATIONS: 'inputStickerSetAnimatedEmojiAnimations',\n PREMIUM_GIFTS: 'inputStickerSetPremiumGifts',\n GENERIC_ANIMATIONS: 'inputStickerSetEmojiGenericAnimations',\n DEFAULT_STATUSES: 'inputStickerSetEmojiDefaultStatuses',\n DEFAULT_TOPIC_ICONS: 'inputStickerSetEmojiDefaultTopicIcons'\n}\n\nconst LOCAL_IDS_SET: Set = new Set(Object.values(LOCAL_IDS) as any);\n\n// let TEST_FILE_REFERENCE_REFRESH = true;\n\nexport type MyStickerSetInput = {\n id: StickerSet.stickerSet['id'],\n access_hash?: StickerSet.stickerSet['access_hash']\n};\n\nexport type MyMessagesStickerSet = MessagesStickerSet.messagesStickerSet;\n\nexport class AppStickersManager extends AppManager {\n private storage = new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'stickerSets');\n\n private getStickerSetPromises: {[setId: Long]: Promise};\n private getStickersByEmoticonsPromises: {[emoticon: string]: Promise};\n\n private greetingStickers: MyDocument[];\n private getGreetingStickersTimeout: number;\n private getGreetingStickersPromise: Promise;\n\n private sounds: Record;\n private getAnimatedEmojiSoundsPromise: Promise;\n\n private favedStickers: MyDocument[];\n private recentStickers: MyDocument[];\n\n private names: Record;\n\n protected after() {\n this.getStickerSetPromises = {};\n this.getStickersByEmoticonsPromises = {};\n this.sounds = {};\n this.names = {};\n\n this.rootScope.addEventListener('user_auth', () => {\n setTimeout(() => {\n this.getAnimatedEmojiStickerSet();\n // this.getFavedStickersStickers();\n }, 1000);\n\n if(!this.getGreetingStickersPromise && this.getGreetingStickersTimeout === undefined) {\n this.getGreetingStickersTimeout = ctx.setTimeout(() => {\n this.getGreetingStickersTimeout = undefined;\n this.getGreetingSticker(true);\n }, 5000);\n }\n });\n\n this.rootScope.addEventListener('app_config', () => this.onStickersUpdated('faved', true));\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateNewStickerSet: (update) => {\n const stickerSet = update.stickerset as MyMessagesStickerSet;\n this.saveStickerSet(stickerSet, stickerSet.set.id);\n this.rootScope.dispatchEvent('stickers_installed', stickerSet.set);\n },\n\n updateRecentStickers: () => this.onStickersUpdated('recent', true),\n\n updateFavedStickers: () => this.onStickersUpdated('faved', true),\n\n updateMoveStickerSetToTop: (update) => {\n this.rootScope.dispatchEvent('stickers_top', update.stickerset);\n }\n });\n }\n\n private async onStickersUpdated(type: 'faved' | 'recent', overwrite: boolean) {\n const stickers = await (type === 'faved' ? this.getFavedStickersStickers(overwrite) : this.getRecentStickersStickers(overwrite));\n this.rootScope.dispatchEvent('stickers_updated', {\n type,\n stickers\n });\n }\n\n public getGreetingSticker(justPreload = false) {\n if(this.getGreetingStickersTimeout) {\n clearTimeout(this.getGreetingStickersTimeout);\n this.getGreetingStickersTimeout = undefined;\n }\n\n if(!this.getGreetingStickersPromise) {\n this.getGreetingStickersPromise = this.getStickersByEmoticon('👋⭐️', false).then((docs) => {\n if(!docs.length) throw 'NO_STICKERS';\n this.greetingStickers = docs.slice() as Document.document[];\n this.greetingStickers.sort((a, b) => Math.random() - Math.random());\n });\n }\n\n return this.getGreetingStickersPromise.then(() => {\n let doc: Document.document;\n if(!justPreload) {\n doc = this.greetingStickers.shift();\n this.greetingStickers.push(doc);\n }\n\n this.apiFileManager.downloadMedia({media: this.greetingStickers[0]}); // preload next sticker\n\n return doc;\n });\n }\n\n private saveStickers(docs: Document[]) {\n forEachReverse(docs, (doc, idx) => {\n doc = this.appDocsManager.saveDoc(doc);\n\n if(!doc) docs.splice(idx, 1);\n else docs[idx] = doc;\n });\n }\n\n private canUseStickerSetCache(set: MyMessagesStickerSet, useCache?: boolean) {\n return set && set.documents?.length && ((Date.now() - set.refreshTime) < CACHE_TIME || useCache);\n }\n\n public getStickerSet(set: MyStickerSetInput, params: Partial<{\n overwrite: boolean,\n useCache: boolean,\n saveById: boolean\n }> = {}): Promise | MyMessagesStickerSet {\n let {id} = set;\n if(!set.access_hash) {\n set = this.names[id] || set;\n id = set.id;\n }\n\n if(this.getStickerSetPromises[id]) {\n return this.getStickerSetPromises[id];\n }\n\n if(!params.overwrite) {\n const cachedSet = this.storage.getFromCache(id);\n if(this.canUseStickerSetCache(cachedSet, params.useCache)) {\n return cachedSet;\n }\n }\n\n const promise = this.getStickerSetPromises[id] = new Promise(async(resolve) => {\n if(!params.overwrite) {\n const cachedSet = await this.storage.get(id);\n if(this.canUseStickerSetCache(cachedSet, params.useCache)) {\n this.saveStickers(cachedSet.documents);\n resolve(cachedSet);\n\n if(this.getStickerSetPromises[id] === promise) {\n delete this.getStickerSetPromises[id];\n }\n\n return;\n }\n }\n\n try {\n const stickerSet = await this.apiManager.invokeApi('messages.getStickerSet', {\n stickerset: this.getStickerSetInput(set),\n hash: 0\n }) as MyMessagesStickerSet;\n\n const saveById = params.saveById ? id : stickerSet.set.id;\n this.saveStickerSet(stickerSet, saveById);\n\n resolve(stickerSet);\n } catch(err) {\n resolve(null);\n }\n\n if(this.getStickerSetPromises[id] === promise) {\n delete this.getStickerSetPromises[id];\n }\n });\n\n return promise;\n }\n\n public getLocalStickerSet(id: LOCAL_STICKER_SET_ID) {\n return this.getStickerSet({id}, {saveById: true});\n }\n\n public getAnimatedEmojiStickerSet() {\n return Promise.all([\n this.getLocalStickerSet(LOCAL_IDS.EMOJI),\n this.getLocalStickerSet(LOCAL_IDS.EMOJI_ANIMATIONS),\n this.getAnimatedEmojiSounds()\n ]).then(([emoji, animations]) => {\n return {emoji, animations};\n });\n }\n\n public getAnimatedEmojiSounds(overwrite?: boolean) {\n if(this.getAnimatedEmojiSoundsPromise && !overwrite) return this.getAnimatedEmojiSoundsPromise;\n const promise = this.getAnimatedEmojiSoundsPromise = Promise.all([\n this.apiManager.getAppConfig(overwrite),\n this.apiManager.getConfig()\n ]).then(([appConfig, config]) => {\n if(this.getAnimatedEmojiSoundsPromise !== promise) {\n return;\n }\n\n for(const emoji in appConfig.emojies_sounds) {\n const sound = appConfig.emojies_sounds[emoji];\n const bytesStr = atob(fixBase64String(sound.file_reference_base64, false));\n const bytes = new Uint8Array(bytesStr.length);\n for(let i = 0, length = bytes.length; i < length; ++i) {\n bytes[i] = bytesStr[i].charCodeAt(0);\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // bytes[0] = bytes[1] = bytes[2] = bytes[3] = bytes[4] = 0;\n // sound.access_hash += '999';\n // }\n\n const doc = this.appDocsManager.saveDoc({\n _: 'document',\n pFlags: {},\n flags: 0,\n id: sound.id,\n access_hash: sound.access_hash,\n attributes: [{\n _: 'documentAttributeAudio',\n duration: 1,\n pFlags: {\n voice: true\n }\n }],\n date: 0,\n dc_id: config.this_dc,\n file_reference: bytes,\n mime_type: 'audio/ogg'\n // size: 101010 // test loading everytime\n }, {\n type: 'emojiesSounds'\n });\n\n this.sounds[emoji] = doc;\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // TEST_FILE_REFERENCE_REFRESH = false;\n // }\n });\n\n return promise;\n }\n\n public async getRecentStickers(overwrite?: boolean): Promise> {\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.getRecentStickers',\n processResult: (res) => {\n assumeType(res);\n\n this.recentStickers = res.stickers as MyDocument[];\n this.saveStickers(res.stickers);\n return res;\n },\n overwrite\n });\n\n return res;\n }\n\n public getRecentStickersStickers(overwrite?: boolean) {\n if(overwrite) this.recentStickers = undefined;\n else if(this.recentStickers) return this.recentStickers;\n return this.getRecentStickers(overwrite).then(() => this.recentStickers);\n }\n\n public saveRecentSticker(docId: DocId, unsave?: boolean, attached?: boolean) {\n const doc = this.appDocsManager.getDoc(docId);\n\n findAndSplice(this.recentStickers, (_doc) => _doc.id === docId);\n if(!unsave) {\n this.recentStickers.unshift(doc);\n\n const docEmoticon = fixEmoji(doc.stickerEmojiRaw);\n for(const emoticon in this.getStickersByEmoticonsPromises) {\n const promise = this.getStickersByEmoticonsPromises[emoticon];\n promise.then((stickers) => {\n const _doc = findAndSplice(stickers, (_doc) => _doc.id === doc.id);\n if(_doc) {\n stickers.unshift(_doc);\n } else if(emoticon.includes(docEmoticon)) {\n stickers.unshift(doc);\n }\n });\n }\n }\n\n this.rootScope.dispatchEvent('sticker_updated', {type: 'recent', faved: !unsave, document: doc});\n\n if(unsave) {\n this.onStickersUpdated('recent', false);\n }\n\n return this.apiManager.invokeApi('messages.saveRecentSticker', {\n id: getDocumentInput(doc),\n unsave,\n attached\n });\n }\n\n private cleanEmoji(emoji: string) {\n return emoji.replace(/\\ufe0f/g, '').replace(/🏻|🏼|🏽|🏾|🏿/g, '');\n }\n\n public getAnimatedEmojiSticker(emoji: string, isAnimation?: boolean) {\n const id = isAnimation ? LOCAL_IDS.EMOJI_ANIMATIONS : LOCAL_IDS.EMOJI;\n const stickerSet = this.storage.getFromCache(id);\n // const stickerSet = await this.getStickerSet({id});\n if(!stickerSet?.documents) return;\n\n if(isAnimation) {\n if(['🧡', '💛', '💚', '💙', '💜', '🖤', '🤍', '🤎'].includes(emoji)) {\n emoji = '❤️';\n }\n }\n\n emoji = this.cleanEmoji(emoji);\n const pack = stickerSet.packs.find((p) => p.emoticon === emoji);\n return pack ? this.appDocsManager.getDoc(pack.documents[0]) : undefined;\n }\n\n public getAnimatedEmojiSoundDocument(emoji: string) {\n return this.sounds[this.cleanEmoji(emoji)];\n }\n\n public preloadAnimatedEmojiSticker(emoji: string) {\n const preloadEmojiPromise = this.getAnimatedEmojiStickerSet().then(() => {\n return this.getAnimatedEmojiSticker(emoji);\n });\n\n return Promise.all([\n preloadEmojiPromise,\n this.preloadAnimatedEmojiStickerAnimation(emoji)\n ]).then(([doc, a]) => {\n return {\n doc: doc,\n animation: a?.doc,\n sound: a?.sound\n };\n });\n }\n\n public preloadAnimatedEmojiStickerAnimation(emoji: string) {\n return this.getAnimatedEmojiStickerSet().then(() => {\n return this.getAnimatedEmojiSticker(emoji, true);\n }).then((doc) => {\n if(!doc) {\n return;\n }\n\n const sound = this.getAnimatedEmojiSoundDocument(emoji);\n return Promise.all([\n this.preloadSticker(doc.id),\n sound ? this.preloadSticker(sound.id) : undefined\n ]).then(() => {\n return {doc, sound};\n });\n });\n }\n\n public preloadSticker(docId: DocId, isPremiumEffect?: boolean) {\n const doc = this.appDocsManager.getDoc(docId);\n return this.apiFileManager.downloadMedia({media: doc, thumb: isPremiumEffect ? doc.video_thumbs?.[0] : undefined});\n }\n\n private saveStickerSet(res: Omit, id: DocId) {\n const newSet: MessagesStickerSet = {\n _: 'messages.stickerSet',\n set: res.set,\n packs: res.packs,\n documents: res.documents as Document[],\n keywords: res.keywords\n };\n\n let stickerSet = this.storage.getFromCache(id);\n if(stickerSet) {\n Object.assign(stickerSet, newSet);\n } else {\n stickerSet = this.storage.setToCache(id, newSet);\n }\n\n if(stickerSet.set.short_name) {\n this.names[stickerSet.set.short_name] = this.getStickerSetInput(newSet.set) as any;\n }\n\n this.saveStickers(res.documents);\n\n // console.log('stickers wrote', this.stickerSets);\n const needSave = stickerSet.set.installed_date || LOCAL_IDS_SET.has(id as any);\n stickerSet.refreshTime = Date.now();\n this.storage.set({[id]: stickerSet}, !needSave);\n }\n\n public getStickerSetThumbDownloadOptions(stickerSet: StickerSet.stickerSet): DownloadOptions {\n const thumb = stickerSet.thumbs.find((thumb) => thumb._ === 'photoSize') as PhotoSize.photoSize;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: InputFileLocation.inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n thumb_version: stickerSet.thumb_version\n };\n\n return {dcId, location: input, size: thumb.size, mimeType: isAnimated ? 'application/x-tgsticker' : 'image/webp'};\n }\n\n /* public getStickerSetThumbURL(stickerSet: MTStickerSet) {\n const thumb = stickerSet.thumb;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n volume_id: thumb.location.volume_id,\n local_id: thumb.location.local_id\n };\n\n const url = getFileURL('document', this.getStickerSetThumbDownloadOptions(stickerSet));\n return url;\n\n //return promise;\n } */\n\n public getStickerSetInput(set: MyStickerSetInput): InputStickerSet {\n if(LOCAL_IDS_SET.has(set.id as any)) {\n return {\n _: set.id as any\n };\n } else if(!set.access_hash) {\n return {\n _: 'inputStickerSetShortName',\n short_name: '' + set.id\n };\n } else {\n return {\n _: 'inputStickerSetID',\n id: set.id,\n access_hash: set.access_hash\n };\n }\n }\n\n public async getFeaturedStickers() {\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.getFeaturedStickers',\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach((covered) => {\n this.saveStickerSet({set: covered.set, documents: [], packs: [], keywords: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n return res.sets;\n }\n\n public getPromoPremiumStickers() {\n return this.getStickersByEmoticon('⭐️⭐️', false);\n }\n\n public getPremiumStickers() {\n return this.getStickersByEmoticon('📂⭐️', false);\n }\n\n public getFavedStickers(overwrite?: boolean) {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getFavedStickers',\n processResult: (favedStickers) => {\n assumeType(favedStickers);\n this.saveStickers(favedStickers.stickers);\n this.favedStickers = favedStickers.stickers as MyDocument[];\n return favedStickers;\n },\n overwrite\n });\n }\n\n public getFavedStickersStickers(overwrite?: boolean) {\n if(overwrite) this.favedStickers = undefined;\n else if(this.favedStickers) return this.favedStickers;\n return this.getFavedStickers(overwrite).then(() => this.favedStickers);\n }\n\n public getFavedStickersLimit() {\n return this.apiManager.getLimit('favedStickers');\n }\n\n public async faveSticker(docId: DocId, unfave?: boolean) {\n if(!this.favedStickers) {\n await this.getFavedStickersStickers();\n }\n\n const limit = await this.getFavedStickersLimit();\n\n const doc = this.appDocsManager.getDoc(docId);\n findAndSplice(this.favedStickers, (_doc) => _doc.id === doc.id);\n\n if(!unfave) {\n this.favedStickers.unshift(doc);\n const spliced = this.favedStickers.splice(limit, this.favedStickers.length - limit);\n }\n\n this.rootScope.dispatchEvent('sticker_updated', {type: 'faved', faved: !unfave, document: doc});\n\n return this.apiManager.invokeApi('messages.faveSticker', {\n id: getDocumentInput(doc),\n unfave\n }).then(() => {\n if(unfave) {\n this.onStickersUpdated('faved', true);\n }\n });\n }\n\n public async toggleStickerSet(set: StickerSet.stickerSet) {\n set = this.storage.getFromCache(set.id).set;\n\n if(set.installed_date) {\n const res = await this.apiManager.invokeApi('messages.uninstallStickerSet', {\n stickerset: this.getStickerSetInput(set)\n });\n\n if(res) {\n delete set.installed_date;\n this.rootScope.dispatchEvent('stickers_deleted', set);\n this.storage.delete(set.id, true);\n return true;\n }\n } else {\n const res = await this.apiManager.invokeApi('messages.installStickerSet', {\n stickerset: this.getStickerSetInput(set),\n archived: false\n });\n\n if(res) {\n set.installed_date = Date.now() / 1000 | 0;\n this.rootScope.dispatchEvent('stickers_installed', set);\n return true;\n }\n }\n\n return false;\n }\n\n public toggleStickerSets(sets: StickerSet.stickerSet[]) {\n return Promise.all(sets.map((set) => this.toggleStickerSet(set)));\n }\n\n public async searchStickerSets(query: string, excludeFeatured = true) {\n const flags = excludeFeatured ? 1 : 0;\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.searchStickerSets',\n params: {\n flags,\n exclude_featured: excludeFeatured || undefined,\n q: query\n },\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach((covered) => {\n this.saveStickerSet({set: covered.set, documents: [], packs: [], keywords: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n const foundSaved: StickerSetCovered[] = [];\n const cache = this.storage.getCache();\n for(const id in cache) {\n const {set} = cache[id];\n\n if(set.title.toLowerCase().includes(query.toLowerCase()) && !res.sets.find((c) => c.set.id === set.id)) {\n foundSaved.push({_: 'stickerSetCovered', set, cover: null});\n }\n }\n\n return res.sets.concat(foundSaved);\n }\n\n private processAllStickersResult = (allStickers: MessagesAllStickers) => {\n assumeType(allStickers);\n\n forEachReverse(allStickers.sets, (stickerSet, idx, arr) => {\n if(stickerSet.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n return allStickers;\n };\n\n public getAllStickers() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getAllStickers',\n processResult: this.processAllStickersResult\n });\n }\n\n public getEmojiStickers() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getEmojiStickers',\n processResult: this.processAllStickersResult\n });\n }\n\n public preloadStickerSets() {\n return this.getAllStickers().then((allStickers) => {\n return Promise.all((allStickers as MessagesAllStickers.messagesAllStickers).sets.map((set) => this.getStickerSet(set, {useCache: true})));\n });\n }\n\n // TODO: detect \"🤷\" by \"🤷‍♂️\"\n public getStickersByEmoticon(emoticon: string, includeOurStickers = true) {\n emoticon = fixEmoji(emoticon);\n if(this.getStickersByEmoticonsPromises[emoticon]) return this.getStickersByEmoticonsPromises[emoticon];\n\n return this.getStickersByEmoticonsPromises[emoticon] = Promise.all([\n this.apiManager.invokeApiHashable({\n method: 'messages.getStickers',\n params: {\n emoticon\n },\n processResult: (stickers) => stickers\n }),\n includeOurStickers ? this.preloadStickerSets() : [],\n includeOurStickers ? this.getRecentStickers() : undefined\n ]).then(([messagesStickers, installedSets, recentStickers]) => {\n const foundStickers = (messagesStickers as MessagesStickers.messagesStickers).stickers.map((sticker) => this.appDocsManager.saveDoc(sticker));\n const cachedStickersAnimated: Document.document[] = [], cachedStickersStatic: Document.document[] = [];\n\n // console.log('getStickersByEmoticon', messagesStickers, installedSets, recentStickers);\n\n const iteratePacks = (packs: StickerPack.stickerPack[]) => {\n for(const pack of packs) {\n const packEmoticon = fixEmoji(pack.emoticon);\n if(packEmoticon.includes(emoticon)) {\n for(const docId of pack.documents) {\n const doc = this.appDocsManager.getDoc(docId);\n (doc.animated ? cachedStickersAnimated : cachedStickersStatic).push(doc);\n }\n }\n }\n };\n\n if(recentStickers) {\n iteratePacks(recentStickers.packs);\n const stickers = recentStickers.stickers;\n [cachedStickersAnimated, cachedStickersStatic].forEach((s) => {\n s.sort((a, b) => stickers.indexOf(a) - stickers.indexOf(b));\n });\n }\n\n for(const set of installedSets) {\n iteratePacks(set.packs);\n }\n\n /* const entities = parseEntities(emoticon);\n if(entities.length === 1) {\n [cachedStickersAnimated, cachedStickersStatic].forEach((s) => {\n forEachReverse(s, (doc, idx) => {\n const docEmoticon = fixEmoji(doc.stickerEmojiRaw);\n if(docEmoticon !== emoticon) {\n s.splice(idx, 1);\n }\n });\n });\n } */\n\n const stickers = [...new Set(cachedStickersAnimated.concat(cachedStickersStatic, foundStickers))]/* .filter((doc) => !doc.animated) */;\n\n forEachReverse(stickers, (sticker, idx, arr) => {\n if((sticker.sticker === 3 && !getEnvironment().IS_WEBM_SUPPORTED) ||\n (!this.rootScope.premium && getStickerEffectThumb(sticker))) {\n arr.splice(idx, 1);\n }\n });\n\n return stickers;\n });\n }\n\n public clearRecentStickers() {\n if(this.recentStickers) {\n this.recentStickers.length = 0;\n this.onStickersUpdated('recent', false);\n }\n\n return this.apiManager.invokeApi('messages.clearRecentStickers');\n }\n}\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport filterUnique from '../../helpers/array/filterUnique';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport cleanSearchText from '../../helpers/cleanSearchText';\nimport cleanUsername from '../../helpers/cleanUsername';\nimport tsNow from '../../helpers/tsNow';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {isRestricted} from '../../helpers/restrictions';\nimport {Chat, ContactsResolvedPeer, InputContact, InputGeoPoint, InputMedia, InputPeer, InputUser, User as MTUser, UserProfilePhoto, UserStatus} from '../../layer';\nimport parseEntities from '../richTextProcessor/parseEntities';\nimport wrapUrl from '../richTextProcessor/wrapUrl';\nimport SearchIndex from '../searchIndex';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\nimport canSendToUser from './utils/users/canSendToUser';\nimport {AppStoragesManager} from './appStoragesManager';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport getPeerActiveUsernames from './utils/peers/getPeerActiveUsernames';\n\nexport type User = MTUser.user;\nexport type TopPeerType = 'correspondents' | 'bots_inline';\nexport type MyTopPeer = {id: PeerId, rating: number};\n\nexport class AppUsersManager extends AppManager {\n private storage: AppStoragesManager['storages']['users'];\n\n private users: {[userId: UserId]: User};\n private usernames: {[username: string]: PeerId};\n private contactsIndex: SearchIndex;\n private contactsFillPromise: CancellablePromise;\n private contactsList: Set;\n private updatedContactsList: boolean;\n\n private getTopPeersPromises: {[type in TopPeerType]?: Promise};\n\n protected after() {\n this.clear(true);\n\n setInterval(this.updateUsersStatuses, 60000);\n\n this.rootScope.addEventListener('state_synchronized', this.updateUsersStatuses);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateUserStatus: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n user.status = update.status;\n if(user.status) {\n if('expires' in user.status) {\n user.status.expires -= this.timeManager.getServerTimeOffset();\n }\n\n if('was_online' in user.status) {\n user.status.was_online -= this.timeManager.getServerTimeOffset();\n }\n }\n\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.rootScope.dispatchEvent('user_update', userId);\n this.setUserToStateIfNeeded(user);\n } // ////else console.warn('No user by id:', userId);\n },\n\n // updateUserPhoto: (update) => {\n // const userId = update.user_id;\n // const user = this.users[userId];\n // if(user) {\n // if((user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id === (update.photo as UserProfilePhoto.userProfilePhoto)?.photo_id) {\n // return;\n // }\n\n // this.forceUserOnline(userId, update.date);\n\n // if(update.photo._ === 'userProfilePhotoEmpty') {\n // delete user.photo;\n // } else {\n // user.photo = safeReplaceObject(user.photo, update.photo);\n // }\n\n // this.setUserToStateIfNeeded(user);\n\n // this.rootScope.dispatchEvent('user_update', userId);\n // this.rootScope.dispatchEvent('avatar_update', userId.toPeerId());\n // } else console.warn('No user by id:', userId);\n // },\n\n updateUserName: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n this.forceUserOnline(userId);\n\n this.saveApiUser({\n ...user,\n first_name: update.first_name,\n last_name: update.last_name,\n username: undefined,\n usernames: update.usernames\n }, true);\n }\n }\n });\n\n /* case 'updateContactLink':\n this.onContactUpdated(update.user_id, update.my_link._ === 'contactLinkContact');\n break; */\n\n this.rootScope.addEventListener('language_change', (e) => {\n const userId = this.getSelf().id;\n this.contactsIndex.indexObject(userId, this.getUserSearchText(userId));\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('users')\n ]).then(([state, {results: users, storage}]) => {\n this.storage = storage;\n\n this.saveApiUsers(users);\n for(let i = 0, length = users.length; i < length; ++i) {\n const user = users[i];\n if(!user) {\n continue;\n }\n\n if(state.contactsListCachedTime && (user.pFlags.contact || user.pFlags.mutual_contact)) {\n this.pushContact(user.id);\n\n if(!this.contactsFillPromise) {\n this.contactsFillPromise = deferredPromise();\n this.contactsFillPromise.resolve(this.contactsList);\n }\n }\n }\n\n // const contactsList = state.contactsList;\n // if(Array.isArray(contactsList)) {\n // contactsList.forEach((userId) => {\n // this.pushContact(userId);\n // });\n\n // if(contactsList.length) {\n // this.contactsFillPromise = deferredPromise();\n // this.contactsFillPromise.resolve(this.contactsList);\n // }\n // }\n\n const recentSearch = state.recentSearch || [];\n for(let i = 0, length = recentSearch.length; i < length; ++i) {\n this.peersStorage.requestPeer(recentSearch[i], 'recentSearch');\n }\n\n this.peersStorage.addEventListener('peerNeeded', (peerId) => {\n if(!this.appPeersManager.isUser(peerId)) {\n return;\n }\n\n const userId = peerId.toUserId();\n if(!this.storage.getFromCache(userId)) {\n this.storage.set({\n [userId]: this.getUser(userId)\n });\n }\n });\n\n this.peersStorage.addEventListener('peerUnneeded', (peerId) => {\n if(!this.appPeersManager.isUser(peerId)) {\n return;\n }\n\n const userId = peerId.toUserId();\n if(this.storage.getFromCache(userId)) {\n this.storage.delete(userId);\n }\n });\n });\n }\n\n public clear = (init = false) => {\n if(!init) {\n for(const userId in this.users) {\n // const userId = +userId;\n if(!userId) continue;\n const peerId = userId.toPeerId();\n if(!this.peersStorage.isPeerNeeded(peerId)) {\n const user = this.users[userId];\n this.modifyUsernamesCache(user, false);\n\n this.storage.delete(userId);\n delete this.users[userId];\n }\n }\n } else {\n this.users = {};\n this.usernames = {};\n }\n\n this.getTopPeersPromises = {};\n this.contactsIndex = this.createSearchIndex();\n this.contactsFillPromise = undefined;\n this.contactsList = new Set();\n this.updatedContactsList = false;\n };\n\n public get userId() {\n return this.rootScope.myId.toUserId();\n }\n\n private onContactsModified(fromServer?: boolean) {\n // const contactsList = [...this.contactsList];\n // this.appStateManager.pushToState('contactsList', contactsList);\n\n if(fromServer) {\n this.appStateManager.pushToState('contactsListCachedTime', tsNow(true));\n }\n }\n\n public pushRecentSearch(peerId: PeerId) {\n return this.appStateManager.getState().then((state) => {\n const recentSearch = state.recentSearch || [];\n if(recentSearch[0] !== peerId) {\n indexOfAndSplice(recentSearch, peerId);\n recentSearch.unshift(peerId);\n if(recentSearch.length > 20) {\n recentSearch.length = 20;\n }\n\n this.appStateManager.pushToState('recentSearch', recentSearch);\n for(const peerId of recentSearch) {\n this.peersStorage.requestPeer(peerId, 'recentSearch');\n }\n }\n });\n }\n\n public clearRecentSearch() {\n return this.appStateManager.getState().then((state) => {\n const recentSearch = state.recentSearch || [];\n for(const peerId of recentSearch) {\n this.peersStorage.releasePeer(peerId, 'recentSearch');\n }\n\n recentSearch.length = 0;\n this.appStateManager.pushToState('recentSearch', recentSearch);\n });\n }\n\n public fillContacts() {\n if(this.contactsFillPromise && this.updatedContactsList) {\n return {\n cached: this.contactsFillPromise.isFulfilled,\n promise: this.contactsFillPromise\n };\n }\n\n this.updatedContactsList = true;\n\n const promise = deferredPromise>();\n this.apiManager.invokeApi('contacts.getContacts').then((result) => {\n if(result._ === 'contacts.contacts') {\n this.contactsList.clear();\n\n this.saveApiUsers(result.users);\n\n result.contacts.forEach((contact) => {\n this.pushContact(contact.user_id);\n });\n\n this.onContactsModified(true);\n\n this.contactsFillPromise = promise;\n }\n\n promise.resolve(this.contactsList);\n }, () => {\n this.updatedContactsList = false;\n });\n\n return {\n cached: this.contactsFillPromise?.isFulfilled,\n promise: this.contactsFillPromise ||= promise\n };\n }\n\n public resolveUsername(username: string): Promise | Chat | User {\n if(username[0] === '@') {\n username = username.slice(1);\n }\n\n username = username.toLowerCase();\n const peerId = this.usernames[username];\n if(peerId) {\n return this.appPeersManager.getPeer(peerId);\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'contacts.resolveUsername',\n params: {username},\n processResult: (resolvedPeer) => this.processResolvedPeer(resolvedPeer)\n });\n }\n\n private processResolvedPeer(resolvedPeer: ContactsResolvedPeer.contactsResolvedPeer) {\n this.saveApiUsers(resolvedPeer.users);\n this.appChatsManager.saveApiChats(resolvedPeer.chats);\n\n return this.appPeersManager.getPeer(getPeerId(resolvedPeer.peer)) as Chat | User;\n }\n\n public resolvePhone(phone: string) {\n return this.apiManager.invokeApi('contacts.resolvePhone', {phone}).then((resolvedPeer) => {\n return this.processResolvedPeer(resolvedPeer) as User;\n });\n }\n\n private pushContact(id: UserId) {\n this.contactsList.add(id);\n this.contactsIndex.indexObject(id, this.getUserSearchText(id));\n this.peersStorage.requestPeer(id.toPeerId(), 'contact');\n }\n\n private popContact(id: UserId) {\n this.contactsList.delete(id);\n this.contactsIndex.indexObject(id, ''); // delete search index\n this.peersStorage.releasePeer(id.toPeerId(), 'contact');\n }\n\n public getUserSearchText(id: UserId) {\n const user = this.users[id];\n if(!user) {\n return '';\n }\n\n const arr: string[] = [\n user.first_name,\n user.last_name,\n user.phone,\n ...getPeerActiveUsernames(user),\n // user.pFlags.self ? I18n.format('SavedMessages', true) : '',\n user.pFlags.self ? 'Saved Messages' : ''\n ];\n\n return arr.filter(Boolean).join(' ');\n }\n\n public getContacts(query?: string, includeSaved = false, sortBy: 'name' | 'online' | 'none' = 'name') {\n return this.fillContacts().promise.then((_contactsList) => {\n let contactsList = [..._contactsList];\n if(query) {\n const results = this.contactsIndex.search(query);\n const filteredContactsList = [...contactsList].filter((id) => results.has(id));\n\n contactsList = filteredContactsList;\n }\n\n if(sortBy === 'name') {\n contactsList.sort((userId1, userId2) => {\n const sortName1 = (this.users[userId1] || {}).sortName || '';\n const sortName2 = (this.users[userId2] || {}).sortName || '';\n return sortName1.localeCompare(sortName2);\n });\n } else if(sortBy === 'online') {\n contactsList.sort((userId1, userId2) => {\n const status1 = this.getUserStatusForSort(this.getUser(userId1).status);\n const status2 = this.getUserStatusForSort(this.getUser(userId2).status);\n return status2 - status1;\n });\n }\n\n const myUserId = this.userId;\n indexOfAndSplice(contactsList, myUserId);\n if(includeSaved) {\n if(this.testSelfSearch(query)) {\n contactsList.unshift(myUserId);\n }\n }\n\n return contactsList;\n });\n }\n\n public getContactsPeerIds(\n query?: Parameters[0],\n includeSaved?: Parameters[1],\n sortBy?: Parameters[2],\n limit?: number\n ) {\n return this.getContacts(query, includeSaved, sortBy).then((userIds) => {\n const peerIds = userIds.map((userId) => userId.toPeerId(false));\n if(limit) {\n return peerIds.slice(0, limit);\n }\n\n return peerIds;\n });\n }\n\n public toggleBlock(peerId: PeerId, block: boolean) {\n return this.apiManager.invokeApiSingle(block ? 'contacts.block' : 'contacts.unblock', {\n id: this.appPeersManager.getInputPeerById(peerId)\n }).then((value) => {\n if(value) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updatePeerBlocked',\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n blocked: block\n });\n }\n\n return value;\n });\n }\n\n public testSelfSearch(query: string) {\n const user = this.getSelf();\n const index = this.createSearchIndex();\n index.indexObject(user.id, this.getUserSearchText(user.id));\n return index.search(query).has(user.id);\n }\n\n private createSearchIndex() {\n return new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n }\n\n public saveApiUsers(apiUsers: MTUser[], override?: boolean) {\n if((apiUsers as any).saved) return;\n (apiUsers as any).saved = true;\n apiUsers.forEach((user) => this.saveApiUser(user, override));\n }\n\n public modifyUsernamesCache(peer: Parameters[0], save: boolean) {\n const usernames = getPeerActiveUsernames(peer);\n if(!usernames.length) {\n return;\n }\n\n const cleanedUsernames = usernames.map((username) => cleanUsername(username));\n if(save) {\n cleanedUsernames.forEach((searchUsername) => {\n this.usernames[searchUsername] = peer.id.toPeerId(peer._ !== 'user');\n });\n } else {\n cleanedUsernames.forEach((searchUsername) => {\n delete this.usernames[searchUsername];\n });\n }\n }\n\n public setUsernameToCache(peer: Parameters[0], oldPeer?: typeof peer) {\n if(\n !oldPeer ||\n (oldPeer as MTUser.user).username !== (peer as MTUser.user).username ||\n !deepEqual((oldPeer as MTUser.user).usernames, (peer as MTUser.user).usernames)\n ) {\n this.modifyUsernamesCache(oldPeer, false);\n this.modifyUsernamesCache(peer, true);\n\n return true;\n }\n\n return false;\n }\n\n public saveApiUser(user: MTUser, override?: boolean) {\n if(!user || user._ === 'userEmpty') return;\n\n const userId = user.id;\n const oldUser = this.users[userId];\n\n // ! commented block can affect performance !\n // if(oldUser && !override) {\n // console.log('saveApiUser same');\n // return;\n // }\n\n user.pFlags ??= {};\n\n if(user.pFlags.min && oldUser !== undefined) {\n return;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(user, ['initials', 'num', 'rFirstName', 'rFullName', 'rPhone', 'sortName', 'sortStatus']);\n\n const changedUsername = this.setUsernameToCache(user, oldUser);\n\n if(!oldUser ||\n oldUser.sortName === undefined ||\n oldUser.first_name !== user.first_name ||\n oldUser.last_name !== user.last_name) {\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n\n user.sortName = user.pFlags.deleted ? '' : cleanSearchText(fullName, false);\n } else {\n user.sortName = oldUser.sortName;\n }\n\n if(user.status) {\n if((user.status as UserStatus.userStatusOnline).expires) {\n (user.status as UserStatus.userStatusOnline).expires -= this.timeManager.getServerTimeOffset();\n }\n\n if((user.status as UserStatus.userStatusOffline).was_online) {\n (user.status as UserStatus.userStatusOffline).was_online -= this.timeManager.getServerTimeOffset();\n }\n }\n\n if((user as User).photo?._ === 'userProfilePhotoEmpty') {\n delete (user as User).photo;\n }\n\n // user.sortStatus = user.pFlags.bot ? -1 : this.getUserStatusForSort(user.status);\n\n // if(!user.username && user.usernames) {\n // user.username = user.usernames.find((username) => username.pFlags.active).username;\n // }\n\n if(oldUser === undefined) {\n this.users[userId] = user;\n } else {\n const changedTitle = user.first_name !== oldUser.first_name ||\n user.last_name !== oldUser.last_name ||\n changedUsername;\n\n const oldPhotoId = (oldUser.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const newPhotoId = (user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const changedPhoto = oldPhotoId !== newPhotoId;\n\n const changedAnyBadge = oldUser.pFlags.premium !== user.pFlags.premium ||\n oldUser.pFlags.verified !== user.pFlags.verified ||\n oldUser.pFlags.scam !== user.pFlags.scam ||\n oldUser.pFlags.fake !== user.pFlags.fake;\n\n /* if(user.pFlags.bot && user.bot_info_version !== oldUser.bot_info_version) {\n\n } */\n\n const wasContact = !!oldUser.pFlags.contact;\n const newContact = !!user.pFlags.contact;\n\n safeReplaceObject(oldUser, user);\n this.rootScope.dispatchEvent('user_update', userId);\n\n if(wasContact !== newContact) {\n this.onContactUpdated(userId, newContact, wasContact);\n }\n\n if(changedPhoto) {\n this.rootScope.dispatchEvent('avatar_update', {peerId: user.id.toPeerId()});\n }\n\n if(changedTitle || changedAnyBadge) {\n this.rootScope.dispatchEvent('peer_title_edit', {peerId: user.id.toPeerId()});\n }\n }\n\n this.checkPremium(user, oldUser);\n this.setUserToStateIfNeeded(user);\n }\n\n private checkPremium(user: User, oldUser: User) {\n if(user.pFlags.self) {\n const isPremium = !!user.pFlags.premium;\n if(this.rootScope.premium !== isPremium) {\n this.rootScope.dispatchEvent('premium_toggle_private', {isNew: !oldUser, isPremium});\n }\n }\n }\n\n private setUserToStateIfNeeded(user: User) {\n if(this.peersStorage.isPeerNeeded(user.id.toPeerId())) {\n this.storage.set({\n [user.id]: user\n });\n }\n }\n\n public isUserOnlineVisible(id: UserId) {\n return this.getUserStatusForSort(id) > 3;\n }\n\n public getUserStatusForSort(status: User['status'] | UserId) {\n if(typeof(status) !== 'object') {\n const user = this.getUser(status);\n status = user?.status;\n }\n\n if(status) {\n const expires = status._ === 'userStatusOnline' ? status.expires : (status._ === 'userStatusOffline' ? status.was_online : 0);\n if(expires) {\n return expires;\n }\n\n /* const timeNow = tsNow(true);\n switch(status._) {\n case 'userStatusRecently':\n return timeNow - 86400 * 3;\n case 'userStatusLastWeek':\n return timeNow - 86400 * 7;\n case 'userStatusLastMonth':\n return timeNow - 86400 * 30;\n } */\n switch(status._) {\n case 'userStatusRecently':\n return 3;\n case 'userStatusLastWeek':\n return 2;\n case 'userStatusLastMonth':\n return 1;\n }\n }\n\n return 0;\n }\n\n public getUser(id: User | UserId) {\n if(isObject(id)) {\n return id;\n }\n\n return this.users[id];\n }\n\n public getUserStatus(id: UserId) {\n return this.isRegularUser(id) && !this.users[id].pFlags.self && this.users[id].status;\n }\n\n public async getUserPhone(id: UserId) {\n const user = this.getUser(id);\n if(!user?.phone) {\n return;\n }\n\n const appConfig = await this.apiManager.getAppConfig();\n return {\n phone: user.phone,\n isAnonymous: appConfig.fragment_prefixes.some((prefix) => user.phone.startsWith(prefix))\n };\n }\n\n public getSelf() {\n return this.getUser(this.userId);\n }\n\n public isBot(id: UserId) {\n return this.users[id] && !!this.users[id].pFlags.bot;\n }\n\n public isAttachMenuBot(id: UserId) {\n return this.isBot(id) && !!this.users[id].pFlags.bot_attach_menu;\n }\n\n public isContact(id: UserId) {\n return this.contactsList.has(id) || !!(this.users[id] && this.users[id].pFlags.contact);\n }\n\n public isRegularUser(id: UserId) {\n const user = this.users[id];\n return user && !this.isBot(id) && !user.pFlags.deleted && !user.pFlags.support;\n }\n\n public isNonContactUser(id: UserId) {\n return this.isRegularUser(id) && !this.isContact(id) && id !== this.userId;\n }\n\n public hasUser(id: UserId, allowMin?: boolean) {\n const user = this.users[id];\n return isObject(user) && (allowMin || !user.pFlags.min);\n }\n\n public getUserString(id: UserId) {\n const user = this.getUser(id);\n return 'u' + id + (user.access_hash ? '_' + user.access_hash : '');\n }\n\n public getUserInput(id: UserId): InputUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputUserSelf'};\n }\n\n return {\n _: 'inputUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getUserInputPeer(id: UserId): InputPeer.inputPeerSelf | InputPeer.inputPeerUser {\n const user = this.getUser(id);\n // ! do not use it, there are places that don't support it. need explicit peer id\n // if(user.pFlags?.self) {\n // return {_: 'inputPeerSelf'};\n // }\n\n return {\n _: 'inputPeerUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getContactMediaInput(id: UserId): InputMedia.inputMediaContact {\n const user = this.getUser(id);\n\n return {\n _: 'inputMediaContact',\n first_name: user.first_name,\n last_name: user.last_name,\n phone_number: user.phone,\n vcard: '',\n user_id: id\n };\n }\n\n private updateUsersStatuses = () => {\n const timestampNow = tsNow(true);\n for(const i in this.users) {\n const user = this.users[i];\n this.updateUserStatus(user, timestampNow);\n }\n };\n\n private updateUserStatus(user: MTUser.user, timestampNow = tsNow(true)) {\n if(user.status &&\n user.status._ === 'userStatusOnline' &&\n user.status.expires < timestampNow) {\n user.status = {_: 'userStatusOffline', was_online: user.status.expires};\n this.rootScope.dispatchEvent('user_update', user.id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public forceUserOnline(id: UserId, eventTimestamp?: number) {\n if(this.isBot(id)) {\n return;\n }\n\n const timestamp = tsNow(true);\n const onlineTimeFor = 60;\n if(eventTimestamp) {\n if((timestamp - eventTimestamp) >= onlineTimeFor) {\n return;\n }\n } else if(this.apiUpdatesManager.updatesState.syncLoading) {\n return;\n }\n\n const user = this.getUser(id);\n if(user?.status &&\n user.status._ !== 'userStatusOnline' &&\n user.status._ !== 'userStatusEmpty' &&\n !user.pFlags.support &&\n !user.pFlags.deleted) {\n user.status = {\n _: 'userStatusOnline',\n expires: timestamp + onlineTimeFor\n };\n\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.rootScope.dispatchEvent('user_update', id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public importContact(first_name: string, last_name: string, phone: string) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]).then((userIds) => {\n if(!userIds.length) {\n const error = new Error();\n (error as any).type = 'NO_USER';\n throw error;\n }\n\n return userIds[0];\n });\n }\n\n public importContacts(contacts: {phones: string[], first_name: string, last_name: string}[]) {\n const inputContacts: InputContact[] = [];\n\n for(let i = 0; i < contacts.length; ++i) {\n for(let j = 0; j < contacts[i].phones.length; ++j) {\n inputContacts.push({\n _: 'inputPhoneContact',\n client_id: (i << 16 | j).toString(10),\n phone: contacts[i].phones[j],\n first_name: contacts[i].first_name,\n last_name: contacts[i].last_name\n });\n }\n }\n\n return this.apiManager.invokeApi('contacts.importContacts', {\n contacts: inputContacts\n }).then((importedContactsResult) => {\n this.saveApiUsers(importedContactsResult.users);\n\n const userIds = importedContactsResult.imported.map((importedContact) => {\n this.onContactUpdated(importedContact.user_id, true);\n return importedContact.user_id;\n });\n\n return userIds;\n });\n }\n\n public getTopPeers(type: TopPeerType) {\n if(this.getTopPeersPromises[type]) return this.getTopPeersPromises[type];\n\n return this.getTopPeersPromises[type] = this.appStateManager.getState().then((state) => {\n const cached = state.topPeersCache[type];\n if(cached && (cached.cachedTime + 86400e3) > Date.now() && cached.peers) {\n return cached.peers;\n }\n\n return this.apiManager.invokeApi('contacts.getTopPeers', {\n [type]: true,\n offset: 0,\n limit: 15,\n hash: '0'\n }).then((result) => {\n let topPeers: MyTopPeer[] = [];\n if(result._ === 'contacts.topPeers') {\n // console.log(result);\n this.saveApiUsers(result.users);\n this.appChatsManager.saveApiChats(result.chats);\n\n if(result.categories.length) {\n topPeers = result.categories[0].peers.map((topPeer) => {\n const peerId = getPeerId(topPeer.peer);\n this.peersStorage.requestPeer(peerId, 'topPeer');\n return {id: peerId, rating: topPeer.rating};\n });\n }\n }\n\n state.topPeersCache[type] = {\n peers: topPeers,\n cachedTime: Date.now()\n };\n this.appStateManager.pushToState('topPeersCache', state.topPeersCache);\n\n return topPeers;\n });\n });\n }\n\n public getBlocked(offset = 0, limit = 0) {\n return this.apiManager.invokeApiSingle('contacts.getBlocked', {offset, limit}).then((contactsBlocked) => {\n this.saveApiUsers(contactsBlocked.users);\n this.appChatsManager.saveApiChats(contactsBlocked.chats);\n const count = contactsBlocked._ === 'contacts.blocked' ? contactsBlocked.users.length + contactsBlocked.chats.length : contactsBlocked.count;\n\n const peerIds: PeerId[] = contactsBlocked.users.map((u) => u.id.toPeerId()).concat(contactsBlocked.chats.map((c) => c.id.toPeerId(true)));\n\n return {count, peerIds};\n });\n }\n\n public getLocated(\n lat: number,\n long: number,\n accuracy_radius: number,\n background: boolean = false,\n self_expires: number = 0\n ) {\n const geo_point: InputGeoPoint = {\n _: 'inputGeoPoint',\n lat,\n long,\n accuracy_radius\n };\n\n return this.apiManager.invokeApi('contacts.getLocated', {\n geo_point,\n background\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n return updates;\n });\n }\n\n /* public searchContacts(query: string, limit = 20) {\n return Promise.all([\n this.getContacts(query),\n apiManager.invokeApi('contacts.search', {\n q: query,\n limit\n })\n ]).then((results) => {\n const [myContacts, peers] = results;\n\n this.saveApiUsers(peers.users);\n appChatsManager.saveApiChats(peers.chats);\n\n // * contacts.search returns duplicates in my_results\n const myResults = new Set(myContacts.concat(peers.my_results.map((p) => appPeersManager.getPeerID(p))));\n\n const out = {\n my_results: [...myResults].slice(0, limit),\n results: peers.results.map((p) => appPeersManager.getPeerID(p))\n };\n\n return out;\n });\n } */\n public searchContacts(query: string, limit = 20) {\n // handle 't.me/username' as 'username'\n const entities = parseEntities(query);\n if(entities.length && entities[0].length === query.trim().length && entities[0]._ === 'messageEntityUrl') {\n try {\n const url = new URL(wrapUrl(query).url);\n const path = url.pathname.slice(1);\n if(path) {\n query = path;\n }\n } catch(err) {}\n }\n\n return this.apiManager.invokeApiCacheable('contacts.search', {\n q: query,\n limit\n }, {cacheSeconds: 60}).then((peers) => {\n this.saveApiUsers(peers.users);\n this.appChatsManager.saveApiChats(peers.chats);\n\n const out = {\n my_results: filterUnique(peers.my_results.map((p) => getPeerId(p))), // ! contacts.search returns duplicates in my_results\n results: peers.results.map((p) => getPeerId(p))\n };\n\n return out;\n });\n }\n\n private onContactUpdated(userId: UserId, isContact: boolean, curIsContact = this.isContact(userId)) {\n if(isContact !== curIsContact) {\n if(isContact) {\n this.pushContact(userId);\n } else {\n this.popContact(userId);\n }\n\n this.onContactsModified();\n\n this.rootScope.dispatchEvent('contacts_update', userId);\n }\n }\n\n public updateUsername(username: string) {\n return this.apiManager.invokeApi('account.updateUsername', {\n username\n }).then((user) => {\n this.saveApiUser(user);\n });\n }\n\n public setUserStatus(userId: UserId, offline: boolean) {\n if(this.isBot(userId)) {\n return;\n }\n\n const user = this.users[userId];\n if(user) {\n const status: UserStatus = offline ? {\n _: 'userStatusOffline',\n was_online: tsNow(true)\n } : {\n _: 'userStatusOnline',\n expires: tsNow(true) + 50\n };\n\n user.status = status;\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.rootScope.dispatchEvent('user_update', userId);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public updateMyOnlineStatus(offline: boolean) {\n this.setUserStatus(this.getSelf().id, offline);\n return this.apiManager.invokeApiSingle('account.updateStatus', {offline});\n }\n\n public addContact(userId: UserId, first_name: string, last_name: string, phone: string, addPhonePrivacyException?: boolean) {\n /* if(!userId) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]);\n } */\n\n return this.apiManager.invokeApi('contacts.addContact', {\n id: this.getUserInput(userId),\n first_name,\n last_name,\n phone,\n add_phone_privacy_exception: addPhonePrivacyException\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n this.onContactUpdated(userId, true);\n });\n }\n\n public deleteContacts(userIds: UserId[]) {\n return this.apiManager.invokeApi('contacts.deleteContacts', {\n id: userIds.map((userId) => this.getUserInput(userId))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n userIds.forEach((userId) => {\n this.onContactUpdated(userId, false);\n });\n });\n }\n\n public checkUsername(username: string) {\n return this.apiManager.invokeApi('account.checkUsername', {username});\n }\n\n public toggleUsername(username: string, active: boolean) {\n return this.apiManager.invokeApi('account.toggleUsername', {username, active});\n }\n\n public reorderUsernames(usernames: string[]) {\n return this.apiManager.invokeApi('account.reorderUsernames', {order: usernames});\n }\n\n public canSendToUser(userId: UserId) {\n return canSendToUser(this.getUser(userId));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport default function cleanUsername(username: string) {\n return username && username.toLowerCase() || '';\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {WebPage} from '../../layer';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {AppManager} from './manager';\n\nconst photoTypeSet = new Set(['photo', 'video', 'gif', 'document']);\n\ntype WebPageMessageKey = `${PeerId}_${number}`;\n\nexport class AppWebPagesManager extends AppManager {\n private webpages: {\n [webPageId: string]: WebPage\n } = {};\n private pendingWebPages: {\n [webPageId: string]: Set\n } = {};\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateWebPage: (update) => {\n this.saveWebPage(update.webpage);\n }\n });\n }\n\n public saveWebPage(apiWebPage: WebPage, messageKey?: WebPageMessageKey, mediaContext?: ReferenceContext) {\n if(apiWebPage._ === 'webPageNotModified' || apiWebPage._ === 'webPageEmpty') return;\n const {id} = apiWebPage;\n\n const oldWebPage = this.webpages[id];\n const isUpdated = oldWebPage &&\n oldWebPage._ === apiWebPage._ &&\n (oldWebPage as WebPage.webPage).hash === (oldWebPage as WebPage.webPage).hash;\n\n if(apiWebPage._ === 'webPage') {\n if(apiWebPage.photo?._ === 'photo') {\n apiWebPage.photo = this.appPhotosManager.savePhoto(apiWebPage.photo, mediaContext);\n } else {\n delete apiWebPage.photo;\n }\n\n if(apiWebPage.document?._ === 'document') {\n apiWebPage.document = this.appDocsManager.saveDoc(apiWebPage.document, mediaContext);\n } else {\n if(apiWebPage.type === 'document') {\n delete apiWebPage.type;\n }\n\n delete apiWebPage.document;\n }\n\n const siteName = apiWebPage.site_name;\n const shortTitle = apiWebPage.title || apiWebPage.author || siteName || '';\n if(siteName && shortTitle === siteName) {\n delete apiWebPage.site_name;\n }\n\n // delete apiWebPage.description\n\n if(!photoTypeSet.has(apiWebPage.type) &&\n !apiWebPage.description &&\n apiWebPage.photo) {\n apiWebPage.type = 'photo';\n }\n }\n\n let pendingSet = this.pendingWebPages[id];\n if(messageKey) {\n if(!pendingSet) pendingSet = this.pendingWebPages[id] = new Set();\n pendingSet.add(messageKey);\n }\n\n if(oldWebPage === undefined) {\n this.webpages[id] = apiWebPage;\n } else {\n safeReplaceObject(oldWebPage, apiWebPage);\n }\n\n if(!messageKey && pendingSet !== undefined && isUpdated) {\n const msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[] = [];\n pendingSet.forEach((value) => {\n const [peerId, mid, isScheduled] = value.split('_');\n msgs.push({\n peerId: peerId.toPeerId(),\n mid: +mid,\n isScheduled: !!isScheduled\n });\n });\n\n this.rootScope.dispatchEvent('webpage_updated', {\n id,\n msgs\n });\n }\n\n return apiWebPage;\n }\n\n public getMessageKeyForPendingWebPage(peerId: PeerId, mid: number, isScheduled?: boolean): WebPageMessageKey {\n return peerId + '_' + mid + (isScheduled ? '_s' : '') as any;\n }\n\n public deleteWebPageFromPending(webPage: WebPage, messageKey: WebPageMessageKey) {\n const id = (webPage as WebPage.webPage).id;\n if(!id) return;\n\n const set = this.pendingWebPages[id];\n if(set && set.has(messageKey)) {\n set.delete(messageKey);\n\n if(!set.size) {\n delete this.pendingWebPages[id];\n }\n }\n }\n\n public getCachedWebPage(id: WebPage.webPage['id']) {\n return this.webpages[id];\n }\n\n public getWebPage(url: string) {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getWebPage',\n processResult: (webPage) => {\n return this.saveWebPage(webPage);\n },\n params: {\n url\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\n","export default function fileNameRFC(fileName: string) {\n // Make filename RFC5987 compatible\n return encodeURIComponent(fileName).replace(/['()]/g, escape).replace(/\\*/g, '%2A');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getServiceMessagePort} from '../mtproto/mtproto.worker';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport StreamWriter from './streamWriter';\n\nexport default class DownloadWriter implements StreamWriter {\n constructor(\n private serviceMessagePort: ServiceMessagePort,\n private downloadId: string\n ) {\n this.serviceMessagePort = getServiceMessagePort();\n }\n\n public async write(part: Uint8Array, offset?: number) {\n return this.serviceMessagePort.invoke('downloadChunk', {\n id: this.downloadId,\n chunk: part\n });\n }\n\n public finalize(saveToStorage?: boolean): Promise {\n return this.serviceMessagePort.invoke('downloadFinalize', this.downloadId).then(() => undefined);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport makeError from '../../helpers/makeError';\nimport fileNameRFC from '../../helpers/string/fileNameRFC';\nimport {getServiceMessagePort} from '../mtproto/mtproto.worker';\nimport DownloadWriter from './downloadWriter';\nimport FileStorage from './fileStorage';\n\nexport default class DownloadStorage implements FileStorage {\n public getFile(fileName: string): Promise {\n return Promise.reject(makeError('NO_ENTRY_FOUND'));\n }\n\n public prepareWriting({fileName, downloadId, size}: {\n fileName: string,\n downloadId: string,\n size: number\n }) {\n const headers = {\n 'Content-Type': 'application/octet-stream; charset=utf-8',\n 'Content-Disposition': 'attachment; filename*=UTF-8\\'\\'' + fileNameRFC(fileName),\n ...(size ? {'Content-Length': size} : {})\n };\n\n const serviceMessagePort = getServiceMessagePort();\n const promise = serviceMessagePort.invoke('download', {\n headers,\n id: downloadId\n });\n\n const deferred = deferredPromise();\n deferred.cancel = () => {\n deferred.reject(makeError('DOWNLOAD_CANCELED'));\n };\n\n deferred.catch(() => {\n getServiceMessagePort().invoke('downloadCancel', downloadId);\n });\n\n promise.then(deferred.resolve, deferred.reject);\n\n return {\n deferred,\n getWriter: () => {\n return new DownloadWriter(serviceMessagePort, downloadId);\n }\n };\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {ReferenceBytes} from './referenceDatabase';\nimport Modes from '../../config/modes';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {randomLong} from '../../helpers/random';\nimport {Document, InputFile, InputFileLocation, InputWebFileLocation, Photo, PhotoSize, UploadFile, UploadWebFile, VideoSize, WebDocument} from '../../layer';\nimport {DcId} from '../../types';\nimport CacheStorageController from '../files/cacheStorage';\nimport {logger, LogTypes} from '../logger';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport readBlobAsArrayBuffer from '../../helpers/blob/readBlobAsArrayBuffer';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport fixFirefoxSvg from '../../helpers/fixFirefoxSvg';\nimport {AppManager} from '../appManagers/manager';\nimport {getEnvironment} from '../../environment/utils';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport type {Progress} from '../appManagers/appDownloadManager';\nimport getDownloadMediaDetails from '../appManagers/utils/download/getDownloadMediaDetails';\n// import networkStats from './networkStats';\nimport getDownloadFileNameFromOptions from '../appManagers/utils/download/getDownloadFileNameFromOptions';\nimport StreamWriter from '../files/streamWriter';\nimport FileStorage from '../files/fileStorage';\nimport {MAX_FILE_SAVE_SIZE} from './mtproto_config';\nimport throttle from '../../helpers/schedulers/throttle';\nimport makeError from '../../helpers/makeError';\nimport readBlobAsUint8Array from '../../helpers/blob/readBlobAsUint8Array';\nimport DownloadStorage from '../files/downloadStorage';\nimport copy from '../../helpers/object/copy';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {MIME_TYPE_EXTENSION_MAP} from '../../environment/mimeTypeMap';\nimport {getServiceMessagePort} from './mtproto.worker';\n\ntype Delayed = {\n offset: number,\n writePromise: CancellablePromise,\n writeDeferred: CancellablePromise\n};\n\nexport type DownloadOptions = {\n dcId: DcId,\n location: InputFileLocation | InputWebFileLocation,\n size?: number,\n fileName?: string,\n mimeType?: MTMimeType,\n limitPart?: number,\n queueId?: number,\n onlyCache?: boolean,\n downloadId?: string\n // getFileMethod: Parameters[1]\n};\n\nexport type DownloadMediaOptions = {\n media: Photo.photo | Document.document | WebDocument,\n thumb?: PhotoSize | VideoSize,\n queueId?: number,\n onlyCache?: boolean,\n downloadId?: string\n};\n\ntype DownloadPromise = CancellablePromise;\n\nexport type MyUploadFile = UploadFile.uploadFile | UploadWebFile.uploadWebFile;\n\n// export interface RefreshReferenceTask extends WorkerTaskVoidTemplate {\n// type: 'refreshReference',\n// payload: ReferenceBytes,\n// };\n\n// export interface RefreshReferenceTaskResponse extends WorkerTaskVoidTemplate {\n// type: 'refreshReference',\n// payload: ReferenceBytes,\n// originalPayload: ReferenceBytes\n// };\n\nconst MAX_DOWNLOAD_FILE_PART_SIZE = 1 * 1024 * 1024;\nconst MAX_UPLOAD_FILE_PART_SIZE = 512 * 1024;\nconst MIN_PART_SIZE = 128 * 1024;\nconst AVG_PART_SIZE = 512 * 1024;\n\nconst REGULAR_DOWNLOAD_DELTA = (9 * 512 * 1024) / MIN_PART_SIZE;\n// const PREMIUM_DOWNLOAD_DELTA = REGULAR_DOWNLOAD_DELTA * 2;\nconst PREMIUM_DOWNLOAD_DELTA = (56 * 512 * 1024) / MIN_PART_SIZE;\n\nconst IGNORE_ERRORS: Set = new Set([\n 'DOWNLOAD_CANCELED',\n 'UPLOAD_CANCELED',\n 'UNKNOWN',\n 'NO_NEW_CONTEXT'\n]);\n\nexport class ApiFileManager extends AppManager {\n private cacheStorage = new CacheStorageController('cachedFiles');\n private downloadStorage = new DownloadStorage();\n\n private downloadPromises: {\n [fileName: string]: DownloadPromise\n } = {};\n\n // private downloadToDiscPromises: {\n // [fileName: string]: DownloadPromise\n // } = {};\n\n private uploadPromises: {\n [fileName: string]: CancellablePromise\n } = {};\n\n private downloadPulls: {\n [dcId: string]: Array<{\n id: number,\n queueId: number,\n cb: () => Promise,\n deferred: {\n resolve: (...args: any[]) => void,\n reject: (...args: any[]) => void\n },\n activeDelta: number\n }>\n } = {};\n private downloadActives: {[dcId: string]: number} = {};\n\n public refreshReferencePromises: {\n [referenceHex: string]: {\n deferred: CancellablePromise,\n timeout?: number\n }\n } = {};\n\n private log: ReturnType = logger('AFM', LogTypes.Error | LogTypes.Log);\n private tempId = 0;\n private queueId = 0;\n private debug = Modes.debug;\n\n private maxUploadParts = 4000;\n private maxDownloadParts = 8000;\n private webFileDcId: DcId;\n\n protected after() {\n setInterval(() => { // clear old promises\n for(const hex in this.refreshReferencePromises) {\n const {deferred} = this.refreshReferencePromises[hex];\n if(deferred.isFulfilled || deferred.isRejected) {\n delete this.refreshReferencePromises[hex];\n }\n }\n }, 1800e3);\n\n this.rootScope.addEventListener('config', (config) => {\n this.webFileDcId = config.webfile_dc_id;\n });\n\n this.rootScope.addEventListener('app_config', (appConfig) => {\n this.maxUploadParts = this.rootScope.premium ? appConfig.upload_max_fileparts_premium : appConfig.upload_max_fileparts_default;\n this.maxDownloadParts = appConfig.upload_max_fileparts_premium;\n });\n }\n\n private downloadRequest(dcId: 'upload', id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\n private downloadRequest(dcId: number, id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\n private downloadRequest(dcId: number | string, id: number, cb: () => Promise, activeDelta: number, queueId: number = 0) {\n if(this.downloadPulls[dcId] === undefined) {\n this.downloadPulls[dcId] = [];\n this.downloadActives[dcId] = 0;\n }\n\n const downloadPull = this.downloadPulls[dcId];\n\n const promise = new Promise((resolve, reject) => {\n downloadPull.push({id, queueId, cb, deferred: {resolve, reject}, activeDelta});\n });\n\n setTimeout(() => {\n this.downloadCheck(dcId);\n }, 0);\n\n return promise;\n }\n\n private downloadCheck(dcId: string | number) {\n const downloadPull = this.downloadPulls[dcId];\n const downloadLimit = /* dcId === 'upload' ? 24 : */(this.rootScope.premium ? PREMIUM_DOWNLOAD_DELTA : REGULAR_DOWNLOAD_DELTA);\n // const downloadLimit = Infinity;\n\n if(this.downloadActives[dcId] >= downloadLimit || !downloadPull?.length) {\n return false;\n }\n\n // const data = downloadPull.shift();\n const data = findAndSplice(downloadPull, (d) => d.queueId === 0) || findAndSplice(downloadPull, (d) => d.queueId === this.queueId) || downloadPull.shift();\n const activeDelta = data.activeDelta || 1;\n\n this.downloadActives[dcId] += activeDelta;\n\n const promise = data.cb();\n // const networkPromise = networkStats.waitForChunk(dcId as DcId, activeDelta * MIN_PART_SIZE);\n /* Promise.race([\n promise\n // networkPromise\n ]) */promise.then(() => {\n this.downloadActives[dcId] -= activeDelta;\n this.downloadCheck(dcId);\n\n // networkPromise.resolve();\n }, (error: ApiError) => {\n if(!error?.type || !IGNORE_ERRORS.has(error.type)) {\n this.log.error('downloadCheck error:', error);\n }\n\n this.downloadActives[dcId] -= activeDelta;\n this.downloadCheck(dcId);\n\n // networkPromise.reject(error);\n }).finally(() => {\n promise.then(data.deferred.resolve, data.deferred.reject);\n });\n }\n\n public setQueueId(queueId: number) {\n // this.log.error('setQueueId', queueId);\n this.queueId = queueId;\n }\n\n private getFileStorage() {\n return this.cacheStorage;\n }\n\n public cancelDownload(fileName: string) {\n const promises = [this.downloadPromises[fileName], this.uploadPromises[fileName]].filter(Boolean);\n let canceled = false;\n for(let i = 0, length = promises.length; i < length; ++i) {\n const promise = promises[i];\n if(promise && !promise.isRejected && !promise.isFulfilled) {\n promise.cancel();\n canceled = true;\n }\n }\n\n return canceled;\n }\n\n public requestWebFilePart(dcId: DcId, location: InputWebFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\n checkCancel?.();\n\n return this.apiManager.invokeApi('upload.getWebFile', {\n location,\n offset,\n limit\n }, {\n dcId,\n fileDownload: true\n });\n }, this.getDelta(limit), queueId);\n }\n\n public requestFilePart(\n dcId: DcId,\n location: InputFileLocation,\n offset: number,\n limit: number,\n id = 0,\n queueId = 0,\n checkCancel?: () => void\n ) {\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\n checkCancel?.();\n\n const invoke = async(): Promise => {\n checkCancel?.(); // do not remove async, because checkCancel will throw an error\n\n // * IMPORTANT: reference can be changed in previous request\n const reference = (location as InputFileLocation.inputDocumentFileLocation).file_reference?.slice();\n\n const promise = // pause(offset > (100 * 1024 * 1024) ? 10000000 : 0).then(() =>\n this.apiManager.invokeApi('upload.getFile', {\n location,\n offset,\n limit\n }, {\n dcId,\n fileDownload: true\n }) as Promise/* ) */;\n\n return promise.catch((err: ApiError) => {\n checkCancel?.();\n\n if(err.type === 'FILE_REFERENCE_EXPIRED') {\n return this.refreshReference(location as InputFileLocation.inputDocumentFileLocation, reference).then(invoke);\n }\n\n throw err;\n });\n };\n\n assumeType(location);\n const reference = location.file_reference;\n if(reference && !location.checkedReference) { // check stream's location because it's new every call\n location.checkedReference = true;\n const hex = bytesToHex(reference);\n if(this.refreshReferencePromises[hex]) {\n return this.refreshReference(location, reference).then(invoke);\n }\n }\n\n return invoke();\n }, this.getDelta(limit), queueId);\n }\n\n /* private convertBlobToBytes(blob: Blob) {\n return blob.arrayBuffer().then((buffer) => new Uint8Array(buffer));\n } */\n\n private getDelta(bytes: number) {\n return bytes / MIN_PART_SIZE;\n }\n\n private getLimitPart(size: number, isUpload: boolean): number {\n if(!size) { // * sometimes size can be 0 (e.g. avatars, webDocuments)\n return AVG_PART_SIZE;\n }\n\n // return 1 * 1024 * 1024;\n\n let bytes = MIN_PART_SIZE;\n\n const maxParts = isUpload ? this.maxUploadParts : this.maxDownloadParts;\n const maxPartSize = isUpload ? MAX_UPLOAD_FILE_PART_SIZE : MAX_DOWNLOAD_FILE_PART_SIZE;\n // usually it will stick to 512Kb size if the file is too big\n while((size / bytes) > maxParts && bytes < maxPartSize) {\n bytes *= 2;\n }\n /* if(size < 1e6 || !size) bytes = 512;\n else if(size < 3e6) bytes = 256;\n else bytes = 128; */\n\n return bytes;\n }\n\n private uncompressTGS = (bytes: Uint8Array, fileName: string) => {\n // this.log('uncompressTGS', bytes, bytes.slice().buffer);\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\n return this.cryptoWorker.invokeCrypto('gzipUncompress', bytes.slice().buffer, false) as Promise;\n };\n\n private uncompressTGV = (bytes: Uint8Array, fileName: string) => {\n // this.log('uncompressTGS', bytes, bytes.slice().buffer);\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\n const buffer = bytes.slice().buffer;\n if(getEnvironment().IS_FIREFOX) {\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, true).then((text) => {\n return fixFirefoxSvg(text as string);\n }).then((text) => {\n const textEncoder = new TextEncoder();\n return textEncoder.encode(text);\n });\n }\n\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, false) as Promise;\n };\n\n private convertWebp = (bytes: Uint8Array, fileName: string) => {\n const instance = MTProtoMessagePort.getInstance();\n return instance.invoke('convertWebp', {fileName, bytes});\n };\n\n private convertOpus = (bytes: Uint8Array, fileName: string) => {\n const instance = MTProtoMessagePort.getInstance();\n return instance.invoke('convertOpus', {fileName, bytes});\n };\n\n private refreshReference(\n inputFileLocation: InputFileLocation.inputDocumentFileLocation,\n reference: typeof inputFileLocation['file_reference'],\n hex = bytesToHex(reference)\n ) {\n let r = this.refreshReferencePromises[hex];\n if(!r) {\n const deferred = deferredPromise();\n\n r = this.refreshReferencePromises[hex] = {\n deferred\n\n // ! I don't remember what it was for...\n // timeout: ctx.setTimeout(() => {\n // this.log.error('Didn\\'t refresh the reference:', inputFileLocation);\n // deferred.reject(makeError('REFERENCE_IS_NOT_REFRESHED'));\n // }, 60000)\n };\n\n // deferred.catch(noop).finally(() => {\n // clearTimeout(r.timeout);\n // });\n\n this.referenceDatabase.refreshReference(reference).then((reference) => {\n if(hex === bytesToHex(reference)) {\n deferred.reject(makeError('REFERENCE_IS_NOT_REFRESHED'));\n }\n\n deferred.resolve(reference);\n }, deferred.reject);\n }\n\n // have to replace file_reference in any way, because location can be different everytime if it's stream\n return r.deferred.then((reference) => {\n inputFileLocation.file_reference = reference;\n });\n }\n\n public isDownloading(fileName: string) {\n return !!this.downloadPromises[fileName];\n }\n\n public getDownload(fileName: string) {\n return this.downloadPromises[fileName];\n }\n\n public getUpload(fileName: string) {\n return this.uploadPromises[fileName];\n }\n\n private getConvertMethod(mimeType: MTMimeType) {\n let process: ApiFileManager['uncompressTGS'] | ApiFileManager['convertWebp'];\n if(mimeType === 'application/x-tgwallpattern') {\n process = this.uncompressTGV;\n mimeType = 'image/svg+xml';\n } else if(mimeType === 'image/webp' && !getEnvironment().IS_WEBP_SUPPORTED) {\n process = this.convertWebp;\n mimeType = 'image/png';\n } else if(mimeType === 'application/x-tgsticker') {\n process = this.uncompressTGS;\n mimeType = 'application/json';\n } else if(mimeType === 'audio/ogg' && !getEnvironment().IS_OPUS_SUPPORTED) {\n process = this.convertOpus;\n mimeType = 'audio/wav';\n }\n\n return {mimeType, process};\n }\n\n private allocateDeferredPromises(startOffset: number, size: number, limitPart: number) {\n const delayed: Delayed[] = [];\n let offset = startOffset;\n let writePromise: CancellablePromise = Promise.resolve(),\n writeDeferred: CancellablePromise;\n do {\n writeDeferred = deferredPromise();\n delayed.push({offset, writePromise, writeDeferred});\n writePromise = writeDeferred;\n offset += limitPart;\n } while(offset < size);\n\n return delayed;\n }\n\n public download(options: DownloadOptions): DownloadPromise {\n const size = options.size ?? 0;\n const {dcId, location} = options;\n let {downloadId} = options;\n if(downloadId && !getServiceMessagePort()) {\n this.log.error('download fallback to blob', options);\n downloadId = undefined;\n }\n\n const originalMimeType = options.mimeType;\n const convertMethod = this.getConvertMethod(originalMimeType);\n const {process} = convertMethod;\n options.mimeType = convertMethod.mimeType || 'image/jpeg';\n\n const fileName = getDownloadFileNameFromOptions(options);\n const cacheFileName = downloadId ? getDownloadFileNameFromOptions({...copy(options), downloadId: undefined}) : fileName;\n const cacheStorage: FileStorage = this.getFileStorage();\n const downloadStorage: FileStorage = downloadId ? this.downloadStorage : undefined;\n let deferred: DownloadPromise = downloadId ? undefined : this.downloadPromises[fileName];\n\n this.debug && this.log('downloadFile', fileName, options);\n\n if(deferred) {\n return deferred;\n }\n\n // if(deferred) {\n // if(size) {\n // return deferred.then(async(blob) => {\n // if(blob instanceof Blob && blob.size < size) {\n // this.debug && this.log('downloadFile need to deleteFile, wrong size:', blob.size, size);\n\n // try {\n // await this.delete(fileName);\n // } finally {\n // return this.download(options);\n // }\n // } else {\n // return blob;\n // }\n // });\n // } else {\n // return deferred;\n // }\n // }\n\n const errorHandler = (item: typeof cachePrepared, error: ApiError) => {\n if(item?.error) {\n return;\n }\n\n for(const p of prepared) {\n if(item && item !== p) {\n continue;\n }\n\n p.error = error;\n p.deferred.reject(error);\n }\n };\n\n const id = this.tempId++;\n const limitPart = options.limitPart || this.getLimitPart(size, false);\n\n let getFile: FileStorage['getFile'] = cacheStorage.getFile.bind(cacheStorage);\n\n let cachePrepared: ReturnType & {writer?: StreamWriter, error?: ApiError},\n downloadPrepared: typeof cachePrepared;\n const prepared: (typeof cachePrepared)[] = [];\n const possibleSize = size || limitPart;\n\n const getErrorsCount = () => prepared.reduce((acc, item) => acc + +!!item.error, 0);\n\n const attach = (item: typeof cachePrepared, fileName: string) => {\n const {deferred} = item;\n const _errorHandler = errorHandler.bind(null, item);\n\n deferred.cancel = () => deferred.reject(makeError('DOWNLOAD_CANCELED'));\n deferred.catch((error) => {\n _errorHandler(error);\n item.writer?.truncate?.();\n }).finally(() => {\n if(this.downloadPromises[fileName] === deferred) {\n delete this.downloadPromises[fileName];\n }\n\n delete item.writer;\n // indexOfAndSplice(prepared, item);\n });\n\n this.downloadPromises[fileName] = deferred;\n\n prepared.push(item);\n };\n\n if(cacheStorage && (!downloadStorage || possibleSize <= MAX_FILE_SAVE_SIZE)) {\n cachePrepared = cacheStorage.prepareWriting(cacheFileName, possibleSize, options.mimeType)\n attach(cachePrepared, cacheFileName);\n }\n\n if(downloadStorage) {\n let downloadFileName = options.fileName; // it's doc file_name\n if(!downloadFileName) {\n downloadFileName = cacheFileName;\n const ext = MIME_TYPE_EXTENSION_MAP[options.mimeType];\n if(ext) {\n downloadFileName += '.' + ext;\n }\n }\n\n downloadPrepared = downloadStorage.prepareWriting({\n fileName: downloadFileName,\n downloadId,\n size: possibleSize\n });\n attach(downloadPrepared, fileName);\n\n if(cachePrepared) { // cancel cache too\n downloadPrepared.deferred.catch((err) => cachePrepared.deferred.reject(err));\n }\n\n // this.downloadToDiscPromises[cacheFileName] = deferred;\n // deferred.catch(noop).finally(() => {\n // if(this.downloadToDiscPromises[cacheFileName] === deferred) {\n // delete this.downloadToDiscPromises[cacheFileName];\n // }\n // });\n }\n\n deferred = downloadPrepared?.deferred ?? cachePrepared.deferred;\n\n if(downloadStorage && process) { // then have to load file again\n getFile = downloadStorage.getFile.bind(downloadStorage);\n }\n\n getFile(cacheFileName).then(async(blob: Blob) => {\n checkCancel();\n\n // if(blob.size < size) {\n // if(!options.onlyCache) {\n // await this.delete(cacheFileName);\n // checkCancel();\n // }\n\n // throw makeError('NO_ENTRY_FOUND');\n // }\n\n if(downloadPrepared) {\n const writer = downloadPrepared.writer = downloadPrepared.getWriter();\n checkCancel();\n\n const arr = await readBlobAsUint8Array(blob);\n checkCancel();\n await writer.write(arr);\n checkCancel();\n\n downloadPrepared.deferred.resolve(await writer.finalize());\n }\n\n if(cachePrepared) {\n cachePrepared.deferred.resolve(blob);\n }\n }).catch(async(err: ApiError) => {\n if(options.onlyCache) {\n errorHandler(null, err);\n return;\n }\n\n prepared.forEach((p) => {\n p.writer = p.getWriter();\n });\n\n const maxRequests = Infinity;\n\n const isWebFile = location._ === 'inputWebFileLocation';\n const requestPart = (isWebFile ? this.requestWebFilePart : this.requestFilePart).bind(this);\n\n if(isWebFile && this.webFileDcId === undefined) {\n await this.apiManager.getConfig();\n checkCancel();\n }\n\n const delayed = this.allocateDeferredPromises(0, size, limitPart);\n\n const progress: Progress = {done: 0, offset: 0, total: size, fileName};\n const dispatchProgress = () => {\n try {\n checkCancel();\n progress.done = done;\n this.rootScope.dispatchEvent('download_progress', progress);\n } catch(err) {}\n };\n\n const throttledDispatchProgress = throttle(dispatchProgress, 50, true);\n\n let done = 0;\n const superpuper = async() => {\n const {offset, writePromise, writeDeferred} = delayed.shift();\n try {\n checkCancel();\n\n const requestPerf = performance.now();\n const result = await requestPart(dcId, location as any, offset, limitPart, id, options.queueId, checkCancel);\n const requestTime = performance.now() - requestPerf;\n\n const bytes = result.bytes;\n\n if(delayed.length) {\n superpuper();\n }\n\n const byteLength = bytes.byteLength;\n this.debug && this.log('downloadFile requestFilePart result:', fileName, result);\n const isFinal = (offset + limitPart) >= size || !byteLength;\n if(byteLength) {\n done += byteLength;\n\n if(isFinal) {\n dispatchProgress();\n } else {\n throttledDispatchProgress();\n }\n\n const writeQueuePerf = performance.now();\n await writePromise;\n checkCancel();\n const writeQueueTime = performance.now() - writeQueuePerf;\n\n const perf = performance.now();\n await Promise.all(prepared.map(({writer}) => writer?.write(bytes, offset)));\n checkCancel();\n // downloadId && this.log('write time', performance.now() - perf, 'request time', requestTime, 'queue time', writeQueueTime);\n }\n\n if(isFinal) {\n if(!size || done < size) {\n prepared.forEach(({writer}) => writer?.trim?.(done));\n }\n }\n\n if(isFinal && process) {\n const promises = prepared\n .filter(({writer}) => writer?.getParts && writer.replaceParts)\n .map(async({writer}) => {\n const bytes = writer.getParts();\n const processedResult = await process(bytes, cacheFileName);\n writer.replaceParts(processedResult);\n });\n\n await Promise.all(promises);\n checkCancel();\n }\n\n writeDeferred.resolve();\n\n if(isFinal) {\n const saveToStorage = done <= MAX_FILE_SAVE_SIZE;\n prepared.forEach((item) => {\n const {deferred, writer} = item;\n if(deferred.isFulfilled || deferred.isRejected || !writer) {\n return;\n }\n\n const result = writer.finalize(saveToStorage);\n deferred.resolve(result);\n });\n }\n } catch(err) {\n errorHandler(null, err as ApiError);\n }\n };\n\n for(let i = 0, length = Math.min(maxRequests, delayed.length); i < length; ++i) {\n superpuper();\n }\n }).catch(noop);\n\n const checkCancel = () => {\n if(getErrorsCount() === prepared.length) {\n throw prepared[0].error;\n }\n };\n\n return deferred;\n }\n\n public downloadMedia(options: DownloadMediaOptions): DownloadPromise {\n let {media, thumb} = options;\n const isPhoto = media._ === 'photo';\n if(isPhoto && !thumb) {\n return Promise.reject('preloadPhoto photoEmpty!');\n }\n\n // get original instance with correct file_reference instead of using copies\n const isDocument = media._ === 'document';\n // const isWebDocument = media._ === 'webDocument';\n if(isDocument) media = this.appDocsManager.getDoc((media as Document.document).id);\n else if(isPhoto) media = this.appPhotosManager.getPhoto((media as Photo.photo).id);\n\n const {fileName, downloadOptions} = getDownloadMediaDetails(options);\n\n let promise = this.getDownload(fileName);\n if(!promise) {\n promise = this.download(downloadOptions);\n\n if(isDocument && !thumb) {\n this.rootScope.dispatchEvent('document_downloading', (media as Document.document).id);\n promise.catch(noop).finally(() => {\n this.rootScope.dispatchEvent('document_downloaded', (media as Document.document).id);\n });\n }\n }\n\n return promise;\n }\n\n public downloadMediaURL(options: DownloadMediaOptions): Promise {\n const {media, thumb} = options;\n\n let cacheContext = this.thumbsStorage.getCacheContext(media as any, thumb?.type);\n if((thumb ? (cacheContext.downloaded >= ('size' in thumb ? thumb.size : 0)) : true) && cacheContext.url) {\n return Promise.resolve(cacheContext.url);\n }\n\n return this.downloadMedia(options).then((blob) => {\n if(!cacheContext.downloaded || cacheContext.downloaded < blob.size) {\n const url = URL.createObjectURL(blob);\n cacheContext = this.thumbsStorage.setCacheContextURL(media as any, cacheContext.type, url, blob.size);\n }\n\n return cacheContext.url;\n });\n }\n\n public downloadMediaVoid(options: DownloadMediaOptions) {\n return this.downloadMedia(options).then(noop);\n }\n\n private delete(fileName: string) {\n delete this.downloadPromises[fileName];\n return this.getFileStorage().delete(fileName);\n }\n\n public upload({file, fileName}: {file: Blob | File, fileName?: string}) {\n fileName ||= getFileNameForUpload(file);\n\n const fileSize = file.size;\n const isBigFile = fileSize >= 10485760;\n const partSize = this.getLimitPart(fileSize, true);\n const activeDelta = this.getDelta(partSize);\n const totalParts = Math.ceil(fileSize / partSize);\n const fileId = randomLong();\n const resultInputFile: InputFile = {\n _: isBigFile ? 'inputFileBig' : 'inputFile',\n id: fileId as any,\n parts: totalParts,\n name: fileName,\n md5_checksum: ''\n };\n\n const deferred = deferredPromise();\n if(totalParts > this.maxUploadParts) {\n deferred.reject(makeError('FILE_TOO_BIG'));\n return deferred;\n }\n\n let canceled = false, resolved = false;\n let errorHandler = (error: ApiError) => {\n if(error?.type !== 'UPLOAD_CANCELED') {\n this.log.error('Up Error', error);\n }\n\n deferred.reject(error);\n canceled = true;\n errorHandler = noop;\n };\n\n const method = isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart';\n const id = this.tempId++;\n\n const self = this;\n function* generator() {\n let _part = 0, doneParts = 0;\n for(let offset = 0; offset < fileSize; offset += partSize) {\n const part = _part++; // 0, 1\n yield self.downloadRequest('upload', id, async() => {\n checkCancel();\n\n const blob = file.slice(offset, offset + partSize);\n const buffer = await readBlobAsArrayBuffer(blob);\n checkCancel();\n\n self.debug && self.log('Upload file part, isBig:', isBigFile, part, buffer.byteLength, new Uint8Array(buffer).length, new Uint8Array(buffer).slice().length);\n\n return self.apiManager.invokeApi(method, {\n file_id: fileId,\n file_part: part,\n file_total_parts: totalParts,\n bytes: buffer\n } as any, {\n fileUpload: true\n }).then(() => {\n if(canceled) {\n return;\n }\n\n ++doneParts;\n const progress: Progress = {done: doneParts * partSize, offset, total: fileSize, fileName};\n deferred.notify(progress);\n\n if(doneParts >= totalParts) {\n deferred.resolve(resultInputFile);\n resolved = true;\n }\n }, errorHandler);\n }, activeDelta).catch(errorHandler);\n }\n }\n\n const it = generator();\n const process = () => {\n if(canceled) return;\n const r = it.next();\n if(r.done || canceled) return;\n (r.value as Promise).then(process);\n };\n\n const maxRequests = Infinity;\n for(let i = 0, length = Math.min(maxRequests, totalParts); i < length; ++i) {\n process();\n }\n\n const checkCancel = () => {\n if(canceled) {\n throw makeError('UPLOAD_CANCELED');\n }\n };\n\n deferred.cancel = () => {\n if(!canceled && !resolved) {\n canceled = true;\n errorHandler(makeError('UPLOAD_CANCELED'));\n }\n };\n\n deferred.notify = (progress: Progress) => {\n this.rootScope.dispatchEvent('download_progress', progress);\n };\n\n deferred.finally(() => {\n if(this.uploadPromises[fileName] === deferred) {\n delete this.uploadPromises[fileName];\n }\n });\n\n return this.uploadPromises[fileName] = deferred;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function fixFirefoxSvg(text: string) {\n const svgIndex = text.indexOf('/, ` width=\"${width}\" height=\"${height}\">`).replace(/[^\\x00-\\x7F]/g, '');\n return text;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAsArrayBuffer from './readBlobAsArrayBuffer';\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then((buffer) => new Uint8Array(buffer));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from '../../environment/ctx';\nimport callbackify from '../../helpers/callbackify';\nimport {ignoreRestrictionReasons} from '../../helpers/restrictions';\nimport {Config, MethodDeclMap, User} from '../../layer';\nimport {InvokeApiOptions} from '../../types';\nimport {AppManager} from '../appManagers/manager';\nimport {MTAppConfig} from './appConfig';\nimport {UserAuth} from './mtproto_config';\nimport {MTMessage} from './networker';\n\ntype HashResult = {\n hash: number,\n result: any\n};\n\ntype HashOptions = {\n [queryJSON: string]: HashResult\n};\n\nexport type ApiLimitType = 'pin' | 'folderPin' | 'folders' |\n 'favedStickers' | 'reactions' | 'bio' | 'topicPin' | 'caption';\n\nexport default abstract class ApiManagerMethods extends AppManager {\n private afterMessageIdTemp: number;\n private hashes: {[method: string]: HashOptions} = {};\n private apiPromisesSingleProcess: {\n [q: string]: Map>\n } = {};\n private apiPromisesSingle: {\n [q: string]: Promise\n } = {};\n private apiPromisesCacheable: {\n [method: string]: {\n [queryJSON: string]: {\n timestamp: number,\n promise: Promise,\n fulfilled: boolean,\n timeout?: number,\n params: any\n }\n }\n } = {};\n\n protected config: Config;\n protected appConfig: MTAppConfig;\n\n constructor() {\n super();\n this.afterMessageIdTemp = 0;\n }\n\n abstract setUserAuth(userAuth: UserAuth | UserId): Promise;\n\n public setUser(user: User) {\n // appUsersManager.saveApiUser(user);\n return this.setUserAuth(user.id);\n }\n\n abstract invokeApi(method: T, params?: MethodDeclMap[T]['req'], options?: InvokeApiOptions): Promise;\n\n public invokeApiAfter(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise {\n let o = options;\n o.prepareTempMessageId = '' + ++this.afterMessageIdTemp;\n\n o = {...options};\n (options as MTMessage).messageId = o.prepareTempMessageId;\n\n // console.log('will invokeApi:', method, params, options);\n return this.invokeApi(method, params, o);\n }\n\n public invokeApiHashable(o: {\n method: T,\n processResult?: (response: MethodDeclMap[T]['res']) => R,\n processError?: (error: ApiError) => any,\n params?: Omit,\n options?: InvokeApiOptions & {cacheKey?: string},\n overwrite?: boolean\n }) {\n // @ts-ignore\n o.params ??= {};\n o.options ??= {};\n // console.log('will invokeApi:', method, params, options);\n\n const {params, options, method, overwrite} = o;\n\n const queryJSON = JSON.stringify(params);\n let cached: HashResult;\n if(this.hashes[method]) {\n cached = this.hashes[method][queryJSON];\n if(cached) {\n if(overwrite) {\n delete this.hashes[method][queryJSON];\n cached = undefined;\n } else {\n (params as any).hash = cached.hash;\n }\n }\n }\n\n return this.invokeApiSingleProcess({\n method,\n processResult: (result) => {\n if(result._.includes('NotModified')) {\n // this.debug && this.log.warn('NotModified saved!', method, queryJSON);\n return cached.result;\n }\n\n if(result.hash/* || result.messages */) {\n const hash = result.hash/* || this.computeHash(result.messages) */;\n\n if(!this.hashes[method]) this.hashes[method] = {};\n cached = this.hashes[method][queryJSON] = {\n hash,\n result\n };\n }\n\n if(o.processResult) {\n const newResult = o.processResult(result);\n return cached ? cached.result = newResult : newResult;\n }\n\n return result;\n },\n params,\n options\n });\n }\n\n public invokeApiSingle(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions = {}): Promise {\n const q = method + '-' + JSON.stringify(params);\n const cache = this.apiPromisesSingle;\n if(cache[q]) {\n return cache[q];\n }\n\n return cache[q] = this.invokeApi(method, params, options).finally(() => {\n delete cache[q];\n });\n }\n\n public invokeApiSingleProcess(o: {\n method: T,\n processResult: (response: MethodDeclMap[T]['res']) => R,\n processError?: (error: ApiError) => any,\n params?: MethodDeclMap[T]['req'],\n options?: InvokeApiOptions & {cacheKey?: string, overwrite?: boolean}\n }): Promise> {\n o.params ??= {};\n o.options ??= {};\n\n const {method, processResult, processError, params, options} = o;\n const cache = this.apiPromisesSingleProcess;\n const cacheKey = options.cacheKey || JSON.stringify(params);\n const map = cache[method] ?? (cache[method] = new Map());\n const oldPromise = map.get(cacheKey);\n if(oldPromise) {\n return oldPromise;\n }\n\n const getNewPromise = () => {\n const promise = map.get(cacheKey);\n return promise === p ? undefined : promise;\n }\n\n const originalPromise = this.invokeApi(method, params, options);\n const newPromise: Promise> = originalPromise.then((result) => {\n return getNewPromise() || processResult(result);\n }, (error) => {\n const promise = getNewPromise();\n if(promise) {\n return promise;\n }\n\n if(!processError) {\n throw error;\n }\n\n return processError(error);\n });\n\n const p = newPromise.finally(() => {\n if(map.get(cacheKey) !== p) {\n return;\n }\n\n map.delete(cacheKey);\n if(!map.size) {\n delete cache[method];\n }\n });\n\n map.set(cacheKey, p);\n return p;\n }\n\n public invokeApiCacheable(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions & Partial<{cacheSeconds: number, override: boolean}> = {}): Promise {\n const cache = this.apiPromisesCacheable[method] ?? (this.apiPromisesCacheable[method] = {});\n const queryJSON = JSON.stringify(params);\n const item = cache[queryJSON];\n if(item && (!options.override || !item.fulfilled)) {\n return item.promise;\n }\n\n if(options.override) {\n if(item && item.timeout) {\n clearTimeout(item.timeout);\n delete item.timeout;\n }\n\n delete options.override;\n }\n\n let timeout: number;\n if(options.cacheSeconds) {\n timeout = ctx.setTimeout(() => {\n delete cache[queryJSON];\n }, options.cacheSeconds * 1000);\n delete options.cacheSeconds;\n }\n\n const promise = this.invokeApi(method, params, options);\n\n cache[queryJSON] = {\n timestamp: Date.now(),\n fulfilled: false,\n timeout,\n promise,\n params\n };\n\n return promise;\n }\n\n public clearCache(method: T, verify: (params: MethodDeclMap[T]['req']) => boolean) {\n const cache = this.apiPromisesCacheable[method];\n if(cache) {\n for(const queryJSON in cache) {\n const item = cache[queryJSON];\n try {\n if(verify(item.params)) {\n if(item.timeout) {\n clearTimeout(item.timeout);\n }\n\n delete cache[queryJSON];\n }\n } catch(err) {\n // this.log.error('clearCache error:', err, queryJSON, item);\n }\n }\n }\n }\n\n public getConfig(overwrite?: boolean) {\n if(this.config && !overwrite) {\n return this.config;\n }\n\n return this.invokeApiSingleProcess({\n method: 'help.getConfig',\n params: {},\n processResult: (config) => {\n this.config = config;\n this.rootScope.dispatchEvent('config', config);\n return config;\n },\n options: {overwrite}\n });\n }\n\n public getAppConfig(overwrite?: boolean) {\n if(this.appConfig && !overwrite) {\n return this.appConfig;\n }\n\n return this.invokeApiSingleProcess({\n method: 'help.getAppConfig',\n params: {},\n processResult: (config: MTAppConfig) => {\n this.appConfig = config;\n ignoreRestrictionReasons(config.ignore_restriction_reasons ?? []);\n this.rootScope.dispatchEvent('app_config', config);\n return config;\n },\n options: {overwrite}\n });\n }\n\n public getLimit(type: ApiLimitType, isPremium?: boolean) {\n return callbackify(this.getAppConfig(), (appConfig) => {\n const map: {[type in ApiLimitType]: [keyof MTAppConfig, keyof MTAppConfig] | keyof MTAppConfig} = {\n pin: ['dialogs_pinned_limit_default', 'dialogs_pinned_limit_premium'],\n folderPin: ['dialogs_folder_pinned_limit_default', 'dialogs_folder_pinned_limit_premium'],\n folders: ['dialog_filters_limit_default', 'dialog_filters_limit_premium'],\n favedStickers: ['stickers_faved_limit_default', 'stickers_faved_limit_premium'],\n reactions: ['reactions_user_max_default', 'reactions_user_max_premium'],\n bio: ['about_length_limit_default', 'about_length_limit_premium'],\n topicPin: 'topics_pinned_limit',\n caption: ['caption_length_limit_default', 'caption_length_limit_premium']\n };\n\n isPremium ??= this.rootScope.premium;\n\n const a = map[type];\n const key = Array.isArray(a) ? a[isPremium ? 1 : 0] : a;\n return appConfig[key] as number;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n \nimport transportController from './transports/controller';\nimport MTTransport from './transports/transport';\n \n\nimport type {UserAuth} from './mtproto_config';\nimport type {DcAuthKey, DcId, DcServerSalt, InvokeApiOptions} from '../../types';\nimport type {MethodDeclMap} from '../../layer';\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport sessionStorage from '../sessionStorage';\nimport MTPNetworker, {MTMessage} from './networker';\nimport {ConnectionType, constructTelegramWebSocketUrl, DcConfigurator, TransportType} from './dcConfigurator';\nimport {logger} from '../logger';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IDB} from '../files/idb';\nimport CryptoWorker from '../crypto/cryptoMessagePort';\nimport ctx from '../../environment/ctx';\nimport noop from '../../helpers/noop';\nimport Modes from '../../config/modes';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport pause from '../../helpers/schedulers/pause';\nimport ApiManagerMethods from './api_methods';\nimport {getEnvironment} from '../../environment/utils';\nimport toggleStorages from '../../helpers/toggleStorages';\n\n/* class RotatableArray {\n public array: Array = [];\n private lastIndex = -1;\n\n public get() {\n this.lastIndex = clamp(this.lastIndex + 1, 0, this.array.length - 1);\n return this.array[this.lastIndex];\n }\n} */\n\nconst PREMIUM_FILE_NETWORKERS_COUNT = 6;\nconst REGULAR_FILE_NETWORKERS_COUNT = 3;\n\nexport class ApiManager extends ApiManagerMethods {\n private cachedNetworkers: {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTPNetworker[]\n }\n }\n };\n\n private cachedExportPromise: {[x: number]: Promise};\n private gettingNetworkers: {[dcIdAndType: string]: Promise};\n private baseDcId: DcId;\n\n // public telegramMeNotified = false;\n\n private log: ReturnType;\n\n private afterMessageTempIds: {\n [tempId: string]: {\n messageId: string,\n promise: Promise\n }\n };\n\n private transportType: TransportType;\n\n private updatesProcessor: (obj: any) => void;\n\n private loggingOut: boolean;\n\n constructor() {\n super();\n this.log = logger('API');\n\n this.cachedNetworkers = {} as any;\n this.cachedExportPromise = {};\n this.gettingNetworkers = {};\n this.baseDcId = 0;\n this.afterMessageTempIds = {};\n\n this.transportType = Modes.transport;\n\n \n transportController.addEventListener('transport', (transportType) => {\n this.changeTransportType(transportType);\n });\n \n\n // * Make sure that the used autologin_token is no more than 10000 seconds old\n // * https://core.telegram.org/api/url-authorization\n const REFRESH_APP_CONFIG_INTERVAL = (10000 - 30) * 1000;\n setInterval(() => {\n this.getAppConfig(true);\n }, REFRESH_APP_CONFIG_INTERVAL);\n }\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateConfig: () => {\n this.getConfig(true);\n this.getAppConfig(true);\n }\n });\n\n this.rootScope.addEventListener('user_auth', () => {\n if(this.config) { // refresh configs if had a config during authorization\n this.apiUpdatesManager.processLocalUpdate({_: 'updateConfig'});\n }\n });\n\n this.rootScope.addEventListener('premium_toggle', (isPremium) => {\n this.iterateNetworkers(({networker, connectionType, dcId, transportType}) => {\n if(connectionType === 'client' || transportType !== 'websocket') {\n return;\n }\n\n const transport = networker.transport;\n if(!transport) {\n this.log.error('wow what, no transport?', networker);\n return;\n }\n\n if((transport as TcpObfuscated).connection) {\n const url = constructTelegramWebSocketUrl(dcId, connectionType, isPremium);\n (transport as TcpObfuscated).changeUrl(url);\n }\n });\n });\n }\n\n // private lol = false;\n\n // constructor() {\n // MtpSingleInstanceService.start();\n\n /* AppStorage.get('dc').then((dcId) => {\n if(dcId) {\n this.baseDcId = dcId;\n }\n }); */\n // }\n\n /* public telegramMeNotify(newValue: boolean) {\n if(this.telegramMeNotified !== newValue) {\n this.telegramMeNotified = newValue;\n //telegramMeWebService.setAuthorized(this.telegramMeNotified);\n }\n } */\n\n private getTransportType(connectionType: ConnectionType) {\n \n \n \n \n \n // @ts-ignore\n const transportType: TransportType = this.transportType;\n \n\n return transportType;\n }\n\n private iterateNetworkers(callback: (o: {networker: MTPNetworker, dcId: DcId, connectionType: ConnectionType, transportType: TransportType, index: number, array: MTPNetworker[]}) => void) {\n for(const transportType in this.cachedNetworkers) {\n const connections = this.cachedNetworkers[transportType as TransportType];\n for(const connectionType in connections) {\n const dcs = connections[connectionType as ConnectionType];\n for(const dcId in dcs) {\n const networkers = dcs[dcId as any as DcId];\n networkers.forEach((networker, idx, arr) => {\n callback({\n networker,\n dcId: +dcId as DcId,\n connectionType: connectionType as ConnectionType,\n transportType: transportType as TransportType,\n index: idx,\n array: arr\n });\n });\n }\n }\n }\n }\n\n private chooseServer(dcId: DcId, connectionType: ConnectionType, transportType: TransportType) {\n return this.dcConfigurator.chooseServer(dcId, connectionType, transportType, connectionType === 'client', this.rootScope.premium);\n }\n\n public changeTransportType(transportType: TransportType) {\n const oldTransportType = this.transportType;\n if(oldTransportType === transportType) {\n return;\n }\n\n this.log('changing transport from', oldTransportType, 'to', transportType);\n\n const oldObject = this.cachedNetworkers[oldTransportType];\n const newObject = this.cachedNetworkers[transportType];\n this.cachedNetworkers[transportType] = oldObject;\n this.cachedNetworkers[oldTransportType] = newObject;\n\n this.transportType = transportType;\n\n for(const oldGetKey in this.gettingNetworkers) {\n const promise = this.gettingNetworkers[oldGetKey];\n delete this.gettingNetworkers[oldGetKey];\n\n const newGetKey = oldGetKey.replace(oldTransportType, transportType);\n this.gettingNetworkers[newGetKey] = promise;\n\n this.log('changed networker getKey from', oldGetKey, 'to', newGetKey)\n }\n\n this.iterateNetworkers((info) => {\n const transportType = this.getTransportType(info.connectionType);\n const transport = this.chooseServer(info.dcId, info.connectionType, transportType);\n this.changeNetworkerTransport(info.networker, transport);\n });\n }\n\n public async getBaseDcId() {\n if(this.baseDcId) {\n return this.baseDcId;\n }\n\n const baseDcId = await sessionStorage.get('dc');\n if(!this.baseDcId) {\n if(!baseDcId) {\n this.setBaseDcId(App.baseDcId);\n } else {\n this.baseDcId = baseDcId;\n }\n }\n\n return this.baseDcId;\n }\n\n public async setUserAuth(userAuth: UserAuth | UserId) {\n if(typeof(userAuth) === 'string' || typeof(userAuth) === 'number') {\n userAuth = {dcID: 0, date: Date.now() / 1000 | 0, id: userAuth.toPeerId(false)};\n }\n\n this.rootScope.dispatchEvent('user_auth', userAuth);\n\n if(!userAuth.dcID) {\n const baseDcId = await this.getBaseDcId();\n userAuth.dcID = baseDcId;\n }\n\n sessionStorage.set({\n user_auth: userAuth\n });\n\n // this.telegramMeNotify(true);\n }\n\n public setBaseDcId(dcId: DcId) {\n const wasDcId = this.baseDcId;\n if(wasDcId) { // if migrated set ondrain\n this.getNetworker(wasDcId).then((networker) => {\n this.setOnDrainIfNeeded(networker);\n });\n }\n\n this.baseDcId = dcId;\n\n sessionStorage.set({\n dc: this.baseDcId\n });\n }\n\n public async logOut() {\n if(this.loggingOut) {\n return;\n }\n\n this.loggingOut = true;\n const storageKeys: Array = [];\n\n const prefix = 'dc';\n for(let dcId = 1; dcId <= 5; dcId++) {\n storageKeys.push(prefix + dcId + '_auth_key' as any);\n }\n\n // WebPushApiManager.forceUnsubscribe(); // WARNING // moved to worker's master\n const storageResult = await Promise.all(storageKeys.map((key) => sessionStorage.get(key)));\n\n const logoutPromises: Promise[] = [];\n for(let i = 0; i < storageResult.length; i++) {\n if(storageResult[i]) {\n logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: (i + 1) as DcId, ignoreErrors: true}));\n }\n }\n\n const clear = async() => {\n this.baseDcId = undefined;\n // this.telegramMeNotify(false);\n await toggleStorages(false, true);\n IDB.closeDatabases();\n this.rootScope.dispatchEvent('logging_out');\n };\n\n setTimeout(clear, 1e3);\n\n // return;\n\n return Promise.all(logoutPromises).catch((error) => {\n error.handled = true;\n }).finally(clear)/* .then(() => {\n location.pathname = '/';\n }) */;\n }\n\n private generateNetworkerGetKey(dcId: DcId, transportType: TransportType, connectionType: ConnectionType) {\n return [dcId, transportType, connectionType].join('-');\n }\n\n public getNetworker(dcId: DcId, options: InvokeApiOptions = {}): Promise {\n const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client');\n // const connectionType: ConnectionType = 'client';\n\n const transportType = this.getTransportType(connectionType);\n if(!this.cachedNetworkers[transportType]) {\n this.cachedNetworkers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const cache = this.cachedNetworkers[transportType][connectionType];\n if(!(dcId in cache)) {\n cache[dcId] = [];\n }\n\n const networkers = cache[dcId];\n // @ts-ignore\n const maxNetworkers = connectionType === 'client' || transportType === 'https' ? 1 : (this.rootScope.premium ? PREMIUM_FILE_NETWORKERS_COUNT : REGULAR_FILE_NETWORKERS_COUNT);\n if(networkers.length >= maxNetworkers) {\n let i = maxNetworkers - 1, found = false;\n for(; i >= 0; --i) {\n if(networkers[i].isOnline) {\n found = true;\n break;\n }\n }\n\n const networker = networkers.splice(found ? i : maxNetworkers - 1, 1)[0];\n networkers.unshift(networker);\n return Promise.resolve(networker);\n }\n\n let getKey = this.generateNetworkerGetKey(dcId, transportType, connectionType);\n if(this.gettingNetworkers[getKey]) {\n return this.gettingNetworkers[getKey];\n }\n\n const ak: DcAuthKey = `dc${dcId}_auth_key` as any;\n const ss: DcServerSalt = `dc${dcId}_server_salt` as any;\n\n let transport = this.chooseServer(dcId, connectionType, transportType);\n return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map((key) => sessionStorage.get(key)))\n .then(async([authKeyHex, serverSaltHex]) => {\n let networker: MTPNetworker, error: any;\n if(authKeyHex && authKeyHex.length === 512) {\n if(!serverSaltHex || serverSaltHex.length !== 16) {\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\n }\n\n const authKey = bytesFromHex(authKeyHex);\n const authKeyId = (await CryptoWorker.invokeCrypto('sha1', authKey)).slice(-8);\n const serverSalt = bytesFromHex(serverSaltHex);\n\n networker = this.networkerFactory.getNetworker(dcId, authKey, authKeyId, serverSalt, options);\n } else {\n try { // if no saved state\n const auth = await this.authorizer.auth(dcId);\n\n sessionStorage.set({\n [ak]: bytesToHex(auth.authKey),\n [ss]: bytesToHex(auth.serverSalt)\n });\n\n networker = this.networkerFactory.getNetworker(dcId, auth.authKey, auth.authKeyId, auth.serverSalt, options);\n } catch(_error) {\n error = _error;\n }\n }\n\n // ! cannot get it before this promise because simultaneous changeTransport will change nothing\n const newTransportType = this.getTransportType(connectionType);\n if(newTransportType !== transportType) {\n getKey = this.generateNetworkerGetKey(dcId, newTransportType, connectionType);\n transport.destroy();\n DcConfigurator.removeTransport(this.dcConfigurator.chosenServers, transport);\n\n if(networker) {\n transport = this.chooseServer(dcId, connectionType, newTransportType);\n }\n\n this.log('transport has been changed during authorization from', transportType, 'to', newTransportType);\n }\n\n /* networker.onConnectionStatusChange = (online) => {\n console.log('status:', online);\n }; */\n\n delete this.gettingNetworkers[getKey];\n\n if(error) {\n this.log('get networker error', error, (error as Error).stack);\n throw error;\n }\n\n this.changeNetworkerTransport(networker, transport);\n networkers.unshift(networker);\n this.setOnDrainIfNeeded(networker);\n return networker;\n });\n }\n\n public getNetworkerVoid(dcId: DcId) {\n return this.getNetworker(dcId).then(noop, noop);\n }\n\n private changeNetworkerTransport(networker: MTPNetworker, transport?: MTTransport) {\n const oldTransport = networker.transport;\n if(oldTransport) {\n DcConfigurator.removeTransport(this.dcConfigurator.chosenServers, oldTransport);\n }\n\n networker.changeTransport(transport);\n }\n\n private onNetworkerDrain(networker: MTPNetworker) {\n this.log('networker drain', networker.dcId);\n networker.onDrain = undefined;\n this.changeNetworkerTransport(networker);\n networker.destroy();\n this.networkerFactory.removeNetworker(networker);\n DcConfigurator.removeTransport(this.cachedNetworkers, networker);\n }\n\n public setOnDrainIfNeeded(networker: MTPNetworker) {\n if(networker.onDrain) {\n return;\n }\n\n const checkPromise: Promise = networker.isFileNetworker ?\n Promise.resolve(true) :\n this.getBaseDcId().then((baseDcId) => networker.dcId !== baseDcId);\n checkPromise.then((canRelease) => {\n if(networker.onDrain) {\n return;\n }\n\n if(canRelease) {\n networker.onDrain = () => this.onNetworkerDrain(networker);\n networker.setDrainTimeout();\n }\n });\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n this.networkerFactory.setUpdatesProcessor(callback);\n }\n\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): CancellablePromise {\n // /////this.log('Invoke api', method, params, options);\n\n /* if(!this.lol) {\n networkerFactory.updatesProcessor({_: 'new_session_created'}, true);\n this.lol = true;\n } */\n\n const deferred = deferredPromise();\n\n let {afterMessageId, prepareTempMessageId} = options;\n if(prepareTempMessageId) {\n deferred.then(() => {\n delete this.afterMessageTempIds[prepareTempMessageId];\n });\n }\n\n if(MOUNT_CLASS_TO) {\n const startTime = Date.now();\n const interval = ctx.setInterval(() => {\n if(!cachedNetworker || !cachedNetworker.isStopped()) {\n this.log.error('Request is still processing:', method, params, options, 'time:', (Date.now() - startTime) / 1000);\n }\n // this.cachedUploadNetworkers[2].requestMessageStatus();\n }, 5e3);\n\n deferred.catch(noop).finally(() => {\n clearInterval(interval);\n });\n }\n\n const rejectPromise = async(error: ApiError) => {\n if(!error) {\n error = {type: 'ERROR_EMPTY'};\n } else if(!isObject(error)) {\n error = {message: error};\n }\n\n if((error.code === 401 && error.type === 'SESSION_REVOKED') ||\n (error.code === 406 && error.type === 'AUTH_KEY_DUPLICATED')) {\n this.logOut();\n }\n\n if(options.ignoreErrors) {\n throw error;\n }\n\n if(error.code === 406) {\n error.handled = true;\n }\n\n if(!options.noErrorBox) {\n error.input = method;\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\n setTimeout(() => {\n if(!error.handled) {\n if(error.code === 401) {\n this.logOut();\n } else {\n // ErrorService.show({error: error}); // WARNING\n }\n\n error.handled = true;\n }\n }, 100);\n }\n\n throw error;\n };\n\n let dcId: DcId;\n\n let cachedNetworker: MTPNetworker;\n const stack = (new Error()).stack || 'empty stack';\n const performRequest = (): Promise => {\n if(afterMessageId) {\n const after = this.afterMessageTempIds[afterMessageId];\n if(after) {\n options.afterMessageId = after.messageId;\n }\n }\n\n const promise = cachedNetworker.wrapApiCall(method, params, options);\n\n if(prepareTempMessageId) {\n this.afterMessageTempIds[prepareTempMessageId] = {\n messageId: (options as MTMessage).messageId,\n promise: deferred\n };\n }\n\n return promise.catch((error: ApiError) => {\n // if(!options.ignoreErrors) {\n if(error.type !== 'FILE_REFERENCE_EXPIRED'/* && error.type !== 'MSG_WAIT_FAILED' */) {\n this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params);\n }\n\n if(error.code === 401 && this.baseDcId === dcId) {\n if(error.type !== 'SESSION_PASSWORD_NEEDED') {\n sessionStorage.delete('dc')\n sessionStorage.delete('user_auth'); // ! возможно тут вообще не нужно это делать, но нужно проверить случай с USER_DEACTIVATED (https://core.telegram.org/api/errors)\n // this.telegramMeNotify(false);\n }\n\n throw error;\n } else if(error.code === 401 && this.baseDcId && dcId !== this.baseDcId) {\n if(this.cachedExportPromise[dcId] === undefined) {\n const promise = new Promise((exportResolve, exportReject) => {\n this.invokeApi('auth.exportAuthorization', {dc_id: dcId}, {noErrorBox: true}).then((exportedAuth) => {\n this.invokeApi('auth.importAuthorization', {\n id: exportedAuth.id,\n bytes: exportedAuth.bytes\n }, {dcId, noErrorBox: true}).then(exportResolve, exportReject);\n }, exportReject);\n });\n\n this.cachedExportPromise[dcId] = promise;\n }\n\n return this.cachedExportPromise[dcId].then(() => performRequest());\n } else if(error.code === 303) {\n const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n if(options.dcId) {\n options.dcId = newDcId;\n } else {\n this.setBaseDcId(newDcId);\n }\n\n return this.invokeApi(method, params, options);\n }\n } else if(error.code === 400 && error.type.indexOf('FILE_MIGRATE') === 0) {\n const newDcId = +error.type.match(/^(FILE_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n options.dcId = newDcId;\n return this.invokeApi(method, params, options);\n } else {\n throw error;\n }\n } else if(error.code === 400 && error.type === 'CONNECTION_NOT_INITED') {\n this.networkerFactory.unsetConnectionInited();\n return performRequest();\n } else if(!options.rawError && error.code === 420) {\n const waitTime = +error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 1;\n\n if(waitTime > (options.floodMaxTimeout ?? 60) && !options.prepareTempMessageId) {\n throw error;\n }\n\n return pause(waitTime/* (waitTime + 5) */ * 1000).then(() => performRequest());\n } else if(!options.rawError && ['MSG_WAIT_FAILED', 'MSG_WAIT_TIMEOUT'].includes(error.type)) {\n const after = this.afterMessageTempIds[afterMessageId];\n\n afterMessageId = undefined;\n delete options.afterMessageId;\n\n if(after) return after.promise.then(() => performRequest());\n else return performRequest();\n } else if(!options.rawError && error.code === 500) {\n const now = Date.now();\n if(options.stopTime) {\n if(now >= options.stopTime) {\n throw error;\n }\n }\n\n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\n return pause(options.waitTime * 1000).then(() => performRequest());\n } else if(error.type === 'UNKNOWN' || error.type === 'MTPROTO_CLUSTER_INVALID') { // cluster invalid - request from regular user to premium endpoint\n return pause(1000).then(() => performRequest());\n } else {\n throw error;\n }\n });\n }\n\n let p: Promise;\n if(dcId = (options.dcId || this.baseDcId)) {\n p = this.getNetworker(dcId, options);\n } else {\n p = this.getBaseDcId().then((baseDcId) => this.getNetworker(dcId = baseDcId, options));\n }\n\n p.then((networker) => {\n cachedNetworker = networker;\n const promise = performRequest();\n cachedNetworker.attachPromise(deferred, options as MTMessage);\n return promise;\n })\n .then(deferred.resolve)\n .catch(rejectPromise)\n .catch(deferred.reject);\n\n return deferred;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport applyMixins from '../../helpers/applyMixins';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {AppManager} from '../appManagers/manager';\n\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage' | 'self';\n\ntype PeersStorageKey = `${StatePeerType}_${string | PeerId}` | StatePeerType;\n\nclass PeersStorage {\n private neededPeers: Map> = new Map();\n private singlePeerMap: Map> = new Map();\n\n constructor() {\n this._constructor(false);\n }\n\n protected after() {\n this.rootScope.addEventListener('user_auth', () => {\n this.requestPeer(this.appPeersManager.peerId, 'self');\n });\n }\n\n public requestPeer(peerId: PeerId, key: PeersStorageKey) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(key)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(key);\n\n this.dispatchEvent('peerNeeded', peerId);\n }\n\n public releasePeer(peerId: PeerId, key: PeersStorageKey) {\n const set = this.neededPeers.get(peerId);\n if(!set) {\n return;\n }\n\n set.delete(key);\n\n if(!set.size) {\n this.neededPeers.delete(peerId);\n this.dispatchEvent('peerUnneeded', peerId);\n }\n }\n\n public requestPeersForKey(peerIds: Set | number[], key: PeersStorageKey) {\n if(Array.isArray(peerIds)) {\n peerIds = new Set(peerIds);\n }\n\n let set = this.singlePeerMap.get(key);\n if(set) {\n for(const peerId of set) {\n if(peerIds.has(peerId)) {\n continue;\n }\n\n this.releasePeer(peerId, key);\n set.delete(peerId);\n }\n\n if(!set.size && !peerIds.size) {\n this.singlePeerMap.delete(key);\n return;\n }\n }\n\n if(peerIds.size) {\n if(!set) {\n set = new Set();\n this.singlePeerMap.set(key, set);\n }\n\n for(const peerId of peerIds) {\n if(set.has(peerId)) {\n continue;\n }\n\n this.requestPeer(peerId, key);\n set.add(peerId);\n }\n }\n }\n\n public isPeerNeeded(peerId: PeerId) {\n return this.neededPeers.has(peerId);\n }\n}\n\ninterface PeersStorage extends EventListenerBase<{\n peerNeeded: (peerId: PeerId) => void,\n peerUnneeded: (peerId: PeerId) => void,\n}>, AppManager {}\napplyMixins(PeersStorage, [EventListenerBase, AppManager]);\n\nexport default PeersStorage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {WebDocument} from '../../layer';\nimport type {MyDocument} from '../appManagers/appDocsManager';\nimport type {MyPhoto} from '../appManagers/appPhotosManager';\nimport {THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n\nexport type ThumbCache = {\n downloaded: number,\n url: string,\n type: string\n};\n\nexport type ThumbsCache = {\n [key: string]: {\n [size: string]: ThumbCache\n }\n};\n\nconst thumbFullSize = THUMB_TYPE_FULL;\n\nexport type ThumbStorageMedia = MyPhoto | MyDocument | WebDocument;\n\nexport default class ThumbsStorage {\n private thumbsCache: ThumbsCache = {};\n\n private getKey(media: ThumbStorageMedia) {\n return media._ + ((media as MyPhoto).id ?? (media as WebDocument).url);\n }\n\n public getCacheContext(media: ThumbStorageMedia, thumbSize: string = thumbFullSize): ThumbCache {\n /* if(media._ === 'photo' && thumbSize !== 'i') {\n thumbSize = thumbFullSize;\n } */\n\n const cache = this.thumbsCache[this.getKey(media)] ??= {};\n return cache[thumbSize] ??= {downloaded: 0, url: '', type: thumbSize};\n }\n\n public setCacheContextURL(media: ThumbStorageMedia, thumbSize: string = thumbFullSize, url: string, downloaded: number = 0) {\n const cacheContext = this.getCacheContext(media, thumbSize);\n cacheContext.url = url;\n cacheContext.downloaded = downloaded;\n return cacheContext;\n }\n\n public deleteCacheContext(media: ThumbStorageMedia, thumbSize: string = thumbFullSize) {\n const cache = this.thumbsCache[this.getKey(media)];\n if(cache) {\n delete cache[thumbSize];\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type MTProtoConstructor = {\n id: number,\n predicate: string,\n params: Array<{\n name: string,\n type: string\n }>,\n type: string\n};\n\nexport type MTProtoMethod = {\n id: number,\n method: string,\n params: Array<{\n name: string,\n type: string\n }>,\n type: string\n};\n\n// eslint-disable-next-line quotes, comma-spacing\nexport default {\"MTProto\":{\"constructors\":[{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":85337187,\"predicate\":\"resPQ\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"server_public_key_fingerprints\",\"type\":\"Vector\"}],\"type\":\"ResPQ\"},{\"id\":-1443537003,\"predicate\":\"p_q_inner_data_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":1459478408,\"predicate\":\"p_q_inner_data_temp_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"},{\"name\":\"expires_in\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":-790100132,\"predicate\":\"server_DH_params_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_answer\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-1249309254,\"predicate\":\"server_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"dh_prime\",\"type\":\"bytes\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"server_time\",\"type\":\"int\"}],\"type\":\"Server_DH_inner_data\"},{\"id\":1715713620,\"predicate\":\"client_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"retry_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"}],\"type\":\"Client_DH_Inner_Data\"},{\"id\":1003222836,\"predicate\":\"dh_gen_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash1\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1188831161,\"predicate\":\"dh_gen_retry\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash2\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":-1499615742,\"predicate\":\"dh_gen_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash3\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1973679973,\"predicate\":\"bind_auth_key_inner\",\"params\":[{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"temp_auth_key_id\",\"type\":\"long\"},{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"temp_session_id\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"}],\"type\":\"BindAuthKeyInner\"},{\"id\":-212046591,\"predicate\":\"rpc_result\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"result\",\"type\":\"Object\"}],\"type\":\"RpcResult\"},{\"id\":558156313,\"predicate\":\"rpc_error\",\"params\":[{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"error_message\",\"type\":\"string\"}],\"type\":\"RpcError\"},{\"id\":1579864942,\"predicate\":\"rpc_answer_unknown\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-847714938,\"predicate\":\"rpc_answer_dropped_running\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-1539647305,\"predicate\":\"rpc_answer_dropped\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seq_no\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"}],\"type\":\"RpcDropAnswer\"},{\"id\":155834844,\"predicate\":\"future_salt\",\"params\":[{\"name\":\"valid_since\",\"type\":\"int\"},{\"name\":\"valid_until\",\"type\":\"int\"},{\"name\":\"salt\",\"type\":\"long\"}],\"type\":\"FutureSalt\"},{\"id\":-1370486635,\"predicate\":\"future_salts\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"now\",\"type\":\"int\"},{\"name\":\"salts\",\"type\":\"vector\"}],\"type\":\"FutureSalts\"},{\"id\":880243653,\"predicate\":\"pong\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-501201412,\"predicate\":\"destroy_session_ok\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":1658015945,\"predicate\":\"destroy_session_none\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1631450872,\"predicate\":\"new_session_created\",\"params\":[{\"name\":\"first_msg_id\",\"type\":\"long\"},{\"name\":\"unique_id\",\"type\":\"long\"},{\"name\":\"server_salt\",\"type\":\"long\"}],\"type\":\"NewSession\"},{\"id\":1945237724,\"predicate\":\"msg_container\",\"params\":[{\"name\":\"messages\",\"type\":\"vector<%Message>\"}],\"type\":\"MessageContainer\"},{\"id\":1538843921,\"predicate\":\"message\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seqno\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"body\",\"type\":\"Object\"}],\"type\":\"Message\"},{\"id\":-530561358,\"predicate\":\"msg_copy\",\"params\":[{\"name\":\"orig_message\",\"type\":\"Message\"}],\"type\":\"MessageCopy\"},{\"id\":812830625,\"predicate\":\"gzip_packed\",\"params\":[{\"name\":\"packed_data\",\"type\":\"bytes\"}],\"type\":\"Object\"},{\"id\":1658238041,\"predicate\":\"msgs_ack\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsAck\"},{\"id\":-1477445615,\"predicate\":\"bad_msg_notification\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"}],\"type\":\"BadMsgNotification\"},{\"id\":-307542917,\"predicate\":\"bad_server_salt\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"new_server_salt\",\"type\":\"long\"}],\"type\":\"BadMsgNotification\"},{\"id\":2105940488,\"predicate\":\"msg_resend_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgResendReq\"},{\"id\":-630588590,\"predicate\":\"msgs_state_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsStateReq\"},{\"id\":81704317,\"predicate\":\"msgs_state_info\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsStateInfo\"},{\"id\":-1933520591,\"predicate\":\"msgs_all_info\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsAllInfo\"},{\"id\":661470918,\"predicate\":\"msg_detailed_info\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-2137147681,\"predicate\":\"msg_new_detailed_info\",\"params\":[{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-161422892,\"predicate\":\"destroy_auth_key_ok\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":178201177,\"predicate\":\"destroy_auth_key_none\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":-368010477,\"predicate\":\"destroy_auth_key_fail\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}],\"methods\":[{\"id\":-1099002127,\"method\":\"req_pq_multi\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":-686627650,\"method\":\"req_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"public_key_fingerprint\",\"type\":\"long\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-184262881,\"method\":\"set_client_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1491380032,\"method\":\"rpc_drop_answer\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"}],\"type\":\"RpcDropAnswer\"},{\"id\":-1188971260,\"method\":\"get_future_salts\",\"params\":[{\"name\":\"num\",\"type\":\"int\"}],\"type\":\"FutureSalts\"},{\"id\":2059302892,\"method\":\"ping\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-213746804,\"method\":\"ping_delay_disconnect\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"},{\"name\":\"disconnect_delay\",\"type\":\"int\"}],\"type\":\"Pong\"},{\"id\":-414113498,\"method\":\"destroy_session\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1835453025,\"method\":\"http_wait\",\"params\":[{\"name\":\"max_delay\",\"type\":\"int\"},{\"name\":\"wait_after\",\"type\":\"int\"},{\"name\":\"max_wait\",\"type\":\"int\"}],\"type\":\"HttpWait\"},{\"id\":-784117408,\"method\":\"destroy_auth_key\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}]},\"API\":{\"constructors\":[{\"id\":-1132882121,\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1720552011,\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":1072550713,\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":-994444869,\"predicate\":\"error\",\"params\":[{\"name\":\"code\",\"type\":\"int\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Error\"},{\"id\":1450380236,\"predicate\":\"null\",\"params\":[],\"type\":\"Null\"},{\"id\":2134579434,\"predicate\":\"inputPeerEmpty\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":2107670217,\"predicate\":\"inputPeerSelf\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":900291769,\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1182234929,\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-138301121,\"predicate\":\"inputUserSelf\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-208488460,\"predicate\":\"inputPhoneContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"InputContact\"},{\"id\":-181407105,\"predicate\":\"inputFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"md5_checksum\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":-1771768449,\"predicate\":\"inputMediaEmpty\",\"params\":[],\"type\":\"InputMedia\"},{\"id\":505969924,\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.2?true\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":-1279654347,\"predicate\":\"inputMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputPhoto\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-104578748,\"predicate\":\"inputMediaGeoPoint\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"}],\"type\":\"InputMedia\"},{\"id\":-122978821,\"predicate\":\"inputMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":480546647,\"predicate\":\"inputChatPhotoEmpty\",\"params\":[],\"type\":\"InputChatPhoto\"},{\"id\":-968723890,\"predicate\":\"inputChatUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"InputChatPhoto\"},{\"id\":-1991004873,\"predicate\":\"inputChatPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputChatPhoto\"},{\"id\":-457104426,\"predicate\":\"inputGeoPointEmpty\",\"params\":[],\"type\":\"InputGeoPoint\"},{\"id\":1210199983,\"predicate\":\"inputGeoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"InputGeoPoint\"},{\"id\":483901197,\"predicate\":\"inputPhotoEmpty\",\"params\":[],\"type\":\"InputPhoto\"},{\"id\":1001634122,\"predicate\":\"inputPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputPhoto\"},{\"id\":-539317279,\"predicate\":\"inputFileLocation\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputFileLocation\"},{\"id\":1498486562,\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":918946202,\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1432995067,\"predicate\":\"storage.fileUnknown\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1086091090,\"predicate\":\"storage.filePartial\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":8322574,\"predicate\":\"storage.fileJpeg\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-891180321,\"predicate\":\"storage.fileGif\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":172975040,\"predicate\":\"storage.filePng\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1373745011,\"predicate\":\"storage.filePdf\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1384777335,\"predicate\":\"storage.fileMp3\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1258941372,\"predicate\":\"storage.fileMov\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1278304028,\"predicate\":\"storage.fileMp4\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":276907596,\"predicate\":\"storage.fileWebp\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-742634630,\"predicate\":\"userEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"User\"},{\"id\":1326562017,\"predicate\":\"userProfilePhotoEmpty\",\"params\":[],\"type\":\"UserProfilePhoto\"},{\"id\":-2100168954,\"predicate\":\"userProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"personal\",\"type\":\"flags.2?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"UserProfilePhoto\"},{\"id\":164646985,\"predicate\":\"userStatusEmpty\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-306628279,\"predicate\":\"userStatusOnline\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":9203775,\"predicate\":\"userStatusOffline\",\"params\":[{\"name\":\"was_online\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":693512293,\"predicate\":\"chatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Chat\"},{\"id\":1103884886,\"predicate\":\"chat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"deactivated\",\"type\":\"flags.5?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.25?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"migrated_to\",\"type\":\"flags.6?InputChannel\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"}],\"type\":\"Chat\"},{\"id\":1704108455,\"predicate\":\"chatForbidden\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Chat\"},{\"id\":-908914376,\"predicate\":\"chatFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_set_username\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants\",\"type\":\"ChatParticipants\"},{\"name\":\"chat_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.13?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"flags.3?Vector\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"call\",\"type\":\"flags.12?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.15?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.16?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.17?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.17?Vector\"},{\"name\":\"available_reactions\",\"type\":\"flags.18?ChatReactions\"}],\"type\":\"ChatFull\"},{\"id\":-1070776313,\"predicate\":\"chatParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-2023500831,\"predicate\":\"chatParticipantsForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"self_participant\",\"type\":\"flags.0?ChatParticipant\"}],\"type\":\"ChatParticipants\"},{\"id\":1018991608,\"predicate\":\"chatParticipants\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"ChatParticipants\"},{\"id\":935395612,\"predicate\":\"chatPhotoEmpty\",\"params\":[],\"type\":\"ChatPhoto\"},{\"id\":476978193,\"predicate\":\"chatPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"ChatPhoto\"},{\"id\":-1868117372,\"predicate\":\"messageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"peer_id\",\"type\":\"flags.0?Peer\"}],\"type\":\"Message\"},{\"id\":940666592,\"predicate\":\"message\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"from_scheduled\",\"type\":\"flags.18?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"edit_hide\",\"type\":\"flags.21?true\"},{\"name\":\"pinned\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.6?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"views\",\"type\":\"flags.10?int\"},{\"name\":\"forwards\",\"type\":\"flags.10?int\"},{\"name\":\"replies\",\"type\":\"flags.23?MessageReplies\"},{\"name\":\"edit_date\",\"type\":\"flags.15?int\"},{\"name\":\"post_author\",\"type\":\"flags.16?string\"},{\"name\":\"grouped_id\",\"type\":\"flags.17?long\"},{\"name\":\"reactions\",\"type\":\"flags.20?MessageReactions\"},{\"name\":\"restriction_reason\",\"type\":\"flags.22?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":721967202,\"predicate\":\"messageService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"MessageAction\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":1038967584,\"predicate\":\"messageMediaEmpty\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":1766936791,\"predicate\":\"messageMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.3?true\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1457575028,\"predicate\":\"messageMediaGeo\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"}],\"type\":\"MessageMedia\"},{\"id\":1882335561,\"predicate\":\"messageMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageMedia\"},{\"id\":-1618676578,\"predicate\":\"messageMediaUnsupported\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":-1230047312,\"predicate\":\"messageActionEmpty\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1119368275,\"predicate\":\"messageActionChatCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1247687078,\"predicate\":\"messageActionChatEditTitle\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":2144015272,\"predicate\":\"messageActionChatEditPhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":-1780220945,\"predicate\":\"messageActionChatDeletePhoto\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":365886720,\"predicate\":\"messageActionChatAddUser\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1539362612,\"predicate\":\"messageActionChatDeleteUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-712374074,\"predicate\":\"dialog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"unread_mark\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"unread_reactions_count\",\"type\":\"int\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"flags.1?DraftMessage\"},{\"name\":\"folder_id\",\"type\":\"flags.4?int\"},{\"name\":\"ttl_period\",\"type\":\"flags.5?int\"}],\"type\":\"Dialog\"},{\"id\":590459437,\"predicate\":\"photoEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Photo\"},{\"id\":-82216347,\"predicate\":\"photo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_stickers\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"},{\"name\":\"video_sizes\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"Photo\"},{\"id\":236446268,\"predicate\":\"photoSizeEmpty\",\"params\":[{\"name\":\"type\",\"type\":\"string\"}],\"type\":\"PhotoSize\"},{\"id\":1976012384,\"predicate\":\"photoSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"}],\"type\":\"PhotoSize\"},{\"id\":35527382,\"predicate\":\"photoCachedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":286776671,\"predicate\":\"geoPointEmpty\",\"params\":[],\"type\":\"GeoPoint\"},{\"id\":-1297942941,\"predicate\":\"geoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"GeoPoint\"},{\"id\":1577067778,\"predicate\":\"auth.sentCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"auth.SentCodeType\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"next_type\",\"type\":\"flags.1?auth.CodeType\"},{\"name\":\"timeout\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCode\"},{\"id\":872119224,\"predicate\":\"auth.authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"setup_password_required\",\"type\":\"flags.1?true\"},{\"name\":\"otherwise_relogin_days\",\"type\":\"flags.1?int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"auth.Authorization\"},{\"id\":-1271602504,\"predicate\":\"auth.exportedAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1195615476,\"predicate\":\"inputNotifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputNotifyPeer\"},{\"id\":423314455,\"predicate\":\"inputNotifyUsers\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":1251338318,\"predicate\":\"inputNotifyChats\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-551616469,\"predicate\":\"inputPeerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?NotificationSound\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":-1472527322,\"predicate\":\"peerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"ios_sound\",\"type\":\"flags.3?NotificationSound\"},{\"name\":\"android_sound\",\"type\":\"flags.4?NotificationSound\"},{\"name\":\"other_sound\",\"type\":\"flags.5?NotificationSound\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-1525149427,\"predicate\":\"peerSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"report_spam\",\"type\":\"flags.0?true\"},{\"name\":\"add_contact\",\"type\":\"flags.1?true\"},{\"name\":\"block_contact\",\"type\":\"flags.2?true\"},{\"name\":\"share_contact\",\"type\":\"flags.3?true\"},{\"name\":\"need_contacts_exception\",\"type\":\"flags.4?true\"},{\"name\":\"report_geo\",\"type\":\"flags.5?true\"},{\"name\":\"autoarchived\",\"type\":\"flags.7?true\"},{\"name\":\"invite_members\",\"type\":\"flags.8?true\"},{\"name\":\"request_chat_broadcast\",\"type\":\"flags.10?true\"},{\"name\":\"geo_distance\",\"type\":\"flags.6?int\"},{\"name\":\"request_chat_title\",\"type\":\"flags.9?string\"},{\"name\":\"request_chat_date\",\"type\":\"flags.9?int\"}],\"type\":\"PeerSettings\"},{\"id\":-1539849235,\"predicate\":\"wallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"pattern\",\"type\":\"flags.3?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"Document\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1490799288,\"predicate\":\"inputReportReasonSpam\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":505595789,\"predicate\":\"inputReportReasonViolence\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":777640226,\"predicate\":\"inputReportReasonPornography\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1376497949,\"predicate\":\"inputReportReasonChildAbuse\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1041980751,\"predicate\":\"inputReportReasonOther\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-120378643,\"predicate\":\"userFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blocked\",\"type\":\"flags.0?true\"},{\"name\":\"phone_calls_available\",\"type\":\"flags.4?true\"},{\"name\":\"phone_calls_private\",\"type\":\"flags.5?true\"},{\"name\":\"can_pin_message\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.12?true\"},{\"name\":\"video_calls_available\",\"type\":\"flags.13?true\"},{\"name\":\"voice_messages_forbidden\",\"type\":\"flags.20?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"personal_photo\",\"type\":\"flags.21?Photo\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"fallback_photo\",\"type\":\"flags.22?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"bot_info\",\"type\":\"flags.3?BotInfo\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"common_chats_count\",\"type\":\"int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.15?string\"},{\"name\":\"private_forward_name\",\"type\":\"flags.16?string\"},{\"name\":\"bot_group_admin_rights\",\"type\":\"flags.17?ChatAdminRights\"},{\"name\":\"bot_broadcast_admin_rights\",\"type\":\"flags.18?ChatAdminRights\"},{\"name\":\"premium_gifts\",\"type\":\"flags.19?Vector\"}],\"type\":\"UserFull\"},{\"id\":341499403,\"predicate\":\"contact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"mutual\",\"type\":\"Bool\"}],\"type\":\"Contact\"},{\"id\":-1052885936,\"predicate\":\"importedContact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"client_id\",\"type\":\"long\"}],\"type\":\"ImportedContact\"},{\"id\":383348795,\"predicate\":\"contactStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"ContactStatus\"},{\"id\":-1219778094,\"predicate\":\"contacts.contactsNotModified\",\"params\":[],\"type\":\"contacts.Contacts\"},{\"id\":-353862078,\"predicate\":\"contacts.contacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"},{\"name\":\"saved_count\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Contacts\"},{\"id\":2010127419,\"predicate\":\"contacts.importedContacts\",\"params\":[{\"name\":\"imported\",\"type\":\"Vector\"},{\"name\":\"popular_invites\",\"type\":\"Vector\"},{\"name\":\"retry_contacts\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":182326673,\"predicate\":\"contacts.blocked\",\"params\":[{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":-513392236,\"predicate\":\"contacts.blockedSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":364538944,\"predicate\":\"messages.dialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":1910543603,\"predicate\":\"messages.dialogsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1938715001,\"predicate\":\"messages.messages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":978610270,\"predicate\":\"messages.messagesSlice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"next_rate\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":1694474197,\"predicate\":\"messages.chats\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-438840932,\"predicate\":\"messages.chatFull\",\"params\":[{\"name\":\"full_chat\",\"type\":\"ChatFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatFull\"},{\"id\":-1269012015,\"predicate\":\"messages.affectedHistory\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1474492012,\"predicate\":\"inputMessagesFilterEmpty\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1777752804,\"predicate\":\"inputMessagesFilterPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1614803355,\"predicate\":\"inputMessagesFilterVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1458172132,\"predicate\":\"inputMessagesFilterPhotoVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1629621880,\"predicate\":\"inputMessagesFilterDocument\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":2129714567,\"predicate\":\"inputMessagesFilterUrl\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-3644025,\"predicate\":\"inputMessagesFilterGif\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":522914557,\"predicate\":\"updateNewMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1318109142,\"predicate\":\"updateMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-1576161051,\"predicate\":\"updateDeleteMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1071741569,\"predicate\":\"updateUserTyping\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-2092401936,\"predicate\":\"updateChatUserTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":125178264,\"predicate\":\"updateChatParticipants\",\"params\":[{\"name\":\"participants\",\"type\":\"ChatParticipants\"}],\"type\":\"Update\"},{\"id\":-440534818,\"predicate\":\"updateUserStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"Update\"},{\"id\":-1484486364,\"predicate\":\"updateUserName\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"usernames\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1519637954,\"predicate\":\"updates.state\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"}],\"type\":\"updates.State\"},{\"id\":1567990072,\"predicate\":\"updates.differenceEmpty\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":16030880,\"predicate\":\"updates.difference\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-1459938943,\"predicate\":\"updates.differenceSlice\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"intermediate_state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-484987010,\"predicate\":\"updatesTooLong\",\"params\":[],\"type\":\"Updates\"},{\"id\":826001400,\"predicate\":\"updateShortMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":1299050149,\"predicate\":\"updateShortChatMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":2027216577,\"predicate\":\"updateShort\",\"params\":[{\"name\":\"update\",\"type\":\"Update\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1918567619,\"predicate\":\"updatesCombined\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq_start\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1957577280,\"predicate\":\"updates\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1916114267,\"predicate\":\"photos.photos\",\"params\":[{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":352657236,\"predicate\":\"photos.photosSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":539045032,\"predicate\":\"photos.photo\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photo\"},{\"id\":157948117,\"predicate\":\"upload.file\",\"params\":[{\"name\":\"type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.File\"},{\"id\":414687501,\"predicate\":\"dcOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"ipv6\",\"type\":\"flags.0?true\"},{\"name\":\"media_only\",\"type\":\"flags.1?true\"},{\"name\":\"tcpo_only\",\"type\":\"flags.2?true\"},{\"name\":\"cdn\",\"type\":\"flags.3?true\"},{\"name\":\"static\",\"type\":\"flags.4?true\"},{\"name\":\"this_port_only\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":589653676,\"predicate\":\"config\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phonecalls_enabled\",\"type\":\"flags.1?true\"},{\"name\":\"default_p2p_contacts\",\"type\":\"flags.3?true\"},{\"name\":\"preload_featured_stickers\",\"type\":\"flags.4?true\"},{\"name\":\"ignore_phone_entities\",\"type\":\"flags.5?true\"},{\"name\":\"revoke_pm_inbox\",\"type\":\"flags.6?true\"},{\"name\":\"blocked_mode\",\"type\":\"flags.8?true\"},{\"name\":\"pfs_enabled\",\"type\":\"flags.13?true\"},{\"name\":\"force_try_ipv6\",\"type\":\"flags.14?true\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"test_mode\",\"type\":\"Bool\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"dc_options\",\"type\":\"Vector\"},{\"name\":\"dc_txt_domain_name\",\"type\":\"string\"},{\"name\":\"chat_size_max\",\"type\":\"int\"},{\"name\":\"megagroup_size_max\",\"type\":\"int\"},{\"name\":\"forwarded_count_max\",\"type\":\"int\"},{\"name\":\"online_update_period_ms\",\"type\":\"int\"},{\"name\":\"offline_blur_timeout_ms\",\"type\":\"int\"},{\"name\":\"offline_idle_timeout_ms\",\"type\":\"int\"},{\"name\":\"online_cloud_timeout_ms\",\"type\":\"int\"},{\"name\":\"notify_cloud_delay_ms\",\"type\":\"int\"},{\"name\":\"notify_default_delay_ms\",\"type\":\"int\"},{\"name\":\"push_chat_period_ms\",\"type\":\"int\"},{\"name\":\"push_chat_limit\",\"type\":\"int\"},{\"name\":\"saved_gifs_limit\",\"type\":\"int\"},{\"name\":\"edit_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_pm_time_limit\",\"type\":\"int\"},{\"name\":\"rating_e_decay\",\"type\":\"int\"},{\"name\":\"stickers_recent_limit\",\"type\":\"int\"},{\"name\":\"stickers_faved_limit\",\"type\":\"int\"},{\"name\":\"channels_read_media_period\",\"type\":\"int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"pinned_dialogs_count_max\",\"type\":\"int\"},{\"name\":\"pinned_infolder_count_max\",\"type\":\"int\"},{\"name\":\"call_receive_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_ring_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_connect_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_packet_timeout_ms\",\"type\":\"int\"},{\"name\":\"me_url_prefix\",\"type\":\"string\"},{\"name\":\"autoupdate_url_prefix\",\"type\":\"flags.7?string\"},{\"name\":\"gif_search_username\",\"type\":\"flags.9?string\"},{\"name\":\"venue_search_username\",\"type\":\"flags.10?string\"},{\"name\":\"img_search_username\",\"type\":\"flags.11?string\"},{\"name\":\"static_maps_provider\",\"type\":\"flags.12?string\"},{\"name\":\"caption_length_max\",\"type\":\"int\"},{\"name\":\"message_length_max\",\"type\":\"int\"},{\"name\":\"webfile_dc_id\",\"type\":\"int\"},{\"name\":\"suggested_lang_code\",\"type\":\"flags.2?string\"},{\"name\":\"lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"base_lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"reactions_default\",\"type\":\"flags.15?Reaction\"}],\"type\":\"Config\"},{\"id\":-1910892683,\"predicate\":\"nearestDc\",\"params\":[{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"nearest_dc\",\"type\":\"int\"}],\"type\":\"NearestDc\"},{\"id\":-860107216,\"predicate\":\"help.appUpdate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_not_skip\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"sticker\",\"type\":\"flags.3?Document\"}],\"type\":\"help.AppUpdate\"},{\"id\":-1000708810,\"predicate\":\"help.noAppUpdate\",\"params\":[],\"type\":\"help.AppUpdate\"},{\"id\":415997816,\"predicate\":\"help.inviteText\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"help.InviteText\"},{\"id\":314359194,\"predicate\":\"updateNewEncryptedMessage\",\"params\":[{\"name\":\"message\",\"type\":\"EncryptedMessage\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":386986326,\"predicate\":\"updateEncryptedChatTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1264392051,\"predicate\":\"updateEncryption\",\"params\":[{\"name\":\"chat\",\"type\":\"EncryptedChat\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":956179895,\"predicate\":\"updateEncryptedMessagesRead\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1417756512,\"predicate\":\"encryptedChatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":1722964307,\"predicate\":\"encryptedChatWaiting\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":1223809356,\"predicate\":\"encryptedChatRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1643173063,\"predicate\":\"encryptedChat\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":505183301,\"predicate\":\"encryptedChatDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"history_deleted\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":-247351839,\"predicate\":\"inputEncryptedChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedChat\"},{\"id\":-1038136962,\"predicate\":\"encryptedFileEmpty\",\"params\":[],\"type\":\"EncryptedFile\"},{\"id\":-1476358952,\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"long\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"EncryptedFile\"},{\"id\":406307684,\"predicate\":\"inputEncryptedFileEmpty\",\"params\":[],\"type\":\"InputEncryptedFile\"},{\"id\":1690108678,\"predicate\":\"inputEncryptedFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1511503333,\"predicate\":\"inputEncryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedFile\"},{\"id\":-182231723,\"predicate\":\"inputEncryptedFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-317144808,\"predicate\":\"encryptedMessage\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"EncryptedMessage\"},{\"id\":594758406,\"predicate\":\"encryptedMessageService\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"EncryptedMessage\"},{\"id\":-1058912715,\"predicate\":\"messages.dhConfigNotModified\",\"params\":[{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":740433629,\"predicate\":\"messages.dhConfig\",\"params\":[{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":1443858741,\"predicate\":\"messages.sentEncryptedMessage\",\"params\":[{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-1802240206,\"predicate\":\"messages.sentEncryptedFile\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-95482955,\"predicate\":\"inputFileBig\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":767652808,\"predicate\":\"inputEncryptedFileBigUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1037718609,\"predicate\":\"updateChatParticipantAdd\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-483443337,\"predicate\":\"updateChatParticipantDelete\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1906403213,\"predicate\":\"updateDcOptions\",\"params\":[{\"name\":\"dc_options\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1530447553,\"predicate\":\"inputMediaUploadedDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nosound_video\",\"type\":\"flags.3?true\"},{\"name\":\"force_file\",\"type\":\"flags.4?true\"},{\"name\":\"spoiler\",\"type\":\"flags.5?true\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":860303448,\"predicate\":\"inputMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"},{\"name\":\"query\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-1666158377,\"predicate\":\"messageMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nopremium\",\"type\":\"flags.3?true\"},{\"name\":\"spoiler\",\"type\":\"flags.4?true\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1928391342,\"predicate\":\"inputDocumentEmpty\",\"params\":[],\"type\":\"InputDocument\"},{\"id\":448771445,\"predicate\":\"inputDocument\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputDocument\"},{\"id\":-1160743548,\"predicate\":\"inputDocumentFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":922273905,\"predicate\":\"documentEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Document\"},{\"id\":-1881881384,\"predicate\":\"document\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"long\"},{\"name\":\"thumbs\",\"type\":\"flags.0?Vector\"},{\"name\":\"video_thumbs\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"Document\"},{\"id\":398898678,\"predicate\":\"help.support\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"help.Support\"},{\"id\":-1613493288,\"predicate\":\"notifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"NotifyPeer\"},{\"id\":-1261946036,\"predicate\":\"notifyUsers\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1073230141,\"predicate\":\"notifyChats\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1094555409,\"predicate\":\"updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"NotifyPeer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"}],\"type\":\"Update\"},{\"id\":381645902,\"predicate\":\"sendMessageTypingAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-44119819,\"predicate\":\"sendMessageCancelAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1584933265,\"predicate\":\"sendMessageRecordVideoAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-378127636,\"predicate\":\"sendMessageUploadVideoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-718310409,\"predicate\":\"sendMessageRecordAudioAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-212740181,\"predicate\":\"sendMessageUploadAudioAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-774682074,\"predicate\":\"sendMessageUploadPhotoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-1441998364,\"predicate\":\"sendMessageUploadDocumentAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":393186209,\"predicate\":\"sendMessageGeoLocationAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":1653390447,\"predicate\":\"sendMessageChooseContactAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1290580579,\"predicate\":\"contacts.found\",\"params\":[{\"name\":\"my_results\",\"type\":\"Vector\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Found\"},{\"id\":-337352679,\"predicate\":\"updateServiceNotification\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"inbox_date\",\"type\":\"flags.1?int\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"MessageMedia\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-496024847,\"predicate\":\"userStatusRecently\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":129960444,\"predicate\":\"userStatusLastWeek\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":2011940674,\"predicate\":\"userStatusLastMonth\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-298113238,\"predicate\":\"updatePrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"PrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1335282456,\"predicate\":\"inputPrivacyKeyStatusTimestamp\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1137792208,\"predicate\":\"privacyKeyStatusTimestamp\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":218751099,\"predicate\":\"inputPrivacyValueAllowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":407582158,\"predicate\":\"inputPrivacyValueAllowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":320652927,\"predicate\":\"inputPrivacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":195371015,\"predicate\":\"inputPrivacyValueDisallowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-697604407,\"predicate\":\"inputPrivacyValueDisallowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-1877932953,\"predicate\":\"inputPrivacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-123988,\"predicate\":\"privacyValueAllowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":1698855810,\"predicate\":\"privacyValueAllowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1198497870,\"predicate\":\"privacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":-125240806,\"predicate\":\"privacyValueDisallowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1955338397,\"predicate\":\"privacyValueDisallowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-463335103,\"predicate\":\"privacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1352683077,\"predicate\":\"account.privacyRules\",\"params\":[{\"name\":\"rules\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-1194283041,\"predicate\":\"accountDaysTTL\",\"params\":[{\"name\":\"days\",\"type\":\"int\"}],\"type\":\"AccountDaysTTL\"},{\"id\":88680979,\"predicate\":\"updateUserPhone\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1815593308,\"predicate\":\"documentAttributeImageSize\",\"params\":[{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":297109817,\"predicate\":\"documentAttributeAnimated\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1662637586,\"predicate\":\"documentAttributeSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"mask\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"DocumentAttribute\"},{\"id\":250621158,\"predicate\":\"documentAttributeVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"round_message\",\"type\":\"flags.0?true\"},{\"name\":\"supports_streaming\",\"type\":\"flags.1?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":-1739392570,\"predicate\":\"documentAttributeAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"voice\",\"type\":\"flags.10?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"},{\"name\":\"waveform\",\"type\":\"flags.2?bytes\"}],\"type\":\"DocumentAttribute\"},{\"id\":358154344,\"predicate\":\"documentAttributeFilename\",\"params\":[{\"name\":\"file_name\",\"type\":\"string\"}],\"type\":\"DocumentAttribute\"},{\"id\":-244016606,\"predicate\":\"messages.stickersNotModified\",\"params\":[],\"type\":\"messages.Stickers\"},{\"id\":816245886,\"predicate\":\"messages.stickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.Stickers\"},{\"id\":313694676,\"predicate\":\"stickerPack\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"StickerPack\"},{\"id\":-395967805,\"predicate\":\"messages.allStickersNotModified\",\"params\":[],\"type\":\"messages.AllStickers\"},{\"id\":-843329861,\"predicate\":\"messages.allStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.AllStickers\"},{\"id\":-1667805217,\"predicate\":\"updateReadHistoryInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":791617983,\"predicate\":\"updateReadHistoryOutbox\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-2066640507,\"predicate\":\"messages.affectedMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":2139689491,\"predicate\":\"updateWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-350980120,\"predicate\":\"webPageEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"WebPage\"},{\"id\":-981018084,\"predicate\":\"webPagePending\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-392411726,\"predicate\":\"webPage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"display_url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"type\",\"type\":\"flags.0?string\"},{\"name\":\"site_name\",\"type\":\"flags.1?string\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"embed_url\",\"type\":\"flags.5?string\"},{\"name\":\"embed_type\",\"type\":\"flags.5?string\"},{\"name\":\"embed_width\",\"type\":\"flags.6?int\"},{\"name\":\"embed_height\",\"type\":\"flags.6?int\"},{\"name\":\"duration\",\"type\":\"flags.7?int\"},{\"name\":\"author\",\"type\":\"flags.8?string\"},{\"name\":\"document\",\"type\":\"flags.9?Document\"},{\"name\":\"cached_page\",\"type\":\"flags.10?Page\"},{\"name\":\"attributes\",\"type\":\"flags.12?Vector\"}],\"type\":\"WebPage\"},{\"id\":-1557277184,\"predicate\":\"messageMediaWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"}],\"type\":\"MessageMedia\"},{\"id\":-1392388579,\"predicate\":\"authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.0?true\"},{\"name\":\"official_app\",\"type\":\"flags.1?true\"},{\"name\":\"password_pending\",\"type\":\"flags.2?true\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.3?true\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.4?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"app_name\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"Authorization\"},{\"id\":1275039392,\"predicate\":\"account.authorizations\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"},{\"name\":\"authorizations\",\"type\":\"Vector\"}],\"type\":\"account.Authorizations\"},{\"id\":-1787080453,\"predicate\":\"account.password\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_recovery\",\"type\":\"flags.0?true\"},{\"name\":\"has_secure_values\",\"type\":\"flags.1?true\"},{\"name\":\"has_password\",\"type\":\"flags.2?true\"},{\"name\":\"current_algo\",\"type\":\"flags.2?PasswordKdfAlgo\"},{\"name\":\"srp_B\",\"type\":\"flags.2?bytes\"},{\"name\":\"srp_id\",\"type\":\"flags.2?long\"},{\"name\":\"hint\",\"type\":\"flags.3?string\"},{\"name\":\"email_unconfirmed_pattern\",\"type\":\"flags.4?string\"},{\"name\":\"new_algo\",\"type\":\"PasswordKdfAlgo\"},{\"name\":\"new_secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_random\",\"type\":\"bytes\"},{\"name\":\"pending_reset_date\",\"type\":\"flags.5?int\"},{\"name\":\"login_email_pattern\",\"type\":\"flags.6?string\"}],\"type\":\"account.Password\"},{\"id\":-1705233435,\"predicate\":\"account.passwordSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"email\",\"type\":\"flags.0?string\"},{\"name\":\"secure_settings\",\"type\":\"flags.1?SecureSecretSettings\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1036572727,\"predicate\":\"account.passwordInputSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"new_algo\",\"type\":\"flags.0?PasswordKdfAlgo\"},{\"name\":\"new_password_hash\",\"type\":\"flags.0?bytes\"},{\"name\":\"hint\",\"type\":\"flags.0?string\"},{\"name\":\"email\",\"type\":\"flags.1?string\"},{\"name\":\"new_secure_settings\",\"type\":\"flags.2?SecureSecretSettings\"}],\"type\":\"account.PasswordInputSettings\"},{\"id\":326715557,\"predicate\":\"auth.passwordRecovery\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"}],\"type\":\"auth.PasswordRecovery\"},{\"id\":-1052959727,\"predicate\":\"inputMediaVenue\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":784356159,\"predicate\":\"messageMediaVenue\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-1551583367,\"predicate\":\"receivedNotifyMessage\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"flags\",\"type\":\"int\"}],\"type\":\"ReceivedNotifyMessage\"},{\"id\":179611673,\"predicate\":\"chatInviteExported\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.0?true\"},{\"name\":\"permanent\",\"type\":\"flags.5?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"start_date\",\"type\":\"flags.4?int\"},{\"name\":\"expire_date\",\"type\":\"flags.1?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.2?int\"},{\"name\":\"usage\",\"type\":\"flags.3?int\"},{\"name\":\"requested\",\"type\":\"flags.7?int\"},{\"name\":\"title\",\"type\":\"flags.8?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1516793212,\"predicate\":\"chatInviteAlready\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"}],\"type\":\"ChatInvite\"},{\"id\":806110401,\"predicate\":\"chatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"flags.0?true\"},{\"name\":\"broadcast\",\"type\":\"flags.1?true\"},{\"name\":\"public\",\"type\":\"flags.2?true\"},{\"name\":\"megagroup\",\"type\":\"flags.3?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"flags.5?string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"flags.4?Vector\"}],\"type\":\"ChatInvite\"},{\"id\":51520707,\"predicate\":\"messageActionChatJoinedByLink\",\"params\":[{\"name\":\"inviter_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":1757493555,\"predicate\":\"updateReadMessagesContents\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-4838507,\"predicate\":\"inputStickerSetEmpty\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1645763991,\"predicate\":\"inputStickerSetID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputStickerSet\"},{\"id\":-2044933984,\"predicate\":\"inputStickerSetShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":768691932,\"predicate\":\"stickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archived\",\"type\":\"flags.1?true\"},{\"name\":\"official\",\"type\":\"flags.2?true\"},{\"name\":\"masks\",\"type\":\"flags.3?true\"},{\"name\":\"animated\",\"type\":\"flags.5?true\"},{\"name\":\"videos\",\"type\":\"flags.6?true\"},{\"name\":\"emojis\",\"type\":\"flags.7?true\"},{\"name\":\"installed_date\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumbs\",\"type\":\"flags.4?Vector\"},{\"name\":\"thumb_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"thumb_version\",\"type\":\"flags.4?int\"},{\"name\":\"thumb_document_id\",\"type\":\"flags.8?long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":1846886166,\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"keywords\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSet\"},{\"id\":-1885878744,\"predicate\":\"user\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"self\",\"type\":\"flags.10?true\"},{\"name\":\"contact\",\"type\":\"flags.11?true\"},{\"name\":\"mutual_contact\",\"type\":\"flags.12?true\"},{\"name\":\"deleted\",\"type\":\"flags.13?true\"},{\"name\":\"bot\",\"type\":\"flags.14?true\"},{\"name\":\"bot_chat_history\",\"type\":\"flags.15?true\"},{\"name\":\"bot_nochats\",\"type\":\"flags.16?true\"},{\"name\":\"verified\",\"type\":\"flags.17?true\"},{\"name\":\"restricted\",\"type\":\"flags.18?true\"},{\"name\":\"min\",\"type\":\"flags.20?true\"},{\"name\":\"bot_inline_geo\",\"type\":\"flags.21?true\"},{\"name\":\"support\",\"type\":\"flags.23?true\"},{\"name\":\"scam\",\"type\":\"flags.24?true\"},{\"name\":\"apply_min_photo\",\"type\":\"flags.25?true\"},{\"name\":\"fake\",\"type\":\"flags.26?true\"},{\"name\":\"bot_attach_menu\",\"type\":\"flags.27?true\"},{\"name\":\"premium\",\"type\":\"flags.28?true\"},{\"name\":\"attach_menu_enabled\",\"type\":\"flags.29?true\"},{\"name\":\"flags2\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.0?long\"},{\"name\":\"first_name\",\"type\":\"flags.1?string\"},{\"name\":\"last_name\",\"type\":\"flags.2?string\"},{\"name\":\"username\",\"type\":\"flags.3?string\"},{\"name\":\"phone\",\"type\":\"flags.4?string\"},{\"name\":\"photo\",\"type\":\"flags.5?UserProfilePhoto\"},{\"name\":\"status\",\"type\":\"flags.6?UserStatus\"},{\"name\":\"bot_info_version\",\"type\":\"flags.14?int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.18?Vector\"},{\"name\":\"bot_inline_placeholder\",\"type\":\"flags.19?string\"},{\"name\":\"lang_code\",\"type\":\"flags.22?string\"},{\"name\":\"emoji_status\",\"type\":\"flags.30?EmojiStatus\"},{\"name\":\"usernames\",\"type\":\"flags2.0?Vector\"}],\"type\":\"User\"},{\"id\":-1032140601,\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":-1892676777,\"predicate\":\"botInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"flags.0?long\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"description_photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"description_document\",\"type\":\"flags.5?Document\"},{\"name\":\"commands\",\"type\":\"flags.2?Vector\"},{\"name\":\"menu_button\",\"type\":\"flags.3?BotMenuButton\"}],\"type\":\"BotInfo\"},{\"id\":-1560655744,\"predicate\":\"keyboardButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":2002815875,\"predicate\":\"keyboardButtonRow\",\"params\":[{\"name\":\"buttons\",\"type\":\"Vector\"}],\"type\":\"KeyboardButtonRow\"},{\"id\":-1606526075,\"predicate\":\"replyKeyboardHide\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2035021048,\"predicate\":\"replyKeyboardForceReply\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2049074735,\"predicate\":\"replyKeyboardMarkup\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"resize\",\"type\":\"flags.0?true\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"persistent\",\"type\":\"flags.4?true\"},{\"name\":\"rows\",\"type\":\"Vector\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-571955892,\"predicate\":\"inputPeerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-233744186,\"predicate\":\"inputUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":-1148011883,\"predicate\":\"messageEntityUnknown\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-100378723,\"predicate\":\"messageEntityMention\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1868782349,\"predicate\":\"messageEntityHashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1827637959,\"predicate\":\"messageEntityBotCommand\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1859134776,\"predicate\":\"messageEntityUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1692693954,\"predicate\":\"messageEntityEmail\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1117713463,\"predicate\":\"messageEntityBold\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-2106619040,\"predicate\":\"messageEntityItalic\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":681706865,\"predicate\":\"messageEntityCode\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1938967520,\"predicate\":\"messageEntityPre\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":1990644519,\"predicate\":\"messageEntityTextUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":-1877614335,\"predicate\":\"updateShortSentMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":-292807034,\"predicate\":\"inputChannelEmpty\",\"params\":[],\"type\":\"InputChannel\"},{\"id\":-212145112,\"predicate\":\"inputChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":-1566230754,\"predicate\":\"peerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":666680316,\"predicate\":\"inputPeerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-2094689180,\"predicate\":\"channel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"verified\",\"type\":\"flags.7?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"restricted\",\"type\":\"flags.9?true\"},{\"name\":\"signatures\",\"type\":\"flags.11?true\"},{\"name\":\"min\",\"type\":\"flags.12?true\"},{\"name\":\"scam\",\"type\":\"flags.19?true\"},{\"name\":\"has_link\",\"type\":\"flags.20?true\"},{\"name\":\"has_geo\",\"type\":\"flags.21?true\"},{\"name\":\"slowmode_enabled\",\"type\":\"flags.22?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"fake\",\"type\":\"flags.25?true\"},{\"name\":\"gigagroup\",\"type\":\"flags.26?true\"},{\"name\":\"noforwards\",\"type\":\"flags.27?true\"},{\"name\":\"join_to_send\",\"type\":\"flags.28?true\"},{\"name\":\"join_request\",\"type\":\"flags.29?true\"},{\"name\":\"forum\",\"type\":\"flags.30?true\"},{\"name\":\"flags2\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.13?long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"flags.6?string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.9?Vector\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"banned_rights\",\"type\":\"flags.15?ChatBannedRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"},{\"name\":\"participants_count\",\"type\":\"flags.17?int\"},{\"name\":\"usernames\",\"type\":\"flags2.0?Vector\"}],\"type\":\"Chat\"},{\"id\":399807445,\"predicate\":\"channelForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"until_date\",\"type\":\"flags.16?int\"}],\"type\":\"Chat\"},{\"id\":2131196633,\"predicate\":\"contacts.resolvedPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-231385849,\"predicate\":\"channelFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_view_participants\",\"type\":\"flags.3?true\"},{\"name\":\"can_set_username\",\"type\":\"flags.6?true\"},{\"name\":\"can_set_stickers\",\"type\":\"flags.7?true\"},{\"name\":\"hidden_prehistory\",\"type\":\"flags.10?true\"},{\"name\":\"can_set_location\",\"type\":\"flags.16?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.19?true\"},{\"name\":\"can_view_stats\",\"type\":\"flags.20?true\"},{\"name\":\"blocked\",\"type\":\"flags.22?true\"},{\"name\":\"flags2\",\"type\":\"#\"},{\"name\":\"can_delete_channel\",\"type\":\"flags2.0?true\"},{\"name\":\"antispam\",\"type\":\"flags2.1?true\"},{\"name\":\"participants_hidden\",\"type\":\"flags2.2?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants_count\",\"type\":\"flags.0?int\"},{\"name\":\"admins_count\",\"type\":\"flags.1?int\"},{\"name\":\"kicked_count\",\"type\":\"flags.2?int\"},{\"name\":\"banned_count\",\"type\":\"flags.2?int\"},{\"name\":\"online_count\",\"type\":\"flags.13?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chat_photo\",\"type\":\"Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.23?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"Vector\"},{\"name\":\"migrated_from_chat_id\",\"type\":\"flags.4?long\"},{\"name\":\"migrated_from_max_id\",\"type\":\"flags.4?int\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.5?int\"},{\"name\":\"stickerset\",\"type\":\"flags.8?StickerSet\"},{\"name\":\"available_min_id\",\"type\":\"flags.9?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"linked_chat_id\",\"type\":\"flags.14?long\"},{\"name\":\"location\",\"type\":\"flags.15?ChannelLocation\"},{\"name\":\"slowmode_seconds\",\"type\":\"flags.17?int\"},{\"name\":\"slowmode_next_send_date\",\"type\":\"flags.18?int\"},{\"name\":\"stats_dc\",\"type\":\"flags.12?int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"call\",\"type\":\"flags.21?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.24?int\"},{\"name\":\"pending_suggestions\",\"type\":\"flags.25?Vector\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.26?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.27?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.28?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.28?Vector\"},{\"name\":\"default_send_as\",\"type\":\"flags.29?Peer\"},{\"name\":\"available_reactions\",\"type\":\"flags.30?ChatReactions\"}],\"type\":\"ChatFull\"},{\"id\":182649427,\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"id\":-948520370,\"predicate\":\"messages.channelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"topics\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1781355374,\"predicate\":\"messageActionChannelCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":277713951,\"predicate\":\"updateChannelTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1666927625,\"predicate\":\"updateChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1656358105,\"predicate\":\"updateNewChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1842450928,\"predicate\":\"updateReadChannelInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1020437742,\"predicate\":\"updateDeleteChannelMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-232346616,\"predicate\":\"updateChannelMessageViews\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1041346555,\"predicate\":\"updates.channelDifferenceEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1531132162,\"predicate\":\"updates.channelDifferenceTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"dialog\",\"type\":\"Dialog\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":543450958,\"predicate\":\"updates.channelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1798033689,\"predicate\":\"channelMessagesFilterEmpty\",\"params\":[],\"type\":\"ChannelMessagesFilter\"},{\"id\":-847783593,\"predicate\":\"channelMessagesFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_new_messages\",\"type\":\"flags.1?true\"},{\"name\":\"ranges\",\"type\":\"Vector\"}],\"type\":\"ChannelMessagesFilter\"},{\"id\":-1072953408,\"predicate\":\"channelParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":900251559,\"predicate\":\"channelParticipantSelf\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"via_request\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":803602899,\"predicate\":\"channelParticipantCreator\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.0?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":-566281095,\"predicate\":\"channelParticipantsRecent\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1268741783,\"predicate\":\"channelParticipantsAdmins\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1548400251,\"predicate\":\"channelParticipantsKicked\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1699676497,\"predicate\":\"channels.channelParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-541588713,\"predicate\":\"channels.channelParticipant\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":-462696732,\"predicate\":\"chatParticipantCreator\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"ChatParticipant\"},{\"id\":-1600962725,\"predicate\":\"chatParticipantAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-674602590,\"predicate\":\"updateChatParticipantAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"is_admin\",\"type\":\"Bool\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-519864430,\"predicate\":\"messageActionChatMigrateTo\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-365344535,\"predicate\":\"messageActionChannelMigrateFrom\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1328445861,\"predicate\":\"channelParticipantsBots\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":2013922064,\"predicate\":\"help.termsOfService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"DataJSON\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"min_age_confirm\",\"type\":\"flags.1?int\"}],\"type\":\"help.TermsOfService\"},{\"id\":1753886890,\"predicate\":\"updateNewStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"messages.StickerSet\"}],\"type\":\"Update\"},{\"id\":196268545,\"predicate\":\"updateStickerSetsOrder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":834816008,\"predicate\":\"updateStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"}],\"type\":\"Update\"},{\"id\":-402498398,\"predicate\":\"messages.savedGifsNotModified\",\"params\":[],\"type\":\"messages.SavedGifs\"},{\"id\":-2069878259,\"predicate\":\"messages.savedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"gifs\",\"type\":\"Vector\"}],\"type\":\"messages.SavedGifs\"},{\"id\":-1821035490,\"predicate\":\"updateSavedGifs\",\"params\":[],\"type\":\"Update\"},{\"id\":864077702,\"predicate\":\"inputBotInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1036876423,\"predicate\":\"inputBotInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-2000710887,\"predicate\":\"inputBotInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?InputWebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?InputWebDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1984755728,\"predicate\":\"botInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1937807902,\"predicate\":\"botInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":295067450,\"predicate\":\"botInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?WebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?WebDocument\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1803769784,\"predicate\":\"messages.botResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"next_offset\",\"type\":\"flags.1?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.2?InlineBotSwitchPM\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.BotResults\"},{\"id\":1232025500,\"predicate\":\"updateBotInlineQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"peer_type\",\"type\":\"flags.1?InlineQueryPeerType\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":317794823,\"predicate\":\"updateBotInlineSend\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"flags.1?InputBotInlineMessageID\"}],\"type\":\"Update\"},{\"id\":1358283666,\"predicate\":\"inputMessagesFilterVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":928101534,\"predicate\":\"inputMessagesFilterMusic\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1107622874,\"predicate\":\"inputPrivacyKeyChatInvite\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1343122938,\"predicate\":\"privacyKeyChatInvite\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1571494644,\"predicate\":\"exportedMessageLink\",\"params\":[{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"html\",\"type\":\"string\"}],\"type\":\"ExportedMessageLink\"},{\"id\":1601666510,\"predicate\":\"messageFwdHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"imported\",\"type\":\"flags.7?true\"},{\"name\":\"from_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"from_name\",\"type\":\"flags.5?string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"post_author\",\"type\":\"flags.3?string\"},{\"name\":\"saved_from_peer\",\"type\":\"flags.4?Peer\"},{\"name\":\"saved_from_msg_id\",\"type\":\"flags.4?int\"},{\"name\":\"psa_type\",\"type\":\"flags.6?string\"}],\"type\":\"MessageFwdHeader\"},{\"id\":457133559,\"predicate\":\"updateEditChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1799538451,\"predicate\":\"messageActionPinMessage\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":1923290508,\"predicate\":\"auth.codeTypeSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1948046307,\"predicate\":\"auth.codeTypeCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":577556219,\"predicate\":\"auth.codeTypeFlashCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1035688326,\"predicate\":\"auth.sentCodeTypeApp\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1073693790,\"predicate\":\"auth.sentCodeTypeSms\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1398007207,\"predicate\":\"auth.sentCodeTypeCall\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1425815847,\"predicate\":\"auth.sentCodeTypeFlashCall\",\"params\":[{\"name\":\"pattern\",\"type\":\"string\"}],\"type\":\"auth.SentCodeType\"},{\"id\":629866245,\"predicate\":\"keyboardButtonUrl\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":901503851,\"predicate\":\"keyboardButtonCallback\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requires_password\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"KeyboardButton\"},{\"id\":-1318425559,\"predicate\":\"keyboardButtonRequestPhone\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-59151553,\"predicate\":\"keyboardButtonRequestGeoLocation\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":90744648,\"predicate\":\"keyboardButtonSwitchInline\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"same_peer\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"query\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1218642516,\"predicate\":\"replyInlineMarkup\",\"params\":[{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"ReplyMarkup\"},{\"id\":911761060,\"predicate\":\"messages.botCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"has_url\",\"type\":\"flags.3?true\"},{\"name\":\"native_ui\",\"type\":\"flags.4?true\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-1177566067,\"predicate\":\"updateBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":649453030,\"predicate\":\"messages.messageEditData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"flags.0?true\"}],\"type\":\"messages.MessageEditData\"},{\"id\":-469536605,\"predicate\":\"updateEditMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1768777083,\"predicate\":\"inputBotInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1098628881,\"predicate\":\"inputBotInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-1494368259,\"predicate\":\"inputBotInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":85477117,\"predicate\":\"botInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1970903652,\"predicate\":\"botInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":416402882,\"predicate\":\"botInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1462213465,\"predicate\":\"inputBotInlineResultPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"InputPhoto\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":-459324,\"predicate\":\"inputBotInlineResultDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":400266251,\"predicate\":\"botInlineMediaResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1995686519,\"predicate\":\"inputBotInlineMessageID\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":1763610706,\"predicate\":\"updateInlineBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"msg_id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":1008755359,\"predicate\":\"inlineBotSwitchPM\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"InlineBotSwitchPM\"},{\"id\":863093588,\"predicate\":\"messages.peerDialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-305282981,\"predicate\":\"topPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"rating\",\"type\":\"double\"}],\"type\":\"TopPeer\"},{\"id\":-1419371685,\"predicate\":\"topPeerCategoryBotsPM\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":344356834,\"predicate\":\"topPeerCategoryBotsInline\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":104314861,\"predicate\":\"topPeerCategoryCorrespondents\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-1122524854,\"predicate\":\"topPeerCategoryGroups\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":371037736,\"predicate\":\"topPeerCategoryChannels\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-75283823,\"predicate\":\"topPeerCategoryPeers\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"TopPeerCategoryPeers\"},{\"id\":-567906571,\"predicate\":\"contacts.topPeersNotModified\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":1891070632,\"predicate\":\"contacts.topPeers\",\"params\":[{\"name\":\"categories\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.TopPeers\"},{\"id\":-595914432,\"predicate\":\"messageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":546203849,\"predicate\":\"inputMessageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"MessageEntity\"},{\"id\":975236280,\"predicate\":\"inputMessagesFilterChatPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1218471511,\"predicate\":\"updateReadChannelOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":457829485,\"predicate\":\"updateDraftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"DraftMessage\"}],\"type\":\"Update\"},{\"id\":453805082,\"predicate\":\"draftMessageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"flags.0?int\"}],\"type\":\"DraftMessage\"},{\"id\":-40996577,\"predicate\":\"draftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"DraftMessage\"},{\"id\":-1615153660,\"predicate\":\"messageActionHistoryClear\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-958657434,\"predicate\":\"messages.featuredStickersNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-1103615738,\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"premium\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"},{\"name\":\"unread\",\"type\":\"Vector\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1461528386,\"predicate\":\"updateReadFeaturedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":186120336,\"predicate\":\"messages.recentStickersNotModified\",\"params\":[],\"type\":\"messages.RecentStickers\"},{\"id\":-1999405994,\"predicate\":\"messages.recentStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"dates\",\"type\":\"Vector\"}],\"type\":\"messages.RecentStickers\"},{\"id\":-1706939360,\"predicate\":\"updateRecentStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":1338747336,\"predicate\":\"messages.archivedStickers\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":946083368,\"predicate\":\"messages.stickerSetInstallResultSuccess\",\"params\":[],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":904138920,\"predicate\":\"messages.stickerSetInstallResultArchive\",\"params\":[{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":1678812626,\"predicate\":\"stickerSetCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"cover\",\"type\":\"Document\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1574314746,\"predicate\":\"updateConfig\",\"params\":[],\"type\":\"Update\"},{\"id\":861169551,\"predicate\":\"updatePtsChanged\",\"params\":[],\"type\":\"Update\"},{\"id\":-440664550,\"predicate\":\"inputMediaPhotoExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.1?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-78455655,\"predicate\":\"inputMediaDocumentExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.1?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":872932635,\"predicate\":\"stickerSetMultiCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"covers\",\"type\":\"Vector\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1361650766,\"predicate\":\"maskCoords\",\"params\":[{\"name\":\"n\",\"type\":\"int\"},{\"name\":\"x\",\"type\":\"double\"},{\"name\":\"y\",\"type\":\"double\"},{\"name\":\"zoom\",\"type\":\"double\"}],\"type\":\"MaskCoords\"},{\"id\":-1744710921,\"predicate\":\"documentAttributeHasStickers\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1251549527,\"predicate\":\"inputStickeredMediaPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputStickeredMedia\"},{\"id\":70813275,\"predicate\":\"inputStickeredMediaDocument\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"}],\"type\":\"InputStickeredMedia\"},{\"id\":-1107729093,\"predicate\":\"game\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"}],\"type\":\"Game\"},{\"id\":1336154098,\"predicate\":\"inputBotInlineResultGame\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1262639204,\"predicate\":\"inputBotInlineMessageGame\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-38694904,\"predicate\":\"messageMediaGame\",\"params\":[{\"name\":\"game\",\"type\":\"Game\"}],\"type\":\"MessageMedia\"},{\"id\":-750828557,\"predicate\":\"inputMediaGame\",\"params\":[{\"name\":\"id\",\"type\":\"InputGame\"}],\"type\":\"InputMedia\"},{\"id\":53231223,\"predicate\":\"inputGameID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGame\"},{\"id\":-1020139510,\"predicate\":\"inputGameShortName\",\"params\":[{\"name\":\"bot_id\",\"type\":\"InputUser\"},{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputGame\"},{\"id\":1358175439,\"predicate\":\"keyboardButtonGame\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1834538890,\"predicate\":\"messageActionGameScore\",\"params\":[{\"name\":\"game_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":1940093419,\"predicate\":\"highScore\",\"params\":[{\"name\":\"pos\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"HighScore\"},{\"id\":-1707344487,\"predicate\":\"messages.highScores\",\"params\":[{\"name\":\"scores\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.HighScores\"},{\"id\":1258196845,\"predicate\":\"updates.differenceTooLong\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":791390623,\"predicate\":\"updateChannelWebPage\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1663561404,\"predicate\":\"messages.chatsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-599948721,\"predicate\":\"textEmpty\",\"params\":[],\"type\":\"RichText\"},{\"id\":1950782688,\"predicate\":\"textPlain\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":1730456516,\"predicate\":\"textBold\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-653089380,\"predicate\":\"textItalic\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1054465340,\"predicate\":\"textUnderline\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1678197867,\"predicate\":\"textStrike\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1816074681,\"predicate\":\"textFixed\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1009288385,\"predicate\":\"textUrl\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"}],\"type\":\"RichText\"},{\"id\":-564523562,\"predicate\":\"textEmail\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":2120376535,\"predicate\":\"textConcat\",\"params\":[{\"name\":\"texts\",\"type\":\"Vector\"}],\"type\":\"RichText\"},{\"id\":324435594,\"predicate\":\"pageBlockUnsupported\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":1890305021,\"predicate\":\"pageBlockTitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1879401953,\"predicate\":\"pageBlockSubtitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1162877472,\"predicate\":\"pageBlockAuthorDate\",\"params\":[{\"name\":\"author\",\"type\":\"RichText\"},{\"name\":\"published_date\",\"type\":\"int\"}],\"type\":\"PageBlock\"},{\"id\":-1076861716,\"predicate\":\"pageBlockHeader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-248793375,\"predicate\":\"pageBlockSubheader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1182402406,\"predicate\":\"pageBlockParagraph\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1066346178,\"predicate\":\"pageBlockPreformatted\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":1216809369,\"predicate\":\"pageBlockFooter\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-618614392,\"predicate\":\"pageBlockDivider\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":-837994576,\"predicate\":\"pageBlockAnchor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":-454524911,\"predicate\":\"pageBlockList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":641563686,\"predicate\":\"pageBlockBlockquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1329878739,\"predicate\":\"pageBlockPullquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":391759200,\"predicate\":\"pageBlockPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"},{\"name\":\"url\",\"type\":\"flags.0?string\"},{\"name\":\"webpage_id\",\"type\":\"flags.0?long\"}],\"type\":\"PageBlock\"},{\"id\":2089805750,\"predicate\":\"pageBlockVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autoplay\",\"type\":\"flags.0?true\"},{\"name\":\"loop\",\"type\":\"flags.1?true\"},{\"name\":\"video_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":972174080,\"predicate\":\"pageBlockCover\",\"params\":[{\"name\":\"cover\",\"type\":\"PageBlock\"}],\"type\":\"PageBlock\"},{\"id\":-1468953147,\"predicate\":\"pageBlockEmbed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"full_width\",\"type\":\"flags.0?true\"},{\"name\":\"allow_scrolling\",\"type\":\"flags.3?true\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"html\",\"type\":\"flags.2?string\"},{\"name\":\"poster_photo_id\",\"type\":\"flags.4?long\"},{\"name\":\"w\",\"type\":\"flags.5?int\"},{\"name\":\"h\",\"type\":\"flags.5?int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-229005301,\"predicate\":\"pageBlockEmbedPost\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"author_photo_id\",\"type\":\"long\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1705048653,\"predicate\":\"pageBlockCollage\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":52401552,\"predicate\":\"pageBlockSlideshow\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1930545681,\"predicate\":\"webPageNotModified\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"cached_page_views\",\"type\":\"flags.0?int\"}],\"type\":\"WebPage\"},{\"id\":-88417185,\"predicate\":\"inputPrivacyKeyPhoneCall\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1030105979,\"predicate\":\"privacyKeyPhoneCall\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-580219064,\"predicate\":\"sendMessageGamePlayAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-2048646399,\"predicate\":\"phoneCallDiscardReasonMissed\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-527056480,\"predicate\":\"phoneCallDiscardReasonDisconnect\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1471006352,\"predicate\":\"phoneCallDiscardReasonHangup\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-84416311,\"predicate\":\"phoneCallDiscardReasonBusy\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1852826908,\"predicate\":\"updateDialogPinned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-99664734,\"predicate\":\"updatePinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"order\",\"type\":\"flags.0?Vector\"}],\"type\":\"Update\"},{\"id\":2104790276,\"predicate\":\"dataJSON\",\"params\":[{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"DataJSON\"},{\"id\":-2095595325,\"predicate\":\"updateBotWebhookJSON\",\"params\":[{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-1684914010,\"predicate\":\"updateBotWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"},{\"name\":\"timeout\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-886477832,\"predicate\":\"labeledPrice\",\"params\":[{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"LabeledPrice\"},{\"id\":1048946971,\"predicate\":\"invoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"test\",\"type\":\"flags.0?true\"},{\"name\":\"name_requested\",\"type\":\"flags.1?true\"},{\"name\":\"phone_requested\",\"type\":\"flags.2?true\"},{\"name\":\"email_requested\",\"type\":\"flags.3?true\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.4?true\"},{\"name\":\"flexible\",\"type\":\"flags.5?true\"},{\"name\":\"phone_to_provider\",\"type\":\"flags.6?true\"},{\"name\":\"email_to_provider\",\"type\":\"flags.7?true\"},{\"name\":\"recurring\",\"type\":\"flags.9?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"},{\"name\":\"max_tip_amount\",\"type\":\"flags.8?long\"},{\"name\":\"suggested_tip_amounts\",\"type\":\"flags.8?Vector\"},{\"name\":\"recurring_terms_url\",\"type\":\"flags.9?string\"}],\"type\":\"Invoice\"},{\"id\":-1900697899,\"predicate\":\"inputMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"start_param\",\"type\":\"flags.1?string\"},{\"name\":\"extended_media\",\"type\":\"flags.2?InputMedia\"}],\"type\":\"InputMedia\"},{\"id\":-368917890,\"predicate\":\"paymentCharge\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"provider_charge_id\",\"type\":\"string\"}],\"type\":\"PaymentCharge\"},{\"id\":-1892568281,\"predicate\":\"messageActionPaymentSentMe\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recurring_init\",\"type\":\"flags.2?true\"},{\"name\":\"recurring_used\",\"type\":\"flags.3?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"charge\",\"type\":\"PaymentCharge\"}],\"type\":\"MessageAction\"},{\"id\":-156940077,\"predicate\":\"messageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"receipt_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"},{\"name\":\"extended_media\",\"type\":\"flags.4?MessageExtendedMedia\"}],\"type\":\"MessageMedia\"},{\"id\":512535275,\"predicate\":\"postAddress\",\"params\":[{\"name\":\"street_line1\",\"type\":\"string\"},{\"name\":\"street_line2\",\"type\":\"string\"},{\"name\":\"city\",\"type\":\"string\"},{\"name\":\"state\",\"type\":\"string\"},{\"name\":\"country_iso2\",\"type\":\"string\"},{\"name\":\"post_code\",\"type\":\"string\"}],\"type\":\"PostAddress\"},{\"id\":-1868808300,\"predicate\":\"paymentRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"flags.0?string\"},{\"name\":\"phone\",\"type\":\"flags.1?string\"},{\"name\":\"email\",\"type\":\"flags.2?string\"},{\"name\":\"shipping_address\",\"type\":\"flags.3?PostAddress\"}],\"type\":\"PaymentRequestedInfo\"},{\"id\":-1344716869,\"predicate\":\"keyboardButtonBuy\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1776926890,\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recurring_init\",\"type\":\"flags.2?true\"},{\"name\":\"recurring_used\",\"type\":\"flags.3?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"invoice_slug\",\"type\":\"flags.0?string\"}],\"type\":\"MessageAction\"},{\"id\":-842892769,\"predicate\":\"paymentSavedCredentialsCard\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentSavedCredentials\"},{\"id\":475467473,\"predicate\":\"webDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":-1678949555,\"predicate\":\"inputWebDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"InputWebDocument\"},{\"id\":-1036396922,\"predicate\":\"inputWebFileLocation\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWebFileLocation\"},{\"id\":568808380,\"predicate\":\"upload.webFile\",\"params\":[{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"file_type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.WebFile\"},{\"id\":-1610250415,\"predicate\":\"payments.paymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_save_credentials\",\"type\":\"flags.2?true\"},{\"name\":\"password_missing\",\"type\":\"flags.3?true\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.5?WebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"native_provider\",\"type\":\"flags.4?string\"},{\"name\":\"native_params\",\"type\":\"flags.4?DataJSON\"},{\"name\":\"additional_methods\",\"type\":\"flags.6?Vector\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentForm\"},{\"id\":-784000893,\"predicate\":\"payments.validatedRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":1314881805,\"predicate\":\"payments.paymentResult\",\"params\":[{\"name\":\"updates\",\"type\":\"Updates\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1891958275,\"predicate\":\"payments.paymentReceipt\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.2?WebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping\",\"type\":\"flags.1?ShippingOption\"},{\"name\":\"tip_amount\",\"type\":\"flags.3?long\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"credentials_title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-74456004,\"predicate\":\"payments.savedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_saved_credentials\",\"type\":\"flags.1?true\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"}],\"type\":\"payments.SavedInfo\"},{\"id\":-1056001329,\"predicate\":\"inputPaymentCredentialsSaved\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"tmp_password\",\"type\":\"bytes\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":873977640,\"predicate\":\"inputPaymentCredentials\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-614138572,\"predicate\":\"account.tmpPassword\",\"params\":[{\"name\":\"tmp_password\",\"type\":\"bytes\"},{\"name\":\"valid_until\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":-1239335713,\"predicate\":\"shippingOption\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"}],\"type\":\"ShippingOption\"},{\"id\":-1246823043,\"predicate\":\"updateBotShippingQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"shipping_address\",\"type\":\"PostAddress\"}],\"type\":\"Update\"},{\"id\":-1934976362,\"predicate\":\"updateBotPrecheckoutQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-6249322,\"predicate\":\"inputStickerSetItem\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"emoji\",\"type\":\"string\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"InputStickerSetItem\"},{\"id\":-1425052898,\"predicate\":\"updatePhoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"}],\"type\":\"Update\"},{\"id\":506920429,\"predicate\":\"inputPhoneCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPhoneCall\"},{\"id\":1399245077,\"predicate\":\"phoneCallEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"PhoneCall\"},{\"id\":-987599081,\"predicate\":\"phoneCallWaiting\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"receive_date\",\"type\":\"flags.0?int\"}],\"type\":\"PhoneCall\"},{\"id\":347139340,\"predicate\":\"phoneCallRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":912311057,\"predicate\":\"phoneCallAccepted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":-1770029977,\"predicate\":\"phoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"p2p_allowed\",\"type\":\"flags.5?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"connections\",\"type\":\"Vector\"},{\"name\":\"start_date\",\"type\":\"int\"}],\"type\":\"PhoneCall\"},{\"id\":1355435489,\"predicate\":\"phoneCallDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"need_rating\",\"type\":\"flags.2?true\"},{\"name\":\"need_debug\",\"type\":\"flags.3?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"PhoneCall\"},{\"id\":-1665063993,\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"tcp\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"peer_tag\",\"type\":\"bytes\"}],\"type\":\"PhoneConnection\"},{\"id\":-58224696,\"predicate\":\"phoneCallProtocol\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"udp_p2p\",\"type\":\"flags.0?true\"},{\"name\":\"udp_reflector\",\"type\":\"flags.1?true\"},{\"name\":\"min_layer\",\"type\":\"int\"},{\"name\":\"max_layer\",\"type\":\"int\"},{\"name\":\"library_versions\",\"type\":\"Vector\"}],\"type\":\"PhoneCallProtocol\"},{\"id\":-326966976,\"predicate\":\"phone.phoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.PhoneCall\"},{\"id\":-2134272152,\"predicate\":\"inputMessagesFilterPhoneCalls\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"missed\",\"type\":\"flags.0?true\"}],\"type\":\"MessagesFilter\"},{\"id\":-2132731265,\"predicate\":\"messageActionPhoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call_id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"MessageAction\"},{\"id\":2054952868,\"predicate\":\"inputMessagesFilterRoundVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1253451181,\"predicate\":\"inputMessagesFilterRoundVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1997373508,\"predicate\":\"sendMessageRecordRoundAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":608050278,\"predicate\":\"sendMessageUploadRoundAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-242427324,\"predicate\":\"upload.fileCdnRedirect\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"encryption_key\",\"type\":\"bytes\"},{\"name\":\"encryption_iv\",\"type\":\"bytes\"},{\"name\":\"file_hashes\",\"type\":\"Vector\"}],\"type\":\"upload.File\"},{\"id\":-290921362,\"predicate\":\"upload.cdnFileReuploadNeeded\",\"params\":[{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1449145777,\"predicate\":\"upload.cdnFile\",\"params\":[{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-914167110,\"predicate\":\"cdnPublicKey\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"CdnPublicKey\"},{\"id\":1462101002,\"predicate\":\"cdnConfig\",\"params\":[{\"name\":\"public_keys\",\"type\":\"Vector\"}],\"type\":\"CdnConfig\"},{\"id\":-283684427,\"predicate\":\"pageBlockChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"Chat\"}],\"type\":\"PageBlock\"},{\"id\":-892239370,\"predicate\":\"langPackString\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":1816636575,\"predicate\":\"langPackStringPluralized\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"zero_value\",\"type\":\"flags.0?string\"},{\"name\":\"one_value\",\"type\":\"flags.1?string\"},{\"name\":\"two_value\",\"type\":\"flags.2?string\"},{\"name\":\"few_value\",\"type\":\"flags.3?string\"},{\"name\":\"many_value\",\"type\":\"flags.4?string\"},{\"name\":\"other_value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":695856818,\"predicate\":\"langPackStringDeleted\",\"params\":[{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":-209337866,\"predicate\":\"langPackDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"strings\",\"type\":\"Vector\"}],\"type\":\"LangPackDifference\"},{\"id\":-288727837,\"predicate\":\"langPackLanguage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"official\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.2?true\"},{\"name\":\"beta\",\"type\":\"flags.3?true\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"native_name\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"base_lang_code\",\"type\":\"flags.1?string\"},{\"name\":\"plural_code\",\"type\":\"string\"},{\"name\":\"strings_count\",\"type\":\"int\"},{\"name\":\"translated_count\",\"type\":\"int\"},{\"name\":\"translations_url\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":1180041828,\"predicate\":\"updateLangPackTooLong\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1442983757,\"predicate\":\"updateLangPack\",\"params\":[{\"name\":\"difference\",\"type\":\"LangPackDifference\"}],\"type\":\"Update\"},{\"id\":885242707,\"predicate\":\"channelParticipantAdmin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_edit\",\"type\":\"flags.0?true\"},{\"name\":\"self\",\"type\":\"flags.1?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"flags.1?long\"},{\"name\":\"promoted_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.2?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":1844969806,\"predicate\":\"channelParticipantBanned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"left\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"kicked_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelParticipant\"},{\"id\":338142689,\"predicate\":\"channelParticipantsBanned\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":106343499,\"predicate\":\"channelParticipantsSearch\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-421545947,\"predicate\":\"channelAdminLogEventActionChangeTitle\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1427671598,\"predicate\":\"channelAdminLogEventActionChangeAbout\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1783299128,\"predicate\":\"channelAdminLogEventActionChangeUsername\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1129042607,\"predicate\":\"channelAdminLogEventActionChangePhoto\",\"params\":[{\"name\":\"prev_photo\",\"type\":\"Photo\"},{\"name\":\"new_photo\",\"type\":\"Photo\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":460916654,\"predicate\":\"channelAdminLogEventActionToggleInvites\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":648939889,\"predicate\":\"channelAdminLogEventActionToggleSignatures\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-370660328,\"predicate\":\"channelAdminLogEventActionUpdatePinned\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1889215493,\"predicate\":\"channelAdminLogEventActionEditMessage\",\"params\":[{\"name\":\"prev_message\",\"type\":\"Message\"},{\"name\":\"new_message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1121994683,\"predicate\":\"channelAdminLogEventActionDeleteMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":405815507,\"predicate\":\"channelAdminLogEventActionParticipantJoin\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-124291086,\"predicate\":\"channelAdminLogEventActionParticipantLeave\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-484690728,\"predicate\":\"channelAdminLogEventActionParticipantInvite\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-422036098,\"predicate\":\"channelAdminLogEventActionParticipantToggleBan\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-714643696,\"predicate\":\"channelAdminLogEventActionParticipantToggleAdmin\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":531458253,\"predicate\":\"channelAdminLogEvent\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"ChannelAdminLogEventAction\"}],\"type\":\"ChannelAdminLogEvent\"},{\"id\":-309659827,\"predicate\":\"channels.adminLogResults\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-368018716,\"predicate\":\"channelAdminLogEventsFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join\",\"type\":\"flags.0?true\"},{\"name\":\"leave\",\"type\":\"flags.1?true\"},{\"name\":\"invite\",\"type\":\"flags.2?true\"},{\"name\":\"ban\",\"type\":\"flags.3?true\"},{\"name\":\"unban\",\"type\":\"flags.4?true\"},{\"name\":\"kick\",\"type\":\"flags.5?true\"},{\"name\":\"unkick\",\"type\":\"flags.6?true\"},{\"name\":\"promote\",\"type\":\"flags.7?true\"},{\"name\":\"demote\",\"type\":\"flags.8?true\"},{\"name\":\"info\",\"type\":\"flags.9?true\"},{\"name\":\"settings\",\"type\":\"flags.10?true\"},{\"name\":\"pinned\",\"type\":\"flags.11?true\"},{\"name\":\"edit\",\"type\":\"flags.12?true\"},{\"name\":\"delete\",\"type\":\"flags.13?true\"},{\"name\":\"group_call\",\"type\":\"flags.14?true\"},{\"name\":\"invites\",\"type\":\"flags.15?true\"},{\"name\":\"send\",\"type\":\"flags.16?true\"},{\"name\":\"forums\",\"type\":\"flags.17?true\"}],\"type\":\"ChannelAdminLogEventsFilter\"},{\"id\":511092620,\"predicate\":\"topPeerCategoryPhoneCalls\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-2143067670,\"predicate\":\"pageBlockAudio\",\"params\":[{\"name\":\"audio_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1558266229,\"predicate\":\"popularContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"importers\",\"type\":\"int\"}],\"type\":\"PopularContact\"},{\"id\":1200788123,\"predicate\":\"messageActionScreenshotTaken\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1634752813,\"predicate\":\"messages.favedStickersNotModified\",\"params\":[],\"type\":\"messages.FavedStickers\"},{\"id\":750063767,\"predicate\":\"messages.favedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-451831443,\"predicate\":\"updateFavedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-366410403,\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1040652646,\"predicate\":\"inputMessagesFilterMyMentions\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1887741886,\"predicate\":\"updateContactsReset\",\"params\":[],\"type\":\"Update\"},{\"id\":-1312568665,\"predicate\":\"channelAdminLogEventActionChangeStickerSet\",\"params\":[{\"name\":\"prev_stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"new_stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-85549226,\"predicate\":\"messageActionCustomAction\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":178373535,\"predicate\":\"inputPaymentCredentialsApplePay\",\"params\":[{\"name\":\"payment_data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-419271411,\"predicate\":\"inputMessagesFilterGeo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-530392189,\"predicate\":\"inputMessagesFilterContacts\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1304443240,\"predicate\":\"updateChannelAvailableMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"available_min_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1599903217,\"predicate\":\"channelAdminLogEventActionTogglePreHistoryHidden\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1759532989,\"predicate\":\"inputMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"stopped\",\"type\":\"flags.0?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.2?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"}],\"type\":\"InputMedia\"},{\"id\":-1186937242,\"predicate\":\"messageMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.1?int\"}],\"type\":\"MessageMedia\"},{\"id\":1189204285,\"predicate\":\"recentMeUrlUnknown\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1188296222,\"predicate\":\"recentMeUrlUser\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1294306862,\"predicate\":\"recentMeUrlChat\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-347535331,\"predicate\":\"recentMeUrlChatInvite\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_invite\",\"type\":\"ChatInvite\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1140172836,\"predicate\":\"recentMeUrlStickerSet\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"set\",\"type\":\"StickerSetCovered\"}],\"type\":\"RecentMeUrl\"},{\"id\":235081943,\"predicate\":\"help.recentMeUrls\",\"params\":[{\"name\":\"urls\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":-266911767,\"predicate\":\"channels.channelParticipantsNotModified\",\"params\":[],\"type\":\"channels.ChannelParticipants\"},{\"id\":1951620897,\"predicate\":\"messages.messagesNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":482797855,\"predicate\":\"inputSingleMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.0?Vector\"}],\"type\":\"InputSingleMedia\"},{\"id\":-1493633966,\"predicate\":\"webAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"domain\",\"type\":\"string\"},{\"name\":\"browser\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"WebAuthorization\"},{\"id\":-313079300,\"predicate\":\"account.webAuthorizations\",\"params\":[{\"name\":\"authorizations\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.WebAuthorizations\"},{\"id\":-1502174430,\"predicate\":\"inputMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-1160215659,\"predicate\":\"inputMessageReplyTo\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-2037963464,\"predicate\":\"inputMessagePinned\",\"params\":[],\"type\":\"InputMessage\"},{\"id\":-1687559349,\"predicate\":\"messageEntityPhone\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1280209983,\"predicate\":\"messageEntityCashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1410748418,\"predicate\":\"messageActionBotAllowed\",\"params\":[{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-55902537,\"predicate\":\"inputDialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputDialogPeer\"},{\"id\":-445792507,\"predicate\":\"dialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"DialogPeer\"},{\"id\":223655517,\"predicate\":\"messages.foundStickerSetsNotModified\",\"params\":[],\"type\":\"messages.FoundStickerSets\"},{\"id\":-1963942446,\"predicate\":\"messages.foundStickerSets\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":-207944868,\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"FileHash\"},{\"id\":-104284986,\"predicate\":\"webDocumentNoProxy\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":1968737087,\"predicate\":\"inputClientProxy\",\"params\":[{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"}],\"type\":\"InputClientProxy\"},{\"id\":-483352705,\"predicate\":\"help.termsOfServiceUpdateEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":686618977,\"predicate\":\"help.termsOfServiceUpdate\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"terms_of_service\",\"type\":\"help.TermsOfService\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":859091184,\"predicate\":\"inputSecureFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"InputSecureFile\"},{\"id\":1399317950,\"predicate\":\"inputSecureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputSecureFile\"},{\"id\":-876089816,\"predicate\":\"inputSecureFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":1679398724,\"predicate\":\"secureFileEmpty\",\"params\":[],\"type\":\"SecureFile\"},{\"id\":2097791614,\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"long\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureFile\"},{\"id\":-1964327229,\"predicate\":\"secureData\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureData\"},{\"id\":2103482845,\"predicate\":\"securePlainPhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":569137759,\"predicate\":\"securePlainEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":-1658158621,\"predicate\":\"secureValueTypePersonalDetails\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":1034709504,\"predicate\":\"secureValueTypePassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":115615172,\"predicate\":\"secureValueTypeDriverLicense\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1596951477,\"predicate\":\"secureValueTypeIdentityCard\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1717268701,\"predicate\":\"secureValueTypeInternalPassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-874308058,\"predicate\":\"secureValueTypeAddress\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-63531698,\"predicate\":\"secureValueTypeUtilityBill\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1995211763,\"predicate\":\"secureValueTypeBankStatement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1954007928,\"predicate\":\"secureValueTypeRentalAgreement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1713143702,\"predicate\":\"secureValueTypePassportRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-368907213,\"predicate\":\"secureValueTypeTemporaryRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1289704741,\"predicate\":\"secureValueTypePhone\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1908627474,\"predicate\":\"secureValueTypeEmail\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":411017418,\"predicate\":\"secureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?SecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?SecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?SecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValue\"},{\"id\":-618540889,\"predicate\":\"inputSecureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?InputSecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?InputSecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?InputSecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"}],\"type\":\"InputSecureValue\"},{\"id\":-316748368,\"predicate\":\"secureValueHash\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValueHash\"},{\"id\":-391902247,\"predicate\":\"secureValueErrorData\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"field\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":12467706,\"predicate\":\"secureValueErrorFrontSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2037765467,\"predicate\":\"secureValueErrorReverseSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-449327402,\"predicate\":\"secureValueErrorSelfie\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":2054162547,\"predicate\":\"secureValueErrorFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":1717706985,\"predicate\":\"secureValueErrorFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":871426631,\"predicate\":\"secureCredentialsEncrypted\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureCredentialsEncrypted\"},{\"id\":-1389486888,\"predicate\":\"account.authorizationForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"required_types\",\"type\":\"Vector\"},{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"errors\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"privacy_policy_url\",\"type\":\"flags.0?string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-2128640689,\"predicate\":\"account.sentEmailCode\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"account.SentEmailCode\"},{\"id\":455635795,\"predicate\":\"messageActionSecureValuesSentMe\",\"params\":[{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"MessageAction\"},{\"id\":-648257196,\"predicate\":\"messageActionSecureValuesSent\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":1722786150,\"predicate\":\"help.deepLinkInfoEmpty\",\"params\":[],\"type\":\"help.DeepLinkInfo\"},{\"id\":1783556146,\"predicate\":\"help.deepLinkInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"update_app\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":289586518,\"predicate\":\"savedPhoneContact\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"SavedContact\"},{\"id\":1304052993,\"predicate\":\"account.takeout\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"account.Takeout\"},{\"id\":700340377,\"predicate\":\"inputTakeoutFileLocation\",\"params\":[],\"type\":\"InputFileLocation\"},{\"id\":-513517117,\"predicate\":\"updateDialogUnreadMark\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-253500010,\"predicate\":\"messages.dialogsNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1625153079,\"predicate\":\"inputWebFileGeoPointLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"}],\"type\":\"InputWebFileLocation\"},{\"id\":-1255369827,\"predicate\":\"contacts.topPeersDisabled\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":-1685456582,\"predicate\":\"inputReportReasonCopyright\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-732254058,\"predicate\":\"passwordKdfAlgoUnknown\",\"params\":[],\"type\":\"PasswordKdfAlgo\"},{\"id\":4883767,\"predicate\":\"securePasswordKdfAlgoUnknown\",\"params\":[],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-1141711456,\"predicate\":\"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-2042159726,\"predicate\":\"securePasswordKdfAlgoSHA512\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":354925740,\"predicate\":\"secureSecretSettings\",\"params\":[{\"name\":\"secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_secret\",\"type\":\"bytes\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureSecretSettings\"},{\"id\":982592842,\"predicate\":\"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow\",\"params\":[{\"name\":\"salt1\",\"type\":\"bytes\"},{\"name\":\"salt2\",\"type\":\"bytes\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"}],\"type\":\"PasswordKdfAlgo\"},{\"id\":-1736378792,\"predicate\":\"inputCheckPasswordEmpty\",\"params\":[],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-763367294,\"predicate\":\"inputCheckPasswordSRP\",\"params\":[{\"name\":\"srp_id\",\"type\":\"long\"},{\"name\":\"A\",\"type\":\"bytes\"},{\"name\":\"M1\",\"type\":\"bytes\"}],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-2036501105,\"predicate\":\"secureValueError\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-1592506512,\"predicate\":\"secureValueErrorTranslationFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":878931416,\"predicate\":\"secureValueErrorTranslationFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2103600678,\"predicate\":\"secureRequiredType\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"native_names\",\"type\":\"flags.0?true\"},{\"name\":\"selfie_required\",\"type\":\"flags.1?true\"},{\"name\":\"translation_required\",\"type\":\"flags.2?true\"},{\"name\":\"type\",\"type\":\"SecureValueType\"}],\"type\":\"SecureRequiredType\"},{\"id\":41187252,\"predicate\":\"secureRequiredTypeOneOf\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"SecureRequiredType\"},{\"id\":-1078332329,\"predicate\":\"help.passportConfigNotModified\",\"params\":[],\"type\":\"help.PassportConfig\"},{\"id\":-1600596305,\"predicate\":\"help.passportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"countries_langs\",\"type\":\"DataJSON\"}],\"type\":\"help.PassportConfig\"},{\"id\":488313413,\"predicate\":\"inputAppEvent\",\"params\":[{\"name\":\"time\",\"type\":\"double\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"peer\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"JSONValue\"}],\"type\":\"InputAppEvent\"},{\"id\":-1059185703,\"predicate\":\"jsonObjectValue\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"JSONValue\"}],\"type\":\"JSONObjectValue\"},{\"id\":1064139624,\"predicate\":\"jsonNull\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":-952869270,\"predicate\":\"jsonBool\",\"params\":[{\"name\":\"value\",\"type\":\"Bool\"}],\"type\":\"JSONValue\"},{\"id\":736157604,\"predicate\":\"jsonNumber\",\"params\":[{\"name\":\"value\",\"type\":\"double\"}],\"type\":\"JSONValue\"},{\"id\":-1222740358,\"predicate\":\"jsonString\",\"params\":[{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"JSONValue\"},{\"id\":-146520221,\"predicate\":\"jsonArray\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":-1715350371,\"predicate\":\"jsonObject\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":-1311015810,\"predicate\":\"inputNotifyBroadcasts\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-703403793,\"predicate\":\"notifyBroadcasts\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-311786236,\"predicate\":\"textSubscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-939827711,\"predicate\":\"textSuperscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":55281185,\"predicate\":\"textMarked\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":483104362,\"predicate\":\"textPhone\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":136105807,\"predicate\":\"textImage\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"RichText\"},{\"id\":504660880,\"predicate\":\"pageBlockKicker\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":878078826,\"predicate\":\"pageTableCell\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"header\",\"type\":\"flags.0?true\"},{\"name\":\"align_center\",\"type\":\"flags.3?true\"},{\"name\":\"align_right\",\"type\":\"flags.4?true\"},{\"name\":\"valign_middle\",\"type\":\"flags.5?true\"},{\"name\":\"valign_bottom\",\"type\":\"flags.6?true\"},{\"name\":\"text\",\"type\":\"flags.7?RichText\"},{\"name\":\"colspan\",\"type\":\"flags.1?int\"},{\"name\":\"rowspan\",\"type\":\"flags.2?int\"}],\"type\":\"PageTableCell\"},{\"id\":-524237339,\"predicate\":\"pageTableRow\",\"params\":[{\"name\":\"cells\",\"type\":\"Vector\"}],\"type\":\"PageTableRow\"},{\"id\":-1085412734,\"predicate\":\"pageBlockTable\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bordered\",\"type\":\"flags.0?true\"},{\"name\":\"striped\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":1869903447,\"predicate\":\"pageCaption\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"credit\",\"type\":\"RichText\"}],\"type\":\"PageCaption\"},{\"id\":-1188055347,\"predicate\":\"pageListItemText\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListItem\"},{\"id\":635466748,\"predicate\":\"pageListItemBlocks\",\"params\":[{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListItem\"},{\"id\":1577484359,\"predicate\":\"pageListOrderedItemText\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1730311882,\"predicate\":\"pageListOrderedItemBlocks\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1702174239,\"predicate\":\"pageBlockOrderedList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":1987480557,\"predicate\":\"pageBlockDetails\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"open\",\"type\":\"flags.0?true\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1282352120,\"predicate\":\"pageRelatedArticle\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"photo_id\",\"type\":\"flags.2?long\"},{\"name\":\"author\",\"type\":\"flags.3?string\"},{\"name\":\"published_date\",\"type\":\"flags.4?int\"}],\"type\":\"PageRelatedArticle\"},{\"id\":370236054,\"predicate\":\"pageBlockRelatedArticles\",\"params\":[{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"articles\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":-1538310410,\"predicate\":\"pageBlockMap\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-1738178803,\"predicate\":\"page\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"part\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.1?true\"},{\"name\":\"v2\",\"type\":\"flags.2?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"},{\"name\":\"views\",\"type\":\"flags.3?int\"}],\"type\":\"Page\"},{\"id\":-610373422,\"predicate\":\"inputPrivacyKeyPhoneP2P\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":961092808,\"predicate\":\"privacyKeyPhoneP2P\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":894777186,\"predicate\":\"textAnchor\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":-1945767479,\"predicate\":\"help.supportName\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"help.SupportName\"},{\"id\":-206688531,\"predicate\":\"help.userInfoEmpty\",\"params\":[],\"type\":\"help.UserInfo\"},{\"id\":32192344,\"predicate\":\"help.userInfo\",\"params\":[{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"help.UserInfo\"},{\"id\":-202219658,\"predicate\":\"messageActionContactSignUp\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1398708869,\"predicate\":\"updateMessagePoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"poll\",\"type\":\"flags.0?Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"Update\"},{\"id\":1823064809,\"predicate\":\"pollAnswer\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"option\",\"type\":\"bytes\"}],\"type\":\"PollAnswer\"},{\"id\":-2032041631,\"predicate\":\"poll\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"closed\",\"type\":\"flags.0?true\"},{\"name\":\"public_voters\",\"type\":\"flags.1?true\"},{\"name\":\"multiple_choice\",\"type\":\"flags.2?true\"},{\"name\":\"quiz\",\"type\":\"flags.3?true\"},{\"name\":\"question\",\"type\":\"string\"},{\"name\":\"answers\",\"type\":\"Vector\"},{\"name\":\"close_period\",\"type\":\"flags.4?int\"},{\"name\":\"close_date\",\"type\":\"flags.5?int\"}],\"type\":\"Poll\"},{\"id\":997055186,\"predicate\":\"pollAnswerVoters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"correct\",\"type\":\"flags.1?true\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"voters\",\"type\":\"int\"}],\"type\":\"PollAnswerVoters\"},{\"id\":-591909213,\"predicate\":\"pollResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"results\",\"type\":\"flags.1?Vector\"},{\"name\":\"total_voters\",\"type\":\"flags.2?int\"},{\"name\":\"recent_voters\",\"type\":\"flags.3?Vector\"},{\"name\":\"solution\",\"type\":\"flags.4?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.4?Vector\"}],\"type\":\"PollResults\"},{\"id\":261416433,\"predicate\":\"inputMediaPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"correct_answers\",\"type\":\"flags.0?Vector\"},{\"name\":\"solution\",\"type\":\"flags.1?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"InputMedia\"},{\"id\":1272375192,\"predicate\":\"messageMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"MessageMedia\"},{\"id\":-264117680,\"predicate\":\"chatOnlines\",\"params\":[{\"name\":\"onlines\",\"type\":\"int\"}],\"type\":\"ChatOnlines\"},{\"id\":1202287072,\"predicate\":\"statsURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"id\":-525288402,\"predicate\":\"photoStrippedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":1605510357,\"predicate\":\"chatAdminRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"change_info\",\"type\":\"flags.0?true\"},{\"name\":\"post_messages\",\"type\":\"flags.1?true\"},{\"name\":\"edit_messages\",\"type\":\"flags.2?true\"},{\"name\":\"delete_messages\",\"type\":\"flags.3?true\"},{\"name\":\"ban_users\",\"type\":\"flags.4?true\"},{\"name\":\"invite_users\",\"type\":\"flags.5?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.7?true\"},{\"name\":\"add_admins\",\"type\":\"flags.9?true\"},{\"name\":\"anonymous\",\"type\":\"flags.10?true\"},{\"name\":\"manage_call\",\"type\":\"flags.11?true\"},{\"name\":\"other\",\"type\":\"flags.12?true\"},{\"name\":\"manage_topics\",\"type\":\"flags.13?true\"}],\"type\":\"ChatAdminRights\"},{\"id\":-1626209256,\"predicate\":\"chatBannedRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"view_messages\",\"type\":\"flags.0?true\"},{\"name\":\"send_messages\",\"type\":\"flags.1?true\"},{\"name\":\"send_media\",\"type\":\"flags.2?true\"},{\"name\":\"send_stickers\",\"type\":\"flags.3?true\"},{\"name\":\"send_gifs\",\"type\":\"flags.4?true\"},{\"name\":\"send_games\",\"type\":\"flags.5?true\"},{\"name\":\"send_inline\",\"type\":\"flags.6?true\"},{\"name\":\"embed_links\",\"type\":\"flags.7?true\"},{\"name\":\"send_polls\",\"type\":\"flags.8?true\"},{\"name\":\"change_info\",\"type\":\"flags.10?true\"},{\"name\":\"invite_users\",\"type\":\"flags.15?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.17?true\"},{\"name\":\"manage_topics\",\"type\":\"flags.18?true\"},{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"ChatBannedRights\"},{\"id\":1421875280,\"predicate\":\"updateChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"default_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-433014407,\"predicate\":\"inputWallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":1913199744,\"predicate\":\"inputWallPaperSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputWallPaper\"},{\"id\":-1150621555,\"predicate\":\"channelParticipantsContacts\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":771095562,\"predicate\":\"channelAdminLogEventActionDefaultBannedRights\",\"params\":[{\"name\":\"prev_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"new_banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1895328189,\"predicate\":\"channelAdminLogEventActionStopPoll\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":471437699,\"predicate\":\"account.wallPapersNotModified\",\"params\":[],\"type\":\"account.WallPapers\"},{\"id\":-842824308,\"predicate\":\"account.wallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"account.WallPapers\"},{\"id\":-1973130814,\"predicate\":\"codeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_flashcall\",\"type\":\"flags.0?true\"},{\"name\":\"current_number\",\"type\":\"flags.1?true\"},{\"name\":\"allow_app_hash\",\"type\":\"flags.4?true\"},{\"name\":\"allow_missed_call\",\"type\":\"flags.5?true\"},{\"name\":\"logout_tokens\",\"type\":\"flags.6?Vector\"}],\"type\":\"CodeSettings\"},{\"id\":499236004,\"predicate\":\"wallPaperSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blur\",\"type\":\"flags.1?true\"},{\"name\":\"motion\",\"type\":\"flags.2?true\"},{\"name\":\"background_color\",\"type\":\"flags.0?int\"},{\"name\":\"second_background_color\",\"type\":\"flags.4?int\"},{\"name\":\"third_background_color\",\"type\":\"flags.5?int\"},{\"name\":\"fourth_background_color\",\"type\":\"flags.6?int\"},{\"name\":\"intensity\",\"type\":\"flags.3?int\"},{\"name\":\"rotation\",\"type\":\"flags.4?int\"}],\"type\":\"WallPaperSettings\"},{\"id\":-1896171181,\"predicate\":\"autoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"disabled\",\"type\":\"flags.0?true\"},{\"name\":\"video_preload_large\",\"type\":\"flags.1?true\"},{\"name\":\"audio_preload_next\",\"type\":\"flags.2?true\"},{\"name\":\"phonecalls_less_data\",\"type\":\"flags.3?true\"},{\"name\":\"photo_size_max\",\"type\":\"int\"},{\"name\":\"video_size_max\",\"type\":\"long\"},{\"name\":\"file_size_max\",\"type\":\"long\"},{\"name\":\"video_upload_maxbitrate\",\"type\":\"int\"}],\"type\":\"AutoDownloadSettings\"},{\"id\":1674235686,\"predicate\":\"account.autoDownloadSettings\",\"params\":[{\"name\":\"low\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"medium\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"high\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"account.AutoDownloadSettings\"},{\"id\":-709641735,\"predicate\":\"emojiKeyword\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":594408994,\"predicate\":\"emojiKeywordDeleted\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":1556570557,\"predicate\":\"emojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"keywords\",\"type\":\"Vector\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":-1519029347,\"predicate\":\"emojiURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":-1275374751,\"predicate\":\"emojiLanguage\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiLanguage\"},{\"id\":-1529000952,\"predicate\":\"inputPrivacyKeyForwards\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1777096355,\"predicate\":\"privacyKeyForwards\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1461304012,\"predicate\":\"inputPrivacyKeyProfilePhoto\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1777000467,\"predicate\":\"privacyKeyProfilePhoto\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1075322878,\"predicate\":\"inputPhotoFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":-667654413,\"predicate\":\"inputPhotoLegacyFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":925204121,\"predicate\":\"inputPeerPhotoFileLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-1652231205,\"predicate\":\"inputStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb_version\",\"type\":\"int\"}],\"type\":\"InputFileLocation\"},{\"id\":-11252123,\"predicate\":\"folder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autofill_new_broadcasts\",\"type\":\"flags.0?true\"},{\"name\":\"autofill_public_groups\",\"type\":\"flags.1?true\"},{\"name\":\"autofill_new_correspondents\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.3?ChatPhoto\"}],\"type\":\"Folder\"},{\"id\":1908216652,\"predicate\":\"dialogFolder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"folder\",\"type\":\"Folder\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"unread_muted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_muted_messages_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_messages_count\",\"type\":\"int\"}],\"type\":\"Dialog\"},{\"id\":1684014375,\"predicate\":\"inputDialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputDialogPeer\"},{\"id\":1363483106,\"predicate\":\"dialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"DialogPeer\"},{\"id\":-70073706,\"predicate\":\"inputFolderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputFolderPeer\"},{\"id\":-373643672,\"predicate\":\"folderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"FolderPeer\"},{\"id\":422972864,\"predicate\":\"updateFolderPeers\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":497305826,\"predicate\":\"inputUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":1536380829,\"predicate\":\"inputChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":-1468331492,\"predicate\":\"inputPeerUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1121318848,\"predicate\":\"inputPeerChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":55761658,\"predicate\":\"inputPrivacyKeyPhoneNumber\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-778378131,\"predicate\":\"privacyKeyPhoneNumber\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1472172887,\"predicate\":\"topPeerCategoryForwardUsers\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-68239120,\"predicate\":\"topPeerCategoryForwardChats\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":84703944,\"predicate\":\"channelAdminLogEventActionChangeLinkedChat\",\"params\":[{\"name\":\"prev_value\",\"type\":\"long\"},{\"name\":\"new_value\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-398136321,\"predicate\":\"messages.searchCounter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.SearchCounter\"},{\"id\":280464681,\"predicate\":\"keyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"button_id\",\"type\":\"int\"}],\"type\":\"KeyboardButton\"},{\"id\":-802258988,\"predicate\":\"inputKeyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.1?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":-1831650802,\"predicate\":\"urlAuthResultRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"User\"},{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1886646706,\"predicate\":\"urlAuthResultAccepted\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1445536993,\"predicate\":\"urlAuthResultDefault\",\"params\":[],\"type\":\"UrlAuthResult\"},{\"id\":-2079962673,\"predicate\":\"inputPrivacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-380694650,\"predicate\":\"inputPrivacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":1796427406,\"predicate\":\"privacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1103656293,\"predicate\":\"privacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":-1672577397,\"predicate\":\"messageEntityUnderline\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1090087980,\"predicate\":\"messageEntityStrike\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":34469328,\"predicate\":\"messageEntityBlockquote\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1786671974,\"predicate\":\"updatePeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"}],\"type\":\"Update\"},{\"id\":-1078612597,\"predicate\":\"channelLocationEmpty\",\"params\":[],\"type\":\"ChannelLocation\"},{\"id\":547062491,\"predicate\":\"channelLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"GeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"ChannelLocation\"},{\"id\":-901375139,\"predicate\":\"peerLocated\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":-1263546448,\"predicate\":\"updatePeerLocated\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":241923758,\"predicate\":\"channelAdminLogEventActionChangeLocation\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChannelLocation\"},{\"name\":\"new_value\",\"type\":\"ChannelLocation\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-606798099,\"predicate\":\"inputReportReasonGeoIrrelevant\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":1401984889,\"predicate\":\"channelAdminLogEventActionToggleSlowMode\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1148485274,\"predicate\":\"auth.authorizationSignUpRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"terms_of_service\",\"type\":\"flags.0?help.TermsOfService\"}],\"type\":\"auth.Authorization\"},{\"id\":-666824391,\"predicate\":\"payments.paymentVerificationNeeded\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.PaymentResult\"},{\"id\":42402760,\"predicate\":\"inputStickerSetAnimatedEmoji\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":967122427,\"predicate\":\"updateNewScheduledMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"Update\"},{\"id\":-1870238482,\"predicate\":\"updateDeleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-797791052,\"predicate\":\"restrictionReason\",\"params\":[{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RestrictionReason\"},{\"id\":1012306921,\"predicate\":\"inputTheme\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputTheme\"},{\"id\":-175567375,\"predicate\":\"inputThemeSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputTheme\"},{\"id\":-1609668650,\"predicate\":\"theme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"for_chat\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?Document\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"},{\"name\":\"emoticon\",\"type\":\"flags.6?string\"},{\"name\":\"installs_count\",\"type\":\"flags.4?int\"}],\"type\":\"Theme\"},{\"id\":-199313886,\"predicate\":\"account.themesNotModified\",\"params\":[],\"type\":\"account.Themes\"},{\"id\":-1707242387,\"predicate\":\"account.themes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"themes\",\"type\":\"Vector\"}],\"type\":\"account.Themes\"},{\"id\":-2112423005,\"predicate\":\"updateTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"Theme\"}],\"type\":\"Update\"},{\"id\":-786326563,\"predicate\":\"inputPrivacyKeyAddedByPhone\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1124062251,\"predicate\":\"privacyKeyAddedByPhone\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-2027964103,\"predicate\":\"updateGeoLiveViewed\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1448076945,\"predicate\":\"updateLoginToken\",\"params\":[],\"type\":\"Update\"},{\"id\":1654593920,\"predicate\":\"auth.loginToken\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":110008598,\"predicate\":\"auth.loginTokenMigrateTo\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":957176926,\"predicate\":\"auth.loginTokenSuccess\",\"params\":[{\"name\":\"authorization\",\"type\":\"auth.Authorization\"}],\"type\":\"auth.LoginToken\"},{\"id\":1474462241,\"predicate\":\"account.contentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"},{\"name\":\"sensitive_can_change\",\"type\":\"flags.1?true\"}],\"type\":\"account.ContentSettings\"},{\"id\":-1456996667,\"predicate\":\"messages.inactiveChats\",\"params\":[{\"name\":\"dates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.InactiveChats\"},{\"id\":-1012849566,\"predicate\":\"baseThemeClassic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-69724536,\"predicate\":\"baseThemeDay\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1212997976,\"predicate\":\"baseThemeNight\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1834973166,\"predicate\":\"baseThemeTinted\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1527845466,\"predicate\":\"baseThemeArctic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1770371538,\"predicate\":\"inputWallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":-528465642,\"predicate\":\"wallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":-1881255857,\"predicate\":\"inputThemeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?InputWallPaper\"},{\"name\":\"wallpaper_settings\",\"type\":\"flags.1?WallPaperSettings\"}],\"type\":\"InputThemeSettings\"},{\"id\":-94849324,\"predicate\":\"themeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?WallPaper\"}],\"type\":\"ThemeSettings\"},{\"id\":1421174295,\"predicate\":\"webPageAttributeTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"documents\",\"type\":\"flags.0?Vector\"},{\"name\":\"settings\",\"type\":\"flags.1?ThemeSettings\"}],\"type\":\"WebPageAttribute\"},{\"id\":274961865,\"predicate\":\"updateMessagePollVote\",\"params\":[{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":886196148,\"predicate\":\"messageUserVote\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":1017491692,\"predicate\":\"messageUserVoteInputOption\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":-1973033641,\"predicate\":\"messageUserVoteMultiple\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":136574537,\"predicate\":\"messages.votesList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"votes\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.VotesList\"},{\"id\":-1144565411,\"predicate\":\"keyboardButtonRequestPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"quiz\",\"type\":\"flags.0?Bool\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1981704948,\"predicate\":\"messageEntityBankCard\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-177732982,\"predicate\":\"bankCardOpenUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"BankCardOpenUrl\"},{\"id\":1042605427,\"predicate\":\"payments.bankCardData\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"open_urls\",\"type\":\"Vector\"}],\"type\":\"payments.BankCardData\"},{\"id\":-118740917,\"predicate\":\"peerSelfLocated\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":1949890536,\"predicate\":\"dialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"non_contacts\",\"type\":\"flags.1?true\"},{\"name\":\"groups\",\"type\":\"flags.2?true\"},{\"name\":\"broadcasts\",\"type\":\"flags.3?true\"},{\"name\":\"bots\",\"type\":\"flags.4?true\"},{\"name\":\"exclude_muted\",\"type\":\"flags.11?true\"},{\"name\":\"exclude_read\",\"type\":\"flags.12?true\"},{\"name\":\"exclude_archived\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"emoticon\",\"type\":\"flags.25?string\"},{\"name\":\"pinned_peers\",\"type\":\"Vector\"},{\"name\":\"include_peers\",\"type\":\"Vector\"},{\"name\":\"exclude_peers\",\"type\":\"Vector\"}],\"type\":\"DialogFilter\"},{\"id\":2004110666,\"predicate\":\"dialogFilterSuggested\",\"params\":[{\"name\":\"filter\",\"type\":\"DialogFilter\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"DialogFilterSuggested\"},{\"id\":654302845,\"predicate\":\"updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Update\"},{\"id\":-1512627963,\"predicate\":\"updateDialogFilterOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":889491791,\"predicate\":\"updateDialogFilters\",\"params\":[],\"type\":\"Update\"},{\"id\":-1237848657,\"predicate\":\"statsDateRangeDays\",\"params\":[{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"StatsDateRangeDays\"},{\"id\":-884757282,\"predicate\":\"statsAbsValueAndPrev\",\"params\":[{\"name\":\"current\",\"type\":\"double\"},{\"name\":\"previous\",\"type\":\"double\"}],\"type\":\"StatsAbsValueAndPrev\"},{\"id\":-875679776,\"predicate\":\"statsPercentValue\",\"params\":[{\"name\":\"part\",\"type\":\"double\"},{\"name\":\"total\",\"type\":\"double\"}],\"type\":\"StatsPercentValue\"},{\"id\":1244130093,\"predicate\":\"statsGraphAsync\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1092839390,\"predicate\":\"statsGraphError\",\"params\":[{\"name\":\"error\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1901828938,\"predicate\":\"statsGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"json\",\"type\":\"DataJSON\"},{\"name\":\"zoom_token\",\"type\":\"flags.0?string\"}],\"type\":\"StatsGraph\"},{\"id\":-1387279939,\"predicate\":\"messageInteractionCounters\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"MessageInteractionCounters\"},{\"id\":-1107852396,\"predicate\":\"stats.broadcastStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"followers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"views_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"shares_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"enabled_notifications\",\"type\":\"StatsPercentValue\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"followers_graph\",\"type\":\"StatsGraph\"},{\"name\":\"mute_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"iv_interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"views_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_followers_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"recent_message_interactions\",\"type\":\"Vector\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":-428884101,\"predicate\":\"inputMediaDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":1065280907,\"predicate\":\"messageMediaDice\",\"params\":[{\"name\":\"value\",\"type\":\"int\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-427863538,\"predicate\":\"inputStickerSetDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":-1728664459,\"predicate\":\"help.promoDataEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.PromoData\"},{\"id\":-1942390465,\"predicate\":\"help.promoData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"proxy\",\"type\":\"flags.0?true\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"psa_type\",\"type\":\"flags.1?string\"},{\"name\":\"psa_message\",\"type\":\"flags.2?string\"}],\"type\":\"help.PromoData\"},{\"id\":-567037804,\"predicate\":\"videoSize\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"video_start_ts\",\"type\":\"flags.0?double\"}],\"type\":\"VideoSize\"},{\"id\":643940105,\"predicate\":\"updatePhoneCallSignalingData\",\"params\":[{\"name\":\"phone_call_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Update\"},{\"id\":1634294960,\"predicate\":\"chatInvitePeek\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ChatInvite\"},{\"id\":-1660637285,\"predicate\":\"statsGroupTopPoster\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"int\"},{\"name\":\"avg_chars\",\"type\":\"int\"}],\"type\":\"StatsGroupTopPoster\"},{\"id\":-682079097,\"predicate\":\"statsGroupTopAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"deleted\",\"type\":\"int\"},{\"name\":\"kicked\",\"type\":\"int\"},{\"name\":\"banned\",\"type\":\"int\"}],\"type\":\"StatsGroupTopAdmin\"},{\"id\":1398765469,\"predicate\":\"statsGroupTopInviter\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"invitations\",\"type\":\"int\"}],\"type\":\"StatsGroupTopInviter\"},{\"id\":-276825834,\"predicate\":\"stats.megagroupStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"members\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"messages\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"viewers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"posters\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"members_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_members_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"messages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"actions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"weekdays_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_posters\",\"type\":\"Vector\"},{\"name\":\"top_admins\",\"type\":\"Vector\"},{\"name\":\"top_inviters\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-1096616924,\"predicate\":\"globalPrivacySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archive_and_mute_new_noncontact_peers\",\"type\":\"flags.0?Bool\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":1667228533,\"predicate\":\"phoneConnectionWebrtc\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"turn\",\"type\":\"flags.0?true\"},{\"name\":\"stun\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"string\"}],\"type\":\"PhoneConnection\"},{\"id\":1107543535,\"predicate\":\"help.countryCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"country_code\",\"type\":\"string\"},{\"name\":\"prefixes\",\"type\":\"flags.0?Vector\"},{\"name\":\"patterns\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.CountryCode\"},{\"id\":-1014526429,\"predicate\":\"help.country\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hidden\",\"type\":\"flags.0?true\"},{\"name\":\"iso2\",\"type\":\"string\"},{\"name\":\"default_name\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"flags.1?string\"},{\"name\":\"country_codes\",\"type\":\"Vector\"}],\"type\":\"help.Country\"},{\"id\":-1815339214,\"predicate\":\"help.countriesListNotModified\",\"params\":[],\"type\":\"help.CountriesList\"},{\"id\":-2016381538,\"predicate\":\"help.countriesList\",\"params\":[{\"name\":\"countries\",\"type\":\"Vector\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":1163625789,\"predicate\":\"messageViews\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"views\",\"type\":\"flags.0?int\"},{\"name\":\"forwards\",\"type\":\"flags.1?int\"},{\"name\":\"replies\",\"type\":\"flags.2?MessageReplies\"}],\"type\":\"MessageViews\"},{\"id\":-761649164,\"predicate\":\"updateChannelMessageForwards\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-96535659,\"predicate\":\"photoSizeProgressive\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"}],\"type\":\"PhotoSize\"},{\"id\":-1228606141,\"predicate\":\"messages.messageViews\",\"params\":[{\"name\":\"views\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.MessageViews\"},{\"id\":-693004986,\"predicate\":\"updateReadChannelDiscussionInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"},{\"name\":\"broadcast_id\",\"type\":\"flags.0?long\"},{\"name\":\"broadcast_post\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1767677564,\"predicate\":\"updateReadChannelDiscussionOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1506535550,\"predicate\":\"messages.discussionMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"max_id\",\"type\":\"flags.0?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"flags.1?int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"flags.2?int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-1495959709,\"predicate\":\"messageReplyHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_to_scheduled\",\"type\":\"flags.2?true\"},{\"name\":\"forum_topic\",\"type\":\"flags.3?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"reply_to_peer_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"reply_to_top_id\",\"type\":\"flags.1?int\"}],\"type\":\"MessageReplyHeader\"},{\"id\":-2083123262,\"predicate\":\"messageReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"comments\",\"type\":\"flags.0?true\"},{\"name\":\"replies\",\"type\":\"int\"},{\"name\":\"replies_pts\",\"type\":\"int\"},{\"name\":\"recent_repliers\",\"type\":\"flags.1?Vector\"},{\"name\":\"channel_id\",\"type\":\"flags.0?long\"},{\"name\":\"max_id\",\"type\":\"flags.2?int\"},{\"name\":\"read_max_id\",\"type\":\"flags.3?int\"}],\"type\":\"MessageReplies\"},{\"id\":610945826,\"predicate\":\"updatePeerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"blocked\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":-386039788,\"predicate\":\"peerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"PeerBlocked\"},{\"id\":-1937192669,\"predicate\":\"updateChannelUserTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-1392895362,\"predicate\":\"inputMessageCallbackQuery\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"InputMessage\"},{\"id\":453242886,\"predicate\":\"channelParticipantLeft\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"ChannelParticipant\"},{\"id\":-531931925,\"predicate\":\"channelParticipantsMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"q\",\"type\":\"flags.0?string\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-309990731,\"predicate\":\"updatePinnedMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1538885128,\"predicate\":\"updatePinnedChannelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":464520273,\"predicate\":\"inputMessagesFilterPinned\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1986399595,\"predicate\":\"stats.messageStats\",\"params\":[{\"name\":\"views_graph\",\"type\":\"StatsGraph\"}],\"type\":\"stats.MessageStats\"},{\"id\":-1730095465,\"predicate\":\"messageActionGeoProximityReached\",\"params\":[{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-668906175,\"predicate\":\"photoPathSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-651419003,\"predicate\":\"speakingInGroupCallAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":2004925620,\"predicate\":\"groupCallDiscarded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"duration\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-711498484,\"predicate\":\"groupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join_muted\",\"type\":\"flags.1?true\"},{\"name\":\"can_change_join_muted\",\"type\":\"flags.2?true\"},{\"name\":\"join_date_asc\",\"type\":\"flags.6?true\"},{\"name\":\"schedule_start_subscribed\",\"type\":\"flags.8?true\"},{\"name\":\"can_start_video\",\"type\":\"flags.9?true\"},{\"name\":\"record_video_active\",\"type\":\"flags.11?true\"},{\"name\":\"rtmp_stream\",\"type\":\"flags.12?true\"},{\"name\":\"listeners_hidden\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.3?string\"},{\"name\":\"stream_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"record_start_date\",\"type\":\"flags.5?int\"},{\"name\":\"schedule_date\",\"type\":\"flags.7?int\"},{\"name\":\"unmuted_video_count\",\"type\":\"flags.10?int\"},{\"name\":\"unmuted_video_limit\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-659913713,\"predicate\":\"inputGroupCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGroupCall\"},{\"id\":2047704898,\"predicate\":\"messageActionGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"duration\",\"type\":\"flags.0?int\"}],\"type\":\"MessageAction\"},{\"id\":1345295095,\"predicate\":\"messageActionInviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-341428482,\"predicate\":\"groupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.1?true\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.2?true\"},{\"name\":\"just_joined\",\"type\":\"flags.4?true\"},{\"name\":\"versioned\",\"type\":\"flags.5?true\"},{\"name\":\"min\",\"type\":\"flags.8?true\"},{\"name\":\"muted_by_you\",\"type\":\"flags.9?true\"},{\"name\":\"volume_by_admin\",\"type\":\"flags.10?true\"},{\"name\":\"self\",\"type\":\"flags.12?true\"},{\"name\":\"video_joined\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"active_date\",\"type\":\"flags.3?int\"},{\"name\":\"source\",\"type\":\"int\"},{\"name\":\"volume\",\"type\":\"flags.7?int\"},{\"name\":\"about\",\"type\":\"flags.11?string\"},{\"name\":\"raise_hand_rating\",\"type\":\"flags.13?long\"},{\"name\":\"video\",\"type\":\"flags.6?GroupCallParticipantVideo\"},{\"name\":\"presentation\",\"type\":\"flags.14?GroupCallParticipantVideo\"}],\"type\":\"GroupCallParticipant\"},{\"id\":-124097970,\"predicate\":\"updateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-219423922,\"predicate\":\"updateGroupCallParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":347227392,\"predicate\":\"updateGroupCall\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"call\",\"type\":\"GroupCall\"}],\"type\":\"Update\"},{\"id\":-1636664659,\"predicate\":\"phone.groupCall\",\"params\":[{\"name\":\"call\",\"type\":\"GroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"participants_next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.GroupCall\"},{\"id\":-193506890,\"predicate\":\"phone.groupParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":813821341,\"predicate\":\"inlineQueryPeerTypeSameBotPM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-2093215828,\"predicate\":\"inlineQueryPeerTypePM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-681130742,\"predicate\":\"inlineQueryPeerTypeChat\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1589952067,\"predicate\":\"inlineQueryPeerTypeMegagroup\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1664413338,\"predicate\":\"inlineQueryPeerTypeBroadcast\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":589338437,\"predicate\":\"channelAdminLogEventActionStartGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-610299584,\"predicate\":\"channelAdminLogEventActionDiscardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-115071790,\"predicate\":\"channelAdminLogEventActionParticipantMute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-431740480,\"predicate\":\"channelAdminLogEventActionParticipantUnmute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1456906823,\"predicate\":\"channelAdminLogEventActionToggleGroupCallSetting\",\"params\":[{\"name\":\"join_muted\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1966921727,\"predicate\":\"inputPaymentCredentialsGooglePay\",\"params\":[{\"name\":\"payment_token\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":375566091,\"predicate\":\"messages.historyImport\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"messages.HistoryImport\"},{\"id\":-606432698,\"predicate\":\"sendMessageHistoryImportAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":1578088377,\"predicate\":\"messages.historyImportParsed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pm\",\"type\":\"flags.0?true\"},{\"name\":\"group\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"flags.2?string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":-170010905,\"predicate\":\"inputReportReasonFake\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-275956116,\"predicate\":\"messages.affectedFoundMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":1007897979,\"predicate\":\"messageActionSetMessagesTTL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"auto_setting_from\",\"type\":\"flags.0?long\"}],\"type\":\"MessageAction\"},{\"id\":-1147422299,\"predicate\":\"updatePeerHistoryTTL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"ttl_period\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":-796432838,\"predicate\":\"updateChatParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChatParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChatParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1738720581,\"predicate\":\"updateChannelParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChannelParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-997782967,\"predicate\":\"updateBotStopped\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"stopped\",\"type\":\"Bool\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1940201511,\"predicate\":\"chatInviteImporter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"about\",\"type\":\"flags.2?string\"},{\"name\":\"approved_by\",\"type\":\"flags.1?long\"}],\"type\":\"ChatInviteImporter\"},{\"id\":-1111085620,\"predicate\":\"messages.exportedChatInvites\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"invites\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":410107472,\"predicate\":\"messages.exportedChatInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":572915951,\"predicate\":\"messages.exportedChatInviteReplaced\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-2118733814,\"predicate\":\"messages.chatInviteImporters\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"importers\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-219353309,\"predicate\":\"chatAdminWithInvites\",\"params\":[{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"invites_count\",\"type\":\"int\"},{\"name\":\"revoked_invites_count\",\"type\":\"int\"}],\"type\":\"ChatAdminWithInvites\"},{\"id\":-1231326505,\"predicate\":\"messages.chatAdminsWithInvites\",\"params\":[{\"name\":\"admins\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":1557846647,\"predicate\":\"channelAdminLogEventActionParticipantJoinByInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1515256996,\"predicate\":\"channelAdminLogEventActionExportedInviteDelete\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1091179342,\"predicate\":\"channelAdminLogEventActionExportedInviteRevoke\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-384910503,\"predicate\":\"channelAdminLogEventActionExportedInviteEdit\",\"params\":[{\"name\":\"prev_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1048537159,\"predicate\":\"channelAdminLogEventActionParticipantVolume\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1855199800,\"predicate\":\"channelAdminLogEventActionChangeHistoryTTL\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1571952873,\"predicate\":\"messages.checkedHistoryImportPeer\",\"params\":[{\"name\":\"confirm_text\",\"type\":\"string\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":93890858,\"predicate\":\"inputGroupCallStream\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"time_ms\",\"type\":\"long\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"video_channel\",\"type\":\"flags.0?int\"},{\"name\":\"video_quality\",\"type\":\"flags.0?int\"}],\"type\":\"InputFileLocation\"},{\"id\":-1343921601,\"predicate\":\"phone.joinAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":541839704,\"predicate\":\"phone.exportedGroupCallInvite\",\"params\":[{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":-672693723,\"predicate\":\"inputBotInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":894081801,\"predicate\":\"botInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1281329567,\"predicate\":\"messageActionGroupCallScheduled\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"schedule_date\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-592373577,\"predicate\":\"groupCallParticipantVideoSourceGroup\",\"params\":[{\"name\":\"semantics\",\"type\":\"string\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"GroupCallParticipantVideoSourceGroup\"},{\"id\":1735736008,\"predicate\":\"groupCallParticipantVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"paused\",\"type\":\"flags.0?true\"},{\"name\":\"endpoint\",\"type\":\"string\"},{\"name\":\"source_groups\",\"type\":\"Vector\"},{\"name\":\"audio_source\",\"type\":\"flags.1?int\"}],\"type\":\"GroupCallParticipantVideo\"},{\"id\":192428418,\"predicate\":\"updateGroupCallConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"presentation\",\"type\":\"flags.0?true\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-2046910401,\"predicate\":\"stickers.suggestedShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":795652779,\"predicate\":\"botCommandScopeDefault\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1011811544,\"predicate\":\"botCommandScopeUsers\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1877059713,\"predicate\":\"botCommandScopeChats\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-1180016534,\"predicate\":\"botCommandScopeChatAdmins\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-610432643,\"predicate\":\"botCommandScopePeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":1071145937,\"predicate\":\"botCommandScopePeerAdmins\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":169026035,\"predicate\":\"botCommandScopePeerUser\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotCommandScope\"},{\"id\":-478701471,\"predicate\":\"account.resetPasswordFailedWait\",\"params\":[{\"name\":\"retry_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-370148227,\"predicate\":\"account.resetPasswordRequestedWait\",\"params\":[{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-383330754,\"predicate\":\"account.resetPasswordOk\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1299263278,\"predicate\":\"updateBotCommands\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1434950843,\"predicate\":\"messageActionSetChatTheme\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1336228175,\"predicate\":\"sendMessageChooseStickerAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":981691896,\"predicate\":\"sponsoredMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recommended\",\"type\":\"flags.5?true\"},{\"name\":\"show_peer_photo\",\"type\":\"flags.6?true\"},{\"name\":\"random_id\",\"type\":\"bytes\"},{\"name\":\"from_id\",\"type\":\"flags.3?Peer\"},{\"name\":\"chat_invite\",\"type\":\"flags.4?ChatInvite\"},{\"name\":\"chat_invite_hash\",\"type\":\"flags.4?string\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"start_param\",\"type\":\"flags.0?string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"SponsoredMessage\"},{\"id\":-907141753,\"predicate\":\"messages.sponsoredMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"posts_between\",\"type\":\"flags.0?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":215889721,\"predicate\":\"inputStickerSetAnimatedEmojiAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":630664139,\"predicate\":\"sendMessageEmojiInteraction\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"interaction\",\"type\":\"DataJSON\"}],\"type\":\"SendMessageAction\"},{\"id\":-1234857938,\"predicate\":\"sendMessageEmojiInteractionSeen\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"SendMessageAction\"},{\"id\":-1227287081,\"predicate\":\"inputBotInlineMessageID64\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"owner_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":-911191137,\"predicate\":\"searchResultsCalendarPeriod\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"max_msg_id\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"SearchResultsCalendarPeriod\"},{\"id\":343859772,\"predicate\":\"messages.searchResultsCalendar\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.0?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.1?int\"},{\"name\":\"periods\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":2137295719,\"predicate\":\"searchResultPosition\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"SearchResultsPosition\"},{\"id\":1404185519,\"predicate\":\"messages.searchResultsPositions\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"positions\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":-339958837,\"predicate\":\"messageActionChatJoinedByRequest\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":1885586395,\"predicate\":\"updatePendingJoinRequests\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"requests_pending\",\"type\":\"int\"},{\"name\":\"recent_requesters\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":299870598,\"predicate\":\"updateBotChatInviteRequester\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1347021750,\"predicate\":\"channelAdminLogEventActionParticipantJoinByRequest\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"approved_by\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-376962181,\"predicate\":\"inputKeyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":814112961,\"predicate\":\"keyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"KeyboardButton\"},{\"id\":-191450938,\"predicate\":\"channels.sendAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":-886388890,\"predicate\":\"channelAdminLogEventActionToggleNoForwards\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-738646805,\"predicate\":\"messages.stickerSetNotModified\",\"params\":[],\"type\":\"messages.StickerSet\"},{\"id\":997004590,\"predicate\":\"users.userFull\",\"params\":[{\"name\":\"full_user\",\"type\":\"UserFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"users.UserFull\"},{\"id\":1753266509,\"predicate\":\"messages.peerSettings\",\"params\":[{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.PeerSettings\"},{\"id\":663693416,\"predicate\":\"channelAdminLogEventActionSendMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-702884114,\"predicate\":\"auth.codeTypeMissedCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-2113903484,\"predicate\":\"auth.sentCodeTypeMissedCall\",\"params\":[{\"name\":\"prefix\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1012759713,\"predicate\":\"auth.loggedOut\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"future_auth_token\",\"type\":\"flags.0?bytes\"}],\"type\":\"auth.LoggedOut\"},{\"id\":1578843320,\"predicate\":\"updateMessageReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"reactions\",\"type\":\"MessageReactions\"}],\"type\":\"Update\"},{\"id\":-1546531968,\"predicate\":\"reactionCount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen_order\",\"type\":\"flags.0?int\"},{\"name\":\"reaction\",\"type\":\"Reaction\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"ReactionCount\"},{\"id\":1328256121,\"predicate\":\"messageReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"can_see_list\",\"type\":\"flags.2?true\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"recent_reactions\",\"type\":\"flags.1?Vector\"}],\"type\":\"MessageReactions\"},{\"id\":834488621,\"predicate\":\"messages.messageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-1065882623,\"predicate\":\"availableReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"premium\",\"type\":\"flags.2?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"static_icon\",\"type\":\"Document\"},{\"name\":\"appear_animation\",\"type\":\"Document\"},{\"name\":\"select_animation\",\"type\":\"Document\"},{\"name\":\"activate_animation\",\"type\":\"Document\"},{\"name\":\"effect_animation\",\"type\":\"Document\"},{\"name\":\"around_animation\",\"type\":\"flags.1?Document\"},{\"name\":\"center_icon\",\"type\":\"flags.1?Document\"}],\"type\":\"AvailableReaction\"},{\"id\":-1626924713,\"predicate\":\"messages.availableReactionsNotModified\",\"params\":[],\"type\":\"messages.AvailableReactions\"},{\"id\":1989032621,\"predicate\":\"messages.availableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":852137487,\"predicate\":\"messageEntitySpoiler\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1102180616,\"predicate\":\"channelAdminLogEventActionChangeAvailableReactions\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChatReactions\"},{\"name\":\"new_value\",\"type\":\"ChatReactions\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1741309751,\"predicate\":\"messages.translateNoResult\",\"params\":[],\"type\":\"messages.TranslatedText\"},{\"id\":-1575684144,\"predicate\":\"messages.translateResultText\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":-1319698788,\"predicate\":\"messagePeerReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"unread\",\"type\":\"flags.1?true\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reaction\",\"type\":\"Reaction\"}],\"type\":\"MessagePeerReaction\"},{\"id\":-2132064081,\"predicate\":\"groupCallStreamChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"last_timestamp_ms\",\"type\":\"long\"}],\"type\":\"GroupCallStreamChannel\"},{\"id\":-790330702,\"predicate\":\"phone.groupCallStreamChannels\",\"params\":[{\"name\":\"channels\",\"type\":\"Vector\"}],\"type\":\"phone.GroupCallStreamChannels\"},{\"id\":177124030,\"predicate\":\"inputReportReasonIllegalDrugs\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1631091139,\"predicate\":\"inputReportReasonPersonalDetails\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":767505458,\"predicate\":\"phone.groupCallStreamRtmpUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"phone.GroupCallStreamRtmpUrl\"},{\"id\":1165423600,\"predicate\":\"attachMenuBotIconColor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"color\",\"type\":\"int\"}],\"type\":\"AttachMenuBotIconColor\"},{\"id\":-1297663893,\"predicate\":\"attachMenuBotIcon\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"icon\",\"type\":\"Document\"},{\"name\":\"colors\",\"type\":\"flags.0?Vector\"}],\"type\":\"AttachMenuBotIcon\"},{\"id\":-928371502,\"predicate\":\"attachMenuBot\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"has_settings\",\"type\":\"flags.1?true\"},{\"name\":\"request_write_access\",\"type\":\"flags.2?true\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"peer_types\",\"type\":\"Vector\"},{\"name\":\"icons\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBot\"},{\"id\":-237467044,\"predicate\":\"attachMenuBotsNotModified\",\"params\":[],\"type\":\"AttachMenuBots\"},{\"id\":1011024320,\"predicate\":\"attachMenuBots\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bots\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBots\"},{\"id\":-1816172929,\"predicate\":\"attachMenuBotsBot\",\"params\":[{\"name\":\"bot\",\"type\":\"AttachMenuBot\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBotsBot\"},{\"id\":397910539,\"predicate\":\"updateAttachMenuBots\",\"params\":[],\"type\":\"Update\"},{\"id\":202659196,\"predicate\":\"webViewResultUrl\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"WebViewResult\"},{\"id\":-2010155333,\"predicate\":\"simpleWebViewResultUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"SimpleWebViewResult\"},{\"id\":211046684,\"predicate\":\"webViewMessageSent\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"msg_id\",\"type\":\"flags.0?InputBotInlineMessageID\"}],\"type\":\"WebViewMessageSent\"},{\"id\":361936797,\"predicate\":\"updateWebViewResultSent\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":326529584,\"predicate\":\"keyboardButtonWebView\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1598009252,\"predicate\":\"keyboardButtonSimpleWebView\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1205698681,\"predicate\":\"messageActionWebViewDataSentMe\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1262252875,\"predicate\":\"messageActionWebViewDataSent\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":347625491,\"predicate\":\"updateBotMenuButton\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"button\",\"type\":\"BotMenuButton\"}],\"type\":\"Update\"},{\"id\":1966318984,\"predicate\":\"botMenuButtonDefault\",\"params\":[],\"type\":\"BotMenuButton\"},{\"id\":1113113093,\"predicate\":\"botMenuButtonCommands\",\"params\":[],\"type\":\"BotMenuButton\"},{\"id\":-944407322,\"predicate\":\"botMenuButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"BotMenuButton\"},{\"id\":-67704655,\"predicate\":\"account.savedRingtonesNotModified\",\"params\":[],\"type\":\"account.SavedRingtones\"},{\"id\":-1041683259,\"predicate\":\"account.savedRingtones\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"ringtones\",\"type\":\"Vector\"}],\"type\":\"account.SavedRingtones\"},{\"id\":1960361625,\"predicate\":\"updateSavedRingtones\",\"params\":[],\"type\":\"Update\"},{\"id\":-1746354498,\"predicate\":\"notificationSoundDefault\",\"params\":[],\"type\":\"NotificationSound\"},{\"id\":1863070943,\"predicate\":\"notificationSoundNone\",\"params\":[],\"type\":\"NotificationSound\"},{\"id\":-2096391452,\"predicate\":\"notificationSoundLocal\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"NotificationSound\"},{\"id\":-9666487,\"predicate\":\"notificationSoundRingtone\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"NotificationSound\"},{\"id\":-1222230163,\"predicate\":\"account.savedRingtone\",\"params\":[],\"type\":\"account.SavedRingtone\"},{\"id\":523271863,\"predicate\":\"account.savedRingtoneConverted\",\"params\":[{\"name\":\"document\",\"type\":\"Document\"}],\"type\":\"account.SavedRingtone\"},{\"id\":2104224014,\"predicate\":\"attachMenuPeerTypeSameBotPM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-1020528102,\"predicate\":\"attachMenuPeerTypeBotPM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-247016673,\"predicate\":\"attachMenuPeerTypePM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":84480319,\"predicate\":\"attachMenuPeerTypeChat\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":2080104188,\"predicate\":\"attachMenuPeerTypeBroadcast\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-317687113,\"predicate\":\"chatInvitePublicJoinRequests\",\"params\":[],\"type\":\"ExportedChatInvite\"},{\"id\":-977967015,\"predicate\":\"inputInvoiceMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"InputInvoice\"},{\"id\":-1020867857,\"predicate\":\"inputInvoiceSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputInvoice\"},{\"id\":-1362048039,\"predicate\":\"payments.exportedInvoice\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.ExportedInvoice\"},{\"id\":8703322,\"predicate\":\"updateTranscribedAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pending\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-1821037486,\"predicate\":\"messages.transcribedAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pending\",\"type\":\"flags.0?true\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"messages.TranscribedAudio\"},{\"id\":909284270,\"predicate\":\"dialogFilterDefault\",\"params\":[],\"type\":\"DialogFilter\"},{\"id\":1395946908,\"predicate\":\"help.premiumPromo\",\"params\":[{\"name\":\"status_text\",\"type\":\"string\"},{\"name\":\"status_entities\",\"type\":\"Vector\"},{\"name\":\"video_sections\",\"type\":\"Vector\"},{\"name\":\"videos\",\"type\":\"Vector\"},{\"name\":\"period_options\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"help.PremiumPromo\"},{\"id\":-925956616,\"predicate\":\"messageEntityCustomEmoji\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":-48981863,\"predicate\":\"documentAttributeCustomEmoji\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"free\",\"type\":\"flags.0?true\"},{\"name\":\"text_color\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"DocumentAttribute\"},{\"id\":1087454222,\"predicate\":\"stickerSetFullCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"keywords\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1502273946,\"predicate\":\"inputStorePaymentPremiumSubscription\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"restore\",\"type\":\"flags.0?true\"}],\"type\":\"InputStorePaymentPurpose\"},{\"id\":1634697192,\"predicate\":\"inputStorePaymentGiftPremium\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"InputStorePaymentPurpose\"},{\"id\":-1415514682,\"predicate\":\"messageActionGiftPremium\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"months\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":1958953753,\"predicate\":\"premiumGiftOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"months\",\"type\":\"int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"bot_url\",\"type\":\"string\"},{\"name\":\"store_product\",\"type\":\"flags.0?string\"}],\"type\":\"PremiumGiftOption\"},{\"id\":-930399486,\"predicate\":\"inputStickerSetPremiumGifts\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-78886548,\"predicate\":\"updateReadFeaturedEmojiStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1360618136,\"predicate\":\"inputPrivacyKeyVoiceMessages\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":110621716,\"predicate\":\"privacyKeyVoiceMessages\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1996951013,\"predicate\":\"paymentFormMethod\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentFormMethod\"},{\"id\":-193992412,\"predicate\":\"inputWebFileAudioAlbumThumbLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"small\",\"type\":\"flags.2?true\"},{\"name\":\"document\",\"type\":\"flags.0?InputDocument\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"}],\"type\":\"InputWebFileLocation\"},{\"id\":769727150,\"predicate\":\"emojiStatusEmpty\",\"params\":[],\"type\":\"EmojiStatus\"},{\"id\":-1835310691,\"predicate\":\"emojiStatus\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"EmojiStatus\"},{\"id\":-97474361,\"predicate\":\"emojiStatusUntil\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"until\",\"type\":\"int\"}],\"type\":\"EmojiStatus\"},{\"id\":674706841,\"predicate\":\"updateUserEmojiStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"emoji_status\",\"type\":\"EmojiStatus\"}],\"type\":\"Update\"},{\"id\":821314523,\"predicate\":\"updateRecentEmojiStatuses\",\"params\":[],\"type\":\"Update\"},{\"id\":-796072379,\"predicate\":\"account.emojiStatusesNotModified\",\"params\":[],\"type\":\"account.EmojiStatuses\"},{\"id\":-1866176559,\"predicate\":\"account.emojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"statuses\",\"type\":\"Vector\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":2046153753,\"predicate\":\"reactionEmpty\",\"params\":[],\"type\":\"Reaction\"},{\"id\":455247544,\"predicate\":\"reactionEmoji\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Reaction\"},{\"id\":-1992950669,\"predicate\":\"reactionCustomEmoji\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"Reaction\"},{\"id\":-352570692,\"predicate\":\"chatReactionsNone\",\"params\":[],\"type\":\"ChatReactions\"},{\"id\":1385335754,\"predicate\":\"chatReactionsAll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_custom\",\"type\":\"flags.0?true\"}],\"type\":\"ChatReactions\"},{\"id\":1713193015,\"predicate\":\"chatReactionsSome\",\"params\":[{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"ChatReactions\"},{\"id\":-1334846497,\"predicate\":\"messages.reactionsNotModified\",\"params\":[],\"type\":\"messages.Reactions\"},{\"id\":-352454890,\"predicate\":\"messages.reactions\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"messages.Reactions\"},{\"id\":1870160884,\"predicate\":\"updateRecentReactions\",\"params\":[],\"type\":\"Update\"},{\"id\":-2030252155,\"predicate\":\"updateMoveStickerSetToTop\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"stickerset\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1511364673,\"predicate\":\"auth.sentCodeTypeEmailCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"apple_signin_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"google_signin_allowed\",\"type\":\"flags.1?true\"},{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"next_phone_login_date\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1521934870,\"predicate\":\"auth.sentCodeTypeSetUpEmailRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"apple_signin_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"google_signin_allowed\",\"type\":\"flags.1?true\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1128644211,\"predicate\":\"emailVerifyPurposeLoginSetup\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"EmailVerifyPurpose\"},{\"id\":1383932651,\"predicate\":\"emailVerifyPurposeLoginChange\",\"params\":[],\"type\":\"EmailVerifyPurpose\"},{\"id\":-1141565819,\"predicate\":\"emailVerifyPurposePassport\",\"params\":[],\"type\":\"EmailVerifyPurpose\"},{\"id\":-1842457175,\"predicate\":\"emailVerificationCode\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":-611279166,\"predicate\":\"emailVerificationGoogle\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":-1764723459,\"predicate\":\"emailVerificationApple\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":731303195,\"predicate\":\"account.emailVerified\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.EmailVerified\"},{\"id\":-507835039,\"predicate\":\"account.emailVerifiedLogin\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"sent_code\",\"type\":\"auth.SentCode\"}],\"type\":\"account.EmailVerified\"},{\"id\":-1225711938,\"predicate\":\"premiumSubscriptionOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.1?true\"},{\"name\":\"can_purchase_upgrade\",\"type\":\"flags.2?true\"},{\"name\":\"months\",\"type\":\"int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"bot_url\",\"type\":\"string\"},{\"name\":\"store_product\",\"type\":\"flags.0?string\"}],\"type\":\"PremiumSubscriptionOption\"},{\"id\":80008398,\"predicate\":\"inputStickerSetEmojiGenericAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":701560302,\"predicate\":\"inputStickerSetEmojiDefaultStatuses\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1206095820,\"predicate\":\"sendAsPeer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"premium_required\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"SendAsPeer\"},{\"id\":-1386050360,\"predicate\":\"messageExtendedMediaPreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"w\",\"type\":\"flags.0?int\"},{\"name\":\"h\",\"type\":\"flags.0?int\"},{\"name\":\"thumb\",\"type\":\"flags.1?PhotoSize\"},{\"name\":\"video_duration\",\"type\":\"flags.2?int\"}],\"type\":\"MessageExtendedMedia\"},{\"id\":-297296796,\"predicate\":\"messageExtendedMedia\",\"params\":[{\"name\":\"media\",\"type\":\"MessageMedia\"}],\"type\":\"MessageExtendedMedia\"},{\"id\":1517529484,\"predicate\":\"updateMessageExtendedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"extended_media\",\"type\":\"MessageExtendedMedia\"}],\"type\":\"Update\"},{\"id\":-50416996,\"predicate\":\"stickerKeyword\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"keyword\",\"type\":\"Vector\"}],\"type\":\"StickerKeyword\"},{\"id\":-1274595769,\"predicate\":\"username\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"editable\",\"type\":\"flags.0?true\"},{\"name\":\"active\",\"type\":\"flags.1?true\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Username\"},{\"id\":-263212119,\"predicate\":\"channelAdminLogEventActionChangeUsernames\",\"params\":[{\"name\":\"prev_value\",\"type\":\"Vector\"},{\"name\":\"new_value\",\"type\":\"Vector\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":46949251,\"predicate\":\"channelAdminLogEventActionToggleForum\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1483767080,\"predicate\":\"channelAdminLogEventActionCreateTopic\",\"params\":[{\"name\":\"topic\",\"type\":\"ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-261103096,\"predicate\":\"channelAdminLogEventActionEditTopic\",\"params\":[{\"name\":\"prev_topic\",\"type\":\"ForumTopic\"},{\"name\":\"new_topic\",\"type\":\"ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1374254839,\"predicate\":\"channelAdminLogEventActionDeleteTopic\",\"params\":[{\"name\":\"topic\",\"type\":\"ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1569535291,\"predicate\":\"channelAdminLogEventActionPinTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"prev_topic\",\"type\":\"flags.0?ForumTopic\"},{\"name\":\"new_topic\",\"type\":\"flags.1?ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":37687451,\"predicate\":\"forumTopicDeleted\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"ForumTopic\"},{\"id\":1903173033,\"predicate\":\"forumTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"my\",\"type\":\"flags.1?true\"},{\"name\":\"closed\",\"type\":\"flags.2?true\"},{\"name\":\"pinned\",\"type\":\"flags.3?true\"},{\"name\":\"short\",\"type\":\"flags.5?true\"},{\"name\":\"hidden\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"icon_color\",\"type\":\"int\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.0?long\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"unread_reactions_count\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"draft\",\"type\":\"flags.4?DraftMessage\"}],\"type\":\"ForumTopic\"},{\"id\":913709011,\"predicate\":\"messages.forumTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"order_by_create_date\",\"type\":\"flags.0?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"topics\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"messages.ForumTopics\"},{\"id\":228168278,\"predicate\":\"messageActionTopicCreate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"icon_color\",\"type\":\"int\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.0?long\"}],\"type\":\"MessageAction\"},{\"id\":-1064024032,\"predicate\":\"messageActionTopicEdit\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.1?long\"},{\"name\":\"closed\",\"type\":\"flags.2?Bool\"},{\"name\":\"hidden\",\"type\":\"flags.3?Bool\"}],\"type\":\"MessageAction\"},{\"id\":422509539,\"predicate\":\"updateChannelPinnedTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"topic_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1548122514,\"predicate\":\"inputNotifyForumTopic\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"int\"}],\"type\":\"InputNotifyPeer\"},{\"id\":577659656,\"predicate\":\"notifyForumTopic\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_msg_id\",\"type\":\"int\"}],\"type\":\"NotifyPeer\"},{\"id\":1153562857,\"predicate\":\"inputStickerSetEmojiDefaultTopicIcons\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":406407439,\"predicate\":\"messages.sponsoredMessagesEmpty\",\"params\":[],\"type\":\"messages.SponsoredMessages\"},{\"id\":-31881726,\"predicate\":\"updateChannelPinnedTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"order\",\"type\":\"flags.0?Vector\"}],\"type\":\"Update\"},{\"id\":1135897376,\"predicate\":\"defaultHistoryTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"DefaultHistoryTTL\"},{\"id\":116234636,\"predicate\":\"auth.codeTypeFragmentSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-648651719,\"predicate\":\"auth.sentCodeTypeFragmentSms\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1103040667,\"predicate\":\"exportedContactToken\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ExportedContactToken\"},{\"id\":1693675004,\"predicate\":\"channelAdminLogEventActionToggleAntiSpam\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1474192222,\"predicate\":\"messageActionSuggestProfilePhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":-404267113,\"predicate\":\"messageActionAttachMenuBotAllowed\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":2008112412,\"predicate\":\"stickerSetNoCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"}],\"type\":\"StickerSetCovered\"},{\"id\":542282808,\"predicate\":\"updateUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Update\"}],\"methods\":[{\"id\":-878758099,\"method\":\"invokeAfterMsg\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":1036301552,\"method\":\"invokeAfterMsgs\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1502141361,\"method\":\"auth.sendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":-2131827673,\"method\":\"auth.signUp\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1923962543,\"method\":\"auth.signIn\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"flags.0?string\"},{\"name\":\"email_verification\",\"type\":\"flags.1?EmailVerification\"}],\"type\":\"auth.Authorization\"},{\"id\":1047706137,\"method\":\"auth.logOut\",\"params\":[],\"type\":\"auth.LoggedOut\"},{\"id\":-1616179942,\"method\":\"auth.resetAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":-440401971,\"method\":\"auth.exportAuthorization\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1518699091,\"method\":\"auth.importAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.Authorization\"},{\"id\":-841733627,\"method\":\"auth.bindTempAuthKey\",\"params\":[{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"},{\"name\":\"encrypted_message\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-326762118,\"method\":\"account.registerDevice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_muted\",\"type\":\"flags.0?true\"},{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"app_sandbox\",\"type\":\"Bool\"},{\"name\":\"secret\",\"type\":\"bytes\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1779249670,\"method\":\"account.unregisterDevice\",\"params\":[{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2067899501,\"method\":\"account.updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"},{\"name\":\"settings\",\"type\":\"InputPeerNotifySettings\"}],\"type\":\"Bool\"},{\"id\":313765169,\"method\":\"account.getNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-612493497,\"method\":\"account.resetNotifySettings\",\"params\":[],\"type\":\"Bool\"},{\"id\":2018596725,\"method\":\"account.updateProfile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"first_name\",\"type\":\"flags.0?string\"},{\"name\":\"last_name\",\"type\":\"flags.1?string\"},{\"name\":\"about\",\"type\":\"flags.2?string\"}],\"type\":\"User\"},{\"id\":1713919532,\"method\":\"account.updateStatus\",\"params\":[{\"name\":\"offline\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":127302966,\"method\":\"account.getWallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.WallPapers\"},{\"id\":-977650298,\"method\":\"account.reportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":227648840,\"method\":\"users.getUsers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1240508136,\"method\":\"users.getFullUser\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"users.UserFull\"},{\"id\":2061264541,\"method\":\"contacts.getContactIDs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":-995929106,\"method\":\"contacts.getStatuses\",\"params\":[],\"type\":\"Vector\"},{\"id\":1574346258,\"method\":\"contacts.getContacts\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.Contacts\"},{\"id\":746589157,\"method\":\"contacts.importContacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":157945344,\"method\":\"contacts.deleteContacts\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":269745566,\"method\":\"contacts.deleteByPhones\",\"params\":[{\"name\":\"phones\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1758204945,\"method\":\"contacts.block\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1096393392,\"method\":\"contacts.unblock\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-176409329,\"method\":\"contacts.getBlocked\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Blocked\"},{\"id\":1673946374,\"method\":\"messages.getMessages\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1594569905,\"method\":\"messages.getDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Dialogs\"},{\"id\":1143203525,\"method\":\"messages.getHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1593989278,\"method\":\"messages.search\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"from_id\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":238054714,\"method\":\"messages.readHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-1332768214,\"method\":\"messages.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"just_clear\",\"type\":\"flags.0?true\"},{\"name\":\"revoke\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"flags.2?int\"},{\"name\":\"max_date\",\"type\":\"flags.3?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-443640366,\"method\":\"messages.deleteMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":94983360,\"method\":\"messages.receivedMessages\",\"params\":[{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1486110434,\"method\":\"messages.setTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Bool\"},{\"id\":482476935,\"method\":\"messages.sendMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":1967638886,\"method\":\"messages.sendMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-966673468,\"method\":\"messages.forwardMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"with_my_score\",\"type\":\"flags.8?true\"},{\"name\":\"drop_author\",\"type\":\"flags.11?true\"},{\"name\":\"drop_media_captions\",\"type\":\"flags.12?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"from_peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"random_id\",\"type\":\"Vector\"},{\"name\":\"to_peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-820669733,\"method\":\"messages.reportSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-270948702,\"method\":\"messages.getPeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.PeerSettings\"},{\"id\":-1991005362,\"method\":\"messages.report\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1240027791,\"method\":\"messages.getChats\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-1364194508,\"method\":\"messages.getFullChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"messages.ChatFull\"},{\"id\":1937260541,\"method\":\"messages.editChatTitle\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":903730804,\"method\":\"messages.editChatPhoto\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":-230206493,\"method\":\"messages.addChatUser\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"fwd_limit\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1575461717,\"method\":\"messages.deleteChatUser\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":3450904,\"method\":\"messages.createChat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"ttl_period\",\"type\":\"flags.0?int\"}],\"type\":\"Updates\"},{\"id\":-304838614,\"method\":\"updates.getState\",\"params\":[],\"type\":\"updates.State\"},{\"id\":630429265,\"method\":\"updates.getDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_total_limit\",\"type\":\"flags.0?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":473782614,\"method\":\"photos.updateProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"fallback\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"photos.Photo\"},{\"id\":-1980559511,\"method\":\"photos.uploadProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"fallback\",\"type\":\"flags.3?true\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"photos.Photo\"},{\"id\":-2016444625,\"method\":\"photos.deletePhotos\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1291540959,\"method\":\"upload.saveFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1101843010,\"method\":\"upload.getFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"precise\",\"type\":\"flags.0?true\"},{\"name\":\"cdn_supported\",\"type\":\"flags.1?true\"},{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.File\"},{\"id\":-990308245,\"method\":\"help.getConfig\",\"params\":[],\"type\":\"Config\"},{\"id\":531836966,\"method\":\"help.getNearestDc\",\"params\":[],\"type\":\"NearestDc\"},{\"id\":1378703997,\"method\":\"help.getAppUpdate\",\"params\":[{\"name\":\"source\",\"type\":\"string\"}],\"type\":\"help.AppUpdate\"},{\"id\":1295590211,\"method\":\"help.getInviteText\",\"params\":[],\"type\":\"help.InviteText\"},{\"id\":-1848823128,\"method\":\"photos.getUserPhotos\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"photos.Photos\"},{\"id\":651135312,\"method\":\"messages.getDhConfig\",\"params\":[{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random_length\",\"type\":\"int\"}],\"type\":\"messages.DhConfig\"},{\"id\":-162681021,\"method\":\"messages.requestEncryption\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1035731989,\"method\":\"messages.acceptEncryption\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":-208425312,\"method\":\"messages.discardEncryption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":2031374829,\"method\":\"messages.setEncryptedTyping\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"typing\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2135648522,\"method\":\"messages.readEncryptedHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1157265941,\"method\":\"messages.sendEncrypted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1431914525,\"method\":\"messages.sendEncryptedFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":852769188,\"method\":\"messages.sendEncryptedService\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1436924774,\"method\":\"messages.receivedQueue\",\"params\":[{\"name\":\"max_qts\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1259113487,\"method\":\"messages.reportEncryptedSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"}],\"type\":\"Bool\"},{\"id\":-562337987,\"method\":\"upload.saveBigFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"file_total_parts\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1043505495,\"method\":\"initConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"system_lang_code\",\"type\":\"string\"},{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"proxy\",\"type\":\"flags.0?InputClientProxy\"},{\"name\":\"params\",\"type\":\"flags.1?JSONValue\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1663104819,\"method\":\"help.getSupport\",\"params\":[],\"type\":\"help.Support\"},{\"id\":916930423,\"method\":\"messages.readMessageContents\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":655677548,\"method\":\"account.checkUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1040964988,\"method\":\"account.updateUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":301470424,\"method\":\"contacts.search\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Found\"},{\"id\":-623130288,\"method\":\"account.getPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-906486552,\"method\":\"account.setPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-1564422284,\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"flags.0?InputCheckPasswordSRP\"}],\"type\":\"Bool\"},{\"id\":150761757,\"method\":\"account.getAccountTTL\",\"params\":[],\"type\":\"AccountDaysTTL\"},{\"id\":608323678,\"method\":\"account.setAccountTTL\",\"params\":[{\"name\":\"ttl\",\"type\":\"AccountDaysTTL\"}],\"type\":\"Bool\"},{\"id\":-627372787,\"method\":\"invokeWithLayer\",\"params\":[{\"name\":\"layer\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-113456221,\"method\":\"contacts.resolveUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-2108208411,\"method\":\"account.sendChangePhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1891839707,\"method\":\"account.changePhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-710552671,\"method\":\"messages.getStickers\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Stickers\"},{\"id\":-1197432408,\"method\":\"messages.getAllStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":954152242,\"method\":\"account.updateDeviceLocked\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1738800940,\"method\":\"auth.importBotAuthorization\",\"params\":[{\"name\":\"flags\",\"type\":\"int\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"bot_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1956073268,\"method\":\"messages.getWebPagePreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"MessageMedia\"},{\"id\":-484392616,\"method\":\"account.getAuthorizations\",\"params\":[],\"type\":\"account.Authorizations\"},{\"id\":-545786948,\"method\":\"account.resetAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1418342645,\"method\":\"account.getPassword\",\"params\":[],\"type\":\"account.Password\"},{\"id\":-1663767815,\"method\":\"account.getPasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1516564433,\"method\":\"account.updatePasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"new_settings\",\"type\":\"account.PasswordInputSettings\"}],\"type\":\"Bool\"},{\"id\":-779399914,\"method\":\"auth.checkPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"auth.Authorization\"},{\"id\":-661144474,\"method\":\"auth.requestPasswordRecovery\",\"params\":[],\"type\":\"auth.PasswordRecovery\"},{\"id\":923364464,\"method\":\"auth.recoverPassword\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"code\",\"type\":\"string\"},{\"name\":\"new_settings\",\"type\":\"flags.0?account.PasswordInputSettings\"}],\"type\":\"auth.Authorization\"},{\"id\":-1080796745,\"method\":\"invokeWithoutUpdates\",\"params\":[{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1607670315,\"method\":\"messages.exportChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"legacy_revoke_permanent\",\"type\":\"flags.2?true\"},{\"name\":\"request_needed\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1051570619,\"method\":\"messages.checkChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"ChatInvite\"},{\"id\":1817183516,\"method\":\"messages.importChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-928977804,\"method\":\"messages.getStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-946871200,\"method\":\"messages.installStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"archived\",\"type\":\"Bool\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":-110209570,\"method\":\"messages.uninstallStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":-421563528,\"method\":\"messages.startBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-1877938321,\"method\":\"help.getAppChangelog\",\"params\":[{\"name\":\"prev_app_version\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1468322785,\"method\":\"messages.getMessagesViews\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"increment\",\"type\":\"Bool\"}],\"type\":\"messages.MessageViews\"},{\"id\":-871347913,\"method\":\"channels.readHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-2067661490,\"method\":\"channels.deleteMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-196443371,\"method\":\"channels.reportSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1383294429,\"method\":\"channels.getMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":2010044880,\"method\":\"channels.getParticipants\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelParticipantsFilter\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-1599378234,\"method\":\"channels.getParticipant\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":176122811,\"method\":\"channels.getChannels\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":141781513,\"method\":\"channels.getFullChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.ChatFull\"},{\"id\":-1862244601,\"method\":\"channels.createChannel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.0?true\"},{\"name\":\"megagroup\",\"type\":\"flags.1?true\"},{\"name\":\"for_import\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"geo_point\",\"type\":\"flags.2?InputGeoPoint\"},{\"name\":\"address\",\"type\":\"flags.2?string\"},{\"name\":\"ttl_period\",\"type\":\"flags.4?int\"}],\"type\":\"Updates\"},{\"id\":-751007486,\"method\":\"channels.editAdmin\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1450044624,\"method\":\"channels.editTitle\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-248621111,\"method\":\"channels.editPhoto\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":283557164,\"method\":\"channels.checkUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":890549214,\"method\":\"channels.updateUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":615851205,\"method\":\"channels.joinChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-130635115,\"method\":\"channels.leaveChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":429865580,\"method\":\"channels.inviteToChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-1072619549,\"method\":\"channels.deleteChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":51854712,\"method\":\"updates.getChannelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelMessagesFilter\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1470377534,\"method\":\"messages.editChatAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"is_admin\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1568189671,\"method\":\"messages.migrateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1271290010,\"method\":\"messages.searchGlobal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":2016638777,\"method\":\"messages.reorderStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1309538785,\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"long\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1559270965,\"method\":\"messages.getSavedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.SavedGifs\"},{\"id\":846868683,\"method\":\"messages.saveGif\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1364105629,\"method\":\"messages.getInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"geo_point\",\"type\":\"flags.0?InputGeoPoint\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"messages.BotResults\"},{\"id\":-346119674,\"method\":\"messages.setInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"private\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"next_offset\",\"type\":\"flags.2?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.3?InlineBotSwitchPM\"}],\"type\":\"Bool\"},{\"id\":-738468661,\"method\":\"messages.sendInlineBotResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"hide_via\",\"type\":\"flags.11?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-432034325,\"method\":\"channels.exportMessageLink\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"grouped\",\"type\":\"flags.0?true\"},{\"name\":\"thread\",\"type\":\"flags.1?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"ExportedMessageLink\"},{\"id\":527021574,\"method\":\"channels.toggleSignatures\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1056025023,\"method\":\"auth.resendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"auth.SentCode\"},{\"id\":520357240,\"method\":\"auth.cancelCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-39416522,\"method\":\"messages.getMessageEditData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"messages.MessageEditData\"},{\"id\":1224152952,\"method\":\"messages.editMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.15?int\"}],\"type\":\"Updates\"},{\"id\":-2091549254,\"method\":\"messages.editInlineBotMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":-1824339449,\"method\":\"messages.getBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"game\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"password\",\"type\":\"flags.2?InputCheckPasswordSRP\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-712043766,\"method\":\"messages.setBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-1758168906,\"method\":\"contacts.getTopPeers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"correspondents\",\"type\":\"flags.0?true\"},{\"name\":\"bots_pm\",\"type\":\"flags.1?true\"},{\"name\":\"bots_inline\",\"type\":\"flags.2?true\"},{\"name\":\"phone_calls\",\"type\":\"flags.3?true\"},{\"name\":\"forward_users\",\"type\":\"flags.4?true\"},{\"name\":\"forward_chats\",\"type\":\"flags.5?true\"},{\"name\":\"groups\",\"type\":\"flags.10?true\"},{\"name\":\"channels\",\"type\":\"flags.15?true\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.TopPeers\"},{\"id\":451113900,\"method\":\"contacts.resetTopPeerRating\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-462373635,\"method\":\"messages.getPeerDialogs\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1271718337,\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":1782549861,\"method\":\"messages.getAllDrafts\",\"params\":[],\"type\":\"Updates\"},{\"id\":1685588756,\"method\":\"messages.getFeaturedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1527873830,\"method\":\"messages.readFeaturedStickers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1649852357,\"method\":\"messages.getRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.RecentStickers\"},{\"id\":958863608,\"method\":\"messages.saveRecentSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1986437075,\"method\":\"messages.clearRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":1475442322,\"method\":\"messages.getArchivedStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"offset_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":457157256,\"method\":\"account.sendConfirmPhoneCode\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1596029123,\"method\":\"account.confirmPhone\",\"params\":[{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-122669393,\"method\":\"channels.getAdminedPublicChannels\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"by_location\",\"type\":\"flags.0?true\"},{\"name\":\"check_limit\",\"type\":\"flags.1?true\"}],\"type\":\"messages.Chats\"},{\"id\":1678738104,\"method\":\"messages.getMaskStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":-866424884,\"method\":\"messages.getAttachedStickers\",\"params\":[{\"name\":\"media\",\"type\":\"InputStickeredMedia\"}],\"type\":\"Vector\"},{\"id\":-1907842680,\"method\":\"auth.dropTempAuthKeys\",\"params\":[{\"name\":\"except_auth_keys\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1896289088,\"method\":\"messages.setGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":363700068,\"method\":\"messages.setInlineGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-400399203,\"method\":\"messages.getGameHighScores\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":258170395,\"method\":\"messages.getInlineGameHighScores\",\"params\":[{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":-468934396,\"method\":\"messages.getCommonChats\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-2023787330,\"method\":\"messages.getAllChats\",\"params\":[{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-333262899,\"method\":\"help.setBotUpdatesStatus\",\"params\":[{\"name\":\"pending_updates_count\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":852135825,\"method\":\"messages.getWebPage\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-1489903017,\"method\":\"messages.toggleDialogPin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":991616823,\"method\":\"messages.reorderPinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"int\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-692498958,\"method\":\"messages.getPinnedDialogs\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1440257555,\"method\":\"bots.sendCustomRequest\",\"params\":[{\"name\":\"custom_method\",\"type\":\"string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"DataJSON\"},{\"id\":-434028723,\"method\":\"bots.answerWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":619086221,\"method\":\"upload.getWebFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputWebFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.WebFile\"},{\"id\":924093883,\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"}],\"type\":\"payments.PaymentForm\"},{\"id\":611897804,\"method\":\"payments.getPaymentReceipt\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-1228345045,\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":755192367,\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"name\":\"requested_info_id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"credentials\",\"type\":\"InputPaymentCredentials\"},{\"name\":\"tip_amount\",\"type\":\"flags.2?long\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1151208273,\"method\":\"account.getTmpPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":578650699,\"method\":\"payments.getSavedInfo\",\"params\":[],\"type\":\"payments.SavedInfo\"},{\"id\":-667062079,\"method\":\"payments.clearSavedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"credentials\",\"type\":\"flags.0?true\"},{\"name\":\"info\",\"type\":\"flags.1?true\"}],\"type\":\"Bool\"},{\"id\":-436833542,\"method\":\"messages.setBotShippingResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"Bool\"},{\"id\":163765653,\"method\":\"messages.setBotPrecheckoutResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"}],\"type\":\"Bool\"},{\"id\":-1876841625,\"method\":\"stickers.createStickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"animated\",\"type\":\"flags.1?true\"},{\"name\":\"videos\",\"type\":\"flags.4?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"software\",\"type\":\"flags.3?string\"}],\"type\":\"messages.StickerSet\"},{\"id\":-143257775,\"method\":\"stickers.removeStickerFromSet\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":-4795190,\"method\":\"stickers.changeStickerPosition\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"},{\"name\":\"position\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-2041315650,\"method\":\"stickers.addStickerToSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"sticker\",\"type\":\"InputStickerSetItem\"}],\"type\":\"messages.StickerSet\"},{\"id\":1369162417,\"method\":\"messages.uploadMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":1430593449,\"method\":\"phone.getCallConfig\",\"params\":[],\"type\":\"DataJSON\"},{\"id\":1124046573,\"method\":\"phone.requestCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":1003664544,\"method\":\"phone.acceptCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":788404002,\"method\":\"phone.confirmCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":399855457,\"method\":\"phone.receivedCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"}],\"type\":\"Bool\"},{\"id\":-1295269440,\"method\":\"phone.discardCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"reason\",\"type\":\"PhoneCallDiscardReason\"},{\"name\":\"connection_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1508562471,\"method\":\"phone.setCallRating\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_initiative\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"rating\",\"type\":\"int\"},{\"name\":\"comment\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":662363518,\"method\":\"phone.saveCallDebug\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"debug\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":962554330,\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1691921240,\"method\":\"upload.reuploadCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"Vector\"},{\"id\":1375900482,\"method\":\"help.getCdnConfig\",\"params\":[],\"type\":\"CdnConfig\"},{\"id\":-219008246,\"method\":\"langpack.getLangPack\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackDifference\"},{\"id\":-269862909,\"method\":\"langpack.getStrings\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"keys\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-845657435,\"method\":\"langpack.getDifference\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"LangPackDifference\"},{\"id\":1120311183,\"method\":\"langpack.getLanguages\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":-1763259007,\"method\":\"channels.editBanned\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":870184064,\"method\":\"channels.getAdminLog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"events_filter\",\"type\":\"flags.0?ChannelAdminLogEventsFilter\"},{\"name\":\"admins\",\"type\":\"flags.1?Vector\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"min_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-1847836879,\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":-914493408,\"method\":\"messages.sendScreenshotNotification\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":-359881479,\"method\":\"channels.setStickers\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":82946729,\"method\":\"messages.getFavedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-1174420133,\"method\":\"messages.faveSticker\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unfave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-357180360,\"method\":\"channels.readMessageContents\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2020263951,\"method\":\"contacts.resetSaved\",\"params\":[],\"type\":\"Bool\"},{\"id\":-251140208,\"method\":\"messages.getUnreadMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1683319225,\"method\":\"channels.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"for_everyone\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1036054804,\"method\":\"help.getRecentMeUrls\",\"params\":[{\"name\":\"referer\",\"type\":\"string\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":-356796084,\"method\":\"channels.togglePreHistoryHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":921026381,\"method\":\"messages.readMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1881817312,\"method\":\"messages.getRecentLocations\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1225713124,\"method\":\"messages.sendMultiMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"multi_media\",\"type\":\"Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":1347929239,\"method\":\"messages.uploadEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"EncryptedFile\"},{\"id\":405695855,\"method\":\"account.getWebAuthorizations\",\"params\":[],\"type\":\"account.WebAuthorizations\"},{\"id\":755087855,\"method\":\"account.resetWebAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1747789204,\"method\":\"account.resetWebAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":896555914,\"method\":\"messages.searchStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_featured\",\"type\":\"flags.0?true\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":-1856595926,\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":749019089,\"method\":\"help.getTermsOfServiceUpdate\",\"params\":[],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":-294455398,\"method\":\"help.acceptTermsOfService\",\"params\":[{\"name\":\"id\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":-1299661699,\"method\":\"account.getAllSecureValues\",\"params\":[],\"type\":\"Vector\"},{\"id\":1936088002,\"method\":\"account.getSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1986010339,\"method\":\"account.saveSecureValue\",\"params\":[{\"name\":\"value\",\"type\":\"InputSecureValue\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureValue\"},{\"id\":-1199522741,\"method\":\"account.deleteSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1865902923,\"method\":\"users.setSecureValueErrors\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"errors\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1456907910,\"method\":\"account.getAuthorizationForm\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-202552205,\"method\":\"account.acceptAuthorization\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"},{\"name\":\"value_hashes\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"Bool\"},{\"id\":-1516022023,\"method\":\"account.sendVerifyPhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1305716726,\"method\":\"account.verifyPhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1730136133,\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"purpose\",\"type\":\"EmailVerifyPurpose\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":53322959,\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"purpose\",\"type\":\"EmailVerifyPurpose\"},{\"name\":\"verification\",\"type\":\"EmailVerification\"}],\"type\":\"account.EmailVerified\"},{\"id\":1072547679,\"method\":\"help.getDeepLinkInfo\",\"params\":[{\"name\":\"path\",\"type\":\"string\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":-2098076769,\"method\":\"contacts.getSaved\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2092831552,\"method\":\"channels.getLeftChannels\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-1896617296,\"method\":\"account.initTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"message_users\",\"type\":\"flags.1?true\"},{\"name\":\"message_chats\",\"type\":\"flags.2?true\"},{\"name\":\"message_megagroups\",\"type\":\"flags.3?true\"},{\"name\":\"message_channels\",\"type\":\"flags.4?true\"},{\"name\":\"files\",\"type\":\"flags.5?true\"},{\"name\":\"file_max_size\",\"type\":\"flags.5?long\"}],\"type\":\"account.Takeout\"},{\"id\":489050862,\"method\":\"account.finishTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":486505992,\"method\":\"messages.getSplitRanges\",\"params\":[],\"type\":\"Vector\"},{\"id\":911373810,\"method\":\"invokeWithMessagesRange\",\"params\":[{\"name\":\"range\",\"type\":\"MessageRange\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1398145746,\"method\":\"invokeWithTakeout\",\"params\":[{\"name\":\"takeout_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1031349873,\"method\":\"messages.markDialogUnread\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":585256482,\"method\":\"messages.getDialogUnreadMarks\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2062238246,\"method\":\"contacts.toggleTopPeers\",\"params\":[{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2119757468,\"method\":\"messages.clearAllDrafts\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1735311088,\"method\":\"help.getAppConfig\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":1862465352,\"method\":\"help.saveAppLog\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-966677240,\"method\":\"help.getPassportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.PassportConfig\"},{\"id\":1784243458,\"method\":\"langpack.getLanguage\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":-760547348,\"method\":\"messages.updatePinnedMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"unpin\",\"type\":\"flags.1?true\"},{\"name\":\"pm_oneside\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1881204448,\"method\":\"account.confirmPasswordEmail\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":2055154197,\"method\":\"account.resendPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1043606090,\"method\":\"account.cancelPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-748624084,\"method\":\"help.getSupportName\",\"params\":[],\"type\":\"help.SupportName\"},{\"id\":59377875,\"method\":\"help.getUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"help.UserInfo\"},{\"id\":1723407216,\"method\":\"help.editUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"help.UserInfo\"},{\"id\":-1626880216,\"method\":\"account.getContactSignUpNotification\",\"params\":[],\"type\":\"Bool\"},{\"id\":-806076575,\"method\":\"account.setContactSignUpNotification\",\"params\":[{\"name\":\"silent\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1398240377,\"method\":\"account.getNotifyExceptions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"compare_sound\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"flags.0?InputNotifyPeer\"}],\"type\":\"Updates\"},{\"id\":283795844,\"method\":\"messages.sendVote\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"options\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1941660731,\"method\":\"messages.getPollResults\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1848369232,\"method\":\"messages.getOnlines\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"ChatOnlines\"},{\"id\":-554301545,\"method\":\"messages.editChatAbout\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"about\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1517917375,\"method\":\"messages.editChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":-57811990,\"method\":\"account.getWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"}],\"type\":\"WallPaper\"},{\"id\":-578472351,\"method\":\"account.uploadWallPaper\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1817860919,\"method\":\"account.saveWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"unsave\",\"type\":\"Bool\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-18000023,\"method\":\"account.installWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-1153722364,\"method\":\"account.resetWallPapers\",\"params\":[],\"type\":\"Bool\"},{\"id\":1457130303,\"method\":\"account.getAutoDownloadSettings\",\"params\":[],\"type\":\"account.AutoDownloadSettings\"},{\"id\":1995661875,\"method\":\"account.saveAutoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"low\",\"type\":\"flags.0?true\"},{\"name\":\"high\",\"type\":\"flags.1?true\"},{\"name\":\"settings\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"Bool\"},{\"id\":899735650,\"method\":\"messages.getEmojiKeywords\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":352892591,\"method\":\"messages.getEmojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":1318675378,\"method\":\"messages.getEmojiKeywordsLanguages\",\"params\":[{\"name\":\"lang_codes\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-709817306,\"method\":\"messages.getEmojiURL\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":1749536939,\"method\":\"folders.editPeerFolders\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":472471681,\"method\":\"folders.deleteFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":11435201,\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"filters\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-170208392,\"method\":\"channels.getGroupsForDiscussion\",\"params\":[],\"type\":\"messages.Chats\"},{\"id\":1079520178,\"method\":\"channels.setDiscussionGroup\",\"params\":[{\"name\":\"broadcast\",\"type\":\"InputChannel\"},{\"name\":\"group\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":428848198,\"method\":\"messages.requestUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1322487515,\"method\":\"messages.acceptUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":1336717624,\"method\":\"messages.hidePeerSettingsBar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-386636848,\"method\":\"contacts.addContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"add_phone_privacy_exception\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-130964977,\"method\":\"contacts.acceptContact\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-1892102881,\"method\":\"channels.editCreator\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"Updates\"},{\"id\":-750207932,\"method\":\"contacts.getLocated\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"background\",\"type\":\"flags.1?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"self_expires\",\"type\":\"flags.0?int\"}],\"type\":\"Updates\"},{\"id\":1491484525,\"method\":\"channels.editLocation\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-304832784,\"method\":\"channels.toggleSlowMode\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"seconds\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-183077365,\"method\":\"messages.getScheduledHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1111817116,\"method\":\"messages.getScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1120369398,\"method\":\"messages.sendScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1504586518,\"method\":\"messages.deleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":473805619,\"method\":\"account.uploadTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.0?InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1697530880,\"method\":\"account.createTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":737414348,\"method\":\"account.updateTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"slug\",\"type\":\"flags.0?string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":-229175188,\"method\":\"account.saveTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-953697477,\"method\":\"account.installTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"theme\",\"type\":\"flags.1?InputTheme\"},{\"name\":\"format\",\"type\":\"flags.2?string\"},{\"name\":\"base_theme\",\"type\":\"flags.3?BaseTheme\"}],\"type\":\"Bool\"},{\"id\":978872812,\"method\":\"account.getTheme\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"}],\"type\":\"Theme\"},{\"id\":1913054296,\"method\":\"account.getThemes\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-1210022402,\"method\":\"auth.exportLoginToken\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"auth.LoginToken\"},{\"id\":-1783866140,\"method\":\"auth.importLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":-392909491,\"method\":\"auth.acceptLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"Authorization\"},{\"id\":-1250643605,\"method\":\"account.setContentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":-1952756306,\"method\":\"account.getContentSettings\",\"params\":[],\"type\":\"account.ContentSettings\"},{\"id\":300429806,\"method\":\"channels.getInactiveChannels\",\"params\":[],\"type\":\"messages.InactiveChats\"},{\"id\":1705865692,\"method\":\"account.getMultiWallPapers\",\"params\":[{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1200736242,\"method\":\"messages.getPollVotes\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"option\",\"type\":\"flags.0?bytes\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.VotesList\"},{\"id\":-1257951254,\"method\":\"messages.toggleStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"uninstall\",\"type\":\"flags.0?true\"},{\"name\":\"archive\",\"type\":\"flags.1?true\"},{\"name\":\"unarchive\",\"type\":\"flags.2?true\"},{\"name\":\"stickersets\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":779736953,\"method\":\"payments.getBankCardData\",\"params\":[{\"name\":\"number\",\"type\":\"string\"}],\"type\":\"payments.BankCardData\"},{\"id\":-241247891,\"method\":\"messages.getDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":-1566780372,\"method\":\"messages.getSuggestedDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":450142282,\"method\":\"messages.updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Bool\"},{\"id\":-983318044,\"method\":\"messages.updateDialogFiltersOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1421720550,\"method\":\"stats.getBroadcastStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":1646092192,\"method\":\"stats.loadAsyncGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"x\",\"type\":\"flags.0?long\"}],\"type\":\"StatsGraph\"},{\"id\":-1707717072,\"method\":\"stickers.setStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":85399130,\"method\":\"bots.setBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":2127598753,\"method\":\"messages.getOldFeaturedStickers\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-1063816159,\"method\":\"help.getPromoData\",\"params\":[],\"type\":\"help.PromoData\"},{\"id\":505748629,\"method\":\"help.hidePromoData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-8744061,\"method\":\"phone.sendSignalingData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-589330937,\"method\":\"stats.getMegagroupStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-349483786,\"method\":\"account.getGlobalPrivacySettings\",\"params\":[],\"type\":\"GlobalPrivacySettings\"},{\"id\":517647042,\"method\":\"account.setGlobalPrivacySettings\",\"params\":[{\"name\":\"settings\",\"type\":\"GlobalPrivacySettings\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":-183649631,\"method\":\"help.dismissSuggestion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"suggestion\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1935116200,\"method\":\"help.getCountriesList\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":584962828,\"method\":\"messages.getReplies\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":1147761405,\"method\":\"messages.getDiscussionMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-147740172,\"method\":\"messages.readDiscussion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":698914348,\"method\":\"contacts.blockFromReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_message\",\"type\":\"flags.0?true\"},{\"name\":\"delete_history\",\"type\":\"flags.1?true\"},{\"name\":\"report_spam\",\"type\":\"flags.2?true\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1445996571,\"method\":\"stats.getMessagePublicForwards\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1226791947,\"method\":\"stats.getMessageStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"stats.MessageStats\"},{\"id\":-299714136,\"method\":\"messages.unpinAllMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1221445336,\"method\":\"phone.createGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"rtmp_stream\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"schedule_date\",\"type\":\"flags.1?int\"}],\"type\":\"Updates\"},{\"id\":-1322057861,\"method\":\"phone.joinGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"video_stopped\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"},{\"name\":\"invite_hash\",\"type\":\"flags.1?string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":1342404601,\"method\":\"phone.leaveGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"source\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":2067345760,\"method\":\"phone.inviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":2054648117,\"method\":\"phone.discardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1958458429,\"method\":\"phone.toggleGroupCallSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reset_invite_hash\",\"type\":\"flags.1?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_muted\",\"type\":\"flags.0?Bool\"}],\"type\":\"Updates\"},{\"id\":68699611,\"method\":\"phone.getGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupCall\"},{\"id\":-984033109,\"method\":\"phone.getGroupParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"ids\",\"type\":\"Vector\"},{\"name\":\"sources\",\"type\":\"Vector\"},{\"name\":\"offset\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":-1248003721,\"method\":\"phone.checkGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":1540419152,\"method\":\"messages.deleteChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-104078327,\"method\":\"messages.deletePhoneCallHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":1140726259,\"method\":\"messages.checkHistoryImport\",\"params\":[{\"name\":\"import_head\",\"type\":\"string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":873008187,\"method\":\"messages.initHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"media_count\",\"type\":\"int\"}],\"type\":\"messages.HistoryImport\"},{\"id\":713433234,\"method\":\"messages.uploadImportedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":-1271008444,\"method\":\"messages.startHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-1565154314,\"method\":\"messages.getExportedChatInvites\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"},{\"name\":\"offset_date\",\"type\":\"flags.2?int\"},{\"name\":\"offset_link\",\"type\":\"flags.2?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":1937010524,\"method\":\"messages.getExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-1110823051,\"method\":\"messages.editExportedChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"request_needed\",\"type\":\"flags.3?Bool\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":1452833749,\"method\":\"messages.deleteRevokedExportedChatInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"}],\"type\":\"Bool\"},{\"id\":-731601877,\"method\":\"messages.deleteExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":958457583,\"method\":\"messages.getAdminsWithInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":-553329330,\"method\":\"messages.getChatInviteImporters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"},{\"name\":\"q\",\"type\":\"flags.2?string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_user\",\"type\":\"InputUser\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-1207017500,\"method\":\"messages.setHistoryTTL\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-91437323,\"method\":\"account.reportProfilePhoto\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"InputPhoto\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":187239529,\"method\":\"channels.convertToGigagroup\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":1573261059,\"method\":\"messages.checkHistoryImportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":-248985848,\"method\":\"phone.toggleGroupCallRecord\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"start\",\"type\":\"flags.0?true\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"video_portrait\",\"type\":\"flags.2?Bool\"}],\"type\":\"Updates\"},{\"id\":-1524155713,\"method\":\"phone.editGroupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"muted\",\"type\":\"flags.0?Bool\"},{\"name\":\"volume\",\"type\":\"flags.1?int\"},{\"name\":\"raise_hand\",\"type\":\"flags.2?Bool\"},{\"name\":\"video_stopped\",\"type\":\"flags.3?Bool\"},{\"name\":\"video_paused\",\"type\":\"flags.4?Bool\"},{\"name\":\"presentation_paused\",\"type\":\"flags.5?Bool\"}],\"type\":\"Updates\"},{\"id\":480685066,\"method\":\"phone.editGroupCallTitle\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-277077702,\"method\":\"phone.getGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":-425040769,\"method\":\"phone.exportGroupCallInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.0?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":563885286,\"method\":\"phone.toggleGroupCallStartSubscription\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"subscribed\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1451287362,\"method\":\"phone.startScheduledGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1465786252,\"method\":\"phone.saveDefaultGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-873829436,\"method\":\"phone.joinGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":475058500,\"method\":\"phone.leaveGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":676017721,\"method\":\"stickers.checkShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1303364867,\"method\":\"stickers.suggestShortName\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":1032708345,\"method\":\"bots.resetBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-481554986,\"method\":\"bots.getBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":-1828139493,\"method\":\"account.resetPassword\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1284770294,\"method\":\"account.declinePasswordReset\",\"params\":[],\"type\":\"Bool\"},{\"id\":221691769,\"method\":\"auth.checkRecoveryPassword\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-700916087,\"method\":\"account.getChatThemes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-432283329,\"method\":\"messages.setChatTheme\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-1095836780,\"method\":\"channels.viewSponsoredMessage\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"random_id\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-333377601,\"method\":\"channels.getSponsoredMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":745510839,\"method\":\"messages.getMessageReadParticipants\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1240514025,\"method\":\"messages.getSearchResultsCalendar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":1855292323,\"method\":\"messages.getSearchResultsPositions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":2145904661,\"method\":\"messages.hideChatJoinRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-528091926,\"method\":\"messages.hideAllChatJoinRequests\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"}],\"type\":\"Updates\"},{\"id\":-1323389022,\"method\":\"messages.toggleNoForwards\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-855777386,\"method\":\"messages.saveDefaultSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"send_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":231174382,\"method\":\"channels.getSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":-1081501024,\"method\":\"account.setAuthorizationTTL\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1089766498,\"method\":\"account.changeAuthorizationSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.0?Bool\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.1?Bool\"}],\"type\":\"Bool\"},{\"id\":913655003,\"method\":\"channels.deleteParticipantHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-754091820,\"method\":\"messages.sendReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.1?true\"},{\"name\":\"add_to_recent\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?Vector\"}],\"type\":\"Updates\"},{\"id\":-1950707482,\"method\":\"messages.getMessagesReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1176190792,\"method\":\"messages.getMessageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?Reaction\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-21928079,\"method\":\"messages.setChatAvailableReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"available_reactions\",\"type\":\"ChatReactions\"}],\"type\":\"Updates\"},{\"id\":417243308,\"method\":\"messages.getAvailableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":1330094102,\"method\":\"messages.setDefaultReaction\",\"params\":[{\"name\":\"reaction\",\"type\":\"Reaction\"}],\"type\":\"Bool\"},{\"id\":617508334,\"method\":\"messages.translateText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"text\",\"type\":\"flags.1?string\"},{\"name\":\"from_lang\",\"type\":\"flags.2?string\"},{\"name\":\"to_lang\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":841173339,\"method\":\"messages.getUnreadReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":1420459918,\"method\":\"messages.readReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-1963375804,\"method\":\"contacts.resolvePhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":447879488,\"method\":\"phone.getGroupCallStreamChannels\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.GroupCallStreamChannels\"},{\"id\":-558650433,\"method\":\"phone.getGroupCallStreamRtmpUrl\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"revoke\",\"type\":\"Bool\"}],\"type\":\"phone.GroupCallStreamRtmpUrl\"},{\"id\":276705696,\"method\":\"messages.searchSentMedia\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":385663691,\"method\":\"messages.getAttachMenuBots\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"AttachMenuBots\"},{\"id\":1998676370,\"method\":\"messages.getAttachMenuBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"AttachMenuBotsBot\"},{\"id\":1777704297,\"method\":\"messages.toggleBotInAttachMenu\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":395003915,\"method\":\"messages.requestWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"from_bot_menu\",\"type\":\"flags.4?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"start_param\",\"type\":\"flags.3?string\"},{\"name\":\"theme_params\",\"type\":\"flags.2?DataJSON\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"WebViewResult\"},{\"id\":2146648841,\"method\":\"messages.prolongWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Bool\"},{\"id\":698084494,\"method\":\"messages.requestSimpleWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"},{\"name\":\"platform\",\"type\":\"string\"}],\"type\":\"SimpleWebViewResult\"},{\"id\":172168437,\"method\":\"messages.sendWebViewResultMessage\",\"params\":[{\"name\":\"bot_query_id\",\"type\":\"string\"},{\"name\":\"result\",\"type\":\"InputBotInlineResult\"}],\"type\":\"WebViewMessageSent\"},{\"id\":-603831608,\"method\":\"messages.sendWebViewData\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"button_text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1157944655,\"method\":\"bots.setBotMenuButton\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"button\",\"type\":\"BotMenuButton\"}],\"type\":\"Bool\"},{\"id\":-1671369944,\"method\":\"bots.getBotMenuButton\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotMenuButton\"},{\"id\":-510647672,\"method\":\"account.getSavedRingtones\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.SavedRingtones\"},{\"id\":1038768899,\"method\":\"account.saveRingtone\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"account.SavedRingtone\"},{\"id\":-2095414366,\"method\":\"account.uploadRingtone\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":2021942497,\"method\":\"bots.setBotBroadcastDefaultAdminRights\",\"params\":[{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"}],\"type\":\"Bool\"},{\"id\":-1839281686,\"method\":\"bots.setBotGroupDefaultAdminRights\",\"params\":[{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"}],\"type\":\"Bool\"},{\"id\":1092913030,\"method\":\"phone.saveCallLog\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"file\",\"type\":\"InputFile\"}],\"type\":\"Bool\"},{\"id\":-456419968,\"method\":\"channels.toggleJoinToSend\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1277789622,\"method\":\"channels.toggleJoinRequest\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":261206117,\"method\":\"payments.exportInvoice\",\"params\":[{\"name\":\"invoice_media\",\"type\":\"InputMedia\"}],\"type\":\"payments.ExportedInvoice\"},{\"id\":647928393,\"method\":\"messages.transcribeAudio\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.TranscribedAudio\"},{\"id\":2132608815,\"method\":\"messages.rateTranscribedAudio\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"good\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-2131921795,\"method\":\"payments.assignAppStoreTransaction\",\"params\":[{\"name\":\"receipt\",\"type\":\"bytes\"},{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Updates\"},{\"id\":-537046829,\"method\":\"payments.assignPlayMarketTransaction\",\"params\":[{\"name\":\"receipt\",\"type\":\"DataJSON\"},{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Updates\"},{\"id\":-1614700874,\"method\":\"payments.canPurchasePremium\",\"params\":[{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Bool\"},{\"id\":-1206152236,\"method\":\"help.getPremiumPromo\",\"params\":[],\"type\":\"help.PremiumPromo\"},{\"id\":-643100844,\"method\":\"messages.getCustomEmojiDocuments\",\"params\":[{\"name\":\"document_id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-67329649,\"method\":\"messages.getEmojiStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":248473398,\"method\":\"messages.getFeaturedEmojiStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-70001045,\"method\":\"account.updateEmojiStatus\",\"params\":[{\"name\":\"emoji_status\",\"type\":\"EmojiStatus\"}],\"type\":\"Bool\"},{\"id\":-696962170,\"method\":\"account.getDefaultEmojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":257392901,\"method\":\"account.getRecentEmojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":404757166,\"method\":\"account.clearRecentEmojiStatuses\",\"params\":[],\"type\":\"Bool\"},{\"id\":1063567478,\"method\":\"messages.reportReaction\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction_peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1149164102,\"method\":\"messages.getTopReactions\",\"params\":[{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Reactions\"},{\"id\":960896434,\"method\":\"messages.getRecentReactions\",\"params\":[{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Reactions\"},{\"id\":-1644236876,\"method\":\"messages.clearRecentReactions\",\"params\":[],\"type\":\"Bool\"},{\"id\":-2064119788,\"method\":\"messages.getExtendedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":767062953,\"method\":\"auth.importWebTokenAuthorization\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"web_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-279966037,\"method\":\"account.reorderUsernames\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1490465654,\"method\":\"account.toggleUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"active\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1268978403,\"method\":\"channels.reorderUsernames\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1358053637,\"method\":\"channels.toggleUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"active\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":170155475,\"method\":\"channels.deactivateAllUsernames\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":-1540781271,\"method\":\"channels.toggleForum\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-200539612,\"method\":\"channels.createForumTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"icon_color\",\"type\":\"flags.0?int\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.3?long\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"send_as\",\"type\":\"flags.2?InputPeer\"}],\"type\":\"Updates\"},{\"id\":233136337,\"method\":\"channels.getForumTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"flags.0?string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_topic\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ForumTopics\"},{\"id\":-1333584199,\"method\":\"channels.getForumTopicsByID\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"topics\",\"type\":\"Vector\"}],\"type\":\"messages.ForumTopics\"},{\"id\":-186670715,\"method\":\"channels.editForumTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"topic_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.1?long\"},{\"name\":\"closed\",\"type\":\"flags.2?Bool\"},{\"name\":\"hidden\",\"type\":\"flags.3?Bool\"}],\"type\":\"Updates\"},{\"id\":1814925350,\"method\":\"channels.updatePinnedForumTopic\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"topic_id\",\"type\":\"int\"},{\"name\":\"pinned\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":876830509,\"method\":\"channels.deleteTopicHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"top_msg_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":693150095,\"method\":\"channels.reorderPinnedForumTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1760814315,\"method\":\"channels.toggleAntiSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-1471109485,\"method\":\"channels.reportAntiSpamFalsePositive\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-1632299963,\"method\":\"messages.setDefaultHistoryTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1703637384,\"method\":\"messages.getDefaultHistoryTTL\",\"params\":[],\"type\":\"DefaultHistoryTTL\"},{\"id\":-127582169,\"method\":\"contacts.exportContactToken\",\"params\":[],\"type\":\"ExportedContactToken\"},{\"id\":318789512,\"method\":\"contacts.importContactToken\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-1189444673,\"method\":\"photos.uploadContactProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"suggest\",\"type\":\"flags.3?true\"},{\"name\":\"save\",\"type\":\"flags.4?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"photos.Photo\"},{\"id\":1785624660,\"method\":\"channels.toggleParticipantsHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"}]},\"layer\":151} as {\n MTProto: {\n constructors: MTProtoConstructor[],\n methods: MTProtoMethod[],\n constructorsIndex?: {[id: number]: number}\n },\n API: {\n constructors: MTProtoConstructor[],\n methods: MTProtoMethod[],\n constructorsIndex?: {[id: number]: number}\n },\n layer: number,\n};\n","export default function intToUint(val: number) {\n // return val < 0 ? val + 4294967296 : val; // 0 <= val <= Infinity\n return val >>> 0; // (4294967296 >>> 0) === 0; 0 <= val <= 4294967295\n}\n","import bigInt from 'big-integer';\nimport intToUint from '../number/intToUint';\n\nexport default function ulongFromInts(high: number, low: number) {\n high = intToUint(high), low = intToUint(low);\n return bigInt(high).shiftLeft(32).add(bigInt(low));\n}\n","import bigInt from 'big-integer';\n\nexport const safeBigInt = bigInt(Number.MAX_SAFE_INTEGER);\nexport const ulongBigInt = bigInt(bigInt[2]).pow(64);\nexport const longBigInt = ulongBigInt.divide(bigInt[2]);\n","import bigInt from 'big-integer';\nimport { longBigInt, ulongBigInt } from './bigIntConstants';\n\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\n}\n\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\n return new Uint8Array(bigInt.toArray(256).value);\n}\n\nexport function bigIntToSigned(bigInt: bigInt.BigInteger) {\n return bigInt.greater(longBigInt) ? bigInt.minus(ulongBigInt) : bigInt;\n}\n\nexport function bigIntToUnsigned(bigInt: bigInt.BigInteger) {\n return bigInt.isNegative() ? ulongBigInt.add(bigInt) : bigInt;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Schema, {MTProtoConstructor} from './schema';\nimport {JSONValue} from '../../layer';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport gzipUncompress from '../../helpers/gzipUncompress';\nimport bigInt from 'big-integer';\nimport ulongFromInts from '../../helpers/long/ulongFromInts';\nimport {safeBigInt} from '../../helpers/bigInt/bigIntConstants';\nimport {bigIntToSigned, bigIntToUnsigned} from '../../helpers/bigInt/bigIntConversion';\n\nconst boolFalse = +Schema.API.constructors.find((c) => c.predicate === 'boolFalse').id;\nconst boolTrue = +Schema.API.constructors.find((c) => c.predicate === 'boolTrue').id;\nconst vector = +Schema.API.constructors.find((c) => c.predicate === 'vector').id;\nconst gzipPacked = +Schema.MTProto.constructors.find((c) => c.predicate === 'gzip_packed').id;\n\n// * using slice to have a new buffer, otherwise the buffer will be copied to main thread\nconst sliceMethod: 'slice' | 'subarray' = 'slice'; // subarray\n\nclass TLSerialization {\n private maxLength = 2048; // 2Kb\n private offset = 0; // in bytes\n private mtproto = false;\n private debug = false;// Modes.debug;\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n constructor(options: Partial<{startMaxLength: number, mtproto: true}> = {}) {\n this.maxLength = options.startMaxLength || 2048; // 2Kb\n this.mtproto = options.mtproto || false;\n this.createBuffer();\n }\n\n public createBuffer() {\n this.buffer = new ArrayBuffer(this.maxLength);\n this.intView = new Int32Array(this.buffer);\n this.byteView = new Uint8Array(this.buffer);\n }\n\n public getArray() {\n const resultBuffer = new ArrayBuffer(this.offset);\n\n // let perf = performance.now();\n /* const resultUint8: any = new Uint8Array(resultBuffer);\n resultUint8.set(this.byteView.subarray(0, this.offset)); */\n // console.log('perf uint8', performance.now() - perf);\n\n // perf = performance.now();\n const resultInt32 = new Int32Array(resultBuffer);\n resultInt32.set(this.intView.subarray(0, this.offset / 4));\n // console.log('perf int32', performance.now() - perf);\n\n /* if(resultUint8.buffer.byteLength !== resultInt32.buffer.byteLength) {\n console.error(resultUint8, resultInt32);\n } */\n\n return resultInt32;\n }\n\n public getBuffer() {\n return this.getArray().buffer;\n }\n\n public getBytes(typed: true): Uint8Array;\n public getBytes(typed?: false): number[];\n public getBytes(typed: boolean = true): number[] | Uint8Array {\n if(typed) {\n const resultBuffer = new ArrayBuffer(this.offset);\n const resultArray = new Uint8Array(resultBuffer);\n\n resultArray.set(this.byteView.subarray(0, this.offset));\n\n return resultArray;\n }\n\n const bytes: number[] = new Array(this.offset);\n for(let i = 0; i < this.offset; ++i) {\n bytes[i] = this.byteView[i];\n }\n return bytes;\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public checkLength(needBytes: number) {\n if(this.offset + needBytes < this.maxLength) {\n return;\n }\n\n // console.log('Increase buffer start', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32));\n this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4;\n const previousBuffer = this.buffer;\n // const previousByteView = this.byteView;\n const previousArray = new Int32Array(previousBuffer);\n\n this.createBuffer();\n\n new Int32Array(this.buffer).set(previousArray);\n /* console.log('Increase buffer end', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32),\n bytesCmp(previousByteView, this.byteView.slice(0, previousByteView.length))); */\n }\n\n public writeInt(i: number, field: string) {\n this.debug && console.log('>>>', i.toString(16), i, field);\n\n const offset = this.offset / 4;\n this.checkLength(4);\n this.intView[offset] = i;\n this.offset += 4;\n\n return offset;\n }\n\n public storeInt(i: number, field?: string) {\n return this.writeInt(i, (field || '') + ':int');\n }\n\n public storeBool(i: boolean, field?: string) {\n if(i) {\n this.writeInt(boolTrue, (field || '') + ':bool');\n } else {\n this.writeInt(boolFalse, (field || '') + ':bool');\n }\n }\n\n public storeLongP(iHigh: number, iLow: number, field?: string) {\n this.writeInt(iLow, (field || '') + ':long[low]');\n this.writeInt(iHigh, (field || '') + ':long[high]');\n }\n\n public storeLong(sLong: Array | string | number, field?: string) {\n if(Array.isArray(sLong)) {\n if(sLong.length === 2) {\n return this.storeLongP(sLong[0], sLong[1], field);\n } else {\n return this.storeIntBytes(sLong, 64, field);\n }\n }\n\n const _bigInt = bigIntToUnsigned(bigInt(sLong as string));\n const {quotient, remainder} = _bigInt.divmod(0x100000000);\n const high = quotient.toJSNumber();\n const low = remainder.toJSNumber();\n\n this.writeInt(low, (field || '') + ':long[low]');\n this.writeInt(high, (field || '') + ':long[high]');\n }\n\n public storeDouble(f: any, field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n\n doubleView[0] = f;\n\n this.writeInt(intView[0], (field || '') + ':double[low]');\n this.writeInt(intView[1], (field || '') + ':double[high]');\n }\n\n public storeString(s: string, field?: string) {\n this.debug && console.log('>>>', s, (field || '') + ':string');\n\n if(s === undefined) {\n s = '';\n }\n const sUTF8 = unescape(encodeURIComponent(s));\n\n this.checkLength(sUTF8.length + 8);\n\n const len = sUTF8.length;\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n for(let i = 0; i < len; ++i) {\n this.byteView[this.offset++] = sUTF8.charCodeAt(i);\n }\n\n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n\n public storeBytes(bytes: ArrayBuffer | Uint8Array | number[], field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n } else if(bytes === undefined) {\n bytes = [];\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as number[]), (field || '') + ':bytes');\n\n // if uint8array was json.stringified, then will be: {'0': 123, '1': 123}\n const len = (bytes as Uint8Array).length;\n this.checkLength(len + 8);\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n\n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n\n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n\n public storeIntBytes(bytes: ArrayBuffer | Uint8Array | number[], bits: number, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = (bytes as Uint8Array).length;\n if((bits % 32) || (len * 8) !== bits) {\n const error = new Error('Invalid bits: ' + bits + ', ' + len);\n console.error(error, bytes, field);\n throw error;\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as Uint8Array), (field || '') + ':int' + bits);\n this.checkLength(len);\n\n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n }\n\n public storeRawBytes(bytes: ArrayLike, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = bytes.length;\n\n this.debug && console.log('>>>', bytesToHex(bytes), (field || ''));\n this.checkLength(len);\n\n this.byteView.set(bytes, this.offset);\n this.offset += len;\n }\n\n public storeMethod(methodName: string, params: any) {\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const methodData = schema.methods.find((m) => m.method === methodName);\n\n if(!methodData) {\n throw new Error('No method ' + methodName + ' found');\n }\n\n this.storeInt(methodData.id, methodName + '[id]');\n\n const pFlags = params.pFlags || params; // * support pFlags, though am not expecting it to be there\n const flagsOffsets: {[paramName: string]: number} = {};\n // console.log('storeMethod', len, methodData);\n for(const param of methodData.params) {\n let type = param.type;\n\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(params[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags[param.name] : params[param.name] !== undefined) {\n // console.log('storeMethod autocompleting', methodName, param.name, params[param.name], type);\n params[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n // console.log('storeMethod', methodName, fieldBit, params[fieldBit[0]], params, param, condType, !!(params[fieldBit[0]] & (1 << +fieldBit[1])));\n type = condType[1];\n }\n\n // console.log('storeMethod', methodName, param.name, params[param.name], type);\n const result = this.storeObject(params[param.name], type, methodName + '[' + param.name + ']');\n\n if(type === '#') {\n params[param.name] = params[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(const paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = params[paramName];\n }\n\n return methodData.type;\n }\n\n public storeObject(obj: any, type: string, field?: string) {\n // console.log('storeObject', obj, type, field, this.offset, this.getBytes(true).hex);\n switch(type) {\n case '#':\n obj = obj || 0;\n case 'int':\n return this.storeInt(obj, field);\n case 'long':\n return this.storeLong(obj, field);\n case 'int128':\n return this.storeIntBytes(obj, 128, field);\n case 'int256':\n return this.storeIntBytes(obj, 256, field);\n case 'int512':\n return this.storeIntBytes(obj, 512, field);\n case 'string':\n return this.storeString(obj, field);\n case 'bytes':\n return this.storeBytes(obj, field);\n case 'double':\n return this.storeDouble(obj, field);\n case 'Bool':\n return this.storeBool(obj, field);\n case 'true':\n return\n }\n\n if(Array.isArray(obj)) {\n if(type.substr(0, 6) === 'Vector') {\n this.writeInt(vector, field + '[id]');\n } else if(type.substr(0, 6) !== 'vector') {\n throw new Error('Invalid vector type ' + type);\n }\n\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n this.writeInt(obj.length, field + '[count]');\n for(let i = 0; i < obj.length; ++i) {\n this.storeObject(obj[i], itemType, field + '[' + i + ']');\n }\n\n return true;\n } else if(type.substr(0, 6).toLowerCase() === 'vector') {\n throw new Error('Invalid vector object');\n }\n\n if(!isObject(obj)) {\n throw new Error('Invalid object for type ' + type);\n }\n\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const predicate = obj['_'];\n let isBare = false;\n const constructorData: MTProtoConstructor = schema.constructors.find((c) => c.predicate === predicate);\n\n if(isBare = (type.charAt(0) === '%')) {\n type = type.substr(1);\n }\n\n if(!constructorData) {\n throw new Error('No predicate ' + predicate + ' found');\n }\n\n if(predicate === type) {\n isBare = true;\n }\n\n if(!isBare) {\n this.writeInt(constructorData.id, field + '[' + predicate + '][id]');\n }\n\n const pFlags = obj.pFlags;\n const flagsOffsets: {[paramName: string]: number} = {};\n // console.log('storeObject', len, constructorData);\n for(const param of constructorData.params) {\n let type = param.type;\n\n // console.log('storeObject', param, type);\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n // console.log('storeObject fieldBit', fieldBit, obj[fieldBit[0]]);\n\n if(!(obj[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags && pFlags[param.name] : obj[param.name] !== undefined) {\n // console.log('storeObject autocompleting', param.name, obj[param.name], type);\n obj[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n type = condType[1];\n }\n // console.log('storeObject', param, type);\n\n const result = this.storeObject(obj[param.name], type, field + '[' + predicate + '][' + param.name + ']');\n\n if(type === '#') {\n obj[param.name] = obj[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(const paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = obj[paramName];\n }\n\n return constructorData.type;\n }\n}\n\nclass TLDeserialization {\n private offset = 0; // in bytes\n private override: {[key: string]: (result: any, field: string) => void};\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n // this.debug =\n private mtproto: boolean = false;\n private debug: boolean;\n\n constructor(buffer: ArrayBuffer | Uint8Array, options: Partial<{override: any, mtproto: true, debug: true}> = {}) {\n // buffer = addPadding(buffer, 4, true); // fix 21.01.2020 for wss\n if(buffer instanceof ArrayBuffer) {\n this.buffer = buffer;\n this.intView = new Int32Array(buffer);\n this.byteView = new Uint8Array(this.buffer);\n } else {\n this.buffer = buffer.buffer;\n this.intView = new Int32Array(buffer.buffer);\n this.byteView = buffer;\n }\n\n // console.log(this.intView);\n\n this.override = options.override || {};\n this.mtproto = !!options.mtproto;\n this.debug = options.debug !== undefined ? options.debug : /* Modes.debug */false;\n }\n\n /* public setMtproto(mtproto: boolean) {\n this.mtproto = mtproto;\n } */\n\n private readInt(field: string) {\n // if(this.offset >= this.intView.length * 4) {\n if((this.byteView.length - this.offset) < 4) {\n console.error(this.byteView, this.offset);\n throw new Error('Nothing to fetch: ' + field);\n }\n\n const i = this.intView[this.offset / 4];\n // const i = new Uint32Array(this.byteView.buffer.slice(this.offset, this.offset + 4))[0];\n\n this.debug &&/* || field.includes('[dialog][read_outbox_max_id]') */\n console.log('<<<', i.toString(16), i, field,\n this.byteView.slice(this.offset - 16, this.offset + 16),\n bytesToHex(this.byteView.slice(this.offset - 16, this.offset + 16)));\n\n this.offset += 4;\n\n return i;\n }\n\n public fetchInt(field?: string) {\n return this.readInt((field || '') + ':int');\n }\n\n public fetchDouble(field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n\n intView[0] = this.readInt((field || '') + ':double[low]'),\n intView[1] = this.readInt((field || '') + ':double[high]');\n\n return doubleView[0];\n }\n\n // ! it should've been signed\n public fetchLong(field?: string): FetchLongAs {\n const iLow = this.readInt((field || '') + ':long[low]');\n const iHigh = this.readInt((field || '') + ':long[high]');\n\n let ulong = ulongFromInts(iHigh, iLow);\n if(/* !unsigned && */!this.mtproto) { // make it signed\n ulong = bigIntToSigned(ulong);\n }\n\n if(!this.mtproto) {\n if(safeBigInt.greaterOrEquals(ulong.abs())) {\n // @ts-ignore\n return ulong.toJSNumber();\n }\n }\n\n // @ts-ignore\n return ulong.toString(10);\n }\n\n public fetchBool(field?: string): boolean {\n const i = this.readInt((field || '') + ':bool');\n if(i === boolTrue) {\n return true;\n } else if(i === boolFalse) {\n return false;\n }\n\n this.offset -= 4;\n return this.fetchObject('Object', field);\n }\n\n public fetchString(field?: string): string {\n let len = this.byteView[this.offset++];\n\n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n\n let sUTF8 = '';\n for(let i = 0; i < len; ++i) {\n sUTF8 += String.fromCharCode(this.byteView[this.offset++]);\n }\n\n // Padding\n while(this.offset % 4) {\n ++this.offset;\n }\n\n let s: string;\n try {\n s = decodeURIComponent(escape(sUTF8));\n } catch(e) {\n s = sUTF8;\n }\n\n this.debug && console.log('<<<', s, (field || '') + ':string');\n\n return s;\n }\n\n public fetchBytes(field?: string) {\n let len = this.byteView[this.offset++];\n\n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n\n const bytes = this.byteView[sliceMethod](this.offset, this.offset + len);\n this.offset += len;\n\n // Padding\n while(this.offset % 4) {\n ++this.offset;\n }\n\n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':bytes');\n\n return bytes;\n }\n\n public fetchIntBytes(bits: number, typed: true, field?: string): Uint8Array;\n public fetchIntBytes(bits: number, typed?: false, field?: string): number[];\n public fetchIntBytes(bits: number, typed: boolean = true, field?: string) {\n if(bits % 32) {\n throw new Error('Invalid bits: ' + bits);\n }\n\n const len = bits / 8;\n if(typed) {\n const result = this.byteView[sliceMethod](this.offset, this.offset + len);\n this.offset += len;\n return result;\n }\n\n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; ++i) {\n bytes[i] = this.byteView[this.offset++];\n }\n\n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':int' + bits);\n\n return bytes;\n }\n\n public fetchRawBytes(len: number | false, typed: true, field: string): Uint8Array;\n public fetchRawBytes(len: number | false, typed: false, field: string): number[];\n public fetchRawBytes(len: number | false, typed: boolean = true, field: string) {\n if(len === false) {\n len = this.readInt((field || '') + '_length');\n if(len > this.byteView.byteLength) {\n throw new Error('Invalid raw bytes length: ' + len + ', buffer len: ' + this.byteView.byteLength);\n }\n }\n\n if(typed) {\n const bytes = new Uint8Array(len);\n bytes.set(this.byteView[sliceMethod](this.offset, this.offset + len));\n this.offset += len;\n return bytes;\n }\n\n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; ++i) {\n bytes[i] = this.byteView[this.offset++];\n }\n\n this.debug && console.log('<<<', bytesToHex(bytes), (field || ''));\n\n return bytes;\n }\n\n private fetchVector(type: string, field?: string) {\n const len = this.readInt(field + '[count]');\n const result: any[] = new Array(len);\n if(len > 0) {\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n for(let i = 0; i < len; ++i) {\n result[i] = this.fetchObject(itemType, field + '[' + i + ']');\n }\n }\n\n return result;\n }\n\n public fetchObject(type: string, field?: string): any {\n switch(type) {\n case '#':\n case 'int':\n return this.fetchInt(field);\n case 'long':\n return this.fetchLong(field);\n case 'int128':\n return this.fetchIntBytes(128, true, field);\n case 'int256':\n return this.fetchIntBytes(256, true, field);\n case 'int512':\n return this.fetchIntBytes(512, true, field);\n case 'string':\n return this.fetchString(field);\n case 'bytes':\n return this.fetchBytes(field);\n case 'double':\n return this.fetchDouble(field);\n case 'Bool':\n return this.fetchBool(field);\n case 'true':\n return true;\n }\n\n field = field || type || 'Object';\n\n if(type.charAt(0) === 'v' && type.substr(1, 5) === 'ector') {\n return this.fetchVector(type, field);\n }\n\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n let constructorData: MTProtoConstructor = null;\n let fallback = false;\n\n if(type.charAt(0) === '%') {\n const checkType = type.substr(1);\n constructorData = schema.constructors.find((c) => c.type === checkType);\n if(!constructorData) {\n throw new Error('Constructor not found for type: ' + type);\n }\n }/* else if(type.charAt(0) >= 97 && type.charAt(0) <= 122) {\n constructorData = schema.constructors.find((c) => c.predicate === type);\n if(!constructorData) {\n throw new Error('Constructor not found for predicate: ' + type);\n }\n } */ else {\n const constructorCmp = this.readInt(field + '[id]');\n\n if(constructorCmp === gzipPacked) { // Gzip packed\n const compressed = this.fetchBytes(field + '[packed_string]');\n const uncompressed = gzipUncompress(compressed) as Uint8Array;\n const newDeserializer = new TLDeserialization(uncompressed); // rpc_result is packed here\n\n return newDeserializer.fetchObject(type, field);\n }\n\n if(constructorCmp === vector) {\n return this.fetchVector(type, field);\n }\n\n let index = schema.constructorsIndex;\n if(!index) {\n schema.constructorsIndex = index = {};\n for(let i = 0, len = schema.constructors.length; i < len; ++i) {\n index[schema.constructors[i].id] = i;\n }\n }\n\n const i = index[constructorCmp];\n if(i !== undefined) {\n constructorData = schema.constructors[i];\n }\n\n if(!constructorData && this.mtproto) {\n const schemaFallback = Schema.API;\n for(let i = 0, len = schemaFallback.constructors.length; i < len; ++i) {\n if(+schemaFallback.constructors[i].id === constructorCmp) {\n constructorData = schemaFallback.constructors[i];\n\n delete this.mtproto;\n fallback = true;\n break;\n }\n }\n }\n\n if(!constructorData) {\n console.error('Constructor not found:', constructorCmp);\n\n let int1: number, int2: number;\n try {\n int1 = this.fetchInt(field);\n int2 = this.fetchInt(field);\n } catch(err) {\n\n }\n\n throw new Error('Constructor not found: ' + constructorCmp + ' ' + int1 + ' ' + int2 + ' ' + field);\n }\n }\n\n const predicate = constructorData.predicate;\n\n const result: any = {'_': predicate};\n const overrideKey = (this.mtproto ? 'mt_' : '') + predicate;\n if(this.override[overrideKey]) {\n this.override[overrideKey](result, field + '[' + predicate + ']');\n } else {\n for(let i = 0, len = constructorData.params.length; i < len; ++i) {\n const param = constructorData.params[i];\n let type = param.type;\n\n if(type === '#' && result.pFlags === undefined) {\n result.pFlags = {};\n }\n\n const isCond = type.indexOf('?') !== -1;\n if(isCond) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(result[fieldBit[0]] & (1 << +fieldBit[1]))) {\n continue;\n }\n\n type = condType[1];\n }\n\n const value = this.fetchObject(type, field + '[' + predicate + '][' + param.name + ']');\n\n if(isCond && type === 'true') {\n result.pFlags[param.name] = value;\n } else {\n result[param.name] = value;\n }\n }\n }\n\n if(fallback) {\n this.mtproto = true;\n }\n\n if(type === 'JSONValue') {\n return this.formatJSONValue(result);\n }\n\n return result;\n }\n\n private formatJSONValue(jsonValue: JSONValue): any {\n if(!jsonValue._) return jsonValue;\n switch(jsonValue._) {\n case 'jsonNull':\n return null;\n case 'jsonObject': {\n const out: any = {};\n const objectValues = jsonValue.value;\n for(let i = 0, length = objectValues.length; i < length; ++i) {\n const objectValue = objectValues[i];\n out[objectValue.key] = this.formatJSONValue(objectValue.value);\n }\n return out;\n }\n default:\n return jsonValue.value;\n }\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public setOffset(offset: number) {\n this.offset = offset;\n }\n\n /* public fetchEnd() {\n if(this.offset !== this.byteView.length) {\n throw new Error('Fetch end with non-empty buffer');\n }\n\n return true;\n } */\n}\n\nMOUNT_CLASS_TO.TLDeserialization = TLDeserialization;\nMOUNT_CLASS_TO.TLSerialization = TLSerialization;\nexport {TLDeserialization, TLSerialization};\n","// export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n// import dT from './dT';\n\n// export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport default function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n // console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n // console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","import randomize from '../array/randomize';\nimport bufferConcats from './bufferConcats';\n\nexport default function addPadding(\n bytes: T,\n blockSize: number = 16,\n zeroes?: boolean,\n blockSizeAsTotalLength = false,\n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n // //console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n randomize(padding);\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {TLDeserialization, TLSerialization} from './tl_utils';\nimport CryptoWorker from '../crypto/cryptoMessagePort';\nimport sessionStorage from '../sessionStorage';\nimport Schema from './schema';\nimport {NetworkerFactory} from './networkerFactory';\nimport {logger, LogTypes} from '../logger';\nimport {InvokeApiOptions} from '../../types';\nimport longToBytes from '../../helpers/long/longToBytes';\nimport MTTransport from './transports/transport';\nimport {nextRandomUint, randomLong} from '../../helpers/random';\nimport App from '../../config/app';\nimport DEBUG from '../../config/debug';\nimport Modes from '../../config/modes';\nimport noop from '../../helpers/noop';\n\n \nimport HTTP from './transports/http';\n \n\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport bigInt from 'big-integer';\nimport {ConnectionStatus} from './connectionStatus';\nimport ctx from '../../environment/ctx';\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\nimport isObject from '../../helpers/object/isObject';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport sortLongsArray from '../../helpers/long/sortLongsArray';\nimport randomize from '../../helpers/array/randomize';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\nimport {getEnvironment} from '../../environment/utils';\nimport {TimeManager} from './timeManager';\n\n// console.error('networker included!', new Error().stack);\n\nexport type MTMessageOptions = InvokeApiOptions & Partial<{\n noResponse: true, // http_wait\n longPoll: true,\n\n notContentRelated: true, // ACK\n noSchedule: true,\n // withResult: true,\n messageId: MTLong,\n}>;\n\nexport type MTMessage = InvokeApiOptions & MTMessageOptions & {\n msg_id: MTLong,\n seq_no: number,\n body?: Uint8Array | number[],\n isAPI?: boolean,\n // only these four are important\n\n acked?: boolean,\n\n deferred?: CancellablePromise,\n\n container?: boolean,\n inner?: MTLong[],\n\n // below - options\n\n notContentRelated?: true,\n noSchedule?: true,\n\n resultType?: string,\n\n longPoll?: true,\n noResponse?: true, // only with http (http_wait for longPoll)\n};\n\nconst DRAIN_TIMEOUT = 10000;\nconst delays: {\n [k in 'client' | 'file']: {\n disconnectDelayMin: number,\n disconnectDelayMax: number,\n pingInterval: number,\n pingMaxTime: number,\n connectionTimeout: number\n }\n} = {\n client: {\n disconnectDelayMin: 7,\n disconnectDelayMax: 20,\n pingInterval: 2000,\n pingMaxTime: 5,\n connectionTimeout: 5000\n },\n file: {\n disconnectDelayMin: 10,\n disconnectDelayMax: 24,\n pingInterval: 3000,\n pingMaxTime: 7,\n connectionTimeout: 7500\n }\n};\nconst RESEND_OPTIONS: MTMessageOptions = {\n noSchedule: true,\n notContentRelated: true\n};\nlet invokeAfterMsgConstructor: number;\nlet networkerTempId = 0;\n\nexport default class MTPNetworker {\n private authKeyUint8: Uint8Array;\n\n public isFileNetworker: boolean;\n private isFileUpload: boolean;\n private isFileDownload: boolean;\n\n private lastServerMessages: Array = [];\n\n private sentMessages: {\n [msgId: MTLong]: MTMessage\n } = {};\n\n private pendingMessages: {[msgId: MTLong]: number} = {};\n private pendingAcks: Array = [];\n private pendingResendReq: MTLong[] = [];\n // private pendingResendAnsReq: MTLong[] = [];\n public connectionInited: boolean;\n\n private nextReqTimeout: number;\n private nextReq: number = 0;\n\n \n private longPollInterval: number;\n private longPollPending: number;\n private checkConnectionRetryAt: number;\n private checkConnectionTimeout: number;\n private checkConnectionPeriod = 0;\n private sleepAfter: number;\n private offline = false;\n private sendingLongPoll: boolean;\n \n\n private seqNo: number;\n private prevSessionId: Uint8Array;\n private sessionId: Uint8Array;\n private serverSalt: Uint8Array;\n\n private lastResendReq: {\n reqMsgId: MTLong,\n msgIds: MTPNetworker['pendingResendReq']\n };\n // private lastResendAnsReq: MTPNetworker['lastResendReq'];\n\n private name: string;\n private log: ReturnType;\n\n public isOnline = false;\n private status: ConnectionStatus = ConnectionStatus.Closed;\n private lastResponseTime = 0;\n\n private debug = DEBUG /* && false */ || Modes.debug;\n\n public activeRequests = 0;\n\n public onDrain: () => void;\n private onDrainTimeout: number;\n\n public transport: MTTransport;\n\n \n private pingDelayDisconnectDeferred: CancellablePromise;\n private pingPromise: Promise;\n // private pingInterval: number;\n private lastPingTime: number;\n private lastPingStartTime: number;\n private lastPingDelayDisconnectId: string;\n \n // public onConnectionStatusChange: (online: boolean) => void;\n\n // private debugRequests: Array<{before: Uint8Array, after: Uint8Array}> = [];\n\n private delays: typeof delays[keyof typeof delays];\n // private getNewTimeOffset: boolean;\n\n constructor(\n private networkerFactory: NetworkerFactory,\n private timeManager: TimeManager,\n public dcId: number,\n private authKey: Uint8Array,\n private authKeyId: Uint8Array,\n serverSalt: Uint8Array,\n options: InvokeApiOptions = {}\n ) {\n this.authKeyUint8 = convertToUint8Array(this.authKey);\n this.serverSalt = convertToUint8Array(serverSalt);\n\n this.isFileUpload = !!options.fileUpload;\n this.isFileDownload = !!options.fileDownload;\n this.isFileNetworker = this.isFileUpload || this.isFileDownload;\n this.delays = this.isFileNetworker ? delays.file : delays.client;\n\n const suffix = this.isFileUpload ? '-U' : this.isFileDownload ? '-D' : '';\n this.name = 'NET-' + dcId + suffix;\n // this.log = logger(this.name, this.upload && this.dcId === 2 ? LogLevels.debug | LogLevels.warn | LogLevels.log | LogLevels.error : LogLevels.error);\n this.log = logger(this.name + (suffix ? '' : '-C') + '-' + networkerTempId++, LogTypes.Log/* | LogTypes.Debug */ | LogTypes.Error | LogTypes.Warn);\n this.log('constructor'/* , this.authKey, this.authKeyID, this.serverSalt */);\n\n // Test resend after bad_server_salt\n /* if(this.dcId === 2 && this.upload) {\n //timeManager.applyServerTime((Date.now() / 1000 - 86400) | 0);\n this.serverSalt[0] = 0;\n } */\n\n this.updateSession();\n\n // if(!NetworkerFactory.offlineInited) {\n // NetworkerFactory.offlineInited = true;\n // /* rootScope.offline = true\n // rootScope.offlineConnecting = true */\n // }\n }\n\n private updateSession() {\n this.seqNo = 0;\n this.prevSessionId = this.sessionId;\n this.sessionId = randomize(new Uint8Array(8));\n }\n\n /* private clearContainers() {\n for(const messageId in this.sentMessages) {\n const message = this.sentMessages[messageId];\n if(message.container) {\n delete this.sentMessages[messageId];\n }\n }\n } */\n\n private updateSentMessage(sentMessageId: string) {\n const sentMessage = this.sentMessages[sentMessageId];\n if(!sentMessage) {\n return false;\n }\n\n if(sentMessage.container) {\n forEachReverse(sentMessage.inner, (innerSentMessageId, idx) => {\n const innerSentMessage = this.updateSentMessage(innerSentMessageId);\n if(!innerSentMessage) {\n sentMessage.inner.splice(idx, 1);\n } else {\n sentMessage.inner[idx] = innerSentMessage.msg_id;\n }\n });\n }\n\n sentMessage.msg_id = this.timeManager.generateId();\n sentMessage.seq_no = this.generateSeqNo(sentMessage.notContentRelated || sentMessage.container);\n\n if(this.debug) {\n this.log(`updateSentMessage, old=${sentMessageId}, new=${sentMessage.msg_id}`);\n }\n\n this.sentMessages[sentMessage.msg_id] = sentMessage;\n delete this.sentMessages[sentMessageId];\n\n return sentMessage;\n }\n\n private generateSeqNo(notContentRelated?: boolean) {\n let seqNo = this.seqNo * 2;\n\n if(!notContentRelated) {\n seqNo++;\n this.seqNo++;\n }\n\n return seqNo;\n }\n\n public wrapMtpCall(method: string, params: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n\n serializer.storeMethod(method, params);\n\n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n\n if(Modes.debug) {\n this.log('MT call', method, params, messageId, seqNo);\n }\n\n return this.pushMessage(message, options);\n }\n\n public wrapMtpMessage(object: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeObject(object, 'Object');\n\n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo(options.notContentRelated);\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n\n if(Modes.debug) {\n this.log('MT message', object, messageId, seqNo);\n }\n\n return this.pushMessage(message, options);\n }\n\n public wrapApiCall(method: string, params: any = {}, options: InvokeApiOptions = {}) {\n const serializer = new TLSerialization(options);\n\n if(!this.connectionInited) { // this will call once for each new session\n // /////this.log('Wrap api call !this.connectionInited');\n\n const invokeWithLayer = Schema.API.methods.find((m) => m.method === 'invokeWithLayer');\n if(!invokeWithLayer) throw new Error('no invokeWithLayer!');\n serializer.storeInt(+invokeWithLayer.id, 'invokeWithLayer');\n\n // @ts-ignore\n serializer.storeInt(Schema.layer, 'layer');\n\n const initConnection = Schema.API.methods.find((m) => m.method === 'initConnection');\n if(!initConnection) throw new Error('no initConnection!');\n\n serializer.storeInt(+initConnection.id, 'initConnection');\n serializer.storeInt(0x0, 'flags');\n serializer.storeInt(App.id, 'api_id');\n serializer.storeString(getEnvironment().USER_AGENT || 'Unknown UserAgent', 'device_model');\n serializer.storeString(navigator.platform || 'Unknown Platform', 'system_version');\n serializer.storeString(App.version + (App.isMainDomain ? ' ' + App.suffix : ''), 'app_version');\n serializer.storeString(navigator.language || 'en', 'system_lang_code');\n serializer.storeString(App.langPack, 'lang_pack');\n serializer.storeString(this.networkerFactory.language, 'lang_code');\n // serializer.storeInt(0x0, 'proxy');\n /* serializer.storeMethod('initConnection', {\n 'flags': 0,\n 'api_id': App.id,\n 'device_model': navigator.userAgent || 'Unknown UserAgent',\n 'system_version': navigator.platform || 'Unknown Platform',\n 'app_version': App.version,\n 'system_lang_code': navigator.language || 'en',\n 'lang_pack': '',\n 'lang_code': navigator.language || 'en'\n }); */\n }\n\n if(options.afterMessageId) {\n if(invokeAfterMsgConstructor === undefined) {\n const m = Schema.API.methods.find((m) => m.method === 'invokeAfterMsg');\n invokeAfterMsgConstructor = m ? +m.id : 0;\n }\n\n if(invokeAfterMsgConstructor) {\n // if(this.debug) {\n // this.log('invokeApi: store invokeAfterMsg');\n // }\n\n serializer.storeInt(invokeAfterMsgConstructor, 'invokeAfterMsg');\n serializer.storeLong(options.afterMessageId, 'msg_id');\n } else {\n this.log.error('no invokeAfterMsg!');\n }\n }\n\n options.resultType = serializer.storeMethod(method, params);\n\n /* if(method === 'account.updateNotifySettings') {\n this.log('api call body:', serializer.getBytes(true));\n } */\n\n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true),\n isAPI: true\n };\n\n if(Modes.debug/* || true */) {\n this.log('Api call', method, message, params, options);\n } else if(this.debug) {\n this.log('Api call', method, params, options);\n }\n\n return this.pushMessage(message, options);\n }\n\n public changeTransport(transport?: MTTransport) {\n const oldTransport = this.transport;\n if(oldTransport) {\n oldTransport.destroy();\n\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n }\n\n this.connectionInited = false;\n\n \n if(this.longPollInterval !== undefined) {\n clearInterval(this.longPollInterval);\n this.longPollInterval = undefined;\n }\n\n this.clearCheckConnectionTimeout();\n \n }\n\n this.log('change transport', transport, oldTransport);\n\n \n this.clearPingDelayDisconnect();\n\n // if(this.pingInterval !== undefined) {\n // clearInterval(this.pingInterval);\n // this.pingInterval = undefined;\n // }\n\n // this.clearPing();\n \n\n this.transport = transport;\n if(!transport) {\n return;\n }\n\n transport.networker = this;\n\n \n \n if(transport instanceof HTTP) {\n \n this.longPollInterval = ctx.setInterval(this.checkLongPoll, 10000);\n this.checkLongPoll();\n this.checkConnection('changed transport');\n \n }\n \n \n\n \n // * handle outcoming dead socket, server will close the connection\n if((transport as TcpObfuscated).connection) {\n // this.sendPingDelayDisconnect();\n\n if(transport.connected) {\n this.setConnectionStatus(ConnectionStatus.Connected);\n }\n\n // this.pingInterval = ctx.setInterval(this.sendPing, PING_INTERVAL);\n // this.sendPing();\n }\n \n\n this.resend();\n }\n\n public destroy() {\n this.log('destroy');\n }\n\n public forceReconnectTimeout() {\n if((this.transport as TcpObfuscated).reconnect) {\n (this.transport as TcpObfuscated).reconnect();\n } else {\n this.resend();\n }\n }\n\n public forceReconnect() {\n if((this.transport as TcpObfuscated).forceReconnect) {\n (this.transport as TcpObfuscated).forceReconnect();\n } else {\n this.checkConnection('force reconnect');\n }\n }\n\n /* private clearPing() {\n if(this.pingPromise) {\n this.pingPromise = undefined;\n }\n\n this.lastPingTime = undefined;\n }\n\n private sendPing = () => {\n // return;\n\n // if(!(this.transport as TcpObfuscated).connected) {\n // this.clearPing();\n // return;\n // }\n\n if(this.pingPromise) {\n return;\n }\n\n const startTime = Date.now();\n this.log('sendPing: ping', startTime);\n const promise = this.pingPromise = this.wrapMtpCall('ping', {\n ping_id: randomLong()\n }, {\n notContentRelated: true\n }).then(() => {\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.log('sendPing: pong', elapsedTime);\n\n setTimeout(() => {\n if(this.pingPromise !== promise) {\n return;\n }\n\n this.pingPromise = undefined;\n this.sendPing();\n }, Math.max(0, PING_INTERVAL - elapsedTime));\n });\n }; */\n\n private clearPingDelayDisconnect() {\n const deferred = this.pingDelayDisconnectDeferred;\n this.pingDelayDisconnectDeferred = undefined;\n this.lastPingDelayDisconnectId = undefined;\n\n if(deferred) {\n deferred.reject();\n }\n }\n\n private sendPingDelayDisconnect = () => {\n // return;\n\n if(this.pingDelayDisconnectDeferred || !this.transport || !this.transport.connected) return;\n\n /* if(!this.isOnline) {\n if((this.transport as TcpObfuscated).connected) {\n (this.transport as TcpObfuscated).connection.close();\n }\n\n return;\n } */\n\n const deferred = this.pingDelayDisconnectDeferred = deferredPromise();\n const delays = this.delays;\n const pingMaxTime = this.delays.pingMaxTime;\n const lastPingTime = Math.min(this.lastPingTime ?? 0, pingMaxTime);\n const disconnectDelay = Math.round(delays.disconnectDelayMin + lastPingTime / pingMaxTime * (delays.disconnectDelayMax - delays.disconnectDelayMin));\n const timeoutTime = disconnectDelay * 1000;\n const startTime = this.lastPingStartTime = Date.now();\n const pingId = this.lastPingDelayDisconnectId = randomLong();\n const options: MTMessageOptions = {notContentRelated: true};\n this.wrapMtpCall('ping_delay_disconnect', {\n ping_id: pingId,\n disconnect_delay: disconnectDelay\n }, options);\n\n const log = this.log.bindPrefix('sendPingDelayDisconnect');\n this.debug && log.debug(`ping, timeout=${timeoutTime}, lastPingTime=${this.lastPingTime}, msgId=${options.messageId}, pingId=${pingId}`);\n const rejectTimeout = ctx.setTimeout(deferred.reject, timeoutTime);\n\n const onResolved = (reason: string) => {\n clearTimeout(rejectTimeout);\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.debug && log.debug(`pong, reason='${reason}', time=${lastPingTime}, msgId=${options.messageId}`);\n if(elapsedTime > timeoutTime) {\n throw undefined;\n } else {\n return pause(Math.max(0, this.delays.pingInterval - elapsedTime/* timeoutTime - elapsedTime - PING_INTERVAL */));\n }\n };\n\n const onTimeout = () => {\n clearTimeout(rejectTimeout);\n const transport = this.transport as TcpObfuscated;\n if(this.pingDelayDisconnectDeferred !== deferred || !transport?.connection) {\n return;\n }\n\n log.error('catch, closing connection', this.lastPingTime, options.messageId);\n transport.connection.close();\n };\n\n const onFinally = () => {\n if(this.pingDelayDisconnectDeferred !== deferred) {\n return;\n }\n\n this.pingDelayDisconnectDeferred = undefined;\n this.sendPingDelayDisconnect();\n };\n\n deferred\n .then(onResolved)\n .catch(onTimeout)\n .finally(onFinally);\n };\n\n \n private checkLongPoll = () => {\n const isClean = this.cleanupSent();\n // this.log.error('Check lp', this.longPollPending, this.dcId, isClean, this);\n if((this.longPollPending && Date.now() < this.longPollPending) ||\n this.offline ||\n this.isStopped() ||\n this.isFileNetworker) {\n // this.log('No lp this time');\n return false;\n }\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(isClean && (\n baseDcId !== this.dcId ||\n (this.sleepAfter && Date.now() > this.sleepAfter)\n )) {\n // console.warn(dT(), 'Send long-poll for DC is delayed', this.dcId, this.sleepAfter);\n return;\n }\n\n this.sendLongPoll();\n });\n };\n\n private sendLongPoll() {\n if(this.sendingLongPoll) return;\n this.sendingLongPoll = true;\n const maxWait = 25000;\n\n this.longPollPending = Date.now() + maxWait;\n this.debug && this.log.debug('sendLongPoll', this.longPollPending);\n\n this.wrapMtpCall('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: maxWait\n }, {\n noResponse: true,\n // notContentRelated: true,\n longPoll: true\n }).then(() => {\n this.longPollPending = undefined;\n setTimeout(this.checkLongPoll, 0);\n }, (error: ErrorEvent) => {\n this.log('Long-poll failed', error);\n }).finally(() => {\n this.sendingLongPoll = undefined;\n });\n }\n\n private checkConnection = (event: Event | string) => {\n this.debug && this.log('Check connection', event);\n this.clearCheckConnectionTimeout();\n\n if(!this.transport) {\n this.log.warn('No transport for checkConnection');\n return;\n }\n\n const serializer = new TLSerialization({mtproto: true});\n const pingId = randomLong();\n\n serializer.storeMethod('ping', {\n ping_id: pingId\n });\n\n const pingMessage = {\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n body: serializer.getBytes(true)\n };\n\n if(this.offline) {\n this.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.sendEncryptedRequest(pingMessage).then(() => {\n this.toggleOffline(false);\n }, () => {\n this.debug && this.log('Delay', this.checkConnectionPeriod * 1000);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from failed checkConnection request'), this.checkConnectionPeriod * 1000 | 0);\n this.checkConnectionPeriod = Math.min(60, this.checkConnectionPeriod * 1.5);\n });\n };\n\n private clearCheckConnectionTimeout() {\n if(this.checkConnectionTimeout !== undefined) {\n clearTimeout(this.checkConnectionTimeout);\n this.checkConnectionTimeout = undefined;\n }\n }\n\n private toggleOffline(offline: boolean) {\n if(this.offline !== offline) {\n this.offline = offline;\n\n this.clearCheckConnectionTimeout();\n if(offline) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n if(this.checkConnectionPeriod < 1.5) {\n this.checkConnectionPeriod = 0;\n }\n\n const delay = this.checkConnectionPeriod * 1000 | 0;\n this.checkConnectionRetryAt = Date.now() + delay;\n this.setConnectionStatus(ConnectionStatus.Closed, this.checkConnectionRetryAt);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from toggleOfline'), delay);\n this.checkConnectionPeriod = Math.min(30, (1 + this.checkConnectionPeriod) * 1.5);\n\n \n \n \n \n } else {\n this.setConnectionStatus(ConnectionStatus.Connected);\n this.checkLongPoll();\n\n this.scheduleRequest();\n\n \n \n \n \n }\n }\n\n this.setConnectionStatus(offline ? ConnectionStatus.Closed : ConnectionStatus.Connected, offline ? this.checkConnectionRetryAt : undefined);\n }\n\n private handleSentEncryptedRequestHTTP(promise: ReturnType, message: MTMessage, noResponseMsgs: string[]) {\n // let timeout = setTimeout(() => {\n // this.log.error('handleSentEncryptedRequestHTTP timeout', promise, message, noResponseMsgs);\n // }, 5e3);\n\n promise.then((result) => {\n this.toggleOffline(false);\n // this.log('parse for', message);\n return this.parseResponse(result).then((response) => {\n this.debug && this.log.debug('Server response', response);\n\n this.processMessage(response.response, response.messageId, response.sessionId);\n\n this.checkLongPoll();\n this.checkConnectionPeriod = Math.max(1.1, Math.sqrt(this.checkConnectionPeriod));\n\n return true;\n });\n }, (error) => {\n this.log.error('Encrypted request failed', error, message);\n\n this.pushResend(message.msg_id);\n this.toggleOffline(true);\n\n return false;\n }).then((shouldResolve) => {\n // clearTimeout(timeout);\n const sentMessages = this.sentMessages;\n noResponseMsgs.forEach((msgId) => {\n const sentMessage = sentMessages[msgId];\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n delete sentMessages[msgId];\n delete this.pendingMessages[msgId];\n shouldResolve ? deferred.resolve() : deferred.reject();\n }\n });\n });\n }\n \n\n // тут можно сделать таймаут и выводить дисконнект\n private pushMessage(message: {\n msg_id: string,\n seq_no: number,\n body: Uint8Array | number[],\n isAPI?: boolean\n }, options: MTMessageOptions) {\n let promise: CancellablePromise;\n if(!options.notContentRelated || options.noResponse) {\n promise = deferredPromise();\n }\n\n this.sentMessages[message.msg_id] = Object.assign(\n message,\n options,\n promise ? {deferred: promise} : undefined\n );\n\n // this.log.error('Networker pushMessage:', this.sentMessages[message.msg_id]);\n\n this.pendingMessages[message.msg_id] = 0;\n\n if(!options.noSchedule) {\n this.scheduleRequest();\n }\n\n if(isObject(options)) {\n options.messageId = message.msg_id;\n }\n\n return promise;\n }\n\n public attachPromise(promise: Promise, message: MTMessage) {\n const canIncrement = true;\n const timeout = setTimeout(() => {\n if(this.lastResponseTime && (Date.now() - this.lastResponseTime) < this.delays.connectionTimeout) {\n return;\n }\n\n this.log.error('timeout', message);\n if(this.isOnline) {\n this.setConnectionStatus(ConnectionStatus.TimedOut);\n }\n\n /* this.getEncryptedOutput(message).then((bytes) => {\n this.log.error('timeout encrypted', bytes);\n }); */\n }, this.delays.connectionTimeout);\n\n promise.catch(noop).finally(() => {\n clearTimeout(timeout);\n this.setConnectionStatus(ConnectionStatus.Connected);\n\n if(canIncrement) {\n --this.activeRequests;\n this.setDrainTimeout();\n }\n });\n\n if(canIncrement) {\n ++this.activeRequests;\n if(this.onDrainTimeout !== undefined) {\n clearTimeout(this.onDrainTimeout);\n this.onDrainTimeout = undefined;\n }\n }\n }\n\n public setDrainTimeout() {\n if(!this.activeRequests && this.onDrain && this.onDrainTimeout === undefined) {\n this.onDrainTimeout = ctx.setTimeout(() => {\n this.onDrainTimeout = undefined;\n this.log('drain');\n this.onDrain();\n }, DRAIN_TIMEOUT);\n }\n }\n\n public setConnectionStatus(status: ConnectionStatus, retryAt?: number) {\n const isOnline = status === ConnectionStatus.Connected;\n const willChange = this.status !== status;\n this.isOnline = isOnline;\n this.status = status;\n\n if(willChange) {\n if(this.networkerFactory.onConnectionStatusChange) {\n this.networkerFactory.onConnectionStatusChange({\n _: 'networkerStatus',\n status,\n dcId: this.dcId,\n name: this.name,\n isFileNetworker: this.isFileNetworker,\n isFileDownload: this.isFileDownload,\n isFileUpload: this.isFileUpload,\n retryAt\n });\n }\n\n if(this.isOnline) {\n this.scheduleRequest();\n }\n\n if((this.transport as TcpObfuscated)?.connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\n }\n\n // this.getNewTimeOffset = true;\n }\n /* if(this.onConnectionStatusChange) {\n this.onConnectionStatusChange(this.isOnline);\n } */\n }\n\n private pushResend(messageId: string, delay = 100) {\n const value = delay ? Date.now() + delay : 0;\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage.container) {\n for(const innerMsgId of sentMessage.inner) {\n this.pendingMessages[innerMsgId] = value;\n }\n } else {\n this.pendingMessages[messageId] = value;\n }\n\n if(sentMessage.acked) {\n this.log.error('pushResend: acked message?', sentMessage);\n }\n\n if(this.debug) {\n this.log.debug('pushResend:', messageId, sentMessage, this.pendingMessages, delay);\n }\n\n this.scheduleRequest(delay);\n }\n\n // * correct, fully checked\n private async getMsgKey(dataWithPadding: Uint8Array, isOut: boolean) {\n const x = isOut ? 0 : 8;\n const msgKeyLargePlain = bufferConcats(this.authKeyUint8.subarray(88 + x, 88 + x + 32), dataWithPadding);\n\n const msgKeyLarge = await CryptoWorker.invokeCrypto('sha256', msgKeyLargePlain);\n const msgKey = new Uint8Array(msgKeyLarge).subarray(8, 24);\n return msgKey;\n };\n\n // * correct, fully checked\n private getAesKeyIv(msgKey: Uint8Array, isOut: boolean): Promise<[Uint8Array, Uint8Array]> {\n const x = isOut ? 0 : 8;\n const sha2aText = new Uint8Array(52);\n const sha2bText = new Uint8Array(52);\n const promises: Array> = [];\n\n sha2aText.set(msgKey, 0);\n sha2aText.set(this.authKeyUint8.subarray(x, x + 36), 16);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2aText));\n\n sha2bText.set(this.authKeyUint8.subarray(40 + x, 40 + x + 36), 0);\n sha2bText.set(msgKey, 36);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2bText));\n\n return Promise.all(promises).then((results) => {\n const aesKey = new Uint8Array(32);\n const aesIv = new Uint8Array(32);\n const sha2a = new Uint8Array(results[0]);\n const sha2b = new Uint8Array(results[1]);\n\n aesKey.set(sha2a.subarray(0, 8));\n aesKey.set(sha2b.subarray(8, 24), 8);\n aesKey.set(sha2a.subarray(24, 32), 24);\n\n aesIv.set(sha2b.subarray(0, 8));\n aesIv.set(sha2a.subarray(8, 24), 8);\n aesIv.set(sha2b.subarray(24, 32), 24);\n\n return [aesKey, aesIv];\n });\n }\n\n public isStopped() {\n return this.networkerFactory.akStopped && !this.isFileNetworker;\n }\n\n private performScheduledRequest() {\n if(this.isStopped()) {\n return false;\n }\n\n if(this.pendingAcks.length) {\n const ackMsgIds = this.pendingAcks.slice();\n\n // this.log('acking messages', ackMsgIDs)\n this.wrapMtpMessage({\n _: 'msgs_ack',\n msg_ids: ackMsgIds\n }, {\n notContentRelated: true,\n noSchedule: true\n });\n }\n\n const pendingResendReqLength = this.pendingResendReq.length;\n if(pendingResendReqLength) {\n const options: MTMessageOptions = {...RESEND_OPTIONS};\n const msgIds = this.pendingResendReq.splice(0, pendingResendReqLength);\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: msgIds\n }, options);\n\n this.log('resend: resending requests', options.messageId, msgIds);\n /* this.lastResendReq = {\n reqMsgId: options.messageId,\n msgIds: msgIds\n }; */\n\n // this.pendingResendReq.length = 0;\n }\n\n // if(this.pendingResendAnsReq.length) {\n // const options: MTMessageOptions = {...RESEND_OPTIONS};\n // const msgIds = this.pendingResendAnsReq.slice();\n // this.wrapMtpMessage({\n // _: 'msg_resend_ans_req',\n // msg_ids: msgIds\n // }, options);\n\n // this.log('resend: requesting answers', options.messageId, msgIds);\n // this.lastResendAnsReq = {\n // reqMsgId: options.messageId,\n // msgIds: msgIds\n // };\n\n // // this.pendingResendAnsReq.length = 0;\n // }\n\n let outMessage: MTMessage;\n const messages: typeof outMessage[] = [];\n\n // const currentTime = Date.now();\n let messagesByteLen = 0;\n\n \n let hasApiCall = false;\n let hasHttpWait = false;\n \n\n let lengthOverflow = false;\n\n // * Сюда никогда не попадут контейнеры, так как их не будет в pendingMessages\n const keys = sortLongsArray(Object.keys(this.pendingMessages));\n for(const messageId of keys) {\n // const value = this.pendingMessages[messageId];\n\n // if(!value || value <= currentTime) {\n const message = this.sentMessages[messageId];\n if(message && message.body) {\n /* if(message.fileUpload) {\n this.log('performScheduledRequest message:', message, message.body.length, (message.body as Uint8Array).byteLength, (message.body as Uint8Array).buffer.byteLength);\n } */\n\n const messageByteLength = message.body.length + 32;\n\n if((messagesByteLen + messageByteLength) > 655360) { // 640 Kb\n this.log.warn('lengthOverflow', message, messages);\n lengthOverflow = true;\n\n if(outMessage) { // if it's not a first message\n break;\n }\n }\n\n messages.push(message);\n messagesByteLen += messageByteLength;\n\n \n if(message.isAPI) {\n hasApiCall = true;\n } else if(message.longPoll) {\n hasHttpWait = true;\n }\n \n\n outMessage = message;\n } else {\n // this.log(message, messageId)\n }\n\n delete this.pendingMessages[messageId];\n // }\n }\n\n \n \n if(this.transport instanceof HTTP)\n \n if(hasApiCall && !hasHttpWait) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeMethod('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: 3000\n });\n\n messages.push({\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(),\n body: serializer.getBytes(true)\n });\n }\n \n\n if(!messages.length) {\n // this.log('no scheduled messages')\n return;\n }\n\n \n const noResponseMsgs: Array = messages.filter((message) => message.noResponse).map((message) => message.msg_id);\n \n\n if(messages.length > 1) {\n const container = this.generateContainerMessage(messagesByteLen, messages);\n outMessage = container.messageWithBody;\n\n this.sentMessages[outMessage.msg_id] = container.message;\n } else {\n this.sentMessages[outMessage.msg_id] = outMessage;\n }\n\n this.pendingAcks = [];\n\n const promise = this.sendEncryptedRequest(outMessage);\n\n \n \n if(this.transport instanceof HTTP)\n \n this.handleSentEncryptedRequestHTTP(promise, outMessage, noResponseMsgs);\n \n\n \n \n if(!(this.transport instanceof HTTP))\n \n this.cleanupSent(); // ! WARNING\n \n\n if(lengthOverflow) {\n this.scheduleRequest();\n }\n }\n\n private generateContainerMessage(messagesByteLen: number, messages: MTMessage[]) {\n const container = new TLSerialization({\n mtproto: true,\n startMaxLength: messagesByteLen + 64\n });\n\n container.storeInt(0x73f1f8dc, 'CONTAINER[id]');\n container.storeInt(messages.length, 'CONTAINER[count]');\n\n const innerMessages: string[] = [];\n messages.forEach((message, i) => {\n innerMessages.push(message.msg_id);\n // this.log('Pushing to container:', message.msg_id);\n container.storeLong(message.msg_id, 'CONTAINER[' + i + '][msg_id]');\n container.storeInt(message.seq_no, 'CONTAINER[' + i + '][seq_no]');\n container.storeInt(message.body.length, 'CONTAINER[' + i + '][bytes]');\n container.storeRawBytes(message.body, 'CONTAINER[' + i + '][body]');\n });\n\n const message: MTMessage = {\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n container: true,\n inner: innerMessages\n };\n\n if(Modes.debug/* || true */) {\n this.log.warn('Container', innerMessages, message.msg_id, message.seq_no);\n }\n\n return {\n message,\n messageWithBody: Object.assign({body: container.getBytes(true)}, message)\n };\n }\n\n private async getEncryptedMessage(dataWithPadding: Uint8Array) {\n const msgKey = await this.getMsgKey(dataWithPadding, true);\n const keyIv = await this.getAesKeyIv(msgKey, true);\n // this.log('after msg key iv')\n\n const encryptedBytes = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithPadding, keyIv[0], keyIv[1]);\n // this.log('Finish encrypt')\n\n return {\n bytes: encryptedBytes,\n msgKey\n };\n }\n\n private getDecryptedMessage(msgKey: Uint8Array, encryptedData: Uint8Array) {\n // this.log('get decrypted start')\n return this.getAesKeyIv(msgKey, false).then((keyIv) => {\n // this.log('after msg key iv')\n return CryptoWorker.invokeCrypto('aes-decrypt', encryptedData, keyIv[0], keyIv[1]);\n });\n }\n\n private getEncryptedOutput(message: MTMessage) {\n /* if(DEBUG) {\n this.log.debug('Send encrypted', message, this.authKeyId);\n } */\n /* if(!this.isOnline) {\n this.log('trying to send message when offline:', Object.assign({}, message));\n //debugger;\n } */\n\n const data = new TLSerialization({\n startMaxLength: message.body.length + 2048\n });\n\n data.storeIntBytes(this.serverSalt, 64, 'salt');\n data.storeIntBytes(this.sessionId, 64, 'session_id');\n\n data.storeLong(message.msg_id, 'message_id');\n data.storeInt(message.seq_no, 'seq_no');\n\n data.storeInt(message.body.length, 'message_data_length');\n data.storeRawBytes(message.body, 'message_data');\n\n /* const des = new TLDeserialization(data.getBuffer().slice(16));\n const desSalt = des.fetchLong();\n const desSessionId = des.fetchLong();\n\n if(!this.isOnline) {\n this.log.error('trying to send message when offline', message, new Uint8Array(des.buffer), desSalt, desSessionId);\n } */\n\n /* const messageDataLength = message.body.length;\n let canBeLength = 0; // bytes\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 4;\n canBeLength += 4;\n canBeLength += message.body.length; */\n\n const dataBuffer = data.getBuffer();\n\n /* if(dataBuffer.byteLength !== canBeLength || !bytesCmp(new Uint8Array(dataBuffer.slice(dataBuffer.byteLength - message.body.length)), new Uint8Array(message.body))) {\n this.log.error('wrong length', dataBuffer, canBeLength, message.msg_id);\n } */\n\n const paddingLength = (16 - (data.getOffset() % 16)) + 16 * (1 + nextRandomUint(8) % 5);\n const padding = /* (message as any).padding || */randomize(new Uint8Array(paddingLength))/* .fill(0) */;\n /* const padding = [167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157,\n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150,\n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28, 167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157,\n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150,\n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28].slice(0, paddingLength); */\n\n // (message as any).padding = padding;\n\n const dataWithPadding = bufferConcats(dataBuffer, padding);\n // this.log('Adding padding', dataBuffer, padding, dataWithPadding)\n // this.log('auth_key_id', bytesToHex(self.authKeyID))\n\n /* if(dataWithPadding.byteLength % 16) {\n this.log.error('aaa', dataWithPadding, paddingLength);\n }\n\n if(message.fileUpload) {\n this.log('Send encrypted: body length:', (message.body as ArrayBuffer).byteLength, paddingLength, dataWithPadding);\n } */\n\n // * full next block is correct\n return this.getEncryptedMessage(dataWithPadding).then((encryptedResult) => {\n /* if(DEBUG) {\n this.log('Got encrypted out message', encryptedResult);\n } */\n\n const request = new TLSerialization({\n startMaxLength: encryptedResult.bytes.length + 256\n });\n request.storeIntBytes(this.authKeyId, 64, 'auth_key_id');\n request.storeIntBytes(encryptedResult.msgKey, 128, 'msg_key');\n request.storeRawBytes(encryptedResult.bytes, 'encrypted_data');\n\n const requestData = request.getBytes(true);\n\n // if(this.isFileNetworker) {\n // //this.log('Send encrypted: requestData length:', requestData.length, requestData.length % 16, paddingLength % 16, paddingLength, data.offset, encryptedResult.msgKey.length % 16, encryptedResult.bytes.length % 16);\n // //this.log('Send encrypted: messageId:', message.msg_id, requestData.length);\n // //this.log('Send encrypted:', message, new Uint8Array(bufferConcat(des.buffer, padding)), requestData, this.serverSalt.hex, this.sessionId.hex/* new Uint8Array(des.buffer) */);\n // this.debugRequests.push({before: new Uint8Array(bufferConcat(des.buffer, padding)), after: requestData});\n // }\n\n return requestData;\n });\n }\n\n private async sendEncryptedRequest(message: MTMessage) {\n const requestData = await this.getEncryptedOutput(message);\n\n if(!this.transport) {\n this.log.error('trying to send something when offline', this.transport, this);\n }\n\n this.debug && this.log.debug('sending:', message, [message.msg_id].concat(message.inner || []), requestData.length);\n const promise: Promise = this.transport ? this.transport.send(requestData) as any : Promise.reject({});\n // this.debug && this.log.debug('sendEncryptedRequest: launched message into space:', message, promise);\n\n \n \n \n\n \n if(!(this.transport instanceof HTTP)) return promise;\n \n\n const baseError: ApiError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n // @ts-ignore\n transport: this.transport\n };\n\n return promise.then((result) => {\n if(!result?.byteLength) {\n throw baseError;\n }\n\n // this.debug && this.log.debug('sendEncryptedRequest: got response for:', message, [message.msg_id].concat(message.inner || []));\n return result;\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n type: 'NETWORK_BAD_REQUEST',\n originalError: error\n });\n }\n\n throw error;\n });\n \n }\n\n public parseResponse(responseBuffer: Uint8Array) {\n // const perf = performance.now();\n /* if(this.debug) {\n this.log.debug('Start parsing response', responseBuffer);\n } */\n\n this.lastResponseTime = Date.now();\n\n const deserializer = new TLDeserialization(responseBuffer);\n\n const authKeyId = deserializer.fetchIntBytes(64, true, 'auth_key_id');\n if(!bytesCmp(authKeyId, this.authKeyId)) {\n throw new Error('[MT] Invalid server auth_key_id: ' + bytesToHex(authKeyId));\n }\n\n const msgKey = deserializer.fetchIntBytes(128, true, 'msg_key');\n const encryptedData = deserializer.fetchRawBytes(responseBuffer.byteLength - deserializer.getOffset(), true, 'encrypted_data');\n\n return this.getDecryptedMessage(msgKey, encryptedData).then((dataWithPadding) => {\n // this.log('after decrypt')\n return this.getMsgKey(dataWithPadding, false).then((calcMsgKey) => {\n if(!bytesCmp(msgKey, calcMsgKey)) {\n this.log.warn('[MT] msg_keys', msgKey, calcMsgKey);\n this.updateSession(); // fix 28.01.2020\n throw new Error('[MT] server msgKey mismatch, updating session');\n }\n // this.log('after msgKey check')\n\n let deserializer = new TLDeserialization(dataWithPadding, {mtproto: true});\n\n /* const salt = */deserializer.fetchIntBytes(64, true, 'salt'); // need\n const sessionId = deserializer.fetchIntBytes(64, true, 'session_id');\n const messageId = deserializer.fetchLong('message_id');\n\n if(!bytesCmp(sessionId, this.sessionId) &&\n (!this.prevSessionId || !bytesCmp(sessionId, this.prevSessionId))) {\n this.log.warn('Sessions', sessionId, this.sessionId, this.prevSessionId, dataWithPadding);\n // this.updateSession();\n // this.sessionID = sessionID;\n throw new Error('[MT] Invalid server session_id: ' + bytesToHex(sessionId));\n }\n\n const seqNo = deserializer.fetchInt('seq_no');\n\n const totalLength = dataWithPadding.byteLength;\n\n const messageBodyLength = deserializer.fetchInt('message_data[length]');\n let offset = deserializer.getOffset();\n\n if((messageBodyLength % 4) ||\n messageBodyLength > totalLength - offset) {\n throw new Error('[MT] Invalid body length: ' + messageBodyLength);\n }\n const messageBody = deserializer.fetchRawBytes(messageBodyLength, true, 'message_data');\n\n offset = deserializer.getOffset();\n const paddingLength = totalLength - offset;\n if(paddingLength < 12 || paddingLength > 1024) {\n throw new Error('[MT] Invalid padding length: ' + paddingLength);\n }\n\n // let buffer = bytesToArrayBuffer(messageBody);\n deserializer = new TLDeserialization(/* buffer */messageBody, {\n mtproto: true,\n override: {\n mt_message: (result: any, field: string) => {\n result.msg_id = deserializer.fetchLong(field + '[msg_id]');\n result.seqno = deserializer.fetchInt(field + '[seqno]');\n result.bytes = deserializer.fetchInt(field + '[bytes]');\n\n const offset = deserializer.getOffset();\n\n // self.log('mt_message!!!!!', result, field);\n\n try {\n result.body = deserializer.fetchObject('Object', field + '[body]');\n } catch(e) {\n this.log.error('parse error', (e as Error).message, (e as Error).stack);\n result.body = {\n _: 'parse_error',\n error: e\n };\n }\n\n if(deserializer.getOffset() !== offset + result.bytes) {\n // console.warn(dT(), 'set offset', this.offset, offset, result.bytes)\n // this.log(result)\n deserializer.setOffset(offset + result.bytes);\n }\n // this.log('override message', result)\n },\n mt_rpc_result: (result: any, field: any) => {\n result.req_msg_id = deserializer.fetchLong(field + '[req_msg_id]');\n\n const sentMessage = this.sentMessages[result.req_msg_id];\n const type = sentMessage && sentMessage.resultType || 'Object';\n\n if(result.req_msg_id && !sentMessage) {\n // console.warn(dT(), 'Result for unknown message', result);\n return;\n }\n\n // deserializer.setMtproto(false);\n result.result = deserializer.fetchObject(type, field + '[result]');\n // deserializer.setMtproto(true);\n // self.log(dT(), 'override rpc_result', sentMessage, type, result);\n }\n }\n });\n\n const response = deserializer.fetchObject('', 'INPUT');\n // this.log.error('Parse response time:', performance.now() - perf);\n return {\n response,\n messageId,\n sessionId,\n seqNo\n };\n });\n });\n }\n\n private applyServerSalt(newServerSalt: string) {\n const serverSalt = longToBytes(newServerSalt);\n\n sessionStorage.set({\n ['dc' + this.dcId + '_server_salt']: bytesToHex(serverSalt)\n });\n\n this.serverSalt = new Uint8Array(serverSalt);\n }\n\n // ! таймаут очень сильно тормозит скорость работы сокета (даже нулевой)\n public scheduleRequest(delay?: number) {\n /* if(!this.isOnline) {\n return;\n } */\n\n \n \n if(this.transport instanceof HTTP) {\n \n if(this.offline) {\n this.checkConnection('forced schedule');\n }\n\n delay ||= 0; // set zero timeout to pack other messages too\n \n }\n \n \n\n const nextReq = Date.now() + (delay || 0);\n if(this.nextReq && (delay === undefined || this.nextReq <= nextReq)) {\n // this.debug && this.log('scheduleRequest: nextReq', this.nextReq, nextReq);\n return;\n }\n\n // this.debug && this.log('scheduleRequest: delay', delay);\n\n /* if(this.nextReqTimeout) {\n return;\n } */\n\n // const perf = performance.now();\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n }\n\n const cb = () => {\n // this.debug && this.log('scheduleRequest: timeout delay was:', performance.now() - perf);\n\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n \n \n if(this.transport instanceof HTTP)\n \n if(this.offline) {\n // this.log('Cancel scheduled');\n return;\n }\n \n\n this.performScheduledRequest();\n };\n\n this.nextReq = nextReq;\n\n if(delay !== undefined) {\n this.nextReqTimeout = ctx.setTimeout(cb, delay);\n } else {\n cb();\n }\n }\n\n private ackMessage(msgId: MTLong) {\n // this.log('ack message', msgID)\n this.pendingAcks.push(msgId);\n\n let delay: number;\n\n \n \n if(this.transport instanceof HTTP)\n \n delay = 30000;\n \n\n this.scheduleRequest(delay);\n }\n\n private reqResend(msgId: MTLong/* , isAnswer?: boolean */) {\n if(this.debug) {\n this.log.debug('Req resend', msgId/* , isAnswer */);\n }\n\n // (isAnswer ? this.pendingResendAnsReq : this.pendingResendReq).push(msgId);\n this.pendingResendReq.push(msgId);\n this.scheduleRequest(100);\n }\n\n public cleanupSent() {\n let notEmpty = false;\n const sentMessages = this.sentMessages;\n // this.log('clean start', this.dcId/*, sentMessages*/)\n Object.keys(sentMessages).forEach((msgId) => {\n const message = sentMessages[msgId];\n\n // this.log('clean iter', msgID, message)\n if(message.notContentRelated && this.pendingMessages[msgId] === undefined) {\n // this.log('clean notContentRelated', msgID)\n delete sentMessages[msgId];\n } else if(message.container) {\n for(const innerMsgId of message.inner) {\n if(sentMessages[innerMsgId] !== undefined) {\n // this.log('clean failed, found', msgID, message.inner[i], sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // this.log('clean container', msgID)\n delete sentMessages[msgId];\n } else {\n notEmpty = true;\n }\n });\n\n return !notEmpty;\n }\n\n private processMessageAck(messageId: Long) {\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage && !sentMessage.acked) {\n // delete sentMessage.body;\n sentMessage.acked = true;\n }\n }\n\n private processError(rawError: {error_message: string, error_code: number}): ApiError {\n const matches = (rawError.error_message || '').match(/^([A-Z_0-9]+\\b)(: (.+))?/) || [];\n rawError.error_code = rawError.error_code;\n\n return {\n code: !rawError.error_code || rawError.error_code <= 0 ? 500 : rawError.error_code,\n type: matches[1] as any || 'UNKNOWN',\n description: matches[3] || ('CODE#' + rawError.error_code + ' ' + rawError.error_message),\n originalError: rawError\n };\n }\n\n /**\n * * только для сокета\n * TODO: consider about containers resend\n */\n public resend() {\n const sentMessages = this.sentMessages;\n for(const id in sentMessages) {\n const msg = sentMessages[id];\n if(msg.body || msg.container) {\n this.pushResend(id);\n }\n }\n\n if((this.transport as TcpObfuscated).connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\n }\n }\n\n /* public requestMessageStatus() {\n const ids: string[] = [];\n for(const id in this.sentMessages) {\n const message = this.sentMessages[id];\n if(message.isAPI && message.fileUpload) {\n ids.push(message.msg_id);\n }\n }\n\n this.wrapMtpMessage({\n _: 'msgs_state_req',\n msg_ids: ids\n }, {\n notContentRelated: true\n }).then((res) => {\n this.log('status', res);\n });\n } */\n\n private applyServerTime(messageId: string) {\n const serverTime = bigInt(messageId).shiftRight(32).toJSNumber();\n this.log('applying server time', serverTime);\n return this.timeManager.applyServerTime(serverTime);\n }\n\n // * https://core.telegram.org/mtproto/service_messages_about_messages#notice-of-ignored-error-message\n public processMessage(message: any, messageId: MTLong, sessionId: Uint8Array | number[]) {\n if(message._ === 'messageEmpty') {\n this.log.warn('processMessage: messageEmpty', message, messageId);\n return;\n }\n\n // messageId = messageId.toString();\n\n const msgidInt = parseInt(messageId.substr(0, -10), 10);\n if(msgidInt % 2) {\n this.log.warn('Server even message id: ', messageId, message);\n return;\n }\n\n if(this.debug) {\n this.log.debug('process message', message, messageId);\n }\n\n if(this.pingDelayDisconnectDeferred) {\n this.pingDelayDisconnectDeferred.resolve('any message');\n }\n\n // let changedTimeOffset: boolean;\n // if(this.getNewTimeOffset) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // this.getNewTimeOffset = undefined;\n // }\n\n switch(message._) {\n case 'msg_container': {\n for(const innerMessage of message.messages) {\n this.processMessage(innerMessage, innerMessage.msg_id, sessionId);\n }\n\n break;\n }\n\n case 'bad_server_salt': {\n this.log('Bad server salt', message);\n\n this.applyServerSalt(message.new_server_salt);\n\n if(this.sentMessages[message.bad_msg_id]) {\n this.pushResend(message.bad_msg_id);\n }\n\n this.ackMessage(messageId);\n\n // simulate disconnect\n /* try {\n this.log('networker state:', this);\n // @ts-ignore\n this.transport.ws.close(1000);\n } catch(err) {\n this.log.error('transport', this.transport, err);\n } */\n\n break;\n }\n\n case 'bad_msg_notification': {\n this.log.error('Bad msg notification', message);\n\n switch(message.error_code) {\n case 16: // * msg_id too low\n case 17: // * msg_id too high\n case 32: // * msg_seqno too low\n case 33: // * msg_seqno too high\n case 64: { // * invalid container\n // if(changedTimeOffset === undefined) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // }\n\n const changedTimeOffset = this.applyServerTime(messageId);\n if(message.error_code === 17 || changedTimeOffset) {\n this.log('Update session');\n this.updateSession();\n }\n\n const badMessage = this.updateSentMessage(message.bad_msg_id);\n if(badMessage) this.pushResend(badMessage.msg_id); // fix 23.01.2020\n // this.ackMessage(messageId);\n }\n\n // * invalid container\n /* case 64: {\n const badMessage = this.sentMessages[message.bad_msg_id];\n if(badMessage) {\n for(const msgId of badMessage.inner) {\n if(this.sentMessages[msgId] !== undefined) {\n this.updateSentMessage\n }\n }\n const inner = badMessage.inner;\n }\n } */\n }\n\n break;\n }\n\n case 'message': {\n if(this.lastServerMessages.indexOf(messageId) !== -1) {\n // console.warn('[MT] Server same messageId: ', messageId)\n this.ackMessage(messageId);\n return;\n }\n\n this.lastServerMessages.push(messageId);\n if(this.lastServerMessages.length > 100) {\n this.lastServerMessages.shift();\n }\n\n this.processMessage(message.body, message.msg_id, sessionId);\n break;\n }\n\n case 'new_session_created': {\n this.ackMessage(messageId);\n\n if(this.debug) {\n this.log.debug('new_session_created', message);\n }\n // this.updateSession();\n\n this.processMessageAck(message.first_msg_id);\n this.applyServerSalt(message.server_salt);\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(baseDcId === this.dcId && !this.isFileNetworker && this.networkerFactory.updatesProcessor) {\n this.networkerFactory.updatesProcessor(message);\n }\n });\n break;\n }\n\n case 'msgs_ack': {\n this.debug && this.log('got acks', message.msg_ids);\n for(const msgId of message.msg_ids) {\n this.processMessageAck(msgId);\n }\n\n break;\n }\n\n case 'msg_detailed_info': {\n const sentMessage = this.sentMessages[message.msg_id];\n if(!sentMessage) {\n this.ackMessage(message.answer_msg_id);\n break;\n }/* else if(sentMessage.acked) {\n this.reqResend(message.answer_msg_id, true);\n }\n\n break; */\n }\n\n case 'msg_new_detailed_info': {\n if(this.pendingAcks.indexOf(message.answer_msg_id) !== -1) {\n break;\n }\n\n this.reqResend(message.answer_msg_id);\n break;\n }\n\n case 'msgs_state_info': {\n this.ackMessage(message.answer_msg_id);\n const arr = [\n [this.lastResendReq, this.pendingResendReq] as const\n // [this.lastResendAnsReq, this.pendingResendAnsReq] as const\n ];\n\n for(const [lastResend, pendingResend] of arr) {\n if(lastResend?.reqMsgId === message.req_msg_id && pendingResend.length) {\n for(const badMsgId of lastResend.msgIds) {\n const pos = pendingResend.indexOf(badMsgId);\n if(pos !== -1) {\n pendingResend.splice(pos, 1);\n }\n }\n }\n }\n\n break;\n }\n\n case 'rpc_result': {\n this.ackMessage(messageId);\n\n const sentMessageId = message.req_msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n if(this.debug) {\n this.log('Rpc response', message.result, sentMessage);\n }\n\n this.processMessageAck(sentMessageId);\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n if(message.result._ === 'rpc_error') {\n const error = this.processError(message.result);\n this.log('Rpc error', error);\n if(deferred) {\n deferred.reject(error);\n }\n } else {\n if(deferred) {\n deferred.resolve(message.result);\n }\n\n if(sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\n }\n }\n\n delete this.sentMessages[sentMessageId];\n } else {\n if(this.debug) {\n this.log('Rpc result for unknown message:', sentMessageId, message);\n }\n }\n\n break;\n }\n\n case 'pong': { // * https://core.telegram.org/mtproto/service_messages#ping-messages-pingpong - These messages don't require acknowledgments\n /* const sentMessageId = message.msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n if(sentMessage) {\n sentMessage.deferred.resolve(message);\n delete this.sentMessages[sentMessageId];\n } */\n const pingId = message.ping_id;\n if(this.lastPingDelayDisconnectId === pingId) {\n const deferred = this.pingDelayDisconnectDeferred;\n if(deferred) {\n deferred.resolve('pong');\n } else {\n this.log('ping deferred deleted', pingId);\n }\n }\n\n break;\n }\n\n default:\n this.ackMessage(messageId);\n\n /* if(this.debug) {\n this.log.debug('Update', message);\n } */\n\n if(this.networkerFactory.updatesProcessor !== null) {\n this.networkerFactory.updatesProcessor(message);\n }\n break;\n }\n }\n}\n","import bigInt from 'big-integer';\n\nexport default function sortLongsArray(arr: string[]) {\n return arr.map((long) => {\n return bigInt(long);\n }).sort((a, b) => {\n return a.compare(b);\n }).map((bigInt) => {\n return bigInt.toString(10);\n });\n}\n","import addPadding from '../bytes/addPadding';\nimport bigInt from 'big-integer';\nimport {bigIntToBytes} from '../bigInt/bigIntConversion';\n\nexport default function longToBytes(sLong: string) {\n const bigIntBytes = bigIntToBytes(bigInt(sLong)).reverse();\n const bytes = addPadding(bigIntBytes, 8, true, false, false);\n // console.log('longToBytes', bytes, bigIntBytes);\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {ConnectionStatusChange} from './connectionStatus';\nimport MTPNetworker from './networker';\nimport {InvokeApiOptions} from '../../types';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {AppManager} from '../appManagers/manager';\n\nexport class NetworkerFactory extends AppManager {\n private networkers: MTPNetworker[] = [];\n public language = navigator.language || App.langPackCode;\n public updatesProcessor: (obj: any) => void = null;\n // public onConnectionStatusChange: (status: ConnectionStatusChange) => void = null;\n public akStopped = false;\n\n public onConnectionStatusChange(status: ConnectionStatusChange) {\n this.rootScope.dispatchEvent('connection_status_change', status);\n // ({type: 'connectionStatusChange', payload: status});\n }\n\n public removeNetworker(networker: MTPNetworker) {\n indexOfAndSplice(this.networkers, networker);\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n }\n\n public getNetworker(dcId: number, authKey: Uint8Array, authKeyId: Uint8Array, serverSalt: Uint8Array, options: InvokeApiOptions) {\n // console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\n const networker = new MTPNetworker(this, this.timeManager, dcId, authKey, authKeyId, serverSalt, options);\n this.networkers.push(networker);\n return networker;\n }\n\n public startAll() {\n if(this.akStopped) {\n const stoppedNetworkers = this.networkers.filter((networker) => networker.isStopped());\n\n this.akStopped = false;\n this.updatesProcessor && this.updatesProcessor({_: 'new_session_created'});\n\n for(const networker of stoppedNetworkers) {\n networker.scheduleRequest();\n }\n }\n }\n\n public stopAll() {\n this.akStopped = true;\n }\n\n public setLanguage(langCode: string) {\n this.language = langCode;\n for(const networker of this.networkers) {\n if(!networker.isFileNetworker) {\n networker.connectionInited = false;\n }\n }\n }\n\n public unsetConnectionInited() {\n for(const networker of this.networkers) {\n networker.connectionInited = false;\n }\n }\n\n public forceReconnectTimeout() {\n for(const networker of this.networkers) {\n networker.forceReconnectTimeout();\n }\n }\n\n public forceReconnect() {\n for(const networker of this.networkers) {\n if(!networker.isFileNetworker) {\n networker.forceReconnect();\n break;\n }\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {TLSerialization} from './tl_utils';\nimport cryptoWorker from '../crypto/cryptoMessagePort';\nimport Modes from '../../config/modes';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport bigInt from 'big-integer';\n\nexport type RSAPublicKeyHex = {\n modulus: string,\n exponent: string\n};\n\nexport class RSAKeysManager {\n /**\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\n *\n *\n * -----BEGIN RSA PUBLIC KEY-----\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\n * -----END RSA PUBLIC KEY-----\n *\n * -----BEGIN RSA PUBLIC KEY-----\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\n * -----END RSA PUBLIC KEY-----\n *\n * Bytes can be got via\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\n * $ openssl rsa -pubin -in pub.pem -text -noout\n */\n\n /* private publisKeysHex = [{\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\n exponent: '010001'\n }, {\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\n exponent: '010001'\n }, {\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\n exponent: '010001'\n }, {\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\n exponent: '010001'\n }, {\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\n exponent: '010001'\n }]; */\n\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\n exponent: '010001'\n }];\n\n private publisKeysHex: RSAPublicKeyHex[] = [{\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\n exponent: '010001'\n }];\n\n private publicKeysParsed: {\n [hex: string]: RSAPublicKeyHex\n } = {};\n private prepared = false;\n private preparePromise: Promise = null;\n\n constructor() {\n if(Modes.test) {\n this.publisKeysHex = this.testPublicKeysHex;\n }\n }\n\n public prepare(): Promise {\n if(this.preparePromise) return this.preparePromise;\n else if(this.prepared) {\n return Promise.resolve();\n }\n\n return this.preparePromise = Promise.all(this.publisKeysHex.map((keyParsed) => {\n const RSAPublicKey = new TLSerialization();\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\n\n const buffer = RSAPublicKey.getBuffer();\n\n return cryptoWorker.invokeCrypto('sha1', buffer).then((bytes) => {\n const fingerprintBytes = bytes.slice(-8);\n fingerprintBytes.reverse();\n\n this.publicKeysParsed[bytesToHex(fingerprintBytes).toLowerCase()] = {\n modulus: keyParsed.modulus,\n exponent: keyParsed.exponent\n };\n });\n })).then(() => {\n this.prepared = true;\n\n // console.log('[MT] Prepared keys');\n this.preparePromise = null;\n });\n }\n\n public async select(fingerprints: Array) {\n await this.prepare();\n\n for(let i = 0; i < fingerprints.length; ++i) {\n let fingerprintHex = bigInt(fingerprints[i]).toString(16).toLowerCase();\n\n if(fingerprintHex.length < 16) {\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\n }\n\n // console.log(fingerprintHex, this.publicKeysParsed);\n const foundKey = this.publicKeysParsed[fingerprintHex];\n if(foundKey) {\n return Object.assign({\n fingerprint: fingerprints[i]\n }, foundKey);\n }\n }\n }\n}\n\nexport default new RSAKeysManager();\n","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\n const len = bytes1.length;\n const bytes = new Uint8Array(len);\n\n for(let i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n \nimport transportController from './transports/controller';\n \n\nimport {TLSerialization, TLDeserialization} from './tl_utils';\nimport {TransportType} from './dcConfigurator';\nimport rsaKeysManager from './rsaKeysManager';\n\nimport CryptoWorker from '../crypto/cryptoMessagePort';\n\nimport {logger, LogTypes} from '../logger';\nimport DEBUG from '../../config/debug';\nimport {Awaited, DcId} from '../../types';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport bytesXor from '../../helpers/bytes/bytesXor';\nimport {bigIntFromBytes} from '../../helpers/bigInt/bigIntConversion';\nimport bigInt from 'big-integer';\nimport randomize from '../../helpers/array/randomize';\nimport {AppManager} from '../appManagers/manager';\n\n/* let fNewNonce: any = bytesFromHex('8761970c24cb2329b5b2459752c502f3057cb7e8dbab200e526e8767fdc73b3c').reverse();\nlet fNonce: any = bytesFromHex('b597720d11faa5914ef485c529cde414').reverse();\nlet fResult: any = new Uint8Array(bytesFromHex('000000000000000001b473a0661b285e480000006324160514e4cd29c585f44e91a5fa110d7297b5c0c4134c84893db5715ecd56af5ed618082182053cc5de91cd00000015c4b51c02000000a5b7f709355fc30b216be86c022bb4c3'));\n\nfNewNonce = false;\nfNonce = false;\nfResult = false; */\n\ntype AuthOptions = {\n dcId: number,\n nonce: Uint8Array,\n\n serverNonce?: Uint8Array,\n pq?: Uint8Array,\n fingerprints?: string[],\n publicKey?: {\n modulus: string,\n exponent: string,\n fingerprint: string\n },\n\n // good\n p?: Uint8Array,\n q?: Uint8Array,\n\n newNonce?: Uint8Array,\n\n retry?: number,\n\n b?: Uint8Array,\n g?: number,\n gA?: Uint8Array,\n dhPrime?: Uint8Array,\n\n tmpAesKey?: Uint8Array,\n tmpAesIv?: Uint8Array,\n\n authKeyId?: Uint8Array,\n authKey?: Uint8Array,\n serverSalt?: Uint8Array,\n\n localTime?: number,\n serverTime?: any,\n};\n\ntype ResPQ = {\n _: 'resPQ';\n nonce: Uint8Array;\n pq: Uint8Array;\n server_nonce: Uint8Array;\n server_public_key_fingerprints: string[];\n};\n\ntype P_Q_inner_data = {\n _: 'p_q_inner_data_dc';\n pq: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n new_nonce: Uint8Array;\n dc: number;\n};\n\ntype req_DH_params = {\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n public_key_fingerprint: string;\n encrypted_data: Uint8Array;\n};\n\nexport class Authorizer extends AppManager {\n private cached: {\n [dcId: DcId]: Promise\n };\n\n private log: ReturnType;\n\n private transportType: TransportType;\n\n \n private getTransportTypePromise: Promise;\n \n\n protected after() {\n this.cached = {};\n this.log = logger(`AUTHORIZER`, LogTypes.Error | LogTypes.Log);\n }\n\n private sendPlainRequest(dcId: DcId, requestArray: Uint8Array) {\n const requestLength = requestArray.byteLength;\n\n const header = new TLSerialization();\n header.storeLongP(0, 0, 'auth_key_id');\n header.storeLong(this.timeManager.generateId(), 'msg_id');\n header.storeInt(requestLength, 'request_length');\n\n const headerArray = header.getBytes(true) as Uint8Array;\n const resultArray = new Uint8Array(headerArray.byteLength + requestLength);\n resultArray.set(headerArray);\n resultArray.set(requestArray, headerArray.length);\n\n const transport = this.dcConfigurator.chooseServer(dcId, 'client', this.transportType);\n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE'\n };\n\n if(DEBUG) {\n this.log('mtpSendPlainRequest: creating requestPromise');\n }\n\n const promise = transport.send(resultArray) as any as Promise;\n return promise.then((result) => {\n if(DEBUG) {\n this.log('mtpSendPlainRequest: in good sector', result);\n }\n\n if(!result || !result.byteLength) {\n throw baseError;\n }\n\n try {\n /* result = fResult ? fResult : result;\n fResult = new Uint8Array(0); */\n\n const deserializer = new TLDeserialization(result, {mtproto: true});\n\n if(result.length === 4) {\n const errorCode = deserializer.fetchInt();\n this.log.error('mtpSendPlainRequest: wrong response, error code:', errorCode);\n throw errorCode;\n }\n\n const auth_key_id = deserializer.fetchLong('auth_key_id');\n if(auth_key_id !== '0') this.log.error('auth_key_id !== 0', auth_key_id);\n\n const msg_id = deserializer.fetchLong('msg_id');\n if(msg_id === '0') this.log.error('msg_id === 0', msg_id);\n\n const msg_len = deserializer.fetchInt('msg_len');\n if(!msg_len) this.log.error('no msg_len', msg_len);\n\n return deserializer;\n } catch(e) {\n this.log.error('mtpSendPlainRequest: deserialization went bad', e);\n const error = Object.assign(baseError, {originalError: e});\n throw error;\n }\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n originalError: error\n });\n }\n\n throw error;\n });\n }\n\n private async sendReqPQ(auth: AuthOptions) {\n const request = new TLSerialization({mtproto: true});\n\n request.storeMethod('req_pq_multi', {nonce: auth.nonce});\n\n if(DEBUG) {\n this.log('Send req_pq', bytesToHex(auth.nonce));\n }\n\n let deserializer: Awaited>;\n try {\n const promise = this.sendPlainRequest(auth.dcId, request.getBytes(true));\n rsaKeysManager.prepare();\n deserializer = await promise;\n } catch(error) {\n this.log.error('req_pq error', (error as Error).message);\n throw error;\n }\n\n const response: ResPQ = deserializer.fetchObject('ResPQ');\n\n if(response._ !== 'resPQ') {\n throw new Error('[MT] resPQ response invalid: ' + response._);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n this.log.error(auth.nonce, response.nonce);\n throw new Error('[MT] resPQ nonce mismatch');\n }\n\n auth.serverNonce = response.server_nonce; // need\n auth.pq = response.pq;\n auth.fingerprints = response.server_public_key_fingerprints;\n\n if(DEBUG) {\n this.log('Got ResPQ', bytesToHex(auth.serverNonce), bytesToHex(auth.pq), auth.fingerprints);\n }\n\n const publicKey = await rsaKeysManager.select(auth.fingerprints);\n if(!publicKey) {\n throw new Error('[MT] No public key found');\n }\n\n auth.publicKey = publicKey;\n\n if(DEBUG) {\n this.log('PQ factorization start', auth.pq);\n }\n\n // let pAndQ: Awaited>;\n try {\n var pAndQ = await CryptoWorker.invokeCrypto('factorize', auth.pq);\n } catch(error) {\n this.log.error('worker error factorize', error);\n throw error;\n }\n\n auth.p = pAndQ[0];\n auth.q = pAndQ[1];\n\n if(DEBUG) {\n this.log('PQ factorization done', pAndQ);\n }\n\n return this.sendReqDhParams(auth);\n }\n\n private async sendReqDhParams(auth: AuthOptions): Promise {\n auth.newNonce = randomize(new Uint8Array(32));\n\n const p_q_inner_data_dc: P_Q_inner_data = {\n _: 'p_q_inner_data_dc',\n pq: auth.pq,\n p: auth.p,\n q: auth.q,\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n new_nonce: auth.newNonce,\n dc: 0\n };\n\n const pQInnerDataSerialization = new TLSerialization({mtproto: true});\n pQInnerDataSerialization.storeObject(p_q_inner_data_dc, 'P_Q_inner_data', 'DECRYPTED_DATA');\n\n const data = pQInnerDataSerialization.getBytes(true);\n if(data.length > 144) {\n throw 'DH_params: data is more than 144 bytes!';\n }\n\n const dataWithPadding = addPadding(data, 192, false, true, false);\n const dataPadReversed = dataWithPadding.slice().reverse();\n\n const getKeyAesEncrypted = async() => {\n for(;;) {\n const tempKey = randomize(new Uint8Array(32));\n const dataWithHash = dataPadReversed.concat(await CryptoWorker.invokeCrypto('sha256', tempKey.concat(dataWithPadding)));\n if(dataWithHash.length !== 224) {\n throw 'DH_params: dataWithHash !== 224 bytes!';\n }\n\n const aesEncrypted = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, tempKey, new Uint8Array([0]));\n const tempKeyXor = bytesXor(tempKey, await CryptoWorker.invokeCrypto('sha256', aesEncrypted));\n const keyAesEncrypted = tempKeyXor.concat(aesEncrypted);\n\n const keyAesEncryptedBigInt = bigIntFromBytes(keyAesEncrypted);\n const publicKeyModulusBigInt = bigInt(auth.publicKey.modulus, 16);\n\n if(keyAesEncryptedBigInt.compare(publicKeyModulusBigInt) === -1) {\n return keyAesEncrypted;\n }\n }\n };\n\n const keyAesEncrypted = await getKeyAesEncrypted();\n const encryptedData = addPadding(await CryptoWorker.invokeCrypto('rsa-encrypt', keyAesEncrypted, auth.publicKey), 256, true, true, true);\n\n const req_DH_params: req_DH_params = {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n p: auth.p,\n q: auth.q,\n public_key_fingerprint: auth.publicKey.fingerprint,\n encrypted_data: encryptedData\n };\n\n const request = new TLSerialization({mtproto: true});\n request.storeMethod('req_DH_params', req_DH_params);\n\n const requestBytes = request.getBytes(true);\n\n if(DEBUG) {\n this.log('Send req_DH_params', req_DH_params/* , requestBytes.hex */);\n }\n\n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, requestBytes);\n } catch(error) {\n this.log.error('Send req_DH_params FAIL!', error);\n throw error;\n }\n\n const response = deserializer.fetchObject('Server_DH_Params', 'RESPONSE');\n\n if(DEBUG) {\n this.log('Sent req_DH_params, response:', response);\n }\n\n if(response._ !== 'server_DH_params_fail' && response._ !== 'server_DH_params_ok') {\n throw new Error('[MT] Server_DH_Params response invalid: ' + response._);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Server_DH_Params nonce mismatch');\n }\n\n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Server_DH_Params server_nonce mismatch');\n }\n\n if(response._ === 'server_DH_params_fail') {\n const newNonceHash = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce)).slice(-16);\n if(!bytesCmp(newNonceHash, response.new_nonce_hash)) {\n throw new Error('[MT] server_DH_params_fail new_nonce_hash mismatch');\n }\n\n throw new Error('[MT] server_DH_params_fail');\n }\n\n // fill auth object\n try {\n await this.decryptServerDhDataAnswer(auth, response.encrypted_answer);\n } catch(e) {\n this.log.error('mtpDecryptServerDhDataAnswer FAILED!', e);\n throw e;\n }\n\n // console.log(dT(), 'mtpSendReqDhParams: executing mtpSendSetClientDhParams...');\n\n return this.sendSetClientDhParams(auth);\n }\n\n private async decryptServerDhDataAnswer(auth: AuthOptions, encryptedAnswer: any) {\n auth.localTime = Date.now();\n\n // ! can't concat Array with Uint8Array!\n auth.tmpAesKey = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.serverNonce)))\n .concat((await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(0, 12));\n\n auth.tmpAesIv = (await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(12)\n .concat(await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.newNonce)), auth.newNonce.slice(0, 4));\n\n const answerWithHash = new Uint8Array(await CryptoWorker.invokeCrypto('aes-decrypt', encryptedAnswer, auth.tmpAesKey, auth.tmpAesIv));\n\n const hash = answerWithHash.slice(0, 20);\n const answerWithPadding = answerWithHash.slice(20);\n\n const deserializer = new TLDeserialization(answerWithPadding, {mtproto: true});\n const response = deserializer.fetchObject('Server_DH_inner_data');\n\n if(response._ !== 'server_DH_inner_data') {\n throw new Error('[MT] server_DH_inner_data response invalid: ' + response);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] server_DH_inner_data nonce mismatch');\n }\n\n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] server_DH_inner_data serverNonce mismatch');\n }\n\n if(DEBUG) {\n this.log('Done decrypting answer');\n }\n auth.g = response.g;\n auth.dhPrime = response.dh_prime;\n auth.gA = response.g_a;\n auth.serverTime = response.server_time;\n auth.retry = 0;\n\n this.verifyDhParams(auth.g, auth.dhPrime, auth.gA);\n\n const offset = deserializer.getOffset();\n\n if(!bytesCmp(hash, await CryptoWorker.invokeCrypto('sha1', answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1 mismatch');\n }\n\n this.timeManager.applyServerTime(auth.serverTime, auth.localTime);\n }\n\n private verifyDhParams(g: number, dhPrime: Uint8Array, gA: Uint8Array) {\n if(DEBUG) {\n this.log('Verifying DH params', g, dhPrime, gA);\n }\n\n const dhPrimeHex = bytesToHex(dhPrime);\n if(g !== 3 || dhPrimeHex !== 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b') {\n // The verified value is from https://core.telegram.org/mtproto/security_guidelines\n throw new Error('[MT] DH params are not verified: unknown dhPrime');\n }\n\n if(DEBUG) {\n this.log('dhPrime cmp OK');\n }\n\n const gABigInt = bigIntFromBytes(gA);\n const dhPrimeBigInt = bigInt(dhPrimeHex, 16);\n\n if(gABigInt.compare(bigInt.one) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n\n if(gABigInt.compare(dhPrimeBigInt.subtract(bigInt.one)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA >= dhPrime - 1');\n }\n\n if(DEBUG) {\n this.log('1 < gA < dhPrime-1 OK');\n }\n\n const twoPow = bigInt(2).pow(2048 - 64);\n\n if(gABigInt.compare(twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if(gABigInt.compare(dhPrimeBigInt.subtract(twoPow)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}');\n }\n\n if(DEBUG) {\n this.log('2^{2048-64} < gA < dhPrime-2^{2048-64} OK');\n }\n\n return true;\n }\n\n private async sendSetClientDhParams(auth: AuthOptions): Promise {\n const gBytes = bytesFromHex(auth.g.toString(16));\n\n auth.b = randomize(new Uint8Array(256));\n // MTProto.secureRandom.nextBytes(auth.b);\n\n // let gB: Awaited>;\n try {\n var gB = await CryptoWorker.invokeCrypto('mod-pow', gBytes, auth.b, auth.dhPrime);\n } catch(error) {\n throw error;\n }\n\n const data = new TLSerialization({mtproto: true});\n data.storeObject({\n _: 'client_DH_inner_data',\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n retry_id: [0, auth.retry++],\n g_b: gB\n }, 'Client_DH_Inner_Data');\n\n const dataWithHash = (await CryptoWorker.invokeCrypto('sha1', data.getBuffer())).concat(data.getBytes(true));\n const encryptedData = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, auth.tmpAesKey, auth.tmpAesIv);\n\n const request = new TLSerialization({mtproto: true});\n request.storeMethod('set_client_DH_params', {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n encrypted_data: encryptedData\n });\n\n if(DEBUG) {\n this.log('Send set_client_DH_params');\n }\n\n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, request.getBytes(true));\n } catch(err) {\n throw err;\n }\n\n const response = deserializer.fetchObject('Set_client_DH_params_answer');\n\n if(response._ !== 'dh_gen_ok' && response._ !== 'dh_gen_retry' && response._ !== 'dh_gen_fail') {\n throw new Error('[MT] Set_client_DH_params_answer response invalid: ' + response._);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer nonce mismatch');\n }\n\n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer server_nonce mismatch');\n }\n\n // let authKey: Uint8Array;\n try {\n var authKey = await CryptoWorker.invokeCrypto('mod-pow', auth.gA, auth.b, auth.dhPrime);\n } catch(err) {\n throw authKey;\n }\n\n const authKeyHash = await CryptoWorker.invokeCrypto('sha1', authKey),\n authKeyAux = authKeyHash.slice(0, 8),\n authKeyId = authKeyHash.slice(-8);\n\n if(DEBUG) {\n this.log('Got Set_client_DH_params_answer', response._, authKey);\n }\n switch(response._) {\n case 'dh_gen_ok': {\n const newNonceHash1 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([1], authKeyAux))).slice(-16);\n\n if(!bytesCmp(newNonceHash1, response.new_nonce_hash1)) {\n this.log.error('Set_client_DH_params_answer new_nonce_hash1 mismatch', newNonceHash1, response);\n throw new Error('new_nonce_hash1 mismatch');\n }\n\n const serverSalt = bytesXor(auth.newNonce.slice(0, 8), auth.serverNonce.slice(0, 8));\n if(DEBUG) {\n this.log('Auth successfull!', authKeyId, authKey, serverSalt);\n }\n\n auth.authKeyId = authKeyId;\n auth.authKey = authKey;\n auth.serverSalt = serverSalt;\n\n return auth;\n }\n\n case 'dh_gen_retry': {\n const newNonceHash2 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([2], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash2, response.new_nonce_hash2)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch');\n }\n\n return this.sendSetClientDhParams(auth);\n }\n\n case 'dh_gen_fail': {\n const newNonceHash3 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([3], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash3, response.new_nonce_hash3)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch');\n }\n\n throw new Error('[MT] Set_client_DH_params_answer fail');\n }\n }\n }\n\n \n private getTransportType() {\n if(this.getTransportTypePromise) return this.getTransportTypePromise;\n return this.getTransportTypePromise = transportController.pingTransports().then(({websocket}) => {\n this.transportType = websocket ? 'websocket' : 'https';\n this.log('will use transport:', this.transportType);\n });\n }\n \n\n public auth(dcId: DcId) {\n let promise = this.cached[dcId];\n if(promise) {\n return promise;\n }\n\n promise = new Promise(async(resolve, reject) => {\n \n await this.getTransportType();\n \n\n let error: ApiError;\n let _try = 1;\n while(_try++ <= 3) {\n try {\n const auth: AuthOptions = {\n dcId,\n nonce: randomize(new Uint8Array(16))\n };\n\n const promise = this.sendReqPQ(auth);\n resolve(await promise);\n return;\n } catch(err) {\n error = err;\n }\n }\n\n reject(error);\n });\n\n return this.cached[dcId] = promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport sessionStorage from '../sessionStorage';\nimport {nextRandomUint} from '../../helpers/random';\nimport {WorkerTaskVoidTemplate} from '../../types';\nimport ulongFromInts from '../../helpers/long/ulongFromInts';\nimport {AppManager} from '../appManagers/manager';\n\n/*\nlet lol: any = {};\nfor(var i = 0; i < 100; i++) {\n timeManager.generateId();\n}\n*/\n\nexport interface ApplyServerTimeOffsetTask extends WorkerTaskVoidTemplate {\n type: 'applyServerTimeOffset',\n payload: TimeManager['timeOffset']\n};\n\nexport class TimeManager extends AppManager {\n private lastMessageId: [number, number];\n private timeOffset: number;\n\n /* private midnightNoOffset: number;\n private midnightOffseted: Date;\n\n private midnightOffset: number; */\n\n /* private timeParams: {\n midnightOffset: number,\n serverTimeOffset: number\n }; */\n\n protected after() {\n this.lastMessageId = [0, 0];\n this.timeOffset = 0;\n\n sessionStorage.get('server_time_offset').then((to) => {\n if(to) {\n this.timeOffset = to;\n }\n });\n\n\n // * migrated from ServerTimeManager\n /* const timestampNow = tsNow(true);\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\n this.midnightOffseted = new Date();\n this.midnightOffseted.setHours(0, 0, 0, 0);\n\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\n\n /* this.timeParams = {\n midnightOffset: this.midnightOffset,\n serverTimeOffset: this.serverTimeOffset\n }; */\n }\n\n public getServerTimeOffset() {\n return this.timeOffset;\n }\n\n public generateId(): string {\n const timeTicks = Date.now(),\n timeSec = Math.floor(timeTicks / 1000) + this.timeOffset,\n timeMSec = timeTicks % 1000,\n random = nextRandomUint(16);\n\n let messageId: TimeManager['lastMessageId'] = [timeSec, (timeMSec << 21) | (random << 3) | 4];\n if(this.lastMessageId[0] > messageId[0] ||\n this.lastMessageId[0] === messageId[0] && this.lastMessageId[1] >= messageId[1]) {\n messageId = [this.lastMessageId[0], this.lastMessageId[1] + 4];\n }\n\n this.lastMessageId = messageId;\n\n const ret = ulongFromInts(messageId[0], messageId[1]).toString(10);\n\n // if(lol[ret]) {\n // console.error('[TimeManager]: Generated SAME msg id', messageId, this.timeOffset, ret);\n // }\n // lol[ret] = true;\n\n // console.log('[TimeManager]: Generated msg id', messageId, this.timeOffset, ret);\n\n return ret\n }\n\n public applyServerTime(serverTime: number, localTime?: number) {\n localTime = (localTime || Date.now()) / 1000 | 0;\n const newTimeOffset = serverTime - localTime;\n const changed = Math.abs(this.timeOffset - newTimeOffset) > 10;\n this.lastMessageId = [0, 0];\n\n if(this.timeOffset !== newTimeOffset) {\n sessionStorage.set({\n server_time_offset: newTimeOffset\n });\n\n this.timeOffset = newTimeOffset;\n }\n\n // console.log('[TimeManager]: Apply server time', serverTime, localTime, newTimeOffset, changed);\n\n return changed;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {DocumentAttribute, WebDocument} from '../../layer';\n\nexport default class AppWebDocsManager {\n public saveWebDocument(webDocument: WebDocument) {\n if(!webDocument) {\n return;\n }\n\n const attribute: DocumentAttribute.documentAttributeImageSize = webDocument.attributes.find((attribute) => attribute._ === 'documentAttributeImageSize') as any;\n if(attribute) {\n webDocument.w = attribute.w;\n webDocument.h = attribute.h;\n }\n\n return webDocument;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputInvoice, InputPaymentCredentials, PaymentRequestedInfo, PaymentsPaymentForm} from '../../layer';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport default class AppPaymentsManager extends AppManager {\n public getInputInvoiceBySlug(slug: string): InputInvoice.inputInvoiceSlug {\n return {\n _: 'inputInvoiceSlug',\n slug\n };\n }\n\n public getInputInvoiceByPeerId(peerId: PeerId, mid: number): InputInvoice.inputInvoiceMessage {\n return {\n _: 'inputInvoiceMessage',\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n };\n }\n\n public getPaymentForm(invoice: InputInvoice) {\n return this.apiManager.invokeApi('payments.getPaymentForm', {\n invoice\n }).then((paymentForm) => {\n this.appUsersManager.saveApiUsers(paymentForm.users);\n\n return paymentForm;\n });\n }\n\n public getPaymentReceipt(peerId: PeerId, mid: number) {\n return this.apiManager.invokeApi('payments.getPaymentReceipt', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((paymentForm) => {\n this.appUsersManager.saveApiUsers(paymentForm.users);\n\n return paymentForm;\n });\n }\n\n public validateRequestedInfo(invoice: InputInvoice, info: PaymentRequestedInfo, save?: boolean) {\n return this.apiManager.invokeApi('payments.validateRequestedInfo', {\n save,\n invoice,\n info\n });\n }\n\n public sendPaymentForm(\n invoice: InputInvoice,\n formId: PaymentsPaymentForm['form_id'],\n requestedInfoId: string,\n shippingOptionId: string,\n credentials: InputPaymentCredentials,\n tipAmount?: number\n ) {\n return this.apiManager.invokeApi('payments.sendPaymentForm', {\n form_id: formId,\n invoice,\n requested_info_id: requestedInfoId,\n shipping_option_id: shippingOptionId,\n credentials,\n tip_amount: tipAmount || undefined\n }).then((result) => {\n if(result._ === 'payments.paymentResult') {\n this.apiUpdatesManager.processUpdateMessage(result.updates);\n }\n\n return result;\n });\n }\n\n public clearSavedInfo(info?: boolean, credentials?: boolean) {\n return this.apiManager.invokeApi('payments.clearSavedInfo', {\n info,\n credentials\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MessageSendingParams} from './appMessagesManager';\nimport {AppManager} from './manager';\nimport {AttachMenuBots, AttachMenuBot, Update, DataJSON} from '../../layer';\nimport assumeType from '../../helpers/assumeType';\nimport makeError from '../../helpers/makeError';\nimport getAttachMenuBotIcon from './utils/attachMenuBots/getAttachMenuBotIcon';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport default class AppAttachMenuBotsManager extends AppManager {\n private attachMenuBots: Map;\n private attachMenuBotsArr: AttachMenuBot[];\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateAttachMenuBots: this.onUpdateAttachMenuBots\n });\n }\n\n public clear = (init = false) => {\n if(!init) {\n this.attachMenuBots.clear();\n this.attachMenuBotsArr = undefined;\n } else {\n this.attachMenuBots = new Map();\n }\n };\n\n private onUpdateAttachMenuBots = (update: Update.updateAttachMenuBots) => {\n this.clear();\n this.getAttachMenuBots();\n };\n\n public saveAttachMenuBot(attachMenuBot: AttachMenuBot) {\n this.attachMenuBots.set(attachMenuBot.bot_id, attachMenuBot);\n const icon = getAttachMenuBotIcon(attachMenuBot);\n icon.icon = this.appDocsManager.saveDoc(icon.icon, {type: 'attachMenuBotIcon', botId: attachMenuBot.bot_id});\n return attachMenuBot;\n }\n\n public saveAttachMenuBots(attachMenuBots: AttachMenuBot[]) {\n if((attachMenuBots as any).saved) return;\n (attachMenuBots as any).saved = true;\n attachMenuBots.forEach((user) => this.saveAttachMenuBot(user));\n }\n\n public getAttachMenuBots() {\n return this.attachMenuBotsArr ?? this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAttachMenuBots',\n processResult: (attachMenuBots) => {\n assumeType(attachMenuBots);\n this.appUsersManager.saveApiUsers(attachMenuBots.users);\n this.saveAttachMenuBots(attachMenuBots.bots);\n // ! temporary\n return this.attachMenuBotsArr = attachMenuBots.bots.slice(0, 0);\n }\n });\n }\n\n public getAttachMenuBotCached(botId: BotId) {\n return this.attachMenuBots.get(botId);\n }\n\n public getAttachMenuBot(botId: BotId, overwrite?: boolean) {\n if(!this.appUsersManager.isAttachMenuBot(botId) || true) {\n throw makeError('BOT_INVALID');\n }\n\n return (!overwrite && this.getAttachMenuBotCached(botId)) ?? this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAttachMenuBot',\n params: {\n bot: this.appUsersManager.getUserInput(botId)\n },\n processResult: (attachMenuBotsBot) => {\n this.appUsersManager.saveApiUsers(attachMenuBotsBot.users);\n const attachMenuBot = this.saveAttachMenuBot(attachMenuBotsBot.bot);\n return attachMenuBot;\n }\n });\n }\n\n public requestWebView(options: MessageSendingParams & {\n botId: BotId,\n peerId: PeerId,\n // platform: string,\n startParam?: string,\n fromBotMenu?: boolean,\n url?: string,\n themeParams?: DataJSON\n }) {\n const {\n botId,\n peerId,\n url,\n fromBotMenu,\n themeParams,\n // platform,\n replyToMsgId,\n silent,\n sendAsPeerId,\n startParam,\n threadId\n } = options;\n\n const platform = 'web';\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.requestWebView',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n bot: this.appUsersManager.getUserInput(botId),\n silent,\n platform,\n url,\n reply_to_msg_id: replyToMsgId ? getServerMessageId(replyToMsgId) : undefined,\n from_bot_menu: fromBotMenu,\n theme_params: themeParams,\n send_as: sendAsPeerId ? this.appPeersManager.getInputPeerById(sendAsPeerId) : undefined,\n start_param: startParam,\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n },\n processResult: (result) => {\n console.log(result);\n return result;\n }\n });\n }\n\n public prolongWebView(options: MessageSendingParams & {\n peerId: PeerId,\n botId: BotId,\n queryId: string | number\n }) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.prolongWebView',\n params: {\n peer: this.appPeersManager.getInputPeerById(options.peerId),\n bot: this.appUsersManager.getUserInput(options.botId),\n query_id: options.queryId,\n silent: options.silent,\n reply_to_msg_id: options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined,\n top_msg_id: options.threadId ? getServerMessageId(options.threadId) : undefined\n },\n processResult: (result) => {\n console.log(result);\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {UrlAuthResult} from '../../layer';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport default class AppSeamlessLoginManager extends AppManager {\n public requestUrlAuth(url: string, peerId?: PeerId, mid?: number, buttonId?: number) {\n return this.apiManager.invokeApi('messages.requestUrlAuth', {\n button_id: buttonId,\n msg_id: mid ? getServerMessageId(mid) : undefined,\n peer: peerId ? this.appPeersManager.getInputPeerById(peerId) : undefined,\n url\n }).then((urlAuthResult) => {\n if(urlAuthResult._ === 'urlAuthResultRequest') {\n this.appUsersManager.saveApiUser(urlAuthResult.bot);\n }\n\n return urlAuthResult;\n });\n }\n\n public acceptUrlAuth(url: string, peerId?: PeerId, mid?: number, buttonId?: number, writeAllowed?: boolean) {\n return this.apiManager.invokeApi('messages.acceptUrlAuth', {\n button_id: buttonId,\n msg_id: mid ? getServerMessageId(mid) : undefined,\n peer: peerId ? this.appPeersManager.getInputPeerById(peerId) : undefined,\n url,\n write_allowed: writeAllowed\n }).then((urlAuthResult) => {\n return urlAuthResult as Exclude;\n });\n }\n\n public getWebAuthorizations() {\n return this.apiManager.invokeApi('account.getWebAuthorizations').then((webAuthorizations) => {\n this.appUsersManager.saveApiUsers(webAuthorizations.users);\n return webAuthorizations.authorizations;\n });\n }\n\n public resetWebAuthorization(hash: Long) {\n return this.apiManager.invokeApi('account.resetWebAuthorization', {\n hash\n });\n }\n\n public resetWebAuthorizations() {\n return this.apiManager.invokeApi('account.resetWebAuthorizations');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport callbackify from '../../helpers/callbackify';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport appStateManager from './appStateManager';\nimport {AppStoragesManager} from './appStoragesManager';\nimport createManagers from './createManagers';\n\ntype Managers = Awaited>;\n\nexport class AppManagersManager {\n private managers: Managers | Promise;\n private cryptoWorkersURLs: string[];\n private cryptoPortsAttached: number;\n private cryptoPortPromise: CancellablePromise;\n\n constructor() {\n this.cryptoWorkersURLs = [];\n this.cryptoPortsAttached = 0;\n this.cryptoPortPromise = deferredPromise();\n this.cryptoPortPromise.then(() => {\n this.cryptoPortPromise = undefined;\n });\n }\n\n public start() {\n const port = MTProtoMessagePort.getInstance();\n\n port.addEventListener('manager', ({name, method, args}) => {\n return callbackify(this.getManagers(), (managers) => {\n // @ts-ignore\n const manager = managers[name];\n return manager[method].apply(manager, args);\n });\n });\n\n port.addEventListener('cryptoPort', (payload, source, event) => {\n const port = event.ports[0];\n if(this.cryptoPortsAttached >= this.cryptoWorkersURLs.length) {\n port.close();\n return;\n }\n\n ++this.cryptoPortsAttached;\n cryptoMessagePort.attachPort(port);\n this.cryptoPortPromise?.resolve();\n });\n\n port.addEventListener('createProxyWorkerURLs', ({originalUrl, blob}) => {\n let length = this.cryptoWorkersURLs.length;\n if(!length) {\n this.cryptoWorkersURLs.push(originalUrl);\n ++length;\n }\n\n const maxLength = App.cryptoWorkers;\n if(length === maxLength) {\n return this.cryptoWorkersURLs;\n }\n\n const newURLs = new Array(maxLength - length).fill(undefined).map(() => URL.createObjectURL(blob));\n this.cryptoWorkersURLs.push(...newURLs);\n return this.cryptoWorkersURLs;\n });\n }\n\n public async createManagers() {\n const appStoragesManager = new AppStoragesManager();\n\n await Promise.all([\n // new Promise(() => {}),\n appStoragesManager.loadStorages(),\n this.cryptoPortPromise\n ]);\n\n const managers = await createManagers(appStoragesManager, appStateManager.userId);\n return this.managers = managers;\n }\n\n public getManagers() {\n return this.managers ??= this.createManagers();\n }\n}\n\nconst appManagersManager = new AppManagersManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appManagersManager = appManagersManager);\nexport default appManagersManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PasswordManager} from '../mtproto/passwordManager';\nimport {ReferenceDatabase} from '../mtproto/referenceDatabase';\nimport DialogsStorage from '../storages/dialogs';\nimport FiltersStorage from '../storages/filters';\nimport {ApiUpdatesManager} from './apiUpdatesManager';\nimport {AppAvatarsManager} from './appAvatarsManager';\nimport {AppCallsManager} from './appCallsManager';\nimport {AppChatsManager} from './appChatsManager';\nimport {AppDocsManager} from './appDocsManager';\nimport {AppDraftsManager} from './appDraftsManager';\nimport {AppEmojiManager} from './appEmojiManager';\nimport {AppGroupCallsManager} from './appGroupCallsManager';\nimport {AppInlineBotsManager} from './appInlineBotsManager';\nimport {AppMessagesIdsManager} from './appMessagesIdsManager';\nimport {AppMessagesManager} from './appMessagesManager';\nimport {AppNotificationsManager} from './appNotificationsManager';\nimport {AppPeersManager} from './appPeersManager';\nimport {AppPhotosManager} from './appPhotosManager';\nimport {AppPollsManager} from './appPollsManager';\nimport {AppPrivacyManager} from './appPrivacyManager';\nimport {AppProfileManager} from './appProfileManager';\nimport {AppReactionsManager} from './appReactionsManager';\nimport {AppStickersManager} from './appStickersManager';\nimport {AppUsersManager} from './appUsersManager';\nimport {AppWebPagesManager} from './appWebPagesManager';\nimport {ApiFileManager} from '../mtproto/apiFileManager';\nimport {ApiManager} from '../mtproto/apiManager';\nimport ctx from '../../environment/ctx';\nimport PeersStorage from '../storages/peers';\nimport ThumbsStorage from '../storages/thumbs';\nimport {NetworkerFactory} from '../mtproto/networkerFactory';\nimport {RootScope} from '../rootScope';\nimport {Authorizer} from '../mtproto/authorizer';\nimport {DcConfigurator} from '../mtproto/dcConfigurator';\nimport {TimeManager} from '../mtproto/timeManager';\nimport {AppStoragesManager} from './appStoragesManager';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport appStateManager from './appStateManager';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport AppWebDocsManager from './appWebDocsManager';\nimport AppPaymentsManager from './appPaymentsManager';\nimport AppAttachMenuBotsManager from './appAttachMenuBotsManager';\nimport AppSeamlessLoginManager from './appSeamlessLoginManager';\n\nexport default function createManagers(appStoragesManager: AppStoragesManager, userId: UserId) {\n const managers = {\n appPeersManager: new AppPeersManager,\n appChatsManager: new AppChatsManager,\n appDocsManager: new AppDocsManager,\n appPhotosManager: new AppPhotosManager,\n appPollsManager: new AppPollsManager,\n appUsersManager: new AppUsersManager,\n appWebPagesManager: new AppWebPagesManager,\n appDraftsManager: new AppDraftsManager,\n appProfileManager: new AppProfileManager,\n appNotificationsManager: new AppNotificationsManager,\n apiUpdatesManager: new ApiUpdatesManager,\n appAvatarsManager: new AppAvatarsManager,\n appGroupCallsManager: new AppGroupCallsManager,\n appCallsManager: new AppCallsManager,\n appReactionsManager: new AppReactionsManager,\n appMessagesManager: new AppMessagesManager,\n appMessagesIdsManager: new AppMessagesIdsManager,\n appPrivacyManager: new AppPrivacyManager,\n appInlineBotsManager: new AppInlineBotsManager,\n appStickersManager: new AppStickersManager,\n referenceDatabase: new ReferenceDatabase,\n appEmojiManager: new AppEmojiManager,\n filtersStorage: new FiltersStorage,\n dialogsStorage: new DialogsStorage,\n apiManager: new ApiManager,\n cryptoWorker: cryptoMessagePort,\n passwordManager: new PasswordManager,\n apiFileManager: new ApiFileManager,\n peersStorage: new PeersStorage,\n thumbsStorage: new ThumbsStorage,\n networkerFactory: new NetworkerFactory,\n rootScope: new RootScope,\n authorizer: new Authorizer,\n dcConfigurator: new DcConfigurator,\n timeManager: new TimeManager,\n appStoragesManager: appStoragesManager,\n appStateManager: appStateManager,\n appWebDocsManager: new AppWebDocsManager,\n appPaymentsManager: new AppPaymentsManager,\n appAttachMenuBotsManager: new AppAttachMenuBotsManager,\n appSeamlessLoginManager: new AppSeamlessLoginManager\n };\n\n type T = typeof managers;\n\n for(const name in managers) {\n const manager = managers[name as keyof T];\n if(!manager) {\n continue;\n }\n\n if((manager as AppMessagesManager).setManagers) {\n (manager as AppMessagesManager).setManagers(managers as any);\n delete (manager as AppMessagesManager).setManagers;\n }\n\n // @ts-ignore\n ctx[name] = manager;\n }\n\n const promises: Array void) | void> | void>[] = [];\n let names = Object.keys(managers) as (keyof T)[];\n names.unshift('appUsersManager', 'appChatsManager', 'appNotificationsManager', 'appMessagesManager', 'dialogsStorage');\n names = filterUnique(names);\n for(const name of names) {\n const manager = managers[name];\n if((manager as any)?.after) {\n // console.log('injecting after', name);\n const result = (manager as any).after();\n promises.push(result);\n\n // if(result instanceof Promise) {\n // result.then(() => {\n // console.log('injected after', name);\n // });\n // }\n }\n }\n\n if(userId) {\n managers.apiManager.setUserAuth(userId);\n }\n\n return Promise.all(promises).then(() => managers);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// just to include\nimport '../polyfill';\nimport '../../helpers/peerIdPolyfill';\n\nimport cryptoWorker from '../crypto/cryptoMessagePort';\nimport {setEnvironment} from '../../environment/utils';\nimport appStateManager from '../appManagers/appStateManager';\nimport transportController from './transports/controller';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport RESET_STORAGES_PROMISE from '../appManagers/utils/storages/resetStoragesPromise';\nimport appManagersManager from '../appManagers/appManagersManager';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport {logger} from '../logger';\nimport {State} from '../../config/state';\nimport toggleStorages from '../../helpers/toggleStorages';\nimport appTabsManager from '../appManagers/appTabsManager';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport callbackify from '../../helpers/callbackify';\n\nlet _isServiceWorkerOnline = true;\nexport function isServiceWorkerOnline() {\n return _isServiceWorkerOnline;\n}\n\nlet serviceMessagePort: ServiceMessagePort, _serviceMessagePort: MessagePort;\nexport function getServiceMessagePort() {\n return _isServiceWorkerOnline ? serviceMessagePort : undefined;\n}\n\nconst log = logger('MTPROTO');\n// let haveState = false;\n\nconst port = new MTProtoMessagePort();\nport.addMultipleEventsListeners({\n environment: (environment) => {\n setEnvironment(environment);\n\n transportController.waitForWebSocket();\n },\n\n crypto: ({method, args}) => {\n return cryptoWorker.invokeCrypto(method as any, ...args as any);\n },\n\n state: ({state, resetStorages, pushedKeys, newVersion, oldVersion, userId}) => {\n // if(haveState) {\n // return;\n // }\n\n log('got state', state, pushedKeys);\n\n appStateManager.userId = userId;\n appStateManager.newVersion = newVersion;\n appStateManager.oldVersion = oldVersion;\n\n (Object.keys(state) as any as (keyof State)[]).forEach((key) => {\n appStateManager.pushToState(key, state[key], true, !pushedKeys.includes(key));\n });\n\n RESET_STORAGES_PROMISE.resolve(resetStorages);\n // haveState = true;\n },\n\n toggleStorages: ({enabled, clearWrite}) => {\n return toggleStorages(enabled, clearWrite);\n },\n\n event: (payload, source) => {\n log('will redirect event', payload, source);\n port.invokeExceptSource('event', payload, source);\n },\n\n serviceWorkerOnline: (online) => {\n _isServiceWorkerOnline = online;\n },\n\n serviceWorkerPort: (payload, source, event) => {\n if(serviceMessagePort) {\n serviceMessagePort.detachPort(_serviceMessagePort);\n _serviceMessagePort = undefined;\n } else {\n serviceMessagePort = new ServiceMessagePort();\n serviceMessagePort.addMultipleEventsListeners({\n requestFilePart: (payload) => {\n return callbackify(appManagersManager.getManagers(), (managers) => {\n const {docId, dcId, offset, limit} = payload;\n return managers.appDocsManager.requestDocPart(docId, dcId, offset, limit);\n });\n }\n });\n }\n\n // * port can be undefined in the future\n if(_serviceMessagePort = event.ports[0]) {\n serviceMessagePort.attachPort(_serviceMessagePort);\n }\n },\n\n createObjectURL: (blob) => {\n return URL.createObjectURL(blob);\n }\n\n // socketProxy: (task) => {\n // const socketTask = task.payload;\n // const id = socketTask.id;\n\n // const socketProxied = socketsProxied.get(id);\n // if(socketTask.type === 'message') {\n // socketProxied.dispatchEvent('message', socketTask.payload);\n // } else if(socketTask.type === 'open') {\n // socketProxied.dispatchEvent('open');\n // } else if(socketTask.type === 'close') {\n // socketProxied.dispatchEvent('close');\n // socketsProxied.delete(id);\n // }\n // },\n});\n\nlog('MTProto start');\n\nappManagersManager.start();\nappManagersManager.getManagers();\nappTabsManager.start();\n\n// let sentHello = false;\nlistenMessagePort(port, (source) => {\n appTabsManager.addTab(source);\n\n // port.invokeVoid('hello', undefined, source);\n // if(!sentHello) {\n // port.invokeVoid('hello', undefined, source);\n // sentHello = true;\n // }\n}, (source) => {\n appTabsManager.deleteTab(source);\n});\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type SuperMessagePort from '../lib/mtproto/superMessagePort';\nimport ctx from '../environment/ctx';\n\nexport default function listenMessagePort(\n messagePort: SuperMessagePort,\n onConnect?: (source: MessageEventSource) => void,\n onDisconnect?: (source: MessageEventSource) => void\n) {\n const attachPort = (listenPort: any, sendPort: any) => {\n messagePort.attachListenPort(listenPort);\n sendPort && messagePort.attachSendPort(sendPort);\n onConnect?.(listenPort);\n };\n\n messagePort.setOnPortDisconnect(onDisconnect);\n\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\n attachPort(ctx, null);\n } else {\n attachPort(ctx, ctx);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDialogFilter} from '../storages/filters';\n\n/**\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\n */\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\nexport type REAL_FOLDER_ID = 0 | 1;\n\nexport const NULL_PEER_ID: PeerId = 0;\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\nexport const SERVICE_PEER_ID: PeerId = 777000;\nexport const MUTE_UNTIL = 0x7FFFFFFF;\nexport const BOT_START_PARAM = '';\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\nexport const THUMB_TYPE_FULL = '';\nexport const TOPIC_COLORS = [0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, 0xFB6F5F];\nexport const ATTACH_MENU_BOT_ICON_NAME = 'default_static';\nexport const GENERAL_TOPIC_ID = 4295032831;\nexport const T_ME_PREFIXES = new Set(['web', 'k', 'z']);\n\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\nexport const REAL_FOLDERS: Set = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport emojiRegExp from '../../vendor/emoji/regex';\nimport {MessageEntity} from '../../layer';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nexport const ALPHA_CHARS_REG_EXP = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\n // user:pass authentication\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n '|' +\n // host name\n URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\nexport const URL_ANY_PROTOCOL_REG_EXP = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP, 'i');\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n// const markdownTestRegExp = /[`_*@~]/;\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nexport const SITE_HASHTAGS: {[siteName: string]: string} = {\n 'Telegram': 'tg://search_hashtag?hashtag={1}',\n 'Twitter': 'https://twitter.com/hashtag/{1}',\n 'Instagram': 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\n// Telegram: '#{1}',\n// Twitter: 'https://twitter.com/{1}',\n// Instagram: 'https://instagram.com/{1}/',\n// GitHub: 'https://github.com/{1}'\n// };\n\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nexport const PASS_CONFLICTING_ENTITIES: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(const i in MARKDOWN_ENTITIES) {\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\n}\n\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\n\n/* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n} */\n\n\n/* export function replaceUrlEncodings(urlWithEncoded: string) {\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, (str) => {\n try {\n return decodeURIComponent(str);\n } catch (e) {\n return str;\n }\n });\n} */\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\n\nexport function encodeEmoji(emojiText: string) {\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\n return codepoints;\n}\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\n\nexport function toCodePoints(unicodeSurrogates: string): Array {\n const points = [];\n let char = 0;\n let previous = 0;\n let i = 0;\n while(i < unicodeSurrogates.length) {\n char = unicodeSurrogates.charCodeAt(i++);\n if(previous) {\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\n previous = 0;\n } else if(char > 0xd800 && char <= 0xdbff) {\n previous = char;\n } else {\n points.push(char.toString(16));\n }\n }\n\n if(points.length && points[0].length === 2) {\n points[0] = '00' + points[0];\n }\n\n return points;\n}\n\nexport function getEmojiToneIndex(input: string) {\n const match = input.match(/[\\uDFFB-\\uDFFF]/);\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\n}\n\nconst VIRTUAL_COUNTRIES_EMOJIS: Map = new Map([\n ['FT', '🏴‍☠']\n]);\n\nexport function getCountryEmoji(iso2: string) {\n return VIRTUAL_COUNTRIES_EMOJIS.get(iso2) ??\n String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\n}\n\nexport function emojiFromCodePoints(codePoints: string) {\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,211,539,85,946], () => (__webpack_require__(1082)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === 85) return \"85.952a9f12a6b3dcdd3f0e.bundle.js\";\n\tif (chunkId === 946) return \"946.d26679f97a8960b11df8.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + ({\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] || chunkId) + \".\" + {\"8\":\"570e6da51a125009c156\",\"104\":\"c914ddc183166c9696a7\",\"211\":\"780c206f3e1257ccad6a\",\"301\":\"42dc636f96a62f6a08c8\",\"539\":\"17a0b07b4e6476f19654\",\"642\":\"fd1ade69544ad78671c6\",\"699\":\"85f88e27b023cbb2ca51\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t678: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","DEBUG","MOUNT_CLASS_TO","window","self","EmojiVersions","Emoji","version","Object","assign","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","badCharsRe","trimRe","C2L","cleanSearchText","text","latinize","processSearchText","clearBadChars","ignoreCase","options","hasTag","includeTag","charAt","originalText","replace","clearBadCharsAndTrim","ch","latinizeCh","latinizeString","fixCyrillic","FILENAME_JOINER","getFileNameByLocation","location","ext","length","str","_","id","thumb_size","filter","Boolean","join","photo_id","pFlags","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","url","console","error","downloadId","getFileURL","type","encodeURIComponent","JSON","stringify","platforms","Set","ignore","getRestrictionReason","reasons","find","reason","has","isRestricted","ignoreRestrictionReasons","clear","forEach","add","getPeerId","peerId","undefined","isPeerId","userId","user_id","toPeerId","chatId","channel_id","chat_id","isUser","peerParams","substr","split","IDB","constructor","db","this","name","storageIsAvailable","log","openDatabase","INSTANCES","push","isAvailable","createNew","openDbPromise","createIndexes","os","store","indexNames","Array","from","indexName","deleteIndex","indexes","index","contains","createIndex","keyPath","objectParameters","request","indexedDB","open","Promise","reject","message","finished","setTimeout","onerror","resolve","onsuccess","event","result","calledNew","onclose","e","onabort","transaction","target","close","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","static","instance","preserve","storage","IDBStorage","storeName","idb","create","delete","entryName","isArray","concat","getObjectStore","map","save","value","idx","put","get","mode","callback","perf","performance","now","then","onError","clearTimeout","timeout","onComplete","results","requests","r","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","i","getAll","environment","getEnvironment","setEnvironment","env","RootScope","super","myId","connectionStatus","premium","addEventListener","isNew","isPremium","dispatchEventSingle","status","dispatchEvent","args","invokeVoid","settings","getConnectionStatus","getPremium","state","stateStorage","getState","setByKey","key","object","splitted","getDeepProperty","slice","pop","setDeepProperty","first","pushToState","direct","onlyLocal","setKeyValueToStorage","set","HTTP","dcId","logSuffix","pending","debug","logTypes","Log","logger","connected","_send","body","fetch","method","response","arrayBuffer","buffer","TextDecoder","decode","Uint8Array","setConnected","err","destroyed","destroy","send","networker","promise","releasePending","releasing","splice","pause","Socket","handleOpen","handleError","handleClose","removeListeners","handleMessage","data","byteLength","ws","connect","removeEventListener","WebSocket","binaryType","randomize","arr","crypto","Error","getRandomValues","Obfuscation","_process","operation","cryptoMessagePort","transfer","init","codec","idPromise","release","initPayload","val","val2","reversedPayload","reverse","encKey","encIv","decKey","decIv","process","obfuscateTag","encrypted","encode","payload","tag","encodePacket","len","header","readPacket","bytesToHex","bytes","toString","TcpObfuscated","Connection","retryTimeout","abridged","obfuscation","autoReconnect","onOpen","connection","setConnectionStatus","cleanupSent","resend","onMessage","parseResponse","processMessage","messageId","sessionId","catch","shift","onClose","needTimeout","retryAt","time","Date","diff","lastCloseTime","isNaN","reconnectTimeout","ctx","reconnect","bodySent","forceReconnect","setAutoReconnect","once","enable","changeUrl","encodeBody","toEncode","encoded","releasingPending","sent","TEST_SUFFIX","getTelegramConnectionSuffix","connectionType","constructTelegramWebSocketUrl","suffix","path","DcConfigurator","sslSubdomains","dcOptions","host","port","chosenServers","transportSocket","chosenServer","oooohLetMeLive","transportHTTP","dcOption","chooseServer","transportType","reuse","hasOwnProperty","client","download","upload","servers","transports","transport","obj","indexOfAndSplice","MTTransportController","opened","Map","waitForWebSocket","pingTransports","dcConfigurator","https","websocket","httpPromise","websocketPromise","socket","isFulfilled","isRejected","isHttpAvailable","isWebSocketAvailable","all","pinging","setTransportValue","setTransportOpened","setTransportClosed","AppManager","setManagers","managers","loadStorages","storages","recordPromise","storagesKeys","keys","storagesPromises","storagesResults","resetStorages","size","loadStoragesInner","AppStoragesManager","names","createStorages","loadStorage","PasswordManager","apiManager","invokeApi","updateSettings","currentHashPromise","newHashPromise","params","password","new_settings","hint","email","currentPassword","cryptoWorker","invokeCrypto","newAlgo","new_algo","salt1","newPassword","hashes","new_password_hash","getInputCheckPassword","check","inputCheckPassword","auth","setUser","user","confirmPasswordEmail","code","resendPasswordEmail","cancelPasswordEmail","ReferenceDatabase","contexts","links","saveContext","reference","context","getContexts","_context","deepEqual","getReferenceByLink","getContext","values","deleteContext","refreshReference","c","appMessagesManager","reloadMessages","refreshEmojiesSoundsPromise","appStickersManager","getAnimatedEmojiSounds","appProfileManager","getProfile","appEmojiManager","getCustomEmojiDocuments","docId","appAttachMenuBotsManager","getAttachMenuBot","botId","hex","newHex","newContext","makeError","safeReplaceObject","wasObject","newObject","getPeerIdsFromMessage","peerIds","fromId","viaBotId","fwdFromId","media","contactUserId","recentVoters","recent_voters","recentReactions","recent_reactions","reaction","peer_id","action","userIds","users","inviter_id","chatIds","recentRepliers","recent_repliers","reply","setDialogIndex","dialog","indexKey","GLOBAL_FOLDER_ID","DialogsStorage","allDialogsLoaded","pinnedOrders","folderId","saveAllDialogsLoaded","resetPinnedOrder","savePinnedOrders","forumTopics","folders","dialogsOffsetDate","dialogsNum","dialogsIndex","cachedResults","query","count","dialogs","onUpdateFolderPeers","update","folder_peers","folderPeer","folder_id","peer","appPeersManager","dropDialog","pinned","handleDialogUnpinning","generateIndexForDialog","pushDialog","scheduleHandleNewDialogs","onUpdateDialogPinned","getDialogOnly","handleDialogTogglePinned","onUpdateChannelPinnedTopic","topicId","generateMessageId","topic_id","topic","getForumTopic","getFilterIdForForum","onUpdatePinnedDialogs","order","handleDialogsPinned","dialogsResult","applyDialogs","d","onUpdateChannelPinnedTopics","filterId","limit","getLimit","channel","appChatsManager","getChannelInput","toChatId","offset_date","offset_id","offset_topic","processTopics","topics","after","rootScope","appUsersManager","getSelf","peerText","getPeerSearchText","indexObject","onFilterUpdate","getCachedDialogs","processDialogForFilter","processDialogForFilters","getDialogIndexKeyByFilterId","processChangedUnreadOrUnmuted","chat","getChat","dropDialogOnDeletion","enabled","flushForumTopicsCache","apiUpdatesManager","addMultipleEventsListeners","updateFolderPeers","updateDialogPinned","updateChannelPinnedTopic","updatePinnedDialogs","updateChannelPinnedTopics","appStateManager","appStoragesManager","getCache","_order","getPinnedOrders","setDialogsFromState","bind","appDraftsManager","addMissedDialogs","top_message","getServerMessageId","topMessage","saveMessages","saveDialog","ignoreOffsetDate","getMessageByPeer","reloadConversation","isDialogsLoaded","setDialogsLoaded","loaded","isForum","isFilterIdForForum","defineNotNumerableProperties","every","orders","isDialogPinned","filtersStorage","getFilter","isPinned","pinnedPeerIds","getOffsetDate","offsetDate","Math","min","sort","a","b","generateFolder","folder","unreadMessagesCount","unreadPeerIds","unreadUnmutedPeerIds","getFolder","forumTopic","getDialogKey","isTopic","getFolderDialogs","skipMigrated","hidden","migratedTo","getNextDialog","currentPeerId","findIndex","getDialogIndexKey","localId","isDialogUnmuted","appNotificationsManager","isPeerLocalMuted","respectType","threadId","getFolderUnreadCount","unreadUnmutedCount","unreadCount","arrays","setDialogIndexInFilter","isRealFolder","testDialogForFilter","pinnedIds","pinnedKey","pinnedIndex","generateDialogIndex","generateDialogPinnedDateByIndex","getDialogIndex","getDialog","verify","skipped","getDialogOrTopic","isObject","date","tsNow","timeManager","getServerTimeOffset","noIndex","filters","getFilters","cmp","wasIndex","wasDialog","wasDialogIndex","newDialogIndex","prepareFolderUnreadCountModifyingByDialog","insertInDescendSortedArray","prepareDialogUnreadCountModifying","toggle","callbacks","wasUnreadCount","getDialogUnreadCount","wasUnmuted","newUnreadCount","newUnmuted","addMessagesCount","modifyFolderUnreadCount","toggleDialog","toggleUnmuted","forumUnreadCount","getForumUnreadCount","hasUnmuted","some","max","dispatchUnreadTimeout","_folder","justReturn","noPinnedOrderUpdate","topDate","generateDialogPinnedDate","channelId","isChannel","draft","dialogKey","unshift","setDialogToState","pts","historyStorage","getHistoryStorage","messagesStorage","getHistoryMessagesStorage","history","incomingMessage","mid","getMessageFromStorage","is_outgoing","peersStorage","requestPeersForKey","isAnyChat","newPts","getChannelState","requestPeer","saveGlobalOffset","getForumTopicsCache","getDialogOffsetDate","savedGlobalOffsetDate","savedOffsetDate","dropDialogFromFolders","foundDialog","wasPinned","keepLocal","clearDialogFromState","releasePeer","dropDialogWithEvent","dropped","items","forEachReverse","assumeType","saveApiUsers","saveApiChats","chats","messages","updatedDialogs","topMid","topPendingMid","pendingTopMsgs","topPendingMessage","maxId","cache","getUpdateCache","getUpdateAfterReloadKey","updates","newUpdatesAfterReloadToHandle","saveUpdate","canSaveDialogByPeerId","isDialog","wasDialogBefore","wasTopMessage","generateTempMessageId","from_id","getOutputPeer","deleted","out","isOutgoing","migrated_to","deactivated","migratedToPeer","migratedFromTo","migratedToFrom","read_inbox_max_id","read_outbox_max_id","saveDraft","isOut","unread","unread_count","isEnd","insertSlice","setEnd","mergeReplyKeyboard","readMaxId","readOutboxMaxId","savePeerSettings","notify_settings","addChannelState","releaseUnreadCount","dialogsStorage","processTopicUpdate","oldTopic","isIconChanged","icon_emoji_id","isTitleChanged","title","isChanged","getDialogs","offsetIndex","promises","fillContactsResult","fillContacts","cached","reloadMissingDialogsPromise","reloadMissingPeerIds","realFolderId","curDialogStorage","d1","d2","offset","loadedAll","isEnoughDialogs","isTopEnd","getTopMessages","deletedTopics","getTopicPromises","getForumTopicById","getTopicsPromise","ids","fullfillLeft","messagesForumTopics","getForumTopicOrReload","callbackify","processTopicsPromise","f","reduce","acc","v","newPinned","convertment","PREPENDED_FILTERS","LOCAL_FILTER","flags","exclude_peers","include_peers","pinned_peers","excludePeerIds","includePeerIds","FiltersStorage","filtersArr","reloadedPeerIds","localFilters","generateLocalFilter","clearFilters","onUpdateDialogFilter","saveDialogFilter","findAndSplice","onUpdateDialogFilters","oldFilters","copy","getDialogFilters","_filterId","onUpdateDialogFilterOrder","includes","setLocalId","updateDialogFilter","updateDialogFilters","updateDialogFilterOrder","prependFilters","allChatsFilter","archiveFilter","allChatsFilterIndex","exclude_archived","exclude_unarchived","exclude_read","isDialogUnread","exclude_muted","unread_mentions_count","broadcasts","isBroadcast","groups","isAnyGroup","toUserId","isBot","bots","non_contacts","isContact","contacts","testDialogForFilterId","toggleDialogPin","getConfig","pinned_infolder_count_max","getInputPeerById","createDialogFilter","prepend","remove","getOutputDialogFilter","bool","updateDialogFiltersOrder","filterIncludedPinnedPeers","peers","reloadDialogs","inputPeer","isAlreadyReloaded","reloadPromises","missingPeerIds","overwrite","invokeApiSingle","getSuggestedDialogsFilters","silent","to","oldFilter","_filter","isFilterIdAvailable","applyMixins","derivedCtor","constructors","baseCtor","getOwnPropertyNames","prototype","getOwnPropertyDescriptor","defineProperty","ApiUpdatesManager","updatesState","pendingPtsUpdates","pendingSeqUpdates","syncPending","syncLoading","channelStates","attached","subscriptions","processUpdateMessage","updateMessage","processOpts","seq","seqStart","seq_start","forceGetDifference","processUpdate","toId","fwd_from","reply_to","entities","pts_count","override","_constructor","setProxy","Proxy","saveUpdatesState","us","popPendingSeqUpdate","nextSeq","pendingUpdatesData","seqAwaiting","ptsAwaiting","clearStatePendingSync","popPendingPtsUpdate","curState","curPts","goodPts","goodIndex","getDifference","processLocalUpdate","wasSyncing","pts_total_limit","qts","differenceResult","other_updates","new_messages","apiMessage","nextState","intermediate_state","onDifferenceTooLong","justAName","getChannelDifference","channelState","bindPrefix","lastDifferenceTime","final","lastPtsUpdateTime","fwdHeader","hasUser","post","hasChat","popPts","popSeq","subscribeToChannelUpdates","subscription","cb","interval","unsubscribeFromChannelUpdates","force","clearInterval","attach","langCode","noErrorBox","stateResult","setUpdatesProcessor","strs","en","ru","getChangelog","lang","res","ok","langStr","parseMarkdown","inbox_date","languages","filterUnique","language","AppAvatarsManager","savedAvatarURLs","removeFromAvatarsCache","isAvatarCached","saved","loadAvatar","photo","peerPhotoFileLocation","downloadOptions","dc_id","limitPart","apiFileManager","blob","URL","createObjectURL","AppCallsManager","calls","IS_CALL_SUPPORTED","updatePhoneCall","saveCall","phone_call","updatePhoneCallSignalingData","callId","phone_call_id","computeKey","g_b","p","call","isDiscarded","oldCall","getCall","getCallInput","access_hash","savePhonePhoneCall","phonePhoneCall","generateDh","random_length","dhConfig","requestCall","protocol","g_a_hash","video","getUserInput","random_id","discardCall","duration","connection_id","AppChatsManager","isPeerNeeded","modifyUsernamesCache","onChatUpdated","updateChannelParticipant","clearCache","updateChatDefaultBannedRights","default_banned_rights","getFromCache","apiChats","saveApiChat","oldChat","participants_count","changedUsername","setUsernameToCache","oldPhotoId","newPhotoId","toggledForum","forum","changedPhoto","changedTitle","changedAnyBadge","verified","scam","fake","hasRights","rights","isThread","editChatDefaultBannedRights","banned_rights","until_date","isMegagroup","megagroup","isInChat","good","getInputPeer","getChannelInputPeer","getChatInputPeer","allowMin","getChatString","createChannel","inviteToChannel","input","usersInputs","u","createChat","leaveChannel","joinChannel","addChatUser","fwdLimit","fwd_limit","deleteChatUser","leaveChat","leave","deleteChannel","deleteChat","migrateChat","updateUsername","username","doNotRefresh","refreshChatAfterRequest","editPhoto","inputFile","inputChatPhoto","file","editTitle","editAbout","about","editBanned","participant","getParticipantPeerId","timestamp","actor_id","prev_participant","new_participant","kicked_by","clearChannelParticipantBannedRights","kickFromChannel","view_messages","kickFromChat","resolveChannel","messagesChats","togglePreHistoryHidden","toggleSignatures","toggleNoForwards","setChatAvailableReactions","reactions","chatFull","getCachedFullChat","available_reactions","getSendAs","invokeApiSingleProcess","processResult","sendAsPeers","importChatInvite","hash","checkUsername","getSponsoredMessage","invokeApiCacheable","cacheSeconds","sponsoredMessages","sponsoredMessage","viewSponsoredMessage","randomId","checkChatInvite","chatInvite","toggleUsername","active","reorderUsernames","deactivateAllUsernames","makeChannelPrivate","getChannels","toggleForum","editForumTopic","iconEmojiId","closed","createForumTopic","iconColor","channelFull","getChannelFull","sendAsInputPeer","default_send_as","icon_color","send_as","updatePinnedForumTopic","wrapUrl","unsafe","matchUrlProtocol","tgMeMatch","telescoPeMatch","tgMatch","onclick","prefix","pathname","fullPath","I18n","pluralRules","cacheLangPackPromise","setLangCode","lastRequestedLangCode","lastRequestedNormalizedLangCode","updateAmPm","timeFormat","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","langSign","countries","strings","formatLocalStrings","default","saveLangPack","from_version","lang_code","local","loadLangPack","web","requestedServerLanguage","lang_pack","polyfillPromise","pushTo","langPack","appVersion","applyLangPack","currentLangCode","Intl","PluralRules","string","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","document","querySelectorAll","element","weakMap","superFormatter","indexHolder","lastIndex","p1","p2","p3","p4","createElement","append","lastIndexOf","wrappedUrl","href","setAttribute","DocumentFragment","firstChild","textContent","arg","pushNextArgument","plain","select","item","Node","isRTL","setRTL","rtl","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","l","_Intl","WeakMap","IntlElementBase","classList","property","IntlElement","safeAssign","formatted","dataset","compareAndUpdate","json","DateTimeFormat","hours","getHours","getMinutes","capitalizeFirstLetter","i18n","i18n_","_i18n","months","days","getWeekNumber","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","getTime","today","year","day","month","weekday","minYear","yearPattern","RegExp","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","createForMonthYear","dates","selectedYear","currentYear","setFullYear","minDate","setMonth","maxDate","formatterMonthYear","createForDayMonth","validDateForMonth","formatterDayMonth","formatterYearMax","formatWeekLong","getDay","q","safeReplaceArrayInObject","trim","dayOfWeek","setDate","getDayOfWeek","distance","setTime","matches","exec","g1","g2","k","g3","parseInt","k1","EXTENSION_MIME_TYPE_MAP","pdf","tgv","tgs","wav","mp3","ogg","jpeg","jpg","png","gif","webp","mp4","webm","mov","svg","MIME_TYPE_EXTENSION_MAP","uploadWallPaperTempId","AppDocsManager","onServiceWorkerFail","docs","doc","supportsStreaming","thumbsStorage","deleteCacheContext","stickerCachedThumbs","uploadingWallPapers","online","saveDoc","oldDoc","file_reference","referenceDatabase","attributes","attribute","file_name","wrapPlainText","voice","mime_type","w","h","round_message","alt","stickerEmojiRaw","stickerSetInput","thumbs","IS_WEBP_SUPPORTED","sticker","IS_WEBM_SUPPORTED","animated","mappedMimeType","joiner","monthAsNumber","noSeconds","getSeconds","leadingZero","noTime","getFullDate","isServiceWorkerOnline","getCacheContext","setCacheContextURL","thumb","getDocumentDownloadOptions","getDocumentURL","getDoc","downloadDoc","queueId","onlyCache","downloadMedia","getLottieCachedThumb","toneIndex","saveLottiePreview","width","height","saveWebPConvertedStrippedThumb","stickerThumbConverted","getWallPapers","invokeApiHashable","accountWallpapers","wallPapers","wallpapers","wallPaper","prepareWallPaperUpload","cacheContext","wallpaper","slug","uploadWallPaper","fileName","downloaded","getGifs","gifs","requestDocPart","requestFilePart","getDocumentInputFileLocation","AppDraftsManager","drafts","updateDraftMessage","notify","getKey","getDraft","getAllDrafts","getAllDraftPromise","apiDraft","processApiDraft","isEmptyDraft","reply_to_msg_id","syncDraft","localDraft","saveOnServer","serverDraft","draftsAreEqual","draftObj","getInputEntities","no_webpage","top_msg_id","saveLocalDraft","clearAllDrafts","combined","clearDraft","emptyDraft","setDraft","EMOJI_LANG_PACK","keywords","AppEmojiManager","keywordLangPacks","indexedLangPacks","getKeywordsPromises","recent","getRecentEmojisPromises","getCustomEmojiDocumentPromises","getEmojiKeywords","storageKey","pack","validateInitObject","keywordsDifference","packKeywords","keyword","emoticons","getBothEmojiKeywords","networkerFactory","native","getRecentEmojis","indexEmojis","searchEmojis","emojis","POPULAR_EMOJI","recentEmoji","recentCustomEmoji","pushRecentEmoji","emoji","fixEmoji","docIds","document_id","documents","appDocsManager","getCachedCustomEmojiDocuments","setDebouncedGetCustomEmojiDocuments","getCustomEmojiDocumentsPromise","allIds","getCustomEmojiDocument","getCustomEmojis","getEmojiStickers","AppGroupCallsManager","groupCalls","participants","nextOffsets","updateGroupCall","saveGroupCall","updateGroupCallParticipants","groupCallId","saveApiParticipants","groupCall","getCachedParticipants","prepareToSavingNextOffset","nextOffsetsMap","nextOffset","setNextOffset","newNextOffset","saveApiParticipant","skipCounterUpdating","oldParticipant","hasLeft","muted","can_self_unmute","getGroupCall","modified","just_joined","apiParticipants","editParticipant","getGroupCallInput","getInputPeerSelf","volume","raise_hand","raiseHand","video_paused","videoPaused","video_stopped","videoStopped","presentation_paused","presentationPaused","getGroupCallFull","participants_next_offset","shouldUpdate","createGroupCall","scheduleDate","schedule_date","getGroupCallParticipants","sources","groupCallParticipants","next_offset","hangUp","discard","groupCallInput","source","join_as","joinGroupCall","isMuted","joinVideo","leaveGroupCallPresentation","getPhotoInput","getPhotoMediaInput","ttl_seconds","getMediaInput","AppInlineBotsManager","inlineResults","setHash","getGeoInput","geo","lat","long","accuracy_radius","getInlineResults","bot","geo_point","stopTime","botResults","queryId","query_id","appPhotosManager","savePhoto","generateQId","pushPopularBot","getTopPeers","topPeers","botPeerId","topPeer","rating","switchToPM","fromPeerId","startParam","startBot","checkSwitchReturn","getUser","bot_inline_placeholder","peerData","switchInlineQuery","getPeerUsername","callbackButtonClick","button","msg_id","sendInlineResult","queryAndResultIds","inlineResult","queryID","resultID","resultId","send_message","reply_markup","replyMarkup","sendText","inputMedia","messageMedia","caption","sendMessage","geoPoint","address","provider","venue_id","venue_type","phone_number","first_name","last_name","vcard","description","currency","total_amount","shipping_address_requested","start_param","sendOther","AppMessagesIdsManager","tempNum","num","splitStringByLength","maxLength","lastSliceStartIndex","arrayIndex","cut","end","part","_arrayIndex","partLength","appTabsManager","tabs","start","getTabs","tab","addTab","deleteTab","getDocumentInput","setBooleanFlag","processAfter","UPDATE_STICKERSET_ORDER","AppMessagesManager","pendingByRandomId","pendingByMessageId","pendingAfterMsgs","tempFinalizeCallbacks","sendSmthLazyLoadQueue","needSingleMessages","extendedMedia","maxSeenId","newDialogsToHandle","notificationsToHandle","reloadConversationsPeers","groupedTempId","typings","unreadMentions","goToNextMentionPromises","batchUpdates","middleware","clean","uploadFilePromises","messagesStorageByPeerId","groupedMessagesStorage","scheduledMessagesStorage","historiesStorage","threadsStorage","searchesStorage","pinnedMessages","threadsServiceMessagesIdsStorage","threadsToReplies","handleNewDialogs","newMaxSeenId","updateMap","processDialog","isDialogDefined","incrementMaxSeenId","handleNotifications","notificationsHandlePromise","notifyPeerToHandle","getNotifyPeerSettings","peerTypeNotifySettings","mentioned","notifyAboutMessage","fwdCount","onUpdateMessageId","onUpdateNewMessage","getMessagePeer","isLocalThreadUpdate","createMessageStorage","threadKey","getThreadKey","handleNewUpdateAfterReload","threadStorage","reply_to_peer_id","reply_to_mid","receiptMessage","checkPendingMessage","updateMessageRepliesIfNeeded","ignoreExisting","findSlice","firstSlice","forceUserOnline","handleNewMessage","inboxUnread","modifyCachedMentions","setDialogTopMessage","notifyPeer","onUpdateMessageReactions","recentReaction","previousReactions","previousRecentReactions","show_previews","peerReaction","pushBatchUpdate","batchUpdateReactions","setDialogToStateIfMessageIsTop","onUpdateDialogUnreadMark","unread_mark","onUpdateEditMessage","oldMessage","newMessage","handleEditedMessage","isTopMessage","clear_history","dispatchEditEvent","newReactions","grouped_id","onUpdateReadHistory","max_id","read_max_id","getObjectKeysAndSort","stillUnreadCount","still_unread_count","newUnreadMentionsCount","foundAffected","repliesKey","getReadMaxIdIfUnread","messageThreadId","getMessageThreadId","setCount","threadKeyPart","onUpdateReadMessagesContents","topMsgId","mids","findPeerIdByMids","media_unread","fixDialogUnreadMentionsIfNoMessage","onUpdateChannelAvailableMessages","availableMinId","available_min_id","onUpdateDeleteMessages","threadKeys","historyUpdated","handleDeletedMessages","threadsStorages","msgs","affected","onUpdateChannel","needDialog","getPeerActiveUsernames","onUpdateChannelReload","flushStoragesByPeerId","onUpdateChannelMessageViews","views","batchUpdateViews","onUpdateServiceNotification","popup","phone","onUpdatePinnedMessages","missingMessages","werePinned","getPinnedMessagesKey","hiddenPinnedMessages","onUpdateNotifySettings","onUpdateNewScheduledMessage","isScheduled","onUpdateDeleteScheduledMessages","onUpdateMessageExtendedMedia","extended_media","batch","toDispatch","getMessagesFromMap","previousResults","changedResults","reactionCount","previousReactionCount","_reactionCount","reactionsEqual","chosen_order","updateMessageID","updateNewDiscussionMessage","updateNewMessage","updateNewChannelMessage","updateDialogUnreadMark","updateEditMessage","updateEditChannelMessage","updateMessageReactions","updateReadChannelDiscussionInbox","updateReadChannelDiscussionOutbox","updateReadHistoryInbox","updateReadHistoryOutbox","updateReadChannelInbox","updateReadChannelOutbox","updateChannelReadMessagesContents","updateReadMessagesContents","updateChannelAvailableMessages","updateDeleteMessages","updateDeleteChannelMessages","updateChannel","updateChannelReload","updateChannelMessageViews","updateServiceNotification","updatePinnedMessages","updatePinnedChannelMessages","updateNotifySettings","updateNewScheduledMessage","updateDeleteScheduledMessages","updateMessageExtendedMedia","filterFunc","getScheduledMessagesStorage","webpage","appWebPagesManager","getCachedWebPage","drop","poll","appPollsManager","pollToMessages","startsWith","batchUpdatesDebounced","debounce","details","maxSeenMsgId","sendEntites","entity","invokeAfterMessageIsSent","tempId","callbackName","finalize","editMessage","is_scheduled","newMedia","noWebPage","handled","replyToMsgId","MAX_LENGTH","message_length_max","webPage","getPeerMigratedTo","generateOutgoingMessage","toggleError","onMessagesSendError","sentRequestOptions","afterMessageId","sendAs","sendAsPeerId","apiPromise","invokeApiAfter","clear_draft","update_stickersets_order","wrapMessageEntities","beforeMessageSending","sequential","noop","sendFile","attachType","apiFileName","fileType","File","isDocument","Blob","isPhoto","IMAGE_MIME_TYPES_SUPPORTED","strippedPhotoSize","strippedBytes","actionName","isVoiceMessage","waveform","isMedia","photoSize","sizes","objectURL","VIDEO_MIME_TYPES_SUPPORTED","videoAttribute","isRoundMessage","supports_streaming","noSound","thumbCacheContext","sentDeferred","spoiler","uploadingFileName","getFileNameForUpload","uploaded","uploadPromise","load","thumbUploadPromise","cancelPendingMessage","setTyping","addNotifyListener","progress","percents","floor","done","total","notifyAll","force_file","isGroupedItem","background","ret","sendAlbum","sendFileDetails","groupId","o","invoke","multiMedia","multi_media","originalInputMedia","inputSingleMedia","inputs","sendContact","contactPeerId","getContactMediaInput","pollId","savePoll","total_voters","getPoll","getPhoto","postAuthor","getPeer","signatures","generateFromId","post_author","generateFlags","generateReplyHeader","via_bot_id","replies","generateReplies","replyToTopId","originalMessage","forum_topic","reply_to_top_id","linked_chat_id","comments","replies_pts","isAnonymousSending","generateForwardHeader","isUserHidden","from_name","userFull","getCachedFullUser","private_forward_name","channel_post","saved_from_msg_id","saved_from_peer","generateFakeAvatarMessage","Number","MAX_SAFE_INTEGER","getUploadPromise","uploadFileName","admin_rights","anonymous","pendingData","fillConversations","chatHistoryStorage","maxSeenIdIncremented","hasPrepend","noIdsDialogs","setFolderId","setMessageUnreadByDialog","folderDialogs","dialogsLength","slicedDialogs","offset_peer","offsetPeerId","forwardMessages","config","overflowMids","forwarded_count_max","dropCaptions","dropAuthor","newMids","newMessages","replyToMid","replyToMessageIdx","newReplyToMid","getStickerEffectThumb","nopremium","group","from_peer","to_peer","with_my_score","withMyScore","drop_author","drop_media_captions","generateEmptyMessage","getMessagesStorageByKey","s","getMessagesStorage","getMessageById","cantForwardDeleteMids","cantForward","cantDelete","canForward","canDeleteMessage","reloadConversationOrTopic","inputDialogPeer","getInputDialogPeerById","reloadConversationsPromise","inputDialogPeers","currentState","doFlushHistory","just_clear","revoke","affectedHistory","flushHistory","justClear","getHistory","historyResult","getTypingKey","ss","hidePinnedMessages","getPinnedMessage","getSearch","inputFilter","getPinnedMessagesCount","getPinnedMessagesMaxId","updatePinnedMessage","unpin","pm_oneside","unpinAllMessages","unpinAll","getAlbumText","getGroupsFirstMessage","minMid","getMidsByAlbum","groupedId","getMessagesByAlbum","getMidsByMessage","filterMessages","appMessagesIdsManager","saveMessage","isMessage","replyTo","overwriting","msgId","savedFromPeerId","savedFromMid","savedFrom","mediaContext","unsupported","originalDoc","messageKey","getMessageKeyForPendingWebPage","saveWebPage","appWebDocsManager","saveWebDocument","extendedMediaMedia","totalEntities","migrateFrom","migrateTo","video_sizes","appGroupCallsManager","migrateChecks","getFirstMessageToEdit","goodMessage","myPeerId","canEditMessage","apiEntities","myEntities","parseEntities","mergeEntities","reportMessages","editPeerFolders","getDialogPeer","markDialogUnread","read","fromChat","canMessageBeEdited","kind","goodMedias","edit_time_limit","getReplyKeyboard","messageReplyMarkup","lastReplyMarkup","selective","maxOutId","single_use","getSearchStorage","getSearchCounters","canCache","isPeerRestricted","func","filterMessagesByInputFilterFromStorage","_storage","filterMessagesByInputFilter","nextRate","backLimit","offset_id_offset","next_rate","foundMsgs","min_date","max_date","add_offset","min_id","offsetId","offsetMessage","offset_rate","searchResult","foundCount","subscribeRepliesThread","getDiscussionMessage","generateThreadServiceStartMessage","maxMessageId","serviceStartMessage","is_single","getThreadServiceMessageId","getMessageWithReplies","newMaxId","unsetEnd","newDialogsHandlePromise","deleteMessages","localMessageIds","creator","delete_messages","affectedMessages","readHistory","triedToReadMaxId","readPromise","getPeerString","readAllHistory","getUnreadMentionsKey","slicedArray","fixUnreadMentionsCountIfNeeded","goToNextMention","loadNextPromise","loadNextMentions","last","getUnreadMentions","mergeHistoryResult","minId","messagesMessages","readMessages","msgIds","getHistoryStorageTransferable","historySerialized","toJSON","inputNotifyPeer","getInputNotifyPeerById","ignorePeerId","getNotifyPeerTypeSettings","getNotifySettings","isMessageIsTopMessage","threadMessage","broadcastEventName","pendingMessage","finalizePendingMessage","mutePeer","validatePeerSettings","muteUntil","mute_until","togglePeerMute","mute","canSendToPeer","canSendToUser","finalMessage","tempMessage","finalizePendingMessageCallbacks","newPhoto","newDoc","newPhotoSize","oldCacheContext","getPhotoDownloadOptions","thumbSize","polls","handleReleasingMessage","getMessageReactionsListAndReadParticipants","skipReadParticipants","skipReactionsList","emptyMessageReactionsList","canViewMessageReadParticipants","getMessageReadParticipants","appReactionsManager","getMessageReactionsList","messageReactionsList","readParticipantsPeerIds","filteredReadParticipants","readPeerId","reactionsCount","readParticipants","appConfig","getAppConfig","chat_read_mark_size_threshold","chat_read_mark_expire_period","incrementMessageViews","increment","chatPeerIds","idleStartTime","getScheduledMessageByPeer","getScheduledMessages","sendScheduledMessages","deleteScheduledMessages","getMessageWithCommentReplies","isFetchIntervalNeeded","getNewHistory","isBottomEnd","getEnds","offsetIdOffset","haveSlice","sliceMe","fulfilled","fillHistoryStorage","constructSlice","isHistoryResultEnd","topWasMeantToLoad","wasMaxId","requestHistory","deleteSlice","oldestMessage","foundSlice","_historyResult","fetchSingleMessages","fetchSingleMessagesPromise","requestPromises","getMessagesResult","getExtendedMedia","toRequest","fetchMessageReplyTo","replyToPeerId","typing","smth","deleteWebPageFromPending","updatePollToMessage","groupedStorage","albums","dispatchAlbumEdit","deletedMids","noforwards","noForwards","getElementCallback","newMap","peerIdStr","saveDefaultSendAs","convertInputKeyToKey","inputKey","AppNotificationsManager","peerSettings","notifyUsers","notifyChats","notifyBroadcasts","notifyForumTopic","checkMuteUntil","checkMuteUntilTimeout","closestMuteUntil","peerNotifySettings","typeKey","checkMuteUntilThrottled","throttle","isPeerType","notifySettings","getNotifyPeerTypePromise","getContactSignUpNotification","notifyContactsSignUp","setContactSignUpNotification","getPeerKey","getPeerMuted","getPeerLocalSettings","n","peerKey","typeNotifySettings","AppPeersManager","canPinMessage","getPeerPhoto","getUserString","getRestrictionReasonText","restriction_reason","getUserInputPeer","getUserSearchText","getDialogType","getDeleteButtonText","AppPhotosManager","photos","oldPhoto","Infinity","getUserPhotos","inputUser","photosResult","photoIds","photoId","AppPollsManager","updateMessagePoll","poll_id","saveResults","chosenIndexes","answer","chosen","getInputMediaPoll","correctAnswers","solution","solutionEntities","correct_answers","solution_entities","sendVote","optionIds","answers","option","getResults","getVotes","votesList","stopPoll","newPoll","AppPrivacyManager","privacy","updatePrivacy","rules","setPrivacy","privacyRules","inputRule","rule","getPrivacy","privacyKey","getGlobalPrivacySettings","setGlobalPrivacySettings","PEER_FULL_TTL","AppProfileManager","usersFull","chatsFull","fullExpiration","onUpdateUserTyping","getTypingsKey","typingsInPeer","t","cancelAction","getChatFull","onUpdatePeerBlocked","blocked","updateChatParticipants","updateChatParticipantAdd","_participants","updateChatParticipantDelete","updateUserTyping","updateChatUserTyping","updateChannelUserTyping","updatePeerBlocked","fullChat","updated","call_active","hasChatPhoto","chat_photo","refreshFullPeer","invalidateChannelParticipants","usersUserFull","full_user","profile_photo","botInfo","bot_info","referenceContext","description_document","description_photo","getProfileByPeerId","getCachedProfileByPeerId","getFullPhoto","profile","full_chat","getChatInviteLink","exported_invite","link","exportedInvite","getChannelParticipants","broadcast","getChannelParticipant","channelParticipant","fullChannel","processError","getMentions","processUserIds","ratingMap","cP","updateProfile","saveApiUser","uploadProfilePhoto","updateResult","strippedThumb","stripped_thumb","deletePhotos","deletedList","verifyParticipantForOnlineCount","reduceParticipantsForOnlineCount","getOnlines","chatInfo","channelParticipants","onlines","getPeerTypings","callbackifyAll","SAVE_DOC_KEYS","REFERENCE_CONTEXT","AppReactionsManager","availableReactions","getAvailableReactions","sendReactionPromises","lastSendingTimes","availableReaction","around_animation","static_icon","appear_animation","center_icon","messagesAvailableReactions","getActiveAvailableReactions","inactive","getAvailableReactionsForPeer","activeAvailableReactions","unshiftQuickReaction","getQuickReaction","quickReaction","chatAvailableReactions","filteredChatAvailableReactions","unshiftQuickReactionInner","getAvailableReactionsByMessage","isReactionActive","reactions_default","getReactionCached","getReaction","getMessagesReactions","setDefaultReaction","sendReaction","lastSendingTimeKey","unsetReactionCount","canSeeList","can_see_list","chosenReactions","unsetReactions","chosenReactionIdx","chosenReactionCount","chosenReactionsLength","reactionCountIdx","id1","id2","promiseKey","editMessageUpdateIdx","editMessageUpdate","LOCAL_IDS","EMOJI","EMOJI_ANIMATIONS","PREMIUM_GIFTS","GENERIC_ANIMATIONS","DEFAULT_STATUSES","DEFAULT_TOPIC_ICONS","LOCAL_IDS_SET","AppStickersManager","processAllStickersResult","allStickers","sets","stickerSet","videos","getStickerSetPromises","getStickersByEmoticonsPromises","sounds","getAnimatedEmojiStickerSet","getGreetingStickersPromise","getGreetingStickersTimeout","getGreetingSticker","onStickersUpdated","updateNewStickerSet","saveStickerSet","updateRecentStickers","updateFavedStickers","updateMoveStickerSetToTop","stickers","getFavedStickersStickers","getRecentStickersStickers","justPreload","getStickersByEmoticon","greetingStickers","random","saveStickers","canUseStickerSetCache","useCache","refreshTime","getStickerSet","cachedSet","getStickerSetInput","saveById","getLocalStickerSet","animations","getAnimatedEmojiSoundsPromise","emojies_sounds","sound","bytesStr","atob","file_reference_base64","charCodeAt","this_dc","getRecentStickers","recentStickers","saveRecentSticker","unsave","_doc","docEmoticon","faved","cleanEmoji","getAnimatedEmojiSticker","isAnimation","packs","getAnimatedEmojiSoundDocument","preloadAnimatedEmojiSticker","preloadEmojiPromise","preloadAnimatedEmojiStickerAnimation","animation","preloadSticker","isPremiumEffect","video_thumbs","newSet","setToCache","needSave","installed_date","getStickerSetThumbDownloadOptions","thumb_dc_id","isAnimated","mimeType","getFeaturedStickers","covered","getPromoPremiumStickers","getPremiumStickers","getFavedStickers","favedStickers","getFavedStickersLimit","faveSticker","unfave","toggleStickerSet","archived","toggleStickerSets","searchStickerSets","excludeFeatured","exclude_featured","foundSaved","cover","getAllStickers","preloadStickerSets","includeOurStickers","messagesStickers","installedSets","foundStickers","cachedStickersAnimated","cachedStickersStatic","iteratePacks","clearRecentStickers","AppUsersManager","usernames","getTopPeersPromises","contactsIndex","createSearchIndex","contactsFillPromise","contactsList","updatedContactsList","updateUsersStatuses","timestampNow","updateUserStatus","setInterval","expires","was_online","setUserToStateIfNeeded","updateUserName","contactsListCachedTime","contact","mutual_contact","pushContact","recentSearch","onContactsModified","fromServer","pushRecentSearch","clearRecentSearch","resolveUsername","resolvedPeer","processResolvedPeer","resolvePhone","popContact","getContacts","includeSaved","sortBy","_contactsList","userId1","userId2","sortName1","sortName","sortName2","localeCompare","status1","getUserStatusForSort","myUserId","testSelfSearch","getContactsPeerIds","toggleBlock","block","apiUsers","cleanedUsernames","cleanUsername","searchUsername","oldPeer","oldUser","fullName","wasContact","newContact","onContactUpdated","checkPremium","isUserOnlineVisible","getUserStatus","isRegularUser","getUserPhone","isAnonymous","fragment_prefixes","isAttachMenuBot","bot_attach_menu","support","isNonContactUser","eventTimestamp","importContact","importContacts","phones","inputContacts","j","client_id","importedContactsResult","imported","importedContact","topPeersCache","cachedTime","categories","getBlocked","contactsBlocked","getLocated","self_expires","searchContacts","my_results","curIsContact","setUserStatus","offline","updateMyOnlineStatus","addContact","addPhonePrivacyException","add_phone_privacy_exception","deleteContacts","photoTypeSet","AppWebPagesManager","webpages","pendingWebPages","updateWebPage","apiWebPage","oldWebPage","isUpdated","siteName","site_name","shortTitle","author","pendingSet","getWebPage","readBlobAsArrayBuffer","readBlobAs","fileNameRFC","escape","DownloadWriter","serviceMessagePort","getServiceMessagePort","write","chunk","saveToStorage","DownloadStorage","getFile","prepareWriting","headers","cancel","getWriter","MIN_PART_SIZE","IGNORE_ERRORS","ApiFileManager","cacheStorage","downloadStorage","downloadPromises","uploadPromises","downloadPulls","downloadActives","refreshReferencePromises","maxUploadParts","maxDownloadParts","uncompressTGS","uncompressTGV","svgIndex","__","fixFirefoxSvg","TextEncoder","convertWebp","convertOpus","webFileDcId","webfile_dc_id","upload_max_fileparts_premium","upload_max_fileparts_default","downloadRequest","activeDelta","downloadPull","downloadCheck","downloadLimit","setQueueId","getFileStorage","cancelDownload","canceled","requestWebFilePart","checkCancel","fileDownload","getDelta","checkedReference","getLimitPart","isUpload","maxParts","maxPartSize","inputFileLocation","isDownloading","getDownload","getUpload","getConvertMethod","IS_OPUS_SUPPORTED","allocateDeferredPromises","startOffset","delayed","writeDeferred","writePromise","originalMimeType","convertMethod","getDownloadFileNameFromOptions","cacheFileName","errorHandler","prepared","cachePrepared","downloadPrepared","possibleSize","_errorHandler","writer","truncate","downloadFileName","readBlobAsUint8Array","isWebFile","requestPart","dispatchProgress","throttledDispatchProgress","superpuper","isFinal","getParts","replaceParts","processedResult","getDownloadMediaDetails","downloadMediaURL","downloadMediaVoid","fileSize","isBigFile","partSize","totalParts","fileId","resultInputFile","parts","md5_checksum","resolved","it","_part","doneParts","file_id","file_part","file_total_parts","fileUpload","generator","ApiManagerMethods","apiPromisesSingleProcess","apiPromisesSingle","apiPromisesCacheable","afterMessageIdTemp","setUserAuth","prepareTempMessageId","queryJSON","newResult","cacheKey","oldPromise","getNewPromise","newPromise","ignore_restriction_reasons","pin","folderPin","bio","topicPin","ApiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","baseDcId","afterMessageTempIds","changeTransportType","updateConfig","iterateNetworkers","getTransportType","connections","dcs","array","oldTransportType","oldObject","oldGetKey","newGetKey","info","changeNetworkerTransport","getBaseDcId","sessionStorage","setBaseDcId","userAuth","dcID","user_auth","wasDcId","getNetworker","setOnDrainIfNeeded","dc","logOut","loggingOut","storageKeys","storageResult","logoutPromises","ignoreErrors","toggleStorages","generateNetworkerGetKey","networkers","maxNetworkers","found","isOnline","ak","authKeyHex","serverSaltHex","authKey","bytesFromHex","authKeyId","serverSalt","authorizer","_error","newTransportType","removeTransport","stack","getNetworkerVoid","oldTransport","changeTransport","onNetworkerDrain","onDrain","removeNetworker","isFileNetworker","canRelease","setDrainTimeout","updatesProcessor","cachedNetworker","startTime","isStopped","performRequest","wrapApiCall","exportResolve","exportReject","exportedAuth","newDcId","unsetConnectionInited","rawError","waitTime","floodMaxTimeout","attachPromise","originalError","PeersStorage","neededPeers","singlePeerMap","thumbFullSize","ThumbsStorage","thumbsCache","intToUint","ulongFromInts","high","low","shiftLeft","safeBigInt","ulongBigInt","pow","longBigInt","divide","bigIntFromBytes","base","boolFalse","predicate","boolTrue","vector","gzipPacked","sliceMethod","TLSerialization","mtproto","startMaxLength","createBuffer","ArrayBuffer","intView","Int32Array","byteView","getArray","resultBuffer","resultInt32","subarray","getBuffer","getBytes","typed","resultArray","getOffset","checkLength","needBytes","previousBuffer","previousArray","writeInt","field","storeInt","storeBool","storeLongP","iHigh","iLow","storeLong","sLong","storeIntBytes","_bigInt","bigInt","isNegative","quotient","remainder","divmod","toJSNumber","storeDouble","Float64Array","storeString","sUTF8","unescape","storeBytes","bits","storeRawBytes","storeMethod","methodName","methodData","methods","m","flagsOffsets","param","condType","fieldBit","storeObject","paramName","itemType","schema","isBare","constructorData","TLDeserialization","readInt","fetchInt","fetchDouble","doubleView","fetchLong","ulong","greater","minus","greaterOrEquals","abs","fetchBool","fetchObject","fetchString","String","fromCharCode","decodeURIComponent","fetchBytes","fetchIntBytes","fetchRawBytes","fetchVector","fallback","checkType","constructorCmp","uncompressed","constructorsIndex","schemaFallback","int1","int2","overrideKey","isCond","formatJSONValue","jsonValue","objectValues","objectValue","setOffset","addPadding","blockSize","zeroes","blockSizeAsTotalLength","needPadding","padding","bufferConcats","delays","disconnectDelayMin","disconnectDelayMax","pingInterval","pingMaxTime","connectionTimeout","RESEND_OPTIONS","noSchedule","notContentRelated","invokeAfterMsgConstructor","networkerTempId","MTPNetworker","lastServerMessages","sentMessages","pendingMessages","pendingAcks","pendingResendReq","nextReq","checkConnectionPeriod","lastResponseTime","activeRequests","sendPingDelayDisconnect","pingDelayDisconnectDeferred","lastPingTime","disconnectDelay","round","timeoutTime","lastPingStartTime","pingId","lastPingDelayDisconnectId","wrapMtpCall","ping_id","disconnect_delay","rejectTimeout","elapsedTime","checkLongPoll","isClean","longPollPending","sleepAfter","sendLongPoll","checkConnection","clearCheckConnectionTimeout","serializer","pingMessage","generateId","seq_no","generateSeqNo","sendEncryptedRequest","toggleOffline","checkConnectionTimeout","authKeyUint8","convertToUint8Array","isFileUpload","isFileDownload","updateSession","seqNo","prevSessionId","updateSentMessage","sentMessageId","sentMessage","container","inner","innerSentMessageId","innerSentMessage","pushMessage","wrapMtpMessage","connectionInited","invokeWithLayer","initConnection","resultType","isAPI","nextReqTimeout","longPollInterval","clearPingDelayDisconnect","forceReconnectTimeout","sendingLongPoll","max_delay","wait_after","max_wait","noResponse","longPoll","delay","checkConnectionRetryAt","scheduleRequest","handleSentEncryptedRequestHTTP","noResponseMsgs","sqrt","pushResend","shouldResolve","onDrainTimeout","willChange","onConnectionStatusChange","innerMsgId","acked","getMsgKey","dataWithPadding","x","msgKeyLargePlain","msgKeyLarge","getAesKeyIv","msgKey","sha2aText","sha2bText","aesKey","aesIv","sha2a","sha2b","akStopped","performScheduledRequest","ackMsgIds","msg_ids","pendingResendReqLength","outMessage","messagesByteLen","hasApiCall","hasHttpWait","lengthOverflow","compare","messageByteLength","generateContainerMessage","messageWithBody","innerMessages","getEncryptedMessage","keyIv","getDecryptedMessage","encryptedData","getEncryptedOutput","dataBuffer","paddingLength","encryptedResult","requestData","baseError","responseBuffer","deserializer","bytesCmp","calcMsgKey","totalLength","messageBodyLength","messageBody","mt_message","seqno","mt_rpc_result","req_msg_id","applyServerSalt","newServerSalt","toArray","ackMessage","reqResend","notEmpty","processMessageAck","error_message","error_code","msg","applyServerTime","serverTime","shiftRight","innerMessage","new_server_salt","bad_msg_id","changedTimeOffset","badMessage","first_msg_id","server_salt","answer_msg_id","lastResendReq","lastResend","pendingResend","reqMsgId","badMsgId","pos","NetworkerFactory","startAll","stoppedNetworkers","stopAll","setLanguage","testPublicKeysHex","modulus","exponent","publisKeysHex","publicKeysParsed","preparePromise","prepare","keyParsed","RSAPublicKey","fingerprintBytes","fingerprints","fingerprintHex","fill","foundKey","fingerprint","bytesXor","bytes1","bytes2","Authorizer","sendPlainRequest","requestArray","requestLength","headerArray","errorCode","auth_key_id","msg_len","sendReqPQ","nonce","rsaKeysManager","serverNonce","server_nonce","pq","server_public_key_fingerprints","publicKey","pAndQ","sendReqDhParams","newNonce","p_q_inner_data_dc","new_nonce","pQInnerDataSerialization","dataPadReversed","keyAesEncrypted","tempKey","dataWithHash","aesEncrypted","keyAesEncryptedBigInt","publicKeyModulusBigInt","getKeyAesEncrypted","req_DH_params","public_key_fingerprint","encrypted_data","requestBytes","newNonceHash","new_nonce_hash","decryptServerDhDataAnswer","encrypted_answer","sendSetClientDhParams","encryptedAnswer","localTime","tmpAesKey","tmpAesIv","answerWithHash","answerWithPadding","g","dhPrime","dh_prime","gA","g_a","server_time","retry","verifyDhParams","dhPrimeHex","gABigInt","dhPrimeBigInt","subtract","twoPow","gBytes","gB","retry_id","authKeyHash","authKeyAux","newNonceHash1","new_nonce_hash1","newNonceHash2","new_nonce_hash2","newNonceHash3","new_nonce_hash3","getTransportTypePromise","_try","TimeManager","lastMessageId","timeOffset","timeTicks","newTimeOffset","changed","server_time_offset","AppWebDocsManager","webDocument","AppPaymentsManager","getInputInvoiceBySlug","getInputInvoiceByPeerId","getPaymentForm","invoice","paymentForm","getPaymentReceipt","validateRequestedInfo","sendPaymentForm","formId","requestedInfoId","shippingOptionId","credentials","tipAmount","form_id","requested_info_id","shipping_option_id","tip_amount","clearSavedInfo","AppAttachMenuBotsManager","attachMenuBots","attachMenuBotsArr","onUpdateAttachMenuBots","getAttachMenuBots","updateAttachMenuBots","saveAttachMenuBot","attachMenuBot","bot_id","icon","getAttachMenuBotIcon","saveAttachMenuBots","getAttachMenuBotCached","requestWebView","fromBotMenu","themeParams","from_bot_menu","theme_params","prolongWebView","AppSeamlessLoginManager","requestUrlAuth","buttonId","button_id","urlAuthResult","acceptUrlAuth","writeAllowed","write_allowed","getWebAuthorizations","webAuthorizations","authorizations","resetWebAuthorization","resetWebAuthorizations","appManagersManager","cryptoWorkersURLs","cryptoPortsAttached","cryptoPortPromise","getManagers","manager","apply","ports","originalUrl","newURLs","createManagers","appAvatarsManager","appCallsManager","appPrivacyManager","appInlineBotsManager","passwordManager","appPaymentsManager","appSeamlessLoginManager","_serviceMessagePort","_isServiceWorkerOnline","pushedKeys","clearWrite","invokeExceptSource","serviceWorkerOnline","serviceWorkerPort","detachPort","attachPort","messagePort","onConnect","onDisconnect","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","listenMessagePort","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","MAX_FILE_SAVE_SIZE","THUMB_TYPE_FULL","ATTACH_MENU_BOT_ICON_NAME","GENERAL_TOPIC_ID","T_ME_PREFIXES","FOLDER_ID_ALL","FOLDER_ID_ARCHIVE","REAL_FOLDERS","START_LOCAL_ID","ALPHA_CHARS_REG_EXP","ALPHA_NUMERIC_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","USERNAME_REG_EXP","BOT_COMMAND_REG_EXP","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","encodeEmoji","emojiText","unicodeSurrogates","points","char","previous","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","rawEmoji","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","__webpack_exports__","O","chunkIds","fn","priority","notFulfilled","getter","__esModule","definition","enumerable","chunkId","miniCssF","globalThis","Function","prop","Symbol","toStringTag","nmd","paths","children","scriptUrl","importScripts","currentScript","src","scripts","getElementsByTagName","oldGetScript","oldLoadScript","queryMap","countMap","retries","realSrc","cacheBust","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""} \ No newline at end of file diff --git a/public/mtproto.worker.e39165afafd615d2ebc1.chunk.js b/public/mtproto.worker.e39165afafd615d2ebc1.chunk.js deleted file mode 100644 index f05d17219..000000000 --- a/public/mtproto.worker.e39165afafd615d2ebc1.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(()=>{"use strict";var e,t,a={410:(e,t,a)=>{a.d(t,{GO:()=>n,ZP:()=>i});const s=a(1267).Z.debug,n="undefined"!=typeof window?window:self,i=s},3447:(e,t,a)=>{a.d(t,{Z:()=>i});const s={14:{"1f6dd":4867,"1f6de":4916,"1f6df":4923,"1f7f0":62832,"1f979":183,"1f9cc":1557,"1fa7b":61332,"1fa7c":61330,"1faa9":51093,"1faaa":61364,"1faab":61189,"1faac":51085,"1fab7":2651,"1fab8":2631,"1fab9":2672,"1faba":2673,"1fac3":1520,"1fac4":1521,"1fac5":1505,"1fad7":3793,"1fad8":3707,"1fad9":3804,"1fae0":111,"1fae1":136,"1fae2":132,"1fae3":133,"1fae4":174,"1fae5":142,"1fae6":1385,"1fae7":61353,"1faf0":1341,"1faf1":1332,"1faf2":1333,"1faf3":1334,"1faf4":1335,"1faf5":1351,"1faf6":1360,"1faf1-1f3fb-200d-1faf2-1f3fc":0,"1faf1-1f3fb-200d-1faf2-1f3fd":0,"1faf1-1f3fb-200d-1faf2-1f3fe":0,"1faf1-1f3fb-200d-1faf2-1f3ff":0,"1faf1-1f3fc-200d-1faf2-1f3fb":0,"1faf1-1f3fc-200d-1faf2-1f3fd":0,"1faf1-1f3fc-200d-1faf2-1f3fe":0,"1faf1-1f3fc-200d-1faf2-1f3ff":0,"1faf1-1f3fd-200d-1faf2-1f3fb":0,"1faf1-1f3fd-200d-1faf2-1f3fc":0,"1faf1-1f3fd-200d-1faf2-1f3fe":0,"1faf1-1f3fd-200d-1faf2-1f3ff":0,"1faf1-1f3fe-200d-1faf2-1f3fb":0,"1faf1-1f3fe-200d-1faf2-1f3fc":0,"1faf1-1f3fe-200d-1faf2-1f3fd":0,"1faf1-1f3fe-200d-1faf2-1f3ff":0,"1faf1-1f3ff-200d-1faf2-1f3fb":0,"1faf1-1f3ff-200d-1faf2-1f3fc":0,"1faf1-1f3ff-200d-1faf2-1f3fd":0,"1faf1-1f3ff-200d-1faf2-1f3fe":0,"1fac3-1f3fb":0,"1fac3-1f3fc":0,"1fac3-1f3fd":0,"1fac3-1f3fe":0,"1fac3-1f3ff":0,"1fac4-1f3fb":0,"1fac4-1f3fc":0,"1fac4-1f3fd":0,"1fac4-1f3fe":0,"1fac4-1f3ff":0,"1fac5-1f3fb":0,"1fac5-1f3fc":0,"1fac5-1f3fd":0,"1fac5-1f3fe":0,"1fac5-1f3ff":0,"1faf0-1f3fb":0,"1faf0-1f3fc":0,"1faf0-1f3fd":0,"1faf0-1f3fe":0,"1faf0-1f3ff":0,"1faf1-1f3fb":0,"1faf1-1f3fc":0,"1faf1-1f3fd":0,"1faf1-1f3fe":0,"1faf1-1f3ff":0,"1faf2-1f3fb":0,"1faf2-1f3fc":0,"1faf2-1f3fd":0,"1faf2-1f3fe":0,"1faf2-1f3ff":0,"1faf3-1f3fb":0,"1faf3-1f3fc":0,"1faf3-1f3fd":0,"1faf3-1f3fe":0,"1faf3-1f3ff":0,"1faf4-1f3fb":0,"1faf4-1f3fc":0,"1faf4-1f3fd":0,"1faf4-1f3fe":0,"1faf4-1f3ff":0,"1faf5-1f3fb":0,"1faf5-1f3fc":0,"1faf5-1f3fd":0,"1faf5-1f3fe":0,"1faf5-1f3ff":0,"1faf6-1f3fb":0,"1faf6-1f3fc":0,"1faf6-1f3fd":0,"1faf6-1f3fe":0,"1faf6-1f3ff":0},"":{2049:62835,2122:62863,2139:62888,2194:62764,2195:62763,2196:62762,2197:62756,2198:62758,2199:62760,2328:61194,2600:4990,2601:4998,2602:41013,2603:41018,2604:41020,2611:62851,2614:41014,2615:3781,2618:2667,2620:1106,2622:62753,2623:62754,2626:62783,2638:62780,2639:177,2648:62788,2649:62789,2650:62796,2651:62797,2652:62798,2653:62799,2660:51095,2663:51098,2665:51096,2666:51097,2668:4865,2692:61297,2693:4922,2694:61300,2696:61311,2697:61319,2699:61309,2702:61284,2705:62850,2708:4931,2709:61245,2712:61259,2714:62852,2716:62828,2721:62779,2728:51029,2733:62858,2734:62859,2744:41017,2747:62860,2753:62836,2754:62837,2755:62838,2757:62839,2763:1137,2764:1141,2795:62829,2796:62830,2797:62831,2934:62767,2935:62768,3030:62840,3297:62912,3299:62913,"0023-20e3":62864,"002a-20e3":62865,"0030-20e3":62866,"0031-20e3":62867,"0032-20e3":62868,"0033-20e3":62869,"0034-20e3":62870,"0035-20e3":62871,"0036-20e3":62872,"0037-20e3":62873,"0038-20e3":62874,"0039-20e3":62875,"00a9":62861,"00ae":62862,"1f004":51101,"1f0cf":51100,"1f170":62882,"1f171":62884,"1f17e":62893,"1f17f":62895,"1f18e":62883,"1f191":62885,"1f192":62886,"1f193":62887,"1f194":62889,"1f195":62891,"1f196":62892,"1f197":62894,"1f198":62896,"1f199":62897,"1f19a":62898,"1f1e6-1f1e8":71594,"1f1e6-1f1e9":71595,"1f1e6-1f1ea":71596,"1f1e6-1f1eb":71597,"1f1e6-1f1ec":71598,"1f1e6-1f1ee":71599,"1f1e6-1f1f1":71600,"1f1e6-1f1f2":71601,"1f1e6-1f1f4":71602,"1f1e6-1f1f6":71603,"1f1e6-1f1f7":71604,"1f1e6-1f1f8":71605,"1f1e6-1f1f9":71606,"1f1e6-1f1fa":71607,"1f1e6-1f1fc":71608,"1f1e6-1f1fd":71609,"1f1e6-1f1ff":71610,"1f1e7-1f1e6":71611,"1f1e7-1f1e7":71612,"1f1e7-1f1e9":71613,"1f1e7-1f1ea":71614,"1f1e7-1f1eb":71615,"1f1e7-1f1ec":71616,"1f1e7-1f1ed":71617,"1f1e7-1f1ee":71618,"1f1e7-1f1ef":71619,"1f1e7-1f1f1":71620,"1f1e7-1f1f2":71621,"1f1e7-1f1f3":71622,"1f1e7-1f1f4":71623,"1f1e7-1f1f6":71624,"1f1e7-1f1f7":71625,"1f1e7-1f1f8":71626,"1f1e7-1f1f9":71627,"1f1e7-1f1fb":71628,"1f1e7-1f1fc":71629,"1f1e7-1f1fe":71630,"1f1e7-1f1ff":71631,"1f1e8-1f1e6":71632,"1f1e8-1f1e8":71633,"1f1e8-1f1e9":71634,"1f1e8-1f1eb":71635,"1f1e8-1f1ec":71636,"1f1e8-1f1ed":71637,"1f1e8-1f1ee":71638,"1f1e8-1f1f0":71639,"1f1e8-1f1f1":71640,"1f1e8-1f1f2":71641,"1f1e8-1f1f3":71642,"1f1e8-1f1f4":71643,"1f1e8-1f1f5":71644,"1f1e8-1f1f7":71645,"1f1e8-1f1fa":71646,"1f1e8-1f1fb":71647,"1f1e8-1f1fc":71648,"1f1e8-1f1fd":71649,"1f1e8-1f1fe":71650,"1f1e8-1f1ff":71651,"1f1e9-1f1ea":71652,"1f1e9-1f1ec":71653,"1f1e9-1f1ef":71654,"1f1e9-1f1f0":71655,"1f1e9-1f1f2":71656,"1f1e9-1f1f4":71657,"1f1e9-1f1ff":71658,"1f1ea-1f1e6":71659,"1f1ea-1f1e8":71660,"1f1ea-1f1ea":71661,"1f1ea-1f1ec":71662,"1f1ea-1f1ed":71663,"1f1ea-1f1f7":71664,"1f1ea-1f1f8":71665,"1f1ea-1f1f9":71666,"1f1ea-1f1fa":71667,"1f1eb-1f1ee":71668,"1f1eb-1f1ef":71669,"1f1eb-1f1f0":71670,"1f1eb-1f1f2":71671,"1f1eb-1f1f4":71672,"1f1eb-1f1f7":71673,"1f1ec-1f1e6":71674,"1f1ec-1f1e7":71675,"1f1ec-1f1e9":71676,"1f1ec-1f1ea":71677,"1f1ec-1f1eb":71678,"1f1ec-1f1ec":71679,"1f1ec-1f1ed":71680,"1f1ec-1f1ee":71681,"1f1ec-1f1f1":71682,"1f1ec-1f1f2":71683,"1f1ec-1f1f3":71684,"1f1ec-1f1f5":71685,"1f1ec-1f1f6":71686,"1f1ec-1f1f7":71687,"1f1ec-1f1f8":71688,"1f1ec-1f1f9":71689,"1f1ec-1f1fa":71690,"1f1ec-1f1fc":71691,"1f1ec-1f1fe":71692,"1f1ed-1f1f0":71693,"1f1ed-1f1f2":71694,"1f1ed-1f1f3":71695,"1f1ed-1f1f7":71696,"1f1ed-1f1f9":71697,"1f1ed-1f1fa":71698,"1f1ee-1f1e8":71699,"1f1ee-1f1e9":71700,"1f1ee-1f1ea":71701,"1f1ee-1f1f1":71702,"1f1ee-1f1f2":71703,"1f1ee-1f1f3":71704,"1f1ee-1f1f4":71705,"1f1ee-1f1f6":71706,"1f1ee-1f1f7":71707,"1f1ee-1f1f8":71708,"1f1ee-1f1f9":71709,"1f1ef-1f1ea":71710,"1f1ef-1f1f2":71711,"1f1ef-1f1f4":71712,"1f1ef-1f1f5":71713,"1f1f0-1f1ea":71714,"1f1f0-1f1ec":71715,"1f1f0-1f1ed":71716,"1f1f0-1f1ee":71717,"1f1f0-1f1f2":71718,"1f1f0-1f1f3":71719,"1f1f0-1f1f5":71720,"1f1f0-1f1f7":71721,"1f1f0-1f1fc":71722,"1f1f0-1f1fe":71723,"1f1f0-1f1ff":71724,"1f1f1-1f1e6":71725,"1f1f1-1f1e7":71726,"1f1f1-1f1e8":71727,"1f1f1-1f1ee":71728,"1f1f1-1f1f0":71729,"1f1f1-1f1f7":71730,"1f1f1-1f1f8":71731,"1f1f1-1f1f9":71732,"1f1f1-1f1fa":71733,"1f1f1-1f1fb":71734,"1f1f1-1f1fe":71735,"1f1f2-1f1e6":71736,"1f1f2-1f1e8":71737,"1f1f2-1f1e9":71738,"1f1f2-1f1ea":71739,"1f1f2-1f1eb":71740,"1f1f2-1f1ec":71741,"1f1f2-1f1ed":71742,"1f1f2-1f1f0":71743,"1f1f2-1f1f1":71744,"1f1f2-1f1f2":71745,"1f1f2-1f1f3":71746,"1f1f2-1f1f4":71747,"1f1f2-1f1f5":71748,"1f1f2-1f1f6":71749,"1f1f2-1f1f7":71750,"1f1f2-1f1f8":71751,"1f1f2-1f1f9":71752,"1f1f2-1f1fa":71753,"1f1f2-1f1fb":71754,"1f1f2-1f1fc":71755,"1f1f2-1f1fd":71756,"1f1f2-1f1fe":71757,"1f1f2-1f1ff":71758,"1f1f3-1f1e6":71759,"1f1f3-1f1e8":71760,"1f1f3-1f1ea":71761,"1f1f3-1f1eb":71762,"1f1f3-1f1ec":71763,"1f1f3-1f1ee":71764,"1f1f3-1f1f1":71765,"1f1f3-1f1f4":71766,"1f1f3-1f1f5":71767,"1f1f3-1f1f7":71768,"1f1f3-1f1fa":71769,"1f1f3-1f1ff":71770,"1f1f4-1f1f2":71771,"1f1f5-1f1e6":71772,"1f1f5-1f1ea":71773,"1f1f5-1f1eb":71774,"1f1f5-1f1ec":71775,"1f1f5-1f1ed":71776,"1f1f5-1f1f0":71777,"1f1f5-1f1f1":71778,"1f1f5-1f1f2":71779,"1f1f5-1f1f3":71780,"1f1f5-1f1f7":71781,"1f1f5-1f1f8":71782,"1f1f5-1f1f9":71783,"1f1f5-1f1fc":71784,"1f1f5-1f1fe":71785,"1f1f6-1f1e6":71786,"1f1f7-1f1ea":71787,"1f1f7-1f1f4":71788,"1f1f7-1f1f8":71789,"1f1f7-1f1fa":71790,"1f1f7-1f1fc":71791,"1f1f8-1f1e6":71792,"1f1f8-1f1e7":71793,"1f1f8-1f1e8":71794,"1f1f8-1f1e9":71795,"1f1f8-1f1ea":71796,"1f1f8-1f1ec":71797,"1f1f8-1f1ed":71798,"1f1f8-1f1ee":71799,"1f1f8-1f1ef":71800,"1f1f8-1f1f0":71801,"1f1f8-1f1f1":71802,"1f1f8-1f1f2":71803,"1f1f8-1f1f3":71804,"1f1f8-1f1f4":71805,"1f1f8-1f1f7":71806,"1f1f8-1f1f8":71807,"1f1f8-1f1f9":71808,"1f1f8-1f1fb":71809,"1f1f8-1f1fd":71810,"1f1f8-1f1fe":71811,"1f1f8-1f1ff":71812,"1f1f9-1f1e6":71813,"1f1f9-1f1e8":71814,"1f1f9-1f1e9":71815,"1f1f9-1f1eb":71816,"1f1f9-1f1ec":71817,"1f1f9-1f1ed":71818,"1f1f9-1f1ef":71819,"1f1f9-1f1f0":71820,"1f1f9-1f1f1":71821,"1f1f9-1f1f2":71822,"1f1f9-1f1f3":71823,"1f1f9-1f1f4":71824,"1f1f9-1f1f7":71825,"1f1f9-1f1f9":71826,"1f1f9-1f1fb":71827,"1f1f9-1f1fc":71828,"1f1f9-1f1ff":71829,"1f1fa-1f1e6":71830,"1f1fa-1f1ec":71831,"1f1fa-1f1f2":71832,"1f1fa-1f1f3":71833,"1f1fa-1f1f8":71834,"1f1fa-1f1fe":71835,"1f1fa-1f1ff":71836,"1f1fb-1f1e6":71837,"1f1fb-1f1e8":71838,"1f1fb-1f1ea":71839,"1f1fb-1f1ec":71840,"1f1fb-1f1ee":71841,"1f1fb-1f1f3":71842,"1f1fb-1f1fa":71843,"1f1fc-1f1eb":71844,"1f1fc-1f1f8":71845,"1f1fd-1f1f0":71846,"1f1fe-1f1ea":71847,"1f1fe-1f1f9":71848,"1f1ff-1f1e6":71849,"1f1ff-1f1f2":71850,"1f1ff-1f1fc":71851,"1f201":62899,"1f202":62900,"1f21a":62906,"1f22f":62903,"1f232":62907,"1f233":62911,"1f234":62910,"1f235":62915,"1f236":62902,"1f237":62901,"1f238":62909,"1f239":62905,"1f23a":62914,"1f250":62904,"1f251":62908,"1f300":41010,"1f301":4857,"1f302":41012,"1f303":4858,"1f304":4860,"1f305":4861,"1f306":4862,"1f307":4863,"1f308":41011,"1f309":4864,"1f30a":41023,"1f30b":4815,"1f30c":4997,"1f30d":4806,"1f30e":4807,"1f30f":4808,"1f310":4809,"1f311":4977,"1f312":4978,"1f313":4979,"1f314":4980,"1f315":4981,"1f316":4982,"1f317":4983,"1f318":4984,"1f319":4985,"1f31a":4986,"1f31b":4987,"1f31c":4988,"1f31d":4991,"1f31e":4992,"1f31f":4995,"1f320":4996,"1f321":4989,"1f324":41001,"1f325":41002,"1f326":41003,"1f327":41004,"1f328":41005,"1f329":41006,"1f32a":41007,"1f32b":41008,"1f32c":41009,"1f32d":3725,"1f32e":3727,"1f32f":3728,"1f330":3708,"1f331":2659,"1f332":2661,"1f333":2662,"1f334":2663,"1f335":2664,"1f336":3698,"1f337":2658,"1f338":2649,"1f339":2653,"1f33a":2655,"1f33b":2656,"1f33c":2657,"1f33d":3697,"1f33e":2665,"1f33f":2666,"1f340":2668,"1f341":2669,"1f342":2670,"1f343":2671,"1f344":3705,"1f345":3690,"1f346":3694,"1f347":3674,"1f348":3675,"1f349":3676,"1f34a":3677,"1f34b":3678,"1f34c":3679,"1f34d":3680,"1f34e":3682,"1f34f":3683,"1f350":3684,"1f351":3685,"1f352":3686,"1f353":3687,"1f354":3722,"1f355":3724,"1f356":3718,"1f357":3719,"1f358":3744,"1f359":3745,"1f35a":3746,"1f35b":3747,"1f35c":3748,"1f35d":3749,"1f35e":3709,"1f35f":3723,"1f360":3750,"1f361":3756,"1f362":3751,"1f363":3752,"1f364":3753,"1f365":3754,"1f366":3765,"1f367":3766,"1f368":3767,"1f369":3768,"1f36a":3769,"1f36b":3774,"1f36c":3775,"1f36d":3776,"1f36e":3777,"1f36f":3778,"1f370":3771,"1f371":3743,"1f372":3735,"1f373":3733,"1f374":3801,"1f375":3783,"1f376":3784,"1f377":3786,"1f378":3787,"1f379":3788,"1f37a":3789,"1f37b":3790,"1f37c":3779,"1f37d":3800,"1f37e":3785,"1f37f":3739,"1f380":51040,"1f381":51041,"1f382":3770,"1f383":51024,"1f384":51025,"1f385":1527,"1f386":51026,"1f387":51027,"1f388":51030,"1f389":51031,"1f38a":51032,"1f38b":51033,"1f38c":71588,"1f38d":51034,"1f38e":51035,"1f38f":51036,"1f390":51037,"1f391":51038,"1f392":61134,"1f393":61147,"1f396":51045,"1f397":51042,"1f399":61167,"1f39a":61168,"1f39b":61169,"1f39e":61203,"1f39f":51043,"1f3a0":4866,"1f3a1":4868,"1f3a2":4869,"1f3a3":51072,"1f3a4":61170,"1f3a5":61202,"1f3a6":62819,"1f3a7":61171,"1f3a8":51105,"1f3a9":61146,"1f3aa":4871,"1f3ab":51044,"1f3ac":61205,"1f3ad":51103,"1f3ae":51086,"1f3af":51078,"1f3b0":51088,"1f3b1":51081,"1f3b2":51089,"1f3b3":51060,"1f3b4":51102,"1f3b5":61165,"1f3b6":61166,"1f3b7":61173,"1f3b8":61175,"1f3b9":61176,"1f3ba":61177,"1f3bb":61178,"1f3bc":61164,"1f3bd":51074,"1f3be":51058,"1f3bf":51075,"1f3c0":51054,"1f3c1":71586,"1f3c2":1600,"1f3c3-200d-2640":1584,"1f3c3-200d-2642":1583,"1f3c3":1582,"1f3c4-200d-2640":1606,"1f3c4-200d-2642":1605,"1f3c4":1604,"1f3c5":51047,"1f3c6":51046,"1f3c7":1598,"1f3c8":51056,"1f3c9":51057,"1f3ca-200d-2640":1612,"1f3ca-200d-2642":1611,"1f3ca":1610,"1f3cb-200d-2640":1618,"1f3cb-200d-2642":1617,"1f3cb":1616,"1f3cc-200d-2640":1603,"1f3cc-200d-2642":1602,"1f3cc":1601,"1f3cd":4902,"1f3ce":4901,"1f3cf":51061,"1f3d0":51055,"1f3d1":51062,"1f3d2":51063,"1f3d3":51065,"1f3d4":4813,"1f3d5":4817,"1f3d6":4818,"1f3d7":4824,"1f3d8":4829,"1f3d9":4859,"1f3da":4830,"1f3db":4823,"1f3dc":4819,"1f3dd":4820,"1f3de":4821,"1f3df":4822,"1f3e0":4831,"1f3e1":4832,"1f3e2":4833,"1f3e3":4834,"1f3e4":4835,"1f3e5":4836,"1f3e6":4837,"1f3e7":62729,"1f3e8":4838,"1f3e9":4839,"1f3ea":4840,"1f3eb":4841,"1f3ec":4842,"1f3ed":4843,"1f3ee":61216,"1f3ef":4844,"1f3f0":4845,"1f3f3-200d-1f308":71591,"1f3f3-200d-26a7":71592,"1f3f3":71590,"1f3f4-200d-2620":71593,"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f":71852,"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f":71853,"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f":71854,"1f3f4":71589,"1f3f5":2652,"1f3f7":61234,"1f3f8":51066,"1f3f9":61303,"1f3fa":3805,"1f3fb":9525,"1f3fc":9526,"1f3fd":9527,"1f3fe":9528,"1f3ff":9529,"1f400":2576,"1f401":2575,"1f402":2556,"1f403":2557,"1f404":2558,"1f405":2547,"1f406":2548,"1f407":2579,"1f408-200d-2b1b":2544,"1f408":2543,"1f409":2618,"1f40a":2613,"1f40b":2622,"1f40c":2632,"1f40d":2616,"1f40e":2550,"1f40f":2563,"1f410":2565,"1f411":2564,"1f412":2531,"1f413":2596,"1f414":2595,"1f415-200d-1f9ba":2537,"1f415":2535,"1f416":2560,"1f417":2561,"1f418":2570,"1f419":2629,"1f41a":2630,"1f41b":2634,"1f41c":2635,"1f41d":2636,"1f41e":2638,"1f41f":2625,"1f420":2626,"1f421":2627,"1f422":2614,"1f423":2597,"1f424":2598,"1f425":2599,"1f426":2600,"1f427":2601,"1f428":2586,"1f429":2538,"1f42a":2566,"1f42b":2567,"1f42c":2623,"1f42d":2574,"1f42e":2555,"1f42f":2546,"1f430":2578,"1f431":2542,"1f432":2617,"1f433":2621,"1f434":2549,"1f435":2530,"1f436":2534,"1f437":2559,"1f438":2612,"1f439":2577,"1f43a":2539,"1f43b-200d-2744":2585,"1f43b":2584,"1f43c":2587,"1f43d":2562,"1f43e":2593,"1f43f":2580,"1f440":1381,"1f441-200d-1f5e8":1159,"1f441":1382,"1f442":1373,"1f443":1375,"1f444":1384,"1f445":1383,"1f446":1347,"1f447":1349,"1f448":1345,"1f449":1346,"1f44a":1355,"1f44b":1327,"1f44c":1336,"1f44d":1352,"1f44e":1353,"1f44f":1358,"1f450":1361,"1f451":61144,"1f452":61145,"1f453":61110,"1f454":61115,"1f455":61116,"1f456":61117,"1f457":61122,"1f458":61123,"1f459":61128,"1f45a":61129,"1f45b":61130,"1f45c":61131,"1f45d":61132,"1f45e":61136,"1f45f":61137,"1f460":61140,"1f461":61141,"1f462":61143,"1f463":1687,"1f464":1684,"1f465":1685,"1f466":1388,"1f467":1389,"1f468-200d-1f33e":1457,"1f468-200d-1f373":1460,"1f468-200d-1f37c":1524,"1f468-200d-1f393":1448,"1f468-200d-1f3a4":1478,"1f468-200d-1f3a8":1481,"1f468-200d-1f3eb":1451,"1f468-200d-1f3ed":1466,"1f468-200d-1f466-200d-1f466":1674,"1f468-200d-1f466":1673,"1f468-200d-1f467-200d-1f466":1676,"1f468-200d-1f467-200d-1f467":1677,"1f468-200d-1f467":1675,"1f468-200d-1f468-200d-1f466":1663,"1f468-200d-1f468-200d-1f466-200d-1f466":1666,"1f468-200d-1f468-200d-1f467":1664,"1f468-200d-1f468-200d-1f467-200d-1f466":1665,"1f468-200d-1f468-200d-1f467-200d-1f467":1667,"1f468-200d-1f469-200d-1f466":1658,"1f468-200d-1f469-200d-1f466-200d-1f466":1661,"1f468-200d-1f469-200d-1f467":1659,"1f468-200d-1f469-200d-1f467-200d-1f466":1660,"1f468-200d-1f469-200d-1f467-200d-1f467":1662,"1f468-200d-1f4bb":1475,"1f468-200d-1f4bc":1469,"1f468-200d-1f527":1463,"1f468-200d-1f52c":1472,"1f468-200d-1f680":1487,"1f468-200d-1f692":1490,"1f468-200d-1f9af":1574,"1f468-200d-1f9b0":1396,"1f468-200d-1f9b1":1397,"1f468-200d-1f9b2":1399,"1f468-200d-1f9b3":1398,"1f468-200d-1f9bc":1577,"1f468-200d-1f9bd":1580,"1f468-200d-2695":1445,"1f468-200d-2696":1454,"1f468-200d-2708":1484,"1f468-200d-2764-200d-1f468":1655,"1f468-200d-2764-200d-1f48b-200d-1f468":1651,"1f468":1392,"1f469-200d-1f33e":1458,"1f469-200d-1f373":1461,"1f469-200d-1f37c":1523,"1f469-200d-1f393":1449,"1f469-200d-1f3a4":1479,"1f469-200d-1f3a8":1482,"1f469-200d-1f3eb":1452,"1f469-200d-1f3ed":1467,"1f469-200d-1f466-200d-1f466":1679,"1f469-200d-1f466":1678,"1f469-200d-1f467-200d-1f466":1681,"1f469-200d-1f467-200d-1f467":1682,"1f469-200d-1f467":1680,"1f469-200d-1f469-200d-1f466":1668,"1f469-200d-1f469-200d-1f466-200d-1f466":1671,"1f469-200d-1f469-200d-1f467":1669,"1f469-200d-1f469-200d-1f467-200d-1f466":1670,"1f469-200d-1f469-200d-1f467-200d-1f467":1672,"1f469-200d-1f4bb":1476,"1f469-200d-1f4bc":1470,"1f469-200d-1f527":1464,"1f469-200d-1f52c":1473,"1f469-200d-1f680":1488,"1f469-200d-1f692":1491,"1f469-200d-1f9af":1575,"1f469-200d-1f9b0":1401,"1f469-200d-1f9b1":1403,"1f469-200d-1f9b2":1407,"1f469-200d-1f9b3":1405,"1f469-200d-1f9bc":1578,"1f469-200d-1f9bd":1581,"1f469-200d-2695":1446,"1f469-200d-2696":1455,"1f469-200d-2708":1485,"1f469-200d-2764-200d-1f468":1654,"1f469-200d-2764-200d-1f469":1656,"1f469-200d-2764-200d-1f48b-200d-1f468":1650,"1f469-200d-2764-200d-1f48b-200d-1f469":1652,"1f469":1400,"1f46a":1657,"1f46b":1647,"1f46c":1648,"1f46d":1646,"1f46e-200d-2640":1494,"1f46e-200d-2642":1493,"1f46e":1492,"1f46f-200d-2640":1590,"1f46f-200d-2642":1589,"1f46f":1588,"1f470-200d-2640":1518,"1f470-200d-2642":1517,"1f470":1516,"1f471-200d-2640":1409,"1f471-200d-2642":1410,"1f471":1391,"1f472":1511,"1f473-200d-2640":1510,"1f473-200d-2642":1509,"1f473":1508,"1f474":1412,"1f475":1413,"1f476":1386,"1f477-200d-2640":1504,"1f477-200d-2642":1503,"1f477":1502,"1f478":1507,"1f479":1109,"1f47a":1110,"1f47b":1111,"1f47c":1526,"1f47d":1112,"1f47e":1113,"1f47f":1104,"1f480":1105,"1f481-200d-2640":1428,"1f481-200d-2642":1427,"1f481":1426,"1f482-200d-2640":1500,"1f482-200d-2642":1499,"1f482":1498,"1f483":1585,"1f484":61152,"1f485":1366,"1f486-200d-2640":1560,"1f486-200d-2642":1559,"1f486":1558,"1f487-200d-2640":1563,"1f487-200d-2642":1562,"1f487":1561,"1f488":4870,"1f489":61326,"1f48a":61328,"1f48b":1127,"1f48c":1128,"1f48d":61153,"1f48e":61154,"1f48f":1649,"1f490":2648,"1f491":1653,"1f492":4846,"1f493":1133,"1f494":1138,"1f495":1135,"1f496":1131,"1f497":1132,"1f498":1129,"1f499":1145,"1f49a":1144,"1f49b":1143,"1f49c":1146,"1f49d":1130,"1f49e":1134,"1f49f":1136,"1f4a0":62946,"1f4a1":61214,"1f4a2":1151,"1f4a3":1157,"1f4a4":1163,"1f4a5":1152,"1f4a6":1154,"1f4a7":41022,"1f4a8":1155,"1f4a9":1107,"1f4aa":1368,"1f4ab":1153,"1f4ac":1158,"1f4ad":1162,"1f4ae":2650,"1f4af":1150,"1f4b0":61235,"1f4b1":62841,"1f4b2":62842,"1f4b3":61242,"1f4b4":61237,"1f4b5":61238,"1f4b6":61239,"1f4b7":61240,"1f4b8":61241,"1f4b9":61244,"1f4ba":4936,"1f4bb":61191,"1f4bc":61265,"1f4bd":61197,"1f4be":61198,"1f4bf":61199,"1f4c0":61200,"1f4c1":61266,"1f4c2":61267,"1f4c3":61227,"1f4c4":61229,"1f4c5":61269,"1f4c6":61270,"1f4c7":61273,"1f4c8":61274,"1f4c9":61275,"1f4ca":61276,"1f4cb":61277,"1f4cc":61278,"1f4cd":61279,"1f4ce":61280,"1f4cf":61282,"1f4d0":61283,"1f4d1":61232,"1f4d2":61226,"1f4d3":61225,"1f4d4":61218,"1f4d5":61219,"1f4d6":61220,"1f4d7":61221,"1f4d8":61222,"1f4d9":61223,"1f4da":61224,"1f4db":62847,"1f4dc":61228,"1f4dd":61264,"1f4de":61185,"1f4df":61186,"1f4e0":61187,"1f4e1":61325,"1f4e2":61159,"1f4e3":61160,"1f4e4":61249,"1f4e5":61250,"1f4e6":61251,"1f4e7":61246,"1f4e8":61247,"1f4e9":61248,"1f4ea":61253,"1f4eb":61252,"1f4ec":61254,"1f4ed":61255,"1f4ee":61256,"1f4ef":61161,"1f4f0":61230,"1f4f1":61182,"1f4f2":61183,"1f4f3":62823,"1f4f4":62824,"1f4f5":62751,"1f4f6":62822,"1f4f7":61207,"1f4f8":61208,"1f4f9":61209,"1f4fa":61206,"1f4fb":61172,"1f4fc":61210,"1f4fd":61204,"1f4ff":61151,"1f500":62801,"1f501":62802,"1f502":62803,"1f503":62769,"1f504":62770,"1f505":62820,"1f506":62821,"1f507":61155,"1f508":61156,"1f509":61157,"1f50a":61158,"1f50b":61188,"1f50c":61190,"1f50d":61211,"1f50e":61212,"1f50f":61290,"1f510":61291,"1f511":61292,"1f512":61288,"1f513":61289,"1f514":61162,"1f515":61163,"1f516":61233,"1f517":61313,"1f518":62947,"1f519":62771,"1f51a":62772,"1f51b":62773,"1f51c":62774,"1f51d":62775,"1f51e":62752,"1f51f":62876,"1f520":62877,"1f521":62878,"1f522":62879,"1f523":62880,"1f524":62881,"1f525":41021,"1f526":61215,"1f527":61306,"1f528":61294,"1f529":61308,"1f52a":3803,"1f52b":61301,"1f52c":61323,"1f52d":61324,"1f52e":51082,"1f52f":62787,"1f530":62848,"1f531":62846,"1f532":62949,"1f533":62948,"1f534":62916,"1f535":62920,"1f536":62940,"1f537":62941,"1f538":62942,"1f539":62943,"1f53a":62944,"1f53b":62945,"1f53c":62811,"1f53d":62813,"1f549":62778,"1f54a":2602,"1f54b":4854,"1f54c":4850,"1f54d":4852,"1f54e":62786,"1f550":4955,"1f551":4957,"1f552":4959,"1f553":4961,"1f554":4963,"1f555":4965,"1f556":4967,"1f557":4969,"1f558":4971,"1f559":4973,"1f55a":4975,"1f55b":4953,"1f55c":4956,"1f55d":4958,"1f55e":4960,"1f55f":4962,"1f560":4964,"1f561":4966,"1f562":4968,"1f563":4970,"1f564":4972,"1f565":4974,"1f566":4976,"1f567":4954,"1f56f":61213,"1f570":4952,"1f573":1156,"1f574":1587,"1f575-200d-2640":1497,"1f575-200d-2642":1496,"1f575":1495,"1f576":61111,"1f577":2641,"1f578":2642,"1f579":51087,"1f57a":1586,"1f587":61281,"1f58a":61261,"1f58b":61260,"1f58c":61262,"1f58d":61263,"1f590":1329,"1f595":1348,"1f596":1331,"1f5a4":1148,"1f5a5":61192,"1f5a8":61193,"1f5b1":61195,"1f5b2":61196,"1f5bc":51104,"1f5c2":61268,"1f5c3":61285,"1f5c4":61286,"1f5d1":61287,"1f5d2":61271,"1f5d3":61272,"1f5dc":61310,"1f5dd":61293,"1f5de":61231,"1f5e1":61299,"1f5e3":1683,"1f5e8":1160,"1f5ef":1161,"1f5f3":61257,"1f5fa":4810,"1f5fb":4816,"1f5fc":4847,"1f5fd":4848,"1f5fe":4811,"1f5ff":61362,"1f600":11,"1f601":14,"1f602":18,"1f603":12,"1f604":13,"1f605":16,"1f606":15,"1f607":114,"1f608":1103,"1f609":112,"1f60a":113,"1f60b":124,"1f60c":150,"1f60d":116,"1f60e":170,"1f60f":144,"1f610":139,"1f611":140,"1f612":145,"1f613":195,"1f614":151,"1f615":173,"1f616":192,"1f617":119,"1f618":118,"1f619":122,"1f61a":121,"1f61b":125,"1f61c":126,"1f61d":128,"1f61e":194,"1f61f":175,"1f620":1101,"1f621":1100,"1f622":189,"1f623":193,"1f624":199,"1f625":188,"1f626":184,"1f627":185,"1f628":186,"1f629":196,"1f62a":152,"1f62b":197,"1f62c":147,"1f62d":190,"1f62e-200d-1f4a8":148,"1f62e":178,"1f62f":179,"1f630":187,"1f631":191,"1f632":180,"1f633":181,"1f634":154,"1f635-200d-1f4ab":165,"1f635":164,"1f636-200d-1f32b":143,"1f636":141,"1f637":155,"1f638":1116,"1f639":1117,"1f63a":1115,"1f63b":1118,"1f63c":1119,"1f63d":1120,"1f63e":1123,"1f63f":1122,"1f640":1121,"1f641":176,"1f642":19,"1f643":110,"1f644":146,"1f645-200d-2640":1422,"1f645-200d-2642":1421,"1f645":1420,"1f646-200d-2640":1425,"1f646-200d-2642":1424,"1f646":1423,"1f647-200d-2640":1437,"1f647-200d-2642":1436,"1f647":1435,"1f648":1124,"1f649":1125,"1f64a":1126,"1f64b-200d-2640":1431,"1f64b-200d-2642":1430,"1f64b":1429,"1f64c":1359,"1f64d-200d-2640":1416,"1f64d-200d-2642":1415,"1f64d":1414,"1f64e-200d-2640":1419,"1f64e-200d-2642":1418,"1f64e":1417,"1f64f":1364,"1f680":4942,"1f681":4937,"1f682":4872,"1f683":4873,"1f684":4874,"1f685":4875,"1f686":4876,"1f687":4877,"1f688":4878,"1f689":4879,"1f68a":4880,"1f68b":4883,"1f68c":4884,"1f68d":4885,"1f68e":4886,"1f68f":4911,"1f690":4887,"1f691":4888,"1f692":4889,"1f693":4890,"1f694":4891,"1f695":4892,"1f696":4893,"1f697":4894,"1f698":4895,"1f699":4896,"1f69a":4898,"1f69b":4899,"1f69c":4900,"1f69d":4881,"1f69e":4882,"1f69f":4938,"1f6a0":4939,"1f6a1":4940,"1f6a2":4930,"1f6a3-200d-2640":1609,"1f6a3-200d-2642":1608,"1f6a3":1607,"1f6a4":4926,"1f6a5":4918,"1f6a6":4919,"1f6a7":4921,"1f6a8":4917,"1f6a9":71587,"1f6aa":61333,"1f6ab":62745,"1f6ac":61358,"1f6ad":62747,"1f6ae":62730,"1f6af":62748,"1f6b0":62731,"1f6b1":62749,"1f6b2":4907,"1f6b3":62746,"1f6b4-200d-2640":1621,"1f6b4-200d-2642":1620,"1f6b4":1619,"1f6b5-200d-2640":1624,"1f6b5-200d-2642":1623,"1f6b5":1622,"1f6b6-200d-2640":1566,"1f6b6-200d-2642":1565,"1f6b6":1564,"1f6b7":62750,"1f6b8":62743,"1f6b9":62733,"1f6ba":62734,"1f6bb":62735,"1f6bc":62736,"1f6bd":61340,"1f6be":62737,"1f6bf":61342,"1f6c0":1643,"1f6c1":61343,"1f6c2":62738,"1f6c3":62739,"1f6c4":62740,"1f6c5":62741,"1f6cb":61338,"1f6cc":1644,"1f6cd":61133,"1f6ce":4944,"1f6cf":61337,"1f6d0":62776,"1f6d1":4920,"1f6d2":61357,"1f6d5":4851,"1f6d6":4828,"1f6d7":61334,"1f6e0":61298,"1f6e1":61304,"1f6e2":4914,"1f6e3":4912,"1f6e4":4913,"1f6e5":4929,"1f6e9":4932,"1f6eb":4933,"1f6ec":4934,"1f6f0":4941,"1f6f3":4927,"1f6f4":4908,"1f6f5":4903,"1f6f6":4925,"1f6f7":51076,"1f6f8":4943,"1f6f9":4909,"1f6fa":4906,"1f6fb":4897,"1f6fc":4910,"1f7e0":62917,"1f7e1":62918,"1f7e2":62919,"1f7e3":62921,"1f7e4":62922,"1f7e5":62925,"1f7e6":62929,"1f7e7":62926,"1f7e8":62927,"1f7e9":62928,"1f7ea":62930,"1f7eb":62931,"1f90c":1337,"1f90d":1149,"1f90e":1147,"1f90f":1338,"1f910":137,"1f911":129,"1f912":156,"1f913":171,"1f914":135,"1f915":157,"1f916":1114,"1f917":130,"1f918":1343,"1f919":1344,"1f91a":1328,"1f91b":1356,"1f91c":1357,"1f91d":1363,"1f91e":1340,"1f91f":1342,"1f920":167,"1f921":1108,"1f922":158,"1f923":17,"1f924":153,"1f925":149,"1f926-200d-2640":1440,"1f926-200d-2642":1439,"1f926":1438,"1f927":160,"1f928":138,"1f929":117,"1f92a":127,"1f92b":134,"1f92c":1102,"1f92d":131,"1f92e":159,"1f92f":166,"1f930":1519,"1f931":1522,"1f932":1362,"1f933":1367,"1f934":1506,"1f935-200d-2640":1515,"1f935-200d-2642":1514,"1f935":1513,"1f936":1528,"1f937-200d-2640":1443,"1f937-200d-2642":1442,"1f937":1441,"1f938-200d-2640":1627,"1f938-200d-2642":1626,"1f938":1625,"1f939-200d-2640":1639,"1f939-200d-2642":1638,"1f939":1637,"1f93a":1597,"1f93c-200d-2640":1630,"1f93c-200d-2642":1629,"1f93c":1628,"1f93d-200d-2640":1633,"1f93d-200d-2642":1632,"1f93d":1631,"1f93e-200d-2640":1636,"1f93e-200d-2642":1635,"1f93e":1634,"1f93f":51073,"1f940":2654,"1f941":61180,"1f942":3791,"1f943":3792,"1f944":3802,"1f945":51069,"1f947":51048,"1f948":51049,"1f949":51050,"1f94a":51067,"1f94b":51068,"1f94c":51077,"1f94d":51064,"1f94e":51053,"1f94f":51059,"1f950":3710,"1f951":3693,"1f952":3700,"1f953":3721,"1f954":3695,"1f955":3696,"1f956":3711,"1f957":3738,"1f958":3734,"1f959":3730,"1f95a":3732,"1f95b":3780,"1f95c":3706,"1f95d":3689,"1f95e":3715,"1f95f":3757,"1f960":3758,"1f961":3759,"1f962":3799,"1f963":3737,"1f964":3794,"1f965":3692,"1f966":3702,"1f967":3773,"1f968":3713,"1f969":3720,"1f96a":3726,"1f96b":3742,"1f96c":3701,"1f96d":3681,"1f96e":3755,"1f96f":3714,"1f970":115,"1f971":198,"1f972":123,"1f973":168,"1f974":163,"1f975":161,"1f976":162,"1f977":1501,"1f978":169,"1f97a":182,"1f97b":61124,"1f97c":61113,"1f97d":61112,"1f97e":61138,"1f97f":61139,"1f980":3760,"1f981":2545,"1f982":2643,"1f983":2594,"1f984":2551,"1f985":2603,"1f986":2604,"1f987":2583,"1f988":2628,"1f989":2606,"1f98a":2540,"1f98b":2633,"1f98c":2553,"1f98d":2532,"1f98e":2615,"1f98f":2572,"1f990":3762,"1f991":3763,"1f992":2569,"1f993":2552,"1f994":2582,"1f995":2619,"1f996":2620,"1f997":2639,"1f998":2591,"1f999":2568,"1f99a":2610,"1f99b":2573,"1f99c":2611,"1f99d":2541,"1f99e":3761,"1f99f":2644,"1f9a0":2647,"1f9a1":2592,"1f9a2":2605,"1f9a3":2571,"1f9a4":2607,"1f9a5":2588,"1f9a6":2589,"1f9a7":2533,"1f9a8":2590,"1f9a9":2609,"1f9aa":3764,"1f9ab":2581,"1f9ac":2554,"1f9ad":2624,"1f9ae":2536,"1f9af":61312,"1f9b4":1380,"1f9b5":1371,"1f9b6":1372,"1f9b7":1379,"1f9b8-200d-2640":1532,"1f9b8-200d-2642":1531,"1f9b8":1530,"1f9b9-200d-2640":1535,"1f9b9-200d-2642":1534,"1f9b9":1533,"1f9ba":61114,"1f9bb":1374,"1f9bc":4905,"1f9bd":4904,"1f9be":1369,"1f9bf":1370,"1f9c0":3717,"1f9c1":3772,"1f9c2":3741,"1f9c3":3796,"1f9c4":3703,"1f9c5":3704,"1f9c6":3731,"1f9c7":3716,"1f9c8":3740,"1f9c9":3797,"1f9ca":3798,"1f9cb":3795,"1f9cd-200d-2640":1569,"1f9cd-200d-2642":1568,"1f9cd":1567,"1f9ce-200d-2640":1572,"1f9ce-200d-2642":1571,"1f9ce":1570,"1f9cf-200d-2640":1434,"1f9cf-200d-2642":1433,"1f9cf":1432,"1f9d0":172,"1f9d1-200d-1f33e":1456,"1f9d1-200d-1f373":1459,"1f9d1-200d-1f37c":1525,"1f9d1-200d-1f384":1529,"1f9d1-200d-1f393":1447,"1f9d1-200d-1f3a4":1477,"1f9d1-200d-1f3a8":1480,"1f9d1-200d-1f3eb":1450,"1f9d1-200d-1f3ed":1465,"1f9d1-200d-1f4bb":1474,"1f9d1-200d-1f4bc":1468,"1f9d1-200d-1f527":1462,"1f9d1-200d-1f52c":1471,"1f9d1-200d-1f680":1486,"1f9d1-200d-1f692":1489,"1f9d1-200d-1f91d-200d-1f9d1":1645,"1f9d1-200d-1f9af":1573,"1f9d1-200d-1f9b0":1402,"1f9d1-200d-1f9b1":1404,"1f9d1-200d-1f9b2":1408,"1f9d1-200d-1f9b3":1406,"1f9d1-200d-1f9bc":1576,"1f9d1-200d-1f9bd":1579,"1f9d1-200d-2695":1444,"1f9d1-200d-2696":1453,"1f9d1-200d-2708":1483,"1f9d1":1390,"1f9d2":1387,"1f9d3":1411,"1f9d4-200d-2640":1395,"1f9d4-200d-2642":1394,"1f9d4":1393,"1f9d5":1512,"1f9d6-200d-2640":1593,"1f9d6-200d-2642":1592,"1f9d6":1591,"1f9d7-200d-2640":1596,"1f9d7-200d-2642":1595,"1f9d7":1594,"1f9d8-200d-2640":1642,"1f9d8-200d-2642":1641,"1f9d8":1640,"1f9d9-200d-2640":1538,"1f9d9-200d-2642":1537,"1f9d9":1536,"1f9da-200d-2640":1541,"1f9da-200d-2642":1540,"1f9da":1539,"1f9db-200d-2640":1544,"1f9db-200d-2642":1543,"1f9db":1542,"1f9dc-200d-2640":1547,"1f9dc-200d-2642":1546,"1f9dc":1545,"1f9dd-200d-2640":1550,"1f9dd-200d-2642":1549,"1f9dd":1548,"1f9de-200d-2640":1553,"1f9de-200d-2642":1552,"1f9de":1551,"1f9df-200d-2640":1556,"1f9df-200d-2642":1555,"1f9df":1554,"1f9e0":1376,"1f9e1":1142,"1f9e2":61148,"1f9e3":61118,"1f9e4":61119,"1f9e5":61120,"1f9e6":61121,"1f9e7":51039,"1f9e8":51028,"1f9e9":51090,"1f9ea":61320,"1f9eb":61321,"1f9ec":61322,"1f9ed":4812,"1f9ee":61201,"1f9ef":61356,"1f9f0":61316,"1f9f1":4825,"1f9f2":61317,"1f9f3":4945,"1f9f4":61346,"1f9f5":51106,"1f9f6":51108,"1f9f7":61347,"1f9f8":51091,"1f9f9":61348,"1f9fa":61349,"1f9fb":61350,"1f9fc":61352,"1f9fd":61355,"1f9fe":61243,"1f9ff":51084,"1fa70":61142,"1fa71":61125,"1fa72":61126,"1fa73":61127,"1fa74":61135,"1fa78":61327,"1fa79":61329,"1fa7a":61331,"1fa80":51079,"1fa81":51080,"1fa82":4935,"1fa83":61302,"1fa84":51083,"1fa85":51092,"1fa86":51094,"1fa90":4993,"1fa91":61339,"1fa92":61345,"1fa93":61295,"1fa94":61217,"1fa95":61179,"1fa96":61149,"1fa97":61174,"1fa98":61181,"1fa99":61236,"1fa9a":61305,"1fa9b":61307,"1fa9c":61318,"1fa9d":61315,"1fa9e":61335,"1fa9f":61336,"1faa0":61341,"1faa1":51107,"1faa2":51109,"1faa3":61351,"1faa4":61344,"1faa5":61354,"1faa6":61360,"1faa7":61363,"1faa8":4826,"1fab0":2645,"1fab1":2646,"1fab2":2637,"1fab3":2640,"1fab4":2660,"1fab5":4827,"1fab6":2608,"1fac0":1377,"1fac1":1378,"1fac2":1686,"1fad0":3688,"1fad1":3699,"1fad2":3691,"1fad3":3712,"1fad4":3729,"1fad5":3736,"1fad6":3782,"203c":62834,"21a9":62765,"21aa":62766,"231a":4948,"231b":4946,"23cf":62818,"23e9":62805,"23ea":62809,"23eb":62812,"23ec":62814,"23ed":62806,"23ee":62810,"23ef":62807,"23f0":4949,"23f1":4950,"23f2":4951,"23f3":4947,"23f8":62815,"23f9":62816,"23fa":62817,"24c2":62890,"25aa":62938,"25ab":62939,"25b6":62804,"25c0":62808,"25fb":62935,"25fc":62934,"25fd":62937,"25fe":62936,"260e":61184,"261d":1350,"262a":62784,"262e":62785,"262f":62781,"263a":120,"264a":62790,"264b":62791,"264c":62792,"264d":62793,"264e":62794,"264f":62795,"265f":51099,"267b":62844,"267e":62833,"267f":62732,"269b":62777,"269c":62845,"26a0":62742,"26a1":41016,"26a7":62827,"26aa":62924,"26ab":62923,"26b0":61359,"26b1":61361,"26bd":51051,"26be":51052,"26c4":41019,"26c5":4999,"26c8":41e3,"26ce":62800,"26cf":61296,"26d1":61150,"26d3":61314,"26d4":62744,"26e9":4853,"26ea":4849,"26f0":4814,"26f1":41015,"26f2":4855,"26f3":51070,"26f4":4928,"26f5":4924,"26f7":1599,"26f8":51071,"26f9-200d-2640":1615,"26f9-200d-2642":1614,"26f9":1613,"26fa":4856,"26fd":4915,"270a":1354,"270b":1330,"270c":1339,"270d":1365,"270f":61258,"271d":62782,"274c":62853,"274e":62854,"2764-200d-1f525":1139,"2764-200d-1fa79":1140,"27a1":62757,"27b0":62855,"27bf":62856,"2b05":62761,"2b06":62755,"2b07":62759,"2b1b":62932,"2b1c":62933,"2b50":4994,"2b55":62849,"303d":62857,"1f385-1f3fb":0,"1f385-1f3fc":0,"1f385-1f3fd":0,"1f385-1f3fe":0,"1f385-1f3ff":0,"1f3c2-1f3fb":0,"1f3c2-1f3fc":0,"1f3c2-1f3fd":0,"1f3c2-1f3fe":0,"1f3c2-1f3ff":0,"1f3c3-1f3fb-200d-2640":0,"1f3c3-1f3fc-200d-2640":0,"1f3c3-1f3fd-200d-2640":0,"1f3c3-1f3fe-200d-2640":0,"1f3c3-1f3ff-200d-2640":0,"1f3c3-1f3fb-200d-2642":0,"1f3c3-1f3fc-200d-2642":0,"1f3c3-1f3fd-200d-2642":0,"1f3c3-1f3fe-200d-2642":0,"1f3c3-1f3ff-200d-2642":0,"1f3c3-1f3fb":0,"1f3c3-1f3fc":0,"1f3c3-1f3fd":0,"1f3c3-1f3fe":0,"1f3c3-1f3ff":0,"1f3c4-1f3fb-200d-2640":0,"1f3c4-1f3fc-200d-2640":0,"1f3c4-1f3fd-200d-2640":0,"1f3c4-1f3fe-200d-2640":0,"1f3c4-1f3ff-200d-2640":0,"1f3c4-1f3fb-200d-2642":0,"1f3c4-1f3fc-200d-2642":0,"1f3c4-1f3fd-200d-2642":0,"1f3c4-1f3fe-200d-2642":0,"1f3c4-1f3ff-200d-2642":0,"1f3c4-1f3fb":0,"1f3c4-1f3fc":0,"1f3c4-1f3fd":0,"1f3c4-1f3fe":0,"1f3c4-1f3ff":0,"1f3c7-1f3fb":0,"1f3c7-1f3fc":0,"1f3c7-1f3fd":0,"1f3c7-1f3fe":0,"1f3c7-1f3ff":0,"1f3ca-1f3fb-200d-2640":0,"1f3ca-1f3fc-200d-2640":0,"1f3ca-1f3fd-200d-2640":0,"1f3ca-1f3fe-200d-2640":0,"1f3ca-1f3ff-200d-2640":0,"1f3ca-1f3fb-200d-2642":0,"1f3ca-1f3fc-200d-2642":0,"1f3ca-1f3fd-200d-2642":0,"1f3ca-1f3fe-200d-2642":0,"1f3ca-1f3ff-200d-2642":0,"1f3ca-1f3fb":0,"1f3ca-1f3fc":0,"1f3ca-1f3fd":0,"1f3ca-1f3fe":0,"1f3ca-1f3ff":0,"1f3cb-1f3fb-200d-2640":0,"1f3cb-1f3fc-200d-2640":0,"1f3cb-1f3fd-200d-2640":0,"1f3cb-1f3fe-200d-2640":0,"1f3cb-1f3ff-200d-2640":0,"1f3cb-1f3fb-200d-2642":0,"1f3cb-1f3fc-200d-2642":0,"1f3cb-1f3fd-200d-2642":0,"1f3cb-1f3fe-200d-2642":0,"1f3cb-1f3ff-200d-2642":0,"1f3cb-1f3fb":0,"1f3cb-1f3fc":0,"1f3cb-1f3fd":0,"1f3cb-1f3fe":0,"1f3cb-1f3ff":0,"1f3cc-1f3fb-200d-2640":0,"1f3cc-1f3fc-200d-2640":0,"1f3cc-1f3fd-200d-2640":0,"1f3cc-1f3fe-200d-2640":0,"1f3cc-1f3ff-200d-2640":0,"1f3cc-1f3fb-200d-2642":0,"1f3cc-1f3fc-200d-2642":0,"1f3cc-1f3fd-200d-2642":0,"1f3cc-1f3fe-200d-2642":0,"1f3cc-1f3ff-200d-2642":0,"1f3cc-1f3fb":0,"1f3cc-1f3fc":0,"1f3cc-1f3fd":0,"1f3cc-1f3fe":0,"1f3cc-1f3ff":0,"1f442-1f3fb":0,"1f442-1f3fc":0,"1f442-1f3fd":0,"1f442-1f3fe":0,"1f442-1f3ff":0,"1f443-1f3fb":0,"1f443-1f3fc":0,"1f443-1f3fd":0,"1f443-1f3fe":0,"1f443-1f3ff":0,"1f446-1f3fb":0,"1f446-1f3fc":0,"1f446-1f3fd":0,"1f446-1f3fe":0,"1f446-1f3ff":0,"1f447-1f3fb":0,"1f447-1f3fc":0,"1f447-1f3fd":0,"1f447-1f3fe":0,"1f447-1f3ff":0,"1f448-1f3fb":0,"1f448-1f3fc":0,"1f448-1f3fd":0,"1f448-1f3fe":0,"1f448-1f3ff":0,"1f449-1f3fb":0,"1f449-1f3fc":0,"1f449-1f3fd":0,"1f449-1f3fe":0,"1f449-1f3ff":0,"1f44a-1f3fb":0,"1f44a-1f3fc":0,"1f44a-1f3fd":0,"1f44a-1f3fe":0,"1f44a-1f3ff":0,"1f44b-1f3fb":0,"1f44b-1f3fc":0,"1f44b-1f3fd":0,"1f44b-1f3fe":0,"1f44b-1f3ff":0,"1f44c-1f3fb":0,"1f44c-1f3fc":0,"1f44c-1f3fd":0,"1f44c-1f3fe":0,"1f44c-1f3ff":0,"1f44d-1f3fb":0,"1f44d-1f3fc":0,"1f44d-1f3fd":0,"1f44d-1f3fe":0,"1f44d-1f3ff":0,"1f44e-1f3fb":0,"1f44e-1f3fc":0,"1f44e-1f3fd":0,"1f44e-1f3fe":0,"1f44e-1f3ff":0,"1f44f-1f3fb":0,"1f44f-1f3fc":0,"1f44f-1f3fd":0,"1f44f-1f3fe":0,"1f44f-1f3ff":0,"1f450-1f3fb":0,"1f450-1f3fc":0,"1f450-1f3fd":0,"1f450-1f3fe":0,"1f450-1f3ff":0,"1f466-1f3fb":0,"1f466-1f3fc":0,"1f466-1f3fd":0,"1f466-1f3fe":0,"1f466-1f3ff":0,"1f467-1f3fb":0,"1f467-1f3fc":0,"1f467-1f3fd":0,"1f467-1f3fe":0,"1f467-1f3ff":0,"1f468-1f3fb-200d-1f33e":0,"1f468-1f3fc-200d-1f33e":0,"1f468-1f3fd-200d-1f33e":0,"1f468-1f3fe-200d-1f33e":0,"1f468-1f3ff-200d-1f33e":0,"1f468-1f3fb-200d-1f373":0,"1f468-1f3fc-200d-1f373":0,"1f468-1f3fd-200d-1f373":0,"1f468-1f3fe-200d-1f373":0,"1f468-1f3ff-200d-1f373":0,"1f468-1f3fb-200d-1f37c":0,"1f468-1f3fc-200d-1f37c":0,"1f468-1f3fd-200d-1f37c":0,"1f468-1f3fe-200d-1f37c":0,"1f468-1f3ff-200d-1f37c":0,"1f468-1f3fb-200d-1f393":0,"1f468-1f3fc-200d-1f393":0,"1f468-1f3fd-200d-1f393":0,"1f468-1f3fe-200d-1f393":0,"1f468-1f3ff-200d-1f393":0,"1f468-1f3fb-200d-1f3a4":0,"1f468-1f3fc-200d-1f3a4":0,"1f468-1f3fd-200d-1f3a4":0,"1f468-1f3fe-200d-1f3a4":0,"1f468-1f3ff-200d-1f3a4":0,"1f468-1f3fb-200d-1f3a8":0,"1f468-1f3fc-200d-1f3a8":0,"1f468-1f3fd-200d-1f3a8":0,"1f468-1f3fe-200d-1f3a8":0,"1f468-1f3ff-200d-1f3a8":0,"1f468-1f3fb-200d-1f3eb":0,"1f468-1f3fc-200d-1f3eb":0,"1f468-1f3fd-200d-1f3eb":0,"1f468-1f3fe-200d-1f3eb":0,"1f468-1f3ff-200d-1f3eb":0,"1f468-1f3fb-200d-1f3ed":0,"1f468-1f3fc-200d-1f3ed":0,"1f468-1f3fd-200d-1f3ed":0,"1f468-1f3fe-200d-1f3ed":0,"1f468-1f3ff-200d-1f3ed":0,"1f468-1f3fb-200d-1f4bb":0,"1f468-1f3fc-200d-1f4bb":0,"1f468-1f3fd-200d-1f4bb":0,"1f468-1f3fe-200d-1f4bb":0,"1f468-1f3ff-200d-1f4bb":0,"1f468-1f3fb-200d-1f4bc":0,"1f468-1f3fc-200d-1f4bc":0,"1f468-1f3fd-200d-1f4bc":0,"1f468-1f3fe-200d-1f4bc":0,"1f468-1f3ff-200d-1f4bc":0,"1f468-1f3fb-200d-1f527":0,"1f468-1f3fc-200d-1f527":0,"1f468-1f3fd-200d-1f527":0,"1f468-1f3fe-200d-1f527":0,"1f468-1f3ff-200d-1f527":0,"1f468-1f3fb-200d-1f52c":0,"1f468-1f3fc-200d-1f52c":0,"1f468-1f3fd-200d-1f52c":0,"1f468-1f3fe-200d-1f52c":0,"1f468-1f3ff-200d-1f52c":0,"1f468-1f3fb-200d-1f680":0,"1f468-1f3fc-200d-1f680":0,"1f468-1f3fd-200d-1f680":0,"1f468-1f3fe-200d-1f680":0,"1f468-1f3ff-200d-1f680":0,"1f468-1f3fb-200d-1f692":0,"1f468-1f3fc-200d-1f692":0,"1f468-1f3fd-200d-1f692":0,"1f468-1f3fe-200d-1f692":0,"1f468-1f3ff-200d-1f692":0,"1f468-1f3fb-200d-1f9af":0,"1f468-1f3fc-200d-1f9af":0,"1f468-1f3fd-200d-1f9af":0,"1f468-1f3fe-200d-1f9af":0,"1f468-1f3ff-200d-1f9af":0,"1f468-1f3fb-200d-1f9b0":0,"1f468-1f3fc-200d-1f9b0":0,"1f468-1f3fd-200d-1f9b0":0,"1f468-1f3fe-200d-1f9b0":0,"1f468-1f3ff-200d-1f9b0":0,"1f468-1f3fb-200d-1f9b1":0,"1f468-1f3fc-200d-1f9b1":0,"1f468-1f3fd-200d-1f9b1":0,"1f468-1f3fe-200d-1f9b1":0,"1f468-1f3ff-200d-1f9b1":0,"1f468-1f3fb-200d-1f9b2":0,"1f468-1f3fc-200d-1f9b2":0,"1f468-1f3fd-200d-1f9b2":0,"1f468-1f3fe-200d-1f9b2":0,"1f468-1f3ff-200d-1f9b2":0,"1f468-1f3fb-200d-1f9b3":0,"1f468-1f3fc-200d-1f9b3":0,"1f468-1f3fd-200d-1f9b3":0,"1f468-1f3fe-200d-1f9b3":0,"1f468-1f3ff-200d-1f9b3":0,"1f468-1f3fb-200d-1f9bc":0,"1f468-1f3fc-200d-1f9bc":0,"1f468-1f3fd-200d-1f9bc":0,"1f468-1f3fe-200d-1f9bc":0,"1f468-1f3ff-200d-1f9bc":0,"1f468-1f3fb-200d-1f9bd":0,"1f468-1f3fc-200d-1f9bd":0,"1f468-1f3fd-200d-1f9bd":0,"1f468-1f3fe-200d-1f9bd":0,"1f468-1f3ff-200d-1f9bd":0,"1f468-1f3fb-200d-2695":0,"1f468-1f3fc-200d-2695":0,"1f468-1f3fd-200d-2695":0,"1f468-1f3fe-200d-2695":0,"1f468-1f3ff-200d-2695":0,"1f468-1f3fb-200d-2696":0,"1f468-1f3fc-200d-2696":0,"1f468-1f3fd-200d-2696":0,"1f468-1f3fe-200d-2696":0,"1f468-1f3ff-200d-2696":0,"1f468-1f3fb-200d-2708":0,"1f468-1f3fc-200d-2708":0,"1f468-1f3fd-200d-2708":0,"1f468-1f3fe-200d-2708":0,"1f468-1f3ff-200d-2708":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f468-1f3fb":0,"1f468-1f3fc":0,"1f468-1f3fd":0,"1f468-1f3fe":0,"1f468-1f3ff":0,"1f469-1f3fb-200d-1f33e":0,"1f469-1f3fc-200d-1f33e":0,"1f469-1f3fd-200d-1f33e":0,"1f469-1f3fe-200d-1f33e":0,"1f469-1f3ff-200d-1f33e":0,"1f469-1f3fb-200d-1f373":0,"1f469-1f3fc-200d-1f373":0,"1f469-1f3fd-200d-1f373":0,"1f469-1f3fe-200d-1f373":0,"1f469-1f3ff-200d-1f373":0,"1f469-1f3fb-200d-1f37c":0,"1f469-1f3fc-200d-1f37c":0,"1f469-1f3fd-200d-1f37c":0,"1f469-1f3fe-200d-1f37c":0,"1f469-1f3ff-200d-1f37c":0,"1f469-1f3fb-200d-1f393":0,"1f469-1f3fc-200d-1f393":0,"1f469-1f3fd-200d-1f393":0,"1f469-1f3fe-200d-1f393":0,"1f469-1f3ff-200d-1f393":0,"1f469-1f3fb-200d-1f3a4":0,"1f469-1f3fc-200d-1f3a4":0,"1f469-1f3fd-200d-1f3a4":0,"1f469-1f3fe-200d-1f3a4":0,"1f469-1f3ff-200d-1f3a4":0,"1f469-1f3fb-200d-1f3a8":0,"1f469-1f3fc-200d-1f3a8":0,"1f469-1f3fd-200d-1f3a8":0,"1f469-1f3fe-200d-1f3a8":0,"1f469-1f3ff-200d-1f3a8":0,"1f469-1f3fb-200d-1f3eb":0,"1f469-1f3fc-200d-1f3eb":0,"1f469-1f3fd-200d-1f3eb":0,"1f469-1f3fe-200d-1f3eb":0,"1f469-1f3ff-200d-1f3eb":0,"1f469-1f3fb-200d-1f3ed":0,"1f469-1f3fc-200d-1f3ed":0,"1f469-1f3fd-200d-1f3ed":0,"1f469-1f3fe-200d-1f3ed":0,"1f469-1f3ff-200d-1f3ed":0,"1f469-1f3fb-200d-1f4bb":0,"1f469-1f3fc-200d-1f4bb":0,"1f469-1f3fd-200d-1f4bb":0,"1f469-1f3fe-200d-1f4bb":0,"1f469-1f3ff-200d-1f4bb":0,"1f469-1f3fb-200d-1f4bc":0,"1f469-1f3fc-200d-1f4bc":0,"1f469-1f3fd-200d-1f4bc":0,"1f469-1f3fe-200d-1f4bc":0,"1f469-1f3ff-200d-1f4bc":0,"1f469-1f3fb-200d-1f527":0,"1f469-1f3fc-200d-1f527":0,"1f469-1f3fd-200d-1f527":0,"1f469-1f3fe-200d-1f527":0,"1f469-1f3ff-200d-1f527":0,"1f469-1f3fb-200d-1f52c":0,"1f469-1f3fc-200d-1f52c":0,"1f469-1f3fd-200d-1f52c":0,"1f469-1f3fe-200d-1f52c":0,"1f469-1f3ff-200d-1f52c":0,"1f469-1f3fb-200d-1f680":0,"1f469-1f3fc-200d-1f680":0,"1f469-1f3fd-200d-1f680":0,"1f469-1f3fe-200d-1f680":0,"1f469-1f3ff-200d-1f680":0,"1f469-1f3fb-200d-1f692":0,"1f469-1f3fc-200d-1f692":0,"1f469-1f3fd-200d-1f692":0,"1f469-1f3fe-200d-1f692":0,"1f469-1f3ff-200d-1f692":0,"1f469-1f3fb-200d-1f9af":0,"1f469-1f3fc-200d-1f9af":0,"1f469-1f3fd-200d-1f9af":0,"1f469-1f3fe-200d-1f9af":0,"1f469-1f3ff-200d-1f9af":0,"1f469-1f3fb-200d-1f9b0":0,"1f469-1f3fc-200d-1f9b0":0,"1f469-1f3fd-200d-1f9b0":0,"1f469-1f3fe-200d-1f9b0":0,"1f469-1f3ff-200d-1f9b0":0,"1f469-1f3fb-200d-1f9b1":0,"1f469-1f3fc-200d-1f9b1":0,"1f469-1f3fd-200d-1f9b1":0,"1f469-1f3fe-200d-1f9b1":0,"1f469-1f3ff-200d-1f9b1":0,"1f469-1f3fb-200d-1f9b2":0,"1f469-1f3fc-200d-1f9b2":0,"1f469-1f3fd-200d-1f9b2":0,"1f469-1f3fe-200d-1f9b2":0,"1f469-1f3ff-200d-1f9b2":0,"1f469-1f3fb-200d-1f9b3":0,"1f469-1f3fc-200d-1f9b3":0,"1f469-1f3fd-200d-1f9b3":0,"1f469-1f3fe-200d-1f9b3":0,"1f469-1f3ff-200d-1f9b3":0,"1f469-1f3fb-200d-1f9bc":0,"1f469-1f3fc-200d-1f9bc":0,"1f469-1f3fd-200d-1f9bc":0,"1f469-1f3fe-200d-1f9bc":0,"1f469-1f3ff-200d-1f9bc":0,"1f469-1f3fb-200d-1f9bd":0,"1f469-1f3fc-200d-1f9bd":0,"1f469-1f3fd-200d-1f9bd":0,"1f469-1f3fe-200d-1f9bd":0,"1f469-1f3ff-200d-1f9bd":0,"1f469-1f3fb-200d-2695":0,"1f469-1f3fc-200d-2695":0,"1f469-1f3fd-200d-2695":0,"1f469-1f3fe-200d-2695":0,"1f469-1f3ff-200d-2695":0,"1f469-1f3fb-200d-2696":0,"1f469-1f3fc-200d-2696":0,"1f469-1f3fd-200d-2696":0,"1f469-1f3fe-200d-2696":0,"1f469-1f3ff-200d-2696":0,"1f469-1f3fb-200d-2708":0,"1f469-1f3fc-200d-2708":0,"1f469-1f3fd-200d-2708":0,"1f469-1f3fe-200d-2708":0,"1f469-1f3ff-200d-2708":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f469-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe":0,"1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff":0,"1f469-1f3fb":0,"1f469-1f3fc":0,"1f469-1f3fd":0,"1f469-1f3fe":0,"1f469-1f3ff":0,"1f46b-1f3fb":0,"1f46b-1f3fc":0,"1f46b-1f3fd":0,"1f46b-1f3fe":0,"1f46b-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46c-1f3fb":0,"1f46c-1f3fc":0,"1f46c-1f3fd":0,"1f46c-1f3fe":0,"1f46c-1f3ff":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe":0,"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd":0,"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe":0,"1f46d-1f3fb":0,"1f46d-1f3fc":0,"1f46d-1f3fd":0,"1f46d-1f3fe":0,"1f46d-1f3ff":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe":0,"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd":0,"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe":0,"1f46e-1f3fb-200d-2640":0,"1f46e-1f3fc-200d-2640":0,"1f46e-1f3fd-200d-2640":0,"1f46e-1f3fe-200d-2640":0,"1f46e-1f3ff-200d-2640":0,"1f46e-1f3fb-200d-2642":0,"1f46e-1f3fc-200d-2642":0,"1f46e-1f3fd-200d-2642":0,"1f46e-1f3fe-200d-2642":0,"1f46e-1f3ff-200d-2642":0,"1f46e-1f3fb":0,"1f46e-1f3fc":0,"1f46e-1f3fd":0,"1f46e-1f3fe":0,"1f46e-1f3ff":0,"1f470-1f3fb-200d-2640":0,"1f470-1f3fc-200d-2640":0,"1f470-1f3fd-200d-2640":0,"1f470-1f3fe-200d-2640":0,"1f470-1f3ff-200d-2640":0,"1f470-1f3fb-200d-2642":0,"1f470-1f3fc-200d-2642":0,"1f470-1f3fd-200d-2642":0,"1f470-1f3fe-200d-2642":0,"1f470-1f3ff-200d-2642":0,"1f470-1f3fb":0,"1f470-1f3fc":0,"1f470-1f3fd":0,"1f470-1f3fe":0,"1f470-1f3ff":0,"1f471-1f3fb-200d-2640":0,"1f471-1f3fc-200d-2640":0,"1f471-1f3fd-200d-2640":0,"1f471-1f3fe-200d-2640":0,"1f471-1f3ff-200d-2640":0,"1f471-1f3fb-200d-2642":0,"1f471-1f3fc-200d-2642":0,"1f471-1f3fd-200d-2642":0,"1f471-1f3fe-200d-2642":0,"1f471-1f3ff-200d-2642":0,"1f471-1f3fb":0,"1f471-1f3fc":0,"1f471-1f3fd":0,"1f471-1f3fe":0,"1f471-1f3ff":0,"1f472-1f3fb":0,"1f472-1f3fc":0,"1f472-1f3fd":0,"1f472-1f3fe":0,"1f472-1f3ff":0,"1f473-1f3fb-200d-2640":0,"1f473-1f3fc-200d-2640":0,"1f473-1f3fd-200d-2640":0,"1f473-1f3fe-200d-2640":0,"1f473-1f3ff-200d-2640":0,"1f473-1f3fb-200d-2642":0,"1f473-1f3fc-200d-2642":0,"1f473-1f3fd-200d-2642":0,"1f473-1f3fe-200d-2642":0,"1f473-1f3ff-200d-2642":0,"1f473-1f3fb":0,"1f473-1f3fc":0,"1f473-1f3fd":0,"1f473-1f3fe":0,"1f473-1f3ff":0,"1f474-1f3fb":0,"1f474-1f3fc":0,"1f474-1f3fd":0,"1f474-1f3fe":0,"1f474-1f3ff":0,"1f475-1f3fb":0,"1f475-1f3fc":0,"1f475-1f3fd":0,"1f475-1f3fe":0,"1f475-1f3ff":0,"1f476-1f3fb":0,"1f476-1f3fc":0,"1f476-1f3fd":0,"1f476-1f3fe":0,"1f476-1f3ff":0,"1f477-1f3fb-200d-2640":0,"1f477-1f3fc-200d-2640":0,"1f477-1f3fd-200d-2640":0,"1f477-1f3fe-200d-2640":0,"1f477-1f3ff-200d-2640":0,"1f477-1f3fb-200d-2642":0,"1f477-1f3fc-200d-2642":0,"1f477-1f3fd-200d-2642":0,"1f477-1f3fe-200d-2642":0,"1f477-1f3ff-200d-2642":0,"1f477-1f3fb":0,"1f477-1f3fc":0,"1f477-1f3fd":0,"1f477-1f3fe":0,"1f477-1f3ff":0,"1f478-1f3fb":0,"1f478-1f3fc":0,"1f478-1f3fd":0,"1f478-1f3fe":0,"1f478-1f3ff":0,"1f47c-1f3fb":0,"1f47c-1f3fc":0,"1f47c-1f3fd":0,"1f47c-1f3fe":0,"1f47c-1f3ff":0,"1f481-1f3fb-200d-2640":0,"1f481-1f3fc-200d-2640":0,"1f481-1f3fd-200d-2640":0,"1f481-1f3fe-200d-2640":0,"1f481-1f3ff-200d-2640":0,"1f481-1f3fb-200d-2642":0,"1f481-1f3fc-200d-2642":0,"1f481-1f3fd-200d-2642":0,"1f481-1f3fe-200d-2642":0,"1f481-1f3ff-200d-2642":0,"1f481-1f3fb":0,"1f481-1f3fc":0,"1f481-1f3fd":0,"1f481-1f3fe":0,"1f481-1f3ff":0,"1f482-1f3fb-200d-2640":0,"1f482-1f3fc-200d-2640":0,"1f482-1f3fd-200d-2640":0,"1f482-1f3fe-200d-2640":0,"1f482-1f3ff-200d-2640":0,"1f482-1f3fb-200d-2642":0,"1f482-1f3fc-200d-2642":0,"1f482-1f3fd-200d-2642":0,"1f482-1f3fe-200d-2642":0,"1f482-1f3ff-200d-2642":0,"1f482-1f3fb":0,"1f482-1f3fc":0,"1f482-1f3fd":0,"1f482-1f3fe":0,"1f482-1f3ff":0,"1f483-1f3fb":0,"1f483-1f3fc":0,"1f483-1f3fd":0,"1f483-1f3fe":0,"1f483-1f3ff":0,"1f485-1f3fb":0,"1f485-1f3fc":0,"1f485-1f3fd":0,"1f485-1f3fe":0,"1f485-1f3ff":0,"1f486-1f3fb-200d-2640":0,"1f486-1f3fc-200d-2640":0,"1f486-1f3fd-200d-2640":0,"1f486-1f3fe-200d-2640":0,"1f486-1f3ff-200d-2640":0,"1f486-1f3fb-200d-2642":0,"1f486-1f3fc-200d-2642":0,"1f486-1f3fd-200d-2642":0,"1f486-1f3fe-200d-2642":0,"1f486-1f3ff-200d-2642":0,"1f486-1f3fb":0,"1f486-1f3fc":0,"1f486-1f3fd":0,"1f486-1f3fe":0,"1f486-1f3ff":0,"1f487-1f3fb-200d-2640":0,"1f487-1f3fc-200d-2640":0,"1f487-1f3fd-200d-2640":0,"1f487-1f3fe-200d-2640":0,"1f487-1f3ff-200d-2640":0,"1f487-1f3fb-200d-2642":0,"1f487-1f3fc-200d-2642":0,"1f487-1f3fd-200d-2642":0,"1f487-1f3fe-200d-2642":0,"1f487-1f3ff-200d-2642":0,"1f487-1f3fb":0,"1f487-1f3fc":0,"1f487-1f3fd":0,"1f487-1f3fe":0,"1f487-1f3ff":0,"1f48f-1f3fb":0,"1f48f-1f3fc":0,"1f48f-1f3fd":0,"1f48f-1f3fe":0,"1f48f-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe":0,"1f491-1f3fb":0,"1f491-1f3fc":0,"1f491-1f3fd":0,"1f491-1f3fe":0,"1f491-1f3ff":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe":0,"1f4aa-1f3fb":0,"1f4aa-1f3fc":0,"1f4aa-1f3fd":0,"1f4aa-1f3fe":0,"1f4aa-1f3ff":0,"1f574-1f3fb":0,"1f574-1f3fc":0,"1f574-1f3fd":0,"1f574-1f3fe":0,"1f574-1f3ff":0,"1f575-1f3fb-200d-2640":0,"1f575-1f3fc-200d-2640":0,"1f575-1f3fd-200d-2640":0,"1f575-1f3fe-200d-2640":0,"1f575-1f3ff-200d-2640":0,"1f575-1f3fb-200d-2642":0,"1f575-1f3fc-200d-2642":0,"1f575-1f3fd-200d-2642":0,"1f575-1f3fe-200d-2642":0,"1f575-1f3ff-200d-2642":0,"1f575-1f3fb":0,"1f575-1f3fc":0,"1f575-1f3fd":0,"1f575-1f3fe":0,"1f575-1f3ff":0,"1f57a-1f3fb":0,"1f57a-1f3fc":0,"1f57a-1f3fd":0,"1f57a-1f3fe":0,"1f57a-1f3ff":0,"1f590-1f3fb":0,"1f590-1f3fc":0,"1f590-1f3fd":0,"1f590-1f3fe":0,"1f590-1f3ff":0,"1f595-1f3fb":0,"1f595-1f3fc":0,"1f595-1f3fd":0,"1f595-1f3fe":0,"1f595-1f3ff":0,"1f596-1f3fb":0,"1f596-1f3fc":0,"1f596-1f3fd":0,"1f596-1f3fe":0,"1f596-1f3ff":0,"1f645-1f3fb-200d-2640":0,"1f645-1f3fc-200d-2640":0,"1f645-1f3fd-200d-2640":0,"1f645-1f3fe-200d-2640":0,"1f645-1f3ff-200d-2640":0,"1f645-1f3fb-200d-2642":0,"1f645-1f3fc-200d-2642":0,"1f645-1f3fd-200d-2642":0,"1f645-1f3fe-200d-2642":0,"1f645-1f3ff-200d-2642":0,"1f645-1f3fb":0,"1f645-1f3fc":0,"1f645-1f3fd":0,"1f645-1f3fe":0,"1f645-1f3ff":0,"1f646-1f3fb-200d-2640":0,"1f646-1f3fc-200d-2640":0,"1f646-1f3fd-200d-2640":0,"1f646-1f3fe-200d-2640":0,"1f646-1f3ff-200d-2640":0,"1f646-1f3fb-200d-2642":0,"1f646-1f3fc-200d-2642":0,"1f646-1f3fd-200d-2642":0,"1f646-1f3fe-200d-2642":0,"1f646-1f3ff-200d-2642":0,"1f646-1f3fb":0,"1f646-1f3fc":0,"1f646-1f3fd":0,"1f646-1f3fe":0,"1f646-1f3ff":0,"1f647-1f3fb-200d-2640":0,"1f647-1f3fc-200d-2640":0,"1f647-1f3fd-200d-2640":0,"1f647-1f3fe-200d-2640":0,"1f647-1f3ff-200d-2640":0,"1f647-1f3fb-200d-2642":0,"1f647-1f3fc-200d-2642":0,"1f647-1f3fd-200d-2642":0,"1f647-1f3fe-200d-2642":0,"1f647-1f3ff-200d-2642":0,"1f647-1f3fb":0,"1f647-1f3fc":0,"1f647-1f3fd":0,"1f647-1f3fe":0,"1f647-1f3ff":0,"1f64b-1f3fb-200d-2640":0,"1f64b-1f3fc-200d-2640":0,"1f64b-1f3fd-200d-2640":0,"1f64b-1f3fe-200d-2640":0,"1f64b-1f3ff-200d-2640":0,"1f64b-1f3fb-200d-2642":0,"1f64b-1f3fc-200d-2642":0,"1f64b-1f3fd-200d-2642":0,"1f64b-1f3fe-200d-2642":0,"1f64b-1f3ff-200d-2642":0,"1f64b-1f3fb":0,"1f64b-1f3fc":0,"1f64b-1f3fd":0,"1f64b-1f3fe":0,"1f64b-1f3ff":0,"1f64c-1f3fb":0,"1f64c-1f3fc":0,"1f64c-1f3fd":0,"1f64c-1f3fe":0,"1f64c-1f3ff":0,"1f64d-1f3fb-200d-2640":0,"1f64d-1f3fc-200d-2640":0,"1f64d-1f3fd-200d-2640":0,"1f64d-1f3fe-200d-2640":0,"1f64d-1f3ff-200d-2640":0,"1f64d-1f3fb-200d-2642":0,"1f64d-1f3fc-200d-2642":0,"1f64d-1f3fd-200d-2642":0,"1f64d-1f3fe-200d-2642":0,"1f64d-1f3ff-200d-2642":0,"1f64d-1f3fb":0,"1f64d-1f3fc":0,"1f64d-1f3fd":0,"1f64d-1f3fe":0,"1f64d-1f3ff":0,"1f64e-1f3fb-200d-2640":0,"1f64e-1f3fc-200d-2640":0,"1f64e-1f3fd-200d-2640":0,"1f64e-1f3fe-200d-2640":0,"1f64e-1f3ff-200d-2640":0,"1f64e-1f3fb-200d-2642":0,"1f64e-1f3fc-200d-2642":0,"1f64e-1f3fd-200d-2642":0,"1f64e-1f3fe-200d-2642":0,"1f64e-1f3ff-200d-2642":0,"1f64e-1f3fb":0,"1f64e-1f3fc":0,"1f64e-1f3fd":0,"1f64e-1f3fe":0,"1f64e-1f3ff":0,"1f64f-1f3fb":0,"1f64f-1f3fc":0,"1f64f-1f3fd":0,"1f64f-1f3fe":0,"1f64f-1f3ff":0,"1f6a3-1f3fb-200d-2640":0,"1f6a3-1f3fc-200d-2640":0,"1f6a3-1f3fd-200d-2640":0,"1f6a3-1f3fe-200d-2640":0,"1f6a3-1f3ff-200d-2640":0,"1f6a3-1f3fb-200d-2642":0,"1f6a3-1f3fc-200d-2642":0,"1f6a3-1f3fd-200d-2642":0,"1f6a3-1f3fe-200d-2642":0,"1f6a3-1f3ff-200d-2642":0,"1f6a3-1f3fb":0,"1f6a3-1f3fc":0,"1f6a3-1f3fd":0,"1f6a3-1f3fe":0,"1f6a3-1f3ff":0,"1f6b4-1f3fb-200d-2640":0,"1f6b4-1f3fc-200d-2640":0,"1f6b4-1f3fd-200d-2640":0,"1f6b4-1f3fe-200d-2640":0,"1f6b4-1f3ff-200d-2640":0,"1f6b4-1f3fb-200d-2642":0,"1f6b4-1f3fc-200d-2642":0,"1f6b4-1f3fd-200d-2642":0,"1f6b4-1f3fe-200d-2642":0,"1f6b4-1f3ff-200d-2642":0,"1f6b4-1f3fb":0,"1f6b4-1f3fc":0,"1f6b4-1f3fd":0,"1f6b4-1f3fe":0,"1f6b4-1f3ff":0,"1f6b5-1f3fb-200d-2640":0,"1f6b5-1f3fc-200d-2640":0,"1f6b5-1f3fd-200d-2640":0,"1f6b5-1f3fe-200d-2640":0,"1f6b5-1f3ff-200d-2640":0,"1f6b5-1f3fb-200d-2642":0,"1f6b5-1f3fc-200d-2642":0,"1f6b5-1f3fd-200d-2642":0,"1f6b5-1f3fe-200d-2642":0,"1f6b5-1f3ff-200d-2642":0,"1f6b5-1f3fb":0,"1f6b5-1f3fc":0,"1f6b5-1f3fd":0,"1f6b5-1f3fe":0,"1f6b5-1f3ff":0,"1f6b6-1f3fb-200d-2640":0,"1f6b6-1f3fc-200d-2640":0,"1f6b6-1f3fd-200d-2640":0,"1f6b6-1f3fe-200d-2640":0,"1f6b6-1f3ff-200d-2640":0,"1f6b6-1f3fb-200d-2642":0,"1f6b6-1f3fc-200d-2642":0,"1f6b6-1f3fd-200d-2642":0,"1f6b6-1f3fe-200d-2642":0,"1f6b6-1f3ff-200d-2642":0,"1f6b6-1f3fb":0,"1f6b6-1f3fc":0,"1f6b6-1f3fd":0,"1f6b6-1f3fe":0,"1f6b6-1f3ff":0,"1f6c0-1f3fb":0,"1f6c0-1f3fc":0,"1f6c0-1f3fd":0,"1f6c0-1f3fe":0,"1f6c0-1f3ff":0,"1f6cc-1f3fb":0,"1f6cc-1f3fc":0,"1f6cc-1f3fd":0,"1f6cc-1f3fe":0,"1f6cc-1f3ff":0,"1f90c-1f3fb":0,"1f90c-1f3fc":0,"1f90c-1f3fd":0,"1f90c-1f3fe":0,"1f90c-1f3ff":0,"1f90f-1f3fb":0,"1f90f-1f3fc":0,"1f90f-1f3fd":0,"1f90f-1f3fe":0,"1f90f-1f3ff":0,"1f918-1f3fb":0,"1f918-1f3fc":0,"1f918-1f3fd":0,"1f918-1f3fe":0,"1f918-1f3ff":0,"1f919-1f3fb":0,"1f919-1f3fc":0,"1f919-1f3fd":0,"1f919-1f3fe":0,"1f919-1f3ff":0,"1f91a-1f3fb":0,"1f91a-1f3fc":0,"1f91a-1f3fd":0,"1f91a-1f3fe":0,"1f91a-1f3ff":0,"1f91b-1f3fb":0,"1f91b-1f3fc":0,"1f91b-1f3fd":0,"1f91b-1f3fe":0,"1f91b-1f3ff":0,"1f91c-1f3fb":0,"1f91c-1f3fc":0,"1f91c-1f3fd":0,"1f91c-1f3fe":0,"1f91c-1f3ff":0,"1f91d-1f3fb":0,"1f91d-1f3fc":0,"1f91d-1f3fd":0,"1f91d-1f3fe":0,"1f91d-1f3ff":0,"1f91e-1f3fb":0,"1f91e-1f3fc":0,"1f91e-1f3fd":0,"1f91e-1f3fe":0,"1f91e-1f3ff":0,"1f91f-1f3fb":0,"1f91f-1f3fc":0,"1f91f-1f3fd":0,"1f91f-1f3fe":0,"1f91f-1f3ff":0,"1f926-1f3fb-200d-2640":0,"1f926-1f3fc-200d-2640":0,"1f926-1f3fd-200d-2640":0,"1f926-1f3fe-200d-2640":0,"1f926-1f3ff-200d-2640":0,"1f926-1f3fb-200d-2642":0,"1f926-1f3fc-200d-2642":0,"1f926-1f3fd-200d-2642":0,"1f926-1f3fe-200d-2642":0,"1f926-1f3ff-200d-2642":0,"1f926-1f3fb":0,"1f926-1f3fc":0,"1f926-1f3fd":0,"1f926-1f3fe":0,"1f926-1f3ff":0,"1f930-1f3fb":0,"1f930-1f3fc":0,"1f930-1f3fd":0,"1f930-1f3fe":0,"1f930-1f3ff":0,"1f931-1f3fb":0,"1f931-1f3fc":0,"1f931-1f3fd":0,"1f931-1f3fe":0,"1f931-1f3ff":0,"1f932-1f3fb":0,"1f932-1f3fc":0,"1f932-1f3fd":0,"1f932-1f3fe":0,"1f932-1f3ff":0,"1f933-1f3fb":0,"1f933-1f3fc":0,"1f933-1f3fd":0,"1f933-1f3fe":0,"1f933-1f3ff":0,"1f934-1f3fb":0,"1f934-1f3fc":0,"1f934-1f3fd":0,"1f934-1f3fe":0,"1f934-1f3ff":0,"1f935-1f3fb-200d-2640":0,"1f935-1f3fc-200d-2640":0,"1f935-1f3fd-200d-2640":0,"1f935-1f3fe-200d-2640":0,"1f935-1f3ff-200d-2640":0,"1f935-1f3fb-200d-2642":0,"1f935-1f3fc-200d-2642":0,"1f935-1f3fd-200d-2642":0,"1f935-1f3fe-200d-2642":0,"1f935-1f3ff-200d-2642":0,"1f935-1f3fb":0,"1f935-1f3fc":0,"1f935-1f3fd":0,"1f935-1f3fe":0,"1f935-1f3ff":0,"1f936-1f3fb":0,"1f936-1f3fc":0,"1f936-1f3fd":0,"1f936-1f3fe":0,"1f936-1f3ff":0,"1f937-1f3fb-200d-2640":0,"1f937-1f3fc-200d-2640":0,"1f937-1f3fd-200d-2640":0,"1f937-1f3fe-200d-2640":0,"1f937-1f3ff-200d-2640":0,"1f937-1f3fb-200d-2642":0,"1f937-1f3fc-200d-2642":0,"1f937-1f3fd-200d-2642":0,"1f937-1f3fe-200d-2642":0,"1f937-1f3ff-200d-2642":0,"1f937-1f3fb":0,"1f937-1f3fc":0,"1f937-1f3fd":0,"1f937-1f3fe":0,"1f937-1f3ff":0,"1f938-1f3fb-200d-2640":0,"1f938-1f3fc-200d-2640":0,"1f938-1f3fd-200d-2640":0,"1f938-1f3fe-200d-2640":0,"1f938-1f3ff-200d-2640":0,"1f938-1f3fb-200d-2642":0,"1f938-1f3fc-200d-2642":0,"1f938-1f3fd-200d-2642":0,"1f938-1f3fe-200d-2642":0,"1f938-1f3ff-200d-2642":0,"1f938-1f3fb":0,"1f938-1f3fc":0,"1f938-1f3fd":0,"1f938-1f3fe":0,"1f938-1f3ff":0,"1f939-1f3fb-200d-2640":0,"1f939-1f3fc-200d-2640":0,"1f939-1f3fd-200d-2640":0,"1f939-1f3fe-200d-2640":0,"1f939-1f3ff-200d-2640":0,"1f939-1f3fb-200d-2642":0,"1f939-1f3fc-200d-2642":0,"1f939-1f3fd-200d-2642":0,"1f939-1f3fe-200d-2642":0,"1f939-1f3ff-200d-2642":0,"1f939-1f3fb":0,"1f939-1f3fc":0,"1f939-1f3fd":0,"1f939-1f3fe":0,"1f939-1f3ff":0,"1f93d-1f3fb-200d-2640":0,"1f93d-1f3fc-200d-2640":0,"1f93d-1f3fd-200d-2640":0,"1f93d-1f3fe-200d-2640":0,"1f93d-1f3ff-200d-2640":0,"1f93d-1f3fb-200d-2642":0,"1f93d-1f3fc-200d-2642":0,"1f93d-1f3fd-200d-2642":0,"1f93d-1f3fe-200d-2642":0,"1f93d-1f3ff-200d-2642":0,"1f93d-1f3fb":0,"1f93d-1f3fc":0,"1f93d-1f3fd":0,"1f93d-1f3fe":0,"1f93d-1f3ff":0,"1f93e-1f3fb-200d-2640":0,"1f93e-1f3fc-200d-2640":0,"1f93e-1f3fd-200d-2640":0,"1f93e-1f3fe-200d-2640":0,"1f93e-1f3ff-200d-2640":0,"1f93e-1f3fb-200d-2642":0,"1f93e-1f3fc-200d-2642":0,"1f93e-1f3fd-200d-2642":0,"1f93e-1f3fe-200d-2642":0,"1f93e-1f3ff-200d-2642":0,"1f93e-1f3fb":0,"1f93e-1f3fc":0,"1f93e-1f3fd":0,"1f93e-1f3fe":0,"1f93e-1f3ff":0,"1f977-1f3fb":0,"1f977-1f3fc":0,"1f977-1f3fd":0,"1f977-1f3fe":0,"1f977-1f3ff":0,"1f9b5-1f3fb":0,"1f9b5-1f3fc":0,"1f9b5-1f3fd":0,"1f9b5-1f3fe":0,"1f9b5-1f3ff":0,"1f9b6-1f3fb":0,"1f9b6-1f3fc":0,"1f9b6-1f3fd":0,"1f9b6-1f3fe":0,"1f9b6-1f3ff":0,"1f9b8-1f3fb-200d-2640":0,"1f9b8-1f3fc-200d-2640":0,"1f9b8-1f3fd-200d-2640":0,"1f9b8-1f3fe-200d-2640":0,"1f9b8-1f3ff-200d-2640":0,"1f9b8-1f3fb-200d-2642":0,"1f9b8-1f3fc-200d-2642":0,"1f9b8-1f3fd-200d-2642":0,"1f9b8-1f3fe-200d-2642":0,"1f9b8-1f3ff-200d-2642":0,"1f9b8-1f3fb":0,"1f9b8-1f3fc":0,"1f9b8-1f3fd":0,"1f9b8-1f3fe":0,"1f9b8-1f3ff":0,"1f9b9-1f3fb-200d-2640":0,"1f9b9-1f3fc-200d-2640":0,"1f9b9-1f3fd-200d-2640":0,"1f9b9-1f3fe-200d-2640":0,"1f9b9-1f3ff-200d-2640":0,"1f9b9-1f3fb-200d-2642":0,"1f9b9-1f3fc-200d-2642":0,"1f9b9-1f3fd-200d-2642":0,"1f9b9-1f3fe-200d-2642":0,"1f9b9-1f3ff-200d-2642":0,"1f9b9-1f3fb":0,"1f9b9-1f3fc":0,"1f9b9-1f3fd":0,"1f9b9-1f3fe":0,"1f9b9-1f3ff":0,"1f9bb-1f3fb":0,"1f9bb-1f3fc":0,"1f9bb-1f3fd":0,"1f9bb-1f3fe":0,"1f9bb-1f3ff":0,"1f9cd-1f3fb-200d-2640":0,"1f9cd-1f3fc-200d-2640":0,"1f9cd-1f3fd-200d-2640":0,"1f9cd-1f3fe-200d-2640":0,"1f9cd-1f3ff-200d-2640":0,"1f9cd-1f3fb-200d-2642":0,"1f9cd-1f3fc-200d-2642":0,"1f9cd-1f3fd-200d-2642":0,"1f9cd-1f3fe-200d-2642":0,"1f9cd-1f3ff-200d-2642":0,"1f9cd-1f3fb":0,"1f9cd-1f3fc":0,"1f9cd-1f3fd":0,"1f9cd-1f3fe":0,"1f9cd-1f3ff":0,"1f9ce-1f3fb-200d-2640":0,"1f9ce-1f3fc-200d-2640":0,"1f9ce-1f3fd-200d-2640":0,"1f9ce-1f3fe-200d-2640":0,"1f9ce-1f3ff-200d-2640":0,"1f9ce-1f3fb-200d-2642":0,"1f9ce-1f3fc-200d-2642":0,"1f9ce-1f3fd-200d-2642":0,"1f9ce-1f3fe-200d-2642":0,"1f9ce-1f3ff-200d-2642":0,"1f9ce-1f3fb":0,"1f9ce-1f3fc":0,"1f9ce-1f3fd":0,"1f9ce-1f3fe":0,"1f9ce-1f3ff":0,"1f9cf-1f3fb-200d-2640":0,"1f9cf-1f3fc-200d-2640":0,"1f9cf-1f3fd-200d-2640":0,"1f9cf-1f3fe-200d-2640":0,"1f9cf-1f3ff-200d-2640":0,"1f9cf-1f3fb-200d-2642":0,"1f9cf-1f3fc-200d-2642":0,"1f9cf-1f3fd-200d-2642":0,"1f9cf-1f3fe-200d-2642":0,"1f9cf-1f3ff-200d-2642":0,"1f9cf-1f3fb":0,"1f9cf-1f3fc":0,"1f9cf-1f3fd":0,"1f9cf-1f3fe":0,"1f9cf-1f3ff":0,"1f9d1-1f3fb-200d-1f33e":0,"1f9d1-1f3fc-200d-1f33e":0,"1f9d1-1f3fd-200d-1f33e":0,"1f9d1-1f3fe-200d-1f33e":0,"1f9d1-1f3ff-200d-1f33e":0,"1f9d1-1f3fb-200d-1f373":0,"1f9d1-1f3fc-200d-1f373":0,"1f9d1-1f3fd-200d-1f373":0,"1f9d1-1f3fe-200d-1f373":0,"1f9d1-1f3ff-200d-1f373":0,"1f9d1-1f3fb-200d-1f37c":0,"1f9d1-1f3fc-200d-1f37c":0,"1f9d1-1f3fd-200d-1f37c":0,"1f9d1-1f3fe-200d-1f37c":0,"1f9d1-1f3ff-200d-1f37c":0,"1f9d1-1f3fb-200d-1f384":0,"1f9d1-1f3fc-200d-1f384":0,"1f9d1-1f3fd-200d-1f384":0,"1f9d1-1f3fe-200d-1f384":0,"1f9d1-1f3ff-200d-1f384":0,"1f9d1-1f3fb-200d-1f393":0,"1f9d1-1f3fc-200d-1f393":0,"1f9d1-1f3fd-200d-1f393":0,"1f9d1-1f3fe-200d-1f393":0,"1f9d1-1f3ff-200d-1f393":0,"1f9d1-1f3fb-200d-1f3a4":0,"1f9d1-1f3fc-200d-1f3a4":0,"1f9d1-1f3fd-200d-1f3a4":0,"1f9d1-1f3fe-200d-1f3a4":0,"1f9d1-1f3ff-200d-1f3a4":0,"1f9d1-1f3fb-200d-1f3a8":0,"1f9d1-1f3fc-200d-1f3a8":0,"1f9d1-1f3fd-200d-1f3a8":0,"1f9d1-1f3fe-200d-1f3a8":0,"1f9d1-1f3ff-200d-1f3a8":0,"1f9d1-1f3fb-200d-1f3eb":0,"1f9d1-1f3fc-200d-1f3eb":0,"1f9d1-1f3fd-200d-1f3eb":0,"1f9d1-1f3fe-200d-1f3eb":0,"1f9d1-1f3ff-200d-1f3eb":0,"1f9d1-1f3fb-200d-1f3ed":0,"1f9d1-1f3fc-200d-1f3ed":0,"1f9d1-1f3fd-200d-1f3ed":0,"1f9d1-1f3fe-200d-1f3ed":0,"1f9d1-1f3ff-200d-1f3ed":0,"1f9d1-1f3fb-200d-1f4bb":0,"1f9d1-1f3fc-200d-1f4bb":0,"1f9d1-1f3fd-200d-1f4bb":0,"1f9d1-1f3fe-200d-1f4bb":0,"1f9d1-1f3ff-200d-1f4bb":0,"1f9d1-1f3fb-200d-1f4bc":0,"1f9d1-1f3fc-200d-1f4bc":0,"1f9d1-1f3fd-200d-1f4bc":0,"1f9d1-1f3fe-200d-1f4bc":0,"1f9d1-1f3ff-200d-1f4bc":0,"1f9d1-1f3fb-200d-1f527":0,"1f9d1-1f3fc-200d-1f527":0,"1f9d1-1f3fd-200d-1f527":0,"1f9d1-1f3fe-200d-1f527":0,"1f9d1-1f3ff-200d-1f527":0,"1f9d1-1f3fb-200d-1f52c":0,"1f9d1-1f3fc-200d-1f52c":0,"1f9d1-1f3fd-200d-1f52c":0,"1f9d1-1f3fe-200d-1f52c":0,"1f9d1-1f3ff-200d-1f52c":0,"1f9d1-1f3fb-200d-1f680":0,"1f9d1-1f3fc-200d-1f680":0,"1f9d1-1f3fd-200d-1f680":0,"1f9d1-1f3fe-200d-1f680":0,"1f9d1-1f3ff-200d-1f680":0,"1f9d1-1f3fb-200d-1f692":0,"1f9d1-1f3fc-200d-1f692":0,"1f9d1-1f3fd-200d-1f692":0,"1f9d1-1f3fe-200d-1f692":0,"1f9d1-1f3ff-200d-1f692":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe":0,"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff":0,"1f9d1-1f3fb-200d-1f9af":0,"1f9d1-1f3fc-200d-1f9af":0,"1f9d1-1f3fd-200d-1f9af":0,"1f9d1-1f3fe-200d-1f9af":0,"1f9d1-1f3ff-200d-1f9af":0,"1f9d1-1f3fb-200d-1f9b0":0,"1f9d1-1f3fc-200d-1f9b0":0,"1f9d1-1f3fd-200d-1f9b0":0,"1f9d1-1f3fe-200d-1f9b0":0,"1f9d1-1f3ff-200d-1f9b0":0,"1f9d1-1f3fb-200d-1f9b1":0,"1f9d1-1f3fc-200d-1f9b1":0,"1f9d1-1f3fd-200d-1f9b1":0,"1f9d1-1f3fe-200d-1f9b1":0,"1f9d1-1f3ff-200d-1f9b1":0,"1f9d1-1f3fb-200d-1f9b2":0,"1f9d1-1f3fc-200d-1f9b2":0,"1f9d1-1f3fd-200d-1f9b2":0,"1f9d1-1f3fe-200d-1f9b2":0,"1f9d1-1f3ff-200d-1f9b2":0,"1f9d1-1f3fb-200d-1f9b3":0,"1f9d1-1f3fc-200d-1f9b3":0,"1f9d1-1f3fd-200d-1f9b3":0,"1f9d1-1f3fe-200d-1f9b3":0,"1f9d1-1f3ff-200d-1f9b3":0,"1f9d1-1f3fb-200d-1f9bc":0,"1f9d1-1f3fc-200d-1f9bc":0,"1f9d1-1f3fd-200d-1f9bc":0,"1f9d1-1f3fe-200d-1f9bc":0,"1f9d1-1f3ff-200d-1f9bc":0,"1f9d1-1f3fb-200d-1f9bd":0,"1f9d1-1f3fc-200d-1f9bd":0,"1f9d1-1f3fd-200d-1f9bd":0,"1f9d1-1f3fe-200d-1f9bd":0,"1f9d1-1f3ff-200d-1f9bd":0,"1f9d1-1f3fb-200d-2695":0,"1f9d1-1f3fc-200d-2695":0,"1f9d1-1f3fd-200d-2695":0,"1f9d1-1f3fe-200d-2695":0,"1f9d1-1f3ff-200d-2695":0,"1f9d1-1f3fb-200d-2696":0,"1f9d1-1f3fc-200d-2696":0,"1f9d1-1f3fd-200d-2696":0,"1f9d1-1f3fe-200d-2696":0,"1f9d1-1f3ff-200d-2696":0,"1f9d1-1f3fb-200d-2708":0,"1f9d1-1f3fc-200d-2708":0,"1f9d1-1f3fd-200d-2708":0,"1f9d1-1f3fe-200d-2708":0,"1f9d1-1f3ff-200d-2708":0,"1f9d1-1f3fb":0,"1f9d1-1f3fc":0,"1f9d1-1f3fd":0,"1f9d1-1f3fe":0,"1f9d1-1f3ff":0,"1f9d2-1f3fb":0,"1f9d2-1f3fc":0,"1f9d2-1f3fd":0,"1f9d2-1f3fe":0,"1f9d2-1f3ff":0,"1f9d3-1f3fb":0,"1f9d3-1f3fc":0,"1f9d3-1f3fd":0,"1f9d3-1f3fe":0,"1f9d3-1f3ff":0,"1f9d4-1f3fb-200d-2640":0,"1f9d4-1f3fc-200d-2640":0,"1f9d4-1f3fd-200d-2640":0,"1f9d4-1f3fe-200d-2640":0,"1f9d4-1f3ff-200d-2640":0,"1f9d4-1f3fb-200d-2642":0,"1f9d4-1f3fc-200d-2642":0,"1f9d4-1f3fd-200d-2642":0,"1f9d4-1f3fe-200d-2642":0,"1f9d4-1f3ff-200d-2642":0,"1f9d4-1f3fb":0,"1f9d4-1f3fc":0,"1f9d4-1f3fd":0,"1f9d4-1f3fe":0,"1f9d4-1f3ff":0,"1f9d5-1f3fb":0,"1f9d5-1f3fc":0,"1f9d5-1f3fd":0,"1f9d5-1f3fe":0,"1f9d5-1f3ff":0,"1f9d6-1f3fb-200d-2640":0,"1f9d6-1f3fc-200d-2640":0,"1f9d6-1f3fd-200d-2640":0,"1f9d6-1f3fe-200d-2640":0,"1f9d6-1f3ff-200d-2640":0,"1f9d6-1f3fb-200d-2642":0,"1f9d6-1f3fc-200d-2642":0,"1f9d6-1f3fd-200d-2642":0,"1f9d6-1f3fe-200d-2642":0,"1f9d6-1f3ff-200d-2642":0,"1f9d6-1f3fb":0,"1f9d6-1f3fc":0,"1f9d6-1f3fd":0,"1f9d6-1f3fe":0,"1f9d6-1f3ff":0,"1f9d7-1f3fb-200d-2640":0,"1f9d7-1f3fc-200d-2640":0,"1f9d7-1f3fd-200d-2640":0,"1f9d7-1f3fe-200d-2640":0,"1f9d7-1f3ff-200d-2640":0,"1f9d7-1f3fb-200d-2642":0,"1f9d7-1f3fc-200d-2642":0,"1f9d7-1f3fd-200d-2642":0,"1f9d7-1f3fe-200d-2642":0,"1f9d7-1f3ff-200d-2642":0,"1f9d7-1f3fb":0,"1f9d7-1f3fc":0,"1f9d7-1f3fd":0,"1f9d7-1f3fe":0,"1f9d7-1f3ff":0,"1f9d8-1f3fb-200d-2640":0,"1f9d8-1f3fc-200d-2640":0,"1f9d8-1f3fd-200d-2640":0,"1f9d8-1f3fe-200d-2640":0,"1f9d8-1f3ff-200d-2640":0,"1f9d8-1f3fb-200d-2642":0,"1f9d8-1f3fc-200d-2642":0,"1f9d8-1f3fd-200d-2642":0,"1f9d8-1f3fe-200d-2642":0,"1f9d8-1f3ff-200d-2642":0,"1f9d8-1f3fb":0,"1f9d8-1f3fc":0,"1f9d8-1f3fd":0,"1f9d8-1f3fe":0,"1f9d8-1f3ff":0,"1f9d9-1f3fb-200d-2640":0,"1f9d9-1f3fc-200d-2640":0,"1f9d9-1f3fd-200d-2640":0,"1f9d9-1f3fe-200d-2640":0,"1f9d9-1f3ff-200d-2640":0,"1f9d9-1f3fb-200d-2642":0,"1f9d9-1f3fc-200d-2642":0,"1f9d9-1f3fd-200d-2642":0,"1f9d9-1f3fe-200d-2642":0,"1f9d9-1f3ff-200d-2642":0,"1f9d9-1f3fb":0,"1f9d9-1f3fc":0,"1f9d9-1f3fd":0,"1f9d9-1f3fe":0,"1f9d9-1f3ff":0,"1f9da-1f3fb-200d-2640":0,"1f9da-1f3fc-200d-2640":0,"1f9da-1f3fd-200d-2640":0,"1f9da-1f3fe-200d-2640":0,"1f9da-1f3ff-200d-2640":0,"1f9da-1f3fb-200d-2642":0,"1f9da-1f3fc-200d-2642":0,"1f9da-1f3fd-200d-2642":0,"1f9da-1f3fe-200d-2642":0,"1f9da-1f3ff-200d-2642":0,"1f9da-1f3fb":0,"1f9da-1f3fc":0,"1f9da-1f3fd":0,"1f9da-1f3fe":0,"1f9da-1f3ff":0,"1f9db-1f3fb-200d-2640":0,"1f9db-1f3fc-200d-2640":0,"1f9db-1f3fd-200d-2640":0,"1f9db-1f3fe-200d-2640":0,"1f9db-1f3ff-200d-2640":0,"1f9db-1f3fb-200d-2642":0,"1f9db-1f3fc-200d-2642":0,"1f9db-1f3fd-200d-2642":0,"1f9db-1f3fe-200d-2642":0,"1f9db-1f3ff-200d-2642":0,"1f9db-1f3fb":0,"1f9db-1f3fc":0,"1f9db-1f3fd":0,"1f9db-1f3fe":0,"1f9db-1f3ff":0,"1f9dc-1f3fb-200d-2640":0,"1f9dc-1f3fc-200d-2640":0,"1f9dc-1f3fd-200d-2640":0,"1f9dc-1f3fe-200d-2640":0,"1f9dc-1f3ff-200d-2640":0,"1f9dc-1f3fb-200d-2642":0,"1f9dc-1f3fc-200d-2642":0,"1f9dc-1f3fd-200d-2642":0,"1f9dc-1f3fe-200d-2642":0,"1f9dc-1f3ff-200d-2642":0,"1f9dc-1f3fb":0,"1f9dc-1f3fc":0,"1f9dc-1f3fd":0,"1f9dc-1f3fe":0,"1f9dc-1f3ff":0,"1f9dd-1f3fb-200d-2640":0,"1f9dd-1f3fc-200d-2640":0,"1f9dd-1f3fd-200d-2640":0,"1f9dd-1f3fe-200d-2640":0,"1f9dd-1f3ff-200d-2640":0,"1f9dd-1f3fb-200d-2642":0,"1f9dd-1f3fc-200d-2642":0,"1f9dd-1f3fd-200d-2642":0,"1f9dd-1f3fe-200d-2642":0,"1f9dd-1f3ff-200d-2642":0,"1f9dd-1f3fb":0,"1f9dd-1f3fc":0,"1f9dd-1f3fd":0,"1f9dd-1f3fe":0,"1f9dd-1f3ff":0,"261d-1f3fb":0,"261d-1f3fc":0,"261d-1f3fd":0,"261d-1f3fe":0,"261d-1f3ff":0,"26f9-1f3fb-200d-2640":0,"26f9-1f3fc-200d-2640":0,"26f9-1f3fd-200d-2640":0,"26f9-1f3fe-200d-2640":0,"26f9-1f3ff-200d-2640":0,"26f9-1f3fb-200d-2642":0,"26f9-1f3fc-200d-2642":0,"26f9-1f3fd-200d-2642":0,"26f9-1f3fe-200d-2642":0,"26f9-1f3ff-200d-2642":0,"26f9-1f3fb":0,"26f9-1f3fc":0,"26f9-1f3fd":0,"26f9-1f3fe":0,"26f9-1f3ff":0,"270a-1f3fb":0,"270a-1f3fc":0,"270a-1f3fd":0,"270a-1f3fe":0,"270a-1f3ff":0,"270b-1f3fb":0,"270b-1f3fc":0,"270b-1f3fd":0,"270b-1f3fe":0,"270b-1f3ff":0,"270c-1f3fb":0,"270c-1f3fc":0,"270c-1f3fd":0,"270c-1f3fe":0,"270c-1f3ff":0,"270d-1f3fb":0,"270d-1f3fc":0,"270d-1f3fd":0,"270d-1f3fe":0,"270d-1f3ff":0}},n=s[""];for(const e in s)e&&Object.assign(n,s[e]);const i=n},4762:(e,t,a)=>{a.d(t,{IS_FIREFOX:()=>r,IS_SAFARI:()=>i});var s=a(6761);const n=navigator?navigator.userAgent:null,i=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&s.Z.MSStream,!!("safari"in s.Z)||!(!n||!(/\b(iPad|iPhone|iPod)\b/.test(n)||n.match("Safari")&&!n.match("Chrome")))),r=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},467:(e,t,a)=>{a.d(t,{ZP:()=>o,gV:()=>p});var s=a(5813);const n=/[`~!@#$%^&*()\-_=+\[\]\\|{}'";:\/?.>,<]+/g,i=/^\s+|\s$/g,r={й:"q",ц:"w",у:"e",к:"r",е:"t",н:"y",г:"u",ш:"i",щ:"o",з:"p",х:"[",ъ:"]",ф:"a",ы:"s",в:"d",а:"f",п:"g",р:"h",о:"j",л:"k",д:"l",ж:";",э:"'",я:"z",ч:"x",с:"c",м:"v",и:"b",т:"n",ь:"m",б:",",ю:".",".":"/"};function o(e,t=!0){return p(e,{clearBadChars:!0,latinize:t,ignoreCase:!0})}function p(e,t={}){const a=t.includeTag&&"%"===e.charAt(0),o=e;return t.clearBadChars&&(e=function(e){return e.replace(n,"").replace(i,"")}(e)),t.latinize&&(e=function(e){return e.replace(/[^A-Za-z0-9]/g,(e=>{const t=s.Z[e];return null!=t?t:e}))}(e)),t.ignoreCase&&(e=e.toLowerCase()),a&&(e="%"+e),t.latinize&&(e+=""+function(e){return e.toLowerCase().replace(/[\wа-я]/g,(e=>{const t=r[e];return null!=t?t:e}))}(o)),e}},8801:(e,t,a)=>{a.d(t,{P:()=>n,q:()=>i});const s="_";function n(e,t){const a=""["".length-1]||"";let n;switch(e._){case"inputPhotoFileLocation":n=["photo",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputDocumentFileLocation":n=["document",""[0],e.id,e.thumb_size].filter(Boolean).join(s);break;case"inputPeerPhotoFileLocation":n=["peerPhoto",e.photo_id,e.pFlags.big?"big":"small"].join(s);break;case"inputStickerSetThumb":n=["stickerSetThumb",e.stickerset.id||e.stickerset.short_name||e.stickerset.emoticon||e.stickerset._,e.thumb_version].join(s);break;case"inputFileLocation":n=e.volume_id+"_"+e.local_id;break;case"inputWebFileLocation":n=["webFile",e.url].join(s);break;default:console.error("Unrecognized location:",e),n=""}return n+((null==t?void 0:t.downloadId)?"_download":"")+(a?"."+a:a)}function i(e,t){return e+"/"+encodeURIComponent(JSON.stringify(t))}},677:(e,t,a)=>{a.d(t,{Ki:()=>o,RP:()=>i,X:()=>r});const s=new Set(["all","web","webk"]),n=new Set;function i(e){return e.find((e=>s.has(e.platform)&&!n.has(e.reason)))}function r(e){return!!i(e)}function o(e){n.clear(),e.forEach((e=>{n.add(e)}))}},2946:(e,t,a)=>{a.d(t,{Z:()=>i});var s=a(5880),n=a(1507);function i(e){if(void 0!==e&&e.isPeerId&&e.isPeerId())return e;if((0,s.Z)(e)){const t=e.user_id;if(void 0!==t)return t.toPeerId(!1);const a=e.channel_id||e.chat_id;return void 0!==a?a.toPeerId(!0):n.NM}if(!e)return n.NM;const t="u"===e.charAt(0),a=e.substr(1).split("_");return t?a[0].toPeerId():(a[0]||"").toPeerId(!0)}},6666:(e,t,a)=>{a.d(t,{C:()=>o,Z:()=>p});var s=a(1267),n=a(5471),i=a(5953),r=a(5003);class o{constructor(e){(0,i.Z)(this,e),s.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,r.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),o.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var a;const s=Array.from(e.indexNames);for(const t of s)e.deleteIndex(t);if(null===(a=t.indexes)||void 0===a?void 0:a.length)for(const a of t.indexes)e.indexNames.contains(a.indexName)||e.createIndex(a.indexName,a.keyPath,a.objectParameters)};try{var a=indexedDB.open(this.name,this.version);if(!a)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let s=!1;return setTimeout((()=>{s||a.onerror((0,n.Z)("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,n)=>{a.onsuccess=t=>{s=!0;const i=a.result;let r=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},i.onclose=e=>{this.log.error("closed:",e),!r&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(r=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},a.onerror=e=>{s=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),n(e)},a.onupgradeneeded=e=>{s=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const a=e.target,n=a.result;this.stores.forEach((e=>{if(n.objectStoreNames.contains(e.name)){const s=a.transaction.objectStore(e.name);t(s,e)}else((e,a)=>{const s=e.createObjectStore(a.name);t(s,a)})(n,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new o(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const a=t.db;a&&(a.onclose=()=>{},a.close())}))}}o.INSTANCES=[];class p{constructor(e,t){this.storeName=t,this.log=(0,r.kg)(["IDB",e.name,t].join("-")),this.idb=o.create(e)}delete(e,t){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,a){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(a=>e.map(((e,s)=>a.put(t[s],e)))),"",a)}get(e,t){return Array.isArray(e)||(e=[].concat(e)),e.length?this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"",t):Promise.resolve([])}getObjectStore(e,t,a,s=this.storeName){let n;return a&&(n=performance.now(),this.log(a+": start")),this.idb.openDatabase().then((i=>new Promise(((r,o)=>{const p=i.transaction([s],e),d=()=>{clearTimeout(l),o(p.error)},f=()=>{clearTimeout(l),a&&this.log(a+": end",performance.now()-n);const e=h.map((e=>e.result));r(g?e:e[0])};p.onerror=d;const c="readwrite"===e;c&&(p.oncomplete=()=>f());const l=setTimeout((()=>{this.log.error("transaction not finished",p,a)}),1e4),m=t(p.objectStore(s)),g=Array.isArray(m),h=g?m:[].concat(m);if(c)return;const u=h.length;let y=u;const _=()=>{p.error||--y||f()};for(let e=0;ee.getAll()),"",e)}}},6225:(e,t,a)=>{a.d(t,{r:()=>Ws,H:()=>Hs}),a(690),a(4110);var s=a(8630);let n;function i(){return n}function r(e){return n=e}var o=a(1507),p=a(3241),d=a(410),f=a(3206),c=a(1352);class l extends p.Z{constructor(){super(),this.myId=o.NM,this.connectionStatus={},this.premium=!1,this.addEventListener("user_auth",(({id:e})=>{this.myId=e.toPeerId()})),this.addEventListener("premium_toggle_private",(({isNew:e,isPremium:t})=>{this.premium=t,e||this.dispatchEventSingle("premium_toggle",t)})),this.addEventListener("connection_status_change",(e=>{this.connectionStatus[e.name]=e})),this.dispatchEvent=(e,...t)=>{super.dispatchEvent(e,...t),f.Z.getInstance().invokeVoid("event",{name:e,args:t})},c.kC||this.addEventListener("settings_updated",(({settings:e})=>{this.settings=e}))}getConnectionStatus(){return this.connectionStatus}getPremium(){return this.premium}dispatchEventSingle(...e){super.dispatchEvent(...e)}}const m=new l;d.GO.rootScope=m;const g=m;var h=a(7922),u=a(9750);const y=new class{constructor(){this.state={},this.storage=h.Z}getState(){return Promise.resolve(this.state)}setByKey(e,t){!function(e,t,a){const s=t.split(".");(0,u.Z)(e,s.slice(0,-1).join("."))[s.pop()]=a}(this.state,e,t);const a=e.split(".")[0];"settings"===a&&g.dispatchEvent("settings_updated",{key:e,value:t,settings:this.state.settings}),this.pushToState(a,this.state[a])}pushToState(e,t,a=!0,s){a&&(this.state[e]=t),this.setKeyValueToStorage(e,t,s)}setKeyValueToStorage(e,t=this.state[e],a){f.Z.getInstance().invokeVoid("mirror",{name:"state",key:e,value:t}),this.storage.set({[e]:t},a)}};var _=a(4159),v=a(3725),P=a(5418),b=a(1267),M=a(1655),I=a(5003);class S{constructor(e,t,a){this.dcId=e,this.url=t,this.pending=[],this.debug=b.Z.debug&&!1;let s=I.v9.Error|I.v9.Log;this.debug&&(s|=I.v9.Debug),this.log=(0,I.kg)(`HTTP-${e}`+a,s),this.log("constructor"),this.connected=!1}_send(e,t){const a=e.length;return this.debug&&this.log.debug("-> body length to send:",a),fetch(this.url,{method:"POST",body:e,mode:t}).then((e=>{if(200!==e.status&&!t)throw e.arrayBuffer().then((e=>{this.log.error("not 200",new TextDecoder("utf-8").decode(new Uint8Array(e)))})),e;return this.setConnected(!0),e.arrayBuffer().then((e=>new Uint8Array(e)))}),(e=>{throw this.setConnected(!1),e}))}setConnected(e){this.connected===e||this.destroyed||(this.connected=e,Z.setTransportValue("https",e))}destroy(){this.setConnected(!1),this.destroyed=!0,this.pending.forEach((e=>e.reject())),this.pending.length=0}send(e){if(this.networker)return this._send(e);{const t=new Promise(((t,a)=>{this.pending.push({resolve:t,reject:a,body:e})}));return this.releasePending(),t}}releasePending(){return e=this,t=void 0,s=function*(){if(!this.releasing){this.releasing=!0;for(let e=0;e{this.log("opened"),this.debug&&this.log.debug("sending init packet"),this.dispatchEvent("open")},this.handleError=e=>{this.log.error("handleError",e),this.close()},this.handleClose=e=>{this.log("closed",e),this.removeListeners(),this.dispatchEvent("close")},this.handleMessage=e=>{this.debug&&this.log.debug("<-","handleMessage",e.data.byteLength),this.dispatchEvent("message",e.data)},this.send=e=>{this.debug&&this.log.debug("-> body length to send:",e.length),this.ws.send(e)};let s=I.v9.Error|I.v9.Log;return this.debug&&(s|=I.v9.Debug),this.log=(0,I.kg)(`WS-${e}`+a,s),this.log("constructor"),this.connect(),this}removeListeners(){this.ws&&(this.ws.removeEventListener("open",this.handleOpen),this.ws.removeEventListener("close",this.handleClose),this.ws.removeEventListener("error",this.handleError),this.ws.removeEventListener("message",this.handleMessage),this.ws=void 0)}connect(){this.ws=new WebSocket(this.url,"binary"),this.ws.binaryType="arraybuffer",this.ws.addEventListener("open",this.handleOpen),this.ws.addEventListener("close",this.handleClose),this.ws.addEventListener("error",this.handleError),this.ws.addEventListener("message",this.handleMessage)}close(){if(this.ws){this.log("close execution");try{this.ws.close()}catch(e){}this.handleClose()}}}function w(e){if(!crypto||!("getRandomValues"in crypto))throw new Error("NO_SECURE_RANDOM");return crypto.getRandomValues(e),e}var k=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class A{constructor(){this._process=(e,t)=>s.Z.invokeCryptoNew({method:"aes-ctr-process",args:[{id:this.id,data:e,operation:t}],transfer:[e.buffer]})}init(e){return k(this,void 0,void 0,(function*(){void 0!==this.idPromise&&this.release();const t=new Uint8Array(64);for(w(t);;){const e=t[3]<<24|t[2]<<16|t[1]<<8|t[0],a=t[7]<<24|t[6]<<16|t[5]<<8|t[4];if(239!==t[0]&&1145128264!==e&&1414745936!==e&&542393671!==e&&1230262351!==e&&4008636142!==e&&3722304989!==e&&0!==a)break;w(t)}const a=t.slice().reverse(),n=t.slice(8,40),i=t.slice(40,56),r=a.slice(8,40),o=a.slice(40,56),p=this.idPromise=s.Z.invokeCrypto("aes-ctr-prepare",{encKey:n,encIv:i,decKey:r,decIv:o});this.process=(e,t)=>k(this,void 0,void 0,(function*(){return yield p,this._process(e,t)})),this.id=yield p,this.process=this._process,t.set(e.obfuscateTag,56);const d=yield this.encode(t.slice());return t.set(d.slice(56,64),56),t}))}encode(e){return this.process(e,"encrypt")}decode(e){return this.process(e,"decrypt")}release(){return k(this,void 0,void 0,(function*(){const e=this.idPromise;if(void 0===e)return;this.id=void 0,this.idPromise=void 0;const t=yield e;s.Z.invokeCrypto("aes-ctr-destroy",t)}))}destroy(){this.release()}}const D=new class{constructor(){this.tag=239,this.obfuscateTag=new Uint8Array([this.tag,this.tag,this.tag,this.tag])}encodePacket(e){const t=e.byteLength>>2;let a;return a=t<127?new Uint8Array([t]):new Uint8Array([127,255&t,t>>8&255,t>>16&255]),a.concat(e)}readPacket(e){let t=e[0];return t>=127?(t=e[1]|e[2]<<8|e[3]<<16,e.slice(4,t<<3)):e.slice(1,t<<3)}};var U=a(9174);function T(e){const t=e.length,a=new Array(t);for(let s=0;sF(this,void 0,void 0,(function*(){this.connected=!0,Z.setTransportOpened("websocket");const e=yield this.obfuscation.init(this.codec);this.connected&&(this.connection.send(e),this.networker&&(this.pending.length=0,this.networker.setConnectionStatus(U.Q.Connected),this.networker.cleanupSent(),this.networker.resend()),setTimeout((()=>{this.releasePending()}),0))})),this.onMessage=e=>F(this,void 0,void 0,(function*(){let t=yield this.obfuscation.decode(new Uint8Array(e));if(t=this.codec.readPacket(t),this.networker)return this.debug&&this.log.debug("redirecting to networker",t.length),void this.networker.parseResponse(t).then((e=>{this.debug&&this.log.debug("redirecting to networker response:",e);try{this.networker.processMessage(e.response,e.messageId,e.sessionId)}catch(e){this.log.error("handleMessage networker processMessage error",e)}})).catch((e=>{this.log.error("handleMessage networker parseResponse error",e)}));const a=this.pending.shift();a?a.resolve(t):this.debug&&this.log.debug("no pending for res:",T(t))})),this.onClose=()=>{let e,t;if(this.clear(),this.autoReconnect){const a=Date.now(),s=a-this.lastCloseTime;e=!isNaN(s)&&s{if(void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0),!this.connection){if(this.log("trying to reconnect..."),this.lastCloseTime=Date.now(),this.networker)this.networker.setConnectionStatus(U.Q.Connecting);else for(const e of this.pending)e.bodySent&&(e.bodySent=!1);this.connect()}};let i=I.v9.Error|I.v9.Log;this.debug&&(i|=I.v9.Debug),this.log=(0,I.kg)(`TCP-${t}`+s,i),this.log("constructor"),this.connect()}clear(){this.connected&&Z.setTransportClosed("websocket"),this.connected=!1,this.connection&&(this.connection.removeEventListener("open",this.onOpen),this.connection.removeEventListener("close",this.onClose),this.connection.removeEventListener("message",this.onMessage),this.connection=void 0)}forceReconnect(){this.close(),this.reconnect()}destroy(){this.setAutoReconnect(!1),this.close(),this.obfuscation&&this.obfuscation.destroy(),this.pending.forEach((e=>{e.reject&&e.reject()})),this.pending.length=0}close(){const e=this.connection;if(e){const t=this.connected;this.clear(),t&&(e.addEventListener("message",this.onMessage),e.addEventListener("close",(()=>{e.removeEventListener("message",this.onMessage)}),{once:!0}),e.close())}}setAutoReconnect(e){this.autoReconnect=e,e?this.connection||void 0!==this.reconnectTimeout||this.reconnect():void 0!==this.reconnectTimeout&&(clearTimeout(this.reconnectTimeout),this.reconnectTimeout=void 0)}connect(){this.connection&&this.close(),this.connection=new this.Connection(this.dcId,this.url,this.logSuffix),this.connection.addEventListener("open",this.onOpen),this.connection.addEventListener("close",this.onClose),this.connection.addEventListener("message",this.onMessage)}changeUrl(e){this.url!==e&&(this.url=e,this.forceReconnect())}encodeBody(e){const t=this.codec.encodePacket(e);return this.obfuscation.encode(t)}send(e){this.debug&&this.log.debug("-> body length to pending:",e.length);const t=void 0;if(!this.networker){const a=new Promise(((a,s)=>{this.pending.push({resolve:a,reject:s,body:e,encoded:t})}));return this.releasePending(),a}this.pending.push({body:e,encoded:t}),this.releasePending()}releasePending(){var e;return F(this,void 0,void 0,(function*(){if(!this.connected||this.releasingPending)return;this.releasingPending=!0;let t=this.pending.length,a=!1;for(let s=0;s body length to send:",i.length);const r=null!==(e=n.encoded)&&void 0!==e?e:n.encoded=yield this.encodeBody(i);if(!this.connected)break;this.connection.send(r),n.resolve?n.bodySent=!0:(this.pending.splice(s--,1),t--),a=!0}}this.releasingPending=void 0,this.pending.length&&a&&this.releasePending()}))}}const x=b.Z.test?"_test":"";function B(e){return"client"===e?"":"-1"}function V(e,t,a){const s=B(t),n="client"!==t?"apiws"+x+(a?"_premium":""):"apiws"+x;return`wss://${_.Z.suffix.toLowerCase()}ws${e}${s}.web.telegram.org/${n}`}class O{constructor(){this.sslSubdomains=["pluto","venus","aurora","vesta","flora"],this.dcOptions=b.Z.test?[{id:1,host:"149.154.175.10",port:80},{id:2,host:"149.154.167.40",port:80},{id:3,host:"149.154.175.117",port:80}]:[{id:1,host:"149.154.175.50",port:80},{id:2,host:"149.154.167.50",port:80},{id:3,host:"149.154.175.100",port:80},{id:4,host:"149.154.167.91",port:80},{id:5,host:"149.154.171.5",port:80}],this.chosenServers={},this.transportSocket=(e,t,a)=>{const s=V(e,t,a);let n;return n=C,new R(n,e,s,"upload"===t?"-U":"download"===t?"-D":"",1e4)},this.transportHTTP=(e,t,a)=>{let s;if(b.Z.ssl||!b.Z.http){const a=B(t);s="https://"+(this.sslSubdomains[e-1]+a)+".web.telegram.org/"+(b.Z.test?"apiw_test1":"apiw1")}else for(const t of this.dcOptions)if(t.id===e){s="http://"+t.host+(80!==t.port?":"+t.port:"")+"/apiw1";break}return new S(e,s,"upload"===t?"-U":"download"===t?"-D":"")}}chooseServer(e,t="client",a=b.Z.transport,s=!0,n){this.chosenServers.hasOwnProperty(a)||(this.chosenServers[a]={client:{},download:{},upload:{}});const i=this.chosenServers[a][t];e in i||(i[e]=[]);const r=i[e];if(!r.length||!s){let i;return i=("websocket"===a?this.transportSocket:this.transportHTTP)(e,t,n),i?(s&&r.push(i),i):(console.error("No chosenServer!",e),null)}return r[0]}static removeTransport(e,t){for(const a in e)for(const s in e[a])for(const n in e[a][s]){const i=e[a][s][n];(0,M.Z)(i,t)}}}var L=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class N extends p.Z{constructor(){super(!0),this.opened=new Map,this.addEventListener("change",(e=>{e.get("websocket")||this.waitForWebSocket()}))}pingTransports(){var e;return L(this,void 0,void 0,(function*(){const t=null!==(e=this.dcConfigurator)&&void 0!==e?e:this.dcConfigurator=new O,a=this.transports={https:t.chooseServer(_.Z.baseDcId,"client","https",!1),websocket:t.chooseServer(_.Z.baseDcId,"client","websocket",!1)},s=(0,v.Z)();this.transports.https._send(new Uint8Array,"no-cors").then((()=>s.resolve(!0)),(()=>s.resolve(!1))),setTimeout((()=>s.resolve(!1)),2e3);const n=(0,v.Z)(),i=a.websocket;i.setAutoReconnect(!1),i.connection.addEventListener("close",(()=>n.resolve(!1)),{once:!0}),i.connection.addEventListener("open",(()=>n.resolve(!0)),{once:!0}),setTimeout((()=>{n.isFulfilled||n.isRejected||(i.connection&&i.connection.close(),n.resolve(!1))}),2e3);const[r,o]=yield Promise.all([s,n]);for(const e in a)a[e].destroy();return{https:r||this.opened.get("https")>0,websocket:o||this.opened.get("websocket")>0}}))}waitForWebSocket(){return L(this,void 0,void 0,(function*(){if(!this.pinging){for(this.pinging=!0;;){const{https:e,websocket:t}=yield this.pingTransports();if((e||t)&&this.dispatchEvent("transport",t||!e?"websocket":"https"),t)break;yield(0,P.Z)(1e4)}this.pinging=!1}}))}setTransportValue(e,t){let a=this.opened.get(e)||0;a+=t?1:-1,this.opened.set(e,a),this.dispatchEvent("change",this.opened)}setTransportOpened(e){return this.setTransportValue(e,!0)}setTransportClosed(e){return this.setTransportValue(e,!1)}}const Z=new N,j=(0,v.Z)();var q=a(6654);class G{setManagers(e){Object.assign(this,e)}}var H=a(3127),W=a(3989),z=a(5466);let K;function J(e){return null!=K?K:K=function(e){return t=this,a=void 0,n=function*(){const t=(0,z.$)((0,I.kg)("STORAGES-LOADER")),a=Object.keys(e),s=a.map((a=>{const s=e[a].getAll();return t(s,"storage "+a)})),n={},i=yield Promise.all(s);for(let e=0,t=a.length;e({storage:this.storages[e],results:t[e]})))},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}}class Q extends G{getState(){return this.apiManager.invokeApi("account.getPassword").then((e=>e))}updateSettings(e={}){return this.getState().then((t=>{let a,s;const n={password:null,new_settings:{_:"account.passwordInputSettings",hint:e.hint,email:e.email}};a=e.currentPassword?this.cryptoWorker.invokeCrypto("computeSRP",e.currentPassword,t,!1):Promise.resolve({_:"inputCheckPasswordEmpty"});const i=t.new_algo,r=new Uint8Array(i.salt1.length+32);return w(r),r.set(i.salt1,0),i.salt1=r,s=e.newPassword?this.cryptoWorker.invokeCrypto("computeSRP",e.newPassword,t,!0):Promise.resolve(new Uint8Array),Promise.all([a,s]).then((e=>(n.password=e[0],n.new_settings.new_algo=i,n.new_settings.new_password_hash=e[1],this.apiManager.invokeApi("account.updatePasswordSettings",n))))}))}getInputCheckPassword(e,t){return this.cryptoWorker.invokeCrypto("computeSRP",e,t,!1)}check(e,t,a={}){return this.getInputCheckPassword(e,t).then((e=>this.apiManager.invokeApi("auth.checkPassword",{password:e},a).then((e=>("auth.authorization"===e._&&this.apiManager.setUser(e.user),e)))))}confirmPasswordEmail(e){return this.apiManager.invokeApi("account.confirmPasswordEmail",{code:e})}resendPasswordEmail(){return this.apiManager.invokeApi("account.resendPasswordEmail")}cancelPasswordEmail(){return this.apiManager.invokeApi("account.cancelPasswordEmail")}}var Y=a(6848),X=a(5471);class ee extends G{constructor(){super(...arguments),this.contexts=new Map,this.links={},this.log=(0,I.kg)("RD",void 0,!0)}saveContext(e,t,a){[a,e]=this.getContexts(e),a||(a=new Set,this.contexts.set(e,a)),this.links[T(e)]=e;for(const e of a)if((0,Y.Z)(e,t))return;a.add(t)}getReferenceByLink(e){return this.links[T(e)]}getContexts(e){return[this.contexts.get(e)||(e=this.getReferenceByLink(e)||e,this.contexts.get(e)),e]}getContext(e){const t=this.getContexts(e);return t[0]?[t[0].values().next().value,t[1]]:void 0}deleteContext(e,t,a){if([a,e]=this.getContexts(e),a)for(const s of a)if((0,Y.Z)(s,t))return a.delete(s),a.size||(this.contexts.delete(e),delete this.links[T(e)]),!0;return!1}refreshReference(e,t){if(this.log("refreshReference: start",e.slice(),t),!t){const a=this.getContext(e);if(!a)return this.log("refreshReference: got no context for reference:",e.slice()),Promise.reject("NO_CONTEXT");[t,e]=a}let a;switch(null==t?void 0:t.type){case"message":a=this.appMessagesManager.reloadMessages(t.peerId,t.messageId,!0);break;case"emojiesSounds":a=this.refreshEmojiesSoundsPromise||this.appStickersManager.getAnimatedEmojiSounds(!0).then((()=>{this.refreshEmojiesSoundsPromise=void 0}));break;case"userFull":a=Promise.resolve(this.appProfileManager.getProfile(t.userId,!0));break;case"customEmoji":a=this.appEmojiManager.getCustomEmojiDocuments([t.docId]);break;case"attachMenuBotIcon":a=this.appAttachMenuBotsManager.getAttachMenuBot(t.botId,!0);break;default:return this.log.warn("refreshReference: not implemented context",t),Promise.reject()}const s=T(e);return this.log("refreshReference: refreshing reference:",s),a.then((()=>{const a=T(e);if(this.log("refreshReference: refreshed, reference before:",s,"after:",a),s!==a)return e;this.deleteContext(e,t);const n=this.getContext(e);if(n)return this.refreshReference(e,n[0]);throw this.log.error("refreshReference: no new context, reference before:",s,"after:",a,t),(0,X.Z)("NO_NEW_CONTEXT")}))}}var te=a(7298),ae=a(7381),se=a(252),ne=a(7625),ie=a(6519);function re(e,t){if(!e)return t;for(var a in e)t.hasOwnProperty(a)||delete e[a];for(var a in t)e[a]=t[a];return e}var oe=a(2790),pe=a(3781),de=a(3385),fe=a(5880),ce=a(8050),le=a(2946);function me(e){var t,a;const s=[e.fromId,e.viaBotId,e.fwdFromId],n=e.media;if(n){const e=n.user_id;void 0!==e&&s.push(e.toPeerId());const t=n.results,a=null==t?void 0:t.recent_voters;(null==a?void 0:a.length)&&s.push(...a.map((e=>e.toPeerId())))}const i=null===(t=e.reactions)||void 0===t?void 0:t.recent_reactions;(null==i?void 0:i.length)&&s.push(...i.map((e=>(0,le.Z)(e.peer_id))));const r=e.action;if(r){const e=[...r.users||[],r.user_id,r.inviter_id];s.push(...e.filter(Boolean).map((e=>e.toPeerId())));const t=[r.channel_id,r.chat_id];s.push(...t.filter(Boolean).map((e=>e.toPeerId(!0))))}const o=null===(a=e.replies)||void 0===a?void 0:a.recent_repliers;return(null==o?void 0:o.length)&&s.push(...o.map((e=>(0,le.Z)(e)))),new Set(s.filter(Boolean))}var ge=a(8027);function he(e,t,a){return e[t]=a}var ue=a(8938);const ye=void 0;class _e extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e){this.allDialogsLoaded={},this.pinnedOrders={};for(const e of o.DZ)this.pinnedOrders[e]=[]}else{this.storage.clear(),this.allDialogsLoaded={},this.saveAllDialogsLoaded(),this.pinnedOrders=Object.assign({},this.pinnedOrders);for(const e of o.DZ)this.resetPinnedOrder(e);this.savePinnedOrders()}this.forumTopics=new Map,this.folders={},this.dialogsOffsetDate={},this.dialogsNum=0,this.dialogsIndex=new ae.Z({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0}),this.cachedResults={query:"",count:0,dialogs:[],folderId:0}},this.onUpdateFolderPeers=e=>{e.folder_peers.forEach((e=>{var t;const{folder_id:a,peer:s}=e,n=this.appPeersManager.getPeerId(s),i=this.dropDialog(n)[0];i&&((null===(t=i.pFlags)||void 0===t?void 0:t.pinned)&&this.handleDialogUnpinning(i,a),i.folder_id=a,this.generateIndexForDialog(i),this.pushDialog({dialog:i})),this.appMessagesManager.scheduleHandleNewDialogs(n,i)}))},this.onUpdateDialogPinned=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:o.J$,s=this.appPeersManager.getPeerId(e.peer.peer),n=this.getDialogOnly(s);this.handleDialogTogglePinned(n,e.pFlags.pinned,a)},this.onUpdateChannelPinnedTopic=e=>{const t=e.channel_id.toPeerId(!0),a=(0,pe.Z)(e.topic_id),s=this.getForumTopic(t,a);s&&this.handleDialogTogglePinned(s,e.pFlags.pinned,this.getFilterIdForForum(s))},this.onUpdatePinnedDialogs=e=>{var t;const a=null!==(t=e.folder_id)&&void 0!==t?t:o.J$;e.order?this.handleDialogsPinned(a,e.order.map((e=>this.appPeersManager.getPeerId(e.peer)))):this.apiManager.invokeApi("messages.getPinnedDialogs",{folder_id:a}).then((e=>{this.applyDialogs(e),this.handleDialogsPinned(a,e.dialogs.map((e=>e.peerId)))}))},this.onUpdateChannelPinnedTopics=e=>{return t=this,a=void 0,n=function*(){const t=e.channel_id.toPeerId(!0);if(!this.forumTopics.get(t))return;const a=t;if(e.order){const t=e.order.map((e=>(0,pe.Z)(e)));this.handleDialogsPinned(a,t)}else{const e=yield this.apiManager.getLimit("topicPin",!0),s=this.apiManager.invokeApi("channels.getForumTopics",{channel:this.appChatsManager.getChannelInput(t.toChatId()),limit:e,offset_date:0,offset_id:0,offset_topic:0}),n=(yield this.processTopics(t,s)).topics.filter((e=>e.pFlags.pinned));this.handleDialogsPinned(a,n.map((e=>e.id)))}},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}}after(){this.clear(!0),this.rootScope.addEventListener("language_change",(()=>{const e=this.appUsersManager.getSelf().id.toPeerId(!1);if(this.getDialogOnly(e)){const t=this.appPeersManager.getPeerSearchText(e);this.dialogsIndex.indexObject(e,t)}}));const e=e=>{const t=this.getCachedDialogs(!1);for(let a=0;a{const e=this.getCachedDialogs(!1);for(const e in this.folders)+e>1&&delete this.folders[e];for(let t=0;t{const t=this.getCachedDialogs(!1),a=this.getDialogIndexKeyByFilterId(e.id);for(let e=0;e{this.processChangedUnreadOrUnmuted(e.peerId)})),this.rootScope.addEventListener("chat_update",(e=>{const t=this.appChatsManager.getChat(e),a=e.toPeerId(!0);t.pFlags.left&&this.getDialogOnly(a)&&this.dropDialogOnDeletion(a)})),this.rootScope.addEventListener("chat_toggle_forum",(({chatId:e,enabled:t})=>{const a=e.toPeerId(!0);t||this.flushForumTopicsCache(a),this.processChangedUnreadOrUnmuted(a)})),this.apiUpdatesManager.addMultipleEventsListeners({updateFolderPeers:this.onUpdateFolderPeers,updateDialogPinned:this.onUpdateDialogPinned,updateChannelPinnedTopic:this.onUpdateChannelPinnedTopic,updatePinnedDialogs:this.onUpdatePinnedDialogs,updateChannelPinnedTopics:this.onUpdateChannelPinnedTopics}),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("dialogs")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.dialogs=this.storage.getCache();for(const t of o.DZ){const a=e.pinnedOrders[t];if(!a)continue;const s=this.getPinnedOrders(t);s.splice(0,s.length,...a)}t.length&&W.Z.freezeSaving(this.setDialogsFromState.bind(this,t),["chats","dialogs","messages","users"]),this.allDialogsLoaded=e.allDialogsLoaded||{},t.length&&this.appDraftsManager.addMissedDialogs()}))}setDialogsFromState(e){for(let t=0,a=e.length;tthis.allDialogsLoaded[e]))&&(this.allDialogsLoaded[void 0]=!0),this.saveAllDialogsLoaded())}saveAllDialogsLoaded(){this.appStateManager.pushToState("allDialogsLoaded",this.allDialogsLoaded)}handleDialogUnpinning(e,t){delete e.pFlags.pinned,(0,M.Z)(this.getPinnedOrders(t),this.isFilterIdForForum(t)?e.id:e.peerId),this.savePinnedOrders()}savePinnedOrders(){this.appStateManager.pushToState("pinnedOrders",this.pinnedOrders)}resetPinnedOrder(e){this.getPinnedOrders(e).length=0}getPinnedOrders(e){let t=this.pinnedOrders[e];return!t&&this.isFilterIdForForum(e)&&((0,ge.Z)(this.pinnedOrders,[e]),t=this.pinnedOrders[e]=[]),t}isDialogPinned(e,t){const a=this.filtersStorage.getFilter(t);let s;return s=a?-1!==a.pinnedPeerIds.indexOf(e):!!this.getDialogOnly(e).pFlags.pinned,s}getOffsetDate(e){const t=this.dialogsOffsetDate[e]||0;return e!==ye||t?t:Math.min(...Array.from(o.DZ).sort(((e,t)=>e-t)))}generateFolder(e){const t={dialogs:[],id:e,unreadMessagesCount:0,unreadPeerIds:new Set,unreadUnmutedPeerIds:new Set};return(0,ge.Z)(t,["dispatchUnreadTimeout"]),t}getFolder(e){var t,a;return null!==(t=(a=this.folders)[e])&&void 0!==t?t:a[e]=this.generateFolder(e)}isFilterIdForForum(e){return e&&e<0}getFilterIdForForum(e){return e.peerId}getDialogKey(e){return this.isTopic(e)?e.id:e.peerId}getFolderDialogs(e,t=!0){if(e===ye)return this.getCachedDialogs(t);const a=this.getFolder(e);return this.isFilterIdForForum(e)?t?a.dialogs.filter((e=>!e.pFlags.hidden)):a.dialogs:t?a.dialogs.filter((e=>void 0===e.migratedTo)):a.dialogs}getNextDialog(e,t,a){const s=this.getFolderDialogs(a,!0);let n;if(e){const a=s.findIndex((t=>t.peerId===e));-1!==a&&(n=s[t?a+1:a-1])}else t&&(n=s[0]);return n}getDialogIndexKeyByFilterId(e){if(this.isFilterIdForForum(e))return(0,de.Z)();if(o.DZ.has(e))return(0,de.Z)(e);const t=this.filtersStorage.getFilter(e);return(0,de.Z)(t.localId)}isDialogUnmuted(e){return!this.appNotificationsManager.isPeerLocalMuted({peerId:e.peerId,respectType:!0,threadId:this.isTopic(e)?e.id:void 0})}getFolderUnreadCount(e){const t=this.getFolder(e);return{unreadUnmutedCount:t.unreadUnmutedPeerIds.size,unreadCount:t.unreadPeerIds.size}}getCachedDialogs(e){const t=Array.from(o.DZ).map((t=>this.getFolderDialogs(t,e)));return[].concat(...t)}setDialogIndexInFilter(e,t,a){var s,n;let i;const r=this.isTopic(e),p=r||o.DZ.has(a.id);if(this.filtersStorage.testDialogForFilter(e,a)){const t=r?this.getPinnedOrders(this.getFilterIdForForum(e)):a.pinnedPeerIds,o=this.getDialogKey(e),d=t.indexOf(o);i=-1!==d?this.generateDialogIndex(this.generateDialogPinnedDateByIndex(t.length-1-d),!0):(null===(s=e.pFlags)||void 0===s?void 0:s.pinned)||p?this.generateIndexForDialog(e,!0,void 0,!p):null!==(n=(0,ce.Z)(e))&&void 0!==n?n:this.generateIndexForDialog(e,!0)}return he(e,t,i)}getDialog(e,t,a,s=!0){const n=[];a&&(t=e),void 0===t?n.push(...Array.from(o.DZ).map((e=>this.getFolder(e).dialogs))):n.push(this.getFolderDialogs(t,!1));const i=a?e=>e.id===a:t=>t.peerId===e;for(const e of n){let t=0,a=0;for(let n=e.length;tt.id===e.id:t=>t.peerId===e.peerId,d=r.findIndex(p),f=r[d],c=this.getDialogIndex(f,i);a&&n>o.Zi&&(a=void 0);const l=a?void 0:this.setDialogIndexInFilter(e,i,t);return c!==l&&(!!c!=!!l&&this.prepareFolderUnreadCountModifyingByDialog(n,e,!!l),-1!==d&&r.splice(d,1),l&&(0,ie.Z)(r,e,(e=>this.getDialogIndex(e,i)),-1),!0)}prepareDialogUnreadCountModifying(e,t){const a=this.isTopic(e),s=[],n=a?this.getFilterIdForForum(e):e.folder_id;if(s.push(this.prepareFolderUnreadCountModifyingByDialog(n,e,t)),!a){const a=this.filtersStorage.getFilters();for(const n in a){const i=a[n];this.filtersStorage.testDialogForFilter(e,i)&&s.push(this.prepareFolderUnreadCountModifyingByDialog(i.id,e,t))}}return()=>!t&&s.forEach((e=>e()))}prepareFolderUnreadCountModifyingByDialog(e,t,a){const s=this.appMessagesManager.getDialogUnreadCount(t),n=this.isDialogUnmuted(t);if(void 0===a)return()=>{const a=this.appMessagesManager.getDialogUnreadCount(t),n=this.isDialogUnmuted(t),i=a-s;this.modifyFolderUnreadCount(e,i,!!a,a&&n,t)};{const i=a?s:-s;this.modifyFolderUnreadCount(e,i,!!s,s&&n,t)}}modifyFolderUnreadCount(e,t,a,s,n){var i;const{peerId:r}=n,o=this.appPeersManager.isForum(r),p=this.isTopic(n);if(o&&!p){const i=this.getForumUnreadCount(r);if(i instanceof Promise)return void i.then((({count:t,hasUnmuted:a})=>{n=this.getDialogOnly(r);const s=this.getFolder(e);n&&this.appPeersManager.isForum(r)&&s&&s.dialogs.some((e=>e.peerId===r))&&this.modifyFolderUnreadCount(e,0,!1,!1,n)}));t=0,a=i.count>0,s=i.hasUnmuted}const d=this.getFolder(e);t&&(d.unreadMessagesCount=Math.max(0,d.unreadMessagesCount+t));const f=this.getDialogKey(n);a?d.unreadPeerIds.add(f):d.unreadPeerIds.delete(f),s?d.unreadUnmutedPeerIds.add(f):d.unreadUnmutedPeerIds.delete(f),null!==(i=d.dispatchUnreadTimeout)&&void 0!==i||(d.dispatchUnreadTimeout=E.Z.setTimeout((()=>{d.dispatchUnreadTimeout=void 0;const e=Object.assign({},d);delete e.dialogs,this.rootScope.dispatchEvent("folder_unread",e),p&&this.processChangedUnreadOrUnmuted(r)}),0))}processChangedUnreadOrUnmuted(e){const t=this.getDialogOnly(e);t&&(this.processDialogForFilters(t),this.prepareDialogUnreadCountModifying(t)(),this.rootScope.dispatchEvent("dialog_unread",{peerId:e,dialog:t}))}generateIndexForDialog(e,t,a,s){var n;if(!t)return;const i=this.isTopic(e);let r,o=0;if(e.pFlags.hidden)o=this.generateDialogPinnedDateByIndex(4095),r=!0;else if(e.pFlags.pinned&&!s)o=this.generateDialogPinnedDate(e),r=!0;else{if(a||(a=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message)),o=(null==a?void 0:a.date)||o,!i){const t=this.appPeersManager.isChannel(e.peerId)&&e.peerId.toChatId();if(t){const e=this.appChatsManager.getChat(t);(!o||e.date&&e.date>o)&&(o=e.date)}}"draftMessage"===(null===(n=e.draft)||void 0===n?void 0:n._)&&e.draft.date>o&&(o=e.draft.date)}o||(o=(0,te.Z)(!0));const p=this.generateDialogIndex(o,r);if(t)return p;he(e,(0,de.Z)(e.folder_id),p)}generateDialogPinnedDateByIndex(e){return 2147418112+(65535&e)}generateDialogPinnedDate(e){const t=this.isTopic(e),a=this.getPinnedOrders(t?this.getFilterIdForForum(e):e.folder_id),s=this.getDialogKey(e);let n=a.indexOf(s);return-1===n&&(a.unshift(s),n=0,t||this.savePinnedOrders()),this.generateDialogPinnedDateByIndex(a.length-1-n)}setDialogToState(e){if(this.isTopic(e))return;const{peerId:t,pts:a}=e,s=this.appMessagesManager.getHistoryStorage(t),n=this.appMessagesManager.getHistoryMessagesStorage(t),i=s.history.slice;let r;for(let e=0,a=i.length;e{"dialogFolder"===t._&&e.dialogs.splice(a,1)})),(0,ue.Z)(s),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appMessagesManager.saveMessages(e.messages);const n=new Map;s.forEach((e=>{var t,s;const i=this.appPeersManager.getPeerId(e.peer);let r=e.top_message;const o=this.appMessagesManager.pendingTopMsgs[i];if(o){const t=this.appMessagesManager.getMessageByPeer(i,o),a=this.appMessagesManager.getMessageByPeer(i,r);(!r||t&&(!a||(null==t?void 0:t.date)>(null==a?void 0:a.date)))&&(e.top_message=r=o,this.appMessagesManager.getHistoryStorage(i).maxId=o)}if(r||"draftMessage"===(null===(t=e.draft)||void 0===t?void 0:t._)){if(this.saveDialog({dialog:e})){const t=(e=>{let t=n.get(e);return t||n.set(e,t={}),t})(i);a?(null!==(s=t.topics)&&void 0!==s?s:t.topics=new Map).set(e.id,e):t.dialog=e}}else this.dropDialogWithEvent(i,a?this.getDialogKey(e):void 0);const p=this.appMessagesManager.getUpdateAfterReloadKey(i,a?this.getDialogKey(e):void 0),d=this.appMessagesManager.newUpdatesAfterReloadToHandle[p];if(void 0!==d){for(const e of d)d.delete(e),this.apiUpdatesManager.saveUpdate(e);d.size||delete this.appMessagesManager.newUpdatesAfterReloadToHandle[p]}})),n.size&&this.rootScope.dispatchEvent("dialogs_multiupdate",n)}getDialogOffsetDate(e){const t=this.appMessagesManager.getMessageByPeer(e.peerId,e.top_message);return(null==t?void 0:t.date)||0}canSaveDialogByPeerId(e){if(e.isAnyChat()){const t=this.appChatsManager.getChat(e.toChatId());if("channelForbidden"===t._||t.pFlags.left)return!1}return!0}saveDialog({dialog:e,folderId:t,ignoreOffsetDate:a,saveGlobalOffset:s}){var n,i;const r=this.isTopic(e),p=!r,d=r?e.id=(0,pe.Z)(e.id):void 0;r||null!=t||(t=null!==(n=e.folder_id)&&void 0!==n?n:o.J$);const f=this.appPeersManager.getPeerId(e.peer);if(!f)return console.error("saveConversation no peerId???",e,t),!1;if(r||"dialog"===e._||console.error("saveConversation not regular dialog",e,Object.assign({},e)),p&&!this.canSaveDialogByPeerId(f))return!1;const c=this.appPeersManager.isChannel(f)?f.toChatId():o.NM;if(p){const e=this.appPeersManager.getPeerSearchText(f);this.dialogsIndex.indexObject(f,e)}const l=this.getDialogOrTopic(f,d);let m,g;if(e.top_message){m=(0,pe.Z)(e.top_message);const t=(null==l?void 0:l.top_message)&&this.appMessagesManager.getMessageByPeer(f,l.top_message);(null===(i=null==t?void 0:t.pFlags)||void 0===i?void 0:i.is_outgoing)&&l.top_message>=m&&(m=l.top_message),g=this.appMessagesManager.getMessageByPeer(f,m)}else m=this.appMessagesManager.generateTempMessageId(f),g={_:"message",id:m,mid:m,from_id:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(!1)),peer_id:this.appPeersManager.getOutputPeer(f),deleted:!0,pFlags:{out:!0},date:0,message:""},this.appMessagesManager.saveMessages([g],{isOutgoing:!0});if((null==g?void 0:g.pFlags)||this.appMessagesManager.log.error("saveConversation no message:",e,g),p&&!c&&f.isAnyChat()){const t=this.appChatsManager.getChat(f.toChatId());if(t&&t.migrated_to&&t.pFlags.deactivated){const a=this.appPeersManager.getPeerId(t.migrated_to);this.appMessagesManager.migratedFromTo[f]=a,this.appMessagesManager.migratedToFrom[a]=f,e.migratedTo=a}}if(e.top_message=m,e.read_inbox_max_id=(0,pe.Z)(l&&!e.read_inbox_max_id?l.read_inbox_max_id:e.read_inbox_max_id),e.read_outbox_max_id=(0,pe.Z)(l&&!e.read_outbox_max_id?l.read_outbox_max_id:e.read_outbox_max_id),p&&void 0===e.folder_id&&"dialog"===e._&&(e.folder_id=l?l.folder_id:t),e.draft=this.appDraftsManager.saveDraft({peerId:f,threadId:d,draft:e.draft}),e.peerId=f,g&&g.pFlags.is_outgoing){const t=g.pFlags.out;m>e[t?"read_outbox_max_id":"read_inbox_max_id"]?(g.pFlags.unread=!0,e.unread_count||t||++e.unread_count):delete g.pFlags.unread}const h=this.appMessagesManager.getHistoryStorage(f,d),u=h.history.slice;if(u.length?u.isEnd(se.D.Bottom)||(h.history.insertSlice([m]).setEnd(se.D.Bottom),h.count||(h.count=1),this.appMessagesManager.mergeReplyKeyboard(h,g)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:f})):(h.history.unshift(m),h.count||(h.count=1),this.appMessagesManager.mergeReplyKeyboard(h,g)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:f})),h.maxId=m,h.readMaxId=e.read_inbox_max_id,h.readOutboxMaxId=e.read_outbox_max_id,this.appNotificationsManager.savePeerSettings({peerId:f,threadId:r?e.id:void 0,settings:e.notify_settings}),p&&c&&e.pts&&this.apiUpdatesManager.addChannelState(c,e.pts),this.generateIndexForDialog(e),l){const t=this.dialogsStorage.prepareDialogUnreadCountModifying(l);re(l,e),t()}return this.pushDialog({dialog:e,offsetDate:null==g?void 0:g.date,ignoreOffsetDate:a,saveGlobalOffset:s}),r&&this.processTopicUpdate(e,l),!0}processTopicUpdate(e,t){if(!t)return;const{peerId:a,id:s}=e,n=e.icon_emoji_id!==t.icon_emoji_id,i=e.title!==t.title,r=n||i;n&&this.rootScope.dispatchEvent("avatar_update",{peerId:a,threadId:s}),r&&this.rootScope.dispatchEvent("peer_title_edit",{peerId:a,threadId:s})}getDialogs(e){const{query:t="",offsetIndex:a,limit:s=20,filterId:n=o.J$,skipMigrated:i=!1}=e,r=this.isFilterIdForForum(n);if(!r&&!o.DZ.has(n)){const t=[],a=this.appUsersManager.fillContacts();a.cached||t.push(a.promise);const s=this.filtersStorage.reloadMissingPeerIds(n);if(s&&t.push(s),t.length)return Promise.all(t).then((()=>this.getDialogs(e)))}const p=o.DZ.has(n)&&!this.getOffsetDate(n)||r?n:ye;let d=this.getFolderDialogs(n,i);const f=this.getDialogIndexKeyByFilterId(n);if(t&&!r){if(!s||this.cachedResults.query!==t||this.cachedResults.folderId!==n){this.cachedResults.query=t,this.cachedResults.folderId=n;const e=this.dialogsIndex.search(t),a=[];for(const t in this.dialogs){const s=this.dialogs[t];e.has(s.peerId)&&s.folder_id===n&&a.push(s)}a.sort(((e,t)=>this.getDialogIndex(t,f)-this.getDialogIndex(e,f))),this.cachedResults.dialogs=a,this.cachedResults.count=a.length}d=this.cachedResults.dialogs}else this.cachedResults.query="";let c=0;if(a>0)for(let e=d.length;cthis.getDialogIndex(d[c],f));++c);const l=this.isDialogsLoaded(p),m=d.length>=c+s;if(t||l||m){const e=d.slice(c,c+s);return{dialogs:e,count:l?d.length:null,isTopEnd:d.length&&(e[0]&&e[0]===d[0]||this.getDialogIndex(d[0],f)=d.length}}return this.appMessagesManager.getTopMessages({limit:s,folderId:p}).then((e=>{if(i&&(d=this.getFolderDialogs(n,i)),c=0,a>0)for(let e=d.length;cthis.getDialogIndex(d[c],f));++c);const t=d.slice(c,c+s);return{dialogs:t,count:void 0===e.count?d.length:e.count,isTopEnd:d.length&&(t[0]&&t[0]===d[0]||this.getDialogIndex(d[0],f){const t={},a=[];for(const[e,n]of s.getTopicPromises)t[e]=n,a.push((0,oe.Z)(e));s.getTopicPromises.clear();const n=()=>{for(const e in t)t[e].resolve(void 0),s.deletedTopics.add(+e)};if(this.getForumTopicsCache(e)===s)return this.apiManager.invokeApi("channels.getForumTopicsByID",{channel:this.appChatsManager.getChannelInput(e.toChatId()),topics:a}).then((a=>{if(this.getForumTopicsCache(e)===s)return this.applyDialogs(a,e),a.topics.forEach((a=>{"forumTopic"===a._&&(t[a.id].resolve(a),delete t[e])})),a}),(()=>{})).then((()=>{n(),s.getTopicsPromise=void 0,s.getTopicPromises.size&&this.getForumTopicById(e)}));n()}))),n||s.getTopicsPromise}getForumTopic(e,t){var a;const s=this.forumTopics.get(e);return null===(a=null==s?void 0:s.topics)||void 0===a?void 0:a.get(t)}getForumTopicOrReload(e,t){var a;const s=this.getForumTopic(e,t);if(s)return s;const n=this.getForumTopicsCache(e);return(null===(a=null==n?void 0:n.deletedTopics)||void 0===a?void 0:a.has(t))?void 0:this.getForumTopicById(e,t)}processTopics(e,t){return(0,q.Z)(t,(t=>{"pts"in t&&this.apiUpdatesManager.addChannelState(e.toChatId(),t.pts);const a=this.appPeersManager.getOutputPeer(e);return t.topics=t.topics.map((e=>{if("forumTopicDeleted"!==e._)return e.peer=a,e.id=(0,pe.Z)(e.id),e})).filter(Boolean),t}))}processTopicsPromise(e,t){return t.then((t=>(this.processTopics(e,t),t)))}getForumUnreadCount(e){if(!this.appPeersManager.isForum(e))return;const t=this.getFolder(e),a=t.dialogs.length>=20||this.isDialogsLoaded(e)?t.dialogs.slice(0,20):(0,q.Z)(this.getDialogs({filterId:e,limit:20}),(e=>e.dialogs));return(0,q.Z)(a,(e=>({count:e.reduce(((e,t)=>e+ +!!t.unread_count),0),hasUnmuted:e.some((e=>e.unread_count&&this.isDialogUnmuted(e)))})))}handleDialogTogglePinned(e,t,a){e&&(t?e.pFlags.pinned=!0:this.handleDialogUnpinning(e,a),this.generateIndexForDialog(e)),this.appMessagesManager.scheduleHandleNewDialogs(e.peerId,e)}handleDialogsPinned(e,t){const a=this.isFilterIdForForum(e);this.resetPinnedOrder(e),this.getPinnedOrders(e).push(...t),this.savePinnedOrders(),t.reverse();const s={};t.forEach((t=>{s[t]=!0;const n=a?e:t,i=a?t:void 0,r=this.getDialogOrTopic(n,i);this.appMessagesManager.scheduleHandleNewDialogs(n,r),r&&(r.pFlags.pinned=!0,this.generateIndexForDialog(r))}));const n=this.getFolderDialogs(e,!1);for(const e of n){if(!e.pFlags.pinned)break;s[this.getDialogKey(e)]||(delete e.pFlags.pinned,this.generateIndexForDialog(e),this.appMessagesManager.scheduleHandleNewDialogs(e.peerId,e))}}}var ve=a(8479),Pe=a(4064),be=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Me=[["pinned_peers","pinnedPeerIds"],["exclude_peers","excludePeerIds"],["include_peers","includePeerIds"]],Ie=o.DZ.size,Se={_:"dialogFilter",pFlags:{},flags:0,id:0,title:"",exclude_peers:[],include_peers:[],pinned_peers:[],excludePeerIds:[],includePeerIds:[],pinnedPeerIds:[]};class Ce extends G{constructor(){super(...arguments),this.clear=e=>{if(e){this.filters={},this.filtersArr=[],this.reloadedPeerIds=new Set,this.localFilters={};for(const e of o.DZ)this.localFilters[e]=this.generateLocalFilter(e)}else this.reloadedPeerIds.clear(),this.clearFilters();this.localId=o.Gu},this.onUpdateDialogFilter=e=>{e.filter?this.saveDialogFilter(e.filter):this.filters[e.id]&&(this.rootScope.dispatchEvent("filter_delete",this.filters[e.id]),delete this.filters[e.id],(0,Pe.Z)(this.filtersArr,(t=>t.id===e.id))),this.pushToState()},this.onUpdateDialogFilters=e=>{const t=(0,ve.Z)(this.filters);this.getDialogFilters(!0).then((e=>{for(const a in t){const t=+a;e.find((e=>e.id===t))||this.onUpdateDialogFilter({_:"updateDialogFilter",id:t})}this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:e.map((e=>e.id))})}))},this.onUpdateDialogFilterOrder=e=>{const t=e.order.slice();t.includes(o.Zi)||t.splice(t[0]===o.J$?1:0,0,o.Zi),this.localId=o.Gu,t.forEach((e=>{const t=this.filters[e];delete t.localId,this.setLocalId(t)})),this.rootScope.dispatchEvent("filter_order",t),this.pushToState()}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateDialogFilter:this.onUpdateDialogFilter,updateDialogFilters:this.onUpdateDialogFilters,updateDialogFilterOrder:this.onUpdateDialogFilterOrder}),this.rootScope.addEventListener("premium_toggle",(()=>{this.onUpdateDialogFilters({_:"updateDialogFilters"})})),this.appStateManager.getState().then((e=>{this.prependFilters(e.filtersArr).map((e=>{this.saveDialogFilter(e,!1,!0)}))}))}prependFilters(e){e=e.slice();const t=this.localFilters[o.J$],a=this.localFilters[o.Zi],s=e.findIndex((e=>"dialogFilterDefault"===e._||e.id===o.J$));return-1!==s?e[s]=t:e.unshift(t),(0,Pe.Z)(e,(e=>e.id===o.Zi)),e.splice(e[0]===t?1:0,0,a),this.localId=o.Gu,e.forEach((e=>{delete e.localId})),e}generateLocalFilter(e){const t=Object.assign(Object.assign({},(0,ve.Z)(Se)),{id:e});return e===o.J$?t.pFlags.exclude_archived=!0:e===o.Zi&&(t.pFlags.exclude_unarchived=!0),o.DZ.has(e)&&(t.pinnedPeerIds=this.dialogsStorage.getPinnedOrders(e)),t}pushToState(){this.appStateManager.pushToState("filtersArr",this.filtersArr)}testDialogForFilter(e,t){if(!t)return!0;if(o.DZ.has(t.id))return e.folder_id===t.id&&this.dialogsStorage.canSaveDialogByPeerId(e.peerId);const a=e.peerId;if(!this.appMessagesManager.getDialogOnly(a))return!1;if(t.excludePeerIds.includes(a))return!1;if(t.includePeerIds.includes(a))return!0;const s=t.pFlags;if(s.exclude_archived&&e.folder_id===o.Zi)return!1;if(s.exclude_read&&!this.appMessagesManager.isDialogUnread(e))return!1;if(s.exclude_muted&&this.appNotificationsManager.isPeerLocalMuted({peerId:a})&&(!e.unread_mentions_count||!e.unread_count))return!1;if(this.appPeersManager.isAnyChat(a)){if(s.broadcasts&&this.appPeersManager.isBroadcast(a))return!0;if(s.groups&&this.appPeersManager.isAnyGroup(a))return!0}else{const e=a.toUserId();if(this.appUsersManager.isBot(e))return!!s.bots;if(s.non_contacts&&!this.appUsersManager.isContact(e))return!0;if(s.contacts&&this.appUsersManager.isContact(e))return!0}return!1}testDialogForFilterId(e,t){return this.testDialogForFilter(e,this.filters[t])}getFilter(e){return this.filters[e]}getFilters(){return this.filters}clearFilters(){const e=this.getFilters();for(const t in e)o.DZ.has(+t)||this.onUpdateDialogFilter({_:"updateDialogFilter",id:+t})}toggleDialogPin(e,t){return be(this,void 0,void 0,(function*(){const a=this.filters[t],s=a.pinnedPeerIds.indexOf(e),n=-1!==s;if(n&&(a.pinned_peers.splice(s,1),a.pinnedPeerIds.splice(s,1)),!n){if(a.pinned_peers.length>=(yield this.apiManager.getConfig()).pinned_infolder_count_max)return Promise.reject((0,X.Z)("PINNED_DIALOGS_TOO_MUCH"));a.pinned_peers.unshift(this.appPeersManager.getInputPeerById(e)),a.pinnedPeerIds.unshift(e)}return this.updateDialogFilter(a)}))}createDialogFilter(e,t){const a=Math.max(1,...Object.keys(this.filters).map((e=>+e)));return(e=(0,ve.Z)(e)).id=a+1,this.updateDialogFilter(e,void 0,t)}updateDialogFilter(e,t=!1,a=!1){const s=t?0:1;return this.apiManager.invokeApi("messages.updateDialogFilter",{flags:s,id:e.id,filter:t?void 0:this.getOutputDialogFilter(e)}).then((s=>{if(s&&(this.onUpdateDialogFilter({_:"updateDialogFilter",id:e.id,filter:t?void 0:e}),a)){const t=[];for(const e in this.filters){const a=this.filters[e];++a.localId,t.push(a)}e.localId=o.Gu;const a=t.sort(((e,t)=>e.localId-t.localId)).map((e=>e.id));this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:a})}return s}))}updateDialogFiltersOrder(e){return this.apiManager.invokeApi("messages.updateDialogFiltersOrder",{order:e}).then((()=>{this.onUpdateDialogFilterOrder({_:"updateDialogFilterOrder",order:e})}))}getOutputDialogFilter(e){const t=(0,ve.Z)(e);return this.filterIncludedPinnedPeers(e),t}filterIncludedPinnedPeers(e){(0,ne.Z)(e.includePeerIds,((t,a)=>{e.pinnedPeerIds.includes(t)&&(e.include_peers.splice(a,1),e.includePeerIds.splice(a,1))}))}reloadMissingPeerIds(e,t="pinned_peers"){const a=this.getFilter(e),s=null==a?void 0:a[t];if(!(null==s?void 0:s.length))return;const n=s.filter((e=>{const t=this.appPeersManager.getPeerId(e),a=this.reloadedPeerIds.has(t),s=this.appMessagesManager.getDialogOnly(t);return!a&&!s}));if(!n.length)return;const i=n.map((e=>{const t=this.appPeersManager.getPeerId(e);return this.appMessagesManager.reloadConversation(e).then((e=>(this.reloadedPeerIds.add(t),e?void 0:t)))}));return Promise.all(i).then((e=>{(e=e.filter(Boolean)).length}))}getDialogFilters(e=!1){return be(this,void 0,void 0,(function*(){const t=Object.keys(this.filters);if(t.length>Ie&&!e)return t.map((e=>this.filters[e])).sort(((e,t)=>e.localId-t.localId));const a=yield this.apiManager.invokeApiSingle("messages.getDialogFilters");return this.prependFilters(a).map((t=>this.saveDialogFilter(t,e))).filter(Boolean)}))}getSuggestedDialogsFilters(){return this.apiManager.invokeApi("messages.getSuggestedDialogFilters")}saveDialogFilter(e,t=!0,a){"dialogFilterDefault"===e._&&(e=this.localFilters[o.J$]),(0,ue.Z)(e),o.DZ.has(e.id)||(Me.forEach((([t,a])=>{(0,ue.Z)(e),e[a]=e[t].map((e=>this.appPeersManager.getPeerId(e)))})),this.filterIncludedPinnedPeers(e),e.include_peers=e.pinned_peers.concat(e.include_peers),e.includePeerIds=e.pinnedPeerIds.concat(e.includePeerIds));const s=this.filters[e.id];return s?Object.assign(s,e):this.filters[e.id]=e,this.setLocalId(e),a||(t?this.rootScope.dispatchEvent("filter_update",e):s||this.rootScope.dispatchEvent("filter_new",e)),e}setLocalId(e){void 0!==e.localId?e.localId>=this.localId&&(this.localId=e.localId+1):(e.localId=this.localId++,(0,Pe.Z)(this.filtersArr,(t=>t.id===e.id)),this.filtersArr.push(e),this.pushToState())}isFilterIdAvailable(e){return be(this,void 0,void 0,(function*(){if(o.DZ.has(e))return!0;const t=yield this.apiManager.getLimit("folders");return this.filtersArr.filter((e=>!o.DZ.has(e.id))).slice(0,t).some((t=>t.id===e))}))}}var we=a(6690),ke=a(2821);function Ae(e,t){t.forEach((t=>{Object.getOwnPropertyNames(t.prototype).forEach((a=>{const s=Object.getOwnPropertyDescriptor(t.prototype,a)||Object.create(null);"constructor"!==a&&Object.defineProperty(e.prototype,a,s)}))}))}class De{constructor(){this.updatesState={pendingPtsUpdates:[],pendingSeqUpdates:{},syncPending:null,syncLoading:null},this.channelStates={},this.attached=!1,this.log=(0,I.kg)("UPDATES",I.v9.Error|I.v9.Warn|I.v9.Log),this.debug=d.ZP,this.subscriptions={},this.processUpdateMessage=(e,t={})=>{const a={date:e.date,seq:e.seq,seqStart:e.seq_start};switch(this.debug&&this.log.debug("processUpdateMessage",e),e._){case"updatesTooLong":case"new_session_created":this.forceGetDifference();break;case"updateShort":this.processUpdate(e.update,a);break;case"updateShortMessage":case"updateShortChatMessage":{(0,ue.Z)(e),this.debug&&this.log.debug("updateShortMessage | updateShortChatMessage",Object.assign({},e));const t=e.pFlags.out,s=e.from_id||(t?this.appPeersManager.peerId:e.user_id),n=e.chat_id?e.chat_id.toPeerId(!0):e.user_id.toPeerId(!1)||this.appPeersManager.peerId;this.processUpdate({_:"updateNewMessage",message:{_:"message",pFlags:e.pFlags,id:e.id,from_id:this.appPeersManager.getOutputPeer(s.toPeerId()),peer_id:this.appPeersManager.getOutputPeer(n),date:e.date,message:e.message,fwd_from:e.fwd_from,reply_to:e.reply_to,entities:e.entities},pts:e.pts,pts_count:e.pts_count},a);break}case"updatesCombined":case"updates":this.appUsersManager.saveApiUsers(e.users,t.override),this.appChatsManager.saveApiChats(e.chats,t.override),e.updates.forEach((e=>{this.processUpdate(e,a)}));break;default:this.log.warn("Unknown update message",e)}},this._constructor(!1)}setProxy(){const e=this;this.updatesState=new Proxy(this.updatesState,{set:function(t,a,s){return t[a]=s,e.saveUpdatesState(),!0}})}saveUpdatesState(){const e=this.updatesState;this.appStateManager.pushToState("updates",{seq:e.seq,pts:e.pts,date:e.date})}popPendingSeqUpdate(){var e;const t=this.updatesState,a=t.seq+1,s=t.pendingSeqUpdates[a];if(!s)return!1;const n=s.updates;for(let e=0,t=n.length;e=t.syncPending.seqAwaiting&&(t.syncPending.ptsAwaiting?delete t.syncPending.seqAwaiting:this.clearStatePendingSync(t)),!0}popPendingPtsUpdate(e){const t=e?this.getChannelState(e):this.updatesState;if(!t.pendingPtsUpdates.length)return!1;t.pendingPtsUpdates.sort(((e,t)=>e.pts-t.pts));let a=t.pts,s=0,n=0;for(let e=0,i=t.pendingPtsUpdates.length;e=i.pts&&(s=i.pts,n=e)}if(!s)return!1;this.debug&&this.log.debug("pop pending pts updates",s,t.pendingPtsUpdates.slice(0,n+1)),t.pts=s;for(let e=0;e<=n;++e){const a=t.pendingPtsUpdates[e];this.saveUpdate(a)}return t.pendingPtsUpdates.splice(0,n+1),!t.pendingPtsUpdates.length&&t.syncPending&&(t.syncPending.seqAwaiting?delete t.syncPending.ptsAwaiting:this.clearStatePendingSync(t)),!0}forceGetDifference(){this.updatesState.syncLoading||this.getDifference()}processLocalUpdate(e){this.processUpdateMessage({_:"updateShort",update:e})}getDifference(e=!1){const t=this.updatesState,a=t.syncLoading;a||(t.pendingSeqUpdates={},t.pendingPtsUpdates=[]),this.clearStatePendingSync(t);const s=this.apiManager.invokeApi("updates.getDifference",{pts:t.pts,pts_total_limit:e?1200:void 0,date:t.date,qts:-1},{timeout:2147483647}).then((a=>{if(this.debug&&this.log.debug("Get diff result",a),"updates.differenceEmpty"===a._)return this.debug&&this.log.debug("apply empty diff",a.seq),t.date=a.date,void(t.seq=a.seq);if(e&&this.rootScope.dispatchEvent("state_synchronizing"),"updates.differenceTooLong"!==a._){this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),a.other_updates.forEach((e=>{switch(e._){case"updateChannelTooLong":case"updateNewChannelMessage":case"updateEditChannelMessage":return void this.processUpdate(e)}this.saveUpdate(e)})),a.new_messages.forEach((e=>{this.saveUpdate({_:"updateNewMessage",message:e,pts:t.pts,pts_count:0})}));const e="updates.difference"===a._?a.state:a.intermediate_state;t.seq=e.seq,t.pts=e.pts,t.date=e.date}else t.pts=a.pts,t.date=(Date.now()/1e3|0)+this.timeManager.getServerTimeOffset(),delete t.seq,this.channelStates={},this.log.warn("getDifference:",a._),this.onDifferenceTooLong();if("updates.differenceSlice"===a._)return this.getDifference();this.debug&&this.log.debug("finished get diff")}));return a||this.justAName(t,s),s}clearStatePendingSync(e){e.syncPending&&(clearTimeout(e.syncPending.timeout),e.syncPending=null)}getChannelDifference(e){const t=this.getChannelState(e),a=t.syncLoading;a||(t.pendingPtsUpdates=[]),this.clearStatePendingSync(t);const s=this.debug?this.log.bindPrefix("getChannelDifference-"+e):void 0,n=this.apiManager.invokeApi("updates.getChannelDifference",{channel:this.appChatsManager.getChannelInput(e),filter:{_:"channelMessagesFilterEmpty"},pts:t.pts,limit:1e3},{timeout:2147483647}).then((a=>{if(null==s||s.debug("diff result",a),t.pts="pts"in a?a.pts:void 0,t.lastDifferenceTime=Date.now(),"updates.channelDifferenceEmpty"!==a._){if("updates.channelDifferenceTooLong"===a._)return delete this.channelStates[e],void this.saveUpdate({_:"updateChannelReload",channel_id:e});if(this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),null==s||s.debug("applying",a.other_updates.length,"channel other updates"),a.other_updates.forEach((e=>{this.saveUpdate(e)})),null==s||s.debug("applying",a.new_messages.length,"channel new messages"),a.new_messages.forEach((e=>{this.saveUpdate({_:"updateNewChannelMessage",message:e,pts:t.pts,pts_count:0})})),null==s||s.debug("apply channel diff",t.pts),"updates.channelDifference"===a._&&!a.pFlags.final)return this.getChannelDifference(e);null==s||s.debug("finished channel get diff")}}));return a||this.justAName(t,n,e),n}onDifferenceTooLong(){this.appUsersManager.clear(),this.appChatsManager.clear(),this.appMessagesManager.clear(),this.rootScope.dispatchEvent("state_cleared")}justAName(e,t,a){e.syncLoading=t,this.rootScope.dispatchEvent("state_synchronizing",a),t.then((()=>{e.syncLoading=null,this.rootScope.dispatchEvent("state_synchronized",a)}),(()=>{e.syncLoading=null}))}addChannelState(e,t){var a,s;if(!t)throw new Error("Add channel state without pts "+e);return null!==(a=(s=this.channelStates)[e])&&void 0!==a?a:s[e]={pts:t,pendingPtsUpdates:[],syncPending:null,syncLoading:null}}getChannelState(e,t){return void 0===this.channelStates[e]&&this.addChannelState(e,t),this.channelStates[e]}processUpdate(e,t={}){var a,s,n,i;let r;switch(e._){case"updateNewChannelMessage":case"updateEditChannelMessage":r=this.appPeersManager.getPeerId(e.message.peer_id).toChatId();break;case"updateChannelTooLong":if(r=e.channel_id,!(r in this.channelStates))return!1;break;default:"channel_id"in e&&"pts"in e&&(r=e.channel_id)}const{pts:o,pts_count:p}=e,d=r?this.getChannelState(r,o):this.updatesState;if(d.syncLoading)return!1;if("updateChannelTooLong"===e._)return(!d.lastPtsUpdateTime||d.lastPtsUpdateTime{d.syncPending=null,d.syncLoading||(r?this.getChannelDifference(r):this.getDifference())}),6)}),d.syncPending.ptsAwaiting=!0,!1;if(o>d.pts)d.pts=o,f=!0,d.lastPtsUpdateTime=Date.now();else if(p)return!1;r&&t.date&&this.updatesState.date0){const a=t.seq,r=t.seqStart||a;if(r!==d.seq+1&&r>d.seq)return this.debug&&this.log.warn("Seq hole",d,null===(s=d.syncPending)||void 0===s?void 0:s.seqAwaiting),null!==(n=(i=d.pendingSeqUpdates)[r])&&void 0!==n||(i[r]={seq:a,date:t.date,updates:[]}),d.pendingSeqUpdates[r].updates.push(e),d.syncPending||(d.syncPending={timeout:E.Z.setTimeout((()=>{d.syncPending=null,d.syncLoading||this.getDifference()}),6)}),(!d.syncPending.seqAwaiting||d.syncPending.seqAwaiting{const t=this.getChannelState(e);t.syncLoading||t.lastDifferenceTime&&!(Date.now()-t.lastDifferenceTime>2500)||this.getChannelDifference(e)};null!==(a=n.interval)&&void 0!==a||(n.interval=E.Z.setInterval(i,3e3)),i()}unsubscribeFromChannelUpdates(e,t){const a=this.subscriptions[e];!(null==a?void 0:a.interval)||--a.count&&!t||(clearInterval(a.interval),a.interval=void 0,delete this.subscriptions[e])}attach(e){this.attached||(this.log("attach"),this.attached=!0,this.appStateManager.getState().then((({updates:t})=>{const a=this.appStateManager.newVersion;t&&t.pts&&t.date?(Object.assign(this.updatesState,t),this.log("will get difference",Object.assign({},t)),this.getDifference(!0)):(this.log("will get new state"),this.updatesState.syncLoading=new Promise((e=>{this.apiManager.invokeApi("updates.getState",{},{noErrorBox:!0}).then((t=>{this.updatesState.seq=t.seq,this.updatesState.pts=t.pts,this.updatesState.date=t.date,this.saveUpdatesState(),this.updatesState.syncLoading=null,e()}))}))),this.apiManager.setUpdatesProcessor(this.processUpdateMessage),this.setProxy(),a&&this.updatesState.syncLoading.then((()=>{return t=this,s=void 0,i=function*(){const t={en:"was updated to version",ru:"обновлён до версии"},s=e=>{fetch(`changelogs/${e}_${a.split(" ")[0]}.md`).then((e=>200===e.status&&e.ok&&e.text()||Promise.reject())).then((s=>{const n=t[e]||t.en;s=`**Telegram Web${_.Z.suffix} ${n} ${a}**\n\n`+s;const i=[],r={_:"updateServiceNotification",entities:i,message:(0,ke.Z)(s,i),type:"local",pFlags:{},inbox_date:Date.now()/1e3|0,media:void 0};this.processLocalUpdate(r)}))},n=(0,we.Z)([e,"en"]);for(const e of n)try{yield s(e);break}catch(e){}},new((n=void 0)||(n=Promise))((function(e,a){function r(e){try{p(i.next(e))}catch(e){a(e)}}function o(e){try{p(i.throw(e))}catch(e){a(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof n?a:new n((function(e){e(a)}))).then(r,o)}p((i=i.apply(t,s||[])).next())}));var t,s,n,i}))})))}}Ae(De,[p.Z,G]);class Ue extends G{constructor(){super(...arguments),this.savedAvatarURLs={}}after(){this.rootScope.addEventListener("avatar_update",(({peerId:e,threadId:t})=>{t||this.removeFromAvatarsCache(e)}))}isAvatarCached(e,t){const a=this.savedAvatarURLs[e];return void 0===t?!!a:!(!a||!a[t]||a[t]instanceof Promise)}removeFromAvatarsCache(e){this.savedAvatarURLs[e]&&delete this.savedAvatarURLs[e]}loadAvatar(e,t,a){var s,n;const i=null!==(s=(n=this.savedAvatarURLs)[e])&&void 0!==s?s:n[e]={};if(i[a])return i[a];{const s={_:"inputPeerPhotoFileLocation",pFlags:{},peer:this.appPeersManager.getInputPeerById(e),photo_id:t.photo_id},n={dcId:t.dc_id,location:s};"photo_big"===a&&(s.pFlags.big=!0,n.limitPart=524288);const r=this.apiFileManager.download(n);return i[a]=r.then((e=>i[a]=URL.createObjectURL(e)))}}}var Te=a(144),Ee=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class Fe extends G{after(){this.calls=new Map,i().IS_CALL_SUPPORTED&&this.apiUpdatesManager.addMultipleEventsListeners({updatePhoneCall:e=>{this.saveCall(e.phone_call)},updatePhoneCallSignalingData:e=>{this.rootScope.dispatchEvent("call_signaling",{callId:e.phone_call_id,data:e.data})}})}computeKey(e,t,a){return this.cryptoWorker.invokeCrypto("compute-dh-key",e,t,a)}saveCall(e){const t="phoneCallDiscarded"===e._,a=this.calls.get(e.id);return a?(re(a,e),t&&this.calls.delete(e.id),e=a):t||this.calls.set(e.id,e),this.rootScope.dispatchEvent("call_update",e),e}getCall(e){return this.calls.get(e)}getCallInput(e){const t=this.getCall(e);return{_:"inputPhoneCall",id:t.id,access_hash:t.access_hash}}savePhonePhoneCall(e){return this.appUsersManager.saveApiUsers(e.users),this.saveCall(e.phone_call)}generateDh(){return this.apiManager.invokeApi("messages.getDhConfig",{version:0,random_length:256}).then((e=>this.cryptoWorker.invokeCrypto("generate-dh",e)))}requestCall(e,t,a,s){return Ee(this,void 0,void 0,(function*(){const n=yield this.apiManager.invokeApi("phone.requestCall",{user_id:this.appUsersManager.getUserInput(e),protocol:t,video:s,random_id:(0,Te.d)(32),g_a_hash:a});return this.savePhonePhoneCall(n)}))}discardCall(e,t,a,s){return Ee(this,void 0,void 0,(function*(){if(!this.getCall(e))return;const n=yield this.apiManager.invokeApi("phone.discardCall",{video:s,peer:this.getCallInput(e),duration:t,reason:{_:a},connection_id:"0"});this.apiUpdatesManager.processUpdateMessage(n)}))}}var Re=a(7120),xe=a(2566);class Be extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e)this.chats={};else for(const e in this.chats)if(e&&!this.peersStorage.isPeerNeeded(e.toPeerId(!0))){const t=this.chats[e];this.appUsersManager.modifyUsernamesCache(t,!1),this.storage.delete(e),delete this.chats[e]}},this.onChatUpdated=(e,t)=>{var a;this.apiUpdatesManager.processUpdateMessage(t),(null===(a=null==t?void 0:t.updates)||void 0===a?void 0:a.length)&&this.isChannel(e)&&this.rootScope.dispatchEvent("invalidate_participants",e)}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateChannelParticipant:e=>{this.apiManager.clearCache("channels.getParticipants",(t=>t.channel.channel_id===e.channel_id))},updateChatDefaultBannedRights:e=>{const t=this.appPeersManager.getPeerId(e.peer).toChatId(),a=this.chats[t];a&&(a.default_banned_rights=e.default_banned_rights,this.rootScope.dispatchEvent("chat_update",t))}}),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("chats")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.saveApiChats(t),this.peersStorage.addEventListener("peerNeeded",(e=>{e.isUser()||this.storage.getFromCache(e.toChatId())||this.storage.set({[e.toChatId()]:this.getChat(e.toChatId())})})),this.peersStorage.addEventListener("peerUnneeded",(e=>{!e.isUser()&&this.storage.getFromCache(e.toChatId())&&this.storage.delete(e.toChatId())}))}))}saveApiChats(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiChat(e,t))))}saveApiChat(e,t){var a,s,n,i,r;if(!e||"chatEmpty"===e._)return;const o=this.chats[e.id];if(null!==(a=(r=e).pFlags)&&void 0!==a||(r.pFlags={}),e.pFlags.min&&void 0!==o)return;"channel"===e._&&void 0===e.participants_count&&void 0!==o&&o.participants_count&&(e.participants_count=o.participants_count),"chatPhotoEmpty"===(null===(s=e.photo)||void 0===s?void 0:s._)&&delete e.photo;const p=this.appUsersManager.setUsernameToCache(e,o),d=e.id.toPeerId(!0);if(void 0===o)this.chats[e.id]=e;else{const t=null===(n=o.photo)||void 0===n?void 0:n.photo_id,a=null===(i=e.photo)||void 0===i?void 0:i.photo_id,s=o.pFlags.forum!==e.pFlags.forum,r=t!==a||s,f=o.title!==e.title||p,c=o.pFlags.verified!==e.pFlags.verified||o.pFlags.scam!==e.pFlags.scam||o.pFlags.fake!==e.pFlags.fake;re(o,e),this.rootScope.dispatchEvent("chat_update",e.id),r&&this.rootScope.dispatchEvent("avatar_update",{peerId:d}),(f||c)&&this.rootScope.dispatchEvent("peer_title_edit",{peerId:d}),s&&this.rootScope.dispatchEvent("chat_toggle_forum",{chatId:e.id,enabled:!!e.pFlags.forum})}this.peersStorage.isPeerNeeded(d)&&this.storage.set({[e.id]:e})}getChat(e){return this.chats[e]}hasRights(e,t,a,s){return(0,Re.Z)(this.getChat(e),t,a,s)}editChatDefaultBannedRights(e,t){const a=this.getChat(e);return a.default_banned_rights&&a.default_banned_rights.until_date===t.until_date&&(0,Y.Z)(a.default_banned_rights.pFlags,t.pFlags)?Promise.resolve():this.apiManager.invokeApi("messages.editChatDefaultBannedRights",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0)),banned_rights:t}).then(this.onChatUpdated.bind(this,e))}isChannel(e){const t=this.chats[e];return!(!t||"channel"!==t._&&"channelForbidden"!==t._)}isMegagroup(e){var t;const a=this.chats[e];return!!(null===(t=null==a?void 0:a.pFlags)||void 0===t?void 0:t.megagroup)}isForum(e){var t;const a=this.chats[e];return!!(null===(t=null==a?void 0:a.pFlags)||void 0===t?void 0:t.forum)}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isInChat(e){let t=!0;const a=this.getChat(e);return(!a||"channelForbidden"===a._||"chatForbidden"===a._||"chatEmpty"===a._||a.pFlags.left||a.pFlags.deactivated)&&(t=!1),t}getChannelInput(e){const t=this.getChat(e);return t&&t.access_hash?{_:"inputChannel",channel_id:e,access_hash:t.access_hash||"0"}:{_:"inputChannelEmpty"}}getInputPeer(e){return this.isChannel(e)?this.getChannelInputPeer(e):this.getChatInputPeer(e)}getChatInputPeer(e){return{_:"inputPeerChat",chat_id:e}}getChannelInputPeer(e){return{_:"inputPeerChannel",channel_id:e,access_hash:this.getChat(e).access_hash||0}}hasChat(e,t){const a=this.chats[e];return(0,fe.Z)(a)&&(t||!a.pFlags.min)}getChatString(e){const t=this.getChat(e);return this.isChannel(e)?(this.isMegagroup(e)?"s":"c")+e+"_"+t.access_hash:"g"+e}createChannel(e){return this.apiManager.invokeApi("channels.createChannel",e).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}inviteToChannel(e,t){const a=this.getChannelInput(e),s=t.map((e=>this.appUsersManager.getUserInput(e)));return this.apiManager.invokeApi("channels.inviteToChannel",{channel:a,users:s}).then(this.onChatUpdated.bind(this,e))}createChat(e,t){return this.apiManager.invokeApi("messages.createChat",{users:t.map((e=>this.appUsersManager.getUserInput(e))),title:e}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}leaveChannel(e){return this.apiManager.invokeApi("channels.leaveChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}joinChannel(e){return this.apiManager.invokeApi("channels.joinChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}addChatUser(e,t,a=100){return this.apiManager.invokeApi("messages.addChatUser",{chat_id:e,user_id:this.appUsersManager.getUserInput(t),fwd_limit:a}).then(this.onChatUpdated.bind(this,e))}deleteChatUser(e,t){return this.apiManager.invokeApi("messages.deleteChatUser",{chat_id:e,user_id:this.appUsersManager.getUserInput(t)}).then(this.onChatUpdated.bind(this,e))}leaveChat(e){return this.deleteChatUser(e,this.appUsersManager.getSelf().id)}leave(e){return this.isChannel(e)?this.leaveChannel(e):this.leaveChat(e)}delete(e){return this.isChannel(e)?this.deleteChannel(e):this.deleteChat(e)}deleteChannel(e){return this.apiManager.invokeApi("channels.deleteChannel",{channel:this.getChannelInput(e)}).then(this.onChatUpdated.bind(this,e))}deleteChat(e){return this.apiManager.invokeApi("messages.deleteChat",{chat_id:e})}migrateChat(e){const t=this.getChat(e);return"channel"===t._?Promise.resolve(t.id):this.apiManager.invokeApi("messages.migrateChat",{chat_id:e}).then((t=>(this.onChatUpdated(e,t),t.updates.find((e=>"updateChannel"===e._)).channel_id)))}updateUsername(e,t,a){const s=this.apiManager.invokeApi("channels.updateUsername",{channel:this.getChannelInput(e),username:t});return this.refreshChatAfterRequest(e,s,a)}editPhoto(e,t){const a={_:"inputChatUploadedPhoto",file:t};let s;return s=this.isChannel(e)?this.apiManager.invokeApi("channels.editPhoto",{channel:this.getChannelInput(e),photo:a}):this.apiManager.invokeApi("messages.editChatPhoto",{chat_id:e,photo:a}),s.then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}editTitle(e,t){let a;return a=this.isChannel(e)?this.apiManager.invokeApi("channels.editTitle",{channel:this.getChannelInput(e),title:t}):this.apiManager.invokeApi("messages.editChatTitle",{chat_id:e,title:t}),a.then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}editAbout(e,t){const a=e.toPeerId(!0);return this.apiManager.invokeApi("messages.editChatAbout",{peer:this.appPeersManager.getInputPeerById(a),about:t}).then((e=>(e&&this.rootScope.dispatchEvent("peer_bio_edit",a),e)))}editBanned(e,t,a){const s="object"!=typeof t?t:(0,xe.Z)(t);return this.apiManager.invokeApi("channels.editBanned",{channel:this.getChannelInput(e),participant:this.appPeersManager.getInputPeerById(s),banned_rights:a}).then((n=>{if(this.onChatUpdated(e,n),"object"==typeof t){const n=Date.now()/1e3|0;this.apiUpdatesManager.processLocalUpdate({_:"updateChannelParticipant",channel_id:e,date:n,actor_id:void 0,qts:void 0,user_id:s,prev_participant:t,new_participant:Object.keys(a.pFlags).length?{_:"channelParticipantBanned",date:n,banned_rights:a,kicked_by:this.appUsersManager.getSelf().id,peer:this.appPeersManager.getOutputPeer(s),pFlags:{}}:void 0})}}))}clearChannelParticipantBannedRights(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{}})}kickFromChannel(e,t){return this.editBanned(e,t,{_:"chatBannedRights",until_date:0,pFlags:{view_messages:!0}})}kickFromChat(e,t){return this.isChannel(e)?this.kickFromChannel(e,t):this.deleteChatUser(e,t.toUserId())}resolveChannel(e){return this.apiManager.invokeApiSingle("channels.getChannels",{id:[{_:"inputChannel",channel_id:e,access_hash:"0"}]}).then((e=>{this.saveApiChats(e.chats)}))}togglePreHistoryHidden(e,t){return this.migrateChat(e).then((e=>this.apiManager.invokeApi("channels.togglePreHistoryHidden",{channel:this.getChannelInput(e),enabled:t}).then(this.onChatUpdated.bind(this,e))))}toggleSignatures(e,t){return this.apiManager.invokeApi("channels.toggleSignatures",{channel:this.getChannelInput(e),enabled:t}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}toggleNoForwards(e,t){return this.apiManager.invokeApi("messages.toggleNoForwards",{peer:this.getInputPeer(e),enabled:t}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}setChatAvailableReactions(e,t){const a=this.appProfileManager.getCachedFullChat(e);return a&&(a.available_reactions=t,this.rootScope.dispatchEvent("chat_full_update",e)),this.apiManager.invokeApi("messages.setChatAvailableReactions",{peer:this.getInputPeer(e),available_reactions:t}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}getSendAs(e){return this.apiManager.invokeApiSingleProcess({method:"channels.getSendAs",params:{peer:this.getChannelInputPeer(e)},processResult:e=>(this.appUsersManager.saveApiUsers(e.users),this.saveApiChats(e.chats),e.peers)})}importChatInvite(e){return this.apiManager.invokeApi("messages.importChatInvite",{hash:e}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e.chats[0].id)))}checkUsername(e,t){return this.apiManager.invokeApi("channels.checkUsername",{channel:this.getChannelInput(e),username:t})}getSponsoredMessage(e){return this.apiManager.invokeApiCacheable("channels.getSponsoredMessages",{channel:this.getChannelInput(e)},{cacheSeconds:300}).then((e=>{if("messages.sponsoredMessages"===e._){this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const t=e.messages.shift();e.messages.push(t)}return e}))}viewSponsoredMessage(e,t){return this.apiManager.invokeApiSingle("channels.viewSponsoredMessage",{channel:this.getChannelInput(e),random_id:t})}checkChatInvite(e){return this.apiManager.invokeApi("messages.checkChatInvite",{hash:e}).then((e=>(e.chat&&this.saveApiChat(e.chat,!0),e)))}toggleUsername(e,t,a){const s=this.apiManager.invokeApi("channels.toggleUsername",{channel:this.getChannelInput(e),username:t,active:a});return this.refreshChatAfterRequest(e,s)}reorderUsernames(e,t){const a=this.apiManager.invokeApi("channels.reorderUsernames",{channel:this.getChannelInput(e),order:t});return this.refreshChatAfterRequest(e,a)}deactivateAllUsernames(e,t){const a=this.apiManager.invokeApi("channels.deactivateAllUsernames",{channel:this.getChannelInput(e)});return this.refreshChatAfterRequest(e,a,t)}makeChannelPrivate(e){const t=[this.updateUsername(e,"",!0),this.deactivateAllUsernames(e,!0)],a=Promise.all(t).then((()=>!0));return this.refreshChatAfterRequest(e,a)}refreshChatAfterRequest(e,t,a){return a?t:t.then((t=>this.getChannels([e]).then((()=>t))))}getChannels(e){return this.apiManager.invokeApi("channels.getChannels",{id:e.map((e=>this.getChannelInput(e)))}).then((e=>{this.saveApiChats(e.chats)}))}toggleForum(e,t){return this.migrateChat(e).then((e=>this.apiManager.invokeApi("channels.toggleForum",{channel:this.getChannelInput(e),enabled:t}).then(this.onChatUpdated.bind(this,e))))}editForumTopic(e){const{chatId:t,topicId:a,title:s,iconEmojiId:n,closed:i,hidden:r}=e;return this.apiManager.invokeApi("channels.editForumTopic",{channel:this.getChannelInput(t),topic_id:(0,oe.Z)(a),title:s,icon_emoji_id:n,closed:i,hidden:r}).then(this.onChatUpdated.bind(this,t))}createForumTopic(e){return t=this,a=void 0,n=function*(){const{chatId:t,title:a,iconColor:s,iconEmojiId:n}=e,i=yield this.appProfileManager.getChannelFull(t),r=i.default_send_as&&this.appPeersManager.getInputPeerById(this.appPeersManager.getPeerId(i.default_send_as));return this.apiManager.invokeApi("channels.createForumTopic",{channel:this.getChannelInput(t),title:a,icon_color:s,icon_emoji_id:n,random_id:(0,Te.a)(),send_as:r}).then((e=>{this.onChatUpdated(t,e);const a=e.updates.find((e=>"updateNewChannelMessage"===e._));return(0,pe.Z)(a.message.id)}))},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}updatePinnedForumTopic(e,t,a){return this.apiManager.invokeApi("channels.updatePinnedForumTopic",{channel:this.getChannelInput(e),topic_id:(0,oe.Z)(t),pinned:a}).then(this.onChatUpdated.bind(this,e))}}a(4762);var Ve,Oe=a(5953),Le=a(9005),Ne=a(6637),Ze=a(2423);function je(e,t){(0,Ne.Z)(e)||(e="https://"+e);const a={url:e};let s,n,i,r;if(s=e.match(/^(?:https?:\/\/)?(?:(.+?)\.)?(?:(?:web|k|z)\.)?t(?:elegram)?\.me(?:\/(.+))?/)){const t=new URL(e);let a=s[1];a&&o.BX.has(s[1])&&(a=void 0),a&&(t.pathname=a+("/"===t.pathname?"":t.pathname));const n=t.pathname.slice(1),i=n.split("/");if(i[0]&&"$"===i[0][0]&&i[0].length>1)r="invoice";else if(/^\W/.test(n)&&!Ze.kO.test(n))r="joinchat";else switch(i[0]){case"joinchat":case"addstickers":case"addemoji":case"voicechat":case"invoice":if(1!==i.length&&!a){r=i[0];break}default:if(i[1]&&i[1].match(/^\d+(?:\?(?:comment|thread)=\d+)?$/)||1===i.length){r="im";break}}}else(n=e.match(/^(?:https?:\/\/)?telesco\.pe\/([^/?]+)\/(\d+)/))?r="im":(i=e.match(/tg:(?:\/\/)?(.+?)(?:\?|$)/))&&(r="tg_"+i[1]);return window[r]||(r=void 0),a.onclick=r,a}d.GO&&(d.GO.wrapUrl=je),function(e){let t,s;function n(t){e.lastRequestedLangCode=t,e.lastRequestedNormalizedLangCode=t.split("-")[0]}function i(){if("h12"===e.timeFormat)try{const t=P({hour:"numeric",minute:"numeric",hour12:!0}),a=new Date;a.setHours(0);const s=t.format(a);e.amPmCache.am=s.split(" ")[1],a.setHours(12);const n=t.format(a);e.amPmCache.pm=n.split(" ")[1]}catch(t){console.error("cannot get am/pm",t),e.amPmCache={am:"AM",pm:"PM"}}}function r(){const e=_.Z.langPackCode;return n(e),Promise.all([a.e(104).then(a.bind(a,9104)),a.e(301).then(a.bind(a,9301)),a.e(8).then(a.bind(a,9179))]).then((([t,a,s])=>{const n=[];return p(t.default,n),p(a.default,n),f({_:"langPackDifference",from_version:0,lang_code:e,strings:n,version:0,local:!0,countries:s.default})}))}function o(t,s){e.requestedServerLanguage=!0;const n=g.managers;return Promise.all([n.apiManager.invokeApiCacheable("langpack.getLangPack",{lang_code:t,lang_pack:"web"}),!1,a.e(104).then(a.bind(a,9104)),a.e(301).then(a.bind(a,9301)),n.apiManager.invokeApiCacheable("help.getCountriesList",{lang_code:t,hash:0}),e.polyfillPromise])}function p(e,t=[]){for(const a in e){const s=e[a];"string"==typeof s?t.push({_:"langPackString",key:a,value:s}):t.push(Object.assign({_:"langPackStringPluralized",key:a},s))}return t}function f(e){return e.appVersion=_.Z.langPackVersion,h.Z.set({langPack:e}).then((()=>(c(e),e)))}function c(a){const s=e.lastRequestedLangCode;if(a.lang_code===s){try{t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode)}catch(a){console.error("pluralRules error",a),t=new Intl.PluralRules(e.lastRequestedNormalizedLangCode.split("-",1)[0])}try{t=new Intl.PluralRules(a.lang_code)}catch(e){console.error("pluralRules error",e),t=new Intl.PluralRules(a.lang_code.split("-",1)[0])}e.strings.clear();for(const t of a.strings)e.strings.set(t.key,t);a.countries&&(e.countriesList.length=0,e.countriesList.push(...a.countries.countries),a.countries.countries.forEach((t=>{if(t.name){const a=t.default_name;e.strings.set(a,{_:"langPackString",key:a,value:t.name})}}))),e.lastAppliedLangCode!==s&&(g.dispatchEvent("language_change",s),e.lastAppliedLangCode=s,v.clear(),i()),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const a=e.weakMap.get(t);a&&a.update()}))}}function l(e,t,a={i:0}){const s=[];let n=0;return e.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,((e,i,r,o,p,d,f)=>{if(s.push(f.slice(n,d)),i){let e;switch(i){case"**":e=document.createElement("b");break;case"__":e=document.createElement("i")}e.append(...l(r,t,a)),s.push(e)}else if(o)s.push(document.createElement("br"));else if(p){const e=p.lastIndexOf("]"),n=p.slice(1,e),i=p.slice(e+2,p.length-1);let r;if(i&&(0,Ne.Z)(i)){r=document.createElement("a");const e=je(i);r.href=e.url,e.onclick&&r.setAttribute("onclick",e.onclick),r.target="_blank"}else r=t[a.i++],r instanceof DocumentFragment&&(r=r.firstChild),r.textContent="";r.append(...l(n,t,a)),s.push(r)}else t&&function(e,t,a){const s=t[a.i++];Array.isArray(s)?e.push(...s):e.push(s)}(s,t,a);return n=d+e.length,""})),n!==e.length&&s.push(e.slice(n)),s}function m(a,s=!1,n){const i=e.strings.get(a);let r;if(i)if("langPackStringPluralized"===i._&&(null==n?void 0:n.length)){let e=n[0];"string"==typeof e&&(e=+e.replace(/\D/g,"")),r=i[t.select(e)+"_value"]||i.other_value}else r="langPackString"===i._?i.value:a;else r=a;const o=l(r,n);return s?o.map((e=>e instanceof Node?e.textContent:e)).join(""):o}e.strings=new Map,e.countriesList=[],e.requestedServerLanguage=!1,e.isRTL=!1,e.setRTL=function(t){e.isRTL=t},e.getCacheLangPack=function(){return s||(s=Promise.all([h.Z.get("langPack"),e.polyfillPromise]).then((([t])=>t?(d.ZP,e.lastRequestedLangCode||n(t.lang_code),c(t),t):r())).finally((()=>{s=void 0})))},e.setTimeFormat=function(t,a=!!e.timeFormat&&e.timeFormat!==t){e.timeFormat=t,i(),a&&(v.clear(),Array.from(document.querySelectorAll(".i18n")).forEach((t=>{const a=e.weakMap.get(t);a instanceof b&&a.update()})))},e.loadLocalLangPack=r,e.loadLangPack=o,e.getStrings=function(e,t){return g.managers.apiManager.invokeApi("langpack.getStrings",{lang_pack:_.Z.langPack,lang_code:e,keys:t})},e.formatLocalStrings=p,e.getLangPack=function(e,t){return n(e),o(e).then((([e,t,a,s,n,i])=>{let r=[];return[a,s].forEach((e=>{p(e.default,r)})),r=r.concat(...[e.strings,t.strings].filter(Boolean)),e.strings=r,e.countries=n,f(e)}))},e.saveLangPack=f,e.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():a.e(642).then(a.bind(a,4642)).then((e=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},e.default)})),e.applyLangPack=c,e.superFormatter=l,e.format=m,e.weakMap=new WeakMap;class u{constructor(t){this.element=(null==t?void 0:t.element)||document.createElement("span"),this.element.classList.add("i18n"),this.property=null==t?void 0:t.property,t&&(t.key||t.date)&&this.update(t),e.weakMap.set(this.element,this)}}class y extends u{constructor(e={}){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"innerHTML"}))}update(e){if((0,Oe.Z)(this,e),"innerHTML"===this.property)this.element.textContent="",this.element.append(...m(this.key,!1,this.args));else{const e=this.element[this.property],t=m(this.key,!0,this.args);void 0===e?this.element.dataset[this.property]=t:this.element[this.property]=t}}compareAndUpdate(e){if(this.key!==e.key||!(0,Y.Z)(this.args,e.args))return this.update(e)}}e.IntlElement=y;const v=new Map;function P(t={}){const a=JSON.stringify(t);let s=v.get(a);return s||(s=new Intl.DateTimeFormat(e.lastRequestedNormalizedLangCode+"-u-hc-"+e.timeFormat,t),v.set(a,s)),s}e.amPmCache={am:"AM",pm:"PM"};class b extends u{constructor(e){var t;super(Object.assign(Object.assign({},e),{property:null!==(t=e.property)&&void 0!==t?t:"textContent"}))}update(t){let a;if((0,Oe.Z)(this,t),this.options.hour&&this.options.minute&&2===Object.keys(this.options).length){const t=this.date.getHours();a=("0"+("h12"===e.timeFormat?t%12||12:t)).slice(-2)+":"+("0"+this.date.getMinutes()).slice(-2),"h12"===e.timeFormat&&(a+=" "+(t<12?e.amPmCache.am:e.amPmCache.pm))}else{const e=P(this.options);a=(0,Le.Z)(e.format(this.date))}this.element[this.property]=a}}e.IntlDateElement=b,e.i18n=function(e,t){return new y({key:e,args:t}).element},e.i18n_=function(e){return new y(e).element},e._i18n=function(e,t,a,s){return new y({element:e,key:t,args:a,property:s}).element}}(Ve||(Ve={}));const qe=Ve;Ve.i18n,Ve.i18n_,Ve._i18n,d.GO.I18n=Ve;const Ge=["January","February","March","April","May","June","July","August","September","October","November","December"],He=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],We=e=>{const t=new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate())),a=t.getUTCDay()||7;t.setUTCDate(t.getUTCDate()+4-a);const s=new Date(Date.UTC(t.getUTCFullYear(),0,1));return Math.ceil(((t.getTime()-s.getTime())/86400+1)/7)};d.GO&&(d.GO.formatDateAccordingToTodayNew=function(e){const t=new Date,a=t.getTime()/1e3|0,s=e.getTime()/1e3|0,n={};return a-s<86400&&t.getDate()===e.getDate()?n.hour=n.minute="2-digit":t.getFullYear()!==e.getFullYear()?(n.year=n.day="numeric",n.month="2-digit"):a-s<604800&&We(t)===We(e)?n.weekday="short":(n.month="short",n.day="numeric"),new qe.IntlDateElement({date:e,options:n}).element});const ze=2013,Ke=new RegExp("20[0-9]{1,2}"),Je=new RegExp("(\\w{3,}) ([0-9]{0,4})","i"),$e=new RegExp("([0-9]{0,4}) (\\w{2,})","i"),Qe=new RegExp("^([0-9]{1,4})(\\.| |/|\\-)([0-9]{1,4})$","i"),Ye=new RegExp("^([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,2})(\\.| |/|\\-)([0-9]{1,4})$","i"),Xe=[31,29,31,30,31,30,31,31,30,31,30,31];function et(e,t,a){const s=(new Date).getFullYear(),n=Date.now();if(a>=ze&&a<=s){const s=new Date;s.setFullYear(a,t,1),s.setHours(0,0,0);const i=s.getTime();if(i>n)return;s.setMonth(s.getMonth()+1);const r=s.getTime()-1;e.push({title:at(i),minDate:i,maxDate:r})}}function tt(e,t,a){if(rt(t,a)){const n=(new Date).getFullYear(),i=Date.now();for(let r=n;r>=ze;r--){if(1===a&&28===t&&((s=r)%4!=0||s%100==0)&&s%400!=0)continue;const o=new Date;o.setFullYear(r,a,t+1),o.setHours(0,0,0);const p=o.getTime();if(p>i)continue;o.setFullYear(r,a,t+2),o.setHours(0,0,0);const d=o.getTime()-1;r===n?e.push({title:st(p),minDate:p,maxDate:d}):e.push({title:nt(p),minDate:p,maxDate:d})}}var s}function at(e){const t=new Date(e);return Ge[t.getMonth()].slice(0,3)+" "+t.getFullYear()}function st(e){const t=new Date(e);return Ge[t.getMonth()].slice(0,3)+" "+t.getDate()}function nt(e){const t=new Date(e);return("0"+t.getDate()).slice(-2)+"."+("0"+(t.getMonth()+1)).slice(-2)+"."+t.getFullYear()}function it(e){const t=new Date(e);return He[t.getDay()]}function rt(e,t){return t>=0&&t<12&&e>=0&&e{t[e][s]=a})),a[e]=t[e])}d.GO.fillTipDates=function(e,t){const a=e.trim().toLowerCase();if(a.length<3)return;if(0==="today".indexOf(a)){const e=new Date,a=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(a,s,n),e.setHours(0,0,0);const i=e.getTime();e.setFullYear(a,s,n+1),e.setHours(0,0,0);const r=e.getTime()-1;return void t.push({title:"Today",minDate:i,maxDate:r})}if(0==="yesterday".indexOf(a)){const e=new Date,a=e.getFullYear(),s=e.getMonth(),n=e.getDate();e.setFullYear(a,s,n),e.setHours(0,0,0);const i=e.getTime()-864e5;e.setFullYear(a,s,n+1),e.setHours(0,0,0);const r=e.getTime()-86400001;return void t.push({title:"Yesterday",minDate:i,maxDate:r})}const s=function(e){const t=new Date;if(e.length<=3)return-1;for(let a=0;a<7;a++)if(t.setDate(t.getDate()+1),0===it(t.getTime()).toLowerCase().indexOf(e))return t.getDay();return-1}(a);if(s>=0){const e=new Date,a=e.getTime(),n=s-e.getDay();e.setDate(e.getDate()+n),e.getTime()>a&&e.setTime(e.getTime()-6048e5);const i=e.getFullYear(),r=e.getMonth(),o=e.getDate();e.setFullYear(i,r,o),e.setHours(0,0,0);const p=e.getTime();e.setFullYear(i,r,o+1),e.setHours(0,0,0);const d=e.getTime()-1;return void t.push({title:it(p),minDate:p,maxDate:d})}let n;if(null===(n=Qe.exec(a)))if(null===(n=Ye.exec(a)))if(null===(n=Ke.exec(a))){if(null!==(n=Je.exec(a))){const e=n[1],a=n[2],s=ot(e);if(s>=0){const e=+a;if(e>0&&e<=31)return void tt(t,e-1,s);if(e>=ze)return void et(t,s,e)}}if(null!==(n=$e.exec(a))){const e=n[1],a=ot(n[2]);if(a>=0){const s=+e;if(s>0&&s<=31)return void tt(t,s-1,a);s>=ze&&et(t,a,s)}}}else{let e=+a;const s=(new Date).getFullYear();if(e=e;a--){const e=new Date;e.setFullYear(a,0,1),e.setHours(0,0,0);const s=e.getTime();e.setFullYear(a+1,0,1),e.setHours(0,0,0);const n=e.getTime()-1;t.push({title:""+a,minDate:s,maxDate:n})}}else if(e<=s){const a=new Date;a.setFullYear(e,0,1),a.setHours(0,0,0);const s=a.getTime();a.setFullYear(e+1,0,1),a.setHours(0,0,0);const n=a.getTime()-1;t.push({title:""+e,minDate:s,maxDate:n})}}else{const e=n[1],a=n[3],s=n[5];if(!n[2]===n[4])return;const i=parseInt(e),r=parseInt(a)-1;let o=parseInt(s);o>=10&&o<=99&&(o+=2e3);const p=(new Date).getFullYear();if(rt(i-1,r)&&o>=ze&&o<=p){const e=new Date;e.setFullYear(o,r,i),e.setHours(0,0,0);const a=e.getTime();e.setFullYear(o,r,i+1),e.setHours(0,0,0);const s=e.getTime()-1;return void t.push({title:nt(a),minDate:a,maxDate:s})}}else{const e=n[1],a=n[3],s=parseInt(e),i=parseInt(a);if(s>0&&s<=31){if(i>=ze&&s<=12)return void et(t,s-1,i);i<=12&&tt(t,s-1,i-1)}else s>=ze&&i<=12&&et(t,i-1,s)}};var dt=a(2491),ft=a(7072),ct=a(8801),lt=a(6658);const mt={pdf:"application/pdf",tgv:"application/x-tgwallpattern",tgs:"application/x-tgsticker",json:"application/json",wav:"audio/wav",mp3:"audio/mpeg",ogg:"audio/ogg",jpeg:"image/jpeg",jpg:"image/jpeg",png:"image/png",gif:"image/gif",webp:"image/webp",mp4:"video/mp4",webm:"video/webm",mov:"video/quicktime",svg:"image/svg+xml"},gt={};for(const e in mt)gt[mt[e]]=e;let ht=0;class ut extends G{constructor(){super(...arguments),this.onServiceWorkerFail=()=>{for(const e in this.docs){const t=this.docs[e];t.supportsStreaming&&(delete t.supportsStreaming,this.thumbsStorage.deleteCacheContext(t))}}}after(){this.docs={},this.stickerCachedThumbs={},this.uploadingWallPapers={},f.Z.getInstance().addEventListener("serviceWorkerOnline",(e=>{e||this.onServiceWorkerFail()}))}saveDoc(e,t){if(!e||"documentEmpty"===e._)return;const a=this.docs[e.id];e.file_reference&&(pt("file_reference",a,e),this.referenceDatabase.saveContext(e.file_reference,t)),a||(this.docs[e.id]=e);for(let t=0,a=e.attributes.length;t"documentAttributeFilename"===e._)),a=t&&t.file_name.split(".").pop(),s=((e,t={})=>{const a=t.monthAsNumber?".":" ",s=("0"+e.getHours()).slice(-2)+":"+("0"+e.getMinutes()).slice(-2)+(t.noSeconds?"":":"+("0"+e.getSeconds()).slice(-2));return(t.leadingZero?("0"+e.getDate()).slice(-2):e.getDate())+a+(t.monthAsNumber?("0"+(e.getMonth()+1)).slice(-2):Ge[e.getMonth()])+a+e.getFullYear()+(t.noTime?"":", "+s)})(new Date(1e3*e.date),{monthAsNumber:!0,leadingZero:!0}).replace(/[:\.]/g,"-").replace(", ","_");e.file_name=`${e.type}_${s}${a?"."+a:""}`}return Hs()&&"gif"===e.type&&e.size>8e6||"audio"===e.type||"video"===e.type?(e.supportsStreaming=!0,this.thumbsStorage.getCacheContext(e).url||this.thumbsStorage.setCacheContextURL(e,void 0,function(e,t=!1,a){let s;return s=t?"download":a?"thumb":e.supportsStreaming?"stream":"document",(0,ct.q)(s,(0,lt.Z)(e,a))}(e),0)):e.supportsStreaming=!1,e.file_name||(e.file_name=""),a?Object.assign(a,e):e}getDoc(e){return(0,fe.Z)(e)?e:this.docs[e]}downloadDoc(e,t,a){return this.apiFileManager.downloadMedia({media:e,queueId:t,onlyCache:a})}getLottieCachedThumb(e,t){const a=this.stickerCachedThumbs[e];return a&&a[t]}saveLottiePreview(e,t,a,s,n){var i,r,o;const p=this.getDoc(e);if(!p)return;const d=null!==(i=(r=this.stickerCachedThumbs)[o=p.id])&&void 0!==i?i:r[o]={},f=d[n];f&&f.w>=a&&f.h>=s||(d[n]={url:URL.createObjectURL(t),w:a,h:s})}saveWebPConvertedStrippedThumb(e,t){const a=this.getDoc(e);if(!a)return;const s=a.thumbs&&a.thumbs.find((e=>"photoStrippedSize"===e._));s&&(a.pFlags.stickerThumbConverted=!0,s.bytes=t)}getWallPapers(){return this.apiManager.invokeApiHashable({method:"account.getWallPapers"}).then((e=>{const t=e.wallpapers;return t.forEach((e=>{e.document=this.saveDoc(e.document)})),t}))}prepareWallPaperUpload(e){const t="wallpaper-upload-"+ ++ht,a={_:"photoSize",h:0,w:0,location:{},size:e.size,type:o.Pt};let s={_:"document",access_hash:"",attributes:[],dc_id:0,file_reference:[],id:t,mime_type:e.type,size:e.size,date:Date.now()/1e3,pFlags:{},thumbs:[a],file_name:e.name};s=this.saveDoc(s);const n=this.thumbsStorage.setCacheContextURL(s,void 0,URL.createObjectURL(e),e.size),i={_:"wallPaper",access_hash:"",document:s,id:t,slug:t,pFlags:{}};return this.uploadingWallPapers[t]={cacheContext:n,file:e},i}uploadWallPaper(e){const{cacheContext:t,file:a}=this.uploadingWallPapers[e];return delete this.uploadingWallPapers[e],this.apiFileManager.upload({file:a,fileName:a.name}).then((e=>this.apiManager.invokeApi("account.uploadWallPaper",{file:e,mime_type:a.type,settings:{_:"wallPaperSettings"}}).then((e=>((0,ue.Z)(e),e.document=this.saveDoc(e.document),this.thumbsStorage.setCacheContextURL(e.document,void 0,t.url,t.downloaded),e)))))}getGifs(){return this.apiManager.invokeApiHashable({method:"messages.getSavedGifs",processResult:e=>((0,ue.Z)(e),e.gifs.map((e=>this.saveDoc(e))))})}requestDocPart(e,t,a,s){const n=this.getDoc(e);return n?this.apiFileManager.requestFilePart(t,(0,ft.Z)(n),a,s):Promise.reject((0,X.Z)("NO_DOC"))}}var yt=a(6034);class _t extends G{constructor(){super(...arguments),this.drafts={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateDraftMessage:e=>{const t=this.appPeersManager.getPeerId(e.peer);this.saveDraft({peerId:t,threadId:e.threadId,draft:e.draft,notify:!0})}}),h.Z.get("drafts").then((e=>{this.drafts=e||{}}))}getKey(e,t){return e+(t?"_"+t:"")}getDraft(e,t){return this.drafts[this.getKey(e,t)]}addMissedDialogs(){return this.getAllDrafts().then((()=>{for(const e in this.drafts){if(-1!==e.indexOf("_"))continue;const t=e.toPeerId();this.appMessagesManager.getDialogOnly(t)||this.appMessagesManager.reloadConversation(t)}}))}getAllDrafts(){var e;return null!==(e=this.getAllDraftPromise)&&void 0!==e?e:this.getAllDraftPromise=this.apiManager.invokeApi("messages.getAllDrafts").then((e=>{(this.apiUpdatesManager.updatesState.syncLoading||Promise.resolve()).then((()=>{this.apiUpdatesManager.processUpdateMessage(e)}))}))}saveDraft({peerId:e,threadId:t,draft:a,notify:s,force:n}){const i=this.processApiDraft(a),r=this.getKey(e,t);return i?this.drafts[r]=i:delete this.drafts[r],h.Z.set({drafts:this.drafts}),s&&this.rootScope.dispatchEvent("draft_updated",{peerId:e,threadId:t,draft:i,force:n}),i}isEmptyDraft(e){return"draftMessage"!==(null==e?void 0:e._)||!(void 0!==e.reply_to_msg_id&&e.reply_to_msg_id>0)&&!e.message.length}processApiDraft(e){if(e&&"draftMessage"===e._)return e.reply_to_msg_id&&(e.reply_to_msg_id=(0,pe.Z)(e.reply_to_msg_id)),e}syncDraft(e,t,a,s=!0,n=!1){const i=this.getDraft(e,t);if((0,yt.Z)(i,a))return!0;const r={peer:this.appPeersManager.getInputPeerById(e),message:""};let o;if(this.isEmptyDraft(a))o={_:"draftMessageEmpty"};else{(0,ue.Z)(a);const e=a.message,t=a.entities;a.reply_to_msg_id&&(r.reply_to_msg_id=(0,oe.Z)(a.reply_to_msg_id)),(null==t?void 0:t.length)&&(r.entities=this.appMessagesManager.getInputEntities(t)),a.pFlags.no_webpage&&(r.no_webpage=a.pFlags.no_webpage),r.message=e}t&&(r.top_msg_id=(0,oe.Z)(t));const p=o||a;return p.date=(0,te.Z)(!0)+this.timeManager.getServerTimeOffset(),this.saveDraft({peerId:e,threadId:t,draft:p,notify:!0,force:n}),!s||this.apiManager.invokeApi("messages.saveDraft",r)}clearAllDrafts(){return this.apiManager.invokeApi("messages.clearAllDrafts").then((e=>{if(e)for(const e in this.drafts){const[t,a]=e.split("_");this.rootScope.dispatchEvent("draft_updated",{peerId:t.toPeerId(),threadId:a?+a:void 0,draft:void 0})}}))}clearDraft(e,t){const a={_:"draftMessageEmpty"};t?this.syncDraft(e,t,a,!1,!0):this.saveDraft({peerId:e,threadId:t,draft:a,notify:!0,force:!0})}setDraft(e,t,a,s){const n={_:"draftMessage",date:Date.now()/1e3|0,message:a,pFlags:{},entities:s};t?this.syncDraft(e,t,n,!1,!0):this.saveDraft({peerId:e,threadId:t,draft:n,notify:!0,force:!0})}}var vt=a(946),Pt=a(7746);const bt={keywords:{},version:0,langCode:_.Z.langPackCode};class Mt extends G{constructor(){super(...arguments),this.keywordLangPacks={},this.indexedLangPacks={},this.getKeywordsPromises={},this.recent={},this.getRecentEmojisPromises={},this.getCustomEmojiDocumentPromises=new Map}getEmojiKeywords(e=_.Z.langPackCode){const t=this.getKeywordsPromises[e];if(t)return t;const a="emojiKeywords_"+e;return this.getKeywordsPromises[e]=h.Z.get(a).then((t=>((0,fe.Z)(t)||(t={}),(0,vt.Z)(bt,t),t.langCode=e,this.keywordLangPacks[e]=t,this.apiManager.invokeApi("messages.getEmojiKeywordsDifference",{lang_code:t.langCode,from_version:t.version}).then((e=>{t.version=e.version;const s=t.keywords,n=e.keywords;for(let e=0,t=n.length;et)))))}getBothEmojiKeywords(){const e=[this.getEmojiKeywords()];return this.networkerFactory.language!==_.Z.langPackCode&&e.push(this.getEmojiKeywords(this.networkerFactory.language)),this.recent.native||e.push(this.getRecentEmojis("native")),Promise.all(e)}indexEmojis(){this.index||(this.index=new ae.Z(void 0,2));for(const e in this.keywordLangPacks){if(this.indexedLangPacks[e])continue;const t=this.keywordLangPacks[e].keywords;for(const e in t){const a=t[e];this.index.indexObject(a,e)}this.indexedLangPacks[e]=!0}}searchEmojis(e){let t;if(this.indexEmojis(),(e=e.toLowerCase().replace(/_/g," ")).trim()){const a=this.index.search(e);t=Array.from(a).reduce(((e,t)=>e.concat(t)),[])}else t=this.recent.native.concat(Mt.POPULAR_EMOJI).slice(0,32);return t=Array.from(new Set(t)),t}getRecentEmojis(e){var t;const a=this.getRecentEmojisPromises;return null!==(t=a[e])&&void 0!==t?t:a[e]=this.appStateManager.getState().then((t=>{let a=[];if("native"===e){const{recentEmoji:e}=t;a=Array.isArray(e)&&e.length?e:Mt.POPULAR_EMOJI}else{const{recentCustomEmoji:e}=t;a=Array.isArray(e)&&e.length?e:[]}return this.recent[e]=a}))}pushRecentEmoji(e){const t=e.docId?"custom":"native";e.emoji=(0,Pt.Z)(e.emoji),this.getRecentEmojis(t).then((a=>{const s=e.docId||e.emoji;(0,M.Z)(a,s),a.unshift(s),a.splice(32,a.length-32),this.appStateManager.pushToState("custom"===t?"recentCustomEmoji":"recentEmoji",a),this.rootScope.dispatchEvent("emoji_recent",e)}))}getCustomEmojiDocuments(e){return e.length?this.apiManager.invokeApi("messages.getCustomEmojiDocuments",{document_id:e}).then((e=>e.map((e=>this.appDocsManager.saveDoc(e,{type:"customEmoji",docId:e.id}))))):Promise.resolve([])}getCachedCustomEmojiDocuments(e){return e.map((e=>this.appDocsManager.getDoc(e)))}setDebouncedGetCustomEmojiDocuments(){!this.getCustomEmojiDocumentsPromise&&this.getCustomEmojiDocumentPromises.size&&(this.getCustomEmojiDocumentsPromise=(0,P.Z)(0).then((()=>{const e=[...this.getCustomEmojiDocumentPromises.keys()],t=[];do{const a=e.splice(0,100),s=this.getCustomEmojiDocuments(a).then((e=>{e.forEach(((e,t)=>{const s=a[t],n=this.getCustomEmojiDocumentPromises.get(s);this.getCustomEmojiDocumentPromises.delete(s),n.resolve(e)}))}));t.push(s)}while(e.length);return Promise.all(t)})).finally((()=>{this.getCustomEmojiDocumentsPromise=void 0,this.setDebouncedGetCustomEmojiDocuments()})))}getCustomEmojiDocument(e){let t=this.getCustomEmojiDocumentPromises.get(e);if(t)return t;return this.appDocsManager.getDoc(e)||(t=(0,v.Z)(),this.getCustomEmojiDocumentPromises.set(e,t),this.setDebouncedGetCustomEmojiDocuments(),t)}getCustomEmojis(){return this.appStickersManager.getEmojiStickers()}}Mt.POPULAR_EMOJI=["😂","😘","❤️","😍","😊","😁","👍","☺️","😔","😄","😭","💋","😒","😳","😜","🙈","😉","😃","😢","😝","😱","😡","😏","😞","😅","😚","🙊","😌","😀","😋","😆","👌","😐","😕"];var It=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class St extends G{after(){this.log=(0,I.kg)("GROUP-CALLS"),this.groupCalls=new Map,this.participants=new Map,this.nextOffsets=new Map,this.apiUpdatesManager.addMultipleEventsListeners({updateGroupCall:e=>{this.saveGroupCall(e.call,e.chat_id)},updateGroupCallParticipants:e=>{this.saveGroupCall(e.call);const t=e.call.id;this.saveApiParticipants(t,e.participants)}}),this.rootScope.addEventListener("group_call_update",(e=>{"groupCallDiscarded"===e._&&this.participants.delete(e.id)}))}getCachedParticipants(e){let t=this.participants.get(e);return t||this.participants.set(e,t=new Map),t}prepareToSavingNextOffset(e){const t=this.nextOffsets,a=t.get(e);return{nextOffset:a,setNextOffset:s=>{t.get(e)===a&&t.set(e,s)}}}saveApiParticipant(e,t,a){const s=this.getCachedParticipants(e),n=(0,le.Z)(t.peer),i=s.get(n),r=t.pFlags.left;if(!i&&r)return;t.pFlags.muted||t.pFlags.can_self_unmute||(t.pFlags.can_self_unmute=!0),i?(re(i,t),t=i):s.set(n,t);const o=this.getGroupCall(e);if("groupCall"===(null==o?void 0:o._)){let e=!1;r?(--o.participants_count,e=!0):!t.pFlags.just_joined||i||t.pFlags.self||(++o.participants_count,e=!0),e&&this.rootScope.dispatchEvent("group_call_update",o)}r&&s.delete(n),this.rootScope.dispatchEvent("group_call_participant",{groupCallId:e,participant:t})}saveApiParticipants(e,t,a){t.saved||(t.saved=!0,t.forEach((t=>this.saveApiParticipant(e,t,a))))}editParticipant(e,t,a){return It(this,void 0,void 0,(function*(){this.saveApiParticipant(e,t);const s=t.pFlags.self?o.NM:(0,le.Z)(t.peer),n=yield this.apiManager.invokeApiSingle("phone.editGroupCallParticipant",{call:this.getGroupCallInput(e),participant:s===o.NM?this.appPeersManager.getInputPeerSelf():this.appPeersManager.getInputPeerById(s),muted:a.muted,volume:a.volume,raise_hand:a.raiseHand,video_paused:a.videoPaused,video_stopped:a.videoStopped,presentation_paused:a.presentationPaused});this.apiUpdatesManager.processUpdateMessage(n)}))}getGroupCall(e){return this.groupCalls.get(e)}getGroupCallFull(e,t){return It(this,void 0,void 0,(function*(){const a=this.getGroupCall(e);if(a&&"inputGroupCall"!==a._&&!t)return a;const s=this.getCachedParticipants(e).size?0:100;return this.apiManager.invokeApiSingleProcess({method:"phone.getGroupCall",params:{call:this.getGroupCallInput(e),limit:s},processResult:t=>{this.appUsersManager.saveApiUsers(t.users),this.appChatsManager.saveApiChats(t.chats),this.saveApiParticipants(e,t.participants,!0);const a=this.saveGroupCall(t.call);return s&&void 0===this.nextOffsets.get(e)&&this.nextOffsets.set(e,t.participants_next_offset),a}})}))}saveGroupCall(e,t){const a=this.groupCalls.get(e.id),s="inputGroupCall"!==e._&&(!a||"groupCallDiscarded"!==a._);return a?(s&&re(a,e),e=a):this.groupCalls.set(e.id,e),s&&this.rootScope.dispatchEvent("group_call_update",e),e}createGroupCall(e,t,a){return It(this,void 0,void 0,(function*(){const s=yield this.apiManager.invokeApi("phone.createGroupCall",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0)),random_id:(0,Te.d)(32),schedule_date:t,title:a});return this.apiUpdatesManager.processUpdateMessage(s),s.updates.find((e=>"updateGroupCall"===e._)).call}))}getGroupCallInput(e){const t=this.getGroupCall(e);return{_:"inputGroupCall",id:t.id,access_hash:t.access_hash}}getGroupCallParticipants(e){return It(this,void 0,void 0,(function*(){const{nextOffset:t,setNextOffset:a}=this.prepareToSavingNextOffset(e);return""!==t&&(yield this.apiManager.invokeApiSingleProcess({method:"phone.getGroupParticipants",params:{call:this.getGroupCallInput(e),ids:[],sources:[],offset:t||"",limit:100},processResult:t=>{const s=t.count===t.participants.length?"":t.next_offset;this.appChatsManager.saveApiChats(t.chats),this.appUsersManager.saveApiUsers(t.users),this.saveApiParticipants(e,t.participants),a(s)}})),{participants:this.getCachedParticipants(e),isEnd:""===this.nextOffsets.get(e)}}))}hangUp(e,t){const a=this.getGroupCallInput(e);let s;return s="boolean"==typeof t&&t?this.apiManager.invokeApi("phone.discardGroupCall",{call:a}):"number"==typeof t?this.apiManager.invokeApi("phone.leaveGroupCall",{call:a,source:t}):this.apiManager.invokeApi("phone.joinGroupCall",{call:a,join_as:this.appPeersManager.getInputPeerSelf(),muted:!0,video_stopped:!0,params:{_:"dataJSON",data:""}}),s.then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}joinGroupCall(e,t,a){return It(this,void 0,void 0,(function*(){const s=this.getGroupCallInput(e);let n;if("main"===a.type){const i={call:s,join_as:this.appPeersManager.getInputPeerSelf(),params:t,muted:a.isMuted,video_stopped:!a.joinVideo};n=this.apiManager.invokeApi("phone.joinGroupCall",i),this.log(`[api] joinGroupCall id=${e}`,i)}else{const a={call:s,params:t};n=this.apiManager.invokeApi("phone.joinGroupCallPresentation",a),this.log(`[api] joinGroupCallPresentation id=${e}`,a)}const i=yield n;return this.apiUpdatesManager.processUpdateMessage(i),i.updates.find((e=>"updateGroupCallConnection"===e._))}))}leaveGroupCallPresentation(e){return this.apiManager.invokeApi("phone.leaveGroupCallPresentation",{call:this.getGroupCallInput(e)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}}function Ct(e){return{_:"inputPhoto",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}function wt(e){return{_:"inputMediaPhoto",id:Ct(e),ttl_seconds:0}}var kt=a(515);function At(e){return{_:"inputMediaDocument",id:{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference},ttl_seconds:0}}class Dt extends G{constructor(){super(...arguments),this.inlineResults={},this.setHash={}}getGeoInput(e){return"geoPoint"===e._?{_:"inputGeoPoint",lat:e.lat,long:e.long,accuracy_radius:e.accuracy_radius}:{_:"inputGeoPointEmpty"}}getInlineResults(e,t,a="",s="",n){return this.apiManager.invokeApi("messages.getInlineBotResults",{bot:this.appUsersManager.getUserInput(t),peer:this.appPeersManager.getInputPeerById(e),query:a,geo_point:n?this.getGeoInput(n):void 0,offset:s},{stopTime:-1,noErrorBox:!0}).then((e=>{const t=e.query_id;return e.results.forEach((e=>{"botInlineMediaResult"===e._&&(e.document&&(e.document=this.appDocsManager.saveDoc(e.document)),e.photo&&(e.photo=this.appPhotosManager.savePhoto(e.photo))),this.inlineResults[(0,kt.Z)(t,e.id)]=e})),e}))}pushPopularBot(e){this.appUsersManager.getTopPeers("bots_inline").then((t=>{const a=e.toPeerId(),s=t.findIndex((e=>e.id===a));let n;n=-1!==s?t[s]:{id:a,rating:0},++n.rating,(0,ie.Z)(t,n,"rating"),this.appStateManager.setKeyValueToStorage("topPeersCache")}))}switchToPM(e,t,a){return this.setHash[t]={peerId:e,time:Date.now()},this.appMessagesManager.startBot(t,void 0,a)}checkSwitchReturn(e){return t=this,a=void 0,n=function*(){const t=this.appUsersManager.getUser(e);if(!t||!t.pFlags.bot||!t.bot_inline_placeholder)return;const a=this.setHash[e];return a&&(delete this.setHash[e],Date.now()-a.time<36e5)?a.peerId:void 0},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}switchInlineQuery(e,t,a,s){this.appDraftsManager.setDraft(e,t,"@"+this.appPeersManager.getPeerUsername(a.toPeerId())+" "+s)}callbackButtonClick(e,t,a){return this.apiManager.invokeApi("messages.getBotCallbackAnswer",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t),data:a.data},{stopTime:-1,noErrorBox:!0})}sendInlineResult(e,t,a,s={}){const n=this.inlineResults[a];if(!n)return;this.pushPopularBot(t);const i=a.split("_"),r=i.shift(),o=i.join("_");if(s.viaBotId=t,s.queryId=r,s.resultId=o,n.send_message.reply_markup&&(s.replyMarkup=n.send_message.reply_markup),"botInlineMessageText"===n.send_message._)s.entities=n.send_message.entities,this.appMessagesManager.sendText(e,n.send_message.message,s);else{let t,a,i="";const r=n.send_message;switch(r._){case"botInlineMessageMediaAuto":if(i=r.message,"botInlineMediaResult"===n._){const{document:e,photo:a}=n;t=e?At(e):wt(a)}break;case"botInlineMessageMediaGeo":t={_:"inputMediaGeoPoint",geo_point:this.getGeoInput(r.geo)},s.geoPoint=r.geo;break;case"botInlineMessageMediaVenue":t={_:"inputMediaVenue",geo_point:this.getGeoInput(r.geo),title:r.title,address:r.address,provider:r.provider,venue_id:r.venue_id,venue_type:r.venue_type},s.geoPoint=r.geo;break;case"botInlineMessageMediaContact":t={_:"inputMediaContact",phone_number:r.phone_number,first_name:r.first_name,last_name:r.last_name,vcard:r.vcard};break;case"botInlineMessageMediaInvoice":a={_:"messageMediaInvoice",title:r.title,description:r.description,photo:r.photo,currency:r.currency,total_amount:r.total_amount,pFlags:{shipping_address_requested:r.pFlags.shipping_address_requested,test:r.pFlags.test},start_param:void 0}}!t&&a&&(t={_:"messageMediaPending",messageMedia:a}),this.appMessagesManager.sendOther(e,t,s)}}}var Ut=a(7082);class Tt{constructor(){this.tempNum=0}generateTempMessageId(e){const t=++this.tempNum;return(0,pe.Z)(e)+(t&Ut.o-1)}}var Et=a(4421),Ft=a(3624),Rt=a(7401);function xt(e,t){if(e.length{let o=e.slice(s,r);const p=n++;o.length>t&&(xt(o.slice(t),t).forEach((e=>{i[n++]=e})),o=o.slice(0,t)),s=r,a=0,i[p]=(i[p]||"")+o};let o=0;for(;;){let s=e.indexOf(" ",o);if(-1===s){o!==e.length-1&&r();break}s+=" ".length;const n=s-o;a+n>t&&r(a),o=s,a+=n}return i}var Bt=a(5701),Vt=a(7667),Ot=a(6241),Lt=a(6535),Nt=a(6566),Zt=a(2202),jt=a(319);const qt=new class{constructor(){this.tabs=new Map}start(){f.Z.getInstance().addEventListener("tabState",((e,t)=>{this.tabs.get(t).state=e}))}getTabs(){return[...this.tabs.values()].filter((e=>!!e.state))}addTab(e){const t={source:e,state:void 0};this.tabs.set(e,t)}deleteTab(e){this.tabs.delete(e)}};d.GO&&(d.GO.appTabsManager=qt);const Gt=qt;var Ht=a(2381),Wt=a(13);function zt(e){return{_:"inputDocument",id:e.id,access_hash:e.access_hash,file_reference:e.file_reference}}var Kt=a(5285),Jt=a(5102);function $t(e,t,a){a?e[t]=!0:delete e[t]}var Qt=a(4993),Yt=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Xt=e=>{e()},ea=!0;class ta extends G{constructor(){super(...arguments),this.pendingByRandomId={},this.pendingByMessageId={},this.pendingAfterMsgs={},this.pendingTopMsgs={},this.tempFinalizeCallbacks={},this.sendSmthLazyLoadQueue=new Et.Z(10),this.needSingleMessages=new Map,this.extendedMedia=new Map,this.maxSeenId=0,this.migratedFromTo={},this.migratedToFrom={},this.newDialogsToHandle=new Map,this.newUpdatesAfterReloadToHandle={},this.notificationsToHandle={},this.reloadConversationsPeers=new Map,this.log=(0,I.kg)("MESSAGES",I.v9.Error|I.v9.Debug|I.v9.Log|I.v9.Warn),this.groupedTempId=0,this.typings={},this.unreadMentions={},this.goToNextMentionPromises={},this.batchUpdates={},this.clear=e=>{this.middleware?this.middleware.clean():(this.middleware=(0,Ft.k)(),this.uploadFilePromises={}),this.messagesStorageByPeerId={},this.groupedMessagesStorage={},this.scheduledMessagesStorage={},this.historiesStorage={},this.threadsStorage={},this.searchesStorage={},this.pinnedMessages={},this.threadsServiceMessagesIdsStorage={},this.threadsToReplies={},this.dialogsStorage&&this.dialogsStorage.clear(e),this.filtersStorage&&this.filtersStorage.clear(e)},this.handleNewDialogs=()=>{let e=0;const t=new Map,a=a=>{var s;const{peerId:n}=a;this.dialogsStorage.pushDialog({dialog:a}),this.appPeersManager.isChannel(n)||(e=Math.max(e,a.top_message||0));let i=t.get(n);i||t.set(n,i={}),"forumTopic"===a._?(null!==(s=i.topics)&&void 0!==s?s:i.topics=new Map).set(a.id,a):i.dialog=a};for(const[e,t]of this.newDialogsToHandle){const s="dialog"in t,{dialog:n,topics:i}=t;s&&(n?this.dialogsStorage.getDialogOnly(e)&&a(n):this.reloadConversation(e.toPeerId())),i&&(null==i||i.forEach(((t,s)=>{t?this.dialogsStorage.getForumTopic(e,s)&&a(t):this.dialogsStorage.getForumTopicById(e,s)})))}0!==e&&this.incrementMaxSeenId(e),this.rootScope.dispatchEvent("dialogs_multiupdate",t),this.newDialogsToHandle.clear()},this.handleNotifications=()=>{E.Z.clearTimeout(this.notificationsHandlePromise),this.notificationsHandlePromise=void 0;for(const e in this.notificationsToHandle){const[t,a]=e.split("_"),s=this.notificationsToHandle[e];this.getNotifyPeerSettings(t.toPeerId(),a?+a:void 0).then((({muted:e,peerTypeNotifySettings:t})=>{const a=s.topMessage;e&&!a.pFlags.mentioned||!a.pFlags.unread||a.pFlags.unread&&this.notifyAboutMessage(a,{fwdCount:s.fwdCount,peerTypeNotifySettings:t})}))}this.notificationsToHandle={}},this.onUpdateMessageId=e=>{const t=e.random_id;if(!this.pendingByRandomId[t])return;const a=(0,pe.Z)(e.id);this.pendingByMessageId[a]=t},this.onUpdateNewMessage=e=>{var t,a,s,n;const i=e.message,r=this.getMessagePeer(i),p=this.getHistoryMessagesStorage(r),d="updateNewDiscussionMessage"===e._;this.saveMessages([i],{storage:this.createMessageStorage(r,"history")});const f=this.appPeersManager.isForum(r),c=this.getThreadKey(i),l=c?+c.split("_")[1]:void 0,m=this.dialogsStorage.getDialogOrTopic(r,d?l:void 0);if((!m||this.reloadConversationsPeers.has(r))&&!d){let t=!0;if(r.isAnyChat()&&(t=this.appChatsManager.isInChat(r.toChatId())),t)return void this.handleNewUpdateAfterReload(r,e)}if(l&&!d){const e=null===(t=this.threadsStorage[r])||void 0===t?void 0:t[l],a={_:"updateNewDiscussionMessage",message:i};this.appChatsManager.isForum(r.toChatId())&&!this.dialogsStorage.getForumTopic(r,l)?this.handleNewUpdateAfterReload(r,a,l):e&&this.onUpdateNewMessage(a)}if("messageService"===i._){const{action:e}=i;if("messageActionPaymentSent"===e._&&i.reply_to&&this.rootScope.dispatchEvent("payment_sent",{peerId:i.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(i.reply_to.reply_to_peer_id):i.peerId,mid:i.reply_to_mid,receiptMessage:i}),"messageActionTopicEdit"===e._&&!d){const t=this.dialogsStorage.getForumTopic(r,l);if(t){const a=(0,ve.Z)(t);void 0!==e.title&&(t.title=e.title),void 0!==e.closed&&$t(t.pFlags,"closed",e.closed),void 0!==e.hidden&&$t(t.pFlags,"hidden",e.hidden),void 0!==e.icon_emoji_id&&(t.icon_emoji_id=e.icon_emoji_id),this.scheduleHandleNewDialogs(r,t),this.dialogsStorage.processTopicUpdate(t,a)}else this.dialogsStorage.getForumTopicById(r,l)}}this.saveMessages([i],{storage:p}),this.checkPendingMessage(i);const g=this.getHistoryStorage(r,d?l:void 0);d||this.updateMessageRepliesIfNeeded(i);const h=e.ignoreExisting;if(g.history.findSlice(i.mid)){if(!h)return!1}else{const e=g.history.first;if(e.isEnd(se.D.Bottom)){let t=0;for(const a=e.length;te[t]);++t);e.splice(t,0,i.mid)}else g.history.unshift(i.mid);null!==g.count&&++g.count}(!g.maxId||i.mid>g.maxId)&&(g.maxId=i.mid),this.mergeReplyKeyboard(g,i)&&this.rootScope.dispatchEvent("history_reply_markup",{peerId:r});const u=i.fromId;if(u.isUser()&&!i.pFlags.out&&i.from_id){this.appUsersManager.forceUserOnline(u,i.date);const e={_:"sendMessageCancelAction"};let t;t=r.isUser()?{_:"updateUserTyping",action:e,user_id:u}:this.appPeersManager.isChannel(r)?{_:"updateChannelUserTyping",action:e,channel_id:r.toChatId(),from_id:this.appPeersManager.getOutputPeer(u),top_msg_id:l?(0,oe.Z)(l):void 0}:{_:"updateChatUserTyping",action:e,chat_id:r.toChatId(),from_id:this.appPeersManager.getOutputPeer(u)},this.apiUpdatesManager.processLocalUpdate(t)}this.handleNewMessage(i);const y="forumTopic"===(null==m?void 0:m._);if(d&&!y||!m)return;const _=!i.pFlags.out&&i.pFlags.unread;if(_&&i.mid>m.top_message){const e=this.dialogsStorage.prepareDialogUnreadCountModifying(m);++m.unread_count,i.pFlags.mentioned&&(++m.unread_mentions_count,this.modifyCachedMentions(r,i.mid,!0,y?l:void 0)),e()}if(i.mid>=m.top_message&&this.setDialogTopMessage(i,m),(!d&&!f||y)&&_){const e=c||r,t=null!==(a=(n=this.notificationsToHandle)[e])&&void 0!==a?a:n[e]={fwdCount:0,fromId:o.NM};t.fromId!==u&&(t.fromId=u,t.fwdCount=0),i.fwd_from&&++t.fwdCount,t.topMessage=i,null!==(s=this.notificationsHandlePromise)&&void 0!==s||(this.notificationsHandlePromise=E.Z.setTimeout(this.handleNotifications,0))}},this.onUpdateMessageReactions=e=>{const{peer:t,msg_id:a,reactions:s}=e,n=(0,pe.Z)(a),i=this.appPeersManager.getPeerId(t),r=this.getMessageByPeer(i,n);if("message"!==(null==r?void 0:r._))return;const o=null==s?void 0:s.recent_reactions;if((null==o?void 0:o.length)&&r.pFlags.out){const e=o[o.length-1],t=r.reactions,a=null==t?void 0:t.recent_reactions;this.appPeersManager.getPeerId(e.peer_id)===this.appPeersManager.peerId||a&&!(a.length<=o.length)||a&&(0,Y.Z)(e,a[a.length-1])||this.getNotifyPeerSettings(i).then((({muted:t,peerTypeNotifySettings:a})=>{a.show_previews&&this.notifyAboutMessage(r,{peerReaction:e,peerTypeNotifySettings:a})}))}const p=r.peerId+"_"+r.mid;this.pushBatchUpdate("messages_reactions",this.batchUpdateReactions,p,(()=>(0,ve.Z)(r.reactions))),r.reactions=s,e.local||this.setDialogToStateIfMessageIsTop(r)},this.onUpdateDialogUnreadMark=e=>{const t=this.appPeersManager.getPeerId(e.peer.peer),a=this.getDialogOnly(t);if(a){const s=this.dialogsStorage.prepareDialogUnreadCountModifying(a);e.pFlags.unread?a.pFlags.unread_mark=!0:delete a.pFlags.unread_mark,s(),this.dialogsStorage.setDialogToState(a),this.rootScope.dispatchEvent("dialogs_multiupdate",new Map([[t,{dialog:a}]]))}else this.scheduleHandleNewDialogs(t)},this.onUpdateEditMessage=e=>{var t,a;const s=e.message,n=this.getMessagePeer(s),i=(0,pe.Z)(s.id),r=this.getHistoryMessagesStorage(n);if(!r.has(i))return;const o=this.getMessageFromStorage(r,i);this.saveMessages([s],{storage:r});const p=this.getMessageFromStorage(r,i);this.handleEditedMessage(o,p,r);const d=this.getDialogOnly(n),f=(null==d?void 0:d.top_message)===i;if(s.clear_history)f&&this.rootScope.dispatchEvent("dialog_flush",{peerId:n,dialog:d});else{let e=!0;if("message"===(null==o?void 0:o._)&&!(0,Y.Z)(o.reactions,p.reactions)){const t=p.reactions;p.reactions=o.reactions,this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:this.appPeersManager.getOutputPeer(n),msg_id:s.id,reactions:t}),e=!1}e&&this.rootScope.dispatchEvent("message_edit",{storageKey:r.key,peerId:n,mid:i,message:s}),f&&this.dialogsStorage.setDialogToState(d);const c=new Map,l=()=>{let e=c.get(n);return e||c.set(n,e={}),e};(f||s.grouped_id)&&d&&(l().dialog=d);const m=this.getThreadKey(s);if(m){const e=+m.split("_")[1],s=this.dialogsStorage.getForumTopic(n,e);s&&(null!==(t=(a=l()).topics)&&void 0!==t?t:a.topics=new Map).set(e,s)}c.size&&this.rootScope.dispatchEvent("dialogs_multiupdate",c)}},this.onUpdateReadHistory=e=>{const t=e.channel_id,a=(0,pe.Z)(e.max_id||e.read_max_id),s=(0,pe.Z)(e.top_msg_id),n=t?t.toPeerId(!0):this.appPeersManager.getPeerId(e.peer),i="updateReadHistoryOutbox"===e._||"updateReadChannelOutbox"===e._||"updateReadChannelDiscussionOutbox"===e._||void 0,r=!!t&&this.appChatsManager.isForum(t),o=this.getHistoryMessagesStorage(n),p=(0,Rt.Z)(o,"desc"),d=s&&r?this.dialogsStorage.getForumTopic(n,s):this.getDialogOnly(n),f=e.still_unread_count;let c=0,l=0,m=!1;const g=this.getHistoryStorage(n,s);if(n.isUser()&&i&&this.appUsersManager.forceUserOnline(n.toUserId()),s){const e=this.threadsToReplies[n+"_"+s];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}const h=d&&this.dialogsStorage.prepareDialogUnreadCountModifying(d),u=this.getReadMaxIdIfUnread(n,s);for(let e=0,t=p.length;ea)continue;const g=o.get(t);if(g.pFlags.out!==i)continue;const h=(0,Qt.Z)(g,r);if(!s||h===s){if(!(g.pFlags.unread||u&&u=d.top_message||!u?e=0:c&&d.top_message>a&&(e=c),void 0!==e&&(d.unread_count=e),(l<0||!d.unread_count)&&(d.unread_mentions_count=0)}null==h||h(),this.dialogsStorage.processDialogForFilters(d),this.rootScope.dispatchEvent("dialog_unread",{peerId:n,dialog:d}),this.dialogsStorage.setDialogToState(d),m||void 0!==f||i||!d.unread_count||("forumTopic"===d._?this.dialogsStorage.getForumTopicById(n,s):this.reloadConversation(n))}if(m&&this.rootScope.dispatchEvent("messages_read"),!s&&t){const e=n+"_";for(const t in this.threadsToReplies)if(0===t.indexOf(e)){const[e,a]=this.threadsToReplies[t].split("_");this.rootScope.dispatchEvent("replies_updated",this.getMessageByPeer(e.toPeerId(),+a))}}},this.onUpdateReadMessagesContents=e=>{const t=e.channel_id,a=e.top_msg_id,s=a?(0,pe.Z)(a):void 0,n=e.messages.map((e=>(0,pe.Z)(e))),i=t?t.toPeerId(!0):this.findPeerIdByMids(n);for(let e=0,t=n.length;e{const t=e.channel_id.toPeerId(!0),a=this.getHistoryStorage(t).history.slice,s=(0,pe.Z)(e.available_min_id),n=a.filter((e=>e<=s));e.messages=n,this.onUpdateDeleteMessages(e)},this.onUpdateDeleteMessages=e=>{var t;const a=e.channel_id,s=e.messages.map((e=>(0,pe.Z)(e))),n=a?a.toPeerId(!0):this.findPeerIdByMids(s);if(!n)return;this.apiManager.clearCache("messages.getSearchCounters",(e=>this.appPeersManager.getPeerId(e.peer)===n));const i=new Set,r=new Map;for(const e of s){const a=this.getMessageByPeer(n,e),s=this.getThreadKey(a);if(!s)continue;const o=+s.split("_")[1];if((null===(t=this.threadsStorage[n])||void 0===t?void 0:t[o])&&(i.add(s),!r.has(o))){const e=this.dialogsStorage.getForumTopic(n,o);e&&r.set(o,e)}}const o=this.handleDeletedMessages(n,this.getHistoryMessagesStorage(n),s),p=Array.from(i).map((e=>{const[t,a]=e.split("_");return this.getHistoryStorage(t.toPeerId(),+a)}));[this.getHistoryStorage(n),...p].forEach((e=>{for(const t of o.msgs)e.history.delete(t);o.count&&e.count&&(e.count=Math.max(0,e.count-o.count))})),this.rootScope.dispatchEvent("history_delete",{peerId:n,msgs:o.msgs});const d=[...r.values()],f=this.getDialogOnly(n);f&&d.unshift(f),d.forEach((e=>{const t="forumTopic"===e._,a=o.unreadMentions||o.unread,s=a&&this.dialogsStorage.prepareDialogUnreadCountModifying(e);if(o.unread&&(e.unread_count=Math.max(0,e.unread_count-o.unread)),o.unreadMentions&&(e.unread_mentions_count=e.unread_count?Math.max(0,e.unread_mentions_count-o.unreadMentions):0),a&&(s(),t||this.rootScope.dispatchEvent("dialog_unread",{peerId:n,dialog:e})),o.msgs.has(e.top_message)){const a=this.getHistoryStorage(e.peerId,t?e.id:void 0).history.first;if(a.isEnd(se.D.Bottom)&&a.length){const t=a[0],s=this.getMessageByPeer(n,t);this.setDialogTopMessage(s,e)}else t?this.dialogsStorage.getForumTopicById(n,e.id):this.reloadConversation(n)}}))},this.onUpdateChannel=e=>{const t=e.channel_id,a=t.toPeerId(!0),s=this.appChatsManager.getChat(t),n=this.appChatsManager.isInChat(t);(!!(0,Jt.Z)(s)[0]||!s.pFlags.left)!=(void 0!==this.historiesStorage[a])&&(delete this.historiesStorage[a],this.rootScope.dispatchEvent("history_forbidden",a)),!!this.getDialogOnly(a)!==n&&(n?this.reloadConversation(a):this.dialogsStorage.dropDialogOnDeletion(a)),this.rootScope.dispatchEvent("channel_update",t)},this.onUpdateChannelReload=e=>{const t=e.channel_id.toPeerId(!0);this.flushStoragesByPeerId(t),Promise.all([this.reloadConversation(t)]).then((()=>{this.rootScope.dispatchEvent("history_reload",t)}))},this.onUpdateChannelMessageViews=e=>{var t;const a=e.views,s=null!==(t=e.peerId)&&void 0!==t?t:e.channel_id.toPeerId(!0),n=(0,pe.Z)(e.id),i=this.getMessageByPeer(s,n);void 0!==(null==i?void 0:i.views)&&i.views{var t;if(null===(t=e.pFlags)||void 0===t?void 0:t.popup)return void this.rootScope.dispatchEvent("service_notification",e);const a=o.yF,s=a,n=this.generateTempMessageId(s),i={_:"message",id:n,from_id:this.appPeersManager.getOutputPeer(a),peer_id:this.appPeersManager.getOutputPeer(s),pFlags:{unread:!0},date:(e.inbox_date||(0,te.Z)(!0))+this.timeManager.getServerTimeOffset(),message:e.message,media:e.media,entities:e.entities};this.appUsersManager.hasUser(a)||this.appUsersManager.saveApiUsers([{_:"user",id:a,pFlags:{verified:!0},access_hash:"0",first_name:"Telegram",phone:"42777"}]),this.saveMessages([i],{isOutgoing:!0}),e.inbox_date&&(this.pendingTopMsgs[s]=n,this.onUpdateNewMessage({_:"updateNewMessage",message:i,pts:void 0,pts_count:void 0}))},this.onUpdatePinnedMessages=e=>{const t="updatePinnedChannelMessages"===e._?e.channel_id:void 0,a=t?t.toPeerId(!0):this.appPeersManager.getPeerId(e.peer),s=e.messages.map((e=>(0,pe.Z)(e))),n=this.getHistoryMessagesStorage(a),i=s.filter((e=>!n.has(e)));(i.length?Promise.all(i.map((e=>this.reloadMessages(a,e)))):Promise.resolve()).finally((()=>{var t;const i=null===(t=e.pFlags)||void 0===t?void 0:t.pinned;if(i)for(const e of s)n.get(e).pFlags.pinned=!0;else for(const e of s)delete n.get(e).pFlags.pinned;delete this.pinnedMessages[this.getPinnedMessagesKey(a)],this.appStateManager.getState().then((e=>{delete e.hiddenPinnedMessages[a],this.rootScope.dispatchEvent("peer_pinned_messages",{peerId:a,mids:s,pinned:i})}))}))},this.onUpdateNotifySettings=e=>{const{peer:t,notify_settings:a}=e,s="notifyForumTopic"===t._;if("notifyPeer"!==t._&&!s)return;const n=this.appPeersManager.getPeerId(t.peer),i=this.dialogsStorage.getDialogOrTopic(n,s?(0,pe.Z)(t.top_msg_id):void 0);i&&(i.notify_settings=a,this.rootScope.dispatchEvent("dialog_notify_settings",i),this.dialogsStorage.setDialogToState(i))},this.onUpdateNewScheduledMessage=e=>{const t=e.message,a=this.getMessagePeer(t),s=this.scheduledMessagesStorage[a];if(!s)return;const n=(0,pe.Z)(t.id),i=this.getMessageFromStorage(s,n);this.saveMessages([t],{storage:s,isScheduled:!0});const r=this.getMessageFromStorage(s,n);i?(this.handleEditedMessage(i,r,s),this.rootScope.dispatchEvent("message_edit",{storageKey:s.key,peerId:a,mid:t.mid,message:t})):this.checkPendingMessage(t)||this.rootScope.dispatchEvent("scheduled_new",t)},this.onUpdateDeleteScheduledMessages=e=>{const t=this.appPeersManager.getPeerId(e.peer),a=this.scheduledMessagesStorage[t];if(a){const s=e.messages.map((e=>(0,pe.Z)(e)));this.handleDeletedMessages(t,a,s),this.rootScope.dispatchEvent("scheduled_delete",{peerId:t,mids:s})}},this.onUpdateMessageExtendedMedia=e=>{var t;const a=this.appPeersManager.getPeerId(e.peer),s=(0,pe.Z)(e.msg_id),n=this.getHistoryMessagesStorage(a);if(!n.has(s))return;const i=this.getMessageFromStorage(n,s),r=i.media;"messageExtendedMedia"!==(null===(t=r.extended_media)||void 0===t?void 0:t._)&&(r.extended_media=e.extended_media,this.onUpdateEditMessage({_:"updateEditMessage",message:i,pts:0,pts_count:0}))},this.batchUpdateViews=e=>{const t=[],a=this.getMessagesFromMap(e);for(const[e]of a)t.push({peerId:e.peerId,mid:e.mid,views:e.views});return t},this.batchUpdateReactions=e=>{var t,a,s;const n=[],i=this.getMessagesFromMap(e);for(const[e,r]of i){const i=null!==(a=null===(t=e.reactions)||void 0===t?void 0:t.results)&&void 0!==a?a:[],o=null!==(s=null==r?void 0:r.results)&&void 0!==s?s:[],p=i.filter((t=>{const a=o.find((e=>(0,Kt.Z)(e.reaction,t.reaction)));return e.pFlags.out&&(!a||t.count>a.count)||void 0!==t.chosen_order&&(!a||void 0===a.chosen_order)}));n.push({message:e,changedResults:p})}return n}}after(){return this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateMessageID:this.onUpdateMessageId,updateNewDiscussionMessage:this.onUpdateNewMessage,updateNewMessage:this.onUpdateNewMessage,updateNewChannelMessage:this.onUpdateNewMessage,updateDialogUnreadMark:this.onUpdateDialogUnreadMark,updateEditMessage:this.onUpdateEditMessage,updateEditChannelMessage:this.onUpdateEditMessage,updateMessageReactions:this.onUpdateMessageReactions,updateReadChannelDiscussionInbox:this.onUpdateReadHistory,updateReadChannelDiscussionOutbox:this.onUpdateReadHistory,updateReadHistoryInbox:this.onUpdateReadHistory,updateReadHistoryOutbox:this.onUpdateReadHistory,updateReadChannelInbox:this.onUpdateReadHistory,updateReadChannelOutbox:this.onUpdateReadHistory,updateChannelReadMessagesContents:this.onUpdateReadMessagesContents,updateReadMessagesContents:this.onUpdateReadMessagesContents,updateChannelAvailableMessages:this.onUpdateChannelAvailableMessages,updateDeleteMessages:this.onUpdateDeleteMessages,updateDeleteChannelMessages:this.onUpdateDeleteMessages,updateChannel:this.onUpdateChannel,updateChannelReload:this.onUpdateChannelReload,updateChannelMessageViews:this.onUpdateChannelMessageViews,updateServiceNotification:this.onUpdateServiceNotification,updatePinnedMessages:this.onUpdatePinnedMessages,updatePinnedChannelMessages:this.onUpdatePinnedMessages,updateNotifySettings:this.onUpdateNotifySettings,updateNewScheduledMessage:this.onUpdateNewScheduledMessage,updateDeleteScheduledMessages:this.onUpdateDeleteScheduledMessages,updateMessageExtendedMedia:this.onUpdateMessageExtendedMedia}),this.rootScope.addEventListener("notify_peer_type_settings",(({key:e,settings:t})=>{let a;a="notifyUsers"===e?e=>e.peerId.isUser():"notifyBroadcasts"===e?e=>this.appPeersManager.isBroadcast(e.peerId):e=>this.appPeersManager.isAnyGroup(e.peerId),this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1)).filter(a).forEach((e=>{this.rootScope.dispatchEvent("dialog_notify_settings",e)}))})),this.rootScope.addEventListener("webpage_updated",(({id:e,msgs:t})=>{t.forEach((({peerId:t,mid:a,isScheduled:s})=>{const n=s?this.getScheduledMessagesStorage(t):this.getHistoryMessagesStorage(t),i=this.getMessageFromStorage(n,a);i&&(i.media={_:"messageMediaWebPage",webpage:this.appWebPagesManager.getCachedWebPage(e)},this.rootScope.dispatchEvent("message_edit",{storageKey:n.key,peerId:t,mid:a,message:i}))}))})),this.rootScope.addEventListener("draft_updated",(({peerId:e,threadId:t,draft:a})=>{const s=this.dialogsStorage.getDialogOrTopic(e,t);if(s){s.draft=a;let t=!1;a||(0,oe.Z)(s.top_message)?(this.dialogsStorage.generateIndexForDialog(s),this.dialogsStorage.pushDialog({dialog:s})):(this.dialogsStorage.dropDialog(e),t=!0),this.rootScope.dispatchEvent("dialog_draft",{peerId:e,dialog:s,drop:t,draft:a})}else if(t){const a=this.appChatsManager.getChat(e.toChatId());a?a.pFlags.forum&&this.dialogsStorage.getForumTopicById(e,t):this.reloadConversation(e)}else this.reloadConversation(e)})),this.rootScope.addEventListener("poll_update",(({poll:e})=>{const t=this.appPollsManager.pollToMessages[e.id];if(t)for(const e of t){const[t,a]=e.split("_"),s=this.getMessageByPeer(t.toPeerId(),+a);s&&this.setDialogToStateIfMessageIsTop(s)}})),this.rootScope.addEventListener("chat_toggle_forum",(({chatId:e,enabled:t})=>{const a=e.toPeerId(!0);if(!t){delete this.threadsStorage[a];for(const e in this.pinnedMessages)+e===a&&e.startsWith(a+"_")&&delete this.pinnedMessages[e]}})),this.batchUpdatesDebounced=(0,Bt.Z)((()=>{for(const e in this.batchUpdates){const t=this.batchUpdates[e];delete this.batchUpdates[e];const a=t.callback(t.batch);!a||a instanceof Array&&!a.length||rootScope.dispatchEvent(e,a)}}),33,!1,!0),this.appStateManager.getState().then((e=>{e.maxSeenMsgId&&(this.maxSeenId=e.maxSeenMsgId)}))}getInputEntities(e){const t=(0,ve.Z)(e);return t.forEach((e=>{"messageEntityMentionName"===e._&&(e._="inputMessageEntityMentionName",e.user_id=this.appUsersManager.getUserInput(e.user_id))})),t}invokeAfterMessageIsSent(e,t,a){var s,n,i;const r=null!==(s=(i=this.tempFinalizeCallbacks)[e])&&void 0!==s?s:i[e]={},o=null!==(n=r[t])&&void 0!==n?n:r[t]={deferred:(0,v.Z)()};return o.callback=a,o.deferred}editMessage(e,t,a={}){const{mid:s,peerId:n}=e;if(e.pFlags.is_outgoing)return this.invokeAfterMessageIsSent(s,"edit",(e=>this.editMessage(e,t,a)));const i=a.entities||[];t&&(t=(0,ke.Z)(t,i));const r=a.scheduleDate||(e.pFlags.is_scheduled?e.date:void 0);return this.apiManager.invokeApi("messages.editMessage",{peer:this.appPeersManager.getInputPeerById(n),id:e.id,message:t,media:a.newMedia,entities:i.length?this.getInputEntities(i):void 0,no_webpage:a.noWebPage,schedule_date:r}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{if(this.log.error("editMessage error:",e),!e||"MESSAGE_NOT_MODIFIED"!==e.type)return e&&"MESSAGE_EMPTY"===e.type&&(e.handled=!0),Promise.reject(e);e.handled=!0}))}sendText(e,t,a={}){var s,n;return Yt(this,void 0,void 0,(function*(){if(!t.trim())return;null!==(s=a.entities)&&void 0!==s||(a.entities=[]),a.threadId&&!a.replyToMsgId&&(a.replyToMsgId=a.threadId);const i=(yield this.apiManager.getConfig()).message_length_max,r=xt(t,i);t=r[0],r.length>1&&("webPage"!==(null===(n=a.webPage)||void 0===n?void 0:n._)||t.includes(a.webPage.url)||delete a.webPage),e=this.appPeersManager.getPeerMigratedTo(e)||e;const o=a.entities;a.viaBotId||(t=(0,ke.Z)(t,o));let p=this.getInputEntities(o);p.length||(p=void 0);const d=this.generateOutgoingMessage(e,a);d.entities=o,d.message=t;const f=a.replyToMsgId?(0,oe.Z)(a.replyToMsgId):void 0,c=this.appPeersManager.isChannel(e);a.webPage&&(d.media={_:"messageMediaWebPage",webpage:a.webPage});const l=e=>{this.onMessagesSendError([d],e),this.rootScope.dispatchEvent("messages_pending")};d.send=()=>{l();const s={};this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId);const n=a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0;let i;return i=a.viaBotId?this.apiManager.invokeApiAfter("messages.sendInlineBotResult",{peer:this.appPeersManager.getInputPeerById(e),random_id:d.random_id,reply_to_msg_id:f||void 0,query_id:a.queryId,id:a.resultId,clear_draft:a.clearDraft,send_as:n},s):this.apiManager.invokeApiAfter("messages.sendMessage",{no_webpage:a.noWebPage,peer:this.appPeersManager.getInputPeerById(e),message:t,random_id:d.random_id,reply_to_msg_id:f||void 0,entities:p,clear_draft:a.clearDraft,schedule_date:a.scheduleDate||void 0,silent:a.silent,send_as:n,update_stickersets_order:ea},s),this.pendingAfterMsgs[e]=s,i.then((e=>{if("updateShortSentMessage"===e._){const t=d.promise;delete d.promise;const s=(0,ve.Z)(d);(0,ge.Z)(d,["promise"]),d.promise=t,s.date=e.date,s.id=e.id,s.media=e.media,s.entities=e.entities,this.wrapMessageEntities(s),e.pFlags.out&&(s.pFlags.out=!0),e={_:"updates",users:[],chats:[],seq:0,date:void 0,updates:[{_:"updateMessageID",random_id:d.random_id,id:s.id},{_:a.scheduleDate?"updateNewScheduledMessage":c?"updateNewChannelMessage":"updateNewMessage",message:s,pts:e.pts,pts_count:e.pts_count}]}}else e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)}));this.apiUpdatesManager.processUpdateMessage(e),d.promise.resolve()}),(e=>{throw l(e),d.promise.reject(e),e})).finally((()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]}))},this.beforeMessageSending(d,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,sequential:!0});const m=[d.promise];for(let t=1;t=0){r="audio",p="audio."+("ogg"===d.split("/")[1]?"ogg":"mp3"),P="sendMessageUploadAudioAction",t.isVoiceMessage&&(r="voice",s.pFlags.media_unread=!0);const e={_:"documentAttributeAudio",pFlags:{voice:t.isVoiceMessage||void 0},waveform:t.waveform,duration:t.duration||0};g.push(e)}else if(t.isMedia)if(h){r="photo",p="photo."+d.split("/")[1],P="sendMessageUploadPhotoAction";const e={_:"photoSize",w:t.width,h:t.height,type:o.Pt,location:null,size:a.size};y={_:"photo",id:""+s.id,sizes:[e],w:t.width,h:t.height},u&&y.sizes.unshift(u);const n=this.thumbsStorage.getCacheContext(y,e.type);n.downloaded=a.size,n.url=t.objectURL||"",y=this.appPhotosManager.savePhoto(y)}else if(i().VIDEO_MIME_TYPES_SUPPORTED.has(d)){r="video",p="video.mp4",P="sendMessageUploadVideoAction";const e={_:"documentAttributeVideo",pFlags:{round_message:t.isRoundMessage||void 0,supports_streaming:!0},duration:t.duration,w:t.width,h:t.height};g.push(e),t.noSound&&a.size>10240&&a.size<10485760&&g.push({_:"documentAttributeAnimated"})}else r="document",p="document."+d.split("/")[1],P="sendMessageUploadDocumentAction";else r="document",p="document."+d.split("/")[1],P="sendMessageUploadDocumentAction";if(g.push({_:"documentAttributeFilename",file_name:f||p}),-1!==["document","video","audio","voice"].indexOf(r)&&!c){const e=[];if(_={_:"document",id:""+s.id,duration:t.duration,attributes:g,w:t.width,h:t.height,thumbs:e,mime_type:d,size:a.size},t.objectURL){const e=this.thumbsStorage.getCacheContext(_);e.downloaded=a.size,e.url=t.objectURL}let n;if(h)g.push({_:"documentAttributeImageSize",w:t.width,h:t.height}),n={_:"photoSize",w:t.width,h:t.height,type:o.Pt,size:a.size};else if("video"===r&&t.thumb){n={_:"photoSize",w:t.thumb.size.width,h:t.thumb.size.height,type:"local-thumb",size:t.thumb.blob.size};const e=this.thumbsStorage.getCacheContext(_,n.type);e.downloaded=n.size,e.url=t.thumb.url}n&&e.push(n),u&&e.unshift(u),_=this.appDocsManager.saveDoc(_)}this.log("sendFile",r,p,a.type,t);const b=(0,v.Z)(),M=c?void 0:{_:y?"messageMediaPhoto":"messageMediaDocument",pFlags:{},photo:y,document:_};M&&((0,ge.Z)(M,["promise"]),M.promise=b,t.spoiler&&(M.pFlags.spoiler=!0)),s.entities=m,s.message=l,s.media=c?{_:"messageMediaDocument",pFlags:{},document:a}:M;const I=c?void 0:(0,Zt.Z)(a);s.uploadingFileName=I,I&&(this.uploadFilePromises[I]=b);const S=e=>{this.onMessagesSendError([s],e),this.rootScope.dispatchEvent("messages_pending")};let C=!1,w=null;s.send=()=>{if(c){const e={_:"inputMediaDocument",id:zt(a)};b.resolve(e)}else if(a instanceof File||a instanceof Blob){const n=()=>{var n;let i;return C&&!s.error||(C=!1,w=this.apiFileManager.upload({file:a,fileName:I}),w.catch((a=>{C||(this.log("cancelling upload",M),this.cancelPendingMessage(s.random_id),this.setTyping(e,{_:"sendMessageCancelAction"},void 0,t.threadId),b.reject(a))})),w.addNotifyListener((a=>{const s=Math.max(1,Math.floor(100*a.done/a.total));P&&this.setTyping(e,{_:P,progress:0|s},void 0,t.threadId),b.notifyAll(a)})),b.notifyAll({done:0,total:a.size})),"video"===r&&t.objectURL&&(null===(n=t.thumb)||void 0===n?void 0:n.blob)&&(i=this.apiFileManager.upload({file:t.thumb.blob})),w&&w.then((e=>Yt(this,void 0,void 0,(function*(){let a;if(e.name=p,C=!0,a="photo"===r?{_:"inputMediaUploadedPhoto",file:e,pFlags:{spoiler:t.spoiler||void 0}}:{_:"inputMediaUploadedDocument",file:e,mime_type:d,pFlags:{force_file:"sendMessageUploadDocumentAction"===P||void 0,spoiler:t.spoiler||void 0},attributes:g},i)try{const e=yield i;a.thumb=e}catch(e){this.log.error("sendFile thumb upload error:",e)}b.resolve(a)}))),(e=>{throw S(e),e})),b};t.isGroupedItem?n():this.sendSmthLazyLoadQueue.push({load:n})}return b},this.beforeMessageSending(s,{isGroupedItem:t.isGroupedItem,isScheduled:!!t.scheduleDate||void 0,threadId:t.threadId,clearDraft:t.clearDraft,processAfter:t.processAfter}),t.isGroupedItem||(b.then((a=>(this.setTyping(e,{_:"sendMessageCancelAction"},void 0,t.threadId),this.apiManager.invokeApi("messages.sendMedia",{background:t.background,peer:this.appPeersManager.getInputPeerById(e),media:a,message:l,random_id:s.random_id,reply_to_msg_id:n,schedule_date:t.scheduleDate,silent:t.silent,entities:m,clear_draft:t.clearDraft,send_as:t.sendAsPeerId?this.appPeersManager.getInputPeerById(t.sendAsPeerId):void 0}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{if("photo"===r&&400===e.code&&("PHOTO_INVALID_DIMENSIONS"===e.type||"PHOTO_SAVE_FILE_INVALID"===e.type))return e.handled=!0,r="document",void s.send();throw S(e),e}))))),b.then(s.promise.resolve,s.promise.reject));const k={message:s};return(0,ge.Z)(k,["promise"]),k.promise=b,k}sendAlbum(e,t){return Yt(this,void 0,void 0,(function*(){if(t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId),1===t.sendFileDetails.length)return this.sendFile(e,Object.assign(Object.assign({},t),t.sendFileDetails[0]));e=this.appPeersManager.getPeerMigratedTo(e)||e;const a=t.replyToMsgId?(0,oe.Z)(t.replyToMsgId):void 0;let s=t.caption||"",n=t.entities||[];s&&(s=(0,ke.Z)(s,n)),this.log("sendAlbum",t);const i=""+ ++this.groupedTempId,r=[],o=e=>{r.push(e)},p=t.sendFileDetails.map(((r,p)=>{const d=Object.assign({isGroupedItem:!0,isMedia:t.isMedia,scheduleDate:t.scheduleDate,silent:t.silent,replyToMsgId:a,threadId:t.threadId,sendAsPeerId:t.sendAsPeerId,groupId:i,processAfter:o},r);return 0===p&&(d.caption=s,d.entities=n),this.sendFile(e,d).message}));t.clearDraft&&r.push((()=>{this.appDraftsManager.clearDraft(e,t.threadId)})),r.forEach((e=>{e()}));const d=(e,t)=>{this.onMessagesSendError([e],t),this.rootScope.dispatchEvent("messages_pending")},f=this.appPeersManager.getInputPeerById(e),c=s=>{this.setTyping(e,{_:"sendMessageCancelAction"},void 0,t.threadId);const n=(0,v.Z)();return this.sendSmthLazyLoadQueue.push({load:()=>this.apiManager.invokeApi("messages.sendMultiMedia",{peer:f,multi_media:s,reply_to_msg_id:a,schedule_date:t.scheduleDate,silent:t.silent,clear_draft:t.clearDraft,send_as:t.sendAsPeerId?this.appPeersManager.getInputPeerById(t.sendAsPeerId):void 0,update_stickersets_order:ea}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),n.resolve()}),(e=>{p.forEach((t=>d(t,e))),n.reject(e)}))}),n},l=p.map((e=>e.send().then((e=>Promise.all([e,this.apiManager.invokeApi("messages.uploadMedia",{peer:f,media:e})]))).then((([t,a])=>{let i;if("messageMediaPhoto"===a._){const e=this.appPhotosManager.savePhoto(a.photo);i=wt(e)}else if("messageMediaDocument"===a._){const e=this.appDocsManager.saveDoc(a.document);i=At(e)}["pFlags","ttl_seconds"].forEach((e=>{var a;i[e]=null!==(a=t[e])&&void 0!==a?a:i[e]}));const r={_:"inputSingleMedia",media:i,random_id:e.random_id,message:s,entities:n};return s&&(s="",n=[]),r})).catch((t=>{throw this.log.error("sendAlbum upload item error:",t,e),d(e,t),t}))));return Promise.all(l).then((e=>c(e.filter(Boolean))))}))}sendContact(e,t){return this.sendOther(e,this.appUsersManager.getContactMediaInput(t))}sendOther(e,t,a={}){var s;e=this.appPeersManager.getPeerMigratedTo(e)||e;const n=this.generateOutgoingMessage(e,a),i=a.replyToMsgId?(0,oe.Z)(a.replyToMsgId):void 0;let r;switch(t._){case"inputMediaPoll":{const e=""+n.id;t.poll.id=e,this.appPollsManager.savePoll(t.poll,{_:"pollResults",flags:4,total_voters:0,pFlags:{},recent_voters:[]});const{poll:a,results:s}=this.appPollsManager.getPoll(e);r={_:"messageMediaPoll",poll:a,results:s};break}case"inputMediaPhoto":r={_:"messageMediaPhoto",photo:this.appPhotosManager.getPhoto(t.id.id)};break;case"inputMediaDocument":r={_:"messageMediaDocument",document:this.appDocsManager.getDoc(t.id.id)};break;case"inputMediaContact":r={_:"messageMediaContact",phone_number:t.phone_number,first_name:t.first_name,last_name:t.last_name,user_id:null!==(s=t.user_id)&&void 0!==s?s:"0",vcard:t.vcard};break;case"inputMediaGeoPoint":r={_:"messageMediaGeo",geo:a.geoPoint};break;case"inputMediaVenue":r={_:"messageMediaVenue",geo:a.geoPoint,title:t.title,address:t.address,provider:t.provider,venue_id:t.venue_id,venue_type:t.venue_type};break;case"messageMediaPending":r=t.messageMedia}n.media=r;const o=e=>{this.onMessagesSendError([n],e),this.rootScope.dispatchEvent("messages_pending")};return n.send=()=>{const s={};this.pendingAfterMsgs[e]&&(s.afterMessageId=this.pendingAfterMsgs[e].messageId);const r=a.sendAsPeerId?this.appPeersManager.getInputPeerById(a.sendAsPeerId):void 0;let p;return p=a.viaBotId?this.apiManager.invokeApiAfter("messages.sendInlineBotResult",{peer:this.appPeersManager.getInputPeerById(e),random_id:n.random_id,reply_to_msg_id:i||void 0,query_id:a.queryId,id:a.resultId,clear_draft:a.clearDraft,schedule_date:a.scheduleDate,silent:a.silent,send_as:r},s):this.apiManager.invokeApiAfter("messages.sendMedia",{peer:this.appPeersManager.getInputPeerById(e),media:t,random_id:n.random_id,reply_to_msg_id:i||void 0,message:"",clear_draft:a.clearDraft,schedule_date:a.scheduleDate,silent:a.silent,send_as:r,update_stickersets_order:ea},s),this.pendingAfterMsgs[e]=s,p.then((e=>{e.updates&&e.updates.forEach((e=>{"updateDraftMessage"===e._&&(e.local=!0)})),this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{throw o(e),e})).finally((()=>{this.pendingAfterMsgs[e]===s&&delete this.pendingAfterMsgs[e]}))},this.beforeMessageSending(n,{isScheduled:!!a.scheduleDate||void 0,threadId:a.threadId,clearDraft:a.clearDraft,sequential:!0}),n.promise}beforeMessageSending(e,t={}){const a=e.id,s=this.getMessagePeer(e),n=t.isScheduled?this.getScheduledMessagesStorage(s):this.getHistoryMessagesStorage(s);e.storageKey=n.key;const i=[];if(t.isScheduled)this.saveMessages([e],{storage:n,isScheduled:!0,isOutgoing:!0}),i.push((()=>{this.rootScope.dispatchEvent("scheduled_new",e)}));else{const r=[this.getHistoryStorage(s),t.threadId?this.getHistoryStorage(s,t.threadId):void 0];for(const e of r)e&&e.history.unshift(a);if(this.saveMessages([e],{storage:n,isOutgoing:!0}),this.setDialogTopMessage(e),t.threadId){const a=this.dialogsStorage.getForumTopic(s,t.threadId);a&&this.setDialogTopMessage(e,a)}i.push((()=>{this.rootScope.dispatchEvent("history_append",{storageKey:n.key,message:e})}))}const r=this.pendingByRandomId[e.random_id]={peerId:s,tempId:a,threadId:t.threadId,storage:n,sequential:t.sequential};return this.pendingTopMsgs[s]=a,!t.isGroupedItem&&e.send&&i.push((()=>{t.clearDraft&&this.appDraftsManager.clearDraft(s,t.threadId),e.send()})),i.length&&(t.processAfter||Xt)((()=>{for(const e of i)e()})),r}generateOutgoingMessage(e,t){let a;t.threadId&&!t.replyToMsgId&&(t.replyToMsgId=t.threadId);const s=this.appPeersManager.isBroadcast(e);if(s&&this.appPeersManager.getPeer(e).pFlags.signatures){const e=this.appUsersManager.getSelf();a=e.first_name+(e.last_name?" "+e.last_name:"")}const n={_:"message",id:this.generateTempMessageId(e),from_id:t.sendAsPeerId?this.appPeersManager.getOutputPeer(t.sendAsPeerId):this.generateFromId(e),peer_id:this.appPeersManager.getOutputPeer(e),post_author:a,pFlags:this.generateFlags(e),date:t.scheduleDate||(0,te.Z)(!0)+this.timeManager.getServerTimeOffset(),message:"",grouped_id:t.groupId,random_id:(0,Te.a)(),reply_to:this.generateReplyHeader(e,t.replyToMsgId,t.threadId),via_bot_id:t.viaBotId,reply_markup:t.replyMarkup,replies:this.generateReplies(e),views:s&&1,pending:!0};return(0,ge.Z)(n,["send","promise"]),void 0===t.groupId&&(n.promise=(0,v.Z)()),n}generateReplyHeader(e,t,a){const s=this.appPeersManager.isForum(e);if(s&&!a){const s=this.getMessageByPeer(e,t);s&&(a=(0,Qt.Z)(s,!0))}const n={_:"messageReplyHeader",reply_to_msg_id:t||a,pFlags:{}};return a&&s&&o.Ox!==a&&(n.pFlags.forum_topic=!0),a&&n.reply_to_msg_id!==a&&(n.reply_to_top_id=a),n}generateReplies(e){let t;if(this.appPeersManager.isBroadcast(e)){const a=this.appProfileManager.getCachedFullChat(e.toChatId());(null==a?void 0:a.linked_chat_id)&&(t={_:"messageReplies",flags:1,pFlags:{comments:!0},channel_id:a.linked_chat_id,replies:0,replies_pts:0})}return t}generateFromId(e){return this.appPeersManager.isAnyChat(e)&&(this.appPeersManager.isBroadcast(e)||this.isAnonymousSending(e))?void 0:this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId())}generateFlags(e){const t={};return e!==this.appUsersManager.getSelf().id&&(t.out=!0,this.appPeersManager.isChannel(e)||this.appUsersManager.isBot(e)||(t.unread=!0)),this.appPeersManager.isBroadcast(e)&&(t.post=!0),t}generateForwardHeader(e,t){const a=this.appUsersManager.getSelf().id.toPeerId(),s=t.fromId;if(s===a&&t.peerId===a&&!t.fwd_from)return;const n={_:"messageFwdHeader",flags:0,date:t.date};let i=!1;if(t.fwd_from)n.from_id=t.fwd_from.from_id,n.from_name=t.fwd_from.from_name,n.post_author=t.fwd_from.post_author;else{if(n.post_author=t.post_author,s.isUser()){const e=this.appProfileManager.getCachedFullUser(s.toUserId());(null==e?void 0:e.private_forward_name)&&(n.from_name=e.private_forward_name,i=!0)}i||(n.from_id=this.appPeersManager.getOutputPeer(s))}return this.appPeersManager.isBroadcast(t.peerId)&&(t.post_author&&(n.post_author=t.post_author),n.channel_post=t.id),e!==a||i||(n.saved_from_msg_id=t.id,n.saved_from_peer=this.appPeersManager.getOutputPeer(t.peerId)),n}generateFakeAvatarMessage(e,t){const a=Number.MAX_SAFE_INTEGER,s={_:"messageService",pFlags:{},action:{_:"messageActionChannelEditPhoto",photo:t},id:a,peer_id:this.appPeersManager.getOutputPeer(e),mid:a,peerId:e,date:t.date,fromId:e};return this.getHistoryMessagesStorage(e).set(a,s),s}getUploadPromise(e){return this.uploadFilePromises[e]}isAnonymousSending(e){var t,a;return!!e.isAnyChat()&&(null===(a=null===(t=this.appPeersManager.getPeer(e).admin_rights)||void 0===t?void 0:t.pFlags)||void 0===a?void 0:a.anonymous)}setDialogTopMessage(e,t=this.getDialogOnly(e.peerId)){t&&(t.top_message=e.mid,this.getHistoryStorage(e.peerId,"forumTopic"===t._?t.id:void 0).maxId=e.mid,this.dialogsStorage.generateIndexForDialog(t,!1,e),this.scheduleHandleNewDialogs(e.peerId,t))}cancelPendingMessage(e){const t=this.pendingByRandomId[e];if(t){const{peerId:a,tempId:s,storage:n}=t,i=this.getHistoryStorage(a);return this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteMessages",messages:[s],pts:void 0,pts_count:void 0}),i.history.delete(s),delete this.pendingByRandomId[e],n.delete(s),!0}return!1}fillConversations(){return Yt(this,void 0,void 0,(function*(){const e=this.middleware.get();for(;!this.dialogsStorage.isDialogsLoaded(ye);){const t=yield this.getTopMessages({limit:100,folderId:ye});if(!e()||t.isEnd)break}}))}getReadMaxIdIfUnread(e,t){var a,s,n;const i=this.getHistoryStorage(e,t);if(t&&!this.appChatsManager.isForum(e.toChatId())){const t=this.getHistoryStorage(e),n=Math.max(null!==(a=t.readMaxId)&&void 0!==a?a:0,i.readMaxId),r=this.getMessageByPeer(e,i.maxId);return!(null===(s=null==r?void 0:r.pFlags)||void 0===s?void 0:s.out)&&n{if(!n()||"messages.dialogsNotModified"===r._)return null;d.ZP&&this.log("messages.getDialogs result:",r),i||s||t===ye||this.dialogsStorage.resetPinnedOrder(t),i||s||this.appDraftsManager.addMissedDialogs(),this.appUsersManager.saveApiUsers(r.users),this.appChatsManager.saveApiChats(r.chats),this.saveMessages(r.messages);let f=!!s,c=!1;const l=new Map,m=t===ye?o.J$:t,g=!!i||t===ye,h=r.dialogs||r.topics;if((0,ne.Z)(h,(e=>{var t,s;if(e&&(i||null!==(t=(s=e).folder_id)&&void 0!==t||(s.folder_id=m),this.dialogsStorage.saveDialog({dialog:e,ignoreOffsetDate:!0,saveGlobalOffset:g}),void 0!==e.peerId))if(f||this.appPeersManager.isChannel(e.peerId||this.appPeersManager.getPeerId(e.peer))||(this.incrementMaxSeenId(e.top_message),f=!0),a&&(0,ce.Z)(e)>a&&(this.scheduleHandleNewDialogs(e.peerId,e),c=!0),i||(0,oe.Z)(e.read_inbox_max_id)||(0,oe.Z)(e.read_outbox_max_id)){if(e.top_message){const t=this.getMessageByPeer(e.peerId,e.top_message);t&&(this.setMessageUnreadByDialog(t,e),this.dialogsStorage.setDialogToState(e))}}else l.set(e.peerId,{dialog:e}),this.log.error("noIdsDialogs",e,p)})),l.size){const e=[...l.keys()],t=e.map((e=>this.reloadConversation(e)));Promise.all(t).then((()=>{this.rootScope.dispatchEvent("dialogs_multiupdate",l);for(let t=0;t=u||!h.length;v&&this.dialogsStorage.setDialogsLoaded(t,!0),c?this.scheduleHandleNewDialogs():this.rootScope.dispatchEvent("dialogs_multiupdate",new Map);const P=h,b=100===e?P:P.slice(0,e);return{isEnd:v&&b[b.length-1]===P[P.length-1],count:u,dialogs:b}}))}forwardMessages(e,t,a,s={}){return Yt(this,void 0,void 0,(function*(){delete s.replyToMsgId,delete s.threadId,e=this.appPeersManager.getPeerMigratedTo(e)||e;for(let n=0,i=(a=a.slice().sort(((e,t)=>e-t))).length;n{var i,p,d,f,c;const l=this.getMessageByPeer(t,n),m=this.generateOutgoingMessage(e,s);o.push(m.id);const g=["entities","media"];s.dropAuthor||(m.fwd_from=this.generateForwardHeader(e,l),g.push("views","forwards"),(null===(i=m.fwd_from)||void 0===i?void 0:i.from_name)&&e===this.appPeersManager.peerId&&delete m.from_id),s.dropCaptions&&l.media||g.push("message");const h=null===(p=l.reply_to)||void 0===p?void 0:p.reply_to_msg_id,u=a.indexOf(h);if(h&&-1!==u){const e=o[u];m.reply_to={_:"messageReplyHeader",reply_to_msg_id:e}}g.forEach((e=>{m[e]=(0,ve.Z)(l[e])}));const y=null===(d=m.media)||void 0===d?void 0:d.document;return y&&(["round","voice"].includes(y.type)&&(m.pFlags.media_unread=!0),y.sticker&&!this.rootScope.premium&&(0,Wt.Z)(y)&&(m.media.pFlags.nopremium=!0)),l.grouped_id&&(null!==(f=r[c=l.grouped_id])&&void 0!==f?f:r[c]={tempId:""+ ++this.groupedTempId,messages:[]}).messages.push(m),m}));for(const e in r){const t=r[e];t.messages.length>1&&t.messages.forEach((e=>{e.grouped_id=t.tempId}))}p.forEach((e=>{this.beforeMessageSending(e,{isScheduled:!!s.scheduleDate||void 0,sequential:!0})}));const d={};this.pendingAfterMsgs[e]&&(d.afterMessageId=this.pendingAfterMsgs[e].messageId);const f=this.apiManager.invokeApiAfter("messages.forwardMessages",{from_peer:this.appPeersManager.getInputPeerById(t),id:a.map((e=>(0,oe.Z)(e))),random_id:p.map((e=>e.random_id)),to_peer:this.appPeersManager.getInputPeerById(e),with_my_score:s.withMyScore,silent:s.silent,schedule_date:s.scheduleDate,drop_author:s.dropAuthor,drop_media_captions:s.dropCaptions,send_as:s.sendAsPeerId?this.appPeersManager.getInputPeerById(s.sendAsPeerId):void 0},d).then((e=>{this.log("forwardMessages updates:",e),this.apiUpdatesManager.processUpdateMessage(e)}),(e=>{throw this.onMessagesSendError(p,e),e})).finally((()=>{this.pendingAfterMsgs[e]===d&&delete this.pendingAfterMsgs[e]}));this.pendingAfterMsgs[e]=d;const c=[f];return i.length&&c.push(this.forwardMessages(e,t,i,s)),Promise.all(c).then(jt.Z)}))}generateEmptyMessage(e){}onMessagesSendError(e,t){e.forEach((e=>{if(e.error!==t)if(t){e.error=t,this.rootScope.dispatchEvent("message_error",{storageKey:e.storageKey,tempId:e.mid,error:t});const a=this.getDialogOnly(e.peerId);a&&this.rootScope.dispatchEvent("dialog_unread",{peerId:e.peerId,dialog:a})}else delete e.error}))}getMessagesStorageByKey(e){const t=e.split("_"),a=+t[0];return"scheduled"===t[1]?this.getScheduledMessagesStorage(a):this.getHistoryMessagesStorage(a)}getMessageFromStorage(e,t){return"string"==typeof e&&(e=this.getMessagesStorageByKey(e)),e&&e.get(t)}createMessageStorage(e,t){const a=new Map;return a.peerId=e,a.type=t,a.key=`${e}_${t}`,a}getHistoryMessagesStorage(e){var t,a;return null!==(t=(a=this.messagesStorageByPeerId)[e])&&void 0!==t?t:a[e]=this.createMessageStorage(e,"history")}getMessagesStorage(e){return"object"==typeof e?e:this.getMessagesStorageByKey(e)}getMessageById(e){for(const t in this.messagesStorageByPeerId){if(this.appPeersManager.isChannel(t.toPeerId()))continue;const a=this.messagesStorageByPeerId[t].get(e);if(a)return a}return this.getMessageFromStorage(null,e)}getMessageByPeer(e,t){return e?this.getMessageFromStorage(this.getHistoryMessagesStorage(e),t):this.getMessageById(t)}getMessagePeer(e){return e.peer_id&&this.appPeersManager.getPeerId(e.peer_id)||o.NM}getDialogOnly(e){return this.dialogsStorage.getDialogOnly(e)}cantForwardDeleteMids(e,t){const a=this.getMessagesStorage(e);let s=!t.length,n=!t.length;for(const e of t){const t=this.getMessageFromStorage(a,e);if(s||(s=!this.canForward(t)),n||(n=!this.canDeleteMessage(t)),s&&n)break}return{cantForward:s,cantDelete:n}}reloadConversationOrTopic(e,t){t?this.dialogsStorage.getForumTopicById(e,t):this.reloadConversation(e)}reloadConversation(e){let t;if(void 0!==e){const a=this.appPeersManager.getPeerId(e);this.log.warn("reloadConversation",a);let s=this.reloadConversationsPeers.get(a);if(s&&(t=s.promise),t)return t;t=(0,v.Z)(),this.reloadConversationsPeers.set(a,s={inputDialogPeer:this.appPeersManager.getInputDialogPeerById(e),promise:t})}return this.reloadConversationsPromise||(this.reloadConversationsPromise=(0,P.Z)(0).then((()=>{const e=[],t={};for(const[a,{inputDialogPeer:s,promise:n}]of this.reloadConversationsPeers)e.push(s),t[a]=n;const a=()=>{for(const e in t)this.reloadConversationsPeers.delete(+e),t[e].resolve(void 0)};return(()=>Yt(this,void 0,void 0,(function*(){for(;;){const t=yield this.apiManager.invokeApi("messages.getPeerDialogs",{peers:e}),a=this.apiUpdatesManager.updatesState,{state:s}=t;if(!a.pts||a.pts===s.pts)return t;yield(0,P.Z)(500)}})))().then((e=>{for(const e in t)this.reloadConversationsPeers.delete(+e);this.dialogsStorage.applyDialogs(e),e.dialogs.forEach((e=>{const a=e.peerId;a&&(t[a].resolve(e),delete t[a])}))}),jt.Z).then((()=>{a(),this.reloadConversationsPromise=null,this.reloadConversationsPeers.size&&this.reloadConversation()}))}))),t||this.reloadConversationsPromise}doFlushHistory(e,t,a,s){let n;const i=n=>(this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:n.pts,pts_count:n.pts_count}}),!n.offset||this.doFlushHistory(e,t,a,s));return n=s?this.apiManager.invokeApiSingleProcess({method:"channels.deleteTopicHistory",params:{channel:this.appChatsManager.getChannelInput(e.toChatId()),top_msg_id:(0,oe.Z)(s)},processResult:i}):this.apiManager.invokeApiSingleProcess({method:"messages.deleteHistory",params:{just_clear:t,revoke:a,peer:this.appPeersManager.getInputPeerById(e),max_id:0},processResult:i}),n}flushHistory(e,t,a,s){return Yt(this,void 0,void 0,(function*(){if(this.appPeersManager.isChannel(e)&&!s){const t=this.getHistory(e,0,1),a=yield t,s=e.toChatId(),n=a.history[0]||0;return this.apiManager.invokeApiSingle("channels.deleteHistory",{channel:this.appChatsManager.getChannelInput(s),max_id:(0,oe.Z)(n)}).then((e=>(e&&this.apiUpdatesManager.processLocalUpdate({_:"updateChannelAvailableMessages",channel_id:s,available_min_id:n}),e)))}return this.doFlushHistory(e,t,a,s).then((()=>{if(s||this.flushStoragesByPeerId(e),t)this.rootScope.dispatchEvent("dialog_flush",{peerId:e,dialog:this.getDialogOnly(e)});else{const t=this.getTypingKey(e,s);if(delete this.notificationsToHandle[t],delete this.typings[t],!s){const t=this.reloadConversationsPeers.get(e);t&&(this.reloadConversationsPeers.delete(e),t.promise.resolve(void 0))}this.dialogsStorage.dropDialogOnDeletion(e,s)}}))}))}flushStoragesByPeerId(e){[this.historiesStorage,this.threadsStorage,this.searchesStorage,this.pendingAfterMsgs,this.pendingTopMsgs].forEach((t=>{delete t[e]}));for(const t in this.pinnedMessages)(+t===e||t.startsWith(e+"_"))&&delete this.pinnedMessages[t];const t=this.needSingleMessages.get(e);if(t){for(const[e,a]of t)a.resolve(this.generateEmptyMessage(e));t.clear()}[this.messagesStorageByPeerId,this.scheduledMessagesStorage].forEach((t=>{const a=t[e];a&&a.clear()})),this.dialogsStorage.flushForumTopicsCache(e)}hidePinnedMessages(e){return Promise.all([this.appStateManager.getState(),this.getPinnedMessage(e)]).then((([t,a])=>{t.hiddenPinnedMessages[e]=a.maxId,this.rootScope.dispatchEvent("peer_pinned_hidden",{peerId:e,maxId:a.maxId})}))}getPinnedMessagesKey(e,t){return e+(t?"_"+t:"")}getPinnedMessage(e,t){var a,s,n;const i=null!==(a=(s=this.pinnedMessages)[n=this.getPinnedMessagesKey(e,t)])&&void 0!==a?a:s[n]={};return i.promise?i.promise:i.maxId?Promise.resolve(i):i.promise=this.getSearch({peerId:e,inputFilter:{_:"inputMessagesFilterPinned"},maxId:0,limit:1,threadId:t}).then((e=>{var t;return i.count=e.count,i.maxId=null===(t=e.history[0])||void 0===t?void 0:t.mid,i})).finally((()=>{delete i.promise}))}getPinnedMessagesCount(e,t){var a;return null===(a=this.pinnedMessages[this.getPinnedMessagesKey(e,t)])||void 0===a?void 0:a.count}getPinnedMessagesMaxId(e,t){var a;return null===(a=this.pinnedMessages[this.getPinnedMessagesKey(e,t)])||void 0===a?void 0:a.maxId}updatePinnedMessage(e,t,a,s,n){return this.apiManager.invokeApi("messages.updatePinnedMessage",{peer:this.appPeersManager.getInputPeerById(e),unpin:a,silent:s,pm_oneside:n,id:(0,oe.Z)(t)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}unpinAllMessages(e){return this.apiManager.invokeApiSingle("messages.unpinAllMessages",{peer:this.appPeersManager.getInputPeerById(e)}).then((t=>(this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:t.pts,pts_count:t.pts_count}}),t.offset?this.unpinAllMessages(e):(this.getHistoryMessagesStorage(e).forEach((e=>{e.pFlags.pinned&&delete e.pFlags.pinned})),this.rootScope.dispatchEvent("peer_pinned_messages",{peerId:e,unpinAll:!0}),delete this.pinnedMessages[this.getPinnedMessagesKey(e)],!0))))}getAlbumText(e){const t=this.groupedMessagesStorage[e];return(0,Ht.Z)(Array.from(t.values()))}getGroupsFirstMessage(e){if(!(null==e?void 0:e.grouped_id))return e;const t=this.groupedMessagesStorage[e.grouped_id];let a=Number.MAX_SAFE_INTEGER;for(const[e,s]of t)s.midthis.getMessageFromStorage(a,e)))}getMidsByMessage(e){return e?e.grouped_id?this.getMidsByAlbum(e.grouped_id):[e.mid]:[]}filterMessages(e,t){const a=[];if(e.grouped_id){const s=this.groupedMessagesStorage[e.grouped_id];for(const[e,n]of s)t(n)&&a.push(n)}else t(e)&&a.push(e);return a}generateTempMessageId(e){const t=this.getDialogOnly(e);return this.appMessagesIdsManager.generateTempMessageId((null==t?void 0:t.top_message)||0)}setMessageUnreadByDialog(e,t=this.getDialogOnly(e.peerId)){t&&e.mid&&e.mid>t[e.pFlags.out?"read_outbox_max_id":"read_inbox_max_id"]&&(e.pFlags.unread=!0)}saveMessage(e,t={}){var a,s,n,i,r;if(!e||"messageEmpty"===e._)return;null!==(a=e.pFlags)&&void 0!==a||(e.pFlags={});const p=this.getMessagePeer(e),d=t.storage||this.getHistoryMessagesStorage(p),f="peerChannel"===e.peer_id._,c=f&&this.appChatsManager.isBroadcast(p.toChatId()),l="message"===e._;t.isOutgoing&&(e.pFlags.is_outgoing=!0);const m=(0,pe.Z)(e.id);e.mid=m,l&&(t.isScheduled&&(e.pFlags.is_scheduled=!0),e.grouped_id&&(null!==(s=(i=this.groupedMessagesStorage)[r=e.grouped_id])&&void 0!==s?s:i[r]=this.createMessageStorage(p,"grouped")).set(m,e),e.via_bot_id&&(e.viaBotId=e.via_bot_id));const g=e.reply_to;g&&(g.reply_to_msg_id&&(g.reply_to_msg_id=e.reply_to_mid=(0,pe.Z)(g.reply_to_msg_id)),g.reply_to_top_id&&(g.reply_to_top_id=(0,pe.Z)(g.reply_to_top_id)));const h=l&&e.replies;h&&(h.max_id&&(h.max_id=(0,pe.Z)(h.max_id)),h.read_max_id&&(h.read_max_id=(0,pe.Z)(h.read_max_id)));const u=!!p;u||(e.date-=this.timeManager.getServerTimeOffset());const y=this.appPeersManager.peerId,_=l&&e.fwd_from;if(e.peerId=p,e.fromId=p===y?_?_.from_id?this.appPeersManager.getPeerId(_.from_id):o.NM:y:e.pFlags.post||!e.from_id?p:this.appPeersManager.getPeerId(e.from_id),this.setMessageUnreadByDialog(e),_){_.saved_from_msg_id&&(_.saved_from_msg_id=(0,pe.Z)(_.saved_from_msg_id)),_.channel_post&&(_.channel_post=(0,pe.Z)(_.channel_post));const t=_.saved_from_peer||_.from_id,a=_.saved_from_msg_id||_.channel_post;if(t&&a){const s=this.appPeersManager.getPeerId(t),n=(0,pe.Z)(a);e.savedFrom=s+"_"+n}e.fwdFromId=this.appPeersManager.getPeerId(_.from_id),u||(_.date-=this.timeManager.getServerTimeOffset())}const v={type:"message",peerId:p,messageId:m};let P=!1;const b=l&&e.media;if(b)switch(b._){case"messageMediaEmpty":delete e.media;break;case"messageMediaPhoto":b.ttl_seconds?P=!0:b.photo=this.appPhotosManager.savePhoto(b.photo,v),b.photo||delete e.media;break;case"messageMediaPoll":{const t=this.appPollsManager.savePoll(b.poll,b.results,e);b.poll=t.poll,b.results=t.results;break}case"messageMediaDocument":if(b.ttl_seconds)P=!0;else{const e=b.document;b.document=this.appDocsManager.saveDoc(e,v),b.document||"documentEmpty"===e._||(P=!0)}break;case"messageMediaWebPage":{const a=this.appWebPagesManager.getMessageKeyForPendingWebPage(p,m,t.isScheduled);b.webpage=this.appWebPagesManager.saveWebPage(b.webpage,a,v),b.webpage||delete e.media;break}case"messageMediaInvoice":{b.photo=this.appWebDocsManager.saveWebDocument(b.photo);const e=b.extended_media;if("messageExtendedMedia"===(null==e?void 0:e._)){const t=e.media;t.photo=this.appPhotosManager.savePhoto(t.photo,v),t.document=this.appDocsManager.saveDoc(t.document,v)}break}case"messageMediaUnsupported":P=!0}if(l&&P&&(e.media={_:"messageMediaUnsupported"},e.message="",delete e.entities,delete e.totalEntities),!l&&e.action){const t=e.action,a=e.fromId===this.appUsersManager.getSelf().id?"You":"";let s,i;switch(t.photo&&(t.photo=this.appPhotosManager.savePhoto(t.photo,v)),t.document&&(t.document=this.appDocsManager.saveDoc(t.photo,v)),t._){case"messageActionChatEditPhoto":(null===(n=t.photo)||void 0===n?void 0:n.video_sizes)?t._=c?"messageActionChannelEditVideo":"messageActionChatEditVideo":c&&(t._="messageActionChannelEditPhoto");break;case"messageActionGroupCall":{let e;this.appGroupCallsManager.saveGroupCall(t.call),e=void 0===t.duration?"started":"ended",c||(e+="_by"+a),t.type=e;break}case"messageActionChatEditTitle":c&&(t._="messageActionChannelEditTitle");break;case"messageActionChatDeletePhoto":c&&(t._="messageActionChannelDeletePhoto");break;case"messageActionChatAddUser":1===t.users.length?(t.user_id=t.users[0],e.fromId===t.user_id&&(t._=f?"messageActionChatJoined"+a:"messageActionChatReturn"+a)):t.users.length>1&&(t._="messageActionChatAddUsers");break;case"messageActionChatDeleteUser":e.fromId===t.user_id&&(t._="messageActionChatLeave"+a);break;case"messageActionChannelMigrateFrom":s=t.chat_id.toPeerId(!0),i=p;break;case"messageActionChatMigrateTo":s=p,i=t.channel_id.toPeerId(!0);break;case"messageActionHistoryClear":e.clear_history=!0,delete e.pFlags.out,delete e.pFlags.unread;break;case"messageActionPhoneCall":t.type=(t.pFlags.video?"video_":"")+(void 0!==t.duration?e.pFlags.out?"out_":"in_":"")+(void 0!==t.duration?"ok":"phoneCallDiscardReasonMissed"===t.reason._?"missed":"cancelled")}s&&i&&!this.migratedFromTo[s]&&!this.migratedToFrom[i]&&this.migrateChecks(s,i)}return l&&e.message.length&&!e.totalEntities&&this.wrapMessageEntities(e),d.set(m,e),e}saveMessages(e,t={}){return e.saved||(e.saved=!0,e.forEach(((e,a,s)=>{s[a]=this.saveMessage(e,t)}))),e}getFirstMessageToEdit(e,t){return Yt(this,void 0,void 0,(function*(){const a=this.getHistoryStorage(e,t).history.slice;if(a.isEnd(se.D.Bottom)&&a.length){let t;const s=this.appPeersManager.peerId;for(const n of a){const a=this.getMessageByPeer(e,n);if((s===e?a.fromId===s:a.pFlags.out)&&(yield this.canEditMessage(a,"text"))){t=a;break}}return t}}))}wrapMessageEntities(e){const t=e.entities?e.entities.slice():[];e.message=(0,Pt.Z)(e.message,t);const a=(0,Lt.Z)(e.message);e.totalEntities=(0,Ot.Z)(t,a)}reportMessages(e,t,a,s){return this.apiManager.invokeApiSingle("messages.report",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e))),reason:{_:a},message:s})}startBot(e,t,a){const s=t?t.toPeerId(!0):e.toPeerId();if(a){const t=(0,Te.a)();return this.apiManager.invokeApi("messages.startBot",{bot:this.appUsersManager.getUserInput(e),peer:this.appPeersManager.getInputPeerById(s),random_id:t,start_param:a}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}const n="/start";if(t){let a;return a=this.appChatsManager.isChannel(t)?this.appChatsManager.inviteToChannel(t,[e]):this.appChatsManager.addChatUser(t,e,0),a.catch((e=>{if("USER_ALREADY_PARTICIPANT"!=(null==e?void 0:e.type))throw e;e.handled=!0})).then((()=>this.sendText(s,n+"@"+this.appPeersManager.getPeerUsername(e.toPeerId()))))}return this.sendText(s,n)}editPeerFolders(e,t){this.apiManager.invokeApi("folders.editPeerFolders",{folder_peers:e.map((e=>({_:"inputFolderPeer",peer:this.appPeersManager.getInputPeerById(e),folder_id:t})))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}getFilter(e){return this.filtersStorage.getFilter(e)}toggleDialogPin(e){var t;return Yt(this,void 0,void 0,(function*(){const{peerId:a,topicId:s,filterId:n=(s?a:void 0)}=e;if(void 0===n)throw new Error("No filterId");if(n>1)return this.filtersStorage.toggleDialogPin(a,n);const i=this.dialogsStorage.getDialogOrTopic(a,s);if(!i)throw void 0;const r=!(null===(t=i.pFlags)||void 0===t?void 0:t.pinned)||void 0;if(r){const e=yield this.apiManager.getLimit(s?"topicPin":1===n?"folderPin":"pin");if(this.dialogsStorage.getPinnedOrders(n).length>=e)throw(0,X.Z)(s?"PINNED_TOO_MUCH":"PINNED_DIALOGS_TOO_MUCH")}return s?this.appChatsManager.updatePinnedForumTopic(a.toChatId(),s,r):this.apiManager.invokeApi("messages.toggleDialogPin",{peer:this.appPeersManager.getInputDialogPeerById(a),pinned:r}).then((e=>{const t=r?{pinned:r}:{};this.apiUpdatesManager.saveUpdate({_:"updateDialogPinned",peer:this.appPeersManager.getDialogPeer(a),folder_id:n,pFlags:t})}))}))}markDialogUnread(e,t){var a;const s=this.getDialogOnly(e);if(!s)return Promise.reject();const n=!t&&!(null===(a=s.pFlags)||void 0===a?void 0:a.unread_mark)||void 0;return this.apiManager.invokeApi("messages.markDialogUnread",{peer:this.appPeersManager.getInputDialogPeerById(e),unread:n}).then((t=>{if(t){const t=n?{unread:n}:{};this.onUpdateDialogUnreadMark({_:"updateDialogUnreadMark",peer:this.appPeersManager.getDialogPeer(e),pFlags:t})}}))}migrateChecks(e,t){if(!this.migratedFromTo[e]&&!this.migratedToFrom[t]&&this.appChatsManager.hasChat(t.toChatId())){const a=this.appChatsManager.getChat(e.toChatId());(null==a?void 0:a.migrated_to)&&a.migrated_to.channel_id===t.toChatId()&&(this.migratedFromTo[e]=t,this.migratedToFrom[t]=e,this.rootScope.dispatchEvent("dialog_migrate",{migrateFrom:e,migrateTo:t}),this.dialogsStorage.dropDialogWithEvent(e))}}canMessageBeEdited(e,t){var a,s;if(null===(a=null==e?void 0:e.pFlags)||void 0===a?void 0:a.is_outgoing)return!1;const n=["messageMediaPhoto","messageMediaDocument","messageMediaWebPage"];return"poll"===t&&n.push("messageMediaPoll"),!(!e||"message"!==e._||e.deleted||e.fwd_from||e.via_bot_id||e.media&&-1===n.indexOf(e.media._)||e.fromId&&this.appUsersManager.isBot(e.fromId)||"messageMediaDocument"===(null===(s=e.media)||void 0===s?void 0:s._)&&(e.media.document.sticker||"round"===e.media.document.type))}canEditMessage(e,t="text"){var a;return Yt(this,void 0,void 0,(function*(){return!(!e||!this.canMessageBeEdited(e,t))&&(this.getMessagePeer(e)===this.appUsersManager.getSelf().id||!(!(this.appPeersManager.isBroadcast(e.peerId)?this.appChatsManager.hasRights(e.peerId.toChatId(),"edit_messages"):e.pFlags.out)||"peerChannel"!==e.peer_id._&&e.date<(0,te.Z)(!0)-(yield this.apiManager.getConfig()).edit_time_limit&&"messageMediaPoll"!==(null===(a=e.media)||void 0===a?void 0:a._)))}))}canDeleteMessage(e){return e&&(e.peerId.isUser()||e.pFlags.out||"chat"===this.appChatsManager.getChat(e.peerId.toChatId())._||this.appChatsManager.hasRights(e.peerId.toChatId(),"delete_messages"))&&(!e.pFlags.is_outgoing||!!e.error)}getReplyKeyboard(e){return this.getHistoryStorage(e).replyMarkup}mergeReplyKeyboard(e,t){var a,s;if(!t)return!1;const n=t.reply_markup;if(!n&&!(null===(a=t.pFlags)||void 0===a?void 0:a.out)&&!t.action)return!1;if("replyInlineMarkup"===(null==n?void 0:n._))return!1;const i=e.replyMarkup;if(n)return!(i&&i.mid>=t.mid||n.pFlags.selective||(e.maxOutId&&t.midi.mid||t.pFlags.is_outgoing)&&t.message)return i.pFlags.hidden=!0,!0}else(!e.maxOutId||t.mid>e.maxOutId)&&(e.maxOutId=t.mid);return(0,ue.Z)(t),!("messageActionChatDeleteUser"!==(null===(s=t.action)||void 0===s?void 0:s._)||!(i?t.action.user_id===i.fromId:this.appUsersManager.isBot(t.action.user_id))||(e.replyMarkup={_:"replyKeyboardHide",mid:t.mid,pFlags:{}},0))}getSearchStorage(e,t){return this.searchesStorage[e]||(this.searchesStorage[e]={}),this.searchesStorage[e][t]||(this.searchesStorage[e][t]={history:[]}),this.searchesStorage[e][t]}getSearchCounters(e,t,a=!0,s){return this.appPeersManager.isPeerRestricted(e)?Promise.resolve(t.map((e=>({_:"messages.searchCounter",pFlags:{},filter:e,count:0})))):(a?this.apiManager.invokeApiCacheable:this.apiManager.invokeApi).bind(this.apiManager)("messages.getSearchCounters",{peer:this.appPeersManager.getInputPeerById(e),filters:t,top_msg_id:s?(0,oe.Z)(s):void 0})}filterMessagesByInputFilterFromStorage(e,t,a,s){const n=this.getMessagesStorage(a);return(0,Nt.Z)(e,t.map((e=>n.get(e))),s)}getSearch({peerId:e,query:t,inputFilter:a,maxId:s,limit:n,nextRate:i,backLimit:r,threadId:o,folderId:p,minDate:f,maxDate:c}){if(this.appPeersManager.isPeerRestricted(e))return Promise.resolve({count:0,offset_id_offset:0,next_rate:void 0,history:[]});t||(t=""),a||(a={_:"inputMessagesFilterEmpty"}),void 0===n&&(n=20),i||(i=0),r||(r=0),f=f?f/1e3|0:0,c=c?c/1e3|0:0;let l=[];r&&(n+=r);let m;if(!e||r||s||t||1===n||o||(m=this.getHistoryStorage(e),l=this.filterMessagesByInputFilterFromStorage(a._,m.history.slice,this.getHistoryMessagesStorage(e),n)),l.length){if(!(l.length{this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.saveMessages(e.messages),d.ZP&&this.log("getSearch result:",a,e);const t=e.count||l.length+e.messages.length;return e.messages.forEach((e=>{const t=this.getMessagePeer(e);if(t.isAnyChat()){const e=this.appChatsManager.getChat(t.toChatId());e.migrated_to&&this.migrateChecks(t,e.migrated_to.channel_id.toPeerId(!0))}l.push(e)})),{count:t,offset_id_offset:e.offset_id_offset||0,next_rate:e.next_rate,history:l}}))}subscribeRepliesThread(e,t){const a=e+"_"+t;for(const e in this.threadsToReplies)if(this.threadsToReplies[e]===a)return;this.getDiscussionMessage(e,t)}generateThreadServiceStartMessage(e){const t=e.peerId+"_"+e.mid;if(this.threadsServiceMessagesIdsStorage[t])return;const a=(0,oe.Z)(Math.max(...this.getMidsByMessage(e))),s={_:"messageService",pFlags:{is_single:!0},id:this.appMessagesIdsManager.generateTempMessageId(a),date:e.date,from_id:{_:"peerUser",user_id:o.NM},peer_id:e.peer_id,action:{_:"messageActionDiscussionStarted"},reply_to:this.generateReplyHeader(e.peerId,e.id)};this.saveMessages([s],{isOutgoing:!0}),this.threadsServiceMessagesIdsStorage[t]=s.mid}getThreadServiceMessageId(e,t){return this.threadsServiceMessagesIdsStorage[e+"_"+t]}getDiscussionMessage(e,t){return this.apiManager.invokeApiSingle("messages.getDiscussionMessage",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((a=>{var s;this.appChatsManager.saveApiChats(a.chats),this.appUsersManager.saveApiUsers(a.users),this.saveMessages(a.messages);const n=this.getMessageWithReplies(a.messages[0]),i=n.peerId+"_"+n.mid;this.generateThreadServiceStartMessage(n);const r=this.getHistoryStorage(n.peerId,n.mid),o=a.max_id=(0,pe.Z)(a.max_id)||0;a.read_inbox_max_id=r.readMaxId=(0,pe.Z)(null!==(s=a.read_inbox_max_id)&&void 0!==s?s:n.mid),a.read_outbox_max_id=r.readOutboxMaxId=(0,pe.Z)(a.read_outbox_max_id)||0;const p=r.history.first;return r.maxId&&r.maxId{this.newDialogsHandlePromise=void 0,this.handleNewDialogs()}))}deleteMessages(e,t,a){var s,n;return Yt(this,void 0,void 0,(function*(){let i;const r=yield this.apiManager.getConfig(),o=t.splice(r.forwarded_count_max,t.length-r.forwarded_count_max),p=t.map((e=>(0,oe.Z)(e)));if(e.isAnyChat()&&this.appPeersManager.isChannel(e)){const a=e.toChatId(),r=this.appChatsManager.getChat(a);if(!r.pFlags.creator&&!(null===(n=null===(s=r.admin_rights)||void 0===s?void 0:s.pFlags)||void 0===n?void 0:n.delete_messages)&&!(t=t.filter((t=>!!this.getMessageByPeer(e,t).pFlags.out))).length)return;i=this.apiManager.invokeApi("channels.deleteMessages",{channel:this.appChatsManager.getChannelInput(a),id:p}).then((e=>{this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteChannelMessages",channel_id:a,messages:t,pts:e.pts,pts_count:e.pts_count})}))}else i=this.apiManager.invokeApi("messages.deleteMessages",{revoke:a,id:p}).then((e=>{this.apiUpdatesManager.processLocalUpdate({_:"updateDeleteMessages",messages:t,pts:e.pts,pts_count:e.pts_count})}));const d=[i];return o.length&&d.push(this.deleteMessages(e,o,a)),Promise.all(d).then(jt.Z)}))}readHistory(e,t=0,a,s=!1){if(this.log("readHistory:",e,t,a),!this.getReadMaxIdIfUnread(e,a)){if(a&&!s){const t=this.dialogsStorage.getForumTopic(e,a);(0,oe.Z)(t.read_inbox_max_id)||(s=!0)}if(!s){const t=this.appChatsManager.isForum(e.toChatId())&&a?this.dialogsStorage.getForumTopic(e,a):this.getDialogOnly(e);t&&this.isDialogUnread(t)&&(s=!0)}if(!s)return this.log("readHistory: isn't unread"),Promise.resolve()}const n=this.getHistoryStorage(e,a);if(n.triedToReadMaxId>=t)return Promise.resolve();let i;return a?(n.readPromise||(i=this.apiManager.invokeApi("messages.readDiscussion",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(a),read_max_id:(0,oe.Z)(t)})),this.apiUpdatesManager.processLocalUpdate({_:"updateReadChannelDiscussionInbox",channel_id:e.toChatId(),top_msg_id:a,read_max_id:t})):this.appPeersManager.isChannel(e)?(n.readPromise||(i=this.apiManager.invokeApi("channels.readHistory",{channel:this.appChatsManager.getChannelInput(e.toChatId()),max_id:(0,oe.Z)(t)})),this.apiUpdatesManager.processLocalUpdate({_:"updateReadChannelInbox",max_id:t,channel_id:e.toChatId(),still_unread_count:void 0,pts:void 0})):(n.readPromise||(i=this.apiManager.invokeApi("messages.readHistory",{peer:this.appPeersManager.getInputPeerById(e),max_id:(0,oe.Z)(t)}).then((e=>{this.apiUpdatesManager.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:e.pts,pts_count:e.pts_count}})}))),this.apiUpdatesManager.processLocalUpdate({_:"updateReadHistoryInbox",max_id:t,peer:this.appPeersManager.getOutputPeer(e),still_unread_count:void 0,pts:void 0,pts_count:void 0})),this.rootScope.dispatchEvent("notification_reset",this.appPeersManager.getPeerString(e)),n.readPromise?n.readPromise:(n.triedToReadMaxId=t,i.finally((()=>{delete n.readPromise;const{readMaxId:s}=n;this.log("readHistory: promise finally",t,s),s>t&&this.readHistory(e,s,a,!0)})),n.readPromise=i)}readAllHistory(e,t,a=!1){const s=this.getHistoryStorage(e,t);s.maxId&&this.readHistory(e,s.maxId,t,a)}getUnreadMentionsKey(e,t){return e+(t?`_${t}`:"")}fixDialogUnreadMentionsIfNoMessage(e,t){const a=this.dialogsStorage.getDialogOrTopic(e,t);(null==a?void 0:a.unread_mentions_count)&&this.reloadConversationOrTopic(e)}modifyCachedMentions(e,t,a,s){const n=this.unreadMentions[this.getUnreadMentionsKey(e,s)];n&&(a?n.first.isEnd(se.D.Top)&&n.insertSlice([t]):n.delete(t))}fixUnreadMentionsCountIfNeeded(e,t,a){const s=this.dialogsStorage.getDialogOrTopic(e,a);!t.length&&(null==s?void 0:s.unread_mentions_count)&&this.reloadConversationOrTopic(e)}goToNextMention(e,t){var a,s;const n=this.getUnreadMentionsKey(e,t),i=this.goToNextMentionPromises[n];if(i)return i;const r=null!==(a=(s=this.unreadMentions)[e])&&void 0!==a?a:s[e]=new se.Z,o=r.length,p=r.first.isEnd(se.D.Top);if(!o&&p)return this.fixUnreadMentionsCountIfNeeded(e,r,t),Promise.resolve();let d=Promise.resolve();return!p&&o<25&&(d=this.loadNextMentions(e,t)),this.goToNextMentionPromises[n]=d.then((()=>{const a=r.last,s=a&&a[a.length-1];if(s)return r.delete(s),s;this.fixUnreadMentionsCountIfNeeded(e,r,t)})).finally((()=>{delete this.goToNextMentionPromises[n]}))}loadNextMentions(e,t){const a=this.unreadMentions[e],s=a.first[0]||1;return this.getUnreadMentions(e,s,-50,50,void 0,void 0,t).then((e=>{this.mergeHistoryResult(a,e,1===s?0:s,50,-50)}))}getUnreadMentions(e,t,a,s,n=0,i=0,r){return this.apiManager.invokeApiSingleProcess({method:"messages.getUnreadMentions",params:{peer:this.appPeersManager.getInputPeerById(e),offset_id:(0,oe.Z)(t),add_offset:a,limit:s,max_id:(0,oe.Z)(n),min_id:(0,oe.Z)(i),top_msg_id:r?(0,oe.Z)(r):void 0},processResult:e=>((0,ue.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.saveMessages(e.messages),e)})}readMessages(e,t){if(!t.length)return Promise.resolve();let a,s;if(t=t.map((e=>(0,oe.Z)(e))),e.isAnyChat()&&this.appPeersManager.isChannel(e)){const n=e.toChatId();s={_:"updateChannelReadMessagesContents",channel_id:n,messages:t},a=this.apiManager.invokeApi("channels.readMessageContents",{channel:this.appChatsManager.getChannelInput(n),id:t})}else s={_:"updateReadMessagesContents",messages:t,pts:void 0,pts_count:void 0},a=this.apiManager.invokeApi("messages.readMessageContents",{id:t}).then((e=>{s.pts=e.pts,s.pts_count=e.pts_count,this.apiUpdatesManager.processLocalUpdate(s)}));return this.apiUpdatesManager.processLocalUpdate(s),a}getHistoryStorage(e,t){var a,s,n,i,r,o;return t?null!==(s=(r=null!==(a=(i=this.threadsStorage)[e])&&void 0!==a?a:i[e]={})[t])&&void 0!==s?s:r[t]={count:null,history:new se.Z}:null!==(n=(o=this.historiesStorage)[e])&&void 0!==n?n:o[e]={count:null,history:new se.Z}}getHistoryStorageTransferable(e,t){const a=this.getHistoryStorage(e,t),{count:s,history:n,maxId:i,readMaxId:r,readOutboxMaxId:o,maxOutId:p,replyMarkup:d}=a;return{count:s,history:void 0,historySerialized:n.toJSON(),maxId:i,readMaxId:r,readOutboxMaxId:o,maxOutId:p,replyMarkup:d}}getNotifyPeerSettings(e,t){const a=this.appPeersManager.getInputNotifyPeerById({peerId:e,ignorePeerId:!0,threadId:t});return Promise.all([this.appNotificationsManager.getNotifyPeerTypeSettings(),this.appNotificationsManager.getNotifySettings(a)]).then((([a,s])=>({muted:this.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!0,threadId:t}),peerTypeNotifySettings:s})))}getUpdateAfterReloadKey(e,t){return e+(t?"_"+t:"")}handleNewUpdateAfterReload(e,t,a){var s,n,i;const r=null!==(s=(n=this.newUpdatesAfterReloadToHandle)[i=this.getUpdateAfterReloadKey(e,a)])&&void 0!==s?s:n[i]=new Set;r.has(t)?this.log.error("here we go again",e):(t.ignoreExisting=!0,r.add(t),this.scheduleHandleNewDialogs(e,a))}setDialogToStateIfMessageIsTop(e){this.isMessageIsTopMessage(e)&&this.dialogsStorage.setDialogToState(this.getDialogOnly(e.peerId))}isMessageIsTopMessage(e){const t=this.getDialogOnly(e.peerId);return t&&t.top_message===e.mid}updateMessageRepliesIfNeeded(e){try{const t=this.getThreadKey(e);if(t){const e=this.threadsToReplies[t];if(e){const[t,a]=e.split("_");this.updateMessage(t.toPeerId(),+a,"replies_updated")}}}catch(t){this.log.error("incrementMessageReplies err",t,e)}}getThreadKey(e){var t;let a="";if(null===(t=null==e?void 0:e.peerId)||void 0===t?void 0:t.isAnyChat()){const t=(0,Qt.Z)(e,this.appChatsManager.isForum(e.peerId.toChatId()));t&&(a=e.peerId+"_"+t)}return a}updateMessage(e,t,a){return this.reloadMessages(e,t,!0).then((()=>{const s=this.getMessageByPeer(e,t);if(s)return a&&this.rootScope.dispatchEvent(a,s),s}))}checkPendingMessage(e){const t=this.pendingByMessageId[e.mid];let a;if(t){const s=this.pendingByRandomId[t];(a=this.finalizePendingMessage(t,e))&&this.rootScope.dispatchEvent("history_update",{storageKey:s.storage.key,message:e,sequential:s.sequential}),delete this.pendingByMessageId[e.mid]}return a}mutePeer(e){if(!(e=this.appNotificationsManager.validatePeerSettings(e)))return;const{peerId:t,muteUntil:a,threadId:s}=e,n={_:"inputPeerNotifySettings"};n.mute_until=a;const i=this.appPeersManager.getInputPeerById(t);return this.appNotificationsManager.updateNotifySettings(s?{_:"inputNotifyForumTopic",peer:i,top_msg_id:(0,oe.Z)(s)}:{_:"inputNotifyPeer",peer:i},n)}togglePeerMute({peerId:e,mute:t,threadId:a}){return void 0===t&&(t=!this.appNotificationsManager.isPeerLocalMuted({peerId:e,respectType:!1,threadId:a})),this.mutePeer({peerId:e,muteUntil:t?o.rU:0,threadId:a})}findPeerIdByMids(e){for(let t=e.length-1;t>=0;--t){const a=e[t],s=this.getMessageById(a);if(s)return s.peerId}}canSendToPeer(e,t,a="send_messages"){var s;if(this.appPeersManager.isPeerRestricted(e))return!1;if(e.isAnyChat()){const n=e.toChatId();if(t){const a=this.dialogsStorage.getForumTopic(e,t);if((null===(s=null==a?void 0:a.pFlags)||void 0===s?void 0:s.closed)&&!this.appChatsManager.hasRights(n,"manage_topics"))return!1}const i=this.appChatsManager.getChat(n);return this.appChatsManager.hasRights(n,a,void 0,!!t)&&(!i.pFlags.left||!!t)}return this.appUsersManager.canSendToUser(e)}finalizePendingMessage(e,t){const a=this.pendingByRandomId[e];if(!a)return;const{peerId:s,tempId:n,threadId:i,storage:r}=a;[this.getHistoryStorage(s),i?this.getHistoryStorage(s,i):void 0].filter(Boolean).forEach((e=>{e.history.delete(n)}));const o=this.getMessageFromStorage(r,n);return o&&(delete t.pFlags.is_outgoing,delete t.pending,delete t.error,delete t.random_id,delete t.send),this.rootScope.dispatchEvent("messages_pending"),delete this.pendingByRandomId[e],this.finalizePendingMessageCallbacks(r,n,t),o}finalizePendingMessageCallbacks(e,t,a){const s=this.tempFinalizeCallbacks[t];if(void 0!==s){for(const e in s){const{deferred:t,callback:n}=s[e];n(a).then(t.resolve,t.reject)}delete this.tempFinalizeCallbacks[t]}if(a.media){(0,ue.Z)(a);const{photo:e,document:s}=a.media;if(e){const a=this.appPhotosManager.getPhoto(""+t);if(a){const t=e.sizes[e.sizes.length-1],s=this.thumbsStorage.getCacheContext(e,t.type),n=this.thumbsStorage.getCacheContext(a,o.Pt);Object.assign(s,n);const i=e.sizes[e.sizes.length-1],r=(0,Vt.Z)(e,i);(0,ct.P)(r.location)}}else if(s){const e=this.appDocsManager.getDoc(""+t);if(e){const t=this.thumbsStorage.getCacheContext(e);if(e.type&&"sticker"!==e.type&&"image/gif"!==e.mime_type&&t.url){const e=this.thumbsStorage.getCacheContext(s);Object.assign(e,t),n=s,(0,ct.P)((0,ft.Z)(n,undefined),{fileName:n.file_name})}}}else a.media.poll&&(delete this.appPollsManager.polls[t],delete this.appPollsManager.results[t])}var n;const i=this.getMessageFromStorage(e,t);e.delete(t),!i.reply_markup&&a.reply_markup&&setTimeout((()=>{this.getMessageFromStorage(e,a.mid)&&this.rootScope.dispatchEvent("message_edit",{storageKey:e.key,peerId:a.peerId,mid:a.mid,message:a})}),0),this.handleReleasingMessage(i,e),this.rootScope.dispatchEvent("message_sent",{storageKey:e.key,tempId:t,tempMessage:i,mid:a.mid,message:a})}incrementMaxSeenId(e){if(!e||this.maxSeenId&&!(e>this.maxSeenId))return!1;this.maxSeenId=e,this.appStateManager.pushToState("maxSeenMsgId",e),this.apiManager.invokeApi("messages.receivedMessages",{max_id:(0,oe.Z)(e)})}getMessageReactionsListAndReadParticipants(e,t,a,s,n,i){var r,o;return Yt(this,void 0,void 0,(function*(){const p={reactions:[],count:0,next_offset:void 0},d=yield this.canViewMessageReadParticipants(e);return d&&void 0===t?t=100:void 0===t&&(t=50),Promise.all([!d||a||n?[]:this.getMessageReadParticipants(e.peerId,e.mid).catch((()=>[])),(null===(o=null===(r=e.reactions)||void 0===r?void 0:r.recent_reactions)||void 0===o?void 0:o.length)&&!i?this.appReactionsManager.getMessageReactionsList(e.peerId,e.mid,t,a,s).catch((e=>p)):p]).then((([e,t])=>{const a=e.map((e=>e.toPeerId())),s=a.slice();(0,ne.Z)(s,((e,a,s)=>{t.reactions.some((t=>this.appPeersManager.getPeerId(t.peer_id)===e))&&s.splice(a,1)}));let n=t.reactions.map((e=>({peerId:this.appPeersManager.getPeerId(e.peer_id),reaction:e.reaction})));return n=n.concat(s.map((e=>({peerId:e})))),{reactions:t.reactions,reactionsCount:t.count,readParticipants:a,combined:n,nextOffset:t.next_offset}}))}))}getMessageReadParticipants(e,t){return this.apiManager.invokeApiSingle("messages.getMessageReadParticipants",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((e=>e.map((e=>e.toUserId()))))}canViewMessageReadParticipants(e){return Yt(this,void 0,void 0,(function*(){if("message"!==(null==e?void 0:e._)||e.pFlags.is_outgoing||!e.pFlags.out||!this.appPeersManager.isAnyGroup(e.peerId))return!1;const t=this.appChatsManager.getChat(e.peerId.toChatId()),a=yield this.apiManager.getAppConfig();return t.participants_count<=a.chat_read_mark_size_threshold&&(0,te.Z)(!0)-e.date(0,oe.Z)(e))),increment:!0}).then((a=>{const s=new Array(t.length);for(let n=0,i=t.length;n{const{chatPeerIds:t}=e.state;return t[t.length-1]===a}));n||(s.sort(((e,t)=>e.state.idleStartTime-t.state.idleStartTime)),n=s[0].state.idleStartTime?s[s.length-1]:s[0]),f.Z.getInstance().invokeVoid("notificationBuild",Object.assign({message:e},t),n.source)}getScheduledMessagesStorage(e){var t,a;return null!==(t=(a=this.scheduledMessagesStorage)[e])&&void 0!==t?t:a[e]=this.createMessageStorage(e,"scheduled")}getScheduledMessageByPeer(e,t){return this.getMessageFromStorage(this.getScheduledMessagesStorage(e),t)}getScheduledMessages(e){if(!this.canSendToPeer(e))return;const t=this.getScheduledMessagesStorage(e);return t.size?[...t.keys()]:this.apiManager.invokeApiSingle("messages.getScheduledHistory",{peer:this.appPeersManager.getInputPeerById(e),hash:""}).then((t=>{if("messages.messagesNotModified"!==t._){this.appUsersManager.saveApiUsers(t.users),this.appChatsManager.saveApiChats(t.chats);const a=this.getScheduledMessagesStorage(e);return this.saveMessages(t.messages,{storage:a,isScheduled:!0}),[...a.keys()]}return[]}))}sendScheduledMessages(e,t){return this.apiManager.invokeApi("messages.sendScheduledMessages",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}deleteScheduledMessages(e,t){return this.apiManager.invokeApi("messages.deleteScheduledMessages",{peer:this.appPeersManager.getInputPeerById(e),id:t.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e)}))}getMessageWithReplies(e){return this.filterMessages(e,(e=>!!e.replies))[0]}getMessageWithCommentReplies(e){if(e.peerId!==o.hj){const t=null==(e=this.getMessageWithReplies(e))?void 0:e.replies;if(!t||!t.pFlags.comments||t.channel_id.toChatId()===o.IA)return}return e}isFetchIntervalNeeded(e){return e.isAnyChat()&&(!this.appChatsManager.isInChat(e.toChatId())||this.appChatsManager.isForum(e.toChatId()))}getNewHistory(e,t){var a;return Yt(this,void 0,void 0,(function*(){if(!this.isFetchIntervalNeeded(e))return;const s=this.getHistoryStorage(e,t),n=s.history.slice;if(!n.isEnd(se.D.Bottom))return;delete s.maxId,n.unsetEnd(se.D.Bottom);const i=yield this.getHistory(e,null!==(a=n[0])&&void 0!==a?a:1,0,50,t);for(let t=0,a=i.history.length;t{const e=i.history.sliceMe(t,r,a),s=(null==e?void 0:e.slice)||i.history.constructSlice();return{count:i.count,history:Array.from(s),isEnd:s.getEnds(),offsetIdOffset:(null==e?void 0:e.offsetIdOffset)||i.count}})):{count:i.count,history:Array.from(o.slice),isEnd:o.slice.getEnds(),offsetIdOffset:o.offsetIdOffset}}isHistoryResultEnd(e,t,a){const{offset_id_offset:s,messages:n}=e,i=e.count||n.length,r=s||0,o=a<0?t+a:t;return{count:i,offsetIdOffset:r,isTopEnd:r>=i-o||ie.mid));if(a&&(0,oe.Z)(a)&&!c.includes(a)&&pc[e]);++e);c.splice(e,0,a)}const l=e.insertSlice(c)||e.slice;return d&&l.setEnd(se.D.Top),f&&l.setEnd(se.D.Bottom),Object.assign({slice:l,mids:c,messages:i},r)}fillHistoryStorage(e,t,a,s,n,i){const r=n.maxId;return this.requestHistory(e,t,a,s,void 0,i).then((i=>{const{count:o,isBottomEnd:p,slice:d,messages:f}=this.mergeHistoryResult(n.history,i,t,a,s);n.count=o;for(let t=0,a=f.length;t{d.ZP&&this.log("requestHistory result:",e,r,t,a,s),this.appUsersManager.saveApiUsers(r.users),this.appChatsManager.saveApiChats(r.chats),this.saveMessages(r.messages),"pts"in r&&this.apiUpdatesManager.addChannelState(e.toChatId(),r.pts);let o=r.messages.length,p=r.count;o&&!r.messages[o-1]&&(r.messages.splice(o-1,1),o--,p--);const f=this.getHistoryStorage(e,i),c=r.messages[o-1];if(o&&c.grouped_id){const t=f.history.findSlice(c.mid);if(t&&t.slice.length+r.messages.lengthr))}return r}),(t=>{if("CHANNEL_PRIVATE"===t.type){let t=this.appChatsManager.getChat(e.toChatId());"channel"===t._&&(t={_:"channelForbidden",id:e.toChatId(),access_hash:t.access_hash,title:t.title,pFlags:t.pFlags}),this.apiUpdatesManager.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e.toChatId()}],chats:[t],users:[]})}throw t}))}fetchSingleMessages(){return this.fetchSingleMessagesPromise?this.fetchSingleMessagesPromise:this.fetchSingleMessagesPromise=(0,P.Z)(0).then((()=>{const e=[];for(const[t,a]of this.needSingleMessages){const s=[...a.keys()],n=s.map((e=>({_:"inputMessageID",id:(0,oe.Z)(e)})));let i;i=t.isAnyChat()&&this.appPeersManager.isChannel(t)?this.apiManager.invokeApiSingle("channels.getMessages",{channel:this.appChatsManager.getChannelInput(t.toChatId()),id:n}):this.apiManager.invokeApiSingle("messages.getMessages",{id:n});const r=i.then((e=>{(0,ue.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats);const t=this.saveMessages(e.messages);for(let e=0;e{this.rootScope.dispatchEvent("messages_downloaded",{peerId:t,mids:s})}));e.push(r)}return this.needSingleMessages.clear(),Promise.all(e).then(jt.Z,jt.Z).then((()=>{this.fetchSingleMessagesPromise=void 0,this.needSingleMessages.size&&this.fetchSingleMessages()}))}))}reloadMessages(e,t,a){if(Array.isArray(t))return Promise.all(t.map((t=>this.reloadMessages(e,t,a))));const s=this.getMessageByPeer(e,t);if(s&&!a)return this.rootScope.dispatchEvent("messages_downloaded",{peerId:e,mids:[t]}),Promise.resolve(s);{let a=this.needSingleMessages.get(e);a||this.needSingleMessages.set(e,a=new Map);let s=a.get(t);return s||(s=(0,v.Z)(),a.set(t,s),this.fetchSingleMessages(),s)}}getExtendedMedia(e,t){let a=this.extendedMedia.get(e);a||this.extendedMedia.set(e,a=new Map);const s=(0,v.Z)(),n=[],i=t.map((t=>{let i=a.get(t);return i||(a.set(t,i=s),n.push(t),i.then((()=>{a.delete(t),a.size||this.extendedMedia.get(e)!==a||this.extendedMedia.delete(e)}))),i}));return n.length?this.apiManager.invokeApi("messages.getExtendedMedia",{peer:this.appPeersManager.getInputPeerById(e),id:n.map((e=>(0,oe.Z)(e)))}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),s.resolve()})):s.resolve(),Promise.all(i)}fetchMessageReplyTo(e){if(!e.reply_to_mid)return Promise.resolve(this.generateEmptyMessage(0));const t=e.reply_to.reply_to_peer_id?this.appPeersManager.getPeerId(e.reply_to.reply_to_peer_id):e.peerId;return this.reloadMessages(t,e.reply_to_mid).then((t=>{if(t||delete(e=this.getMessageByPeer(e.peerId,e.mid)).reply_to_mid,"messageService"===e._){const t=e.peerId;this.rootScope.dispatchEvent("message_edit",{storageKey:`${t}_history`,peerId:t,mid:e.mid,message:e}),this.isMessageIsTopMessage(e)&&this.rootScope.dispatchEvent("dialogs_multiupdate",new Map([[t,{dialog:this.getDialogOnly(t)}]]))}return t}))}getTypingKey(e,t){return t?`${e}_${t}`:e}setTyping(e,t,a,s){var n;s&&!this.appPeersManager.isForum(e)&&(s=void 0);const i=this.getTypingKey(e,s);let r=this.typings[i];return e&&this.canSendToPeer(e)&&e!==this.appPeersManager.peerId&&(a||(null===(n=null==r?void 0:r.action)||void 0===n?void 0:n._)!==t._)?((null==r?void 0:r.timeout)&&clearTimeout(r.timeout),r=this.typings[i]={action:t},this.apiManager.invokeApi("messages.setTyping",{peer:this.appPeersManager.getInputPeerById(e),action:t,top_msg_id:s?(0,oe.Z)(s):void 0}).finally((()=>{r===this.typings[i]&&(r.timeout=E.Z.setTimeout((()=>{delete this.typings[i]}),6e3))}))):Promise.resolve(!1)}handleReleasingMessage(e,t){const a=e.media;if(a){const s=a.webpage||a,n=s.photo||s.document;if((null==n?void 0:n.file_reference)&&this.referenceDatabase.deleteContext(n.file_reference,{type:"message",peerId:e.peerId,messageId:e.mid}),"webpage"in a&&a.webpage){const s=this.getScheduledMessagesStorage(e.peerId)===t,n=this.appWebPagesManager.getMessageKeyForPendingWebPage(e.peerId,e.mid,s);this.appWebPagesManager.deleteWebPageFromPending(a.webpage,n)}a.poll&&this.appPollsManager.updatePollToMessage(e,!1)}}handleDeletedMessages(e,t,a){const s={count:0,unread:0,unreadMentions:0,msgs:new Set};for(const n of a){const a=this.getMessageFromStorage(t,n);if(!a){this.fixDialogUnreadMentionsIfNoMessage(e);continue}this.handleReleasingMessage(a,t),this.updateMessageRepliesIfNeeded(a),a.pFlags.out||a.pFlags.is_outgoing||!a.pFlags.unread||(++s.unread,this.rootScope.dispatchEvent("notification_cancel","msg"+n),a.pFlags.mentioned&&(++s.unreadMentions,this.modifyCachedMentions(e,n,!1))),++s.count,s.msgs.add(n),a.deleted=!0;const i=a.grouped_id;if(i){const e=this.groupedMessagesStorage[i];e&&(e.delete(n),s.albums||(s.albums={}),(s.albums[i]||(s.albums[i]=new Set)).add(n),e.size||(delete s.albums,delete this.groupedMessagesStorage[i]))}t.delete(n)}if(s.albums)for(const e in s.albums)this.dispatchAlbumEdit(e,t,[...s.albums[e]]);return s}handleEditedMessage(e,t,a){var s;if("message"===e._){if(null===(s=e.media)||void 0===s?void 0:s.webpage){const t=this.appWebPagesManager.getMessageKeyForPendingWebPage(e.peerId,e.mid,!!e.pFlags.is_scheduled);this.appWebPagesManager.deleteWebPageFromPending(e.media.webpage,t)}const t=e.grouped_id;t&&this.dispatchAlbumEdit(t,a,[])}}dispatchAlbumEdit(e,t,a){const s=this.getMidsByAlbum(e).map((e=>this.getMessageFromStorage(t,e)));this.rootScope.dispatchEvent("album_edit",{peerId:s[0].peerId,groupId:e,deletedMids:a||[],messages:s})}getDialogUnreadCount(e){let t=e.unread_count;if(!this.dialogsStorage.isTopic(e)&&this.appPeersManager.isForum(e.peerId)){const a=this.dialogsStorage.getForumUnreadCount(e.peerId);t=a instanceof Promise?0:a.count}return t||+!!e.pFlags.unread_mark}isDialogUnread(e){return!!this.getDialogUnreadCount(e)}canForward(e){return"message"===(null==e?void 0:e._)&&!e.pFlags.noforwards&&!this.appPeersManager.noForwards(e.peerId)}pushBatchUpdate(e,t,a,s){let n=this.batchUpdates[e];n||(n=this.batchUpdates[e]={callback:t,batch:new Map}),n.batch.has(a)||(n.batch.set(a,s?s():void 0),this.batchUpdatesDebounced())}getMessagesFromMap(e){const t=new Map;for(const[a,s]of e){const[e,n]=a.split("_"),i=this.getMessageByPeer(e.toPeerId(),+n);i&&t.set(i,s)}return t}saveDefaultSendAs(e,t){return this.appProfileManager.getCachedFullChat(e.toChatId()).default_send_as=this.appPeersManager.getOutputPeer(t),this.apiManager.invokeApi("messages.saveDefaultSendAs",{peer:this.appPeersManager.getInputPeerById(e),send_as:this.appPeersManager.getInputPeerById(t)})}}var aa=a(6724);function sa(e){const t=e.replace("input","");return t[0].toLowerCase()+t.slice(1)}class na extends G{constructor(){super(...arguments),this.peerSettings={notifyPeer:{},notifyUsers:null,notifyChats:null,notifyBroadcasts:null,notifyForumTopic:{}},this.checkMuteUntil=()=>{void 0!==this.checkMuteUntilTimeout&&(clearTimeout(this.checkMuteUntilTimeout),this.checkMuteUntilTimeout=void 0);const e=(0,te.Z)(!0);let t=o.rU;const a=a=>{if(a instanceof Promise)return!1;const s=a.mute_until;return!!s&&(s<=e?(a.mute_until=0,!0):(s{for(const t in this.peerSettings[e]){const s=this.peerSettings[e][t];if(a(s)){const[e,a]=t.split("_"),n=this.appPeersManager.getOutputPeer(e.toPeerId());this.apiUpdatesManager.saveUpdate({_:"updateNotifySettings",peer:a?{_:"notifyForumTopic",peer:n,top_msg_id:+a}:{_:"notifyPeer",peer:n},notify_settings:s})}}}));const s=Math.min(18e5,1e3*(t-e));this.checkMuteUntilTimeout=E.Z.setTimeout(this.checkMuteUntil,s)}}after(){return this.checkMuteUntilThrottled=(0,aa.Z)(this.checkMuteUntil,1e3,!1),this.apiUpdatesManager.addMultipleEventsListeners({updateNotifySettings:e=>{const{peer:t}=e,a="notifyForumTopic"===t._,s="notifyPeer"===t._||a,n=s&&this.appPeersManager.getPeerId(t.peer),i=s?void 0:t._;this.savePeerSettings({key:i,peerId:n,threadId:a?(0,pe.Z)(t.top_msg_id):void 0,settings:e.notify_settings}),this.rootScope.dispatchEvent("notify_settings",e)}}),this.appStateManager.getState().then((e=>{if(e.notifySettings)for(const t in e.notifySettings)(0,ue.Z)(t),this.savePeerSettings({key:t,settings:e.notifySettings[t]})}))}getNotifySettings(e){let t,a=sa(e._),s=this.peerSettings[a];return"inputNotifyPeer"===e._&&(t=a=this.appPeersManager.getPeerId(e.peer),s=s[a]),s||((s||this.peerSettings)[a]=this.apiManager.invokeApi("account.getNotifySettings",{peer:e}).then((e=>(this.savePeerSettings({key:a,peerId:t,settings:e}),e))))}getNotifyPeerTypeSettings(){if(this.getNotifyPeerTypePromise)return this.getNotifyPeerTypePromise;const e=["inputNotifyBroadcasts","inputNotifyUsers","inputNotifyChats"].map((e=>this.getNotifySettings({_:e})));return this.getNotifyPeerTypePromise=Promise.all(e)}updateNotifySettings(e,t){return this.apiManager.invokeApi("account.updateNotifySettings",{peer:e,settings:t}).then((a=>{a&&this.apiUpdatesManager.processLocalUpdate({_:"updateNotifySettings",peer:Object.assign(Object.assign({},e),{_:sa(e._)}),notify_settings:Object.assign(Object.assign({},t),{_:"peerNotifySettings"})})}))}getContactSignUpNotification(){return this.notifyContactsSignUp?this.notifyContactsSignUp:this.notifyContactsSignUp=this.apiManager.invokeApi("account.getContactSignUpNotification")}setContactSignUpNotification(e){this.apiManager.invokeApi("account.setContactSignUpNotification",{silent:e}).then((t=>{this.notifyContactsSignUp=Promise.resolve(!e)}))}getPeerKey(e,t){return e+(t?"_"+t:"")}savePeerSettings({key:e,peerId:t,threadId:a,settings:s}){let n;t&&(e=this.getPeerKey(t,a),n=this.peerSettings[a?"notifyForumTopic":"notifyPeer"]),(n||this.peerSettings)[e]=s,t?this.checkMuteUntilThrottled():(this.rootScope.dispatchEvent("notify_peer_type_settings",{key:e,settings:s}),this.appStateManager.getState().then((t=>{const a=t.notifySettings;a[e]=s,this.appStateManager.pushToState("notifySettings",a)})))}isMuted(e){return"peerNotifySettings"===e._&&(e.silent||void 0!==e.mute_until&&1e3*e.mute_until>(0,te.Z)())}getPeerMuted(e){const t=this.getNotifySettings({_:"inputNotifyPeer",peer:this.appPeersManager.getInputPeerById(e)});return(t instanceof Promise?t:Promise.resolve(t)).then((e=>this.isMuted(e)))}getPeerLocalSettings({peerId:e,respectType:t=!0,threadId:a}){const s={_:"peerNotifySettings"},n=this.getPeerKey(e,a),i=this.peerSettings[a?"notifyForumTopic":"notifyPeer"][n];if(!i||i instanceof Promise||Object.assign(s,i),t){const t=sa(this.appPeersManager.getInputNotifyPeerById({peerId:e,ignorePeerId:!0,threadId:a})._),n=this.peerSettings[t];if(n&&!(n instanceof Promise))for(const e in n)void 0===s[e]&&(s[e]=n[e])}return s}validatePeerSettings(e){if(e.peerId!==this.appPeersManager.peerId)return e.threadId&&!this.appPeersManager.isForum(e.peerId)&&(e.threadId=void 0),e}isPeerLocalMuted(e){if(!(e=this.validatePeerSettings(e)))return!1;if(e.threadId){const t=this.getPeerLocalSettings(Object.assign(Object.assign({},e),{respectType:!1}));return void 0!==t.silent||void 0!==t.mute_until?this.isMuted(t):this.isPeerLocalMuted(Object.assign(Object.assign({},e),{threadId:void 0}))}const t=this.getPeerLocalSettings(e);return this.isMuted(t)}}var ia=a(677),ra=a(617),oa=a(7361),pa=a(7419),da=a(7256);class fa extends G{get peerId(){return this.appUsersManager.userId.toPeerId()}canPinMessage(e){return e.isUser()||this.appChatsManager.hasRights(e.toChatId(),"pin_messages")}getPeerPhoto(e){const t=this.getPeer(e);return(0,da.Z)(t)}getPeerMigratedTo(e){if(e.isUser())return!1;const t=this.appChatsManager.getChat(e.toChatId()),a=null==t?void 0:t.migrated_to;return!(!a||!t.pFlags.deactivated)&&(0,le.Z)(a)}getOutputPeer(e){if(e.isUser())return{_:"peerUser",user_id:e.toUserId()};const t=e.toChatId();return this.appChatsManager.isChannel(t)?{_:"peerChannel",channel_id:t}:{_:"peerChat",chat_id:t}}getPeerString(e){return e.isUser()?this.appUsersManager.getUserString(e.toUserId()):this.appChatsManager.getChatString(e.toChatId())}getPeerUsername(e){return this.getPeerActiveUsernames(e)[0]||""}getPeerActiveUsernames(e){const t=this.getPeer(e);return(0,Jt.Z)(t)}getPeer(e){return e.isUser()?this.appUsersManager.getUser(e.toUserId()):this.appChatsManager.getChat(e.toChatId())}getPeerId(e){return(0,le.Z)(e)||(0,fe.Z)(e)&&"inputPeerSelf"===e._&&this.peerId||o.NM}getDialogPeer(e){return{_:"dialogPeer",peer:this.getOutputPeer(e)}}isChannel(e){return!e.isUser()&&this.appChatsManager.isChannel(e.toChatId())}isMegagroup(e){return!e.isUser()&&this.appChatsManager.isMegagroup(e.toChatId())}isForum(e){return!e.isUser()&&this.appChatsManager.isForum(e.toChatId())}isAnyGroup(e){return!e.isUser()&&!this.appChatsManager.isBroadcast(e.toChatId())}isBroadcast(e){return this.isChannel(e)&&!this.isMegagroup(e)}isBot(e){return e.isUser()&&this.appUsersManager.isBot(e.toUserId())}isContact(e){return e.isUser()&&this.appUsersManager.isContact(e.toUserId())}isUser(e){return(0,ra.Z)(e)}isAnyChat(e){return(0,oa.Z)(e)}isPeerRestricted(e){return(0,pa.Z)(this.getPeer(e))}getRestrictionReasonText(e){const t=this.getPeer(e),a=t.restriction_reason?(0,ia.RP)(t.restriction_reason):void 0;return a?a.text:e.isUser()?"This user is restricted":"This chat is restricted"}getInputNotifyPeerById({peerId:e,ignorePeerId:t,threadId:a}){return t?e.isUser()?{_:"inputNotifyUsers"}:this.isBroadcast(e)?{_:"inputNotifyBroadcasts"}:{_:"inputNotifyChats"}:a?{_:"inputNotifyForumTopic",peer:this.getInputPeerById(e),top_msg_id:(0,oe.Z)(a)}:{_:"inputNotifyPeer",peer:this.getInputPeerById(e)}}getInputPeerById(e){if(!e)return{_:"inputPeerEmpty"};if(!e.isUser()){const t=e.toChatId();return this.appChatsManager.getInputPeer(t)}const t=e.toUserId();return this.appUsersManager.getUserInputPeer(t)}getInputPeerSelf(){return{_:"inputPeerSelf"}}getInputDialogPeerById(e){return{_:"inputDialogPeer",peer:(0,fe.Z)(e)?e:this.getInputPeerById(e)}}getPeerSearchText(e){let t;return t=this.isUser(e)?"%pu "+this.appUsersManager.getUserSearchText(e.toUserId()):"%pg "+(this.appChatsManager.getChat(e.toChatId()).title||""),t}getDialogType(e){return this.isMegagroup(e)?"megagroup":this.isChannel(e)?"channel":this.isUser(e)?e===this.peerId?"saved":"chat":"group"}getDeleteButtonText(e){switch(this.getDialogType(e)){case"channel":return this.appChatsManager.hasRights(e.toChatId(),"delete_chat")?"ChannelDelete":"ChatList.Context.LeaveChannel";case"megagroup":case"group":return this.appChatsManager.hasRights(e.toChatId(),"delete_chat")?"DeleteMega":"ChatList.Context.LeaveGroup";default:return"ChatList.Context.DeleteChat"}}noForwards(e){var t;return!e.isUser()&&!!(null===(t=this.appChatsManager.getChat(e.toChatId()).pFlags)||void 0===t?void 0:t.noforwards)}}class ca extends G{constructor(){super(...arguments),this.photos={}}savePhoto(e,t){var a;if(!e||"photoEmpty"===e._)return;const s=this.photos[e.id];if(e.file_reference&&(pt("file_reference",s,e),this.referenceDatabase.saveContext(e.file_reference,t)),null===(a=e.sizes)||void 0===a?void 0:a.length){e.sizes.sort(((e,t)=>(e.size||(e.sizes?1/0:0))-(t.size||(t.sizes?1/0:0))));const t=e.sizes[e.sizes.length-1];"photoSizeProgressive"===t._&&(t.size=t.sizes[t.sizes.length-1])}return s?Object.assign(s,e):this.photos[e.id]=e}getUserPhotos(e,t="0",a=20){const s=this.appUsersManager.getUserInput(e);return this.apiManager.invokeApiCacheable("photos.getUserPhotos",{user_id:s,offset:0,limit:a,max_id:t},{cacheSeconds:60}).then((a=>{this.appUsersManager.saveApiUsers(a.users);const s=a.photos.map(((t,s)=>(a.photos[s]=this.savePhoto(t,{type:"profilePhoto",peerId:e.toPeerId()}),t.id)));if("0"!==t&&t){const e=s.indexOf(t);-1!==e&&s.splice(e,1)}return{count:a.count||s.length,photos:s}}))}getPhoto(e){return(0,fe.Z)(e)?e:this.photos[e]}}class la extends G{constructor(){super(...arguments),this.polls={},this.results={},this.pollToMessages={},this.log=(0,I.kg)("POLLS",I.v9.Error)}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateMessagePoll:e=>{this.log("updateMessagePoll:",e);let t=e.poll||this.polls[e.poll_id];if(!t)return;let a=e.results;const s=this.savePoll(t,a);t=s.poll,a=s.results,this.rootScope.dispatchEvent("poll_update",{poll:t,results:a})}})}savePoll(e,t,a){a&&this.updatePollToMessage(a,!0);const s=e.id;return this.polls[s]?(e=Object.assign(this.polls[s],e),t=this.saveResults(e,t)):(this.polls[s]=e,e.chosenIndexes=[],t=this.saveResults(e,t)),{poll:e,results:t}}saveResults(e,t){var a;return this.results[e.id]?t=Object.assign(this.results[e.id],t):this.results[e.id]=t,t.pFlags.min||(e.chosenIndexes.length=0,(null===(a=null==t?void 0:t.results)||void 0===a?void 0:a.length)&&t.results.forEach(((t,a)=>{var s;(null===(s=t.pFlags)||void 0===s?void 0:s.chosen)&&e.chosenIndexes.push(a)}))),t}getPoll(e){return{poll:this.polls[e],results:this.results[e]}}getInputMediaPoll(e,t,a,s){return a?(s||(s=[]),a=(0,ke.Z)(a,s)):a=void 0,{_:"inputMediaPoll",poll:e,correct_answers:t,solution:a,solution_entities:a?s:void 0}}updatePollToMessage(e,t){const{id:a}=e.media.poll;let s=this.pollToMessages[a];if(!t&&!s)return;s||(s=this.pollToMessages[a]=new Set);const n=e.peerId+"_"+e.mid;t?s.add(n):s.delete(n),t||s.size||(delete this.polls[a],delete this.results[a],delete this.pollToMessages[a])}sendVote(e,t){const a=e.media.poll,s=t.map((e=>a.answers[e].option)),n=e.mid,i=e.peerId,r=this.appPeersManager.getInputPeerById(i);return e.pFlags.is_outgoing?this.appMessagesManager.invokeAfterMessageIsSent(n,"sendVote",(e=>(this.log("invoke sendVote callback"),this.sendVote(e,t)))):this.apiManager.invokeApi("messages.sendVote",{peer:r,msg_id:(0,oe.Z)(e.mid),options:s}).then((e=>{this.log("sendVote updates:",e),this.apiUpdatesManager.processUpdateMessage(e)}))}getResults(e){const t=this.appPeersManager.getInputPeerById(e.peerId);return this.apiManager.invokeApi("messages.getPollResults",{peer:t,msg_id:(0,oe.Z)(e.mid)}).then((e=>{this.apiUpdatesManager.processUpdateMessage(e),this.log("getResults updates:",e)}))}getVotes(e,t,a,s=20){return this.apiManager.invokeApi("messages.getPollVotes",{peer:this.appPeersManager.getInputPeerById(e.peerId),id:(0,oe.Z)(e.mid),option:t,offset:a,limit:s}).then((e=>(this.log("getPollVotes messages:",e),this.appUsersManager.saveApiUsers(e.users),e)))}stopPoll(e){const t=e.media.poll;if(t.pFlags.closed)return Promise.resolve();const a=(0,ve.Z)(t);return a.pFlags.closed=!0,this.appMessagesManager.editMessage(e,void 0,{newMedia:this.getInputMediaPoll(a)}).then((()=>{}),(e=>{this.log.error("stopPoll error:",e)}))}}class ma extends G{constructor(){super(...arguments),this.privacy={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updatePrivacy:e=>{const t=e.key._;this.privacy[t]=e.rules,this.rootScope.dispatchEvent("privacy_update",e)}})}setPrivacy(e,t){return this.apiManager.invokeApi("account.setPrivacy",{key:{_:e},rules:t}).then((a=>(this.appUsersManager.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),this.apiUpdatesManager.processLocalUpdate({_:"updatePrivacy",key:{_:sa(e)},rules:t.map((e=>{const t={};return Object.assign(t,e),t._=sa(t._),t}))}),a.rules)))}getPrivacy(e){const t=sa(e),a=this.privacy[t];return a?Promise.resolve(a):this.privacy[t]=this.apiManager.invokeApi("account.getPrivacy",{key:{_:e}}).then((e=>(this.appUsersManager.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.privacy[t]=e.rules)))}getGlobalPrivacySettings(){return this.apiManager.invokeApi("account.getGlobalPrivacySettings")}setGlobalPrivacySettings(e){return this.apiManager.invokeApi("account.setGlobalPrivacySettings",{settings:e})}}var ga=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const ha=18e4;class ua extends G{constructor(){super(...arguments),this.usersFull={},this.chatsFull={},this.fullExpiration={},this.onUpdateUserTyping=e=>{var t,a;const s=e.user_id?e.user_id.toPeerId():this.appPeersManager.getPeerId(e.from_id);if(this.appPeersManager.peerId===s||"speakingInGroupCallAction"===e.action._)return;const n=e.top_msg_id,i=n?(0,pe.Z)(n):void 0,r=this.appPeersManager.getPeerId(e),o=this.getTypingsKey(r,i),p=null!==(t=(a=this.typingsInPeer)[o])&&void 0!==t?t:a[o]=[];let d=p.find((e=>e.userId===s));const f=()=>{delete d.timeout;const e=p.indexOf(d);-1!==e&&p.splice(e,1),this.rootScope.dispatchEvent("peer_typings",{peerId:r,threadId:i,typings:p}),p.length||delete this.typingsInPeer[o]};if(void 0!==(null==d?void 0:d.timeout)&&clearTimeout(d.timeout),"sendMessageCancelAction"===e.action._){if(!d)return;return void f()}d||(d={userId:s},p.push(d)),d.action=e.action;const c=this.appUsersManager.hasUser(s);c?this.appUsersManager.forceUserOnline(s):"updateChatUserTyping"===e._&&e.chat_id&&this.appChatsManager.hasChat(e.chat_id)&&!this.appChatsManager.isChannel(e.chat_id)&&Promise.resolve(this.getChatFull(e.chat_id)).then((()=>{void 0!==d.timeout&&this.appUsersManager.hasUser(s)&&this.rootScope.dispatchEvent("peer_typings",{peerId:r,threadId:i,typings:p})})),d.timeout=E.Z.setTimeout(f,6e3),c&&this.rootScope.dispatchEvent("peer_typings",{peerId:r,threadId:i,typings:p})},this.onUpdatePeerBlocked=e=>{const t=this.appPeersManager.getPeerId(e.peer_id);if(this.appPeersManager.isUser(t)){const a=t.toUserId(),s=this.usersFull[a];s&&(e.blocked?s.pFlags.blocked=!0:delete s.pFlags.blocked),this.rootScope.dispatchEvent("user_full_update",a)}this.rootScope.dispatchEvent("peer_block",{peerId:t,blocked:e.blocked})}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateChatParticipants:e=>{const t=e.participants;if("chatParticipants"===t._){const e=t.chat_id,a=this.chatsFull[e];void 0!==a&&(a.participants=t,this.rootScope.dispatchEvent("chat_full_update",e))}},updateChatParticipantAdd:e=>{const t=this.chatsFull[e.chat_id];if(void 0!==t){const a=t.participants,s=a.participants||[];for(let t=0,a=s.length;t{const t=this.chatsFull[e.chat_id];if(void 0!==t){const a=t.participants,s=a.participants||[];for(let t=0,n=s.length;t{var t,a;const s=this.chatsFull[e],n=this.appChatsManager.getChat(e);if(!s||!n)return;let i=!1;!!s.call!=!!(null===(t=n.pFlags)||void 0===t?void 0:t.call_active)&&(i=!0);const{photo:r}=n;if(r){const e="chatPhotoEmpty"!==r._;(e!==!(!s.chat_photo||"photoEmpty"===s.chat_photo._)||e&&r.photo_id!==(null===(a=s.chat_photo)||void 0===a?void 0:a.id))&&(i=!0)}i&&this.refreshFullPeer(e.toPeerId(!0))})),this.rootScope.addEventListener("channel_update",(e=>{this.refreshFullPeer(e.toPeerId(!0))})),this.rootScope.addEventListener("chat_full_update",(e=>{this.rootScope.dispatchEvent("peer_full_update",e.toPeerId(!0))})),this.rootScope.addEventListener("user_full_update",(e=>{this.rootScope.dispatchEvent("peer_full_update",e.toPeerId(!1))})),this.rootScope.addEventListener("invalidate_participants",(e=>{this.invalidateChannelParticipants(e)})),this.typingsInPeer={}}getProfile(e,t){return this.usersFull[e]&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const a=t.full_user,s=e.toPeerId(!1);a.profile_photo&&(a.profile_photo=this.appPhotosManager.savePhoto(a.profile_photo,{type:"profilePhoto",peerId:s}));const n=a.bot_info;if(n){const t={type:"userFull",userId:e};n.description_document=this.appDocsManager.saveDoc(n.description_document,t),n.description_photo=this.appPhotosManager.savePhoto(n.description_photo,t)}return this.appNotificationsManager.savePeerSettings({peerId:s,settings:a.notify_settings}),this.usersFull[e]=a,this.fullExpiration[s]=Date.now()+ha,this.rootScope.dispatchEvent("user_full_update",e),a}})}getProfileByPeerId(e,t){return this.appPeersManager.isAnyChat(e)?this.getChatFull(e.toChatId(),t):this.getProfile(e.toUserId(),t)}getCachedFullChat(e){return this.chatsFull[e]}getCachedFullUser(e){return this.usersFull[e]}getCachedProfileByPeerId(e){return e.isUser()?this.getCachedFullUser(e.toUserId()):this.getCachedFullChat(e.toChatId())}getFullPhoto(e){return ga(this,void 0,void 0,(function*(){const t=yield this.getProfileByPeerId(e);switch(t._){case"userFull":return t.profile_photo;case"channelFull":case"chatFull":return t.chat_photo}}))}getChatFull(e,t){if(this.appChatsManager.isChannel(e))return this.getChannelFull(e,t);const a=e.toPeerId(!0),s=this.chatsFull[e];if(s&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const s=t.full_chat;return s&&s.chat_photo&&s.chat_photo.id&&(s.chat_photo=this.appPhotosManager.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:a})),s.call&&this.appGroupCallsManager.saveGroupCall(s.call,e),this.appNotificationsManager.savePeerSettings({peerId:a,settings:s.notify_settings}),this.chatsFull[e]=s,this.fullExpiration[a]=Date.now()+ha,this.rootScope.dispatchEvent("chat_full_update",e),s}})}getChatInviteLink(e,t){return ga(this,void 0,void 0,(function*(){const a=yield this.getChatFull(e);return!t&&a.exported_invite&&"chatInviteExported"==a.exported_invite._?a.exported_invite.link:this.apiManager.invokeApi("messages.exportChatInvite",{peer:this.appPeersManager.getInputPeerById(e.toPeerId(!0))}).then((t=>(void 0!==this.chatsFull[e]&&(this.chatsFull[e].exported_invite=t),t.link)))}))}getChannelParticipants(e,t={_:"channelParticipantsRecent"},a=200,s=0){if("channelParticipantsRecent"===t._){const t=this.appChatsManager.getChat(e);if((null==t?void 0:t.pFlags)&&t.pFlags.broadcast&&!t.pFlags.creator&&!t.admin_rights)return Promise.reject()}return this.apiManager.invokeApiCacheable("channels.getParticipants",{channel:this.appChatsManager.getChannelInput(e),filter:t,offset:s,limit:a,hash:"0"},{cacheSeconds:60}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}getChannelParticipant(e,t){return this.apiManager.invokeApiSingle("channels.getParticipant",{channel:this.appChatsManager.getChannelInput(e),participant:this.appPeersManager.getInputPeerById(t)}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e.participant)))}getChannelFull(e,t){const a=e.toPeerId(!0);return void 0!==this.chatsFull[e]&&!t&&Date.now(){this.appChatsManager.saveApiChats(t.chats,!0),this.appUsersManager.saveApiUsers(t.users);const s=t.full_chat;return s&&s.chat_photo.id&&(s.chat_photo=this.appPhotosManager.savePhoto(s.chat_photo,{type:"profilePhoto",peerId:a})),s.call&&this.appGroupCallsManager.saveGroupCall(s.call,e),this.appNotificationsManager.savePeerSettings({peerId:a,settings:s.notify_settings}),this.chatsFull[e]=s,this.fullExpiration[a]=Date.now()+ha,this.rootScope.dispatchEvent("chat_full_update",e),s},processError:t=>{if("CHANNEL_PRIVATE"===t.type){const t=this.appChatsManager.getChat(e);this.apiUpdatesManager.processUpdateMessage({_:"updates",updates:[{_:"updateChannel",channel_id:e}],chats:["channelForbidden"===t._?t:{_:"channelForbidden",id:e,access_hash:t.access_hash,title:t.title,pFlags:t.pFlags}],users:[]})}throw t}})}getMentions(e,t,a){const s=e=>{"@"===t.charAt(0)&&(t=t.slice(1));const a=new ae.Z({ignoreCase:!0}),s=new Map;e.forEach((e=>{a.indexObject(e.id,this.appUsersManager.getUserSearchText(e.id)),s.set(e.id,e.rating)}));const n=Array.from(a.search(t));return n.sort(((e,t)=>s.get(t)-s.get(e))),n};let n;return n=this.appChatsManager.isChannel(e)?this.getChannelParticipants(e,{_:"channelParticipantsMentions",q:t,top_msg_id:(0,oe.Z)(a)},50,0).then((e=>e.participants.map((e=>(0,xe.Z)(e))))):e?Promise.resolve(this.getChatFull(e)).then((e=>e.participants.participants.map((e=>e.user_id.toPeerId())))):Promise.resolve([]),Promise.all([this.appUsersManager.getTopPeers("bots_inline").catch((()=>[])),n]).then((e=>{const t=e[0].concat(e[1].map((e=>({id:e,rating:0}))));return s(t)}))}invalidateChannelParticipants(e){this.apiManager.clearCache("channels.getParticipants",(t=>t.channel.channel_id===e)),this.refreshFullPeer(e.toPeerId(!0))}refreshFullPeer(e){if(e.isUser()){const t=e.toUserId();delete this.usersFull[t],this.rootScope.dispatchEvent("user_full_update",t)}else{const t=e.toChatId();delete this.chatsFull[t],this.rootScope.dispatchEvent("chat_full_update",t)}}updateProfile(e,t,a){return this.apiManager.invokeApi("account.updateProfile",{first_name:e,last_name:t,about:a}).then((e=>{if(this.appUsersManager.saveApiUser(e),void 0!==a){const t=e.id.toPeerId(),s=this.usersFull[e.id];s&&(s.about=a),this.rootScope.dispatchEvent("peer_bio_edit",t)}return this.getProfile(e.id,!0)}))}uploadProfilePhoto(e){return this.apiManager.invokeApi("photos.uploadProfilePhoto",{file:e}).then((e=>{const t=e.photo;if(!e.users.length){const a=t.sizes.find((e=>"photoStrippedSize"===e._));e.users.push(Object.assign(Object.assign({},this.appUsersManager.getSelf()),{photo:{_:"userProfilePhoto",dc_id:t.dc_id,photo_id:t.id,stripped_thumb:null==a?void 0:a.bytes,pFlags:{}}}))}this.appUsersManager.saveApiUsers(e.users);const a=this.appPeersManager.peerId;this.appPhotosManager.savePhoto(e.photo,{type:"profilePhoto",peerId:a});const s=a.toUserId();this.apiUpdatesManager.processLocalUpdate({_:"updateUser",user_id:s})}))}deletePhotos(e){return this.apiManager.invokeApiSingle("photos.deletePhotos",{id:e.map((e=>Ct(this.appPhotosManager.getPhoto(e))))}).then((e=>{}))}verifyParticipantForOnlineCount(e){const t=this.appUsersManager.getUser(e.user_id);return!(!t||!t.status||"userStatusOnline"!==t.status._)}reduceParticipantsForOnlineCount(e){return e.reduce(((e,t)=>e+ +this.verifyParticipantForOnlineCount(t)),0)}getOnlines(e){var t;return ga(this,void 0,void 0,(function*(){if(this.appChatsManager.isBroadcast(e))return 1;const a=yield this.getChatFull(e);if(this.appChatsManager.isMegagroup(e)){if(a.participants_count<=100){const t=yield this.getChannelParticipants(e,{_:"channelParticipantsRecent"},100);return this.reduceParticipantsForOnlineCount(t.participants)}const s=yield this.apiManager.invokeApiCacheable("messages.getOnlines",{peer:this.appChatsManager.getChannelInputPeer(e)},{cacheSeconds:60});return null!==(t=s.onlines)&&void 0!==t?t:1}const s=a.participants;return(null==s?void 0:s.participants)?this.reduceParticipantsForOnlineCount(s.participants):1}))}getTypingsKey(e,t){return e+(t?`_${t}`:"")}getPeerTypings(e,t){return this.typingsInPeer[this.getTypingsKey(e,t)]}}function ya(e,t){return e.some((e=>e instanceof Promise))?Promise.all(e).then(t):t(e)}var _a=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const va=["static_icon","appear_animation","select_animation","activate_animation","effect_animation","around_animation","center_icon"],Pa={type:"reactions"};class ba extends G{after(){this.rootScope.addEventListener("language_change",(()=>{this.availableReactions=void 0,this.getAvailableReactions()})),this.sendReactionPromises=new Map,this.lastSendingTimes=new Map,this.rootScope.addEventListener("user_auth",(()=>{setTimeout((()=>{Promise.resolve(this.getAvailableReactions()).then((e=>_a(this,void 0,void 0,(function*(){for(const t of e)yield Promise.all([t.around_animation&&this.apiFileManager.downloadMedia({media:t.around_animation}),t.static_icon&&this.apiFileManager.downloadMedia({media:t.static_icon}),t.appear_animation&&this.apiFileManager.downloadMedia({media:t.appear_animation}),t.center_icon&&this.apiFileManager.downloadMedia({media:t.center_icon})]),yield(0,P.Z)(1e3)}))))}),7500)}))}getAvailableReactions(){return this.availableReactions?this.availableReactions:this.apiManager.invokeApiSingleProcess({method:"messages.getAvailableReactions",processResult:e=>{(0,ue.Z)(e);const t=this.availableReactions=e.reactions;for(const e of t)for(const t of va)e[t]&&(e[t]=this.appDocsManager.saveDoc(e[t],Pa));return t},params:{hash:0}})}getActiveAvailableReactions(){return(0,q.Z)(this.getAvailableReactions(),(e=>e.filter((e=>!e.pFlags.inactive))))}getAvailableReactionsForPeer(e){const t=this.getActiveAvailableReactions();return e.isUser()?this.unshiftQuickReaction(t):ya([t,this.appProfileManager.getChatFull(e.toChatId()),this.getQuickReaction()],(([e,t,a])=>{var s;const n=null!==(s=t.available_reactions)&&void 0!==s?s:{_:"chatReactionsNone"};let i=[];return"chatReactionsAll"===n._?i=e:"chatReactionsSome"===n._&&(i=n.reactions.map((t=>e.find((e=>e.reaction===t.emoticon)))).filter(Boolean)),this.unshiftQuickReactionInner(i,a)}))}unshiftQuickReactionInner(e,t){if(t&&"reactionEmoji"!==t._&&"availableReaction"!==t._)return e;const a=t.emoticon||t.reaction,s=(0,Pe.Z)(e,(e=>e.reaction===a));return s&&e.unshift(s),e}unshiftQuickReaction(e,t=this.getQuickReaction()){return ya([e,t],(([e,t])=>this.unshiftQuickReactionInner(e,t)))}getAvailableReactionsByMessage(e){var t;if(!e)return[];const a=(null===(t=e.fwd_from)||void 0===t?void 0:t.channel_post)&&this.appPeersManager.isMegagroup(e.peerId)&&e.fwdFromId||e.peerId;return this.getAvailableReactionsForPeer(a)}isReactionActive(e){return!!this.availableReactions&&!!this.availableReactions.find((t=>t.reaction===e))}getQuickReaction(){return ya([this.apiManager.getConfig(),this.getAvailableReactions()],(([e,t])=>{const a=e.reactions_default;return"reactionEmoji"===(null==a?void 0:a._)?t.find((e=>e.reaction===a.emoticon)):a}))}getReactionCached(e){return this.availableReactions.find((t=>t.reaction===e))}getReaction(e){return(0,q.Z)(this.getAvailableReactions(),(()=>this.getReactionCached(e)))}getMessagesReactions(e,t){return this.apiManager.invokeApiSingleProcess({method:"messages.getMessagesReactions",params:{id:t.map((e=>(0,oe.Z)(e))),peer:this.appPeersManager.getInputPeerById(e)},processResult:e=>{this.apiUpdatesManager.processUpdateMessage(e)}})}getMessageReactionsList(e,t,a,s,n){return this.apiManager.invokeApiSingleProcess({method:"messages.getMessageReactionsList",params:{peer:this.appPeersManager.getInputPeerById(e),id:(0,oe.Z)(t),limit:a,reaction:s,offset:n},processResult:e=>(this.appUsersManager.saveApiUsers(e.users),e)})}setDefaultReaction(e){return this.apiManager.invokeApi("messages.setDefaultReaction",{reaction:e}).then((t=>_a(this,void 0,void 0,(function*(){if(t){const t=yield this.apiManager.getConfig();t&&(t.reactions_default=e),this.rootScope.dispatchEvent("quick_reaction",e)}return t}))))}sendReaction(e,t,a){var s,n;return _a(this,void 0,void 0,(function*(){"availableReaction"===t._&&(t={_:"reactionEmoji",emoticon:t.reaction});const i=yield this.apiManager.getLimit("reactions"),r=e.peerId+"_"+e.mid;if(this.lastSendingTimes.get(r))return;this.lastSendingTimes.set(r,Date.now()),setTimeout((()=>{this.lastSendingTimes.delete(r)}),333);const{peerId:o,mid:p}=e,d=this.appPeersManager.peerId,f=e=>{--e.count,delete e.chosen_order,(0,Kt.Z)(t,e.reaction)&&(t=void 0),e.count||(0,M.Z)(l.results,e),l.recent_reactions&&(0,Pe.Z)(l.recent_reactions,(t=>(0,Kt.Z)(t.reaction,e.reaction)&&this.appPeersManager.getPeerId(t.peer_id)===d)),l.results.length||(l=void 0)},c=(null===(n=null===(s=e.reactions)||void 0===s?void 0:s.pFlags)||void 0===n?void 0:n.can_see_list)||!this.appPeersManager.isBroadcast(e.peerId)||e.peerId.isUser();e.reactions||(e.reactions={_:"messageReactions",results:[],recent_reactions:c?[]:void 0,pFlags:{can_see_list:c||void 0}});let l=a?e.reactions:(0,ve.Z)(e.reactions);const m=l.results.filter((e=>void 0!==e.chosen_order));m.sort(((e,t)=>t.chosen_order-e.chosen_order));const g=[],h=m.findIndex((e=>(0,Kt.Z)(e.reaction,t)));-1!==h&&g.push(...m.splice(h,1)),g.push(...m.splice(i-+(-1===h))),g.forEach((e=>{m.forEach((t=>{t.chosen_order>e.chosen_order&&--t.chosen_order})),f(e)}));const u=m.length;if(m.forEach(((e,t)=>{e.chosen_order=u-1-t})),t){l||(l={_:"messageReactions",results:[],pFlags:{}},c&&(l.pFlags.can_see_list=!0));let e=l.results.findIndex((e=>(0,Kt.Z)(e.reaction,t))),a=-1!==e&&l.results[e];if(a||(a={_:"reactionCount",count:0,reaction:t},e=l.results.push(a)-1),++a.count,a.chosen_order=m.length?m[0].chosen_order+1:0,m.unshift(a),!l.recent_reactions&&c&&(l.recent_reactions=[]),l.recent_reactions){const e={_:"messagePeerReaction",reaction:t,peer_id:this.appPeersManager.getOutputPeer(d)};this.appPeersManager.isMegagroup(o),l.recent_reactions.unshift(e),l.recent_reactions=l.recent_reactions.slice(0,3)}}const y=this.availableReactions;if(l&&(null==y?void 0:y.length)){const e=new Map;y.forEach(((t,a)=>{e.set(t.reaction,a)})),l.results.sort(((t,a)=>{var s,n;const i=t.reaction.document_id||t.reaction.emoticon,r=a.reaction.document_id||a.reaction.emoticon;return a.count-t.count||(null!==(s=e.get(i))&&void 0!==s?s:0)-(null!==(n=e.get(r))&&void 0!==n?n:0)}))}if(a)return e.reactions=l,this.rootScope.dispatchEvent("messages_reactions",[{message:e,changedResults:[]}]),Promise.resolve();this.apiUpdatesManager.processLocalUpdate({_:"updateMessageReactions",peer:e.peer_id,msg_id:e.id,reactions:l,local:!0});const _=[o,p].join("-"),v=(0,oe.Z)(p),P=this.apiManager.invokeApi("messages.sendReaction",{peer:this.appPeersManager.getInputPeerById(o),msg_id:v,reaction:m.map((e=>e.reaction))}).then((e=>{(0,ue.Z)(e);const t=e.updates.findIndex((e=>"updateEditMessage"===e._||"updateEditChannelMessage"===e._));if(-1!==t){const a=e.updates[t];e.updates[t]={_:"updateMessageReactions",msg_id:v,peer:this.appPeersManager.getOutputPeer(o),reactions:a.message.reactions,pts:a.pts,pts_count:a.pts_count}}this.apiUpdatesManager.processUpdateMessage(e)})).catch((t=>{var a;"REACTION_INVALID"===t.type&&this.sendReactionPromises.get(_)===P&&this.sendReaction(e,null===(a=m[0])||void 0===a?void 0:a.reaction,!0)})).finally((()=>{this.sendReactionPromises.get(_)===P&&this.sendReactionPromises.delete(_)}));return this.sendReactionPromises.set(_,P),P}))}}var Ma=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Ia={EMOJI:"inputStickerSetAnimatedEmoji",EMOJI_ANIMATIONS:"inputStickerSetAnimatedEmojiAnimations",PREMIUM_GIFTS:"inputStickerSetPremiumGifts",GENERIC_ANIMATIONS:"inputStickerSetEmojiGenericAnimations",DEFAULT_STATUSES:"inputStickerSetEmojiDefaultStatuses",DEFAULT_TOPIC_ICONS:"inputStickerSetEmojiDefaultTopicIcons"},Sa=new Set(Object.values(Ia));class Ca extends G{constructor(){super(...arguments),this.storage=new W.Z(H.Z,"stickerSets"),this.processAllStickersResult=e=>((0,ue.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e)}after(){this.getStickerSetPromises={},this.getStickersByEmoticonsPromises={},this.sounds={},this.names={},this.rootScope.addEventListener("user_auth",(()=>{setTimeout((()=>{this.getAnimatedEmojiStickerSet()}),1e3),this.getGreetingStickersPromise||void 0!==this.getGreetingStickersTimeout||(this.getGreetingStickersTimeout=E.Z.setTimeout((()=>{this.getGreetingStickersTimeout=void 0,this.getGreetingSticker(!0)}),5e3))})),this.rootScope.addEventListener("app_config",(()=>this.onStickersUpdated("faved",!0))),this.apiUpdatesManager.addMultipleEventsListeners({updateNewStickerSet:e=>{const t=e.stickerset;this.saveStickerSet(t,t.set.id),this.rootScope.dispatchEvent("stickers_installed",t.set)},updateRecentStickers:()=>this.onStickersUpdated("recent",!0),updateFavedStickers:()=>this.onStickersUpdated("faved",!0),updateMoveStickerSetToTop:e=>{this.rootScope.dispatchEvent("stickers_top",e.stickerset)}})}onStickersUpdated(e,t){return Ma(this,void 0,void 0,(function*(){const a=yield"faved"===e?this.getFavedStickersStickers(t):this.getRecentStickersStickers(t);this.rootScope.dispatchEvent("stickers_updated",{type:e,stickers:a})}))}getGreetingSticker(e=!1){return this.getGreetingStickersTimeout&&(clearTimeout(this.getGreetingStickersTimeout),this.getGreetingStickersTimeout=void 0),this.getGreetingStickersPromise||(this.getGreetingStickersPromise=this.getStickersByEmoticon("👋⭐️",!1).then((e=>{if(!e.length)throw"NO_STICKERS";this.greetingStickers=e.slice(),this.greetingStickers.sort(((e,t)=>Math.random()-Math.random()))}))),this.getGreetingStickersPromise.then((()=>{let t;return e||(t=this.greetingStickers.shift(),this.greetingStickers.push(t)),this.apiFileManager.downloadMedia({media:this.greetingStickers[0]}),t}))}saveStickers(e){(0,ne.Z)(e,((t,a)=>{(t=this.appDocsManager.saveDoc(t))?e[a]=t:e.splice(a,1)}))}canUseStickerSetCache(e,t){var a;return e&&(null===(a=e.documents)||void 0===a?void 0:a.length)&&(Date.now()-e.refreshTime<36e5||t)}getStickerSet(e,t={}){let{id:a}=e;if(e.access_hash||(e=this.names[a]||e,a=e.id),this.getStickerSetPromises[a])return this.getStickerSetPromises[a];if(!t.overwrite){const e=this.storage.getFromCache(a);if(this.canUseStickerSetCache(e,t.useCache))return e}const s=this.getStickerSetPromises[a]=new Promise((n=>Ma(this,void 0,void 0,(function*(){if(!t.overwrite){const e=yield this.storage.get(a);if(this.canUseStickerSetCache(e,t.useCache))return this.saveStickers(e.documents),n(e),void(this.getStickerSetPromises[a]===s&&delete this.getStickerSetPromises[a])}try{const s=yield this.apiManager.invokeApi("messages.getStickerSet",{stickerset:this.getStickerSetInput(e),hash:0}),i=t.saveById?a:s.set.id;this.saveStickerSet(s,i),n(s)}catch(e){n(null)}this.getStickerSetPromises[a]===s&&delete this.getStickerSetPromises[a]}))));return s}getLocalStickerSet(e){return this.getStickerSet({id:e},{saveById:!0})}getAnimatedEmojiStickerSet(){return Promise.all([this.getLocalStickerSet(Ia.EMOJI),this.getLocalStickerSet(Ia.EMOJI_ANIMATIONS),this.getAnimatedEmojiSounds()]).then((([e,t])=>({emoji:e,animations:t})))}getAnimatedEmojiSounds(e){if(this.getAnimatedEmojiSoundsPromise&&!e)return this.getAnimatedEmojiSoundsPromise;const t=this.getAnimatedEmojiSoundsPromise=Promise.all([this.apiManager.getAppConfig(e),this.apiManager.getConfig()]).then((([e,a])=>{if(this.getAnimatedEmojiSoundsPromise===t)for(const t in e.emojies_sounds){const s=e.emojies_sounds[t],n=atob(s.file_reference_base64.replace(/-/g,"+").replace(/_/g,"/")),i=new Uint8Array(n.length);for(let e=0,t=i.length;e((0,ue.Z)(e),this.recentStickers=e.stickers,this.saveStickers(e.stickers),e),overwrite:e})}))}getRecentStickersStickers(e){if(e)this.recentStickers=void 0;else if(this.recentStickers)return this.recentStickers;return this.getRecentStickers(e).then((()=>this.recentStickers))}saveRecentSticker(e,t,a){const s=this.appDocsManager.getDoc(e);if((0,Pe.Z)(this.recentStickers,(t=>t.id===e)),!t){this.recentStickers.unshift(s);const e=(0,Pt.Z)(s.stickerEmojiRaw);for(const t in this.getStickersByEmoticonsPromises)this.getStickersByEmoticonsPromises[t].then((a=>{const n=(0,Pe.Z)(a,(e=>e.id===s.id));n?a.unshift(n):t.includes(e)&&a.unshift(s)}))}return this.rootScope.dispatchEvent("sticker_updated",{type:"recent",faved:!t,document:s}),t&&this.onStickersUpdated("recent",!1),this.apiManager.invokeApi("messages.saveRecentSticker",{id:zt(s),unsave:t,attached:a})}cleanEmoji(e){return e.replace(/\ufe0f/g,"").replace(/🏻|🏼|🏽|🏾|🏿/g,"")}getAnimatedEmojiSticker(e,t){const a=t?Ia.EMOJI_ANIMATIONS:Ia.EMOJI,s=this.storage.getFromCache(a);if(!(null==s?void 0:s.documents))return;t&&["🧡","💛","💚","💙","💜","🖤","🤍","🤎"].includes(e)&&(e="❤️"),e=this.cleanEmoji(e);const n=s.packs.find((t=>t.emoticon===e));return n?this.appDocsManager.getDoc(n.documents[0]):void 0}getAnimatedEmojiSoundDocument(e){return this.sounds[this.cleanEmoji(e)]}preloadAnimatedEmojiSticker(e){const t=this.getAnimatedEmojiStickerSet().then((()=>this.getAnimatedEmojiSticker(e)));return Promise.all([t,this.preloadAnimatedEmojiStickerAnimation(e)]).then((([e,t])=>({doc:e,animation:null==t?void 0:t.doc,sound:null==t?void 0:t.sound})))}preloadAnimatedEmojiStickerAnimation(e){return this.getAnimatedEmojiStickerSet().then((()=>this.getAnimatedEmojiSticker(e,!0))).then((t=>{if(!t)return;const a=this.getAnimatedEmojiSoundDocument(e);return Promise.all([this.preloadSticker(t.id),a?this.preloadSticker(a.id):void 0]).then((()=>({doc:t,sound:a})))}))}preloadSticker(e,t){var a;const s=this.appDocsManager.getDoc(e);return this.apiFileManager.downloadMedia({media:s,thumb:t?null===(a=s.video_thumbs)||void 0===a?void 0:a[0]:void 0})}saveStickerSet(e,t){const a={_:"messages.stickerSet",set:e.set,packs:e.packs,documents:e.documents,keywords:e.keywords};let s=this.storage.getFromCache(t);s?Object.assign(s,a):s=this.storage.setToCache(t,a),s.set.short_name&&(this.names[s.set.short_name]=this.getStickerSetInput(a.set)),this.saveStickers(e.documents);const n=s.set.installed_date||Sa.has(t);s.refreshTime=Date.now(),this.storage.set({[t]:s},!n)}getStickerSetThumbDownloadOptions(e){var t;const a=e.thumbs.find((e=>"photoSize"===e._)),s=e.thumb_dc_id,n=null===(t=e.pFlags)||void 0===t?void 0:t.animated;return{dcId:s,location:{_:"inputStickerSetThumb",stickerset:this.getStickerSetInput(e),thumb_version:e.thumb_version},size:a.size,mimeType:n?"application/x-tgsticker":"image/webp"}}getStickerSetInput(e){return Sa.has(e.id)?{_:e.id}:e.access_hash?{_:"inputStickerSetID",id:e.id,access_hash:e.access_hash}:{_:"inputStickerSetShortName",short_name:""+e.id}}getFeaturedStickers(){return Ma(this,void 0,void 0,(function*(){return(yield this.apiManager.invokeApiHashable({method:"messages.getFeaturedStickers",processResult:e=>((0,ue.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.set.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e.sets.forEach((e=>{this.saveStickerSet({set:e.set,documents:[],packs:[],keywords:[]},e.set.id)})),e)})).sets}))}getPromoPremiumStickers(){return this.getStickersByEmoticon("⭐️⭐️",!1)}getPremiumStickers(){return this.getStickersByEmoticon("📂⭐️",!1)}getFavedStickers(e){return this.apiManager.invokeApiHashable({method:"messages.getFavedStickers",processResult:e=>((0,ue.Z)(e),this.saveStickers(e.stickers),this.favedStickers=e.stickers,e),overwrite:e})}getFavedStickersStickers(e){if(e)this.favedStickers=void 0;else if(this.favedStickers)return this.favedStickers;return this.getFavedStickers(e).then((()=>this.favedStickers))}getFavedStickersLimit(){return this.apiManager.getLimit("favedStickers")}faveSticker(e,t){return Ma(this,void 0,void 0,(function*(){this.favedStickers||(yield this.getFavedStickersStickers());const a=yield this.getFavedStickersLimit(),s=this.appDocsManager.getDoc(e);return(0,Pe.Z)(this.favedStickers,(e=>e.id===s.id)),t||(this.favedStickers.unshift(s),this.favedStickers.splice(a,this.favedStickers.length-a)),this.rootScope.dispatchEvent("sticker_updated",{type:"faved",faved:!t,document:s}),this.apiManager.invokeApi("messages.faveSticker",{id:zt(s),unfave:t}).then((()=>{t&&this.onStickersUpdated("faved",!0)}))}))}toggleStickerSet(e){return Ma(this,void 0,void 0,(function*(){if((e=this.storage.getFromCache(e.id).set).installed_date){if(yield this.apiManager.invokeApi("messages.uninstallStickerSet",{stickerset:this.getStickerSetInput(e)}))return delete e.installed_date,this.rootScope.dispatchEvent("stickers_deleted",e),this.storage.delete(e.id,!0),!0}else if(yield this.apiManager.invokeApi("messages.installStickerSet",{stickerset:this.getStickerSetInput(e),archived:!1}))return e.installed_date=Date.now()/1e3|0,this.rootScope.dispatchEvent("stickers_installed",e),!0;return!1}))}toggleStickerSets(e){return Promise.all(e.map((e=>this.toggleStickerSet(e))))}searchStickerSets(e,t=!0){return Ma(this,void 0,void 0,(function*(){const a=t?1:0,s=yield this.apiManager.invokeApiHashable({method:"messages.searchStickerSets",params:{flags:a,exclude_featured:t||void 0,q:e},processResult:e=>((0,ue.Z)(e),(0,ne.Z)(e.sets,((e,t,a)=>{e.set.pFlags.videos&&!i().IS_WEBM_SUPPORTED&&a.splice(t,1)})),e.sets.forEach((e=>{this.saveStickerSet({set:e.set,documents:[],packs:[],keywords:[]},e.set.id)})),e)}),n=[],r=this.storage.getCache();for(const t in r){const{set:a}=r[t];a.title.toLowerCase().includes(e.toLowerCase())&&!s.sets.find((e=>e.set.id===a.id))&&n.push({_:"stickerSetCovered",set:a,cover:null})}return s.sets.concat(n)}))}getAllStickers(){return this.apiManager.invokeApiHashable({method:"messages.getAllStickers",processResult:this.processAllStickersResult})}getEmojiStickers(){return this.apiManager.invokeApiHashable({method:"messages.getEmojiStickers",processResult:this.processAllStickersResult})}preloadStickerSets(){return this.getAllStickers().then((e=>Promise.all(e.sets.map((e=>this.getStickerSet(e,{useCache:!0}))))))}getStickersByEmoticon(e,t=!0){return e=(0,Pt.Z)(e),this.getStickersByEmoticonsPromises[e]?this.getStickersByEmoticonsPromises[e]:this.getStickersByEmoticonsPromises[e]=Promise.all([this.apiManager.invokeApiHashable({method:"messages.getStickers",params:{emoticon:e},processResult:e=>e}),t?this.preloadStickerSets():[],t?this.getRecentStickers():void 0]).then((([t,a,s])=>{const n=t.stickers.map((e=>this.appDocsManager.saveDoc(e))),r=[],o=[],p=t=>{for(const a of t)if((0,Pt.Z)(a.emoticon).includes(e))for(const e of a.documents){const t=this.appDocsManager.getDoc(e);(t.animated?r:o).push(t)}};if(s){p(s.packs);const e=s.stickers;[r,o].forEach((t=>{t.sort(((t,a)=>e.indexOf(t)-e.indexOf(a)))}))}for(const e of a)p(e.packs);const d=[...new Set(r.concat(o,n))];return(0,ne.Z)(d,((e,t,a)=>{(3===e.sticker&&!i().IS_WEBM_SUPPORTED||!this.rootScope.premium&&(0,Wt.Z)(e))&&a.splice(t,1)})),d}))}clearRecentStickers(){return this.recentStickers&&(this.recentStickers.length=0,this.onStickersUpdated("recent",!1)),this.apiManager.invokeApi("messages.clearRecentStickers")}}var wa=a(467),ka=a(8493);class Aa extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{if(e)this.users={},this.usernames={};else for(const e in this.users){if(!e)continue;const t=e.toPeerId();if(!this.peersStorage.isPeerNeeded(t)){const t=this.users[e];this.modifyUsernamesCache(t,!1),this.storage.delete(e),delete this.users[e]}}this.getTopPeersPromises={},this.contactsIndex=this.createSearchIndex(),this.contactsFillPromise=void 0,this.contactsList=new Set,this.updatedContactsList=!1},this.updateUsersStatuses=()=>{const e=(0,te.Z)(!0);for(const t in this.users){const a=this.users[t];this.updateUserStatus(a,e)}}}after(){return this.clear(!0),setInterval(this.updateUsersStatuses,6e4),this.rootScope.addEventListener("state_synchronized",this.updateUsersStatuses),this.apiUpdatesManager.addMultipleEventsListeners({updateUserStatus:e=>{const t=e.user_id,a=this.users[t];a&&(a.status=e.status,a.status&&("expires"in a.status&&(a.status.expires-=this.timeManager.getServerTimeOffset()),"was_online"in a.status&&(a.status.was_online-=this.timeManager.getServerTimeOffset())),this.rootScope.dispatchEvent("user_update",t),this.setUserToStateIfNeeded(a))},updateUserName:e=>{const t=e.user_id,a=this.users[t];a&&(this.forceUserOnline(t),this.saveApiUser(Object.assign(Object.assign({},a),{first_name:e.first_name,last_name:e.last_name,username:void 0,usernames:e.usernames}),!0))}}),this.rootScope.addEventListener("language_change",(e=>{const t=this.getSelf().id;this.contactsIndex.indexObject(t,this.getUserSearchText(t))})),Promise.all([this.appStateManager.getState(),this.appStoragesManager.loadStorage("users")]).then((([e,{results:t,storage:a}])=>{this.storage=a,this.saveApiUsers(t);for(let a=0,s=t.length;a{if(!this.appPeersManager.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)||this.storage.set({[t]:this.getUser(t)})})),this.peersStorage.addEventListener("peerUnneeded",(e=>{if(!this.appPeersManager.isUser(e))return;const t=e.toUserId();this.storage.getFromCache(t)&&this.storage.delete(t)}))}))}get userId(){return this.rootScope.myId.toUserId()}onContactsModified(e){e&&this.appStateManager.pushToState("contactsListCachedTime",(0,te.Z)(!0))}pushRecentSearch(e){return this.appStateManager.getState().then((t=>{const a=t.recentSearch||[];if(a[0]!==e){(0,M.Z)(a,e),a.unshift(e),a.length>20&&(a.length=20),this.appStateManager.pushToState("recentSearch",a);for(const e of a)this.peersStorage.requestPeer(e,"recentSearch")}}))}clearRecentSearch(){return this.appStateManager.getState().then((e=>{const t=e.recentSearch||[];for(const e of t)this.peersStorage.releasePeer(e,"recentSearch");t.length=0,this.appStateManager.pushToState("recentSearch",t)}))}fillContacts(){var e;if(this.contactsFillPromise&&this.updatedContactsList)return{cached:this.contactsFillPromise.isFulfilled,promise:this.contactsFillPromise};this.updatedContactsList=!0;const t=(0,v.Z)();return this.apiManager.invokeApi("contacts.getContacts").then((e=>{"contacts.contacts"===e._&&(this.contactsList.clear(),this.saveApiUsers(e.users),e.contacts.forEach((e=>{this.pushContact(e.user_id)})),this.onContactsModified(!0),this.contactsFillPromise=t),t.resolve(this.contactsList)}),(()=>{this.updatedContactsList=!1})),{cached:null===(e=this.contactsFillPromise)||void 0===e?void 0:e.isFulfilled,promise:this.contactsFillPromise||(this.contactsFillPromise=t)}}resolveUsername(e){"@"===e[0]&&(e=e.slice(1)),e=e.toLowerCase();const t=this.usernames[e];return t?this.appPeersManager.getPeer(t):this.apiManager.invokeApiSingleProcess({method:"contacts.resolveUsername",params:{username:e},processResult:e=>this.processResolvedPeer(e)})}processResolvedPeer(e){return this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),this.appPeersManager.getPeer((0,le.Z)(e.peer))}resolvePhone(e){return this.apiManager.invokeApi("contacts.resolvePhone",{phone:e}).then((e=>this.processResolvedPeer(e)))}pushContact(e){this.contactsList.add(e),this.contactsIndex.indexObject(e,this.getUserSearchText(e)),this.peersStorage.requestPeer(e.toPeerId(),"contact")}popContact(e){this.contactsList.delete(e),this.contactsIndex.indexObject(e,""),this.peersStorage.releasePeer(e.toPeerId(),"contact")}getUserSearchText(e){const t=this.users[e];return t?[t.first_name,t.last_name,t.phone,...(0,Jt.Z)(t),t.pFlags.self?"Saved Messages":""].filter(Boolean).join(" "):""}getContacts(e,t=!1,a="name"){return this.fillContacts().promise.then((s=>{let n=[...s];if(e){const t=this.contactsIndex.search(e);n=[...n].filter((e=>t.has(e)))}"name"===a?n.sort(((e,t)=>{const a=(this.users[e]||{}).sortName||"",s=(this.users[t]||{}).sortName||"";return a.localeCompare(s)})):"online"===a&&n.sort(((e,t)=>{const a=this.getUserStatusForSort(this.getUser(e).status);return this.getUserStatusForSort(this.getUser(t).status)-a}));const i=this.userId;return(0,M.Z)(n,i),t&&this.testSelfSearch(e)&&n.unshift(i),n}))}getContactsPeerIds(e,t,a,s){return this.getContacts(e,t,a).then((e=>{const t=e.map((e=>e.toPeerId(!1)));return s?t.slice(0,s):t}))}toggleBlock(e,t){return this.apiManager.invokeApiSingle(t?"contacts.block":"contacts.unblock",{id:this.appPeersManager.getInputPeerById(e)}).then((a=>(a&&this.apiUpdatesManager.processLocalUpdate({_:"updatePeerBlocked",peer_id:this.appPeersManager.getOutputPeer(e),blocked:t}),a)))}testSelfSearch(e){const t=this.getSelf(),a=this.createSearchIndex();return a.indexObject(t.id,this.getUserSearchText(t.id)),a.search(e).has(t.id)}createSearchIndex(){return new ae.Z({clearBadChars:!0,ignoreCase:!0,latinize:!0,includeTag:!0})}saveApiUsers(e,t){e.saved||(e.saved=!0,e.forEach((e=>this.saveApiUser(e,t))))}modifyUsernamesCache(e,t){const a=(0,Jt.Z)(e);if(!a.length)return;const s=a.map((e=>function(e){return e&&e.toLowerCase()||""}(e)));t?s.forEach((t=>{this.usernames[t]=e.id.toPeerId("user"!==e._)})):s.forEach((e=>{delete this.usernames[e]}))}setUsernameToCache(e,t){return!(t&&t.username===e.username&&(0,Y.Z)(t.usernames,e.usernames)||(this.modifyUsernamesCache(t,!1),this.modifyUsernamesCache(e,!0),0))}saveApiUser(e,t){var a,s,n,i;if(!e||"userEmpty"===e._)return;const r=e.id,o=this.users[r];if(null!==(a=e.pFlags)&&void 0!==a||(e.pFlags={}),e.pFlags.min&&void 0!==o)return;const p=this.setUsernameToCache(e,o);if(o&&void 0!==o.sortName&&o.first_name===e.first_name&&o.last_name===e.last_name)e.sortName=o.sortName;else{const t=e.first_name+(e.last_name?" "+e.last_name:"");e.sortName=e.pFlags.deleted?"":(0,wa.ZP)(t,!1)}if(e.status&&(e.status.expires&&(e.status.expires-=this.timeManager.getServerTimeOffset()),e.status.was_online&&(e.status.was_online-=this.timeManager.getServerTimeOffset())),"userProfilePhotoEmpty"===(null===(s=e.photo)||void 0===s?void 0:s._)&&delete e.photo,void 0===o)this.users[r]=e;else{const t=e.first_name!==o.first_name||e.last_name!==o.last_name||p,a=(null===(n=o.photo)||void 0===n?void 0:n.photo_id)!==(null===(i=e.photo)||void 0===i?void 0:i.photo_id),s=o.pFlags.premium!==e.pFlags.premium||o.pFlags.verified!==e.pFlags.verified||o.pFlags.scam!==e.pFlags.scam||o.pFlags.fake!==e.pFlags.fake,d=!!o.pFlags.contact,f=!!e.pFlags.contact;re(o,e),this.rootScope.dispatchEvent("user_update",r),d!==f&&this.onContactUpdated(r,f,d),a&&this.rootScope.dispatchEvent("avatar_update",{peerId:e.id.toPeerId()}),(t||s)&&this.rootScope.dispatchEvent("peer_title_edit",{peerId:e.id.toPeerId()})}this.checkPremium(e,o),this.setUserToStateIfNeeded(e)}checkPremium(e,t){if(e.pFlags.self){const a=!!e.pFlags.premium;this.rootScope.premium!==a&&this.rootScope.dispatchEvent("premium_toggle_private",{isNew:!t,isPremium:a})}}setUserToStateIfNeeded(e){this.peersStorage.isPeerNeeded(e.id.toPeerId())&&this.storage.set({[e.id]:e})}isUserOnlineVisible(e){return this.getUserStatusForSort(e)>3}getUserStatusForSort(e){if("object"!=typeof e){const t=this.getUser(e);e=null==t?void 0:t.status}if(e){const t="userStatusOnline"===e._?e.expires:"userStatusOffline"===e._?e.was_online:0;if(t)return t;switch(e._){case"userStatusRecently":return 3;case"userStatusLastWeek":return 2;case"userStatusLastMonth":return 1}}return 0}getUser(e){return(0,fe.Z)(e)?e:this.users[e]}getUserStatus(e){return this.isRegularUser(e)&&!this.users[e].pFlags.self&&this.users[e].status}getUserPhone(e){return t=this,a=void 0,n=function*(){const t=this.getUser(e);if(!(null==t?void 0:t.phone))return;const a=yield this.apiManager.getAppConfig();return{phone:t.phone,isAnonymous:a.fragment_prefixes.some((e=>t.phone.startsWith(e)))}},new((s=void 0)||(s=Promise))((function(e,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof s?a:new s((function(e){e(a)}))).then(r,o)}p((n=n.apply(t,a||[])).next())}));var t,a,s,n}getSelf(){return this.getUser(this.userId)}isBot(e){return this.users[e]&&!!this.users[e].pFlags.bot}isAttachMenuBot(e){return this.isBot(e)&&!!this.users[e].pFlags.bot_attach_menu}isContact(e){return this.contactsList.has(e)||!(!this.users[e]||!this.users[e].pFlags.contact)}isRegularUser(e){const t=this.users[e];return t&&!this.isBot(e)&&!t.pFlags.deleted&&!t.pFlags.support}isNonContactUser(e){return this.isRegularUser(e)&&!this.isContact(e)&&e!==this.userId}hasUser(e,t){const a=this.users[e];return(0,fe.Z)(a)&&(t||!a.pFlags.min)}getUserString(e){const t=this.getUser(e);return"u"+e+(t.access_hash?"_"+t.access_hash:"")}getUserInput(e){const t=this.getUser(e);return t.pFlags&&t.pFlags.self?{_:"inputUserSelf"}:{_:"inputUser",user_id:e,access_hash:t.access_hash}}getUserInputPeer(e){return{_:"inputPeerUser",user_id:e,access_hash:this.getUser(e).access_hash}}getContactMediaInput(e){const t=this.getUser(e);return{_:"inputMediaContact",first_name:t.first_name,last_name:t.last_name,phone_number:t.phone,vcard:"",user_id:e}}updateUserStatus(e,t=(0,te.Z)(!0)){e.status&&"userStatusOnline"===e.status._&&e.status.expires=60)return}else if(this.apiUpdatesManager.updatesState.syncLoading)return;const s=this.getUser(e);!(null==s?void 0:s.status)||"userStatusOnline"===s.status._||"userStatusEmpty"===s.status._||s.pFlags.support||s.pFlags.deleted||(s.status={_:"userStatusOnline",expires:a+60},this.rootScope.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(s))}importContact(e,t,a){return this.importContacts([{first_name:e,last_name:t,phones:[a]}]).then((e=>{if(!e.length){const e=new Error;throw e.type="NO_USER",e}return e[0]}))}importContacts(e){const t=[];for(let a=0;a(this.saveApiUsers(e.users),e.imported.map((e=>(this.onContactUpdated(e.user_id,!0),e.user_id))))))}getTopPeers(e){return this.getTopPeersPromises[e]?this.getTopPeersPromises[e]:this.getTopPeersPromises[e]=this.appStateManager.getState().then((t=>{const a=t.topPeersCache[e];return a&&a.cachedTime+864e5>Date.now()&&a.peers?a.peers:this.apiManager.invokeApi("contacts.getTopPeers",{[e]:!0,offset:0,limit:15,hash:"0"}).then((a=>{let s=[];return"contacts.topPeers"===a._&&(this.saveApiUsers(a.users),this.appChatsManager.saveApiChats(a.chats),a.categories.length&&(s=a.categories[0].peers.map((e=>{const t=(0,le.Z)(e.peer);return this.peersStorage.requestPeer(t,"topPeer"),{id:t,rating:e.rating}})))),t.topPeersCache[e]={peers:s,cachedTime:Date.now()},this.appStateManager.pushToState("topPeersCache",t.topPeersCache),s}))}))}getBlocked(e=0,t=0){return this.apiManager.invokeApiSingle("contacts.getBlocked",{offset:e,limit:t}).then((e=>(this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),{count:"contacts.blocked"===e._?e.users.length+e.chats.length:e.count,peerIds:e.users.map((e=>e.id.toPeerId())).concat(e.chats.map((e=>e.id.toPeerId(!0))))})))}getLocated(e,t,a,s=!1,n=0){const i={_:"inputGeoPoint",lat:e,long:t,accuracy_radius:a};return this.apiManager.invokeApi("contacts.getLocated",{geo_point:i,background:s}).then((e=>(this.apiUpdatesManager.processUpdateMessage(e),e)))}searchContacts(e,t=20){const a=(0,Lt.Z)(e);if(a.length&&a[0].length===e.trim().length&&"messageEntityUrl"===a[0]._)try{const t=new URL(je(e).url).pathname.slice(1);t&&(e=t)}catch(e){}return this.apiManager.invokeApiCacheable("contacts.search",{q:e,limit:t},{cacheSeconds:60}).then((e=>(this.saveApiUsers(e.users),this.appChatsManager.saveApiChats(e.chats),{my_results:(0,we.Z)(e.my_results.map((e=>(0,le.Z)(e)))),results:e.results.map((e=>(0,le.Z)(e)))})))}onContactUpdated(e,t,a=this.isContact(e)){t!==a&&(t?this.pushContact(e):this.popContact(e),this.onContactsModified(),this.rootScope.dispatchEvent("contacts_update",e))}updateUsername(e){return this.apiManager.invokeApi("account.updateUsername",{username:e}).then((e=>{this.saveApiUser(e)}))}setUserStatus(e,t){if(this.isBot(e))return;const a=this.users[e];if(a){const s=t?{_:"userStatusOffline",was_online:(0,te.Z)(!0)}:{_:"userStatusOnline",expires:(0,te.Z)(!0)+50};a.status=s,this.rootScope.dispatchEvent("user_update",e),this.setUserToStateIfNeeded(a)}}updateMyOnlineStatus(e){return this.setUserStatus(this.getSelf().id,e),this.apiManager.invokeApiSingle("account.updateStatus",{offline:e})}addContact(e,t,a,s,n){return this.apiManager.invokeApi("contacts.addContact",{id:this.getUserInput(e),first_name:t,last_name:a,phone:s,add_phone_privacy_exception:n}).then((t=>{this.apiUpdatesManager.processUpdateMessage(t,{override:!0}),this.onContactUpdated(e,!0)}))}deleteContacts(e){return this.apiManager.invokeApi("contacts.deleteContacts",{id:e.map((e=>this.getUserInput(e)))}).then((t=>{this.apiUpdatesManager.processUpdateMessage(t,{override:!0}),e.forEach((e=>{this.onContactUpdated(e,!1)}))}))}checkUsername(e){return this.apiManager.invokeApi("account.checkUsername",{username:e})}toggleUsername(e,t){return this.apiManager.invokeApi("account.toggleUsername",{username:e,active:t})}reorderUsernames(e){return this.apiManager.invokeApi("account.reorderUsernames",{order:e})}canSendToUser(e){return(0,ka.Z)(this.getUser(e))}}const Da=new Set(["photo","video","gif","document"]);class Ua extends G{constructor(){super(...arguments),this.webpages={},this.pendingWebPages={}}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateWebPage:e=>{this.saveWebPage(e.webpage)}})}saveWebPage(e,t,a){var s,n;if("webPageNotModified"===e._||"webPageEmpty"===e._)return;const{id:i}=e,r=this.webpages[i],o=r&&r._===e._&&r.hash==r.hash;if("webPage"===e._){"photo"===(null===(s=e.photo)||void 0===s?void 0:s._)?e.photo=this.appPhotosManager.savePhoto(e.photo,a):delete e.photo,"document"===(null===(n=e.document)||void 0===n?void 0:n._)?e.document=this.appDocsManager.saveDoc(e.document,a):("document"===e.type&&delete e.type,delete e.document);const t=e.site_name,i=e.title||e.author||t||"";t&&i===t&&delete e.site_name,Da.has(e.type)||e.description||!e.photo||(e.type="photo")}let p=this.pendingWebPages[i];if(t&&(p||(p=this.pendingWebPages[i]=new Set),p.add(t)),void 0===r?this.webpages[i]=e:re(r,e),!t&&void 0!==p&&o){const e=[];p.forEach((t=>{const[a,s,n]=t.split("_");e.push({peerId:a.toPeerId(),mid:+s,isScheduled:!!n})})),this.rootScope.dispatchEvent("webpage_updated",{id:i,msgs:e})}return e}getMessageKeyForPendingWebPage(e,t,a){return e+"_"+t+(a?"_s":"")}deleteWebPageFromPending(e,t){const a=e.id;if(!a)return;const s=this.pendingWebPages[a];s&&s.has(t)&&(s.delete(t),s.size||delete this.pendingWebPages[a])}getCachedWebPage(e){return this.webpages[e]}getWebPage(e){return this.apiManager.invokeApiHashable({method:"messages.getWebPage",processResult:e=>this.saveWebPage(e),params:{url:e}})}}var Ta=a(5936),Ea=a(3019);function Fa(e){return(0,Ea.Z)(e,"readAsArrayBuffer")}var Ra=a(1243),xa=a(7086);function Ba(e){return encodeURIComponent(e).replace(/['()]/g,escape).replace(/\*/g,"%2A")}class Va{constructor(e,t){this.serviceMessagePort=e,this.downloadId=t,this.serviceMessagePort=Ws()}write(e,t){return a=this,s=void 0,i=function*(){return this.serviceMessagePort.invoke("downloadChunk",{id:this.downloadId,chunk:e})},new((n=void 0)||(n=Promise))((function(e,t){function r(e){try{p(i.next(e))}catch(e){t(e)}}function o(e){try{p(i.throw(e))}catch(e){t(e)}}function p(t){var a;t.done?e(t.value):(a=t.value,a instanceof n?a:new n((function(e){e(a)}))).then(r,o)}p((i=i.apply(a,s||[])).next())}));var a,s,n,i}finalize(e){return this.serviceMessagePort.invoke("downloadFinalize",this.downloadId).then((()=>{}))}}class Oa{getFile(e){return Promise.reject((0,X.Z)("NO_ENTRY_FOUND"))}prepareWriting({fileName:e,downloadId:t,size:a}){const s=Object.assign({"Content-Type":"application/octet-stream; charset=utf-8","Content-Disposition":"attachment; filename*=UTF-8''"+Ba(e)},a?{"Content-Length":a}:{}),n=Ws(),i=n.invoke("download",{headers:s,id:t}),r=(0,v.Z)();return r.cancel=()=>{r.reject((0,X.Z)("DOWNLOAD_CANCELED"))},r.catch((()=>{Ws().invoke("downloadCancel",t)})),i.then(r.resolve,r.reject),{deferred:r,getWriter:()=>new Va(n,t)}}}var La=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};const Na=131072,Za=new Set(["DOWNLOAD_CANCELED","UPLOAD_CANCELED","UNKNOWN","NO_NEW_CONTEXT"]);class ja extends G{constructor(){super(...arguments),this.cacheStorage=new Ta.Z("cachedFiles"),this.downloadStorage=new Oa,this.downloadPromises={},this.uploadPromises={},this.downloadPulls={},this.downloadActives={},this.refreshReferencePromises={},this.log=(0,I.kg)("AFM",I.v9.Error|I.v9.Log),this.tempId=0,this.queueId=0,this.debug=b.Z.debug,this.maxUploadParts=4e3,this.maxDownloadParts=8e3,this.uncompressTGS=(e,t)=>this.cryptoWorker.invokeCrypto("gzipUncompress",e.slice().buffer,!1),this.uncompressTGV=(e,t)=>{const a=e.slice().buffer;return i().IS_FIREFOX?this.cryptoWorker.invokeCrypto("gzipUncompress",a,!0).then((e=>function(e){const t=e.indexOf("/,` width="${n}" height="${i}">`).replace(/[^\x00-\x7F]/g,"")}(e))).then((e=>(new TextEncoder).encode(e))):this.cryptoWorker.invokeCrypto("gzipUncompress",a,!1)},this.convertWebp=(e,t)=>f.Z.getInstance().invoke("convertWebp",{fileName:t,bytes:e}),this.convertOpus=(e,t)=>f.Z.getInstance().invoke("convertOpus",{fileName:t,bytes:e})}after(){setInterval((()=>{for(const e in this.refreshReferencePromises){const{deferred:t}=this.refreshReferencePromises[e];(t.isFulfilled||t.isRejected)&&delete this.refreshReferencePromises[e]}}),18e5),this.rootScope.addEventListener("config",(e=>{this.webFileDcId=e.webfile_dc_id})),this.rootScope.addEventListener("app_config",(e=>{this.maxUploadParts=this.rootScope.premium?e.upload_max_fileparts_premium:e.upload_max_fileparts_default,this.maxDownloadParts=e.upload_max_fileparts_premium}))}downloadRequest(e,t,a,s,n=0){void 0===this.downloadPulls[e]&&(this.downloadPulls[e]=[],this.downloadActives[e]=0);const i=this.downloadPulls[e],r=new Promise(((e,r)=>{i.push({id:t,queueId:n,cb:a,deferred:{resolve:e,reject:r},activeDelta:s})}));return setTimeout((()=>{this.downloadCheck(e)}),0),r}downloadCheck(e){const t=this.downloadPulls[e],a=this.rootScope.premium?224:36;if(this.downloadActives[e]>=a||!(null==t?void 0:t.length))return!1;const s=(0,Pe.Z)(t,(e=>0===e.queueId))||(0,Pe.Z)(t,(e=>e.queueId===this.queueId))||t.shift(),n=s.activeDelta||1;this.downloadActives[e]+=n;const i=s.cb();i.then((()=>{this.downloadActives[e]-=n,this.downloadCheck(e)}),(t=>{(null==t?void 0:t.type)&&Za.has(t.type)||this.log.error("downloadCheck error:",t),this.downloadActives[e]-=n,this.downloadCheck(e)})).finally((()=>{i.then(s.deferred.resolve,s.deferred.reject)}))}setQueueId(e){this.queueId=e}getFileStorage(){return this.cacheStorage}cancelDownload(e){const t=[this.downloadPromises[e],this.uploadPromises[e]].filter(Boolean);let a=!1;for(let e=0,s=t.length;eLa(this,void 0,void 0,(function*(){return null==r||r(),this.apiManager.invokeApi("upload.getWebFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0})}))),this.getDelta(s),i)}requestFilePart(e,t,a,s,n=0,i=0,r){return this.downloadRequest(e,n,(()=>La(this,void 0,void 0,(function*(){null==r||r();const n=()=>La(this,void 0,void 0,(function*(){var i;null==r||r();const o=null===(i=t.file_reference)||void 0===i?void 0:i.slice();return this.apiManager.invokeApi("upload.getFile",{location:t,offset:a,limit:s},{dcId:e,fileDownload:!0}).catch((e=>{if(null==r||r(),"FILE_REFERENCE_EXPIRED"===e.type)return this.refreshReference(t,o).then(n);throw e}))}));(0,ue.Z)(t);const i=t.file_reference;if(i&&!t.checkedReference){t.checkedReference=!0;const e=T(i);if(this.refreshReferencePromises[e])return this.refreshReference(t,i).then(n)}return n()}))),this.getDelta(s),i)}getDelta(e){return e/Na}getLimitPart(e,t){if(!e)return 524288;let a=Na;const s=t?this.maxUploadParts:this.maxDownloadParts,n=t?524288:1048576;for(;e/a>s&&a{a===T(t)&&e.reject((0,X.Z)("REFERENCE_IS_NOT_REFRESHED")),e.resolve(t)}),e.reject)}return s.deferred.then((t=>{e.file_reference=t}))}isDownloading(e){return!!this.downloadPromises[e]}getDownload(e){return this.downloadPromises[e]}getUpload(e){return this.uploadPromises[e]}getConvertMethod(e){let t;return"application/x-tgwallpattern"===e?(t=this.uncompressTGV,e="image/svg+xml"):"image/webp"!==e||i().IS_WEBP_SUPPORTED?"application/x-tgsticker"===e?(t=this.uncompressTGS,e="application/json"):"audio/ogg"!==e||i().IS_OPUS_SUPPORTED||(t=this.convertOpus,e="audio/wav"):(t=this.convertWebp,e="image/png"),{mimeType:e,process:t}}allocateDeferredPromises(e,t,a){const s=[];let n,i=e,r=Promise.resolve();do{n=(0,v.Z)(),s.push({offset:i,writePromise:r,writeDeferred:n}),r=n,i+=a}while(i{if(!(null==e?void 0:e.error))for(const a of M)e&&e!==a||(a.error=t,a.deferred.reject(t))},y=this.tempId++,_=e.limitPart||this.getLimitPart(s,!1);let v,P,b=m.getFile.bind(m);const M=[],I=s||_,S=(e,t)=>{const{deferred:a}=e,s=u.bind(null,e);a.cancel=()=>a.reject((0,X.Z)("DOWNLOAD_CANCELED")),a.catch((t=>{var a,n;s(t),null===(n=null===(a=e.writer)||void 0===a?void 0:a.truncate)||void 0===n||n.call(a)})).finally((()=>{this.downloadPromises[t]===a&&delete this.downloadPromises[t],delete e.writer})),this.downloadPromises[t]=a,M.push(e)};if(m&&(!g||I<=o.Iw)&&(v=m.prepareWriting(l,I,e.mimeType),S(v,l)),g){let t=e.fileName;if(!t){t=l;const a=gt[e.mimeType];a&&(t+="."+a)}P=g.prepareWriting({fileName:t,downloadId:r,size:I}),S(P,c),v&&P.deferred.catch((e=>v.deferred.reject(e)))}h=null!==(a=null==P?void 0:P.deferred)&&void 0!==a?a:v.deferred,g&&f&&(b=g.getFile.bind(g)),b(l).then((e=>La(this,void 0,void 0,(function*(){if(C(),P){const t=P.writer=P.getWriter();C();const a=yield function(e){return Fa(e).then((e=>new Uint8Array(e)))}(e);C(),yield t.write(a),C(),P.deferred.resolve(yield t.finalize())}v&&v.deferred.resolve(e)})))).catch((t=>La(this,void 0,void 0,(function*(){if(e.onlyCache)return void u(null,t);M.forEach((e=>{e.writer=e.getWriter()}));const a="inputWebFileLocation"===i._,r=(a?this.requestWebFilePart:this.requestFilePart).bind(this);a&&void 0===this.webFileDcId&&(yield this.apiManager.getConfig(),C());const p=this.allocateDeferredPromises(0,s,_),d={done:0,offset:0,total:s,fileName:c},m=()=>{try{C(),d.done=h,this.rootScope.dispatchEvent("download_progress",d)}catch(e){}},g=(0,aa.Z)(m,50,!0);let h=0;const v=()=>La(this,void 0,void 0,(function*(){const{offset:t,writePromise:a,writeDeferred:d}=p.shift();try{C();performance.now();const u=yield r(n,i,t,_,y,e.queueId,C),P=(performance.now(),u.bytes);p.length&&v();const b=P.byteLength;this.debug&&this.log("downloadFile requestFilePart result:",c,u);const I=t+_>=s||!b;if(b){h+=b,I?m():g();performance.now();yield a,C(),performance.now(),performance.now(),yield Promise.all(M.map((({writer:e})=>null==e?void 0:e.write(P,t)))),C()}if(I&&(!s||h{var t;return null===(t=null==e?void 0:e.trim)||void 0===t?void 0:t.call(e,h)})),I&&f){const e=M.filter((({writer:e})=>(null==e?void 0:e.getParts)&&e.replaceParts)).map((({writer:e})=>La(this,void 0,void 0,(function*(){const t=e.getParts(),a=yield f(t,l);e.replaceParts(a)}))));yield Promise.all(e),C()}if(d.resolve(),I){const e=h<=o.Iw;M.forEach((t=>{const{deferred:a,writer:s}=t;if(a.isFulfilled||a.isRejected||!s)return;const n=s.finalize(e);a.resolve(n)}))}}catch(e){u(null,e)}}));for(let e=0,t=Math.min(1/0,p.length);e{if(M.reduce(((e,t)=>e+ +!!t.error),0)===M.length)throw M[0].error};return h}downloadMedia(e){let{media:t,thumb:a}=e;const s="photo"===t._;if(s&&!a)return Promise.reject("preloadPhoto photoEmpty!");const n="document"===t._;n?t=this.appDocsManager.getDoc(t.id):s&&(t=this.appPhotosManager.getPhoto(t.id));const{fileName:i,downloadOptions:r}=(0,Ra.Z)(e);let o=this.getDownload(i);return o||(o=this.download(r),n&&!a&&(this.rootScope.dispatchEvent("document_downloading",t.id),o.catch(jt.Z).finally((()=>{this.rootScope.dispatchEvent("document_downloaded",t.id)})))),o}downloadMediaURL(e){const{media:t,thumb:a}=e;let s=this.thumbsStorage.getCacheContext(t,null==a?void 0:a.type);return(!a||s.downloaded>=("size"in a?a.size:0))&&s.url?Promise.resolve(s.url):this.downloadMedia(e).then((e=>{if(!s.downloaded||s.downloaded=10485760,n=this.getLimitPart(a,!0),i=this.getDelta(n),r=Math.ceil(a/n),o=(0,Te.a)(),p={_:s?"inputFileBig":"inputFile",id:o,parts:r,name:t,md5_checksum:""},d=(0,v.Z)();if(r>this.maxUploadParts)return d.reject((0,X.Z)("FILE_TOO_BIG")),d;let f=!1,c=!1,l=e=>{"UPLOAD_CANCELED"!==(null==e?void 0:e.type)&&this.log.error("Up Error",e),d.reject(e),f=!0,l=jt.Z};const m=s?"upload.saveBigFilePart":"upload.saveFilePart",g=this.tempId++,h=this,u=function*(){let u=0,y=0;for(let v=0;vLa(this,void 0,void 0,(function*(){_();const i=e.slice(v,v+n),g=yield Fa(i);return _(),h.debug&&h.log("Upload file part, isBig:",s,P,g.byteLength,new Uint8Array(g).length,new Uint8Array(g).slice().length),h.apiManager.invokeApi(m,{file_id:o,file_part:P,file_total_parts:r,bytes:g},{fileUpload:!0}).then((()=>{if(f)return;++y;const e={done:y*n,offset:v,total:a,fileName:t};d.notify(e),y>=r&&(d.resolve(p),c=!0)}),l)}))),i).catch(l)}}(),y=()=>{if(f)return;const e=u.next();e.done||f||e.value.then(y)};for(let e=0,t=Math.min(1/0,r);e{if(f)throw(0,X.Z)("UPLOAD_CANCELED")};return d.cancel=()=>{f||c||(f=!0,l((0,X.Z)("UPLOAD_CANCELED")))},d.notify=e=>{this.rootScope.dispatchEvent("download_progress",e)},d.finally((()=>{this.uploadPromises[t]===d&&delete this.uploadPromises[t]})),this.uploadPromises[t]=d}}var qa=a(7487),Ga=a(6666),Ha=a(3306);class Wa extends G{constructor(){super(),this.hashes={},this.apiPromisesSingleProcess={},this.apiPromisesSingle={},this.apiPromisesCacheable={},this.afterMessageIdTemp=0}setUser(e){return this.setUserAuth(e.id)}invokeApiAfter(e,t={},a={}){let s=a;return s.prepareTempMessageId=""+ ++this.afterMessageIdTemp,s=Object.assign({},a),a.messageId=s.prepareTempMessageId,this.invokeApi(e,t,s)}invokeApiHashable(e){var t,a;null!==(t=e.params)&&void 0!==t||(e.params={}),null!==(a=e.options)&&void 0!==a||(e.options={});const{params:s,options:n,method:i,overwrite:r}=e,o=JSON.stringify(s);let p;return this.hashes[i]&&(p=this.hashes[i][o],p&&(r?(delete this.hashes[i][o],p=void 0):s.hash=p.hash)),this.invokeApiSingleProcess({method:i,processResult:t=>{if(t._.includes("NotModified"))return p.result;if(t.hash){const e=t.hash;this.hashes[i]||(this.hashes[i]={}),p=this.hashes[i][o]={hash:e,result:t}}if(e.processResult){const a=e.processResult(t);return p?p.result=a:a}return t},params:s,options:n})}invokeApiSingle(e,t={},a={}){const s=e+"-"+JSON.stringify(t),n=this.apiPromisesSingle;return n[s]?n[s]:n[s]=this.invokeApi(e,t,a).finally((()=>{delete n[s]}))}invokeApiSingleProcess(e){var t,a,s;null!==(t=e.params)&&void 0!==t||(e.params={}),null!==(a=e.options)&&void 0!==a||(e.options={});const{method:n,processResult:i,processError:r,params:o,options:p}=e,d=this.apiPromisesSingleProcess,f=p.cacheKey||JSON.stringify(o),c=null!==(s=d[n])&&void 0!==s?s:d[n]=new Map,l=c.get(f);if(l)return l;const m=()=>{const e=c.get(f);return e===h?void 0:e},g=this.invokeApi(n,o,p).then((e=>m()||i(e)),(e=>{const t=m();if(t)return t;if(!r)throw e;return r(e)})),h=g.finally((()=>{c.get(f)===h&&(c.delete(f),c.size||delete d[n])}));return c.set(f,h),h}invokeApiCacheable(e,t={},a={}){var s;const n=null!==(s=this.apiPromisesCacheable[e])&&void 0!==s?s:this.apiPromisesCacheable[e]={},i=JSON.stringify(t),r=n[i];if(r&&(!a.override||!r.fulfilled))return r.promise;let o;a.override&&(r&&r.timeout&&(clearTimeout(r.timeout),delete r.timeout),delete a.override),a.cacheSeconds&&(o=E.Z.setTimeout((()=>{delete n[i]}),1e3*a.cacheSeconds),delete a.cacheSeconds);const p=this.invokeApi(e,t,a);return n[i]={timestamp:Date.now(),fulfilled:!1,timeout:o,promise:p,params:t},p}clearCache(e,t){const a=this.apiPromisesCacheable[e];if(a)for(const e in a){const s=a[e];try{t(s.params)&&(s.timeout&&clearTimeout(s.timeout),delete a[e])}catch(e){}}}getConfig(e){return this.config&&!e?this.config:this.invokeApiSingleProcess({method:"help.getConfig",params:{},processResult:e=>(this.config=e,this.rootScope.dispatchEvent("config",e),e),options:{overwrite:e}})}getAppConfig(e){return this.appConfig&&!e?this.appConfig:this.invokeApiSingleProcess({method:"help.getAppConfig",params:{},processResult:e=>{var t;return this.appConfig=e,(0,ia.Ki)(null!==(t=e.ignore_restriction_reasons)&&void 0!==t?t:[]),this.rootScope.dispatchEvent("app_config",e),e},options:{overwrite:e}})}getLimit(e,t){return(0,q.Z)(this.getAppConfig(),(a=>{null!=t||(t=this.rootScope.premium);const s={pin:["dialogs_pinned_limit_default","dialogs_pinned_limit_premium"],folderPin:["dialogs_folder_pinned_limit_default","dialogs_folder_pinned_limit_premium"],folders:["dialog_filters_limit_default","dialog_filters_limit_premium"],favedStickers:["stickers_faved_limit_default","stickers_faved_limit_premium"],reactions:["reactions_user_max_default","reactions_user_max_premium"],bio:["about_length_limit_default","about_length_limit_premium"],topicPin:"topics_pinned_limit",caption:["caption_length_limit_default","caption_length_limit_premium"]}[e];return a[Array.isArray(s)?s[t?1:0]:s]}))}}var za=a(8453),Ka=function(e,t,a,s){return new(a||(a=Promise))((function(n,i){function r(e){try{p(s.next(e))}catch(e){i(e)}}function o(e){try{p(s.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?n(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((s=s.apply(e,t||[])).next())}))};class Ja extends Wa{constructor(){super(),this.log=(0,I.kg)("API"),this.cachedNetworkers={},this.cachedExportPromise={},this.gettingNetworkers={},this.baseDcId=0,this.afterMessageTempIds={},this.transportType=b.Z.transport,Z.addEventListener("transport",(e=>{this.changeTransportType(e)})),setInterval((()=>{this.getAppConfig(!0)}),997e4)}after(){this.apiUpdatesManager.addMultipleEventsListeners({updateConfig:()=>{this.getConfig(!0),this.getAppConfig(!0)}}),this.rootScope.addEventListener("user_auth",(()=>{this.config&&this.apiUpdatesManager.processLocalUpdate({_:"updateConfig"})})),this.rootScope.addEventListener("premium_toggle",(e=>{this.iterateNetworkers((({networker:t,connectionType:a,dcId:s,transportType:n})=>{if("client"===a||"websocket"!==n)return;const i=t.transport;if(i){if(i.connection){const t=V(s,a,e);i.changeUrl(t)}}else this.log.error("wow what, no transport?",t)}))}))}getTransportType(e){return this.transportType}iterateNetworkers(e){for(const t in this.cachedNetworkers){const a=this.cachedNetworkers[t];for(const s in a){const n=a[s];for(const a in n)n[a].forEach(((n,i,r)=>{e({networker:n,dcId:+a,connectionType:s,transportType:t,index:i,array:r})}))}}}chooseServer(e,t,a){return this.dcConfigurator.chooseServer(e,t,a,"client"===t,this.rootScope.premium)}changeTransportType(e){const t=this.transportType;if(t===e)return;this.log("changing transport from",t,"to",e);const a=this.cachedNetworkers[t],s=this.cachedNetworkers[e];this.cachedNetworkers[e]=a,this.cachedNetworkers[t]=s,this.transportType=e;for(const a in this.gettingNetworkers){const s=this.gettingNetworkers[a];delete this.gettingNetworkers[a];const n=a.replace(t,e);this.gettingNetworkers[n]=s,this.log("changed networker getKey from",a,"to",n)}this.iterateNetworkers((e=>{const t=this.getTransportType(e.connectionType),a=this.chooseServer(e.dcId,e.connectionType,t);this.changeNetworkerTransport(e.networker,a)}))}getBaseDcId(){return Ka(this,void 0,void 0,(function*(){if(this.baseDcId)return this.baseDcId;const e=yield qa.Z.get("dc");return this.baseDcId||(e?this.baseDcId=e:this.setBaseDcId(_.Z.baseDcId)),this.baseDcId}))}setUserAuth(e){return Ka(this,void 0,void 0,(function*(){if("string"!=typeof e&&"number"!=typeof e||(e={dcID:0,date:Date.now()/1e3|0,id:e.toPeerId(!1)}),this.rootScope.dispatchEvent("user_auth",e),!e.dcID){const t=yield this.getBaseDcId();e.dcID=t}qa.Z.set({user_auth:e})}))}setBaseDcId(e){const t=this.baseDcId;t&&this.getNetworker(t).then((e=>{this.setOnDrainIfNeeded(e)})),this.baseDcId=e,qa.Z.set({dc:this.baseDcId})}logOut(){return Ka(this,void 0,void 0,(function*(){if(this.loggingOut)return;this.loggingOut=!0;const e=[];for(let t=1;t<=5;t++)e.push("dc"+t+"_auth_key");const t=yield Promise.all(e.map((e=>qa.Z.get(e)))),a=[];for(let e=0;eKa(this,void 0,void 0,(function*(){this.baseDcId=void 0,yield(0,za.Z)(!1,!0),Ga.C.closeDatabases(),this.rootScope.dispatchEvent("logging_out")}));return setTimeout(s,1e3),Promise.all(a).catch((e=>{e.handled=!0})).finally(s)}))}generateNetworkerGetKey(e,t,a){return[e,t,a].join("-")}getNetworker(e,t={}){const a=t.fileDownload?"download":t.fileUpload?"upload":"client",n=this.getTransportType(a);this.cachedNetworkers[n]||(this.cachedNetworkers[n]={client:{},download:{},upload:{}});const i=this.cachedNetworkers[n][a];e in i||(i[e]=[]);const r=i[e],o="client"===a||"https"===n?1:this.rootScope.premium?6:3;if(r.length>=o){let e=o-1,t=!1;for(;e>=0;--e)if(r[e].isOnline){t=!0;break}const a=r.splice(t?e:o-1,1)[0];return r.unshift(a),Promise.resolve(a)}let p=this.generateNetworkerGetKey(e,n,a);if(this.gettingNetworkers[p])return this.gettingNetworkers[p];const d=`dc${e}_auth_key`,f=`dc${e}_server_salt`;let c=this.chooseServer(e,a,n);return this.gettingNetworkers[p]=Promise.all([d,f].map((e=>qa.Z.get(e)))).then((([i,o])=>Ka(this,void 0,void 0,(function*(){let l,m;if(i&&512===i.length){o&&16===o.length||(o="AAAAAAAAAAAAAAAA");const a=(0,Ha.Z)(i),n=(yield s.Z.invokeCrypto("sha1",a)).slice(-8),r=(0,Ha.Z)(o);l=this.networkerFactory.getNetworker(e,a,n,r,t)}else try{const a=yield this.authorizer.auth(e);qa.Z.set({[d]:T(a.authKey),[f]:T(a.serverSalt)}),l=this.networkerFactory.getNetworker(e,a.authKey,a.authKeyId,a.serverSalt,t)}catch(e){m=e}const g=this.getTransportType(a);if(g!==n&&(p=this.generateNetworkerGetKey(e,g,a),c.destroy(),O.removeTransport(this.dcConfigurator.chosenServers,c),l&&(c=this.chooseServer(e,a,g)),this.log("transport has been changed during authorization from",n,"to",g)),delete this.gettingNetworkers[p],m)throw this.log("get networker error",m,m.stack),m;return this.changeNetworkerTransport(l,c),r.unshift(l),this.setOnDrainIfNeeded(l),l}))))}getNetworkerVoid(e){return this.getNetworker(e).then(jt.Z,jt.Z)}changeNetworkerTransport(e,t){const a=e.transport;a&&O.removeTransport(this.dcConfigurator.chosenServers,a),e.changeTransport(t)}onNetworkerDrain(e){this.log("networker drain",e.dcId),e.onDrain=void 0,this.changeNetworkerTransport(e),e.destroy(),this.networkerFactory.removeNetworker(e),O.removeTransport(this.cachedNetworkers,e)}setOnDrainIfNeeded(e){e.onDrain||(e.isFileNetworker?Promise.resolve(!0):this.getBaseDcId().then((t=>e.dcId!==t))).then((t=>{e.onDrain||t&&(e.onDrain=()=>this.onNetworkerDrain(e),e.setDrainTimeout())}))}setUpdatesProcessor(e){this.updatesProcessor=e,this.networkerFactory.setUpdatesProcessor(e)}invokeApi(e,t={},a={}){const s=(0,v.Z)();let n,i,{afterMessageId:r,prepareTempMessageId:o}=a;if(o&&s.then((()=>{delete this.afterMessageTempIds[o]})),d.GO){const n=Date.now(),r=E.Z.setInterval((()=>{i&&i.isStopped()||this.log.error("Request is still processing:",e,t,a,"time:",(Date.now()-n)/1e3)}),5e3);s.catch(jt.Z).finally((()=>{clearInterval(r)}))}const p=(new Error).stack||"empty stack",f=()=>{if(r){const e=this.afterMessageTempIds[r];e&&(a.afterMessageId=e.messageId)}const p=i.wrapApiCall(e,t,a);return o&&(this.afterMessageTempIds[o]={messageId:a.messageId,promise:s}),p.catch((s=>{var i;if("FILE_REFERENCE_EXPIRED"!==s.type&&this.log.error("Error",s.code,s.type,this.baseDcId,n,e,t),401===s.code&&this.baseDcId===n)throw"SESSION_PASSWORD_NEEDED"!==s.type&&(qa.Z.delete("dc"),qa.Z.delete("user_auth")),s;if(401===s.code&&this.baseDcId&&n!==this.baseDcId){if(void 0===this.cachedExportPromise[n]){const e=new Promise(((e,t)=>{this.invokeApi("auth.exportAuthorization",{dc_id:n},{noErrorBox:!0}).then((a=>{this.invokeApi("auth.importAuthorization",{id:a.id,bytes:a.bytes},{dcId:n,noErrorBox:!0}).then(e,t)}),t)}));this.cachedExportPromise[n]=e}return this.cachedExportPromise[n].then((()=>f()))}if(303!==s.code){if(400===s.code&&0===s.type.indexOf("FILE_MIGRATE")){const i=+s.type.match(/^(FILE_MIGRATE_)(\d+)/)[2];if(i!==n)return a.dcId=i,this.invokeApi(e,t,a);throw s}if(400===s.code&&"CONNECTION_NOT_INITED"===s.type)return this.networkerFactory.unsetConnectionInited(),f();if(a.rawError||420!==s.code){if(!a.rawError&&["MSG_WAIT_FAILED","MSG_WAIT_TIMEOUT"].includes(s.type)){const e=this.afterMessageTempIds[r];return r=void 0,delete a.afterMessageId,e?e.promise.then((()=>f())):f()}if(a.rawError||500!==s.code){if("UNKNOWN"===s.type||"MTPROTO_CLUSTER_INVALID"===s.type)return(0,P.Z)(1e3).then((()=>f()));throw s}{const e=Date.now();if(a.stopTime&&e>=a.stopTime)throw s;return a.waitTime=a.waitTime?Math.min(60,1.5*a.waitTime):1,(0,P.Z)(1e3*a.waitTime).then((()=>f()))}}{const e=+s.type.match(/^FLOOD_WAIT_(\d+)/)[1]||1;if(e>(null!==(i=a.floodMaxTimeout)&&void 0!==i?i:60)&&!a.prepareTempMessageId)throw s;return(0,P.Z)(1e3*e).then((()=>f()))}}{const i=+s.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\d+)/)[2];if(i!==n)return a.dcId?a.dcId=i:this.setBaseDcId(i),this.invokeApi(e,t,a)}}))};let c;return c=(n=a.dcId||this.baseDcId)?this.getNetworker(n,a):this.getBaseDcId().then((e=>this.getNetworker(n=e,a))),c.then((e=>{i=e;const t=f();return i.attachPromise(s,a),t})).then(s.resolve).catch((t=>Ka(this,void 0,void 0,(function*(){if(t?(0,fe.Z)(t)||(t={message:t}):t={type:"ERROR_EMPTY"},(401===t.code&&"SESSION_REVOKED"===t.type||406===t.code&&"AUTH_KEY_DUPLICATED"===t.type)&&this.logOut(),a.ignoreErrors)throw t;throw 406===t.code&&(t.handled=!0),a.noErrorBox||(t.input=e,t.stack=p||t.originalError&&t.originalError.stack||t.stack||(new Error).stack,setTimeout((()=>{t.handled||(401===t.code&&this.logOut(),t.handled=!0)}),100)),t})))).catch(s.reject),s}}class $a{constructor(){this.neededPeers=new Map,this.singlePeerMap=new Map,this._constructor(!1)}after(){this.rootScope.addEventListener("user_auth",(()=>{this.requestPeer(this.appPeersManager.peerId,"self")}))}requestPeer(e,t){let a=this.neededPeers.get(e);a&&a.has(t)||(a||(a=new Set,this.neededPeers.set(e,a)),a.add(t),this.dispatchEvent("peerNeeded",e))}releasePeer(e,t){const a=this.neededPeers.get(e);a&&(a.delete(t),a.size||(this.neededPeers.delete(e),this.dispatchEvent("peerUnneeded",e)))}requestPeersForKey(e,t){Array.isArray(e)&&(e=new Set(e));let a=this.singlePeerMap.get(t);if(a){for(const s of a)e.has(s)||(this.releasePeer(s,t),a.delete(s));if(!a.size&&!e.size)return void this.singlePeerMap.delete(t)}if(e.size){a||(a=new Set,this.singlePeerMap.set(t,a));for(const s of e)a.has(s)||(this.requestPeer(s,t),a.add(s))}}isPeerNeeded(e){return this.neededPeers.has(e)}}Ae($a,[p.Z,G]);const Qa=$a,Ya=o.Pt;class Xa{constructor(){this.thumbsCache={}}getKey(e){var t;return e._+(null!==(t=e.id)&&void 0!==t?t:e.url)}getCacheContext(e,t=Ya){var a,s,n,i;const r=null!==(a=(n=this.thumbsCache)[i=this.getKey(e)])&&void 0!==a?a:n[i]={};return null!==(s=r[t])&&void 0!==s?s:r[t]={downloaded:0,url:"",type:t}}setCacheContextURL(e,t=Ya,a,s=0){const n=this.getCacheContext(e,t);return n.url=a,n.downloaded=s,n}deleteCacheContext(e,t=Ya){const a=this.thumbsCache[this.getKey(e)];a&&delete a[t]}}const es={MTProto:{constructors:[{id:481674261,predicate:"vector",params:[],type:"Vector t"},{id:85337187,predicate:"resPQ",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"pq",type:"bytes"},{name:"server_public_key_fingerprints",type:"Vector"}],type:"ResPQ"},{id:-1443537003,predicate:"p_q_inner_data_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"}],type:"P_Q_inner_data"},{id:1459478408,predicate:"p_q_inner_data_temp_dc",params:[{name:"pq",type:"bytes"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce",type:"int256"},{name:"dc",type:"int"},{name:"expires_in",type:"int"}],type:"P_Q_inner_data"},{id:-790100132,predicate:"server_DH_params_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_answer",type:"bytes"}],type:"Server_DH_Params"},{id:-1249309254,predicate:"server_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"g",type:"int"},{name:"dh_prime",type:"bytes"},{name:"g_a",type:"bytes"},{name:"server_time",type:"int"}],type:"Server_DH_inner_data"},{id:1715713620,predicate:"client_DH_inner_data",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"retry_id",type:"long"},{name:"g_b",type:"bytes"}],type:"Client_DH_Inner_Data"},{id:1003222836,predicate:"dh_gen_ok",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash1",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1188831161,predicate:"dh_gen_retry",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash2",type:"int128"}],type:"Set_client_DH_params_answer"},{id:-1499615742,predicate:"dh_gen_fail",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"new_nonce_hash3",type:"int128"}],type:"Set_client_DH_params_answer"},{id:1973679973,predicate:"bind_auth_key_inner",params:[{name:"nonce",type:"long"},{name:"temp_auth_key_id",type:"long"},{name:"perm_auth_key_id",type:"long"},{name:"temp_session_id",type:"long"},{name:"expires_at",type:"int"}],type:"BindAuthKeyInner"},{id:-212046591,predicate:"rpc_result",params:[{name:"req_msg_id",type:"long"},{name:"result",type:"Object"}],type:"RpcResult"},{id:558156313,predicate:"rpc_error",params:[{name:"error_code",type:"int"},{name:"error_message",type:"string"}],type:"RpcError"},{id:1579864942,predicate:"rpc_answer_unknown",params:[],type:"RpcDropAnswer"},{id:-847714938,predicate:"rpc_answer_dropped_running",params:[],type:"RpcDropAnswer"},{id:-1539647305,predicate:"rpc_answer_dropped",params:[{name:"msg_id",type:"long"},{name:"seq_no",type:"int"},{name:"bytes",type:"int"}],type:"RpcDropAnswer"},{id:155834844,predicate:"future_salt",params:[{name:"valid_since",type:"int"},{name:"valid_until",type:"int"},{name:"salt",type:"long"}],type:"FutureSalt"},{id:-1370486635,predicate:"future_salts",params:[{name:"req_msg_id",type:"long"},{name:"now",type:"int"},{name:"salts",type:"vector"}],type:"FutureSalts"},{id:880243653,predicate:"pong",params:[{name:"msg_id",type:"long"},{name:"ping_id",type:"long"}],type:"Pong"},{id:-501201412,predicate:"destroy_session_ok",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:1658015945,predicate:"destroy_session_none",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1631450872,predicate:"new_session_created",params:[{name:"first_msg_id",type:"long"},{name:"unique_id",type:"long"},{name:"server_salt",type:"long"}],type:"NewSession"},{id:1945237724,predicate:"msg_container",params:[{name:"messages",type:"vector<%Message>"}],type:"MessageContainer"},{id:1538843921,predicate:"message",params:[{name:"msg_id",type:"long"},{name:"seqno",type:"int"},{name:"bytes",type:"int"},{name:"body",type:"Object"}],type:"Message"},{id:-530561358,predicate:"msg_copy",params:[{name:"orig_message",type:"Message"}],type:"MessageCopy"},{id:812830625,predicate:"gzip_packed",params:[{name:"packed_data",type:"bytes"}],type:"Object"},{id:1658238041,predicate:"msgs_ack",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsAck"},{id:-1477445615,predicate:"bad_msg_notification",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"}],type:"BadMsgNotification"},{id:-307542917,predicate:"bad_server_salt",params:[{name:"bad_msg_id",type:"long"},{name:"bad_msg_seqno",type:"int"},{name:"error_code",type:"int"},{name:"new_server_salt",type:"long"}],type:"BadMsgNotification"},{id:2105940488,predicate:"msg_resend_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgResendReq"},{id:-630588590,predicate:"msgs_state_req",params:[{name:"msg_ids",type:"Vector"}],type:"MsgsStateReq"},{id:81704317,predicate:"msgs_state_info",params:[{name:"req_msg_id",type:"long"},{name:"info",type:"bytes"}],type:"MsgsStateInfo"},{id:-1933520591,predicate:"msgs_all_info",params:[{name:"msg_ids",type:"Vector"},{name:"info",type:"bytes"}],type:"MsgsAllInfo"},{id:661470918,predicate:"msg_detailed_info",params:[{name:"msg_id",type:"long"},{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-2137147681,predicate:"msg_new_detailed_info",params:[{name:"answer_msg_id",type:"long"},{name:"bytes",type:"int"},{name:"status",type:"int"}],type:"MsgDetailedInfo"},{id:-161422892,predicate:"destroy_auth_key_ok",params:[],type:"DestroyAuthKeyRes"},{id:178201177,predicate:"destroy_auth_key_none",params:[],type:"DestroyAuthKeyRes"},{id:-368010477,predicate:"destroy_auth_key_fail",params:[],type:"DestroyAuthKeyRes"}],methods:[{id:-1099002127,method:"req_pq_multi",params:[{name:"nonce",type:"int128"}],type:"ResPQ"},{id:-686627650,method:"req_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"p",type:"bytes"},{name:"q",type:"bytes"},{name:"public_key_fingerprint",type:"long"},{name:"encrypted_data",type:"bytes"}],type:"Server_DH_Params"},{id:-184262881,method:"set_client_DH_params",params:[{name:"nonce",type:"int128"},{name:"server_nonce",type:"int128"},{name:"encrypted_data",type:"bytes"}],type:"Set_client_DH_params_answer"},{id:1491380032,method:"rpc_drop_answer",params:[{name:"req_msg_id",type:"long"}],type:"RpcDropAnswer"},{id:-1188971260,method:"get_future_salts",params:[{name:"num",type:"int"}],type:"FutureSalts"},{id:2059302892,method:"ping",params:[{name:"ping_id",type:"long"}],type:"Pong"},{id:-213746804,method:"ping_delay_disconnect",params:[{name:"ping_id",type:"long"},{name:"disconnect_delay",type:"int"}],type:"Pong"},{id:-414113498,method:"destroy_session",params:[{name:"session_id",type:"long"}],type:"DestroySessionRes"},{id:-1835453025,method:"http_wait",params:[{name:"max_delay",type:"int"},{name:"wait_after",type:"int"},{name:"max_wait",type:"int"}],type:"HttpWait"},{id:-784117408,method:"destroy_auth_key",params:[],type:"DestroyAuthKeyRes"}]},API:{constructors:[{id:-1132882121,predicate:"boolFalse",params:[],type:"Bool"},{id:-1720552011,predicate:"boolTrue",params:[],type:"Bool"},{id:1072550713,predicate:"true",params:[],type:"True"},{id:481674261,predicate:"vector",params:[],type:"Vector t"},{id:-994444869,predicate:"error",params:[{name:"code",type:"int"},{name:"text",type:"string"}],type:"Error"},{id:1450380236,predicate:"null",params:[],type:"Null"},{id:2134579434,predicate:"inputPeerEmpty",params:[],type:"InputPeer"},{id:2107670217,predicate:"inputPeerSelf",params:[],type:"InputPeer"},{id:900291769,predicate:"inputPeerChat",params:[{name:"chat_id",type:"long"}],type:"InputPeer"},{id:-1182234929,predicate:"inputUserEmpty",params:[],type:"InputUser"},{id:-138301121,predicate:"inputUserSelf",params:[],type:"InputUser"},{id:-208488460,predicate:"inputPhoneContact",params:[{name:"client_id",type:"long"},{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"InputContact"},{id:-181407105,predicate:"inputFile",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"},{name:"md5_checksum",type:"string"}],type:"InputFile"},{id:-1771768449,predicate:"inputMediaEmpty",params:[],type:"InputMedia"},{id:505969924,predicate:"inputMediaUploadedPhoto",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.2?true"},{name:"file",type:"InputFile"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:-1279654347,predicate:"inputMediaPhoto",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.1?true"},{name:"id",type:"InputPhoto"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-104578748,predicate:"inputMediaGeoPoint",params:[{name:"geo_point",type:"InputGeoPoint"}],type:"InputMedia"},{id:-122978821,predicate:"inputMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"}],type:"InputMedia"},{id:480546647,predicate:"inputChatPhotoEmpty",params:[],type:"InputChatPhoto"},{id:-968723890,predicate:"inputChatUploadedPhoto",params:[{name:"flags",type:"#"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"InputChatPhoto"},{id:-1991004873,predicate:"inputChatPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputChatPhoto"},{id:-457104426,predicate:"inputGeoPointEmpty",params:[],type:"InputGeoPoint"},{id:1210199983,predicate:"inputGeoPoint",params:[{name:"flags",type:"#"},{name:"lat",type:"double"},{name:"long",type:"double"},{name:"accuracy_radius",type:"flags.0?int"}],type:"InputGeoPoint"},{id:483901197,predicate:"inputPhotoEmpty",params:[],type:"InputPhoto"},{id:1001634122,predicate:"inputPhoto",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputPhoto"},{id:-539317279,predicate:"inputFileLocation",params:[{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputFileLocation"},{id:1498486562,predicate:"peerUser",params:[{name:"user_id",type:"long"}],type:"Peer"},{id:918946202,predicate:"peerChat",params:[{name:"chat_id",type:"long"}],type:"Peer"},{id:-1432995067,predicate:"storage.fileUnknown",params:[],type:"storage.FileType"},{id:1086091090,predicate:"storage.filePartial",params:[],type:"storage.FileType"},{id:8322574,predicate:"storage.fileJpeg",params:[],type:"storage.FileType"},{id:-891180321,predicate:"storage.fileGif",params:[],type:"storage.FileType"},{id:172975040,predicate:"storage.filePng",params:[],type:"storage.FileType"},{id:-1373745011,predicate:"storage.filePdf",params:[],type:"storage.FileType"},{id:1384777335,predicate:"storage.fileMp3",params:[],type:"storage.FileType"},{id:1258941372,predicate:"storage.fileMov",params:[],type:"storage.FileType"},{id:-1278304028,predicate:"storage.fileMp4",params:[],type:"storage.FileType"},{id:276907596,predicate:"storage.fileWebp",params:[],type:"storage.FileType"},{id:-742634630,predicate:"userEmpty",params:[{name:"id",type:"long"}],type:"User"},{id:1326562017,predicate:"userProfilePhotoEmpty",params:[],type:"UserProfilePhoto"},{id:-2100168954,predicate:"userProfilePhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"personal",type:"flags.2?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"UserProfilePhoto"},{id:164646985,predicate:"userStatusEmpty",params:[],type:"UserStatus"},{id:-306628279,predicate:"userStatusOnline",params:[{name:"expires",type:"int"}],type:"UserStatus"},{id:9203775,predicate:"userStatusOffline",params:[{name:"was_online",type:"int"}],type:"UserStatus"},{id:693512293,predicate:"chatEmpty",params:[{name:"id",type:"long"}],type:"Chat"},{id:1103884886,predicate:"chat",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"left",type:"flags.2?true"},{name:"deactivated",type:"flags.5?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"noforwards",type:"flags.25?true"},{name:"id",type:"long"},{name:"title",type:"string"},{name:"photo",type:"ChatPhoto"},{name:"participants_count",type:"int"},{name:"date",type:"int"},{name:"version",type:"int"},{name:"migrated_to",type:"flags.6?InputChannel"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"}],type:"Chat"},{id:1704108455,predicate:"chatForbidden",params:[{name:"id",type:"long"},{name:"title",type:"string"}],type:"Chat"},{id:-908914376,predicate:"chatFull",params:[{name:"flags",type:"#"},{name:"can_set_username",type:"flags.7?true"},{name:"has_scheduled",type:"flags.8?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants",type:"ChatParticipants"},{name:"chat_photo",type:"flags.2?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.13?ExportedChatInvite"},{name:"bot_info",type:"flags.3?Vector"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"folder_id",type:"flags.11?int"},{name:"call",type:"flags.12?InputGroupCall"},{name:"ttl_period",type:"flags.14?int"},{name:"groupcall_default_join_as",type:"flags.15?Peer"},{name:"theme_emoticon",type:"flags.16?string"},{name:"requests_pending",type:"flags.17?int"},{name:"recent_requesters",type:"flags.17?Vector"},{name:"available_reactions",type:"flags.18?ChatReactions"}],type:"ChatFull"},{id:-1070776313,predicate:"chatParticipant",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-2023500831,predicate:"chatParticipantsForbidden",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"self_participant",type:"flags.0?ChatParticipant"}],type:"ChatParticipants"},{id:1018991608,predicate:"chatParticipants",params:[{name:"chat_id",type:"long"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"ChatParticipants"},{id:935395612,predicate:"chatPhotoEmpty",params:[],type:"ChatPhoto"},{id:476978193,predicate:"chatPhoto",params:[{name:"flags",type:"#"},{name:"has_video",type:"flags.0?true"},{name:"photo_id",type:"long"},{name:"stripped_thumb",type:"flags.1?bytes"},{name:"dc_id",type:"int"}],type:"ChatPhoto"},{id:-1868117372,predicate:"messageEmpty",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"peer_id",type:"flags.0?Peer"}],type:"Message"},{id:940666592,predicate:"message",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"from_scheduled",type:"flags.18?true"},{name:"legacy",type:"flags.19?true"},{name:"edit_hide",type:"flags.21?true"},{name:"pinned",type:"flags.24?true"},{name:"noforwards",type:"flags.26?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"message",type:"string"},{name:"media",type:"flags.9?MessageMedia"},{name:"reply_markup",type:"flags.6?ReplyMarkup"},{name:"entities",type:"flags.7?Vector"},{name:"views",type:"flags.10?int"},{name:"forwards",type:"flags.10?int"},{name:"replies",type:"flags.23?MessageReplies"},{name:"edit_date",type:"flags.15?int"},{name:"post_author",type:"flags.16?string"},{name:"grouped_id",type:"flags.17?long"},{name:"reactions",type:"flags.20?MessageReactions"},{name:"restriction_reason",type:"flags.22?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:721967202,predicate:"messageService",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"post",type:"flags.14?true"},{name:"legacy",type:"flags.19?true"},{name:"id",type:"int"},{name:"from_id",type:"flags.8?Peer"},{name:"peer_id",type:"Peer"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"date",type:"int"},{name:"action",type:"MessageAction"},{name:"ttl_period",type:"flags.25?int"}],type:"Message"},{id:1038967584,predicate:"messageMediaEmpty",params:[],type:"MessageMedia"},{id:1766936791,predicate:"messageMediaPhoto",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.3?true"},{name:"photo",type:"flags.0?Photo"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:1457575028,predicate:"messageMediaGeo",params:[{name:"geo",type:"GeoPoint"}],type:"MessageMedia"},{id:1882335561,predicate:"messageMediaContact",params:[{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"user_id",type:"long"}],type:"MessageMedia"},{id:-1618676578,predicate:"messageMediaUnsupported",params:[],type:"MessageMedia"},{id:-1230047312,predicate:"messageActionEmpty",params:[],type:"MessageAction"},{id:-1119368275,predicate:"messageActionChatCreate",params:[{name:"title",type:"string"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1247687078,predicate:"messageActionChatEditTitle",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:2144015272,predicate:"messageActionChatEditPhoto",params:[{name:"photo",type:"Photo"}],type:"MessageAction"},{id:-1780220945,predicate:"messageActionChatDeletePhoto",params:[],type:"MessageAction"},{id:365886720,predicate:"messageActionChatAddUser",params:[{name:"users",type:"Vector"}],type:"MessageAction"},{id:-1539362612,predicate:"messageActionChatDeleteUser",params:[{name:"user_id",type:"long"}],type:"MessageAction"},{id:-712374074,predicate:"dialog",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"unread_mark",type:"flags.3?true"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"unread_mentions_count",type:"int"},{name:"unread_reactions_count",type:"int"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"pts",type:"flags.0?int"},{name:"draft",type:"flags.1?DraftMessage"},{name:"folder_id",type:"flags.4?int"},{name:"ttl_period",type:"flags.5?int"}],type:"Dialog"},{id:590459437,predicate:"photoEmpty",params:[{name:"id",type:"long"}],type:"Photo"},{id:-82216347,predicate:"photo",params:[{name:"flags",type:"#"},{name:"has_stickers",type:"flags.0?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"sizes",type:"Vector"},{name:"video_sizes",type:"flags.1?Vector"},{name:"dc_id",type:"int"}],type:"Photo"},{id:236446268,predicate:"photoSizeEmpty",params:[{name:"type",type:"string"}],type:"PhotoSize"},{id:1976012384,predicate:"photoSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"}],type:"PhotoSize"},{id:35527382,predicate:"photoCachedSize",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:286776671,predicate:"geoPointEmpty",params:[],type:"GeoPoint"},{id:-1297942941,predicate:"geoPoint",params:[{name:"flags",type:"#"},{name:"long",type:"double"},{name:"lat",type:"double"},{name:"access_hash",type:"long"},{name:"accuracy_radius",type:"flags.0?int"}],type:"GeoPoint"},{id:1577067778,predicate:"auth.sentCode",params:[{name:"flags",type:"#"},{name:"type",type:"auth.SentCodeType"},{name:"phone_code_hash",type:"string"},{name:"next_type",type:"flags.1?auth.CodeType"},{name:"timeout",type:"flags.2?int"}],type:"auth.SentCode"},{id:872119224,predicate:"auth.authorization",params:[{name:"flags",type:"#"},{name:"setup_password_required",type:"flags.1?true"},{name:"otherwise_relogin_days",type:"flags.1?int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"user",type:"User"}],type:"auth.Authorization"},{id:-1271602504,predicate:"auth.exportedAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.ExportedAuthorization"},{id:-1195615476,predicate:"inputNotifyPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputNotifyPeer"},{id:423314455,predicate:"inputNotifyUsers",params:[],type:"InputNotifyPeer"},{id:1251338318,predicate:"inputNotifyChats",params:[],type:"InputNotifyPeer"},{id:-551616469,predicate:"inputPeerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"sound",type:"flags.3?NotificationSound"}],type:"InputPeerNotifySettings"},{id:-1472527322,predicate:"peerNotifySettings",params:[{name:"flags",type:"#"},{name:"show_previews",type:"flags.0?Bool"},{name:"silent",type:"flags.1?Bool"},{name:"mute_until",type:"flags.2?int"},{name:"ios_sound",type:"flags.3?NotificationSound"},{name:"android_sound",type:"flags.4?NotificationSound"},{name:"other_sound",type:"flags.5?NotificationSound"}],type:"PeerNotifySettings"},{id:-1525149427,predicate:"peerSettings",params:[{name:"flags",type:"#"},{name:"report_spam",type:"flags.0?true"},{name:"add_contact",type:"flags.1?true"},{name:"block_contact",type:"flags.2?true"},{name:"share_contact",type:"flags.3?true"},{name:"need_contacts_exception",type:"flags.4?true"},{name:"report_geo",type:"flags.5?true"},{name:"autoarchived",type:"flags.7?true"},{name:"invite_members",type:"flags.8?true"},{name:"request_chat_broadcast",type:"flags.10?true"},{name:"geo_distance",type:"flags.6?int"},{name:"request_chat_title",type:"flags.9?string"},{name:"request_chat_date",type:"flags.9?int"}],type:"PeerSettings"},{id:-1539849235,predicate:"wallPaper",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"pattern",type:"flags.3?true"},{name:"dark",type:"flags.4?true"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"document",type:"Document"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:1490799288,predicate:"inputReportReasonSpam",params:[],type:"ReportReason"},{id:505595789,predicate:"inputReportReasonViolence",params:[],type:"ReportReason"},{id:777640226,predicate:"inputReportReasonPornography",params:[],type:"ReportReason"},{id:-1376497949,predicate:"inputReportReasonChildAbuse",params:[],type:"ReportReason"},{id:-1041980751,predicate:"inputReportReasonOther",params:[],type:"ReportReason"},{id:-120378643,predicate:"userFull",params:[{name:"flags",type:"#"},{name:"blocked",type:"flags.0?true"},{name:"phone_calls_available",type:"flags.4?true"},{name:"phone_calls_private",type:"flags.5?true"},{name:"can_pin_message",type:"flags.7?true"},{name:"has_scheduled",type:"flags.12?true"},{name:"video_calls_available",type:"flags.13?true"},{name:"voice_messages_forbidden",type:"flags.20?true"},{name:"id",type:"long"},{name:"about",type:"flags.1?string"},{name:"settings",type:"PeerSettings"},{name:"personal_photo",type:"flags.21?Photo"},{name:"profile_photo",type:"flags.2?Photo"},{name:"fallback_photo",type:"flags.22?Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"bot_info",type:"flags.3?BotInfo"},{name:"pinned_msg_id",type:"flags.6?int"},{name:"common_chats_count",type:"int"},{name:"folder_id",type:"flags.11?int"},{name:"ttl_period",type:"flags.14?int"},{name:"theme_emoticon",type:"flags.15?string"},{name:"private_forward_name",type:"flags.16?string"},{name:"bot_group_admin_rights",type:"flags.17?ChatAdminRights"},{name:"bot_broadcast_admin_rights",type:"flags.18?ChatAdminRights"},{name:"premium_gifts",type:"flags.19?Vector"}],type:"UserFull"},{id:341499403,predicate:"contact",params:[{name:"user_id",type:"long"},{name:"mutual",type:"Bool"}],type:"Contact"},{id:-1052885936,predicate:"importedContact",params:[{name:"user_id",type:"long"},{name:"client_id",type:"long"}],type:"ImportedContact"},{id:383348795,predicate:"contactStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"ContactStatus"},{id:-1219778094,predicate:"contacts.contactsNotModified",params:[],type:"contacts.Contacts"},{id:-353862078,predicate:"contacts.contacts",params:[{name:"contacts",type:"Vector"},{name:"saved_count",type:"int"},{name:"users",type:"Vector"}],type:"contacts.Contacts"},{id:2010127419,predicate:"contacts.importedContacts",params:[{name:"imported",type:"Vector"},{name:"popular_invites",type:"Vector"},{name:"retry_contacts",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ImportedContacts"},{id:182326673,predicate:"contacts.blocked",params:[{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:-513392236,predicate:"contacts.blockedSlice",params:[{name:"count",type:"int"},{name:"blocked",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Blocked"},{id:364538944,predicate:"messages.dialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:1910543603,predicate:"messages.dialogsSlice",params:[{name:"count",type:"int"},{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Dialogs"},{id:-1938715001,predicate:"messages.messages",params:[{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:978610270,predicate:"messages.messagesSlice",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"count",type:"int"},{name:"next_rate",type:"flags.0?int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:1694474197,predicate:"messages.chats",params:[{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-438840932,predicate:"messages.chatFull",params:[{name:"full_chat",type:"ChatFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatFull"},{id:-1269012015,predicate:"messages.affectedHistory",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"}],type:"messages.AffectedHistory"},{id:1474492012,predicate:"inputMessagesFilterEmpty",params:[],type:"MessagesFilter"},{id:-1777752804,predicate:"inputMessagesFilterPhotos",params:[],type:"MessagesFilter"},{id:-1614803355,predicate:"inputMessagesFilterVideo",params:[],type:"MessagesFilter"},{id:1458172132,predicate:"inputMessagesFilterPhotoVideo",params:[],type:"MessagesFilter"},{id:-1629621880,predicate:"inputMessagesFilterDocument",params:[],type:"MessagesFilter"},{id:2129714567,predicate:"inputMessagesFilterUrl",params:[],type:"MessagesFilter"},{id:-3644025,predicate:"inputMessagesFilterGif",params:[],type:"MessagesFilter"},{id:522914557,predicate:"updateNewMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1318109142,predicate:"updateMessageID",params:[{name:"id",type:"int"},{name:"random_id",type:"long"}],type:"Update"},{id:-1576161051,predicate:"updateDeleteMessages",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1071741569,predicate:"updateUserTyping",params:[{name:"user_id",type:"long"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-2092401936,predicate:"updateChatUserTyping",params:[{name:"chat_id",type:"long"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:125178264,predicate:"updateChatParticipants",params:[{name:"participants",type:"ChatParticipants"}],type:"Update"},{id:-440534818,predicate:"updateUserStatus",params:[{name:"user_id",type:"long"},{name:"status",type:"UserStatus"}],type:"Update"},{id:-1484486364,predicate:"updateUserName",params:[{name:"user_id",type:"long"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"usernames",type:"Vector"}],type:"Update"},{id:-1519637954,predicate:"updates.state",params:[{name:"pts",type:"int"},{name:"qts",type:"int"},{name:"date",type:"int"},{name:"seq",type:"int"},{name:"unread_count",type:"int"}],type:"updates.State"},{id:1567990072,predicate:"updates.differenceEmpty",params:[{name:"date",type:"int"},{name:"seq",type:"int"}],type:"updates.Difference"},{id:16030880,predicate:"updates.difference",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"updates.Difference"},{id:-1459938943,predicate:"updates.differenceSlice",params:[{name:"new_messages",type:"Vector"},{name:"new_encrypted_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"intermediate_state",type:"updates.State"}],type:"updates.Difference"},{id:-484987010,predicate:"updatesTooLong",params:[],type:"Updates"},{id:826001400,predicate:"updateShortMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"user_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:1299050149,predicate:"updateShortChatMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"mentioned",type:"flags.4?true"},{name:"media_unread",type:"flags.5?true"},{name:"silent",type:"flags.13?true"},{name:"id",type:"int"},{name:"from_id",type:"long"},{name:"chat_id",type:"long"},{name:"message",type:"string"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"fwd_from",type:"flags.2?MessageFwdHeader"},{name:"via_bot_id",type:"flags.11?long"},{name:"reply_to",type:"flags.3?MessageReplyHeader"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:2027216577,predicate:"updateShort",params:[{name:"update",type:"Update"},{name:"date",type:"int"}],type:"Updates"},{id:1918567619,predicate:"updatesCombined",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq_start",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:1957577280,predicate:"updates",params:[{name:"updates",type:"Vector"},{name:"users",type:"Vector"},{name:"chats",type:"Vector"},{name:"date",type:"int"},{name:"seq",type:"int"}],type:"Updates"},{id:-1916114267,predicate:"photos.photos",params:[{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:352657236,predicate:"photos.photosSlice",params:[{name:"count",type:"int"},{name:"photos",type:"Vector"},{name:"users",type:"Vector"}],type:"photos.Photos"},{id:539045032,predicate:"photos.photo",params:[{name:"photo",type:"Photo"},{name:"users",type:"Vector"}],type:"photos.Photo"},{id:157948117,predicate:"upload.file",params:[{name:"type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.File"},{id:414687501,predicate:"dcOption",params:[{name:"flags",type:"#"},{name:"ipv6",type:"flags.0?true"},{name:"media_only",type:"flags.1?true"},{name:"tcpo_only",type:"flags.2?true"},{name:"cdn",type:"flags.3?true"},{name:"static",type:"flags.4?true"},{name:"this_port_only",type:"flags.5?true"},{name:"id",type:"int"},{name:"ip_address",type:"string"},{name:"port",type:"int"},{name:"secret",type:"flags.10?bytes"}],type:"DcOption"},{id:589653676,predicate:"config",params:[{name:"flags",type:"#"},{name:"phonecalls_enabled",type:"flags.1?true"},{name:"default_p2p_contacts",type:"flags.3?true"},{name:"preload_featured_stickers",type:"flags.4?true"},{name:"ignore_phone_entities",type:"flags.5?true"},{name:"revoke_pm_inbox",type:"flags.6?true"},{name:"blocked_mode",type:"flags.8?true"},{name:"pfs_enabled",type:"flags.13?true"},{name:"force_try_ipv6",type:"flags.14?true"},{name:"date",type:"int"},{name:"expires",type:"int"},{name:"test_mode",type:"Bool"},{name:"this_dc",type:"int"},{name:"dc_options",type:"Vector"},{name:"dc_txt_domain_name",type:"string"},{name:"chat_size_max",type:"int"},{name:"megagroup_size_max",type:"int"},{name:"forwarded_count_max",type:"int"},{name:"online_update_period_ms",type:"int"},{name:"offline_blur_timeout_ms",type:"int"},{name:"offline_idle_timeout_ms",type:"int"},{name:"online_cloud_timeout_ms",type:"int"},{name:"notify_cloud_delay_ms",type:"int"},{name:"notify_default_delay_ms",type:"int"},{name:"push_chat_period_ms",type:"int"},{name:"push_chat_limit",type:"int"},{name:"saved_gifs_limit",type:"int"},{name:"edit_time_limit",type:"int"},{name:"revoke_time_limit",type:"int"},{name:"revoke_pm_time_limit",type:"int"},{name:"rating_e_decay",type:"int"},{name:"stickers_recent_limit",type:"int"},{name:"stickers_faved_limit",type:"int"},{name:"channels_read_media_period",type:"int"},{name:"tmp_sessions",type:"flags.0?int"},{name:"pinned_dialogs_count_max",type:"int"},{name:"pinned_infolder_count_max",type:"int"},{name:"call_receive_timeout_ms",type:"int"},{name:"call_ring_timeout_ms",type:"int"},{name:"call_connect_timeout_ms",type:"int"},{name:"call_packet_timeout_ms",type:"int"},{name:"me_url_prefix",type:"string"},{name:"autoupdate_url_prefix",type:"flags.7?string"},{name:"gif_search_username",type:"flags.9?string"},{name:"venue_search_username",type:"flags.10?string"},{name:"img_search_username",type:"flags.11?string"},{name:"static_maps_provider",type:"flags.12?string"},{name:"caption_length_max",type:"int"},{name:"message_length_max",type:"int"},{name:"webfile_dc_id",type:"int"},{name:"suggested_lang_code",type:"flags.2?string"},{name:"lang_pack_version",type:"flags.2?int"},{name:"base_lang_pack_version",type:"flags.2?int"},{name:"reactions_default",type:"flags.15?Reaction"}],type:"Config"},{id:-1910892683,predicate:"nearestDc",params:[{name:"country",type:"string"},{name:"this_dc",type:"int"},{name:"nearest_dc",type:"int"}],type:"NearestDc"},{id:-860107216,predicate:"help.appUpdate",params:[{name:"flags",type:"#"},{name:"can_not_skip",type:"flags.0?true"},{name:"id",type:"int"},{name:"version",type:"string"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"document",type:"flags.1?Document"},{name:"url",type:"flags.2?string"},{name:"sticker",type:"flags.3?Document"}],type:"help.AppUpdate"},{id:-1000708810,predicate:"help.noAppUpdate",params:[],type:"help.AppUpdate"},{id:415997816,predicate:"help.inviteText",params:[{name:"message",type:"string"}],type:"help.InviteText"},{id:314359194,predicate:"updateNewEncryptedMessage",params:[{name:"message",type:"EncryptedMessage"},{name:"qts",type:"int"}],type:"Update"},{id:386986326,predicate:"updateEncryptedChatTyping",params:[{name:"chat_id",type:"int"}],type:"Update"},{id:-1264392051,predicate:"updateEncryption",params:[{name:"chat",type:"EncryptedChat"},{name:"date",type:"int"}],type:"Update"},{id:956179895,predicate:"updateEncryptedMessagesRead",params:[{name:"chat_id",type:"int"},{name:"max_date",type:"int"},{name:"date",type:"int"}],type:"Update"},{id:-1417756512,predicate:"encryptedChatEmpty",params:[{name:"id",type:"int"}],type:"EncryptedChat"},{id:1722964307,predicate:"encryptedChatWaiting",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"}],type:"EncryptedChat"},{id:1223809356,predicate:"encryptedChatRequested",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1643173063,predicate:"encryptedChat",params:[{name:"id",type:"int"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:505183301,predicate:"encryptedChatDiscarded",params:[{name:"flags",type:"#"},{name:"history_deleted",type:"flags.0?true"},{name:"id",type:"int"}],type:"EncryptedChat"},{id:-247351839,predicate:"inputEncryptedChat",params:[{name:"chat_id",type:"int"},{name:"access_hash",type:"long"}],type:"InputEncryptedChat"},{id:-1038136962,predicate:"encryptedFileEmpty",params:[],type:"EncryptedFile"},{id:-1476358952,predicate:"encryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"long"},{name:"dc_id",type:"int"},{name:"key_fingerprint",type:"int"}],type:"EncryptedFile"},{id:406307684,predicate:"inputEncryptedFileEmpty",params:[],type:"InputEncryptedFile"},{id:1690108678,predicate:"inputEncryptedFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1511503333,predicate:"inputEncryptedFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputEncryptedFile"},{id:-182231723,predicate:"inputEncryptedFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:-317144808,predicate:"encryptedMessage",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"},{name:"file",type:"EncryptedFile"}],type:"EncryptedMessage"},{id:594758406,predicate:"encryptedMessageService",params:[{name:"random_id",type:"long"},{name:"chat_id",type:"int"},{name:"date",type:"int"},{name:"bytes",type:"bytes"}],type:"EncryptedMessage"},{id:-1058912715,predicate:"messages.dhConfigNotModified",params:[{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:740433629,predicate:"messages.dhConfig",params:[{name:"g",type:"int"},{name:"p",type:"bytes"},{name:"version",type:"int"},{name:"random",type:"bytes"}],type:"messages.DhConfig"},{id:1443858741,predicate:"messages.sentEncryptedMessage",params:[{name:"date",type:"int"}],type:"messages.SentEncryptedMessage"},{id:-1802240206,predicate:"messages.sentEncryptedFile",params:[{name:"date",type:"int"},{name:"file",type:"EncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:-95482955,predicate:"inputFileBig",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"name",type:"string"}],type:"InputFile"},{id:767652808,predicate:"inputEncryptedFileBigUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"key_fingerprint",type:"int"}],type:"InputEncryptedFile"},{id:1037718609,predicate:"updateChatParticipantAdd",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"},{name:"version",type:"int"}],type:"Update"},{id:-483443337,predicate:"updateChatParticipantDelete",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"version",type:"int"}],type:"Update"},{id:-1906403213,predicate:"updateDcOptions",params:[{name:"dc_options",type:"Vector"}],type:"Update"},{id:1530447553,predicate:"inputMediaUploadedDocument",params:[{name:"flags",type:"#"},{name:"nosound_video",type:"flags.3?true"},{name:"force_file",type:"flags.4?true"},{name:"spoiler",type:"flags.5?true"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.2?InputFile"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"},{name:"stickers",type:"flags.0?Vector"},{name:"ttl_seconds",type:"flags.1?int"}],type:"InputMedia"},{id:860303448,predicate:"inputMediaDocument",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.2?true"},{name:"id",type:"InputDocument"},{name:"ttl_seconds",type:"flags.0?int"},{name:"query",type:"flags.1?string"}],type:"InputMedia"},{id:-1666158377,predicate:"messageMediaDocument",params:[{name:"flags",type:"#"},{name:"nopremium",type:"flags.3?true"},{name:"spoiler",type:"flags.4?true"},{name:"document",type:"flags.0?Document"},{name:"ttl_seconds",type:"flags.2?int"}],type:"MessageMedia"},{id:1928391342,predicate:"inputDocumentEmpty",params:[],type:"InputDocument"},{id:448771445,predicate:"inputDocument",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"}],type:"InputDocument"},{id:-1160743548,predicate:"inputDocumentFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:922273905,predicate:"documentEmpty",params:[{name:"id",type:"long"}],type:"Document"},{id:-1881881384,predicate:"document",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"date",type:"int"},{name:"mime_type",type:"string"},{name:"size",type:"long"},{name:"thumbs",type:"flags.0?Vector"},{name:"video_thumbs",type:"flags.1?Vector"},{name:"dc_id",type:"int"},{name:"attributes",type:"Vector"}],type:"Document"},{id:398898678,predicate:"help.support",params:[{name:"phone_number",type:"string"},{name:"user",type:"User"}],type:"help.Support"},{id:-1613493288,predicate:"notifyPeer",params:[{name:"peer",type:"Peer"}],type:"NotifyPeer"},{id:-1261946036,predicate:"notifyUsers",params:[],type:"NotifyPeer"},{id:-1073230141,predicate:"notifyChats",params:[],type:"NotifyPeer"},{id:-1094555409,predicate:"updateNotifySettings",params:[{name:"peer",type:"NotifyPeer"},{name:"notify_settings",type:"PeerNotifySettings"}],type:"Update"},{id:381645902,predicate:"sendMessageTypingAction",params:[],type:"SendMessageAction"},{id:-44119819,predicate:"sendMessageCancelAction",params:[],type:"SendMessageAction"},{id:-1584933265,predicate:"sendMessageRecordVideoAction",params:[],type:"SendMessageAction"},{id:-378127636,predicate:"sendMessageUploadVideoAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-718310409,predicate:"sendMessageRecordAudioAction",params:[],type:"SendMessageAction"},{id:-212740181,predicate:"sendMessageUploadAudioAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-774682074,predicate:"sendMessageUploadPhotoAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-1441998364,predicate:"sendMessageUploadDocumentAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:393186209,predicate:"sendMessageGeoLocationAction",params:[],type:"SendMessageAction"},{id:1653390447,predicate:"sendMessageChooseContactAction",params:[],type:"SendMessageAction"},{id:-1290580579,predicate:"contacts.found",params:[{name:"my_results",type:"Vector"},{name:"results",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.Found"},{id:-337352679,predicate:"updateServiceNotification",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"inbox_date",type:"flags.1?int"},{name:"type",type:"string"},{name:"message",type:"string"},{name:"media",type:"MessageMedia"},{name:"entities",type:"Vector"}],type:"Update"},{id:-496024847,predicate:"userStatusRecently",params:[],type:"UserStatus"},{id:129960444,predicate:"userStatusLastWeek",params:[],type:"UserStatus"},{id:2011940674,predicate:"userStatusLastMonth",params:[],type:"UserStatus"},{id:-298113238,predicate:"updatePrivacy",params:[{name:"key",type:"PrivacyKey"},{name:"rules",type:"Vector"}],type:"Update"},{id:1335282456,predicate:"inputPrivacyKeyStatusTimestamp",params:[],type:"InputPrivacyKey"},{id:-1137792208,predicate:"privacyKeyStatusTimestamp",params:[],type:"PrivacyKey"},{id:218751099,predicate:"inputPrivacyValueAllowContacts",params:[],type:"InputPrivacyRule"},{id:407582158,predicate:"inputPrivacyValueAllowAll",params:[],type:"InputPrivacyRule"},{id:320652927,predicate:"inputPrivacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"InputPrivacyRule"},{id:195371015,predicate:"inputPrivacyValueDisallowContacts",params:[],type:"InputPrivacyRule"},{id:-697604407,predicate:"inputPrivacyValueDisallowAll",params:[],type:"InputPrivacyRule"},{id:-1877932953,predicate:"inputPrivacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"InputPrivacyRule"},{id:-123988,predicate:"privacyValueAllowContacts",params:[],type:"PrivacyRule"},{id:1698855810,predicate:"privacyValueAllowAll",params:[],type:"PrivacyRule"},{id:-1198497870,predicate:"privacyValueAllowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:-125240806,predicate:"privacyValueDisallowContacts",params:[],type:"PrivacyRule"},{id:-1955338397,predicate:"privacyValueDisallowAll",params:[],type:"PrivacyRule"},{id:-463335103,predicate:"privacyValueDisallowUsers",params:[{name:"users",type:"Vector"}],type:"PrivacyRule"},{id:1352683077,predicate:"account.privacyRules",params:[{name:"rules",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"account.PrivacyRules"},{id:-1194283041,predicate:"accountDaysTTL",params:[{name:"days",type:"int"}],type:"AccountDaysTTL"},{id:88680979,predicate:"updateUserPhone",params:[{name:"user_id",type:"long"},{name:"phone",type:"string"}],type:"Update"},{id:1815593308,predicate:"documentAttributeImageSize",params:[{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:297109817,predicate:"documentAttributeAnimated",params:[],type:"DocumentAttribute"},{id:1662637586,predicate:"documentAttributeSticker",params:[{name:"flags",type:"#"},{name:"mask",type:"flags.1?true"},{name:"alt",type:"string"},{name:"stickerset",type:"InputStickerSet"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"DocumentAttribute"},{id:250621158,predicate:"documentAttributeVideo",params:[{name:"flags",type:"#"},{name:"round_message",type:"flags.0?true"},{name:"supports_streaming",type:"flags.1?true"},{name:"duration",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"DocumentAttribute"},{id:-1739392570,predicate:"documentAttributeAudio",params:[{name:"flags",type:"#"},{name:"voice",type:"flags.10?true"},{name:"duration",type:"int"},{name:"title",type:"flags.0?string"},{name:"performer",type:"flags.1?string"},{name:"waveform",type:"flags.2?bytes"}],type:"DocumentAttribute"},{id:358154344,predicate:"documentAttributeFilename",params:[{name:"file_name",type:"string"}],type:"DocumentAttribute"},{id:-244016606,predicate:"messages.stickersNotModified",params:[],type:"messages.Stickers"},{id:816245886,predicate:"messages.stickers",params:[{name:"hash",type:"long"},{name:"stickers",type:"Vector"}],type:"messages.Stickers"},{id:313694676,predicate:"stickerPack",params:[{name:"emoticon",type:"string"},{name:"documents",type:"Vector"}],type:"StickerPack"},{id:-395967805,predicate:"messages.allStickersNotModified",params:[],type:"messages.AllStickers"},{id:-843329861,predicate:"messages.allStickers",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.AllStickers"},{id:-1667805217,predicate:"updateReadHistoryInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:791617983,predicate:"updateReadHistoryOutbox",params:[{name:"peer",type:"Peer"},{name:"max_id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-2066640507,predicate:"messages.affectedMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"messages.AffectedMessages"},{id:2139689491,predicate:"updateWebPage",params:[{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-350980120,predicate:"webPageEmpty",params:[{name:"id",type:"long"}],type:"WebPage"},{id:-981018084,predicate:"webPagePending",params:[{name:"id",type:"long"},{name:"date",type:"int"}],type:"WebPage"},{id:-392411726,predicate:"webPage",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"url",type:"string"},{name:"display_url",type:"string"},{name:"hash",type:"int"},{name:"type",type:"flags.0?string"},{name:"site_name",type:"flags.1?string"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"photo",type:"flags.4?Photo"},{name:"embed_url",type:"flags.5?string"},{name:"embed_type",type:"flags.5?string"},{name:"embed_width",type:"flags.6?int"},{name:"embed_height",type:"flags.6?int"},{name:"duration",type:"flags.7?int"},{name:"author",type:"flags.8?string"},{name:"document",type:"flags.9?Document"},{name:"cached_page",type:"flags.10?Page"},{name:"attributes",type:"flags.12?Vector"}],type:"WebPage"},{id:-1557277184,predicate:"messageMediaWebPage",params:[{name:"webpage",type:"WebPage"}],type:"MessageMedia"},{id:-1392388579,predicate:"authorization",params:[{name:"flags",type:"#"},{name:"current",type:"flags.0?true"},{name:"official_app",type:"flags.1?true"},{name:"password_pending",type:"flags.2?true"},{name:"encrypted_requests_disabled",type:"flags.3?true"},{name:"call_requests_disabled",type:"flags.4?true"},{name:"hash",type:"long"},{name:"device_model",type:"string"},{name:"platform",type:"string"},{name:"system_version",type:"string"},{name:"api_id",type:"int"},{name:"app_name",type:"string"},{name:"app_version",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"country",type:"string"},{name:"region",type:"string"}],type:"Authorization"},{id:1275039392,predicate:"account.authorizations",params:[{name:"authorization_ttl_days",type:"int"},{name:"authorizations",type:"Vector"}],type:"account.Authorizations"},{id:-1787080453,predicate:"account.password",params:[{name:"flags",type:"#"},{name:"has_recovery",type:"flags.0?true"},{name:"has_secure_values",type:"flags.1?true"},{name:"has_password",type:"flags.2?true"},{name:"current_algo",type:"flags.2?PasswordKdfAlgo"},{name:"srp_B",type:"flags.2?bytes"},{name:"srp_id",type:"flags.2?long"},{name:"hint",type:"flags.3?string"},{name:"email_unconfirmed_pattern",type:"flags.4?string"},{name:"new_algo",type:"PasswordKdfAlgo"},{name:"new_secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_random",type:"bytes"},{name:"pending_reset_date",type:"flags.5?int"},{name:"login_email_pattern",type:"flags.6?string"}],type:"account.Password"},{id:-1705233435,predicate:"account.passwordSettings",params:[{name:"flags",type:"#"},{name:"email",type:"flags.0?string"},{name:"secure_settings",type:"flags.1?SecureSecretSettings"}],type:"account.PasswordSettings"},{id:-1036572727,predicate:"account.passwordInputSettings",params:[{name:"flags",type:"#"},{name:"new_algo",type:"flags.0?PasswordKdfAlgo"},{name:"new_password_hash",type:"flags.0?bytes"},{name:"hint",type:"flags.0?string"},{name:"email",type:"flags.1?string"},{name:"new_secure_settings",type:"flags.2?SecureSecretSettings"}],type:"account.PasswordInputSettings"},{id:326715557,predicate:"auth.passwordRecovery",params:[{name:"email_pattern",type:"string"}],type:"auth.PasswordRecovery"},{id:-1052959727,predicate:"inputMediaVenue",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"InputMedia"},{id:784356159,predicate:"messageMediaVenue",params:[{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"}],type:"MessageMedia"},{id:-1551583367,predicate:"receivedNotifyMessage",params:[{name:"id",type:"int"},{name:"flags",type:"int"}],type:"ReceivedNotifyMessage"},{id:179611673,predicate:"chatInviteExported",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.0?true"},{name:"permanent",type:"flags.5?true"},{name:"request_needed",type:"flags.6?true"},{name:"link",type:"string"},{name:"admin_id",type:"long"},{name:"date",type:"int"},{name:"start_date",type:"flags.4?int"},{name:"expire_date",type:"flags.1?int"},{name:"usage_limit",type:"flags.2?int"},{name:"usage",type:"flags.3?int"},{name:"requested",type:"flags.7?int"},{name:"title",type:"flags.8?string"}],type:"ExportedChatInvite"},{id:1516793212,predicate:"chatInviteAlready",params:[{name:"chat",type:"Chat"}],type:"ChatInvite"},{id:806110401,predicate:"chatInvite",params:[{name:"flags",type:"#"},{name:"channel",type:"flags.0?true"},{name:"broadcast",type:"flags.1?true"},{name:"public",type:"flags.2?true"},{name:"megagroup",type:"flags.3?true"},{name:"request_needed",type:"flags.6?true"},{name:"title",type:"string"},{name:"about",type:"flags.5?string"},{name:"photo",type:"Photo"},{name:"participants_count",type:"int"},{name:"participants",type:"flags.4?Vector"}],type:"ChatInvite"},{id:51520707,predicate:"messageActionChatJoinedByLink",params:[{name:"inviter_id",type:"long"}],type:"MessageAction"},{id:1757493555,predicate:"updateReadMessagesContents",params:[{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-4838507,predicate:"inputStickerSetEmpty",params:[],type:"InputStickerSet"},{id:-1645763991,predicate:"inputStickerSetID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputStickerSet"},{id:-2044933984,predicate:"inputStickerSetShortName",params:[{name:"short_name",type:"string"}],type:"InputStickerSet"},{id:768691932,predicate:"stickerSet",params:[{name:"flags",type:"#"},{name:"archived",type:"flags.1?true"},{name:"official",type:"flags.2?true"},{name:"masks",type:"flags.3?true"},{name:"animated",type:"flags.5?true"},{name:"videos",type:"flags.6?true"},{name:"emojis",type:"flags.7?true"},{name:"installed_date",type:"flags.0?int"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumbs",type:"flags.4?Vector"},{name:"thumb_dc_id",type:"flags.4?int"},{name:"thumb_version",type:"flags.4?int"},{name:"thumb_document_id",type:"flags.8?long"},{name:"count",type:"int"},{name:"hash",type:"int"}],type:"StickerSet"},{id:1846886166,predicate:"messages.stickerSet",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"keywords",type:"Vector"},{name:"documents",type:"Vector"}],type:"messages.StickerSet"},{id:-1885878744,predicate:"user",params:[{name:"flags",type:"#"},{name:"self",type:"flags.10?true"},{name:"contact",type:"flags.11?true"},{name:"mutual_contact",type:"flags.12?true"},{name:"deleted",type:"flags.13?true"},{name:"bot",type:"flags.14?true"},{name:"bot_chat_history",type:"flags.15?true"},{name:"bot_nochats",type:"flags.16?true"},{name:"verified",type:"flags.17?true"},{name:"restricted",type:"flags.18?true"},{name:"min",type:"flags.20?true"},{name:"bot_inline_geo",type:"flags.21?true"},{name:"support",type:"flags.23?true"},{name:"scam",type:"flags.24?true"},{name:"apply_min_photo",type:"flags.25?true"},{name:"fake",type:"flags.26?true"},{name:"bot_attach_menu",type:"flags.27?true"},{name:"premium",type:"flags.28?true"},{name:"attach_menu_enabled",type:"flags.29?true"},{name:"flags2",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"flags.0?long"},{name:"first_name",type:"flags.1?string"},{name:"last_name",type:"flags.2?string"},{name:"username",type:"flags.3?string"},{name:"phone",type:"flags.4?string"},{name:"photo",type:"flags.5?UserProfilePhoto"},{name:"status",type:"flags.6?UserStatus"},{name:"bot_info_version",type:"flags.14?int"},{name:"restriction_reason",type:"flags.18?Vector"},{name:"bot_inline_placeholder",type:"flags.19?string"},{name:"lang_code",type:"flags.22?string"},{name:"emoji_status",type:"flags.30?EmojiStatus"},{name:"usernames",type:"flags2.0?Vector"}],type:"User"},{id:-1032140601,predicate:"botCommand",params:[{name:"command",type:"string"},{name:"description",type:"string"}],type:"BotCommand"},{id:-1892676777,predicate:"botInfo",params:[{name:"flags",type:"#"},{name:"user_id",type:"flags.0?long"},{name:"description",type:"flags.1?string"},{name:"description_photo",type:"flags.4?Photo"},{name:"description_document",type:"flags.5?Document"},{name:"commands",type:"flags.2?Vector"},{name:"menu_button",type:"flags.3?BotMenuButton"}],type:"BotInfo"},{id:-1560655744,predicate:"keyboardButton",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:2002815875,predicate:"keyboardButtonRow",params:[{name:"buttons",type:"Vector"}],type:"KeyboardButtonRow"},{id:-1606526075,predicate:"replyKeyboardHide",params:[{name:"flags",type:"#"},{name:"selective",type:"flags.2?true"}],type:"ReplyMarkup"},{id:-2035021048,predicate:"replyKeyboardForceReply",params:[{name:"flags",type:"#"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-2049074735,predicate:"replyKeyboardMarkup",params:[{name:"flags",type:"#"},{name:"resize",type:"flags.0?true"},{name:"single_use",type:"flags.1?true"},{name:"selective",type:"flags.2?true"},{name:"persistent",type:"flags.4?true"},{name:"rows",type:"Vector"},{name:"placeholder",type:"flags.3?string"}],type:"ReplyMarkup"},{id:-571955892,predicate:"inputPeerUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-233744186,predicate:"inputUser",params:[{name:"user_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputUser"},{id:-1148011883,predicate:"messageEntityUnknown",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-100378723,predicate:"messageEntityMention",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1868782349,predicate:"messageEntityHashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1827637959,predicate:"messageEntityBotCommand",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1859134776,predicate:"messageEntityUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1692693954,predicate:"messageEntityEmail",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1117713463,predicate:"messageEntityBold",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-2106619040,predicate:"messageEntityItalic",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:681706865,predicate:"messageEntityCode",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1938967520,predicate:"messageEntityPre",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"language",type:"string"}],type:"MessageEntity"},{id:1990644519,predicate:"messageEntityTextUrl",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"url",type:"string"}],type:"MessageEntity"},{id:-1877614335,predicate:"updateShortSentMessage",params:[{name:"flags",type:"#"},{name:"out",type:"flags.1?true"},{name:"id",type:"int"},{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"date",type:"int"},{name:"media",type:"flags.9?MessageMedia"},{name:"entities",type:"flags.7?Vector"},{name:"ttl_period",type:"flags.25?int"}],type:"Updates"},{id:-292807034,predicate:"inputChannelEmpty",params:[],type:"InputChannel"},{id:-212145112,predicate:"inputChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputChannel"},{id:-1566230754,predicate:"peerChannel",params:[{name:"channel_id",type:"long"}],type:"Peer"},{id:666680316,predicate:"inputPeerChannel",params:[{name:"channel_id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPeer"},{id:-2094689180,predicate:"channel",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"left",type:"flags.2?true"},{name:"broadcast",type:"flags.5?true"},{name:"verified",type:"flags.7?true"},{name:"megagroup",type:"flags.8?true"},{name:"restricted",type:"flags.9?true"},{name:"signatures",type:"flags.11?true"},{name:"min",type:"flags.12?true"},{name:"scam",type:"flags.19?true"},{name:"has_link",type:"flags.20?true"},{name:"has_geo",type:"flags.21?true"},{name:"slowmode_enabled",type:"flags.22?true"},{name:"call_active",type:"flags.23?true"},{name:"call_not_empty",type:"flags.24?true"},{name:"fake",type:"flags.25?true"},{name:"gigagroup",type:"flags.26?true"},{name:"noforwards",type:"flags.27?true"},{name:"join_to_send",type:"flags.28?true"},{name:"join_request",type:"flags.29?true"},{name:"forum",type:"flags.30?true"},{name:"flags2",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"flags.13?long"},{name:"title",type:"string"},{name:"username",type:"flags.6?string"},{name:"photo",type:"ChatPhoto"},{name:"date",type:"int"},{name:"restriction_reason",type:"flags.9?Vector"},{name:"admin_rights",type:"flags.14?ChatAdminRights"},{name:"banned_rights",type:"flags.15?ChatBannedRights"},{name:"default_banned_rights",type:"flags.18?ChatBannedRights"},{name:"participants_count",type:"flags.17?int"},{name:"usernames",type:"flags2.0?Vector"}],type:"Chat"},{id:399807445,predicate:"channelForbidden",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.5?true"},{name:"megagroup",type:"flags.8?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"title",type:"string"},{name:"until_date",type:"flags.16?int"}],type:"Chat"},{id:2131196633,predicate:"contacts.resolvedPeer",params:[{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.ResolvedPeer"},{id:-231385849,predicate:"channelFull",params:[{name:"flags",type:"#"},{name:"can_view_participants",type:"flags.3?true"},{name:"can_set_username",type:"flags.6?true"},{name:"can_set_stickers",type:"flags.7?true"},{name:"hidden_prehistory",type:"flags.10?true"},{name:"can_set_location",type:"flags.16?true"},{name:"has_scheduled",type:"flags.19?true"},{name:"can_view_stats",type:"flags.20?true"},{name:"blocked",type:"flags.22?true"},{name:"flags2",type:"#"},{name:"can_delete_channel",type:"flags2.0?true"},{name:"antispam",type:"flags2.1?true"},{name:"participants_hidden",type:"flags2.2?true"},{name:"id",type:"long"},{name:"about",type:"string"},{name:"participants_count",type:"flags.0?int"},{name:"admins_count",type:"flags.1?int"},{name:"kicked_count",type:"flags.2?int"},{name:"banned_count",type:"flags.2?int"},{name:"online_count",type:"flags.13?int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"chat_photo",type:"Photo"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"exported_invite",type:"flags.23?ExportedChatInvite"},{name:"bot_info",type:"Vector"},{name:"migrated_from_chat_id",type:"flags.4?long"},{name:"migrated_from_max_id",type:"flags.4?int"},{name:"pinned_msg_id",type:"flags.5?int"},{name:"stickerset",type:"flags.8?StickerSet"},{name:"available_min_id",type:"flags.9?int"},{name:"folder_id",type:"flags.11?int"},{name:"linked_chat_id",type:"flags.14?long"},{name:"location",type:"flags.15?ChannelLocation"},{name:"slowmode_seconds",type:"flags.17?int"},{name:"slowmode_next_send_date",type:"flags.18?int"},{name:"stats_dc",type:"flags.12?int"},{name:"pts",type:"int"},{name:"call",type:"flags.21?InputGroupCall"},{name:"ttl_period",type:"flags.24?int"},{name:"pending_suggestions",type:"flags.25?Vector"},{name:"groupcall_default_join_as",type:"flags.26?Peer"},{name:"theme_emoticon",type:"flags.27?string"},{name:"requests_pending",type:"flags.28?int"},{name:"recent_requesters",type:"flags.28?Vector"},{name:"default_send_as",type:"flags.29?Peer"},{name:"available_reactions",type:"flags.30?ChatReactions"}],type:"ChatFull"},{id:182649427,predicate:"messageRange",params:[{name:"min_id",type:"int"},{name:"max_id",type:"int"}],type:"MessageRange"},{id:-948520370,predicate:"messages.channelMessages",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"pts",type:"int"},{name:"count",type:"int"},{name:"offset_id_offset",type:"flags.2?int"},{name:"messages",type:"Vector"},{name:"topics",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.Messages"},{id:-1781355374,predicate:"messageActionChannelCreate",params:[{name:"title",type:"string"}],type:"MessageAction"},{id:277713951,predicate:"updateChannelTooLong",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"pts",type:"flags.0?int"}],type:"Update"},{id:1666927625,predicate:"updateChannel",params:[{name:"channel_id",type:"long"}],type:"Update"},{id:1656358105,predicate:"updateNewChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1842450928,predicate:"updateReadChannelInbox",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"channel_id",type:"long"},{name:"max_id",type:"int"},{name:"still_unread_count",type:"int"},{name:"pts",type:"int"}],type:"Update"},{id:-1020437742,predicate:"updateDeleteChannelMessages",params:[{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-232346616,predicate:"updateChannelMessageViews",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"views",type:"int"}],type:"Update"},{id:1041346555,predicate:"updates.channelDifferenceEmpty",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"}],type:"updates.ChannelDifference"},{id:-1531132162,predicate:"updates.channelDifferenceTooLong",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"timeout",type:"flags.1?int"},{name:"dialog",type:"Dialog"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:543450958,predicate:"updates.channelDifference",params:[{name:"flags",type:"#"},{name:"final",type:"flags.0?true"},{name:"pts",type:"int"},{name:"timeout",type:"flags.1?int"},{name:"new_messages",type:"Vector"},{name:"other_updates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"updates.ChannelDifference"},{id:-1798033689,predicate:"channelMessagesFilterEmpty",params:[],type:"ChannelMessagesFilter"},{id:-847783593,predicate:"channelMessagesFilter",params:[{name:"flags",type:"#"},{name:"exclude_new_messages",type:"flags.1?true"},{name:"ranges",type:"Vector"}],type:"ChannelMessagesFilter"},{id:-1072953408,predicate:"channelParticipant",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:900251559,predicate:"channelParticipantSelf",params:[{name:"flags",type:"#"},{name:"via_request",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChannelParticipant"},{id:803602899,predicate:"channelParticipantCreator",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.0?string"}],type:"ChannelParticipant"},{id:-566281095,predicate:"channelParticipantsRecent",params:[],type:"ChannelParticipantsFilter"},{id:-1268741783,predicate:"channelParticipantsAdmins",params:[],type:"ChannelParticipantsFilter"},{id:-1548400251,predicate:"channelParticipantsKicked",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-1699676497,predicate:"channels.channelParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipants"},{id:-541588713,predicate:"channels.channelParticipant",params:[{name:"participant",type:"ChannelParticipant"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.ChannelParticipant"},{id:-462696732,predicate:"chatParticipantCreator",params:[{name:"user_id",type:"long"}],type:"ChatParticipant"},{id:-1600962725,predicate:"chatParticipantAdmin",params:[{name:"user_id",type:"long"},{name:"inviter_id",type:"long"},{name:"date",type:"int"}],type:"ChatParticipant"},{id:-674602590,predicate:"updateChatParticipantAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"long"},{name:"is_admin",type:"Bool"},{name:"version",type:"int"}],type:"Update"},{id:-519864430,predicate:"messageActionChatMigrateTo",params:[{name:"channel_id",type:"long"}],type:"MessageAction"},{id:-365344535,predicate:"messageActionChannelMigrateFrom",params:[{name:"title",type:"string"},{name:"chat_id",type:"long"}],type:"MessageAction"},{id:-1328445861,predicate:"channelParticipantsBots",params:[],type:"ChannelParticipantsFilter"},{id:2013922064,predicate:"help.termsOfService",params:[{name:"flags",type:"#"},{name:"popup",type:"flags.0?true"},{name:"id",type:"DataJSON"},{name:"text",type:"string"},{name:"entities",type:"Vector"},{name:"min_age_confirm",type:"flags.1?int"}],type:"help.TermsOfService"},{id:1753886890,predicate:"updateNewStickerSet",params:[{name:"stickerset",type:"messages.StickerSet"}],type:"Update"},{id:196268545,predicate:"updateStickerSetsOrder",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"},{name:"order",type:"Vector"}],type:"Update"},{id:834816008,predicate:"updateStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"}],type:"Update"},{id:-402498398,predicate:"messages.savedGifsNotModified",params:[],type:"messages.SavedGifs"},{id:-2069878259,predicate:"messages.savedGifs",params:[{name:"hash",type:"long"},{name:"gifs",type:"Vector"}],type:"messages.SavedGifs"},{id:-1821035490,predicate:"updateSavedGifs",params:[],type:"Update"},{id:864077702,predicate:"inputBotInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1036876423,predicate:"inputBotInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-2000710887,predicate:"inputBotInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?InputWebDocument"},{name:"content",type:"flags.5?InputWebDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1984755728,predicate:"botInlineMessageMediaAuto",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1937807902,predicate:"botInlineMessageText",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:295067450,predicate:"botInlineResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"url",type:"flags.3?string"},{name:"thumb",type:"flags.4?WebDocument"},{name:"content",type:"flags.5?WebDocument"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:-1803769784,predicate:"messages.botResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"query_id",type:"long"},{name:"next_offset",type:"flags.1?string"},{name:"switch_pm",type:"flags.2?InlineBotSwitchPM"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"users",type:"Vector"}],type:"messages.BotResults"},{id:1232025500,predicate:"updateBotInlineQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"peer_type",type:"flags.1?InlineQueryPeerType"},{name:"offset",type:"string"}],type:"Update"},{id:317794823,predicate:"updateBotInlineSend",params:[{name:"flags",type:"#"},{name:"user_id",type:"long"},{name:"query",type:"string"},{name:"geo",type:"flags.0?GeoPoint"},{name:"id",type:"string"},{name:"msg_id",type:"flags.1?InputBotInlineMessageID"}],type:"Update"},{id:1358283666,predicate:"inputMessagesFilterVoice",params:[],type:"MessagesFilter"},{id:928101534,predicate:"inputMessagesFilterMusic",params:[],type:"MessagesFilter"},{id:-1107622874,predicate:"inputPrivacyKeyChatInvite",params:[],type:"InputPrivacyKey"},{id:1343122938,predicate:"privacyKeyChatInvite",params:[],type:"PrivacyKey"},{id:1571494644,predicate:"exportedMessageLink",params:[{name:"link",type:"string"},{name:"html",type:"string"}],type:"ExportedMessageLink"},{id:1601666510,predicate:"messageFwdHeader",params:[{name:"flags",type:"#"},{name:"imported",type:"flags.7?true"},{name:"from_id",type:"flags.0?Peer"},{name:"from_name",type:"flags.5?string"},{name:"date",type:"int"},{name:"channel_post",type:"flags.2?int"},{name:"post_author",type:"flags.3?string"},{name:"saved_from_peer",type:"flags.4?Peer"},{name:"saved_from_msg_id",type:"flags.4?int"},{name:"psa_type",type:"flags.6?string"}],type:"MessageFwdHeader"},{id:457133559,predicate:"updateEditChannelMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1799538451,predicate:"messageActionPinMessage",params:[],type:"MessageAction"},{id:1923290508,predicate:"auth.codeTypeSms",params:[],type:"auth.CodeType"},{id:1948046307,predicate:"auth.codeTypeCall",params:[],type:"auth.CodeType"},{id:577556219,predicate:"auth.codeTypeFlashCall",params:[],type:"auth.CodeType"},{id:1035688326,predicate:"auth.sentCodeTypeApp",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1073693790,predicate:"auth.sentCodeTypeSms",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:1398007207,predicate:"auth.sentCodeTypeCall",params:[{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1425815847,predicate:"auth.sentCodeTypeFlashCall",params:[{name:"pattern",type:"string"}],type:"auth.SentCodeType"},{id:629866245,predicate:"keyboardButtonUrl",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:901503851,predicate:"keyboardButtonCallback",params:[{name:"flags",type:"#"},{name:"requires_password",type:"flags.0?true"},{name:"text",type:"string"},{name:"data",type:"bytes"}],type:"KeyboardButton"},{id:-1318425559,predicate:"keyboardButtonRequestPhone",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-59151553,predicate:"keyboardButtonRequestGeoLocation",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:90744648,predicate:"keyboardButtonSwitchInline",params:[{name:"flags",type:"#"},{name:"same_peer",type:"flags.0?true"},{name:"text",type:"string"},{name:"query",type:"string"}],type:"KeyboardButton"},{id:1218642516,predicate:"replyInlineMarkup",params:[{name:"rows",type:"Vector"}],type:"ReplyMarkup"},{id:911761060,predicate:"messages.botCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"has_url",type:"flags.3?true"},{name:"native_ui",type:"flags.4?true"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"messages.BotCallbackAnswer"},{id:-1177566067,predicate:"updateBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:649453030,predicate:"messages.messageEditData",params:[{name:"flags",type:"#"},{name:"caption",type:"flags.0?true"}],type:"messages.MessageEditData"},{id:-469536605,predicate:"updateEditMessage",params:[{name:"message",type:"Message"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1768777083,predicate:"inputBotInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:1098628881,predicate:"inputBotInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo_point",type:"InputGeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-1494368259,predicate:"inputBotInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:85477117,predicate:"botInlineMessageMediaGeo",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1970903652,predicate:"botInlineMessageMediaVenue",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"title",type:"string"},{name:"address",type:"string"},{name:"provider",type:"string"},{name:"venue_id",type:"string"},{name:"venue_type",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:416402882,predicate:"botInlineMessageMediaContact",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"vcard",type:"string"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1462213465,predicate:"inputBotInlineResultPhoto",params:[{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"InputPhoto"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:-459324,predicate:"inputBotInlineResultDocument",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"title",type:"flags.1?string"},{name:"description",type:"flags.2?string"},{name:"document",type:"InputDocument"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:400266251,predicate:"botInlineMediaResult",params:[{name:"flags",type:"#"},{name:"id",type:"string"},{name:"type",type:"string"},{name:"photo",type:"flags.0?Photo"},{name:"document",type:"flags.1?Document"},{name:"title",type:"flags.2?string"},{name:"description",type:"flags.3?string"},{name:"send_message",type:"BotInlineMessage"}],type:"BotInlineResult"},{id:-1995686519,predicate:"inputBotInlineMessageID",params:[{name:"dc_id",type:"int"},{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:1763610706,predicate:"updateInlineBotCallbackQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"msg_id",type:"InputBotInlineMessageID"},{name:"chat_instance",type:"long"},{name:"data",type:"flags.0?bytes"},{name:"game_short_name",type:"flags.1?string"}],type:"Update"},{id:1008755359,predicate:"inlineBotSwitchPM",params:[{name:"text",type:"string"},{name:"start_param",type:"string"}],type:"InlineBotSwitchPM"},{id:863093588,predicate:"messages.peerDialogs",params:[{name:"dialogs",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"state",type:"updates.State"}],type:"messages.PeerDialogs"},{id:-305282981,predicate:"topPeer",params:[{name:"peer",type:"Peer"},{name:"rating",type:"double"}],type:"TopPeer"},{id:-1419371685,predicate:"topPeerCategoryBotsPM",params:[],type:"TopPeerCategory"},{id:344356834,predicate:"topPeerCategoryBotsInline",params:[],type:"TopPeerCategory"},{id:104314861,predicate:"topPeerCategoryCorrespondents",params:[],type:"TopPeerCategory"},{id:-1122524854,predicate:"topPeerCategoryGroups",params:[],type:"TopPeerCategory"},{id:371037736,predicate:"topPeerCategoryChannels",params:[],type:"TopPeerCategory"},{id:-75283823,predicate:"topPeerCategoryPeers",params:[{name:"category",type:"TopPeerCategory"},{name:"count",type:"int"},{name:"peers",type:"Vector"}],type:"TopPeerCategoryPeers"},{id:-567906571,predicate:"contacts.topPeersNotModified",params:[],type:"contacts.TopPeers"},{id:1891070632,predicate:"contacts.topPeers",params:[{name:"categories",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"contacts.TopPeers"},{id:-595914432,predicate:"messageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"long"}],type:"MessageEntity"},{id:546203849,predicate:"inputMessageEntityMentionName",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"user_id",type:"InputUser"}],type:"MessageEntity"},{id:975236280,predicate:"inputMessagesFilterChatPhotos",params:[],type:"MessagesFilter"},{id:-1218471511,predicate:"updateReadChannelOutbox",params:[{name:"channel_id",type:"long"},{name:"max_id",type:"int"}],type:"Update"},{id:457829485,predicate:"updateDraftMessage",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"top_msg_id",type:"flags.0?int"},{name:"draft",type:"DraftMessage"}],type:"Update"},{id:453805082,predicate:"draftMessageEmpty",params:[{name:"flags",type:"#"},{name:"date",type:"flags.0?int"}],type:"DraftMessage"},{id:-40996577,predicate:"draftMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"},{name:"date",type:"int"}],type:"DraftMessage"},{id:-1615153660,predicate:"messageActionHistoryClear",params:[],type:"MessageAction"},{id:-958657434,predicate:"messages.featuredStickersNotModified",params:[{name:"count",type:"int"}],type:"messages.FeaturedStickers"},{id:-1103615738,predicate:"messages.featuredStickers",params:[{name:"flags",type:"#"},{name:"premium",type:"flags.0?true"},{name:"hash",type:"long"},{name:"count",type:"int"},{name:"sets",type:"Vector"},{name:"unread",type:"Vector"}],type:"messages.FeaturedStickers"},{id:1461528386,predicate:"updateReadFeaturedStickers",params:[],type:"Update"},{id:186120336,predicate:"messages.recentStickersNotModified",params:[],type:"messages.RecentStickers"},{id:-1999405994,predicate:"messages.recentStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"},{name:"dates",type:"Vector"}],type:"messages.RecentStickers"},{id:-1706939360,predicate:"updateRecentStickers",params:[],type:"Update"},{id:1338747336,predicate:"messages.archivedStickers",params:[{name:"count",type:"int"},{name:"sets",type:"Vector"}],type:"messages.ArchivedStickers"},{id:946083368,predicate:"messages.stickerSetInstallResultSuccess",params:[],type:"messages.StickerSetInstallResult"},{id:904138920,predicate:"messages.stickerSetInstallResultArchive",params:[{name:"sets",type:"Vector"}],type:"messages.StickerSetInstallResult"},{id:1678812626,predicate:"stickerSetCovered",params:[{name:"set",type:"StickerSet"},{name:"cover",type:"Document"}],type:"StickerSetCovered"},{id:-1574314746,predicate:"updateConfig",params:[],type:"Update"},{id:861169551,predicate:"updatePtsChanged",params:[],type:"Update"},{id:-440664550,predicate:"inputMediaPhotoExternal",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.1?true"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:-78455655,predicate:"inputMediaDocumentExternal",params:[{name:"flags",type:"#"},{name:"spoiler",type:"flags.1?true"},{name:"url",type:"string"},{name:"ttl_seconds",type:"flags.0?int"}],type:"InputMedia"},{id:872932635,predicate:"stickerSetMultiCovered",params:[{name:"set",type:"StickerSet"},{name:"covers",type:"Vector"}],type:"StickerSetCovered"},{id:-1361650766,predicate:"maskCoords",params:[{name:"n",type:"int"},{name:"x",type:"double"},{name:"y",type:"double"},{name:"zoom",type:"double"}],type:"MaskCoords"},{id:-1744710921,predicate:"documentAttributeHasStickers",params:[],type:"DocumentAttribute"},{id:1251549527,predicate:"inputStickeredMediaPhoto",params:[{name:"id",type:"InputPhoto"}],type:"InputStickeredMedia"},{id:70813275,predicate:"inputStickeredMediaDocument",params:[{name:"id",type:"InputDocument"}],type:"InputStickeredMedia"},{id:-1107729093,predicate:"game",params:[{name:"flags",type:"#"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"short_name",type:"string"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"Photo"},{name:"document",type:"flags.0?Document"}],type:"Game"},{id:1336154098,predicate:"inputBotInlineResultGame",params:[{name:"id",type:"string"},{name:"short_name",type:"string"},{name:"send_message",type:"InputBotInlineMessage"}],type:"InputBotInlineResult"},{id:1262639204,predicate:"inputBotInlineMessageGame",params:[{name:"flags",type:"#"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:-38694904,predicate:"messageMediaGame",params:[{name:"game",type:"Game"}],type:"MessageMedia"},{id:-750828557,predicate:"inputMediaGame",params:[{name:"id",type:"InputGame"}],type:"InputMedia"},{id:53231223,predicate:"inputGameID",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGame"},{id:-1020139510,predicate:"inputGameShortName",params:[{name:"bot_id",type:"InputUser"},{name:"short_name",type:"string"}],type:"InputGame"},{id:1358175439,predicate:"keyboardButtonGame",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1834538890,predicate:"messageActionGameScore",params:[{name:"game_id",type:"long"},{name:"score",type:"int"}],type:"MessageAction"},{id:1940093419,predicate:"highScore",params:[{name:"pos",type:"int"},{name:"user_id",type:"long"},{name:"score",type:"int"}],type:"HighScore"},{id:-1707344487,predicate:"messages.highScores",params:[{name:"scores",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.HighScores"},{id:1258196845,predicate:"updates.differenceTooLong",params:[{name:"pts",type:"int"}],type:"updates.Difference"},{id:791390623,predicate:"updateChannelWebPage",params:[{name:"channel_id",type:"long"},{name:"webpage",type:"WebPage"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:-1663561404,predicate:"messages.chatsSlice",params:[{name:"count",type:"int"},{name:"chats",type:"Vector"}],type:"messages.Chats"},{id:-599948721,predicate:"textEmpty",params:[],type:"RichText"},{id:1950782688,predicate:"textPlain",params:[{name:"text",type:"string"}],type:"RichText"},{id:1730456516,predicate:"textBold",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-653089380,predicate:"textItalic",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1054465340,predicate:"textUnderline",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-1678197867,predicate:"textStrike",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1816074681,predicate:"textFixed",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:1009288385,predicate:"textUrl",params:[{name:"text",type:"RichText"},{name:"url",type:"string"},{name:"webpage_id",type:"long"}],type:"RichText"},{id:-564523562,predicate:"textEmail",params:[{name:"text",type:"RichText"},{name:"email",type:"string"}],type:"RichText"},{id:2120376535,predicate:"textConcat",params:[{name:"texts",type:"Vector"}],type:"RichText"},{id:324435594,predicate:"pageBlockUnsupported",params:[],type:"PageBlock"},{id:1890305021,predicate:"pageBlockTitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1879401953,predicate:"pageBlockSubtitle",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1162877472,predicate:"pageBlockAuthorDate",params:[{name:"author",type:"RichText"},{name:"published_date",type:"int"}],type:"PageBlock"},{id:-1076861716,predicate:"pageBlockHeader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-248793375,predicate:"pageBlockSubheader",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:1182402406,predicate:"pageBlockParagraph",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-1066346178,predicate:"pageBlockPreformatted",params:[{name:"text",type:"RichText"},{name:"language",type:"string"}],type:"PageBlock"},{id:1216809369,predicate:"pageBlockFooter",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:-618614392,predicate:"pageBlockDivider",params:[],type:"PageBlock"},{id:-837994576,predicate:"pageBlockAnchor",params:[{name:"name",type:"string"}],type:"PageBlock"},{id:-454524911,predicate:"pageBlockList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:641563686,predicate:"pageBlockBlockquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:1329878739,predicate:"pageBlockPullquote",params:[{name:"text",type:"RichText"},{name:"caption",type:"RichText"}],type:"PageBlock"},{id:391759200,predicate:"pageBlockPhoto",params:[{name:"flags",type:"#"},{name:"photo_id",type:"long"},{name:"caption",type:"PageCaption"},{name:"url",type:"flags.0?string"},{name:"webpage_id",type:"flags.0?long"}],type:"PageBlock"},{id:2089805750,predicate:"pageBlockVideo",params:[{name:"flags",type:"#"},{name:"autoplay",type:"flags.0?true"},{name:"loop",type:"flags.1?true"},{name:"video_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:972174080,predicate:"pageBlockCover",params:[{name:"cover",type:"PageBlock"}],type:"PageBlock"},{id:-1468953147,predicate:"pageBlockEmbed",params:[{name:"flags",type:"#"},{name:"full_width",type:"flags.0?true"},{name:"allow_scrolling",type:"flags.3?true"},{name:"url",type:"flags.1?string"},{name:"html",type:"flags.2?string"},{name:"poster_photo_id",type:"flags.4?long"},{name:"w",type:"flags.5?int"},{name:"h",type:"flags.5?int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-229005301,predicate:"pageBlockEmbedPost",params:[{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"author_photo_id",type:"long"},{name:"author",type:"string"},{name:"date",type:"int"},{name:"blocks",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1705048653,predicate:"pageBlockCollage",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:52401552,predicate:"pageBlockSlideshow",params:[{name:"items",type:"Vector"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1930545681,predicate:"webPageNotModified",params:[{name:"flags",type:"#"},{name:"cached_page_views",type:"flags.0?int"}],type:"WebPage"},{id:-88417185,predicate:"inputPrivacyKeyPhoneCall",params:[],type:"InputPrivacyKey"},{id:1030105979,predicate:"privacyKeyPhoneCall",params:[],type:"PrivacyKey"},{id:-580219064,predicate:"sendMessageGamePlayAction",params:[],type:"SendMessageAction"},{id:-2048646399,predicate:"phoneCallDiscardReasonMissed",params:[],type:"PhoneCallDiscardReason"},{id:-527056480,predicate:"phoneCallDiscardReasonDisconnect",params:[],type:"PhoneCallDiscardReason"},{id:1471006352,predicate:"phoneCallDiscardReasonHangup",params:[],type:"PhoneCallDiscardReason"},{id:-84416311,predicate:"phoneCallDiscardReasonBusy",params:[],type:"PhoneCallDiscardReason"},{id:1852826908,predicate:"updateDialogPinned",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-99664734,predicate:"updatePinnedDialogs",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.1?int"},{name:"order",type:"flags.0?Vector"}],type:"Update"},{id:2104790276,predicate:"dataJSON",params:[{name:"data",type:"string"}],type:"DataJSON"},{id:-2095595325,predicate:"updateBotWebhookJSON",params:[{name:"data",type:"DataJSON"}],type:"Update"},{id:-1684914010,predicate:"updateBotWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"},{name:"timeout",type:"int"}],type:"Update"},{id:-886477832,predicate:"labeledPrice",params:[{name:"label",type:"string"},{name:"amount",type:"long"}],type:"LabeledPrice"},{id:1048946971,predicate:"invoice",params:[{name:"flags",type:"#"},{name:"test",type:"flags.0?true"},{name:"name_requested",type:"flags.1?true"},{name:"phone_requested",type:"flags.2?true"},{name:"email_requested",type:"flags.3?true"},{name:"shipping_address_requested",type:"flags.4?true"},{name:"flexible",type:"flags.5?true"},{name:"phone_to_provider",type:"flags.6?true"},{name:"email_to_provider",type:"flags.7?true"},{name:"recurring",type:"flags.9?true"},{name:"currency",type:"string"},{name:"prices",type:"Vector"},{name:"max_tip_amount",type:"flags.8?long"},{name:"suggested_tip_amounts",type:"flags.8?Vector"},{name:"recurring_terms_url",type:"flags.9?string"}],type:"Invoice"},{id:-1900697899,predicate:"inputMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"start_param",type:"flags.1?string"},{name:"extended_media",type:"flags.2?InputMedia"}],type:"InputMedia"},{id:-368917890,predicate:"paymentCharge",params:[{name:"id",type:"string"},{name:"provider_charge_id",type:"string"}],type:"PaymentCharge"},{id:-1892568281,predicate:"messageActionPaymentSentMe",params:[{name:"flags",type:"#"},{name:"recurring_init",type:"flags.2?true"},{name:"recurring_used",type:"flags.3?true"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"charge",type:"PaymentCharge"}],type:"MessageAction"},{id:-156940077,predicate:"messageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"receipt_msg_id",type:"flags.2?int"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"start_param",type:"string"},{name:"extended_media",type:"flags.4?MessageExtendedMedia"}],type:"MessageMedia"},{id:512535275,predicate:"postAddress",params:[{name:"street_line1",type:"string"},{name:"street_line2",type:"string"},{name:"city",type:"string"},{name:"state",type:"string"},{name:"country_iso2",type:"string"},{name:"post_code",type:"string"}],type:"PostAddress"},{id:-1868808300,predicate:"paymentRequestedInfo",params:[{name:"flags",type:"#"},{name:"name",type:"flags.0?string"},{name:"phone",type:"flags.1?string"},{name:"email",type:"flags.2?string"},{name:"shipping_address",type:"flags.3?PostAddress"}],type:"PaymentRequestedInfo"},{id:-1344716869,predicate:"keyboardButtonBuy",params:[{name:"text",type:"string"}],type:"KeyboardButton"},{id:-1776926890,predicate:"messageActionPaymentSent",params:[{name:"flags",type:"#"},{name:"recurring_init",type:"flags.2?true"},{name:"recurring_used",type:"flags.3?true"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"invoice_slug",type:"flags.0?string"}],type:"MessageAction"},{id:-842892769,predicate:"paymentSavedCredentialsCard",params:[{name:"id",type:"string"},{name:"title",type:"string"}],type:"PaymentSavedCredentials"},{id:475467473,predicate:"webDocument",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:-1678949555,predicate:"inputWebDocument",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"InputWebDocument"},{id:-1036396922,predicate:"inputWebFileLocation",params:[{name:"url",type:"string"},{name:"access_hash",type:"long"}],type:"InputWebFileLocation"},{id:568808380,predicate:"upload.webFile",params:[{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"file_type",type:"storage.FileType"},{name:"mtime",type:"int"},{name:"bytes",type:"bytes"}],type:"upload.WebFile"},{id:-1610250415,predicate:"payments.paymentForm",params:[{name:"flags",type:"#"},{name:"can_save_credentials",type:"flags.2?true"},{name:"password_missing",type:"flags.3?true"},{name:"form_id",type:"long"},{name:"bot_id",type:"long"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.5?WebDocument"},{name:"invoice",type:"Invoice"},{name:"provider_id",type:"long"},{name:"url",type:"string"},{name:"native_provider",type:"flags.4?string"},{name:"native_params",type:"flags.4?DataJSON"},{name:"additional_methods",type:"flags.6?Vector"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"},{name:"saved_credentials",type:"flags.1?Vector"},{name:"users",type:"Vector"}],type:"payments.PaymentForm"},{id:-784000893,predicate:"payments.validatedRequestedInfo",params:[{name:"flags",type:"#"},{name:"id",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"payments.ValidatedRequestedInfo"},{id:1314881805,predicate:"payments.paymentResult",params:[{name:"updates",type:"Updates"}],type:"payments.PaymentResult"},{id:1891958275,predicate:"payments.paymentReceipt",params:[{name:"flags",type:"#"},{name:"date",type:"int"},{name:"bot_id",type:"long"},{name:"provider_id",type:"long"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.2?WebDocument"},{name:"invoice",type:"Invoice"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping",type:"flags.1?ShippingOption"},{name:"tip_amount",type:"flags.3?long"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"credentials_title",type:"string"},{name:"users",type:"Vector"}],type:"payments.PaymentReceipt"},{id:-74456004,predicate:"payments.savedInfo",params:[{name:"flags",type:"#"},{name:"has_saved_credentials",type:"flags.1?true"},{name:"saved_info",type:"flags.0?PaymentRequestedInfo"}],type:"payments.SavedInfo"},{id:-1056001329,predicate:"inputPaymentCredentialsSaved",params:[{name:"id",type:"string"},{name:"tmp_password",type:"bytes"}],type:"InputPaymentCredentials"},{id:873977640,predicate:"inputPaymentCredentials",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-614138572,predicate:"account.tmpPassword",params:[{name:"tmp_password",type:"bytes"},{name:"valid_until",type:"int"}],type:"account.TmpPassword"},{id:-1239335713,predicate:"shippingOption",params:[{name:"id",type:"string"},{name:"title",type:"string"},{name:"prices",type:"Vector"}],type:"ShippingOption"},{id:-1246823043,predicate:"updateBotShippingQuery",params:[{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"shipping_address",type:"PostAddress"}],type:"Update"},{id:-1934976362,predicate:"updateBotPrecheckoutQuery",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"user_id",type:"long"},{name:"payload",type:"bytes"},{name:"info",type:"flags.0?PaymentRequestedInfo"},{name:"shipping_option_id",type:"flags.1?string"},{name:"currency",type:"string"},{name:"total_amount",type:"long"}],type:"Update"},{id:-6249322,predicate:"inputStickerSetItem",params:[{name:"flags",type:"#"},{name:"document",type:"InputDocument"},{name:"emoji",type:"string"},{name:"mask_coords",type:"flags.0?MaskCoords"}],type:"InputStickerSetItem"},{id:-1425052898,predicate:"updatePhoneCall",params:[{name:"phone_call",type:"PhoneCall"}],type:"Update"},{id:506920429,predicate:"inputPhoneCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputPhoneCall"},{id:1399245077,predicate:"phoneCallEmpty",params:[{name:"id",type:"long"}],type:"PhoneCall"},{id:-987599081,predicate:"phoneCallWaiting",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"receive_date",type:"flags.0?int"}],type:"PhoneCall"},{id:347139340,predicate:"phoneCallRequested",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:912311057,predicate:"phoneCallAccepted",params:[{name:"flags",type:"#"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"PhoneCall"},{id:-1770029977,predicate:"phoneCall",params:[{name:"flags",type:"#"},{name:"p2p_allowed",type:"flags.5?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"date",type:"int"},{name:"admin_id",type:"long"},{name:"participant_id",type:"long"},{name:"g_a_or_b",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"},{name:"connections",type:"Vector"},{name:"start_date",type:"int"}],type:"PhoneCall"},{id:1355435489,predicate:"phoneCallDiscarded",params:[{name:"flags",type:"#"},{name:"need_rating",type:"flags.2?true"},{name:"need_debug",type:"flags.3?true"},{name:"video",type:"flags.6?true"},{name:"id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"PhoneCall"},{id:-1665063993,predicate:"phoneConnection",params:[{name:"flags",type:"#"},{name:"tcp",type:"flags.0?true"},{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"peer_tag",type:"bytes"}],type:"PhoneConnection"},{id:-58224696,predicate:"phoneCallProtocol",params:[{name:"flags",type:"#"},{name:"udp_p2p",type:"flags.0?true"},{name:"udp_reflector",type:"flags.1?true"},{name:"min_layer",type:"int"},{name:"max_layer",type:"int"},{name:"library_versions",type:"Vector"}],type:"PhoneCallProtocol"},{id:-326966976,predicate:"phone.phoneCall",params:[{name:"phone_call",type:"PhoneCall"},{name:"users",type:"Vector"}],type:"phone.PhoneCall"},{id:-2134272152,predicate:"inputMessagesFilterPhoneCalls",params:[{name:"flags",type:"#"},{name:"missed",type:"flags.0?true"}],type:"MessagesFilter"},{id:-2132731265,predicate:"messageActionPhoneCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.2?true"},{name:"call_id",type:"long"},{name:"reason",type:"flags.0?PhoneCallDiscardReason"},{name:"duration",type:"flags.1?int"}],type:"MessageAction"},{id:2054952868,predicate:"inputMessagesFilterRoundVoice",params:[],type:"MessagesFilter"},{id:-1253451181,predicate:"inputMessagesFilterRoundVideo",params:[],type:"MessagesFilter"},{id:-1997373508,predicate:"sendMessageRecordRoundAction",params:[],type:"SendMessageAction"},{id:608050278,predicate:"sendMessageUploadRoundAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:-242427324,predicate:"upload.fileCdnRedirect",params:[{name:"dc_id",type:"int"},{name:"file_token",type:"bytes"},{name:"encryption_key",type:"bytes"},{name:"encryption_iv",type:"bytes"},{name:"file_hashes",type:"Vector"}],type:"upload.File"},{id:-290921362,predicate:"upload.cdnFileReuploadNeeded",params:[{name:"request_token",type:"bytes"}],type:"upload.CdnFile"},{id:-1449145777,predicate:"upload.cdnFile",params:[{name:"bytes",type:"bytes"}],type:"upload.CdnFile"},{id:-914167110,predicate:"cdnPublicKey",params:[{name:"dc_id",type:"int"},{name:"public_key",type:"string"}],type:"CdnPublicKey"},{id:1462101002,predicate:"cdnConfig",params:[{name:"public_keys",type:"Vector"}],type:"CdnConfig"},{id:-283684427,predicate:"pageBlockChannel",params:[{name:"channel",type:"Chat"}],type:"PageBlock"},{id:-892239370,predicate:"langPackString",params:[{name:"key",type:"string"},{name:"value",type:"string"}],type:"LangPackString"},{id:1816636575,predicate:"langPackStringPluralized",params:[{name:"flags",type:"#"},{name:"key",type:"string"},{name:"zero_value",type:"flags.0?string"},{name:"one_value",type:"flags.1?string"},{name:"two_value",type:"flags.2?string"},{name:"few_value",type:"flags.3?string"},{name:"many_value",type:"flags.4?string"},{name:"other_value",type:"string"}],type:"LangPackString"},{id:695856818,predicate:"langPackStringDeleted",params:[{name:"key",type:"string"}],type:"LangPackString"},{id:-209337866,predicate:"langPackDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"strings",type:"Vector"}],type:"LangPackDifference"},{id:-288727837,predicate:"langPackLanguage",params:[{name:"flags",type:"#"},{name:"official",type:"flags.0?true"},{name:"rtl",type:"flags.2?true"},{name:"beta",type:"flags.3?true"},{name:"name",type:"string"},{name:"native_name",type:"string"},{name:"lang_code",type:"string"},{name:"base_lang_code",type:"flags.1?string"},{name:"plural_code",type:"string"},{name:"strings_count",type:"int"},{name:"translated_count",type:"int"},{name:"translations_url",type:"string"}],type:"LangPackLanguage"},{id:1180041828,predicate:"updateLangPackTooLong",params:[{name:"lang_code",type:"string"}],type:"Update"},{id:1442983757,predicate:"updateLangPack",params:[{name:"difference",type:"LangPackDifference"}],type:"Update"},{id:885242707,predicate:"channelParticipantAdmin",params:[{name:"flags",type:"#"},{name:"can_edit",type:"flags.0?true"},{name:"self",type:"flags.1?true"},{name:"user_id",type:"long"},{name:"inviter_id",type:"flags.1?long"},{name:"promoted_by",type:"long"},{name:"date",type:"int"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"flags.2?string"}],type:"ChannelParticipant"},{id:1844969806,predicate:"channelParticipantBanned",params:[{name:"flags",type:"#"},{name:"left",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"kicked_by",type:"long"},{name:"date",type:"int"},{name:"banned_rights",type:"ChatBannedRights"}],type:"ChannelParticipant"},{id:338142689,predicate:"channelParticipantsBanned",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:106343499,predicate:"channelParticipantsSearch",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:-421545947,predicate:"channelAdminLogEventActionChangeTitle",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1427671598,predicate:"channelAdminLogEventActionChangeAbout",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1783299128,predicate:"channelAdminLogEventActionChangeUsername",params:[{name:"prev_value",type:"string"},{name:"new_value",type:"string"}],type:"ChannelAdminLogEventAction"},{id:1129042607,predicate:"channelAdminLogEventActionChangePhoto",params:[{name:"prev_photo",type:"Photo"},{name:"new_photo",type:"Photo"}],type:"ChannelAdminLogEventAction"},{id:460916654,predicate:"channelAdminLogEventActionToggleInvites",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:648939889,predicate:"channelAdminLogEventActionToggleSignatures",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-370660328,predicate:"channelAdminLogEventActionUpdatePinned",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1889215493,predicate:"channelAdminLogEventActionEditMessage",params:[{name:"prev_message",type:"Message"},{name:"new_message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:1121994683,predicate:"channelAdminLogEventActionDeleteMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:405815507,predicate:"channelAdminLogEventActionParticipantJoin",params:[],type:"ChannelAdminLogEventAction"},{id:-124291086,predicate:"channelAdminLogEventActionParticipantLeave",params:[],type:"ChannelAdminLogEventAction"},{id:-484690728,predicate:"channelAdminLogEventActionParticipantInvite",params:[{name:"participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-422036098,predicate:"channelAdminLogEventActionParticipantToggleBan",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:-714643696,predicate:"channelAdminLogEventActionParticipantToggleAdmin",params:[{name:"prev_participant",type:"ChannelParticipant"},{name:"new_participant",type:"ChannelParticipant"}],type:"ChannelAdminLogEventAction"},{id:531458253,predicate:"channelAdminLogEvent",params:[{name:"id",type:"long"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"action",type:"ChannelAdminLogEventAction"}],type:"ChannelAdminLogEvent"},{id:-309659827,predicate:"channels.adminLogResults",params:[{name:"events",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.AdminLogResults"},{id:-368018716,predicate:"channelAdminLogEventsFilter",params:[{name:"flags",type:"#"},{name:"join",type:"flags.0?true"},{name:"leave",type:"flags.1?true"},{name:"invite",type:"flags.2?true"},{name:"ban",type:"flags.3?true"},{name:"unban",type:"flags.4?true"},{name:"kick",type:"flags.5?true"},{name:"unkick",type:"flags.6?true"},{name:"promote",type:"flags.7?true"},{name:"demote",type:"flags.8?true"},{name:"info",type:"flags.9?true"},{name:"settings",type:"flags.10?true"},{name:"pinned",type:"flags.11?true"},{name:"edit",type:"flags.12?true"},{name:"delete",type:"flags.13?true"},{name:"group_call",type:"flags.14?true"},{name:"invites",type:"flags.15?true"},{name:"send",type:"flags.16?true"},{name:"forums",type:"flags.17?true"}],type:"ChannelAdminLogEventsFilter"},{id:511092620,predicate:"topPeerCategoryPhoneCalls",params:[],type:"TopPeerCategory"},{id:-2143067670,predicate:"pageBlockAudio",params:[{name:"audio_id",type:"long"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:1558266229,predicate:"popularContact",params:[{name:"client_id",type:"long"},{name:"importers",type:"int"}],type:"PopularContact"},{id:1200788123,predicate:"messageActionScreenshotTaken",params:[],type:"MessageAction"},{id:-1634752813,predicate:"messages.favedStickersNotModified",params:[],type:"messages.FavedStickers"},{id:750063767,predicate:"messages.favedStickers",params:[{name:"hash",type:"long"},{name:"packs",type:"Vector"},{name:"stickers",type:"Vector"}],type:"messages.FavedStickers"},{id:-451831443,predicate:"updateFavedStickers",params:[],type:"Update"},{id:-366410403,predicate:"updateChannelReadMessagesContents",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"flags.0?int"},{name:"messages",type:"Vector"}],type:"Update"},{id:-1040652646,predicate:"inputMessagesFilterMyMentions",params:[],type:"MessagesFilter"},{id:1887741886,predicate:"updateContactsReset",params:[],type:"Update"},{id:-1312568665,predicate:"channelAdminLogEventActionChangeStickerSet",params:[{name:"prev_stickerset",type:"InputStickerSet"},{name:"new_stickerset",type:"InputStickerSet"}],type:"ChannelAdminLogEventAction"},{id:-85549226,predicate:"messageActionCustomAction",params:[{name:"message",type:"string"}],type:"MessageAction"},{id:178373535,predicate:"inputPaymentCredentialsApplePay",params:[{name:"payment_data",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:-419271411,predicate:"inputMessagesFilterGeo",params:[],type:"MessagesFilter"},{id:-530392189,predicate:"inputMessagesFilterContacts",params:[],type:"MessagesFilter"},{id:-1304443240,predicate:"updateChannelAvailableMessages",params:[{name:"channel_id",type:"long"},{name:"available_min_id",type:"int"}],type:"Update"},{id:1599903217,predicate:"channelAdminLogEventActionTogglePreHistoryHidden",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-1759532989,predicate:"inputMediaGeoLive",params:[{name:"flags",type:"#"},{name:"stopped",type:"flags.0?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"heading",type:"flags.2?int"},{name:"period",type:"flags.1?int"},{name:"proximity_notification_radius",type:"flags.3?int"}],type:"InputMedia"},{id:-1186937242,predicate:"messageMediaGeoLive",params:[{name:"flags",type:"#"},{name:"geo",type:"GeoPoint"},{name:"heading",type:"flags.0?int"},{name:"period",type:"int"},{name:"proximity_notification_radius",type:"flags.1?int"}],type:"MessageMedia"},{id:1189204285,predicate:"recentMeUrlUnknown",params:[{name:"url",type:"string"}],type:"RecentMeUrl"},{id:-1188296222,predicate:"recentMeUrlUser",params:[{name:"url",type:"string"},{name:"user_id",type:"long"}],type:"RecentMeUrl"},{id:-1294306862,predicate:"recentMeUrlChat",params:[{name:"url",type:"string"},{name:"chat_id",type:"long"}],type:"RecentMeUrl"},{id:-347535331,predicate:"recentMeUrlChatInvite",params:[{name:"url",type:"string"},{name:"chat_invite",type:"ChatInvite"}],type:"RecentMeUrl"},{id:-1140172836,predicate:"recentMeUrlStickerSet",params:[{name:"url",type:"string"},{name:"set",type:"StickerSetCovered"}],type:"RecentMeUrl"},{id:235081943,predicate:"help.recentMeUrls",params:[{name:"urls",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"help.RecentMeUrls"},{id:-266911767,predicate:"channels.channelParticipantsNotModified",params:[],type:"channels.ChannelParticipants"},{id:1951620897,predicate:"messages.messagesNotModified",params:[{name:"count",type:"int"}],type:"messages.Messages"},{id:482797855,predicate:"inputSingleMedia",params:[{name:"flags",type:"#"},{name:"media",type:"InputMedia"},{name:"random_id",type:"long"},{name:"message",type:"string"},{name:"entities",type:"flags.0?Vector"}],type:"InputSingleMedia"},{id:-1493633966,predicate:"webAuthorization",params:[{name:"hash",type:"long"},{name:"bot_id",type:"long"},{name:"domain",type:"string"},{name:"browser",type:"string"},{name:"platform",type:"string"},{name:"date_created",type:"int"},{name:"date_active",type:"int"},{name:"ip",type:"string"},{name:"region",type:"string"}],type:"WebAuthorization"},{id:-313079300,predicate:"account.webAuthorizations",params:[{name:"authorizations",type:"Vector"},{name:"users",type:"Vector"}],type:"account.WebAuthorizations"},{id:-1502174430,predicate:"inputMessageID",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-1160215659,predicate:"inputMessageReplyTo",params:[{name:"id",type:"int"}],type:"InputMessage"},{id:-2037963464,predicate:"inputMessagePinned",params:[],type:"InputMessage"},{id:-1687559349,predicate:"messageEntityPhone",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1280209983,predicate:"messageEntityCashtag",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1410748418,predicate:"messageActionBotAllowed",params:[{name:"domain",type:"string"}],type:"MessageAction"},{id:-55902537,predicate:"inputDialogPeer",params:[{name:"peer",type:"InputPeer"}],type:"InputDialogPeer"},{id:-445792507,predicate:"dialogPeer",params:[{name:"peer",type:"Peer"}],type:"DialogPeer"},{id:223655517,predicate:"messages.foundStickerSetsNotModified",params:[],type:"messages.FoundStickerSets"},{id:-1963942446,predicate:"messages.foundStickerSets",params:[{name:"hash",type:"long"},{name:"sets",type:"Vector"}],type:"messages.FoundStickerSets"},{id:-207944868,predicate:"fileHash",params:[{name:"offset",type:"long"},{name:"limit",type:"int"},{name:"hash",type:"bytes"}],type:"FileHash"},{id:-104284986,predicate:"webDocumentNoProxy",params:[{name:"url",type:"string"},{name:"size",type:"int"},{name:"mime_type",type:"string"},{name:"attributes",type:"Vector"}],type:"WebDocument"},{id:1968737087,predicate:"inputClientProxy",params:[{name:"address",type:"string"},{name:"port",type:"int"}],type:"InputClientProxy"},{id:-483352705,predicate:"help.termsOfServiceUpdateEmpty",params:[{name:"expires",type:"int"}],type:"help.TermsOfServiceUpdate"},{id:686618977,predicate:"help.termsOfServiceUpdate",params:[{name:"expires",type:"int"},{name:"terms_of_service",type:"help.TermsOfService"}],type:"help.TermsOfServiceUpdate"},{id:859091184,predicate:"inputSecureFileUploaded",params:[{name:"id",type:"long"},{name:"parts",type:"int"},{name:"md5_checksum",type:"string"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"InputSecureFile"},{id:1399317950,predicate:"inputSecureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputSecureFile"},{id:-876089816,predicate:"inputSecureFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputFileLocation"},{id:1679398724,predicate:"secureFileEmpty",params:[],type:"SecureFile"},{id:2097791614,predicate:"secureFile",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"size",type:"long"},{name:"dc_id",type:"int"},{name:"date",type:"int"},{name:"file_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureFile"},{id:-1964327229,predicate:"secureData",params:[{name:"data",type:"bytes"},{name:"data_hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureData"},{id:2103482845,predicate:"securePlainPhone",params:[{name:"phone",type:"string"}],type:"SecurePlainData"},{id:569137759,predicate:"securePlainEmail",params:[{name:"email",type:"string"}],type:"SecurePlainData"},{id:-1658158621,predicate:"secureValueTypePersonalDetails",params:[],type:"SecureValueType"},{id:1034709504,predicate:"secureValueTypePassport",params:[],type:"SecureValueType"},{id:115615172,predicate:"secureValueTypeDriverLicense",params:[],type:"SecureValueType"},{id:-1596951477,predicate:"secureValueTypeIdentityCard",params:[],type:"SecureValueType"},{id:-1717268701,predicate:"secureValueTypeInternalPassport",params:[],type:"SecureValueType"},{id:-874308058,predicate:"secureValueTypeAddress",params:[],type:"SecureValueType"},{id:-63531698,predicate:"secureValueTypeUtilityBill",params:[],type:"SecureValueType"},{id:-1995211763,predicate:"secureValueTypeBankStatement",params:[],type:"SecureValueType"},{id:-1954007928,predicate:"secureValueTypeRentalAgreement",params:[],type:"SecureValueType"},{id:-1713143702,predicate:"secureValueTypePassportRegistration",params:[],type:"SecureValueType"},{id:-368907213,predicate:"secureValueTypeTemporaryRegistration",params:[],type:"SecureValueType"},{id:-1289704741,predicate:"secureValueTypePhone",params:[],type:"SecureValueType"},{id:-1908627474,predicate:"secureValueTypeEmail",params:[],type:"SecureValueType"},{id:411017418,predicate:"secureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?SecureFile"},{name:"reverse_side",type:"flags.2?SecureFile"},{name:"selfie",type:"flags.3?SecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"},{name:"hash",type:"bytes"}],type:"SecureValue"},{id:-618540889,predicate:"inputSecureValue",params:[{name:"flags",type:"#"},{name:"type",type:"SecureValueType"},{name:"data",type:"flags.0?SecureData"},{name:"front_side",type:"flags.1?InputSecureFile"},{name:"reverse_side",type:"flags.2?InputSecureFile"},{name:"selfie",type:"flags.3?InputSecureFile"},{name:"translation",type:"flags.6?Vector"},{name:"files",type:"flags.4?Vector"},{name:"plain_data",type:"flags.5?SecurePlainData"}],type:"InputSecureValue"},{id:-316748368,predicate:"secureValueHash",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"}],type:"SecureValueHash"},{id:-391902247,predicate:"secureValueErrorData",params:[{name:"type",type:"SecureValueType"},{name:"data_hash",type:"bytes"},{name:"field",type:"string"},{name:"text",type:"string"}],type:"SecureValueError"},{id:12467706,predicate:"secureValueErrorFrontSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2037765467,predicate:"secureValueErrorReverseSide",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-449327402,predicate:"secureValueErrorSelfie",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:2054162547,predicate:"secureValueErrorFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:1717706985,predicate:"secureValueErrorFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:871426631,predicate:"secureCredentialsEncrypted",params:[{name:"data",type:"bytes"},{name:"hash",type:"bytes"},{name:"secret",type:"bytes"}],type:"SecureCredentialsEncrypted"},{id:-1389486888,predicate:"account.authorizationForm",params:[{name:"flags",type:"#"},{name:"required_types",type:"Vector"},{name:"values",type:"Vector"},{name:"errors",type:"Vector"},{name:"users",type:"Vector"},{name:"privacy_policy_url",type:"flags.0?string"}],type:"account.AuthorizationForm"},{id:-2128640689,predicate:"account.sentEmailCode",params:[{name:"email_pattern",type:"string"},{name:"length",type:"int"}],type:"account.SentEmailCode"},{id:455635795,predicate:"messageActionSecureValuesSentMe",params:[{name:"values",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"MessageAction"},{id:-648257196,predicate:"messageActionSecureValuesSent",params:[{name:"types",type:"Vector"}],type:"MessageAction"},{id:1722786150,predicate:"help.deepLinkInfoEmpty",params:[],type:"help.DeepLinkInfo"},{id:1783556146,predicate:"help.deepLinkInfo",params:[{name:"flags",type:"#"},{name:"update_app",type:"flags.0?true"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"help.DeepLinkInfo"},{id:289586518,predicate:"savedPhoneContact",params:[{name:"phone",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"date",type:"int"}],type:"SavedContact"},{id:1304052993,predicate:"account.takeout",params:[{name:"id",type:"long"}],type:"account.Takeout"},{id:700340377,predicate:"inputTakeoutFileLocation",params:[],type:"InputFileLocation"},{id:-513517117,predicate:"updateDialogUnreadMark",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"DialogPeer"}],type:"Update"},{id:-253500010,predicate:"messages.dialogsNotModified",params:[{name:"count",type:"int"}],type:"messages.Dialogs"},{id:-1625153079,predicate:"inputWebFileGeoPointLocation",params:[{name:"geo_point",type:"InputGeoPoint"},{name:"access_hash",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"zoom",type:"int"},{name:"scale",type:"int"}],type:"InputWebFileLocation"},{id:-1255369827,predicate:"contacts.topPeersDisabled",params:[],type:"contacts.TopPeers"},{id:-1685456582,predicate:"inputReportReasonCopyright",params:[],type:"ReportReason"},{id:-732254058,predicate:"passwordKdfAlgoUnknown",params:[],type:"PasswordKdfAlgo"},{id:4883767,predicate:"securePasswordKdfAlgoUnknown",params:[],type:"SecurePasswordKdfAlgo"},{id:-1141711456,predicate:"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:-2042159726,predicate:"securePasswordKdfAlgoSHA512",params:[{name:"salt",type:"bytes"}],type:"SecurePasswordKdfAlgo"},{id:354925740,predicate:"secureSecretSettings",params:[{name:"secure_algo",type:"SecurePasswordKdfAlgo"},{name:"secure_secret",type:"bytes"},{name:"secure_secret_id",type:"long"}],type:"SecureSecretSettings"},{id:982592842,predicate:"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow",params:[{name:"salt1",type:"bytes"},{name:"salt2",type:"bytes"},{name:"g",type:"int"},{name:"p",type:"bytes"}],type:"PasswordKdfAlgo"},{id:-1736378792,predicate:"inputCheckPasswordEmpty",params:[],type:"InputCheckPasswordSRP"},{id:-763367294,predicate:"inputCheckPasswordSRP",params:[{name:"srp_id",type:"long"},{name:"A",type:"bytes"},{name:"M1",type:"bytes"}],type:"InputCheckPasswordSRP"},{id:-2036501105,predicate:"secureValueError",params:[{name:"type",type:"SecureValueType"},{name:"hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-1592506512,predicate:"secureValueErrorTranslationFile",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"bytes"},{name:"text",type:"string"}],type:"SecureValueError"},{id:878931416,predicate:"secureValueErrorTranslationFiles",params:[{name:"type",type:"SecureValueType"},{name:"file_hash",type:"Vector"},{name:"text",type:"string"}],type:"SecureValueError"},{id:-2103600678,predicate:"secureRequiredType",params:[{name:"flags",type:"#"},{name:"native_names",type:"flags.0?true"},{name:"selfie_required",type:"flags.1?true"},{name:"translation_required",type:"flags.2?true"},{name:"type",type:"SecureValueType"}],type:"SecureRequiredType"},{id:41187252,predicate:"secureRequiredTypeOneOf",params:[{name:"types",type:"Vector"}],type:"SecureRequiredType"},{id:-1078332329,predicate:"help.passportConfigNotModified",params:[],type:"help.PassportConfig"},{id:-1600596305,predicate:"help.passportConfig",params:[{name:"hash",type:"int"},{name:"countries_langs",type:"DataJSON"}],type:"help.PassportConfig"},{id:488313413,predicate:"inputAppEvent",params:[{name:"time",type:"double"},{name:"type",type:"string"},{name:"peer",type:"long"},{name:"data",type:"JSONValue"}],type:"InputAppEvent"},{id:-1059185703,predicate:"jsonObjectValue",params:[{name:"key",type:"string"},{name:"value",type:"JSONValue"}],type:"JSONObjectValue"},{id:1064139624,predicate:"jsonNull",params:[],type:"JSONValue"},{id:-952869270,predicate:"jsonBool",params:[{name:"value",type:"Bool"}],type:"JSONValue"},{id:736157604,predicate:"jsonNumber",params:[{name:"value",type:"double"}],type:"JSONValue"},{id:-1222740358,predicate:"jsonString",params:[{name:"value",type:"string"}],type:"JSONValue"},{id:-146520221,predicate:"jsonArray",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:-1715350371,predicate:"jsonObject",params:[{name:"value",type:"Vector"}],type:"JSONValue"},{id:-1311015810,predicate:"inputNotifyBroadcasts",params:[],type:"InputNotifyPeer"},{id:-703403793,predicate:"notifyBroadcasts",params:[],type:"NotifyPeer"},{id:-311786236,predicate:"textSubscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:-939827711,predicate:"textSuperscript",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:55281185,predicate:"textMarked",params:[{name:"text",type:"RichText"}],type:"RichText"},{id:483104362,predicate:"textPhone",params:[{name:"text",type:"RichText"},{name:"phone",type:"string"}],type:"RichText"},{id:136105807,predicate:"textImage",params:[{name:"document_id",type:"long"},{name:"w",type:"int"},{name:"h",type:"int"}],type:"RichText"},{id:504660880,predicate:"pageBlockKicker",params:[{name:"text",type:"RichText"}],type:"PageBlock"},{id:878078826,predicate:"pageTableCell",params:[{name:"flags",type:"#"},{name:"header",type:"flags.0?true"},{name:"align_center",type:"flags.3?true"},{name:"align_right",type:"flags.4?true"},{name:"valign_middle",type:"flags.5?true"},{name:"valign_bottom",type:"flags.6?true"},{name:"text",type:"flags.7?RichText"},{name:"colspan",type:"flags.1?int"},{name:"rowspan",type:"flags.2?int"}],type:"PageTableCell"},{id:-524237339,predicate:"pageTableRow",params:[{name:"cells",type:"Vector"}],type:"PageTableRow"},{id:-1085412734,predicate:"pageBlockTable",params:[{name:"flags",type:"#"},{name:"bordered",type:"flags.0?true"},{name:"striped",type:"flags.1?true"},{name:"title",type:"RichText"},{name:"rows",type:"Vector"}],type:"PageBlock"},{id:1869903447,predicate:"pageCaption",params:[{name:"text",type:"RichText"},{name:"credit",type:"RichText"}],type:"PageCaption"},{id:-1188055347,predicate:"pageListItemText",params:[{name:"text",type:"RichText"}],type:"PageListItem"},{id:635466748,predicate:"pageListItemBlocks",params:[{name:"blocks",type:"Vector"}],type:"PageListItem"},{id:1577484359,predicate:"pageListOrderedItemText",params:[{name:"num",type:"string"},{name:"text",type:"RichText"}],type:"PageListOrderedItem"},{id:-1730311882,predicate:"pageListOrderedItemBlocks",params:[{name:"num",type:"string"},{name:"blocks",type:"Vector"}],type:"PageListOrderedItem"},{id:-1702174239,predicate:"pageBlockOrderedList",params:[{name:"items",type:"Vector"}],type:"PageBlock"},{id:1987480557,predicate:"pageBlockDetails",params:[{name:"flags",type:"#"},{name:"open",type:"flags.0?true"},{name:"blocks",type:"Vector"},{name:"title",type:"RichText"}],type:"PageBlock"},{id:-1282352120,predicate:"pageRelatedArticle",params:[{name:"flags",type:"#"},{name:"url",type:"string"},{name:"webpage_id",type:"long"},{name:"title",type:"flags.0?string"},{name:"description",type:"flags.1?string"},{name:"photo_id",type:"flags.2?long"},{name:"author",type:"flags.3?string"},{name:"published_date",type:"flags.4?int"}],type:"PageRelatedArticle"},{id:370236054,predicate:"pageBlockRelatedArticles",params:[{name:"title",type:"RichText"},{name:"articles",type:"Vector"}],type:"PageBlock"},{id:-1538310410,predicate:"pageBlockMap",params:[{name:"geo",type:"GeoPoint"},{name:"zoom",type:"int"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"caption",type:"PageCaption"}],type:"PageBlock"},{id:-1738178803,predicate:"page",params:[{name:"flags",type:"#"},{name:"part",type:"flags.0?true"},{name:"rtl",type:"flags.1?true"},{name:"v2",type:"flags.2?true"},{name:"url",type:"string"},{name:"blocks",type:"Vector"},{name:"photos",type:"Vector"},{name:"documents",type:"Vector"},{name:"views",type:"flags.3?int"}],type:"Page"},{id:-610373422,predicate:"inputPrivacyKeyPhoneP2P",params:[],type:"InputPrivacyKey"},{id:961092808,predicate:"privacyKeyPhoneP2P",params:[],type:"PrivacyKey"},{id:894777186,predicate:"textAnchor",params:[{name:"text",type:"RichText"},{name:"name",type:"string"}],type:"RichText"},{id:-1945767479,predicate:"help.supportName",params:[{name:"name",type:"string"}],type:"help.SupportName"},{id:-206688531,predicate:"help.userInfoEmpty",params:[],type:"help.UserInfo"},{id:32192344,predicate:"help.userInfo",params:[{name:"message",type:"string"},{name:"entities",type:"Vector"},{name:"author",type:"string"},{name:"date",type:"int"}],type:"help.UserInfo"},{id:-202219658,predicate:"messageActionContactSignUp",params:[],type:"MessageAction"},{id:-1398708869,predicate:"updateMessagePoll",params:[{name:"flags",type:"#"},{name:"poll_id",type:"long"},{name:"poll",type:"flags.0?Poll"},{name:"results",type:"PollResults"}],type:"Update"},{id:1823064809,predicate:"pollAnswer",params:[{name:"text",type:"string"},{name:"option",type:"bytes"}],type:"PollAnswer"},{id:-2032041631,predicate:"poll",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"closed",type:"flags.0?true"},{name:"public_voters",type:"flags.1?true"},{name:"multiple_choice",type:"flags.2?true"},{name:"quiz",type:"flags.3?true"},{name:"question",type:"string"},{name:"answers",type:"Vector"},{name:"close_period",type:"flags.4?int"},{name:"close_date",type:"flags.5?int"}],type:"Poll"},{id:997055186,predicate:"pollAnswerVoters",params:[{name:"flags",type:"#"},{name:"chosen",type:"flags.0?true"},{name:"correct",type:"flags.1?true"},{name:"option",type:"bytes"},{name:"voters",type:"int"}],type:"PollAnswerVoters"},{id:-591909213,predicate:"pollResults",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"results",type:"flags.1?Vector"},{name:"total_voters",type:"flags.2?int"},{name:"recent_voters",type:"flags.3?Vector"},{name:"solution",type:"flags.4?string"},{name:"solution_entities",type:"flags.4?Vector"}],type:"PollResults"},{id:261416433,predicate:"inputMediaPoll",params:[{name:"flags",type:"#"},{name:"poll",type:"Poll"},{name:"correct_answers",type:"flags.0?Vector"},{name:"solution",type:"flags.1?string"},{name:"solution_entities",type:"flags.1?Vector"}],type:"InputMedia"},{id:1272375192,predicate:"messageMediaPoll",params:[{name:"poll",type:"Poll"},{name:"results",type:"PollResults"}],type:"MessageMedia"},{id:-264117680,predicate:"chatOnlines",params:[{name:"onlines",type:"int"}],type:"ChatOnlines"},{id:1202287072,predicate:"statsURL",params:[{name:"url",type:"string"}],type:"StatsURL"},{id:-525288402,predicate:"photoStrippedSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:1605510357,predicate:"chatAdminRights",params:[{name:"flags",type:"#"},{name:"change_info",type:"flags.0?true"},{name:"post_messages",type:"flags.1?true"},{name:"edit_messages",type:"flags.2?true"},{name:"delete_messages",type:"flags.3?true"},{name:"ban_users",type:"flags.4?true"},{name:"invite_users",type:"flags.5?true"},{name:"pin_messages",type:"flags.7?true"},{name:"add_admins",type:"flags.9?true"},{name:"anonymous",type:"flags.10?true"},{name:"manage_call",type:"flags.11?true"},{name:"other",type:"flags.12?true"},{name:"manage_topics",type:"flags.13?true"}],type:"ChatAdminRights"},{id:-1626209256,predicate:"chatBannedRights",params:[{name:"flags",type:"#"},{name:"view_messages",type:"flags.0?true"},{name:"send_messages",type:"flags.1?true"},{name:"send_media",type:"flags.2?true"},{name:"send_stickers",type:"flags.3?true"},{name:"send_gifs",type:"flags.4?true"},{name:"send_games",type:"flags.5?true"},{name:"send_inline",type:"flags.6?true"},{name:"embed_links",type:"flags.7?true"},{name:"send_polls",type:"flags.8?true"},{name:"change_info",type:"flags.10?true"},{name:"invite_users",type:"flags.15?true"},{name:"pin_messages",type:"flags.17?true"},{name:"manage_topics",type:"flags.18?true"},{name:"until_date",type:"int"}],type:"ChatBannedRights"},{id:1421875280,predicate:"updateChatDefaultBannedRights",params:[{name:"peer",type:"Peer"},{name:"default_banned_rights",type:"ChatBannedRights"},{name:"version",type:"int"}],type:"Update"},{id:-433014407,predicate:"inputWallPaper",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputWallPaper"},{id:1913199744,predicate:"inputWallPaperSlug",params:[{name:"slug",type:"string"}],type:"InputWallPaper"},{id:-1150621555,predicate:"channelParticipantsContacts",params:[{name:"q",type:"string"}],type:"ChannelParticipantsFilter"},{id:771095562,predicate:"channelAdminLogEventActionDefaultBannedRights",params:[{name:"prev_banned_rights",type:"ChatBannedRights"},{name:"new_banned_rights",type:"ChatBannedRights"}],type:"ChannelAdminLogEventAction"},{id:-1895328189,predicate:"channelAdminLogEventActionStopPoll",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:471437699,predicate:"account.wallPapersNotModified",params:[],type:"account.WallPapers"},{id:-842824308,predicate:"account.wallPapers",params:[{name:"hash",type:"long"},{name:"wallpapers",type:"Vector"}],type:"account.WallPapers"},{id:-1973130814,predicate:"codeSettings",params:[{name:"flags",type:"#"},{name:"allow_flashcall",type:"flags.0?true"},{name:"current_number",type:"flags.1?true"},{name:"allow_app_hash",type:"flags.4?true"},{name:"allow_missed_call",type:"flags.5?true"},{name:"logout_tokens",type:"flags.6?Vector"}],type:"CodeSettings"},{id:499236004,predicate:"wallPaperSettings",params:[{name:"flags",type:"#"},{name:"blur",type:"flags.1?true"},{name:"motion",type:"flags.2?true"},{name:"background_color",type:"flags.0?int"},{name:"second_background_color",type:"flags.4?int"},{name:"third_background_color",type:"flags.5?int"},{name:"fourth_background_color",type:"flags.6?int"},{name:"intensity",type:"flags.3?int"},{name:"rotation",type:"flags.4?int"}],type:"WallPaperSettings"},{id:-1896171181,predicate:"autoDownloadSettings",params:[{name:"flags",type:"#"},{name:"disabled",type:"flags.0?true"},{name:"video_preload_large",type:"flags.1?true"},{name:"audio_preload_next",type:"flags.2?true"},{name:"phonecalls_less_data",type:"flags.3?true"},{name:"photo_size_max",type:"int"},{name:"video_size_max",type:"long"},{name:"file_size_max",type:"long"},{name:"video_upload_maxbitrate",type:"int"}],type:"AutoDownloadSettings"},{id:1674235686,predicate:"account.autoDownloadSettings",params:[{name:"low",type:"AutoDownloadSettings"},{name:"medium",type:"AutoDownloadSettings"},{name:"high",type:"AutoDownloadSettings"}],type:"account.AutoDownloadSettings"},{id:-709641735,predicate:"emojiKeyword",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:594408994,predicate:"emojiKeywordDeleted",params:[{name:"keyword",type:"string"},{name:"emoticons",type:"Vector"}],type:"EmojiKeyword"},{id:1556570557,predicate:"emojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"},{name:"version",type:"int"},{name:"keywords",type:"Vector"}],type:"EmojiKeywordsDifference"},{id:-1519029347,predicate:"emojiURL",params:[{name:"url",type:"string"}],type:"EmojiURL"},{id:-1275374751,predicate:"emojiLanguage",params:[{name:"lang_code",type:"string"}],type:"EmojiLanguage"},{id:-1529000952,predicate:"inputPrivacyKeyForwards",params:[],type:"InputPrivacyKey"},{id:1777096355,predicate:"privacyKeyForwards",params:[],type:"PrivacyKey"},{id:1461304012,predicate:"inputPrivacyKeyProfilePhoto",params:[],type:"InputPrivacyKey"},{id:-1777000467,predicate:"privacyKeyProfilePhoto",params:[],type:"PrivacyKey"},{id:1075322878,predicate:"inputPhotoFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"thumb_size",type:"string"}],type:"InputFileLocation"},{id:-667654413,predicate:"inputPhotoLegacyFileLocation",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"file_reference",type:"bytes"},{name:"volume_id",type:"long"},{name:"local_id",type:"int"},{name:"secret",type:"long"}],type:"InputFileLocation"},{id:925204121,predicate:"inputPeerPhotoFileLocation",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"photo_id",type:"long"}],type:"InputFileLocation"},{id:-1652231205,predicate:"inputStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb_version",type:"int"}],type:"InputFileLocation"},{id:-11252123,predicate:"folder",params:[{name:"flags",type:"#"},{name:"autofill_new_broadcasts",type:"flags.0?true"},{name:"autofill_public_groups",type:"flags.1?true"},{name:"autofill_new_correspondents",type:"flags.2?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"photo",type:"flags.3?ChatPhoto"}],type:"Folder"},{id:1908216652,predicate:"dialogFolder",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.2?true"},{name:"folder",type:"Folder"},{name:"peer",type:"Peer"},{name:"top_message",type:"int"},{name:"unread_muted_peers_count",type:"int"},{name:"unread_unmuted_peers_count",type:"int"},{name:"unread_muted_messages_count",type:"int"},{name:"unread_unmuted_messages_count",type:"int"}],type:"Dialog"},{id:1684014375,predicate:"inputDialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"InputDialogPeer"},{id:1363483106,predicate:"dialogPeerFolder",params:[{name:"folder_id",type:"int"}],type:"DialogPeer"},{id:-70073706,predicate:"inputFolderPeer",params:[{name:"peer",type:"InputPeer"},{name:"folder_id",type:"int"}],type:"InputFolderPeer"},{id:-373643672,predicate:"folderPeer",params:[{name:"peer",type:"Peer"},{name:"folder_id",type:"int"}],type:"FolderPeer"},{id:422972864,predicate:"updateFolderPeers",params:[{name:"folder_peers",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:497305826,predicate:"inputUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputUser"},{id:1536380829,predicate:"inputChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputChannel"},{id:-1468331492,predicate:"inputPeerUserFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"user_id",type:"long"}],type:"InputPeer"},{id:-1121318848,predicate:"inputPeerChannelFromMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"channel_id",type:"long"}],type:"InputPeer"},{id:55761658,predicate:"inputPrivacyKeyPhoneNumber",params:[],type:"InputPrivacyKey"},{id:-778378131,predicate:"privacyKeyPhoneNumber",params:[],type:"PrivacyKey"},{id:-1472172887,predicate:"topPeerCategoryForwardUsers",params:[],type:"TopPeerCategory"},{id:-68239120,predicate:"topPeerCategoryForwardChats",params:[],type:"TopPeerCategory"},{id:84703944,predicate:"channelAdminLogEventActionChangeLinkedChat",params:[{name:"prev_value",type:"long"},{name:"new_value",type:"long"}],type:"ChannelAdminLogEventAction"},{id:-398136321,predicate:"messages.searchCounter",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.1?true"},{name:"filter",type:"MessagesFilter"},{name:"count",type:"int"}],type:"messages.SearchCounter"},{id:280464681,predicate:"keyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.0?string"},{name:"url",type:"string"},{name:"button_id",type:"int"}],type:"KeyboardButton"},{id:-802258988,predicate:"inputKeyboardButtonUrlAuth",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"text",type:"string"},{name:"fwd_text",type:"flags.1?string"},{name:"url",type:"string"},{name:"bot",type:"InputUser"}],type:"KeyboardButton"},{id:-1831650802,predicate:"urlAuthResultRequest",params:[{name:"flags",type:"#"},{name:"request_write_access",type:"flags.0?true"},{name:"bot",type:"User"},{name:"domain",type:"string"}],type:"UrlAuthResult"},{id:-1886646706,predicate:"urlAuthResultAccepted",params:[{name:"url",type:"string"}],type:"UrlAuthResult"},{id:-1445536993,predicate:"urlAuthResultDefault",params:[],type:"UrlAuthResult"},{id:-2079962673,predicate:"inputPrivacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:-380694650,predicate:"inputPrivacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"InputPrivacyRule"},{id:1796427406,predicate:"privacyValueAllowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:1103656293,predicate:"privacyValueDisallowChatParticipants",params:[{name:"chats",type:"Vector"}],type:"PrivacyRule"},{id:-1672577397,predicate:"messageEntityUnderline",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1090087980,predicate:"messageEntityStrike",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:34469328,predicate:"messageEntityBlockquote",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:1786671974,predicate:"updatePeerSettings",params:[{name:"peer",type:"Peer"},{name:"settings",type:"PeerSettings"}],type:"Update"},{id:-1078612597,predicate:"channelLocationEmpty",params:[],type:"ChannelLocation"},{id:547062491,predicate:"channelLocation",params:[{name:"geo_point",type:"GeoPoint"},{name:"address",type:"string"}],type:"ChannelLocation"},{id:-901375139,predicate:"peerLocated",params:[{name:"peer",type:"Peer"},{name:"expires",type:"int"},{name:"distance",type:"int"}],type:"PeerLocated"},{id:-1263546448,predicate:"updatePeerLocated",params:[{name:"peers",type:"Vector"}],type:"Update"},{id:241923758,predicate:"channelAdminLogEventActionChangeLocation",params:[{name:"prev_value",type:"ChannelLocation"},{name:"new_value",type:"ChannelLocation"}],type:"ChannelAdminLogEventAction"},{id:-606798099,predicate:"inputReportReasonGeoIrrelevant",params:[],type:"ReportReason"},{id:1401984889,predicate:"channelAdminLogEventActionToggleSlowMode",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:1148485274,predicate:"auth.authorizationSignUpRequired",params:[{name:"flags",type:"#"},{name:"terms_of_service",type:"flags.0?help.TermsOfService"}],type:"auth.Authorization"},{id:-666824391,predicate:"payments.paymentVerificationNeeded",params:[{name:"url",type:"string"}],type:"payments.PaymentResult"},{id:42402760,predicate:"inputStickerSetAnimatedEmoji",params:[],type:"InputStickerSet"},{id:967122427,predicate:"updateNewScheduledMessage",params:[{name:"message",type:"Message"}],type:"Update"},{id:-1870238482,predicate:"updateDeleteScheduledMessages",params:[{name:"peer",type:"Peer"},{name:"messages",type:"Vector"}],type:"Update"},{id:-797791052,predicate:"restrictionReason",params:[{name:"platform",type:"string"},{name:"reason",type:"string"},{name:"text",type:"string"}],type:"RestrictionReason"},{id:1012306921,predicate:"inputTheme",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputTheme"},{id:-175567375,predicate:"inputThemeSlug",params:[{name:"slug",type:"string"}],type:"InputTheme"},{id:-1609668650,predicate:"theme",params:[{name:"flags",type:"#"},{name:"creator",type:"flags.0?true"},{name:"default",type:"flags.1?true"},{name:"for_chat",type:"flags.5?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?Document"},{name:"settings",type:"flags.3?Vector"},{name:"emoticon",type:"flags.6?string"},{name:"installs_count",type:"flags.4?int"}],type:"Theme"},{id:-199313886,predicate:"account.themesNotModified",params:[],type:"account.Themes"},{id:-1707242387,predicate:"account.themes",params:[{name:"hash",type:"long"},{name:"themes",type:"Vector"}],type:"account.Themes"},{id:-2112423005,predicate:"updateTheme",params:[{name:"theme",type:"Theme"}],type:"Update"},{id:-786326563,predicate:"inputPrivacyKeyAddedByPhone",params:[],type:"InputPrivacyKey"},{id:1124062251,predicate:"privacyKeyAddedByPhone",params:[],type:"PrivacyKey"},{id:-2027964103,predicate:"updateGeoLiveViewed",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"}],type:"Update"},{id:1448076945,predicate:"updateLoginToken",params:[],type:"Update"},{id:1654593920,predicate:"auth.loginToken",params:[{name:"expires",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:110008598,predicate:"auth.loginTokenMigrateTo",params:[{name:"dc_id",type:"int"},{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:957176926,predicate:"auth.loginTokenSuccess",params:[{name:"authorization",type:"auth.Authorization"}],type:"auth.LoginToken"},{id:1474462241,predicate:"account.contentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"},{name:"sensitive_can_change",type:"flags.1?true"}],type:"account.ContentSettings"},{id:-1456996667,predicate:"messages.inactiveChats",params:[{name:"dates",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.InactiveChats"},{id:-1012849566,predicate:"baseThemeClassic",params:[],type:"BaseTheme"},{id:-69724536,predicate:"baseThemeDay",params:[],type:"BaseTheme"},{id:-1212997976,predicate:"baseThemeNight",params:[],type:"BaseTheme"},{id:1834973166,predicate:"baseThemeTinted",params:[],type:"BaseTheme"},{id:1527845466,predicate:"baseThemeArctic",params:[],type:"BaseTheme"},{id:-1770371538,predicate:"inputWallPaperNoFile",params:[{name:"id",type:"long"}],type:"InputWallPaper"},{id:-528465642,predicate:"wallPaperNoFile",params:[{name:"id",type:"long"},{name:"flags",type:"#"},{name:"default",type:"flags.1?true"},{name:"dark",type:"flags.4?true"},{name:"settings",type:"flags.2?WallPaperSettings"}],type:"WallPaper"},{id:-1881255857,predicate:"inputThemeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?InputWallPaper"},{name:"wallpaper_settings",type:"flags.1?WallPaperSettings"}],type:"InputThemeSettings"},{id:-94849324,predicate:"themeSettings",params:[{name:"flags",type:"#"},{name:"message_colors_animated",type:"flags.2?true"},{name:"base_theme",type:"BaseTheme"},{name:"accent_color",type:"int"},{name:"outbox_accent_color",type:"flags.3?int"},{name:"message_colors",type:"flags.0?Vector"},{name:"wallpaper",type:"flags.1?WallPaper"}],type:"ThemeSettings"},{id:1421174295,predicate:"webPageAttributeTheme",params:[{name:"flags",type:"#"},{name:"documents",type:"flags.0?Vector"},{name:"settings",type:"flags.1?ThemeSettings"}],type:"WebPageAttribute"},{id:274961865,predicate:"updateMessagePollVote",params:[{name:"poll_id",type:"long"},{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"qts",type:"int"}],type:"Update"},{id:886196148,predicate:"messageUserVote",params:[{name:"user_id",type:"long"},{name:"option",type:"bytes"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:1017491692,predicate:"messageUserVoteInputOption",params:[{name:"user_id",type:"long"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:-1973033641,predicate:"messageUserVoteMultiple",params:[{name:"user_id",type:"long"},{name:"options",type:"Vector"},{name:"date",type:"int"}],type:"MessageUserVote"},{id:136574537,predicate:"messages.votesList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"votes",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.VotesList"},{id:-1144565411,predicate:"keyboardButtonRequestPoll",params:[{name:"flags",type:"#"},{name:"quiz",type:"flags.0?Bool"},{name:"text",type:"string"}],type:"KeyboardButton"},{id:1981704948,predicate:"messageEntityBankCard",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-177732982,predicate:"bankCardOpenUrl",params:[{name:"url",type:"string"},{name:"name",type:"string"}],type:"BankCardOpenUrl"},{id:1042605427,predicate:"payments.bankCardData",params:[{name:"title",type:"string"},{name:"open_urls",type:"Vector"}],type:"payments.BankCardData"},{id:-118740917,predicate:"peerSelfLocated",params:[{name:"expires",type:"int"}],type:"PeerLocated"},{id:1949890536,predicate:"dialogFilter",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"non_contacts",type:"flags.1?true"},{name:"groups",type:"flags.2?true"},{name:"broadcasts",type:"flags.3?true"},{name:"bots",type:"flags.4?true"},{name:"exclude_muted",type:"flags.11?true"},{name:"exclude_read",type:"flags.12?true"},{name:"exclude_archived",type:"flags.13?true"},{name:"id",type:"int"},{name:"title",type:"string"},{name:"emoticon",type:"flags.25?string"},{name:"pinned_peers",type:"Vector"},{name:"include_peers",type:"Vector"},{name:"exclude_peers",type:"Vector"}],type:"DialogFilter"},{id:2004110666,predicate:"dialogFilterSuggested",params:[{name:"filter",type:"DialogFilter"},{name:"description",type:"string"}],type:"DialogFilterSuggested"},{id:654302845,predicate:"updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Update"},{id:-1512627963,predicate:"updateDialogFilterOrder",params:[{name:"order",type:"Vector"}],type:"Update"},{id:889491791,predicate:"updateDialogFilters",params:[],type:"Update"},{id:-1237848657,predicate:"statsDateRangeDays",params:[{name:"min_date",type:"int"},{name:"max_date",type:"int"}],type:"StatsDateRangeDays"},{id:-884757282,predicate:"statsAbsValueAndPrev",params:[{name:"current",type:"double"},{name:"previous",type:"double"}],type:"StatsAbsValueAndPrev"},{id:-875679776,predicate:"statsPercentValue",params:[{name:"part",type:"double"},{name:"total",type:"double"}],type:"StatsPercentValue"},{id:1244130093,predicate:"statsGraphAsync",params:[{name:"token",type:"string"}],type:"StatsGraph"},{id:-1092839390,predicate:"statsGraphError",params:[{name:"error",type:"string"}],type:"StatsGraph"},{id:-1901828938,predicate:"statsGraph",params:[{name:"flags",type:"#"},{name:"json",type:"DataJSON"},{name:"zoom_token",type:"flags.0?string"}],type:"StatsGraph"},{id:-1387279939,predicate:"messageInteractionCounters",params:[{name:"msg_id",type:"int"},{name:"views",type:"int"},{name:"forwards",type:"int"}],type:"MessageInteractionCounters"},{id:-1107852396,predicate:"stats.broadcastStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"followers",type:"StatsAbsValueAndPrev"},{name:"views_per_post",type:"StatsAbsValueAndPrev"},{name:"shares_per_post",type:"StatsAbsValueAndPrev"},{name:"enabled_notifications",type:"StatsPercentValue"},{name:"growth_graph",type:"StatsGraph"},{name:"followers_graph",type:"StatsGraph"},{name:"mute_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"interactions_graph",type:"StatsGraph"},{name:"iv_interactions_graph",type:"StatsGraph"},{name:"views_by_source_graph",type:"StatsGraph"},{name:"new_followers_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"recent_message_interactions",type:"Vector"}],type:"stats.BroadcastStats"},{id:-428884101,predicate:"inputMediaDice",params:[{name:"emoticon",type:"string"}],type:"InputMedia"},{id:1065280907,predicate:"messageMediaDice",params:[{name:"value",type:"int"},{name:"emoticon",type:"string"}],type:"MessageMedia"},{id:-427863538,predicate:"inputStickerSetDice",params:[{name:"emoticon",type:"string"}],type:"InputStickerSet"},{id:-1728664459,predicate:"help.promoDataEmpty",params:[{name:"expires",type:"int"}],type:"help.PromoData"},{id:-1942390465,predicate:"help.promoData",params:[{name:"flags",type:"#"},{name:"proxy",type:"flags.0?true"},{name:"expires",type:"int"},{name:"peer",type:"Peer"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"psa_type",type:"flags.1?string"},{name:"psa_message",type:"flags.2?string"}],type:"help.PromoData"},{id:-567037804,predicate:"videoSize",params:[{name:"flags",type:"#"},{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"size",type:"int"},{name:"video_start_ts",type:"flags.0?double"}],type:"VideoSize"},{id:643940105,predicate:"updatePhoneCallSignalingData",params:[{name:"phone_call_id",type:"long"},{name:"data",type:"bytes"}],type:"Update"},{id:1634294960,predicate:"chatInvitePeek",params:[{name:"chat",type:"Chat"},{name:"expires",type:"int"}],type:"ChatInvite"},{id:-1660637285,predicate:"statsGroupTopPoster",params:[{name:"user_id",type:"long"},{name:"messages",type:"int"},{name:"avg_chars",type:"int"}],type:"StatsGroupTopPoster"},{id:-682079097,predicate:"statsGroupTopAdmin",params:[{name:"user_id",type:"long"},{name:"deleted",type:"int"},{name:"kicked",type:"int"},{name:"banned",type:"int"}],type:"StatsGroupTopAdmin"},{id:1398765469,predicate:"statsGroupTopInviter",params:[{name:"user_id",type:"long"},{name:"invitations",type:"int"}],type:"StatsGroupTopInviter"},{id:-276825834,predicate:"stats.megagroupStats",params:[{name:"period",type:"StatsDateRangeDays"},{name:"members",type:"StatsAbsValueAndPrev"},{name:"messages",type:"StatsAbsValueAndPrev"},{name:"viewers",type:"StatsAbsValueAndPrev"},{name:"posters",type:"StatsAbsValueAndPrev"},{name:"growth_graph",type:"StatsGraph"},{name:"members_graph",type:"StatsGraph"},{name:"new_members_by_source_graph",type:"StatsGraph"},{name:"languages_graph",type:"StatsGraph"},{name:"messages_graph",type:"StatsGraph"},{name:"actions_graph",type:"StatsGraph"},{name:"top_hours_graph",type:"StatsGraph"},{name:"weekdays_graph",type:"StatsGraph"},{name:"top_posters",type:"Vector"},{name:"top_admins",type:"Vector"},{name:"top_inviters",type:"Vector"},{name:"users",type:"Vector"}],type:"stats.MegagroupStats"},{id:-1096616924,predicate:"globalPrivacySettings",params:[{name:"flags",type:"#"},{name:"archive_and_mute_new_noncontact_peers",type:"flags.0?Bool"}],type:"GlobalPrivacySettings"},{id:1667228533,predicate:"phoneConnectionWebrtc",params:[{name:"flags",type:"#"},{name:"turn",type:"flags.0?true"},{name:"stun",type:"flags.1?true"},{name:"id",type:"long"},{name:"ip",type:"string"},{name:"ipv6",type:"string"},{name:"port",type:"int"},{name:"username",type:"string"},{name:"password",type:"string"}],type:"PhoneConnection"},{id:1107543535,predicate:"help.countryCode",params:[{name:"flags",type:"#"},{name:"country_code",type:"string"},{name:"prefixes",type:"flags.0?Vector"},{name:"patterns",type:"flags.1?Vector"}],type:"help.CountryCode"},{id:-1014526429,predicate:"help.country",params:[{name:"flags",type:"#"},{name:"hidden",type:"flags.0?true"},{name:"iso2",type:"string"},{name:"default_name",type:"string"},{name:"name",type:"flags.1?string"},{name:"country_codes",type:"Vector"}],type:"help.Country"},{id:-1815339214,predicate:"help.countriesListNotModified",params:[],type:"help.CountriesList"},{id:-2016381538,predicate:"help.countriesList",params:[{name:"countries",type:"Vector"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:1163625789,predicate:"messageViews",params:[{name:"flags",type:"#"},{name:"views",type:"flags.0?int"},{name:"forwards",type:"flags.1?int"},{name:"replies",type:"flags.2?MessageReplies"}],type:"MessageViews"},{id:-761649164,predicate:"updateChannelMessageForwards",params:[{name:"channel_id",type:"long"},{name:"id",type:"int"},{name:"forwards",type:"int"}],type:"Update"},{id:-96535659,predicate:"photoSizeProgressive",params:[{name:"type",type:"string"},{name:"w",type:"int"},{name:"h",type:"int"},{name:"sizes",type:"Vector"}],type:"PhotoSize"},{id:-1228606141,predicate:"messages.messageViews",params:[{name:"views",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.MessageViews"},{id:-693004986,predicate:"updateReadChannelDiscussionInbox",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"},{name:"broadcast_id",type:"flags.0?long"},{name:"broadcast_post",type:"flags.0?int"}],type:"Update"},{id:1767677564,predicate:"updateReadChannelDiscussionOutbox",params:[{name:"channel_id",type:"long"},{name:"top_msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Update"},{id:-1506535550,predicate:"messages.discussionMessage",params:[{name:"flags",type:"#"},{name:"messages",type:"Vector"},{name:"max_id",type:"flags.0?int"},{name:"read_inbox_max_id",type:"flags.1?int"},{name:"read_outbox_max_id",type:"flags.2?int"},{name:"unread_count",type:"int"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.DiscussionMessage"},{id:-1495959709,predicate:"messageReplyHeader",params:[{name:"flags",type:"#"},{name:"reply_to_scheduled",type:"flags.2?true"},{name:"forum_topic",type:"flags.3?true"},{name:"reply_to_msg_id",type:"int"},{name:"reply_to_peer_id",type:"flags.0?Peer"},{name:"reply_to_top_id",type:"flags.1?int"}],type:"MessageReplyHeader"},{id:-2083123262,predicate:"messageReplies",params:[{name:"flags",type:"#"},{name:"comments",type:"flags.0?true"},{name:"replies",type:"int"},{name:"replies_pts",type:"int"},{name:"recent_repliers",type:"flags.1?Vector"},{name:"channel_id",type:"flags.0?long"},{name:"max_id",type:"flags.2?int"},{name:"read_max_id",type:"flags.3?int"}],type:"MessageReplies"},{id:610945826,predicate:"updatePeerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"blocked",type:"Bool"}],type:"Update"},{id:-386039788,predicate:"peerBlocked",params:[{name:"peer_id",type:"Peer"},{name:"date",type:"int"}],type:"PeerBlocked"},{id:-1937192669,predicate:"updateChannelUserTyping",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"top_msg_id",type:"flags.0?int"},{name:"from_id",type:"Peer"},{name:"action",type:"SendMessageAction"}],type:"Update"},{id:-1392895362,predicate:"inputMessageCallbackQuery",params:[{name:"id",type:"int"},{name:"query_id",type:"long"}],type:"InputMessage"},{id:453242886,predicate:"channelParticipantLeft",params:[{name:"peer",type:"Peer"}],type:"ChannelParticipant"},{id:-531931925,predicate:"channelParticipantsMentions",params:[{name:"flags",type:"#"},{name:"q",type:"flags.0?string"},{name:"top_msg_id",type:"flags.1?int"}],type:"ChannelParticipantsFilter"},{id:-309990731,predicate:"updatePinnedMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:1538885128,predicate:"updatePinnedChannelMessages",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"channel_id",type:"long"},{name:"messages",type:"Vector"},{name:"pts",type:"int"},{name:"pts_count",type:"int"}],type:"Update"},{id:464520273,predicate:"inputMessagesFilterPinned",params:[],type:"MessagesFilter"},{id:-1986399595,predicate:"stats.messageStats",params:[{name:"views_graph",type:"StatsGraph"}],type:"stats.MessageStats"},{id:-1730095465,predicate:"messageActionGeoProximityReached",params:[{name:"from_id",type:"Peer"},{name:"to_id",type:"Peer"},{name:"distance",type:"int"}],type:"MessageAction"},{id:-668906175,predicate:"photoPathSize",params:[{name:"type",type:"string"},{name:"bytes",type:"bytes"}],type:"PhotoSize"},{id:-651419003,predicate:"speakingInGroupCallAction",params:[],type:"SendMessageAction"},{id:2004925620,predicate:"groupCallDiscarded",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"duration",type:"int"}],type:"GroupCall"},{id:-711498484,predicate:"groupCall",params:[{name:"flags",type:"#"},{name:"join_muted",type:"flags.1?true"},{name:"can_change_join_muted",type:"flags.2?true"},{name:"join_date_asc",type:"flags.6?true"},{name:"schedule_start_subscribed",type:"flags.8?true"},{name:"can_start_video",type:"flags.9?true"},{name:"record_video_active",type:"flags.11?true"},{name:"rtmp_stream",type:"flags.12?true"},{name:"listeners_hidden",type:"flags.13?true"},{name:"id",type:"long"},{name:"access_hash",type:"long"},{name:"participants_count",type:"int"},{name:"title",type:"flags.3?string"},{name:"stream_dc_id",type:"flags.4?int"},{name:"record_start_date",type:"flags.5?int"},{name:"schedule_date",type:"flags.7?int"},{name:"unmuted_video_count",type:"flags.10?int"},{name:"unmuted_video_limit",type:"int"},{name:"version",type:"int"}],type:"GroupCall"},{id:-659913713,predicate:"inputGroupCall",params:[{name:"id",type:"long"},{name:"access_hash",type:"long"}],type:"InputGroupCall"},{id:2047704898,predicate:"messageActionGroupCall",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"duration",type:"flags.0?int"}],type:"MessageAction"},{id:1345295095,predicate:"messageActionInviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"MessageAction"},{id:-341428482,predicate:"groupCallParticipant",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"left",type:"flags.1?true"},{name:"can_self_unmute",type:"flags.2?true"},{name:"just_joined",type:"flags.4?true"},{name:"versioned",type:"flags.5?true"},{name:"min",type:"flags.8?true"},{name:"muted_by_you",type:"flags.9?true"},{name:"volume_by_admin",type:"flags.10?true"},{name:"self",type:"flags.12?true"},{name:"video_joined",type:"flags.15?true"},{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"active_date",type:"flags.3?int"},{name:"source",type:"int"},{name:"volume",type:"flags.7?int"},{name:"about",type:"flags.11?string"},{name:"raise_hand_rating",type:"flags.13?long"},{name:"video",type:"flags.6?GroupCallParticipantVideo"},{name:"presentation",type:"flags.14?GroupCallParticipantVideo"}],type:"GroupCallParticipant"},{id:-124097970,predicate:"updateChat",params:[{name:"chat_id",type:"long"}],type:"Update"},{id:-219423922,predicate:"updateGroupCallParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"participants",type:"Vector"},{name:"version",type:"int"}],type:"Update"},{id:347227392,predicate:"updateGroupCall",params:[{name:"chat_id",type:"long"},{name:"call",type:"GroupCall"}],type:"Update"},{id:-1636664659,predicate:"phone.groupCall",params:[{name:"call",type:"GroupCall"},{name:"participants",type:"Vector"},{name:"participants_next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.GroupCall"},{id:-193506890,predicate:"phone.groupParticipants",params:[{name:"count",type:"int"},{name:"participants",type:"Vector"},{name:"next_offset",type:"string"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"version",type:"int"}],type:"phone.GroupParticipants"},{id:813821341,predicate:"inlineQueryPeerTypeSameBotPM",params:[],type:"InlineQueryPeerType"},{id:-2093215828,predicate:"inlineQueryPeerTypePM",params:[],type:"InlineQueryPeerType"},{id:-681130742,predicate:"inlineQueryPeerTypeChat",params:[],type:"InlineQueryPeerType"},{id:1589952067,predicate:"inlineQueryPeerTypeMegagroup",params:[],type:"InlineQueryPeerType"},{id:1664413338,predicate:"inlineQueryPeerTypeBroadcast",params:[],type:"InlineQueryPeerType"},{id:589338437,predicate:"channelAdminLogEventActionStartGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-610299584,predicate:"channelAdminLogEventActionDiscardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"ChannelAdminLogEventAction"},{id:-115071790,predicate:"channelAdminLogEventActionParticipantMute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:-431740480,predicate:"channelAdminLogEventActionParticipantUnmute",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1456906823,predicate:"channelAdminLogEventActionToggleGroupCallSetting",params:[{name:"join_muted",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-1966921727,predicate:"inputPaymentCredentialsGooglePay",params:[{name:"payment_token",type:"DataJSON"}],type:"InputPaymentCredentials"},{id:375566091,predicate:"messages.historyImport",params:[{name:"id",type:"long"}],type:"messages.HistoryImport"},{id:-606432698,predicate:"sendMessageHistoryImportAction",params:[{name:"progress",type:"int"}],type:"SendMessageAction"},{id:1578088377,predicate:"messages.historyImportParsed",params:[{name:"flags",type:"#"},{name:"pm",type:"flags.0?true"},{name:"group",type:"flags.1?true"},{name:"title",type:"flags.2?string"}],type:"messages.HistoryImportParsed"},{id:-170010905,predicate:"inputReportReasonFake",params:[],type:"ReportReason"},{id:-275956116,predicate:"messages.affectedFoundMessages",params:[{name:"pts",type:"int"},{name:"pts_count",type:"int"},{name:"offset",type:"int"},{name:"messages",type:"Vector"}],type:"messages.AffectedFoundMessages"},{id:1007897979,predicate:"messageActionSetMessagesTTL",params:[{name:"flags",type:"#"},{name:"period",type:"int"},{name:"auto_setting_from",type:"flags.0?long"}],type:"MessageAction"},{id:-1147422299,predicate:"updatePeerHistoryTTL",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"ttl_period",type:"flags.0?int"}],type:"Update"},{id:-796432838,predicate:"updateChatParticipant",params:[{name:"flags",type:"#"},{name:"chat_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChatParticipant"},{name:"new_participant",type:"flags.1?ChatParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-1738720581,predicate:"updateChannelParticipant",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"date",type:"int"},{name:"actor_id",type:"long"},{name:"user_id",type:"long"},{name:"prev_participant",type:"flags.0?ChannelParticipant"},{name:"new_participant",type:"flags.1?ChannelParticipant"},{name:"invite",type:"flags.2?ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-997782967,predicate:"updateBotStopped",params:[{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"stopped",type:"Bool"},{name:"qts",type:"int"}],type:"Update"},{id:-1940201511,predicate:"chatInviteImporter",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"user_id",type:"long"},{name:"date",type:"int"},{name:"about",type:"flags.2?string"},{name:"approved_by",type:"flags.1?long"}],type:"ChatInviteImporter"},{id:-1111085620,predicate:"messages.exportedChatInvites",params:[{name:"count",type:"int"},{name:"invites",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvites"},{id:410107472,predicate:"messages.exportedChatInvite",params:[{name:"invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:572915951,predicate:"messages.exportedChatInviteReplaced",params:[{name:"invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"},{name:"users",type:"Vector"}],type:"messages.ExportedChatInvite"},{id:-2118733814,predicate:"messages.chatInviteImporters",params:[{name:"count",type:"int"},{name:"importers",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatInviteImporters"},{id:-219353309,predicate:"chatAdminWithInvites",params:[{name:"admin_id",type:"long"},{name:"invites_count",type:"int"},{name:"revoked_invites_count",type:"int"}],type:"ChatAdminWithInvites"},{id:-1231326505,predicate:"messages.chatAdminsWithInvites",params:[{name:"admins",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.ChatAdminsWithInvites"},{id:1557846647,predicate:"channelAdminLogEventActionParticipantJoinByInvite",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1515256996,predicate:"channelAdminLogEventActionExportedInviteDelete",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1091179342,predicate:"channelAdminLogEventActionExportedInviteRevoke",params:[{name:"invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:-384910503,predicate:"channelAdminLogEventActionExportedInviteEdit",params:[{name:"prev_invite",type:"ExportedChatInvite"},{name:"new_invite",type:"ExportedChatInvite"}],type:"ChannelAdminLogEventAction"},{id:1048537159,predicate:"channelAdminLogEventActionParticipantVolume",params:[{name:"participant",type:"GroupCallParticipant"}],type:"ChannelAdminLogEventAction"},{id:1855199800,predicate:"channelAdminLogEventActionChangeHistoryTTL",params:[{name:"prev_value",type:"int"},{name:"new_value",type:"int"}],type:"ChannelAdminLogEventAction"},{id:-1571952873,predicate:"messages.checkedHistoryImportPeer",params:[{name:"confirm_text",type:"string"}],type:"messages.CheckedHistoryImportPeer"},{id:93890858,predicate:"inputGroupCallStream",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"time_ms",type:"long"},{name:"scale",type:"int"},{name:"video_channel",type:"flags.0?int"},{name:"video_quality",type:"flags.0?int"}],type:"InputFileLocation"},{id:-1343921601,predicate:"phone.joinAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"phone.JoinAsPeers"},{id:541839704,predicate:"phone.exportedGroupCallInvite",params:[{name:"link",type:"string"}],type:"phone.ExportedGroupCallInvite"},{id:-672693723,predicate:"inputBotInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?InputWebDocument"},{name:"invoice",type:"Invoice"},{name:"payload",type:"bytes"},{name:"provider",type:"string"},{name:"provider_data",type:"DataJSON"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"InputBotInlineMessage"},{id:894081801,predicate:"botInlineMessageMediaInvoice",params:[{name:"flags",type:"#"},{name:"shipping_address_requested",type:"flags.1?true"},{name:"test",type:"flags.3?true"},{name:"title",type:"string"},{name:"description",type:"string"},{name:"photo",type:"flags.0?WebDocument"},{name:"currency",type:"string"},{name:"total_amount",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"}],type:"BotInlineMessage"},{id:-1281329567,predicate:"messageActionGroupCallScheduled",params:[{name:"call",type:"InputGroupCall"},{name:"schedule_date",type:"int"}],type:"MessageAction"},{id:-592373577,predicate:"groupCallParticipantVideoSourceGroup",params:[{name:"semantics",type:"string"},{name:"sources",type:"Vector"}],type:"GroupCallParticipantVideoSourceGroup"},{id:1735736008,predicate:"groupCallParticipantVideo",params:[{name:"flags",type:"#"},{name:"paused",type:"flags.0?true"},{name:"endpoint",type:"string"},{name:"source_groups",type:"Vector"},{name:"audio_source",type:"flags.1?int"}],type:"GroupCallParticipantVideo"},{id:192428418,predicate:"updateGroupCallConnection",params:[{name:"flags",type:"#"},{name:"presentation",type:"flags.0?true"},{name:"params",type:"DataJSON"}],type:"Update"},{id:-2046910401,predicate:"stickers.suggestedShortName",params:[{name:"short_name",type:"string"}],type:"stickers.SuggestedShortName"},{id:795652779,predicate:"botCommandScopeDefault",params:[],type:"BotCommandScope"},{id:1011811544,predicate:"botCommandScopeUsers",params:[],type:"BotCommandScope"},{id:1877059713,predicate:"botCommandScopeChats",params:[],type:"BotCommandScope"},{id:-1180016534,predicate:"botCommandScopeChatAdmins",params:[],type:"BotCommandScope"},{id:-610432643,predicate:"botCommandScopePeer",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:1071145937,predicate:"botCommandScopePeerAdmins",params:[{name:"peer",type:"InputPeer"}],type:"BotCommandScope"},{id:169026035,predicate:"botCommandScopePeerUser",params:[{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"BotCommandScope"},{id:-478701471,predicate:"account.resetPasswordFailedWait",params:[{name:"retry_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-370148227,predicate:"account.resetPasswordRequestedWait",params:[{name:"until_date",type:"int"}],type:"account.ResetPasswordResult"},{id:-383330754,predicate:"account.resetPasswordOk",params:[],type:"account.ResetPasswordResult"},{id:1299263278,predicate:"updateBotCommands",params:[{name:"peer",type:"Peer"},{name:"bot_id",type:"long"},{name:"commands",type:"Vector"}],type:"Update"},{id:-1434950843,predicate:"messageActionSetChatTheme",params:[{name:"emoticon",type:"string"}],type:"MessageAction"},{id:-1336228175,predicate:"sendMessageChooseStickerAction",params:[],type:"SendMessageAction"},{id:981691896,predicate:"sponsoredMessage",params:[{name:"flags",type:"#"},{name:"recommended",type:"flags.5?true"},{name:"show_peer_photo",type:"flags.6?true"},{name:"random_id",type:"bytes"},{name:"from_id",type:"flags.3?Peer"},{name:"chat_invite",type:"flags.4?ChatInvite"},{name:"chat_invite_hash",type:"flags.4?string"},{name:"channel_post",type:"flags.2?int"},{name:"start_param",type:"flags.0?string"},{name:"message",type:"string"},{name:"entities",type:"flags.1?Vector"}],type:"SponsoredMessage"},{id:-907141753,predicate:"messages.sponsoredMessages",params:[{name:"flags",type:"#"},{name:"posts_between",type:"flags.0?int"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SponsoredMessages"},{id:215889721,predicate:"inputStickerSetAnimatedEmojiAnimations",params:[],type:"InputStickerSet"},{id:630664139,predicate:"sendMessageEmojiInteraction",params:[{name:"emoticon",type:"string"},{name:"msg_id",type:"int"},{name:"interaction",type:"DataJSON"}],type:"SendMessageAction"},{id:-1234857938,predicate:"sendMessageEmojiInteractionSeen",params:[{name:"emoticon",type:"string"}],type:"SendMessageAction"},{id:-1227287081,predicate:"inputBotInlineMessageID64",params:[{name:"dc_id",type:"int"},{name:"owner_id",type:"long"},{name:"id",type:"int"},{name:"access_hash",type:"long"}],type:"InputBotInlineMessageID"},{id:-911191137,predicate:"searchResultsCalendarPeriod",params:[{name:"date",type:"int"},{name:"min_msg_id",type:"int"},{name:"max_msg_id",type:"int"},{name:"count",type:"int"}],type:"SearchResultsCalendarPeriod"},{id:343859772,predicate:"messages.searchResultsCalendar",params:[{name:"flags",type:"#"},{name:"inexact",type:"flags.0?true"},{name:"count",type:"int"},{name:"min_date",type:"int"},{name:"min_msg_id",type:"int"},{name:"offset_id_offset",type:"flags.1?int"},{name:"periods",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.SearchResultsCalendar"},{id:2137295719,predicate:"searchResultPosition",params:[{name:"msg_id",type:"int"},{name:"date",type:"int"},{name:"offset",type:"int"}],type:"SearchResultsPosition"},{id:1404185519,predicate:"messages.searchResultsPositions",params:[{name:"count",type:"int"},{name:"positions",type:"Vector"}],type:"messages.SearchResultsPositions"},{id:-339958837,predicate:"messageActionChatJoinedByRequest",params:[],type:"MessageAction"},{id:1885586395,predicate:"updatePendingJoinRequests",params:[{name:"peer",type:"Peer"},{name:"requests_pending",type:"int"},{name:"recent_requesters",type:"Vector"}],type:"Update"},{id:299870598,predicate:"updateBotChatInviteRequester",params:[{name:"peer",type:"Peer"},{name:"date",type:"int"},{name:"user_id",type:"long"},{name:"about",type:"string"},{name:"invite",type:"ExportedChatInvite"},{name:"qts",type:"int"}],type:"Update"},{id:-1347021750,predicate:"channelAdminLogEventActionParticipantJoinByRequest",params:[{name:"invite",type:"ExportedChatInvite"},{name:"approved_by",type:"long"}],type:"ChannelAdminLogEventAction"},{id:-376962181,predicate:"inputKeyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"InputUser"}],type:"KeyboardButton"},{id:814112961,predicate:"keyboardButtonUserProfile",params:[{name:"text",type:"string"},{name:"user_id",type:"long"}],type:"KeyboardButton"},{id:-191450938,predicate:"channels.sendAsPeers",params:[{name:"peers",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"channels.SendAsPeers"},{id:-886388890,predicate:"channelAdminLogEventActionToggleNoForwards",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:-738646805,predicate:"messages.stickerSetNotModified",params:[],type:"messages.StickerSet"},{id:997004590,predicate:"users.userFull",params:[{name:"full_user",type:"UserFull"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"users.UserFull"},{id:1753266509,predicate:"messages.peerSettings",params:[{name:"settings",type:"PeerSettings"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"}],type:"messages.PeerSettings"},{id:663693416,predicate:"channelAdminLogEventActionSendMessage",params:[{name:"message",type:"Message"}],type:"ChannelAdminLogEventAction"},{id:-702884114,predicate:"auth.codeTypeMissedCall",params:[],type:"auth.CodeType"},{id:-2113903484,predicate:"auth.sentCodeTypeMissedCall",params:[{name:"prefix",type:"string"},{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:-1012759713,predicate:"auth.loggedOut",params:[{name:"flags",type:"#"},{name:"future_auth_token",type:"flags.0?bytes"}],type:"auth.LoggedOut"},{id:1578843320,predicate:"updateMessageReactions",params:[{name:"flags",type:"#"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"top_msg_id",type:"flags.0?int"},{name:"reactions",type:"MessageReactions"}],type:"Update"},{id:-1546531968,predicate:"reactionCount",params:[{name:"flags",type:"#"},{name:"chosen_order",type:"flags.0?int"},{name:"reaction",type:"Reaction"},{name:"count",type:"int"}],type:"ReactionCount"},{id:1328256121,predicate:"messageReactions",params:[{name:"flags",type:"#"},{name:"min",type:"flags.0?true"},{name:"can_see_list",type:"flags.2?true"},{name:"results",type:"Vector"},{name:"recent_reactions",type:"flags.1?Vector"}],type:"MessageReactions"},{id:834488621,predicate:"messages.messageReactionsList",params:[{name:"flags",type:"#"},{name:"count",type:"int"},{name:"reactions",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"next_offset",type:"flags.0?string"}],type:"messages.MessageReactionsList"},{id:-1065882623,predicate:"availableReaction",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"premium",type:"flags.2?true"},{name:"reaction",type:"string"},{name:"title",type:"string"},{name:"static_icon",type:"Document"},{name:"appear_animation",type:"Document"},{name:"select_animation",type:"Document"},{name:"activate_animation",type:"Document"},{name:"effect_animation",type:"Document"},{name:"around_animation",type:"flags.1?Document"},{name:"center_icon",type:"flags.1?Document"}],type:"AvailableReaction"},{id:-1626924713,predicate:"messages.availableReactionsNotModified",params:[],type:"messages.AvailableReactions"},{id:1989032621,predicate:"messages.availableReactions",params:[{name:"hash",type:"int"},{name:"reactions",type:"Vector"}],type:"messages.AvailableReactions"},{id:852137487,predicate:"messageEntitySpoiler",params:[{name:"offset",type:"int"},{name:"length",type:"int"}],type:"MessageEntity"},{id:-1102180616,predicate:"channelAdminLogEventActionChangeAvailableReactions",params:[{name:"prev_value",type:"ChatReactions"},{name:"new_value",type:"ChatReactions"}],type:"ChannelAdminLogEventAction"},{id:1741309751,predicate:"messages.translateNoResult",params:[],type:"messages.TranslatedText"},{id:-1575684144,predicate:"messages.translateResultText",params:[{name:"text",type:"string"}],type:"messages.TranslatedText"},{id:-1319698788,predicate:"messagePeerReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.0?true"},{name:"unread",type:"flags.1?true"},{name:"peer_id",type:"Peer"},{name:"reaction",type:"Reaction"}],type:"MessagePeerReaction"},{id:-2132064081,predicate:"groupCallStreamChannel",params:[{name:"channel",type:"int"},{name:"scale",type:"int"},{name:"last_timestamp_ms",type:"long"}],type:"GroupCallStreamChannel"},{id:-790330702,predicate:"phone.groupCallStreamChannels",params:[{name:"channels",type:"Vector"}],type:"phone.GroupCallStreamChannels"},{id:177124030,predicate:"inputReportReasonIllegalDrugs",params:[],type:"ReportReason"},{id:-1631091139,predicate:"inputReportReasonPersonalDetails",params:[],type:"ReportReason"},{id:767505458,predicate:"phone.groupCallStreamRtmpUrl",params:[{name:"url",type:"string"},{name:"key",type:"string"}],type:"phone.GroupCallStreamRtmpUrl"},{id:1165423600,predicate:"attachMenuBotIconColor",params:[{name:"name",type:"string"},{name:"color",type:"int"}],type:"AttachMenuBotIconColor"},{id:-1297663893,predicate:"attachMenuBotIcon",params:[{name:"flags",type:"#"},{name:"name",type:"string"},{name:"icon",type:"Document"},{name:"colors",type:"flags.0?Vector"}],type:"AttachMenuBotIcon"},{id:-928371502,predicate:"attachMenuBot",params:[{name:"flags",type:"#"},{name:"inactive",type:"flags.0?true"},{name:"has_settings",type:"flags.1?true"},{name:"request_write_access",type:"flags.2?true"},{name:"bot_id",type:"long"},{name:"short_name",type:"string"},{name:"peer_types",type:"Vector"},{name:"icons",type:"Vector"}],type:"AttachMenuBot"},{id:-237467044,predicate:"attachMenuBotsNotModified",params:[],type:"AttachMenuBots"},{id:1011024320,predicate:"attachMenuBots",params:[{name:"hash",type:"long"},{name:"bots",type:"Vector"},{name:"users",type:"Vector"}],type:"AttachMenuBots"},{id:-1816172929,predicate:"attachMenuBotsBot",params:[{name:"bot",type:"AttachMenuBot"},{name:"users",type:"Vector"}],type:"AttachMenuBotsBot"},{id:397910539,predicate:"updateAttachMenuBots",params:[],type:"Update"},{id:202659196,predicate:"webViewResultUrl",params:[{name:"query_id",type:"long"},{name:"url",type:"string"}],type:"WebViewResult"},{id:-2010155333,predicate:"simpleWebViewResultUrl",params:[{name:"url",type:"string"}],type:"SimpleWebViewResult"},{id:211046684,predicate:"webViewMessageSent",params:[{name:"flags",type:"#"},{name:"msg_id",type:"flags.0?InputBotInlineMessageID"}],type:"WebViewMessageSent"},{id:361936797,predicate:"updateWebViewResultSent",params:[{name:"query_id",type:"long"}],type:"Update"},{id:326529584,predicate:"keyboardButtonWebView",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:-1598009252,predicate:"keyboardButtonSimpleWebView",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"KeyboardButton"},{id:1205698681,predicate:"messageActionWebViewDataSentMe",params:[{name:"text",type:"string"},{name:"data",type:"string"}],type:"MessageAction"},{id:-1262252875,predicate:"messageActionWebViewDataSent",params:[{name:"text",type:"string"}],type:"MessageAction"},{id:347625491,predicate:"updateBotMenuButton",params:[{name:"bot_id",type:"long"},{name:"button",type:"BotMenuButton"}],type:"Update"},{id:1966318984,predicate:"botMenuButtonDefault",params:[],type:"BotMenuButton"},{id:1113113093,predicate:"botMenuButtonCommands",params:[],type:"BotMenuButton"},{id:-944407322,predicate:"botMenuButton",params:[{name:"text",type:"string"},{name:"url",type:"string"}],type:"BotMenuButton"},{id:-67704655,predicate:"account.savedRingtonesNotModified",params:[],type:"account.SavedRingtones"},{id:-1041683259,predicate:"account.savedRingtones",params:[{name:"hash",type:"long"},{name:"ringtones",type:"Vector"}],type:"account.SavedRingtones"},{id:1960361625,predicate:"updateSavedRingtones",params:[],type:"Update"},{id:-1746354498,predicate:"notificationSoundDefault",params:[],type:"NotificationSound"},{id:1863070943,predicate:"notificationSoundNone",params:[],type:"NotificationSound"},{id:-2096391452,predicate:"notificationSoundLocal",params:[{name:"title",type:"string"},{name:"data",type:"string"}],type:"NotificationSound"},{id:-9666487,predicate:"notificationSoundRingtone",params:[{name:"id",type:"long"}],type:"NotificationSound"},{id:-1222230163,predicate:"account.savedRingtone",params:[],type:"account.SavedRingtone"},{id:523271863,predicate:"account.savedRingtoneConverted",params:[{name:"document",type:"Document"}],type:"account.SavedRingtone"},{id:2104224014,predicate:"attachMenuPeerTypeSameBotPM",params:[],type:"AttachMenuPeerType"},{id:-1020528102,predicate:"attachMenuPeerTypeBotPM",params:[],type:"AttachMenuPeerType"},{id:-247016673,predicate:"attachMenuPeerTypePM",params:[],type:"AttachMenuPeerType"},{id:84480319,predicate:"attachMenuPeerTypeChat",params:[],type:"AttachMenuPeerType"},{id:2080104188,predicate:"attachMenuPeerTypeBroadcast",params:[],type:"AttachMenuPeerType"},{id:-317687113,predicate:"chatInvitePublicJoinRequests",params:[],type:"ExportedChatInvite"},{id:-977967015,predicate:"inputInvoiceMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"InputInvoice"},{id:-1020867857,predicate:"inputInvoiceSlug",params:[{name:"slug",type:"string"}],type:"InputInvoice"},{id:-1362048039,predicate:"payments.exportedInvoice",params:[{name:"url",type:"string"}],type:"payments.ExportedInvoice"},{id:8703322,predicate:"updateTranscribedAudio",params:[{name:"flags",type:"#"},{name:"pending",type:"flags.0?true"},{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"transcription_id",type:"long"},{name:"text",type:"string"}],type:"Update"},{id:-1821037486,predicate:"messages.transcribedAudio",params:[{name:"flags",type:"#"},{name:"pending",type:"flags.0?true"},{name:"transcription_id",type:"long"},{name:"text",type:"string"}],type:"messages.TranscribedAudio"},{id:909284270,predicate:"dialogFilterDefault",params:[],type:"DialogFilter"},{id:1395946908,predicate:"help.premiumPromo",params:[{name:"status_text",type:"string"},{name:"status_entities",type:"Vector"},{name:"video_sections",type:"Vector"},{name:"videos",type:"Vector"},{name:"period_options",type:"Vector"},{name:"users",type:"Vector"}],type:"help.PremiumPromo"},{id:-925956616,predicate:"messageEntityCustomEmoji",params:[{name:"offset",type:"int"},{name:"length",type:"int"},{name:"document_id",type:"long"}],type:"MessageEntity"},{id:-48981863,predicate:"documentAttributeCustomEmoji",params:[{name:"flags",type:"#"},{name:"free",type:"flags.0?true"},{name:"text_color",type:"flags.1?true"},{name:"alt",type:"string"},{name:"stickerset",type:"InputStickerSet"}],type:"DocumentAttribute"},{id:1087454222,predicate:"stickerSetFullCovered",params:[{name:"set",type:"StickerSet"},{name:"packs",type:"Vector"},{name:"keywords",type:"Vector"},{name:"documents",type:"Vector"}],type:"StickerSetCovered"},{id:-1502273946,predicate:"inputStorePaymentPremiumSubscription",params:[{name:"flags",type:"#"},{name:"restore",type:"flags.0?true"}],type:"InputStorePaymentPurpose"},{id:1634697192,predicate:"inputStorePaymentGiftPremium",params:[{name:"user_id",type:"InputUser"},{name:"currency",type:"string"},{name:"amount",type:"long"}],type:"InputStorePaymentPurpose"},{id:-1415514682,predicate:"messageActionGiftPremium",params:[{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"months",type:"int"}],type:"MessageAction"},{id:1958953753,predicate:"premiumGiftOption",params:[{name:"flags",type:"#"},{name:"months",type:"int"},{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"bot_url",type:"string"},{name:"store_product",type:"flags.0?string"}],type:"PremiumGiftOption"},{id:-930399486,predicate:"inputStickerSetPremiumGifts",params:[],type:"InputStickerSet"},{id:-78886548,predicate:"updateReadFeaturedEmojiStickers",params:[],type:"Update"},{id:-1360618136,predicate:"inputPrivacyKeyVoiceMessages",params:[],type:"InputPrivacyKey"},{id:110621716,predicate:"privacyKeyVoiceMessages",params:[],type:"PrivacyKey"},{id:-1996951013,predicate:"paymentFormMethod",params:[{name:"url",type:"string"},{name:"title",type:"string"}],type:"PaymentFormMethod"},{id:-193992412,predicate:"inputWebFileAudioAlbumThumbLocation",params:[{name:"flags",type:"#"},{name:"small",type:"flags.2?true"},{name:"document",type:"flags.0?InputDocument"},{name:"title",type:"flags.1?string"},{name:"performer",type:"flags.1?string"}],type:"InputWebFileLocation"},{id:769727150,predicate:"emojiStatusEmpty",params:[],type:"EmojiStatus"},{id:-1835310691,predicate:"emojiStatus",params:[{name:"document_id",type:"long"}],type:"EmojiStatus"},{id:-97474361,predicate:"emojiStatusUntil",params:[{name:"document_id",type:"long"},{name:"until",type:"int"}],type:"EmojiStatus"},{id:674706841,predicate:"updateUserEmojiStatus",params:[{name:"user_id",type:"long"},{name:"emoji_status",type:"EmojiStatus"}],type:"Update"},{id:821314523,predicate:"updateRecentEmojiStatuses",params:[],type:"Update"},{id:-796072379,predicate:"account.emojiStatusesNotModified",params:[],type:"account.EmojiStatuses"},{id:-1866176559,predicate:"account.emojiStatuses",params:[{name:"hash",type:"long"},{name:"statuses",type:"Vector"}],type:"account.EmojiStatuses"},{id:2046153753,predicate:"reactionEmpty",params:[],type:"Reaction"},{id:455247544,predicate:"reactionEmoji",params:[{name:"emoticon",type:"string"}],type:"Reaction"},{id:-1992950669,predicate:"reactionCustomEmoji",params:[{name:"document_id",type:"long"}],type:"Reaction"},{id:-352570692,predicate:"chatReactionsNone",params:[],type:"ChatReactions"},{id:1385335754,predicate:"chatReactionsAll",params:[{name:"flags",type:"#"},{name:"allow_custom",type:"flags.0?true"}],type:"ChatReactions"},{id:1713193015,predicate:"chatReactionsSome",params:[{name:"reactions",type:"Vector"}],type:"ChatReactions"},{id:-1334846497,predicate:"messages.reactionsNotModified",params:[],type:"messages.Reactions"},{id:-352454890,predicate:"messages.reactions",params:[{name:"hash",type:"long"},{name:"reactions",type:"Vector"}],type:"messages.Reactions"},{id:1870160884,predicate:"updateRecentReactions",params:[],type:"Update"},{id:-2030252155,predicate:"updateMoveStickerSetToTop",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"},{name:"stickerset",type:"long"}],type:"Update"},{id:1511364673,predicate:"auth.sentCodeTypeEmailCode",params:[{name:"flags",type:"#"},{name:"apple_signin_allowed",type:"flags.0?true"},{name:"google_signin_allowed",type:"flags.1?true"},{name:"email_pattern",type:"string"},{name:"length",type:"int"},{name:"next_phone_login_date",type:"flags.2?int"}],type:"auth.SentCodeType"},{id:-1521934870,predicate:"auth.sentCodeTypeSetUpEmailRequired",params:[{name:"flags",type:"#"},{name:"apple_signin_allowed",type:"flags.0?true"},{name:"google_signin_allowed",type:"flags.1?true"}],type:"auth.SentCodeType"},{id:1128644211,predicate:"emailVerifyPurposeLoginSetup",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"EmailVerifyPurpose"},{id:1383932651,predicate:"emailVerifyPurposeLoginChange",params:[],type:"EmailVerifyPurpose"},{id:-1141565819,predicate:"emailVerifyPurposePassport",params:[],type:"EmailVerifyPurpose"},{id:-1842457175,predicate:"emailVerificationCode",params:[{name:"code",type:"string"}],type:"EmailVerification"},{id:-611279166,predicate:"emailVerificationGoogle",params:[{name:"token",type:"string"}],type:"EmailVerification"},{id:-1764723459,predicate:"emailVerificationApple",params:[{name:"token",type:"string"}],type:"EmailVerification"},{id:731303195,predicate:"account.emailVerified",params:[{name:"email",type:"string"}],type:"account.EmailVerified"},{id:-507835039,predicate:"account.emailVerifiedLogin",params:[{name:"email",type:"string"},{name:"sent_code",type:"auth.SentCode"}],type:"account.EmailVerified"},{id:-1225711938,predicate:"premiumSubscriptionOption",params:[{name:"flags",type:"#"},{name:"current",type:"flags.1?true"},{name:"can_purchase_upgrade",type:"flags.2?true"},{name:"months",type:"int"},{name:"currency",type:"string"},{name:"amount",type:"long"},{name:"bot_url",type:"string"},{name:"store_product",type:"flags.0?string"}],type:"PremiumSubscriptionOption"},{id:80008398,predicate:"inputStickerSetEmojiGenericAnimations",params:[],type:"InputStickerSet"},{id:701560302,predicate:"inputStickerSetEmojiDefaultStatuses",params:[],type:"InputStickerSet"},{id:-1206095820,predicate:"sendAsPeer",params:[{name:"flags",type:"#"},{name:"premium_required",type:"flags.0?true"},{name:"peer",type:"Peer"}],type:"SendAsPeer"},{id:-1386050360,predicate:"messageExtendedMediaPreview",params:[{name:"flags",type:"#"},{name:"w",type:"flags.0?int"},{name:"h",type:"flags.0?int"},{name:"thumb",type:"flags.1?PhotoSize"},{name:"video_duration",type:"flags.2?int"}],type:"MessageExtendedMedia"},{id:-297296796,predicate:"messageExtendedMedia",params:[{name:"media",type:"MessageMedia"}],type:"MessageExtendedMedia"},{id:1517529484,predicate:"updateMessageExtendedMedia",params:[{name:"peer",type:"Peer"},{name:"msg_id",type:"int"},{name:"extended_media",type:"MessageExtendedMedia"}],type:"Update"},{id:-50416996,predicate:"stickerKeyword",params:[{name:"document_id",type:"long"},{name:"keyword",type:"Vector"}],type:"StickerKeyword"},{id:-1274595769,predicate:"username",params:[{name:"flags",type:"#"},{name:"editable",type:"flags.0?true"},{name:"active",type:"flags.1?true"},{name:"username",type:"string"}],type:"Username"},{id:-263212119,predicate:"channelAdminLogEventActionChangeUsernames",params:[{name:"prev_value",type:"Vector"},{name:"new_value",type:"Vector"}],type:"ChannelAdminLogEventAction"},{id:46949251,predicate:"channelAdminLogEventActionToggleForum",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:1483767080,predicate:"channelAdminLogEventActionCreateTopic",params:[{name:"topic",type:"ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:-261103096,predicate:"channelAdminLogEventActionEditTopic",params:[{name:"prev_topic",type:"ForumTopic"},{name:"new_topic",type:"ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:-1374254839,predicate:"channelAdminLogEventActionDeleteTopic",params:[{name:"topic",type:"ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:1569535291,predicate:"channelAdminLogEventActionPinTopic",params:[{name:"flags",type:"#"},{name:"prev_topic",type:"flags.0?ForumTopic"},{name:"new_topic",type:"flags.1?ForumTopic"}],type:"ChannelAdminLogEventAction"},{id:37687451,predicate:"forumTopicDeleted",params:[{name:"id",type:"int"}],type:"ForumTopic"},{id:1903173033,predicate:"forumTopic",params:[{name:"flags",type:"#"},{name:"my",type:"flags.1?true"},{name:"closed",type:"flags.2?true"},{name:"pinned",type:"flags.3?true"},{name:"short",type:"flags.5?true"},{name:"hidden",type:"flags.6?true"},{name:"id",type:"int"},{name:"date",type:"int"},{name:"title",type:"string"},{name:"icon_color",type:"int"},{name:"icon_emoji_id",type:"flags.0?long"},{name:"top_message",type:"int"},{name:"read_inbox_max_id",type:"int"},{name:"read_outbox_max_id",type:"int"},{name:"unread_count",type:"int"},{name:"unread_mentions_count",type:"int"},{name:"unread_reactions_count",type:"int"},{name:"from_id",type:"Peer"},{name:"notify_settings",type:"PeerNotifySettings"},{name:"draft",type:"flags.4?DraftMessage"}],type:"ForumTopic"},{id:913709011,predicate:"messages.forumTopics",params:[{name:"flags",type:"#"},{name:"order_by_create_date",type:"flags.0?true"},{name:"count",type:"int"},{name:"topics",type:"Vector"},{name:"messages",type:"Vector"},{name:"chats",type:"Vector"},{name:"users",type:"Vector"},{name:"pts",type:"int"}],type:"messages.ForumTopics"},{id:228168278,predicate:"messageActionTopicCreate",params:[{name:"flags",type:"#"},{name:"title",type:"string"},{name:"icon_color",type:"int"},{name:"icon_emoji_id",type:"flags.0?long"}],type:"MessageAction"},{id:-1064024032,predicate:"messageActionTopicEdit",params:[{name:"flags",type:"#"},{name:"title",type:"flags.0?string"},{name:"icon_emoji_id",type:"flags.1?long"},{name:"closed",type:"flags.2?Bool"},{name:"hidden",type:"flags.3?Bool"}],type:"MessageAction"},{id:422509539,predicate:"updateChannelPinnedTopic",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"channel_id",type:"long"},{name:"topic_id",type:"int"}],type:"Update"},{id:1548122514,predicate:"inputNotifyForumTopic",params:[{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"int"}],type:"InputNotifyPeer"},{id:577659656,predicate:"notifyForumTopic",params:[{name:"peer",type:"Peer"},{name:"top_msg_id",type:"int"}],type:"NotifyPeer"},{id:1153562857,predicate:"inputStickerSetEmojiDefaultTopicIcons",params:[],type:"InputStickerSet"},{id:406407439,predicate:"messages.sponsoredMessagesEmpty",params:[],type:"messages.SponsoredMessages"},{id:-31881726,predicate:"updateChannelPinnedTopics",params:[{name:"flags",type:"#"},{name:"channel_id",type:"long"},{name:"order",type:"flags.0?Vector"}],type:"Update"},{id:1135897376,predicate:"defaultHistoryTTL",params:[{name:"period",type:"int"}],type:"DefaultHistoryTTL"},{id:116234636,predicate:"auth.codeTypeFragmentSms",params:[],type:"auth.CodeType"},{id:-648651719,predicate:"auth.sentCodeTypeFragmentSms",params:[{name:"url",type:"string"},{name:"length",type:"int"}],type:"auth.SentCodeType"},{id:1103040667,predicate:"exportedContactToken",params:[{name:"url",type:"string"},{name:"expires",type:"int"}],type:"ExportedContactToken"},{id:1693675004,predicate:"channelAdminLogEventActionToggleAntiSpam",params:[{name:"new_value",type:"Bool"}],type:"ChannelAdminLogEventAction"},{id:1474192222,predicate:"messageActionSuggestProfilePhoto",params:[{name:"photo",type:"Photo"}],type:"MessageAction"},{id:-404267113,predicate:"messageActionAttachMenuBotAllowed",params:[],type:"MessageAction"},{id:2008112412,predicate:"stickerSetNoCovered",params:[{name:"set",type:"StickerSet"}],type:"StickerSetCovered"},{id:542282808,predicate:"updateUser",params:[{name:"user_id",type:"long"}],type:"Update"}],methods:[{id:-878758099,method:"invokeAfterMsg",params:[{name:"msg_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:1036301552,method:"invokeAfterMsgs",params:[{name:"msg_ids",type:"Vector"},{name:"query",type:"!X"}],type:"X"},{id:-1502141361,method:"auth.sendCode",params:[{name:"phone_number",type:"string"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:-2131827673,method:"auth.signUp",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"first_name",type:"string"},{name:"last_name",type:"string"}],type:"auth.Authorization"},{id:-1923962543,method:"auth.signIn",params:[{name:"flags",type:"#"},{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"flags.0?string"},{name:"email_verification",type:"flags.1?EmailVerification"}],type:"auth.Authorization"},{id:1047706137,method:"auth.logOut",params:[],type:"auth.LoggedOut"},{id:-1616179942,method:"auth.resetAuthorizations",params:[],type:"Bool"},{id:-440401971,method:"auth.exportAuthorization",params:[{name:"dc_id",type:"int"}],type:"auth.ExportedAuthorization"},{id:-1518699091,method:"auth.importAuthorization",params:[{name:"id",type:"long"},{name:"bytes",type:"bytes"}],type:"auth.Authorization"},{id:-841733627,method:"auth.bindTempAuthKey",params:[{name:"perm_auth_key_id",type:"long"},{name:"nonce",type:"long"},{name:"expires_at",type:"int"},{name:"encrypted_message",type:"bytes"}],type:"Bool"},{id:-326762118,method:"account.registerDevice",params:[{name:"flags",type:"#"},{name:"no_muted",type:"flags.0?true"},{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"app_sandbox",type:"Bool"},{name:"secret",type:"bytes"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:1779249670,method:"account.unregisterDevice",params:[{name:"token_type",type:"int"},{name:"token",type:"string"},{name:"other_uids",type:"Vector"}],type:"Bool"},{id:-2067899501,method:"account.updateNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"},{name:"settings",type:"InputPeerNotifySettings"}],type:"Bool"},{id:313765169,method:"account.getNotifySettings",params:[{name:"peer",type:"InputNotifyPeer"}],type:"PeerNotifySettings"},{id:-612493497,method:"account.resetNotifySettings",params:[],type:"Bool"},{id:2018596725,method:"account.updateProfile",params:[{name:"flags",type:"#"},{name:"first_name",type:"flags.0?string"},{name:"last_name",type:"flags.1?string"},{name:"about",type:"flags.2?string"}],type:"User"},{id:1713919532,method:"account.updateStatus",params:[{name:"offline",type:"Bool"}],type:"Bool"},{id:127302966,method:"account.getWallPapers",params:[{name:"hash",type:"long"}],type:"account.WallPapers"},{id:-977650298,method:"account.reportPeer",params:[{name:"peer",type:"InputPeer"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:227648840,method:"users.getUsers",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1240508136,method:"users.getFullUser",params:[{name:"id",type:"InputUser"}],type:"users.UserFull"},{id:2061264541,method:"contacts.getContactIDs",params:[{name:"hash",type:"long"}],type:"Vector"},{id:-995929106,method:"contacts.getStatuses",params:[],type:"Vector"},{id:1574346258,method:"contacts.getContacts",params:[{name:"hash",type:"long"}],type:"contacts.Contacts"},{id:746589157,method:"contacts.importContacts",params:[{name:"contacts",type:"Vector"}],type:"contacts.ImportedContacts"},{id:157945344,method:"contacts.deleteContacts",params:[{name:"id",type:"Vector"}],type:"Updates"},{id:269745566,method:"contacts.deleteByPhones",params:[{name:"phones",type:"Vector"}],type:"Bool"},{id:1758204945,method:"contacts.block",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-1096393392,method:"contacts.unblock",params:[{name:"id",type:"InputPeer"}],type:"Bool"},{id:-176409329,method:"contacts.getBlocked",params:[{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"contacts.Blocked"},{id:1673946374,method:"messages.getMessages",params:[{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1594569905,method:"messages.getDialogs",params:[{name:"flags",type:"#"},{name:"exclude_pinned",type:"flags.0?true"},{name:"folder_id",type:"flags.1?int"},{name:"offset_date",type:"int"},{name:"offset_id",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Dialogs"},{id:1143203525,method:"messages.getHistory",params:[{name:"peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1593989278,method:"messages.search",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"q",type:"string"},{name:"from_id",type:"flags.0?InputPeer"},{name:"top_msg_id",type:"flags.1?int"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:238054714,method:"messages.readHistory",params:[{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"}],type:"messages.AffectedMessages"},{id:-1332768214,method:"messages.deleteHistory",params:[{name:"flags",type:"#"},{name:"just_clear",type:"flags.0?true"},{name:"revoke",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"max_id",type:"int"},{name:"min_date",type:"flags.2?int"},{name:"max_date",type:"flags.3?int"}],type:"messages.AffectedHistory"},{id:-443640366,method:"messages.deleteMessages",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:94983360,method:"messages.receivedMessages",params:[{name:"max_id",type:"int"}],type:"Vector"},{id:1486110434,method:"messages.setTyping",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"action",type:"SendMessageAction"}],type:"Bool"},{id:482476935,method:"messages.sendMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"update_stickersets_order",type:"flags.15?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:1967638886,method:"messages.sendMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"update_stickersets_order",type:"flags.15?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"media",type:"InputMedia"},{name:"message",type:"string"},{name:"random_id",type:"long"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-966673468,method:"messages.forwardMessages",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"with_my_score",type:"flags.8?true"},{name:"drop_author",type:"flags.11?true"},{name:"drop_media_captions",type:"flags.12?true"},{name:"noforwards",type:"flags.14?true"},{name:"from_peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"random_id",type:"Vector"},{name:"to_peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.9?int"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-820669733,method:"messages.reportSpam",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-270948702,method:"messages.getPeerSettings",params:[{name:"peer",type:"InputPeer"}],type:"messages.PeerSettings"},{id:-1991005362,method:"messages.report",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:1240027791,method:"messages.getChats",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:-1364194508,method:"messages.getFullChat",params:[{name:"chat_id",type:"long"}],type:"messages.ChatFull"},{id:1937260541,method:"messages.editChatTitle",params:[{name:"chat_id",type:"long"},{name:"title",type:"string"}],type:"Updates"},{id:903730804,method:"messages.editChatPhoto",params:[{name:"chat_id",type:"long"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:-230206493,method:"messages.addChatUser",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"fwd_limit",type:"int"}],type:"Updates"},{id:-1575461717,method:"messages.deleteChatUser",params:[{name:"flags",type:"#"},{name:"revoke_history",type:"flags.0?true"},{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:3450904,method:"messages.createChat",params:[{name:"flags",type:"#"},{name:"users",type:"Vector"},{name:"title",type:"string"},{name:"ttl_period",type:"flags.0?int"}],type:"Updates"},{id:-304838614,method:"updates.getState",params:[],type:"updates.State"},{id:630429265,method:"updates.getDifference",params:[{name:"flags",type:"#"},{name:"pts",type:"int"},{name:"pts_total_limit",type:"flags.0?int"},{name:"date",type:"int"},{name:"qts",type:"int"}],type:"updates.Difference"},{id:473782614,method:"photos.updateProfilePhoto",params:[{name:"flags",type:"#"},{name:"fallback",type:"flags.0?true"},{name:"id",type:"InputPhoto"}],type:"photos.Photo"},{id:-1980559511,method:"photos.uploadProfilePhoto",params:[{name:"flags",type:"#"},{name:"fallback",type:"flags.3?true"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"photos.Photo"},{id:-2016444625,method:"photos.deletePhotos",params:[{name:"id",type:"Vector"}],type:"Vector"},{id:-1291540959,method:"upload.saveFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1101843010,method:"upload.getFile",params:[{name:"flags",type:"#"},{name:"precise",type:"flags.0?true"},{name:"cdn_supported",type:"flags.1?true"},{name:"location",type:"InputFileLocation"},{name:"offset",type:"long"},{name:"limit",type:"int"}],type:"upload.File"},{id:-990308245,method:"help.getConfig",params:[],type:"Config"},{id:531836966,method:"help.getNearestDc",params:[],type:"NearestDc"},{id:1378703997,method:"help.getAppUpdate",params:[{name:"source",type:"string"}],type:"help.AppUpdate"},{id:1295590211,method:"help.getInviteText",params:[],type:"help.InviteText"},{id:-1848823128,method:"photos.getUserPhotos",params:[{name:"user_id",type:"InputUser"},{name:"offset",type:"int"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"photos.Photos"},{id:651135312,method:"messages.getDhConfig",params:[{name:"version",type:"int"},{name:"random_length",type:"int"}],type:"messages.DhConfig"},{id:-162681021,method:"messages.requestEncryption",params:[{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a",type:"bytes"}],type:"EncryptedChat"},{id:1035731989,method:"messages.acceptEncryption",params:[{name:"peer",type:"InputEncryptedChat"},{name:"g_b",type:"bytes"},{name:"key_fingerprint",type:"long"}],type:"EncryptedChat"},{id:-208425312,method:"messages.discardEncryption",params:[{name:"flags",type:"#"},{name:"delete_history",type:"flags.0?true"},{name:"chat_id",type:"int"}],type:"Bool"},{id:2031374829,method:"messages.setEncryptedTyping",params:[{name:"peer",type:"InputEncryptedChat"},{name:"typing",type:"Bool"}],type:"Bool"},{id:2135648522,method:"messages.readEncryptedHistory",params:[{name:"peer",type:"InputEncryptedChat"},{name:"max_date",type:"int"}],type:"Bool"},{id:1157265941,method:"messages.sendEncrypted",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1431914525,method:"messages.sendEncryptedFile",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"},{name:"file",type:"InputEncryptedFile"}],type:"messages.SentEncryptedMessage"},{id:852769188,method:"messages.sendEncryptedService",params:[{name:"peer",type:"InputEncryptedChat"},{name:"random_id",type:"long"},{name:"data",type:"bytes"}],type:"messages.SentEncryptedMessage"},{id:1436924774,method:"messages.receivedQueue",params:[{name:"max_qts",type:"int"}],type:"Vector"},{id:1259113487,method:"messages.reportEncryptedSpam",params:[{name:"peer",type:"InputEncryptedChat"}],type:"Bool"},{id:-562337987,method:"upload.saveBigFilePart",params:[{name:"file_id",type:"long"},{name:"file_part",type:"int"},{name:"file_total_parts",type:"int"},{name:"bytes",type:"bytes"}],type:"Bool"},{id:-1043505495,method:"initConnection",params:[{name:"flags",type:"#"},{name:"api_id",type:"int"},{name:"device_model",type:"string"},{name:"system_version",type:"string"},{name:"app_version",type:"string"},{name:"system_lang_code",type:"string"},{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"proxy",type:"flags.0?InputClientProxy"},{name:"params",type:"flags.1?JSONValue"},{name:"query",type:"!X"}],type:"X"},{id:-1663104819,method:"help.getSupport",params:[],type:"help.Support"},{id:916930423,method:"messages.readMessageContents",params:[{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:655677548,method:"account.checkUsername",params:[{name:"username",type:"string"}],type:"Bool"},{id:1040964988,method:"account.updateUsername",params:[{name:"username",type:"string"}],type:"User"},{id:301470424,method:"contacts.search",params:[{name:"q",type:"string"},{name:"limit",type:"int"}],type:"contacts.Found"},{id:-623130288,method:"account.getPrivacy",params:[{name:"key",type:"InputPrivacyKey"}],type:"account.PrivacyRules"},{id:-906486552,method:"account.setPrivacy",params:[{name:"key",type:"InputPrivacyKey"},{name:"rules",type:"Vector"}],type:"account.PrivacyRules"},{id:-1564422284,method:"account.deleteAccount",params:[{name:"flags",type:"#"},{name:"reason",type:"string"},{name:"password",type:"flags.0?InputCheckPasswordSRP"}],type:"Bool"},{id:150761757,method:"account.getAccountTTL",params:[],type:"AccountDaysTTL"},{id:608323678,method:"account.setAccountTTL",params:[{name:"ttl",type:"AccountDaysTTL"}],type:"Bool"},{id:-627372787,method:"invokeWithLayer",params:[{name:"layer",type:"int"},{name:"query",type:"!X"}],type:"X"},{id:-113456221,method:"contacts.resolveUsername",params:[{name:"username",type:"string"}],type:"contacts.ResolvedPeer"},{id:-2108208411,method:"account.sendChangePhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1891839707,method:"account.changePhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"User"},{id:-710552671,method:"messages.getStickers",params:[{name:"emoticon",type:"string"},{name:"hash",type:"long"}],type:"messages.Stickers"},{id:-1197432408,method:"messages.getAllStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:954152242,method:"account.updateDeviceLocked",params:[{name:"period",type:"int"}],type:"Bool"},{id:1738800940,method:"auth.importBotAuthorization",params:[{name:"flags",type:"int"},{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"bot_auth_token",type:"string"}],type:"auth.Authorization"},{id:-1956073268,method:"messages.getWebPagePreview",params:[{name:"flags",type:"#"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"MessageMedia"},{id:-484392616,method:"account.getAuthorizations",params:[],type:"account.Authorizations"},{id:-545786948,method:"account.resetAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1418342645,method:"account.getPassword",params:[],type:"account.Password"},{id:-1663767815,method:"account.getPasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"account.PasswordSettings"},{id:-1516564433,method:"account.updatePasswordSettings",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"new_settings",type:"account.PasswordInputSettings"}],type:"Bool"},{id:-779399914,method:"auth.checkPassword",params:[{name:"password",type:"InputCheckPasswordSRP"}],type:"auth.Authorization"},{id:-661144474,method:"auth.requestPasswordRecovery",params:[],type:"auth.PasswordRecovery"},{id:923364464,method:"auth.recoverPassword",params:[{name:"flags",type:"#"},{name:"code",type:"string"},{name:"new_settings",type:"flags.0?account.PasswordInputSettings"}],type:"auth.Authorization"},{id:-1080796745,method:"invokeWithoutUpdates",params:[{name:"query",type:"!X"}],type:"X"},{id:-1607670315,method:"messages.exportChatInvite",params:[{name:"flags",type:"#"},{name:"legacy_revoke_permanent",type:"flags.2?true"},{name:"request_needed",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"title",type:"flags.4?string"}],type:"ExportedChatInvite"},{id:1051570619,method:"messages.checkChatInvite",params:[{name:"hash",type:"string"}],type:"ChatInvite"},{id:1817183516,method:"messages.importChatInvite",params:[{name:"hash",type:"string"}],type:"Updates"},{id:-928977804,method:"messages.getStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"hash",type:"int"}],type:"messages.StickerSet"},{id:-946871200,method:"messages.installStickerSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"archived",type:"Bool"}],type:"messages.StickerSetInstallResult"},{id:-110209570,method:"messages.uninstallStickerSet",params:[{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:-421563528,method:"messages.startBot",params:[{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"long"},{name:"start_param",type:"string"}],type:"Updates"},{id:-1877938321,method:"help.getAppChangelog",params:[{name:"prev_app_version",type:"string"}],type:"Updates"},{id:1468322785,method:"messages.getMessagesViews",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"},{name:"increment",type:"Bool"}],type:"messages.MessageViews"},{id:-871347913,method:"channels.readHistory",params:[{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Bool"},{id:-2067661490,method:"channels.deleteMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.AffectedMessages"},{id:-196443371,method:"channels.reportSpam",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Bool"},{id:-1383294429,method:"channels.getMessages",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:2010044880,method:"channels.getParticipants",params:[{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelParticipantsFilter"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"channels.ChannelParticipants"},{id:-1599378234,method:"channels.getParticipant",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"channels.ChannelParticipant"},{id:176122811,method:"channels.getChannels",params:[{name:"id",type:"Vector"}],type:"messages.Chats"},{id:141781513,method:"channels.getFullChannel",params:[{name:"channel",type:"InputChannel"}],type:"messages.ChatFull"},{id:-1862244601,method:"channels.createChannel",params:[{name:"flags",type:"#"},{name:"broadcast",type:"flags.0?true"},{name:"megagroup",type:"flags.1?true"},{name:"for_import",type:"flags.3?true"},{name:"title",type:"string"},{name:"about",type:"string"},{name:"geo_point",type:"flags.2?InputGeoPoint"},{name:"address",type:"flags.2?string"},{name:"ttl_period",type:"flags.4?int"}],type:"Updates"},{id:-751007486,method:"channels.editAdmin",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"admin_rights",type:"ChatAdminRights"},{name:"rank",type:"string"}],type:"Updates"},{id:1450044624,method:"channels.editTitle",params:[{name:"channel",type:"InputChannel"},{name:"title",type:"string"}],type:"Updates"},{id:-248621111,method:"channels.editPhoto",params:[{name:"channel",type:"InputChannel"},{name:"photo",type:"InputChatPhoto"}],type:"Updates"},{id:283557164,method:"channels.checkUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:890549214,method:"channels.updateUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"}],type:"Bool"},{id:615851205,method:"channels.joinChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:-130635115,method:"channels.leaveChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:429865580,method:"channels.inviteToChannel",params:[{name:"channel",type:"InputChannel"},{name:"users",type:"Vector"}],type:"Updates"},{id:-1072619549,method:"channels.deleteChannel",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:51854712,method:"updates.getChannelDifference",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"filter",type:"ChannelMessagesFilter"},{name:"pts",type:"int"},{name:"limit",type:"int"}],type:"updates.ChannelDifference"},{id:-1470377534,method:"messages.editChatAdmin",params:[{name:"chat_id",type:"long"},{name:"user_id",type:"InputUser"},{name:"is_admin",type:"Bool"}],type:"Bool"},{id:-1568189671,method:"messages.migrateChat",params:[{name:"chat_id",type:"long"}],type:"Updates"},{id:1271290010,method:"messages.searchGlobal",params:[{name:"flags",type:"#"},{name:"folder_id",type:"flags.0?int"},{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"min_date",type:"int"},{name:"max_date",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:2016638777,method:"messages.reorderStickerSets",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"},{name:"order",type:"Vector"}],type:"Bool"},{id:-1309538785,method:"messages.getDocumentByHash",params:[{name:"sha256",type:"bytes"},{name:"size",type:"long"},{name:"mime_type",type:"string"}],type:"Document"},{id:1559270965,method:"messages.getSavedGifs",params:[{name:"hash",type:"long"}],type:"messages.SavedGifs"},{id:846868683,method:"messages.saveGif",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:1364105629,method:"messages.getInlineBotResults",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"peer",type:"InputPeer"},{name:"geo_point",type:"flags.0?InputGeoPoint"},{name:"query",type:"string"},{name:"offset",type:"string"}],type:"messages.BotResults"},{id:-346119674,method:"messages.setInlineBotResults",params:[{name:"flags",type:"#"},{name:"gallery",type:"flags.0?true"},{name:"private",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"results",type:"Vector"},{name:"cache_time",type:"int"},{name:"next_offset",type:"flags.2?string"},{name:"switch_pm",type:"flags.3?InlineBotSwitchPM"}],type:"Bool"},{id:-738468661,method:"messages.sendInlineBotResult",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"hide_via",type:"flags.11?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"random_id",type:"long"},{name:"query_id",type:"long"},{name:"id",type:"string"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:-432034325,method:"channels.exportMessageLink",params:[{name:"flags",type:"#"},{name:"grouped",type:"flags.0?true"},{name:"thread",type:"flags.1?true"},{name:"channel",type:"InputChannel"},{name:"id",type:"int"}],type:"ExportedMessageLink"},{id:527021574,method:"channels.toggleSignatures",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:1056025023,method:"auth.resendCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"auth.SentCode"},{id:520357240,method:"auth.cancelCode",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"}],type:"Bool"},{id:-39416522,method:"messages.getMessageEditData",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"messages.MessageEditData"},{id:1224152952,method:"messages.editMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"},{name:"schedule_date",type:"flags.15?int"}],type:"Updates"},{id:-2091549254,method:"messages.editInlineBotMessage",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"message",type:"flags.11?string"},{name:"media",type:"flags.14?InputMedia"},{name:"reply_markup",type:"flags.2?ReplyMarkup"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:-1824339449,method:"messages.getBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"game",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"data",type:"flags.0?bytes"},{name:"password",type:"flags.2?InputCheckPasswordSRP"}],type:"messages.BotCallbackAnswer"},{id:-712043766,method:"messages.setBotCallbackAnswer",params:[{name:"flags",type:"#"},{name:"alert",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"message",type:"flags.0?string"},{name:"url",type:"flags.2?string"},{name:"cache_time",type:"int"}],type:"Bool"},{id:-1758168906,method:"contacts.getTopPeers",params:[{name:"flags",type:"#"},{name:"correspondents",type:"flags.0?true"},{name:"bots_pm",type:"flags.1?true"},{name:"bots_inline",type:"flags.2?true"},{name:"phone_calls",type:"flags.3?true"},{name:"forward_users",type:"flags.4?true"},{name:"forward_chats",type:"flags.5?true"},{name:"groups",type:"flags.10?true"},{name:"channels",type:"flags.15?true"},{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"contacts.TopPeers"},{id:451113900,method:"contacts.resetTopPeerRating",params:[{name:"category",type:"TopPeerCategory"},{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-462373635,method:"messages.getPeerDialogs",params:[{name:"peers",type:"Vector"}],type:"messages.PeerDialogs"},{id:-1271718337,method:"messages.saveDraft",params:[{name:"flags",type:"#"},{name:"no_webpage",type:"flags.1?true"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.2?int"},{name:"peer",type:"InputPeer"},{name:"message",type:"string"},{name:"entities",type:"flags.3?Vector"}],type:"Bool"},{id:1782549861,method:"messages.getAllDrafts",params:[],type:"Updates"},{id:1685588756,method:"messages.getFeaturedStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:1527873830,method:"messages.readFeaturedStickers",params:[{name:"id",type:"Vector"}],type:"Bool"},{id:-1649852357,method:"messages.getRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"hash",type:"long"}],type:"messages.RecentStickers"},{id:958863608,method:"messages.saveRecentSticker",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"},{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-1986437075,method:"messages.clearRecentStickers",params:[{name:"flags",type:"#"},{name:"attached",type:"flags.0?true"}],type:"Bool"},{id:1475442322,method:"messages.getArchivedStickers",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"emojis",type:"flags.1?true"},{name:"offset_id",type:"long"},{name:"limit",type:"int"}],type:"messages.ArchivedStickers"},{id:457157256,method:"account.sendConfirmPhoneCode",params:[{name:"hash",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1596029123,method:"account.confirmPhone",params:[{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:-122669393,method:"channels.getAdminedPublicChannels",params:[{name:"flags",type:"#"},{name:"by_location",type:"flags.0?true"},{name:"check_limit",type:"flags.1?true"}],type:"messages.Chats"},{id:1678738104,method:"messages.getMaskStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:-866424884,method:"messages.getAttachedStickers",params:[{name:"media",type:"InputStickeredMedia"}],type:"Vector"},{id:-1907842680,method:"auth.dropTempAuthKeys",params:[{name:"except_auth_keys",type:"Vector"}],type:"Bool"},{id:-1896289088,method:"messages.setGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Updates"},{id:363700068,method:"messages.setInlineGameScore",params:[{name:"flags",type:"#"},{name:"edit_message",type:"flags.0?true"},{name:"force",type:"flags.1?true"},{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"},{name:"score",type:"int"}],type:"Bool"},{id:-400399203,method:"messages.getGameHighScores",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:258170395,method:"messages.getInlineGameHighScores",params:[{name:"id",type:"InputBotInlineMessageID"},{name:"user_id",type:"InputUser"}],type:"messages.HighScores"},{id:-468934396,method:"messages.getCommonChats",params:[{name:"user_id",type:"InputUser"},{name:"max_id",type:"long"},{name:"limit",type:"int"}],type:"messages.Chats"},{id:-2023787330,method:"messages.getAllChats",params:[{name:"except_ids",type:"Vector"}],type:"messages.Chats"},{id:-333262899,method:"help.setBotUpdatesStatus",params:[{name:"pending_updates_count",type:"int"},{name:"message",type:"string"}],type:"Bool"},{id:852135825,method:"messages.getWebPage",params:[{name:"url",type:"string"},{name:"hash",type:"int"}],type:"WebPage"},{id:-1489903017,method:"messages.toggleDialogPin",params:[{name:"flags",type:"#"},{name:"pinned",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:991616823,method:"messages.reorderPinnedDialogs",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"folder_id",type:"int"},{name:"order",type:"Vector"}],type:"Bool"},{id:-692498958,method:"messages.getPinnedDialogs",params:[{name:"folder_id",type:"int"}],type:"messages.PeerDialogs"},{id:-1440257555,method:"bots.sendCustomRequest",params:[{name:"custom_method",type:"string"},{name:"params",type:"DataJSON"}],type:"DataJSON"},{id:-434028723,method:"bots.answerWebhookJSONQuery",params:[{name:"query_id",type:"long"},{name:"data",type:"DataJSON"}],type:"Bool"},{id:619086221,method:"upload.getWebFile",params:[{name:"location",type:"InputWebFileLocation"},{name:"offset",type:"int"},{name:"limit",type:"int"}],type:"upload.WebFile"},{id:924093883,method:"payments.getPaymentForm",params:[{name:"flags",type:"#"},{name:"invoice",type:"InputInvoice"},{name:"theme_params",type:"flags.0?DataJSON"}],type:"payments.PaymentForm"},{id:611897804,method:"payments.getPaymentReceipt",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"payments.PaymentReceipt"},{id:-1228345045,method:"payments.validateRequestedInfo",params:[{name:"flags",type:"#"},{name:"save",type:"flags.0?true"},{name:"invoice",type:"InputInvoice"},{name:"info",type:"PaymentRequestedInfo"}],type:"payments.ValidatedRequestedInfo"},{id:755192367,method:"payments.sendPaymentForm",params:[{name:"flags",type:"#"},{name:"form_id",type:"long"},{name:"invoice",type:"InputInvoice"},{name:"requested_info_id",type:"flags.0?string"},{name:"shipping_option_id",type:"flags.1?string"},{name:"credentials",type:"InputPaymentCredentials"},{name:"tip_amount",type:"flags.2?long"}],type:"payments.PaymentResult"},{id:1151208273,method:"account.getTmpPassword",params:[{name:"password",type:"InputCheckPasswordSRP"},{name:"period",type:"int"}],type:"account.TmpPassword"},{id:578650699,method:"payments.getSavedInfo",params:[],type:"payments.SavedInfo"},{id:-667062079,method:"payments.clearSavedInfo",params:[{name:"flags",type:"#"},{name:"credentials",type:"flags.0?true"},{name:"info",type:"flags.1?true"}],type:"Bool"},{id:-436833542,method:"messages.setBotShippingResults",params:[{name:"flags",type:"#"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"},{name:"shipping_options",type:"flags.1?Vector"}],type:"Bool"},{id:163765653,method:"messages.setBotPrecheckoutResults",params:[{name:"flags",type:"#"},{name:"success",type:"flags.1?true"},{name:"query_id",type:"long"},{name:"error",type:"flags.0?string"}],type:"Bool"},{id:-1876841625,method:"stickers.createStickerSet",params:[{name:"flags",type:"#"},{name:"masks",type:"flags.0?true"},{name:"animated",type:"flags.1?true"},{name:"videos",type:"flags.4?true"},{name:"user_id",type:"InputUser"},{name:"title",type:"string"},{name:"short_name",type:"string"},{name:"thumb",type:"flags.2?InputDocument"},{name:"stickers",type:"Vector"},{name:"software",type:"flags.3?string"}],type:"messages.StickerSet"},{id:-143257775,method:"stickers.removeStickerFromSet",params:[{name:"sticker",type:"InputDocument"}],type:"messages.StickerSet"},{id:-4795190,method:"stickers.changeStickerPosition",params:[{name:"sticker",type:"InputDocument"},{name:"position",type:"int"}],type:"messages.StickerSet"},{id:-2041315650,method:"stickers.addStickerToSet",params:[{name:"stickerset",type:"InputStickerSet"},{name:"sticker",type:"InputStickerSetItem"}],type:"messages.StickerSet"},{id:1369162417,method:"messages.uploadMedia",params:[{name:"peer",type:"InputPeer"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:1430593449,method:"phone.getCallConfig",params:[],type:"DataJSON"},{id:1124046573,method:"phone.requestCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"user_id",type:"InputUser"},{name:"random_id",type:"int"},{name:"g_a_hash",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:1003664544,method:"phone.acceptCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_b",type:"bytes"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:788404002,method:"phone.confirmCall",params:[{name:"peer",type:"InputPhoneCall"},{name:"g_a",type:"bytes"},{name:"key_fingerprint",type:"long"},{name:"protocol",type:"PhoneCallProtocol"}],type:"phone.PhoneCall"},{id:399855457,method:"phone.receivedCall",params:[{name:"peer",type:"InputPhoneCall"}],type:"Bool"},{id:-1295269440,method:"phone.discardCall",params:[{name:"flags",type:"#"},{name:"video",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"duration",type:"int"},{name:"reason",type:"PhoneCallDiscardReason"},{name:"connection_id",type:"long"}],type:"Updates"},{id:1508562471,method:"phone.setCallRating",params:[{name:"flags",type:"#"},{name:"user_initiative",type:"flags.0?true"},{name:"peer",type:"InputPhoneCall"},{name:"rating",type:"int"},{name:"comment",type:"string"}],type:"Updates"},{id:662363518,method:"phone.saveCallDebug",params:[{name:"peer",type:"InputPhoneCall"},{name:"debug",type:"DataJSON"}],type:"Bool"},{id:962554330,method:"upload.getCdnFile",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"long"},{name:"limit",type:"int"}],type:"upload.CdnFile"},{id:-1691921240,method:"upload.reuploadCdnFile",params:[{name:"file_token",type:"bytes"},{name:"request_token",type:"bytes"}],type:"Vector"},{id:1375900482,method:"help.getCdnConfig",params:[],type:"CdnConfig"},{id:-219008246,method:"langpack.getLangPack",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackDifference"},{id:-269862909,method:"langpack.getStrings",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"keys",type:"Vector"}],type:"Vector"},{id:-845657435,method:"langpack.getDifference",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"LangPackDifference"},{id:1120311183,method:"langpack.getLanguages",params:[{name:"lang_pack",type:"string"}],type:"Vector"},{id:-1763259007,method:"channels.editBanned",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:870184064,method:"channels.getAdminLog",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"q",type:"string"},{name:"events_filter",type:"flags.0?ChannelAdminLogEventsFilter"},{name:"admins",type:"flags.1?Vector"},{name:"max_id",type:"long"},{name:"min_id",type:"long"},{name:"limit",type:"int"}],type:"channels.AdminLogResults"},{id:-1847836879,method:"upload.getCdnFileHashes",params:[{name:"file_token",type:"bytes"},{name:"offset",type:"long"}],type:"Vector"},{id:-914493408,method:"messages.sendScreenshotNotification",params:[{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"int"},{name:"random_id",type:"long"}],type:"Updates"},{id:-359881479,method:"channels.setStickers",params:[{name:"channel",type:"InputChannel"},{name:"stickerset",type:"InputStickerSet"}],type:"Bool"},{id:82946729,method:"messages.getFavedStickers",params:[{name:"hash",type:"long"}],type:"messages.FavedStickers"},{id:-1174420133,method:"messages.faveSticker",params:[{name:"id",type:"InputDocument"},{name:"unfave",type:"Bool"}],type:"Bool"},{id:-357180360,method:"channels.readMessageContents",params:[{name:"channel",type:"InputChannel"},{name:"id",type:"Vector"}],type:"Bool"},{id:-2020263951,method:"contacts.resetSaved",params:[],type:"Bool"},{id:-251140208,method:"messages.getUnreadMentions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"}],type:"messages.Messages"},{id:-1683319225,method:"channels.deleteHistory",params:[{name:"flags",type:"#"},{name:"for_everyone",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Updates"},{id:1036054804,method:"help.getRecentMeUrls",params:[{name:"referer",type:"string"}],type:"help.RecentMeUrls"},{id:-356796084,method:"channels.togglePreHistoryHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:921026381,method:"messages.readMentions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"}],type:"messages.AffectedHistory"},{id:1881817312,method:"messages.getRecentLocations",params:[{name:"peer",type:"InputPeer"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1225713124,method:"messages.sendMultiMedia",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"background",type:"flags.6?true"},{name:"clear_draft",type:"flags.7?true"},{name:"noforwards",type:"flags.14?true"},{name:"update_stickersets_order",type:"flags.15?true"},{name:"peer",type:"InputPeer"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"multi_media",type:"Vector"},{name:"schedule_date",type:"flags.10?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Updates"},{id:1347929239,method:"messages.uploadEncryptedFile",params:[{name:"peer",type:"InputEncryptedChat"},{name:"file",type:"InputEncryptedFile"}],type:"EncryptedFile"},{id:405695855,method:"account.getWebAuthorizations",params:[],type:"account.WebAuthorizations"},{id:755087855,method:"account.resetWebAuthorization",params:[{name:"hash",type:"long"}],type:"Bool"},{id:1747789204,method:"account.resetWebAuthorizations",params:[],type:"Bool"},{id:896555914,method:"messages.searchStickerSets",params:[{name:"flags",type:"#"},{name:"exclude_featured",type:"flags.0?true"},{name:"q",type:"string"},{name:"hash",type:"long"}],type:"messages.FoundStickerSets"},{id:-1856595926,method:"upload.getFileHashes",params:[{name:"location",type:"InputFileLocation"},{name:"offset",type:"long"}],type:"Vector"},{id:749019089,method:"help.getTermsOfServiceUpdate",params:[],type:"help.TermsOfServiceUpdate"},{id:-294455398,method:"help.acceptTermsOfService",params:[{name:"id",type:"DataJSON"}],type:"Bool"},{id:-1299661699,method:"account.getAllSecureValues",params:[],type:"Vector"},{id:1936088002,method:"account.getSecureValue",params:[{name:"types",type:"Vector"}],type:"Vector"},{id:-1986010339,method:"account.saveSecureValue",params:[{name:"value",type:"InputSecureValue"},{name:"secure_secret_id",type:"long"}],type:"SecureValue"},{id:-1199522741,method:"account.deleteSecureValue",params:[{name:"types",type:"Vector"}],type:"Bool"},{id:-1865902923,method:"users.setSecureValueErrors",params:[{name:"id",type:"InputUser"},{name:"errors",type:"Vector"}],type:"Bool"},{id:-1456907910,method:"account.getAuthorizationForm",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"}],type:"account.AuthorizationForm"},{id:-202552205,method:"account.acceptAuthorization",params:[{name:"bot_id",type:"long"},{name:"scope",type:"string"},{name:"public_key",type:"string"},{name:"value_hashes",type:"Vector"},{name:"credentials",type:"SecureCredentialsEncrypted"}],type:"Bool"},{id:-1516022023,method:"account.sendVerifyPhoneCode",params:[{name:"phone_number",type:"string"},{name:"settings",type:"CodeSettings"}],type:"auth.SentCode"},{id:1305716726,method:"account.verifyPhone",params:[{name:"phone_number",type:"string"},{name:"phone_code_hash",type:"string"},{name:"phone_code",type:"string"}],type:"Bool"},{id:-1730136133,method:"account.sendVerifyEmailCode",params:[{name:"purpose",type:"EmailVerifyPurpose"},{name:"email",type:"string"}],type:"account.SentEmailCode"},{id:53322959,method:"account.verifyEmail",params:[{name:"purpose",type:"EmailVerifyPurpose"},{name:"verification",type:"EmailVerification"}],type:"account.EmailVerified"},{id:1072547679,method:"help.getDeepLinkInfo",params:[{name:"path",type:"string"}],type:"help.DeepLinkInfo"},{id:-2098076769,method:"contacts.getSaved",params:[],type:"Vector"},{id:-2092831552,method:"channels.getLeftChannels",params:[{name:"offset",type:"int"}],type:"messages.Chats"},{id:-1896617296,method:"account.initTakeoutSession",params:[{name:"flags",type:"#"},{name:"contacts",type:"flags.0?true"},{name:"message_users",type:"flags.1?true"},{name:"message_chats",type:"flags.2?true"},{name:"message_megagroups",type:"flags.3?true"},{name:"message_channels",type:"flags.4?true"},{name:"files",type:"flags.5?true"},{name:"file_max_size",type:"flags.5?long"}],type:"account.Takeout"},{id:489050862,method:"account.finishTakeoutSession",params:[{name:"flags",type:"#"},{name:"success",type:"flags.0?true"}],type:"Bool"},{id:486505992,method:"messages.getSplitRanges",params:[],type:"Vector"},{id:911373810,method:"invokeWithMessagesRange",params:[{name:"range",type:"MessageRange"},{name:"query",type:"!X"}],type:"X"},{id:-1398145746,method:"invokeWithTakeout",params:[{name:"takeout_id",type:"long"},{name:"query",type:"!X"}],type:"X"},{id:-1031349873,method:"messages.markDialogUnread",params:[{name:"flags",type:"#"},{name:"unread",type:"flags.0?true"},{name:"peer",type:"InputDialogPeer"}],type:"Bool"},{id:585256482,method:"messages.getDialogUnreadMarks",params:[],type:"Vector"},{id:-2062238246,method:"contacts.toggleTopPeers",params:[{name:"enabled",type:"Bool"}],type:"Bool"},{id:2119757468,method:"messages.clearAllDrafts",params:[],type:"Bool"},{id:-1735311088,method:"help.getAppConfig",params:[],type:"JSONValue"},{id:1862465352,method:"help.saveAppLog",params:[{name:"events",type:"Vector"}],type:"Bool"},{id:-966677240,method:"help.getPassportConfig",params:[{name:"hash",type:"int"}],type:"help.PassportConfig"},{id:1784243458,method:"langpack.getLanguage",params:[{name:"lang_pack",type:"string"},{name:"lang_code",type:"string"}],type:"LangPackLanguage"},{id:-760547348,method:"messages.updatePinnedMessage",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.0?true"},{name:"unpin",type:"flags.1?true"},{name:"pm_oneside",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"}],type:"Updates"},{id:-1881204448,method:"account.confirmPasswordEmail",params:[{name:"code",type:"string"}],type:"Bool"},{id:2055154197,method:"account.resendPasswordEmail",params:[],type:"Bool"},{id:-1043606090,method:"account.cancelPasswordEmail",params:[],type:"Bool"},{id:-748624084,method:"help.getSupportName",params:[],type:"help.SupportName"},{id:59377875,method:"help.getUserInfo",params:[{name:"user_id",type:"InputUser"}],type:"help.UserInfo"},{id:1723407216,method:"help.editUserInfo",params:[{name:"user_id",type:"InputUser"},{name:"message",type:"string"},{name:"entities",type:"Vector"}],type:"help.UserInfo"},{id:-1626880216,method:"account.getContactSignUpNotification",params:[],type:"Bool"},{id:-806076575,method:"account.setContactSignUpNotification",params:[{name:"silent",type:"Bool"}],type:"Bool"},{id:1398240377,method:"account.getNotifyExceptions",params:[{name:"flags",type:"#"},{name:"compare_sound",type:"flags.1?true"},{name:"peer",type:"flags.0?InputNotifyPeer"}],type:"Updates"},{id:283795844,method:"messages.sendVote",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"options",type:"Vector"}],type:"Updates"},{id:1941660731,method:"messages.getPollResults",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1848369232,method:"messages.getOnlines",params:[{name:"peer",type:"InputPeer"}],type:"ChatOnlines"},{id:-554301545,method:"messages.editChatAbout",params:[{name:"peer",type:"InputPeer"},{name:"about",type:"string"}],type:"Bool"},{id:-1517917375,method:"messages.editChatDefaultBannedRights",params:[{name:"peer",type:"InputPeer"},{name:"banned_rights",type:"ChatBannedRights"}],type:"Updates"},{id:-57811990,method:"account.getWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"}],type:"WallPaper"},{id:-578472351,method:"account.uploadWallPaper",params:[{name:"file",type:"InputFile"},{name:"mime_type",type:"string"},{name:"settings",type:"WallPaperSettings"}],type:"WallPaper"},{id:1817860919,method:"account.saveWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"unsave",type:"Bool"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-18000023,method:"account.installWallPaper",params:[{name:"wallpaper",type:"InputWallPaper"},{name:"settings",type:"WallPaperSettings"}],type:"Bool"},{id:-1153722364,method:"account.resetWallPapers",params:[],type:"Bool"},{id:1457130303,method:"account.getAutoDownloadSettings",params:[],type:"account.AutoDownloadSettings"},{id:1995661875,method:"account.saveAutoDownloadSettings",params:[{name:"flags",type:"#"},{name:"low",type:"flags.0?true"},{name:"high",type:"flags.1?true"},{name:"settings",type:"AutoDownloadSettings"}],type:"Bool"},{id:899735650,method:"messages.getEmojiKeywords",params:[{name:"lang_code",type:"string"}],type:"EmojiKeywordsDifference"},{id:352892591,method:"messages.getEmojiKeywordsDifference",params:[{name:"lang_code",type:"string"},{name:"from_version",type:"int"}],type:"EmojiKeywordsDifference"},{id:1318675378,method:"messages.getEmojiKeywordsLanguages",params:[{name:"lang_codes",type:"Vector"}],type:"Vector"},{id:-709817306,method:"messages.getEmojiURL",params:[{name:"lang_code",type:"string"}],type:"EmojiURL"},{id:1749536939,method:"folders.editPeerFolders",params:[{name:"folder_peers",type:"Vector"}],type:"Updates"},{id:472471681,method:"folders.deleteFolder",params:[{name:"folder_id",type:"int"}],type:"Updates"},{id:11435201,method:"messages.getSearchCounters",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"filters",type:"Vector"}],type:"Vector"},{id:-170208392,method:"channels.getGroupsForDiscussion",params:[],type:"messages.Chats"},{id:1079520178,method:"channels.setDiscussionGroup",params:[{name:"broadcast",type:"InputChannel"},{name:"group",type:"InputChannel"}],type:"Bool"},{id:428848198,method:"messages.requestUrlAuth",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:-1322487515,method:"messages.acceptUrlAuth",params:[{name:"flags",type:"#"},{name:"write_allowed",type:"flags.0?true"},{name:"peer",type:"flags.1?InputPeer"},{name:"msg_id",type:"flags.1?int"},{name:"button_id",type:"flags.1?int"},{name:"url",type:"flags.2?string"}],type:"UrlAuthResult"},{id:1336717624,method:"messages.hidePeerSettingsBar",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-386636848,method:"contacts.addContact",params:[{name:"flags",type:"#"},{name:"add_phone_privacy_exception",type:"flags.0?true"},{name:"id",type:"InputUser"},{name:"first_name",type:"string"},{name:"last_name",type:"string"},{name:"phone",type:"string"}],type:"Updates"},{id:-130964977,method:"contacts.acceptContact",params:[{name:"id",type:"InputUser"}],type:"Updates"},{id:-1892102881,method:"channels.editCreator",params:[{name:"channel",type:"InputChannel"},{name:"user_id",type:"InputUser"},{name:"password",type:"InputCheckPasswordSRP"}],type:"Updates"},{id:-750207932,method:"contacts.getLocated",params:[{name:"flags",type:"#"},{name:"background",type:"flags.1?true"},{name:"geo_point",type:"InputGeoPoint"},{name:"self_expires",type:"flags.0?int"}],type:"Updates"},{id:1491484525,method:"channels.editLocation",params:[{name:"channel",type:"InputChannel"},{name:"geo_point",type:"InputGeoPoint"},{name:"address",type:"string"}],type:"Bool"},{id:-304832784,method:"channels.toggleSlowMode",params:[{name:"channel",type:"InputChannel"},{name:"seconds",type:"int"}],type:"Updates"},{id:-183077365,method:"messages.getScheduledHistory",params:[{name:"peer",type:"InputPeer"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:-1111817116,method:"messages.getScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"messages.Messages"},{id:-1120369398,method:"messages.sendScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:1504586518,method:"messages.deleteScheduledMessages",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:473805619,method:"account.uploadTheme",params:[{name:"flags",type:"#"},{name:"file",type:"InputFile"},{name:"thumb",type:"flags.0?InputFile"},{name:"file_name",type:"string"},{name:"mime_type",type:"string"}],type:"Document"},{id:1697530880,method:"account.createTheme",params:[{name:"flags",type:"#"},{name:"slug",type:"string"},{name:"title",type:"string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:737414348,method:"account.updateTheme",params:[{name:"flags",type:"#"},{name:"format",type:"string"},{name:"theme",type:"InputTheme"},{name:"slug",type:"flags.0?string"},{name:"title",type:"flags.1?string"},{name:"document",type:"flags.2?InputDocument"},{name:"settings",type:"flags.3?Vector"}],type:"Theme"},{id:-229175188,method:"account.saveTheme",params:[{name:"theme",type:"InputTheme"},{name:"unsave",type:"Bool"}],type:"Bool"},{id:-953697477,method:"account.installTheme",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"theme",type:"flags.1?InputTheme"},{name:"format",type:"flags.2?string"},{name:"base_theme",type:"flags.3?BaseTheme"}],type:"Bool"},{id:978872812,method:"account.getTheme",params:[{name:"format",type:"string"},{name:"theme",type:"InputTheme"}],type:"Theme"},{id:1913054296,method:"account.getThemes",params:[{name:"format",type:"string"},{name:"hash",type:"long"}],type:"account.Themes"},{id:-1210022402,method:"auth.exportLoginToken",params:[{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"except_ids",type:"Vector"}],type:"auth.LoginToken"},{id:-1783866140,method:"auth.importLoginToken",params:[{name:"token",type:"bytes"}],type:"auth.LoginToken"},{id:-392909491,method:"auth.acceptLoginToken",params:[{name:"token",type:"bytes"}],type:"Authorization"},{id:-1250643605,method:"account.setContentSettings",params:[{name:"flags",type:"#"},{name:"sensitive_enabled",type:"flags.0?true"}],type:"Bool"},{id:-1952756306,method:"account.getContentSettings",params:[],type:"account.ContentSettings"},{id:300429806,method:"channels.getInactiveChannels",params:[],type:"messages.InactiveChats"},{id:1705865692,method:"account.getMultiWallPapers",params:[{name:"wallpapers",type:"Vector"}],type:"Vector"},{id:-1200736242,method:"messages.getPollVotes",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"option",type:"flags.0?bytes"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.VotesList"},{id:-1257951254,method:"messages.toggleStickerSets",params:[{name:"flags",type:"#"},{name:"uninstall",type:"flags.0?true"},{name:"archive",type:"flags.1?true"},{name:"unarchive",type:"flags.2?true"},{name:"stickersets",type:"Vector"}],type:"Bool"},{id:779736953,method:"payments.getBankCardData",params:[{name:"number",type:"string"}],type:"payments.BankCardData"},{id:-241247891,method:"messages.getDialogFilters",params:[],type:"Vector"},{id:-1566780372,method:"messages.getSuggestedDialogFilters",params:[],type:"Vector"},{id:450142282,method:"messages.updateDialogFilter",params:[{name:"flags",type:"#"},{name:"id",type:"int"},{name:"filter",type:"flags.0?DialogFilter"}],type:"Bool"},{id:-983318044,method:"messages.updateDialogFiltersOrder",params:[{name:"order",type:"Vector"}],type:"Bool"},{id:-1421720550,method:"stats.getBroadcastStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.BroadcastStats"},{id:1646092192,method:"stats.loadAsyncGraph",params:[{name:"flags",type:"#"},{name:"token",type:"string"},{name:"x",type:"flags.0?long"}],type:"StatsGraph"},{id:-1707717072,method:"stickers.setStickerSetThumb",params:[{name:"stickerset",type:"InputStickerSet"},{name:"thumb",type:"InputDocument"}],type:"messages.StickerSet"},{id:85399130,method:"bots.setBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"},{name:"commands",type:"Vector"}],type:"Bool"},{id:2127598753,method:"messages.getOldFeaturedStickers",params:[{name:"offset",type:"int"},{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:-1063816159,method:"help.getPromoData",params:[],type:"help.PromoData"},{id:505748629,method:"help.hidePromoData",params:[{name:"peer",type:"InputPeer"}],type:"Bool"},{id:-8744061,method:"phone.sendSignalingData",params:[{name:"peer",type:"InputPhoneCall"},{name:"data",type:"bytes"}],type:"Bool"},{id:-589330937,method:"stats.getMegagroupStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"}],type:"stats.MegagroupStats"},{id:-349483786,method:"account.getGlobalPrivacySettings",params:[],type:"GlobalPrivacySettings"},{id:517647042,method:"account.setGlobalPrivacySettings",params:[{name:"settings",type:"GlobalPrivacySettings"}],type:"GlobalPrivacySettings"},{id:-183649631,method:"help.dismissSuggestion",params:[{name:"peer",type:"InputPeer"},{name:"suggestion",type:"string"}],type:"Bool"},{id:1935116200,method:"help.getCountriesList",params:[{name:"lang_code",type:"string"},{name:"hash",type:"int"}],type:"help.CountriesList"},{id:584962828,method:"messages.getReplies",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"},{name:"hash",type:"long"}],type:"messages.Messages"},{id:1147761405,method:"messages.getDiscussionMessage",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"messages.DiscussionMessage"},{id:-147740172,method:"messages.readDiscussion",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"read_max_id",type:"int"}],type:"Bool"},{id:698914348,method:"contacts.blockFromReplies",params:[{name:"flags",type:"#"},{name:"delete_message",type:"flags.0?true"},{name:"delete_history",type:"flags.1?true"},{name:"report_spam",type:"flags.2?true"},{name:"msg_id",type:"int"}],type:"Updates"},{id:1445996571,method:"stats.getMessagePublicForwards",params:[{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"},{name:"offset_rate",type:"int"},{name:"offset_peer",type:"InputPeer"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:-1226791947,method:"stats.getMessageStats",params:[{name:"flags",type:"#"},{name:"dark",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"}],type:"stats.MessageStats"},{id:-299714136,method:"messages.unpinAllMessages",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"}],type:"messages.AffectedHistory"},{id:1221445336,method:"phone.createGroupCall",params:[{name:"flags",type:"#"},{name:"rtmp_stream",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"random_id",type:"int"},{name:"title",type:"flags.0?string"},{name:"schedule_date",type:"flags.1?int"}],type:"Updates"},{id:-1322057861,method:"phone.joinGroupCall",params:[{name:"flags",type:"#"},{name:"muted",type:"flags.0?true"},{name:"video_stopped",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"join_as",type:"InputPeer"},{name:"invite_hash",type:"flags.1?string"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:1342404601,method:"phone.leaveGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"source",type:"int"}],type:"Updates"},{id:2067345760,method:"phone.inviteToGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"users",type:"Vector"}],type:"Updates"},{id:2054648117,method:"phone.discardGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1958458429,method:"phone.toggleGroupCallSettings",params:[{name:"flags",type:"#"},{name:"reset_invite_hash",type:"flags.1?true"},{name:"call",type:"InputGroupCall"},{name:"join_muted",type:"flags.0?Bool"}],type:"Updates"},{id:68699611,method:"phone.getGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"limit",type:"int"}],type:"phone.GroupCall"},{id:-984033109,method:"phone.getGroupParticipants",params:[{name:"call",type:"InputGroupCall"},{name:"ids",type:"Vector"},{name:"sources",type:"Vector"},{name:"offset",type:"string"},{name:"limit",type:"int"}],type:"phone.GroupParticipants"},{id:-1248003721,method:"phone.checkGroupCall",params:[{name:"call",type:"InputGroupCall"},{name:"sources",type:"Vector"}],type:"Vector"},{id:1540419152,method:"messages.deleteChat",params:[{name:"chat_id",type:"long"}],type:"Bool"},{id:-104078327,method:"messages.deletePhoneCallHistory",params:[{name:"flags",type:"#"},{name:"revoke",type:"flags.0?true"}],type:"messages.AffectedFoundMessages"},{id:1140726259,method:"messages.checkHistoryImport",params:[{name:"import_head",type:"string"}],type:"messages.HistoryImportParsed"},{id:873008187,method:"messages.initHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"file",type:"InputFile"},{name:"media_count",type:"int"}],type:"messages.HistoryImport"},{id:713433234,method:"messages.uploadImportedMedia",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"},{name:"file_name",type:"string"},{name:"media",type:"InputMedia"}],type:"MessageMedia"},{id:-1271008444,method:"messages.startHistoryImport",params:[{name:"peer",type:"InputPeer"},{name:"import_id",type:"long"}],type:"Bool"},{id:-1565154314,method:"messages.getExportedChatInvites",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.3?true"},{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"},{name:"offset_date",type:"flags.2?int"},{name:"offset_link",type:"flags.2?string"},{name:"limit",type:"int"}],type:"messages.ExportedChatInvites"},{id:1937010524,method:"messages.getExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"messages.ExportedChatInvite"},{id:-1110823051,method:"messages.editExportedChatInvite",params:[{name:"flags",type:"#"},{name:"revoked",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"string"},{name:"expire_date",type:"flags.0?int"},{name:"usage_limit",type:"flags.1?int"},{name:"request_needed",type:"flags.3?Bool"},{name:"title",type:"flags.4?string"}],type:"messages.ExportedChatInvite"},{id:1452833749,method:"messages.deleteRevokedExportedChatInvites",params:[{name:"peer",type:"InputPeer"},{name:"admin_id",type:"InputUser"}],type:"Bool"},{id:-731601877,method:"messages.deleteExportedChatInvite",params:[{name:"peer",type:"InputPeer"},{name:"link",type:"string"}],type:"Bool"},{id:958457583,method:"messages.getAdminsWithInvites",params:[{name:"peer",type:"InputPeer"}],type:"messages.ChatAdminsWithInvites"},{id:-553329330,method:"messages.getChatInviteImporters",params:[{name:"flags",type:"#"},{name:"requested",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"},{name:"q",type:"flags.2?string"},{name:"offset_date",type:"int"},{name:"offset_user",type:"InputUser"},{name:"limit",type:"int"}],type:"messages.ChatInviteImporters"},{id:-1207017500,method:"messages.setHistoryTTL",params:[{name:"peer",type:"InputPeer"},{name:"period",type:"int"}],type:"Updates"},{id:-91437323,method:"account.reportProfilePhoto",params:[{name:"peer",type:"InputPeer"},{name:"photo_id",type:"InputPhoto"},{name:"reason",type:"ReportReason"},{name:"message",type:"string"}],type:"Bool"},{id:187239529,method:"channels.convertToGigagroup",params:[{name:"channel",type:"InputChannel"}],type:"Updates"},{id:1573261059,method:"messages.checkHistoryImportPeer",params:[{name:"peer",type:"InputPeer"}],type:"messages.CheckedHistoryImportPeer"},{id:-248985848,method:"phone.toggleGroupCallRecord",params:[{name:"flags",type:"#"},{name:"start",type:"flags.0?true"},{name:"video",type:"flags.2?true"},{name:"call",type:"InputGroupCall"},{name:"title",type:"flags.1?string"},{name:"video_portrait",type:"flags.2?Bool"}],type:"Updates"},{id:-1524155713,method:"phone.editGroupCallParticipant",params:[{name:"flags",type:"#"},{name:"call",type:"InputGroupCall"},{name:"participant",type:"InputPeer"},{name:"muted",type:"flags.0?Bool"},{name:"volume",type:"flags.1?int"},{name:"raise_hand",type:"flags.2?Bool"},{name:"video_stopped",type:"flags.3?Bool"},{name:"video_paused",type:"flags.4?Bool"},{name:"presentation_paused",type:"flags.5?Bool"}],type:"Updates"},{id:480685066,method:"phone.editGroupCallTitle",params:[{name:"call",type:"InputGroupCall"},{name:"title",type:"string"}],type:"Updates"},{id:-277077702,method:"phone.getGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"}],type:"phone.JoinAsPeers"},{id:-425040769,method:"phone.exportGroupCallInvite",params:[{name:"flags",type:"#"},{name:"can_self_unmute",type:"flags.0?true"},{name:"call",type:"InputGroupCall"}],type:"phone.ExportedGroupCallInvite"},{id:563885286,method:"phone.toggleGroupCallStartSubscription",params:[{name:"call",type:"InputGroupCall"},{name:"subscribed",type:"Bool"}],type:"Updates"},{id:1451287362,method:"phone.startScheduledGroupCall",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:1465786252,method:"phone.saveDefaultGroupCallJoinAs",params:[{name:"peer",type:"InputPeer"},{name:"join_as",type:"InputPeer"}],type:"Bool"},{id:-873829436,method:"phone.joinGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"},{name:"params",type:"DataJSON"}],type:"Updates"},{id:475058500,method:"phone.leaveGroupCallPresentation",params:[{name:"call",type:"InputGroupCall"}],type:"Updates"},{id:676017721,method:"stickers.checkShortName",params:[{name:"short_name",type:"string"}],type:"Bool"},{id:1303364867,method:"stickers.suggestShortName",params:[{name:"title",type:"string"}],type:"stickers.SuggestedShortName"},{id:1032708345,method:"bots.resetBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Bool"},{id:-481554986,method:"bots.getBotCommands",params:[{name:"scope",type:"BotCommandScope"},{name:"lang_code",type:"string"}],type:"Vector"},{id:-1828139493,method:"account.resetPassword",params:[],type:"account.ResetPasswordResult"},{id:1284770294,method:"account.declinePasswordReset",params:[],type:"Bool"},{id:221691769,method:"auth.checkRecoveryPassword",params:[{name:"code",type:"string"}],type:"Bool"},{id:-700916087,method:"account.getChatThemes",params:[{name:"hash",type:"long"}],type:"account.Themes"},{id:-432283329,method:"messages.setChatTheme",params:[{name:"peer",type:"InputPeer"},{name:"emoticon",type:"string"}],type:"Updates"},{id:-1095836780,method:"channels.viewSponsoredMessage",params:[{name:"channel",type:"InputChannel"},{name:"random_id",type:"bytes"}],type:"Bool"},{id:-333377601,method:"channels.getSponsoredMessages",params:[{name:"channel",type:"InputChannel"}],type:"messages.SponsoredMessages"},{id:745510839,method:"messages.getMessageReadParticipants",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"Vector"},{id:1240514025,method:"messages.getSearchResultsCalendar",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"offset_date",type:"int"}],type:"messages.SearchResultsCalendar"},{id:1855292323,method:"messages.getSearchResultsPositions",params:[{name:"peer",type:"InputPeer"},{name:"filter",type:"MessagesFilter"},{name:"offset_id",type:"int"},{name:"limit",type:"int"}],type:"messages.SearchResultsPositions"},{id:2145904661,method:"messages.hideChatJoinRequest",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"user_id",type:"InputUser"}],type:"Updates"},{id:-528091926,method:"messages.hideAllChatJoinRequests",params:[{name:"flags",type:"#"},{name:"approved",type:"flags.0?true"},{name:"peer",type:"InputPeer"},{name:"link",type:"flags.1?string"}],type:"Updates"},{id:-1323389022,method:"messages.toggleNoForwards",params:[{name:"peer",type:"InputPeer"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-855777386,method:"messages.saveDefaultSendAs",params:[{name:"peer",type:"InputPeer"},{name:"send_as",type:"InputPeer"}],type:"Bool"},{id:231174382,method:"channels.getSendAs",params:[{name:"peer",type:"InputPeer"}],type:"channels.SendAsPeers"},{id:-1081501024,method:"account.setAuthorizationTTL",params:[{name:"authorization_ttl_days",type:"int"}],type:"Bool"},{id:1089766498,method:"account.changeAuthorizationSettings",params:[{name:"flags",type:"#"},{name:"hash",type:"long"},{name:"encrypted_requests_disabled",type:"flags.0?Bool"},{name:"call_requests_disabled",type:"flags.1?Bool"}],type:"Bool"},{id:913655003,method:"channels.deleteParticipantHistory",params:[{name:"channel",type:"InputChannel"},{name:"participant",type:"InputPeer"}],type:"messages.AffectedHistory"},{id:-754091820,method:"messages.sendReaction",params:[{name:"flags",type:"#"},{name:"big",type:"flags.1?true"},{name:"add_to_recent",type:"flags.2?true"},{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"reaction",type:"flags.0?Vector"}],type:"Updates"},{id:-1950707482,method:"messages.getMessagesReactions",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:1176190792,method:"messages.getMessageReactionsList",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction",type:"flags.0?Reaction"},{name:"offset",type:"flags.1?string"},{name:"limit",type:"int"}],type:"messages.MessageReactionsList"},{id:-21928079,method:"messages.setChatAvailableReactions",params:[{name:"peer",type:"InputPeer"},{name:"available_reactions",type:"ChatReactions"}],type:"Updates"},{id:417243308,method:"messages.getAvailableReactions",params:[{name:"hash",type:"int"}],type:"messages.AvailableReactions"},{id:1330094102,method:"messages.setDefaultReaction",params:[{name:"reaction",type:"Reaction"}],type:"Bool"},{id:617508334,method:"messages.translateText",params:[{name:"flags",type:"#"},{name:"peer",type:"flags.0?InputPeer"},{name:"msg_id",type:"flags.0?int"},{name:"text",type:"flags.1?string"},{name:"from_lang",type:"flags.2?string"},{name:"to_lang",type:"string"}],type:"messages.TranslatedText"},{id:841173339,method:"messages.getUnreadReactions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"},{name:"offset_id",type:"int"},{name:"add_offset",type:"int"},{name:"limit",type:"int"},{name:"max_id",type:"int"},{name:"min_id",type:"int"}],type:"messages.Messages"},{id:1420459918,method:"messages.readReactions",params:[{name:"flags",type:"#"},{name:"peer",type:"InputPeer"},{name:"top_msg_id",type:"flags.0?int"}],type:"messages.AffectedHistory"},{id:-1963375804,method:"contacts.resolvePhone",params:[{name:"phone",type:"string"}],type:"contacts.ResolvedPeer"},{id:447879488,method:"phone.getGroupCallStreamChannels",params:[{name:"call",type:"InputGroupCall"}],type:"phone.GroupCallStreamChannels"},{id:-558650433,method:"phone.getGroupCallStreamRtmpUrl",params:[{name:"peer",type:"InputPeer"},{name:"revoke",type:"Bool"}],type:"phone.GroupCallStreamRtmpUrl"},{id:276705696,method:"messages.searchSentMedia",params:[{name:"q",type:"string"},{name:"filter",type:"MessagesFilter"},{name:"limit",type:"int"}],type:"messages.Messages"},{id:385663691,method:"messages.getAttachMenuBots",params:[{name:"hash",type:"long"}],type:"AttachMenuBots"},{id:1998676370,method:"messages.getAttachMenuBot",params:[{name:"bot",type:"InputUser"}],type:"AttachMenuBotsBot"},{id:1777704297,method:"messages.toggleBotInAttachMenu",params:[{name:"flags",type:"#"},{name:"write_allowed",type:"flags.0?true"},{name:"bot",type:"InputUser"},{name:"enabled",type:"Bool"}],type:"Bool"},{id:395003915,method:"messages.requestWebView",params:[{name:"flags",type:"#"},{name:"from_bot_menu",type:"flags.4?true"},{name:"silent",type:"flags.5?true"},{name:"peer",type:"InputPeer"},{name:"bot",type:"InputUser"},{name:"url",type:"flags.1?string"},{name:"start_param",type:"flags.3?string"},{name:"theme_params",type:"flags.2?DataJSON"},{name:"platform",type:"string"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"WebViewResult"},{id:2146648841,method:"messages.prolongWebView",params:[{name:"flags",type:"#"},{name:"silent",type:"flags.5?true"},{name:"peer",type:"InputPeer"},{name:"bot",type:"InputUser"},{name:"query_id",type:"long"},{name:"reply_to_msg_id",type:"flags.0?int"},{name:"top_msg_id",type:"flags.9?int"},{name:"send_as",type:"flags.13?InputPeer"}],type:"Bool"},{id:698084494,method:"messages.requestSimpleWebView",params:[{name:"flags",type:"#"},{name:"bot",type:"InputUser"},{name:"url",type:"string"},{name:"theme_params",type:"flags.0?DataJSON"},{name:"platform",type:"string"}],type:"SimpleWebViewResult"},{id:172168437,method:"messages.sendWebViewResultMessage",params:[{name:"bot_query_id",type:"string"},{name:"result",type:"InputBotInlineResult"}],type:"WebViewMessageSent"},{id:-603831608,method:"messages.sendWebViewData",params:[{name:"bot",type:"InputUser"},{name:"random_id",type:"long"},{name:"button_text",type:"string"},{name:"data",type:"string"}],type:"Updates"},{id:1157944655,method:"bots.setBotMenuButton",params:[{name:"user_id",type:"InputUser"},{name:"button",type:"BotMenuButton"}],type:"Bool"},{id:-1671369944,method:"bots.getBotMenuButton",params:[{name:"user_id",type:"InputUser"}],type:"BotMenuButton"},{id:-510647672,method:"account.getSavedRingtones",params:[{name:"hash",type:"long"}],type:"account.SavedRingtones"},{id:1038768899,method:"account.saveRingtone",params:[{name:"id",type:"InputDocument"},{name:"unsave",type:"Bool"}],type:"account.SavedRingtone"},{id:-2095414366,method:"account.uploadRingtone",params:[{name:"file",type:"InputFile"},{name:"file_name",type:"string"},{name:"mime_type",type:"string"}],type:"Document"},{id:2021942497,method:"bots.setBotBroadcastDefaultAdminRights",params:[{name:"admin_rights",type:"ChatAdminRights"}],type:"Bool"},{id:-1839281686,method:"bots.setBotGroupDefaultAdminRights",params:[{name:"admin_rights",type:"ChatAdminRights"}],type:"Bool"},{id:1092913030,method:"phone.saveCallLog",params:[{name:"peer",type:"InputPhoneCall"},{name:"file",type:"InputFile"}],type:"Bool"},{id:-456419968,method:"channels.toggleJoinToSend",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:1277789622,method:"channels.toggleJoinRequest",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:261206117,method:"payments.exportInvoice",params:[{name:"invoice_media",type:"InputMedia"}],type:"payments.ExportedInvoice"},{id:647928393,method:"messages.transcribeAudio",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"}],type:"messages.TranscribedAudio"},{id:2132608815,method:"messages.rateTranscribedAudio",params:[{name:"peer",type:"InputPeer"},{name:"msg_id",type:"int"},{name:"transcription_id",type:"long"},{name:"good",type:"Bool"}],type:"Bool"},{id:-2131921795,method:"payments.assignAppStoreTransaction",params:[{name:"receipt",type:"bytes"},{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Updates"},{id:-537046829,method:"payments.assignPlayMarketTransaction",params:[{name:"receipt",type:"DataJSON"},{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Updates"},{id:-1614700874,method:"payments.canPurchasePremium",params:[{name:"purpose",type:"InputStorePaymentPurpose"}],type:"Bool"},{id:-1206152236,method:"help.getPremiumPromo",params:[],type:"help.PremiumPromo"},{id:-643100844,method:"messages.getCustomEmojiDocuments",params:[{name:"document_id",type:"Vector"}],type:"Vector"},{id:-67329649,method:"messages.getEmojiStickers",params:[{name:"hash",type:"long"}],type:"messages.AllStickers"},{id:248473398,method:"messages.getFeaturedEmojiStickers",params:[{name:"hash",type:"long"}],type:"messages.FeaturedStickers"},{id:-70001045,method:"account.updateEmojiStatus",params:[{name:"emoji_status",type:"EmojiStatus"}],type:"Bool"},{id:-696962170,method:"account.getDefaultEmojiStatuses",params:[{name:"hash",type:"long"}],type:"account.EmojiStatuses"},{id:257392901,method:"account.getRecentEmojiStatuses",params:[{name:"hash",type:"long"}],type:"account.EmojiStatuses"},{id:404757166,method:"account.clearRecentEmojiStatuses",params:[],type:"Bool"},{id:1063567478,method:"messages.reportReaction",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"int"},{name:"reaction_peer",type:"InputPeer"}],type:"Bool"},{id:-1149164102,method:"messages.getTopReactions",params:[{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Reactions"},{id:960896434,method:"messages.getRecentReactions",params:[{name:"limit",type:"int"},{name:"hash",type:"long"}],type:"messages.Reactions"},{id:-1644236876,method:"messages.clearRecentReactions",params:[],type:"Bool"},{id:-2064119788,method:"messages.getExtendedMedia",params:[{name:"peer",type:"InputPeer"},{name:"id",type:"Vector"}],type:"Updates"},{id:767062953,method:"auth.importWebTokenAuthorization",params:[{name:"api_id",type:"int"},{name:"api_hash",type:"string"},{name:"web_auth_token",type:"string"}],type:"auth.Authorization"},{id:-279966037,method:"account.reorderUsernames",params:[{name:"order",type:"Vector"}],type:"Bool"},{id:1490465654,method:"account.toggleUsername",params:[{name:"username",type:"string"},{name:"active",type:"Bool"}],type:"Bool"},{id:-1268978403,method:"channels.reorderUsernames",params:[{name:"channel",type:"InputChannel"},{name:"order",type:"Vector"}],type:"Bool"},{id:1358053637,method:"channels.toggleUsername",params:[{name:"channel",type:"InputChannel"},{name:"username",type:"string"},{name:"active",type:"Bool"}],type:"Bool"},{id:170155475,method:"channels.deactivateAllUsernames",params:[{name:"channel",type:"InputChannel"}],type:"Bool"},{id:-1540781271,method:"channels.toggleForum",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-200539612,method:"channels.createForumTopic",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"title",type:"string"},{name:"icon_color",type:"flags.0?int"},{name:"icon_emoji_id",type:"flags.3?long"},{name:"random_id",type:"long"},{name:"send_as",type:"flags.2?InputPeer"}],type:"Updates"},{id:233136337,method:"channels.getForumTopics",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"q",type:"flags.0?string"},{name:"offset_date",type:"int"},{name:"offset_id",type:"int"},{name:"offset_topic",type:"int"},{name:"limit",type:"int"}],type:"messages.ForumTopics"},{id:-1333584199,method:"channels.getForumTopicsByID",params:[{name:"channel",type:"InputChannel"},{name:"topics",type:"Vector"}],type:"messages.ForumTopics"},{id:-186670715,method:"channels.editForumTopic",params:[{name:"flags",type:"#"},{name:"channel",type:"InputChannel"},{name:"topic_id",type:"int"},{name:"title",type:"flags.0?string"},{name:"icon_emoji_id",type:"flags.1?long"},{name:"closed",type:"flags.2?Bool"},{name:"hidden",type:"flags.3?Bool"}],type:"Updates"},{id:1814925350,method:"channels.updatePinnedForumTopic",params:[{name:"channel",type:"InputChannel"},{name:"topic_id",type:"int"},{name:"pinned",type:"Bool"}],type:"Updates"},{id:876830509,method:"channels.deleteTopicHistory",params:[{name:"channel",type:"InputChannel"},{name:"top_msg_id",type:"int"}],type:"messages.AffectedHistory"},{id:693150095,method:"channels.reorderPinnedForumTopics",params:[{name:"flags",type:"#"},{name:"force",type:"flags.0?true"},{name:"channel",type:"InputChannel"},{name:"order",type:"Vector"}],type:"Updates"},{id:1760814315,method:"channels.toggleAntiSpam",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"},{id:-1471109485,method:"channels.reportAntiSpamFalsePositive",params:[{name:"channel",type:"InputChannel"},{name:"msg_id",type:"int"}],type:"Bool"},{id:-1632299963,method:"messages.setDefaultHistoryTTL",params:[{name:"period",type:"int"}],type:"Bool"},{id:1703637384,method:"messages.getDefaultHistoryTTL",params:[],type:"DefaultHistoryTTL"},{id:-127582169,method:"contacts.exportContactToken",params:[],type:"ExportedContactToken"},{id:318789512,method:"contacts.importContactToken",params:[{name:"token",type:"string"}],type:"User"},{id:-1189444673,method:"photos.uploadContactProfilePhoto",params:[{name:"flags",type:"#"},{name:"suggest",type:"flags.3?true"},{name:"save",type:"flags.4?true"},{name:"user_id",type:"InputUser"},{name:"file",type:"flags.0?InputFile"},{name:"video",type:"flags.1?InputFile"},{name:"video_start_ts",type:"flags.2?double"}],type:"photos.Photo"},{id:1785624660,method:"channels.toggleParticipantsHidden",params:[{name:"channel",type:"InputChannel"},{name:"enabled",type:"Bool"}],type:"Updates"}]},layer:151};var ts=a(745),as=a.n(ts),ss=a(4736),ns=a.n(ss);function is(e){return e>>>0}function rs(e,t){return e=is(e),t=is(t),ns()(e).shiftLeft(32).add(ns()(t))}const os=ns()(Number.MAX_SAFE_INTEGER),ps=ns()(ns()[2]).pow(64),ds=ps.divide(ns()[2]);function fs(e,t=256){return ns().fromArray(e instanceof Uint8Array?[...e]:e,t)}const cs=+es.API.constructors.find((e=>"boolFalse"===e.predicate)).id,ls=+es.API.constructors.find((e=>"boolTrue"===e.predicate)).id,ms=+es.API.constructors.find((e=>"vector"===e.predicate)).id,gs=+es.MTProto.constructors.find((e=>"gzip_packed"===e.predicate)).id,hs="slice";class us{constructor(e={}){this.maxLength=2048,this.offset=0,this.mtproto=!1,this.debug=!1,this.maxLength=e.startMaxLength||2048,this.mtproto=e.mtproto||!1,this.createBuffer()}createBuffer(){this.buffer=new ArrayBuffer(this.maxLength),this.intView=new Int32Array(this.buffer),this.byteView=new Uint8Array(this.buffer)}getArray(){const e=new ArrayBuffer(this.offset),t=new Int32Array(e);return t.set(this.intView.subarray(0,this.offset/4)),t}getBuffer(){return this.getArray().buffer}getBytes(e=!0){if(e){const e=new ArrayBuffer(this.offset),t=new Uint8Array(e);return t.set(this.byteView.subarray(0,this.offset)),t}const t=new Array(this.offset);for(let e=0;e>>",e.toString(16),e,t);const a=this.offset/4;return this.checkLength(4),this.intView[a]=e,this.offset+=4,a}storeInt(e,t){return this.writeInt(e,(t||"")+":int")}storeBool(e,t){e?this.writeInt(ls,(t||"")+":bool"):this.writeInt(cs,(t||"")+":bool")}storeLongP(e,t,a){this.writeInt(t,(a||"")+":long[low]"),this.writeInt(e,(a||"")+":long[high]")}storeLong(e,t){if(Array.isArray(e))return 2===e.length?this.storeLongP(e[0],e[1],t):this.storeIntBytes(e,64,t);const a=(s=ns()(e)).isNegative()?ps.add(s):s;var s;const{quotient:n,remainder:i}=a.divmod(4294967296),r=n.toJSNumber(),o=i.toJSNumber();this.writeInt(o,(t||"")+":long[low]"),this.writeInt(r,(t||"")+":long[high]")}storeDouble(e,t){const a=new ArrayBuffer(8),s=new Int32Array(a);new Float64Array(a)[0]=e,this.writeInt(s[0],(t||"")+":double[low]"),this.writeInt(s[1],(t||"")+":double[high]")}storeString(e,t){this.debug&&console.log(">>>",e,(t||"")+":string"),void 0===e&&(e="");const a=unescape(encodeURIComponent(e));this.checkLength(a.length+8);const s=a.length;s<=253?this.byteView[this.offset++]=s:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&s,this.byteView[this.offset++]=(65280&s)>>8,this.byteView[this.offset++]=(16711680&s)>>16);for(let e=0;e>>",T(e),(t||"")+":bytes");const a=e.length;for(this.checkLength(a+8),a<=253?this.byteView[this.offset++]=a:(this.byteView[this.offset++]=254,this.byteView[this.offset++]=255&a,this.byteView[this.offset++]=(65280&a)>>8,this.byteView[this.offset++]=(16711680&a)>>16),this.byteView.set(e,this.offset),this.offset+=a;this.offset%4;)this.byteView[this.offset++]=0}storeIntBytes(e,t,a){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const s=e.length;if(t%32||8*s!==t){const n=new Error("Invalid bits: "+t+", "+s);throw console.error(n,e,a),n}this.debug&&console.log(">>>",T(e),(a||"")+":int"+t),this.checkLength(s),this.byteView.set(e,this.offset),this.offset+=s}storeRawBytes(e,t){e instanceof ArrayBuffer&&(e=new Uint8Array(e));const a=e.length;this.debug&&console.log(">>>",T(e),t||""),this.checkLength(a),this.byteView.set(e,this.offset),this.offset+=a}storeMethod(e,t){const a=(this.mtproto?es.MTProto:es.API).methods.find((t=>t.method===e));if(!a)throw new Error("No method "+e+" found");this.storeInt(a.id,e+"[id]");const s=t.pFlags||t,n={};for(const i of a.params){let a=i.type;if(-1!==a.indexOf("?")){const e=a.split("?"),n=e[0].split(".");if(!(t[n[0]]&1<<+n[1])){if(!("true"===e[1]?s[i.name]:void 0!==t[i.name]))continue;t[n[0]]|=1<<+n[1]}a=e[1]}const r=this.storeObject(t[i.name],a,e+"["+i.name+"]");"#"===a&&(t[i.name]=t[i.name]||0,n[i.name]=r)}for(const e in n)this.intView[n[e]]=t[e];return a.type}storeObject(e,t,a){switch(t){case"#":e=e||0;case"int":return this.storeInt(e,a);case"long":return this.storeLong(e,a);case"int128":return this.storeIntBytes(e,128,a);case"int256":return this.storeIntBytes(e,256,a);case"int512":return this.storeIntBytes(e,512,a);case"string":return this.storeString(e,a);case"bytes":return this.storeBytes(e,a);case"double":return this.storeDouble(e,a);case"Bool":return this.storeBool(e,a);case"true":return}if(Array.isArray(e)){if("Vector"===t.substr(0,6))this.writeInt(ms,a+"[id]");else if("vector"!==t.substr(0,6))throw new Error("Invalid vector type "+t);const s=t.substr(7,t.length-8);this.writeInt(e.length,a+"[count]");for(let t=0;te.predicate===n));if((i="%"===t.charAt(0))&&(t=t.substr(1)),!r)throw new Error("No predicate "+n+" found");n===t&&(i=!0),i||this.writeInt(r.id,a+"["+n+"][id]");const o=e.pFlags,p={};for(const t of r.params){let s=t.type;if(-1!==s.indexOf("?")){const a=s.split("?"),n=a[0].split(".");if(!(e[n[0]]&1<<+n[1])){if(!("true"===a[1]?o&&o[t.name]:void 0!==e[t.name]))continue;e[n[0]]|=1<<+n[1]}s=a[1]}const i=this.storeObject(e[t.name],s,a+"["+n+"]["+t.name+"]");"#"===s&&(e[t.name]=e[t.name]||0,p[t.name]=i)}for(const t in p)this.intView[p[t]]=e[t];return r.type}}class ys{constructor(e,t={}){this.offset=0,this.mtproto=!1,e instanceof ArrayBuffer?(this.buffer=e,this.intView=new Int32Array(e),this.byteView=new Uint8Array(this.buffer)):(this.buffer=e.buffer,this.intView=new Int32Array(e.buffer),this.byteView=e),this.override=t.override||{},this.mtproto=!!t.mtproto,this.debug=void 0!==t.debug&&t.debug}readInt(e){if(this.byteView.length-this.offset<4)throw console.error(this.byteView,this.offset),new Error("Nothing to fetch: "+e);const t=this.intView[this.offset/4];return this.debug&&console.log("<<<",t.toString(16),t,e,this.byteView.slice(this.offset-16,this.offset+16),T(this.byteView.slice(this.offset-16,this.offset+16))),this.offset+=4,t}fetchInt(e){return this.readInt((e||"")+":int")}fetchDouble(e){const t=new ArrayBuffer(8),a=new Int32Array(t),s=new Float64Array(t);return a[0]=this.readInt((e||"")+":double[low]"),a[1]=this.readInt((e||"")+":double[high]"),s[0]}fetchLong(e){const t=this.readInt((e||"")+":long[low]");let a=rs(this.readInt((e||"")+":long[high]"),t);var s;return this.mtproto||(a=(s=a).greater(ds)?s.minus(ps):s),!this.mtproto&&os.greaterOrEquals(a.abs())?a.toJSNumber():a.toString(10)}fetchBool(e){const t=this.readInt((e||"")+":bool");return t===ls||t!==cs&&(this.offset-=4,this.fetchObject("Object",e))}fetchString(e){let t=this.byteView[this.offset++];254===t&&(t=this.byteView[this.offset++]|this.byteView[this.offset++]<<8|this.byteView[this.offset++]<<16);let a,s="";for(let e=0;ethis.byteView.byteLength)throw new Error("Invalid raw bytes length: "+e+", buffer len: "+this.byteView.byteLength);if(t){const t=new Uint8Array(e);return t.set(this.byteView[hs](this.offset,this.offset+e)),this.offset+=e,t}const s=new Array(e);for(let t=0;t0){const n=e.substr(7,e.length-8);for(let e=0;ee.type===t)),!s)throw new Error("Constructor not found for type: "+e)}else{const r=this.readInt(t+"[id]");if(r===gs){const a=(i=this.fetchBytes(t+"[packed_string]"),as().inflate(i,void 0));return new ys(a).fetchObject(e,t)}if(r===ms)return this.fetchVector(e,t);let o=a.constructorsIndex;if(!o){a.constructorsIndex=o={};for(let e=0,t=a.constructors.length;e0&&r{var e;if(this.pingDelayDisconnectDeferred||!this.transport||!this.transport.connected)return;const t=this.pingDelayDisconnectDeferred=(0,v.Z)(),a=this.delays,s=this.delays.pingMaxTime,n=Math.min(null!==(e=this.lastPingTime)&&void 0!==e?e:0,s),i=Math.round(a.disconnectDelayMin+n/s*(a.disconnectDelayMax-a.disconnectDelayMin)),r=1e3*i,o=this.lastPingStartTime=Date.now(),p=this.lastPingDelayDisconnectId=(0,Te.a)(),d={notContentRelated:!0};this.wrapMtpCall("ping_delay_disconnect",{ping_id:p,disconnect_delay:i},d);const f=this.log.bindPrefix("sendPingDelayDisconnect");this.debug&&f.debug(`ping, timeout=${r}, lastPingTime=${this.lastPingTime}, msgId=${d.messageId}, pingId=${p}`);const c=E.Z.setTimeout(t.reject,r);t.then((e=>{clearTimeout(c);const t=Date.now()-o;if(this.lastPingTime=t/1e3,this.debug&&f.debug(`pong, reason='${e}', time=${n}, msgId=${d.messageId}`),t>r)throw void 0;return(0,P.Z)(Math.max(0,this.delays.pingInterval-t))})).catch((()=>{clearTimeout(c);const e=this.transport;this.pingDelayDisconnectDeferred===t&&(null==e?void 0:e.connection)&&(f.error("catch, closing connection",this.lastPingTime,d.messageId),e.connection.close())})).finally((()=>{this.pingDelayDisconnectDeferred===t&&(this.pingDelayDisconnectDeferred=void 0,this.sendPingDelayDisconnect())}))},this.checkLongPoll=()=>{const e=this.cleanupSent();if(this.longPollPending&&Date.now(){e&&(t!==this.dcId||this.sleepAfter&&Date.now()>this.sleepAfter)||this.sendLongPoll()}))},this.checkConnection=e=>{if(this.debug&&this.log("Check connection",e),this.clearCheckConnectionTimeout(),!this.transport)return void this.log.warn("No transport for checkConnection");const t=new us({mtproto:!0}),a=(0,Te.a)();t.storeMethod("ping",{ping_id:a});const s={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(!0),body:t.getBytes(!0)};this.offline&&this.setConnectionStatus(U.Q.Connecting),this.sendEncryptedRequest(s).then((()=>{this.toggleOffline(!1)}),(()=>{this.debug&&this.log("Delay",1e3*this.checkConnectionPeriod),this.checkConnectionTimeout=E.Z.setTimeout((()=>this.checkConnection("from failed checkConnection request")),1e3*this.checkConnectionPeriod|0),this.checkConnectionPeriod=Math.min(60,1.5*this.checkConnectionPeriod)}))},this.authKeyUint8=(0,bs.Z)(this.authKey),this.serverSalt=(0,bs.Z)(i),this.isFileUpload=!!r.fileUpload,this.isFileDownload=!!r.fileDownload,this.isFileNetworker=this.isFileUpload||this.isFileDownload,this.delays=this.isFileNetworker?Is.file:Is.client;const o=this.isFileUpload?"-U":this.isFileDownload?"-D":"";this.name="NET-"+a+o,this.log=(0,I.kg)(this.name+(o?"":"-C")+"-"+ws++,I.v9.Log|I.v9.Error|I.v9.Warn),this.log("constructor"),this.updateSession()}updateSession(){this.seqNo=0,this.prevSessionId=this.sessionId,this.sessionId=w(new Uint8Array(8))}updateSentMessage(e){const t=this.sentMessages[e];return!!t&&(t.container&&(0,ne.Z)(t.inner,((e,a)=>{const s=this.updateSentMessage(e);s?t.inner[a]=s.msg_id:t.inner.splice(a,1)})),t.msg_id=this.timeManager.generateId(),t.seq_no=this.generateSeqNo(t.notContentRelated||t.container),this.debug&&this.log(`updateSentMessage, old=${e}, new=${t.msg_id}`),this.sentMessages[t.msg_id]=t,delete this.sentMessages[e],t)}generateSeqNo(e){let t=2*this.seqNo;return e||(t++,this.seqNo++),t}wrapMtpCall(e,t,a){const s=new us({mtproto:!0});s.storeMethod(e,t);const n=this.timeManager.generateId(),i=this.generateSeqNo(),r={msg_id:n,seq_no:i,body:s.getBytes(!0)};return b.Z.debug&&this.log("MT call",e,t,n,i),this.pushMessage(r,a)}wrapMtpMessage(e,t){const a=new us({mtproto:!0});a.storeObject(e,"Object");const s=this.timeManager.generateId(),n=this.generateSeqNo(t.notContentRelated),i={msg_id:s,seq_no:n,body:a.getBytes(!0)};return b.Z.debug&&this.log("MT message",e,s,n),this.pushMessage(i,t)}wrapApiCall(e,t={},a={}){const s=new us(a);if(!this.connectionInited){const e=es.API.methods.find((e=>"invokeWithLayer"===e.method));if(!e)throw new Error("no invokeWithLayer!");s.storeInt(+e.id,"invokeWithLayer"),s.storeInt(es.layer,"layer");const t=es.API.methods.find((e=>"initConnection"===e.method));if(!t)throw new Error("no initConnection!");s.storeInt(+t.id,"initConnection"),s.storeInt(0,"flags"),s.storeInt(_.Z.id,"api_id"),s.storeString(i().USER_AGENT||"Unknown UserAgent","device_model"),s.storeString(navigator.platform||"Unknown Platform","system_version"),s.storeString(_.Z.version+(_.Z.isMainDomain?" "+_.Z.suffix:""),"app_version"),s.storeString(navigator.language||"en","system_lang_code"),s.storeString(_.Z.langPack,"lang_pack"),s.storeString(this.networkerFactory.language,"lang_code")}if(a.afterMessageId){if(void 0===Cs){const e=es.API.methods.find((e=>"invokeAfterMsg"===e.method));Cs=e?+e.id:0}Cs?(s.storeInt(Cs,"invokeAfterMsg"),s.storeLong(a.afterMessageId,"msg_id")):this.log.error("no invokeAfterMsg!")}a.resultType=s.storeMethod(e,t);const n={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(),body:s.getBytes(!0),isAPI:!0};return b.Z.debug?this.log("Api call",e,n,t,a):this.debug&&this.log("Api call",e,t,a),this.pushMessage(n,a)}changeTransport(e){const t=this.transport;t&&(t.destroy(),this.nextReqTimeout&&(clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0),this.connectionInited=!1,void 0!==this.longPollInterval&&(clearInterval(this.longPollInterval),this.longPollInterval=void 0),this.clearCheckConnectionTimeout()),this.log("change transport",e,t),this.clearPingDelayDisconnect(),this.transport=e,e&&(e.networker=this,e instanceof S&&(this.longPollInterval=E.Z.setInterval(this.checkLongPoll,1e4),this.checkLongPoll(),this.checkConnection("changed transport")),e.connection&&e.connected&&this.setConnectionStatus(U.Q.Connected),this.resend())}destroy(){this.log("destroy")}forceReconnectTimeout(){this.transport.reconnect?this.transport.reconnect():this.resend()}forceReconnect(){this.transport.forceReconnect?this.transport.forceReconnect():this.checkConnection("force reconnect")}clearPingDelayDisconnect(){const e=this.pingDelayDisconnectDeferred;this.pingDelayDisconnectDeferred=void 0,this.lastPingDelayDisconnectId=void 0,e&&e.reject()}sendLongPoll(){this.sendingLongPoll||(this.sendingLongPoll=!0,this.longPollPending=Date.now()+25e3,this.debug&&this.log.debug("sendLongPoll",this.longPollPending),this.wrapMtpCall("http_wait",{max_delay:500,wait_after:150,max_wait:25e3},{noResponse:!0,longPoll:!0}).then((()=>{this.longPollPending=void 0,setTimeout(this.checkLongPoll,0)}),(e=>{this.log("Long-poll failed",e)})).finally((()=>{this.sendingLongPoll=void 0})))}clearCheckConnectionTimeout(){void 0!==this.checkConnectionTimeout&&(clearTimeout(this.checkConnectionTimeout),this.checkConnectionTimeout=void 0)}toggleOffline(e){if(this.offline!==e)if(this.offline=e,this.clearCheckConnectionTimeout(),e){clearTimeout(this.nextReqTimeout),this.nextReqTimeout=0,this.nextReq=0,this.checkConnectionPeriod<1.5&&(this.checkConnectionPeriod=0);const e=1e3*this.checkConnectionPeriod|0;this.checkConnectionRetryAt=Date.now()+e,this.setConnectionStatus(U.Q.Closed,this.checkConnectionRetryAt),this.checkConnectionTimeout=E.Z.setTimeout((()=>this.checkConnection("from toggleOfline")),e),this.checkConnectionPeriod=Math.min(30,1.5*(1+this.checkConnectionPeriod))}else this.setConnectionStatus(U.Q.Connected),this.checkLongPoll(),this.scheduleRequest();this.setConnectionStatus(e?U.Q.Closed:U.Q.Connected,e?this.checkConnectionRetryAt:void 0)}handleSentEncryptedRequestHTTP(e,t,a){e.then((e=>(this.toggleOffline(!1),this.parseResponse(e).then((e=>(this.debug&&this.log.debug("Server response",e),this.processMessage(e.response,e.messageId,e.sessionId),this.checkLongPoll(),this.checkConnectionPeriod=Math.max(1.1,Math.sqrt(this.checkConnectionPeriod)),!0))))),(e=>(this.log.error("Encrypted request failed",e,t),this.pushResend(t.msg_id),this.toggleOffline(!0),!1))).then((e=>{const t=this.sentMessages;a.forEach((a=>{const s=t[a];if(s){const n=s.deferred;delete t[a],delete this.pendingMessages[a],e?n.resolve():n.reject()}}))}))}pushMessage(e,t){let a;return t.notContentRelated&&!t.noResponse||(a=(0,v.Z)()),this.sentMessages[e.msg_id]=Object.assign(e,t,a?{deferred:a}:void 0),this.pendingMessages[e.msg_id]=0,t.noSchedule||this.scheduleRequest(),(0,fe.Z)(t)&&(t.messageId=e.msg_id),a}attachPromise(e,t){const a=setTimeout((()=>{this.lastResponseTime&&Date.now()-this.lastResponseTime{clearTimeout(a),this.setConnectionStatus(U.Q.Connected),--this.activeRequests,this.setDrainTimeout()})),++this.activeRequests,void 0!==this.onDrainTimeout&&(clearTimeout(this.onDrainTimeout),this.onDrainTimeout=void 0)}setDrainTimeout(){!this.activeRequests&&this.onDrain&&void 0===this.onDrainTimeout&&(this.onDrainTimeout=E.Z.setTimeout((()=>{this.onDrainTimeout=void 0,this.log("drain"),this.onDrain()}),1e4))}setConnectionStatus(e,t){var a;const s=e===U.Q.Connected,n=this.status!==e;this.isOnline=s,this.status=e,n&&(this.networkerFactory.onConnectionStatusChange&&this.networkerFactory.onConnectionStatusChange({_:"networkerStatus",status:e,dcId:this.dcId,name:this.name,isFileNetworker:this.isFileNetworker,isFileDownload:this.isFileDownload,isFileUpload:this.isFileUpload,retryAt:t}),this.isOnline&&this.scheduleRequest(),(null===(a=this.transport)||void 0===a?void 0:a.connection)&&(this.clearPingDelayDisconnect(),this.sendPingDelayDisconnect()))}pushResend(e,t=100){const a=t?Date.now()+t:0,s=this.sentMessages[e];if(s.container)for(const e of s.inner)this.pendingMessages[e]=a;else this.pendingMessages[e]=a;s.acked&&this.log.error("pushResend: acked message?",s),this.debug&&this.log.debug("pushResend:",e,s,this.pendingMessages,t),this.scheduleRequest(t)}getMsgKey(e,t){return Ms(this,void 0,void 0,(function*(){const a=t?0:8,n=(0,_s.Z)(this.authKeyUint8.subarray(88+a,88+a+32),e),i=yield s.Z.invokeCrypto("sha256",n);return new Uint8Array(i).subarray(8,24)}))}getAesKeyIv(e,t){const a=t?0:8,n=new Uint8Array(52),i=new Uint8Array(52),r=[];return n.set(e,0),n.set(this.authKeyUint8.subarray(a,a+36),16),r.push(s.Z.invokeCrypto("sha256",n)),i.set(this.authKeyUint8.subarray(40+a,40+a+36),0),i.set(e,36),r.push(s.Z.invokeCrypto("sha256",i)),Promise.all(r).then((e=>{const t=new Uint8Array(32),a=new Uint8Array(32),s=new Uint8Array(e[0]),n=new Uint8Array(e[1]);return t.set(s.subarray(0,8)),t.set(n.subarray(8,24),8),t.set(s.subarray(24,32),24),a.set(n.subarray(0,8)),a.set(s.subarray(8,24),8),a.set(n.subarray(24,32),24),[t,a]}))}isStopped(){return this.networkerFactory.akStopped&&!this.isFileNetworker}performScheduledRequest(){if(this.isStopped())return!1;if(this.pendingAcks.length){const e=this.pendingAcks.slice();this.wrapMtpMessage({_:"msgs_ack",msg_ids:e},{notContentRelated:!0,noSchedule:!0})}const e=this.pendingResendReq.length;if(e){const t=Object.assign({},Ss),a=this.pendingResendReq.splice(0,e);this.wrapMtpMessage({_:"msg_resend_req",msg_ids:a},t),this.log("resend: resending requests",t.messageId,a)}let t;const a=[];let s=0,n=!1,i=!1,r=!1;const o=Object.keys(this.pendingMessages).map((e=>ns()(e))).sort(((e,t)=>e.compare(t))).map((e=>e.toString(10)));for(const e of o){const o=this.sentMessages[e];if(o&&o.body){const e=o.body.length+32;if(s+e>655360&&(this.log.warn("lengthOverflow",o,a),r=!0,t))break;a.push(o),s+=e,o.isAPI?n=!0:o.longPoll&&(i=!0),t=o}delete this.pendingMessages[e]}if(this.transport instanceof S&&n&&!i){const e=new us({mtproto:!0});e.storeMethod("http_wait",{max_delay:500,wait_after:150,max_wait:3e3}),a.push({msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(),body:e.getBytes(!0)})}if(!a.length)return;const p=a.filter((e=>e.noResponse)).map((e=>e.msg_id));if(a.length>1){const e=this.generateContainerMessage(s,a);t=e.messageWithBody,this.sentMessages[t.msg_id]=e.message}else this.sentMessages[t.msg_id]=t;this.pendingAcks=[];const d=this.sendEncryptedRequest(t);this.transport instanceof S&&this.handleSentEncryptedRequestHTTP(d,t,p),this.transport instanceof S||this.cleanupSent(),r&&this.scheduleRequest()}generateContainerMessage(e,t){const a=new us({mtproto:!0,startMaxLength:e+64});a.storeInt(1945237724,"CONTAINER[id]"),a.storeInt(t.length,"CONTAINER[count]");const s=[];t.forEach(((e,t)=>{s.push(e.msg_id),a.storeLong(e.msg_id,"CONTAINER["+t+"][msg_id]"),a.storeInt(e.seq_no,"CONTAINER["+t+"][seq_no]"),a.storeInt(e.body.length,"CONTAINER["+t+"][bytes]"),a.storeRawBytes(e.body,"CONTAINER["+t+"][body]")}));const n={msg_id:this.timeManager.generateId(),seq_no:this.generateSeqNo(!0),container:!0,inner:s};return b.Z.debug&&this.log.warn("Container",s,n.msg_id,n.seq_no),{message:n,messageWithBody:Object.assign({body:a.getBytes(!0)},n)}}getEncryptedMessage(e){return Ms(this,void 0,void 0,(function*(){const t=yield this.getMsgKey(e,!0),a=yield this.getAesKeyIv(t,!0);return{bytes:yield s.Z.invokeCrypto("aes-encrypt",e,a[0],a[1]),msgKey:t}}))}getDecryptedMessage(e,t){return this.getAesKeyIv(e,!1).then((e=>s.Z.invokeCrypto("aes-decrypt",t,e[0],e[1])))}getEncryptedOutput(e){const t=new us({startMaxLength:e.body.length+2048});t.storeIntBytes(this.serverSalt,64,"salt"),t.storeIntBytes(this.sessionId,64,"session_id"),t.storeLong(e.msg_id,"message_id"),t.storeInt(e.seq_no,"seq_no"),t.storeInt(e.body.length,"message_data_length"),t.storeRawBytes(e.body,"message_data");const a=t.getBuffer(),s=16-t.getOffset()%16+16*(1+(0,Te.d)(8)%5),n=w(new Uint8Array(s)),i=(0,_s.Z)(a,n);return this.getEncryptedMessage(i).then((e=>{const t=new us({startMaxLength:e.bytes.length+256});return t.storeIntBytes(this.authKeyId,64,"auth_key_id"),t.storeIntBytes(e.msgKey,128,"msg_key"),t.storeRawBytes(e.bytes,"encrypted_data"),t.getBytes(!0)}))}sendEncryptedRequest(e){return Ms(this,void 0,void 0,(function*(){const t=yield this.getEncryptedOutput(e);this.transport||this.log.error("trying to send something when offline",this.transport,this),this.debug&&this.log.debug("sending:",e,[e.msg_id].concat(e.inner||[]),t.length);const a=this.transport?this.transport.send(t):Promise.reject({});if(!(this.transport instanceof S))return a;const s={code:406,type:"NETWORK_BAD_RESPONSE",transport:this.transport};return a.then((e=>{if(!(null==e?void 0:e.byteLength))throw s;return e}),(e=>{throw e.message||e.type||(e=Object.assign(s,{type:"NETWORK_BAD_REQUEST",originalError:e})),e}))}))}parseResponse(e){this.lastResponseTime=Date.now();const t=new ys(e),a=t.fetchIntBytes(64,!0,"auth_key_id");if(!(0,Ps.Z)(a,this.authKeyId))throw new Error("[MT] Invalid server auth_key_id: "+T(a));const s=t.fetchIntBytes(128,!0,"msg_key"),n=t.fetchRawBytes(e.byteLength-t.getOffset(),!0,"encrypted_data");return this.getDecryptedMessage(s,n).then((e=>this.getMsgKey(e,!1).then((t=>{if(!(0,Ps.Z)(s,t))throw this.log.warn("[MT] msg_keys",s,t),this.updateSession(),new Error("[MT] server msgKey mismatch, updating session");let a=new ys(e,{mtproto:!0});a.fetchIntBytes(64,!0,"salt");const n=a.fetchIntBytes(64,!0,"session_id"),i=a.fetchLong("message_id");if(!((0,Ps.Z)(n,this.sessionId)||this.prevSessionId&&(0,Ps.Z)(n,this.prevSessionId)))throw this.log.warn("Sessions",n,this.sessionId,this.prevSessionId,e),new Error("[MT] Invalid server session_id: "+T(n));const r=a.fetchInt("seq_no"),o=e.byteLength,p=a.fetchInt("message_data[length]");let d=a.getOffset();if(p%4||p>o-d)throw new Error("[MT] Invalid body length: "+p);const f=a.fetchRawBytes(p,!0,"message_data");d=a.getOffset();const c=o-d;if(c<12||c>1024)throw new Error("[MT] Invalid padding length: "+c);return a=new ys(f,{mtproto:!0,override:{mt_message:(e,t)=>{e.msg_id=a.fetchLong(t+"[msg_id]"),e.seqno=a.fetchInt(t+"[seqno]"),e.bytes=a.fetchInt(t+"[bytes]");const s=a.getOffset();try{e.body=a.fetchObject("Object",t+"[body]")}catch(t){this.log.error("parse error",t.message,t.stack),e.body={_:"parse_error",error:t}}a.getOffset()!==s+e.bytes&&a.setOffset(s+e.bytes)},mt_rpc_result:(e,t)=>{e.req_msg_id=a.fetchLong(t+"[req_msg_id]");const s=this.sentMessages[e.req_msg_id],n=s&&s.resultType||"Object";e.req_msg_id&&!s||(e.result=a.fetchObject(n,t+"[result]"))}}}),{response:a.fetchObject("","INPUT"),messageId:i,sessionId:n,seqNo:r}}))))}applyServerSalt(e){const t=(a=e,vs((s=ns()(a),new Uint8Array(s.toArray(256).value)).reverse(),8,!0,!1,!1));var a,s;qa.Z.set({["dc"+this.dcId+"_server_salt"]:T(t)}),this.serverSalt=new Uint8Array(t)}scheduleRequest(e){this.transport instanceof S&&(this.offline&&this.checkConnection("forced schedule"),e||(e=0));const t=Date.now()+(e||0);if(this.nextReq&&(void 0===e||this.nextReq<=t))return;this.nextReqTimeout&&clearTimeout(this.nextReqTimeout);const a=()=>{this.nextReqTimeout=0,this.nextReq=0,this.transport instanceof S&&this.offline||this.performScheduledRequest()};this.nextReq=t,void 0!==e?this.nextReqTimeout=E.Z.setTimeout(a,e):a()}ackMessage(e){let t;this.pendingAcks.push(e),this.transport instanceof S&&(t=3e4),this.scheduleRequest(t)}reqResend(e){this.debug&&this.log.debug("Req resend",e),this.pendingResendReq.push(e),this.scheduleRequest(100)}cleanupSent(){let e=!1;const t=this.sentMessages;return Object.keys(t).forEach((a=>{const s=t[a];if(s.notContentRelated&&void 0===this.pendingMessages[a])delete t[a];else if(s.container){for(const a of s.inner)if(void 0!==t[a])return void(e=!0);delete t[a]}else e=!0})),!e}processMessageAck(e){const t=this.sentMessages[e];t&&!t.acked&&(t.acked=!0)}processError(e){const t=(e.error_message||"").match(/^([A-Z_0-9]+\b)(: (.+))?/)||[];return e.error_code=e.error_code,{code:!e.error_code||e.error_code<=0?500:e.error_code,type:t[1]||"UNKNOWN",description:t[3]||"CODE#"+e.error_code+" "+e.error_message,originalError:e}}resend(){const e=this.sentMessages;for(const t in e){const a=e[t];(a.body||a.container)&&this.pushResend(t)}this.transport.connection&&(this.clearPingDelayDisconnect(),this.sendPingDelayDisconnect())}applyServerTime(e){const t=ns()(e).shiftRight(32).toJSNumber();return this.log("applying server time",t),this.timeManager.applyServerTime(t)}processMessage(e,t,a){if("messageEmpty"!==e._)if(parseInt(t.substr(0,-10),10)%2)this.log.warn("Server even message id: ",t,e);else switch(this.debug&&this.log.debug("process message",e,t),this.pingDelayDisconnectDeferred&&this.pingDelayDisconnectDeferred.resolve("any message"),e._){case"msg_container":for(const t of e.messages)this.processMessage(t,t.msg_id,a);break;case"bad_server_salt":this.log("Bad server salt",e),this.applyServerSalt(e.new_server_salt),this.sentMessages[e.bad_msg_id]&&this.pushResend(e.bad_msg_id),this.ackMessage(t);break;case"bad_msg_notification":switch(this.log.error("Bad msg notification",e),e.error_code){case 16:case 17:case 32:case 33:case 64:{const a=this.applyServerTime(t);(17===e.error_code||a)&&(this.log("Update session"),this.updateSession());const s=this.updateSentMessage(e.bad_msg_id);s&&this.pushResend(s.msg_id)}}break;case"message":if(-1!==this.lastServerMessages.indexOf(t))return void this.ackMessage(t);this.lastServerMessages.push(t),this.lastServerMessages.length>100&&this.lastServerMessages.shift(),this.processMessage(e.body,e.msg_id,a);break;case"new_session_created":this.ackMessage(t),this.debug&&this.log.debug("new_session_created",e),this.processMessageAck(e.first_msg_id),this.applyServerSalt(e.server_salt),qa.Z.get("dc").then((t=>{t===this.dcId&&!this.isFileNetworker&&this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}));break;case"msgs_ack":this.debug&&this.log("got acks",e.msg_ids);for(const t of e.msg_ids)this.processMessageAck(t);break;case"msg_detailed_info":if(!this.sentMessages[e.msg_id]){this.ackMessage(e.answer_msg_id);break}case"msg_new_detailed_info":if(-1!==this.pendingAcks.indexOf(e.answer_msg_id))break;this.reqResend(e.answer_msg_id);break;case"msgs_state_info":{this.ackMessage(e.answer_msg_id);const t=[[this.lastResendReq,this.pendingResendReq]];for(const[a,s]of t)if((null==a?void 0:a.reqMsgId)===e.req_msg_id&&s.length)for(const e of a.msgIds){const t=s.indexOf(e);-1!==t&&s.splice(t,1)}break}case"rpc_result":{this.ackMessage(t);const a=e.req_msg_id,s=this.sentMessages[a];if(this.debug&&this.log("Rpc response",e.result,s),this.processMessageAck(a),s){const t=s.deferred;if("rpc_error"===e.result._){const a=this.processError(e.result);this.log("Rpc error",a),t&&t.reject(a)}else t&&t.resolve(e.result),s.isAPI&&!this.connectionInited&&(this.connectionInited=!0);delete this.sentMessages[a]}else this.debug&&this.log("Rpc result for unknown message:",a,e);break}case"pong":{const t=e.ping_id;if(this.lastPingDelayDisconnectId===t){const e=this.pingDelayDisconnectDeferred;e?e.resolve("pong"):this.log("ping deferred deleted",t)}break}default:this.ackMessage(t),null!==this.networkerFactory.updatesProcessor&&this.networkerFactory.updatesProcessor(e)}else this.log.warn("processMessage: messageEmpty",e,t)}}class As extends G{constructor(){super(...arguments),this.networkers=[],this.language=navigator.language||_.Z.langPackCode,this.updatesProcessor=null,this.akStopped=!1}onConnectionStatusChange(e){this.rootScope.dispatchEvent("connection_status_change",e)}removeNetworker(e){(0,M.Z)(this.networkers,e)}setUpdatesProcessor(e){this.updatesProcessor=e}getNetworker(e,t,a,s,n){const i=new ks(this,this.timeManager,e,t,a,s,n);return this.networkers.push(i),i}startAll(){if(this.akStopped){const e=this.networkers.filter((e=>e.isStopped()));this.akStopped=!1,this.updatesProcessor&&this.updatesProcessor({_:"new_session_created"});for(const t of e)t.scheduleRequest()}}stopAll(){this.akStopped=!0}setLanguage(e){this.language=e;for(const e of this.networkers)e.isFileNetworker||(e.connectionInited=!1)}unsetConnectionInited(){for(const e of this.networkers)e.connectionInited=!1}forceReconnectTimeout(){for(const e of this.networkers)e.forceReconnectTimeout()}forceReconnect(){for(const e of this.networkers)if(!e.isFileNetworker){e.forceReconnect();break}}}const Ds=new class{constructor(){this.testPublicKeysHex=[{modulus:"c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5",exponent:"010001"}],this.publisKeysHex=[{modulus:"e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3",exponent:"010001"}],this.publicKeysParsed={},this.prepared=!1,this.preparePromise=null,b.Z.test&&(this.publisKeysHex=this.testPublicKeysHex)}prepare(){return this.preparePromise?this.preparePromise:this.prepared?Promise.resolve():this.preparePromise=Promise.all(this.publisKeysHex.map((e=>{const t=new us;t.storeBytes((0,Ha.Z)(e.modulus),"n"),t.storeBytes((0,Ha.Z)(e.exponent),"e");const a=t.getBuffer();return s.Z.invokeCrypto("sha1",a).then((t=>{const a=t.slice(-8);a.reverse(),this.publicKeysParsed[T(a).toLowerCase()]={modulus:e.modulus,exponent:e.exponent}}))}))).then((()=>{this.prepared=!0,this.preparePromise=null}))}select(e){return t=this,a=void 0,n=function*(){yield this.prepare();for(let t=0;t{if(d.ZP&&this.log("mtpSendPlainRequest: in good sector",e),!e||!e.byteLength)throw o;try{const t=new ys(e,{mtproto:!0});if(4===e.length){const e=t.fetchInt();throw this.log.error("mtpSendPlainRequest: wrong response, error code:",e),e}const a=t.fetchLong("auth_key_id");"0"!==a&&this.log.error("auth_key_id !== 0",a);const s=t.fetchLong("msg_id");"0"===s&&this.log.error("msg_id === 0",s);const n=t.fetchInt("msg_len");return n||this.log.error("no msg_len",n),t}catch(e){throw this.log.error("mtpSendPlainRequest: deserialization went bad",e),Object.assign(o,{originalError:e})}}),(e=>{throw e.message||e.type||(e=Object.assign(o,{originalError:e})),e}))}sendReqPQ(e){return Ts(this,void 0,void 0,(function*(){const t=new us({mtproto:!0});let a;t.storeMethod("req_pq_multi",{nonce:e.nonce}),d.ZP&&this.log("Send req_pq",T(e.nonce));try{const s=this.sendPlainRequest(e.dcId,t.getBytes(!0));Ds.prepare(),a=yield s}catch(e){throw this.log.error("req_pq error",e.message),e}const n=a.fetchObject("ResPQ");if("resPQ"!==n._)throw new Error("[MT] resPQ response invalid: "+n._);if(!(0,Ps.Z)(e.nonce,n.nonce))throw this.log.error(e.nonce,n.nonce),new Error("[MT] resPQ nonce mismatch");e.serverNonce=n.server_nonce,e.pq=n.pq,e.fingerprints=n.server_public_key_fingerprints,d.ZP&&this.log("Got ResPQ",T(e.serverNonce),T(e.pq),e.fingerprints);const i=yield Ds.select(e.fingerprints);if(!i)throw new Error("[MT] No public key found");e.publicKey=i,d.ZP&&this.log("PQ factorization start",e.pq);try{var r=yield s.Z.invokeCrypto("factorize",e.pq)}catch(e){throw this.log.error("worker error factorize",e),e}return e.p=r[0],e.q=r[1],d.ZP&&this.log("PQ factorization done",r),this.sendReqDhParams(e)}))}sendReqDhParams(e){return Ts(this,void 0,void 0,(function*(){e.newNonce=w(new Uint8Array(32));const t={_:"p_q_inner_data_dc",pq:e.pq,p:e.p,q:e.q,nonce:e.nonce,server_nonce:e.serverNonce,new_nonce:e.newNonce,dc:0},a=new us({mtproto:!0});a.storeObject(t,"P_Q_inner_data","DECRYPTED_DATA");const n=a.getBytes(!0);if(n.length>144)throw"DH_params: data is more than 144 bytes!";const i=vs(n,192,!1,!0,!1),r=i.slice().reverse(),o=yield(()=>Ts(this,void 0,void 0,(function*(){for(;;){const t=w(new Uint8Array(32)),a=r.concat(yield s.Z.invokeCrypto("sha256",t.concat(i)));if(224!==a.length)throw"DH_params: dataWithHash !== 224 bytes!";const n=yield s.Z.invokeCrypto("aes-encrypt",a,t,new Uint8Array([0])),o=Us(t,yield s.Z.invokeCrypto("sha256",n)).concat(n),p=fs(o),d=ns()(e.publicKey.modulus,16);if(-1===p.compare(d))return o}})))(),p=vs(yield s.Z.invokeCrypto("rsa-encrypt",o,e.publicKey),256,!0,!0,!0),f={nonce:e.nonce,server_nonce:e.serverNonce,p:e.p,q:e.q,public_key_fingerprint:e.publicKey.fingerprint,encrypted_data:p},c=new us({mtproto:!0});c.storeMethod("req_DH_params",f);const l=c.getBytes(!0);let m;d.ZP&&this.log("Send req_DH_params",f);try{m=yield this.sendPlainRequest(e.dcId,l)}catch(e){throw this.log.error("Send req_DH_params FAIL!",e),e}const g=m.fetchObject("Server_DH_Params","RESPONSE");if(d.ZP&&this.log("Sent req_DH_params, response:",g),"server_DH_params_fail"!==g._&&"server_DH_params_ok"!==g._)throw new Error("[MT] Server_DH_Params response invalid: "+g._);if(!(0,Ps.Z)(e.nonce,g.nonce))throw new Error("[MT] Server_DH_Params nonce mismatch");if(!(0,Ps.Z)(e.serverNonce,g.server_nonce))throw new Error("[MT] Server_DH_Params server_nonce mismatch");if("server_DH_params_fail"===g._){const t=(yield s.Z.invokeCrypto("sha1",e.newNonce)).slice(-16);if(!(0,Ps.Z)(t,g.new_nonce_hash))throw new Error("[MT] server_DH_params_fail new_nonce_hash mismatch");throw new Error("[MT] server_DH_params_fail")}try{yield this.decryptServerDhDataAnswer(e,g.encrypted_answer)}catch(e){throw this.log.error("mtpDecryptServerDhDataAnswer FAILED!",e),e}return this.sendSetClientDhParams(e)}))}decryptServerDhDataAnswer(e,t){return Ts(this,void 0,void 0,(function*(){e.localTime=Date.now(),e.tmpAesKey=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat(e.serverNonce))).concat((yield s.Z.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(0,12)),e.tmpAesIv=(yield s.Z.invokeCrypto("sha1",e.serverNonce.concat(e.newNonce))).slice(12).concat(yield s.Z.invokeCrypto("sha1",e.newNonce.concat(e.newNonce)),e.newNonce.slice(0,4));const a=new Uint8Array(yield s.Z.invokeCrypto("aes-decrypt",t,e.tmpAesKey,e.tmpAesIv)),n=a.slice(0,20),i=a.slice(20),r=new ys(i,{mtproto:!0}),o=r.fetchObject("Server_DH_inner_data");if("server_DH_inner_data"!==o._)throw new Error("[MT] server_DH_inner_data response invalid: "+o);if(!(0,Ps.Z)(e.nonce,o.nonce))throw new Error("[MT] server_DH_inner_data nonce mismatch");if(!(0,Ps.Z)(e.serverNonce,o.server_nonce))throw new Error("[MT] server_DH_inner_data serverNonce mismatch");d.ZP&&this.log("Done decrypting answer"),e.g=o.g,e.dhPrime=o.dh_prime,e.gA=o.g_a,e.serverTime=o.server_time,e.retry=0,this.verifyDhParams(e.g,e.dhPrime,e.gA);const p=r.getOffset();if(!(0,Ps.Z)(n,yield s.Z.invokeCrypto("sha1",i.slice(0,p))))throw new Error("[MT] server_DH_inner_data SHA1 mismatch");this.timeManager.applyServerTime(e.serverTime,e.localTime)}))}verifyDhParams(e,t,a){d.ZP&&this.log("Verifying DH params",e,t,a);const s=T(t);if(3!==e||"c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b"!==s)throw new Error("[MT] DH params are not verified: unknown dhPrime");d.ZP&&this.log("dhPrime cmp OK");const n=fs(a),i=ns()(s,16);if(n.compare(ns().one)<=0)throw new Error("[MT] DH params are not verified: gA <= 1");if(n.compare(i.subtract(ns().one))>=0)throw new Error("[MT] DH params are not verified: gA >= dhPrime - 1");d.ZP&&this.log("1 < gA < dhPrime-1 OK");const r=ns()(2).pow(1984);if(n.compare(r)<0)throw new Error("[MT] DH params are not verified: gA < 2^{2048-64}");if(n.compare(i.subtract(r))>=0)throw new Error("[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}");return d.ZP&&this.log("2^{2048-64} < gA < dhPrime-2^{2048-64} OK"),!0}sendSetClientDhParams(e){return Ts(this,void 0,void 0,(function*(){const t=(0,Ha.Z)(e.g.toString(16));e.b=w(new Uint8Array(256));try{var a=yield s.Z.invokeCrypto("mod-pow",t,e.b,e.dhPrime)}catch(e){throw e}const n=new us({mtproto:!0});n.storeObject({_:"client_DH_inner_data",nonce:e.nonce,server_nonce:e.serverNonce,retry_id:[0,e.retry++],g_b:a},"Client_DH_Inner_Data");const i=(yield s.Z.invokeCrypto("sha1",n.getBuffer())).concat(n.getBytes(!0)),r=yield s.Z.invokeCrypto("aes-encrypt",i,e.tmpAesKey,e.tmpAesIv),o=new us({mtproto:!0});let p;o.storeMethod("set_client_DH_params",{nonce:e.nonce,server_nonce:e.serverNonce,encrypted_data:r}),d.ZP&&this.log("Send set_client_DH_params");try{p=yield this.sendPlainRequest(e.dcId,o.getBytes(!0))}catch(e){throw e}const f=p.fetchObject("Set_client_DH_params_answer");if("dh_gen_ok"!==f._&&"dh_gen_retry"!==f._&&"dh_gen_fail"!==f._)throw new Error("[MT] Set_client_DH_params_answer response invalid: "+f._);if(!(0,Ps.Z)(e.nonce,f.nonce))throw new Error("[MT] Set_client_DH_params_answer nonce mismatch");if(!(0,Ps.Z)(e.serverNonce,f.server_nonce))throw new Error("[MT] Set_client_DH_params_answer server_nonce mismatch");try{var c=yield s.Z.invokeCrypto("mod-pow",e.gA,e.b,e.dhPrime)}catch(e){throw c}const l=yield s.Z.invokeCrypto("sha1",c),m=l.slice(0,8),g=l.slice(-8);switch(d.ZP&&this.log("Got Set_client_DH_params_answer",f._,c),f._){case"dh_gen_ok":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([1],m))).slice(-16);if(!(0,Ps.Z)(t,f.new_nonce_hash1))throw this.log.error("Set_client_DH_params_answer new_nonce_hash1 mismatch",t,f),new Error("new_nonce_hash1 mismatch");const a=Us(e.newNonce.slice(0,8),e.serverNonce.slice(0,8));return d.ZP&&this.log("Auth successfull!",g,c,a),e.authKeyId=g,e.authKey=c,e.serverSalt=a,e}case"dh_gen_retry":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([2],m))).slice(-16);if(!(0,Ps.Z)(t,f.new_nonce_hash2))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch");return this.sendSetClientDhParams(e)}case"dh_gen_fail":{const t=(yield s.Z.invokeCrypto("sha1",e.newNonce.concat([3],m))).slice(-16);if(!(0,Ps.Z)(t,f.new_nonce_hash3))throw new Error("[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch");throw new Error("[MT] Set_client_DH_params_answer fail")}}}))}getTransportType(){return this.getTransportTypePromise?this.getTransportTypePromise:this.getTransportTypePromise=Z.pingTransports().then((({websocket:e})=>{this.transportType=e?"websocket":"https",this.log("will use transport:",this.transportType)}))}auth(e){let t=this.cached[e];return t||(t=new Promise(((t,a)=>Ts(this,void 0,void 0,(function*(){let s;yield this.getTransportType();let n=1;for(;n++<=3;)try{const a={dcId:e,nonce:w(new Uint8Array(16))},s=this.sendReqPQ(a);return void t(yield s)}catch(e){s=e}a(s)})))),this.cached[e]=t)}}class Fs extends G{after(){this.lastMessageId=[0,0],this.timeOffset=0,qa.Z.get("server_time_offset").then((e=>{e&&(this.timeOffset=e)}))}getServerTimeOffset(){return this.timeOffset}generateId(){const e=Date.now();let t=[Math.floor(e/1e3)+this.timeOffset,e%1e3<<21|(0,Te.d)(16)<<3|4];return(this.lastMessageId[0]>t[0]||this.lastMessageId[0]===t[0]&&this.lastMessageId[1]>=t[1])&&(t=[this.lastMessageId[0],this.lastMessageId[1]+4]),this.lastMessageId=t,rs(t[0],t[1]).toString(10)}applyServerTime(e,t){const a=e-(t=(t||Date.now())/1e3|0),s=Math.abs(this.timeOffset-a)>10;return this.lastMessageId=[0,0],this.timeOffset!==a&&(qa.Z.set({server_time_offset:a}),this.timeOffset=a),s}}class Rs{saveWebDocument(e){if(!e)return;const t=e.attributes.find((e=>"documentAttributeImageSize"===e._));return t&&(e.w=t.w,e.h=t.h),e}}class xs extends G{getInputInvoiceBySlug(e){return{_:"inputInvoiceSlug",slug:e}}getInputInvoiceByPeerId(e,t){return{_:"inputInvoiceMessage",peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}}getPaymentForm(e){return this.apiManager.invokeApi("payments.getPaymentForm",{invoice:e}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}getPaymentReceipt(e,t){return this.apiManager.invokeApi("payments.getPaymentReceipt",{peer:this.appPeersManager.getInputPeerById(e),msg_id:(0,oe.Z)(t)}).then((e=>(this.appUsersManager.saveApiUsers(e.users),e)))}validateRequestedInfo(e,t,a){return this.apiManager.invokeApi("payments.validateRequestedInfo",{save:a,invoice:e,info:t})}sendPaymentForm(e,t,a,s,n,i){return this.apiManager.invokeApi("payments.sendPaymentForm",{form_id:t,invoice:e,requested_info_id:a,shipping_option_id:s,credentials:n,tip_amount:i||void 0}).then((e=>("payments.paymentResult"===e._&&this.apiUpdatesManager.processUpdateMessage(e.updates),e)))}clearSavedInfo(e,t){return this.apiManager.invokeApi("payments.clearSavedInfo",{info:e,credentials:t})}}var Bs=a(8794);class Vs extends G{constructor(){super(...arguments),this.clear=(e=!1)=>{e?this.attachMenuBots=new Map:(this.attachMenuBots.clear(),this.attachMenuBotsArr=void 0)},this.onUpdateAttachMenuBots=e=>{this.clear(),this.getAttachMenuBots()}}after(){this.clear(!0),this.apiUpdatesManager.addMultipleEventsListeners({updateAttachMenuBots:this.onUpdateAttachMenuBots})}saveAttachMenuBot(e){this.attachMenuBots.set(e.bot_id,e);const t=(0,Bs.Z)(e);return t.icon=this.appDocsManager.saveDoc(t.icon,{type:"attachMenuBotIcon",botId:e.bot_id}),e}saveAttachMenuBots(e){e.saved||(e.saved=!0,e.forEach((e=>this.saveAttachMenuBot(e))))}getAttachMenuBots(){var e;return null!==(e=this.attachMenuBotsArr)&&void 0!==e?e:this.apiManager.invokeApiSingleProcess({method:"messages.getAttachMenuBots",processResult:e=>((0,ue.Z)(e),this.appUsersManager.saveApiUsers(e.users),this.saveAttachMenuBots(e.bots),this.attachMenuBotsArr=e.bots.slice(0,0))})}getAttachMenuBotCached(e){return this.attachMenuBots.get(e)}getAttachMenuBot(e,t){throw this.appUsersManager.isAttachMenuBot(e),(0,X.Z)("BOT_INVALID")}requestWebView(e){const{botId:t,peerId:a,url:s,fromBotMenu:n,themeParams:i,replyToMsgId:r,silent:o,sendAsPeerId:p,startParam:d,threadId:f}=e;return this.apiManager.invokeApiSingleProcess({method:"messages.requestWebView",params:{peer:this.appPeersManager.getInputPeerById(a),bot:this.appUsersManager.getUserInput(t),silent:o,platform:"web",url:s,reply_to_msg_id:r?(0,oe.Z)(r):void 0,from_bot_menu:n,theme_params:i,send_as:p?this.appPeersManager.getInputPeerById(p):void 0,start_param:d,top_msg_id:f?(0,oe.Z)(f):void 0},processResult:e=>(console.log(e),e)})}prolongWebView(e){return this.apiManager.invokeApiSingleProcess({method:"messages.prolongWebView",params:{peer:this.appPeersManager.getInputPeerById(e.peerId),bot:this.appUsersManager.getUserInput(e.botId),query_id:e.queryId,silent:e.silent,reply_to_msg_id:e.replyToMsgId?(0,oe.Z)(e.replyToMsgId):void 0,send_as:e.sendAsPeerId?this.appPeersManager.getInputPeerById(e.sendAsPeerId):void 0,top_msg_id:e.threadId?(0,oe.Z)(e.threadId):void 0},processResult:e=>{console.log(e)}})}}class Os extends G{requestUrlAuth(e,t,a,s){return this.apiManager.invokeApi("messages.requestUrlAuth",{button_id:s,msg_id:a?(0,oe.Z)(a):void 0,peer:t?this.appPeersManager.getInputPeerById(t):void 0,url:e}).then((e=>("urlAuthResultRequest"===e._&&this.appUsersManager.saveApiUser(e.bot),e)))}acceptUrlAuth(e,t,a,s,n){return this.apiManager.invokeApi("messages.acceptUrlAuth",{button_id:s,msg_id:a?(0,oe.Z)(a):void 0,peer:t?this.appPeersManager.getInputPeerById(t):void 0,url:e,write_allowed:n}).then((e=>e))}getWebAuthorizations(){return this.apiManager.invokeApi("account.getWebAuthorizations").then((e=>(this.appUsersManager.saveApiUsers(e.users),e.authorizations)))}resetWebAuthorization(e){return this.apiManager.invokeApi("account.resetWebAuthorization",{hash:e})}resetWebAuthorizations(){return this.apiManager.invokeApi("account.resetWebAuthorizations")}}const Ls=new class{constructor(){this.cryptoWorkersURLs=[],this.cryptoPortsAttached=0,this.cryptoPortPromise=(0,v.Z)(),this.cryptoPortPromise.then((()=>{this.cryptoPortPromise=void 0}))}start(){const e=f.Z.getInstance();e.addEventListener("manager",(({name:e,method:t,args:a})=>(0,q.Z)(this.getManagers(),(s=>{const n=s[e];return n[t].apply(n,a)})))),e.addEventListener("cryptoPort",((e,t,a)=>{var n;const i=a.ports[0];this.cryptoPortsAttached>=this.cryptoWorkersURLs.length?i.close():(++this.cryptoPortsAttached,s.Z.attachPort(i),null===(n=this.cryptoPortPromise)||void 0===n||n.resolve())})),e.addEventListener("createProxyWorkerURLs",(({originalUrl:e,blob:t})=>{let a=this.cryptoWorkersURLs.length;a||(this.cryptoWorkersURLs.push(e),++a);const s=_.Z.cryptoWorkers;if(a===s)return this.cryptoWorkersURLs;const n=new Array(s-a).fill(void 0).map((()=>URL.createObjectURL(t)));return this.cryptoWorkersURLs.push(...n),this.cryptoWorkersURLs}))}createManagers(){return e=this,t=void 0,n=function*(){const e=new $;yield Promise.all([e.loadStorages(),this.cryptoPortPromise]);const t=yield function(e,t){const a={appPeersManager:new fa,appChatsManager:new Be,appDocsManager:new ut,appPhotosManager:new ca,appPollsManager:new la,appUsersManager:new Aa,appWebPagesManager:new Ua,appDraftsManager:new _t,appProfileManager:new ua,appNotificationsManager:new na,apiUpdatesManager:new De,appAvatarsManager:new Ue,appGroupCallsManager:new St,appCallsManager:new Fe,appReactionsManager:new ba,appMessagesManager:new ta,appMessagesIdsManager:new Tt,appPrivacyManager:new ma,appInlineBotsManager:new Dt,appStickersManager:new Ca,referenceDatabase:new ee,appEmojiManager:new Mt,filtersStorage:new Ce,dialogsStorage:new _e,apiManager:new Ja,cryptoWorker:s.Z,passwordManager:new Q,apiFileManager:new ja,peersStorage:new Qa,thumbsStorage:new Xa,networkerFactory:new As,rootScope:new l,authorizer:new Es,dcConfigurator:new O,timeManager:new Fs,appStoragesManager:e,appStateManager:y,appWebDocsManager:new Rs,appPaymentsManager:new xs,appAttachMenuBotsManager:new Vs,appSeamlessLoginManager:new Os};for(const e in a){const t=a[e];t&&(t.setManagers&&(t.setManagers(a),delete t.setManagers),E.Z[e]=t)}const n=[];let i=Object.keys(a);i.unshift("appUsersManager","appChatsManager","appNotificationsManager","appMessagesManager","dialogsStorage"),i=(0,we.Z)(i);for(const e of i){const t=a[e];if(null==t?void 0:t.after){const e=t.after();n.push(e)}}return t&&a.apiManager.setUserAuth(t),Promise.all(n).then((()=>a))}(e,y.userId);return this.managers=t},new((a=void 0)||(a=Promise))((function(s,i){function r(e){try{p(n.next(e))}catch(e){i(e)}}function o(e){try{p(n.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?s(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(r,o)}p((n=n.apply(e,t||[])).next())}));var e,t,a,n}getManagers(){var e;return null!==(e=this.managers)&&void 0!==e?e:this.managers=this.createManagers()}};d.GO&&(d.GO.appManagersManager=Ls);const Ns=Ls;var Zs=a(3655);let js,qs,Gs=!0;function Hs(){return Gs}function Ws(){return Gs?js:void 0}const zs=(0,I.kg)("MTPROTO"),Ks=new f.Z;Ks.addMultipleEventsListeners({environment:e=>{r(e),Z.waitForWebSocket()},crypto:({method:e,args:t})=>s.Z.invokeCrypto(e,...t),state:({state:e,resetStorages:t,pushedKeys:a,newVersion:s,oldVersion:n,userId:i})=>{zs("got state",e,a),y.userId=i,y.newVersion=s,y.oldVersion=n,Object.keys(e).forEach((t=>{y.pushToState(t,e[t],!0,!a.includes(t))})),j.resolve(t)},toggleStorages:({enabled:e,clearWrite:t})=>(0,za.Z)(e,t),event:(e,t)=>{zs("will redirect event",e,t),Ks.invokeExceptSource("event",e,t)},serviceWorkerOnline:e=>{Gs=e},serviceWorkerPort:(e,t,a)=>{js?(js.detachPort(qs),qs=void 0):(js=new Zs.Z,js.addMultipleEventsListeners({requestFilePart:e=>(0,q.Z)(Ns.getManagers(),(t=>{const{docId:a,dcId:s,offset:n,limit:i}=e;return t.appDocsManager.requestDocPart(a,s,n,i)}))})),(qs=a.ports[0])&&js.attachPort(qs)},createObjectURL:e=>URL.createObjectURL(e)}),zs("MTProto start"),Ns.start(),Ns.getManagers(),Gt.start(),function(e,t,a){const s=(a,s)=>{e.attachListenPort(a),s&&e.attachSendPort(s),null==t||t(a)};e.setOnPortDisconnect((e=>{Gt.deleteTab(e)})),"undefined"!=typeof SharedWorkerGlobalScope?E.Z.addEventListener("connect",(e=>s(e.source,e.source))):"undefined"!=typeof ServiceWorkerGlobalScope?s(E.Z,null):s(E.Z,E.Z)}(Ks,(e=>{Gt.addTab(e)}))},1507:(e,t,a)=>{a.d(t,{BP:()=>f,BX:()=>l,DZ:()=>h,Gu:()=>u,IA:()=>i,Iw:()=>p,J$:()=>m,NM:()=>s,Ox:()=>c,Pt:()=>d,Zi:()=>g,hj:()=>n,rU:()=>o,yF:()=>r});const s=0,n=1271266957,i=777,r=777e3,o=2147483647,p=20971520,d="",f="default_static",c=4295032831,l=new Set(["web","k","z"]),m=0,g=1,h=new Set([m,g]),u=Math.max(...Array.from(h))+1},2423:(e,t,a)=>{a.d(t,{$2:()=>l,E:()=>m,QB:()=>g,SC:()=>h,bu:()=>d,it:()=>p,kO:()=>y,tY:()=>u});var s=a(1229);const n="a-z\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff\\u0400-\\u04ff\\u0500-\\u0527\\u2de0-\\u2dff\\ua640-\\ua69f\\u0591-\\u05bf\\u05c1-\\u05c2\\u05c4-\\u05c5\\u05c7\\u05d0-\\u05ea\\u05f0-\\u05f4\\ufb1d-\\ufb28\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4f\\u0610-\\u061a\\u0620-\\u065f\\u066e-\\u06d3\\u06d5-\\u06dc\\u06de-\\u06e8\\u06ea-\\u06ef\\u06fa-\\u06fc\\u06ff\\u0750-\\u077f\\u08a0\\u08a2-\\u08ac\\u08e4-\\u08fe\\ufb50-\\ufbb1\\ufbd3-\\ufd3d\\ufd50-\\ufd8f\\ufd92-\\ufdc7\\ufdf0-\\ufdfb\\ufe70-\\ufe74\\ufe76-\\ufefc\\u200c\\u0e01-\\u0e3a\\u0e40-\\u0e4e\\u1100-\\u11ff\\u3130-\\u3185\\uA960-\\uA97F\\uAC00-\\uD7AF\\uD7B0-\\uD7FF\\u3003\\u3005\\u303b\\uff21-\\uff3a\\uff41-\\uff5a\\uff66-\\uff9f\\uffa1-\\uffdc",i="0-9_"+n,r="["+n+"0-9]",o="((?:https?|ftp)://|mailto:)?",p=o+"(?:"+r+"{1,64}(?::"+r+"{0,64})?@)?(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}|"+r+"["+n+"·0-9-]{0,64}(?:\\."+r+"["+n+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+n+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",d=(new RegExp("^"+o.slice(0,-1),"i"),/^((?:[^\/]+?):\/\/|mailto:)/),f="[a-zA-Z\\d_]{5,32}",c="\\/([a-zA-Z\\d_]{1,32})(?:@("+f+"))?(\\b|$)",l=new RegExp("(^| )(@)("+f+")|("+p+")|(\\n)|("+s.Z+")|(^|[\\s\\(\\]])(#["+i+"]{2,64})|(^|\\s)"+c,"i"),m=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,g=/(^|\s|\n)(````?)([\s\S]+?)(````?)([\s\n\.,:?!;]|$)|(^|\s|\x01)(`|~~|\*\*|__|_-_|\|\|)([^\n]+?)\7([\x01\s\.,:?!;]|$)|@(\d+)\s*\((.+?)\)|(\[(.+?)\]\((.+?)\))/m,h={"`":"messageEntityCode","``":"messageEntityPre","**":"messageEntityBold",__:"messageEntityItalic","~~":"messageEntityStrike","_-_":"messageEntityUnderline","||":"messageEntitySpoiler"},u=new Set(["messageEntityEmoji","messageEntityLinebreak","messageEntityCaret"]);for(const e in h)u.add(h[e]);const y=/^\+\d+$/},671:(e,t,a)=>{function s(e){return function(e){const t=[];let a=0,s=0,n=0;for(;n55296&&a<=56319?s=a:t.push(a.toString(16));return t.length&&2===t[0].length&&(t[0]="00"+t[0]),t}(r(e)).join("-")}a.d(t,{N0:()=>s});const n=/\uFE0F/g,i=String.fromCharCode(8205),r=e=>e.indexOf(i)<0?e.replace(n,""):e;new Map([["FT","🏴‍☠"]])}},s={};function n(e){var t=s[e];if(void 0!==t)return t.exports;var i=s[e]={id:e,loaded:!1,exports:{}};return a[e].call(i.exports,i,i.exports,n),i.loaded=!0,i.exports}n.m=a,n.x=()=>{var e=n.O(void 0,[699,211,539,85,946],(()=>n(6225)));return n.O(e)},e=[],n.O=(t,a,s,i)=>{if(!a){var r=1/0;for(f=0;f=i)&&Object.keys(n.O).every((e=>n.O[e](a[p])))?a.splice(p--,1):(o=!1,i0&&e[f-1][2]>i;f--)e[f]=e[f-1];e[f]=[a,s,i]},n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var a in t)n.o(t,a)&&!n.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce(((t,a)=>(n.f[a](e,t),t)),[])),n.u=e=>85===e?"85.952a9f12a6b3dcdd3f0e.bundle.js":946===e?"946.03f0ef26aad0c7635d9b.bundle.js":({211:"npm.big-integer",699:"npm.pako"}[e]||e)+"."+{8:"570e6da51a125009c156",104:"91dd6279f1f693880508",211:"780c206f3e1257ccad6a",301:"42dc636f96a62f6a08c8",539:"17a0b07b4e6476f19654",642:"fd1ade69544ad78671c6",699:"85f88e27b023cbb2ca51"}[e]+".chunk.js",n.miniCssF=e=>{},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),(()=>{var e;n.g.importScripts&&(e=n.g.location+"");var t=n.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var a=t.getElementsByTagName("script");a.length&&(e=a[a.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=e})(),(()=>{if(void 0!==n){var e=n.u,t=n.e,a={},s={};n.u=function(t){return e(t)+(a.hasOwnProperty(t)?"?"+a[t]:"")},n.e=function(i){return t(i).catch((function(t){var r=s.hasOwnProperty(i)?s[i]:999999;if(r<1){var o=e(i);throw t.message="Loading chunk "+i+" failed after 999999 retries.\n("+o+")",t.request=o,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();a[i]=t,s[i]=r-1,e(n.e(i))}),3e3)}))}))}}})(),(()=>{var e={678:1};n.f.i=(t,a)=>{e[t]||importScripts(n.p+n.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],a=t.push.bind(t);t.push=t=>{var[s,i,r]=t;for(var o in i)n.o(i,o)&&(n.m[o]=i[o]);for(r&&r(n);s.length;)e[s.pop()]=1;a(t)}})(),t=n.x,n.x=()=>Promise.all([699,211,539,85,946].map(n.e,n)).then(t),n.x()})(); -//# sourceMappingURL=mtproto.worker.e39165afafd615d2ebc1.chunk.js.map \ No newline at end of file diff --git a/public/mtproto.worker.e39165afafd615d2ebc1.chunk.js.map b/public/mtproto.worker.e39165afafd615d2ebc1.chunk.js.map deleted file mode 100644 index fa91e14da..000000000 --- a/public/mtproto.worker.e39165afafd615d2ebc1.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"mtproto.worker.e39165afafd615d2ebc1.chunk.js","mappings":"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Ac,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,cAAc,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,MAAO,kBAAkB,MAAO,QAAQ,MAAO,kBAAkB,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,4CAA4C,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,QAAQ,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,8BAA8B,KAAM,yCAAyC,KAAM,yCAAyC,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,6BAA6B,KAAM,6BAA6B,KAAM,wCAAwC,KAAM,wCAAwC,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,GAAI,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,mBAAmB,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,GAAI,QAAQ,IAAK,QAAQ,IAAK,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,IAAK,QAAQ,KAAM,QAAQ,IAAK,QAAQ,IAAK,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,IAAK,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,8BAA8B,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,mBAAmB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,kBAAkB,KAAM,kBAAkB,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,MAAO,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,QAAQ,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,IAAK,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,iBAAiB,KAAM,iBAAiB,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,kBAAkB,KAAM,kBAAkB,KAAM,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,MAAO,OAAO,KAAM,OAAO,MAAO,OAAO,MAAO,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,oDAAoD,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,yCAAyC,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,0CAA0C,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,yBAAyB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,wBAAwB,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,cAAc,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,uBAAuB,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,EAAG,aAAa,IAEp35EC,EAAmCD,EAAc,IACvD,IAAI,MAAME,KAAWF,EAChBE,GACDC,OAAOC,OAAOH,EAAOD,EAAcE,IAIvC,S,yECTO,MAAMG,EAAaC,UAAYA,UAAUC,UAAY,KAU/CC,GATWF,UAAUC,UAAUE,OAAO,yBACzBH,UAAUC,UAAUG,cAAcC,QAAQ,WACzC,SAASC,KAAKN,UAAUC,YAAc,aAAaK,KAAKN,UAAUO,SAG7D,mBAAmBD,KAAKN,UAAUQ,WACxC,aAAvBR,UAAUQ,UAA2BR,UAAUS,eAAiB,IAC/D,gBAEwB,oBAAuBV,KAAe,yBAAyBO,KAAKP,IAAkBA,EAAWW,MAAM,YAAcX,EAAWW,MAAM,aACrJC,EAAaX,UAAUC,UAAUG,cAAcC,QAAQ,YAAc,EAIbL,UAAUS,eAAiB,GAAKT,UAAUC,UAAUE,OAAO,iH,yDCVzH,MAAMS,EAAa,4CACpBC,EAAS,YAETC,EAA6B,CACjC,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,EAAK,IACL,IAAK,KAqBQ,SAASC,EAAgBC,EAAcC,GAAW,GAC/D,OAAOC,EAAkBF,EAAM,CAC7BG,eAAe,EACfF,WACAG,YAAY,GAEhB,CASO,SAASF,EAAkBF,EAAcK,EAAoC,CAAC,GACnF,MAAMC,EAASD,EAAQE,YAAiC,MAAnBP,EAAKQ,OAAO,GAC3CC,EAAeT,EAMrB,OALGK,EAAQF,gBAAeH,EApCrB,SAA8BA,GACnC,OAAOA,EAAKU,QAAQd,EAAY,IAAIc,QAAQb,EAAQ,GACtD,CAkCmCc,CAAqBX,IACnDK,EAAQJ,WAAUD,EA1BhB,SAAwBA,GAC7B,OAAOA,EAAKU,QAAQ,iBAAkBE,IACpC,MAAMC,EAAa,IAAYD,GAC/B,OAAOC,QAAAA,EAAcD,CAAE,GAE3B,CAqB8BE,CAAed,IACxCK,EAAQD,aAAYJ,EAAOA,EAAKZ,eAChCkB,IAAQN,EAAO,IAAMA,GACrBK,EAAQJ,WAAUD,GAAQ,IApCxB,SAAqBA,GAC1B,OAAOA,EAAKZ,cAAcsB,QAAQ,YAAaE,IAC7C,MAAMC,EAAaf,EAAIc,GACvB,OAAOC,QAAAA,EAAcD,CAAE,GAE3B,CA+BwCG,CAAYN,IAC3CT,CACT,C,0CCrFA,MAAMgB,EAAkB,IAEjB,SAASC,EAAsBC,EAAoDb,GAIxF,MACMc,EADW,MACaC,OAAS,IAAM,GAE7C,IAAIC,EACJ,OAAOH,EAASI,GACd,IAAK,yBACHD,EAAM,CAAC,QANM,GAMY,GAAIH,EAASK,GAAIL,EAASM,YAAYC,OAAOC,SAASC,KAAKX,GACpF,MAGF,IAAK,4BACHK,EAAM,CAAC,WAXM,GAWe,GAAIH,EAASK,GAAIL,EAASM,YAAYC,OAAOC,SAASC,KAAKX,GACvF,MAGF,IAAK,6BACHK,EAAM,CAAC,YAAaH,EAASU,SAAUV,EAASW,OAAOC,IAAM,MAAQ,SAASH,KAAKX,GACnF,MAEF,IAAK,uBAKHK,EAAM,CAAC,kBAJKH,EAASa,WAAiDR,IACnEL,EAASa,WAAwDC,YACjEd,EAASa,WAAmDE,UAC7Df,EAASa,WAAWT,EACQJ,EAASgB,eAAeP,KAAKX,GAC3D,MAGF,IAAK,oBACHK,EAAMH,EAASiB,UAAY,IAAMjB,EAASkB,SAC1C,MAGF,IAAK,uBACHf,EAAM,CAAC,UAAWH,EAASmB,KAAKV,KAAKX,GACrC,MAGF,QACEsB,QAAQC,MAAM,yBAA0BrB,GACxCG,EAAM,GAKV,OAAOA,IAAOhB,aAAO,EAAPA,EAASmC,YAAa,YAAc,KAAOrB,EAAM,IAAMA,EAAMA,EAC7E,CAGO,SAASsB,EAAWC,EAAmBrC,GAM5C,OAAmBqC,EAAO,IAHVC,mBAAmBC,KAAKC,UAAUxC,GAIpD,C,mDCrEA,MAAMyC,EAAY,IAAIC,IAAI,CACxB,MACA,MACA,SAGIC,EAAS,IAAID,IAEZ,SAASE,EAAqBC,GAEnC,OAAOA,EAAQC,MAAMC,GAAWN,EAAUO,IAAID,EAAO5D,YAAcwD,EAAOK,IAAID,EAAOA,SACvF,CAEO,SAASE,EAAaJ,GAC3B,QAASD,EAAqBC,EAChC,CAEO,SAASK,EAAyBL,GACvCF,EAAOQ,QACPN,EAAQO,SAASL,IACfJ,EAAOU,IAAIN,EAAO,GAEtB,C,0DCpBe,SAASO,EAAUC,GAChC,QAAcC,IAAXD,GAA0BA,EAAkBE,UAAYF,EAAkBE,WAAqB,OAAOF,EAGpG,IAAG,OAASA,GAAS,CACxB,MAAMG,EAAUH,EAAyBI,QACzC,QAAcH,IAAXE,EACD,OAAOA,EAAOE,UAAS,GAGzB,MAAMC,EAAUN,EAA4BO,YAAeP,EAAyBQ,QACpF,YAAcP,IAAXK,EACMA,EAAOD,UAAS,GAGlB,I,CAEF,IAAIL,EAAQ,OAAO,KAE1B,MAAMS,EAA0C,MAAhCT,EAAkBpD,OAAO,GACnC8D,EAAcV,EAAkBW,OAAO,GAAGC,MAAM,KAEtD,OAAOH,EAASC,EAAW,GAAGL,YAAcK,EAAW,IAAM,IAAIL,UAAS,EAC5E,C,sFCaO,MAAMQ,EAUXC,YAAYC,IACV,OAAWC,KAAMD,GAEd,WACDC,KAAKC,MAAQ,SAGfD,KAAKE,oBAAqB,EAC1BF,KAAKG,KAAM,QAAO,CAAC,MAAOJ,EAAGE,MAAMlD,KAAK,MACxCiD,KAAKG,IAAI,eAETH,KAAKI,cAAa,GAElBP,EAAIQ,UAAUC,KAAKN,KACrB,CAEOO,cACL,OAAOP,KAAKE,kBACd,CAEOE,aAAaI,GAAY,GAC9B,GAAGR,KAAKS,gBAAkBD,EACxB,OAAOR,KAAKS,cAGd,MAAMC,EAAgB,CAACC,EAAoBC,K,MACzC,MAAMC,EAAaC,MAAMC,KAAKJ,EAAGE,YACjC,IAAI,MAAMG,KAAaH,EACrBF,EAAGM,YAAYD,GAGjB,GAAiB,QAAb,EAAAJ,EAAMM,eAAO,eAAE1E,OAInB,IAAI,MAAM2E,KAASP,EAAMM,QACpBP,EAAGE,WAAWO,SAASD,EAAMH,YAIhCL,EAAGU,YAAYF,EAAMH,UAAWG,EAAMG,QAASH,EAAMI,iB,EASzD,IACE,IAAIC,EAAUC,UAAUC,KAAK1B,KAAKC,KAAMD,KAAKhG,SAE7C,IAAIwH,EACF,OAAOG,QAAQC,Q,CAEjB,MAAMjE,GAGN,OAFAqC,KAAKG,IAAIxC,MAAM,mBAAqBA,EAAgBkE,SACpD7B,KAAKE,oBAAqB,EACnByB,QAAQC,OAAOjE,E,CAGxB,IAAImE,GAAW,EAOf,OANAC,YAAW,KACLD,GACFN,EAAQQ,SAAQ,OAAU,sB,GAE3B,KAEIhC,KAAKS,cAAgB,IAAIkB,SAAqB,CAACM,EAASL,KAC7DJ,EAAQU,UAAaC,IACnBL,GAAW,EACX,MAAM/B,EAAKyB,EAAQY,OACnB,IAAIC,GAAY,EAEhBrC,KAAKG,IAAI,UAETJ,EAAGiC,QAAWrE,IACZqC,KAAKE,oBAAqB,EAC1BF,KAAKG,IAAIxC,MAAM,8CAA+CA,GAC9DiE,EAAOjE,EAAM,EAGfoC,EAAGuC,QAAWC,IACZvC,KAAKG,IAAIxC,MAAM,UAAW4E,IACzBF,GAAarC,KAAKI,cAAc,EAGnCL,EAAGyC,QAAWD,IACZvC,KAAKG,IAAIxC,MAAM,SAAU4E,GACzB,MAAME,EAAcF,EAAEG,OAEtB1C,KAAKI,aAAaiC,GAAY,GAE3BI,EAAYT,SACbS,EAAYT,QAAQO,GAGtBxC,EAAG4C,OAAO,EAGZ5C,EAAG6C,gBAAmBL,IACpBvC,KAAKG,IAAIxC,MAAM,wBAAwB,EAGzCsE,EAAQjC,KAAKD,GAAKA,EAAG,EAGvByB,EAAQQ,QAAWG,IACjBL,GAAW,EACX9B,KAAKE,oBAAqB,EAC1BF,KAAKG,IAAIxC,MAAM,8CAA+CwE,GAC9DP,EAAOO,EAAM,EAGfX,EAAQqB,gBAAmBV,IACzBL,GAAW,EACX9B,KAAKG,IAAI2C,KAAK,8BAA+BX,EAAMY,WAAY,KAAMZ,EAAMa,YAE3E,MAAMN,EAASP,EAAMO,OACf3C,EAAK2C,EAAON,OAClBpC,KAAKiD,OAAOpE,SAAS+B,IAOnB,GAAIb,EAAGmD,iBAAiB9B,SAASR,EAAMX,MAEhC,CACL,MACMU,EADM+B,EAAOD,YACJU,YAAYvC,EAAMX,MACjCS,EAAcC,EAAIC,E,KAxFA,EAACb,EAAiBa,KAC1C,MAAMD,EAAKZ,EAAGqD,kBAAkBxC,EAAMX,MACtCS,EAAcC,EAAIC,EAAM,EAkFlBwC,CAAkBrD,EAAIa,E,GAMxB,CACH,GAEL,CAEOyC,cAAuCtD,G,MAC5C,OAAmE,QAA5D,EAAAC,KAAKK,UAAU9B,MAAM+E,GAAaA,EAASrD,OAASF,EAAGE,cAAK,QAAI,IAAIJ,EAAIE,EACjF,CAEOsD,sBAAsBE,GAC3BvD,KAAKK,UAAUxB,SAAS2E,IACtB,GAAGD,GAAYA,IAAaC,EAC1B,OAGF,MAAMzD,EAAKyD,EAAQzD,GAChBA,IACDA,EAAGuC,QAAU,OACbvC,EAAG4C,Q,GAGT,EApKe,EAAAtC,UAAmB,GAuKrB,MAAMoD,EAKnB3D,YAAYC,EAAO2D,GACjB1D,KAAK0D,UAAYA,EACjB1D,KAAKG,KAAM,QAAO,CAAC,MAAOJ,EAAGE,KAAMyD,GAAW3G,KAAK,MACnDiD,KAAK2D,IAAM9D,EAAI+D,OAAO7D,EACxB,CAoCO8D,OAAOC,EAA8BJ,GAM1C,OAJI5C,MAAMiD,QAAQD,KAChBA,EAAY,GAAGE,OAAOF,IAGjB9D,KAAKiE,eAAe,aAAcd,GAC/BW,EAAuBI,KAAKJ,GAAcX,EAAYU,OAAOC,MACxB,GAAIJ,EACrD,CAEO9E,MAAM8E,GACX,OAAO1D,KAAKiE,eAAe,aAAcd,GAAgBA,EAAYvE,SAA2B,GAAI8E,EACtG,CAEOS,KAAKL,EAA8BM,EAAoBV,GAiB5D,OALI5C,MAAMiD,QAAQD,KAChBA,EAAY,GAAGE,OAAOF,GACtBM,EAAQ,GAAGJ,OAAOI,IAGbpE,KAAKiE,eAAe,aAAcd,GAC/BW,EAAuBI,KAAI,CAACJ,EAAWO,IAAQlB,EAAYmB,IAAIF,EAAMC,GAAMP,MACxC,GAAIJ,EACnD,CA6EOa,IAAOT,EAA8BJ,GAO1C,OAJI5C,MAAMiD,QAAQD,KAChBA,EAAY,GAAGE,OAAOF,IAGpBA,EAAUtH,OAIPwD,KAAKiE,eAAkB,YAAad,GACjCW,EAAuBI,KAAKJ,GAAcX,EAAYoB,IAAIT,MACxB,GAAIJ,GALvC/B,QAAQM,QAAQ,GAM3B,CAEQgC,eACNO,EACAC,EACAtE,EACAuD,EAAY1D,KAAK0D,WAEjB,IAAIgB,EAOJ,OALGvE,IACDuE,EAAOC,YAAYC,MACnB5E,KAAKG,IAAIA,EAAM,YAGVH,KAAK2D,IAAIvD,eAAeyE,MAAM9E,GAC5B,IAAI4B,SAAW,CAACM,EAASL,KAK9B,MAAMa,EAAc1C,EAAG0C,YAAY,CAACiB,GAAYc,GAE1CM,EAAU,KACdC,aAAaC,GACbpD,EAAOa,EAAY9E,MAAM,EAIrBsH,EAAa,KACjBF,aAAaC,GAEV7E,GACDH,KAAKG,IAAIA,EAAM,QAASwE,YAAYC,MAAQF,GAQ9C,MAAMQ,EAAUC,EAASjB,KAAKkB,GAAMA,EAAEhD,SACtCH,EAAQ8B,EAAUmB,EAAUA,EAAQ,GAAG,EAGzCzC,EAAYT,QAAU8C,EAGtB,MAAMO,EAAsC,cAATb,EAChCa,IACD5C,EAAY6C,WAAa,IAAML,KAGjC,MAAMD,EAAUjD,YAAW,KACzB/B,KAAKG,IAAIxC,MAAM,2BAA4B8E,EAAatC,EAAI,GAC3D,KAOGoF,EAAiBd,EAAShC,EAAYU,YAAYO,IAElDK,EAAUjD,MAAMiD,QAAQwB,GACxBJ,EAAyBpB,EAAUwB,EAAiB,GAAGvB,OAAOuB,GAEpE,GAAGF,EACD,OAGF,MAAM7I,EAAS2I,EAAS3I,OACxB,IAAIgJ,EAAOhJ,EAEX,MAAMiJ,EAAoB,KACrBhD,EAAY9E,SAIT6H,GACJP,G,EAIJ,IAAI,IAAIS,EAAI,EAAGA,EAAIlJ,IAAUkJ,EAAG,CAC9B,MAAMlE,EAAU2D,EAASO,GACzBlE,EAAQQ,QAAU8C,EAClBtD,EAAQU,UAAYuD,C,MAI5B,CAEOE,OAAUjC,GACf,OAAO1D,KAAKiE,eAAoB,YAAad,GAAgBA,EAAYwC,UAA6B,GAAIjC,EAC5G,E,yECxdF,IAAIkC,EACG,SAASC,IACd,OAAOD,CACT,CAEO,SAASE,EAAeC,GAC7B,OAAOH,EAAcG,CACvB,C,qDCuJO,MAAMC,UAAkB,IAO7BlG,cACEmG,QAEAjG,KAAKkG,KAAO,KACZlG,KAAKmG,iBAAmB,CAAC,EACzBnG,KAAKoG,SAAU,EAEfpG,KAAKqG,iBAAiB,aAAa,EAAE1J,SACnCqD,KAAKkG,KAAOvJ,EAAG0C,UAAU,IAG3BW,KAAKqG,iBAAiB,0BAA0B,EAAEC,QAAOC,gBACvDvG,KAAKoG,QAAUG,EAEXD,GACFtG,KAAKwG,oBAAoB,iBAAkBD,E,IAI/CvG,KAAKqG,iBAAiB,4BAA6BI,IACjDzG,KAAKmG,iBAAiBM,EAAOxG,MAAQwG,CAAM,IAG7CzG,KAAK0G,cAAgB,CAACnE,KAAMoE,KAC1BV,MAAMS,cAAcnE,KAAMoE,GAC1B,kBAAiCC,WAAW,QAAS,CAAC3G,KAAMsC,EAAaoE,QAAM,EAG7E,MACF3G,KAAKqG,iBAAiB,oBAAoB,EAAEQ,eAC1C7G,KAAK6G,SAAWA,CAAQ,GAG9B,CAEOC,sBACL,OAAO9G,KAAKmG,gBACd,CAEOY,aACL,OAAO/G,KAAKoG,OACd,CAEOI,uBAAuBG,GAE5BV,MAAMS,iBAAiBC,EACzB,EAGF,MAAM,EAAY,IAAIX,EACtB,eAA2B,EAC3B,U,wBC3JA,MACA,EADwB,IAnDjB,MAAP,cACU,KAAAgB,MAAe,CAAC,EAChB,KAAAxD,QAAUyD,EAAA,CA+CpB,CAxCSC,WACL,OAAOvF,QAAQM,QAAQjC,KAAKgH,MAC9B,CAEOG,SAASC,EAAahD,ICvBhB,SAAyBiD,EAAaD,EAAahD,GAChE,MAAMkD,EAAWF,EAAIxH,MAAM,MAC3B,EAAA2H,EAAA,GAAgBF,EAAQC,EAASE,MAAM,GAAI,GAAGzK,KAAK,MAAMuK,EAASG,OAASrD,CAC7E,CDqBIsD,CAAgB1H,KAAKgH,MAAOI,EAAKhD,GAEjC,MAAMuD,EAAQP,EAAIxH,MAAM,KAAK,GAChB,aAAV+H,GACD,gBAAwB,mBAAoB,CAACP,MAAKhD,QAAOyC,SAAU7G,KAAKgH,MAAMH,WAGhF7G,KAAK4H,YAAYD,EAAO3H,KAAKgH,MAAMW,GACrC,CAEOC,YAAmCR,EAAQhD,EAAiByD,GAAS,EAAMC,GAC7ED,IACD7H,KAAKgH,MAAMI,GAAOhD,GAGpBpE,KAAK+H,qBAAqBX,EAAKhD,EAAO0D,EACxC,CAEOC,qBAA4CX,EAAQhD,EAAkBpE,KAAKgH,MAAMI,GAAMU,GAC5F,kBAAwClB,WAAW,SAAU,CAAC3G,KAAM,QAASmH,MAAKhD,UAElFpE,KAAKwD,QAAQwE,IAAI,CACf,CAACZ,GAAMhD,GACN0D,EACL,G,gEEhCa,MAAMG,EAenBnI,YAAsBoI,EAAsBzK,EAAa0K,GAAnC,KAAAD,KAAAA,EAAsB,KAAAzK,IAAAA,EAXpC,KAAA2K,QAIH,GAQHpI,KAAKqI,MAAQ,YAAe,EAE5B,IAAIC,EAAW,WAAiB,KAAAC,IAC7BvI,KAAKqI,QAAOC,GAAY,YAE3BtI,KAAKG,KAAM,EAAAqI,EAAA,IAAO,QAAQN,IAASC,EAAWG,GAC9CtI,KAAKG,IAAI,eAETH,KAAKyI,WAAY,CACnB,CAEOC,MAAMC,EAAkBnE,GAC7B,MAAMhI,EAASmM,EAAKnM,OAIpB,OAHAwD,KAAKqI,OAASrI,KAAKG,IAAIkI,MAAM,0BAA2B7L,GAGjDoM,MAAM5I,KAAKvC,IAAK,CAACoL,OAAQ,OAAQF,OAAMnE,SAAOK,MAAMiE,IACzD,GAAuB,MAApBA,EAASrC,SAAmBjC,EAM7B,MALAsE,EAASC,cAAclE,MAAMmE,IAC3BhJ,KAAKG,IAAIxC,MAAM,UACb,IAAIsL,YAAY,SAASC,OAAO,IAAIC,WAAWH,IAAS,IAGtDF,EAUR,OAPA9I,KAAKoJ,cAAa,GAOXN,EAASC,cAAclE,MAAMmE,GAE3B,IAAIG,WAAWH,IACtB,IACAK,IAEF,MADArJ,KAAKoJ,cAAa,GACZC,CAAG,GAEb,CAEQD,aAAaX,GAChBzI,KAAKyI,YAAcA,GAAazI,KAAKsJ,YAIxCtJ,KAAKyI,UAAYA,EAGjB,oBAAsC,QAASA,GAEjD,CAEOc,UACLvJ,KAAKoJ,cAAa,GAClBpJ,KAAKsJ,WAAY,EACjBtJ,KAAKoI,QAAQvJ,SAASuJ,GAAYA,EAAQxG,WAC1C5B,KAAKoI,QAAQ5L,OAAS,CACxB,CAEOgN,KAAKb,GACV,GAAG3I,KAAKyJ,UACN,OAAOzJ,KAAK0I,MAAMC,GACb,CACL,MAAMe,EAAU,IAAI/H,SAAqB,CAACM,EAASL,KACjD5B,KAAKoI,QAAQ9H,KAAK,CAAC2B,UAASL,SAAQ+G,QAAM,IAK5C,OAFA3I,KAAK2J,iBAEED,C,CAEX,CAEcC,iB,qCACZ,IAAG3J,KAAK4J,UAAR,CAEA5J,KAAK4J,WAAY,EAEjB,IAAI,IAAIlE,EAAI,EAAGA,EAAI1F,KAAKoI,QAAQ5L,SAAUkJ,EAAG,CAC3C,MAAM0C,EAAUpI,KAAKoI,QAAQ1C,IACvB,KAACiD,EAAI,QAAE1G,GAAWmG,EAExB,IAEEnG,QADqBjC,KAAK0I,MAAMC,IAEhC3I,KAAKoI,QAAQyB,OAAOnE,EAAG,E,CACvB,MAAM2D,GACNrJ,KAAKG,IAAIxC,MAAM,4BAA6B0L,SACtC,EAAAS,EAAA,GAAM,I,GAGZpE,C,CAGJ1F,KAAK4J,WAAY,CApBQ,CAqB3B,E,gSCtHa,MAAMG,UAAe,IASlCjK,YAAsBoI,EAAwBzK,EAAa0K,GACzDlC,QADoB,KAAAiC,KAAAA,EAAwB,KAAAzK,IAAAA,EAFtC,KAAA4K,MAAQ,YAAe,EAuDvB,KAAA2B,WAAa,KACnBhK,KAAKG,IAAI,UAETH,KAAKqI,OAASrI,KAAKG,IAAIkI,MAAM,uBAC7BrI,KAAK0G,cAAc,OAAO,EAGpB,KAAAuD,YAAe1H,IACrBvC,KAAKG,IAAIxC,MAAM,cAAe4E,GAC9BvC,KAAK2C,OAAO,EAGN,KAAAuH,YAAe3H,IACrBvC,KAAKG,IAAI,SAAUoC,GAEnBvC,KAAKmK,kBACLnK,KAAK0G,cAAc,QAAQ,EAGrB,KAAA0D,cAAiBjI,IACvBnC,KAAKqI,OAASrI,KAAKG,IAAIkI,MAAM,KAAM,gBAA8BlG,EAAMkI,KAAKC,YAE5EtK,KAAK0G,cAAc,UAAWvE,EAAMkI,KAAoB,EAGnD,KAAAb,KAAQb,IACb3I,KAAKqI,OAASrI,KAAKG,IAAIkI,MAAM,0BAA2BM,EAAKnM,QAE7DwD,KAAKuK,GAAGf,KAAKb,EAAK,EA9ElB,IAAIL,EAAW,WAAiB,KAAAC,IAMhC,OALGvI,KAAKqI,QAAOC,GAAY,YAC3BtI,KAAKG,KAAM,EAAAqI,EAAA,IAAO,MAAMN,IAASC,EAAWG,GAC5CtI,KAAKG,IAAI,eACTH,KAAKwK,UAEExK,IACT,CAEQmK,kBACFnK,KAAKuK,KAITvK,KAAKuK,GAAGE,oBAAoB,OAAQzK,KAAKgK,YACzChK,KAAKuK,GAAGE,oBAAoB,QAASzK,KAAKkK,aAC1ClK,KAAKuK,GAAGE,oBAAoB,QAASzK,KAAKiK,aAC1CjK,KAAKuK,GAAGE,oBAAoB,UAAWzK,KAAKoK,eAC5CpK,KAAKuK,QAAKtL,EACZ,CAEQuL,UACNxK,KAAKuK,GAAK,IAAIG,UAAU1K,KAAKvC,IAAK,UAClCuC,KAAKuK,GAAGI,WAAa,cACrB3K,KAAKuK,GAAGlE,iBAAiB,OAAQrG,KAAKgK,YACtChK,KAAKuK,GAAGlE,iBAAiB,QAASrG,KAAKkK,aACvClK,KAAKuK,GAAGlE,iBAAiB,QAASrG,KAAKiK,aACvCjK,KAAKuK,GAAGlE,iBAAiB,UAAWrG,KAAKoK,cAM3C,CAEOzH,QACL,GAAI3C,KAAKuK,GAAT,CAIAvK,KAAKG,IAAI,mBAET,IACEH,KAAKuK,GAAG5H,O,CACR,MAAM0G,G,CAGRrJ,KAAKkK,a,CACP,EC1Ea,SAASU,EAAqCC,GAC3D,IAAGC,UAAU,oBAAqBA,QAGhC,MAAM,IAAIC,MAAM,oBAGlB,OALED,OAAOE,gBAAgBH,GAKlBA,CACT,C,0SCMe,MAAMI,EAArB,cAgJU,KAAAC,SAAW,CAACb,EAAkBc,IAC7BC,EAAA,kBAAkC,CACvCvC,OAAQ,kBACRlC,KAAM,CAAC,CAAChK,GAAIqD,KAAKrD,GAAI0N,OAAMc,cAC3BE,SAAU,CAAChB,EAAKrB,SA+DtB,CAlMesC,KAAKC,G,8CACMtM,IAAnBe,KAAKwL,WACNxL,KAAKyL,UAGP,MAAMC,EAAc,IAAIvC,WAAW,IAGnC,IAFAyB,EAAUc,KAEE,CACV,MAAMC,EAAOD,EAAY,IAAM,GAAOA,EAAY,IAAM,GAAOA,EAAY,IAAM,EAAKA,EAAY,GAC5FE,EAAQF,EAAY,IAAM,GAAOA,EAAY,IAAM,GAAOA,EAAY,IAAM,EAAKA,EAAY,GACnG,GAAsB,MAAnBA,EAAY,IACH,aAARC,GACQ,aAARA,GACQ,YAARA,GACQ,aAARA,GACQ,aAARA,GACQ,aAARA,GACS,IAATC,EAEF,MAEFhB,EAAUc,E,CAOZ,MAAMG,EAAkBH,EAAYlE,QAAQsE,UAEtCC,EAASL,EAAYlE,MAAM,EAAG,IAC9BwE,EAA2BN,EAAYlE,MAAM,GAAI,IACjDyE,EAASJ,EAAgBrE,MAAM,EAAG,IAClC0E,EAA2BL,EAAgBrE,MAAM,GAAI,IAQrDgE,EAAYxL,KAAKwL,UAAYJ,EAAA,eAA+B,kBAAmB,CACnFW,SACAC,QACAC,SACAC,UAGFlM,KAAKmM,QAAU,CAAM9B,EAAMc,IAAc,kCAEvC,aADMK,EACCxL,KAAKkL,SAASb,EAAMc,EAC7B,IAEAnL,KAAKrD,SAAW6O,EAEhBxL,KAAKmM,QAAUnM,KAAKkL,SA2BpBQ,EAAY1D,IAAIuD,EAAMa,aAAc,IACpC,MAAMC,QAAkBrM,KAAKsM,OAAOZ,EAAYlE,SAMhD,OAFAkE,EAAY1D,IAAIqE,EAAU7E,MAAM,GAAI,IAAK,IAElCkE,CACT,G,CA4COY,OAAOC,GASZ,OAAOvM,KAAKmM,QAAQI,EAAS,UAC/B,CAEOrD,OAAOqD,GACZ,OAAOvM,KAAKmM,QAAQI,EAAS,UAC/B,CAEad,U,yCACX,MAAMD,EAAYxL,KAAKwL,UACvB,QAAiBvM,IAAduM,EACD,OAGFxL,KAAKrD,QAAKsC,EACVe,KAAKwL,eAAYvM,EAEjB,MAAMtC,QAAW6O,EACjBJ,EAAA,eAA+B,kBAAmBzO,EACpD,G,CAEO4M,UACLvJ,KAAKyL,SACP,EC7JF,YA/BA,oBACS,KAAAe,IAAM,IACN,KAAAJ,aAAe,IAAIjD,WAAW,CAACnJ,KAAKwM,IAAKxM,KAAKwM,IAAKxM,KAAKwM,IAAKxM,KAAKwM,KA2B3E,CAzBSC,aAAapC,GAClB,MAAMqC,EAAMrC,EAAKC,YAAc,EAC/B,IAAIqC,EASJ,OAPEA,EADCD,EAAM,IACE,IAAIvD,WAAW,CAACuD,IAGhB,IAAIvD,WAAW,CAAC,IAAY,IAANuD,EAAaA,GAAO,EAAK,IAAOA,GAAO,GAAM,MAIvEC,EAAO3I,OAAOqG,EAEvB,CAEOuC,WAAWvC,GAChB,IAAI7N,EAAS6N,EAAK,GAClB,OAAG7N,GAAU,KACXA,EAAS6N,EAAK,GAAMA,EAAK,IAAM,EAAMA,EAAK,IAAM,GAEzCA,EAAK7C,MAAM,EAAGhL,GAAU,IAG1B6N,EAAK7C,MAAM,EAAGhL,GAAU,EACjC,G,cCrCa,SAASqQ,EAAWC,GACjC,MAAMtQ,EAASsQ,EAAMtQ,OACfqO,EAAgB,IAAI/J,MAAMtE,GAChC,IAAI,IAAIkJ,EAAI,EAAGA,EAAIlJ,IAAUkJ,EAC3BmF,EAAInF,IAAMoH,EAAMpH,GAAK,GAAK,IAAM,KAAOoH,EAAMpH,IAAM,GAAGqH,SAAS,IAEjE,OAAOlC,EAAI9N,KAAK,GAClB,C,oTCgBe,MAAMiQ,EAyBnBlN,YACUmN,EACA/E,EACAzK,EACA0K,EACA+E,GAJA,KAAAD,WAAAA,EACA,KAAA/E,KAAAA,EACA,KAAAzK,IAAAA,EACA,KAAA0K,UAAAA,EACA,KAAA+E,aAAAA,EA7BF,KAAA3B,MAAQ4B,EACR,KAAAC,YAAc,IAAInC,EAGlB,KAAA7C,QAMF,GAEE,KAAAC,MAAQ,YAAe,EAExB,KAAAI,WAAY,EAIX,KAAA4E,eAAgB,EAqBhB,KAAAC,OAAS,IAAW,kCAC1BtN,KAAKyI,WAAY,EAGjB,qBAAuC,aAGvC,MAAMiD,QAAoB1L,KAAKoN,YAAY9B,KAAKtL,KAAKuL,OACjDvL,KAAKyI,YAITzI,KAAKuN,WAAW/D,KAAKkC,GAElB1L,KAAKyJ,YACNzJ,KAAKoI,QAAQ5L,OAAS,EACtBwD,KAAKyJ,UAAU+D,oBAAoB,eACnCxN,KAAKyJ,UAAUgE,cACfzN,KAAKyJ,UAAUiE,UASjB3L,YAAW,KACT/B,KAAK2J,gBAAgB,GACpB,GACL,IAEQ,KAAAgE,UAAkB3E,GAAwB,kCAGhD,IAAIqB,QAAarK,KAAKoN,YAAYlE,OAAO,IAAIC,WAAWH,IAGxD,GAFAqB,EAAOrK,KAAKuL,MAAMqB,WAAWvC,GAE1BrK,KAAKyJ,UAmBN,OAhBAzJ,KAAKqI,OAASrI,KAAKG,IAAIkI,MAAM,2BAA4BgC,EAAK7N,aAC9DwD,KAAKyJ,UAAUmE,cAAcvD,GAAMxF,MAAMiE,IACvC9I,KAAKqI,OAASrI,KAAKG,IAAIkI,MAAM,qCAAsCS,GAEnE,IACE9I,KAAKyJ,UAAUoE,eAAe/E,EAASA,SAAUA,EAASgF,UAAWhF,EAASiF,U,CAC9E,MAAM1E,GACNrJ,KAAKG,IAAIxC,MAAM,+CAAgD0L,E,KAIhE2E,OAAO3E,IACRrJ,KAAKG,IAAIxC,MAAM,8CAA+C0L,EAAI,IAQtE,MAAMjB,EAAUpI,KAAKoI,QAAQ6F,QACzB7F,EAKJA,EAAQnG,QAAQoI,GAJdrK,KAAKqI,OAASrI,KAAKG,IAAIkI,MAAM,sBAAuBwE,EAAWxC,GAKnE,IAEQ,KAAA6D,QAAU,KAGhB,IAAIC,EAAqBC,EACzB,GAHApO,KAAKpB,QAGFoB,KAAKqN,cAAe,CACrB,MAAMgB,EAAOC,KAAK1J,MACZ2J,EAAOF,EAAOrO,KAAKwO,cACzBL,GAAeM,MAAMF,IAASA,EAAOvO,KAAKkN,aAAelN,KAAKkN,aAAeqB,EAAO,EACpFH,EAAUC,EAAOF,C,CAGhBnO,KAAKyJ,YACNzJ,KAAKyJ,UAAU+D,oBAAoB,WAAyBY,GAC5DpO,KAAKoI,QAAQ5L,OAAS,GAGrBwD,KAAKqN,eACNrN,KAAKG,IAAI,uCAAwCgO,EAAc,KAC/DnO,KAAK0O,iBAAmBC,EAAA,aAAe3O,KAAK4O,UAAWT,IAEvDnO,KAAKG,IAAI,yB,EAwBN,KAAAyO,UAAY,KAMjB,QAL6B3P,IAA1Be,KAAK0O,mBACN3J,aAAa/E,KAAK0O,kBAClB1O,KAAK0O,sBAAmBzP,IAGvBe,KAAKuN,WAAR,CAOA,GAHAvN,KAAKG,IAAI,0BACTH,KAAKwO,cAAgBF,KAAK1J,MAEtB5E,KAAKyJ,UAOPzJ,KAAKyJ,UAAU+D,oBAAoB,qBANnC,IAAI,MAAMpF,KAAWpI,KAAKoI,QACrBA,EAAQyG,WACTzG,EAAQyG,UAAW,GAOzB7O,KAAKwK,S,CAAS,EAjJd,IAAIlC,EAAW,WAAiB,KAAAC,IAC7BvI,KAAKqI,QAAOC,GAAY,YAC3BtI,KAAKG,KAAM,EAAAqI,EAAA,IAAO,OAAON,IAASC,EAAWG,GAC7CtI,KAAKG,IAAI,eAETH,KAAKwK,SACP,CAgGO5L,QAEFoB,KAAKyI,WACN,qBAAuC,aAIzCzI,KAAKyI,WAAY,EAEdzI,KAAKuN,aACNvN,KAAKuN,WAAW9C,oBAAoB,OAAQzK,KAAKsN,QACjDtN,KAAKuN,WAAW9C,oBAAoB,QAASzK,KAAKkO,SAClDlO,KAAKuN,WAAW9C,oBAAoB,UAAWzK,KAAK2N,WACpD3N,KAAKuN,gBAAatO,EAEtB,CA+BO6P,iBACL9O,KAAK2C,QACL3C,KAAK4O,WACP,CAEOrF,UACLvJ,KAAK+O,kBAAiB,GACtB/O,KAAK2C,QAEF3C,KAAKoN,aACNpN,KAAKoN,YAAY7D,UAGnBvJ,KAAKoI,QAAQvJ,SAASuJ,IACjBA,EAAQxG,QACTwG,EAAQxG,Q,IAGZ5B,KAAKoI,QAAQ5L,OAAS,CACxB,CAEOmG,QACL,MAAM4K,EAAavN,KAAKuN,WACxB,GAAGA,EAAY,CACb,MAAM9E,EAAYzI,KAAKyI,UACvBzI,KAAKpB,QACF6J,IACD8E,EAAWlH,iBAAiB,UAAWrG,KAAK2N,WAC5CJ,EAAWlH,iBAAiB,SAAS,KACnCkH,EAAW9C,oBAAoB,UAAWzK,KAAK2N,UAAU,GACxD,CAACqB,MAAM,IACVzB,EAAW5K,Q,CAGjB,CAMOoM,iBAAiBE,GACtBjP,KAAKqN,cAAgB4B,EAEjBA,EAKOjP,KAAKuN,iBAAwCtO,IAA1Be,KAAK0O,kBACjC1O,KAAK4O,iBALwB3P,IAA1Be,KAAK0O,mBACN3J,aAAa/E,KAAK0O,kBAClB1O,KAAK0O,sBAAmBzP,EAK9B,CAEQuL,UACHxK,KAAKuN,YACNvN,KAAK2C,QAGP3C,KAAKuN,WAAa,IAAIvN,KAAKiN,WAAWjN,KAAKkI,KAAMlI,KAAKvC,IAAKuC,KAAKmI,WAChEnI,KAAKuN,WAAWlH,iBAAiB,OAAQrG,KAAKsN,QAC9CtN,KAAKuN,WAAWlH,iBAAiB,QAASrG,KAAKkO,SAC/ClO,KAAKuN,WAAWlH,iBAAiB,UAAWrG,KAAK2N,UACnD,CAEOuB,UAAUzR,GACZuC,KAAKvC,MAAQA,IAIhBuC,KAAKvC,IAAMA,EACXuC,KAAK8O,iBACP,CAEQK,WAAWxG,GACjB,MAAMyG,EAAWpP,KAAKuL,MAAMkB,aAAa9D,GAMzC,OAHgB3I,KAAKoN,YAAYd,OAAO8C,EAI1C,CAEO5F,KAAKb,GACV3I,KAAKqI,OAASrI,KAAKG,IAAIkI,MAAM,6BAA8BM,EAAKnM,QAEhE,MAAM6S,OAAsEpQ,EAI5E,IAAGe,KAAKyJ,UAGD,CACL,MAAMC,EAAU,IAAI/H,SAAqB,CAACM,EAASL,KACjD5B,KAAKoI,QAAQ9H,KAAK,CAAC2B,UAASL,SAAQ+G,OAAM0G,WAAS,IAKrD,OAFArP,KAAK2J,iBAEED,C,CATP1J,KAAKoI,QAAQ9H,KAAK,CAACqI,OAAM0G,YACzBrP,KAAK2J,gBAUT,CAEcA,iB,+CACZ,IAAI3J,KAAKyI,WAAazI,KAAKsP,iBAEzB,OAGFtP,KAAKsP,kBAAmB,EAQxB,IAAI9S,EAASwD,KAAKoI,QAAQ5L,OACtB+S,GAAO,EAEX,IAAI,IAAI7J,EAAI,EAAGA,EAAIlJ,IAAUkJ,EAAG,CAC9B,MAAM0C,EAAUpI,KAAKoI,QAAQ1C,GAC7B,IAAI0C,EACF,MAGF,MAAM,KAACO,EAAI,SAAEkG,GAAYzG,EACzB,GAAGO,IAASkG,EAAU,CAGpB7O,KAAKqI,OAASrI,KAAKG,IAAIkI,MAAM,0BAA2BM,EAAKnM,QAM7D,MAAM6S,EAAyB,QAAlB,EAAGjH,EAAQiH,eAAO,QAAfjH,EAAQiH,cAAkBrP,KAAKmP,WAAWxG,GAC1D,IAAI3I,KAAKyI,UACP,MAIFzI,KAAKuN,WAAW/D,KAAK6F,GAEjBjH,EAAQnG,QAIVmG,EAAQyG,UAAW,GAHnB7O,KAAKoI,QAAQyB,OAAOnE,IAAK,GACzBlJ,KAKF+S,GAAO,C,EAKXvP,KAAKsP,sBAAmBrQ,EAErBe,KAAKoI,QAAQ5L,QAAU+S,GACxBvP,KAAK2J,gB,KChUX,MAAM6F,EAAc,SAAa,QAAU,GAGpC,SAASC,EAA4BC,GAC1C,MAA0B,WAAnBA,EAA8B,GAAK,IAC5C,CAGO,SAASC,EAA8BzH,EAAYwH,EAAgCtJ,GACxF,MAAMwJ,EAASH,EAA4BC,GACrCG,EAA0B,WAAnBH,EAA8B,QAAUF,GAAepJ,EAT/C,WAS0E,IAAO,QAAUoJ,EAGhH,MAFqB,SAAS,6BAA6BtH,IAAO0H,sBAA2BC,GAG/F,CAGO,MAAMC,EAAb,cACU,KAAAC,cAAgB,CAAC,QAAS,QAAS,SAAU,QAAS,SAEtD,KAAAC,UAAY,SAClB,CACE,CAACrT,GAAI,EAAGsT,KAAM,iBAAmBC,KAAM,IACvC,CAACvT,GAAI,EAAGsT,KAAM,iBAAmBC,KAAM,IACvC,CAACvT,GAAI,EAAGsT,KAAM,kBAAmBC,KAAM,KAEzC,CACE,CAACvT,GAAI,EAAGsT,KAAM,iBAAmBC,KAAM,IACvC,CAACvT,GAAI,EAAGsT,KAAM,iBAAmBC,KAAM,IACvC,CAACvT,GAAI,EAAGsT,KAAM,kBAAmBC,KAAM,IACvC,CAACvT,GAAI,EAAGsT,KAAM,iBAAmBC,KAAM,IACvC,CAACvT,GAAI,EAAGsT,KAAM,gBAAmBC,KAAM,KAGpC,KAAAC,cAAyB,CAAC,EAGzB,KAAAC,gBAAkB,CAAClI,EAAYwH,EAAgCtJ,KACrE,MAAMiK,EAAeV,EAA8BzH,EAAMwH,EAAgBtJ,GAKzE,IAAIkK,EAOJ,OALAA,EAAiBvG,EAKV,IAAIiD,EAAcsD,EAAgBpI,EAAMmI,EAXV,WAAnBX,EAA8B,KAA0B,aAAnBA,EAAgC,KAAO,GAE3C,IASkC,EAK/E,KAAAa,cAAgB,CAACrI,EAAYwH,EAAgCtJ,KACnE,IAAIiK,EACJ,GAAG,UAAc,SAAY,CAC3B,MAAMT,EAASH,EAA4BC,GAG3CW,EAAe,YAFGrQ,KAAK+P,cAAc7H,EAAO,GAAK0H,GAET,sBAD3B,SAAa,aAAe,Q,MAGzC,IAAI,MAAMY,KAAYxQ,KAAKgQ,UACzB,GAAGQ,EAAS7T,KAAOuL,EAAM,CACvBmI,EAAe,UAAYG,EAASP,MAA0B,KAAlBO,EAASN,KAAc,IAAMM,EAASN,KAAO,IAAM,SAC/F,K,CAMN,OAAO,IAAIjI,EAAKC,EAAMmI,EADe,WAAnBX,EAA8B,KAA0B,aAAnBA,EAAgC,KAAO,GAChD,CAsElD,CAlESe,aACLvI,EACAwH,EAAiC,SACjCgB,EAA+B,cAC/BC,GAAQ,EACRvK,GAMIpG,KAAKmQ,cAAcS,eAAeF,KACpC1Q,KAAKmQ,cAAcO,GAAiB,CAClCG,OAAQ,CAAC,EACTC,SAAU,CAAC,EACXC,OAAQ,CAAC,IAIb,MAAMC,EAAUhR,KAAKmQ,cAAcO,GAAehB,GAE7CxH,KAAQ8I,IACXA,EAAQ9I,GAAQ,IAGlB,MAAM+I,EAAaD,EAAQ9I,GAE3B,IAAI+I,EAAWzU,SAAWmU,EAAkD,CAC1E,IAAIO,EAUJ,OAPAA,GAA+B,cAAlBR,EAAgC1Q,KAAKoQ,gBAAkBpQ,KAAKuQ,eAAerI,EAAMwH,EAAgBtJ,GAO1G8K,GAKDP,GACDM,EAAW3Q,KAAK4Q,GAGXA,IARLxT,QAAQC,MAAM,mBAAoBuK,GAC3B,K,CAUX,OAAO+I,EAAW,EACpB,CAEO5N,uBAA0B8N,EAAUD,GACzC,IAAI,MAAMR,KAAiBS,EAEzB,IAAI,MAAMzB,KAAkByB,EAAIT,GAE9B,IAAI,MAAMxI,KAAQiJ,EAAIT,GAAehB,GAAiB,CAEpD,MAAMuB,EAAkBE,EAAIT,GAAehB,GAAgBxH,IAC3D,EAAAkJ,EAAA,GAAiBH,EAAYC,E,CAIrC,E,0SCzKK,MAAMG,UAA8B,IASzCvR,cACEmG,OAAM,GAENjG,KAAKsR,OAAS,IAAIC,IAKlBvR,KAAKqG,iBAAiB,UAAWiL,IAC3BA,EAAO/M,IAAI,cACbvE,KAAKwR,kB,GAOX,CAEaC,iB,+CACX,MAAMC,EAAoC,QAAtB,EAAG1R,KAAK0R,sBAAc,QAAnB1R,KAAK0R,eAAmB,IAAI5B,EAE7CmB,EAAmDjR,KAAKiR,WAAa,CACzEU,MAAOD,EAAejB,aAAa,aAAc,SAAU,SAAS,GACpEmB,UAAWF,EAAejB,aAAa,aAAc,SAAU,aAAa,IAGxEoB,GAAc,SAClB7R,KAAKiR,WAAWU,MAAejJ,MAAM,IAAIS,WAAc,WACxDtE,MAAK,IAAMgN,EAAY5P,SAAQ,KAAO,IAAM4P,EAAY5P,SAAQ,KACjEF,YAAW,IAAM8P,EAAY5P,SAAQ,IATrB,KAWhB,MAAM6P,GAAmB,SACnBC,EAASd,EAAWW,UAC1BG,EAAOhD,kBAAiB,GACxBgD,EAAOxE,WAAWlH,iBAAiB,SAAS,IAAMyL,EAAiB7P,SAAQ,IAAQ,CAAC+M,MAAM,IAC1F+C,EAAOxE,WAAWlH,iBAAiB,QAAQ,IAAMyL,EAAiB7P,SAAQ,IAAO,CAAC+M,MAAM,IACxFjN,YAAW,KACN+P,EAAiBE,aAAeF,EAAiBG,aAIjDF,EAAOxE,YACRwE,EAAOxE,WAAW5K,QAGpBmP,EAAiB7P,SAAQ,GAAM,GAzBjB,KA4BhB,MAAOiQ,EAAiBC,SAA8BxQ,QAAQyQ,IAAI,CAACP,EAAaC,IAEhF,IAAI,MAAMpB,KAAiBO,EACPA,EAAWP,GACnBnH,UASZ,MANe,CACboI,MAAOO,GAAmBlS,KAAKsR,OAAO/M,IAAI,SAAW,EACrDqN,UAAWO,GAAwBnS,KAAKsR,OAAO/M,IAAI,aAAe,E,IAOzDiN,mB,yCACX,IAAGxR,KAAKqS,QAAR,CAGA,IAFArS,KAAKqS,SAAU,IAEH,CACV,MAAM,MAACV,EAAK,UAAEC,SAAmB5R,KAAKyR,iBAKtC,IAJGE,GAASC,IACV5R,KAAK0G,cAAc,YAAakL,IAAcD,EAAQ,YAAc,SAGnEC,EACD,YAGI,EAAA9H,EAAA,GAAM,I,CAGd9J,KAAKqS,SAAU,CAhBQ,CAiBzB,G,CAEOC,kBAAkBxU,EAAqBsG,GAC5C,IAAI5H,EAASwD,KAAKsR,OAAO/M,IAAIzG,IAAS,EACtCtB,GAAU4H,EAAQ,GAAK,EAEvBpE,KAAKsR,OAAOtJ,IAAIlK,EAAMtB,GACtBwD,KAAK0G,cAAc,SAAU1G,KAAKsR,OACpC,CAEOiB,mBAAmBzU,GACxB,OAAOkC,KAAKsS,kBAAkBxU,GAAM,EACtC,CAEO0U,mBAAmB1U,GACxB,OAAOkC,KAAKsS,kBAAkBxU,GAAM,EACtC,EAGF,MACA,EAD4B,IAAIuT,ECpHhC,GAD+E,S,cCwCxE,MAAMoB,EA8CJC,YAAYC,GACjB1Y,OAAOC,OAAO8F,KAAM2S,EAEtB,E,kCCjDF,IAAIjJ,EACW,SAASkJ,EAAaC,GACnC,OAAOnJ,QAAAA,EAAAA,EAlCT,SAAiCmJ,G,qCAC/B,MAAMC,GAAgB,QAAmB,EAAAtK,EAAA,IAAO,oBAC1CuK,EAAe9Y,OAAO+Y,KAAKH,GAC3BI,EAAmCF,EAAa7O,KAAKkD,IACzD,MAAMsC,EAAUmJ,EAASzL,GAAKzB,SAC9B,OAAOmN,EAAcpJ,EAAS,WAActC,EAAsB,IAG9D8L,EAIF,CAAC,EACCrI,QAAYlJ,QAAQyQ,IAAIa,GAC9B,IAAI,IAAIvN,EAAI,EAAGlJ,EAASuW,EAAavW,OAAQkJ,EAAIlJ,IAAUkJ,EACzDwN,EAAgBH,EAAarN,IAAMmF,EAAInF,GAGzCmF,EAAIhB,OAAO,EAAGkJ,EAAavW,QAE3B,MAAM2W,QAAsB,EAC5B,GAAGA,EAAcC,KAAM,CACrB,IAAI,MAAMhM,KAAO+L,EACfD,EAAgB9L,GAAK5K,OAAS,EAGhC2W,EAAcvU,O,CAGhB,OAAOsU,CACT,E,+RAIqBG,CAAkBR,EACvC,CCzCO,MAAMS,UAA2Bb,EAOtC3S,cACEmG,QAEAjG,KAAKG,KAAM,EAAAqI,EAAA,IAAO,YAClBxI,KAAK6S,SCJM,WACb,MAAMU,EAAoC,CAAC,QAAS,QAAS,WACvDV,EAA6B,CAAC,EACpC,IAAI,MAAM5S,KAAQsT,EAEhBV,EAAS5S,GAAQ,IAAI,IAAW,IAAgBA,GAGlD,OAAO4S,CACT,CDLoBW,EAElB,CAEOZ,eACL,OAAOA,EAAa5S,KAAK6S,SAM3B,CAMaY,YAA4DxT,G,qCACvE,OAAOD,KAAK4S,eAAe/N,MAAMqO,IACxB,CACL1P,QAASxD,KAAK6S,SAAS5S,GACvBiF,QAASgO,EAAgBjT,MAG/B,E,gSE/BK,MAAMyT,UAAwBjB,EAC5BvL,WACL,OAAOlH,KAAK2T,WAAWC,UAAU,uBAAuB/O,MAAMzC,GACrDA,GAEX,CAEOyR,eAAehN,EAKlB,CAAC,GAIH,OAAO7G,KAAKkH,WAAWrC,MAAMmC,IAC3B,IAAI8M,EACAC,EACJ,MAAMC,EAAwC,CAC5CC,SAAU,KACVC,aAAc,CACZxX,EAAG,gCACHyX,KAAMtN,EAASsN,KACfC,MAAOvN,EAASuN,QAKlBN,EADCjN,EAASwN,gBACWrU,KAAKsU,aAAaC,aAAa,aAAc1N,EAASwN,gBAAiBrN,GAAO,GAE9ErF,QAAQM,QAAQ,CACnCvF,EAAG,4BAKP,MAAM8X,EAAUxN,EAAMyN,SAChBC,EAAQ,IAAIvL,WAAWqL,EAAQE,MAAMlY,OAAS,IAWpD,OAVAoO,EAAU8J,GACVA,EAAM1M,IAAIwM,EAAQE,MAAO,GACzBF,EAAQE,MAAQA,EAGdX,EADClN,EAAS8N,YACO3U,KAAKsU,aAAaC,aAAa,aAAc1N,EAAS8N,YAAa3N,GAAO,GAE1ErF,QAAQM,QAAQ,IAAIkH,YAGhCxH,QAAQyQ,IAAI,CAAC0B,EAAoBC,IAAiBlP,MAAM+P,IAC7DZ,EAAOC,SAAWW,EAAO,GACzBZ,EAAOE,aAAaO,SAAWD,EAC/BR,EAAOE,aAAaW,kBAAoBD,EAAO,GAExC5U,KAAK2T,WAAWC,UAAU,iCAAkCI,KACnE,GAEN,CAEOc,sBAAsBb,EAAkBjN,GAC7C,OAAOhH,KAAKsU,aAAaC,aAAa,aAAcN,EAAUjN,GAAO,EACvE,CAEO+N,MAAMd,EAAkBjN,EAAwBvL,EAAe,CAAC,GACrE,OAAOuE,KAAK8U,sBAAsBb,EAAUjN,GAAOnC,MAAMmQ,GAEhDhV,KAAK2T,WAAWC,UAAU,qBAAsB,CACrDK,SAAUe,GACTvZ,GAASoJ,MAAMoQ,IACF,uBAAXA,EAAKvY,GACNsD,KAAK2T,WAAWuB,QAAQD,EAAKE,MAGxBF,MAGb,CAEOG,qBAAqBC,GAC1B,OAAOrV,KAAK2T,WAAWC,UAAU,+BAAgC,CAACyB,QACpE,CAEOC,sBACL,OAAOtV,KAAK2T,WAAWC,UAAU,8BACnC,CAEO2B,sBACL,OAAOvV,KAAK2T,WAAWC,UAAU,8BACnC,E,wBChDK,MAAM4B,WAA0B/C,EAAvC,c,oBACU,KAAAgD,SAAmD,IAAIlE,IAEvD,KAAAmE,MAAyC,CAAC,EAC1C,KAAAvV,KAAM,EAAAqI,EAAA,IAAO,UAAMvJ,GAAW,EAoJxC,CAhIS0W,YAAYC,EAA2BC,EAA2BJ,IACtEA,EAAUG,GAAa5V,KAAK8V,YAAYF,GACrCH,IACFA,EAAW,IAAItX,IACf6B,KAAKyV,SAASzN,IAAI4N,EAAWH,IAG/BzV,KAAK0V,MAAM7I,EAAW+I,IAAcA,EACpC,IAAI,MAAMG,KAAYN,EACpB,IAAG,EAAAO,EAAA,GAAUD,EAAUF,GACrB,OAIJJ,EAAS3W,IAAI+W,EACf,CAEOI,mBAAmBL,GACxB,OAAO5V,KAAK0V,MAAM7I,EAAW+I,GAC/B,CAEOE,YAAYF,GAEjB,MAAO,CADU5V,KAAKyV,SAASlR,IAAIqR,KAAeA,EAAY5V,KAAKiW,mBAAmBL,IAAcA,EAAW5V,KAAKyV,SAASlR,IAAIqR,IAC/GA,EACpB,CAEOM,WAAWN,GAChB,MAAMH,EAAWzV,KAAK8V,YAAYF,GAClC,OAAOH,EAAS,GAAK,CAACA,EAAS,GAAGU,SAAS1c,OAAO2K,MAAOqR,EAAS,SAAMxW,CAC1E,CAEOmX,cAAcR,EAA2BC,EAA2BJ,GAEzE,IADCA,EAAUG,GAAa5V,KAAK8V,YAAYF,GACtCH,EACD,IAAI,MAAMM,KAAYN,EACpB,IAAG,EAAAO,EAAA,GAAUD,EAAUF,GAMrB,OALAJ,EAAS5R,OAAOkS,GACZN,EAASrC,OACXpT,KAAKyV,SAAS5R,OAAO+R,UACd5V,KAAK0V,MAAM7I,EAAW+I,MAExB,EAKb,OAAO,CACT,CAEOS,iBAAiBT,EAA2BC,GAEjD,GADA7V,KAAKG,IAAI,0BAA2ByV,EAAUpO,QAASqO,IACnDA,EAAS,CACX,MAAMS,EAAItW,KAAKkW,WAAWN,GAC1B,IAAIU,EAEF,OADAtW,KAAKG,IAAI,kDAAmDyV,EAAUpO,SAC/D7F,QAAQC,OAAO,eAGvBiU,EAASD,GAAaU,C,CAGzB,IAAI5M,EACJ,OAAOmM,aAAO,EAAPA,EAAS/X,MACd,IAAK,UACH4L,EAAU1J,KAAKuW,mBAAmBC,eAAeX,EAAQ7W,OAAQ6W,EAAQ/H,WAAW,GACpF,MAMF,IAAK,gBACHpE,EAAU1J,KAAKyW,6BAA+BzW,KAAK0W,mBAAmBC,wBAAuB,GAAM9R,MAAK,KACtG7E,KAAKyW,iCAA8BxX,CAAS,IAE9C,MAGF,IAAK,WACHyK,EAAU/H,QAAQM,QAAQjC,KAAK4W,kBAAkBC,WAAWhB,EAAQ1W,QAAQ,IAC5E,MAGF,IAAK,cACHuK,EAAU1J,KAAK8W,gBAAgBC,wBAAwB,CAAClB,EAAQmB,QAChE,MAGF,IAAK,oBACHtN,EAAU1J,KAAKiX,yBAAyBC,iBAAiBrB,EAAQsB,OAAO,GACxE,MAGF,QAEE,OADAnX,KAAKG,IAAI2C,KAAK,4CAA6C+S,GACpDlU,QAAQC,SAInB,MAAMwV,EAAMvK,EAAW+I,GAEvB,OADA5V,KAAKG,IAAI,0CAA2CiX,GAC7C1N,EAAQ7E,MAAK,KAClB,MAAMwS,EAASxK,EAAW+I,GAE1B,GADA5V,KAAKG,IAAI,iDAAkDiX,EAAK,SAAUC,GACvED,IAAQC,EACT,OAAOzB,EAGT5V,KAAKoW,cAAcR,EAAWC,GAE9B,MAAMyB,EAAatX,KAAKkW,WAAWN,GACnC,GAAG0B,EACD,OAAOtX,KAAKqW,iBAAiBT,EAAW0B,EAAW,IAKrD,MAFAtX,KAAKG,IAAIxC,MAAM,sDAAuDyZ,EAAK,SAAUC,EAAQxB,IAEvF,EAAA0B,EAAA,GAAU,iBAAiB,GAErC,E,0DCtMa,SAASC,GAAkBC,EAAgBC,GACxD,IAAID,EACF,OAAOC,EAGT,IAAI,IAAItQ,KAAOqQ,EACTC,EAAU9G,eAAexJ,WACpBqQ,EAAUrQ,GAIrB,IAAI,IAAIA,KAAOsQ,EAEbD,EAAUrQ,GAAOsQ,EAAUtQ,GAI7B,OAAOqQ,CACT,C,sECTe,SAASE,GAAsB9V,G,QAC5C,MAAM+V,EAAoB,CACxB/V,EAAQgW,OACRhW,EAAQiW,SACPjW,EAA4BkW,WAGzBC,EAASnW,EAA4BmW,MAC3C,GAAGA,EAAO,CACR,MAAMC,EAAiBD,EAA2C5Y,aAC7CH,IAAlBgZ,GACDL,EAAQtX,KAAK2X,EAAc5Y,YAG7B,MAAM6F,EAAW8S,EAAwC9S,QACnDgT,EAAehT,aAAO,EAAPA,EAASiT,eAC3BD,aAAY,EAAZA,EAAc1b,SACfob,EAAQtX,QAAQ4X,EAAahU,KAAK/E,GAAWA,EAAOE,a,CAIxD,MAAM+Y,EAA0D,QAAvC,EAACvW,EAAqC,iBAAC,eAAEwW,kBAC/DD,aAAe,EAAfA,EAAiB5b,SAClBob,EAAQtX,QAAQ8X,EAAgBlU,KAAKoU,IAAa,EAAAvZ,GAAA,GAAUuZ,EAASC,YAGvE,MAAMC,EAAU3W,EAAmC2W,OACnD,GAAGA,EAAQ,CACT,MAAMC,EAAoB,IACnBD,EAAkDE,OAAS,GAC/DF,EAAqDpZ,QACrDoZ,EAAuDG,YAE1Df,EAAQtX,QAAQmY,EAAQ5b,OAAOC,SAASoH,KAAK/E,GAAWA,EAAOE,cAE/D,MAAMuZ,EAAoB,CACvBJ,EAAoDjZ,WACpDiZ,EAAyDhZ,SAE5DoY,EAAQtX,QAAQsY,EAAQ/b,OAAOC,SAASoH,KAAK5E,GAAWA,EAAOD,UAAS,K,CAG1E,MAAMwZ,EAAuD,QAArC,EAAChX,EAAmC,eAAC,eAAEiX,gBAK/D,OAJGD,aAAc,EAAdA,EAAgBrc,SACjBob,EAAQtX,QAAQuY,EAAe3U,KAAK6U,IAAU,EAAAha,GAAA,GAAUga,MAGnD,IAAI5a,IAAIyZ,EAAQ/a,OAAOC,SAChC,C,eC/Ce,SAASkc,GACtBC,EACAC,EACA/X,GAEA,OAAQ8X,EAAkBC,GAAY/X,CACxC,C,eCyCO,MAAMgY,QAAmCla,EAGjC,MAAMma,WAAuB3G,EAA5C,c,oBAqNS,KAAA7T,MAAQ,CAAC0M,GAAO,KACrB,GAAIA,EAYG,CACLtL,KAAKqZ,iBAAmB,CAAC,EACzBrZ,KAAKsZ,aAAe,CAAC,EACrB,IAAI,MAAMC,KAAY,KACpBvZ,KAAKsZ,aAAaC,GAAY,E,KAhBxB,CACRvZ,KAAKwD,QAAQ5E,QAEboB,KAAKqZ,iBAAmB,CAAC,EACzBrZ,KAAKwZ,uBAGLxZ,KAAKsZ,aAAerf,OAAOC,OAAO,CAAC,EAAG8F,KAAKsZ,cAC3C,IAAI,MAAMC,KAAY,KACpBvZ,KAAKyZ,iBAAiBF,GAExBvZ,KAAK0Z,kB,CASP1Z,KAAK2Z,YAAc,IAAIpI,IACvBvR,KAAK4Z,QAAU,CAAC,EAChB5Z,KAAK6Z,kBAAoB,CAAC,EAC1B7Z,KAAK8Z,WAAa,EAClB9Z,KAAK+Z,aAAe,IAAI,KAAY,CAClCxe,eAAe,EACfC,YAAY,EACZH,UAAU,EACVM,YAAY,IAEdqE,KAAKga,cAAgB,CACnBC,MAAO,GACPC,MAAO,EACPC,QAAS,GACTZ,SAAU,EACX,EAg1CK,KAAAa,oBAAuBC,IAEfA,EAAOC,aAEfzb,SAAS0b,I,MACb,MAAM,UAACC,EAAS,KAAEC,GAAQF,EAEpBvb,EAASgB,KAAK0a,gBAAgB3b,UAAU0b,GACxCxB,EAASjZ,KAAK2a,WAAW3b,GAAQ,GACpCia,KACe,QAAb,EAAAA,EAAOhc,cAAM,eAAE2d,SAChB5a,KAAK6a,sBAAsB5B,EAAQuB,GAGpCvB,EAAkBuB,UAAYA,EAC/Bxa,KAAK8a,uBAAuB7B,GAC5BjZ,KAAK+a,WAAW,CAAC9B,YAGnBjZ,KAAKuW,mBAAmByE,yBAAyBhc,EAAQia,EAAO,GAChE,EAGI,KAAAgC,qBAAwBZ,I,MAC9B,MAAMd,EAA2B,QAAhB,EAAAc,EAAOG,iBAAS,QAAI,KAE/Bxb,EAASgB,KAAK0a,gBAAgB3b,UAAWsb,EAAOI,KAA+BA,MAC/ExB,EAASjZ,KAAKkb,cAAclc,GAYlCgB,KAAKmb,yBAAyBlC,EAAQoB,EAAOpd,OAAO2d,OAAQrB,EAAS,EAG/D,KAAA6B,2BAA8Bf,IACpC,MAAMrb,EAASqb,EAAO9a,WAAWF,UAAS,GACpCgc,GAAU,EAAAC,GAAA,GAAkBjB,EAAOkB,UACnCC,EAAQxb,KAAKyb,cAAczc,EAAQqc,GACrCG,GAIJxb,KAAKmb,yBAAyBK,EAAOnB,EAAOpd,OAAO2d,OAAQ5a,KAAK0b,oBAAoBF,GAAO,EAGrF,KAAAG,sBAAyBtB,I,MAC/B,MAAMd,EAA2B,QAAhB,EAAAc,EAAOG,iBAAS,QAAI,KAElCH,EAAOuB,MACR5b,KAAK6b,oBAAoBtC,EAAUc,EAAOuB,MAAM1X,KAAKuW,GAASza,KAAK0a,gBAAgB3b,UAAW0b,EAA+BA,SAE7Hza,KAAK2T,WAAWC,UAAU,4BAA6B,CACrD4G,UAAWjB,IACV1U,MAAMiX,IAIP9b,KAAK+b,aAAaD,GAElB9b,KAAK6b,oBAAoBtC,EAAUuC,EAAc3B,QAAQjW,KAAK8X,GAAMA,EAAEhd,SAAQ,G,EAK5E,KAAAid,4BAAoC5B,IAA6C,O,EAAA,K,OAAA,E,EAAA,YACvF,MAAMrb,EAASqb,EAAO9a,WAAWF,UAAS,GAE1C,IADoBW,KAAK2Z,YAAYpV,IAAIvF,GAEvC,OAGF,MAAMkd,EAAWld,EACjB,GAAGqb,EAAOuB,MAAO,CACf,MAAMA,EAAQvB,EAAOuB,MAAM1X,KAAKmX,IAAY,EAAAC,GAAA,GAAkBD,KAC9Drb,KAAK6b,oBAAoBK,EAAUN,E,KAC9B,CACL,MAAMO,QAAcnc,KAAK2T,WAAWyI,SAAS,YAAY,GAEnD1S,EAAU1J,KAAK2T,WAAWC,UAAU,0BAA2B,CACnEyI,QAASrc,KAAKsc,gBAAgBC,gBAAgBvd,EAAOwd,YACrDL,QACAM,YAAa,EACbC,UAAW,EACXC,aAAc,IAMV/B,SAHe5a,KAAK4c,cAAc5d,EAAQ0K,IAE1BmT,OACAhgB,QAAQ2e,GAAUA,EAAMve,OAAO2d,SACrD5a,KAAK6b,oBAAoBK,EAAUtB,EAAO1W,KAAKsX,GAAUA,EAAM7e,K,CAEnE,E,YA5ByF,K,6QA4BxF,CACH,CAlpDYmgB,QACR9c,KAAKpB,OAAM,GAEXoB,KAAK+c,UAAU1W,iBAAiB,mBAAmB,KACjD,MAAMrH,EAASgB,KAAKgd,gBAAgBC,UAAUtgB,GAAG0C,UAAS,GAE1D,GADeW,KAAKkb,cAAclc,GACvB,CACT,MAAMke,EAAWld,KAAK0a,gBAAgByC,kBAAkBne,GACxDgB,KAAK+Z,aAAaqD,YAAYpe,EAAQke,E,KAI1C,MAAMG,EAAkBxgB,IACtB,MAAMsd,EAAUna,KAAKsd,kBAAiB,GACtC,IAAI,IAAI5X,EAAI,EAAGA,EAAIyU,EAAQ3d,SAAUkJ,EACnC1F,KAAKud,uBAAuBpD,EAAQzU,GAAI7I,E,EA0E5C,OAtEAmD,KAAK+c,UAAU1W,iBAAiB,gBAAgB,KAC9C,MAAM8T,EAAUna,KAAKsd,kBAAiB,GAEtC,IAAI,MAAMpB,KAAYlc,KAAK4Z,SACrBsC,EAAW,UACNlc,KAAK4Z,QAAQsC,GAMxB,IAAI,IAAIxW,EAAI,EAAGA,EAAIyU,EAAQ3d,SAAUkJ,EAAG,CACtC,MAAMuT,EAASkB,EAAQzU,GAKvB1F,KAAKwd,wBAAwBvE,E,KAIjCjZ,KAAK+c,UAAU1W,iBAAiB,gBAAiBgX,GACjDrd,KAAK+c,UAAU1W,iBAAiB,aAAcgX,GAE9Crd,KAAK+c,UAAU1W,iBAAiB,iBAAkBxJ,IAChD,MAAMsd,EAAUna,KAAKsd,kBAAiB,GAEhCpE,EAAWlZ,KAAKyd,4BAA4B5gB,EAAOF,IACzD,IAAI,IAAI+I,EAAI,EAAGA,EAAIyU,EAAQ3d,SAAUkJ,SACpByU,EAAQzU,GACTwT,UAGTlZ,KAAK4Z,QAAQ/c,EAAOF,GAAG,IAGhCqD,KAAK+c,UAAU1W,iBAAiB,0BAA2B4S,IACzDjZ,KAAK0d,8BAA8BzE,EAAOja,OAAO,IAGnDgB,KAAK+c,UAAU1W,iBAAiB,eAAgB/G,IAC9C,MAAMqe,EAAO3d,KAAKsc,gBAAgBsB,QAAQte,GAEpCN,EAASM,EAAOD,UAAS,GAC3Bse,EAAmB1gB,OAAOuI,MAAQxF,KAAKkb,cAAclc,IACvDgB,KAAK6d,qBAAqB7e,E,IAI9BgB,KAAK+c,UAAU1W,iBAAiB,qBAAqB,EAAE/G,SAAQwe,cAC7D,MAAM9e,EAASM,EAAOD,UAAS,GAC3Bye,GACF9d,KAAK+d,sBAAsB/e,GAG7BgB,KAAK0d,8BAA8B1e,EAAO,IAG5CgB,KAAKge,kBAAkBC,2BAA2B,CAChDC,kBAAmBle,KAAKoa,oBAExB+D,mBAAoBne,KAAKib,qBAEzBmD,yBAA0Bpe,KAAKob,2BAE/BiD,oBAAqBre,KAAK2b,sBAE1B2C,0BAA2Bte,KAAKic,8BAG3Bta,QAAQyQ,IAAI,CACjBpS,KAAKue,gBAAgBrX,WACrBlH,KAAKwe,mBAAmB/K,YAAY,aACnC5O,MAAK,EAAEmC,GAAQ9B,QAASiV,EAAS3W,eAClCxD,KAAKwD,QAAUA,EACfxD,KAAKma,QAAUna,KAAKwD,QAAQib,WAE5B,IAAI,MAAMlF,KAAY,KAAc,CAClC,MAAMqC,EAAQ5U,EAAMsS,aAAaC,GACjC,IAAIqC,EACF,SAGF,MAAM8C,EAAS1e,KAAK2e,gBAAgBpF,GACpCmF,EAAO7U,OAAO,EAAG6U,EAAOliB,UAAWof,E,CAGlCzB,EAAQ3d,QACT,iBAA+CwD,KAAK4e,oBAAoBC,KAAK7e,KAAMma,GAAU,CAAC,QAAS,UAAW,WAAY,UAGhIna,KAAKqZ,iBAAmBrS,EAAMqS,kBAAoB,CAAC,EAEhDc,EAAQ3d,QACTwD,KAAK8e,iBAAiBC,kB,GAG5B,CAEQH,oBAAoBzE,GAC1B,IAAI,IAAIzU,EAAI,EAAGlJ,EAAS2d,EAAQ3d,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CACvD,MAAMuT,EAASkB,EAAQzU,GACvB,GAAIuT,EAAJ,CAKAA,EAAO+F,aAAc,EAAAC,GAAA,GAAmBhG,EAAO+F,aAG5C/F,EAAOiG,YACRlf,KAAKuW,mBAAmB4I,aAAa,CAAClG,EAAOiG,aAG/C,IAAI,IAAIxZ,EAAI,EAAGA,GAAK,KAAMA,SAEjBuT,EADgD,SAASvT,KAKlE1F,KAAKof,WAAW,CACdnG,SACAoG,kBAAkB,IAIJrf,KAAKuW,mBAAmB+I,iBAAiBrG,EAAOja,OAAQia,EAAO+F,cAE7Ehf,KAAKuW,mBAAmBgJ,mBAAmBtG,EAAOja,O,EAGxD,CAEOwgB,gBAAgBjG,GACrB,QAASvZ,KAAKqZ,iBAAiBE,EACjC,CAEOkG,iBAAiBlG,EAAkBmG,GACxC,MAAMC,EAAU3f,KAAK4f,mBAAmBrG,GAErCA,IAAaJ,IAAoBuG,GAClC1f,KAAKqZ,iBAAiB,MAAiBqG,EACvC1f,KAAKqZ,iBAAiB,MAAqBqG,IAExCC,IACD,EAAAE,GAAA,GAA6B7f,KAAKqZ,iBAAkB,CAACE,IAGvDvZ,KAAKqZ,iBAAiBE,GAAYmG,GAGjCC,IAIA7e,MAAMC,KAAK,MAAc+e,OAAOvG,GAAavZ,KAAKqZ,iBAAiBE,OACpEvZ,KAAKqZ,sBAAiBF,IAAoB,GAG5CnZ,KAAKwZ,uBACP,CAEQA,uBACNxZ,KAAKue,gBAAgB3W,YAAY,mBAAoB5H,KAAKqZ,iBAC5D,CAyCOwB,sBAAsB5B,EAA6BM,UACjDN,EAAOhc,OAAO2d,QACrB,EAAAxJ,EAAA,GAAiBpR,KAAK2e,gBAAgBpF,GAAWvZ,KAAK4f,mBAAmBrG,GAAaN,EAAsBtc,GAAKsc,EAAOja,QACxHgB,KAAK0Z,kBACP,CAEOA,mBACL1Z,KAAKue,gBAAgB3W,YAAY,eAAgB5H,KAAKsZ,aACxD,CAEOG,iBAAiBF,GACtBvZ,KAAK2e,gBAAgBpF,GAAU/c,OAAS,CAC1C,CAEOmiB,gBAAgBpF,GACrB,IAAIwG,EAAS/f,KAAKsZ,aAAaC,GAM/B,OALIwG,GAAU/f,KAAK4f,mBAAmBrG,MACpC,EAAAsG,GAAA,GAA6B7f,KAAKsZ,aAAc,CAACC,IACjDwG,EAAS/f,KAAKsZ,aAAaC,GAAY,IAGlCwG,CACT,CAEOC,eAAehhB,EAAgBua,GACpC,MAAM1c,EAASmD,KAAKigB,eAAeC,UAAU3G,GAC7C,IAAI4G,EAOJ,OALEA,EADCtjB,GACoD,IAA1CA,EAAOujB,cAAc3lB,QAAQuE,KAE3BgB,KAAKkb,cAAclc,GAAQ/B,OAAO2d,OAG1CuF,CACT,CAEOE,cAAc9G,GACnB,MAAM+G,EAAatgB,KAAK6Z,kBAAkBN,IAAa,EACvD,OAAGA,IAAaJ,IAAqBmH,EAI9BA,EAHEC,KAAKC,OAAO1f,MAAMC,KAAK,MAAc0f,MAAK,CAACC,EAAGC,IAAMD,EAAIC,IAInE,CAEQC,eAAejkB,GACrB,MAAMkkB,EAAiB,CACrB1G,QAAS,GACTxd,KACAmkB,oBAAqB,EACrBC,cAAe,IAAI5iB,IACnB6iB,qBAAsB,IAAI7iB,KAK5B,OAFA,EAAA0hB,GAAA,GAA6BgB,EAAQ,CAAC,0BAE/BA,CACT,CAEOI,UAAUtkB,G,QACf,OAAsB,QAAtB,KAAOqD,KAAK4Z,SAAQjd,UAAE,UAAFA,GAAQqD,KAAK4gB,eAAejkB,EAClD,CAEOijB,mBAAmB1D,GACxB,OAAOA,GAAYA,EAAW,CAChC,CAEOR,oBAAoBwF,GACzB,OAAOA,EAAWliB,MACpB,CAEOmiB,aAAalI,GAClB,OAAOjZ,KAAKohB,QAAQnI,GAAUA,EAAOtc,GAAKsc,EAAOja,MACnD,CAEOqiB,iBAAiB1kB,EAAY2kB,GAAe,GACjD,GAAG3kB,IAAOwc,GACR,OAAOnZ,KAAKsd,iBAAiBgE,GAG/B,MAAMT,EAAS7gB,KAAKihB,UAAUtkB,GAC9B,OAAGqD,KAAK4f,mBAAmBjjB,GAClB2kB,EAAeT,EAAO1G,QAAQtd,QAAQqkB,IAAiBA,EAA0BjkB,OAAOskB,SAAUV,EAAO1G,QAG3GmH,EAAeT,EAAO1G,QAAQtd,QAAQoc,QAA6Cha,IAAjCga,EAAkBuI,aAA4BX,EAAO1G,OAChH,CAEOsH,cAAcC,EAAuBjoB,EAAeyiB,GACzD,MAAM2E,EAAS7gB,KAAKqhB,iBAAiBnF,GAAU,GAC/C,IAAIjD,EACJ,GAAIyI,EAIG,CACL,MAAMrd,EAAMwc,EAAOc,WAAW1I,GAAWA,EAAOja,SAAW0iB,KAC/C,IAATrd,IAED4U,EAAS4H,EADSpnB,EAAO4K,EAAM,EAAIA,EAAM,G,MANxC5K,IACDwf,EAAS4H,EAAO,IAUpB,OAAO5H,CACT,CAEOwE,4BAA4BvB,GACjC,GAAGlc,KAAK4f,mBAAmB1D,GAAW,OAAO,EAAA0F,GAAA,KAC7C,GAAG,SAAiB1F,GAAW,OAAO,EAAA0F,GAAA,GAAkB1F,GACxD,MAAMrf,EAASmD,KAAKigB,eAAeC,UAAUhE,GAC7C,OAAO,EAAA0F,GAAA,GAAkB/kB,EAAOglB,QAClC,CAEQC,gBAAgB7I,GACtB,OAAQjZ,KAAK+hB,wBAAwBC,iBAAiB,CACpDhjB,OAAQia,EAAOja,OACfijB,aAAa,EACbC,SAAUliB,KAAKohB,QAAQnI,GAAWA,EAAsBtc,QAAKsC,GAEjE,CAEOkjB,qBAAqBjG,GAC1B,MAAM2E,EAAS7gB,KAAKihB,UAAU/E,GAC9B,MAAO,CAACkG,mBAAoBvB,EAAOG,qBAAqB5N,KAAMiP,YAAaxB,EAAOE,cAAc3N,KAClG,CAEOkK,iBAAiBgE,GACtB,MAAMgB,EAASxhB,MAAMC,KAAK,MAAcmD,KAAKqV,GAAavZ,KAAKqhB,iBAAiB9H,EAAU+H,KAC1F,MAAO,GAAGtd,UAAUse,EACtB,CAEQC,uBACNtJ,EACAC,EACArc,G,QAMA,IAAIsE,EAEJ,MAAMigB,EAAUphB,KAAKohB,QAAQnI,GACvBuJ,EAAepB,GAAW,SAAiBvkB,EAAOF,IAI9C,GAAGqD,KAAKigB,eAAewC,oBAAoBxJ,EAAQpc,GAAS,CACpE,MAAM6lB,EAAYtB,EAChBphB,KAAK2e,gBAAgB3e,KAAK0b,oBAAoBzC,IAC9Cpc,EAAOujB,cAEHuC,EAAY3iB,KAAKmhB,aAAalI,GAC9B2J,EAAcF,EAAUjoB,QAAQkoB,GAGpCxhB,GADkB,IAAjByhB,EACO5iB,KAAK6iB,oBAAoB7iB,KAAK8iB,gCAAgCJ,EAAUlmB,OAAS,EAAIomB,IAAc,IACtF,QAAb,EAAA3J,EAAOhc,cAAM,eAAE2d,SAAU4H,EACzBxiB,KAAK8a,uBAAuB7B,GAAQ,OAAMha,GAAYujB,GAEhC,QAAtB,KAAAO,GAAA,GAAe9J,UAAO,QAAIjZ,KAAK8a,uBAAuB7B,GAAQ,E,CAQ1E,OAAOD,GAAeC,EAAQC,EAAU/X,EAC1C,CAEO6hB,UAAUhkB,EAAgBua,EAAmB8B,EAAkBiG,GAAe,GACnF,MAAM1H,EAA+B,GAElCyB,IACD9B,EAAWva,QAIGC,IAAbsa,EACDK,EAAQtZ,QAAQQ,MAAMC,KAAK,MAAcmD,KAAKqV,GAAavZ,KAAKihB,UAAU1H,GAAUY,WAEpFP,EAAQtZ,KAAKN,KAAKqhB,iBAAiB9H,GAAU,IAG/C,MAAM0J,EAA+C5H,EAClDW,GAAOA,EAAiBrf,KAAO0e,EAC/BW,GAAOA,EAAahd,SAAWA,EAClC,IAAI,MAAM6hB,KAAUjH,EAAS,CAC3B,IAAIlU,EAAI,EAAGwd,EAAU,EACrB,IAAI,IAAI1mB,EAASqkB,EAAOrkB,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CAC/C,MAAMuT,EAAS4H,EAAOnb,GACtB,GAAGud,EAAOhK,GACR,MAAO,CAACA,EAAQvT,EAAIwd,GACZ5B,IAAkBrI,EAAsBhc,OAAOskB,aAA4CtiB,IAAjCga,EAAkBuI,eAClF0B,C,EAKR,MAAO,EACT,CAEOhI,cAAclc,GACnB,OAAOgB,KAAKma,QAAQnb,EACtB,CAEOmkB,iBAAiBnkB,EAAgBqc,GACtC,OAAOA,EAAUrb,KAAKyb,cAAczc,EAAQqc,GAAWrb,KAAKma,QAAQnb,EACtE,CAEO+jB,eACL/jB,EACAka,EACAmC,GAEA,MAAMpC,GAAS,EAAAmK,GAAA,GAASpkB,GAAUA,EAASgB,KAAKmjB,iBAAiBnkB,EAAQqc,GACzE,OAAO,EAAA0H,GAAA,GAAe9J,EAAQC,EAChC,CAUO2J,oBAAoBQ,EAAelD,GAExC,OADAkD,UAAAA,GAAS,EAAAC,GAAA,IAAM,GAAQtjB,KAAKujB,YAAYC,uBACzB,MAAPH,GAAmBlD,EAAW,EAAyB,QAAlBngB,KAAK8Z,WACpD,CAUOsH,QAAQnI,GACb,MAAO,OAAQA,CACjB,CAEOuE,wBAAwBvE,EAA6BwK,GAE1D,GAAGzjB,KAAKohB,QAAQnI,GAEd,YADAjZ,KAAKud,uBAAuBtE,OAAQha,EAAWwkB,GAIjD,MAAMC,EAAU1jB,KAAKigB,eAAe0D,aACpC,IAAI,MAAMhnB,KAAM+mB,EAAS,CACvB,MAAM7mB,EAAS6mB,EAAQ/mB,GACvBqD,KAAKud,uBAAuBtE,EAAQpc,EAAQ4mB,E,CAIhD,CAEOlG,uBACLtE,EACApc,EACA4mB,GAEA,MAAMrC,EAAUphB,KAAKohB,QAAQnI,GACvBM,EAAW6H,EAAUphB,KAAK0b,oBAAoBzC,GAAUpc,EAAOF,GAE/Duc,EAAWkI,EAAU,UAAYphB,KAAKyd,4BAA4BlE,GAElEY,EADSna,KAAKihB,UAAU1H,GACPY,QAEjByJ,EAAqCxC,EACvCpF,GAAkBA,EAAErf,KAAOsc,EAAOtc,GAClCqf,GAAcA,EAAEhd,SAAWia,EAAOja,OAChC6kB,EAAW1J,EAAQwH,UAAUiC,GAC7BE,EAAY3J,EAAQ0J,GACpBE,EAAiB/jB,KAAK+iB,eAAee,EAAW5K,GAEnDuK,GAAWlK,EAAW,OACvBkK,OAAUxkB,GAGZ,MAAM+kB,EAAiBP,OAAUxkB,EAAYe,KAAKuiB,uBAAuBtJ,EAAQC,EAAUrc,GAE3F,OAAGknB,IAAmBC,MAIjBD,KAAqBC,GACxBhkB,KAAKikB,0CAA0C1K,EAAUN,IAAU+K,IAGpD,IAAdH,GACD1J,EAAQtQ,OAAOga,EAAU,GAGxBG,IACD,EAAAE,GAAA,GAA2B/J,EAASlB,GAASA,GAAWjZ,KAAK+iB,eAAe9J,EAAQC,KAAY,IAG3F,EACT,CAEOiL,kCAAkClL,EAA6BmL,GACpE,MAAMhD,EAAUphB,KAAKohB,QAAQnI,GACvBoL,EAAkC,GAElC9K,EAAW6H,EAAUphB,KAAK0b,oBAAoBzC,GAAUA,EAAOuB,UAGrE,GAFA6J,EAAU/jB,KAAKN,KAAKikB,0CAA0C1K,EAAUN,EAAQmL,KAE5EhD,EAAS,CACX,MAAMsC,EAAU1jB,KAAKigB,eAAe0D,aACpC,IAAI,MAAMhnB,KAAM+mB,EAAS,CACvB,MAAM7mB,EAAS6mB,EAAQ/mB,GACpBqD,KAAKigB,eAAewC,oBAAoBxJ,EAAQpc,IACjDwnB,EAAU/jB,KAAKN,KAAKikB,0CAA0CpnB,EAAOF,GAAIsc,EAAQmL,G,EAKvF,MAAO,KAAOA,GAAUC,EAAUxlB,SAAS4F,GAAaA,KAC1D,CAEOwf,0CAA0C1K,EAAkBN,EAA6BmL,GAC9F,MAAME,EAAiBtkB,KAAKuW,mBAAmBgO,qBAAqBtL,GAC9DuL,EAAaxkB,KAAK8hB,gBAAgB7I,GAExC,QAAcha,IAAXmlB,EAMH,MAAO,KACL,MAAMK,EAAiBzkB,KAAKuW,mBAAmBgO,qBAAqBtL,GAC9DyL,EAAa1kB,KAAK8hB,gBAAgB7I,GAElC0L,EAAmBF,EAAiBH,EAC1CtkB,KAAK4kB,wBAAwBrL,EAAUoL,IAAoBF,EAAgBA,GAAkBC,EAAYzL,EAAO,EAXlH,CACE,MAAM0L,EAAmBP,EAASE,GAAkBA,EACpDtkB,KAAK4kB,wBAAwBrL,EAAUoL,IAAoBL,EAAgBA,GAAkBE,EAAYvL,E,CAW7G,CAEO2L,wBACLrL,EACAoL,EACAE,EACAC,EACA7L,G,MAEA,MAAM,OAACja,GAAUia,EACX0G,EAAU3f,KAAK0a,gBAAgBiF,QAAQ3gB,GACvCoiB,EAAUphB,KAAKohB,QAAQnI,GAC7B,GAAG0G,IAAYyB,EAAS,CACtB,MAAM2D,EAAmB/kB,KAAKglB,oBAAoBhmB,GAClD,GAAG+lB,aAA4BpjB,QAgB7B,YAfAojB,EAAiBlgB,MAAK,EAAEqV,QAAO+K,iBAC7BhM,EAASjZ,KAAKkb,cAAclc,GAC5B,MAAM6hB,EAAS7gB,KAAKihB,UAAU1H,GAE3BN,GACAjZ,KAAK0a,gBAAgBiF,QAAQ3gB,IAC7B6hB,GACAA,EAAO1G,QAAQ+K,MAAMjM,GAAWA,EAAOja,SAAWA,KAKrDgB,KAAK4kB,wBAAwBrL,EAAU,GAAG,GAAO,EAAON,EAAO,IAKjE0L,EAAmB,EACnBE,EAAeE,EAAiB7K,MAAQ,EACxC4K,EAAgBC,EAAiBE,U,CAIrC,MAAMpE,EAAS7gB,KAAKihB,UAAU1H,GAC3BoL,IACD9D,EAAOC,oBAAsBP,KAAK4E,IAAI,EAAGtE,EAAOC,oBAAsB6D,IAGxE,MAAMvd,EAAMpH,KAAKmhB,aAAalI,GAC3B4L,EACDhE,EAAOE,cAAcjiB,IAAIsI,GAEzByZ,EAAOE,cAAcld,OAAOuD,GAG3B0d,EACDjE,EAAOG,qBAAqBliB,IAAIsI,GAEhCyZ,EAAOG,qBAAqBnd,OAAOuD,GAGT,QAA5B,EAAAyZ,EAAOuE,6BAAqB,QAA5BvE,EAAOuE,sBAA0BzW,EAAA,cAAe,KAC9CkS,EAAOuE,2BAAwBnmB,EAC/B,MAAMomB,EAAU,OAAH,UAAOxE,UACbwE,EAAQlL,QACfna,KAAK+c,UAAUrW,cAAc,gBAAiB2e,GAE3CjE,GACDphB,KAAK0d,8BAA8B1e,E,GAEpC,GACL,CAEO0e,8BAA8B1e,GACnC,MAAMia,EAASjZ,KAAKkb,cAAclc,GAC/Bia,IACDjZ,KAAKwd,wBAAwBvE,GAC7BjZ,KAAKmkB,kCAAkClL,EAAvCjZ,GACAA,KAAK+c,UAAUrW,cAAc,gBAAiB,CAC5C1H,SACAia,WAGN,CAEO6B,uBACL7B,EACAqM,EACAzjB,EACA0jB,G,MAEA,IAAID,EACF,OAGF,MAAMlE,EAAUphB,KAAKohB,QAAQnI,GAC7B,IAAiBkH,EAAbqF,EAAU,EACd,GAAIvM,EAAsBhc,OAAOskB,OAC/BiE,EAAUxlB,KAAK8iB,gCAAgC,MAC/C3C,GAAW,OACN,GAAGlH,EAAOhc,OAAO2d,SAAW2K,EACjCC,EAAUxlB,KAAKylB,yBAAyBxM,GACxCkH,GAAW,MACN,CAKL,GAJAte,IAAAA,EAAY7B,KAAKuW,mBAAmB+I,iBAAiBrG,EAAOja,OAAQia,EAAO+F,cAE3EwG,GAAW3jB,aAAO,EAAPA,EAA6BwhB,OAAQmC,GAE5CpE,EAAS,CACX,MAAMsE,EAAY1lB,KAAK0a,gBAAgBiL,UAAU1M,EAAOja,SAAWia,EAAOja,OAAOwd,WACjF,GAAGkJ,EAAW,CACZ,MAAMrJ,EAAUrc,KAAKsc,gBAAgBsB,QAAQ8H,KACzCF,GAAYnJ,EAAQgH,MAAQhH,EAAQgH,KAAOmC,KAC7CA,EAAUnJ,EAAQgH,K,EAKD,kBAAR,QAAZ,EAAApK,EAAO2M,aAAK,eAAElpB,IAAwBuc,EAAO2M,MAAMvC,KAAOmC,IAC3DA,EAAUvM,EAAO2M,MAAMvC,K,CAI3BmC,IAAAA,GAAY,EAAAlC,GAAA,IAAM,IAElB,MAAMniB,EAAQnB,KAAK6iB,oBAAoB2C,EAASrF,GAChD,GAAGmF,EACD,OAAOnkB,EAIT6X,GAAeC,GADE,EAAA2I,GAAA,GAAmB3I,EAAkBuB,WACrBrZ,EACnC,CAEO2hB,gCAAgCF,GACrC,OAAO,YAA4B,MAAdA,EACvB,CAEO6C,yBAAyBxM,GAC9B,MAAMmI,EAAUphB,KAAKohB,QAAQnI,GACvB2C,EAAQ5b,KAAK2e,gBAAgByC,EAAUphB,KAAK0b,oBAAoBzC,GAAUA,EAAOuB,WAEjFqL,EAAY7lB,KAAKmhB,aAAalI,GACpC,IAAI2J,EAAchH,EAAMnhB,QAAQorB,GAUhC,OAToB,IAAjBjD,IACDhH,EAAMkK,QAAQD,GACdjD,EAAc,EAEVxB,GACFphB,KAAK0Z,oBAIF1Z,KAAK8iB,gCAAgClH,EAAMpf,OAAS,EAAIomB,EACjE,CAoBOmD,iBAAiB9M,GACtB,GAAGjZ,KAAKohB,QAAQnI,GACd,OAGF,MAAM,OAACja,EAAM,IAAEgnB,GAAO/M,EAChBgN,EAAiBjmB,KAAKuW,mBAAmB2P,kBAAkBlnB,GAC3DmnB,EAAkBnmB,KAAKuW,mBAAmB6P,0BAA0BpnB,GACpEqnB,EAAUJ,EAAeI,QAAQ7e,MACvC,IAAI8e,EACJ,IAAI,IAAI5gB,EAAI,EAAGlJ,EAAS6pB,EAAQ7pB,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CACvD,MAAM6gB,EAAMF,EAAQ3gB,GACd7D,EAAqB7B,KAAKuW,mBAAmBiQ,sBAAsBL,EAAiBI,GAC1F,GAAG1kB,IAAYA,EAAQ5E,OAAOwpB,YAAiD,CAC7EH,EAAkBzkB,EAElB,MAAM+V,EAAUD,GAAsB9V,GACtC7B,KAAK0mB,aAAaC,mBAAmB/O,EAAS,cAAc5Y,KAE5D,K,EAgBJ,GAZAia,EAAOiG,WAAaoH,EAYjBtnB,EAAO4nB,aAAeZ,EAAK,CAC5B,MAAMa,EAAS7mB,KAAKge,kBAAkB8I,gBAAgB9nB,EAAOwd,WAAYwJ,GAAKA,IAC9E/M,EAAO+M,IAAMa,C,CAGf7mB,KAAKwD,QAAQwE,IAAI,CACf,CAAChJ,GAASia,IAGZjZ,KAAK0mB,aAAaK,YAAY/nB,EAAQ,SASxC,CAEO+b,YAAW,OAAC9B,EAAM,WAAEqH,EAAU,iBAAEjB,EAAgB,iBAAE2H,IAMvD,MAAM5F,EAAUphB,KAAKohB,QAAQnI,IACvB,UAACuB,EAAS,OAAExb,GAAUia,EAe5B,GAbGmI,EACmBphB,KAAKinB,oBAAoBjoB,GACjC6d,OAAO7U,IAAIiR,EAAOtc,GAAIsc,GAElCjZ,KAAKma,QAAQnb,GAAUia,EAGzBqH,UAAAA,EAAetgB,KAAKknB,oBAAoBjO,IAGxCjZ,KAAKwd,wBAAwBvE,GAG1BqH,IAAerH,EAAOhc,OAAO2d,OAAQ,CACtC,IAAIwG,GAAW4F,EAAkB,CAC/B,MAAMG,EAAwBnnB,KAAK6Z,uBAAkBV,KACjDgO,GAAyB7G,EAAa6G,KACxCnnB,KAAK6Z,uBAAkBV,GAAoBmH,E,CAI/C,MAAM/G,EAAW6H,EAAUphB,KAAK0b,oBAAoBzC,GAAUuB,EACxD4M,EAAkBpnB,KAAK6Z,kBAAkBN,GAC/C,IAAI6N,GAAmB9G,EAAa8G,EAAiB,CAEnD,IAAI/H,IAAqBrf,KAAKwf,gBAAgBjG,GAE5C,YADAvZ,KAAK2a,WAAW3b,EAAQoiB,EAAUphB,KAAKmhB,aAAalI,QAAUha,GAAW,GAI3Ee,KAAK6Z,kBAAkBN,GAAY+G,C,EAIvCtgB,KAAK+lB,iBAAiB9M,EAWxB,CAEOoO,sBAAsBroB,EAAgBqc,GAC3C,MAAMiM,EAActnB,KAAKgjB,UAAUhkB,OAAQC,EAAWoc,GAAS,IACxDpC,EAAQ9X,GAASmmB,EACxB,GAAGrO,EAAQ,CACT,MAAMiD,EAAWb,EACfrb,KAAK0b,oBAAoBzC,GACxBA,EAAkBuB,UAIf+M,OAA4FtoB,KAAhF,EAAAmS,EAAA,GAAiBpR,KAAK2e,gBAAgBzC,GAAWlc,KAAKmhB,aAAalI,IAErFjZ,KAAKwd,wBAAwBvE,GAAQ,GAErCjZ,KAAK+Z,aAAaqD,YAAYpe,EAAQ,IAEnCuoB,GACDvnB,KAAK0Z,kB,CAIT,OAAO4N,CACT,CAEO3M,WAAW3b,EAAgBqc,EAAkBmM,GAClD,MAAMvO,EAASjZ,KAAKmjB,iBAAiBnkB,EAAQqc,GACvCiM,EAActnB,KAAKqnB,sBAAsBroB,EAAQqc,GAavD,OAZGpC,IACGuO,IACCnM,EACDrb,KAAKinB,oBAAoBjoB,GAAQ6d,OAAOhZ,OAAOwX,UAExCrb,KAAKma,QAAQnb,IAIxBgB,KAAKynB,qBAAqBxO,EAAQuO,IAG7BF,CACT,CAEOG,qBAAqBxO,EAA6BuO,GACvD,GAAgB,eAAbvO,EAAOvc,EACR,OAGF,MAAM,OAACsC,GAAUia,EACjBjZ,KAAK0mB,aAAaC,mBAAmB,GAAI,cAAc3nB,KACvDgB,KAAK0mB,aAAagB,YAAY1oB,EAAQ,UACtCgB,KAAKwD,QAAQK,OAAO7E,EAAQwoB,EAC9B,CAEOG,oBAAoB3oB,EAAgBqc,GACzC,MAAMuM,EAAU5nB,KAAK2a,WAAW3b,EAAQqc,GAKxC,OAJGuM,EAAQprB,QACTwD,KAAK+c,UAAUrW,cAAc,cAAekhB,EAAQ,IAG/CA,CACT,CAKO/J,qBAAqB7e,EAAgBqc,GAC1Crb,KAAK2nB,oBAAoB3oB,EAAQqc,GACjCrb,KAAK+c,UAAUrW,cAAc,eAAgB1H,EAC/C,CAEO+c,aAAa3Z,EAAmDpD,GAGrE,MAAM2gB,EAAuB,yBAAbvd,EAAO1F,EACjBmrB,EAASzlB,EAA+B+X,SAAY/X,EAA+Bya,OACrF8C,EAQF3f,KAAK4c,cAAc5d,EAAQoD,IAN3B,EAAA0lB,GAAA,GAAe1lB,EAAO+X,SAAS,CAAClB,EAAQ5U,KACtB,iBAAb4U,EAAOvc,GACR0F,EAAO+X,QAAQtQ,OAAOxF,EAAK,E,KAOjC,EAAA0jB,GAAA,GAA8BF,GAE9B7nB,KAAKgd,gBAAgBgL,aAAa5lB,EAAOsW,OACzC1Y,KAAKsc,gBAAgB2L,aAAa7lB,EAAO8lB,OACzCloB,KAAKuW,mBAAmB4I,aAAa/c,EAAO+lB,UAI5C,MAAMC,EAAyD,IAAI7W,IAUnEsW,EAAMhpB,SAASoa,I,QACb,MAAMja,EAASgB,KAAK0a,gBAAgB3b,UAAUka,EAAOwB,MACrD,IAAI4N,EAASpP,EAAO+F,YAEpB,MAAMsJ,EAAgBtoB,KAAKuW,mBAAmBgS,eAAevpB,GAC7D,GAAGspB,EAAe,CAChB,MAAME,EAAoBxoB,KAAKuW,mBAAmB+I,iBAAiBtgB,EAAQspB,GACrEpJ,EAAalf,KAAKuW,mBAAmB+I,iBAAiBtgB,EAAQqpB,KAChEA,GAAWG,KAAuBtJ,IAAcsJ,aAAiB,EAAjBA,EAAmBnF,OAAOnE,aAAU,EAAVA,EAAYmE,UACxFpK,EAAO+F,YAAcqJ,EAASC,EAC9BtoB,KAAKuW,mBAAmB2P,kBAAkBlnB,GAAQypB,MAAQH,E,CAS9D,GAAGD,GAA8B,kBAAR,QAAZ,EAAApP,EAAO2M,aAAK,eAAElpB,IACzB,GAAGsD,KAAKof,WAAW,CAACnG,WAAU,CAC5B,MAAMyP,EA9BW,CAAC1pB,IACtB,IAAI0pB,EAAQN,EAAe7jB,IAAIvF,GAK/B,OAJI0pB,GACFN,EAAepgB,IAAIhJ,EAAQ0pB,EAAQ,CAAC,GAG/BA,CAAK,EAwBMC,CAAe3pB,GAE1B2gB,GACY,QAAb,EAAC+I,EAAM7L,cAAM,QAAZ6L,EAAM7L,OAAW,IAAItL,KAAOvJ,IAC1BiR,EAAsBtc,GACvBsc,GAGFyP,EAAMzP,OAASA,C,OAInBjZ,KAAK2nB,oBAAoB3oB,EAAQ2gB,EAAU3f,KAAKmhB,aAAalI,QAAUha,GAGzE,MAAMmI,EAAMpH,KAAKuW,mBAAmBqS,wBAAwB5pB,EAAQ2gB,EAAU3f,KAAKmhB,aAAalI,QAAUha,GACpG4pB,EAAU7oB,KAAKuW,mBAAmBuS,8BAA8B1hB,GACtE,QAAenI,IAAZ4pB,EAAuB,CACxB,IAAI,MAAMxO,KAAUwO,EAClBA,EAAQhlB,OAAOwW,GACfra,KAAKge,kBAAkB+K,WAAW1O,GAGhCwO,EAAQzV,aACHpT,KAAKuW,mBAAmBuS,8BAA8B1hB,E,KAKhEghB,EAAehV,MAChBpT,KAAK+c,UAAUrW,cAAc,sBAAuB0hB,EAExD,CAEQlB,oBAAoBjO,GAC1B,MAAMpX,EAAU7B,KAAKuW,mBAAmB+I,iBAAiBrG,EAAOja,OAAQia,EAAO+F,aAC/E,OAAOnd,aAAO,EAAPA,EAASwhB,OAAQ,CAC1B,CAEO2F,sBAAsBhqB,GAC3B,GAAGA,EAAO4nB,YAAa,CACrB,MAAMjJ,EAAa3d,KAAKsc,gBAAgBsB,QAAQ5e,EAAOwd,YAEvD,GACa,qBAAXmB,EAAKjhB,GAEJihB,EAAmB1gB,OAAOuI,KAG3B,OAAO,C,CAIX,OAAO,CACT,CAKO4Z,YAAW,OAChBnG,EAAM,SACNM,EAAQ,iBACR8F,EAAgB,iBAChB2H,I,QAOA,MAAM5F,EAAUphB,KAAKohB,QAAQnI,GACvBgQ,GAAY7H,EAEZ/F,EAAU+F,EAAUnI,EAAOtc,IAAK,EAAA2e,GAAA,GAAkBrC,EAAOtc,SAAMsC,EACjEmiB,GACF7H,UAAAA,EAA6B,QAAhB,EAAAN,EAAOuB,iBAAS,QAAI,MAGnC,MAAMxb,EAASgB,KAAK0a,gBAAgB3b,UAAUka,EAAOwB,MACrD,IAAIzb,EAEF,OADAtB,QAAQC,MAAM,gCAAiCsb,EAAQM,IAChD,EAOT,GAJI6H,GAAwB,WAAbnI,EAAOvc,GACpBgB,QAAQC,MAAM,sCAAuCsb,EAAQhf,OAAOC,OAAO,CAAC,EAAG+e,IAG9EgQ,IAAajpB,KAAKgpB,sBAAsBhqB,GACzC,OAAO,EAGT,MAAM0mB,EAAY1lB,KAAK0a,gBAAgBiL,UAAU3mB,GAAUA,EAAOwd,WAAa,KAE/E,GAAGyM,EAAU,CACX,MAAM/L,EAAWld,KAAK0a,gBAAgByC,kBAAkBne,GACxDgB,KAAK+Z,aAAaqD,YAAYpe,EAAQke,E,CAGxC,MAAMgM,EAAkBlpB,KAAKmjB,iBAAiBnkB,EAAQqc,GAEtD,IAAIkL,EAAa1kB,EACjB,GAAGoX,EAAO+F,YAAa,CACrBuH,GAAM,EAAAjL,GAAA,GAAkBrC,EAAO+F,aAG/B,MAAMmK,GAAgBD,aAAe,EAAfA,EAAiBlK,cAAehf,KAAKuW,mBAAmB+I,iBAAiBtgB,EAAQkqB,EAAgBlK,cAC/F,QAArB,EAAAmK,aAAa,EAAbA,EAAelsB,cAAM,eAAEwpB,cAAeyC,EAAgBlK,aAAeuH,IACtEA,EAAM2C,EAAgBlK,aAGxBnd,EAAU7B,KAAKuW,mBAAmB+I,iBAAiBtgB,EAAQunB,E,MAE3DA,EAAMvmB,KAAKuW,mBAAmB6S,sBAAsBpqB,GACpD6C,EAAU,CACRnF,EAAG,UACHC,GAAI4pB,EACJA,MACA8C,QAASrpB,KAAK0a,gBAAgB4O,cAActpB,KAAKgd,gBAAgBC,UAAUtgB,GAAG0C,UAAS,IACvFkZ,QAASvY,KAAK0a,gBAAgB4O,cAActqB,GAC5CuqB,SAAS,EACTtsB,OAAQ,CAACusB,KAAK,GACdnG,KAAM,EACNxhB,QAAS,IAEX7B,KAAKuW,mBAAmB4I,aAAa,CAACtd,GAAU,CAAC4nB,YAAY,IAO/D,IAJI5nB,aAAO,EAAPA,EAAS5E,SACX+C,KAAKuW,mBAAmBpW,IAAIxC,MAAM,+BAAgCsb,EAAQpX,GAGzEonB,IAAavD,GAAa1mB,EAAO4nB,YAAa,CAC/C,MAAMjJ,EAAO3d,KAAKsc,gBAAgBsB,QAAQ5e,EAAOwd,YACjD,GAAGmB,GAAQA,EAAK+L,aAAe/L,EAAK1gB,OAAO0sB,YAAa,CACtD,MAAMC,EAAiB5pB,KAAK0a,gBAAgB3b,UAAU4e,EAAK+L,aAC3D1pB,KAAKuW,mBAAmBsT,eAAe7qB,GAAU4qB,EACjD5pB,KAAKuW,mBAAmBuT,eAAeF,GAAkB5qB,EACzDia,EAAOuI,WAAaoI,C,EAwBxB,GAnBA3Q,EAAO+F,YAAcuH,EAErBtN,EAAO8Q,mBAAoB,EAAAzO,GAAA,GAAkB4N,IAAoBjQ,EAAO8Q,kBAAoBb,EAAgBa,kBAAoB9Q,EAAO8Q,mBACvI9Q,EAAO+Q,oBAAqB,EAAA1O,GAAA,GAAkB4N,IAAoBjQ,EAAO+Q,mBAAqBd,EAAgBc,mBAAqB/Q,EAAO+Q,oBAEvIf,QAAiChqB,IAArBga,EAAOuB,WACJ,WAAbvB,EAAOvc,IAERuc,EAAOuB,UAAY0O,EAAmBA,EAAkC1O,UAAYjB,GAMxFN,EAAO2M,MAAQ5lB,KAAK8e,iBAAiBmL,UAAU,CAACjrB,SAAQkjB,SAAU7G,EAASuK,MAAO3M,EAAO2M,QACzF3M,EAAOja,OAASA,EAIb6C,GAAWA,EAAQ5E,OAAOwpB,YAAa,CACxC,MAAMyD,EAAQroB,EAAQ5E,OAAOusB,IAC1BjD,EAAMtN,EAAOiR,EAAQ,qBAAuB,sBAC7CroB,EAAQ5E,OAAOktB,QAAS,EAEpBlR,EAAOmR,cAAiBF,KACxBjR,EAAOmR,qBAGJvoB,EAAQ5E,OAAOktB,M,CAI1B,MAAMlE,EAAiBjmB,KAAKuW,mBAAmB2P,kBAAkBlnB,EAAQqc,GACnE7T,EAAQye,EAAeI,QAAQ7e,MAkCrC,GA/BcA,EAAMhL,OAMTgL,EAAM6iB,MAAM,eACPpE,EAAeI,QAAQiE,YAAY,CAAC/D,IAC5CgE,OAAO,aACbtE,EAAe/L,QAAf+L,EAAe/L,MAAU,GACtBla,KAAKuW,mBAAmBiU,mBAAmBvE,EAAgBpkB,IAC5D7B,KAAK+c,UAAUrW,cAAc,uBAAwB,CAAC1H,aAVxDinB,EAAeI,QAAQP,QAAQS,GAC/BN,EAAe/L,QAAf+L,EAAe/L,MAAU,GACtBla,KAAKuW,mBAAmBiU,mBAAmBvE,EAAgBpkB,IAC5D7B,KAAK+c,UAAUrW,cAAc,uBAAwB,CAAC1H,YAW1DinB,EAAewC,MAAQlC,EACvBN,EAAewE,UAAYxR,EAAO8Q,kBAClC9D,EAAeyE,gBAAkBzR,EAAO+Q,mBAExChqB,KAAK+hB,wBAAwB4I,iBAAiB,CAC5C3rB,SACAkjB,SAAUd,EAAUnI,EAAOtc,QAAKsC,EAChC4H,SAAUoS,EAAO2R,kBAGhB3B,GAAYvD,GAAazM,EAAO+M,KACjChmB,KAAKge,kBAAkB6M,gBAAgBnF,EAAWzM,EAAO+M,KAG3DhmB,KAAK8a,uBAAuB7B,GAEzBiQ,EAAiB,CAElB,MAAM4B,EAAqB9qB,KAAK+qB,eAAe5G,kCAAkC+E,GACjF1R,GAAkB0R,EAAiBjQ,GACnC6R,G,CAcF,OAXA9qB,KAAK+a,WAAW,CACd9B,SACAqH,WAAYze,aAAO,EAAPA,EAASwhB,KACrBhE,mBACA2H,qBAGC5F,GACDphB,KAAKgrB,mBAAmB/R,EAAQiQ,IAG3B,CACT,CAEO8B,mBAAmBxP,EAAmByP,GAC3C,IAAIA,EACF,OAGF,MAAM,OAACjsB,EAAQrC,GAAIulB,GAAY1G,EACzB0P,EAAgB1P,EAAM2P,gBAAmBF,EAAwBE,cACjEC,EAAiB5P,EAAM6P,QAAWJ,EAAwBI,MAC1DC,EAAYJ,GAAiBE,EAEhCF,GACDlrB,KAAK+c,UAAUrW,cAAc,gBAAiB,CAAC1H,SAAQkjB,aAGtDoJ,GACDtrB,KAAK+c,UAAUrW,cAAc,kBAAmB,CAAC1H,SAAQkjB,YAE7D,CAEOqJ,WAAW9vB,GAYhB,MAAM,MACJwe,EAAQ,GAAE,YACVuR,EAAW,MACXrP,EAAQ,GAAE,SACVD,EAAW,KAAa,aACxBoF,GAAe,GACb7lB,EAEEkkB,EAAU3f,KAAK4f,mBAAmB1D,GACxC,IAAIyD,IAAY,SAAiBzD,GAAW,CAC1C,MAAMuP,EAA2B,GAE3BC,EAAqB1rB,KAAKgd,gBAAgB2O,eAC5CD,EAAmBE,QACrBH,EAASnrB,KAAKorB,EAAmBhiB,SAGnC,MAAMmiB,EAA8B7rB,KAAKigB,eAAe6L,qBAAqB5P,GAK7E,GAJG2P,GACDJ,EAASnrB,KAAKurB,GAGbJ,EAASjvB,OACV,OAAOmF,QAAQyQ,IAAIqZ,GAAU5mB,MAAK,IACzB7E,KAAKurB,WAAW9vB,I,CAM7B,MAAMswB,EACF,SAAiB7P,KAAalc,KAAKqgB,cAAcnE,IAAeyD,EAEhEzD,EADA/C,GAEJ,IAAI6S,EAAmBhsB,KAAKqhB,iBAAiBnF,EAAUoF,GAEvD,MAAMpI,EAAWlZ,KAAKyd,4BAA4BvB,GAElD,GAAGjC,IAAU0F,EAAS,CACpB,IAAIxD,GAASnc,KAAKga,cAAcC,QAAUA,GAASja,KAAKga,cAAcT,WAAa2C,EAAU,CAC3Flc,KAAKga,cAAcC,MAAQA,EAC3Bja,KAAKga,cAAcT,SAAW2C,EAE9B,MAAMhX,EAAUlF,KAAK+Z,aAAaxf,OAAO0f,GAEnCE,EAAoB,GAC1B,IAAI,MAAMnb,KAAUgB,KAAKma,QAAS,CAChC,MAAMlB,EAASjZ,KAAKma,QAAQnb,GACzBkG,EAAQzG,IAAIwa,EAAOja,SAAWia,EAAOuB,YAAc0B,GACpD/B,EAAQ7Z,KAAK2Y,E,CAIjBkB,EAAQsG,MAAK,CAACwL,EAAIC,IAAOlsB,KAAK+iB,eAAemJ,EAAIhT,GAAYlZ,KAAK+iB,eAAekJ,EAAI/S,KACrFlZ,KAAKga,cAAcG,QAAUA,EAC7Bna,KAAKga,cAAcE,MAAQC,EAAQ3d,M,CAGrCwvB,EAAmBhsB,KAAKga,cAAcG,O,MAEtCna,KAAKga,cAAcC,MAAQ,GAG7B,IAAIkS,EAAS,EACb,GAAGX,EAAc,EACf,IAAI,IAAIhvB,EAASwvB,EAAiBxvB,OAAQ2vB,EAAS3vB,KAC9CgvB,EAAcxrB,KAAK+iB,eAAeiJ,EAAiBG,GAASjT,MADJiT,GAO/D,MAAMC,EAAYpsB,KAAKwf,gBAAgBuM,GACjCM,EAAkBL,EAAiBxvB,QAAW2vB,EAAShQ,EAC7D,GAAGlC,GAASmS,GAAaC,EAAiB,CACxC,MAAMlS,EAAU6R,EAAiBxkB,MAAM2kB,EAAQA,EAAShQ,GACxD,MAAO,CACLhC,UACAD,MAAOkS,EAAYJ,EAAiBxvB,OAAS,KAC7C8vB,SAAUN,EAAiBxvB,SAAY2d,EAAQ,IAAMA,EAAQ,KAAO6R,EAAiB,IAAOhsB,KAAK+iB,eAAeiJ,EAAiB,GAAI9S,GAAYsS,GACjJnB,OAAQpQ,GAASmS,IAAeD,EAAShQ,GAAU6P,EAAiBxvB,O,CAIxE,OAAOwD,KAAKuW,mBAAmBgW,eAAe,CAACpQ,QAAO5C,SAAUwS,IAAelnB,MAAMzC,IAOnF,GALGkf,IACD0K,EAAmBhsB,KAAKqhB,iBAAiBnF,EAAUoF,IAGrD6K,EAAS,EACNX,EAAc,EACf,IAAI,IAAIhvB,EAASwvB,EAAiBxvB,OAAQ2vB,EAAS3vB,KAC9CgvB,EAAcxrB,KAAK+iB,eAAeiJ,EAAiBG,GAASjT,MADJiT,GAS/D,MAAMhS,EAAU6R,EAAiBxkB,MAAM2kB,EAAQA,EAAShQ,GACxD,MAAO,CACLhC,UACAD,WAAwBjb,IAAjBmD,EAAO8X,MAAsB8R,EAAiBxvB,OAAS4F,EAAO8X,MACrEoS,SAAUN,EAAiBxvB,SAAY2d,EAAQ,IAAMA,EAAQ,KAAO6R,EAAiB,IAAOhsB,KAAK+iB,eAAeiJ,EAAiB,GAAI9S,GAAYsS,GAEjJnB,MAAOjoB,EAAOioB,MACf,GAEL,CAIOtM,sBAAsB/e,GAC3B,MAAM0pB,EAAQ1oB,KAAK2Z,YAAYpV,IAAIvF,GACnC,IAAI0pB,EACF,OAGF,MAAM7H,EAAS7gB,KAAK4Z,QAAQ5a,GACzB6hB,IACEA,EAAOuE,uBACRrgB,aAAa8b,EAAOuE,8BAGfplB,KAAKqZ,iBAAiBra,UACtBgB,KAAKsZ,aAAata,UAClBgB,KAAK6Z,kBAAkB7a,UACvBgB,KAAK4Z,QAAQ5a,IAGtB0pB,EAAM7L,OAAOje,OAIf,CAEOqoB,oBAAoBjoB,GACzB,IAAI2a,EAAc3Z,KAAK2Z,YAAYpV,IAAIvF,GAWvC,OAVI2a,IACFA,EAAc,CACZkD,OAAQ,IAAItL,IACZib,cAAe,IAAIruB,IACnBsuB,iBAAkB,IAAIlb,KAGxBvR,KAAK2Z,YAAY3R,IAAIhJ,EAAQ2a,IAGxBA,CACT,CAEO+S,kBAAkB1tB,EAAgBqc,G,MACvC,IAAIrb,KAAK0a,gBAAgBiF,QAAQ3gB,GAC/B,OAAO2C,QAAQC,QAAO,EAAA2V,EAAA,GAAU,0BAGlC,MAAMmR,EAAQ1oB,KAAKinB,oBAAoBjoB,GACvC,IAAI0K,EACJ,GAAG2R,EAAS,CAEV,GADA3R,EAAUgf,EAAM+D,iBAAiBloB,IAAI8W,GAClC3R,EACD,OAAOA,EAGT,GAAGgf,EAAM8D,cAAc/tB,IAAI4c,GACzB,OAAO1Z,QAAQM,aAAQhD,GAGzBypB,EAAM+D,iBAAiBzkB,IAAIqT,EAAS3R,GAAU,S,CAqDhD,OAlDsB,QAAtB,EAAAgf,EAAMiE,wBAAgB,QAAtBjE,EAAMiE,kBAAqB,EAAA7iB,EAAA,GAAM,GAAGjF,MAAK,KACvC,MAAM4mB,EAAgD,CAAC,EACjDmB,EAAgB,GACtB,IAAI,MAAOvR,EAAS3R,KAAYgf,EAAM+D,iBACpChB,EAASpQ,GAAW3R,EACpBkjB,EAAItsB,MAAK,EAAA2e,GAAA,GAAmB5D,IAG9BqN,EAAM+D,iBAAiB7tB,QAEvB,MAAMiuB,EAAe,KACnB,IAAI,MAAMxR,KAAWoQ,EACnBA,EAASpQ,GAASpZ,aAAQhD,GAC1BypB,EAAM8D,cAAc1tB,KAAKuc,E,EAI7B,GAAGrb,KAAKinB,oBAAoBjoB,KAAY0pB,EAKxC,OAAO1oB,KAAK2T,WAAWC,UAAU,8BAA+B,CAC9DyI,QAASrc,KAAKsc,gBAAgBC,gBAAgBvd,EAAOwd,YACrDK,OAAQ+P,IACP/nB,MAAMioB,IACP,GAAG9sB,KAAKinB,oBAAoBjoB,KAAY0pB,EAaxC,OATA1oB,KAAK+b,aAAa+Q,EAAqB9tB,GAEvC8tB,EAAoBjQ,OAAOhe,SAASqiB,IACd,eAAjBA,EAAWxkB,IACZ+uB,EAASvK,EAAWvkB,IAAIsF,QAAQif,UACzBuK,EAASzsB,G,IAIb8tB,CAAmB,IACzB,SAAUjoB,MAAK,KAChBgoB,IAEAnE,EAAMiE,sBAAmB1tB,EACtBypB,EAAM+D,iBAAiBrZ,MACxBpT,KAAK0sB,kBAAkB1tB,E,IA3BzB6tB,GA6BA,KAGGnjB,GAAWgf,EAAMiE,gBAC1B,CAMOlR,cAAczc,EAAgBqc,G,MACnC,MAAM1B,EAAc3Z,KAAK2Z,YAAYpV,IAAIvF,GACzC,OAA0B,QAAnB,EAAA2a,aAAW,EAAXA,EAAakD,cAAM,eAAEtY,IAAI8W,EAClC,CAEO0R,sBAAsB/tB,EAAgBqc,G,MAC3C,MAAM6F,EAAalhB,KAAKyb,cAAczc,EAAQqc,GAC9C,GAAG6F,EACD,OAAOA,EAGT,MAAMwH,EAAQ1oB,KAAKinB,oBAAoBjoB,GACvC,OAA2B,QAApB,EAAA0pB,aAAK,EAALA,EAAO8D,qBAAa,eAAE/tB,IAAI4c,SAAWpc,EAAYe,KAAK0sB,kBAAkB1tB,EAAQqc,EACzF,CAEOuB,cAA8E5d,EAAgBoD,GACnG,OAAO,EAAA4qB,EAAA,GAAY5qB,GAASA,IACvB,QAASA,GACVpC,KAAKge,kBAAkB6M,gBAAgB7rB,EAAOwd,WAAYpa,EAAO4jB,KAGnE,MAAMvL,EAAOza,KAAK0a,gBAAgB4O,cAActqB,GAWhD,OAVAoD,EAAOya,OAASza,EAAOya,OAAO3Y,KAAKsX,IACjC,GAAe,sBAAZA,EAAM9e,EAMT,OAFC8e,EAAqBf,KAAOA,EAC7Be,EAAM7e,IAAK,EAAA2e,GAAA,GAAkBE,EAAM7e,IAC5B6e,CAAK,IACX3e,OAAOC,SAEHsF,CAAM,GAEjB,CAEO6qB,qBAAwFjuB,EAAgB0K,GAC7G,OAAOA,EAAQ7E,MAAMzC,IACnBpC,KAAK4c,cAAc5d,EAAQoD,GACpBA,IAEX,CAEO4iB,oBAAoBhmB,GACzB,IAAIgB,KAAK0a,gBAAgBiF,QAAQ3gB,GAC/B,OAGF,MAAM6hB,EAAS7gB,KAAKihB,UAAUjiB,GAExBkuB,EAAIrM,EAAO1G,QAAQ3d,QAAU,IAAMwD,KAAKwf,gBAAgBxgB,GAC5D6hB,EAAO1G,QAAQ3S,MAAM,EAAG,KACxB,EAAAwlB,EAAA,GAAYhtB,KAAKurB,WAAW,CAACrP,SAAUld,EAAQmd,MAAO,MAAO/Z,GACpDA,EAAO+X,UAGlB,OAAO,EAAA6S,EAAA,GAAYE,GAAI/S,IACd,CACLD,MAAOC,EAAQgT,QAAO,CAACC,EAAKC,IAAMD,MAASC,EAAEjD,cAAc,GAC3DnF,WAAY9K,EAAQ+K,MAAMjM,GAAWA,EAAOmR,cAAgBpqB,KAAK8hB,gBAAgB7I,QAGvF,CAIQkC,yBAAyBlC,EAA6B2B,EAAiBrB,GAC1EN,IACG2B,EAGF3B,EAAOhc,OAAO2d,QAAS,EAFvB5a,KAAK6a,sBAAsB5B,EAAQM,GAKrCvZ,KAAK8a,uBAAuB7B,IAG9BjZ,KAAKuW,mBAAmByE,yBAAyB/B,EAAOja,OAAQia,EAClE,CAEQ4C,oBAAoBtC,EAAkBqC,GAC5C,MAAM+D,EAAU3f,KAAK4f,mBAAmBrG,GACxCvZ,KAAKyZ,iBAAiBF,GACtBvZ,KAAK2e,gBAAgBpF,GAAUjZ,QAAQsb,GACvC5b,KAAK0Z,mBACLkC,EAAM9P,UACN,MAAMwhB,EAA2C,CAAC,EAClD1R,EAAM/c,SAASlC,IACb2wB,EAAU3wB,IAAM,EAEhB,MAAMqC,EAAS2gB,EAAUpG,EAAW5c,EAC9B0e,EAAUsE,EAAUhjB,OAAKsC,EAEzBga,EAASjZ,KAAKmjB,iBAAiBnkB,EAAQqc,GAC7Crb,KAAKuW,mBAAmByE,yBAAyBhc,EAAQia,GACrDA,IAIJA,EAAOhc,OAAO2d,QAAS,EACvB5a,KAAK8a,uBAAuB7B,GAAO,IAGrC,MAAMkB,EAAUna,KAAKqhB,iBAAiB9H,GAAU,GAChD,IAAI,MAAMN,KAAUkB,EAAS,CAC3B,IAAIlB,EAAOhc,OAAO2d,OAChB,MAGE0S,EAAUttB,KAAKmhB,aAAalI,aACvBA,EAAOhc,OAAO2d,OACrB5a,KAAK8a,uBAAuB7B,GAC5BjZ,KAAKuW,mBAAmByE,yBAAyB/B,EAAOja,OAAQia,G,CAGtE,E,iUChnDF,MAAMsU,GAAc,CAClB,CAAC,eAAgB,iBACjB,CAAC,gBAAiB,kBAClB,CAAC,gBAAiB,mBAGdC,GAAoB,UAEpBC,GAA+B,CACnC/wB,EAAG,eACHO,OAAQ,CAAC,EACTywB,MAAO,EACP/wB,GAAI,EACJ0uB,MAAO,GACPsC,cAAe,GACfC,cAAe,GACfC,aAAc,GACdC,eAAgB,GAChBC,eAAgB,GAChB3N,cAAe,IAGF,MAAM4N,WAAuBvb,EAA5C,c,oBA6FS,KAAA7T,MAAS0M,IACd,GAAIA,EAIG,CACLtL,KAAK0jB,QAAU,CAAC,EAChB1jB,KAAKiuB,WAAa,GAClBjuB,KAAKkuB,gBAAkB,IAAI/vB,IAE3B6B,KAAKmuB,aAAe,CAAC,EACrB,IAAI,MAAMjS,KAAY,KACpBlc,KAAKmuB,aAAajS,GAAYlc,KAAKouB,oBAAoBlS,E,MATzDlc,KAAKkuB,gBAAgBtvB,QACrBoB,KAAKquB,eAYPruB,KAAK6hB,QAAU,IAAc,EAGvB,KAAAyM,qBAAwBjU,IAC3BA,EAAOxd,OACRmD,KAAKuuB,iBAAiBlU,EAAOxd,QACrBmD,KAAK0jB,QAAQrJ,EAAO1d,MAE5BqD,KAAK+c,UAAUrW,cAAc,gBAAiB1G,KAAK0jB,QAAQrJ,EAAO1d,YAC3DqD,KAAK0jB,QAAQrJ,EAAO1d,KAC3B,EAAA6xB,GAAA,GAAcxuB,KAAKiuB,YAAapxB,GAAYA,EAAqCF,KAAO0d,EAAO1d,MAGjGqD,KAAK4H,aAAa,EAGZ,KAAA6mB,sBAAyBpU,IAG/B,MAAMqU,GAAa,EAAAC,GAAA,GAAK3uB,KAAK0jB,SAE7B1jB,KAAK4uB,kBAAiB,GAAM/pB,MAAM6e,IAChC,IAAI,MAAMmL,KAAaH,EAAY,CACjC,MAAMxS,GAAY2S,EACdnL,EAAQnlB,MAAM1B,GAAWA,EAAOF,KAAOuf,KACzClc,KAAKsuB,qBAAqB,CAAC5xB,EAAG,qBAAsBC,GAAIuf,G,CAI5Dlc,KAAK8uB,0BAA0B,CAACpyB,EAAG,0BAA2Bkf,MAAO8H,EAAQxf,KAAKrH,GAAWA,EAAOF,MAAK,GACzG,EAGI,KAAAmyB,0BAA6BzU,IAGnC,MAAMuB,EAAQvB,EAAOuB,MAAMpU,QACvBoU,EAAMmT,SAAS,OACjBnT,EAAM/R,OAAO+R,EAAM,KAAO,KAAgB,EAAI,EAAG,EAAG,MAGtD5b,KAAK6hB,QAAU,KACfjG,EAAM/c,SAASqd,IACb,MAAMrf,EAASmD,KAAK0jB,QAAQxH,UACrBrf,EAAOglB,QACd7hB,KAAKgvB,WAAWnyB,EAAO,IAGzBmD,KAAK+c,UAAUrW,cAAc,eAAgBkV,GAE7C5b,KAAK4H,aAAa,CAmXtB,CA3gBYkV,QAmCR,OAlCA9c,KAAKpB,OAAM,GAEXoB,KAAKge,kBAAkBC,2BAA2B,CAChDgR,mBAAoBjvB,KAAKsuB,qBAEzBY,oBAAqBlvB,KAAKyuB,sBAE1BU,wBAAyBnvB,KAAK8uB,4BAuBhC9uB,KAAK+c,UAAU1W,iBAAiB,kBAAkB,KAChDrG,KAAKyuB,sBAAsB,CAAC/xB,EAAG,uBAAuB,IAGjDsD,KAAKue,gBAAgBrX,WAAWrC,MAAMmC,IACxBhH,KAAKovB,eAAepoB,EAAMinB,YAClC/pB,KAAKrH,IACdmD,KAAKuuB,iBAAiB1xB,GAAQ,GAAO,EAAK,GAC1C,GAEN,CAKQuyB,eAAe1L,GACrBA,EAAUA,EAAQlc,QAElB,MAAM6nB,EAAiBrvB,KAAKmuB,aAAa,MACnCmB,EAAgBtvB,KAAKmuB,aAAa,MAElCoB,EAAsB7L,EAAQ/B,WAAW9kB,GAAwB,wBAAbA,EAAOH,GAA+BG,EAAOF,KAAO,OAY9G,OAX4B,IAAzB4yB,EAA4B7L,EAAQ6L,GAAuBF,EACzD3L,EAAQoC,QAAQuJ,IAErB,EAAAb,GAAA,GAAc9K,GAAU7mB,GAAYA,EAA0BF,KAAO,OACrE+mB,EAAQ7Z,OAAc6Z,EAAQ,KAAO2L,EAAiB,EAAI,EAAG,EAAGC,GAEhEtvB,KAAK6hB,QAAU,KACf6B,EAAQ7kB,SAAShC,WACRA,EAAOglB,OAAO,IAGhB6B,CACT,CAEQ0K,oBAAoBzxB,GAC1B,MAAME,EAAM,gCAAuB,EAAA8xB,GAAA,GAAKlB,KAAa,CAAE9wB,OAWvD,OAVGA,IAAO,KACRE,EAAOI,OAAOuyB,kBAAmB,EACzB7yB,IAAO,OACfE,EAAOI,OAAOwyB,oBAAqB,GAGlC,SAAiB9yB,KAClBE,EAAOujB,cAAgBpgB,KAAK+qB,eAAepM,gBAAgBhiB,IAGtDE,CACT,CA2EQ+K,cACN5H,KAAKue,gBAAgB3W,YAAY,aAAc5H,KAAKiuB,WACtD,CAEOxL,oBAAoBxJ,EAAwCpc,GACjE,IAAIA,EACF,OAAO,EAGT,GAAG,SAAiBA,EAAOF,IACzB,OAAQsc,EAAkBuB,YAAc3d,EAAOF,IAAMqD,KAAK+qB,eAAe/B,sBAAsB/P,EAAOja,QAGxG,MAAMA,EAASia,EAAOja,OAGtB,IAAIgB,KAAKuW,mBAAmB2E,cAAclc,GACxC,OAAO,EAIT,GAAGnC,EAAOixB,eAAeiB,SAAS/vB,GAChC,OAAO,EAIT,GAAGnC,EAAOkxB,eAAegB,SAAS/vB,GAChC,OAAO,EAGT,MAAM/B,EAASJ,EAAOI,OAGtB,GAAGA,EAAOuyB,kBAAqBvW,EAAkBuB,YAAc,KAC7D,OAAO,EAIT,GAAGvd,EAAOyyB,eAAiB1vB,KAAKuW,mBAAmBoZ,eAAe1W,GAChE,OAAO,EAIT,GAAGhc,EAAO2yB,eAAiB5vB,KAAK+hB,wBAAwBC,iBAAiB,CAAChjB,cAAcia,EAAO4W,wBAAyB5W,EAAOmR,cAC7H,OAAO,EAGT,GAAGpqB,KAAK0a,gBAAgBkM,UAAU5nB,GAAS,CAEzC,GAAG/B,EAAO6yB,YAAc9vB,KAAK0a,gBAAgBqV,YAAY/wB,GACvD,OAAO,EAIT,GAAG/B,EAAO+yB,QAAUhwB,KAAK0a,gBAAgBuV,WAAWjxB,GAClD,OAAO,C,KAEJ,CACL,MAAMG,EAASH,EAAOkxB,WAGtB,GAAGlwB,KAAKgd,gBAAgBmT,MAAMhxB,GAC5B,QAASlC,EAAOmzB,KAIlB,GAAGnzB,EAAOozB,eAAiBrwB,KAAKgd,gBAAgBsT,UAAUnxB,GACxD,OAAO,EAIT,GAAGlC,EAAOszB,UAAYvwB,KAAKgd,gBAAgBsT,UAAUnxB,GACnD,OAAO,C,CAIX,OAAO,CACT,CAEOqxB,sBAAsBvX,EAAgBiD,GAC3C,OAAOlc,KAAKyiB,oBAAoBxJ,EAAQjZ,KAAK0jB,QAAQxH,GACvD,CAEOgE,UAAUhE,GACf,OAAOlc,KAAK0jB,QAAQxH,EACtB,CAEOyH,aACL,OAAO3jB,KAAK0jB,OACd,CAEO2K,eACL,MAAM3K,EAAU1jB,KAAK2jB,aACrB,IAAI,MAAMzH,KAAYwH,EACjB,UAAkBxH,IAIrBlc,KAAKsuB,qBAAqB,CACxB5xB,EAAG,qBACHC,IAAKuf,GAGX,CAEauU,gBAAgBzxB,EAAgBkd,G,0CAC3C,MAAMrf,EAASmD,KAAK0jB,QAAQxH,GAEtB/a,EAAQtE,EAAOujB,cAAc3lB,QAAQuE,GACrCuoB,GAAuB,IAAXpmB,EAOlB,GALGomB,IACD1qB,EAAOgxB,aAAahkB,OAAO1I,EAAO,GAClCtE,EAAOujB,cAAcvW,OAAO1I,EAAO,KAGjComB,EAAW,CACb,GAAG1qB,EAAOgxB,aAAarxB,eAAiBwD,KAAK2T,WAAW+c,aAAaC,0BACnE,OAAOhvB,QAAQC,QAAO,EAAA2V,EAAA,GAAU,4BAGlC1a,EAAOgxB,aAAa/H,QAAQ9lB,KAAK0a,gBAAgBkW,iBAAiB5xB,IAClEnC,EAAOujB,cAAc0F,QAAQ9mB,E,CAG/B,OAAOgB,KAAKivB,mBAAmBpyB,EACjC,G,CAEOg0B,mBAAmBh0B,EAAwBi0B,GAChD,MAAMrI,EAAQlI,KAAK4E,IAAI,KAAMlrB,OAAO+Y,KAAKhT,KAAK0jB,SAASxf,KAAKwB,IAAOA,KAGnE,OAFA7I,GAAS,EAAA8xB,GAAA,GAAK9xB,IACPF,GAAK8rB,EAAQ,EACbzoB,KAAKivB,mBAAmBpyB,OAAQoC,EAAW6xB,EACpD,CAEO7B,mBAAmBpyB,EAAwBk0B,GAAS,EAAOD,GAAU,GAC1E,MAAMpD,EAAQqD,EAAS,EAAI,EAE3B,OAAO/wB,KAAK2T,WAAWC,UAAU,8BAA+B,CAC9D8Z,QACA/wB,GAAIE,EAAOF,GACXE,OAAQk0B,OAAS9xB,EAAYe,KAAKgxB,sBAAsBn0B,KACvDgI,MAAMosB,IAGP,GAAGA,IAODjxB,KAAKsuB,qBAAqB,CACxB5xB,EAAG,qBACHC,GAAIE,EAAOF,GACXE,OAAQk0B,OAAS9xB,EAAYpC,IAG5Bi0B,GAAS,CACV,MAAM5D,EAAsB,GAC5B,IAAI,MAAMhR,KAAYlc,KAAK0jB,QAAS,CAClC,MAAM7mB,EAASmD,KAAK0jB,QAAQxH,KAC1Brf,EAAOglB,QACTqL,EAAE5sB,KAAKzD,E,CAGTA,EAAOglB,QAAU,KAEjB,MAAMjG,EAAQsR,EAAEzM,MAAK,CAACC,EAAGC,IAAMD,EAAEmB,QAAUlB,EAAEkB,UAAS3d,KAAKrH,GAAWA,EAAOF,KAC7EqD,KAAK8uB,0BAA0B,CAC7BpyB,EAAG,0BACHkf,S,CAKN,OAAOqV,CAAI,GAEf,CAEOC,yBAAyBtV,GAC9B,OAAO5b,KAAK2T,WAAWC,UAAU,oCAAqC,CACpEgI,UACC/W,MAAK,KACN7E,KAAK8uB,0BAA0B,CAC7BpyB,EAAG,0BACHkf,SACA,GAEN,CAEOoV,sBAAsBn0B,GAC3B,MAAMyZ,GAAI,EAAAqY,GAAA,GAAK9xB,GAOf,OAFAmD,KAAKmxB,0BAA0Bt0B,GAExByZ,CACT,CAEQ6a,0BAA0Bt0B,IAChC,EAAAirB,GAAA,GAAejrB,EAAOkxB,gBAAgB,CAAC/uB,EAAQqF,KAC1CxH,EAAOujB,cAAc2O,SAAS/vB,KAC/BnC,EAAO+wB,cAAc/jB,OAAOxF,EAAK,GACjCxH,EAAOkxB,eAAelkB,OAAOxF,EAAK,G,GAGxC,CA0BOynB,qBACL5P,EACApe,EAA2D,gBAE3D,MAAMjB,EAASmD,KAAKkgB,UAAUhE,GACxBkV,EAAQv0B,aAAM,EAANA,EAASiB,GACvB,KAAIszB,aAAK,EAALA,EAAO50B,QACT,OAIF,MAAM60B,EAAgBD,EAAMv0B,QAAQy0B,IAClC,MAAMtyB,EAASgB,KAAK0a,gBAAgB3b,UAAUuyB,GACxCC,EAAoBvxB,KAAKkuB,gBAAgBzvB,IAAIO,GAC7Cia,EAASjZ,KAAKuW,mBAAmB2E,cAAclc,GAMrD,OADgBuyB,IAAsBtY,CACzB,IAGf,IAAIoY,EAAc70B,OAKhB,OAGF,MAAMg1B,EAAiBH,EAAcntB,KAAKotB,IACxC,MAAMtyB,EAASgB,KAAK0a,gBAAgB3b,UAAUuyB,GAQ9C,OAPgBtxB,KAAKuW,mBAAmBgJ,mBAAmB+R,GAC1DzsB,MAAMoU,IACLjZ,KAAKkuB,gBAAgBpvB,IAAIE,GAElBia,OAASha,EAAYD,IAGhB,IAYhB,OATsB2C,QAAQyQ,IAAIof,GAAgB3sB,MAAM4sB,KACtDA,EAAiBA,EAAe50B,OAAOC,UACpBN,M,GAQvB,CAEaoyB,iBAAiB8C,GAAY,G,0CACxC,MAAM1e,EAAO/Y,OAAO+Y,KAAKhT,KAAK0jB,SAC9B,GAAG1Q,EAAKxW,OAASgxB,KAAsBkE,EACrC,OAAO1e,EAAK9O,KAAKgY,GAAalc,KAAK0jB,QAAQxH,KAAWuE,MAAK,CAACC,EAAGC,IAAMD,EAAEmB,QAAUlB,EAAEkB,UAGrF,MAAM6B,QAAgB1jB,KAAK2T,WAAWge,gBAAgB,6BAEtD,OADkB3xB,KAAKovB,eAAe1L,GACrBxf,KAAKrH,GAAWmD,KAAKuuB,iBAAiB1xB,EAAQ60B,KAAY70B,OAAOC,QACpF,G,CAEO80B,6BACL,OAAO5xB,KAAK2T,WAAWC,UAAU,qCACnC,CAEO2a,iBAAiB1xB,EAAsBwd,GAAS,EAAMwX,GAG3C,wBAAbh1B,EAAOH,IACRG,EAASmD,KAAKmuB,aAAa,QAG7B,EAAApG,GAAA,GAA2BlrB,GACvB,SAAiBA,EAAOF,MAC1B4wB,GAAY1uB,SAAQ,EAAEkC,EAAM+wB,OAC1B,EAAA/J,GAAA,GAA2BlrB,GAC3BA,EAAOi1B,GAAMj1B,EAAOkE,GAAMmD,KAAKuW,GAASza,KAAK0a,gBAAgB3b,UAAU0b,IAAM,IAG/Eza,KAAKmxB,0BAA0Bt0B,GAE/BA,EAAO+wB,cAAgB/wB,EAAOgxB,aAAa7pB,OAAOnH,EAAO+wB,eACzD/wB,EAAOkxB,eAAiBlxB,EAAOujB,cAAcpc,OAAOnH,EAAOkxB,iBAG7D,MAAMgE,EAAY/xB,KAAK0jB,QAAQ7mB,EAAOF,IAiBtC,OAhBGo1B,EACD93B,OAAOC,OAAO63B,EAAWl1B,GAEzBmD,KAAK0jB,QAAQ7mB,EAAOF,IAAME,EAG5BmD,KAAKgvB,WAAWnyB,GAEZg1B,IACCxX,EACDra,KAAK+c,UAAUrW,cAAc,gBAAiB7J,GACrCk1B,GACT/xB,KAAK+c,UAAUrW,cAAc,aAAc7J,IAIxCA,CACT,CAEQmyB,WAAWnyB,QACKoC,IAAnBpC,EAAOglB,QACLhlB,EAAOglB,SAAW7hB,KAAK6hB,UACxB7hB,KAAK6hB,QAAUhlB,EAAOglB,QAAU,IAGlChlB,EAAOglB,QAAU7hB,KAAK6hB,WACtB,EAAA2M,GAAA,GAAcxuB,KAAKiuB,YAAa+D,GAAYA,EAAQr1B,KAAOE,EAAOF,KAClEqD,KAAKiuB,WAAW3tB,KAAKzD,GACrBmD,KAAK4H,cAET,CAEaqqB,oBAAoB/V,G,0CAC/B,GAAG,SAAiBA,GAClB,OAAO,EAGT,MAAMC,QAAcnc,KAAK2T,WAAWyI,SAAS,WAG7C,OAF0Bpc,KAAKiuB,WAAWpxB,QAAQA,IAAY,SAAiBA,EAAOF,MAAK6K,MAAM,EAAG2U,GAAO+I,MAAMroB,GAAWA,EAAOF,KAAOuf,GAG5I,G,4BCnjBa,SAASgW,GAAYC,EAAkBC,GAGpDA,EAAavzB,SAASwzB,IACpBp4B,OAAOq4B,oBAAoBD,EAASE,WAAW1zB,SAASoB,IACtD,MAAMmE,EAA4BnK,OAAOu4B,yBAAyBH,EAASE,UAAWtyB,IAAShG,OAAO2J,OAAO,MAIvF,gBAAT3D,GAIbhG,OAAOw4B,eACLN,EAAYI,UACZtyB,EACAmE,EACD,GACD,GAkBN,CCAA,MAAMsuB,GAgBJ5yB,cAfO,KAAA6yB,aAA6B,CAClCC,kBAAmB,GACnBC,kBAAmB,CAAC,EACpBC,YAAa,KACbC,YAAa,MAGP,KAAAC,cAAqD,CAAC,EACtD,KAAAC,UAAW,EAEX,KAAA9yB,KAAM,EAAAqI,EAAA,IAAO,UAAW,WAAiB,UAAgB,KAAAD,KACzD,KAAAF,MAAQ,KAER,KAAA6qB,cAA2E,CAAC,EAyH7E,KAAAC,qBAAuB,CAACC,EAAoB33B,EAE9C,CAAC,KAEJ,MAAM43B,EAAc,CAClBhQ,KAAM+P,EAAc/P,KACpBiQ,IAAKF,EAAcE,IACnBC,SAAUH,EAAcI,WAM1B,OAFAxzB,KAAKqI,OAASrI,KAAKG,IAAIkI,MAAM,uBAAwB+qB,GAE9CA,EAAc12B,GACnB,IAAK,iBACL,IAAK,sBACHsD,KAAKyzB,qBACL,MAEF,IAAK,cACHzzB,KAAK0zB,cAAcN,EAAc/Y,OAAQgZ,GACzC,MAEF,IAAK,qBACL,IAAK,yBAA0B,EAC7B,EAAAtL,GAAA,GAAwEqL,GACxEpzB,KAAKqI,OAASrI,KAAKG,IAAIkI,MAAM,8CAA+C,OAAF,UAAM+qB,IAChF,MAAMlJ,EAAQkJ,EAAcn2B,OAAOusB,IAC7B3R,EAAUub,EAAiD/J,UAAYa,EAAQlqB,KAAK0a,gBAAgB1b,OAAUo0B,EAA6Ch0B,SAC3Ju0B,EAAQP,EAAiD5zB,QAC5D4zB,EAAiD5zB,QAAQH,UAAS,GACjE+zB,EAA6Ch0B,QAAQC,UAAS,IAAUW,KAAK0a,gBAAgB1b,OAEjGgB,KAAK0zB,cAAc,CACjBh3B,EAAG,mBACHmF,QAAS,CACPnF,EAAG,UACHO,OAAQm2B,EAAcn2B,OACtBN,GAAIy2B,EAAcz2B,GAClB0sB,QAASrpB,KAAK0a,gBAAgB4O,cAAczR,EAAOxY,YACnDkZ,QAASvY,KAAK0a,gBAAgB4O,cAAcqK,GAC5CtQ,KAAM+P,EAAc/P,KACpBxhB,QAASuxB,EAAcvxB,QACvB+xB,SAAUR,EAAcQ,SACxBC,SAAUT,EAAcS,SACxBC,SAAUV,EAAcU,UAE1B9N,IAAKoN,EAAcpN,IACnB+N,UAAWX,EAAcW,WACxBV,GACH,K,CAGF,IAAK,kBACL,IAAK,UACHrzB,KAAKgd,gBAAgBgL,aAAaoL,EAAc1a,MAAOjd,EAAQu4B,UAC/Dh0B,KAAKsc,gBAAgB2L,aAAamL,EAAclL,MAAOzsB,EAAQu4B,UAE/DZ,EAAcvK,QAAQhqB,SAASwb,IAC7Bra,KAAK0zB,cAAcrZ,EAAQgZ,EAAY,IAEzC,MAEF,QACErzB,KAAKG,IAAI2C,KAAK,yBAA0BswB,G,EAtL5CpzB,KAAKi0B,cAAa,EACpB,CAEQC,WACN,MAAMr6B,EAAOmG,KACbA,KAAK2yB,aAAe,IAAIwB,MAAMn0B,KAAK2yB,aAAc,CAC/C3qB,IAAK,SAAStF,EAA2C0E,EAA8ChD,GAIrG,OAFA1B,EAAO0E,GAAOhD,EACdvK,EAAKu6B,oBACE,CACT,GAEJ,CAEOA,mBACL,MAAMC,EAAKr0B,KAAK2yB,aAChB3yB,KAAKue,gBAAgB3W,YAAY,UAAW,CAC1C0rB,IAAKe,EAAGf,IACRtN,IAAKqO,EAAGrO,IACR3C,KAAMgR,EAAGhR,MAEb,CAEQiR,sB,MACN,MAAMttB,EAAQhH,KAAK2yB,aACb4B,EAAUvtB,EAAMssB,IAAM,EACtBkB,EAAqBxtB,EAAM6rB,kBAAkB0B,GACnD,IAAIC,EACF,OAAO,EAGT,MAAM3L,EAAU2L,EAAmB3L,QACnC,IAAI,IAAInjB,EAAI,EAAGlJ,EAASqsB,EAAQrsB,OAAQkJ,EAAIlJ,IAAUkJ,EACpD1F,KAAK+oB,WAAWF,EAAQnjB,IAmB1B,OAhBAsB,EAAMssB,IAAMkB,EAAmBlB,IAC5BkB,EAAmBnR,MAAQrc,EAAMqc,KAAOmR,EAAmBnR,OAC5Drc,EAAMqc,KAAOmR,EAAmBnR,aAE3Brc,EAAM6rB,kBAAkB0B,IAE3Bv0B,KAAKs0B,wBACU,QAAjB,EAAAttB,EAAM8rB,mBAAW,eAAE2B,cACnBztB,EAAMssB,KAAOtsB,EAAM8rB,YAAY2B,cAC3BztB,EAAM8rB,YAAY4B,mBAGb1tB,EAAM8rB,YAAY2B,YAFzBz0B,KAAK20B,sBAAsB3tB,KAMxB,CACT,CAEQ4tB,oBAAoBlP,GAC1B,MAAMmP,EAAWnP,EAAY1lB,KAAK8mB,gBAAgBpB,GAAa1lB,KAAK2yB,aACpE,IAAIkC,EAASjC,kBAAkBp2B,OAC7B,OAAO,EAGTq4B,EAASjC,kBAAkBnS,MAAK,CAACC,EAAGC,IAC3BD,EAAEsF,IAAMrF,EAAEqF,MAInB,IAAI8O,EAASD,EAAS7O,IAClB+O,EAAU,EACVC,EAAY,EAChB,IAAI,IAAItvB,EAAI,EAAGlJ,EAASq4B,EAASjC,kBAAkBp2B,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CAC1E,MAAM2U,EAASwa,EAASjC,kBAAkBltB,GAC1CovB,GAAUza,EAAO0Z,UACde,GAAUza,EAAO2L,MAClB+O,EAAU1a,EAAO2L,IACjBgP,EAAYtvB,E,CAIhB,IAAIqvB,EACF,OAAO,EAGT/0B,KAAKqI,OAASrI,KAAKG,IAAIkI,MAAM,0BAA2B0sB,EAASF,EAASjC,kBAAkBprB,MAAM,EAAGwtB,EAAY,IAEjHH,EAAS7O,IAAM+O,EACf,IAAI,IAAIrvB,EAAI,EAAGA,GAAKsvB,IAAatvB,EAAG,CAClC,MAAM2U,EAASwa,EAASjC,kBAAkBltB,GAG1C1F,KAAK+oB,WAAW1O,E,CAYlB,OAVAwa,EAASjC,kBAAkB/oB,OAAO,EAAGmrB,EAAY,IAE7CH,EAASjC,kBAAkBp2B,QAAUq4B,EAAS/B,cAC5C+B,EAAS/B,YAAY2B,mBAGhBI,EAAS/B,YAAY4B,YAF5B10B,KAAK20B,sBAAsBE,KAMxB,CACT,CAEOpB,qBACDzzB,KAAK2yB,aAAaI,aACpB/yB,KAAKi1B,eAET,CAEOC,mBAAmB7a,GACxBra,KAAKmzB,qBAAqB,CACxBz2B,EAAG,cACH2d,UAEJ,CAsEQ4a,cAActtB,GAAQ,GAE5B,MAAMgrB,EAAe3yB,KAAK2yB,aACpBwC,EAAaxC,EAAaI,YAC5BoC,IACFxC,EAAaE,kBAAoB,CAAC,EAClCF,EAAaC,kBAAoB,IAGnC5yB,KAAK20B,sBAAsBhC,GAE3B,MAAMjpB,EAAU1J,KAAK2T,WAAWC,UAAU,wBAAyB,CACjEoS,IAAK2M,EAAa3M,IAClBoP,gBAAiBztB,EAA+B,UAAO1I,EACvDokB,KAAMsP,EAAatP,KACnBgS,KAAM,GACL,CACDrwB,QAAS,aACRH,MAAMywB,IAGP,GAFAt1B,KAAKqI,OAASrI,KAAKG,IAAIkI,MAAM,kBAAmBitB,GAEtB,4BAAvBA,EAAiB54B,EAIlB,OAHAsD,KAAKqI,OAASrI,KAAKG,IAAIkI,MAAM,mBAAoBitB,EAAiBhC,KAClEX,EAAatP,KAAOiS,EAAiBjS,UACrCsP,EAAaW,IAAMgC,EAAiBhC,KAStC,GAJG3rB,GACD3H,KAAK+c,UAAUrW,cAAc,uBAGL,8BAAvB4uB,EAAiB54B,EAAmC,CACrDsD,KAAKgd,gBAAgBgL,aAAasN,EAAiB5c,OACnD1Y,KAAKsc,gBAAgB2L,aAAaqN,EAAiBpN,OAKnDoN,EAAiBC,cAAc12B,SAASwb,IACtC,OAAOA,EAAO3d,GACZ,IAAK,uBACL,IAAK,0BACL,IAAK,2BAEH,YADAsD,KAAK0zB,cAAcrZ,GAIvBra,KAAK+oB,WAAW1O,EAAO,IAIzBib,EAAiBE,aAAa32B,SAAS42B,IACrCz1B,KAAK+oB,WAAW,CACdrsB,EAAG,mBACHmF,QAAS4zB,EACTzP,IAAK2M,EAAa3M,IAClB+N,UAAW,GACX,IAGJ,MAAM2B,EAAmC,uBAAvBJ,EAAiB54B,EAA6B44B,EAAiBtuB,MAAQsuB,EAAiBK,mBAC1GhD,EAAaW,IAAMoC,EAAUpC,IAC7BX,EAAa3M,IAAM0P,EAAU1P,IAC7B2M,EAAatP,KAAOqS,EAAUrS,I,MAE9BsP,EAAa3M,IAAMsP,EAAiBtP,IACpC2M,EAAatP,MAAQ/U,KAAK1J,MAAQ,IAAO,GAAK5E,KAAKujB,YAAYC,6BACxDmP,EAAaW,IAEpBtzB,KAAKgzB,cAAgB,CAAC,EAEtBhzB,KAAKG,IAAI2C,KAAK,iBAAkBwyB,EAAiB54B,GACjDsD,KAAK41B,sBAKP,GAA0B,4BAAvBN,EAAiB54B,EAClB,OAAOsD,KAAKi1B,gBAEZj1B,KAAKqI,OAASrI,KAAKG,IAAIkI,MAAM,oB,IAQjC,OAJI8sB,GACFn1B,KAAK61B,UAAUlD,EAAcjpB,GAGxBA,CACT,CAEQirB,sBAAsB3tB,GACzBA,EAAM8rB,cACP/tB,aAAaiC,EAAM8rB,YAAY9tB,SAC/BgC,EAAM8rB,YAAc,KAExB,CAEQgD,qBAAqBpQ,GAC3B,MAAMqQ,EAAe/1B,KAAK8mB,gBAAgBpB,GACpCyP,EAAaY,EAAahD,YAC5BoC,IACFY,EAAanD,kBAAoB,IAGnC5yB,KAAK20B,sBAAsBoB,GAE3B,MAAM51B,EAAMH,KAAKqI,MAAQrI,KAAKG,IAAI61B,WAAW,wBAA0BtQ,QAAazmB,EAE9EyK,EAAU1J,KAAK2T,WAAWC,UAAU,+BAAgC,CACxEyI,QAASrc,KAAKsc,gBAAgBC,gBAAgBmJ,GAC9C7oB,OAAQ,CAACH,EAAG,8BACZspB,IAAK+P,EAAa/P,IAClB7J,MAAO,KACN,CAACnX,QAAS,aAAaH,MAAMywB,IAK9B,GAJAn1B,SAAAA,EAAKkI,MAAM,cAAeitB,GAC1BS,EAAa/P,IAAM,QAASsP,EAAmBA,EAAiBtP,SAAM/mB,EACtE82B,EAAaE,mBAAqB3nB,KAAK1J,MAEb,mCAAvB0wB,EAAiB54B,EAApB,CAKA,GAA0B,qCAAvB44B,EAAiB54B,EAKlB,cAHOsD,KAAKgzB,cAActN,QAE1B1lB,KAAK+oB,WAAW,CAACrsB,EAAG,sBAAuB6C,WAAYmmB,IAyBzD,GArBA1lB,KAAKgd,gBAAgBgL,aAAasN,EAAiB5c,OACnD1Y,KAAKsc,gBAAgB2L,aAAaqN,EAAiBpN,OAGnD/nB,SAAAA,EAAKkI,MAAM,WAAYitB,EAAiBC,cAAc/4B,OAAQ,yBAC9D84B,EAAiBC,cAAc12B,SAASwb,IACtCra,KAAK+oB,WAAW1O,EAAO,IAGzBla,SAAAA,EAAKkI,MAAM,WAAYitB,EAAiBE,aAAah5B,OAAQ,wBAC7D84B,EAAiBE,aAAa32B,SAAS42B,IACrCz1B,KAAK+oB,WAAW,CACdrsB,EAAG,0BACHmF,QAAS4zB,EACTzP,IAAK+P,EAAa/P,IAClB+N,UAAW,GACX,IAGJ5zB,SAAAA,EAAKkI,MAAM,qBAAsB0tB,EAAa/P,KAEpB,8BAAvBsP,EAAiB54B,IACjB44B,EAAiBr4B,OAAOi5B,MACzB,OAAOl2B,KAAK81B,qBAAqBpQ,GAEjCvlB,SAAAA,EAAKkI,MAAM,4B,KAQf,OAJI8sB,GACFn1B,KAAK61B,UAAUE,EAAcrsB,EAASgc,GAGjChc,CACT,CAEQksB,sBACN51B,KAAKgd,gBAAgBpe,QACrBoB,KAAKsc,gBAAgB1d,QACrBoB,KAAKuW,mBAAmB3X,QAExBoB,KAAK+c,UAAUrW,cAAc,gBAC/B,CAEQmvB,UAAU7uB,EAAqB0C,EAAsCgc,GAC3E1e,EAAM+rB,YAAcrpB,EACpB1J,KAAK+c,UAAUrW,cAAc,sBAAuBgf,GAEpDhc,EAAQ7E,MAAK,KACXmC,EAAM+rB,YAAc,KACpB/yB,KAAK+c,UAAUrW,cAAc,qBAAsBgf,EAAU,IAC5D,KACD1e,EAAM+rB,YAAc,IAAI,GAE5B,CAEOlI,gBAAgBnF,EAAmBM,G,QACxC,IAAIA,EACF,MAAM,IAAIjb,MAAM,iCAAmC2a,GAGrD,OAAmC,QAAnC,KAAO1lB,KAAKgzB,eAActN,UAAS,UAATA,GAAe,CACvCM,MACA4M,kBAAmB,GACnBE,YAAa,KACbC,YAAa,KAEjB,CAEOjM,gBAAgBpB,EAAmBM,GAKxC,YAJqC/mB,IAAlCe,KAAKgzB,cAActN,IACpB1lB,KAAK6qB,gBAAgBnF,EAAWM,GAG3BhmB,KAAKgzB,cAActN,EAC5B,CAEQgO,cAAcrZ,EAAgB5e,EAKjC,CAAC,G,YACJ,IAAIiqB,EACJ,OAAOrL,EAAO3d,GACZ,IAAK,0BACL,IAAK,2BACHgpB,EAAY1lB,KAAK0a,gBAAgB3b,UAAUsb,EAAOxY,QAAQ0W,SAASiE,WACnE,MAIF,IAAK,uBAEH,GADAkJ,EAAYrL,EAAO9a,aACdmmB,KAAa1lB,KAAKgzB,eACrB,OAAO,EAET,MACF,QACK,eAAgB3Y,GAAU,QAASA,IACpCqL,EAAYrL,EAAO9a,YAKzB,MAAM,IAACymB,EAAG,UAAE+N,GAAa1Z,EACnBwa,EAAWnP,EAAY1lB,KAAK8mB,gBAAgBpB,EAAWM,GAAOhmB,KAAK2yB,aAIzE,GAAGkC,EAAS9B,YACV,OAAO,EAGT,GAAgB,yBAAb1Y,EAAO3d,EAMR,QALIm4B,EAASsB,mBACTtB,EAASsB,kBAAqB7nB,KAAK1J,MAvc1B,IAycX5E,KAAK81B,qBAAqBpQ,IAErB,EAGT,GAAgB,qBAAbrL,EAAO3d,GACO,sBAAb2d,EAAO3d,GACM,4BAAb2d,EAAO3d,GACM,6BAAb2d,EAAO3d,EAAkC,CAC3C,MAAMmF,EAAUwY,EAAOxY,QACjBxC,EAAWW,KAAK0a,gBAAgB3b,UAAU8C,EAAQ0W,SAClD6d,EAA+Cv0B,EAAQ+xB,UAAY,CAAC,EAC1E,IAAIp1B,EACJ,GAAGqD,EAAQwnB,UAAYrpB,KAAKgd,gBAAgBqZ,QAAQr2B,KAAK0a,gBAAgB3b,UAAU8C,EAAQwnB,SAAUxnB,EAAQ5E,OAAOq5B,QAA2B93B,EAAS,WACpJ43B,EAAU/M,UAAYrpB,KAAKgd,gBAAgBqZ,QAAQr2B,KAAK0a,gBAAgB3b,UAAUq3B,EAAU/M,WAAa+M,EAAU/M,QAA6B9pB,cAAgBf,EAAS,eAClI,QAAvC,EAAC43B,EAAU/M,eAA4B,eAAE9pB,cAAeS,KAAKsc,gBAAgBia,QAASH,EAAU/M,QAA6B9pB,YAAY,KAAUf,EAAS,eAC5Ja,EAASI,WAAaO,KAAKgd,gBAAgBqZ,QAAQh3B,KAAcb,EAAS,gBAC1Ea,EAASunB,cAAgB5mB,KAAKsc,gBAAgBia,QAAQl3B,EAASmd,cAAgBhe,EAAS,eAO1F,OANAwB,KAAKG,IAAI2C,KAAK,qCAAsCzD,EAAUb,EAAQqD,GACnE6jB,GAAa1lB,KAAKsc,gBAAgBia,QAAQ7Q,GAC3C1lB,KAAK81B,qBAAqBpQ,GAE1B1lB,KAAKyzB,sBAEA,C,MAEJ,GAAG/N,IAAc1lB,KAAKsc,gBAAgBia,QAAQ7Q,GAEnD,OAAO,EAGT,IAAI8Q,EACAC,EAEJ,GAAGzQ,EAAK,CAEN,GADe6O,EAAS7O,KAAO+N,GAAa,GAChC/N,EAsBV,OArBAhmB,KAAKqI,OAASrI,KAAKG,IAAI2C,KAAK,WAAY+xB,EAAUxa,EAAQqL,GAAa1lB,KAAKsc,gBAAgBsB,QAAQ8H,IACpGmP,EAASjC,kBAAkBtyB,KAAK+Z,GAC5Bwa,EAAS/B,aAAgB+B,EAAS9B,cACpC8B,EAAS/B,YAAc,CACrB9tB,QAAS2J,EAAA,cAAe,KACtBkmB,EAAS/B,YAAc,KAEpB+B,EAAS9B,cAITrN,EACD1lB,KAAK81B,qBAAqBpQ,GAE1B1lB,KAAKi1B,gB,GA5fF,KAkgBXJ,EAAS/B,YAAY4B,aAAc,GAC5B,EAGT,GAAG1O,EAAM6O,EAAS7O,IAChB6O,EAAS7O,IAAMA,EACfwQ,GAAS,EAET3B,EAASsB,kBAAoB7nB,KAAK1J,WAC7B,GAAGmvB,EAER,OAAO,EAGNrO,GAAajqB,EAAQ4nB,MAAQrjB,KAAK2yB,aAAatP,KAAO5nB,EAAQ4nB,OAC/DrjB,KAAK2yB,aAAatP,KAAO5nB,EAAQ4nB,K,MAE9B,IAAIqC,GAAajqB,EAAQ63B,IAAM,EAAG,CACvC,MAAMA,EAAM73B,EAAQ63B,IACdC,EAAW93B,EAAQ83B,UAAYD,EAErC,GAAGC,IAAasB,EAASvB,IAAM,GAC1BC,EAAWsB,EAASvB,IAwBrB,OAvBAtzB,KAAKqI,OAASrI,KAAKG,IAAI2C,KAAK,WAAY+xB,EAA8B,QAApB,EAAAA,EAAS/B,mBAAW,eAAE2B,aAErC,QAAnC,KAAAI,EAAShC,mBAAkBU,UAAQ,UAARA,GAAc,CAACD,MAAKjQ,KAAM5nB,EAAQ4nB,KAAMwF,QAAS,KAC5EgM,EAAShC,kBAAkBU,GAAU1K,QAAQvoB,KAAK+Z,GAE9Cwa,EAAS/B,cACX+B,EAAS/B,YAAc,CACrB9tB,QAAS2J,EAAA,cAAe,KACtBkmB,EAAS/B,YAAc,KAEpB+B,EAAS9B,aAIZ/yB,KAAKi1B,eAAe,GAviBjB,OA4iBLJ,EAAS/B,YAAY2B,aACvBI,EAAS/B,YAAY2B,YAAclB,KACnCsB,EAAS/B,YAAY2B,YAAclB,IAE9B,EAIRsB,EAASvB,MAAQA,IAClBuB,EAASvB,IAAMA,EACZ73B,EAAQ4nB,MAAQwR,EAASxR,KAAO5nB,EAAQ4nB,OACzCwR,EAASxR,KAAO5nB,EAAQ4nB,MAG1BoT,GAAS,E,CAIbz2B,KAAK+oB,WAAW1O,GAEbmc,EACDx2B,KAAK40B,oBAAoBlP,GACjB+Q,GACRz2B,KAAKs0B,qBAET,CAEOvL,WAAW1O,GAEhBra,KAAK0G,cAAc2T,EAAO3d,EAAG2d,EAC/B,CAEOqc,0BAA0BhR,G,UAC/B,MAAMiR,EAA2C,QAA/B,KAAG32B,KAAKkzB,eAAcxN,UAAS,UAATA,GAAe,CAACxL,MAAO,KAC7Dyc,EAAazc,MAEf,MAAM0c,EAAK,KACT,MAAM5vB,EAAQhH,KAAK8mB,gBAAgBpB,GAC/B1e,EAAM+rB,aAAiB/rB,EAAMivB,sBAAuB3nB,KAAK1J,MAAQoC,EAAMivB,mBAAsB,OAC/Fj2B,KAAK81B,qBAAqBpQ,E,EAIT,QAArB,EAAAiR,EAAaE,gBAAQ,QAArBF,EAAaE,SAAaloB,EAAA,cAAgBioB,EAAI,MAC9CA,GACF,CAEOE,8BAA8BpR,EAAmBqR,GACtD,MAAMJ,EAAe32B,KAAKkzB,cAAcxN,KACpCiR,aAAY,EAAZA,EAAcE,aAAeF,EAAazc,QAAU6c,IAIxDC,cAAcL,EAAaE,UAC3BF,EAAaE,cAAW53B,SACjBe,KAAKkzB,cAAcxN,GAC5B,CAEOuR,OAAOC,GACTl3B,KAAKizB,WAIRjzB,KAAKG,IAAI,UAETH,KAAKizB,UAAW,EAEhBjzB,KAAKue,gBAAgBrX,WAAWrC,MAAK,EAAEgkB,QAAS7hB,MAC9C,MAAMhE,EAAahD,KAAKue,gBAAgBvb,WAGpCgE,GAAUA,EAAMgf,KAAQhf,EAAMqc,MAiChCppB,OAAOC,OAAO8F,KAAK2yB,aAAc3rB,GAEjChH,KAAKG,IAAI,sBAAuBlG,OAAOC,OAAO,CAAC,EAAG8M,IAElDhH,KAAKi1B,eAAc,KApCnBj1B,KAAKG,IAAI,sBAETH,KAAK2yB,aAAaI,YAAc,IAAIpxB,SAASM,IAC3CjC,KAAK2T,WAAWC,UAAU,mBAAoB,CAAC,EAAG,CAACujB,YAAY,IAAOtyB,MAAMuyB,IAC1Ep3B,KAAK2yB,aAAaW,IAAM8D,EAAY9D,IACpCtzB,KAAK2yB,aAAa3M,IAAMoR,EAAYpR,IACpChmB,KAAK2yB,aAAatP,KAAO+T,EAAY/T,KACrCrjB,KAAKo0B,mBAELp0B,KAAK2yB,aAAaI,YAAc,KAChC9wB,GAAS,GAST,KAwBNjC,KAAK2T,WAAW0jB,oBAAoBr3B,KAAKmzB,sBAGzCnzB,KAAKk0B,WAGFlxB,GACDhD,KAAK2yB,aAAaI,YAAYluB,MAAK,KAAW,O,EAAA,K,OAAA,E,EAAA,YAC5C,MAAMyyB,EAA+B,CACnCC,GAAI,yBACJC,GAAI,sBAGAC,EAAgBC,IACpB9uB,MAAM,cAAc8uB,KAAQ10B,EAAWpD,MAAM,KAAK,SACjDiF,MAAM8yB,GAAwB,MAAfA,EAAIlxB,QAAkBkxB,EAAIC,IAAMD,EAAIv8B,QAAWuG,QAAQC,WACtEiD,MAAMzJ,IACL,MAAMy8B,EAAUP,EAAKI,IAASJ,EAAKC,GAGnCn8B,EAFY,iBAAiB,cAAcy8B,KAAW70B,UAEzC5H,EAEb,MAAM04B,EAA4B,GAG5BzZ,EAA2C,CAC/C3d,EAAG,4BACHo3B,WACAjyB,SALc,EAAAi2B,GAAA,GAAc18B,EAAM04B,GAMlCh2B,KAAM,QACNb,OAAQ,CAAC,EACT86B,WAAYzpB,KAAK1J,MAAQ,IAAO,EAChCoT,WAAO/Y,GAGTe,KAAKk1B,mBAAmB7a,EAAO,GAC/B,EAGE2d,GAAY,EAAAC,GAAA,GAAa,CAACf,EAAU,OAC1C,IAAI,MAAMgB,KAAYF,EACpB,UACQP,EAAaS,GACnB,K,CACA,MAAM7uB,G,CAIZ,E,YAzC8C,K,6QAyC5C,G,IAGR,EAMF6oB,GAAYQ,GAAmB,CAAC,IAAmBjgB,ICpvB5C,MAAM0lB,WAA0B1lB,EAAvC,c,oBACU,KAAA2lB,gBAIJ,CAAC,CA8DP,CA5DYtb,QACR9c,KAAK+c,UAAU1W,iBAAiB,iBAAiB,EAAErH,SAAQkjB,eACtDA,GAIHliB,KAAKq4B,uBAAuBr5B,EAAO,GAEvC,CAEOs5B,eAAet5B,EAAgBoU,GACpC,MAAMmlB,EAAQv4B,KAAKo4B,gBAAgBp5B,GACnC,YAAYC,IAATmU,IACQmlB,KAGDA,IAASA,EAAMnlB,IAAWmlB,EAAMnlB,aAAiBzR,QAC7D,CAEO02B,uBAAuBr5B,GACzBgB,KAAKo4B,gBAAgBp5B,WACfgB,KAAKo4B,gBAAgBp5B,EAEhC,CAEOw5B,WAAWx5B,EAAgBy5B,EAAgErlB,G,QAChG,MAAMmlB,EAAmC,QAA9B,KAAGv4B,KAAKo4B,iBAAgBp5B,UAAM,UAANA,GAAY,CAAC,EAChD,GAAIu5B,EAAMnlB,GA8BR,OAAOmlB,EAAMnlB,GA9BE,CAEf,MAAMslB,EAAsE,CAC1Eh8B,EAAG,6BACHO,OAAQ,CAAC,EACTwd,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5ChC,SAAUy7B,EAAMz7B,UAGZ27B,EAAmC,CAACzwB,KAAMuwB,EAAMG,MAAOt8B,SAAUo8B,GAC3D,cAATtlB,IACDslB,EAAsBz7B,OAAOC,KAAM,EACnCy7B,EAAgBE,UAAY,QAS9B,MAAMnvB,EAAU1J,KAAK84B,eAAehoB,SAAS6nB,GAC7C,OAAOJ,EAAMnlB,GAAQ1J,EAAQ7E,MAAMk0B,GAC1BR,EAAMnlB,GAAQ4lB,IAAIC,gBAAgBF,I,CAS/C,E,qTC9DK,MAAMG,WAAwBzmB,EAGzBqK,QACR9c,KAAKm5B,MAAQ,IAAI5nB,IAEb1L,IAAiBuzB,mBAIrBp5B,KAAKge,kBAAkBC,2BAA2B,CAChDob,gBAAkBhf,IAChBra,KAAKs5B,SAASjf,EAAOkf,WAAW,EAGlCC,6BAA+Bnf,IAC7Bra,KAAK+c,UAAUrW,cAAc,iBAAkB,CAAC+yB,OAAQpf,EAAOqf,cAAervB,KAAMgQ,EAAOhQ,MAAM,GAGvG,CAEOsvB,WAAWC,EAAiBlZ,EAAemZ,GAChD,OAAO75B,KAAKsU,aAAaC,aAAa,iBAAkBqlB,EAAKlZ,EAAGmZ,EAClE,CAEOP,SAASQ,GACd,MAAMC,EAAyB,uBAAXD,EAAKp9B,EACnBs9B,EAAUh6B,KAAKm5B,MAAM50B,IAAIu1B,EAAKn9B,IAiBpC,OAhBGq9B,GAEDxiB,GAAkBwiB,EAASF,GAGxBC,GACD/5B,KAAKm5B,MAAMt1B,OAAOi2B,EAAKn9B,IAGzBm9B,EAAOE,GACED,GACT/5B,KAAKm5B,MAAMnxB,IAAI8xB,EAAKn9B,GAAIm9B,GAG1B95B,KAAK+c,UAAUrW,cAAc,cAAeozB,GAErCA,CACT,CAEOG,QAAQR,GACb,OAAOz5B,KAAKm5B,MAAM50B,IAAIk1B,EACxB,CAEOS,aAAav9B,GAClB,MAAMm9B,EAAO95B,KAAKi6B,QAAQt9B,GAC1B,MAAO,CACLD,EAAG,iBACHC,GAAIm9B,EAAKn9B,GACTw9B,YAAaL,EAAKK,YAEtB,CAEOC,mBAAmBC,GAExB,OADAr6B,KAAKgd,gBAAgBgL,aAAaqS,EAAe3hB,OAC1C1Y,KAAKs5B,SAASe,EAAed,WACtC,CAEOe,aACL,OAAOt6B,KAAK2T,WAAWC,UAAU,uBAAwB,CACvD5Z,QAAS,EACTugC,cAAe,MACd11B,MAAM21B,GACAx6B,KAAKsU,aAAaC,aAAa,cAAeimB,IAEzD,CAUaC,YAAYt7B,EAAgBu7B,EAA6BC,EAAsBC,G,0CAC1F,MAAMP,QAAuBr6B,KAAK2T,WAAWC,UAAU,oBAAqB,CAC1ExU,QAASY,KAAKgd,gBAAgB6d,aAAa17B,GAC3Cu7B,SAAUA,EACVE,MAAOA,EACPE,WAAW,QAAe,IAC1BH,SAAUA,IAGZ,OAAO36B,KAAKo6B,mBAAmBC,EACjC,G,CAEaU,YAAYtB,EAAgBuB,EAAkBx8B,EAAqCo8B,G,0CAC9F,IAAI56B,KAAKi6B,QAAQR,GACf,OAGF,MAAM5Q,QAAgB7oB,KAAK2T,WAAWC,UAAU,oBAAqB,CACnEgnB,QACAngB,KAAMza,KAAKk6B,aAAaT,GACxBuB,WACAx8B,OAAQ,CACN9B,EAAG8B,GAELy8B,cAAe,MAGjBj7B,KAAKge,kBAAkBmV,qBAAqBtK,EAC9C,G,4BCnGK,MAAMqS,WAAwBzoB,EAArC,c,oBA8DS,KAAA7T,MAAQ,CAAC0M,GAAO,KACrB,GAAIA,EAYFtL,KAAKkoB,MAAQ,CAAC,OAXd,IAAI,MAAM5oB,KAAUU,KAAKkoB,MACvB,GAAI5oB,IACAU,KAAK0mB,aAAayU,aAAa77B,EAAOD,UAAS,IAAQ,CACzD,MAAMse,EAAO3d,KAAKkoB,MAAM5oB,GACxBU,KAAKgd,gBAAgBoe,qBAAqBzd,GAAM,GAEhD3d,KAAKwD,QAAQK,OAAOvE,UACbU,KAAKkoB,MAAM5oB,E,GA8SlB,KAAA+7B,cAAgB,CAAC/7B,EAAgBupB,K,MAGvC7oB,KAAKge,kBAAkBmV,qBAAqBtK,IACJ,QAArC,EAACA,aAAO,EAAPA,EAA6BA,eAAO,eAAErsB,SAAUwD,KAAK2lB,UAAUrmB,IACjEU,KAAK+c,UAAUrW,cAAc,0BAA2BpH,E,CA+f9D,CAj3BYwd,QA0BR,OAzBA9c,KAAKpB,OAAM,GAEXoB,KAAKge,kBAAkBC,2BAA2B,CAOhDqd,yBAA2BjhB,IACzBra,KAAK2T,WAAW4nB,WAAW,4BAA6BvnB,GAC9CA,EAAOqI,QAAsC9c,aAAe8a,EAAO9a,YAC3E,EAGJi8B,8BAAgCnhB,IAC9B,MAAM/a,EAASU,KAAK0a,gBAAgB3b,UAAUsb,EAAOI,MAAM+B,WACrDmB,EAAO3d,KAAKkoB,MAAM5oB,GACrBqe,IACDA,EAAK8d,sBAAwBphB,EAAOohB,sBACpCz7B,KAAK+c,UAAUrW,cAAc,cAAepH,G,IAK3CqC,QAAQyQ,IAAI,CACjBpS,KAAKue,gBAAgBrX,WACrBlH,KAAKwe,mBAAmB/K,YAAY,WACnC5O,MAAK,EAAEmC,GAAQ9B,QAASgjB,EAAO1kB,eAChCxD,KAAKwD,QAAUA,EAEfxD,KAAKioB,aAAaC,GAElBloB,KAAK0mB,aAAargB,iBAAiB,cAAerH,IAC7CA,EAAOS,UAAYO,KAAKwD,QAAQk4B,aAAa18B,EAAOwd,aAIvDxc,KAAKwD,QAAQwE,IAAI,CACf,CAAChJ,EAAOwd,YAAaxc,KAAK4d,QAAQ5e,EAAOwd,aACzC,IAGJxc,KAAK0mB,aAAargB,iBAAiB,gBAAiBrH,KAC/CA,EAAOS,UAAaO,KAAKwD,QAAQk4B,aAAa18B,EAAOwd,aAIxDxc,KAAKwD,QAAQK,OAAO7E,EAAOwd,WAAW,GACtC,GAEN,CAmBOyL,aAAa0T,EAAiB3H,GAC/B2H,EAAiBpD,QACpBoD,EAAiBpD,OAAQ,EAC1BoD,EAAS98B,SAAS8e,GAAS3d,KAAK47B,YAAYje,EAAMqW,KACpD,CAEO4H,YAAYje,EAAYqW,G,cAC7B,IAAIrW,GAAmB,cAAXA,EAAKjhB,EAAmB,OAQpC,MAAMm/B,EAAU77B,KAAKkoB,MAAMvK,EAAKhhB,IAQhC,GAF0B,QAAzB,GAAD,EAACghB,GAAmB1gB,cAAM,UAANA,OAAW,CAAC,GAE5B0gB,EAAsB1gB,OAAOujB,UAAmBvhB,IAAZ48B,EACtC,OAGY,YAAXle,EAAKjhB,QACwBuC,IAA5B0e,EAAKme,yBACO78B,IAAZ48B,GACCA,EAAyBC,qBAC5Bne,EAAKme,mBAAsBD,EAAyBC,oBAGf,oBAAR,QAA5B,EAACne,EAAsB8a,aAAK,eAAE/7B,WACvBihB,EAAsB8a,MAGhC,MAAMsD,EAAkB/7B,KAAKgd,gBAAgBgf,mBAAmBre,EAAMke,GAOhE78B,EAAS2e,EAAKhhB,GAAG0C,UAAS,GAChC,QAAeJ,IAAZ48B,EACD77B,KAAKkoB,MAAMvK,EAAKhhB,IAAMghB,MACjB,CACL,MAAMse,EAAkE,QAApD,EAACJ,EAAsBpD,aAA6B,eAAEz7B,SACpEk/B,EAA+D,QAAjD,EAACve,EAAmB8a,aAA6B,eAAEz7B,SACjEm/B,EAAgBN,EAAyB5+B,OAAOm/B,QAAWze,EAAsB1gB,OAAOm/B,MACxFC,EAAeJ,IAAeC,GAAcC,EAE5CG,EAAeT,EAAQxQ,QAAU1N,EAAK0N,OAAS0Q,EAE/CQ,EAAmBV,EAAyB5+B,OAAOu/B,WAAc7e,EAAsB1gB,OAAOu/B,UACjGX,EAAyB5+B,OAAOw/B,OAAU9e,EAAsB1gB,OAAOw/B,MACvEZ,EAAyB5+B,OAAOy/B,OAAU/e,EAAsB1gB,OAAOy/B,KAE1EllB,GAAkBqkB,EAASle,GAC3B3d,KAAK+c,UAAUrW,cAAc,cAAeiX,EAAKhhB,IAE9C0/B,GACDr8B,KAAK+c,UAAUrW,cAAc,gBAAiB,CAAC1H,YAG9Cs9B,GAAgBC,IACjBv8B,KAAK+c,UAAUrW,cAAc,kBAAmB,CAAC1H,WAGhDm9B,GACDn8B,KAAK+c,UAAUrW,cAAc,oBAAqB,CAACpH,OAAQqe,EAAKhhB,GAAImhB,UAAYH,EAAsB1gB,OAAOm/B,O,CAI9Gp8B,KAAK0mB,aAAayU,aAAan8B,IAChCgB,KAAKwD,QAAQwE,IAAI,CACf,CAAC2V,EAAKhhB,IAAKghB,GAGjB,CAEOC,QAAQjhB,GACb,OAAOqD,KAAKkoB,MAAMvrB,EACpB,CAUOggC,UAAUhgC,EAAY6b,EAAoBokB,EAA6CC,GAC5F,OAAO,EAAAF,GAAA,GAAU38B,KAAK4d,QAAQjhB,GAAK6b,EAAQokB,EAAQC,EACrD,CAEOC,4BAA4BngC,EAAYogC,GAC7C,MAAMpf,EAAO3d,KAAK4d,QAAQjhB,GAC1B,OAAGghB,EAAK8d,uBACH9d,EAAK8d,sBAAsBuB,aAAeD,EAAcC,aAAc,EAAAhnB,EAAA,GAAU2H,EAAK8d,sBAAsBx+B,OAAQ8/B,EAAc9/B,QAC3H0E,QAAQM,UAIZjC,KAAK2T,WAAWC,UAAU,uCAAwC,CACvE6G,KAAMza,KAAK0a,gBAAgBkW,iBAAiBj0B,EAAG0C,UAAS,IACxD09B,kBACCl4B,KAAK7E,KAAKq7B,cAAcxc,KAAK7e,KAAMrD,GACxC,CAcOgpB,UAAUhpB,GACf,MAAMghB,EAAO3d,KAAKkoB,MAAMvrB,GACxB,SAAUghB,GAAoB,YAAXA,EAAKjhB,GAA8B,qBAAXihB,EAAKjhB,EAClD,CAEOugC,YAAYtgC,G,MAKjB,MAAMghB,EAAa3d,KAAKkoB,MAAMvrB,GAC9B,SAAuC,QAA9B,EAACghB,aAAI,EAAJA,EAAuB1gB,cAAM,eAAEigC,UAC3C,CAEOvd,QAAQhjB,G,MACb,MAAMghB,EAAO3d,KAAKkoB,MAAMvrB,GACxB,SAAuC,QAA9B,EAACghB,aAAI,EAAJA,EAAuB1gB,cAAM,eAAEm/B,MAC3C,CAEOrM,YAAYpzB,GACjB,OAAOqD,KAAK2lB,UAAUhpB,KAAQqD,KAAKi9B,YAAYtgC,EACjD,CAEOwgC,SAASxgC,GACd,IAAIygC,GAAO,EACX,MAAMzf,EAAa3d,KAAK4d,QAAQjhB,GAWhC,QAVIghB,GACS,qBAAXA,EAAKjhB,GACM,kBAAXihB,EAAKjhB,GACiC,cAArCihB,EAA+BjhB,GAC/BihB,EAAmB1gB,OAAOuI,MAE1BmY,EAAmB1gB,OAAO0sB,eAC3ByT,GAAO,GAGFA,CACT,CAEO7gB,gBAAgB5f,GACrB,MAAMghB,EAAa3d,KAAK4d,QAAQjhB,GAChC,OAAIghB,GAAUA,EAAsBwc,YAK3B,CACLz9B,EAAG,eACH6C,WAAY5C,EACZw9B,YAAcxc,EAAsBwc,aAA+C,KAP9E,CACLz9B,EAAG,oBAST,CAEO2gC,aAAa1gC,GAClB,OAAOqD,KAAK2lB,UAAUhpB,GAAMqD,KAAKs9B,oBAAoB3gC,GAAMqD,KAAKu9B,iBAAiB5gC,EACnF,CAEO4gC,iBAAiB5gC,GACtB,MAAO,CACLD,EAAG,gBACH8C,QAAS7C,EAEb,CAEO2gC,oBAAoB3gC,GACzB,MAAO,CACLD,EAAG,mBACH6C,WAAY5C,EACZw9B,YAAcn6B,KAAK4d,QAAQjhB,GAAqBw9B,aAA+C,EAEnG,CAEO5D,QAAQ55B,EAAY6gC,GACzB,MAAM7f,EAAO3d,KAAKkoB,MAAMvrB,GACxB,OAAO,EAAAymB,GAAA,GAASzF,KAAU6f,IAAc7f,EAAsB1gB,OAAOujB,IACvE,CAEOid,cAAc9gC,GACnB,MAAMghB,EAAO3d,KAAK4d,QAAQjhB,GAC1B,OAAGqD,KAAK2lB,UAAUhpB,IACRqD,KAAKi9B,YAAYtgC,GAAM,IAAM,KAAOA,EAAK,IAAOghB,EAAsBwc,YAEzE,IAAMx9B,CACf,CAsDO+gC,cAAcjiC,GACnB,OAAOuE,KAAK2T,WAAWC,UAAU,yBAA0BnY,GAASoJ,MAAMgkB,IACxE7oB,KAAKge,kBAAkBmV,qBAAqBtK,GAEzBA,EAAgBX,MAAM,GAAGvrB,KAGhD,CAEOghC,gBAAgBhhC,EAAY8b,GACjC,MAAMmlB,EAAQ59B,KAAKuc,gBAAgB5f,GAC7BkhC,EAAcplB,EAAQvU,KAAK45B,GAAM99B,KAAKgd,gBAAgB6d,aAAaiD,KAEzE,OAAO99B,KAAK2T,WAAWC,UAAU,2BAA4B,CAC3DyI,QAASuhB,EACTllB,MAAOmlB,IACNh5B,KAAK7E,KAAKq7B,cAAcxc,KAAK7e,KAAMrD,GACxC,CAEOohC,WAAW1S,EAAe5S,GAC/B,OAAOzY,KAAK2T,WAAWC,UAAU,sBAAuB,CACtD8E,MAAOD,EAAQvU,KAAK45B,GAAM99B,KAAKgd,gBAAgB6d,aAAaiD,KAC5DzS,UACCxmB,MAAMgkB,IACP7oB,KAAKge,kBAAkBmV,qBAAqBtK,GAE5BA,EAAmCX,MAAM,GAAGvrB,KAGhE,CAWOqhC,aAAarhC,GAClB,OAAOqD,KAAK2T,WAAWC,UAAU,wBAAyB,CACxDyI,QAASrc,KAAKuc,gBAAgB5f,KAC7BkI,KAAK7E,KAAKq7B,cAAcxc,KAAK7e,KAAMrD,GACxC,CAEOshC,YAAYthC,GACjB,OAAOqD,KAAK2T,WAAWC,UAAU,uBAAwB,CACvDyI,QAASrc,KAAKuc,gBAAgB5f,KAC7BkI,KAAK7E,KAAKq7B,cAAcxc,KAAK7e,KAAMrD,GACxC,CAEOuhC,YAAYvhC,EAAYwC,EAAgBg/B,EAAW,KACxD,OAAOn+B,KAAK2T,WAAWC,UAAU,uBAAwB,CACvDpU,QAAS7C,EACTyC,QAASY,KAAKgd,gBAAgB6d,aAAa17B,GAC3Ci/B,UAAWD,IACVt5B,KAAK7E,KAAKq7B,cAAcxc,KAAK7e,KAAMrD,GACxC,CAEO0hC,eAAe1hC,EAAYwC,GAChC,OAAOa,KAAK2T,WAAWC,UAAU,0BAA2B,CAC1DpU,QAAS7C,EACTyC,QAASY,KAAKgd,gBAAgB6d,aAAa17B,KAC1C0F,KAAK7E,KAAKq7B,cAAcxc,KAAK7e,KAAMrD,GACxC,CAEO2hC,UAAU3hC,GACf,OAAOqD,KAAKq+B,eAAe1hC,EAAIqD,KAAKgd,gBAAgBC,UAAUtgB,GAChE,CAEO4hC,MAAM5hC,GACX,OAAOqD,KAAK2lB,UAAUhpB,GAAMqD,KAAKg+B,aAAarhC,GAAMqD,KAAKs+B,UAAU3hC,EACrE,CAEOkH,OAAOlH,GACZ,OAAOqD,KAAK2lB,UAAUhpB,GAAMqD,KAAKw+B,cAAc7hC,GAAMqD,KAAKy+B,WAAW9hC,EACvE,CAEO6hC,cAAc7hC,GACnB,OAAOqD,KAAK2T,WAAWC,UAAU,yBAA0B,CACzDyI,QAASrc,KAAKuc,gBAAgB5f,KAC7BkI,KAAK7E,KAAKq7B,cAAcxc,KAAK7e,KAAMrD,GACxC,CAEO8hC,WAAW9hC,GAEhB,OAAOqD,KAAK2T,WAAWC,UAAU,sBAAuB,CACtDpU,QAAS7C,GAGb,CAEO+hC,YAAY/hC,GACjB,MAAMghB,EAAa3d,KAAK4d,QAAQjhB,GAChC,MAAc,YAAXghB,EAAKjhB,EAAwBiF,QAAQM,QAAQ0b,EAAKhhB,IAC9CqD,KAAK2T,WAAWC,UAAU,uBAAwB,CACvDpU,QAAS7C,IACRkI,MAAMgkB,IACP7oB,KAAKq7B,cAAc1+B,EAAIksB,GACeA,EAA4BA,QAAQtqB,MAAMu/B,GAAc,kBAARA,EAAEphC,IAC1E6C,aAElB,CAEOo/B,eAAehiC,EAAYiiC,EAAkBC,GAClD,MAAMn1B,EAAU1J,KAAK2T,WAAWC,UAAU,0BAA2B,CACnEyI,QAASrc,KAAKuc,gBAAgB5f,GAC9BiiC,aAGF,OAAO5+B,KAAK8+B,wBAAwBniC,EAAI+M,EAASm1B,EACnD,CAEOE,UAAUpiC,EAAYqiC,GAC3B,MAAMC,EAAiC,CACrCviC,EAAG,yBACHwiC,KAAMF,GAGR,IAAIt1B,EAaJ,OAXEA,EADC1J,KAAK2lB,UAAUhpB,GACNqD,KAAK2T,WAAWC,UAAU,qBAAsB,CACxDyI,QAASrc,KAAKuc,gBAAgB5f,GAC9B87B,MAAOwG,IAGCj/B,KAAK2T,WAAWC,UAAU,yBAA0B,CAC5DpU,QAAS7C,EACT87B,MAAOwG,IAIJv1B,EAAQ7E,MAAMgkB,IACnB7oB,KAAKge,kBAAkBmV,qBAAqBtK,EAAQ,GAExD,CAEOsW,UAAUxiC,EAAY0uB,GAC3B,IAAI3hB,EAcJ,OAXEA,EADC1J,KAAK2lB,UAAUhpB,GACNqD,KAAK2T,WAAWC,UAAU,qBAAsB,CACxDyI,QAASrc,KAAKuc,gBAAgB5f,GAC9B0uB,UAGQrrB,KAAK2T,WAAWC,UAAU,yBAA0B,CAC5DpU,QAAS7C,EACT0uB,UAIG3hB,EAAQ7E,MAAMgkB,IACnB7oB,KAAKge,kBAAkBmV,qBAAqBtK,EAAQ,GAExD,CAEOuW,UAAUziC,EAAY0iC,GAC3B,MAAMrgC,EAASrC,EAAG0C,UAAS,GAC3B,OAAOW,KAAK2T,WAAWC,UAAU,yBAA0B,CACzD6G,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5CqgC,UACCx6B,MAAMosB,IACJA,GACDjxB,KAAK+c,UAAUrW,cAAc,gBAAiB1H,GAGzCiyB,IAEX,CAEOqO,WAAW3iC,EAAY4iC,EAA0CxC,GACtE,MAAM/9B,EAAiC,iBAAlB,EAA6BugC,GAAc,EAAAC,GAAA,GAAqBD,GACrF,OAAOv/B,KAAK2T,WAAWC,UAAU,sBAAuB,CACtDyI,QAASrc,KAAKuc,gBAAgB5f,GAC9B4iC,YAAav/B,KAAK0a,gBAAgBkW,iBAAiB5xB,GACnD+9B,kBACCl4B,MAAMgkB,IAGP,GAFA7oB,KAAKq7B,cAAc1+B,EAAIksB,GAEI,iBAAlB,EAA4B,CACnC,MAAM4W,EAAYnxB,KAAK1J,MAAQ,IAAO,EACtC5E,KAAKge,kBAAkBkX,mBAAmB,CACxCx4B,EAAG,2BACH6C,WAAY5C,EACZ0mB,KAAMoc,EACNC,cAAUzgC,EACVo2B,SAAKp2B,EACLG,QAASJ,EACT2gC,iBAAkBJ,EAClBK,gBAAiB3lC,OAAO+Y,KAAK+pB,EAAc9/B,QAAQT,OAAS,CAC1DE,EAAG,2BACH2mB,KAAMoc,EACN1C,gBACA8C,UAAW7/B,KAAKgd,gBAAgBC,UAAUtgB,GAC1C8d,KAAMza,KAAK0a,gBAAgB4O,cAActqB,GACzC/B,OAAQ,CAAC,QACPgC,G,IAIZ,CAEO6gC,oCAAoCnjC,EAAY4iC,GACrD,OAAOv/B,KAAKs/B,WAAW3iC,EAAI4iC,EAAa,CACtC7iC,EAAG,mBACHsgC,WAAY,EACZ//B,OAAQ,CAAC,GAEb,CAEO8iC,gBAAgBpjC,EAAY4iC,GACjC,OAAOv/B,KAAKs/B,WAAW3iC,EAAI4iC,EAAa,CACtC7iC,EAAG,mBACHsgC,WAAY,EACZ//B,OAAQ,CACN+iC,eAAe,IAGrB,CAEOC,aAAatjC,EAAY4iC,GAC9B,OAAGv/B,KAAK2lB,UAAUhpB,GAAYqD,KAAK+/B,gBAAgBpjC,EAAI4iC,GAC3Cv/B,KAAKq+B,eAAe1hC,EAAK4iC,EAAuBrP,WAC9D,CAEOgQ,eAAevjC,GACpB,OAAOqD,KAAK2T,WAAWge,gBAAgB,uBAAwB,CAC7Dh1B,GAAI,CAAC,CACHD,EAAG,eACH6C,WAAY5C,EACZw9B,YAAa,QAEdt1B,MAAMs7B,IACPngC,KAAKioB,aAAakY,EAAcjY,MAAM,GAE1C,CAEOkY,uBAAuBzjC,EAAYmhB,GACxC,OAAO9d,KAAK0+B,YAAY/hC,GAAIkI,MAAM6gB,GACzB1lB,KAAK2T,WAAWC,UAAU,kCAAmC,CAClEyI,QAASrc,KAAKuc,gBAAgBmJ,GAC9B5H,YACCjZ,KAAK7E,KAAKq7B,cAAcxc,KAAK7e,KAAM0lB,KAE1C,CAEO2a,iBAAiB1jC,EAAYmhB,GAClC,OAAO9d,KAAK2T,WAAWC,UAAU,4BAA6B,CAC5DyI,QAASrc,KAAKuc,gBAAgB5f,GAC9BmhB,YACCjZ,MAAMgkB,IACP7oB,KAAKge,kBAAkBmV,qBAAqBtK,EAAQ,GAExD,CAEOyX,iBAAiB3jC,EAAYmhB,GAClC,OAAO9d,KAAK2T,WAAWC,UAAU,4BAA6B,CAC5D6G,KAAMza,KAAKq9B,aAAa1gC,GACxBmhB,YACCjZ,MAAMgkB,IACP7oB,KAAKge,kBAAkBmV,qBAAqBtK,EAAQ,GAExD,CAEO0X,0BAA0B5jC,EAAY6jC,GAC3C,MAAMC,EAAWzgC,KAAK4W,kBAAkB8pB,kBAAkB/jC,GAM1D,OALG8jC,IACDA,EAASE,oBAAsBH,EAC/BxgC,KAAK+c,UAAUrW,cAAc,mBAAoB/J,IAG5CqD,KAAK2T,WAAWC,UAAU,qCAAsC,CACrE6G,KAAMza,KAAKq9B,aAAa1gC,GACxBgkC,oBAAqBH,IACpB37B,MAAMgkB,IACP7oB,KAAKge,kBAAkBmV,qBAAqBtK,EAAQ,GAExD,CAEO+X,UAAUlb,GACf,OAAO1lB,KAAK2T,WAAWktB,uBAAuB,CAC5Ch4B,OAAQ,qBACRmL,OAAQ,CACNyG,KAAMza,KAAKs9B,oBAAoB5X,IAEjCob,cAAgBC,IACd/gC,KAAKgd,gBAAgBgL,aAAa+Y,EAAYroB,OAC9C1Y,KAAKioB,aAAa8Y,EAAY7Y,OAEvB6Y,EAAY3P,QAGzB,CAEO4P,iBAAiBC,GACtB,OAAOjhC,KAAK2T,WAAWC,UAAU,4BAA6B,CAACqtB,SAC9Dp8B,MAAMgkB,IACL7oB,KAAKge,kBAAkBmV,qBAAqBtK,GAC9BA,EAA4BX,MAAM,GACpCvrB,KAEhB,CAEOukC,cAAc5hC,EAAgBs/B,GACnC,OAAO5+B,KAAK2T,WAAWC,UAAU,yBAA0B,CACzDyI,QAASrc,KAAKuc,gBAAgBjd,GAC9Bs/B,YAEJ,CAEOuC,oBAAoB7hC,GAuFzB,OAJgBU,KAAK2T,WAAWytB,mBAAmB,gCAAiC,CAClF/kB,QAASrc,KAAKuc,gBAAgBjd,IAC7B,CAAC+hC,aAAc,MAEHx8B,MAAMy8B,IACnB,GAA2B,+BAAxBA,EAAkB5kC,EAAoC,CACvDsD,KAAKgd,gBAAgBgL,aAAasZ,EAAkB5oB,OACpD1Y,KAAKsc,gBAAgB2L,aAAaqZ,EAAkBpZ,OAEpD,MAAMqZ,EAAmBD,EAAkBnZ,SAASla,QACpDqzB,EAAkBnZ,SAAS7nB,KAAKihC,E,CAGlC,OAAOD,CAAiB,GAE5B,CAEOE,qBAAqBliC,EAAgBmiC,GAC1C,OAAOzhC,KAAK2T,WAAWge,gBAAgB,gCAAiC,CACtEtV,QAASrc,KAAKuc,gBAAgBjd,GAC9Bw7B,UAAW2G,GAEf,CAEOC,gBAAgBT,GACrB,OAAOjhC,KAAK2T,WAAWC,UAAU,2BAA4B,CAC3DqtB,KAAMA,IACLp8B,MAAM88B,IACHA,EAAyChkB,MAC3C3d,KAAK47B,YAAa+F,EAAyChkB,MAAM,GAG5DgkB,IAEX,CAEOC,eAAetiC,EAAgBs/B,EAAkBiD,GACtD,MAAMn4B,EAAU1J,KAAK2T,WAAWC,UAAU,0BAA2B,CACnEyI,QAASrc,KAAKuc,gBAAgBjd,GAC9Bs/B,WACAiD,WAGF,OAAO7hC,KAAK8+B,wBAAwBx/B,EAAQoK,EAC9C,CAEOo4B,iBAAiBxiC,EAAgBsc,GACtC,MAAMlS,EAAU1J,KAAK2T,WAAWC,UAAU,4BAA6B,CACrEyI,QAASrc,KAAKuc,gBAAgBjd,GAC9Bsc,UAGF,OAAO5b,KAAK8+B,wBAAwBx/B,EAAQoK,EAC9C,CAEOq4B,uBAAuBziC,EAAgBu/B,GAC5C,MAAMn1B,EAAU1J,KAAK2T,WAAWC,UAAU,kCAAmC,CAC3EyI,QAASrc,KAAKuc,gBAAgBjd,KAGhC,OAAOU,KAAK8+B,wBAAwBx/B,EAAQoK,EAASm1B,EACvD,CAEOmD,mBAAmB1iC,GACxB,MAAMmsB,EAA+B,CACnCzrB,KAAK2+B,eAAer/B,EAAQ,IAAI,GAChCU,KAAK+hC,uBAAuBziC,GAAQ,IAGhCoK,EAAU/H,QAAQyQ,IAAIqZ,GAAU5mB,MAAK,KAAM,IACjD,OAAO7E,KAAK8+B,wBAAwBx/B,EAAQoK,EAC9C,CAEOo1B,wBAAgDx/B,EAAgBoK,EAAYm1B,GACjF,OAAGA,EACMn1B,EAGFA,EAAQ7E,MAAMT,GACZpE,KAAKiiC,YAAY,CAAC3iC,IAASuF,MAAK,IAAMT,KAEjD,CAEO69B,YAAYrpB,GACjB,OAAO5Y,KAAK2T,WAAWC,UAAU,uBAAwB,CACvDjX,GAAIic,EAAQ1U,KAAK5E,GAAWU,KAAKuc,gBAAgBjd,OAChDuF,MAAMs7B,IACPngC,KAAKioB,aAAakY,EAAcjY,MAAM,GAE1C,CAEOga,YAAY5iC,EAAgBwe,GACjC,OAAO9d,KAAK0+B,YAAYp/B,GAAQuF,MAAM6gB,GAC7B1lB,KAAK2T,WAAWC,UAAU,uBAAwB,CACvDyI,QAASrc,KAAKuc,gBAAgBmJ,GAC9B5H,YACCjZ,KAAK7E,KAAKq7B,cAAcxc,KAAK7e,KAAM0lB,KAE1C,CAEOyc,eAAe1mC,GAQpB,MAAM,OAAC6D,EAAM,QAAE+b,EAAO,MAAEgQ,EAAK,YAAE+W,EAAW,OAAEC,EAAM,OAAE9gB,GAAU9lB,EAC9D,OAAOuE,KAAK2T,WAAWC,UAAU,0BAA2B,CAC1DyI,QAASrc,KAAKuc,gBAAgBjd,GAC9Bic,UAAU,EAAA0D,GAAA,GAAmB5D,GAC7BgQ,QACAF,cAAeiX,EACfC,SACA9gB,WACC1c,KAAK7E,KAAKq7B,cAAcxc,KAAK7e,KAAMV,GACxC,CAEagjC,iBAAiB7mC,G,qCAM5B,MAAM,OAAC6D,EAAM,MAAE+rB,EAAK,UAAEkX,EAAS,YAAEH,GAAe3mC,EAE1C+mC,QAAoBxiC,KAAK4W,kBAAkB6rB,eAAenjC,GAC1DojC,EAAkBF,EAAYG,iBAAmB3iC,KAAK0a,gBAAgBkW,iBAAiB5wB,KAAK0a,gBAAgB3b,UAAUyjC,EAAYG,kBAExI,OAAO3iC,KAAK2T,WAAWC,UAAU,4BAA6B,CAC5DyI,QAASrc,KAAKuc,gBAAgBjd,GAC9B+rB,QACAuX,WAAYL,EACZpX,cAAeiX,EACftH,WAAW,UACX+H,QAASH,IACR79B,MAAMgkB,IACP7oB,KAAKq7B,cAAc/7B,EAAQupB,GAE3B,MAAMxO,EAAUwO,EAA4BA,QAAQtqB,MAAM8b,GAAwB,4BAAbA,EAAO3d,IAC5E,OAAO,EAAA4e,GAAA,GAAkBjB,EAAOxY,QAAQlF,GAAG,GAE/C,E,+RAEOmmC,uBAAuBxjC,EAAgB+b,EAAiBT,GAC7D,OAAO5a,KAAK2T,WAAWC,UAAU,kCAAmC,CAClEyI,QAASrc,KAAKuc,gBAAgBjd,GAC9Bic,UAAU,EAAA0D,GAAA,GAAmB5D,GAC7BT,WACC/V,KAAK7E,KAAKq7B,cAAcxc,KAAK7e,KAAMV,GACxC,E,YCv0BQ,G,4CChEK,SAASyjC,GAAQtlC,EAAaulC,IACvC,EAAAC,GAAA,GAAiBxlC,KACnBA,EAAM,WAAaA,GAGrB,MAAM+rB,EAAgF,CAAC/rB,OACvF,IAAIylC,EAAWC,EAAgBC,EAC3BC,EAGM,GAAIH,EAAYzlC,EAAI3C,MAAM,+EAAiF,CACnH,MAAMgjC,EAAI,IAAI9E,IAAIv7B,GAClB,IAAI6lC,EAASJ,EAAU,GACpBI,GAAU,SAAkBJ,EAAU,MACvCI,OAASrkC,GAGRqkC,IACDxF,EAAEyF,SAAWD,GAAyB,MAAfxF,EAAEyF,SAAmB,GAAKzF,EAAEyF,WAGrD,MAAMC,EAAW1F,EAAEyF,SAAS/7B,MAAM,GAC5BqI,EAAO2zB,EAAS5jC,MAAM,KAE5B,GAAGiQ,EAAK,IAAqB,MAAfA,EAAK,GAAG,IAAcA,EAAK,GAAGrT,OAAS,EACnD6mC,EAAU,eACL,GAAG,MAAM3oC,KAAK8oC,KAAc,WAA0BA,GAC3DH,EAAU,gBACL,OAAOxzB,EAAK,IACjB,IAAK,WACL,IAAK,cACL,IAAK,WACL,IAAK,YACL,IAAK,UACH,GAAmB,IAAhBA,EAAKrT,SAAiB8mC,EAAQ,CAC/BD,EAAUxzB,EAAK,GACf,K,CAGJ,QACE,GAAIA,EAAK,IAAMA,EAAK,GAAG/U,MAAM,uCAA0D,IAAhB+U,EAAKrT,OAAc,CACxF6mC,EAAU,KACV,K,QAKGF,EAAiB1lC,EAAI3C,MAAM,kDACpCuoC,EAAU,MACDD,EAAU3lC,EAAI3C,MAAM,gCAC7BuoC,EAAU,MAAQD,EAAQ,IAU5B,OALKxpC,OAAeypC,KAClBA,OAAUpkC,GAGZuqB,EAAI6Z,QAAUA,EACP7Z,CACT,CAEA,OAAmB,aAAyBuZ,IDC5C,SAAUU,GAGR,IAAIC,EAEAC,EAYJ,SAASC,EAAY1M,GACnB,EAAA2M,sBAAwB3M,EACxB,EAAA4M,gCAAkC5M,EAASt3B,MAAM,KAAK,EACxD,CA2BA,SAASmkC,IACP,GAAkB,QAAf,EAAAC,WACD,IACE,MAAMC,EAAiBC,EAAkB,CAACC,KAAM,UAAWC,OAAQ,UAAWC,QAAQ,IAChFhhB,EAAO,IAAI/U,KACjB+U,EAAKihB,SAAS,GACd,MAAMC,EAASN,EAAeO,OAAOnhB,GACrC,EAAAohB,UAAUC,GAAKH,EAAO3kC,MAAM,KAAK,GACjCyjB,EAAKihB,SAAS,IACd,MAAMK,EAASV,EAAeO,OAAOnhB,GACrC,EAAAohB,UAAUG,GAAKD,EAAO/kC,MAAM,KAAK,E,CACjC,MAAMyJ,GACN3L,QAAQC,MAAM,mBAAoB0L,GAClC,EAAAo7B,UAAY,CAACC,GAAI,KAAME,GAAI,K,CAGjC,CAuBA,SAAgBC,IACd,MAAMC,EAAc,iBAEpB,OADAlB,EAAYkB,GACLnjC,QAAQyQ,IAAI,CACjB,8BACA,8BACA,8BACCvN,MAAK,EAAE6yB,EAAMqN,EAAUC,MACxB,MAAMC,EAA4B,GAalC,OAZAC,EAAmBxN,EAAKyN,QAASF,GACjCC,EAAmBH,EAASI,QAASF,GAW9BG,EAT8B,CACnC1oC,EAAG,qBACH2oC,aAAc,EACdC,UAAWR,EACXG,UACAjrC,QAAS,EACTurC,OAAO,EACPP,UAAWA,EAAUG,SAEM,GAEjC,CAEA,SAAgBK,EAAatO,EAAkBuO,GAE7C,EAAAC,yBAA0B,EAC1B,MAAM/yB,EAAW,WACjB,OAAOhR,QAAQyQ,IAAI,CACjBO,EAASgB,WAAWytB,mBAAmB,uBAAwB,CAC7DkE,UAAWpO,EACXyO,UAAiB,SAEnB,EAIA,8BACA,8BACAhzB,EAASgB,WAAWytB,mBAAmB,wBAAyB,CAC9DkE,UAAWpO,EACX+J,KAAM,IAER,EAAA2E,iBAEJ,CAUA,SAAgBV,EAAmBD,EAAcY,EAA2B,IAC1E,IAAI,MAAMngC,KAAKu/B,EAAS,CAEtB,MAAM5X,EAAI4X,EAAQv/B,GACD,iBAAR,EACPmgC,EAAOvlC,KAAK,CACV5D,EAAG,iBACH0K,IAAK1B,EACLtB,MAAOipB,IAGTwY,EAAOvlC,KAAK,OAAD,QACT5D,EAAG,2BACH0K,IAAK1B,GACF2nB,G,CAKT,OAAOwY,CACT,CAmBA,SAAgBT,EAAaU,GAG3B,OAFAA,EAASC,WAAa,oBAEf9+B,EAAA,MAAiB,CAAC6+B,aAAWjhC,MAAK,KACvCmhC,EAAcF,GACPA,IAEX,CAYA,SAAgBE,EAAcF,GAC5B,MAAMG,EAAkB,EAAApC,sBACxB,GAAGiC,EAASR,YAAcW,EAA1B,CAIA,IACEvC,EAAc,IAAIwC,KAAKC,YAAY,EAAArC,gC,CACnC,MAAMz6B,GACN3L,QAAQC,MAAM,oBAAqB0L,GACnCq6B,EAAc,IAAIwC,KAAKC,YAAY,EAAArC,gCAAgClkC,MAAM,IAAK,GAAG,G,CAGnF,IACE8jC,EAAc,IAAIwC,KAAKC,YAAYL,EAASR,U,CAC5C,MAAMj8B,GACN3L,QAAQC,MAAM,oBAAqB0L,GACnCq6B,EAAc,IAAIwC,KAAKC,YAAYL,EAASR,UAAU1lC,MAAM,IAAK,GAAG,G,CAGtE,EAAAqlC,QAAQrmC,QAER,IAAI,MAAMwnC,KAAUN,EAASb,QAC3B,EAAAA,QAAQj9B,IAAIo+B,EAAOh/B,IAAoBg/B,GAGtCN,EAASd,YACV,EAAAqB,cAAc7pC,OAAS,EACvB,EAAA6pC,cAAc/lC,QAAQwlC,EAASd,UAAUA,WAEzCc,EAASd,UAAUA,UAAUnmC,SAASynC,IACpC,GAAGA,EAAQrmC,KAAM,CACf,MAAMsmC,EAAmBD,EAAQE,aACjC,EAAAvB,QAAQj9B,IAAIu+B,EAAa,CACvB7pC,EAAG,iBACH0K,IAAKm/B,EACLniC,MAAOkiC,EAAQrmC,M,MAMpB,EAAAwmC,sBAAwBR,IACzB,gBAAwB,kBAAmBA,GAC3C,EAAAQ,oBAAsBR,EACtBS,EAAsB9nC,QACtBmlC,KAGejjC,MAAMC,KAAK4lC,SAASC,iBAAiB,UAC7C/nC,SAASgoC,IAChB,MAAMvjC,EAAW,EAAAwjC,QAAQviC,IAAIsiC,GAE1BvjC,GACDA,EAAS+W,Q,IAGf,CAWA,SAAgB0sB,EAAenJ,EAAej3B,EAA2BqgC,EAAc,CAACthC,EAAG,IACzF,MAAM8jB,EAAyC,GAG/C,IAAIyd,EAAY,EA8DhB,OA7DArJ,EAAM9hC,QAHS,0DAGO,CAAChB,EAAOosC,EAASC,EAASC,EAASC,EAAYlb,EAAgBia,KAKnF,GAFA5c,EAAIlpB,KAAK8lC,EAAO5+B,MAAMy/B,EAAW9a,IAE9B+a,EAAI,CAEL,IAAIL,EACJ,OAAOK,GACL,IAAK,KACHL,EAAUF,SAASW,cAAc,KACjC,MAGF,IAAK,KACHT,EAAUF,SAASW,cAAc,KAKrCT,EAAQU,UAAUR,EAAeI,EAAIxgC,EAAMqgC,IAC3Cxd,EAAIlpB,KAAKumC,E,MACJ,GAAGO,EACR5d,EAAIlpB,KAAKqmC,SAASW,cAAc,YAC3B,GAAGD,EAAI,CACZ,MAAMhjC,EAAMgjC,EAAGG,YAAY,KACrBpsC,EAAOisC,EAAG7/B,MAAM,EAAGnD,GAEnB5G,EAAM4pC,EAAG7/B,MAAMnD,EAAM,EAAGgjC,EAAG7qC,OAAS,GAC1C,IAAIkkB,EACJ,GAAGjjB,IAAO,EAAAwlC,GAAA,GAAiBxlC,GAAM,CAC/BijB,EAAIimB,SAASW,cAAc,KAC3B,MAAMG,EAAa1E,GAAQtlC,GAC3BijB,EAAEgnB,KAAOD,EAAWhqC,IACjBgqC,EAAWpE,SAAS3iB,EAAEinB,aAAa,UAAWF,EAAWpE,SAC5D3iB,EAAEhe,OAAS,Q,MAEXge,EAAI/Z,EAAKqgC,EAAYthC,KAElBgb,aAAaknB,mBACdlnB,EAAIA,EAAEmnB,YAGRnnB,EAAEonB,YAAc,GAGlBpnB,EAAE6mB,UAAUR,EAAe3rC,EAAMuL,EAAMqgC,IAEvCxd,EAAIlpB,KAAKogB,E,MACD/Z,GA/Dd,SAA0B6iB,EAAwC7iB,EAA0BqgC,GAC1F,MAAMe,EAAMphC,EAAKqgC,EAAYthC,KAC1B5E,MAAMiD,QAAQgkC,GACfve,EAAIlpB,QAAQynC,GAEZve,EAAIlpB,KAAKynC,EAEb,CAyDMC,CAAiBxe,EAAK7iB,EAAMqgC,GAI9B,OADAC,EAAY9a,EAASrxB,EAAM0B,OACpB,EAAE,IAGRyqC,IAAcrJ,EAAMphC,QACrBgtB,EAAIlpB,KAAKs9B,EAAMp2B,MAAMy/B,IAGhBzd,CACT,CAIA,SAAgBgb,EAAOp9B,EAAkB6gC,GAAQ,EAAOthC,GACtD,MAAMlK,EAAM,EAAAwoC,QAAQ1gC,IAAI6C,GACxB,IAAIw2B,EACJ,GAAGnhC,EACD,GAAa,6BAAVA,EAAIC,IAAoCiK,aAAI,EAAJA,EAAMnK,QAAQ,CACvD,IAAI6wB,EAAI1mB,EAAK,GACI,iBAAR,IAAkB0mB,GAAKA,EAAEvxB,QAAQ,MAAO,KAGjD8hC,EAAQnhC,EAFEinC,EAAYwE,OAAO7a,GAEb,WAAa5wB,EAAiB,W,MAE9CmhC,EADkB,mBAAVnhC,EAAIC,EACJD,EAAI2H,MAGJgD,OAIVw2B,EAAQx2B,EAGV,MAAMhF,EAAS2kC,EAAenJ,EAAOj3B,GACrC,OAAGshC,EACM7lC,EAAO8B,KAAKikC,GAASA,aAAgBC,KAAOD,EAAKL,YAAcK,IAAMprC,KAAK,IAE1EqF,CAgBX,CA3Xa,EAAA6iC,QAA4C,IAAI1zB,IAChD,EAAA80B,cAA+B,GAOjC,EAAAX,yBAA0B,EAE1B,EAAA2C,OAAQ,EAEH,EAAAC,OAAhB,SAAuBC,GACrB,EAAAF,MAAQE,CACV,EAOgB,EAAAC,iBAAhB,WACE,OAAG7E,IACIA,EAAuBhiC,QAAQyQ,IAAI,CACxCnL,EAAA,MAAiB,YACjB,EAAA2+B,kBACC/gC,MAAK,EAAEihC,KACJA,GAEM,KAMN,EAAAjC,uBACFD,EAAYkC,EAASR,WAGvBU,EAAcF,GACPA,GAZEjB,MAaR4D,SAAQ,KACT9E,OAAuB1kC,CAAS,IAEpC,EAoBgB,EAAAypC,cAAhB,SACElE,EACAmE,IAAiB,EAAA3E,YAAc,EAAAA,aAAeQ,GAE9C,EAAAR,WAAaQ,EAEbT,IAEG4E,IACDjC,EAAsB9nC,QACLkC,MAAMC,KAAK4lC,SAASC,iBAAiB,UAC7C/nC,SAASgoC,IAChB,MAAMvjC,EAAW,EAAAwjC,QAAQviC,IAAIsiC,GAE1BvjC,aAAoBslC,GACrBtlC,EAAS+W,Q,IAIjB,EAEgB,EAAAwqB,kBAAiB,EAyBjB,EAAAW,aAAY,EAuBZ,EAAAqD,WAAhB,SAA2B3R,EAAkB+N,GAC3C,OAAO,gCAAwC,sBAAuB,CACpEU,UAAW,aACXL,UAAWpO,EACXlkB,KAAMiyB,GAEV,EAEgB,EAAAC,mBAAkB,EAsBlB,EAAA4D,YAAhB,SAA4B5R,EAAkBuO,GAE5C,OADA7B,EAAY1M,GACLsO,EAAatO,GAAeryB,MAAK,EAAEkkC,EAAWC,EAAWC,EAAgBC,EAAgBlE,EAAWtoC,MACzG,IAAIuoC,EAA4B,GAUhC,MARA,CAACgE,EAAgBC,GAAgBrqC,SAASsqC,IACxCjE,EAAmBiE,EAAEhE,QAAgBF,EAAQ,IAG/CA,EAAUA,EAAQjhC,UAAU,CAAC+kC,EAAU9D,QAAS+D,EAAU/D,SAASpoC,OAAOC,UAE1EisC,EAAU9D,QAAUA,EACpB8D,EAAU/D,UAAYA,EACfI,EAAa2D,EAAU,GAElC,EAEgB,EAAA3D,aAAY,EASf,EAAAQ,gBACS,oBAAX,WAAuD,IAAtBM,KAAgB,YACjDvkC,QAAQM,UAER,8BAA2B4C,MAAMukC,IACrCxvC,OAAessC,KAAOjsC,OAAOC,OAAwB,oBAAX,KAAyBgsC,KAAO,CAAC,EAAGkD,EAAMjE,QAAQ,IAKnF,EAAAa,cAAa,EAoEb,EAAAe,eAAc,EAuEd,EAAAvC,OAAM,EA2CT,EAAAsC,QAAyE,IAAIuC,QAO1F,MAAeC,EAIbxpC,YAAYrE,GACVuE,KAAK6mC,SAAUprC,aAAO,EAAPA,EAASorC,UAAWF,SAASW,cAAc,QAC1DtnC,KAAK6mC,QAAQ0C,UAAUzqC,IAAI,QAE3BkB,KAAKwpC,SAAW/tC,aAAO,EAAPA,EAAS+tC,SACtB/tC,IAAaA,EAAsC2L,KAAQ3L,EAA0C4nB,OACtGrjB,KAAKqa,OAAO5e,GAGd,EAAAqrC,QAAQ9+B,IAAIhI,KAAK6mC,QAAS7mC,KAC5B,EASF,MAAaypC,UAAoBH,EAI/BxpC,YAAYrE,EAA8B,CAAC,G,MACzCwK,MAAM,OAAD,wBAAKxK,GAAO,CAAE+tC,SAA0B,QAAhB,EAAA/tC,EAAQ+tC,gBAAQ,QAAI,cACnD,CAEOnvB,OAAO5e,GAGZ,IAFA,EAAAiuC,GAAA,GAAW1pC,KAAMvE,GAEI,cAAlBuE,KAAKwpC,SACNxpC,KAAK6mC,QAAQiB,YAAc,GAC3B9nC,KAAK6mC,QAAQU,UAAU/C,EAAOxkC,KAAKoH,KAAK,EAAOpH,KAAK2G,WAC/C,CAEL,MAAM0mB,EAAIrtB,KAAK6mC,QAAQ7mC,KAAKwpC,UACtBG,EAAYnF,EAAOxkC,KAAKoH,KAAK,EAAMpH,KAAK2G,WAGrC1H,IAANouB,EAAiBrtB,KAAK6mC,QAAQ+C,QAAQ5pC,KAAKwpC,UAAYG,EACpD3pC,KAAK6mC,QAA6B7mC,KAAKwpC,UAAYG,C,CAE7D,CAEOE,iBAAiBpuC,GACtB,GAAGuE,KAAKoH,MAAQ3L,EAAQ2L,OAAO,EAAA4O,EAAA,GAAUhW,KAAK2G,KAAMlL,EAAQkL,MAI5D,OAAO3G,KAAKqa,OAAO5e,EACrB,EA/BW,EAAAguC,YAAW,EAkCxB,MAAM/C,EAA0D,IAAIn1B,IACpE,SAAS2yB,EAAkBzoC,EAAsC,CAAC,GAChE,MAAMquC,EAAO9rC,KAAKC,UAAUxC,GAC5B,IAAIwoC,EAAiByC,EAAsBniC,IAAIulC,GAM/C,OALI7F,IACFA,EAAiB,IAAIiC,KAAK6D,eAAe,EAAAjG,gCAAkC,SAAW,EAAAE,WAAYvoC,GAClGirC,EAAsB1+B,IAAI8hC,EAAM7F,IAG3BA,CACT,CAEW,EAAAQ,UAAY,CAACC,GAAI,KAAME,GAAI,MAKtC,MAAagE,UAAwBU,EAInCxpC,YAAYrE,G,MACVwK,MAAM,OAAD,wBAAKxK,GAAO,CAAE+tC,SAA0B,QAAhB,EAAA/tC,EAAQ+tC,gBAAQ,QAAI,gBACnD,CAEOnvB,OAAO5e,GAGZ,IAAIL,EACJ,IAHA,EAAAsuC,GAAA,GAAW1pC,KAAMvE,GAGduE,KAAKvE,QAAQ0oC,MAAQnkC,KAAKvE,QAAQ2oC,QAA+C,IAArCnqC,OAAO+Y,KAAKhT,KAAKvE,SAASe,OAA6B,CACpG,MAAMwtC,EAAQhqC,KAAKqjB,KAAK4mB,WACxB7uC,GAAQ,KAAsB,QAAf,EAAA4oC,WAAwBgG,EAAQ,IAAO,GAAKA,IAAQxiC,OAAO,GAAK,KAAO,IAAMxH,KAAKqjB,KAAK6mB,cAAc1iC,OAAO,GAKzG,QAAf,EAAAw8B,aACD5oC,GAAQ,KAAO4uC,EAAQ,GAAK,EAAAvF,UAAUC,GAAK,EAAAD,UAAUG,I,KAElD,CAEL,MAAMX,EAAiBC,EAAkBlkC,KAAKvE,SAC9CL,GAAO,EAAA+uC,GAAA,GAAsBlG,EAAeO,OAAOxkC,KAAKqjB,M,CAGzDrjB,KAAK6mC,QAAgB7mC,KAAKwpC,UAAYpuC,CACzC,EA7BW,EAAAwtC,gBAAe,EAgCZ,EAAAwB,KAAhB,SAAqBhjC,EAAkBT,GACrC,OAAO,IAAI8iC,EAAY,CAACriC,MAAKT,SAAOkgC,OACtC,EAEgB,EAAAwD,MAAhB,SAAsB5uC,GACpB,OAAO,IAAIguC,EAAYhuC,GAASorC,OAClC,EAEgB,EAAAyD,MAAhB,SAAsBzD,EAAsBz/B,EAAkBT,EAA2B6iC,GACvF,OAAO,IAAIC,EAAY,CAAC5C,UAASz/B,MAAKT,OAAM6iC,aAAW3C,OACzD,CACD,CA1fD,CAAU,QAAI,KA6fd,YAEa,GAAKuD,KAGJ,GAAKC,MAGL,GAAKC,MA2BnB,UAAsB,GEnmBf,MAAMC,GAAS,CAAC,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YACxHC,GAAO,CAAC,SAAU,SAAU,UAAW,YAAa,WAAY,SAAU,YAK1EC,GAAiBpnB,IAC5B,MAAMrH,EAAI,IAAI1N,KAAKA,KAAKo8B,IAAIrnB,EAAKsnB,cAAetnB,EAAKunB,WAAYvnB,EAAKwnB,YAChEC,EAAS9uB,EAAE+uB,aAAe,EAChC/uB,EAAEgvB,WAAWhvB,EAAEivB,aAAe,EAAIH,GAClC,MAAMI,EAAY,IAAI58B,KAAKA,KAAKo8B,IAAI1uB,EAAEmvB,iBAAkB,EAAG,IAC3D,OAAO5qB,KAAK6qB,OAAQpvB,EAAEqvB,UAAYH,EAAUG,WARvB,MAQ+C,GAAK,EAAE,EAyF7E,OAAmB,mCAtFZ,SAAuCh9B,GAC5C,MAAMi9B,EAAQ,IAAIh9B,KACZ1J,EAAM0mC,EAAMD,UAAY,IAAO,EAC/B5L,EAAYpxB,EAAKg9B,UAAY,IAAO,EAEpC5vC,EAAsC,CAAC,EAa7C,OAZImJ,EAAM66B,EAjBW,OAiBa6L,EAAMT,YAAcx8B,EAAKw8B,UACzDpvC,EAAQ0oC,KAAO1oC,EAAQ2oC,OAAS,UACxBkH,EAAMX,gBAAkBt8B,EAAKs8B,eACrClvC,EAAQ8vC,KAAO9vC,EAAQ+vC,IAAM,UAC7B/vC,EAAQgwC,MAAQ,WACP7mC,EAAM66B,EAAa,QAAiBgL,GAAca,KAAWb,GAAcp8B,GACpF5S,EAAQiwC,QAAU,SAElBjwC,EAAQgwC,MAAQ,QAChBhwC,EAAQ+vC,IAAM,WAGT,IAAI,mBAAqB,CAC9BnoB,KAAMhV,EACN5S,YACCorC,OACL,GAkEO,MAgBD8E,GAAU,KACVC,GAAc,IAAIC,OAAO,gBACzBC,GAAwB,IAAID,OAAO,yBAA0B,KAC7DE,GAA2B,IAAIF,OAAO,yBAA0B,KAChEG,GAAY,IAAIH,OAAO,0CAA2C,KAClEI,GAAW,IAAIJ,OAAO,mEAAoE,KAC1FK,GAAwB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAgO3E,SAASC,GAAmBC,EAAmBX,EAAeY,GAC5D,MAAMC,GAAc,IAAIh+B,MAAOq8B,cACzBW,EAAQh9B,KAAK1J,MACnB,GAAGynC,GAAgBV,IAAWU,GAAgBC,EAAa,CACzD,MAAMjpB,EAAO,IAAI/U,KACjB+U,EAAKkpB,YAAYF,EAAcZ,EAAO,GACtCpoB,EAAKihB,SAAS,EAAG,EAAG,GACpB,MAAMkI,EAAUnpB,EAAKgoB,UACrB,GAAGmB,EAAUlB,EACX,OAEFjoB,EAAKopB,SAASppB,EAAKunB,WAAa,GAChC,MAAM8B,EAAUrpB,EAAKgoB,UAAY,EAEjCe,EAAM9rC,KAAK,CACT+qB,MAAOshB,GAAmBH,GAC1BA,UACAE,W,CAGN,CAEA,SAASE,GAAkBR,EAAmBZ,EAAaC,GACzD,GAAGoB,GAAkBrB,EAAKC,GAAQ,CAChC,MAAMa,GAAc,IAAIh+B,MAAOq8B,cACzBW,EAAQh9B,KAAK1J,MAEnB,IAAI,IAAIc,EAAI4mC,EAAa5mC,GAAKimC,GAASjmC,IAAK,CAC1C,GAAa,IAAV+lC,GAAuB,KAARD,KA8DJD,EA9D8B7lC,GA+DhC,GAAM,GAAO6lC,EAAO,KAAQ,IAAQA,EAAO,KAAQ,EA9D7D,SAGF,MAAMloB,EAAO,IAAI/U,KACjB+U,EAAKkpB,YAAY7mC,EAAG+lC,EAAOD,EAAM,GACjCnoB,EAAKihB,SAAS,EAAG,EAAG,GAEpB,MAAMkI,EAAUnpB,EAAKgoB,UACrB,GAAGmB,EAAUlB,EACX,SAGFjoB,EAAKkpB,YAAY7mC,EAAG+lC,EAAOD,EAAM,GACjCnoB,EAAKihB,SAAS,EAAG,EAAG,GACpB,MAAMoI,EAAUrpB,EAAKgoB,UAAY,EAC9B3lC,IAAM4mC,EACPF,EAAM9rC,KAAK,CACT+qB,MAAOyhB,GAAkBN,GACzBA,UACAE,YAGFN,EAAM9rC,KAAK,CACT+qB,MAAO0hB,GAAiBP,GACxBA,UACAE,W,EAoCV,IAAoBnB,CA/BpB,CAEA,SAASoB,GAAmBlN,GAC1B,MAAMpc,EAAO,IAAI/U,KAAKmxB,GACtB,OAAO8K,GAAOlnB,EAAKunB,YAAYpjC,MAAM,EAAG,GAAK,IAAM6b,EAAKsnB,aAC1D,CAEA,SAASmC,GAAkBrN,GACzB,MAAMpc,EAAO,IAAI/U,KAAKmxB,GACtB,OAAO8K,GAAOlnB,EAAKunB,YAAYpjC,MAAM,EAAG,GAAK,IAAM6b,EAAKwnB,SAC1D,CAEA,SAASkC,GAAiBtN,GACxB,MAAMpc,EAAO,IAAI/U,KAAKmxB,GACtB,OAAQ,IAAMpc,EAAKwnB,WAAWrjC,OAAO,GAAK,KAAO,KAAO6b,EAAKunB,WAAa,IAAIpjC,OAAO,GAAK,IAAM6b,EAAKsnB,aACvG,CAEA,SAASqC,GAAevN,GACtB,MAAMpc,EAAO,IAAI/U,KAAKmxB,GACtB,OAAO+K,GAAKnnB,EAAK4pB,SACnB,CAEA,SAASJ,GAAkBrB,EAAaC,GACtC,OAAGA,GAAS,GAAKA,EAAQ,IACpBD,GAAO,GAAKA,EAAMU,GAAsBT,EAK/C,CAMA,SAASb,GAASsC,GAwBhBA,EAAIA,EAAE1yC,cACN,IAAI,IAAIkL,EAAI,EAAGA,EAAI,GAAIA,IAErB,GAAwB,IADV6kC,GAAO7kC,GAAGlL,cACfC,QAAQyyC,GACf,OAAOxnC,EAGX,OAAQ,CACV,CC7de,SAASynC,GAA4B/lC,EAAQqQ,EAAgBC,GACvE,eAAgBA,EAAUtQ,KAC3BsQ,EAAUtQ,GAAO,IAAIsQ,EAAUtQ,KAG9BqQ,GAAaA,EAAUrQ,KAASsQ,EAAUtQ,KAC3CqQ,EAAUrQ,GAAK5K,OAASkb,EAAUtQ,GAAK5K,OACtCkb,EAAUtQ,GAAevI,SAAQ,CAACwuB,EAAG3nB,KACpC+R,EAAUrQ,GAAK1B,GAAK2nB,CAAC,IAIvB3V,EAAUtQ,GAAOqQ,EAAUrQ,GAE/B,CDieA,kBA1WO,SAAsB6S,EAAemyB,GAC1C,MAAMc,EAAIjzB,EAAMmzB,OAAO5yC,cAEvB,GAAG0yC,EAAE1wC,OAAS,EACZ,OAGF,GAA0B,IAAvB,QAAQ/B,QAAQyyC,GAAU,CAC3B,MAAM7pB,EAAO,IAAI/U,KACXi9B,EAAOloB,EAAKsnB,cACZc,EAAQpoB,EAAKunB,WACbY,EAAMnoB,EAAKwnB,UACjBxnB,EAAKkpB,YAAYhB,EAAME,EAAOD,GAC9BnoB,EAAKihB,SAAS,EAAG,EAAG,GAEpB,MAAMkI,EAAUnpB,EAAKgoB,UACrBhoB,EAAKkpB,YAAYhB,EAAME,EAAOD,EAAM,GACpCnoB,EAAKihB,SAAS,EAAG,EAAG,GAEpB,MAAMoI,EAAUrpB,EAAKgoB,UAAY,EAMjC,YALAe,EAAM9rC,KAAK,CACT+qB,MAAO,QACPmhB,UACAE,W,CAKJ,GAA8B,IAA3B,YAAYjyC,QAAQyyC,GAAU,CAC/B,MAAM7pB,EAAO,IAAI/U,KACXi9B,EAAOloB,EAAKsnB,cACZc,EAAQpoB,EAAKunB,WACbY,EAAMnoB,EAAKwnB,UACjBxnB,EAAKkpB,YAAYhB,EAAME,EAAOD,GAC9BnoB,EAAKihB,SAAS,EAAG,EAAG,GAEpB,MAAMkI,EAAUnpB,EAAKgoB,UAAY,MACjChoB,EAAKkpB,YAAYhB,EAAME,EAAOD,EAAM,GACpCnoB,EAAKihB,SAAS,EAAG,EAAG,GAEpB,MAAMoI,EAAUrpB,EAAKgoB,UAAY,SAMjC,YALAe,EAAM9rC,KAAK,CACT+qB,MAAO,YACPmhB,UACAE,W,CAKJ,MAAMW,EAySR,SAAsBH,GACpB,MAAM52B,EAAI,IAAIhI,KACd,GAAG4+B,EAAE1wC,QAAU,EACb,OAAQ,EAGV,IAAI,IAAIkJ,EAAI,EAAGA,EAAI,EAAGA,IAGpB,GAFA4Q,EAAEg3B,QAAQh3B,EAAEu0B,UAAY,GAEoC,IAAzDmC,GAAe12B,EAAE+0B,WAAW7wC,cAAcC,QAAQyyC,GACnD,OAAO52B,EAAE22B,SAGb,OAAQ,CACV,CAvToBM,CAAaL,GAC/B,GAAGG,GAAa,EAAG,CACjB,MAAMhqB,EAAO,IAAI/U,KACX1J,EAAMye,EAAKgoB,UAEXmC,EAAWH,EADEhqB,EAAK4pB,SAExB5pB,EAAKiqB,QAAQjqB,EAAKwnB,UAAY2C,GAC3BnqB,EAAKgoB,UAAYzmC,GAClBye,EAAKoqB,QAAQpqB,EAAKgoB,UAAY,QAEhC,MAAME,EAAOloB,EAAKsnB,cACZc,EAAQpoB,EAAKunB,WACbY,EAAMnoB,EAAKwnB,UACjBxnB,EAAKkpB,YAAYhB,EAAME,EAAOD,GAC9BnoB,EAAKihB,SAAS,EAAG,EAAG,GAEpB,MAAMkI,EAAUnpB,EAAKgoB,UACrBhoB,EAAKkpB,YAAYhB,EAAME,EAAOD,EAAM,GACpCnoB,EAAKihB,SAAS,EAAG,EAAG,GAEpB,MAAMoI,EAAUrpB,EAAKgoB,UAAY,EAMjC,YALAe,EAAM9rC,KAAK,CACT+qB,MAAO2hB,GAAeR,GACtBA,UACAE,W,CAKJ,IAAIgB,EACJ,GAAqC,QAAjCA,EAAU1B,GAAU2B,KAAKT,IAyB7B,GAAoC,QAAhCQ,EAAUzB,GAAS0B,KAAKT,IAqC5B,GAAuC,QAAnCQ,EAAU9B,GAAY+B,KAAKT,IAA/B,CAyCA,GAAiD,QAA7CQ,EAAU5B,GAAsB6B,KAAKT,IAAc,CACrD,MAAMU,EAAKF,EAAQ,GACbG,EAAKH,EAAQ,GACbjC,EAAQb,GAASgD,GACvB,GAAGnC,GAAS,EAAG,CACb,MAAMqC,GAAKD,EACX,GAAGC,EAAI,GAAKA,GAAK,GAGf,YADAlB,GAAkBR,EADN0B,EAAI,EACcrC,GAEzB,GAAGqC,GAAKnC,GAGb,YADAQ,GAAmBC,EAAOX,EADLqC,E,EAO3B,GAAoD,QAAhDJ,EAAU3B,GAAyB4B,KAAKT,IAAc,CACxD,MAAMU,EAAKF,EAAQ,GAEbjC,EAAQb,GADH8C,EAAQ,IAEnB,GAAGjC,GAAS,EAAG,CACb,MAAMqC,GAAKF,EACX,GAAGE,EAAI,GAAKA,GAAK,GAGf,YADAlB,GAAkBR,EADN0B,EAAI,EACcrC,GAEtBqC,GAAKnC,IAEbQ,GAAmBC,EAAOX,EADLqC,E,OAtE3B,CACE,IAAIzB,GAAgBa,EACpB,MAAMZ,GAAc,IAAIh+B,MAAOq8B,cAC/B,GAAG0B,EAAeV,GAAS,CACzBU,EAAeV,GACf,IAAI,IAAIjmC,EAAI4mC,EAAa5mC,GAAK2mC,EAAc3mC,IAAK,CAC/C,MAAM2d,EAAO,IAAI/U,KACjB+U,EAAKkpB,YAAY7mC,EAAG,EAAG,GACvB2d,EAAKihB,SAAS,EAAG,EAAG,GAEpB,MAAMkI,EAAUnpB,EAAKgoB,UACrBhoB,EAAKkpB,YAAY7mC,EAAI,EAAG,EAAG,GAC3B2d,EAAKihB,SAAS,EAAG,EAAG,GAEpB,MAAMoI,EAAUrpB,EAAKgoB,UAAY,EACjCe,EAAM9rC,KAAK,CACT+qB,MAAO,GAAK3lB,EACZ8mC,UACAE,W,OAGC,GAAGL,GAAgBC,EAAa,CACrC,MAAMjpB,EAAO,IAAI/U,KACjB+U,EAAKkpB,YAAYF,EAAc,EAAG,GAClChpB,EAAKihB,SAAS,EAAG,EAAG,GAEpB,MAAMkI,EAAUnpB,EAAKgoB,UACrBhoB,EAAKkpB,YAAYF,EAAe,EAAG,EAAG,GACtChpB,EAAKihB,SAAS,EAAG,EAAG,GAEpB,MAAMoI,EAAUrpB,EAAKgoB,UAAY,EACjCe,EAAM9rC,KAAK,CACT+qB,MAAO,GAAKghB,EACZG,UACAE,W,MAvEN,CACE,MAAMkB,EAAKF,EAAQ,GACbG,EAAKH,EAAQ,GACbK,EAAKL,EAAQ,GACnB,IAAIA,EAAQ,KAAOA,EAAQ,GACzB,OAGF,MAAMlC,EAAMwC,SAASJ,GACfnC,EAAQuC,SAASH,GAAM,EAC7B,IAAItC,EAAOyC,SAASD,GACjBxC,GAAQ,IAAMA,GAAQ,KACvBA,GAAQ,KAGV,MAAMe,GAAc,IAAIh+B,MAAOq8B,cAC/B,GAAGkC,GAAkBrB,EAAM,EAAGC,IAAUF,GAAQI,IAAWJ,GAAQe,EAAa,CAC9E,MAAMjpB,EAAO,IAAI/U,KACjB+U,EAAKkpB,YAAYhB,EAAME,EAAOD,GAC9BnoB,EAAKihB,SAAS,EAAG,EAAG,GAEpB,MAAMkI,EAAUnpB,EAAKgoB,UACrBhoB,EAAKkpB,YAAYhB,EAAME,EAAOD,EAAM,GACpCnoB,EAAKihB,SAAS,EAAG,EAAG,GAEpB,MAAMoI,EAAUrpB,EAAKgoB,UAAY,EAMjC,YALAe,EAAM9rC,KAAK,CACT+qB,MAAO0hB,GAAiBP,GACxBA,UACAE,W,MAtDN,CACE,MAAMkB,EAAKF,EAAQ,GACbG,EAAKH,EAAQ,GACbI,EAAIE,SAASJ,GACbK,EAAKD,SAASH,GACpB,GAAGC,EAAI,GAAKA,GAAK,GAAI,CACnB,GAAGG,GAAMtC,IAAWmC,GAAK,GAIvB,YADA3B,GAAmBC,EADL0B,EAAI,EADGG,GAIbA,GAAM,IAGdrB,GAAkBR,EAFN0B,EAAI,EACFG,EAAK,E,MAGbH,GAAKnC,IAAWsC,GAAM,IAG9B9B,GAAmBC,EADL6B,EAAK,EADEH,E,CAwH3B,E,gDEnWO,MAAMI,GAAkE,CAC7EC,IAAK,kBACLC,IAAK,8BACLC,IAAK,0BACLvE,KAAM,mBACNwE,IAAK,YACLC,IAAK,aACLC,IAAK,YACLC,KAAM,aACNC,IAAK,aACLC,IAAK,YACLC,IAAK,YACLC,KAAM,aACNC,IAAK,YACLC,KAAM,aACNC,IAAK,kBACLC,IAAK,iBAGMC,GAAwE,CAAC,EAEtF,IAAI,MAAM3yC,KAAO2xC,GACfgB,GAAwBhB,GAAwB3xC,IAA2BA,ECa7E,IAAI4yC,GAAwB,EAErB,MAAMC,WAAuB38B,EAApC,c,oBAmBU,KAAA48B,oBAAsB,KAC5B,IAAI,MAAM1yC,KAAMqD,KAAKsvC,KAAM,CACzB,MAAMC,EAAMvvC,KAAKsvC,KAAK3yC,GAEnB4yC,EAAIC,2BACED,EAAIC,kBACXxvC,KAAKyvC,cAAcC,mBAAmBH,G,EA2V9C,CA7WYzyB,QACR9c,KAAKsvC,KAAO,CAAC,EACbtvC,KAAK2vC,oBAAsB,CAAC,EAC5B3vC,KAAK4vC,oBAAsB,CAAC,EAE5B,kBAAwCvpC,iBAAiB,uBAAwBwpC,IAC3EA,GACF7vC,KAAKqvC,qB,GAGX,CAaOS,QAAQP,EAAe15B,GAC5B,IAAI05B,GAAiB,kBAAVA,EAAI7yC,EACb,OAGF,MAAMqzC,EAAS/vC,KAAKsvC,KAAKC,EAAI5yC,IAE1B4yC,EAAIS,iBACL7C,GAAyB,iBAAkB4C,EAAQR,GACnDvvC,KAAKiwC,kBAAkBt6B,YAAY45B,EAAIS,eAAgBn6B,IAuBrDk6B,IACF/vC,KAAKsvC,KAAKC,EAAI5yC,IAAM4yC,GAStB,IAAI,IAAI7pC,EAAI,EAAGlJ,EAAS+yC,EAAIW,WAAW1zC,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CAC9D,MAAMyqC,EAAYZ,EAAIW,WAAWxqC,GACjC,OAAOyqC,EAAUzzC,GACf,IAAK,4BACH6yC,EAAIa,WAAY,EAAAC,GAAA,GAAcF,EAAUC,WACxC,MAGF,IAAK,yBACH,GAAgB,UAAbb,EAAIzxC,KACL,MAGFyxC,EAAIvU,SAAWmV,EAAUnV,SACzBuU,EAAIzxC,KAAOqyC,EAAUlzC,OAAOqzC,OAA2B,cAAlBf,EAAIgB,UAA4B,QAAU,QAC/E,MAGF,IAAK,yBACHhB,EAAIvU,SAAWmV,EAAUnV,SACzBuU,EAAIiB,EAAIL,EAAUK,EAClBjB,EAAIkB,EAAIN,EAAUM,EAEQN,EAAUlzC,OAAOyzC,cACzCnB,EAAIzxC,KAAO,QAEXyxC,EAAIzxC,KAAO,QAEb,MAGF,IAAK,+BACL,IAAK,2BAcH,QAbqBmB,IAAlBkxC,EAAUQ,MACXpB,EAAIqB,gBAAkBT,EAAUQ,KAG/BR,EAAUhzC,aACmB,yBAA3BgzC,EAAUhzC,WAAWT,SACfyzC,EAAUhzC,WACkB,sBAA3BgzC,EAAUhzC,WAAWT,IAC7B6yC,EAAIsB,gBAAkBV,EAAUhzC,aAKQ,eAAlBoyC,EAAIgB,YAA+BhB,EAAIuB,QAAUjrC,IAAiBkrC,mBAC1FxB,EAAIzxC,KAAO,UACXyxC,EAAIyB,QAAU,OACT,GAAqB,eAAlBzB,EAAIgB,UAA4B,CACxC,IAAI1qC,IAAiBorC,kBACnB,MAGF1B,EAAIzxC,KAAO,UACXyxC,EAAIyB,QAAU,EACdzB,EAAI2B,UAAW,C,CAEjB,MAGF,IAAK,6BACH3B,EAAIzxC,KAAO,QACXyxC,EAAIiB,EAAIL,EAAUK,EAClBjB,EAAIkB,EAAIN,EAAUM,EAClB,MAGF,IAAK,4BACmB,cAAlBlB,EAAIgB,WAA+C,cAAlBhB,EAAIgB,YACvChB,EAAIzxC,KAAO,OAGbyxC,EAAI2B,UAAW,E,CAMrB,GAAI3B,EAAIgB,UA2BEhB,EAAIgB,YAAcrC,GAAwBC,IAClDoB,EAAIzxC,KAAO,MACHyxC,EAAIgB,YAAcrC,GAAwBU,IAClDW,EAAIzxC,KAAO,MACe,4BAAlByxC,EAAIgB,WAA6D,wBAAlBhB,EAAIa,YAC3Db,EAAIzxC,KAAO,UACXyxC,EAAI2B,UAAW,EACf3B,EAAIyB,QAAU,OAlCG,CACjB,MAAMz0C,GAAOgzC,EAAIa,WAAa,IAAIxwC,MAAM,KAAK6H,MAEvC0pC,EAAiB50C,GAAO2xC,GAAwB3xC,EAAI/B,eAC1D,GAAG22C,EACD5B,EAAIgB,UAAYY,OAEhB,OAAO5B,EAAIzxC,MACT,IAAK,MACL,IAAK,QACL,IAAK,QACHyxC,EAAIgB,UAAY,YAChB,MACF,IAAK,UACHhB,EAAIgB,UAAY,aAChB,MACF,IAAK,QACHhB,EAAIgB,UAAY,aAChB,MACF,IAAK,QACHhB,EAAIgB,UAAY,YAChB,MACF,QACEhB,EAAIgB,UAAY,2B,CAcxB,GAAgB,UAAbhB,EAAIzxC,MAAiC,UAAbyxC,EAAIzxC,KAAkB,CAE/C,MAAMqyC,EAAYZ,EAAIW,WAAW3xC,MAAM4xC,GAA8B,8BAAhBA,EAAUzzC,IACzDH,EAAM4zC,GAAaA,EAAUC,UAAUxwC,MAAM,KAAK6H,MAClD4b,EHtHe,EAACA,EAAY5nB,EAKnC,CAAC,KACJ,MAAM21C,EAAS31C,EAAQ41C,cAAgB,IAAM,IACvChjC,GAAQ,IAAMgV,EAAK4mB,YAAYziC,OAAO,GAAK,KAAO,IAAM6b,EAAK6mB,cAAc1iC,OAAO,IAAM/L,EAAQ61C,UAAY,GAAK,KAAO,IAAMjuB,EAAKkuB,cAAc/pC,OAAO,IAE9J,OAAQ/L,EAAQ+1C,aAAe,IAAMnuB,EAAKwnB,WAAWrjC,OAAO,GAAK6b,EAAKwnB,WACpEuG,GAAU31C,EAAQ41C,eAAiB,KAAOhuB,EAAKunB,WAAa,IAAIpjC,OAAO,GAAK+iC,GAAOlnB,EAAKunB,aACxFwG,EAAS/tB,EAAKsnB,eACblvC,EAAQg2C,OAAS,GAAK,KAAOpjC,EAAK,EG0GpBqjC,CAAY,IAAIpjC,KAAgB,IAAXihC,EAAIlsB,MAAc,CAACguB,eAAe,EAAMG,aAAa,IAAO11C,QAAQ,SAAU,KAAKA,QAAQ,KAAM,KACnIyzC,EAAIa,UAAY,GAAGb,EAAIzxC,QAAQulB,IAAO9mB,EAAM,IAAMA,EAAM,I,CAwB1D,OArBGo1C,MAAyC,QAAbpC,EAAIzxC,MAAkByxC,EAAIn8B,KAAO,KAAqB,UAAbm8B,EAAIzxC,MAAiC,UAAbyxC,EAAIzxC,MAClGyxC,EAAIC,mBAAoB,EAEHxvC,KAAKyvC,cAAcmC,gBAAgBrC,GACvC9xC,KACfuC,KAAKyvC,cAAcoC,mBAAmBtC,OAAKtwC,ECpOpC,SAAwBswC,EAAwBz+B,GAAW,EAAOghC,GAC/E,IAAIh0C,EAWJ,OATEA,EADCgT,EACM,WACCghC,EACD,QACCvC,EAAIC,kBACL,SAEA,YAGF,QAAW1xC,GAAM,EAAAi0C,GAAA,GAA2BxC,EAAKuC,GAC1D,CDuN8DE,CAAezC,GAAM,IAG7EA,EAAIC,mBAAoB,EAO1BD,EAAIa,YAAJb,EAAIa,UAAc,IAMfL,EACM91C,OAAOC,OAAO61C,EAAQR,GAGxBA,CACT,CAEO0C,OAAOj7B,GACZ,OAAO,EAAAoM,GAAA,GAAqBpM,GAASA,EAAQhX,KAAKsvC,KAAKt4B,EACzD,CAEOk7B,YAAY3C,EAAiB4C,EAAkBC,GACpD,OAAOpyC,KAAK84B,eAAeuZ,cAAc,CACvCr6B,MAAOu3B,EACP4C,UACAC,aAEJ,CAEOE,qBAAqBt7B,EAAcu7B,GACxC,MAAM3mB,EAAS5rB,KAAK2vC,oBAAoB34B,GACxC,OAAO4U,GAAUA,EAAO2mB,EAC1B,CAEOC,kBAAkBx7B,EAAc+hB,EAAY0Z,EAAeC,EAAgBH,G,UAChF,MAAMhD,EAAMvvC,KAAKiyC,OAAOj7B,GACxB,IAAIu4B,EACF,OAGF,MAAM3jB,EAAwC,QAAlC,KAAG5rB,KAAK2vC,qBAAmB,EAACJ,EAAI5yC,WAAE,aAAM,CAAC,EAE/Cm1C,EAAQlmB,EAAO2mB,GAClBT,GAASA,EAAMtB,GAAKiC,GAASX,EAAMrB,GAAKiC,IAI3C9mB,EAAO2mB,GAAa,CAClB90C,IAAKu7B,IAAIC,gBAAgBF,GACzByX,EAAGiC,EACHhC,EAAGiC,GAEP,CAEOC,+BAA+B37B,EAAclK,GAClD,MAAMyiC,EAAMvvC,KAAKiyC,OAAOj7B,GACxB,IAAIu4B,EACF,OAGF,MAAMuC,EAAQvC,EAAIuB,QAAUvB,EAAIuB,OAAOvyC,MAAMuzC,GAAsB,sBAAZA,EAAMp1C,IACzDo1C,IAIJvC,EAAItyC,OAAO21C,uBAAwB,EACnCd,EAAMhlC,MAAQA,EAChB,CAEO+lC,gBACL,OAAO7yC,KAAK2T,WAAWm/B,kBAAkB,CAACjqC,OAAQ,0BAA0BhE,MAAMkuC,IAChF,MAAMC,EAAcD,EAA0DE,WAK9E,OAJAD,EAAWn0C,SAASq0C,IAClBA,EAAUvM,SAAW3mC,KAAK8vC,QAAQoD,EAAUvM,SAAS,IAGhDqM,CAAU,GAErB,CAEOG,uBAAuBjU,GAC5B,MAAMviC,EAAK,uBAAwBwyC,GAE7B2C,EAAQ,CACZp1C,EAAG,YACH+zC,EAAG,EACHD,EAAG,EACHl0C,SAAU,CAAC,EACX8W,KAAM8rB,EAAK9rB,KACXtV,KAAM,MAER,IAAI6oC,EAAuB,CACzBjqC,EAAG,WACHy9B,YAAa,GACb+V,WAAY,GACZtX,MAAO,EACPoX,eAAgB,GAChBrzC,KACA4zC,UAAWrR,EAAKphC,KAChBsV,KAAM8rB,EAAK9rB,KACXiQ,KAAM/U,KAAK1J,MAAQ,IACnB3H,OAAQ,CAAC,EACT6zC,OAAQ,CAACgB,GACT1B,UAAWlR,EAAKj/B,MAGlB0mC,EAAW3mC,KAAK8vC,QAAQnJ,GAExB,MAAMyM,EAAepzC,KAAKyvC,cAAcoC,mBAAmBlL,OAAU1nC,EAAW+5B,IAAIC,gBAAgBiG,GAAOA,EAAK9rB,MAE1GigC,EAAiC,CACrC32C,EAAG,YACHy9B,YAAa,GACbwM,SAAUA,EACVhqC,KACA22C,KAAM32C,EACNM,OAAQ,CAAC,GAQX,OALA+C,KAAK4vC,oBAAoBjzC,GAAM,CAC7By2C,eACAlU,QAGKmU,CACT,CAEOE,gBAAgB52C,GACrB,MAAM,aAACy2C,EAAY,KAAElU,GAAQl/B,KAAK4vC,oBAAoBjzC,GAItD,cAHOqD,KAAK4vC,oBAAoBjzC,GAEjBqD,KAAK84B,eAAe/nB,OAAO,CAACmuB,OAAMsU,SAAUtU,EAAKj/B,OAClD4E,MAAMm6B,GACXh/B,KAAK2T,WAAWC,UAAU,0BAA2B,CAC1DsrB,KAAMF,EACNuR,UAAWrR,EAAKphC,KAChB+I,SAAU,CACRnK,EAAG,uBAGJmI,MAAMquC,KACP,EAAAnrB,GAAA,GAAgCmrB,GAChCA,EAAUvM,SAAW3mC,KAAK8vC,QAAQoD,EAAUvM,UAC5C3mC,KAAKyvC,cAAcoC,mBAAmBqB,EAAUvM,cAAU1nC,EAAWm0C,EAAa31C,IAAK21C,EAAaK,YAE7FP,MAGb,CAEOQ,UACL,OAAO1zC,KAAK2T,WAAWm/B,kBAAkB,CACvCjqC,OAAQ,wBACRi4B,cAAgBnJ,KACd,EAAA5P,GAAA,GAAgD4P,GACzCA,EAAIgc,KAAKzvC,KAAKqrC,GAAQvvC,KAAK8vC,QAAQP,OAGhD,CAEOqE,eAAe58B,EAAc9O,EAAcikB,EAAgBhQ,GAChE,MAAMozB,EAAMvvC,KAAKiyC,OAAOj7B,GACxB,OAAIu4B,EACGvvC,KAAK84B,eAAe+a,gBAAgB3rC,GAAM,EAAA4rC,GAAA,GAA6BvE,GAAMpjB,EAAQhQ,GAD5Exa,QAAQC,QAAO,EAAA2V,EAAA,GAAU,UAE3C,E,eElYK,MAAMw8B,WAAyBthC,EAAtC,c,oBACU,KAAAuhC,OAAwD,CAAC,CA4OnE,CAzOYl3B,QACR9c,KAAKge,kBAAkBC,2BAA2B,CAChDg2B,mBAAqB55B,IACnB,MAAMrb,EAASgB,KAAK0a,gBAAgB3b,UAAUsb,EAAOI,MACrDza,KAAKiqB,UAAU,CACbjrB,SACAkjB,SAAU7H,EAAO6H,SACjB0D,MAAOvL,EAAOuL,MACdsuB,QAAQ,GACR,IAIOjtC,EAAA,MAAiB,UAAUpC,MAAMmvC,IAC5Ch0C,KAAKg0C,OAASA,GAAU,CAAC,CAAC,GAE9B,CAEQG,OAAOn1C,EAAgBkjB,GAC7B,OAAYljB,GAAUkjB,EAAW,IAAMA,EAAW,GACpD,CAEOkyB,SAASp1C,EAAgBkjB,GAC9B,OAAOliB,KAAKg0C,OAAOh0C,KAAKm0C,OAAOn1C,EAAQkjB,GACzC,CAEOnD,mBACL,OAAO/e,KAAKq0C,eAAexvC,MAAK,KAC9B,IAAI,MAAMuC,KAAOpH,KAAKg0C,OAAQ,CAC5B,IAAyB,IAAtB5sC,EAAI3M,QAAQ,KACb,SAGF,MAAMuE,EAASoI,EAAI/H,WACJW,KAAKuW,mBAAmB2E,cAAclc,IAEnDgB,KAAKuW,mBAAmBgJ,mBAAmBvgB,E,IASnD,CAEQq1C,e,MACN,OAA8B,QAA9B,EAAOr0C,KAAKs0C,0BAAkB,QAAvBt0C,KAAKs0C,mBAAuBt0C,KAAK2T,WAAWC,UAAU,yBAC5D/O,MAAMgkB,KACK7oB,KAAKge,kBAAkB2U,aAAaI,aAAepxB,QAAQM,WACnE4C,MAAK,KACL7E,KAAKge,kBAAkBmV,qBAAqBtK,EAAQ,GACpD,GAEN,CAEOoB,WAAU,OAACjrB,EAAM,SAAEkjB,EAAU0D,MAAO2uB,EAAQ,OAAEL,EAAM,MAAEnd,IAO3D,MAAMnR,EAAQ5lB,KAAKw0C,gBAAgBD,GAE7BntC,EAAMpH,KAAKm0C,OAAOn1C,EAAQkjB,GAqBhC,OApBG0D,EACD5lB,KAAKg0C,OAAO5sC,GAAOwe,SAEZ5lB,KAAKg0C,OAAO5sC,GAGrBH,EAAA,MAAiB,CACf+sC,OAAQh0C,KAAKg0C,SAGZE,GAEDl0C,KAAK+c,UAAUrW,cAAc,gBAAiB,CAC5C1H,SACAkjB,WACA0D,QACAmR,UAIGnR,CACT,CAEQ6uB,aAAa7uB,GACnB,MAAgB,kBAAbA,aAAK,EAALA,EAAOlpB,WAImBuC,IAA1B2mB,EAAM8uB,iBAAiC9uB,EAAM8uB,gBAAkB,KAI9D9uB,EAAM/jB,QAAQrF,MAKpB,CAEQg4C,gBAAgB5uB,GACtB,GAAIA,GAAqB,iBAAZA,EAAMlpB,EAQnB,OAJGkpB,EAAM8uB,kBACP9uB,EAAM8uB,iBAAkB,EAAAp5B,GAAA,GAAkBsK,EAAM8uB,kBAG3C9uB,CACT,CAEO+uB,UAAU31C,EAAgBkjB,EAAkB0yB,EAA2BC,GAAe,EAAM9d,GAAQ,GAEzG,MAAM+d,EAAc90C,KAAKo0C,SAASp1C,EAAQkjB,GAC1C,IAAG,EAAA6yB,GAAA,GAAeD,EAAaF,GAE7B,OAAO,EAIT,MAAM5gC,EAA4B,CAChCyG,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5C6C,QAAS,IAGX,IAAImzC,EACJ,GAAGh1C,KAAKy0C,aAAaG,GACnBI,EAAW,CAACt4C,EAAG,yBACV,EACL,EAAAqrB,GAAA,GAAsC6sB,GACtC,MAAM/yC,EAAU+yC,EAAW/yC,QACrBiyB,EAA4B8gB,EAAW9gB,SAE1C8gB,EAAWF,kBACZ1gC,EAAO0gC,iBAAkB,EAAAz1B,GAAA,GAAmB21B,EAAWF,mBAGtD5gB,aAAQ,EAARA,EAAUt3B,UACXwX,EAAO8f,SAAW9zB,KAAKuW,mBAAmB0+B,iBAAiBnhB,IAG1D8gB,EAAW33C,OAAOi4C,aACnBlhC,EAAOkhC,WAAaN,EAAW33C,OAAOi4C,YAGxClhC,EAAOnS,QAAUA,C,CAGhBqgB,IACDlO,EAAOmhC,YAAa,EAAAl2B,GAAA,GAAmBiD,IAGzC,MAAMkzB,EAAiBJ,GAAYJ,EAWnC,OAVAQ,EAAe/xB,MAAO,EAAAC,GAAA,IAAM,GAAQtjB,KAAKujB,YAAYC,sBAErDxjB,KAAKiqB,UAAU,CACbjrB,SACAkjB,WACA0D,MAAOwvB,EACPlB,QAAQ,EACRnd,WAGC8d,GACM70C,KAAK2T,WAAWC,UAAU,qBAAsBI,EAI3D,CAEOqhC,iBACL,OAAOr1C,KAAK2T,WAAWC,UAAU,2BAA2B/O,MAAMosB,IAChE,GAAIA,EAIJ,IAAI,MAAMqkB,KAAYt1C,KAAKg0C,OAAQ,CACjC,MAAOh1C,EAAQkjB,GAAYozB,EAAS11C,MAAM,KAC1CI,KAAK+c,UAAUrW,cAAc,gBAAiB,CAC5C1H,OAAQA,EAAOK,WACf6iB,SAAUA,GAAYA,OAAWjjB,EACjC2mB,WAAO3mB,G,IAIf,CAEOs2C,WAAWv2C,EAAgBkjB,GAChC,MAAMszB,EAA6C,CACjD94C,EAAG,qBAGFwlB,EACDliB,KAAK20C,UAAU31C,EAAQkjB,EAAUszB,GAAmB,GAAO,GAE3Dx1C,KAAKiqB,UAAU,CACbjrB,SACAkjB,WACA0D,MAAO4vB,EACPtB,QAAQ,EACRnd,OAAO,GAGb,CAEO0e,SAASz2C,EAAgBkjB,EAAkBrgB,EAAiBiyB,GACjE,MAAMlO,EAAmC,CACvClpB,EAAG,eACH2mB,KAAM/U,KAAK1J,MAAQ,IAAO,EAC1B/C,UACA5E,OAAQ,CAAC,EACT62B,YAGC5R,EACDliB,KAAK20C,UAAU31C,EAAQkjB,EAAU0D,GAAO,GAAO,GAE/C5lB,KAAKiqB,UAAU,CACbjrB,SACAkjB,WACA0D,QACAsuB,QAAQ,EACRnd,OAAO,GAGb,E,yBCxOF,MAAM2e,GAAiC,CACrCC,SAAU,CAAC,EACX37C,QAAS,EACTk9B,SAAU,kBAOL,MAAM0e,WAAwBnjC,EAArC,c,oBAEU,KAAAojC,iBAEJ,CAAC,EAGG,KAAAC,iBAAkD,CAAC,EAEnD,KAAAC,oBAAoE,CAAC,EAErE,KAAAC,OAAgD,CAAC,EACjD,KAAAC,wBAAmF,CAAC,EAGpF,KAAAC,+BAA6E,IAAI3kC,GA4Q3F,CA9MS4kC,iBAAiBjf,EAAmB,kBACzC,MAAMxtB,EAAU1J,KAAK+1C,oBAAoB7e,GACzC,GAAGxtB,EACD,OAAOA,EAGT,MAAM0sC,EAAkB,iBAAmBlf,EAC3C,OAAOl3B,KAAK+1C,oBAAoB7e,GAAYjwB,EAAA,MAAiBmvC,GAAYvxC,MAAMwxC,KACzE,EAAAjzB,GAAA,GAASizB,KACXA,EAAO,CAAC,IAGV,EAAAC,GAAA,GAAmBZ,GAAiBW,GAGpCA,EAAKnf,SAAWA,EAChBl3B,KAAK61C,iBAAiB3e,GAAYmf,EAE3Br2C,KAAK2T,WAAWC,UAAU,sCAAuC,CACtE0xB,UAAW+Q,EAAKnf,SAChBmO,aAAcgR,EAAKr8C,UAClB6K,MAAM0xC,IACPF,EAAKr8C,QAAUu8C,EAAmBv8C,QAElC,MAAMw8C,EAAeH,EAAKV,SACpBA,EAAWY,EAAmBZ,SACpC,IAAI,IAAIjwC,EAAI,EAAGlJ,EAASm5C,EAASn5C,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CACxD,MAAM,QAAC+wC,EAAO,UAAEC,GAAaf,EAASjwC,GACtC8wC,EAAaC,GAAWC,C,CAO1B,OAJAzvC,EAAA,MAAiB,CACf,CAACmvC,GAAaC,IAGTA,CAAI,IACV,IACMA,MAGb,CAEOM,uBACL,MAAMlrB,EAA2B,CAC/BzrB,KAAKm2C,oBAWP,OARGn2C,KAAK42C,iBAAiB1e,WAAa,kBACpCzM,EAASnrB,KAAKN,KAAKm2C,iBAAiBn2C,KAAK42C,iBAAiB1e,WAGxDl4B,KAAKg2C,OAAOa,QACdprB,EAASnrB,KAAKN,KAAK82C,gBAAgB,WAG9Bn1C,QAAQyQ,IAAIqZ,EACrB,CAEQsrB,cACF/2C,KAAKmB,QACPnB,KAAKmB,MAAQ,IAAI,UAAYlC,EAAW,IAG1C,IAAI,MAAMi4B,KAAYl3B,KAAK61C,iBAAkB,CAC3C,GAAG71C,KAAK81C,iBAAiB5e,GACvB,SAGF,MACMye,EADO31C,KAAK61C,iBAAiB3e,GACbye,SAEtB,IAAI,MAAMc,KAAWd,EAAU,CAC7B,MAAMe,EAAYf,EAASc,GAC3Bz2C,KAAKmB,MAAMic,YAAYs5B,EAAWD,E,CAGpCz2C,KAAK81C,iBAAiB5e,IAAY,C,CAEtC,CAEO8f,aAAa9J,GAMlB,IAAI+J,EACJ,GANAj3C,KAAK+2C,eAEL7J,EAAIA,EAAE1yC,cAAcsB,QAAQ,KAAM,MAI7BsxC,OAAQ,CACX,MAAMplC,EAAMhI,KAAKmB,MAAM5G,OAAO2yC,GAC9B+J,EAASn2C,MAAMC,KAAKiH,GAAKmlB,QAAO,CAACC,EAAKC,IAAMD,EAAIppB,OAAOqpB,IAAI,G,MAE3D4pB,EAASj3C,KAAKg2C,OAAOa,OAAO7yC,OAAO4xC,GAAgBsB,eAAe1vC,MAAM,EA5KpD,IAwLtB,OATAyvC,EAASn2C,MAAMC,KAAK,IAAI5C,IAAI84C,IASrBA,CACT,CAIOH,gBAAqCh5C,G,MAC1C,MAAM2tB,EAAWzrB,KAAKi2C,wBACtB,OAAoB,QAApB,EAAOxqB,EAAS3tB,UAAI,QAAb2tB,EAAS3tB,GAAUkC,KAAKue,gBAAgBrX,WAAWrC,MAAMmC,IAC9D,IAAIgvC,EAA6B,GACjC,GAAY,WAATl4C,EAAmB,CACpB,MAAM,YAACq5C,GAAenwC,EACtBgvC,EAASl1C,MAAMiD,QAAQozC,IAAgBA,EAAY36C,OAAS26C,EAAcvB,GAAgBsB,a,KACrF,CACL,MAAM,kBAACE,GAAqBpwC,EAC5BgvC,EAASl1C,MAAMiD,QAAQqzC,IAAsBA,EAAkB56C,OAAS46C,EAAoB,E,CAG9F,OAAOp3C,KAAKg2C,OAAOl4C,GAAQk4C,CAAa,GAE5C,CAEOqB,gBAAgBC,GACrB,MAAMx5C,EAAkBw5C,EAAMtgC,MAAQ,SAAW,SACjDsgC,EAAMA,OAAQ,EAAAC,GAAA,GAASD,EAAMA,OAE7Bt3C,KAAK82C,gBAAgBh5C,GAAM+G,MAAMmxC,IAC/B,MAAMtwC,EAAI4xC,EAAMtgC,OAASsgC,EAAMA,OAC/B,EAAAlmC,EAAA,GAAiB4kC,EAAQtwC,GACzBswC,EAAOlwB,QAAQpgB,GACfswC,EAAOnsC,OArNa,GAqNamsC,EAAOx5C,OArNpB,IAuNpBwD,KAAKue,gBAAgB3W,YAAqB,WAAT9J,EAAoB,oBAAsB,cAAek4C,GAC1Fh2C,KAAK+c,UAAUrW,cAAc,eAAgB4wC,EAAM,GAEvD,CAEOvgC,wBAAwBygC,GAC7B,OAAIA,EAAOh7C,OACJwD,KAAK2T,WAAWC,UAAU,mCAAoC,CAAC6jC,YAAaD,IAAS3yC,MAAM6yC,GACzFA,EAAUxzC,KAAKqrC,GACbvvC,KAAK23C,eAAe7H,QAAQP,EAAK,CACtCzxC,KAAM,cACNkZ,MAAOu4B,EAAI5yC,SALSgF,QAAQM,QAAQ,GAS5C,CAEO21C,8BAA8BJ,GACnC,OAAOA,EAAOtzC,KAAK8S,GAAUhX,KAAK23C,eAAe1F,OAAOj7B,IAC1D,CAEQ6gC,uCACH73C,KAAK83C,gCAAmC93C,KAAKk2C,+BAA+B9iC,OAI/EpT,KAAK83C,gCAAiC,EAAAhuC,EAAA,GAAM,GAAGjF,MAAK,KAClD,MAAMkzC,EAAS,IAAI/3C,KAAKk2C,+BAA+BljC,QACjDyY,EAA2B,GACjC,EAAG,CACD,MAAMmB,EAAMmrB,EAAOluC,OAAO,EAAG,KACvBH,EAAU1J,KAAK+W,wBAAwB6V,GAAK/nB,MAAMyqC,IACtDA,EAAKzwC,SAAQ,CAAC0wC,EAAKlrC,KACjB,MAAM2S,EAAQ4V,EAAIvoB,GACZ7K,EAAWwG,KAAKk2C,+BAA+B3xC,IAAIyS,GACzDhX,KAAKk2C,+BAA+BryC,OAAOmT,GAC3Cxd,EAASyI,QAAQstC,EAAI,GACrB,IAGJ9jB,EAASnrB,KAAKoJ,E,OACRquC,EAAOv7C,QAEf,OAAOmF,QAAQyQ,IAAIqZ,EAAS,IAC3Bgd,SAAQ,KACTzoC,KAAK83C,oCAAiC74C,EACtCe,KAAK63C,qCAAqC,IAE9C,CAEOG,uBAAuBr7C,GAC5B,IAAI+M,EAAU1J,KAAKk2C,+BAA+B3xC,IAAI5H,GACtD,GAAG+M,EACD,OAAOA,EAIT,OADY1J,KAAK23C,eAAe1F,OAAOt1C,KAKvC+M,GAAU,SACV1J,KAAKk2C,+BAA+BluC,IAAIrL,EAAI+M,GAE5C1J,KAAK63C,sCAEEnuC,EACT,CAEOuuC,kBACL,OAAOj4C,KAAK0W,mBAAmBwhC,kBACjC,EAzRe,GAAAhB,cAAgB,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,M,2SCIjO,MAAMiB,WAA6B1lC,EAS9BqK,QACR9c,KAAKG,KAAM,EAAAqI,EAAA,IAAO,eAElBxI,KAAKo4C,WAAa,IAAI7mC,IACtBvR,KAAKq4C,aAAe,IAAI9mC,IACxBvR,KAAKs4C,YAAc,IAAI/mC,IAEvBvR,KAAKge,kBAAkBC,2BAA2B,CAChDs6B,gBAAkBl+B,IAChBra,KAAKw4C,cAAcn+B,EAAOyf,KAAMzf,EAAO7a,QAAQ,EAGjDi5C,4BAA8Bp+B,IAC5Bra,KAAKw4C,cAAcn+B,EAAOyf,MAI1B,MAAM4e,EAAcr+B,EAAOyf,KAAKn9B,GAChCqD,KAAK24C,oBAAoBD,EAAar+B,EAAOg+B,aAAa,IAI9Dr4C,KAAK+c,UAAU1W,iBAAiB,qBAAsBuyC,IACjC,uBAAhBA,EAAUl8C,GACXsD,KAAKq4C,aAAax0C,OAAO+0C,EAAUj8C,G,GAGzC,CAEOk8C,sBAAsBH,GAC3B,IAAIL,EAAer4C,KAAKq4C,aAAa9zC,IAAIm0C,GAKzC,OAJIL,GACFr4C,KAAKq4C,aAAarwC,IAAI0wC,EAAaL,EAAe,IAAI9mC,KAGjD8mC,CACT,CAEQS,0BAA0BJ,GAChC,MAAMK,EAAiB/4C,KAAKs4C,YAQtBU,EAAaD,EAAex0C,IAAIm0C,GACtC,MAAO,CACLM,aACAC,cATqBC,IAClBH,EAAex0C,IAAIm0C,KAAiBM,GACrCD,EAAe/wC,IAAI0wC,EAAaQ,E,EAStC,CAEOC,mBAAmBT,EAA0BnZ,EAAmC6Z,GACrF,MAAMf,EAAer4C,KAAK64C,sBAAsBH,GAE1C15C,GAAS,EAAAD,GAAA,GAAUwgC,EAAY9kB,MAE/B4+B,EAAiBhB,EAAa9zC,IAAIvF,GAClCs6C,EAAU/Z,EAAYtiC,OAAOuI,KACnC,IAAI6zC,GAAkBC,EACpB,OAIE/Z,EAAYtiC,OAAOs8C,OAAUha,EAAYtiC,OAAOu8C,kBAClDja,EAAYtiC,OAAOu8C,iBAAkB,GAGpCH,GACD7hC,GAAkB6hC,EAAgB9Z,GAClCA,EAAc8Z,GAEdhB,EAAarwC,IAAIhJ,EAAQugC,GAI3B,MAAMqZ,EAAY54C,KAAKy5C,aAAaf,GACpC,GAAoB,eAAjBE,aAAS,EAATA,EAAWl8C,GAAmB,CAC/B,IAAIg9C,GAAW,EACZJ,KACCV,EAAU9c,mBACZ4d,GAAW,IACHna,EAAYtiC,OAAO08C,aAAgBN,GAAmB9Z,EAAYtiC,OAAOpD,SAC/E++C,EAAU9c,mBACZ4d,GAAW,GAGVA,GACD15C,KAAK+c,UAAUrW,cAAc,oBAAqBkyC,E,CAKnDU,GACDjB,EAAax0C,OAAO7E,GAIpBgB,KAAK+c,UAAUrW,cAAc,yBAA0B,CACrDgyC,cACAnZ,eAGN,CAEOoZ,oBAAoBD,EAA0BkB,EAAyCR,GACxFQ,EAAwBrhB,QAC3BqhB,EAAwBrhB,OAAQ,EACjCqhB,EAAgB/6C,SAASg7B,GAAM75B,KAAKm5C,mBAAmBT,EAAa7e,EAAGuf,KACzE,CAEaS,gBAAgBnB,EAA0BnZ,EAAmC9jC,G,0CAQxFuE,KAAKm5C,mBAAmBT,EAAanZ,GAErC,MAAMvgC,EAASugC,EAAYtiC,OAAOpD,KAAO,MAAe,EAAAkF,GAAA,GAAUwgC,EAAY9kB,MACxEoO,QAAgB7oB,KAAK2T,WAAWge,gBAAgB,iCAAkC,CACtFmI,KAAM95B,KAAK85C,kBAAkBpB,GAC7BnZ,YAAavgC,IAAW,KAAegB,KAAK0a,gBAAgBq/B,mBAAqB/5C,KAAK0a,gBAAgBkW,iBAAiB5xB,GACvHu6C,MAAO99C,EAAQ89C,MACfS,OAAQv+C,EAAQu+C,OAChBC,WAAYx+C,EAAQy+C,UACpBC,aAAc1+C,EAAQ2+C,YACtBC,cAAe5+C,EAAQ6+C,aACvBC,oBAAqB9+C,EAAQ++C,qBAK/Bx6C,KAAKge,kBAAkBmV,qBAAqBtK,EAE9C,G,CAEO4wB,aAAa98C,GAClB,OAAOqD,KAAKo4C,WAAW7zC,IAAI5H,EAC7B,CAEa89C,iBAAiB99C,EAAiBq3B,G,0CAC7C,MAAM8F,EAAO95B,KAAKy5C,aAAa98C,GAC/B,GAAGm9B,GAAmB,mBAAXA,EAAKp9B,IAA2Bs3B,EACzC,OAAO8F,EAGT,MAAM3d,EAAQnc,KAAK64C,sBAAsBl8C,GAAIyW,KAAO,EApKzB,IAqK3B,OAAOpT,KAAK2T,WAAWktB,uBAAuB,CAC5Ch4B,OAAQ,qBACRmL,OAAQ,CACN8lB,KAAM95B,KAAK85C,kBAAkBn9C,GAC7Bwf,SAEF2kB,cAAgB8X,IAEd54C,KAAKgd,gBAAgBgL,aAAa4wB,EAAUlgC,OAC5C1Y,KAAKsc,gBAAgB2L,aAAa2wB,EAAU1wB,OAC5CloB,KAAK24C,oBAAoBh8C,EAAIi8C,EAAUP,cAAc,GACrD,MAAMve,EAAO95B,KAAKw4C,cAAcI,EAAU9e,MAM1C,OAJG3d,QAAsCld,IAA7Be,KAAKs4C,YAAY/zC,IAAI5H,IAC/BqD,KAAKs4C,YAAYtwC,IAAIrL,EAAIi8C,EAAU8B,0BAG9B5gB,CAAI,GAGjB,G,CAEO0e,cAAc1e,EAAmBx6B,GACtC,MAAM06B,EAAUh6B,KAAKo4C,WAAW7zC,IAAIu1B,EAAKn9B,IACnCg+C,EAA0B,mBAAX7gB,EAAKp9B,KAA4Bs9B,GAAyB,uBAAdA,EAAQt9B,GAezE,OAdGs9B,GACE2gB,GACDnjC,GAAkBwiB,EAASF,GAG7BA,EAAOE,GAEPh6B,KAAKo4C,WAAWpwC,IAAI8xB,EAAKn9B,GAAIm9B,GAG5B6gB,GACD36C,KAAK+c,UAAUrW,cAAc,oBAAqBozB,GAG7CA,CACT,CAEa8gB,gBAAgBt7C,EAAgBu7C,EAAuBxvB,G,0CAClE,MAAMxC,QAAgB7oB,KAAK2T,WAAWC,UAAU,wBAAyB,CACvE6G,KAAMza,KAAK0a,gBAAgBkW,iBAAiBtxB,EAAOD,UAAS,IAC5Dy7B,WAAW,QAAe,IAC1BggB,cAAeD,EACfxvB,UAMF,OAHArrB,KAAKge,kBAAkBmV,qBAAqBtK,GAE5BA,EAA4BA,QAAQtqB,MAAM8b,GAAwB,oBAAbA,EAAO3d,IAC9Do9B,IAChB,G,CAEOggB,kBAAkBn9C,GACvB,MAAMi8C,EAAY54C,KAAKy5C,aAAa98C,GACpC,MAAO,CACLD,EAAG,iBACHC,GAAIi8C,EAAUj8C,GACdw9B,YAAaye,EAAUze,YAE3B,CAmBa4gB,yBAAyBp+C,G,0CACpC,MAAM,WAACq8C,EAAU,cAAEC,GAAiBj5C,KAAK84C,0BAA0Bn8C,GAwBnE,MAtBkB,KAAfq8C,UACKh5C,KAAK2T,WAAWktB,uBAAuB,CAC3Ch4B,OAAQ,6BACRmL,OAAQ,CACN8lB,KAAM95B,KAAK85C,kBAAkBn9C,GAC7BiwB,IAAK,GACLouB,QAAS,GACT7uB,OAAQ6sB,GAAc,GACtB78B,MAlQqB,KAoQvB2kB,cAAgBma,IACd,MAAM/B,EAAgB+B,EAAsB/gC,QAAU+gC,EAAsB5C,aAAa77C,OAAS,GAAKy+C,EAAsBC,YAE7Hl7C,KAAKsc,gBAAgB2L,aAAagzB,EAAsB/yB,OACxDloB,KAAKgd,gBAAgBgL,aAAaizB,EAAsBviC,OACxD1Y,KAAK24C,oBAAoBh8C,EAAIs+C,EAAsB5C,cAEnDY,EAAcC,EAAc,KAK3B,CACLb,aAAcr4C,KAAK64C,sBAAsBl8C,GACzC0tB,MAAoC,KAA7BrqB,KAAKs4C,YAAY/zC,IAAI5H,GAEhC,G,CAEOw+C,OAAOx+C,EAAiBy+C,GAC7B,MAAMC,EAAiBr7C,KAAK85C,kBAAkBn9C,GAC9C,IAAI+M,EAuBJ,OArBEA,EADqB,kBAAd,GAA2B0xC,EACxBp7C,KAAK2T,WAAWC,UAAU,yBAA0B,CAC5DkmB,KAAMuhB,IAEoB,iBAAd,EACJr7C,KAAK2T,WAAWC,UAAU,uBAAwB,CAC1DkmB,KAAMuhB,EACNC,OAAQF,IAGAp7C,KAAK2T,WAAWC,UAAU,sBAAuB,CACzDkmB,KAAMuhB,EACNE,QAASv7C,KAAK0a,gBAAgBq/B,mBAC9BR,OAAO,EACPc,eAAe,EACfrmC,OAAQ,CACNtX,EAAG,WACH2N,KAAM,MAKLX,EAAQ7E,MAAMgkB,IACnB7oB,KAAKge,kBAAkBmV,qBAAqBtK,EAAQ,GAExD,CAEa2yB,cAAc9C,EAA0B1kC,EAAkBvY,G,0CACrE,MAAM4/C,EAAiBr7C,KAAK85C,kBAAkBpB,GAC9C,IAAIhvC,EACJ,GAAoB,SAAjBjO,EAAQqC,KAAiB,CAC1B,MAAM0D,EAA8B,CAClCs4B,KAAMuhB,EACNE,QAASv7C,KAAK0a,gBAAgBq/B,mBAC9B/lC,SACAulC,MAAO99C,EAAQggD,QACfpB,eAAgB5+C,EAAQigD,WAG1BhyC,EAAU1J,KAAK2T,WAAWC,UAAU,sBAAuBpS,GAC3DxB,KAAKG,IAAI,0BAA0Bu4C,IAAel3C,E,KAC7C,CACL,MAAMA,EAA0C,CAC9Cs4B,KAAMuhB,EACNrnC,UAGFtK,EAAU1J,KAAK2T,WAAWC,UAAU,kCAAmCpS,GACvExB,KAAKG,IAAI,sCAAsCu4C,IAAel3C,E,CAGhE,MAAMqnB,QAAgBnf,EAItB,OAHA1J,KAAKge,kBAAkBmV,qBAAqBtK,GAE5BA,EAA4BA,QAAQtqB,MAAM8b,GAAwB,8BAAbA,EAAO3d,GAE9E,G,CAEOi/C,2BAA2BjD,GAChC,OAAO14C,KAAK2T,WAAWC,UAAU,mCAAoC,CACnEkmB,KAAM95B,KAAK85C,kBAAkBpB,KAC5B7zC,MAAMgkB,IACP7oB,KAAKge,kBAAkBmV,qBAAqBtK,EAAQ,GAExD,ECrXa,SAAS+yB,GAAcnjB,GACpC,MAAO,CACL/7B,EAAG,aACHC,GAAI87B,EAAM97B,GACVw9B,YAAa1B,EAAM0B,YACnB6V,eAAgBvX,EAAMuX,eAE1B,CCNe,SAAS6L,GAAmBpjB,GACzC,MAAO,CACL/7B,EAAG,kBACHC,GAAIi/C,GAAcnjB,GAClBqjB,YAAa,EAEjB,C,cCRe,SAASC,GAAcxM,GACpC,MAAO,CACL7yC,EAAG,qBACHC,GAAI,CACFD,EAAG,gBACHC,GAAI4yC,EAAI5yC,GACRw9B,YAAaoV,EAAIpV,YACjB6V,eAAgBT,EAAIS,gBAEtB8L,YAAa,EAEjB,CCIO,MAAME,WAA6BvpC,EAA1C,c,oBACU,KAAAwpC,cAAgE,CAAC,EACjE,KAAAC,QAKJ,CAAC,CA8XP,CA5XSC,YAAYC,GACjB,MAAiB,aAAVA,EAAI1/C,EAAmB,CAC5BA,EAAG,gBACH2/C,IAAKD,EAAIC,IACTC,KAAMF,EAAIE,KACVC,gBAAiBH,EAAIG,iBACnB,CACF7/C,EAAG,qBAEP,CAEO8/C,iBAAiBx9C,EAAgBmY,EAAc8C,EAAQ,GAAIkS,EAAS,GAAIiwB,GAC7E,OAAOp8C,KAAK2T,WAAWC,UAAU,+BAAgC,CAC/D6oC,IAAKz8C,KAAKgd,gBAAgB6d,aAAa1jB,GACvCsD,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5Cib,QACAyiC,UAAWN,EAAMp8C,KAAKm8C,YAAYC,QAAOn9C,EACzCktB,UACC,CAAmBwwB,UAAW,EAAGxlB,YAAY,IAAOtyB,MAAM+3C,IAC3D,MAAMC,EAAUD,EAAWE,SAoB3B,OAdAF,EAAW13C,QAAQrG,SAASuD,IACV,yBAAbA,EAAO1F,IACL0F,EAAOukC,WACRvkC,EAAOukC,SAAW3mC,KAAK23C,eAAe7H,QAAQ1tC,EAAOukC,WAGpDvkC,EAAOq2B,QACRr2B,EAAOq2B,MAAQz4B,KAAK+8C,iBAAiBC,UAAU56C,EAAOq2B,SAI1Dz4B,KAAKi8C,eAAc,EAAAgB,GAAA,GAAYJ,EAASz6C,EAAOzF,KAAOyF,CAAM,IAGvDw6C,CAAU,GAErB,CAEQM,eAAe/lC,GACrBnX,KAAKgd,gBAAgBmgC,YAAY,eAAet4C,MAAMu4C,IACpD,MAAMC,EAAYlmC,EAAM9X,WAClB8B,EAAQi8C,EAASz7B,WAAW27B,GAAYA,EAAQ3gD,KAAO0gD,IAC7D,IAAIC,EAEFA,GADY,IAAXn8C,EACSi8C,EAASj8C,GAET,CACRxE,GAAI0gD,EACJE,OAAQ,KAIVD,EAAQC,QACV,EAAAr5B,GAAA,GAA2Bk5B,EAAUE,EAAS,UAE9Ct9C,KAAKue,gBAAgBxW,qBAAqB,gBAAgB,GAI9D,CAEOy1C,WAAWC,EAAoBtmC,EAAcumC,GAElD,OADA19C,KAAKk8C,QAAQ/kC,GAAS,CAACnY,OAAQy+C,EAAYpvC,KAAMC,KAAK1J,OAC/C5E,KAAKuW,mBAAmBonC,SAASxmC,OAAOlY,EAAWy+C,EAC5D,CA6GaE,kBAAkBzmC,G,qCAC7B,MAAMslC,EAAMz8C,KAAKgd,gBAAgB6gC,QAAQ1mC,GACzC,IAAIslC,IAAQA,EAAIx/C,OAAOw/C,MAAQA,EAAIqB,uBACjC,OAGF,MAAMC,EAAW/9C,KAAKk8C,QAAQ/kC,GAC9B,OAAG4mC,WACM/9C,KAAKk8C,QAAQ/kC,GAChB7I,KAAK1J,MAAQm5C,EAAS1vC,KAAQ,MACzB0vC,EAAS/+C,YAHpB,CAMF,E,+RAEOg/C,kBAAkBh/C,EAAgBkjB,EAAkB/K,EAAc8C,GACvEja,KAAK8e,iBAAiB22B,SAASz2C,EAAQkjB,EAAU,IAAMliB,KAAK0a,gBAAgBujC,gBAAgB9mC,EAAM9X,YAAc,IAAM4a,EACxH,CAEOikC,oBAAoBl/C,EAAgBunB,EAAa43B,GACtD,OAAOn+C,KAAK2T,WAAWC,UAAU,gCAAiC,CAChE6G,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5Co/C,QAAQ,EAAAn/B,GAAA,GAAmBsH,GAC3Blc,KAAM8zC,EAAO9zC,MACZ,CAAmBsyC,UAAW,EAAGxlB,YAAY,GAClD,CAoBOknB,iBAAiBr/C,EAAgBmY,EAAcmnC,EAA2B7iD,EAQ5E,CAAC,GACJ,MAAM8iD,EAAev+C,KAAKi8C,cAAcqC,GACxC,IAAIC,EACF,OAGFv+C,KAAKk9C,eAAe/lC,GACpB,MAAM7P,EAAWg3C,EAAkB1+C,MAAM,KACnC4+C,EAAUl3C,EAAS2G,QACnBwwC,EAAWn3C,EAASvK,KAAK,KAQ/B,GAPAtB,EAAQqc,SAAWX,EACnB1b,EAAQohD,QAAU2B,EAClB/iD,EAAQijD,SAAWD,EAChBF,EAAaI,aAAaC,eAC3BnjD,EAAQojD,YAAcN,EAAaI,aAAaC,cAGf,yBAAhCL,EAAaI,aAAajiD,EAC3BjB,EAAQq4B,SAAWyqB,EAAaI,aAAa7qB,SAC7C9zB,KAAKuW,mBAAmBuoC,SAAS9/C,EAAQu/C,EAAaI,aAAa98C,QAASpG,OACvE,CACL,IACIsjD,EAA4DC,EAD5DC,EAAU,GAEd,MAAMC,EAAcX,EAAaI,aACjC,OAAOO,EAAYxiD,GACjB,IAAK,4BAGH,GAFAuiD,EAAUC,EAAYr9C,QAEA,yBAAnB08C,EAAa7hD,EAA8B,CAC5C,MAAM,SAACiqC,EAAQ,MAAElO,GAAS8lB,EAExBQ,EADCpY,EACY,GAAsBA,GAEtBkV,GAAmBpjB,E,CAIpC,MAGF,IAAK,2BACHsmB,EAAa,CACXriD,EAAG,qBACHggD,UAAW18C,KAAKm8C,YAAY+C,EAAY9C,MAG1C3gD,EAAQ0jD,SAAWD,EAAY9C,IAE/B,MAGF,IAAK,6BACH2C,EAAa,CACXriD,EAAG,kBACHggD,UAAW18C,KAAKm8C,YAAY+C,EAAY9C,KACxC/wB,MAAO6zB,EAAY7zB,MACnB+zB,QAASF,EAAYE,QACrBC,SAAUH,EAAYG,SACtBC,SAAUJ,EAAYI,SACtBC,WAAYL,EAAYK,YAG1B9jD,EAAQ0jD,SAAWD,EAAY9C,IAE/B,MAGF,IAAK,+BACH2C,EAAa,CACXriD,EAAG,oBACH8iD,aAAcN,EAAYM,aAC1BC,WAAYP,EAAYO,WACxBC,UAAWR,EAAYQ,UACvBC,MAAOT,EAAYS,OAGrB,MAGF,IAAK,+BAoBHX,EAAe,CACbtiD,EAAG,sBACH2uB,MAAO6zB,EAAY7zB,MACnBu0B,YAAaV,EAAYU,YACzBnnB,MAAOymB,EAAYzmB,MACnBonB,SAAUX,EAAYW,SACtBC,aAAcZ,EAAYY,aAC1B7iD,OAAQ,CACN8iD,2BAA4Bb,EAAYjiD,OAAO8iD,2BAC/CrlD,KAAMwkD,EAAYjiD,OAAOvC,MAE3BslD,iBAAa/gD,IAOf8/C,GAAcC,IAChBD,EAAa,CACXriD,EAAG,sBACHsiD,iBAIJh/C,KAAKuW,mBAAmB0pC,UAAUjhD,EAAQ+/C,EAAYtjD,E,CAE1D,E,eC5XK,MAAMykD,GAAb,cACU,KAAAC,QAAU,CAMpB,CAJS/2B,sBAAsBtb,GAC3B,MAAMsyC,IAAQpgD,KAAKmgD,QACnB,OAAO,EAAA7kC,GAAA,GAAkBxN,IAAcsyC,EAAO,KAAuB,EACvE,E,qCCfa,SAASC,GAAoB5jD,EAAa6jD,GACvD,GAAG7jD,EAAID,OAAS8jD,EAAW,MAAO,CAAC7jD,GACnC,IAAID,EAAS,EAAG+jD,EAAsB,EAAGC,EAAa,EACtD,MACMh3B,EAAgB,GAEhBi3B,EAAOC,IACX,IAAIC,EAAOlkD,EAAI+K,MAAM+4C,EAAqBG,GAC1C,MAAME,EAAcJ,IACjBG,EAAKnkD,OAAS8jD,IAEED,GADIM,EAAKn5C,MAAM84C,GACmBA,GAC1CzhD,SAAS8hD,IAChBn3B,EAAIg3B,KAAgBG,CAAI,IAG1BA,EAAOA,EAAKn5C,MAAM,EAAG84C,IAGvBC,EAAsBG,EACtBlkD,EAAS,EACTgtB,EAAIo3B,IAAgBp3B,EAAIo3B,IAAgB,IAAMD,CAAI,EAGpD,IAAI1Z,EAAY,EAChB,OAAG,CACD,IAAI9lC,EAAQ1E,EAAIhC,QAvBA,IAuBmBwsC,GACnC,IAAc,IAAX9lC,EAAc,CACZ8lC,IAAexqC,EAAID,OAAS,GAC7BikD,IAGF,K,CAGFt/C,GAhCgB,IAgCG3E,OAEnB,MAAMqkD,EAAa1/C,EAAQ8lC,EACvBzqC,EAASqkD,EAAcP,GACzBG,EAAIjkD,GAGNyqC,EAAY9lC,EACZ3E,GAAUqkD,C,CAGZ,OAAOr3B,CACT,C,gFCEA,MAAMs3B,GAAiB,IAlChB,MAGLhhD,cACEE,KAAK+gD,KAAO,IAAIxvC,GAClB,CAEOyvC,QACQ,kBAER36C,iBAAiB,YAAY,CAACW,EAAOs0C,KAC5Bt7C,KAAK+gD,KAAKx8C,IAAI+2C,GACtBt0C,MAAQA,CAAK,GAErB,CAEOi6C,UACL,MAAO,IAAIjhD,KAAK+gD,KAAK5qC,UAAUtZ,QAAQqkD,KAAUA,EAAIl6C,OACvD,CAEOm6C,OAAO7F,GACZ,MAAM4F,EAAW,CACf5F,SACAt0C,WAAO/H,GAGTe,KAAK+gD,KAAK/4C,IAAIszC,EAAQ4F,EACxB,CAEOE,UAAU9F,GACft7C,KAAK+gD,KAAKl9C,OAAOy3C,EACnB,GAIF,OAAmB,oBAAgCwF,IACnD,Y,wBChDe,SAASO,GAAiB9R,GACvC,MAAO,CACL7yC,EAAG,gBACHC,GAAI4yC,EAAI5yC,GACRw9B,YAAaoV,EAAIpV,YACjB6V,eAAgBT,EAAIS,eAExB,C,0BCVe,SAASsR,GAA8BnwC,EAAQ/J,EAAchD,GAEvEA,EAAO+M,EAAI/J,IAAO,SACT+J,EAAI/J,EAClB,C,sTCqEA,MAyFMm6C,GAAgB3qB,IAEpBA,GAAI,EAGA4qB,IAA0B,EAUzB,MAAMC,WAA2BhvC,EAAxC,c,oBA2BU,KAAAivC,kBAEJ,CAAC,EACG,KAAAC,mBAA4C,CAAC,EAC7C,KAAAC,iBAAwD,CAAC,EAC1D,KAAAr5B,eAA6C,CAAC,EAC7C,KAAAs5B,sBAOJ,CAAC,EAEG,KAAAC,sBAAwB,IAAI,KAAkB,IAE9C,KAAAC,mBAA6G,IAAIxwC,IAEjH,KAAAywC,cAAoE,IAAIzwC,IAExE,KAAA0wC,UAAY,EAEb,KAAAp4B,eAA6C,CAAC,EAC9C,KAAAC,eAA6C,CAAC,EAG7C,KAAAo4B,mBAAuF,IAAI3wC,IAC5F,KAAAuX,8BAA8D,CAAC,EAG9D,KAAAq5B,sBAIH,CAAC,EAGE,KAAAC,yBAAiH,IAAI7wC,IAEtH,KAAApR,KAAM,EAAAqI,EAAA,IAAO,WAAY,WAAiB,WAAiB,KAAAD,IAAe,WAEzE,KAAA85C,cAAgB,EAEhB,KAAAC,QAA0E,CAAC,EAI3E,KAAAC,eAAuD,CAAC,EACxD,KAAAC,wBAA4D,CAAC,EAE7D,KAAAC,aAKJ,CAAC,EA4KE,KAAA7jD,MAAS0M,IACXtL,KAAK0iD,WACN1iD,KAAK0iD,WAAWC,SAEhB3iD,KAAK0iD,YAAa,UAClB1iD,KAAK4iD,mBAAqB,CAAC,GAG7B5iD,KAAK6iD,wBAA0B,CAAC,EAChC7iD,KAAK8iD,uBAAyB,CAAC,EAC/B9iD,KAAK+iD,yBAA2B,CAAC,EACjC/iD,KAAKgjD,iBAAmB,CAAC,EACzBhjD,KAAKijD,eAAiB,CAAC,EACvBjjD,KAAKkjD,gBAAkB,CAAC,EACxBljD,KAAKmjD,eAAiB,CAAC,EACvBnjD,KAAKojD,iCAAmC,CAAC,EACzCpjD,KAAKqjD,iBAAmB,CAAC,EAEzBrjD,KAAK+qB,gBAAkB/qB,KAAK+qB,eAAensB,MAAM0M,GACjDtL,KAAKigB,gBAAkBjgB,KAAKigB,eAAerhB,MAAM0M,EAAK,EAwvGhD,KAAAg4C,iBAAmB,KACzB,IAAIC,EAAe,EACnB,MAAMC,EAAmD,IAAIjyC,IAEvDkyC,EAAiBxqC,I,MACrB,MAAM,OAACja,GAAUia,EACjBjZ,KAAK+qB,eAAehQ,WAAW,CAAC9B,WAC5BjZ,KAAK0a,gBAAgBiL,UAAU3mB,KACjCukD,EAAehjC,KAAK4E,IAAIo+B,EAActqC,EAAO+F,aAAe,IAG9D,IAAI0J,EAAQ86B,EAAUj/C,IAAIvF,GACtB0pB,GACF86B,EAAUx7C,IAAIhJ,EAAQ0pB,EAAQ,CAAC,GAGjB,eAAbzP,EAAOvc,GACK,QAAb,EAACgsB,EAAM7L,cAAM,QAAZ6L,EAAM7L,OAAW,IAAItL,KAAOvJ,IAAIiR,EAAOtc,GAAIsc,GAE5CyP,EAAMzP,OAASA,C,EAInB,IAAI,MAAOja,EAAQmS,KAAQnR,KAAKkiD,mBAAoB,CAClD,MAAMwB,EAAkB,WAAYvyC,GAC9B,OAAC8H,EAAM,OAAE4D,GAAU1L,EAEtBuyC,IACGzqC,EAEMjZ,KAAK+qB,eAAe7P,cAAclc,IAC1CykD,EAAcxqC,GAFdjZ,KAAKuf,mBAAmBvgB,EAAOK,aAMhCwd,IACDA,SAAAA,EAAQhe,SAAQ,CAAC2c,EAAO7e,KAClB6e,EAEMxb,KAAK+qB,eAAetP,cAAczc,EAAQrC,IAClD8mD,EAAcjoC,GAFdxb,KAAK+qB,eAAe2B,kBAAkB1tB,EAAQrC,E,KAUlC,IAAjB4mD,GACDvjD,KAAK2jD,mBAAmBJ,GAG1BvjD,KAAK+c,UAAUrW,cAAc,sBAAuB88C,GACpDxjD,KAAKkiD,mBAAmBtjD,OAAO,EA+ZzB,KAAAglD,oBAAsB,KAC5Bj1C,EAAA,eAAiB3O,KAAK6jD,4BACtB7jD,KAAK6jD,gCAA6B5kD,EAKlC,IAAI,MAAMmI,KAAOpH,KAAKmiD,sBAAuB,CAC3C,MAAOnjD,EAAQkjB,GAAY9a,EAAIxH,MAAM,KAK/BkkD,EAAqB9jD,KAAKmiD,sBAAsB/6C,GACtDpH,KAAK+jD,sBAAsB/kD,EAAOK,WAAY6iB,GAAYA,OAAWjjB,GACpE4F,MAAK,EAAE00C,QAAOyK,6BACb,MAAM9kC,EAAa4kC,EAAmB5kC,WAClCq6B,IAAUr6B,EAAWjiB,OAAOgnD,YAAe/kC,EAAWjiB,OAAOktB,QAK9DjL,EAAWjiB,OAAOktB,QACnBnqB,KAAKkkD,mBAAmBhlC,EAAY,CAClCilC,SAAUL,EAAmBK,SAC7BH,0B,IAORhkD,KAAKmiD,sBAAwB,CAAC,CAAC,EAmBzB,KAAAiC,kBAAqB/pC,IAC3B,MAAMonB,EAAWpnB,EAAOygB,UAExB,IADoB96B,KAAK0hD,kBAAkBjgB,GAEzC,OAGF,MAAMlb,GAAM,EAAAjL,GAAA,GAAkBjB,EAAO1d,IACrCqD,KAAK2hD,mBAAmBp7B,GAAOkb,CAAQ,EAQjC,KAAA4iB,mBAAsBhqC,I,YAC5B,MAAMxY,EAAUwY,EAAOxY,QACjB7C,EAASgB,KAAKskD,eAAeziD,GAC7B2B,EAAUxD,KAAKomB,0BAA0BpnB,GAGzCulD,EAAmC,+BAAblqC,EAAO3d,EAGnCsD,KAAKmf,aAAa,CAACtd,GAAU,CAAC2B,QAASxD,KAAKwkD,qBAAqBxlD,EAAQ,aAazE,MAAM2gB,EAAU3f,KAAK0a,gBAAgBiF,QAAQ3gB,GACvCylD,EAAYzkD,KAAK0kD,aAAa7iD,GAC9BqgB,EAAWuiC,GAAaA,EAAU7kD,MAAM,KAAK,QAAKX,EAClDga,EAASjZ,KAAK+qB,eAAe5H,iBAAiBnkB,EAAQulD,EAAsBriC,OAAWjjB,GAE7F,KAAKga,GAAUjZ,KAAKoiD,yBAAyB3jD,IAAIO,MAAaulD,EAAqB,CACjF,IAAInnB,GAAO,EAKX,GAJGp+B,EAAO4nB,cACRwW,EAAOp9B,KAAKsc,gBAAgB6gB,SAASn+B,EAAOwd,aAG3C4gB,EAED,YADAp9B,KAAK2kD,2BAA2B3lD,EAAQqb,E,CAO5C,GAAG6H,IAAaqiC,EAAqB,CACnC,MAAMK,EAA2C,QAA3B,EAAA5kD,KAAKijD,eAAejkD,UAAO,eAAGkjB,GAC9C7H,EAAS,CACb3d,EAAG,6BACHmF,WAGC7B,KAAKsc,gBAAgBqD,QAAQ3gB,EAAOwd,cAAgBxc,KAAK+qB,eAAetP,cAAczc,EAAQkjB,GAE/FliB,KAAK2kD,2BAA2B3lD,EAAQqb,EAAQ6H,GACxC0iC,GACR5kD,KAAKqkD,mBAAmBhqC,E,CAI5B,GAAiB,mBAAdxY,EAAQnF,EAAwB,CACjC,MAAM,OAAC8b,GAAU3W,EAWjB,GAVgB,6BAAb2W,EAAO9b,GAAoCmF,EAAQgyB,UACpD7zB,KAAK+c,UAAUrW,cAAc,eAAgB,CAC3C1H,OAAQ6C,EAAQgyB,SAASgxB,iBACvB7kD,KAAK0a,gBAAgB3b,UAAU8C,EAAQgyB,SAASgxB,kBAChDhjD,EAAQ7C,OACVunB,IAAK1kB,EAAQijD,aACbC,eAAgBljD,IAIJ,2BAAb2W,EAAO9b,IAAmC6nD,EAAqB,CAChE,MAAM/oC,EAAQxb,KAAK+qB,eAAetP,cAAczc,EAAQkjB,GACxD,GAAI1G,EAEG,CACL,MAAMyP,GAAW,EAAA0D,GAAA,GAAKnT,QAEFvc,IAAjBuZ,EAAO6S,QACR7P,EAAM6P,MAAQ7S,EAAO6S,YAGFpsB,IAAlBuZ,EAAO6pB,QACRif,GAAe9lC,EAAMve,OAAQ,SAAUub,EAAO6pB,aAG3BpjC,IAAlBuZ,EAAO+I,QACR+/B,GAAe9lC,EAAMve,OAAQ,SAAUub,EAAO+I,aAGpBtiB,IAAzBuZ,EAAO2S,gBACR3P,EAAM2P,cAAgB3S,EAAO2S,eAG/BnrB,KAAKgb,yBAAyBhc,EAAQwc,GAEtCxb,KAAK+qB,eAAeC,mBAAmBxP,EAAOyP,E,MAtB9CjrB,KAAK+qB,eAAe2B,kBAAkB1tB,EAAQkjB,E,EAkCpDliB,KAAKmf,aAAa,CAACtd,GAAU,CAAC2B,YAO9BxD,KAAKglD,oBAAoBnjD,GACzB,MAAMokB,EAAiBjmB,KAAKkmB,kBAAkBlnB,EAAQulD,EAAsBriC,OAAWjjB,GAEnFslD,GACFvkD,KAAKilD,6BAA6BpjD,GAIpC,MAAMqjD,EAA2B7qC,EAAe6qC,eAEhD,GADqBj/B,EAAeI,QAAQ8+B,UAAUtjD,EAAQ0kB,MAE5D,IAAI2+B,EACF,OAAO,MAEJ,CAEL,MAAME,EAAan/B,EAAeI,QAAQ1e,MAC1C,GAAGy9C,EAAW/6B,MAAM,aAAkB,CACpC,IAAI3kB,EAAI,EACR,IAAI,MAAMlJ,EAAS4oD,EAAW5oD,OAAQkJ,EAAIlJ,KACrCqF,EAAQ0kB,IAAM6+B,EAAW1/C,MADsBA,GAMpD0/C,EAAWv7C,OAAOnE,EAAG,EAAG7D,EAAQ0kB,I,MAEhCN,EAAeI,QAAQP,QAAQjkB,EAAQ0kB,KAGb,OAAzBN,EAAe/L,SACd+L,EAAe/L,K,GAIjB+L,EAAewC,OAAS5mB,EAAQ0kB,IAAMN,EAAewC,SACvDxC,EAAewC,MAAQ5mB,EAAQ0kB,KAG9BvmB,KAAKwqB,mBAAmBvE,EAAgBpkB,IACzC7B,KAAK+c,UAAUrW,cAAc,uBAAwB,CAAC1H,WAGxD,MAAM6Y,EAAShW,EAAQgW,OACvB,GAAGA,EAAOpY,WAAaoC,EAAQ5E,OAAOusB,KAAO3nB,EAAQwnB,QAAS,CAC5DrpB,KAAKgd,gBAAgBqoC,gBAAgBxtC,EAAQhW,EAAQwhB,MAErD,MAAM7K,EAA4B,CAChC9b,EAAG,2BAGL,IAAI2d,EAEFA,EADCrb,EAAOS,SACC,CACP/C,EAAG,mBACH8b,SACApZ,QAASyY,GAEH7X,KAAK0a,gBAAgBiL,UAAU3mB,GAC9B,CACPtC,EAAG,0BACH8b,SACAjZ,WAAYP,EAAOwd,WACnB6M,QAASrpB,KAAK0a,gBAAgB4O,cAAczR,GAC5Cs9B,WAAYjzB,GAAW,EAAAjD,GAAA,GAAmBiD,QAAYjjB,GAG/C,CACPvC,EAAG,uBACH8b,SACAhZ,QAASR,EAAOwd,WAChB6M,QAASrpB,KAAK0a,gBAAgB4O,cAAczR,IAIhD7X,KAAKge,kBAAkBkX,mBAAmB7a,E,CAK5Cra,KAAKslD,iBAAiBzjD,GAGtB,MAAMuf,EAAwB,gBAAdnI,aAAM,EAANA,EAAQvc,GACxB,GAAI6nD,IAAwBnjC,IAAanI,EACvC,OAGF,MAAMssC,GAAe1jD,EAAQ5E,OAAOusB,KAAO3nB,EAAQ5E,OAAOktB,OAGxD,GAAGo7B,GAAe1jD,EAAQ0kB,IAAMtN,EAAO+F,YAAa,CAClD,MAAM8L,EAAqB9qB,KAAK+qB,eAAe5G,kCAAkClL,KAE/EA,EAAOmR,aACNvoB,EAAQ5E,OAAOgnD,cACdhrC,EAAO4W,sBACT7vB,KAAKwlD,qBAAqBxmD,EAAQ6C,EAAQ0kB,KAAK,EAAMnF,EAAUc,OAAWjjB,IAG5E6rB,G,CAQJ,GALKjpB,EAAQ0kB,KAAOtN,EAAO+F,aACvBhf,KAAKylD,oBAAoB5jD,EAASoX,KAIhCsrC,IAAwB5kC,GAAYyB,IAAYmkC,EAAa,CACjE,MAAMG,EAAajB,GAAazlD,EAC1B8kD,EAA0D,QAAxC,KAAG9jD,KAAKmiD,uBAAsBuD,UAAU,UAAVA,GAAgB,CACpEvB,SAAU,EACVtsC,OAAQ,MAGPisC,EAAmBjsC,SAAWA,IAC/BisC,EAAmBjsC,OAASA,EAC5BisC,EAAmBK,SAAW,GAG5BtiD,EAA4B+xB,YAC5BkwB,EAAmBK,SAGvBL,EAAmB5kC,WAAard,EAED,QAA/B,EAAA7B,KAAK6jD,kCAA0B,QAA/B7jD,KAAK6jD,2BAA+Bl1C,EAAA,aAAe3O,KAAK4jD,oBAAqB,G,GAIzE,KAAA+B,yBAA4BtrC,IAClC,MAAM,KAACI,EAAI,OAAE2jC,EAAM,UAAE5d,GAAanmB,EAC5BkM,GAAM,EAAAjL,GAAA,GAAkB8iC,GACxBp/C,EAASgB,KAAK0a,gBAAgB3b,UAAU0b,GACxC5Y,EAAqB7B,KAAKsf,iBAAiBtgB,EAAQunB,GAEzD,GAAkB,aAAf1kB,aAAO,EAAPA,EAASnF,GACV,OAGF,MAAM0b,EAAkBooB,aAAS,EAATA,EAAWnoB,iBACnC,IAAGD,aAAe,EAAfA,EAAiB5b,SAAUqF,EAAQ5E,OAAOusB,IAAK,CAChD,MAAMo8B,EAAiBxtC,EAAgBA,EAAgB5b,OAAS,GAC1DqpD,EAAoBhkD,EAAQ2+B,UAC5BslB,EAA0BD,aAAiB,EAAjBA,EAAmBxtC,iBAEjDrY,KAAK0a,gBAAgB3b,UAAU6mD,EAAertC,WAAavY,KAAK0a,gBAAgB1b,QAC7E8mD,KACDA,EAAwBtpD,QAAU4b,EAAgB5b,SAEjDspD,IACA,EAAA9vC,EAAA,GAAU4vC,EAAgBE,EAAwBA,EAAwBtpD,OAAS,KAGtFwD,KAAK+jD,sBAAsB/kD,GAAQ6F,MAAK,EAAE00C,QAAOyK,6BAC5BA,EAAuB+B,eAC1C/lD,KAAKkkD,mBAAmBriD,EAAS,CAC/BmkD,aAAcJ,EACd5B,0BACA,G,CAKR,MAAM58C,EAAMvF,EAAQ7C,OAAS,IAAM6C,EAAQ0kB,IAC3CvmB,KAAKimD,gBAAgB,qBAAsBjmD,KAAKkmD,qBAAsB9+C,GAAK,KAAM,EAAAunB,GAAA,GAAK9sB,EAAQ2+B,aAE9F3+B,EAAQ2+B,UAAYA,EAEhBnmB,EAAOkrB,OACTvlC,KAAKmmD,+BAA+BtkD,E,EAIhC,KAAAukD,yBAA4B/rC,IAElC,MAAMrb,EAASgB,KAAK0a,gBAAgB3b,UAAWsb,EAAOI,KAA+BA,MAC/ExB,EAASjZ,KAAKkb,cAAclc,GAElC,GAAIia,EAEG,CACL,MAAM6R,EAAqB9qB,KAAK+qB,eAAe5G,kCAAkClL,GAE7EoB,EAAOpd,OAAOktB,OAGhBlR,EAAOhc,OAAOopD,aAAc,SAFrBptC,EAAOhc,OAAOopD,YAKvBv7B,IACA9qB,KAAK+qB,eAAehF,iBAAiB9M,GACrCjZ,KAAK+c,UAAUrW,cAAc,sBAAuB,IAAI6K,IAAI,CAAC,CAACvS,EAAQ,CAACia,a,MAZvEjZ,KAAKgb,yBAAyBhc,E,EAgB1B,KAAAsnD,oBAAuBjsC,I,QAC7B,MAAMxY,EAAUwY,EAAOxY,QACjB7C,EAASgB,KAAKskD,eAAeziD,GAC7B0kB,GAAM,EAAAjL,GAAA,GAAkBzZ,EAAQlF,IAChC6G,EAAUxD,KAAKomB,0BAA0BpnB,GAC/C,IAAIwE,EAAQ/E,IAAI8nB,GAEd,OAKF,MAAMggC,EAAsBvmD,KAAKwmB,sBAAsBhjB,EAAS+iB,GAChEvmB,KAAKmf,aAAa,CAACtd,GAAU,CAAC2B,YAC9B,MAAMgjD,EAAsBxmD,KAAKwmB,sBAAsBhjB,EAAS+iB,GAEhEvmB,KAAKymD,oBAAoBF,EAAYC,EAAYhjD,GAEjD,MAAMyV,EAASjZ,KAAKkb,cAAclc,GAQ5B0nD,GAAeztC,aAAM,EAANA,EAAQ+F,eAAgBuH,EAC7C,GAAI1kB,EAAmC8kD,cAClCD,GACD1mD,KAAK+c,UAAUrW,cAAc,eAAgB,CAAC1H,SAAQia,eAEnD,CACL,IAAI2tC,GAAoB,EAExB,GAAqB,aAAlBL,aAAU,EAAVA,EAAY7pD,MAAoB,EAAAsZ,EAAA,GAAUuwC,EAAW/lB,UAAYgmB,EAA+BhmB,WAAY,CAC7G,MAAMqmB,EAAgBL,EAA+BhmB,UACpDgmB,EAA+BhmB,UAAY+lB,EAAW/lB,UACvDxgC,KAAKge,kBAAkBkX,mBAAmB,CACxCx4B,EAAG,yBACH+d,KAAMza,KAAK0a,gBAAgB4O,cAActqB,GACzCo/C,OAAQv8C,EAAQlF,GAChB6jC,UAAWqmB,IAGbD,GAAoB,C,CAGtBA,GAAqB5mD,KAAK+c,UAAUrW,cAAc,eAAgB,CAChE0vC,WAAY5yC,EAAQ4D,IACpBpI,SACAunB,MACA1kB,YAGC6kD,GACD1mD,KAAK+qB,eAAehF,iBAAiB9M,GAGvC,MAAM/U,EAA8C,IAAIqN,IAClDoX,EAAiB,KACrB,IAAID,EAAQxkB,EAAIK,IAAIvF,GAKpB,OAJI0pB,GACFxkB,EAAI8D,IAAIhJ,EAAQ0pB,EAAQ,CAAC,GAGpBA,CAAK,GAGVg+B,GAAiB7kD,EAA4BilD,aAAe7tC,IAC9D0P,IAAiB1P,OAASA,GAG5B,MAAMwrC,EAAYzkD,KAAK0kD,aAAa7iD,GACpC,GAAG4iD,EAAW,CACZ,MAAMppC,GAAWopC,EAAU7kD,MAAM,KAAK,GAChC4b,EAAQxb,KAAK+qB,eAAetP,cAAczc,EAAQqc,GACrDG,IACuB,QAAxB,KAACmN,KAAiB9L,cAAM,UAANA,OAAW,IAAItL,KAAOvJ,IAAIqT,EAASG,E,CAItDtX,EAAIkP,MACLpT,KAAK+c,UAAUrW,cAAc,sBAAuBxC,E,GAKlD,KAAA6iD,oBAAuB1sC,IAG7B,MAAMqL,EAAarL,EAAyC9a,WACtDkpB,GAAQ,EAAAnN,GAAA,GAAmBjB,EAAyC2sC,QAAW3sC,EAAmD4sC,aAClI/kC,GAAW,EAAA5G,GAAA,GAAmBjB,EAAmD86B,YACjFn2C,EAAS0mB,EAAYA,EAAUrmB,UAAS,GAAQW,KAAK0a,gBAAgB3b,UAAWsb,EAAyCI,MAEzHyP,EAAqB,4BAAb7P,EAAO3d,GACN,4BAAb2d,EAAO3d,GACM,sCAAb2d,EAAO3d,QAAmDuC,EAEtD0gB,IAAU+F,GAAY1lB,KAAKsc,gBAAgBqD,QAAQ+F,GACnDliB,EAAUxD,KAAKomB,0BAA0BpnB,GACzCqnB,GAAU,EAAA6gC,GAAA,GAAqB1jD,EAAS,QACxC8jB,EAAcpF,GAAYvC,EAC9B3f,KAAK+qB,eAAetP,cAAczc,EAAQkjB,GAC1CliB,KAAKkb,cAAclc,GACfmoD,EAAoB9sC,EAAyC+sC,mBACnE,IAAI3iC,EAAiB,EACjB4iC,EAAyB,EACzBC,GAAgB,EAIpB,MAAMrhC,EAAiBjmB,KAAKkmB,kBAAkBlnB,EAAQkjB,GAMtD,GAJGljB,EAAOS,UAAYyqB,GACpBlqB,KAAKgd,gBAAgBqoC,gBAAgBrmD,EAAOkxB,YAG3ChO,EAAU,CACX,MAAMqlC,EAAavnD,KAAKqjD,iBAAiBrkD,EAAS,IAAMkjB,GACxD,GAAGqlC,EAAY,CACb,MAAOvoD,EAAQunB,GAAOghC,EAAW3nD,MAAM,KACvCI,KAAKozB,cAAcp0B,EAAOK,YAAaknB,EAAK,kB,EAIhD,MAAMuE,EAAqBxD,GAAetnB,KAAK+qB,eAAe5G,kCAAkCmD,GAC1FmD,EAAYzqB,KAAKwnD,qBAAqBxoD,EAAQkjB,GAEpD,IAAI,IAAIxc,EAAI,EAAGlJ,EAAS6pB,EAAQ7pB,OAAQkJ,EAAIlJ,EAAQkJ,IAAK,CACvD,MAAM6gB,EAAMF,EAAQ3gB,GACpB,GAAG6gB,EAAMkC,EACP,SAGF,MAAM5mB,EAAqB2B,EAAQe,IAAIgiB,GAEvC,GAAG1kB,EAAQ5E,OAAOusB,MAAQU,EACxB,SAGF,MAAMu9B,GAAkB,EAAAC,GAAA,GAAmB7lD,EAAS8d,GACpD,IAAGuC,GAAYulC,IAAoBvlC,EAAnC,CAMA,KAFiBrgB,EAAQ5E,OAAOktB,QAAWM,GAAaA,EAAYlE,GAGlE,aAIK1kB,EAAQ5E,OAAOktB,OACtBm9B,IAAAA,GAAkB,IAEdzlD,EAAQ5E,OAAOusB,KAAOlC,SACAroB,IAArBkoD,IACD1iC,IAAmB6C,EAAY8C,cAG9BvoB,EAAQ5E,OAAOgnD,YAChBoD,IAA2B//B,EAAYuI,sBACvC7vB,KAAKwlD,qBAAqBxmD,EAAQ6C,EAAQ0kB,KAAK,KAInDvmB,KAAK+c,UAAUrW,cAAc,sBAAuB,MAAQ6f,E,EAM9D,GAHG2D,EAAOjE,EAAeyE,gBAAkBjC,EACtCxC,EAAewE,UAAYhC,EAE7BnB,EAAa,CAId,GAHG4C,EAAO5C,EAAY0C,mBAAqBvB,EACtCnB,EAAYyC,kBAAoBtB,GAEjCyB,EAAO,CACT,IAAIy9B,OACoB1oD,IAArBkoD,EACDQ,EAAWR,EAEX1iC,EAAiB,GACjBgE,GAASnB,EAAYtI,cACpByL,EAEDk9B,EAAW,EACHljC,GAAkB6C,EAAYtI,YAAcyJ,IACpDk/B,EAAWljC,QAGGxlB,IAAb0oD,IACDrgC,EAAY8C,aAAeu9B,IAG1BN,EAAyB,IAAM//B,EAAY8C,gBAC5C9C,EAAYuI,sBAAwB,E,CAIxC/E,SAAAA,IAEA9qB,KAAK+qB,eAAevN,wBAAwB8J,GAE5CtnB,KAAK+c,UAAUrW,cAAc,gBAAiB,CAAC1H,SAAQia,OAAQqO,IAC/DtnB,KAAK+qB,eAAehF,iBAAiBuB,GAEjCggC,QAAsCroD,IAArBkoD,GAAmCj9B,IAAS5C,EAAY8C,eACtD,eAAlB9C,EAAY5qB,EACbsD,KAAK+qB,eAAe2B,kBAAkB1tB,EAAQkjB,GAE9CliB,KAAKuf,mBAAmBvgB,G,CAS9B,GAJGsoD,GACDtnD,KAAK+c,UAAUrW,cAAc,kBAG3Bwb,GAAYwD,EAAW,CACzB,MAAMkiC,EAAgB5oD,EAAS,IAC/B,IAAI,MAAMylD,KAAazkD,KAAKqjD,iBAC1B,GAAwC,IAArCoB,EAAUhqD,QAAQmtD,GAAsB,CACzC,MAAO5oD,EAAQunB,GAAOvmB,KAAKqjD,iBAAiBoB,GAAW7kD,MAAM,KAC7DI,KAAK+c,UAAUrW,cAAc,kBAAmB1G,KAAKsf,iBAAiBtgB,EAAOK,YAAaknB,G,IAM1F,KAAAshC,6BAAgCxtC,IACtC,MAAMqL,EAAarL,EAAoD9a,WACjEuoD,EAAYztC,EAAoD86B,WAChEjzB,EAAW4lC,GAAW,EAAAxsC,GAAA,GAAkBwsC,QAAY7oD,EACpD8oD,EAAQ1tC,EAA6C8N,SAASjkB,KAAKvH,IAAO,EAAA2e,GAAA,GAAkB3e,KAC5FqC,EAAS0mB,EAAYA,EAAUrmB,UAAS,GAAQW,KAAKgoD,iBAAiBD,GAC5E,IAAI,IAAIriD,EAAI,EAAGlJ,EAASurD,EAAKvrD,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CACpD,MAAM6gB,EAAMwhC,EAAKriD,GACX7D,EAAqB7B,KAAKsf,iBAAiBtgB,EAAQunB,GACtD1kB,EACEA,EAAQ5E,OAAOgrD,sBACTpmD,EAAQ5E,OAAOgrD,aACtBjoD,KAAKmmD,+BAA+BtkD,IAEhCA,EAAQ5E,OAAOusB,KAAO3nB,EAAQ5E,OAAOgnD,WACvCjkD,KAAKwlD,qBAAqBxmD,EAAQunB,GAAK,EAAOrE,IAIlDliB,KAAKkoD,mCAAmClpD,EAAQkjB,E,CAIpDliB,KAAK+c,UAAUrW,cAAc,sBAAuB,CAAC1H,SAAQ+oD,QAAM,EAG7D,KAAAI,iCAAoC9tC,IAC1C,MAAMrb,EAASqb,EAAO9a,WAAWF,UAAS,GACpCgnB,EAAUrmB,KAAKkmB,kBAAkBlnB,GAAQqnB,QAAQ7e,MACjD4gD,GAAiB,EAAA9sC,GAAA,GAAkBjB,EAAOguC,kBAC1ClgC,EAAW9B,EAAQxpB,QAAQ0pB,GAAQA,GAAO6hC,IAE/C/tC,EAAqD8N,SAAWA,EACjEnoB,KAAKsoD,uBAAuBjuC,EAAoD,EAG1E,KAAAiuC,uBAA0BjuC,I,MAChC,MAAMqL,EAAarL,EAA8C9a,WAE3D4oB,EAAY9N,EAAqD8N,SAASjkB,KAAKvH,IAAO,EAAA2e,GAAA,GAAkB3e,KACxGqC,EAAiB0mB,EAAYA,EAAUrmB,UAAS,GAAQW,KAAKgoD,iBAAiB7/B,GAEpF,IAAInpB,EACF,OAGFgB,KAAK2T,WAAW4nB,WAAW,8BAA+BvnB,GACjDhU,KAAK0a,gBAAgB3b,UAAUiV,EAAOyG,QAAUzb,IAGzD,MAAMupD,EAA0B,IAAIpqD,IAAO0e,EAAkC,IAAItL,IACjF,IAAI,MAAMgV,KAAO4B,EAAU,CACzB,MAAMtmB,EAAU7B,KAAKsf,iBAAiBtgB,EAAQunB,GACxCk+B,EAAYzkD,KAAK0kD,aAAa7iD,GACpC,IAAI4iD,EACF,SAGF,MAAMviC,GAAYuiC,EAAU7kD,MAAM,KAAK,GACvC,IAA8B,QAA3B,EAAAI,KAAKijD,eAAejkD,UAAO,eAAGkjB,MAC/BqmC,EAAWzpD,IAAI2lD,IAEX5nC,EAAOpe,IAAIyjB,IAAW,CACxB,MAAM1G,EAAQxb,KAAK+qB,eAAetP,cAAczc,EAAQkjB,GACrD1G,GACDqB,EAAO7U,IAAIka,EAAU1G,E,EAM7B,MAAMgtC,EAAiBxoD,KAAKyoD,sBAC1BzpD,EACAgB,KAAKomB,0BAA0BpnB,GAC/BmpB,GAGIugC,EAAkB5nD,MAAMC,KAAKwnD,GAAYrkD,KAAKugD,IAClD,MAAOzlD,EAAQunB,GAAOk+B,EAAU7kD,MAAM,KACtC,OAAOI,KAAKkmB,kBAAkBlnB,EAAOK,YAAaknB,EAAI,IAGhC,CACtBvmB,KAAKkmB,kBAAkBlnB,MACpB0pD,GAEW7pD,SAASonB,IACvB,IAAI,MAAMM,KAAOiiC,EAAeG,KAC9B1iC,EAAeI,QAAQxiB,OAAO0iB,GAG7BiiC,EAAetuC,OAAS+L,EAAe/L,QACxC+L,EAAe/L,MAAQqG,KAAK4E,IAAI,EAAGc,EAAe/L,MAAQsuC,EAAetuC,O,IAI7Ela,KAAK+c,UAAUrW,cAAc,iBAAkB,CAAC1H,SAAQ2pD,KAAMH,EAAeG,OAE7E,MAAMxuC,EAA4C,IAC7C0C,EAAO1G,UAGN8C,EAASjZ,KAAKkb,cAAclc,GAC/Bia,GACDkB,EAAQ2L,QAAQ7M,GAGlBkB,EAAQtb,SAASoa,IACf,MAAMmI,EAAuB,eAAbnI,EAAOvc,EACjBksD,EAAWJ,EAAejG,gBAAkBiG,EAAer+B,OAC3DW,EAAqB89B,GAAY5oD,KAAK+qB,eAAe5G,kCAAkClL,GAkB7F,GAhBGuvC,EAAer+B,SAChBlR,EAAOmR,aAAe7J,KAAK4E,IAAI,EAAGlM,EAAOmR,aAAeo+B,EAAer+B,SAGtEq+B,EAAejG,iBAChBtpC,EAAO4W,sBAAyB5W,EAAOmR,aAAmB7J,KAAK4E,IAAI,EAAGlM,EAAO4W,sBAAwB24B,EAAejG,gBAA9D,GAGrDqG,IACD99B,IAEI1J,GACFphB,KAAK+c,UAAUrW,cAAc,gBAAiB,CAAC1H,SAAQia,YAIxDuvC,EAAeG,KAAKlqD,IAAIwa,EAAO+F,aAAc,CAC9C,MACMxX,EADiBxH,KAAKkmB,kBAAkBjN,EAAOja,OAAQoiB,EAAUnI,EAAOtc,QAAKsC,GACtDonB,QAAQ1e,MACrC,GAAGH,EAAM6iB,MAAM,cAAoB7iB,EAAMhL,OAAQ,CAC/C,MAAM+pB,EAAM/e,EAAM,GACZ3F,EAAU7B,KAAKsf,iBAAiBtgB,EAAQunB,GAC9CvmB,KAAKylD,oBAAoB5jD,EAASoX,E,MAC1BmI,EACRphB,KAAK+qB,eAAe2B,kBAAkB1tB,EAAQia,EAAOtc,IAErDqD,KAAKuf,mBAAmBvgB,E,IAG5B,EAGI,KAAA6pD,gBAAmBxuC,IACzB,MAAMqL,EAAYrL,EAAO9a,WACnBP,EAAS0mB,EAAUrmB,UAAS,GAC5Bgd,EAAUrc,KAAKsc,gBAAgBsB,QAAQ8H,GAEvCojC,EAAa9oD,KAAKsc,gBAAgB6gB,SAASzX,OAExB,EAAAqjC,GAAA,GAAuB1sC,GAAS,KAAOA,EAAQpf,OAAOuI,aAC1BvG,IAAlCe,KAAKgjD,iBAAiBhkD,aAGhCgB,KAAKgjD,iBAAiBhkD,GAC7BgB,KAAK+c,UAAUrW,cAAc,oBAAqB1H,MAGrCgB,KAAKkb,cAAclc,KAClB8pD,IACXA,EACD9oD,KAAKuf,mBAAmBvgB,GAExBgB,KAAK+qB,eAAelN,qBAAqB7e,IAI7CgB,KAAK+c,UAAUrW,cAAc,iBAAkBgf,EAAU,EAGnD,KAAAsjC,sBAAyB3uC,IAC/B,MAAMrb,EAASqb,EAAO9a,WAAWF,UAAS,GAS1CW,KAAKipD,sBAAsBjqD,GAC3B2C,QAAQyQ,IAAI,CACVpS,KAAKuf,mBAAmBvgB,KACvB6F,MAAK,KACN7E,KAAK+c,UAAUrW,cAAc,iBAAkB1H,EAAO,GACtD,EAGI,KAAAkqD,4BAA+B7uC,I,MACrC,MAAM8uC,EAAQ9uC,EAAO8uC,MACfnqD,EAAsB,QAAb,EAAAqb,EAAOrb,cAAM,QAAIqb,EAAO9a,WAAWF,UAAS,GACrDknB,GAAM,EAAAjL,GAAA,GAAkBjB,EAAO1d,IAC/BkF,EAAU7B,KAAKsf,iBAAiBtgB,EAAQunB,QACxBtnB,KAAnB4C,aAAO,EAAPA,EAASsnD,QAAuBtnD,EAAQsnD,MAAQA,IACjDtnD,EAAQsnD,MAAQA,EAChBnpD,KAAKimD,gBAAgB,iBAAkBjmD,KAAKopD,iBAAkBvnD,EAAQ7C,OAAS,IAAM6C,EAAQ0kB,KAC7FvmB,KAAKmmD,+BAA+BtkD,G,EAIhC,KAAAwnD,4BAA+BhvC,I,MAErC,GAAgB,QAAb,EAAAA,EAAOpd,cAAM,eAAEqsD,MAEhB,YADAtpD,KAAK+c,UAAUrW,cAAc,uBAAwB2T,GAIvD,MAAMxC,EAAS,KACT7Y,EAAS6Y,EACT/J,EAAY9N,KAAKopB,sBAAsBpqB,GACvC6C,EAA2B,CAC/BnF,EAAG,UACHC,GAAImR,EACJub,QAASrpB,KAAK0a,gBAAgB4O,cAAczR,GAC5CU,QAASvY,KAAK0a,gBAAgB4O,cAActqB,GAC5C/B,OAAQ,CAACktB,QAAQ,GACjB9G,MAAOhJ,EAAO0d,aAAc,EAAAzU,GAAA,IAAM,IAAStjB,KAAKujB,YAAYC,sBAC5D3hB,QAASwY,EAAOxY,QAChBmW,MAAOqC,EAAOrC,MACd8b,SAAUzZ,EAAOyZ,UAEf9zB,KAAKgd,gBAAgBqZ,QAAQxe,IAC/B7X,KAAKgd,gBAAgBgL,aAAa,CAAC,CACjCtrB,EAAG,OACHC,GAAIkb,EACJ5a,OAAQ,CAACu/B,UAAU,GACnBrC,YAAa,IACbslB,WAAY,WACZ8J,MAAO,WAGXvpD,KAAKmf,aAAa,CAACtd,GAAU,CAAC4nB,YAAY,IAEvCpP,EAAO0d,aACR/3B,KAAKuoB,eAAevpB,GAAU8O,EAC9B9N,KAAKqkD,mBAAmB,CACtB3nD,EAAG,mBACHmF,UACAmkB,SAAK/mB,EACL80B,eAAW90B,I,EAKT,KAAAuqD,uBAA0BnvC,IAChC,MAAMqL,EAAyB,gCAAbrL,EAAO3d,EAAsC2d,EAAO9a,gBAAaN,EAC7ED,EAAS0mB,EAAYA,EAAUrmB,UAAS,GAAQW,KAAK0a,gBAAgB3b,UAAWsb,EAAuCI,MAYvH0N,EAAW9N,EAAO8N,SAASjkB,KAAKvH,IAAO,EAAA2e,GAAA,GAAkB3e,KAEzD6G,EAAUxD,KAAKomB,0BAA0BpnB,GACzCyqD,EAAkBthC,EAAStrB,QAAQ0pB,IAAS/iB,EAAQ/E,IAAI8nB,MACpCkjC,EAAgBjtD,OAASmF,QAAQyQ,IAAIq3C,EAAgBvlD,KAAKqiB,GAAQvmB,KAAKwW,eAAexX,EAAQunB,MAAS5kB,QAAQM,WACvHwmC,SAAQ,K,MACxB,MAAMihB,EAA0B,QAAb,EAAArvC,EAAOpd,cAAM,eAAE2d,OAClC,GAAG8uC,EACD,IAAI,MAAMnjC,KAAO4B,EAEC3kB,EAAQe,IAAIgiB,GACpBtpB,OAAO2d,QAAS,OAU1B,IAAI,MAAM2L,KAAO4B,SAEC3kB,EAAQe,IAAIgiB,GACbtpB,OAAO2d,cASnB5a,KAAKmjD,eAAenjD,KAAK2pD,qBAAqB3qD,IACrDgB,KAAKue,gBAAgBrX,WAAWrC,MAAMmC,WAC7BA,EAAM4iD,qBAAqB5qD,GAClCgB,KAAK+c,UAAUrW,cAAc,uBAAwB,CAAC1H,SAAQ+oD,KAAM5/B,EAAUvN,OAAQ8uC,GAAY,GAClG,GACF,EAGI,KAAAG,uBAA0BxvC,IAChC,MAAM,KAACI,EAAI,gBAAEmQ,GAAmBvQ,EAC1B+G,EAAqB,qBAAX3G,EAAK/d,EAErB,GAD8B,eAAX+d,EAAK/d,IAAsB0kB,EAE5C,OAGF,MAAMpiB,EAASgB,KAAK0a,gBAAgB3b,UAAU0b,EAAKA,MAC7CxB,EAASjZ,KAAK+qB,eAAe5H,iBAAiBnkB,EAAQoiB,GAAU,EAAA9F,GAAA,GAAkBb,EAAK06B,iBAAcl2C,GACvGga,IAIJA,EAAO2R,gBAAkBA,EACzB5qB,KAAK+c,UAAUrW,cAAc,yBAA0BuS,GACvDjZ,KAAK+qB,eAAehF,iBAAiB9M,GAAO,EAGtC,KAAA6wC,4BAA+BzvC,IACrC,MAAMxY,EAAUwY,EAAOxY,QACjB7C,EAASgB,KAAKskD,eAAeziD,GAE7B2B,EAAUxD,KAAK+iD,yBAAyB/jD,GAC9C,IAAIwE,EACF,OAGF,MAAM+iB,GAAM,EAAAjL,GAAA,GAAkBzZ,EAAQlF,IAEhC4pD,EAAavmD,KAAKwmB,sBAAsBhjB,EAAS+iB,GACvDvmB,KAAKmf,aAAa,CAACtd,GAAU,CAAC2B,UAASumD,aAAa,IACpD,MAAMvD,EAAaxmD,KAAKwmB,sBAAsBhjB,EAAS+iB,GAEpDggC,GACDvmD,KAAKymD,oBAAoBF,EAAYC,EAAYhjD,GACjDxD,KAAK+c,UAAUrW,cAAc,eAAgB,CAAC0vC,WAAY5yC,EAAQ4D,IAAKpI,SAAQunB,IAAK1kB,EAAQ0kB,IAAK1kB,aAE1E7B,KAAKglD,oBAAoBnjD,IAE9C7B,KAAK+c,UAAUrW,cAAc,gBAAiB7E,E,EAK5C,KAAAmoD,gCAAmC3vC,IACzC,MAAMrb,EAASgB,KAAK0a,gBAAgB3b,UAAUsb,EAAOI,MAE/CjX,EAAUxD,KAAK+iD,yBAAyB/jD,GAC9C,GAAGwE,EAAS,CACV,MAAMukD,EAAO1tC,EAAO8N,SAASjkB,KAAKvH,IAAO,EAAA2e,GAAA,GAAkB3e,KAC3DqD,KAAKyoD,sBAAsBzpD,EAAQwE,EAASukD,GAE5C/nD,KAAK+c,UAAUrW,cAAc,mBAAoB,CAAC1H,SAAQ+oD,Q,GAItD,KAAAkC,6BAAgC5vC,I,MACtC,MAAMrb,EAASgB,KAAK0a,gBAAgB3b,UAAUsb,EAAOI,MAC/C8L,GAAM,EAAAjL,GAAA,GAAkBjB,EAAO+jC,QAC/B56C,EAAUxD,KAAKomB,0BAA0BpnB,GAC/C,IAAIwE,EAAQ/E,IAAI8nB,GAEd,OAGF,MAAM1kB,EAAU7B,KAAKwmB,sBAAsBhjB,EAAS+iB,GAC9Cy4B,EAAen9C,EAAQmW,MACS,0BAAR,QAA3B,EAAAgnC,EAAakL,sBAAc,eAAExtD,KAIhCsiD,EAAakL,eAAiB7vC,EAAO6vC,eACrClqD,KAAKsmD,oBAAoB,CACvB5pD,EAAG,oBACHmF,UACAmkB,IAAK,EACL+N,UAAW,IACX,EAkrCI,KAAAq1B,iBAAoBe,IAC1B,MAAMC,EAA6D,GAE7DlmD,EAAMlE,KAAKqqD,mBAAmBF,GACpC,IAAI,MAAOtoD,KAAYqC,EACrBkmD,EAAW9pD,KAAK,CACdtB,OAAQ6C,EAAQ7C,OAChBunB,IAAK1kB,EAAQ0kB,IACb4iC,MAAOtnD,EAAQsnD,QAInB,OAAOiB,CAAU,EAGX,KAAAlE,qBAAwBiE,I,UAC9B,MAAMC,EAA0F,GAE1FlmD,EAAMlE,KAAKqqD,mBAAmBF,GACpC,IAAI,MAAOtoD,EAASgkD,KAAsB3hD,EAAK,CAC7C,MAAMgB,EAAoC,QAA1B,EAAiB,QAAjB,EAAArD,EAAQ2+B,iBAAS,eAAEt7B,eAAO,QAAI,GACxColD,EAA4C,QAA1B,EAAAzE,aAAiB,EAAjBA,EAAmB3gD,eAAO,QAAI,GAChDqlD,EAAiBrlD,EAAQrI,QAAQ2tD,IACrC,MAAMC,EAAwBH,EAAgB/rD,MAAMmsD,IAAmB,EAAAC,GAAA,GAAeD,EAAepyC,SAAUkyC,EAAclyC,YAC7H,OACEzW,EAAQ5E,OAAOusB,OACZihC,GACDD,EAActwC,MAAQuwC,EAAsBvwC,aAGfjb,IAA/BurD,EAAcI,gBACXH,QACsCxrD,IAAvCwrD,EAAsBG,aAEzB,IAGHR,EAAW9pD,KAAK,CAACuB,UAAS0oD,kB,CAG5B,OAAOH,CAAU,CAWrB,CAnkMYttC,QAgKR,OA/JA9c,KAAKpB,OAAM,GAEXoB,KAAKge,kBAAkBC,2BAA2B,CAChD4sC,gBAAiB7qD,KAAKokD,kBAEtB0G,2BAA4B9qD,KAAKqkD,mBACjC0G,iBAAkB/qD,KAAKqkD,mBACvB2G,wBAAyBhrD,KAAKqkD,mBAE9B4G,uBAAwBjrD,KAAKomD,yBAE7B8E,kBAAmBlrD,KAAKsmD,oBACxB6E,yBAA0BnrD,KAAKsmD,oBAE/B8E,uBAAwBprD,KAAK2lD,yBAE7B0F,iCAAkCrrD,KAAK+mD,oBACvCuE,kCAAmCtrD,KAAK+mD,oBACxCwE,uBAAwBvrD,KAAK+mD,oBAC7ByE,wBAAyBxrD,KAAK+mD,oBAC9B0E,uBAAwBzrD,KAAK+mD,oBAC7B2E,wBAAyB1rD,KAAK+mD,oBAE9B4E,kCAAmC3rD,KAAK6nD,6BACxC+D,2BAA4B5rD,KAAK6nD,6BAEjCgE,+BAAgC7rD,KAAKmoD,iCAErC2D,qBAAsB9rD,KAAKsoD,uBAC3ByD,4BAA6B/rD,KAAKsoD,uBAElC0D,cAAehsD,KAAK6oD,gBAEpBoD,oBAAqBjsD,KAAKgpD,sBAE1BkD,0BAA2BlsD,KAAKkpD,4BAEhCiD,0BAA2BnsD,KAAKqpD,4BAEhC+C,qBAAsBpsD,KAAKwpD,uBAC3B6C,4BAA6BrsD,KAAKwpD,uBAElC8C,qBAAsBtsD,KAAK6pD,uBAE3B0C,0BAA2BvsD,KAAK8pD,4BAEhC0C,8BAA+BxsD,KAAKgqD,gCAEpCyC,2BAA4BzsD,KAAKiqD,+BAInCjqD,KAAK+c,UAAU1W,iBAAiB,6BAA6B,EAAEe,MAAKP,eAElE,IAAI6lD,EACsBA,EAAf,gBAARtlD,EAAqC6R,GAAWA,EAAOja,OAAOS,SACjD,qBAAR2H,EAA0C6R,GAAWjZ,KAAK0a,gBAAgBqV,YAAY9W,EAAOja,QAClFia,GAAWjZ,KAAK0a,gBAAgBuV,WAAWhX,EAAOja,QAJrDgB,KAAK+qB,eAAe1J,iBAAiB,GAAGrd,OAAOhE,KAAK+qB,eAAe1J,iBAAiB,IAOnGxkB,OAAO6vD,GACP7tD,SAASoa,IACRjZ,KAAK+c,UAAUrW,cAAc,yBAA0BuS,EAAO,GAC9D,IAGJjZ,KAAK+c,UAAU1W,iBAAiB,mBAAmB,EAAE1J,KAAIgsD,WACvDA,EAAK9pD,SAAQ,EAAEG,SAAQunB,MAAKwjC,kBAC1B,MAAMvmD,EAAUumD,EAAc/pD,KAAK2sD,4BAA4B3tD,GAAUgB,KAAKomB,0BAA0BpnB,GAClG6C,EAAU7B,KAAKwmB,sBAAsBhjB,EAAS+iB,GAChD1kB,IACJA,EAAQmW,MAAQ,CACdtb,EAAG,sBACHkwD,QAAS5sD,KAAK6sD,mBAAmBC,iBAAiBnwD,IAGpDqD,KAAK+c,UAAUrW,cAAc,eAAgB,CAC3C0vC,WAAY5yC,EAAQ4D,IACpBpI,SACAunB,MACA1kB,YACA,GACF,IAGJ7B,KAAK+c,UAAU1W,iBAAiB,iBAAiB,EAAErH,SAAQkjB,WAAU0D,YACnE,MAAM3M,EAASjZ,KAAK+qB,eAAe5H,iBAAiBnkB,EAAQkjB,GAC5D,GAAGjJ,EAAQ,CACTA,EAAO2M,MAAQA,EAEf,IAAImnC,GAAO,EACPnnC,IAAU,EAAA3G,GAAA,GAAmBhG,EAAO+F,cAItChf,KAAK+qB,eAAejQ,uBAAuB7B,GAC3CjZ,KAAK+qB,eAAehQ,WAAW,CAAC9B,aAJhCjZ,KAAK+qB,eAAepQ,WAAW3b,GAC/B+tD,GAAO,GAMT/sD,KAAK+c,UAAUrW,cAAc,eAAgB,CAC3C1H,SACAia,SACA8zC,OACAnnC,S,MAEG,GAAG1D,EAAU,CAClB,MAAMvE,EAAO3d,KAAKsc,gBAAgBsB,QAAQ5e,EAAOwd,YAC7CmB,EAEOA,EAAsB1gB,OAAOm/B,OACtCp8B,KAAK+qB,eAAe2B,kBAAkB1tB,EAAQkjB,GAF9CliB,KAAKuf,mBAAmBvgB,E,MAK1BgB,KAAKuf,mBAAmBvgB,E,IAI5BgB,KAAK+c,UAAU1W,iBAAiB,eAAe,EAAE2mD,WAC/C,MAAMhlD,EAAMhI,KAAKitD,gBAAgBC,eAAeF,EAAKrwD,IACrD,GAAGqL,EACD,IAAI,MAAMZ,KAAOY,EAAK,CACpB,MAAOhJ,EAAQunB,GAAOnf,EAAIxH,MAAM,KAE1BiC,EAAU7B,KAAKsf,iBAAiBtgB,EAAOK,YAAaknB,GACvD1kB,GACD7B,KAAKmmD,+BAA+BtkD,E,KAO5C7B,KAAK+c,UAAU1W,iBAAiB,qBAAqB,EAAE/G,SAAQwe,cAC7D,MAAM9e,EAASM,EAAOD,UAAS,GAC/B,IAAIye,EAAS,QACJ9d,KAAKijD,eAAejkD,GAE3B,IAAI,MAAMoI,KAAOpH,KAAKmjD,gBAChB/7C,IAAQpI,GAAUoI,EAAI+lD,WAAWnuD,EAAS,aACrCgB,KAAKmjD,eAAe/7C,E,KAMnCpH,KAAKotD,uBAAwB,EAAAC,GAAA,IAAS,KACpC,IAAI,MAAMlrD,KAASnC,KAAKyiD,aAAc,CACpC,MAAM6K,EAAUttD,KAAKyiD,aAAatgD,UAC3BnC,KAAKyiD,aAAatgD,GAGzB,MAAMC,EAASkrD,EAAQ7oD,SAAS6oD,EAAQnD,QACrC/nD,GAAaA,aAAkBtB,QAAUsB,EAAO5F,QAEjDugB,UAAUrW,cAAcvE,EAA6BC,E,IAGxD,IAAI,GAAO,GAEPpC,KAAKue,gBAAgBrX,WAAWrC,MAAMmC,IACxCA,EAAMumD,eACPvtD,KAAKiiD,UAAYj7C,EAAMumD,a,GAG7B,CAwBOtY,iBAAiBnhB,GACtB,MAAM05B,GAAc,EAAA7+B,GAAA,GAAKmF,GAOzB,OANA05B,EAAY3uD,SAAS4uD,IACH,6BAAbA,EAAO/wD,IACP+wD,EAA8D/wD,EAAI,gCAClE+wD,EAA8DruD,QAAUY,KAAKgd,gBAAgB6d,aAAa4yB,EAAOruD,S,IAG/GouD,CACT,CAEOE,yBAAyBC,EAAgBC,EAAsBnpD,G,UACpE,MAAMopD,EAA4C,QAApC,KAAG7tD,KAAK6hD,uBAAsB8L,UAAM,UAANA,GAAY,CAAC,EACnDx8C,EAA2B,QAAxB,EAAG08C,EAASD,UAAY,QAArBC,EAASD,GAAkB,CAACp0D,UAAU,UAIlD,OAFA2X,EAAI1M,SAAWA,EAER0M,EAAI3X,QACb,CAEOs0D,YAAYjsD,EAAczG,EAAcK,EAK1C,CAAC,GAKJ,MAAM,IAAC8qB,EAAG,OAAEvnB,GAAU6C,EAEtB,GAAGA,EAAQ5E,OAAOwpB,YAChB,OAAOzmB,KAAK0tD,yBAAyBnnC,EAAK,QAAS1kB,GAE1C7B,KAAK8tD,YAAYjsD,EAASzG,EAAMK,KAI3C,MAAMq4B,EAAWr4B,EAAQq4B,UAAY,GAClC14B,IACDA,GAAO,EAAA08B,GAAA,GAAc18B,EAAM04B,IAG7B,MAAMgnB,EAAgBr/C,EAAQo/C,eAAiBh5C,EAAQ5E,OAAO8wD,aAAelsD,EAAQwhB,UAAOpkB,GAC5F,OAAOe,KAAK2T,WAAWC,UAAU,uBAAwB,CACvD6G,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5CrC,GAAIkF,EAAQlF,GACZkF,QAASzG,EACT4c,MAAOvc,EAAQuyD,SACfl6B,SAAUA,EAASt3B,OAASwD,KAAKi1C,iBAAiBnhB,QAAY70B,EAC9Di2C,WAAYz5C,EAAQwyD,UACpBnT,kBACCj2C,MAAMgkB,IACP7oB,KAAKge,kBAAkBmV,qBAAqBtK,EAAQ,IAClDlrB,IAGF,GAFAqC,KAAKG,IAAIxC,MAAM,qBAAsBA,IAElCA,GAAwB,yBAAfA,EAAMG,KAOlB,OAHGH,GAAwB,kBAAfA,EAAMG,OAChBH,EAAMuwD,SAAU,GAEXvsD,QAAQC,OAAOjE,GANpBA,EAAMuwD,SAAU,CAMU,GAEhC,CAEapP,SAAS9/C,EAAgB5D,EAAcK,EAS/C,CAAC,G,kDACJ,IAAIL,EAAKgyC,OACP,OAGc,QAAhB,EAAA3xC,EAAQq4B,gBAAQ,QAAhBr4B,EAAQq4B,SAAa,IAGlBr4B,EAAQymB,WAAazmB,EAAQ0yD,eAC9B1yD,EAAQ0yD,aAAe1yD,EAAQymB,UAGjC,MACMksC,SADepuD,KAAK2T,WAAW+c,aACX29B,mBACpB/mD,EAAW+4C,GAAoBjlD,EAAMgzD,GAC3ChzD,EAAOkM,EAAS,GACbA,EAAS9K,OAAS,IACO,aAAR,QAAf,EAAAf,EAAQ6yD,eAAO,eAAE5xD,IAAoBtB,EAAK2zB,SAAStzB,EAAQ6yD,QAAQ7wD,aAC7DhC,EAAQ6yD,SAInBtvD,EAASgB,KAAK0a,gBAAgB6zC,kBAAkBvvD,IAAWA,EAE3D,MAAM80B,EAAWr4B,EAAQq4B,SACrBr4B,EAAQqc,WACV1c,GAAO,EAAA08B,GAAA,GAAc18B,EAAM04B,IAI7B,IAAI05B,EAAcxtD,KAAKi1C,iBAAiBnhB,GACpC05B,EAAYhxD,SACdgxD,OAAcvuD,GAGhB,MAAM4C,EAAU7B,KAAKwuD,wBAAwBxvD,EAAQvD,GACrDoG,EAAQiyB,SAAWA,EACnBjyB,EAAQA,QAAUzG,EAElB,MAAM+yD,EAAe1yD,EAAQ0yD,cAAe,EAAAlvC,GAAA,GAAmBxjB,EAAQ0yD,mBAAgBlvD,EACjF0mB,EAAY3lB,KAAK0a,gBAAgBiL,UAAU3mB,GAE9CvD,EAAQ6yD,UACTzsD,EAAQmW,MAAQ,CACdtb,EAAG,sBACHkwD,QAASnxD,EAAQ6yD,UAIrB,MAAMG,EAAe9wD,IACnBqC,KAAK0uD,oBAAoB,CAAC7sD,GAAUlE,GACpCqC,KAAK+c,UAAUrW,cAAc,mBAAmB,EAGlD7E,EAAQ2H,KAAO,KACbilD,IACA,MAAME,EAAsC,CAAC,EAC1C3uD,KAAK4hD,iBAAiB5iD,KACvB2vD,EAAmBC,eAAiB5uD,KAAK4hD,iBAAiB5iD,GAAQ8O,WAGpE,MAAM+gD,EAASpzD,EAAQqzD,aAAe9uD,KAAK0a,gBAAgBkW,iBAAiBn1B,EAAQqzD,mBAAgB7vD,EACpG,IAAI8vD,EAkCJ,OAhCEA,EADCtzD,EAAQqc,SACI9X,KAAK2T,WAAWq7C,eAAe,+BAAgC,CAC1Ev0C,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5C87B,UAAWj5B,EAAQi5B,UACnB4Z,gBAAiByZ,QAAgBlvD,EACjC69C,SAAUrhD,EAAQohD,QAClBlgD,GAAIlB,EAAQijD,SACZuQ,YAAaxzD,EAAQ85C,WACrB1S,QAASgsB,GACRF,GAEU3uD,KAAK2T,WAAWq7C,eAAe,uBAAwB,CAClE9Z,WAAYz5C,EAAQwyD,UACpBxzC,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5C6C,QAASzG,EACT0/B,UAAWj5B,EAAQi5B,UACnB4Z,gBAAiByZ,QAAgBlvD,EACjC60B,SAAU05B,EACVyB,YAAaxzD,EAAQ85C,WACrBuF,cAAer/C,EAAQo/C,mBAAgB57C,EACvC4yB,OAAQp2B,EAAQo2B,OAChBgR,QAASgsB,EACTK,yBAA0B1N,IACzBmN,GAQL3uD,KAAK4hD,iBAAiB5iD,GAAU2vD,EAEzBI,EAAWlqD,MAAMgkB,IAGtB,GAAiB,2BAAdA,EAAQnsB,EAAgC,CAIzC,MAAMgN,EAAU7H,EAAQ6H,eACjB7H,EAAQ6H,QACf,MAAM88C,GAAa,EAAA73B,GAAA,GAAK9sB,IACxB,EAAAge,GAAA,GAA6Bhe,EAAS,CAAC,YACvCA,EAAQ6H,QAAUA,EAElB88C,EAAWnjC,KAAOwF,EAAQxF,KAC1BmjC,EAAW7pD,GAAKksB,EAAQlsB,GACxB6pD,EAAWxuC,MAAQ6Q,EAAQ7Q,MAC3BwuC,EAAW1yB,SAAWjL,EAAQiL,SAC9B9zB,KAAKmvD,oBAAoB3I,GACtB39B,EAAQ5rB,OAAOusB,MAChBg9B,EAAWvpD,OAAOusB,KAAM,GAI1BX,EAAU,CACRnsB,EAAG,UACHgc,MAAO,GACPwP,MAAO,GACPoL,IAAK,EACLjQ,UAAMpkB,EACN4pB,QAAS,CAAC,CACRnsB,EAAG,kBACHo+B,UAAWj5B,EAAQi5B,UACnBn+B,GAAI6pD,EAAW7pD,IACd,CACDD,EAAGjB,EAAQo/C,aAAe,4BAA+Bl1B,EAAY,0BAA4B,mBACjG9jB,QAAS2kD,EACTxgC,IAAK6C,EAAQ7C,IACb+N,UAAWlL,EAAQkL,Y,MAGdlL,EAA4BA,SACpCA,EAA4BA,QAAQhqB,SAASwb,IAC5B,uBAAbA,EAAO3d,IACR2d,EAAOkrB,OAAQ,E,IAQrBvlC,KAAKge,kBAAkBmV,qBAAqBtK,GAE5ChnB,EAAQ6H,QAAQzH,SAAS,IACvBtE,IAGF,MAFA8wD,EAAY9wD,GACZkE,EAAQ6H,QAAQ9H,OAAOjE,GACjBA,CAAK,IACV8qC,SAAQ,KACNzoC,KAAK4hD,iBAAiB5iD,KAAY2vD,UAC5B3uD,KAAK4hD,iBAAiB5iD,E,GAE/B,EAGJgB,KAAKovD,qBAAqBvtD,EAAS,CACjCkoD,cAAetuD,EAAQo/C,mBAAgB57C,EACvCijB,SAAUzmB,EAAQymB,SAClBqzB,WAAY95C,EAAQ85C,WACpB8Z,YAAY,IAGd,MAAM5jC,EAAyD,CAAC5pB,EAAQ6H,SACxE,IAAI,IAAIhE,EAAI,EAAGA,EAAI4B,EAAS9K,SAAUkJ,EACpC+lB,EAASnrB,KAAKN,KAAK8+C,SAAS9/C,EAAQsI,EAAS5B,GAAIjK,IAGnD,OAAOkG,QAAQyQ,IAAIqZ,GAAU5mB,KAAKyqD,GAAA,E,IAG7BC,SAASvwD,EAAgBvD,GAkB9B,MAAMyjC,EAAOzjC,EAAQyjC,KACrBlgC,EAASgB,KAAK0a,gBAAgB6zC,kBAAkBvvD,IAAWA,EAI3D,MAAM6C,EAAU7B,KAAKwuD,wBAAwBxvD,EAAQvD,GAC/C0yD,EAAe1yD,EAAQ0yD,cAAe,EAAAlvC,GAAA,GAAmBxjB,EAAQ0yD,mBAAgBlvD,EAEvF,IAAIuwD,EAAgEC,EAEpE,MAAMC,EAAW,cAAexwB,EAAOA,EAAKqR,UAAYrR,EAAKphC,KACvD01C,EAAWtU,aAAgBywB,KAAOzwB,EAAKj/B,KAAO,GAC9C2vD,IAAe1wB,aAAgBywB,MAAWzwB,aAAgB2wB,MAChE,IAAI5Q,EAAUxjD,EAAQwjD,SAAW,GAEjCj/C,KAAKG,IAAI,WAAY++B,EAAMwwB,GAE3B,MAAM57B,EAAWr4B,EAAQq4B,UAAY,GAClCmrB,IACDA,GAAU,EAAAnnB,GAAA,GAAcmnB,EAASnrB,IAGnC,MAAMoc,EAAkC,GAElC4f,EAAUjqD,IAAiBkqD,2BAA2BtxD,IAAIixD,GAE1DM,EAAiDv0D,EAAQw0D,eAAiB,CAC9EvzD,EAAG,oBACHoQ,MAAOrR,EAAQw0D,cACfnyD,KAAM,KAGR,IAAI26B,EAAgBkO,EAEhBupB,EACJ,GAAGN,EACDJ,EAAa,WACbC,EAAc,QACT,GAAkC,IAA/BC,EAASj1D,QAAQ,WAAmB,CAAC,aAAaA,QAAQi1D,IAAa,EAAG,CAClFF,EAAa,QACbC,EAAc,UAAuC,QAA3BC,EAAS9vD,MAAM,KAAK,GAAe,MAAQ,OACrEswD,EAAa,+BAEVz0D,EAAQ00D,iBACTX,EAAa,QACb3tD,EAAQ5E,OAAOgrD,cAAe,GAGhC,MAAM9X,EAAsD,CAC1DzzC,EAAG,yBACHO,OAAQ,CACNqzC,MAAO70C,EAAQ00D,qBAAkBlxD,GAEnCmxD,SAAU30D,EAAQ20D,SAClBp1B,SAAUv/B,EAAQu/B,UAAY,GAGhCkV,EAAW5vC,KAAK6vC,E,MACX,GAAI10C,EAAQ40D,QAIZ,GAAGP,EAAS,CACjBN,EAAa,QACbC,EAAc,SAAWC,EAAS9vD,MAAM,KAAK,GAC7CswD,EAAa,+BAEb,MAAMI,EAAY,CAChB5zD,EAAG,YACH8zC,EAAG/0C,EAAQg3C,MACXhC,EAAGh1C,EAAQi3C,OACX50C,KAAM,KACNxB,SAAU,KACV8W,KAAM8rB,EAAK9rB,MAGbqlB,EAAQ,CACN/7B,EAAG,QACHC,GAAI,GAAKkF,EAAQlF,GACjB4zD,MAAO,CAACD,GACR9f,EAAG/0C,EAAQg3C,MACXhC,EAAGh1C,EAAQi3C,QAGVsd,GACDv3B,EAAM83B,MAAMzqC,QAAQkqC,GAGtB,MAAM5c,EAAepzC,KAAKyvC,cAAcmC,gBAAgBnZ,EAAO63B,EAAUxyD,MACzEs1C,EAAaK,WAAavU,EAAK9rB,KAC/BggC,EAAa31C,IAAMhC,EAAQ+0D,WAAa,GAExC/3B,EAAQz4B,KAAK+8C,iBAAiBC,UAAUvkB,E,MACnC,GAAG5yB,IAAiB4qD,2BAA2BhyD,IAAIixD,GAAW,CACnEF,EAAa,QACbC,EAAc,YACdS,EAAa,+BAEb,MAAMQ,EAA2D,CAC/Dh0D,EAAG,yBACHO,OAAQ,CACNyzC,cAAej1C,EAAQk1D,qBAAkB1xD,EACzC2xD,oBAAoB,GAEtB51B,SAAUv/B,EAAQu/B,SAClBwV,EAAG/0C,EAAQg3C,MACXhC,EAAGh1C,EAAQi3C,QAGbxC,EAAW5vC,KAAKowD,GAGbj1D,EAAQo1D,SACT3xB,EAAK9rB,KAAO,OACZ8rB,EAAK9rB,KAAO,UACZ88B,EAAW5vC,KAAK,CACd5D,EAAG,6B,MAIP8yD,EAAa,WACbC,EAAc,YAAcC,EAAS9vD,MAAM,KAAK,GAChDswD,EAAa,uCA/DbV,EAAa,WACbC,EAAc,YAAcC,EAAS9vD,MAAM,KAAK,GAChDswD,EAAa,kCAkEf,GAFAhgB,EAAW5vC,KAAK,CAAC5D,EAAG,4BAA6B0zC,UAAWoD,GAAYic,KAEuB,IAA3F,CAAC,WAAY,QAAS,QAAS,SAAmCh1D,QAAQ+0D,KAAuBI,EAAY,CAC/G,MAAM9e,EAAsB,GAa5B,GAZAnK,EAAW,CACTjqC,EAAG,WACHC,GAAI,GAAKkF,EAAQlF,GACjBq+B,SAAUv/B,EAAQu/B,SAClBkV,aACAM,EAAG/0C,EAAQg3C,MACXhC,EAAGh1C,EAAQi3C,OACX5B,SACAP,UAAWmf,EACXt8C,KAAM8rB,EAAK9rB,MAGV3X,EAAQ+0D,UAAW,CACpB,MAAMpd,EAAepzC,KAAKyvC,cAAcmC,gBAAgBjL,GACxDyM,EAAaK,WAAavU,EAAK9rB,KAC/BggC,EAAa31C,IAAMhC,EAAQ+0D,S,CAG7B,IAAI1e,EACJ,GAAGge,EACD5f,EAAW5vC,KAAK,CACd5D,EAAG,6BACH8zC,EAAG/0C,EAAQg3C,MACXhC,EAAGh1C,EAAQi3C,SAGbZ,EAAQ,CACNp1C,EAAG,YACH8zC,EAAG/0C,EAAQg3C,MACXhC,EAAGh1C,EAAQi3C,OACX50C,KAAM,KACNsV,KAAM8rB,EAAK9rB,WAER,GAAkB,UAAfo8C,GACL/zD,EAAQq2C,MAAO,CAChBA,EAAQ,CACNp1C,EAAG,YACH8zC,EAAG/0C,EAAQq2C,MAAM1+B,KAAKq/B,MACtBhC,EAAGh1C,EAAQq2C,MAAM1+B,KAAKs/B,OACtB50C,KAAM,cACNsV,KAAM3X,EAAQq2C,MAAM/Y,KAAK3lB,MAG3B,MAAM09C,EAAoB9wD,KAAKyvC,cAAcmC,gBAAgBjL,EAAUmL,EAAMh0C,MAC7EgzD,EAAkBrd,WAAa3B,EAAM1+B,KACrC09C,EAAkBrzD,IAAMhC,EAAQq2C,MAAMr0C,G,CAIvCq0C,GACDhB,EAAOxwC,KAAKwxC,GAGXke,GACDlf,EAAOhrB,QAAQkqC,GAUjBrpB,EAAW3mC,KAAK23C,eAAe7H,QAAQnJ,E,CAGzC3mC,KAAKG,IAAI,WAAYqvD,EAAYC,EAAavwB,EAAKphC,KAAMrC,GAEzD,MAAMs1D,GAAe,SAWf/4C,EAAsB43C,OAAa3wD,EAAY,CACnDvC,EAAG+7B,EAAQ,oBAAsB,uBACjCx7B,OAAQ,CAAC,EAETw7B,QACAkO,YAGC3uB,KACD,EAAA6H,GAAA,GAA6B7H,EAAc,CAAC,YAC3CA,EAActO,QAAUqnD,EAEtBt1D,EAAQu1D,UACRh5C,EAAyC/a,OAAO+zD,SAAU,IAI/DnvD,EAAQiyB,SAAWA,EACnBjyB,EAAQA,QAAUo9C,EAClBp9C,EAAQmW,MAAQ43C,EAAa,CAC3BlzD,EAAG,uBACHO,OAAQ,CAAC,EACT0pC,SAAUzH,GAC6BlnB,EAEzC,MAAMi5C,EAAqBrB,OAA0C3wD,GAA7B,EAAAiyD,GAAA,GAAqBhyB,GAC7Dr9B,EAAQovD,kBAAoBA,EAEzBA,IACDjxD,KAAK4iD,mBAAmBqO,GAAqBF,GAG/C,MAAMtC,EAAe9wD,IACnBqC,KAAK0uD,oBAAoB,CAAC7sD,GAAUlE,GACpCqC,KAAK+c,UAAUrW,cAAc,mBAAmB,EAGlD,IAAIyqD,GAAW,EACbC,EAAsD,KAExDvvD,EAAQ2H,KAAO,KACb,GAAGomD,EAAY,CACb,MAAM7Q,EAAyB,CAC7BriD,EAAG,qBACHC,GAAI0kD,GAAiBniB,IAGvB6xB,EAAa9uD,QAAQ88C,E,MAChB,GAAG7f,aAAgBywB,MAAQzwB,aAAgB2wB,KAAM,CACtD,MAAMwB,EAAO,K,MA8BX,IAAIC,EAqDJ,OAlFIH,IAAYtvD,EAAQlE,QACtBwzD,GAAW,EAEXC,EAAgBpxD,KAAK84B,eAAe/nB,OAAO,CAACmuB,OAAMsU,SAAUyd,IAC5DG,EAAcpjD,OAAO3E,IACf8nD,IACFnxD,KAAKG,IAAI,oBAAqB6X,GAE9BhY,KAAKuxD,qBAAqB1vD,EAAQi5B,WAClC96B,KAAKwxD,UAAUxyD,EAAQ,CAACtC,EAAG,gCAA4BuC,EAAWxD,EAAQymB,UAC1E6uC,EAAanvD,OAAOyH,G,IAIxB+nD,EAAcK,mBAAmBC,IAK/B,MAAMC,EAAWpxC,KAAK4E,IAAI,EAAG5E,KAAKqxC,MAAM,IAAMF,EAASG,KAAOH,EAASI,QACpE5B,GACDlwD,KAAKwxD,UAAUxyD,EAAQ,CAACtC,EAAGwzD,EAAYwB,SAAqB,EAAXC,QAAe1yD,EAAWxD,EAAQymB,UAErF6uC,EAAagB,UAAUL,EAAS,IAGlCX,EAAagB,UAAU,CAACF,KAAM,EAAGC,MAAO5yB,EAAK9rB,QAI7B,UAAfo8C,GAA0B/zD,EAAQ+0D,YAA0B,QAAb,EAAA/0D,EAAQq2C,aAAK,eAAE/Y,QAC/Du4B,EAAqBtxD,KAAK84B,eAAe/nB,OAAO,CAACmuB,KAAMzjC,EAAQq2C,MAAM/Y,QAGvEq4B,GAAiBA,EAAcvsD,MAAWm6B,GAAc,mCAOtD,IAAI+f,EA0BJ,GA5BA/f,EAAU/+B,KAAOwvD,EACjB0B,GAAW,EAIPpS,EADG,UADAyQ,EAEU,CACX9yD,EAAG,0BACHwiC,KAAMF,EACN/hC,OAAQ,CACN+zD,QAASv1D,EAAQu1D,cAAW/xD,IAMnB,CACXvC,EAAG,6BACHwiC,KAAMF,EACNuR,UAAWmf,EACXzyD,OAAQ,CACN+0D,WAA2B,oCAAf9B,QAAoDjxD,EAChE+xD,QAASv1D,EAAQu1D,cAAW/xD,GAG9BixC,cAIHohB,EACD,IACE,MAAMtyB,QAAkBsyB,EACvBvS,EAAqDjN,MAAQ9S,C,CAC9D,MAAM31B,GACNrJ,KAAKG,IAAIxC,MAAM,+BAAgC0L,E,CAInD0nD,EAAa9uD,QAAQ88C,EACvB,MAAIphD,IAEF,MADA8wD,EAAY9wD,GACNA,CAAK,IAGNozD,CAAY,EAGlBt1D,EAAQw2D,cACTZ,IAEArxD,KAAK8hD,sBAAsBxhD,KAAK,CAC9B+wD,Q,CAKN,OAAON,CAAY,EAGrB/wD,KAAKovD,qBAAqBvtD,EAAS,CACjCowD,cAAex2D,EAAQw2D,cACvBlI,cAAetuD,EAAQo/C,mBAAgB57C,EACvCijB,SAAUzmB,EAAQymB,SAClBqzB,WAAY95C,EAAQ85C,WACpBgM,aAAc9lD,EAAQ8lD,eAGpB9lD,EAAQw2D,gBACVlB,EAAalsD,MAAMk6C,IACjB/+C,KAAKwxD,UAAUxyD,EAAQ,CAACtC,EAAG,gCAA4BuC,EAAWxD,EAAQymB,UAEnEliB,KAAK2T,WAAWC,UAAU,qBAAsB,CACrDs+C,WAAYz2D,EAAQy2D,WACpBz3C,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5CgZ,MAAO+mC,EACPl9C,QAASo9C,EACTnkB,UAAWj5B,EAAQi5B,UACnB4Z,gBAAiByZ,EACjBrT,cAAer/C,EAAQo/C,aACvBhpB,OAAQp2B,EAAQo2B,OAChBiC,WACAm7B,YAAaxzD,EAAQ85C,WACrB1S,QAASpnC,EAAQqzD,aAAe9uD,KAAK0a,gBAAgBkW,iBAAiBn1B,EAAQqzD,mBAAgB7vD,IAC7F4F,MAAMgkB,IACP7oB,KAAKge,kBAAkBmV,qBAAqBtK,EAAQ,IAClDlrB,IACF,GAAkB,UAAf6xD,GACc,MAAf7xD,EAAM0X,OACU,6BAAf1X,EAAMG,MACQ,4BAAfH,EAAMG,MAIN,OAHAH,EAAMuwD,SAAU,EAChBsB,EAAa,gBACb3tD,EAAQ2H,OAKV,MADAilD,EAAY9wD,GACNA,CAAK,OAIfozD,EAAalsD,KAAKhD,EAAQ6H,QAAQzH,QAASJ,EAAQ6H,QAAQ9H,SAG7D,MAAMuwD,EAGF,CACFtwD,WAMF,OAHA,EAAAge,GAAA,GAA6BsyC,EAAK,CAAC,YACnCA,EAAIzoD,QAAUqnD,EAEPoB,CACT,CAEaC,UAAUpzD,EAAgBvD,G,0CAarC,GAJGA,EAAQymB,WAAazmB,EAAQ0yD,eAC9B1yD,EAAQ0yD,aAAe1yD,EAAQymB,UAGK,IAAnCzmB,EAAQ42D,gBAAgB71D,OACzB,OAAOwD,KAAKuvD,SAASvwD,EAAQ,OAAF,wBAAMvD,GAAYA,EAAQ42D,gBAAgB,KAGvErzD,EAASgB,KAAK0a,gBAAgB6zC,kBAAkBvvD,IAAWA,EAC3D,MAAMmvD,EAAe1yD,EAAQ0yD,cAAe,EAAAlvC,GAAA,GAAmBxjB,EAAQ0yD,mBAAgBlvD,EAEvF,IAAIggD,EAAUxjD,EAAQwjD,SAAW,GAC7BnrB,EAAWr4B,EAAQq4B,UAAY,GAChCmrB,IACDA,GAAU,EAAAnnB,GAAA,GAAcmnB,EAASnrB,IAGnC9zB,KAAKG,IAAI,YAAa1E,GAEtB,MAAM62D,EAAU,MAAOtyD,KAAKqiD,cAEtBh+B,EAA+B,GAC/Bk9B,EAAgB3qB,IACpBvS,EAAU/jB,KAAKs2B,EAAG,EAGdzO,EAAW1sB,EAAQ42D,gBAAgBnuD,KAAI,CAACopD,EAASjpD,KACrD,MAAMkuD,EAAC,eACLN,eAAe,EACf5B,QAAS50D,EAAQ40D,QACjBxV,aAAcp/C,EAAQo/C,aACtBhpB,OAAQp2B,EAAQo2B,OAChBs8B,eACAjsC,SAAUzmB,EAAQymB,SAClB4sC,aAAcrzD,EAAQqzD,aACtBwD,UACA/Q,gBACG+L,GASL,OANW,IAARjpD,IACDkuD,EAAEtT,QAAUA,EACZsT,EAAEz+B,SAAWA,GAIR9zB,KAAKuvD,SAASvwD,EAAQuzD,GAAG1wD,OAAO,IAGtCpG,EAAQ85C,YACTlxB,EAAU/jB,MAAK,KACbN,KAAK8e,iBAAiBy2B,WAAWv2C,EAAQvD,EAAQymB,SAAS,IAI9DmC,EAAUxlB,SAAS4F,IACjBA,GAAU,IAMZ,MAAMgqD,EAAc,CAAC5sD,EAA0BlE,KAC7CqC,KAAK0uD,oBAAoB,CAAC7sD,GAAUlE,GACpCqC,KAAK+c,UAAUrW,cAAc,mBAAmB,EAG5C4qB,EAAYtxB,KAAK0a,gBAAgBkW,iBAAiB5xB,GAClDwzD,EAAUC,IACdzyD,KAAKwxD,UAAUxyD,EAAQ,CAACtC,EAAG,gCAA4BuC,EAAWxD,EAAQymB,UAE1E,MAAM1oB,GAAW,SAsBjB,OArBAwG,KAAK8hD,sBAAsBxhD,KAAK,CAC9B+wD,KAAM,IACGrxD,KAAK2T,WAAWC,UAAU,0BAA2B,CAC1D6G,KAAM6W,EACNohC,YAAaD,EACb/d,gBAAiByZ,EACjBrT,cAAer/C,EAAQo/C,aACvBhpB,OAAQp2B,EAAQo2B,OAChBo9B,YAAaxzD,EAAQ85C,WACrB1S,QAASpnC,EAAQqzD,aAAe9uD,KAAK0a,gBAAgBkW,iBAAiBn1B,EAAQqzD,mBAAgB7vD,EAC9FiwD,yBAA0B1N,KACzB38C,MAAMgkB,IACP7oB,KAAKge,kBAAkBmV,qBAAqBtK,GAC5CrvB,EAASyI,SAAS,IAChBtE,IACFwqB,EAAStpB,SAASgD,GAAY4sD,EAAY5sD,EAASlE,KACnDnE,EAASoI,OAAOjE,EAAM,MAKrBnE,CAAQ,EAGXiyB,EAAwCtD,EAASjkB,KAAKrC,GAClDA,EAAQ2H,OAA+B3E,MAAMk6C,GAC5Cp9C,QAAQyQ,IAAI,CACjB2sC,EACA/+C,KAAK2T,WAAWC,UAAU,uBAAwB,CAChD6G,KAAM6W,EACNtZ,MAAO+mC,QAIZl6C,MAAK,EAAE8tD,EAAoB3T,MAC1B,IAAID,EACJ,GAAsB,sBAAnBC,EAAatiD,EAA2B,CACzC,MAAM+7B,EAAQz4B,KAAK+8C,iBAAiBC,UAAUgC,EAAavmB,OAC3DsmB,EAAalD,GAAmBpjB,E,MAC3B,GAAsB,yBAAnBumB,EAAatiD,EAA8B,CACnD,MAAM6yC,EAAMvvC,KAAK23C,eAAe7H,QAAQkP,EAAarY,UACrDoY,EAAa,GAAsBxP,E,CAIwB,CAC3D,SACA,eAGa1wC,SAAS2qC,I,MAEtBuV,EAAWvV,GAAwC,QAA5B,EAAAmpB,EAAmBnpB,UAAS,QAAIuV,EAAWvV,EAAS,IAG7E,MAAMopB,EAAqC,CACzCl2D,EAAG,mBACHsb,MAAO+mC,EACPjkB,UAAWj5B,EAAQi5B,UACnBj5B,QAASo9C,EACTnrB,YASF,OALGmrB,IACDA,EAAU,GACVnrB,EAAW,IAGN8+B,CAAgB,IACtB5kD,OAAO3E,IAGR,MAFArJ,KAAKG,IAAIxC,MAAM,+BAAgC0L,EAAKxH,GACpD4sD,EAAY5sD,EAASwH,GACfA,CAAG,MAIb,OAAO1H,QAAQyQ,IAAIqZ,GAAU5mB,MAAMguD,GAC1BL,EAAOK,EAAOh2D,OAAOC,WAEhC,G,CAEOg2D,YAAY9zD,EAAgB+zD,GACjC,OAAO/yD,KAAKigD,UAAUjhD,EAAQgB,KAAKgd,gBAAgBg2C,qBAAqBD,GAC1E,CAEO9S,UACLjhD,EACA+/C,EACAtjD,EAOK,CAAC,G,MAENuD,EAASgB,KAAK0a,gBAAgB6zC,kBAAkBvvD,IAAWA,EAG3D,MAAM6C,EAAU7B,KAAKwuD,wBAAwBxvD,EAAQvD,GAC/C0yD,EAAe1yD,EAAQ0yD,cAAe,EAAAlvC,GAAA,GAAmBxjB,EAAQ0yD,mBAAgBlvD,EAEvF,IAAI+Y,EACJ,OAAO+mC,EAAWriD,GAChB,IAAK,iBAAkB,CACrB,MAAMu2D,EAAS,GAAKpxD,EAAQlF,GAC5BoiD,EAAWiO,KAAKrwD,GAAKs2D,EACrBjzD,KAAKitD,gBAAgBiG,SAASnU,EAAWiO,KAAM,CAC7CtwD,EAAG,cACHgxB,MAAO,EACPylC,aAAc,EACdl2D,OAAQ,CAAC,EACTkb,cAAe,KAGjB,MAAM,KAAC60C,EAAI,QAAE9nD,GAAWlF,KAAKitD,gBAAgBmG,QAAQH,GACrDj7C,EAAQ,CACNtb,EAAG,mBACHswD,OACA9nD,WAGF,K,CAGF,IAAK,kBACH8S,EAAQ,CACNtb,EAAG,oBACH+7B,MAAOz4B,KAAK+8C,iBAAiBsW,SAAUtU,EAAWpiD,GAA6BA,KAEjF,MAGF,IAAK,qBAKHqb,EAAQ,CACNtb,EAAG,uBACHiqC,SANU3mC,KAAK23C,eAAe1F,OAAQ8M,EAAWpiD,GAAmCA,KAQtF,MAGF,IAAK,oBACHqb,EAAQ,CACNtb,EAAG,sBACH8iD,aAAcT,EAAWS,aACzBC,WAAYV,EAAWU,WACvBC,UAAWX,EAAWW,UACtBtgD,QAA2B,QAAlB,EAAA2/C,EAAW3/C,eAAO,QAAI,IAC/BugD,MAAOZ,EAAWY,OAEpB,MAGF,IAAK,qBACH3nC,EAAQ,CACNtb,EAAG,kBACH0/C,IAAK3gD,EAAQ0jD,UAEf,MAGF,IAAK,kBACHnnC,EAAQ,CACNtb,EAAG,oBACH0/C,IAAK3gD,EAAQ0jD,SACb9zB,MAAO0zB,EAAW1zB,MAClB+zB,QAASL,EAAWK,QACpBC,SAAUN,EAAWM,SACrBC,SAAUP,EAAWO,SACrBC,WAAYR,EAAWQ,YAEzB,MAGF,IAAK,sBACHvnC,EAAS+mC,EAAmBC,aAKhCn9C,EAAQmW,MAAQA,EAEhB,MAAMy2C,EAAe9wD,IACnBqC,KAAK0uD,oBAAoB,CAAC7sD,GAAUlE,GACpCqC,KAAK+c,UAAUrW,cAAc,mBAAmB,EAmElD,OAhEA7E,EAAQ2H,KAAO,KACb,MAAMmlD,EAAsC,CAAC,EAC1C3uD,KAAK4hD,iBAAiB5iD,KACvB2vD,EAAmBC,eAAiB5uD,KAAK4hD,iBAAiB5iD,GAAQ8O,WAGpE,MAAM+gD,EAASpzD,EAAQqzD,aAAe9uD,KAAK0a,gBAAgBkW,iBAAiBn1B,EAAQqzD,mBAAgB7vD,EACpG,IAAI8vD,EA8BJ,OA5BEA,EADCtzD,EAAQqc,SACI9X,KAAK2T,WAAWq7C,eAAe,+BAAgC,CAC1Ev0C,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5C87B,UAAWj5B,EAAQi5B,UACnB4Z,gBAAiByZ,QAAgBlvD,EACjC69C,SAAUrhD,EAAQohD,QAClBlgD,GAAIlB,EAAQijD,SACZuQ,YAAaxzD,EAAQ85C,WACrBuF,cAAer/C,EAAQo/C,aACvBhpB,OAAQp2B,EAAQo2B,OAChBgR,QAASgsB,GACRF,GAEU3uD,KAAK2T,WAAWq7C,eAAe,qBAAsB,CAChEv0C,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5CgZ,MAAO+mC,EACPjkB,UAAWj5B,EAAQi5B,UACnB4Z,gBAAiByZ,QAAgBlvD,EACjC4C,QAAS,GACTotD,YAAaxzD,EAAQ85C,WACrBuF,cAAer/C,EAAQo/C,aACvBhpB,OAAQp2B,EAAQo2B,OAChBgR,QAASgsB,EACTK,yBAA0B1N,IACzBmN,GAGL3uD,KAAK4hD,iBAAiB5iD,GAAU2vD,EAEzBI,EAAWlqD,MAAMgkB,IACnBA,EAAQA,SACTA,EAAQA,QAAQhqB,SAASwb,IACP,uBAAbA,EAAO3d,IACR2d,EAAOkrB,OAAQ,E,IAKrBvlC,KAAKge,kBAAkBmV,qBAAqBtK,EAAQ,IAClDlrB,IAEF,MADA8wD,EAAY9wD,GACNA,CAAK,IACV8qC,SAAQ,KACNzoC,KAAK4hD,iBAAiB5iD,KAAY2vD,UAC5B3uD,KAAK4hD,iBAAiB5iD,E,GAE/B,EAGJgB,KAAKovD,qBAAqBvtD,EAAS,CACjCkoD,cAAetuD,EAAQo/C,mBAAgB57C,EACvCijB,SAAUzmB,EAAQymB,SAClBqzB,WAAY95C,EAAQ85C,WACpB8Z,YAAY,IAGPxtD,EAAQ6H,OACjB,CAaQ0lD,qBAAqBvtD,EAA0BpG,EAMlD,CAAC,GACJ,MAAMqS,EAAYjM,EAAQlF,GACpBqC,EAASgB,KAAKskD,eAAeziD,GAC7B2B,EAAU/H,EAAQsuD,YAAc/pD,KAAK2sD,4BAA4B3tD,GAAUgB,KAAKomB,0BAA0BpnB,GAChH6C,EAAQu0C,WAAa5yC,EAAQ4D,IAC7B,MAAMid,EAA+B,GACrC,GAAG5oB,EAAQsuD,YAET/pD,KAAKmf,aAAa,CAACtd,GAAU,CAAC2B,UAASumD,aAAa,EAAMtgC,YAAY,IACtEpF,EAAU/jB,MAAK,KACbN,KAAK+c,UAAUrW,cAAc,gBAAiB7E,EAAQ,QAEnD,CAIL,MAAMgR,EAA6B,CACjC7S,KAAKkmB,kBAAkBlnB,GACvBvD,EAAQymB,SAAWliB,KAAKkmB,kBAAkBlnB,EAAQvD,EAAQymB,eAAYjjB,GAGxE,IAAI,MAAMuE,KAAWqP,EAChBrP,GACDA,EAAQ6iB,QAAQP,QAAQhY,GAO5B,GAHA9N,KAAKmf,aAAa,CAACtd,GAAU,CAAC2B,UAASimB,YAAY,IACnDzpB,KAAKylD,oBAAoB5jD,GAEtBpG,EAAQymB,SAAU,CACnB,MAAMhB,EAAalhB,KAAK+qB,eAAetP,cAAczc,EAAQvD,EAAQymB,UAClEhB,GACDlhB,KAAKylD,oBAAoB5jD,EAASqf,E,CAItCmD,EAAU/jB,MAAK,KACbN,KAAK+c,UAAUrW,cAAc,iBAAkB,CAAC0vC,WAAY5yC,EAAQ4D,IAAKvF,WAAS,G,CAItF,MAAMuG,EAAiCpI,KAAK0hD,kBAAkB7/C,EAAQi5B,WAAa,CACjF97B,SACA2uD,OAAQ7/C,EACRoU,SAAUzmB,EAAQymB,SAClB1e,UACA6rD,WAAY5zD,EAAQ4zD,YAuBtB,OApBArvD,KAAKuoB,eAAevpB,GAAU8O,GAE1BrS,EAAQw2D,eAAiBpwD,EAAQ2H,MACnC6a,EAAU/jB,MAAK,KACV7E,EAAQ85C,YACTv1C,KAAK8e,iBAAiBy2B,WAAWv2C,EAAQvD,EAAQymB,UAGnDrgB,EAAQ2H,MAAM,IAIf6a,EAAU7nB,SACVf,EAAQ8lD,cAAgBA,KAAc,KACrC,IAAI,MAAM98C,KAAY4f,EACpB5f,G,IAKC2D,CACT,CAEQomD,wBAAwBxvD,EAAgBvD,GAS9C,IAAI63D,EAJD73D,EAAQymB,WAAazmB,EAAQ0yD,eAC9B1yD,EAAQ0yD,aAAe1yD,EAAQymB,UAIjC,MAAM6N,EAAc/vB,KAAK0a,gBAAgBqV,YAAY/wB,GACrD,GAAG+wB,GACY/vB,KAAK0a,gBAAgB64C,QAAQv0D,GAClC/B,OAAOu2D,WAAY,CACzB,MAAMr+C,EAAOnV,KAAKgd,gBAAgBC,UAElCq2C,EADiBn+C,EAAKsqC,YAActqC,EAAKuqC,UAAY,IAAMvqC,EAAKuqC,UAAY,G,CAKhF,MAAM79C,EAA2B,CAC/BnF,EAAG,UACHC,GAAIqD,KAAKopB,sBAAsBpqB,GAC/BqqB,QAAS5tB,EAAQqzD,aAAe9uD,KAAK0a,gBAAgB4O,cAAc7tB,EAAQqzD,cAAgB9uD,KAAKyzD,eAAez0D,GAC/GuZ,QAASvY,KAAK0a,gBAAgB4O,cAActqB,GAC5C00D,YAAaJ,EACbr2D,OAAQ+C,KAAK2zD,cAAc30D,GAC3BqkB,KAAM5nB,EAAQo/C,eAAiB,EAAAv3B,GAAA,IAAM,GAAQtjB,KAAKujB,YAAYC,sBAC9D3hB,QAAS,GACTilD,WAAYrrD,EAAQ62D,QACpBx3B,WAAW,UACXjH,SAAU7zB,KAAK4zD,oBAAoB50D,EAAQvD,EAAQ0yD,aAAc1yD,EAAQymB,UACzE2xC,WAAYp4D,EAAQqc,SACpB8mC,aAAcnjD,EAAQojD,YACtBiV,QAAS9zD,KAAK+zD,gBAAgB/0D,GAC9BmqD,MAAOp5B,GAAe,EACtB3nB,SAAS,GAQX,OALA,EAAAyX,GAAA,GAA6Bhe,EAAS,CAAC,OAAQ,iBACxB5C,IAApBxD,EAAQ62D,UACTzwD,EAAQ6H,SAAU,UAGb7H,CACT,CAEQ+xD,oBAAoB50D,EAAgBmvD,EAAsB6F,GAChE,MAAMr0C,EAAU3f,KAAK0a,gBAAgBiF,QAAQ3gB,GAC7C,GAAG2gB,IAAYq0C,EAAc,CAC3B,MAAMC,EAAkBj0D,KAAKsf,iBAAiBtgB,EAAQmvD,GACnD8F,IACDD,GAAe,EAAAtM,GAAA,GAAmBuM,GAAiB,G,CAIvD,MAAMtnD,EAA6B,CACjCjQ,EAAG,qBACHg4C,gBAAiByZ,GAAgB6F,EACjC/2D,OAAQ,CAAC,GAWX,OARG+2D,GAAgBr0C,GAAW,OAAqBq0C,IACjDrnD,EAAO1P,OAAOi3D,aAAc,GAG3BF,GAAgBrnD,EAAO+nC,kBAAoBsf,IAC5CrnD,EAAOwnD,gBAAkBH,GAGpBrnD,CACT,CAEQonD,gBAAgB/0D,GACtB,IAAI80D,EACJ,GAAG9zD,KAAK0a,gBAAgBqV,YAAY/wB,GAAS,CAC3C,MAAMwjC,EAAcxiC,KAAK4W,kBAAkB8pB,kBAAkB1hC,EAAOwd,aACjEgmB,aAAW,EAAXA,EAAa4xB,kBACdN,EAAU,CACRp3D,EAAG,iBACHgxB,MAAO,EACPzwB,OAAQ,CACNo3D,UAAU,GAEZ90D,WAAYijC,EAAY4xB,eACxBN,QAAS,EACTQ,YAAa,G,CAKnB,OAAOR,CACT,CAKQL,eAAez0D,GACrB,OAAGgB,KAAK0a,gBAAgBkM,UAAU5nB,KAAYgB,KAAK0a,gBAAgBqV,YAAY/wB,IAAWgB,KAAKu0D,mBAAmBv1D,SAChH,EAEOgB,KAAK0a,gBAAgB4O,cAActpB,KAAKgd,gBAAgBC,UAAUtgB,GAAG0C,WAEhF,CAEQs0D,cAAc30D,GACpB,MAAM/B,EAAoC,CAAC,EAc3C,OAZG+B,IADYgB,KAAKgd,gBAAgBC,UAAUtgB,KAE5CM,EAAOusB,KAAM,EAETxpB,KAAK0a,gBAAgBiL,UAAU3mB,IAAYgB,KAAKgd,gBAAgBmT,MAAMnxB,KACxE/B,EAAOktB,QAAS,IAIjBnqB,KAAK0a,gBAAgBqV,YAAY/wB,KAClC/B,EAAOq5B,MAAO,GAGTr5B,CACT,CAEQu3D,sBAAsBx1D,EAAgBi1D,GAC5C,MAAM/tD,EAAOlG,KAAKgd,gBAAgBC,UAAUtgB,GAAG0C,WACzCwY,EAASo8C,EAAgBp8C,OAC/B,GAAGA,IAAW3R,GAAQ+tD,EAAgBj1D,SAAWkH,IAAS+tD,EAAgBrgC,SACxE,OAGF,MAAMwC,EAA+C,CACnD15B,EAAG,mBACHgxB,MAAO,EACPrK,KAAM4wC,EAAgB5wC,MAGxB,IAAIoxC,GAAe,EACnB,GAAGR,EAAgBrgC,SACjBwC,EAAU/M,QAAU4qC,EAAgBrgC,SAASvK,QAC7C+M,EAAUs+B,UAAYT,EAAgBrgC,SAAS8gC,UAC/Ct+B,EAAUs9B,YAAcO,EAAgBrgC,SAAS8/B,gBAC5C,CAGL,GAFAt9B,EAAUs9B,YAAcO,EAAgBP,YAErC77C,EAAOpY,SAAU,CAClB,MAAMk1D,EAAW30D,KAAK4W,kBAAkBg+C,kBAAkB/8C,EAAOqY,aAC9DykC,aAAQ,EAARA,EAAUE,wBACXz+B,EAAUs+B,UAAYC,EAASE,qBAC/BJ,GAAe,E,CAIfA,IACFr+B,EAAU/M,QAAUrpB,KAAK0a,gBAAgB4O,cAAczR,G,CAiB3D,OAbG7X,KAAK0a,gBAAgBqV,YAAYkkC,EAAgBj1D,UAC/Ci1D,EAAgBP,cACjBt9B,EAAUs9B,YAAcO,EAAgBP,aAG1Ct9B,EAAU0+B,aAAeb,EAAgBt3D,IAGxCqC,IAAWkH,GAASuuD,IACrBr+B,EAAU2+B,kBAAoBd,EAAgBt3D,GAC9Cy5B,EAAU4+B,gBAAkBh1D,KAAK0a,gBAAgB4O,cAAc2qC,EAAgBj1D,SAG1Eo3B,CACT,CAEO6+B,0BAA0Bj2D,EAAgBy5B,GAC/C,MAAMhQ,EAAQysC,OAAOC,iBACftzD,EAAkC,CACtCnF,EAAG,iBACHO,OAAQ,CAAC,EACTub,OAAQ,CACN9b,EAAG,gCACH+7B,SAEF97B,GAAI8rB,EACJlQ,QAASvY,KAAK0a,gBAAgB4O,cAActqB,GAC5CunB,IAAKkC,EACLzpB,SACAqkB,KAAOoV,EAAsBpV,KAC7BxL,OAAQ7Y,GAIV,OADAgB,KAAKomB,0BAA0BpnB,GAAQgJ,IAAIygB,EAAO5mB,GAC3CA,CACT,CAEOuzD,iBAAiBC,GACtB,OAAOr1D,KAAK4iD,mBAAmByS,EACjC,CAEOd,mBAAmBv1D,G,QACxB,QAAIA,EAAO4nB,cAKuC,QAA1C,EAAkC,QAAnC,EADM5mB,KAAK0a,gBAAgB64C,QAAQv0D,GACZs2D,oBAAY,eAAEr4D,cAAM,eAAEs4D,UACtD,CAEO9P,oBACL5jD,EACAoX,EAAuCjZ,KAAKkb,cAAcrZ,EAAQ7C,SAE9Dia,IAIJA,EAAO+F,YAAcnd,EAAQ0kB,IAENvmB,KAAKkmB,kBAAkBrkB,EAAQ7C,OAAqB,eAAbia,EAAOvc,EAAqBuc,EAAOtc,QAAKsC,GACvFwpB,MAAQ5mB,EAAQ0kB,IAE/BvmB,KAAK+qB,eAAejQ,uBAAuB7B,GAAQ,EAAOpX,GAE1D7B,KAAKgb,yBAAyBnZ,EAAQ7C,OAAQia,GAChD,CAEOs4C,qBAAqB9vB,GAC1B,MAAM+zB,EAAcx1D,KAAK0hD,kBAAkBjgB,GAM3C,GAAG+zB,EAAa,CACd,MAAM,OAACx2D,EAAM,OAAE2uD,EAAM,QAAEnqD,GAAWgyD,EAC5BvvC,EAAiBjmB,KAAKkmB,kBAAkBlnB,GAc9C,OAZAgB,KAAKge,kBAAkBkX,mBAAmB,CACxCx4B,EAAG,uBACHyrB,SAAU,CAACwlC,GACX3nC,SAAK/mB,EACL80B,eAAW90B,IAGbgnB,EAAeI,QAAQxiB,OAAO8pD,UAEvB3tD,KAAK0hD,kBAAkBjgB,GAC9Bj+B,EAAQK,OAAO8pD,IAER,C,CAGT,OAAO,CACT,CAuCa8H,oB,0CACX,MAAM/S,EAAa1iD,KAAK0iD,WAAWn+C,MACnC,MAAOvE,KAAK+qB,eAAevL,gBAAgBrG,KAAmB,CAC5D,MAAM/W,QAAepC,KAAKusB,eAAe,CAACpQ,MAAO,IAAK5C,SAAUJ,KAChE,IAAIupC,KAAgBtgD,EAAOioB,MACzB,K,CAGN,G,CAqBOm9B,qBAAqBxoD,EAAgBkjB,G,UAC1C,MAAM+D,EAAiBjmB,KAAKkmB,kBAAkBlnB,EAAQkjB,GACtD,GAAGA,IAAaliB,KAAKsc,gBAAgBqD,QAAQ3gB,EAAOwd,YAAa,CAC/D,MAAMk5C,EAAqB11D,KAAKkmB,kBAAkBlnB,GAC5CyrB,EAAYlK,KAAK4E,IAAgC,QAA5B,EAAAuwC,EAAmBjrC,iBAAS,QAAI,EAAGxE,EAAewE,WACvE5oB,EAAU7B,KAAKsf,iBAAiBtgB,EAAQinB,EAAewC,OAC7D,QAAuB,QAAf,EAAA5mB,aAAO,EAAPA,EAAS5E,cAAM,eAAEusB,MAAOiB,EAAYxE,EAAewC,MAAQgC,EAAY,C,CAC1E,CACL,MAAM5oB,EAAU7B,KAAKsf,iBAAiBtgB,EAAQinB,EAAewC,OACvDgC,EAAYzrB,EAAOS,SAAW8gB,KAAK4E,IAAIc,EAAewE,UAAWxE,EAAeyE,iBAAmBzE,EAAewE,UAExH,QAAuB,QAAf,EAAA5oB,aAAO,EAAPA,EAAS5E,cAAM,eAAEusB,MAAOiB,EAAYxE,EAAewC,QAAS,EAAAxJ,GAAA,GAAmBwL,GAAaA,EAAY,C,CAEpH,CAGO8B,gBAAe,MAACpQ,EAAK,SAAE5C,IAM5B,IACIiS,EAAc,EAEdlL,EAAatgB,KAAK+qB,eAAe1K,cAAc9G,GAChD+G,IACDkL,EAA2B,MAAblL,EACdA,GAActgB,KAAKujB,YAAYC,uBAGjC,MACMk/B,EAAa1iD,KAAK0iD,WAAWn+C,MAC7BvF,EAASgB,KAAK+qB,eAAenL,mBAAmBrG,GAAYA,OAAWta,EAE7E,IAAIyK,EAAyDsK,EAC7D,GAAGhV,EAAQ,CACT,MAAM22D,EAAW31D,KAAK2T,WAAWC,UAAU,0BAA2BI,EAAS,CAC7EqI,QAASrc,KAAKsc,gBAAgBC,gBAAgBvd,EAAOwd,YACrDL,MARa,IASbM,YAAa6D,EACb5D,UApBa,EAqBbC,aAAc,GACb,CAEDwa,YAAY,IAGdztB,EAAU1J,KAAK+qB,eAAekC,qBAAqBjuB,EAAQ22D,E,MAK3DjsD,EAAU1J,KAAK2T,WAAWge,gBAAgB,sBAAuB3d,EAAS,CACxEwG,UAAWjB,EACXkD,YAAa6D,EACb5D,UAnCa,EAoCbk5C,YAAa51D,KAAK0a,gBAAgBkW,iBAnClCilC,WAoCA15C,MA3Ba,IA4Bb8kB,KAAM,KACL,CAED9J,YAAY,IAIhB,OAAOztB,EAAQ7E,MAAMzC,IACnB,IAAIsgD,KAA6B,gCAAbtgD,EAAO1F,EAAqC,OAAO,KAEpE,MACDsD,KAAKG,IAAI,8BAA+BiC,GAItCpD,GAAwBshB,GAA+B/G,IAAaJ,IACtEnZ,KAAK+qB,eAAetR,iBAAiBF,GAGnCva,GAAWshB,GAEbtgB,KAAK8e,iBAAiBC,mBAGxB/e,KAAKgd,gBAAgBgL,aAAa5lB,EAAOsW,OACzC1Y,KAAKsc,gBAAgB2L,aAAa7lB,EAAO8lB,OACzCloB,KAAKmf,aAAa/c,EAAO+lB,UAEzB,IAAI2tC,IAAuBx1C,EACvBy1C,GAAa,EACjB,MAAMC,EAAuD,IAAIzkD,IAC3D0kD,EAA8B18C,IAAaJ,GAAmB,KAAgBI,EAC9EyN,IAAqBhoB,GAAUua,IAAaJ,GAC5C0O,EACHzlB,EAAgD+X,SAChD/X,EAA+Bya,OAoDlC,IAnDA,EAAAiL,GAAA,GAAeD,GAAQ5O,I,QACrB,GAAIA,IAMAja,GAC0B,QAA3B,GAAD,EAACia,GAAkBuB,iBAAS,UAATA,UAAcy7C,GAGnCj2D,KAAK+qB,eAAe3L,WAAW,CAC7BnG,SACAoG,kBAAkB,EAClB2H,0BAGmB/nB,IAAlBga,EAAOja,QAqBV,GAjBI82D,GACD91D,KAAK0a,gBAAgBiL,UAAU1M,EAAOja,QAAUgB,KAAK0a,gBAAgB3b,UAAUka,EAAOwB,SACvFza,KAAK2jD,mBAAmB1qC,EAAO+F,aAC/B82C,GAAuB,GAOtBtqC,IAAe,EAAAzI,GAAA,GAAe9J,GAAUuS,IACzCxrB,KAAKgb,yBAAyB/B,EAAOja,OAAQia,GAC7C88C,GAAa,GAKX/2D,IAAW,EAAAigB,GAAA,GAAmBhG,EAAO8Q,qBAAuB,EAAA9K,GAAA,GAAmBhG,EAAO+Q,qBAInF,GAAG/Q,EAAO+F,YAAa,CAC5B,MAAME,EAAalf,KAAKsf,iBAAiBrG,EAAOja,OAAQia,EAAO+F,aAC5DE,IACDlf,KAAKk2D,yBAAyBh3C,EAAYjG,GAC1CjZ,KAAK+qB,eAAehF,iBAAiB9M,G,OAPvC+8C,EAAahuD,IAAIiR,EAAOja,OAAQ,CAACia,OAAQA,IAEzCjZ,KAAKG,IAAIxC,MAAM,eAAgBsb,EAAQjF,E,IAUxCgiD,EAAa5iD,KAAM,CAEpB,MAAMwE,EAAU,IAAIo+C,EAAahjD,QAC3ByY,EAAW7T,EAAQ1T,KAAKlF,GAAWgB,KAAKuf,mBAAmBvgB,KACjE2C,QAAQyQ,IAAIqZ,GAAU5mB,MAAK,KACzB7E,KAAK+c,UAAUrW,cAAc,sBAAuBsvD,GAEpD,IAAI,IAAItwD,EAAI,EAAGA,EAAIkS,EAAQpb,SAAUkJ,EAAG,CACtC,MAAM1G,EAAS4Y,EAAQlS,GACvB1F,KAAK+c,UAAUrW,cAAc,gBAAiB,CAC5C1H,SACAia,OAAQjZ,KAAKkb,cAAclc,I,KAOnC,MAAMkb,EAAS9X,EAAgD8X,MAGzDi8C,EAAgBn2D,KAAK+qB,eAAe1J,iBAAiB9H,GAAU,GACrE,IAAI68C,EAAgB,EACpB,IAAI,IAAI1wD,EAAI,EAAGlJ,EAAS25D,EAAc35D,OAAQkJ,EAAIlJ,IAAUkJ,GACvD,EAAAuZ,GAAA,GAAmBk3C,EAAczwD,GAAGsZ,gBACnCo3C,EAIN,MAAM/rC,GACHnQ,GACDk8C,GAAiBl8C,IAChB2N,EAAMrrB,OACN6tB,GACDrqB,KAAK+qB,eAAetL,iBAAiBlG,GAAU,GAG9Cw8C,EACD/1D,KAAKgb,2BAELhb,KAAK+c,UAAUrW,cAAc,sBAAuB,IAAI6K,KAG1D,MAAM4I,EAAU0N,EACVwuC,EA/JS,MA+JOl6C,EAAqBhC,EAAUA,EAAQ3S,MAAM,EAAG2U,GACtE,MAAO,CACLkO,MAAOA,GAASgsC,EAAcA,EAAc75D,OAAS,KAAO2d,EAAQA,EAAQ3d,OAAS,GACrF0d,QACAC,QAASk8C,EACV,GAEL,CAEaC,gBAAgBt3D,EAAgBy+C,EAAoBsK,EAAgBtsD,EAI5E,CAAC,G,iDACGA,EAAQ0yD,oBACR1yD,EAAQymB,SAEfljB,EAASgB,KAAK0a,gBAAgB6zC,kBAAkBvvD,IAAWA,EAG3D,IAAI,IAAI0G,EAAI,EAAGlJ,GAFfurD,EAAOA,EAAKvgD,QAAQiZ,MAAK,CAACC,EAAGC,IAAMD,EAAIC,KAEVnkB,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CACpD,MAAM6gB,EAAMwhC,EAAKriD,GACXuuD,EAAkBj0D,KAAKsf,iBAAiBm+B,EAAYl3B,GACvD0tC,EAAgBh3D,OAAOwpB,cACxBzmB,KAAK8+C,SAAS9/C,EAAQi1D,EAAgBpyD,QAAS,CAC7CiyB,SAAUmgC,EAAgBngC,SAC1B+mB,aAAcp/C,EAAQo/C,aACtBhpB,OAAQp2B,EAAQo2B,SAGlBk2B,EAAKl+C,OAAOnE,IAAK,KACflJ,E,CAIN,IAAIurD,EAAKvrD,OACP,OAAOmF,QAAQM,UAGjB,MAAMs0D,QAAev2D,KAAK2T,WAAW+c,YAC/B8lC,EAAezO,EAAKl+C,OAAO0sD,EAAOE,oBAAqB1O,EAAKvrD,OAAS+5D,EAAOE,qBAE/Eh7D,EAAQi7D,eACTj7D,EAAQk7D,YAAa,GAGvB,MAAM3mC,EAKF,CAAC,EAEC4mC,EAAoB,GACpBC,EAAc9O,EAAK7jD,KAAKqiB,I,cAC5B,MAAM0tC,EAAkBj0D,KAAKsf,iBAAiBm+B,EAAYl3B,GACpD1kB,EAA2B7B,KAAKwuD,wBAAwBxvD,EAAQvD,GACtEm7D,EAAQt2D,KAAKuB,EAAQlF,IAErB,MAAMqW,EAAqC,CACzC,WACA,SAIEvX,EAAQk7D,aACV90D,EAAQ+xB,SAAW5zB,KAAKw0D,sBAAsBx1D,EAAQi1D,GACtDjhD,EAAK1S,KAAK,QAAS,aAEA,QAAhB,EAAAuB,EAAQ+xB,gBAAQ,eAAE8gC,YAAa11D,IAAWgB,KAAK0a,gBAAgB1b,eACzD6C,EAAQwnB,SAIf5tB,EAAQi7D,cAAiBzC,EAAgBj8C,OAC3ChF,EAAK1S,KAAK,WAGZ,MAAMw2D,EAAqC,QAAxB,EAAA7C,EAAgBpgC,gBAAQ,eAAE6gB,gBACvCqiB,EAAoBhP,EAAKttD,QAAQq8D,GACvC,GAAGA,IAAqC,IAAvBC,EAA0B,CACzC,MAAMC,EAAgBJ,EAAQG,GAC9Bl1D,EAAQgyB,SAAW,CACjBn3B,EAAG,qBACHg4C,gBAAiBsiB,E,CAQrBhkD,EAAKnU,SAASuI,IAEZvF,EAAQuF,IAAO,EAAAunB,GAAA,GAAKslC,EAAgB7sD,GAAK,IAG3C,MAAMu/B,EAA+D,QAAnD,EAAA9kC,EAAQmW,aAA2C,eAAE2uB,SAoBvE,OAnBGA,IACmC,CAAC,QAAS,SACrC5X,SAAS4X,EAAS7oC,QACxB+D,EAAsB5E,OAAOgrD,cAAe,GAG5CthB,EAASqK,UAAYhxC,KAAK+c,UAAU3W,UACjB,EAAA6wD,GAAA,GAAsBtwB,KAEvC9kC,EAAQmW,MAA4C/a,OAAOi6D,WAAY,IAK3EjD,EAAgBnN,aAC8B,QAApC,EAAG92B,EAAO,EAAAikC,EAAgBnN,mBAAU,QAAjC92B,EAAO,GAAgC,CAAC29B,OAAQ,MAAO3tD,KAAKqiD,cAAel6B,SAAU,KAC7FA,SAAS7nB,KAAKuB,GAGfA,CAAO,IAGhB,IAAI,MAAMywD,KAAWtiC,EAAQ,CAC3B,MAAMmnC,EAAQnnC,EAAOsiC,GAClB6E,EAAMhvC,SAAS3rB,OAAS,GACzB26D,EAAMhvC,SAAStpB,SAASgD,IACtBA,EAAQilD,WAAaqQ,EAAMxJ,MAAM,G,CAKvCkJ,EAAYh4D,SAASgD,IACnB7B,KAAKovD,qBAAqBvtD,EAAS,CACjCkoD,cAAetuD,EAAQo/C,mBAAgB57C,EACvCowD,YAAY,GACZ,IAGJ,MAAMV,EAAsC,CAAC,EAC1C3uD,KAAK4hD,iBAAiB5iD,KACvB2vD,EAAmBC,eAAiB5uD,KAAK4hD,iBAAiB5iD,GAAQ8O,WAGpE,MAAMpE,EAA2C1J,KAAK2T,WAAWq7C,eAAe,2BAA4B,CAC1GoI,UAAWp3D,KAAK0a,gBAAgBkW,iBAAiB6sB,GACjD9gD,GAAIorD,EAAK7jD,KAAKqiB,IAAQ,EAAAtH,GAAA,GAAmBsH,KACzCuU,UAAW+7B,EAAY3yD,KAAKrC,GAAYA,EAAQi5B,YAChDu8B,QAASr3D,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC/Cs4D,cAAe77D,EAAQ87D,YACvB1lC,OAAQp2B,EAAQo2B,OAChBipB,cAAer/C,EAAQo/C,aACvB2c,YAAa/7D,EAAQk7D,WACrBc,oBAAqBh8D,EAAQi7D,aAC7B7zB,QAASpnC,EAAQqzD,aAAe9uD,KAAK0a,gBAAgBkW,iBAAiBn1B,EAAQqzD,mBAAgB7vD,GAC7F0vD,GAAoB9pD,MAAMgkB,IAC3B7oB,KAAKG,IAAI,2BAA4B0oB,GACrC7oB,KAAKge,kBAAkBmV,qBAAqBtK,EAAQ,IAClDlrB,IAEF,MADAqC,KAAK0uD,oBAAoBmI,EAAal5D,GAChCA,CAAK,IACV8qC,SAAQ,KACNzoC,KAAK4hD,iBAAiB5iD,KAAY2vD,UAC5B3uD,KAAK4hD,iBAAiB5iD,E,IAIjCgB,KAAK4hD,iBAAiB5iD,GAAU2vD,EAEhC,MAAMljC,EAA+B,CAAC/hB,GAKtC,OAJG8sD,EAAah6D,QACdivB,EAASnrB,KAAKN,KAAKs2D,gBAAgBt3D,EAAQy+C,EAAY+Y,EAAc/6D,IAGhEkG,QAAQyQ,IAAIqZ,GAAU5mB,KAAKyqD,GAAA,EACpC,G,CAEOoI,qBAAqBnxC,GAS5B,CAEQmoC,oBAAoBvmC,EAA6BxqB,GACvDwqB,EAAStpB,SAASgD,IAChB,GAAGA,EAAQlE,QAAUA,EAIrB,GAAGA,EAAO,CACRkE,EAAQlE,MAAQA,EAChBqC,KAAK+c,UAAUrW,cAAc,gBAAiB,CAAC0vC,WAAYv0C,EAAQu0C,WAAYuX,OAAQ9rD,EAAQ0kB,IAAK5oB,UAEpG,MAAMsb,EAASjZ,KAAKkb,cAAcrZ,EAAQ7C,QACvCia,GACDjZ,KAAK+c,UAAUrW,cAAc,gBAAiB,CAAC1H,OAAQ6C,EAAQ7C,OAAQia,U,aAGlEpX,EAAQlE,K,GAGrB,CAEOg6D,wBAAwBvwD,GAC7B,MAAMwwD,EAAIxwD,EAAIxH,MAAM,KACdZ,GAAkB44D,EAAE,GAE1B,MAAgB,cADkBA,EAAE,GACN53D,KAAK2sD,4BAA4B3tD,GAAUgB,KAAKomB,0BAA0BpnB,EAC1G,CAEOwnB,sBAAsBhjB,EAA+C+iB,GAK1E,MAJuB,iBAAd,IACP/iB,EAAUxD,KAAK23D,wBAAwBn0D,IAGlCA,GAAWA,EAAQe,IAAIgiB,EAChC,CAEQi+B,qBAAqBxlD,EAAgBlB,GAC3C,MAAM0F,EAA2B,IAAI+N,IAqBrC,OApBA/N,EAAQxE,OAASA,EACjBwE,EAAQ1F,KAAOA,EACf0F,EAAQ4D,IAAM,GAAGpI,KAAUlB,IAkBpB0F,CACT,CAEO4iB,0BAA0BpnB,G,QAC/B,OAA0C,QAA1C,KAAOgB,KAAK6iD,yBAAwB7jD,UAAM,UAANA,GAAYgB,KAAKwkD,qBAAqBxlD,EAAQ,UACpF,CAEO64D,mBAAmBzwD,GACxB,MAAmB,iBAAV,EACAA,EAEApH,KAAK23D,wBAAwBvwD,EAExC,CAEO0wD,eAAehqD,GACpB,IAAI,MAAM9O,KAAUgB,KAAK6iD,wBAAyB,CAChD,GAAG7iD,KAAK0a,gBAAgBiL,UAAU3mB,EAAOK,YACvC,SAGF,MAAMwC,EAAU7B,KAAK6iD,wBAAwB7jD,GAAQuF,IAAIuJ,GACzD,GAAGjM,EACD,OAAOA,C,CAIX,OAAO7B,KAAKwmB,sBAAsB,KAAM1Y,EAC1C,CAEOwR,iBAAiBtgB,EAAgB8O,GACtC,OAAI9O,EAIGgB,KAAKwmB,sBAAsBxmB,KAAKomB,0BAA0BpnB,GAAS8O,GAHjE9N,KAAK83D,eAAehqD,EAI/B,CAEOw2C,eAAeziD,GAGpB,OAFaA,EAAQ0W,SAAWvY,KAAK0a,gBAAgB3b,UAAU8C,EAAQ0W,UAAY,IAGrF,CAEO2C,cAAclc,GACnB,OAAOgB,KAAK+qB,eAAe7P,cAAclc,EAC3C,CAEO+4D,sBAAsB3hB,EAAgC2R,GAC3D,MAAMvkD,EAAUxD,KAAK63D,mBAAmBzhB,GACxC,IAAI4hB,GAAejQ,EAAKvrD,OAAQy7D,GAAclQ,EAAKvrD,OACnD,IAAI,MAAM+pB,KAAOwhC,EAAM,CACrB,MAAMlmD,EAAU7B,KAAKwmB,sBAAsBhjB,EAAS+iB,GASpD,GARIyxC,IACFA,GAAeh4D,KAAKk4D,WAAWr2D,IAG7Bo2D,IACFA,GAAcj4D,KAAKm4D,iBAAiBt2D,IAGnCm2D,GAAeC,EAAY,K,CAGhC,MAAO,CAACD,cAAaC,aACvB,CAEOG,0BAA0Bp5D,EAAgBkjB,GAC5CA,EACDliB,KAAK+qB,eAAe2B,kBAAkB1tB,EAAQkjB,GAE9CliB,KAAKuf,mBAAmBvgB,EAE5B,CAGOugB,mBAAmB+R,GACxB,IAAI5nB,EACJ,QAAiBzK,IAAdqyB,EAAyB,CAC1B,MAAMtyB,EAASgB,KAAK0a,gBAAgB3b,UAAUuyB,GAC9CtxB,KAAKG,IAAI2C,KAAK,qBAAsB9D,GAEpC,IAAImS,EAAMnR,KAAKoiD,yBAAyB79C,IAAIvF,GAK5C,GAJGmS,IACDzH,EAAUyH,EAAIzH,SAGbA,EACD,OAAOA,EAGTA,GAAU,SACV1J,KAAKoiD,yBAAyBp6C,IAAIhJ,EAAQmS,EAAM,CAC9CknD,gBAAiBr4D,KAAK0a,gBAAgB49C,uBAAuBhnC,GAC7D5nB,W,CAIJ,OAAG1J,KAAKu4D,6BAIRv4D,KAAKu4D,4BAA6B,EAAAzuD,EAAA,GAAM,GAAGjF,MAAK,KAC9C,MAAM2zD,EAAsC,GACtC/sC,EAA+C,CAAC,EACtD,IAAI,MAAOzsB,GAAQ,gBAACq5D,EAAe,QAAE3uD,MAAa1J,KAAKoiD,yBACrDoW,EAAiBl4D,KAAK+3D,GACtB5sC,EAASzsB,GAAU0K,EAGrB,MAAMmjB,EAAe,KACnB,IAAI,MAAM7tB,KAAUysB,EAClBzrB,KAAKoiD,yBAAyBv+C,QAAQ7E,GACtCysB,EAASzsB,GAAQiD,aAAQhD,E,EAkB7B,MAde,KAAW,mCACxB,OAAQ,CACN,MAAMmD,QAAepC,KAAK2T,WAAWC,UAAU,0BAA2B,CAACwd,MAAOonC,IAC5EC,EAAez4D,KAAKge,kBAAkB2U,cACtC,MAAC3rB,GAAS5E,EAChB,IAAGq2D,EAAazyC,KAAOyyC,EAAazyC,MAAQhf,EAAMgf,IAKlD,OAAO5jB,QAJC,EAAA0H,EAAA,GAAM,I,CAMlB,IAEO0oD,GAAS3tD,MAAMzC,IACpB,IAAI,MAAMpD,KAAUysB,EAClBzrB,KAAKoiD,yBAAyBv+C,QAAQ7E,GAGxCgB,KAAK+qB,eAAehP,aAAa3Z,GAEjCA,EAAO+X,QAAQtb,SAASoa,IACtB,MAAMja,EAASia,EAAOja,OACnBA,IACDysB,EAASzsB,GAAQiD,QAAQgX,UAClBwS,EAASzsB,G,GAElB,GACDswD,GAAA,GAAMzqD,MAAK,KACZgoB,IAEA7sB,KAAKu4D,2BAA6B,KAC/Bv4D,KAAKoiD,yBAAyBhvC,MAC/BpT,KAAKuf,oB,GAEP,KArDK7V,GAAW1J,KAAKu4D,0BAyD3B,CAEQG,eAAe15D,EAAgB25D,EAAsBC,EAAkB12C,GAC7E,IAAIxY,EACJ,MAAMo3B,EAAiB+3B,IACrB74D,KAAKge,kBAAkBmV,qBAAqB,CAC1Cz2B,EAAG,cACH2d,OAAQ,CACN3d,EAAG,YACHspB,IAAK6yC,EAAgB7yC,IACrB+N,UAAW8kC,EAAgB9kC,cAI3B8kC,EAAgB1sC,QAIbnsB,KAAK04D,eAAe15D,EAAQ25D,EAAYC,EAAQ12C,IAyBzD,OAVExY,EAZEwY,EAYQliB,KAAK2T,WAAWktB,uBAAuB,CAC/Ch4B,OAAQ,8BACRmL,OAAQ,CACNqI,QAASrc,KAAKsc,gBAAgBC,gBAAgBvd,EAAOwd,YACrD24B,YAAY,EAAAl2B,GAAA,GAAmBiD,IAEjC4e,kBAjBQ9gC,KAAK2T,WAAWktB,uBAAuB,CAC/Ch4B,OAAQ,yBACRmL,OAAQ,CACN2kD,aACAC,SACAn+C,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5CgoD,OAAQ,GAEVlmB,kBAaGp3B,CACT,CAEaovD,aAAa95D,EAAgB+5D,EAAqBH,EAAkB12C,G,0CAC/E,GAAGliB,KAAK0a,gBAAgBiL,UAAU3mB,KAAYkjB,EAAU,CACtD,MAAMxY,EAAU1J,KAAKg5D,WAAWh6D,EAAQ,EAAG,GAErCi6D,QAAsBvvD,EAEtBgc,EAAY1mB,EAAOwd,WACnBiM,EAAQwwC,EAAc5yC,QAAQ,IAAM,EAC1C,OAAOrmB,KAAK2T,WAAWge,gBAAgB,yBAA0B,CAC/DtV,QAASrc,KAAKsc,gBAAgBC,gBAAgBmJ,GAC9CshC,QAAQ,EAAA/nC,GAAA,GAAmBwJ,KAC1B5jB,MAAMosB,IACJA,GACDjxB,KAAKge,kBAAkBkX,mBAAmB,CACxCx4B,EAAG,iCACH6C,WAAYmmB,EACZ2iC,iBAAkB5/B,IAIfwI,I,CAIX,OAAOjxB,KAAK04D,eAAe15D,EAAQ+5D,EAAWH,EAAQ12C,GAAUrd,MAAK,KAKnE,GAJIqd,GACFliB,KAAKipD,sBAAsBjqD,GAG1B+5D,EACD/4D,KAAK+c,UAAUrW,cAAc,eAAgB,CAAC1H,SAAQia,OAAQjZ,KAAKkb,cAAclc,SAC5E,CACL,MAAMoI,EAAMpH,KAAKk5D,aAAal6D,EAAQkjB,GAItC,UAHOliB,KAAKmiD,sBAAsB/6C,UAC3BpH,KAAKsiD,QAAQl7C,IAEhB8a,EAAU,CACZ,MAAM5L,EAAItW,KAAKoiD,yBAAyB79C,IAAIvF,GACzCsX,IACDtW,KAAKoiD,yBAAyBv+C,OAAO7E,GACrCsX,EAAE5M,QAAQzH,aAAQhD,G,CAItBe,KAAK+qB,eAAelN,qBAAqB7e,EAAQkjB,E,IAGvD,G,CAEQ+mC,sBAAsBjqD,GAC5B,CACEgB,KAAKgjD,iBACLhjD,KAAKijD,eACLjjD,KAAKkjD,gBACLljD,KAAK4hD,iBACL5hD,KAAKuoB,gBACL1pB,SAAS+4D,WACFA,EAAE54D,EAAO,IAGlB,IAAI,MAAMoI,KAAOpH,KAAKmjD,iBAChB/7C,IAAQpI,GAAUoI,EAAI+lD,WAAWnuD,EAAS,cACrCgB,KAAKmjD,eAAe/7C,GAI/B,MAAM26C,EAAqB/hD,KAAK+hD,mBAAmBx9C,IAAIvF,GACvD,GAAG+iD,EAAoB,CACrB,IAAI,MAAOx7B,EAAK7c,KAAYq4C,EAC1Br4C,EAAQzH,QAAQjC,KAAK03D,qBAAqBnxC,IAG5Cw7B,EAAmBnjD,O,CAGrB,CACEoB,KAAK6iD,wBACL7iD,KAAK+iD,0BACLlkD,SAAS+4D,IACT,MAAMuB,EAAKvB,EAAE54D,GACVm6D,GACDA,EAAGv6D,O,IAIPoB,KAAK+qB,eAAehN,sBAAsB/e,EAC5C,CAEOo6D,mBAAmBp6D,GACxB,OAAO2C,QAAQyQ,IAAI,CACjBpS,KAAKue,gBAAgBrX,WACrBlH,KAAKq5D,iBAAiBr6D,KAEvB6F,MAAK,EAAEmC,EAAO4T,MACb5T,EAAM4iD,qBAAqB5qD,GAAU4b,EAAO6N,MAC5CzoB,KAAK+c,UAAUrW,cAAc,qBAAsB,CAAC1H,SAAQypB,MAAO7N,EAAO6N,OAAO,GAErF,CAEOkhC,qBAAqB3qD,EAAgBkjB,GAC1C,OAAOljB,GAAUkjB,EAAW,IAAMA,EAAW,GAC/C,CAEOm3C,iBAAiBr6D,EAAgBkjB,G,UACtC,MAAM2X,EAAmE,QAAlE,KAAG75B,KAAKmjD,gBAAc,EAACnjD,KAAK2pD,qBAAqB3qD,EAAQkjB,WAAS,aAAM,CAAC,EAChF,OAAG2X,EAAEnwB,QAAgBmwB,EAAEnwB,QACfmwB,EAAEpR,MAAc9mB,QAAQM,QAAQ43B,GAEjCA,EAAEnwB,QAAU1J,KAAKs5D,UAAU,CAChCt6D,SACAu6D,YAAa,CAAC78D,EAAG,6BACjB+rB,MAAO,EACPtM,MAAO,EACP+F,aACCrd,MAAMzC,I,MAGP,OAFAy3B,EAAE3f,MAAQ9X,EAAO8X,MACjB2f,EAAEpR,MAAyB,QAAjB,EAAArmB,EAAOikB,QAAQ,UAAE,eAAEE,IACtBsT,CAAC,IACP4O,SAAQ,YACF5O,EAAEnwB,OAAO,GAEpB,CAEO8vD,uBAAuBx6D,EAAgBkjB,G,MAC5C,OAAuE,QAAhE,EAAAliB,KAAKmjD,eAAenjD,KAAK2pD,qBAAqB3qD,EAAQkjB,WAAU,eAAEhI,KAC3E,CAEOu/C,uBAAuBz6D,EAAgBkjB,G,MAC5C,OAAuE,QAAhE,EAAAliB,KAAKmjD,eAAenjD,KAAK2pD,qBAAqB3qD,EAAQkjB,WAAU,eAAEuG,KAC3E,CAEOixC,oBAAoB16D,EAAgBunB,EAAaozC,EAAiB9nC,EAAkB+nC,GACzF,OAAO55D,KAAK2T,WAAWC,UAAU,+BAAgC,CAC/D6G,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5C26D,QACA9nC,SACA+nC,aACAj9D,IAAI,EAAAsiB,GAAA,GAAmBsH,KACtB1hB,MAAMgkB,IAEP7oB,KAAKge,kBAAkBmV,qBAAqBtK,EAAQ,GAExD,CAEOgxC,iBAAiB76D,GACtB,OAAOgB,KAAK2T,WAAWge,gBAAgB,4BAA6B,CAClElX,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,KAC3C6F,MAAMg0D,IACP74D,KAAKge,kBAAkBmV,qBAAqB,CAC1Cz2B,EAAG,cACH2d,OAAQ,CACN3d,EAAG,YACHspB,IAAK6yC,EAAgB7yC,IACrB+N,UAAW8kC,EAAgB9kC,aAI3B8kC,EAAgB1sC,OAcbnsB,KAAK65D,iBAAiB76D,IAbXgB,KAAKomB,0BAA0BpnB,GACvCH,SAASgD,IACXA,EAA4B5E,OAAO2d,eAC7B/Y,EAA4B5E,OAAO2d,M,IAI/C5a,KAAK+c,UAAUrW,cAAc,uBAAwB,CAAC1H,SAAQ86D,UAAU,WACjE95D,KAAKmjD,eAAenjD,KAAK2pD,qBAAqB3qD,KAE9C,KAKb,CAEO+6D,aAAajT,GAClB,MAAMqQ,EAAQn3D,KAAK8iD,uBAAuBgE,GAC1C,OAAO,EAAAiT,GAAA,GAAaj5D,MAAMC,KAAKo2D,EAAMhhD,UACvC,CAEO6jD,sBAAsBn4D,GAC3B,KAAIA,aAAO,EAAPA,EAASilD,YAAY,OAAOjlD,EAEhC,MAAM2B,EAAUxD,KAAK8iD,uBAAuBjhD,EAAQilD,YACpD,IAAImT,EAAS/E,OAAOC,iBACpB,IAAI,MAAO5uC,EAAK1kB,KAAY2B,EACvB3B,EAAQ0kB,IAAM0zC,IACfA,EAASp4D,EAAQ0kB,KAIrB,OAAOvmB,KAAKwmB,sBAAsBhjB,EAASy2D,EAC7C,CAEOC,eAAeC,EAAmB15C,EAAuB,OAC9D,OAAO,EAAAymC,GAAA,GAAqBlnD,KAAK8iD,uBAAuBqX,GAAY15C,EACtE,CAEO25C,mBAAmBD,GACxB,MAAMpS,EAAO/nD,KAAKk6D,eAAeC,EAAW,OACtC32D,EAAUxD,KAAK8iD,uBAAuBqX,GAC5C,OAAOpS,EAAK7jD,KAAKqiB,GAAQvmB,KAAKwmB,sBAAsBhjB,EAAS+iB,IAC/D,CAEO8zC,iBAAiBx4D,GACtB,OAAIA,EACKA,EAA4BilD,WAAmB9mD,KAAKk6D,eAAgBr4D,EAA4BilD,YAC7F,CAACjlD,EAAQ0kB,KAFD,EAGtB,CAEO+zC,eAAez4D,EAAoBohB,GACxC,MAAMuG,EAAmB,GACzB,GAAI3nB,EAA4BilD,WAAY,CAC1C,MAAMtjD,EAAUxD,KAAK8iD,uBAAwBjhD,EAA4BilD,YACzE,IAAI,MAAOvgC,EAAK1kB,KAAY2B,EACvByf,EAAOphB,IACR2nB,EAAIlpB,KAAKuB,E,MAIVohB,EAAOphB,IACR2nB,EAAIlpB,KAAKuB,GAIb,OAAO2nB,CACT,CAEOJ,sBAAsBpqB,GAC3B,MAAMia,EAASjZ,KAAKkb,cAAclc,GAClC,OAAOgB,KAAKu6D,sBAAsBnxC,uBAAsBnQ,aAAM,EAANA,EAAQ+F,cAAe,EACjF,CAEOk3C,yBAAyBr0D,EAAoBoX,EAA8BjZ,KAAKkb,cAAcrZ,EAAQ7C,SACxGia,GAAUpX,EAAQ0kB,KAChB1kB,EAAQ0kB,IAAMtN,EAAOpX,EAAQ5E,OAAOusB,IACrC,qBACA,uBACA3nB,EAAQ5E,OAAOktB,QAAS,EAG9B,CAEOqwC,YAAY34D,EAAkBpG,EAKhC,CAAC,G,cACJ,IAAIoG,GAAyB,iBAAdA,EAAQnF,EACrB,OAGY,QAAd,EAAAmF,EAAQ5E,cAAM,QAAd4E,EAAQ5E,OAAW,CAAC,GAKpB,MAAM+B,EAASgB,KAAKskD,eAAeziD,GAC7B2B,EAAU/H,EAAQ+H,SAAWxD,KAAKomB,0BAA0BpnB,GAC5D2mB,EAAkC,gBAAtB9jB,EAAQ0W,QAAQ7b,EAC5BqzB,EAAcpK,GAAa3lB,KAAKsc,gBAAgByT,YAAY/wB,EAAOwd,YACnEi+C,EAA0B,YAAd54D,EAAQnF,EAEvBjB,EAAQguB,aACT5nB,EAAQ5E,OAAOwpB,aAAc,GAG/B,MAAMF,GAAM,EAAAjL,GAAA,GAAkBzZ,EAAQlF,IACtCkF,EAAQ0kB,IAAMA,EAEXk0C,IACEh/D,EAAQsuD,cACTloD,EAAQ5E,OAAO8wD,cAAe,GAG7BlsD,EAAQilD,aACqD,QAAjD,KAAG9mD,KAAK8iD,wBAAsB,EAACjhD,EAAQilD,mBAAU,aAAM9mD,KAAKwkD,qBAAqBxlD,EAAQ,YAC9FgJ,IAAIue,EAAK1kB,GAGhBA,EAAQgyD,aAEThyD,EAAQiW,SAAWjW,EAAQgyD,aAM/B,MAAM6G,EAAU74D,EAAQgyB,SACrB6mC,IACEA,EAAQhmB,kBACTgmB,EAAQhmB,gBAAkB7yC,EAAQijD,cAAe,EAAAxpC,GAAA,GAAkBo/C,EAAQhmB,kBAG1EgmB,EAAQvG,kBACTuG,EAAQvG,iBAAkB,EAAA74C,GAAA,GAAkBo/C,EAAQvG,mBAIxD,MAAML,EAAU2G,GAAa54D,EAAQiyD,QAClCA,IACEA,EAAQ9M,SAAQ8M,EAAQ9M,QAAS,EAAA1rC,GAAA,GAAkBw4C,EAAQ9M,SAC3D8M,EAAQ7M,cAAa6M,EAAQ7M,aAAc,EAAA3rC,GAAA,GAAkBw4C,EAAQ7M,eAG1E,MAAM0T,IAAgB37D,EAClB27D,IACF94D,EAAQwhB,MAAQrjB,KAAKujB,YAAYC,uBAInC,MAAMtd,EAAOlG,KAAK0a,gBAAgB1b,OAE5Bo3B,EAAYqkC,GAAc54D,EAA4B+xB,SAY5D,GAVA/xB,EAAQ7C,OAASA,EAEf6C,EAAQgW,OADP7Y,IAAWkH,EACKkwB,EAAaA,EAAU/M,QAAUrpB,KAAK0a,gBAAgB3b,UAAUq3B,EAAU/M,SAAW,KAAgBnjB,EAGrGrE,EAAQ5E,OAAOq5B,OAASz0B,EAAQwnB,QAAUrqB,EAASgB,KAAK0a,gBAAgB3b,UAAU8C,EAAQwnB,SAG7GrpB,KAAKk2D,yBAAyBr0D,GAE3Bu0B,EAAW,CAETA,EAAU2+B,oBAAmB3+B,EAAU2+B,mBAAoB,EAAAz5C,GAAA,GAAkB8a,EAAU2+B,oBACvF3+B,EAAU0+B,eAAc1+B,EAAU0+B,cAAe,EAAAx5C,GAAA,GAAkB8a,EAAU0+B,eAEhF,MAAMr6C,EAAO2b,EAAU4+B,iBAAmB5+B,EAAU/M,QAC9CuxC,EAAQxkC,EAAU2+B,mBAAqB3+B,EAAU0+B,aACvD,GAAGr6C,GAAQmgD,EAAO,CAChB,MAAMC,EAAkB76D,KAAK0a,gBAAgB3b,UAAU0b,GACjDqgD,GAAe,EAAAx/C,GAAA,GAAkBs/C,GACvC/4D,EAAQk5D,UAAYF,EAAkB,IAAMC,C,CAU9Cj5D,EAAQkW,UAAY/X,KAAK0a,gBAAgB3b,UAAUq3B,EAAU/M,SAEzDsxC,IACFvkC,EAAU/S,MAAQrjB,KAAKujB,YAAYC,sB,CAIvC,MAAMw3C,EAAiC,CACrCl9D,KAAM,UACNkB,SACA8O,UAAWyY,GAUb,IAAI00C,GAAc,EAClB,MAAMjjD,EAAQyiD,GAAa54D,EAAQmW,MACnC,GAAGA,EACD,OAAOA,EAAMtb,GACX,IAAK,2BACImF,EAAQmW,MACf,MAGF,IAAK,oBACAA,EAAM8jC,YACPmf,GAAc,EAEdjjD,EAAMygB,MAAQz4B,KAAK+8C,iBAAiBC,UAAUhlC,EAAMygB,MAAOuiC,GAGxDhjD,EAAyCygB,cACrC52B,EAAQmW,MAGjB,MAGF,IAAK,mBAAoB,CACvB,MAAM5V,EAASpC,KAAKitD,gBAAgBiG,SAASl7C,EAAMg1C,KAAMh1C,EAAM9S,QAASrD,GACxEmW,EAAMg1C,KAAO5qD,EAAO4qD,KACpBh1C,EAAM9S,QAAU9C,EAAO8C,QACvB,K,CAGF,IAAK,uBACH,GAAG8S,EAAM8jC,YACPmf,GAAc,MACT,CACL,MAAMC,EAAcljD,EAAM2uB,SAC1B3uB,EAAM2uB,SAAW3mC,KAAK23C,eAAe7H,QAAQorB,EAAaF,GAEtDhjD,EAAM2uB,UAA8B,kBAAlBu0B,EAAYx+D,IAChCu+D,GAAc,E,CAIlB,MAGF,IAAK,sBAAuB,CAC1B,MAAME,EAAan7D,KAAK6sD,mBAAmBuO,+BAA+Bp8D,EAAQunB,EAAK9qB,EAAQsuD,aAC/F/xC,EAAM40C,QAAU5sD,KAAK6sD,mBAAmBwO,YAAYrjD,EAAM40C,QAASuO,EAAYH,GAE3EhjD,EAAM40C,gBACD/qD,EAAQmW,MAGjB,K,CAQF,IAAK,sBAAuB,CAC1BA,EAAMygB,MAAQz4B,KAAKs7D,kBAAkBC,gBAAgBvjD,EAAMygB,OAC3D,MAAMupB,EAAgBhqC,EAAMkyC,eAC5B,GAAwB,0BAArBlI,aAAa,EAAbA,EAAetlD,GAA8B,CAC9C,MAAM8+D,EAAqBxZ,EAAchqC,MACxCwjD,EAAsD/iC,MAAQz4B,KAAK+8C,iBAAiBC,UAAWwe,EAAsD/iC,MAAOuiC,GAC5JQ,EAAyD70B,SAAW3mC,KAAK23C,eAAe7H,QAAS0rB,EAAyD70B,SAAUq0B,E,CAEvK,K,CAGF,IAAK,0BACHC,GAAc,EAiBpB,GAPGR,GAAaQ,IACdp5D,EAAQmW,MAAQ,CAACtb,EAAG,2BACpBmF,EAAQA,QAAU,UACXA,EAAQiyB,gBACRjyB,EAAQ45D,gBAGbhB,GAAa54D,EAAQ2W,OAAQ,CAC/B,MAAMA,EAAS3W,EAAQ2W,OACjB5I,EAAS/N,EAAQgW,SAAW7X,KAAKgd,gBAAgBC,UAAUtgB,GAAK,MAAQ,GAC9E,IAAI++D,EAAqBC,EAUzB,OARInjD,EAAoDigB,QACrDjgB,EAAoDigB,MAAQz4B,KAAK+8C,iBAAiBC,UAAWxkC,EAAoDigB,MAAOuiC,IAGvJxiD,EAAemuB,WAChBnuB,EAAemuB,SAAW3mC,KAAK23C,eAAe7H,QAASt3B,EAAeigB,MAAOuiC,IAGzExiD,EAAO9b,GAEZ,IAAK,8BAE6B,QAA5B,EAAA8b,EAAOigB,aAAqB,eAAEmjC,aAEhCpjD,EAAO9b,EAAIqzB,EAAc,gCAAkC,6BAExDA,IAEDvX,EAAO9b,EAAI,iCAGf,MAEF,IAAK,yBAA0B,CAK7B,IAAIoB,EAFJkC,KAAK67D,qBAAqBrjB,cAAchgC,EAAOshB,MAI7Ch8B,OADqBmB,IAApBuZ,EAAOwiB,SACD,UAEA,QAGLjL,IACFjyB,GAAQ,MAAQ8R,GAIlB4I,EAAO1a,KAAOA,EAEd,K,CAGF,IAAK,6BAOAiyB,IAEDvX,EAAO9b,EAAI,iCAEb,MAEF,IAAK,+BACAqzB,IAEDvX,EAAO9b,EAAI,mCAEb,MAEF,IAAK,2BACwB,IAAxB8b,EAAOE,MAAMlc,QAEdgc,EAAOpZ,QAAUoZ,EAAOE,MAAM,GAE3B7W,EAAQgW,SAAWW,EAAOpZ,UAGzBoZ,EAAO9b,EAFNipB,EAEU,0BAA4B/V,EAG5B,0BAA4BA,IAGnC4I,EAAOE,MAAMlc,OAAS,IAE9Bgc,EAAO9b,EAAI,6BAEb,MAEF,IAAK,8BACAmF,EAAQgW,SAAWW,EAAOpZ,UAE3BoZ,EAAO9b,EAAI,yBAA2BkT,GAExC,MAEF,IAAK,kCACH8rD,EAAcljD,EAAOhZ,QAAQH,UAAS,GACtCs8D,EAAY38D,EACZ,MAEF,IAAK,6BACH08D,EAAc18D,EACd28D,EAAYnjD,EAAOjZ,WAAWF,UAAS,GACvC,MAEF,IAAK,4BAEHwC,EAAQ8kD,eAAgB,SACjB9kD,EAAQ5E,OAAOusB,WACf3nB,EAAQ5E,OAAOktB,OACtB,MAEF,IAAK,yBAEH3R,EAAO1a,MACJ0a,EAAOvb,OAAO29B,MAAQ,SAAW,UACb37B,IAApBuZ,EAAOwiB,SAA0Bn5B,EAAQ5E,OAAOusB,IAAM,OAAS,MAAS,UAEnDvqB,IAApBuZ,EAAOwiB,SAAyB,KACV,iCAApBxiB,EAAOha,OAAO9B,EACZ,SACA,aAMTg/D,GACCC,IACC37D,KAAK6pB,eAAe6xC,KACpB17D,KAAK8pB,eAAe6xC,IACvB37D,KAAK87D,cAAcJ,EAAaC,E,CAoBpC,OANGlB,GAAa54D,EAAQA,QAAQrF,SAAWqF,EAAQ45D,eACjDz7D,KAAKmvD,oBAAoBttD,GAG3B2B,EAAQwE,IAAIue,EAAK1kB,GAEVA,CACT,CAEOsd,aAAagJ,EAAiB1sB,EAKhC,CAAC,GACJ,OAAI0sB,EAAiBoQ,QACpBpQ,EAAiBoQ,OAAQ,EAC1BpQ,EAAStpB,SAAQ,CAACgD,EAASwC,EAAKwG,KAC9BA,EAAIxG,GAAOrE,KAAKw6D,YAAY34D,EAASpG,EAAQ,KAHZ0sB,CAOrC,CAEa4zC,sBAAsB/8D,EAAgBkjB,G,0CACjD,MACM1a,EADiBxH,KAAKkmB,kBAAkBlnB,EAAQkjB,GACzBmE,QAAQ7e,MACrC,GAAGA,EAAM6iB,MAAM,cAAoB7iB,EAAMhL,OAAQ,CAC/C,IAAIw/D,EACJ,MAAMC,EAAWj8D,KAAK0a,gBAAgB1b,OACtC,IAAI,MAAMunB,KAAO/e,EAAO,CACtB,MAAM3F,EAAU7B,KAAKsf,iBAAiBtgB,EAAQunB,GAG9C,IAFa01C,IAAaj9D,EAAS6C,EAAQgW,SAAWokD,EAAWp6D,EAAQ5E,OAAOusB,aAGrExpB,KAAKk8D,eAAer6D,EAAS,SAAS,CAC7Cm6D,EAAcn6D,EACd,K,EAQN,OAAOm6D,C,CAEX,G,CAEQ7M,oBAAoBttD,GAC1B,MAAMs6D,EAAct6D,EAAQiyB,SAAWjyB,EAAQiyB,SAAStsB,QAAU,GAClE3F,EAAQA,SAAU,EAAA01C,GAAA,GAAS11C,EAAQA,QAASs6D,GAE5C,MAAMC,GAAa,EAAAC,GAAA,GAAcx6D,EAAQA,SACzCA,EAAQ45D,eAAgB,EAAAa,GAAA,GAAcH,EAAaC,EACrD,CAEOG,eAAev9D,EAAgB+oD,EAAgBvpD,EAA2BqD,GAC/E,OAAO7B,KAAK2T,WAAWge,gBAAgB,kBAAmB,CACxDlX,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5CrC,GAAIorD,EAAK7jD,KAAKqiB,IAAQ,EAAAtH,GAAA,GAAmBsH,KACzC/nB,OAAQ,CACN9B,EAAG8B,GAELqD,WAEJ,CAEO87C,SAASxmC,EAAc7X,EAAiBo+C,GAC7C,MAAM1+C,EAASM,EAASA,EAAOD,UAAS,GAAQ8X,EAAM9X,WACtD,GAAGq+C,EAAY,CACb,MAAMjc,GAAW,UAEjB,OAAOzhC,KAAK2T,WAAWC,UAAU,oBAAqB,CACpD6oC,IAAKz8C,KAAKgd,gBAAgB6d,aAAa1jB,GACvCsD,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5C87B,UAAW2G,EACXue,YAAatC,IACZ74C,MAAMgkB,IACP7oB,KAAKge,kBAAkBmV,qBAAqBtK,EAAQ,G,CAIxD,MAAMpsB,EAAM,SACZ,GAAG6C,EAAQ,CACT,IAAIoK,EAOJ,OALEA,EADC1J,KAAKsc,gBAAgBqJ,UAAUrmB,GACtBU,KAAKsc,gBAAgBqhB,gBAAgBr+B,EAAQ,CAAC6X,IAE9CnX,KAAKsc,gBAAgB4hB,YAAY5+B,EAAQ6X,EAAO,GAGrDzN,EAAQsE,OAAOrQ,IACpB,GAAkB,6BAAfA,aAAK,EAALA,EAAOG,MAKV,MAAMH,EAJJA,EAAMuwD,SAAU,CAIP,IACVrpD,MAAK,IACC7E,KAAK8+C,SAAS9/C,EAAQvC,EAAM,IAAMuD,KAAK0a,gBAAgBujC,gBAAgB9mC,EAAM9X,c,CAIxF,OAAOW,KAAK8+C,SAAS9/C,EAAQvC,EAC/B,CAEO+/D,gBAAgB5kD,EAAmB2B,GACxCvZ,KAAK2T,WAAWC,UAAU,0BAA2B,CACnD0G,aAAc1C,EAAQ1T,KAAKlF,IAClB,CACLtC,EAAG,kBACH+d,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5Cwb,UAAWjB,QAGd1U,MAAMgkB,IAEP7oB,KAAKge,kBAAkBmV,qBAAqBtK,EAAQ,GAExD,CAEO3I,UAAUhE,GACf,OAAOlc,KAAKigB,eAAeC,UAAUhE,EACvC,CAEauU,gBAAgBh1B,G,gDAK3B,MAAM,OAACuD,EAAM,QAAEqc,EAAO,SAAEa,GAAWb,EAAUrc,OAASC,IAAaxD,EACnE,QAAgBwD,IAAbid,EACD,MAAM,IAAInR,MAAM,eAGlB,GAAGmR,EAAW,EACZ,OAAOlc,KAAKigB,eAAewQ,gBAAgBzxB,EAAQkd,GAGrD,MAAMjD,EAASjZ,KAAK+qB,eAAe5H,iBAAiBnkB,EAAQqc,GAC5D,IAAIpC,EAAQ,WAAMha,EAElB,MAAM2b,IAAsB,QAAb,EAAA3B,EAAOhc,cAAM,eAAE2d,cAAS3b,EAEvC,GAAG2b,EAAQ,CACT,MAAMuK,QAAYnlB,KAAK2T,WAAWyI,SAASf,EAAU,WAA2B,IAAba,EAAiB,YAAc,OAClG,GAAGlc,KAAK+qB,eAAepM,gBAAgBzC,GAAU1f,QAAU2oB,EACzD,MAAM,EAAA5N,EAAA,GAAU8D,EAAU,kBAAoB,0B,CAIlD,OAAGA,EACMrb,KAAKsc,gBAAgBwmB,uBAAuB9jC,EAAOwd,WAAYnB,EAAST,GAG1E5a,KAAK2T,WAAWC,UAAU,2BAA4B,CAC3D6G,KAAMza,KAAK0a,gBAAgB49C,uBAAuBt5D,GAClD4b,WACC/V,MAAMosB,IACP,MAAMh0B,EAA8C2d,EAAS,CAACA,UAAU,CAAC,EACzE5a,KAAKge,kBAAkB+K,WAAW,CAChCrsB,EAAG,qBACH+d,KAAMza,KAAK0a,gBAAgB+hD,cAAcz9D,GACzCwb,UAAW0B,EACXjf,UACA,G,IAICy/D,iBAAiB19D,EAAgB29D,G,MACtC,MAAM1jD,EAASjZ,KAAKkb,cAAclc,GAClC,IAAIia,EAAQ,OAAOtX,QAAQC,SAE3B,MAAMuoB,GAASwyC,KAAqB,QAAb,EAAA1jD,EAAOhc,cAAM,eAAEopD,mBAAcpnD,EACpD,OAAOe,KAAK2T,WAAWC,UAAU,4BAA6B,CAC5D6G,KAAMza,KAAK0a,gBAAgB49C,uBAAuBt5D,GAClDmrB,WACCtlB,MAAMosB,IACP,GAAGA,EAAM,CACP,MAAMh0B,EAAkDktB,EAAS,CAACA,UAAU,CAAC,EAC7EnqB,KAAKomD,yBAAyB,CAC5B1pD,EAAG,yBACH+d,KAAMza,KAAK0a,gBAAgB+hD,cAAcz9D,GACzC/B,U,IAIR,CAEO6+D,cAAcJ,EAAqBC,GACxC,IAAI37D,KAAK6pB,eAAe6xC,KACrB17D,KAAK8pB,eAAe6xC,IACrB37D,KAAKsc,gBAAgBia,QAAQolC,EAAUn/C,YAAa,CACpD,MAAMogD,EAAW58D,KAAKsc,gBAAgBsB,QAAQ89C,EAAYl/C,aACvDogD,aAAQ,EAARA,EAAUlzC,cAAgBkzC,EAASlzC,YAA0CnqB,aAAeo8D,EAAUn/C,aACvGxc,KAAK6pB,eAAe6xC,GAAeC,EACnC37D,KAAK8pB,eAAe6xC,GAAaD,EAEjC17D,KAAK+c,UAAUrW,cAAc,iBAAkB,CAACg1D,cAAaC,cAE7D37D,KAAK+qB,eAAepD,oBAAoB+zC,G,CAG9C,CAEQmB,mBAAmBh7D,EAAkBi7D,G,QAC3C,GAAuC,QAAnC,EAAAj7D,aAAO,EAAPA,EAA6B5E,cAAM,eAAEwpB,YACvC,OAAO,EAGT,MAAMs2C,EAAa,CACjB,oBACA,uBACA,uBAOF,MAJY,SAATD,GACDC,EAAWz8D,KAAK,uBAGduB,GACc,YAAdA,EAAQnF,GACRmF,EAAQ0nB,SACR1nB,EAAQ+xB,UACR/xB,EAAQgyD,YACRhyD,EAAQmW,QAAkD,IAAzC+kD,EAAWtiE,QAAQoH,EAAQmW,MAAMtb,IAClDmF,EAAQgW,QAAU7X,KAAKgd,gBAAgBmT,MAAMtuB,EAAQgW,SAIjC,0BAAR,QAAb,EAAAhW,EAAQmW,aAAK,eAAEtb,KACZmF,EAAQmW,MAAM2uB,SAA+BqK,SAAkE,UAAtDnvC,EAAQmW,MAAM2uB,SAA+B7oC,MAK9G,CAEao+D,eAAer6D,EAAmDi7D,EAAwB,Q,gDACrG,SAAIj7D,IAAY7B,KAAK68D,mBAAmBh7D,EAASi7D,MAKlB98D,KAAKskD,eAAeziD,KAAa7B,KAAKgd,gBAAgBC,UAAUtgB,QAIlEqD,KAAK0a,gBAAgBqV,YAAYluB,EAAQ7C,QACpEgB,KAAKsc,gBAAgBqgB,UAAU96B,EAAQ7C,OAAOwd,WAAY,iBAC1D3a,EAAQ5E,OAAOusB,MAIS,gBAAtB3nB,EAAQ0W,QAAQ7b,GAChBmF,EAAQwhB,MAAQ,EAAAC,GAAA,IAAM,UAAetjB,KAAK2T,WAAW+c,aAAassC,iBACxB,sBAAR,QAAlC,EAACn7D,EAA4BmW,aAAK,eAAEtb,I,IASnCy7D,iBAAiBt2D,GACtB,OAAOA,IACLA,EAAQ7C,OAAOS,UACfoC,EAAQ5E,OAAOusB,KAC+C,SAA9DxpB,KAAKsc,gBAAgBsB,QAAQ/b,EAAQ7C,OAAOwd,YAAY9f,GACxDsD,KAAKsc,gBAAgBqgB,UAAU96B,EAAQ7C,OAAOwd,WAAY,uBACrD3a,EAAQ5E,OAAOwpB,eAAiB5kB,EAAQlE,MACjD,CAEOs/D,iBAAiBj+D,GACtB,OAAOgB,KAAKkmB,kBAAkBlnB,GAAQ6/C,WACxC,CAEOr0B,mBAAmBvE,EAAgCpkB,G,QAExD,IAAIA,EACF,OAAO,EAGT,MAAMq7D,EAAsBr7D,EAA4B+8C,aACxD,IAAIse,KACa,QAAd,EAAAr7D,EAAQ5E,cAAM,eAAEusB,OACf3nB,EAAmC2W,OACrC,OAAO,EAGT,GAA6B,uBAA1B0kD,aAAkB,EAAlBA,EAAoBxgE,GACrB,OAAO,EAGT,MAAMygE,EAAkBl3C,EAAe44B,YACvC,GAAGqe,EACD,QAAGC,GAAmBA,EAAgB52C,KAAO1kB,EAAQ0kB,KAIlD22C,EAAmBjgE,OAAOmgE,YAI1Bn3C,EAAeo3C,UAChBx7D,EAAQ0kB,IAAMN,EAAeo3C,UAC5BH,EAA6FjgE,OAAOqgE,aACpGJ,EAA6FjgE,OAAOskB,QAAS,GAGhH27C,EAAmB32C,IAAM1kB,EAAQ0kB,IAKL,sBAAzB22C,EAAmBxgE,IACpBwgE,EAAmBrlD,OAAS7X,KAAK0a,gBAAgB3b,UAAU8C,EAAQwnB,UAGrEpD,EAAe44B,YAAcqe,EAEtB,IAGT,GAAGr7D,EAAQ5E,OAAOusB,IAChB,GAAG2zC,GAED,IADA,EAAAp1C,GAAA,GAA4Co1C,GACzCA,EAAgBlgE,OAAOqgE,aACvBH,EAAgBlgE,OAAOskB,SACvB1f,EAAQ0kB,IAAM42C,EAAgB52C,KAAO1kB,EAAQ5E,OAAOwpB,cACpD5kB,EAA4BA,QAG7B,OAFAs7D,EAAgBlgE,OAAOskB,QAAS,GAEzB,QAEA0E,EAAeo3C,UACxBx7D,EAAQ0kB,IAAMN,EAAeo3C,YAC7Bp3C,EAAeo3C,SAAWx7D,EAAQ0kB,KAKtC,OADA,EAAAwB,GAAA,GAAmClmB,KACV,iCAAR,QAAd,EAAAA,EAAQ2W,cAAM,eAAE9b,MAChBygE,EACCt7D,EAAQ2W,OAAOpZ,UAAa+9D,EAAoDtlD,OAChF7X,KAAKgd,gBAAgBmT,MAAMtuB,EAAQ2W,OAAOpZ,YAG5C6mB,EAAe44B,YAAc,CAC3BniD,EAAG,oBACH6pB,IAAK1kB,EAAQ0kB,IACbtpB,OAAQ,CAAC,GAGJ,GAIX,CAEOsgE,iBAAiBv+D,EAAgBu6D,GAGtC,OAFIv5D,KAAKkjD,gBAAgBlkD,KAASgB,KAAKkjD,gBAAgBlkD,GAAU,CAAC,GAC9DgB,KAAKkjD,gBAAgBlkD,GAAQu6D,KAAcv5D,KAAKkjD,gBAAgBlkD,GAAQu6D,GAAe,CAAClzC,QAAS,KAC9FrmB,KAAKkjD,gBAAgBlkD,GAAQu6D,EACtC,CAEOiE,kBACLx+D,EACA0kB,EACA+5C,GAAW,EACXv7C,GAEA,OAAGliB,KAAK0a,gBAAgBgjD,iBAAiB1+D,GAChC2C,QAAQM,QAAQyhB,EAAQxf,KAAKrH,IAC3B,CACLH,EAAG,yBACHO,OAAQ,CAAC,EACTJ,OAAQA,EACRqd,MAAO,QAKCujD,EAAWz9D,KAAK2T,WAAWytB,mBAAqBphC,KAAK2T,WAAWC,WAAWiL,KAAK7e,KAAK2T,WAC5FgqD,CAAK,6BAA8B,CACxCljD,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5C0kB,UACAyxB,WAAYjzB,GAAW,EAAAjD,GAAA,GAAmBiD,QAAYjjB,GAE1D,CAEO2+D,uCAAuCrE,EAAoClzC,EAAmB7iB,EAA+C2Y,GAClJ,MAAM0hD,EAAW79D,KAAK63D,mBAAmBr0D,GACzC,OAAO,EAAAs6D,GAAA,GAA4BvE,EAAalzC,EAAQniB,KAAKqiB,GAAQs3C,EAASt5D,IAAIgiB,KAAOpK,EAC3F,CAEOm9C,WAAU,OAACt6D,EAAM,MAAEib,EAAK,YAAEs/C,EAAW,MAAE9wC,EAAK,MAAEtM,EAAK,SAAE4hD,EAAQ,UAAEC,EAAS,SAAE97C,EAAQ,SAAE3I,EAAQ,QAAEizB,EAAO,QAAEE,IAoB5G,GAAG1sC,KAAK0a,gBAAgBgjD,iBAAiB1+D,GACvC,OAAO2C,QAAQM,QAAQ,CACrBiY,MAAO,EACP+jD,iBAAkB,EAClBC,eAAWj/D,EACXonB,QAAS,KAITpM,IAAOA,EAAQ,IACfs/C,IAAaA,EAAc,CAAC78D,EAAG,kCACtBuC,IAAVkd,IAAqBA,EAAQ,IAC5B4hD,IAAUA,EAAW,GACrBC,IAAWA,EAAY,GAE3BxxB,EAAUA,EAAUA,EAAU,IAAO,EAAI,EACzCE,EAAUA,EAAUA,EAAU,IAAO,EAAI,EAEzC,IAAIyxB,EAAyB,GAI1BH,IACD7hD,GAAS6hD,GAMX,IAAIx6D,EAaJ,IAPGxE,GAAWg/D,GAAcv1C,GAAUxO,GAAmB,IAAVkC,GAAgB+F,IAC7D1e,EAEExD,KAAKkmB,kBAAkBlnB,GACzBm/D,EAAYn+D,KAAK49D,uCAAuCrE,EAAY78D,EAAG8G,EAAQ6iB,QAAQ7e,MAAOxH,KAAKomB,0BAA0BpnB,GAASmd,IAGrIgiD,EAAU3hE,OAAQ,CACnB,KAAG2hE,EAAU3hE,OAAS2f,GAIpB,OAAOxa,QAAQM,QAAQ,CACrBiY,MAA8B,EAC9BgkD,UAAW,EACXD,iBAAkB,EAClB53C,QAAS83C,IAPX11C,EAAQ01C,EAAUA,EAAU3hE,OAAS,GAAG+pB,IACxCpK,GAAgBgiD,EAAU3hE,M,CAkB9B,MACMqM,EAA0D7I,KAAK2T,WAAWC,UAAWiL,KAAK7e,KAAK2T,YAErG,IAAIo7C,EACJ,GAAG/vD,IAAW++D,QAAyB9+D,IAAbsa,EACxBw1C,EAAalmD,EAAO,kBAAmB,CACrC4R,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5CkuC,EAAGjzB,GAAS,GACZpd,OAAQ08D,EACR6E,SAAU5xB,EACV6xB,SAAU3xB,EACVvwB,QACAO,WAAW,EAAAuC,GAAA,GAAmBwJ,IAAU,EACxC61C,WAAYN,GAAaA,EAAY,EACrChX,OAAQ,EACRuX,OAAQ,EACRt9B,KAAM,GACNkU,YAAY,EAAAl2B,GAAA,GAAmBiD,IAAa,GAC3C,CAEDiV,YAAY,QAET,CAEL,IAAI0+B,EACA2I,EAAW,EACf,MAAMC,EAAgBh2C,GAASzoB,KAAKsf,iBAAiBtgB,EAAQypB,GAE1Dg2C,GAAiBA,EAAcp7C,OAEhCm7C,EAAWC,EAAc9hE,GACzBk5D,EAAe71D,KAAKskD,eAAema,IAGrC1P,EAAalmD,EAAO,wBAAyB,CAC3CqkC,EAAGjzB,EACHpd,OAAQ08D,EACR6E,SAAU5xB,EACV6xB,SAAU3xB,EACVgyB,YAAaX,EACbnI,YAAa51D,KAAK0a,gBAAgBkW,iBAAiBilC,GACnDn5C,UAAW8hD,EACXriD,QACA3B,UAAWjB,GACV,CAED4d,YAAY,G,CAIhB,OAAO43B,EAAWlqD,MAAM85D,IACtB3+D,KAAKgd,gBAAgBgL,aAAa22C,EAAajmD,OAC/C1Y,KAAKsc,gBAAgB2L,aAAa02C,EAAaz2C,OAC/CloB,KAAKmf,aAAaw/C,EAAax2C,UAU5B,MACDnoB,KAAKG,IAAI,oBAAqBo5D,EAAaoF,GAG7C,MAAMC,EAAqBD,EAAazkD,OAAUikD,EAAU3hE,OAASmiE,EAAax2C,SAAS3rB,OAc3F,OAZAmiE,EAAax2C,SAAStpB,SAASgD,IAC7B,MAAM7C,EAASgB,KAAKskD,eAAeziD,GACnC,GAAG7C,EAAO4nB,YAAa,CACrB,MAAMjJ,EAAO3d,KAAKsc,gBAAgBsB,QAAQ5e,EAAOwd,YAC9CmB,EAAK+L,aACN1pB,KAAK87D,cAAc98D,EAAS2e,EAAK+L,YAA0CnqB,WAAWF,UAAS,G,CAInG8+D,EAAU79D,KAAKuB,EAAQ,IAGlB,CACLqY,MAAO0kD,EACPX,iBAAkBU,EAAaV,kBAAoB,EACnDC,UAAWS,EAAaT,UACxB73C,QAAS83C,EACV,GAEL,CAEOU,uBAAuB7/D,EAAgBunB,GAC5C,MAAMghC,EAAavoD,EAAS,IAAMunB,EAClC,IAAI,MAAMk+B,KAAazkD,KAAKqjD,iBAC1B,GAAGrjD,KAAKqjD,iBAAiBoB,KAAe8C,EAAY,OAGtDvnD,KAAK8+D,qBAAqB9/D,EAAQunB,EACpC,CAEOw4C,kCAAkCl9D,GACvC,MAAM4iD,EAAY5iD,EAAQ7C,OAAS,IAAM6C,EAAQ0kB,IACjD,GAAGvmB,KAAKojD,iCAAiCqB,GAAY,OAErD,MAAMua,GAAe,EAAA//C,GAAA,GAAmBsB,KAAK4E,OAAOnlB,KAAKq6D,iBAAiBx4D,KACpEo9D,EAA8C,CAClDviE,EAAG,iBACHO,OAAQ,CACNiiE,WAAW,GAEbviE,GAAIqD,KAAKu6D,sBAAsBnxC,sBAAsB41C,GACrD37C,KAAMxhB,EAAQwhB,KACdgG,QAAS,CAAC3sB,EAAG,WAAY0C,QAAS,MAClCmZ,QAAS1W,EAAQ0W,QACjBC,OAAQ,CACN9b,EAAG,kCAELm3B,SAAU7zB,KAAK4zD,oBAAoB/xD,EAAQ7C,OAAQ6C,EAAQlF,KAG7DqD,KAAKmf,aAAa,CAAC8/C,GAAsB,CAACx1C,YAAY,IACtDzpB,KAAKojD,iCAAiCqB,GAAawa,EAAoB14C,GACzE,CAEO44C,0BAA0BngE,EAAgBkjB,GAC/C,OAAOliB,KAAKojD,iCAAiCpkD,EAAS,IAAMkjB,EAC9D,CAEO48C,qBAAqB9/D,EAAgBunB,GAC1C,OAAOvmB,KAAK2T,WAAWge,gBAAgB,gCAAiC,CACtElX,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5Co/C,QAAQ,EAAAn/B,GAAA,GAAmBsH,KAC1B1hB,MAAMzC,I,MACPpC,KAAKsc,gBAAgB2L,aAAa7lB,EAAO8lB,OACzCloB,KAAKgd,gBAAgBgL,aAAa5lB,EAAOsW,OACzC1Y,KAAKmf,aAAa/c,EAAO+lB,UAEzB,MAAMtmB,EAAU7B,KAAKo/D,sBAAsBh9D,EAAO+lB,SAAS,IACrDs8B,EAAY5iD,EAAQ7C,OAAS,IAAM6C,EAAQ0kB,IAEjDvmB,KAAK++D,kCAAkCl9D,GAEvC,MAAMokB,EAAiBjmB,KAAKkmB,kBAAkBrkB,EAAQ7C,OAAQ6C,EAAQ0kB,KAChE84C,EAAWj9D,EAAO4kD,QAAS,EAAA1rC,GAAA,GAAkBlZ,EAAO4kD,SAAW,EACrE5kD,EAAO2nB,kBAAoB9D,EAAewE,WAAY,EAAAnP,GAAA,GAA0C,QAAxB,EAAAlZ,EAAO2nB,yBAAiB,QAAIloB,EAAQ0kB,KAC5GnkB,EAAO4nB,mBAAqB/D,EAAeyE,iBAAkB,EAAApP,GAAA,GAAkBlZ,EAAO4nB,qBAAuB,EAE7G,MAAMriB,EAAQse,EAAeI,QAAQ1e,MAQrC,OAPGse,EAAewC,OAASxC,EAAewC,MAAQ42C,GAAY13D,EAAM0iB,MAAM,cACxE1iB,EAAM23D,SAAS,aAEjBr5C,EAAewC,MAAQ42C,EAEvBr/D,KAAKqjD,iBAAiBoB,GAAazlD,EAAS,IAAMunB,EAE3C1kB,CAAO,GAElB,CAEQyjD,iBAAiBzjD,GACvB7B,KAAK+c,UAAUrW,cAAc,sBAAuB7E,EACtD,CA0DOmZ,yBAAyBhc,EAAiBia,G,QAC/C,QAAcha,IAAXD,EAAsB,CACvB,IAAImS,EAAMnR,KAAKkiD,mBAAmB39C,IAAIvF,GAClCmS,GACFnR,KAAKkiD,mBAAmBl6C,IAAIhJ,EAAQmS,EAAM,CAAC,GAG7C,MAAMiS,EAA8B,iBAAb,GACnBnK,GAAWmK,GAAyB,WAAbnK,EAAOvc,EAChCyU,EAAI8H,OAASA,GAEH,QAAV,EAAA9H,EAAI0L,cAAM,QAAV1L,EAAI0L,OAAW,IAAItL,KAChB6R,EACDjS,EAAI0L,OAAO7U,IAAKiR,EAAsBtc,GAAIsc,GAE1C9H,EAAI0L,OAAO7U,IAAIiR,OAAkBha,G,CAKvC,OAAmC,QAAnC,EAAOe,KAAKu/D,+BAAuB,QAA5Bv/D,KAAKu/D,yBAA4B,EAAAz1D,EAAA,GAAM,GAAGjF,MAAK,KACpD7E,KAAKu/D,6BAA0BtgE,EAC/Be,KAAKsjD,kBAAkB,GAE3B,CAEakc,eAAexgE,EAAgB+oD,EAAgB6Q,G,kDAC1D,IAAIlvD,EAEJ,MAAM6sD,QAAev2D,KAAK2T,WAAW+c,YAC/B8lC,EAAezO,EAAKl+C,OAAO0sD,EAAOE,oBAAqB1O,EAAKvrD,OAAS+5D,EAAOE,qBAE5EgJ,EAAkB1X,EAAK7jD,KAAKqiB,IAAQ,EAAAtH,GAAA,GAAmBsH,KAE7D,GAAGvnB,EAAO4nB,aAAe5mB,KAAK0a,gBAAgBiL,UAAU3mB,GAAS,CAC/D,MAAM0mB,EAAY1mB,EAAOwd,WACnBH,EAAUrc,KAAKsc,gBAAgBsB,QAAQ8H,GAC7C,IAAIrJ,EAAQpf,OAAOyiE,WAAwC,QAA5B,EAAoB,QAApB,EAAArjD,EAAQi5C,oBAAY,eAAEr4D,cAAM,eAAE0iE,oBAC3D5X,EAAOA,EAAKlrD,QAAQ0pB,KACFvmB,KAAKsf,iBAAiBtgB,EAAQunB,GAC7BtpB,OAAOusB,OAGjBhtB,OACP,OAIJkN,EAAU1J,KAAK2T,WAAWC,UAAU,0BAA2B,CAC7DyI,QAASrc,KAAKsc,gBAAgBC,gBAAgBmJ,GAC9C/oB,GAAI8iE,IACH56D,MAAM+6D,IACP5/D,KAAKge,kBAAkBkX,mBAAmB,CACxCx4B,EAAG,8BACH6C,WAAYmmB,EACZyC,SAAU4/B,EACV/hC,IAAK45C,EAAiB55C,IACtB+N,UAAW6rC,EAAiB7rC,WAC5B,G,MAGJrqB,EAAU1J,KAAK2T,WAAWC,UAAU,0BAA2B,CAC7DglD,SACAj8D,GAAI8iE,IACH56D,MAAM+6D,IACP5/D,KAAKge,kBAAkBkX,mBAAmB,CACxCx4B,EAAG,uBACHyrB,SAAU4/B,EACV/hC,IAAK45C,EAAiB55C,IACtB+N,UAAW6rC,EAAiB7rC,WAC5B,IAIN,MAAMtI,EAA+B,CAAC/hB,GAKtC,OAJG8sD,EAAah6D,QACdivB,EAASnrB,KAAKN,KAAKw/D,eAAexgE,EAAQw3D,EAAcoC,IAGnDj3D,QAAQyQ,IAAIqZ,GAAU5mB,KAAKyqD,GAAA,E,IAG7BuQ,YAAY7gE,EAAgBypB,EAAQ,EAAGvG,EAAmB6U,GAAQ,GAQvE,GAFA/2B,KAAKG,IAAI,eAAgBnB,EAAQypB,EAAOvG,IACtBliB,KAAKwnD,qBAAqBxoD,EAAQkjB,GACrC,CACb,GAAGA,IAAa6U,EAAO,CACrB,MAAM7V,EAAalhB,KAAK+qB,eAAetP,cAAczc,EAAQkjB,IACzD,EAAAjD,GAAA,GAAmBiC,EAAW6I,qBAChCgN,GAAQ,E,CAIZ,IAAIA,EAAO,CACT,MAAM9d,EAASjZ,KAAKsc,gBAAgBqD,QAAQ3gB,EAAOwd,aAAe0F,EAChEliB,KAAK+qB,eAAetP,cAAczc,EAAQkjB,GAC1CliB,KAAKkb,cAAclc,GAClBia,GAAUjZ,KAAK2vB,eAAe1W,KAC/B8d,GAAQ,E,CAIZ,IAAIA,EAEF,OADA/2B,KAAKG,IAAI,6BACFwB,QAAQM,S,CAInB,MAAMgkB,EAAiBjmB,KAAKkmB,kBAAkBlnB,EAAQkjB,GAEtD,GAAG+D,EAAe65C,kBAAoBr3C,EACpC,OAAO9mB,QAAQM,UAGjB,IAAI8sD,EA6DJ,OA5DG7sC,GACG+D,EAAe85C,cACjBhR,EAAa/uD,KAAK2T,WAAWC,UAAU,0BAA2B,CAChE6G,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5Co/C,QAAQ,EAAAn/B,GAAA,GAAmBiD,GAC3B+kC,aAAa,EAAAhoC,GAAA,GAAmBwJ,MAKpCzoB,KAAKge,kBAAkBkX,mBAAmB,CACxCx4B,EAAG,mCACH6C,WAAYP,EAAOwd,WACnB24B,WAAYjzB,EACZ+kC,YAAax+B,KAEPzoB,KAAK0a,gBAAgBiL,UAAU3mB,IACnCinB,EAAe85C,cACjBhR,EAAa/uD,KAAK2T,WAAWC,UAAU,uBAAwB,CAC7DyI,QAASrc,KAAKsc,gBAAgBC,gBAAgBvd,EAAOwd,YACrDwqC,QAAQ,EAAA/nC,GAAA,GAAmBwJ,MAI/BzoB,KAAKge,kBAAkBkX,mBAAmB,CACxCx4B,EAAG,yBACHsqD,OAAQv+B,EACRlpB,WAAYP,EAAOwd,WACnB4qC,wBAAoBnoD,EACpB+mB,SAAK/mB,MAGHgnB,EAAe85C,cACjBhR,EAAa/uD,KAAK2T,WAAWC,UAAU,uBAAwB,CAC7D6G,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5CgoD,QAAQ,EAAA/nC,GAAA,GAAmBwJ,KAC1B5jB,MAAM+6D,IACP5/D,KAAKge,kBAAkBmV,qBAAqB,CAC1Cz2B,EAAG,cACH2d,OAAQ,CACN3d,EAAG,YACHspB,IAAK45C,EAAiB55C,IACtB+N,UAAW6rC,EAAiB7rC,YAE9B,KAIN/zB,KAAKge,kBAAkBkX,mBAAmB,CACxCx4B,EAAG,yBACHsqD,OAAQv+B,EACRhO,KAAMza,KAAK0a,gBAAgB4O,cAActqB,GACzCooD,wBAAoBnoD,EACpB+mB,SAAK/mB,EACL80B,eAAW90B,KAIfe,KAAK+c,UAAUrW,cAAc,qBAAsB1G,KAAK0a,gBAAgBslD,cAAchhE,IAEnFinB,EAAe85C,YACT95C,EAAe85C,aAGxB95C,EAAe65C,iBAAmBr3C,EAElCsmC,EAAWtmB,SAAQ,YACVxiB,EAAe85C,YAEtB,MAAM,UAACt1C,GAAaxE,EACpBjmB,KAAKG,IAAI,+BAAgCsoB,EAAOgC,GAE7CA,EAAYhC,GACbzoB,KAAK6/D,YAAY7gE,EAAQyrB,EAAWvI,GAAU,E,IAI3C+D,EAAe85C,YAAchR,EACtC,CAEOkR,eAAejhE,EAAgBkjB,EAAmB6U,GAAQ,GAC/D,MAAM9Q,EAAiBjmB,KAAKkmB,kBAAkBlnB,EAAQkjB,GACnD+D,EAAewC,OAChBzoB,KAAK6/D,YAAY7gE,EAAQinB,EAAewC,MAAOvG,EAAU6U,EAE7D,CAEQmpC,qBAAqBlhE,EAAgBkjB,GAC3C,OAAOljB,GAAUkjB,EAAW,IAAIA,IAAa,GAC/C,CAEQgmC,mCAAmClpD,EAAgBkjB,GACzD,MAAMjJ,EAASjZ,KAAK+qB,eAAe5H,iBAAiBnkB,EAAQkjB,IACzDjJ,aAAM,EAANA,EAAQ4W,wBACT7vB,KAAKo4D,0BAA0Bp5D,EAEnC,CAEQwmD,qBAAqBxmD,EAAgBunB,EAAaznB,EAAcojB,GACtE,MAAMi+C,EAAcngE,KAAKuiD,eAAeviD,KAAKkgE,qBAAqBlhE,EAAQkjB,IACtEi+C,IAEDrhE,EACEqhE,EAAYx4D,MAAM0iB,MAAM,WACzB81C,EAAY71C,YAAY,CAAC/D,IAG3B45C,EAAYt8D,OAAO0iB,GAEvB,CAEQ65C,+BAA+BphE,EAAgBmhE,EAAkCj+C,GACvF,MAAMjJ,EAASjZ,KAAK+qB,eAAe5H,iBAAiBnkB,EAAQkjB,IACxDi+C,EAAY3jE,SAAUyc,aAAM,EAANA,EAAQ4W,wBAChC7vB,KAAKo4D,0BAA0Bp5D,EAEnC,CAEOqhE,gBAAgBrhE,EAAgBkjB,G,QAKrC,MAAM9a,EAAMpH,KAAKkgE,qBAAqBlhE,EAAQkjB,GACxCxY,EAAU1J,KAAKwiD,wBAAwBp7C,GAC7C,GAAGsC,EACD,OAAOA,EAGT,MAAMy2D,EAAwC,QAA7B,KAAGngE,KAAKuiD,gBAAevjD,UAAM,UAANA,GAAY,IAAI,KAClDxC,EAAS2jE,EAAY3jE,OACrB8vB,EAAW6zC,EAAYx4D,MAAM0iB,MAAM,UACzC,IAAI7tB,GAAU8vB,EAEZ,OADAtsB,KAAKogE,+BAA+BphE,EAAQmhE,EAAaj+C,GAClDvgB,QAAQM,UAGjB,IAAIq+D,EAAkB3+D,QAAQM,UAK9B,OAJIqqB,GAAY9vB,EAAS,KACvB8jE,EAAkBtgE,KAAKugE,iBAAiBvhE,EAAQkjB,IAG3CliB,KAAKwiD,wBAAwBp7C,GAAOk5D,EAAgBz7D,MAAK,KAC9D,MAAM27D,EAAOL,EAAYK,KACnBj6C,EAAMi6C,GAAQA,EAAKA,EAAKhkE,OAAS,GACvC,GAAG+pB,EAED,OADA45C,EAAYt8D,OAAO0iB,GACZA,EAEPvmB,KAAKogE,+BAA+BphE,EAAQmhE,EAAaj+C,E,IAE1DumB,SAAQ,YACFzoC,KAAKwiD,wBAAwBp7C,EAAI,GAE5C,CAEQm5D,iBAAiBvhE,EAAgBkjB,GACvC,MAAMi+C,EAAcngE,KAAKuiD,eAAevjD,GAClCypB,EAAQ03C,EAAYx4D,MAAM,IAAM,EAKtC,OAAO3H,KAAKygE,kBAAkBzhE,EAAQypB,GAFnB,GADD,QAG8CxpB,OAAWA,EAAWijB,GACrFrd,MAAMsjB,IACLnoB,KAAK0gE,mBAAmBP,EAAah4C,EAAoB,IAAVM,EAAc,EAAIA,EALjD,IACC,GAIyE,GAE9F,CAEQg4C,kBACNzhE,EACAw/D,EACAF,EACAniD,EACAsM,EAAQ,EACRk4C,EAAQ,EACRz+C,GAEA,OAAOliB,KAAK2T,WAAWktB,uBAAuB,CAC5Ch4B,OAAQ,6BACRmL,OAAQ,CACNyG,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5C0d,WAAW,EAAAuC,GAAA,GAAmBu/C,GAC9BF,aACAniD,QACA6qC,QAAQ,EAAA/nC,GAAA,GAAmBwJ,GAC3B81C,QAAQ,EAAAt/C,GAAA,GAAmB0hD,GAC3BxrB,WAAYjzB,GAAW,EAAAjD,GAAA,GAAmBiD,QAAYjjB,GAExD6hC,cAAgB8/B,KACd,EAAA74C,GAAA,GAAoF64C,GACpF5gE,KAAKgd,gBAAgBgL,aAAa44C,EAAiBloD,OACnD1Y,KAAKsc,gBAAgB2L,aAAa24C,EAAiB14C,OACnDloB,KAAKmf,aAAayhD,EAAiBz4C,UAE5By4C,IAGb,CAEOC,aAAa7hE,EAAgB8hE,GAKlC,IAAIA,EAAOtkE,OACT,OAAOmF,QAAQM,UAIjB,IAAIyH,EAAuB2Q,EAC3B,GAFAymD,EAASA,EAAO58D,KAAKqiB,IAAQ,EAAAtH,GAAA,GAAmBsH,KAE7CvnB,EAAO4nB,aAAe5mB,KAAK0a,gBAAgBiL,UAAU3mB,GAAS,CAC/D,MAAM0mB,EAAY1mB,EAAOwd,WAEzBnC,EAAS,CACP3d,EAAG,oCACH6C,WAAYmmB,EACZyC,SAAU24C,GAGZp3D,EAAU1J,KAAK2T,WAAWC,UAAU,+BAAgC,CAClEyI,QAASrc,KAAKsc,gBAAgBC,gBAAgBmJ,GAC9C/oB,GAAImkE,G,MAGNzmD,EAAS,CACP3d,EAAG,6BACHyrB,SAAU24C,EACV96C,SAAK/mB,EACL80B,eAAW90B,GAGbyK,EAAU1J,KAAK2T,WAAWC,UAAU,+BAAgC,CAClEjX,GAAImkE,IACHj8D,MAAM+6D,IACNvlD,EAA6C2L,IAAM45C,EAAiB55C,IACpE3L,EAA6C0Z,UAAY6rC,EAAiB7rC,UAC3E/zB,KAAKge,kBAAkBkX,mBAAmB7a,EAAO,IAMrD,OAFAra,KAAKge,kBAAkBkX,mBAAmB7a,GAEnC3Q,CACT,CAEOwc,kBAAkBlnB,EAAgBkjB,G,gBACvC,OAAGA,EAEmD,QAA5C,GAAR,EAAkC,QAA3B,KAACliB,KAAKijD,gBAAejkD,UAAM,UAANA,GAAY,CAAC,GAAGkjB,UAAQ,UAARA,GAAc,CAAChI,MAAO,KAAMmM,QAAS,IAAI,MAGpD,QAAnC,KAAOrmB,KAAKgjD,kBAAiBhkD,UAAM,UAANA,GAAY,CAACkb,MAAO,KAAMmM,QAAS,IAAI,KACtE,CAEO06C,8BAA8B/hE,EAAgBkjB,GACnD,MAAM+D,EAAiBjmB,KAAKkmB,kBAAkBlnB,EAAQkjB,IAChD,MACJhI,EAAK,QACLmM,EAAO,MACPoC,EAAK,UACLgC,EAAS,gBACTC,EAAe,SACf2yC,EAAQ,YACRxe,GACE54B,EAEJ,MAAO,CACL/L,QACAmM,aAASpnB,EACT+hE,kBAAmB36C,EAAQ46C,SAC3Bx4C,QACAgC,YACAC,kBACA2yC,WACAxe,cAEJ,CAEQkF,sBAAsB/kD,EAAgBkjB,GAC5C,MAAMg/C,EAAkBlhE,KAAK0a,gBAAgBymD,uBAAuB,CAACniE,SAAQoiE,cAAc,EAAMl/C,aACjG,OAAOvgB,QAAQyQ,IAAI,CACjBpS,KAAK+hB,wBAAwBs/C,4BAC7BrhE,KAAK+hB,wBAAwBu/C,kBAAkBJ,KAC9Cr8D,MAAK,EAAEnI,EAAGsnD,MACJ,CACLzK,MAAOv5C,KAAK+hB,wBAAwBC,iBAAiB,CAAChjB,SAAQijB,aAAa,EAAMC,aACjF8hC,4BAGN,CAqCOp7B,wBAAwB5pB,EAAgBkjB,GAC7C,OAAOljB,GAAUkjB,EAAW,IAAMA,EAAW,GAC/C,CAEQyiC,2BAA2B3lD,EAAgBqb,EAAgB6H,G,UACjE,MAAMla,EAAuF,QAApF,KAAGhI,KAAK8oB,+BAA6B,EAAC9oB,KAAK4oB,wBAAwB5pB,EAAQkjB,WAAS,aAAM,IAAI/jB,IACpG6J,EAAIvJ,IAAI4b,GACTra,KAAKG,IAAIxC,MAAM,mBAAoBqB,IAIpCqb,EAAe6qC,gBAAiB,EACjCl9C,EAAIlJ,IAAIub,GACRra,KAAKgb,yBAAyBhc,EAAQkjB,GACxC,CA06BOikC,+BAA+BtkD,GACjC7B,KAAKuhE,sBAAsB1/D,IAC5B7B,KAAK+qB,eAAehF,iBAAiB/lB,KAAKkb,cAAcrZ,EAAQ7C,QAEpE,CAEOuiE,sBAAsB1/D,GAC3B,MAAMoX,EAASjZ,KAAKkb,cAAcrZ,EAAQ7C,QAC1C,OAAOia,GAAUA,EAAO+F,cAAgBnd,EAAQ0kB,GAClD,CAEQ0+B,6BAA6Buc,GACnC,IACE,MAAM/c,EAAYzkD,KAAK0kD,aAAa8c,GACpC,GAAG/c,EAAW,CACZ,MAAM8C,EAAavnD,KAAKqjD,iBAAiBoB,GACzC,GAAG8C,EAAY,CACb,MAAOvoD,EAAQunB,GAAOghC,EAAW3nD,MAAM,KAEvCI,KAAKozB,cAAcp0B,EAAOK,YAAaknB,EAAK,kB,GAGhD,MAAMld,GACNrJ,KAAKG,IAAIxC,MAAM,8BAA+B0L,EAAKm4D,E,CAEvD,CAEQ9c,aAAa8c,G,MACnB,IAAI/c,EAAY,GAChB,GAAwB,QAArB,EAAA+c,aAAa,EAAbA,EAAexiE,cAAM,eAAE4nB,YAAa,CACrC,MAAM1E,GAAW,EAAAwlC,GAAA,GAAmB8Z,EAAexhE,KAAKsc,gBAAgBqD,QAAQ6hD,EAAcxiE,OAAOwd,aAClG0F,IACDuiC,EAAY+c,EAAcxiE,OAAS,IAAMkjB,E,CAI7C,OAAOuiC,CACT,CAEOrxB,cAAcp0B,EAAgBunB,EAAak7C,GAchD,OAb0CzhE,KAAKwW,eAAexX,EAAQunB,GAAK,GAAM1hB,MAAK,KACpF,MAAMhD,EAAU7B,KAAKsf,iBAAiBtgB,EAAQunB,GAC9C,GAAI1kB,EAQJ,OAJG4/D,GACDzhE,KAAK+c,UAAUrW,cAAc+6D,EAAoB5/D,GAG5CA,CAAO,GAIlB,CAEQmjD,oBAAoBnjD,GAC1B,MAAM4/B,EAAWzhC,KAAK2hD,mBAAmB9/C,EAAQ0kB,KACjD,IAAIm7C,EACJ,GAAGjgC,EAAU,CACX,MAAM+zB,EAAcx1D,KAAK0hD,kBAAkBjgB,IACxCigC,EAAiB1hE,KAAK2hE,uBAAuBlgC,EAAU5/B,KACxD7B,KAAK+c,UAAUrW,cAAc,iBAAkB,CAC7C0vC,WAAYof,EAAYhyD,QAAQ4D,IAChCvF,UACAwtD,WAAYmG,EAAYnG,oBAIrBrvD,KAAK2hD,mBAAmB9/C,EAAQ0kB,I,CAGzC,OAAOm7C,CACT,CAEOE,SAASnmE,GACd,KAAKA,EAAUuE,KAAK+hB,wBAAwB8/C,qBAAqBpmE,IAC/D,OAGF,MAAM,OAACuD,EAAM,UAAE8iE,EAAS,SAAE5/C,GAAYzmB,EAChCoL,EAAoC,CACxCnK,EAAG,2BAGLmK,EAASk7D,WAAaD,EAEtB,MAAMrnD,EAAOza,KAAK0a,gBAAgBkW,iBAAiB5xB,GACnD,OAAOgB,KAAK+hB,wBAAwBuqC,qBAAqBpqC,EAAW,CAClExlB,EAAG,wBACH+d,OACA06B,YAAY,EAAAl2B,GAAA,GAAmBiD,IAC7B,CACFxlB,EAAG,kBACH+d,QACC5T,EACL,CAEOm7D,gBAAe,OAAChjE,EAAM,KAAEijE,EAAI,SAAE//C,IAKnC,YAJYjjB,IAATgjE,IACDA,GAAQjiE,KAAK+hB,wBAAwBC,iBAAiB,CAAChjB,SAAQijB,aAAa,EAAOC,cAG9EliB,KAAK4hE,SAAS,CAAC5iE,SAAQ8iE,UAAWG,EAAO,KAAa,EAAG//C,YAClE,CAEQ8lC,iBAAiBD,GACvB,IAAI,IAA0BriD,EAAbqiD,EAAKvrD,OAAqB,EAAGkJ,GAAK,IAAKA,EAAG,CACzD,MAAM6gB,EAAMwhC,EAAKriD,GACX7D,EAAU7B,KAAK83D,eAAevxC,GACpC,GAAG1kB,EACD,OAAOA,EAAQ7C,M,CAGrB,CAEOkjE,cAAcljE,EAAgBkjB,EAAmB1J,EAAqB,iB,MAC3E,GAAGxY,KAAK0a,gBAAgBgjD,iBAAiB1+D,GACvC,OAAO,EAGT,GAAGA,EAAO4nB,YAAa,CACrB,MAAMtnB,EAASN,EAAOwd,WACtB,GAAG0F,EAAU,CACX,MAAM1G,EAAQxb,KAAK+qB,eAAetP,cAAczc,EAAQkjB,GACxD,IAAgB,QAAb,EAAA1G,aAAK,EAALA,EAAOve,cAAM,eAAEolC,UAAWriC,KAAKsc,gBAAgBqgB,UAAUr9B,EAAQ,iBAClE,OAAO,C,CAKX,MAAMqe,EAAO3d,KAAKsc,gBAAgBsB,QAAQte,GAE1C,OADqCU,KAAKsc,gBAAgBqgB,UAAUr9B,EAAQkZ,OAAQvZ,IAAaijB,MACvDvE,EAAK1gB,OAAOuI,QAAU0c,E,CAEhE,OAAOliB,KAAKgd,gBAAgBmlD,cAAcnjE,EAE9C,CAEO2iE,uBAAuBlgC,EAAgB2gC,GAC5C,MAAM5M,EAAcx1D,KAAK0hD,kBAAkBjgB,GAC3C,IAAI+zB,EACF,OAGF,MAAM,OAACx2D,EAAM,OAAE2uD,EAAM,SAAEzrC,EAAQ,QAAE1e,GAAWgyD,EAE5C,CACEx1D,KAAKkmB,kBAAkBlnB,GACvBkjB,EAAWliB,KAAKkmB,kBAAkBlnB,EAAQkjB,QAAYjjB,GAEvDpC,OAAOC,SACP+B,SAAS2E,IACRA,EAAQ6iB,QAAQxiB,OAAO8pD,EAAO,IAKhC,MAAM0U,EAAyBriE,KAAKwmB,sBAAsBhjB,EAASmqD,GAenE,OAdG0U,WACMD,EAAanlE,OAAOwpB,mBACpB27C,EAAah6D,eACbg6D,EAAazkE,aACbykE,EAAatnC,iBACbsnC,EAAa54D,MAGtBxJ,KAAK+c,UAAUrW,cAAc,2BAEtB1G,KAAK0hD,kBAAkBjgB,GAE9BzhC,KAAKsiE,gCAAgC9+D,EAASmqD,EAAQyU,GAE/CC,CACT,CAEOC,gCAAgC9+D,EAA0BmqD,EAAgB9rD,GAC/E,MAAMwiB,EAAYrkB,KAAK6hD,sBAAsB8L,GAE7C,QAAiB1uD,IAAdolB,EAAyB,CAC1B,IAAI,MAAMpkB,KAAQokB,EAAW,CAC3B,MAAM,SAAC7qB,EAAQ,SAAEiL,GAAY4f,EAAUpkB,GAEvCwE,EAAS5C,GAASgD,KAAKrL,EAASyI,QAASzI,EAASoI,O,QAG7C5B,KAAK6hD,sBAAsB8L,E,CAIpC,GAAI9rD,EAA4BmW,MAAO,EACrC,EAAA+P,GAAA,GAA4BlmB,GAC5B,MAAO42B,MAAO8pC,EAAU57B,SAAU67B,GAAU3gE,EAAQmW,MACpD,GAAGuqD,EAAU,CACX,MAAM9pC,EAAQz4B,KAAK+8C,iBAAiBsW,SAAS,GAAK1F,GAClD,GAAiCl1B,EAAO,CACtC,MAAMgqC,EAAeF,EAAShS,MAAMgS,EAAShS,MAAM/zD,OAAS,GACtD42C,EAAepzC,KAAKyvC,cAAcmC,gBAAgB2wB,EAAUE,EAAa3kE,MACzE4kE,EAAkB1iE,KAAKyvC,cAAcmC,gBAAgBnZ,EAAO,MAClEx+B,OAAOC,OAAOk5C,EAAcsvB,GAE5B,MAAMpS,EAAYiS,EAAShS,MAAMgS,EAAShS,MAAM/zD,OAAS,GAEnDm8B,GAAkB,EAAAgqC,GAAA,GAAwBJ,EAAUjS,IACzC,QAAsB33B,EAAgBr8B,S,OAGpD,GAAGkmE,EAAQ,CAChB,MAAMzyB,EAAS/vC,KAAK23C,eAAe1F,OAAO,GAAK0b,GAC/C,GAAG5d,EAAQ,CACT,MAAM2yB,EAAkB1iE,KAAKyvC,cAAcmC,gBAAgB7B,GAC3D,GAEEA,EAAOjyC,MACS,YAAhBiyC,EAAOjyC,MACc,cAArBiyC,EAAOQ,WACPmyB,EAAgBjlE,IAChB,CACA,MAAM21C,EAAepzC,KAAKyvC,cAAcmC,gBAAgB4wB,GACxDvoE,OAAOC,OAAOk5C,EAAcsvB,GC3zKSnzB,ED6zKKizB,GC5zK7C,SAAsB,EAAA1uB,GAAA,GAA6BvE,EADaqzB,WACI,CAACpvB,SAAUjE,EAAIa,W,QDg0K3EvuC,EAAQmW,MAAwCg1C,cAClDhtD,KAAKitD,gBAAgB4V,MAAMlV,UAC3B3tD,KAAKitD,gBAAgB/nD,QAAQyoD,G,CCn0K7B,IAAkCpe,EDu0K7C,MAAM8yB,EAAcriE,KAAKwmB,sBAAsBhjB,EAASmqD,GACxDnqD,EAAQK,OAAO8pD,IAEV0U,EAAgCzjB,cAAiB/8C,EAA4B+8C,cAChF78C,YAAW,KACL/B,KAAKwmB,sBAAsBhjB,EAAS3B,EAAQ0kB,MAIhDvmB,KAAK+c,UAAUrW,cAAc,eAAgB,CAAC0vC,WAAY5yC,EAAQ4D,IAAKpI,OAAQ6C,EAAQ7C,OAAQunB,IAAK1kB,EAAQ0kB,IAAK1kB,WAAS,GACzH,GAGL7B,KAAK8iE,uBAAuBT,EAAa7+D,GAEzCxD,KAAK+c,UAAUrW,cAAc,eAAgB,CAAC0vC,WAAY5yC,EAAQ4D,IAAKumD,SAAQ0U,cAAa97C,IAAK1kB,EAAQ0kB,IAAK1kB,WAChH,CAEO8hD,mBAAmBl7B,GACxB,IAAIA,GAAYzoB,KAAKiiD,aAAax5B,EAAQzoB,KAAKiiD,WAC7C,OAAO,EAGTjiD,KAAKiiD,UAAYx5B,EACjBzoB,KAAKue,gBAAgB3W,YAAY,eAAgB6gB,GAEjDzoB,KAAK2T,WAAWC,UAAU,4BAA6B,CACrDozC,QAAQ,EAAA/nC,GAAA,GAAmBwJ,IAE/B,CAEas6C,2CACXlhE,EACAsa,EACA7D,EACA6T,EACA62C,EACAC,G,kDAEA,MAAMC,EAA4B,CAChC1iC,UAAW,GACXtmB,MAAO,EACPghC,iBAAaj8C,GAGTkkE,QAAuCnjE,KAAKmjE,+BAA+BthE,GAOjF,OANGshE,QAA4ClkE,IAAVkd,EACnCA,EAAQ,SACUld,IAAVkd,IACRA,EAAQ,IAGHxa,QAAQyQ,IAAI,EACjB+wD,GAAmC7qD,GAAa0qD,EAAkH,GAA3FhjE,KAAKojE,2BAA2BvhE,EAAQ7C,OAAQ6C,EAAQ0kB,KAAKvY,OAAM,IAAM,MAE7G,QAAnC,EAAiB,QAAjB,EAAAnM,EAAQ2+B,iBAAS,eAAEnoB,wBAAgB,eAAE7b,UAAWymE,EAAoBjjE,KAAKqjE,oBAAoBC,wBAAwBzhE,EAAQ7C,OAAQ6C,EAAQ0kB,IAAKpK,EAAO7D,EAAU6T,GAAQne,OAAO3E,GAAQ65D,IAA6BA,IACtNr+D,MAAK,EAAE4T,EAAS8qD,MACjB,MAAMC,EAA0B/qD,EAAQvU,KAAK/E,GAAWA,EAAOE,aAEzDokE,EAA2BD,EAAwBh8D,SACzD,EAAAsgB,GAAA,GAAe27C,GAA0B,CAACzkE,EAAQqF,EAAKwG,KAClD04D,EAAqB/iC,UAAUtb,MAAM5M,GAAatY,KAAK0a,gBAAgB3b,UAAUuZ,EAASC,WAAavZ,KACxG6L,EAAIhB,OAAOxF,EAAK,E,IAIpB,IAAIixC,EAAoDiuB,EAAqB/iC,UAAUt8B,KAAKoU,IAAa,CAAEtZ,OAAQgB,KAAK0a,gBAAgB3b,UAAUuZ,EAASC,SAAUD,SAAUA,EAASA,aAGxL,OAFAg9B,EAAWA,EAAStxC,OAAOy/D,EAAyBv/D,KAAKw/D,IAAe,CAAE1kE,OAAQ0kE,OAE3E,CACLljC,UAAW+iC,EAAqB/iC,UAChCmjC,eAAgBJ,EAAqBrpD,MACrC0pD,iBAAkBJ,EAClBluB,SAAUA,EACV0D,WAAYuqB,EAAqBroB,YAClC,G,IAIEkoB,2BAA2BpkE,EAAgBunB,GAChD,OAAOvmB,KAAK2T,WAAWge,gBAAgB,sCAAuC,CAC5ElX,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5Co/C,QAAQ,EAAAn/B,GAAA,GAAmBsH,KAC1B1hB,MAAM4T,GACAA,EAAQvU,KAAK/E,GAAWA,EAAO+wB,cAE1C,CAEaizC,+BAA+BthE,G,0CAC1C,GACiB,aAAfA,aAAO,EAAPA,EAASnF,IACTmF,EAAQ5E,OAAOwpB,cACd5kB,EAAQ5E,OAAOusB,MACfxpB,KAAK0a,gBAAgBuV,WAAWpuB,EAAQ7C,QAEzC,OAAO,EAGT,MAAM2e,EAAO3d,KAAKsc,gBAAgBsB,QAAQ/b,EAAQ7C,OAAOwd,YACnDqnD,QAAkB7jE,KAAK2T,WAAWmwD,eACxC,OAAOnmD,EAAKme,oBAAsB+nC,EAAUE,gCACzC,EAAAzgD,GAAA,IAAM,GAAQzhB,EAAQwhB,KAAQwgD,EAAUG,4BAC7C,G,CAEOC,sBAAsBjlE,EAAgB+oD,GAC3C,GAAIA,EAAKvrD,OAIT,OAAOwD,KAAK2T,WAAWge,gBAAgB,4BAA6B,CAClElX,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5CrC,GAAIorD,EAAK7jD,KAAKqiB,IAAQ,EAAAtH,GAAA,GAAmBsH,KACzC29C,WAAW,IACVr/D,MAAMskD,IACP,MAAMtgC,EAAoB,IAAI/nB,MAAMinD,EAAKvrD,QACzC,IAAI,IAAIkJ,EAAI,EAAGlJ,EAASurD,EAAKvrD,OAAQkJ,EAAIlJ,IAAUkJ,EACjDmjB,EAAQnjB,GAAK,CACXhJ,EAAG,4BACH6C,WAAY,KACZP,SACArC,GAAIorD,EAAKriD,GACTyjD,MAAOA,EAAMA,MAAMzjD,GAAGyjD,OAI1BnpD,KAAKge,kBAAkBmV,qBAAqB,CAC1Cz2B,EAAG,UACHmsB,UACAX,MAAOihC,EAAMjhC,MACbxP,MAAOywC,EAAMzwC,OACb,GAEN,CAEQwrC,mBAAmBriD,EAAoBpG,EAI1C,CAAC,GACJ,MAAMuD,EAASgB,KAAKskD,eAAeziD,GAEnC,GAAG7B,KAAK0a,gBAAgBgjD,iBAAiB1+D,GACvC,OAGF,MAAM+hD,EAAO,aACb,IAAIG,EAAMH,EAAKxiD,MAAM2iD,IACnB,MAAM,YAACijB,GAAejjB,EAAIl6C,MAC1B,OAAOm9D,EAAYA,EAAY3nE,OAAS,KAAOwC,CAAM,IAGnDkiD,IACFH,EAAKtgC,MAAK,CAACC,EAAGC,IAAMD,EAAE1Z,MAAMo9D,cAAgBzjD,EAAE3Z,MAAMo9D,gBACpDljB,EAAOH,EAAK,GAAG/5C,MAAMo9D,cAA0BrjB,EAAKA,EAAKvkD,OAAS,GAA7BukD,EAAK,IAG/B,kBACRn6C,WAAW,oBAAqB,OAAF,QACjC/E,WACGpG,GACFylD,EAAI5F,OACT,CAEOqR,4BAA4B3tD,G,QACjC,OAA2C,QAA3C,KAAOgB,KAAK+iD,0BAAyB/jD,UAAM,UAANA,GAAYgB,KAAKwkD,qBAAqBxlD,EAAQ,YACrF,CAEOqlE,0BAA0BrlE,EAAgBunB,GAC/C,OAAOvmB,KAAKwmB,sBAAsBxmB,KAAK2sD,4BAA4B3tD,GAASunB,EAC9E,CAEO+9C,qBAAqBtlE,GAC1B,IAAIgB,KAAKkiE,cAAcljE,GAAS,OAEhC,MAAMwE,EAAUxD,KAAK2sD,4BAA4B3tD,GACjD,OAAGwE,EAAQ4P,KACF,IAAI5P,EAAQwP,QAGdhT,KAAK2T,WAAWge,gBAAgB,+BAAgC,CACrElX,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5CiiC,KAAM,KACLp8B,MAAMo0D,IACP,GAAuB,iCAApBA,EAAcv8D,EAAsC,CACrDsD,KAAKgd,gBAAgBgL,aAAaixC,EAAcvgD,OAChD1Y,KAAKsc,gBAAgB2L,aAAagxC,EAAc/wC,OAEhD,MAAM1kB,EAAUxD,KAAK2sD,4BAA4B3tD,GAEjD,OADAgB,KAAKmf,aAAa85C,EAAc9wC,SAAU,CAAC3kB,UAASumD,aAAa,IAC1D,IAAIvmD,EAAQwP,O,CAGrB,MAAO,EAAE,GAEb,CAEOuxD,sBAAsBvlE,EAAgB+oD,GAC3C,OAAO/nD,KAAK2T,WAAWC,UAAU,iCAAkC,CACjE6G,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5CrC,GAAIorD,EAAK7jD,KAAKqiB,IAAQ,EAAAtH,GAAA,GAAmBsH,OACxC1hB,MAAMgkB,IACP7oB,KAAKge,kBAAkBmV,qBAAqBtK,EAAQ,GAExD,CAEO27C,wBAAwBxlE,EAAgB+oD,GAC7C,OAAO/nD,KAAK2T,WAAWC,UAAU,mCAAoC,CACnE6G,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5CrC,GAAIorD,EAAK7jD,KAAKqiB,IAAQ,EAAAtH,GAAA,GAAmBsH,OACxC1hB,MAAMgkB,IACP7oB,KAAKge,kBAAkBmV,qBAAqBtK,EAAQ,GAExD,CAEOu2C,sBAAsBv9D,GAC3B,OAAO7B,KAAKs6D,eAAez4D,GAAUA,KAAeA,EAA4BiyD,UAAS,EAC3F,CAEO2Q,6BAA6B5iE,GAClC,GAAGA,EAAQ7C,SAAW,KAAiB,CAErC,MAAM80D,EAAUjyD,OADhBA,EAAU7B,KAAKo/D,sBAAsBv9D,SACd,EAAPA,EAASiyD,QACzB,IAAKA,IAAWA,EAAQ72D,OAAOo3D,UAAYP,EAAQv0D,WAAWid,aAAe,KAC3E,M,CAIJ,OAAO3a,CACT,CAEO6iE,sBAAsB1lE,GAC3B,OAAOA,EAAO4nB,eACX5mB,KAAKsc,gBAAgB6gB,SAASn+B,EAAOwd,aACtCxc,KAAKsc,gBAAgBqD,QAAQ3gB,EAAOwd,YAExC,CAEamoD,cAAc3lE,EAAgBkjB,G,gDACzC,IAAIliB,KAAK0kE,sBAAsB1lE,GAC7B,OAGF,MAAMinB,EAAiBjmB,KAAKkmB,kBAAkBlnB,EAAQkjB,GAChD1a,EAAQye,EAAeI,QAAQ7e,MACrC,IAAIA,EAAM6iB,MAAM,aACd,cAGKpE,EAAewC,MACtBjhB,EAAM83D,SAAS,aAGf,MAAMrG,QAAsBj5D,KAAKg5D,WAAWh6D,EAAgB,QAAR,EAAAwI,EAAM,UAAE,QAAI,EAAG,EAAG,GAAI0a,GAC1E,IAAI,IAAIxc,EAAI,EAAGlJ,EAASy8D,EAAc5yC,QAAQ7pB,OAAQkJ,EAAIlJ,IAAUkJ,EAClE1F,KAAKslD,iBAAiBtlD,KAAKsf,iBAAiBtgB,EAAQi6D,EAAc5yC,QAAQ3gB,KAG5E,MAAO,CAACk/D,YAAa3+C,EAAeI,QAAQ7e,MAAM6iB,MAAM,a,IAQnD2uC,WAAWh6D,EAAgBypB,EAAgB,EAAGtM,EAAgB6hD,EAAoB97C,GACvF,MAAM+D,EAAiBjmB,KAAKkmB,kBAAkBlnB,EAAQkjB,GAEtD,GAAGliB,KAAK0a,gBAAgBgjD,iBAAiB1+D,GAAS,CAChD,MAAM2I,EAAQse,EAAeI,QAAQ1e,MACrCA,EAAM4iB,OAAO,WAEb,MAAM/iB,EAAQG,EAAMH,MAAM,EAAG,GAG7B,OAFAA,EAAM+iB,OAAO,WAEN,CACLrQ,MAAO,EACPmM,QAASvlB,MAAMC,KAAKyG,GACpB6iB,MAAO7iB,EAAMq9D,UACbC,eAAgB,E,CAIpB,IAAI34C,EAAS,EAsCV6xC,IACD7xC,GAAU6xC,EACV7hD,GAAS6hD,GAcX,MAAM+G,EAAY9+C,EAAeI,QAAQ2+C,QAAQv8C,EAAO0D,EAAQhQ,GAChE,OAAG4oD,GAAcA,EAAUv9D,MAAMhL,SAAW2f,IAAU4oD,EAAUE,UAAY,aAAmB,UAaxFjlE,KAAKklE,mBAAmBlmE,EAAQypB,EAAOtM,EAAOgQ,EAAQlG,EAAgB/D,GAAUrd,MAAK,KAC1F,MAAM2C,EAAQye,EAAeI,QAAQ2+C,QAAQv8C,EAAO0D,EAAQhQ,GACtD+Q,GAAI1lB,aAAK,EAALA,EAAOA,QAASye,EAAeI,QAAQ8+C,iBACjD,MAAO,CACLjrD,MAAO+L,EAAe/L,MACtBmM,QAASvlB,MAAMC,KAAKmsB,GACpB7C,MAAO6C,EAAE23C,UACTC,gBAAgBt9D,aAAK,EAALA,EAAOs9D,iBAAkB7+C,EAAe/L,MACzD,IApBM,CACLA,MAAO+L,EAAe/L,MACtBmM,QAASvlB,MAAMC,KAAKgkE,EAAUv9D,OAC9B6iB,MAAO06C,EAAUv9D,MAAMq9D,UACvBC,eAAgBC,EAAUD,eAkBhC,CAEOM,mBAAmBnM,EAAwF98C,EAAemiD,GAC/H,MAAM,iBAACL,EAAgB,SAAE91C,GAAY8wC,EAE/B/+C,EAAS++C,EAAyD/+C,OAASiO,EAAS3rB,OACpFsoE,EAAiB7G,GAAoB,EAErCoH,EAAoB/G,EAAa,EAAIniD,EAAQmiD,EAAaniD,EAKhE,MAAO,CAACjC,QAAO4qD,iBAAgBx4C,SAHdw4C,GAAmB5qD,EAAQmrD,GAAsBnrD,EAAQmrD,EAGjCT,aAFpBE,GAAmBxG,EAAa,GAAMwG,EAAiBxG,GAAe,EAG7F,CAEOoC,mBACLP,EACAlH,EACAv8C,EACAP,EACAmiD,GAEA,MAAM,SAACn2C,GAAY8wC,EACb5uC,EAAQrqB,KAAKolE,mBAAmBnM,EAAe98C,EAAOmiD,IACtD,MAACpkD,EAAK,eAAE4qD,EAAc,SAAEx4C,EAAQ,YAAEs4C,GAAev6C,EACjD09B,EAAO5/B,EAASjkB,KAAKrC,GACjBA,EAAsB0kB,MAMhC,GAAG7J,IAAa,EAAAuC,GAAA,GAAmBvC,KAAeqrC,EAAKh5B,SAASrS,IAAcooD,EAAiB5qD,EAAO,CACpG,IAAIxU,EAAI,EACR,IAAI,MAAMlJ,EAASurD,EAAKvrD,OAAQkJ,EAAIlJ,KAC/BkgB,EAAYqrC,EAAKriD,MADwBA,GAM9CqiD,EAAKl+C,OAAOnE,EAAG,EAAGgX,E,CAGpB,MAAMlV,EAAQ24D,EAAY71C,YAAYy9B,IAASoY,EAAY34D,MAS3D,OARG8kB,GACD9kB,EAAM+iB,OAAO,UAGZq6C,GACDp9D,EAAM+iB,OAAO,aAGR,OAAP,QAAQ/iB,QAAOugD,OAAM5/B,YAAakC,EACpC,CAEO66C,mBAAmBlmE,EAAgB0d,EAAmBP,EAAemiD,EAAoBr4C,EAAgC/D,GAC9H,MAAMojD,EAAWr/C,EAAewC,MAChC,OAAOzoB,KAAKulE,eAAevmE,EAAQ0d,EAAWP,EAAOmiD,OAAYr/D,EAAWijB,GAAUrd,MAAMo0D,IAC1F,MAAM,MAAC/+C,EAAK,YAAE0qD,EAAW,MAAEp9D,EAAK,SAAE2gB,GAAYnoB,KAAK0gE,mBAAmBz6C,EAAeI,QAAS4yC,EAAev8C,EAAWP,EAAOmiD,GAE/Hr4C,EAAe/L,MAAQA,EAQvB,IAAI,IAAIxU,EAAI,EAAGlJ,EAAS2rB,EAAS3rB,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CACxD,MAAM7D,EAAUsmB,EAASziB,GACtB1F,KAAKwqB,mBAAmBvE,EAAgBpkB,IACzC7B,KAAK+c,UAAUrW,cAAc,uBAAwB,CAAC1H,U,CAI1D,GAAG4lE,EAAa,CACd,MAAMvF,EAAW73D,EAAM,GAEvB,GAAGye,EAAewC,QAAU68C,EAAU,CACpC,MAAM39D,EAAQse,EAAeI,QAAQ1e,MAClCA,IAAUH,GACXye,EAAeI,QAAQm/C,YAAY79D,GAGlCse,EAAewC,QAAU42C,IAC1Bp5C,EAAewC,MAAQjhB,EAAM,GAE7BxH,KAAKuf,mBAAmBvgB,G,KAwClC,CAEOumE,eAAevmE,EAAgBypB,EAAetM,EAAQ,EAAGgQ,EAAS,EAAG7L,EAAa,EAAG4B,EAAW,GAKrG,MAAMzmB,EAAmD,CACvDgf,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5C0d,WAAW,EAAAuC,GAAA,GAAmBwJ,IAAU,EACxChM,YAAa6D,EACbg+C,WAAYnyC,EACZhQ,QACA6qC,OAAQ,EACRuX,OAAQ,EACRt9B,KAAM,GAYR,OATG/e,IACAzmB,EAA+B2iD,QAAS,EAAAn/B,GAAA,GAAmBiD,IAAa,GAGTliB,KAAK2T,WAAWge,gBAAgBzP,EAAW,sBAAwB,sBAAuBzmB,EAAS,CAEnK07B,YAAY,IAGCtyB,MAAMo0D,IAChB,MACDj5D,KAAKG,IAAI,yBAA0BnB,EAAQi6D,EAAexwC,EAAOtM,EAAOgQ,GAG1EnsB,KAAKgd,gBAAgBgL,aAAaixC,EAAcvgD,OAChD1Y,KAAKsc,gBAAgB2L,aAAagxC,EAAc/wC,OAChDloB,KAAKmf,aAAa85C,EAAc9wC,UAE7B,QAAS8wC,GACVj5D,KAAKge,kBAAkB6M,gBAAgB7rB,EAAOwd,WAAYy8C,EAAcjzC,KAG1E,IAAIxpB,EAASy8D,EAAc9wC,SAAS3rB,OAAQ0d,EAAS++C,EAAyD/+C,MAC3G1d,IAAWy8D,EAAc9wC,SAAS3rB,EAAS,KAC5Cy8D,EAAc9wC,SAASte,OAAOrN,EAAS,EAAG,GAC1CA,IACA0d,KAKF,MAAM+L,EAAiBjmB,KAAKkmB,kBAAkBlnB,EAAQkjB,GAChDujD,EAAiCxM,EAAc9wC,SAAS3rB,EAAS,GACvE,GAAGA,GAAUipE,EAAc3e,WAAY,CACrC,MAAM4e,EAAaz/C,EAAeI,QAAQ8+B,UAAUsgB,EAAcl/C,KAClE,GAAGm/C,GAAeA,EAAWl+D,MAAMhL,OAASy8D,EAAc9wC,SAAS3rB,OAAU0d,EAC3E,OAAOla,KAAKulE,eAAevmE,EAAQymE,EAAcl/C,IAAK,GAAI,EAAGjG,EAAY4B,GAAUrd,MAAM8gE,GAChF1M,G,CAKb,OAAOA,CAAa,IAClBt7D,IACF,GACO,oBADAA,EAAMG,KACX,CACE,IAAIue,EAAUrc,KAAKsc,gBAAgBsB,QAAQ5e,EAAOwd,YACjC,YAAdH,EAAQ3f,IACT2f,EAAU,CACR3f,EAAG,mBACHC,GAAIqC,EAAOwd,WACX2d,YAAa9d,EAAQ8d,YACrB9O,MAAOhP,EAAQgP,MACfpuB,OAAQof,EAAQpf,SAIpB+C,KAAKge,kBAAkBmV,qBAAqB,CAC1Cz2B,EAAG,UACHmsB,QAAS,CAAC,CACRnsB,EAAG,gBACH6C,WAAYP,EAAOwd,aAErB0L,MAAO,CAAC7L,GACR3D,MAAO,IAEJ,CAGT,MAAM/a,CAAK,GAEf,CAEOioE,sBACL,OAAG5lE,KAAK6lE,2BACC7lE,KAAK6lE,2BAGP7lE,KAAK6lE,4BAA6B,EAAA/7D,EAAA,GAAM,GAAGjF,MAAK,KACrD,MAAMihE,EAAmC,GAEzC,IAAI,MAAO9mE,EAAQkF,KAAQlE,KAAK+hD,mBAAoB,CAClD,MAAMgG,EAAO,IAAI7jD,EAAI8O,QACf8tD,EAAyB/Y,EAAK7jD,KAAKqiB,IAChC,CACL7pB,EAAG,iBACHC,IAAI,EAAAsiB,GAAA,GAAmBsH,OAI3B,IAAI7c,EAEFA,EADC1K,EAAO4nB,aAAe5mB,KAAK0a,gBAAgBiL,UAAU3mB,GAC5CgB,KAAK2T,WAAWge,gBAAgB,uBAAwB,CAChEtV,QAASrc,KAAKsc,gBAAgBC,gBAAgBvd,EAAOwd,YACrD7f,GAAImkE,IAGI9gE,KAAK2T,WAAWge,gBAAgB,uBAAwB,CAChEh1B,GAAImkE,IAIR,MAAMhkD,EAAQpT,EAAQ7E,MAAMkhE,KAC1B,EAAAh+C,GAAA,GAAqGg+C,GAErG/lE,KAAKgd,gBAAgBgL,aAAa+9C,EAAkBrtD,OACpD1Y,KAAKsc,gBAAgB2L,aAAa89C,EAAkB79C,OACpD,MAAMC,EAAWnoB,KAAKmf,aAAa4mD,EAAkB59C,UAErD,IAAI,IAAIziB,EAAI,EAAGA,EAAIyiB,EAAS3rB,SAAUkJ,EAAG,CACvC,MAAM7D,EAAUsmB,EAASziB,GACzB,IAAI7D,EACF,SAGF,MAAM0kB,GAAM,EAAAjL,GAAA,GAAkBzZ,EAAQlF,IACtBuH,EAAIK,IAAIgiB,GAChBtkB,QAAQJ,GAChBqC,EAAIL,OAAO0iB,E,CAGb,GAAGriB,EAAIkP,KACL,IAAI,MAAOmT,EAAK7c,KAAYxF,EAC1BwF,EAAQzH,QAAQjC,KAAK03D,qBAAqBnxC,G,IAG7CkiB,SAAQ,KACTzoC,KAAK+c,UAAUrW,cAAc,sBAAuB,CAAC1H,SAAQ+oD,QAAM,IAGrE+d,EAAgBxlE,KAAKwc,E,CAKvB,OAFA9c,KAAK+hD,mBAAmBnjD,QAEjB+C,QAAQyQ,IAAI0zD,GAAiBjhE,KAAKyqD,GAAA,EAAMA,GAAA,GAAMzqD,MAAK,KACxD7E,KAAK6lE,gCAA6B5mE,EAC/Be,KAAK+hD,mBAAmB3uC,MAAMpT,KAAK4lE,qBAAqB,GAC3D,GAEN,CAIOpvD,eAAexX,EAAgBunB,EAAwBmL,GAC5D,GAAG5wB,MAAMiD,QAAQwiB,GACf,OAAO5kB,QAAQyQ,IAAImU,EAAIriB,KAAKqiB,GACnBvmB,KAAKwW,eAAexX,EAAQunB,EAAKmL,MAI5C,MAAM7vB,EAAU7B,KAAKsf,iBAAiBtgB,EAAQunB,GAC9C,GAAG1kB,IAAY6vB,EAEb,OADA1xB,KAAK+c,UAAUrW,cAAc,sBAAuB,CAAC1H,SAAQ+oD,KAAM,CAACxhC,KAC7D5kB,QAAQM,QAAQJ,GAClB,CACL,IAAIqC,EAAMlE,KAAK+hD,mBAAmBx9C,IAAIvF,GAClCkF,GACFlE,KAAK+hD,mBAAmB/5C,IAAIhJ,EAAQkF,EAAM,IAAIqN,KAGhD,IAAI7H,EAAUxF,EAAIK,IAAIgiB,GACtB,OAAG7c,IAIHA,GAAU,SACVxF,EAAI8D,IAAIue,EAAK7c,GACb1J,KAAK4lE,sBACEl8D,E,CAEX,CAEOs8D,iBAAiBhnE,EAAgB+oD,GACtC,IAAI7jD,EAAMlE,KAAKgiD,cAAcz9C,IAAIvF,GAC7BkF,GACFlE,KAAKgiD,cAAch6C,IAAIhJ,EAAQkF,EAAM,IAAIqN,KAG3C,MAAM/X,GAAW,SACXysE,EAAsB,GACtBx6C,EAAWs8B,EAAK7jD,KAAKqiB,IACzB,IAAI7c,EAAUxF,EAAIK,IAAIgiB,GAatB,OAZI7c,IACFxF,EAAI8D,IAAIue,EAAK7c,EAAUlQ,GACvBysE,EAAU3lE,KAAKimB,GAEf7c,EAAQ7E,MAAK,KACXX,EAAIL,OAAO0iB,GACPriB,EAAIkP,MAAQpT,KAAKgiD,cAAcz9C,IAAIvF,KAAYkF,GACjDlE,KAAKgiD,cAAcn+C,OAAO7E,E,KAKzB0K,CAAO,IAehB,OAZIu8D,EAAUzpE,OAGZwD,KAAK2T,WAAWC,UAAU,4BAA6B,CACrD6G,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5CrC,GAAIspE,EAAU/hE,KAAKqiB,IAAQ,EAAAtH,GAAA,GAAmBsH,OAC7C1hB,MAAMgkB,IACP7oB,KAAKge,kBAAkBmV,qBAAqBtK,GAC5CrvB,EAASyI,SAAS,IAPpBzI,EAASyI,UAWJN,QAAQyQ,IAAIqZ,EACrB,CAEOy6C,oBAAoBrkE,GACzB,IAAIA,EAAQijD,aAAc,OAAOnjD,QAAQM,QAAQjC,KAAK03D,qBAAqB,IAC3E,MAAMyO,EAAgBtkE,EAAQgyB,SAASgxB,iBAAmB7kD,KAAK0a,gBAAgB3b,UAAU8C,EAAQgyB,SAASgxB,kBAAoBhjD,EAAQ7C,OACtI,OAAOgB,KAAKwW,eAAe2vD,EAAetkE,EAAQijD,cAAcjgD,MAAMovD,IAMpE,GALIA,UACFpyD,EAAU7B,KAAKsf,iBAAiBzd,EAAQ7C,OAAQ6C,EAAQ0kB,MACzCu+B,aAGA,mBAAdjjD,EAAQnF,EAAwB,CACjC,MAAMsC,EAAS6C,EAAQ7C,OACvBgB,KAAK+c,UAAUrW,cAAc,eAAgB,CAC3C0vC,WAAY,GAAGp3C,YACfA,OAAQA,EACRunB,IAAK1kB,EAAQ0kB,IACb1kB,YAGC7B,KAAKuhE,sBAAsB1/D,IAC5B7B,KAAK+c,UAAUrW,cAAc,sBAAuB,IAAI6K,IAAI,CAAC,CAACvS,EAAQ,CAACia,OAAQjZ,KAAKkb,cAAclc,O,CAItG,OAAOi1D,CAAe,GAE1B,CAEQiF,aAAal6D,EAAgBkjB,GACnC,OAAOA,EAAW,GAAGljB,KAAUkjB,IAAaljB,CAC9C,CAEOwyD,UACLxyD,EACAwZ,EACAue,EACA7U,G,MAEGA,IAAaliB,KAAK0a,gBAAgBiF,QAAQ3gB,KAC3CkjB,OAAWjjB,GAGb,MAAMmI,EAAMpH,KAAKk5D,aAAal6D,EAAQkjB,GACtC,IAAIkkD,EAASpmE,KAAKsiD,QAAQl7C,GAC1B,OACGpI,GACAgB,KAAKkiE,cAAcljE,IACpBA,IAAWgB,KAAK0a,gBAAgB1b,SAE9B+3B,IAAuB,QAAd,EAAAqvC,aAAM,EAANA,EAAQ5tD,cAAM,eAAE9b,KAAM8b,EAAO9b,KAKvC0pE,aAAM,EAANA,EAAQphE,UACTD,aAAaqhE,EAAOphE,SAGtBohE,EAASpmE,KAAKsiD,QAAQl7C,GAAO,CAC3BoR,UAGKxY,KAAK2T,WAAWC,UAAU,qBAAsB,CACrD6G,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5CwZ,SACA28B,WAAYjzB,GAAW,EAAAjD,GAAA,GAAmBiD,QAAYjjB,IACrDwpC,SAAQ,KACN29B,IAAWpmE,KAAKsiD,QAAQl7C,KACzBg/D,EAAOphE,QAAU2J,EAAA,cAAe,YACvB3O,KAAKsiD,QAAQl7C,EAAI,GACvB,K,KAnBEzF,QAAQM,SAAQ,EAsB3B,CAEQ6gE,uBAAuBjhE,EAAoB2B,GACjD,MAAMwU,EAASnW,EAA4BmW,MAC3C,GAAGA,EAAO,CACR,MAAM1B,EAAK0B,EAA2C40C,SAA8B50C,EAC9EquD,EAAkC/vD,EAAqCmiB,OAAiBniB,EAAwCqwB,SAMtI,IAJG0/B,aAAI,EAAJA,EAAMr2B,iBACPhwC,KAAKiwC,kBAAkB75B,cAAciwD,EAAKr2B,eAAgB,CAAClyC,KAAM,UAAWkB,OAAQ6C,EAAQ7C,OAAQ8O,UAAWjM,EAAQ0kB,MAGtH,YAAavO,GAASA,EAAM40C,QAAS,CACtC,MAAM7C,EAAc/pD,KAAK2sD,4BAA4B9qD,EAAQ7C,UAAYwE,EACnE23D,EAAan7D,KAAK6sD,mBAAmBuO,+BAA+Bv5D,EAAQ7C,OAAQ6C,EAAQ0kB,IAAKwjC,GACvG/pD,KAAK6sD,mBAAmByZ,yBAAyBtuD,EAAM40C,QAASuO,E,CAG9DnjD,EAAwCg1C,MAC1ChtD,KAAKitD,gBAAgBsZ,oBAAoB1kE,GAA4B,E,CAG3E,CAEQ4mD,sBAAsBzpD,EAAgBwE,EAA0B2kB,GACtE,MAAM9B,EAMF,CACFnM,MAAO,EACPiQ,OAAQ,EACRo4B,eAAgB,EAChBoG,KAAM,IAAIxqD,KAGZ,IAAI,MAAMooB,KAAO4B,EAAU,CACzB,MAAMtmB,EAAqB7B,KAAKwmB,sBAAsBhjB,EAAS+iB,GAC/D,IAAI1kB,EAAS,CACX7B,KAAKkoD,mCAAmClpD,GACxC,Q,CAGFgB,KAAK8iE,uBAAuBjhE,EAAS2B,GAErCxD,KAAKilD,6BAA6BpjD,GAE9BA,EAAQ5E,OAAOusB,KAAQ3nB,EAAQ5E,OAAOwpB,cAAe5kB,EAAQ5E,OAAOktB,WACpE9D,EAAQ8D,OACVnqB,KAAK+c,UAAUrW,cAAc,sBAAuB,MAAQ6f,GAEzD1kB,EAAQ5E,OAAOgnD,cACd59B,EAAQk8B,eACVviD,KAAKwlD,qBAAqBxmD,EAAQunB,GAAK,OAIzCF,EAAQnM,MACVmM,EAAQsiC,KAAK7pD,IAAIynB,GAEjB1kB,EAAQ0nB,SAAU,EAElB,MAAM4wC,EAAat4D,EAA4BilD,WAC/C,GAAGqT,EAAW,CACZ,MAAMqM,EAAiBxmE,KAAK8iD,uBAAuBqX,GAChDqM,IACDA,EAAe3iE,OAAO0iB,GAElBF,EAAQogD,SAAQpgD,EAAQogD,OAAS,CAAC,IACrCpgD,EAAQogD,OAAOtM,KAAe9zC,EAAQogD,OAAOtM,GAAa,IAAIh8D,MAAQW,IAAIynB,GAEvEigD,EAAepzD,cACViT,EAAQogD,cACRzmE,KAAK8iD,uBAAuBqX,I,CAKzC32D,EAAQK,OAAO0iB,E,CAGjB,GAAGF,EAAQogD,OACT,IAAI,MAAMtM,KAAa9zC,EAAQogD,OAC7BzmE,KAAK0mE,kBAAkBvM,EAAW32D,EAAS,IAAI6iB,EAAQogD,OAAOtM,KASlE,OAAO9zC,CACT,CAEQogC,oBAAoBF,EAAqBC,EAAqBhjD,G,MACpE,GAAoB,YAAjB+iD,EAAW7pD,EAAiB,CAC7B,GAAyD,QAArD,EAAA6pD,EAAWvuC,aAA0C,eAAE40C,QAAS,CAClE,MAAMuO,EAAan7D,KAAK6sD,mBAAmBuO,+BAA+B7U,EAAWvnD,OAAQunD,EAAWhgC,MAAOggC,EAAWtpD,OAAO8wD,cACjI/tD,KAAK6sD,mBAAmByZ,yBAA0B/f,EAAWvuC,MAA2C40C,QAASuO,E,CAGnH,MAAMhB,EAAY5T,EAAWO,WAC1BqT,GACDn6D,KAAK0mE,kBAAkBvM,EAAW32D,EAAS,G,CAGjD,CAEQkjE,kBAAkBvM,EAAmB32D,EAA0BmjE,GACrE,MACMx+C,EADOnoB,KAAKk6D,eAAeC,GACXj2D,KAAKqiB,GAAQvmB,KAAKwmB,sBAAsBhjB,EAAS+iB,KACvEvmB,KAAK+c,UAAUrW,cAAc,aAAc,CAAC1H,OAAQmpB,EAAS,GAAGnpB,OAAQszD,QAAS6H,EAAWwM,YAAaA,GAAe,GAAIx+C,YAC9H,CAEO5D,qBAAqBtL,GAC1B,IAAIoJ,EAAcpJ,EAAOmR,aACzB,IAAIpqB,KAAK+qB,eAAe3J,QAAQnI,IAAWjZ,KAAK0a,gBAAgBiF,QAAQ1G,EAAOja,QAAS,CACtF,MAAM+lB,EAAmB/kB,KAAK+qB,eAAe/F,oBAAoB/L,EAAOja,QAEtEqjB,EADC0C,aAA4BpjB,QACf,EAEAojB,EAAiB7K,K,CAInC,OAAOmI,MAAmBpJ,EAAkBhc,OAAOopD,WACrD,CAEO12B,eAAe1W,GACpB,QAASjZ,KAAKukB,qBAAqBtL,EACrC,CAEOi/C,WAAWr2D,GAChB,MAAsB,aAAfA,aAAO,EAAPA,EAASnF,KAAqBmF,EAA4B5E,OAAO2pE,aAAe5mE,KAAK0a,gBAAgBmsD,WAAWhlE,EAAQ7C,OACjI,CAEQinD,gBACN9jD,EACAsC,EACA2C,EACA0/D,GAEA,IAAIxZ,EAAUttD,KAAKyiD,aAAatgD,GAC5BmrD,IAEFA,EAAUttD,KAAKyiD,aAAatgD,GAAS,CACnCsC,WACA0lD,MAAO,IAAI54C,MAIX+7C,EAAQnD,MAAM1rD,IAAI2I,KAEpBkmD,EAAQnD,MAAMniD,IAAIZ,EAAK0/D,EAAqBA,SAAuB7nE,GACnEe,KAAKotD,wBAET,CAEQ/C,mBAA4CnmD,GAClD,MAAM6iE,EAAgD,IAAIx1D,IAC1D,IAAI,MAAOnK,EAAKhD,KAAUF,EAAK,CAC7B,MAAO8iE,EAAWzgD,GAAOnf,EAAIxH,MAAM,KAC7BiC,EAAU7B,KAAKsf,iBAAiB0nD,EAAU3nE,YAAaknB,GACzD1kB,GAIJklE,EAAO/+D,IAAInG,EAASuC,E,CAGtB,OAAO2iE,CACT,CA6COE,kBAAkBjoE,EAAgB8vD,GAGvC,OAFoB9uD,KAAK4W,kBAAkB8pB,kBAAkB1hC,EAAOwd,YACxDmmB,gBAAkB3iC,KAAK0a,gBAAgB4O,cAAcwlC,GAC1D9uD,KAAK2T,WAAWC,UAAU,6BAA8B,CAC7D6G,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5C6jC,QAAS7iC,KAAK0a,gBAAgBkW,iBAAiBk+B,IAEnD,E,eE30Ma,SAASoY,GAAuCC,GAC7D,MAAM1qE,EAAM0qE,EAASrrE,QAAQ,QAAS,IACtC,OAAQW,EAAI,GAAGjC,cAAgBiC,EAAI+K,MAAM,EAC3C,CCqBO,MAAM4/D,WAAgC30D,EAA7C,c,oBACU,KAAA40D,aAAe,CACrB3hB,WAAY,CAAC,EACb4hB,YAAa,KACbC,YAAa,KACbC,iBAAkB,KAClBC,iBAAkB,CAAC,GA8Hb,KAAAC,eAAiB,UACWzoE,IAA/Be,KAAK2nE,wBACN5iE,aAAa/E,KAAK2nE,uBAClB3nE,KAAK2nE,2BAAwB1oE,GAG/B,MAAMwgC,GAAY,EAAAnc,GAAA,IAAM,GACxB,IAAIskD,EAAmB,KAEvB,MAAM/tC,EAAKguC,IACT,GAAGA,aAA8BlmE,QAC/B,OAAO,EAGT,MAAMmgE,EAAY+F,EAAmB9F,WACrC,QAAID,IAIDA,GAAariC,GAEdooC,EAAmB9F,WAAa,GACzB,IACCD,EAAY8F,IACpBA,EAAmB9F,IAGd,GAAK,EAGd,CACE,aACA,oBACAjjE,SAASipE,IACT,IAAI,MAAM1gE,KAAOpH,KAAKqnE,aAAaS,GAAU,CAC3C,MAAMD,EAAqB7nE,KAAKqnE,aAAaS,GAAS1gE,GACtD,GAAGyyB,EAAEguC,GAAqB,CACxB,MAAO7oE,EAAQqc,GAAWjU,EAAIxH,MAAM,KAC9B6a,EAAOza,KAAK0a,gBAAgB4O,cAActqB,EAAOK,YACvDW,KAAKge,kBAAkB+K,WAAW,CAChCrsB,EAAG,uBACH+d,KAAMY,EAAU,CACd3e,EAAG,mBACH+d,OACA06B,YAAa95B,GACX,CACF3e,EAAG,aACH+d,QAEFmQ,gBAAiBi9C,G,MAMzB,MAAM7iE,EAAUub,KAAKC,IAAI,KAAyC,KAAhConD,EAAmBnoC,IACrDz/B,KAAK2nE,sBAAwBh5D,EAAA,aAAe3O,KAAK0nE,eAAgB1iE,EAAQ,CA0G7E,CArRY8X,QAoBR,OAnBA9c,KAAK+nE,yBAA0B,EAAAC,GAAA,GAAShoE,KAAK0nE,eAAgB,KAAM,GAEnE1nE,KAAKge,kBAAkBC,2BAA2B,CAChDquC,qBAAuBjyC,IACrB,MAAM,KAACI,GAAQJ,EACT+G,EAAqB,qBAAX3G,EAAK/d,EACfurE,EAAwB,eAAXxtD,EAAK/d,GAAsB0kB,EACxCpiB,EAASipE,GAAcjoE,KAAK0a,gBAAgB3b,UAAU0b,EAAKA,MAC3DrT,EAAO6gE,OAAsBhpE,EAATwb,EAAK/d,EAC/BsD,KAAK2qB,iBAAiB,CACpBvjB,MACApI,SACAkjB,SAAUd,GAAU,EAAA9F,GAAA,GAAkBb,EAAK06B,iBAAcl2C,EACzD4H,SAAUwT,EAAOuQ,kBAEnB5qB,KAAK+c,UAAUrW,cAAc,kBAAmB2T,EAAO,IAIpDra,KAAKue,gBAAgBrX,WAAWrC,MAAMmC,IAC3C,GAAGA,EAAMkhE,eACP,IAAI,MAAM9gE,KAAOJ,EAAMkhE,gBACrB,EAAAngD,GAAA,GAAyB3gB,GACzBpH,KAAK2qB,iBAAiB,CACpBvjB,MACAP,SAAUG,EAAMkhE,eAAe9gE,I,GAKzC,CAEOk6D,kBAAkB7mD,GACvB,IAGIzb,EAHAoI,EAAW8/D,GAAqBzsD,EAAK/d,GACrCyU,EAAWnR,KAAKqnE,aAAajgE,GAQjC,MALc,oBAAXqT,EAAK/d,IACNsC,EAASoI,EAAMpH,KAAK0a,gBAAgB3b,UAAU0b,EAAKA,MACnDtJ,EAAMA,EAAI/J,IAGT+J,KAIKA,GAAOnR,KAAKqnE,cAAcjgE,GAAOpH,KAAK2T,WAAWC,UAAU,4BAA6B,CAAC6G,SAChG5V,MAAMgC,IACL7G,KAAK2qB,iBAAiB,CACpBvjB,MACApI,SACA6H,aAGKA,KAEX,CAEOw6D,4BACL,GAAGrhE,KAAKmoE,yBAA0B,OAAOnoE,KAAKmoE,yBAE9C,MAAM18C,EAAY,CAAC,wBAAyB,mBAAoB,oBAC/DvnB,KAAKijE,GACGnnE,KAAKshE,kBAAkB,CAAC5kE,EAAGyqE,MAGpC,OAAOnnE,KAAKmoE,yBAA2BxmE,QAAQyQ,IAAIqZ,EACrD,CAEO6gC,qBAAqB7xC,EAAuB5T,GAMjD,OAAO7G,KAAK2T,WAAWC,UAAU,+BAAgC,CAC/D6G,OACA5T,aACChC,MAAMT,IACJA,GACDpE,KAAKge,kBAAkBkX,mBAAmB,CACxCx4B,EAAG,uBACH+d,KAAM,OAAF,wBACCA,GAAW,CACd/d,EAAGwqE,GAAqBzsD,EAAK/d,KAE/BkuB,gBAAiB,OAAF,wBACV/jB,GAAQ,CACXnK,EAAG,wB,GAKb,CASO0rE,+BACL,OAAGpoE,KAAKqoE,qBAA6BroE,KAAKqoE,qBACnCroE,KAAKqoE,qBAAuBroE,KAAK2T,WAAWC,UAAU,uCAC/D,CAEO00D,6BAA6Bz2C,GAClC7xB,KAAK2T,WAAWC,UAAU,uCAAwC,CAACie,WAClEhtB,MAAMT,IACLpE,KAAKqoE,qBAAuB1mE,QAAQM,SAAS4vB,EAAO,GAExD,CA6DO02C,WAAWvpE,EAAgBkjB,GAChC,OAAOljB,GAAUkjB,EAAW,IAAMA,EAAW,GAC/C,CAEOyI,kBAAiB,IAACvjB,EAAG,OAAEpI,EAAM,SAAEkjB,EAAQ,SAAErb,IAM9C,IAAIsK,EACDnS,IACDoI,EAAMpH,KAAKuoE,WAAWvpE,EAAQkjB,GAC9B/Q,EAAMnR,KAAKqnE,aAAanlD,EAAW,mBAAqB,gBAGzD/Q,GAAOnR,KAAKqnE,cAAcjgE,GAAOP,EAE9B7H,EAQFgB,KAAK+nE,2BAPL/nE,KAAK+c,UAAUrW,cAAc,4BAA6B,CAACU,MAAKP,aAChE7G,KAAKue,gBAAgBrX,WAAWrC,MAAMmC,IACpC,MAAMkhE,EAAiBlhE,EAAMkhE,eAC7BA,EAAe9gE,GAAOP,EACtB7G,KAAKue,gBAAgB3W,YAAY,iBAAkBsgE,EAAe,IAOxE,CAEOzsB,QAAQosB,GACb,MAAgC,uBAAzBA,EAAmBnrE,IACvBmrE,EAAmBh2C,aAA6C5yB,IAAlC4oE,EAAmB9F,YAA6D,IAAhC8F,EAAmB9F,YAAqB,EAAAz+C,GAAA,KAC3H,CAEQklD,aAAaxpE,GACnB,MAAMmzD,EAAMnyD,KAAKshE,kBAAkB,CAAC5kE,EAAG,kBAAmB+d,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,KACtG,OAAQmzD,aAAexwD,QAAUwwD,EAAMxwD,QAAQM,QAAQkwD,IACtDttD,MAAMgjE,GAAuB7nE,KAAKy7C,QAAQosB,IAC7C,CAEQY,sBAAqB,OAC3BzpE,EAAM,YACNijB,GAAc,EAAI,SAClBC,IAMA,MAAMwmD,EAAwB,CAC5BhsE,EAAG,sBAGCisE,EAAU3oE,KAAKuoE,WAAWvpE,EAAQkjB,GAClCgmD,EAAiBloE,KAAKqnE,aAAanlD,EAAW,mBAAqB,cAAcymD,GAMvF,IAJGT,GAAoBA,aAA0BvmE,SAC/C1H,OAAOC,OAAOwuE,EAAGR,GAGhBjmD,EAAa,CACd,MACM7a,EAAM8/D,GADQlnE,KAAK0a,gBAAgBymD,uBAAuB,CAACniE,SAAQoiE,cAAc,EAAMl/C,aAChDxlB,GACvCksE,EAAqB5oE,KAAKqnE,aAAajgE,GAC7C,GAAGwhE,KAAwBA,aAA8BjnE,SACvD,IAAI,MAAM+D,KAAKkjE,OAED3pE,IAATypE,EAAEhjE,KAEHgjE,EAAEhjE,GAAKkjE,EAAmBljE,G,CAMlC,OAAOgjE,CACT,CAEO7G,qBAA+FpmE,GACpG,GAAGA,EAAQuD,SAAWgB,KAAK0a,gBAAgB1b,OAE3C,OADGvD,EAAQymB,WAAaliB,KAAK0a,gBAAgBiF,QAAQlkB,EAAQuD,UAASvD,EAAQymB,cAAWjjB,GAClFxD,CACT,CAEOumB,iBAAiBvmB,GACtB,KAAKA,EAAUuE,KAAK6hE,qBAAqBpmE,IAAW,OAAO,EAE3D,GAAGA,EAAQymB,SAAU,CACnB,MAAMgmD,EAAiBloE,KAAKyoE,qBAAqB,OAAD,wBAAKhtE,GAAO,CAAEwmB,aAAa,KAC3E,YAA6BhjB,IAA1BipE,EAAer2C,aAAsD5yB,IAA9BipE,EAAenG,WAChD/hE,KAAKy7C,QAAQysB,GAEbloE,KAAKgiB,iBAAiB,OAAD,wBAAKvmB,GAAO,CAAEymB,cAAUjjB,I,CAIxD,MAAMipE,EAAiBloE,KAAKyoE,qBAAqBhtE,GAEjD,OADgBuE,KAAKy7C,QAAQysB,EAE/B,E,yDCnSK,MAAMW,WAAwBp2D,EACxBzT,aACT,OAAOgB,KAAKgd,gBAAgB7d,OAAOE,UACrC,CAMOypE,cAAc9pE,GACnB,OAAOA,EAAOS,UAAYO,KAAKsc,gBAAgBqgB,UAAU39B,EAAOwd,WAAY,eAC9E,CAEOusD,aAAa/pE,GAClB,MAAMyb,EAAOza,KAAKuzD,QAAQv0D,GAC1B,OAAO,EAAA+pE,GAAA,GAAatuD,EACtB,CAEO8zC,kBAAkBvvD,GACvB,GAAGA,EAAOS,SACR,OAAO,EAGT,MAAMke,EAAO3d,KAAKsc,gBAAgBsB,QAAQ5e,EAAOwd,YAC3CgF,EAAa7D,aAAI,EAAJA,EAAM+L,YACzB,SAAGlI,IAAc7D,EAAK1gB,OAAO0sB,eACpB,EAAA5qB,GAAA,GAAUyiB,EAIrB,CAEO8H,cAActqB,GACnB,GAAGA,EAAOS,SACR,MAAO,CAAC/C,EAAG,WAAY0C,QAASJ,EAAOkxB,YAGzC,MAAM5wB,EAASN,EAAOwd,WACtB,OAAGxc,KAAKsc,gBAAgBqJ,UAAUrmB,GACzB,CAAC5C,EAAG,cAAe6C,WAAYD,GAGjC,CAAC5C,EAAG,WAAY8C,QAASF,EAClC,CAEO0gE,cAAchhE,GACnB,OAAGA,EAAOS,SACDO,KAAKgd,gBAAgBgsD,cAAchqE,EAAOkxB,YAE5ClwB,KAAKsc,gBAAgBmhB,cAAcz+B,EAAOwd,WACnD,CAEOyhC,gBAAgBj/C,GACrB,OAAOgB,KAAK+oD,uBAAuB/pD,GAAQ,IAAM,EACnD,CAEO+pD,uBAAuB/pD,GAC5B,MAAMyb,EAAOza,KAAKuzD,QAAQv0D,GAC1B,OAAO,EAAA+pD,GAAA,GAAuBtuC,EAChC,CAEO84C,QAAQv0D,GACb,OAAOA,EAAOS,SACZO,KAAKgd,gBAAgB6gC,QAAQ7+C,EAAOkxB,YACpClwB,KAAKsc,gBAAgBsB,QAAQ5e,EAAOwd,WACxC,CAEOzd,UAAUC,GACf,OAAO,EAAAD,GAAA,GAAUC,KAAY,EAAAokB,GAAA,GAAoBpkB,IAAwB,kBAAbA,EAAOtC,GAAyBsD,KAAKhB,QAAW,IAC9G,CAEOy9D,cAAcz9D,GACnB,MAAO,CACLtC,EAAG,aACH+d,KAAMza,KAAKspB,cAActqB,GAE7B,CAEO2mB,UAAU3mB,GACf,OAAQA,EAAOS,UAAYO,KAAKsc,gBAAgBqJ,UAAU3mB,EAAOwd,WACnE,CAEOygB,YAAYj+B,GACjB,OAAQA,EAAOS,UAAYO,KAAKsc,gBAAgB2gB,YAAYj+B,EAAOwd,WACrE,CAEOmD,QAAQ3gB,GACb,OAAQA,EAAOS,UAAYO,KAAKsc,gBAAgBqD,QAAQ3gB,EAAOwd,WACjE,CAEOyT,WAAWjxB,GAChB,OAAQA,EAAOS,WAAaO,KAAKsc,gBAAgByT,YAAY/wB,EAAOwd,WACtE,CAEOuT,YAAY/wB,GACjB,OAAOgB,KAAK2lB,UAAU3mB,KAAYgB,KAAKi9B,YAAYj+B,EACrD,CAEOmxB,MAAMnxB,GACX,OAAOA,EAAOS,UAAYO,KAAKgd,gBAAgBmT,MAAMnxB,EAAOkxB,WAC9D,CAEOI,UAAUtxB,GACf,OAAOA,EAAOS,UAAYO,KAAKgd,gBAAgBsT,UAAUtxB,EAAOkxB,WAClE,CAEOzwB,OAAOT,GACZ,OAAO,EAAAS,GAAA,GAAOT,EAChB,CAEO4nB,UAAU5nB,GACf,OAAO,EAAA4nB,GAAA,GAAU5nB,EACnB,CAEO0+D,iBAAiB1+D,GACtB,OAAO,EAAA0+D,GAAA,GAAiB19D,KAAKuzD,QAAQv0D,GACvC,CAEOiqE,yBAAyBjqE,GAC9B,MAAMyb,EAAOza,KAAKuzD,QAAQv0D,GACpBR,EAASic,EAAKyuD,oBAAqB,SAAqBzuD,EAAKyuD,yBAAsBjqE,EACzF,OAAGT,EACMA,EAAOpD,KAEP4D,EAAOS,SAAW,0BAA4B,yBAEzD,CAqCO0hE,wBAIJ,OACDniE,EAAM,aACNoiE,EAAY,SACZl/C,IAEA,OAAGk/C,EACEpiE,EAAOS,SACD,CAAC/C,EAAG,oBAERsD,KAAK+vB,YAAY/wB,GACX,CAACtC,EAAG,yBAEJ,CAACA,EAAG,oBAGPwlB,EACD,CACLxlB,EAAG,wBACH+d,KAAMza,KAAK4wB,iBAAiB5xB,GAC5Bm2C,YAAY,EAAAl2B,GAAA,GAAmBiD,IAG1B,CACLxlB,EAAG,kBACH+d,KAAMza,KAAK4wB,iBAAiB5xB,GAGlC,CAEO4xB,iBAAiB5xB,GACtB,IAAIA,EACF,MAAO,CAACtC,EAAG,kBAGb,IAAIsC,EAAOS,SAAU,CACnB,MAAMH,EAASN,EAAOwd,WACtB,OAAOxc,KAAKsc,gBAAgB+gB,aAAa/9B,E,CAG3C,MAAMH,EAASH,EAAOkxB,WACtB,OAAOlwB,KAAKgd,gBAAgBmsD,iBAAiBhqE,EAC/C,CAKO46C,mBACL,MAAO,CAACr9C,EAAG,gBACb,CAEO47D,uBAAuBt5D,GAC5B,MAAO,CACLtC,EAAG,kBACH+d,MAAM,EAAA2I,GAAA,GAAoBpkB,GAAUA,EAASgB,KAAK4wB,iBAAiB5xB,GAEvE,CAEOme,kBAAkBne,GACvB,IAAI5D,EAQJ,OANEA,EADC4E,KAAKP,OAAOT,GACN,OAASgB,KAAKgd,gBAAgBosD,kBAAkBpqE,EAAOkxB,YAGvD,QADMlwB,KAAKsc,gBAAgBsB,QAAQ5e,EAAOwd,YAC3B6O,OAAS,IAG1BjwB,CACT,CAEOiuE,cAAcrqE,GACnB,OAAGgB,KAAKi9B,YAAYj+B,GACX,YACCgB,KAAK2lB,UAAU3mB,GAChB,UACEgB,KAAKP,OAAOT,GAGdA,IAAWgB,KAAKhB,OAAS,QAAU,OAFnC,OAIX,CAEOsqE,oBAAoBtqE,GACzB,OAAOgB,KAAKqpE,cAAcrqE,IACxB,IAAK,UACH,OAAOgB,KAAKsc,gBAAgBqgB,UAAU39B,EAAOwd,WAAY,eAAiB,gBAAkB,gCAE9F,IAAK,YACL,IAAK,QACH,OAAOxc,KAAKsc,gBAAgBqgB,UAAU39B,EAAOwd,WAAY,eAAiB,aAAe,8BAE3F,QACE,MAAO,8BAEb,CAEOqqD,WAAW7nE,G,MAChB,OAAGA,EAAOS,aAG2B,QAA1B,EADIO,KAAKsc,gBAAgBsB,QAAQ5e,EAAOwd,YACpBvf,cAAM,eAAE2pE,WAEzC,EChRK,MAAM2C,WAAyB92D,EAAtC,c,oBACU,KAAA+2D,OAEJ,CAAC,CA4FP,CA1FSxsB,UAAUvkB,EAAc5iB,G,MAC7B,IAAI4iB,GAAqB,eAAZA,EAAM/7B,EAAoB,OAYvC,MAAM+sE,EAAWzpE,KAAKwpE,OAAO/wC,EAAM97B,IAMnC,GALG87B,EAAMuX,iBACP7C,GAAyB,iBAAkBs8B,EAAUhxC,GACrDz4B,KAAKiwC,kBAAkBt6B,YAAY8iB,EAAMuX,eAAgBn6B,IAG7C,QAAX,EAAA4iB,EAAM83B,aAAK,eAAE/zD,OAAQ,CAEtBi8B,EAAM83B,MAAM9vC,MAAK,CAACC,EAAGC,KACVD,EAA0BtN,OAAUsN,EAAqC6vC,MAAQmZ,IAAW,KAAQ/oD,EAA0BvN,OAAUuN,EAAqC4vC,MAAQmZ,IAAW,MAG3M,MAAMt2D,EAAOqlB,EAAM83B,MAAM93B,EAAM83B,MAAM/zD,OAAS,GAChC,yBAAX4W,EAAK1W,IACN0W,EAAKA,KAAOA,EAAKm9C,MAAMn9C,EAAKm9C,MAAM/zD,OAAS,G,CAI/C,OAAGitE,EACMxvE,OAAOC,OAAOuvE,EAAUhxC,GAG1Bz4B,KAAKwpE,OAAO/wC,EAAM97B,IAAM87B,CACjC,CAEOkxC,cAAcxqE,EAAgBspB,EAA2B,IAAKtM,EAAgB,IACnF,MAAMytD,EAAY5pE,KAAKgd,gBAAgB6d,aAAa17B,GACpD,OAAOa,KAAK2T,WAAWytB,mBAAmB,uBAAwB,CAChEhiC,QAASwqE,EACTz9C,OAAQ,EACRhQ,QACA6qC,OAAQv+B,GACP,CAAC4Y,aAAc,KAAKx8B,MAAMglE,IAC3B7pE,KAAKgd,gBAAgBgL,aAAa6hD,EAAanxD,OAC/C,MAAMoxD,EAAWD,EAAaL,OAAOtlE,KAAI,CAACu0B,EAAOp0B,KAC/CwlE,EAAaL,OAAOnlE,GAAOrE,KAAKg9C,UAAUvkB,EAAO,CAAC36B,KAAM,eAAgBkB,OAAQG,EAAOE,aAChFo5B,EAAM97B,MAIf,GAAa,MAAV8rB,GAAiBA,EAAO,CACzB,MAAMpkB,EAAMylE,EAASrvE,QAAQguB,IACjB,IAATpkB,GACDylE,EAASjgE,OAAOxF,EAAK,E,CAIzB,MAAO,CACL6V,MAAQ2vD,EAAgD3vD,OAAS4vD,EAASttE,OAC1EgtE,OAAQM,EACT,GAEL,CAsBOzW,SAAS0W,GACd,OAAO,EAAA3mD,GAAA,GAAS2mD,GAAWA,EAAqB/pE,KAAKwpE,OAAOO,EAC9D,ECrGK,MAAMC,WAAwBv3D,EAArC,c,oBACS,KAAAowD,MAA8B,CAAC,EAC/B,KAAA39D,QAAuC,CAAC,EACxC,KAAAgoD,eAA8C,CAAC,EAE9C,KAAA/sD,KAAM,EAAAqI,EAAA,IAAO,QAAS,WAuLhC,CArLYsU,QACR9c,KAAKge,kBAAkBC,2BAA2B,CAChDgsD,kBAAoB5vD,IAClBra,KAAKG,IAAI,qBAAsBka,GAE/B,IAAI2yC,EAAa3yC,EAAO2yC,MAAQhtD,KAAK6iE,MAAMxoD,EAAO6vD,SAClD,IAAIld,EACF,OAGF,IAAI9nD,EAAUmV,EAAOnV,QACrB,MAAMitD,EAAMnyD,KAAKkzD,SAASlG,EAAM9nD,GAChC8nD,EAAOmF,EAAInF,KACX9nD,EAAUitD,EAAIjtD,QAEdlF,KAAK+c,UAAUrW,cAAc,cAAe,CAACsmD,OAAM9nD,QAASA,GAAgB,GAGlF,CAEOguD,SAASlG,EAAY9nD,EAAsBrD,GAC7CA,GACD7B,KAAKumE,oBAAoB1kE,GAAS,GAGpC,MAAMlF,EAAKqwD,EAAKrwD,GAWhB,OAVGqD,KAAK6iE,MAAMlmE,IACZqwD,EAAO/yD,OAAOC,OAAO8F,KAAK6iE,MAAMlmE,GAAKqwD,GACrC9nD,EAAUlF,KAAKmqE,YAAYnd,EAAM9nD,KAEjClF,KAAK6iE,MAAMlmE,GAAMqwD,EAEjBA,EAAKod,cAAgB,GACrBllE,EAAUlF,KAAKmqE,YAAYnd,EAAM9nD,IAG5B,CAAC8nD,OAAM9nD,UAChB,CAEOilE,YAAYnd,EAAY9nD,G,MAkB7B,OAjBGlF,KAAKkF,QAAQ8nD,EAAKrwD,IACnBuI,EAAUjL,OAAOC,OAAO8F,KAAKkF,QAAQ8nD,EAAKrwD,IAAKuI,GAE/ClF,KAAKkF,QAAQ8nD,EAAKrwD,IAAMuI,EAGtBA,EAAQjI,OAAOujB,MACjBwsC,EAAKod,cAAc5tE,OAAS,GACT,QAAhB,EAAA0I,aAAO,EAAPA,EAASA,eAAO,eAAE1I,SACnB0I,EAAQA,QAAQrG,SAAQ,CAACwrE,EAAQhmE,K,OACf,QAAb,EAAAgmE,EAAOptE,cAAM,eAAEqtE,SAChBtd,EAAKod,cAAc9pE,KAAK+D,E,KAMzBa,CACT,CAEOkuD,QAAQH,GACb,MAAO,CACLjG,KAAMhtD,KAAK6iE,MAAM5P,GACjB/tD,QAASlF,KAAKkF,QAAQ+tD,GAE1B,CAEOsX,kBAAkBvd,EAAYwd,EAA+BC,EAAmBC,GAWrF,OAVGD,GACGC,IACFA,EAAmB,IAGrBD,GAAW,EAAA3yC,GAAA,GAAc2yC,EAAUC,IAEnCD,OAAWxrE,EAGN,CACLvC,EAAG,iBACHswD,OACA2d,gBAAiBH,EACjBC,WACAG,kBAAmBH,EAAWC,OAAmBzrE,EAErD,CAEOsnE,oBAAoB1kE,EAA0B/C,GACnD,MAAM,GAACnC,GAAOkF,EAAQmW,MAAwCg1C,KAC9D,IAAIhlD,EAAMhI,KAAKktD,eAAevwD,GAE9B,IAAImC,IAAQkJ,EACV,OAGEA,IACFA,EAAMhI,KAAKktD,eAAevwD,GAAM,IAAIwB,KAGtC,MAAMiJ,EAAMvF,EAAQ7C,OAAS,IAAM6C,EAAQ0kB,IACxCznB,EAAKkJ,EAAIlJ,IAAIsI,GACXY,EAAInE,OAAOuD,GAEZtI,GAAQkJ,EAAIoL,cACPpT,KAAK6iE,MAAMlmE,UACXqD,KAAKkF,QAAQvI,UACbqD,KAAKktD,eAAevwD,GAE/B,CAEOkuE,SAAShpE,EAA0BipE,GACxC,MAAM9d,EAAcnrD,EAAQmW,MAAwCg1C,KAE9DvxD,EAAwBqvE,EAAU5mE,KAAK/C,GACpC6rD,EAAK+d,QAAQ5pE,GAAO6pE,SAGvBl9D,EAAYjM,EAAQ0kB,IACpBvnB,EAAS6C,EAAQ7C,OACjBsyB,EAAYtxB,KAAK0a,gBAAgBkW,iBAAiB5xB,GAExD,OAAG6C,EAAQ5E,OAAOwpB,YACTzmB,KAAKuW,mBAAmBm3C,yBAAyB5/C,EAAW,YAAajM,IAC9E7B,KAAKG,IAAI,4BACFH,KAAK6qE,SAAShpE,EAA4BipE,MAI9C9qE,KAAK2T,WAAWC,UAAU,oBAAqB,CACpD6G,KAAM6W,EACN8sB,QAAQ,EAAAn/B,GAAA,GAAmBpd,EAAQ0kB,KACnC9qB,YACCoJ,MAAMgkB,IACP7oB,KAAKG,IAAI,oBAAqB0oB,GAC9B7oB,KAAKge,kBAAkBmV,qBAAqBtK,EAAQ,GAExD,CAEOoiD,WAAWppE,GAChB,MAAMyvB,EAAYtxB,KAAK0a,gBAAgBkW,iBAAiB/uB,EAAQ7C,QAEhE,OAAOgB,KAAK2T,WAAWC,UAAU,0BAA2B,CAC1D6G,KAAM6W,EACN8sB,QAAQ,EAAAn/B,GAAA,GAAmBpd,EAAQ0kB,OAClC1hB,MAAMgkB,IACP7oB,KAAKge,kBAAkBmV,qBAAqBtK,GAC5C7oB,KAAKG,IAAI,sBAAuB0oB,EAAQ,GAE5C,CAEOqiD,SAASrpE,EAA0BmpE,EAAqB7+C,EAAiBhQ,EAAQ,IACtF,OAAOnc,KAAK2T,WAAWC,UAAU,wBAAyB,CACxD6G,KAAMza,KAAK0a,gBAAgBkW,iBAAiB/uB,EAAQ7C,QACpDrC,IAAI,EAAAsiB,GAAA,GAAmBpd,EAAQ0kB,KAC/BykD,SACA7+C,SACAhQ,UACCtX,MAAMsmE,IACPnrE,KAAKG,IAAI,yBAA0BgrE,GAEnCnrE,KAAKgd,gBAAgBgL,aAAamjD,EAAUzyD,OAErCyyD,IAEX,CAEOC,SAASvpE,GACd,MAAMmrD,EAAcnrD,EAAQmW,MAAwCg1C,KAEpE,GAAGA,EAAK/vD,OAAOolC,OAAQ,OAAO1gC,QAAQM,UAEtC,MAAMopE,GAAU,EAAA18C,GAAA,GAAKq+B,GAErB,OADAqe,EAAQpuE,OAAOolC,QAAS,EACjBriC,KAAKuW,mBAAmBu3C,YAAYjsD,OAAS5C,EAAW,CAC7D+uD,SAAUhuD,KAAKuqE,kBAAkBc,KAChCxmE,MAAK,SAELwE,IACDrJ,KAAKG,IAAIxC,MAAM,kBAAmB0L,EAAI,GAE1C,EChMK,MAAMiiE,WAA0B74D,EAAvC,c,oBACU,KAAA84D,QAEH,CAAC,CAqER,CAnEYzuD,QACR9c,KAAKge,kBAAkBC,2BAA2B,CAChDutD,cAAgBnxD,IACd,MAAMjT,EAAMiT,EAAOjT,IAAI1K,EACvBsD,KAAKurE,QAAQnkE,GAAOiT,EAAOoxD,MAC3BzrE,KAAK+c,UAAUrW,cAAc,iBAAkB2T,EAAO,GAG5D,CAEOqxD,WAAWvE,EAAgCsE,GAChD,OAAOzrE,KAAK2T,WAAWC,UAAU,qBAAsB,CACrDxM,IAAK,CACH1K,EAAGyqE,GAELsE,UACC5mE,MAAM8mE,IACP3rE,KAAKgd,gBAAgBgL,aAAa2jD,EAAajzD,OAC/C1Y,KAAKsc,gBAAgB2L,aAAa0jD,EAAazjD,OAE/CloB,KAAKge,kBAAkBkX,mBAAmB,CACxCx4B,EAAG,gBACH0K,IAAK,CACH1K,EAAGwqE,GAAqBC,IAE1BsE,MAAOA,EAAMvnE,KAAK0nE,IAChB,MAAMC,EAAoB,CAAC,EAG3B,OAFA5xE,OAAOC,OAAO2xE,EAAMD,GACpBC,EAAKnvE,EAAIwqE,GAAqB2E,EAAKnvE,GAC5BmvE,CAAI,MAMRF,EAAaF,QAExB,CAEOK,WAAW3E,GAChB,MAAM4E,EAA8B7E,GAAqBC,GACnDsE,EAAQzrE,KAAKurE,QAAQQ,GAC3B,OAAGN,EACM9pE,QAAQM,QAAQwpE,GAGlBzrE,KAAKurE,QAAQQ,GAAc/rE,KAAK2T,WAAWC,UAAU,qBAAsB,CAChFxM,IAAK,CACH1K,EAAGyqE,KAEJtiE,MAAM8mE,IACP3rE,KAAKgd,gBAAgBgL,aAAa2jD,EAAajzD,OAC/C1Y,KAAKsc,gBAAgB2L,aAAa0jD,EAAazjD,OAIxCloB,KAAKurE,QAAQQ,GAAcJ,EAAaF,QAEnD,CAEOO,2BACL,OAAOhsE,KAAK2T,WAAWC,UAAU,mCACnC,CAEOq4D,yBAAyBplE,GAC9B,OAAO7G,KAAK2T,WAAWC,UAAU,mCAAoC,CAAC/M,YACxE,E,2SCxDF,MAAMqlE,GAAgB,KAEf,MAAMC,WAA0B15D,EAAvC,c,oBAEU,KAAA25D,UAA+C,CAAC,EAChD,KAAAC,UAAsC,CAAC,EACvC,KAAAC,eAA6C,CAAC,EA0mB9C,KAAAC,mBAAsBlyD,I,QAC5B,MAAMxC,EAAUwC,EAAmCjb,QAChDib,EAAmCjb,QAAQC,WAC5CW,KAAK0a,gBAAgB3b,UAAWsb,EAAuCgP,SACzE,GAAGrpB,KAAK0a,gBAAgB1b,SAAW6Y,GAA8B,8BAApBwC,EAAO7B,OAAO9b,EACzD,OAGF,MAAMorD,EAAYztC,EAA0C86B,WACtDjzB,EAAW4lC,GAAW,EAAAxsC,GAAA,GAAkBwsC,QAAY7oD,EACpDD,EAASgB,KAAK0a,gBAAgB3b,UAAUsb,GACxCjT,EAAMpH,KAAKwsE,cAAcxtE,EAAQkjB,GACjCogC,EAAgC,QAAzB,KAAGtiD,KAAKysE,eAAcrlE,UAAG,UAAHA,GAAS,GAC5C,IAAIg/D,EAAS9jB,EAAQ/jD,MAAMmuE,GAAMA,EAAEvtE,SAAW0Y,IAE9C,MAAM80D,EAAe,YACZvG,EAAOphE,QAEd,MAAMX,EAAMi+C,EAAQ7nD,QAAQ2rE,IAChB,IAAT/hE,GACDi+C,EAAQz4C,OAAOxF,EAAK,GAGtBrE,KAAK+c,UAAUrW,cAAc,eAAgB,CAAC1H,SAAQkjB,WAAUogC,YAE5DA,EAAQ9lD,eACHwD,KAAKysE,cAAcrlE,E,EAQ9B,QAJuBnI,KAApBmnE,aAAM,EAANA,EAAQphE,UACTD,aAAaqhE,EAAOphE,SAGC,4BAApBqV,EAAO7B,OAAO9b,EAAiC,CAChD,IAAI0pE,EACF,OAIF,YADAuG,G,CAIEvG,IACFA,EAAS,CACPjnE,OAAQ0Y,GAGVyqC,EAAQhiD,KAAK8lE,IAKfA,EAAO5tD,OAAS6B,EAAO7B,OAEvB,MAAM6d,EAAUr2B,KAAKgd,gBAAgBqZ,QAAQxe,GACzCwe,EAcFr2B,KAAKgd,gBAAgBqoC,gBAAgBxtC,GAZrB,yBAAbwC,EAAO3d,GACL2d,EAAO7a,SAAWQ,KAAKsc,gBAAgBia,QAAQlc,EAAO7a,WAAaQ,KAAKsc,gBAAgBqJ,UAAUtL,EAAO7a,UAC1GmC,QAAQM,QAAQjC,KAAK4sE,YAAYvyD,EAAO7a,UAAUqF,MAAK,UAC/B5F,IAAnBmnE,EAAOphE,SAAyBhF,KAAKgd,gBAAgBqZ,QAAQxe,IAC9D7X,KAAK+c,UAAUrW,cAAc,eAAgB,CAAC1H,SAAQkjB,WAAUogC,W,IAW1E8jB,EAAOphE,QAAU2J,EAAA,aAAeg+D,EAAc,KAC3Ct2C,GACDr2B,KAAK+c,UAAUrW,cAAc,eAAgB,CAAC1H,SAAQkjB,WAAUogC,W,EAI5D,KAAAuqB,oBAAuBxyD,IAC7B,MAAMrb,EAASgB,KAAK0a,gBAAgB3b,UAAUsb,EAAO9B,SACrD,GAAGvY,KAAK0a,gBAAgBjb,OAAOT,GAAS,CACtC,MAAMG,EAASH,EAAOkxB,WAChBykC,EAAW30D,KAAKosE,UAAUjtE,GAC7Bw1D,IACEt6C,EAAOyyD,QAASnY,EAAS13D,OAAO6vE,SAAU,SACjCnY,EAAS13D,OAAO6vE,SAG9B9sE,KAAK+c,UAAUrW,cAAc,mBAAoBvH,E,CAGnDa,KAAK+c,UAAUrW,cAAc,aAAc,CAAC1H,SAAQ8tE,QAASzyD,EAAOyyD,SAAS,CAMjF,CAzsBYhwD,QACR9c,KAAKge,kBAAkBC,2BAA2B,CAChD8uD,uBAAyB1yD,IACvB,MAAMg+B,EAAeh+B,EAAOg+B,aAC5B,GAAsB,qBAAnBA,EAAa37C,EAA0B,CACxC,MAAM4C,EAAS+4C,EAAa74C,QACtBihC,EAAWzgC,KAAKqsE,UAAU/sE,QAChBL,IAAbwhC,IACDA,EAAS4X,aAAeA,EACxBr4C,KAAK+c,UAAUrW,cAAc,mBAAoBpH,G,GAKvD0tE,yBAA2B3yD,IACzB,MAAMomB,EAAWzgC,KAAKqsE,UAAUhyD,EAAO7a,SACvC,QAAgBP,IAAbwhC,EAAwB,CACzB,MAAMwsC,EAAgBxsC,EAAS4X,aACzBA,EAAe40B,EAAc50B,cAAgB,GACnD,IAAI,IAAI3yC,EAAI,EAAGlJ,EAAS67C,EAAa77C,OAAQkJ,EAAIlJ,EAAQkJ,IACvD,GAAG2yC,EAAa3yC,GAAGtG,UAAYib,EAAOjb,QACpC,OAIJi5C,EAAa/3C,KAAK,CAChB5D,EAAG,kBACH0C,QAASib,EAAOjb,QAChBuZ,WAAY0B,EAAO1B,WACnB0K,MAAM,EAAAC,GAAA,IAAM,KAGd2pD,EAAcjzE,QAAUqgB,EAAOrgB,QAC/BgG,KAAK+c,UAAUrW,cAAc,mBAAoB2T,EAAO7a,Q,GAI5D0tE,4BAA8B7yD,IAC5B,MAAMomB,EAAWzgC,KAAKqsE,UAAUhyD,EAAO7a,SACvC,QAAgBP,IAAbwhC,EAAwB,CACzB,MAAMwsC,EAAgBxsC,EAAS4X,aACzBA,EAAe40B,EAAc50B,cAAgB,GACnD,IAAI,IAAI3yC,EAAI,EAAGlJ,EAAS67C,EAAa77C,OAAQkJ,EAAIlJ,EAAQkJ,IACvD,GAAG2yC,EAAa3yC,GAAGtG,UAAYib,EAAOjb,QAIpC,OAHAi5C,EAAaxuC,OAAOnE,EAAG,GACvBunE,EAAcjzE,QAAUqgB,EAAOrgB,aAC/BgG,KAAK+c,UAAUrW,cAAc,mBAAoB2T,EAAO7a,Q,GAOhE2tE,iBAAkBntE,KAAKusE,mBACvBa,qBAAsBptE,KAAKusE,mBAC3Bc,wBAAyBrtE,KAAKusE,mBAE9Be,kBAAmBttE,KAAK6sE,sBAG1B7sE,KAAK+c,UAAU1W,iBAAiB,eAAgB/G,I,QAC9C,MAAMiuE,EAAWvtE,KAAKqsE,UAAU/sE,GAC1Bqe,EAA8E3d,KAAKsc,gBAAgBsB,QAAQte,GACjH,IAAIiuE,IAAa5vD,EACf,OAGF,IAAI6vD,GAAU,IACTD,EAASzzC,SAAqC,QAA1B,EAACnc,EAAmB1gB,cAAM,eAAEwwE,eACnDD,GAAU,GAGZ,MAAM,MAAC/0C,GAAS9a,EAChB,GAAG8a,EAAO,CACR,MAAMi1C,EAA2B,mBAAZj1C,EAAM/7B,GAGzBgxE,OAF0BH,EAASI,YAAwC,eAA1BJ,EAASI,WAAWjxE,IAGnEgxE,GACAj1C,EAAMz7B,YAAgC,QAAnB,EAAAuwE,EAASI,kBAAU,eAAEhxE,OAG1C6wE,GAAU,E,CAIXA,GACDxtE,KAAK4tE,gBAAgBtuE,EAAOD,UAAS,G,IAIzCW,KAAK+c,UAAU1W,iBAAiB,kBAAmB/G,IACjDU,KAAK4tE,gBAAgBtuE,EAAOD,UAAS,GAAM,IAI7CW,KAAK+c,UAAU1W,iBAAiB,oBAAqB/G,IACnDU,KAAK+c,UAAUrW,cAAc,mBAAoBpH,EAAOD,UAAS,GAAM,IAIzEW,KAAK+c,UAAU1W,iBAAiB,oBAAqBlH,IACnDa,KAAK+c,UAAUrW,cAAc,mBAAoBvH,EAAOE,UAAS,GAAO,IAG1EW,KAAK+c,UAAU1W,iBAAiB,2BAA4B/G,IAC1DU,KAAK6tE,8BAA8BvuE,EAAO,IAG5CU,KAAKysE,cAAgB,CAAC,CACxB,CAsBO51D,WAAWla,EAAYq3B,GAC5B,OAAGh0B,KAAKosE,UAAUzvE,KAAQq3B,GAAY1lB,KAAK1J,MAAQ5E,KAAKssE,eAAe3vE,EAAG0C,YACjEW,KAAKosE,UAAUzvE,GAGjBqD,KAAK2T,WAAWktB,uBAAuB,CAC5Ch4B,OAAQ,oBACRmL,OAAQ,CACNrX,GAAIqD,KAAKgd,gBAAgB6d,aAAal+B,IAExCmkC,cAAgBgtC,IACd9tE,KAAKsc,gBAAgB2L,aAAa6lD,EAAc5lD,OAAO,GACvDloB,KAAKgd,gBAAgBgL,aAAa8lD,EAAcp1D,OAEhD,MAAMi8C,EAAWmZ,EAAcC,UACzB/uE,EAASrC,EAAG0C,UAAS,GACxBs1D,EAASqZ,gBACVrZ,EAASqZ,cAAgBhuE,KAAK+8C,iBAAiBC,UAAU2X,EAASqZ,cAAe,CAAClwE,KAAM,eAAgBkB,YAG1G,MAAMivE,EAAUtZ,EAASuZ,SACzB,GAAGD,EAAS,CACV,MAAME,EAAqC,CAACrwE,KAAM,WAAYqB,OAAQxC,GACtEsxE,EAAQG,qBAAuBpuE,KAAK23C,eAAe7H,QAAQm+B,EAAQG,qBAAsBD,GACzFF,EAAQI,kBAAoBruE,KAAK+8C,iBAAiBC,UAAUixB,EAAQI,kBAAmBF,E,CAkBzF,OAfAnuE,KAAK+hB,wBAAwB4I,iBAAiB,CAC5C3rB,SACA6H,SAAU8tD,EAAS/pC,kBAGrB5qB,KAAKosE,UAAUzvE,GAAMg4D,EACrB30D,KAAKssE,eAAettE,GAAUsP,KAAK1J,MAAQsnE,GAQ3ClsE,KAAK+c,UAAUrW,cAAc,mBAAoB/J,GAC1Cg4D,CAAQ,GAGrB,CAEO2Z,mBAAmBtvE,EAAgBg1B,GACxC,OAAGh0B,KAAK0a,gBAAgBkM,UAAU5nB,GAAgBgB,KAAK4sE,YAAY5tE,EAAOwd,WAAYwX,GAC1Eh0B,KAAK6W,WAAW7X,EAAOkxB,WAAY8D,EACjD,CAEO0M,kBAAkBphC,GACvB,OAAOU,KAAKqsE,UAAU/sE,EACxB,CAEOs1D,kBAAkBz1D,GACvB,OAAOa,KAAKosE,UAAUjtE,EACxB,CAEOovE,yBAAyBvvE,GAC9B,OAAOA,EAAOS,SAAWO,KAAK40D,kBAAkB51D,EAAOkxB,YAAclwB,KAAK0gC,kBAAkB1hC,EAAOwd,WACrG,CAEagyD,aAAaxvE,G,0CACxB,MAAMyvE,QAAgBzuE,KAAKsuE,mBAAmBtvE,GAC9C,OAAOyvE,EAAQ/xE,GACb,IAAK,WACH,OAAO+xE,EAAQT,cACjB,IAAK,cACL,IAAK,WACH,OAAOS,EAAQd,WAErB,G,CA0BOf,YAAYjwE,EAAYq3B,GAC7B,GAAGh0B,KAAKsc,gBAAgBqJ,UAAUhpB,GAChC,OAAOqD,KAAKyiC,eAAe9lC,EAAIq3B,GAGjC,MAAMh1B,EAASrC,EAAG0C,UAAS,GACrBkuE,EAAWvtE,KAAKqsE,UAAU1vE,GAChC,GAAG4wE,IAAav5C,GAAY1lB,KAAK1J,MAAQ5E,KAAKssE,eAAettE,GAAS,CACpE,MAAM2e,EAAO3d,KAAKsc,gBAAgBsB,QAAQjhB,GAC1C,GACEghB,EAAK1gB,OAAOuI,MACZmY,EAAK1gB,OAAO0sB,aACZhM,EAAK3jB,UAAauzE,EAASl1B,aAAmDr+C,QAE9E,OAAOuzE,C,CAIX,OAAOvtE,KAAK2T,WAAWktB,uBAAuB,CAC5Ch4B,OAAQ,uBACRmL,OAAQ,CACNxU,QAAS7C,GAEXmkC,cAAgB1+B,IACdpC,KAAKsc,gBAAgB2L,aAAa7lB,EAAO8lB,OAAO,GAChDloB,KAAKgd,gBAAgBgL,aAAa5lB,EAAOsW,OACzC,MAAM+nB,EAAWr+B,EAAOssE,UAmBxB,OAlBGjuC,GAAYA,EAASktC,YAAcltC,EAASktC,WAAWhxE,KACxD8jC,EAASktC,WAAa3tE,KAAK+8C,iBAAiBC,UAAUvc,EAASktC,WAAY,CAAC7vE,KAAM,eAAgBkB,YAGjGyhC,EAAS3G,MACV95B,KAAK67D,qBAAqBrjB,cAAc/X,EAAS3G,KAAMn9B,GAIzDqD,KAAK+hB,wBAAwB4I,iBAAiB,CAC5C3rB,SACA6H,SAAU45B,EAAS7V,kBAGrB5qB,KAAKqsE,UAAU1vE,GAAM8jC,EACrBzgC,KAAKssE,eAAettE,GAAUsP,KAAK1J,MAAQsnE,GAC3ClsE,KAAK+c,UAAUrW,cAAc,mBAAoB/J,GAE1C8jC,CAAQ,GAGrB,CAEakuC,kBAAkBhyE,EAAYo6B,G,0CACzC,MAAM0J,QAAiBzgC,KAAK4sE,YAAYjwE,GACxC,OAAIo6B,GACF0J,EAASmuC,iBACqB,sBAA9BnuC,EAASmuC,gBAAgBlyE,EAClB+jC,EAASmuC,gBAAgBC,KAG3B7uE,KAAK2T,WAAWC,UAAU,4BAA6B,CAC5D6G,KAAMza,KAAK0a,gBAAgBkW,iBAAiBj0B,EAAG0C,UAAS,MACvDwF,MAAMiqE,SACmB7vE,IAAvBe,KAAKqsE,UAAU1vE,KAChBqD,KAAKqsE,UAAU1vE,GAAIiyE,gBAAkBE,GAG/BA,EAAyDD,OAErE,G,CAEOE,uBAAuBpyE,EAAYE,EAAoC,CAACH,EAAG,6BAA8Byf,EAAQ,IAAKgQ,EAAS,GACpI,GAAgB,8BAAbtvB,EAAOH,EAAmC,CAC3C,MAAMihB,EAAO3d,KAAKsc,gBAAgBsB,QAAQjhB,GAC1C,IAAGghB,aAAI,EAAJA,EAAM1gB,SAEN0gB,EAAsB1gB,OAAO+xE,YAC1BrxD,EAAsB1gB,OAAOyiE,UAC7B/hD,EAAsB23C,aAE1B,OAAO3zD,QAAQC,Q,CAInB,OAAO5B,KAAK2T,WAAWytB,mBAAmB,2BAA4B,CACpE/kB,QAASrc,KAAKsc,gBAAgBC,gBAAgB5f,GAC9CE,SACAsvB,SACAhQ,QACA8kB,KAAM,KACL,CAACI,aAAc,KAAKx8B,MAAMzC,IAC3BpC,KAAKgd,gBAAgBgL,aAAc5lB,EAAmEsW,OAC/FtW,IA2BX,CAEO6sE,sBAAsBtyE,EAAYqC,GACvC,OAAOgB,KAAK2T,WAAWge,gBAAgB,0BAA2B,CAChEtV,QAASrc,KAAKsc,gBAAgBC,gBAAgB5f,GAC9C4iC,YAAav/B,KAAK0a,gBAAgBkW,iBAAiB5xB,KAClD6F,MAAMqqE,IACPlvE,KAAKgd,gBAAgBgL,aAAaknD,EAAmBx2D,OAC9Cw2D,EAAmB3vC,cAE9B,CAEOkD,eAAe9lC,EAAYq3B,GAChC,MAAMh1B,EAASrC,EAAG0C,UAAS,GAC3B,YAA0BJ,IAAvBe,KAAKqsE,UAAU1vE,KAAsBq3B,GAAY1lB,KAAK1J,MAAQ5E,KAAKssE,eAAettE,GAC5EgB,KAAKqsE,UAAU1vE,GAGjBqD,KAAK2T,WAAWktB,uBAAuB,CAC5Ch4B,OAAQ,0BACRmL,OAAQ,CACNqI,QAASrc,KAAKsc,gBAAgBC,gBAAgB5f,IAEhDmkC,cAAgB1+B,IACdpC,KAAKsc,gBAAgB2L,aAAa7lB,EAAO8lB,OAAO,GAChDloB,KAAKgd,gBAAgBgL,aAAa5lB,EAAOsW,OACzC,MAAMy2D,EAAc/sE,EAAOssE,UAmB3B,OAlBGS,GAAeA,EAAYxB,WAAWhxE,KACvCwyE,EAAYxB,WAAa3tE,KAAK+8C,iBAAiBC,UAAUmyB,EAAYxB,WAAY,CAAC7vE,KAAM,eAAgBkB,YAIvGmwE,EAAYr1C,MACb95B,KAAK67D,qBAAqBrjB,cAAc22B,EAAYr1C,KAAMn9B,GAG5DqD,KAAK+hB,wBAAwB4I,iBAAiB,CAC5C3rB,SACA6H,SAAUsoE,EAAYvkD,kBAGxB5qB,KAAKqsE,UAAU1vE,GAAMwyE,EACrBnvE,KAAKssE,eAAettE,GAAUsP,KAAK1J,MAAQsnE,GAC3ClsE,KAAK+c,UAAUrW,cAAc,mBAAoB/J,GAE1CwyE,CAAW,EAEpBC,aAAezxE,IACb,GACO,oBADAA,EAAMG,KACX,CACE,MAAMue,EAAUrc,KAAKsc,gBAAgBsB,QAAQjhB,GAC7CqD,KAAKge,kBAAkBmV,qBAAqB,CAC1Cz2B,EAAG,UACHmsB,QAAS,CAAC,CACRnsB,EAAG,gBACH6C,WAAY5C,IAEdurB,MAAO,CAAe,qBAAd7L,EAAQ3f,EAA2B2f,EAAU,CACnD3f,EAAG,mBACHC,KACAw9B,YAAa9d,EAAQ8d,YACrB9O,MAAOhP,EAAQgP,MACfpuB,OAAQof,EAAQpf,SAElByb,MAAO,IAEJ,CAGT,MAAM/a,CAAK,GAGjB,CAEO0xE,YAAY/vE,EAAgB2a,EAAeiI,GAChD,MAAMotD,EAAkBlyB,IACmB,MAApBnjC,EAAMre,OAAO,KACjBqe,EAAQA,EAAMzS,MAAM,IAKrC,MAAMrG,EAAQ,IAAI,KAAoB,CACpC3F,YAAY,IAGR+zE,EAAiC,IAAIh+D,IAC3C6rC,EAASv+C,SAAS4b,IAChBtZ,EAAMic,YAAY3C,EAAK9d,GAAIqD,KAAKgd,gBAAgBosD,kBAAkB3uD,EAAK9d,KACvE4yE,EAAUvnE,IAAIyS,EAAK9d,GAAI8d,EAAK8iC,OAAO,IAGrC,MAAM3lC,EAAU9W,MAAMC,KAAKI,EAAM5G,OAAO0f,IAExC,OADArC,EAAQ6I,MAAK,CAACC,EAAGC,IAAM4uD,EAAUhrE,IAAIoc,GAAK4uD,EAAUhrE,IAAImc,KACjD9I,CAAO,EAGhB,IAAIlO,EAiBJ,OAfEA,EADC1J,KAAKsc,gBAAgBqJ,UAAUrmB,GACtBU,KAAK+uE,uBAAuBzvE,EAAQ,CAC5C5C,EAAG,8BACHwwC,EAAGjzB,EACHk7B,YAAY,EAAAl2B,GAAA,GAAmBiD,IAC9B,GAAI,GAAGrd,MAAM2qE,GACPA,EAAGn3B,aAAan0C,KAAK21B,IAAM,EAAA2F,GAAA,GAAqB3F,OAEjDv6B,EACEqC,QAAQM,QAAQjC,KAAK4sE,YAAYttE,IAASuF,MAAM47B,GAC/CA,EAA+B4X,aAAmDA,aAAan0C,KAAK21B,GAAMA,EAAEz6B,QAAQC,eAGrHsC,QAAQM,QAAQ,IAGrBN,QAAQyQ,IAAI,CAEjBpS,KAAKgd,gBAAgBmgC,YAAY,eAAenvC,OAAM,IAAM,KAC5DtE,IACC7E,MAAMK,IACP,MAAMksB,EAAQlsB,EAAQ,GAAGlB,OAAOkB,EAAQ,GAAGhB,KAAKlF,IAAW,CAAErC,GAAIqC,EAAQu+C,OAAQ,OAEjF,OAAO+xB,EAAel+C,EAAM,GAEhC,CAEQy8C,8BAA8BlxE,GACpCqD,KAAK2T,WAAW4nB,WAAW,4BAA6BvnB,GAAYA,EAAOqI,QAAsC9c,aAAe5C,IAChIqD,KAAK4tE,gBAAgBjxE,EAAG0C,UAAS,GACnC,CAEQuuE,gBAAgB5uE,GACtB,GAAGA,EAAOS,SAAU,CAClB,MAAMN,EAASH,EAAOkxB,kBACflwB,KAAKosE,UAAUjtE,GACtBa,KAAK+c,UAAUrW,cAAc,mBAAoBvH,E,KAC5C,CACL,MAAMG,EAASN,EAAOwd,kBACfxc,KAAKqsE,UAAU/sE,GACtBU,KAAK+c,UAAUrW,cAAc,mBAAoBpH,E,CAMrD,CAEOmwE,cAAchwB,EAAqBC,EAAoBrgB,GAC5D,OAAOr/B,KAAK2T,WAAWC,UAAU,wBAAyB,CACxD6rC,aACAC,YACArgB,UACCx6B,MAAMsQ,IAGP,GAFAnV,KAAKgd,gBAAgB0yD,YAAYv6D,QAEpBlW,IAAVogC,EAAqB,CACtB,MAAMrgC,EAASmW,EAAKxY,GAAG0C,WACjBs1D,EAAW30D,KAAKosE,UAAUj3D,EAAKxY,IAClCg4D,IACDA,EAASt1B,MAAQA,GAGnBr/B,KAAK+c,UAAUrW,cAAc,gBAAiB1H,E,CAGhD,OAAOgB,KAAK6W,WAAW1B,EAAKxY,IAAI,EAAK,GAEzC,CAEOgzE,mBAAmB3wC,GACxB,OAAOh/B,KAAK2T,WAAWC,UAAU,4BAA6B,CAC5DsrB,KAAMF,IACLn6B,MAAM+qE,IAEP,MAAMn3C,EAAQm3C,EAAan3C,MAC3B,IAAIm3C,EAAal3D,MAAMlc,OAAQ,CAC7B,MAAMqzE,EAAgBp3C,EAAM83B,MAAMhyD,MAAM6U,GAAoB,sBAAXA,EAAK1W,IACtDkzE,EAAal3D,MAAMpY,KAAK,OAAD,wBAClBN,KAAKgd,gBAAgBC,WAAS,CACjCwb,MAAO,CACL/7B,EAAG,mBACHk8B,MAAOH,EAAMG,MACb57B,SAAUy7B,EAAM97B,GAChBmzE,eAAgBD,aAAa,EAAbA,EAAe/iE,MAC/B7P,OAAQ,CAAC,K,CAMf+C,KAAKgd,gBAAgBgL,aAAa4nD,EAAal3D,OAE/C,MAAMxS,EAAOlG,KAAK0a,gBAAgB1b,OAClCgB,KAAK+8C,iBAAiBC,UAAU4yB,EAAan3C,MAAO,CAClD36B,KAAM,eACNkB,OAAQkH,IAGV,MAAM/G,EAAS+G,EAAKgqB,WAQpBlwB,KAAKge,kBAAkBkX,mBAAmB,CACxCx4B,EAAG,aACH0C,QAASD,GACT,GAEN,CAEO4wE,aAAajG,GAClB,OAAO9pE,KAAK2T,WAAWge,gBAAgB,sBAAuB,CAC5Dh1B,GAAImtE,EAAS5lE,KAAK6lE,GAETnuB,GADO57C,KAAK+8C,iBAAiBsW,SAAS0W,QAG9CllE,MAAMmrE,IAAD,GAGV,CAEQC,gCAAgC1wC,GACtC,MAAMpqB,EAAOnV,KAAKgd,gBAAgB6gC,QAAQte,EAAYngC,SACtD,SAAU+V,IAAQA,EAAK1O,QAA4B,qBAAlB0O,EAAK1O,OAAO/J,EAC/C,CAEQwzE,iCAAiC73B,GACvC,OAAOA,EAAalrB,QAAO,CAACC,EAAKmS,IACxBnS,IAAOptB,KAAKiwE,gCAAgC1wC,IAClD,EACL,CAEa4wC,WAAWxzE,G,gDAEtB,GAAGqD,KAAKsc,gBAAgByT,YAAYpzB,GAClC,OAFgB,EAKlB,MAAMyzE,QAAiBpwE,KAAK4sE,YAAYjwE,GACxC,GAAGqD,KAAKsc,gBAAgB2gB,YAAYtgC,GAAK,CACvC,GAAIyzE,EAAkCt0C,oBAAsB,IAAK,CAC/D,MAAMu0C,QAA4BrwE,KAAK+uE,uBAAuBpyE,EAAI,CAACD,EAAG,6BAA8B,KACpG,OAAOsD,KAAKkwE,iCAAiCG,EAAoBh4B,a,CAGnE,MAAM1gB,QAAY33B,KAAK2T,WAAWytB,mBAAmB,sBAAuB,CAC1E3mB,KAAMza,KAAKsc,gBAAgBghB,oBAAoB3gC,IAC9C,CAAC0kC,aAAc,KAGlB,OAD2B,QAAX,EAAA1J,EAAI24C,eAAO,QAhBX,C,CAoBlB,MAAMrD,EAAiBmD,EAA+B/3B,aACtD,OAAG40B,aAAa,EAAbA,EAAe50B,cACTr4C,KAAKkwE,iCAAiCjD,EAAc50B,cAtB3C,C,IA4BZm0B,cAAcxtE,EAAgBkjB,GACpC,OAAOljB,GAAUkjB,EAAW,IAAIA,IAAa,GAC/C,CAiGOquD,eAAevxE,EAAgBkjB,GACpC,OAAOliB,KAAKysE,cAAczsE,KAAKwsE,cAAcxtE,EAAQkjB,GACvD,ECluBa,SAASsuD,GACtBr6D,EACA1R,GAEA,OAAG0R,EAAO+O,MAAM9gB,GAAUA,aAAiBzC,UAClCA,QAAQyQ,IAAI+D,GAAQtR,KAAKJ,GAEzBA,EAAS0R,EAEpB,C,2SCEA,MAAMs6D,GAAgB,CACpB,cACA,mBACA,mBACA,qBACA,mBACA,mBACA,eAGIC,GAAsC,CAC1C5yE,KAAM,aAGD,MAAM6yE,WAA4Bl+D,EAK7BqK,QACR9c,KAAK+c,UAAU1W,iBAAiB,mBAAmB,KACjDrG,KAAK4wE,wBAAqB3xE,EAC1Be,KAAK6wE,uBAAuB,IAG9B7wE,KAAK8wE,qBAAuB,IAAIv/D,IAChCvR,KAAK+wE,iBAAmB,IAAIx/D,IAE5BvR,KAAK+c,UAAU1W,iBAAiB,aAAa,KAC3CtE,YAAW,KACTJ,QAAQM,QAAQjC,KAAK6wE,yBAAyBhsE,MAAW+rE,GAAuB,mCAC9E,IAAI,MAAMI,KAAqBJ,QACvBjvE,QAAQyQ,IAAI,CAChB4+D,EAAkBC,kBAAoBjxE,KAAK84B,eAAeuZ,cAAc,CAACr6B,MAAOg5D,EAAkBC,mBAClGD,EAAkBE,aAAelxE,KAAK84B,eAAeuZ,cAAc,CAACr6B,MAAOg5D,EAAkBE,cAC7FF,EAAkBG,kBAAoBnxE,KAAK84B,eAAeuZ,cAAc,CAACr6B,MAAOg5D,EAAkBG,mBAClGH,EAAkBI,aAAepxE,KAAK84B,eAAeuZ,cAAc,CAACr6B,MAAOg5D,EAAkBI,sBAGzF,EAAAtnE,EAAA,GAAM,IAEhB,KAAE,GACD,KAAM,GAEb,CAEO+mE,wBACL,OAAG7wE,KAAK4wE,mBAA2B5wE,KAAK4wE,mBACjC5wE,KAAK2T,WAAWktB,uBAAuB,CAC5Ch4B,OAAQ,iCACRi4B,cAAgBuwC,KACd,EAAAtpD,GAAA,GAAkEspD,GAElE,MAAMT,EAAqB5wE,KAAK4wE,mBAAqBS,EAA2B7wC,UAChF,IAAI,MAAMloB,KAAYs4D,EACpB,IAAI,MAAMxpE,KAAOqpE,GACXn4D,EAASlR,KAIbkR,EAASlR,GAAOpH,KAAK23C,eAAe7H,QAAQx3B,EAASlR,GAAMspE,KAI/D,OAAOE,CAAkB,EAE3B58D,OAAQ,CACNitB,KAAM,IAGZ,CAEOqwC,8BACL,OAAO,EAAAtkD,EAAA,GAAYhtB,KAAK6wE,yBAA0BD,GACzCA,EAAmB/zE,QAAQm0E,IAAuBA,EAAkB/zE,OAAOs0E,YAEtF,CAEOC,6BAA6BxyE,GAClC,MAAMyyE,EAA2BzxE,KAAKsxE,8BACtC,OAAGtyE,EAAOS,SACDO,KAAK0xE,qBAAqBD,GAI5BjB,GAAe,CAACiB,EADNzxE,KAAK4W,kBAAkBg2D,YAAY5tE,EAAOwd,YACAxc,KAAK2xE,qBAAqB,EAAEF,EAA0BhxC,EAAUmxC,M,MACzH,MAAMC,EAAqD,QAA5B,EAAApxC,EAASE,2BAAmB,QAAI,CAACjkC,EAAG,qBAEnE,IAAIo1E,EAAsD,GAS1D,MARgC,qBAA7BD,EAAuBn1E,EACxBo1E,EAAiCL,EACI,sBAA7BI,EAAuBn1E,IAC/Bo1E,EAAiCD,EAAuBrxC,UAAUt8B,KAAKoU,GAC9Dm5D,EAAyBlzE,MAAMyyE,GAAsBA,EAAkB14D,WAAcA,EAAoCjb,aAC/HR,OAAOC,UAGLkD,KAAK+xE,0BAA0BD,EAAgCF,EAAc,GAExF,CAEQG,0BAA0BnB,EAAyCgB,GACzE,GAAGA,GAAqC,kBAApBA,EAAcl1E,GAA6C,sBAApBk1E,EAAcl1E,EAA2B,OAAOk0E,EAC3G,MAAMvzE,EAAYu0E,EAAyCv0E,UAAau0E,EAAoCt5D,SACtG04D,GAAoB,EAAAxiD,GAAA,GAAcoiD,GAAqBI,GAAsBA,EAAkB14D,WAAajb,IAKlH,OAJG2zE,GACDJ,EAAmB9qD,QAAQkrD,GAGtBJ,CACT,CAEQc,qBACNd,EACAgB,EAAqE5xE,KAAK2xE,oBAE1E,OAAOnB,GAAe,CACpBI,EACAgB,IACC,EAAEhB,EAAoBgB,KAChB5xE,KAAK+xE,0BAA0BnB,EAAoBgB,IAE9D,CAEOI,+BAA+BnwE,G,MACpC,IAAIA,EAAS,MAAO,GACpB,MAAM7C,GAA0B,QAAhB,EAAA6C,EAAQ+xB,gBAAQ,eAAEkhC,eAAgB90D,KAAK0a,gBAAgBuiB,YAAYp7B,EAAQ7C,SAAW6C,EAAQkW,WAAclW,EAAQ7C,OACpI,OAAOgB,KAAKwxE,6BAA6BxyE,EAC3C,CAEOizE,iBAAiB35D,GACtB,QAAItY,KAAK4wE,sBACA5wE,KAAK4wE,mBAAmBryE,MAAMyyE,GAAsBA,EAAkB14D,WAAaA,GAC9F,CAEOq5D,mBACL,OAAOnB,GAAe,CACpBxwE,KAAK2T,WAAW+c,YAChB1wB,KAAK6wE,0BACJ,EAAEta,EAAQqa,MACX,MAAMt4D,EAAWi+C,EAAO2b,kBACxB,MAAmB,mBAAhB55D,aAAQ,EAARA,EAAU5b,GACJk0E,EAAmBryE,MAAMyyE,GAAsBA,EAAkB14D,WAAaA,EAASjb,WAGzFib,CAAwC,GAEnD,CAEO65D,kBAAkB75D,GACvB,OAAOtY,KAAK4wE,mBAAmBryE,MAAMyyE,GAAsBA,EAAkB14D,WAAaA,GAC5F,CAEO85D,YAAY95D,GACjB,OAAO,EAAA0U,EAAA,GAAYhtB,KAAK6wE,yBAAyB,IACxC7wE,KAAKmyE,kBAAkB75D,IAElC,CAEO+5D,qBAAqBrzE,EAAgB+oD,GAC1C,OAAO/nD,KAAK2T,WAAWktB,uBAAuB,CAC5Ch4B,OAAQ,gCACRmL,OAAQ,CACNrX,GAAIorD,EAAK7jD,KAAKqiB,IAAQ,EAAAtH,GAAA,GAAmBsH,KACzC9L,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,IAE9C8hC,cAAgBjY,IACd7oB,KAAKge,kBAAkBmV,qBAAqBtK,EAAQ,GAM1D,CAEOy6C,wBAAwBtkE,EAAgBunB,EAAapK,EAAe7D,EAAqB6T,GAC9F,OAAOnsB,KAAK2T,WAAWktB,uBAAuB,CAC5Ch4B,OAAQ,mCACRmL,OAAQ,CACNyG,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5CrC,IAAI,EAAAsiB,GAAA,GAAmBsH,GACvBpK,QACA7D,WACA6T,UAEF2U,cAAgByiC,IACdvjE,KAAKgd,gBAAgBgL,aAAau7C,EAAqB7qD,OAChD6qD,IAGb,CAEO+O,mBAAmBh6D,GACxB,OAAOtY,KAAK2T,WAAWC,UAAU,8BAA+B,CAAC0E,aAAWzT,MAAWT,GAAU,mCAC/F,GAAGA,EAAO,CACR,MAAMy/D,QAAkB7jE,KAAK2T,WAAW+c,YACrCmzC,IACDA,EAAUqO,kBAAoB55D,GAKhCtY,KAAK+c,UAAUrW,cAAc,iBAAkB4R,E,CAGjD,OAAOlU,CACT,KACF,CAEamuE,aAAa1wE,EAA0ByW,EAAyCxQ,G,kDACzE,sBAAfwQ,EAAS5b,IACV4b,EAAW,CACT5b,EAAG,gBACHW,SAAUib,EAASA,WAIvB,MAAM6D,QAAcnc,KAAK2T,WAAWyI,SAAS,aAEvCo2D,EAAqB3wE,EAAQ7C,OAAS,IAAM6C,EAAQ0kB,IAE1D,GADwBvmB,KAAK+wE,iBAAiBxsE,IAAIiuE,GAEhD,OAEAxyE,KAAK+wE,iBAAiB/oE,IAAIwqE,EAAoBlkE,KAAK1J,OACnD7C,YAAW,KACT/B,KAAK+wE,iBAAiBltE,OAAO2uE,EAAmB,GAC/C,KAGL,MAAM,OAACxzE,EAAM,IAAEunB,GAAO1kB,EAChBo6D,EAAWj8D,KAAK0a,gBAAgB1b,OAEhCyzE,EAAsBjoB,MACxBA,EAActwC,aACTswC,EAAcI,cAElB,EAAAD,GAAA,GAAeryC,EAAsBkyC,EAAclyC,YACpDA,OAAWrZ,GAGTurD,EAActwC,QAChB,EAAA9I,EAAA,GAAiBovB,EAAUt7B,QAASslD,GAKnChqB,EAAUnoB,mBACX,EAAAmW,GAAA,GAAcgS,EAAUnoB,kBAAmButC,IAAmB,EAAA+E,GAAA,GAAe/E,EAAettC,SAAUkyC,EAAclyC,WAAatY,KAAK0a,gBAAgB3b,UAAU6mD,EAAertC,WAAa0jD,IAG1Lz7B,EAAUt7B,QAAQ1I,SACpBgkC,OAAYvhC,E,EAIVyzE,GAAsC,QAAzB,EAAiB,QAAjB,EAAA7wE,EAAQ2+B,iBAAS,eAAEvjC,cAAM,eAAE01E,gBAAiB3yE,KAAK0a,gBAAgBqV,YAAYluB,EAAQ7C,SAAW6C,EAAQ7C,OAAOS,SAC9HoC,EAAQ2+B,YACV3+B,EAAQ2+B,UAAY,CAClB9jC,EAAG,mBACHwI,QAAS,GACTmT,iBAAkBq6D,EAAa,QAAKzzE,EACpChC,OAAQ,CACN01E,aAAcD,QAAczzE,KAKlC,IAAIuhC,EAAY14B,EAAYjG,EAAQ2+B,WAAY,EAAA7R,GAAA,GAAK9sB,EAAQ2+B,WAC7D,MAAMoyC,EAAkBpyC,EAAUt7B,QAAQrI,QAAQ2tD,QAAiDvrD,IAA/BurD,EAAcI,eAClFgoB,EAAgBnyD,MAAK,CAACC,EAAGC,IAAMA,EAAEiqC,aAAelqC,EAAEkqC,eAClD,MAAMioB,EAAkC,GAClCC,EAAoBF,EAAgBjxD,WAAW6oC,IAAkB,EAAAG,GAAA,GAAeH,EAAclyC,SAAUA,MACpF,IAAvBw6D,GAA0BD,EAAevyE,QAAQsyE,EAAgB/oE,OAAOipE,EAAmB,IAC9FD,EAAevyE,QAAQsyE,EAAgB/oE,OAAOsS,KAAiC,IAAvB22D,KACxDD,EAAeh0E,SAAS2rD,IACtBooB,EAAgB/zE,SAASk0E,IACpBA,EAAoBnoB,aAAeJ,EAAcI,gBAChDmoB,EAAoBnoB,Y,IAI1B6nB,EAAmBjoB,EAAc,IAGnC,MAAMwoB,EAAwBJ,EAAgBp2E,OAK9C,GAJAo2E,EAAgB/zE,SAAQ,CAAC2rD,EAAenmD,KACtCmmD,EAAcI,aAAeooB,EAAwB,EAAI3uE,CAAG,IAG3DiU,EAAU,CACPkoB,IACFA,EAAsC,CACpC9jC,EAAG,mBACHwI,QAAS,GACTjI,OAAQ,CAAC,GAGRy1E,IACDlyC,EAAUvjC,OAAO01E,cAAe,IAIpC,IAAIM,EAAmBzyC,EAAUt7B,QAAQyc,WAAW6oC,IAAkB,EAAAG,GAAA,GAAeH,EAAclyC,SAAUA,KACzGkyC,GAAsC,IAAtByoB,GAA2BzyC,EAAUt7B,QAAQ+tE,GAmBjE,GAlBIzoB,IACFA,EAAgB,CACd9tD,EAAG,gBACHwd,MAAO,EACP5B,YAGF26D,EAAmBzyC,EAAUt7B,QAAQ5E,KAAKkqD,GAAiB,KAG3DA,EAActwC,MAChBswC,EAAcI,aAAegoB,EAAgBp2E,OAASo2E,EAAgB,GAAGhoB,aAAe,EAAI,EAC5FgoB,EAAgB9sD,QAAQ0kC,IAEpBhqB,EAAUnoB,kBAAoBq6D,IAChClyC,EAAUnoB,iBAAmB,IAG5BmoB,EAAUnoB,iBAAkB,CAC7B,MAAM2tC,EAAoC,CACxCtpD,EAAG,sBACH4b,WACAC,QAASvY,KAAK0a,gBAAgB4O,cAAc2yC,IAG1Cj8D,KAAK0a,gBAAgBuiB,YAAYj+B,GAInCwhC,EAAUnoB,iBAAiByN,QAAQkgC,GACnCxlB,EAAUnoB,iBAAmBmoB,EAAUnoB,iBAAiB7Q,MAAM,EAAG,E,EAOvE,MAAMopE,EAAqB5wE,KAAK4wE,mBAChC,GAAGpwC,IAAaowC,aAAkB,EAAlBA,EAAoBp0E,QAAQ,CAC1C,MAAM0E,EAAuC,IAAIqQ,IACjDq/D,EAAmB/xE,SAAQ,CAACmyE,EAAmB3sE,KAC7CnD,EAAQ8G,IAAIgpE,EAAkB14D,SAAUjU,EAAI,IAG9Cm8B,EAAUt7B,QAAQub,MAAK,CAACC,EAAGC,K,QACzB,MAAMuyD,EAAOxyD,EAAEpI,SAA0Cm/B,aAAgB/2B,EAAEpI,SAAoCjb,SACzG81E,EAAOxyD,EAAErI,SAA0Cm/B,aAAgB92B,EAAErI,SAAoCjb,SAC/G,OAAQsjB,EAAEzG,MAAQwG,EAAExG,QAA4B,QAAhB,EAAAhZ,EAAQqD,IAAI2uE,UAAI,QAAI,IAAsB,QAAhB,EAAAhyE,EAAQqD,IAAI4uE,UAAI,QAAI,EAAG,G,CAIrF,GAAGrrE,EAGD,OAFAjG,EAAQ2+B,UAAYA,EACpBxgC,KAAK+c,UAAUrW,cAAc,qBAAsB,CAAC,CAAC7E,UAAS0oD,eAAgB,MACvE5oD,QAAQM,UAGjBjC,KAAKge,kBAAkBkX,mBAAmB,CACxCx4B,EAAG,yBACH+d,KAAM5Y,EAAQ0W,QACd6lC,OAAQv8C,EAAQlF,GAChB6jC,UAAWA,EACX+E,OAAO,IAGT,MAAM6tC,EAAa,CAACp0E,EAAQunB,GAAKxpB,KAAK,KAChC69D,GAAQ,EAAA37C,GAAA,GAAmBsH,GAC3B7c,EAAU1J,KAAK2T,WAAWC,UAAU,wBAAyB,CACjE6G,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5Co/C,OAAQwc,EACRtiD,SAAUs6D,EAAgB1uE,KAAKsmD,GAAkBA,EAAclyC,aAC9DzT,MAAMgkB,KACP,EAAAd,GAAA,GAA4Bc,GAE5B,MAAMwqD,EAAuBxqD,EAAQA,QAAQlH,WAAWtH,GAAwB,sBAAbA,EAAO3d,GAA0C,6BAAb2d,EAAO3d,IAC9G,IAA6B,IAA1B22E,EAA6B,CAC9B,MAAMC,EAAoBzqD,EAAQA,QAAQwqD,GAC1CxqD,EAAQA,QAAQwqD,GAAwB,CACtC32E,EAAG,yBACH0hD,OAAQwc,EACRngD,KAAMza,KAAK0a,gBAAgB4O,cAActqB,GACzCwhC,UAAY8yC,EAAkBzxE,QAA4B2+B,UAC1Dxa,IAAKstD,EAAkBttD,IACvB+N,UAAWu/C,EAAkBv/C,U,CAIjC/zB,KAAKge,kBAAkBmV,qBAAqBtK,EAAQ,IACnD7a,OAAO3E,I,MACQ,qBAAbA,EAAIvL,MAA+BkC,KAAK8wE,qBAAqBvsE,IAAI6uE,KAAgB1pE,GAClF1J,KAAKuyE,aAAa1wE,EAA2B,QAAlB,EAAA+wE,EAAgB,UAAE,eAAEt6D,UAAU,E,IAE1DmwB,SAAQ,KACNzoC,KAAK8wE,qBAAqBvsE,IAAI6uE,KAAgB1pE,GAC/C1J,KAAK8wE,qBAAqBjtE,OAAOuvE,E,IAKrC,OADApzE,KAAK8wE,qBAAqB9oE,IAAIorE,EAAY1pE,GACnCA,C,gTChZX,MAWM6pE,GAAuD,CAC3DC,MAAO,+BACPC,iBAAkB,yCAClBC,cAAe,8BACfC,mBAAoB,wCACpBC,iBAAkB,sCAClBC,oBAAqB,yCAGjBC,GAA2C,IAAI31E,IAAIlE,OAAOkc,OAAOo9D,KAWhE,MAAMQ,WAA2BthE,EAAxC,c,oBACU,KAAAjP,QAAU,IAAI,IAAsE,IAAgB,eA+kBpG,KAAAwwE,yBAA4BC,KAClC,EAAAlsD,GAAA,GAAoDksD,IAEpD,EAAAnsD,GAAA,GAAemsD,EAAYC,MAAM,CAACC,EAAY9vE,EAAKwG,KAC9CspE,EAAWl3E,OAAOm3E,SAAWvuE,IAAiBorC,mBAC/CpmC,EAAIhB,OAAOxF,EAAK,E,IAIb4vE,EAqGX,CA5qBYn3D,QACR9c,KAAKq0E,sBAAwB,CAAC,EAC9Br0E,KAAKs0E,+BAAiC,CAAC,EACvCt0E,KAAKu0E,OAAS,CAAC,EACfv0E,KAAKuT,MAAQ,CAAC,EAEdvT,KAAK+c,UAAU1W,iBAAiB,aAAa,KAC3CtE,YAAW,KACT/B,KAAKw0E,4BAA4B,GAEhC,KAECx0E,KAAKy0E,iCAAkEx1E,IAApCe,KAAK00E,6BAC1C10E,KAAK00E,2BAA6B/lE,EAAA,cAAe,KAC/C3O,KAAK00E,gCAA6Bz1E,EAClCe,KAAK20E,oBAAmB,EAAK,GAC5B,K,IAIP30E,KAAK+c,UAAU1W,iBAAiB,cAAc,IAAMrG,KAAK40E,kBAAkB,SAAS,KAEpF50E,KAAKge,kBAAkBC,2BAA2B,CAChD42D,oBAAsBx6D,IACpB,MAAM85D,EAAa95D,EAAOld,WAC1B6C,KAAK80E,eAAeX,EAAYA,EAAWnsE,IAAIrL,IAC/CqD,KAAK+c,UAAUrW,cAAc,qBAAsBytE,EAAWnsE,IAAI,EAGpE+sE,qBAAsB,IAAM/0E,KAAK40E,kBAAkB,UAAU,GAE7DI,oBAAqB,IAAMh1E,KAAK40E,kBAAkB,SAAS,GAE3DK,0BAA4B56D,IAC1Bra,KAAK+c,UAAUrW,cAAc,eAAgB2T,EAAOld,WAAW,GAGrE,CAEcy3E,kBAAkB92E,EAA0B4zB,G,0CACxD,MAAMwjD,OAA2B,UAATp3E,EAAmBkC,KAAKm1E,yBAAyBzjD,GAAa1xB,KAAKo1E,0BAA0B1jD,GACrH1xB,KAAK+c,UAAUrW,cAAc,mBAAoB,CAC/C5I,OACAo3E,YAEJ,G,CAEOP,mBAAmBU,GAAc,GActC,OAbGr1E,KAAK00E,6BACN3vE,aAAa/E,KAAK00E,4BAClB10E,KAAK00E,gCAA6Bz1E,GAGhCe,KAAKy0E,6BACPz0E,KAAKy0E,2BAA6Bz0E,KAAKs1E,sBAAsB,QAAQ,GAAOzwE,MAAMyqC,IAChF,IAAIA,EAAK9yC,OAAQ,KAAM,cACvBwD,KAAKu1E,iBAAmBjmC,EAAK9nC,QAC7BxH,KAAKu1E,iBAAiB90D,MAAK,CAACC,EAAGC,IAAMJ,KAAKi1D,SAAWj1D,KAAKi1D,UAAS,KAIhEx1E,KAAKy0E,2BAA2B5vE,MAAK,KAC1C,IAAI0qC,EAQJ,OAPI8lC,IACF9lC,EAAMvvC,KAAKu1E,iBAAiBtnE,QAC5BjO,KAAKu1E,iBAAiBj1E,KAAKivC,IAG7BvvC,KAAK84B,eAAeuZ,cAAc,CAACr6B,MAAOhY,KAAKu1E,iBAAiB,KAEzDhmC,CAAG,GAEd,CAEQkmC,aAAanmC,IACnB,EAAAxnB,GAAA,GAAewnB,GAAM,CAACC,EAAKlrC,MACzBkrC,EAAMvvC,KAAK23C,eAAe7H,QAAQP,IAG7BD,EAAKjrC,GAAOkrC,EADRD,EAAKzlC,OAAOxF,EAAK,EACN,GAExB,CAEQqxE,sBAAsB1tE,EAA2B2tE,G,MACvD,OAAO3tE,IAAoB,QAAb,EAAAA,EAAI0vC,iBAAS,eAAEl7C,UAAY8R,KAAK1J,MAAQoD,EAAI4tE,YArI3C,MAqIwED,EACzF,CAEOE,cAAc7tE,EAAwBgM,EAIxC,CAAC,GACJ,IAAI,GAACrX,GAAMqL,EAMX,GALIA,EAAImyB,cACNnyB,EAAMhI,KAAKuT,MAAM5W,IAAOqL,EACxBrL,EAAKqL,EAAIrL,IAGRqD,KAAKq0E,sBAAsB13E,GAC5B,OAAOqD,KAAKq0E,sBAAsB13E,GAGpC,IAAIqX,EAAO0d,UAAW,CACpB,MAAMokD,EAAY91E,KAAKwD,QAAQk4B,aAAa/+B,GAC5C,GAAGqD,KAAK01E,sBAAsBI,EAAW9hE,EAAO2hE,UAC9C,OAAOG,C,CAIX,MAAMpsE,EAAU1J,KAAKq0E,sBAAsB13E,GAAM,IAAIgF,SAAcM,GAAY,mCAC7E,IAAI+R,EAAO0d,UAAW,CACpB,MAAMokD,QAAkB91E,KAAKwD,QAAQe,IAAI5H,GACzC,GAAGqD,KAAK01E,sBAAsBI,EAAW9hE,EAAO2hE,UAQ9C,OAPA31E,KAAKy1E,aAAaK,EAAUp+B,WAC5Bz1C,EAAQ6zE,QAEL91E,KAAKq0E,sBAAsB13E,KAAQ+M,UAC7B1J,KAAKq0E,sBAAsB13E,G,CAOxC,IACE,MAAMw3E,QAAmBn0E,KAAK2T,WAAWC,UAAU,yBAA0B,CAC3EzW,WAAY6C,KAAK+1E,mBAAmB/tE,GACpCi5B,KAAM,IAGF+0C,EAAWhiE,EAAOgiE,SAAWr5E,EAAKw3E,EAAWnsE,IAAIrL,GACvDqD,KAAK80E,eAAeX,EAAY6B,GAEhC/zE,EAAQkyE,E,CACR,MAAM9qE,GACNpH,EAAQ,K,CAGPjC,KAAKq0E,sBAAsB13E,KAAQ+M,UAC7B1J,KAAKq0E,sBAAsB13E,EAEtC,MAEA,OAAO+M,CACT,CAEOusE,mBAAmBt5E,GACxB,OAAOqD,KAAK61E,cAAc,CAACl5E,MAAK,CAACq5E,UAAU,GAC7C,CAEOxB,6BACL,OAAO7yE,QAAQyQ,IAAI,CACjBpS,KAAKi2E,mBAAmB1C,GAAUC,OAClCxzE,KAAKi2E,mBAAmB1C,GAAUE,kBAClCzzE,KAAK2W,2BACJ9R,MAAK,EAAEyyC,EAAO4+B,MACR,CAAC5+B,QAAO4+B,gBAEnB,CAEOv/D,uBAAuB+a,GAC5B,GAAG1xB,KAAKm2E,gCAAkCzkD,EAAW,OAAO1xB,KAAKm2E,8BACjE,MAAMzsE,EAAU1J,KAAKm2E,8BAAgCx0E,QAAQyQ,IAAI,CAC/DpS,KAAK2T,WAAWmwD,aAAapyC,GAC7B1xB,KAAK2T,WAAW+c,cACf7rB,MAAK,EAAEg/D,EAAWtN,MACnB,GAAGv2D,KAAKm2E,gCAAkCzsE,EAI1C,IAAI,MAAM4tC,KAASusB,EAAUuS,eAAgB,CAC3C,MAAMC,EAAQxS,EAAUuS,eAAe9+B,GACjCg/B,EAAWC,KAAqBF,EAAMG,sBChPrC16E,QAAQ,KAAM,KAAKA,QAAQ,KAAM,MDiPlCgR,EAAQ,IAAI3D,WAAWmtE,EAAS95E,QACtC,IAAI,IAAIkJ,EAAI,EAAGlJ,EAASsQ,EAAMtQ,OAAQkJ,EAAIlJ,IAAUkJ,EAClDoH,EAAMpH,GAAK4wE,EAAS5wE,GAAG+wE,WAAW,GAQpC,MAAMlnC,EAAMvvC,KAAK23C,eAAe7H,QAAQ,CACtCpzC,EAAG,WACHO,OAAQ,CAAC,EACTywB,MAAO,EACP/wB,GAAI05E,EAAM15E,GACVw9B,YAAak8C,EAAMl8C,YACnB+V,WAAY,CAAC,CACXxzC,EAAG,yBACHs+B,SAAU,EACV/9B,OAAQ,CACNqzC,OAAO,KAGXjtB,KAAM,EACNuV,MAAO29B,EAAOmgB,QACd1mC,eAAgBljC,EAChByjC,UAAW,aAEV,CACDzyC,KAAM,kBAGRkC,KAAKu0E,OAAOj9B,GAAS/H,C,KAQzB,OAAO7lC,CACT,CAEaitE,kBAAkBjlD,G,0CAe7B,aAZkB1xB,KAAK2T,WAAWm/B,kBAAkB,CAClDjqC,OAAQ,6BACRi4B,cAAgBnJ,KACd,EAAA5P,GAAA,GAA0D4P,GAE1D33B,KAAK42E,eAAiBj/C,EAAIu9C,SAC1Bl1E,KAAKy1E,aAAa99C,EAAIu9C,UACfv9C,GAETjG,aAIJ,G,CAEO0jD,0BAA0B1jD,GAC/B,GAAGA,EAAW1xB,KAAK42E,oBAAiB33E,OAC/B,GAAGe,KAAK42E,eAAgB,OAAO52E,KAAK42E,eACzC,OAAO52E,KAAK22E,kBAAkBjlD,GAAW7sB,MAAK,IAAM7E,KAAK42E,gBAC3D,CAEOC,kBAAkB7/D,EAAc8/D,EAAkB7jD,GACvD,MAAMsc,EAAMvvC,KAAK23C,eAAe1F,OAAOj7B,GAGvC,IADA,EAAAwX,GAAA,GAAcxuB,KAAK42E,gBAAiBG,GAASA,EAAKp6E,KAAOqa,KACrD8/D,EAAQ,CACV92E,KAAK42E,eAAe9wD,QAAQypB,GAE5B,MAAMynC,GAAc,EAAAz/B,GAAA,GAAShI,EAAIqB,iBACjC,IAAI,MAAMvzC,KAAY2C,KAAKs0E,+BACTt0E,KAAKs0E,+BAA+Bj3E,GAC5CwH,MAAMqwE,IACZ,MAAM6B,GAAO,EAAAvoD,GAAA,GAAc0mD,GAAW6B,GAASA,EAAKp6E,KAAO4yC,EAAI5yC,KAC5Do6E,EACD7B,EAASpvD,QAAQixD,GACT15E,EAAS0xB,SAASioD,IAC1B9B,EAASpvD,QAAQypB,E,IAYzB,OANAvvC,KAAK+c,UAAUrW,cAAc,kBAAmB,CAAC5I,KAAM,SAAUm5E,OAAQH,EAAQnwC,SAAU4I,IAExFunC,GACD92E,KAAK40E,kBAAkB,UAAU,GAG5B50E,KAAK2T,WAAWC,UAAU,6BAA8B,CAC7DjX,GAAI0kD,GAAiB9R,GACrBunC,SACA7jD,YAEJ,CAEQikD,WAAW5/B,GACjB,OAAOA,EAAMx7C,QAAQ,UAAW,IAAIA,QAAQ,kBAAmB,GACjE,CAEOq7E,wBAAwB7/B,EAAe8/B,GAC5C,MAAMz6E,EAAKy6E,EAAc7D,GAAUE,iBAAmBF,GAAUC,MAC1DW,EAAan0E,KAAKwD,QAAQk4B,aAAa/+B,GAE7C,KAAIw3E,aAAU,EAAVA,EAAYz8B,WAAW,OAExB0/B,GACE,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,MAAMroD,SAASuoB,KAC3DA,EAAQ,MAIZA,EAAQt3C,KAAKk3E,WAAW5/B,GACxB,MAAMjB,EAAO89B,EAAWkD,MAAM94E,MAAMs7B,GAAMA,EAAEx8B,WAAai6C,IACzD,OAAOjB,EAAOr2C,KAAK23C,eAAe1F,OAAOoE,EAAKqB,UAAU,SAAMz4C,CAChE,CAEOq4E,8BAA8BhgC,GACnC,OAAOt3C,KAAKu0E,OAAOv0E,KAAKk3E,WAAW5/B,GACrC,CAEOigC,4BAA4BjgC,GACjC,MAAMkgC,EAAsBx3E,KAAKw0E,6BAA6B3vE,MAAK,IAC1D7E,KAAKm3E,wBAAwB7/B,KAGtC,OAAO31C,QAAQyQ,IAAI,CACjBolE,EACAx3E,KAAKy3E,qCAAqCngC,KACzCzyC,MAAK,EAAE0qC,EAAK7uB,MACN,CACL6uB,IAAKA,EACLmoC,UAAWh3D,aAAC,EAADA,EAAG6uB,IACd8mC,MAAO31D,aAAC,EAADA,EAAG21D,SAGhB,CAEOoB,qCAAqCngC,GAC1C,OAAOt3C,KAAKw0E,6BAA6B3vE,MAAK,IACrC7E,KAAKm3E,wBAAwB7/B,GAAO,KAC1CzyC,MAAM0qC,IACP,IAAIA,EACF,OAGF,MAAM8mC,EAAQr2E,KAAKs3E,8BAA8BhgC,GACjD,OAAO31C,QAAQyQ,IAAI,CACjBpS,KAAK23E,eAAepoC,EAAI5yC,IACxB05E,EAAQr2E,KAAK23E,eAAetB,EAAM15E,SAAMsC,IACvC4F,MAAK,KACC,CAAC0qC,MAAK8mC,WACb,GAEN,CAEOsB,eAAe3gE,EAAc4gE,G,MAClC,MAAMroC,EAAMvvC,KAAK23C,eAAe1F,OAAOj7B,GACvC,OAAOhX,KAAK84B,eAAeuZ,cAAc,CAACr6B,MAAOu3B,EAAKuC,MAAO8lC,EAAkC,QAAhB,EAAAroC,EAAIsoC,oBAAY,eAAG,QAAK54E,GACzG,CAEQ61E,eAAen9C,EAAuDh7B,GAC5E,MAAMm7E,EAA6B,CACjCp7E,EAAG,sBACHsL,IAAK2vB,EAAI3vB,IACTqvE,MAAO1/C,EAAI0/C,MACX3/B,UAAW/f,EAAI+f,UACf/B,SAAUhe,EAAIge,UAGhB,IAAIw+B,EAAan0E,KAAKwD,QAAQk4B,aAAa/+B,GACxCw3E,EACDl6E,OAAOC,OAAOi6E,EAAY2D,GAE1B3D,EAAan0E,KAAKwD,QAAQu0E,WAAWp7E,EAAIm7E,GAGxC3D,EAAWnsE,IAAI5K,aAChB4C,KAAKuT,MAAM4gE,EAAWnsE,IAAI5K,YAAc4C,KAAK+1E,mBAAmB+B,EAAO9vE,MAGzEhI,KAAKy1E,aAAa99C,EAAI+f,WAGtB,MAAMsgC,EAAW7D,EAAWnsE,IAAIiwE,gBAAkBnE,GAAcr1E,IAAI9B,GACpEw3E,EAAWyB,YAActnE,KAAK1J,MAC9B5E,KAAKwD,QAAQwE,IAAI,CAAC,CAACrL,GAAKw3E,IAAc6D,EACxC,CAEOE,kCAAkC/D,G,MACvC,MAAMriC,EAAQqiC,EAAWrjC,OAAOvyC,MAAMuzC,GAAsB,cAAZA,EAAMp1C,IAChDwL,EAAOisE,EAAWgE,YAElBC,EAA8B,QAAjB,EAAAjE,EAAWl3E,cAAM,eAAEi0C,SAQtC,MAAO,CAAChpC,OAAM5L,SANwC,CACpDI,EAAG,uBACHS,WAAY6C,KAAK+1E,mBAAmB5B,GACpC72E,cAAe62E,EAAW72E,eAGG8V,KAAM0+B,EAAM1+B,KAAMilE,SAAUD,EAAa,0BAA4B,aACtG,CAqBOrC,mBAAmB/tE,GACxB,OAAG8rE,GAAcr1E,IAAIuJ,EAAIrL,IAChB,CACLD,EAAGsL,EAAIrL,IAEAqL,EAAImyB,YAMN,CACLz9B,EAAG,oBACHC,GAAIqL,EAAIrL,GACRw9B,YAAanyB,EAAImyB,aARZ,CACLz9B,EAAG,2BACHU,WAAY,GAAK4K,EAAIrL,GAS3B,CAEa27E,sB,0CAoBX,aAnBkBt4E,KAAK2T,WAAWm/B,kBAAkB,CAClDjqC,OAAQ,+BACRi4B,cAAgBnJ,KACd,EAAA5P,GAAA,GAA8D4P,IAE9D,EAAA7P,GAAA,GAAe6P,EAAIu8C,MAAM,CAACqE,EAASl0E,EAAKwG,KACnC0tE,EAAQvwE,IAAI/K,OAAOm3E,SAAWvuE,IAAiBorC,mBAChDpmC,EAAIhB,OAAOxF,EAAK,E,IAIpBszB,EAAIu8C,KAAKr1E,SAAS05E,IAChBv4E,KAAK80E,eAAe,CAAC9sE,IAAKuwE,EAAQvwE,IAAK0vC,UAAW,GAAI2/B,MAAO,GAAI1hC,SAAU,IAAK4iC,EAAQvwE,IAAIrL,GAAG,IAG1Fg7B,MAIAu8C,IACb,G,CAEOsE,0BACL,OAAOx4E,KAAKs1E,sBAAsB,QAAQ,EAC5C,CAEOmD,qBACL,OAAOz4E,KAAKs1E,sBAAsB,QAAQ,EAC5C,CAEOoD,iBAAiBhnD,GACtB,OAAO1xB,KAAK2T,WAAWm/B,kBAAkB,CACvCjqC,OAAQ,4BACRi4B,cAAgB63C,KACd,EAAA5wD,GAAA,GAAwD4wD,GACxD34E,KAAKy1E,aAAakD,EAAczD,UAChCl1E,KAAK24E,cAAgBA,EAAczD,SAC5ByD,GAETjnD,aAEJ,CAEOyjD,yBAAyBzjD,GAC9B,GAAGA,EAAW1xB,KAAK24E,mBAAgB15E,OAC9B,GAAGe,KAAK24E,cAAe,OAAO34E,KAAK24E,cACxC,OAAO34E,KAAK04E,iBAAiBhnD,GAAW7sB,MAAK,IAAM7E,KAAK24E,eAC1D,CAEOC,wBACL,OAAO54E,KAAK2T,WAAWyI,SAAS,gBAClC,CAEay8D,YAAY7hE,EAAc8hE,G,0CACjC94E,KAAK24E,sBACD34E,KAAKm1E,4BAGb,MAAMh5D,QAAcnc,KAAK44E,wBAEnBrpC,EAAMvvC,KAAK23C,eAAe1F,OAAOj7B,GAUvC,OATA,EAAAwX,GAAA,GAAcxuB,KAAK24E,eAAgB5B,GAASA,EAAKp6E,KAAO4yC,EAAI5yC,KAExDm8E,IACF94E,KAAK24E,cAAc7yD,QAAQypB,GACXvvC,KAAK24E,cAAc9uE,OAAOsS,EAAOnc,KAAK24E,cAAcn8E,OAAS2f,IAG/Enc,KAAK+c,UAAUrW,cAAc,kBAAmB,CAAC5I,KAAM,QAASm5E,OAAQ6B,EAAQnyC,SAAU4I,IAEnFvvC,KAAK2T,WAAWC,UAAU,uBAAwB,CACvDjX,GAAI0kD,GAAiB9R,GACrBupC,WACCj0E,MAAK,KACHi0E,GACD94E,KAAK40E,kBAAkB,SAAS,E,GAGtC,G,CAEamE,iBAAiB/wE,G,0CAG5B,IAFAA,EAAMhI,KAAKwD,QAAQk4B,aAAa1zB,EAAIrL,IAAIqL,KAEjCiwE,gBAKL,SAJkBj4E,KAAK2T,WAAWC,UAAU,+BAAgC,CAC1EzW,WAAY6C,KAAK+1E,mBAAmB/tE,KAOpC,cAHOA,EAAIiwE,eACXj4E,KAAK+c,UAAUrW,cAAc,mBAAoBsB,GACjDhI,KAAKwD,QAAQK,OAAOmE,EAAIrL,IAAI,IACrB,OAQT,SALkBqD,KAAK2T,WAAWC,UAAU,6BAA8B,CACxEzW,WAAY6C,KAAK+1E,mBAAmB/tE,GACpCgxE,UAAU,IAMV,OAFAhxE,EAAIiwE,eAAiB3pE,KAAK1J,MAAQ,IAAO,EACzC5E,KAAK+c,UAAUrW,cAAc,qBAAsBsB,IAC5C,EAIX,OAAO,CACT,G,CAEOixE,kBAAkB/E,GACvB,OAAOvyE,QAAQyQ,IAAI8hE,EAAKhwE,KAAK8D,GAAQhI,KAAK+4E,iBAAiB/wE,KAC7D,CAEakxE,kBAAkBj/D,EAAek/D,GAAkB,G,0CAC9D,MAAMzrD,EAAQyrD,EAAkB,EAAI,EAC9BxhD,QAAY33B,KAAK2T,WAAWm/B,kBAAkB,CAClDjqC,OAAQ,6BACRmL,OAAQ,CACN0Z,QACA0rD,iBAAkBD,QAAmBl6E,EACrCiuC,EAAGjzB,GAEL6mB,cAAgBnJ,KACd,EAAA5P,GAAA,GAA8D4P,IAE9D,EAAA7P,GAAA,GAAe6P,EAAIu8C,MAAM,CAACqE,EAASl0E,EAAKwG,KACnC0tE,EAAQvwE,IAAI/K,OAAOm3E,SAAWvuE,IAAiBorC,mBAChDpmC,EAAIhB,OAAOxF,EAAK,E,IAIpBszB,EAAIu8C,KAAKr1E,SAAS05E,IAChBv4E,KAAK80E,eAAe,CAAC9sE,IAAKuwE,EAAQvwE,IAAK0vC,UAAW,GAAI2/B,MAAO,GAAI1hC,SAAU,IAAK4iC,EAAQvwE,IAAIrL,GAAG,IAG1Fg7B,KAIL0hD,EAAkC,GAClC3wD,EAAQ1oB,KAAKwD,QAAQib,WAC3B,IAAI,MAAM9hB,KAAM+rB,EAAO,CACrB,MAAM,IAAC1gB,GAAO0gB,EAAM/rB,GAEjBqL,EAAIqjB,MAAM7wB,cAAcu0B,SAAS9U,EAAMzf,iBAAmBm9B,EAAIu8C,KAAK31E,MAAM+X,GAAMA,EAAEtO,IAAIrL,KAAOqL,EAAIrL,MACjG08E,EAAW/4E,KAAK,CAAC5D,EAAG,oBAAqBsL,MAAKsxE,MAAO,M,CAIzD,OAAO3hD,EAAIu8C,KAAKlwE,OAAOq1E,EACzB,G,CAcOE,iBACL,OAAOv5E,KAAK2T,WAAWm/B,kBAAkB,CACvCjqC,OAAQ,0BACRi4B,cAAe9gC,KAAKg0E,0BAExB,CAEO97B,mBACL,OAAOl4C,KAAK2T,WAAWm/B,kBAAkB,CACvCjqC,OAAQ,4BACRi4B,cAAe9gC,KAAKg0E,0BAExB,CAEOwF,qBACL,OAAOx5E,KAAKu5E,iBAAiB10E,MAAMovE,GAC1BtyE,QAAQyQ,IAAK6hE,EAAwDC,KAAKhwE,KAAK8D,GAAQhI,KAAK61E,cAAc7tE,EAAK,CAAC2tE,UAAU,QAErI,CAGOL,sBAAsBj4E,EAAkBo8E,GAAqB,GAElE,OADAp8E,GAAW,EAAAk6C,GAAA,GAASl6C,GACjB2C,KAAKs0E,+BAA+Bj3E,GAAkB2C,KAAKs0E,+BAA+Bj3E,GAEtF2C,KAAKs0E,+BAA+Bj3E,GAAYsE,QAAQyQ,IAAI,CACjEpS,KAAK2T,WAAWm/B,kBAAkB,CAChCjqC,OAAQ,uBACRmL,OAAQ,CACN3W,YAEFyjC,cAAgBo0C,GAAaA,IAE/BuE,EAAqBz5E,KAAKw5E,qBAAuB,GACjDC,EAAqBz5E,KAAK22E,yBAAsB13E,IAC/C4F,MAAK,EAAE60E,EAAkBC,EAAe/C,MACzC,MAAMgD,EAAiBF,EAAuDxE,SAAShxE,KAAK8sC,GAAYhxC,KAAK23C,eAAe7H,QAAQkB,KAC9H6oC,EAA8C,GAAIC,EAA4C,GAI9FC,EAAgB1C,IACpB,IAAI,MAAMhhC,KAAQghC,EAEhB,IADqB,EAAA9/B,GAAA,GAASlB,EAAKh5C,UACnB0xB,SAAS1xB,GACvB,IAAI,MAAM2Z,KAASq/B,EAAKqB,UAAW,CACjC,MAAMnI,EAAMvvC,KAAK23C,eAAe1F,OAAOj7B,IACtCu4B,EAAI2B,SAAW2oC,EAAyBC,GAAsBx5E,KAAKivC,E,GAM5E,GAAGqnC,EAAgB,CACjBmD,EAAanD,EAAeS,OAC5B,MAAMnC,EAAW0B,EAAe1B,SAChC,CAAC2E,EAAwBC,GAAsBj7E,SAAS+4D,IACtDA,EAAEn3C,MAAK,CAACC,EAAGC,IAAMu0D,EAASz6E,QAAQimB,GAAKw0D,EAASz6E,QAAQkmB,IAAG,G,CAI/D,IAAI,MAAM3Y,KAAO2xE,EACfI,EAAa/xE,EAAIqvE,OAenB,MAAMnC,EAAW,IAAI,IAAI/2E,IAAI07E,EAAuB71E,OAAO81E,EAAsBF,KASjF,OAPA,EAAA9xD,GAAA,GAAeotD,GAAU,CAAClkC,EAAS3sC,EAAKwG,MACd,IAApBmmC,EAAQA,UAAkBnrC,IAAiBorC,oBAC3CjxC,KAAK+c,UAAU3W,UAAW,EAAA6wD,GAAA,GAAsBjmB,KAClDnmC,EAAIhB,OAAOxF,EAAK,E,IAIb6wE,CAAQ,GAEnB,CAEO8E,sBAML,OALGh6E,KAAK42E,iBACN52E,KAAK42E,eAAep6E,OAAS,EAC7BwD,KAAK40E,kBAAkB,UAAU,IAG5B50E,KAAK2T,WAAWC,UAAU,+BACnC,E,yBEhtBK,MAAMqmE,WAAwBxnE,EAArC,c,oBA4JS,KAAA7T,MAAQ,CAAC0M,GAAO,KACrB,GAAIA,EAcFtL,KAAK0Y,MAAQ,CAAC,EACd1Y,KAAKk6E,UAAY,CAAC,OAdlB,IAAI,MAAM/6E,KAAUa,KAAK0Y,MAAO,CAE9B,IAAIvZ,EAAQ,SACZ,MAAMH,EAASG,EAAOE,WACtB,IAAIW,KAAK0mB,aAAayU,aAAan8B,GAAS,CAC1C,MAAMmW,EAAOnV,KAAK0Y,MAAMvZ,GACxBa,KAAKo7B,qBAAqBjmB,GAAM,GAEhCnV,KAAKwD,QAAQK,OAAO1E,UACba,KAAK0Y,MAAMvZ,E,EAQxBa,KAAKm6E,oBAAsB,CAAC,EAC5Bn6E,KAAKo6E,cAAgBp6E,KAAKq6E,oBAC1Br6E,KAAKs6E,yBAAsBr7E,EAC3Be,KAAKu6E,aAAe,IAAIp8E,IACxB6B,KAAKw6E,qBAAsB,CAAK,EAugB1B,KAAAC,oBAAsB,KAC5B,MAAMC,GAAe,EAAAp3D,GAAA,IAAM,GAC3B,IAAI,MAAM5d,KAAK1F,KAAK0Y,MAAO,CACzB,MAAMvD,EAAOnV,KAAK0Y,MAAMhT,GACxB1F,KAAK26E,iBAAiBxlE,EAAMulE,E,EAiUlC,CAn/BY59D,QA8ER,OA7EA9c,KAAKpB,OAAM,GAEXg8E,YAAY56E,KAAKy6E,oBAAqB,KAEtCz6E,KAAK+c,UAAU1W,iBAAiB,qBAAsBrG,KAAKy6E,qBAE3Dz6E,KAAKge,kBAAkBC,2BAA2B,CAChD08D,iBAAmBtgE,IACjB,MAAMlb,EAASkb,EAAOjb,QAChB+V,EAAOnV,KAAK0Y,MAAMvZ,GACrBgW,IACDA,EAAK1O,OAAS4T,EAAO5T,OAClB0O,EAAK1O,SACH,YAAa0O,EAAK1O,SACnB0O,EAAK1O,OAAOo0E,SAAW76E,KAAKujB,YAAYC,uBAGvC,eAAgBrO,EAAK1O,SACtB0O,EAAK1O,OAAOq0E,YAAc96E,KAAKujB,YAAYC,wBAK/CxjB,KAAK+c,UAAUrW,cAAc,cAAevH,GAC5Ca,KAAK+6E,uBAAuB5lE,G,EA2BhC6lE,eAAiB3gE,IACf,MAAMlb,EAASkb,EAAOjb,QAChB+V,EAAOnV,KAAK0Y,MAAMvZ,GACrBgW,IACDnV,KAAKqlD,gBAAgBlmD,GAErBa,KAAK0vE,YAAY,OAAD,wBACXv6D,GAAI,CACPsqC,WAAYplC,EAAOolC,WACnBC,UAAWrlC,EAAOqlC,UAClB9gB,cAAU3/B,EACVi7E,UAAW7/D,EAAO6/D,aACjB,G,IASTl6E,KAAK+c,UAAU1W,iBAAiB,mBAAoB9D,IAClD,MAAMpD,EAASa,KAAKid,UAAUtgB,GAC9BqD,KAAKo6E,cAAch9D,YAAYje,EAAQa,KAAKopE,kBAAkBjqE,GAAQ,IAGjEwC,QAAQyQ,IAAI,CACjBpS,KAAKue,gBAAgBrX,WACrBlH,KAAKwe,mBAAmB/K,YAAY,WACnC5O,MAAK,EAAEmC,GAAQ9B,QAASwT,EAAOlV,eAChCxD,KAAKwD,QAAUA,EAEfxD,KAAKgoB,aAAatP,GAClB,IAAI,IAAIhT,EAAI,EAAGlJ,EAASkc,EAAMlc,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CACrD,MAAMyP,EAAOuD,EAAMhT,GACfyP,GAIDnO,EAAMi0E,yBAA2B9lE,EAAKlY,OAAOi+E,SAAW/lE,EAAKlY,OAAOk+E,kBACrEn7E,KAAKo7E,YAAYjmE,EAAKxY,IAElBqD,KAAKs6E,sBACPt6E,KAAKs6E,qBAAsB,SAC3Bt6E,KAAKs6E,oBAAoBr4E,QAAQjC,KAAKu6E,e,CAiB5C,MAAMc,EAAer0E,EAAMq0E,cAAgB,GAC3C,IAAI,IAAI31E,EAAI,EAAGlJ,EAAS6+E,EAAa7+E,OAAQkJ,EAAIlJ,IAAUkJ,EACzD1F,KAAK0mB,aAAaK,YAAYs0D,EAAa31E,GAAI,gBAGjD1F,KAAK0mB,aAAargB,iBAAiB,cAAerH,IAChD,IAAIgB,KAAK0a,gBAAgBjb,OAAOT,GAC9B,OAGF,MAAMG,EAASH,EAAOkxB,WAClBlwB,KAAKwD,QAAQk4B,aAAav8B,IAC5Ba,KAAKwD,QAAQwE,IAAI,CACf,CAAC7I,GAASa,KAAK69C,QAAQ1+C,I,IAK7Ba,KAAK0mB,aAAargB,iBAAiB,gBAAiBrH,IAClD,IAAIgB,KAAK0a,gBAAgBjb,OAAOT,GAC9B,OAGF,MAAMG,EAASH,EAAOkxB,WACnBlwB,KAAKwD,QAAQk4B,aAAav8B,IAC3Ba,KAAKwD,QAAQK,OAAO1E,E,GAEtB,GAEN,CA4BWA,aACT,OAAOa,KAAK+c,UAAU7W,KAAKgqB,UAC7B,CAEQorD,mBAAmBC,GAItBA,GACDv7E,KAAKue,gBAAgB3W,YAAY,0BAA0B,EAAA0b,GAAA,IAAM,GAErE,CAEOk4D,iBAAiBx8E,GACtB,OAAOgB,KAAKue,gBAAgBrX,WAAWrC,MAAMmC,IAC3C,MAAMq0E,EAAer0E,EAAMq0E,cAAgB,GAC3C,GAAGA,EAAa,KAAOr8E,EAAQ,EAC7B,EAAAoS,EAAA,GAAiBiqE,EAAcr8E,GAC/Bq8E,EAAav1D,QAAQ9mB,GAClBq8E,EAAa7+E,OAAS,KACvB6+E,EAAa7+E,OAAS,IAGxBwD,KAAKue,gBAAgB3W,YAAY,eAAgByzE,GACjD,IAAI,MAAMr8E,KAAUq8E,EAClBr7E,KAAK0mB,aAAaK,YAAY/nB,EAAQ,e,IAI9C,CAEOy8E,oBACL,OAAOz7E,KAAKue,gBAAgBrX,WAAWrC,MAAMmC,IAC3C,MAAMq0E,EAAer0E,EAAMq0E,cAAgB,GAC3C,IAAI,MAAMr8E,KAAUq8E,EAClBr7E,KAAK0mB,aAAagB,YAAY1oB,EAAQ,gBAGxCq8E,EAAa7+E,OAAS,EACtBwD,KAAKue,gBAAgB3W,YAAY,eAAgByzE,EAAa,GAElE,CAEO1vD,e,MACL,GAAG3rB,KAAKs6E,qBAAuBt6E,KAAKw6E,oBAClC,MAAO,CACL5uD,OAAQ5rB,KAAKs6E,oBAAoBtoE,YACjCtI,QAAS1J,KAAKs6E,qBAIlBt6E,KAAKw6E,qBAAsB,EAE3B,MAAM9wE,GAAU,SAqBhB,OApBA1J,KAAK2T,WAAWC,UAAU,wBAAwB/O,MAAMzC,IACtC,sBAAbA,EAAO1F,IACRsD,KAAKu6E,aAAa37E,QAElBoB,KAAKgoB,aAAa5lB,EAAOsW,OAEzBtW,EAAOmuB,SAAS1xB,SAASq8E,IACvBl7E,KAAKo7E,YAAYF,EAAQ97E,QAAQ,IAGnCY,KAAKs7E,oBAAmB,GAExBt7E,KAAKs6E,oBAAsB5wE,GAG7BA,EAAQzH,QAAQjC,KAAKu6E,aAAa,IACjC,KACDv6E,KAAKw6E,qBAAsB,CAAK,IAG3B,CACL5uD,OAAgC,QAAxB,EAAA5rB,KAAKs6E,2BAAmB,eAAEtoE,YAClCtI,QAAS1J,KAAKs6E,sBAALt6E,KAAKs6E,oBAAwB5wE,GAE1C,CAEOgyE,gBAAgB98C,GACF,MAAhBA,EAAS,KACVA,EAAWA,EAASp3B,MAAM,IAG5Bo3B,EAAWA,EAASpkC,cACpB,MAAMwE,EAASgB,KAAKk6E,UAAUt7C,GAC9B,OAAG5/B,EACMgB,KAAK0a,gBAAgB64C,QAAQv0D,GAG/BgB,KAAK2T,WAAWktB,uBAAuB,CAC5Ch4B,OAAQ,2BACRmL,OAAQ,CAAC4qB,YACTkC,cAAgB66C,GAAiB37E,KAAK47E,oBAAoBD,IAE9D,CAEQC,oBAAoBD,GAI1B,OAHA37E,KAAKgoB,aAAa2zD,EAAajjE,OAC/B1Y,KAAKsc,gBAAgB2L,aAAa0zD,EAAazzD,OAExCloB,KAAK0a,gBAAgB64C,SAAQ,EAAAx0D,GAAA,GAAU48E,EAAalhE,MAC7D,CAEOohE,aAAatyB,GAClB,OAAOvpD,KAAK2T,WAAWC,UAAU,wBAAyB,CAAC21C,UAAQ1kD,MAAM82E,GAChE37E,KAAK47E,oBAAoBD,IAEpC,CAEQP,YAAYz+E,GAClBqD,KAAKu6E,aAAaz7E,IAAInC,GACtBqD,KAAKo6E,cAAch9D,YAAYzgB,EAAIqD,KAAKopE,kBAAkBzsE,IAC1DqD,KAAK0mB,aAAaK,YAAYpqB,EAAG0C,WAAY,UAC/C,CAEQy8E,WAAWn/E,GACjBqD,KAAKu6E,aAAa12E,OAAOlH,GACzBqD,KAAKo6E,cAAch9D,YAAYzgB,EAAI,IACnCqD,KAAK0mB,aAAagB,YAAY/qB,EAAG0C,WAAY,UAC/C,CAEO+pE,kBAAkBzsE,GACvB,MAAMwY,EAAOnV,KAAK0Y,MAAM/b,GACxB,OAAIwY,EAIkB,CACpBA,EAAKsqC,WACLtqC,EAAKuqC,UACLvqC,EAAKo0C,UACF,EAAAR,GAAA,GAAuB5zC,GAE1BA,EAAKlY,OAAOpD,KAAO,iBAAmB,IAG7BgD,OAAOC,SAASC,KAAK,KAZvB,EAaX,CAEOg/E,YAAY9hE,EAAgB+hE,GAAe,EAAOC,EAAqC,QAC5F,OAAOj8E,KAAK2rB,eAAejiB,QAAQ7E,MAAMq3E,IACvC,IAAI3B,EAAe,IAAI2B,GACvB,GAAGjiE,EAAO,CACR,MAAM/U,EAAUlF,KAAKo6E,cAAc7/E,OAAO0f,GAG1CsgE,EAF6B,IAAIA,GAAc19E,QAAQF,GAAOuI,EAAQzG,IAAI9B,I,CAK9D,SAAXs/E,EACD1B,EAAa95D,MAAK,CAAC07D,EAASC,KAC1B,MAAMC,GAAar8E,KAAK0Y,MAAMyjE,IAAY,CAAC,GAAGG,UAAY,GACpDC,GAAav8E,KAAK0Y,MAAM0jE,IAAY,CAAC,GAAGE,UAAY,GAC1D,OAAOD,EAAUG,cAAcD,EAAU,IAExB,WAAXN,GACR1B,EAAa95D,MAAK,CAAC07D,EAASC,KAC1B,MAAMK,EAAUz8E,KAAK08E,qBAAqB18E,KAAK69C,QAAQs+B,GAAS11E,QAEhE,OADgBzG,KAAK08E,qBAAqB18E,KAAK69C,QAAQu+B,GAAS31E,QAC/Cg2E,CAAO,IAI5B,MAAME,EAAW38E,KAAKb,OAQtB,OAPA,EAAAiS,EAAA,GAAiBmpE,EAAcoC,GAC5BX,GACEh8E,KAAK48E,eAAe3iE,IACrBsgE,EAAaz0D,QAAQ62D,GAIlBpC,CAAY,GAEvB,CAEOsC,mBACL5iE,EACA+hE,EACAC,EACA9/D,GAEA,OAAOnc,KAAK+7E,YAAY9hE,EAAO+hE,EAAcC,GAAQp3E,MAAM4T,IACzD,MAAMb,EAAUa,EAAQvU,KAAK/E,GAAWA,EAAOE,UAAS,KACxD,OAAG8c,EACMvE,EAAQpQ,MAAM,EAAG2U,GAGnBvE,CAAO,GAElB,CAEOklE,YAAY99E,EAAgB+9E,GACjC,OAAO/8E,KAAK2T,WAAWge,gBAAgBorD,EAAQ,iBAAmB,mBAAoB,CACpFpgF,GAAIqD,KAAK0a,gBAAgBkW,iBAAiB5xB,KACzC6F,MAAMT,IACJA,GACDpE,KAAKge,kBAAkBkX,mBAAmB,CACxCx4B,EAAG,oBACH6b,QAASvY,KAAK0a,gBAAgB4O,cAActqB,GAC5C8tE,QAASiQ,IAIN34E,IAEX,CAEOw4E,eAAe3iE,GACpB,MAAM9E,EAAOnV,KAAKid,UACZ9b,EAAQnB,KAAKq6E,oBAEnB,OADAl5E,EAAMic,YAAYjI,EAAKxY,GAAIqD,KAAKopE,kBAAkBj0D,EAAKxY,KAChDwE,EAAM5G,OAAO0f,GAAOxb,IAAI0W,EAAKxY,GACtC,CAEQ09E,oBACN,OAAO,IAAI,KAAoB,CAC7B9+E,eAAe,EACfC,YAAY,EACZH,UAAU,EACVM,YAAY,GAEhB,CAEOqsB,aAAag1D,EAAoBhpD,GAClCgpD,EAAiBzkD,QACpBykD,EAAiBzkD,OAAQ,EAC1BykD,EAASn+E,SAASsW,GAASnV,KAAK0vE,YAAYv6D,EAAM6e,KACpD,CAEOoH,qBAAqB3gB,EAAoDtW,GAC9E,MAAM+1E,GAAY,EAAAnxB,GAAA,GAAuBtuC,GACzC,IAAIy/D,EAAU19E,OACZ,OAGF,MAAMygF,EAAmB/C,EAAUh2E,KAAK06B,GC3b7B,SAAuBA,GACpC,OAAOA,GAAYA,EAASpkC,eAAiB,EAC/C,CDybyD0iF,CAAct+C,KAChEz6B,EACD84E,EAAiBp+E,SAASs+E,IACxBn9E,KAAKk6E,UAAUiD,GAAkB1iE,EAAK9d,GAAG0C,SAAoB,SAAXob,EAAK/d,EAAa,IAGtEugF,EAAiBp+E,SAASs+E,WACjBn9E,KAAKk6E,UAAUiD,EAAe,GAG3C,CAEOnhD,mBAAmBvhB,EAAoD2iE,GAC5E,QACGA,GACAA,EAAwBx+C,WAAcnkB,EAAqBmkB,WAC3D,EAAA5oB,EAAA,GAAWonE,EAAwBlD,UAAYz/D,EAAqBy/D,aAErEl6E,KAAKo7B,qBAAqBgiD,GAAS,GACnCp9E,KAAKo7B,qBAAqB3gB,GAAM,GAEzB,GAIX,CAEOi1D,YAAYv6D,EAAc6e,G,YAC/B,IAAI7e,GAAmB,cAAXA,EAAKzY,EAAmB,OAEpC,MAAMyC,EAASgW,EAAKxY,GACd0gF,EAAUr9E,KAAK0Y,MAAMvZ,GAU3B,GAFW,QAAX,EAAAgW,EAAKlY,cAAM,QAAXkY,EAAKlY,OAAW,CAAC,GAEdkY,EAAKlY,OAAOujB,UAAmBvhB,IAAZo+E,EACpB,OAMF,MAAMthD,EAAkB/7B,KAAKg8B,mBAAmB7mB,EAAMkoE,GAEtD,GAAIA,QACmBp+E,IAArBo+E,EAAQf,UACRe,EAAQ59B,aAAetqC,EAAKsqC,YAC5B49B,EAAQ39B,YAAcvqC,EAAKuqC,UAK3BvqC,EAAKmnE,SAAWe,EAAQf,aALc,CACtC,MAAMgB,EAAWnoE,EAAKsqC,YAActqC,EAAKuqC,UAAY,IAAMvqC,EAAKuqC,UAAY,IAE5EvqC,EAAKmnE,SAAWnnE,EAAKlY,OAAOssB,QAAU,IAAK,EAAApuB,GAAA,IAAgBmiF,GAAU,E,CAyBvE,GApBGnoE,EAAK1O,SACF0O,EAAK1O,OAAuCo0E,UAC7C1lE,EAAK1O,OAAuCo0E,SAAW76E,KAAKujB,YAAYC,uBAGvErO,EAAK1O,OAAwCq0E,aAC9C3lE,EAAK1O,OAAwCq0E,YAAc96E,KAAKujB,YAAYC,wBAIlD,2BAAR,QAApB,EAACrO,EAAcsjB,aAAK,eAAE/7B,WACfyY,EAAcsjB,WASTx5B,IAAZo+E,EACDr9E,KAAK0Y,MAAMvZ,GAAUgW,MAChB,CACL,MAAMmnB,EAAennB,EAAKsqC,aAAe49B,EAAQ59B,YAC/CtqC,EAAKuqC,YAAc29B,EAAQ39B,WAC3B3jB,EAIIM,GAFiE,QAAnD,EAAAghD,EAAQ5kD,aAA2C,eAAEz7B,aACL,QAAhD,EAAAmY,EAAKsjB,aAA2C,eAAEz7B,UAGhEu/B,EAAkB8gD,EAAQpgF,OAAOmJ,UAAY+O,EAAKlY,OAAOmJ,SAC7Di3E,EAAQpgF,OAAOu/B,WAAarnB,EAAKlY,OAAOu/B,UACxC6gD,EAAQpgF,OAAOw/B,OAAStnB,EAAKlY,OAAOw/B,MACpC4gD,EAAQpgF,OAAOy/B,OAASvnB,EAAKlY,OAAOy/B,KAMhC6gD,IAAeF,EAAQpgF,OAAOi+E,QAC9BsC,IAAeroE,EAAKlY,OAAOi+E,QAEjC1jE,GAAkB6lE,EAASloE,GAC3BnV,KAAK+c,UAAUrW,cAAc,cAAevH,GAEzCo+E,IAAeC,GAChBx9E,KAAKy9E,iBAAiBt+E,EAAQq+E,EAAYD,GAGzClhD,GACDr8B,KAAK+c,UAAUrW,cAAc,gBAAiB,CAAC1H,OAAQmW,EAAKxY,GAAG0C,cAG9Di9B,GAAgBC,IACjBv8B,KAAK+c,UAAUrW,cAAc,kBAAmB,CAAC1H,OAAQmW,EAAKxY,GAAG0C,Y,CAIrEW,KAAK09E,aAAavoE,EAAMkoE,GACxBr9E,KAAK+6E,uBAAuB5lE,EAC9B,CAEQuoE,aAAavoE,EAAYkoE,GAC/B,GAAGloE,EAAKlY,OAAOpD,KAAM,CACnB,MAAM0M,IAAc4O,EAAKlY,OAAOmJ,QAC7BpG,KAAK+c,UAAU3W,UAAYG,GAC5BvG,KAAK+c,UAAUrW,cAAc,yBAA0B,CAACJ,OAAQ+2E,EAAS92E,a,CAG/E,CAEQw0E,uBAAuB5lE,GAC1BnV,KAAK0mB,aAAayU,aAAahmB,EAAKxY,GAAG0C,aACxCW,KAAKwD,QAAQwE,IAAI,CACf,CAACmN,EAAKxY,IAAKwY,GAGjB,CAEOwoE,oBAAoBhhF,GACzB,OAAOqD,KAAK08E,qBAAqB//E,GAAM,CACzC,CAEO+/E,qBAAqBj2E,GAC1B,GAAsB,iBAAb,EAAuB,CAC9B,MAAM0O,EAAOnV,KAAK69C,QAAQp3C,GAC1BA,EAAS0O,aAAI,EAAJA,EAAM1O,M,CAGjB,GAAGA,EAAQ,CACT,MAAMo0E,EAAuB,qBAAbp0E,EAAO/J,EAA2B+J,EAAOo0E,QAAwB,sBAAbp0E,EAAO/J,EAA4B+J,EAAOq0E,WAAa,EAC3H,GAAGD,EACD,OAAOA,EAYT,OAAOp0E,EAAO/J,GACZ,IAAK,qBACH,OAAO,EACT,IAAK,qBACH,OAAO,EACT,IAAK,sBACH,OAAO,E,CAIb,OAAO,CACT,CAEOmhD,QAAQlhD,GACb,OAAG,EAAAymB,GAAA,GAAezmB,GACTA,EAGFqD,KAAK0Y,MAAM/b,EACpB,CAEOihF,cAAcjhF,GACnB,OAAOqD,KAAK69E,cAAclhF,KAAQqD,KAAK0Y,MAAM/b,GAAIM,OAAOpD,MAAQmG,KAAK0Y,MAAM/b,GAAI8J,MACjF,CAEaq3E,aAAanhF,G,qCACxB,MAAMwY,EAAOnV,KAAK69C,QAAQlhD,GAC1B,KAAIwY,aAAI,EAAJA,EAAMo0C,OACR,OAGF,MAAMsa,QAAkB7jE,KAAK2T,WAAWmwD,eACxC,MAAO,CACLva,MAAOp0C,EAAKo0C,MACZw0B,YAAala,EAAUma,kBAAkB94D,MAAMoe,GAAWnuB,EAAKo0C,MAAM4D,WAAW7pB,KAEpF,E,+RAEOrmB,UACL,OAAOjd,KAAK69C,QAAQ79C,KAAKb,OAC3B,CAEOgxB,MAAMxzB,GACX,OAAOqD,KAAK0Y,MAAM/b,MAASqD,KAAK0Y,MAAM/b,GAAIM,OAAOw/C,GACnD,CAEOwhC,gBAAgBthF,GACrB,OAAOqD,KAAKmwB,MAAMxzB,MAASqD,KAAK0Y,MAAM/b,GAAIM,OAAOihF,eACnD,CAEO5tD,UAAU3zB,GACf,OAAOqD,KAAKu6E,aAAa97E,IAAI9B,OAAUqD,KAAK0Y,MAAM/b,KAAOqD,KAAK0Y,MAAM/b,GAAIM,OAAOi+E,QACjF,CAEO2C,cAAclhF,GACnB,MAAMwY,EAAOnV,KAAK0Y,MAAM/b,GACxB,OAAOwY,IAASnV,KAAKmwB,MAAMxzB,KAAQwY,EAAKlY,OAAOssB,UAAYpU,EAAKlY,OAAOkhF,OACzE,CAEOC,iBAAiBzhF,GACtB,OAAOqD,KAAK69E,cAAclhF,KAAQqD,KAAKswB,UAAU3zB,IAAOA,IAAOqD,KAAKb,MACtE,CAEOk3B,QAAQ15B,EAAY6gC,GACzB,MAAMroB,EAAOnV,KAAK0Y,MAAM/b,GACxB,OAAO,EAAAymB,GAAA,GAASjO,KAAUqoB,IAAaroB,EAAKlY,OAAOujB,IACrD,CAEOwoD,cAAcrsE,GACnB,MAAMwY,EAAOnV,KAAK69C,QAAQlhD,GAC1B,MAAO,IAAMA,GAAMwY,EAAKglB,YAAc,IAAMhlB,EAAKglB,YAAc,GACjE,CAEOU,aAAal+B,GAClB,MAAMwY,EAAOnV,KAAK69C,QAAQlhD,GAC1B,OAAGwY,EAAKlY,QAAUkY,EAAKlY,OAAOpD,KACrB,CAAC6C,EAAG,iBAGN,CACLA,EAAG,YACH0C,QAASzC,EACTw9B,YAAahlB,EAAKglB,YAEtB,CAEOgvC,iBAAiBxsE,GAOtB,MAAO,CACLD,EAAG,gBACH0C,QAASzC,EACTw9B,YATWn6B,KAAK69C,QAAQlhD,GASNw9B,YAEtB,CAEO64B,qBAAqBr2D,GAC1B,MAAMwY,EAAOnV,KAAK69C,QAAQlhD,GAE1B,MAAO,CACLD,EAAG,oBACH+iD,WAAYtqC,EAAKsqC,WACjBC,UAAWvqC,EAAKuqC,UAChBF,aAAcrqC,EAAKo0C,MACnB5J,MAAO,GACPvgD,QAASzC,EAEb,CAUQg+E,iBAAiBxlE,EAAmBulE,GAAe,EAAAp3D,GAAA,IAAM,IAC5DnO,EAAK1O,QACY,qBAAlB0O,EAAK1O,OAAO/J,GACZyY,EAAK1O,OAAOo0E,QAAUH,IACtBvlE,EAAK1O,OAAS,CAAC/J,EAAG,oBAAqBo+E,WAAY3lE,EAAK1O,OAAOo0E,SAC/D76E,KAAK+c,UAAUrW,cAAc,cAAeyO,EAAKxY,IAEjDqD,KAAK+6E,uBAAuB5lE,GAEhC,CAEOkwC,gBAAgB1oD,EAAY0hF,GACjC,GAAGr+E,KAAKmwB,MAAMxzB,GACZ,OAGF,MAAM8iC,GAAY,EAAAnc,GAAA,IAAM,GAExB,GAAG+6D,GACD,GAAI5+C,EAAY4+C,GAFI,GAGlB,YAEG,GAAGr+E,KAAKge,kBAAkB2U,aAAaI,YAC5C,OAGF,MAAM5d,EAAOnV,KAAK69C,QAAQlhD,KACvBwY,aAAI,EAAJA,EAAM1O,SACW,qBAAlB0O,EAAK1O,OAAO/J,GACM,oBAAlByY,EAAK1O,OAAO/J,GACXyY,EAAKlY,OAAOkhF,SACZhpE,EAAKlY,OAAOssB,UACbpU,EAAK1O,OAAS,CACZ/J,EAAG,mBACHm+E,QAASp7C,EAjBS,IAqBpBz/B,KAAK+c,UAAUrW,cAAc,cAAe/J,GAE5CqD,KAAK+6E,uBAAuB5lE,GAEhC,CAEOmpE,cAAc7+B,EAAoBC,EAAmB6J,GAC1D,OAAOvpD,KAAKu+E,eAAe,CAAC,CAC1B9+B,aACAC,YACA8+B,OAAQ,CAACj1B,MACP1kD,MAAM4T,IACR,IAAIA,EAAQjc,OAAQ,CAClB,MAAMmB,EAAQ,IAAIoN,MAElB,MADCpN,EAAcG,KAAO,UAChBH,C,CAGR,OAAO8a,EAAQ,EAAE,GAErB,CAEO8lE,eAAehuD,GACpB,MAAMkuD,EAAgC,GAEtC,IAAI,IAAI/4E,EAAI,EAAGA,EAAI6qB,EAAS/zB,SAAUkJ,EACpC,IAAI,IAAIg5E,EAAI,EAAGA,EAAInuD,EAAS7qB,GAAG84E,OAAOhiF,SAAUkiF,EAC9CD,EAAcn+E,KAAK,CACjB5D,EAAG,oBACHiiF,WAAYj5E,GAAK,GAAKg5E,GAAG3xE,SAAS,IAClCw8C,MAAOh5B,EAAS7qB,GAAG84E,OAAOE,GAC1Bj/B,WAAYlvB,EAAS7qB,GAAG+5C,WACxBC,UAAWnvB,EAAS7qB,GAAGg6C,YAK7B,OAAO1/C,KAAK2T,WAAWC,UAAU,0BAA2B,CAC1D2c,SAAUkuD,IACT55E,MAAM+5E,IACP5+E,KAAKgoB,aAAa42D,EAAuBlmE,OAEzBkmE,EAAuBC,SAAS36E,KAAK46E,IACnD9+E,KAAKy9E,iBAAiBqB,EAAgB1/E,SAAS,GACxC0/E,EAAgB1/E,aAK7B,CAEO+9C,YAAYr/C,GACjB,OAAGkC,KAAKm6E,oBAAoBr8E,GAAckC,KAAKm6E,oBAAoBr8E,GAE5DkC,KAAKm6E,oBAAoBr8E,GAAQkC,KAAKue,gBAAgBrX,WAAWrC,MAAMmC,IAC5E,MAAM4kB,EAAS5kB,EAAM+3E,cAAcjhF,GACnC,OAAG8tB,GAAWA,EAAOozD,WAAa,MAAW1wE,KAAK1J,OAASgnB,EAAOwF,MACzDxF,EAAOwF,MAGTpxB,KAAK2T,WAAWC,UAAU,uBAAwB,CACvD,CAAC9V,IAAO,EACRquB,OAAQ,EACRhQ,MAAO,GACP8kB,KAAM,MACLp8B,MAAMzC,IACP,IAAIg7C,EAAwB,GAqB5B,MApBgB,sBAAbh7C,EAAO1F,IAERsD,KAAKgoB,aAAa5lB,EAAOsW,OACzB1Y,KAAKsc,gBAAgB2L,aAAa7lB,EAAO8lB,OAEtC9lB,EAAO68E,WAAWziF,SACnB4gD,EAAWh7C,EAAO68E,WAAW,GAAG7tD,MAAMltB,KAAKo5C,IACzC,MAAMt+C,GAAS,EAAAD,GAAA,GAAUu+C,EAAQ7iC,MAEjC,OADAza,KAAK0mB,aAAaK,YAAY/nB,EAAQ,WAC/B,CAACrC,GAAIqC,EAAQu+C,OAAQD,EAAQC,OAAO,MAKjDv2C,EAAM+3E,cAAcjhF,GAAQ,CAC1BszB,MAAOgsB,EACP4hC,WAAY1wE,KAAK1J,OAEnB5E,KAAKue,gBAAgB3W,YAAY,gBAAiBZ,EAAM+3E,eAEjD3hC,CAAQ,GACf,GAEN,CAEO8hC,WAAW/yD,EAAS,EAAGhQ,EAAQ,GACpC,OAAOnc,KAAK2T,WAAWge,gBAAgB,sBAAuB,CAACxF,SAAQhQ,UAAQtX,MAAMs6E,IACnFn/E,KAAKgoB,aAAam3D,EAAgBzmE,OAClC1Y,KAAKsc,gBAAgB2L,aAAak3D,EAAgBj3D,OAK3C,CAAChO,MAJ4B,qBAAtBilE,EAAgBziF,EAA2ByiF,EAAgBzmE,MAAMlc,OAAS2iF,EAAgBj3D,MAAM1rB,OAAS2iF,EAAgBjlE,MAIxHtC,QAFWunE,EAAgBzmE,MAAMxU,KAAK45B,GAAMA,EAAEnhC,GAAG0C,aAAY2E,OAAOm7E,EAAgBj3D,MAAMhkB,KAAKoS,GAAMA,EAAE3Z,GAAG0C,UAAS,SAItI,CAEO+/E,WACL/iC,EACAC,EACAC,EACA2V,GAAsB,EACtBmtB,EAAuB,GAEvB,MAAM3iC,EAA2B,CAC/BhgD,EAAG,gBACH2/C,MACAC,OACAC,mBAGF,OAAOv8C,KAAK2T,WAAWC,UAAU,sBAAuB,CACtD8oC,YACAwV,eACCrtD,MAAMgkB,IACP7oB,KAAKge,kBAAkBmV,qBAAqBtK,GACrCA,IAEX,CA0BOy2D,eAAerlE,EAAekC,EAAQ,IAE3C,MAAM2X,GAAW,EAAAuoC,GAAA,GAAcpiD,GAC/B,GAAG6Z,EAASt3B,QAAUs3B,EAAS,GAAGt3B,SAAWyd,EAAMmzB,OAAO5wC,QAA4B,qBAAlBs3B,EAAS,GAAGp3B,EAC9E,IACE,MACMmT,EADM,IAAImpB,IAAI+J,GAAQ9oB,GAAOxc,KAClB8lC,SAAS/7B,MAAM,GAC7BqI,IACDoK,EAAQpK,EAEC,CAAX,MAAMxG,GAAK,CAGf,OAAOrJ,KAAK2T,WAAWytB,mBAAmB,kBAAmB,CAC3D8L,EAAGjzB,EACHkC,SACC,CAACklB,aAAc,KAAKx8B,MAAMusB,IAC3BpxB,KAAKgoB,aAAaoJ,EAAM1Y,OACxB1Y,KAAKsc,gBAAgB2L,aAAamJ,EAAMlJ,OAE5B,CACVq3D,YAAY,EAAAtnD,GAAA,GAAa7G,EAAMmuD,WAAWr7E,KAAK21B,IAAM,EAAA96B,GAAA,GAAU86B,MAC/D30B,QAASksB,EAAMlsB,QAAQhB,KAAK21B,IAAM,EAAA96B,GAAA,GAAU86B,QAKlD,CAEQ4jD,iBAAiBt+E,EAAgBmxB,EAAoBkvD,EAAex/E,KAAKswB,UAAUnxB,IACtFmxB,IAAckvD,IACZlvD,EACDtwB,KAAKo7E,YAAYj8E,GAEjBa,KAAK87E,WAAW38E,GAGlBa,KAAKs7E,qBAELt7E,KAAK+c,UAAUrW,cAAc,kBAAmBvH,GAEpD,CAEOw/B,eAAeC,GACpB,OAAO5+B,KAAK2T,WAAWC,UAAU,yBAA0B,CACzDgrB,aACC/5B,MAAMsQ,IACPnV,KAAK0vE,YAAYv6D,EAAK,GAE1B,CAEOsqE,cAActgF,EAAgBugF,GACnC,GAAG1/E,KAAKmwB,MAAMhxB,GACZ,OAGF,MAAMgW,EAAOnV,KAAK0Y,MAAMvZ,GACxB,GAAGgW,EAAM,CACP,MAAM1O,EAAqBi5E,EAAU,CACnChjF,EAAG,oBACHo+E,YAAY,EAAAx3D,GAAA,IAAM,IAChB,CACF5mB,EAAG,mBACHm+E,SAAS,EAAAv3D,GAAA,IAAM,GAAQ,IAGzBnO,EAAK1O,OAASA,EAEdzG,KAAK+c,UAAUrW,cAAc,cAAevH,GAE5Ca,KAAK+6E,uBAAuB5lE,E,CAEhC,CAEOwqE,qBAAqBD,GAE1B,OADA1/E,KAAKy/E,cAAcz/E,KAAKid,UAAUtgB,GAAI+iF,GAC/B1/E,KAAK2T,WAAWge,gBAAgB,uBAAwB,CAAC+tD,WAClE,CAEOE,WAAWzgF,EAAgBsgD,EAAoBC,EAAmB6J,EAAes2B,GAStF,OAAO7/E,KAAK2T,WAAWC,UAAU,sBAAuB,CACtDjX,GAAIqD,KAAK66B,aAAa17B,GACtBsgD,aACAC,YACA6J,QACAu2B,4BAA6BD,IAC5Bh7E,MAAMgkB,IACP7oB,KAAKge,kBAAkBmV,qBAAqBtK,EAAS,CAACmL,UAAU,IAEhEh0B,KAAKy9E,iBAAiBt+E,GAAQ,EAAK,GAEvC,CAEO4gF,eAAetnE,GACpB,OAAOzY,KAAK2T,WAAWC,UAAU,0BAA2B,CAC1DjX,GAAI8b,EAAQvU,KAAK/E,GAAWa,KAAK66B,aAAa17B,OAC7C0F,MAAMgkB,IACP7oB,KAAKge,kBAAkBmV,qBAAqBtK,EAAS,CAACmL,UAAU,IAEhEvb,EAAQ5Z,SAASM,IACfa,KAAKy9E,iBAAiBt+E,GAAQ,EAAM,GACpC,GAEN,CAEO+hC,cAActC,GACnB,OAAO5+B,KAAK2T,WAAWC,UAAU,wBAAyB,CAACgrB,YAC7D,CAEOgD,eAAehD,EAAkBiD,GACtC,OAAO7hC,KAAK2T,WAAWC,UAAU,yBAA0B,CAACgrB,WAAUiD,UACxE,CAEOC,iBAAiBo4C,GACtB,OAAOl6E,KAAK2T,WAAWC,UAAU,2BAA4B,CAACgI,MAAOs+D,GACvE,CAEO/X,cAAchjE,GACnB,OAAO,EAAAgjE,GAAA,GAAcniE,KAAK69C,QAAQ1+C,GACpC,EEjhCF,MAAM6gF,GAAe,IAAI7hF,IAAI,CAAC,QAAS,QAAS,MAAO,aAIhD,MAAM8hF,WAA2BxtE,EAAxC,c,oBACU,KAAAytE,SAEJ,CAAC,EACG,KAAAC,gBAEJ,CAAC,CAoHP,CAlHYrjE,QACR9c,KAAKge,kBAAkBC,2BAA2B,CAChDmiE,cAAgB/lE,IACdra,KAAKq7D,YAAYhhD,EAAOuyC,QAAQ,GAGtC,CAEOyO,YAAYglB,EAAqBllB,EAAgCH,G,QACtE,GAAoB,uBAAjBqlB,EAAW3jF,GAA+C,iBAAjB2jF,EAAW3jF,EAAsB,OAC7E,MAAM,GAACC,GAAM0jF,EAEPC,EAAatgF,KAAKkgF,SAASvjF,GAC3B4jF,EAAYD,GAChBA,EAAW5jF,IAAM2jF,EAAW3jF,GAC3B4jF,EAA+Br/C,MAAUq/C,EAA+Br/C,KAE3E,GAAoB,YAAjBo/C,EAAW3jF,EAAiB,CACF,WAAR,QAAhB,EAAA2jF,EAAW5nD,aAAK,eAAE/7B,GACnB2jF,EAAW5nD,MAAQz4B,KAAK+8C,iBAAiBC,UAAUqjC,EAAW5nD,MAAOuiC,UAE9DqlB,EAAW5nD,MAGU,cAAR,QAAnB,EAAA4nD,EAAW15C,gBAAQ,eAAEjqC,GACtB2jF,EAAW15C,SAAW3mC,KAAK23C,eAAe7H,QAAQuwC,EAAW15C,SAAUq0B,IAEhD,aAApBqlB,EAAWviF,aACLuiF,EAAWviF,YAGbuiF,EAAW15C,UAGpB,MAAM65C,EAAWH,EAAWI,UACtBC,EAAaL,EAAWh1D,OAASg1D,EAAWM,QAAUH,GAAY,GACrEA,GAAYE,IAAeF,UACrBH,EAAWI,UAKhBT,GAAavhF,IAAI4hF,EAAWviF,OAC7BuiF,EAAWzgC,cACZygC,EAAW5nD,QACX4nD,EAAWviF,KAAO,Q,CAItB,IAAI8iF,EAAa5gF,KAAKmgF,gBAAgBxjF,GAYtC,GAXGw+D,IACGylB,IAAYA,EAAa5gF,KAAKmgF,gBAAgBxjF,GAAM,IAAIwB,KAC5DyiF,EAAW9hF,IAAIq8D,SAGCl8D,IAAfqhF,EACDtgF,KAAKkgF,SAASvjF,GAAM0jF,EAEpB7oE,GAAkB8oE,EAAYD,IAG5BllB,QAA6Bl8D,IAAf2hF,GAA4BL,EAAW,CACvD,MAAM53B,EAA8D,GACpEi4B,EAAW/hF,SAASuF,IAClB,MAAOpF,EAAQunB,EAAKwjC,GAAe3lD,EAAMxE,MAAM,KAC/C+oD,EAAKroD,KAAK,CACRtB,OAAQA,EAAOK,WACfknB,KAAMA,EACNwjC,cAAeA,GACf,IAGJ/pD,KAAK+c,UAAUrW,cAAc,kBAAmB,CAC9C/J,KACAgsD,Q,CAIJ,OAAO03B,CACT,CAEOjlB,+BAA+Bp8D,EAAgBunB,EAAawjC,GACjE,OAAO/qD,EAAS,IAAMunB,GAAOwjC,EAAc,KAAO,GACpD,CAEOuc,yBAAyBhY,EAAkB6M,GAChD,MAAMx+D,EAAM2xD,EAA4B3xD,GACxC,IAAIA,EAAI,OAER,MAAMqL,EAAMhI,KAAKmgF,gBAAgBxjF,GAC9BqL,GAAOA,EAAIvJ,IAAI08D,KAChBnzD,EAAInE,OAAOs3D,GAEPnzD,EAAIoL,aACCpT,KAAKmgF,gBAAgBxjF,GAGlC,CAEOmwD,iBAAiBnwD,GACtB,OAAOqD,KAAKkgF,SAASvjF,EACvB,CAEOkkF,WAAWpjF,GAChB,OAAOuC,KAAK2T,WAAWm/B,kBAAkB,CACvCjqC,OAAQ,sBACRi4B,cAAgBwtB,GACPtuD,KAAKq7D,YAAY/M,GAE1Bt6C,OAAQ,CACNvW,QAGN,E,0BCrIa,SAASqjF,GAAsB/nD,GAC5C,OAAO,EAAAgoD,GAAA,GAAWhoD,EAAM,oBAC1B,C,0BCVe,SAASioD,GAAYxtC,GAElC,OAAOz1C,mBAAmBy1C,GAAU13C,QAAQ,SAAUmlF,QAAQnlF,QAAQ,MAAO,MAC/E,CCOe,MAAMolF,GACnBphF,YACUqhF,EACAvjF,GADA,KAAAujF,mBAAAA,EACA,KAAAvjF,WAAAA,EAERoC,KAAKmhF,mBAAqBC,IAC5B,CAEaC,MAAM1gC,EAAkBx0B,G,qCACnC,OAAOnsB,KAAKmhF,mBAAmB3uB,OAAO,gBAAiB,CACrD71D,GAAIqD,KAAKpC,WACT0jF,MAAO3gC,GAEX,E,+RAEOkN,SAAS0zB,GACd,OAAOvhF,KAAKmhF,mBAAmB3uB,OAAO,mBAAoBxyD,KAAKpC,YAAYiH,MAAK,KAAe,GACjG,ECda,MAAM28E,GACZC,QAAQjuC,GACb,OAAO7xC,QAAQC,QAAO,EAAA2V,EAAA,GAAU,kBAClC,CAEOmqE,gBAAe,SAACluC,EAAQ,WAAE51C,EAAU,KAAEwV,IAK3C,MAAMuuE,EAAU,OAAH,QACX,eAAgB,0CAChB,sBAAuB,gCAAoCX,GAAYxtC,IACnEpgC,EAAO,CAAC,iBAAkBA,GAAQ,CAAC,GAGnC+tE,EAAqBC,KACrB13E,EAAUy3E,EAAmB3uB,OAAO,WAAY,CACpDmvB,UACAhlF,GAAIiB,IAGApE,GAAW,SAWjB,OAVAA,EAASooF,OAAS,KAChBpoF,EAASoI,QAAO,EAAA2V,EAAA,GAAU,qBAAqB,EAGjD/d,EAASwU,OAAM,KACbozE,KAAwB5uB,OAAO,iBAAkB50D,EAAW,IAG9D8L,EAAQ7E,KAAKrL,EAASyI,QAASzI,EAASoI,QAEjC,CACLpI,WACAqoF,UAAW,IACF,IAAIX,GAAeC,EAAoBvjF,GAGpD,E,2SCmCF,MAEMkkF,GAAgB,OAOhBC,GAAgC,IAAI5jF,IAAI,CAC5C,oBACA,kBACA,UACA,mBAGK,MAAM6jF,WAAuBvvE,EAApC,c,oBACU,KAAAwvE,aAAe,IAAI,KAAuB,eAC1C,KAAAC,gBAAkB,IAAIV,GAEtB,KAAAW,iBAEJ,CAAC,EAMG,KAAAC,eAEJ,CAAC,EAEG,KAAAC,cAWJ,CAAC,EACG,KAAAC,gBAA4C,CAAC,EAE9C,KAAAC,yBAKH,CAAC,EAEG,KAAApiF,KAAiC,EAAAqI,EAAA,IAAO,MAAO,WAAiB,KAAAD,KAChE,KAAAolD,OAAS,EACT,KAAAxb,QAAU,EACV,KAAA9pC,MAAQ,UAER,KAAAm6E,eAAiB,IACjB,KAAAC,iBAAmB,IA4MnB,KAAAC,cAAgB,CAAC51E,EAAmB0mC,IAGnCxzC,KAAKsU,aAAaC,aAAa,iBAAkBzH,EAAMtF,QAAQwB,QAAQ,GAGxE,KAAA25E,cAAgB,CAAC71E,EAAmB0mC,KAG1C,MAAMxqC,EAAS8D,EAAMtF,QAAQwB,OAC7B,OAAGnD,IAAiB9K,WACXiF,KAAKsU,aAAaC,aAAa,iBAAkBvL,GAAQ,GAAMnE,MAAMzJ,GCnWnE,SAAuBA,GACpC,MAAMwnF,EAAWxnF,EAAKX,QAAQ,QACd,IAAbmoF,IACDxnF,EAAOA,EAAKoM,MAAMo7E,IAGpB,MAAOlmF,EAAGmmF,EAAIpwC,EAAOC,GAAUt3C,EAAKN,MAAM,mBAAmB,GAAG8E,MAAM,KAEtE,OADOxE,EAAKU,QAAQ,IAAK,WAAW22C,cAAkBC,OAAY52C,QAAQ,gBAAiB,GAE7F,CD2VegnF,CAAc1nF,KACpByJ,MAAMzJ,IACa,IAAI2nF,aACLz2E,OAAOlR,KAIvB4E,KAAKsU,aAAaC,aAAa,iBAAkBvL,GAAQ,EAA6B,EAGvF,KAAAg6E,YAAc,CAACl2E,EAAmB0mC,IACvB,kBACDgf,OAAO,cAAe,CAAChf,WAAU1mC,UAG3C,KAAAm2E,YAAc,CAACn2E,EAAmB0mC,IACvB,kBACDgf,OAAO,cAAe,CAAChf,WAAU1mC,SAgiBrD,CAtwBYgQ,QACR89D,aAAY,KACV,IAAI,MAAMxjE,KAAOpX,KAAKuiF,yBAA0B,CAC9C,MAAM,SAAC/oF,GAAYwG,KAAKuiF,yBAAyBnrE,IAC9C5d,EAASwY,aAAexY,EAASyY,oBAC3BjS,KAAKuiF,yBAAyBnrE,E,IAGxC,MAEHpX,KAAK+c,UAAU1W,iBAAiB,UAAWkwD,IACzCv2D,KAAKkjF,YAAc3sB,EAAO4sB,aAAa,IAGzCnjF,KAAK+c,UAAU1W,iBAAiB,cAAew9D,IAC7C7jE,KAAKwiF,eAAiBxiF,KAAK+c,UAAU3W,QAAUy9D,EAAUuf,6BAA+Bvf,EAAUwf,6BAClGrjF,KAAKyiF,iBAAmB5e,EAAUuf,4BAA4B,GAElE,CAIQE,gBAAgBp7E,EAAuBvL,EAAYi6B,EAAwC2sD,EAAqBpxC,EAAkB,QACxGlzC,IAA7Be,KAAKqiF,cAAcn6E,KACpBlI,KAAKqiF,cAAcn6E,GAAQ,GAC3BlI,KAAKsiF,gBAAgBp6E,GAAQ,GAG/B,MAAMs7E,EAAexjF,KAAKqiF,cAAcn6E,GAElCwB,EAAU,IAAI/H,SAA6B,CAACM,EAASL,KACzD4hF,EAAaljF,KAAK,CAAC3D,KAAIw1C,UAASvb,KAAIp9B,SAAU,CAACyI,UAASL,UAAS2hF,eAAa,IAOhF,OAJAxhF,YAAW,KACT/B,KAAKyjF,cAAcv7E,EAAK,GACvB,GAEIwB,CACT,CAEQ+5E,cAAcv7E,GACpB,MAAMs7E,EAAexjF,KAAKqiF,cAAcn6E,GAClCw7E,EAAgD1jF,KAAK+c,UAAU3W,QAlG1C,IAFA,GAuG3B,GAAGpG,KAAKsiF,gBAAgBp6E,IAASw7E,KAAkBF,aAAY,EAAZA,EAAchnF,QAC/D,OAAO,EAIT,MAAM6N,GAAO,EAAAmkB,GAAA,GAAcg1D,GAAexnE,GAAoB,IAAdA,EAAEm2B,YAAkB,EAAA3jB,GAAA,GAAcg1D,GAAexnE,GAAMA,EAAEm2B,UAAYnyC,KAAKmyC,WAAYqxC,EAAav1E,QAC7Is1E,EAAcl5E,EAAKk5E,aAAe,EAExCvjF,KAAKsiF,gBAAgBp6E,IAASq7E,EAE9B,MAAM75E,EAAUW,EAAKusB,KAKhBltB,EAAQ7E,MAAK,KAChB7E,KAAKsiF,gBAAgBp6E,IAASq7E,EAC9BvjF,KAAKyjF,cAAcv7E,EAAK,IAGtBvK,KACEA,aAAK,EAALA,EAAOG,OAASikF,GAActjF,IAAId,EAAMG,OAC1CkC,KAAKG,IAAIxC,MAAM,uBAAwBA,GAGzCqC,KAAKsiF,gBAAgBp6E,IAASq7E,EAC9BvjF,KAAKyjF,cAAcv7E,EAAK,IAGvBugC,SAAQ,KACT/+B,EAAQ7E,KAAKwF,EAAK7Q,SAASyI,QAASoI,EAAK7Q,SAASoI,OAAO,GAE7D,CAEO+hF,WAAWxxC,GAEhBnyC,KAAKmyC,QAAUA,CACjB,CAEQyxC,iBACN,OAAO5jF,KAAKiiF,YACd,CAEO4B,eAAerwC,GACpB,MAAM/nB,EAAW,CAACzrB,KAAKmiF,iBAAiB3uC,GAAWxzC,KAAKoiF,eAAe5uC,IAAW32C,OAAOC,SACzF,IAAIgnF,GAAW,EACf,IAAI,IAAIp+E,EAAI,EAAGlJ,EAASivB,EAASjvB,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CACxD,MAAMgE,EAAU+hB,EAAS/lB,IACtBgE,GAAYA,EAAQuI,YAAevI,EAAQsI,cAC5CtI,EAAQk4E,SACRkC,GAAW,E,CAIf,OAAOA,CACT,CAEOC,mBAAmB77E,EAAY5L,EAAgC6vB,EAAgBhQ,EAAexf,EAAK,EAAGw1C,EAAU,EAAG6xC,GACxH,OAAOhkF,KAAKsjF,gBAAgBp7E,EAAMvL,GAAI,IAAW,mCAG/C,OAFAqnF,SAAAA,IAEOhkF,KAAK2T,WAAWC,UAAU,oBAAqB,CACpDtX,WACA6vB,SACAhQ,SACC,CACDjU,OACA+7E,cAAc,GAElB,KAAGjkF,KAAKkkF,SAAS/nE,GAAQg2B,EAC3B,CAEO0B,gBACL3rC,EACA5L,EACA6vB,EACAhQ,EACAxf,EAAK,EACLw1C,EAAU,EACV6xC,GAEA,OAAOhkF,KAAKsjF,gBAAgBp7E,EAAMvL,GAAI,IAAW,mCAC/CqnF,SAAAA,IAEA,MAAMxxB,EAAS,IAAkC,mC,MAC/CwxB,SAAAA,IAGA,MAAMpuE,EAAoF,QAAvE,EAAAtZ,EAAyD0zC,sBAAc,eAAExoC,QAY5F,OATAxH,KAAK2T,WAAWC,UAAU,iBAAkB,CAC1CtX,WACA6vB,SACAhQ,SACC,CACDjU,OACA+7E,cAAc,IAGDj2E,OAAO3E,IAGpB,GAFA26E,SAAAA,IAEgB,2BAAb36E,EAAIvL,KACL,OAAOkC,KAAKqW,iBAAiB/Z,EAAyDsZ,GAAW/Q,KAAK2tD,GAGxG,MAAMnpD,CAAG,GAEb,KAEA,EAAA0e,GAAA,GAAwDzrB,GACxD,MAAMsZ,EAAYtZ,EAAS0zC,eAC3B,GAAGp6B,IAActZ,EAAS6nF,iBAAkB,CAC1C7nF,EAAS6nF,kBAAmB,EAC5B,MAAM/sE,EAAMvK,EAAW+I,GACvB,GAAG5V,KAAKuiF,yBAAyBnrE,GAC/B,OAAOpX,KAAKqW,iBAAiB/Z,EAAUsZ,GAAW/Q,KAAK2tD,E,CAI3D,OAAOA,GACT,KAAGxyD,KAAKkkF,SAAS/nE,GAAQg2B,EAC3B,CAMQ+xC,SAASp3E,GACf,OAAOA,EAAQg1E,EACjB,CAEQsC,aAAahxE,EAAcixE,GACjC,IAAIjxE,EACF,OAhPgB,OAqPlB,IAAItG,EAAQg1E,GAEZ,MAAMwC,EAAWD,EAAWrkF,KAAKwiF,eAAiBxiF,KAAKyiF,iBACjD8B,EAAcF,EA1PU,OADE,QA6PhC,KAAOjxE,EAAOtG,EAASw3E,GAAYx3E,EAAQy3E,GACzCz3E,GAAS,EAMX,OAAOA,CACT,CAkCQuJ,iBACNmuE,EACA5uE,EACAwB,EAAMvK,EAAW+I,IAEjB,IAAIxQ,EAAIpF,KAAKuiF,yBAAyBnrE,GACtC,IAAIhS,EAAG,CACL,MAAM5L,GAAW,SAEjB4L,EAAIpF,KAAKuiF,yBAAyBnrE,GAAO,CACvC5d,YAaFwG,KAAKiwC,kBAAkB55B,iBAAiBT,GAAW/Q,MAAM+Q,IACpDwB,IAAQvK,EAAW+I,IACpBpc,EAASoI,QAAO,EAAA2V,EAAA,GAAU,+BAG5B/d,EAASyI,QAAQ2T,EAAU,GAC1Bpc,EAASoI,O,CAId,OAAOwD,EAAE5L,SAASqL,MAAM+Q,IACtB4uE,EAAkBx0C,eAAiBp6B,CAAS,GAEhD,CAEO6uE,cAAcjxC,GACnB,QAASxzC,KAAKmiF,iBAAiB3uC,EACjC,CAEOkxC,YAAYlxC,GACjB,OAAOxzC,KAAKmiF,iBAAiB3uC,EAC/B,CAEOmxC,UAAUnxC,GACf,OAAOxzC,KAAKoiF,eAAe5uC,EAC7B,CAEQoxC,iBAAiBvM,GACvB,IAAIlsE,EAeJ,MAdgB,gCAAbksE,GACDlsE,EAAUnM,KAAK2iF,cACftK,EAAW,iBACU,eAAbA,GAA8BxyE,IAAiBkrC,kBAGlC,4BAAbsnC,GACRlsE,EAAUnM,KAAK0iF,cACfrK,EAAW,oBACU,cAAbA,GAA6BxyE,IAAiBg/E,oBACtD14E,EAAUnM,KAAKijF,YACf5K,EAAW,cAPXlsE,EAAUnM,KAAKgjF,YACf3K,EAAW,aASN,CAACA,WAAUlsE,UACpB,CAEQ24E,yBAAyBC,EAAqB3xE,EAAcylB,GAClE,MAAMmsD,EAAqB,GAC3B,IAEEC,EAFE94D,EAAS44D,EACTG,EAAyCvjF,QAAQM,UAErD,GACEgjF,GAAgB,SAChBD,EAAQ1kF,KAAK,CAAC6rB,SAAQ+4D,eAAcD,kBACpCC,EAAeD,EACf94D,GAAU0M,QACJ1M,EAAS/Y,GAEjB,OAAO4xE,CACT,CAEOl0E,SAASrV,G,QACd,MAAM2X,EAAmB,QAAZ,EAAA3X,EAAQ2X,YAAI,QAAI,GACvB,KAAClL,EAAI,SAAE5L,GAAYb,EACzB,IAAI,WAACmC,GAAcnC,EAChBmC,IAAewjF,OAChBphF,KAAKG,IAAIxC,MAAM,4BAA6BlC,GAC5CmC,OAAaqB,GAGf,MAAMkmF,EAAmB1pF,EAAQ48E,SAC3B+M,EAAgBplF,KAAK4kF,iBAAiBO,IACtC,QAACh5E,GAAWi5E,EAClB3pF,EAAQ48E,SAAW+M,EAAc/M,UAAY,aAE7C,MAAM7kC,GAAW,EAAA6xC,GAAA,GAA+B5pF,GAC1C6pF,EAAgB1nF,GAAa,EAAAynF,GAAA,GAA+B,OAAD,yBAAK,EAAA12D,GAAA,GAAKlzB,IAAQ,CAAEmC,gBAAYqB,KAAcu0C,EACzGyuC,EAA4BjiF,KAAK4jF,iBACjC1B,EAA+BtkF,EAAaoC,KAAKkiF,qBAAkBjjF,EACzE,IAAIzF,EAA4BoE,OAAaqB,EAAYe,KAAKmiF,iBAAiB3uC,GAI/E,GAFAxzC,KAAKqI,OAASrI,KAAKG,IAAI,eAAgBqzC,EAAU/3C,GAE9CjC,EACD,OAAOA,EAuBT,MAAM+rF,EAAe,CAACp9C,EAA4BxqC,KAChD,KAAGwqC,aAAI,EAAJA,EAAMxqC,OAIT,IAAI,MAAMk8B,KAAK2rD,EACVr9C,GAAQA,IAAStO,IAIpBA,EAAEl8B,MAAQA,EACVk8B,EAAErgC,SAASoI,OAAOjE,G,EAIhBhB,EAAKqD,KAAK2tD,SACV90B,EAAYp9B,EAAQo9B,WAAa74B,KAAKokF,aAAahxE,GAAM,GAE/D,IAEIqyE,EACFC,EAHEjE,EAAkCQ,EAAaR,QAAQ5iE,KAAKojE,GAIhE,MAAMuD,EAAqC,GACrCG,EAAevyE,GAAQylB,EAIvB5B,EAAS,CAACkR,EAA4BqL,KAC1C,MAAM,SAACh6C,GAAY2uC,EACby9C,EAAgBL,EAAa1mE,KAAK,KAAMspB,GAE9C3uC,EAASooF,OAAS,IAAMpoF,EAASoI,QAAO,EAAA2V,EAAA,GAAU,sBAClD/d,EAASwU,OAAOrQ,I,QACdioF,EAAcjoF,GACO,QAArB,EAAW,QAAX,EAAAwqC,EAAK09C,cAAM,eAAEC,gBAAQ,gBAAI,IACxBr9C,SAAQ,KACNzoC,KAAKmiF,iBAAiB3uC,KAAch6C,UAC9BwG,KAAKmiF,iBAAiB3uC,UAGxBrL,EAAK09C,MAAM,IAIpB7lF,KAAKmiF,iBAAiB3uC,GAAYh6C,EAElCgsF,EAASllF,KAAK6nC,EAAK,EAQrB,GALG85C,KAAkBC,GAAmByD,GAAgB,QACtDF,EAAgBxD,EAAaP,eAAe4D,EAAeK,EAAclqF,EAAQ48E,UACjFphD,EAAOwuD,EAAeH,IAGrBpD,EAAiB,CAClB,IAAI6D,EAAmBtqF,EAAQ+3C,SAC/B,IAAIuyC,EAAkB,CACpBA,EAAmBT,EACnB,MAAM/oF,EAAM2yC,GAAwBzzC,EAAQ48E,UACzC97E,IACDwpF,GAAoB,IAAMxpF,E,CAI9BmpF,EAAmBxD,EAAgBR,eAAe,CAChDluC,SAAUuyC,EACVnoF,aACAwV,KAAMuyE,IAER1uD,EAAOyuD,EAAkBlyC,GAEtBiyC,GACDC,EAAiBlsF,SAASwU,OAAO3E,GAAQo8E,EAAcjsF,SAASoI,OAAOyH,I,CAW3E7P,EAAqC,QAA1B,EAAAksF,aAAgB,EAAhBA,EAAkBlsF,gBAAQ,QAAIisF,EAAcjsF,SAEpD0oF,GAAmB/1E,IACpBs1E,EAAUS,EAAgBT,QAAQ5iE,KAAKqjE,IAGzCT,EAAQ6D,GAAezgF,MAAWk0B,GAAe,mCAY/C,GAXAirD,IAWG0B,EAAkB,CACnB,MAAMG,EAASH,EAAiBG,OAASH,EAAiB7D,YAC1DmC,IAEA,MAAMn5E,QEjmBC,SAA8BkuB,GAC3C,OAAO+nD,GAAsB/nD,GAAMl0B,MAAMmE,GAAW,IAAIG,WAAWH,IACrE,CF+lB0Bg9E,CAAqBjtD,GACvCirD,UACM6B,EAAOxE,MAAMx2E,GACnBm5E,IAEA0B,EAAiBlsF,SAASyI,cAAc4jF,EAAOh4B,W,CAG9C43B,GACDA,EAAcjsF,SAASyI,QAAQ82B,EAEnC,MAAG/qB,OAAY3E,GAAkB,mCAC/B,GAAG5N,EAAQ22C,UAET,YADAmzC,EAAa,KAAMl8E,GAIrBm8E,EAAS3mF,SAASg7B,IAChBA,EAAEgsD,OAAShsD,EAAEgoD,WAAW,IAG1B,MAEMoE,EAA2B,yBAAf3pF,EAASI,EACrBwpF,GAAeD,EAAYjmF,KAAK+jF,mBAAqB/jF,KAAK6zC,iBAAiBh1B,KAAK7e,MAEnFimF,QAAkChnF,IAArBe,KAAKkjF,oBACbljF,KAAK2T,WAAW+c,YACtBszD,KAGF,MAAMgB,EAAUhlF,KAAK8kF,yBAAyB,EAAG1xE,EAAMylB,GAEjD64B,EAAqB,CAACG,KAAM,EAAG1lC,OAAQ,EAAG2lC,MAAO1+C,EAAMogC,YACvD2yC,EAAmB,KACvB,IACEnC,IACAtyB,EAASG,KAAOA,EAChB7xD,KAAK+c,UAAUrW,cAAc,oBAAqBgrD,EACvC,CAAX,MAAMroD,GAAK,GAGT+8E,GAA4B,EAAApe,GAAA,GAASme,EAAkB,IAAI,GAEjE,IAAIt0B,EAAO,EACX,MAAMw0B,EAAa,IAAW,mCAC5B,MAAM,OAACl6D,EAAM,aAAE+4D,EAAY,cAAED,GAAiBD,EAAQ/2E,QACtD,IACE+1E,IAEoBr/E,YAAYC,MAAhC,MACMxC,QAAe8jF,EAAYh+E,EAAM5L,EAAiB6vB,EAAQ0M,EAAWl8B,EAAIlB,EAAQ02C,QAAS6xC,GAG1Fl3E,GAFcnI,YAAYC,MAElBxC,EAAO0K,OAElBk4E,EAAQxoF,QACT6pF,IAGF,MAAM/7E,EAAawC,EAAMxC,WACzBtK,KAAKqI,OAASrI,KAAKG,IAAI,uCAAwCqzC,EAAUpxC,GACzE,MAAMkkF,EAAWn6D,EAAS0M,GAAczlB,IAAS9I,EACjD,GAAGA,EAAY,CACbunD,GAAQvnD,EAELg8E,EACDH,IAEAC,IAGqBzhF,YAAYC,YAC7BsgF,EACNlB,IACuBr/E,YAAYC,MAEtBD,YAAYC,YACnBjD,QAAQyQ,IAAIozE,EAASthF,KAAI,EAAE2hF,YAAYA,aAAM,EAANA,EAAQxE,MAAMv0E,EAAOqf,MAClE63D,G,CAUF,GANGsC,KACGlzE,GAAQy+C,EAAOz+C,IACjBoyE,EAAS3mF,SAAQ,EAAEgnF,aAAW,MAAC,OAAY,QAAZ,EAAAA,aAAM,EAANA,EAAQz4C,YAAI,sBAAGykB,EAAK,IAIpDy0B,GAAWn6E,EAAS,CACrB,MAAMsf,EAAW+5D,EAChB3oF,QAAO,EAAEgpF,aAAYA,aAAM,EAANA,EAAQU,WAAYV,EAAOW,eAChDtiF,KAAI,EAAO2hF,YAAY,mCACtB,MAAM/4E,EAAQ+4E,EAAOU,WACfE,QAAwBt6E,EAAQW,EAAOw4E,GAC7CO,EAAOW,aAAaC,EACtB,YAEM9kF,QAAQyQ,IAAIqZ,GAClBu4D,G,CAKF,GAFAiB,EAAchjF,UAEXqkF,EAAS,CACV,MAAM/E,EAAgB1vB,GAAQ,KAC9B2zB,EAAS3mF,SAASspC,IAChB,MAAM,SAAC3uC,EAAQ,OAAEqsF,GAAU19C,EAC3B,GAAG3uC,EAASwY,aAAexY,EAASyY,aAAe4zE,EACjD,OAGF,MAAMzjF,EAASyjF,EAAOh4B,SAAS0zB,GAC/B/nF,EAASyI,QAAQG,EAAO,G,EAG5B,MAAMiH,GACNk8E,EAAa,KAAMl8E,E,CAEvB,IAEA,IAAI,IAAI3D,EAAI,EAAGlJ,EAAS+jB,KAAKC,IApGTkpD,IAoG0Bsb,EAAQxoF,QAASkJ,EAAIlJ,IAAUkJ,EAC3E2gF,GAEJ,MAAGr4E,MAAMshD,GAAA,GAET,MAAM00B,EAAc,KAClB,GA/M2BwB,EAASr4D,QAAO,CAACC,EAAK+a,IAAS/a,MAAS+a,EAAKxqC,OAAO,KA+MvD6nF,EAAShpF,OAC/B,MAAMgpF,EAAS,GAAG7nF,K,EAItB,OAAOnE,CACT,CAEO64C,cAAc52C,GACnB,IAAI,MAACuc,EAAK,MAAE85B,GAASr2C,EACrB,MAAMq0D,EAAsB,UAAZ93C,EAAMtb,EACtB,GAAGozD,IAAYhe,EACb,OAAOnwC,QAAQC,OAAO,4BAIxB,MAAMguD,EAAyB,aAAZ53C,EAAMtb,EAEtBkzD,EAAY53C,EAAQhY,KAAK23C,eAAe1F,OAAQj6B,EAA4Brb,IACvEmzD,IAAS93C,EAAQhY,KAAK+8C,iBAAiBsW,SAAUr7C,EAAsBrb,KAE/E,MAAM,SAAC62C,EAAQ,gBAAE7a,IAAmB,EAAA+tD,GAAA,GAAwBjrF,GAE5D,IAAIiO,EAAU1J,KAAK0kF,YAAYlxC,GAY/B,OAXI9pC,IACFA,EAAU1J,KAAK8Q,SAAS6nB,GAErBi3B,IAAe9d,IAChB9xC,KAAK+c,UAAUrW,cAAc,uBAAyBsR,EAA4Brb,IAClF+M,EAAQsE,MAAMshD,GAAA,GAAM7mB,SAAQ,KAC1BzoC,KAAK+c,UAAUrW,cAAc,sBAAwBsR,EAA4Brb,GAAG,MAKnF+M,CACT,CAEOi9E,iBAAiBlrF,GACtB,MAAM,MAACuc,EAAK,MAAE85B,GAASr2C,EAEvB,IAAI23C,EAAepzC,KAAKyvC,cAAcmC,gBAAgB55B,EAAc85B,aAAK,EAALA,EAAOh0C,MAC3E,QAAIg0C,GAASsB,EAAaK,aAAe,SAAU3B,EAAQA,EAAM1+B,KAAO,KAAeggC,EAAa31C,IAC3FkE,QAAQM,QAAQmxC,EAAa31C,KAG/BuC,KAAKqyC,cAAc52C,GAASoJ,MAAMk0B,IACvC,IAAIqa,EAAaK,YAAcL,EAAaK,WAAa1a,EAAK3lB,KAAM,CAClE,MAAM3V,EAAMu7B,IAAIC,gBAAgBF,GAChCqa,EAAepzC,KAAKyvC,cAAcoC,mBAAmB75B,EAAco7B,EAAat1C,KAAML,EAAKs7B,EAAK3lB,K,CAGlG,OAAOggC,EAAa31C,GAAG,GAE3B,CAEOmpF,kBAAkBnrF,GACvB,OAAOuE,KAAKqyC,cAAc52C,GAASoJ,KAAKyqD,GAAA,EAC1C,CAEQzrD,OAAO2vC,GAEb,cADOxzC,KAAKmiF,iBAAiB3uC,GACtBxzC,KAAK4jF,iBAAiB//E,OAAO2vC,EACtC,CAEOziC,QAAO,KAACmuB,EAAI,SAAEsU,IACnBA,IAAAA,GAAa,EAAA0d,GAAA,GAAqBhyB,IAElC,MAAM2nD,EAAW3nD,EAAK9rB,KAChB0zE,EAAYD,GAAY,SACxBE,EAAW/mF,KAAKokF,aAAayC,GAAU,GACvCtD,EAAcvjF,KAAKkkF,SAAS6C,GAC5BC,EAAazmE,KAAK6qB,KAAKy7C,EAAWE,GAClCE,GAAS,UACTC,EAA6B,CACjCxqF,EAAGoqF,EAAY,eAAiB,YAChCnqF,GAAIsqF,EACJE,MAAOH,EACP/mF,KAAMuzC,EACN4zC,aAAc,IAGV5tF,GAAW,SACjB,GAAGwtF,EAAahnF,KAAKwiF,eAEnB,OADAhpF,EAASoI,QAAO,EAAA2V,EAAA,GAAU,iBACnB/d,EAGT,IAAIsqF,GAAW,EAAOuD,GAAW,EAC7B9B,EAAgB5nF,IACC,qBAAhBA,aAAK,EAALA,EAAOG,OACRkC,KAAKG,IAAIxC,MAAM,WAAYA,GAG7BnE,EAASoI,OAAOjE,GAChBmmF,GAAW,EACXyB,EAAej2B,GAAA,CAAI,EAGrB,MAAMzmD,EAASi+E,EAAY,yBAA2B,sBAChDnqF,EAAKqD,KAAK2tD,SAEV9zD,EAAOmG,KAuCPsnF,EAtCN,YACE,IAAIC,EAAQ,EAAGC,EAAY,EAC3B,IAAI,IAAIr7D,EAAS,EAAGA,EAAS06D,EAAU16D,GAAU46D,EAAU,CACzD,MAAMpmC,EAAO4mC,UACP1tF,EAAKypF,gBAAgB,SAAU3mF,GAAI,IAAW,mCAClDqnF,IAEA,MAAMjrD,EAAOmG,EAAK13B,MAAM2kB,EAAQA,EAAS46D,GACnC/9E,QAAe83E,GAAsB/nD,GAK3C,OAJAirD,IAEAnqF,EAAKwO,OAASxO,EAAKsG,IAAI,2BAA4B2mF,EAAWnmC,EAAM33C,EAAOsB,WAAY,IAAInB,WAAWH,GAAQxM,OAAQ,IAAI2M,WAAWH,GAAQxB,QAAQhL,QAE9I3C,EAAK8Z,WAAWC,UAAU/K,EAAQ,CACvC4+E,QAASR,EACTS,UAAW/mC,EACXgnC,iBAAkBX,EAClBl6E,MAAO9D,GACC,CACR4+E,YAAY,IACX/iF,MAAK,KACN,GAAGi/E,EACD,SAGA0D,EACF,MAAM91B,EAAqB,CAACG,KAAM21B,EAAYT,EAAU56D,SAAQ2lC,MAAO+0B,EAAUrzC,YACjFh6C,EAAS06C,OAAOwd,GAEb81B,GAAaR,IACdxtF,EAASyI,QAAQilF,GACjBG,GAAW,E,GAEZ9B,EACL,KAAGhC,GAAav1E,MAAMu3E,E,CAE1B,CAEWsC,GACL17E,EAAU,KACd,GAAG23E,EAAU,OACb,MAAM1+E,EAAIkiF,EAAG7tF,OACV2L,EAAEysD,MAAQiyB,GACZ1+E,EAAEhB,MAAwBS,KAAKsH,EAAQ,EAI1C,IAAI,IAAIzG,EAAI,EAAGlJ,EAAS+jB,KAAKC,IADTkpD,IAC0Bsd,GAAathF,EAAIlJ,IAAUkJ,EACvEyG,IAGF,MAAM63E,EAAc,KAClB,GAAGF,EACD,MAAM,EAAAvsE,EAAA,GAAU,kB,EAqBpB,OAjBA/d,EAASooF,OAAS,KACZkC,GAAauD,IACfvD,GAAW,EACXyB,GAAa,EAAAhuE,EAAA,GAAU,oB,EAI3B/d,EAAS06C,OAAUwd,IACjB1xD,KAAK+c,UAAUrW,cAAc,oBAAqBgrD,EAAS,EAG7Dl4D,EAASivC,SAAQ,KACZzoC,KAAKoiF,eAAe5uC,KAAch6C,UAC5BwG,KAAKoiF,eAAe5uC,E,IAIxBxzC,KAAKoiF,eAAe5uC,GAAYh6C,CACzC,E,qCG93Ba,MAAesuF,WAA0Br1E,EAwBtD3S,cACEmG,QAvBM,KAAA2O,OAA0C,CAAC,EAC3C,KAAAmzE,yBAEJ,CAAC,EACG,KAAAC,kBAEJ,CAAC,EACG,KAAAC,qBAUJ,CAAC,EAOHjoF,KAAKkoF,mBAAqB,CAC5B,CAIOhzE,QAAQC,GAEb,OAAOnV,KAAKmoF,YAAYhzE,EAAKxY,GAC/B,CAIOqyD,eAA8CnmD,EAAWmL,EAAkC,CAAC,EAAGvY,EAA4B,CAAC,GACjI,IAAI82D,EAAI92D,EAOR,OANA82D,EAAE61B,qBAAuB,MAAOpoF,KAAKkoF,mBAErC31B,EAAI,OAAH,UAAO92D,GACPA,EAAsBqS,UAAYykD,EAAE61B,qBAG9BpoF,KAAK4T,UAAU/K,EAAQmL,EAAQu+C,EACxC,CAEOzf,kBAAoDyf,G,QASjD,QAAR,EAAAA,EAAEv+C,cAAM,QAARu+C,EAAEv+C,OAAW,CAAC,GACL,QAAT,EAAAu+C,EAAE92D,eAAO,QAAT82D,EAAE92D,QAAY,CAAC,GAGf,MAAM,OAACuY,EAAM,QAAEvY,EAAO,OAAEoN,EAAM,UAAE6oB,GAAa6gC,EAEvC81B,EAAYrqF,KAAKC,UAAU+V,GACjC,IAAI4X,EAaJ,OAZG5rB,KAAK4U,OAAO/L,KACb+iB,EAAS5rB,KAAK4U,OAAO/L,GAAQw/E,GAC1Bz8D,IACE8F,UACM1xB,KAAK4U,OAAO/L,GAAQw/E,GAC3Bz8D,OAAS3sB,GAER+U,EAAeitB,KAAOrV,EAAOqV,OAK7BjhC,KAAK6gC,uBAA6B,CACvCh4B,SACAi4B,cAAgB1+B,IACd,GAAGA,EAAO1F,EAAEqyB,SAAS,eAEnB,OAAOnD,EAAOxpB,OAGhB,GAAGA,EAAO6+B,KAA+B,CACvC,MAAMA,EAAO7+B,EAAO6+B,KAEhBjhC,KAAK4U,OAAO/L,KAAS7I,KAAK4U,OAAO/L,GAAU,CAAC,GAChD+iB,EAAS5rB,KAAK4U,OAAO/L,GAAQw/E,GAAa,CACxCpnD,OACA7+B,S,CAIJ,GAAGmwD,EAAEzxB,cAAe,CAClB,MAAMwnD,EAAY/1B,EAAEzxB,cAAc1+B,GAClC,OAAOwpB,EAASA,EAAOxpB,OAASkmF,EAAYA,C,CAG9C,OAAOlmF,CAAM,EAEf4R,SACAvY,WAEJ,CAEOk2B,gBAA+C9oB,EAAWmL,EAAkC,CAAC,EAAUvY,EAA4B,CAAC,GACzI,MAAMyxC,EAAIrkC,EAAS,IAAM7K,KAAKC,UAAU+V,GAClC0U,EAAQ1oB,KAAKgoF,kBACnB,OAAGt/D,EAAMwkB,GACAxkB,EAAMwkB,GAGRxkB,EAAMwkB,GAAKltC,KAAK4T,UAAU/K,EAAQmL,EAAQvY,GAASgtC,SAAQ,YACzD/f,EAAMwkB,EAAE,GAEnB,CAEOrM,uBAAyD0xB,G,UAOtD,QAAR,EAAAA,EAAEv+C,cAAM,QAARu+C,EAAEv+C,OAAW,CAAC,GACL,QAAT,EAAAu+C,EAAE92D,eAAO,QAAT82D,EAAE92D,QAAY,CAAC,GAEf,MAAM,OAACoN,EAAM,cAAEi4B,EAAa,aAAEsuC,EAAY,OAAEp7D,EAAM,QAAEvY,GAAW82D,EACzD7pC,EAAQ1oB,KAAK+nF,yBACbQ,EAAW9sF,EAAQ8sF,UAAYvqF,KAAKC,UAAU+V,GAC9C9P,EAAmB,QAAb,EAAAwkB,EAAM7f,UAAO,QAAK6f,EAAM7f,GAAU,IAAI0I,IAC5Ci3E,EAAatkF,EAAIK,IAAIgkF,GAC3B,GAAGC,EACD,OAAOA,EAGT,MAAMC,EAAgB,KACpB,MAAM/+E,EAAUxF,EAAIK,IAAIgkF,GACxB,OAAO7+E,IAAYmwB,OAAI56B,EAAYyK,CAAO,EAItCg/E,EADkB1oF,KAAK4T,UAAU/K,EAAQmL,EAAQvY,GACCoJ,MAAMzC,GACrDqmF,KAAmB3nD,EAAc1+B,KACtCzE,IACF,MAAM+L,EAAU++E,IAChB,GAAG/+E,EACD,OAAOA,EAGT,IAAI0lE,EACF,MAAMzxE,EAGR,OAAOyxE,EAAazxE,EAAM,IAGtBk8B,EAAI6uD,EAAWjgD,SAAQ,KACxBvkC,EAAIK,IAAIgkF,KAAc1uD,IAIzB31B,EAAIL,OAAO0kF,GACPrkF,EAAIkP,aACCsV,EAAM7f,G,IAKjB,OADA3E,EAAI8D,IAAIugF,EAAU1uD,GACXA,CACT,CAEOuH,mBAAkDv4B,EAAWmL,EAAkC,CAAC,EAAUvY,EAAiF,CAAC,G,MACjM,MAAMitB,EAAyC,QAAjC,EAAA1oB,KAAKioF,qBAAqBp/E,UAAO,QAAK7I,KAAKioF,qBAAqBp/E,GAAU,CAAC,EACnFw/E,EAAYrqF,KAAKC,UAAU+V,GAC3Bm0B,EAAOzf,EAAM2/D,GACnB,GAAGlgD,KAAU1sC,EAAQu4B,WAAamU,EAAK88B,WACrC,OAAO98B,EAAKz+B,QAYd,IAAI1E,EATDvJ,EAAQu4B,WACNmU,GAAQA,EAAKnjC,UACdD,aAAaojC,EAAKnjC,gBACXmjC,EAAKnjC,gBAGPvJ,EAAQu4B,UAIdv4B,EAAQ4lC,eACTr8B,EAAU2J,EAAA,cAAe,YAChB+Z,EAAM2/D,EAAU,GACC,IAAvB5sF,EAAQ4lC,qBACJ5lC,EAAQ4lC,cAGjB,MAAM33B,EAAU1J,KAAK4T,UAAU/K,EAAQmL,EAAQvY,GAU/C,OARAitB,EAAM2/D,GAAa,CACjB5oD,UAAWnxB,KAAK1J,MAChBqgE,WAAW,EACXjgE,UACA0E,UACAsK,UAGKtK,CACT,CAEO6xB,WAA0C1yB,EAAWoa,GAC1D,MAAMyF,EAAQ1oB,KAAKioF,qBAAqBp/E,GACxC,GAAG6f,EACD,IAAI,MAAM2/D,KAAa3/D,EAAO,CAC5B,MAAMyf,EAAOzf,EAAM2/D,GACnB,IACKplE,EAAOklB,EAAKn0B,UACVm0B,EAAKnjC,SACND,aAAaojC,EAAKnjC,gBAGb0jB,EAAM2/D,G,CAEf,MAAMh/E,G,EAKd,CAEOqnB,UAAUgB,GACf,OAAG1xB,KAAKu2D,SAAW7kC,EACV1xB,KAAKu2D,OAGPv2D,KAAK6gC,uBAAuB,CACjCh4B,OAAQ,iBACRmL,OAAQ,CAAC,EACT8sB,cAAgBy1B,IACdv2D,KAAKu2D,OAASA,EACdv2D,KAAK+c,UAAUrW,cAAc,SAAU6vD,GAChCA,GAET96D,QAAS,CAACi2B,cAEd,CAEOoyC,aAAapyC,GAClB,OAAG1xB,KAAK6jE,YAAcnyC,EACb1xB,KAAK6jE,UAGP7jE,KAAK6gC,uBAAuB,CACjCh4B,OAAQ,oBACRmL,OAAQ,CAAC,EACT8sB,cAAgBy1B,I,MAId,OAHAv2D,KAAK6jE,UAAYtN,GACjB,SAA0D,QAAjC,EAAAA,EAAOoyB,kCAA0B,QAAI,IAC9D3oF,KAAK+c,UAAUrW,cAAc,aAAc6vD,GACpCA,CAAM,EAEf96D,QAAS,CAACi2B,cAEd,CAEOtV,SAASte,EAAoByI,GAClC,OAAO,EAAAymB,EAAA,GAAYhtB,KAAK8jE,gBAAiBD,IAYvCt9D,UAAAA,EAAcvG,KAAK+c,UAAU3W,SAE7B,MAAMsa,EAb4F,CAChGkoE,IAAK,CAAC,+BAAgC,gCACtCC,UAAW,CAAC,sCAAuC,uCACnDjvE,QAAS,CAAC,+BAAgC,gCAC1C++D,cAAe,CAAC,+BAAgC,gCAChDn4C,UAAW,CAAC,6BAA8B,8BAC1CsoD,IAAK,CAAC,6BAA8B,8BACpCC,SAAU,sBACV9pC,QAAS,CAAC,+BAAgC,iCAK9BnhD,GAEd,OAAO+lE,EADK/iE,MAAMiD,QAAQ2c,GAAKA,EAAEna,EAAY,EAAI,GAAKma,EACvB,GAEnC,E,sTCtQK,MAAMsoE,WAAmBlB,GA8B9BhoF,cACEmG,QACAjG,KAAKG,KAAM,EAAAqI,EAAA,IAAO,OAElBxI,KAAKipF,iBAAmB,CAAC,EACzBjpF,KAAKkpF,oBAAsB,CAAC,EAC5BlpF,KAAKmpF,kBAAoB,CAAC,EAC1BnpF,KAAKopF,SAAW,EAChBppF,KAAKqpF,oBAAsB,CAAC,EAE5BrpF,KAAK0Q,cAAgB,cAGrB,mBAAqC,aAAcA,IACjD1Q,KAAKspF,oBAAoB54E,EAAc,IAOzCkqE,aAAY,KACV56E,KAAK8jE,cAAa,EAAK,GAFW,MAItC,CAEUhnD,QACR9c,KAAKge,kBAAkBC,2BAA2B,CAChDsrE,aAAc,KACZvpF,KAAK0wB,WAAU,GACf1wB,KAAK8jE,cAAa,EAAK,IAI3B9jE,KAAK+c,UAAU1W,iBAAiB,aAAa,KACxCrG,KAAKu2D,QACNv2D,KAAKge,kBAAkBkX,mBAAmB,CAACx4B,EAAG,gB,IAIlDsD,KAAK+c,UAAU1W,iBAAiB,kBAAmBE,IACjDvG,KAAKwpF,mBAAkB,EAAE//E,YAAWiG,iBAAgBxH,OAAMwI,oBACxD,GAAsB,WAAnBhB,GAAiD,cAAlBgB,EAChC,OAGF,MAAMQ,EAAYzH,EAAUyH,UAC5B,GAAIA,GAKJ,GAAIA,EAA4B3D,WAAY,CAC1C,MAAM9P,EAAMkS,EAA8BzH,EAAMwH,EAAgBnJ,GAC/D2K,EAA4BhC,UAAUzR,E,OANvCuC,KAAKG,IAAIxC,MAAM,0BAA2B8L,E,GAQ5C,GAEN,CAqBQggF,iBAAiB/5E,GAUvB,OAHqC1P,KAAK0Q,aAI5C,CAEQ84E,kBAAkB/kF,GACxB,IAAI,MAAMiM,KAAiB1Q,KAAKipF,iBAAkB,CAChD,MAAMS,EAAc1pF,KAAKipF,iBAAiBv4E,GAC1C,IAAI,MAAMhB,KAAkBg6E,EAAa,CACvC,MAAMC,EAAMD,EAAYh6E,GACxB,IAAI,MAAMxH,KAAQyhF,EACGA,EAAIzhF,GACZrJ,SAAQ,CAAC4K,EAAWpF,EAAKwG,KAClCpG,EAAS,CACPgF,YACAvB,MAAOA,EACPwH,eAAgBA,EAChBgB,cAAeA,EACfvP,MAAOkD,EACPulF,MAAO/+E,GACP,G,EAKZ,CAEQ4F,aAAavI,EAAYwH,EAAgCgB,GAC/D,OAAO1Q,KAAK0R,eAAejB,aAAavI,EAAMwH,EAAgBgB,EAAkC,WAAnBhB,EAA6B1P,KAAK+c,UAAU3W,QAC3H,CAEOkjF,oBAAoB54E,GACzB,MAAMm5E,EAAmB7pF,KAAK0Q,cAC9B,GAAGm5E,IAAqBn5E,EACtB,OAGF1Q,KAAKG,IAAI,0BAA2B0pF,EAAkB,KAAMn5E,GAE5D,MAAMo5E,EAAY9pF,KAAKipF,iBAAiBY,GAClCnyE,EAAY1X,KAAKipF,iBAAiBv4E,GACxC1Q,KAAKipF,iBAAiBv4E,GAAiBo5E,EACvC9pF,KAAKipF,iBAAiBY,GAAoBnyE,EAE1C1X,KAAK0Q,cAAgBA,EAErB,IAAI,MAAMq5E,KAAa/pF,KAAKmpF,kBAAmB,CAC7C,MAAMz/E,EAAU1J,KAAKmpF,kBAAkBY,UAChC/pF,KAAKmpF,kBAAkBY,GAE9B,MAAMC,EAAYD,EAAUjuF,QAAQ+tF,EAAkBn5E,GACtD1Q,KAAKmpF,kBAAkBa,GAAatgF,EAEpC1J,KAAKG,IAAI,gCAAiC4pF,EAAW,KAAMC,E,CAG7DhqF,KAAKwpF,mBAAmBS,IACtB,MAAMv5E,EAAgB1Q,KAAKypF,iBAAiBQ,EAAKv6E,gBAC3CwB,EAAYlR,KAAKyQ,aAAaw5E,EAAK/hF,KAAM+hF,EAAKv6E,eAAgBgB,GACpE1Q,KAAKkqF,yBAAyBD,EAAKxgF,UAAWyH,EAAU,GAE5D,CAEai5E,c,0CACX,GAAGnqF,KAAKopF,SACN,OAAOppF,KAAKopF,SAGd,MAAMA,QAAiBgB,GAAA,MAAmB,MAS1C,OARIpqF,KAAKopF,WACHA,EAGFppF,KAAKopF,SAAWA,EAFhBppF,KAAKqqF,YAAY,eAMdrqF,KAAKopF,QACd,G,CAEajB,YAAYmC,G,0CAOvB,GANwB,iBAAf,GAAgD,iBAAf,IACxCA,EAAW,CAACC,KAAM,EAAGlnE,KAAM/U,KAAK1J,MAAQ,IAAO,EAAGjI,GAAI2tF,EAASjrF,UAAS,KAG1EW,KAAK+c,UAAUrW,cAAc,YAAa4jF,IAEtCA,EAASC,KAAM,CACjB,MAAMnB,QAAiBppF,KAAKmqF,cAC5BG,EAASC,KAAOnB,C,CAGlBgB,GAAA,MAAmB,CACjBI,UAAWF,GAIf,G,CAEOD,YAAYniF,GACjB,MAAMuiF,EAAUzqF,KAAKopF,SAClBqB,GACDzqF,KAAK0qF,aAAaD,GAAS5lF,MAAM4E,IAC/BzJ,KAAK2qF,mBAAmBlhF,EAAU,IAItCzJ,KAAKopF,SAAWlhF,EAEhBkiF,GAAA,MAAmB,CACjBQ,GAAI5qF,KAAKopF,UAEb,CAEayB,S,0CACX,GAAG7qF,KAAK8qF,WACN,OAGF9qF,KAAK8qF,YAAa,EAClB,MAAMC,EAAgC,GAGtC,IAAI,IAAI7iF,EAAO,EAAGA,GAAQ,EAAGA,IAC3B6iF,EAAYzqF,KAFC,KAEa4H,EAAO,aAInC,MAAM8iF,QAAsBrpF,QAAQyQ,IAAI24E,EAAY7mF,KAAKkD,GAAQgjF,GAAA,MAAmBhjF,MAE9E6jF,EAAiC,GACvC,IAAI,IAAIvlF,EAAI,EAAGA,EAAIslF,EAAcxuF,OAAQkJ,IACpCslF,EAActlF,IACfulF,EAAe3qF,KAAKN,KAAK4T,UAAU,cAAe,CAAC,EAAG,CAAC1L,KAAOxC,EAAI,EAAYwlF,cAAc,KAIhG,MAAMtsF,EAAQ,IAAW,mCACvBoB,KAAKopF,cAAWnqF,QAEV,EAAAksF,GAAA,IAAe,GAAO,GAC5B,sBACAnrF,KAAK+c,UAAUrW,cAAc,cAC/B,IAMA,OAJA3E,WAAWnD,EAAO,KAIX+C,QAAQyQ,IAAI64E,GAAgBj9E,OAAOrQ,IACxCA,EAAMuwD,SAAU,CAAI,IACnBzlB,QAAQ7pC,EAGb,G,CAEQwsF,wBAAwBljF,EAAYwI,EAA8BhB,GACxE,MAAO,CAACxH,EAAMwI,EAAehB,GAAgB3S,KAAK,IACpD,CAEO2tF,aAAaxiF,EAAYzM,EAA4B,CAAC,GAC3D,MAAMiU,EAAiCjU,EAAQwoF,aAAe,WAAcxoF,EAAQmsF,WAAa,SAAW,SAGtGl3E,EAAgB1Q,KAAKypF,iBAAiB/5E,GACxC1P,KAAKipF,iBAAiBv4E,KACxB1Q,KAAKipF,iBAAiBv4E,GAAiB,CACrCG,OAAQ,CAAC,EACTC,SAAU,CAAC,EACXC,OAAQ,CAAC,IAIb,MAAM2X,EAAQ1oB,KAAKipF,iBAAiBv4E,GAAehB,GAC9CxH,KAAQwgB,IACXA,EAAMxgB,GAAQ,IAGhB,MAAMmjF,EAAa3iE,EAAMxgB,GAEnBojF,EAAmC,WAAnB57E,GAAiD,UAAlBgB,EAA4B,EAAK1Q,KAAK+c,UAAU3W,QA5SnE,EACA,EA4SlC,GAAGilF,EAAW7uF,QAAU8uF,EAAe,CACrC,IAAI5lF,EAAI4lF,EAAgB,EAAGC,GAAQ,EACnC,KAAM7lF,GAAK,IAAKA,EACd,GAAG2lF,EAAW3lF,GAAG8lF,SAAU,CACzBD,GAAQ,EACR,K,CAIJ,MAAM9hF,EAAY4hF,EAAWxhF,OAAO0hF,EAAQ7lF,EAAI4lF,EAAgB,EAAG,GAAG,GAEtE,OADAD,EAAWvlE,QAAQrc,GACZ9H,QAAQM,QAAQwH,E,CAGzB,IAAI0qC,EAASn0C,KAAKorF,wBAAwBljF,EAAMwI,EAAehB,GAC/D,GAAG1P,KAAKmpF,kBAAkBh1C,GACxB,OAAOn0C,KAAKmpF,kBAAkBh1C,GAGhC,MAAMs3C,EAAgB,KAAKvjF,aACrBixD,EAAmB,KAAKjxD,gBAE9B,IAAIgJ,EAAYlR,KAAKyQ,aAAavI,EAAMwH,EAAgBgB,GACxD,OAAO1Q,KAAKmpF,kBAAkBh1C,GAAUxyC,QAAQyQ,IAAI,CAACq5E,EAAItyB,GAAIj1D,KAAKkD,GAAQgjF,GAAA,MAAmBhjF,MAC5FvC,MAAK,EAAO6mF,EAAYC,KAAmB,mCAC1C,IAAIliF,EAAyB9L,EAC7B,GAAG+tF,GAAoC,MAAtBA,EAAWlvF,OAAgB,CACtCmvF,GAA0C,KAAzBA,EAAcnvF,SACjCmvF,EAAgB,oBAGlB,MAAMC,GAAU,EAAAC,GAAA,GAAaH,GACvBI,SAAmB,iBAA0B,OAAQF,IAAUpkF,OAAO,GACtEukF,GAAa,EAAAF,GAAA,GAAaF,GAEhCliF,EAAYzJ,KAAK42C,iBAAiB8zC,aAAaxiF,EAAM0jF,EAASE,EAAWC,EAAYtwF,E,MAErF,IACE,MAAMwZ,QAAajV,KAAKgsF,WAAW/2E,KAAK/M,GAExCkiF,GAAA,MAAmB,CACjB,CAACqB,GAAK5+E,EAAWoI,EAAK22E,SACtB,CAACzyB,GAAKtsD,EAAWoI,EAAK82E,cAGxBtiF,EAAYzJ,KAAK42C,iBAAiB8zC,aAAaxiF,EAAM+M,EAAK22E,QAAS32E,EAAK62E,UAAW72E,EAAK82E,WAAYtwF,E,CACpG,MAAMwwF,GACNtuF,EAAQsuF,C,CAKZ,MAAMC,EAAmBlsF,KAAKypF,iBAAiB/5E,GAmB/C,GAlBGw8E,IAAqBx7E,IACtByjC,EAASn0C,KAAKorF,wBAAwBljF,EAAMgkF,EAAkBx8E,GAC9DwB,EAAU3H,UACVuG,EAAeq8E,gBAAgBnsF,KAAK0R,eAAevB,cAAee,GAE/DzH,IACDyH,EAAYlR,KAAKyQ,aAAavI,EAAMwH,EAAgBw8E,IAGtDlsF,KAAKG,IAAI,uDAAwDuQ,EAAe,KAAMw7E,WAOjFlsF,KAAKmpF,kBAAkBh1C,GAE3Bx2C,EAED,MADAqC,KAAKG,IAAI,sBAAuBxC,EAAQA,EAAgByuF,OAClDzuF,EAMR,OAHAqC,KAAKkqF,yBAAyBzgF,EAAWyH,GACzCm6E,EAAWvlE,QAAQrc,GACnBzJ,KAAK2qF,mBAAmBlhF,GACjBA,CACT,KACF,CAEO4iF,iBAAiBnkF,GACtB,OAAOlI,KAAK0qF,aAAaxiF,GAAMrD,KAAKyqD,GAAA,EAAMA,GAAA,EAC5C,CAEQ46B,yBAAyBzgF,EAAyByH,GACxD,MAAMo7E,EAAe7iF,EAAUyH,UAC5Bo7E,GACDx8E,EAAeq8E,gBAAgBnsF,KAAK0R,eAAevB,cAAem8E,GAGpE7iF,EAAU8iF,gBAAgBr7E,EAC5B,CAEQs7E,iBAAiB/iF,GACvBzJ,KAAKG,IAAI,kBAAmBsJ,EAAUvB,MACtCuB,EAAUgjF,aAAUxtF,EACpBe,KAAKkqF,yBAAyBzgF,GAC9BA,EAAUF,UACVvJ,KAAK42C,iBAAiB81C,gBAAgBjjF,GACtCqG,EAAeq8E,gBAAgBnsF,KAAKipF,iBAAkBx/E,EACxD,CAEOkhF,mBAAmBlhF,GACrBA,EAAUgjF,UAI0BhjF,EAAUkjF,gBAC/ChrF,QAAQM,SAAQ,GAChBjC,KAAKmqF,cAActlF,MAAMukF,GAAa3/E,EAAUvB,OAASkhF,KAC9CvkF,MAAM+nF,IACdnjF,EAAUgjF,SAIVG,IACDnjF,EAAUgjF,QAAU,IAAMzsF,KAAKwsF,iBAAiB/iF,GAChDA,EAAUojF,kB,GAGhB,CAEOx1D,oBAAoB5yB,GACzBzE,KAAK8sF,iBAAmBroF,EACxBzE,KAAK42C,iBAAiBvf,oBAAoB5yB,EAC5C,CAEOmP,UAAyC/K,EAAWmL,EAAkC,CAAC,EAAGvY,EAA4B,CAAC,GAQ5H,MAAMjC,GAAW,SAEjB,IA4DI0O,EAEA6kF,GA9DA,eAACn+B,EAAc,qBAAEw5B,GAAwB3sF,EAO7C,GANG2sF,GACD5uF,EAASqL,MAAK,YACL7E,KAAKqpF,oBAAoBjB,EAAqB,IAItD,KAAgB,CACjB,MAAM4E,EAAY1+E,KAAK1J,MACjBiyB,EAAWloB,EAAA,eAAgB,KAC3Bo+E,GAAoBA,EAAgBE,aACtCjtF,KAAKG,IAAIxC,MAAM,+BAAgCkL,EAAQmL,EAAQvY,EAAS,SAAU6S,KAAK1J,MAAQooF,GAAa,I,GAG7G,KAEHxzF,EAASwU,MAAMshD,GAAA,GAAM7mB,SAAQ,KAC3BzR,cAAcH,EAAS,G,CA8C3B,MAAMu1D,GAAQ,IAAKrhF,OAASqhF,OAAS,cAC/Bc,EAAiB,KACrB,GAAGt+B,EAAgB,CACjB,MAAM9xC,EAAQ9c,KAAKqpF,oBAAoBz6B,GACpC9xC,IACDrhB,EAAQmzD,eAAiB9xC,EAAMhP,U,CAInC,MAAMpE,EAAUqjF,EAAgBI,YAAYtkF,EAAQmL,EAAQvY,GAS5D,OAPG2sF,IACDpoF,KAAKqpF,oBAAoBjB,GAAwB,CAC/Ct6E,UAAYrS,EAAsBqS,UAClCpE,QAASlQ,IAINkQ,EAAQsE,OAAOrQ,I,MAMpB,GAJkB,2BAAfA,EAAMG,MACPkC,KAAKG,IAAIxC,MAAM,QAASA,EAAM0X,KAAM1X,EAAMG,KAAMkC,KAAKopF,SAAUlhF,EAAMW,EAAQmL,GAG7D,MAAfrW,EAAM0X,MAAgBrV,KAAKopF,WAAalhF,EAOzC,KANkB,4BAAfvK,EAAMG,OACPssF,GAAA,SAAsB,MACtBA,GAAA,SAAsB,cAIlBzsF,EACD,GAAkB,MAAfA,EAAM0X,MAAgBrV,KAAKopF,UAAYlhF,IAASlI,KAAKopF,SAAU,CACvE,QAAsCnqF,IAAnCe,KAAKkpF,oBAAoBhhF,GAAqB,CAC/C,MAAMwB,EAAU,IAAI/H,SAAQ,CAACyrF,EAAeC,KAC1CrtF,KAAK4T,UAAU,2BAA4B,CAACglB,MAAO1wB,GAAO,CAACivB,YAAY,IAAOtyB,MAAMyoF,IAClFttF,KAAK4T,UAAU,2BAA4B,CACzCjX,GAAI2wF,EAAa3wF,GACjBmQ,MAAOwgF,EAAaxgF,OACnB,CAAC5E,OAAMivB,YAAY,IAAOtyB,KAAKuoF,EAAeC,EAAa,GAC7DA,EAAa,IAGlBrtF,KAAKkpF,oBAAoBhhF,GAAQwB,C,CAGnC,OAAO1J,KAAKkpF,oBAAoBhhF,GAAMrD,MAAK,IAAMqoF,K,CAC5C,GAAkB,MAAfvvF,EAAM0X,KAWT,IAAkB,MAAf1X,EAAM0X,MAAuD,IAAvC1X,EAAMG,KAAKrD,QAAQ,gBAAuB,CACxE,MAAM8yF,GAAW5vF,EAAMG,KAAKhD,MAAM,yBAAyB,GAC3D,GAAGyyF,IAAYrlF,EAEb,OADAzM,EAAQyM,KAAOqlF,EACRvtF,KAAK4T,UAAU/K,EAAQmL,EAAQvY,GAEtC,MAAMkC,C,CAEH,GAAkB,MAAfA,EAAM0X,MAA+B,0BAAf1X,EAAMG,KAEpC,OADAkC,KAAK42C,iBAAiB42C,wBACfN,IACF,GAAIzxF,EAAQgyF,UAA2B,MAAf9vF,EAAM0X,KAQ9B,KAAI5Z,EAAQgyF,UAAY,CAAC,kBAAmB,oBAAoB1+D,SAASpxB,EAAMG,MAAO,CAC3F,MAAMgf,EAAQ9c,KAAKqpF,oBAAoBz6B,GAKvC,OAHAA,OAAiB3vD,SACVxD,EAAQmzD,eAEZ9xC,EAAcA,EAAMpT,QAAQ7E,MAAK,IAAMqoF,MAC9BA,G,CACP,GAAIzxF,EAAQgyF,UAA2B,MAAf9vF,EAAM0X,KAU9B,IAAkB,YAAf1X,EAAMG,MAAqC,4BAAfH,EAAMG,KAC1C,OAAO,EAAAgM,EAAA,GAAM,KAAMjF,MAAK,IAAMqoF,MAE9B,MAAMvvF,C,CAb2C,CACjD,MAAMiH,EAAM0J,KAAK1J,MACjB,GAAGnJ,EAAQkhD,UACN/3C,GAAOnJ,EAAQkhD,SAChB,MAAMh/C,EAKV,OADAlC,EAAQiyF,SAAWjyF,EAAQiyF,SAAWntE,KAAKC,IAAI,GAAuB,IAAnB/kB,EAAQiyF,UAAkB,GACtE,EAAA5jF,EAAA,GAAyB,IAAnBrO,EAAQiyF,UAAiB7oF,MAAK,IAAMqoF,K,EAzBA,CACjD,MAAMQ,GAAY/vF,EAAMG,KAAKhD,MAAM,qBAAqB,IAAM,EAE9D,GAAG4yF,GAAmC,QAAvB,EAAAjyF,EAAQkyF,uBAAe,QAAI,MAAQlyF,EAAQ2sF,qBACxD,MAAMzqF,EAGR,OAAO,EAAAmM,EAAA,GAAqC,IAA/B4jF,GAAqC7oF,MAAK,IAAMqoF,K,EA7BjC,CAC5B,MAAMK,GAAW5vF,EAAMG,KAAKhD,MAAM,yDAAyD,GAC3F,GAAGyyF,IAAYrlF,EAOb,OANGzM,EAAQyM,KACTzM,EAAQyM,KAAOqlF,EAEfvtF,KAAKqqF,YAAYkD,GAGZvtF,KAAK4T,UAAU/K,EAAQmL,EAAQvY,E,IA4C1C,EAGJ,IAAIo+B,EAiBJ,OAfEA,GADC3xB,EAAQzM,EAAQyM,MAAQlI,KAAKopF,UAC1BppF,KAAK0qF,aAAaxiF,EAAMzM,GAExBuE,KAAKmqF,cAActlF,MAAMukF,GAAappF,KAAK0qF,aAAaxiF,EAAOkhF,EAAU3tF,KAG/Eo+B,EAAEh1B,MAAM4E,IACNsjF,EAAkBtjF,EAClB,MAAMC,EAAUwjF,IAEhB,OADAH,EAAgBa,cAAcp0F,EAAUiC,GACjCiO,CAAO,IAEf7E,KAAKrL,EAASyI,SACd+L,OA/J2BrQ,GAAoB,mCAY9C,GAXIA,GAEO,EAAAylB,GAAA,GAASzlB,KAClBA,EAAQ,CAACkE,QAASlE,IAFlBA,EAAQ,CAACG,KAAM,gBAKE,MAAfH,EAAM0X,MAA+B,oBAAf1X,EAAMG,MACd,MAAfH,EAAM0X,MAA+B,wBAAf1X,EAAMG,OAC7BkC,KAAK6qF,SAGJpvF,EAAQyvF,aACT,MAAMvtF,EAuBR,MApBkB,MAAfA,EAAM0X,OACP1X,EAAMuwD,SAAU,GAGdzyD,EAAQ07B,aACVx5B,EAAMigC,MAAQ/0B,EACdlL,EAAMyuF,MAAQA,GAAUzuF,EAAMkwF,eAAiBlwF,EAAMkwF,cAAczB,OAAUzuF,EAAMyuF,QAAS,IAAKrhF,OAASqhF,MAC1GrqF,YAAW,KACLpE,EAAMuwD,UACU,MAAfvwD,EAAM0X,MACPrV,KAAK6qF,SAKPltF,EAAMuwD,SAAU,E,GAEjB,MAGCvwD,CACR,MA2HCqQ,MAAMxU,EAASoI,QAETpI,CACT,ECrpBF,MAAMs0F,GAIJhuF,cAHQ,KAAAiuF,YAAiD,IAAIx8E,IACrD,KAAAy8E,cAAmD,IAAIz8E,IAG7DvR,KAAKi0B,cAAa,EACpB,CAEUnX,QACR9c,KAAK+c,UAAU1W,iBAAiB,aAAa,KAC3CrG,KAAK+mB,YAAY/mB,KAAK0a,gBAAgB1b,OAAQ,OAAO,GAEzD,CAEO+nB,YAAY/nB,EAAgBoI,GACjC,IAAIY,EAAMhI,KAAK+tF,YAAYxpF,IAAIvF,GAC5BgJ,GAAOA,EAAIvJ,IAAI2I,KAIdY,IACFA,EAAM,IAAI7J,IACV6B,KAAK+tF,YAAY/lF,IAAIhJ,EAAQgJ,IAG/BA,EAAIlJ,IAAIsI,GAERpH,KAAK0G,cAAc,aAAc1H,GACnC,CAEO0oB,YAAY1oB,EAAgBoI,GACjC,MAAMY,EAAMhI,KAAK+tF,YAAYxpF,IAAIvF,GAC7BgJ,IAIJA,EAAInE,OAAOuD,GAEPY,EAAIoL,OACNpT,KAAK+tF,YAAYlqF,OAAO7E,GACxBgB,KAAK0G,cAAc,eAAgB1H,IAEvC,CAEO2nB,mBAAmB/O,EAAiCxQ,GACtDtG,MAAMiD,QAAQ6T,KACfA,EAAU,IAAIzZ,IAAIyZ,IAGpB,IAAI5P,EAAMhI,KAAKguF,cAAczpF,IAAI6C,GACjC,GAAGY,EAAK,CACN,IAAI,MAAMhJ,KAAUgJ,EACf4P,EAAQnZ,IAAIO,KAIfgB,KAAK0nB,YAAY1oB,EAAQoI,GACzBY,EAAInE,OAAO7E,IAGb,IAAIgJ,EAAIoL,OAASwE,EAAQxE,KAEvB,YADApT,KAAKguF,cAAcnqF,OAAOuD,E,CAK9B,GAAGwQ,EAAQxE,KAAM,CACXpL,IACFA,EAAM,IAAI7J,IACV6B,KAAKguF,cAAchmF,IAAIZ,EAAKY,IAG9B,IAAI,MAAMhJ,KAAU4Y,EACf5P,EAAIvJ,IAAIO,KAIXgB,KAAK+mB,YAAY/nB,EAAQoI,GACzBY,EAAIlJ,IAAIE,G,CAGd,CAEOm8B,aAAan8B,GAClB,OAAOgB,KAAK+tF,YAAYtvF,IAAIO,EAC9B,EAOFkzB,GAAY47D,GAAc,CAAC,IAAmBr7E,IAE9C,YCrFMw7E,GAAgB,KAIP,MAAMC,GAArB,cACU,KAAAC,YAA2B,CAAC,CA4BtC,CA1BUh6C,OAAOn8B,G,MACb,OAAOA,EAAMtb,GAA0B,QAApB,EAAAsb,EAAkBrb,UAAE,QAAKqb,EAAsBva,IACpE,CAEOm0C,gBAAgB55B,EAA0B4qD,EAAoBqrB,I,YAKnE,MAAMvlE,EAA2C,QAAtC,KAAG1oB,KAAKmuF,aAAW,EAACnuF,KAAKm0C,OAAOn8B,WAAM,aAAM,CAAC,EACxD,OAAsB,QAAtB,EAAO0Q,EAAMk6C,UAAS,QAAfl6C,EAAMk6C,GAAe,CAACnvB,WAAY,EAAGh2C,IAAK,GAAIK,KAAM8kE,EAC7D,CAEO/wB,mBAAmB75B,EAA0B4qD,EAAoBqrB,GAAexwF,EAAag2C,EAAqB,GACvH,MAAML,EAAepzC,KAAK4xC,gBAAgB55B,EAAO4qD,GAGjD,OAFAxvB,EAAa31C,IAAMA,EACnB21C,EAAaK,WAAaA,EACnBL,CACT,CAEO1D,mBAAmB13B,EAA0B4qD,EAAoBqrB,IACtE,MAAMvlE,EAAQ1oB,KAAKmuF,YAAYnuF,KAAKm0C,OAAOn8B,IACxC0Q,UACMA,EAAMk6C,EAEjB,EC5BF,UAAgB,QAAU,CAAC,aAAe,CAAC,CAAC,GAAK,UAAU,UAAY,SAAS,OAAS,GAAG,KAAO,YAAY,CAAC,GAAK,SAAS,UAAY,QAAQ,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,KAAK,KAAO,SAAS,CAAC,KAAO,iCAAiC,KAAO,iBAAiB,KAAO,SAAS,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,CAAC,KAAO,IAAI,KAAO,SAAS,CAAC,KAAO,IAAI,KAAO,SAAS,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,KAAK,KAAO,QAAQ,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,CAAC,KAAO,IAAI,KAAO,SAAS,CAAC,KAAO,IAAI,KAAO,SAAS,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,mBAAmB,KAAO,UAAU,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,SAAS,CAAC,KAAO,MAAM,KAAO,SAAS,CAAC,KAAO,cAAc,KAAO,QAAQ,KAAO,wBAAwB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,MAAM,KAAO,UAAU,KAAO,wBAAwB,CAAC,GAAK,WAAW,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,WAAW,KAAO,+BAA+B,CAAC,GAAK,WAAW,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,WAAW,KAAO,+BAA+B,CAAC,IAAM,WAAW,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,WAAW,KAAO,+BAA+B,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,QAAQ,CAAC,KAAO,mBAAmB,KAAO,QAAQ,CAAC,KAAO,mBAAmB,KAAO,QAAQ,CAAC,KAAO,kBAAkB,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,WAAW,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,gBAAgB,KAAO,WAAW,KAAO,YAAY,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,6BAA6B,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,wBAAwB,KAAO,eAAe,CAAC,GAAK,UAAU,UAAY,OAAO,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,qBAAqB,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,UAAU,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,WAAW,CAAC,IAAM,UAAU,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,YAAY,KAAO,eAAe,CAAC,GAAK,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,UAAU,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,WAAW,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,gBAAgB,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,gBAAgB,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,kBAAkB,KAAO,SAAS,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,GAAK,SAAS,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,eAAe,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,gBAAgB,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,gBAAgB,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,sBAAsB,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,wBAAwB,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,wBAAwB,OAAS,GAAG,KAAO,sBAAsB,QAAU,CAAC,CAAC,IAAM,WAAW,OAAS,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,SAAS,CAAC,IAAM,UAAU,OAAS,gBAAgB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,IAAI,KAAO,SAAS,CAAC,KAAO,IAAI,KAAO,SAAS,CAAC,KAAO,yBAAyB,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,UAAU,KAAO,oBAAoB,CAAC,IAAM,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,iBAAiB,KAAO,UAAU,KAAO,+BAA+B,CAAC,GAAK,WAAW,OAAS,kBAAkB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,iBAAiB,CAAC,IAAM,WAAW,OAAS,mBAAmB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,eAAe,CAAC,GAAK,WAAW,OAAS,OAAO,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,mBAAmB,KAAO,QAAQ,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,kBAAkB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,YAAY,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,YAAY,CAAC,IAAM,UAAU,OAAS,mBAAmB,OAAS,GAAG,KAAO,uBAAuB,IAAM,CAAC,aAAe,CAAC,CAAC,IAAM,WAAW,UAAY,YAAY,OAAS,GAAG,KAAO,QAAQ,CAAC,IAAM,WAAW,UAAY,WAAW,OAAS,GAAG,KAAO,QAAQ,CAAC,GAAK,WAAW,UAAY,OAAO,OAAS,GAAG,KAAO,QAAQ,CAAC,GAAK,UAAU,UAAY,SAAS,OAAS,GAAG,KAAO,YAAY,CAAC,IAAM,UAAU,UAAY,QAAQ,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,SAAS,CAAC,GAAK,WAAW,UAAY,OAAO,OAAS,GAAG,KAAO,QAAQ,CAAC,GAAK,WAAW,UAAY,iBAAiB,OAAS,GAAG,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,gBAAgB,OAAS,GAAG,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,GAAG,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,gBAAgB,OAAS,GAAG,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,WAAW,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,GAAG,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,cAAc,KAAO,gBAAgB,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,cAAc,CAAC,KAAO,cAAc,KAAO,gBAAgB,KAAO,cAAc,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,kBAAkB,KAAO,cAAc,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,sBAAsB,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,qBAAqB,CAAC,KAAO,QAAQ,KAAO,qBAAqB,CAAC,KAAO,iBAAiB,KAAO,mBAAmB,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,eAAe,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,kBAAkB,OAAS,GAAG,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,UAAU,KAAO,cAAc,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,UAAU,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,UAAU,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,GAAG,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,GAAG,KAAO,oBAAoB,CAAC,GAAK,QAAQ,UAAY,mBAAmB,OAAS,GAAG,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,kBAAkB,OAAS,GAAG,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,kBAAkB,OAAS,GAAG,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,GAAG,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,GAAG,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,GAAG,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,GAAG,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,GAAG,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,GAAG,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,kBAAkB,OAAS,GAAG,KAAO,cAAc,CAAC,IAAM,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,cAAc,CAAC,GAAK,QAAQ,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,WAAW,UAAY,OAAO,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,iBAAiB,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,aAAa,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,wBAAwB,CAAC,KAAO,eAAe,KAAO,4BAA4B,CAAC,KAAO,wBAAwB,KAAO,8BAA8B,KAAO,QAAQ,CAAC,GAAK,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,QAAQ,CAAC,IAAM,UAAU,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,oBAAoB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,kBAAkB,KAAO,sBAAsB,CAAC,KAAO,kBAAkB,KAAO,+BAA+B,CAAC,KAAO,WAAW,KAAO,2BAA2B,CAAC,KAAO,gBAAgB,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,2BAA2B,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,4BAA4B,KAAO,iBAAiB,CAAC,KAAO,iBAAiB,KAAO,mBAAmB,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,oBAAoB,KAAO,yBAAyB,CAAC,KAAO,sBAAsB,KAAO,2BAA2B,KAAO,YAAY,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,mBAAmB,KAAO,4BAA4B,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,eAAe,KAAO,2BAA2B,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,iBAAiB,OAAS,GAAG,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,UAAU,UAAY,UAAU,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,4BAA4B,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,8BAA8B,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,wBAAwB,CAAC,KAAO,eAAe,KAAO,uBAAuB,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,2BAA2B,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,mBAAmB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,YAAY,KAAO,6BAA6B,CAAC,KAAO,qBAAqB,KAAO,sCAAsC,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,8BAA8B,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,GAAG,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,CAAC,KAAO,cAAc,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,aAAa,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,GAAG,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,SAAS,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,oBAAoB,KAAO,OAAO,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,wBAAwB,KAAO,OAAO,CAAC,KAAO,yBAAyB,KAAO,OAAO,CAAC,KAAO,kBAAkB,KAAO,sBAAsB,CAAC,KAAO,MAAM,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,wBAAwB,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,gBAAgB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,KAAO,SAAS,CAAC,IAAM,SAAS,UAAY,QAAQ,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,qBAAqB,CAAC,KAAO,cAAc,KAAO,6BAA6B,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,SAAS,CAAC,GAAK,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,aAAa,CAAC,GAAK,SAAS,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,gBAAgB,OAAS,GAAG,KAAO,YAAY,CAAC,IAAM,WAAW,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,KAAO,YAAY,CAAC,GAAK,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,qBAAqB,CAAC,KAAO,kBAAkB,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,yBAAyB,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,0BAA0B,KAAO,gBAAgB,CAAC,KAAO,yBAAyB,KAAO,eAAe,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,8BAA8B,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,8BAA8B,KAAO,2BAA2B,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,6BAA6B,CAAC,KAAO,gBAAgB,KAAO,6BAA6B,CAAC,KAAO,cAAc,KAAO,8BAA8B,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,0BAA0B,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,yBAAyB,KAAO,iBAAiB,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,qBAAqB,KAAO,kBAAkB,CAAC,KAAO,oBAAoB,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,YAAY,CAAC,KAAO,WAAW,KAAO,8BAA8B,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,GAAG,KAAO,gBAAgB,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,gBAAgB,CAAC,GAAK,UAAU,UAAY,+BAA+B,OAAS,GAAG,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,GAAG,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,GAAG,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,wBAAwB,KAAO,gBAAgB,CAAC,KAAO,sBAAsB,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,iBAAiB,CAAC,KAAO,wBAAwB,KAAO,iBAAiB,CAAC,KAAO,2BAA2B,KAAO,iBAAiB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,KAAO,gBAAgB,KAAO,iBAAiB,CAAC,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,KAAO,kBAAkB,KAAO,sBAAsB,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,gBAAgB,KAAO,eAAe,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,mBAAmB,CAAC,KAAO,uBAAuB,KAAO,mBAAmB,CAAC,KAAO,yBAAyB,KAAO,4BAA4B,CAAC,KAAO,6BAA6B,KAAO,4BAA4B,CAAC,KAAO,gBAAgB,KAAO,uCAAuC,KAAO,YAAY,CAAC,GAAK,UAAU,UAAY,UAAU,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,WAAW,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,eAAe,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,2BAA2B,CAAC,KAAO,kBAAkB,KAAO,0BAA0B,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,6BAA6B,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,uBAAuB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,uBAAuB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,mBAAmB,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,YAAY,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,4BAA4B,CAAC,GAAK,WAAW,UAAY,2BAA2B,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,2BAA2B,OAAS,GAAG,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,gCAAgC,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,GAAG,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,QAAQ,UAAY,yBAAyB,OAAS,GAAG,KAAO,kBAAkB,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,WAAW,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,eAAe,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,sBAAsB,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,sBAAsB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,qBAAqB,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,eAAe,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,qBAAqB,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,SAAS,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,mBAAmB,CAAC,KAAO,yBAAyB,KAAO,4BAA4B,CAAC,KAAO,gBAAgB,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,mBAAmB,CAAC,KAAO,yBAAyB,KAAO,4BAA4B,CAAC,KAAO,gBAAgB,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,qBAAqB,KAAO,kBAAkB,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,iBAAiB,OAAS,GAAG,KAAO,WAAW,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,4BAA4B,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,8BAA8B,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,4BAA4B,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,8BAA8B,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,WAAW,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,WAAW,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,WAAW,CAAC,GAAK,WAAW,UAAY,UAAU,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,WAAW,CAAC,IAAM,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,SAAS,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,GAAK,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,oBAAoB,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,eAAe,CAAC,GAAK,UAAU,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,mBAAmB,KAAO,YAAY,CAAC,GAAK,UAAU,UAAY,SAAS,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,qBAAqB,KAAO,gBAAgB,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,4BAA4B,KAAO,gBAAgB,CAAC,KAAO,wBAAwB,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,iBAAiB,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,oBAAoB,CAAC,KAAO,qBAAqB,KAAO,UAAU,CAAC,KAAO,gBAAgB,KAAO,OAAO,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,sBAAsB,KAAO,OAAO,CAAC,KAAO,0BAA0B,KAAO,OAAO,CAAC,KAAO,0BAA0B,KAAO,OAAO,CAAC,KAAO,0BAA0B,KAAO,OAAO,CAAC,KAAO,0BAA0B,KAAO,OAAO,CAAC,KAAO,wBAAwB,KAAO,OAAO,CAAC,KAAO,0BAA0B,KAAO,OAAO,CAAC,KAAO,sBAAsB,KAAO,OAAO,CAAC,KAAO,kBAAkB,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,OAAO,CAAC,KAAO,kBAAkB,KAAO,OAAO,CAAC,KAAO,oBAAoB,KAAO,OAAO,CAAC,KAAO,uBAAuB,KAAO,OAAO,CAAC,KAAO,iBAAiB,KAAO,OAAO,CAAC,KAAO,wBAAwB,KAAO,OAAO,CAAC,KAAO,uBAAuB,KAAO,OAAO,CAAC,KAAO,6BAA6B,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,2BAA2B,KAAO,OAAO,CAAC,KAAO,4BAA4B,KAAO,OAAO,CAAC,KAAO,0BAA0B,KAAO,OAAO,CAAC,KAAO,uBAAuB,KAAO,OAAO,CAAC,KAAO,0BAA0B,KAAO,OAAO,CAAC,KAAO,yBAAyB,KAAO,OAAO,CAAC,KAAO,gBAAgB,KAAO,UAAU,CAAC,KAAO,wBAAwB,KAAO,kBAAkB,CAAC,KAAO,sBAAsB,KAAO,kBAAkB,CAAC,KAAO,wBAAwB,KAAO,mBAAmB,CAAC,KAAO,sBAAsB,KAAO,mBAAmB,CAAC,KAAO,uBAAuB,KAAO,mBAAmB,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,gBAAgB,KAAO,OAAO,CAAC,KAAO,sBAAsB,KAAO,kBAAkB,CAAC,KAAO,oBAAoB,KAAO,eAAe,CAAC,KAAO,yBAAyB,KAAO,eAAe,CAAC,KAAO,oBAAoB,KAAO,sBAAsB,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,yBAAyB,CAAC,KAAO,WAAW,KAAO,oBAAoB,CAAC,KAAO,MAAM,KAAO,kBAAkB,CAAC,KAAO,UAAU,KAAO,qBAAqB,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,GAAG,KAAO,kBAAkB,CAAC,GAAK,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,oBAAoB,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,SAAS,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,QAAQ,CAAC,KAAO,MAAM,KAAO,UAAU,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,SAAS,CAAC,KAAO,kBAAkB,KAAO,SAAS,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,kBAAkB,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,GAAG,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,kBAAkB,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,UAAU,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,SAAS,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,UAAU,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,iCAAiC,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,kBAAkB,KAAO,iCAAiC,CAAC,IAAM,SAAS,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,kBAAkB,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,qBAAqB,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,qBAAqB,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,6BAA6B,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,cAAc,KAAO,gBAAgB,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,iBAAiB,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,oBAAoB,CAAC,KAAO,cAAc,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,UAAU,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,SAAS,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,KAAO,YAAY,CAAC,IAAM,WAAW,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,6BAA6B,CAAC,KAAO,eAAe,KAAO,6BAA6B,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,8BAA8B,KAAO,YAAY,CAAC,GAAK,UAAU,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,cAAc,OAAS,GAAG,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,cAAc,OAAS,GAAG,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,CAAC,KAAO,kBAAkB,KAAO,uBAAuB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,SAAS,UAAY,0BAA0B,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,+BAA+B,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,iCAAiC,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,0BAA0B,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,GAAG,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,GAAG,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,GAAG,KAAO,cAAc,CAAC,IAAM,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,cAAc,CAAC,KAAO,QAAQ,KAAO,wBAAwB,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,iCAAiC,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,GAAG,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,iCAAiC,OAAS,GAAG,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,sBAAsB,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,oCAAoC,OAAS,GAAG,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,GAAG,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,sBAAsB,KAAO,oBAAoB,CAAC,IAAM,OAAO,UAAY,4BAA4B,OAAS,GAAG,KAAO,eAAe,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,eAAe,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,GAAG,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,GAAG,KAAO,eAAe,CAAC,IAAM,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,eAAe,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,wBAAwB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,kBAAkB,CAAC,GAAK,SAAS,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,QAAQ,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,mBAAmB,CAAC,KAAO,cAAc,KAAO,uBAAuB,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,qBAAqB,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,kBAAkB,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,qBAAqB,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,iBAAiB,KAAO,eAAe,CAAC,IAAM,UAAU,UAAY,kCAAkC,OAAS,GAAG,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,uBAAuB,KAAO,wBAAwB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,6BAA6B,CAAC,GAAK,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,WAAW,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,KAAO,WAAW,CAAC,IAAM,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,WAAW,CAAC,IAAM,UAAU,UAAY,UAAU,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,aAAa,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,oBAAoB,CAAC,KAAO,cAAc,KAAO,iBAAiB,CAAC,KAAO,aAAa,KAAO,sCAAsC,KAAO,WAAW,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,YAAY,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,8BAA8B,KAAO,gBAAgB,CAAC,KAAO,yBAAyB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,iBAAiB,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,WAAW,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,yBAAyB,KAAO,OAAO,CAAC,KAAO,iBAAiB,KAAO,0BAA0B,KAAO,0BAA0B,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,oBAAoB,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,2BAA2B,CAAC,KAAO,QAAQ,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,4BAA4B,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,kBAAkB,KAAO,yBAAyB,CAAC,KAAO,gBAAgB,KAAO,SAAS,CAAC,KAAO,qBAAqB,KAAO,eAAe,CAAC,KAAO,sBAAsB,KAAO,mBAAmB,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,kBAAkB,KAAO,iCAAiC,KAAO,4BAA4B,CAAC,IAAM,WAAW,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,2BAA2B,CAAC,KAAO,oBAAoB,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,sBAAsB,KAAO,iCAAiC,KAAO,iCAAiC,CAAC,GAAK,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,gBAAgB,KAAO,WAAW,KAAO,yBAAyB,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,YAAY,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,yBAAyB,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,SAAS,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,yBAAyB,KAAO,cAAc,CAAC,GAAK,SAAS,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,eAAe,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,QAAQ,UAAY,uBAAuB,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,eAAe,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,6BAA6B,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,gBAAgB,KAAO,eAAe,CAAC,KAAO,oBAAoB,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,cAAc,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,WAAW,KAAO,0BAA0B,CAAC,KAAO,YAAY,KAAO,qBAAqB,KAAO,uBAAuB,CAAC,IAAM,WAAW,UAAY,OAAO,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,UAAU,KAAO,iBAAiB,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,KAAO,UAAU,KAAO,iBAAiB,CAAC,KAAO,MAAM,KAAO,iBAAiB,CAAC,KAAO,mBAAmB,KAAO,iBAAiB,CAAC,KAAO,cAAc,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,iBAAiB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,MAAM,KAAO,iBAAiB,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,KAAO,UAAU,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,kBAAkB,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,kBAAkB,KAAO,iBAAiB,CAAC,KAAO,UAAU,KAAO,iBAAiB,CAAC,KAAO,sBAAsB,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,4BAA4B,CAAC,KAAO,SAAS,KAAO,sBAAsB,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,qBAAqB,KAAO,sCAAsC,CAAC,KAAO,yBAAyB,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,mBAAmB,CAAC,KAAO,eAAe,KAAO,wBAAwB,CAAC,KAAO,YAAY,KAAO,8BAA8B,KAAO,QAAQ,CAAC,IAAM,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,WAAW,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,UAAU,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,oBAAoB,KAAO,iBAAiB,CAAC,KAAO,uBAAuB,KAAO,oBAAoB,CAAC,KAAO,WAAW,KAAO,8BAA8B,CAAC,KAAO,cAAc,KAAO,0BAA0B,KAAO,WAAW,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,2BAA2B,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,iBAAiB,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,mBAAmB,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,6BAA6B,CAAC,KAAO,cAAc,KAAO,mBAAmB,KAAO,eAAe,CAAC,IAAM,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,wBAAwB,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,WAAW,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,GAAG,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,UAAU,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,MAAM,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,iBAAiB,CAAC,KAAO,UAAU,KAAO,iBAAiB,CAAC,KAAO,mBAAmB,KAAO,iBAAiB,CAAC,KAAO,cAAc,KAAO,iBAAiB,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,eAAe,KAAO,iBAAiB,CAAC,KAAO,eAAe,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,qBAAqB,KAAO,qCAAqC,CAAC,KAAO,eAAe,KAAO,4BAA4B,CAAC,KAAO,gBAAgB,KAAO,6BAA6B,CAAC,KAAO,wBAAwB,KAAO,6BAA6B,CAAC,KAAO,qBAAqB,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,8BAA8B,KAAO,QAAQ,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,QAAQ,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,yBAAyB,CAAC,IAAM,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,wBAAwB,KAAO,gBAAgB,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,oBAAoB,KAAO,iBAAiB,CAAC,KAAO,mBAAmB,KAAO,iBAAiB,CAAC,KAAO,gBAAgB,KAAO,iBAAiB,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,KAAO,UAAU,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,KAAK,CAAC,KAAO,qBAAqB,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,iBAAiB,CAAC,KAAO,sBAAsB,KAAO,iBAAiB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,qBAAqB,KAAO,eAAe,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,oBAAoB,KAAO,OAAO,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,SAAS,CAAC,KAAO,kBAAkB,KAAO,sBAAsB,CAAC,KAAO,kBAAkB,KAAO,+BAA+B,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,wBAAwB,KAAO,gBAAgB,CAAC,KAAO,uBAAuB,KAAO,eAAe,CAAC,KAAO,gBAAgB,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,sBAAsB,CAAC,KAAO,mBAAmB,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,4BAA4B,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,0BAA0B,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,2BAA2B,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,sBAAsB,KAAO,2BAA2B,CAAC,KAAO,4BAA4B,KAAO,iBAAiB,CAAC,KAAO,iBAAiB,KAAO,mBAAmB,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,oBAAoB,KAAO,yBAAyB,CAAC,KAAO,kBAAkB,KAAO,iBAAiB,CAAC,KAAO,sBAAsB,KAAO,2BAA2B,KAAO,YAAY,CAAC,GAAK,UAAU,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,SAAS,KAAO,sBAAsB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,MAAM,KAAO,gBAAgB,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,WAAW,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,eAAe,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,6BAA6B,CAAC,IAAM,WAAW,UAAY,mCAAmC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,6BAA6B,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,eAAe,CAAC,KAAO,eAAe,KAAO,mBAAmB,CAAC,KAAO,gBAAgB,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,6BAA6B,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,GAAG,KAAO,yBAAyB,CAAC,IAAM,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,yBAAyB,KAAO,yBAAyB,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,eAAe,KAAO,mBAAmB,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,6BAA6B,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,GAAG,KAAO,6BAA6B,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,IAAI,KAAO,WAAW,KAAO,6BAA6B,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,8BAA8B,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,gCAAgC,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,sBAAsB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,+BAA+B,CAAC,IAAM,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,GAAG,KAAO,6BAA6B,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,YAAY,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,yBAAyB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,KAAO,uBAAuB,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,wBAAwB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,iBAAiB,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,gCAAgC,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,qBAAqB,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,GAAG,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,yBAAyB,CAAC,GAAK,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,yBAAyB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,MAAM,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,4BAA4B,CAAC,KAAO,UAAU,KAAO,4BAA4B,CAAC,KAAO,eAAe,KAAO,0BAA0B,KAAO,wBAAwB,CAAC,GAAK,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,MAAM,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,UAAU,KAAO,uBAAuB,CAAC,KAAO,eAAe,KAAO,qBAAqB,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,6BAA6B,CAAC,KAAO,UAAU,KAAO,2BAA2B,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,uBAAuB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,oBAAoB,CAAC,KAAO,YAAY,KAAO,+BAA+B,CAAC,KAAO,SAAS,KAAO,WAAW,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,oBAAoB,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,oCAAoC,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,2BAA2B,OAAS,GAAG,KAAO,kBAAkB,CAAC,GAAK,UAAU,UAAY,2BAA2B,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,uBAAuB,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,oBAAoB,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,mBAAmB,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,WAAW,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,kBAAkB,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,oBAAoB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,kBAAkB,CAAC,IAAM,SAAS,UAAY,mCAAmC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,kBAAkB,CAAC,GAAK,SAAS,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,8BAA8B,KAAO,eAAe,CAAC,GAAK,UAAU,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,kBAAkB,CAAC,KAAO,MAAM,KAAO,kBAAkB,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,8BAA8B,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,gBAAgB,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,kBAAkB,KAAO,mBAAmB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,4BAA4B,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,WAAW,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,UAAU,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,eAAe,CAAC,KAAO,gCAAgC,KAAO,eAAe,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,yBAAyB,CAAC,GAAK,WAAW,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,yBAAyB,CAAC,IAAM,WAAW,UAAY,oCAAoC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,yBAAyB,CAAC,GAAK,SAAS,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,YAAY,CAAC,KAAO,UAAU,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,eAAe,CAAC,KAAO,gCAAgC,KAAO,eAAe,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,YAAY,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,cAAc,CAAC,KAAO,eAAe,KAAO,0BAA0B,KAAO,wBAAwB,CAAC,IAAM,OAAO,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,iBAAiB,CAAC,KAAO,eAAe,KAAO,0BAA0B,KAAO,wBAAwB,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,oBAAoB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,eAAe,KAAO,qBAAqB,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,2BAA2B,CAAC,GAAK,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,2BAA2B,CAAC,KAAO,gBAAgB,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,kBAAkB,KAAO,mBAAmB,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,WAAW,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,UAAU,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,WAAW,KAAO,WAAW,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,gCAAgC,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,SAAS,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,oBAAoB,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,gCAAgC,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,gCAAgC,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,IAAM,SAAS,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,eAAe,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,uCAAuC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,6BAA6B,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,6BAA6B,CAAC,KAAO,SAAS,KAAO,iBAAiB,KAAO,6BAA6B,CAAC,GAAK,WAAW,UAAY,6BAA6B,OAAS,GAAG,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,qCAAqC,OAAS,GAAG,KAAO,2BAA2B,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,WAAW,KAAO,oBAAoB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,KAAO,2BAA2B,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,8BAA8B,KAAO,6BAA6B,CAAC,GAAK,UAAU,UAAY,0CAA0C,OAAS,GAAG,KAAO,oCAAoC,CAAC,GAAK,UAAU,UAAY,0CAA0C,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,8BAA8B,KAAO,oCAAoC,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,cAAc,CAAC,KAAO,QAAQ,KAAO,aAAa,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,eAAe,OAAS,GAAG,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,GAAG,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,gBAAgB,KAAO,cAAc,CAAC,IAAM,SAAS,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,gBAAgB,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,cAAc,CAAC,KAAO,SAAS,KAAO,qBAAqB,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,UAAU,CAAC,KAAO,IAAI,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,eAAe,KAAO,uBAAuB,CAAC,GAAK,SAAS,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,kBAAkB,KAAO,uBAAuB,CAAC,IAAM,WAAW,UAAY,OAAO,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,SAAS,CAAC,KAAO,WAAW,KAAO,qBAAqB,KAAO,QAAQ,CAAC,GAAK,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,0BAA0B,KAAO,wBAAwB,CAAC,GAAK,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,yBAAyB,CAAC,IAAM,SAAS,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,cAAc,KAAO,cAAc,CAAC,GAAK,SAAS,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,qBAAqB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,uBAAuB,CAAC,GAAK,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,WAAW,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,YAAY,OAAS,GAAG,KAAO,YAAY,CAAC,GAAK,WAAW,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,YAAY,CAAC,GAAK,WAAW,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,YAAY,CAAC,IAAM,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,YAAY,CAAC,IAAM,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,YAAY,CAAC,IAAM,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,YAAY,CAAC,GAAK,WAAW,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,YAAY,CAAC,GAAK,WAAW,UAAY,UAAU,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,YAAY,CAAC,IAAM,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,YAAY,CAAC,GAAK,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,qBAAqB,KAAO,YAAY,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,GAAG,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,YAAY,CAAC,KAAO,iBAAiB,KAAO,QAAQ,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,mBAAmB,OAAS,GAAG,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,yBAAyB,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,UAAU,KAAO,aAAa,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,UAAU,KAAO,aAAa,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,eAAe,CAAC,KAAO,MAAM,KAAO,kBAAkB,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,cAAc,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,kBAAkB,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,IAAI,KAAO,eAAe,CAAC,KAAO,IAAI,KAAO,eAAe,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,kBAAkB,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,qBAAqB,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,qBAAqB,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,aAAa,CAAC,GAAK,SAAS,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,qBAAqB,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,oBAAoB,KAAO,gBAAgB,KAAO,WAAW,CAAC,IAAM,SAAS,UAAY,2BAA2B,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,GAAG,KAAO,cAAc,CAAC,IAAM,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,0BAA0B,CAAC,IAAM,UAAU,UAAY,mCAAmC,OAAS,GAAG,KAAO,0BAA0B,CAAC,GAAK,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,0BAA0B,CAAC,IAAM,SAAS,UAAY,6BAA6B,OAAS,GAAG,KAAO,0BAA0B,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,OAAO,KAAO,eAAe,KAAO,UAAU,CAAC,IAAM,SAAS,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,+BAA+B,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,YAAY,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,UAAU,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,6BAA6B,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,oBAAoB,KAAO,gBAAgB,CAAC,KAAO,oBAAoB,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,wBAAwB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,wBAAwB,KAAO,wBAAwB,CAAC,KAAO,sBAAsB,KAAO,mBAAmB,KAAO,WAAW,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,4BAA4B,CAAC,KAAO,UAAU,KAAO,WAAW,CAAC,KAAO,UAAU,KAAO,SAAS,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,gBAAgB,KAAO,YAAY,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,iBAAiB,KAAO,uBAAuB,KAAO,cAAc,CAAC,IAAM,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,qBAAqB,KAAO,WAAW,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,gCAAgC,CAAC,KAAO,qBAAqB,KAAO,kBAAkB,CAAC,KAAO,SAAS,KAAO,kBAAkB,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,6BAA6B,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,iBAAiB,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,iBAAiB,KAAO,iCAAiC,KAAO,gBAAgB,CAAC,GAAK,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,mBAAmB,KAAO,wBAAwB,KAAO,wBAAwB,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,QAAQ,CAAC,KAAO,eAAe,KAAO,mBAAmB,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,2BAA2B,CAAC,GAAK,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,8BAA8B,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,8BAA8B,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,wBAAwB,CAAC,GAAK,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,oBAAoB,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,UAAU,KAAO,WAAW,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,kBAAkB,CAAC,KAAO,gBAAgB,KAAO,oBAAoB,CAAC,KAAO,qBAAqB,KAAO,qCAAqC,CAAC,KAAO,aAAa,KAAO,gCAAgC,CAAC,KAAO,oBAAoB,KAAO,2CAA2C,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,kBAAkB,CAAC,KAAO,mBAAmB,KAAO,mCAAmC,KAAO,mCAAmC,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,YAAY,KAAO,0BAA0B,CAAC,GAAK,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,UAAU,KAAO,WAAW,CAAC,KAAO,OAAO,KAAO,gCAAgC,CAAC,KAAO,WAAW,KAAO,0BAA0B,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,QAAQ,CAAC,KAAO,oBAAoB,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,2BAA2B,CAAC,IAAM,SAAS,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,wBAAwB,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,iCAAiC,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,KAAO,2BAA2B,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,2BAA2B,CAAC,IAAM,UAAU,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,SAAS,CAAC,KAAO,cAAc,KAAO,QAAQ,KAAO,uBAAuB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,yBAAyB,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,SAAS,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,gCAAgC,CAAC,KAAO,qBAAqB,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,SAAS,KAAO,UAAU,CAAC,IAAM,QAAQ,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,uBAAuB,KAAO,uBAAuB,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,cAAc,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,qBAAqB,CAAC,KAAO,eAAe,KAAO,gBAAgB,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,SAAS,CAAC,KAAO,WAAW,KAAO,sBAAsB,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,QAAQ,CAAC,KAAO,MAAM,KAAO,SAAS,CAAC,KAAO,WAAW,KAAO,sBAAsB,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,SAAS,CAAC,KAAO,kBAAkB,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,qBAAqB,CAAC,KAAO,cAAc,KAAO,2BAA2B,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,kCAAkC,CAAC,KAAO,WAAW,KAAO,gBAAgB,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,UAAU,KAAO,mBAAmB,CAAC,IAAM,SAAS,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,mBAAmB,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,kCAAkC,CAAC,KAAO,WAAW,KAAO,gBAAgB,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,gCAAgC,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,gCAAgC,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,SAAS,CAAC,KAAO,iBAAiB,KAAO,SAAS,CAAC,KAAO,gBAAgB,KAAO,SAAS,CAAC,KAAO,cAAc,KAAO,qBAAqB,KAAO,eAAe,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,gBAAgB,KAAO,UAAU,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,yBAAyB,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,aAAa,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,WAAW,KAAO,kBAAkB,CAAC,GAAK,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,2BAA2B,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,gBAAgB,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,WAAW,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,uBAAuB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,mBAAmB,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,gBAAgB,KAAO,qBAAqB,KAAO,sBAAsB,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,IAAI,KAAO,WAAW,KAAO,6BAA6B,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,IAAI,KAAO,WAAW,KAAO,6BAA6B,CAAC,IAAM,UAAU,UAAY,wCAAwC,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,wCAAwC,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,2CAA2C,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,wCAAwC,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,CAAC,KAAO,YAAY,KAAO,UAAU,KAAO,8BAA8B,CAAC,GAAK,UAAU,UAAY,0CAA0C,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,8BAA8B,CAAC,GAAK,UAAU,UAAY,6CAA6C,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,yCAAyC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,YAAY,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,wCAAwC,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,WAAW,CAAC,KAAO,cAAc,KAAO,YAAY,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,0CAA0C,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,YAAY,KAAO,8BAA8B,CAAC,GAAK,UAAU,UAAY,4CAA4C,OAAS,GAAG,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,6CAA6C,OAAS,GAAG,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,8CAA8C,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,uBAAuB,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,iDAAiD,OAAS,CAAC,CAAC,KAAO,mBAAmB,KAAO,sBAAsB,CAAC,KAAO,kBAAkB,KAAO,uBAAuB,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,mDAAmD,OAAS,CAAC,CAAC,KAAO,mBAAmB,KAAO,sBAAsB,CAAC,KAAO,kBAAkB,KAAO,uBAAuB,KAAO,8BAA8B,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,+BAA+B,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,gCAAgC,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,4BAA4B,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,UAAU,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,kBAAkB,KAAO,+BAA+B,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,oCAAoC,OAAS,GAAG,KAAO,0BAA0B,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,WAAW,KAAO,qBAAqB,KAAO,0BAA0B,CAAC,IAAM,UAAU,UAAY,sBAAsB,OAAS,GAAG,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,oCAAoC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,gBAAgB,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,gCAAgC,OAAS,GAAG,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,GAAG,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,6CAA6C,OAAS,CAAC,CAAC,KAAO,kBAAkB,KAAO,mBAAmB,CAAC,KAAO,iBAAiB,KAAO,oBAAoB,KAAO,8BAA8B,CAAC,IAAM,SAAS,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,aAAa,KAAO,2BAA2B,CAAC,IAAM,UAAU,UAAY,yBAAyB,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,mBAAmB,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,mDAAmD,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,8BAA8B,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,UAAU,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,eAAe,CAAC,KAAO,gCAAgC,KAAO,gBAAgB,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,YAAY,CAAC,KAAO,UAAU,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,gCAAgC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,eAAe,CAAC,IAAM,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,eAAe,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,sBAAsB,KAAO,eAAe,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,uBAAuB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,0CAA0C,OAAS,GAAG,KAAO,gCAAgC,CAAC,GAAK,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,cAAc,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,kCAAkC,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,WAAW,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,iBAAiB,KAAO,4BAA4B,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,6BAA6B,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,GAAG,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,WAAW,KAAO,iBAAiB,CAAC,IAAM,SAAS,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,uCAAuC,OAAS,GAAG,KAAO,6BAA6B,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,8BAA8B,KAAO,6BAA6B,CAAC,IAAM,UAAU,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,YAAY,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,8BAA8B,KAAO,eAAe,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,6BAA6B,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,wBAAwB,KAAO,6BAA6B,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,SAAS,CAAC,KAAO,SAAS,KAAO,UAAU,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,GAAG,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,SAAS,CAAC,KAAO,SAAS,KAAO,UAAU,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,CAAC,KAAO,YAAY,KAAO,SAAS,CAAC,KAAO,SAAS,KAAO,UAAU,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,iCAAiC,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,0BAA0B,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,+BAA+B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,kCAAkC,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,yBAAyB,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,SAAS,UAAY,6BAA6B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,iCAAiC,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,sCAAsC,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,uCAAuC,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,OAAO,KAAO,sBAAsB,CAAC,KAAO,aAAa,KAAO,sBAAsB,CAAC,KAAO,eAAe,KAAO,sBAAsB,CAAC,KAAO,SAAS,KAAO,sBAAsB,CAAC,KAAO,cAAc,KAAO,8BAA8B,CAAC,KAAO,QAAQ,KAAO,8BAA8B,CAAC,KAAO,aAAa,KAAO,2BAA2B,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,eAAe,CAAC,IAAM,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,OAAO,KAAO,sBAAsB,CAAC,KAAO,aAAa,KAAO,2BAA2B,CAAC,KAAO,eAAe,KAAO,2BAA2B,CAAC,KAAO,SAAS,KAAO,2BAA2B,CAAC,KAAO,cAAc,KAAO,mCAAmC,CAAC,KAAO,QAAQ,KAAO,mCAAmC,CAAC,KAAO,aAAa,KAAO,4BAA4B,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,SAAS,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,oBAAoB,CAAC,GAAK,SAAS,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,SAAS,CAAC,KAAO,SAAS,KAAO,UAAU,KAAO,8BAA8B,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,iBAAiB,KAAO,8BAA8B,CAAC,KAAO,SAAS,KAAO,uBAAuB,CAAC,KAAO,SAAS,KAAO,4BAA4B,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,qBAAqB,KAAO,mBAAmB,KAAO,6BAA6B,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,gBAAgB,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,yBAAyB,CAAC,GAAK,UAAU,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,uBAAuB,CAAC,KAAO,cAAc,KAAO,+BAA+B,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,4BAA4B,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,kCAAkC,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,2BAA2B,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,eAAe,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,wBAAwB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,GAAG,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,yBAAyB,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,QAAQ,UAAY,+BAA+B,OAAS,GAAG,KAAO,yBAAyB,CAAC,IAAM,WAAW,UAAY,kDAAkD,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,yBAAyB,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,yBAAyB,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,yBAAyB,CAAC,KAAO,gBAAgB,KAAO,SAAS,CAAC,KAAO,mBAAmB,KAAO,SAAS,KAAO,wBAAwB,CAAC,GAAK,UAAU,UAAY,oEAAoE,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,SAAS,CAAC,KAAO,QAAQ,KAAO,SAAS,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,UAAU,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,GAAG,KAAO,yBAAyB,CAAC,IAAM,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,IAAI,KAAO,SAAS,CAAC,KAAO,KAAK,KAAO,UAAU,KAAO,yBAAyB,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,OAAO,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,mCAAmC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,oBAAoB,KAAO,sBAAsB,CAAC,GAAK,SAAS,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,+BAA+B,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,iCAAiC,OAAS,GAAG,KAAO,uBAAuB,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,kBAAkB,KAAO,aAAa,KAAO,uBAAuB,CAAC,GAAK,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,cAAc,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,WAAW,OAAS,GAAG,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,SAAS,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,sBAAsB,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,4BAA4B,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,mBAAmB,OAAS,GAAG,KAAO,cAAc,CAAC,IAAM,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,YAAY,CAAC,IAAM,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,YAAY,CAAC,GAAK,SAAS,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,YAAY,CAAC,GAAK,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,YAAY,CAAC,GAAK,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,QAAQ,KAAO,YAAY,CAAC,GAAK,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,oBAAoB,CAAC,KAAO,UAAU,KAAO,eAAe,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,0BAA0B,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,YAAY,CAAC,KAAO,OAAO,KAAO,yBAAyB,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,SAAS,KAAO,aAAa,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,gBAAgB,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,sBAAsB,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,uBAAuB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,sBAAsB,KAAO,uBAAuB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,gCAAgC,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,qBAAqB,CAAC,KAAO,QAAQ,KAAO,aAAa,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,KAAO,sBAAsB,CAAC,GAAK,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,YAAY,CAAC,KAAO,WAAW,KAAO,+BAA+B,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,YAAY,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,OAAO,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,qBAAqB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,YAAY,KAAO,oBAAoB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,KAAO,QAAQ,CAAC,IAAM,UAAU,UAAY,0BAA0B,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,GAAG,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,YAAY,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,SAAS,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,yBAAyB,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,6BAA6B,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,UAAU,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,OAAO,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,sBAAsB,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,gBAAgB,KAAO,QAAQ,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,SAAS,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,oCAAoC,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,gBAAgB,KAAO,wBAAwB,CAAC,KAAO,WAAW,KAAO,kBAAkB,CAAC,KAAO,oBAAoB,KAAO,kCAAkC,KAAO,eAAe,CAAC,GAAK,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,kBAAkB,KAAO,yBAAyB,CAAC,KAAO,WAAW,KAAO,kBAAkB,CAAC,KAAO,oBAAoB,KAAO,kCAAkC,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,eAAe,CAAC,GAAK,WAAW,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,YAAY,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,cAAc,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,CAAC,KAAO,gBAAgB,KAAO,kBAAkB,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,iBAAiB,CAAC,KAAO,eAAe,KAAO,iBAAiB,CAAC,KAAO,eAAe,KAAO,iBAAiB,CAAC,KAAO,gBAAgB,KAAO,iBAAiB,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,wBAAwB,KAAO,oBAAoB,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,IAAI,KAAO,WAAW,KAAO,6BAA6B,CAAC,GAAK,UAAU,UAAY,gDAAgD,OAAS,CAAC,CAAC,KAAO,qBAAqB,KAAO,oBAAoB,CAAC,KAAO,oBAAoB,KAAO,qBAAqB,KAAO,8BAA8B,CAAC,IAAM,WAAW,UAAY,qCAAqC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,YAAY,KAAO,8BAA8B,CAAC,GAAK,UAAU,UAAY,gCAAgC,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,sBAAsB,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,oBAAoB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,0BAA0B,KAAO,gBAAgB,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,mBAAmB,KAAO,eAAe,CAAC,KAAO,0BAA0B,KAAO,eAAe,CAAC,KAAO,yBAAyB,KAAO,eAAe,CAAC,KAAO,0BAA0B,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,gBAAgB,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,sBAAsB,KAAO,gBAAgB,CAAC,KAAO,qBAAqB,KAAO,gBAAgB,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,OAAO,CAAC,KAAO,iBAAiB,KAAO,QAAQ,CAAC,KAAO,gBAAgB,KAAO,QAAQ,CAAC,KAAO,0BAA0B,KAAO,QAAQ,KAAO,wBAAwB,CAAC,GAAK,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,wBAAwB,CAAC,KAAO,SAAS,KAAO,wBAAwB,CAAC,KAAO,OAAO,KAAO,yBAAyB,KAAO,gCAAgC,CAAC,IAAM,UAAU,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,GAAK,UAAU,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,yBAAyB,KAAO,2BAA2B,CAAC,IAAM,WAAW,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,YAAY,CAAC,IAAM,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,GAAG,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,8BAA8B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,GAAG,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,SAAS,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,iBAAiB,KAAO,SAAS,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,WAAW,KAAO,SAAS,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,mBAAmB,CAAC,KAAO,gBAAgB,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,SAAS,UAAY,SAAS,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,0BAA0B,KAAO,gBAAgB,CAAC,KAAO,yBAAyB,KAAO,gBAAgB,CAAC,KAAO,8BAA8B,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,sBAAsB,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,2BAA2B,KAAO,OAAO,CAAC,KAAO,6BAA6B,KAAO,OAAO,CAAC,KAAO,8BAA8B,KAAO,OAAO,CAAC,KAAO,gCAAgC,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,cAAc,CAAC,IAAM,SAAS,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,sBAAsB,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,aAAa,CAAC,GAAK,SAAS,UAAY,6BAA6B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,wBAAwB,OAAS,GAAG,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,SAAS,UAAY,8BAA8B,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,SAAS,UAAY,6CAA6C,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,0BAA0B,CAAC,GAAK,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,kBAAkB,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,kBAAkB,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,cAAc,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,WAAW,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,yCAAyC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,4CAA4C,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,oBAAoB,CAAC,GAAK,WAAW,UAAY,oCAAoC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,eAAe,CAAC,GAAK,WAAW,UAAY,uCAAuC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,SAAS,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,iBAAiB,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,YAAY,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,wBAAwB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,2CAA2C,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,oBAAoB,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,iCAAiC,OAAS,GAAG,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,2CAA2C,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,mCAAmC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,mBAAmB,KAAO,gCAAgC,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,qCAAqC,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,0BAA0B,CAAC,GAAK,SAAS,UAAY,+BAA+B,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,YAAY,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,gBAAgB,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,cAAc,CAAC,IAAM,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,QAAQ,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,oBAAoB,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,WAAW,KAAO,kBAAkB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,KAAO,SAAS,CAAC,IAAM,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,kBAAkB,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,GAAG,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,GAAG,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,gBAAgB,KAAO,uBAAuB,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,oBAAoB,KAAO,gBAAgB,CAAC,KAAO,uBAAuB,KAAO,iBAAiB,KAAO,2BAA2B,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,0BAA0B,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,GAAG,KAAO,aAAa,CAAC,IAAM,SAAS,UAAY,eAAe,OAAS,GAAG,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,GAAG,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,GAAG,KAAO,aAAa,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,GAAG,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,8BAA8B,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,0BAA0B,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,aAAa,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,sBAAsB,KAAO,eAAe,CAAC,KAAO,iBAAiB,KAAO,uBAAuB,CAAC,KAAO,YAAY,KAAO,0BAA0B,CAAC,KAAO,qBAAqB,KAAO,8BAA8B,KAAO,sBAAsB,CAAC,IAAM,SAAS,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,0BAA0B,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,aAAa,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,sBAAsB,KAAO,eAAe,CAAC,KAAO,iBAAiB,KAAO,uBAAuB,CAAC,KAAO,YAAY,KAAO,sBAAsB,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,4BAA4B,CAAC,KAAO,WAAW,KAAO,0BAA0B,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,iBAAiB,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,2BAA2B,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,mBAAmB,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,4BAA4B,KAAO,yBAAyB,CAAC,IAAM,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,eAAe,CAAC,GAAK,WAAW,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,iBAAiB,CAAC,KAAO,eAAe,KAAO,iBAAiB,CAAC,KAAO,mBAAmB,KAAO,iBAAiB,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,eAAe,KAAO,qBAAqB,CAAC,KAAO,gBAAgB,KAAO,qBAAqB,CAAC,KAAO,gBAAgB,KAAO,sBAAsB,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,WAAW,KAAO,yBAAyB,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,yBAAyB,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,gBAAgB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,sBAAsB,OAAS,GAAG,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,aAAa,KAAO,mBAAmB,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,8BAA8B,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,sBAAsB,CAAC,KAAO,YAAY,KAAO,wBAAwB,CAAC,KAAO,iBAAiB,KAAO,wBAAwB,CAAC,KAAO,kBAAkB,KAAO,wBAAwB,CAAC,KAAO,wBAAwB,KAAO,qBAAqB,CAAC,KAAO,eAAe,KAAO,cAAc,CAAC,KAAO,kBAAkB,KAAO,cAAc,CAAC,KAAO,aAAa,KAAO,cAAc,CAAC,KAAO,kBAAkB,KAAO,cAAc,CAAC,KAAO,qBAAqB,KAAO,cAAc,CAAC,KAAO,wBAAwB,KAAO,cAAc,CAAC,KAAO,wBAAwB,KAAO,cAAc,CAAC,KAAO,gCAAgC,KAAO,cAAc,CAAC,KAAO,kBAAkB,KAAO,cAAc,CAAC,KAAO,8BAA8B,KAAO,uCAAuC,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,mBAAmB,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,iBAAiB,KAAO,mBAAmB,KAAO,aAAa,CAAC,GAAK,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,gBAAgB,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,uBAAuB,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,sBAAsB,CAAC,KAAO,UAAU,KAAO,wBAAwB,CAAC,KAAO,WAAW,KAAO,wBAAwB,CAAC,KAAO,UAAU,KAAO,wBAAwB,CAAC,KAAO,UAAU,KAAO,wBAAwB,CAAC,KAAO,eAAe,KAAO,cAAc,CAAC,KAAO,gBAAgB,KAAO,cAAc,CAAC,KAAO,8BAA8B,KAAO,cAAc,CAAC,KAAO,kBAAkB,KAAO,cAAc,CAAC,KAAO,iBAAiB,KAAO,cAAc,CAAC,KAAO,gBAAgB,KAAO,cAAc,CAAC,KAAO,kBAAkB,KAAO,cAAc,CAAC,KAAO,iBAAiB,KAAO,cAAc,CAAC,KAAO,cAAc,KAAO,+BAA+B,CAAC,KAAO,aAAa,KAAO,8BAA8B,CAAC,KAAO,eAAe,KAAO,gCAAgC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,wBAAwB,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,wCAAwC,KAAO,iBAAiB,KAAO,yBAAyB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,0BAA0B,CAAC,KAAO,WAAW,KAAO,2BAA2B,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,gBAAgB,KAAO,6BAA6B,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,gCAAgC,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,wBAAwB,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,eAAe,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,eAAe,CAAC,KAAO,UAAU,KAAO,2BAA2B,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,SAAS,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,IAAI,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,gBAAgB,KAAO,aAAa,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,wBAAwB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,yBAAyB,CAAC,IAAM,UAAU,UAAY,mCAAmC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,oCAAoC,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,SAAS,KAAO,eAAe,CAAC,KAAO,oBAAoB,KAAO,eAAe,CAAC,KAAO,qBAAqB,KAAO,eAAe,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,8BAA8B,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,qBAAqB,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,kBAAkB,KAAO,wBAAwB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,eAAe,CAAC,KAAO,cAAc,KAAO,gBAAgB,KAAO,kBAAkB,CAAC,GAAK,UAAU,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,sBAAsB,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,SAAS,KAAO,gBAAgB,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,IAAI,KAAO,kBAAkB,CAAC,KAAO,aAAa,KAAO,gBAAgB,KAAO,6BAA6B,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,eAAe,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,eAAe,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,eAAe,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,mCAAmC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,YAAY,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,wBAAwB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,4BAA4B,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,sBAAsB,KAAO,iBAAiB,CAAC,KAAO,cAAc,KAAO,iBAAiB,CAAC,KAAO,mBAAmB,KAAO,iBAAiB,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,oBAAoB,KAAO,eAAe,CAAC,KAAO,gBAAgB,KAAO,eAAe,CAAC,KAAO,sBAAsB,KAAO,gBAAgB,CAAC,KAAO,sBAAsB,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,aAAa,CAAC,IAAM,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,gBAAgB,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,eAAe,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,mBAAmB,CAAC,KAAO,oBAAoB,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,qCAAqC,CAAC,KAAO,eAAe,KAAO,uCAAuC,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,eAAe,KAAO,gCAAgC,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,eAAe,KAAO,gCAAgC,CAAC,KAAO,2BAA2B,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,gCAAgC,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,2BAA2B,CAAC,GAAK,UAAU,UAAY,+BAA+B,OAAS,GAAG,KAAO,uBAAuB,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,GAAG,KAAO,uBAAuB,CAAC,IAAM,UAAU,UAAY,0BAA0B,OAAS,GAAG,KAAO,uBAAuB,CAAC,GAAK,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,uBAAuB,CAAC,GAAK,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,uBAAuB,CAAC,GAAK,UAAU,UAAY,2CAA2C,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,6CAA6C,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,4CAA4C,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,yBAAyB,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,8CAA8C,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,yBAAyB,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,mDAAmD,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,8BAA8B,CAAC,IAAM,WAAW,UAAY,mCAAmC,OAAS,CAAC,CAAC,KAAO,gBAAgB,KAAO,aAAa,KAAO,2BAA2B,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,KAAO,0BAA0B,CAAC,IAAM,UAAU,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,gCAAgC,CAAC,IAAM,UAAU,UAAY,wBAAwB,OAAS,GAAG,KAAO,gBAAgB,CAAC,IAAM,UAAU,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,gBAAgB,KAAO,kCAAkC,CAAC,GAAK,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,oBAAoB,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,gBAAgB,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,mBAAmB,KAAO,2BAA2B,CAAC,KAAO,kBAAkB,KAAO,2BAA2B,CAAC,KAAO,SAAS,KAAO,8BAA8B,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,mBAAmB,KAAO,8BAA8B,CAAC,KAAO,kBAAkB,KAAO,8BAA8B,CAAC,KAAO,SAAS,KAAO,8BAA8B,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,iBAAiB,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,8BAA8B,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,gCAAgC,CAAC,GAAK,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,sBAAsB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,+BAA+B,CAAC,GAAK,UAAU,UAAY,sCAAsC,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,sBAAsB,CAAC,KAAO,aAAa,KAAO,sBAAsB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,+BAA+B,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,8BAA8B,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,gCAAgC,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,gBAAgB,KAAO,OAAO,CAAC,KAAO,wBAAwB,KAAO,QAAQ,KAAO,wBAAwB,CAAC,IAAM,WAAW,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,gCAAgC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,kCAAkC,CAAC,GAAK,WAAW,UAAY,oDAAoD,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,uBAAuB,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,iDAAiD,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,uBAAuB,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,iDAAiD,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,uBAAuB,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,+CAA+C,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,sBAAsB,CAAC,KAAO,aAAa,KAAO,uBAAuB,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,8CAA8C,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,yBAAyB,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,6CAA6C,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,8BAA8B,CAAC,IAAM,WAAW,UAAY,oCAAoC,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,WAAW,KAAO,qCAAqC,CAAC,GAAK,SAAS,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,gBAAgB,KAAO,eAAe,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,iCAAiC,CAAC,IAAM,UAAU,UAAY,oCAAoC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,4BAA4B,CAAC,KAAO,UAAU,KAAO,WAAW,CAAC,KAAO,UAAU,KAAO,SAAS,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,gBAAgB,KAAO,YAAY,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,yBAAyB,CAAC,GAAK,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,6BAA6B,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,QAAQ,CAAC,KAAO,eAAe,KAAO,wBAAwB,KAAO,oBAAoB,CAAC,IAAM,WAAW,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,gBAAgB,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,uCAAuC,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,wCAAwC,CAAC,GAAK,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,gBAAgB,KAAO,gDAAgD,CAAC,KAAO,eAAe,KAAO,gBAAgB,KAAO,6BAA6B,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,aAAa,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,+BAA+B,CAAC,GAAK,UAAU,UAAY,yBAAyB,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,mBAAmB,CAAC,GAAK,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,mBAAmB,CAAC,IAAM,UAAU,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,+BAA+B,CAAC,IAAM,UAAU,UAAY,qCAAqC,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,+BAA+B,CAAC,IAAM,UAAU,UAAY,0BAA0B,OAAS,GAAG,KAAO,+BAA+B,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,uBAAuB,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,iCAAiC,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,SAAS,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,sBAAsB,CAAC,KAAO,mBAAmB,KAAO,kBAAkB,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,kCAAkC,KAAO,oBAAoB,CAAC,IAAM,UAAU,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,gBAAgB,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,4BAA4B,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,8BAA8B,CAAC,GAAK,UAAU,UAAY,yCAAyC,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,aAAa,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,2BAA2B,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,+BAA+B,CAAC,GAAK,UAAU,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,eAAe,CAAC,KAAO,UAAU,KAAO,uCAAuC,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,kCAAkC,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,yBAAyB,CAAC,GAAK,WAAW,UAAY,kCAAkC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,kCAAkC,KAAO,mCAAmC,CAAC,IAAM,UAAU,UAAY,mCAAmC,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,mBAAmB,KAAO,OAAO,CAAC,KAAO,oBAAoB,KAAO,iBAAiB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,sBAAsB,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,qDAAqD,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,sBAAsB,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,kBAAkB,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,kBAAkB,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,sBAAsB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,6CAA6C,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,iCAAiC,OAAS,GAAG,KAAO,uBAAuB,CAAC,GAAK,UAAU,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,YAAY,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,yBAAyB,CAAC,GAAK,UAAU,UAAY,wCAAwC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,YAAY,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,0BAA0B,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,oBAAoB,KAAO,kBAAkB,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,qBAAqB,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,YAAY,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,yBAAyB,CAAC,KAAO,mBAAmB,KAAO,wCAAwC,KAAO,oBAAoB,CAAC,GAAK,UAAU,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,+BAA+B,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,mBAAmB,KAAO,iCAAiC,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,YAAY,CAAC,KAAO,mBAAmB,KAAO,YAAY,CAAC,KAAO,mBAAmB,KAAO,YAAY,CAAC,KAAO,qBAAqB,KAAO,YAAY,CAAC,KAAO,mBAAmB,KAAO,YAAY,CAAC,KAAO,mBAAmB,KAAO,oBAAoB,CAAC,KAAO,cAAc,KAAO,qBAAqB,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,yCAAyC,OAAS,GAAG,KAAO,+BAA+B,CAAC,GAAK,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,8BAA8B,KAAO,+BAA+B,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,qDAAqD,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,YAAY,KAAO,kBAAkB,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,6BAA6B,OAAS,GAAG,KAAO,2BAA2B,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,2BAA2B,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,aAAa,KAAO,uBAAuB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,oBAAoB,KAAO,SAAS,KAAO,0BAA0B,CAAC,IAAM,UAAU,UAAY,gCAAgC,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,mCAAmC,KAAO,iCAAiC,CAAC,GAAK,UAAU,UAAY,gCAAgC,OAAS,GAAG,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,mCAAmC,OAAS,GAAG,KAAO,gBAAgB,CAAC,GAAK,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,gCAAgC,CAAC,GAAK,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,0BAA0B,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,YAAY,CAAC,KAAO,SAAS,KAAO,2CAA2C,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,8BAA8B,CAAC,KAAO,QAAQ,KAAO,8BAA8B,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,yBAAyB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,iBAAiB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,GAAG,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,uBAAuB,CAAC,GAAK,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,oCAAoC,KAAO,sBAAsB,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,SAAS,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,kBAAkB,CAAC,GAAK,WAAW,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,kBAAkB,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,iBAAiB,CAAC,IAAM,SAAS,UAAY,oCAAoC,OAAS,GAAG,KAAO,0BAA0B,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,qBAAqB,KAAO,0BAA0B,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,GAAG,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,2BAA2B,OAAS,GAAG,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,qBAAqB,CAAC,IAAM,QAAQ,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,SAAS,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,GAAG,KAAO,yBAAyB,CAAC,GAAK,UAAU,UAAY,iCAAiC,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,aAAa,KAAO,yBAAyB,CAAC,GAAK,WAAW,UAAY,8BAA8B,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,0BAA0B,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,GAAG,KAAO,sBAAsB,CAAC,GAAK,SAAS,UAAY,yBAAyB,OAAS,GAAG,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,8BAA8B,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,gBAAgB,CAAC,IAAM,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,WAAW,KAAO,4BAA4B,CAAC,GAAK,QAAQ,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,mBAAmB,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,6BAA6B,CAAC,GAAK,UAAU,UAAY,sBAAsB,OAAS,GAAG,KAAO,gBAAgB,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,yBAAyB,CAAC,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,KAAO,SAAS,KAAO,oBAAoB,CAAC,KAAO,iBAAiB,KAAO,qCAAqC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,iBAAiB,CAAC,IAAM,SAAS,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,oBAAoB,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,cAAc,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,WAAW,KAAO,0BAA0B,CAAC,KAAO,YAAY,KAAO,qBAAqB,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,uCAAuC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,4BAA4B,CAAC,GAAK,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,4BAA4B,CAAC,IAAM,WAAW,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,gBAAgB,KAAO,mBAAmB,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,8BAA8B,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,SAAS,UAAY,kCAAkC,OAAS,GAAG,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,+BAA+B,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,0BAA0B,OAAS,GAAG,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,sCAAsC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,yBAAyB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,mBAAmB,KAAO,wBAAwB,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,GAAG,KAAO,eAAe,CAAC,IAAM,WAAW,UAAY,cAAc,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,eAAe,CAAC,IAAM,SAAS,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,eAAe,CAAC,GAAK,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,eAAe,KAAO,gBAAgB,KAAO,UAAU,CAAC,GAAK,UAAU,UAAY,4BAA4B,OAAS,GAAG,KAAO,UAAU,CAAC,IAAM,UAAU,UAAY,mCAAmC,OAAS,GAAG,KAAO,yBAAyB,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,wBAAwB,KAAO,yBAAyB,CAAC,GAAK,WAAW,UAAY,gBAAgB,OAAS,GAAG,KAAO,YAAY,CAAC,GAAK,UAAU,UAAY,gBAAgB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,YAAY,CAAC,IAAM,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,SAAS,KAAO,YAAY,CAAC,IAAM,UAAU,UAAY,oBAAoB,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,qBAAqB,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,gCAAgC,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,UAAU,UAAY,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,qBAAqB,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,GAAG,KAAO,UAAU,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,wBAAwB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,wBAAwB,KAAO,gBAAgB,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,sCAAsC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,wBAAwB,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,WAAW,KAAO,sBAAsB,CAAC,GAAK,WAAW,UAAY,gCAAgC,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,6BAA6B,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,qBAAqB,CAAC,IAAM,UAAU,UAAY,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,qBAAqB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,yBAAyB,CAAC,IAAM,UAAU,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,kBAAkB,KAAO,yBAAyB,CAAC,IAAM,WAAW,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,gBAAgB,KAAO,mBAAmB,KAAO,6BAA6B,CAAC,GAAK,SAAS,UAAY,wCAAwC,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,sCAAsC,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,cAAc,CAAC,IAAM,WAAW,UAAY,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,IAAI,KAAO,eAAe,CAAC,KAAO,IAAI,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,qBAAqB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,KAAO,wBAAwB,CAAC,IAAM,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,wBAAwB,CAAC,GAAK,WAAW,UAAY,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,iBAAiB,KAAO,yBAAyB,KAAO,UAAU,CAAC,IAAM,SAAS,UAAY,iBAAiB,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,mBAAmB,KAAO,kBAAkB,CAAC,IAAM,WAAW,UAAY,WAAW,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,YAAY,CAAC,IAAM,UAAU,UAAY,4CAA4C,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,mBAAmB,KAAO,8BAA8B,CAAC,GAAK,SAAS,UAAY,wCAAwC,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,wCAAwC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,eAAe,KAAO,8BAA8B,CAAC,IAAM,UAAU,UAAY,sCAAsC,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,cAAc,CAAC,KAAO,YAAY,KAAO,eAAe,KAAO,8BAA8B,CAAC,IAAM,WAAW,UAAY,wCAAwC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,eAAe,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,qCAAqC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,sBAAsB,CAAC,KAAO,YAAY,KAAO,uBAAuB,KAAO,8BAA8B,CAAC,GAAK,SAAS,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,oBAAoB,KAAO,OAAO,CAAC,KAAO,qBAAqB,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,wBAAwB,KAAO,OAAO,CAAC,KAAO,yBAAyB,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,kBAAkB,KAAO,sBAAsB,CAAC,KAAO,QAAQ,KAAO,yBAAyB,KAAO,cAAc,CAAC,GAAK,UAAU,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,sBAAsB,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,wBAAwB,CAAC,GAAK,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,gBAAgB,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,IAAM,WAAW,UAAY,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,GAAK,UAAU,UAAY,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,mBAAmB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,cAAc,CAAC,GAAK,WAAW,UAAY,wCAAwC,OAAS,GAAG,KAAO,mBAAmB,CAAC,GAAK,UAAU,UAAY,kCAAkC,OAAS,GAAG,KAAO,8BAA8B,CAAC,IAAM,SAAS,UAAY,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,wBAAwB,KAAO,UAAU,CAAC,GAAK,WAAW,UAAY,oBAAoB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,2BAA2B,OAAS,GAAG,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,+BAA+B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,qBAAqB,CAAC,GAAK,WAAW,UAAY,uBAAuB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,wBAAwB,CAAC,GAAK,WAAW,UAAY,2CAA2C,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,8BAA8B,CAAC,GAAK,WAAW,UAAY,mCAAmC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,iBAAiB,CAAC,IAAM,UAAU,UAAY,oCAAoC,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,WAAW,UAAY,sBAAsB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,eAAe,KAAO,qBAAqB,CAAC,GAAK,UAAU,UAAY,aAAa,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,WAAW,QAAU,CAAC,CAAC,IAAM,UAAU,OAAS,iBAAiB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,KAAO,KAAK,CAAC,GAAK,WAAW,OAAS,kBAAkB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,OAAO,KAAO,KAAK,CAAC,IAAM,WAAW,OAAS,gBAAgB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,IAAM,WAAW,OAAS,cAAc,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,sBAAsB,CAAC,IAAM,WAAW,OAAS,cAAc,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,kBAAkB,CAAC,KAAO,qBAAqB,KAAO,8BAA8B,KAAO,sBAAsB,CAAC,GAAK,WAAW,OAAS,cAAc,OAAS,GAAG,KAAO,kBAAkB,CAAC,IAAM,WAAW,OAAS,2BAA2B,OAAS,GAAG,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,8BAA8B,CAAC,IAAM,WAAW,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,sBAAsB,CAAC,IAAM,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,mBAAmB,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,oBAAoB,KAAO,UAAU,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,SAAS,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,CAAC,KAAO,WAAW,KAAO,4BAA4B,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,oBAAoB,KAAO,sBAAsB,CAAC,IAAM,UAAU,OAAS,8BAA8B,OAAS,GAAG,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,sBAAsB,CAAC,IAAM,UAAU,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,sBAAsB,KAAO,gBAAgB,CAAC,IAAM,WAAW,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,cAAc,KAAO,kBAAkB,CAAC,GAAK,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,eAAe,CAAC,IAAM,UAAU,OAAS,uBAAuB,OAAS,GAAG,KAAO,yBAAyB,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,qBAAqB,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,yBAAyB,KAAO,6BAA6B,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,sBAAsB,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,mBAAmB,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,iBAAiB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,cAAc,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,mBAAmB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,cAAc,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,oBAAoB,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,yBAAyB,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,oBAAoB,CAAC,GAAK,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,kBAAkB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,IAAI,KAAO,UAAU,CAAC,KAAO,UAAU,KAAO,qBAAqB,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,qBAAqB,CAAC,GAAK,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,6BAA6B,CAAC,IAAM,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,eAAe,CAAC,KAAO,WAAW,KAAO,gBAAgB,KAAO,4BAA4B,CAAC,IAAM,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,gBAAgB,KAAO,6BAA6B,CAAC,GAAK,SAAS,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,iCAAiC,CAAC,GAAK,WAAW,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,sBAAsB,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,2BAA2B,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,kBAAkB,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,eAAe,KAAO,uBAAuB,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,uBAAuB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,2BAA2B,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,kBAAkB,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,cAAc,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,eAAe,KAAO,uBAAuB,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,uBAAuB,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,iBAAiB,CAAC,KAAO,sBAAsB,KAAO,iBAAiB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,YAAY,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,uBAAuB,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,yBAAyB,CAAC,IAAM,WAAW,OAAS,kBAAkB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,qBAAqB,CAAC,GAAK,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,WAAW,CAAC,GAAK,QAAQ,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,qBAAqB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,gBAAgB,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,mBAAmB,OAAS,GAAG,KAAO,iBAAiB,CAAC,GAAK,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,kBAAkB,KAAO,eAAe,CAAC,KAAO,OAAO,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,eAAe,KAAO,gBAAgB,CAAC,IAAM,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,qBAAqB,CAAC,KAAO,QAAQ,KAAO,qBAAqB,CAAC,KAAO,iBAAiB,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,IAAM,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,uBAAuB,KAAO,gBAAgB,CAAC,IAAM,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,qBAAqB,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,eAAe,CAAC,IAAM,UAAU,OAAS,iBAAiB,OAAS,GAAG,KAAO,UAAU,CAAC,GAAK,UAAU,OAAS,oBAAoB,OAAS,GAAG,KAAO,aAAa,CAAC,GAAK,WAAW,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,WAAW,KAAO,kBAAkB,CAAC,GAAK,WAAW,OAAS,qBAAqB,OAAS,GAAG,KAAO,mBAAmB,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,iBAAiB,CAAC,GAAK,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,OAAO,CAAC,KAAO,gBAAgB,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,MAAM,KAAO,UAAU,KAAO,iBAAiB,CAAC,GAAK,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,sBAAsB,CAAC,KAAO,MAAM,KAAO,SAAS,CAAC,KAAO,kBAAkB,KAAO,SAAS,KAAO,iBAAiB,CAAC,IAAM,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,sBAAsB,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,sBAAsB,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,sBAAsB,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,iCAAiC,CAAC,GAAK,WAAW,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,sBAAsB,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,uBAAuB,KAAO,iCAAiC,CAAC,GAAK,UAAU,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,sBAAsB,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,iCAAiC,CAAC,GAAK,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,gBAAgB,CAAC,GAAK,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,uBAAuB,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,iBAAiB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,iBAAiB,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,mBAAmB,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,4BAA4B,CAAC,KAAO,SAAS,KAAO,qBAAqB,CAAC,KAAO,QAAQ,KAAO,OAAO,KAAO,KAAK,CAAC,IAAM,WAAW,OAAS,kBAAkB,OAAS,GAAG,KAAO,gBAAgB,CAAC,GAAK,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,gBAAgB,KAAO,6BAA6B,CAAC,GAAK,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,kBAAkB,OAAS,CAAC,CAAC,KAAO,IAAI,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,kBAAkB,CAAC,IAAM,UAAU,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,oBAAoB,KAAO,wBAAwB,CAAC,IAAM,UAAU,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,6BAA6B,KAAO,wBAAwB,CAAC,IAAM,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,kCAAkC,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,wBAAwB,OAAS,GAAG,KAAO,kBAAkB,CAAC,GAAK,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,mBAAmB,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,kBAAkB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,KAAO,KAAK,CAAC,IAAM,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,yBAAyB,CAAC,IAAM,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,GAAK,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,wBAAwB,CAAC,GAAK,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,iBAAiB,KAAO,WAAW,KAAO,sBAAsB,CAAC,IAAM,WAAW,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,kCAAkC,KAAO,gBAAgB,CAAC,IAAM,UAAU,OAAS,4BAA4B,OAAS,GAAG,KAAO,0BAA0B,CAAC,IAAM,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,sBAAsB,OAAS,GAAG,KAAO,oBAAoB,CAAC,IAAM,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,0BAA0B,KAAO,4BAA4B,CAAC,IAAM,WAAW,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,yBAAyB,CAAC,KAAO,eAAe,KAAO,kCAAkC,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,0BAA0B,KAAO,sBAAsB,CAAC,IAAM,UAAU,OAAS,+BAA+B,OAAS,GAAG,KAAO,yBAAyB,CAAC,GAAK,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,0CAA0C,KAAO,sBAAsB,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,KAAO,KAAK,CAAC,IAAM,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,0BAA0B,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,sBAAsB,CAAC,GAAK,WAAW,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,cAAc,CAAC,GAAK,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,mBAAmB,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,uBAAuB,CAAC,IAAM,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,mBAAmB,CAAC,KAAO,WAAW,KAAO,SAAS,KAAO,oCAAoC,CAAC,IAAM,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,oBAAoB,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,WAAW,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,mBAAmB,KAAO,WAAW,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,yBAAyB,CAAC,IAAM,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,gBAAgB,KAAO,6BAA6B,CAAC,IAAM,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,gBAAgB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,yBAAyB,KAAO,qBAAqB,CAAC,GAAK,WAAW,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,6BAA6B,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,gCAAgC,CAAC,IAAM,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,cAAc,KAAO,+BAA+B,CAAC,GAAK,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,yBAAyB,KAAO,kBAAkB,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,yBAAyB,CAAC,KAAO,UAAU,KAAO,kBAAkB,CAAC,KAAO,aAAa,KAAO,gBAAgB,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,eAAe,KAAO,mBAAmB,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,sBAAsB,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,SAAS,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,yBAAyB,CAAC,KAAO,MAAM,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,6BAA6B,CAAC,IAAM,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,WAAW,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,IAAI,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,qBAAqB,CAAC,GAAK,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,SAAS,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,YAAY,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,sBAAsB,CAAC,GAAK,UAAU,OAAS,mBAAmB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,yBAAyB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,WAAW,KAAO,uBAAuB,CAAC,IAAM,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,gCAAgC,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,8BAA8B,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,kBAAkB,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,KAAK,KAAO,UAAU,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,uBAAuB,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,QAAQ,KAAO,uBAAuB,CAAC,GAAK,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,kBAAkB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,WAAW,KAAO,iBAAiB,CAAC,GAAK,UAAU,OAAS,kBAAkB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,WAAW,KAAO,QAAQ,CAAC,IAAM,SAAS,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,QAAQ,KAAO,4BAA4B,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,eAAe,KAAO,uBAAuB,CAAC,KAAO,WAAW,KAAO,iCAAiC,CAAC,KAAO,gBAAgB,KAAO,iBAAiB,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,2BAA2B,CAAC,KAAO,UAAU,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,uBAAuB,CAAC,KAAO,eAAe,KAAO,uBAAuB,CAAC,KAAO,WAAW,KAAO,kCAAkC,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,kCAAkC,KAAO,8BAA8B,CAAC,IAAM,UAAU,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,kBAAkB,CAAC,KAAO,MAAM,KAAO,kBAAkB,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,qBAAqB,CAAC,GAAK,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,mBAAmB,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,4BAA4B,KAAO,wBAAwB,CAAC,IAAM,WAAW,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,kBAAkB,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,kCAAkC,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,GAAG,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,6BAA6B,CAAC,GAAK,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,iBAAiB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,2BAA2B,CAAC,GAAK,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,iBAAiB,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,6BAA6B,CAAC,GAAK,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,kBAAkB,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,oCAAoC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,GAAK,WAAW,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,wBAAwB,CAAC,IAAM,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,wBAAwB,KAAO,6BAA6B,CAAC,IAAM,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,mBAAmB,KAAO,iBAAiB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,2BAA2B,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,uBAAuB,CAAC,GAAK,UAAU,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,2BAA2B,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,uBAAuB,CAAC,IAAM,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,kBAAkB,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,kBAAkB,CAAC,IAAM,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,wBAAwB,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,oBAAoB,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,4BAA4B,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,wBAAwB,CAAC,IAAM,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,gBAAgB,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,aAAa,KAAO,YAAY,CAAC,IAAM,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,aAAa,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,wBAAwB,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,kBAAkB,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,qBAAqB,KAAO,wBAAwB,CAAC,GAAK,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,2BAA2B,CAAC,IAAM,WAAW,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,yBAAyB,KAAO,mCAAmC,CAAC,GAAK,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,oBAAoB,KAAO,kBAAkB,CAAC,KAAO,qBAAqB,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,2BAA2B,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,0BAA0B,CAAC,GAAK,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,yBAAyB,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,uBAAuB,CAAC,GAAK,UAAU,OAAS,wBAAwB,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,iBAAiB,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,mBAAmB,KAAO,mCAAmC,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,oCAAoC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,yBAAyB,CAAC,KAAO,WAAW,KAAO,+BAA+B,CAAC,KAAO,WAAW,KAAO,mBAAmB,KAAO,uBAAuB,CAAC,IAAM,UAAU,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,kBAAkB,KAAO,uBAAuB,CAAC,IAAM,QAAQ,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,CAAC,KAAO,WAAW,KAAO,QAAQ,KAAO,uBAAuB,CAAC,IAAM,WAAW,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,mBAAmB,CAAC,KAAO,UAAU,KAAO,wBAAwB,KAAO,uBAAuB,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,eAAe,KAAO,gBAAgB,CAAC,GAAK,WAAW,OAAS,sBAAsB,OAAS,GAAG,KAAO,YAAY,CAAC,GAAK,WAAW,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,SAAS,CAAC,KAAO,WAAW,KAAO,sBAAsB,KAAO,mBAAmB,CAAC,GAAK,WAAW,OAAS,mBAAmB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,MAAM,KAAO,SAAS,CAAC,KAAO,WAAW,KAAO,sBAAsB,KAAO,mBAAmB,CAAC,GAAK,UAAU,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,MAAM,KAAO,SAAS,CAAC,KAAO,kBAAkB,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,sBAAsB,KAAO,mBAAmB,CAAC,GAAK,UAAU,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,0BAA0B,CAAC,KAAO,gBAAgB,KAAO,SAAS,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,aAAa,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,kBAAkB,CAAC,IAAM,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,CAAC,KAAO,gBAAgB,KAAO,UAAU,KAAO,oBAAoB,CAAC,GAAK,WAAW,OAAS,oBAAoB,OAAS,GAAG,KAAO,aAAa,CAAC,IAAM,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,sBAAsB,CAAC,IAAM,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,0BAA0B,CAAC,IAAM,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,4BAA4B,CAAC,IAAM,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,aAAa,CAAC,KAAO,gBAAgB,KAAO,qBAAqB,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,IAAI,KAAO,UAAU,CAAC,KAAO,gBAAgB,KAAO,uCAAuC,CAAC,KAAO,SAAS,KAAO,6BAA6B,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,4BAA4B,CAAC,IAAM,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,SAAS,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,oBAAoB,CAAC,IAAM,UAAU,OAAS,sCAAsC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,kBAAkB,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,oBAAoB,KAAO,QAAQ,CAAC,GAAK,SAAS,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,0BAA0B,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,gBAAgB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,sBAAsB,OAAS,GAAG,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,qBAAqB,CAAC,IAAM,UAAU,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,gBAAgB,KAAO,4BAA4B,CAAC,GAAK,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,iBAAiB,CAAC,KAAO,2BAA2B,KAAO,iBAAiB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,kBAAkB,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,cAAc,KAAO,4BAA4B,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,uBAAuB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,sBAAsB,CAAC,KAAO,OAAO,KAAO,uBAAuB,KAAO,iBAAiB,CAAC,GAAK,UAAU,OAAS,+BAA+B,OAAS,GAAG,KAAO,6BAA6B,CAAC,GAAK,UAAU,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,iCAAiC,OAAS,GAAG,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,IAAI,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,6BAA6B,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,qBAAqB,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,oBAAoB,CAAC,GAAK,UAAU,OAAS,+BAA+B,OAAS,GAAG,KAAO,6BAA6B,CAAC,IAAM,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,aAAa,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,6BAA6B,OAAS,GAAG,KAAO,uBAAuB,CAAC,GAAK,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,4BAA4B,KAAO,uBAAuB,CAAC,IAAM,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,oBAAoB,CAAC,KAAO,mBAAmB,KAAO,SAAS,KAAO,eAAe,CAAC,IAAM,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,4BAA4B,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,6BAA6B,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,6BAA6B,CAAC,IAAM,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,2BAA2B,CAAC,KAAO,cAAc,KAAO,+BAA+B,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,iBAAiB,KAAO,iBAAiB,CAAC,GAAK,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,sBAAsB,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,yBAAyB,CAAC,GAAK,SAAS,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,sBAAsB,CAAC,KAAO,eAAe,KAAO,sBAAsB,KAAO,yBAAyB,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,oBAAoB,OAAS,GAAG,KAAO,wBAAwB,CAAC,IAAM,WAAW,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,kBAAkB,CAAC,IAAM,WAAW,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,qBAAqB,KAAO,gBAAgB,CAAC,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,iBAAiB,KAAO,mBAAmB,CAAC,GAAK,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,GAAG,KAAO,wBAAwB,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,OAAO,KAAO,KAAK,CAAC,IAAM,WAAW,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,QAAQ,CAAC,KAAO,QAAQ,KAAO,OAAO,KAAO,KAAK,CAAC,IAAM,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,oBAAoB,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,gCAAgC,OAAS,GAAG,KAAO,sBAAsB,CAAC,IAAM,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,0BAA0B,OAAS,GAAG,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,oBAAoB,OAAS,GAAG,KAAO,aAAa,CAAC,GAAK,WAAW,OAAS,kBAAkB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,0BAA0B,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,uBAAuB,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,oBAAoB,CAAC,IAAM,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,QAAQ,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,8BAA8B,OAAS,GAAG,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,8BAA8B,OAAS,GAAG,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,sBAAsB,OAAS,GAAG,KAAO,oBAAoB,CAAC,GAAK,SAAS,OAAS,mBAAmB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,iBAAiB,CAAC,GAAK,WAAW,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,UAAU,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,0BAA0B,KAAO,iBAAiB,CAAC,IAAM,WAAW,OAAS,uCAAuC,OAAS,GAAG,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,uCAAuC,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,4BAA4B,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,UAAU,KAAO,kBAAkB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,eAAe,CAAC,IAAM,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,uCAAuC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,gBAAgB,KAAO,qBAAqB,KAAO,WAAW,CAAC,IAAM,SAAS,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,mBAAmB,KAAO,aAAa,CAAC,IAAM,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,sBAAsB,KAAO,aAAa,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,SAAS,KAAO,QAAQ,CAAC,KAAO,WAAW,KAAO,sBAAsB,KAAO,QAAQ,CAAC,IAAM,SAAS,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,sBAAsB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,0BAA0B,OAAS,GAAG,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,kCAAkC,OAAS,GAAG,KAAO,gCAAgC,CAAC,GAAK,WAAW,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,yBAAyB,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,2BAA2B,CAAC,GAAK,UAAU,OAAS,sCAAsC,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,QAAQ,KAAO,2BAA2B,CAAC,GAAK,WAAW,OAAS,qCAAqC,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,mBAAmB,KAAO,yBAAyB,CAAC,IAAM,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,YAAY,CAAC,GAAK,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,4BAA4B,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,QAAQ,KAAO,WAAW,CAAC,GAAK,SAAS,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,UAAU,KAAO,2BAA2B,KAAO,kCAAkC,CAAC,IAAM,UAAU,OAAS,kCAAkC,OAAS,GAAG,KAAO,kBAAkB,CAAC,GAAK,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,iBAAiB,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,qBAAqB,CAAC,KAAO,SAAS,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,MAAM,KAAO,mBAAmB,KAAO,iBAAiB,CAAC,IAAM,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,qBAAqB,CAAC,KAAO,SAAS,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,eAAe,CAAC,KAAO,MAAM,KAAO,mBAAmB,KAAO,iBAAiB,CAAC,GAAK,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,8BAA8B,KAAO,gBAAgB,CAAC,KAAO,KAAK,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,cAAc,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,WAAW,KAAO,0BAA0B,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,eAAe,KAAO,gBAAgB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,iBAAiB,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,QAAQ,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,gBAAgB,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,gBAAgB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,gBAAgB,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,qBAAqB,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,YAAY,CAAC,GAAK,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,yBAAyB,CAAC,KAAO,WAAW,KAAO,uCAAuC,KAAO,SAAS,CAAC,GAAK,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,cAAc,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,WAAW,KAAO,yBAAyB,CAAC,KAAO,WAAW,KAAO,uCAAuC,KAAO,SAAS,CAAC,IAAM,UAAU,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,cAAc,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,sBAAsB,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,aAAa,KAAO,sBAAsB,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,mBAAmB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,eAAe,KAAO,SAAS,CAAC,GAAK,WAAW,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,kBAAkB,CAAC,IAAM,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,mBAAmB,CAAC,IAAM,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,mBAAmB,CAAC,IAAM,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,UAAU,KAAO,iBAAiB,CAAC,IAAM,WAAW,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,oBAAoB,KAAO,iBAAiB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,6BAA6B,OAAS,GAAG,KAAO,2BAA2B,CAAC,GAAK,UAAU,OAAS,+BAA+B,OAAS,GAAG,KAAO,0BAA0B,CAAC,GAAK,WAAW,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,2BAA2B,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,sBAAsB,CAAC,IAAM,WAAW,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,4BAA4B,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,WAAW,KAAO,yBAAyB,CAAC,IAAM,UAAU,OAAS,4BAA4B,OAAS,GAAG,KAAO,wBAAwB,CAAC,IAAM,WAAW,OAAS,qCAAqC,OAAS,GAAG,KAAO,iCAAiC,CAAC,GAAK,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,yBAAyB,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,oCAAoC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,gBAAgB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,wBAAwB,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,IAAI,KAAO,iBAAiB,KAAO,cAAc,CAAC,IAAM,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,mBAAmB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,KAAO,uBAAuB,CAAC,GAAK,SAAS,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,WAAW,KAAO,uBAAuB,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,6BAA6B,CAAC,IAAM,WAAW,OAAS,oBAAoB,OAAS,GAAG,KAAO,kBAAkB,CAAC,GAAK,UAAU,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,QAAQ,CAAC,IAAM,QAAQ,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,OAAO,KAAO,UAAU,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,wBAAwB,CAAC,IAAM,UAAU,OAAS,mCAAmC,OAAS,GAAG,KAAO,yBAAyB,CAAC,GAAK,UAAU,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,0BAA0B,KAAO,yBAAyB,CAAC,IAAM,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,sBAAsB,CAAC,GAAK,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,qBAAqB,CAAC,GAAK,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,8BAA8B,CAAC,IAAM,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,QAAQ,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,qBAAqB,CAAC,IAAM,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,sBAAsB,CAAC,IAAM,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,gBAAgB,KAAO,4BAA4B,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,cAAc,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,SAAS,KAAO,aAAa,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,sBAAsB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,oBAAoB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,aAAa,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,SAAS,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,mBAAmB,CAAC,IAAM,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,MAAM,KAAO,qBAAqB,CAAC,KAAO,UAAU,KAAO,eAAe,CAAC,KAAO,SAAS,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,2BAA2B,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,UAAU,KAAO,gBAAgB,KAAO,eAAe,CAAC,GAAK,WAAW,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,iBAAiB,KAAO,kCAAkC,CAAC,GAAK,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,WAAW,KAAO,gCAAgC,CAAC,GAAK,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,cAAc,KAAO,QAAQ,KAAO,0BAA0B,CAAC,GAAK,UAAU,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,QAAQ,KAAO,eAAe,KAAO,gBAAgB,CAAC,IAAM,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,WAAW,KAAO,aAAa,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,gCAAgC,CAAC,GAAK,WAAW,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,+BAA+B,CAAC,IAAM,WAAW,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,UAAU,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,cAAc,KAAO,eAAe,CAAC,KAAO,iBAAiB,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,+BAA+B,CAAC,GAAK,WAAW,OAAS,4CAA4C,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,WAAW,KAAO,cAAc,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,oCAAoC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,kCAAkC,CAAC,IAAM,UAAU,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,YAAY,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,IAAI,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,gCAAgC,CAAC,IAAM,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,WAAW,CAAC,IAAM,SAAS,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,WAAW,KAAO,cAAc,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,qCAAqC,CAAC,IAAM,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,iBAAiB,KAAO,iBAAiB,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,aAAa,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,eAAe,KAAO,gBAAgB,CAAC,KAAO,sBAAsB,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,qBAAqB,CAAC,IAAM,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,kBAAkB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,iCAAiC,CAAC,GAAK,UAAU,OAAS,yCAAyC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,aAAa,KAAO,SAAS,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,SAAS,KAAO,aAAa,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,aAAa,KAAO,WAAW,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,+BAA+B,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,sBAAsB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,mBAAmB,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,sBAAsB,CAAC,IAAM,WAAW,OAAS,wBAAwB,OAAS,GAAG,KAAO,+BAA+B,CAAC,GAAK,WAAW,OAAS,+BAA+B,OAAS,GAAG,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,kBAAkB,CAAC,IAAM,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,UAAU,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,8BAA8B,CAAC,GAAK,UAAU,OAAS,sCAAsC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,gBAAgB,CAAC,GAAK,WAAW,OAAS,oCAAoC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,cAAc,KAAO,QAAQ,KAAO,kCAAkC,CAAC,GAAK,WAAW,OAAS,qCAAqC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,mCAAmC,CAAC,GAAK,WAAW,OAAS,+BAA+B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,WAAW,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,qBAAqB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,wBAAwB,CAAC,IAAM,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,yBAAyB,KAAO,QAAQ,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,sCAAsC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,QAAQ,CAAC,KAAO,8BAA8B,KAAO,gBAAgB,CAAC,KAAO,yBAAyB,KAAO,iBAAiB,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,oCAAoC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,cAAc,KAAO,cAAc,KAAO,4BAA4B,CAAC,IAAM,UAAU,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,gBAAgB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,6BAA6B,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,gBAAgB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,oBAAoB,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,iCAAiC,CAAC,IAAM,SAAS,OAAS,qCAAqC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,sBAAsB,KAAO,kBAAkB,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,QAAQ,KAAO,+BAA+B,CAAC,GAAK,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,aAAa,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,qBAAqB,CAAC,KAAO,SAAS,KAAO,eAAe,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,YAAY,KAAO,kBAAkB,CAAC,KAAO,UAAU,KAAO,WAAW,KAAO,2BAA2B,CAAC,GAAK,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,aAAa,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,qBAAqB,CAAC,GAAK,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,aAAa,KAAO,gBAAgB,KAAO,4BAA4B,CAAC,IAAM,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,yBAAyB,CAAC,GAAK,UAAU,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,mBAAmB,KAAO,iCAAiC,CAAC,IAAM,UAAU,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,gCAAgC,CAAC,GAAK,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,IAAI,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,kBAAkB,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,qBAAqB,CAAC,GAAK,UAAU,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,kBAAkB,CAAC,GAAK,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,cAAc,KAAO,qBAAqB,CAAC,GAAK,WAAW,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,MAAM,KAAO,aAAa,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,MAAM,KAAO,aAAa,CAAC,KAAO,MAAM,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,kBAAkB,CAAC,KAAO,eAAe,KAAO,oBAAoB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,kBAAkB,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,UAAU,KAAO,uBAAuB,KAAO,iBAAiB,CAAC,GAAK,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,MAAM,KAAO,aAAa,CAAC,KAAO,WAAW,KAAO,QAAQ,CAAC,KAAO,kBAAkB,KAAO,eAAe,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,UAAU,KAAO,uBAAuB,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,MAAM,KAAO,aAAa,CAAC,KAAO,MAAM,KAAO,UAAU,CAAC,KAAO,eAAe,KAAO,oBAAoB,CAAC,KAAO,WAAW,KAAO,WAAW,KAAO,uBAAuB,CAAC,GAAK,UAAU,OAAS,oCAAoC,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,yBAAyB,KAAO,sBAAsB,CAAC,IAAM,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,MAAM,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,cAAc,KAAO,UAAU,CAAC,KAAO,OAAO,KAAO,WAAW,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,kBAAkB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,wBAAwB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,cAAc,KAAO,iBAAiB,CAAC,IAAM,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,0BAA0B,CAAC,GAAK,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,KAAK,KAAO,iBAAiB,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,yBAAyB,CAAC,IAAM,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,YAAY,KAAO,UAAU,CAAC,KAAO,YAAY,KAAO,WAAW,KAAO,YAAY,CAAC,GAAK,WAAW,OAAS,yCAAyC,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,oBAAoB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,qCAAqC,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,oBAAoB,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,oBAAoB,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,kBAAkB,CAAC,KAAO,OAAO,KAAO,cAAc,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,6BAA6B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,gBAAgB,KAAO,eAAe,KAAO,4BAA4B,CAAC,GAAK,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,6BAA6B,CAAC,GAAK,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,mBAAmB,KAAO,QAAQ,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,qCAAqC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,SAAS,CAAC,KAAO,UAAU,KAAO,6BAA6B,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,uCAAuC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,YAAY,CAAC,KAAO,UAAU,KAAO,6BAA6B,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,6BAA6B,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,UAAU,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,cAAc,KAAO,iBAAiB,KAAO,oBAAoB,CAAC,IAAM,SAAS,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,wBAAwB,CAAC,GAAK,UAAU,OAAS,oCAAoC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,6BAA6B,CAAC,IAAM,SAAS,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,eAAe,KAAO,gBAAgB,KAAO,QAAQ,CAAC,IAAM,UAAU,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,yBAAyB,CAAC,GAAK,UAAU,OAAS,iCAAiC,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,yBAAyB,CAAC,GAAK,UAAU,OAAS,mCAAmC,OAAS,GAAG,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,OAAO,CAAC,KAAO,gBAAgB,KAAO,cAAc,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,sBAAsB,CAAC,GAAK,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,OAAO,CAAC,KAAO,OAAO,KAAO,SAAS,KAAO,sBAAsB,CAAC,IAAM,WAAW,OAAS,gCAAgC,OAAS,GAAG,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,OAAO,KAAO,aAAa,CAAC,KAAO,KAAK,KAAO,gBAAgB,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,OAAO,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,iBAAiB,KAAO,WAAW,KAAO,sBAAsB,CAAC,IAAM,UAAU,OAAS,2BAA2B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,yBAAyB,OAAS,CAAC,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,mBAAmB,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,UAAU,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,QAAQ,CAAC,GAAK,UAAU,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,iBAAiB,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,uBAAuB,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,WAAW,CAAC,IAAM,UAAU,OAAS,4BAA4B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,UAAU,CAAC,KAAO,aAAa,KAAO,eAAe,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,YAAY,KAAO,QAAQ,CAAC,KAAO,UAAU,KAAO,sBAAsB,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,IAAI,KAAO,kBAAkB,CAAC,KAAO,cAAc,KAAO,OAAO,CAAC,KAAO,YAAY,KAAO,OAAO,CAAC,KAAO,eAAe,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,QAAQ,KAAO,wBAAwB,CAAC,IAAM,WAAW,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,KAAO,wBAAwB,CAAC,IAAM,UAAU,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,QAAQ,KAAO,kBAAkB,CAAC,KAAO,gBAAgB,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,iBAAiB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,kCAAkC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,WAAW,KAAO,OAAO,CAAC,KAAO,SAAS,KAAO,SAAS,KAAO,WAAW,CAAC,GAAK,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,aAAa,KAAO,QAAQ,KAAO,4BAA4B,CAAC,GAAK,UAAU,OAAS,oCAAoC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,QAAQ,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,QAAQ,KAAO,gBAAgB,KAAO,WAAW,CAAC,GAAK,WAAW,OAAS,0BAA0B,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,WAAW,CAAC,IAAM,WAAW,OAAS,uCAAuC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,gCAAgC,OAAS,CAAC,CAAC,KAAO,SAAS,KAAO,QAAQ,KAAO,QAAQ,CAAC,GAAK,WAAW,OAAS,gCAAgC,OAAS,GAAG,KAAO,qBAAqB,CAAC,IAAM,UAAU,OAAS,8BAA8B,OAAS,GAAG,KAAO,wBAAwB,CAAC,GAAK,UAAU,OAAS,8BAA8B,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,WAAW,KAAO,QAAQ,CAAC,IAAM,WAAW,OAAS,mCAAmC,OAAS,CAAC,CAAC,KAAO,QAAQ,KAAO,KAAK,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,OAAO,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,aAAa,CAAC,KAAO,OAAO,KAAO,qBAAqB,CAAC,KAAO,QAAQ,KAAO,qBAAqB,CAAC,KAAO,iBAAiB,KAAO,mBAAmB,KAAO,gBAAgB,CAAC,GAAK,WAAW,OAAS,oCAAoC,OAAS,CAAC,CAAC,KAAO,UAAU,KAAO,gBAAgB,CAAC,KAAO,UAAU,KAAO,SAAS,KAAO,aAAa,MAAQ,K,+CC3BrhqT,SAASwrB,GAAUziF,GAEhC,OAAOA,IAAQ,CACjB,CCAe,SAAS0iF,GAAcC,EAAcC,GAElD,OADAD,EAAOF,GAAUE,GAAOC,EAAMH,GAAUG,GACjC,KAAOD,GAAME,UAAU,IAAI1vF,IAAI,KAAOyvF,GAC/C,CCJO,MAAME,GAAa,KAAOv5B,OAAOC,kBAC3Bu5B,GAAc,KAAO,SAAWC,IAAI,IACpCC,GAAaF,GAAYG,OAAO,SCDtC,SAASC,GAAgBhiF,EAA8BiiF,EAAO,KACnE,OAAO,eAAiBjiF,aAAiB3D,WAAa,IAAI2D,GAASA,EAAOiiF,EAC5E,CCiBA,MAAMC,IAAa,0BAA8B14E,GAAsB,cAAhBA,EAAE24E,YAA2BtyF,GAC9EuyF,IAAY,0BAA8B54E,GAAsB,aAAhBA,EAAE24E,YAA0BtyF,GAC5EwyF,IAAU,0BAA8B74E,GAAsB,WAAhBA,EAAE24E,YAAwBtyF,GACxEyyF,IAAc,8BAAkC94E,GAAsB,gBAAhBA,EAAE24E,YAA6BtyF,GAGrF0yF,GAAoC,QAE1C,MAAMC,GAUJxvF,YAAYrE,EAA4D,CAAC,GATjE,KAAA6kD,UAAY,KACZ,KAAAn0B,OAAS,EACT,KAAAojE,SAAU,EACV,KAAAlnF,OAAQ,EAOdrI,KAAKsgD,UAAY7kD,EAAQ+zF,gBAAkB,KAC3CxvF,KAAKuvF,QAAU9zF,EAAQ8zF,UAAW,EAClCvvF,KAAKyvF,cACP,CAEOA,eACLzvF,KAAKgJ,OAAS,IAAI0mF,YAAY1vF,KAAKsgD,WACnCtgD,KAAK2vF,QAAU,IAAIC,WAAW5vF,KAAKgJ,QACnChJ,KAAK6vF,SAAW,IAAI1mF,WAAWnJ,KAAKgJ,OACtC,CAEO8mF,WACL,MAAMC,EAAe,IAAIL,YAAY1vF,KAAKmsB,QAQpC6jE,EAAc,IAAIJ,WAAWG,GAQnC,OAPAC,EAAYhoF,IAAIhI,KAAK2vF,QAAQM,SAAS,EAAGjwF,KAAKmsB,OAAS,IAOhD6jE,CACT,CAEOE,YACL,OAAOlwF,KAAK8vF,WAAW9mF,MACzB,CAIOmnF,SAASC,GAAiB,GAC/B,GAAGA,EAAO,CACR,MAAML,EAAe,IAAIL,YAAY1vF,KAAKmsB,QACpCkkE,EAAc,IAAIlnF,WAAW4mF,GAInC,OAFAM,EAAYroF,IAAIhI,KAAK6vF,SAASI,SAAS,EAAGjwF,KAAKmsB,SAExCkkE,C,CAGT,MAAMvjF,EAAkB,IAAIhM,MAAMd,KAAKmsB,QACvC,IAAI,IAAIzmB,EAAI,EAAGA,EAAI1F,KAAKmsB,SAAUzmB,EAChCoH,EAAMpH,GAAK1F,KAAK6vF,SAASnqF,GAE3B,OAAOoH,CACT,CAEOwjF,YACL,OAAOtwF,KAAKmsB,MACd,CAEOokE,YAAYC,GACjB,GAAGxwF,KAAKmsB,OAASqkE,EAAYxwF,KAAKsgD,UAChC,OAIFtgD,KAAKsgD,UAAwF,EAA5E//B,KAAK6qB,KAAK7qB,KAAK4E,IAAqB,EAAjBnlB,KAAKsgD,UAAetgD,KAAKmsB,OAASqkE,EAAY,IAAM,GACxF,MAAMC,EAAiBzwF,KAAKgJ,OAEtB0nF,EAAgB,IAAId,WAAWa,GAErCzwF,KAAKyvF,eAEL,IAAIG,WAAW5vF,KAAKgJ,QAAQhB,IAAI0oF,EAGlC,CAEOC,SAASjrF,EAAWkrF,GACzB5wF,KAAKqI,OAAS3K,QAAQyC,IAAI,MAAOuF,EAAEqH,SAAS,IAAKrH,EAAGkrF,GAEpD,MAAMzkE,EAASnsB,KAAKmsB,OAAS,EAK7B,OAJAnsB,KAAKuwF,YAAY,GACjBvwF,KAAK2vF,QAAQxjE,GAAUzmB,EACvB1F,KAAKmsB,QAAU,EAERA,CACT,CAEO0kE,SAASnrF,EAAWkrF,GACzB,OAAO5wF,KAAK2wF,SAASjrF,GAAIkrF,GAAS,IAAM,OAC1C,CAEOE,UAAUprF,EAAYkrF,GACxBlrF,EACD1F,KAAK2wF,SAASzB,IAAW0B,GAAS,IAAM,SAExC5wF,KAAK2wF,SAAS3B,IAAY4B,GAAS,IAAM,QAE7C,CAEOG,WAAWC,EAAeC,EAAcL,GAC7C5wF,KAAK2wF,SAASM,GAAOL,GAAS,IAAM,cACpC5wF,KAAK2wF,SAASK,GAAQJ,GAAS,IAAM,cACvC,CAEOM,UAAUC,EAAwCP,GACvD,GAAG9vF,MAAMiD,QAAQotF,GACf,OAAoB,IAAjBA,EAAM30F,OACAwD,KAAK+wF,WAAWI,EAAM,GAAIA,EAAM,GAAIP,GAEpC5wF,KAAKoxF,cAAcD,EAAO,GAAIP,GAIzC,MAAMS,GD3IuBC,EC2II,KAAOH,ID1I5BI,aAAe7C,GAAY5vF,IAAIwyF,GAAUA,EADlD,IAA0BA,EC4I7B,MAAM,SAACE,EAAQ,UAAEC,GAAaJ,EAAQK,OAAO,YACvCpD,EAAOkD,EAASG,aAChBpD,EAAMkD,EAAUE,aAEtB3xF,KAAK2wF,SAASpC,GAAMqC,GAAS,IAAM,cACnC5wF,KAAK2wF,SAASrC,GAAOsC,GAAS,IAAM,cACtC,CAEOgB,YAAY1kE,EAAQ0jE,GACzB,MAAM5nF,EAAS,IAAI0mF,YAAY,GACzBC,EAAU,IAAIC,WAAW5mF,GACZ,IAAI6oF,aAAa7oF,GAEzB,GAAKkkB,EAEhBltB,KAAK2wF,SAAShB,EAAQ,IAAKiB,GAAS,IAAM,gBAC1C5wF,KAAK2wF,SAAShB,EAAQ,IAAKiB,GAAS,IAAM,gBAC5C,CAEOkB,YAAYl6B,EAAWg5B,GAC5B5wF,KAAKqI,OAAS3K,QAAQyC,IAAI,MAAOy3D,GAAIg5B,GAAS,IAAM,gBAE3C3xF,IAAN24D,IACDA,EAAI,IAEN,MAAMm6B,EAAQC,SAASj0F,mBAAmB65D,IAE1C53D,KAAKuwF,YAAYwB,EAAMv1F,OAAS,GAEhC,MAAMkQ,EAAMqlF,EAAMv1F,OACfkQ,GAAO,IACR1M,KAAK6vF,SAAS7vF,KAAKmsB,UAAYzf,GAE/B1M,KAAK6vF,SAAS7vF,KAAKmsB,UAAY,IAC/BnsB,KAAK6vF,SAAS7vF,KAAKmsB,UAAkB,IAANzf,EAC/B1M,KAAK6vF,SAAS7vF,KAAKmsB,WAAmB,MAANzf,IAAiB,EACjD1M,KAAK6vF,SAAS7vF,KAAKmsB,WAAmB,SAANzf,IAAmB,IAErD,IAAI,IAAIhH,EAAI,EAAGA,EAAIgH,IAAOhH,EACxB1F,KAAK6vF,SAAS7vF,KAAKmsB,UAAY4lE,EAAMtb,WAAW/wE,GAIlD,KAAM1F,KAAKmsB,OAAS,GAClBnsB,KAAK6vF,SAAS7vF,KAAKmsB,UAAY,CAEnC,CAEO8lE,WAAWnlF,EAA4C8jF,GACzD9jF,aAAiB4iF,YAClB5iF,EAAQ,IAAI3D,WAAW2D,QACL7N,IAAV6N,IACRA,EAAQ,IAGV9M,KAAKqI,OAAS3K,QAAQyC,IAAI,MAAO0M,EAAWC,IAAqB8jF,GAAS,IAAM,UAGhF,MAAMlkF,EAAOI,EAAqBtQ,OAelC,IAdAwD,KAAKuwF,YAAY7jF,EAAM,GACpBA,GAAO,IACR1M,KAAK6vF,SAAS7vF,KAAKmsB,UAAYzf,GAE/B1M,KAAK6vF,SAAS7vF,KAAKmsB,UAAY,IAC/BnsB,KAAK6vF,SAAS7vF,KAAKmsB,UAAkB,IAANzf,EAC/B1M,KAAK6vF,SAAS7vF,KAAKmsB,WAAmB,MAANzf,IAAiB,EACjD1M,KAAK6vF,SAAS7vF,KAAKmsB,WAAmB,SAANzf,IAAmB,IAGrD1M,KAAK6vF,SAAS7nF,IAAI8E,EAAqB9M,KAAKmsB,QAC5CnsB,KAAKmsB,QAAUzf,EAGT1M,KAAKmsB,OAAS,GAClBnsB,KAAK6vF,SAAS7vF,KAAKmsB,UAAY,CAEnC,CAEOilE,cAActkF,EAA4ColF,EAActB,GAC1E9jF,aAAiB4iF,cAClB5iF,EAAQ,IAAI3D,WAAW2D,IAGzB,MAAMJ,EAAOI,EAAqBtQ,OAClC,GAAI01F,EAAO,IAAc,EAANxlF,IAAawlF,EAAM,CACpC,MAAMv0F,EAAQ,IAAIoN,MAAM,iBAAmBmnF,EAAO,KAAOxlF,GAEzD,MADAhP,QAAQC,MAAMA,EAAOmP,EAAO8jF,GACtBjzF,C,CAGRqC,KAAKqI,OAAS3K,QAAQyC,IAAI,MAAO0M,EAAWC,IAAuB8jF,GAAS,IAAM,OAASsB,GAC3FlyF,KAAKuwF,YAAY7jF,GAEjB1M,KAAK6vF,SAAS7nF,IAAI8E,EAAqB9M,KAAKmsB,QAC5CnsB,KAAKmsB,QAAUzf,CACjB,CAEOylF,cAAcrlF,EAA0B8jF,GAC1C9jF,aAAiB4iF,cAClB5iF,EAAQ,IAAI3D,WAAW2D,IAGzB,MAAMJ,EAAMI,EAAMtQ,OAElBwD,KAAKqI,OAAS3K,QAAQyC,IAAI,MAAO0M,EAAWC,GAAS8jF,GAAS,IAC9D5wF,KAAKuwF,YAAY7jF,GAEjB1M,KAAK6vF,SAAS7nF,IAAI8E,EAAO9M,KAAKmsB,QAC9BnsB,KAAKmsB,QAAUzf,CACjB,CAEO0lF,YAAYC,EAAoBr+E,GACrC,MACMs+E,GADStyF,KAAKuvF,QAAU,WAAiB,QACrBgD,QAAQh0F,MAAMi0F,GAAMA,EAAE3pF,SAAWwpF,IAE3D,IAAIC,EACF,MAAM,IAAIvnF,MAAM,aAAesnF,EAAa,UAG9CryF,KAAK6wF,SAASyB,EAAW31F,GAAI01F,EAAa,QAE1C,MAAMp1F,EAAS+W,EAAO/W,QAAU+W,EAC1By+E,EAA8C,CAAC,EAErD,IAAI,MAAMC,KAASJ,EAAWt+E,OAAQ,CACpC,IAAIlW,EAAO40F,EAAM50F,KAEjB,IAA0B,IAAvBA,EAAKrD,QAAQ,KAAa,CAC3B,MAAMk4F,EAAW70F,EAAK8B,MAAM,KACtBgzF,EAAWD,EAAS,GAAG/yF,MAAM,KAEnC,KAAKoU,EAAO4+E,EAAS,IAAO,IAAMA,EAAS,IAAM,CAC/C,KAAmB,SAAhBD,EAAS,GAAgB11F,EAAOy1F,EAAMzyF,WAA+BhB,IAAvB+U,EAAO0+E,EAAMzyF,OAI5D,SAFA+T,EAAO4+E,EAAS,KAAO,IAAMA,EAAS,E,CAO1C90F,EAAO60F,EAAS,E,CAIlB,MAAMvwF,EAASpC,KAAK6yF,YAAY7+E,EAAO0+E,EAAMzyF,MAAOnC,EAAMu0F,EAAa,IAAMK,EAAMzyF,KAAO,KAE9E,MAATnC,IACDkW,EAAO0+E,EAAMzyF,MAAQ+T,EAAO0+E,EAAMzyF,OAAS,EAC3CwyF,EAAaC,EAAMzyF,MAAQmC,E,CAI/B,IAAI,MAAM0wF,KAAaL,EACrBzyF,KAAK2vF,QAAQ8C,EAAaK,IAAc9+E,EAAO8+E,GAGjD,OAAOR,EAAWx0F,IACpB,CAEO+0F,YAAY1hF,EAAUrT,EAAc8yF,GAEzC,OAAO9yF,GACL,IAAK,IACHqT,EAAMA,GAAO,EACf,IAAK,MACH,OAAOnR,KAAK6wF,SAAS1/E,EAAKy/E,GAC5B,IAAK,OACH,OAAO5wF,KAAKkxF,UAAU//E,EAAKy/E,GAC7B,IAAK,SACH,OAAO5wF,KAAKoxF,cAAcjgF,EAAK,IAAKy/E,GACtC,IAAK,SACH,OAAO5wF,KAAKoxF,cAAcjgF,EAAK,IAAKy/E,GACtC,IAAK,SACH,OAAO5wF,KAAKoxF,cAAcjgF,EAAK,IAAKy/E,GACtC,IAAK,SACH,OAAO5wF,KAAK8xF,YAAY3gF,EAAKy/E,GAC/B,IAAK,QACH,OAAO5wF,KAAKiyF,WAAW9gF,EAAKy/E,GAC9B,IAAK,SACH,OAAO5wF,KAAK4xF,YAAYzgF,EAAKy/E,GAC/B,IAAK,OACH,OAAO5wF,KAAK8wF,UAAU3/E,EAAKy/E,GAC7B,IAAK,OACH,OAGJ,GAAG9vF,MAAMiD,QAAQoN,GAAM,CACrB,GAAyB,WAAtBrT,EAAK6B,OAAO,EAAG,GAChBK,KAAK2wF,SAASxB,GAAQyB,EAAQ,aACzB,GAAyB,WAAtB9yF,EAAK6B,OAAO,EAAG,GACvB,MAAM,IAAIoL,MAAM,uBAAyBjN,GAG3C,MAAMi1F,EAAWj1F,EAAK6B,OAAO,EAAG7B,EAAKtB,OAAS,GAC9CwD,KAAK2wF,SAASx/E,EAAI3U,OAAQo0F,EAAQ,WAClC,IAAI,IAAIlrF,EAAI,EAAGA,EAAIyL,EAAI3U,SAAUkJ,EAC/B1F,KAAK6yF,YAAY1hF,EAAIzL,GAAIqtF,EAAUnC,EAAQ,IAAMlrF,EAAI,KAGvD,OAAO,C,CACF,GAAuC,WAApC5H,EAAK6B,OAAO,EAAG,GAAGnF,cAC1B,MAAM,IAAIuQ,MAAM,yBAGlB,KAAI,EAAAqY,GAAA,GAASjS,GACX,MAAM,IAAIpG,MAAM,2BAA6BjN,GAG/C,MAAMk1F,EAAShzF,KAAKuvF,QAAU,WAAiB,OACzCN,EAAY99E,EAAO,EACzB,IAAI8hF,GAAS,EACb,MAAMC,EAAsCF,EAAO5gE,aAAa7zB,MAAM+X,GAAMA,EAAE24E,YAAcA,IAM5F,IAJGgE,EAA6B,MAAnBn1F,EAAKlC,OAAO,MACvBkC,EAAOA,EAAK6B,OAAO,KAGjBuzF,EACF,MAAM,IAAInoF,MAAM,gBAAkBkkF,EAAY,UAG7CA,IAAcnxF,IACfm1F,GAAS,GAGPA,GACFjzF,KAAK2wF,SAASuC,EAAgBv2F,GAAIi0F,EAAQ,IAAM3B,EAAY,SAG9D,MAAMhyF,EAASkU,EAAIlU,OACbw1F,EAA8C,CAAC,EAErD,IAAI,MAAMC,KAASQ,EAAgBl/E,OAAQ,CACzC,IAAIlW,EAAO40F,EAAM50F,KAGjB,IAA0B,IAAvBA,EAAKrD,QAAQ,KAAa,CAC3B,MAAMk4F,EAAW70F,EAAK8B,MAAM,KACtBgzF,EAAWD,EAAS,GAAG/yF,MAAM,KAInC,KAAKuR,EAAIyhF,EAAS,IAAO,IAAMA,EAAS,IAAM,CAC5C,KAAmB,SAAhBD,EAAS,GAAgB11F,GAAUA,EAAOy1F,EAAMzyF,WAA4BhB,IAApBkS,EAAIuhF,EAAMzyF,OAInE,SAFAkR,EAAIyhF,EAAS,KAAO,IAAMA,EAAS,E,CAMvC90F,EAAO60F,EAAS,E,CAIlB,MAAMvwF,EAASpC,KAAK6yF,YAAY1hF,EAAIuhF,EAAMzyF,MAAOnC,EAAM8yF,EAAQ,IAAM3B,EAAY,KAAOyD,EAAMzyF,KAAO,KAEzF,MAATnC,IACDqT,EAAIuhF,EAAMzyF,MAAQkR,EAAIuhF,EAAMzyF,OAAS,EACrCwyF,EAAaC,EAAMzyF,MAAQmC,E,CAI/B,IAAI,MAAM0wF,KAAaL,EACrBzyF,KAAK2vF,QAAQ8C,EAAaK,IAAc3hF,EAAI2hF,GAG9C,OAAOI,EAAgBp1F,IACzB,EAGF,MAAMq1F,GAYJrzF,YAAYkJ,EAAkCvN,EAAgE,CAAC,GAXvG,KAAA0wB,OAAS,EAQT,KAAAojE,SAAmB,EAKtBvmF,aAAkB0mF,aACnB1vF,KAAKgJ,OAASA,EACdhJ,KAAK2vF,QAAU,IAAIC,WAAW5mF,GAC9BhJ,KAAK6vF,SAAW,IAAI1mF,WAAWnJ,KAAKgJ,UAEpChJ,KAAKgJ,OAASA,EAAOA,OACrBhJ,KAAK2vF,QAAU,IAAIC,WAAW5mF,EAAOA,QACrChJ,KAAK6vF,SAAW7mF,GAKlBhJ,KAAKg0B,SAAWv4B,EAAQu4B,UAAY,CAAC,EACrCh0B,KAAKuvF,UAAY9zF,EAAQ8zF,QACzBvvF,KAAKqI,WAA0BpJ,IAAlBxD,EAAQ4M,OAAsB5M,EAAQ4M,KACrD,CAMQ+qF,QAAQxC,GAEd,GAAI5wF,KAAK6vF,SAASrzF,OAASwD,KAAKmsB,OAAU,EAExC,MADAzuB,QAAQC,MAAMqC,KAAK6vF,SAAU7vF,KAAKmsB,QAC5B,IAAIphB,MAAM,qBAAuB6lF,GAGzC,MAAMlrF,EAAI1F,KAAK2vF,QAAQ3vF,KAAKmsB,OAAS,GAUrC,OAPAnsB,KAAKqI,OACH3K,QAAQyC,IAAI,MAAOuF,EAAEqH,SAAS,IAAKrH,EAAGkrF,EACpC5wF,KAAK6vF,SAASroF,MAAMxH,KAAKmsB,OAAS,GAAInsB,KAAKmsB,OAAS,IACpDtf,EAAW7M,KAAK6vF,SAASroF,MAAMxH,KAAKmsB,OAAS,GAAInsB,KAAKmsB,OAAS,MAEnEnsB,KAAKmsB,QAAU,EAERzmB,CACT,CAEO2tF,SAASzC,GACd,OAAO5wF,KAAKozF,SAASxC,GAAS,IAAM,OACtC,CAEO0C,YAAY1C,GACjB,MAAM5nF,EAAS,IAAI0mF,YAAY,GACzBC,EAAU,IAAIC,WAAW5mF,GACzBuqF,EAAa,IAAI1B,aAAa7oF,GAKpC,OAHA2mF,EAAQ,GAAK3vF,KAAKozF,SAASxC,GAAS,IAAM,gBAC1CjB,EAAQ,GAAK3vF,KAAKozF,SAASxC,GAAS,IAAM,iBAEnC2C,EAAW,EACpB,CAGOC,UAAU5C,GACf,MAAMK,EAAOjxF,KAAKozF,SAASxC,GAAS,IAAM,cAG1C,IAAI6C,EAAQpF,GAFEruF,KAAKozF,SAASxC,GAAS,IAAM,eAEVK,GD3e9B,IAAwBK,ECgf3B,OAJuBtxF,KAAKuvF,UAC1BkE,GD7eyBnC,EC6eFmC,GD5ebC,QAAQ9E,IAAc0C,EAAOqC,MAAMjF,IAAe4C,IC+e1DtxF,KAAKuvF,SACJd,GAAWmF,gBAAgBH,EAAMI,OAE3BJ,EAAM9B,aAKV8B,EAAM1mF,SAAS,GACxB,CAEO+mF,UAAUlD,GACf,MAAMlrF,EAAI1F,KAAKozF,SAASxC,GAAS,IAAM,SACvC,OAAGlrF,IAAMwpF,IAECxpF,IAAMspF,KAIhBhvF,KAAKmsB,QAAU,EACRnsB,KAAK+zF,YAAY,SAAUnD,GACpC,CAEOoD,YAAYpD,GACjB,IAAIlkF,EAAM1M,KAAK6vF,SAAS7vF,KAAKmsB,UAElB,MAARzf,IACDA,EAAM1M,KAAK6vF,SAAS7vF,KAAKmsB,UACtBnsB,KAAK6vF,SAAS7vF,KAAKmsB,WAAa,EAChCnsB,KAAK6vF,SAAS7vF,KAAKmsB,WAAa,IAGrC,IAUIyrC,EAVAm6B,EAAQ,GACZ,IAAI,IAAIrsF,EAAI,EAAGA,EAAIgH,IAAOhH,EACxBqsF,GAASkC,OAAOC,aAAal0F,KAAK6vF,SAAS7vF,KAAKmsB,WAIlD,KAAMnsB,KAAKmsB,OAAS,KAChBnsB,KAAKmsB,OAIT,IACEyrC,EAAIu8B,mBAAmBlT,OAAO8Q,G,CAC9B,MAAMxvF,GACNq1D,EAAIm6B,C,CAKN,OAFA/xF,KAAKqI,OAAS3K,QAAQyC,IAAI,MAAOy3D,GAAIg5B,GAAS,IAAM,WAE7Ch5B,CACT,CAEOw8B,WAAWxD,GAChB,IAAIlkF,EAAM1M,KAAK6vF,SAAS7vF,KAAKmsB,UAElB,MAARzf,IACDA,EAAM1M,KAAK6vF,SAAS7vF,KAAKmsB,UACtBnsB,KAAK6vF,SAAS7vF,KAAKmsB,WAAa,EAChCnsB,KAAK6vF,SAAS7vF,KAAKmsB,WAAa,IAGrC,MAAMrf,EAAQ9M,KAAK6vF,SAASR,IAAarvF,KAAKmsB,OAAQnsB,KAAKmsB,OAASzf,GAIpE,IAHA1M,KAAKmsB,QAAUzf,EAGT1M,KAAKmsB,OAAS,KAChBnsB,KAAKmsB,OAKT,OAFAnsB,KAAKqI,OAAS3K,QAAQyC,IAAI,MAAO0M,EAAWC,IAAS8jF,GAAS,IAAM,UAE7D9jF,CACT,CAIOunF,cAAcnC,EAAc9B,GAAiB,EAAMQ,GACxD,GAAGsB,EAAO,GACR,MAAM,IAAInnF,MAAM,iBAAmBmnF,GAGrC,MAAMxlF,EAAMwlF,EAAO,EACnB,GAAG9B,EAAO,CACR,MAAMhuF,EAASpC,KAAK6vF,SAASR,IAAarvF,KAAKmsB,OAAQnsB,KAAKmsB,OAASzf,GAErE,OADA1M,KAAKmsB,QAAUzf,EACRtK,C,CAGT,MAAM0K,EAAkB,IAAIhM,MAAM4L,GAClC,IAAI,IAAIhH,EAAI,EAAGA,EAAIgH,IAAOhH,EACxBoH,EAAMpH,GAAK1F,KAAK6vF,SAAS7vF,KAAKmsB,UAKhC,OAFAnsB,KAAKqI,OAAS3K,QAAQyC,IAAI,MAAO0M,EAAWC,IAAS8jF,GAAS,IAAM,OAASsB,GAEtEplF,CACT,CAIOwnF,cAAc5nF,EAAqB0jF,GAAiB,EAAMQ,GAC/D,IAAW,IAARlkF,IACDA,EAAM1M,KAAKozF,SAASxC,GAAS,IAAM,YAC1B5wF,KAAK6vF,SAASvlF,WACrB,MAAM,IAAIS,MAAM,6BAA+B2B,EAAM,iBAAmB1M,KAAK6vF,SAASvlF,YAI1F,GAAG8lF,EAAO,CACR,MAAMtjF,EAAQ,IAAI3D,WAAWuD,GAG7B,OAFAI,EAAM9E,IAAIhI,KAAK6vF,SAASR,IAAarvF,KAAKmsB,OAAQnsB,KAAKmsB,OAASzf,IAChE1M,KAAKmsB,QAAUzf,EACRI,C,CAGT,MAAMA,EAAkB,IAAIhM,MAAM4L,GAClC,IAAI,IAAIhH,EAAI,EAAGA,EAAIgH,IAAOhH,EACxBoH,EAAMpH,GAAK1F,KAAK6vF,SAAS7vF,KAAKmsB,UAKhC,OAFAnsB,KAAKqI,OAAS3K,QAAQyC,IAAI,MAAO0M,EAAWC,GAAS8jF,GAAS,IAEvD9jF,CACT,CAEQynF,YAAYz2F,EAAc8yF,GAChC,MAAMlkF,EAAM1M,KAAKozF,QAAQxC,EAAQ,WAC3BxuF,EAAgB,IAAItB,MAAM4L,GAChC,GAAGA,EAAM,EAAG,CACV,MAAMqmF,EAAWj1F,EAAK6B,OAAO,EAAG7B,EAAKtB,OAAS,GAC9C,IAAI,IAAIkJ,EAAI,EAAGA,EAAIgH,IAAOhH,EACxBtD,EAAOsD,GAAK1F,KAAK+zF,YAAYhB,EAAUnC,EAAQ,IAAMlrF,EAAI,I,CAI7D,OAAOtD,CACT,CAEO2xF,YAAYj2F,EAAc8yF,GAC/B,OAAO9yF,GACL,IAAK,IACL,IAAK,MACH,OAAOkC,KAAKqzF,SAASzC,GACvB,IAAK,OACH,OAAO5wF,KAAKwzF,UAAU5C,GACxB,IAAK,SACH,OAAO5wF,KAAKq0F,cAAc,KAAK,EAAMzD,GACvC,IAAK,SACH,OAAO5wF,KAAKq0F,cAAc,KAAK,EAAMzD,GACvC,IAAK,SACH,OAAO5wF,KAAKq0F,cAAc,KAAK,EAAMzD,GACvC,IAAK,SACH,OAAO5wF,KAAKg0F,YAAYpD,GAC1B,IAAK,QACH,OAAO5wF,KAAKo0F,WAAWxD,GACzB,IAAK,SACH,OAAO5wF,KAAKszF,YAAY1C,GAC1B,IAAK,OACH,OAAO5wF,KAAK8zF,UAAUlD,GACxB,IAAK,OACH,OAAO,EAKX,GAFAA,EAAQA,GAAS9yF,GAAQ,SAEH,MAAnBA,EAAKlC,OAAO,IAAoC,UAAtBkC,EAAK6B,OAAO,EAAG,GAC1C,OAAOK,KAAKu0F,YAAYz2F,EAAM8yF,GAGhC,MAAMoC,EAAShzF,KAAKuvF,QAAU,WAAiB,OAC/C,IAAI2D,EAAsC,KACtCsB,GAAW,EAEf,GAAsB,MAAnB12F,EAAKlC,OAAO,GAAY,CACzB,MAAM64F,EAAY32F,EAAK6B,OAAO,GAE9B,GADAuzF,EAAkBF,EAAO5gE,aAAa7zB,MAAM+X,GAAMA,EAAExY,OAAS22F,KACzDvB,EACF,MAAM,IAAInoF,MAAM,mCAAqCjN,E,KAO/C,CACR,MAAM42F,EAAiB10F,KAAKozF,QAAQxC,EAAQ,QAE5C,GAAG8D,IAAmBtF,GAAY,CAChC,MACMuF,GCnrByB7nF,EDkrBZ9M,KAAKo0F,WAAWxD,EAAQ,mBChrBlC,aAAa9jF,OAAmC7N,IDorBzD,OAFwB,IAAIk0F,GAAkBwB,GAEvBZ,YAAYj2F,EAAM8yF,E,CAG3C,GAAG8D,IAAmBvF,GACpB,OAAOnvF,KAAKu0F,YAAYz2F,EAAM8yF,GAGhC,IAAIzvF,EAAQ6xF,EAAO4B,kBACnB,IAAIzzF,EAAO,CACT6xF,EAAO4B,kBAAoBzzF,EAAQ,CAAC,EACpC,IAAI,IAAIuE,EAAI,EAAGgH,EAAMsmF,EAAO5gE,aAAa51B,OAAQkJ,EAAIgH,IAAOhH,EAC1DvE,EAAM6xF,EAAO5gE,aAAa1sB,GAAG/I,IAAM+I,C,CAIvC,MAAMA,EAAIvE,EAAMuzF,GAKhB,QAJSz1F,IAANyG,IACDwtF,EAAkBF,EAAO5gE,aAAa1sB,KAGpCwtF,GAAmBlzF,KAAKuvF,QAAS,CACnC,MAAMsF,EAAiB,OACvB,IAAI,IAAInvF,EAAI,EAAGgH,EAAMmoF,EAAeziE,aAAa51B,OAAQkJ,EAAIgH,IAAOhH,EAClE,IAAImvF,EAAeziE,aAAa1sB,GAAG/I,KAAO+3F,EAAgB,CACxDxB,EAAkB2B,EAAeziE,aAAa1sB,UAEvC1F,KAAKuvF,QACZiF,GAAW,EACX,K,EAKN,IAAItB,EAAiB,CAGnB,IAAI4B,EAAcC,EAFlBr3F,QAAQC,MAAM,yBAA0B+2F,GAGxC,IACEI,EAAO90F,KAAKqzF,SAASzC,GACrBmE,EAAO/0F,KAAKqzF,SAASzC,E,CACrB,MAAMvnF,G,CAIR,MAAM,IAAI0B,MAAM,0BAA4B2pF,EAAiB,IAAMI,EAAO,IAAMC,EAAO,IAAMnE,E,ECluBtF,IAAwB9jF,EDsuBnC,MAAMmiF,EAAYiE,EAAgBjE,UAE5B7sF,EAAc,CAAC,EAAK6sF,GACpB+F,GAAeh1F,KAAKuvF,QAAU,MAAQ,IAAMN,EAClD,GAAGjvF,KAAKg0B,SAASghE,GACfh1F,KAAKg0B,SAASghE,GAAa5yF,EAAQwuF,EAAQ,IAAM3B,EAAY,UAE7D,IAAI,IAAIvpF,EAAI,EAAGgH,EAAMwmF,EAAgBl/E,OAAOxX,OAAQkJ,EAAIgH,IAAOhH,EAAG,CAChE,MAAMgtF,EAAQQ,EAAgBl/E,OAAOtO,GACrC,IAAI5H,EAAO40F,EAAM50F,KAEL,MAATA,QAAkCmB,IAAlBmD,EAAOnF,SACxBmF,EAAOnF,OAAS,CAAC,GAGnB,MAAMg4F,GAAgC,IAAvBn3F,EAAKrD,QAAQ,KAC5B,GAAGw6F,EAAQ,CACT,MAAMtC,EAAW70F,EAAK8B,MAAM,KACtBgzF,EAAWD,EAAS,GAAG/yF,MAAM,KAEnC,KAAKwC,EAAOwwF,EAAS,IAAO,IAAMA,EAAS,IACzC,SAGF90F,EAAO60F,EAAS,E,CAGlB,MAAMvuF,EAAQpE,KAAK+zF,YAAYj2F,EAAM8yF,EAAQ,IAAM3B,EAAY,KAAOyD,EAAMzyF,KAAO,KAEhFg1F,GAAmB,SAATn3F,EACXsE,EAAOnF,OAAOy1F,EAAMzyF,MAAQmE,EAE5BhC,EAAOswF,EAAMzyF,MAAQmE,C,CAS3B,OAJGowF,IACDx0F,KAAKuvF,SAAU,GAGL,cAATzxF,EACMkC,KAAKk1F,gBAAgB9yF,GAGvBA,CACT,CAEQ8yF,gBAAgBC,GACtB,IAAIA,EAAUz4F,EAAG,OAAOy4F,EACxB,OAAOA,EAAUz4F,GACf,IAAK,WACH,OAAO,KACT,IAAK,aAAc,CACjB,MAAM8sB,EAAW,CAAC,EACZ4rE,EAAeD,EAAU/wF,MAC/B,IAAI,IAAIsB,EAAI,EAAGlJ,EAAS44F,EAAa54F,OAAQkJ,EAAIlJ,IAAUkJ,EAAG,CAC5D,MAAM2vF,EAAcD,EAAa1vF,GACjC8jB,EAAI6rE,EAAYjuF,KAAOpH,KAAKk1F,gBAAgBG,EAAYjxF,M,CAE1D,OAAOolB,C,CAET,QACE,OAAO2rE,EAAU/wF,MAEvB,CAEOksF,YACL,OAAOtwF,KAAKmsB,MACd,CAEOmpE,UAAUnpE,GACfnsB,KAAKmsB,OAASA,CAChB,EAWF,uBAAmCgnE,GACnC,qBAAiC7D,G,eE/zBlB,SAASiG,GACtBzoF,EACA0oF,EAAoB,GACpBC,EACAC,GAAyB,EACzB5kE,GAAU,GAEV,MAAMpkB,EAAOI,EAAsBxC,YAAewC,EAAqBtQ,OACjEm5F,EAAcD,EAAyBF,EAAY9oF,EAAM8oF,EAAa9oF,EAAM8oF,EAClF,GAAGG,EAAc,GAAKA,EAAcH,EAAW,CAE7C,MAAMI,EAAU,IAAIzsF,WAAWwsF,GAC/B,GAAGF,EACD,IAAI,IAAI/vF,EAAI,EAAGA,EAAIiwF,IAAejwF,EAChCkwF,EAAQlwF,GAAK,OAGfkF,EAAUgrF,GAGZ,OAAG9oF,aAAiB4iF,aACV5+D,GAAU,EAAA+kE,GAAA,GAAcD,EAAS9oF,IAAS,EAAA+oF,GAAA,GAAc/oF,EAAO8oF,IAAU5sF,OACzE8D,aAAiB3D,WACjB2nB,GAAU,EAAA+kE,GAAA,GAAcD,EAAS9oF,IAAS,EAAA+oF,GAAA,GAAc/oF,EAAO8oF,GAG/D9kE,EAAU,IAAI8kE,GAAS5xF,OAAO8I,GAASA,EAAM9I,OAAO,IAAI4xF,G,CAIpE,OAAO9oF,CACT,C,iUCkDA,MACMgpF,GAQF,CACFjlF,OAAQ,CACNklF,mBAAoB,EACpBC,mBAAoB,GACpBC,aAAc,IACdC,YAAa,EACbC,kBAAmB,KAErBj3D,KAAM,CACJ62D,mBAAoB,GACpBC,mBAAoB,GACpBC,aAAc,IACdC,YAAa,EACbC,kBAAmB,OAGjBC,GAAmC,CACvCC,YAAY,EACZC,mBAAmB,GAErB,IAAIC,GACAC,GAAkB,EAEP,MAAMC,GA2EnB32F,YACU82C,EACArzB,EACDrb,EACC0jF,EACAE,EACRC,EACAtwF,EAA4B,CAAC,GANrB,KAAAm7C,iBAAAA,EACA,KAAArzB,YAAAA,EACD,KAAArb,KAAAA,EACC,KAAA0jF,QAAAA,EACA,KAAAE,UAAAA,EAzEF,KAAA4K,mBAAoC,GAEpC,KAAAC,aAEJ,CAAC,EAEG,KAAAC,gBAA6C,CAAC,EAC9C,KAAAC,YAA6B,GAC7B,KAAAC,iBAA6B,GAK7B,KAAAC,QAAkB,EAOlB,KAAAC,sBAAwB,EAExB,KAAAtX,SAAU,EAkBX,KAAA8L,UAAW,EACV,KAAA/kF,OAA2B,WAC3B,KAAAwwF,iBAAmB,EAEnB,KAAA5uF,MAAQ,MAAwB,UAEjC,KAAA6uF,eAAiB,EA2XhB,KAAAC,wBAA0B,K,MAGhC,GAAGn3F,KAAKo3F,8BAAgCp3F,KAAKkR,YAAclR,KAAKkR,UAAUzI,UAAW,OAUrF,MAAMjP,EAAWwG,KAAKo3F,6BAA8B,SAC9CtB,EAAS91F,KAAK81F,OACdI,EAAcl2F,KAAK81F,OAAOI,YAC1BmB,EAAe92E,KAAKC,IAAqB,QAAjB,EAAAxgB,KAAKq3F,oBAAY,QAAI,EAAGnB,GAChDoB,EAAkB/2E,KAAKg3E,MAAMzB,EAAOC,mBAAqBsB,EAAenB,GAAeJ,EAAOE,mBAAqBF,EAAOC,qBAC1HyB,EAAgC,IAAlBF,EACdtK,EAAYhtF,KAAKy3F,kBAAoBnpF,KAAK1J,MAC1C8yF,EAAS13F,KAAK23F,2BAA4B,UAC1Cl8F,EAA4B,CAAC66F,mBAAmB,GACtDt2F,KAAK43F,YAAY,wBAAyB,CACxCC,QAASH,EACTI,iBAAkBR,GACjB77F,GAEH,MAAM0E,EAAMH,KAAKG,IAAI61B,WAAW,2BAChCh2B,KAAKqI,OAASlI,EAAIkI,MAAM,iBAAiBmvF,mBAA6Bx3F,KAAKq3F,uBAAuB57F,EAAQqS,qBAAqB4pF,KAC/H,MAAMK,EAAgBppF,EAAA,aAAenV,EAASoI,OAAQ41F,GAkCtDh+F,EACCqL,MAjCmBrG,IAClBuG,aAAagzF,GACb,MAAMC,EAAc1pF,KAAK1J,MAAQooF,EAGjC,GAFAhtF,KAAKq3F,aAAeW,EAAc,IAClCh4F,KAAKqI,OAASlI,EAAIkI,MAAM,iBAAiB7J,YAAiB64F,YAAuB57F,EAAQqS,aACtFkqF,EAAcR,EACf,WAAMv4F,EAEN,OAAO,EAAA6K,EAAA,GAAMyW,KAAK4E,IAAI,EAAGnlB,KAAK81F,OAAOG,aAAe+B,G,IA0BvDhqF,OAtBiB,KAChBjJ,aAAagzF,GACb,MAAM7mF,EAAYlR,KAAKkR,UACpBlR,KAAKo3F,8BAAgC59F,IAAa0X,aAAS,EAATA,EAAW3D,cAIhEpN,EAAIxC,MAAM,4BAA6BqC,KAAKq3F,aAAc57F,EAAQqS,WAClEoD,EAAU3D,WAAW5K,QAAO,IAe7B8lC,SAZiB,KACbzoC,KAAKo3F,8BAAgC59F,IAIxCwG,KAAKo3F,iCAA8Bn4F,EACnCe,KAAKm3F,0BAAyB,GAMb,EAIb,KAAAc,cAAgB,KACtB,MAAMC,EAAUl4F,KAAKyN,cAErB,GAAIzN,KAAKm4F,iBAAmB7pF,KAAK1J,MAAQ5E,KAAKm4F,iBAC5Cn4F,KAAK0/E,SACL1/E,KAAKitF,aACLjtF,KAAK2sF,gBAEL,OAAO,EAGTvC,GAAA,MAAmB,MAAMvlF,MAAMukF,IAC1B8O,IACD9O,IAAappF,KAAKkI,MACflI,KAAKo4F,YAAc9pF,KAAK1J,MAAQ5E,KAAKo4F,aAM1Cp4F,KAAKq4F,cAAc,GACnB,EA6BI,KAAAC,gBAAmBn2F,IAIzB,GAHAnC,KAAKqI,OAASrI,KAAKG,IAAI,mBAAoBgC,GAC3CnC,KAAKu4F,+BAEDv4F,KAAKkR,UAEP,YADAlR,KAAKG,IAAI2C,KAAK,oCAIhB,MAAM01F,EAAa,IAAIlJ,GAAgB,CAACC,SAAS,IAC3CmI,GAAS,UAEfc,EAAWpG,YAAY,OAAQ,CAC7ByF,QAASH,IAGX,MAAMe,EAAc,CAClBr6C,OAAQp+C,KAAKujB,YAAYm1E,aACzBC,OAAQ34F,KAAK44F,eAAc,GAC3BjwF,KAAM6vF,EAAWrI,UAAS,IAGzBnwF,KAAK0/E,SACN1/E,KAAKwN,oBAAoB,gBAG3BxN,KAAK64F,qBAAqBJ,GAAa5zF,MAAK,KAC1C7E,KAAK84F,eAAc,EAAM,IACxB,KACD94F,KAAKqI,OAASrI,KAAKG,IAAI,QAAsC,IAA7BH,KAAKg3F,uBACrCh3F,KAAK+4F,uBAAyBpqF,EAAA,cAAe,IAAM3O,KAAKs4F,gBAAgB,wCAAqE,IAA7Bt4F,KAAKg3F,sBAA+B,GACpJh3F,KAAKg3F,sBAAwBz2E,KAAKC,IAAI,GAAiC,IAA7BxgB,KAAKg3F,sBAA4B,GAC3E,EApfFh3F,KAAKg5F,cAAe,EAAAC,GAAA,GAAoBj5F,KAAK4rF,SAC7C5rF,KAAK+rF,YAAa,EAAAkN,GAAA,GAAoBlN,GAEtC/rF,KAAKk5F,eAAiBz9F,EAAQmsF,WAC9B5nF,KAAKm5F,iBAAmB19F,EAAQwoF,aAChCjkF,KAAK2sF,gBAAkB3sF,KAAKk5F,cAAgBl5F,KAAKm5F,eACjDn5F,KAAK81F,OAAS91F,KAAK2sF,gBAAkBmJ,GAAO52D,KAAO42D,GAAOjlF,OAE1D,MAAMjB,EAAS5P,KAAKk5F,aAAe,KAAOl5F,KAAKm5F,eAAiB,KAAO,GACvEn5F,KAAKC,KAAO,OAASiI,EAAO0H,EAE5B5P,KAAKG,KAAM,EAAAqI,EAAA,IAAOxI,KAAKC,MAAQ2P,EAAS,GAAK,MAAQ,IAAM4mF,KAAmB,KAAAjuF,IAAsC,WAAiB,WACrIvI,KAAKG,IAAI,eAQTH,KAAKo5F,eAOP,CAEQA,gBACNp5F,KAAKq5F,MAAQ,EACbr5F,KAAKs5F,cAAgBt5F,KAAK+N,UAC1B/N,KAAK+N,UAAYnD,EAAU,IAAIzB,WAAW,GAC5C,CAWQowF,kBAAkBC,GACxB,MAAMC,EAAcz5F,KAAK22F,aAAa6C,GACtC,QAAIC,IAIDA,EAAYC,YACb,EAAA5xE,GAAA,GAAe2xE,EAAYE,OAAO,CAACC,EAAoBv1F,KACrD,MAAMw1F,EAAmB75F,KAAKu5F,kBAAkBK,GAC5CC,EAGFJ,EAAYE,MAAMt1F,GAAOw1F,EAAiBz7C,OAF1Cq7C,EAAYE,MAAM9vF,OAAOxF,EAAK,E,IAOpCo1F,EAAYr7C,OAASp+C,KAAKujB,YAAYm1E,aACtCe,EAAYd,OAAS34F,KAAK44F,cAAca,EAAYnD,mBAAqBmD,EAAYC,WAElF15F,KAAKqI,OACNrI,KAAKG,IAAI,0BAA0Bq5F,UAAsBC,EAAYr7C,UAGvEp+C,KAAK22F,aAAa8C,EAAYr7C,QAAUq7C,SACjCz5F,KAAK22F,aAAa6C,GAElBC,EACT,CAEQb,cAActC,GACpB,IAAI+C,EAAqB,EAAbr5F,KAAKq5F,MAOjB,OALI/C,IACF+C,IACAr5F,KAAKq5F,SAGAA,CACT,CAEOzB,YAAY/uF,EAAgBmL,EAAavY,GAC9C,MAAM+8F,EAAa,IAAIlJ,GAAgB,CAACC,SAAS,IAEjDiJ,EAAWpG,YAAYvpF,EAAQmL,GAE/B,MAAMlG,EAAY9N,KAAKujB,YAAYm1E,aAC7BW,EAAQr5F,KAAK44F,gBACb/2F,EAAU,CACdu8C,OAAQtwC,EACR6qF,OAAQU,EACR1wF,KAAM6vF,EAAWrI,UAAS,IAO5B,OAJG,WACDnwF,KAAKG,IAAI,UAAW0I,EAAQmL,EAAQlG,EAAWurF,GAG1Cr5F,KAAK85F,YAAYj4F,EAASpG,EACnC,CAEOs+F,eAAe1yF,EAAa5L,GACjC,MAAM+8F,EAAa,IAAIlJ,GAAgB,CAACC,SAAS,IACjDiJ,EAAW3F,YAAYxrF,EAAQ,UAE/B,MAAMyG,EAAY9N,KAAKujB,YAAYm1E,aAC7BW,EAAQr5F,KAAK44F,cAAcn9F,EAAQ66F,mBACnCz0F,EAAU,CACdu8C,OAAQtwC,EACR6qF,OAAQU,EACR1wF,KAAM6vF,EAAWrI,UAAS,IAO5B,OAJG,WACDnwF,KAAKG,IAAI,aAAckH,EAAQyG,EAAWurF,GAGrCr5F,KAAK85F,YAAYj4F,EAASpG,EACnC,CAEO0xF,YAAYtkF,EAAgBmL,EAAc,CAAC,EAAGvY,EAA4B,CAAC,GAChF,MAAM+8F,EAAa,IAAIlJ,GAAgB7zF,GAEvC,IAAIuE,KAAKg6F,iBAAkB,CAGzB,MAAMC,EAAkB,qBAAyBzH,GAAmB,oBAAbA,EAAE3pF,SACzD,IAAIoxF,EAAiB,MAAM,IAAIlvF,MAAM,uBACrCytF,EAAW3H,UAAUoJ,EAAgBt9F,GAAI,mBAGzC67F,EAAW3H,SAAS,SAAc,SAElC,MAAMqJ,EAAiB,qBAAyB1H,GAAmB,mBAAbA,EAAE3pF,SACxD,IAAIqxF,EAAgB,MAAM,IAAInvF,MAAM,sBAEpCytF,EAAW3H,UAAUqJ,EAAev9F,GAAI,kBACxC67F,EAAW3H,SAAS,EAAK,SACzB2H,EAAW3H,SAAS,OAAQ,UAC5B2H,EAAW1G,YAAYjsF,IAAiB1L,YAAc,oBAAqB,gBAC3Eq+F,EAAW1G,YAAY13F,UAAUQ,UAAY,mBAAoB,kBACjE49F,EAAW1G,YAAY,aAAe,iBAAmB,IAAM,WAAa,IAAK,eACjF0G,EAAW1G,YAAY13F,UAAU89B,UAAY,KAAM,oBACnDsgE,EAAW1G,YAAY,aAAc,aACrC0G,EAAW1G,YAAY9xF,KAAK42C,iBAAiB1e,SAAU,Y,CAczD,GAAGz8B,EAAQmzD,eAAgB,CACzB,QAAiC3vD,IAA9Bs3F,GAAyC,CAC1C,MAAM/D,EAAI,qBAAyBA,GAAmB,mBAAbA,EAAE3pF,SAC3C0tF,GAA4B/D,GAAKA,EAAE71F,GAAK,C,CAGvC45F,IAKDiC,EAAW3H,SAAS0F,GAA2B,kBAC/CiC,EAAWtH,UAAUz1F,EAAQmzD,eAAgB,WAE7C5uD,KAAKG,IAAIxC,MAAM,qB,CAInBlC,EAAQ0+F,WAAa3B,EAAWpG,YAAYvpF,EAAQmL,GAMpD,MAEMnS,EAAU,CACdu8C,OAHgBp+C,KAAKujB,YAAYm1E,aAIjCC,OAHY34F,KAAK44F,gBAIjBjwF,KAAM6vF,EAAWrI,UAAS,GAC1BiK,OAAO,GAST,OANG,UACDp6F,KAAKG,IAAI,WAAY0I,EAAQhH,EAASmS,EAAQvY,GACtCuE,KAAKqI,OACbrI,KAAKG,IAAI,WAAY0I,EAAQmL,EAAQvY,GAGhCuE,KAAK85F,YAAYj4F,EAASpG,EACnC,CAEO8wF,gBAAgBr7E,GACrB,MAAMo7E,EAAetsF,KAAKkR,UACvBo7E,IACDA,EAAa/iF,UAEVvJ,KAAKq6F,iBACNt1F,aAAa/E,KAAKq6F,gBAClBr6F,KAAKq6F,eAAiB,EACtBr6F,KAAK+2F,QAAU,GAGjB/2F,KAAKg6F,kBAAmB,OAGK/6F,IAA1Be,KAAKs6F,mBACNtjE,cAAch3B,KAAKs6F,kBACnBt6F,KAAKs6F,sBAAmBr7F,GAG1Be,KAAKu4F,+BAIPv4F,KAAKG,IAAI,mBAAoB+Q,EAAWo7E,GAGxCtsF,KAAKu6F,2BAULv6F,KAAKkR,UAAYA,EACbA,IAIJA,EAAUzH,UAAYzJ,KAInBkR,aAAqBjJ,IAEtBjI,KAAKs6F,iBAAmB3rF,EAAA,cAAgB3O,KAAKi4F,cAAe,KAC5Dj4F,KAAKi4F,gBACLj4F,KAAKs4F,gBAAgB,sBAQnBpnF,EAA4B3D,YAG3B2D,EAAUzI,WACXzI,KAAKwN,oBAAoB,eAQ7BxN,KAAK0N,SACP,CAEOnE,UACLvJ,KAAKG,IAAI,UACX,CAEOq6F,wBACDx6F,KAAKkR,UAA4BtC,UAClC5O,KAAKkR,UAA4BtC,YAElC5O,KAAK0N,QAET,CAEOoB,iBACD9O,KAAKkR,UAA4BpC,eAClC9O,KAAKkR,UAA4BpC,iBAElC9O,KAAKs4F,gBAAgB,kBAEzB,CA4CQiC,2BACN,MAAM/gG,EAAWwG,KAAKo3F,4BACtBp3F,KAAKo3F,iCAA8Bn4F,EACnCe,KAAK23F,+BAA4B14F,EAE9BzF,GACDA,EAASoI,QAEb,CAgGQy2F,eACHr4F,KAAKy6F,kBACRz6F,KAAKy6F,iBAAkB,EAGvBz6F,KAAKm4F,gBAAkB7pF,KAAK1J,MAFZ,KAGhB5E,KAAKqI,OAASrI,KAAKG,IAAIkI,MAAM,eAAgBrI,KAAKm4F,iBAElDn4F,KAAK43F,YAAY,YAAa,CAC5B8C,UAAW,IACXC,WAAY,IACZC,SARc,MASb,CACDC,YAAY,EAEZC,UAAU,IACTj2F,MAAK,KACN7E,KAAKm4F,qBAAkBl5F,EACvB8C,WAAW/B,KAAKi4F,cAAe,EAAE,IAC/Bt6F,IACFqC,KAAKG,IAAI,mBAAoBxC,EAAM,IAClC8qC,SAAQ,KACTzoC,KAAKy6F,qBAAkBx7F,CAAS,IAEpC,CAqCQs5F,mCAC6Bt5F,IAAhCe,KAAK+4F,yBACNh0F,aAAa/E,KAAK+4F,wBAClB/4F,KAAK+4F,4BAAyB95F,EAElC,CAEQ65F,cAAcpZ,GACpB,GAAG1/E,KAAK0/E,UAAYA,EAIlB,GAHA1/E,KAAK0/E,QAAUA,EAEf1/E,KAAKu4F,8BACF7Y,EAAS,CACV36E,aAAa/E,KAAKq6F,gBAClBr6F,KAAKq6F,eAAiB,EACtBr6F,KAAK+2F,QAAU,EAEZ/2F,KAAKg3F,sBAAwB,MAC9Bh3F,KAAKg3F,sBAAwB,GAG/B,MAAM+D,EAAqC,IAA7B/6F,KAAKg3F,sBAA+B,EAClDh3F,KAAKg7F,uBAAyB1sF,KAAK1J,MAAQm2F,EAC3C/6F,KAAKwN,oBAAoB,WAAyBxN,KAAKg7F,wBACvDh7F,KAAK+4F,uBAAyBpqF,EAAA,cAAe,IAAM3O,KAAKs4F,gBAAgB,sBAAsByC,GAC9F/6F,KAAKg3F,sBAAwBz2E,KAAKC,IAAI,GAAuC,KAAlC,EAAIxgB,KAAKg3F,uB,MAOpDh3F,KAAKwN,oBAAoB,eACzBxN,KAAKi4F,gBAELj4F,KAAKi7F,kBASTj7F,KAAKwN,oBAAoBkyE,EAAU,WAA0B,cAA4BA,EAAU1/E,KAAKg7F,4BAAyB/7F,EACnI,CAEQi8F,+BAA+BxxF,EAA2D7H,EAAoBs5F,GAKpHzxF,EAAQ7E,MAAMzC,IACZpC,KAAK84F,eAAc,GAEZ94F,KAAK4N,cAAcxL,GAAQyC,MAAMiE,IACtC9I,KAAKqI,OAASrI,KAAKG,IAAIkI,MAAM,kBAAmBS,GAEhD9I,KAAK6N,eAAe/E,EAASA,SAAUA,EAASgF,UAAWhF,EAASiF,WAEpE/N,KAAKi4F,gBACLj4F,KAAKg3F,sBAAwBz2E,KAAK4E,IAAI,IAAK5E,KAAK66E,KAAKp7F,KAAKg3F,yBAEnD,QAEPr5F,IACFqC,KAAKG,IAAIxC,MAAM,2BAA4BA,EAAOkE,GAElD7B,KAAKq7F,WAAWx5F,EAAQu8C,QACxBp+C,KAAK84F,eAAc,IAEZ,KACNj0F,MAAMy2F,IAEP,MAAM3E,EAAe32F,KAAK22F,aAC1BwE,EAAet8F,SAAS+7D,IACtB,MAAM6+B,EAAc9C,EAAa/7B,GACjC,GAAG6+B,EAAa,CACd,MAAMjgG,EAAWigG,EAAYjgG,gBACtBm9F,EAAa/7B,UACb56D,KAAK42F,gBAAgBh8B,GAC5B0gC,EAAgB9hG,EAASyI,UAAYzI,EAASoI,Q,IAEhD,GAEN,CAIQk4F,YAAYj4F,EAKjBpG,GACD,IAAIiO,EAuBJ,OAtBIjO,EAAQ66F,oBAAqB76F,EAAQo/F,aACvCnxF,GAAU,UAGZ1J,KAAK22F,aAAa90F,EAAQu8C,QAAUnkD,OAAOC,OACzC2H,EACApG,EACAiO,EAAU,CAAClQ,SAAUkQ,QAAWzK,GAKlCe,KAAK42F,gBAAgB/0F,EAAQu8C,QAAU,EAEnC3iD,EAAQ46F,YACVr2F,KAAKi7F,mBAGJ,EAAA73E,GAAA,GAAS3nB,KACVA,EAAQqS,UAAYjM,EAAQu8C,QAGvB10C,CACT,CAEOkkF,cAAclkF,EAAuB7H,GAC1C,MACMmD,EAAUjD,YAAW,KACtB/B,KAAKi3F,kBAAqB3oF,KAAK1J,MAAQ5E,KAAKi3F,iBAAoBj3F,KAAK81F,OAAOK,oBAI/En2F,KAAKG,IAAIxC,MAAM,UAAWkE,GACvB7B,KAAKwrF,UACNxrF,KAAKwN,oBAAoB,c,GAM1BxN,KAAK81F,OAAOK,mBAEfzsF,EAAQsE,MAAMshD,GAAA,GAAM7mB,SAAQ,KAC1B1jC,aAAaC,GACbhF,KAAKwN,oBAAoB,iBAGrBxN,KAAKk3F,eACPl3F,KAAK6sF,iB,MAKL7sF,KAAKk3F,oBACoBj4F,IAAxBe,KAAKu7F,iBACNx2F,aAAa/E,KAAKu7F,gBAClBv7F,KAAKu7F,oBAAiBt8F,EAG5B,CAEO4tF,mBACD7sF,KAAKk3F,gBAAkBl3F,KAAKysF,cAAmCxtF,IAAxBe,KAAKu7F,iBAC9Cv7F,KAAKu7F,eAAiB5sF,EAAA,cAAe,KACnC3O,KAAKu7F,oBAAiBt8F,EACtBe,KAAKG,IAAI,SACTH,KAAKysF,SAAS,GA7wBA,KAgxBpB,CAEOj/E,oBAAoB/G,EAA0B2H,G,MACnD,MAAMo9E,EAAW/kF,IAAW,cACtB+0F,EAAax7F,KAAKyG,SAAWA,EACnCzG,KAAKwrF,SAAWA,EAChBxrF,KAAKyG,OAASA,EAEX+0F,IACEx7F,KAAK42C,iBAAiB6kD,0BACvBz7F,KAAK42C,iBAAiB6kD,yBAAyB,CAC7C/+F,EAAG,kBACH+J,SACAyB,KAAMlI,KAAKkI,KACXjI,KAAMD,KAAKC,KACX0sF,gBAAiB3sF,KAAK2sF,gBACtBwM,eAAgBn5F,KAAKm5F,eACrBD,aAAcl5F,KAAKk5F,aACnB9qF,YAIDpO,KAAKwrF,UACNxrF,KAAKi7F,mBAG6B,QAAhC,EAAAj7F,KAAKkR,iBAA2B,eAAE3D,cACpCvN,KAAKu6F,2BACLv6F,KAAKm3F,2BAQX,CAEQkE,WAAWvtF,EAAmBitF,EAAQ,KAC5C,MAAM32F,EAAQ22F,EAAQzsF,KAAK1J,MAAQm2F,EAAQ,EACrCtB,EAAcz5F,KAAK22F,aAAa7oF,GACtC,GAAG2rF,EAAYC,UACb,IAAI,MAAMgC,KAAcjC,EAAYE,MAClC35F,KAAK42F,gBAAgB8E,GAAct3F,OAGrCpE,KAAK42F,gBAAgB9oF,GAAa1J,EAGjCq1F,EAAYkC,OACb37F,KAAKG,IAAIxC,MAAM,6BAA8B87F,GAG5Cz5F,KAAKqI,OACNrI,KAAKG,IAAIkI,MAAM,cAAeyF,EAAW2rF,EAAaz5F,KAAK42F,gBAAiBmE,GAG9E/6F,KAAKi7F,gBAAgBF,EACvB,CAGca,UAAUC,EAA6B3xE,G,0CACnD,MAAM4xE,EAAI5xE,EAAQ,EAAI,EAChB6xE,GAAmB,EAAAlG,GAAA,GAAc71F,KAAKg5F,aAAa/I,SAAS,GAAK6L,EAAG,GAAKA,EAAI,IAAKD,GAElFG,QAAoB,iBAA0B,SAAUD,GAE9D,OADe,IAAI5yF,WAAW6yF,GAAa/L,SAAS,EAAG,GAEzD,G,CAGQgM,YAAYC,EAAoBhyE,GACtC,MAAM4xE,EAAI5xE,EAAQ,EAAI,EAChBiyE,EAAY,IAAIhzF,WAAW,IAC3BizF,EAAY,IAAIjzF,WAAW,IAC3BsiB,EAAuC,GAU7C,OARA0wE,EAAUn0F,IAAIk0F,EAAQ,GACtBC,EAAUn0F,IAAIhI,KAAKg5F,aAAa/I,SAAS6L,EAAGA,EAAI,IAAK,IACrDrwE,EAASnrB,KAAK,iBAA0B,SAAU67F,IAElDC,EAAUp0F,IAAIhI,KAAKg5F,aAAa/I,SAAS,GAAK6L,EAAG,GAAKA,EAAI,IAAK,GAC/DM,EAAUp0F,IAAIk0F,EAAQ,IACtBzwE,EAASnrB,KAAK,iBAA0B,SAAU87F,IAE3Cz6F,QAAQyQ,IAAIqZ,GAAU5mB,MAAMK,IACjC,MAAMm3F,EAAS,IAAIlzF,WAAW,IACxBmzF,EAAQ,IAAInzF,WAAW,IACvBozF,EAAQ,IAAIpzF,WAAWjE,EAAQ,IAC/Bs3F,EAAQ,IAAIrzF,WAAWjE,EAAQ,IAUrC,OARAm3F,EAAOr0F,IAAIu0F,EAAMtM,SAAS,EAAG,IAC7BoM,EAAOr0F,IAAIw0F,EAAMvM,SAAS,EAAG,IAAK,GAClCoM,EAAOr0F,IAAIu0F,EAAMtM,SAAS,GAAI,IAAK,IAEnCqM,EAAMt0F,IAAIw0F,EAAMvM,SAAS,EAAG,IAC5BqM,EAAMt0F,IAAIu0F,EAAMtM,SAAS,EAAG,IAAK,GACjCqM,EAAMt0F,IAAIw0F,EAAMvM,SAAS,GAAI,IAAK,IAE3B,CAACoM,EAAQC,EAAM,GAE1B,CAEOrP,YACL,OAAOjtF,KAAK42C,iBAAiB6lD,YAAcz8F,KAAK2sF,eAClD,CAEQ+P,0BACN,GAAG18F,KAAKitF,YACN,OAAO,EAGT,GAAGjtF,KAAK62F,YAAYr6F,OAAQ,CAC1B,MAAMmgG,EAAY38F,KAAK62F,YAAYrvF,QAGnCxH,KAAK+5F,eAAe,CAClBr9F,EAAG,WACHkgG,QAASD,GACR,CACDrG,mBAAmB,EACnBD,YAAY,G,CAIhB,MAAMwG,EAAyB78F,KAAK82F,iBAAiBt6F,OACrD,GAAGqgG,EAAwB,CACzB,MAAMphG,EAAO,iBAAyB26F,IAChCt1B,EAAS9gE,KAAK82F,iBAAiBjtF,OAAO,EAAGgzF,GAC/C78F,KAAK+5F,eAAe,CAClBr9F,EAAG,iBACHkgG,QAAS97B,GACRrlE,GAEHuE,KAAKG,IAAI,6BAA8B1E,EAAQqS,UAAWgzD,E,CA0B5D,IAAIg8B,EACJ,MAAM30E,EAAgC,GAGtC,IAAI40E,EAAkB,EAGlBC,GAAa,EACbC,GAAc,EAGdC,GAAiB,EAGrB,MAAMlqF,EAAsB/Y,OAAO+Y,KAAKhT,KAAK42F,iBC/gCpC1yF,KAAKo4C,GACP,KAAOA,KACb77B,MAAK,CAACC,EAAGC,IACHD,EAAEy8E,QAAQx8E,KAChBzc,KAAKotF,GACCA,EAAOvkF,SAAS,MD2gCvB,IAAI,MAAMe,KAAakF,EAAM,CAI3B,MAAMnR,EAAU7B,KAAK22F,aAAa7oF,GAClC,GAAGjM,GAAWA,EAAQ8G,KAAM,CAK1B,MAAMy0F,EAAoBv7F,EAAQ8G,KAAKnM,OAAS,GAEhD,GAAIugG,EAAkBK,EAAqB,SACzCp9F,KAAKG,IAAI2C,KAAK,iBAAkBjB,EAASsmB,GACzC+0E,GAAiB,EAEdJ,GACD,MAIJ30E,EAAS7nB,KAAKuB,GACdk7F,GAAmBK,EAGhBv7F,EAAQu4F,MACT4C,GAAa,EACLn7F,EAAQi5F,WAChBmC,GAAc,GAIhBH,EAAaj7F,C,QAKR7B,KAAK42F,gBAAgB9oF,E,CAM9B,GAAG9N,KAAKkR,qBAAqBjJ,GAExB+0F,IAAeC,EAAa,CAC7B,MAAMzE,EAAa,IAAIlJ,GAAgB,CAACC,SAAS,IACjDiJ,EAAWpG,YAAY,YAAa,CAClCsI,UAAW,IACXC,WAAY,IACZC,SAAU,MAGZzyE,EAAS7nB,KAAK,CACZ89C,OAAQp+C,KAAKujB,YAAYm1E,aACzBC,OAAQ34F,KAAK44F,gBACbjwF,KAAM6vF,EAAWrI,UAAS,I,CAKhC,IAAIhoE,EAAS3rB,OAEX,OAIF,MAAM2+F,EAAgChzE,EAAStrB,QAAQgF,GAAYA,EAAQg5F,aAAY32F,KAAKrC,GAAYA,EAAQu8C,SAGhH,GAAGj2B,EAAS3rB,OAAS,EAAG,CACtB,MAAMk9F,EAAY15F,KAAKq9F,yBAAyBN,EAAiB50E,GACjE20E,EAAapD,EAAU4D,gBAEvBt9F,KAAK22F,aAAamG,EAAW1+C,QAAUs7C,EAAU73F,O,MAEjD7B,KAAK22F,aAAamG,EAAW1+C,QAAU0+C,EAGzC98F,KAAK62F,YAAc,GAEnB,MAAMntF,EAAU1J,KAAK64F,qBAAqBiE,GAIvC98F,KAAKkR,qBAAqBjJ,GAE3BjI,KAAKk7F,+BAA+BxxF,EAASozF,EAAY3B,GAKtDn7F,KAAKkR,qBAAqBjJ,GAE7BjI,KAAKyN,cAGJyvF,GACDl9F,KAAKi7F,iBAET,CAEQoC,yBAAyBN,EAAyB50E,GACxD,MAAMuxE,EAAY,IAAIpK,GAAgB,CACpCC,SAAS,EACTC,eAAgBuN,EAAkB,KAGpCrD,EAAU7I,SAAS,WAAY,iBAC/B6I,EAAU7I,SAAS1oE,EAAS3rB,OAAQ,oBAEpC,MAAM+gG,EAA0B,GAChCp1E,EAAStpB,SAAQ,CAACgD,EAAS6D,KACzB63F,EAAcj9F,KAAKuB,EAAQu8C,QAE3Bs7C,EAAUxI,UAAUrvF,EAAQu8C,OAAQ,aAAe14C,EAAI,aACvDg0F,EAAU7I,SAAShvF,EAAQ82F,OAAQ,aAAejzF,EAAI,aACtDg0F,EAAU7I,SAAShvF,EAAQ8G,KAAKnM,OAAQ,aAAekJ,EAAI,YAC3Dg0F,EAAUvH,cAActwF,EAAQ8G,KAAM,aAAejD,EAAI,UAAU,IAGrE,MAAM7D,EAAqB,CACzBu8C,OAAQp+C,KAAKujB,YAAYm1E,aACzBC,OAAQ34F,KAAK44F,eAAc,GAC3Bc,WAAW,EACXC,MAAO4D,GAOT,OAJG,WACDv9F,KAAKG,IAAI2C,KAAK,YAAay6F,EAAe17F,EAAQu8C,OAAQv8C,EAAQ82F,QAG7D,CACL92F,UACAy7F,gBAAiBrjG,OAAOC,OAAO,CAACyO,KAAM+wF,EAAUvJ,UAAS,IAAQtuF,GAErE,CAEc27F,oBAAoB3B,G,0CAChC,MAAMK,QAAel8F,KAAK47F,UAAUC,GAAiB,GAC/C4B,QAAcz9F,KAAKi8F,YAAYC,GAAQ,GAM7C,MAAO,CACLpvF,YAJ2B,iBAA0B,cAAe+uF,EAAiB4B,EAAM,GAAIA,EAAM,IAKrGvB,SAEJ,G,CAEQwB,oBAAoBxB,EAAoByB,GAE9C,OAAO39F,KAAKi8F,YAAYC,GAAQ,GAAOr3F,MAAM44F,GAEpC,iBAA0B,cAAeE,EAAeF,EAAM,GAAIA,EAAM,KAEnF,CAEQG,mBAAmB/7F,GASzB,MAAMwI,EAAO,IAAIilF,GAAgB,CAC/BE,eAAgB3tF,EAAQ8G,KAAKnM,OAAS,OAGxC6N,EAAK+mF,cAAcpxF,KAAK+rF,WAAY,GAAI,QACxC1hF,EAAK+mF,cAAcpxF,KAAK+N,UAAW,GAAI,cAEvC1D,EAAK6mF,UAAUrvF,EAAQu8C,OAAQ,cAC/B/zC,EAAKwmF,SAAShvF,EAAQ82F,OAAQ,UAE9BtuF,EAAKwmF,SAAShvF,EAAQ8G,KAAKnM,OAAQ,uBACnC6N,EAAK8nF,cAActwF,EAAQ8G,KAAM,gBAmBjC,MAAMk1F,EAAaxzF,EAAK6lF,YAMlB4N,EAAiB,GAAMzzF,EAAKimF,YAAc,GAAO,IAAM,GAAI,QAAe,GAAK,GAC/EsF,EAA4ChrF,EAAU,IAAIzB,WAAW20F,IASrEjC,GAAkB,EAAAhG,GAAA,GAAcgI,EAAYjI,GAalD,OAAO51F,KAAKw9F,oBAAoB3B,GAAiBh3F,MAAMk5F,IAKrD,MAAMv8F,EAAU,IAAI8tF,GAAgB,CAClCE,eAAgBuO,EAAgBjxF,MAAMtQ,OAAS,MAejD,OAbAgF,EAAQ4vF,cAAcpxF,KAAK8rF,UAAW,GAAI,eAC1CtqF,EAAQ4vF,cAAc2M,EAAgB7B,OAAQ,IAAK,WACnD16F,EAAQ2wF,cAAc4L,EAAgBjxF,MAAO,kBAEzBtL,EAAQ2uF,UAAS,EASnB,GAEtB,CAEc0I,qBAAqBh3F,G,0CACjC,MAAMm8F,QAAoBh+F,KAAK49F,mBAAmB/7F,GAE9C7B,KAAKkR,WACPlR,KAAKG,IAAIxC,MAAM,wCAAyCqC,KAAKkR,UAAWlR,MAG1EA,KAAKqI,OAASrI,KAAKG,IAAIkI,MAAM,WAAYxG,EAAS,CAACA,EAAQu8C,QAAQp6C,OAAOnC,EAAQ83F,OAAS,IAAKqE,EAAYxhG,QAC5G,MAAMkN,EAA+B1J,KAAKkR,UAAYlR,KAAKkR,UAAU1H,KAAKw0F,GAAsBr8F,QAAQC,OAAO,CAAC,GAQhH,KAAK5B,KAAKkR,qBAAqBjJ,GAAO,OAAOyB,EAG7C,MAAMu0F,EAAsB,CAC1B5oF,KAAM,IACNvX,KAAM,uBAENoT,UAAWlR,KAAKkR,WAGlB,OAAOxH,EAAQ7E,MAAMzC,IACnB,KAAIA,aAAM,EAANA,EAAQkI,YACV,MAAM2zF,EAIR,OAAO77F,CAAM,IACXzE,IAQF,MAPIA,EAAMkE,SAAYlE,EAAMG,OAC1BH,EAAQ1D,OAAOC,OAAO+jG,EAAW,CAC/BngG,KAAM,sBACN+vF,cAAelwF,KAIbA,CAAK,GAGf,G,CAEOiQ,cAAcswF,GAMnBl+F,KAAKi3F,iBAAmB3oF,KAAK1J,MAE7B,MAAMu5F,EAAe,IAAIhL,GAAkB+K,GAErCpS,EAAYqS,EAAa9J,cAAc,IAAI,EAAM,eACvD,KAAI,EAAA+J,GAAA,GAAStS,EAAW9rF,KAAK8rF,WAC3B,MAAM,IAAI/gF,MAAM,oCAAsC8B,EAAWi/E,IAGnE,MAAMoQ,EAASiC,EAAa9J,cAAc,KAAK,EAAM,WAC/CsJ,EAAgBQ,EAAa7J,cAAc4J,EAAe5zF,WAAa6zF,EAAa7N,aAAa,EAAM,kBAE7G,OAAOtwF,KAAK09F,oBAAoBxB,EAAQyB,GAAe94F,MAAMg3F,GAEpD77F,KAAK47F,UAAUC,GAAiB,GAAOh3F,MAAMw5F,IAClD,KAAI,EAAAD,GAAA,GAASlC,EAAQmC,GAGnB,MAFAr+F,KAAKG,IAAI2C,KAAK,gBAAiBo5F,EAAQmC,GACvCr+F,KAAKo5F,gBACC,IAAIruF,MAAM,iDAIlB,IAAIozF,EAAe,IAAIhL,GAA0B0I,EAAiB,CAACtM,SAAS,IAEzD4O,EAAa9J,cAAc,IAAI,EAAM,QACxD,MAAMtmF,EAAYowF,EAAa9J,cAAc,IAAI,EAAM,cACjDvmF,EAAYqwF,EAAa3K,UAAU,cAEzC,MAAI,EAAA4K,GAAA,GAASrwF,EAAW/N,KAAK+N,YACzB/N,KAAKs5F,gBAAkB,EAAA8E,GAAA,GAASrwF,EAAW/N,KAAKs5F,gBAIlD,MAHAt5F,KAAKG,IAAI2C,KAAK,WAAYiL,EAAW/N,KAAK+N,UAAW/N,KAAKs5F,cAAeuC,GAGnE,IAAI9wF,MAAM,mCAAqC8B,EAAWkB,IAGlE,MAAMsrF,EAAQ8E,EAAa9K,SAAS,UAE9BiL,EAAczC,EAAgBvxF,WAE9Bi0F,EAAoBJ,EAAa9K,SAAS,wBAChD,IAAIlnE,EAASgyE,EAAa7N,YAE1B,GAAIiO,EAAoB,GACtBA,EAAoBD,EAAcnyE,EAClC,MAAM,IAAIphB,MAAM,6BAA+BwzF,GAEjD,MAAMC,EAAcL,EAAa7J,cAAciK,GAAmB,EAAM,gBAExEpyE,EAASgyE,EAAa7N,YACtB,MAAMwN,EAAgBQ,EAAcnyE,EACpC,GAAG2xE,EAAgB,IAAMA,EAAgB,KACvC,MAAM,IAAI/yF,MAAM,gCAAkC+yF,GAsDpD,OAlDAK,EAAe,IAAIhL,GAAsCqL,EAAa,CACpEjP,SAAS,EACTv7D,SAAU,CACRyqE,WAAY,CAACr8F,EAAawuF,KACxBxuF,EAAOg8C,OAAS+/C,EAAa3K,UAAU5C,EAAQ,YAC/CxuF,EAAOs8F,MAAQP,EAAa9K,SAASzC,EAAQ,WAC7CxuF,EAAO0K,MAAQqxF,EAAa9K,SAASzC,EAAQ,WAE7C,MAAMzkE,EAASgyE,EAAa7N,YAI5B,IACEluF,EAAOuG,KAAOw1F,EAAapK,YAAY,SAAUnD,EAAQ,S,CACzD,MAAMruF,GACNvC,KAAKG,IAAIxC,MAAM,cAAgB4E,EAAYV,QAAUU,EAAY6pF,OACjEhqF,EAAOuG,KAAO,CACZjM,EAAG,cACHiB,MAAO4E,E,CAIR47F,EAAa7N,cAAgBnkE,EAAS/pB,EAAO0K,OAG9CqxF,EAAa7I,UAAUnpE,EAAS/pB,EAAO0K,M,EAI3C6xF,cAAe,CAACv8F,EAAawuF,KAC3BxuF,EAAOw8F,WAAaT,EAAa3K,UAAU5C,EAAQ,gBAEnD,MAAM6I,EAAcz5F,KAAK22F,aAAav0F,EAAOw8F,YACvC9gG,EAAO27F,GAAeA,EAAYU,YAAc,SAEnD/3F,EAAOw8F,aAAenF,IAMzBr3F,EAAOA,OAAS+7F,EAAapK,YAAYj2F,EAAM8yF,EAAQ,YAAW,KASjE,CACL9nF,SAHeq1F,EAAapK,YAAY,GAAI,SAI5CjmF,YACAC,YACAsrF,QACD,KAGP,CAEQwF,gBAAgBC,GACtB,MAAM/S,GEr7C0BoF,EFq7CD2N,EEn7CnBvJ,INCcjE,EMFM,KAAOH,GNGlC,IAAIhoF,WAAWmoF,EAAOyN,QAAQ,KAAK36F,QMHO0H,UACX,GAAG,GAAM,GAAO,IAFzC,IAAqBqlF,ENGNG,EIo7C1BlH,GAAA,MAAmB,CACjB,CAAC,KAAOpqF,KAAKkI,KAAO,gBAAiB2E,EAAWk/E,KAGlD/rF,KAAK+rF,WAAa,IAAI5iF,WAAW4iF,EACnC,CAGOkP,gBAAgBF,GAOlB/6F,KAAKkR,qBAAqBjJ,IAExBjI,KAAK0/E,SACN1/E,KAAKs4F,gBAAgB,mBAGvByC,IAAAA,EAAU,IAMZ,MAAMhE,EAAUzoF,KAAK1J,OAASm2F,GAAS,GACvC,GAAG/6F,KAAK+2F,eAAsB93F,IAAV87F,GAAuB/6F,KAAK+2F,SAAWA,GAEzD,OAUC/2F,KAAKq6F,gBACNt1F,aAAa/E,KAAKq6F,gBAGpB,MAAMzjE,EAAK,KAGT52B,KAAKq6F,eAAiB,EACtBr6F,KAAK+2F,QAAU,EAIZ/2F,KAAKkR,qBAAqBjJ,GAExBjI,KAAK0/E,SAMV1/E,KAAK08F,yBAAyB,EAGhC18F,KAAK+2F,QAAUA,OAEF93F,IAAV87F,EACD/6F,KAAKq6F,eAAiB1rF,EAAA,aAAeioB,EAAImkE,GAEzCnkE,GAEJ,CAEQooE,WAAWpkC,GAIjB,IAAImgC,EAFJ/6F,KAAK62F,YAAYv2F,KAAKs6D,GAMnB56D,KAAKkR,qBAAqBjJ,IAE3B8yF,EAAQ,KAGV/6F,KAAKi7F,gBAAgBF,EACvB,CAEQkE,UAAUrkC,GACb56D,KAAKqI,OACNrI,KAAKG,IAAIkI,MAAM,aAAcuyD,GAI/B56D,KAAK82F,iBAAiBx2F,KAAKs6D,GAC3B56D,KAAKi7F,gBAAgB,IACvB,CAEOxtF,cACL,IAAIyxF,GAAW,EACf,MAAMvI,EAAe32F,KAAK22F,aAwB1B,OAtBA18F,OAAO+Y,KAAK2jF,GAAc93F,SAAS+7D,IACjC,MAAM/4D,EAAU80F,EAAa/7B,GAG7B,GAAG/4D,EAAQy0F,wBAAqDr3F,IAAhCe,KAAK42F,gBAAgBh8B,UAE5C+7B,EAAa/7B,QACf,GAAG/4D,EAAQ63F,UAAW,CAC3B,IAAI,MAAMgC,KAAc75F,EAAQ83F,MAC9B,QAAgC16F,IAA7B03F,EAAa+E,GAGd,YADAwD,GAAW,UAKRvI,EAAa/7B,E,MAEpBskC,GAAW,C,KAIPA,CACV,CAEQC,kBAAkBrxF,GACxB,MAAM2rF,EAAcz5F,KAAK22F,aAAa7oF,GACnC2rF,IAAgBA,EAAYkC,QAE7BlC,EAAYkC,OAAQ,EAExB,CAEQvsB,aAAaqe,GACnB,MAAM//C,GAAW+/C,EAAS2R,eAAiB,IAAItkG,MAAM,6BAA+B,GAGpF,OAFA2yF,EAAS4R,WAAa5R,EAAS4R,WAExB,CACLhqF,MAAOo4E,EAAS4R,YAAc5R,EAAS4R,YAAc,EAAI,IAAM5R,EAAS4R,WACxEvhG,KAAM4vC,EAAQ,IAAa,UAC3BkS,YAAalS,EAAQ,IAAO,QAAU+/C,EAAS4R,WAAa,IAAM5R,EAAS2R,cAC3EvR,cAAeJ,EAEnB,CAMO//E,SACL,MAAMipF,EAAe32F,KAAK22F,aAC1B,IAAI,MAAMh6F,KAAMg6F,EAAc,CAC5B,MAAM2I,EAAM3I,EAAah6F,IACtB2iG,EAAI32F,MAAQ22F,EAAI5F,YACjB15F,KAAKq7F,WAAW1+F,E,CAIhBqD,KAAKkR,UAA4B3D,aACnCvN,KAAKu6F,2BACLv6F,KAAKm3F,0BAET,CAqBQoI,gBAAgBzxF,GACtB,MAAM0xF,EAAa,KAAO1xF,GAAW2xF,WAAW,IAAI9N,aAEpD,OADA3xF,KAAKG,IAAI,uBAAwBq/F,GAC1Bx/F,KAAKujB,YAAYg8E,gBAAgBC,EAC1C,CAGO3xF,eAAehM,EAAciM,EAAmBC,GACrD,GAAiB,iBAAdlM,EAAQnF,EAQX,GADiBsxC,SAASlgC,EAAUnO,OAAO,GAAI,IAAK,IACtC,EACZK,KAAKG,IAAI2C,KAAK,2BAA4BgL,EAAWjM,QAkBvD,OAdG7B,KAAKqI,OACNrI,KAAKG,IAAIkI,MAAM,kBAAmBxG,EAASiM,GAG1C9N,KAAKo3F,6BACNp3F,KAAKo3F,4BAA4Bn1F,QAAQ,eASpCJ,EAAQnF,GACb,IAAK,gBACH,IAAI,MAAMgjG,KAAgB79F,EAAQsmB,SAChCnoB,KAAK6N,eAAe6xF,EAAcA,EAAathD,OAAQrwC,GAGzD,MAGF,IAAK,kBACH/N,KAAKG,IAAI,kBAAmB0B,GAE5B7B,KAAK6+F,gBAAgBh9F,EAAQ89F,iBAE1B3/F,KAAK22F,aAAa90F,EAAQ+9F,aAC3B5/F,KAAKq7F,WAAWx5F,EAAQ+9F,YAG1B5/F,KAAKg/F,WAAWlxF,GAWhB,MAGF,IAAK,uBAGH,OAFA9N,KAAKG,IAAIxC,MAAM,uBAAwBkE,GAEhCA,EAAQw9F,YACb,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GAAI,CAKP,MAAMQ,EAAoB7/F,KAAKu/F,gBAAgBzxF,IACrB,KAAvBjM,EAAQw9F,YAAqBQ,KAC9B7/F,KAAKG,IAAI,kBACTH,KAAKo5F,iBAGP,MAAM0G,EAAa9/F,KAAKu5F,kBAAkB13F,EAAQ+9F,YAC/CE,GAAY9/F,KAAKq7F,WAAWyE,EAAW1hD,O,EAkB9C,MAGF,IAAK,UACH,IAAmD,IAAhDp+C,KAAK02F,mBAAmBj8F,QAAQqT,GAGjC,YADA9N,KAAKg/F,WAAWlxF,GAIlB9N,KAAK02F,mBAAmBp2F,KAAKwN,GAC1B9N,KAAK02F,mBAAmBl6F,OAAS,KAClCwD,KAAK02F,mBAAmBzoF,QAG1BjO,KAAK6N,eAAehM,EAAQ8G,KAAM9G,EAAQu8C,OAAQrwC,GAClD,MAGF,IAAK,sBACH/N,KAAKg/F,WAAWlxF,GAEb9N,KAAKqI,OACNrI,KAAKG,IAAIkI,MAAM,sBAAuBxG,GAIxC7B,KAAKm/F,kBAAkBt9F,EAAQk+F,cAC/B//F,KAAK6+F,gBAAgBh9F,EAAQm+F,aAE7B5V,GAAA,MAAmB,MAAMvlF,MAAMukF,IAC1BA,IAAappF,KAAKkI,OAASlI,KAAK2sF,iBAAmB3sF,KAAK42C,iBAAiBk2C,kBAC1E9sF,KAAK42C,iBAAiBk2C,iBAAiBjrF,E,IAG3C,MAGF,IAAK,WACH7B,KAAKqI,OAASrI,KAAKG,IAAI,WAAY0B,EAAQ+6F,SAC3C,IAAI,MAAMhiC,KAAS/4D,EAAQ+6F,QACzB58F,KAAKm/F,kBAAkBvkC,GAGzB,MAGF,IAAK,oBAEH,IADoB56D,KAAK22F,aAAa90F,EAAQu8C,QAC7B,CACfp+C,KAAKg/F,WAAWn9F,EAAQo+F,eACxB,K,CAQJ,IAAK,wBACH,IAAwD,IAArDjgG,KAAK62F,YAAYp8F,QAAQoH,EAAQo+F,eAClC,MAGFjgG,KAAKi/F,UAAUp9F,EAAQo+F,eACvB,MAGF,IAAK,kBAAmB,CACtBjgG,KAAKg/F,WAAWn9F,EAAQo+F,eACxB,MAAMp1F,EAAM,CACV,CAAC7K,KAAKkgG,cAAelgG,KAAK82F,mBAI5B,IAAI,MAAOqJ,EAAYC,KAAkBv1F,EACvC,IAAGs1F,aAAU,EAAVA,EAAYE,YAAax+F,EAAQ+8F,YAAcwB,EAAc5jG,OAC9D,IAAI,MAAM8jG,KAAYH,EAAWr/B,OAAQ,CACvC,MAAMy/B,EAAMH,EAAc3lG,QAAQ6lG,IACtB,IAATC,GACDH,EAAcv2F,OAAO02F,EAAK,E,CAMlC,K,CAGF,IAAK,aAAc,CACjBvgG,KAAKg/F,WAAWlxF,GAEhB,MAAM0rF,EAAgB33F,EAAQ+8F,WACxBnF,EAAcz5F,KAAK22F,aAAa6C,GAOtC,GALGx5F,KAAKqI,OACNrI,KAAKG,IAAI,eAAgB0B,EAAQO,OAAQq3F,GAG3Cz5F,KAAKm/F,kBAAkB3F,GACpBC,EAAa,CACd,MAAMjgG,EAAWigG,EAAYjgG,SAC7B,GAAwB,cAArBqI,EAAQO,OAAO1F,EAAmB,CACnC,MAAMiB,EAAQqC,KAAKovE,aAAavtE,EAAQO,QACxCpC,KAAKG,IAAI,YAAaxC,GACnBnE,GACDA,EAASoI,OAAOjE,E,MAGfnE,GACDA,EAASyI,QAAQJ,EAAQO,QAGxBq3F,EAAYW,QAAUp6F,KAAKg6F,mBAC5Bh6F,KAAKg6F,kBAAmB,UAIrBh6F,KAAK22F,aAAa6C,E,MAEtBx5F,KAAKqI,OACNrI,KAAKG,IAAI,kCAAmCq5F,EAAe33F,GAI/D,K,CAGF,IAAK,OAAQ,CAQX,MAAM61F,EAAS71F,EAAQg2F,QACvB,GAAG73F,KAAK23F,4BAA8BD,EAAQ,CAC5C,MAAMl+F,EAAWwG,KAAKo3F,4BACnB59F,EACDA,EAASyI,QAAQ,QAEjBjC,KAAKG,IAAI,wBAAyBu3F,E,CAItC,K,CAGF,QACE13F,KAAKg/F,WAAWlxF,GAM8B,OAA3C9N,KAAK42C,iBAAiBk2C,kBACvB9sF,KAAK42C,iBAAiBk2C,iBAAiBjrF,QA7P3C7B,KAAKG,IAAI2C,KAAK,+BAAgCjB,EAASiM,EAiQ3D,EG52DK,MAAM0yF,WAAyB/tF,EAAtC,c,oBACU,KAAA44E,WAA6B,GAC9B,KAAAnzD,SAAW99B,UAAU89B,UAAY,iBACjC,KAAA40D,iBAAuC,KAEvC,KAAA2P,WAAY,CAoErB,CAlEShB,yBAAyBh1F,GAC9BzG,KAAK+c,UAAUrW,cAAc,2BAA4BD,EAE3D,CAEOimF,gBAAgBjjF,IACrB,EAAA2H,EAAA,GAAiBpR,KAAKqrF,WAAY5hF,EACpC,CAEO4tB,oBAAoB5yB,GACzBzE,KAAK8sF,iBAAmBroF,CAC1B,CAEOimF,aAAaxiF,EAAc0jF,EAAqBE,EAAuBC,EAAwBtwF,GAEpG,MAAMgO,EAAY,IAAIgtF,GAAaz2F,KAAMA,KAAKujB,YAAarb,EAAM0jF,EAASE,EAAWC,EAAYtwF,GAEjG,OADAuE,KAAKqrF,WAAW/qF,KAAKmJ,GACdA,CACT,CAEOg3F,WACL,GAAGzgG,KAAKy8F,UAAW,CACjB,MAAMiE,EAAoB1gG,KAAKqrF,WAAWxuF,QAAQ4M,GAAcA,EAAUwjF,cAE1EjtF,KAAKy8F,WAAY,EACjBz8F,KAAK8sF,kBAAoB9sF,KAAK8sF,iBAAiB,CAACpwF,EAAG,wBAEnD,IAAI,MAAM+M,KAAai3F,EACrBj3F,EAAUwxF,iB,CAGhB,CAEO0F,UACL3gG,KAAKy8F,WAAY,CACnB,CAEOmE,YAAY1pE,GACjBl3B,KAAKk4B,SAAWhB,EAChB,IAAI,MAAMztB,KAAazJ,KAAKqrF,WACtB5hF,EAAUkjF,kBACZljF,EAAUuwF,kBAAmB,EAGnC,CAEOxM,wBACL,IAAI,MAAM/jF,KAAazJ,KAAKqrF,WAC1B5hF,EAAUuwF,kBAAmB,CAEjC,CAEOQ,wBACL,IAAI,MAAM/wF,KAAazJ,KAAKqrF,WAC1B5hF,EAAU+wF,uBAEd,CAEO1rF,iBACL,IAAI,MAAMrF,KAAazJ,KAAKqrF,WAC1B,IAAI5hF,EAAUkjF,gBAAiB,CAC7BljF,EAAUqF,iBACV,K,CAGN,ECoDF,aAvHO,MA8DLhP,cAjBQ,KAAA+gG,kBAAuC,CAAC,CAC9CC,QAAS,mgBACTC,SAAU,WAGJ,KAAAC,cAAmC,CAAC,CAE1CF,QAAS,mgBACTC,SAAU,WAGJ,KAAAE,iBAEJ,CAAC,EACG,KAAAzb,UAAW,EACX,KAAA0b,eAAgC,KAGnC,WACDlhG,KAAKghG,cAAgBhhG,KAAK6gG,kBAE9B,CAEOM,UACL,OAAGnhG,KAAKkhG,eAAuBlhG,KAAKkhG,eAC5BlhG,KAAKwlF,SACJ7jF,QAAQM,UAGVjC,KAAKkhG,eAAiBv/F,QAAQyQ,IAAIpS,KAAKghG,cAAc98F,KAAKk9F,IAC/D,MAAMC,EAAe,IAAI/R,GACzB+R,EAAapP,YAAW,EAAApG,GAAA,GAAauV,EAAUN,SAAU,KACzDO,EAAapP,YAAW,EAAApG,GAAA,GAAauV,EAAUL,UAAW,KAE1D,MAAM/3F,EAASq4F,EAAanR,YAE5B,OAAO,iBAA0B,OAAQlnF,GAAQnE,MAAMiI,IACrD,MAAMw0F,EAAmBx0F,EAAMtF,OAAO,GACtC85F,EAAiBx1F,UAEjB9L,KAAKihG,iBAAiBp0F,EAAWy0F,GAAkB9mG,eAAiB,CAClEsmG,QAASM,EAAUN,QACnBC,SAAUK,EAAUL,SACrB,GACD,KACAl8F,MAAK,KACP7E,KAAKwlF,UAAW,EAGhBxlF,KAAKkhG,eAAiB,IAAI,GAE9B,CAEah5D,OAAOq5D,G,2CACZvhG,KAAKmhG,UAEX,IAAI,IAAIz7F,EAAI,EAAGA,EAAI67F,EAAa/kG,SAAUkJ,EAAG,CAC3C,IAAI87F,EAAiB,KAAOD,EAAa77F,IAAIqH,SAAS,IAAIvS,cAEvDgnG,EAAehlG,OAAS,KACzBglG,EAAiB,IAAI1gG,MAAM,GAAK0gG,EAAehlG,QAAQilG,KAAK,KAAK1kG,KAAK,IAAMykG,GAI9E,MAAME,EAAW1hG,KAAKihG,iBAAiBO,GACvC,GAAGE,EACD,OAAOznG,OAAOC,OAAO,CACnBynG,YAAaJ,EAAa77F,IACzBg8F,E,CAGT,E,iSC3Ia,SAASE,GAASC,EAAoBC,GACnD,MAAMp1F,EAAMm1F,EAAOrlG,OACbsQ,EAAQ,IAAI3D,WAAWuD,GAE7B,IAAI,IAAIhH,EAAI,EAAGA,EAAIgH,IAAOhH,EACxBoH,EAAMpH,GAAKm8F,EAAOn8F,GAAKo8F,EAAOp8F,GAGhC,OAAOoH,CACT,C,2SCkGO,MAAMi1F,WAAmBtvF,EAapBqK,QACR9c,KAAK4rB,OAAS,CAAC,EACf5rB,KAAKG,KAAM,EAAAqI,EAAA,IAAO,aAAc,WAAiB,KAAAD,IACnD,CAEQy5F,iBAAiB95F,EAAY+5F,GACnC,MAAMC,EAAgBD,EAAa33F,WAE7BqC,EAAS,IAAI2iF,GACnB3iF,EAAOokF,WAAW,EAAG,EAAG,eACxBpkF,EAAOukF,UAAUlxF,KAAKujB,YAAYm1E,aAAc,UAChD/rF,EAAOkkF,SAASqR,EAAe,kBAE/B,MAAMC,EAAcx1F,EAAOwjF,UAAS,GAC9BE,EAAc,IAAIlnF,WAAWg5F,EAAY73F,WAAa43F,GAC5D7R,EAAYroF,IAAIm6F,GAChB9R,EAAYroF,IAAIi6F,EAAcE,EAAY3lG,QAE1C,MAAM0U,EAAYlR,KAAK0R,eAAejB,aAAavI,EAAM,SAAUlI,KAAK0Q,eAClEutF,EAAY,CAChB5oF,KAAM,IACNvX,KAAM,wBAQR,OALG,MACDkC,KAAKG,IAAI,gDAGK+Q,EAAU1H,KAAK6mF,GAChBxrF,MAAMzC,IAKnB,GAJG,MACDpC,KAAKG,IAAI,sCAAuCiC,IAG9CA,IAAWA,EAAOkI,WACpB,MAAM2zF,EAGR,IAIE,MAAME,EAAe,IAAIhL,GAA0B/wF,EAAQ,CAACmtF,SAAS,IAErE,GAAqB,IAAlBntF,EAAO5F,OAAc,CACtB,MAAM4lG,EAAYjE,EAAa9K,WAE/B,MADArzF,KAAKG,IAAIxC,MAAM,mDAAoDykG,GAC7DA,C,CAGR,MAAMC,EAAclE,EAAa3K,UAAU,eACxB,MAAhB6O,GAAqBriG,KAAKG,IAAIxC,MAAM,oBAAqB0kG,GAE5D,MAAMjkD,EAAS+/C,EAAa3K,UAAU,UACxB,MAAXp1C,GAAgBp+C,KAAKG,IAAIxC,MAAM,eAAgBygD,GAElD,MAAMkkD,EAAUnE,EAAa9K,SAAS,WAGtC,OAFIiP,GAAStiG,KAAKG,IAAIxC,MAAM,aAAc2kG,GAEnCnE,C,CACP,MAAM57F,GAGN,MAFAvC,KAAKG,IAAIxC,MAAM,gDAAiD4E,GAClDtI,OAAOC,OAAO+jG,EAAW,CAACpQ,cAAetrF,G,KAGvD5E,IAOF,MANIA,EAAMkE,SAAYlE,EAAMG,OAC1BH,EAAQ1D,OAAOC,OAAO+jG,EAAW,CAC/BpQ,cAAelwF,KAIbA,CAAK,GAEf,CAEc4kG,UAAUttF,G,0CACtB,MAAMzT,EAAU,IAAI8tF,GAAgB,CAACC,SAAS,IAQ9C,IAAI4O,EANJ38F,EAAQ4wF,YAAY,eAAgB,CAACoQ,MAAOvtF,EAAKutF,QAE9C,MACDxiG,KAAKG,IAAI,cAAe0M,EAAWoI,EAAKutF,QAI1C,IACE,MAAM94F,EAAU1J,KAAKgiG,iBAAiB/sF,EAAK/M,KAAM1G,EAAQ2uF,UAAS,IAClEsS,GAAetB,UACfhD,QAAqBz0F,C,CACrB,MAAM/L,GAEN,MADAqC,KAAKG,IAAIxC,MAAM,eAAiBA,EAAgBkE,SAC1ClE,C,CAGR,MAAMmL,EAAkBq1F,EAAapK,YAAY,SAEjD,GAAkB,UAAfjrF,EAASpM,EACV,MAAM,IAAIqO,MAAM,gCAAkCjC,EAASpM,GAG7D,KAAI,EAAA0hG,GAAA,GAASnpF,EAAKutF,MAAO15F,EAAS05F,OAEhC,MADAxiG,KAAKG,IAAIxC,MAAMsX,EAAKutF,MAAO15F,EAAS05F,OAC9B,IAAIz3F,MAAM,6BAGlBkK,EAAKytF,YAAc55F,EAAS65F,aAC5B1tF,EAAK2tF,GAAK95F,EAAS85F,GACnB3tF,EAAKssF,aAAez4F,EAAS+5F,+BAE1B,MACD7iG,KAAKG,IAAI,YAAa0M,EAAWoI,EAAKytF,aAAc71F,EAAWoI,EAAK2tF,IAAK3tF,EAAKssF,cAGhF,MAAMuB,QAAkBL,GAAev6D,OAAOjzB,EAAKssF,cACnD,IAAIuB,EACF,MAAM,IAAI/3F,MAAM,4BAGlBkK,EAAK6tF,UAAYA,EAEd,MACD9iG,KAAKG,IAAI,yBAA0B8U,EAAK2tF,IAI1C,IACE,IAAIG,QAAc,iBAA0B,YAAa9tF,EAAK2tF,G,CAC9D,MAAMjlG,GAEN,MADAqC,KAAKG,IAAIxC,MAAM,yBAA0BA,GACnCA,C,CAUR,OAPAsX,EAAK4kB,EAAIkpE,EAAM,GACf9tF,EAAKi4B,EAAI61D,EAAM,GAEZ,MACD/iG,KAAKG,IAAI,wBAAyB4iG,GAG7B/iG,KAAKgjG,gBAAgB/tF,EAC9B,G,CAEc+tF,gBAAgB/tF,G,0CAC5BA,EAAKguF,SAAWr4F,EAAU,IAAIzB,WAAW,KAEzC,MAAM+5F,EAAoC,CACxCxmG,EAAG,oBACHkmG,GAAI3tF,EAAK2tF,GACT/oE,EAAG5kB,EAAK4kB,EACRqT,EAAGj4B,EAAKi4B,EACRs1D,MAAOvtF,EAAKutF,MACZG,aAAc1tF,EAAKytF,YACnBS,UAAWluF,EAAKguF,SAChBrY,GAAI,GAGAwY,EAA2B,IAAI9T,GAAgB,CAACC,SAAS,IAC/D6T,EAAyBvQ,YAAYqQ,EAAmB,iBAAkB,kBAE1E,MAAM74F,EAAO+4F,EAAyBjT,UAAS,GAC/C,GAAG9lF,EAAK7N,OAAS,IACf,KAAM,0CAGR,MAAMq/F,EAAkBtG,GAAWlrF,EAAM,KAAK,GAAO,GAAM,GACrDg5F,EAAkBxH,EAAgBr0F,QAAQsE,UAuB1Cw3F,OArBqB,KAAW,mCACpC,OAAQ,CACN,MAAMC,EAAU34F,EAAU,IAAIzB,WAAW,KACnCq6F,EAAeH,EAAgBr/F,aAAa,iBAA0B,SAAUu/F,EAAQv/F,OAAO63F,KACrG,GAA2B,MAAxB2H,EAAahnG,OACd,KAAM,yCAGR,MAAMinG,QAAqB,iBAA0B,cAAeD,EAAcD,EAAS,IAAIp6F,WAAW,CAAC,KAErGm6F,EADa1B,GAAS2B,QAAe,iBAA0B,SAAUE,IAC5Cz/F,OAAOy/F,GAEpCC,EAAwB5U,GAAgBwU,GACxCK,EAAyB,KAAO1uF,EAAK6tF,UAAUhC,QAAS,IAE9D,IAA8D,IAA3D4C,EAAsBvG,QAAQwG,GAC/B,OAAOL,C,CAGb,IAE8BM,GACxBjG,EAAgBpI,SAAiB,iBAA0B,cAAe+N,EAAiBruF,EAAK6tF,WAAY,KAAK,GAAM,GAAM,GAE7He,EAA+B,CACnCrB,MAAOvtF,EAAKutF,MACZG,aAAc1tF,EAAKytF,YACnB7oE,EAAG5kB,EAAK4kB,EACRqT,EAAGj4B,EAAKi4B,EACR42D,uBAAwB7uF,EAAK6tF,UAAUnB,YACvCoC,eAAgBpG,GAGZn8F,EAAU,IAAI8tF,GAAgB,CAACC,SAAS,IAC9C/tF,EAAQ4wF,YAAY,gBAAiByR,GAErC,MAAMG,EAAexiG,EAAQ2uF,UAAS,GAMtC,IAAIgO,EAJD,MACDn+F,KAAKG,IAAI,qBAAsB0jG,GAIjC,IACE1F,QAAqBn+F,KAAKgiG,iBAAiB/sF,EAAK/M,KAAM87F,E,CACtD,MAAMrmG,GAEN,MADAqC,KAAKG,IAAIxC,MAAM,2BAA4BA,GACrCA,C,CAGR,MAAMmL,EAAWq1F,EAAapK,YAAY,mBAAoB,YAM9D,GAJG,MACD/zF,KAAKG,IAAI,gCAAiC2I,GAG1B,0BAAfA,EAASpM,GAAgD,wBAAfoM,EAASpM,EACpD,MAAM,IAAIqO,MAAM,2CAA6CjC,EAASpM,GAGxE,KAAI,EAAA0hG,GAAA,GAASnpF,EAAKutF,MAAO15F,EAAS05F,OAChC,MAAM,IAAIz3F,MAAM,wCAGlB,KAAI,EAAAqzF,GAAA,GAASnpF,EAAKytF,YAAa55F,EAAS65F,cACtC,MAAM,IAAI53F,MAAM,+CAGlB,GAAkB,0BAAfjC,EAASpM,EAA+B,CACzC,MAAMunG,SAAsB,iBAA0B,OAAQhvF,EAAKguF,WAAWz7F,OAAO,IACrF,KAAI,EAAA42F,GAAA,GAAS6F,EAAcn7F,EAASo7F,gBAClC,MAAM,IAAIn5F,MAAM,sDAGlB,MAAM,IAAIA,MAAM,6B,CAIlB,UACQ/K,KAAKmkG,0BAA0BlvF,EAAMnM,EAASs7F,iB,CACpD,MAAM7hG,GAEN,MADAvC,KAAKG,IAAIxC,MAAM,uCAAwC4E,GACjDA,C,CAKR,OAAOvC,KAAKqkG,sBAAsBpvF,EACpC,G,CAEckvF,0BAA0BlvF,EAAmBqvF,G,0CACzDrvF,EAAKsvF,UAAYj2F,KAAK1J,MAGtBqQ,EAAKuvF,iBAAmB,iBAA0B,OAAQvvF,EAAKguF,SAASj/F,OAAOiR,EAAKytF,eACnF1+F,cAAc,iBAA0B,OAAQiR,EAAKytF,YAAY1+F,OAAOiR,EAAKguF,YAAYz7F,MAAM,EAAG,KAEnGyN,EAAKwvF,gBAAkB,iBAA0B,OAAQxvF,EAAKytF,YAAY1+F,OAAOiR,EAAKguF,YAAYz7F,MAAM,IACvGxD,aAAa,iBAA0B,OAAQiR,EAAKguF,SAASj/F,OAAOiR,EAAKguF,WAAYhuF,EAAKguF,SAASz7F,MAAM,EAAG,IAE7G,MAAMk9F,EAAiB,IAAIv7F,iBAAiB,iBAA0B,cAAem7F,EAAiBrvF,EAAKuvF,UAAWvvF,EAAKwvF,WAErHxjE,EAAOyjE,EAAel9F,MAAM,EAAG,IAC/Bm9F,EAAoBD,EAAel9F,MAAM,IAEzC22F,EAAe,IAAIhL,GAA0BwR,EAAmB,CAACpV,SAAS,IAC1EzmF,EAAWq1F,EAAapK,YAAY,wBAE1C,GAAkB,yBAAfjrF,EAASpM,EACV,MAAM,IAAIqO,MAAM,+CAAiDjC,GAGnE,KAAI,EAAAs1F,GAAA,GAASnpF,EAAKutF,MAAO15F,EAAS05F,OAChC,MAAM,IAAIz3F,MAAM,4CAGlB,KAAI,EAAAqzF,GAAA,GAASnpF,EAAKytF,YAAa55F,EAAS65F,cACtC,MAAM,IAAI53F,MAAM,kDAGf,MACD/K,KAAKG,IAAI,0BAEX8U,EAAK2vF,EAAI97F,EAAS87F,EAClB3vF,EAAK4vF,QAAU/7F,EAASg8F,SACxB7vF,EAAK8vF,GAAKj8F,EAASk8F,IACnB/vF,EAAKuqF,WAAa12F,EAASm8F,YAC3BhwF,EAAKiwF,MAAQ,EAEbllG,KAAKmlG,eAAelwF,EAAK2vF,EAAG3vF,EAAK4vF,QAAS5vF,EAAK8vF,IAE/C,MAAM54E,EAASgyE,EAAa7N,YAE5B,KAAI,EAAA8N,GAAA,GAASn9D,QAAY,iBAA0B,OAAQ0jE,EAAkBn9F,MAAM,EAAG2kB,KACpF,MAAM,IAAIphB,MAAM,2CAGlB/K,KAAKujB,YAAYg8E,gBAAgBtqF,EAAKuqF,WAAYvqF,EAAKsvF,UACzD,G,CAEQY,eAAeP,EAAWC,EAAqBE,GAClD,MACD/kG,KAAKG,IAAI,sBAAuBykG,EAAGC,EAASE,GAG9C,MAAMK,EAAav4F,EAAWg4F,GAC9B,GAAS,IAAND,GAA0B,qgBAAfQ,EAEZ,MAAM,IAAIr6F,MAAM,oDAGf,MACD/K,KAAKG,IAAI,kBAGX,MAAMklG,EAAWvW,GAAgBiW,GAC3BO,EAAgB,KAAOF,EAAY,IAEzC,GAAGC,EAASlI,QAAQ,WAAe,EACjC,MAAM,IAAIpyF,MAAM,4CAGlB,GAAGs6F,EAASlI,QAAQmI,EAAcC,SAAS,YAAgB,EACzD,MAAM,IAAIx6F,MAAM,sDAGf,MACD/K,KAAKG,IAAI,yBAGX,MAAMqlG,EAAS,KAAO,GAAG7W,IAAI,MAE7B,GAAG0W,EAASlI,QAAQqI,GAAU,EAC5B,MAAM,IAAIz6F,MAAM,qDAElB,GAAGs6F,EAASlI,QAAQmI,EAAcC,SAASC,KAAY,EACrD,MAAM,IAAIz6F,MAAM,+DAOlB,OAJG,MACD/K,KAAKG,IAAI,8CAGJ,CACT,CAEckkG,sBAAsBpvF,G,0CAClC,MAAMwwF,GAAS,EAAA5Z,GAAA,GAAa52E,EAAK2vF,EAAE73F,SAAS,KAE5CkI,EAAK0L,EAAI/V,EAAU,IAAIzB,WAAW,MAIlC,IACE,IAAIu8F,QAAW,iBAA0B,UAAWD,EAAQxwF,EAAK0L,EAAG1L,EAAK4vF,Q,CACzE,MAAMlnG,GACN,MAAMA,C,CAGR,MAAM0M,EAAO,IAAIilF,GAAgB,CAACC,SAAS,IAC3CllF,EAAKwoF,YAAY,CACfn2F,EAAG,uBACH8lG,MAAOvtF,EAAKutF,MACZG,aAAc1tF,EAAKytF,YACnBiD,SAAU,CAAC,EAAG1wF,EAAKiwF,SACnBtrE,IAAK8rE,GACJ,wBAEH,MAAMlC,SAAsB,iBAA0B,OAAQn5F,EAAK6lF,cAAclsF,OAAOqG,EAAK8lF,UAAS,IAChGwN,QAAsB,iBAA0B,cAAe6F,EAAcvuF,EAAKuvF,UAAWvvF,EAAKwvF,UAElGjjG,EAAU,IAAI8tF,GAAgB,CAACC,SAAS,IAW9C,IAAI4O,EAVJ38F,EAAQ4wF,YAAY,uBAAwB,CAC1CoQ,MAAOvtF,EAAKutF,MACZG,aAAc1tF,EAAKytF,YACnBqB,eAAgBpG,IAGf,MACD39F,KAAKG,IAAI,6BAIX,IACEg+F,QAAqBn+F,KAAKgiG,iBAAiB/sF,EAAK/M,KAAM1G,EAAQ2uF,UAAS,G,CACvE,MAAM9mF,GACN,MAAMA,C,CAGR,MAAMP,EAAWq1F,EAAapK,YAAY,+BAE1C,GAAkB,cAAfjrF,EAASpM,GAAoC,iBAAfoM,EAASpM,GAAuC,gBAAfoM,EAASpM,EACzE,MAAM,IAAIqO,MAAM,sDAAwDjC,EAASpM,GAGnF,KAAI,EAAA0hG,GAAA,GAASnpF,EAAKutF,MAAO15F,EAAS05F,OAChC,MAAM,IAAIz3F,MAAM,mDAGlB,KAAI,EAAAqzF,GAAA,GAASnpF,EAAKytF,YAAa55F,EAAS65F,cACtC,MAAM,IAAI53F,MAAM,0DAIlB,IACE,IAAI6gF,QAAgB,iBAA0B,UAAW32E,EAAK8vF,GAAI9vF,EAAK0L,EAAG1L,EAAK4vF,Q,CAC/E,MAAMx7F,GACN,MAAMuiF,C,CAGR,MAAMga,QAAoB,iBAA0B,OAAQha,GAC1Dia,EAAaD,EAAYp+F,MAAM,EAAG,GAClCskF,EAAY8Z,EAAYp+F,OAAO,GAKjC,OAHG,MACDxH,KAAKG,IAAI,kCAAmC2I,EAASpM,EAAGkvF,GAEnD9iF,EAASpM,GACd,IAAK,YAAa,CAChB,MAAMopG,SAAuB,iBAA0B,OAAQ7wF,EAAKguF,SAASj/F,OAAO,CAAC,GAAI6hG,KAAcr+F,OAAO,IAE9G,KAAI,EAAA42F,GAAA,GAAS0H,EAAeh9F,EAASi9F,iBAEnC,MADA/lG,KAAKG,IAAIxC,MAAM,uDAAwDmoG,EAAeh9F,GAChF,IAAIiC,MAAM,4BAGlB,MAAMghF,EAAa6V,GAAS3sF,EAAKguF,SAASz7F,MAAM,EAAG,GAAIyN,EAAKytF,YAAYl7F,MAAM,EAAG,IASjF,OARG,MACDxH,KAAKG,IAAI,oBAAqB2rF,EAAWF,EAASG,GAGpD92E,EAAK62E,UAAYA,EACjB72E,EAAK22E,QAAUA,EACf32E,EAAK82E,WAAaA,EAEX92E,C,CAGT,IAAK,eAAgB,CACnB,MAAM+wF,SAAuB,iBAA0B,OAAQ/wF,EAAKguF,SAASj/F,OAAO,CAAC,GAAI6hG,KAAcr+F,OAAO,IAC9G,KAAI,EAAA42F,GAAA,GAAS4H,EAAel9F,EAASm9F,iBACnC,MAAM,IAAIl7F,MAAM,6DAGlB,OAAO/K,KAAKqkG,sBAAsBpvF,E,CAGpC,IAAK,cAAe,CAClB,MAAMixF,SAAuB,iBAA0B,OAAQjxF,EAAKguF,SAASj/F,OAAO,CAAC,GAAI6hG,KAAcr+F,OAAO,IAC9G,KAAI,EAAA42F,GAAA,GAAS8H,EAAep9F,EAASq9F,iBACnC,MAAM,IAAIp7F,MAAM,6DAGlB,MAAM,IAAIA,MAAM,wC,EAGtB,G,CAGQ0+E,mBACN,OAAGzpF,KAAKomG,wBAAgCpmG,KAAKomG,wBACtCpmG,KAAKomG,wBAA0B,mBAAqCvhG,MAAK,EAAE+M,gBAChF5R,KAAK0Q,cAAgBkB,EAAY,YAAc,QAC/C5R,KAAKG,IAAI,sBAAuBH,KAAK0Q,cAAc,GAEvD,CAGOuE,KAAK/M,GACV,IAAIwB,EAAU1J,KAAK4rB,OAAO1jB,GAC1B,OAAGwB,IAIHA,EAAU,IAAI/H,SAAQ,CAAMM,EAASL,IAAW,mCAK9C,IAAIjE,QAHEqC,KAAKypF,mBAIX,IAAI4c,EAAO,EACX,KAAMA,KAAU,GACd,IACE,MAAMpxF,EAAoB,CACxB/M,OACAs6F,MAAO53F,EAAU,IAAIzB,WAAW,MAG5BO,EAAU1J,KAAKuiG,UAAUttF,GAE/B,YADAhT,QAAcyH,E,CAEd,MAAML,GACN1L,EAAQ0L,C,CAIZzH,EAAOjE,EACT,MAEOqC,KAAK4rB,OAAO1jB,GAAQwB,EAC7B,ECvlBK,MAAM48F,WAAoB7zF,EAcrBqK,QACR9c,KAAKumG,cAAgB,CAAC,EAAG,GACzBvmG,KAAKwmG,WAAa,EAElBpc,GAAA,MAAmB,sBAAsBvlF,MAAMitB,IAC1CA,IACD9xB,KAAKwmG,WAAa10E,E,GAiBxB,CAEOtO,sBACL,OAAOxjB,KAAKwmG,UACd,CAEO9N,aACL,MAAM+N,EAAYn4F,KAAK1J,MAKvB,IAAIkJ,EAA0C,CAJlCyS,KAAKqxC,MAAM60C,EAAY,KAAQzmG,KAAKwmG,WACnCC,EAAY,KAG4C,IAF1D,QAAe,KAE4D,EAAK,GAiB3F,OAhBGzmG,KAAKumG,cAAc,GAAKz4F,EAAU,IACnC9N,KAAKumG,cAAc,KAAOz4F,EAAU,IAAM9N,KAAKumG,cAAc,IAAMz4F,EAAU,MAC7EA,EAAY,CAAC9N,KAAKumG,cAAc,GAAIvmG,KAAKumG,cAAc,GAAK,IAG9DvmG,KAAKumG,cAAgBz4F,EAETugF,GAAcvgF,EAAU,GAAIA,EAAU,IAAIf,SAAS,GAUjE,CAEOwyF,gBAAgBC,EAAoB+E,GAEzC,MAAMmC,EAAgBlH,GADtB+E,GAAaA,GAAaj2F,KAAK1J,OAAS,IAAO,GAEzC+hG,EAAUpmF,KAAKszE,IAAI7zF,KAAKwmG,WAAaE,GAAiB,GAa5D,OAZA1mG,KAAKumG,cAAgB,CAAC,EAAG,GAEtBvmG,KAAKwmG,aAAeE,IACrBtc,GAAA,MAAmB,CACjBwc,mBAAoBF,IAGtB1mG,KAAKwmG,WAAaE,GAKbC,CACT,EC3Ga,MAAME,GACZtrC,gBAAgBurC,GACrB,IAAIA,EACF,OAGF,MAAM32D,EAA0D22D,EAAY52D,WAAW3xC,MAAM4xC,GAA8B,+BAAhBA,EAAUzzC,IAMrH,OALGyzC,IACD22D,EAAYt2D,EAAIL,EAAUK,EAC1Bs2D,EAAYr2D,EAAIN,EAAUM,GAGrBq2D,CACT,ECXa,MAAMC,WAA2Bt0F,EACvCu0F,sBAAsB1zD,GAC3B,MAAO,CACL52C,EAAG,mBACH42C,OAEJ,CAEO2zD,wBAAwBjoG,EAAgBunB,GAC7C,MAAO,CACL7pB,EAAG,sBACH+d,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5Co/C,QAAQ,EAAAn/B,GAAA,GAAmBsH,GAE/B,CAEO2gF,eAAeC,GACpB,OAAOnnG,KAAK2T,WAAWC,UAAU,0BAA2B,CAC1DuzF,YACCtiG,MAAMuiG,IACPpnG,KAAKgd,gBAAgBgL,aAAao/E,EAAY1uF,OAEvC0uF,IAEX,CAEOC,kBAAkBroG,EAAgBunB,GACvC,OAAOvmB,KAAK2T,WAAWC,UAAU,6BAA8B,CAC7D6G,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5Co/C,QAAQ,EAAAn/B,GAAA,GAAmBsH,KAC1B1hB,MAAMuiG,IACPpnG,KAAKgd,gBAAgBgL,aAAao/E,EAAY1uF,OAEvC0uF,IAEX,CAEOE,sBAAsBH,EAAuBld,EAA4B9lF,GAC9E,OAAOnE,KAAK2T,WAAWC,UAAU,iCAAkC,CACjEzP,OACAgjG,UACAld,QAEJ,CAEOsd,gBACLJ,EACAK,EACAC,EACAC,EACAC,EACAC,GAEA,OAAO5nG,KAAK2T,WAAWC,UAAU,2BAA4B,CAC3Di0F,QAASL,EACTL,UACAW,kBAAmBL,EACnBM,mBAAoBL,EACpBC,cACAK,WAAYJ,QAAa3oG,IACxB4F,MAAMzC,IACS,2BAAbA,EAAO1F,GACRsD,KAAKge,kBAAkBmV,qBAAqB/wB,EAAOymB,SAG9CzmB,IAEX,CAEO6lG,eAAehe,EAAgB0d,GACpC,OAAO3nG,KAAK2T,WAAWC,UAAU,0BAA2B,CAC1Dq2E,OACA0d,eAEJ,E,eCtEa,MAAMO,WAAiCz1F,EAAtD,c,oBAYS,KAAA7T,MAAQ,CAAC0M,GAAO,KACjBA,EAIFtL,KAAKmoG,eAAiB,IAAI52F,KAH1BvR,KAAKmoG,eAAevpG,QACpBoB,KAAKooG,uBAAoBnpG,E,EAMrB,KAAAopG,uBAA0BhuF,IAChCra,KAAKpB,QACLoB,KAAKsoG,mBAAmB,CAuH5B,CA1IYxrF,QACR9c,KAAKpB,OAAM,GAEXoB,KAAKge,kBAAkBC,2BAA2B,CAChDsqF,qBAAsBvoG,KAAKqoG,wBAE/B,CAgBOG,kBAAkBC,GACvBzoG,KAAKmoG,eAAengG,IAAIygG,EAAcC,OAAQD,GAC9C,MAAME,GAAO,EAAAC,GAAA,GAAqBH,GAElC,OADAE,EAAKA,KAAO3oG,KAAK23C,eAAe7H,QAAQ64D,EAAKA,KAAM,CAAC7qG,KAAM,oBAAqBqZ,MAAOsxF,EAAcC,SAC7FD,CACT,CAEOI,mBAAmBV,GACpBA,EAAuB5vE,QAC1B4vE,EAAuB5vE,OAAQ,EAChC4vE,EAAetpG,SAASsW,GAASnV,KAAKwoG,kBAAkBrzF,KAC1D,CAEOmzF,oB,MACL,OAA6B,QAAtB,EAAAtoG,KAAKooG,yBAAiB,QAAIpoG,KAAK2T,WAAWktB,uBAAuB,CACtEh4B,OAAQ,6BACRi4B,cAAgBqnE,KACd,EAAApgF,GAAA,GAA0CogF,GAC1CnoG,KAAKgd,gBAAgBgL,aAAamgF,EAAezvF,OACjD1Y,KAAK6oG,mBAAmBV,EAAe/3E,MAEhCpwB,KAAKooG,kBAAoBD,EAAe/3E,KAAK5oB,MAAM,EAAG,KAGnE,CAEOshG,uBAAuB3xF,GAC5B,OAAOnX,KAAKmoG,eAAe5jG,IAAI4S,EACjC,CAEOD,iBAAiBC,EAAcua,GAElC,MADE1xB,KAAKgd,gBAAgBihE,gBAAgB9mE,IACjC,EAAAI,EAAA,GAAU,cAcpB,CAEOwxF,eAAettG,GASpB,MAAM,MACJ0b,EAAK,OACLnY,EAAM,IACNvB,EAAG,YACHurG,EAAW,YACXC,EAAW,aAEX96C,EAAY,OACZt8B,EAAM,aACNi9B,EAAY,WACZpR,EAAU,SACVx7B,GACEzmB,EAIJ,OAAOuE,KAAK2T,WAAWktB,uBAAuB,CAC5Ch4B,OAAQ,0BACRmL,OAAQ,CACNyG,KAAMza,KAAK0a,gBAAgBkW,iBAAiB5xB,GAC5Cy9C,IAAKz8C,KAAKgd,gBAAgB6d,aAAa1jB,GACvC0a,SACAj3B,SARa,MASb6C,MACAi3C,gBAAiByZ,GAAe,EAAAlvC,GAAA,GAAmBkvC,QAAgBlvD,EACnEiqG,cAAeF,EACfG,aAAcF,EACdpmE,QAASisB,EAAe9uD,KAAK0a,gBAAgBkW,iBAAiBk+B,QAAgB7vD,EAC9E+gD,YAAatC,EACbvI,WAAYjzB,GAAW,EAAAjD,GAAA,GAAmBiD,QAAYjjB,GAExD6hC,cAAgB1+B,IACd1E,QAAQyC,IAAIiC,GACLA,IAGb,CAEOgnG,eAAe3tG,GAKpB,OAAOuE,KAAK2T,WAAWktB,uBAAuB,CAC5Ch4B,OAAQ,0BACRmL,OAAQ,CACNyG,KAAMza,KAAK0a,gBAAgBkW,iBAAiBn1B,EAAQuD,QACpDy9C,IAAKz8C,KAAKgd,gBAAgB6d,aAAap/B,EAAQ0b,OAC/C2lC,SAAUrhD,EAAQohD,QAClBhrB,OAAQp2B,EAAQo2B,OAChB6iB,gBAAiBj5C,EAAQ0yD,cAAe,EAAAlvC,GAAA,GAAmBxjB,EAAQ0yD,mBAAgBlvD,EACnF4jC,QAASpnC,EAAQqzD,aAAe9uD,KAAK0a,gBAAgBkW,iBAAiBn1B,EAAQqzD,mBAAgB7vD,EAC9Fk2C,WAAY15C,EAAQymB,UAAW,EAAAjD,GAAA,GAAmBxjB,EAAQymB,eAAYjjB,GAExE6hC,cAAgB1+B,IACd1E,QAAQyC,IAAIiC,EAAO,GAGzB,ECjJa,MAAMinG,WAAgC52F,EAC5C62F,eAAe7rG,EAAauB,EAAiBunB,EAAcgjF,GAChE,OAAOvpG,KAAK2T,WAAWC,UAAU,0BAA2B,CAC1D41F,UAAWD,EACXnrD,OAAQ73B,GAAM,EAAAtH,GAAA,GAAmBsH,QAAOtnB,EACxCwb,KAAMzb,EAASgB,KAAK0a,gBAAgBkW,iBAAiB5xB,QAAUC,EAC/DxB,QACCoH,MAAM4kG,IACgB,yBAApBA,EAAc/sG,GACfsD,KAAKgd,gBAAgB0yD,YAAY+5B,EAAchtD,KAG1CgtD,IAEX,CAEOC,cAAcjsG,EAAauB,EAAiBunB,EAAcgjF,EAAmBI,GAClF,OAAO3pG,KAAK2T,WAAWC,UAAU,yBAA0B,CACzD41F,UAAWD,EACXnrD,OAAQ73B,GAAM,EAAAtH,GAAA,GAAmBsH,QAAOtnB,EACxCwb,KAAMzb,EAASgB,KAAK0a,gBAAgBkW,iBAAiB5xB,QAAUC,EAC/DxB,MACAmsG,cAAeD,IACd9kG,MAAM4kG,GACAA,GAEX,CAEOI,uBACL,OAAO7pG,KAAK2T,WAAWC,UAAU,gCAAgC/O,MAAMilG,IACrE9pG,KAAKgd,gBAAgBgL,aAAa8hF,EAAkBpxF,OAC7CoxF,EAAkBC,iBAE7B,CAEOC,sBAAsB/oE,GAC3B,OAAOjhC,KAAK2T,WAAWC,UAAU,gCAAiC,CAChEqtB,QAEJ,CAEOgpE,yBACL,OAAOjqG,KAAK2T,WAAWC,UAAU,iCACnC,ECuCF,MAAMs2F,GAAqB,IA1EpB,MAMLpqG,cACEE,KAAKmqG,kBAAoB,GACzBnqG,KAAKoqG,oBAAsB,EAC3BpqG,KAAKqqG,mBAAoB,SACzBrqG,KAAKqqG,kBAAkBxlG,MAAK,KAC1B7E,KAAKqqG,uBAAoBprG,CAAS,GAEtC,CAEO+hD,QACL,MAAM9wC,EAAO,kBAEbA,EAAK7J,iBAAiB,WAAW,EAAEpG,OAAM4I,SAAQlC,WACxC,EAAAqmB,EAAA,GAAYhtB,KAAKsqG,eAAgB33F,IAEtC,MAAM43F,EAAU53F,EAAS1S,GACzB,OAAOsqG,EAAQ1hG,GAAQ2hG,MAAMD,EAAS5jG,EAAK,MAI/CuJ,EAAK7J,iBAAiB,cAAc,CAACkG,EAAS+uC,EAAQn5C,K,MACpD,MAAM+N,EAAO/N,EAAMsoG,MAAM,GACtBzqG,KAAKoqG,qBAAuBpqG,KAAKmqG,kBAAkB3tG,OACpD0T,EAAKvN,WAIL3C,KAAKoqG,oBACPh/F,EAAA,aAA6B8E,GACP,QAAtB,EAAAlQ,KAAKqqG,yBAAiB,SAAEpoG,UAAS,IAGnCiO,EAAK7J,iBAAiB,yBAAyB,EAAEqkG,cAAa3xE,WAC5D,IAAIv8B,EAASwD,KAAKmqG,kBAAkB3tG,OAChCA,IACFwD,KAAKmqG,kBAAkB7pG,KAAKoqG,KAC1BluG,GAGJ,MAAM8jD,EAAY,kBAClB,GAAG9jD,IAAW8jD,EACZ,OAAOtgD,KAAKmqG,kBAGd,MAAMQ,EAAU,IAAI7pG,MAAMw/C,EAAY9jD,GAAQilG,UAAKxiG,GAAWiF,KAAI,IAAM80B,IAAIC,gBAAgBF,KAE5F,OADA/4B,KAAKmqG,kBAAkB7pG,QAAQqqG,GACxB3qG,KAAKmqG,iBAAiB,GAEjC,CAEaS,iB,qCACX,MAAMpsF,EAAqB,IAAIlL,QAEzB3R,QAAQyQ,IAAI,CAEhBoM,EAAmB5L,eACnB5S,KAAKqqG,oBAGP,MAAM13F,QCjCK,SAAwB6L,EAAwCrf,GAC7E,MAAMwT,EAAW,CACf+H,gBAAiB,IAAImuD,GACrBvsD,gBAAiB,IAAI4e,GACrByc,eAAgB,IAAIvI,GACpB2N,iBAAkB,IAAIwsB,GACtBtc,gBAAiB,IAAI+c,GACrBhtD,gBAAiB,IAAIi9D,GACrBptB,mBAAoB,IAAIozB,GACxBnhE,iBAAkB,IAAIi1B,GACtBn9B,kBAAmB,IAAIu1D,GACvBpqD,wBAAyB,IAAIqlD,GAC7BppD,kBAAmB,IAAI0U,GACvBm4E,kBAAmB,IAAI1yE,GACvB0jC,qBAAsB,IAAI1jB,GAC1B2yD,gBAAiB,IAAI5xE,GACrBmqC,oBAAqB,IAAIsN,GACzBp6D,mBAAoB,IAAIkrC,GACxB8Y,sBAAuB,IAAIra,GAC3B6qD,kBAAmB,IAAIz/B,GACvB0/B,qBAAsB,IAAIhvD,GAC1BtlC,mBAAoB,IAAIq9D,GACxB9jC,kBAAmB,IAAIz6B,GACvBsB,gBAAiB,IAAI8+B,GACrB31B,eAAgB,IAAI+N,GACpBjD,eAAgB,IAAI3R,GACpBzF,WAAY,IAAIq1E,GAChB10E,aAAclJ,EAAA,EACd6/F,gBAAiB,IAAIv3F,EACrBolB,eAAgB,IAAIkpD,GACpBt7D,aAAc,IAAI,GAClB+oB,cAAe,IAAIy+C,GACnBt3C,iBAAkB,IAAI4pD,GACtBzjF,UAAW,IAAI/W,EACfgmF,WAAY,IAAI+V,GAChBrwF,eAAgB,IAAI5B,EACpByT,YAAa,IAAI+iF,GACjB9nF,mBAAoBA,EACpBD,gBAAiB,EACjB+8C,kBAAmB,IAAIurC,GACvBqE,mBAAoB,IAAInE,GACxB9vF,yBAA0B,IAAIixF,GAC9BiD,wBAAyB,IAAI9B,IAK/B,IAAI,MAAMppG,KAAQ0S,EAAU,CAC1B,MAAM43F,EAAU53F,EAAS1S,GACrBsqG,IAIAA,EAA+B73F,cAChC63F,EAA+B73F,YAAYC,UACpC43F,EAA+B73F,aAIzC/D,EAAA,EAAI1O,GAAQsqG,E,CAGd,MAAM9+E,EAAyD,GAC/D,IAAIlY,EAAQtZ,OAAO+Y,KAAKL,GACxBY,EAAMuS,QAAQ,kBAAmB,kBAAmB,0BAA2B,qBAAsB,kBACrGvS,GAAQ,EAAA0kB,GAAA,GAAa1kB,GACrB,IAAI,MAAMtT,KAAQsT,EAAO,CACvB,MAAMg3F,EAAU53F,EAAS1S,GACzB,GAAIsqG,aAAO,EAAPA,EAAiBztF,MAAO,CAE1B,MAAM1a,EAAUmoG,EAAgBztF,QAChC2O,EAASnrB,KAAK8B,E,EAclB,OAJGjD,GACDwT,EAASgB,WAAWw0E,YAAYhpF,GAG3BwC,QAAQyQ,IAAIqZ,GAAU5mB,MAAK,IAAM8N,GAC1C,CDrD2Bi4F,CAAepsF,EAAoB,UAC1D,OAAOxe,KAAK2S,SAAWA,CACzB,E,+RAEO23F,c,MACL,OAAoB,QAApB,EAAOtqG,KAAK2S,gBAAQ,QAAb3S,KAAK2S,SAAa3S,KAAK4qG,gBAChC,GAIF,OAAmB,wBAAoCV,IACvD,Y,eErEA,IAKI,GAA8CkB,GAL9CC,IAAyB,EACtB,SAAS15D,KACd,OAAO05D,EACT,CAGO,SAASjqB,KACd,OAAOiqB,GAAyB,QAAqBpsG,CACvD,CAEA,MAAMkB,IAAM,EAAAqI,EAAA,IAAO,WAGb0H,GAAO,IAAI,IACjBA,GAAK+N,2BAA2B,CAC9BrY,YAAcA,IACZE,EAAeF,GAEf,oBAAsC,EAGxCkF,OAAQ,EAAEjC,SAAQlC,UACT,iBAA0BkC,KAAkBlC,GAGrDK,MAAO,EAAEA,QAAOmM,gBAAem4F,aAAYtoG,aAAYD,aAAY5D,aAKjEgB,GAAI,YAAa6G,EAAOskG,GAExB,SAAyBnsG,EACzB,aAA6B6D,EAC7B,aAA6BD,EAE5B9I,OAAO+Y,KAAKhM,GAAkCnI,SAASuI,IACtD,cAA4BA,EAAKJ,EAAMI,IAAM,GAAOkkG,EAAWv8E,SAAS3nB,GAAK,IAG/E,UAA+B+L,EAAc,EAI/Cg4E,eAAgB,EAAErtE,UAASytF,iBAClB,EAAApgB,GAAA,GAAertE,EAASytF,GAGjCppG,MAAO,CAACoK,EAAS+uC,KACfn7C,GAAI,sBAAuBoM,EAAS+uC,GACpCprC,GAAKs7F,mBAAmB,QAASj/F,EAAS+uC,EAAO,EAGnDmwD,oBAAsB57D,IACpBw7D,GAAyBx7D,CAAM,EAGjC67D,kBAAmB,CAACn/F,EAAS+uC,EAAQn5C,KAChC,IACD,GAAmBwpG,WAAWP,IAC9BA,QAAsBnsG,IAEtB,GAAqB,IAAI,KACzB,GAAmBgf,2BAA2B,CAC5C41B,gBAAkBtnC,IACT,EAAAygB,EAAA,GAAY,kBAAmCra,IACpD,MAAM,MAACqE,EAAK,KAAE9O,EAAI,OAAEikB,EAAM,MAAEhQ,GAAS5P,EACrC,OAAOoG,EAASglC,eAAe/D,eAAe58B,EAAO9O,EAAMikB,EAAQhQ,EAAM,QAO9EivF,GAAsBjpG,EAAMsoG,MAAM,KACnC,GAAmBmB,WAAWR,G,EAIlCnyE,gBAAkBF,GACTC,IAAIC,gBAAgBF,KAmB/B54B,GAAI,iBAEJ,WACA,iBACA,WCvHe,SACb0rG,EACAC,EACAC,GAEA,MAAMH,EAAa,CAACI,EAAiBC,KACnCJ,EAAYK,iBAAiBF,GAC7BC,GAAYJ,EAAYM,eAAeF,GACvCH,SAAAA,EAAYE,EAAW,EAGzBH,EAAYO,qBDuHV9wD,IACF,aAAyBA,EAAO,ICtHO,oBAA9B,wBACN3sC,EAAA,mBAAwD,WAAYpM,GAAMqpG,EAAWrpG,EAAE+4C,OAAQ/4C,EAAE+4C,UACrD,oBAA/B,yBACdswD,EAAWj9F,EAAA,EAAK,MAEhBi9F,EAAWj9F,EAAA,EAAKA,EAAA,EAEpB,CDsGA09F,CAAkBn8F,IAAOorC,IACvB,UAAsBA,EAAO,G,wJEtHxB,MAAMgxD,EAAuB,EACvBC,EAA0B,WAC1BC,EAAoC,IACpCC,EAA0B,MAC1BC,EAAa,WAEbC,EAAqB,SACrBC,EAAkB,GAElBC,EAA4B,iBAC5BC,EAAmB,WACnBC,EAAgB,IAAI5uG,IAAI,CAAC,MAAO,IAAK,MAErC6uG,EAAgC,EAChCC,EAAoC,EACpCC,EAA4B,IAAI/uG,IAAI,CAAC6uG,EAAeC,IACpDE,EAAiB5sF,KAAK4E,OAAOrkB,MAAMC,KAAKmsG,IAAiB,C,+GChBtE,MAMaE,EAAsB,w3BAyBtBC,EAAwB,OAAUD,EAGlCE,EAAgC,IAAMF,EAAsB,OAC5DG,EAA4B,+BAC5BC,EAAcD,EAEzB,MAAQD,EAAgC,aAAeA,EAF9BC,oIAQzBD,EAAgC,IAAMF,EARbG,qBAUdD,EAAgC,IAAMF,EAVxBG,iDAYOH,EAZPG,uEAmBdE,GADuB,IAAI5hE,OAAO,IAAM0hE,EAA0B/lG,MAAM,GAAI,GAAI,KACrD,+BAC3BkmG,EAAmB,qBACnBC,EAAsB,+BAAiCD,EAAmB,aAC1EE,EAAe,IAAI/hE,OAAO,YAAc6hE,EAAmB,MAAQF,EAAc,YAAc,IAAc,uBAAyBH,EAAwB,mBAAqBM,EAAqB,KACxME,EAAgB,4JAEhBC,EAAmB,+JAenBC,EAA8D,CACzE,IAAK,oBACL,KAAM,mBACN,KAAM,oBACN,GAAM,sBACN,KAAM,sBACN,MAAO,yBACP,KAAM,wBAGKC,EAAqD,IAAI7vG,IAAI,CACxE,qBACA,yBACA,uBAEF,IAAI,MAAMuH,KAAKqoG,EACbC,EAA0BlvG,IAAIivG,EAAkBroG,IAG3C,MAAMuoG,EAAuB,S,gBC3G7B,SAASC,EAAYC,GAE1B,OASK,SAAsBC,GAC3B,MAAMC,EAAS,GACf,IAAIC,EAAO,EACPC,EAAW,EACX7oG,EAAI,EACR,KAAMA,EAAI0oG,EAAkB5xG,QAC1B8xG,EAAOF,EAAkB33B,WAAW/wE,KACjC6oG,GACDF,EAAO/tG,MAAM,OAAYiuG,EAAW,OAAW,KAAOD,EAAO,QAASvhG,SAAS,KAC/EwhG,EAAW,GACHD,EAAO,OAAUA,GAAQ,MACjCC,EAAWD,EAEXD,EAAO/tG,KAAKguG,EAAKvhG,SAAS,KAQ9B,OAJGshG,EAAO7xG,QAA+B,IAArB6xG,EAAO,GAAG7xG,SAC5B6xG,EAAO,GAAK,KAAOA,EAAO,IAGrBA,CACT,CAhCqBG,CAAaC,EAAYN,IAAYpxG,KAAK,IAE/D,C,kBAEA,MAAM2xG,EAAa,UAEbC,EAAkB1a,OAAOC,aAAa,MAEtCua,EAAeG,GAAsBA,EAASn0G,QAAQk0G,GAAmB,EAAIC,EAAS9yG,QAAQ4yG,EAAY,IAAME,EA+BhE,IAAIr9F,IAAI,CAC5D,CAAC,KAAM,S,GC1CLs9F,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqB9vG,IAAjB+vG,EACH,OAAOA,EAAaC,QAGrB,IAAIC,EAASL,EAAyBE,GAAY,CACjDpyG,GAAIoyG,EACJrvF,QAAQ,EACRuvF,QAAS,CAAC,GAUX,OANAE,EAAoBJ,GAAUj1E,KAAKo1E,EAAOD,QAASC,EAAQA,EAAOD,QAASH,GAG3EI,EAAOxvF,QAAS,EAGTwvF,EAAOD,OACf,CAGAH,EAAoBtc,EAAI2c,EAGxBL,EAAoBhT,EAAI,KAGvB,IAAIsT,EAAsBN,EAAoBO,OAAEpwG,EAAW,CAAC,IAAI,IAAI,IAAI,GAAG,MAAM,IAAO6vG,EAAoB,QAE5G,OADsBA,EAAoBO,EAAED,EAClB,EjHpCvB51G,EAAW,GACfs1G,EAAoBO,EAAI,CAACjtG,EAAQktG,EAAUC,EAAIC,KAC9C,IAAGF,EAAH,CAMA,IAAIG,EAAe/lC,IACnB,IAAShkE,EAAI,EAAGA,EAAIlM,EAASgD,OAAQkJ,IAAK,CAGzC,IAFA,IAAK4pG,EAAUC,EAAIC,GAAYh2G,EAASkM,GACpCu/D,GAAY,EACPyZ,EAAI,EAAGA,EAAI4wB,EAAS9yG,OAAQkiF,MACpB,EAAX8wB,GAAsBC,GAAgBD,IAAav1G,OAAO+Y,KAAK87F,EAAoBO,GAAGvvF,OAAO1Y,GAAS0nG,EAAoBO,EAAEjoG,GAAKkoG,EAAS5wB,MAC9I4wB,EAASzlG,OAAO60E,IAAK,IAErBzZ,GAAY,EACTuqC,EAAWC,IAAcA,EAAeD,IAG7C,GAAGvqC,EAAW,CACbzrE,EAASqQ,OAAOnE,IAAK,GACrB,IAAIN,EAAImqG,SACEtwG,IAANmG,IAAiBhD,EAASgD,EAC/B,CACD,CACA,OAAOhD,CAnBP,CAJCotG,EAAWA,GAAY,EACvB,IAAI,IAAI9pG,EAAIlM,EAASgD,OAAQkJ,EAAI,GAAKlM,EAASkM,EAAI,GAAG,GAAK8pG,EAAU9pG,IAAKlM,EAASkM,GAAKlM,EAASkM,EAAI,GACrGlM,EAASkM,GAAK,CAAC4pG,EAAUC,EAAIC,EAqBjB,EkHzBdV,EAAoBpmC,EAAKwmC,IACxB,IAAIQ,EAASR,GAAUA,EAAOS,WAC7B,IAAOT,EAAiB,QACxB,IAAM,EAEP,OADAJ,EAAoB9yF,EAAE0zF,EAAQ,CAAEhvF,EAAGgvF,IAC5BA,CAAM,ECLdZ,EAAoB9yF,EAAI,CAACizF,EAASW,KACjC,IAAI,IAAIxoG,KAAOwoG,EACXd,EAAoBv8C,EAAEq9C,EAAYxoG,KAAS0nG,EAAoBv8C,EAAE08C,EAAS7nG,IAC5EnN,OAAOw4B,eAAew8E,EAAS7nG,EAAK,CAAEyoG,YAAY,EAAMtrG,IAAKqrG,EAAWxoG,IAE1E,ECND0nG,EAAoB5hF,EAAI,CAAC,EAGzB4hF,EAAoBvsG,EAAKutG,GACjBnuG,QAAQyQ,IAAInY,OAAO+Y,KAAK87F,EAAoB5hF,GAAGC,QAAO,CAAC1B,EAAUrkB,KACvE0nG,EAAoB5hF,EAAE9lB,GAAK0oG,EAASrkF,GAC7BA,IACL,KCNJqjF,EAAoBhxE,EAAKgyE,GAER,KAAZA,EAAuB,oCACX,MAAZA,EAAwB,sCAEf,CAAC,IAAM,kBAAkB,IAAM,YAAYA,IAAYA,GAAW,IAAM,CAAC,EAAI,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,wBAAwBA,GAAW,YCL5ShB,EAAoBiB,SAAYD,IAEf,ECHjBhB,EAAoBlK,EAAI,WACvB,GAA0B,iBAAfoL,WAAyB,OAAOA,WAC3C,IACC,OAAOhwG,MAAQ,IAAIiwG,SAAS,cAAb,EAGhB,CAFE,MAAO1tG,GACR,GAAsB,iBAAX3I,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxBk1G,EAAoBv8C,EAAI,CAACphD,EAAK++F,IAAUj2G,OAAOs4B,UAAU3hB,eAAekpB,KAAK3oB,EAAK++F,GCClFpB,EAAoB1pG,EAAK6pG,IACH,oBAAXkB,QAA0BA,OAAOC,aAC1Cn2G,OAAOw4B,eAAew8E,EAASkB,OAAOC,YAAa,CAAEhsG,MAAO,WAE7DnK,OAAOw4B,eAAew8E,EAAS,aAAc,CAAE7qG,OAAO,GAAO,ECL9D0qG,EAAoBuB,IAAOnB,IAC1BA,EAAOoB,MAAQ,GACVpB,EAAOqB,WAAUrB,EAAOqB,SAAW,IACjCrB,G,MCHR,IAAIsB,EACA1B,EAAoBlK,EAAE6L,gBAAeD,EAAY1B,EAAoBlK,EAAEtoG,SAAW,IACtF,IAAIqqC,EAAWmoE,EAAoBlK,EAAEj+D,SACrC,IAAK6pE,GAAa7pE,IACbA,EAAS+pE,gBACZF,EAAY7pE,EAAS+pE,cAAcC,MAC/BH,GAAW,CACf,IAAII,EAAUjqE,EAASkqE,qBAAqB,UACzCD,EAAQp0G,SAAQg0G,EAAYI,EAAQA,EAAQp0G,OAAS,GAAGm0G,IAC5D,CAID,IAAKH,EAAW,MAAM,IAAIzlG,MAAM,yDAChCylG,EAAYA,EAAU10G,QAAQ,OAAQ,IAAIA,QAAQ,QAAS,IAAIA,QAAQ,YAAa,KACpFgzG,EAAoBj1E,EAAI22E,C,KCfxB,MACE,QAAmC,IAAxB1B,EAAqC,CAC9C,IAAIgC,EAAehC,EAAoBhxE,EACnCizE,EAAgBjC,EAAoBvsG,EACpCyuG,EAAW,CAAC,EACZC,EAAW,CAAC,EAIhBnC,EAAoBhxE,EAAI,SAAUgyE,GAEhC,OADagB,EAAahB,IAGvBkB,EAASpgG,eAAek/F,GAAW,IAAMkB,EAASlB,GAAW,GAElE,EACAhB,EAAoBvsG,EAAI,SAAUutG,GAEhC,OADaiB,EAAcjB,GACb9hG,OAAM,SAAUrQ,GAC5B,IAAIuzG,EAAUD,EAASrgG,eAAek/F,GAClCmB,EAASnB,GACT,OACJ,GAAIoB,EAAU,EAAG,CACf,IAAIC,EAAUL,EAAahB,GAQ3B,MAPAnyG,EAAMkE,QACJ,iBACAiuG,EACA,mCACAqB,EACA,IACFxzG,EAAM6D,QAAU2vG,EACVxzG,CACR,CACA,OAAO,IAAIgE,SAAQ,SAAUM,GAE3BF,YAAW,WACT,IACIqvG,EACK9iG,KAAK1J,MAGdosG,EAASlB,GAAWsB,EACpBH,EAASnB,GAAWoB,EAAU,EAC9BjvG,EAAQ6sG,EAAoBvsG,EAAEutG,GAChC,GArCG,IAsCL,GACF,GACF,CACF,CACD,EAjDD,G,MCIA,IAAIuB,EAAkB,CACrB,IAAK,GAgBNvC,EAAoB5hF,EAAExnB,EAAI,CAACoqG,EAASrkF,KAE/B4lF,EAAgBvB,IAElBW,cAAc3B,EAAoBj1E,EAAIi1E,EAAoBhxE,EAAEgyE,GAE9D,EAGD,IAAIwB,EAAqBtxG,KAAuB,iBAAIA,KAAuB,kBAAK,GAC5EuxG,EAA6BD,EAAmBhxG,KAAKue,KAAKyyF,GAC9DA,EAAmBhxG,KAvBC+J,IACnB,IAAKilG,EAAUkC,EAAaC,GAAWpnG,EACvC,IAAI,IAAI0kG,KAAYyC,EAChB1C,EAAoBv8C,EAAEi/C,EAAazC,KACrCD,EAAoBtc,EAAEuc,GAAYyC,EAAYzC,IAIhD,IADG0C,GAASA,EAAQ3C,GACdQ,EAAS9yG,QACd60G,EAAgB/B,EAAS7nG,OAAS,EACnC8pG,EAA2BlnG,EAAK,C,K5HnB7B5Q,EAAOq1G,EAAoBhT,EAC/BgT,EAAoBhT,EAAI,IAChBn6F,QAAQyQ,IAAI,CAAC,IAAI,IAAI,IAAI,GAAG,KAAKlO,IAAI4qG,EAAoBvsG,EAAGusG,IAAsBjqG,KAAKpL,G6HDrEq1G,EAAoBhT,G","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/config/emoji.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/cleanSearchText.ts","webpack://tweb/./src/helpers/fileName.ts","webpack://tweb/./src/helpers/restrictions.ts","webpack://tweb/./src/lib/appManagers/utils/peers/getPeerId.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/environment/utils.ts","webpack://tweb/./src/lib/rootScope.ts","webpack://tweb/./src/lib/appManagers/appStateManager.ts","webpack://tweb/./src/helpers/object/setDeepProperty.ts","webpack://tweb/./src/lib/mtproto/transports/http.ts","webpack://tweb/./src/lib/mtproto/transports/websocket.ts","webpack://tweb/./src/helpers/array/randomize.ts","webpack://tweb/./src/lib/mtproto/transports/obfuscation.ts","webpack://tweb/./src/lib/mtproto/transports/abridged.ts","webpack://tweb/./src/helpers/bytes/bytesToHex.ts","webpack://tweb/./src/lib/mtproto/transports/tcpObfuscated.ts","webpack://tweb/./src/lib/mtproto/dcConfigurator.ts","webpack://tweb/./src/lib/mtproto/transports/controller.ts","webpack://tweb/./src/lib/appManagers/utils/storages/resetStoragesPromise.ts","webpack://tweb/./src/lib/appManagers/manager.ts","webpack://tweb/./src/lib/appManagers/utils/storages/loadStorages.ts","webpack://tweb/./src/lib/appManagers/appStoragesManager.ts","webpack://tweb/./src/lib/appManagers/utils/storages/createStorages.ts","webpack://tweb/./src/lib/mtproto/passwordManager.ts","webpack://tweb/./src/lib/mtproto/referenceDatabase.ts","webpack://tweb/./src/helpers/object/safeReplaceObject.ts","webpack://tweb/./src/lib/appManagers/utils/messages/getPeerIdsFromMessage.ts","webpack://tweb/./src/lib/appManagers/utils/dialogs/setDialogIndex.ts","webpack://tweb/./src/lib/storages/dialogs.ts","webpack://tweb/./src/lib/storages/filters.ts","webpack://tweb/./src/helpers/applyMixins.ts","webpack://tweb/./src/lib/appManagers/apiUpdatesManager.ts","webpack://tweb/./src/lib/appManagers/appAvatarsManager.ts","webpack://tweb/./src/lib/appManagers/appCallsManager.ts","webpack://tweb/./src/lib/appManagers/appChatsManager.ts","webpack://tweb/./src/lib/langPack.ts","webpack://tweb/./src/lib/richTextProcessor/wrapUrl.ts","webpack://tweb/./src/helpers/date.ts","webpack://tweb/./src/helpers/object/safeReplaceArrayInObject.ts","webpack://tweb/./src/environment/mimeTypeMap.ts","webpack://tweb/./src/lib/appManagers/appDocsManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentURL.ts","webpack://tweb/./src/lib/appManagers/appDraftsManager.ts","webpack://tweb/./src/lib/appManagers/appEmojiManager.ts","webpack://tweb/./src/lib/appManagers/appGroupCallsManager.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoInput.ts","webpack://tweb/./src/lib/appManagers/utils/photos/getPhotoMediaInput.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentMediaInput.ts","webpack://tweb/./src/lib/appManagers/appInlineBotsManager.ts","webpack://tweb/./src/lib/appManagers/appMessagesIdsManager.ts","webpack://tweb/./src/helpers/string/splitStringByLength.ts","webpack://tweb/./src/lib/appManagers/appTabsManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInput.ts","webpack://tweb/./src/helpers/object/setBooleanFlag.ts","webpack://tweb/./src/lib/appManagers/appMessagesManager.ts","webpack://tweb/./src/lib/appManagers/utils/docs/getDocumentInputFileName.ts","webpack://tweb/./src/helpers/string/convertInputKeyToKey.ts","webpack://tweb/./src/lib/appManagers/appNotificationsManager.ts","webpack://tweb/./src/lib/appManagers/appPeersManager.ts","webpack://tweb/./src/lib/appManagers/appPhotosManager.ts","webpack://tweb/./src/lib/appManagers/appPollsManager.ts","webpack://tweb/./src/lib/appManagers/appPrivacyManager.ts","webpack://tweb/./src/lib/appManagers/appProfileManager.ts","webpack://tweb/./src/helpers/callbackifyAll.ts","webpack://tweb/./src/lib/appManagers/appReactionsManager.ts","webpack://tweb/./src/lib/appManagers/appStickersManager.ts","webpack://tweb/./src/helpers/fixBase64String.ts","webpack://tweb/./src/lib/appManagers/appUsersManager.ts","webpack://tweb/./src/helpers/cleanUsername.ts","webpack://tweb/./src/lib/appManagers/appWebPagesManager.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/string/fileNameRFC.ts","webpack://tweb/./src/lib/files/downloadWriter.ts","webpack://tweb/./src/lib/files/downloadStorage.ts","webpack://tweb/./src/lib/mtproto/apiFileManager.ts","webpack://tweb/./src/helpers/fixFirefoxSvg.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/lib/mtproto/api_methods.ts","webpack://tweb/./src/lib/mtproto/apiManager.ts","webpack://tweb/./src/lib/storages/peers.ts","webpack://tweb/./src/lib/storages/thumbs.ts","webpack://tweb/./src/lib/mtproto/schema.ts","webpack://tweb/./src/helpers/number/intToUint.ts","webpack://tweb/./src/helpers/long/ulongFromInts.ts","webpack://tweb/./src/helpers/bigInt/bigIntConstants.ts","webpack://tweb/./src/helpers/bigInt/bigIntConversion.ts","webpack://tweb/./src/lib/mtproto/tl_utils.ts","webpack://tweb/./src/helpers/gzipUncompress.ts","webpack://tweb/./src/helpers/bytes/addPadding.ts","webpack://tweb/./src/lib/mtproto/networker.ts","webpack://tweb/./src/helpers/long/sortLongsArray.ts","webpack://tweb/./src/helpers/long/longToBytes.ts","webpack://tweb/./src/lib/mtproto/networkerFactory.ts","webpack://tweb/./src/lib/mtproto/rsaKeysManager.ts","webpack://tweb/./src/helpers/bytes/bytesXor.ts","webpack://tweb/./src/lib/mtproto/authorizer.ts","webpack://tweb/./src/lib/mtproto/timeManager.ts","webpack://tweb/./src/lib/appManagers/appWebDocsManager.ts","webpack://tweb/./src/lib/appManagers/appPaymentsManager.ts","webpack://tweb/./src/lib/appManagers/appAttachMenuBotsManager.ts","webpack://tweb/./src/lib/appManagers/appSeamlessLoginManager.ts","webpack://tweb/./src/lib/appManagers/appManagersManager.ts","webpack://tweb/./src/lib/appManagers/createManagers.ts","webpack://tweb/./src/lib/mtproto/mtproto.worker.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/mtproto/mtproto_config.ts","webpack://tweb/./src/lib/richTextProcessor/index.ts","webpack://tweb/./src/vendor/emoji/index.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/compat get default export","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/make namespace object","webpack://tweb/webpack/runtime/node module decorator","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn Promise.all([699,211,539,85,946].map(__webpack_require__.e, __webpack_require__)).then(next);\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {EMOJI_VERSION} from '../environment/emojiVersionsSupport';\n\nexport const EmojiVersions: {[version in EMOJI_VERSION]: {[emoji: string]: number}} = {'14':{'1f6dd':4867, '1f6de':4916, '1f6df':4923, '1f7f0':62832, '1f979':183, '1f9cc':1557, '1fa7b':61332, '1fa7c':61330, '1faa9':51093, '1faaa':61364, '1faab':61189, '1faac':51085, '1fab7':2651, '1fab8':2631, '1fab9':2672, '1faba':2673, '1fac3':1520, '1fac4':1521, '1fac5':1505, '1fad7':3793, '1fad8':3707, '1fad9':3804, '1fae0':111, '1fae1':136, '1fae2':132, '1fae3':133, '1fae4':174, '1fae5':142, '1fae6':1385, '1fae7':61353, '1faf0':1341, '1faf1':1332, '1faf2':1333, '1faf3':1334, '1faf4':1335, '1faf5':1351, '1faf6':1360, '1faf1-1f3fb-200d-1faf2-1f3fc':0, '1faf1-1f3fb-200d-1faf2-1f3fd':0, '1faf1-1f3fb-200d-1faf2-1f3fe':0, '1faf1-1f3fb-200d-1faf2-1f3ff':0, '1faf1-1f3fc-200d-1faf2-1f3fb':0, '1faf1-1f3fc-200d-1faf2-1f3fd':0, '1faf1-1f3fc-200d-1faf2-1f3fe':0, '1faf1-1f3fc-200d-1faf2-1f3ff':0, '1faf1-1f3fd-200d-1faf2-1f3fb':0, '1faf1-1f3fd-200d-1faf2-1f3fc':0, '1faf1-1f3fd-200d-1faf2-1f3fe':0, '1faf1-1f3fd-200d-1faf2-1f3ff':0, '1faf1-1f3fe-200d-1faf2-1f3fb':0, '1faf1-1f3fe-200d-1faf2-1f3fc':0, '1faf1-1f3fe-200d-1faf2-1f3fd':0, '1faf1-1f3fe-200d-1faf2-1f3ff':0, '1faf1-1f3ff-200d-1faf2-1f3fb':0, '1faf1-1f3ff-200d-1faf2-1f3fc':0, '1faf1-1f3ff-200d-1faf2-1f3fd':0, '1faf1-1f3ff-200d-1faf2-1f3fe':0, '1fac3-1f3fb':0, '1fac3-1f3fc':0, '1fac3-1f3fd':0, '1fac3-1f3fe':0, '1fac3-1f3ff':0, '1fac4-1f3fb':0, '1fac4-1f3fc':0, '1fac4-1f3fd':0, '1fac4-1f3fe':0, '1fac4-1f3ff':0, '1fac5-1f3fb':0, '1fac5-1f3fc':0, '1fac5-1f3fd':0, '1fac5-1f3fe':0, '1fac5-1f3ff':0, '1faf0-1f3fb':0, '1faf0-1f3fc':0, '1faf0-1f3fd':0, '1faf0-1f3fe':0, '1faf0-1f3ff':0, '1faf1-1f3fb':0, '1faf1-1f3fc':0, '1faf1-1f3fd':0, '1faf1-1f3fe':0, '1faf1-1f3ff':0, '1faf2-1f3fb':0, '1faf2-1f3fc':0, '1faf2-1f3fd':0, '1faf2-1f3fe':0, '1faf2-1f3ff':0, '1faf3-1f3fb':0, '1faf3-1f3fc':0, '1faf3-1f3fd':0, '1faf3-1f3fe':0, '1faf3-1f3ff':0, '1faf4-1f3fb':0, '1faf4-1f3fc':0, '1faf4-1f3fd':0, '1faf4-1f3fe':0, '1faf4-1f3ff':0, '1faf5-1f3fb':0, '1faf5-1f3fc':0, '1faf5-1f3fd':0, '1faf5-1f3fe':0, '1faf5-1f3ff':0, '1faf6-1f3fb':0, '1faf6-1f3fc':0, '1faf6-1f3fd':0, '1faf6-1f3fe':0, '1faf6-1f3ff':0}, '':{'2049':62835, '2122':62863, '2139':62888, '2194':62764, '2195':62763, '2196':62762, '2197':62756, '2198':62758, '2199':62760, '2328':61194, '2600':4990, '2601':4998, '2602':41013, '2603':41018, '2604':41020, '2611':62851, '2614':41014, '2615':3781, '2618':2667, '2620':1106, '2622':62753, '2623':62754, '2626':62783, '2638':62780, '2639':177, '2648':62788, '2649':62789, '2650':62796, '2651':62797, '2652':62798, '2653':62799, '2660':51095, '2663':51098, '2665':51096, '2666':51097, '2668':4865, '2692':61297, '2693':4922, '2694':61300, '2696':61311, '2697':61319, '2699':61309, '2702':61284, '2705':62850, '2708':4931, '2709':61245, '2712':61259, '2714':62852, '2716':62828, '2721':62779, '2728':51029, '2733':62858, '2734':62859, '2744':41017, '2747':62860, '2753':62836, '2754':62837, '2755':62838, '2757':62839, '2763':1137, '2764':1141, '2795':62829, '2796':62830, '2797':62831, '2934':62767, '2935':62768, '3030':62840, '3297':62912, '3299':62913, '0023-20e3':62864, '002a-20e3':62865, '0030-20e3':62866, '0031-20e3':62867, '0032-20e3':62868, '0033-20e3':62869, '0034-20e3':62870, '0035-20e3':62871, '0036-20e3':62872, '0037-20e3':62873, '0038-20e3':62874, '0039-20e3':62875, '00a9':62861, '00ae':62862, '1f004':51101, '1f0cf':51100, '1f170':62882, '1f171':62884, '1f17e':62893, '1f17f':62895, '1f18e':62883, '1f191':62885, '1f192':62886, '1f193':62887, '1f194':62889, '1f195':62891, '1f196':62892, '1f197':62894, '1f198':62896, '1f199':62897, '1f19a':62898, '1f1e6-1f1e8':71594, '1f1e6-1f1e9':71595, '1f1e6-1f1ea':71596, '1f1e6-1f1eb':71597, '1f1e6-1f1ec':71598, '1f1e6-1f1ee':71599, '1f1e6-1f1f1':71600, '1f1e6-1f1f2':71601, '1f1e6-1f1f4':71602, '1f1e6-1f1f6':71603, '1f1e6-1f1f7':71604, '1f1e6-1f1f8':71605, '1f1e6-1f1f9':71606, '1f1e6-1f1fa':71607, '1f1e6-1f1fc':71608, '1f1e6-1f1fd':71609, '1f1e6-1f1ff':71610, '1f1e7-1f1e6':71611, '1f1e7-1f1e7':71612, '1f1e7-1f1e9':71613, '1f1e7-1f1ea':71614, '1f1e7-1f1eb':71615, '1f1e7-1f1ec':71616, '1f1e7-1f1ed':71617, '1f1e7-1f1ee':71618, '1f1e7-1f1ef':71619, '1f1e7-1f1f1':71620, '1f1e7-1f1f2':71621, '1f1e7-1f1f3':71622, '1f1e7-1f1f4':71623, '1f1e7-1f1f6':71624, '1f1e7-1f1f7':71625, '1f1e7-1f1f8':71626, '1f1e7-1f1f9':71627, '1f1e7-1f1fb':71628, '1f1e7-1f1fc':71629, '1f1e7-1f1fe':71630, '1f1e7-1f1ff':71631, '1f1e8-1f1e6':71632, '1f1e8-1f1e8':71633, '1f1e8-1f1e9':71634, '1f1e8-1f1eb':71635, '1f1e8-1f1ec':71636, '1f1e8-1f1ed':71637, '1f1e8-1f1ee':71638, '1f1e8-1f1f0':71639, '1f1e8-1f1f1':71640, '1f1e8-1f1f2':71641, '1f1e8-1f1f3':71642, '1f1e8-1f1f4':71643, '1f1e8-1f1f5':71644, '1f1e8-1f1f7':71645, '1f1e8-1f1fa':71646, '1f1e8-1f1fb':71647, '1f1e8-1f1fc':71648, '1f1e8-1f1fd':71649, '1f1e8-1f1fe':71650, '1f1e8-1f1ff':71651, '1f1e9-1f1ea':71652, '1f1e9-1f1ec':71653, '1f1e9-1f1ef':71654, '1f1e9-1f1f0':71655, '1f1e9-1f1f2':71656, '1f1e9-1f1f4':71657, '1f1e9-1f1ff':71658, '1f1ea-1f1e6':71659, '1f1ea-1f1e8':71660, '1f1ea-1f1ea':71661, '1f1ea-1f1ec':71662, '1f1ea-1f1ed':71663, '1f1ea-1f1f7':71664, '1f1ea-1f1f8':71665, '1f1ea-1f1f9':71666, '1f1ea-1f1fa':71667, '1f1eb-1f1ee':71668, '1f1eb-1f1ef':71669, '1f1eb-1f1f0':71670, '1f1eb-1f1f2':71671, '1f1eb-1f1f4':71672, '1f1eb-1f1f7':71673, '1f1ec-1f1e6':71674, '1f1ec-1f1e7':71675, '1f1ec-1f1e9':71676, '1f1ec-1f1ea':71677, '1f1ec-1f1eb':71678, '1f1ec-1f1ec':71679, '1f1ec-1f1ed':71680, '1f1ec-1f1ee':71681, '1f1ec-1f1f1':71682, '1f1ec-1f1f2':71683, '1f1ec-1f1f3':71684, '1f1ec-1f1f5':71685, '1f1ec-1f1f6':71686, '1f1ec-1f1f7':71687, '1f1ec-1f1f8':71688, '1f1ec-1f1f9':71689, '1f1ec-1f1fa':71690, '1f1ec-1f1fc':71691, '1f1ec-1f1fe':71692, '1f1ed-1f1f0':71693, '1f1ed-1f1f2':71694, '1f1ed-1f1f3':71695, '1f1ed-1f1f7':71696, '1f1ed-1f1f9':71697, '1f1ed-1f1fa':71698, '1f1ee-1f1e8':71699, '1f1ee-1f1e9':71700, '1f1ee-1f1ea':71701, '1f1ee-1f1f1':71702, '1f1ee-1f1f2':71703, '1f1ee-1f1f3':71704, '1f1ee-1f1f4':71705, '1f1ee-1f1f6':71706, '1f1ee-1f1f7':71707, '1f1ee-1f1f8':71708, '1f1ee-1f1f9':71709, '1f1ef-1f1ea':71710, '1f1ef-1f1f2':71711, '1f1ef-1f1f4':71712, '1f1ef-1f1f5':71713, '1f1f0-1f1ea':71714, '1f1f0-1f1ec':71715, '1f1f0-1f1ed':71716, '1f1f0-1f1ee':71717, '1f1f0-1f1f2':71718, '1f1f0-1f1f3':71719, '1f1f0-1f1f5':71720, '1f1f0-1f1f7':71721, '1f1f0-1f1fc':71722, '1f1f0-1f1fe':71723, '1f1f0-1f1ff':71724, '1f1f1-1f1e6':71725, '1f1f1-1f1e7':71726, '1f1f1-1f1e8':71727, '1f1f1-1f1ee':71728, '1f1f1-1f1f0':71729, '1f1f1-1f1f7':71730, '1f1f1-1f1f8':71731, '1f1f1-1f1f9':71732, '1f1f1-1f1fa':71733, '1f1f1-1f1fb':71734, '1f1f1-1f1fe':71735, '1f1f2-1f1e6':71736, '1f1f2-1f1e8':71737, '1f1f2-1f1e9':71738, '1f1f2-1f1ea':71739, '1f1f2-1f1eb':71740, '1f1f2-1f1ec':71741, '1f1f2-1f1ed':71742, '1f1f2-1f1f0':71743, '1f1f2-1f1f1':71744, '1f1f2-1f1f2':71745, '1f1f2-1f1f3':71746, '1f1f2-1f1f4':71747, '1f1f2-1f1f5':71748, '1f1f2-1f1f6':71749, '1f1f2-1f1f7':71750, '1f1f2-1f1f8':71751, '1f1f2-1f1f9':71752, '1f1f2-1f1fa':71753, '1f1f2-1f1fb':71754, '1f1f2-1f1fc':71755, '1f1f2-1f1fd':71756, '1f1f2-1f1fe':71757, '1f1f2-1f1ff':71758, '1f1f3-1f1e6':71759, '1f1f3-1f1e8':71760, '1f1f3-1f1ea':71761, '1f1f3-1f1eb':71762, '1f1f3-1f1ec':71763, '1f1f3-1f1ee':71764, '1f1f3-1f1f1':71765, '1f1f3-1f1f4':71766, '1f1f3-1f1f5':71767, '1f1f3-1f1f7':71768, '1f1f3-1f1fa':71769, '1f1f3-1f1ff':71770, '1f1f4-1f1f2':71771, '1f1f5-1f1e6':71772, '1f1f5-1f1ea':71773, '1f1f5-1f1eb':71774, '1f1f5-1f1ec':71775, '1f1f5-1f1ed':71776, '1f1f5-1f1f0':71777, '1f1f5-1f1f1':71778, '1f1f5-1f1f2':71779, '1f1f5-1f1f3':71780, '1f1f5-1f1f7':71781, '1f1f5-1f1f8':71782, '1f1f5-1f1f9':71783, '1f1f5-1f1fc':71784, '1f1f5-1f1fe':71785, '1f1f6-1f1e6':71786, '1f1f7-1f1ea':71787, '1f1f7-1f1f4':71788, '1f1f7-1f1f8':71789, '1f1f7-1f1fa':71790, '1f1f7-1f1fc':71791, '1f1f8-1f1e6':71792, '1f1f8-1f1e7':71793, '1f1f8-1f1e8':71794, '1f1f8-1f1e9':71795, '1f1f8-1f1ea':71796, '1f1f8-1f1ec':71797, '1f1f8-1f1ed':71798, '1f1f8-1f1ee':71799, '1f1f8-1f1ef':71800, '1f1f8-1f1f0':71801, '1f1f8-1f1f1':71802, '1f1f8-1f1f2':71803, '1f1f8-1f1f3':71804, '1f1f8-1f1f4':71805, '1f1f8-1f1f7':71806, '1f1f8-1f1f8':71807, '1f1f8-1f1f9':71808, '1f1f8-1f1fb':71809, '1f1f8-1f1fd':71810, '1f1f8-1f1fe':71811, '1f1f8-1f1ff':71812, '1f1f9-1f1e6':71813, '1f1f9-1f1e8':71814, '1f1f9-1f1e9':71815, '1f1f9-1f1eb':71816, '1f1f9-1f1ec':71817, '1f1f9-1f1ed':71818, '1f1f9-1f1ef':71819, '1f1f9-1f1f0':71820, '1f1f9-1f1f1':71821, '1f1f9-1f1f2':71822, '1f1f9-1f1f3':71823, '1f1f9-1f1f4':71824, '1f1f9-1f1f7':71825, '1f1f9-1f1f9':71826, '1f1f9-1f1fb':71827, '1f1f9-1f1fc':71828, '1f1f9-1f1ff':71829, '1f1fa-1f1e6':71830, '1f1fa-1f1ec':71831, '1f1fa-1f1f2':71832, '1f1fa-1f1f3':71833, '1f1fa-1f1f8':71834, '1f1fa-1f1fe':71835, '1f1fa-1f1ff':71836, '1f1fb-1f1e6':71837, '1f1fb-1f1e8':71838, '1f1fb-1f1ea':71839, '1f1fb-1f1ec':71840, '1f1fb-1f1ee':71841, '1f1fb-1f1f3':71842, '1f1fb-1f1fa':71843, '1f1fc-1f1eb':71844, '1f1fc-1f1f8':71845, '1f1fd-1f1f0':71846, '1f1fe-1f1ea':71847, '1f1fe-1f1f9':71848, '1f1ff-1f1e6':71849, '1f1ff-1f1f2':71850, '1f1ff-1f1fc':71851, '1f201':62899, '1f202':62900, '1f21a':62906, '1f22f':62903, '1f232':62907, '1f233':62911, '1f234':62910, '1f235':62915, '1f236':62902, '1f237':62901, '1f238':62909, '1f239':62905, '1f23a':62914, '1f250':62904, '1f251':62908, '1f300':41010, '1f301':4857, '1f302':41012, '1f303':4858, '1f304':4860, '1f305':4861, '1f306':4862, '1f307':4863, '1f308':41011, '1f309':4864, '1f30a':41023, '1f30b':4815, '1f30c':4997, '1f30d':4806, '1f30e':4807, '1f30f':4808, '1f310':4809, '1f311':4977, '1f312':4978, '1f313':4979, '1f314':4980, '1f315':4981, '1f316':4982, '1f317':4983, '1f318':4984, '1f319':4985, '1f31a':4986, '1f31b':4987, '1f31c':4988, '1f31d':4991, '1f31e':4992, '1f31f':4995, '1f320':4996, '1f321':4989, '1f324':41001, '1f325':41002, '1f326':41003, '1f327':41004, '1f328':41005, '1f329':41006, '1f32a':41007, '1f32b':41008, '1f32c':41009, '1f32d':3725, '1f32e':3727, '1f32f':3728, '1f330':3708, '1f331':2659, '1f332':2661, '1f333':2662, '1f334':2663, '1f335':2664, '1f336':3698, '1f337':2658, '1f338':2649, '1f339':2653, '1f33a':2655, '1f33b':2656, '1f33c':2657, '1f33d':3697, '1f33e':2665, '1f33f':2666, '1f340':2668, '1f341':2669, '1f342':2670, '1f343':2671, '1f344':3705, '1f345':3690, '1f346':3694, '1f347':3674, '1f348':3675, '1f349':3676, '1f34a':3677, '1f34b':3678, '1f34c':3679, '1f34d':3680, '1f34e':3682, '1f34f':3683, '1f350':3684, '1f351':3685, '1f352':3686, '1f353':3687, '1f354':3722, '1f355':3724, '1f356':3718, '1f357':3719, '1f358':3744, '1f359':3745, '1f35a':3746, '1f35b':3747, '1f35c':3748, '1f35d':3749, '1f35e':3709, '1f35f':3723, '1f360':3750, '1f361':3756, '1f362':3751, '1f363':3752, '1f364':3753, '1f365':3754, '1f366':3765, '1f367':3766, '1f368':3767, '1f369':3768, '1f36a':3769, '1f36b':3774, '1f36c':3775, '1f36d':3776, '1f36e':3777, '1f36f':3778, '1f370':3771, '1f371':3743, '1f372':3735, '1f373':3733, '1f374':3801, '1f375':3783, '1f376':3784, '1f377':3786, '1f378':3787, '1f379':3788, '1f37a':3789, '1f37b':3790, '1f37c':3779, '1f37d':3800, '1f37e':3785, '1f37f':3739, '1f380':51040, '1f381':51041, '1f382':3770, '1f383':51024, '1f384':51025, '1f385':1527, '1f386':51026, '1f387':51027, '1f388':51030, '1f389':51031, '1f38a':51032, '1f38b':51033, '1f38c':71588, '1f38d':51034, '1f38e':51035, '1f38f':51036, '1f390':51037, '1f391':51038, '1f392':61134, '1f393':61147, '1f396':51045, '1f397':51042, '1f399':61167, '1f39a':61168, '1f39b':61169, '1f39e':61203, '1f39f':51043, '1f3a0':4866, '1f3a1':4868, '1f3a2':4869, '1f3a3':51072, '1f3a4':61170, '1f3a5':61202, '1f3a6':62819, '1f3a7':61171, '1f3a8':51105, '1f3a9':61146, '1f3aa':4871, '1f3ab':51044, '1f3ac':61205, '1f3ad':51103, '1f3ae':51086, '1f3af':51078, '1f3b0':51088, '1f3b1':51081, '1f3b2':51089, '1f3b3':51060, '1f3b4':51102, '1f3b5':61165, '1f3b6':61166, '1f3b7':61173, '1f3b8':61175, '1f3b9':61176, '1f3ba':61177, '1f3bb':61178, '1f3bc':61164, '1f3bd':51074, '1f3be':51058, '1f3bf':51075, '1f3c0':51054, '1f3c1':71586, '1f3c2':1600, '1f3c3-200d-2640':1584, '1f3c3-200d-2642':1583, '1f3c3':1582, '1f3c4-200d-2640':1606, '1f3c4-200d-2642':1605, '1f3c4':1604, '1f3c5':51047, '1f3c6':51046, '1f3c7':1598, '1f3c8':51056, '1f3c9':51057, '1f3ca-200d-2640':1612, '1f3ca-200d-2642':1611, '1f3ca':1610, '1f3cb-200d-2640':1618, '1f3cb-200d-2642':1617, '1f3cb':1616, '1f3cc-200d-2640':1603, '1f3cc-200d-2642':1602, '1f3cc':1601, '1f3cd':4902, '1f3ce':4901, '1f3cf':51061, '1f3d0':51055, '1f3d1':51062, '1f3d2':51063, '1f3d3':51065, '1f3d4':4813, '1f3d5':4817, '1f3d6':4818, '1f3d7':4824, '1f3d8':4829, '1f3d9':4859, '1f3da':4830, '1f3db':4823, '1f3dc':4819, '1f3dd':4820, '1f3de':4821, '1f3df':4822, '1f3e0':4831, '1f3e1':4832, '1f3e2':4833, '1f3e3':4834, '1f3e4':4835, '1f3e5':4836, '1f3e6':4837, '1f3e7':62729, '1f3e8':4838, '1f3e9':4839, '1f3ea':4840, '1f3eb':4841, '1f3ec':4842, '1f3ed':4843, '1f3ee':61216, '1f3ef':4844, '1f3f0':4845, '1f3f3-200d-1f308':71591, '1f3f3-200d-26a7':71592, '1f3f3':71590, '1f3f4-200d-2620':71593, '1f3f4-e0067-e0062-e0065-e006e-e0067-e007f':71852, '1f3f4-e0067-e0062-e0073-e0063-e0074-e007f':71853, '1f3f4-e0067-e0062-e0077-e006c-e0073-e007f':71854, '1f3f4':71589, '1f3f5':2652, '1f3f7':61234, '1f3f8':51066, '1f3f9':61303, '1f3fa':3805, '1f3fb':9525, '1f3fc':9526, '1f3fd':9527, '1f3fe':9528, '1f3ff':9529, '1f400':2576, '1f401':2575, '1f402':2556, '1f403':2557, '1f404':2558, '1f405':2547, '1f406':2548, '1f407':2579, '1f408-200d-2b1b':2544, '1f408':2543, '1f409':2618, '1f40a':2613, '1f40b':2622, '1f40c':2632, '1f40d':2616, '1f40e':2550, '1f40f':2563, '1f410':2565, '1f411':2564, '1f412':2531, '1f413':2596, '1f414':2595, '1f415-200d-1f9ba':2537, '1f415':2535, '1f416':2560, '1f417':2561, '1f418':2570, '1f419':2629, '1f41a':2630, '1f41b':2634, '1f41c':2635, '1f41d':2636, '1f41e':2638, '1f41f':2625, '1f420':2626, '1f421':2627, '1f422':2614, '1f423':2597, '1f424':2598, '1f425':2599, '1f426':2600, '1f427':2601, '1f428':2586, '1f429':2538, '1f42a':2566, '1f42b':2567, '1f42c':2623, '1f42d':2574, '1f42e':2555, '1f42f':2546, '1f430':2578, '1f431':2542, '1f432':2617, '1f433':2621, '1f434':2549, '1f435':2530, '1f436':2534, '1f437':2559, '1f438':2612, '1f439':2577, '1f43a':2539, '1f43b-200d-2744':2585, '1f43b':2584, '1f43c':2587, '1f43d':2562, '1f43e':2593, '1f43f':2580, '1f440':1381, '1f441-200d-1f5e8':1159, '1f441':1382, '1f442':1373, '1f443':1375, '1f444':1384, '1f445':1383, '1f446':1347, '1f447':1349, '1f448':1345, '1f449':1346, '1f44a':1355, '1f44b':1327, '1f44c':1336, '1f44d':1352, '1f44e':1353, '1f44f':1358, '1f450':1361, '1f451':61144, '1f452':61145, '1f453':61110, '1f454':61115, '1f455':61116, '1f456':61117, '1f457':61122, '1f458':61123, '1f459':61128, '1f45a':61129, '1f45b':61130, '1f45c':61131, '1f45d':61132, '1f45e':61136, '1f45f':61137, '1f460':61140, '1f461':61141, '1f462':61143, '1f463':1687, '1f464':1684, '1f465':1685, '1f466':1388, '1f467':1389, '1f468-200d-1f33e':1457, '1f468-200d-1f373':1460, '1f468-200d-1f37c':1524, '1f468-200d-1f393':1448, '1f468-200d-1f3a4':1478, '1f468-200d-1f3a8':1481, '1f468-200d-1f3eb':1451, '1f468-200d-1f3ed':1466, '1f468-200d-1f466-200d-1f466':1674, '1f468-200d-1f466':1673, '1f468-200d-1f467-200d-1f466':1676, '1f468-200d-1f467-200d-1f467':1677, '1f468-200d-1f467':1675, '1f468-200d-1f468-200d-1f466':1663, '1f468-200d-1f468-200d-1f466-200d-1f466':1666, '1f468-200d-1f468-200d-1f467':1664, '1f468-200d-1f468-200d-1f467-200d-1f466':1665, '1f468-200d-1f468-200d-1f467-200d-1f467':1667, '1f468-200d-1f469-200d-1f466':1658, '1f468-200d-1f469-200d-1f466-200d-1f466':1661, '1f468-200d-1f469-200d-1f467':1659, '1f468-200d-1f469-200d-1f467-200d-1f466':1660, '1f468-200d-1f469-200d-1f467-200d-1f467':1662, '1f468-200d-1f4bb':1475, '1f468-200d-1f4bc':1469, '1f468-200d-1f527':1463, '1f468-200d-1f52c':1472, '1f468-200d-1f680':1487, '1f468-200d-1f692':1490, '1f468-200d-1f9af':1574, '1f468-200d-1f9b0':1396, '1f468-200d-1f9b1':1397, '1f468-200d-1f9b2':1399, '1f468-200d-1f9b3':1398, '1f468-200d-1f9bc':1577, '1f468-200d-1f9bd':1580, '1f468-200d-2695':1445, '1f468-200d-2696':1454, '1f468-200d-2708':1484, '1f468-200d-2764-200d-1f468':1655, '1f468-200d-2764-200d-1f48b-200d-1f468':1651, '1f468':1392, '1f469-200d-1f33e':1458, '1f469-200d-1f373':1461, '1f469-200d-1f37c':1523, '1f469-200d-1f393':1449, '1f469-200d-1f3a4':1479, '1f469-200d-1f3a8':1482, '1f469-200d-1f3eb':1452, '1f469-200d-1f3ed':1467, '1f469-200d-1f466-200d-1f466':1679, '1f469-200d-1f466':1678, '1f469-200d-1f467-200d-1f466':1681, '1f469-200d-1f467-200d-1f467':1682, '1f469-200d-1f467':1680, '1f469-200d-1f469-200d-1f466':1668, '1f469-200d-1f469-200d-1f466-200d-1f466':1671, '1f469-200d-1f469-200d-1f467':1669, '1f469-200d-1f469-200d-1f467-200d-1f466':1670, '1f469-200d-1f469-200d-1f467-200d-1f467':1672, '1f469-200d-1f4bb':1476, '1f469-200d-1f4bc':1470, '1f469-200d-1f527':1464, '1f469-200d-1f52c':1473, '1f469-200d-1f680':1488, '1f469-200d-1f692':1491, '1f469-200d-1f9af':1575, '1f469-200d-1f9b0':1401, '1f469-200d-1f9b1':1403, '1f469-200d-1f9b2':1407, '1f469-200d-1f9b3':1405, '1f469-200d-1f9bc':1578, '1f469-200d-1f9bd':1581, '1f469-200d-2695':1446, '1f469-200d-2696':1455, '1f469-200d-2708':1485, '1f469-200d-2764-200d-1f468':1654, '1f469-200d-2764-200d-1f469':1656, '1f469-200d-2764-200d-1f48b-200d-1f468':1650, '1f469-200d-2764-200d-1f48b-200d-1f469':1652, '1f469':1400, '1f46a':1657, '1f46b':1647, '1f46c':1648, '1f46d':1646, '1f46e-200d-2640':1494, '1f46e-200d-2642':1493, '1f46e':1492, '1f46f-200d-2640':1590, '1f46f-200d-2642':1589, '1f46f':1588, '1f470-200d-2640':1518, '1f470-200d-2642':1517, '1f470':1516, '1f471-200d-2640':1409, '1f471-200d-2642':1410, '1f471':1391, '1f472':1511, '1f473-200d-2640':1510, '1f473-200d-2642':1509, '1f473':1508, '1f474':1412, '1f475':1413, '1f476':1386, '1f477-200d-2640':1504, '1f477-200d-2642':1503, '1f477':1502, '1f478':1507, '1f479':1109, '1f47a':1110, '1f47b':1111, '1f47c':1526, '1f47d':1112, '1f47e':1113, '1f47f':1104, '1f480':1105, '1f481-200d-2640':1428, '1f481-200d-2642':1427, '1f481':1426, '1f482-200d-2640':1500, '1f482-200d-2642':1499, '1f482':1498, '1f483':1585, '1f484':61152, '1f485':1366, '1f486-200d-2640':1560, '1f486-200d-2642':1559, '1f486':1558, '1f487-200d-2640':1563, '1f487-200d-2642':1562, '1f487':1561, '1f488':4870, '1f489':61326, '1f48a':61328, '1f48b':1127, '1f48c':1128, '1f48d':61153, '1f48e':61154, '1f48f':1649, '1f490':2648, '1f491':1653, '1f492':4846, '1f493':1133, '1f494':1138, '1f495':1135, '1f496':1131, '1f497':1132, '1f498':1129, '1f499':1145, '1f49a':1144, '1f49b':1143, '1f49c':1146, '1f49d':1130, '1f49e':1134, '1f49f':1136, '1f4a0':62946, '1f4a1':61214, '1f4a2':1151, '1f4a3':1157, '1f4a4':1163, '1f4a5':1152, '1f4a6':1154, '1f4a7':41022, '1f4a8':1155, '1f4a9':1107, '1f4aa':1368, '1f4ab':1153, '1f4ac':1158, '1f4ad':1162, '1f4ae':2650, '1f4af':1150, '1f4b0':61235, '1f4b1':62841, '1f4b2':62842, '1f4b3':61242, '1f4b4':61237, '1f4b5':61238, '1f4b6':61239, '1f4b7':61240, '1f4b8':61241, '1f4b9':61244, '1f4ba':4936, '1f4bb':61191, '1f4bc':61265, '1f4bd':61197, '1f4be':61198, '1f4bf':61199, '1f4c0':61200, '1f4c1':61266, '1f4c2':61267, '1f4c3':61227, '1f4c4':61229, '1f4c5':61269, '1f4c6':61270, '1f4c7':61273, '1f4c8':61274, '1f4c9':61275, '1f4ca':61276, '1f4cb':61277, '1f4cc':61278, '1f4cd':61279, '1f4ce':61280, '1f4cf':61282, '1f4d0':61283, '1f4d1':61232, '1f4d2':61226, '1f4d3':61225, '1f4d4':61218, '1f4d5':61219, '1f4d6':61220, '1f4d7':61221, '1f4d8':61222, '1f4d9':61223, '1f4da':61224, '1f4db':62847, '1f4dc':61228, '1f4dd':61264, '1f4de':61185, '1f4df':61186, '1f4e0':61187, '1f4e1':61325, '1f4e2':61159, '1f4e3':61160, '1f4e4':61249, '1f4e5':61250, '1f4e6':61251, '1f4e7':61246, '1f4e8':61247, '1f4e9':61248, '1f4ea':61253, '1f4eb':61252, '1f4ec':61254, '1f4ed':61255, '1f4ee':61256, '1f4ef':61161, '1f4f0':61230, '1f4f1':61182, '1f4f2':61183, '1f4f3':62823, '1f4f4':62824, '1f4f5':62751, '1f4f6':62822, '1f4f7':61207, '1f4f8':61208, '1f4f9':61209, '1f4fa':61206, '1f4fb':61172, '1f4fc':61210, '1f4fd':61204, '1f4ff':61151, '1f500':62801, '1f501':62802, '1f502':62803, '1f503':62769, '1f504':62770, '1f505':62820, '1f506':62821, '1f507':61155, '1f508':61156, '1f509':61157, '1f50a':61158, '1f50b':61188, '1f50c':61190, '1f50d':61211, '1f50e':61212, '1f50f':61290, '1f510':61291, '1f511':61292, '1f512':61288, '1f513':61289, '1f514':61162, '1f515':61163, '1f516':61233, '1f517':61313, '1f518':62947, '1f519':62771, '1f51a':62772, '1f51b':62773, '1f51c':62774, '1f51d':62775, '1f51e':62752, '1f51f':62876, '1f520':62877, '1f521':62878, '1f522':62879, '1f523':62880, '1f524':62881, '1f525':41021, '1f526':61215, '1f527':61306, '1f528':61294, '1f529':61308, '1f52a':3803, '1f52b':61301, '1f52c':61323, '1f52d':61324, '1f52e':51082, '1f52f':62787, '1f530':62848, '1f531':62846, '1f532':62949, '1f533':62948, '1f534':62916, '1f535':62920, '1f536':62940, '1f537':62941, '1f538':62942, '1f539':62943, '1f53a':62944, '1f53b':62945, '1f53c':62811, '1f53d':62813, '1f549':62778, '1f54a':2602, '1f54b':4854, '1f54c':4850, '1f54d':4852, '1f54e':62786, '1f550':4955, '1f551':4957, '1f552':4959, '1f553':4961, '1f554':4963, '1f555':4965, '1f556':4967, '1f557':4969, '1f558':4971, '1f559':4973, '1f55a':4975, '1f55b':4953, '1f55c':4956, '1f55d':4958, '1f55e':4960, '1f55f':4962, '1f560':4964, '1f561':4966, '1f562':4968, '1f563':4970, '1f564':4972, '1f565':4974, '1f566':4976, '1f567':4954, '1f56f':61213, '1f570':4952, '1f573':1156, '1f574':1587, '1f575-200d-2640':1497, '1f575-200d-2642':1496, '1f575':1495, '1f576':61111, '1f577':2641, '1f578':2642, '1f579':51087, '1f57a':1586, '1f587':61281, '1f58a':61261, '1f58b':61260, '1f58c':61262, '1f58d':61263, '1f590':1329, '1f595':1348, '1f596':1331, '1f5a4':1148, '1f5a5':61192, '1f5a8':61193, '1f5b1':61195, '1f5b2':61196, '1f5bc':51104, '1f5c2':61268, '1f5c3':61285, '1f5c4':61286, '1f5d1':61287, '1f5d2':61271, '1f5d3':61272, '1f5dc':61310, '1f5dd':61293, '1f5de':61231, '1f5e1':61299, '1f5e3':1683, '1f5e8':1160, '1f5ef':1161, '1f5f3':61257, '1f5fa':4810, '1f5fb':4816, '1f5fc':4847, '1f5fd':4848, '1f5fe':4811, '1f5ff':61362, '1f600':11, '1f601':14, '1f602':18, '1f603':12, '1f604':13, '1f605':16, '1f606':15, '1f607':114, '1f608':1103, '1f609':112, '1f60a':113, '1f60b':124, '1f60c':150, '1f60d':116, '1f60e':170, '1f60f':144, '1f610':139, '1f611':140, '1f612':145, '1f613':195, '1f614':151, '1f615':173, '1f616':192, '1f617':119, '1f618':118, '1f619':122, '1f61a':121, '1f61b':125, '1f61c':126, '1f61d':128, '1f61e':194, '1f61f':175, '1f620':1101, '1f621':1100, '1f622':189, '1f623':193, '1f624':199, '1f625':188, '1f626':184, '1f627':185, '1f628':186, '1f629':196, '1f62a':152, '1f62b':197, '1f62c':147, '1f62d':190, '1f62e-200d-1f4a8':148, '1f62e':178, '1f62f':179, '1f630':187, '1f631':191, '1f632':180, '1f633':181, '1f634':154, '1f635-200d-1f4ab':165, '1f635':164, '1f636-200d-1f32b':143, '1f636':141, '1f637':155, '1f638':1116, '1f639':1117, '1f63a':1115, '1f63b':1118, '1f63c':1119, '1f63d':1120, '1f63e':1123, '1f63f':1122, '1f640':1121, '1f641':176, '1f642':19, '1f643':110, '1f644':146, '1f645-200d-2640':1422, '1f645-200d-2642':1421, '1f645':1420, '1f646-200d-2640':1425, '1f646-200d-2642':1424, '1f646':1423, '1f647-200d-2640':1437, '1f647-200d-2642':1436, '1f647':1435, '1f648':1124, '1f649':1125, '1f64a':1126, '1f64b-200d-2640':1431, '1f64b-200d-2642':1430, '1f64b':1429, '1f64c':1359, '1f64d-200d-2640':1416, '1f64d-200d-2642':1415, '1f64d':1414, '1f64e-200d-2640':1419, '1f64e-200d-2642':1418, '1f64e':1417, '1f64f':1364, '1f680':4942, '1f681':4937, '1f682':4872, '1f683':4873, '1f684':4874, '1f685':4875, '1f686':4876, '1f687':4877, '1f688':4878, '1f689':4879, '1f68a':4880, '1f68b':4883, '1f68c':4884, '1f68d':4885, '1f68e':4886, '1f68f':4911, '1f690':4887, '1f691':4888, '1f692':4889, '1f693':4890, '1f694':4891, '1f695':4892, '1f696':4893, '1f697':4894, '1f698':4895, '1f699':4896, '1f69a':4898, '1f69b':4899, '1f69c':4900, '1f69d':4881, '1f69e':4882, '1f69f':4938, '1f6a0':4939, '1f6a1':4940, '1f6a2':4930, '1f6a3-200d-2640':1609, '1f6a3-200d-2642':1608, '1f6a3':1607, '1f6a4':4926, '1f6a5':4918, '1f6a6':4919, '1f6a7':4921, '1f6a8':4917, '1f6a9':71587, '1f6aa':61333, '1f6ab':62745, '1f6ac':61358, '1f6ad':62747, '1f6ae':62730, '1f6af':62748, '1f6b0':62731, '1f6b1':62749, '1f6b2':4907, '1f6b3':62746, '1f6b4-200d-2640':1621, '1f6b4-200d-2642':1620, '1f6b4':1619, '1f6b5-200d-2640':1624, '1f6b5-200d-2642':1623, '1f6b5':1622, '1f6b6-200d-2640':1566, '1f6b6-200d-2642':1565, '1f6b6':1564, '1f6b7':62750, '1f6b8':62743, '1f6b9':62733, '1f6ba':62734, '1f6bb':62735, '1f6bc':62736, '1f6bd':61340, '1f6be':62737, '1f6bf':61342, '1f6c0':1643, '1f6c1':61343, '1f6c2':62738, '1f6c3':62739, '1f6c4':62740, '1f6c5':62741, '1f6cb':61338, '1f6cc':1644, '1f6cd':61133, '1f6ce':4944, '1f6cf':61337, '1f6d0':62776, '1f6d1':4920, '1f6d2':61357, '1f6d5':4851, '1f6d6':4828, '1f6d7':61334, '1f6e0':61298, '1f6e1':61304, '1f6e2':4914, '1f6e3':4912, '1f6e4':4913, '1f6e5':4929, '1f6e9':4932, '1f6eb':4933, '1f6ec':4934, '1f6f0':4941, '1f6f3':4927, '1f6f4':4908, '1f6f5':4903, '1f6f6':4925, '1f6f7':51076, '1f6f8':4943, '1f6f9':4909, '1f6fa':4906, '1f6fb':4897, '1f6fc':4910, '1f7e0':62917, '1f7e1':62918, '1f7e2':62919, '1f7e3':62921, '1f7e4':62922, '1f7e5':62925, '1f7e6':62929, '1f7e7':62926, '1f7e8':62927, '1f7e9':62928, '1f7ea':62930, '1f7eb':62931, '1f90c':1337, '1f90d':1149, '1f90e':1147, '1f90f':1338, '1f910':137, '1f911':129, '1f912':156, '1f913':171, '1f914':135, '1f915':157, '1f916':1114, '1f917':130, '1f918':1343, '1f919':1344, '1f91a':1328, '1f91b':1356, '1f91c':1357, '1f91d':1363, '1f91e':1340, '1f91f':1342, '1f920':167, '1f921':1108, '1f922':158, '1f923':17, '1f924':153, '1f925':149, '1f926-200d-2640':1440, '1f926-200d-2642':1439, '1f926':1438, '1f927':160, '1f928':138, '1f929':117, '1f92a':127, '1f92b':134, '1f92c':1102, '1f92d':131, '1f92e':159, '1f92f':166, '1f930':1519, '1f931':1522, '1f932':1362, '1f933':1367, '1f934':1506, '1f935-200d-2640':1515, '1f935-200d-2642':1514, '1f935':1513, '1f936':1528, '1f937-200d-2640':1443, '1f937-200d-2642':1442, '1f937':1441, '1f938-200d-2640':1627, '1f938-200d-2642':1626, '1f938':1625, '1f939-200d-2640':1639, '1f939-200d-2642':1638, '1f939':1637, '1f93a':1597, '1f93c-200d-2640':1630, '1f93c-200d-2642':1629, '1f93c':1628, '1f93d-200d-2640':1633, '1f93d-200d-2642':1632, '1f93d':1631, '1f93e-200d-2640':1636, '1f93e-200d-2642':1635, '1f93e':1634, '1f93f':51073, '1f940':2654, '1f941':61180, '1f942':3791, '1f943':3792, '1f944':3802, '1f945':51069, '1f947':51048, '1f948':51049, '1f949':51050, '1f94a':51067, '1f94b':51068, '1f94c':51077, '1f94d':51064, '1f94e':51053, '1f94f':51059, '1f950':3710, '1f951':3693, '1f952':3700, '1f953':3721, '1f954':3695, '1f955':3696, '1f956':3711, '1f957':3738, '1f958':3734, '1f959':3730, '1f95a':3732, '1f95b':3780, '1f95c':3706, '1f95d':3689, '1f95e':3715, '1f95f':3757, '1f960':3758, '1f961':3759, '1f962':3799, '1f963':3737, '1f964':3794, '1f965':3692, '1f966':3702, '1f967':3773, '1f968':3713, '1f969':3720, '1f96a':3726, '1f96b':3742, '1f96c':3701, '1f96d':3681, '1f96e':3755, '1f96f':3714, '1f970':115, '1f971':198, '1f972':123, '1f973':168, '1f974':163, '1f975':161, '1f976':162, '1f977':1501, '1f978':169, '1f97a':182, '1f97b':61124, '1f97c':61113, '1f97d':61112, '1f97e':61138, '1f97f':61139, '1f980':3760, '1f981':2545, '1f982':2643, '1f983':2594, '1f984':2551, '1f985':2603, '1f986':2604, '1f987':2583, '1f988':2628, '1f989':2606, '1f98a':2540, '1f98b':2633, '1f98c':2553, '1f98d':2532, '1f98e':2615, '1f98f':2572, '1f990':3762, '1f991':3763, '1f992':2569, '1f993':2552, '1f994':2582, '1f995':2619, '1f996':2620, '1f997':2639, '1f998':2591, '1f999':2568, '1f99a':2610, '1f99b':2573, '1f99c':2611, '1f99d':2541, '1f99e':3761, '1f99f':2644, '1f9a0':2647, '1f9a1':2592, '1f9a2':2605, '1f9a3':2571, '1f9a4':2607, '1f9a5':2588, '1f9a6':2589, '1f9a7':2533, '1f9a8':2590, '1f9a9':2609, '1f9aa':3764, '1f9ab':2581, '1f9ac':2554, '1f9ad':2624, '1f9ae':2536, '1f9af':61312, '1f9b4':1380, '1f9b5':1371, '1f9b6':1372, '1f9b7':1379, '1f9b8-200d-2640':1532, '1f9b8-200d-2642':1531, '1f9b8':1530, '1f9b9-200d-2640':1535, '1f9b9-200d-2642':1534, '1f9b9':1533, '1f9ba':61114, '1f9bb':1374, '1f9bc':4905, '1f9bd':4904, '1f9be':1369, '1f9bf':1370, '1f9c0':3717, '1f9c1':3772, '1f9c2':3741, '1f9c3':3796, '1f9c4':3703, '1f9c5':3704, '1f9c6':3731, '1f9c7':3716, '1f9c8':3740, '1f9c9':3797, '1f9ca':3798, '1f9cb':3795, '1f9cd-200d-2640':1569, '1f9cd-200d-2642':1568, '1f9cd':1567, '1f9ce-200d-2640':1572, '1f9ce-200d-2642':1571, '1f9ce':1570, '1f9cf-200d-2640':1434, '1f9cf-200d-2642':1433, '1f9cf':1432, '1f9d0':172, '1f9d1-200d-1f33e':1456, '1f9d1-200d-1f373':1459, '1f9d1-200d-1f37c':1525, '1f9d1-200d-1f384':1529, '1f9d1-200d-1f393':1447, '1f9d1-200d-1f3a4':1477, '1f9d1-200d-1f3a8':1480, '1f9d1-200d-1f3eb':1450, '1f9d1-200d-1f3ed':1465, '1f9d1-200d-1f4bb':1474, '1f9d1-200d-1f4bc':1468, '1f9d1-200d-1f527':1462, '1f9d1-200d-1f52c':1471, '1f9d1-200d-1f680':1486, '1f9d1-200d-1f692':1489, '1f9d1-200d-1f91d-200d-1f9d1':1645, '1f9d1-200d-1f9af':1573, '1f9d1-200d-1f9b0':1402, '1f9d1-200d-1f9b1':1404, '1f9d1-200d-1f9b2':1408, '1f9d1-200d-1f9b3':1406, '1f9d1-200d-1f9bc':1576, '1f9d1-200d-1f9bd':1579, '1f9d1-200d-2695':1444, '1f9d1-200d-2696':1453, '1f9d1-200d-2708':1483, '1f9d1':1390, '1f9d2':1387, '1f9d3':1411, '1f9d4-200d-2640':1395, '1f9d4-200d-2642':1394, '1f9d4':1393, '1f9d5':1512, '1f9d6-200d-2640':1593, '1f9d6-200d-2642':1592, '1f9d6':1591, '1f9d7-200d-2640':1596, '1f9d7-200d-2642':1595, '1f9d7':1594, '1f9d8-200d-2640':1642, '1f9d8-200d-2642':1641, '1f9d8':1640, '1f9d9-200d-2640':1538, '1f9d9-200d-2642':1537, '1f9d9':1536, '1f9da-200d-2640':1541, '1f9da-200d-2642':1540, '1f9da':1539, '1f9db-200d-2640':1544, '1f9db-200d-2642':1543, '1f9db':1542, '1f9dc-200d-2640':1547, '1f9dc-200d-2642':1546, '1f9dc':1545, '1f9dd-200d-2640':1550, '1f9dd-200d-2642':1549, '1f9dd':1548, '1f9de-200d-2640':1553, '1f9de-200d-2642':1552, '1f9de':1551, '1f9df-200d-2640':1556, '1f9df-200d-2642':1555, '1f9df':1554, '1f9e0':1376, '1f9e1':1142, '1f9e2':61148, '1f9e3':61118, '1f9e4':61119, '1f9e5':61120, '1f9e6':61121, '1f9e7':51039, '1f9e8':51028, '1f9e9':51090, '1f9ea':61320, '1f9eb':61321, '1f9ec':61322, '1f9ed':4812, '1f9ee':61201, '1f9ef':61356, '1f9f0':61316, '1f9f1':4825, '1f9f2':61317, '1f9f3':4945, '1f9f4':61346, '1f9f5':51106, '1f9f6':51108, '1f9f7':61347, '1f9f8':51091, '1f9f9':61348, '1f9fa':61349, '1f9fb':61350, '1f9fc':61352, '1f9fd':61355, '1f9fe':61243, '1f9ff':51084, '1fa70':61142, '1fa71':61125, '1fa72':61126, '1fa73':61127, '1fa74':61135, '1fa78':61327, '1fa79':61329, '1fa7a':61331, '1fa80':51079, '1fa81':51080, '1fa82':4935, '1fa83':61302, '1fa84':51083, '1fa85':51092, '1fa86':51094, '1fa90':4993, '1fa91':61339, '1fa92':61345, '1fa93':61295, '1fa94':61217, '1fa95':61179, '1fa96':61149, '1fa97':61174, '1fa98':61181, '1fa99':61236, '1fa9a':61305, '1fa9b':61307, '1fa9c':61318, '1fa9d':61315, '1fa9e':61335, '1fa9f':61336, '1faa0':61341, '1faa1':51107, '1faa2':51109, '1faa3':61351, '1faa4':61344, '1faa5':61354, '1faa6':61360, '1faa7':61363, '1faa8':4826, '1fab0':2645, '1fab1':2646, '1fab2':2637, '1fab3':2640, '1fab4':2660, '1fab5':4827, '1fab6':2608, '1fac0':1377, '1fac1':1378, '1fac2':1686, '1fad0':3688, '1fad1':3699, '1fad2':3691, '1fad3':3712, '1fad4':3729, '1fad5':3736, '1fad6':3782, '203c':62834, '21a9':62765, '21aa':62766, '231a':4948, '231b':4946, '23cf':62818, '23e9':62805, '23ea':62809, '23eb':62812, '23ec':62814, '23ed':62806, '23ee':62810, '23ef':62807, '23f0':4949, '23f1':4950, '23f2':4951, '23f3':4947, '23f8':62815, '23f9':62816, '23fa':62817, '24c2':62890, '25aa':62938, '25ab':62939, '25b6':62804, '25c0':62808, '25fb':62935, '25fc':62934, '25fd':62937, '25fe':62936, '260e':61184, '261d':1350, '262a':62784, '262e':62785, '262f':62781, '263a':120, '264a':62790, '264b':62791, '264c':62792, '264d':62793, '264e':62794, '264f':62795, '265f':51099, '267b':62844, '267e':62833, '267f':62732, '269b':62777, '269c':62845, '26a0':62742, '26a1':41016, '26a7':62827, '26aa':62924, '26ab':62923, '26b0':61359, '26b1':61361, '26bd':51051, '26be':51052, '26c4':41019, '26c5':4999, '26c8':41000, '26ce':62800, '26cf':61296, '26d1':61150, '26d3':61314, '26d4':62744, '26e9':4853, '26ea':4849, '26f0':4814, '26f1':41015, '26f2':4855, '26f3':51070, '26f4':4928, '26f5':4924, '26f7':1599, '26f8':51071, '26f9-200d-2640':1615, '26f9-200d-2642':1614, '26f9':1613, '26fa':4856, '26fd':4915, '270a':1354, '270b':1330, '270c':1339, '270d':1365, '270f':61258, '271d':62782, '274c':62853, '274e':62854, '2764-200d-1f525':1139, '2764-200d-1fa79':1140, '27a1':62757, '27b0':62855, '27bf':62856, '2b05':62761, '2b06':62755, '2b07':62759, '2b1b':62932, '2b1c':62933, '2b50':4994, '2b55':62849, '303d':62857, '1f385-1f3fb':0, '1f385-1f3fc':0, '1f385-1f3fd':0, '1f385-1f3fe':0, '1f385-1f3ff':0, '1f3c2-1f3fb':0, '1f3c2-1f3fc':0, '1f3c2-1f3fd':0, '1f3c2-1f3fe':0, '1f3c2-1f3ff':0, '1f3c3-1f3fb-200d-2640':0, '1f3c3-1f3fc-200d-2640':0, '1f3c3-1f3fd-200d-2640':0, '1f3c3-1f3fe-200d-2640':0, '1f3c3-1f3ff-200d-2640':0, '1f3c3-1f3fb-200d-2642':0, '1f3c3-1f3fc-200d-2642':0, '1f3c3-1f3fd-200d-2642':0, '1f3c3-1f3fe-200d-2642':0, '1f3c3-1f3ff-200d-2642':0, '1f3c3-1f3fb':0, '1f3c3-1f3fc':0, '1f3c3-1f3fd':0, '1f3c3-1f3fe':0, '1f3c3-1f3ff':0, '1f3c4-1f3fb-200d-2640':0, '1f3c4-1f3fc-200d-2640':0, '1f3c4-1f3fd-200d-2640':0, '1f3c4-1f3fe-200d-2640':0, '1f3c4-1f3ff-200d-2640':0, '1f3c4-1f3fb-200d-2642':0, '1f3c4-1f3fc-200d-2642':0, '1f3c4-1f3fd-200d-2642':0, '1f3c4-1f3fe-200d-2642':0, '1f3c4-1f3ff-200d-2642':0, '1f3c4-1f3fb':0, '1f3c4-1f3fc':0, '1f3c4-1f3fd':0, '1f3c4-1f3fe':0, '1f3c4-1f3ff':0, '1f3c7-1f3fb':0, '1f3c7-1f3fc':0, '1f3c7-1f3fd':0, '1f3c7-1f3fe':0, '1f3c7-1f3ff':0, '1f3ca-1f3fb-200d-2640':0, '1f3ca-1f3fc-200d-2640':0, '1f3ca-1f3fd-200d-2640':0, '1f3ca-1f3fe-200d-2640':0, '1f3ca-1f3ff-200d-2640':0, '1f3ca-1f3fb-200d-2642':0, '1f3ca-1f3fc-200d-2642':0, '1f3ca-1f3fd-200d-2642':0, '1f3ca-1f3fe-200d-2642':0, '1f3ca-1f3ff-200d-2642':0, '1f3ca-1f3fb':0, '1f3ca-1f3fc':0, '1f3ca-1f3fd':0, '1f3ca-1f3fe':0, '1f3ca-1f3ff':0, '1f3cb-1f3fb-200d-2640':0, '1f3cb-1f3fc-200d-2640':0, '1f3cb-1f3fd-200d-2640':0, '1f3cb-1f3fe-200d-2640':0, '1f3cb-1f3ff-200d-2640':0, '1f3cb-1f3fb-200d-2642':0, '1f3cb-1f3fc-200d-2642':0, '1f3cb-1f3fd-200d-2642':0, '1f3cb-1f3fe-200d-2642':0, '1f3cb-1f3ff-200d-2642':0, '1f3cb-1f3fb':0, '1f3cb-1f3fc':0, '1f3cb-1f3fd':0, '1f3cb-1f3fe':0, '1f3cb-1f3ff':0, '1f3cc-1f3fb-200d-2640':0, '1f3cc-1f3fc-200d-2640':0, '1f3cc-1f3fd-200d-2640':0, '1f3cc-1f3fe-200d-2640':0, '1f3cc-1f3ff-200d-2640':0, '1f3cc-1f3fb-200d-2642':0, '1f3cc-1f3fc-200d-2642':0, '1f3cc-1f3fd-200d-2642':0, '1f3cc-1f3fe-200d-2642':0, '1f3cc-1f3ff-200d-2642':0, '1f3cc-1f3fb':0, '1f3cc-1f3fc':0, '1f3cc-1f3fd':0, '1f3cc-1f3fe':0, '1f3cc-1f3ff':0, '1f442-1f3fb':0, '1f442-1f3fc':0, '1f442-1f3fd':0, '1f442-1f3fe':0, '1f442-1f3ff':0, '1f443-1f3fb':0, '1f443-1f3fc':0, '1f443-1f3fd':0, '1f443-1f3fe':0, '1f443-1f3ff':0, '1f446-1f3fb':0, '1f446-1f3fc':0, '1f446-1f3fd':0, '1f446-1f3fe':0, '1f446-1f3ff':0, '1f447-1f3fb':0, '1f447-1f3fc':0, '1f447-1f3fd':0, '1f447-1f3fe':0, '1f447-1f3ff':0, '1f448-1f3fb':0, '1f448-1f3fc':0, '1f448-1f3fd':0, '1f448-1f3fe':0, '1f448-1f3ff':0, '1f449-1f3fb':0, '1f449-1f3fc':0, '1f449-1f3fd':0, '1f449-1f3fe':0, '1f449-1f3ff':0, '1f44a-1f3fb':0, '1f44a-1f3fc':0, '1f44a-1f3fd':0, '1f44a-1f3fe':0, '1f44a-1f3ff':0, '1f44b-1f3fb':0, '1f44b-1f3fc':0, '1f44b-1f3fd':0, '1f44b-1f3fe':0, '1f44b-1f3ff':0, '1f44c-1f3fb':0, '1f44c-1f3fc':0, '1f44c-1f3fd':0, '1f44c-1f3fe':0, '1f44c-1f3ff':0, '1f44d-1f3fb':0, '1f44d-1f3fc':0, '1f44d-1f3fd':0, '1f44d-1f3fe':0, '1f44d-1f3ff':0, '1f44e-1f3fb':0, '1f44e-1f3fc':0, '1f44e-1f3fd':0, '1f44e-1f3fe':0, '1f44e-1f3ff':0, '1f44f-1f3fb':0, '1f44f-1f3fc':0, '1f44f-1f3fd':0, '1f44f-1f3fe':0, '1f44f-1f3ff':0, '1f450-1f3fb':0, '1f450-1f3fc':0, '1f450-1f3fd':0, '1f450-1f3fe':0, '1f450-1f3ff':0, '1f466-1f3fb':0, '1f466-1f3fc':0, '1f466-1f3fd':0, '1f466-1f3fe':0, '1f466-1f3ff':0, '1f467-1f3fb':0, '1f467-1f3fc':0, '1f467-1f3fd':0, '1f467-1f3fe':0, '1f467-1f3ff':0, '1f468-1f3fb-200d-1f33e':0, '1f468-1f3fc-200d-1f33e':0, '1f468-1f3fd-200d-1f33e':0, '1f468-1f3fe-200d-1f33e':0, '1f468-1f3ff-200d-1f33e':0, '1f468-1f3fb-200d-1f373':0, '1f468-1f3fc-200d-1f373':0, '1f468-1f3fd-200d-1f373':0, '1f468-1f3fe-200d-1f373':0, '1f468-1f3ff-200d-1f373':0, '1f468-1f3fb-200d-1f37c':0, '1f468-1f3fc-200d-1f37c':0, '1f468-1f3fd-200d-1f37c':0, '1f468-1f3fe-200d-1f37c':0, '1f468-1f3ff-200d-1f37c':0, '1f468-1f3fb-200d-1f393':0, '1f468-1f3fc-200d-1f393':0, '1f468-1f3fd-200d-1f393':0, '1f468-1f3fe-200d-1f393':0, '1f468-1f3ff-200d-1f393':0, '1f468-1f3fb-200d-1f3a4':0, '1f468-1f3fc-200d-1f3a4':0, '1f468-1f3fd-200d-1f3a4':0, '1f468-1f3fe-200d-1f3a4':0, '1f468-1f3ff-200d-1f3a4':0, '1f468-1f3fb-200d-1f3a8':0, '1f468-1f3fc-200d-1f3a8':0, '1f468-1f3fd-200d-1f3a8':0, '1f468-1f3fe-200d-1f3a8':0, '1f468-1f3ff-200d-1f3a8':0, '1f468-1f3fb-200d-1f3eb':0, '1f468-1f3fc-200d-1f3eb':0, '1f468-1f3fd-200d-1f3eb':0, '1f468-1f3fe-200d-1f3eb':0, '1f468-1f3ff-200d-1f3eb':0, '1f468-1f3fb-200d-1f3ed':0, '1f468-1f3fc-200d-1f3ed':0, '1f468-1f3fd-200d-1f3ed':0, '1f468-1f3fe-200d-1f3ed':0, '1f468-1f3ff-200d-1f3ed':0, '1f468-1f3fb-200d-1f4bb':0, '1f468-1f3fc-200d-1f4bb':0, '1f468-1f3fd-200d-1f4bb':0, '1f468-1f3fe-200d-1f4bb':0, '1f468-1f3ff-200d-1f4bb':0, '1f468-1f3fb-200d-1f4bc':0, '1f468-1f3fc-200d-1f4bc':0, '1f468-1f3fd-200d-1f4bc':0, '1f468-1f3fe-200d-1f4bc':0, '1f468-1f3ff-200d-1f4bc':0, '1f468-1f3fb-200d-1f527':0, '1f468-1f3fc-200d-1f527':0, '1f468-1f3fd-200d-1f527':0, '1f468-1f3fe-200d-1f527':0, '1f468-1f3ff-200d-1f527':0, '1f468-1f3fb-200d-1f52c':0, '1f468-1f3fc-200d-1f52c':0, '1f468-1f3fd-200d-1f52c':0, '1f468-1f3fe-200d-1f52c':0, '1f468-1f3ff-200d-1f52c':0, '1f468-1f3fb-200d-1f680':0, '1f468-1f3fc-200d-1f680':0, '1f468-1f3fd-200d-1f680':0, '1f468-1f3fe-200d-1f680':0, '1f468-1f3ff-200d-1f680':0, '1f468-1f3fb-200d-1f692':0, '1f468-1f3fc-200d-1f692':0, '1f468-1f3fd-200d-1f692':0, '1f468-1f3fe-200d-1f692':0, '1f468-1f3ff-200d-1f692':0, '1f468-1f3fb-200d-1f9af':0, '1f468-1f3fc-200d-1f9af':0, '1f468-1f3fd-200d-1f9af':0, '1f468-1f3fe-200d-1f9af':0, '1f468-1f3ff-200d-1f9af':0, '1f468-1f3fb-200d-1f9b0':0, '1f468-1f3fc-200d-1f9b0':0, '1f468-1f3fd-200d-1f9b0':0, '1f468-1f3fe-200d-1f9b0':0, '1f468-1f3ff-200d-1f9b0':0, '1f468-1f3fb-200d-1f9b1':0, '1f468-1f3fc-200d-1f9b1':0, '1f468-1f3fd-200d-1f9b1':0, '1f468-1f3fe-200d-1f9b1':0, '1f468-1f3ff-200d-1f9b1':0, '1f468-1f3fb-200d-1f9b2':0, '1f468-1f3fc-200d-1f9b2':0, '1f468-1f3fd-200d-1f9b2':0, '1f468-1f3fe-200d-1f9b2':0, '1f468-1f3ff-200d-1f9b2':0, '1f468-1f3fb-200d-1f9b3':0, '1f468-1f3fc-200d-1f9b3':0, '1f468-1f3fd-200d-1f9b3':0, '1f468-1f3fe-200d-1f9b3':0, '1f468-1f3ff-200d-1f9b3':0, '1f468-1f3fb-200d-1f9bc':0, '1f468-1f3fc-200d-1f9bc':0, '1f468-1f3fd-200d-1f9bc':0, '1f468-1f3fe-200d-1f9bc':0, '1f468-1f3ff-200d-1f9bc':0, '1f468-1f3fb-200d-1f9bd':0, '1f468-1f3fc-200d-1f9bd':0, '1f468-1f3fd-200d-1f9bd':0, '1f468-1f3fe-200d-1f9bd':0, '1f468-1f3ff-200d-1f9bd':0, '1f468-1f3fb-200d-2695':0, '1f468-1f3fc-200d-2695':0, '1f468-1f3fd-200d-2695':0, '1f468-1f3fe-200d-2695':0, '1f468-1f3ff-200d-2695':0, '1f468-1f3fb-200d-2696':0, '1f468-1f3fc-200d-2696':0, '1f468-1f3fd-200d-2696':0, '1f468-1f3fe-200d-2696':0, '1f468-1f3ff-200d-2696':0, '1f468-1f3fb-200d-2708':0, '1f468-1f3fc-200d-2708':0, '1f468-1f3fd-200d-2708':0, '1f468-1f3fe-200d-2708':0, '1f468-1f3ff-200d-2708':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f468-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f468-1f3fb':0, '1f468-1f3fc':0, '1f468-1f3fd':0, '1f468-1f3fe':0, '1f468-1f3ff':0, '1f469-1f3fb-200d-1f33e':0, '1f469-1f3fc-200d-1f33e':0, '1f469-1f3fd-200d-1f33e':0, '1f469-1f3fe-200d-1f33e':0, '1f469-1f3ff-200d-1f33e':0, '1f469-1f3fb-200d-1f373':0, '1f469-1f3fc-200d-1f373':0, '1f469-1f3fd-200d-1f373':0, '1f469-1f3fe-200d-1f373':0, '1f469-1f3ff-200d-1f373':0, '1f469-1f3fb-200d-1f37c':0, '1f469-1f3fc-200d-1f37c':0, '1f469-1f3fd-200d-1f37c':0, '1f469-1f3fe-200d-1f37c':0, '1f469-1f3ff-200d-1f37c':0, '1f469-1f3fb-200d-1f393':0, '1f469-1f3fc-200d-1f393':0, '1f469-1f3fd-200d-1f393':0, '1f469-1f3fe-200d-1f393':0, '1f469-1f3ff-200d-1f393':0, '1f469-1f3fb-200d-1f3a4':0, '1f469-1f3fc-200d-1f3a4':0, '1f469-1f3fd-200d-1f3a4':0, '1f469-1f3fe-200d-1f3a4':0, '1f469-1f3ff-200d-1f3a4':0, '1f469-1f3fb-200d-1f3a8':0, '1f469-1f3fc-200d-1f3a8':0, '1f469-1f3fd-200d-1f3a8':0, '1f469-1f3fe-200d-1f3a8':0, '1f469-1f3ff-200d-1f3a8':0, '1f469-1f3fb-200d-1f3eb':0, '1f469-1f3fc-200d-1f3eb':0, '1f469-1f3fd-200d-1f3eb':0, '1f469-1f3fe-200d-1f3eb':0, '1f469-1f3ff-200d-1f3eb':0, '1f469-1f3fb-200d-1f3ed':0, '1f469-1f3fc-200d-1f3ed':0, '1f469-1f3fd-200d-1f3ed':0, '1f469-1f3fe-200d-1f3ed':0, '1f469-1f3ff-200d-1f3ed':0, '1f469-1f3fb-200d-1f4bb':0, '1f469-1f3fc-200d-1f4bb':0, '1f469-1f3fd-200d-1f4bb':0, '1f469-1f3fe-200d-1f4bb':0, '1f469-1f3ff-200d-1f4bb':0, '1f469-1f3fb-200d-1f4bc':0, '1f469-1f3fc-200d-1f4bc':0, '1f469-1f3fd-200d-1f4bc':0, '1f469-1f3fe-200d-1f4bc':0, '1f469-1f3ff-200d-1f4bc':0, '1f469-1f3fb-200d-1f527':0, '1f469-1f3fc-200d-1f527':0, '1f469-1f3fd-200d-1f527':0, '1f469-1f3fe-200d-1f527':0, '1f469-1f3ff-200d-1f527':0, '1f469-1f3fb-200d-1f52c':0, '1f469-1f3fc-200d-1f52c':0, '1f469-1f3fd-200d-1f52c':0, '1f469-1f3fe-200d-1f52c':0, '1f469-1f3ff-200d-1f52c':0, '1f469-1f3fb-200d-1f680':0, '1f469-1f3fc-200d-1f680':0, '1f469-1f3fd-200d-1f680':0, '1f469-1f3fe-200d-1f680':0, '1f469-1f3ff-200d-1f680':0, '1f469-1f3fb-200d-1f692':0, '1f469-1f3fc-200d-1f692':0, '1f469-1f3fd-200d-1f692':0, '1f469-1f3fe-200d-1f692':0, '1f469-1f3ff-200d-1f692':0, '1f469-1f3fb-200d-1f9af':0, '1f469-1f3fc-200d-1f9af':0, '1f469-1f3fd-200d-1f9af':0, '1f469-1f3fe-200d-1f9af':0, '1f469-1f3ff-200d-1f9af':0, '1f469-1f3fb-200d-1f9b0':0, '1f469-1f3fc-200d-1f9b0':0, '1f469-1f3fd-200d-1f9b0':0, '1f469-1f3fe-200d-1f9b0':0, '1f469-1f3ff-200d-1f9b0':0, '1f469-1f3fb-200d-1f9b1':0, '1f469-1f3fc-200d-1f9b1':0, '1f469-1f3fd-200d-1f9b1':0, '1f469-1f3fe-200d-1f9b1':0, '1f469-1f3ff-200d-1f9b1':0, '1f469-1f3fb-200d-1f9b2':0, '1f469-1f3fc-200d-1f9b2':0, '1f469-1f3fd-200d-1f9b2':0, '1f469-1f3fe-200d-1f9b2':0, '1f469-1f3ff-200d-1f9b2':0, '1f469-1f3fb-200d-1f9b3':0, '1f469-1f3fc-200d-1f9b3':0, '1f469-1f3fd-200d-1f9b3':0, '1f469-1f3fe-200d-1f9b3':0, '1f469-1f3ff-200d-1f9b3':0, '1f469-1f3fb-200d-1f9bc':0, '1f469-1f3fc-200d-1f9bc':0, '1f469-1f3fd-200d-1f9bc':0, '1f469-1f3fe-200d-1f9bc':0, '1f469-1f3ff-200d-1f9bc':0, '1f469-1f3fb-200d-1f9bd':0, '1f469-1f3fc-200d-1f9bd':0, '1f469-1f3fd-200d-1f9bd':0, '1f469-1f3fe-200d-1f9bd':0, '1f469-1f3ff-200d-1f9bd':0, '1f469-1f3fb-200d-2695':0, '1f469-1f3fc-200d-2695':0, '1f469-1f3fd-200d-2695':0, '1f469-1f3fe-200d-2695':0, '1f469-1f3ff-200d-2695':0, '1f469-1f3fb-200d-2696':0, '1f469-1f3fc-200d-2696':0, '1f469-1f3fd-200d-2696':0, '1f469-1f3fe-200d-2696':0, '1f469-1f3ff-200d-2696':0, '1f469-1f3fb-200d-2708':0, '1f469-1f3fc-200d-2708':0, '1f469-1f3fd-200d-2708':0, '1f469-1f3fe-200d-2708':0, '1f469-1f3ff-200d-2708':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f469-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f468-1f3ff':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3fe-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3fe':0, '1f469-1f3ff-200d-2764-200d-1f48b-200d-1f469-1f3ff':0, '1f469-1f3fb':0, '1f469-1f3fc':0, '1f469-1f3fd':0, '1f469-1f3fe':0, '1f469-1f3ff':0, '1f46b-1f3fb':0, '1f46b-1f3fc':0, '1f46b-1f3fd':0, '1f46b-1f3fe':0, '1f46b-1f3ff':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe':0, '1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd':0, '1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe':0, '1f46c-1f3fb':0, '1f46c-1f3fc':0, '1f46c-1f3fd':0, '1f46c-1f3fe':0, '1f46c-1f3ff':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe':0, '1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd':0, '1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe':0, '1f46d-1f3fb':0, '1f46d-1f3fc':0, '1f46d-1f3fd':0, '1f46d-1f3fe':0, '1f46d-1f3ff':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe':0, '1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd':0, '1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe':0, '1f46e-1f3fb-200d-2640':0, '1f46e-1f3fc-200d-2640':0, '1f46e-1f3fd-200d-2640':0, '1f46e-1f3fe-200d-2640':0, '1f46e-1f3ff-200d-2640':0, '1f46e-1f3fb-200d-2642':0, '1f46e-1f3fc-200d-2642':0, '1f46e-1f3fd-200d-2642':0, '1f46e-1f3fe-200d-2642':0, '1f46e-1f3ff-200d-2642':0, '1f46e-1f3fb':0, '1f46e-1f3fc':0, '1f46e-1f3fd':0, '1f46e-1f3fe':0, '1f46e-1f3ff':0, '1f470-1f3fb-200d-2640':0, '1f470-1f3fc-200d-2640':0, '1f470-1f3fd-200d-2640':0, '1f470-1f3fe-200d-2640':0, '1f470-1f3ff-200d-2640':0, '1f470-1f3fb-200d-2642':0, '1f470-1f3fc-200d-2642':0, '1f470-1f3fd-200d-2642':0, '1f470-1f3fe-200d-2642':0, '1f470-1f3ff-200d-2642':0, '1f470-1f3fb':0, '1f470-1f3fc':0, '1f470-1f3fd':0, '1f470-1f3fe':0, '1f470-1f3ff':0, '1f471-1f3fb-200d-2640':0, '1f471-1f3fc-200d-2640':0, '1f471-1f3fd-200d-2640':0, '1f471-1f3fe-200d-2640':0, '1f471-1f3ff-200d-2640':0, '1f471-1f3fb-200d-2642':0, '1f471-1f3fc-200d-2642':0, '1f471-1f3fd-200d-2642':0, '1f471-1f3fe-200d-2642':0, '1f471-1f3ff-200d-2642':0, '1f471-1f3fb':0, '1f471-1f3fc':0, '1f471-1f3fd':0, '1f471-1f3fe':0, '1f471-1f3ff':0, '1f472-1f3fb':0, '1f472-1f3fc':0, '1f472-1f3fd':0, '1f472-1f3fe':0, '1f472-1f3ff':0, '1f473-1f3fb-200d-2640':0, '1f473-1f3fc-200d-2640':0, '1f473-1f3fd-200d-2640':0, '1f473-1f3fe-200d-2640':0, '1f473-1f3ff-200d-2640':0, '1f473-1f3fb-200d-2642':0, '1f473-1f3fc-200d-2642':0, '1f473-1f3fd-200d-2642':0, '1f473-1f3fe-200d-2642':0, '1f473-1f3ff-200d-2642':0, '1f473-1f3fb':0, '1f473-1f3fc':0, '1f473-1f3fd':0, '1f473-1f3fe':0, '1f473-1f3ff':0, '1f474-1f3fb':0, '1f474-1f3fc':0, '1f474-1f3fd':0, '1f474-1f3fe':0, '1f474-1f3ff':0, '1f475-1f3fb':0, '1f475-1f3fc':0, '1f475-1f3fd':0, '1f475-1f3fe':0, '1f475-1f3ff':0, '1f476-1f3fb':0, '1f476-1f3fc':0, '1f476-1f3fd':0, '1f476-1f3fe':0, '1f476-1f3ff':0, '1f477-1f3fb-200d-2640':0, '1f477-1f3fc-200d-2640':0, '1f477-1f3fd-200d-2640':0, '1f477-1f3fe-200d-2640':0, '1f477-1f3ff-200d-2640':0, '1f477-1f3fb-200d-2642':0, '1f477-1f3fc-200d-2642':0, '1f477-1f3fd-200d-2642':0, '1f477-1f3fe-200d-2642':0, '1f477-1f3ff-200d-2642':0, '1f477-1f3fb':0, '1f477-1f3fc':0, '1f477-1f3fd':0, '1f477-1f3fe':0, '1f477-1f3ff':0, '1f478-1f3fb':0, '1f478-1f3fc':0, '1f478-1f3fd':0, '1f478-1f3fe':0, '1f478-1f3ff':0, '1f47c-1f3fb':0, '1f47c-1f3fc':0, '1f47c-1f3fd':0, '1f47c-1f3fe':0, '1f47c-1f3ff':0, '1f481-1f3fb-200d-2640':0, '1f481-1f3fc-200d-2640':0, '1f481-1f3fd-200d-2640':0, '1f481-1f3fe-200d-2640':0, '1f481-1f3ff-200d-2640':0, '1f481-1f3fb-200d-2642':0, '1f481-1f3fc-200d-2642':0, '1f481-1f3fd-200d-2642':0, '1f481-1f3fe-200d-2642':0, '1f481-1f3ff-200d-2642':0, '1f481-1f3fb':0, '1f481-1f3fc':0, '1f481-1f3fd':0, '1f481-1f3fe':0, '1f481-1f3ff':0, '1f482-1f3fb-200d-2640':0, '1f482-1f3fc-200d-2640':0, '1f482-1f3fd-200d-2640':0, '1f482-1f3fe-200d-2640':0, '1f482-1f3ff-200d-2640':0, '1f482-1f3fb-200d-2642':0, '1f482-1f3fc-200d-2642':0, '1f482-1f3fd-200d-2642':0, '1f482-1f3fe-200d-2642':0, '1f482-1f3ff-200d-2642':0, '1f482-1f3fb':0, '1f482-1f3fc':0, '1f482-1f3fd':0, '1f482-1f3fe':0, '1f482-1f3ff':0, '1f483-1f3fb':0, '1f483-1f3fc':0, '1f483-1f3fd':0, '1f483-1f3fe':0, '1f483-1f3ff':0, '1f485-1f3fb':0, '1f485-1f3fc':0, '1f485-1f3fd':0, '1f485-1f3fe':0, '1f485-1f3ff':0, '1f486-1f3fb-200d-2640':0, '1f486-1f3fc-200d-2640':0, '1f486-1f3fd-200d-2640':0, '1f486-1f3fe-200d-2640':0, '1f486-1f3ff-200d-2640':0, '1f486-1f3fb-200d-2642':0, '1f486-1f3fc-200d-2642':0, '1f486-1f3fd-200d-2642':0, '1f486-1f3fe-200d-2642':0, '1f486-1f3ff-200d-2642':0, '1f486-1f3fb':0, '1f486-1f3fc':0, '1f486-1f3fd':0, '1f486-1f3fe':0, '1f486-1f3ff':0, '1f487-1f3fb-200d-2640':0, '1f487-1f3fc-200d-2640':0, '1f487-1f3fd-200d-2640':0, '1f487-1f3fe-200d-2640':0, '1f487-1f3ff-200d-2640':0, '1f487-1f3fb-200d-2642':0, '1f487-1f3fc-200d-2642':0, '1f487-1f3fd-200d-2642':0, '1f487-1f3fe-200d-2642':0, '1f487-1f3ff-200d-2642':0, '1f487-1f3fb':0, '1f487-1f3fc':0, '1f487-1f3fd':0, '1f487-1f3fe':0, '1f487-1f3ff':0, '1f48f-1f3fb':0, '1f48f-1f3fc':0, '1f48f-1f3fd':0, '1f48f-1f3fe':0, '1f48f-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f48b-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f48b-200d-1f9d1-1f3fe':0, '1f491-1f3fb':0, '1f491-1f3fc':0, '1f491-1f3fd':0, '1f491-1f3fe':0, '1f491-1f3ff':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-2764-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-2764-200d-1f9d1-1f3fe':0, '1f4aa-1f3fb':0, '1f4aa-1f3fc':0, '1f4aa-1f3fd':0, '1f4aa-1f3fe':0, '1f4aa-1f3ff':0, '1f574-1f3fb':0, '1f574-1f3fc':0, '1f574-1f3fd':0, '1f574-1f3fe':0, '1f574-1f3ff':0, '1f575-1f3fb-200d-2640':0, '1f575-1f3fc-200d-2640':0, '1f575-1f3fd-200d-2640':0, '1f575-1f3fe-200d-2640':0, '1f575-1f3ff-200d-2640':0, '1f575-1f3fb-200d-2642':0, '1f575-1f3fc-200d-2642':0, '1f575-1f3fd-200d-2642':0, '1f575-1f3fe-200d-2642':0, '1f575-1f3ff-200d-2642':0, '1f575-1f3fb':0, '1f575-1f3fc':0, '1f575-1f3fd':0, '1f575-1f3fe':0, '1f575-1f3ff':0, '1f57a-1f3fb':0, '1f57a-1f3fc':0, '1f57a-1f3fd':0, '1f57a-1f3fe':0, '1f57a-1f3ff':0, '1f590-1f3fb':0, '1f590-1f3fc':0, '1f590-1f3fd':0, '1f590-1f3fe':0, '1f590-1f3ff':0, '1f595-1f3fb':0, '1f595-1f3fc':0, '1f595-1f3fd':0, '1f595-1f3fe':0, '1f595-1f3ff':0, '1f596-1f3fb':0, '1f596-1f3fc':0, '1f596-1f3fd':0, '1f596-1f3fe':0, '1f596-1f3ff':0, '1f645-1f3fb-200d-2640':0, '1f645-1f3fc-200d-2640':0, '1f645-1f3fd-200d-2640':0, '1f645-1f3fe-200d-2640':0, '1f645-1f3ff-200d-2640':0, '1f645-1f3fb-200d-2642':0, '1f645-1f3fc-200d-2642':0, '1f645-1f3fd-200d-2642':0, '1f645-1f3fe-200d-2642':0, '1f645-1f3ff-200d-2642':0, '1f645-1f3fb':0, '1f645-1f3fc':0, '1f645-1f3fd':0, '1f645-1f3fe':0, '1f645-1f3ff':0, '1f646-1f3fb-200d-2640':0, '1f646-1f3fc-200d-2640':0, '1f646-1f3fd-200d-2640':0, '1f646-1f3fe-200d-2640':0, '1f646-1f3ff-200d-2640':0, '1f646-1f3fb-200d-2642':0, '1f646-1f3fc-200d-2642':0, '1f646-1f3fd-200d-2642':0, '1f646-1f3fe-200d-2642':0, '1f646-1f3ff-200d-2642':0, '1f646-1f3fb':0, '1f646-1f3fc':0, '1f646-1f3fd':0, '1f646-1f3fe':0, '1f646-1f3ff':0, '1f647-1f3fb-200d-2640':0, '1f647-1f3fc-200d-2640':0, '1f647-1f3fd-200d-2640':0, '1f647-1f3fe-200d-2640':0, '1f647-1f3ff-200d-2640':0, '1f647-1f3fb-200d-2642':0, '1f647-1f3fc-200d-2642':0, '1f647-1f3fd-200d-2642':0, '1f647-1f3fe-200d-2642':0, '1f647-1f3ff-200d-2642':0, '1f647-1f3fb':0, '1f647-1f3fc':0, '1f647-1f3fd':0, '1f647-1f3fe':0, '1f647-1f3ff':0, '1f64b-1f3fb-200d-2640':0, '1f64b-1f3fc-200d-2640':0, '1f64b-1f3fd-200d-2640':0, '1f64b-1f3fe-200d-2640':0, '1f64b-1f3ff-200d-2640':0, '1f64b-1f3fb-200d-2642':0, '1f64b-1f3fc-200d-2642':0, '1f64b-1f3fd-200d-2642':0, '1f64b-1f3fe-200d-2642':0, '1f64b-1f3ff-200d-2642':0, '1f64b-1f3fb':0, '1f64b-1f3fc':0, '1f64b-1f3fd':0, '1f64b-1f3fe':0, '1f64b-1f3ff':0, '1f64c-1f3fb':0, '1f64c-1f3fc':0, '1f64c-1f3fd':0, '1f64c-1f3fe':0, '1f64c-1f3ff':0, '1f64d-1f3fb-200d-2640':0, '1f64d-1f3fc-200d-2640':0, '1f64d-1f3fd-200d-2640':0, '1f64d-1f3fe-200d-2640':0, '1f64d-1f3ff-200d-2640':0, '1f64d-1f3fb-200d-2642':0, '1f64d-1f3fc-200d-2642':0, '1f64d-1f3fd-200d-2642':0, '1f64d-1f3fe-200d-2642':0, '1f64d-1f3ff-200d-2642':0, '1f64d-1f3fb':0, '1f64d-1f3fc':0, '1f64d-1f3fd':0, '1f64d-1f3fe':0, '1f64d-1f3ff':0, '1f64e-1f3fb-200d-2640':0, '1f64e-1f3fc-200d-2640':0, '1f64e-1f3fd-200d-2640':0, '1f64e-1f3fe-200d-2640':0, '1f64e-1f3ff-200d-2640':0, '1f64e-1f3fb-200d-2642':0, '1f64e-1f3fc-200d-2642':0, '1f64e-1f3fd-200d-2642':0, '1f64e-1f3fe-200d-2642':0, '1f64e-1f3ff-200d-2642':0, '1f64e-1f3fb':0, '1f64e-1f3fc':0, '1f64e-1f3fd':0, '1f64e-1f3fe':0, '1f64e-1f3ff':0, '1f64f-1f3fb':0, '1f64f-1f3fc':0, '1f64f-1f3fd':0, '1f64f-1f3fe':0, '1f64f-1f3ff':0, '1f6a3-1f3fb-200d-2640':0, '1f6a3-1f3fc-200d-2640':0, '1f6a3-1f3fd-200d-2640':0, '1f6a3-1f3fe-200d-2640':0, '1f6a3-1f3ff-200d-2640':0, '1f6a3-1f3fb-200d-2642':0, '1f6a3-1f3fc-200d-2642':0, '1f6a3-1f3fd-200d-2642':0, '1f6a3-1f3fe-200d-2642':0, '1f6a3-1f3ff-200d-2642':0, '1f6a3-1f3fb':0, '1f6a3-1f3fc':0, '1f6a3-1f3fd':0, '1f6a3-1f3fe':0, '1f6a3-1f3ff':0, '1f6b4-1f3fb-200d-2640':0, '1f6b4-1f3fc-200d-2640':0, '1f6b4-1f3fd-200d-2640':0, '1f6b4-1f3fe-200d-2640':0, '1f6b4-1f3ff-200d-2640':0, '1f6b4-1f3fb-200d-2642':0, '1f6b4-1f3fc-200d-2642':0, '1f6b4-1f3fd-200d-2642':0, '1f6b4-1f3fe-200d-2642':0, '1f6b4-1f3ff-200d-2642':0, '1f6b4-1f3fb':0, '1f6b4-1f3fc':0, '1f6b4-1f3fd':0, '1f6b4-1f3fe':0, '1f6b4-1f3ff':0, '1f6b5-1f3fb-200d-2640':0, '1f6b5-1f3fc-200d-2640':0, '1f6b5-1f3fd-200d-2640':0, '1f6b5-1f3fe-200d-2640':0, '1f6b5-1f3ff-200d-2640':0, '1f6b5-1f3fb-200d-2642':0, '1f6b5-1f3fc-200d-2642':0, '1f6b5-1f3fd-200d-2642':0, '1f6b5-1f3fe-200d-2642':0, '1f6b5-1f3ff-200d-2642':0, '1f6b5-1f3fb':0, '1f6b5-1f3fc':0, '1f6b5-1f3fd':0, '1f6b5-1f3fe':0, '1f6b5-1f3ff':0, '1f6b6-1f3fb-200d-2640':0, '1f6b6-1f3fc-200d-2640':0, '1f6b6-1f3fd-200d-2640':0, '1f6b6-1f3fe-200d-2640':0, '1f6b6-1f3ff-200d-2640':0, '1f6b6-1f3fb-200d-2642':0, '1f6b6-1f3fc-200d-2642':0, '1f6b6-1f3fd-200d-2642':0, '1f6b6-1f3fe-200d-2642':0, '1f6b6-1f3ff-200d-2642':0, '1f6b6-1f3fb':0, '1f6b6-1f3fc':0, '1f6b6-1f3fd':0, '1f6b6-1f3fe':0, '1f6b6-1f3ff':0, '1f6c0-1f3fb':0, '1f6c0-1f3fc':0, '1f6c0-1f3fd':0, '1f6c0-1f3fe':0, '1f6c0-1f3ff':0, '1f6cc-1f3fb':0, '1f6cc-1f3fc':0, '1f6cc-1f3fd':0, '1f6cc-1f3fe':0, '1f6cc-1f3ff':0, '1f90c-1f3fb':0, '1f90c-1f3fc':0, '1f90c-1f3fd':0, '1f90c-1f3fe':0, '1f90c-1f3ff':0, '1f90f-1f3fb':0, '1f90f-1f3fc':0, '1f90f-1f3fd':0, '1f90f-1f3fe':0, '1f90f-1f3ff':0, '1f918-1f3fb':0, '1f918-1f3fc':0, '1f918-1f3fd':0, '1f918-1f3fe':0, '1f918-1f3ff':0, '1f919-1f3fb':0, '1f919-1f3fc':0, '1f919-1f3fd':0, '1f919-1f3fe':0, '1f919-1f3ff':0, '1f91a-1f3fb':0, '1f91a-1f3fc':0, '1f91a-1f3fd':0, '1f91a-1f3fe':0, '1f91a-1f3ff':0, '1f91b-1f3fb':0, '1f91b-1f3fc':0, '1f91b-1f3fd':0, '1f91b-1f3fe':0, '1f91b-1f3ff':0, '1f91c-1f3fb':0, '1f91c-1f3fc':0, '1f91c-1f3fd':0, '1f91c-1f3fe':0, '1f91c-1f3ff':0, '1f91d-1f3fb':0, '1f91d-1f3fc':0, '1f91d-1f3fd':0, '1f91d-1f3fe':0, '1f91d-1f3ff':0, '1f91e-1f3fb':0, '1f91e-1f3fc':0, '1f91e-1f3fd':0, '1f91e-1f3fe':0, '1f91e-1f3ff':0, '1f91f-1f3fb':0, '1f91f-1f3fc':0, '1f91f-1f3fd':0, '1f91f-1f3fe':0, '1f91f-1f3ff':0, '1f926-1f3fb-200d-2640':0, '1f926-1f3fc-200d-2640':0, '1f926-1f3fd-200d-2640':0, '1f926-1f3fe-200d-2640':0, '1f926-1f3ff-200d-2640':0, '1f926-1f3fb-200d-2642':0, '1f926-1f3fc-200d-2642':0, '1f926-1f3fd-200d-2642':0, '1f926-1f3fe-200d-2642':0, '1f926-1f3ff-200d-2642':0, '1f926-1f3fb':0, '1f926-1f3fc':0, '1f926-1f3fd':0, '1f926-1f3fe':0, '1f926-1f3ff':0, '1f930-1f3fb':0, '1f930-1f3fc':0, '1f930-1f3fd':0, '1f930-1f3fe':0, '1f930-1f3ff':0, '1f931-1f3fb':0, '1f931-1f3fc':0, '1f931-1f3fd':0, '1f931-1f3fe':0, '1f931-1f3ff':0, '1f932-1f3fb':0, '1f932-1f3fc':0, '1f932-1f3fd':0, '1f932-1f3fe':0, '1f932-1f3ff':0, '1f933-1f3fb':0, '1f933-1f3fc':0, '1f933-1f3fd':0, '1f933-1f3fe':0, '1f933-1f3ff':0, '1f934-1f3fb':0, '1f934-1f3fc':0, '1f934-1f3fd':0, '1f934-1f3fe':0, '1f934-1f3ff':0, '1f935-1f3fb-200d-2640':0, '1f935-1f3fc-200d-2640':0, '1f935-1f3fd-200d-2640':0, '1f935-1f3fe-200d-2640':0, '1f935-1f3ff-200d-2640':0, '1f935-1f3fb-200d-2642':0, '1f935-1f3fc-200d-2642':0, '1f935-1f3fd-200d-2642':0, '1f935-1f3fe-200d-2642':0, '1f935-1f3ff-200d-2642':0, '1f935-1f3fb':0, '1f935-1f3fc':0, '1f935-1f3fd':0, '1f935-1f3fe':0, '1f935-1f3ff':0, '1f936-1f3fb':0, '1f936-1f3fc':0, '1f936-1f3fd':0, '1f936-1f3fe':0, '1f936-1f3ff':0, '1f937-1f3fb-200d-2640':0, '1f937-1f3fc-200d-2640':0, '1f937-1f3fd-200d-2640':0, '1f937-1f3fe-200d-2640':0, '1f937-1f3ff-200d-2640':0, '1f937-1f3fb-200d-2642':0, '1f937-1f3fc-200d-2642':0, '1f937-1f3fd-200d-2642':0, '1f937-1f3fe-200d-2642':0, '1f937-1f3ff-200d-2642':0, '1f937-1f3fb':0, '1f937-1f3fc':0, '1f937-1f3fd':0, '1f937-1f3fe':0, '1f937-1f3ff':0, '1f938-1f3fb-200d-2640':0, '1f938-1f3fc-200d-2640':0, '1f938-1f3fd-200d-2640':0, '1f938-1f3fe-200d-2640':0, '1f938-1f3ff-200d-2640':0, '1f938-1f3fb-200d-2642':0, '1f938-1f3fc-200d-2642':0, '1f938-1f3fd-200d-2642':0, '1f938-1f3fe-200d-2642':0, '1f938-1f3ff-200d-2642':0, '1f938-1f3fb':0, '1f938-1f3fc':0, '1f938-1f3fd':0, '1f938-1f3fe':0, '1f938-1f3ff':0, '1f939-1f3fb-200d-2640':0, '1f939-1f3fc-200d-2640':0, '1f939-1f3fd-200d-2640':0, '1f939-1f3fe-200d-2640':0, '1f939-1f3ff-200d-2640':0, '1f939-1f3fb-200d-2642':0, '1f939-1f3fc-200d-2642':0, '1f939-1f3fd-200d-2642':0, '1f939-1f3fe-200d-2642':0, '1f939-1f3ff-200d-2642':0, '1f939-1f3fb':0, '1f939-1f3fc':0, '1f939-1f3fd':0, '1f939-1f3fe':0, '1f939-1f3ff':0, '1f93d-1f3fb-200d-2640':0, '1f93d-1f3fc-200d-2640':0, '1f93d-1f3fd-200d-2640':0, '1f93d-1f3fe-200d-2640':0, '1f93d-1f3ff-200d-2640':0, '1f93d-1f3fb-200d-2642':0, '1f93d-1f3fc-200d-2642':0, '1f93d-1f3fd-200d-2642':0, '1f93d-1f3fe-200d-2642':0, '1f93d-1f3ff-200d-2642':0, '1f93d-1f3fb':0, '1f93d-1f3fc':0, '1f93d-1f3fd':0, '1f93d-1f3fe':0, '1f93d-1f3ff':0, '1f93e-1f3fb-200d-2640':0, '1f93e-1f3fc-200d-2640':0, '1f93e-1f3fd-200d-2640':0, '1f93e-1f3fe-200d-2640':0, '1f93e-1f3ff-200d-2640':0, '1f93e-1f3fb-200d-2642':0, '1f93e-1f3fc-200d-2642':0, '1f93e-1f3fd-200d-2642':0, '1f93e-1f3fe-200d-2642':0, '1f93e-1f3ff-200d-2642':0, '1f93e-1f3fb':0, '1f93e-1f3fc':0, '1f93e-1f3fd':0, '1f93e-1f3fe':0, '1f93e-1f3ff':0, '1f977-1f3fb':0, '1f977-1f3fc':0, '1f977-1f3fd':0, '1f977-1f3fe':0, '1f977-1f3ff':0, '1f9b5-1f3fb':0, '1f9b5-1f3fc':0, '1f9b5-1f3fd':0, '1f9b5-1f3fe':0, '1f9b5-1f3ff':0, '1f9b6-1f3fb':0, '1f9b6-1f3fc':0, '1f9b6-1f3fd':0, '1f9b6-1f3fe':0, '1f9b6-1f3ff':0, '1f9b8-1f3fb-200d-2640':0, '1f9b8-1f3fc-200d-2640':0, '1f9b8-1f3fd-200d-2640':0, '1f9b8-1f3fe-200d-2640':0, '1f9b8-1f3ff-200d-2640':0, '1f9b8-1f3fb-200d-2642':0, '1f9b8-1f3fc-200d-2642':0, '1f9b8-1f3fd-200d-2642':0, '1f9b8-1f3fe-200d-2642':0, '1f9b8-1f3ff-200d-2642':0, '1f9b8-1f3fb':0, '1f9b8-1f3fc':0, '1f9b8-1f3fd':0, '1f9b8-1f3fe':0, '1f9b8-1f3ff':0, '1f9b9-1f3fb-200d-2640':0, '1f9b9-1f3fc-200d-2640':0, '1f9b9-1f3fd-200d-2640':0, '1f9b9-1f3fe-200d-2640':0, '1f9b9-1f3ff-200d-2640':0, '1f9b9-1f3fb-200d-2642':0, '1f9b9-1f3fc-200d-2642':0, '1f9b9-1f3fd-200d-2642':0, '1f9b9-1f3fe-200d-2642':0, '1f9b9-1f3ff-200d-2642':0, '1f9b9-1f3fb':0, '1f9b9-1f3fc':0, '1f9b9-1f3fd':0, '1f9b9-1f3fe':0, '1f9b9-1f3ff':0, '1f9bb-1f3fb':0, '1f9bb-1f3fc':0, '1f9bb-1f3fd':0, '1f9bb-1f3fe':0, '1f9bb-1f3ff':0, '1f9cd-1f3fb-200d-2640':0, '1f9cd-1f3fc-200d-2640':0, '1f9cd-1f3fd-200d-2640':0, '1f9cd-1f3fe-200d-2640':0, '1f9cd-1f3ff-200d-2640':0, '1f9cd-1f3fb-200d-2642':0, '1f9cd-1f3fc-200d-2642':0, '1f9cd-1f3fd-200d-2642':0, '1f9cd-1f3fe-200d-2642':0, '1f9cd-1f3ff-200d-2642':0, '1f9cd-1f3fb':0, '1f9cd-1f3fc':0, '1f9cd-1f3fd':0, '1f9cd-1f3fe':0, '1f9cd-1f3ff':0, '1f9ce-1f3fb-200d-2640':0, '1f9ce-1f3fc-200d-2640':0, '1f9ce-1f3fd-200d-2640':0, '1f9ce-1f3fe-200d-2640':0, '1f9ce-1f3ff-200d-2640':0, '1f9ce-1f3fb-200d-2642':0, '1f9ce-1f3fc-200d-2642':0, '1f9ce-1f3fd-200d-2642':0, '1f9ce-1f3fe-200d-2642':0, '1f9ce-1f3ff-200d-2642':0, '1f9ce-1f3fb':0, '1f9ce-1f3fc':0, '1f9ce-1f3fd':0, '1f9ce-1f3fe':0, '1f9ce-1f3ff':0, '1f9cf-1f3fb-200d-2640':0, '1f9cf-1f3fc-200d-2640':0, '1f9cf-1f3fd-200d-2640':0, '1f9cf-1f3fe-200d-2640':0, '1f9cf-1f3ff-200d-2640':0, '1f9cf-1f3fb-200d-2642':0, '1f9cf-1f3fc-200d-2642':0, '1f9cf-1f3fd-200d-2642':0, '1f9cf-1f3fe-200d-2642':0, '1f9cf-1f3ff-200d-2642':0, '1f9cf-1f3fb':0, '1f9cf-1f3fc':0, '1f9cf-1f3fd':0, '1f9cf-1f3fe':0, '1f9cf-1f3ff':0, '1f9d1-1f3fb-200d-1f33e':0, '1f9d1-1f3fc-200d-1f33e':0, '1f9d1-1f3fd-200d-1f33e':0, '1f9d1-1f3fe-200d-1f33e':0, '1f9d1-1f3ff-200d-1f33e':0, '1f9d1-1f3fb-200d-1f373':0, '1f9d1-1f3fc-200d-1f373':0, '1f9d1-1f3fd-200d-1f373':0, '1f9d1-1f3fe-200d-1f373':0, '1f9d1-1f3ff-200d-1f373':0, '1f9d1-1f3fb-200d-1f37c':0, '1f9d1-1f3fc-200d-1f37c':0, '1f9d1-1f3fd-200d-1f37c':0, '1f9d1-1f3fe-200d-1f37c':0, '1f9d1-1f3ff-200d-1f37c':0, '1f9d1-1f3fb-200d-1f384':0, '1f9d1-1f3fc-200d-1f384':0, '1f9d1-1f3fd-200d-1f384':0, '1f9d1-1f3fe-200d-1f384':0, '1f9d1-1f3ff-200d-1f384':0, '1f9d1-1f3fb-200d-1f393':0, '1f9d1-1f3fc-200d-1f393':0, '1f9d1-1f3fd-200d-1f393':0, '1f9d1-1f3fe-200d-1f393':0, '1f9d1-1f3ff-200d-1f393':0, '1f9d1-1f3fb-200d-1f3a4':0, '1f9d1-1f3fc-200d-1f3a4':0, '1f9d1-1f3fd-200d-1f3a4':0, '1f9d1-1f3fe-200d-1f3a4':0, '1f9d1-1f3ff-200d-1f3a4':0, '1f9d1-1f3fb-200d-1f3a8':0, '1f9d1-1f3fc-200d-1f3a8':0, '1f9d1-1f3fd-200d-1f3a8':0, '1f9d1-1f3fe-200d-1f3a8':0, '1f9d1-1f3ff-200d-1f3a8':0, '1f9d1-1f3fb-200d-1f3eb':0, '1f9d1-1f3fc-200d-1f3eb':0, '1f9d1-1f3fd-200d-1f3eb':0, '1f9d1-1f3fe-200d-1f3eb':0, '1f9d1-1f3ff-200d-1f3eb':0, '1f9d1-1f3fb-200d-1f3ed':0, '1f9d1-1f3fc-200d-1f3ed':0, '1f9d1-1f3fd-200d-1f3ed':0, '1f9d1-1f3fe-200d-1f3ed':0, '1f9d1-1f3ff-200d-1f3ed':0, '1f9d1-1f3fb-200d-1f4bb':0, '1f9d1-1f3fc-200d-1f4bb':0, '1f9d1-1f3fd-200d-1f4bb':0, '1f9d1-1f3fe-200d-1f4bb':0, '1f9d1-1f3ff-200d-1f4bb':0, '1f9d1-1f3fb-200d-1f4bc':0, '1f9d1-1f3fc-200d-1f4bc':0, '1f9d1-1f3fd-200d-1f4bc':0, '1f9d1-1f3fe-200d-1f4bc':0, '1f9d1-1f3ff-200d-1f4bc':0, '1f9d1-1f3fb-200d-1f527':0, '1f9d1-1f3fc-200d-1f527':0, '1f9d1-1f3fd-200d-1f527':0, '1f9d1-1f3fe-200d-1f527':0, '1f9d1-1f3ff-200d-1f527':0, '1f9d1-1f3fb-200d-1f52c':0, '1f9d1-1f3fc-200d-1f52c':0, '1f9d1-1f3fd-200d-1f52c':0, '1f9d1-1f3fe-200d-1f52c':0, '1f9d1-1f3ff-200d-1f52c':0, '1f9d1-1f3fb-200d-1f680':0, '1f9d1-1f3fc-200d-1f680':0, '1f9d1-1f3fd-200d-1f680':0, '1f9d1-1f3fe-200d-1f680':0, '1f9d1-1f3ff-200d-1f680':0, '1f9d1-1f3fb-200d-1f692':0, '1f9d1-1f3fc-200d-1f692':0, '1f9d1-1f3fd-200d-1f692':0, '1f9d1-1f3fe-200d-1f692':0, '1f9d1-1f3ff-200d-1f692':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe':0, '1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff':0, '1f9d1-1f3fb-200d-1f9af':0, '1f9d1-1f3fc-200d-1f9af':0, '1f9d1-1f3fd-200d-1f9af':0, '1f9d1-1f3fe-200d-1f9af':0, '1f9d1-1f3ff-200d-1f9af':0, '1f9d1-1f3fb-200d-1f9b0':0, '1f9d1-1f3fc-200d-1f9b0':0, '1f9d1-1f3fd-200d-1f9b0':0, '1f9d1-1f3fe-200d-1f9b0':0, '1f9d1-1f3ff-200d-1f9b0':0, '1f9d1-1f3fb-200d-1f9b1':0, '1f9d1-1f3fc-200d-1f9b1':0, '1f9d1-1f3fd-200d-1f9b1':0, '1f9d1-1f3fe-200d-1f9b1':0, '1f9d1-1f3ff-200d-1f9b1':0, '1f9d1-1f3fb-200d-1f9b2':0, '1f9d1-1f3fc-200d-1f9b2':0, '1f9d1-1f3fd-200d-1f9b2':0, '1f9d1-1f3fe-200d-1f9b2':0, '1f9d1-1f3ff-200d-1f9b2':0, '1f9d1-1f3fb-200d-1f9b3':0, '1f9d1-1f3fc-200d-1f9b3':0, '1f9d1-1f3fd-200d-1f9b3':0, '1f9d1-1f3fe-200d-1f9b3':0, '1f9d1-1f3ff-200d-1f9b3':0, '1f9d1-1f3fb-200d-1f9bc':0, '1f9d1-1f3fc-200d-1f9bc':0, '1f9d1-1f3fd-200d-1f9bc':0, '1f9d1-1f3fe-200d-1f9bc':0, '1f9d1-1f3ff-200d-1f9bc':0, '1f9d1-1f3fb-200d-1f9bd':0, '1f9d1-1f3fc-200d-1f9bd':0, '1f9d1-1f3fd-200d-1f9bd':0, '1f9d1-1f3fe-200d-1f9bd':0, '1f9d1-1f3ff-200d-1f9bd':0, '1f9d1-1f3fb-200d-2695':0, '1f9d1-1f3fc-200d-2695':0, '1f9d1-1f3fd-200d-2695':0, '1f9d1-1f3fe-200d-2695':0, '1f9d1-1f3ff-200d-2695':0, '1f9d1-1f3fb-200d-2696':0, '1f9d1-1f3fc-200d-2696':0, '1f9d1-1f3fd-200d-2696':0, '1f9d1-1f3fe-200d-2696':0, '1f9d1-1f3ff-200d-2696':0, '1f9d1-1f3fb-200d-2708':0, '1f9d1-1f3fc-200d-2708':0, '1f9d1-1f3fd-200d-2708':0, '1f9d1-1f3fe-200d-2708':0, '1f9d1-1f3ff-200d-2708':0, '1f9d1-1f3fb':0, '1f9d1-1f3fc':0, '1f9d1-1f3fd':0, '1f9d1-1f3fe':0, '1f9d1-1f3ff':0, '1f9d2-1f3fb':0, '1f9d2-1f3fc':0, '1f9d2-1f3fd':0, '1f9d2-1f3fe':0, '1f9d2-1f3ff':0, '1f9d3-1f3fb':0, '1f9d3-1f3fc':0, '1f9d3-1f3fd':0, '1f9d3-1f3fe':0, '1f9d3-1f3ff':0, '1f9d4-1f3fb-200d-2640':0, '1f9d4-1f3fc-200d-2640':0, '1f9d4-1f3fd-200d-2640':0, '1f9d4-1f3fe-200d-2640':0, '1f9d4-1f3ff-200d-2640':0, '1f9d4-1f3fb-200d-2642':0, '1f9d4-1f3fc-200d-2642':0, '1f9d4-1f3fd-200d-2642':0, '1f9d4-1f3fe-200d-2642':0, '1f9d4-1f3ff-200d-2642':0, '1f9d4-1f3fb':0, '1f9d4-1f3fc':0, '1f9d4-1f3fd':0, '1f9d4-1f3fe':0, '1f9d4-1f3ff':0, '1f9d5-1f3fb':0, '1f9d5-1f3fc':0, '1f9d5-1f3fd':0, '1f9d5-1f3fe':0, '1f9d5-1f3ff':0, '1f9d6-1f3fb-200d-2640':0, '1f9d6-1f3fc-200d-2640':0, '1f9d6-1f3fd-200d-2640':0, '1f9d6-1f3fe-200d-2640':0, '1f9d6-1f3ff-200d-2640':0, '1f9d6-1f3fb-200d-2642':0, '1f9d6-1f3fc-200d-2642':0, '1f9d6-1f3fd-200d-2642':0, '1f9d6-1f3fe-200d-2642':0, '1f9d6-1f3ff-200d-2642':0, '1f9d6-1f3fb':0, '1f9d6-1f3fc':0, '1f9d6-1f3fd':0, '1f9d6-1f3fe':0, '1f9d6-1f3ff':0, '1f9d7-1f3fb-200d-2640':0, '1f9d7-1f3fc-200d-2640':0, '1f9d7-1f3fd-200d-2640':0, '1f9d7-1f3fe-200d-2640':0, '1f9d7-1f3ff-200d-2640':0, '1f9d7-1f3fb-200d-2642':0, '1f9d7-1f3fc-200d-2642':0, '1f9d7-1f3fd-200d-2642':0, '1f9d7-1f3fe-200d-2642':0, '1f9d7-1f3ff-200d-2642':0, '1f9d7-1f3fb':0, '1f9d7-1f3fc':0, '1f9d7-1f3fd':0, '1f9d7-1f3fe':0, '1f9d7-1f3ff':0, '1f9d8-1f3fb-200d-2640':0, '1f9d8-1f3fc-200d-2640':0, '1f9d8-1f3fd-200d-2640':0, '1f9d8-1f3fe-200d-2640':0, '1f9d8-1f3ff-200d-2640':0, '1f9d8-1f3fb-200d-2642':0, '1f9d8-1f3fc-200d-2642':0, '1f9d8-1f3fd-200d-2642':0, '1f9d8-1f3fe-200d-2642':0, '1f9d8-1f3ff-200d-2642':0, '1f9d8-1f3fb':0, '1f9d8-1f3fc':0, '1f9d8-1f3fd':0, '1f9d8-1f3fe':0, '1f9d8-1f3ff':0, '1f9d9-1f3fb-200d-2640':0, '1f9d9-1f3fc-200d-2640':0, '1f9d9-1f3fd-200d-2640':0, '1f9d9-1f3fe-200d-2640':0, '1f9d9-1f3ff-200d-2640':0, '1f9d9-1f3fb-200d-2642':0, '1f9d9-1f3fc-200d-2642':0, '1f9d9-1f3fd-200d-2642':0, '1f9d9-1f3fe-200d-2642':0, '1f9d9-1f3ff-200d-2642':0, '1f9d9-1f3fb':0, '1f9d9-1f3fc':0, '1f9d9-1f3fd':0, '1f9d9-1f3fe':0, '1f9d9-1f3ff':0, '1f9da-1f3fb-200d-2640':0, '1f9da-1f3fc-200d-2640':0, '1f9da-1f3fd-200d-2640':0, '1f9da-1f3fe-200d-2640':0, '1f9da-1f3ff-200d-2640':0, '1f9da-1f3fb-200d-2642':0, '1f9da-1f3fc-200d-2642':0, '1f9da-1f3fd-200d-2642':0, '1f9da-1f3fe-200d-2642':0, '1f9da-1f3ff-200d-2642':0, '1f9da-1f3fb':0, '1f9da-1f3fc':0, '1f9da-1f3fd':0, '1f9da-1f3fe':0, '1f9da-1f3ff':0, '1f9db-1f3fb-200d-2640':0, '1f9db-1f3fc-200d-2640':0, '1f9db-1f3fd-200d-2640':0, '1f9db-1f3fe-200d-2640':0, '1f9db-1f3ff-200d-2640':0, '1f9db-1f3fb-200d-2642':0, '1f9db-1f3fc-200d-2642':0, '1f9db-1f3fd-200d-2642':0, '1f9db-1f3fe-200d-2642':0, '1f9db-1f3ff-200d-2642':0, '1f9db-1f3fb':0, '1f9db-1f3fc':0, '1f9db-1f3fd':0, '1f9db-1f3fe':0, '1f9db-1f3ff':0, '1f9dc-1f3fb-200d-2640':0, '1f9dc-1f3fc-200d-2640':0, '1f9dc-1f3fd-200d-2640':0, '1f9dc-1f3fe-200d-2640':0, '1f9dc-1f3ff-200d-2640':0, '1f9dc-1f3fb-200d-2642':0, '1f9dc-1f3fc-200d-2642':0, '1f9dc-1f3fd-200d-2642':0, '1f9dc-1f3fe-200d-2642':0, '1f9dc-1f3ff-200d-2642':0, '1f9dc-1f3fb':0, '1f9dc-1f3fc':0, '1f9dc-1f3fd':0, '1f9dc-1f3fe':0, '1f9dc-1f3ff':0, '1f9dd-1f3fb-200d-2640':0, '1f9dd-1f3fc-200d-2640':0, '1f9dd-1f3fd-200d-2640':0, '1f9dd-1f3fe-200d-2640':0, '1f9dd-1f3ff-200d-2640':0, '1f9dd-1f3fb-200d-2642':0, '1f9dd-1f3fc-200d-2642':0, '1f9dd-1f3fd-200d-2642':0, '1f9dd-1f3fe-200d-2642':0, '1f9dd-1f3ff-200d-2642':0, '1f9dd-1f3fb':0, '1f9dd-1f3fc':0, '1f9dd-1f3fd':0, '1f9dd-1f3fe':0, '1f9dd-1f3ff':0, '261d-1f3fb':0, '261d-1f3fc':0, '261d-1f3fd':0, '261d-1f3fe':0, '261d-1f3ff':0, '26f9-1f3fb-200d-2640':0, '26f9-1f3fc-200d-2640':0, '26f9-1f3fd-200d-2640':0, '26f9-1f3fe-200d-2640':0, '26f9-1f3ff-200d-2640':0, '26f9-1f3fb-200d-2642':0, '26f9-1f3fc-200d-2642':0, '26f9-1f3fd-200d-2642':0, '26f9-1f3fe-200d-2642':0, '26f9-1f3ff-200d-2642':0, '26f9-1f3fb':0, '26f9-1f3fc':0, '26f9-1f3fd':0, '26f9-1f3fe':0, '26f9-1f3ff':0, '270a-1f3fb':0, '270a-1f3fc':0, '270a-1f3fd':0, '270a-1f3fe':0, '270a-1f3ff':0, '270b-1f3fb':0, '270b-1f3fc':0, '270b-1f3fd':0, '270b-1f3fe':0, '270b-1f3ff':0, '270c-1f3fb':0, '270c-1f3fc':0, '270c-1f3fd':0, '270c-1f3fe':0, '270c-1f3ff':0, '270d-1f3fb':0, '270d-1f3fc':0, '270d-1f3fd':0, '270d-1f3fe':0, '270d-1f3ff':0}};\n\nconst Emoji: {[emoji: string]: number} = EmojiVersions[''];\nfor(const version in EmojiVersions) {\n if(version) {\n Object.assign(Emoji, EmojiVersions[version as EMOJI_VERSION]);\n }\n}\n\nexport default Emoji;\n\n/* Emoji[\"00a9-fe0f\"] = 6362;\nEmoji[\"00ae-fe0f\"] = 6363;\nEmoji[\"2122-fe0f\"] = 6364; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport LatinizeMap from '../config/latinizeMap';\n\nexport const badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nconst C2L: {[k: string]: string} = {\n 'й': 'q',\n 'ц': 'w',\n 'у': 'e',\n 'к': 'r',\n 'е': 't',\n 'н': 'y',\n 'г': 'u',\n 'ш': 'i',\n 'щ': 'o',\n 'з': 'p',\n 'х': '[',\n 'ъ': ']',\n 'ф': 'a',\n 'ы': 's',\n 'в': 'd',\n 'а': 'f',\n 'п': 'g',\n 'р': 'h',\n 'о': 'j',\n 'л': 'k',\n 'д': 'l',\n 'ж': ';',\n 'э': '\\'',\n 'я': 'z',\n 'ч': 'x',\n 'с': 'c',\n 'м': 'v',\n 'и': 'b',\n 'т': 'n',\n 'ь': 'm',\n 'б': ',',\n 'ю': '.',\n '.': '/'\n};\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\n}\n\nexport function fixCyrillic(text: string) {\n return text.toLowerCase().replace(/[\\wа-я]/g, (ch) => {\n const latinizeCh = C2L[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport function latinizeString(text: string) {\n return text.replace(/[^A-Za-z0-9]/g, (ch) => {\n const latinizeCh = LatinizeMap[ch];\n return latinizeCh ?? ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n return processSearchText(text, {\n clearBadChars: true,\n latinize,\n ignoreCase: true\n });\n}\n\nexport type ProcessSearchTextOptions = Partial<{\n clearBadChars: boolean,\n latinize: boolean,\n ignoreCase: boolean,\n includeTag: boolean\n}>;\n\nexport function processSearchText(text: string, options: ProcessSearchTextOptions = {}) {\n const hasTag = options.includeTag && text.charAt(0) === '%';\n const originalText = text;\n if(options.clearBadChars) text = clearBadCharsAndTrim(text);\n if(options.latinize) text = latinizeString(text);\n if(options.ignoreCase) text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n if(options.latinize) text += '\\x01' + fixCyrillic(originalText);\n return text;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {InputFileLocation, InputStickerSet, InputWebFileLocation} from '../layer';\nimport type {DownloadOptions} from '../lib/mtproto/apiFileManager';\n\nconst FILENAME_JOINER = '_';\n\nexport function getFileNameByLocation(location: InputFileLocation | InputWebFileLocation, options?: Partial<{\n fileName: string,\n downloadId: string\n}>) {\n const fileName = '';// (options?.fileName || '').split('.');\n const ext = fileName[fileName.length - 1] || '';\n\n let str: string;\n switch(location._) {\n case 'inputPhotoFileLocation': {\n str = ['photo', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputDocumentFileLocation': {\n str = ['document', fileName[0], location.id, location.thumb_size].filter(Boolean).join(FILENAME_JOINER);\n break;\n }\n\n case 'inputPeerPhotoFileLocation':\n str = ['peerPhoto', location.photo_id, location.pFlags.big ? 'big' : 'small'].join(FILENAME_JOINER);\n break;\n\n case 'inputStickerSetThumb': {\n const id = (location.stickerset as InputStickerSet.inputStickerSetID).id ||\n (location.stickerset as InputStickerSet.inputStickerSetShortName).short_name ||\n (location.stickerset as InputStickerSet.inputStickerSetDice).emoticon ||\n location.stickerset._;\n str = ['stickerSetThumb', id, location.thumb_version].join(FILENAME_JOINER);\n break;\n }\n\n case 'inputFileLocation': {\n str = location.volume_id + '_' + location.local_id;\n break;\n }\n\n case 'inputWebFileLocation': {\n str = ['webFile', location.url].join(FILENAME_JOINER);\n break;\n }\n\n default: {\n console.error('Unrecognized location:', location);\n str = '';\n break;\n }\n }\n\n return str + (options?.downloadId ? '_download' : '') + (ext ? '.' + ext : ext);\n}\n\nexport type FileURLType = 'photo' | 'thumb' | 'document' | 'stream' | 'download';\nexport function getFileURL(type: FileURLType, options: DownloadOptions) {\n // console.log('getFileURL', location);\n // const perf = performance.now();\n const encoded = encodeURIComponent(JSON.stringify(options));\n // console.log('getFileURL encode:', performance.now() - perf, encoded);\n\n return /* '/' + */type + '/' + encoded;\n}\n","import {RestrictionReason} from '../layer';\n\nconst platforms = new Set([\n 'all',\n 'web',\n 'webk'\n]);\n\nconst ignore = new Set();\n\nexport function getRestrictionReason(reasons: RestrictionReason[]) {\n // return reasons[0];\n return reasons.find((reason) => platforms.has(reason.platform) && !ignore.has(reason.reason));\n}\n\nexport function isRestricted(reasons: RestrictionReason[]) {\n return !!getRestrictionReason(reasons);\n}\n\nexport function ignoreRestrictionReasons(reasons: string[]) {\n ignore.clear();\n reasons.forEach((reason) => {\n ignore.add(reason);\n });\n}\n","import isObject from '../../../../helpers/object/isObject';\nimport {InputChannel, InputPeer, Peer} from '../../../../layer';\nimport {NULL_PEER_ID} from '../../../mtproto/mtproto_config';\n\nexport default function getPeerId(peerId: {user_id: UserId} | {channel_id: ChatId} | {chat_id: ChatId} | InputPeer | InputChannel | PeerId | string): PeerId {\n if(peerId !== undefined && ((peerId as string).isPeerId ? (peerId as string).isPeerId() : false)) return peerId as PeerId;\n // if(typeof(peerId) === 'string' && /^[uc]/.test(peerId)) return peerId as PeerId;\n // if(typeof(peerId) === 'number') return peerId;\n else if(isObject(peerId)) {\n const userId = (peerId as Peer.peerUser).user_id;\n if(userId !== undefined) {\n return userId.toPeerId(false);\n }\n\n const chatId = (peerId as Peer.peerChannel).channel_id || (peerId as Peer.peerChat).chat_id;\n if(chatId !== undefined) {\n return chatId.toPeerId(true);\n }\n\n return NULL_PEER_ID; // maybe it is an inputPeerSelf\n // } else if(!peerId) return 'u0';\n } else if(!peerId) return NULL_PEER_ID;\n\n const isUser = (peerId as string).charAt(0) === 'u';\n const peerParams = (peerId as string).substr(1).split('_');\n\n return isUser ? peerParams[0].toPeerId() : (peerParams[0] || '').toPeerId(true);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}\n","import type ENVIRONMENT from '.';\n\nlet environment: typeof ENVIRONMENT;\nexport function getEnvironment() {\n return environment;\n}\n\nexport function setEnvironment(env: typeof environment) {\n return environment = env;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Message, StickerSet, Update, NotifyPeer, PeerNotifySettings, PollResults, Poll, WebPage, GroupCall, GroupCallParticipant, ReactionCount, MessagePeerReaction, PhoneCall, Config, Reaction} from '../layer';\nimport type {Dialog, ForumTopic, MessagesStorageKey, MyMessage} from './appManagers/appMessagesManager';\nimport type {MyDialogFilter} from './storages/filters';\nimport type {Folder} from './storages/dialogs';\nimport type {UserTyping} from './appManagers/appProfileManager';\nimport type {MyDraftMessage} from './appManagers/appDraftsManager';\nimport type {ConnectionStatusChange} from './mtproto/connectionStatus';\nimport type {GroupCallId} from './appManagers/appGroupCallsManager';\nimport type {AppManagers} from './appManagers/managers';\nimport type {State} from '../config/state';\nimport type {Progress} from './appManagers/appDownloadManager';\nimport type {CallId} from './appManagers/appCallsManager';\nimport type {MyDocument} from './appManagers/appDocsManager';\nimport type {MTAppConfig} from './mtproto/appConfig';\nimport {NULL_PEER_ID, UserAuth} from './mtproto/mtproto_config';\nimport EventListenerBase from '../helpers/eventListenerBase';\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport MTProtoMessagePort from './mtproto/mtprotoMessagePort';\nimport {IS_WORKER} from '../helpers/context';\n\nexport type BroadcastEvents = {\n 'chat_full_update': ChatId,\n 'chat_update': ChatId,\n 'chat_toggle_forum': {chatId: ChatId, enabled: boolean},\n\n 'channel_update': ChatId,\n\n 'user_update': UserId,\n 'user_auth': UserAuth,\n 'user_full_update': UserId,\n\n 'peer_pinned_messages': {peerId: PeerId, mids?: number[], pinned?: boolean, unpinAll?: true},\n 'peer_pinned_hidden': {peerId: PeerId, maxId: number},\n 'peer_typings': {peerId: PeerId, threadId?: number, typings: UserTyping[]},\n 'peer_block': {peerId: PeerId, blocked: boolean},\n 'peer_title_edit': {peerId: PeerId, threadId?: number},\n 'peer_bio_edit': PeerId,\n 'peer_deleted': PeerId, // left chat, deleted user dialog, left channel\n 'peer_full_update': PeerId,\n\n 'filter_delete': MyDialogFilter,\n 'filter_update': MyDialogFilter,\n 'filter_new': MyDialogFilter,\n 'filter_order': number[],\n\n 'folder_unread': Omit,\n\n 'dialog_draft': {peerId: PeerId, dialog: Dialog | ForumTopic, drop: boolean, draft: MyDraftMessage | undefined},\n 'dialog_unread': {peerId: PeerId, dialog: Dialog | ForumTopic},\n 'dialog_flush': {peerId: PeerId, dialog: Dialog},\n 'dialog_drop': Dialog | ForumTopic,\n 'dialog_migrate': {migrateFrom: PeerId, migrateTo: PeerId},\n // 'dialog_top': Dialog,\n 'dialog_notify_settings': Dialog | ForumTopic,\n // 'dialog_order': {dialog: Dialog, pos: number},\n 'dialogs_multiupdate': Map}>,\n\n 'history_append': {storageKey: MessagesStorageKey, message: Message.message},\n 'history_update': {storageKey: MessagesStorageKey, message: MyMessage, sequential?: boolean},\n 'history_reply_markup': {peerId: PeerId},\n 'history_multiappend': MyMessage,\n 'history_delete': {peerId: PeerId, msgs: Set},\n 'history_forbidden': PeerId,\n 'history_reload': PeerId,\n // 'history_request': void,\n\n 'message_edit': {storageKey: MessagesStorageKey, peerId: PeerId, mid: number, message: MyMessage},\n 'message_sent': {storageKey: MessagesStorageKey, tempId: number, tempMessage: any, mid: number, message: MyMessage},\n 'message_error': {storageKey: MessagesStorageKey, tempId: number, error: ApiError},\n 'messages_views': {peerId: PeerId, mid: number, views: number}[],\n 'messages_reactions': {message: Message.message, changedResults: ReactionCount[]}[],\n 'messages_pending': void,\n 'messages_read': void,\n 'messages_downloaded': {peerId: PeerId, mids: number[]},\n 'messages_media_read': {peerId: PeerId, mids: number[]},\n\n 'replies_updated': Message.message,\n\n 'scheduled_new': Message.message,\n 'scheduled_delete': {peerId: PeerId, mids: number[]},\n\n 'album_edit': {peerId: PeerId, groupId: string, deletedMids: number[], messages: Message.message[]},\n\n 'stickers_installed': StickerSet.stickerSet,\n 'stickers_deleted': StickerSet.stickerSet,\n 'stickers_updated': {type: 'recent' | 'faved', stickers: MyDocument[]},\n 'stickers_top': Long,\n 'sticker_updated': {type: 'recent' | 'faved', document: MyDocument, faved: boolean},\n\n 'state_cleared': void,\n 'state_synchronized': ChatId | void,\n 'state_synchronizing': ChatId | void,\n\n 'contacts_update': UserId,\n 'avatar_update': {peerId: PeerId, threadId?: number},\n 'poll_update': {poll: Poll, results: PollResults},\n 'invalidate_participants': ChatId,\n // 'channel_settings': {channelId: number},\n 'webpage_updated': {id: WebPage.webPage['id'], msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[]},\n\n 'connection_status_change': ConnectionStatusChange,\n 'settings_updated': {key: string, value: any, settings: State['settings']},\n 'draft_updated': {peerId: PeerId, threadId: number, draft: MyDraftMessage | undefined, force?: boolean},\n\n 'background_change': void,\n\n 'privacy_update': Update.updatePrivacy,\n\n 'notify_settings': Update.updateNotifySettings,\n 'notify_peer_type_settings': {key: Exclude, settings: PeerNotifySettings},\n\n 'notification_reset': string,\n 'notification_cancel': string,\n\n 'language_change': string,\n\n 'theme_change': void,\n\n 'media_play': void,\n\n 'emoji_recent': AppEmoji,\n\n 'download_progress': Progress,\n 'document_downloading': DocId,\n 'document_downloaded': DocId,\n\n 'choosing_sticker': boolean\n\n 'group_call_update': GroupCall,\n 'group_call_participant': {groupCallId: GroupCallId, participant: GroupCallParticipant},\n // 'group_call_video_track_added': {instance: GroupCallInstance}\n\n 'call_update': PhoneCall,\n 'call_signaling': {callId: CallId, data: Uint8Array},\n\n 'quick_reaction': Reaction,\n\n 'service_notification': Update.updateServiceNotification,\n\n 'logging_out': void,\n\n 'payment_sent': {peerId: PeerId, mid: number, receiptMessage: Message.messageService}\n\n 'premium_toggle': boolean,\n 'premium_toggle_private': {isNew: boolean, isPremium: boolean},\n\n 'config': Config,\n 'app_config': MTAppConfig\n};\n\nexport type BroadcastEventsListeners = {\n [name in keyof BroadcastEvents]: (e: BroadcastEvents[name]) => void\n};\n\nexport class RootScope extends EventListenerBase {\n public myId: PeerId;\n private connectionStatus: {[name: string]: ConnectionStatusChange};\n public settings: State['settings'];\n public managers: AppManagers;\n public premium: boolean;\n\n constructor() {\n super();\n\n this.myId = NULL_PEER_ID;\n this.connectionStatus = {};\n this.premium = false;\n\n this.addEventListener('user_auth', ({id}) => {\n this.myId = id.toPeerId();\n });\n\n this.addEventListener('premium_toggle_private', ({isNew, isPremium}) => {\n this.premium = isPremium;\n\n if(!isNew) {\n this.dispatchEventSingle('premium_toggle', isPremium);\n }\n });\n\n this.addEventListener('connection_status_change', (status) => {\n this.connectionStatus[status.name] = status;\n });\n\n this.dispatchEvent = (e, ...args) => {\n super.dispatchEvent(e, ...args);\n MTProtoMessagePort.getInstance().invokeVoid('event', {name: e as string, args});\n };\n\n if(!IS_WORKER) {\n this.addEventListener('settings_updated', ({settings}) => {\n this.settings = settings;\n });\n }\n }\n\n public getConnectionStatus() {\n return this.connectionStatus;\n }\n\n public getPremium() {\n return this.premium;\n }\n\n public dispatchEventSingle(...args: any[]) {\n // @ts-ignore\n super.dispatchEvent(...args);\n }\n}\n\nconst rootScope = new RootScope();\nMOUNT_CLASS_TO.rootScope = rootScope;\nexport default rootScope;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {State} from '../../config/state';\nimport rootScope from '../rootScope';\nimport stateStorage from '../stateStorage';\nimport setDeepProperty from '../../helpers/object/setDeepProperty';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\n\nexport class AppStateManager {\n private state: State = {} as any;\n private storage = stateStorage;\n\n // ! for mtproto worker use only\n public newVersion: string;\n public oldVersion: string;\n public userId: UserId;\n\n public getState() {\n return Promise.resolve(this.state);\n }\n\n public setByKey(key: string, value: any) {\n setDeepProperty(this.state, key, value);\n\n const first = key.split('.')[0] as keyof State;\n if(first === 'settings') {\n rootScope.dispatchEvent('settings_updated', {key, value, settings: this.state.settings});\n }\n\n this.pushToState(first, this.state[first]);\n }\n\n public pushToState(key: T, value: State[T], direct = true, onlyLocal?: boolean) {\n if(direct) {\n this.state[key] = value;\n }\n\n this.setKeyValueToStorage(key, value, onlyLocal);\n }\n\n public setKeyValueToStorage(key: T, value: State[T] = this.state[key], onlyLocal?: boolean) {\n MTProtoMessagePort.getInstance().invokeVoid('mirror', {name: 'state', key, value});\n\n this.storage.set({\n [key]: value\n }, onlyLocal);\n }\n\n /* public resetState() {\n for(let i in this.state) {\n // @ts-ignore\n this.state[i] = false;\n }\n sessionStorage.set(this.state).then(() => {\n location.reload();\n });\n } */\n}\n\nconst appStateManager = new AppStateManager();\nexport default appStateManager;\n","import getDeepProperty from './getDeepProperty';\n\nexport default function setDeepProperty(object: any, key: string, value: any) {\n const splitted = key.split('.');\n getDeepProperty(object, splitted.slice(0, -1).join('.'))[splitted.pop()] = value;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pause from '../../../helpers/schedulers/pause';\nimport {DcId} from '../../../types';\nimport {logger, LogTypes} from '../../logger';\nimport type MTPNetworker from '../networker';\nimport MTTransport from './transport';\nimport Modes from '../../../config/modes';\n\n \nimport transportController from './controller';\n// import networkStats from '../networkStats';\n \n\nexport default class HTTP implements MTTransport {\n public networker: MTPNetworker;\n private log: ReturnType;\n\n private pending: Array<{\n resolve: (body: Uint8Array) => void,\n reject: any,\n body: Uint8Array\n }> = [];\n private releasing: boolean;\n\n public connected: boolean;\n private destroyed: boolean;\n private debug: boolean;\n\n constructor(protected dcId: DcId, protected url: string, logSuffix: string) {\n this.debug = Modes.debug && false;\n\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n\n this.log = logger(`HTTP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n\n this.connected = false;\n }\n\n public _send(body: Uint8Array, mode?: RequestMode) {\n const length = body.length;\n this.debug && this.log.debug('-> body length to send:', length);\n\n // networkStats.addSent(this.dcId, length);\n return fetch(this.url, {method: 'POST', body, mode}).then((response) => {\n if(response.status !== 200 && !mode) {\n response.arrayBuffer().then((buffer) => {\n this.log.error('not 200',\n new TextDecoder('utf-8').decode(new Uint8Array(buffer)));\n });\n\n throw response;\n }\n\n this.setConnected(true);\n\n // * test resending by dropping random request\n // if(Math.random() > .5) {\n // throw 'asd';\n // }\n\n return response.arrayBuffer().then((buffer) => {\n // networkStats.addReceived(this.dcId, buffer.byteLength);\n return new Uint8Array(buffer);\n });\n }, (err) => {\n this.setConnected(false);\n throw err;\n });\n }\n\n private setConnected(connected: boolean) {\n if(this.connected === connected || this.destroyed) {\n return;\n }\n\n this.connected = connected;\n\n \n transportController.setTransportValue('https', connected);\n \n }\n\n public destroy() {\n this.setConnected(false);\n this.destroyed = true;\n this.pending.forEach((pending) => pending.reject());\n this.pending.length = 0;\n }\n\n public send(body: Uint8Array) {\n if(this.networker) {\n return this._send(body);\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private async releasePending() {\n if(this.releasing) return;\n\n this.releasing = true;\n // this.log('-> messages to send:', this.pending.length);\n for(let i = 0; i < this.pending.length; ++i) {\n const pending = this.pending[i];\n const {body, resolve} = pending;\n\n try {\n const result = await this._send(body);\n resolve(result);\n this.pending.splice(i, 1);\n } catch(err) {\n this.log.error('Send plain request error:', err);\n await pause(5000);\n }\n\n --i;\n }\n\n this.releasing = false;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {logger, LogTypes} from '../../logger';\nimport Modes from '../../../config/modes';\nimport EventListenerBase from '../../../helpers/eventListenerBase';\nimport {MTConnection} from './transport';\n\n// let closeSocketBefore = Date.now() + 30e3;\n// let closeSocketAfter = Date.now() + 10e3;\n\nexport default class Socket extends EventListenerBase<{\n open: () => void,\n message: (buffer: ArrayBuffer) => any,\n close: () => void,\n}> implements MTConnection {\n private ws: WebSocket;\n private log: ReturnType;\n private debug = Modes.debug && false;\n\n constructor(protected dcId: number, protected url: string, logSuffix: string) {\n super();\n\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`WS-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n this.connect();\n\n return this;\n }\n\n private removeListeners() {\n if(!this.ws) {\n return;\n }\n\n this.ws.removeEventListener('open', this.handleOpen);\n this.ws.removeEventListener('close', this.handleClose);\n this.ws.removeEventListener('error', this.handleError);\n this.ws.removeEventListener('message', this.handleMessage);\n this.ws = undefined;\n }\n\n private connect() {\n this.ws = new WebSocket(this.url, 'binary');\n this.ws.binaryType = 'arraybuffer';\n this.ws.addEventListener('open', this.handleOpen);\n this.ws.addEventListener('close', this.handleClose);\n this.ws.addEventListener('error', this.handleError);\n this.ws.addEventListener('message', this.handleMessage);\n\n // if(Date.now() < closeSocketBefore) {\n // if(Date.now() >= closeSocketAfter) {\n // this.ws.close();\n // }\n }\n\n public close() {\n if(!this.ws) {\n return;\n }\n\n this.log('close execution');\n\n try {\n this.ws.close();\n } catch(err) {\n\n }\n this.handleClose();\n }\n\n private handleOpen = () => {\n this.log('opened');\n\n this.debug && this.log.debug('sending init packet');\n this.dispatchEvent('open');\n };\n\n private handleError = (e: Event) => {\n this.log.error('handleError', e);\n this.close();\n };\n\n private handleClose = (e?: CloseEvent) => {\n this.log('closed', e/* , this.pending, this.ws.bufferedAmount */);\n\n this.removeListeners();\n this.dispatchEvent('close');\n };\n\n private handleMessage = (event: MessageEvent) => {\n this.debug && this.log.debug('<-', 'handleMessage', /* event, */event.data.byteLength);\n\n this.dispatchEvent('message', event.data as ArrayBuffer);\n };\n\n public send = (body: Uint8Array) => {\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n this.ws.send(body);\n };\n}\n","export default function randomize(arr: T) {\n if(crypto && 'getRandomValues' in crypto) {\n crypto.getRandomValues(arr);\n } else {\n throw new Error('NO_SECURE_RANDOM');\n }\n\n return arr;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import aesjs from 'aes-js';\nimport randomize from '../../../helpers/array/randomize';\nimport cryptoMessagePort from '../../crypto/cryptoMessagePort';\nimport {Codec} from './codec';\n\n/*\n@cryptography/aes не работает с массивами которые не кратны 4, поэтому использую intermediate а не abridged\n*/\nexport default class Obfuscation {\n /* private enc: aesjs.ModeOfOperation.ModeOfOperationCTR;\n private dec: aesjs.ModeOfOperation.ModeOfOperationCTR; */\n\n private id: number;\n private idPromise: Promise;\n private process: (data: Uint8Array, operation: 'encrypt' | 'decrypt') => ReturnType;\n\n // private cryptoEncKey: CryptoKey;\n // private cryptoDecKey: CryptoKey;\n // private cryptoKey: CryptoKey;\n\n // private encIv: Uint8Array;\n // private decIv: Uint8Array;\n\n // private decIvCounter: Counter;\n\n public async init(codec: Codec) {\n if(this.idPromise !== undefined) {\n this.release();\n }\n\n const initPayload = new Uint8Array(64);\n randomize(initPayload);\n\n while(true) {\n const val = (initPayload[3] << 24) | (initPayload[2] << 16) | (initPayload[1] << 8) | initPayload[0];\n const val2 = (initPayload[7] << 24) | (initPayload[6] << 16) | (initPayload[5] << 8) | initPayload[4];\n if(initPayload[0] !== 0xef &&\n val !== 0x44414548 &&\n val !== 0x54534f50 &&\n val !== 0x20544547 &&\n val !== 0x4954504f &&\n val !== 0xeeeeeeee &&\n val !== 0xdddddddd &&\n val2 !== 0x00000000) {\n // initPayload[56] = initPayload[57] = initPayload[58] = initPayload[59] = transport;\n break;\n }\n randomize(initPayload);\n }\n\n // //////////////////////initPayload.subarray(60, 62).hex = dcId;\n /* initPayload.set(new Uint8Array([161, 208, 67, 71, 118, 109, 20, 111, 113, 255, 134, 10, 159, 241, 7, 44, 217, 82, 187, 76, 108, 131, 200, 186, 33, 57, 177, 251, 52, 34, 18, 54, 65, 105, 37, 89, 38, 20, 47, 168, 126, 181, 24, 138, 212, 68, 60, 150, 225, 37, 181, 4, 201, 50, 72, 151, 168, 143, 204, 169, 81, 187, 241, 23]));\n console.log('initPayload', initPayload); */\n\n const reversedPayload = initPayload.slice().reverse();\n\n const encKey = initPayload.slice(8, 40);\n const encIv = /* this.encIv = */initPayload.slice(40, 56);\n const decKey = reversedPayload.slice(8, 40);\n const decIv = /* this.decIv = */reversedPayload.slice(40, 56);\n\n /* this.enc = new aesjs.ModeOfOperation.ctr(encKey, new aesjs.Counter(encIv as any));\n this.dec = new aesjs.ModeOfOperation.ctr(decKey, new aesjs.Counter(decIv as any)); */\n\n // console.log('encKey', encKey.hex, encIv.hex);\n // console.log('decKey', decKey.hex, decIv.hex);\n\n const idPromise = this.idPromise = cryptoMessagePort.invokeCrypto('aes-ctr-prepare', {\n encKey,\n encIv,\n decKey,\n decIv\n });\n\n this.process = async(data, operation) => {\n await idPromise;\n return this._process(data, operation);\n };\n\n this.id = await idPromise;\n\n this.process = this._process;\n\n // this.decIvCounter = new Counter(this.decIv);\n /* const key = this.cryptoEncKey = await subtle.importKey(\n 'raw',\n encKey,\n {name: 'AES-CTR'},\n false,\n ['encrypt']\n ); */\n\n // this.cryptoDecKey = await subtle.importKey(\n // 'raw',\n // decKey,\n // {name: 'AES-CTR'},\n // false,\n // ['encrypt']\n // );\n\n // this.cryptoKey = await subtle.importKey(\n // 'raw',\n // encKey,\n // {name: 'AES-CTR'},\n // false,\n // ['encrypt', 'decrypt']\n // );\n\n initPayload.set(codec.obfuscateTag, 56);\n const encrypted = await this.encode(initPayload.slice());\n\n // console.log('encrypted', encrypted);\n\n initPayload.set(encrypted.slice(56, 64), 56);\n\n return initPayload;\n }\n\n /* public encode(payload: Uint8Array) {\n let startTime = performance.now();\n let res = this.enc.encrypt(payload);\n let time = performance.now() - startTime;\n\n try {\n startTime = performance.now();\n let arr = this.encNew.encrypt(payload);\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\n let resNew = new Uint8Array(bytesFromWordss(arr));\n let time2 = performance.now() - startTime;\n console.log('Obfuscation: encode comparison:', res, arr, resNew, res.hex === resNew.hex, time2 < time);\n } catch(err) {\n console.error('Obfuscation: error:', err);\n }\n\n return res;\n }\n\n public decode(payload: Uint8Array) {\n let res = this.dec.encrypt(payload);\n\n try {\n let arr = this.decNew.decrypt(payload);\n //let resNew = bytesFromWords({words: arr, sigBytes: arr.length});\n let resNew = new Uint8Array(bytesFromWordss(arr));\n console.log('Obfuscation: decode comparison:', res, arr, resNew, res.hex === resNew.hex);\n } catch(err) {\n console.error('Obfuscation: error:', err);\n }\n\n return res;\n } */\n\n private _process = (data: Uint8Array, operation: 'encrypt' | 'decrypt') => {\n return cryptoMessagePort.invokeCryptoNew({\n method: 'aes-ctr-process',\n args: [{id: this.id, data, operation}],\n transfer: [data.buffer]\n }) as Promise;\n };\n\n public encode(payload: Uint8Array) {\n /* return subtle.encrypt({\n name: 'AES-CTR',\n counter: this.encIv,\n length: 64\n },\n this.cryptoEncKey,\n payload\n ); */\n return this.process(payload, 'encrypt');\n }\n\n public decode(payload: Uint8Array) {\n return this.process(payload, 'decrypt');\n }\n\n public async release() {\n const idPromise = this.idPromise;\n if(idPromise === undefined) {\n return;\n }\n\n this.id = undefined;\n this.idPromise = undefined;\n\n const id = await idPromise;\n cryptoMessagePort.invokeCrypto('aes-ctr-destroy', id);\n }\n\n public destroy() {\n this.release();\n }\n\n // public encode(payload: Uint8Array) {\n // let res = this.encNew.encrypt(payload);\n // let bytes = new Uint8Array(bytesFromWordss(res));\n\n // return bytes;\n // }\n\n // public async decode(payload: Uint8Array) {\n // const counter = this.decIvCounter.counter.slice();\n // this.decIvCounter.increment();\n\n // const n: ArrayBuffer = await subtle.encrypt({\n // name: 'AES-CTR',\n // counter: counter,\n // length: 64\n // },\n // this.cryptoDecKey,\n // payload\n // );\n\n // const decoded = this.decNew.update(payload);\n\n // console.log('decode', bytesToHex(decoded), 'new', n, bytesToHex(new Uint8Array(n)));\n\n // return decoded;\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { bytesFromHex, addPadding } from \"../../bin_utils\";\nimport {Codec} from './codec';\n\nclass AbridgedPacketCodec implements Codec {\n public tag = 0xef;\n public obfuscateTag = new Uint8Array([this.tag, this.tag, this.tag, this.tag]);\n\n public encodePacket(data: Uint8Array) {\n const len = data.byteLength >> 2;\n let header: Uint8Array;\n if(len < 127) {\n header = new Uint8Array([len]);\n } else { // Length: payload length, divided by four, and encoded as 3 length bytes (little endian)\n // header = new Uint8Array([0x7f, ...addPadding(bytesFromHex(len.toString(16)).reverse(), 3, true)/* .reverse() */]);\n header = new Uint8Array([0x7f, len & 0xFF, (len >> 8) & 0xFF, (len >> 16) & 0xFF]);\n // console.log('got nobody cause im braindead', header, len);\n }\n\n return header.concat(data);\n // return new Uint8Array([...header, ...data]);\n }\n\n public readPacket(data: Uint8Array) {\n let length = data[0];\n if(length >= 127) { // 0x7f\n length = data[1] | (data[2] << 8) | (data[3] << 16);\n\n return data.slice(4, length << 2 + 1); // need +1\n }\n\n return data.slice(1, length << 2 + 1); // need +1\n }\n}\n\nexport default new AbridgedPacketCodec();\n","export default function bytesToHex(bytes: ArrayLike) {\n const length = bytes.length;\n const arr: string[] = new Array(length);\n for(let i = 0; i < length; ++i) {\n arr[i] = (bytes[i] < 16 ? '0' : '') + (bytes[i] || 0).toString(16);\n }\n return arr.join('');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from '../../../config/modes';\nimport {logger, LogTypes} from '../../logger';\nimport MTPNetworker from '../networker';\nimport Obfuscation from './obfuscation';\nimport MTTransport, {MTConnection, MTConnectionConstructable} from './transport';\n// import intermediatePacketCodec from './intermediate';\nimport abridgedPacketCodec from './abridged';\n// import paddedIntermediatePacketCodec from './padded';\nimport {ConnectionStatus} from '../connectionStatus';\n\n \nimport transportController from './controller';\nimport bytesToHex from '../../../helpers/bytes/bytesToHex';\n// import networkStats from '../networkStats';\nimport ctx from '../../../environment/ctx';\n \n\nexport default class TcpObfuscated implements MTTransport {\n private codec = abridgedPacketCodec;\n private obfuscation = new Obfuscation();\n public networker: MTPNetworker;\n\n private pending: Array> = [];\n\n private debug = Modes.debug && false/* true */;\n private log: ReturnType;\n public connected = false;\n private lastCloseTime: number;\n public connection: MTConnection;\n\n private autoReconnect = true;\n private reconnectTimeout: number;\n private releasingPending: boolean;\n\n // private debugPayloads: MTPNetworker['debugRequests'] = [];\n\n constructor(\n private Connection: MTConnectionConstructable,\n private dcId: number,\n private url: string,\n private logSuffix: string,\n private retryTimeout: number\n ) {\n let logTypes = LogTypes.Error | LogTypes.Log;\n if(this.debug) logTypes |= LogTypes.Debug;\n this.log = logger(`TCP-${dcId}` + logSuffix, logTypes);\n this.log('constructor');\n\n this.connect();\n }\n\n private onOpen = async() => {\n this.connected = true;\n\n \n transportController.setTransportOpened('websocket');\n \n\n const initPayload = await this.obfuscation.init(this.codec);\n if(!this.connected) {\n return;\n }\n\n this.connection.send(initPayload);\n\n if(this.networker) {\n this.pending.length = 0; // ! clear queue and reformat messages to container, because if sending simultaneously 10+ messages, connection will die\n this.networker.setConnectionStatus(ConnectionStatus.Connected);\n this.networker.cleanupSent();\n this.networker.resend();\n }/* else {\n for(const pending of this.pending) {\n if(pending.encoded && pending.body) {\n pending.encoded = this.encodeBody(pending.body);\n }\n }\n } */\n\n setTimeout(() => {\n this.releasePending();\n }, 0);\n };\n\n private onMessage = async(buffer: ArrayBuffer) => {\n // networkStats.addReceived(this.dcId, buffer.byteLength);\n\n let data = await this.obfuscation.decode(new Uint8Array(buffer));\n data = this.codec.readPacket(data);\n\n if(this.networker) { // authenticated!\n // this.pending = this.pending.filter((p) => p.body); // clear pending\n\n this.debug && this.log.debug('redirecting to networker', data.length);\n this.networker.parseResponse(data).then((response) => {\n this.debug && this.log.debug('redirecting to networker response:', response);\n\n try {\n this.networker.processMessage(response.response, response.messageId, response.sessionId);\n } catch(err) {\n this.log.error('handleMessage networker processMessage error', err);\n }\n\n // this.releasePending();\n }).catch((err) => {\n this.log.error('handleMessage networker parseResponse error', err);\n });\n\n // this.dd();\n return;\n }\n\n // console.log('got hex:', data.hex);\n const pending = this.pending.shift();\n if(!pending) {\n this.debug && this.log.debug('no pending for res:', bytesToHex(data));\n return;\n }\n\n pending.resolve(data);\n };\n\n private onClose = () => {\n this.clear();\n\n let needTimeout: number, retryAt: number;\n if(this.autoReconnect) {\n const time = Date.now();\n const diff = time - this.lastCloseTime;\n needTimeout = !isNaN(diff) && diff < this.retryTimeout ? this.retryTimeout - diff : 0;\n retryAt = time + needTimeout;\n }\n\n if(this.networker) {\n this.networker.setConnectionStatus(ConnectionStatus.Closed, retryAt);\n this.pending.length = 0;\n }\n\n if(this.autoReconnect) {\n this.log('will try to reconnect after timeout:', needTimeout / 1000);\n this.reconnectTimeout = ctx.setTimeout(this.reconnect, needTimeout);\n } else {\n this.log('reconnect isn\\'t needed');\n }\n };\n\n public clear() {\n \n if(this.connected) {\n transportController.setTransportClosed('websocket');\n }\n \n\n this.connected = false;\n\n if(this.connection) {\n this.connection.removeEventListener('open', this.onOpen);\n this.connection.removeEventListener('close', this.onClose);\n this.connection.removeEventListener('message', this.onMessage);\n this.connection = undefined;\n }\n }\n\n /**\n * invoke only when closed\n */\n public reconnect = () => {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n\n if(this.connection) {\n return;\n }\n\n this.log('trying to reconnect...');\n this.lastCloseTime = Date.now();\n\n if(!this.networker) {\n for(const pending of this.pending) {\n if(pending.bodySent) {\n pending.bodySent = false;\n }\n }\n } else {\n this.networker.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.connect();\n }\n\n public forceReconnect() {\n this.close();\n this.reconnect();\n }\n\n public destroy() {\n this.setAutoReconnect(false);\n this.close();\n\n if(this.obfuscation) {\n this.obfuscation.destroy();\n }\n\n this.pending.forEach((pending) => {\n if(pending.reject) {\n pending.reject();\n }\n });\n this.pending.length = 0;\n }\n\n public close() {\n const connection = this.connection;\n if(connection) {\n const connected = this.connected;\n this.clear();\n if(connected) { // wait for buffered messages if they are there\n connection.addEventListener('message', this.onMessage);\n connection.addEventListener('close', () => {\n connection.removeEventListener('message', this.onMessage);\n }, {once: true});\n connection.close();\n }\n }\n }\n\n /**\n * Will connect if enable and disconnected \\\n * Will reset reconnection timeout if disable\n */\n public setAutoReconnect(enable: boolean) {\n this.autoReconnect = enable;\n\n if(!enable) {\n if(this.reconnectTimeout !== undefined) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n } else if(!this.connection && this.reconnectTimeout === undefined) {\n this.reconnect();\n }\n }\n\n private connect() {\n if(this.connection) {\n this.close();\n }\n\n this.connection = new this.Connection(this.dcId, this.url, this.logSuffix);\n this.connection.addEventListener('open', this.onOpen);\n this.connection.addEventListener('close', this.onClose);\n this.connection.addEventListener('message', this.onMessage);\n }\n\n public changeUrl(url: string) {\n if(this.url === url) {\n return;\n }\n\n this.url = url;\n this.forceReconnect();\n }\n\n private encodeBody(body: Uint8Array) {\n const toEncode = this.codec.encodePacket(body);\n\n // this.log('send before obf:', /* body.hex, nonce.hex, */ toEncode.hex);\n const encoded = this.obfuscation.encode(toEncode);\n // this.log('send after obf:', enc.hex);\n\n return encoded;\n }\n\n public send(body: Uint8Array) {\n this.debug && this.log.debug('-> body length to pending:', body.length);\n\n const encoded: typeof body = /* this.connected ? this.encodeBody(body) : */undefined;\n\n // return;\n\n if(this.networker) {\n this.pending.push({body, encoded});\n this.releasePending();\n } else {\n const promise = new Promise((resolve, reject) => {\n this.pending.push({resolve, reject, body, encoded});\n });\n\n this.releasePending();\n\n return promise;\n }\n }\n\n private async releasePending(/* tt = false */) {\n if(!this.connected || this.releasingPending) {\n // this.connect();\n return;\n }\n\n this.releasingPending = true;\n\n /* if(!tt) {\n this.releasePendingDebounced();\n return;\n } */\n\n // this.log('-> messages to send:', this.pending.length);\n let length = this.pending.length;\n let sent = false;\n // for(let i = length - 1; i >= 0; --i) {\n for(let i = 0; i < length; ++i) {\n const pending = this.pending[i];\n if(!pending) {\n break;\n }\n\n const {body, bodySent} = pending;\n if(body && !bodySent) {\n // this.debugPayloads.push({before: body.slice(), after: enc});\n\n this.debug && this.log.debug('-> body length to send:', body.length);\n\n // if(!encoded) {\n // encoded = pending.encoded = this.encodeBody(body);\n // }\n\n const encoded = pending.encoded ??= await this.encodeBody(body);\n if(!this.connected) {\n break;\n }\n\n // networkStats.addSent(this.dcId, encoded.byteLength);\n this.connection.send(encoded);\n\n if(!pending.resolve) { // remove if no response needed\n this.pending.splice(i--, 1);\n length--;\n } else {\n pending.bodySent = true;\n }\n\n sent = true;\n // delete pending.body;\n }\n }\n\n this.releasingPending = undefined;\n\n if(this.pending.length && sent) {\n this.releasePending();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport MTTransport, {MTConnectionConstructable} from './transports/transport';\nimport Modes from '../../config/modes';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\n\n \nimport HTTP from './transports/http';\n \n\n \nimport Socket from './transports/websocket';\nimport TcpObfuscated from './transports/tcpObfuscated';\nimport {IS_WEB_WORKER} from '../../helpers/context';\nimport {DcId} from '../../types';\nimport {getEnvironment} from '../../environment/utils';\n\n \n \n \n\n \n\nexport type TransportType = 'websocket' | 'https' | 'http';\nexport type ConnectionType = 'client' | 'download' | 'upload';\ntype Servers = {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTTransport[]\n }\n }\n};\n\nconst TEST_SUFFIX = Modes.test ? '_test' : '';\nconst PREMIUM_SUFFIX = '_premium';\n\nexport function getTelegramConnectionSuffix(connectionType: ConnectionType) {\n return connectionType === 'client' ? '' : '-1';\n}\n\n \nexport function constructTelegramWebSocketUrl(dcId: DcId, connectionType: ConnectionType, premium?: boolean) {\n const suffix = getTelegramConnectionSuffix(connectionType);\n const path = connectionType !== 'client' ? 'apiws' + TEST_SUFFIX + (premium ? PREMIUM_SUFFIX : '') : ('apiws' + TEST_SUFFIX);\n const chosenServer = `wss://${App.suffix.toLowerCase()}ws${dcId}${suffix}.web.telegram.org/${path}`;\n\n return chosenServer;\n}\n \n\nexport class DcConfigurator {\n private sslSubdomains = ['pluto', 'venus', 'aurora', 'vesta', 'flora'];\n\n private dcOptions = Modes.test ?\n [\n {id: 1, host: '149.154.175.10', port: 80},\n {id: 2, host: '149.154.167.40', port: 80},\n {id: 3, host: '149.154.175.117', port: 80}\n ] :\n [\n {id: 1, host: '149.154.175.50', port: 80},\n {id: 2, host: '149.154.167.50', port: 80},\n {id: 3, host: '149.154.175.100', port: 80},\n {id: 4, host: '149.154.167.91', port: 80},\n {id: 5, host: '149.154.171.5', port: 80}\n ];\n\n public chosenServers: Servers = {} as any;\n\n \n private transportSocket = (dcId: DcId, connectionType: ConnectionType, premium?: boolean) => {\n const chosenServer = constructTelegramWebSocketUrl(dcId, connectionType, premium);\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n\n const retryTimeout = connectionType === 'client' ? 10000 : 10000;\n\n let oooohLetMeLive: MTConnectionConstructable;\n \n oooohLetMeLive = Socket;\n \n \n \n\n return new TcpObfuscated(oooohLetMeLive, dcId, chosenServer, logSuffix, retryTimeout);\n };\n \n\n \n private transportHTTP = (dcId: DcId, connectionType: ConnectionType, premium?: boolean) => {\n let chosenServer: string;\n if(Modes.ssl || !Modes.http) {\n const suffix = getTelegramConnectionSuffix(connectionType);\n const subdomain = this.sslSubdomains[dcId - 1] + suffix;\n const path = Modes.test ? 'apiw_test1' : 'apiw1';\n chosenServer = 'https://' + subdomain + '.web.telegram.org/' + path;\n } else {\n for(const dcOption of this.dcOptions) {\n if(dcOption.id === dcId) {\n chosenServer = 'http://' + dcOption.host + (dcOption.port !== 80 ? ':' + dcOption.port : '') + '/apiw1';\n break;\n }\n }\n }\n\n const logSuffix = connectionType === 'upload' ? '-U' : connectionType === 'download' ? '-D' : '';\n return new HTTP(dcId, chosenServer, logSuffix);\n };\n \n\n public chooseServer(\n dcId: DcId,\n connectionType: ConnectionType = 'client',\n transportType: TransportType = Modes.transport,\n reuse = true,\n premium?: boolean\n ) {\n /* if(transportType === 'websocket' && !Modes.multipleConnections) {\n connectionType = 'client';\n } */\n\n if(!this.chosenServers.hasOwnProperty(transportType)) {\n this.chosenServers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const servers = this.chosenServers[transportType][connectionType];\n\n if(!(dcId in servers)) {\n servers[dcId] = [];\n }\n\n const transports = servers[dcId];\n\n if(!transports.length || !reuse/* || (upload && transports.length < 1) */) {\n let transport: MTTransport;\n\n \n transport = (transportType === 'websocket' ? this.transportSocket : this.transportHTTP)(dcId, connectionType, premium);\n \n \n \n \n \n\n if(!transport) {\n console.error('No chosenServer!', dcId);\n return null;\n }\n\n if(reuse) {\n transports.push(transport);\n }\n\n return transport;\n }\n\n return transports[0];\n }\n\n public static removeTransport(obj: any, transport: T) {\n for(const transportType in obj) {\n // @ts-ignore\n for(const connectionType in obj[transportType]) {\n // @ts-ignore\n for(const dcId in obj[transportType][connectionType]) {\n // @ts-ignore\n const transports: T[] = obj[transportType][connectionType][dcId];\n indexOfAndSplice(transports, transport);\n }\n }\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../../../config/app';\nimport deferredPromise from '../../../helpers/cancellablePromise';\nimport EventListenerBase from '../../../helpers/eventListenerBase';\nimport pause from '../../../helpers/schedulers/pause';\nimport {TransportType, DcConfigurator} from '../dcConfigurator';\nimport type HTTP from './http';\nimport type TcpObfuscated from './tcpObfuscated';\nimport MTTransport from './transport';\n\nexport class MTTransportController extends EventListenerBase<{\n change: (opened: MTTransportController['opened']) => void,\n transport: (type: TransportType) => void\n}> {\n private opened: Map;\n private transports: {[k in TransportType]?: MTTransport};\n private pinging: boolean;\n private dcConfigurator: DcConfigurator;\n\n constructor() {\n super(true);\n\n this.opened = new Map();\n /* this.addEventListener('change', (opened) => {\n this.dispatchEvent('transport', opened.get('websocket') || !opened.get('https') ? 'websocket' : 'https');\n }); */\n\n this.addEventListener('change', (opened) => {\n if(!opened.get('websocket')) {\n this.waitForWebSocket();\n }\n });\n\n // setTimeout(() => {\n // this.waitForWebSocket();\n // }, 200); // wait for first transport so won't have delay for first WS\n }\n\n public async pingTransports() {\n const dcConfigurator = this.dcConfigurator ??= new DcConfigurator();\n const timeout = 2000;\n const transports: {[k in TransportType]?: MTTransport} = this.transports = {\n https: dcConfigurator.chooseServer(App.baseDcId, 'client', 'https', false),\n websocket: dcConfigurator.chooseServer(App.baseDcId, 'client', 'websocket', false)\n };\n\n const httpPromise = deferredPromise();\n ((this.transports.https as HTTP)._send(new Uint8Array(), 'no-cors') as any as Promise)\n .then(() => httpPromise.resolve(true), () => httpPromise.resolve(false));\n setTimeout(() => httpPromise.resolve(false), timeout);\n\n const websocketPromise = deferredPromise();\n const socket = transports.websocket as TcpObfuscated;\n socket.setAutoReconnect(false);\n socket.connection.addEventListener('close', () => websocketPromise.resolve(false), {once: true});\n socket.connection.addEventListener('open', () => websocketPromise.resolve(true), {once: true});\n setTimeout(() => {\n if(websocketPromise.isFulfilled || websocketPromise.isRejected) {\n return;\n }\n\n if(socket.connection) {\n socket.connection.close();\n }\n\n websocketPromise.resolve(false);\n }, timeout);\n\n const [isHttpAvailable, isWebSocketAvailable] = await Promise.all([httpPromise, websocketPromise]);\n\n for(const transportType in transports) {\n const transport = transports[transportType as TransportType];\n transport.destroy();\n }\n\n const result = {\n https: isHttpAvailable || this.opened.get('https') > 0,\n websocket: isWebSocketAvailable || this.opened.get('websocket') > 0\n };\n\n // result.websocket = false;\n return result;\n }\n\n public async waitForWebSocket() {\n if(this.pinging) return;\n this.pinging = true;\n\n while(true) {\n const {https, websocket} = await this.pingTransports();\n if(https || websocket) {\n this.dispatchEvent('transport', websocket || !https ? 'websocket' : 'https');\n }\n\n if(websocket) {\n break;\n }\n\n await pause(10000);\n }\n\n this.pinging = false;\n }\n\n public setTransportValue(type: TransportType, value: boolean) {\n let length = this.opened.get(type) || 0;\n length += value ? 1 : -1;\n\n this.opened.set(type, length);\n this.dispatchEvent('change', this.opened);\n }\n\n public setTransportOpened(type: TransportType) {\n return this.setTransportValue(type, true);\n }\n\n public setTransportClosed(type: TransportType) {\n return this.setTransportValue(type, false);\n }\n}\n\nconst transportController = new MTTransportController();\nexport default transportController;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport deferredPromise, {CancellablePromise} from '../../../../helpers/cancellablePromise';\nimport type {StoragesResults} from './loadStorages';\n\nconst RESET_STORAGES_PROMISE: CancellablePromise> = deferredPromise();\nexport default RESET_STORAGES_PROMISE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {CryptoMessagePort} from '../crypto/cryptoMessagePort';\nimport type {ApiFileManager} from '../mtproto/apiFileManager';\nimport type {ApiManager} from '../mtproto/apiManager';\nimport type {Authorizer} from '../mtproto/authorizer';\nimport type {DcConfigurator} from '../mtproto/dcConfigurator';\nimport type {NetworkerFactory} from '../mtproto/networkerFactory';\nimport type {PasswordManager} from '../mtproto/passwordManager';\nimport type {ReferenceDatabase} from '../mtproto/referenceDatabase';\nimport type {TimeManager} from '../mtproto/timeManager';\nimport type {RootScope} from '../rootScope';\nimport type DialogsStorage from '../storages/dialogs';\nimport type FiltersStorage from '../storages/filters';\nimport type PeersStorage from '../storages/peers';\nimport type ThumbsStorage from '../storages/thumbs';\nimport type {ApiUpdatesManager} from './apiUpdatesManager';\nimport type {AppAvatarsManager} from './appAvatarsManager';\nimport type {AppCallsManager} from './appCallsManager';\nimport type {AppChatsManager} from './appChatsManager';\nimport type {AppDocsManager} from './appDocsManager';\nimport type {AppDraftsManager} from './appDraftsManager';\nimport type {AppEmojiManager} from './appEmojiManager';\nimport type {AppGroupCallsManager} from './appGroupCallsManager';\nimport type {AppInlineBotsManager} from './appInlineBotsManager';\nimport type {AppMessagesIdsManager} from './appMessagesIdsManager';\nimport type {AppMessagesManager} from './appMessagesManager';\nimport type {AppNotificationsManager} from './appNotificationsManager';\nimport type AppPaymentsManager from './appPaymentsManager';\nimport type {AppPeersManager} from './appPeersManager';\nimport type {AppPhotosManager} from './appPhotosManager';\nimport type {AppPollsManager} from './appPollsManager';\nimport type {AppPrivacyManager} from './appPrivacyManager';\nimport type {AppProfileManager} from './appProfileManager';\nimport type {AppReactionsManager} from './appReactionsManager';\nimport type {AppStateManager} from './appStateManager';\nimport type {AppStickersManager} from './appStickersManager';\nimport type {AppStoragesManager} from './appStoragesManager';\nimport type {AppUsersManager} from './appUsersManager';\nimport type AppWebDocsManager from './appWebDocsManager';\nimport type {AppWebPagesManager} from './appWebPagesManager';\nimport type AppAttachMenuBotsManager from './appAttachMenuBotsManager';\nimport type AppSeamlessLoginManager from './appSeamlessLoginManager';\nimport type {AppManagers} from './managers';\n\nexport class AppManager {\n protected appPeersManager: AppPeersManager;\n protected appChatsManager: AppChatsManager;\n protected appDocsManager: AppDocsManager;\n protected appPhotosManager: AppPhotosManager;\n protected appPollsManager: AppPollsManager;\n protected appUsersManager: AppUsersManager;\n protected appWebPagesManager: AppWebPagesManager;\n protected appDraftsManager: AppDraftsManager;\n protected appProfileManager: AppProfileManager;\n protected appNotificationsManager: AppNotificationsManager;\n protected apiUpdatesManager: ApiUpdatesManager;\n protected appAvatarsManager: AppAvatarsManager;\n protected appGroupCallsManager: AppGroupCallsManager;\n protected appCallsManager: AppCallsManager;\n protected appReactionsManager: AppReactionsManager;\n protected appMessagesManager: AppMessagesManager;\n protected appMessagesIdsManager: AppMessagesIdsManager;\n protected appPrivacyManager: AppPrivacyManager;\n protected appInlineBotsManager: AppInlineBotsManager;\n protected appStickersManager: AppStickersManager;\n protected referenceDatabase: ReferenceDatabase;\n protected appEmojiManager: AppEmojiManager;\n protected dialogsStorage: DialogsStorage;\n protected filtersStorage: FiltersStorage;\n protected apiManager: ApiManager;\n // protected apiManager: ApiManagerProxy;\n protected passwordManager: PasswordManager;\n protected cryptoWorker: CryptoMessagePort;\n protected apiFileManager: ApiFileManager;\n protected peersStorage: PeersStorage;\n protected thumbsStorage: ThumbsStorage;\n protected networkerFactory: NetworkerFactory;\n protected rootScope: RootScope;\n protected authorizer: Authorizer;\n protected dcConfigurator: DcConfigurator;\n protected timeManager: TimeManager;\n protected appStoragesManager: AppStoragesManager;\n protected appStateManager: AppStateManager;\n protected appWebDocsManager: AppWebDocsManager;\n protected appPaymentsManager: AppPaymentsManager;\n protected appAttachMenuBotsManager: AppAttachMenuBotsManager;\n protected appSeamlessLoginManager: AppSeamlessLoginManager;\n\n public clear: (init?: boolean) => void;\n\n public setManagers(managers: AppManagers) {\n Object.assign(this, managers);\n // this.after();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type{Chat} from '../../../../layer';\nimport type{Dialog} from '../../appMessagesManager';\nimport type{User} from '../../appUsersManager';\nimport type {StoragesStorages} from './createStorages';\nimport {recordPromiseBound} from '../../../../helpers/recordPromise';\nimport {Awaited} from '../../../../types';\nimport {logger} from '../../../logger';\nimport RESET_STORAGES_PROMISE from './resetStoragesPromise';\n\nexport type StoragesResults = Awaited>;\n\nasync function loadStoragesInner(storages: StoragesStorages) {\n const recordPromise = recordPromiseBound(logger('STORAGES-LOADER'));\n const storagesKeys = Object.keys(storages) as Array;\n const storagesPromises: Promise[] = storagesKeys.map((key) => {\n const promise = storages[key].getAll();\n return recordPromise(promise, 'storage ' + (key as any as string));\n });\n\n const storagesResults: {\n users: User[],\n chats: Chat[],\n dialogs: Dialog[]\n } = {} as any;\n const arr = await Promise.all(storagesPromises);\n for(let i = 0, length = storagesKeys.length; i < length; ++i) {\n storagesResults[storagesKeys[i]] = arr[i] as any;\n }\n\n arr.splice(0, storagesKeys.length);\n\n const resetStorages = await RESET_STORAGES_PROMISE;\n if(resetStorages.size) {\n for(const key of resetStorages) {\n storagesResults[key].length = 0;\n }\n\n resetStorages.clear();\n }\n\n return storagesResults;\n}\n\nlet promise: ReturnType;\nexport default function loadStorages(storages: StoragesStorages) {\n return promise ??= loadStoragesInner(storages);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {logger} from '../logger';\nimport {AppManager} from './manager';\nimport createStorages from './utils/storages/createStorages';\nimport loadStorages from './utils/storages/loadStorages';\n\nexport class AppStoragesManager extends AppManager {\n private storages: ReturnType;\n\n // private loadPromise: CancellablePromise;\n\n private log: ReturnType;\n\n constructor() {\n super();\n\n this.log = logger('STORAGES');\n this.storages = createStorages();\n // this.loadPromise = deferredPromise();\n }\n\n public loadStorages() {\n return loadStorages(this.storages);\n // loadStorages(this.storages).then((storagesResults) => {\n // this.loadPromise.resolve(storagesResults);\n // });\n\n // return this.loadPromise;\n }\n\n // public setStoragesResults(storagesResults: StoragesResults) {\n // this.loadPromise.resolve(storagesResults);\n // }\n\n public async loadStorage(name: T) {\n return this.loadStorages().then((storagesResults) => {\n return {\n storage: this.storages[name],\n results: storagesResults[name]\n };\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Chat} from '../../../../layer';\nimport type {Dialog} from '../../appMessagesManager';\nimport type {User} from '../../appUsersManager';\nimport DATABASE_STATE from '../../../../config/databases/state';\nimport AppStorage from '../../../storage';\n\nexport type StoragesStorages = {\n users: AppStorage, typeof DATABASE_STATE>,\n chats: AppStorage, typeof DATABASE_STATE>,\n dialogs: AppStorage, typeof DATABASE_STATE>\n};\n\nexport default function createStorages() {\n const names: (keyof StoragesStorages)[] = ['users', 'chats', 'dialogs'];\n const storages: StoragesStorages = {} as any;\n for(const name of names) {\n // @ts-ignore\n storages[name] = new AppStorage(DATABASE_STATE, name);\n }\n\n return storages;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {AccountPassword, AccountUpdatePasswordSettings, InputCheckPasswordSRP, PasswordKdfAlgo} from '../../layer';\nimport randomize from '../../helpers/array/randomize';\nimport {AppManager} from '../appManagers/manager';\n\nexport class PasswordManager extends AppManager {\n public getState(): Promise {\n return this.apiManager.invokeApi('account.getPassword').then((result) => {\n return result;\n });\n }\n\n public updateSettings(settings: {\n hint?: string,\n email?: string,\n newPassword?: string,\n currentPassword?: string\n } = {}) {\n // state = Object.assign({}, state);\n // state.new_algo = Object.assign({}, state.new_algo);\n\n return this.getState().then((state) => {\n let currentHashPromise: Promise;\n let newHashPromise: Promise;\n const params: AccountUpdatePasswordSettings = {\n password: null,\n new_settings: {\n _: 'account.passwordInputSettings',\n hint: settings.hint,\n email: settings.email\n }\n };\n\n if(settings.currentPassword) {\n currentHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.currentPassword, state, false) as any;\n } else {\n currentHashPromise = Promise.resolve({\n _: 'inputCheckPasswordEmpty'\n });\n }\n\n // * https://core.telegram.org/api/srp#setting-a-new-2fa-password, but still there is a mistake, TDesktop passes 'new_algo' everytime\n const newAlgo = state.new_algo as PasswordKdfAlgo.passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow;\n const salt1 = new Uint8Array(newAlgo.salt1.length + 32);\n randomize(salt1);\n salt1.set(newAlgo.salt1, 0);\n newAlgo.salt1 = salt1;\n\n if(settings.newPassword) {\n newHashPromise = this.cryptoWorker.invokeCrypto('computeSRP', settings.newPassword, state, true) as any;\n } else {\n newHashPromise = Promise.resolve(new Uint8Array());\n }\n\n return Promise.all([currentHashPromise, newHashPromise]).then((hashes) => {\n params.password = hashes[0];\n params.new_settings.new_algo = newAlgo;\n params.new_settings.new_password_hash = hashes[1];\n\n return this.apiManager.invokeApi('account.updatePasswordSettings', params);\n });\n });\n }\n\n public getInputCheckPassword(password: string, state: AccountPassword) {\n return this.cryptoWorker.invokeCrypto('computeSRP', password, state, false) as Promise;\n }\n\n public check(password: string, state: AccountPassword, options: any = {}) {\n return this.getInputCheckPassword(password, state).then((inputCheckPassword) => {\n // console.log('SRP', inputCheckPassword);\n return this.apiManager.invokeApi('auth.checkPassword', {\n password: inputCheckPassword as InputCheckPasswordSRP.inputCheckPasswordSRP\n }, options).then((auth) => {\n if(auth._ === 'auth.authorization') {\n this.apiManager.setUser(auth.user);\n }\n\n return auth;\n });\n });\n }\n\n public confirmPasswordEmail(code: string) {\n return this.apiManager.invokeApi('account.confirmPasswordEmail', {code});\n }\n\n public resendPasswordEmail() {\n return this.apiManager.invokeApi('account.resendPasswordEmail');\n }\n\n public cancelPasswordEmail() {\n return this.apiManager.invokeApi('account.cancelPasswordEmail');\n }\n\n /* public requestRecovery(options: any = {}) {\n return apiManager.invokeApi('auth.requestPasswordRecovery', {}, options);\n }\n\n public recover(code: any, options: any = {}) {\n return apiManager.invokeApi('auth.recoverPassword', {\n code\n }, options);\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Photo} from '../../layer';\nimport {logger} from '../logger';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport {AppManager} from '../appManagers/manager';\nimport makeError from '../../helpers/makeError';\n\nexport type ReferenceContext = ReferenceContext.referenceContextProfilePhoto | ReferenceContext.referenceContextMessage | ReferenceContext.referenceContextEmojiesSounds | ReferenceContext.referenceContextReactions | ReferenceContext.referenceContextUserFull | ReferenceContext.referenceContextCustomEmoji | ReferenceContext.referenceContextAttachMenuBotIcon;\nexport namespace ReferenceContext {\n export type referenceContextProfilePhoto = {\n type: 'profilePhoto',\n peerId: PeerId\n };\n\n export type referenceContextMessage = {\n type: 'message',\n peerId: PeerId,\n messageId: number\n };\n\n export type referenceContextEmojiesSounds = {\n type: 'emojiesSounds'\n };\n\n export type referenceContextReactions = {\n type: 'reactions'\n };\n\n export type referenceContextUserFull = {\n type: 'userFull',\n userId: UserId\n };\n\n export type referenceContextCustomEmoji = {\n type: 'customEmoji',\n docId: DocId\n };\n\n export type referenceContextAttachMenuBotIcon = {\n type: 'attachMenuBotIcon',\n botId: BotId\n };\n}\n\nexport type ReferenceBytes = Photo.photo['file_reference'];\nexport type ReferenceContexts = Set;\n\n// type ReferenceBytes = Uint8Array;\n\nexport class ReferenceDatabase extends AppManager {\n private contexts: Map = new Map();\n // private references: Map = new Map();\n private links: {[hex: string]: ReferenceBytes} = {};\n private log = logger('RD', undefined, true);\n private refreshEmojiesSoundsPromise: Promise;\n\n // constructor() {\n // super();\n\n // apiManager.addTaskListener('refreshReference', (task: RefreshReferenceTask) => {\n // const originalPayload = task.payload;\n\n // assumeType(task);\n // task.originalPayload = originalPayload;\n\n // this.refreshReference(originalPayload).then((bytes) => {\n // task.payload = bytes;\n // }, (err) => {\n // task.error = err;\n // }).then(() => apiManager.postMessage(task));\n // });\n // }\n\n public saveContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(!contexts) {\n contexts = new Set();\n this.contexts.set(reference, contexts);\n }\n\n this.links[bytesToHex(reference)] = reference;\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n return;\n }\n }\n\n contexts.add(context);\n }\n\n public getReferenceByLink(reference: ReferenceBytes) {\n return this.links[bytesToHex(reference)];\n }\n\n public getContexts(reference: ReferenceBytes): [ReferenceContexts, ReferenceBytes] {\n const contexts = this.contexts.get(reference) || (reference = this.getReferenceByLink(reference) || reference, this.contexts.get(reference));\n return [contexts, reference];\n }\n\n public getContext(reference: ReferenceBytes): [ReferenceContext, ReferenceBytes] {\n const contexts = this.getContexts(reference);\n return contexts[0] ? [contexts[0].values().next().value, contexts[1]] : undefined;\n }\n\n public deleteContext(reference: ReferenceBytes, context: ReferenceContext, contexts?: ReferenceContexts) {\n [contexts, reference] = this.getContexts(reference);\n if(contexts) {\n for(const _context of contexts) {\n if(deepEqual(_context, context)) {\n contexts.delete(_context);\n if(!contexts.size) {\n this.contexts.delete(reference);\n delete this.links[bytesToHex(reference)];\n }\n return true;\n }\n }\n }\n\n return false;\n }\n\n public refreshReference(reference: ReferenceBytes, context?: ReferenceContext): Promise {\n this.log('refreshReference: start', reference.slice(), context);\n if(!context) {\n const c = this.getContext(reference);\n if(!c) {\n this.log('refreshReference: got no context for reference:', reference.slice());\n return Promise.reject('NO_CONTEXT');\n }\n\n [context, reference] = c;\n }\n\n let promise: Promise;\n switch(context?.type) {\n case 'message': {\n promise = this.appMessagesManager.reloadMessages(context.peerId, context.messageId, true);\n break;\n // .then(() => {\n // console.log('FILE_REFERENCE_EXPIRED: got message', context, appMessagesManager.getMessage((context as ReferenceContext.referenceContextMessage).messageId).media, reference);\n // });\n }\n\n case 'emojiesSounds': {\n promise = this.refreshEmojiesSoundsPromise || this.appStickersManager.getAnimatedEmojiSounds(true).then(() => {\n this.refreshEmojiesSoundsPromise = undefined;\n });\n break;\n }\n\n case 'userFull': {\n promise = Promise.resolve(this.appProfileManager.getProfile(context.userId, true));\n break;\n }\n\n case 'customEmoji': {\n promise = this.appEmojiManager.getCustomEmojiDocuments([context.docId]);\n break;\n }\n\n case 'attachMenuBotIcon': {\n promise = this.appAttachMenuBotsManager.getAttachMenuBot(context.botId, true) as any;\n break;\n }\n\n default: {\n this.log.warn('refreshReference: not implemented context', context);\n return Promise.reject();\n }\n }\n\n const hex = bytesToHex(reference);\n this.log('refreshReference: refreshing reference:', hex);\n return promise.then(() => {\n const newHex = bytesToHex(reference);\n this.log('refreshReference: refreshed, reference before:', hex, 'after:', newHex);\n if(hex !== newHex) {\n return reference;\n }\n\n this.deleteContext(reference, context);\n\n const newContext = this.getContext(reference);\n if(newContext) {\n return this.refreshReference(reference, newContext[0]);\n }\n\n this.log.error('refreshReference: no new context, reference before:', hex, 'after:', newHex, context);\n\n throw makeError('NO_NEW_CONTEXT');\n });\n }\n\n /* public replaceReference(oldReference: ReferenceBytes, newReference: ReferenceBytes) {\n const contexts = this.contexts.get(oldReference);\n if(contexts) {\n this.contexts.delete(oldReference);\n this.contexts.set(newReference, contexts);\n }\n } */\n}\n","export default function safeReplaceObject(wasObject: any, newObject: any) {\n if(!wasObject) {\n return newObject;\n }\n\n for(var key in wasObject) {\n if(!newObject.hasOwnProperty(key)) {\n delete wasObject[key];\n }\n }\n\n for(var key in newObject) {\n // if (newObject.hasOwnProperty(key)) { // useless\n wasObject[key] = newObject[key];\n // }\n }\n\n return wasObject;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Message, MessageAction, MessageMedia} from '../../../../layer';\nimport getPeerId from '../peers/getPeerId';\n\nexport default function getPeerIdsFromMessage(message: Message.message | Message.messageService) {\n const peerIds: number[] = [\n message.fromId,\n message.viaBotId,\n (message as Message.message).fwdFromId\n ];\n\n const media = (message as Message.message).media;\n if(media) {\n const contactUserId = (media as MessageMedia.messageMediaContact).user_id;\n if(contactUserId !== undefined) {\n peerIds.push(contactUserId.toPeerId());\n }\n\n const results = (media as MessageMedia.messageMediaPoll).results;\n const recentVoters = results?.recent_voters;\n if(recentVoters?.length) {\n peerIds.push(...recentVoters.map((userId) => userId.toPeerId()));\n }\n }\n\n const recentReactions = ((message as Message.message).reactions)?.recent_reactions;\n if(recentReactions?.length) {\n peerIds.push(...recentReactions.map((reaction) => getPeerId(reaction.peer_id)));\n }\n\n const action = (message as Message.messageService).action;\n if(action) {\n const userIds: UserId[] = [\n ...((action as MessageAction.messageActionChatAddUser).users || []),\n (action as MessageAction.messageActionChatDeleteUser).user_id,\n (action as MessageAction.messageActionChatJoinedByLink).inviter_id\n ];\n peerIds.push(...userIds.filter(Boolean).map((userId) => userId.toPeerId()));\n\n const chatIds: ChatId[] = [\n (action as MessageAction.messageActionChatMigrateTo).channel_id,\n (action as MessageAction.messageActionChannelMigrateFrom).chat_id\n ];\n peerIds.push(...chatIds.filter(Boolean).map((chatId) => chatId.toPeerId(true)));\n }\n\n const recentRepliers = ((message as Message.message).replies)?.recent_repliers;\n if(recentRepliers?.length) {\n peerIds.push(...recentRepliers.map((reply) => getPeerId(reply)));\n }\n\n return new Set(peerIds.filter(Boolean));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ForumTopic} from '../../../../layer';\nimport type {Dialog} from '../../appMessagesManager';\nimport type getDialogIndexKey from './getDialogIndexKey';\n\nexport default function setDialogIndex(\n dialog: Dialog | ForumTopic.forumTopic,\n indexKey: ReturnType,\n index: number\n) {\n return (dialog as Dialog)[indexKey] = index;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {Chat, ForumTopic as MTForumTopic, DialogPeer, Message, MessageAction, MessageMedia, MessagesForumTopics, MessagesPeerDialogs, Update} from '../../layer';\nimport type {Dialog, ForumTopic, MyMessage} from '../appManagers/appMessagesManager';\nimport tsNow from '../../helpers/tsNow';\nimport SearchIndex from '../searchIndex';\nimport {SliceEnd} from '../../helpers/slicedArray';\nimport {MyDialogFilter} from './filters';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, NULL_PEER_ID, REAL_FOLDERS, REAL_FOLDER_ID} from '../mtproto/mtproto_config';\nimport {MaybePromise, NoneToVoidFunction} from '../../types';\nimport ctx from '../../environment/ctx';\nimport AppStorage from '../storage';\nimport type DATABASE_STATE from '../../config/databases/state';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport getServerMessageId from '../appManagers/utils/messageId/getServerMessageId';\nimport generateMessageId from '../appManagers/utils/messageId/generateMessageId';\nimport {AppManager} from '../appManagers/manager';\nimport getDialogIndexKey from '../appManagers/utils/dialogs/getDialogIndexKey';\nimport isObject from '../../helpers/object/isObject';\nimport getDialogIndex from '../appManagers/utils/dialogs/getDialogIndex';\nimport getPeerIdsFromMessage from '../appManagers/utils/messages/getPeerIdsFromMessage';\nimport {AppStoragesManager} from '../appManagers/appStoragesManager';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport setDialogIndex from '../appManagers/utils/dialogs/setDialogIndex';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\nimport {BroadcastEvents} from '../rootScope';\nimport assumeType from '../../helpers/assumeType';\nimport makeError from '../../helpers/makeError';\nimport callbackify from '../../helpers/callbackify';\n\nexport type FolderDialog = {\n dialog: Dialog,\n index: number\n};\n\nexport type Folder = {\n dialogs: (Dialog | ForumTopic)[],\n id: number,\n unreadMessagesCount: number,\n unreadPeerIds: Set,\n unreadUnmutedPeerIds: Set,\n dispatchUnreadTimeout?: number\n};\n\nexport const GLOBAL_FOLDER_ID: REAL_FOLDER_ID = undefined;\n\n// let spentTime = 0;\nexport default class DialogsStorage extends AppManager {\n private storage: AppStoragesManager['storages']['dialogs'];\n\n private dialogs: {[peerId: PeerId]: Dialog};\n\n private folders: {[folderId: number]: Folder};\n\n private allDialogsLoaded: {[folder_id: number]: boolean};\n private dialogsOffsetDate: {[folder_id: number]: number};\n private pinnedOrders: {[folder_id: number]: PeerId[]};\n private dialogsNum: number;\n\n private dialogsIndex: SearchIndex;\n\n private cachedResults: {\n query: string,\n count: number,\n dialogs: Dialog[],\n folderId: number\n };\n\n private forumTopics: Map,\n deletedTopics: Set,\n getTopicPromises: Map>,\n getTopicsPromise?: Promise\n }>;\n\n protected after() {\n this.clear(true);\n\n this.rootScope.addEventListener('language_change', () => {\n const peerId = this.appUsersManager.getSelf().id.toPeerId(false);\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n });\n\n const onFilterUpdate = (filter: MyDialogFilter) => {\n const dialogs = this.getCachedDialogs(false);\n for(let i = 0; i < dialogs.length; ++i) {\n this.processDialogForFilter(dialogs[i], filter);\n }\n };\n\n this.rootScope.addEventListener('filter_order', () => {\n const dialogs = this.getCachedDialogs(false);\n // const indexKeys: ReturnType[] = [];\n for(const filterId in this.folders) {\n if(+filterId > 1) {\n delete this.folders[filterId];\n }\n\n // indexKeys.push(this.getDialogIndexKey(+filterId));\n }\n\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n // for(const indexKey of indexKeys) {\n // delete dialog[indexKey];\n // }\n\n this.processDialogForFilters(dialog);\n }\n });\n\n this.rootScope.addEventListener('filter_update', onFilterUpdate);\n this.rootScope.addEventListener('filter_new', onFilterUpdate);\n\n this.rootScope.addEventListener('filter_delete', (filter) => {\n const dialogs = this.getCachedDialogs(false);\n\n const indexKey = this.getDialogIndexKeyByFilterId(filter.id);\n for(let i = 0; i < dialogs.length; ++i) {\n const dialog = dialogs[i];\n delete dialog[indexKey];\n }\n\n delete this.folders[filter.id];\n });\n\n this.rootScope.addEventListener('dialog_notify_settings', (dialog) => {\n this.processChangedUnreadOrUnmuted(dialog.peerId);\n });\n\n this.rootScope.addEventListener('chat_update', (chatId) => {\n const chat = this.appChatsManager.getChat(chatId);\n\n const peerId = chatId.toPeerId(true);\n if((chat as Chat.chat).pFlags.left && this.getDialogOnly(peerId)) {\n this.dropDialogOnDeletion(peerId);\n }\n });\n\n this.rootScope.addEventListener('chat_toggle_forum', ({chatId, enabled}) => {\n const peerId = chatId.toPeerId(true);\n if(!enabled) {\n this.flushForumTopicsCache(peerId);\n }\n\n this.processChangedUnreadOrUnmuted(peerId);\n });\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateFolderPeers: this.onUpdateFolderPeers,\n\n updateDialogPinned: this.onUpdateDialogPinned,\n\n updateChannelPinnedTopic: this.onUpdateChannelPinnedTopic,\n\n updatePinnedDialogs: this.onUpdatePinnedDialogs,\n\n updateChannelPinnedTopics: this.onUpdateChannelPinnedTopics\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('dialogs')\n ]).then(([state, {results: dialogs, storage}]) => {\n this.storage = storage;\n this.dialogs = this.storage.getCache();\n\n for(const folderId of REAL_FOLDERS) {\n const order = state.pinnedOrders[folderId];\n if(!order) {\n continue;\n }\n\n const _order = this.getPinnedOrders(folderId);\n _order.splice(0, _order.length, ...order);\n }\n\n if(dialogs.length) {\n AppStorage.freezeSaving(this.setDialogsFromState.bind(this, dialogs), ['chats', 'dialogs', 'messages', 'users']);\n }\n\n this.allDialogsLoaded = state.allDialogsLoaded || {};\n\n if(dialogs.length) {\n this.appDraftsManager.addMissedDialogs();\n }\n });\n }\n\n private setDialogsFromState(dialogs: Dialog[]) {\n for(let i = 0, length = dialogs.length; i < length; ++i) {\n const dialog = dialogs[i];\n if(!dialog) {\n continue;\n }\n\n // if(dialog.peerId !== SERVICE_PEER_ID) {\n dialog.top_message = getServerMessageId(dialog.top_message); // * fix outgoing message to avoid copying dialog\n // }\n\n if(dialog.topMessage) {\n this.appMessagesManager.saveMessages([dialog.topMessage]);\n }\n\n for(let i = 0; i <= 21; ++i) {\n const indexKey: ReturnType = `index_${i}` as any;\n delete dialog[indexKey];\n }\n // delete dialog.indexes;\n\n this.saveDialog({\n dialog,\n ignoreOffsetDate: true\n });\n\n // ! WARNING, убрать это когда нужно будет делать чтобы pending сообщения сохранялись\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(!message) {\n this.appMessagesManager.reloadConversation(dialog.peerId);\n }\n }\n }\n\n public isDialogsLoaded(folderId: number) {\n return !!this.allDialogsLoaded[folderId];\n }\n\n public setDialogsLoaded(folderId: number, loaded: boolean) {\n const isForum = this.isFilterIdForForum(folderId);\n\n if(folderId === GLOBAL_FOLDER_ID && loaded) {\n this.allDialogsLoaded[FOLDER_ID_ALL] = loaded;\n this.allDialogsLoaded[FOLDER_ID_ARCHIVE] = loaded;\n } else {\n if(isForum) {\n defineNotNumerableProperties(this.allDialogsLoaded, [folderId]);\n }\n\n this.allDialogsLoaded[folderId] = loaded;\n }\n\n if(isForum) {\n return;\n }\n\n if(Array.from(REAL_FOLDERS).every((folderId) => this.allDialogsLoaded[folderId])) {\n this.allDialogsLoaded[GLOBAL_FOLDER_ID] = true;\n }\n\n this.saveAllDialogsLoaded();\n }\n\n private saveAllDialogsLoaded() {\n this.appStateManager.pushToState('allDialogsLoaded', this.allDialogsLoaded);\n }\n\n public clear = (init = false) => {\n if(!init) {\n this.storage.clear();\n\n this.allDialogsLoaded = {};\n this.saveAllDialogsLoaded();\n\n // * clear not numerable properties\n this.pinnedOrders = Object.assign({}, this.pinnedOrders);\n for(const folderId of REAL_FOLDERS) {\n this.resetPinnedOrder(folderId);\n }\n this.savePinnedOrders();\n } else {\n this.allDialogsLoaded = {};\n this.pinnedOrders = {};\n for(const folderId of REAL_FOLDERS) {\n this.pinnedOrders[folderId] = [];\n }\n }\n\n this.forumTopics = new Map();\n this.folders = {};\n this.dialogsOffsetDate = {};\n this.dialogsNum = 0;\n this.dialogsIndex = new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n this.cachedResults = {\n query: '',\n count: 0,\n dialogs: [],\n folderId: 0\n };\n };\n\n public handleDialogUnpinning(dialog: Dialog | ForumTopic, folderId: number) {\n delete dialog.pFlags.pinned;\n indexOfAndSplice(this.getPinnedOrders(folderId), this.isFilterIdForForum(folderId) ? (dialog as ForumTopic).id : dialog.peerId);\n this.savePinnedOrders();\n }\n\n public savePinnedOrders() {\n this.appStateManager.pushToState('pinnedOrders', this.pinnedOrders);\n }\n\n public resetPinnedOrder(folderId: number) {\n this.getPinnedOrders(folderId).length = 0;\n }\n\n public getPinnedOrders(folderId: number) {\n let orders = this.pinnedOrders[folderId];\n if(!orders && this.isFilterIdForForum(folderId)) {\n defineNotNumerableProperties(this.pinnedOrders, [folderId]);\n orders = this.pinnedOrders[folderId] = [];\n }\n\n return orders;\n }\n\n public isDialogPinned(peerId: PeerId, folderId: number) {\n const filter = this.filtersStorage.getFilter(folderId);\n let isPinned: boolean;\n if(filter) {\n isPinned = filter.pinnedPeerIds.indexOf(peerId) !== -1;\n } else {\n isPinned = !!this.getDialogOnly(peerId).pFlags.pinned;\n }\n\n return isPinned;\n }\n\n public getOffsetDate(folderId: number): number {\n const offsetDate = this.dialogsOffsetDate[folderId] || 0;\n if(folderId === GLOBAL_FOLDER_ID && !offsetDate) { // make request not from beginning if we have loaded some dialogs\n return Math.min(...Array.from(REAL_FOLDERS).sort((a, b) => a - b));\n }\n\n return offsetDate;\n }\n\n private generateFolder(id: number) {\n const folder: Folder = {\n dialogs: [],\n id,\n unreadMessagesCount: 0,\n unreadPeerIds: new Set(),\n unreadUnmutedPeerIds: new Set()\n };\n\n defineNotNumerableProperties(folder, ['dispatchUnreadTimeout']);\n\n return folder;\n }\n\n public getFolder(id: number) {\n return this.folders[id] ??= this.generateFolder(id);\n }\n\n public isFilterIdForForum(filterId: number) {\n return filterId && filterId < 0;\n }\n\n public getFilterIdForForum(forumTopic: ForumTopic) {\n return forumTopic.peerId;\n }\n\n public getDialogKey(dialog: Dialog | ForumTopic) {\n return this.isTopic(dialog) ? dialog.id : dialog.peerId;\n }\n\n public getFolderDialogs(id: number, skipMigrated = true): Folder['dialogs'] {\n if(id === GLOBAL_FOLDER_ID) { // * it won't be sorted\n return this.getCachedDialogs(skipMigrated);\n }\n\n const folder = this.getFolder(id);\n if(this.isFilterIdForForum(id)) {\n return skipMigrated ? folder.dialogs.filter((forumTopic) => !(forumTopic as ForumTopic).pFlags.hidden) : folder.dialogs;\n }\n\n return skipMigrated ? folder.dialogs.filter((dialog) => (dialog as Dialog).migratedTo === undefined) : folder.dialogs;\n }\n\n public getNextDialog(currentPeerId: PeerId, next: boolean, filterId: number) {\n const folder = this.getFolderDialogs(filterId, true);\n let dialog: Folder['dialogs'][0];\n if(!currentPeerId) {\n if(next) {\n dialog = folder[0];\n }\n } else {\n const idx = folder.findIndex((dialog) => dialog.peerId === currentPeerId);\n if(idx !== -1) {\n const nextIndex = next ? idx + 1 : idx - 1;\n dialog = folder[nextIndex];\n }\n }\n\n return dialog;\n }\n\n public getDialogIndexKeyByFilterId(filterId: number) {\n if(this.isFilterIdForForum(filterId)) return getDialogIndexKey();\n if(REAL_FOLDERS.has(filterId)) return getDialogIndexKey(filterId as REAL_FOLDER_ID);\n const filter = this.filtersStorage.getFilter(filterId);\n return getDialogIndexKey(filter.localId);\n }\n\n private isDialogUnmuted(dialog: Dialog | ForumTopic) {\n return !this.appNotificationsManager.isPeerLocalMuted({\n peerId: dialog.peerId,\n respectType: true,\n threadId: this.isTopic(dialog) ? (dialog as ForumTopic).id : undefined\n });\n }\n\n public getFolderUnreadCount(filterId: number) {\n const folder = this.getFolder(filterId);\n return {unreadUnmutedCount: folder.unreadUnmutedPeerIds.size, unreadCount: folder.unreadPeerIds.size};\n }\n\n public getCachedDialogs(skipMigrated?: boolean) {\n const arrays = Array.from(REAL_FOLDERS).map((folderId) => this.getFolderDialogs(folderId, skipMigrated));\n return [].concat(...arrays) as Dialog[];\n }\n\n private setDialogIndexInFilter(\n dialog: Dialog | ForumTopic,\n indexKey: ReturnType,\n filter?: MyDialogFilter\n ) {\n // if(this.isTopic(dialog)) {\n // return dialog['index_0'];\n // }\n\n let index: number;\n\n const isTopic = this.isTopic(dialog);\n const isRealFolder = isTopic || REAL_FOLDERS.has(filter.id);\n /* if(isRealFolder) {\n // index = getDialogIndex(dialog, indexKey);\n index = this.generateIndexForDialog(dialog, true);\n } else */if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n const pinnedIds = isTopic ?\n this.getPinnedOrders(this.getFilterIdForForum(dialog)) :\n filter.pinnedPeerIds;\n\n const pinnedKey = this.getDialogKey(dialog);\n const pinnedIndex = pinnedIds.indexOf(pinnedKey);\n\n if(pinnedIndex !== -1) {\n index = this.generateDialogIndex(this.generateDialogPinnedDateByIndex(pinnedIds.length - 1 - pinnedIndex), true);\n } else if(dialog.pFlags?.pinned || isRealFolder) {\n index = this.generateIndexForDialog(dialog, true, undefined, !isRealFolder);\n } else {\n index = getDialogIndex(dialog) ?? this.generateIndexForDialog(dialog, true);\n }\n }\n\n // if(!dialog.hasOwnProperty(indexKey)) {\n // defineNotNumerableProperties(dialog, [indexKey]);\n // }\n\n return setDialogIndex(dialog, indexKey, index);\n }\n\n public getDialog(peerId: PeerId, folderId?: number, topicId?: number, skipMigrated = true): [Folder['dialogs'][0], number] | [] {\n const folders: Folder['dialogs'][] = [];\n\n if(topicId) {\n folderId = peerId;\n // skipMigrated = false;\n }\n\n if(folderId === undefined) {\n folders.push(...Array.from(REAL_FOLDERS).map((folderId) => this.getFolder(folderId).dialogs as Dialog[]));\n } else {\n folders.push(this.getFolderDialogs(folderId, false) as Dialog[]);\n }\n\n const verify: (d: Folder['dialogs'][0]) => boolean = topicId ?\n (d) => (d as ForumTopic).id === topicId :\n (d) => (d as Dialog).peerId === peerId;\n for(const folder of folders) {\n let i = 0, skipped = 0;\n for(let length = folder.length; i < length; ++i) {\n const dialog = folder[i];\n if(verify(dialog)) {\n return [dialog, i - skipped];\n } else if(skipMigrated && ((dialog as ForumTopic).pFlags.hidden || (dialog as Dialog).migratedTo !== undefined)) {\n ++skipped;\n }\n }\n }\n\n return [];\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogs[peerId];\n }\n\n public getDialogOrTopic(peerId: PeerId, topicId?: number) {\n return topicId ? this.getForumTopic(peerId, topicId) : this.dialogs[peerId];\n }\n\n public getDialogIndex(\n peerId: PeerId | Parameters[0],\n indexKey: ReturnType,\n topicId?: number\n ) {\n const dialog = isObject(peerId) ? peerId : this.getDialogOrTopic(peerId, topicId);\n return getDialogIndex(dialog, indexKey);\n }\n\n /*\n var date = Date.now() / 1000 | 0;\n var m = date * 0x10000;\n\n var k = (date + 1) * 0x10000;\n k - m;\n 65536\n */\n public generateDialogIndex(date?: number, isPinned?: boolean) {\n date ??= tsNow(true) + this.timeManager.getServerTimeOffset();\n return (date * 0x10000) + (isPinned ? 0 : (++this.dialogsNum & 0xFFFF));\n }\n\n // public makeFilterForTopics(id: number): MyDialogFilter {\n // return {\n // _: 'dialogFilter',\n // id,\n\n // };\n // }\n\n public isTopic(dialog: Dialog | ForumTopic): dialog is ForumTopic {\n return 'id' in dialog;\n }\n\n public processDialogForFilters(dialog: Dialog | ForumTopic, noIndex?: boolean) {\n // let perf = performance.now();\n if(this.isTopic(dialog)) {\n this.processDialogForFilter(dialog, undefined, noIndex);\n return;\n }\n\n const filters = this.filtersStorage.getFilters();\n for(const id in filters) {\n const filter = filters[id];\n this.processDialogForFilter(dialog, filter, noIndex);\n }\n // spentTime += (performance.now() - perf);\n // console.log('generate index time:', spentTime);\n }\n\n public processDialogForFilter(\n dialog: Dialog | ForumTopic,\n filter?: MyDialogFilter,\n noIndex?: boolean\n ) {\n const isTopic = this.isTopic(dialog);\n const folderId = isTopic ? this.getFilterIdForForum(dialog) : filter.id;\n\n const indexKey = isTopic ? 'index_0' : this.getDialogIndexKeyByFilterId(folderId);\n const folder = this.getFolder(folderId);\n const dialogs = folder.dialogs;\n\n const cmp: (d: typeof dialog) => boolean = isTopic ?\n ((d: ForumTopic) => d.id === dialog.id) as any :\n ((d: Dialog) => d.peerId === dialog.peerId) as any;\n const wasIndex = dialogs.findIndex(cmp);\n const wasDialog = dialogs[wasIndex];\n const wasDialogIndex = this.getDialogIndex(wasDialog, indexKey);\n\n if(noIndex && folderId > FOLDER_ID_ARCHIVE) {\n noIndex = undefined;\n }\n\n const newDialogIndex = noIndex ? undefined : this.setDialogIndexInFilter(dialog, indexKey, filter);\n\n if(wasDialogIndex === newDialogIndex) {\n return false;\n }\n\n if(!!wasDialogIndex !== !!newDialogIndex) {\n this.prepareFolderUnreadCountModifyingByDialog(folderId, dialog, !!newDialogIndex);\n }\n\n if(wasIndex !== -1) {\n dialogs.splice(wasIndex, 1);\n }\n\n if(newDialogIndex) {\n insertInDescendSortedArray(dialogs, dialog, (dialog) => this.getDialogIndex(dialog, indexKey), -1);\n }\n\n return true;\n }\n\n public prepareDialogUnreadCountModifying(dialog: Dialog | ForumTopic, toggle?: boolean) {\n const isTopic = this.isTopic(dialog);\n const callbacks: NoneToVoidFunction[] = [];\n\n const folderId = isTopic ? this.getFilterIdForForum(dialog) : dialog.folder_id;\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(folderId, dialog, toggle));\n\n if(!isTopic) {\n const filters = this.filtersStorage.getFilters();\n for(const id in filters) {\n const filter = filters[id];\n if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n callbacks.push(this.prepareFolderUnreadCountModifyingByDialog(filter.id, dialog, toggle));\n }\n }\n }\n\n return () => !toggle && callbacks.forEach((callback) => callback());\n }\n\n public prepareFolderUnreadCountModifyingByDialog(folderId: number, dialog: Dialog | ForumTopic, toggle?: boolean) {\n const wasUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const wasUnmuted = this.isDialogUnmuted(dialog);\n\n if(toggle !== undefined) {\n const addMessagesCount = toggle ? wasUnreadCount : -wasUnreadCount;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, !!wasUnreadCount, wasUnreadCount && wasUnmuted, dialog);\n return;\n }\n\n return () => {\n const newUnreadCount = this.appMessagesManager.getDialogUnreadCount(dialog);\n const newUnmuted = this.isDialogUnmuted(dialog);\n\n const addMessagesCount = newUnreadCount - wasUnreadCount;\n this.modifyFolderUnreadCount(folderId, addMessagesCount, !!newUnreadCount, newUnreadCount && newUnmuted, dialog);\n };\n }\n\n public modifyFolderUnreadCount(\n folderId: number,\n addMessagesCount: number,\n toggleDialog: boolean,\n toggleUnmuted: boolean,\n dialog: Dialog | ForumTopic\n ) {\n const {peerId} = dialog;\n const isForum = this.appPeersManager.isForum(peerId);\n const isTopic = this.isTopic(dialog);\n if(isForum && !isTopic) {\n const forumUnreadCount = this.getForumUnreadCount(peerId);\n if(forumUnreadCount instanceof Promise) {\n forumUnreadCount.then(({count, hasUnmuted}) => {\n dialog = this.getDialogOnly(peerId);\n const folder = this.getFolder(folderId);\n if(\n !dialog ||\n !this.appPeersManager.isForum(peerId) ||\n !folder ||\n !folder.dialogs.some((dialog) => dialog.peerId === peerId)\n ) {\n return;\n }\n\n this.modifyFolderUnreadCount(folderId, 0, false, false, dialog);\n });\n\n return;\n } else {\n addMessagesCount = 0;\n toggleDialog = forumUnreadCount.count > 0;\n toggleUnmuted = forumUnreadCount.hasUnmuted;\n }\n }\n\n const folder = this.getFolder(folderId);\n if(addMessagesCount) {\n folder.unreadMessagesCount = Math.max(0, folder.unreadMessagesCount + addMessagesCount);\n }\n\n const key = this.getDialogKey(dialog);\n if(toggleDialog) {\n folder.unreadPeerIds.add(key);\n } else {\n folder.unreadPeerIds.delete(key);\n }\n\n if(toggleUnmuted) {\n folder.unreadUnmutedPeerIds.add(key);\n } else {\n folder.unreadUnmutedPeerIds.delete(key);\n }\n\n folder.dispatchUnreadTimeout ??= ctx.setTimeout(() => {\n folder.dispatchUnreadTimeout = undefined;\n const _folder = {...folder};\n delete _folder.dialogs;\n this.rootScope.dispatchEvent('folder_unread', _folder);\n\n if(isTopic) { // * refresh forum dialog unread count\n this.processChangedUnreadOrUnmuted(peerId);\n }\n }, 0);\n }\n\n public processChangedUnreadOrUnmuted(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n this.processDialogForFilters(dialog);\n this.prepareDialogUnreadCountModifying(dialog)();\n this.rootScope.dispatchEvent('dialog_unread', {\n peerId,\n dialog\n });\n }\n }\n\n public generateIndexForDialog(\n dialog: Dialog | ForumTopic,\n justReturn?: boolean,\n message?: MyMessage,\n noPinnedOrderUpdate?: boolean\n ) {\n if(!justReturn/* && !isTopic */) {\n return;\n }\n\n const isTopic = this.isTopic(dialog);\n let topDate = 0, isPinned: boolean;\n if((dialog as ForumTopic).pFlags.hidden) { // general topic must be first\n topDate = this.generateDialogPinnedDateByIndex(0xFFF);\n isPinned = true;\n } else if(dialog.pFlags.pinned && !noPinnedOrderUpdate) {\n topDate = this.generateDialogPinnedDate(dialog);\n isPinned = true;\n } else {\n message ||= this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n\n topDate = (message as Message.message)?.date || topDate;\n\n if(!isTopic) {\n const channelId = this.appPeersManager.isChannel(dialog.peerId) && dialog.peerId.toChatId();\n if(channelId) {\n const channel = this.appChatsManager.getChat(channelId) as Chat.channel;\n if(!topDate || (channel.date && channel.date > topDate)) {\n topDate = channel.date;\n }\n }\n }\n\n if(dialog.draft?._ === 'draftMessage' && dialog.draft.date > topDate) {\n topDate = dialog.draft.date;\n }\n }\n\n topDate ||= tsNow(true);\n\n const index = this.generateDialogIndex(topDate, isPinned);\n if(justReturn) {\n return index;\n }\n\n const indexKey = getDialogIndexKey((dialog as Dialog).folder_id);\n setDialogIndex(dialog, indexKey, index);\n }\n\n public generateDialogPinnedDateByIndex(pinnedIndex: number) {\n return 0x7fff0000 + (pinnedIndex & 0xFFFF); // 0xFFFF - потому что в папках может быть бесконечное число пиннедов\n }\n\n public generateDialogPinnedDate(dialog: Dialog | ForumTopic) {\n const isTopic = this.isTopic(dialog);\n const order = this.getPinnedOrders(isTopic ? this.getFilterIdForForum(dialog) : dialog.folder_id);\n\n const dialogKey = this.getDialogKey(dialog);\n let pinnedIndex = order.indexOf(dialogKey);\n if(pinnedIndex === -1) {\n order.unshift(dialogKey);\n pinnedIndex = 0;\n\n if(!isTopic) {\n this.savePinnedOrders();\n }\n }\n\n return this.generateDialogPinnedDateByIndex(order.length - 1 - pinnedIndex);\n }\n\n /* public generateDialog(peerId: PeerId) {\n const dialog: Dialog = {\n _: 'dialog',\n pFlags: {},\n peer: this.appPeersManager.getOutputPeer(peerId),\n top_message: 0,\n read_inbox_max_id: 0,\n read_outbox_max_id: 0,\n unread_count: 0,\n unread_mentions_count: 0,\n notify_settings: {\n _: 'peerNotifySettings',\n },\n };\n\n return dialog;\n } */\n\n public setDialogToState(dialog: Dialog | ForumTopic) {\n if(this.isTopic(dialog)) {\n return;\n }\n\n const {peerId, pts} = dialog;\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId);\n const messagesStorage = this.appMessagesManager.getHistoryMessagesStorage(peerId);\n const history = historyStorage.history.slice;\n let incomingMessage: MyMessage;\n for(let i = 0, length = history.length; i < length; ++i) {\n const mid = history[i];\n const message: MyMessage = this.appMessagesManager.getMessageFromStorage(messagesStorage, mid);\n if(message && !message.pFlags.is_outgoing/* || peerId === SERVICE_PEER_ID */) {\n incomingMessage = message;\n\n const peerIds = getPeerIdsFromMessage(message);\n this.peersStorage.requestPeersForKey(peerIds, `topMessage_${peerId}`);\n\n break;\n }\n }\n\n dialog.topMessage = incomingMessage;\n\n // DO NOT TOUCH THESE LINES, SOME REAL MAGIC HERE.\n // * Read service chat when refreshing page with outgoing & getting new service outgoing message\n /* if(incomingMessage && dialog.read_inbox_max_id >= dialog.top_message) {\n dialog.unread_count = 0;\n }\n\n dialog.read_inbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = this.appMessagesIdsManager.clearMessageId(dialog.read_outbox_max_id); */\n // CAN TOUCH NOW\n\n if(peerId.isAnyChat() && pts) {\n const newPts = this.apiUpdatesManager.getChannelState(peerId.toChatId(), pts).pts;\n dialog.pts = newPts;\n }\n\n this.storage.set({\n [peerId]: dialog\n });\n\n this.peersStorage.requestPeer(peerId, 'dialog');\n\n /* for(let id in this.filtersStorage.filters) {\n const filter = this.filtersStorage.filters[id];\n\n if(this.filtersStorage.testDialogForFilter(dialog, filter)) {\n\n }\n } */\n }\n\n public pushDialog({dialog, offsetDate, ignoreOffsetDate, saveGlobalOffset}: {\n dialog: Dialog | ForumTopic,\n offsetDate?: number,\n ignoreOffsetDate?: boolean,\n saveGlobalOffset?: boolean\n }) {\n const isTopic = this.isTopic(dialog);\n const {folder_id, peerId} = dialog as Dialog;\n\n if(isTopic) {\n const forumTopics = this.getForumTopicsCache(peerId);\n forumTopics.topics.set(dialog.id, dialog);\n } else {\n this.dialogs[peerId] = dialog;\n }\n\n offsetDate ??= this.getDialogOffsetDate(dialog);\n\n // if(!isTopic) {\n this.processDialogForFilters(dialog);\n // }\n\n if(offsetDate && !dialog.pFlags.pinned) {\n if(!isTopic && saveGlobalOffset) {\n const savedGlobalOffsetDate = this.dialogsOffsetDate[GLOBAL_FOLDER_ID];\n if(!savedGlobalOffsetDate || offsetDate < savedGlobalOffsetDate) {\n this.dialogsOffsetDate[GLOBAL_FOLDER_ID] = offsetDate;\n }\n }\n\n const folderId = isTopic ? this.getFilterIdForForum(dialog) : folder_id;\n const savedOffsetDate = this.dialogsOffsetDate[folderId];\n if(!savedOffsetDate || offsetDate < savedOffsetDate) {\n // if(pos !== -1) {\n if(!ignoreOffsetDate && !this.isDialogsLoaded(folderId)) {\n this.dropDialog(peerId, isTopic ? this.getDialogKey(dialog) : undefined, true);\n return;\n }\n\n this.dialogsOffsetDate[folderId] = offsetDate;\n }\n }\n\n this.setDialogToState(dialog);\n\n // if(pos === -1) {\n // this.prepareFolderUnreadCountModifyingByDialog(folder_id, dialog, true);\n // }\n\n // const indexKey = getDialogIndexKey(folder_id);\n // /* const newPos = */insertInDescendSortedArray(dialogs, dialog, (dialog) => getDialogIndex(dialog, indexKey), -1);\n /* if(pos !== -1 && pos !== newPos) {\n rootScope.dispatchEvent('dialog_order', {dialog, pos: newPos});\n } */\n }\n\n public dropDialogFromFolders(peerId: PeerId, topicId?: number) {\n const foundDialog = this.getDialog(peerId, undefined, topicId, false);\n const [dialog, index] = foundDialog;\n if(dialog) {\n const filterId = topicId ?\n this.getFilterIdForForum(dialog as ForumTopic) :\n (dialog as Dialog).folder_id;\n\n // const folder = this.getFolder(filterId);\n // folder.dialogs.splice(index, 1);\n const wasPinned = indexOfAndSplice(this.getPinnedOrders(filterId), this.getDialogKey(dialog)) !== undefined;\n\n this.processDialogForFilters(dialog, true);\n\n this.dialogsIndex.indexObject(peerId, '');\n\n if(wasPinned) {\n this.savePinnedOrders();\n }\n }\n\n return foundDialog;\n }\n\n public dropDialog(peerId: PeerId, topicId?: number, keepLocal?: boolean) {\n const dialog = this.getDialogOrTopic(peerId, topicId);\n const foundDialog = this.dropDialogFromFolders(peerId, topicId);\n if(dialog) {\n if(!keepLocal) {\n if(topicId) {\n this.getForumTopicsCache(peerId).topics.delete(topicId);\n } else {\n delete this.dialogs[peerId];\n }\n }\n\n this.clearDialogFromState(dialog, keepLocal);\n }\n\n return foundDialog;\n }\n\n public clearDialogFromState(dialog: Dialog | ForumTopic, keepLocal: boolean) {\n if(dialog._ === 'forumTopic') {\n return;\n }\n\n const {peerId} = dialog;\n this.peersStorage.requestPeersForKey([], `topMessage_${peerId}`);\n this.peersStorage.releasePeer(peerId, 'dialog');\n this.storage.delete(peerId, keepLocal);\n }\n\n public dropDialogWithEvent(peerId: PeerId, topicId?: number) {\n const dropped = this.dropDialog(peerId, topicId);\n if(dropped.length) {\n this.rootScope.dispatchEvent('dialog_drop', dropped[0]);\n }\n\n return dropped;\n }\n\n /**\n * leaving chat, leaving channel, deleting private dialog\n */\n public dropDialogOnDeletion(peerId: PeerId, topicId?: number) {\n this.dropDialogWithEvent(peerId, topicId);\n this.rootScope.dispatchEvent('peer_deleted', peerId);\n }\n\n public applyDialogs(result: MessagesPeerDialogs | MessagesForumTopics, peerId?: PeerId) {\n // * В эту функцию попадут только те диалоги, в которых есть read_inbox_max_id и read_outbox_max_id, в отличие от тех, что будут в getTopMessages\n\n const isForum = result._ === 'messages.forumTopics';\n const items = (result as MessagesPeerDialogs).dialogs || (result as MessagesForumTopics).topics;\n if(!isForum) {\n // ! fix 'dialogFolder', maybe there is better way to do it, this only can happen by 'messages.getPinnedDialogs' by folder_id: 0\n forEachReverse(result.dialogs, (dialog, idx) => {\n if(dialog._ === 'dialogFolder') {\n result.dialogs.splice(idx, 1);\n }\n });\n } else {\n this.processTopics(peerId, result);\n }\n\n assumeType(items);\n\n this.appUsersManager.saveApiUsers(result.users);\n this.appChatsManager.saveApiChats(result.chats);\n this.appMessagesManager.saveMessages(result.messages);\n\n // this.appMessagesManager.log('applyConversation', dialogsResult);\n\n const updatedDialogs: BroadcastEvents['dialogs_multiupdate'] = new Map();\n const getUpdateCache = (peerId: PeerId) => {\n let cache = updatedDialogs.get(peerId);\n if(!cache) {\n updatedDialogs.set(peerId, cache = {});\n }\n\n return cache;\n };\n\n items.forEach((dialog) => {\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n let topMid = dialog.top_message;\n\n const topPendingMid = this.appMessagesManager.pendingTopMsgs[peerId];\n if(topPendingMid) {\n const topPendingMessage = this.appMessagesManager.getMessageByPeer(peerId, topPendingMid) as MyMessage;\n const topMessage = this.appMessagesManager.getMessageByPeer(peerId, topMid) as MyMessage;\n if(!topMid || (topPendingMessage && (!topMessage || topPendingMessage?.date > topMessage?.date))) {\n dialog.top_message = topMid = topPendingMid;\n this.appMessagesManager.getHistoryStorage(peerId).maxId = topPendingMid;\n }\n }\n\n /* const d = Object.assign({}, dialog);\n if(peerId === 239602833) {\n this.log.error('applyConversation lun', dialog, d);\n } */\n\n if(topMid || dialog.draft?._ === 'draftMessage') {\n if(this.saveDialog({dialog})) {\n const cache = getUpdateCache(peerId);\n\n if(isForum) {\n (cache.topics ??= new Map()).set(\n (dialog as ForumTopic).id,\n dialog as ForumTopic\n );\n } else {\n cache.dialog = dialog as Dialog;\n }\n }\n } else {\n this.dropDialogWithEvent(peerId, isForum ? this.getDialogKey(dialog) : undefined);\n }\n\n const key = this.appMessagesManager.getUpdateAfterReloadKey(peerId, isForum ? this.getDialogKey(dialog) : undefined);\n const updates = this.appMessagesManager.newUpdatesAfterReloadToHandle[key];\n if(updates !== undefined) {\n for(const update of updates) {\n updates.delete(update);\n this.apiUpdatesManager.saveUpdate(update);\n }\n\n if(!updates.size) {\n delete this.appMessagesManager.newUpdatesAfterReloadToHandle[key];\n }\n }\n });\n\n if(updatedDialogs.size) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', updatedDialogs);\n }\n }\n\n private getDialogOffsetDate(dialog: Dialog | ForumTopic) {\n const message = this.appMessagesManager.getMessageByPeer(dialog.peerId, dialog.top_message);\n return message?.date || 0;\n }\n\n public canSaveDialogByPeerId(peerId: PeerId) {\n if(peerId.isAnyChat()) {\n const chat: Chat = this.appChatsManager.getChat(peerId.toChatId());\n // ! chatForbidden stays for chat where you're kicked\n if(\n chat._ === 'channelForbidden' ||\n // || chat._ === 'chatForbidden'\n (chat as Chat.chat).pFlags.left\n // || (chat as any).pFlags.kicked\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Won't save migrated from peer, forbidden peers, left and kicked\n */\n public saveDialog({\n dialog,\n folderId,\n ignoreOffsetDate,\n saveGlobalOffset\n }: {\n dialog: Dialog | ForumTopic,\n folderId?: REAL_FOLDER_ID,\n ignoreOffsetDate?: boolean,\n saveGlobalOffset?: boolean\n }) {\n const isTopic = this.isTopic(dialog);\n const isDialog = !isTopic;\n\n const topicId = isTopic ? dialog.id = generateMessageId(dialog.id) : undefined;\n if(!isTopic) {\n folderId ??= dialog.folder_id ?? FOLDER_ID_ALL;\n }\n\n const peerId = this.appPeersManager.getPeerId(dialog.peer);\n if(!peerId) {\n console.error('saveConversation no peerId???', dialog, folderId);\n return false;\n }\n\n if(!isTopic && dialog._ !== 'dialog'/* || peerId === 239602833 */) {\n console.error('saveConversation not regular dialog', dialog, Object.assign({}, dialog));\n }\n\n if(isDialog && !this.canSaveDialogByPeerId(peerId)) {\n return false;\n }\n\n const channelId = this.appPeersManager.isChannel(peerId) ? peerId.toChatId() : NULL_PEER_ID;\n\n if(isDialog) {\n const peerText = this.appPeersManager.getPeerSearchText(peerId);\n this.dialogsIndex.indexObject(peerId, peerText);\n }\n\n const wasDialogBefore = this.getDialogOrTopic(peerId, topicId);\n\n let mid: number, message: MyMessage;\n if(dialog.top_message) {\n mid = generateMessageId(dialog.top_message);// dialog.top_message;\n\n // preserve outgoing message\n const wasTopMessage = wasDialogBefore?.top_message && this.appMessagesManager.getMessageByPeer(peerId, wasDialogBefore.top_message) as MyMessage;\n if(wasTopMessage?.pFlags?.is_outgoing && wasDialogBefore.top_message >= mid) {\n mid = wasDialogBefore.top_message;\n }\n\n message = this.appMessagesManager.getMessageByPeer(peerId, mid);\n } else {\n mid = this.appMessagesManager.generateTempMessageId(peerId);\n message = {\n _: 'message',\n id: mid,\n mid,\n from_id: this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId(false)),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n deleted: true,\n pFlags: {out: true},\n date: 0,\n message: ''\n };\n this.appMessagesManager.saveMessages([message], {isOutgoing: true});\n }\n\n if(!message?.pFlags) {\n this.appMessagesManager.log.error('saveConversation no message:', dialog, message);\n }\n\n if(isDialog && !channelId && peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n if(chat && chat.migrated_to && chat.pFlags.deactivated) {\n const migratedToPeer = this.appPeersManager.getPeerId(chat.migrated_to);\n this.appMessagesManager.migratedFromTo[peerId] = migratedToPeer;\n this.appMessagesManager.migratedToFrom[migratedToPeer] = peerId;\n dialog.migratedTo = migratedToPeer;\n // return;\n }\n }\n\n dialog.top_message = mid;\n // dialog.unread_count = wasDialogBefore && dialog.read_inbox_max_id === getServerMessageId(wasDialogBefore.read_inbox_max_id) ? wasDialogBefore.unread_count : dialog.unread_count;\n dialog.read_inbox_max_id = generateMessageId(wasDialogBefore && !dialog.read_inbox_max_id ? wasDialogBefore.read_inbox_max_id : dialog.read_inbox_max_id);\n dialog.read_outbox_max_id = generateMessageId(wasDialogBefore && !dialog.read_outbox_max_id ? wasDialogBefore.read_outbox_max_id : dialog.read_outbox_max_id);\n\n if(isDialog && dialog.folder_id === undefined) {\n if(dialog._ === 'dialog') {\n // ! СЛОЖНО ! СМОТРИ В getTopMessages\n dialog.folder_id = wasDialogBefore ? (wasDialogBefore as typeof dialog).folder_id : folderId;\n }/* else if(dialog._ === 'dialogFolder') {\n dialog.folder_id = dialog.folder.id;\n } */\n }\n\n dialog.draft = this.appDraftsManager.saveDraft({peerId, threadId: topicId, draft: dialog.draft});\n dialog.peerId = peerId;\n // dialog.indexes ??= {} as any;\n\n // Because we saved message without dialog present\n if(message && message.pFlags.is_outgoing) {\n const isOut = message.pFlags.out;\n if(mid > dialog[isOut ? 'read_outbox_max_id' : 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n\n if(!dialog.unread_count && !isOut) {\n ++dialog.unread_count;\n }\n } else {\n delete message.pFlags.unread;\n }\n }\n\n const historyStorage = this.appMessagesManager.getHistoryStorage(peerId, topicId);\n const slice = historyStorage.history.slice;\n /* if(historyStorage === undefined) { // warning\n historyStorage.history.push(mid);\n } else */if(!slice.length) {\n historyStorage.history.unshift(mid);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n } else if(!slice.isEnd(SliceEnd.Bottom)) { // * this will probably never happen, however, if it does, then it will fix slice with top_message\n const slice = historyStorage.history.insertSlice([mid]);\n slice.setEnd(SliceEnd.Bottom);\n historyStorage.count ||= 1;\n if(this.appMessagesManager.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n historyStorage.maxId = mid;\n historyStorage.readMaxId = dialog.read_inbox_max_id;\n historyStorage.readOutboxMaxId = dialog.read_outbox_max_id;\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n threadId: isTopic ? dialog.id : undefined,\n settings: dialog.notify_settings\n });\n\n if(isDialog && channelId && dialog.pts) {\n this.apiUpdatesManager.addChannelState(channelId, dialog.pts);\n }\n\n this.generateIndexForDialog(dialog);\n\n if(wasDialogBefore) {\n // fix unread count\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(wasDialogBefore);\n safeReplaceObject(wasDialogBefore, dialog);\n releaseUnreadCount();\n }\n\n this.pushDialog({\n dialog,\n offsetDate: message?.date,\n ignoreOffsetDate,\n saveGlobalOffset\n });\n\n if(isTopic) {\n this.processTopicUpdate(dialog, wasDialogBefore as ForumTopic);\n }\n\n return true;\n }\n\n public processTopicUpdate(topic: ForumTopic, oldTopic?: ForumTopic) {\n if(!oldTopic) {\n return;\n }\n\n const {peerId, id: threadId} = topic;\n const isIconChanged = topic.icon_emoji_id !== (oldTopic as ForumTopic).icon_emoji_id;\n const isTitleChanged = topic.title !== (oldTopic as ForumTopic).title;\n const isChanged = isIconChanged || isTitleChanged;\n\n if(isIconChanged) {\n this.rootScope.dispatchEvent('avatar_update', {peerId, threadId});\n }\n\n if(isChanged) {\n this.rootScope.dispatchEvent('peer_title_edit', {peerId, threadId});\n }\n }\n\n public getDialogs(options: {\n query?: string,\n offsetIndex?: number,\n limit?: number,\n filterId?: number,\n skipMigrated?: boolean\n }): MaybePromise<{\n dialogs: Folder['dialogs'],\n count: number,\n isTopEnd: boolean,\n isEnd: boolean\n }> {\n const {\n query = '',\n offsetIndex,\n limit = 20,\n filterId = FOLDER_ID_ALL,\n skipMigrated = false\n } = options;\n\n const isForum = this.isFilterIdForForum(filterId);\n if(!isForum && !REAL_FOLDERS.has(filterId)) {\n const promises: Promise[] = [];\n\n const fillContactsResult = this.appUsersManager.fillContacts();\n if(!fillContactsResult.cached) {\n promises.push(fillContactsResult.promise);\n }\n\n const reloadMissingDialogsPromise = this.filtersStorage.reloadMissingPeerIds(filterId);\n if(reloadMissingDialogsPromise) {\n promises.push(reloadMissingDialogsPromise);\n }\n\n if(promises.length) {\n return Promise.all(promises).then(() => {\n return this.getDialogs(options);\n });\n }\n }\n\n // let's load only first pages by certain folderId. next pages will load without folder filtering\n const realFolderId/* : REAL_FOLDER_ID */ =\n (!REAL_FOLDERS.has(filterId) || this.getOffsetDate(filterId)) && !isForum ?\n GLOBAL_FOLDER_ID :\n filterId/* as REAL_FOLDER_ID */;\n let curDialogStorage = this.getFolderDialogs(filterId, skipMigrated);\n\n const indexKey = this.getDialogIndexKeyByFilterId(filterId);\n\n if(query && !isForum) {\n if(!limit || this.cachedResults.query !== query || this.cachedResults.folderId !== filterId) {\n this.cachedResults.query = query;\n this.cachedResults.folderId = filterId;\n\n const results = this.dialogsIndex.search(query);\n\n const dialogs: Dialog[] = [];\n for(const peerId in this.dialogs) {\n const dialog = this.dialogs[peerId];\n if(results.has(dialog.peerId) && dialog.folder_id === filterId) {\n dialogs.push(dialog);\n }\n }\n\n dialogs.sort((d1, d2) => this.getDialogIndex(d2, indexKey) - this.getDialogIndex(d1, indexKey));\n this.cachedResults.dialogs = dialogs;\n this.cachedResults.count = dialogs.length;\n }\n\n curDialogStorage = this.cachedResults.dialogs;\n } else {\n this.cachedResults.query = '';\n }\n\n let offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > this.getDialogIndex(curDialogStorage[offset], indexKey)) {\n break;\n }\n }\n }\n\n const loadedAll = this.isDialogsLoaded(realFolderId);\n const isEnoughDialogs = curDialogStorage.length >= (offset + limit);\n if(query || loadedAll || isEnoughDialogs) {\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: loadedAll ? curDialogStorage.length : null,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || this.getDialogIndex(curDialogStorage[0], indexKey) < offsetIndex),\n isEnd: (query || loadedAll) && (offset + limit) >= curDialogStorage.length\n };\n }\n\n return this.appMessagesManager.getTopMessages({limit, folderId: realFolderId}).then((result) => {\n // const curDialogStorage = this[folderId];\n if(skipMigrated) {\n curDialogStorage = this.getFolderDialogs(filterId, skipMigrated);\n }\n\n offset = 0;\n if(offsetIndex > 0) {\n for(let length = curDialogStorage.length; offset < length; ++offset) {\n if(offsetIndex > this.getDialogIndex(curDialogStorage[offset], indexKey)) {\n break;\n }\n }\n }\n\n // this.log.warn(offset, offset + limit, curDialogStorage.dialogs.length, this.dialogs.length);\n\n const dialogs = curDialogStorage.slice(offset, offset + limit);\n return {\n dialogs,\n count: result.count === undefined ? curDialogStorage.length : result.count,\n isTopEnd: curDialogStorage.length && ((dialogs[0] && dialogs[0] === curDialogStorage[0]) || this.getDialogIndex(curDialogStorage[0], indexKey) < offsetIndex),\n // isEnd: this.isDialogsLoaded(realFolderId) && (offset + limit) >= curDialogStorage.length\n isEnd: result.isEnd\n };\n });\n }\n\n // * FORUMS SECTION\n\n public flushForumTopicsCache(peerId: PeerId) {\n const cache = this.forumTopics.get(peerId);\n if(!cache) {\n return;\n }\n\n const folder = this.folders[peerId];\n if(folder) {\n if(folder.dispatchUnreadTimeout) {\n clearTimeout(folder.dispatchUnreadTimeout);\n }\n\n delete this.allDialogsLoaded[peerId];\n delete this.pinnedOrders[peerId];\n delete this.dialogsOffsetDate[peerId];\n delete this.folders[peerId];\n }\n\n cache.topics.clear();\n\n // for permanent delete\n // this.forumTopics.delete(peerId);\n }\n\n public getForumTopicsCache(peerId: PeerId) {\n let forumTopics = this.forumTopics.get(peerId);\n if(!forumTopics) {\n forumTopics = {\n topics: new Map(),\n deletedTopics: new Set(),\n getTopicPromises: new Map()\n };\n\n this.forumTopics.set(peerId, forumTopics);\n }\n\n return forumTopics;\n }\n\n public getForumTopicById(peerId: PeerId, topicId?: number): Promise {\n if(!this.appPeersManager.isForum(peerId)) {\n return Promise.reject(makeError('CHANNEL_FORUM_MISSING'));\n }\n\n const cache = this.getForumTopicsCache(peerId);\n let promise: CancellablePromise;\n if(topicId) {\n promise = cache.getTopicPromises.get(topicId);\n if(promise) {\n return promise;\n }\n\n if(cache.deletedTopics.has(topicId)) {\n return Promise.resolve(undefined);\n }\n\n cache.getTopicPromises.set(topicId, promise = deferredPromise());\n }\n\n cache.getTopicsPromise ??= pause(0).then(() => {\n const promises: {[topicId: number]: typeof promise} = {};\n const ids: number[] = [];\n for(const [topicId, promise] of cache.getTopicPromises) {\n promises[topicId] = promise;\n ids.push(getServerMessageId(topicId));\n }\n\n cache.getTopicPromises.clear();\n\n const fullfillLeft = () => {\n for(const topicId in promises) {\n promises[topicId].resolve(undefined);\n cache.deletedTopics.add(+topicId);\n }\n };\n\n if(this.getForumTopicsCache(peerId) !== cache) {\n fullfillLeft();\n return;\n }\n\n return this.apiManager.invokeApi('channels.getForumTopicsByID', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n topics: ids\n }).then((messagesForumTopics) => {\n if(this.getForumTopicsCache(peerId) !== cache) {\n return;\n }\n\n this.applyDialogs(messagesForumTopics, peerId);\n\n messagesForumTopics.topics.forEach((forumTopic) => {\n if(forumTopic._ === 'forumTopic') {\n promises[forumTopic.id].resolve(forumTopic);\n delete promises[peerId];\n }\n });\n\n return messagesForumTopics;\n }, () => {}).then(() => {\n fullfillLeft();\n\n cache.getTopicsPromise = undefined;\n if(cache.getTopicPromises.size) {\n this.getForumTopicById(peerId);\n }\n });\n });\n\n return promise || cache.getTopicsPromise;\n }\n\n // public getForumTopicById(peerId: PeerId, topicId: number) {\n // return this.getForumTopicsByID(peerId, topicId).then((result) => result.topics[0]);\n // }\n\n public getForumTopic(peerId: PeerId, topicId: number) {\n const forumTopics = this.forumTopics.get(peerId);\n return forumTopics?.topics?.get(topicId);\n }\n\n public getForumTopicOrReload(peerId: PeerId, topicId: number) {\n const forumTopic = this.getForumTopic(peerId, topicId);\n if(forumTopic) {\n return forumTopic;\n }\n\n const cache = this.getForumTopicsCache(peerId);\n return cache?.deletedTopics?.has(topicId) ? undefined : this.getForumTopicById(peerId, topicId);\n }\n\n public processTopics>(peerId: PeerId, result: T) {\n return callbackify(result, (result) => {\n if('pts' in result) {\n this.apiUpdatesManager.addChannelState(peerId.toChatId(), result.pts);\n }\n\n const peer = this.appPeersManager.getOutputPeer(peerId);\n result.topics = result.topics.map((topic) => {\n if(topic._ === 'forumTopicDeleted') {\n return;\n }\n\n (topic as ForumTopic).peer = peer;\n topic.id = generateMessageId(topic.id);\n return topic;\n }).filter(Boolean);\n\n return result;\n });\n }\n\n public processTopicsPromise[1]>>(peerId: PeerId, promise: T): T {\n return promise.then((result) => {\n this.processTopics(peerId, result);\n return result;\n }) as any;\n }\n\n public getForumUnreadCount(peerId: PeerId) {\n if(!this.appPeersManager.isForum(peerId)) {\n return;\n }\n\n const folder = this.getFolder(peerId);\n\n const f = folder.dialogs.length >= 20 || this.isDialogsLoaded(peerId) ?\n folder.dialogs.slice(0, 20) :\n callbackify(this.getDialogs({filterId: peerId, limit: 20}), (result) => {\n return result.dialogs;\n });\n\n return callbackify(f, (dialogs) => {\n return {\n count: dialogs.reduce((acc, v) => acc + +!!v.unread_count, 0),\n hasUnmuted: dialogs.some((dialog) => dialog.unread_count && this.isDialogUnmuted(dialog))\n };\n });\n }\n\n // * FORUMS SECTION END\n\n private handleDialogTogglePinned(dialog: Dialog | ForumTopic, pinned: boolean, folderId: number) {\n if(dialog) {\n if(!pinned) {\n this.handleDialogUnpinning(dialog, folderId);\n } else { // means set\n dialog.pFlags.pinned = true;\n }\n\n this.generateIndexForDialog(dialog);\n }\n\n this.appMessagesManager.scheduleHandleNewDialogs(dialog.peerId, dialog);\n }\n\n private handleDialogsPinned(folderId: number, order: (Dialog['peerId'] | ForumTopic['id'])[]) {\n const isForum = this.isFilterIdForForum(folderId);\n this.resetPinnedOrder(folderId);\n this.getPinnedOrders(folderId).push(...order);\n this.savePinnedOrders();\n order.reverse(); // index must be higher\n const newPinned: {[id: typeof order[0]]: true} = {};\n order.forEach((id) => {\n newPinned[id] = true;\n\n const peerId = isForum ? folderId : id;\n const topicId = isForum ? id : undefined;\n\n const dialog = this.getDialogOrTopic(peerId, topicId);\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n if(!dialog) {\n return;\n }\n\n dialog.pFlags.pinned = true;\n this.generateIndexForDialog(dialog);\n });\n\n const dialogs = this.getFolderDialogs(folderId, false);\n for(const dialog of dialogs) {\n if(!dialog.pFlags.pinned) {\n break;\n }\n\n if(!newPinned[this.getDialogKey(dialog)]) {\n delete dialog.pFlags.pinned;\n this.generateIndexForDialog(dialog);\n this.appMessagesManager.scheduleHandleNewDialogs(dialog.peerId, dialog);\n }\n }\n }\n\n // only 0 and 1 folders\n private onUpdateFolderPeers = (update: Update.updateFolderPeers) => {\n // this.log('updateFolderPeers', update);\n const peers = update.folder_peers;\n\n peers.forEach((folderPeer) => {\n const {folder_id, peer} = folderPeer;\n\n const peerId = this.appPeersManager.getPeerId(peer);\n const dialog = this.dropDialog(peerId)[0];\n if(dialog) {\n if(dialog.pFlags?.pinned) {\n this.handleDialogUnpinning(dialog, folder_id);\n }\n\n (dialog as Dialog).folder_id = folder_id as REAL_FOLDER_ID;\n this.generateIndexForDialog(dialog);\n this.pushDialog({dialog}); // need for simultaneously updatePinnedDialogs\n }\n\n this.appMessagesManager.scheduleHandleNewDialogs(peerId, dialog);\n });\n };\n\n private onUpdateDialogPinned = (update: Update.updateDialogPinned) => {\n const folderId = update.folder_id ?? FOLDER_ID_ALL;\n // this.log('updateDialogPinned', update);\n const peerId = this.appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n // этот код внизу никогда не сработает, в папках за пиннед отвечает updateDialogFilter\n /* if(update.folder_id > 1) {\n const filter = this.filtersStorage.filters[update.folder_id];\n if(update.pFlags.pinned) {\n filter.pinned_peers.unshift(peerId);\n } else {\n filter.pinned_peers.findAndSplice((p) => p === peerId);\n }\n } */\n\n this.handleDialogTogglePinned(dialog, update.pFlags.pinned, folderId);\n };\n\n private onUpdateChannelPinnedTopic = (update: Update.updateChannelPinnedTopic) => {\n const peerId = update.channel_id.toPeerId(true);\n const topicId = generateMessageId(update.topic_id);\n const topic = this.getForumTopic(peerId, topicId);\n if(!topic) {\n return;\n }\n\n this.handleDialogTogglePinned(topic, update.pFlags.pinned, this.getFilterIdForForum(topic));\n };\n\n private onUpdatePinnedDialogs = (update: Update.updatePinnedDialogs) => {\n const folderId = update.folder_id ?? FOLDER_ID_ALL;\n\n if(update.order) {\n this.handleDialogsPinned(folderId, update.order.map((peer) => this.appPeersManager.getPeerId((peer as DialogPeer.dialogPeer).peer)));\n } else {\n this.apiManager.invokeApi('messages.getPinnedDialogs', {\n folder_id: folderId\n }).then((dialogsResult) => {\n // * for test reordering and rendering\n // dialogsResult.dialogs.reverse();\n\n this.applyDialogs(dialogsResult);\n\n this.handleDialogsPinned(folderId, dialogsResult.dialogs.map((d) => d.peerId));\n });\n }\n };\n\n private onUpdateChannelPinnedTopics = async(update: Update.updateChannelPinnedTopics) => {\n const peerId = update.channel_id.toPeerId(true);\n const forumTopics = this.forumTopics.get(peerId);\n if(!forumTopics) {\n return;\n }\n\n const filterId = peerId;\n if(update.order) {\n const order = update.order.map((topicId) => generateMessageId(topicId));\n this.handleDialogsPinned(filterId, order);\n } else {\n const limit = await this.apiManager.getLimit('topicPin', true);\n\n const promise = this.apiManager.invokeApi('channels.getForumTopics', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n limit,\n offset_date: 0,\n offset_id: 0,\n offset_topic: 0\n });\n\n const result = await this.processTopics(peerId, promise);\n\n const topics = result.topics as ForumTopic[];\n const pinned = topics.filter((topic) => topic.pFlags.pinned);\n this.handleDialogsPinned(filterId, pinned.map((topic) => topic.id));\n }\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {DialogFilter, ForumTopic, Update} from '../../layer';\nimport type {Dialog} from '../appManagers/appMessagesManager';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport copy from '../../helpers/object/copy';\nimport {AppManager} from '../appManagers/manager';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport assumeType from '../../helpers/assumeType';\nimport {FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, REAL_FOLDERS, REAL_FOLDER_ID, START_LOCAL_ID} from '../mtproto/mtproto_config';\nimport makeError from '../../helpers/makeError';\n\nexport type MyDialogFilter = DialogFilter.dialogFilter;\n\nconst convertment = [\n ['pinned_peers', 'pinnedPeerIds'],\n ['exclude_peers', 'excludePeerIds'],\n ['include_peers', 'includePeerIds']\n] as ['pinned_peers' | 'exclude_peers' | 'include_peers', 'pinnedPeerIds' | 'excludePeerIds' | 'includePeerIds'][];\n\nconst PREPENDED_FILTERS = REAL_FOLDERS.size;\n\nconst LOCAL_FILTER: MyDialogFilter = {\n _: 'dialogFilter',\n pFlags: {},\n flags: 0,\n id: 0,\n title: '',\n exclude_peers: [],\n include_peers: [],\n pinned_peers: [],\n excludePeerIds: [],\n includePeerIds: [],\n pinnedPeerIds: []\n};\n\nexport default class FiltersStorage extends AppManager {\n private filters: {[filterId: string]: MyDialogFilter};\n private filtersArr: Array;\n private localFilters: {[filterId: string]: MyDialogFilter};\n private localId: number;\n private reloadedPeerIds: Set;\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateDialogFilter: this.onUpdateDialogFilter,\n\n updateDialogFilters: this.onUpdateDialogFilters,\n\n updateDialogFilterOrder: this.onUpdateDialogFilterOrder\n });\n\n // delete peers when dialog is being dropped\n /* rootScope.addEventListener('peer_deleted', (peerId) => {\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n let modified = false;\n [filter.pinned_peers, filter.include_peers, filter.exclude_peers].forEach((arr) => {\n forEachReverse(arr, (inputPeer, idx) => {\n if(getPeerId(inputPeer) === peerId) {\n arr.splice(idx, 1);\n modified = true;\n }\n });\n });\n\n if(modified) {\n this.saveDialogFilter(filter, true);\n }\n }\n }); */\n\n this.rootScope.addEventListener('premium_toggle', () => {\n this.onUpdateDialogFilters({_: 'updateDialogFilters'});\n });\n\n return this.appStateManager.getState().then((state) => {\n const filtersArr = this.prependFilters(state.filtersArr);\n filtersArr.map((filter) => {\n this.saveDialogFilter(filter, false, true);\n });\n });\n }\n\n /**\n * ! use it only with saving\n */\n private prependFilters(filters: DialogFilter[]) {\n filters = filters.slice();\n\n const allChatsFilter = this.localFilters[FOLDER_ID_ALL];\n const archiveFilter = this.localFilters[FOLDER_ID_ARCHIVE];\n\n const allChatsFilterIndex = filters.findIndex((filter) => filter._ === 'dialogFilterDefault' || filter.id === FOLDER_ID_ALL);\n if(allChatsFilterIndex !== -1) filters[allChatsFilterIndex] = allChatsFilter;\n else filters.unshift(allChatsFilter);\n\n findAndSplice(filters, (filter) => (filter as MyDialogFilter).id === FOLDER_ID_ARCHIVE);\n filters.splice(/* 1 */filters[0] === allChatsFilter ? 1 : 0, 0, archiveFilter);\n\n this.localId = START_LOCAL_ID;\n filters.forEach((filter) => {\n delete filter.localId;\n });\n\n return filters;\n }\n\n private generateLocalFilter(id: REAL_FOLDER_ID) {\n const filter: MyDialogFilter = {...copy(LOCAL_FILTER), id};\n if(id === FOLDER_ID_ALL) {\n filter.pFlags.exclude_archived = true;\n } else if(id === FOLDER_ID_ARCHIVE) {\n filter.pFlags.exclude_unarchived = true;\n }\n\n if(REAL_FOLDERS.has(id)) {\n filter.pinnedPeerIds = this.dialogsStorage.getPinnedOrders(id);\n }\n\n return filter;\n }\n\n // private getLocalFilter(id: number) {\n // return this.filters[id] ??= this.generateLocalFilter(id);\n // }\n\n public clear = (init?: boolean) => {\n if(!init) {\n // safeReplaceObject(this.filters, {});\n this.reloadedPeerIds.clear();\n this.clearFilters();\n } else {\n this.filters = {};\n this.filtersArr = [];\n this.reloadedPeerIds = new Set();\n\n this.localFilters = {};\n for(const filterId of REAL_FOLDERS) {\n this.localFilters[filterId] = this.generateLocalFilter(filterId as REAL_FOLDER_ID);\n }\n }\n\n this.localId = START_LOCAL_ID;\n };\n\n private onUpdateDialogFilter = (update: Update.updateDialogFilter) => {\n if(update.filter) {\n this.saveDialogFilter(update.filter as any);\n } else if(this.filters[update.id]) { // Папка удалена\n // this.getDialogFilters(true);\n this.rootScope.dispatchEvent('filter_delete', this.filters[update.id]);\n delete this.filters[update.id];\n findAndSplice(this.filtersArr, (filter) => (filter as DialogFilter.dialogFilter).id === update.id);\n }\n\n this.pushToState();\n };\n\n private onUpdateDialogFilters = (update: Update.updateDialogFilters) => {\n // console.warn('updateDialogFilters', update);\n\n const oldFilters = copy(this.filters);\n\n this.getDialogFilters(true).then((filters) => {\n for(const _filterId in oldFilters) {\n const filterId = +_filterId;\n if(!filters.find((filter) => filter.id === filterId)) { // * deleted\n this.onUpdateDialogFilter({_: 'updateDialogFilter', id: filterId});\n }\n }\n\n this.onUpdateDialogFilterOrder({_: 'updateDialogFilterOrder', order: filters.map((filter) => filter.id)});\n });\n };\n\n private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => {\n // console.log('updateDialogFilterOrder', update);\n\n const order = update.order.slice();\n if(!order.includes(FOLDER_ID_ARCHIVE)) {\n order.splice(order[0] === FOLDER_ID_ALL ? 1 : 0, 0, FOLDER_ID_ARCHIVE);\n }\n\n this.localId = START_LOCAL_ID;\n order.forEach((filterId) => {\n const filter = this.filters[filterId];\n delete filter.localId;\n this.setLocalId(filter);\n });\n\n this.rootScope.dispatchEvent('filter_order', order);\n\n this.pushToState();\n };\n\n private pushToState() {\n this.appStateManager.pushToState('filtersArr', this.filtersArr);\n }\n\n public testDialogForFilter(dialog: Dialog | ForumTopic.forumTopic, filter?: MyDialogFilter) {\n if(!filter) {\n return true;\n }\n\n if(REAL_FOLDERS.has(filter.id)) {\n return (dialog as Dialog).folder_id === filter.id && this.dialogsStorage.canSaveDialogByPeerId(dialog.peerId);\n }\n\n const peerId = dialog.peerId;\n\n // * check whether dialog exists\n if(!this.appMessagesManager.getDialogOnly(peerId)) {\n return false;\n }\n\n // exclude_peers\n if(filter.excludePeerIds.includes(peerId)) {\n return false;\n }\n\n // include_peers\n if(filter.includePeerIds.includes(peerId)) {\n return true;\n }\n\n const pFlags = filter.pFlags;\n\n // exclude_archived\n if(pFlags.exclude_archived && (dialog as Dialog).folder_id === FOLDER_ID_ARCHIVE) {\n return false;\n }\n\n // exclude_read\n if(pFlags.exclude_read && !this.appMessagesManager.isDialogUnread(dialog)) {\n return false;\n }\n\n // exclude_muted\n if(pFlags.exclude_muted && this.appNotificationsManager.isPeerLocalMuted({peerId}) && !(dialog.unread_mentions_count && dialog.unread_count)) {\n return false;\n }\n\n if(this.appPeersManager.isAnyChat(peerId)) {\n // broadcasts\n if(pFlags.broadcasts && this.appPeersManager.isBroadcast(peerId)) {\n return true;\n }\n\n // groups\n if(pFlags.groups && this.appPeersManager.isAnyGroup(peerId)) {\n return true;\n }\n } else {\n const userId = peerId.toUserId();\n\n // bots\n if(this.appUsersManager.isBot(userId)) {\n return !!pFlags.bots;\n }\n\n // non_contacts\n if(pFlags.non_contacts && !this.appUsersManager.isContact(userId)) {\n return true;\n }\n\n // contacts\n if(pFlags.contacts && this.appUsersManager.isContact(userId)) {\n return true;\n }\n }\n\n return false;\n }\n\n public testDialogForFilterId(dialog: Dialog, filterId: number) {\n return this.testDialogForFilter(dialog, this.filters[filterId]);\n }\n\n public getFilter(filterId: number) {\n return this.filters[filterId];\n }\n\n public getFilters() {\n return this.filters;\n }\n\n public clearFilters() {\n const filters = this.getFilters();\n for(const filterId in filters) { // delete filters\n if(REAL_FOLDERS.has(+filterId)) {\n continue;\n }\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: +filterId\n });\n }\n }\n\n public async toggleDialogPin(peerId: PeerId, filterId: number) {\n const filter = this.filters[filterId];\n\n const index = filter.pinnedPeerIds.indexOf(peerId);\n const wasPinned = index !== -1;\n\n if(wasPinned) {\n filter.pinned_peers.splice(index, 1);\n filter.pinnedPeerIds.splice(index, 1);\n }\n\n if(!wasPinned) {\n if(filter.pinned_peers.length >= (await this.apiManager.getConfig()).pinned_infolder_count_max) {\n return Promise.reject(makeError('PINNED_DIALOGS_TOO_MUCH'));\n }\n\n filter.pinned_peers.unshift(this.appPeersManager.getInputPeerById(peerId));\n filter.pinnedPeerIds.unshift(peerId);\n }\n\n return this.updateDialogFilter(filter);\n }\n\n public createDialogFilter(filter: MyDialogFilter, prepend?: boolean) {\n const maxId = Math.max(1, ...Object.keys(this.filters).map((i) => +i));\n filter = copy(filter);\n filter.id = maxId + 1;\n return this.updateDialogFilter(filter, undefined, prepend);\n }\n\n public updateDialogFilter(filter: MyDialogFilter, remove = false, prepend = false) {\n const flags = remove ? 0 : 1;\n\n return this.apiManager.invokeApi('messages.updateDialogFilter', {\n flags,\n id: filter.id,\n filter: remove ? undefined : this.getOutputDialogFilter(filter)\n }).then((bool: boolean) => { // возможно нужна проверка и откат, если результат не ТРУ\n // console.log('updateDialogFilter bool:', bool);\n\n if(bool) {\n /* if(!this.filters[filter.id]) {\n this.saveDialogFilter(filter);\n }\n\n rootScope.$broadcast('filter_update', filter); */\n\n this.onUpdateDialogFilter({\n _: 'updateDialogFilter',\n id: filter.id,\n filter: remove ? undefined : filter as any\n });\n\n if(prepend) {\n const f: MyDialogFilter[] = [];\n for(const filterId in this.filters) {\n const filter = this.filters[filterId];\n ++filter.localId;\n f.push(filter);\n }\n\n filter.localId = START_LOCAL_ID;\n\n const order = f.sort((a, b) => a.localId - b.localId).map((filter) => filter.id);\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n }\n }\n\n return bool;\n });\n }\n\n public updateDialogFiltersOrder(order: number[]) {\n return this.apiManager.invokeApi('messages.updateDialogFiltersOrder', {\n order\n }).then(() => {\n this.onUpdateDialogFilterOrder({\n _: 'updateDialogFilterOrder',\n order\n });\n });\n }\n\n public getOutputDialogFilter(filter: MyDialogFilter) {\n const c = copy(filter);\n /* convertment.forEach(([from, to]) => {\n c[from] = c[to].map((peerId) => this.appPeersManager.getInputPeerById(peerId));\n }); */\n\n this.filterIncludedPinnedPeers(filter);\n\n return c;\n }\n\n private filterIncludedPinnedPeers(filter: MyDialogFilter) {\n forEachReverse(filter.includePeerIds, (peerId, idx) => {\n if(filter.pinnedPeerIds.includes(peerId)) {\n filter.include_peers.splice(idx, 1);\n filter.includePeerIds.splice(idx, 1);\n }\n });\n }\n\n // private spliceMissingPeerIds(filterId: number, type: ArgumentTypes[1], missingPeerIds: PeerId[]) {\n // const filter = this.getFilter(filterId);\n // const peers = filter && filter[type];\n // if(!peers?.length) {\n // return;\n // }\n\n // let spliced = false;\n // missingPeerIds.forEach((peerId) => {\n // const inputPeer = findAndSplice(peers, (inputPeer) => getPeerId(inputPeer) === peerId);\n // if(inputPeer) {\n // spliced = true;\n // }\n // });\n\n // if(spliced) {\n // this.onUpdateDialogFilter({\n // _: 'updateDialogFilter',\n // id: filterId,\n // filter\n // });\n // }\n // }\n\n public reloadMissingPeerIds(\n filterId: number,\n type: 'pinned_peers' | 'include_peers' | 'exclude_peers' = 'pinned_peers'\n ) {\n const filter = this.getFilter(filterId);\n const peers = filter?.[type];\n if(!peers?.length) {\n return;\n }\n\n // const missingPeerIds: PeerId[] = [];\n const reloadDialogs = peers.filter((inputPeer) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const isAlreadyReloaded = this.reloadedPeerIds.has(peerId);\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\n // if(isAlreadyReloaded && !dialog) {\n // missingPeerIds.push(peerId);\n // }\n\n const reload = !isAlreadyReloaded && !dialog;\n return reload;\n });\n\n if(!reloadDialogs.length) {\n // if(missingPeerIds.length) {\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\n // }\n\n return;\n }\n\n const reloadPromises = reloadDialogs.map((inputPeer) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const promise = this.appMessagesManager.reloadConversation(inputPeer)\n .then((dialog) => {\n this.reloadedPeerIds.add(peerId);\n\n return dialog ? undefined : peerId;\n });\n\n return promise;\n });\n\n const reloadPromise = Promise.all(reloadPromises).then((missingPeerIds) => {\n missingPeerIds = missingPeerIds.filter(Boolean);\n if(!missingPeerIds.length) {\n return;\n }\n\n // this.spliceMissingPeerIds(filterId, type, missingPeerIds);\n });\n\n return reloadPromise;\n }\n\n public async getDialogFilters(overwrite = false): Promise {\n const keys = Object.keys(this.filters);\n if(keys.length > PREPENDED_FILTERS && !overwrite) {\n return keys.map((filterId) => this.filters[filterId]).sort((a, b) => a.localId - b.localId);\n }\n\n const filters = await this.apiManager.invokeApiSingle('messages.getDialogFilters');\n const prepended = this.prependFilters(filters);\n return prepended.map((filter) => this.saveDialogFilter(filter, overwrite)).filter(Boolean);\n }\n\n public getSuggestedDialogsFilters() {\n return this.apiManager.invokeApi('messages.getSuggestedDialogFilters');\n }\n\n public saveDialogFilter(filter: DialogFilter, update = true, silent?: boolean) {\n // defineNotNumerableProperties(filter, ['includePeerIds', 'excludePeerIds', 'pinnedPeerIds']);\n\n if(filter._ === 'dialogFilterDefault') {\n filter = this.localFilters[FOLDER_ID_ALL];\n }\n\n assumeType(filter);\n if(!REAL_FOLDERS.has(filter.id)) {\n convertment.forEach(([from, to]) => {\n assumeType(filter);\n filter[to] = filter[from].map((peer) => this.appPeersManager.getPeerId(peer));\n });\n\n this.filterIncludedPinnedPeers(filter);\n\n filter.include_peers = filter.pinned_peers.concat(filter.include_peers);\n filter.includePeerIds = filter.pinnedPeerIds.concat(filter.includePeerIds);\n }\n\n const oldFilter = this.filters[filter.id];\n if(oldFilter) {\n Object.assign(oldFilter, filter);\n } else {\n this.filters[filter.id] = filter;\n }\n\n this.setLocalId(filter);\n\n if(!silent) {\n if(update) {\n this.rootScope.dispatchEvent('filter_update', filter);\n } else if(!oldFilter) {\n this.rootScope.dispatchEvent('filter_new', filter);\n }\n }\n\n return filter;\n }\n\n private setLocalId(filter: MyDialogFilter) {\n if(filter.localId !== undefined) {\n if(filter.localId >= this.localId) {\n this.localId = filter.localId + 1;\n }\n } else {\n filter.localId = this.localId++ as MyDialogFilter['localId'];\n findAndSplice(this.filtersArr, (_filter) => _filter.id === filter.id);\n this.filtersArr.push(filter);\n this.pushToState();\n }\n }\n\n public async isFilterIdAvailable(filterId: number) {\n if(REAL_FOLDERS.has(filterId)) {\n return true;\n }\n\n const limit = await this.apiManager.getLimit('folders');\n const isFolderAvailable = this.filtersArr.filter((filter) => !REAL_FOLDERS.has(filter.id)).slice(0, limit).some((filter) => filter.id === filterId);\n\n return isFolderAvailable;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function applyMixins(derivedCtor: any, constructors: any[]) {\n // const callbacks: Array<(...args: any[]) => any> = [];\n\n constructors.forEach((baseCtor) => {\n Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\n const value: PropertyDescriptor = Object.getOwnPropertyDescriptor(baseCtor.prototype, name) || Object.create(null);\n /* if(name === '_constructor') {\n callbacks.push(value.value);\n return;\n } else */if(name === 'constructor') {\n return;\n }\n\n Object.defineProperty(\n derivedCtor.prototype,\n name,\n value\n );\n });\n });\n\n // if(callbacks.length) {\n // function c(...args: any[]): any {\n // callbacks.forEach((cb, idx) => {\n // // @ts-ignore\n // cb.apply(this, args[idx] || []);\n // });\n // };\n\n // Object.defineProperty(derivedCtor.prototype, 'superConstructor', {\n // configurable: true,\n // enumerable: true,\n // value: c,\n // writable: true\n // });\n // }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport DEBUG from '../../config/debug';\nimport {ConstructorDeclMap, Message, MessageEntity, MessageFwdHeader, Peer, Update, Updates} from '../../layer';\nimport {logger, LogTypes} from '../logger';\nimport assumeType from '../../helpers/assumeType';\nimport App from '../../config/app';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport {AppManager} from './manager';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport ctx from '../../environment/ctx';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport applyMixins from '../../helpers/applyMixins';\n\ntype UpdatesState = {\n pendingPtsUpdates: (Update & {pts: number, pts_count: number})[],\n pendingSeqUpdates?: {[seq: number]: {seq: number, date: number, updates: any[]}},\n syncPending: {\n seqAwaiting?: number,\n ptsAwaiting?: boolean,\n timeout: number\n },\n syncLoading: Promise,\n\n seq?: number,\n pts?: number,\n date?: number,\n lastPtsUpdateTime?: number,\n lastDifferenceTime?: number\n};\n\nconst SYNC_DELAY = 6;\n\nclass ApiUpdatesManager {\n public updatesState: UpdatesState = {\n pendingPtsUpdates: [],\n pendingSeqUpdates: {},\n syncPending: null,\n syncLoading: null\n };\n\n private channelStates: {[channelId: ChatId]: UpdatesState} = {};\n private attached = false;\n\n private log = logger('UPDATES', LogTypes.Error | LogTypes.Warn | LogTypes.Log/* | LogTypes.Debug */);\n private debug = DEBUG;\n\n private subscriptions: {[channelId: ChatId]: {count: number, interval?: number}} = {};\n\n constructor() {\n this._constructor(false);\n }\n\n private setProxy() {\n const self = this;\n this.updatesState = new Proxy(this.updatesState, {\n set: function(target: ApiUpdatesManager['updatesState'], key: keyof ApiUpdatesManager['updatesState'], value: ApiUpdatesManager['updatesState'][typeof key]) {\n // @ts-ignore\n target[key] = value;\n self.saveUpdatesState();\n return true;\n }\n });\n }\n\n public saveUpdatesState() {\n const us = this.updatesState;\n this.appStateManager.pushToState('updates', {\n seq: us.seq,\n pts: us.pts,\n date: us.date\n });\n }\n\n private popPendingSeqUpdate() {\n const state = this.updatesState;\n const nextSeq = state.seq + 1;\n const pendingUpdatesData = state.pendingSeqUpdates[nextSeq];\n if(!pendingUpdatesData) {\n return false;\n }\n\n const updates = pendingUpdatesData.updates;\n for(let i = 0, length = updates.length; i < length; ++i) {\n this.saveUpdate(updates[i]);\n }\n\n state.seq = pendingUpdatesData.seq;\n if(pendingUpdatesData.date && state.date < pendingUpdatesData.date) {\n state.date = pendingUpdatesData.date;\n }\n delete state.pendingSeqUpdates[nextSeq];\n\n if(!this.popPendingSeqUpdate() &&\n state.syncPending?.seqAwaiting &&\n state.seq >= state.syncPending.seqAwaiting) {\n if(!state.syncPending.ptsAwaiting) {\n this.clearStatePendingSync(state);\n } else {\n delete state.syncPending.seqAwaiting;\n }\n }\n\n return true;\n }\n\n private popPendingPtsUpdate(channelId: ChatId) {\n const curState = channelId ? this.getChannelState(channelId) : this.updatesState;\n if(!curState.pendingPtsUpdates.length) {\n return false;\n }\n\n curState.pendingPtsUpdates.sort((a, b) => {\n return a.pts - b.pts;\n });\n // this.log('pop update', channelId, curState.pendingPtsUpdates)\n\n let curPts = curState.pts;\n let goodPts = 0;\n let goodIndex = 0;\n for(let i = 0, length = curState.pendingPtsUpdates.length; i < length; ++i) {\n const update = curState.pendingPtsUpdates[i];\n curPts += update.pts_count;\n if(curPts >= update.pts) {\n goodPts = update.pts;\n goodIndex = i;\n }\n }\n\n if(!goodPts) {\n return false;\n }\n\n this.debug && this.log.debug('pop pending pts updates', goodPts, curState.pendingPtsUpdates.slice(0, goodIndex + 1));\n\n curState.pts = goodPts;\n for(let i = 0; i <= goodIndex; ++i) {\n const update = curState.pendingPtsUpdates[i];\n\n // @ts-ignore\n this.saveUpdate(update);\n }\n curState.pendingPtsUpdates.splice(0, goodIndex + 1);\n\n if(!curState.pendingPtsUpdates.length && curState.syncPending) {\n if(!curState.syncPending.seqAwaiting) {\n this.clearStatePendingSync(curState);\n } else {\n delete curState.syncPending.ptsAwaiting;\n }\n }\n\n return true;\n }\n\n public forceGetDifference() {\n if(!this.updatesState.syncLoading) {\n this.getDifference();\n }\n }\n\n public processLocalUpdate(update: Update) {\n this.processUpdateMessage({\n _: 'updateShort',\n update\n } as Updates);\n }\n\n public processUpdateMessage = (updateMessage: any, options: Partial<{\n override: boolean\n }> = {}) => {\n // return forceGetDifference()\n const processOpts = {\n date: updateMessage.date,\n seq: updateMessage.seq,\n seqStart: updateMessage.seq_start\n // ignoreSyncLoading: options.ignoreSyncLoading\n };\n\n this.debug && this.log.debug('processUpdateMessage', updateMessage);\n\n switch(updateMessage._) {\n case 'updatesTooLong':\n case 'new_session_created':\n this.forceGetDifference();\n break;\n\n case 'updateShort':\n this.processUpdate(updateMessage.update, processOpts);\n break;\n\n case 'updateShortMessage':\n case 'updateShortChatMessage': {\n assumeType(updateMessage);\n this.debug && this.log.debug('updateShortMessage | updateShortChatMessage', {...updateMessage});\n const isOut = updateMessage.pFlags.out;\n const fromId = (updateMessage as Updates.updateShortChatMessage).from_id || (isOut ? this.appPeersManager.peerId : (updateMessage as Updates.updateShortMessage).user_id);\n const toId = (updateMessage as Updates.updateShortChatMessage).chat_id ?\n (updateMessage as Updates.updateShortChatMessage).chat_id.toPeerId(true) :\n ((updateMessage as Updates.updateShortMessage).user_id.toPeerId(false) || this.appPeersManager.peerId);\n\n this.processUpdate({\n _: 'updateNewMessage',\n message: {\n _: 'message',\n pFlags: updateMessage.pFlags,\n id: updateMessage.id,\n from_id: this.appPeersManager.getOutputPeer(fromId.toPeerId()),\n peer_id: this.appPeersManager.getOutputPeer(toId),\n date: updateMessage.date,\n message: updateMessage.message,\n fwd_from: updateMessage.fwd_from,\n reply_to: updateMessage.reply_to,\n entities: updateMessage.entities\n },\n pts: updateMessage.pts,\n pts_count: updateMessage.pts_count\n }, processOpts);\n break;\n }\n\n case 'updatesCombined':\n case 'updates':\n this.appUsersManager.saveApiUsers(updateMessage.users, options.override);\n this.appChatsManager.saveApiChats(updateMessage.chats, options.override);\n\n updateMessage.updates.forEach((update: Update) => {\n this.processUpdate(update, processOpts);\n });\n break;\n\n default:\n this.log.warn('Unknown update message', updateMessage);\n }\n };\n\n private getDifference(first = false): Promise {\n // this.trace('Get full diff')\n const updatesState = this.updatesState;\n const wasSyncing = updatesState.syncLoading;\n if(!wasSyncing) {\n updatesState.pendingSeqUpdates = {};\n updatesState.pendingPtsUpdates = [];\n }\n\n this.clearStatePendingSync(updatesState);\n\n const promise = this.apiManager.invokeApi('updates.getDifference', {\n pts: updatesState.pts,\n pts_total_limit: first /* && false */? /* 50 */1200 : undefined,\n date: updatesState.date,\n qts: -1\n }, {\n timeout: 0x7fffffff\n }).then((differenceResult) => {\n this.debug && this.log.debug('Get diff result', differenceResult);\n\n if(differenceResult._ === 'updates.differenceEmpty') {\n this.debug && this.log.debug('apply empty diff', differenceResult.seq);\n updatesState.date = differenceResult.date;\n updatesState.seq = differenceResult.seq;\n return;\n }\n\n // ! SORRY I'M SORRY I'M SORRY\n if(first) {\n this.rootScope.dispatchEvent('state_synchronizing');\n }\n\n if(differenceResult._ !== 'updates.differenceTooLong') {\n this.appUsersManager.saveApiUsers(differenceResult.users);\n this.appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n // this.log('applying', differenceResult.other_updates.length, 'other updates')\n\n differenceResult.other_updates.forEach((update) => {\n switch(update._) {\n case 'updateChannelTooLong':\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n this.processUpdate(update);\n return;\n }\n\n this.saveUpdate(update);\n });\n\n // this.log('applying', differenceResult.new_messages.length, 'new messages')\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewMessage',\n message: apiMessage,\n pts: updatesState.pts,\n pts_count: 0\n });\n });\n\n const nextState = differenceResult._ === 'updates.difference' ? differenceResult.state : differenceResult.intermediate_state;\n updatesState.seq = nextState.seq;\n updatesState.pts = nextState.pts;\n updatesState.date = nextState.date;\n } else {\n updatesState.pts = differenceResult.pts;\n updatesState.date = (Date.now() / 1000 | 0) + this.timeManager.getServerTimeOffset();\n delete updatesState.seq;\n\n this.channelStates = {};\n\n this.log.warn('getDifference:', differenceResult._);\n this.onDifferenceTooLong();\n }\n\n // this.log('apply diff', updatesState.seq, updatesState.pts)\n\n if(differenceResult._ === 'updates.differenceSlice') {\n return this.getDifference();\n } else {\n this.debug && this.log.debug('finished get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(updatesState, promise);\n }\n\n return promise;\n }\n\n private clearStatePendingSync(state: UpdatesState) {\n if(state.syncPending) {\n clearTimeout(state.syncPending.timeout);\n state.syncPending = null;\n }\n }\n\n private getChannelDifference(channelId: ChatId): Promise {\n const channelState = this.getChannelState(channelId);\n const wasSyncing = channelState.syncLoading;\n if(!wasSyncing) {\n channelState.pendingPtsUpdates = [];\n }\n\n this.clearStatePendingSync(channelState);\n\n const log = this.debug ? this.log.bindPrefix('getChannelDifference-' + channelId) : undefined;\n // this.log.trace('Get channel diff', appChatsManager.getChat(channelId), channelState.pts);\n const promise = this.apiManager.invokeApi('updates.getChannelDifference', {\n channel: this.appChatsManager.getChannelInput(channelId),\n filter: {_: 'channelMessagesFilterEmpty'},\n pts: channelState.pts,\n limit: 1000\n }, {timeout: 0x7fffffff}).then((differenceResult) => {\n log?.debug('diff result', differenceResult)\n channelState.pts = 'pts' in differenceResult ? differenceResult.pts : undefined;\n channelState.lastDifferenceTime = Date.now();\n\n if(differenceResult._ === 'updates.channelDifferenceEmpty') {\n // log?.debug('apply channel empty diff', differenceResult);\n return;\n }\n\n if(differenceResult._ === 'updates.channelDifferenceTooLong') {\n // log?.debug('channel diff too long', differenceResult);\n delete this.channelStates[channelId];\n\n this.saveUpdate({_: 'updateChannelReload', channel_id: channelId});\n return;\n }\n\n this.appUsersManager.saveApiUsers(differenceResult.users);\n this.appChatsManager.saveApiChats(differenceResult.chats);\n\n // Should be first because of updateMessageID\n log?.debug('applying', differenceResult.other_updates.length, 'channel other updates');\n differenceResult.other_updates.forEach((update) => {\n this.saveUpdate(update);\n });\n\n log?.debug('applying', differenceResult.new_messages.length, 'channel new messages');\n differenceResult.new_messages.forEach((apiMessage) => {\n this.saveUpdate({\n _: 'updateNewChannelMessage',\n message: apiMessage,\n pts: channelState.pts,\n pts_count: 0\n });\n });\n\n log?.debug('apply channel diff', channelState.pts);\n\n if(differenceResult._ === 'updates.channelDifference' &&\n !differenceResult.pFlags.final) {\n return this.getChannelDifference(channelId);\n } else {\n log?.debug('finished channel get diff');\n }\n });\n\n if(!wasSyncing) {\n this.justAName(channelState, promise, channelId);\n }\n\n return promise;\n }\n\n private onDifferenceTooLong() {\n this.appUsersManager.clear();\n this.appChatsManager.clear();\n this.appMessagesManager.clear();\n\n this.rootScope.dispatchEvent('state_cleared');\n }\n\n private justAName(state: UpdatesState, promise: UpdatesState['syncLoading'], channelId?: ChatId) {\n state.syncLoading = promise;\n this.rootScope.dispatchEvent('state_synchronizing', channelId);\n\n promise.then(() => {\n state.syncLoading = null;\n this.rootScope.dispatchEvent('state_synchronized', channelId);\n }, () => {\n state.syncLoading = null;\n });\n }\n\n public addChannelState(channelId: ChatId, pts: number) {\n if(!pts) {\n throw new Error('Add channel state without pts ' + channelId);\n }\n\n return this.channelStates[channelId] ??= {\n pts,\n pendingPtsUpdates: [],\n syncPending: null,\n syncLoading: null\n };\n }\n\n public getChannelState(channelId: ChatId, pts?: number) {\n if(this.channelStates[channelId] === undefined) {\n this.addChannelState(channelId, pts);\n }\n\n return this.channelStates[channelId];\n }\n\n private processUpdate(update: Update, options: Partial<{\n date: number,\n seq: number,\n seqStart: number/* ,\n ignoreSyncLoading: boolean */\n }> = {}) {\n let channelId: ChatId;\n switch(update._) {\n case 'updateNewChannelMessage':\n case 'updateEditChannelMessage':\n channelId = this.appPeersManager.getPeerId(update.message.peer_id).toChatId();\n break;\n /* case 'updateDeleteChannelMessages':\n channelId = update.channel_id;\n break; */\n case 'updateChannelTooLong':\n channelId = update.channel_id;\n if(!(channelId in this.channelStates)) {\n return false;\n }\n break;\n default:\n if('channel_id' in update && 'pts' in update) {\n channelId = update.channel_id;\n }\n break;\n }\n\n const {pts, pts_count} = update as Update.updateNewMessage;\n const curState = channelId ? this.getChannelState(channelId, pts) : this.updatesState;\n\n // this.log.log('process', channelId, curState.pts, update)\n\n if(curState.syncLoading/* && !options.ignoreSyncLoading */) {\n return false;\n }\n\n if(update._ === 'updateChannelTooLong') {\n if(!curState.lastPtsUpdateTime ||\n curState.lastPtsUpdateTime < (Date.now() - SYNC_DELAY)) {\n // this.log.trace('channel too long, get diff', channelId, update)\n this.getChannelDifference(channelId);\n }\n return false;\n }\n\n if(update._ === 'updateNewMessage' ||\n update._ === 'updateEditMessage' ||\n update._ === 'updateNewChannelMessage' ||\n update._ === 'updateEditChannelMessage') {\n const message = update.message as Message.message;\n const toPeerId = this.appPeersManager.getPeerId(message.peer_id);\n const fwdHeader: MessageFwdHeader.messageFwdHeader = message.fwd_from || {} as any;\n let reason: string;\n if(message.from_id && !this.appUsersManager.hasUser(this.appPeersManager.getPeerId(message.from_id), message.pFlags.post/* || channelId*/) && (reason = 'author') ||\n fwdHeader.from_id && !this.appUsersManager.hasUser(this.appPeersManager.getPeerId(fwdHeader.from_id), !!(fwdHeader.from_id as Peer.peerChannel).channel_id) && (reason = 'fwdAuthor') ||\n (fwdHeader.from_id as Peer.peerChannel)?.channel_id && !this.appChatsManager.hasChat((fwdHeader.from_id as Peer.peerChannel).channel_id, true) && (reason = 'fwdChannel') ||\n toPeerId.isUser() && !this.appUsersManager.hasUser(toPeerId) && (reason = 'toPeer User') ||\n toPeerId.isAnyChat() && !this.appChatsManager.hasChat(toPeerId.toChatId()) && (reason = 'toPeer Chat')) {\n this.log.warn('Not enough data for message update', toPeerId, reason, message);\n if(channelId && this.appChatsManager.hasChat(channelId)) {\n this.getChannelDifference(channelId);\n } else {\n this.forceGetDifference();\n }\n return false;\n }\n } else if(channelId && !this.appChatsManager.hasChat(channelId)) {\n // this.log.log('skip update, missing channel', channelId, update)\n return false;\n }\n\n let popPts: boolean;\n let popSeq: boolean;\n\n if(pts) {\n const newPts = curState.pts + (pts_count || 0);\n if(newPts < pts) {\n this.debug && this.log.warn('Pts hole', curState, update, channelId && this.appChatsManager.getChat(channelId));\n curState.pendingPtsUpdates.push(update as Update.updateNewMessage);\n if(!curState.syncPending && !curState.syncLoading) {\n curState.syncPending = {\n timeout: ctx.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n if(channelId) {\n this.getChannelDifference(channelId);\n } else {\n this.getDifference();\n }\n }, SYNC_DELAY)\n };\n }\n\n curState.syncPending.ptsAwaiting = true;\n return false;\n }\n\n if(pts > curState.pts) {\n curState.pts = pts;\n popPts = true;\n\n curState.lastPtsUpdateTime = Date.now();\n } else if(pts_count) {\n // this.log.warn('Duplicate update', update)\n return false;\n }\n\n if(channelId && options.date && this.updatesState.date < options.date) {\n this.updatesState.date = options.date;\n }\n } else if(!channelId && options.seq > 0) {\n const seq = options.seq;\n const seqStart = options.seqStart || seq;\n\n if(seqStart !== curState.seq + 1) {\n if(seqStart > curState.seq) {\n this.debug && this.log.warn('Seq hole', curState, curState.syncPending?.seqAwaiting);\n\n curState.pendingSeqUpdates[seqStart] ??= {seq, date: options.date, updates: []};\n curState.pendingSeqUpdates[seqStart].updates.push(update);\n\n if(!curState.syncPending) {\n curState.syncPending = {\n timeout: ctx.setTimeout(() => {\n curState.syncPending = null;\n\n if(curState.syncLoading) {\n return;\n }\n\n this.getDifference();\n }, SYNC_DELAY)\n };\n }\n\n if(!curState.syncPending.seqAwaiting ||\n curState.syncPending.seqAwaiting < seqStart) {\n curState.syncPending.seqAwaiting = seqStart;\n }\n return false;\n }\n }\n\n if(curState.seq !== seq) {\n curState.seq = seq;\n if(options.date && curState.date < options.date) {\n curState.date = options.date;\n }\n\n popSeq = true;\n }\n }\n\n this.saveUpdate(update);\n\n if(popPts) {\n this.popPendingPtsUpdate(channelId);\n } else if(popSeq) {\n this.popPendingSeqUpdate();\n }\n }\n\n public saveUpdate(update: Update) {\n // this.debug && this.log('saveUpdate', update);\n this.dispatchEvent(update._, update as any);\n }\n\n public subscribeToChannelUpdates(channelId: ChatId) {\n const subscription = this.subscriptions[channelId] ??= {count: 0};\n ++subscription.count;\n\n const cb = () => {\n const state = this.getChannelState(channelId);\n if(!state.syncLoading && (!state.lastDifferenceTime || (Date.now() - state.lastDifferenceTime) > 2500)) {\n this.getChannelDifference(channelId);\n }\n };\n\n subscription.interval ??= ctx.setInterval(cb, 3000);\n cb();\n }\n\n public unsubscribeFromChannelUpdates(channelId: ChatId, force?: boolean) {\n const subscription = this.subscriptions[channelId];\n if(!subscription?.interval || (--subscription.count && !force)) {\n return;\n }\n\n clearInterval(subscription.interval);\n subscription.interval = undefined;\n delete this.subscriptions[channelId];\n }\n\n public attach(langCode?: string) {\n if(this.attached) return;\n\n // return;\n\n this.log('attach');\n\n this.attached = true;\n\n this.appStateManager.getState().then(({updates: state}) => {\n const newVersion = this.appStateManager.newVersion/* || '1.6.0' */;\n\n // rootScope.broadcast('state_synchronizing');\n if(!state || !state.pts || !state.date/* || !state.seq */) { // seq can be undefined because of updates.differenceTooLong\n this.log('will get new state');\n\n this.updatesState.syncLoading = new Promise((resolve) => {\n this.apiManager.invokeApi('updates.getState', {}, {noErrorBox: true}).then((stateResult) => {\n this.updatesState.seq = stateResult.seq;\n this.updatesState.pts = stateResult.pts;\n this.updatesState.date = stateResult.date;\n this.saveUpdatesState();\n // setTimeout(() => {\n this.updatesState.syncLoading = null;\n resolve();\n // rootScope.broadcast('state_synchronized');\n // }, 1000);\n\n // ! for testing\n // updatesState.seq = 1\n // updatesState.pts = stateResult.pts - 5000\n // updatesState.date = 1\n // getDifference()\n });\n });\n } else {\n // ! for testing\n /* state.seq = 1;\n state.pts = state.pts - 15;\n state.date = 1; */\n // state.pts -= 100;\n\n // state.date = 1628623682;\n // state.pts = 2007500;\n // state.seq = 503;\n\n Object.assign(this.updatesState, state);\n\n this.log('will get difference', Object.assign({}, state));\n\n this.getDifference(true)/* .finally(() => {\n if(this.updatesState.syncLoading) {\n rootScope.broadcast('state_synchronizing');\n }\n }) */;\n }\n\n this.apiManager.setUpdatesProcessor(this.processUpdateMessage);\n\n // this.updatesState.syncLoading.then(() => {\n this.setProxy();\n // });\n\n if(newVersion) {\n this.updatesState.syncLoading.then(async() => {\n const strs: Record = {\n en: 'was updated to version',\n ru: 'обновлён до версии'\n };\n\n const getChangelog = (lang: string) => {\n fetch(`changelogs/${lang}_${newVersion.split(' ')[0]}.md`)\n .then((res) => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then((text) => {\n const langStr = strs[lang] || strs.en;\n const pre = `**Telegram Web${App.suffix} ${langStr} ${newVersion}**\\n\\n`;\n\n text = pre + text;\n\n const entities: MessageEntity[] = [];\n const message = parseMarkdown(text, entities);\n\n const update: Update.updateServiceNotification = {\n _: 'updateServiceNotification',\n entities,\n message,\n type: 'local',\n pFlags: {},\n inbox_date: Date.now() / 1000 | 0,\n media: undefined\n };\n\n this.processLocalUpdate(update);\n });\n };\n\n const languages = filterUnique([langCode, 'en']);\n for(const language of languages) {\n try {\n await getChangelog(language);\n break;\n } catch(err) {\n\n }\n }\n });\n }\n });\n }\n}\n\ninterface ApiUpdatesManager extends EventListenerBase<{\n [name in Update['_']]: (update: ConstructorDeclMap[name]) => void\n}>, AppManager {}\napplyMixins(ApiUpdatesManager, [EventListenerBase, AppManager]);\n\nexport {ApiUpdatesManager};\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {UserProfilePhoto, ChatPhoto, InputFileLocation} from '../../layer';\nimport {DownloadOptions} from '../mtproto/apiFileManager';\nimport {AppManager} from './manager';\n\nexport type PeerPhotoSize = 'photo_small' | 'photo_big';\n\nexport class AppAvatarsManager extends AppManager {\n private savedAvatarURLs: {\n [peerId: PeerId]: {\n [size in PeerPhotoSize]?: string | Promise\n }\n } = {};\n\n protected after() {\n this.rootScope.addEventListener('avatar_update', ({peerId, threadId}) => {\n if(threadId) {\n return;\n }\n\n this.removeFromAvatarsCache(peerId);\n });\n }\n\n public isAvatarCached(peerId: PeerId, size?: PeerPhotoSize) {\n const saved = this.savedAvatarURLs[peerId];\n if(size === undefined) {\n return !!saved;\n }\n\n return !!(saved && saved[size] && !(saved[size] instanceof Promise));\n }\n\n public removeFromAvatarsCache(peerId: PeerId) {\n if(this.savedAvatarURLs[peerId]) {\n delete this.savedAvatarURLs[peerId];\n }\n }\n\n public loadAvatar(peerId: PeerId, photo: UserProfilePhoto.userProfilePhoto | ChatPhoto.chatPhoto, size: PeerPhotoSize) {\n const saved = this.savedAvatarURLs[peerId] ??= {};\n if(!saved[size]) {\n // console.warn('will invoke downloadSmallFile:', peerId);\n const peerPhotoFileLocation: InputFileLocation.inputPeerPhotoFileLocation = {\n _: 'inputPeerPhotoFileLocation',\n pFlags: {},\n peer: this.appPeersManager.getInputPeerById(peerId),\n photo_id: photo.photo_id\n };\n\n const downloadOptions: DownloadOptions = {dcId: photo.dc_id, location: peerPhotoFileLocation};\n if(size === 'photo_big') {\n peerPhotoFileLocation.pFlags.big = true;\n downloadOptions.limitPart = 512 * 1024;\n }\n\n /* let str: string;\n const time = Date.now();\n if(peerId === 0) {\n str = `download avatar ${peerId}`;\n } */\n\n const promise = this.apiFileManager.download(downloadOptions);\n return saved[size] = promise.then((blob) => {\n return saved[size] = URL.createObjectURL(blob);\n\n /* if(str) {\n console.log(str, Date.now() / 1000, Date.now() - time);\n } */\n });\n } else {\n return saved[size];\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getEnvironment} from '../../environment/utils';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {nextRandomUint} from '../../helpers/random';\nimport {InputPhoneCall, MessagesDhConfig, PhoneCall, PhoneCallDiscardReason, PhoneCallProtocol, PhonePhoneCall} from '../../layer';\nimport {AppManager} from './manager';\n\nexport type CallId = PhoneCall['id'];\n\nexport type MyPhoneCall = Exclude;\n\nexport class AppCallsManager extends AppManager {\n private calls: Map;\n\n protected after() {\n this.calls = new Map();\n\n if(!getEnvironment().IS_CALL_SUPPORTED) {\n return;\n }\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updatePhoneCall: (update) => {\n this.saveCall(update.phone_call);\n },\n\n updatePhoneCallSignalingData: (update) => {\n this.rootScope.dispatchEvent('call_signaling', {callId: update.phone_call_id, data: update.data});\n }\n });\n }\n\n public computeKey(g_b: Uint8Array, a: Uint8Array, p: Uint8Array) {\n return this.cryptoWorker.invokeCrypto('compute-dh-key', g_b, a, p);\n }\n\n public saveCall(call: PhoneCall) {\n const isDiscarded = call._ === 'phoneCallDiscarded';\n const oldCall = this.calls.get(call.id);\n if(oldCall) {\n // if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n // }\n\n if(isDiscarded) {\n this.calls.delete(call.id);\n }\n\n call = oldCall;\n } else if(!isDiscarded) {\n this.calls.set(call.id, call as any);\n }\n\n this.rootScope.dispatchEvent('call_update', call);\n\n return call;\n }\n\n public getCall(callId: CallId) {\n return this.calls.get(callId);\n }\n\n public getCallInput(id: CallId): InputPhoneCall {\n const call = this.getCall(id);\n return {\n _: 'inputPhoneCall',\n id: call.id,\n access_hash: call.access_hash\n };\n }\n\n public savePhonePhoneCall(phonePhoneCall: PhonePhoneCall) {\n this.appUsersManager.saveApiUsers(phonePhoneCall.users);\n return this.saveCall(phonePhoneCall.phone_call);\n }\n\n public generateDh() {\n return this.apiManager.invokeApi('messages.getDhConfig', {\n version: 0,\n random_length: 256\n }).then((dhConfig) => {\n return this.cryptoWorker.invokeCrypto('generate-dh', dhConfig as MessagesDhConfig.messagesDhConfig);\n });\n }\n\n // private verifyProtocolCompatibility(protocol: PhoneCallProtocol) {\n // const my = getCallProtocol();\n // const myVersion = my.library_versions[0];\n // return !protocol.library_versions.find((version) => {\n // return compareVersion(myVersion, version) > 0;\n // });\n // }\n\n public async requestCall(userId: UserId, protocol: PhoneCallProtocol, g_a_hash: Uint8Array, video?: boolean) {\n const phonePhoneCall = await this.apiManager.invokeApi('phone.requestCall', {\n user_id: this.appUsersManager.getUserInput(userId),\n protocol: protocol,\n video: video,\n random_id: nextRandomUint(32),\n g_a_hash: g_a_hash\n });\n\n return this.savePhonePhoneCall(phonePhoneCall);\n }\n\n public async discardCall(callId: CallId, duration: number, reason: PhoneCallDiscardReason['_'], video?: boolean) {\n if(!this.getCall(callId)) {\n return;\n }\n\n const updates = await this.apiManager.invokeApi('phone.discardCall', {\n video,\n peer: this.getCallInput(callId),\n duration,\n reason: {\n _: reason\n },\n connection_id: '0'\n });\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport deepEqual from '../../helpers/object/deepEqual';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {ChannelParticipant, ChannelsCreateChannel, Chat, ChatAdminRights, ChatBannedRights, ChatInvite, ChatPhoto, ChatReactions, InputChannel, InputChatPhoto, InputFile, InputPeer, MessagesSponsoredMessages, SponsoredMessage, Update, Updates} from '../../layer';\nimport {isRestricted} from '../../helpers/restrictions';\nimport {AppManager} from './manager';\nimport hasRights from './utils/chats/hasRights';\nimport getParticipantPeerId from './utils/chats/getParticipantPeerId';\nimport {AppStoragesManager} from './appStoragesManager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport {randomLong} from '../../helpers/random';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\nexport type Channel = Chat.channel;\nexport type ChatRights = keyof ChatBannedRights['pFlags'] | keyof ChatAdminRights['pFlags'] | 'change_type' | 'change_permissions' | 'delete_chat' | 'view_participants';\n\nexport class AppChatsManager extends AppManager {\n private storage: AppStoragesManager['storages']['chats'];\n\n private chats: {[id: ChatId]: Exclude};\n // private usernames: any;\n // private channelAccess: any;\n // private megagroups: {[id: number]: true};\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n /* updateChannel: (update) => {\n const channelId = update.channel_id;\n //console.log('updateChannel:', update);\n rootScope.broadcast('channel_settings', {channelId});\n }, */\n\n updateChannelParticipant: (update) => {\n this.apiManager.clearCache('channels.getParticipants', (params) => {\n return (params.channel as InputChannel.inputChannel).channel_id === update.channel_id;\n });\n },\n\n updateChatDefaultBannedRights: (update) => {\n const chatId = this.appPeersManager.getPeerId(update.peer).toChatId();\n const chat = this.chats[chatId] as Chat.chat;\n if(chat) {\n chat.default_banned_rights = update.default_banned_rights;\n this.rootScope.dispatchEvent('chat_update', chatId);\n }\n }\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('chats')\n ]).then(([state, {results: chats, storage}]) => {\n this.storage = storage;\n\n this.saveApiChats(chats);\n\n this.peersStorage.addEventListener('peerNeeded', (peerId) => {\n if(peerId.isUser() || this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.set({\n [peerId.toChatId()]: this.getChat(peerId.toChatId())\n });\n });\n\n this.peersStorage.addEventListener('peerUnneeded', (peerId) => {\n if(peerId.isUser() || !this.storage.getFromCache(peerId.toChatId())) {\n return;\n }\n\n this.storage.delete(peerId.toChatId());\n });\n });\n }\n\n public clear = (init = false) => {\n if(!init) {\n for(const chatId in this.chats) {\n if(!chatId) continue;\n if(!this.peersStorage.isPeerNeeded(chatId.toPeerId(true))) {\n const chat = this.chats[chatId];\n this.appUsersManager.modifyUsernamesCache(chat, false);\n\n this.storage.delete(chatId);\n delete this.chats[chatId];\n }\n }\n } else {\n this.chats = {};\n }\n };\n\n public saveApiChats(apiChats: any[], override?: boolean) {\n if((apiChats as any).saved) return;\n (apiChats as any).saved = true;\n apiChats.forEach((chat) => this.saveApiChat(chat, override));\n }\n\n public saveApiChat(chat: Chat, override?: boolean) {\n if(!chat || chat._ === 'chatEmpty') return;\n /* if(chat._ !== 'chat' && chat._ !== 'channel') {\n return;\n } */\n\n // * exclude from state\n // defineNotNumerableProperties(chat, ['rTitle', 'initials']);\n\n const oldChat = this.chats[chat.id];\n\n /* if(oldChat && !override) {\n return;\n } */\n\n (chat as Chat.chat).pFlags ??= {};\n\n if((chat as Chat.channel).pFlags.min && oldChat !== undefined) {\n return;\n }\n\n if(chat._ === 'channel' &&\n chat.participants_count === undefined &&\n oldChat !== undefined &&\n (oldChat as Chat.channel).participants_count) {\n chat.participants_count = (oldChat as Chat.channel).participants_count;\n }\n\n if((chat as Chat.channel).photo?._ === 'chatPhotoEmpty') {\n delete (chat as Chat.channel).photo;\n }\n\n const changedUsername = this.appUsersManager.setUsernameToCache(chat, oldChat);\n\n /* if(chat.username) {\n let searchUsername = searchIndexManager.cleanUsername(chat.username);\n this.usernames[searchUsername] = chat.id;\n } */\n\n const peerId = chat.id.toPeerId(true);\n if(oldChat === undefined) {\n this.chats[chat.id] = chat;\n } else {\n const oldPhotoId = ((oldChat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n const newPhotoId = ((chat as Chat.chat).photo as ChatPhoto.chatPhoto)?.photo_id;\n const toggledForum = (oldChat as Chat.channel).pFlags.forum !== (chat as Chat.channel).pFlags.forum;\n const changedPhoto = oldPhotoId !== newPhotoId || toggledForum;\n\n const changedTitle = oldChat.title !== chat.title || changedUsername;\n\n const changedAnyBadge = (oldChat as Chat.channel).pFlags.verified !== (chat as Chat.channel).pFlags.verified ||\n (oldChat as Chat.channel).pFlags.scam !== (chat as Chat.channel).pFlags.scam ||\n (oldChat as Chat.channel).pFlags.fake !== (chat as Chat.channel).pFlags.fake;\n\n safeReplaceObject(oldChat, chat);\n this.rootScope.dispatchEvent('chat_update', chat.id);\n\n if(changedPhoto) {\n this.rootScope.dispatchEvent('avatar_update', {peerId});\n }\n\n if(changedTitle || changedAnyBadge) {\n this.rootScope.dispatchEvent('peer_title_edit', {peerId});\n }\n\n if(toggledForum) {\n this.rootScope.dispatchEvent('chat_toggle_forum', {chatId: chat.id, enabled: !!(chat as Chat.channel).pFlags.forum});\n }\n }\n\n if(this.peersStorage.isPeerNeeded(peerId)) {\n this.storage.set({\n [chat.id]: chat\n });\n }\n }\n\n public getChat(id: ChatId) {\n return this.chats[id];\n }\n\n /**\n * Check the user's ability to do an action in chat\n * @param id\n * @param action creator can still send messages to left channel. so this function shows server rights. see canSendToPeer for local rights in messages manager.\n * @param rights do not provide this parameter when checking rights for self\n * @param isThread\n * @returns\n */\n public hasRights(id: ChatId, action: ChatRights, rights?: ChatAdminRights | ChatBannedRights, isThread?: boolean) {\n return hasRights(this.getChat(id), action, rights, isThread);\n }\n\n public editChatDefaultBannedRights(id: ChatId, banned_rights: ChatBannedRights) {\n const chat = this.getChat(id) as Chat.chat;\n if(chat.default_banned_rights) {\n if(chat.default_banned_rights.until_date === banned_rights.until_date && deepEqual(chat.default_banned_rights.pFlags, banned_rights.pFlags)) {\n return Promise.resolve();\n }\n }\n\n return this.apiManager.invokeApi('messages.editChatDefaultBannedRights', {\n peer: this.appPeersManager.getInputPeerById(id.toPeerId(true)),\n banned_rights\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n /* public resolveUsername(username: string) {\n return this.usernames[username] || 0;\n } */\n\n /* public saveChannelAccess(id: ChatId, accessHash: string) {\n this.channelAccess[id] = accessHash;\n } */\n\n /* public saveIsMegagroup(id: ChatId) {\n this.megagroups[id] = true;\n } */\n\n public isChannel(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat && (chat._ === 'channel' || chat._ === 'channelForbidden')/* || this.channelAccess[id] */);\n }\n\n public isMegagroup(id: ChatId) {\n /* if(this.megagroups[id]) {\n return true;\n } */\n\n const chat: Chat = this.chats[id];\n return !!(chat as Chat.channel)?.pFlags?.megagroup;\n }\n\n public isForum(id: ChatId) {\n const chat = this.chats[id];\n return !!(chat as Chat.channel)?.pFlags?.forum;\n }\n\n public isBroadcast(id: ChatId) {\n return this.isChannel(id) && !this.isMegagroup(id);\n }\n\n public isInChat(id: ChatId) {\n let good = true;\n const chat: Chat = this.getChat(id);\n if(!chat ||\n chat._ === 'channelForbidden' ||\n chat._ === 'chatForbidden' ||\n (chat as any as Chat.chatEmpty)._ === 'chatEmpty' ||\n (chat as Chat.chat).pFlags.left ||\n // || (chat as any).pFlags.kicked\n (chat as Chat.chat).pFlags.deactivated) {\n good = false;\n }\n\n return good;\n }\n\n public getChannelInput(id: ChatId): InputChannel {\n const chat: Chat = this.getChat(id);\n if(!chat || !(chat as Chat.channel).access_hash) {\n return {\n _: 'inputChannelEmpty'\n };\n } else {\n return {\n _: 'inputChannel',\n channel_id: id,\n access_hash: (chat as Chat.channel).access_hash/* || this.channelAccess[id] */ || '0'\n };\n }\n }\n\n public getInputPeer(id: ChatId) {\n return this.isChannel(id) ? this.getChannelInputPeer(id) : this.getChatInputPeer(id);\n }\n\n public getChatInputPeer(id: ChatId): InputPeer.inputPeerChat {\n return {\n _: 'inputPeerChat',\n chat_id: id\n };\n }\n\n public getChannelInputPeer(id: ChatId): InputPeer.inputPeerChannel {\n return {\n _: 'inputPeerChannel',\n channel_id: id,\n access_hash: (this.getChat(id) as Chat.channel).access_hash/* || this.channelAccess[id] */ || 0\n };\n }\n\n public hasChat(id: ChatId, allowMin?: true) {\n const chat = this.chats[id];\n return isObject(chat) && (allowMin || !(chat as Chat.channel).pFlags.min);\n }\n\n public getChatString(id: ChatId) {\n const chat = this.getChat(id);\n if(this.isChannel(id)) {\n return (this.isMegagroup(id) ? 's' : 'c') + id + '_' + (chat as Chat.channel).access_hash;\n }\n return 'g' + id;\n }\n\n /* public wrapForFull(id: number, fullChat: any) {\n const chatFull = copy(fullChat);\n const chat = this.getChat(id);\n\n if(!chatFull.participants_count) {\n chatFull.participants_count = chat.participants_count;\n }\n\n if(chatFull.participants &&\n chatFull.participants._ === 'chatParticipants') {\n chatFull.participants.participants = this.wrapParticipants(id, chatFull.participants.participants);\n }\n\n if(chatFull.about) {\n chatFull.rAbout = wrapRichText(chatFull.about, {noLinebreaks: true});\n }\n\n //chatFull.peerString = this.getChatString(id);\n chatFull.chat = chat;\n\n return chatFull;\n }\n\n public wrapParticipants(id: number, participants: any[]) {\n const chat = this.getChat(id);\n const myId = appUsersManager.getSelf().id;\n if(this.isChannel(id)) {\n const isAdmin = chat.pFlags.creator;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = isAdmin && participant._ === 'channelParticipant';\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n } else {\n const isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin;\n participants.forEach((participant) => {\n participant.canLeave = myId === participant.user_id;\n participant.canKick = !participant.canLeave && (\n chat.pFlags.creator ||\n participant._ === 'chatParticipant' && (isAdmin || myId === participant.inviter_id)\n );\n\n // just for order by last seen\n participant.user = appUsersManager.getUser(participant.user_id);\n });\n }\n\n return participants;\n } */\n\n public createChannel(options: ChannelsCreateChannel): Promise {\n return this.apiManager.invokeApi('channels.createChannel', options).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const channelId = (updates as any).chats[0].id;\n return channelId;\n });\n }\n\n public inviteToChannel(id: ChatId, userIds: UserId[]) {\n const input = this.getChannelInput(id);\n const usersInputs = userIds.map((u) => this.appUsersManager.getUserInput(u));\n\n return this.apiManager.invokeApi('channels.inviteToChannel', {\n channel: input,\n users: usersInputs\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public createChat(title: string, userIds: UserId[]): Promise {\n return this.apiManager.invokeApi('messages.createChat', {\n users: userIds.map((u) => this.appUsersManager.getUserInput(u)),\n title\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const chatId = (updates as any as Updates.updates).chats[0].id;\n return chatId;\n });\n }\n\n private onChatUpdated = (chatId: ChatId, updates?: Updates) => {\n // console.log('onChatUpdated', chatId, updates);\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n if((updates as Updates.updates)?.updates?.length && this.isChannel(chatId)) {\n this.rootScope.dispatchEvent('invalidate_participants', chatId);\n }\n };\n\n public leaveChannel(id: ChatId) {\n return this.apiManager.invokeApi('channels.leaveChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public joinChannel(id: ChatId) {\n return this.apiManager.invokeApi('channels.joinChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public addChatUser(id: ChatId, userId: UserId, fwdLimit = 100) {\n return this.apiManager.invokeApi('messages.addChatUser', {\n chat_id: id,\n user_id: this.appUsersManager.getUserInput(userId),\n fwd_limit: fwdLimit\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChatUser(id: ChatId, userId: UserId) {\n return this.apiManager.invokeApi('messages.deleteChatUser', {\n chat_id: id,\n user_id: this.appUsersManager.getUserInput(userId)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public leaveChat(id: ChatId) {\n return this.deleteChatUser(id, this.appUsersManager.getSelf().id);\n }\n\n public leave(id: ChatId) {\n return this.isChannel(id) ? this.leaveChannel(id) : this.leaveChat(id);\n }\n\n public delete(id: ChatId) {\n return this.isChannel(id) ? this.deleteChannel(id) : this.deleteChat(id);\n }\n\n public deleteChannel(id: ChatId) {\n return this.apiManager.invokeApi('channels.deleteChannel', {\n channel: this.getChannelInput(id)\n }).then(this.onChatUpdated.bind(this, id));\n }\n\n public deleteChat(id: ChatId) {\n // return this.leaveChat(id).then(() => {\n return this.apiManager.invokeApi('messages.deleteChat', {\n chat_id: id\n });\n // });\n }\n\n public migrateChat(id: ChatId): Promise {\n const chat: Chat = this.getChat(id);\n if(chat._ === 'channel') return Promise.resolve(chat.id);\n return this.apiManager.invokeApi('messages.migrateChat', {\n chat_id: id\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n const update: Update.updateChannel = (updates as Updates.updates).updates.find((u) => u._ === 'updateChannel') as any;\n return update.channel_id;\n });\n }\n\n public updateUsername(id: ChatId, username: string, doNotRefresh?: boolean) {\n const promise = this.apiManager.invokeApi('channels.updateUsername', {\n channel: this.getChannelInput(id),\n username\n });\n\n return this.refreshChatAfterRequest(id, promise, doNotRefresh);\n }\n\n public editPhoto(id: ChatId, inputFile: InputFile) {\n const inputChatPhoto: InputChatPhoto = {\n _: 'inputChatUploadedPhoto',\n file: inputFile\n };\n\n let promise: any;\n if(this.isChannel(id)) {\n promise = this.apiManager.invokeApi('channels.editPhoto', {\n channel: this.getChannelInput(id),\n photo: inputChatPhoto\n });\n } else {\n promise = this.apiManager.invokeApi('messages.editChatPhoto', {\n chat_id: id,\n photo: inputChatPhoto\n });\n }\n\n return promise.then((updates: any) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editTitle(id: ChatId, title: string) {\n let promise: any;\n\n if(this.isChannel(id)) {\n promise = this.apiManager.invokeApi('channels.editTitle', {\n channel: this.getChannelInput(id),\n title\n });\n } else {\n promise = this.apiManager.invokeApi('messages.editChatTitle', {\n chat_id: id,\n title\n });\n }\n\n return promise.then((updates: any) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public editAbout(id: ChatId, about: string) {\n const peerId = id.toPeerId(true);\n return this.apiManager.invokeApi('messages.editChatAbout', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n about\n }).then((bool) => {\n if(bool) {\n this.rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return bool;\n });\n }\n\n public editBanned(id: ChatId, participant: PeerId | ChannelParticipant, banned_rights: ChatBannedRights) {\n const peerId = typeof(participant) !== 'object' ? participant : getParticipantPeerId(participant);\n return this.apiManager.invokeApi('channels.editBanned', {\n channel: this.getChannelInput(id),\n participant: this.appPeersManager.getInputPeerById(peerId),\n banned_rights\n }).then((updates) => {\n this.onChatUpdated(id, updates);\n\n if(typeof(participant) === 'object') {\n const timestamp = Date.now() / 1000 | 0;\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelParticipant',\n channel_id: id,\n date: timestamp,\n actor_id: undefined,\n qts: undefined,\n user_id: peerId,\n prev_participant: participant,\n new_participant: Object.keys(banned_rights.pFlags).length ? {\n _: 'channelParticipantBanned',\n date: timestamp,\n banned_rights,\n kicked_by: this.appUsersManager.getSelf().id,\n peer: this.appPeersManager.getOutputPeer(peerId),\n pFlags: {}\n } : undefined\n });\n }\n });\n }\n\n public clearChannelParticipantBannedRights(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {}\n });\n }\n\n public kickFromChannel(id: ChatId, participant: PeerId | ChannelParticipant) {\n return this.editBanned(id, participant, {\n _: 'chatBannedRights',\n until_date: 0,\n pFlags: {\n view_messages: true\n }\n });\n }\n\n public kickFromChat(id: ChatId, participant: PeerId | ChannelParticipant) {\n if(this.isChannel(id)) return this.kickFromChannel(id, participant);\n else return this.deleteChatUser(id, (participant as PeerId).toUserId());\n }\n\n public resolveChannel(id: ChatId) {\n return this.apiManager.invokeApiSingle('channels.getChannels', {\n id: [{\n _: 'inputChannel',\n channel_id: id,\n access_hash: '0'\n }]\n }).then((messagesChats) => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public togglePreHistoryHidden(id: ChatId, enabled: boolean) {\n return this.migrateChat(id).then((channelId) => {\n return this.apiManager.invokeApi('channels.togglePreHistoryHidden', {\n channel: this.getChannelInput(channelId),\n enabled\n }).then(this.onChatUpdated.bind(this, channelId));\n });\n }\n\n public toggleSignatures(id: ChatId, enabled: boolean) {\n return this.apiManager.invokeApi('channels.toggleSignatures', {\n channel: this.getChannelInput(id),\n enabled\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public toggleNoForwards(id: ChatId, enabled: boolean) {\n return this.apiManager.invokeApi('messages.toggleNoForwards', {\n peer: this.getInputPeer(id),\n enabled\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public setChatAvailableReactions(id: ChatId, reactions: ChatReactions) {\n const chatFull = this.appProfileManager.getCachedFullChat(id);\n if(chatFull) {\n chatFull.available_reactions = reactions;\n this.rootScope.dispatchEvent('chat_full_update', id);\n }\n\n return this.apiManager.invokeApi('messages.setChatAvailableReactions', {\n peer: this.getInputPeer(id),\n available_reactions: reactions\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getSendAs(channelId: ChatId) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'channels.getSendAs',\n params: {\n peer: this.getChannelInputPeer(channelId)\n },\n processResult: (sendAsPeers) => {\n this.appUsersManager.saveApiUsers(sendAsPeers.users);\n this.saveApiChats(sendAsPeers.chats);\n\n return sendAsPeers.peers;\n }\n });\n }\n\n public importChatInvite(hash: string) {\n return this.apiManager.invokeApi('messages.importChatInvite', {hash})\n .then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n const chat = (updates as Updates.updates).chats[0];\n return chat.id;\n });\n }\n\n public checkUsername(chatId: ChatId, username: string) {\n return this.apiManager.invokeApi('channels.checkUsername', {\n channel: this.getChannelInput(chatId),\n username\n });\n }\n\n public getSponsoredMessage(chatId: ChatId) {\n // const s: MessagesSponsoredMessages.messagesSponsoredMessages = {\n // '_': 'messages.sponsoredMessages',\n // 'messages': [\n // {\n // '_': 'sponsoredMessage',\n // 'pFlags': {},\n // 'flags': 9,\n // 'random_id': new Uint8Array([\n // 80,\n // 5,\n // 249,\n // 174,\n // 44,\n // 73,\n // 173,\n // 14,\n // 246,\n // 81,\n // 187,\n // 182,\n // 223,\n // 5,\n // 4,\n // 128\n // ]),\n // 'from_id': {\n // '_': 'peerUser',\n // 'user_id': 983000232\n // },\n // 'start_param': 'GreatMinds',\n // 'message': 'This is a long sponsored message. In fact, it has the maximum length allowed on the platform – 160 characters 😬😬. It\\'s promoting a bot with a start parameter.' + chatId\n // }\n // ],\n // 'chats': [],\n // 'users': [\n // {\n // '_': 'user',\n // 'pFlags': {\n // 'bot': true,\n // 'verified': true,\n // 'apply_min_photo': true\n // },\n // 'flags': 34226219,\n // 'id': 983000232,\n // 'access_hash': '-294959558742535650',\n // 'first_name': 'Quiz Bot',\n // 'username': 'QuizBot',\n // 'photo': {\n // '_': 'userProfilePhoto',\n // 'pFlags': {},\n // 'flags': 2,\n // 'photo_id': '4221953848856651689',\n // 'stripped_thumb': new Uint8Array([\n // 1,\n // 8,\n // 8,\n // 155,\n // 247,\n // 95,\n // 103,\n // 255,\n // 0,\n // 110,\n // 138,\n // 40,\n // 174,\n // 132,\n // 142,\n // 6,\n // 238,\n // 127\n // ]),\n // 'dc_id': 2\n // },\n // 'bot_info_version': 11,\n // 'bot_inline_placeholder': 'Search a quiz...',\n // 'sortName': 'quiz bot'\n // }\n // ]\n // };\n\n // const promise = Promise.resolve(s);\n const promise = this.apiManager.invokeApiCacheable('channels.getSponsoredMessages', {\n channel: this.getChannelInput(chatId)\n }, {cacheSeconds: 300});\n\n return promise.then((sponsoredMessages) => {\n if(sponsoredMessages._ === 'messages.sponsoredMessages') {\n this.appUsersManager.saveApiUsers(sponsoredMessages.users);\n this.appChatsManager.saveApiChats(sponsoredMessages.chats);\n\n const sponsoredMessage = sponsoredMessages.messages.shift();\n sponsoredMessages.messages.push(sponsoredMessage);\n }\n\n return sponsoredMessages;\n });\n }\n\n public viewSponsoredMessage(chatId: ChatId, randomId: SponsoredMessage['random_id']) {\n return this.apiManager.invokeApiSingle('channels.viewSponsoredMessage', {\n channel: this.getChannelInput(chatId),\n random_id: randomId\n });\n }\n\n public checkChatInvite(hash: string) {\n return this.apiManager.invokeApi('messages.checkChatInvite', {\n hash: hash\n }).then((chatInvite) => {\n if((chatInvite as ChatInvite.chatInvitePeek).chat) {\n this.saveApiChat((chatInvite as ChatInvite.chatInvitePeek).chat, true);\n }\n\n return chatInvite;\n });\n }\n\n public toggleUsername(chatId: ChatId, username: string, active: boolean) {\n const promise = this.apiManager.invokeApi('channels.toggleUsername', {\n channel: this.getChannelInput(chatId),\n username,\n active\n });\n\n return this.refreshChatAfterRequest(chatId, promise);\n }\n\n public reorderUsernames(chatId: ChatId, order: string[]) {\n const promise = this.apiManager.invokeApi('channels.reorderUsernames', {\n channel: this.getChannelInput(chatId),\n order\n });\n\n return this.refreshChatAfterRequest(chatId, promise);\n }\n\n public deactivateAllUsernames(chatId: ChatId, doNotRefresh?: boolean) {\n const promise = this.apiManager.invokeApi('channels.deactivateAllUsernames', {\n channel: this.getChannelInput(chatId)\n });\n\n return this.refreshChatAfterRequest(chatId, promise, doNotRefresh);\n }\n\n public makeChannelPrivate(chatId: ChatId) {\n const promises: Promise[] = [\n this.updateUsername(chatId, '', true),\n this.deactivateAllUsernames(chatId, true)\n ];\n\n const promise = Promise.all(promises).then(() => true);\n return this.refreshChatAfterRequest(chatId, promise);\n }\n\n public refreshChatAfterRequest>(chatId: ChatId, promise: T, doNotRefresh?: boolean): T {\n if(doNotRefresh) {\n return promise;\n }\n\n return promise.then((value) => {\n return this.getChannels([chatId]).then(() => value);\n }) as T;\n }\n\n public getChannels(chatIds: ChatId[]) {\n return this.apiManager.invokeApi('channels.getChannels', {\n id: chatIds.map((chatId) => this.getChannelInput(chatId))\n }).then((messagesChats) => {\n this.saveApiChats(messagesChats.chats);\n });\n }\n\n public toggleForum(chatId: ChatId, enabled: boolean) {\n return this.migrateChat(chatId).then((channelId) => {\n return this.apiManager.invokeApi('channels.toggleForum', {\n channel: this.getChannelInput(channelId),\n enabled\n }).then(this.onChatUpdated.bind(this, channelId));\n });\n }\n\n public editForumTopic(options: {\n chatId: ChatId,\n topicId: number,\n title?: string,\n iconEmojiId?: DocId,\n closed?: boolean,\n hidden?: boolean\n }) {\n const {chatId, topicId, title, iconEmojiId, closed, hidden} = options;\n return this.apiManager.invokeApi('channels.editForumTopic', {\n channel: this.getChannelInput(chatId),\n topic_id: getServerMessageId(topicId),\n title,\n icon_emoji_id: iconEmojiId,\n closed,\n hidden\n }).then(this.onChatUpdated.bind(this, chatId));\n }\n\n public async createForumTopic(options: {\n chatId: ChatId,\n title: string,\n iconColor: number,\n iconEmojiId: DocId\n }) {\n const {chatId, title, iconColor, iconEmojiId} = options;\n\n const channelFull = await this.appProfileManager.getChannelFull(chatId);\n const sendAsInputPeer = channelFull.default_send_as && this.appPeersManager.getInputPeerById(this.appPeersManager.getPeerId(channelFull.default_send_as));\n\n return this.apiManager.invokeApi('channels.createForumTopic', {\n channel: this.getChannelInput(chatId),\n title,\n icon_color: iconColor,\n icon_emoji_id: iconEmojiId,\n random_id: randomLong(),\n send_as: sendAsInputPeer\n }).then((updates) => {\n this.onChatUpdated(chatId, updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateNewChannelMessage') as Update.updateNewChannelMessage;\n return generateMessageId(update.message.id);\n });\n }\n\n public updatePinnedForumTopic(chatId: ChatId, topicId: number, pinned: boolean) {\n return this.apiManager.invokeApi('channels.updatePinnedForumTopic', {\n channel: this.getChannelInput(chatId),\n topic_id: getServerMessageId(topicId),\n pinned\n }).then(this.onChatUpdated.bind(this, chatId));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type lang from '../lang';\nimport type langSign from '../langSign';\nimport type {State} from '../config/state';\nimport DEBUG, {MOUNT_CLASS_TO} from '../config/debug';\nimport {HelpCountriesList, HelpCountry, LangPackDifference, LangPackString} from '../layer';\nimport stateStorage from './stateStorage';\nimport App from '../config/app';\nimport rootScope from './rootScope';\nimport {IS_MOBILE} from '../environment/userAgent';\nimport deepEqual from '../helpers/object/deepEqual';\nimport safeAssign from '../helpers/object/safeAssign';\nimport capitalizeFirstLetter from '../helpers/string/capitalizeFirstLetter';\nimport matchUrlProtocol from './richTextProcessor/matchUrlProtocol';\nimport wrapUrl from './richTextProcessor/wrapUrl';\n\nexport const langPack: {[actionType: string]: LangPackKey} = {\n 'messageActionChatCreate': 'ActionCreateGroup',\n 'messageActionChatCreateYou': 'ActionYouCreateGroup',\n 'messageActionChatEditTitle': 'ActionChangedTitle',\n 'messageActionChatEditPhoto': 'ActionChangedPhoto',\n 'messageActionChatEditVideo': 'ActionChangedVideo',\n 'messageActionChatDeletePhoto': 'ActionRemovedPhoto',\n 'messageActionChatReturn': 'ActionAddUserSelf',\n 'messageActionChatReturnYou': 'ActionAddUserSelfYou',\n 'messageActionChatJoined': 'ActionAddUserSelfMega',\n 'messageActionChatJoinedYou': 'ChannelMegaJoined',\n 'messageActionChatAddUser': 'ActionAddUser',\n 'messageActionChatAddUsers': 'ActionAddUser',\n 'messageActionChatLeave': 'ActionLeftUser',\n 'messageActionChatLeaveYou': 'YouLeft',\n 'messageActionChatDeleteUser': 'ActionKickUser',\n 'messageActionChatJoinedByLink': 'ActionInviteUser',\n 'messageActionPinMessage': 'Chat.Service.Group.UpdatedPinnedMessage',\n 'messageActionContactSignUp': 'Chat.Service.PeerJoinedTelegram',\n 'messageActionChannelCreate': 'ActionCreateChannel',\n 'messageActionChannelEditTitle': 'Chat.Service.Channel.UpdatedTitle',\n 'messageActionChannelEditPhoto': 'Chat.Service.Channel.UpdatedPhoto',\n 'messageActionChannelEditVideo': 'Chat.Service.Channel.UpdatedVideo',\n 'messageActionChannelDeletePhoto': 'Chat.Service.Channel.RemovedPhoto',\n 'messageActionHistoryClear': 'HistoryCleared',\n 'messageActionDiscussionStarted': 'DiscussionStarted',\n\n 'messageActionChannelMigrateFrom': 'ActionMigrateFromGroup',\n\n 'messageActionPhoneCall.video_in_ok': 'ChatList.Service.VideoCall.incoming',\n 'messageActionPhoneCall.video_out_ok': 'ChatList.Service.VideoCall.outgoing',\n 'messageActionPhoneCall.video_missed': 'ChatList.Service.VideoCall.Missed',\n 'messageActionPhoneCall.video_cancelled': 'ChatList.Service.VideoCall.Cancelled',\n 'messageActionPhoneCall.in_ok': 'ChatList.Service.Call.incoming',\n 'messageActionPhoneCall.out_ok': 'ChatList.Service.Call.outgoing',\n 'messageActionPhoneCall.missed': 'ChatList.Service.Call.Missed',\n 'messageActionPhoneCall.cancelled': 'ChatList.Service.Call.Cancelled',\n\n 'messageActionGroupCall.started': 'Chat.Service.VoiceChatStarted.Channel',\n 'messageActionGroupCall.started_by': 'Chat.Service.VoiceChatStarted',\n 'messageActionGroupCall.started_byYou': 'Chat.Service.VoiceChatStartedYou',\n 'messageActionGroupCall.ended': 'Chat.Service.VoiceChatFinished.Channel',\n 'messageActionGroupCall.ended_by': 'Chat.Service.VoiceChatFinished',\n 'messageActionGroupCall.ended_byYou': 'Chat.Service.VoiceChatFinishedYou',\n\n 'messageActionBotAllowed': 'Chat.Service.BotPermissionAllowed'\n};\n\nexport type LangPackKey = /* string | */keyof typeof lang | keyof typeof langSign;\n\nexport type FormatterArgument = string | number | Node | FormatterArgument[];\nexport type FormatterArguments = FormatterArgument[];\n\nexport const UNSUPPORTED_LANG_PACK_KEY: LangPackKey = IS_MOBILE ? 'Message.Unsupported.Mobile' : 'Message.Unsupported.Desktop';\n\nnamespace I18n {\n export const strings: Map = new Map();\n export const countriesList: HelpCountry[] = [];\n let pluralRules: Intl.PluralRules;\n\n let cacheLangPackPromise: Promise;\n export let lastRequestedLangCode: string;\n export let lastRequestedNormalizedLangCode: string;\n export let lastAppliedLangCode: string;\n export let requestedServerLanguage = false;\n export let timeFormat: State['settings']['timeFormat'];\n export let isRTL = false;\n\n export function setRTL(rtl: boolean) {\n isRTL = rtl;\n }\n\n function setLangCode(langCode: string) {\n lastRequestedLangCode = langCode;\n lastRequestedNormalizedLangCode = langCode.split('-')[0];\n }\n\n export function getCacheLangPack(): Promise {\n if(cacheLangPackPromise) return cacheLangPackPromise;\n return cacheLangPackPromise = Promise.all([\n stateStorage.get('langPack') as Promise,\n polyfillPromise\n ]).then(([langPack]) => {\n if(!langPack/* || true */) {\n return loadLocalLangPack();\n } else if(DEBUG && false) {\n return getLangPack(langPack.lang_code);\n }/* else if(langPack.appVersion !== App.langPackVersion) {\n return getLangPack(langPack.lang_code);\n } */\n\n if(!lastRequestedLangCode) {\n setLangCode(langPack.lang_code);\n }\n\n applyLangPack(langPack);\n return langPack;\n }).finally(() => {\n cacheLangPackPromise = undefined;\n });\n }\n\n function updateAmPm() {\n if(timeFormat === 'h12') {\n try {\n const dateTimeFormat = getDateTimeFormat({hour: 'numeric', minute: 'numeric', hour12: true});\n const date = new Date();\n date.setHours(0);\n const amText = dateTimeFormat.format(date);\n amPmCache.am = amText.split(' ')[1];\n date.setHours(12);\n const pmText = dateTimeFormat.format(date);\n amPmCache.pm = pmText.split(' ')[1];\n } catch(err) {\n console.error('cannot get am/pm', err);\n amPmCache = {am: 'AM', pm: 'PM'};\n }\n }\n }\n\n export function setTimeFormat(\n format: State['settings']['timeFormat'],\n haveToUpdate = !!timeFormat && timeFormat !== format\n ) {\n timeFormat = format;\n\n updateAmPm();\n\n if(haveToUpdate) {\n cachedDateTimeFormats.clear();\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance instanceof IntlDateElement) {\n instance.update();\n }\n });\n }\n }\n\n export function loadLocalLangPack() {\n const defaultCode = App.langPackCode;\n setLangCode(defaultCode);\n return Promise.all([\n import('../lang'),\n import('../langSign'),\n import('../countries')\n ]).then(([lang, langSign, countries]) => {\n const strings: LangPackString[] = [];\n formatLocalStrings(lang.default, strings);\n formatLocalStrings(langSign.default, strings);\n\n const langPack: LangPackDifference = {\n _: 'langPackDifference',\n from_version: 0,\n lang_code: defaultCode,\n strings,\n version: 0,\n local: true,\n countries: countries.default\n };\n return saveLangPack(langPack);\n });\n }\n\n export function loadLangPack(langCode: string, web?: boolean) {\n web = true;\n requestedServerLanguage = true;\n const managers = rootScope.managers;\n return Promise.all([\n managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: web ? 'web' : App.langPack\n }),\n !web && managers.apiManager.invokeApiCacheable('langpack.getLangPack', {\n lang_code: langCode,\n lang_pack: 'android'\n }),\n import('../lang'),\n import('../langSign'),\n managers.apiManager.invokeApiCacheable('help.getCountriesList', {\n lang_code: langCode,\n hash: 0\n }) as Promise,\n polyfillPromise\n ]);\n }\n\n export function getStrings(langCode: string, strings: string[]) {\n return rootScope.managers.apiManager.invokeApi('langpack.getStrings', {\n lang_pack: App.langPack,\n lang_code: langCode,\n keys: strings\n });\n }\n\n export function formatLocalStrings(strings: any, pushTo: LangPackString[] = []) {\n for(const i in strings) {\n // @ts-ignore\n const v = strings[i];\n if(typeof(v) === 'string') {\n pushTo.push({\n _: 'langPackString',\n key: i,\n value: v\n });\n } else {\n pushTo.push({\n _: 'langPackStringPluralized',\n key: i,\n ...v\n });\n }\n }\n\n return pushTo;\n }\n\n export function getLangPack(langCode: string, web?: boolean) {\n setLangCode(langCode);\n return loadLangPack(langCode, web).then(([langPack1, langPack2, localLangPack1, localLangPack2, countries, _]) => {\n let strings: LangPackString[] = [];\n\n [localLangPack1, localLangPack2].forEach((l) => {\n formatLocalStrings(l.default as any, strings);\n });\n\n strings = strings.concat(...[langPack1.strings, langPack2.strings].filter(Boolean));\n\n langPack1.strings = strings;\n langPack1.countries = countries;\n return saveLangPack(langPack1);\n });\n }\n\n export function saveLangPack(langPack: LangPackDifference) {\n langPack.appVersion = App.langPackVersion;\n\n return stateStorage.set({langPack}).then(() => {\n applyLangPack(langPack);\n return langPack;\n });\n }\n\n export const polyfillPromise = (function checkIfPolyfillNeeded() {\n if(typeof(Intl) !== 'undefined' && typeof(Intl.PluralRules) !== 'undefined'/* && false */) {\n return Promise.resolve();\n } else {\n return import('./pluralPolyfill').then((_Intl) => {\n (window as any).Intl = Object.assign(typeof(Intl) !== 'undefined' ? Intl : {}, _Intl.default);\n });\n }\n })();\n\n export function applyLangPack(langPack: LangPackDifference) {\n const currentLangCode = lastRequestedLangCode;\n if(langPack.lang_code !== currentLangCode) {\n return;\n }\n\n try {\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(lastRequestedNormalizedLangCode.split('-', 1)[0]);\n }\n\n try {\n pluralRules = new Intl.PluralRules(langPack.lang_code);\n } catch(err) {\n console.error('pluralRules error', err);\n pluralRules = new Intl.PluralRules(langPack.lang_code.split('-', 1)[0]);\n }\n\n strings.clear();\n\n for(const string of langPack.strings) {\n strings.set(string.key as LangPackKey, string);\n }\n\n if(langPack.countries) {\n countriesList.length = 0;\n countriesList.push(...langPack.countries.countries);\n\n langPack.countries.countries.forEach((country) => {\n if(country.name) {\n const langPackKey: any = country.default_name;\n strings.set(langPackKey, {\n _: 'langPackString',\n key: langPackKey,\n value: country.name\n });\n }\n });\n }\n\n if(lastAppliedLangCode !== currentLangCode) {\n rootScope.dispatchEvent('language_change', currentLangCode);\n lastAppliedLangCode = currentLangCode;\n cachedDateTimeFormats.clear();\n updateAmPm();\n }\n\n const elements = Array.from(document.querySelectorAll(`.i18n`)) as HTMLElement[];\n elements.forEach((element) => {\n const instance = weakMap.get(element);\n\n if(instance) {\n instance.update();\n }\n });\n }\n\n function pushNextArgument(out: ReturnType, args: FormatterArguments, indexHolder: {i: number}) {\n const arg = args[indexHolder.i++];\n if(Array.isArray(arg)) {\n out.push(...arg as any);\n } else {\n out.push(arg);\n }\n }\n\n export function superFormatter(input: string, args?: FormatterArguments, indexHolder = {i: 0}): Exclude[] {\n const out: ReturnType = [];\n const regExp = /(\\*\\*|__)(.+?)\\1|(\\n)|(\\[.+?\\]\\(.*?\\))|un\\d|%\\d\\$.|%./g;\n\n let lastIndex = 0;\n input.replace(regExp, (match, p1: any, p2: any, p3: any, p4: string, offset: number, string: string) => {\n // console.table({match, p1, p2, offset, string});\n\n out.push(string.slice(lastIndex, offset));\n\n if(p1) {\n // offset += p1.length;\n let element: HTMLElement;\n switch(p1) {\n case '**': {\n element = document.createElement('b');\n break;\n }\n\n case '__': {\n element = document.createElement('i');\n break;\n }\n }\n\n element.append(...superFormatter(p2, args, indexHolder) as any);\n out.push(element);\n } else if(p3) {\n out.push(document.createElement('br'));\n } else if(p4) {\n const idx = p4.lastIndexOf(']');\n const text = p4.slice(1, idx);\n\n const url = p4.slice(idx + 2, p4.length - 1);\n let a: HTMLAnchorElement;\n if(url && matchUrlProtocol(url)) {\n a = document.createElement('a');\n const wrappedUrl = wrapUrl(url);\n a.href = wrappedUrl.url;\n if(wrappedUrl.onclick) a.setAttribute('onclick', wrappedUrl.onclick);\n a.target = '_blank';\n } else {\n a = args[indexHolder.i++] as HTMLAnchorElement;\n\n if(a instanceof DocumentFragment) { // right after wrapRichText\n a = a.firstChild as any;\n }\n\n a.textContent = ''; // reset content\n }\n\n a.append(...superFormatter(text, args, indexHolder) as any);\n\n out.push(a);\n } else if(args) {\n pushNextArgument(out, args, indexHolder);\n }\n\n lastIndex = offset + match.length;\n return '';\n });\n\n if(lastIndex !== input.length) {\n out.push(input.slice(lastIndex));\n }\n\n return out;\n }\n\n export function format(key: LangPackKey, plain: true, args?: FormatterArguments): string;\n export function format(key: LangPackKey, plain?: false, args?: FormatterArguments): ReturnType;\n export function format(key: LangPackKey, plain = false, args?: FormatterArguments): ReturnType | string {\n const str = strings.get(key);\n let input: string;\n if(str) {\n if(str._ === 'langPackStringPluralized' && args?.length) {\n let v = args[0] as number | string;\n if(typeof(v) === 'string') v = +v.replace(/\\D/g, '');\n const s = pluralRules.select(v);\n // @ts-ignore\n input = str[s + '_value'] || str['other_value'];\n } else if(str._ === 'langPackString') {\n input = str.value;\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n } else {\n // input = '[' + key + ']';\n input = key;\n }\n\n const result = superFormatter(input, args);\n if(plain) { // * let's try a hack now... (don't want to replace []() entity)\n return result.map((item) => item instanceof Node ? item.textContent : item).join('');\n } else {\n return result;\n }\n\n /* if(plain) {\n if(args?.length) {\n const regExp = /un\\d|%\\d\\$.|%./g;\n let i = 0;\n input = input.replace(regExp, (match, offset, string) => {\n return '' + args[i++];\n });\n }\n\n return input;\n } else {\n return superFormatter(input, args);\n } */\n }\n\n export const weakMap: WeakMap> = new WeakMap();\n\n export type IntlElementBaseOptions = {\n element?: HTMLElement,\n property?: 'innerText' | 'innerHTML' | 'placeholder' | 'textContent',\n };\n\n abstract class IntlElementBase {\n public element: IntlElementBaseOptions['element'];\n public property: IntlElementBaseOptions['property'];\n\n constructor(options?: Options) {\n this.element = options?.element || document.createElement('span');\n this.element.classList.add('i18n');\n\n this.property = options?.property;\n if(options && ((options as any as IntlElementOptions).key || (options as any as IntlDateElementOptions).date)) {\n this.update(options);\n }\n\n weakMap.set(this.element, this);\n }\n\n abstract update(options?: Options): void;\n }\n\n export type IntlElementOptions = IntlElementBaseOptions & {\n key?: LangPackKey,\n args?: FormatterArguments\n };\n export class IntlElement extends IntlElementBase {\n public key: IntlElementOptions['key'];\n public args: IntlElementOptions['args'];\n\n constructor(options: IntlElementOptions = {}) {\n super({...options, property: options.property ?? 'innerHTML'});\n }\n\n public update(options?: IntlElementOptions) {\n safeAssign(this, options);\n\n if(this.property === 'innerHTML') {\n this.element.textContent = '';\n this.element.append(...format(this.key, false, this.args) as any);\n } else {\n // @ts-ignore\n const v = this.element[this.property];\n const formatted = format(this.key, true, this.args);\n\n // * hasOwnProperty won't work here\n if(v === undefined) this.element.dataset[this.property] = formatted;\n else (this.element as HTMLInputElement)[this.property] = formatted;\n }\n }\n\n public compareAndUpdate(options?: IntlElementOptions) {\n if(this.key === options.key && deepEqual(this.args, options.args)) {\n return;\n }\n\n return this.update(options);\n }\n }\n\n const cachedDateTimeFormats: Map = new Map();\n function getDateTimeFormat(options: Intl.DateTimeFormatOptions = {}) {\n const json = JSON.stringify(options);\n let dateTimeFormat = cachedDateTimeFormats.get(json);\n if(!dateTimeFormat) {\n dateTimeFormat = new Intl.DateTimeFormat(lastRequestedNormalizedLangCode + '-u-hc-' + timeFormat, options);\n cachedDateTimeFormats.set(json, dateTimeFormat);\n }\n\n return dateTimeFormat;\n }\n\n export let amPmCache = {am: 'AM', pm: 'PM'};\n export type IntlDateElementOptions = IntlElementBaseOptions & {\n date?: Date,\n options: Intl.DateTimeFormatOptions\n };\n export class IntlDateElement extends IntlElementBase {\n public date: IntlDateElementOptions['date'];\n public options: IntlDateElementOptions['options'];\n\n constructor(options: IntlDateElementOptions) {\n super({...options, property: options.property ?? 'textContent'});\n }\n\n public update(options?: IntlDateElementOptions) {\n safeAssign(this, options);\n\n let text: string;\n if(this.options.hour && this.options.minute && Object.keys(this.options).length === 2/* && false */) {\n const hours = this.date.getHours();\n text = ('0' + (timeFormat === 'h12' ? (hours % 12) || 12 : hours)).slice(-2) + ':' + ('0' + this.date.getMinutes()).slice(-2);\n // if(this.options.second) {\n // text += ':' + ('0' + this.date.getSeconds()).slice(-2);\n // }\n\n if(timeFormat === 'h12') {\n text += ' ' + (hours < 12 ? amPmCache.am : amPmCache.pm);\n }\n } else {\n // * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n const dateTimeFormat = getDateTimeFormat(this.options);\n text = capitalizeFirstLetter(dateTimeFormat.format(this.date));\n }\n\n (this.element as any)[this.property] = text;\n }\n }\n\n export function i18n(key: LangPackKey, args?: FormatterArguments) {\n return new IntlElement({key, args}).element;\n }\n\n export function i18n_(options: IntlElementOptions) {\n return new IntlElement(options).element;\n }\n\n export function _i18n(element: HTMLElement, key: LangPackKey, args?: FormatterArguments, property?: IntlElementOptions['property']) {\n return new IntlElement({element, key, args, property}).element;\n }\n}\n\nexport {I18n};\nexport default I18n;\n\nconst i18n = I18n.i18n;\nexport {i18n};\n\nconst i18n_ = I18n.i18n_;\nexport {i18n_};\n\nconst _i18n = I18n._i18n;\nexport {_i18n};\n\nexport function joinElementsWith(elements: (Node | string)[], joiner: typeof elements[0] | ((isLast: boolean) => typeof elements[0])) {\n const arr = elements.slice(0, 1);\n for(let i = 1; i < elements.length; ++i) {\n const isLast = (elements.length - 1) === i;\n arr.push(typeof(joiner) === 'function' ? joiner(isLast) : joiner);\n arr.push(elements[i]);\n }\n\n return arr;\n}\n\n\nexport function join(elements: (Node | string)[], useLast: boolean, plain: true): string;\nexport function join(elements: (Node | string)[], useLast?: boolean, plain?: false): (string | Node)[];\nexport function join(elements: (Node | string)[], useLast: boolean, plain: boolean): string | (string | Node)[];\nexport function join(elements: (Node | string)[], useLast = true, plain?: boolean): string | (string | Node)[] {\n const joined = joinElementsWith(elements, (isLast) => {\n const langPackKey: LangPackKey = isLast && useLast ? 'AutoDownloadSettings.LastDelimeter' : 'AutoDownloadSettings.Delimeter';\n return plain ? I18n.format(langPackKey, true) : i18n(langPackKey);\n });\n\n return plain ? joined.join('') : joined;\n}\n\nMOUNT_CLASS_TO.I18n = I18n;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type addAnchorListener from '../../helpers/addAnchorListener';\nimport {PHONE_NUMBER_REG_EXP} from '.';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport matchUrlProtocol from './matchUrlProtocol';\nimport {T_ME_PREFIXES} from '../mtproto/mtproto_config';\n\nexport default function wrapUrl(url: string, unsafe?: number | boolean) {\n if(!matchUrlProtocol(url)) {\n url = 'https://' + url;\n }\n\n const out: {url: string, onclick?: Parameters[0]['name']} = {url};\n let tgMeMatch, telescoPeMatch, tgMatch;\n let onclick: typeof out['onclick'];\n /* if(unsafe === 2) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } else */if((tgMeMatch = url.match(/^(?:https?:\\/\\/)?(?:(.+?)\\.)?(?:(?:web|k|z)\\.)?t(?:elegram)?\\.me(?:\\/(.+))?/))) {\n const u = new URL(url);\n let prefix = tgMeMatch[1];\n if(prefix && T_ME_PREFIXES.has(tgMeMatch[1])) {\n prefix = undefined;\n }\n\n if(prefix) {\n u.pathname = prefix + (u.pathname === '/' ? '' : u.pathname);\n }\n\n const fullPath = u.pathname.slice(1);\n const path = fullPath.split('/');\n\n if(path[0] && path[0][0] === '$' && path[0].length > 1) {\n onclick = 'invoice';\n } else if(/^\\W/.test(fullPath) && !PHONE_NUMBER_REG_EXP.test(fullPath)) { // second regexp is for phone numbers (t.me/+38050...)\n onclick = 'joinchat';\n } else switch(path[0]) {\n case 'joinchat':\n case 'addstickers':\n case 'addemoji':\n case 'voicechat':\n case 'invoice':\n if(path.length !== 1 && !prefix) {\n onclick = path[0];\n break;\n }\n\n default:\n if((path[1] && path[1].match(/^\\d+(?:\\?(?:comment|thread)=\\d+)?$/)) || path.length === 1) {\n onclick = 'im';\n break;\n }\n\n break;\n }\n } else if((telescoPeMatch = url.match(/^(?:https?:\\/\\/)?telesco\\.pe\\/([^/?]+)\\/(\\d+)/))) {\n onclick = 'im';\n } else if((tgMatch = url.match(/tg:(?:\\/\\/)?(.+?)(?:\\?|$)/))) {\n onclick = 'tg_' + tgMatch[1] as any;\n }/* else if(unsafe) {\n url = 'tg://unsafe_url?url=' + encodeURIComponent(url);\n } */\n\n if(!(window as any)[onclick]) {\n onclick = undefined;\n }\n\n out.onclick = onclick;\n return out;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.wrapUrl = wrapUrl);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MOUNT_CLASS_TO} from '../config/debug';\nimport I18n, {i18n} from '../lib/langPack';\n\nexport const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\nexport const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\n\nexport const ONE_DAY = 86400;\n\n// https://stackoverflow.com/a/6117889\nexport const getWeekNumber = (date: Date) => {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));\n const dayNum = d.getUTCDay() || 7;\n d.setUTCDate(d.getUTCDate() + 4 - dayNum);\n const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));\n return Math.ceil((((d.getTime() - yearStart.getTime()) / ONE_DAY) + 1) / 7);\n};\n\nexport function formatDateAccordingToTodayNew(time: Date) {\n const today = new Date();\n const now = today.getTime() / 1000 | 0;\n const timestamp = time.getTime() / 1000 | 0;\n\n const options: Intl.DateTimeFormatOptions = {};\n if((now - timestamp) < ONE_DAY && today.getDate() === time.getDate()) { // if the same day\n options.hour = options.minute = '2-digit';\n } else if(today.getFullYear() !== time.getFullYear()) { // different year\n options.year = options.day = 'numeric';\n options.month = '2-digit';\n } else if((now - timestamp) < (ONE_DAY * 7) && getWeekNumber(today) === getWeekNumber(time)) { // current week\n options.weekday = 'short';\n } else { // same year\n options.month = 'short';\n options.day = 'numeric';\n }\n\n return new I18n.IntlDateElement({\n date: time,\n options\n }).element;\n}\n\nexport function formatFullSentTimeRaw(timestamp: number, options: {\n capitalize?: boolean\n} = {}) {\n const date = new Date();\n const time = new Date(timestamp * 1000);\n const now = date.getTime() / 1000;\n\n const timeEl = formatTime(time);\n\n let dateEl: Node | string;\n if((now - timestamp) < ONE_DAY && date.getDate() === time.getDate()) { // if the same day\n dateEl = i18n(options.capitalize ? 'Date.Today' : 'Peer.Status.Today');\n } else if((now - timestamp) < (ONE_DAY * 2) && (date.getDate() - 1) === time.getDate()) { // yesterday\n dateEl = i18n(options.capitalize ? 'Yesterday' : 'Peer.Status.Yesterday');\n\n if(options.capitalize) {\n (dateEl as HTMLElement).style.textTransform = 'capitalize';\n }\n } else if(date.getFullYear() !== time.getFullYear()) { // different year\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric',\n year: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate() + ', ' + time.getFullYear();\n } else {\n dateEl = new I18n.IntlDateElement({\n date: time,\n options: {\n month: 'short',\n day: 'numeric'\n }\n }).element;\n // dateStr = months[time.getMonth()].slice(0, 3) + ' ' + time.getDate();\n }\n\n return {dateEl, timeEl};\n}\n\nexport function formatFullSentTime(timestamp: number) {\n const {dateEl, timeEl} = formatFullSentTimeRaw(timestamp, {\n capitalize: true\n });\n\n const fragment = document.createDocumentFragment();\n fragment.append(dateEl, ' ', i18n('ScheduleController.at'), ' ', timeEl);\n return fragment;\n}\n\nexport function formatTime(date: Date) {\n return new I18n.IntlDateElement({\n date,\n options: {\n hour: '2-digit',\n minute: '2-digit'\n }\n }).element;\n}\n\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.formatDateAccordingToTodayNew = formatDateAccordingToTodayNew);\n\nexport const getFullDate = (date: Date, options: Partial<{\n noTime: true,\n noSeconds: true,\n monthAsNumber: true,\n leadingZero: true\n}> = {}) => {\n const joiner = options.monthAsNumber ? '.' : ' ';\n const time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2) + (options.noSeconds ? '' : ':' + ('0' + date.getSeconds()).slice(-2));\n\n return (options.leadingZero ? ('0' + date.getDate()).slice(-2) : date.getDate()) +\n joiner + (options.monthAsNumber ? ('0' + (date.getMonth() + 1)).slice(-2) : months[date.getMonth()]) +\n joiner + date.getFullYear() +\n (options.noTime ? '' : ', ' + time);\n};\n\n// https://github.com/DrKLO/Telegram/blob/d52b2c921abd3c1e8d6368858313ad0cb0468c07/TMessagesProj/src/main/java/org/telegram/ui/Adapters/FiltersView.java\nconst minYear = 2013;\nconst yearPattern = new RegExp('20[0-9]{1,2}');\nconst monthYearOrDayPattern = new RegExp('(\\\\w{3,}) ([0-9]{0,4})', 'i');\nconst yearOrDayAndMonthPattern = new RegExp('([0-9]{0,4}) (\\\\w{2,})', 'i');\nconst shortDate = new RegExp('^([0-9]{1,4})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst longDate = new RegExp('^([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,2})(\\\\.| |/|\\\\-)([0-9]{1,4})$', 'i');\nconst numberOfDaysEachMonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\nexport type DateData = {\n title: string,\n minDate: number,\n maxDate: number,\n};\nexport function fillTipDates(query: string, dates: DateData[]) {\n const q = query.trim().toLowerCase();\n\n if(q.length < 3) {\n return;\n }\n\n if('today'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: 'Today',\n minDate,\n maxDate\n });\n return;\n }\n\n if('yesterday'.indexOf(q) === 0) {\n const date = new Date();\n const year = date.getFullYear();\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime() - 86400000;\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 86400001;\n dates.push({\n title: 'Yesterday',\n minDate,\n maxDate\n });\n return;\n }\n\n const dayOfWeek = getDayOfWeek(q);\n if(dayOfWeek >= 0) {\n const date = new Date();\n const now = date.getTime();\n const currentDay = date.getDay();\n const distance = dayOfWeek - currentDay;\n date.setDate(date.getDate() + distance);\n if(date.getTime() > now) {\n date.setTime(date.getTime() - 604800000);\n }\n const year = date.getFullYear()\n const month = date.getMonth();\n const day = date.getDate();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatWeekLong(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n let matches: any[];\n if((matches = shortDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const k = parseInt(g1);\n const k1 = parseInt(g2);\n if(k > 0 && k <= 31) {\n if(k1 >= minYear && k <= 12) {\n const selectedYear = k1;\n const month = k - 1;\n createForMonthYear(dates, month, selectedYear);\n return;\n } else if(k1 <= 12) {\n const day = k - 1;\n const month = k1 - 1;\n createForDayMonth(dates, day, month);\n }\n } else if(k >= minYear && k1 <= 12) {\n const selectedYear = k;\n const month = k1 - 1;\n createForMonthYear(dates, month, selectedYear);\n }\n\n return;\n }\n\n if((matches = longDate.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[3];\n const g3 = matches[5];\n if(!matches[2] === matches[4]) {\n return;\n }\n\n const day = parseInt(g1);\n const month = parseInt(g2) - 1;\n let year = parseInt(g3);\n if(year >= 10 && year <= 99) {\n year += 2000;\n }\n\n const currentYear = new Date().getFullYear();\n if(validDateForMonth(day - 1, month) && year >= minYear && year <= currentYear) {\n const date = new Date();\n date.setFullYear(year, month, day);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(year, month, day + 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n return;\n }\n\n return;\n }\n\n if((matches = yearPattern.exec(q)) !== null) {\n let selectedYear = +q;\n const currentYear = new Date().getFullYear();\n if(selectedYear < minYear) {\n selectedYear = minYear;\n for(let i = currentYear; i >= selectedYear; i--) {\n const date = new Date();\n date.setFullYear(i, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(i + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + i,\n minDate,\n maxDate\n });\n }\n } else if(selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, 0, 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n date.setFullYear(selectedYear + 1, 0, 1);\n date.setHours(0, 0, 0);\n\n const maxDate = date.getTime() - 1;\n dates.push({\n title: '' + selectedYear,\n minDate,\n maxDate\n });\n }\n\n return;\n }\n\n if((matches = monthYearOrDayPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g1);\n if(month >= 0) {\n const k = +g2;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n return;\n }\n }\n }\n\n if((matches = yearOrDayAndMonthPattern.exec(q)) !== null) {\n const g1 = matches[1];\n const g2 = matches[2];\n const month = getMonth(g2);\n if(month >= 0) {\n const k = +g1;\n if(k > 0 && k <= 31) {\n const day = k - 1;\n createForDayMonth(dates, day, month);\n return;\n } else if(k >= minYear) {\n const selectedYear = k;\n createForMonthYear(dates, month, selectedYear);\n }\n }\n }\n}\n\nfunction createForMonthYear(dates: DateData[], month: number, selectedYear: number) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n if(selectedYear >= minYear && selectedYear <= currentYear) {\n const date = new Date();\n date.setFullYear(selectedYear, month, 1);\n date.setHours(0, 0, 0);\n const minDate = date.getTime();\n if(minDate > today) {\n return;\n }\n date.setMonth(date.getMonth() + 1);\n const maxDate = date.getTime() - 1;\n\n dates.push({\n title: formatterMonthYear(minDate),\n minDate,\n maxDate\n });\n }\n}\n\nfunction createForDayMonth(dates: DateData[], day: number, month: number) {\n if(validDateForMonth(day, month)) {\n const currentYear = new Date().getFullYear();\n const today = Date.now();\n\n for(let i = currentYear; i >= minYear; i--) {\n if(month === 1 && day === 28 && !isLeapYear(i)) {\n continue;\n }\n\n const date = new Date();\n date.setFullYear(i, month, day + 1);\n date.setHours(0, 0, 0);\n\n const minDate = date.getTime();\n if(minDate > today) {\n continue;\n }\n\n date.setFullYear(i, month, day + 2);\n date.setHours(0, 0, 0);\n const maxDate = date.getTime() - 1;\n if(i === currentYear) {\n dates.push({\n title: formatterDayMonth(minDate),\n minDate,\n maxDate\n });\n } else {\n dates.push({\n title: formatterYearMax(minDate),\n minDate,\n maxDate\n });\n }\n }\n }\n}\n\nfunction formatterMonthYear(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getFullYear();\n}\n\nfunction formatterDayMonth(timestamp: number) {\n const date = new Date(timestamp);\n return months[date.getMonth()].slice(0, 3) + ' ' + date.getDate();\n}\n\nfunction formatterYearMax(timestamp: number) {\n const date = new Date(timestamp);\n return ('0' + date.getDate()).slice(-2) + '.' + ('0' + (date.getMonth() + 1)).slice(-2) + '.' + date.getFullYear();\n}\n\nfunction formatWeekLong(timestamp: number) {\n const date = new Date(timestamp);\n return days[date.getDay()];\n}\n\nfunction validDateForMonth(day: number, month: number) {\n if(month >= 0 && month < 12) {\n if(day >= 0 && day < numberOfDaysEachMonth[month]) {\n return true;\n }\n }\n return false;\n}\n\nfunction isLeapYear(year: number) {\n return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\n}\n\nfunction getMonth(q: string) {\n /* String[] months = new String[]{\n LocaleController.getString(\"January\", R.string.January).toLowerCase(),\n LocaleController.getString(\"February\", R.string.February).toLowerCase(),\n LocaleController.getString(\"March\", R.string.March).toLowerCase(),\n LocaleController.getString(\"April\", R.string.April).toLowerCase(),\n LocaleController.getString(\"May\", R.string.May).toLowerCase(),\n LocaleController.getString(\"June\", R.string.June).toLowerCase(),\n LocaleController.getString(\"July\", R.string.July).toLowerCase(),\n LocaleController.getString(\"August\", R.string.August).toLowerCase(),\n LocaleController.getString(\"September\", R.string.September).toLowerCase(),\n LocaleController.getString(\"October\", R.string.October).toLowerCase(),\n LocaleController.getString(\"November\", R.string.November).toLowerCase(),\n LocaleController.getString(\"December\", R.string.December).toLowerCase()\n }; */\n\n /* String[] monthsEng = new String[12];\n Calendar c = Calendar.getInstance();\n for (int i = 1; i <= 12; i++) {\n c.set(0, 0, 0, 0, 0, 0);\n c.set(Calendar.MONTH, i);\n monthsEng[i - 1] = c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH).toLowerCase();\n } */\n\n q = q.toLowerCase();\n for(let i = 0; i < 12; i++) {\n const month = months[i].toLowerCase();\n if(month.indexOf(q) === 0) {\n return i;\n }\n }\n return -1;\n}\n\nfunction getDayOfWeek(q: string) {\n const c = new Date();\n if(q.length <= 3) {\n return -1;\n }\n\n for(let i = 0; i < 7; i++) {\n c.setDate(c.getDate() + 1);\n\n if(formatWeekLong(c.getTime()).toLowerCase().indexOf(q) === 0) {\n return c.getDay();\n }\n }\n return -1;\n}\n\nMOUNT_CLASS_TO.fillTipDates = fillTipDates;\n","/**\n * Will be used for FILE_REFERENCE_EXPIRED\n * @param key\n * @param wasObject\n * @param newObject\n */\nexport default function safeReplaceArrayInObject(key: K, wasObject: any, newObject: any) {\n if('byteLength' in newObject[key]) { // Uint8Array\n newObject[key] = [...newObject[key]];\n }\n\n if(wasObject && wasObject[key] !== newObject[key]) {\n wasObject[key].length = newObject[key].length;\n (newObject[key] as any[]).forEach((v, i) => {\n wasObject[key][i] = v;\n });\n\n /* wasObject[key].set(newObject[key]); */\n newObject[key] = wasObject[key];\n }\n}\n","export const EXTENSION_MIME_TYPE_MAP: {[ext in MTFileExtension]: MTMimeType} = {\n pdf: 'application/pdf',\n tgv: 'application/x-tgwallpattern',\n tgs: 'application/x-tgsticker',\n json: 'application/json',\n wav: 'audio/wav',\n mp3: 'audio/mpeg',\n ogg: 'audio/ogg',\n jpeg: 'image/jpeg',\n jpg: 'image/jpeg',\n png: 'image/png',\n gif: 'image/gif',\n webp: 'image/webp',\n mp4: 'video/mp4',\n webm: 'video/webm',\n mov: 'video/quicktime',\n svg: 'image/svg+xml'\n};\n\nexport const MIME_TYPE_EXTENSION_MAP: {[mimeType in MTMimeType]?: MTFileExtension} = {};\n\nfor(const ext in EXTENSION_MIME_TYPE_MAP) {\n MIME_TYPE_EXTENSION_MAP[EXTENSION_MIME_TYPE_MAP[ext as MTFileExtension]] = ext as MTFileExtension;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {ThumbCache} from '../storages/thumbs';\nimport {AccountWallPapers, Document, DocumentAttribute, MessagesSavedGifs, PhotoSize, WallPaper} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {getFullDate} from '../../helpers/date';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\nimport {AppManager} from './manager';\nimport wrapPlainText from '../richTextProcessor/wrapPlainText';\nimport assumeType from '../../helpers/assumeType';\nimport {getEnvironment} from '../../environment/utils';\nimport {isServiceWorkerOnline} from '../mtproto/mtproto.worker';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport getDocumentInputFileLocation from './utils/docs/getDocumentInputFileLocation';\nimport getDocumentURL from './utils/docs/getDocumentURL';\nimport makeError from '../../helpers/makeError';\nimport {EXTENSION_MIME_TYPE_MAP} from '../../environment/mimeTypeMap';\nimport {THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n\nexport type MyDocument = Document.document;\n\n// TODO: если залить картинку файлом, а потом перезайти в диалог - превьюшка заново скачается\n\ntype WallPaperId = WallPaper.wallPaper['id'];\n\nlet uploadWallPaperTempId = 0;\n\nexport class AppDocsManager extends AppManager {\n private docs: {[docId: DocId]: MyDocument};\n\n private stickerCachedThumbs: {[docId: DocId]: {[toneIndex: number]: {url: string, w: number, h: number}}};\n\n private uploadingWallPapers: {[id: WallPaperId]: {cacheContext: ThumbCache, file: File}};\n\n protected after() {\n this.docs = {};\n this.stickerCachedThumbs = {};\n this.uploadingWallPapers = {};\n\n MTProtoMessagePort.getInstance().addEventListener('serviceWorkerOnline', (online) => {\n if(!online) {\n this.onServiceWorkerFail();\n }\n });\n }\n\n private onServiceWorkerFail = () => {\n for(const id in this.docs) {\n const doc = this.docs[id];\n\n if(doc.supportsStreaming) {\n delete doc.supportsStreaming;\n this.thumbsStorage.deleteCacheContext(doc);\n }\n }\n };\n\n public saveDoc(doc: Document, context?: ReferenceContext): MyDocument {\n if(!doc || doc._ === 'documentEmpty') {\n return;\n }\n\n const oldDoc = this.docs[doc.id];\n\n if(doc.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldDoc, doc);\n this.referenceDatabase.saveContext(doc.file_reference, context);\n }\n\n // console.log('saveDoc', apiDoc, this.docs[apiDoc.id]);\n // if(oldDoc) {\n // //if(doc._ !== 'documentEmpty' && doc._ === d._) {\n // if(doc.thumbs) {\n // if(!oldDoc.thumbs) oldDoc.thumbs = doc.thumbs;\n // /* else if(apiDoc.thumbs[0].bytes && !d.thumbs[0].bytes) {\n // d.thumbs.unshift(apiDoc.thumbs[0]);\n // } else if(d.thumbs[0].url) { // fix for converted thumb in safari\n // apiDoc.thumbs[0] = d.thumbs[0];\n // } */\n // }\n\n // //}\n\n // return oldDoc;\n\n // //return Object.assign(d, apiDoc, context);\n // //return context ? Object.assign(d, context) : d;\n // }\n\n if(!oldDoc) {\n this.docs[doc.id] = doc;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(doc, [/* 'thumbs', */'type', 'h', 'w', 'file_name',\n // 'file', 'duration', 'downloaded', 'url', 'audioTitle',\n // 'audioPerformer', 'sticker', 'stickerEmoji', 'stickerEmojiRaw',\n // 'stickerSetInput', 'stickerThumbConverted', 'animated', 'supportsStreaming']);\n\n for(let i = 0, length = doc.attributes.length; i < length; ++i) {\n const attribute = doc.attributes[i];\n switch(attribute._) {\n case 'documentAttributeFilename': {\n doc.file_name = wrapPlainText(attribute.file_name);\n break;\n }\n\n case 'documentAttributeAudio': {\n if(doc.type === 'round') {\n break;\n }\n\n doc.duration = attribute.duration;\n doc.type = attribute.pFlags.voice && doc.mime_type === 'audio/ogg' ? 'voice' : 'audio';\n break;\n }\n\n case 'documentAttributeVideo': {\n doc.duration = attribute.duration;\n doc.w = attribute.w;\n doc.h = attribute.h;\n // apiDoc.supportsStreaming = attribute.pFlags?.supports_streaming/* && apiDoc.size > 524288 */;\n if(/* apiDoc.thumbs && */attribute.pFlags.round_message) {\n doc.type = 'round';\n } else /* if(apiDoc.thumbs) */ {\n doc.type = 'video';\n }\n break;\n }\n\n case 'documentAttributeCustomEmoji':\n case 'documentAttributeSticker': {\n if(attribute.alt !== undefined) {\n doc.stickerEmojiRaw = attribute.alt;\n }\n\n if(attribute.stickerset) {\n if(attribute.stickerset._ === 'inputStickerSetEmpty') {\n delete attribute.stickerset;\n } else if(attribute.stickerset._ === 'inputStickerSetID') {\n doc.stickerSetInput = attribute.stickerset;\n }\n }\n\n // * there can be no thumbs, then it is a document\n if(/* apiDoc.thumbs && */doc.mime_type === 'image/webp' && (doc.thumbs || getEnvironment().IS_WEBP_SUPPORTED)) {\n doc.type = 'sticker';\n doc.sticker = 1;\n } else if(doc.mime_type === 'video/webm') {\n if(!getEnvironment().IS_WEBM_SUPPORTED) {\n break;\n }\n\n doc.type = 'sticker';\n doc.sticker = 3;\n doc.animated = true;\n }\n break;\n }\n\n case 'documentAttributeImageSize': {\n doc.type = 'photo';\n doc.w = attribute.w;\n doc.h = attribute.h;\n break;\n }\n\n case 'documentAttributeAnimated': {\n if((doc.mime_type === 'image/gif' || doc.mime_type === 'video/mp4')/* && apiDoc.thumbs */) {\n doc.type = 'gif';\n }\n\n doc.animated = true;\n break;\n }\n }\n }\n\n if(!doc.mime_type) {\n const ext = (doc.file_name || '').split('.').pop();\n // @ts-ignore\n const mappedMimeType = ext && EXTENSION_MIME_TYPE_MAP[ext.toLowerCase()];\n if(mappedMimeType) {\n doc.mime_type = mappedMimeType;\n } else {\n switch(doc.type) {\n case 'gif':\n case 'video':\n case 'round':\n doc.mime_type = 'video/mp4';\n break;\n case 'sticker':\n doc.mime_type = 'image/webp';\n break;\n case 'audio':\n doc.mime_type = 'audio/mpeg';\n break;\n case 'voice':\n doc.mime_type = 'audio/ogg';\n break;\n default:\n doc.mime_type = 'application/octet-stream';\n break;\n }\n }\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.pdf) {\n doc.type = 'pdf';\n } else if(doc.mime_type === EXTENSION_MIME_TYPE_MAP.gif) {\n doc.type = 'gif';\n } else if(doc.mime_type === 'application/x-tgsticker' && doc.file_name === 'AnimatedSticker.tgs') {\n doc.type = 'sticker';\n doc.animated = true;\n doc.sticker = 2;\n }\n\n if(doc.type === 'voice' || doc.type === 'round') {\n // browser will identify extension\n const attribute = doc.attributes.find((attribute) => attribute._ === 'documentAttributeFilename') as DocumentAttribute.documentAttributeFilename;\n const ext = attribute && attribute.file_name.split('.').pop();\n const date = getFullDate(new Date(doc.date * 1000), {monthAsNumber: true, leadingZero: true}).replace(/[:\\.]/g, '-').replace(', ', '_');\n doc.file_name = `${doc.type}_${date}${ext ? '.' + ext : ''}`;\n }\n\n if(isServiceWorkerOnline() && (doc.type === 'gif' && doc.size > 8e6) || doc.type === 'audio' || doc.type === 'video'/* || doc.mime_type.indexOf('video/') === 0 */) {\n doc.supportsStreaming = true;\n\n const cacheContext = this.thumbsStorage.getCacheContext(doc);\n if(!cacheContext.url) {\n this.thumbsStorage.setCacheContextURL(doc, undefined, getDocumentURL(doc), 0);\n }\n } else {\n doc.supportsStreaming = false;\n }\n\n // for testing purposes\n // doc.supportsStreaming = false;\n // doc.url = ''; // * this will break upload urls\n\n doc.file_name ||= '';\n\n /* if(!doc.url) {\n doc.url = this.getFileURL(doc);\n } */\n\n if(oldDoc) {\n return Object.assign(oldDoc, doc);\n }\n\n return doc;\n }\n\n public getDoc(docId: DocId | MyDocument): MyDocument {\n return isObject(docId) ? docId : this.docs[docId];\n }\n\n public downloadDoc(doc: MyDocument, queueId?: number, onlyCache?: boolean) {\n return this.apiFileManager.downloadMedia({\n media: doc,\n queueId,\n onlyCache\n });\n }\n\n public getLottieCachedThumb(docId: DocId, toneIndex: number) {\n const cached = this.stickerCachedThumbs[docId];\n return cached && cached[toneIndex];\n }\n\n public saveLottiePreview(docId: DocId, blob: Blob, width: number, height: number, toneIndex: number) {\n const doc = this.getDoc(docId);\n if(!doc) {\n return;\n }\n\n const cached = this.stickerCachedThumbs[doc.id] ??= {};\n\n const thumb = cached[toneIndex];\n if(thumb && thumb.w >= width && thumb.h >= height) {\n return;\n }\n\n cached[toneIndex] = {\n url: URL.createObjectURL(blob),\n w: width,\n h: height\n };\n }\n\n public saveWebPConvertedStrippedThumb(docId: DocId, bytes: Uint8Array) {\n const doc = this.getDoc(docId);\n if(!doc) {\n return;\n }\n\n const thumb = doc.thumbs && doc.thumbs.find((thumb) => thumb._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n if(!thumb) {\n return;\n }\n\n doc.pFlags.stickerThumbConverted = true;\n thumb.bytes = bytes;\n }\n\n public getWallPapers() {\n return this.apiManager.invokeApiHashable({method: 'account.getWallPapers'}).then((accountWallpapers) => {\n const wallPapers = (accountWallpapers as AccountWallPapers.accountWallPapers).wallpapers as WallPaper.wallPaper[];\n wallPapers.forEach((wallPaper) => {\n wallPaper.document = this.saveDoc(wallPaper.document);\n });\n\n return wallPapers;\n });\n }\n\n public prepareWallPaperUpload(file: File) {\n const id = 'wallpaper-upload-' + ++uploadWallPaperTempId;\n\n const thumb = {\n _: 'photoSize',\n h: 0,\n w: 0,\n location: {} as any,\n size: file.size,\n type: THUMB_TYPE_FULL\n } as PhotoSize.photoSize;\n let document: MyDocument = {\n _: 'document',\n access_hash: '',\n attributes: [],\n dc_id: 0,\n file_reference: [],\n id,\n mime_type: file.type as MTMimeType,\n size: file.size,\n date: Date.now() / 1000,\n pFlags: {},\n thumbs: [thumb],\n file_name: file.name\n };\n\n document = this.saveDoc(document);\n\n const cacheContext = this.thumbsStorage.setCacheContextURL(document, undefined, URL.createObjectURL(file), file.size);\n\n const wallpaper: WallPaper.wallPaper = {\n _: 'wallPaper',\n access_hash: '',\n document: document,\n id,\n slug: id,\n pFlags: {}\n };\n\n this.uploadingWallPapers[id] = {\n cacheContext,\n file\n };\n\n return wallpaper;\n }\n\n public uploadWallPaper(id: WallPaperId) {\n const {cacheContext, file} = this.uploadingWallPapers[id];\n delete this.uploadingWallPapers[id];\n\n const upload = this.apiFileManager.upload({file, fileName: file.name});\n return upload.then((inputFile) => {\n return this.apiManager.invokeApi('account.uploadWallPaper', {\n file: inputFile,\n mime_type: file.type,\n settings: {\n _: 'wallPaperSettings'\n\n }\n }).then((wallPaper) => {\n assumeType(wallPaper);\n wallPaper.document = this.saveDoc(wallPaper.document);\n this.thumbsStorage.setCacheContextURL(wallPaper.document, undefined, cacheContext.url, cacheContext.downloaded);\n\n return wallPaper;\n });\n });\n }\n\n public getGifs() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getSavedGifs',\n processResult: (res) => {\n assumeType(res);\n return res.gifs.map((doc) => this.saveDoc(doc));\n }\n });\n }\n\n public requestDocPart(docId: DocId, dcId: number, offset: number, limit: number) {\n const doc = this.getDoc(docId);\n if(!doc) return Promise.reject(makeError('NO_DOC'));\n return this.apiFileManager.requestFilePart(dcId, getDocumentInputFileLocation(doc), offset, limit);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {FileURLType, getFileURL} from '../../../../helpers/fileName';\nimport {Document, PhotoSize} from '../../../../layer';\nimport getDocumentDownloadOptions from './getDocumentDownloadOptions';\n\nexport default function getDocumentURL(doc: Document.document, download = false, thumb?: PhotoSize.photoSize) {\n let type: FileURLType;\n if(download) {\n type = 'download';\n } else if(thumb) {\n type = 'thumb';\n } else if(doc.supportsStreaming) {\n type = 'stream';\n } else {\n type = 'document';\n }\n\n return getFileURL(type, getDocumentDownloadOptions(doc, thumb));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {MessageEntity, DraftMessage, MessagesSaveDraft} from '../../layer';\nimport tsNow from '../../helpers/tsNow';\nimport stateStorage from '../stateStorage';\nimport assumeType from '../../helpers/assumeType';\nimport {AppManager} from './manager';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport draftsAreEqual from './utils/drafts/draftsAreEqual';\n\nexport type MyDraftMessage = DraftMessage.draftMessage;\n\nexport class AppDraftsManager extends AppManager {\n private drafts: {[peerIdAndThreadId: string]: MyDraftMessage} = {};\n private getAllDraftPromise: Promise;\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateDraftMessage: (update) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n this.saveDraft({\n peerId,\n threadId: update.threadId,\n draft: update.draft,\n notify: true\n });\n }\n });\n\n /* return */stateStorage.get('drafts').then((drafts) => {\n this.drafts = drafts || {};\n });\n }\n\n private getKey(peerId: PeerId, threadId?: number) {\n return '' + peerId + (threadId ? '_' + threadId : '');\n }\n\n public getDraft(peerId: PeerId, threadId?: number) {\n return this.drafts[this.getKey(peerId, threadId)];\n }\n\n public addMissedDialogs() {\n return this.getAllDrafts().then(() => {\n for(const key in this.drafts) {\n if(key.indexOf('_') !== -1) { // exclude threads\n continue;\n }\n\n const peerId = key.toPeerId();\n const dialog = this.appMessagesManager.getDialogOnly(peerId);\n if(!dialog) {\n this.appMessagesManager.reloadConversation(peerId);\n /* const dialog = appMessagesManager.generateDialog(peerId);\n dialog.draft = this.drafts[key];\n appMessagesManager.saveConversation(dialog);\n appMessagesManager.newDialogsToHandle[peerId] = dialog;\n appMessagesManager.scheduleHandleNewDialogs(); */\n }\n }\n });\n }\n\n private getAllDrafts() {\n return this.getAllDraftPromise ??= this.apiManager.invokeApi('messages.getAllDrafts')\n .then((updates) => {\n const p = this.apiUpdatesManager.updatesState.syncLoading || Promise.resolve();\n p.then(() => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n });\n }\n\n public saveDraft({peerId, threadId, draft: apiDraft, notify, force}: {\n peerId: PeerId,\n threadId?: number,\n draft: DraftMessage,\n notify?: boolean,\n force?: boolean\n }) {\n const draft = this.processApiDraft(apiDraft);\n\n const key = this.getKey(peerId, threadId);\n if(draft) {\n this.drafts[key] = draft;\n } else {\n delete this.drafts[key];\n }\n\n stateStorage.set({\n drafts: this.drafts\n });\n\n if(notify) {\n // console.warn(dT(), 'save draft', peerId, apiDraft, options)\n this.rootScope.dispatchEvent('draft_updated', {\n peerId,\n threadId,\n draft,\n force\n });\n }\n\n return draft;\n }\n\n private isEmptyDraft(draft: DraftMessage) {\n if(draft?._ !== 'draftMessage') {\n return true;\n }\n\n if(draft.reply_to_msg_id !== undefined && draft.reply_to_msg_id > 0) {\n return false;\n }\n\n if(!draft.message.length) {\n return true;\n }\n\n return false;\n }\n\n private processApiDraft(draft: DraftMessage): MyDraftMessage {\n if(!draft || draft._ !== 'draftMessage') {\n return undefined;\n }\n\n if(draft.reply_to_msg_id) {\n draft.reply_to_msg_id = generateMessageId(draft.reply_to_msg_id);\n }\n\n return draft;\n }\n\n public syncDraft(peerId: PeerId, threadId: number, localDraft?: DraftMessage, saveOnServer = true, force = false) {\n // console.warn(dT(), 'sync draft', peerID)\n const serverDraft = this.getDraft(peerId, threadId);\n if(draftsAreEqual(serverDraft, localDraft)) {\n // console.warn(dT(), 'equal drafts', localDraft, serverDraft)\n return true;\n }\n\n // console.warn(dT(), 'changed draft', localDraft, serverDraft)\n const params: MessagesSaveDraft = {\n peer: this.appPeersManager.getInputPeerById(peerId),\n message: ''\n };\n\n let draftObj: DraftMessage;\n if(this.isEmptyDraft(localDraft)) {\n draftObj = {_: 'draftMessageEmpty'};\n } else {\n assumeType(localDraft);\n const message = localDraft.message;\n const entities: MessageEntity[] = localDraft.entities;\n\n if(localDraft.reply_to_msg_id) {\n params.reply_to_msg_id = getServerMessageId(localDraft.reply_to_msg_id);\n }\n\n if(entities?.length) {\n params.entities = this.appMessagesManager.getInputEntities(entities);\n }\n\n if(localDraft.pFlags.no_webpage) {\n params.no_webpage = localDraft.pFlags.no_webpage;\n }\n\n params.message = message;\n }\n\n if(threadId) {\n params.top_msg_id = getServerMessageId(threadId);\n }\n\n const saveLocalDraft = draftObj || localDraft;\n saveLocalDraft.date = tsNow(true) + this.timeManager.getServerTimeOffset();\n\n this.saveDraft({\n peerId,\n threadId,\n draft: saveLocalDraft,\n notify: true,\n force\n });\n\n if(saveOnServer) {\n return this.apiManager.invokeApi('messages.saveDraft', params);\n }\n\n return true;\n }\n\n public clearAllDrafts() {\n return this.apiManager.invokeApi('messages.clearAllDrafts').then((bool) => {\n if(!bool) {\n return;\n }\n\n for(const combined in this.drafts) {\n const [peerId, threadId] = combined.split('_');\n this.rootScope.dispatchEvent('draft_updated', {\n peerId: peerId.toPeerId(),\n threadId: threadId ? +threadId : undefined,\n draft: undefined\n });\n }\n });\n }\n\n public clearDraft(peerId: PeerId, threadId: number) {\n const emptyDraft: DraftMessage.draftMessageEmpty = {\n _: 'draftMessageEmpty'\n };\n\n if(threadId) {\n this.syncDraft(peerId, threadId, emptyDraft as any, false, true);\n } else {\n this.saveDraft({\n peerId,\n threadId,\n draft: emptyDraft,\n notify: true,\n force: true\n });\n }\n }\n\n public setDraft(peerId: PeerId, threadId: number, message: string, entities?: MessageEntity[]) {\n const draft: DraftMessage.draftMessage = {\n _: 'draftMessage',\n date: Date.now() / 1000 | 0,\n message,\n pFlags: {},\n entities\n };\n\n if(threadId) {\n this.syncDraft(peerId, threadId, draft, false, true);\n } else {\n this.saveDraft({\n peerId,\n threadId,\n draft,\n notify: true,\n force: true\n });\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from './appDocsManager';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport isObject from '../../helpers/object/isObject';\nimport validateInitObject from '../../helpers/object/validateInitObject';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport SearchIndex from '../searchIndex';\nimport stateStorage from '../stateStorage';\nimport {AppManager} from './manager';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\n\ntype EmojiLangPack = {\n keywords: {\n [keyword: string]: string[],\n },\n version: number,\n langCode: string\n};\n\nconst EMOJI_LANG_PACK: EmojiLangPack = {\n keywords: {},\n version: 0,\n langCode: App.langPackCode\n};\n\nconst RECENT_MAX_LENGTH = 32;\n\ntype EmojiType = 'native' | 'custom';\n\nexport class AppEmojiManager extends AppManager {\n private static POPULAR_EMOJI = ['😂', '😘', '❤️', '😍', '😊', '😁', '👍', '☺️', '😔', '😄', '😭', '💋', '😒', '😳', '😜', '🙈', '😉', '😃', '😢', '😝', '😱', '😡', '😏', '😞', '😅', '😚', '🙊', '😌', '😀', '😋', '😆', '👌', '😐', '😕'];\n private keywordLangPacks: {\n [langCode: string]: EmojiLangPack\n } = {};\n\n private index: SearchIndex;\n private indexedLangPacks: {[langCode: string]: boolean} = {};\n\n private getKeywordsPromises: {[langCode: string]: Promise} = {};\n\n private recent: {native?: string[], custom?: DocId[]} = {};\n private getRecentEmojisPromises: {native?: Promise, custom?: Promise} = {};\n\n private getCustomEmojiDocumentsPromise: Promise;\n private getCustomEmojiDocumentPromises: Map> = new Map();\n\n /* public getPopularEmoji() {\n return stateStorage.get('emojis_popular').then((popEmojis) => {\n var result = []\n if (popEmojis && popEmojis.length) {\n for (var i = 0, len = popEmojis.length; i < len; i++) {\n result.push({code: popEmojis[i][0], rate: popEmojis[i][1]})\n }\n callback(result)\n return\n }\n\n return stateStorage.get('emojis_recent').then((recentEmojis) => {\n recentEmojis = recentEmojis || popular || []\n var shortcut\n var code\n for (var i = 0, len = recentEmojis.length; i < len; i++) {\n shortcut = recentEmojis[i]\n if (Array.isArray(shortcut)) {\n shortcut = shortcut[0]\n }\n if (shortcut && typeof shortcut === 'string') {\n if (shortcut.charAt(0) == ':') {\n shortcut = shortcut.substr(1, shortcut.length - 2)\n }\n if (code = shortcuts[shortcut]) {\n result.push({code: code, rate: 1})\n }\n }\n }\n callback(result)\n });\n });\n }\n\n function pushPopularEmoji (code) {\n getPopularEmoji(function (popularEmoji) {\n var exists = false\n var count = popularEmoji.length\n var result = []\n for (var i = 0; i < count; i++) {\n if (popularEmoji[i].code == code) {\n exists = true\n popularEmoji[i].rate++\n }\n result.push([popularEmoji[i].code, popularEmoji[i].rate])\n }\n if (exists) {\n result.sort(function (a, b) {\n return b[1] - a[1]\n })\n } else {\n if (result.length > 41) {\n result = result.slice(0, 41)\n }\n result.push([code, 1])\n }\n ConfigStorage.set({emojis_popular: result})\n })\n } */\n\n public getEmojiKeywords(langCode: string = App.langPackCode) {\n const promise = this.getKeywordsPromises[langCode];\n if(promise) {\n return promise;\n }\n\n const storageKey: any = 'emojiKeywords_' + langCode;\n return this.getKeywordsPromises[langCode] = stateStorage.get(storageKey).then((pack: EmojiLangPack) => {\n if(!isObject(pack)) {\n pack = {} as any;\n }\n\n validateInitObject(EMOJI_LANG_PACK, pack);\n\n // important\n pack.langCode = langCode;\n this.keywordLangPacks[langCode] = pack;\n\n return this.apiManager.invokeApi('messages.getEmojiKeywordsDifference', {\n lang_code: pack.langCode,\n from_version: pack.version\n }).then((keywordsDifference) => {\n pack.version = keywordsDifference.version;\n\n const packKeywords = pack.keywords;\n const keywords = keywordsDifference.keywords;\n for(let i = 0, length = keywords.length; i < length; ++i) {\n const {keyword, emoticons} = keywords[i];\n packKeywords[keyword] = emoticons;\n }\n\n stateStorage.set({\n [storageKey]: pack\n });\n\n return pack;\n }, () => {\n return pack;\n });\n });\n }\n\n public getBothEmojiKeywords() {\n const promises: Promise[] = [\n this.getEmojiKeywords()\n ];\n\n if(this.networkerFactory.language !== App.langPackCode) {\n promises.push(this.getEmojiKeywords(this.networkerFactory.language));\n }\n\n if(!this.recent.native) {\n promises.push(this.getRecentEmojis('native'));\n }\n\n return Promise.all(promises);\n }\n\n private indexEmojis() {\n if(!this.index) {\n this.index = new SearchIndex(undefined, 2);\n }\n\n for(const langCode in this.keywordLangPacks) {\n if(this.indexedLangPacks[langCode]) {\n continue;\n }\n\n const pack = this.keywordLangPacks[langCode];\n const keywords = pack.keywords;\n\n for(const keyword in keywords) {\n const emoticons = keywords[keyword];\n this.index.indexObject(emoticons, keyword);\n }\n\n this.indexedLangPacks[langCode] = true;\n }\n }\n\n public searchEmojis(q: string) {\n this.indexEmojis();\n\n q = q.toLowerCase().replace(/_/g, ' ');\n\n // const perf = performance.now();\n let emojis: Array;\n if(q.trim()) {\n const set = this.index.search(q);\n emojis = Array.from(set).reduce((acc, v) => acc.concat(v), []);\n } else {\n emojis = this.recent.native.concat(AppEmojiManager.POPULAR_EMOJI).slice(0, RECENT_MAX_LENGTH);\n }\n\n emojis = Array.from(new Set(emojis));\n // console.log('searchEmojis', q, 'time', performance.now() - perf);\n\n /* for(let i = 0, length = emojis.length; i < length; ++i) {\n if(emojis[i].includes(zeroWidthJoiner) && !emojis[i].includes('\\ufe0f')) {\n emojis[i] += '\\ufe0f';\n }\n } */\n\n return emojis;\n }\n\n public getRecentEmojis(type: 'custom'): Promise;\n public getRecentEmojis(type: 'native'): Promise;\n public getRecentEmojis(type: T): Promise {\n const promises = this.getRecentEmojisPromises;\n return promises[type] ??= this.appStateManager.getState().then((state) => {\n let recent: string[] | DocId[] = [];\n if(type === 'native') {\n const {recentEmoji} = state;\n recent = Array.isArray(recentEmoji) && recentEmoji.length ? recentEmoji : AppEmojiManager.POPULAR_EMOJI;\n } else {\n const {recentCustomEmoji} = state;\n recent = Array.isArray(recentCustomEmoji) && recentCustomEmoji.length ? recentCustomEmoji : [];\n }\n\n return this.recent[type] = recent as any;\n }) as any;\n }\n\n public pushRecentEmoji(emoji: AppEmoji) {\n const type: EmojiType = emoji.docId ? 'custom' : 'native';\n emoji.emoji = fixEmoji(emoji.emoji);\n // @ts-ignore\n this.getRecentEmojis(type).then((recent) => {\n const i = emoji.docId || emoji.emoji;\n indexOfAndSplice(recent, i);\n recent.unshift(i);\n recent.splice(RECENT_MAX_LENGTH, recent.length - RECENT_MAX_LENGTH);\n\n this.appStateManager.pushToState(type === 'custom' ? 'recentCustomEmoji' : 'recentEmoji', recent);\n this.rootScope.dispatchEvent('emoji_recent', emoji);\n });\n }\n\n public getCustomEmojiDocuments(docIds: DocId[]) {\n if(!docIds.length) return Promise.resolve([] as MyDocument[]);\n return this.apiManager.invokeApi('messages.getCustomEmojiDocuments', {document_id: docIds}).then((documents) => {\n return documents.map((doc) => {\n return this.appDocsManager.saveDoc(doc, {\n type: 'customEmoji',\n docId: doc.id\n });\n });\n });\n }\n\n public getCachedCustomEmojiDocuments(docIds: DocId[]) {\n return docIds.map((docId) => this.appDocsManager.getDoc(docId));\n }\n\n private setDebouncedGetCustomEmojiDocuments() {\n if(this.getCustomEmojiDocumentsPromise || !this.getCustomEmojiDocumentPromises.size) {\n return;\n }\n\n this.getCustomEmojiDocumentsPromise = pause(0).then(() => {\n const allIds = [...this.getCustomEmojiDocumentPromises.keys()];\n const promises: Promise[] = [];\n do {\n const ids = allIds.splice(0, 100);\n const promise = this.getCustomEmojiDocuments(ids).then((docs) => {\n docs.forEach((doc, idx) => {\n const docId = ids[idx];\n const deferred = this.getCustomEmojiDocumentPromises.get(docId);\n this.getCustomEmojiDocumentPromises.delete(docId);\n deferred.resolve(doc);\n });\n });\n\n promises.push(promise);\n } while(allIds.length);\n\n return Promise.all(promises);\n }).finally(() => {\n this.getCustomEmojiDocumentsPromise = undefined;\n this.setDebouncedGetCustomEmojiDocuments();\n });\n }\n\n public getCustomEmojiDocument(id: DocId) {\n let promise = this.getCustomEmojiDocumentPromises.get(id);\n if(promise) {\n return promise;\n }\n\n const doc = this.appDocsManager.getDoc(id);\n if(doc) {\n return doc;\n }\n\n promise = deferredPromise();\n this.getCustomEmojiDocumentPromises.set(id, promise);\n\n this.setDebouncedGetCustomEmojiDocuments();\n\n return promise;\n }\n\n public getCustomEmojis() {\n return this.appStickersManager.getEmojiStickers();\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/evgeny-nadymov/telegram-react\n * Copyright (C) 2018 Evgeny Nadymov\n * https://github.com/evgeny-nadymov/telegram-react/blob/master/LICENSE\n */\n\nimport type GroupCallConnectionInstance from '../calls/groupCallConnectionInstance';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {nextRandomUint} from '../../helpers/random';\nimport {DataJSON, GroupCall, GroupCallParticipant, GroupCallParticipantVideoSourceGroup, InputGroupCall, PhoneJoinGroupCall, PhoneJoinGroupCallPresentation, Update, Updates} from '../../layer';\nimport {logger} from '../logger';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\n\nexport type GroupCallId = GroupCall['id'];\nexport type MyGroupCall = GroupCall | InputGroupCall;\n\nexport type GroupCallConnectionType = 'main' | 'presentation';\n\nexport type JoinGroupCallJsonPayload = {\n fingerprints: {\n fingerprint: string;\n setup: string;\n hash: string;\n }[];\n pwd: string;\n ssrc: number;\n 'ssrc-groups': GroupCallParticipantVideoSourceGroup.groupCallParticipantVideoSourceGroup[];\n ufrag: string;\n};\n\nconst GET_PARTICIPANTS_LIMIT = 100;\n\nexport type GroupCallOutputSource = 'main' | 'presentation' | number;\n\nexport class AppGroupCallsManager extends AppManager {\n private log: ReturnType;\n\n private groupCalls: Map;\n private participants: Map>;\n private nextOffsets: Map;\n\n // private doNotDispatchParticipantUpdate: PeerId;\n\n protected after() {\n this.log = logger('GROUP-CALLS');\n\n this.groupCalls = new Map();\n this.participants = new Map();\n this.nextOffsets = new Map();\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateGroupCall: (update) => {\n this.saveGroupCall(update.call, update.chat_id);\n },\n\n updateGroupCallParticipants: (update) => {\n this.saveGroupCall(update.call);\n\n // this.getGroupCallFull(update.call.id, true); // ! WARNING TEMP\n\n const groupCallId = update.call.id;\n this.saveApiParticipants(groupCallId, update.participants);\n }\n });\n\n this.rootScope.addEventListener('group_call_update', (groupCall) => {\n if(groupCall._ === 'groupCallDiscarded') {\n this.participants.delete(groupCall.id);\n }\n });\n }\n\n public getCachedParticipants(groupCallId: GroupCallId) {\n let participants = this.participants.get(groupCallId);\n if(!participants) {\n this.participants.set(groupCallId, participants = new Map());\n }\n\n return participants;\n }\n\n private prepareToSavingNextOffset(groupCallId: GroupCallId) {\n const nextOffsetsMap = this.nextOffsets;\n\n const setNextOffset = (newNextOffset: string) => {\n if(nextOffsetsMap.get(groupCallId) === nextOffset) {\n nextOffsetsMap.set(groupCallId, newNextOffset);\n }\n };\n\n const nextOffset = nextOffsetsMap.get(groupCallId);\n return {\n nextOffset,\n setNextOffset\n };\n }\n\n public saveApiParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, skipCounterUpdating?: boolean) {\n const participants = this.getCachedParticipants(groupCallId);\n\n const peerId = getPeerId(participant.peer);\n\n const oldParticipant = participants.get(peerId);\n const hasLeft = participant.pFlags.left;\n if(!oldParticipant && hasLeft) {\n return;\n }\n\n // * fix missing flag\n if(!participant.pFlags.muted && !participant.pFlags.can_self_unmute) {\n participant.pFlags.can_self_unmute = true;\n }\n\n if(oldParticipant) {\n safeReplaceObject(oldParticipant, participant);\n participant = oldParticipant;\n } else {\n participants.set(peerId, participant);\n }\n\n // if(!skipCounterUpdating) {\n const groupCall = this.getGroupCall(groupCallId);\n if(groupCall?._ === 'groupCall') {\n let modified = false;\n if(hasLeft) {\n --groupCall.participants_count;\n modified = true;\n } else if(participant.pFlags.just_joined && !oldParticipant && !participant.pFlags.self) {\n ++groupCall.participants_count;\n modified = true;\n }\n\n if(modified) {\n this.rootScope.dispatchEvent('group_call_update', groupCall);\n }\n }\n // }\n\n if(hasLeft) {\n participants.delete(peerId);\n }\n\n if(oldParticipant || true/* && this.doNotDispatchParticipantUpdate !== peerId */) {\n this.rootScope.dispatchEvent('group_call_participant', {\n groupCallId,\n participant\n });\n }\n }\n\n public saveApiParticipants(groupCallId: GroupCallId, apiParticipants: GroupCallParticipant[], skipCounterUpdating?: boolean) {\n if((apiParticipants as any).saved) return;\n (apiParticipants as any).saved = true;\n apiParticipants.forEach((p) => this.saveApiParticipant(groupCallId, p, skipCounterUpdating));\n }\n\n public async editParticipant(groupCallId: GroupCallId, participant: GroupCallParticipant, options: Partial<{\n muted: boolean,\n volume: number,\n raiseHand: boolean,\n videoStopped: boolean,\n videoPaused: boolean,\n presentationPaused: boolean\n }>) {\n this.saveApiParticipant(groupCallId, participant);\n\n const peerId = participant.pFlags.self ? NULL_PEER_ID : getPeerId(participant.peer);\n const updates = await this.apiManager.invokeApiSingle('phone.editGroupCallParticipant', {\n call: this.getGroupCallInput(groupCallId),\n participant: peerId === NULL_PEER_ID ? this.appPeersManager.getInputPeerSelf() : this.appPeersManager.getInputPeerById(peerId),\n muted: options.muted,\n volume: options.volume,\n raise_hand: options.raiseHand,\n video_paused: options.videoPaused,\n video_stopped: options.videoStopped,\n presentation_paused: options.presentationPaused\n });\n\n // do not replace with peerId because it can be null\n // if(!processUpdate) this.doNotDispatchParticipantUpdate = getPeerId(participant.peer);\n this.apiUpdatesManager.processUpdateMessage(updates);\n // if(!processUpdate) this.doNotDispatchParticipantUpdate = undefined;\n }\n\n public getGroupCall(id: GroupCallId) {\n return this.groupCalls.get(id);\n }\n\n public async getGroupCallFull(id: GroupCallId, override?: boolean): Promise {\n const call = this.getGroupCall(id);\n if(call && call._ !== 'inputGroupCall' && !override) {\n return call;\n }\n\n const limit = this.getCachedParticipants(id).size ? 0 : GET_PARTICIPANTS_LIMIT;\n return this.apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupCall',\n params: {\n call: this.getGroupCallInput(id),\n limit\n },\n processResult: (groupCall) => {\n // ? maybe I should save group call after participants so I can avoid passing the 'skipCounterUpdating' flag ?\n this.appUsersManager.saveApiUsers(groupCall.users);\n this.appChatsManager.saveApiChats(groupCall.chats);\n this.saveApiParticipants(id, groupCall.participants, true);\n const call = this.saveGroupCall(groupCall.call) as GroupCall;\n\n if(limit && this.nextOffsets.get(id) === undefined) {\n this.nextOffsets.set(id, groupCall.participants_next_offset);\n }\n\n return call;\n }\n });\n }\n\n public saveGroupCall(call: MyGroupCall, chatId?: ChatId) {\n const oldCall = this.groupCalls.get(call.id);\n const shouldUpdate = call._ !== 'inputGroupCall' && (!oldCall || oldCall._ !== 'groupCallDiscarded');\n if(oldCall) {\n if(shouldUpdate) {\n safeReplaceObject(oldCall, call);\n }\n\n call = oldCall;\n } else {\n this.groupCalls.set(call.id, call);\n }\n\n if(shouldUpdate) {\n this.rootScope.dispatchEvent('group_call_update', call as any);\n }\n\n return call;\n }\n\n public async createGroupCall(chatId: ChatId, scheduleDate?: number, title?: string) {\n const updates = await this.apiManager.invokeApi('phone.createGroupCall', {\n peer: this.appPeersManager.getInputPeerById(chatId.toPeerId(true)),\n random_id: nextRandomUint(32),\n schedule_date: scheduleDate,\n title\n });\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateGroupCall') as Update.updateGroupCall;\n return update.call;\n }\n\n public getGroupCallInput(id: GroupCallId): InputGroupCall {\n const groupCall = this.getGroupCall(id);\n return {\n _: 'inputGroupCall',\n id: groupCall.id,\n access_hash: groupCall.access_hash\n };\n }\n\n // public generateSelfParticipant(): GroupCallParticipant {\n // const mainSources = this.currentGroupCall.connections.main.sources;\n // const presentationSources = this.currentGroupCall.connections.presentation?.sources;\n // return {\n // _: 'groupCallParticipant',\n // pFlags: {\n // can_self_unmute: true,\n // self: true\n // },\n // source: mainSources.audio.source,\n // video: this.generateSelfVideo(mainSources.video),\n // presentation: presentationSources && this.generateSelfVideo(presentationSources.video, presentationSources.audio?.source),\n // date: tsNow(true),\n // peer: this.appPeersManager.getOutputPeer(rootScope.myId)\n // };\n // }\n\n public async getGroupCallParticipants(id: GroupCallId) {\n const {nextOffset, setNextOffset} = this.prepareToSavingNextOffset(id);\n\n if(nextOffset !== '') {\n await this.apiManager.invokeApiSingleProcess({\n method: 'phone.getGroupParticipants',\n params: {\n call: this.getGroupCallInput(id),\n ids: [],\n sources: [],\n offset: nextOffset || '',\n limit: GET_PARTICIPANTS_LIMIT\n },\n processResult: (groupCallParticipants) => {\n const newNextOffset = groupCallParticipants.count === groupCallParticipants.participants.length ? '' : groupCallParticipants.next_offset;\n\n this.appChatsManager.saveApiChats(groupCallParticipants.chats);\n this.appUsersManager.saveApiUsers(groupCallParticipants.users);\n this.saveApiParticipants(id, groupCallParticipants.participants);\n\n setNextOffset(newNextOffset);\n }\n });\n }\n\n return {\n participants: this.getCachedParticipants(id),\n isEnd: this.nextOffsets.get(id) === ''\n };\n }\n\n public hangUp(id: GroupCallId, discard?: boolean | number) {\n const groupCallInput = this.getGroupCallInput(id);\n let promise: Promise;\n if(typeof(discard) === 'boolean' && discard) {\n promise = this.apiManager.invokeApi('phone.discardGroupCall', {\n call: groupCallInput\n });\n } else if(typeof(discard) === 'number') {\n promise = this.apiManager.invokeApi('phone.leaveGroupCall', {\n call: groupCallInput,\n source: discard\n });\n } else {\n promise = this.apiManager.invokeApi('phone.joinGroupCall', {\n call: groupCallInput,\n join_as: this.appPeersManager.getInputPeerSelf(),\n muted: true,\n video_stopped: true,\n params: {\n _: 'dataJSON',\n data: ''\n }\n });\n }\n\n return promise.then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public async joinGroupCall(groupCallId: GroupCallId, params: DataJSON, options: GroupCallConnectionInstance['options']) {\n const groupCallInput = this.getGroupCallInput(groupCallId);\n let promise: Promise;\n if(options.type === 'main') {\n const request: PhoneJoinGroupCall = {\n call: groupCallInput,\n join_as: this.appPeersManager.getInputPeerSelf(),\n params,\n muted: options.isMuted,\n video_stopped: !options.joinVideo\n };\n\n promise = this.apiManager.invokeApi('phone.joinGroupCall', request);\n this.log(`[api] joinGroupCall id=${groupCallId}`, request);\n } else {\n const request: PhoneJoinGroupCallPresentation = {\n call: groupCallInput,\n params\n };\n\n promise = this.apiManager.invokeApi('phone.joinGroupCallPresentation', request);\n this.log(`[api] joinGroupCallPresentation id=${groupCallId}`, request);\n }\n\n const updates = await promise;\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateGroupCallConnection') as Update.updateGroupCallConnection;\n return update;\n }\n\n public leaveGroupCallPresentation(groupCallId: GroupCallId) {\n return this.apiManager.invokeApi('phone.leaveGroupCallPresentation', {\n call: this.getGroupCallInput(groupCallId)\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputPhoto} from '../../../../layer';\nimport {MyPhoto} from '../../appPhotosManager';\n\nexport default function getPhotoInput(photo: MyPhoto): InputPhoto.inputPhoto {\n return {\n _: 'inputPhoto',\n id: photo.id,\n access_hash: photo.access_hash,\n file_reference: photo.file_reference\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputMedia} from '../../../../layer';\nimport {MyPhoto} from '../../appPhotosManager';\nimport getPhotoInput from './getPhotoInput';\n\nexport default function getPhotoMediaInput(photo: MyPhoto): InputMedia.inputMediaPhoto {\n return {\n _: 'inputMediaPhoto',\n id: getPhotoInput(photo),\n ttl_seconds: 0\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Document, InputMedia} from '../../../../layer';\n\nexport default function getMediaInput(doc: Document.document): InputMedia.inputMediaDocument {\n return {\n _: 'inputMediaDocument',\n id: {\n _: 'inputDocument',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference\n },\n ttl_seconds: 0\n };\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {MyDocument} from './appDocsManager';\nimport type {MyPhoto} from './appPhotosManager';\nimport type {MyTopPeer} from './appUsersManager';\nimport type {AppMessagesManager, MessageSendingParams} from './appMessagesManager';\nimport {BotInlineResult, GeoPoint, InputGeoPoint, InputMedia, MessageEntity, MessageMedia, MessagesBotResults, ReplyMarkup} from '../../layer';\nimport insertInDescendSortedArray from '../../helpers/array/insertInDescendSortedArray';\nimport {AppManager} from './manager';\nimport getPhotoMediaInput from './utils/photos/getPhotoMediaInput';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport generateQId from './utils/inlineBots/generateQId';\nimport getDocumentMediaInput from './utils/docs/getDocumentMediaInput';\n\nexport class AppInlineBotsManager extends AppManager {\n private inlineResults: {[queryAndResultIds: string]: BotInlineResult} = {};\n private setHash: {\n [botId: UserId]: {\n peerId: PeerId,\n time: number\n }\n } = {};\n\n public getGeoInput(geo: GeoPoint): InputGeoPoint {\n return geo._ === 'geoPoint' ? {\n _: 'inputGeoPoint',\n lat: geo.lat,\n long: geo.long,\n accuracy_radius: geo.accuracy_radius\n } : {\n _: 'inputGeoPointEmpty'\n };\n }\n\n public getInlineResults(peerId: PeerId, botId: BotId, query = '', offset = '', geo?: GeoPoint) {\n return this.apiManager.invokeApi('messages.getInlineBotResults', {\n bot: this.appUsersManager.getUserInput(botId),\n peer: this.appPeersManager.getInputPeerById(peerId),\n query,\n geo_point: geo ? this.getGeoInput(geo) : undefined,\n offset\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true}).then((botResults) => {\n const queryId = botResults.query_id;\n\n /* if(botResults.switch_pm) {\n botResults.switch_pm.rText = wrapRichText(botResults.switch_pm.text, {noLinebreaks: true, noLinks: true});\n } */\n\n botResults.results.forEach((result) => {\n if(result._ === 'botInlineMediaResult') {\n if(result.document) {\n result.document = this.appDocsManager.saveDoc(result.document);\n }\n\n if(result.photo) {\n result.photo = this.appPhotosManager.savePhoto(result.photo);\n }\n }\n\n this.inlineResults[generateQId(queryId, result.id)] = result;\n });\n\n return botResults;\n });\n }\n\n private pushPopularBot(botId: BotId) {\n this.appUsersManager.getTopPeers('bots_inline').then((topPeers) => {\n const botPeerId = botId.toPeerId();\n const index = topPeers.findIndex((topPeer) => topPeer.id === botPeerId);\n let topPeer: MyTopPeer;\n if(index !== -1) {\n topPeer = topPeers[index];\n } else {\n topPeer = {\n id: botPeerId,\n rating: 0\n };\n }\n\n ++topPeer.rating;\n insertInDescendSortedArray(topPeers, topPeer, 'rating');\n\n this.appStateManager.setKeyValueToStorage('topPeersCache');\n\n // rootScope.$broadcast('inline_bots_popular')\n });\n }\n\n public switchToPM(fromPeerId: PeerId, botId: BotId, startParam: string) {\n this.setHash[botId] = {peerId: fromPeerId, time: Date.now()};\n return this.appMessagesManager.startBot(botId, undefined, startParam);\n }\n\n /*\n function resolveInlineMention (username) {\n return AppPeersManager.resolveUsername(username).then(function (peerId) {\n if (peerId.isUser()) {\n var bot = AppUsersManager.getUser(peerId)\n if (bot.pFlags.bot && bot.bot_inline_placeholder !== undefined) {\n var resolvedBot = {\n username: username,\n id: peerId,\n placeholder: bot.bot_inline_placeholder\n }\n if (bot.pFlags.bot_inline_geo &&\n GeoLocationManager.isAvailable()) {\n return checkGeoLocationAccess(peerId).then(function () {\n return GeoLocationManager.getPosition().then(function (coords) {\n resolvedBot.geo = coords\n return qSync.when(resolvedBot)\n })\n })['catch'](function () {\n return qSync.when(resolvedBot)\n })\n }\n return qSync.when(resolvedBot)\n }\n }\n return $q.reject()\n }, function (error) {\n error.handled = true\n return $q.reject(error)\n })\n }\n\n function regroupWrappedResults (results, rowW, rowH) {\n if (!results ||\n !results[0] ||\n ['photo', 'gif', 'sticker'].indexOf(results[0].type) === -1) {\n return\n }\n var ratios = []\n angular.forEach(results, function (result) {\n var w\n var h, doc\n var photo\n if (result._ === 'botInlineMediaResult') {\n if (doc = result.document) {\n w = result.document.w\n h = result.document.h\n }\n else if (photo = result.photo) {\n var photoSize = (photo.sizes || [])[0]\n w = photoSize && photoSize.w\n h = photoSize && photoSize.h\n }\n }else {\n w = result.w\n h = result.h\n }\n if (!w || !h) {\n w = h = 1\n }\n ratios.push(w / h)\n })\n\n var rows = []\n var curCnt = 0\n var curW = 0\n angular.forEach(ratios, function (ratio) {\n var w = ratio * rowH\n curW += w\n if (!curCnt || curCnt < 4 && curW < (rowW * 1.1)) {\n curCnt++\n } else {\n rows.push(curCnt)\n curCnt = 1\n curW = w\n }\n })\n if (curCnt) {\n rows.push(curCnt)\n }\n\n var i = 0\n var thumbs = []\n var lastRowI = rows.length - 1\n angular.forEach(rows, function (rowCnt, rowI) {\n var lastRow = rowI === lastRowI\n var curRatios = ratios.slice(i, i + rowCnt)\n var sumRatios = 0\n angular.forEach(curRatios, function (ratio) {\n sumRatios += ratio\n })\n angular.forEach(curRatios, function (ratio, j) {\n var thumbH = rowH\n var thumbW = rowW * ratio / sumRatios\n var realW = thumbH * ratio\n if (lastRow && thumbW > realW) {\n thumbW = realW\n }\n var result = results[i + j]\n result.thumbW = Math.floor(thumbW) - 2\n result.thumbH = Math.floor(thumbH) - 2\n })\n\n i += rowCnt\n })\n } */\n\n public async checkSwitchReturn(botId: BotId) {\n const bot = this.appUsersManager.getUser(botId);\n if(!bot || !bot.pFlags.bot || !bot.bot_inline_placeholder) {\n return;\n }\n\n const peerData = this.setHash[botId];\n if(peerData) {\n delete this.setHash[botId];\n if((Date.now() - peerData.time) < 3600e3) {\n return peerData.peerId;\n }\n }\n }\n\n public switchInlineQuery(peerId: PeerId, threadId: number, botId: BotId, query: string) {\n this.appDraftsManager.setDraft(peerId, threadId, '@' + this.appPeersManager.getPeerUsername(botId.toPeerId()) + ' ' + query);\n }\n\n public callbackButtonClick(peerId: PeerId, mid: number, button: any) {\n return this.apiManager.invokeApi('messages.getBotCallbackAnswer', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid),\n data: button.data\n }, {/* timeout: 1, */stopTime: -1, noErrorBox: true});\n }\n\n /* function gameButtonClick (id) {\n var message = AppMessagesManager.getMessage(id)\n var peerId = AppMessagesManager.getMessagePeer(message)\n\n return MtpApiManager.invokeApi('messages.getBotCallbackAnswer', {\n peer: AppPeersManager.getInputPeerByID(peerId),\n msg_id: AppMessagesIDsManager.getMessageLocalID(id)\n }, {timeout: 1, stopTime: -1, noErrorBox: true}).then(function (callbackAnswer) {\n if (typeof callbackAnswer.message === 'string' &&\n callbackAnswer.message.length) {\n showCallbackMessage(callbackAnswer.message, callbackAnswer.pFlags.alert)\n }\n else if (typeof callbackAnswer.url === 'string') {\n AppGamesManager.openGame(message.media.game.id, id, callbackAnswer.url)\n }\n })\n } */\n\n public sendInlineResult(peerId: PeerId, botId: BotId, queryAndResultIds: string, options: MessageSendingParams & Partial<{\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n replyMarkup: ReplyMarkup,\n entities: MessageEntity[],\n clearDraft: true,\n geoPoint: GeoPoint\n }> = {}) {\n const inlineResult = this.inlineResults[queryAndResultIds];\n if(!inlineResult) {\n return;\n }\n\n this.pushPopularBot(botId);\n const splitted = queryAndResultIds.split('_');\n const queryID = splitted.shift();\n const resultID = splitted.join('_');\n options.viaBotId = botId;\n options.queryId = queryID;\n options.resultId = resultID;\n if(inlineResult.send_message.reply_markup) {\n options.replyMarkup = inlineResult.send_message.reply_markup;\n }\n\n if(inlineResult.send_message._ === 'botInlineMessageText') {\n options.entities = inlineResult.send_message.entities;\n this.appMessagesManager.sendText(peerId, inlineResult.send_message.message, options);\n } else {\n let caption = '';\n let inputMedia: Parameters[1], messageMedia: MessageMedia;\n const sendMessage = inlineResult.send_message;\n switch(sendMessage._) {\n case 'botInlineMessageMediaAuto': {\n caption = sendMessage.message;\n\n if(inlineResult._ === 'botInlineMediaResult') {\n const {document, photo} = inlineResult;\n if(document) {\n inputMedia = getDocumentMediaInput(document as MyDocument);\n } else {\n inputMedia = getPhotoMediaInput(photo as MyPhoto);\n }\n }\n\n break;\n }\n\n case 'botInlineMessageMediaGeo': {\n inputMedia = {\n _: 'inputMediaGeoPoint',\n geo_point: this.getGeoInput(sendMessage.geo)\n };\n\n options.geoPoint = sendMessage.geo;\n\n break;\n }\n\n case 'botInlineMessageMediaVenue': {\n inputMedia = {\n _: 'inputMediaVenue',\n geo_point: this.getGeoInput(sendMessage.geo),\n title: sendMessage.title,\n address: sendMessage.address,\n provider: sendMessage.provider,\n venue_id: sendMessage.venue_id,\n venue_type: sendMessage.venue_type\n };\n\n options.geoPoint = sendMessage.geo;\n\n break;\n }\n\n case 'botInlineMessageMediaContact': {\n inputMedia = {\n _: 'inputMediaContact',\n phone_number: sendMessage.phone_number,\n first_name: sendMessage.first_name,\n last_name: sendMessage.last_name,\n vcard: sendMessage.vcard\n };\n\n break;\n }\n\n case 'botInlineMessageMediaInvoice': {\n // const photo = sendMessage.photo;\n // inputMedia = {\n // _: 'inputMediaInvoice',\n // description: sendMessage.description,\n // title: sendMessage.title,\n // photo: photo && {\n // _: 'inputWebDocument',\n // attributes: photo.attributes,\n // mime_type: photo.mime_type,\n // size: photo.size,\n // url: photo.url\n // },\n // invoice: undefined,\n // payload: undefined,\n // provider: undefined,\n // provider_data: undefined,\n // start_param: undefined\n // };\n\n messageMedia = {\n _: 'messageMediaInvoice',\n title: sendMessage.title,\n description: sendMessage.description,\n photo: sendMessage.photo,\n currency: sendMessage.currency,\n total_amount: sendMessage.total_amount,\n pFlags: {\n shipping_address_requested: sendMessage.pFlags.shipping_address_requested,\n test: sendMessage.pFlags.test\n },\n start_param: undefined\n };\n\n break;\n }\n }\n\n if(!inputMedia && messageMedia) {\n inputMedia = {\n _: 'messageMediaPending',\n messageMedia\n };\n }\n\n this.appMessagesManager.sendOther(peerId, inputMedia, options);\n }\n }\n\n /* function checkGeoLocationAccess (botID) {\n var key = 'bot_access_geo' + botID\n return Storage.get(key).then(function (geoAccess) {\n if (geoAccess && geoAccess.granted) {\n return true\n }\n return ErrorService.confirm({\n type: 'BOT_ACCESS_GEO_INLINE'\n }).then(function () {\n var setHash = {}\n setHash[key] = {granted: true, time: tsNow()}\n Storage.set(setHash)\n return true\n }, function () {\n var setHash = {}\n setHash[key] = {denied: true, time: tsNow()}\n Storage.set(setHash)\n return $q.reject()\n })\n })\n } */\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {MESSAGE_ID_INCREMENT} from './utils/messageId';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\nexport class AppMessagesIdsManager {\n private tempNum = 0;\n\n public generateTempMessageId(messageId: number) {\n const num = ++this.tempNum;\n return generateMessageId(messageId) + (num & (MESSAGE_ID_INCREMENT - 1));\n }\n}\n","export default function splitStringByLength(str: string, maxLength: number) {\n if(str.length < maxLength) return [str];\n let length = 0, lastSliceStartIndex = 0, arrayIndex = 0;\n const delimiter = ' ';// '\\n';\n const out: string[] = [];\n\n const cut = (end?: number) => {\n let part = str.slice(lastSliceStartIndex, end);\n const _arrayIndex = arrayIndex++;\n if(part.length > maxLength) {\n const overflowPart = part.slice(maxLength);\n const splitted = splitStringByLength(overflowPart, maxLength);\n splitted.forEach((part) => {\n out[arrayIndex++] = part;\n });\n\n part = part.slice(0, maxLength);\n }\n\n lastSliceStartIndex = end;\n length = 0;\n out[_arrayIndex] = (out[_arrayIndex] || '') + part;\n };\n\n let lastIndex = 0;\n do {\n let index = str.indexOf(delimiter, lastIndex);\n if(index === -1) {\n if(lastIndex !== (str.length - 1)) {\n cut();\n }\n\n break;\n }\n\n index += delimiter.length;\n\n const partLength = index - lastIndex;\n if((length + partLength) > maxLength) {\n cut(length);\n }\n\n lastIndex = index;\n length += partLength;\n } while(true);\n\n return out;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {TabState} from '../mtproto/mtprotoworker';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\n\ntype Tab = {\n source: MessageEventSource,\n state: TabState\n};\n\nexport class AppTabsManager {\n private tabs: Map;\n\n constructor() {\n this.tabs = new Map();\n }\n\n public start() {\n const port = MTProtoMessagePort.getInstance();\n\n port.addEventListener('tabState', (state, source) => {\n const tab = this.tabs.get(source);\n tab.state = state;\n });\n }\n\n public getTabs() {\n return [...this.tabs.values()].filter((tab) => !!tab.state);\n }\n\n public addTab(source: MessageEventSource) {\n const tab: Tab = {\n source,\n state: undefined\n };\n\n this.tabs.set(source, tab);\n }\n\n public deleteTab(source: MessageEventSource) {\n this.tabs.delete(source);\n }\n}\n\nconst appTabsManager = new AppTabsManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appTabsManager = appTabsManager);\nexport default appTabsManager;\n","import {InputDocument} from '../../../../layer';\nimport type {MyDocument} from '../../appDocsManager';\n\nexport default function getDocumentInput(doc: MyDocument): InputDocument {\n return {\n _: 'inputDocument',\n id: doc.id,\n access_hash: doc.access_hash,\n file_reference: doc.file_reference\n };\n}\n","export default function setBooleanFlag(obj: T, key: keyof T, value: boolean) {\n // @ts-ignore\n if(value) obj[key] = true;\n else delete obj[key];\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport LazyLoadQueueBase from '../../components/lazyLoadQueueBase';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport tsNow from '../../helpers/tsNow';\nimport {randomLong} from '../../helpers/random';\nimport {Chat, ChatFull, Dialog as MTDialog, DialogPeer, DocumentAttribute, InputMedia, InputMessage, InputPeerNotifySettings, InputSingleMedia, Message, MessageAction, MessageEntity, MessageFwdHeader, MessageMedia, MessageReplies, MessageReplyHeader, MessagesDialogs, MessagesFilter, MessagesMessages, MethodDeclMap, NotifyPeer, PeerNotifySettings, PhotoSize, SendMessageAction, Update, Photo, Updates, ReplyMarkup, InputPeer, InputPhoto, InputDocument, InputGeoPoint, WebPage, GeoPoint, ReportReason, MessagesGetDialogs, InputChannel, InputDialogPeer, ReactionCount, MessagePeerReaction, MessagesSearchCounter, Peer, MessageReactions, Document, InputFile, Reaction, ForumTopic as MTForumTopic, MessagesForumTopics, MessagesGetReplies, MessagesGetHistory, MessagesAffectedHistory, UrlAuthResult} from '../../layer';\nimport {ArgumentTypes, InvokeApiOptions} from '../../types';\nimport {logger, LogTypes} from '../logger';\nimport type {ApiFileManager} from '../mtproto/apiFileManager';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport DialogsStorage, {GLOBAL_FOLDER_ID} from '../storages/dialogs';\nimport {ChatRights} from './appChatsManager';\nimport {MyDocument} from './appDocsManager';\nimport {MyPhoto} from './appPhotosManager';\nimport {getFileNameByLocation} from '../../helpers/fileName';\nimport DEBUG from '../../config/debug';\nimport SlicedArray, {Slice, SliceEnd} from '../../helpers/slicedArray';\nimport {FOLDER_ID_ALL, GENERAL_TOPIC_ID, MUTE_UNTIL, NULL_PEER_ID, REAL_FOLDER_ID, REPLIES_HIDDEN_CHANNEL_ID, REPLIES_PEER_ID, SERVICE_PEER_ID, THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n// import telegramMeWebManager from '../mtproto/telegramMeWebManager';\nimport {getMiddleware} from '../../helpers/middleware';\nimport assumeType from '../../helpers/assumeType';\nimport copy from '../../helpers/object/copy';\nimport getObjectKeysAndSort from '../../helpers/object/getObjectKeysAndSort';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport splitStringByLength from '../../helpers/string/splitStringByLength';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {AppManager} from './manager';\nimport type {MediaSize} from '../../helpers/mediaSize';\nimport getPhotoMediaInput from './utils/photos/getPhotoMediaInput';\nimport getPhotoDownloadOptions from './utils/photos/getPhotoDownloadOptions';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport mergeEntities from '../richTextProcessor/mergeEntities';\nimport parseEntities from '../richTextProcessor/parseEntities';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport generateMessageId from './utils/messageId/generateMessageId';\nimport filterMessagesByInputFilter from './utils/messages/filterMessagesByInputFilter';\nimport ctx from '../../environment/ctx';\nimport {getEnvironment} from '../../environment/utils';\nimport getDialogIndex from './utils/dialogs/getDialogIndex';\nimport defineNotNumerableProperties from '../../helpers/object/defineNotNumerableProperties';\nimport getDocumentMediaInput from './utils/docs/getDocumentMediaInput';\nimport getDocumentInputFileName from './utils/docs/getDocumentInputFileName';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport type {Progress} from './appDownloadManager';\nimport noop from '../../helpers/noop';\nimport appTabsManager from './appTabsManager';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport getAlbumText from './utils/messages/getAlbumText';\nimport pause from '../../helpers/schedulers/pause';\nimport makeError from '../../helpers/makeError';\nimport getStickerEffectThumb from './utils/stickers/getStickerEffectThumb';\nimport getDocumentInput from './utils/docs/getDocumentInput';\nimport reactionsEqual from './utils/reactions/reactionsEqual';\nimport getPeerActiveUsernames from './utils/peers/getPeerActiveUsernames';\nimport {BroadcastEvents} from '../rootScope';\nimport setBooleanFlag from '../../helpers/object/setBooleanFlag';\nimport getMessageThreadId from './utils/messages/getMessageThreadId';\n\n// console.trace('include');\n// TODO: если удалить диалог находясь в папке, то он не удалится из папки и будет виден в настройках\n\nconst APITIMEOUT = 0;\nconst DO_NOT_READ_HISTORY = false;\n\nexport type SendFileDetails = {\n file: File | Blob | MyDocument,\n} & Partial<{\n duration: number,\n width: number,\n height: number,\n objectURL: string,\n thumb: {\n blob: Blob,\n url: string,\n size: MediaSize\n },\n strippedBytes: PhotoSize.photoStrippedSize['bytes'],\n spoiler: boolean\n}>;\n\nexport type HistoryStorage = {\n count: number | null,\n history: SlicedArray,\n\n maxId?: number,\n readPromise?: Promise,\n readMaxId?: number,\n readOutboxMaxId?: number,\n triedToReadMaxId?: number,\n\n maxOutId?: number,\n replyMarkup?: Exclude\n};\n\nexport type HistoryResult = {\n count: number,\n history: number[],\n isEnd: ReturnType['getEnds']>,\n offsetIdOffset?: number,\n};\n\nexport type Dialog = MTDialog.dialog;\nexport type ForumTopic = MTForumTopic.forumTopic;\n\nexport type MyMessage = Message.message | Message.messageService;\nexport type MyInputMessagesFilter = 'inputMessagesFilterEmpty'\n | 'inputMessagesFilterPhotos'\n | 'inputMessagesFilterPhotoVideo'\n | 'inputMessagesFilterVideo'\n | 'inputMessagesFilterDocument'\n | 'inputMessagesFilterVoice'\n | 'inputMessagesFilterRoundVoice'\n | 'inputMessagesFilterRoundVideo'\n | 'inputMessagesFilterMusic'\n | 'inputMessagesFilterUrl'\n | 'inputMessagesFilterMyMentions'\n | 'inputMessagesFilterChatPhotos'\n | 'inputMessagesFilterPinned';\n\nexport type PinnedStorage = Partial<{\n promise: Promise,\n count: number,\n maxId: number\n}>;\nexport type MessagesStorage = Map & {peerId: PeerId, type: MessagesStorageType, key: MessagesStorageKey};\nexport type MessagesStorageType = 'scheduled' | 'history' | 'grouped';\nexport type MessagesStorageKey = `${PeerId}_${MessagesStorageType}`;\n\nexport type MyMessageActionType = Message.messageService['action']['_'];\n\ntype PendingAfterMsg = Partial;\n\ntype MapValueType = A extends Map ? V : never;\n\nexport type BatchUpdates = {\n 'messages_reactions': AppMessagesManager['batchUpdateReactions'],\n 'messages_views': AppMessagesManager['batchUpdateViews']\n};\n\ntype PendingMessageDetails = {\n peerId: PeerId,\n tempId: number,\n threadId: number,\n storage: MessagesStorage,\n sequential?: boolean\n};\n\nconst processAfter = (cb: () => void) => {\n // setTimeout(cb, 0);\n cb();\n};\n\nconst UPDATE_STICKERSET_ORDER = true;\n\nexport type MessageSendingParams = Partial<{\n threadId: number,\n replyToMsgId: number,\n scheduleDate: number,\n silent: boolean,\n sendAsPeerId: number,\n}>;\n\nexport class AppMessagesManager extends AppManager {\n private messagesStorageByPeerId: {[peerId: string]: MessagesStorage};\n private groupedMessagesStorage: {[groupId: string]: MessagesStorage}; // will be used for albums\n private scheduledMessagesStorage: {[peerId: PeerId]: MessagesStorage};\n private historiesStorage: {\n [peerId: PeerId]: HistoryStorage\n };\n private threadsStorage: {\n [peerId: PeerId]: {\n [threadId: string]: HistoryStorage\n }\n };\n private searchesStorage: {\n [peerId: PeerId]: Partial<{\n [inputFilter in MyInputMessagesFilter]: {\n count?: number,\n history: number[]\n }\n }>\n };\n private pinnedMessages: {[key: string]: PinnedStorage};\n\n private threadsServiceMessagesIdsStorage: {[peerId_threadId: string]: number};\n private threadsToReplies: {\n [peerId_threadId: string]: string;\n };\n\n private pendingByRandomId: {\n [randomId: string]: PendingMessageDetails\n } = {};\n private pendingByMessageId: {[mid: string]: Long} = {};\n private pendingAfterMsgs: {[peerId: PeerId]: PendingAfterMsg} = {};\n public pendingTopMsgs: {[peerId: PeerId]: number} = {};\n private tempFinalizeCallbacks: {\n [tempId: string]: {\n [callbackName: string]: Partial<{\n deferred: CancellablePromise,\n callback: (message: MyMessage) => Promise\n }>\n }\n } = {};\n\n private sendSmthLazyLoadQueue = new LazyLoadQueueBase(10);\n\n private needSingleMessages: Map>> = new Map();\n private fetchSingleMessagesPromise: Promise;\n private extendedMedia: Map>> = new Map();\n\n private maxSeenId = 0;\n\n public migratedFromTo: {[peerId: PeerId]: PeerId} = {};\n public migratedToFrom: {[peerId: PeerId]: PeerId} = {};\n\n private newDialogsHandlePromise: Promise;\n private newDialogsToHandle: Map}> = new Map();\n public newUpdatesAfterReloadToHandle: {[key: string]: Set} = {};\n\n private notificationsHandlePromise: number;\n private notificationsToHandle: {[key: string]: {\n fwdCount: number,\n fromId: PeerId,\n topMessage?: MyMessage\n }} = {};\n\n private reloadConversationsPromise: Promise;\n private reloadConversationsPeers: Map}> = new Map();\n\n public log = logger('MESSAGES', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn);\n\n private groupedTempId = 0;\n\n private typings: {[key: string]: {action: SendMessageAction, timeout?: number}} = {};\n\n private middleware: ReturnType;\n\n private unreadMentions: {[key: string]: SlicedArray} = {};\n private goToNextMentionPromises: {[key: string]: Promise} = {};\n\n private batchUpdates: {\n [k in keyof BatchUpdates]?: {\n callback: BatchUpdates[k],\n batch: ArgumentTypes[0]\n }\n } = {};\n private batchUpdatesDebounced: () => Promise;\n\n private uploadFilePromises: {[fileName: string]: CancellablePromise};\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateMessageID: this.onUpdateMessageId,\n\n updateNewDiscussionMessage: this.onUpdateNewMessage,\n updateNewMessage: this.onUpdateNewMessage,\n updateNewChannelMessage: this.onUpdateNewMessage,\n\n updateDialogUnreadMark: this.onUpdateDialogUnreadMark,\n\n updateEditMessage: this.onUpdateEditMessage,\n updateEditChannelMessage: this.onUpdateEditMessage,\n\n updateMessageReactions: this.onUpdateMessageReactions,\n\n updateReadChannelDiscussionInbox: this.onUpdateReadHistory,\n updateReadChannelDiscussionOutbox: this.onUpdateReadHistory,\n updateReadHistoryInbox: this.onUpdateReadHistory,\n updateReadHistoryOutbox: this.onUpdateReadHistory,\n updateReadChannelInbox: this.onUpdateReadHistory,\n updateReadChannelOutbox: this.onUpdateReadHistory,\n\n updateChannelReadMessagesContents: this.onUpdateReadMessagesContents,\n updateReadMessagesContents: this.onUpdateReadMessagesContents,\n\n updateChannelAvailableMessages: this.onUpdateChannelAvailableMessages,\n\n updateDeleteMessages: this.onUpdateDeleteMessages,\n updateDeleteChannelMessages: this.onUpdateDeleteMessages,\n\n updateChannel: this.onUpdateChannel,\n\n updateChannelReload: this.onUpdateChannelReload,\n\n updateChannelMessageViews: this.onUpdateChannelMessageViews,\n\n updateServiceNotification: this.onUpdateServiceNotification,\n\n updatePinnedMessages: this.onUpdatePinnedMessages,\n updatePinnedChannelMessages: this.onUpdatePinnedMessages,\n\n updateNotifySettings: this.onUpdateNotifySettings,\n\n updateNewScheduledMessage: this.onUpdateNewScheduledMessage,\n\n updateDeleteScheduledMessages: this.onUpdateDeleteScheduledMessages,\n\n updateMessageExtendedMedia: this.onUpdateMessageExtendedMedia\n });\n\n // ! Invalidate notify settings, can optimize though\n this.rootScope.addEventListener('notify_peer_type_settings', ({key, settings}) => {\n const dialogs = this.dialogsStorage.getFolderDialogs(0).concat(this.dialogsStorage.getFolderDialogs(1));\n let filterFunc: (dialog: typeof dialogs[0]) => boolean;\n if(key === 'notifyUsers') filterFunc = (dialog) => dialog.peerId.isUser();\n else if(key === 'notifyBroadcasts') filterFunc = (dialog) => this.appPeersManager.isBroadcast(dialog.peerId);\n else filterFunc = (dialog) => this.appPeersManager.isAnyGroup(dialog.peerId);\n\n dialogs\n .filter(filterFunc)\n .forEach((dialog) => {\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\n });\n });\n\n this.rootScope.addEventListener('webpage_updated', ({id, msgs}) => {\n msgs.forEach(({peerId, mid, isScheduled}) => {\n const storage = isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n if(!message) return;\n message.media = {\n _: 'messageMediaWebPage',\n webpage: this.appWebPagesManager.getCachedWebPage(id)\n };\n\n this.rootScope.dispatchEvent('message_edit', {\n storageKey: storage.key,\n peerId,\n mid,\n message\n });\n });\n });\n\n this.rootScope.addEventListener('draft_updated', ({peerId, threadId, draft}) => {\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, threadId);\n if(dialog) {\n dialog.draft = draft;\n\n let drop = false;\n if(!draft && !getServerMessageId(dialog.top_message)) {\n this.dialogsStorage.dropDialog(peerId);\n drop = true;\n } else {\n this.dialogsStorage.generateIndexForDialog(dialog);\n this.dialogsStorage.pushDialog({dialog});\n }\n\n this.rootScope.dispatchEvent('dialog_draft', {\n peerId,\n dialog,\n drop,\n draft\n });\n } else if(threadId) {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n if(!chat) {\n this.reloadConversation(peerId);\n } else if((chat as Chat.channel).pFlags.forum) {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n }\n } else {\n this.reloadConversation(peerId);\n }\n });\n\n this.rootScope.addEventListener('poll_update', ({poll}) => {\n const set = this.appPollsManager.pollToMessages[poll.id];\n if(set) {\n for(const key of set) {\n const [peerId, mid] = key.split('_');\n\n const message = this.getMessageByPeer(peerId.toPeerId(), +mid);\n if(message) {\n this.setDialogToStateIfMessageIsTop(message);\n }\n }\n }\n });\n\n // * clear forum cache\n this.rootScope.addEventListener('chat_toggle_forum', ({chatId, enabled}) => {\n const peerId = chatId.toPeerId(true);\n if(!enabled) {\n delete this.threadsStorage[peerId];\n\n for(const key in this.pinnedMessages) {\n if(+key === peerId && key.startsWith(peerId + '_')) {\n delete this.pinnedMessages[key];\n }\n }\n }\n });\n\n this.batchUpdatesDebounced = debounce(() => {\n for(const event in this.batchUpdates) {\n const details = this.batchUpdates[event as keyof BatchUpdates];\n delete this.batchUpdates[event as keyof BatchUpdates];\n\n // @ts-ignore\n const result = details.callback(details.batch);\n if(result && (!(result instanceof Array) || result.length)) {\n // @ts-ignore\n rootScope.dispatchEvent(event as keyof BatchUpdates, result);\n }\n }\n }, 33, false, true);\n\n return this.appStateManager.getState().then((state) => {\n if(state.maxSeenMsgId) {\n this.maxSeenId = state.maxSeenMsgId;\n }\n });\n }\n\n public clear = (init?: boolean) => {\n if(this.middleware) {\n this.middleware.clean();\n } else {\n this.middleware = getMiddleware();\n this.uploadFilePromises = {};\n }\n\n this.messagesStorageByPeerId = {};\n this.groupedMessagesStorage = {};\n this.scheduledMessagesStorage = {};\n this.historiesStorage = {};\n this.threadsStorage = {};\n this.searchesStorage = {};\n this.pinnedMessages = {};\n this.threadsServiceMessagesIdsStorage = {};\n this.threadsToReplies = {};\n\n this.dialogsStorage && this.dialogsStorage.clear(init);\n this.filtersStorage && this.filtersStorage.clear(init);\n };\n\n public getInputEntities(entities: MessageEntity[]) {\n const sendEntites = copy(entities);\n sendEntites.forEach((entity) => {\n if(entity._ === 'messageEntityMentionName') {\n (entity as any as MessageEntity.inputMessageEntityMentionName)._ = 'inputMessageEntityMentionName';\n (entity as any as MessageEntity.inputMessageEntityMentionName).user_id = this.appUsersManager.getUserInput(entity.user_id);\n }\n });\n return sendEntites;\n }\n\n public invokeAfterMessageIsSent(tempId: number, callbackName: string, callback: (message: MyMessage) => Promise) {\n const finalize = this.tempFinalizeCallbacks[tempId] ??= {};\n const obj = finalize[callbackName] ??= {deferred: deferredPromise()};\n\n obj.callback = callback;\n\n return obj.deferred;\n }\n\n public editMessage(message: any, text: string, options: Partial<{\n noWebPage: true,\n newMedia: any,\n scheduleDate: number,\n entities: MessageEntity[]\n }> = {}): Promise {\n /* if(!this.canEditMessage(messageId)) {\n return Promise.reject({type: 'MESSAGE_EDIT_FORBIDDEN'});\n } */\n\n const {mid, peerId} = message;\n\n if(message.pFlags.is_outgoing) {\n return this.invokeAfterMessageIsSent(mid, 'edit', (message) => {\n // this.log('invoke editMessage callback', message);\n return this.editMessage(message, text, options);\n });\n }\n\n const entities = options.entities || [];\n if(text) {\n text = parseMarkdown(text, entities);\n }\n\n const schedule_date = options.scheduleDate || (message.pFlags.is_scheduled ? message.date : undefined);\n return this.apiManager.invokeApi('messages.editMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: message.id,\n message: text,\n media: options.newMedia,\n entities: entities.length ? this.getInputEntities(entities) : undefined,\n no_webpage: options.noWebPage,\n schedule_date\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error) => {\n this.log.error('editMessage error:', error);\n\n if(error && error.type === 'MESSAGE_NOT_MODIFIED') {\n error.handled = true;\n return;\n }\n if(error && error.type === 'MESSAGE_EMPTY') {\n error.handled = true;\n }\n return Promise.reject(error);\n });\n }\n\n public async sendText(peerId: PeerId, text: string, options: MessageSendingParams & Partial<{\n entities: MessageEntity[],\n viaBotId: BotId,\n queryId: string,\n resultId: string,\n noWebPage: true,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n webPage: WebPage,\n }> = {}): Promise {\n if(!text.trim()) {\n return;\n }\n\n options.entities ??= [];\n\n // this.checkSendOptions(options);\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n const config = await this.apiManager.getConfig();\n const MAX_LENGTH = config.message_length_max;\n const splitted = splitStringByLength(text, MAX_LENGTH);\n text = splitted[0];\n if(splitted.length > 1) {\n if(options.webPage?._ === 'webPage' && !text.includes(options.webPage.url)) {\n delete options.webPage;\n }\n }\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n const entities = options.entities;\n if(!options.viaBotId) {\n text = parseMarkdown(text, entities);\n // entities = mergeEntities(entities, parseEntities(text));\n }\n\n let sendEntites = this.getInputEntities(entities);\n if(!sendEntites.length) {\n sendEntites = undefined;\n }\n\n const message = this.generateOutgoingMessage(peerId, options);\n message.entities = entities;\n message.message = text;\n\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n const isChannel = this.appPeersManager.isChannel(peerId);\n\n if(options.webPage) {\n message.media = {\n _: 'messageMediaWebPage',\n webpage: options.webPage\n };\n }\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n toggleError();\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n let apiPromise: any;\n if(options.viaBotId) {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendMessage', {\n no_webpage: options.noWebPage,\n peer: this.appPeersManager.getInputPeerById(peerId),\n message: text,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n entities: sendEntites,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate || undefined,\n silent: options.silent,\n send_as: sendAs,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\n }, sentRequestOptions);\n }\n\n /* function is(value: any, condition: boolean): value is T {\n return condition;\n } */\n\n // this.log('sendText', message.mid);\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates: Updates) => {\n // this.log('sendText sent', message.mid);\n // if(is(updates, updates._ === 'updateShortSentMessage')) {\n if(updates._ === 'updateShortSentMessage') {\n // assumeType(updates);\n\n // * fix copying object with promise\n const promise = message.promise;\n delete message.promise;\n const newMessage = copy(message);\n defineNotNumerableProperties(message, ['promise']);\n message.promise = promise;\n\n newMessage.date = updates.date;\n newMessage.id = updates.id;\n newMessage.media = updates.media;\n newMessage.entities = updates.entities;\n this.wrapMessageEntities(newMessage);\n if(updates.pFlags.out) {\n newMessage.pFlags.out = true;\n }\n\n // * override with new updates\n updates = {\n _: 'updates',\n users: [],\n chats: [],\n seq: 0,\n date: undefined,\n updates: [{\n _: 'updateMessageID',\n random_id: message.random_id,\n id: newMessage.id\n }, {\n _: options.scheduleDate ? 'updateNewScheduledMessage' : (isChannel ? 'updateNewChannelMessage' : 'updateNewMessage'),\n message: newMessage,\n pts: updates.pts,\n pts_count: updates.pts_count\n }]\n };\n } else if((updates as Updates.updates).updates) {\n (updates as Updates.updates).updates.forEach((update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n\n // this.reloadConversation(peerId);\n\n // setTimeout(() => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n // }, 5000);\n message.promise.resolve();\n }, (error: ApiError) => {\n toggleError(error);\n message.promise.reject(error);\n throw error;\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined,\n threadId: options.threadId,\n clearDraft: options.clearDraft,\n sequential: true\n });\n\n const promises: ReturnType[] = [message.promise];\n for(let i = 1; i < splitted.length; ++i) {\n promises.push(this.sendText(peerId, splitted[i], options));\n }\n\n return Promise.all(promises).then(noop);\n }\n\n public sendFile(peerId: PeerId, options: MessageSendingParams & SendFileDetails & Partial<{\n isRoundMessage: boolean,\n isVoiceMessage: boolean,\n isGroupedItem: boolean,\n isMedia: boolean,\n\n groupId: string,\n caption: string,\n entities: MessageEntity[],\n background: boolean,\n clearDraft: boolean,\n noSound: boolean,\n\n waveform: Uint8Array,\n\n // ! only for internal use\n processAfter?: typeof processAfter\n }>) {\n const file = options.file;\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n // this.checkSendOptions(options);\n\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let attachType: 'document' | 'audio' | 'video' | 'voice' | 'photo', apiFileName: string;\n\n const fileType = 'mime_type' in file ? file.mime_type : file.type;\n const fileName = file instanceof File ? file.name : '';\n const isDocument = !(file instanceof File) && !(file instanceof Blob);\n let caption = options.caption || '';\n\n this.log('sendFile', file, fileType);\n\n const entities = options.entities || [];\n if(caption) {\n caption = parseMarkdown(caption, entities);\n }\n\n const attributes: DocumentAttribute[] = [];\n\n const isPhoto = getEnvironment().IMAGE_MIME_TYPES_SUPPORTED.has(fileType);\n\n const strippedPhotoSize: PhotoSize.photoStrippedSize = options.strippedBytes && {\n _: 'photoStrippedSize',\n bytes: options.strippedBytes,\n type: 'i'\n };\n\n let photo: MyPhoto, document: MyDocument;\n\n let actionName: Extract;\n if(isDocument) { // maybe it's a sticker or gif\n attachType = 'document';\n apiFileName = '';\n } else if(fileType.indexOf('audio/') === 0 || ['video/ogg'].indexOf(fileType) >= 0) {\n attachType = 'audio';\n apiFileName = 'audio.' + (fileType.split('/')[1] === 'ogg' ? 'ogg' : 'mp3');\n actionName = 'sendMessageUploadAudioAction';\n\n if(options.isVoiceMessage) {\n attachType = 'voice';\n message.pFlags.media_unread = true;\n }\n\n const attribute: DocumentAttribute.documentAttributeAudio = {\n _: 'documentAttributeAudio',\n pFlags: {\n voice: options.isVoiceMessage || undefined\n },\n waveform: options.waveform,\n duration: options.duration || 0\n };\n\n attributes.push(attribute);\n } else if(!options.isMedia) {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n } else if(isPhoto) {\n attachType = 'photo';\n apiFileName = 'photo.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadPhotoAction';\n\n const photoSize = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: THUMB_TYPE_FULL,\n location: null,\n size: file.size\n } as PhotoSize.photoSize;\n\n photo = {\n _: 'photo',\n id: '' + message.id,\n sizes: [photoSize],\n w: options.width,\n h: options.height\n } as any;\n\n if(strippedPhotoSize) {\n photo.sizes.unshift(strippedPhotoSize);\n }\n\n const cacheContext = this.thumbsStorage.getCacheContext(photo, photoSize.type);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL || '';\n\n photo = this.appPhotosManager.savePhoto(photo);\n } else if(getEnvironment().VIDEO_MIME_TYPES_SUPPORTED.has(fileType)) {\n attachType = 'video';\n apiFileName = 'video.mp4';\n actionName = 'sendMessageUploadVideoAction';\n\n const videoAttribute: DocumentAttribute.documentAttributeVideo = {\n _: 'documentAttributeVideo',\n pFlags: {\n round_message: options.isRoundMessage || undefined,\n supports_streaming: true\n },\n duration: options.duration,\n w: options.width,\n h: options.height\n };\n\n attributes.push(videoAttribute);\n\n // * must follow after video attribute\n if(options.noSound &&\n file.size > (10 * 1024) &&\n file.size < (10 * 1024 * 1024)) {\n attributes.push({\n _: 'documentAttributeAnimated'\n });\n }\n } else {\n attachType = 'document';\n apiFileName = 'document.' + fileType.split('/')[1];\n actionName = 'sendMessageUploadDocumentAction';\n }\n\n attributes.push({_: 'documentAttributeFilename', file_name: fileName || apiFileName});\n\n if((['document', 'video', 'audio', 'voice'] as (typeof attachType)[]).indexOf(attachType) !== -1 && !isDocument) {\n const thumbs: PhotoSize[] = [];\n document = {\n _: 'document',\n id: '' + message.id,\n duration: options.duration,\n attributes,\n w: options.width,\n h: options.height,\n thumbs,\n mime_type: fileType,\n size: file.size\n } as any;\n\n if(options.objectURL) {\n const cacheContext = this.thumbsStorage.getCacheContext(document);\n cacheContext.downloaded = file.size;\n cacheContext.url = options.objectURL;\n }\n\n let thumb: PhotoSize.photoSize;\n if(isPhoto) {\n attributes.push({\n _: 'documentAttributeImageSize',\n w: options.width,\n h: options.height\n });\n\n thumb = {\n _: 'photoSize',\n w: options.width,\n h: options.height,\n type: THUMB_TYPE_FULL,\n size: file.size\n };\n } else if(attachType === 'video') {\n if(options.thumb) {\n thumb = {\n _: 'photoSize',\n w: options.thumb.size.width,\n h: options.thumb.size.height,\n type: 'local-thumb',\n size: options.thumb.blob.size\n };\n\n const thumbCacheContext = this.thumbsStorage.getCacheContext(document, thumb.type);\n thumbCacheContext.downloaded = thumb.size;\n thumbCacheContext.url = options.thumb.url;\n }\n }\n\n if(thumb) {\n thumbs.push(thumb);\n }\n\n if(strippedPhotoSize) {\n thumbs.unshift(strippedPhotoSize);\n }\n\n /* if(thumbs.length) {\n const thumb = thumbs[0] as PhotoSize.photoSize;\n const docThumb = appPhotosManager.getDocumentCachedThumb(document.id);\n docThumb.downloaded = thumb.size;\n docThumb.url = thumb.url;\n } */\n\n document = this.appDocsManager.saveDoc(document);\n }\n\n this.log('sendFile', attachType, apiFileName, file.type, options);\n\n const sentDeferred = deferredPromise();\n // sentDeferred.cancel = () => {\n // const error = new Error('Download canceled');\n // error.name = 'AbortError';\n // sentDeferred.reject(error);\n\n // if(uploadPromise?.cancel) {\n // uploadPromise.cancel();\n // }\n // };\n\n const media: MessageMedia = isDocument ? undefined : {\n _: photo ? 'messageMediaPhoto' : 'messageMediaDocument',\n pFlags: {},\n // preloader,\n photo,\n document\n };\n\n if(media) {\n defineNotNumerableProperties(media as any, ['promise']);\n (media as any).promise = sentDeferred;\n\n if(options.spoiler) {\n (media as MessageMedia.messageMediaPhoto).pFlags.spoiler = true;\n }\n }\n\n message.entities = entities;\n message.message = caption;\n message.media = isDocument ? {\n _: 'messageMediaDocument',\n pFlags: {},\n document: file\n } as MessageMedia.messageMediaDocument : media;\n\n const uploadingFileName = !isDocument ? getFileNameForUpload(file) : undefined;\n message.uploadingFileName = uploadingFileName;\n\n if(uploadingFileName) {\n this.uploadFilePromises[uploadingFileName] = sentDeferred;\n }\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n let uploaded = false,\n uploadPromise: ReturnType = null;\n\n message.send = () => {\n if(isDocument) {\n const inputMedia: InputMedia = {\n _: 'inputMediaDocument',\n id: getDocumentInput(file)\n };\n\n sentDeferred.resolve(inputMedia);\n } else if(file instanceof File || file instanceof Blob) {\n const load = () => {\n if(!uploaded || message.error) {\n uploaded = false;\n\n uploadPromise = this.apiFileManager.upload({file, fileName: uploadingFileName});\n uploadPromise.catch((err) => {\n if(!uploaded) {\n this.log('cancelling upload', media);\n\n this.cancelPendingMessage(message.random_id);\n this.setTyping(peerId, {_: 'sendMessageCancelAction'}, undefined, options.threadId);\n sentDeferred.reject(err);\n }\n });\n\n uploadPromise.addNotifyListener((progress: Progress) => {\n /* if(DEBUG) {\n this.log('upload progress', progress);\n } */\n\n const percents = Math.max(1, Math.floor(100 * progress.done / progress.total));\n if(actionName) {\n this.setTyping(peerId, {_: actionName, progress: percents | 0}, undefined, options.threadId);\n }\n sentDeferred.notifyAll(progress);\n });\n\n sentDeferred.notifyAll({done: 0, total: file.size});\n }\n\n let thumbUploadPromise: typeof uploadPromise;\n if(attachType === 'video' && options.objectURL && options.thumb?.blob) {\n thumbUploadPromise = this.apiFileManager.upload({file: options.thumb.blob});\n }\n\n uploadPromise && uploadPromise.then(async(inputFile) => {\n /* if(DEBUG) {\n this.log('appMessagesManager: sendFile uploaded:', inputFile);\n } */\n\n inputFile.name = apiFileName;\n uploaded = true;\n let inputMedia: InputMedia;\n switch(attachType) {\n case 'photo':\n inputMedia = {\n _: 'inputMediaUploadedPhoto',\n file: inputFile,\n pFlags: {\n spoiler: options.spoiler || undefined\n }\n };\n break;\n\n default:\n inputMedia = {\n _: 'inputMediaUploadedDocument',\n file: inputFile,\n mime_type: fileType,\n pFlags: {\n force_file: actionName === 'sendMessageUploadDocumentAction' || undefined,\n spoiler: options.spoiler || undefined\n // nosound_video: options.noSound ? true : undefined\n },\n attributes\n };\n }\n\n if(thumbUploadPromise) {\n try {\n const inputFile = await thumbUploadPromise;\n (inputMedia as InputMedia.inputMediaUploadedDocument).thumb = inputFile;\n } catch(err) {\n this.log.error('sendFile thumb upload error:', err);\n }\n }\n\n sentDeferred.resolve(inputMedia);\n }, (error: ApiError) => {\n toggleError(error);\n throw error;\n });\n\n return sentDeferred;\n };\n\n if(options.isGroupedItem) {\n load();\n } else {\n this.sendSmthLazyLoadQueue.push({\n load\n });\n }\n }\n\n return sentDeferred;\n };\n\n this.beforeMessageSending(message, {\n isGroupedItem: options.isGroupedItem,\n isScheduled: !!options.scheduleDate || undefined,\n threadId: options.threadId,\n clearDraft: options.clearDraft,\n processAfter: options.processAfter\n });\n\n if(!options.isGroupedItem) {\n sentDeferred.then((inputMedia) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'}, undefined, options.threadId);\n\n return this.apiManager.invokeApi('messages.sendMedia', {\n background: options.background,\n peer: this.appPeersManager.getInputPeerById(peerId),\n media: inputMedia,\n message: caption,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n entities,\n clear_draft: options.clearDraft,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\n if(attachType === 'photo' &&\n error.code === 400 &&\n (error.type === 'PHOTO_INVALID_DIMENSIONS' ||\n error.type === 'PHOTO_SAVE_FILE_INVALID')) {\n error.handled = true;\n attachType = 'document';\n message.send();\n return;\n }\n\n toggleError(error);\n throw error;\n });\n });\n\n sentDeferred.then(message.promise.resolve, message.promise.reject);\n }\n\n const ret: {\n message: typeof message,\n promise: typeof sentDeferred\n } = {\n message\n } as any;\n\n defineNotNumerableProperties(ret, ['promise']);\n ret.promise = sentDeferred;\n\n return ret;\n }\n\n public async sendAlbum(peerId: PeerId, options: MessageSendingParams & {\n isMedia?: boolean,\n entities?: MessageEntity[],\n caption?: string,\n sendFileDetails: SendFileDetails[],\n clearDraft?: boolean\n }) {\n // this.checkSendOptions(options);\n\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n if(options.sendFileDetails.length === 1) {\n return this.sendFile(peerId, {...options, ...options.sendFileDetails[0]});\n }\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let caption = options.caption || '';\n let entities = options.entities || [];\n if(caption) {\n caption = parseMarkdown(caption, entities);\n }\n\n this.log('sendAlbum', options);\n\n const groupId = '' + ++this.groupedTempId;\n\n const callbacks: Array<() => void> = [];\n const processAfter = (cb: () => void) => {\n callbacks.push(cb);\n };\n\n const messages = options.sendFileDetails.map((details, idx) => {\n const o: Parameters[1] = {\n isGroupedItem: true,\n isMedia: options.isMedia,\n scheduleDate: options.scheduleDate,\n silent: options.silent,\n replyToMsgId,\n threadId: options.threadId,\n sendAsPeerId: options.sendAsPeerId,\n groupId,\n processAfter,\n ...details\n };\n\n if(idx === 0) {\n o.caption = caption;\n o.entities = entities;\n // o.replyToMsgId = replyToMsgId;\n }\n\n return this.sendFile(peerId, o).message;\n });\n\n if(options.clearDraft) {\n callbacks.push(() => {\n this.appDraftsManager.clearDraft(peerId, options.threadId);\n });\n }\n\n callbacks.forEach((callback) => {\n callback();\n });\n\n // * test pending\n // return;\n\n const toggleError = (message: Message.message, error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\n const invoke = (multiMedia: InputSingleMedia[]) => {\n this.setTyping(peerId, {_: 'sendMessageCancelAction'}, undefined, options.threadId);\n\n const deferred = deferredPromise();\n this.sendSmthLazyLoadQueue.push({\n load: () => {\n return this.apiManager.invokeApi('messages.sendMultiMedia', {\n peer: inputPeer,\n multi_media: multiMedia,\n reply_to_msg_id: replyToMsgId,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n clear_draft: options.clearDraft,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n }, (error: ApiError) => {\n messages.forEach((message) => toggleError(message, error));\n deferred.reject(error);\n });\n }\n });\n\n return deferred;\n };\n\n const promises: Promise[] = messages.map((message) => {\n return (message.send() as Promise).then((inputMedia) => {\n return Promise.all([\n inputMedia,\n this.apiManager.invokeApi('messages.uploadMedia', {\n peer: inputPeer,\n media: inputMedia\n })\n ]);\n })\n .then(([originalInputMedia, messageMedia]) => {\n let inputMedia: InputMedia;\n if(messageMedia._ === 'messageMediaPhoto') {\n const photo = this.appPhotosManager.savePhoto(messageMedia.photo);\n inputMedia = getPhotoMediaInput(photo);\n } else if(messageMedia._ === 'messageMediaDocument') {\n const doc = this.appDocsManager.saveDoc(messageMedia.document);\n inputMedia = getDocumentMediaInput(doc);\n }\n\n // copy original flags\n const copyProperties: (keyof InputMedia.inputMediaPhoto)[] = [\n 'pFlags',\n 'ttl_seconds'\n ];\n\n copyProperties.forEach((property) => {\n // @ts-ignore\n inputMedia[property] = originalInputMedia[property] ?? inputMedia[property];\n });\n\n const inputSingleMedia: InputSingleMedia = {\n _: 'inputSingleMedia',\n media: inputMedia,\n random_id: message.random_id,\n message: caption,\n entities\n };\n\n // * only 1 caption for all inputs\n if(caption) {\n caption = '';\n entities = [];\n }\n\n return inputSingleMedia;\n }).catch((err: ApiError) => {\n this.log.error('sendAlbum upload item error:', err, message);\n toggleError(message, err);\n throw err;\n });\n });\n\n return Promise.all(promises).then((inputs) => {\n return invoke(inputs.filter(Boolean));\n });\n }\n\n public sendContact(peerId: PeerId, contactPeerId: PeerId) {\n return this.sendOther(peerId, this.appUsersManager.getContactMediaInput(contactPeerId));\n }\n\n public sendOther(\n peerId: PeerId,\n inputMedia: InputMedia | {_: 'messageMediaPending', messageMedia: MessageMedia},\n options: MessageSendingParams & Partial<{\n viaBotId: BotId,\n replyMarkup: ReplyMarkup,\n clearDraft: true,\n queryId: string\n resultId: string,\n geoPoint: GeoPoint\n }> = {}\n ) {\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n\n // this.checkSendOptions(options);\n const message = this.generateOutgoingMessage(peerId, options);\n const replyToMsgId = options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined;\n\n let media: MessageMedia;\n switch(inputMedia._) {\n case 'inputMediaPoll': {\n const pollId = '' + message.id;\n inputMedia.poll.id = pollId;\n this.appPollsManager.savePoll(inputMedia.poll, {\n _: 'pollResults',\n flags: 4,\n total_voters: 0,\n pFlags: {},\n recent_voters: []\n });\n\n const {poll, results} = this.appPollsManager.getPoll(pollId);\n media = {\n _: 'messageMediaPoll',\n poll,\n results\n };\n\n break;\n }\n\n case 'inputMediaPhoto': {\n media = {\n _: 'messageMediaPhoto',\n photo: this.appPhotosManager.getPhoto((inputMedia.id as InputPhoto.inputPhoto).id)\n };\n break;\n }\n\n case 'inputMediaDocument': {\n const doc = this.appDocsManager.getDoc((inputMedia.id as InputDocument.inputDocument).id);\n /* if(doc.sticker && doc.stickerSetInput) {\n appStickersManager.pushPopularSticker(doc.id);\n } */\n media = {\n _: 'messageMediaDocument',\n document: doc\n };\n break;\n }\n\n case 'inputMediaContact': {\n media = {\n _: 'messageMediaContact',\n phone_number: inputMedia.phone_number,\n first_name: inputMedia.first_name,\n last_name: inputMedia.last_name,\n user_id: inputMedia.user_id ?? '0',\n vcard: inputMedia.vcard\n };\n break;\n }\n\n case 'inputMediaGeoPoint': {\n media = {\n _: 'messageMediaGeo',\n geo: options.geoPoint\n };\n break;\n }\n\n case 'inputMediaVenue': {\n media = {\n _: 'messageMediaVenue',\n geo: options.geoPoint,\n title: inputMedia.title,\n address: inputMedia.address,\n provider: inputMedia.provider,\n venue_id: inputMedia.venue_id,\n venue_type: inputMedia.venue_type\n };\n break;\n }\n\n case 'messageMediaPending': {\n media = (inputMedia as any).messageMedia;\n break;\n }\n }\n\n message.media = media;\n\n const toggleError = (error?: ApiError) => {\n this.onMessagesSendError([message], error);\n this.rootScope.dispatchEvent('messages_pending');\n };\n\n message.send = () => {\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const sendAs = options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined;\n let apiPromise: Promise;\n if(options.viaBotId) {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendInlineBotResult', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n query_id: options.queryId,\n id: options.resultId,\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n send_as: sendAs\n }, sentRequestOptions);\n } else {\n apiPromise = this.apiManager.invokeApiAfter('messages.sendMedia', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n media: inputMedia as InputMedia,\n random_id: message.random_id,\n reply_to_msg_id: replyToMsgId || undefined,\n message: '',\n clear_draft: options.clearDraft,\n schedule_date: options.scheduleDate,\n silent: options.silent,\n send_as: sendAs,\n update_stickersets_order: UPDATE_STICKERSET_ORDER\n }, sentRequestOptions);\n }\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n return apiPromise.then((updates) => {\n if(updates.updates) {\n updates.updates.forEach((update: Update) => {\n if(update._ === 'updateDraftMessage') {\n update.local = true;\n }\n });\n }\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\n toggleError(error);\n throw error;\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n };\n\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined,\n threadId: options.threadId,\n clearDraft: options.clearDraft,\n sequential: true\n });\n\n return message.promise;\n }\n\n /* private checkSendOptions(options: Partial<{\n scheduleDate: number\n }>) {\n if(options.scheduleDate) {\n const minTimestamp = (Date.now() / 1000 | 0) + 10;\n if(options.scheduleDate <= minTimestamp) {\n delete options.scheduleDate;\n }\n }\n } */\n\n private beforeMessageSending(message: Message.message, options: Pick & Partial<{\n isGroupedItem: boolean,\n isScheduled: boolean,\n clearDraft: boolean,\n sequential: boolean,\n processAfter?: (cb: () => void) => void\n }> = {}) {\n const messageId = message.id;\n const peerId = this.getMessagePeer(message);\n const storage = options.isScheduled ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n message.storageKey = storage.key;\n const callbacks: Array<() => void> = [];\n if(options.isScheduled) {\n // if(!options.isGroupedItem) {\n this.saveMessages([message], {storage, isScheduled: true, isOutgoing: true});\n callbacks.push(() => {\n this.rootScope.dispatchEvent('scheduled_new', message);\n });\n } else {\n /* if(options.threadId && this.threadsStorage[peerId]) {\n delete this.threadsStorage[peerId][options.threadId];\n } */\n const storages: HistoryStorage[] = [\n this.getHistoryStorage(peerId),\n options.threadId ? this.getHistoryStorage(peerId, options.threadId) : undefined\n ];\n\n for(const storage of storages) {\n if(storage) {\n storage.history.unshift(messageId);\n }\n }\n\n this.saveMessages([message], {storage, isOutgoing: true});\n this.setDialogTopMessage(message);\n\n if(options.threadId) {\n const forumTopic = this.dialogsStorage.getForumTopic(peerId, options.threadId);\n if(forumTopic) {\n this.setDialogTopMessage(message, forumTopic);\n }\n }\n\n callbacks.push(() => {\n this.rootScope.dispatchEvent('history_append', {storageKey: storage.key, message});\n });\n }\n\n const pending: PendingMessageDetails = this.pendingByRandomId[message.random_id] = {\n peerId,\n tempId: messageId,\n threadId: options.threadId,\n storage,\n sequential: options.sequential\n };\n\n this.pendingTopMsgs[peerId] = messageId;\n\n if(!options.isGroupedItem && message.send) {\n callbacks.push(() => {\n if(options.clearDraft) {\n this.appDraftsManager.clearDraft(peerId, options.threadId);\n }\n\n message.send();\n });\n }\n\n if(callbacks.length) {\n (options.processAfter || processAfter)(() => {\n for(const callback of callbacks) {\n callback();\n }\n });\n }\n\n return pending;\n }\n\n private generateOutgoingMessage(peerId: PeerId, options: MessageSendingParams & Partial<{\n viaBotId: BotId,\n groupId: string,\n replyMarkup: ReplyMarkup,\n }>) {\n if(options.threadId && !options.replyToMsgId) {\n options.replyToMsgId = options.threadId;\n }\n\n let postAuthor: string;\n const isBroadcast = this.appPeersManager.isBroadcast(peerId);\n if(isBroadcast) {\n const chat = this.appPeersManager.getPeer(peerId) as Chat.channel;\n if(chat.pFlags.signatures) {\n const user = this.appUsersManager.getSelf();\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n postAuthor = fullName;\n }\n }\n\n const message: Message.message = {\n _: 'message',\n id: this.generateTempMessageId(peerId),\n from_id: options.sendAsPeerId ? this.appPeersManager.getOutputPeer(options.sendAsPeerId) : this.generateFromId(peerId),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n post_author: postAuthor,\n pFlags: this.generateFlags(peerId),\n date: options.scheduleDate || (tsNow(true) + this.timeManager.getServerTimeOffset()),\n message: '',\n grouped_id: options.groupId,\n random_id: randomLong(),\n reply_to: this.generateReplyHeader(peerId, options.replyToMsgId, options.threadId),\n via_bot_id: options.viaBotId,\n reply_markup: options.replyMarkup,\n replies: this.generateReplies(peerId),\n views: isBroadcast && 1,\n pending: true\n };\n\n defineNotNumerableProperties(message, ['send', 'promise']);\n if(options.groupId === undefined) {\n message.promise = deferredPromise();\n }\n\n return message;\n }\n\n private generateReplyHeader(peerId: PeerId, replyToMsgId: number, replyToTopId?: number) {\n const isForum = this.appPeersManager.isForum(peerId);\n if(isForum && !replyToTopId) {\n const originalMessage = this.getMessageByPeer(peerId, replyToMsgId);\n if(originalMessage) {\n replyToTopId = getMessageThreadId(originalMessage, true);\n }\n }\n\n const header: MessageReplyHeader = {\n _: 'messageReplyHeader',\n reply_to_msg_id: replyToMsgId || replyToTopId,\n pFlags: {}\n };\n\n if(replyToTopId && isForum && GENERAL_TOPIC_ID !== replyToTopId) {\n header.pFlags.forum_topic = true;\n }\n\n if(replyToTopId && header.reply_to_msg_id !== replyToTopId) {\n header.reply_to_top_id = replyToTopId;\n }\n\n return header;\n }\n\n private generateReplies(peerId: PeerId) {\n let replies: MessageReplies.messageReplies;\n if(this.appPeersManager.isBroadcast(peerId)) {\n const channelFull = this.appProfileManager.getCachedFullChat(peerId.toChatId()) as ChatFull.channelFull;\n if(channelFull?.linked_chat_id) {\n replies = {\n _: 'messageReplies',\n flags: 1,\n pFlags: {\n comments: true\n },\n channel_id: channelFull.linked_chat_id,\n replies: 0,\n replies_pts: 0\n };\n }\n }\n\n return replies;\n }\n\n /**\n * Generate correct from_id according to anonymous or broadcast\n */\n private generateFromId(peerId: PeerId) {\n if(this.appPeersManager.isAnyChat(peerId) && (this.appPeersManager.isBroadcast(peerId) || this.isAnonymousSending(peerId))) {\n return undefined;\n } else {\n return this.appPeersManager.getOutputPeer(this.appUsersManager.getSelf().id.toPeerId());\n }\n }\n\n private generateFlags(peerId: PeerId) {\n const pFlags: Message.message['pFlags'] = {};\n const fromId = this.appUsersManager.getSelf().id;\n if(peerId !== fromId) {\n pFlags.out = true;\n\n if(!this.appPeersManager.isChannel(peerId) && !this.appUsersManager.isBot(peerId)) {\n pFlags.unread = true;\n }\n }\n\n if(this.appPeersManager.isBroadcast(peerId)) {\n pFlags.post = true;\n }\n\n return pFlags;\n }\n\n private generateForwardHeader(peerId: PeerId, originalMessage: Message.message) {\n const myId = this.appUsersManager.getSelf().id.toPeerId();\n const fromId = originalMessage.fromId;\n if(fromId === myId && originalMessage.peerId === myId && !originalMessage.fwd_from) {\n return;\n }\n\n const fwdHeader: MessageFwdHeader.messageFwdHeader = {\n _: 'messageFwdHeader',\n flags: 0,\n date: originalMessage.date\n };\n\n let isUserHidden = false;\n if(originalMessage.fwd_from) {\n fwdHeader.from_id = originalMessage.fwd_from.from_id;\n fwdHeader.from_name = originalMessage.fwd_from.from_name;\n fwdHeader.post_author = originalMessage.fwd_from.post_author;\n } else {\n fwdHeader.post_author = originalMessage.post_author;\n\n if(fromId.isUser()) {\n const userFull = this.appProfileManager.getCachedFullUser(fromId.toUserId());\n if(userFull?.private_forward_name) {\n fwdHeader.from_name = userFull.private_forward_name;\n isUserHidden = true;\n }\n }\n\n if(!isUserHidden) {\n fwdHeader.from_id = this.appPeersManager.getOutputPeer(fromId);\n }\n }\n\n if(this.appPeersManager.isBroadcast(originalMessage.peerId)) {\n if(originalMessage.post_author) {\n fwdHeader.post_author = originalMessage.post_author;\n }\n\n fwdHeader.channel_post = originalMessage.id;\n }\n\n if(peerId === myId && !isUserHidden) {\n fwdHeader.saved_from_msg_id = originalMessage.id;\n fwdHeader.saved_from_peer = this.appPeersManager.getOutputPeer(originalMessage.peerId);\n }\n\n return fwdHeader;\n }\n\n public generateFakeAvatarMessage(peerId: PeerId, photo: Photo) {\n const maxId = Number.MAX_SAFE_INTEGER;\n const message: Message.messageService = {\n _: 'messageService',\n pFlags: {},\n action: {\n _: 'messageActionChannelEditPhoto',\n photo\n },\n id: maxId,\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n mid: maxId,\n peerId,\n date: (photo as Photo.photo).date,\n fromId: peerId\n };\n\n this.getHistoryMessagesStorage(peerId).set(maxId, message);\n return message;\n }\n\n public getUploadPromise(uploadFileName: string) {\n return this.uploadFilePromises[uploadFileName];\n }\n\n public isAnonymousSending(peerId: PeerId): boolean {\n if(!peerId.isAnyChat()) {\n return false;\n }\n\n const chat = this.appPeersManager.getPeer(peerId);\n return (chat as Chat.channel).admin_rights?.pFlags?.anonymous;\n }\n\n public setDialogTopMessage(\n message: MyMessage,\n dialog: MTDialog.dialog | ForumTopic = this.getDialogOnly(message.peerId)\n ) {\n if(!dialog) {\n return;\n }\n\n dialog.top_message = message.mid;\n\n const historyStorage = this.getHistoryStorage(message.peerId, dialog._ === 'forumTopic' ? dialog.id : undefined);\n historyStorage.maxId = message.mid;\n\n this.dialogsStorage.generateIndexForDialog(dialog, false, message);\n\n this.scheduleHandleNewDialogs(message.peerId, dialog);\n }\n\n public cancelPendingMessage(randomId: string) {\n const pendingData = this.pendingByRandomId[randomId];\n\n /* if(DEBUG) {\n this.log('cancelPendingMessage', randomId, pendingData);\n } */\n\n if(pendingData) {\n const {peerId, tempId, storage} = pendingData;\n const historyStorage = this.getHistoryStorage(peerId);\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: [tempId],\n pts: undefined,\n pts_count: undefined\n });\n\n historyStorage.history.delete(tempId);\n\n delete this.pendingByRandomId[randomId];\n storage.delete(tempId);\n\n return true;\n }\n\n return false;\n }\n\n /* public async refreshConversations() {\n const limit = 200, outDialogs: Dialog[] = [];\n for(let folderId = 0; folderId < 2; ++folderId) {\n let offsetDate = 0;\n for(;;) {\n const {dialogs, isEnd} = await this.getTopMessages(limit, folderId, offsetDate);\n\n if(dialogs.length) {\n outDialogs.push(...dialogs as Dialog[]);\n const dialog = dialogs[dialogs.length - 1];\n\n // * get peerId and mid manually, because dialog can be migrated peer and it won't be saved\n const peerId = getPeerId(dialog.peer);\n const mid = generateMessageId(dialog.top_message);\n offsetDate = this.getMessageByPeer(peerId, mid).date;\n\n if(!offsetDate) {\n console.error('refreshConversations: got no offsetDate', dialog);\n break;\n }\n }\n\n if(isEnd) {\n break;\n }\n }\n }\n\n let obj: {[peerId: string]: Dialog} = {};\n outDialogs.forEach((dialog) => {\n obj[dialog.peerId] = dialog;\n });\n rootScope.dispatchEvent('dialogs_multiupdate', obj);\n\n return outDialogs;\n } */\n\n public async fillConversations(): Promise {\n const middleware = this.middleware.get();\n while(!this.dialogsStorage.isDialogsLoaded(GLOBAL_FOLDER_ID)) {\n const result = await this.getTopMessages({limit: 100, folderId: GLOBAL_FOLDER_ID});\n if(!middleware() || result.isEnd) {\n break;\n }\n }\n }\n\n /* public async getConversationsAll(query = '', folderId = 0) {\n const limit = 200, outDialogs: Dialog[] = [];\n for(; folderId < 2; ++folderId) {\n let offsetIndex = 0;\n for(;;) {\n const {dialogs} = await appMessagesManager.getConversations(query, offsetIndex, limit, folderId).promise;\n\n if(dialogs.length) {\n outDialogs.push(...dialogs);\n offsetIndex = dialogs[dialogs.length - 1].index || 0;\n } else {\n break;\n }\n }\n }\n\n return outDialogs;\n } */\n\n public getReadMaxIdIfUnread(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(threadId && !this.appChatsManager.isForum(peerId.toChatId())) {\n const chatHistoryStorage = this.getHistoryStorage(peerId);\n const readMaxId = Math.max(chatHistoryStorage.readMaxId ?? 0, historyStorage.readMaxId);\n const message = this.getMessageByPeer(peerId, historyStorage.maxId); // usually message is missing, so pFlags.out won't be there anyway\n return !message?.pFlags?.out && readMaxId < historyStorage.maxId ? readMaxId : 0;\n } else {\n const message = this.getMessageByPeer(peerId, historyStorage.maxId);\n const readMaxId = peerId.isUser() ? Math.max(historyStorage.readMaxId, historyStorage.readOutboxMaxId) : historyStorage.readMaxId;\n // readMaxId can be 4294967295 (0)\n return !message?.pFlags?.out && readMaxId < historyStorage.maxId && getServerMessageId(readMaxId) ? readMaxId : 0;\n }\n }\n\n // public lolSet = new Set();\n public getTopMessages({limit, folderId}: {\n limit: number,\n folderId: number\n }) {\n // const dialogs = this.dialogsStorage.getFolder(folderId);\n const offsetId = 0;\n let offsetPeerId: PeerId;\n let offsetIndex = 0;\n\n let offsetDate = this.dialogsStorage.getOffsetDate(folderId);\n if(offsetDate) {\n offsetIndex = offsetDate * 0x10000;\n offsetDate += this.timeManager.getServerTimeOffset();\n }\n\n const useLimit = 100;\n const middleware = this.middleware.get();\n const peerId = this.dialogsStorage.isFilterIdForForum(folderId) ? folderId : undefined;\n\n let promise: Promise, params: any;\n if(peerId) {\n const _promise = this.apiManager.invokeApi('channels.getForumTopics', params = {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n limit: useLimit,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_topic: 0\n }, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n });\n\n promise = this.dialogsStorage.processTopicsPromise(peerId, _promise);\n } else {\n // ! ВНИМАНИЕ: ОЧЕНЬ СЛОЖНАЯ ЛОГИКА:\n // ! если делать запрос сначала по папке 0, потом по папке 1, по индексу 0 в массиве будет один и тот же диалог, с dialog.pFlags.pinned, ЛОЛ???\n // ! т.е., с запросом folder_id: 1, и exclude_pinned: 0, в результате будут ещё и закреплённые с папки 0\n promise = this.apiManager.invokeApiSingle('messages.getDialogs', params = {\n folder_id: folderId,\n offset_date: offsetDate,\n offset_id: offsetId,\n offset_peer: this.appPeersManager.getInputPeerById(offsetPeerId),\n limit: useLimit,\n hash: '0'\n }, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n });\n }\n\n return promise.then((result) => {\n if(!middleware() || result._ === 'messages.dialogsNotModified') return null;\n\n if(DEBUG) {\n this.log('messages.getDialogs result:', result);\n }\n\n // can reset pinned order here\n if(!peerId && !offsetId && !offsetDate && !offsetPeerId && folderId !== GLOBAL_FOLDER_ID) {\n this.dialogsStorage.resetPinnedOrder(folderId);\n }\n\n if(!peerId && !offsetDate) {\n // telegramMeWebManager.setAuthorized(true);\n this.appDraftsManager.addMissedDialogs();\n }\n\n this.appUsersManager.saveApiUsers(result.users);\n this.appChatsManager.saveApiChats(result.chats);\n this.saveMessages(result.messages);\n\n let maxSeenIdIncremented = offsetDate ? true : false;\n let hasPrepend = false;\n const noIdsDialogs: BroadcastEvents['dialogs_multiupdate'] = new Map();\n const setFolderId: REAL_FOLDER_ID = folderId === GLOBAL_FOLDER_ID ? FOLDER_ID_ALL : folderId as REAL_FOLDER_ID;\n const saveGlobalOffset = !!peerId || folderId === GLOBAL_FOLDER_ID;\n const items: Array =\n (result as MessagesDialogs.messagesDialogsSlice).dialogs as Dialog[] ||\n (result as MessagesForumTopics).topics as ForumTopic[];\n forEachReverse(items, (dialog) => {\n if(!dialog) {\n return;\n }\n\n // const d = Object.assign({}, dialog);\n // ! нужно передавать folderId, так как по папке !== 0 нет свойства folder_id\n if(!peerId) {\n (dialog as Dialog).folder_id ??= setFolderId;\n }\n\n this.dialogsStorage.saveDialog({\n dialog,\n ignoreOffsetDate: true,\n saveGlobalOffset\n });\n\n if(dialog.peerId === undefined) {\n return;\n }\n\n if(!maxSeenIdIncremented &&\n !this.appPeersManager.isChannel(dialog.peerId || this.appPeersManager.getPeerId(dialog.peer))) {\n this.incrementMaxSeenId(dialog.top_message);\n maxSeenIdIncremented = true;\n }\n\n // if(!folderId && !dialog.folder_id) {\n // this.lolSet.add(dialog.peerId);\n // }\n\n if(offsetIndex && getDialogIndex(dialog) > offsetIndex) {\n this.scheduleHandleNewDialogs(dialog.peerId, dialog);\n hasPrepend = true;\n }\n\n // ! это может случиться, если запрос идёт не по папке 0, а по 1. почему-то read'ов нет\n // ! в итоге, чтобы получить 1 диалог, делается первый запрос по папке 0, потом запрос для архивных по папке 1, и потом ещё перезагрузка архивного диалога\n if(!peerId && !getServerMessageId(dialog.read_inbox_max_id) && !getServerMessageId(dialog.read_outbox_max_id)) {\n noIdsDialogs.set(dialog.peerId, {dialog: dialog as Dialog});\n\n this.log.error('noIdsDialogs', dialog, params);\n } else if(dialog.top_message) { // * fix sending status\n const topMessage = this.getMessageByPeer(dialog.peerId, dialog.top_message);\n if(topMessage) {\n this.setMessageUnreadByDialog(topMessage, dialog);\n this.dialogsStorage.setDialogToState(dialog);\n }\n }\n });\n\n if(noIdsDialogs.size) {\n // setTimeout(() => { // test bad situation\n const peerIds = [...noIdsDialogs.keys()];\n const promises = peerIds.map((peerId) => this.reloadConversation(peerId));\n Promise.all(promises).then(() => {\n this.rootScope.dispatchEvent('dialogs_multiupdate', noIdsDialogs);\n\n for(let i = 0; i < peerIds.length; ++i) {\n const peerId = peerIds[i];\n this.rootScope.dispatchEvent('dialog_unread', {\n peerId,\n dialog: this.getDialogOnly(peerId)\n });\n }\n });\n // }, 10e3);\n }\n\n const count = (result as MessagesDialogs.messagesDialogsSlice).count;\n\n // exclude empty draft dialogs\n const folderDialogs = this.dialogsStorage.getFolderDialogs(folderId, false);\n let dialogsLength = 0;\n for(let i = 0, length = folderDialogs.length; i < length; ++i) {\n if(getServerMessageId(folderDialogs[i].top_message)) {\n ++dialogsLength;\n }\n }\n\n const isEnd = /* limit > dialogsResult.dialogs.length || */\n !count ||\n dialogsLength >= count ||\n !items.length;\n if(isEnd) {\n this.dialogsStorage.setDialogsLoaded(folderId, true);\n }\n\n if(hasPrepend) {\n this.scheduleHandleNewDialogs();\n } else {\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map());\n }\n\n const dialogs = items;\n const slicedDialogs = limit === useLimit ? dialogs : dialogs.slice(0, limit);\n return {\n isEnd: isEnd && slicedDialogs[slicedDialogs.length - 1] === dialogs[dialogs.length - 1],\n count,\n dialogs: slicedDialogs\n };\n });\n }\n\n public async forwardMessages(peerId: PeerId, fromPeerId: PeerId, mids: number[], options: MessageSendingParams & Partial<{\n withMyScore: true,\n dropAuthor: boolean,\n dropCaptions: boolean\n }> = {}) {\n delete options.replyToMsgId;\n delete options.threadId;\n\n peerId = this.appPeersManager.getPeerMigratedTo(peerId) || peerId;\n mids = mids.slice().sort((a, b) => a - b);\n\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const originalMessage = this.getMessageByPeer(fromPeerId, mid) as Message.message;\n if(originalMessage.pFlags.is_outgoing) { // this can happen when forwarding a changelog\n this.sendText(peerId, originalMessage.message, {\n entities: originalMessage.entities,\n scheduleDate: options.scheduleDate,\n silent: options.silent\n });\n\n mids.splice(i--, 1);\n --length;\n }\n }\n\n if(!mids.length) {\n return Promise.resolve();\n }\n\n const config = await this.apiManager.getConfig();\n const overflowMids = mids.splice(config.forwarded_count_max, mids.length - config.forwarded_count_max);\n\n if(options.dropCaptions) {\n options.dropAuthor = true;\n }\n\n const groups: {\n [groupId: string]: {\n tempId: string,\n messages: Message.message[]\n }\n } = {};\n\n const newMids: number[] = [];\n const newMessages = mids.map((mid) => {\n const originalMessage = this.getMessageByPeer(fromPeerId, mid) as Message.message;\n const message: Message.message = this.generateOutgoingMessage(peerId, options);\n newMids.push(message.id);\n\n const keys: Array = [\n 'entities',\n 'media'\n // 'reply_markup'\n ];\n\n if(!options.dropAuthor) {\n message.fwd_from = this.generateForwardHeader(peerId, originalMessage);\n keys.push('views', 'forwards');\n\n if(message.fwd_from?.from_name && peerId === this.appPeersManager.peerId) {\n delete message.from_id;\n }\n }\n\n if(!options.dropCaptions || !originalMessage.media) {\n keys.push('message');\n }\n\n const replyToMid = originalMessage.reply_to?.reply_to_msg_id;\n const replyToMessageIdx = mids.indexOf(replyToMid);\n if(replyToMid && replyToMessageIdx !== -1) {\n const newReplyToMid = newMids[replyToMessageIdx];\n message.reply_to = {\n _: 'messageReplyHeader',\n reply_to_msg_id: newReplyToMid\n };\n\n /* this.invokeAfterMessageIsSent(newReplyToMid, 'reply', async(originalMessage) => {\n message.reply_to.reply_to_msg_id = originalMessage.mid;\n }); */\n }\n\n keys.forEach((key) => {\n // @ts-ignore\n message[key] = copy(originalMessage[key]);\n });\n\n const document = (message.media as MessageMedia.messageMediaDocument)?.document as MyDocument;\n if(document) {\n const types: MyDocument['type'][] = ['round', 'voice'];\n if(types.includes(document.type)) {\n (message as MyMessage).pFlags.media_unread = true;\n }\n\n if(document.sticker && !this.rootScope.premium) {\n const effectThumb = getStickerEffectThumb(document);\n if(effectThumb) {\n (message.media as MessageMedia.messageMediaDocument).pFlags.nopremium = true;\n }\n }\n }\n\n if(originalMessage.grouped_id) {\n const group = groups[originalMessage.grouped_id] ??= {tempId: '' + ++this.groupedTempId, messages: []};\n group.messages.push(message);\n }\n\n return message;\n });\n\n for(const groupId in groups) {\n const group = groups[groupId];\n if(group.messages.length > 1) {\n group.messages.forEach((message) => {\n message.grouped_id = group.tempId;\n });\n }\n }\n\n newMessages.forEach((message) => {\n this.beforeMessageSending(message, {\n isScheduled: !!options.scheduleDate || undefined,\n sequential: true\n });\n });\n\n const sentRequestOptions: PendingAfterMsg = {};\n if(this.pendingAfterMsgs[peerId]) {\n sentRequestOptions.afterMessageId = this.pendingAfterMsgs[peerId].messageId;\n }\n\n const promise = /* true ? Promise.resolve() : */this.apiManager.invokeApiAfter('messages.forwardMessages', {\n from_peer: this.appPeersManager.getInputPeerById(fromPeerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n random_id: newMessages.map((message) => message.random_id),\n to_peer: this.appPeersManager.getInputPeerById(peerId),\n with_my_score: options.withMyScore,\n silent: options.silent,\n schedule_date: options.scheduleDate,\n drop_author: options.dropAuthor,\n drop_media_captions: options.dropCaptions,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined\n }, sentRequestOptions).then((updates) => {\n this.log('forwardMessages updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n }, (error: ApiError) => {\n this.onMessagesSendError(newMessages, error);\n throw error;\n }).finally(() => {\n if(this.pendingAfterMsgs[peerId] === sentRequestOptions) {\n delete this.pendingAfterMsgs[peerId];\n }\n });\n\n this.pendingAfterMsgs[peerId] = sentRequestOptions;\n\n const promises: (typeof promise)[] = [promise];\n if(overflowMids.length) {\n promises.push(this.forwardMessages(peerId, fromPeerId, overflowMids, options));\n }\n\n return Promise.all(promises).then(noop);\n }\n\n public generateEmptyMessage(mid: number): Message.message | Message.messageService {\n return undefined;\n // return {\n // _: 'messageEmpty',\n // id: getServerMessageId(mid),\n // mid,\n // deleted: true,\n // pFlags: {}\n // };\n }\n\n private onMessagesSendError(messages: Message.message[], error?: ApiError) {\n messages.forEach((message) => {\n if(message.error === error) {\n return;\n }\n\n if(error) {\n message.error = error;\n this.rootScope.dispatchEvent('message_error', {storageKey: message.storageKey, tempId: message.mid, error});\n\n const dialog = this.getDialogOnly(message.peerId);\n if(dialog) {\n this.rootScope.dispatchEvent('dialog_unread', {peerId: message.peerId, dialog});\n }\n } else {\n delete message.error;\n }\n });\n }\n\n public getMessagesStorageByKey(key: MessagesStorageKey) {\n const s = key.split('_');\n const peerId: PeerId = +s[0];\n const type: MessagesStorageType = s[1] as any;\n return type === 'scheduled' ? this.getScheduledMessagesStorage(peerId) : this.getHistoryMessagesStorage(peerId);\n }\n\n public getMessageFromStorage(storage: MessagesStorage | MessagesStorageKey, mid: number) {\n if(typeof(storage) === 'string') {\n storage = this.getMessagesStorageByKey(storage);\n }\n\n return storage && storage.get(mid)/* || this.generateEmptyMessage(mid) */;\n }\n\n private createMessageStorage(peerId: PeerId, type: MessagesStorageType) {\n const storage: MessagesStorage = new Map() as any;\n storage.peerId = peerId;\n storage.type = type;\n storage.key = `${peerId}_${type}`;\n\n /* let num = 0;\n Object.defineProperty(storage, 'num', {\n get: () => ++num,\n set: (_num: number) => num = _num,\n enumerable: false\n });\n\n Object.defineProperty(storage, 'generateIndex', {\n value: (message: any) => {\n if(message.index === undefined) {\n message.index = (message.date * 0x10000) + (storage.num & 0xFFFF);\n }\n },\n enumerable: false\n }); */\n\n return storage;\n }\n\n public getHistoryMessagesStorage(peerId: PeerId) {\n return this.messagesStorageByPeerId[peerId] ??= this.createMessageStorage(peerId, 'history');\n }\n\n public getMessagesStorage(key: MessagesStorageKey | MessagesStorage): MessagesStorage {\n if(typeof(key) === 'object') {\n return key;\n } else {\n return this.getMessagesStorageByKey(key);\n }\n }\n\n public getMessageById(messageId: number) {\n for(const peerId in this.messagesStorageByPeerId) {\n if(this.appPeersManager.isChannel(peerId.toPeerId())) {\n continue;\n }\n\n const message = this.messagesStorageByPeerId[peerId].get(messageId);\n if(message) {\n return message;\n }\n }\n\n return this.getMessageFromStorage(null, messageId);\n }\n\n public getMessageByPeer(peerId: PeerId, messageId: number) {\n if(!peerId) {\n return this.getMessageById(messageId);\n }\n\n return this.getMessageFromStorage(this.getHistoryMessagesStorage(peerId), messageId);\n }\n\n public getMessagePeer(message: any): PeerId {\n const toId = message.peer_id && this.appPeersManager.getPeerId(message.peer_id) || NULL_PEER_ID;\n\n return toId;\n }\n\n public getDialogOnly(peerId: PeerId) {\n return this.dialogsStorage.getDialogOnly(peerId);\n }\n\n public cantForwardDeleteMids(storageKey: MessagesStorageKey, mids: number[]) {\n const storage = this.getMessagesStorage(storageKey);\n let cantForward = !mids.length, cantDelete = !mids.length;\n for(const mid of mids) {\n const message = this.getMessageFromStorage(storage, mid);\n if(!cantForward) {\n cantForward = !this.canForward(message);\n }\n\n if(!cantDelete) {\n cantDelete = !this.canDeleteMessage(message);\n }\n\n if(cantForward && cantDelete) break;\n }\n\n return {cantForward, cantDelete};\n }\n\n public reloadConversationOrTopic(peerId: PeerId, threadId?: number) {\n if(threadId) {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n } else {\n this.reloadConversation(peerId);\n }\n }\n\n public reloadConversation(inputPeer?: PeerId | InputPeer): CancellablePromise;\n public reloadConversation(inputPeer: PeerId | InputPeer) {\n let promise: CancellablePromise;\n if(inputPeer !== undefined) {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n this.log.warn('reloadConversation', peerId);\n\n let obj = this.reloadConversationsPeers.get(peerId);\n if(obj) {\n promise = obj.promise;\n }\n\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n this.reloadConversationsPeers.set(peerId, obj = {\n inputDialogPeer: this.appPeersManager.getInputDialogPeerById(inputPeer),\n promise\n });\n }\n\n if(this.reloadConversationsPromise) {\n return promise || this.reloadConversationsPromise;\n }\n\n this.reloadConversationsPromise = pause(0).then(() => {\n const inputDialogPeers: InputDialogPeer[] = [];\n const promises: {[peerId: string]: typeof promise} = {};\n for(const [peerId, {inputDialogPeer, promise}] of this.reloadConversationsPeers) {\n inputDialogPeers.push(inputDialogPeer);\n promises[peerId] = promise;\n }\n\n const fullfillLeft = () => {\n for(const peerId in promises) {\n this.reloadConversationsPeers.delete(+peerId);\n promises[peerId].resolve(undefined);\n }\n };\n\n const invoke = async() => {\n for(;;) {\n const result = await this.apiManager.invokeApi('messages.getPeerDialogs', {peers: inputDialogPeers});\n const currentState = this.apiUpdatesManager.updatesState;\n const {state} = result;\n if(currentState.pts && currentState.pts !== state.pts) {\n await pause(500);\n continue;\n }\n\n return result;\n }\n };\n\n return invoke().then((result) => {\n for(const peerId in promises) {\n this.reloadConversationsPeers.delete(+peerId);\n }\n\n this.dialogsStorage.applyDialogs(result);\n\n result.dialogs.forEach((dialog) => {\n const peerId = dialog.peerId;\n if(peerId) {\n promises[peerId].resolve(dialog as Dialog);\n delete promises[peerId];\n }\n });\n }, noop).then(() => {\n fullfillLeft();\n\n this.reloadConversationsPromise = null;\n if(this.reloadConversationsPeers.size) {\n this.reloadConversation();\n }\n });\n });\n\n return promise || this.reloadConversationsPromise;\n }\n\n private doFlushHistory(peerId: PeerId, just_clear?: boolean, revoke?: boolean, threadId?: number): Promise {\n let promise: Promise;\n const processResult = (affectedHistory: MessagesAffectedHistory) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n return true;\n }\n\n return this.doFlushHistory(peerId, just_clear, revoke, threadId);\n };\n\n if(!threadId) {\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'messages.deleteHistory',\n params: {\n just_clear,\n revoke,\n peer: this.appPeersManager.getInputPeerById(peerId),\n max_id: 0\n },\n processResult\n });\n } else {\n promise = this.apiManager.invokeApiSingleProcess({\n method: 'channels.deleteTopicHistory',\n params: {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n top_msg_id: getServerMessageId(threadId)\n },\n processResult\n });\n }\n\n return promise;\n }\n\n public async flushHistory(peerId: PeerId, justClear?: boolean, revoke?: boolean, threadId?: number) {\n if(this.appPeersManager.isChannel(peerId) && !threadId) {\n const promise = this.getHistory(peerId, 0, 1);\n\n const historyResult = await promise;\n\n const channelId = peerId.toChatId();\n const maxId = historyResult.history[0] || 0;\n return this.apiManager.invokeApiSingle('channels.deleteHistory', {\n channel: this.appChatsManager.getChannelInput(channelId),\n max_id: getServerMessageId(maxId)\n }).then((bool) => {\n if(bool) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateChannelAvailableMessages',\n channel_id: channelId,\n available_min_id: maxId\n });\n }\n\n return bool;\n });\n }\n\n return this.doFlushHistory(peerId, justClear, revoke, threadId).then(() => {\n if(!threadId) {\n this.flushStoragesByPeerId(peerId);\n }\n\n if(justClear) {\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog: this.getDialogOnly(peerId)});\n } else {\n const key = this.getTypingKey(peerId, threadId);\n delete this.notificationsToHandle[key];\n delete this.typings[key];\n\n if(!threadId) {\n const c = this.reloadConversationsPeers.get(peerId);\n if(c) {\n this.reloadConversationsPeers.delete(peerId);\n c.promise.resolve(undefined);\n }\n }\n\n this.dialogsStorage.dropDialogOnDeletion(peerId, threadId);\n }\n });\n }\n\n private flushStoragesByPeerId(peerId: PeerId) {\n [\n this.historiesStorage,\n this.threadsStorage,\n this.searchesStorage,\n this.pendingAfterMsgs,\n this.pendingTopMsgs\n ].forEach((s) => {\n delete s[peerId];\n });\n\n for(const key in this.pinnedMessages) {\n if(+key === peerId || key.startsWith(peerId + '_')) {\n delete this.pinnedMessages[key];\n }\n }\n\n const needSingleMessages = this.needSingleMessages.get(peerId);\n if(needSingleMessages) {\n for(const [mid, promise] of needSingleMessages) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n\n needSingleMessages.clear();\n }\n\n [\n this.messagesStorageByPeerId,\n this.scheduledMessagesStorage\n ].forEach((s) => {\n const ss = s[peerId];\n if(ss) {\n ss.clear();\n }\n });\n\n this.dialogsStorage.flushForumTopicsCache(peerId);\n }\n\n public hidePinnedMessages(peerId: PeerId) {\n return Promise.all([\n this.appStateManager.getState(),\n this.getPinnedMessage(peerId)\n ])\n .then(([state, pinned]) => {\n state.hiddenPinnedMessages[peerId] = pinned.maxId;\n this.rootScope.dispatchEvent('peer_pinned_hidden', {peerId, maxId: pinned.maxId});\n });\n }\n\n public getPinnedMessagesKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n }\n\n public getPinnedMessage(peerId: PeerId, threadId?: number) {\n const p = this.pinnedMessages[this.getPinnedMessagesKey(peerId, threadId)] ??= {};\n if(p.promise) return p.promise;\n else if(p.maxId) return Promise.resolve(p);\n\n return p.promise = this.getSearch({\n peerId,\n inputFilter: {_: 'inputMessagesFilterPinned'},\n maxId: 0,\n limit: 1,\n threadId\n }).then((result) => {\n p.count = result.count;\n p.maxId = result.history[0]?.mid;\n return p;\n }).finally(() => {\n delete p.promise;\n });\n }\n\n public getPinnedMessagesCount(peerId: PeerId, threadId?: number) {\n return this.pinnedMessages[this.getPinnedMessagesKey(peerId, threadId)]?.count;\n }\n\n public getPinnedMessagesMaxId(peerId: PeerId, threadId?: number) {\n return this.pinnedMessages[this.getPinnedMessagesKey(peerId, threadId)]?.maxId;\n }\n\n public updatePinnedMessage(peerId: PeerId, mid: number, unpin?: boolean, silent?: boolean, pm_oneside?: boolean) {\n return this.apiManager.invokeApi('messages.updatePinnedMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n unpin,\n silent,\n pm_oneside,\n id: getServerMessageId(mid)\n }).then((updates) => {\n // this.log('pinned updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public unpinAllMessages(peerId: PeerId): Promise {\n return this.apiManager.invokeApiSingle('messages.unpinAllMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId)\n }).then((affectedHistory) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedHistory.pts,\n pts_count: affectedHistory.pts_count\n }\n });\n\n if(!affectedHistory.offset) {\n const storage = this.getHistoryMessagesStorage(peerId);\n storage.forEach((message) => {\n if((message as Message.message).pFlags.pinned) {\n delete (message as Message.message).pFlags.pinned;\n }\n });\n\n this.rootScope.dispatchEvent('peer_pinned_messages', {peerId, unpinAll: true});\n delete this.pinnedMessages[this.getPinnedMessagesKey(peerId)];\n\n return true;\n }\n\n return this.unpinAllMessages(peerId);\n });\n }\n\n public getAlbumText(grouped_id: string) {\n const group = this.groupedMessagesStorage[grouped_id];\n return getAlbumText(Array.from(group.values()) as Message.message[]);\n }\n\n public getGroupsFirstMessage(message: Message.message) {\n if(!message?.grouped_id) return message;\n\n const storage = this.groupedMessagesStorage[message.grouped_id];\n let minMid = Number.MAX_SAFE_INTEGER;\n for(const [mid, message] of storage) {\n if(message.mid < minMid) {\n minMid = message.mid;\n }\n }\n\n return this.getMessageFromStorage(storage, minMid) as Message.message;\n }\n\n public getMidsByAlbum(groupedId: string, sort: 'asc' | 'desc' = 'asc') {\n return getObjectKeysAndSort(this.groupedMessagesStorage[groupedId], sort);\n }\n\n public getMessagesByAlbum(groupedId: string) {\n const mids = this.getMidsByAlbum(groupedId, 'asc');\n const storage = this.groupedMessagesStorage[groupedId];\n return mids.map((mid) => this.getMessageFromStorage(storage, mid) as Message.message);\n }\n\n public getMidsByMessage(message: Message) {\n if(!message) return [];\n else if((message as Message.message).grouped_id) return this.getMidsByAlbum((message as Message.message).grouped_id);\n else return [message.mid];\n }\n\n public filterMessages(message: MyMessage, verify: (message: MyMessage) => boolean) {\n const out: MyMessage[] = [];\n if((message as Message.message).grouped_id) {\n const storage = this.groupedMessagesStorage[(message as Message.message).grouped_id];\n for(const [mid, message] of storage) {\n if(verify(message)) {\n out.push(message);\n }\n }\n } else {\n if(verify(message)) {\n out.push(message);\n }\n }\n\n return out;\n }\n\n public generateTempMessageId(peerId: PeerId) {\n const dialog = this.getDialogOnly(peerId);\n return this.appMessagesIdsManager.generateTempMessageId(dialog?.top_message || 0);\n }\n\n public setMessageUnreadByDialog(message: MyMessage, dialog: Dialog | ForumTopic = this.getDialogOnly(message.peerId)) {\n if(dialog && message.mid) {\n if(message.mid > dialog[message.pFlags.out ?\n 'read_outbox_max_id' :\n 'read_inbox_max_id']) {\n message.pFlags.unread = true;\n }\n }\n }\n\n public saveMessage(message: Message, options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n // isNew: boolean, // * new - from update\n }> = {}) {\n if(!message || message._ === 'messageEmpty') {\n return;\n }\n\n message.pFlags ??= {};\n\n // * exclude from state\n // defineNotNumerableProperties(message, ['rReply', 'mid', 'savedFrom', 'fwdFromId', 'fromId', 'peerId', 'reply_to_mid', 'viaBotId']);\n\n const peerId = this.getMessagePeer(message);\n const storage = options.storage || this.getHistoryMessagesStorage(peerId);\n const isChannel = message.peer_id._ === 'peerChannel';\n const isBroadcast = isChannel && this.appChatsManager.isBroadcast(peerId.toChatId());\n const isMessage = message._ === 'message';\n\n if(options.isOutgoing) {\n message.pFlags.is_outgoing = true;\n }\n\n const mid = generateMessageId(message.id);\n message.mid = mid;\n\n if(isMessage) {\n if(options.isScheduled) {\n message.pFlags.is_scheduled = true;\n }\n\n if(message.grouped_id) {\n const storage = this.groupedMessagesStorage[message.grouped_id] ??= this.createMessageStorage(peerId, 'grouped');\n storage.set(mid, message);\n }\n\n if(message.via_bot_id) {\n // ! WARNING\n message.viaBotId = message.via_bot_id as any;\n }\n }\n\n // this.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id'])\n\n const replyTo = message.reply_to;\n if(replyTo) {\n if(replyTo.reply_to_msg_id) {\n replyTo.reply_to_msg_id = message.reply_to_mid = generateMessageId(replyTo.reply_to_msg_id);\n }\n\n if(replyTo.reply_to_top_id) {\n replyTo.reply_to_top_id = generateMessageId(replyTo.reply_to_top_id);\n }\n }\n\n const replies = isMessage && message.replies;\n if(replies) {\n if(replies.max_id) replies.max_id = generateMessageId(replies.max_id);\n if(replies.read_max_id) replies.read_max_id = generateMessageId(replies.read_max_id);\n }\n\n const overwriting = !!peerId;\n if(!overwriting) {\n message.date -= this.timeManager.getServerTimeOffset();\n }\n\n // storage.generateIndex(message);\n const myId = this.appPeersManager.peerId;\n\n const fwdHeader = isMessage && (message as Message.message).fwd_from;\n\n message.peerId = peerId;\n if(peerId === myId/* && !message.from_id && !message.fwd_from */) {\n message.fromId = fwdHeader ? (fwdHeader.from_id ? this.appPeersManager.getPeerId(fwdHeader.from_id) : NULL_PEER_ID) : myId;\n } else {\n // message.fromId = message.pFlags.post || (!message.pFlags.out && !message.from_id) ? peerId : appPeersManager.getPeerId(message.from_id);\n message.fromId = message.pFlags.post || !message.from_id ? peerId : this.appPeersManager.getPeerId(message.from_id);\n }\n\n this.setMessageUnreadByDialog(message);\n\n if(fwdHeader) {\n // if(peerId === myID) {\n if(fwdHeader.saved_from_msg_id) fwdHeader.saved_from_msg_id = generateMessageId(fwdHeader.saved_from_msg_id);\n if(fwdHeader.channel_post) fwdHeader.channel_post = generateMessageId(fwdHeader.channel_post);\n\n const peer = fwdHeader.saved_from_peer || fwdHeader.from_id;\n const msgId = fwdHeader.saved_from_msg_id || fwdHeader.channel_post;\n if(peer && msgId) {\n const savedFromPeerId = this.appPeersManager.getPeerId(peer);\n const savedFromMid = generateMessageId(msgId);\n message.savedFrom = savedFromPeerId + '_' + savedFromMid;\n }\n\n /* if(peerId.isAnyChat() || peerId === myID) {\n message.fromId = appPeersManager.getPeerID(!message.from_id || deepEqual(message.from_id, fwdHeader.from_id) ? fwdHeader.from_id : message.from_id);\n } */\n /* } else {\n apiMessage.fwdPostID = fwdHeader.channel_post;\n } */\n\n message.fwdFromId = this.appPeersManager.getPeerId(fwdHeader.from_id);\n\n if(!overwriting) {\n fwdHeader.date -= this.timeManager.getServerTimeOffset();\n }\n }\n\n const mediaContext: ReferenceContext = {\n type: 'message',\n peerId,\n messageId: mid\n };\n\n /* if(isMessage) {\n const entities = message.entities;\n if(entities && entities.find((entity) => entity._ === 'messageEntitySpoiler')) {\n message.media = {_: 'messageMediaUnsupported'};\n }\n } */\n\n let unsupported = false;\n const media = isMessage && message.media;\n if(media) {\n switch(media._) {\n case 'messageMediaEmpty': {\n delete message.media;\n break;\n }\n\n case 'messageMediaPhoto': {\n if(media.ttl_seconds) {\n unsupported = true;\n } else {\n media.photo = this.appPhotosManager.savePhoto(media.photo, mediaContext);\n }\n\n if(!(media as MessageMedia.messageMediaPhoto).photo) { // * found this bug on test DC\n delete message.media;\n }\n\n break;\n }\n\n case 'messageMediaPoll': {\n const result = this.appPollsManager.savePoll(media.poll, media.results, message);\n media.poll = result.poll;\n media.results = result.results;\n break;\n }\n\n case 'messageMediaDocument': {\n if(media.ttl_seconds) {\n unsupported = true;\n } else {\n const originalDoc = media.document;\n media.document = this.appDocsManager.saveDoc(originalDoc, mediaContext); // 11.04.2020 warning\n\n if(!media.document && originalDoc._ !== 'documentEmpty') {\n unsupported = true;\n }\n }\n\n break;\n }\n\n case 'messageMediaWebPage': {\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(peerId, mid, options.isScheduled);\n media.webpage = this.appWebPagesManager.saveWebPage(media.webpage, messageKey, mediaContext);\n\n if(!media.webpage) {\n delete message.media;\n }\n\n break;\n }\n\n /* case 'messageMediaGame':\n AppGamesManager.saveGame(apiMessage.media.game, apiMessage.mid, mediaContext);\n apiMessage.media.handleMessage = true;\n break; */\n\n case 'messageMediaInvoice': {\n media.photo = this.appWebDocsManager.saveWebDocument(media.photo);\n const extendedMedia = media.extended_media;\n if(extendedMedia?._ === 'messageExtendedMedia') {\n const extendedMediaMedia = extendedMedia.media;\n (extendedMediaMedia as MessageMedia.messageMediaPhoto).photo = this.appPhotosManager.savePhoto((extendedMediaMedia as MessageMedia.messageMediaPhoto).photo, mediaContext);\n (extendedMediaMedia as MessageMedia.messageMediaDocument).document = this.appDocsManager.saveDoc((extendedMediaMedia as MessageMedia.messageMediaDocument).document, mediaContext);\n }\n break;\n }\n\n case 'messageMediaUnsupported': {\n unsupported = true;\n break;\n }\n }\n }\n\n // if(isMessage && !unsupported && message.entities) {\n // unsupported = message.entities.some((entity) => entity._ === 'messageEntityCustomEmoji');\n // }\n\n if(isMessage && unsupported) {\n message.media = {_: 'messageMediaUnsupported'};\n message.message = '';\n delete message.entities;\n delete message.totalEntities;\n }\n\n if(!isMessage && message.action) {\n const action = message.action as MessageAction;\n const suffix = message.fromId === this.appUsersManager.getSelf().id ? 'You' : '';\n let migrateFrom: PeerId, migrateTo: PeerId;\n\n if((action as MessageAction.messageActionChatEditPhoto).photo) {\n (action as MessageAction.messageActionChatEditPhoto).photo = this.appPhotosManager.savePhoto((action as MessageAction.messageActionChatEditPhoto).photo, mediaContext);\n }\n\n if((action as any).document) {\n (action as any).document = this.appDocsManager.saveDoc((action as any).photo, mediaContext);\n }\n\n switch(action._) {\n // case 'messageActionChannelEditPhoto':\n case 'messageActionChatEditPhoto':\n // action.photo = appPhotosManager.savePhoto(action.photo, mediaContext);\n if((action.photo as Photo.photo)?.video_sizes) {\n // @ts-ignore\n action._ = isBroadcast ? 'messageActionChannelEditVideo' : 'messageActionChatEditVideo';\n } else {\n if(isBroadcast) { // ! messageActionChannelEditPhoto не существует в принципе, это используется для перевода.\n // @ts-ignore\n action._ = 'messageActionChannelEditPhoto';\n }\n }\n break;\n\n case 'messageActionGroupCall': {\n // assumeType(action);\n\n this.appGroupCallsManager.saveGroupCall(action.call);\n\n let type: string;\n if(action.duration === undefined) {\n type = 'started';\n } else {\n type = 'ended'\n }\n\n if(!isBroadcast) {\n type += '_by' + suffix;\n }\n\n // @ts-ignore\n action.type = type;\n\n break;\n }\n\n case 'messageActionChatEditTitle':\n /* if(options.isNew) {\n const chat = appChatsManager.getChat(peerId.toChatId());\n chat.title = action.title;\n appChatsManager.saveApiChat(chat, true);\n } */\n\n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelEditTitle';\n }\n break;\n\n case 'messageActionChatDeletePhoto':\n if(isBroadcast) {\n // @ts-ignore\n action._ = 'messageActionChannelDeletePhoto';\n }\n break;\n\n case 'messageActionChatAddUser':\n if(action.users.length === 1) {\n // @ts-ignore\n action.user_id = action.users[0];\n // @ts-ignore\n if(message.fromId === action.user_id) {\n if(isChannel) {\n // @ts-ignore\n action._ = 'messageActionChatJoined' + suffix;\n } else {\n // @ts-ignore\n action._ = 'messageActionChatReturn' + suffix;\n }\n }\n } else if(action.users.length > 1) {\n // @ts-ignore\n action._ = 'messageActionChatAddUsers';\n }\n break;\n\n case 'messageActionChatDeleteUser':\n if(message.fromId === action.user_id) {\n // @ts-ignore\n action._ = 'messageActionChatLeave' + suffix;\n }\n break;\n\n case 'messageActionChannelMigrateFrom':\n migrateFrom = action.chat_id.toPeerId(true);\n migrateTo = peerId;\n break\n\n case 'messageActionChatMigrateTo':\n migrateFrom = peerId;\n migrateTo = action.channel_id.toPeerId(true);\n break;\n\n case 'messageActionHistoryClear':\n // apiMessage.deleted = true;\n message.clear_history = true;\n delete message.pFlags.out;\n delete message.pFlags.unread;\n break;\n\n case 'messageActionPhoneCall':\n // @ts-ignore\n action.type =\n (action.pFlags.video ? 'video_' : '') +\n (action.duration !== undefined ? (message.pFlags.out ? 'out_' : 'in_') : '') +\n (\n action.duration !== undefined ? 'ok' : (\n action.reason._ === 'phoneCallDiscardReasonMissed' ?\n 'missed' :\n 'cancelled'\n )\n );\n break;\n }\n\n if(migrateFrom &&\n migrateTo &&\n !this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo]) {\n this.migrateChecks(migrateFrom, migrateTo);\n }\n }\n\n /* if(message.grouped_id) {\n if(!groups) {\n groups = new Set();\n }\n\n groups.add(message.grouped_id);\n } else {\n message.rReply = this.getRichReplyText(message);\n } */\n\n if(isMessage && message.message.length && !message.totalEntities) {\n this.wrapMessageEntities(message);\n }\n\n storage.set(mid, message);\n\n return message;\n }\n\n public saveMessages(messages: any[], options: Partial<{\n storage: MessagesStorage,\n isScheduled: true,\n isOutgoing: true,\n // isNew: boolean, // * new - from update\n }> = {}): (Message.message | Message.messageService)[] {\n if((messages as any).saved) return messages;\n (messages as any).saved = true;\n messages.forEach((message, idx, arr) => {\n arr[idx] = this.saveMessage(message, options);\n });\n\n return messages;\n }\n\n public async getFirstMessageToEdit(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n let goodMessage: Message.message | Message.messageService;\n const myPeerId = this.appPeersManager.peerId;\n for(const mid of slice) {\n const message = this.getMessageByPeer(peerId, mid);\n const good = myPeerId === peerId ? message.fromId === myPeerId : message.pFlags.out;\n\n if(good) {\n if(await this.canEditMessage(message, 'text')) {\n goodMessage = message;\n break;\n }\n\n // * this check will allow editing only last message\n // break;\n }\n }\n\n return goodMessage;\n }\n }\n\n private wrapMessageEntities(message: Message.message) {\n const apiEntities = message.entities ? message.entities.slice() : [];\n message.message = fixEmoji(message.message, apiEntities);\n\n const myEntities = parseEntities(message.message);\n message.totalEntities = mergeEntities(apiEntities, myEntities); // ! only in this order, otherwise bold and emoji formatting won't work\n }\n\n public reportMessages(peerId: PeerId, mids: number[], reason: ReportReason['_'], message?: string) {\n return this.apiManager.invokeApiSingle('messages.report', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n reason: {\n _: reason\n },\n message\n });\n }\n\n public startBot(botId: BotId, chatId?: ChatId, startParam?: string) {\n const peerId = chatId ? chatId.toPeerId(true) : botId.toPeerId();\n if(startParam) {\n const randomId = randomLong();\n\n return this.apiManager.invokeApi('messages.startBot', {\n bot: this.appUsersManager.getUserInput(botId),\n peer: this.appPeersManager.getInputPeerById(peerId),\n random_id: randomId,\n start_param: startParam\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n const str = '/start';\n if(chatId) {\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.appChatsManager.inviteToChannel(chatId, [botId]);\n } else {\n promise = this.appChatsManager.addChatUser(chatId, botId, 0);\n }\n\n return promise.catch((error: ApiError) => {\n if(error?.type == 'USER_ALREADY_PARTICIPANT') {\n error.handled = true;\n return;\n }\n\n throw error;\n }).then(() => {\n return this.sendText(peerId, str + '@' + this.appPeersManager.getPeerUsername(botId.toPeerId()));\n });\n }\n\n return this.sendText(peerId, str);\n }\n\n public editPeerFolders(peerIds: PeerId[], folderId: number) {\n this.apiManager.invokeApi('folders.editPeerFolders', {\n folder_peers: peerIds.map((peerId) => {\n return {\n _: 'inputFolderPeer',\n peer: this.appPeersManager.getInputPeerById(peerId),\n folder_id: folderId\n };\n })\n }).then((updates) => {\n // this.log('editPeerFolders updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates); // WARNING! возможно тут нужно добавлять channelId, и вызывать апдейт для каждого канала отдельно\n });\n }\n\n public getFilter(filterId: number) {\n return this.filtersStorage.getFilter(filterId);\n }\n\n public async toggleDialogPin(options: {\n peerId: PeerId,\n filterId?: number,\n topicId?: number\n }) {\n const {peerId, topicId, filterId = topicId ? peerId : undefined} = options;\n if(filterId === undefined) {\n throw new Error('No filterId');\n }\n\n if(filterId > 1) {\n return this.filtersStorage.toggleDialogPin(peerId, filterId);\n }\n\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, topicId);\n if(!dialog) throw undefined;\n\n const pinned = dialog.pFlags?.pinned ? undefined : true;\n\n if(pinned) {\n const max = await this.apiManager.getLimit(topicId ? 'topicPin' : (filterId === 1 ? 'folderPin' : 'pin'));\n if(this.dialogsStorage.getPinnedOrders(filterId).length >= max) {\n throw makeError(topicId ? 'PINNED_TOO_MUCH' : 'PINNED_DIALOGS_TOO_MUCH');\n }\n }\n\n if(topicId) {\n return this.appChatsManager.updatePinnedForumTopic(peerId.toChatId(), topicId, pinned);\n }\n\n return this.apiManager.invokeApi('messages.toggleDialogPin', {\n peer: this.appPeersManager.getInputDialogPeerById(peerId),\n pinned\n }).then((bool) => {\n const pFlags: Update.updateDialogPinned['pFlags'] = pinned ? {pinned} : {};\n this.apiUpdatesManager.saveUpdate({\n _: 'updateDialogPinned',\n peer: this.appPeersManager.getDialogPeer(peerId),\n folder_id: filterId,\n pFlags\n });\n });\n }\n\n public markDialogUnread(peerId: PeerId, read?: true) {\n const dialog = this.getDialogOnly(peerId);\n if(!dialog) return Promise.reject();\n\n const unread = read || dialog.pFlags?.unread_mark ? undefined : true;\n return this.apiManager.invokeApi('messages.markDialogUnread', {\n peer: this.appPeersManager.getInputDialogPeerById(peerId),\n unread\n }).then((bool) => {\n if(bool) {\n const pFlags: Update.updateDialogUnreadMark['pFlags'] = unread ? {unread} : {};\n this.onUpdateDialogUnreadMark({\n _: 'updateDialogUnreadMark',\n peer: this.appPeersManager.getDialogPeer(peerId),\n pFlags\n });\n }\n });\n }\n\n public migrateChecks(migrateFrom: PeerId, migrateTo: PeerId) {\n if(!this.migratedFromTo[migrateFrom] &&\n !this.migratedToFrom[migrateTo] &&\n this.appChatsManager.hasChat(migrateTo.toChatId())) {\n const fromChat = this.appChatsManager.getChat(migrateFrom.toChatId()) as Chat.chat;\n if(fromChat?.migrated_to && (fromChat.migrated_to as InputChannel.inputChannel).channel_id === migrateTo.toChatId()) {\n this.migratedFromTo[migrateFrom] = migrateTo;\n this.migratedToFrom[migrateTo] = migrateFrom;\n\n this.rootScope.dispatchEvent('dialog_migrate', {migrateFrom, migrateTo});\n\n this.dialogsStorage.dropDialogWithEvent(migrateFrom);\n }\n }\n }\n\n private canMessageBeEdited(message: Message, kind: 'text' | 'poll') {\n if((message as Message.message)?.pFlags?.is_outgoing) {\n return false;\n }\n\n const goodMedias = [\n 'messageMediaPhoto',\n 'messageMediaDocument',\n 'messageMediaWebPage'\n ];\n\n if(kind === 'poll') {\n goodMedias.push('messageMediaPoll');\n }\n\n if(!message ||\n message._ !== 'message' ||\n message.deleted ||\n message.fwd_from ||\n message.via_bot_id ||\n message.media && goodMedias.indexOf(message.media._) === -1 ||\n message.fromId && this.appUsersManager.isBot(message.fromId)) {\n return false;\n }\n\n if(message.media?._ === 'messageMediaDocument' &&\n ((message.media.document as Document.document).sticker || (message.media.document as Document.document).type === 'round')) {\n return false;\n }\n\n return true;\n }\n\n public async canEditMessage(message: Message.message | Message.messageService, kind: 'text' | 'poll' = 'text') {\n if(!message || !this.canMessageBeEdited(message, kind)) {\n return false;\n }\n\n // * second rule for saved messages, because there is no 'out' flag\n if(/* message.pFlags.out || */this.getMessagePeer(message) === this.appUsersManager.getSelf().id) {\n return true;\n }\n\n const canEditMessageInPeer = this.appPeersManager.isBroadcast(message.peerId) ?\n this.appChatsManager.hasRights(message.peerId.toChatId(), 'edit_messages') :\n message.pFlags.out;\n\n if(\n !canEditMessageInPeer || (\n message.peer_id._ !== 'peerChannel' &&\n message.date < (tsNow(true) - (await this.apiManager.getConfig()).edit_time_limit) &&\n (message as Message.message).media?._ !== 'messageMediaPoll'\n )\n ) {\n return false;\n }\n\n return true;\n }\n\n public canDeleteMessage(message: MyMessage) {\n return message && (\n message.peerId.isUser() ||\n message.pFlags.out ||\n this.appChatsManager.getChat(message.peerId.toChatId())._ === 'chat' ||\n this.appChatsManager.hasRights(message.peerId.toChatId(), 'delete_messages')\n ) && (!message.pFlags.is_outgoing || !!message.error);\n }\n\n public getReplyKeyboard(peerId: PeerId) {\n return this.getHistoryStorage(peerId).replyMarkup;\n }\n\n public mergeReplyKeyboard(historyStorage: HistoryStorage, message: Message.messageService | Message.message) {\n // this.log('merge', message.mid, message.reply_markup, historyStorage.reply_markup)\n if(!message) {\n return false;\n }\n\n const messageReplyMarkup = (message as Message.message).reply_markup;\n if(!messageReplyMarkup &&\n !message.pFlags?.out &&\n !(message as Message.messageService).action) {\n return false;\n }\n\n if(messageReplyMarkup?._ === 'replyInlineMarkup') {\n return false;\n }\n\n const lastReplyMarkup = historyStorage.replyMarkup;\n if(messageReplyMarkup) {\n if(lastReplyMarkup && lastReplyMarkup.mid >= message.mid) {\n return false;\n }\n\n if(messageReplyMarkup.pFlags.selective) {\n return false;\n }\n\n if(historyStorage.maxOutId &&\n message.mid < historyStorage.maxOutId &&\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.single_use) {\n (messageReplyMarkup as ReplyMarkup.replyKeyboardMarkup | ReplyMarkup.replyKeyboardForceReply).pFlags.hidden = true;\n }\n\n messageReplyMarkup.mid = message.mid;\n /* messageReplyMarkup = Object.assign({\n mid: message.mid\n }, messageReplyMarkup); */\n\n if(messageReplyMarkup._ !== 'replyKeyboardHide') {\n messageReplyMarkup.fromId = this.appPeersManager.getPeerId(message.from_id);\n }\n\n historyStorage.replyMarkup = messageReplyMarkup;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n if(message.pFlags.out) {\n if(lastReplyMarkup) {\n assumeType(lastReplyMarkup);\n if(lastReplyMarkup.pFlags.single_use &&\n !lastReplyMarkup.pFlags.hidden &&\n (message.mid > lastReplyMarkup.mid || message.pFlags.is_outgoing) &&\n (message as Message.message).message) {\n lastReplyMarkup.pFlags.hidden = true;\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n } else if(!historyStorage.maxOutId ||\n message.mid > historyStorage.maxOutId) {\n historyStorage.maxOutId = message.mid;\n }\n }\n\n assumeType(message);\n if(message.action?._ === 'messageActionChatDeleteUser' &&\n (lastReplyMarkup ?\n message.action.user_id === (lastReplyMarkup as ReplyMarkup.replyKeyboardMarkup).fromId :\n this.appUsersManager.isBot(message.action.user_id)\n )\n ) {\n historyStorage.replyMarkup = {\n _: 'replyKeyboardHide',\n mid: message.mid,\n pFlags: {}\n };\n // this.log('set', historyStorage.reply_markup)\n return true;\n }\n\n return false;\n }\n\n public getSearchStorage(peerId: PeerId, inputFilter: MyInputMessagesFilter) {\n if(!this.searchesStorage[peerId]) this.searchesStorage[peerId] = {};\n if(!this.searchesStorage[peerId][inputFilter]) this.searchesStorage[peerId][inputFilter] = {history: []};\n return this.searchesStorage[peerId][inputFilter];\n }\n\n public getSearchCounters(\n peerId: PeerId,\n filters: MessagesFilter[],\n canCache = true,\n threadId?: number\n ): Promise {\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n return Promise.resolve(filters.map((filter) => {\n return {\n _: 'messages.searchCounter',\n pFlags: {},\n filter: filter,\n count: 0\n };\n }));\n }\n\n const func = (canCache ? this.apiManager.invokeApiCacheable : this.apiManager.invokeApi).bind(this.apiManager);\n return func('messages.getSearchCounters', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n filters,\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n });\n }\n\n public filterMessagesByInputFilterFromStorage(inputFilter: MyInputMessagesFilter, history: number[], storage: MessagesStorage | MessagesStorageKey, limit: number) {\n const _storage = this.getMessagesStorage(storage);\n return filterMessagesByInputFilter(inputFilter, history.map((mid) => _storage.get(mid)), limit);\n }\n\n public getSearch({peerId, query, inputFilter, maxId, limit, nextRate, backLimit, threadId, folderId, minDate, maxDate}: {\n peerId?: PeerId,\n maxId?: number,\n limit?: number,\n nextRate?: number,\n backLimit?: number,\n threadId?: number,\n folderId?: number,\n query?: string,\n inputFilter?: {\n _: MyInputMessagesFilter\n },\n minDate?: number,\n maxDate?: number\n }): Promise<{\n count: number,\n next_rate: number,\n offset_id_offset: number,\n history: MyMessage[]\n }> {\n if(this.appPeersManager.isPeerRestricted(peerId)/* || true */) {\n return Promise.resolve({\n count: 0,\n offset_id_offset: 0,\n next_rate: undefined,\n history: []\n });\n }\n\n if(!query) query = '';\n if(!inputFilter) inputFilter = {_: 'inputMessagesFilterEmpty'};\n if(limit === undefined) limit = 20;\n if(!nextRate) nextRate = 0;\n if(!backLimit) backLimit = 0;\n\n minDate = minDate ? minDate / 1000 | 0 : 0;\n maxDate = maxDate ? maxDate / 1000 | 0 : 0;\n\n let foundMsgs: MyMessage[] = [];\n\n // this.log('search', maxId);\n\n if(backLimit) {\n limit += backLimit;\n }\n\n // const beta = inputFilter._ === 'inputMessagesFilterPinned' && !backLimit;\n const beta = false;\n\n let storage: {\n count?: number;\n history: SlicedArray;\n };\n\n // * костыль для limit 1, если нужно и получить сообщение, и узнать количество сообщений\n if(peerId && !backLimit && !maxId && !query && limit !== 1 && !threadId/* && inputFilter._ !== 'inputMessagesFilterPinned' */) {\n storage = beta ?\n this.getSearchStorage(peerId, inputFilter._) as any :\n this.getHistoryStorage(peerId);\n foundMsgs = this.filterMessagesByInputFilterFromStorage(inputFilter._, storage.history.slice, this.getHistoryMessagesStorage(peerId), limit);\n }\n\n if(foundMsgs.length) {\n if(foundMsgs.length < limit && (beta ? storage.count !== storage.history.length : true)) {\n maxId = foundMsgs[foundMsgs.length - 1].mid;\n limit = limit - foundMsgs.length;\n } else {\n return Promise.resolve({\n count: beta ? storage.count : 0,\n next_rate: 0,\n offset_id_offset: 0,\n history: foundMsgs\n });\n }\n } else if(beta && storage?.count) {\n return Promise.resolve({\n count: storage.count,\n next_rate: 0,\n offset_id_offset: 0,\n history: []\n });\n }\n\n const canCache = false && (['inputMessagesFilterChatPhotos', 'inputMessagesFilterPinned'] as MyInputMessagesFilter[]).includes(inputFilter._);\n const method = (canCache ? this.apiManager.invokeApiCacheable : this.apiManager.invokeApi).bind(this.apiManager);\n\n let apiPromise: Promise;\n if(peerId && !nextRate && folderId === undefined/* || !query */) {\n apiPromise = method('messages.search', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n q: query || '',\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n limit,\n offset_id: getServerMessageId(maxId) || 0,\n add_offset: backLimit ? -backLimit : 0,\n max_id: 0,\n min_id: 0,\n hash: '',\n top_msg_id: getServerMessageId(threadId) || 0\n }, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n });\n } else {\n // var offsetDate = 0;\n let offsetPeerId: PeerId;\n let offsetId = 0;\n const offsetMessage = maxId && this.getMessageByPeer(peerId, maxId);\n\n if(offsetMessage && offsetMessage.date) {\n // offsetDate = offsetMessage.date + timeManager.getServerTimeOffset();\n offsetId = offsetMessage.id;\n offsetPeerId = this.getMessagePeer(offsetMessage);\n }\n\n apiPromise = method('messages.searchGlobal', {\n q: query,\n filter: inputFilter as any as MessagesFilter,\n min_date: minDate,\n max_date: maxDate,\n offset_rate: nextRate,\n offset_peer: this.appPeersManager.getInputPeerById(offsetPeerId),\n offset_id: offsetId,\n limit,\n folder_id: folderId\n }, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n });\n }\n\n return apiPromise.then((searchResult: any) => {\n this.appUsersManager.saveApiUsers(searchResult.users);\n this.appChatsManager.saveApiChats(searchResult.chats);\n this.saveMessages(searchResult.messages);\n\n /* if(beta && storage && (!maxId || storage.history[storage.history.length - 1] === maxId)) {\n const storage = this.getSearchStorage(peerId, inputFilter._);\n const add = (searchResult.messages.map((m: any) => m.mid) as number[]).filter((mid) => storage.history.indexOf(mid) === -1);\n storage.history.push(...add);\n storage.history.sort((a, b) => b - a);\n storage.count = searchResult.count;\n } */\n\n if(DEBUG) {\n this.log('getSearch result:', inputFilter, searchResult);\n }\n\n const foundCount: number = searchResult.count || (foundMsgs.length + searchResult.messages.length);\n\n searchResult.messages.forEach((message: MyMessage) => {\n const peerId = this.getMessagePeer(message);\n if(peerId.isAnyChat()) {\n const chat = this.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n if(chat.migrated_to) {\n this.migrateChecks(peerId, (chat.migrated_to as InputChannel.inputChannel).channel_id.toPeerId(true));\n }\n }\n\n foundMsgs.push(message);\n });\n\n return {\n count: foundCount,\n offset_id_offset: searchResult.offset_id_offset || 0,\n next_rate: searchResult.next_rate,\n history: foundMsgs\n };\n });\n }\n\n public subscribeRepliesThread(peerId: PeerId, mid: number) {\n const repliesKey = peerId + '_' + mid;\n for(const threadKey in this.threadsToReplies) {\n if(this.threadsToReplies[threadKey] === repliesKey) return;\n }\n\n this.getDiscussionMessage(peerId, mid);\n }\n\n public generateThreadServiceStartMessage(message: Message.message | Message.messageService) {\n const threadKey = message.peerId + '_' + message.mid;\n if(this.threadsServiceMessagesIdsStorage[threadKey]) return;\n\n const maxMessageId = getServerMessageId(Math.max(...this.getMidsByMessage(message)));\n const serviceStartMessage: Message.messageService = {\n _: 'messageService',\n pFlags: {\n is_single: true\n },\n id: this.appMessagesIdsManager.generateTempMessageId(maxMessageId),\n date: message.date,\n from_id: {_: 'peerUser', user_id: NULL_PEER_ID}/* message.from_id */,\n peer_id: message.peer_id,\n action: {\n _: 'messageActionDiscussionStarted'\n },\n reply_to: this.generateReplyHeader(message.peerId, message.id)\n };\n\n this.saveMessages([serviceStartMessage], {isOutgoing: true});\n this.threadsServiceMessagesIdsStorage[threadKey] = serviceStartMessage.mid;\n }\n\n public getThreadServiceMessageId(peerId: PeerId, threadId: number) {\n return this.threadsServiceMessagesIdsStorage[peerId + '_' + threadId];\n }\n\n public getDiscussionMessage(peerId: PeerId, mid: number) {\n return this.apiManager.invokeApiSingle('messages.getDiscussionMessage', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((result) => {\n this.appChatsManager.saveApiChats(result.chats);\n this.appUsersManager.saveApiUsers(result.users);\n this.saveMessages(result.messages);\n\n const message = this.getMessageWithReplies(result.messages[0] as Message.message);\n const threadKey = message.peerId + '_' + message.mid;\n\n this.generateThreadServiceStartMessage(message);\n\n const historyStorage = this.getHistoryStorage(message.peerId, message.mid);\n const newMaxId = result.max_id = generateMessageId(result.max_id) || 0;\n result.read_inbox_max_id = historyStorage.readMaxId = generateMessageId(result.read_inbox_max_id ?? message.mid);\n result.read_outbox_max_id = historyStorage.readOutboxMaxId = generateMessageId(result.read_outbox_max_id) || 0;\n\n const first = historyStorage.history.first;\n if(historyStorage.maxId && historyStorage.maxId < newMaxId && first.isEnd(SliceEnd.Bottom)) {\n first.unsetEnd(SliceEnd.Bottom);\n }\n historyStorage.maxId = newMaxId;\n\n this.threadsToReplies[threadKey] = peerId + '_' + mid;\n\n return message;\n });\n }\n\n private handleNewMessage(message: MyMessage) {\n this.rootScope.dispatchEvent('history_multiappend', message);\n }\n\n private handleNewDialogs = () => {\n let newMaxSeenId = 0;\n const updateMap: BroadcastEvents['dialogs_multiupdate']= new Map();\n\n const processDialog = (dialog: MTDialog.dialog | ForumTopic) => {\n const {peerId} = dialog;\n this.dialogsStorage.pushDialog({dialog});\n if(!this.appPeersManager.isChannel(peerId)) {\n newMaxSeenId = Math.max(newMaxSeenId, dialog.top_message || 0);\n }\n\n let cache = updateMap.get(peerId);\n if(!cache) {\n updateMap.set(peerId, cache = {});\n }\n\n if(dialog._ === 'forumTopic') {\n (cache.topics ??= new Map()).set(dialog.id, dialog);\n } else {\n cache.dialog = dialog;\n }\n };\n\n for(const [peerId, obj] of this.newDialogsToHandle) {\n const isDialogDefined = 'dialog' in obj;\n const {dialog, topics} = obj;\n\n if(isDialogDefined) {\n if(!dialog) {\n this.reloadConversation(peerId.toPeerId());\n } else if(this.dialogsStorage.getDialogOnly(peerId)) { // * can be already dropped\n processDialog(dialog);\n }\n }\n\n if(topics) {\n topics?.forEach((topic, id) => {\n if(!topic) {\n this.dialogsStorage.getForumTopicById(peerId, id);\n } else if(this.dialogsStorage.getForumTopic(peerId, id)) { // * can be already dropped\n processDialog(topic);\n }\n });\n }\n }\n\n // this.log('after order:', this.dialogsStorage[0].map((d) => d.peerId));\n\n if(newMaxSeenId !== 0) {\n this.incrementMaxSeenId(newMaxSeenId);\n }\n\n this.rootScope.dispatchEvent('dialogs_multiupdate', updateMap);\n this.newDialogsToHandle.clear();\n };\n\n public scheduleHandleNewDialogs(peerId?: PeerId, dialog?: Dialog | ForumTopic | ForumTopic['id']) {\n if(peerId !== undefined) {\n let obj = this.newDialogsToHandle.get(peerId);\n if(!obj) {\n this.newDialogsToHandle.set(peerId, obj = {});\n }\n\n const isObject = typeof(dialog) === 'object';\n if(!dialog || (isObject && dialog._ === 'dialog')) {\n obj.dialog = dialog as Dialog;\n } else {\n obj.topics ??= new Map();\n if(isObject) {\n obj.topics.set((dialog as ForumTopic).id, dialog as ForumTopic);\n } else {\n obj.topics.set(dialog as number, undefined);\n }\n }\n }\n\n return this.newDialogsHandlePromise ??= pause(0).then(() => {\n this.newDialogsHandlePromise = undefined;\n this.handleNewDialogs();\n });\n }\n\n public async deleteMessages(peerId: PeerId, mids: number[], revoke?: boolean) {\n let promise: Promise;\n\n const config = await this.apiManager.getConfig();\n const overflowMids = mids.splice(config.forwarded_count_max, mids.length - config.forwarded_count_max);\n\n const localMessageIds = mids.map((mid) => getServerMessageId(mid));\n\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n const channel = this.appChatsManager.getChat(channelId) as Chat.channel;\n if(!channel.pFlags.creator && !channel.admin_rights?.pFlags?.delete_messages) {\n mids = mids.filter((mid) => {\n const message = this.getMessageByPeer(peerId, mid);\n return !!message.pFlags.out;\n });\n\n if(!mids.length) {\n return;\n }\n }\n\n promise = this.apiManager.invokeApi('channels.deleteMessages', {\n channel: this.appChatsManager.getChannelInput(channelId),\n id: localMessageIds\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteChannelMessages',\n channel_id: channelId,\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n } else {\n promise = this.apiManager.invokeApi('messages.deleteMessages', {\n revoke,\n id: localMessageIds\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateDeleteMessages',\n messages: mids,\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n });\n });\n }\n\n const promises: (typeof promise)[] = [promise];\n if(overflowMids.length) {\n promises.push(this.deleteMessages(peerId, overflowMids, revoke));\n }\n\n return Promise.all(promises).then(noop);\n }\n\n public readHistory(peerId: PeerId, maxId = 0, threadId?: number, force = false) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n // console.trace('start read')\n this.log('readHistory:', peerId, maxId, threadId);\n const readMaxId = this.getReadMaxIdIfUnread(peerId, threadId);\n if(!readMaxId) {\n if(threadId && !force) {\n const forumTopic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(!getServerMessageId(forumTopic.read_inbox_max_id)) {\n force = true;\n }\n }\n\n if(!force) {\n const dialog = this.appChatsManager.isForum(peerId.toChatId()) && threadId ?\n this.dialogsStorage.getForumTopic(peerId, threadId) :\n this.getDialogOnly(peerId);\n if(dialog && this.isDialogUnread(dialog)) {\n force = true;\n }\n }\n\n if(!force) {\n this.log('readHistory: isn\\'t unread');\n return Promise.resolve();\n }\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(historyStorage.triedToReadMaxId >= maxId) {\n return Promise.resolve();\n }\n\n let apiPromise: Promise;\n if(threadId) {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('messages.readDiscussion', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(threadId),\n read_max_id: getServerMessageId(maxId)\n });\n // apiPromise = new Promise((resolve) => resolve());\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelDiscussionInbox',\n channel_id: peerId.toChatId(),\n top_msg_id: threadId,\n read_max_id: maxId\n });\n } else if(this.appPeersManager.isChannel(peerId)) {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('channels.readHistory', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n max_id: getServerMessageId(maxId)\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadChannelInbox',\n max_id: maxId,\n channel_id: peerId.toChatId(),\n still_unread_count: undefined,\n pts: undefined\n });\n } else {\n if(!historyStorage.readPromise) {\n apiPromise = this.apiManager.invokeApi('messages.readHistory', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n max_id: getServerMessageId(maxId)\n }).then((affectedMessages) => {\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updateShort',\n update: {\n _: 'updatePts',\n pts: affectedMessages.pts,\n pts_count: affectedMessages.pts_count\n }\n });\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateReadHistoryInbox',\n max_id: maxId,\n peer: this.appPeersManager.getOutputPeer(peerId),\n still_unread_count: undefined,\n pts: undefined,\n pts_count: undefined\n });\n }\n\n this.rootScope.dispatchEvent('notification_reset', this.appPeersManager.getPeerString(peerId));\n\n if(historyStorage.readPromise) {\n return historyStorage.readPromise;\n }\n\n historyStorage.triedToReadMaxId = maxId;\n\n apiPromise.finally(() => {\n delete historyStorage.readPromise;\n\n const {readMaxId} = historyStorage;\n this.log('readHistory: promise finally', maxId, readMaxId);\n\n if(readMaxId > maxId) {\n this.readHistory(peerId, readMaxId, threadId, true);\n }\n });\n\n return historyStorage.readPromise = apiPromise;\n }\n\n public readAllHistory(peerId: PeerId, threadId?: number, force = false) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n if(historyStorage.maxId) {\n this.readHistory(peerId, historyStorage.maxId, threadId, force); // lol\n }\n }\n\n private getUnreadMentionsKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? `_${threadId}` : '');\n }\n\n private fixDialogUnreadMentionsIfNoMessage(peerId: PeerId, threadId?: number) {\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, threadId);\n if(dialog?.unread_mentions_count) {\n this.reloadConversationOrTopic(peerId);\n }\n }\n\n private modifyCachedMentions(peerId: PeerId, mid: number, add: boolean, threadId?: number) {\n const slicedArray = this.unreadMentions[this.getUnreadMentionsKey(peerId, threadId)];\n if(!slicedArray) return;\n\n if(add) {\n if(slicedArray.first.isEnd(SliceEnd.Top)) {\n slicedArray.insertSlice([mid]);\n }\n } else {\n slicedArray.delete(mid);\n }\n }\n\n private fixUnreadMentionsCountIfNeeded(peerId: PeerId, slicedArray: SlicedArray, threadId?: number) {\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, threadId);\n if(!slicedArray.length && dialog?.unread_mentions_count) {\n this.reloadConversationOrTopic(peerId);\n }\n }\n\n public goToNextMention(peerId: PeerId, threadId?: number) {\n /* this.getUnreadMentions(peerId, 1, 2, 0).then((messages) => {\n console.log(messages);\n }); */\n\n const key = this.getUnreadMentionsKey(peerId, threadId);\n const promise = this.goToNextMentionPromises[key];\n if(promise) {\n return promise;\n }\n\n const slicedArray = this.unreadMentions[peerId] ??= new SlicedArray();\n const length = slicedArray.length;\n const isTopEnd = slicedArray.first.isEnd(SliceEnd.Top);\n if(!length && isTopEnd) {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray, threadId);\n return Promise.resolve();\n }\n\n let loadNextPromise = Promise.resolve();\n if(!isTopEnd && length < 25) {\n loadNextPromise = this.loadNextMentions(peerId, threadId);\n }\n\n return this.goToNextMentionPromises[key] = loadNextPromise.then(() => {\n const last = slicedArray.last;\n const mid = last && last[last.length - 1];\n if(mid) {\n slicedArray.delete(mid);\n return mid;\n } else {\n this.fixUnreadMentionsCountIfNeeded(peerId, slicedArray, threadId);\n }\n }).finally(() => {\n delete this.goToNextMentionPromises[key];\n });\n }\n\n private loadNextMentions(peerId: PeerId, threadId?: number) {\n const slicedArray = this.unreadMentions[peerId];\n const maxId = slicedArray.first[0] || 1;\n\n const backLimit = 50;\n const add_offset = -backLimit;\n const limit = backLimit;\n return this.getUnreadMentions(peerId, maxId, add_offset, limit, undefined, undefined, threadId)\n .then((messages) => {\n this.mergeHistoryResult(slicedArray, messages, maxId === 1 ? 0 : maxId, limit, add_offset);\n });\n }\n\n private getUnreadMentions(\n peerId: PeerId,\n offsetId: number,\n add_offset: number,\n limit: number,\n maxId = 0,\n minId = 0,\n threadId?: number\n ) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getUnreadMentions',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n offset_id: getServerMessageId(offsetId),\n add_offset,\n limit,\n max_id: getServerMessageId(maxId),\n min_id: getServerMessageId(minId),\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n },\n processResult: (messagesMessages) => {\n assumeType>(messagesMessages);\n this.appUsersManager.saveApiUsers(messagesMessages.users);\n this.appChatsManager.saveApiChats(messagesMessages.chats);\n this.saveMessages(messagesMessages.messages);\n\n return messagesMessages;\n }\n });\n }\n\n public readMessages(peerId: PeerId, msgIds: number[]) {\n if(DO_NOT_READ_HISTORY) {\n return Promise.resolve();\n }\n\n if(!msgIds.length) {\n return Promise.resolve();\n }\n\n msgIds = msgIds.map((mid) => getServerMessageId(mid));\n let promise: Promise, update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents;\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n const channelId = peerId.toChatId();\n\n update = {\n _: 'updateChannelReadMessagesContents',\n channel_id: channelId,\n messages: msgIds\n };\n\n promise = this.apiManager.invokeApi('channels.readMessageContents', {\n channel: this.appChatsManager.getChannelInput(channelId),\n id: msgIds\n });\n } else {\n update = {\n _: 'updateReadMessagesContents',\n messages: msgIds,\n pts: undefined,\n pts_count: undefined\n };\n\n promise = this.apiManager.invokeApi('messages.readMessageContents', {\n id: msgIds\n }).then((affectedMessages) => {\n (update as Update.updateReadMessagesContents).pts = affectedMessages.pts;\n (update as Update.updateReadMessagesContents).pts_count = affectedMessages.pts_count;\n this.apiUpdatesManager.processLocalUpdate(update);\n });\n }\n\n this.apiUpdatesManager.processLocalUpdate(update);\n\n return promise;\n }\n\n public getHistoryStorage(peerId: PeerId, threadId?: number) {\n if(threadId) {\n // threadId = this.getLocalMessageId(threadId);\n return (this.threadsStorage[peerId] ??= {})[threadId] ??= {count: null, history: new SlicedArray()};\n }\n\n return this.historiesStorage[peerId] ??= {count: null, history: new SlicedArray()};\n }\n\n public getHistoryStorageTransferable(peerId: PeerId, threadId?: number) {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const {\n count,\n history,\n maxId,\n readMaxId,\n readOutboxMaxId,\n maxOutId,\n replyMarkup\n } = historyStorage;\n\n return {\n count,\n history: undefined as HistoryStorage,\n historySerialized: history.toJSON(),\n maxId,\n readMaxId,\n readOutboxMaxId,\n maxOutId,\n replyMarkup\n };\n }\n\n private getNotifyPeerSettings(peerId: PeerId, threadId?: number) {\n const inputNotifyPeer = this.appPeersManager.getInputNotifyPeerById({peerId, ignorePeerId: true, threadId});\n return Promise.all([\n this.appNotificationsManager.getNotifyPeerTypeSettings(),\n this.appNotificationsManager.getNotifySettings(inputNotifyPeer)\n ]).then(([_, peerTypeNotifySettings]) => {\n return {\n muted: this.appNotificationsManager.isPeerLocalMuted({peerId, respectType: true, threadId}),\n peerTypeNotifySettings\n };\n });\n }\n\n private handleNotifications = () => {\n ctx.clearTimeout(this.notificationsHandlePromise);\n this.notificationsHandlePromise = undefined;\n\n // var timeout = $rootScope.idle.isIDLE && StatusManager.isOtherDeviceActive() ? 30000 : 1000;\n // const timeout = 1000;\n\n for(const key in this.notificationsToHandle) {\n const [peerId, threadId] = key.split('_');\n // if(rootScope.peerId === peerId && !rootScope.idle.isIDLE) {\n // continue;\n // }\n\n const notifyPeerToHandle = this.notificationsToHandle[key];\n this.getNotifyPeerSettings(peerId.toPeerId(), threadId ? +threadId : undefined)\n .then(({muted, peerTypeNotifySettings}) => {\n const topMessage = notifyPeerToHandle.topMessage;\n if((muted && !topMessage.pFlags.mentioned) || !topMessage.pFlags.unread) {\n return;\n }\n\n // setTimeout(() => {\n if(topMessage.pFlags.unread) {\n this.notifyAboutMessage(topMessage, {\n fwdCount: notifyPeerToHandle.fwdCount,\n peerTypeNotifySettings\n });\n }\n // }, timeout);\n });\n }\n\n this.notificationsToHandle = {};\n };\n\n public getUpdateAfterReloadKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n }\n\n private handleNewUpdateAfterReload(peerId: PeerId, update: Update, threadId?: number) {\n const set = this.newUpdatesAfterReloadToHandle[this.getUpdateAfterReloadKey(peerId, threadId)] ??= new Set();\n if(set.has(update)) {\n this.log.error('here we go again', peerId);\n return;\n }\n\n (update as any).ignoreExisting = true;\n set.add(update);\n this.scheduleHandleNewDialogs(peerId, threadId);\n }\n\n private onUpdateMessageId = (update: Update.updateMessageID) => {\n const randomId = update.random_id;\n const pendingData = this.pendingByRandomId[randomId];\n if(!pendingData) {\n return;\n }\n\n const mid = generateMessageId(update.id);\n this.pendingByMessageId[mid] = randomId;\n // const {storage} = pendingData;\n // const message = this.getMessageFromStorage(storage, mid);\n // if(message) { // if message somehow already exists\n // this.checkPendingMessage(message);\n // }\n };\n\n private onUpdateNewMessage = (update: Update.updateNewDiscussionMessage | Update.updateNewMessage | Update.updateNewChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const storage = this.getHistoryMessagesStorage(peerId);\n\n // * local update\n const isLocalThreadUpdate = update._ === 'updateNewDiscussionMessage';\n\n // * temporary save the message for info (peerId, reply mids...)\n this.saveMessages([message], {storage: this.createMessageStorage(peerId, 'history')});\n\n // * check if sent message is already in storage\n // const oldMessage = this.getMessageFromStorage(storage, message.mid);\n // if(\n // (message as Message.message).pFlags.is_outgoing &&\n // oldMessage &&\n // !(oldMessage as Message.message).pFlags.is_outgoing\n // ) {\n // this.checkPendingMessage(message);\n // return;\n // }\n\n const isForum = this.appPeersManager.isForum(peerId);\n const threadKey = this.getThreadKey(message);\n const threadId = threadKey ? +threadKey.split('_')[1] : undefined;\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, isLocalThreadUpdate ? threadId : undefined);\n\n if((!dialog || this.reloadConversationsPeers.has(peerId)) && !isLocalThreadUpdate) {\n let good = true;\n if(peerId.isAnyChat()) {\n good = this.appChatsManager.isInChat(peerId.toChatId());\n }\n\n if(good) {\n this.handleNewUpdateAfterReload(peerId, update);\n return;\n }\n\n // return;\n }\n\n if(threadId && !isLocalThreadUpdate) {\n const threadStorage = this.threadsStorage[peerId]?.[threadId];\n const update = {\n _: 'updateNewDiscussionMessage',\n message\n } as Update.updateNewDiscussionMessage;\n\n if(this.appChatsManager.isForum(peerId.toChatId()) && !this.dialogsStorage.getForumTopic(peerId, threadId)) {\n // this.dialogsStorage.getForumTopicById(peerId, threadId);\n this.handleNewUpdateAfterReload(peerId, update, threadId);\n } else if(threadStorage) {\n this.onUpdateNewMessage(update);\n }\n }\n\n if(message._ === 'messageService') {\n const {action} = message;\n if(action._ === 'messageActionPaymentSent' && message.reply_to) {\n this.rootScope.dispatchEvent('payment_sent', {\n peerId: message.reply_to.reply_to_peer_id ?\n this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) :\n message.peerId,\n mid: message.reply_to_mid,\n receiptMessage: message\n });\n }\n\n if(action._ === 'messageActionTopicEdit' && !isLocalThreadUpdate) {\n const topic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(!topic) {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n } else {\n const oldTopic = copy(topic);\n\n if(action.title !== undefined) {\n topic.title = action.title;\n }\n\n if(action.closed !== undefined) {\n setBooleanFlag(topic.pFlags, 'closed', action.closed);\n }\n\n if(action.hidden !== undefined) {\n setBooleanFlag(topic.pFlags, 'hidden', action.hidden);\n }\n\n if(action.icon_emoji_id !== undefined) {\n topic.icon_emoji_id = action.icon_emoji_id;\n }\n\n this.scheduleHandleNewDialogs(peerId, topic);\n\n this.dialogsStorage.processTopicUpdate(topic, oldTopic);\n }\n }\n }\n\n /* if(update._ === 'updateNewChannelMessage') {\n const chat = appChatsManager.getChat(peerId.toChatId());\n if(chat.pFlags && (chat.pFlags.left || chat.pFlags.kicked)) {\n return;\n }\n } */\n\n this.saveMessages([message], {storage});\n // this.log.warn(dT(), 'message unread', message.mid, message.pFlags.unread)\n\n /* if((message as Message.message).grouped_id) {\n this.log('updateNewMessage', message);\n } */\n\n this.checkPendingMessage(message);\n const historyStorage = this.getHistoryStorage(peerId, isLocalThreadUpdate ? threadId : undefined);\n\n if(!isLocalThreadUpdate) {\n this.updateMessageRepliesIfNeeded(message);\n }\n\n // * so message can exist if reloadConversation came back earlier with mid\n const ignoreExisting: boolean = (update as any).ignoreExisting;\n const isExisting = !!historyStorage.history.findSlice(message.mid);\n if(isExisting) {\n if(!ignoreExisting) {\n return false;\n }\n } else {\n // * catch situation with disconnect. if message's id is lower than we already have (in bottom end slice), will sort it\n const firstSlice = historyStorage.history.first;\n if(firstSlice.isEnd(SliceEnd.Bottom)) {\n let i = 0;\n for(const length = firstSlice.length; i < length; ++i) {\n if(message.mid > firstSlice[i]) {\n break;\n }\n }\n\n firstSlice.splice(i, 0, message.mid);\n } else {\n historyStorage.history.unshift(message.mid);\n }\n\n if(historyStorage.count !== null) {\n ++historyStorage.count;\n }\n }\n\n if(!historyStorage.maxId || message.mid > historyStorage.maxId) {\n historyStorage.maxId = message.mid;\n }\n\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n\n const fromId = message.fromId;\n if(fromId.isUser() && !message.pFlags.out && message.from_id) {\n this.appUsersManager.forceUserOnline(fromId, message.date);\n\n const action: SendMessageAction = {\n _: 'sendMessageCancelAction'\n };\n\n let update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping;\n if(peerId.isUser()) {\n update = {\n _: 'updateUserTyping',\n action,\n user_id: fromId\n };\n } else if(this.appPeersManager.isChannel(peerId)) {\n update = {\n _: 'updateChannelUserTyping',\n action,\n channel_id: peerId.toChatId(),\n from_id: this.appPeersManager.getOutputPeer(fromId),\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n };\n } else {\n update = {\n _: 'updateChatUserTyping',\n action,\n chat_id: peerId.toChatId(),\n from_id: this.appPeersManager.getOutputPeer(fromId)\n };\n }\n\n this.apiUpdatesManager.processLocalUpdate(update);\n }\n\n // commented to render the message if it's been sent faster than history_append came to main thread\n // if(!pendingMessage) {\n this.handleNewMessage(message);\n // }\n\n const isTopic = dialog?._ === 'forumTopic';\n if((isLocalThreadUpdate && !isTopic) || !dialog) {\n return;\n }\n\n const inboxUnread = !message.pFlags.out && message.pFlags.unread;\n\n {\n if(inboxUnread && message.mid > dialog.top_message) {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n ++dialog.unread_count;\n if(message.pFlags.mentioned) {\n ++dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, true, isTopic ? threadId : undefined);\n }\n\n releaseUnreadCount();\n }\n\n if(message.mid >= dialog.top_message) {\n this.setDialogTopMessage(message, dialog);\n }\n }\n\n if(((!isLocalThreadUpdate && !isForum) || isTopic) && inboxUnread) {\n const notifyPeer = threadKey || peerId;\n const notifyPeerToHandle = this.notificationsToHandle[notifyPeer] ??= {\n fwdCount: 0,\n fromId: NULL_PEER_ID\n };\n\n if(notifyPeerToHandle.fromId !== fromId) {\n notifyPeerToHandle.fromId = fromId;\n notifyPeerToHandle.fwdCount = 0;\n }\n\n if((message as Message.message).fwd_from) {\n ++notifyPeerToHandle.fwdCount;\n }\n\n notifyPeerToHandle.topMessage = message;\n\n this.notificationsHandlePromise ??= ctx.setTimeout(this.handleNotifications, 0);\n }\n };\n\n private onUpdateMessageReactions = (update: Update.updateMessageReactions) => {\n const {peer, msg_id, reactions} = update;\n const mid = generateMessageId(msg_id);\n const peerId = this.appPeersManager.getPeerId(peer);\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n\n if(message?._ !== 'message') {\n return;\n }\n\n const recentReactions = reactions?.recent_reactions;\n if(recentReactions?.length && message.pFlags.out) {\n const recentReaction = recentReactions[recentReactions.length - 1];\n const previousReactions = message.reactions;\n const previousRecentReactions = previousReactions?.recent_reactions;\n if(\n this.appPeersManager.getPeerId(recentReaction.peer_id) !== this.appPeersManager.peerId && (\n !previousRecentReactions ||\n previousRecentReactions.length <= recentReactions.length\n ) && (\n !previousRecentReactions ||\n !deepEqual(recentReaction, previousRecentReactions[previousRecentReactions.length - 1])\n )\n ) {\n this.getNotifyPeerSettings(peerId).then(({muted, peerTypeNotifySettings}) => {\n if(/* muted || */!peerTypeNotifySettings.show_previews) return;\n this.notifyAboutMessage(message, {\n peerReaction: recentReaction,\n peerTypeNotifySettings\n });\n });\n }\n }\n\n const key = message.peerId + '_' + message.mid;\n this.pushBatchUpdate('messages_reactions', this.batchUpdateReactions, key, () => copy(message.reactions));\n\n message.reactions = reactions;\n\n if(!update.local) {\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateDialogUnreadMark = (update: Update.updateDialogUnreadMark) => {\n // this.log('updateDialogUnreadMark', update);\n const peerId = this.appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer);\n const dialog = this.getDialogOnly(peerId);\n\n if(!dialog) {\n this.scheduleHandleNewDialogs(peerId);\n } else {\n const releaseUnreadCount = this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n if(!update.pFlags.unread) {\n delete dialog.pFlags.unread_mark;\n } else {\n dialog.pFlags.unread_mark = true;\n }\n\n releaseUnreadCount();\n this.dialogsStorage.setDialogToState(dialog);\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map([[peerId, {dialog}]]));\n }\n };\n\n private onUpdateEditMessage = (update: Update.updateEditMessage | Update.updateEditChannelMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n const mid = generateMessageId(message.id);\n const storage = this.getHistoryMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n // console.trace(dT(), 'edit message', message)\n\n const oldMessage: Message = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage});\n const newMessage: Message = this.getMessageFromStorage(storage, mid);\n\n this.handleEditedMessage(oldMessage, newMessage, storage);\n\n const dialog = this.getDialogOnly(peerId);\n\n // if sender erased mention\n /* if(dialog.unread_mentions_count && (oldMessage as Message.message)?.pFlags?.mentioned && !message.pFlags.mentioned) {\n --dialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, mid, false);\n } */\n\n const isTopMessage = dialog?.top_message === mid;\n if((message as Message.messageService).clear_history) {\n if(isTopMessage) {\n this.rootScope.dispatchEvent('dialog_flush', {peerId, dialog});\n }\n } else {\n let dispatchEditEvent = true;\n // no sense in dispatching message_edit since only reactions have changed\n if(oldMessage?._ === 'message' && !deepEqual(oldMessage.reactions, (newMessage as Message.message).reactions)) {\n const newReactions = (newMessage as Message.message).reactions;\n (newMessage as Message.message).reactions = oldMessage.reactions;\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: this.appPeersManager.getOutputPeer(peerId),\n msg_id: message.id,\n reactions: newReactions\n });\n\n dispatchEditEvent = false;\n }\n\n dispatchEditEvent && this.rootScope.dispatchEvent('message_edit', {\n storageKey: storage.key,\n peerId,\n mid,\n message\n });\n\n if(isTopMessage) {\n this.dialogsStorage.setDialogToState(dialog);\n }\n\n const map: BroadcastEvents['dialogs_multiupdate'] = new Map();\n const getUpdateCache = () => {\n let cache = map.get(peerId);\n if(!cache) {\n map.set(peerId, cache = {});\n }\n\n return cache;\n };\n\n if((isTopMessage || (message as Message.message).grouped_id) && dialog) {\n getUpdateCache().dialog = dialog;\n }\n\n const threadKey = this.getThreadKey(message);\n if(threadKey) {\n const topicId = +threadKey.split('_')[1];\n const topic = this.dialogsStorage.getForumTopic(peerId, topicId);\n if(topic) {\n (getUpdateCache().topics ??= new Map()).set(topicId, topic);\n }\n }\n\n if(map.size) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', map);\n }\n }\n };\n\n private onUpdateReadHistory = (update: Update.updateReadChannelDiscussionInbox | Update.updateReadChannelDiscussionOutbox\n | Update.updateReadHistoryInbox | Update.updateReadHistoryOutbox\n | Update.updateReadChannelInbox | Update.updateReadChannelOutbox) => {\n const channelId = (update as Update.updateReadChannelInbox).channel_id;\n const maxId = generateMessageId((update as Update.updateReadChannelInbox).max_id || (update as Update.updateReadChannelDiscussionInbox).read_max_id);\n const threadId = generateMessageId((update as Update.updateReadChannelDiscussionInbox).top_msg_id);\n const peerId = channelId ? channelId.toPeerId(true) : this.appPeersManager.getPeerId((update as Update.updateReadHistoryInbox).peer);\n\n const isOut = update._ === 'updateReadHistoryOutbox' ||\n update._ === 'updateReadChannelOutbox' ||\n update._ === 'updateReadChannelDiscussionOutbox' ? true : undefined;\n\n const isForum = channelId ? this.appChatsManager.isForum(channelId) : false;\n const storage = this.getHistoryMessagesStorage(peerId);\n const history = getObjectKeysAndSort(storage, 'desc');\n const foundDialog = threadId && isForum ?\n this.dialogsStorage.getForumTopic(peerId, threadId) :\n this.getDialogOnly(peerId);\n const stillUnreadCount = (update as Update.updateReadChannelInbox).still_unread_count;\n let newUnreadCount = 0;\n let newUnreadMentionsCount = 0;\n let foundAffected = false;\n\n // this.log.warn(dT(), 'read', peerId, isOut ? 'out' : 'in', maxId)\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(peerId.isUser() && isOut) {\n this.appUsersManager.forceUserOnline(peerId.toUserId());\n }\n\n if(threadId) {\n const repliesKey = this.threadsToReplies[peerId + '_' + threadId];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n\n const releaseUnreadCount = foundDialog && this.dialogsStorage.prepareDialogUnreadCountModifying(foundDialog);\n const readMaxId = this.getReadMaxIdIfUnread(peerId, threadId);\n\n for(let i = 0, length = history.length; i < length; i++) {\n const mid = history[i];\n if(mid > maxId) {\n continue;\n }\n\n const message: MyMessage = storage.get(mid);\n\n if(message.pFlags.out !== isOut) {\n continue;\n }\n\n const messageThreadId = getMessageThreadId(message, isForum);\n if(threadId && messageThreadId !== threadId) {\n continue;\n }\n\n const isUnread = message.pFlags.unread || (readMaxId && readMaxId < mid);\n\n if(!isUnread) {\n break;\n }\n\n // this.log.warn('read', messageId, isUnread, message)\n delete message.pFlags.unread;\n foundAffected ||= true;\n\n if(!message.pFlags.out && foundDialog) {\n if(stillUnreadCount === undefined) {\n newUnreadCount = --foundDialog.unread_count;\n }\n\n if(message.pFlags.mentioned) {\n newUnreadMentionsCount = --foundDialog.unread_mentions_count;\n this.modifyCachedMentions(peerId, message.mid, false);\n }\n }\n\n this.rootScope.dispatchEvent('notification_cancel', 'msg' + mid);\n }\n\n if(isOut) historyStorage.readOutboxMaxId = maxId;\n else historyStorage.readMaxId = maxId;\n\n if(foundDialog) {\n if(isOut) foundDialog.read_outbox_max_id = maxId;\n else foundDialog.read_inbox_max_id = maxId;\n\n if(!isOut) {\n let setCount: number;\n if(stillUnreadCount !== undefined) {\n setCount = stillUnreadCount;\n } else if(\n newUnreadCount < 0 ||\n maxId >= foundDialog.top_message ||\n !readMaxId\n ) {\n setCount = 0;\n } else if(newUnreadCount && foundDialog.top_message > maxId) {\n setCount = newUnreadCount;\n }\n\n if(setCount !== undefined) {\n foundDialog.unread_count = setCount;\n }\n\n if(newUnreadMentionsCount < 0 || !foundDialog.unread_count) {\n foundDialog.unread_mentions_count = 0;\n }\n }\n\n releaseUnreadCount?.();\n\n this.dialogsStorage.processDialogForFilters(foundDialog);\n\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog: foundDialog});\n this.dialogsStorage.setDialogToState(foundDialog);\n\n if(!foundAffected && stillUnreadCount === undefined && !isOut && foundDialog.unread_count) {\n if(foundDialog._ === 'forumTopic') {\n this.dialogsStorage.getForumTopicById(peerId, threadId);\n } else {\n this.reloadConversation(peerId);\n }\n }\n }\n\n if(foundAffected) {\n this.rootScope.dispatchEvent('messages_read');\n }\n\n if(!threadId && channelId) {\n const threadKeyPart = peerId + '_';\n for(const threadKey in this.threadsToReplies) {\n if(threadKey.indexOf(threadKeyPart) === 0) {\n const [peerId, mid] = this.threadsToReplies[threadKey].split('_');\n this.rootScope.dispatchEvent('replies_updated', this.getMessageByPeer(peerId.toPeerId(), +mid) as Message.message);\n }\n }\n }\n };\n\n private onUpdateReadMessagesContents = (update: Update.updateChannelReadMessagesContents | Update.updateReadMessagesContents) => {\n const channelId = (update as Update.updateChannelReadMessagesContents).channel_id;\n const topMsgId = (update as Update.updateChannelReadMessagesContents).top_msg_id;\n const threadId = topMsgId ? generateMessageId(topMsgId) : undefined;\n const mids = (update as Update.updateReadMessagesContents).messages.map((id) => generateMessageId(id));\n const peerId = channelId ? channelId.toPeerId(true) : this.findPeerIdByMids(mids);\n for(let i = 0, length = mids.length; i < length; ++i) {\n const mid = mids[i];\n const message: MyMessage = this.getMessageByPeer(peerId, mid);\n if(message) {\n if(message.pFlags.media_unread) {\n delete message.pFlags.media_unread;\n this.setDialogToStateIfMessageIsTop(message);\n\n if(!message.pFlags.out && message.pFlags.mentioned) {\n this.modifyCachedMentions(peerId, mid, false, threadId);\n }\n }\n } else {\n this.fixDialogUnreadMentionsIfNoMessage(peerId, threadId);\n }\n }\n\n this.rootScope.dispatchEvent('messages_media_read', {peerId, mids});\n };\n\n private onUpdateChannelAvailableMessages = (update: Update.updateChannelAvailableMessages) => {\n const peerId = update.channel_id.toPeerId(true);\n const history = this.getHistoryStorage(peerId).history.slice;\n const availableMinId = generateMessageId(update.available_min_id);\n const messages = history.filter((mid) => mid <= availableMinId);\n\n (update as any as Update.updateDeleteChannelMessages).messages = messages;\n this.onUpdateDeleteMessages(update as any as Update.updateDeleteChannelMessages);\n };\n\n private onUpdateDeleteMessages = (update: Update.updateDeleteMessages | Update.updateDeleteChannelMessages) => {\n const channelId = (update as Update.updateDeleteChannelMessages).channel_id;\n // const messages = (update as any as Update.updateDeleteChannelMessages).messages;\n const messages = (update as any as Update.updateDeleteChannelMessages).messages.map((id) => generateMessageId(id));\n const peerId: PeerId = channelId ? channelId.toPeerId(true) : this.findPeerIdByMids(messages);\n\n if(!peerId) {\n return;\n }\n\n this.apiManager.clearCache('messages.getSearchCounters', (params) => {\n return this.appPeersManager.getPeerId(params.peer) === peerId;\n });\n\n const threadKeys: Set = new Set(), topics: Map = new Map();\n for(const mid of messages) {\n const message = this.getMessageByPeer(peerId, mid);\n const threadKey = this.getThreadKey(message);\n if(!threadKey) {\n continue;\n }\n\n const threadId = +threadKey.split('_')[1];\n if(this.threadsStorage[peerId]?.[threadId]) {\n threadKeys.add(threadKey);\n\n if(!topics.has(threadId)) {\n const topic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(topic) {\n topics.set(threadId, topic);\n }\n }\n }\n }\n\n const historyUpdated = this.handleDeletedMessages(\n peerId,\n this.getHistoryMessagesStorage(peerId),\n messages\n );\n\n const threadsStorages = Array.from(threadKeys).map((threadKey) => {\n const [peerId, mid] = threadKey.split('_');\n return this.getHistoryStorage(peerId.toPeerId(), +mid);\n });\n\n const historyStorages = [\n this.getHistoryStorage(peerId),\n ...threadsStorages\n ];\n historyStorages.forEach((historyStorage) => {\n for(const mid of historyUpdated.msgs) {\n historyStorage.history.delete(mid);\n }\n\n if(historyUpdated.count && historyStorage.count) {\n historyStorage.count = Math.max(0, historyStorage.count - historyUpdated.count);\n }\n });\n\n this.rootScope.dispatchEvent('history_delete', {peerId, msgs: historyUpdated.msgs});\n\n const dialogs: (MTDialog.dialog | ForumTopic)[] = [\n ...topics.values()\n ];\n\n const dialog = this.getDialogOnly(peerId);\n if(dialog) {\n dialogs.unshift(dialog);\n }\n\n dialogs.forEach((dialog) => {\n const isTopic = dialog._ === 'forumTopic';\n const affected = historyUpdated.unreadMentions || historyUpdated.unread;\n const releaseUnreadCount = affected && this.dialogsStorage.prepareDialogUnreadCountModifying(dialog);\n\n if(historyUpdated.unread) {\n dialog.unread_count = Math.max(0, dialog.unread_count - historyUpdated.unread);\n }\n\n if(historyUpdated.unreadMentions) {\n dialog.unread_mentions_count = !dialog.unread_count ? 0 : Math.max(0, dialog.unread_mentions_count - historyUpdated.unreadMentions);\n }\n\n if(affected) {\n releaseUnreadCount();\n\n if(!isTopic) {\n this.rootScope.dispatchEvent('dialog_unread', {peerId, dialog});\n }\n }\n\n if(historyUpdated.msgs.has(dialog.top_message)) {\n const historyStorage = this.getHistoryStorage(dialog.peerId, isTopic ? dialog.id : undefined);\n const slice = historyStorage.history.first;\n if(slice.isEnd(SliceEnd.Bottom) && slice.length) {\n const mid = slice[0];\n const message = this.getMessageByPeer(peerId, mid);\n this.setDialogTopMessage(message, dialog);\n } else if(isTopic) {\n this.dialogsStorage.getForumTopicById(peerId, dialog.id);\n } else {\n this.reloadConversation(peerId);\n }\n }\n });\n };\n\n private onUpdateChannel = (update: Update.updateChannel) => {\n const channelId = update.channel_id;\n const peerId = channelId.toPeerId(true);\n const channel = this.appChatsManager.getChat(channelId) as Chat.channel;\n\n const needDialog = this.appChatsManager.isInChat(channelId);\n\n const canViewHistory = !!getPeerActiveUsernames(channel)[0] || !channel.pFlags.left;\n const hasHistory = this.historiesStorage[peerId] !== undefined;\n\n if(canViewHistory !== hasHistory) {\n delete this.historiesStorage[peerId];\n this.rootScope.dispatchEvent('history_forbidden', peerId);\n }\n\n const dialog = this.getDialogOnly(peerId);\n if(!!dialog !== needDialog) {\n if(needDialog) {\n this.reloadConversation(peerId);\n } else {\n this.dialogsStorage.dropDialogOnDeletion(peerId);\n }\n }\n\n this.rootScope.dispatchEvent('channel_update', channelId);\n };\n\n private onUpdateChannelReload = (update: Update.updateChannelReload) => {\n const peerId = update.channel_id.toPeerId(true);\n\n // if(this.appPeersManager.isForum(peerId)) {\n // const cache = this.dialogsStorage.getForumTopicsCache(peerId);\n // if(cache.topics.size) {\n\n // }\n // }\n\n this.flushStoragesByPeerId(peerId);\n Promise.all([\n this.reloadConversation(peerId)\n ]).then(() => {\n this.rootScope.dispatchEvent('history_reload', peerId);\n });\n };\n\n private onUpdateChannelMessageViews = (update: Update.updateChannelMessageViews) => {\n const views = update.views;\n const peerId = update.peerId ?? update.channel_id.toPeerId(true);\n const mid = generateMessageId(update.id);\n const message = this.getMessageByPeer(peerId, mid) as Message.message;\n if(message?.views !== undefined && message.views < views) {\n message.views = views;\n this.pushBatchUpdate('messages_views', this.batchUpdateViews, message.peerId + '_' + message.mid);\n this.setDialogToStateIfMessageIsTop(message);\n }\n };\n\n private onUpdateServiceNotification = (update: Update.updateServiceNotification) => {\n // this.log('updateServiceNotification', update);\n if(update.pFlags?.popup) {\n this.rootScope.dispatchEvent('service_notification', update);\n return;\n }\n\n const fromId = SERVICE_PEER_ID;\n const peerId = fromId;\n const messageId = this.generateTempMessageId(peerId);\n const message: Message.message = {\n _: 'message',\n id: messageId,\n from_id: this.appPeersManager.getOutputPeer(fromId),\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n pFlags: {unread: true},\n date: (update.inbox_date || tsNow(true)) + this.timeManager.getServerTimeOffset(),\n message: update.message,\n media: update.media,\n entities: update.entities\n };\n if(!this.appUsersManager.hasUser(fromId)) {\n this.appUsersManager.saveApiUsers([{\n _: 'user',\n id: fromId,\n pFlags: {verified: true},\n access_hash: '0',\n first_name: 'Telegram',\n phone: '42777'\n }]);\n }\n this.saveMessages([message], {isOutgoing: true});\n\n if(update.inbox_date) {\n this.pendingTopMsgs[peerId] = messageId;\n this.onUpdateNewMessage({\n _: 'updateNewMessage',\n message,\n pts: undefined,\n pts_count: undefined\n });\n }\n };\n\n private onUpdatePinnedMessages = (update: Update.updatePinnedMessages | Update.updatePinnedChannelMessages) => {\n const channelId = update._ === 'updatePinnedChannelMessages' ? update.channel_id : undefined;\n const peerId = channelId ? channelId.toPeerId(true) : this.appPeersManager.getPeerId((update as Update.updatePinnedMessages).peer);\n\n /* const storage = this.getSearchStorage(peerId, 'inputMessagesFilterPinned');\n if(storage.count !== storage.history.length) {\n if(storage.count !== undefined) {\n delete this.searchesStorage[peerId]['inputMessagesFilterPinned'];\n }\n\n rootScope.broadcast('peer_pinned_messages', peerId);\n break;\n } */\n\n const messages = update.messages.map((id) => generateMessageId(id));\n\n const storage = this.getHistoryMessagesStorage(peerId);\n const missingMessages = messages.filter((mid) => !storage.has(mid));\n const getMissingPromise = missingMessages.length ? Promise.all(missingMessages.map((mid) => this.reloadMessages(peerId, mid))) : Promise.resolve();\n getMissingPromise.finally(() => {\n const werePinned = update.pFlags?.pinned;\n if(werePinned) {\n for(const mid of messages) {\n // storage.history.push(mid);\n const message = storage.get(mid) as Message.message;\n message.pFlags.pinned = true;\n }\n\n /* if(this.pinnedMessages[peerId]?.maxId) {\n const maxMid = Math.max(...messages);\n this.pinnedMessages\n } */\n\n // storage.history.sort((a, b) => b - a);\n } else {\n for(const mid of messages) {\n // storage.history.findAndSplice((_mid) => _mid === mid);\n const message = storage.get(mid) as Message.message;\n delete message.pFlags.pinned;\n }\n }\n\n /* const info = this.pinnedMessages[peerId];\n if(info) {\n info.count += messages.length * (werePinned ? 1 : -1);\n } */\n\n delete this.pinnedMessages[this.getPinnedMessagesKey(peerId)];\n this.appStateManager.getState().then((state) => {\n delete state.hiddenPinnedMessages[peerId];\n this.rootScope.dispatchEvent('peer_pinned_messages', {peerId, mids: messages, pinned: werePinned});\n });\n });\n };\n\n private onUpdateNotifySettings = (update: Update.updateNotifySettings) => {\n const {peer, notify_settings} = update;\n const isTopic = peer._ === 'notifyForumTopic';\n const isPeerType = peer._ === 'notifyPeer' || isTopic;\n if(!isPeerType) {\n return;\n }\n\n const peerId = this.appPeersManager.getPeerId(peer.peer);\n const dialog = this.dialogsStorage.getDialogOrTopic(peerId, isTopic ? generateMessageId(peer.top_msg_id) : undefined);\n if(!dialog) {\n return;\n }\n\n dialog.notify_settings = notify_settings;\n this.rootScope.dispatchEvent('dialog_notify_settings', dialog);\n this.dialogsStorage.setDialogToState(dialog);\n };\n\n private onUpdateNewScheduledMessage = (update: Update.updateNewScheduledMessage) => {\n const message = update.message as MyMessage;\n const peerId = this.getMessagePeer(message);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(!storage) {\n return;\n }\n\n const mid = generateMessageId(message.id);\n\n const oldMessage = this.getMessageFromStorage(storage, mid);\n this.saveMessages([message], {storage, isScheduled: true});\n const newMessage = this.getMessageFromStorage(storage, mid);\n\n if(oldMessage) {\n this.handleEditedMessage(oldMessage, newMessage, storage);\n this.rootScope.dispatchEvent('message_edit', {storageKey: storage.key, peerId, mid: message.mid, message});\n } else {\n const pendingMessage = this.checkPendingMessage(message);\n if(!pendingMessage) {\n this.rootScope.dispatchEvent('scheduled_new', message as Message.message);\n }\n }\n };\n\n private onUpdateDeleteScheduledMessages = (update: Update.updateDeleteScheduledMessages) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n\n const storage = this.scheduledMessagesStorage[peerId];\n if(storage) {\n const mids = update.messages.map((id) => generateMessageId(id));\n this.handleDeletedMessages(peerId, storage, mids);\n\n this.rootScope.dispatchEvent('scheduled_delete', {peerId, mids});\n }\n };\n\n private onUpdateMessageExtendedMedia = (update: Update.updateMessageExtendedMedia) => {\n const peerId = this.appPeersManager.getPeerId(update.peer);\n const mid = generateMessageId(update.msg_id);\n const storage = this.getHistoryMessagesStorage(peerId);\n if(!storage.has(mid)) {\n // this.fixDialogUnreadMentionsIfNoMessage(peerId);\n return;\n }\n\n const message = this.getMessageFromStorage(storage, mid) as Message.message;\n const messageMedia = message.media as MessageMedia.messageMediaInvoice;\n if(messageMedia.extended_media?._ === 'messageExtendedMedia') {\n return;\n }\n\n messageMedia.extended_media = update.extended_media;\n this.onUpdateEditMessage({\n _: 'updateEditMessage',\n message,\n pts: 0,\n pts_count: 0\n });\n };\n\n public setDialogToStateIfMessageIsTop(message: MyMessage) {\n if(this.isMessageIsTopMessage(message)) {\n this.dialogsStorage.setDialogToState(this.getDialogOnly(message.peerId));\n }\n }\n\n public isMessageIsTopMessage(message: MyMessage) {\n const dialog = this.getDialogOnly(message.peerId);\n return dialog && dialog.top_message === message.mid;\n }\n\n private updateMessageRepliesIfNeeded(threadMessage: MyMessage) {\n try { // * на всякий случай, скорее всего это не понадобится\n const threadKey = this.getThreadKey(threadMessage);\n if(threadKey) {\n const repliesKey = this.threadsToReplies[threadKey];\n if(repliesKey) {\n const [peerId, mid] = repliesKey.split('_');\n\n this.updateMessage(peerId.toPeerId(), +mid, 'replies_updated');\n }\n }\n } catch(err) {\n this.log.error('incrementMessageReplies err', err, threadMessage);\n }\n }\n\n private getThreadKey(threadMessage: MyMessage) {\n let threadKey = '';\n if(threadMessage?.peerId?.isAnyChat()) {\n const threadId = getMessageThreadId(threadMessage, this.appChatsManager.isForum(threadMessage.peerId.toChatId()));\n if(threadId) {\n threadKey = threadMessage.peerId + '_' + threadId;\n }\n }\n\n return threadKey;\n }\n\n public updateMessage(peerId: PeerId, mid: number, broadcastEventName?: 'replies_updated'): Promise {\n const promise: Promise = this.reloadMessages(peerId, mid, true).then(() => {\n const message = this.getMessageByPeer(peerId, mid) as Message.message;\n if(!message) {\n return;\n }\n\n if(broadcastEventName) {\n this.rootScope.dispatchEvent(broadcastEventName, message);\n }\n\n return message;\n });\n\n return promise;\n }\n\n private checkPendingMessage(message: MyMessage) {\n const randomId = this.pendingByMessageId[message.mid];\n let pendingMessage: ReturnType;\n if(randomId) {\n const pendingData = this.pendingByRandomId[randomId];\n if(pendingMessage = this.finalizePendingMessage(randomId, message)) {\n this.rootScope.dispatchEvent('history_update', {\n storageKey: pendingData.storage.key,\n message,\n sequential: pendingData.sequential\n });\n }\n\n delete this.pendingByMessageId[message.mid];\n }\n\n return pendingMessage;\n }\n\n public mutePeer(options: {peerId: PeerId, muteUntil: number, threadId?: number}) {\n if(!(options = this.appNotificationsManager.validatePeerSettings(options))) {\n return;\n }\n\n const {peerId, muteUntil, threadId} = options;\n const settings: InputPeerNotifySettings = {\n _: 'inputPeerNotifySettings'\n };\n\n settings.mute_until = muteUntil;\n\n const peer = this.appPeersManager.getInputPeerById(peerId);\n return this.appNotificationsManager.updateNotifySettings(threadId ? {\n _: 'inputNotifyForumTopic',\n peer,\n top_msg_id: getServerMessageId(threadId)\n } : {\n _: 'inputNotifyPeer',\n peer\n }, settings);\n }\n\n public togglePeerMute({peerId, mute, threadId}: {peerId: PeerId, mute?: boolean, threadId?: number}) {\n if(mute === undefined) {\n mute = !this.appNotificationsManager.isPeerLocalMuted({peerId, respectType: false, threadId});\n }\n\n return this.mutePeer({peerId, muteUntil: mute ? MUTE_UNTIL : 0, threadId});\n }\n\n private findPeerIdByMids(mids: number[]) {\n for(let length = mids.length, i = length - 1; i >= 0; --i) {\n const mid = mids[i];\n const message = this.getMessageById(mid);\n if(message) {\n return message.peerId;\n }\n }\n }\n\n public canSendToPeer(peerId: PeerId, threadId?: number, action: ChatRights = 'send_messages') {\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n return false;\n }\n\n if(peerId.isAnyChat()) {\n const chatId = peerId.toChatId();\n if(threadId) {\n const topic = this.dialogsStorage.getForumTopic(peerId, threadId);\n if(topic?.pFlags?.closed && !this.appChatsManager.hasRights(chatId, 'manage_topics')) {\n return false;\n }\n }\n\n // const isChannel = appPeersManager.isChannel(peerId);\n const chat = this.appChatsManager.getChat(chatId) as Chat.chat;\n const hasRights = /* isChannel && */this.appChatsManager.hasRights(chatId, action, undefined, !!threadId);\n return /* !isChannel || */hasRights && (!chat.pFlags.left || !!threadId);\n } else {\n return this.appUsersManager.canSendToUser(peerId);\n }\n }\n\n public finalizePendingMessage(randomId: Long, finalMessage: MyMessage) {\n const pendingData = this.pendingByRandomId[randomId];\n if(!pendingData) {\n return;\n }\n\n const {peerId, tempId, threadId, storage} = pendingData;\n\n [\n this.getHistoryStorage(peerId),\n threadId ? this.getHistoryStorage(peerId, threadId) : undefined\n ]\n .filter(Boolean)\n .forEach((storage) => {\n storage.history.delete(tempId);\n });\n\n // this.log('pending', randomID, historyStorage.pending)\n\n const tempMessage: MyMessage = this.getMessageFromStorage(storage, tempId);\n if(tempMessage) {\n delete finalMessage.pFlags.is_outgoing;\n delete finalMessage.pending;\n delete finalMessage.error;\n delete finalMessage.random_id;\n delete finalMessage.send;\n }\n\n this.rootScope.dispatchEvent('messages_pending');\n\n delete this.pendingByRandomId[randomId];\n\n this.finalizePendingMessageCallbacks(storage, tempId, finalMessage);\n\n return tempMessage;\n }\n\n public finalizePendingMessageCallbacks(storage: MessagesStorage, tempId: number, message: MyMessage) {\n const callbacks = this.tempFinalizeCallbacks[tempId];\n // this.log.warn(callbacks, tempId);\n if(callbacks !== undefined) {\n for(const name in callbacks) {\n const {deferred, callback} = callbacks[name];\n // this.log(`finalizePendingMessageCallbacks: will invoke ${name} callback`);\n callback(message).then(deferred.resolve, deferred.reject);\n }\n\n delete this.tempFinalizeCallbacks[tempId];\n }\n\n // set cached url to media\n if((message as Message.message).media) {\n assumeType(message);\n const {photo: newPhoto, document: newDoc} = message.media as any;\n if(newPhoto) {\n const photo = this.appPhotosManager.getPhoto('' + tempId);\n if(/* photo._ !== 'photoEmpty' */photo) {\n const newPhotoSize = newPhoto.sizes[newPhoto.sizes.length - 1];\n const cacheContext = this.thumbsStorage.getCacheContext(newPhoto, newPhotoSize.type);\n const oldCacheContext = this.thumbsStorage.getCacheContext(photo, THUMB_TYPE_FULL);\n Object.assign(cacheContext, oldCacheContext);\n\n const photoSize = newPhoto.sizes[newPhoto.sizes.length - 1] as PhotoSize.photoSize;\n\n const downloadOptions = getPhotoDownloadOptions(newPhoto, photoSize);\n const fileName = getFileNameByLocation(downloadOptions.location);\n // this.appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n } else if(newDoc) {\n const oldDoc = this.appDocsManager.getDoc('' + tempId);\n if(oldDoc) {\n const oldCacheContext = this.thumbsStorage.getCacheContext(oldDoc);\n if(\n /* doc._ !== 'documentEmpty' && */\n oldDoc.type &&\n oldDoc.type !== 'sticker' &&\n oldDoc.mime_type !== 'image/gif' &&\n oldCacheContext.url\n ) {\n const cacheContext = this.thumbsStorage.getCacheContext(newDoc);\n Object.assign(cacheContext, oldCacheContext);\n\n const fileName = getDocumentInputFileName(newDoc);\n // this.appDownloadManager.fakeDownload(fileName, oldCacheContext.url);\n }\n }\n } else if((message.media as MessageMedia.messageMediaPoll).poll) {\n delete this.appPollsManager.polls[tempId];\n delete this.appPollsManager.results[tempId];\n }\n }\n\n const tempMessage = this.getMessageFromStorage(storage, tempId);\n storage.delete(tempId);\n\n if(!(tempMessage as Message.message).reply_markup && (message as Message.message).reply_markup) {\n setTimeout(() => { // TODO: refactor it to normal buttons adding\n if(!this.getMessageFromStorage(storage, message.mid)) {\n return;\n }\n\n this.rootScope.dispatchEvent('message_edit', {storageKey: storage.key, peerId: message.peerId, mid: message.mid, message});\n }, 0);\n }\n\n this.handleReleasingMessage(tempMessage, storage);\n\n this.rootScope.dispatchEvent('message_sent', {storageKey: storage.key, tempId, tempMessage, mid: message.mid, message});\n }\n\n public incrementMaxSeenId(maxId: number) {\n if(!maxId || !(!this.maxSeenId || maxId > this.maxSeenId)) {\n return false;\n }\n\n this.maxSeenId = maxId;\n this.appStateManager.pushToState('maxSeenMsgId', maxId);\n\n this.apiManager.invokeApi('messages.receivedMessages', {\n max_id: getServerMessageId(maxId)\n });\n }\n\n public async getMessageReactionsListAndReadParticipants(\n message: Message.message,\n limit?: number,\n reaction?: Reaction,\n offset?: string,\n skipReadParticipants?: boolean,\n skipReactionsList?: boolean\n ) {\n const emptyMessageReactionsList = {\n reactions: [] as MessagePeerReaction[],\n count: 0,\n next_offset: undefined as string\n };\n\n const canViewMessageReadParticipants = await this.canViewMessageReadParticipants(message);\n if(canViewMessageReadParticipants && limit === undefined) {\n limit = 100;\n } else if(limit === undefined) {\n limit = 50;\n }\n\n return Promise.all([\n canViewMessageReadParticipants && !reaction && !skipReadParticipants ? this.getMessageReadParticipants(message.peerId, message.mid).catch(() => [] as UserId[]) : [] as UserId[],\n\n message.reactions?.recent_reactions?.length && !skipReactionsList ? this.appReactionsManager.getMessageReactionsList(message.peerId, message.mid, limit, reaction, offset).catch((err) => emptyMessageReactionsList) : emptyMessageReactionsList\n ]).then(([userIds, messageReactionsList]) => {\n const readParticipantsPeerIds = userIds.map((userId) => userId.toPeerId());\n\n const filteredReadParticipants = readParticipantsPeerIds.slice();\n forEachReverse(filteredReadParticipants, (peerId, idx, arr) => {\n if(messageReactionsList.reactions.some((reaction) => this.appPeersManager.getPeerId(reaction.peer_id) === peerId)) {\n arr.splice(idx, 1);\n }\n });\n\n let combined: {peerId: PeerId, reaction?: Reaction}[] = messageReactionsList.reactions.map((reaction) => ({peerId: this.appPeersManager.getPeerId(reaction.peer_id), reaction: reaction.reaction}));\n combined = combined.concat(filteredReadParticipants.map((readPeerId) => ({peerId: readPeerId})));\n\n return {\n reactions: messageReactionsList.reactions,\n reactionsCount: messageReactionsList.count,\n readParticipants: readParticipantsPeerIds,\n combined: combined,\n nextOffset: messageReactionsList.next_offset\n };\n });\n }\n\n public getMessageReadParticipants(peerId: PeerId, mid: number): Promise {\n return this.apiManager.invokeApiSingle('messages.getMessageReadParticipants', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((userIds) => { // ! convert long to number\n return userIds.map((userId) => userId.toUserId());\n });\n }\n\n public async canViewMessageReadParticipants(message: Message) {\n if(\n message?._ !== 'message' ||\n message.pFlags.is_outgoing ||\n !message.pFlags.out ||\n !this.appPeersManager.isAnyGroup(message.peerId)\n ) {\n return false;\n }\n\n const chat = this.appChatsManager.getChat(message.peerId.toChatId()) as Chat.chat | Chat.channel;\n const appConfig = await this.apiManager.getAppConfig();\n return chat.participants_count <= appConfig.chat_read_mark_size_threshold &&\n (tsNow(true) - message.date) < appConfig.chat_read_mark_expire_period;\n }\n\n public incrementMessageViews(peerId: PeerId, mids: number[]) {\n if(!mids.length) {\n return;\n }\n\n return this.apiManager.invokeApiSingle('messages.getMessagesViews', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid)),\n increment: true\n }).then((views) => {\n const updates: Update[] = new Array(mids.length);\n for(let i = 0, length = mids.length; i < length; ++i) {\n updates[i] = {\n _: 'updateChannelMessageViews',\n channel_id: NULL_PEER_ID,\n peerId,\n id: mids[i],\n views: views.views[i].views\n };\n }\n\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates,\n chats: views.chats,\n users: views.users\n });\n });\n }\n\n private notifyAboutMessage(message: MyMessage, options: Partial<{\n fwdCount: number,\n peerReaction: MessagePeerReaction,\n peerTypeNotifySettings: PeerNotifySettings\n }> = {}) {\n const peerId = this.getMessagePeer(message);\n\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n return;\n }\n\n const tabs = appTabsManager.getTabs();\n let tab = tabs.find((tab) => {\n const {chatPeerIds} = tab.state;\n return chatPeerIds[chatPeerIds.length - 1] === peerId;\n });\n\n if(!tab) {\n tabs.sort((a, b) => a.state.idleStartTime - b.state.idleStartTime);\n tab = !tabs[0].state.idleStartTime ? tabs[0] : tabs[tabs.length - 1];\n }\n\n const port = MTProtoMessagePort.getInstance();\n port.invokeVoid('notificationBuild', {\n message,\n ...options\n }, tab.source);\n }\n\n public getScheduledMessagesStorage(peerId: PeerId) {\n return this.scheduledMessagesStorage[peerId] ??= this.createMessageStorage(peerId, 'scheduled');\n }\n\n public getScheduledMessageByPeer(peerId: PeerId, mid: number) {\n return this.getMessageFromStorage(this.getScheduledMessagesStorage(peerId), mid);\n }\n\n public getScheduledMessages(peerId: PeerId) {\n if(!this.canSendToPeer(peerId)) return;\n\n const storage = this.getScheduledMessagesStorage(peerId);\n if(storage.size) {\n return [...storage.keys()];\n }\n\n return this.apiManager.invokeApiSingle('messages.getScheduledHistory', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n hash: ''\n }).then((historyResult) => {\n if(historyResult._ !== 'messages.messagesNotModified') {\n this.appUsersManager.saveApiUsers(historyResult.users);\n this.appChatsManager.saveApiChats(historyResult.chats);\n\n const storage = this.getScheduledMessagesStorage(peerId);\n this.saveMessages(historyResult.messages, {storage, isScheduled: true});\n return [...storage.keys()];\n }\n\n return [];\n });\n }\n\n public sendScheduledMessages(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApi('messages.sendScheduledMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public deleteScheduledMessages(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApi('messages.deleteScheduledMessages', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: mids.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getMessageWithReplies(message: Message.message) {\n return this.filterMessages(message, (message) => !!(message as Message.message).replies)[0] as any;\n }\n\n public getMessageWithCommentReplies(message: Message.message) {\n if(message.peerId !== REPLIES_PEER_ID) {\n message = this.getMessageWithReplies(message);\n const replies = message?.replies;\n if(!(replies && replies.pFlags.comments && replies.channel_id.toChatId() !== REPLIES_HIDDEN_CHANNEL_ID)) {\n return;\n }\n }\n\n return message;\n }\n\n public isFetchIntervalNeeded(peerId: PeerId) {\n return peerId.isAnyChat() && (\n !this.appChatsManager.isInChat(peerId.toChatId()) ||\n this.appChatsManager.isForum(peerId.toChatId())\n );\n }\n\n public async getNewHistory(peerId: PeerId, threadId?: number) {\n if(!this.isFetchIntervalNeeded(peerId)) {\n return;\n }\n\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const slice = historyStorage.history.slice;\n if(!slice.isEnd(SliceEnd.Bottom)) {\n return;\n }\n\n delete historyStorage.maxId;\n slice.unsetEnd(SliceEnd.Bottom);\n\n // if there is no id - then request by first id because cannot request by id 0 with backLimit\n const historyResult = await this.getHistory(peerId, slice[0] ?? 1, 0, 50, threadId);\n for(let i = 0, length = historyResult.history.length; i < length; ++i) {\n this.handleNewMessage(this.getMessageByPeer(peerId, historyResult.history[i]));\n }\n\n return {isBottomEnd: historyStorage.history.slice.isEnd(SliceEnd.Bottom)};\n }\n\n /**\n * * https://core.telegram.org/api/offsets, offset_id is inclusive\n */\n // public getHistory(peerId: PeerId, maxId?: number, limit?: number, backLimit?: number, threadId?: number, onlyCache?: false): Promise | HistoryResult;\n // public getHistory(peerId: PeerId, maxId?: number, limit?: number, backLimit?: number, threadId?: number, onlyCache?: true): HistoryResult;\n public getHistory(peerId: PeerId, maxId: number = 0, limit?: number, backLimit?: number, threadId?: number/* , onlyCache?: boolean */): Promise | HistoryResult {\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n\n if(this.appPeersManager.isPeerRestricted(peerId)) {\n const first = historyStorage.history.first;\n first.setEnd(SliceEnd.Both);\n\n const slice = first.slice(0, 0);\n slice.setEnd(SliceEnd.Both);\n\n return {\n count: 0,\n history: Array.from(slice),\n isEnd: slice.getEnds(),\n offsetIdOffset: 0\n };\n }\n\n let offset = 0;\n /*\n let offsetFound = true;\n\n if(maxId) {\n offsetFound = false;\n for(; offset < historyStorage.history.length; offset++) {\n if(maxId > historyStorage.history.slice[offset]) {\n offsetFound = true;\n break;\n }\n }\n }\n\n if(offsetFound && (\n historyStorage.count !== null && historyStorage.history.length === historyStorage.count ||\n historyStorage.history.length >= offset + limit\n )) {\n if(backLimit) {\n backLimit = Math.min(offset, backLimit);\n offset = Math.max(0, offset - backLimit);\n limit += backLimit;\n } else {\n limit = limit;\n }\n\n const history = historyStorage.history.slice.slice(offset, offset + limit);\n return {\n count: historyStorage.count,\n history: history,\n offsetIdOffset: offset\n };\n }\n\n if(offsetFound) {\n offset = 0;\n } */\n\n if(backLimit) {\n offset = -backLimit;\n limit += backLimit;\n\n /* return this.requestHistory(reqPeerId, maxId, limit, offset, undefined, threadId).then((historyResult) => {\n historyStorage.count = (historyResult as MessagesMessages.messagesMessagesSlice).count || historyResult.messages.length;\n\n const history = (historyResult.messages as MyMessage[]).map((message) => message.mid);\n return {\n count: historyStorage.count,\n history,\n offsetIdOffset: (historyResult as MessagesMessages.messagesMessagesSlice).offset_id_offset || 0\n };\n }); */\n }\n\n const haveSlice = historyStorage.history.sliceMe(maxId, offset, limit);\n if(haveSlice && (haveSlice.slice.length === limit || (haveSlice.fulfilled & SliceEnd.Both) === SliceEnd.Both)) {\n return {\n count: historyStorage.count,\n history: Array.from(haveSlice.slice),\n isEnd: haveSlice.slice.getEnds(),\n offsetIdOffset: haveSlice.offsetIdOffset\n };\n }\n\n // if(onlyCache) {\n // return;\n // }\n\n return this.fillHistoryStorage(peerId, maxId, limit, offset, historyStorage, threadId).then(() => {\n const slice = historyStorage.history.sliceMe(maxId, offset, limit);\n const f = slice?.slice || historyStorage.history.constructSlice();\n return {\n count: historyStorage.count,\n history: Array.from(f),\n isEnd: f.getEnds(),\n offsetIdOffset: slice?.offsetIdOffset || historyStorage.count\n };\n });\n }\n\n public isHistoryResultEnd(historyResult: Exclude, limit: number, add_offset: number) {\n const {offset_id_offset, messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n\n const count = (historyResult as MessagesMessages.messagesMessagesSlice).count || messages.length;\n const offsetIdOffset = offset_id_offset || 0;\n\n const topWasMeantToLoad = add_offset < 0 ? limit + add_offset : limit;\n\n const isTopEnd = offsetIdOffset >= (count - topWasMeantToLoad) || count < topWasMeantToLoad;\n const isBottomEnd = !offsetIdOffset || (add_offset < 0 && (offsetIdOffset + add_offset) <= 0);\n\n return {count, offsetIdOffset, isTopEnd, isBottomEnd};\n }\n\n public mergeHistoryResult(\n slicedArray: SlicedArray,\n historyResult: Parameters[0],\n offset_id: number,\n limit: number,\n add_offset: number\n ) {\n const {messages} = historyResult as MessagesMessages.messagesMessagesSlice;\n const isEnd = this.isHistoryResultEnd(historyResult, limit, add_offset);\n const {count, offsetIdOffset, isTopEnd, isBottomEnd} = isEnd;\n const mids = messages.map((message) => {\n return (message as MyMessage).mid;\n });\n\n // * add bound manually.\n // * offset_id will be inclusive only if there is 'add_offset' <= -1 (-1 - will only include the 'offset_id')\n // * check that offset_id is not 0\n if(offset_id && getServerMessageId(offset_id) && !mids.includes(offset_id) && offsetIdOffset < count) {\n let i = 0;\n for(const length = mids.length; i < length; ++i) {\n if(offset_id > mids[i]) {\n break;\n }\n }\n\n mids.splice(i, 0, offset_id);\n }\n\n const slice = slicedArray.insertSlice(mids) || slicedArray.slice;\n if(isTopEnd) {\n slice.setEnd(SliceEnd.Top);\n }\n\n if(isBottomEnd) {\n slice.setEnd(SliceEnd.Bottom);\n }\n\n return {slice, mids, messages, ...isEnd};\n }\n\n public fillHistoryStorage(peerId: PeerId, offset_id: number, limit: number, add_offset: number, historyStorage: HistoryStorage, threadId?: number): Promise {\n const wasMaxId = historyStorage.maxId;\n return this.requestHistory(peerId, offset_id, limit, add_offset, undefined, threadId).then((historyResult) => {\n const {count, isBottomEnd, slice, messages} = this.mergeHistoryResult(historyStorage.history, historyResult, offset_id, limit, add_offset);\n\n historyStorage.count = count;\n\n /* if(!maxId && historyResult.messages.length) {\n maxId = this.incrementMessageId((historyResult.messages[0] as MyMessage).mid, 1);\n }\n\n const wasTotalCount = historyStorage.history.length; */\n\n for(let i = 0, length = messages.length; i < length; ++i) {\n const message = messages[i] as MyMessage;\n if(this.mergeReplyKeyboard(historyStorage, message)) {\n this.rootScope.dispatchEvent('history_reply_markup', {peerId});\n }\n }\n\n if(isBottomEnd) {\n const newMaxId = slice[0];\n\n if(historyStorage.maxId === wasMaxId) {\n const first = historyStorage.history.first;\n if(first !== slice) {\n historyStorage.history.deleteSlice(first);\n }\n\n if(historyStorage.maxId !== newMaxId) {\n historyStorage.maxId = slice[0]; // ! WARNING\n\n this.reloadConversation(peerId); // when top_message is deleted but cached\n }\n }\n }\n\n /* const isBackLimit = offset < 0 && -offset !== fullLimit;\n if(isBackLimit) {\n return;\n }\n\n const totalCount = historyStorage.history.length;\n fullLimit -= (totalCount - wasTotalCount);\n\n const migratedNextPeer = this.migratedFromTo[peerId];\n const migratedPrevPeer = this.migratedToFrom[peerId]\n const isMigrated = migratedNextPeer !== undefined || migratedPrevPeer !== undefined;\n\n if(isMigrated) {\n historyStorage.count = Math.max(historyStorage.count, totalCount) + 1;\n }\n\n if(fullLimit > 0) {\n maxId = historyStorage.history.slice[totalCount - 1];\n if(isMigrated) {\n if(!historyResult.messages.length) {\n if(migratedPrevPeer) {\n maxId = 0;\n peerId = migratedPrevPeer;\n } else {\n historyStorage.count = totalCount;\n return true;\n }\n }\n\n return this.fillHistoryStorage(peerId, maxId, fullLimit, historyStorage, threadId);\n } else if(totalCount < historyStorage.count) {\n return this.fillHistoryStorage(peerId, maxId, fullLimit, offset, historyStorage, threadId);\n }\n } */\n });\n }\n\n public requestHistory(peerId: PeerId, maxId: number, limit = 0, offset = 0, offsetDate = 0, threadId = 0): Promise> {\n // console.trace('requestHistory', peerId, maxId, limit, offset);\n\n // rootScope.broadcast('history_request');\n\n const options: MessagesGetReplies | MessagesGetHistory = {\n peer: this.appPeersManager.getInputPeerById(peerId),\n offset_id: getServerMessageId(maxId) || 0,\n offset_date: offsetDate,\n add_offset: offset,\n limit,\n max_id: 0,\n min_id: 0,\n hash: 0\n };\n\n if(threadId) {\n (options as MessagesGetReplies).msg_id = getServerMessageId(threadId) || 0;\n }\n\n const promise: ReturnType = this.apiManager.invokeApiSingle(threadId ? 'messages.getReplies' : 'messages.getHistory', options, {\n // timeout: APITIMEOUT,\n noErrorBox: true\n }) as any;\n\n return promise.then((historyResult) => {\n if(DEBUG) {\n this.log('requestHistory result:', peerId, historyResult, maxId, limit, offset);\n }\n\n this.appUsersManager.saveApiUsers(historyResult.users);\n this.appChatsManager.saveApiChats(historyResult.chats);\n this.saveMessages(historyResult.messages);\n\n if('pts' in historyResult) {\n this.apiUpdatesManager.addChannelState(peerId.toChatId(), historyResult.pts);\n }\n\n let length = historyResult.messages.length, count = (historyResult as MessagesMessages.messagesMessagesSlice).count;\n if(length && !historyResult.messages[length - 1]) {\n historyResult.messages.splice(length - 1, 1);\n length--;\n count--;\n }\n\n // will load more history if last message is album grouped (because it can be not last item)\n // historyResult.messages: desc sorted\n const historyStorage = this.getHistoryStorage(peerId, threadId);\n const oldestMessage: Message.message = historyResult.messages[length - 1] as any;\n if(length && oldestMessage.grouped_id) {\n const foundSlice = historyStorage.history.findSlice(oldestMessage.mid);\n if(foundSlice && (foundSlice.slice.length + historyResult.messages.length) < count) {\n return this.requestHistory(peerId, oldestMessage.mid, 10, 0, offsetDate, threadId).then((_historyResult) => {\n return historyResult;\n });\n }\n }\n\n return historyResult;\n }, (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n let channel = this.appChatsManager.getChat(peerId.toChatId());\n if(channel._ === 'channel') {\n channel = {\n _: 'channelForbidden',\n id: peerId.toChatId(),\n access_hash: channel.access_hash,\n title: channel.title,\n pFlags: channel.pFlags\n };\n }\n\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: peerId.toChatId()\n }],\n chats: [channel],\n users: []\n });\n break;\n }\n\n throw error;\n });\n }\n\n public fetchSingleMessages() {\n if(this.fetchSingleMessagesPromise) {\n return this.fetchSingleMessagesPromise;\n }\n\n return this.fetchSingleMessagesPromise = pause(0).then(() => {\n const requestPromises: Promise[] = [];\n\n for(const [peerId, map] of this.needSingleMessages) {\n const mids = [...map.keys()];\n const msgIds: InputMessage[] = mids.map((mid) => {\n return {\n _: 'inputMessageID',\n id: getServerMessageId(mid)\n };\n });\n\n let promise: Promise;\n if(peerId.isAnyChat() && this.appPeersManager.isChannel(peerId)) {\n promise = this.apiManager.invokeApiSingle('channels.getMessages', {\n channel: this.appChatsManager.getChannelInput(peerId.toChatId()),\n id: msgIds\n });\n } else {\n promise = this.apiManager.invokeApiSingle('messages.getMessages', {\n id: msgIds\n });\n }\n\n const after = promise.then((getMessagesResult) => {\n assumeType>(getMessagesResult);\n\n this.appUsersManager.saveApiUsers(getMessagesResult.users);\n this.appChatsManager.saveApiChats(getMessagesResult.chats);\n const messages = this.saveMessages(getMessagesResult.messages);\n\n for(let i = 0; i < messages.length; ++i) {\n const message = messages[i];\n if(!message) {\n continue;\n }\n\n const mid = generateMessageId(message.id);\n const promise = map.get(mid);\n promise.resolve(message);\n map.delete(mid);\n }\n\n if(map.size) {\n for(const [mid, promise] of map) {\n promise.resolve(this.generateEmptyMessage(mid));\n }\n }\n }).finally(() => {\n this.rootScope.dispatchEvent('messages_downloaded', {peerId, mids});\n });\n\n requestPromises.push(after);\n }\n\n this.needSingleMessages.clear();\n\n return Promise.all(requestPromises).then(noop, noop).then(() => {\n this.fetchSingleMessagesPromise = undefined;\n if(this.needSingleMessages.size) this.fetchSingleMessages();\n });\n });\n }\n\n public reloadMessages(peerId: PeerId, mid: number, overwrite?: boolean): Promise;\n public reloadMessages(peerId: PeerId, mid: number[], overwrite?: boolean): Promise;\n public reloadMessages(peerId: PeerId, mid: number | number[], overwrite?: boolean): Promise {\n if(Array.isArray(mid)) {\n return Promise.all(mid.map((mid) => {\n return this.reloadMessages(peerId, mid, overwrite);\n }));\n }\n\n const message = this.getMessageByPeer(peerId, mid);\n if(message && !overwrite) {\n this.rootScope.dispatchEvent('messages_downloaded', {peerId, mids: [mid]});\n return Promise.resolve(message);\n } else {\n let map = this.needSingleMessages.get(peerId);\n if(!map) {\n this.needSingleMessages.set(peerId, map = new Map());\n }\n\n let promise = map.get(mid);\n if(promise) {\n return promise;\n }\n\n promise = deferredPromise();\n map.set(mid, promise);\n this.fetchSingleMessages();\n return promise;\n }\n }\n\n public getExtendedMedia(peerId: PeerId, mids: number[]) {\n let map = this.extendedMedia.get(peerId);\n if(!map) {\n this.extendedMedia.set(peerId, map = new Map());\n }\n\n const deferred = deferredPromise();\n const toRequest: number[] = [];\n const promises = mids.map((mid) => {\n let promise = map.get(mid);\n if(!promise) {\n map.set(mid, promise = deferred);\n toRequest.push(mid);\n\n promise.then(() => {\n map.delete(mid);\n if(!map.size && this.extendedMedia.get(peerId) === map) {\n this.extendedMedia.delete(peerId);\n }\n });\n }\n\n return promise;\n });\n\n if(!toRequest.length) {\n deferred.resolve();\n } else {\n this.apiManager.invokeApi('messages.getExtendedMedia', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: toRequest.map((mid) => getServerMessageId(mid))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n deferred.resolve();\n });\n }\n\n return Promise.all(promises);\n }\n\n public fetchMessageReplyTo(message: MyMessage) {\n if(!message.reply_to_mid) return Promise.resolve(this.generateEmptyMessage(0));\n const replyToPeerId = message.reply_to.reply_to_peer_id ? this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId;\n return this.reloadMessages(replyToPeerId, message.reply_to_mid).then((originalMessage) => {\n if(!originalMessage) { // ! break the infinite loop\n message = this.getMessageByPeer(message.peerId, message.mid); // message can come from other thread\n delete message.reply_to_mid; // ! WARNING!\n }\n\n if(message._ === 'messageService') {\n const peerId = message.peerId;\n this.rootScope.dispatchEvent('message_edit', {\n storageKey: `${peerId}_history`,\n peerId: peerId,\n mid: message.mid,\n message\n });\n\n if(this.isMessageIsTopMessage(message)) {\n this.rootScope.dispatchEvent('dialogs_multiupdate', new Map([[peerId, {dialog: this.getDialogOnly(peerId)}]]));\n }\n }\n\n return originalMessage;\n });\n }\n\n private getTypingKey(peerId: PeerId, threadId?: number) {\n return threadId ? `${peerId}_${threadId}` : peerId;\n }\n\n public setTyping(\n peerId: PeerId,\n action: SendMessageAction,\n force?: boolean,\n threadId?: number\n ): Promise {\n if(threadId && !this.appPeersManager.isForum(peerId)) {\n threadId = undefined;\n }\n\n const key = this.getTypingKey(peerId, threadId);\n let typing = this.typings[key];\n if(\n !peerId ||\n !this.canSendToPeer(peerId) ||\n peerId === this.appPeersManager.peerId ||\n // (!force && deepEqual(typing?.action, action))\n (!force && typing?.action?._ === action._)\n ) {\n return Promise.resolve(false);\n }\n\n if(typing?.timeout) {\n clearTimeout(typing.timeout);\n }\n\n typing = this.typings[key] = {\n action\n };\n\n return this.apiManager.invokeApi('messages.setTyping', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n action,\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n }).finally(() => {\n if(typing === this.typings[key]) {\n typing.timeout = ctx.setTimeout(() => {\n delete this.typings[key];\n }, 6000);\n }\n });\n }\n\n private handleReleasingMessage(message: MyMessage, storage: MessagesStorage) {\n const media = (message as Message.message).media;\n if(media) {\n const c = (media as MessageMedia.messageMediaWebPage).webpage as WebPage.webPage || media as MessageMedia.messageMediaPhoto | MessageMedia.messageMediaDocument;\n const smth: Photo.photo | MyDocument = (c as MessageMedia.messageMediaPhoto).photo as any || (c as MessageMedia.messageMediaDocument).document as any;\n\n if(smth?.file_reference) {\n this.referenceDatabase.deleteContext(smth.file_reference, {type: 'message', peerId: message.peerId, messageId: message.mid});\n }\n\n if('webpage' in media && media.webpage) {\n const isScheduled = this.getScheduledMessagesStorage(message.peerId) === storage;\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(message.peerId, message.mid, isScheduled);\n this.appWebPagesManager.deleteWebPageFromPending(media.webpage, messageKey);\n }\n\n if((media as MessageMedia.messageMediaPoll).poll) {\n this.appPollsManager.updatePollToMessage(message as Message.message, false);\n }\n }\n }\n\n private handleDeletedMessages(peerId: PeerId, storage: MessagesStorage, messages: number[]) {\n const history: {\n count: number,\n unread: number,\n unreadMentions: number,\n msgs: Set,\n albums?: {[groupId: string]: Set},\n } = {\n count: 0,\n unread: 0,\n unreadMentions: 0,\n msgs: new Set()\n };\n\n for(const mid of messages) {\n const message: MyMessage = this.getMessageFromStorage(storage, mid);\n if(!message) {\n this.fixDialogUnreadMentionsIfNoMessage(peerId);\n continue;\n }\n\n this.handleReleasingMessage(message, storage);\n\n this.updateMessageRepliesIfNeeded(message);\n\n if(!message.pFlags.out && !message.pFlags.is_outgoing && message.pFlags.unread) {\n ++history.unread;\n this.rootScope.dispatchEvent('notification_cancel', 'msg' + mid);\n\n if(message.pFlags.mentioned) {\n ++history.unreadMentions;\n this.modifyCachedMentions(peerId, mid, false);\n }\n }\n\n ++history.count;\n history.msgs.add(mid);\n\n message.deleted = true;\n\n const groupedId = (message as Message.message).grouped_id;\n if(groupedId) {\n const groupedStorage = this.groupedMessagesStorage[groupedId];\n if(groupedStorage) {\n groupedStorage.delete(mid);\n\n if(!history.albums) history.albums = {};\n (history.albums[groupedId] || (history.albums[groupedId] = new Set())).add(mid);\n\n if(!groupedStorage.size) {\n delete history.albums;\n delete this.groupedMessagesStorage[groupedId];\n }\n }\n }\n\n storage.delete(mid);\n }\n\n if(history.albums) {\n for(const groupedId in history.albums) {\n this.dispatchAlbumEdit(groupedId, storage, [...history.albums[groupedId]]);\n /* const mids = this.getMidsByAlbum(groupId);\n if(mids.length) {\n const mid = Math.max(...mids);\n rootScope.$broadcast('message_edit', {peerId, mid, justMedia: false});\n } */\n }\n }\n\n return history;\n }\n\n private handleEditedMessage(oldMessage: Message, newMessage: Message, storage: MessagesStorage) {\n if(oldMessage._ === 'message') {\n if((oldMessage.media as MessageMedia.messageMediaWebPage)?.webpage) {\n const messageKey = this.appWebPagesManager.getMessageKeyForPendingWebPage(oldMessage.peerId, oldMessage.mid, !!oldMessage.pFlags.is_scheduled);\n this.appWebPagesManager.deleteWebPageFromPending((oldMessage.media as MessageMedia.messageMediaWebPage).webpage, messageKey);\n }\n\n const groupedId = oldMessage.grouped_id;\n if(groupedId) {\n this.dispatchAlbumEdit(groupedId, storage, []);\n }\n }\n }\n\n private dispatchAlbumEdit(groupedId: string, storage: MessagesStorage, deletedMids?: number[]) {\n const mids = this.getMidsByAlbum(groupedId);\n const messages = mids.map((mid) => this.getMessageFromStorage(storage, mid)) as Message.message[];\n this.rootScope.dispatchEvent('album_edit', {peerId: messages[0].peerId, groupId: groupedId, deletedMids: deletedMids || [], messages});\n }\n\n public getDialogUnreadCount(dialog: Dialog | ForumTopic) {\n let unreadCount = dialog.unread_count;\n if(!this.dialogsStorage.isTopic(dialog) && this.appPeersManager.isForum(dialog.peerId)) {\n const forumUnreadCount = this.dialogsStorage.getForumUnreadCount(dialog.peerId);\n if(forumUnreadCount instanceof Promise) {\n unreadCount = 0;\n } else {\n unreadCount = forumUnreadCount.count;\n }\n }\n\n return unreadCount || +!!(dialog as Dialog).pFlags.unread_mark;\n }\n\n public isDialogUnread(dialog: Dialog | ForumTopic) {\n return !!this.getDialogUnreadCount(dialog);\n }\n\n public canForward(message: Message.message | Message.messageService) {\n return message?._ === 'message' && !(message as Message.message).pFlags.noforwards && !this.appPeersManager.noForwards(message.peerId);\n }\n\n private pushBatchUpdate(\n event: E,\n callback: C,\n key: string,\n getElementCallback?: () => MapValueType[0]>\n ) {\n let details = this.batchUpdates[event];\n if(!details) {\n // @ts-ignore\n details = this.batchUpdates[event] = {\n callback,\n batch: new Map()\n };\n }\n\n if(!details.batch.has(key)) {\n // @ts-ignore\n details.batch.set(key, getElementCallback ? getElementCallback() : undefined);\n this.batchUpdatesDebounced();\n }\n }\n\n private getMessagesFromMap>(map: T) {\n const newMap: Map> = new Map();\n for(const [key, value] of map) {\n const [peerIdStr, mid] = key.split('_');\n const message = this.getMessageByPeer(peerIdStr.toPeerId(), +mid) as Message.message;\n if(!message) {\n continue;\n }\n\n newMap.set(message, value);\n }\n\n return newMap;\n }\n\n private batchUpdateViews = (batch: Map) => {\n const toDispatch: {peerId: PeerId, mid: number, views: number}[] = [];\n\n const map = this.getMessagesFromMap(batch);\n for(const [message] of map) {\n toDispatch.push({\n peerId: message.peerId,\n mid: message.mid,\n views: message.views\n })\n }\n\n return toDispatch;\n };\n\n private batchUpdateReactions = (batch: Map) => {\n const toDispatch: {message: Message.message, changedResults: ReactionCount.reactionCount[]}[] = [];\n\n const map = this.getMessagesFromMap(batch);\n for(const [message, previousReactions] of map) {\n const results = message.reactions?.results ?? [];\n const previousResults = previousReactions?.results ?? [];\n const changedResults = results.filter((reactionCount) => {\n const previousReactionCount = previousResults.find((_reactionCount) => reactionsEqual(_reactionCount.reaction, reactionCount.reaction));\n return (\n message.pFlags.out && (\n !previousReactionCount ||\n reactionCount.count > previousReactionCount.count\n )\n ) || (\n reactionCount.chosen_order !== undefined && (\n !previousReactionCount ||\n previousReactionCount.chosen_order === undefined\n )\n );\n });\n\n toDispatch.push({message, changedResults});\n }\n\n return toDispatch;\n };\n\n public saveDefaultSendAs(peerId: PeerId, sendAsPeerId: PeerId) {\n const channelFull = this.appProfileManager.getCachedFullChat(peerId.toChatId()) as ChatFull.channelFull;\n channelFull.default_send_as = this.appPeersManager.getOutputPeer(sendAsPeerId);\n return this.apiManager.invokeApi('messages.saveDefaultSendAs', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n send_as: this.appPeersManager.getInputPeerById(sendAsPeerId)\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getFileNameByLocation} from '../../../../helpers/fileName';\nimport {Document} from '../../../../layer';\nimport getDocumentInputFileLocation from './getDocumentInputFileLocation';\n\nexport default function getDocumentInputFileName(doc: Document.document, thumbSize?: string) {\n return getFileNameByLocation(getDocumentInputFileLocation(doc, thumbSize), {fileName: doc.file_name});\n}\n","export default function convertInputKeyToKey(inputKey: string) {\n const str = inputKey.replace('input', '');\n return (str[0].toLowerCase() + str.slice(1)) as T;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport tsNow from '../../helpers/tsNow';\nimport {InputNotifyPeer, InputPeerNotifySettings, NotifyPeer, PeerNotifySettings, Update} from '../../layer';\nimport {MUTE_UNTIL} from '../mtproto/mtproto_config';\nimport throttle from '../../helpers/schedulers/throttle';\nimport convertInputKeyToKey from '../../helpers/string/convertInputKeyToKey';\nimport {AppManager} from './manager';\nimport ctx from '../../environment/ctx';\nimport assumeType from '../../helpers/assumeType';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\ntype ImSadAboutIt = Promise | PeerNotifySettings;\ntype MyNotifyPeer = Exclude;\ntype MyInputNotifyPeer = Exclude;\nexport class AppNotificationsManager extends AppManager {\n private peerSettings = {\n notifyPeer: {} as {[peerId: string]: ImSadAboutIt},\n notifyUsers: null as ImSadAboutIt,\n notifyChats: null as ImSadAboutIt,\n notifyBroadcasts: null as ImSadAboutIt,\n notifyForumTopic: {} as {[peerId_threadId: string]: ImSadAboutIt}\n };\n // private exceptions: {[peerId: string]: PeerNotifySettings} = {};\n\n private getNotifyPeerTypePromise: Promise;\n\n private checkMuteUntilTimeout: number;\n private checkMuteUntilThrottled: () => void;\n\n private notifyContactsSignUp: Promise;\n\n protected after() {\n this.checkMuteUntilThrottled = throttle(this.checkMuteUntil, 1000, false);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateNotifySettings: (update) => {\n const {peer} = update;\n const isTopic = peer._ === 'notifyForumTopic';\n const isPeerType = peer._ === 'notifyPeer' || isTopic;\n const peerId = isPeerType && this.appPeersManager.getPeerId(peer.peer);\n const key = !isPeerType ? peer._ : undefined;\n this.savePeerSettings({\n key,\n peerId,\n threadId: isTopic ? generateMessageId(peer.top_msg_id) : undefined,\n settings: update.notify_settings\n });\n this.rootScope.dispatchEvent('notify_settings', update);\n }\n });\n\n return this.appStateManager.getState().then((state) => {\n if(state.notifySettings) {\n for(const key in state.notifySettings) {\n assumeType(key);\n this.savePeerSettings({\n key,\n settings: state.notifySettings[key]\n });\n }\n }\n });\n }\n\n public getNotifySettings(peer: InputNotifyPeer): ImSadAboutIt {\n let key: any = convertInputKeyToKey(peer._);\n let obj: any = this.peerSettings[key as MyNotifyPeer];\n\n let peerId: PeerId;\n if(peer._ === 'inputNotifyPeer') {\n peerId = key = this.appPeersManager.getPeerId(peer.peer);\n obj = obj[key];\n }\n\n if(obj) {\n return obj;\n }\n\n return (obj || this.peerSettings)[key] = this.apiManager.invokeApi('account.getNotifySettings', {peer})\n .then((settings) => {\n this.savePeerSettings({\n key,\n peerId,\n settings\n });\n\n return settings;\n });\n }\n\n public getNotifyPeerTypeSettings() {\n if(this.getNotifyPeerTypePromise) return this.getNotifyPeerTypePromise;\n\n const promises = (['inputNotifyBroadcasts', 'inputNotifyUsers', 'inputNotifyChats'] as MyInputNotifyPeer[])\n .map((inputKey) => {\n return this.getNotifySettings({_: inputKey});\n });\n\n return this.getNotifyPeerTypePromise = Promise.all(promises);\n }\n\n public updateNotifySettings(peer: InputNotifyPeer, settings: InputPeerNotifySettings) {\n // this.savePeerSettings(peerId, settings);\n\n /* const inputSettings: InputPeerNotifySettings = copy(settings) as any;\n inputSettings._ = 'inputPeerNotifySettings'; */\n\n return this.apiManager.invokeApi('account.updateNotifySettings', {\n peer,\n settings\n }).then((value) => {\n if(value) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateNotifySettings',\n peer: {\n ...peer as any,\n _: convertInputKeyToKey(peer._)\n },\n notify_settings: { // ! WOW, IT WORKS !\n ...settings,\n _: 'peerNotifySettings'\n }\n });\n }\n });\n }\n\n // public getNotifyExceptions() {\n // apiManager.invokeApi('account.getNotifyExceptions', {compare_sound: true})\n // .then((updates) => {\n // apiUpdatesManager.processUpdateMessage(updates);\n // });\n // }\n\n public getContactSignUpNotification() {\n if(this.notifyContactsSignUp) return this.notifyContactsSignUp;\n return this.notifyContactsSignUp = this.apiManager.invokeApi('account.getContactSignUpNotification');\n }\n\n public setContactSignUpNotification(silent: boolean) {\n this.apiManager.invokeApi('account.setContactSignUpNotification', {silent})\n .then((value) => {\n this.notifyContactsSignUp = Promise.resolve(!silent);\n });\n }\n\n private checkMuteUntil = () => {\n if(this.checkMuteUntilTimeout !== undefined) {\n clearTimeout(this.checkMuteUntilTimeout);\n this.checkMuteUntilTimeout = undefined;\n }\n\n const timestamp = tsNow(true);\n let closestMuteUntil = MUTE_UNTIL;\n\n const p = (peerNotifySettings: ImSadAboutIt): peerNotifySettings is PeerNotifySettings => {\n if(peerNotifySettings instanceof Promise) {\n return false;\n }\n\n const muteUntil = peerNotifySettings.mute_until;\n if(!muteUntil) {\n return false;\n }\n\n if(muteUntil <= timestamp) {\n // ! do not delete it because peer's unique settings will be overwritten in getPeerLocalSettings with type's settings\n peerNotifySettings.mute_until = 0;\n return true;\n } else if(muteUntil < closestMuteUntil) {\n closestMuteUntil = muteUntil;\n }\n\n return false;\n };\n\n [\n 'notifyPeer' as const,\n 'notifyForumTopic' as const\n ].forEach((typeKey) => {\n for(const key in this.peerSettings[typeKey]) {\n const peerNotifySettings = this.peerSettings[typeKey][key];\n if(p(peerNotifySettings)) {\n const [peerId, topicId] = key.split('_');\n const peer = this.appPeersManager.getOutputPeer(peerId.toPeerId());\n this.apiUpdatesManager.saveUpdate({\n _: 'updateNotifySettings',\n peer: topicId ? {\n _: 'notifyForumTopic',\n peer,\n top_msg_id: +topicId\n } : {\n _: 'notifyPeer',\n peer\n },\n notify_settings: peerNotifySettings\n });\n }\n }\n });\n\n const timeout = Math.min(1800e3, (closestMuteUntil - timestamp) * 1000);\n this.checkMuteUntilTimeout = ctx.setTimeout(this.checkMuteUntil, timeout);\n };\n\n public getPeerKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? '_' + threadId : '');\n }\n\n public savePeerSettings({key, peerId, threadId, settings}: {\n key?: Exclude,\n peerId?: PeerId,\n threadId?: number,\n settings: PeerNotifySettings\n }) {\n let obj: any;\n if(peerId) {\n key = this.getPeerKey(peerId, threadId) as any;\n obj = this.peerSettings[threadId ? 'notifyForumTopic' : 'notifyPeer'];\n }\n\n (obj || this.peerSettings)[key] = settings;\n\n if(!peerId) {\n this.rootScope.dispatchEvent('notify_peer_type_settings', {key, settings});\n this.appStateManager.getState().then((state) => {\n const notifySettings = state.notifySettings;\n notifySettings[key] = settings;\n this.appStateManager.pushToState('notifySettings', notifySettings);\n });\n } else {\n this.checkMuteUntilThrottled();\n }\n\n // rootScope.broadcast('notify_settings', {peerId: peerId});\n }\n\n public isMuted(peerNotifySettings: PeerNotifySettings) {\n return peerNotifySettings._ === 'peerNotifySettings' &&\n (peerNotifySettings.silent || (peerNotifySettings.mute_until !== undefined && (peerNotifySettings.mute_until * 1000) > tsNow()));\n }\n\n private getPeerMuted(peerId: PeerId) {\n const ret = this.getNotifySettings({_: 'inputNotifyPeer', peer: this.appPeersManager.getInputPeerById(peerId)});\n return (ret instanceof Promise ? ret : Promise.resolve(ret))\n .then((peerNotifySettings) => this.isMuted(peerNotifySettings));\n }\n\n private getPeerLocalSettings({\n peerId,\n respectType = true,\n threadId\n }: {\n peerId: PeerId,\n respectType?: boolean,\n threadId?: number\n }): PeerNotifySettings {\n const n: PeerNotifySettings = {\n _: 'peerNotifySettings'\n };\n\n const peerKey = this.getPeerKey(peerId, threadId);\n const notifySettings = this.peerSettings[threadId ? 'notifyForumTopic' : 'notifyPeer'][peerKey];\n // if(!notifySettings || (notifySettings instanceof Promise)) return false;\n if(notifySettings && !(notifySettings instanceof Promise)) {\n Object.assign(n, notifySettings);\n }\n\n if(respectType) {\n const inputNotify = this.appPeersManager.getInputNotifyPeerById({peerId, ignorePeerId: true, threadId});\n const key = convertInputKeyToKey(inputNotify._);\n const typeNotifySettings = this.peerSettings[key as MyNotifyPeer];\n if(typeNotifySettings && !(typeNotifySettings instanceof Promise)) {\n for(const i in typeNotifySettings) {\n // @ts-ignore\n if(n[i] === undefined) {\n // @ts-ignore\n n[i] = typeNotifySettings[i];\n }\n }\n }\n }\n\n return n;\n }\n\n public validatePeerSettings[0]>(options: T): T {\n if(options.peerId === this.appPeersManager.peerId) return;\n if(options.threadId && !this.appPeersManager.isForum(options.peerId)) options.threadId = undefined;\n return options;\n }\n\n public isPeerLocalMuted(options: Parameters[0]): boolean {\n if(!(options = this.validatePeerSettings(options))) return false;\n\n if(options.threadId) {\n const notifySettings = this.getPeerLocalSettings({...options, respectType: false});\n if(notifySettings.silent !== undefined || notifySettings.mute_until !== undefined) {\n return this.isMuted(notifySettings);\n } else {\n return this.isPeerLocalMuted({...options, threadId: undefined});\n }\n }\n\n const notifySettings = this.getPeerLocalSettings(options);\n const isMuted = this.isMuted(notifySettings);\n return isMuted;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {Chat, ChatPhoto, DialogPeer, InputChannel, InputDialogPeer, InputNotifyPeer, InputPeer, Peer, Update, User, UserProfilePhoto} from '../../layer';\nimport type {LangPackKey} from '../langPack';\nimport {getRestrictionReason} from '../../helpers/restrictions';\nimport isObject from '../../helpers/object/isObject';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\nimport isUser from './utils/peers/isUser';\nimport isAnyChat from './utils/peers/isAnyChat';\nimport {NULL_PEER_ID} from '../mtproto/mtproto_config';\nimport getPeerActiveUsernames from './utils/peers/getPeerActiveUsernames';\nimport isPeerRestricted from './utils/peers/isPeerRestricted';\nimport getPeerPhoto from './utils/peers/getPeerPhoto';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved';\nexport class AppPeersManager extends AppManager {\n public get peerId() {\n return this.appUsersManager.userId.toPeerId();\n }\n /* public savePeerInstance(peerId: PeerId, instance: any) {\n if(peerId < 0) appChatsManager.saveApiChat(instance);\n else appUsersManager.saveApiUser(instance);\n } */\n\n public canPinMessage(peerId: PeerId) {\n return peerId.isUser() || this.appChatsManager.hasRights(peerId.toChatId(), 'pin_messages');\n }\n\n public getPeerPhoto(peerId: PeerId) {\n const peer = this.getPeer(peerId) as User.user | Chat.channel;\n return getPeerPhoto(peer);\n }\n\n public getPeerMigratedTo(peerId: PeerId) {\n if(peerId.isUser()) {\n return false;\n }\n\n const chat = this.appChatsManager.getChat(peerId.toChatId()) as Chat.chat;\n const migratedTo = chat?.migrated_to;\n if(migratedTo && chat.pFlags.deactivated) {\n return getPeerId(migratedTo);\n }\n\n return false;\n }\n\n public getOutputPeer(peerId: PeerId): Peer {\n if(peerId.isUser()) {\n return {_: 'peerUser', user_id: peerId.toUserId()};\n }\n\n const chatId = peerId.toChatId();\n if(this.appChatsManager.isChannel(chatId)) {\n return {_: 'peerChannel', channel_id: chatId};\n }\n\n return {_: 'peerChat', chat_id: chatId};\n }\n\n public getPeerString(peerId: PeerId) {\n if(peerId.isUser()) {\n return this.appUsersManager.getUserString(peerId.toUserId());\n }\n return this.appChatsManager.getChatString(peerId.toChatId());\n }\n\n public getPeerUsername(peerId: PeerId) {\n return this.getPeerActiveUsernames(peerId)[0] || '';\n }\n\n public getPeerActiveUsernames(peerId: PeerId) {\n const peer = this.getPeer(peerId);\n return getPeerActiveUsernames(peer);\n }\n\n public getPeer(peerId: PeerId) {\n return peerId.isUser() ?\n this.appUsersManager.getUser(peerId.toUserId()) :\n this.appChatsManager.getChat(peerId.toChatId());\n }\n\n public getPeerId(peerId: Parameters[0]) {\n return getPeerId(peerId) || (isObject(peerId) && peerId._ === 'inputPeerSelf' && this.peerId) || NULL_PEER_ID;\n }\n\n public getDialogPeer(peerId: PeerId): DialogPeer {\n return {\n _: 'dialogPeer',\n peer: this.getOutputPeer(peerId)\n };\n }\n\n public isChannel(peerId: PeerId): boolean {\n return !peerId.isUser() && this.appChatsManager.isChannel(peerId.toChatId());\n }\n\n public isMegagroup(peerId: PeerId) {\n return !peerId.isUser() && this.appChatsManager.isMegagroup(peerId.toChatId());\n }\n\n public isForum(peerId: PeerId) {\n return !peerId.isUser() && this.appChatsManager.isForum(peerId.toChatId());\n }\n\n public isAnyGroup(peerId: PeerId): boolean {\n return !peerId.isUser() && !this.appChatsManager.isBroadcast(peerId.toChatId());\n }\n\n public isBroadcast(peerId: PeerId): boolean {\n return this.isChannel(peerId) && !this.isMegagroup(peerId);\n }\n\n public isBot(peerId: PeerId): boolean {\n return peerId.isUser() && this.appUsersManager.isBot(peerId.toUserId());\n }\n\n public isContact(peerId: PeerId): boolean {\n return peerId.isUser() && this.appUsersManager.isContact(peerId.toUserId());\n }\n\n public isUser(peerId: PeerId)/* : peerId is UserId */ {\n return isUser(peerId);\n }\n\n public isAnyChat(peerId: PeerId) {\n return isAnyChat(peerId);\n }\n\n public isPeerRestricted(peerId: PeerId) {\n return isPeerRestricted(this.getPeer(peerId));\n }\n\n public getRestrictionReasonText(peerId: PeerId) {\n const peer = this.getPeer(peerId) as Chat.channel | User.user;\n const reason = peer.restriction_reason ? getRestrictionReason(peer.restriction_reason) : undefined;\n if(reason) {\n return reason.text;\n } else {\n return peerId.isUser() ? 'This user is restricted' : 'This chat is restricted';\n }\n }\n\n /* public getInputPeer(peerString: string): InputPeer {\n var firstChar = peerString.charAt(0);\n var peerParams = peerString.substr(1).split('_');\n let id = +peerParams[0];\n\n if(firstChar === 'u') {\n //appUsersManager.saveUserAccess(id, peerParams[1]);\n\n return {\n _: 'inputPeerUser',\n user_id: id,\n access_hash: peerParams[1]\n };\n } else if(firstChar === 'c' || firstChar === 's') {\n //appChatsManager.saveChannelAccess(id, peerParams[1]);\n if(firstChar === 's') {\n appChatsManager.saveIsMegagroup(id);\n }\n\n return {\n _: 'inputPeerChannel',\n channel_id: id,\n access_hash: peerParams[1] || '0'\n };\n } else {\n return {\n _: 'inputPeerChat',\n chat_id: id\n };\n }\n } */\n\n // public getInputNotifyPeerById(peerId: PeerId, ignorePeerId: true): Exclude;\n // public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: false): InputNotifyPeer.inputNotifyPeer;\n // public getInputNotifyPeerById(peerId: PeerId, ignorePeerId?: boolean): InputNotifyPeer {\n public getInputNotifyPeerById({\n peerId,\n ignorePeerId,\n threadId\n }: T): T['ignorePeerId'] extends true ? Exclude : (T['threadId'] extends number ? InputNotifyPeer.inputNotifyForumTopic : InputNotifyPeer.inputNotifyPeer) {\n if(ignorePeerId) {\n if(peerId.isUser()) {\n return {_: 'inputNotifyUsers'} as any;\n } else {\n if(this.isBroadcast(peerId)) {\n return {_: 'inputNotifyBroadcasts'} as any;\n } else {\n return {_: 'inputNotifyChats'} as any;\n }\n }\n } else if(threadId) {\n return {\n _: 'inputNotifyForumTopic',\n peer: this.getInputPeerById(peerId),\n top_msg_id: getServerMessageId(threadId)\n } as any;\n } else {\n return {\n _: 'inputNotifyPeer',\n peer: this.getInputPeerById(peerId)\n } as any;\n }\n }\n\n public getInputPeerById(peerId: PeerId): InputPeer {\n if(!peerId) {\n return {_: 'inputPeerEmpty'};\n }\n\n if(!peerId.isUser()) {\n const chatId = peerId.toChatId();\n return this.appChatsManager.getInputPeer(chatId);\n }\n\n const userId = peerId.toUserId();\n return this.appUsersManager.getUserInputPeer(userId);\n }\n\n /**\n * ! use it only in safe places like requests\n */\n public getInputPeerSelf(): InputPeer.inputPeerSelf {\n return {_: 'inputPeerSelf'};\n }\n\n public getInputDialogPeerById(peerId: PeerId | InputPeer): InputDialogPeer {\n return {\n _: 'inputDialogPeer',\n peer: isObject(peerId) ? peerId : this.getInputPeerById(peerId)\n };\n }\n\n public getPeerSearchText(peerId: PeerId) {\n let text: string;\n if(this.isUser(peerId)) {\n text = '%pu ' + this.appUsersManager.getUserSearchText(peerId.toUserId());\n } else {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n text = '%pg ' + (chat.title || '');\n }\n\n return text;\n }\n\n public getDialogType(peerId: PeerId): PeerType {\n if(this.isMegagroup(peerId)) {\n return 'megagroup';\n } else if(this.isChannel(peerId)) {\n return 'channel';\n } else if(!this.isUser(peerId)) {\n return 'group';\n } else {\n return peerId === this.peerId ? 'saved' : 'chat';\n }\n }\n\n public getDeleteButtonText(peerId: PeerId): Extract {\n switch(this.getDialogType(peerId)) {\n case 'channel':\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'ChannelDelete' : 'ChatList.Context.LeaveChannel';\n\n case 'megagroup':\n case 'group':\n return this.appChatsManager.hasRights(peerId.toChatId(), 'delete_chat') ? 'DeleteMega' : 'ChatList.Context.LeaveGroup';\n\n default:\n return 'ChatList.Context.DeleteChat';\n }\n }\n\n public noForwards(peerId: PeerId) {\n if(peerId.isUser()) return false;\n else {\n const chat = this.appChatsManager.getChat(peerId.toChatId());\n return !!(chat as Chat.chat).pFlags?.noforwards;\n }\n }\n}\n\nexport type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat';\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Photo, PhotoSize, PhotosPhotos} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceArrayInObject from '../../helpers/object/safeReplaceArrayInObject';\nimport {AppManager} from './manager';\n\nexport type MyPhoto = Photo.photo;\n\n// TIMES = 2 DUE TO SIDEBAR AND CHAT\n// let TEST_FILE_REFERENCE = \"5440692274120994569\", TEST_FILE_REFERENCE_TIMES = 2;\n\nexport class AppPhotosManager extends AppManager {\n private photos: {\n [id: string]: MyPhoto\n } = {};\n\n public savePhoto(photo: Photo, context?: ReferenceContext) {\n if(!photo || photo._ === 'photoEmpty') return;\n\n /* if(photo.id === TEST_FILE_REFERENCE) {\n console.warn('Testing FILE_REFERENCE_EXPIRED');\n const bytes = [2, 67, 175, 43, 190, 0, 0, 20, 62, 95, 111, 33, 45, 99, 220, 116, 218, 11, 167, 127, 213, 18, 127, 32, 243, 202, 117, 80, 30];\n //photo.file_reference = new Uint8Array(bytes);\n photo.file_reference = bytes;\n if(!--TEST_FILE_REFERENCE_TIMES) {\n TEST_FILE_REFERENCE = '';\n }\n } */\n\n const oldPhoto = this.photos[photo.id];\n if(photo.file_reference) { // * because we can have a new object w/o the file_reference while sending\n safeReplaceArrayInObject('file_reference', oldPhoto, photo);\n this.referenceDatabase.saveContext(photo.file_reference, context);\n }\n\n if(photo.sizes?.length) {\n // * sometimes photoStrippedSize can be the last item\n photo.sizes.sort((a, b) => {\n return ((a as PhotoSize.photoSize).size || ((a as PhotoSize.photoSizeProgressive).sizes ? Infinity : 0)) - ((b as PhotoSize.photoSize).size || ((b as PhotoSize.photoSizeProgressive).sizes ? Infinity : 0));\n });\n\n const size = photo.sizes[photo.sizes.length - 1];\n if(size._ === 'photoSizeProgressive') {\n size.size = size.sizes[size.sizes.length - 1];\n }\n }\n\n if(oldPhoto) {\n return Object.assign(oldPhoto, photo);\n }\n\n return this.photos[photo.id] = photo;\n }\n\n public getUserPhotos(userId: UserId, maxId: Photo.photo['id'] = '0', limit: number = 20) {\n const inputUser = this.appUsersManager.getUserInput(userId);\n return this.apiManager.invokeApiCacheable('photos.getUserPhotos', {\n user_id: inputUser,\n offset: 0,\n limit,\n max_id: maxId\n }, {cacheSeconds: 60}).then((photosResult) => {\n this.appUsersManager.saveApiUsers(photosResult.users);\n const photoIds = photosResult.photos.map((photo, idx) => {\n photosResult.photos[idx] = this.savePhoto(photo, {type: 'profilePhoto', peerId: userId.toPeerId()});\n return photo.id;\n });\n\n // ! WARNING !\n if(maxId !== '0' && maxId) {\n const idx = photoIds.indexOf(maxId);\n if(idx !== -1) {\n photoIds.splice(idx, 1);\n }\n }\n\n return {\n count: (photosResult as PhotosPhotos.photosPhotosSlice).count || photoIds.length,\n photos: photoIds\n };\n });\n }\n\n /* public getPhotoURL(photo: MTPhoto | MTMyDocument, photoSize: MTPhotoSize) {\n const downloadOptions = this.getPhotoDownloadOptions(photo, photoSize);\n\n return {url: getFileURL('photo', downloadOptions), location: downloadOptions.location};\n } */\n\n /* public isDownloaded(media: any) {\n const isPhoto = media._ === 'photo';\n const photo = isPhoto ? this.getPhoto(media.id) : null;\n let isDownloaded: boolean;\n if(photo) {\n isDownloaded = photo.downloaded > 0;\n } else {\n const cachedThumb = this.getDocumentCachedThumb(media.id);\n isDownloaded = cachedThumb?.downloaded > 0;\n }\n\n return isDownloaded;\n } */\n\n public getPhoto(photoId: any/* MyPhoto | string */): MyPhoto {\n return isObject(photoId) ? photoId as MyPhoto : this.photos[photoId as any as string];\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport copy from '../../helpers/object/copy';\nimport {InputMedia, Message, MessageEntity, MessageMedia, Poll, PollResults} from '../../layer';\nimport {logger, LogTypes} from '../logger';\nimport parseMarkdown from '../richTextProcessor/parseMarkdown';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\ntype PollId = Poll['id'];\n\nexport class AppPollsManager extends AppManager {\n public polls: {[id: PollId]: Poll} = {};\n public results: {[id: PollId]: PollResults} = {};\n public pollToMessages: {[id: PollId]: Set} = {};\n\n private log = logger('POLLS', LogTypes.Error);\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateMessagePoll: (update) => {\n this.log('updateMessagePoll:', update);\n\n let poll: Poll = update.poll || this.polls[update.poll_id];\n if(!poll) {\n return;\n }\n\n let results = update.results;\n const ret = this.savePoll(poll, results as any);\n poll = ret.poll;\n results = ret.results;\n\n this.rootScope.dispatchEvent('poll_update', {poll, results: results as any});\n }\n });\n }\n\n public savePoll(poll: Poll, results: PollResults, message?: Message.message) {\n if(message) {\n this.updatePollToMessage(message, true);\n }\n\n const id = poll.id;\n if(this.polls[id]) {\n poll = Object.assign(this.polls[id], poll);\n results = this.saveResults(poll, results);\n } else {\n this.polls[id] = poll;\n\n poll.chosenIndexes = [];\n results = this.saveResults(poll, results);\n }\n\n return {poll, results};\n }\n\n public saveResults(poll: Poll, results: PollResults) {\n if(this.results[poll.id]) {\n results = Object.assign(this.results[poll.id], results);\n } else {\n this.results[poll.id] = results;\n }\n\n if(!results.pFlags.min) { // ! https://core.telegram.org/constructor/pollResults - min\n poll.chosenIndexes.length = 0;\n if(results?.results?.length) {\n results.results.forEach((answer, idx) => {\n if(answer.pFlags?.chosen) {\n poll.chosenIndexes.push(idx);\n }\n });\n }\n }\n\n return results;\n }\n\n public getPoll(pollId: PollId): {poll: Poll, results: PollResults} {\n return {\n poll: this.polls[pollId],\n results: this.results[pollId]\n };\n }\n\n public getInputMediaPoll(poll: Poll, correctAnswers?: Uint8Array[], solution?: string, solutionEntities?: MessageEntity[]): InputMedia.inputMediaPoll {\n if(solution) {\n if(!solutionEntities) {\n solutionEntities = [];\n }\n\n solution = parseMarkdown(solution, solutionEntities);\n } else {\n solution = undefined; // can be string here\n }\n\n return {\n _: 'inputMediaPoll',\n poll,\n correct_answers: correctAnswers,\n solution,\n solution_entities: solution ? solutionEntities : undefined\n };\n }\n\n public updatePollToMessage(message: Message.message, add: boolean) {\n const {id} = (message.media as MessageMedia.messageMediaPoll).poll;\n let set = this.pollToMessages[id];\n\n if(!add && !set) {\n return;\n }\n\n if(!set) {\n set = this.pollToMessages[id] = new Set();\n }\n\n const key = message.peerId + '_' + message.mid;\n if(add) set.add(key);\n else set.delete(key);\n\n if(!add && !set.size) {\n delete this.polls[id];\n delete this.results[id];\n delete this.pollToMessages[id];\n }\n }\n\n public sendVote(message: Message.message, optionIds: number[]): Promise {\n const poll: Poll = (message.media as MessageMedia.messageMediaPoll).poll;\n\n const options: Uint8Array[] = optionIds.map((index) => {\n return poll.answers[index].option;\n });\n\n const messageId = message.mid;\n const peerId = message.peerId;\n const inputPeer = this.appPeersManager.getInputPeerById(peerId);\n\n if(message.pFlags.is_outgoing) {\n return this.appMessagesManager.invokeAfterMessageIsSent(messageId, 'sendVote', (message) => {\n this.log('invoke sendVote callback');\n return this.sendVote(message as Message.message, optionIds);\n });\n }\n\n return this.apiManager.invokeApi('messages.sendVote', {\n peer: inputPeer,\n msg_id: getServerMessageId(message.mid),\n options\n }).then((updates) => {\n this.log('sendVote updates:', updates);\n this.apiUpdatesManager.processUpdateMessage(updates);\n });\n }\n\n public getResults(message: Message.message) {\n const inputPeer = this.appPeersManager.getInputPeerById(message.peerId);\n\n return this.apiManager.invokeApi('messages.getPollResults', {\n peer: inputPeer,\n msg_id: getServerMessageId(message.mid)\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n this.log('getResults updates:', updates);\n });\n }\n\n public getVotes(message: Message.message, option?: Uint8Array, offset?: string, limit = 20) {\n return this.apiManager.invokeApi('messages.getPollVotes', {\n peer: this.appPeersManager.getInputPeerById(message.peerId),\n id: getServerMessageId(message.mid),\n option,\n offset,\n limit\n }).then((votesList) => {\n this.log('getPollVotes messages:', votesList);\n\n this.appUsersManager.saveApiUsers(votesList.users);\n\n return votesList;\n });\n }\n\n public stopPoll(message: Message.message) {\n const poll: Poll = (message.media as MessageMedia.messageMediaPoll).poll;\n\n if(poll.pFlags.closed) return Promise.resolve();\n\n const newPoll = copy(poll);\n newPoll.pFlags.closed = true;\n return this.appMessagesManager.editMessage(message, undefined, {\n newMedia: this.getInputMediaPoll(newPoll)\n }).then(() => {\n // console.log('stopped poll');\n }, err => {\n this.log.error('stopPoll error:', err);\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputPrivacyKey, InputPrivacyRule, PrivacyRule, PrivacyKey, GlobalPrivacySettings} from '../../layer';\nimport convertInputKeyToKey from '../../helpers/string/convertInputKeyToKey';\nimport {AppManager} from './manager';\n\nexport class AppPrivacyManager extends AppManager {\n private privacy: Partial<{\n [key in PrivacyKey['_']]: PrivacyRule[] | Promise\n }> = {};\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updatePrivacy: (update) => {\n const key = update.key._;\n this.privacy[key] = update.rules;\n this.rootScope.dispatchEvent('privacy_update', update);\n }\n });\n }\n\n public setPrivacy(inputKey: InputPrivacyKey['_'], rules: InputPrivacyRule[]) {\n return this.apiManager.invokeApi('account.setPrivacy', {\n key: {\n _: inputKey\n },\n rules\n }).then((privacyRules) => {\n this.appUsersManager.saveApiUsers(privacyRules.users);\n this.appChatsManager.saveApiChats(privacyRules.chats);\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updatePrivacy',\n key: {\n _: convertInputKeyToKey(inputKey)\n },\n rules: rules.map((inputRule) => {\n const rule: PrivacyRule = {} as any;\n Object.assign(rule, inputRule);\n rule._ = convertInputKeyToKey(rule._) as any;\n return rule;\n })\n });\n\n // console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\n\n return privacyRules.rules;\n });\n }\n\n public getPrivacy(inputKey: InputPrivacyKey['_']) {\n const privacyKey: PrivacyKey['_'] = convertInputKeyToKey(inputKey) as any;\n const rules = this.privacy[privacyKey];\n if(rules) {\n return Promise.resolve(rules);\n }\n\n return this.privacy[privacyKey] = this.apiManager.invokeApi('account.getPrivacy', {\n key: {\n _: inputKey\n }\n }).then((privacyRules) => {\n this.appUsersManager.saveApiUsers(privacyRules.users);\n this.appChatsManager.saveApiChats(privacyRules.chats);\n\n // console.log('privacy rules', inputKey, privacyRules, privacyRules.rules);\n\n return this.privacy[privacyKey] = privacyRules.rules;\n });\n }\n\n public getGlobalPrivacySettings() {\n return this.apiManager.invokeApi('account.getGlobalPrivacySettings');\n }\n\n public setGlobalPrivacySettings(settings: GlobalPrivacySettings) {\n return this.apiManager.invokeApi('account.setGlobalPrivacySettings', {settings});\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {MyTopPeer} from './appUsersManager';\nimport tsNow from '../../helpers/tsNow';\nimport {ChannelParticipantsFilter, ChannelsChannelParticipants, ChannelParticipant, Chat, ChatFull, ChatParticipants, ChatPhoto, ExportedChatInvite, InputChannel, InputFile, SendMessageAction, Update, UserFull, Photo, PhotoSize, Updates} from '../../layer';\nimport SearchIndex from '../searchIndex';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport getPhotoInput from './utils/photos/getPhotoInput';\nimport getParticipantPeerId from './utils/chats/getParticipantPeerId';\nimport ctx from '../../environment/ctx';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport generateMessageId from './utils/messageId/generateMessageId';\n\nexport type UserTyping = Partial<{userId: UserId, action: SendMessageAction, timeout: number}>;\n\nconst PEER_FULL_TTL = 3 * 60e3;\n\nexport class AppProfileManager extends AppManager {\n // private botInfos: any = {};\n private usersFull: {[id: UserId]: UserFull.userFull} = {};\n private chatsFull: {[id: ChatId]: ChatFull} = {};\n private fullExpiration: {[peerId: PeerId]: number} = {};\n private typingsInPeer: {[key: string]: UserTyping[]};\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateChatParticipants: (update) => {\n const participants = update.participants;\n if(participants._ === 'chatParticipants') {\n const chatId = participants.chat_id;\n const chatFull = this.chatsFull[chatId] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n chatFull.participants = participants;\n this.rootScope.dispatchEvent('chat_full_update', chatId);\n }\n }\n },\n\n updateChatParticipantAdd: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n return;\n }\n }\n\n participants.push({\n _: 'chatParticipant',\n user_id: update.user_id,\n inviter_id: update.inviter_id,\n date: tsNow(true)\n });\n\n _participants.version = update.version;\n this.rootScope.dispatchEvent('chat_full_update', update.chat_id);\n }\n },\n\n updateChatParticipantDelete: (update) => {\n const chatFull = this.chatsFull[update.chat_id] as ChatFull.chatFull;\n if(chatFull !== undefined) {\n const _participants = chatFull.participants as ChatParticipants.chatParticipants;\n const participants = _participants.participants || [];\n for(let i = 0, length = participants.length; i < length; i++) {\n if(participants[i].user_id === update.user_id) {\n participants.splice(i, 1);\n _participants.version = update.version;\n this.rootScope.dispatchEvent('chat_full_update', update.chat_id);\n return;\n }\n }\n }\n },\n\n updateUserTyping: this.onUpdateUserTyping,\n updateChatUserTyping: this.onUpdateUserTyping,\n updateChannelUserTyping: this.onUpdateUserTyping,\n\n updatePeerBlocked: this.onUpdatePeerBlocked\n });\n\n this.rootScope.addEventListener('chat_update', (chatId) => {\n const fullChat = this.chatsFull[chatId];\n const chat: Chat.chat | Chat.channel | Chat.chatForbidden | Chat.channelForbidden = this.appChatsManager.getChat(chatId);\n if(!fullChat || !chat) {\n return;\n }\n\n let updated = false;\n if(!!fullChat.call !== !!(chat as Chat.chat).pFlags?.call_active) {\n updated = true;\n }\n\n const {photo} = chat as Chat.chat;\n if(photo) {\n const hasChatPhoto = photo._ !== 'chatPhotoEmpty';\n const hasFullChatPhoto = !!(fullChat.chat_photo && fullChat.chat_photo._ !== 'photoEmpty'); // chat_photo can be missing\n if(\n hasChatPhoto !== hasFullChatPhoto || (\n hasChatPhoto &&\n photo.photo_id !== fullChat.chat_photo?.id\n )\n ) {\n updated = true;\n }\n }\n\n if(updated) {\n this.refreshFullPeer(chatId.toPeerId(true));\n }\n });\n\n this.rootScope.addEventListener('channel_update', (chatId) => {\n this.refreshFullPeer(chatId.toPeerId(true));\n });\n\n // * genius\n this.rootScope.addEventListener('chat_full_update', (chatId) => {\n this.rootScope.dispatchEvent('peer_full_update', chatId.toPeerId(true));\n });\n\n // * genius\n this.rootScope.addEventListener('user_full_update', (userId) => {\n this.rootScope.dispatchEvent('peer_full_update', userId.toPeerId(false));\n });\n\n this.rootScope.addEventListener('invalidate_participants', (chatId) => {\n this.invalidateChannelParticipants(chatId);\n });\n\n this.typingsInPeer = {};\n }\n\n /* public saveBotInfo(botInfo: any) {\n const botId = botInfo && botInfo.user_id;\n if(!botId) {\n return null;\n }\n\n const commands: any = {};\n botInfo.commands.forEach((botCommand: any) => {\n commands[botCommand.command] = botCommand.description;\n });\n\n return this.botInfos[botId] = {\n id: botId,\n version: botInfo.version,\n shareText: botInfo.share_text,\n description: botInfo.description,\n commands: commands\n };\n } */\n\n public getProfile(id: UserId, override?: true) {\n if(this.usersFull[id] && !override && Date.now() < this.fullExpiration[id.toPeerId()]) {\n return this.usersFull[id];\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'users.getFullUser',\n params: {\n id: this.appUsersManager.getUserInput(id)\n },\n processResult: (usersUserFull) => {\n this.appChatsManager.saveApiChats(usersUserFull.chats, true);\n this.appUsersManager.saveApiUsers(usersUserFull.users);\n\n const userFull = usersUserFull.full_user;\n const peerId = id.toPeerId(false);\n if(userFull.profile_photo) {\n userFull.profile_photo = this.appPhotosManager.savePhoto(userFull.profile_photo, {type: 'profilePhoto', peerId});\n }\n\n const botInfo = userFull.bot_info;\n if(botInfo) {\n const referenceContext: ReferenceContext = {type: 'userFull', userId: id};\n botInfo.description_document = this.appDocsManager.saveDoc(botInfo.description_document, referenceContext);\n botInfo.description_photo = this.appPhotosManager.savePhoto(botInfo.description_photo, referenceContext);\n }\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: userFull.notify_settings\n });\n\n this.usersFull[id] = userFull;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n\n /* if(userFull.bot_info) {\n userFull.bot_info = this.saveBotInfo(userFull.bot_info) as any;\n } */\n\n // appMessagesManager.savePinnedMessage(id, userFull.pinned_msg_id);\n\n this.rootScope.dispatchEvent('user_full_update', id);\n return userFull;\n }\n });\n }\n\n public getProfileByPeerId(peerId: PeerId, override?: true) {\n if(this.appPeersManager.isAnyChat(peerId)) return this.getChatFull(peerId.toChatId(), override);\n else return this.getProfile(peerId.toUserId(), override);\n }\n\n public getCachedFullChat(chatId: ChatId) {\n return this.chatsFull[chatId];\n }\n\n public getCachedFullUser(userId: UserId) {\n return this.usersFull[userId];\n }\n\n public getCachedProfileByPeerId(peerId: PeerId) {\n return peerId.isUser() ? this.getCachedFullUser(peerId.toUserId()) : this.getCachedFullChat(peerId.toChatId());\n }\n\n public async getFullPhoto(peerId: PeerId) {\n const profile = await this.getProfileByPeerId(peerId);\n switch(profile._) {\n case 'userFull':\n return profile.profile_photo;\n case 'channelFull':\n case 'chatFull':\n return profile.chat_photo;\n }\n }\n\n /* public getPeerBots(peerId: PeerId) {\n var peerBots: any[] = [];\n if(peerId >= 0 && !appUsersManager.isBot(peerId) ||\n (appPeersManager.isChannel(peerId) && !appPeersManager.isMegagroup(peerId))) {\n return Promise.resolve(peerBots);\n }\n if(peerId >= 0) {\n return this.getProfile(peerId).then((userFull: any) => {\n var botInfo = userFull.bot_info;\n if(botInfo && botInfo._ !== 'botInfoEmpty') {\n peerBots.push(botInfo);\n }\n return peerBots;\n });\n }\n\n return this.getChatFull(peerId.toChatId()).then((chatFull: any) => {\n chatFull.bot_info.forEach((botInfo: any) => {\n peerBots.push(this.saveBotInfo(botInfo))\n });\n return peerBots;\n });\n } */\n\n public getChatFull(id: ChatId, override?: true) {\n if(this.appChatsManager.isChannel(id)) {\n return this.getChannelFull(id, override);\n }\n\n const peerId = id.toPeerId(true);\n const fullChat = this.chatsFull[id] as ChatFull.chatFull;\n if(fullChat && !override && Date.now() < this.fullExpiration[peerId]) {\n const chat = this.appChatsManager.getChat(id) as Chat.chat;\n if(\n chat.pFlags.left ||\n chat.pFlags.deactivated ||\n chat.version === (fullChat.participants as ChatParticipants.chatParticipants).version\n ) {\n return fullChat as ChatFull;\n }\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getFullChat',\n params: {\n chat_id: id\n },\n processResult: (result) => {\n this.appChatsManager.saveApiChats(result.chats, true);\n this.appUsersManager.saveApiUsers(result.users);\n const chatFull = result.full_chat as ChatFull.chatFull;\n if(chatFull && chatFull.chat_photo && chatFull.chat_photo.id) {\n chatFull.chat_photo = this.appPhotosManager.savePhoto(chatFull.chat_photo, {type: 'profilePhoto', peerId});\n }\n\n if(chatFull.call) {\n this.appGroupCallsManager.saveGroupCall(chatFull.call, id);\n }\n\n // appMessagesManager.savePinnedMessage(peerId, fullChat.pinned_msg_id);\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: chatFull.notify_settings\n });\n\n this.chatsFull[id] = chatFull;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n this.rootScope.dispatchEvent('chat_full_update', id);\n\n return chatFull;\n }\n });\n }\n\n public async getChatInviteLink(id: ChatId, force?: boolean) {\n const chatFull = await this.getChatFull(id);\n if(!force &&\n chatFull.exported_invite &&\n chatFull.exported_invite._ == 'chatInviteExported') {\n return chatFull.exported_invite.link;\n }\n\n return this.apiManager.invokeApi('messages.exportChatInvite', {\n peer: this.appPeersManager.getInputPeerById(id.toPeerId(true))\n }).then((exportedInvite) => {\n if(this.chatsFull[id] !== undefined) {\n this.chatsFull[id].exported_invite = exportedInvite;\n }\n\n return (exportedInvite as ExportedChatInvite.chatInviteExported).link;\n });\n }\n\n public getChannelParticipants(id: ChatId, filter: ChannelParticipantsFilter = {_: 'channelParticipantsRecent'}, limit = 200, offset = 0) {\n if(filter._ === 'channelParticipantsRecent') {\n const chat = this.appChatsManager.getChat(id);\n if(chat?.pFlags && (\n // chat.pFlags.kicked ||\n (chat as Chat.channel).pFlags.broadcast &&\n !(chat as Chat.channel).pFlags.creator &&\n !(chat as Chat.channel).admin_rights\n )) {\n return Promise.reject();\n }\n }\n\n return this.apiManager.invokeApiCacheable('channels.getParticipants', {\n channel: this.appChatsManager.getChannelInput(id),\n filter,\n offset,\n limit,\n hash: '0'\n }, {cacheSeconds: 60}).then((result) => {\n this.appUsersManager.saveApiUsers((result as ChannelsChannelParticipants.channelsChannelParticipants).users);\n return result as ChannelsChannelParticipants.channelsChannelParticipants;\n });\n /* let maybeAddSelf = (participants: any[]) => {\n let chat = appChatsManager.getChat(id);\n let selfMustBeFirst = filter._ === 'channelParticipantsRecent' &&\n !offset &&\n !chat.pFlags.kicked &&\n !chat.pFlags.left;\n\n if(selfMustBeFirst) {\n participants = copy(participants);\n let myID = appUsersManager.getSelf().id;\n let myIndex = participants.findIndex((p) => p.user_id === myID);\n let myParticipant;\n\n if(myIndex !== -1) {\n myParticipant = participants[myIndex];\n participants.splice(myIndex, 1);\n } else {\n myParticipant = {_: 'channelParticipantSelf', user_id: myID};\n }\n\n participants.unshift(myParticipant);\n }\n\n return participants;\n } */\n }\n\n public getChannelParticipant(id: ChatId, peerId: PeerId) {\n return this.apiManager.invokeApiSingle('channels.getParticipant', {\n channel: this.appChatsManager.getChannelInput(id),\n participant: this.appPeersManager.getInputPeerById(peerId)\n }).then((channelParticipant) => {\n this.appUsersManager.saveApiUsers(channelParticipant.users);\n return channelParticipant.participant;\n });\n }\n\n public getChannelFull(id: ChatId, override?: true) {\n const peerId = id.toPeerId(true);\n if(this.chatsFull[id] !== undefined && !override && Date.now() < this.fullExpiration[peerId]) {\n return this.chatsFull[id] as ChatFull.channelFull;\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'channels.getFullChannel',\n params: {\n channel: this.appChatsManager.getChannelInput(id)\n },\n processResult: (result) => {\n this.appChatsManager.saveApiChats(result.chats, true);\n this.appUsersManager.saveApiUsers(result.users);\n const fullChannel = result.full_chat as ChatFull.channelFull;\n if(fullChannel && fullChannel.chat_photo.id) {\n fullChannel.chat_photo = this.appPhotosManager.savePhoto(fullChannel.chat_photo, {type: 'profilePhoto', peerId});\n // appPhotosManager.savePhoto(fullChannel.chat_photo);\n }\n\n if(fullChannel.call) {\n this.appGroupCallsManager.saveGroupCall(fullChannel.call, id);\n }\n\n this.appNotificationsManager.savePeerSettings({\n peerId,\n settings: fullChannel.notify_settings\n });\n\n this.chatsFull[id] = fullChannel;\n this.fullExpiration[peerId] = Date.now() + PEER_FULL_TTL;\n this.rootScope.dispatchEvent('chat_full_update', id);\n\n return fullChannel;\n },\n processError: (error) => {\n switch(error.type) {\n case 'CHANNEL_PRIVATE':\n const channel = this.appChatsManager.getChat(id) as Chat.channel | Chat.channelForbidden;\n this.apiUpdatesManager.processUpdateMessage({\n _: 'updates',\n updates: [{\n _: 'updateChannel',\n channel_id: id\n }],\n chats: [channel._ === 'channelForbidden' ? channel : {\n _: 'channelForbidden',\n id,\n access_hash: channel.access_hash,\n title: channel.title,\n pFlags: channel.pFlags\n }],\n users: []\n } as Updates.updates);\n break;\n }\n\n throw error;\n }\n });\n }\n\n public getMentions(chatId: ChatId, query: string, threadId?: number): Promise {\n const processUserIds = (topPeers: MyTopPeer[]) => {\n const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n /* const startsWithAt = query.charAt(0) === '@';\n if(startsWithAt) query = query.slice(1);\n\n const index = new SearchIndex(!startsWithAt, !startsWithAt); */\n const index = new SearchIndex({\n ignoreCase: true\n });\n\n const ratingMap: Map = new Map();\n topPeers.forEach((peer) => {\n index.indexObject(peer.id, this.appUsersManager.getUserSearchText(peer.id));\n ratingMap.set(peer.id, peer.rating);\n });\n\n const peerIds = Array.from(index.search(query));\n peerIds.sort((a, b) => ratingMap.get(b) - ratingMap.get(a));\n return peerIds;\n };\n\n let promise: Promise;\n if(this.appChatsManager.isChannel(chatId)) {\n promise = this.getChannelParticipants(chatId, {\n _: 'channelParticipantsMentions',\n q: query,\n top_msg_id: getServerMessageId(threadId)\n }, 50, 0).then((cP) => {\n return cP.participants.map((p) => getParticipantPeerId(p));\n });\n } else if(chatId) {\n promise = Promise.resolve(this.getChatFull(chatId)).then((chatFull) => {\n return ((chatFull as ChatFull.chatFull).participants as ChatParticipants.chatParticipants).participants.map((p) => p.user_id.toPeerId());\n });\n } else {\n promise = Promise.resolve([]);\n }\n\n return Promise.all([\n // [],\n this.appUsersManager.getTopPeers('bots_inline').catch(() => [] as MyTopPeer[]),\n promise\n ]).then((results) => {\n const peers = results[0].concat(results[1].map((peerId) => ({id: peerId, rating: 0})));\n\n return processUserIds(peers);\n });\n }\n\n private invalidateChannelParticipants(id: ChatId) {\n this.apiManager.clearCache('channels.getParticipants', (params) => (params.channel as InputChannel.inputChannel).channel_id === id);\n this.refreshFullPeer(id.toPeerId(true));\n }\n\n private refreshFullPeer(peerId: PeerId) {\n if(peerId.isUser()) {\n const userId = peerId.toUserId();\n delete this.usersFull[userId];\n this.rootScope.dispatchEvent('user_full_update', userId);\n } else {\n const chatId = peerId.toChatId();\n delete this.chatsFull[chatId];\n this.rootScope.dispatchEvent('chat_full_update', chatId);\n }\n\n // ! эта строчка будет создавать race condition:\n // ! запрос вернёт chat с установленным флагом call_not_empty, хотя сам апдейт уже будет применён\n // this.getProfileByPeerId(peerId, true);\n }\n\n public updateProfile(first_name?: string, last_name?: string, about?: string) {\n return this.apiManager.invokeApi('account.updateProfile', {\n first_name,\n last_name,\n about\n }).then((user) => {\n this.appUsersManager.saveApiUser(user);\n\n if(about !== undefined) {\n const peerId = user.id.toPeerId();\n const userFull = this.usersFull[user.id];\n if(userFull) {\n userFull.about = about;\n }\n\n this.rootScope.dispatchEvent('peer_bio_edit', peerId);\n }\n\n return this.getProfile(user.id, true);\n });\n }\n\n public uploadProfilePhoto(inputFile: InputFile) {\n return this.apiManager.invokeApi('photos.uploadProfilePhoto', {\n file: inputFile\n }).then((updateResult) => {\n // ! sometimes can have no user in users\n const photo = updateResult.photo as Photo.photo;\n if(!updateResult.users.length) {\n const strippedThumb = photo.sizes.find((size) => size._ === 'photoStrippedSize') as PhotoSize.photoStrippedSize;\n updateResult.users.push({\n ...this.appUsersManager.getSelf(),\n photo: {\n _: 'userProfilePhoto',\n dc_id: photo.dc_id,\n photo_id: photo.id,\n stripped_thumb: strippedThumb?.bytes,\n pFlags: {\n\n }\n }\n });\n }\n this.appUsersManager.saveApiUsers(updateResult.users);\n\n const myId = this.appPeersManager.peerId;\n this.appPhotosManager.savePhoto(updateResult.photo, {\n type: 'profilePhoto',\n peerId: myId\n });\n\n const userId = myId.toUserId();\n // this.apiUpdatesManager.processLocalUpdate({\n // _: 'updateUserPhoto',\n // user_id: userId,\n // date: tsNow(true),\n // photo: this.appUsersManager.getUser(userId).photo,\n // previous: true\n // });\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateUser',\n user_id: userId\n });\n });\n }\n\n public deletePhotos(photoIds: string[]) {\n return this.apiManager.invokeApiSingle('photos.deletePhotos', {\n id: photoIds.map((photoId) => {\n const photo = this.appPhotosManager.getPhoto(photoId);\n return getPhotoInput(photo);\n })\n }).then((deletedList) => {\n\n });\n }\n\n private verifyParticipantForOnlineCount(participant: {user_id: UserId}) {\n const user = this.appUsersManager.getUser(participant.user_id);\n return !!(user && user.status && user.status._ === 'userStatusOnline');\n }\n\n private reduceParticipantsForOnlineCount(participants: {user_id: UserId}[]) {\n return participants.reduce((acc, participant) => {\n return acc + +this.verifyParticipantForOnlineCount(participant);\n }, 0);\n }\n\n public async getOnlines(id: ChatId): Promise {\n const minOnline = 1;\n if(this.appChatsManager.isBroadcast(id)) {\n return minOnline;\n }\n\n const chatInfo = await this.getChatFull(id);\n if(this.appChatsManager.isMegagroup(id)) {\n if((chatInfo as ChatFull.channelFull).participants_count <= 100) {\n const channelParticipants = await this.getChannelParticipants(id, {_: 'channelParticipantsRecent'}, 100);\n return this.reduceParticipantsForOnlineCount(channelParticipants.participants as ChannelParticipant.channelParticipant[]);\n }\n\n const res = await this.apiManager.invokeApiCacheable('messages.getOnlines', {\n peer: this.appChatsManager.getChannelInputPeer(id)\n }, {cacheSeconds: 60});\n\n const onlines = res.onlines ?? minOnline;\n return onlines;\n }\n\n const _participants = (chatInfo as ChatFull.chatFull).participants as ChatParticipants.chatParticipants;\n if(_participants?.participants) {\n return this.reduceParticipantsForOnlineCount(_participants.participants);\n } else {\n return minOnline;\n }\n }\n\n private getTypingsKey(peerId: PeerId, threadId?: number) {\n return peerId + (threadId ? `_${threadId}` : '');\n }\n\n private onUpdateUserTyping = (update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping) => {\n const fromId = (update as Update.updateUserTyping).user_id ?\n (update as Update.updateUserTyping).user_id.toPeerId() :\n this.appPeersManager.getPeerId((update as Update.updateChatUserTyping).from_id);\n if(this.appPeersManager.peerId === fromId || update.action._ === 'speakingInGroupCallAction') {\n return;\n }\n\n const topMsgId = (update as Update.updateChannelUserTyping).top_msg_id;\n const threadId = topMsgId ? generateMessageId(topMsgId) : undefined;\n const peerId = this.appPeersManager.getPeerId(update);\n const key = this.getTypingsKey(peerId, threadId);\n const typings = this.typingsInPeer[key] ??= [];\n let typing = typings.find((t) => t.userId === fromId);\n\n const cancelAction = () => {\n delete typing.timeout;\n // typings.findAndSplice((t) => t === typing);\n const idx = typings.indexOf(typing);\n if(idx !== -1) {\n typings.splice(idx, 1);\n }\n\n this.rootScope.dispatchEvent('peer_typings', {peerId, threadId, typings});\n\n if(!typings.length) {\n delete this.typingsInPeer[key];\n }\n };\n\n if(typing?.timeout !== undefined) {\n clearTimeout(typing.timeout);\n }\n\n if(update.action._ === 'sendMessageCancelAction') {\n if(!typing) {\n return;\n }\n\n cancelAction();\n return;\n }\n\n if(!typing) {\n typing = {\n userId: fromId\n };\n\n typings.push(typing);\n }\n\n // console.log('updateChatUserTyping', update, typings);\n\n typing.action = update.action;\n\n const hasUser = this.appUsersManager.hasUser(fromId);\n if(!hasUser) {\n // let's load user here\n if(update._ === 'updateChatUserTyping') {\n if(update.chat_id && this.appChatsManager.hasChat(update.chat_id) && !this.appChatsManager.isChannel(update.chat_id)) {\n Promise.resolve(this.getChatFull(update.chat_id)).then(() => {\n if(typing.timeout !== undefined && this.appUsersManager.hasUser(fromId)) {\n this.rootScope.dispatchEvent('peer_typings', {peerId, threadId, typings});\n }\n });\n }\n }\n\n // return;\n } else {\n this.appUsersManager.forceUserOnline(fromId);\n }\n\n typing.timeout = ctx.setTimeout(cancelAction, 6000);\n if(hasUser) {\n this.rootScope.dispatchEvent('peer_typings', {peerId, threadId, typings});\n }\n };\n\n private onUpdatePeerBlocked = (update: Update.updatePeerBlocked) => {\n const peerId = this.appPeersManager.getPeerId(update.peer_id);\n if(this.appPeersManager.isUser(peerId)) {\n const userId = peerId.toUserId();\n const userFull = this.usersFull[userId];\n if(userFull) {\n if(update.blocked) userFull.pFlags.blocked = true;\n else delete userFull.pFlags.blocked;\n }\n\n this.rootScope.dispatchEvent('user_full_update', userId);\n }\n\n this.rootScope.dispatchEvent('peer_block', {peerId, blocked: update.blocked});\n };\n\n public getPeerTypings(peerId: PeerId, threadId?: number) {\n return this.typingsInPeer[this.getTypingsKey(peerId, threadId)];\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {Awaited} from '../types';\n\nexport default function callbackifyAll(\n values: T,\n callback: (result: { -readonly [P in keyof T]: Awaited }) => R\n): Promise> | R {\n if(values.some((value) => value instanceof Promise)) {\n return Promise.all(values).then(callback as any);\n } else {\n return callback(values as any);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport assumeType from '../../helpers/assumeType';\nimport callbackify from '../../helpers/callbackify';\nimport callbackifyAll from '../../helpers/callbackifyAll';\nimport copy from '../../helpers/object/copy';\nimport pause from '../../helpers/schedulers/pause';\nimport {AvailableReaction, Message, MessagePeerReaction, MessagesAvailableReactions, Reaction, ReactionCount, Update, Updates} from '../../layer';\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\nimport reactionsEqual from './utils/reactions/reactionsEqual';\n\nconst SAVE_DOC_KEYS = [\n 'static_icon' as const,\n 'appear_animation' as const,\n 'select_animation' as const,\n 'activate_animation' as const,\n 'effect_animation' as const,\n 'around_animation' as const,\n 'center_icon' as const\n];\n\nconst REFERENCE_CONTEXT: ReferenceContext = {\n type: 'reactions'\n};\n\nexport class AppReactionsManager extends AppManager {\n private availableReactions: AvailableReaction[];\n private sendReactionPromises: Map>;\n private lastSendingTimes: Map;\n\n protected after() {\n this.rootScope.addEventListener('language_change', () => {\n this.availableReactions = undefined;\n this.getAvailableReactions();\n });\n\n this.sendReactionPromises = new Map();\n this.lastSendingTimes = new Map();\n\n this.rootScope.addEventListener('user_auth', () => {\n setTimeout(() => {\n Promise.resolve(this.getAvailableReactions()).then(async(availableReactions) => {\n for(const availableReaction of availableReactions) {\n await Promise.all([\n availableReaction.around_animation && this.apiFileManager.downloadMedia({media: availableReaction.around_animation}),\n availableReaction.static_icon && this.apiFileManager.downloadMedia({media: availableReaction.static_icon}),\n availableReaction.appear_animation && this.apiFileManager.downloadMedia({media: availableReaction.appear_animation}),\n availableReaction.center_icon && this.apiFileManager.downloadMedia({media: availableReaction.center_icon})\n ]);\n\n await pause(1000);\n }\n });\n }, 7.5e3);\n });\n }\n\n public getAvailableReactions() {\n if(this.availableReactions) return this.availableReactions;\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAvailableReactions',\n processResult: (messagesAvailableReactions) => {\n assumeType(messagesAvailableReactions);\n\n const availableReactions = this.availableReactions = messagesAvailableReactions.reactions;\n for(const reaction of availableReactions) {\n for(const key of SAVE_DOC_KEYS) {\n if(!reaction[key]) {\n continue;\n }\n\n reaction[key] = this.appDocsManager.saveDoc(reaction[key], REFERENCE_CONTEXT);\n }\n }\n\n return availableReactions;\n },\n params: {\n hash: 0\n }\n });\n }\n\n public getActiveAvailableReactions() {\n return callbackify(this.getAvailableReactions(), (availableReactions) => {\n return availableReactions.filter((availableReaction) => !availableReaction.pFlags.inactive);\n });\n }\n\n public getAvailableReactionsForPeer(peerId: PeerId) {\n const activeAvailableReactions = this.getActiveAvailableReactions();\n if(peerId.isUser()) {\n return this.unshiftQuickReaction(activeAvailableReactions);\n }\n\n const chatFull = this.appProfileManager.getChatFull(peerId.toChatId());\n return callbackifyAll([activeAvailableReactions, chatFull, this.getQuickReaction()], ([activeAvailableReactions, chatFull, quickReaction]) => {\n const chatAvailableReactions = chatFull.available_reactions ?? {_: 'chatReactionsNone'};\n\n let filteredChatAvailableReactions: AvailableReaction[] = [];\n if(chatAvailableReactions._ === 'chatReactionsAll') {\n filteredChatAvailableReactions = activeAvailableReactions;\n } else if(chatAvailableReactions._ === 'chatReactionsSome') {\n filteredChatAvailableReactions = chatAvailableReactions.reactions.map((reaction) => {\n return activeAvailableReactions.find((availableReaction) => availableReaction.reaction === (reaction as Reaction.reactionEmoji).emoticon);\n }).filter(Boolean);\n }\n\n return this.unshiftQuickReactionInner(filteredChatAvailableReactions, quickReaction);\n });\n }\n\n private unshiftQuickReactionInner(availableReactions: AvailableReaction[], quickReaction: Reaction | AvailableReaction) {\n if(quickReaction && quickReaction._ !== 'reactionEmoji' && quickReaction._ !== 'availableReaction') return availableReactions;\n const emoticon = (quickReaction as Reaction.reactionEmoji).emoticon || (quickReaction as AvailableReaction).reaction;\n const availableReaction = findAndSplice(availableReactions, (availableReaction) => availableReaction.reaction === emoticon);\n if(availableReaction) {\n availableReactions.unshift(availableReaction);\n }\n\n return availableReactions;\n }\n\n private unshiftQuickReaction(\n availableReactions: AvailableReaction[] | PromiseLike,\n quickReaction: ReturnType = this.getQuickReaction()\n ) {\n return callbackifyAll([\n availableReactions,\n quickReaction\n ], ([availableReactions, quickReaction]) => {\n return this.unshiftQuickReactionInner(availableReactions, quickReaction);\n });\n }\n\n public getAvailableReactionsByMessage(message: Message.message) {\n if(!message) return [];\n const peerId = (message.fwd_from?.channel_post && this.appPeersManager.isMegagroup(message.peerId) && message.fwdFromId) || message.peerId;\n return this.getAvailableReactionsForPeer(peerId);\n }\n\n public isReactionActive(reaction: string) {\n if(!this.availableReactions) return false;\n return !!this.availableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n }\n\n public getQuickReaction() {\n return callbackifyAll([\n this.apiManager.getConfig(),\n this.getAvailableReactions()\n ], ([config, availableReactions]) => {\n const reaction = config.reactions_default;\n if(reaction?._ === 'reactionEmoji') {\n return availableReactions.find((availableReaction) => availableReaction.reaction === reaction.emoticon);\n }\n\n return reaction as Reaction.reactionCustomEmoji;\n });\n }\n\n public getReactionCached(reaction: string) {\n return this.availableReactions.find((availableReaction) => availableReaction.reaction === reaction);\n }\n\n public getReaction(reaction: string) {\n return callbackify(this.getAvailableReactions(), () => {\n return this.getReactionCached(reaction);\n });\n }\n\n public getMessagesReactions(peerId: PeerId, mids: number[]) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getMessagesReactions',\n params: {\n id: mids.map((mid) => getServerMessageId(mid)),\n peer: this.appPeersManager.getInputPeerById(peerId)\n },\n processResult: (updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n\n // const update = (updates as Updates.updates).updates.find((update) => update._ === 'updateMessageReactions') as Update.updateMessageReactions;\n // return update.reactions;\n }\n });\n }\n\n public getMessageReactionsList(peerId: PeerId, mid: number, limit: number, reaction?: Reaction, offset?: string) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.getMessageReactionsList',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n id: getServerMessageId(mid),\n limit,\n reaction,\n offset\n },\n processResult: (messageReactionsList) => {\n this.appUsersManager.saveApiUsers(messageReactionsList.users);\n return messageReactionsList;\n }\n });\n }\n\n public setDefaultReaction(reaction: Reaction) {\n return this.apiManager.invokeApi('messages.setDefaultReaction', {reaction}).then(async(value) => {\n if(value) {\n const appConfig = await this.apiManager.getConfig();\n if(appConfig) {\n appConfig.reactions_default = reaction;\n }/* else { // if no config or loading it - overwrite\n this.apiManager.getAppConfig(true);\n } */\n\n this.rootScope.dispatchEvent('quick_reaction', reaction);\n }\n\n return value;\n });\n }\n\n public async sendReaction(message: Message.message, reaction?: Reaction | AvailableReaction, onlyLocal?: boolean) {\n if(reaction._ === 'availableReaction') {\n reaction = {\n _: 'reactionEmoji',\n emoticon: reaction.reaction\n };\n }\n\n const limit = await this.apiManager.getLimit('reactions');\n\n const lastSendingTimeKey = message.peerId + '_' + message.mid;\n const lastSendingTime = this.lastSendingTimes.get(lastSendingTimeKey);\n if(lastSendingTime) {\n return;\n } else {\n this.lastSendingTimes.set(lastSendingTimeKey, Date.now());\n setTimeout(() => {\n this.lastSendingTimes.delete(lastSendingTimeKey);\n }, 333);\n }\n\n const {peerId, mid} = message;\n const myPeerId = this.appPeersManager.peerId;\n\n const unsetReactionCount = (reactionCount: ReactionCount) => {\n --reactionCount.count;\n delete reactionCount.chosen_order;\n\n if(reactionsEqual(reaction as Reaction, reactionCount.reaction)) {\n reaction = undefined as Reaction;\n }\n\n if(!reactionCount.count) {\n indexOfAndSplice(reactions.results, reactionCount);\n }/* else {\n insertInDescendSortedArray(reactions.results, chosenReaction, 'count', chosenReactionIdx);\n } */\n\n if(reactions.recent_reactions) {\n findAndSplice(reactions.recent_reactions, (recentReaction) => reactionsEqual(recentReaction.reaction, reactionCount.reaction) && this.appPeersManager.getPeerId(recentReaction.peer_id) === myPeerId);\n }\n\n if(!reactions.results.length) {\n reactions = undefined;\n }\n };\n\n const canSeeList = message.reactions?.pFlags?.can_see_list || !this.appPeersManager.isBroadcast(message.peerId) || message.peerId.isUser();\n if(!message.reactions) {\n message.reactions = {\n _: 'messageReactions',\n results: [],\n recent_reactions: canSeeList ? [] : undefined,\n pFlags: {\n can_see_list: canSeeList || undefined\n }\n };\n }\n\n let reactions = onlyLocal ? message.reactions : copy(message.reactions);\n const chosenReactions = reactions.results.filter((reactionCount) => reactionCount.chosen_order !== undefined);\n chosenReactions.sort((a, b) => b.chosen_order - a.chosen_order);\n const unsetReactions: ReactionCount[] = [];\n const chosenReactionIdx = chosenReactions.findIndex((reactionCount) => reactionsEqual(reactionCount.reaction, reaction as Reaction));\n if(chosenReactionIdx !== -1) unsetReactions.push(...chosenReactions.splice(chosenReactionIdx, 1));\n unsetReactions.push(...chosenReactions.splice(limit - +(chosenReactionIdx === -1)));\n unsetReactions.forEach((reactionCount) => {\n chosenReactions.forEach((chosenReactionCount) => {\n if(chosenReactionCount.chosen_order > reactionCount.chosen_order) {\n --chosenReactionCount.chosen_order;\n }\n });\n\n unsetReactionCount(reactionCount);\n });\n\n const chosenReactionsLength = chosenReactions.length;\n chosenReactions.forEach((reactionCount, idx) => {\n reactionCount.chosen_order = chosenReactionsLength - 1 - idx;\n });\n\n if(reaction) {\n if(!reactions) {\n reactions/* = message.reactions */ = {\n _: 'messageReactions',\n results: [],\n pFlags: {}\n };\n\n if(canSeeList) {\n reactions.pFlags.can_see_list = true;\n }\n }\n\n let reactionCountIdx = reactions.results.findIndex((reactionCount) => reactionsEqual(reactionCount.reaction, reaction as Reaction));\n let reactionCount = reactionCountIdx !== -1 && reactions.results[reactionCountIdx];\n if(!reactionCount) {\n reactionCount = {\n _: 'reactionCount',\n count: 0,\n reaction\n };\n\n reactionCountIdx = reactions.results.push(reactionCount) - 1;\n }\n\n ++reactionCount.count;\n reactionCount.chosen_order = chosenReactions.length ? chosenReactions[0].chosen_order + 1 : 0;\n chosenReactions.unshift(reactionCount);\n\n if(!reactions.recent_reactions && canSeeList) {\n reactions.recent_reactions = [];\n }\n\n if(reactions.recent_reactions) {\n const peerReaction: MessagePeerReaction = {\n _: 'messagePeerReaction',\n reaction,\n peer_id: this.appPeersManager.getOutputPeer(myPeerId)\n };\n\n if(!this.appPeersManager.isMegagroup(peerId) && false) {\n reactions.recent_reactions.push(peerReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(-3);\n } else {\n reactions.recent_reactions.unshift(peerReaction);\n reactions.recent_reactions = reactions.recent_reactions.slice(0, 3);\n }\n }\n\n // insertInDescendSortedArray(reactions.results, reactionCount, 'count', reactionCountIdx);\n }\n\n const availableReactions = this.availableReactions;\n if(reactions && availableReactions?.length) {\n const indexes: Map = new Map();\n availableReactions.forEach((availableReaction, idx) => {\n indexes.set(availableReaction.reaction, idx);\n });\n\n reactions.results.sort((a, b) => {\n const id1 = (a.reaction as Reaction.reactionCustomEmoji).document_id || (a.reaction as Reaction.reactionEmoji).emoticon;\n const id2 = (b.reaction as Reaction.reactionCustomEmoji).document_id || (b.reaction as Reaction.reactionEmoji).emoticon;\n return (b.count - a.count) || ((indexes.get(id1) ?? 0) - (indexes.get(id2) ?? 0));\n });\n }\n\n if(onlyLocal) {\n message.reactions = reactions;\n this.rootScope.dispatchEvent('messages_reactions', [{message, changedResults: []}]);\n return Promise.resolve();\n }\n\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updateMessageReactions',\n peer: message.peer_id,\n msg_id: message.id,\n reactions: reactions,\n local: true\n });\n\n const promiseKey = [peerId, mid].join('-');\n const msgId = getServerMessageId(mid);\n const promise = this.apiManager.invokeApi('messages.sendReaction', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: msgId,\n reaction: chosenReactions.map((reactionCount) => reactionCount.reaction)\n }).then((updates) => {\n assumeType(updates);\n\n const editMessageUpdateIdx = updates.updates.findIndex((update) => update._ === 'updateEditMessage' || update._ === 'updateEditChannelMessage');\n if(editMessageUpdateIdx !== -1) {\n const editMessageUpdate = updates.updates[editMessageUpdateIdx] as Update.updateEditMessage | Update.updateEditChannelMessage;\n updates.updates[editMessageUpdateIdx] = {\n _: 'updateMessageReactions',\n msg_id: msgId,\n peer: this.appPeersManager.getOutputPeer(peerId),\n reactions: (editMessageUpdate.message as Message.message).reactions,\n pts: editMessageUpdate.pts,\n pts_count: editMessageUpdate.pts_count\n };\n }\n\n this.apiUpdatesManager.processUpdateMessage(updates);\n }).catch((err) => {\n if(err.type === 'REACTION_INVALID' && this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReaction(message, chosenReactions[0]?.reaction, true);\n }\n }).finally(() => {\n if(this.sendReactionPromises.get(promiseKey) === promise) {\n this.sendReactionPromises.delete(promiseKey);\n }\n });\n\n this.sendReactionPromises.set(promiseKey, promise);\n return promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDocument} from './appDocsManager';\nimport type {DownloadOptions} from '../mtproto/apiFileManager';\nimport {Document, InputFileLocation, InputStickerSet, MessagesAllStickers, MessagesFavedStickers, MessagesFeaturedStickers, MessagesFoundStickerSets, MessagesRecentStickers, MessagesStickers, MessagesStickerSet, PhotoSize, StickerPack, StickerSet, StickerSetCovered, Update} from '../../layer';\nimport {Modify} from '../../types';\nimport AppStorage from '../storage';\nimport DATABASE_STATE from '../../config/databases/state';\nimport assumeType from '../../helpers/assumeType';\nimport fixBase64String from '../../helpers/fixBase64String';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport {AppManager} from './manager';\nimport fixEmoji from '../richTextProcessor/fixEmoji';\nimport ctx from '../../environment/ctx';\nimport {getEnvironment} from '../../environment/utils';\nimport getDocumentInput from './utils/docs/getDocumentInput';\nimport getStickerEffectThumb from './utils/stickers/getStickerEffectThumb';\n\nconst CACHE_TIME = 3600e3;\n\ntype LOCAL_STICKER_SET_ID = Extract<\n InputStickerSet['_'],\n 'inputStickerSetAnimatedEmoji' | 'inputStickerSetAnimatedEmojiAnimations' |\n 'inputStickerSetPremiumGifts' | 'inputStickerSetEmojiGenericAnimations' |\n 'inputStickerSetEmojiDefaultStatuses' | 'inputStickerSetEmojiDefaultTopicIcons'\n>;\n\ntype LOCAL_ID = 'EMOJI' | 'EMOJI_ANIMATIONS' | 'PREMIUM_GIFTS' | 'GENERIC_ANIMATIONS' | 'DEFAULT_STATUSES' | 'DEFAULT_TOPIC_ICONS';\n\nconst LOCAL_IDS: {[key in LOCAL_ID]: LOCAL_STICKER_SET_ID} = {\n EMOJI: 'inputStickerSetAnimatedEmoji',\n EMOJI_ANIMATIONS: 'inputStickerSetAnimatedEmojiAnimations',\n PREMIUM_GIFTS: 'inputStickerSetPremiumGifts',\n GENERIC_ANIMATIONS: 'inputStickerSetEmojiGenericAnimations',\n DEFAULT_STATUSES: 'inputStickerSetEmojiDefaultStatuses',\n DEFAULT_TOPIC_ICONS: 'inputStickerSetEmojiDefaultTopicIcons'\n}\n\nconst LOCAL_IDS_SET: Set = new Set(Object.values(LOCAL_IDS) as any);\n\n// let TEST_FILE_REFERENCE_REFRESH = true;\n\nexport type MyStickerSetInput = {\n id: StickerSet.stickerSet['id'],\n access_hash?: StickerSet.stickerSet['access_hash']\n};\n\nexport type MyMessagesStickerSet = MessagesStickerSet.messagesStickerSet;\n\nexport class AppStickersManager extends AppManager {\n private storage = new AppStorage, typeof DATABASE_STATE>(DATABASE_STATE, 'stickerSets');\n\n private getStickerSetPromises: {[setId: Long]: Promise};\n private getStickersByEmoticonsPromises: {[emoticon: string]: Promise};\n\n private greetingStickers: MyDocument[];\n private getGreetingStickersTimeout: number;\n private getGreetingStickersPromise: Promise;\n\n private sounds: Record;\n private getAnimatedEmojiSoundsPromise: Promise;\n\n private favedStickers: MyDocument[];\n private recentStickers: MyDocument[];\n\n private names: Record;\n\n protected after() {\n this.getStickerSetPromises = {};\n this.getStickersByEmoticonsPromises = {};\n this.sounds = {};\n this.names = {};\n\n this.rootScope.addEventListener('user_auth', () => {\n setTimeout(() => {\n this.getAnimatedEmojiStickerSet();\n // this.getFavedStickersStickers();\n }, 1000);\n\n if(!this.getGreetingStickersPromise && this.getGreetingStickersTimeout === undefined) {\n this.getGreetingStickersTimeout = ctx.setTimeout(() => {\n this.getGreetingStickersTimeout = undefined;\n this.getGreetingSticker(true);\n }, 5000);\n }\n });\n\n this.rootScope.addEventListener('app_config', () => this.onStickersUpdated('faved', true));\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateNewStickerSet: (update) => {\n const stickerSet = update.stickerset as MyMessagesStickerSet;\n this.saveStickerSet(stickerSet, stickerSet.set.id);\n this.rootScope.dispatchEvent('stickers_installed', stickerSet.set);\n },\n\n updateRecentStickers: () => this.onStickersUpdated('recent', true),\n\n updateFavedStickers: () => this.onStickersUpdated('faved', true),\n\n updateMoveStickerSetToTop: (update) => {\n this.rootScope.dispatchEvent('stickers_top', update.stickerset);\n }\n });\n }\n\n private async onStickersUpdated(type: 'faved' | 'recent', overwrite: boolean) {\n const stickers = await (type === 'faved' ? this.getFavedStickersStickers(overwrite) : this.getRecentStickersStickers(overwrite));\n this.rootScope.dispatchEvent('stickers_updated', {\n type,\n stickers\n });\n }\n\n public getGreetingSticker(justPreload = false) {\n if(this.getGreetingStickersTimeout) {\n clearTimeout(this.getGreetingStickersTimeout);\n this.getGreetingStickersTimeout = undefined;\n }\n\n if(!this.getGreetingStickersPromise) {\n this.getGreetingStickersPromise = this.getStickersByEmoticon('👋⭐️', false).then((docs) => {\n if(!docs.length) throw 'NO_STICKERS';\n this.greetingStickers = docs.slice() as Document.document[];\n this.greetingStickers.sort((a, b) => Math.random() - Math.random());\n });\n }\n\n return this.getGreetingStickersPromise.then(() => {\n let doc: Document.document;\n if(!justPreload) {\n doc = this.greetingStickers.shift();\n this.greetingStickers.push(doc);\n }\n\n this.apiFileManager.downloadMedia({media: this.greetingStickers[0]}); // preload next sticker\n\n return doc;\n });\n }\n\n private saveStickers(docs: Document[]) {\n forEachReverse(docs, (doc, idx) => {\n doc = this.appDocsManager.saveDoc(doc);\n\n if(!doc) docs.splice(idx, 1);\n else docs[idx] = doc;\n });\n }\n\n private canUseStickerSetCache(set: MyMessagesStickerSet, useCache?: boolean) {\n return set && set.documents?.length && ((Date.now() - set.refreshTime) < CACHE_TIME || useCache);\n }\n\n public getStickerSet(set: MyStickerSetInput, params: Partial<{\n overwrite: boolean,\n useCache: boolean,\n saveById: boolean\n }> = {}): Promise | MyMessagesStickerSet {\n let {id} = set;\n if(!set.access_hash) {\n set = this.names[id] || set;\n id = set.id;\n }\n\n if(this.getStickerSetPromises[id]) {\n return this.getStickerSetPromises[id];\n }\n\n if(!params.overwrite) {\n const cachedSet = this.storage.getFromCache(id);\n if(this.canUseStickerSetCache(cachedSet, params.useCache)) {\n return cachedSet;\n }\n }\n\n const promise = this.getStickerSetPromises[id] = new Promise(async(resolve) => {\n if(!params.overwrite) {\n const cachedSet = await this.storage.get(id);\n if(this.canUseStickerSetCache(cachedSet, params.useCache)) {\n this.saveStickers(cachedSet.documents);\n resolve(cachedSet);\n\n if(this.getStickerSetPromises[id] === promise) {\n delete this.getStickerSetPromises[id];\n }\n\n return;\n }\n }\n\n try {\n const stickerSet = await this.apiManager.invokeApi('messages.getStickerSet', {\n stickerset: this.getStickerSetInput(set),\n hash: 0\n }) as MyMessagesStickerSet;\n\n const saveById = params.saveById ? id : stickerSet.set.id;\n this.saveStickerSet(stickerSet, saveById);\n\n resolve(stickerSet);\n } catch(err) {\n resolve(null);\n }\n\n if(this.getStickerSetPromises[id] === promise) {\n delete this.getStickerSetPromises[id];\n }\n });\n\n return promise;\n }\n\n public getLocalStickerSet(id: LOCAL_STICKER_SET_ID) {\n return this.getStickerSet({id}, {saveById: true});\n }\n\n public getAnimatedEmojiStickerSet() {\n return Promise.all([\n this.getLocalStickerSet(LOCAL_IDS.EMOJI),\n this.getLocalStickerSet(LOCAL_IDS.EMOJI_ANIMATIONS),\n this.getAnimatedEmojiSounds()\n ]).then(([emoji, animations]) => {\n return {emoji, animations};\n });\n }\n\n public getAnimatedEmojiSounds(overwrite?: boolean) {\n if(this.getAnimatedEmojiSoundsPromise && !overwrite) return this.getAnimatedEmojiSoundsPromise;\n const promise = this.getAnimatedEmojiSoundsPromise = Promise.all([\n this.apiManager.getAppConfig(overwrite),\n this.apiManager.getConfig()\n ]).then(([appConfig, config]) => {\n if(this.getAnimatedEmojiSoundsPromise !== promise) {\n return;\n }\n\n for(const emoji in appConfig.emojies_sounds) {\n const sound = appConfig.emojies_sounds[emoji];\n const bytesStr = atob(fixBase64String(sound.file_reference_base64, false));\n const bytes = new Uint8Array(bytesStr.length);\n for(let i = 0, length = bytes.length; i < length; ++i) {\n bytes[i] = bytesStr[i].charCodeAt(0);\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // bytes[0] = bytes[1] = bytes[2] = bytes[3] = bytes[4] = 0;\n // sound.access_hash += '999';\n // }\n\n const doc = this.appDocsManager.saveDoc({\n _: 'document',\n pFlags: {},\n flags: 0,\n id: sound.id,\n access_hash: sound.access_hash,\n attributes: [{\n _: 'documentAttributeAudio',\n duration: 1,\n pFlags: {\n voice: true\n }\n }],\n date: 0,\n dc_id: config.this_dc,\n file_reference: bytes,\n mime_type: 'audio/ogg'\n // size: 101010 // test loading everytime\n }, {\n type: 'emojiesSounds'\n });\n\n this.sounds[emoji] = doc;\n }\n\n // if(TEST_FILE_REFERENCE_REFRESH) {\n // TEST_FILE_REFERENCE_REFRESH = false;\n // }\n });\n\n return promise;\n }\n\n public async getRecentStickers(overwrite?: boolean): Promise> {\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.getRecentStickers',\n processResult: (res) => {\n assumeType(res);\n\n this.recentStickers = res.stickers as MyDocument[];\n this.saveStickers(res.stickers);\n return res;\n },\n overwrite\n });\n\n return res;\n }\n\n public getRecentStickersStickers(overwrite?: boolean) {\n if(overwrite) this.recentStickers = undefined;\n else if(this.recentStickers) return this.recentStickers;\n return this.getRecentStickers(overwrite).then(() => this.recentStickers);\n }\n\n public saveRecentSticker(docId: DocId, unsave?: boolean, attached?: boolean) {\n const doc = this.appDocsManager.getDoc(docId);\n\n findAndSplice(this.recentStickers, (_doc) => _doc.id === docId);\n if(!unsave) {\n this.recentStickers.unshift(doc);\n\n const docEmoticon = fixEmoji(doc.stickerEmojiRaw);\n for(const emoticon in this.getStickersByEmoticonsPromises) {\n const promise = this.getStickersByEmoticonsPromises[emoticon];\n promise.then((stickers) => {\n const _doc = findAndSplice(stickers, (_doc) => _doc.id === doc.id);\n if(_doc) {\n stickers.unshift(_doc);\n } else if(emoticon.includes(docEmoticon)) {\n stickers.unshift(doc);\n }\n });\n }\n }\n\n this.rootScope.dispatchEvent('sticker_updated', {type: 'recent', faved: !unsave, document: doc});\n\n if(unsave) {\n this.onStickersUpdated('recent', false);\n }\n\n return this.apiManager.invokeApi('messages.saveRecentSticker', {\n id: getDocumentInput(doc),\n unsave,\n attached\n });\n }\n\n private cleanEmoji(emoji: string) {\n return emoji.replace(/\\ufe0f/g, '').replace(/🏻|🏼|🏽|🏾|🏿/g, '');\n }\n\n public getAnimatedEmojiSticker(emoji: string, isAnimation?: boolean) {\n const id = isAnimation ? LOCAL_IDS.EMOJI_ANIMATIONS : LOCAL_IDS.EMOJI;\n const stickerSet = this.storage.getFromCache(id);\n // const stickerSet = await this.getStickerSet({id});\n if(!stickerSet?.documents) return;\n\n if(isAnimation) {\n if(['🧡', '💛', '💚', '💙', '💜', '🖤', '🤍', '🤎'].includes(emoji)) {\n emoji = '❤️';\n }\n }\n\n emoji = this.cleanEmoji(emoji);\n const pack = stickerSet.packs.find((p) => p.emoticon === emoji);\n return pack ? this.appDocsManager.getDoc(pack.documents[0]) : undefined;\n }\n\n public getAnimatedEmojiSoundDocument(emoji: string) {\n return this.sounds[this.cleanEmoji(emoji)];\n }\n\n public preloadAnimatedEmojiSticker(emoji: string) {\n const preloadEmojiPromise = this.getAnimatedEmojiStickerSet().then(() => {\n return this.getAnimatedEmojiSticker(emoji);\n });\n\n return Promise.all([\n preloadEmojiPromise,\n this.preloadAnimatedEmojiStickerAnimation(emoji)\n ]).then(([doc, a]) => {\n return {\n doc: doc,\n animation: a?.doc,\n sound: a?.sound\n };\n });\n }\n\n public preloadAnimatedEmojiStickerAnimation(emoji: string) {\n return this.getAnimatedEmojiStickerSet().then(() => {\n return this.getAnimatedEmojiSticker(emoji, true);\n }).then((doc) => {\n if(!doc) {\n return;\n }\n\n const sound = this.getAnimatedEmojiSoundDocument(emoji);\n return Promise.all([\n this.preloadSticker(doc.id),\n sound ? this.preloadSticker(sound.id) : undefined\n ]).then(() => {\n return {doc, sound};\n });\n });\n }\n\n public preloadSticker(docId: DocId, isPremiumEffect?: boolean) {\n const doc = this.appDocsManager.getDoc(docId);\n return this.apiFileManager.downloadMedia({media: doc, thumb: isPremiumEffect ? doc.video_thumbs?.[0] : undefined});\n }\n\n private saveStickerSet(res: Omit, id: DocId) {\n const newSet: MessagesStickerSet = {\n _: 'messages.stickerSet',\n set: res.set,\n packs: res.packs,\n documents: res.documents as Document[],\n keywords: res.keywords\n };\n\n let stickerSet = this.storage.getFromCache(id);\n if(stickerSet) {\n Object.assign(stickerSet, newSet);\n } else {\n stickerSet = this.storage.setToCache(id, newSet);\n }\n\n if(stickerSet.set.short_name) {\n this.names[stickerSet.set.short_name] = this.getStickerSetInput(newSet.set) as any;\n }\n\n this.saveStickers(res.documents);\n\n // console.log('stickers wrote', this.stickerSets);\n const needSave = stickerSet.set.installed_date || LOCAL_IDS_SET.has(id as any);\n stickerSet.refreshTime = Date.now();\n this.storage.set({[id]: stickerSet}, !needSave);\n }\n\n public getStickerSetThumbDownloadOptions(stickerSet: StickerSet.stickerSet): DownloadOptions {\n const thumb = stickerSet.thumbs.find((thumb) => thumb._ === 'photoSize') as PhotoSize.photoSize;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: InputFileLocation.inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n thumb_version: stickerSet.thumb_version\n };\n\n return {dcId, location: input, size: thumb.size, mimeType: isAnimated ? 'application/x-tgsticker' : 'image/webp'};\n }\n\n /* public getStickerSetThumbURL(stickerSet: MTStickerSet) {\n const thumb = stickerSet.thumb;\n const dcId = stickerSet.thumb_dc_id;\n\n const isAnimated = stickerSet.pFlags?.animated;\n\n const input: inputStickerSetThumb = {\n _: 'inputStickerSetThumb',\n stickerset: this.getStickerSetInput(stickerSet),\n volume_id: thumb.location.volume_id,\n local_id: thumb.location.local_id\n };\n\n const url = getFileURL('document', this.getStickerSetThumbDownloadOptions(stickerSet));\n return url;\n\n //return promise;\n } */\n\n public getStickerSetInput(set: MyStickerSetInput): InputStickerSet {\n if(LOCAL_IDS_SET.has(set.id as any)) {\n return {\n _: set.id as any\n };\n } else if(!set.access_hash) {\n return {\n _: 'inputStickerSetShortName',\n short_name: '' + set.id\n };\n } else {\n return {\n _: 'inputStickerSetID',\n id: set.id,\n access_hash: set.access_hash\n };\n }\n }\n\n public async getFeaturedStickers() {\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.getFeaturedStickers',\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach((covered) => {\n this.saveStickerSet({set: covered.set, documents: [], packs: [], keywords: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n return res.sets;\n }\n\n public getPromoPremiumStickers() {\n return this.getStickersByEmoticon('⭐️⭐️', false);\n }\n\n public getPremiumStickers() {\n return this.getStickersByEmoticon('📂⭐️', false);\n }\n\n public getFavedStickers(overwrite?: boolean) {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getFavedStickers',\n processResult: (favedStickers) => {\n assumeType(favedStickers);\n this.saveStickers(favedStickers.stickers);\n this.favedStickers = favedStickers.stickers as MyDocument[];\n return favedStickers;\n },\n overwrite\n });\n }\n\n public getFavedStickersStickers(overwrite?: boolean) {\n if(overwrite) this.favedStickers = undefined;\n else if(this.favedStickers) return this.favedStickers;\n return this.getFavedStickers(overwrite).then(() => this.favedStickers);\n }\n\n public getFavedStickersLimit() {\n return this.apiManager.getLimit('favedStickers');\n }\n\n public async faveSticker(docId: DocId, unfave?: boolean) {\n if(!this.favedStickers) {\n await this.getFavedStickersStickers();\n }\n\n const limit = await this.getFavedStickersLimit();\n\n const doc = this.appDocsManager.getDoc(docId);\n findAndSplice(this.favedStickers, (_doc) => _doc.id === doc.id);\n\n if(!unfave) {\n this.favedStickers.unshift(doc);\n const spliced = this.favedStickers.splice(limit, this.favedStickers.length - limit);\n }\n\n this.rootScope.dispatchEvent('sticker_updated', {type: 'faved', faved: !unfave, document: doc});\n\n return this.apiManager.invokeApi('messages.faveSticker', {\n id: getDocumentInput(doc),\n unfave\n }).then(() => {\n if(unfave) {\n this.onStickersUpdated('faved', true);\n }\n });\n }\n\n public async toggleStickerSet(set: StickerSet.stickerSet) {\n set = this.storage.getFromCache(set.id).set;\n\n if(set.installed_date) {\n const res = await this.apiManager.invokeApi('messages.uninstallStickerSet', {\n stickerset: this.getStickerSetInput(set)\n });\n\n if(res) {\n delete set.installed_date;\n this.rootScope.dispatchEvent('stickers_deleted', set);\n this.storage.delete(set.id, true);\n return true;\n }\n } else {\n const res = await this.apiManager.invokeApi('messages.installStickerSet', {\n stickerset: this.getStickerSetInput(set),\n archived: false\n });\n\n if(res) {\n set.installed_date = Date.now() / 1000 | 0;\n this.rootScope.dispatchEvent('stickers_installed', set);\n return true;\n }\n }\n\n return false;\n }\n\n public toggleStickerSets(sets: StickerSet.stickerSet[]) {\n return Promise.all(sets.map((set) => this.toggleStickerSet(set)));\n }\n\n public async searchStickerSets(query: string, excludeFeatured = true) {\n const flags = excludeFeatured ? 1 : 0;\n const res = await this.apiManager.invokeApiHashable({\n method: 'messages.searchStickerSets',\n params: {\n flags,\n exclude_featured: excludeFeatured || undefined,\n q: query\n },\n processResult: (res) => {\n assumeType(res);\n\n forEachReverse(res.sets, (covered, idx, arr) => {\n if(covered.set.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n res.sets.forEach((covered) => {\n this.saveStickerSet({set: covered.set, documents: [], packs: [], keywords: []}, covered.set.id);\n });\n\n return res;\n }\n });\n\n const foundSaved: StickerSetCovered[] = [];\n const cache = this.storage.getCache();\n for(const id in cache) {\n const {set} = cache[id];\n\n if(set.title.toLowerCase().includes(query.toLowerCase()) && !res.sets.find((c) => c.set.id === set.id)) {\n foundSaved.push({_: 'stickerSetCovered', set, cover: null});\n }\n }\n\n return res.sets.concat(foundSaved);\n }\n\n private processAllStickersResult = (allStickers: MessagesAllStickers) => {\n assumeType(allStickers);\n\n forEachReverse(allStickers.sets, (stickerSet, idx, arr) => {\n if(stickerSet.pFlags.videos && !getEnvironment().IS_WEBM_SUPPORTED) {\n arr.splice(idx, 1);\n }\n });\n\n return allStickers;\n };\n\n public getAllStickers() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getAllStickers',\n processResult: this.processAllStickersResult\n });\n }\n\n public getEmojiStickers() {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getEmojiStickers',\n processResult: this.processAllStickersResult\n });\n }\n\n public preloadStickerSets() {\n return this.getAllStickers().then((allStickers) => {\n return Promise.all((allStickers as MessagesAllStickers.messagesAllStickers).sets.map((set) => this.getStickerSet(set, {useCache: true})));\n });\n }\n\n // TODO: detect \"🤷\" by \"🤷‍♂️\"\n public getStickersByEmoticon(emoticon: string, includeOurStickers = true) {\n emoticon = fixEmoji(emoticon);\n if(this.getStickersByEmoticonsPromises[emoticon]) return this.getStickersByEmoticonsPromises[emoticon];\n\n return this.getStickersByEmoticonsPromises[emoticon] = Promise.all([\n this.apiManager.invokeApiHashable({\n method: 'messages.getStickers',\n params: {\n emoticon\n },\n processResult: (stickers) => stickers\n }),\n includeOurStickers ? this.preloadStickerSets() : [],\n includeOurStickers ? this.getRecentStickers() : undefined\n ]).then(([messagesStickers, installedSets, recentStickers]) => {\n const foundStickers = (messagesStickers as MessagesStickers.messagesStickers).stickers.map((sticker) => this.appDocsManager.saveDoc(sticker));\n const cachedStickersAnimated: Document.document[] = [], cachedStickersStatic: Document.document[] = [];\n\n // console.log('getStickersByEmoticon', messagesStickers, installedSets, recentStickers);\n\n const iteratePacks = (packs: StickerPack.stickerPack[]) => {\n for(const pack of packs) {\n const packEmoticon = fixEmoji(pack.emoticon);\n if(packEmoticon.includes(emoticon)) {\n for(const docId of pack.documents) {\n const doc = this.appDocsManager.getDoc(docId);\n (doc.animated ? cachedStickersAnimated : cachedStickersStatic).push(doc);\n }\n }\n }\n };\n\n if(recentStickers) {\n iteratePacks(recentStickers.packs);\n const stickers = recentStickers.stickers;\n [cachedStickersAnimated, cachedStickersStatic].forEach((s) => {\n s.sort((a, b) => stickers.indexOf(a) - stickers.indexOf(b));\n });\n }\n\n for(const set of installedSets) {\n iteratePacks(set.packs);\n }\n\n /* const entities = parseEntities(emoticon);\n if(entities.length === 1) {\n [cachedStickersAnimated, cachedStickersStatic].forEach((s) => {\n forEachReverse(s, (doc, idx) => {\n const docEmoticon = fixEmoji(doc.stickerEmojiRaw);\n if(docEmoticon !== emoticon) {\n s.splice(idx, 1);\n }\n });\n });\n } */\n\n const stickers = [...new Set(cachedStickersAnimated.concat(cachedStickersStatic, foundStickers))]/* .filter((doc) => !doc.animated) */;\n\n forEachReverse(stickers, (sticker, idx, arr) => {\n if((sticker.sticker === 3 && !getEnvironment().IS_WEBM_SUPPORTED) ||\n (!this.rootScope.premium && getStickerEffectThumb(sticker))) {\n arr.splice(idx, 1);\n }\n });\n\n return stickers;\n });\n }\n\n public clearRecentStickers() {\n if(this.recentStickers) {\n this.recentStickers.length = 0;\n this.onStickersUpdated('recent', false);\n }\n\n return this.apiManager.invokeApi('messages.clearRecentStickers');\n }\n}\n","export default function fixBase64String(str: string, toUrl: boolean) {\n if(toUrl) {\n return str.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/\\=+$/, '');\n } else {\n return str.replace(/-/g, '+').replace(/_/g, '/');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport filterUnique from '../../helpers/array/filterUnique';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport cleanSearchText from '../../helpers/cleanSearchText';\nimport cleanUsername from '../../helpers/cleanUsername';\nimport tsNow from '../../helpers/tsNow';\nimport isObject from '../../helpers/object/isObject';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {isRestricted} from '../../helpers/restrictions';\nimport {Chat, ContactsResolvedPeer, InputContact, InputGeoPoint, InputMedia, InputPeer, InputUser, User as MTUser, UserProfilePhoto, UserStatus} from '../../layer';\nimport parseEntities from '../richTextProcessor/parseEntities';\nimport wrapUrl from '../richTextProcessor/wrapUrl';\nimport SearchIndex from '../searchIndex';\nimport {AppManager} from './manager';\nimport getPeerId from './utils/peers/getPeerId';\nimport canSendToUser from './utils/users/canSendToUser';\nimport {AppStoragesManager} from './appStoragesManager';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport getPeerActiveUsernames from './utils/peers/getPeerActiveUsernames';\n\nexport type User = MTUser.user;\nexport type TopPeerType = 'correspondents' | 'bots_inline';\nexport type MyTopPeer = {id: PeerId, rating: number};\n\nexport class AppUsersManager extends AppManager {\n private storage: AppStoragesManager['storages']['users'];\n\n private users: {[userId: UserId]: User};\n private usernames: {[username: string]: PeerId};\n private contactsIndex: SearchIndex;\n private contactsFillPromise: CancellablePromise;\n private contactsList: Set;\n private updatedContactsList: boolean;\n\n private getTopPeersPromises: {[type in TopPeerType]?: Promise};\n\n protected after() {\n this.clear(true);\n\n setInterval(this.updateUsersStatuses, 60000);\n\n this.rootScope.addEventListener('state_synchronized', this.updateUsersStatuses);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateUserStatus: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n user.status = update.status;\n if(user.status) {\n if('expires' in user.status) {\n user.status.expires -= this.timeManager.getServerTimeOffset();\n }\n\n if('was_online' in user.status) {\n user.status.was_online -= this.timeManager.getServerTimeOffset();\n }\n }\n\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.rootScope.dispatchEvent('user_update', userId);\n this.setUserToStateIfNeeded(user);\n } // ////else console.warn('No user by id:', userId);\n },\n\n // updateUserPhoto: (update) => {\n // const userId = update.user_id;\n // const user = this.users[userId];\n // if(user) {\n // if((user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id === (update.photo as UserProfilePhoto.userProfilePhoto)?.photo_id) {\n // return;\n // }\n\n // this.forceUserOnline(userId, update.date);\n\n // if(update.photo._ === 'userProfilePhotoEmpty') {\n // delete user.photo;\n // } else {\n // user.photo = safeReplaceObject(user.photo, update.photo);\n // }\n\n // this.setUserToStateIfNeeded(user);\n\n // this.rootScope.dispatchEvent('user_update', userId);\n // this.rootScope.dispatchEvent('avatar_update', userId.toPeerId());\n // } else console.warn('No user by id:', userId);\n // },\n\n updateUserName: (update) => {\n const userId = update.user_id;\n const user = this.users[userId];\n if(user) {\n this.forceUserOnline(userId);\n\n this.saveApiUser({\n ...user,\n first_name: update.first_name,\n last_name: update.last_name,\n username: undefined,\n usernames: update.usernames\n }, true);\n }\n }\n });\n\n /* case 'updateContactLink':\n this.onContactUpdated(update.user_id, update.my_link._ === 'contactLinkContact');\n break; */\n\n this.rootScope.addEventListener('language_change', (e) => {\n const userId = this.getSelf().id;\n this.contactsIndex.indexObject(userId, this.getUserSearchText(userId));\n });\n\n return Promise.all([\n this.appStateManager.getState(),\n this.appStoragesManager.loadStorage('users')\n ]).then(([state, {results: users, storage}]) => {\n this.storage = storage;\n\n this.saveApiUsers(users);\n for(let i = 0, length = users.length; i < length; ++i) {\n const user = users[i];\n if(!user) {\n continue;\n }\n\n if(state.contactsListCachedTime && (user.pFlags.contact || user.pFlags.mutual_contact)) {\n this.pushContact(user.id);\n\n if(!this.contactsFillPromise) {\n this.contactsFillPromise = deferredPromise();\n this.contactsFillPromise.resolve(this.contactsList);\n }\n }\n }\n\n // const contactsList = state.contactsList;\n // if(Array.isArray(contactsList)) {\n // contactsList.forEach((userId) => {\n // this.pushContact(userId);\n // });\n\n // if(contactsList.length) {\n // this.contactsFillPromise = deferredPromise();\n // this.contactsFillPromise.resolve(this.contactsList);\n // }\n // }\n\n const recentSearch = state.recentSearch || [];\n for(let i = 0, length = recentSearch.length; i < length; ++i) {\n this.peersStorage.requestPeer(recentSearch[i], 'recentSearch');\n }\n\n this.peersStorage.addEventListener('peerNeeded', (peerId) => {\n if(!this.appPeersManager.isUser(peerId)) {\n return;\n }\n\n const userId = peerId.toUserId();\n if(!this.storage.getFromCache(userId)) {\n this.storage.set({\n [userId]: this.getUser(userId)\n });\n }\n });\n\n this.peersStorage.addEventListener('peerUnneeded', (peerId) => {\n if(!this.appPeersManager.isUser(peerId)) {\n return;\n }\n\n const userId = peerId.toUserId();\n if(this.storage.getFromCache(userId)) {\n this.storage.delete(userId);\n }\n });\n });\n }\n\n public clear = (init = false) => {\n if(!init) {\n for(const userId in this.users) {\n // const userId = +userId;\n if(!userId) continue;\n const peerId = userId.toPeerId();\n if(!this.peersStorage.isPeerNeeded(peerId)) {\n const user = this.users[userId];\n this.modifyUsernamesCache(user, false);\n\n this.storage.delete(userId);\n delete this.users[userId];\n }\n }\n } else {\n this.users = {};\n this.usernames = {};\n }\n\n this.getTopPeersPromises = {};\n this.contactsIndex = this.createSearchIndex();\n this.contactsFillPromise = undefined;\n this.contactsList = new Set();\n this.updatedContactsList = false;\n };\n\n public get userId() {\n return this.rootScope.myId.toUserId();\n }\n\n private onContactsModified(fromServer?: boolean) {\n // const contactsList = [...this.contactsList];\n // this.appStateManager.pushToState('contactsList', contactsList);\n\n if(fromServer) {\n this.appStateManager.pushToState('contactsListCachedTime', tsNow(true));\n }\n }\n\n public pushRecentSearch(peerId: PeerId) {\n return this.appStateManager.getState().then((state) => {\n const recentSearch = state.recentSearch || [];\n if(recentSearch[0] !== peerId) {\n indexOfAndSplice(recentSearch, peerId);\n recentSearch.unshift(peerId);\n if(recentSearch.length > 20) {\n recentSearch.length = 20;\n }\n\n this.appStateManager.pushToState('recentSearch', recentSearch);\n for(const peerId of recentSearch) {\n this.peersStorage.requestPeer(peerId, 'recentSearch');\n }\n }\n });\n }\n\n public clearRecentSearch() {\n return this.appStateManager.getState().then((state) => {\n const recentSearch = state.recentSearch || [];\n for(const peerId of recentSearch) {\n this.peersStorage.releasePeer(peerId, 'recentSearch');\n }\n\n recentSearch.length = 0;\n this.appStateManager.pushToState('recentSearch', recentSearch);\n });\n }\n\n public fillContacts() {\n if(this.contactsFillPromise && this.updatedContactsList) {\n return {\n cached: this.contactsFillPromise.isFulfilled,\n promise: this.contactsFillPromise\n };\n }\n\n this.updatedContactsList = true;\n\n const promise = deferredPromise>();\n this.apiManager.invokeApi('contacts.getContacts').then((result) => {\n if(result._ === 'contacts.contacts') {\n this.contactsList.clear();\n\n this.saveApiUsers(result.users);\n\n result.contacts.forEach((contact) => {\n this.pushContact(contact.user_id);\n });\n\n this.onContactsModified(true);\n\n this.contactsFillPromise = promise;\n }\n\n promise.resolve(this.contactsList);\n }, () => {\n this.updatedContactsList = false;\n });\n\n return {\n cached: this.contactsFillPromise?.isFulfilled,\n promise: this.contactsFillPromise ||= promise\n };\n }\n\n public resolveUsername(username: string): Promise | Chat | User {\n if(username[0] === '@') {\n username = username.slice(1);\n }\n\n username = username.toLowerCase();\n const peerId = this.usernames[username];\n if(peerId) {\n return this.appPeersManager.getPeer(peerId);\n }\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'contacts.resolveUsername',\n params: {username},\n processResult: (resolvedPeer) => this.processResolvedPeer(resolvedPeer)\n });\n }\n\n private processResolvedPeer(resolvedPeer: ContactsResolvedPeer.contactsResolvedPeer) {\n this.saveApiUsers(resolvedPeer.users);\n this.appChatsManager.saveApiChats(resolvedPeer.chats);\n\n return this.appPeersManager.getPeer(getPeerId(resolvedPeer.peer)) as Chat | User;\n }\n\n public resolvePhone(phone: string) {\n return this.apiManager.invokeApi('contacts.resolvePhone', {phone}).then((resolvedPeer) => {\n return this.processResolvedPeer(resolvedPeer) as User;\n });\n }\n\n private pushContact(id: UserId) {\n this.contactsList.add(id);\n this.contactsIndex.indexObject(id, this.getUserSearchText(id));\n this.peersStorage.requestPeer(id.toPeerId(), 'contact');\n }\n\n private popContact(id: UserId) {\n this.contactsList.delete(id);\n this.contactsIndex.indexObject(id, ''); // delete search index\n this.peersStorage.releasePeer(id.toPeerId(), 'contact');\n }\n\n public getUserSearchText(id: UserId) {\n const user = this.users[id];\n if(!user) {\n return '';\n }\n\n const arr: string[] = [\n user.first_name,\n user.last_name,\n user.phone,\n ...getPeerActiveUsernames(user),\n // user.pFlags.self ? I18n.format('SavedMessages', true) : '',\n user.pFlags.self ? 'Saved Messages' : ''\n ];\n\n return arr.filter(Boolean).join(' ');\n }\n\n public getContacts(query?: string, includeSaved = false, sortBy: 'name' | 'online' | 'none' = 'name') {\n return this.fillContacts().promise.then((_contactsList) => {\n let contactsList = [..._contactsList];\n if(query) {\n const results = this.contactsIndex.search(query);\n const filteredContactsList = [...contactsList].filter((id) => results.has(id));\n\n contactsList = filteredContactsList;\n }\n\n if(sortBy === 'name') {\n contactsList.sort((userId1, userId2) => {\n const sortName1 = (this.users[userId1] || {}).sortName || '';\n const sortName2 = (this.users[userId2] || {}).sortName || '';\n return sortName1.localeCompare(sortName2);\n });\n } else if(sortBy === 'online') {\n contactsList.sort((userId1, userId2) => {\n const status1 = this.getUserStatusForSort(this.getUser(userId1).status);\n const status2 = this.getUserStatusForSort(this.getUser(userId2).status);\n return status2 - status1;\n });\n }\n\n const myUserId = this.userId;\n indexOfAndSplice(contactsList, myUserId);\n if(includeSaved) {\n if(this.testSelfSearch(query)) {\n contactsList.unshift(myUserId);\n }\n }\n\n return contactsList;\n });\n }\n\n public getContactsPeerIds(\n query?: Parameters[0],\n includeSaved?: Parameters[1],\n sortBy?: Parameters[2],\n limit?: number\n ) {\n return this.getContacts(query, includeSaved, sortBy).then((userIds) => {\n const peerIds = userIds.map((userId) => userId.toPeerId(false));\n if(limit) {\n return peerIds.slice(0, limit);\n }\n\n return peerIds;\n });\n }\n\n public toggleBlock(peerId: PeerId, block: boolean) {\n return this.apiManager.invokeApiSingle(block ? 'contacts.block' : 'contacts.unblock', {\n id: this.appPeersManager.getInputPeerById(peerId)\n }).then((value) => {\n if(value) {\n this.apiUpdatesManager.processLocalUpdate({\n _: 'updatePeerBlocked',\n peer_id: this.appPeersManager.getOutputPeer(peerId),\n blocked: block\n });\n }\n\n return value;\n });\n }\n\n public testSelfSearch(query: string) {\n const user = this.getSelf();\n const index = this.createSearchIndex();\n index.indexObject(user.id, this.getUserSearchText(user.id));\n return index.search(query).has(user.id);\n }\n\n private createSearchIndex() {\n return new SearchIndex({\n clearBadChars: true,\n ignoreCase: true,\n latinize: true,\n includeTag: true\n });\n }\n\n public saveApiUsers(apiUsers: MTUser[], override?: boolean) {\n if((apiUsers as any).saved) return;\n (apiUsers as any).saved = true;\n apiUsers.forEach((user) => this.saveApiUser(user, override));\n }\n\n public modifyUsernamesCache(peer: Parameters[0], save: boolean) {\n const usernames = getPeerActiveUsernames(peer);\n if(!usernames.length) {\n return;\n }\n\n const cleanedUsernames = usernames.map((username) => cleanUsername(username));\n if(save) {\n cleanedUsernames.forEach((searchUsername) => {\n this.usernames[searchUsername] = peer.id.toPeerId(peer._ !== 'user');\n });\n } else {\n cleanedUsernames.forEach((searchUsername) => {\n delete this.usernames[searchUsername];\n });\n }\n }\n\n public setUsernameToCache(peer: Parameters[0], oldPeer?: typeof peer) {\n if(\n !oldPeer ||\n (oldPeer as MTUser.user).username !== (peer as MTUser.user).username ||\n !deepEqual((oldPeer as MTUser.user).usernames, (peer as MTUser.user).usernames)\n ) {\n this.modifyUsernamesCache(oldPeer, false);\n this.modifyUsernamesCache(peer, true);\n\n return true;\n }\n\n return false;\n }\n\n public saveApiUser(user: MTUser, override?: boolean) {\n if(!user || user._ === 'userEmpty') return;\n\n const userId = user.id;\n const oldUser = this.users[userId];\n\n // ! commented block can affect performance !\n // if(oldUser && !override) {\n // console.log('saveApiUser same');\n // return;\n // }\n\n user.pFlags ??= {};\n\n if(user.pFlags.min && oldUser !== undefined) {\n return;\n }\n\n // * exclude from state\n // defineNotNumerableProperties(user, ['initials', 'num', 'rFirstName', 'rFullName', 'rPhone', 'sortName', 'sortStatus']);\n\n const changedUsername = this.setUsernameToCache(user, oldUser);\n\n if(!oldUser ||\n oldUser.sortName === undefined ||\n oldUser.first_name !== user.first_name ||\n oldUser.last_name !== user.last_name) {\n const fullName = user.first_name + (user.last_name ? ' ' + user.last_name : '');\n\n user.sortName = user.pFlags.deleted ? '' : cleanSearchText(fullName, false);\n } else {\n user.sortName = oldUser.sortName;\n }\n\n if(user.status) {\n if((user.status as UserStatus.userStatusOnline).expires) {\n (user.status as UserStatus.userStatusOnline).expires -= this.timeManager.getServerTimeOffset();\n }\n\n if((user.status as UserStatus.userStatusOffline).was_online) {\n (user.status as UserStatus.userStatusOffline).was_online -= this.timeManager.getServerTimeOffset();\n }\n }\n\n if((user as User).photo?._ === 'userProfilePhotoEmpty') {\n delete (user as User).photo;\n }\n\n // user.sortStatus = user.pFlags.bot ? -1 : this.getUserStatusForSort(user.status);\n\n // if(!user.username && user.usernames) {\n // user.username = user.usernames.find((username) => username.pFlags.active).username;\n // }\n\n if(oldUser === undefined) {\n this.users[userId] = user;\n } else {\n const changedTitle = user.first_name !== oldUser.first_name ||\n user.last_name !== oldUser.last_name ||\n changedUsername;\n\n const oldPhotoId = (oldUser.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const newPhotoId = (user.photo as UserProfilePhoto.userProfilePhoto)?.photo_id;\n const changedPhoto = oldPhotoId !== newPhotoId;\n\n const changedAnyBadge = oldUser.pFlags.premium !== user.pFlags.premium ||\n oldUser.pFlags.verified !== user.pFlags.verified ||\n oldUser.pFlags.scam !== user.pFlags.scam ||\n oldUser.pFlags.fake !== user.pFlags.fake;\n\n /* if(user.pFlags.bot && user.bot_info_version !== oldUser.bot_info_version) {\n\n } */\n\n const wasContact = !!oldUser.pFlags.contact;\n const newContact = !!user.pFlags.contact;\n\n safeReplaceObject(oldUser, user);\n this.rootScope.dispatchEvent('user_update', userId);\n\n if(wasContact !== newContact) {\n this.onContactUpdated(userId, newContact, wasContact);\n }\n\n if(changedPhoto) {\n this.rootScope.dispatchEvent('avatar_update', {peerId: user.id.toPeerId()});\n }\n\n if(changedTitle || changedAnyBadge) {\n this.rootScope.dispatchEvent('peer_title_edit', {peerId: user.id.toPeerId()});\n }\n }\n\n this.checkPremium(user, oldUser);\n this.setUserToStateIfNeeded(user);\n }\n\n private checkPremium(user: User, oldUser: User) {\n if(user.pFlags.self) {\n const isPremium = !!user.pFlags.premium;\n if(this.rootScope.premium !== isPremium) {\n this.rootScope.dispatchEvent('premium_toggle_private', {isNew: !oldUser, isPremium});\n }\n }\n }\n\n private setUserToStateIfNeeded(user: User) {\n if(this.peersStorage.isPeerNeeded(user.id.toPeerId())) {\n this.storage.set({\n [user.id]: user\n });\n }\n }\n\n public isUserOnlineVisible(id: UserId) {\n return this.getUserStatusForSort(id) > 3;\n }\n\n public getUserStatusForSort(status: User['status'] | UserId) {\n if(typeof(status) !== 'object') {\n const user = this.getUser(status);\n status = user?.status;\n }\n\n if(status) {\n const expires = status._ === 'userStatusOnline' ? status.expires : (status._ === 'userStatusOffline' ? status.was_online : 0);\n if(expires) {\n return expires;\n }\n\n /* const timeNow = tsNow(true);\n switch(status._) {\n case 'userStatusRecently':\n return timeNow - 86400 * 3;\n case 'userStatusLastWeek':\n return timeNow - 86400 * 7;\n case 'userStatusLastMonth':\n return timeNow - 86400 * 30;\n } */\n switch(status._) {\n case 'userStatusRecently':\n return 3;\n case 'userStatusLastWeek':\n return 2;\n case 'userStatusLastMonth':\n return 1;\n }\n }\n\n return 0;\n }\n\n public getUser(id: User | UserId) {\n if(isObject(id)) {\n return id;\n }\n\n return this.users[id];\n }\n\n public getUserStatus(id: UserId) {\n return this.isRegularUser(id) && !this.users[id].pFlags.self && this.users[id].status;\n }\n\n public async getUserPhone(id: UserId) {\n const user = this.getUser(id);\n if(!user?.phone) {\n return;\n }\n\n const appConfig = await this.apiManager.getAppConfig();\n return {\n phone: user.phone,\n isAnonymous: appConfig.fragment_prefixes.some((prefix) => user.phone.startsWith(prefix))\n };\n }\n\n public getSelf() {\n return this.getUser(this.userId);\n }\n\n public isBot(id: UserId) {\n return this.users[id] && !!this.users[id].pFlags.bot;\n }\n\n public isAttachMenuBot(id: UserId) {\n return this.isBot(id) && !!this.users[id].pFlags.bot_attach_menu;\n }\n\n public isContact(id: UserId) {\n return this.contactsList.has(id) || !!(this.users[id] && this.users[id].pFlags.contact);\n }\n\n public isRegularUser(id: UserId) {\n const user = this.users[id];\n return user && !this.isBot(id) && !user.pFlags.deleted && !user.pFlags.support;\n }\n\n public isNonContactUser(id: UserId) {\n return this.isRegularUser(id) && !this.isContact(id) && id !== this.userId;\n }\n\n public hasUser(id: UserId, allowMin?: boolean) {\n const user = this.users[id];\n return isObject(user) && (allowMin || !user.pFlags.min);\n }\n\n public getUserString(id: UserId) {\n const user = this.getUser(id);\n return 'u' + id + (user.access_hash ? '_' + user.access_hash : '');\n }\n\n public getUserInput(id: UserId): InputUser {\n const user = this.getUser(id);\n if(user.pFlags && user.pFlags.self) {\n return {_: 'inputUserSelf'};\n }\n\n return {\n _: 'inputUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getUserInputPeer(id: UserId): InputPeer.inputPeerSelf | InputPeer.inputPeerUser {\n const user = this.getUser(id);\n // ! do not use it, there are places that don't support it. need explicit peer id\n // if(user.pFlags?.self) {\n // return {_: 'inputPeerSelf'};\n // }\n\n return {\n _: 'inputPeerUser',\n user_id: id,\n access_hash: user.access_hash\n };\n }\n\n public getContactMediaInput(id: UserId): InputMedia.inputMediaContact {\n const user = this.getUser(id);\n\n return {\n _: 'inputMediaContact',\n first_name: user.first_name,\n last_name: user.last_name,\n phone_number: user.phone,\n vcard: '',\n user_id: id\n };\n }\n\n private updateUsersStatuses = () => {\n const timestampNow = tsNow(true);\n for(const i in this.users) {\n const user = this.users[i];\n this.updateUserStatus(user, timestampNow);\n }\n };\n\n private updateUserStatus(user: MTUser.user, timestampNow = tsNow(true)) {\n if(user.status &&\n user.status._ === 'userStatusOnline' &&\n user.status.expires < timestampNow) {\n user.status = {_: 'userStatusOffline', was_online: user.status.expires};\n this.rootScope.dispatchEvent('user_update', user.id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public forceUserOnline(id: UserId, eventTimestamp?: number) {\n if(this.isBot(id)) {\n return;\n }\n\n const timestamp = tsNow(true);\n const onlineTimeFor = 60;\n if(eventTimestamp) {\n if((timestamp - eventTimestamp) >= onlineTimeFor) {\n return;\n }\n } else if(this.apiUpdatesManager.updatesState.syncLoading) {\n return;\n }\n\n const user = this.getUser(id);\n if(user?.status &&\n user.status._ !== 'userStatusOnline' &&\n user.status._ !== 'userStatusEmpty' &&\n !user.pFlags.support &&\n !user.pFlags.deleted) {\n user.status = {\n _: 'userStatusOnline',\n expires: timestamp + onlineTimeFor\n };\n\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.rootScope.dispatchEvent('user_update', id);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public importContact(first_name: string, last_name: string, phone: string) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]).then((userIds) => {\n if(!userIds.length) {\n const error = new Error();\n (error as any).type = 'NO_USER';\n throw error;\n }\n\n return userIds[0];\n });\n }\n\n public importContacts(contacts: {phones: string[], first_name: string, last_name: string}[]) {\n const inputContacts: InputContact[] = [];\n\n for(let i = 0; i < contacts.length; ++i) {\n for(let j = 0; j < contacts[i].phones.length; ++j) {\n inputContacts.push({\n _: 'inputPhoneContact',\n client_id: (i << 16 | j).toString(10),\n phone: contacts[i].phones[j],\n first_name: contacts[i].first_name,\n last_name: contacts[i].last_name\n });\n }\n }\n\n return this.apiManager.invokeApi('contacts.importContacts', {\n contacts: inputContacts\n }).then((importedContactsResult) => {\n this.saveApiUsers(importedContactsResult.users);\n\n const userIds = importedContactsResult.imported.map((importedContact) => {\n this.onContactUpdated(importedContact.user_id, true);\n return importedContact.user_id;\n });\n\n return userIds;\n });\n }\n\n public getTopPeers(type: TopPeerType) {\n if(this.getTopPeersPromises[type]) return this.getTopPeersPromises[type];\n\n return this.getTopPeersPromises[type] = this.appStateManager.getState().then((state) => {\n const cached = state.topPeersCache[type];\n if(cached && (cached.cachedTime + 86400e3) > Date.now() && cached.peers) {\n return cached.peers;\n }\n\n return this.apiManager.invokeApi('contacts.getTopPeers', {\n [type]: true,\n offset: 0,\n limit: 15,\n hash: '0'\n }).then((result) => {\n let topPeers: MyTopPeer[] = [];\n if(result._ === 'contacts.topPeers') {\n // console.log(result);\n this.saveApiUsers(result.users);\n this.appChatsManager.saveApiChats(result.chats);\n\n if(result.categories.length) {\n topPeers = result.categories[0].peers.map((topPeer) => {\n const peerId = getPeerId(topPeer.peer);\n this.peersStorage.requestPeer(peerId, 'topPeer');\n return {id: peerId, rating: topPeer.rating};\n });\n }\n }\n\n state.topPeersCache[type] = {\n peers: topPeers,\n cachedTime: Date.now()\n };\n this.appStateManager.pushToState('topPeersCache', state.topPeersCache);\n\n return topPeers;\n });\n });\n }\n\n public getBlocked(offset = 0, limit = 0) {\n return this.apiManager.invokeApiSingle('contacts.getBlocked', {offset, limit}).then((contactsBlocked) => {\n this.saveApiUsers(contactsBlocked.users);\n this.appChatsManager.saveApiChats(contactsBlocked.chats);\n const count = contactsBlocked._ === 'contacts.blocked' ? contactsBlocked.users.length + contactsBlocked.chats.length : contactsBlocked.count;\n\n const peerIds: PeerId[] = contactsBlocked.users.map((u) => u.id.toPeerId()).concat(contactsBlocked.chats.map((c) => c.id.toPeerId(true)));\n\n return {count, peerIds};\n });\n }\n\n public getLocated(\n lat: number,\n long: number,\n accuracy_radius: number,\n background: boolean = false,\n self_expires: number = 0\n ) {\n const geo_point: InputGeoPoint = {\n _: 'inputGeoPoint',\n lat,\n long,\n accuracy_radius\n };\n\n return this.apiManager.invokeApi('contacts.getLocated', {\n geo_point,\n background\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates);\n return updates;\n });\n }\n\n /* public searchContacts(query: string, limit = 20) {\n return Promise.all([\n this.getContacts(query),\n apiManager.invokeApi('contacts.search', {\n q: query,\n limit\n })\n ]).then((results) => {\n const [myContacts, peers] = results;\n\n this.saveApiUsers(peers.users);\n appChatsManager.saveApiChats(peers.chats);\n\n // * contacts.search returns duplicates in my_results\n const myResults = new Set(myContacts.concat(peers.my_results.map((p) => appPeersManager.getPeerID(p))));\n\n const out = {\n my_results: [...myResults].slice(0, limit),\n results: peers.results.map((p) => appPeersManager.getPeerID(p))\n };\n\n return out;\n });\n } */\n public searchContacts(query: string, limit = 20) {\n // handle 't.me/username' as 'username'\n const entities = parseEntities(query);\n if(entities.length && entities[0].length === query.trim().length && entities[0]._ === 'messageEntityUrl') {\n try {\n const url = new URL(wrapUrl(query).url);\n const path = url.pathname.slice(1);\n if(path) {\n query = path;\n }\n } catch(err) {}\n }\n\n return this.apiManager.invokeApiCacheable('contacts.search', {\n q: query,\n limit\n }, {cacheSeconds: 60}).then((peers) => {\n this.saveApiUsers(peers.users);\n this.appChatsManager.saveApiChats(peers.chats);\n\n const out = {\n my_results: filterUnique(peers.my_results.map((p) => getPeerId(p))), // ! contacts.search returns duplicates in my_results\n results: peers.results.map((p) => getPeerId(p))\n };\n\n return out;\n });\n }\n\n private onContactUpdated(userId: UserId, isContact: boolean, curIsContact = this.isContact(userId)) {\n if(isContact !== curIsContact) {\n if(isContact) {\n this.pushContact(userId);\n } else {\n this.popContact(userId);\n }\n\n this.onContactsModified();\n\n this.rootScope.dispatchEvent('contacts_update', userId);\n }\n }\n\n public updateUsername(username: string) {\n return this.apiManager.invokeApi('account.updateUsername', {\n username\n }).then((user) => {\n this.saveApiUser(user);\n });\n }\n\n public setUserStatus(userId: UserId, offline: boolean) {\n if(this.isBot(userId)) {\n return;\n }\n\n const user = this.users[userId];\n if(user) {\n const status: UserStatus = offline ? {\n _: 'userStatusOffline',\n was_online: tsNow(true)\n } : {\n _: 'userStatusOnline',\n expires: tsNow(true) + 50\n };\n\n user.status = status;\n // user.sortStatus = this.getUserStatusForSort(user.status);\n this.rootScope.dispatchEvent('user_update', userId);\n\n this.setUserToStateIfNeeded(user);\n }\n }\n\n public updateMyOnlineStatus(offline: boolean) {\n this.setUserStatus(this.getSelf().id, offline);\n return this.apiManager.invokeApiSingle('account.updateStatus', {offline});\n }\n\n public addContact(userId: UserId, first_name: string, last_name: string, phone: string, addPhonePrivacyException?: boolean) {\n /* if(!userId) {\n return this.importContacts([{\n first_name,\n last_name,\n phones: [phone]\n }]);\n } */\n\n return this.apiManager.invokeApi('contacts.addContact', {\n id: this.getUserInput(userId),\n first_name,\n last_name,\n phone,\n add_phone_privacy_exception: addPhonePrivacyException\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n this.onContactUpdated(userId, true);\n });\n }\n\n public deleteContacts(userIds: UserId[]) {\n return this.apiManager.invokeApi('contacts.deleteContacts', {\n id: userIds.map((userId) => this.getUserInput(userId))\n }).then((updates) => {\n this.apiUpdatesManager.processUpdateMessage(updates, {override: true});\n\n userIds.forEach((userId) => {\n this.onContactUpdated(userId, false);\n });\n });\n }\n\n public checkUsername(username: string) {\n return this.apiManager.invokeApi('account.checkUsername', {username});\n }\n\n public toggleUsername(username: string, active: boolean) {\n return this.apiManager.invokeApi('account.toggleUsername', {username, active});\n }\n\n public reorderUsernames(usernames: string[]) {\n return this.apiManager.invokeApi('account.reorderUsernames', {order: usernames});\n }\n\n public canSendToUser(userId: UserId) {\n return canSendToUser(this.getUser(userId));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nexport default function cleanUsername(username: string) {\n return username && username.toLowerCase() || '';\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {ReferenceContext} from '../mtproto/referenceDatabase';\nimport {WebPage} from '../../layer';\nimport safeReplaceObject from '../../helpers/object/safeReplaceObject';\nimport {AppManager} from './manager';\n\nconst photoTypeSet = new Set(['photo', 'video', 'gif', 'document']);\n\ntype WebPageMessageKey = `${PeerId}_${number}`;\n\nexport class AppWebPagesManager extends AppManager {\n private webpages: {\n [webPageId: string]: WebPage\n } = {};\n private pendingWebPages: {\n [webPageId: string]: Set\n } = {};\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateWebPage: (update) => {\n this.saveWebPage(update.webpage);\n }\n });\n }\n\n public saveWebPage(apiWebPage: WebPage, messageKey?: WebPageMessageKey, mediaContext?: ReferenceContext) {\n if(apiWebPage._ === 'webPageNotModified' || apiWebPage._ === 'webPageEmpty') return;\n const {id} = apiWebPage;\n\n const oldWebPage = this.webpages[id];\n const isUpdated = oldWebPage &&\n oldWebPage._ === apiWebPage._ &&\n (oldWebPage as WebPage.webPage).hash === (oldWebPage as WebPage.webPage).hash;\n\n if(apiWebPage._ === 'webPage') {\n if(apiWebPage.photo?._ === 'photo') {\n apiWebPage.photo = this.appPhotosManager.savePhoto(apiWebPage.photo, mediaContext);\n } else {\n delete apiWebPage.photo;\n }\n\n if(apiWebPage.document?._ === 'document') {\n apiWebPage.document = this.appDocsManager.saveDoc(apiWebPage.document, mediaContext);\n } else {\n if(apiWebPage.type === 'document') {\n delete apiWebPage.type;\n }\n\n delete apiWebPage.document;\n }\n\n const siteName = apiWebPage.site_name;\n const shortTitle = apiWebPage.title || apiWebPage.author || siteName || '';\n if(siteName && shortTitle === siteName) {\n delete apiWebPage.site_name;\n }\n\n // delete apiWebPage.description\n\n if(!photoTypeSet.has(apiWebPage.type) &&\n !apiWebPage.description &&\n apiWebPage.photo) {\n apiWebPage.type = 'photo';\n }\n }\n\n let pendingSet = this.pendingWebPages[id];\n if(messageKey) {\n if(!pendingSet) pendingSet = this.pendingWebPages[id] = new Set();\n pendingSet.add(messageKey);\n }\n\n if(oldWebPage === undefined) {\n this.webpages[id] = apiWebPage;\n } else {\n safeReplaceObject(oldWebPage, apiWebPage);\n }\n\n if(!messageKey && pendingSet !== undefined && isUpdated) {\n const msgs: {peerId: PeerId, mid: number, isScheduled: boolean}[] = [];\n pendingSet.forEach((value) => {\n const [peerId, mid, isScheduled] = value.split('_');\n msgs.push({\n peerId: peerId.toPeerId(),\n mid: +mid,\n isScheduled: !!isScheduled\n });\n });\n\n this.rootScope.dispatchEvent('webpage_updated', {\n id,\n msgs\n });\n }\n\n return apiWebPage;\n }\n\n public getMessageKeyForPendingWebPage(peerId: PeerId, mid: number, isScheduled?: boolean): WebPageMessageKey {\n return peerId + '_' + mid + (isScheduled ? '_s' : '') as any;\n }\n\n public deleteWebPageFromPending(webPage: WebPage, messageKey: WebPageMessageKey) {\n const id = (webPage as WebPage.webPage).id;\n if(!id) return;\n\n const set = this.pendingWebPages[id];\n if(set && set.has(messageKey)) {\n set.delete(messageKey);\n\n if(!set.size) {\n delete this.pendingWebPages[id];\n }\n }\n }\n\n public getCachedWebPage(id: WebPage.webPage['id']) {\n return this.webpages[id];\n }\n\n public getWebPage(url: string) {\n return this.apiManager.invokeApiHashable({\n method: 'messages.getWebPage',\n processResult: (webPage) => {\n return this.saveWebPage(webPage);\n },\n params: {\n url\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\n","export default function fileNameRFC(fileName: string) {\n // Make filename RFC5987 compatible\n return encodeURIComponent(fileName).replace(/['()]/g, escape).replace(/\\*/g, '%2A');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {getServiceMessagePort} from '../mtproto/mtproto.worker';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport StreamWriter from './streamWriter';\n\nexport default class DownloadWriter implements StreamWriter {\n constructor(\n private serviceMessagePort: ServiceMessagePort,\n private downloadId: string\n ) {\n this.serviceMessagePort = getServiceMessagePort();\n }\n\n public async write(part: Uint8Array, offset?: number) {\n return this.serviceMessagePort.invoke('downloadChunk', {\n id: this.downloadId,\n chunk: part\n });\n }\n\n public finalize(saveToStorage?: boolean): Promise {\n return this.serviceMessagePort.invoke('downloadFinalize', this.downloadId).then(() => undefined);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport deferredPromise from '../../helpers/cancellablePromise';\nimport makeError from '../../helpers/makeError';\nimport fileNameRFC from '../../helpers/string/fileNameRFC';\nimport {getServiceMessagePort} from '../mtproto/mtproto.worker';\nimport DownloadWriter from './downloadWriter';\nimport FileStorage from './fileStorage';\n\nexport default class DownloadStorage implements FileStorage {\n public getFile(fileName: string): Promise {\n return Promise.reject(makeError('NO_ENTRY_FOUND'));\n }\n\n public prepareWriting({fileName, downloadId, size}: {\n fileName: string,\n downloadId: string,\n size: number\n }) {\n const headers = {\n 'Content-Type': 'application/octet-stream; charset=utf-8',\n 'Content-Disposition': 'attachment; filename*=UTF-8\\'\\'' + fileNameRFC(fileName),\n ...(size ? {'Content-Length': size} : {})\n };\n\n const serviceMessagePort = getServiceMessagePort();\n const promise = serviceMessagePort.invoke('download', {\n headers,\n id: downloadId\n });\n\n const deferred = deferredPromise();\n deferred.cancel = () => {\n deferred.reject(makeError('DOWNLOAD_CANCELED'));\n };\n\n deferred.catch(() => {\n getServiceMessagePort().invoke('downloadCancel', downloadId);\n });\n\n promise.then(deferred.resolve, deferred.reject);\n\n return {\n deferred,\n getWriter: () => {\n return new DownloadWriter(serviceMessagePort, downloadId);\n }\n };\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {ReferenceBytes} from './referenceDatabase';\nimport Modes from '../../config/modes';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport {randomLong} from '../../helpers/random';\nimport {Document, InputFile, InputFileLocation, InputWebFileLocation, Photo, PhotoSize, UploadFile, UploadWebFile, VideoSize, WebDocument} from '../../layer';\nimport {DcId} from '../../types';\nimport CacheStorageController from '../files/cacheStorage';\nimport {logger, LogTypes} from '../logger';\nimport assumeType from '../../helpers/assumeType';\nimport noop from '../../helpers/noop';\nimport readBlobAsArrayBuffer from '../../helpers/blob/readBlobAsArrayBuffer';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport findAndSplice from '../../helpers/array/findAndSplice';\nimport fixFirefoxSvg from '../../helpers/fixFirefoxSvg';\nimport {AppManager} from '../appManagers/manager';\nimport {getEnvironment} from '../../environment/utils';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport getFileNameForUpload from '../../helpers/getFileNameForUpload';\nimport type {Progress} from '../appManagers/appDownloadManager';\nimport getDownloadMediaDetails from '../appManagers/utils/download/getDownloadMediaDetails';\n// import networkStats from './networkStats';\nimport getDownloadFileNameFromOptions from '../appManagers/utils/download/getDownloadFileNameFromOptions';\nimport StreamWriter from '../files/streamWriter';\nimport FileStorage from '../files/fileStorage';\nimport {MAX_FILE_SAVE_SIZE} from './mtproto_config';\nimport throttle from '../../helpers/schedulers/throttle';\nimport makeError from '../../helpers/makeError';\nimport readBlobAsUint8Array from '../../helpers/blob/readBlobAsUint8Array';\nimport DownloadStorage from '../files/downloadStorage';\nimport copy from '../../helpers/object/copy';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {MIME_TYPE_EXTENSION_MAP} from '../../environment/mimeTypeMap';\nimport {getServiceMessagePort} from './mtproto.worker';\n\ntype Delayed = {\n offset: number,\n writePromise: CancellablePromise,\n writeDeferred: CancellablePromise\n};\n\nexport type DownloadOptions = {\n dcId: DcId,\n location: InputFileLocation | InputWebFileLocation,\n size?: number,\n fileName?: string,\n mimeType?: MTMimeType,\n limitPart?: number,\n queueId?: number,\n onlyCache?: boolean,\n downloadId?: string\n // getFileMethod: Parameters[1]\n};\n\nexport type DownloadMediaOptions = {\n media: Photo.photo | Document.document | WebDocument,\n thumb?: PhotoSize | VideoSize,\n queueId?: number,\n onlyCache?: boolean,\n downloadId?: string\n};\n\ntype DownloadPromise = CancellablePromise;\n\nexport type MyUploadFile = UploadFile.uploadFile | UploadWebFile.uploadWebFile;\n\n// export interface RefreshReferenceTask extends WorkerTaskVoidTemplate {\n// type: 'refreshReference',\n// payload: ReferenceBytes,\n// };\n\n// export interface RefreshReferenceTaskResponse extends WorkerTaskVoidTemplate {\n// type: 'refreshReference',\n// payload: ReferenceBytes,\n// originalPayload: ReferenceBytes\n// };\n\nconst MAX_DOWNLOAD_FILE_PART_SIZE = 1 * 1024 * 1024;\nconst MAX_UPLOAD_FILE_PART_SIZE = 512 * 1024;\nconst MIN_PART_SIZE = 128 * 1024;\nconst AVG_PART_SIZE = 512 * 1024;\n\nconst REGULAR_DOWNLOAD_DELTA = (9 * 512 * 1024) / MIN_PART_SIZE;\n// const PREMIUM_DOWNLOAD_DELTA = REGULAR_DOWNLOAD_DELTA * 2;\nconst PREMIUM_DOWNLOAD_DELTA = (56 * 512 * 1024) / MIN_PART_SIZE;\n\nconst IGNORE_ERRORS: Set = new Set([\n 'DOWNLOAD_CANCELED',\n 'UPLOAD_CANCELED',\n 'UNKNOWN',\n 'NO_NEW_CONTEXT'\n]);\n\nexport class ApiFileManager extends AppManager {\n private cacheStorage = new CacheStorageController('cachedFiles');\n private downloadStorage = new DownloadStorage();\n\n private downloadPromises: {\n [fileName: string]: DownloadPromise\n } = {};\n\n // private downloadToDiscPromises: {\n // [fileName: string]: DownloadPromise\n // } = {};\n\n private uploadPromises: {\n [fileName: string]: CancellablePromise\n } = {};\n\n private downloadPulls: {\n [dcId: string]: Array<{\n id: number,\n queueId: number,\n cb: () => Promise,\n deferred: {\n resolve: (...args: any[]) => void,\n reject: (...args: any[]) => void\n },\n activeDelta: number\n }>\n } = {};\n private downloadActives: {[dcId: string]: number} = {};\n\n public refreshReferencePromises: {\n [referenceHex: string]: {\n deferred: CancellablePromise,\n timeout?: number\n }\n } = {};\n\n private log: ReturnType = logger('AFM', LogTypes.Error | LogTypes.Log);\n private tempId = 0;\n private queueId = 0;\n private debug = Modes.debug;\n\n private maxUploadParts = 4000;\n private maxDownloadParts = 8000;\n private webFileDcId: DcId;\n\n protected after() {\n setInterval(() => { // clear old promises\n for(const hex in this.refreshReferencePromises) {\n const {deferred} = this.refreshReferencePromises[hex];\n if(deferred.isFulfilled || deferred.isRejected) {\n delete this.refreshReferencePromises[hex];\n }\n }\n }, 1800e3);\n\n this.rootScope.addEventListener('config', (config) => {\n this.webFileDcId = config.webfile_dc_id;\n });\n\n this.rootScope.addEventListener('app_config', (appConfig) => {\n this.maxUploadParts = this.rootScope.premium ? appConfig.upload_max_fileparts_premium : appConfig.upload_max_fileparts_default;\n this.maxDownloadParts = appConfig.upload_max_fileparts_premium;\n });\n }\n\n private downloadRequest(dcId: 'upload', id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\n private downloadRequest(dcId: number, id: number, cb: () => Promise, activeDelta: number, queueId?: number): Promise;\n private downloadRequest(dcId: number | string, id: number, cb: () => Promise, activeDelta: number, queueId: number = 0) {\n if(this.downloadPulls[dcId] === undefined) {\n this.downloadPulls[dcId] = [];\n this.downloadActives[dcId] = 0;\n }\n\n const downloadPull = this.downloadPulls[dcId];\n\n const promise = new Promise((resolve, reject) => {\n downloadPull.push({id, queueId, cb, deferred: {resolve, reject}, activeDelta});\n });\n\n setTimeout(() => {\n this.downloadCheck(dcId);\n }, 0);\n\n return promise;\n }\n\n private downloadCheck(dcId: string | number) {\n const downloadPull = this.downloadPulls[dcId];\n const downloadLimit = /* dcId === 'upload' ? 24 : */(this.rootScope.premium ? PREMIUM_DOWNLOAD_DELTA : REGULAR_DOWNLOAD_DELTA);\n // const downloadLimit = Infinity;\n\n if(this.downloadActives[dcId] >= downloadLimit || !downloadPull?.length) {\n return false;\n }\n\n // const data = downloadPull.shift();\n const data = findAndSplice(downloadPull, (d) => d.queueId === 0) || findAndSplice(downloadPull, (d) => d.queueId === this.queueId) || downloadPull.shift();\n const activeDelta = data.activeDelta || 1;\n\n this.downloadActives[dcId] += activeDelta;\n\n const promise = data.cb();\n // const networkPromise = networkStats.waitForChunk(dcId as DcId, activeDelta * MIN_PART_SIZE);\n /* Promise.race([\n promise\n // networkPromise\n ]) */promise.then(() => {\n this.downloadActives[dcId] -= activeDelta;\n this.downloadCheck(dcId);\n\n // networkPromise.resolve();\n }, (error: ApiError) => {\n if(!error?.type || !IGNORE_ERRORS.has(error.type)) {\n this.log.error('downloadCheck error:', error);\n }\n\n this.downloadActives[dcId] -= activeDelta;\n this.downloadCheck(dcId);\n\n // networkPromise.reject(error);\n }).finally(() => {\n promise.then(data.deferred.resolve, data.deferred.reject);\n });\n }\n\n public setQueueId(queueId: number) {\n // this.log.error('setQueueId', queueId);\n this.queueId = queueId;\n }\n\n private getFileStorage() {\n return this.cacheStorage;\n }\n\n public cancelDownload(fileName: string) {\n const promises = [this.downloadPromises[fileName], this.uploadPromises[fileName]].filter(Boolean);\n let canceled = false;\n for(let i = 0, length = promises.length; i < length; ++i) {\n const promise = promises[i];\n if(promise && !promise.isRejected && !promise.isFulfilled) {\n promise.cancel();\n canceled = true;\n }\n }\n\n return canceled;\n }\n\n public requestWebFilePart(dcId: DcId, location: InputWebFileLocation, offset: number, limit: number, id = 0, queueId = 0, checkCancel?: () => void) {\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\n checkCancel?.();\n\n return this.apiManager.invokeApi('upload.getWebFile', {\n location,\n offset,\n limit\n }, {\n dcId,\n fileDownload: true\n });\n }, this.getDelta(limit), queueId);\n }\n\n public requestFilePart(\n dcId: DcId,\n location: InputFileLocation,\n offset: number,\n limit: number,\n id = 0,\n queueId = 0,\n checkCancel?: () => void\n ) {\n return this.downloadRequest(dcId, id, async() => { // do not remove async, because checkCancel will throw an error\n checkCancel?.();\n\n const invoke = async(): Promise => {\n checkCancel?.(); // do not remove async, because checkCancel will throw an error\n\n // * IMPORTANT: reference can be changed in previous request\n const reference = (location as InputFileLocation.inputDocumentFileLocation).file_reference?.slice();\n\n const promise = // pause(offset > (100 * 1024 * 1024) ? 10000000 : 0).then(() =>\n this.apiManager.invokeApi('upload.getFile', {\n location,\n offset,\n limit\n }, {\n dcId,\n fileDownload: true\n }) as Promise/* ) */;\n\n return promise.catch((err: ApiError) => {\n checkCancel?.();\n\n if(err.type === 'FILE_REFERENCE_EXPIRED') {\n return this.refreshReference(location as InputFileLocation.inputDocumentFileLocation, reference).then(invoke);\n }\n\n throw err;\n });\n };\n\n assumeType(location);\n const reference = location.file_reference;\n if(reference && !location.checkedReference) { // check stream's location because it's new every call\n location.checkedReference = true;\n const hex = bytesToHex(reference);\n if(this.refreshReferencePromises[hex]) {\n return this.refreshReference(location, reference).then(invoke);\n }\n }\n\n return invoke();\n }, this.getDelta(limit), queueId);\n }\n\n /* private convertBlobToBytes(blob: Blob) {\n return blob.arrayBuffer().then((buffer) => new Uint8Array(buffer));\n } */\n\n private getDelta(bytes: number) {\n return bytes / MIN_PART_SIZE;\n }\n\n private getLimitPart(size: number, isUpload: boolean): number {\n if(!size) { // * sometimes size can be 0 (e.g. avatars, webDocuments)\n return AVG_PART_SIZE;\n }\n\n // return 1 * 1024 * 1024;\n\n let bytes = MIN_PART_SIZE;\n\n const maxParts = isUpload ? this.maxUploadParts : this.maxDownloadParts;\n const maxPartSize = isUpload ? MAX_UPLOAD_FILE_PART_SIZE : MAX_DOWNLOAD_FILE_PART_SIZE;\n // usually it will stick to 512Kb size if the file is too big\n while((size / bytes) > maxParts && bytes < maxPartSize) {\n bytes *= 2;\n }\n /* if(size < 1e6 || !size) bytes = 512;\n else if(size < 3e6) bytes = 256;\n else bytes = 128; */\n\n return bytes;\n }\n\n private uncompressTGS = (bytes: Uint8Array, fileName: string) => {\n // this.log('uncompressTGS', bytes, bytes.slice().buffer);\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\n return this.cryptoWorker.invokeCrypto('gzipUncompress', bytes.slice().buffer, false) as Promise;\n };\n\n private uncompressTGV = (bytes: Uint8Array, fileName: string) => {\n // this.log('uncompressTGS', bytes, bytes.slice().buffer);\n // slice нужен потому что в uint8array - 5053 length, в arraybuffer - 5084\n const buffer = bytes.slice().buffer;\n if(getEnvironment().IS_FIREFOX) {\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, true).then((text) => {\n return fixFirefoxSvg(text as string);\n }).then((text) => {\n const textEncoder = new TextEncoder();\n return textEncoder.encode(text);\n });\n }\n\n return this.cryptoWorker.invokeCrypto('gzipUncompress', buffer, false) as Promise;\n };\n\n private convertWebp = (bytes: Uint8Array, fileName: string) => {\n const instance = MTProtoMessagePort.getInstance();\n return instance.invoke('convertWebp', {fileName, bytes});\n };\n\n private convertOpus = (bytes: Uint8Array, fileName: string) => {\n const instance = MTProtoMessagePort.getInstance();\n return instance.invoke('convertOpus', {fileName, bytes});\n };\n\n private refreshReference(\n inputFileLocation: InputFileLocation.inputDocumentFileLocation,\n reference: typeof inputFileLocation['file_reference'],\n hex = bytesToHex(reference)\n ) {\n let r = this.refreshReferencePromises[hex];\n if(!r) {\n const deferred = deferredPromise();\n\n r = this.refreshReferencePromises[hex] = {\n deferred\n\n // ! I don't remember what it was for...\n // timeout: ctx.setTimeout(() => {\n // this.log.error('Didn\\'t refresh the reference:', inputFileLocation);\n // deferred.reject(makeError('REFERENCE_IS_NOT_REFRESHED'));\n // }, 60000)\n };\n\n // deferred.catch(noop).finally(() => {\n // clearTimeout(r.timeout);\n // });\n\n this.referenceDatabase.refreshReference(reference).then((reference) => {\n if(hex === bytesToHex(reference)) {\n deferred.reject(makeError('REFERENCE_IS_NOT_REFRESHED'));\n }\n\n deferred.resolve(reference);\n }, deferred.reject);\n }\n\n // have to replace file_reference in any way, because location can be different everytime if it's stream\n return r.deferred.then((reference) => {\n inputFileLocation.file_reference = reference;\n });\n }\n\n public isDownloading(fileName: string) {\n return !!this.downloadPromises[fileName];\n }\n\n public getDownload(fileName: string) {\n return this.downloadPromises[fileName];\n }\n\n public getUpload(fileName: string) {\n return this.uploadPromises[fileName];\n }\n\n private getConvertMethod(mimeType: MTMimeType) {\n let process: ApiFileManager['uncompressTGS'] | ApiFileManager['convertWebp'];\n if(mimeType === 'application/x-tgwallpattern') {\n process = this.uncompressTGV;\n mimeType = 'image/svg+xml';\n } else if(mimeType === 'image/webp' && !getEnvironment().IS_WEBP_SUPPORTED) {\n process = this.convertWebp;\n mimeType = 'image/png';\n } else if(mimeType === 'application/x-tgsticker') {\n process = this.uncompressTGS;\n mimeType = 'application/json';\n } else if(mimeType === 'audio/ogg' && !getEnvironment().IS_OPUS_SUPPORTED) {\n process = this.convertOpus;\n mimeType = 'audio/wav';\n }\n\n return {mimeType, process};\n }\n\n private allocateDeferredPromises(startOffset: number, size: number, limitPart: number) {\n const delayed: Delayed[] = [];\n let offset = startOffset;\n let writePromise: CancellablePromise = Promise.resolve(),\n writeDeferred: CancellablePromise;\n do {\n writeDeferred = deferredPromise();\n delayed.push({offset, writePromise, writeDeferred});\n writePromise = writeDeferred;\n offset += limitPart;\n } while(offset < size);\n\n return delayed;\n }\n\n public download(options: DownloadOptions): DownloadPromise {\n const size = options.size ?? 0;\n const {dcId, location} = options;\n let {downloadId} = options;\n if(downloadId && !getServiceMessagePort()) {\n this.log.error('download fallback to blob', options);\n downloadId = undefined;\n }\n\n const originalMimeType = options.mimeType;\n const convertMethod = this.getConvertMethod(originalMimeType);\n const {process} = convertMethod;\n options.mimeType = convertMethod.mimeType || 'image/jpeg';\n\n const fileName = getDownloadFileNameFromOptions(options);\n const cacheFileName = downloadId ? getDownloadFileNameFromOptions({...copy(options), downloadId: undefined}) : fileName;\n const cacheStorage: FileStorage = this.getFileStorage();\n const downloadStorage: FileStorage = downloadId ? this.downloadStorage : undefined;\n let deferred: DownloadPromise = downloadId ? undefined : this.downloadPromises[fileName];\n\n this.debug && this.log('downloadFile', fileName, options);\n\n if(deferred) {\n return deferred;\n }\n\n // if(deferred) {\n // if(size) {\n // return deferred.then(async(blob) => {\n // if(blob instanceof Blob && blob.size < size) {\n // this.debug && this.log('downloadFile need to deleteFile, wrong size:', blob.size, size);\n\n // try {\n // await this.delete(fileName);\n // } finally {\n // return this.download(options);\n // }\n // } else {\n // return blob;\n // }\n // });\n // } else {\n // return deferred;\n // }\n // }\n\n const errorHandler = (item: typeof cachePrepared, error: ApiError) => {\n if(item?.error) {\n return;\n }\n\n for(const p of prepared) {\n if(item && item !== p) {\n continue;\n }\n\n p.error = error;\n p.deferred.reject(error);\n }\n };\n\n const id = this.tempId++;\n const limitPart = options.limitPart || this.getLimitPart(size, false);\n\n let getFile: FileStorage['getFile'] = cacheStorage.getFile.bind(cacheStorage);\n\n let cachePrepared: ReturnType & {writer?: StreamWriter, error?: ApiError},\n downloadPrepared: typeof cachePrepared;\n const prepared: (typeof cachePrepared)[] = [];\n const possibleSize = size || limitPart;\n\n const getErrorsCount = () => prepared.reduce((acc, item) => acc + +!!item.error, 0);\n\n const attach = (item: typeof cachePrepared, fileName: string) => {\n const {deferred} = item;\n const _errorHandler = errorHandler.bind(null, item);\n\n deferred.cancel = () => deferred.reject(makeError('DOWNLOAD_CANCELED'));\n deferred.catch((error) => {\n _errorHandler(error);\n item.writer?.truncate?.();\n }).finally(() => {\n if(this.downloadPromises[fileName] === deferred) {\n delete this.downloadPromises[fileName];\n }\n\n delete item.writer;\n // indexOfAndSplice(prepared, item);\n });\n\n this.downloadPromises[fileName] = deferred;\n\n prepared.push(item);\n };\n\n if(cacheStorage && (!downloadStorage || possibleSize <= MAX_FILE_SAVE_SIZE)) {\n cachePrepared = cacheStorage.prepareWriting(cacheFileName, possibleSize, options.mimeType)\n attach(cachePrepared, cacheFileName);\n }\n\n if(downloadStorage) {\n let downloadFileName = options.fileName; // it's doc file_name\n if(!downloadFileName) {\n downloadFileName = cacheFileName;\n const ext = MIME_TYPE_EXTENSION_MAP[options.mimeType];\n if(ext) {\n downloadFileName += '.' + ext;\n }\n }\n\n downloadPrepared = downloadStorage.prepareWriting({\n fileName: downloadFileName,\n downloadId,\n size: possibleSize\n });\n attach(downloadPrepared, fileName);\n\n if(cachePrepared) { // cancel cache too\n downloadPrepared.deferred.catch((err) => cachePrepared.deferred.reject(err));\n }\n\n // this.downloadToDiscPromises[cacheFileName] = deferred;\n // deferred.catch(noop).finally(() => {\n // if(this.downloadToDiscPromises[cacheFileName] === deferred) {\n // delete this.downloadToDiscPromises[cacheFileName];\n // }\n // });\n }\n\n deferred = downloadPrepared?.deferred ?? cachePrepared.deferred;\n\n if(downloadStorage && process) { // then have to load file again\n getFile = downloadStorage.getFile.bind(downloadStorage);\n }\n\n getFile(cacheFileName).then(async(blob: Blob) => {\n checkCancel();\n\n // if(blob.size < size) {\n // if(!options.onlyCache) {\n // await this.delete(cacheFileName);\n // checkCancel();\n // }\n\n // throw makeError('NO_ENTRY_FOUND');\n // }\n\n if(downloadPrepared) {\n const writer = downloadPrepared.writer = downloadPrepared.getWriter();\n checkCancel();\n\n const arr = await readBlobAsUint8Array(blob);\n checkCancel();\n await writer.write(arr);\n checkCancel();\n\n downloadPrepared.deferred.resolve(await writer.finalize());\n }\n\n if(cachePrepared) {\n cachePrepared.deferred.resolve(blob);\n }\n }).catch(async(err: ApiError) => {\n if(options.onlyCache) {\n errorHandler(null, err);\n return;\n }\n\n prepared.forEach((p) => {\n p.writer = p.getWriter();\n });\n\n const maxRequests = Infinity;\n\n const isWebFile = location._ === 'inputWebFileLocation';\n const requestPart = (isWebFile ? this.requestWebFilePart : this.requestFilePart).bind(this);\n\n if(isWebFile && this.webFileDcId === undefined) {\n await this.apiManager.getConfig();\n checkCancel();\n }\n\n const delayed = this.allocateDeferredPromises(0, size, limitPart);\n\n const progress: Progress = {done: 0, offset: 0, total: size, fileName};\n const dispatchProgress = () => {\n try {\n checkCancel();\n progress.done = done;\n this.rootScope.dispatchEvent('download_progress', progress);\n } catch(err) {}\n };\n\n const throttledDispatchProgress = throttle(dispatchProgress, 50, true);\n\n let done = 0;\n const superpuper = async() => {\n const {offset, writePromise, writeDeferred} = delayed.shift();\n try {\n checkCancel();\n\n const requestPerf = performance.now();\n const result = await requestPart(dcId, location as any, offset, limitPart, id, options.queueId, checkCancel);\n const requestTime = performance.now() - requestPerf;\n\n const bytes = result.bytes;\n\n if(delayed.length) {\n superpuper();\n }\n\n const byteLength = bytes.byteLength;\n this.debug && this.log('downloadFile requestFilePart result:', fileName, result);\n const isFinal = (offset + limitPart) >= size || !byteLength;\n if(byteLength) {\n done += byteLength;\n\n if(isFinal) {\n dispatchProgress();\n } else {\n throttledDispatchProgress();\n }\n\n const writeQueuePerf = performance.now();\n await writePromise;\n checkCancel();\n const writeQueueTime = performance.now() - writeQueuePerf;\n\n const perf = performance.now();\n await Promise.all(prepared.map(({writer}) => writer?.write(bytes, offset)));\n checkCancel();\n // downloadId && this.log('write time', performance.now() - perf, 'request time', requestTime, 'queue time', writeQueueTime);\n }\n\n if(isFinal) {\n if(!size || done < size) {\n prepared.forEach(({writer}) => writer?.trim?.(done));\n }\n }\n\n if(isFinal && process) {\n const promises = prepared\n .filter(({writer}) => writer?.getParts && writer.replaceParts)\n .map(async({writer}) => {\n const bytes = writer.getParts();\n const processedResult = await process(bytes, cacheFileName);\n writer.replaceParts(processedResult);\n });\n\n await Promise.all(promises);\n checkCancel();\n }\n\n writeDeferred.resolve();\n\n if(isFinal) {\n const saveToStorage = done <= MAX_FILE_SAVE_SIZE;\n prepared.forEach((item) => {\n const {deferred, writer} = item;\n if(deferred.isFulfilled || deferred.isRejected || !writer) {\n return;\n }\n\n const result = writer.finalize(saveToStorage);\n deferred.resolve(result);\n });\n }\n } catch(err) {\n errorHandler(null, err as ApiError);\n }\n };\n\n for(let i = 0, length = Math.min(maxRequests, delayed.length); i < length; ++i) {\n superpuper();\n }\n }).catch(noop);\n\n const checkCancel = () => {\n if(getErrorsCount() === prepared.length) {\n throw prepared[0].error;\n }\n };\n\n return deferred;\n }\n\n public downloadMedia(options: DownloadMediaOptions): DownloadPromise {\n let {media, thumb} = options;\n const isPhoto = media._ === 'photo';\n if(isPhoto && !thumb) {\n return Promise.reject('preloadPhoto photoEmpty!');\n }\n\n // get original instance with correct file_reference instead of using copies\n const isDocument = media._ === 'document';\n // const isWebDocument = media._ === 'webDocument';\n if(isDocument) media = this.appDocsManager.getDoc((media as Document.document).id);\n else if(isPhoto) media = this.appPhotosManager.getPhoto((media as Photo.photo).id);\n\n const {fileName, downloadOptions} = getDownloadMediaDetails(options);\n\n let promise = this.getDownload(fileName);\n if(!promise) {\n promise = this.download(downloadOptions);\n\n if(isDocument && !thumb) {\n this.rootScope.dispatchEvent('document_downloading', (media as Document.document).id);\n promise.catch(noop).finally(() => {\n this.rootScope.dispatchEvent('document_downloaded', (media as Document.document).id);\n });\n }\n }\n\n return promise;\n }\n\n public downloadMediaURL(options: DownloadMediaOptions): Promise {\n const {media, thumb} = options;\n\n let cacheContext = this.thumbsStorage.getCacheContext(media as any, thumb?.type);\n if((thumb ? (cacheContext.downloaded >= ('size' in thumb ? thumb.size : 0)) : true) && cacheContext.url) {\n return Promise.resolve(cacheContext.url);\n }\n\n return this.downloadMedia(options).then((blob) => {\n if(!cacheContext.downloaded || cacheContext.downloaded < blob.size) {\n const url = URL.createObjectURL(blob);\n cacheContext = this.thumbsStorage.setCacheContextURL(media as any, cacheContext.type, url, blob.size);\n }\n\n return cacheContext.url;\n });\n }\n\n public downloadMediaVoid(options: DownloadMediaOptions) {\n return this.downloadMedia(options).then(noop);\n }\n\n private delete(fileName: string) {\n delete this.downloadPromises[fileName];\n return this.getFileStorage().delete(fileName);\n }\n\n public upload({file, fileName}: {file: Blob | File, fileName?: string}) {\n fileName ||= getFileNameForUpload(file);\n\n const fileSize = file.size;\n const isBigFile = fileSize >= 10485760;\n const partSize = this.getLimitPart(fileSize, true);\n const activeDelta = this.getDelta(partSize);\n const totalParts = Math.ceil(fileSize / partSize);\n const fileId = randomLong();\n const resultInputFile: InputFile = {\n _: isBigFile ? 'inputFileBig' : 'inputFile',\n id: fileId as any,\n parts: totalParts,\n name: fileName,\n md5_checksum: ''\n };\n\n const deferred = deferredPromise();\n if(totalParts > this.maxUploadParts) {\n deferred.reject(makeError('FILE_TOO_BIG'));\n return deferred;\n }\n\n let canceled = false, resolved = false;\n let errorHandler = (error: ApiError) => {\n if(error?.type !== 'UPLOAD_CANCELED') {\n this.log.error('Up Error', error);\n }\n\n deferred.reject(error);\n canceled = true;\n errorHandler = noop;\n };\n\n const method = isBigFile ? 'upload.saveBigFilePart' : 'upload.saveFilePart';\n const id = this.tempId++;\n\n const self = this;\n function* generator() {\n let _part = 0, doneParts = 0;\n for(let offset = 0; offset < fileSize; offset += partSize) {\n const part = _part++; // 0, 1\n yield self.downloadRequest('upload', id, async() => {\n checkCancel();\n\n const blob = file.slice(offset, offset + partSize);\n const buffer = await readBlobAsArrayBuffer(blob);\n checkCancel();\n\n self.debug && self.log('Upload file part, isBig:', isBigFile, part, buffer.byteLength, new Uint8Array(buffer).length, new Uint8Array(buffer).slice().length);\n\n return self.apiManager.invokeApi(method, {\n file_id: fileId,\n file_part: part,\n file_total_parts: totalParts,\n bytes: buffer\n } as any, {\n fileUpload: true\n }).then(() => {\n if(canceled) {\n return;\n }\n\n ++doneParts;\n const progress: Progress = {done: doneParts * partSize, offset, total: fileSize, fileName};\n deferred.notify(progress);\n\n if(doneParts >= totalParts) {\n deferred.resolve(resultInputFile);\n resolved = true;\n }\n }, errorHandler);\n }, activeDelta).catch(errorHandler);\n }\n }\n\n const it = generator();\n const process = () => {\n if(canceled) return;\n const r = it.next();\n if(r.done || canceled) return;\n (r.value as Promise).then(process);\n };\n\n const maxRequests = Infinity;\n for(let i = 0, length = Math.min(maxRequests, totalParts); i < length; ++i) {\n process();\n }\n\n const checkCancel = () => {\n if(canceled) {\n throw makeError('UPLOAD_CANCELED');\n }\n };\n\n deferred.cancel = () => {\n if(!canceled && !resolved) {\n canceled = true;\n errorHandler(makeError('UPLOAD_CANCELED'));\n }\n };\n\n deferred.notify = (progress: Progress) => {\n this.rootScope.dispatchEvent('download_progress', progress);\n };\n\n deferred.finally(() => {\n if(this.uploadPromises[fileName] === deferred) {\n delete this.uploadPromises[fileName];\n }\n });\n\n return this.uploadPromises[fileName] = deferred;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport default function fixFirefoxSvg(text: string) {\n const svgIndex = text.indexOf('/, ` width=\"${width}\" height=\"${height}\">`).replace(/[^\\x00-\\x7F]/g, '');\n return text;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAsArrayBuffer from './readBlobAsArrayBuffer';\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then((buffer) => new Uint8Array(buffer));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from '../../environment/ctx';\nimport callbackify from '../../helpers/callbackify';\nimport {ignoreRestrictionReasons} from '../../helpers/restrictions';\nimport {Config, MethodDeclMap, User} from '../../layer';\nimport {InvokeApiOptions} from '../../types';\nimport {AppManager} from '../appManagers/manager';\nimport {MTAppConfig} from './appConfig';\nimport {UserAuth} from './mtproto_config';\nimport {MTMessage} from './networker';\n\ntype HashResult = {\n hash: number,\n result: any\n};\n\ntype HashOptions = {\n [queryJSON: string]: HashResult\n};\n\nexport type ApiLimitType = 'pin' | 'folderPin' | 'folders' |\n 'favedStickers' | 'reactions' | 'bio' | 'topicPin' | 'caption';\n\nexport default abstract class ApiManagerMethods extends AppManager {\n private afterMessageIdTemp: number;\n private hashes: {[method: string]: HashOptions} = {};\n private apiPromisesSingleProcess: {\n [q: string]: Map>\n } = {};\n private apiPromisesSingle: {\n [q: string]: Promise\n } = {};\n private apiPromisesCacheable: {\n [method: string]: {\n [queryJSON: string]: {\n timestamp: number,\n promise: Promise,\n fulfilled: boolean,\n timeout?: number,\n params: any\n }\n }\n } = {};\n\n protected config: Config;\n protected appConfig: MTAppConfig;\n\n constructor() {\n super();\n this.afterMessageIdTemp = 0;\n }\n\n abstract setUserAuth(userAuth: UserAuth | UserId): Promise;\n\n public setUser(user: User) {\n // appUsersManager.saveApiUser(user);\n return this.setUserAuth(user.id);\n }\n\n abstract invokeApi(method: T, params?: MethodDeclMap[T]['req'], options?: InvokeApiOptions): Promise;\n\n public invokeApiAfter(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): Promise {\n let o = options;\n o.prepareTempMessageId = '' + ++this.afterMessageIdTemp;\n\n o = {...options};\n (options as MTMessage).messageId = o.prepareTempMessageId;\n\n // console.log('will invokeApi:', method, params, options);\n return this.invokeApi(method, params, o);\n }\n\n public invokeApiHashable(o: {\n method: T,\n processResult?: (response: MethodDeclMap[T]['res']) => R,\n processError?: (error: ApiError) => any,\n params?: Omit,\n options?: InvokeApiOptions & {cacheKey?: string},\n overwrite?: boolean\n }) {\n // @ts-ignore\n o.params ??= {};\n o.options ??= {};\n // console.log('will invokeApi:', method, params, options);\n\n const {params, options, method, overwrite} = o;\n\n const queryJSON = JSON.stringify(params);\n let cached: HashResult;\n if(this.hashes[method]) {\n cached = this.hashes[method][queryJSON];\n if(cached) {\n if(overwrite) {\n delete this.hashes[method][queryJSON];\n cached = undefined;\n } else {\n (params as any).hash = cached.hash;\n }\n }\n }\n\n return this.invokeApiSingleProcess({\n method,\n processResult: (result) => {\n if(result._.includes('NotModified')) {\n // this.debug && this.log.warn('NotModified saved!', method, queryJSON);\n return cached.result;\n }\n\n if(result.hash/* || result.messages */) {\n const hash = result.hash/* || this.computeHash(result.messages) */;\n\n if(!this.hashes[method]) this.hashes[method] = {};\n cached = this.hashes[method][queryJSON] = {\n hash,\n result\n };\n }\n\n if(o.processResult) {\n const newResult = o.processResult(result);\n return cached ? cached.result = newResult : newResult;\n }\n\n return result;\n },\n params,\n options\n });\n }\n\n public invokeApiSingle(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions = {}): Promise {\n const q = method + '-' + JSON.stringify(params);\n const cache = this.apiPromisesSingle;\n if(cache[q]) {\n return cache[q];\n }\n\n return cache[q] = this.invokeApi(method, params, options).finally(() => {\n delete cache[q];\n });\n }\n\n public invokeApiSingleProcess(o: {\n method: T,\n processResult: (response: MethodDeclMap[T]['res']) => R,\n processError?: (error: ApiError) => any,\n params?: MethodDeclMap[T]['req'],\n options?: InvokeApiOptions & {cacheKey?: string, overwrite?: boolean}\n }): Promise> {\n o.params ??= {};\n o.options ??= {};\n\n const {method, processResult, processError, params, options} = o;\n const cache = this.apiPromisesSingleProcess;\n const cacheKey = options.cacheKey || JSON.stringify(params);\n const map = cache[method] ?? (cache[method] = new Map());\n const oldPromise = map.get(cacheKey);\n if(oldPromise) {\n return oldPromise;\n }\n\n const getNewPromise = () => {\n const promise = map.get(cacheKey);\n return promise === p ? undefined : promise;\n }\n\n const originalPromise = this.invokeApi(method, params, options);\n const newPromise: Promise> = originalPromise.then((result) => {\n return getNewPromise() || processResult(result);\n }, (error) => {\n const promise = getNewPromise();\n if(promise) {\n return promise;\n }\n\n if(!processError) {\n throw error;\n }\n\n return processError(error);\n });\n\n const p = newPromise.finally(() => {\n if(map.get(cacheKey) !== p) {\n return;\n }\n\n map.delete(cacheKey);\n if(!map.size) {\n delete cache[method];\n }\n });\n\n map.set(cacheKey, p);\n return p;\n }\n\n public invokeApiCacheable(method: T, params: MethodDeclMap[T]['req'] = {} as any, options: InvokeApiOptions & Partial<{cacheSeconds: number, override: boolean}> = {}): Promise {\n const cache = this.apiPromisesCacheable[method] ?? (this.apiPromisesCacheable[method] = {});\n const queryJSON = JSON.stringify(params);\n const item = cache[queryJSON];\n if(item && (!options.override || !item.fulfilled)) {\n return item.promise;\n }\n\n if(options.override) {\n if(item && item.timeout) {\n clearTimeout(item.timeout);\n delete item.timeout;\n }\n\n delete options.override;\n }\n\n let timeout: number;\n if(options.cacheSeconds) {\n timeout = ctx.setTimeout(() => {\n delete cache[queryJSON];\n }, options.cacheSeconds * 1000);\n delete options.cacheSeconds;\n }\n\n const promise = this.invokeApi(method, params, options);\n\n cache[queryJSON] = {\n timestamp: Date.now(),\n fulfilled: false,\n timeout,\n promise,\n params\n };\n\n return promise;\n }\n\n public clearCache(method: T, verify: (params: MethodDeclMap[T]['req']) => boolean) {\n const cache = this.apiPromisesCacheable[method];\n if(cache) {\n for(const queryJSON in cache) {\n const item = cache[queryJSON];\n try {\n if(verify(item.params)) {\n if(item.timeout) {\n clearTimeout(item.timeout);\n }\n\n delete cache[queryJSON];\n }\n } catch(err) {\n // this.log.error('clearCache error:', err, queryJSON, item);\n }\n }\n }\n }\n\n public getConfig(overwrite?: boolean) {\n if(this.config && !overwrite) {\n return this.config;\n }\n\n return this.invokeApiSingleProcess({\n method: 'help.getConfig',\n params: {},\n processResult: (config) => {\n this.config = config;\n this.rootScope.dispatchEvent('config', config);\n return config;\n },\n options: {overwrite}\n });\n }\n\n public getAppConfig(overwrite?: boolean) {\n if(this.appConfig && !overwrite) {\n return this.appConfig;\n }\n\n return this.invokeApiSingleProcess({\n method: 'help.getAppConfig',\n params: {},\n processResult: (config: MTAppConfig) => {\n this.appConfig = config;\n ignoreRestrictionReasons(config.ignore_restriction_reasons ?? []);\n this.rootScope.dispatchEvent('app_config', config);\n return config;\n },\n options: {overwrite}\n });\n }\n\n public getLimit(type: ApiLimitType, isPremium?: boolean) {\n return callbackify(this.getAppConfig(), (appConfig) => {\n const map: {[type in ApiLimitType]: [keyof MTAppConfig, keyof MTAppConfig] | keyof MTAppConfig} = {\n pin: ['dialogs_pinned_limit_default', 'dialogs_pinned_limit_premium'],\n folderPin: ['dialogs_folder_pinned_limit_default', 'dialogs_folder_pinned_limit_premium'],\n folders: ['dialog_filters_limit_default', 'dialog_filters_limit_premium'],\n favedStickers: ['stickers_faved_limit_default', 'stickers_faved_limit_premium'],\n reactions: ['reactions_user_max_default', 'reactions_user_max_premium'],\n bio: ['about_length_limit_default', 'about_length_limit_premium'],\n topicPin: 'topics_pinned_limit',\n caption: ['caption_length_limit_default', 'caption_length_limit_premium']\n };\n\n isPremium ??= this.rootScope.premium;\n\n const a = map[type];\n const key = Array.isArray(a) ? a[isPremium ? 1 : 0] : a;\n return appConfig[key] as number;\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n \nimport transportController from './transports/controller';\nimport MTTransport from './transports/transport';\n \n\nimport type {UserAuth} from './mtproto_config';\nimport type {DcAuthKey, DcId, DcServerSalt, InvokeApiOptions} from '../../types';\nimport type {MethodDeclMap} from '../../layer';\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport sessionStorage from '../sessionStorage';\nimport MTPNetworker, {MTMessage} from './networker';\nimport {ConnectionType, constructTelegramWebSocketUrl, DcConfigurator, TransportType} from './dcConfigurator';\nimport {logger} from '../logger';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport {IDB} from '../files/idb';\nimport CryptoWorker from '../crypto/cryptoMessagePort';\nimport ctx from '../../environment/ctx';\nimport noop from '../../helpers/noop';\nimport Modes from '../../config/modes';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport pause from '../../helpers/schedulers/pause';\nimport ApiManagerMethods from './api_methods';\nimport {getEnvironment} from '../../environment/utils';\nimport toggleStorages from '../../helpers/toggleStorages';\n\n/* class RotatableArray {\n public array: Array = [];\n private lastIndex = -1;\n\n public get() {\n this.lastIndex = clamp(this.lastIndex + 1, 0, this.array.length - 1);\n return this.array[this.lastIndex];\n }\n} */\n\nconst PREMIUM_FILE_NETWORKERS_COUNT = 6;\nconst REGULAR_FILE_NETWORKERS_COUNT = 3;\n\nexport class ApiManager extends ApiManagerMethods {\n private cachedNetworkers: {\n [transportType in TransportType]: {\n [connectionType in ConnectionType]: {\n [dcId: DcId]: MTPNetworker[]\n }\n }\n };\n\n private cachedExportPromise: {[x: number]: Promise};\n private gettingNetworkers: {[dcIdAndType: string]: Promise};\n private baseDcId: DcId;\n\n // public telegramMeNotified = false;\n\n private log: ReturnType;\n\n private afterMessageTempIds: {\n [tempId: string]: {\n messageId: string,\n promise: Promise\n }\n };\n\n private transportType: TransportType;\n\n private updatesProcessor: (obj: any) => void;\n\n private loggingOut: boolean;\n\n constructor() {\n super();\n this.log = logger('API');\n\n this.cachedNetworkers = {} as any;\n this.cachedExportPromise = {};\n this.gettingNetworkers = {};\n this.baseDcId = 0;\n this.afterMessageTempIds = {};\n\n this.transportType = Modes.transport;\n\n \n transportController.addEventListener('transport', (transportType) => {\n this.changeTransportType(transportType);\n });\n \n\n // * Make sure that the used autologin_token is no more than 10000 seconds old\n // * https://core.telegram.org/api/url-authorization\n const REFRESH_APP_CONFIG_INTERVAL = (10000 - 30) * 1000;\n setInterval(() => {\n this.getAppConfig(true);\n }, REFRESH_APP_CONFIG_INTERVAL);\n }\n\n protected after() {\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateConfig: () => {\n this.getConfig(true);\n this.getAppConfig(true);\n }\n });\n\n this.rootScope.addEventListener('user_auth', () => {\n if(this.config) { // refresh configs if had a config during authorization\n this.apiUpdatesManager.processLocalUpdate({_: 'updateConfig'});\n }\n });\n\n this.rootScope.addEventListener('premium_toggle', (isPremium) => {\n this.iterateNetworkers(({networker, connectionType, dcId, transportType}) => {\n if(connectionType === 'client' || transportType !== 'websocket') {\n return;\n }\n\n const transport = networker.transport;\n if(!transport) {\n this.log.error('wow what, no transport?', networker);\n return;\n }\n\n if((transport as TcpObfuscated).connection) {\n const url = constructTelegramWebSocketUrl(dcId, connectionType, isPremium);\n (transport as TcpObfuscated).changeUrl(url);\n }\n });\n });\n }\n\n // private lol = false;\n\n // constructor() {\n // MtpSingleInstanceService.start();\n\n /* AppStorage.get('dc').then((dcId) => {\n if(dcId) {\n this.baseDcId = dcId;\n }\n }); */\n // }\n\n /* public telegramMeNotify(newValue: boolean) {\n if(this.telegramMeNotified !== newValue) {\n this.telegramMeNotified = newValue;\n //telegramMeWebService.setAuthorized(this.telegramMeNotified);\n }\n } */\n\n private getTransportType(connectionType: ConnectionType) {\n \n \n \n \n \n // @ts-ignore\n const transportType: TransportType = this.transportType;\n \n\n return transportType;\n }\n\n private iterateNetworkers(callback: (o: {networker: MTPNetworker, dcId: DcId, connectionType: ConnectionType, transportType: TransportType, index: number, array: MTPNetworker[]}) => void) {\n for(const transportType in this.cachedNetworkers) {\n const connections = this.cachedNetworkers[transportType as TransportType];\n for(const connectionType in connections) {\n const dcs = connections[connectionType as ConnectionType];\n for(const dcId in dcs) {\n const networkers = dcs[dcId as any as DcId];\n networkers.forEach((networker, idx, arr) => {\n callback({\n networker,\n dcId: +dcId as DcId,\n connectionType: connectionType as ConnectionType,\n transportType: transportType as TransportType,\n index: idx,\n array: arr\n });\n });\n }\n }\n }\n }\n\n private chooseServer(dcId: DcId, connectionType: ConnectionType, transportType: TransportType) {\n return this.dcConfigurator.chooseServer(dcId, connectionType, transportType, connectionType === 'client', this.rootScope.premium);\n }\n\n public changeTransportType(transportType: TransportType) {\n const oldTransportType = this.transportType;\n if(oldTransportType === transportType) {\n return;\n }\n\n this.log('changing transport from', oldTransportType, 'to', transportType);\n\n const oldObject = this.cachedNetworkers[oldTransportType];\n const newObject = this.cachedNetworkers[transportType];\n this.cachedNetworkers[transportType] = oldObject;\n this.cachedNetworkers[oldTransportType] = newObject;\n\n this.transportType = transportType;\n\n for(const oldGetKey in this.gettingNetworkers) {\n const promise = this.gettingNetworkers[oldGetKey];\n delete this.gettingNetworkers[oldGetKey];\n\n const newGetKey = oldGetKey.replace(oldTransportType, transportType);\n this.gettingNetworkers[newGetKey] = promise;\n\n this.log('changed networker getKey from', oldGetKey, 'to', newGetKey)\n }\n\n this.iterateNetworkers((info) => {\n const transportType = this.getTransportType(info.connectionType);\n const transport = this.chooseServer(info.dcId, info.connectionType, transportType);\n this.changeNetworkerTransport(info.networker, transport);\n });\n }\n\n public async getBaseDcId() {\n if(this.baseDcId) {\n return this.baseDcId;\n }\n\n const baseDcId = await sessionStorage.get('dc');\n if(!this.baseDcId) {\n if(!baseDcId) {\n this.setBaseDcId(App.baseDcId);\n } else {\n this.baseDcId = baseDcId;\n }\n }\n\n return this.baseDcId;\n }\n\n public async setUserAuth(userAuth: UserAuth | UserId) {\n if(typeof(userAuth) === 'string' || typeof(userAuth) === 'number') {\n userAuth = {dcID: 0, date: Date.now() / 1000 | 0, id: userAuth.toPeerId(false)};\n }\n\n this.rootScope.dispatchEvent('user_auth', userAuth);\n\n if(!userAuth.dcID) {\n const baseDcId = await this.getBaseDcId();\n userAuth.dcID = baseDcId;\n }\n\n sessionStorage.set({\n user_auth: userAuth\n });\n\n // this.telegramMeNotify(true);\n }\n\n public setBaseDcId(dcId: DcId) {\n const wasDcId = this.baseDcId;\n if(wasDcId) { // if migrated set ondrain\n this.getNetworker(wasDcId).then((networker) => {\n this.setOnDrainIfNeeded(networker);\n });\n }\n\n this.baseDcId = dcId;\n\n sessionStorage.set({\n dc: this.baseDcId\n });\n }\n\n public async logOut() {\n if(this.loggingOut) {\n return;\n }\n\n this.loggingOut = true;\n const storageKeys: Array = [];\n\n const prefix = 'dc';\n for(let dcId = 1; dcId <= 5; dcId++) {\n storageKeys.push(prefix + dcId + '_auth_key' as any);\n }\n\n // WebPushApiManager.forceUnsubscribe(); // WARNING // moved to worker's master\n const storageResult = await Promise.all(storageKeys.map((key) => sessionStorage.get(key)));\n\n const logoutPromises: Promise[] = [];\n for(let i = 0; i < storageResult.length; i++) {\n if(storageResult[i]) {\n logoutPromises.push(this.invokeApi('auth.logOut', {}, {dcId: (i + 1) as DcId, ignoreErrors: true}));\n }\n }\n\n const clear = async() => {\n this.baseDcId = undefined;\n // this.telegramMeNotify(false);\n await toggleStorages(false, true);\n IDB.closeDatabases();\n this.rootScope.dispatchEvent('logging_out');\n };\n\n setTimeout(clear, 1e3);\n\n // return;\n\n return Promise.all(logoutPromises).catch((error) => {\n error.handled = true;\n }).finally(clear)/* .then(() => {\n location.pathname = '/';\n }) */;\n }\n\n private generateNetworkerGetKey(dcId: DcId, transportType: TransportType, connectionType: ConnectionType) {\n return [dcId, transportType, connectionType].join('-');\n }\n\n public getNetworker(dcId: DcId, options: InvokeApiOptions = {}): Promise {\n const connectionType: ConnectionType = options.fileDownload ? 'download' : (options.fileUpload ? 'upload' : 'client');\n // const connectionType: ConnectionType = 'client';\n\n const transportType = this.getTransportType(connectionType);\n if(!this.cachedNetworkers[transportType]) {\n this.cachedNetworkers[transportType] = {\n client: {},\n download: {},\n upload: {}\n };\n }\n\n const cache = this.cachedNetworkers[transportType][connectionType];\n if(!(dcId in cache)) {\n cache[dcId] = [];\n }\n\n const networkers = cache[dcId];\n // @ts-ignore\n const maxNetworkers = connectionType === 'client' || transportType === 'https' ? 1 : (this.rootScope.premium ? PREMIUM_FILE_NETWORKERS_COUNT : REGULAR_FILE_NETWORKERS_COUNT);\n if(networkers.length >= maxNetworkers) {\n let i = maxNetworkers - 1, found = false;\n for(; i >= 0; --i) {\n if(networkers[i].isOnline) {\n found = true;\n break;\n }\n }\n\n const networker = networkers.splice(found ? i : maxNetworkers - 1, 1)[0];\n networkers.unshift(networker);\n return Promise.resolve(networker);\n }\n\n let getKey = this.generateNetworkerGetKey(dcId, transportType, connectionType);\n if(this.gettingNetworkers[getKey]) {\n return this.gettingNetworkers[getKey];\n }\n\n const ak: DcAuthKey = `dc${dcId}_auth_key` as any;\n const ss: DcServerSalt = `dc${dcId}_server_salt` as any;\n\n let transport = this.chooseServer(dcId, connectionType, transportType);\n return this.gettingNetworkers[getKey] = Promise.all([ak, ss].map((key) => sessionStorage.get(key)))\n .then(async([authKeyHex, serverSaltHex]) => {\n let networker: MTPNetworker, error: any;\n if(authKeyHex && authKeyHex.length === 512) {\n if(!serverSaltHex || serverSaltHex.length !== 16) {\n serverSaltHex = 'AAAAAAAAAAAAAAAA';\n }\n\n const authKey = bytesFromHex(authKeyHex);\n const authKeyId = (await CryptoWorker.invokeCrypto('sha1', authKey)).slice(-8);\n const serverSalt = bytesFromHex(serverSaltHex);\n\n networker = this.networkerFactory.getNetworker(dcId, authKey, authKeyId, serverSalt, options);\n } else {\n try { // if no saved state\n const auth = await this.authorizer.auth(dcId);\n\n sessionStorage.set({\n [ak]: bytesToHex(auth.authKey),\n [ss]: bytesToHex(auth.serverSalt)\n });\n\n networker = this.networkerFactory.getNetworker(dcId, auth.authKey, auth.authKeyId, auth.serverSalt, options);\n } catch(_error) {\n error = _error;\n }\n }\n\n // ! cannot get it before this promise because simultaneous changeTransport will change nothing\n const newTransportType = this.getTransportType(connectionType);\n if(newTransportType !== transportType) {\n getKey = this.generateNetworkerGetKey(dcId, newTransportType, connectionType);\n transport.destroy();\n DcConfigurator.removeTransport(this.dcConfigurator.chosenServers, transport);\n\n if(networker) {\n transport = this.chooseServer(dcId, connectionType, newTransportType);\n }\n\n this.log('transport has been changed during authorization from', transportType, 'to', newTransportType);\n }\n\n /* networker.onConnectionStatusChange = (online) => {\n console.log('status:', online);\n }; */\n\n delete this.gettingNetworkers[getKey];\n\n if(error) {\n this.log('get networker error', error, (error as Error).stack);\n throw error;\n }\n\n this.changeNetworkerTransport(networker, transport);\n networkers.unshift(networker);\n this.setOnDrainIfNeeded(networker);\n return networker;\n });\n }\n\n public getNetworkerVoid(dcId: DcId) {\n return this.getNetworker(dcId).then(noop, noop);\n }\n\n private changeNetworkerTransport(networker: MTPNetworker, transport?: MTTransport) {\n const oldTransport = networker.transport;\n if(oldTransport) {\n DcConfigurator.removeTransport(this.dcConfigurator.chosenServers, oldTransport);\n }\n\n networker.changeTransport(transport);\n }\n\n private onNetworkerDrain(networker: MTPNetworker) {\n this.log('networker drain', networker.dcId);\n networker.onDrain = undefined;\n this.changeNetworkerTransport(networker);\n networker.destroy();\n this.networkerFactory.removeNetworker(networker);\n DcConfigurator.removeTransport(this.cachedNetworkers, networker);\n }\n\n public setOnDrainIfNeeded(networker: MTPNetworker) {\n if(networker.onDrain) {\n return;\n }\n\n const checkPromise: Promise = networker.isFileNetworker ?\n Promise.resolve(true) :\n this.getBaseDcId().then((baseDcId) => networker.dcId !== baseDcId);\n checkPromise.then((canRelease) => {\n if(networker.onDrain) {\n return;\n }\n\n if(canRelease) {\n networker.onDrain = () => this.onNetworkerDrain(networker);\n networker.setDrainTimeout();\n }\n });\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n this.networkerFactory.setUpdatesProcessor(callback);\n }\n\n public invokeApi(method: T, params: MethodDeclMap[T]['req'] = {}, options: InvokeApiOptions = {}): CancellablePromise {\n // /////this.log('Invoke api', method, params, options);\n\n /* if(!this.lol) {\n networkerFactory.updatesProcessor({_: 'new_session_created'}, true);\n this.lol = true;\n } */\n\n const deferred = deferredPromise();\n\n let {afterMessageId, prepareTempMessageId} = options;\n if(prepareTempMessageId) {\n deferred.then(() => {\n delete this.afterMessageTempIds[prepareTempMessageId];\n });\n }\n\n if(MOUNT_CLASS_TO) {\n const startTime = Date.now();\n const interval = ctx.setInterval(() => {\n if(!cachedNetworker || !cachedNetworker.isStopped()) {\n this.log.error('Request is still processing:', method, params, options, 'time:', (Date.now() - startTime) / 1000);\n }\n // this.cachedUploadNetworkers[2].requestMessageStatus();\n }, 5e3);\n\n deferred.catch(noop).finally(() => {\n clearInterval(interval);\n });\n }\n\n const rejectPromise = async(error: ApiError) => {\n if(!error) {\n error = {type: 'ERROR_EMPTY'};\n } else if(!isObject(error)) {\n error = {message: error};\n }\n\n if((error.code === 401 && error.type === 'SESSION_REVOKED') ||\n (error.code === 406 && error.type === 'AUTH_KEY_DUPLICATED')) {\n this.logOut();\n }\n\n if(options.ignoreErrors) {\n throw error;\n }\n\n if(error.code === 406) {\n error.handled = true;\n }\n\n if(!options.noErrorBox) {\n error.input = method;\n error.stack = stack || (error.originalError && error.originalError.stack) || error.stack || (new Error()).stack;\n setTimeout(() => {\n if(!error.handled) {\n if(error.code === 401) {\n this.logOut();\n } else {\n // ErrorService.show({error: error}); // WARNING\n }\n\n error.handled = true;\n }\n }, 100);\n }\n\n throw error;\n };\n\n let dcId: DcId;\n\n let cachedNetworker: MTPNetworker;\n const stack = (new Error()).stack || 'empty stack';\n const performRequest = (): Promise => {\n if(afterMessageId) {\n const after = this.afterMessageTempIds[afterMessageId];\n if(after) {\n options.afterMessageId = after.messageId;\n }\n }\n\n const promise = cachedNetworker.wrapApiCall(method, params, options);\n\n if(prepareTempMessageId) {\n this.afterMessageTempIds[prepareTempMessageId] = {\n messageId: (options as MTMessage).messageId,\n promise: deferred\n };\n }\n\n return promise.catch((error: ApiError) => {\n // if(!options.ignoreErrors) {\n if(error.type !== 'FILE_REFERENCE_EXPIRED'/* && error.type !== 'MSG_WAIT_FAILED' */) {\n this.log.error('Error', error.code, error.type, this.baseDcId, dcId, method, params);\n }\n\n if(error.code === 401 && this.baseDcId === dcId) {\n if(error.type !== 'SESSION_PASSWORD_NEEDED') {\n sessionStorage.delete('dc')\n sessionStorage.delete('user_auth'); // ! возможно тут вообще не нужно это делать, но нужно проверить случай с USER_DEACTIVATED (https://core.telegram.org/api/errors)\n // this.telegramMeNotify(false);\n }\n\n throw error;\n } else if(error.code === 401 && this.baseDcId && dcId !== this.baseDcId) {\n if(this.cachedExportPromise[dcId] === undefined) {\n const promise = new Promise((exportResolve, exportReject) => {\n this.invokeApi('auth.exportAuthorization', {dc_id: dcId}, {noErrorBox: true}).then((exportedAuth) => {\n this.invokeApi('auth.importAuthorization', {\n id: exportedAuth.id,\n bytes: exportedAuth.bytes\n }, {dcId, noErrorBox: true}).then(exportResolve, exportReject);\n }, exportReject);\n });\n\n this.cachedExportPromise[dcId] = promise;\n }\n\n return this.cachedExportPromise[dcId].then(() => performRequest());\n } else if(error.code === 303) {\n const newDcId = +error.type.match(/^(PHONE_MIGRATE_|NETWORK_MIGRATE_|USER_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n if(options.dcId) {\n options.dcId = newDcId;\n } else {\n this.setBaseDcId(newDcId);\n }\n\n return this.invokeApi(method, params, options);\n }\n } else if(error.code === 400 && error.type.indexOf('FILE_MIGRATE') === 0) {\n const newDcId = +error.type.match(/^(FILE_MIGRATE_)(\\d+)/)[2] as DcId;\n if(newDcId !== dcId) {\n options.dcId = newDcId;\n return this.invokeApi(method, params, options);\n } else {\n throw error;\n }\n } else if(error.code === 400 && error.type === 'CONNECTION_NOT_INITED') {\n this.networkerFactory.unsetConnectionInited();\n return performRequest();\n } else if(!options.rawError && error.code === 420) {\n const waitTime = +error.type.match(/^FLOOD_WAIT_(\\d+)/)[1] || 1;\n\n if(waitTime > (options.floodMaxTimeout ?? 60) && !options.prepareTempMessageId) {\n throw error;\n }\n\n return pause(waitTime/* (waitTime + 5) */ * 1000).then(() => performRequest());\n } else if(!options.rawError && ['MSG_WAIT_FAILED', 'MSG_WAIT_TIMEOUT'].includes(error.type)) {\n const after = this.afterMessageTempIds[afterMessageId];\n\n afterMessageId = undefined;\n delete options.afterMessageId;\n\n if(after) return after.promise.then(() => performRequest());\n else return performRequest();\n } else if(!options.rawError && error.code === 500) {\n const now = Date.now();\n if(options.stopTime) {\n if(now >= options.stopTime) {\n throw error;\n }\n }\n\n options.waitTime = options.waitTime ? Math.min(60, options.waitTime * 1.5) : 1;\n return pause(options.waitTime * 1000).then(() => performRequest());\n } else if(error.type === 'UNKNOWN' || error.type === 'MTPROTO_CLUSTER_INVALID') { // cluster invalid - request from regular user to premium endpoint\n return pause(1000).then(() => performRequest());\n } else {\n throw error;\n }\n });\n }\n\n let p: Promise;\n if(dcId = (options.dcId || this.baseDcId)) {\n p = this.getNetworker(dcId, options);\n } else {\n p = this.getBaseDcId().then((baseDcId) => this.getNetworker(dcId = baseDcId, options));\n }\n\n p.then((networker) => {\n cachedNetworker = networker;\n const promise = performRequest();\n cachedNetworker.attachPromise(deferred, options as MTMessage);\n return promise;\n })\n .then(deferred.resolve)\n .catch(rejectPromise)\n .catch(deferred.reject);\n\n return deferred;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport applyMixins from '../../helpers/applyMixins';\nimport EventListenerBase from '../../helpers/eventListenerBase';\nimport {AppManager} from '../appManagers/manager';\n\nexport type StatePeerType = 'recentSearch' | 'topPeer' | 'dialog' | 'contact' | 'topMessage' | 'self';\n\ntype PeersStorageKey = `${StatePeerType}_${string | PeerId}` | StatePeerType;\n\nclass PeersStorage {\n private neededPeers: Map> = new Map();\n private singlePeerMap: Map> = new Map();\n\n constructor() {\n this._constructor(false);\n }\n\n protected after() {\n this.rootScope.addEventListener('user_auth', () => {\n this.requestPeer(this.appPeersManager.peerId, 'self');\n });\n }\n\n public requestPeer(peerId: PeerId, key: PeersStorageKey) {\n let set = this.neededPeers.get(peerId);\n if(set && set.has(key)) {\n return;\n }\n\n if(!set) {\n set = new Set();\n this.neededPeers.set(peerId, set);\n }\n\n set.add(key);\n\n this.dispatchEvent('peerNeeded', peerId);\n }\n\n public releasePeer(peerId: PeerId, key: PeersStorageKey) {\n const set = this.neededPeers.get(peerId);\n if(!set) {\n return;\n }\n\n set.delete(key);\n\n if(!set.size) {\n this.neededPeers.delete(peerId);\n this.dispatchEvent('peerUnneeded', peerId);\n }\n }\n\n public requestPeersForKey(peerIds: Set | number[], key: PeersStorageKey) {\n if(Array.isArray(peerIds)) {\n peerIds = new Set(peerIds);\n }\n\n let set = this.singlePeerMap.get(key);\n if(set) {\n for(const peerId of set) {\n if(peerIds.has(peerId)) {\n continue;\n }\n\n this.releasePeer(peerId, key);\n set.delete(peerId);\n }\n\n if(!set.size && !peerIds.size) {\n this.singlePeerMap.delete(key);\n return;\n }\n }\n\n if(peerIds.size) {\n if(!set) {\n set = new Set();\n this.singlePeerMap.set(key, set);\n }\n\n for(const peerId of peerIds) {\n if(set.has(peerId)) {\n continue;\n }\n\n this.requestPeer(peerId, key);\n set.add(peerId);\n }\n }\n }\n\n public isPeerNeeded(peerId: PeerId) {\n return this.neededPeers.has(peerId);\n }\n}\n\ninterface PeersStorage extends EventListenerBase<{\n peerNeeded: (peerId: PeerId) => void,\n peerUnneeded: (peerId: PeerId) => void,\n}>, AppManager {}\napplyMixins(PeersStorage, [EventListenerBase, AppManager]);\n\nexport default PeersStorage;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {WebDocument} from '../../layer';\nimport type {MyDocument} from '../appManagers/appDocsManager';\nimport type {MyPhoto} from '../appManagers/appPhotosManager';\nimport {THUMB_TYPE_FULL} from '../mtproto/mtproto_config';\n\nexport type ThumbCache = {\n downloaded: number,\n url: string,\n type: string\n};\n\nexport type ThumbsCache = {\n [key: string]: {\n [size: string]: ThumbCache\n }\n};\n\nconst thumbFullSize = THUMB_TYPE_FULL;\n\nexport type ThumbStorageMedia = MyPhoto | MyDocument | WebDocument;\n\nexport default class ThumbsStorage {\n private thumbsCache: ThumbsCache = {};\n\n private getKey(media: ThumbStorageMedia) {\n return media._ + ((media as MyPhoto).id ?? (media as WebDocument).url);\n }\n\n public getCacheContext(media: ThumbStorageMedia, thumbSize: string = thumbFullSize): ThumbCache {\n /* if(media._ === 'photo' && thumbSize !== 'i') {\n thumbSize = thumbFullSize;\n } */\n\n const cache = this.thumbsCache[this.getKey(media)] ??= {};\n return cache[thumbSize] ??= {downloaded: 0, url: '', type: thumbSize};\n }\n\n public setCacheContextURL(media: ThumbStorageMedia, thumbSize: string = thumbFullSize, url: string, downloaded: number = 0) {\n const cacheContext = this.getCacheContext(media, thumbSize);\n cacheContext.url = url;\n cacheContext.downloaded = downloaded;\n return cacheContext;\n }\n\n public deleteCacheContext(media: ThumbStorageMedia, thumbSize: string = thumbFullSize) {\n const cache = this.thumbsCache[this.getKey(media)];\n if(cache) {\n delete cache[thumbSize];\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nexport type MTProtoConstructor = {\n id: number,\n predicate: string,\n params: Array<{\n name: string,\n type: string\n }>,\n type: string\n};\n\nexport type MTProtoMethod = {\n id: number,\n method: string,\n params: Array<{\n name: string,\n type: string\n }>,\n type: string\n};\n\n// eslint-disable-next-line quotes, comma-spacing\nexport default {\"MTProto\":{\"constructors\":[{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":85337187,\"predicate\":\"resPQ\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"server_public_key_fingerprints\",\"type\":\"Vector\"}],\"type\":\"ResPQ\"},{\"id\":-1443537003,\"predicate\":\"p_q_inner_data_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":1459478408,\"predicate\":\"p_q_inner_data_temp_dc\",\"params\":[{\"name\":\"pq\",\"type\":\"bytes\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce\",\"type\":\"int256\"},{\"name\":\"dc\",\"type\":\"int\"},{\"name\":\"expires_in\",\"type\":\"int\"}],\"type\":\"P_Q_inner_data\"},{\"id\":-790100132,\"predicate\":\"server_DH_params_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_answer\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-1249309254,\"predicate\":\"server_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"dh_prime\",\"type\":\"bytes\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"server_time\",\"type\":\"int\"}],\"type\":\"Server_DH_inner_data\"},{\"id\":1715713620,\"predicate\":\"client_DH_inner_data\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"retry_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"}],\"type\":\"Client_DH_Inner_Data\"},{\"id\":1003222836,\"predicate\":\"dh_gen_ok\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash1\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1188831161,\"predicate\":\"dh_gen_retry\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash2\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":-1499615742,\"predicate\":\"dh_gen_fail\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"new_nonce_hash3\",\"type\":\"int128\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1973679973,\"predicate\":\"bind_auth_key_inner\",\"params\":[{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"temp_auth_key_id\",\"type\":\"long\"},{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"temp_session_id\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"}],\"type\":\"BindAuthKeyInner\"},{\"id\":-212046591,\"predicate\":\"rpc_result\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"result\",\"type\":\"Object\"}],\"type\":\"RpcResult\"},{\"id\":558156313,\"predicate\":\"rpc_error\",\"params\":[{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"error_message\",\"type\":\"string\"}],\"type\":\"RpcError\"},{\"id\":1579864942,\"predicate\":\"rpc_answer_unknown\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-847714938,\"predicate\":\"rpc_answer_dropped_running\",\"params\":[],\"type\":\"RpcDropAnswer\"},{\"id\":-1539647305,\"predicate\":\"rpc_answer_dropped\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seq_no\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"}],\"type\":\"RpcDropAnswer\"},{\"id\":155834844,\"predicate\":\"future_salt\",\"params\":[{\"name\":\"valid_since\",\"type\":\"int\"},{\"name\":\"valid_until\",\"type\":\"int\"},{\"name\":\"salt\",\"type\":\"long\"}],\"type\":\"FutureSalt\"},{\"id\":-1370486635,\"predicate\":\"future_salts\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"now\",\"type\":\"int\"},{\"name\":\"salts\",\"type\":\"vector\"}],\"type\":\"FutureSalts\"},{\"id\":880243653,\"predicate\":\"pong\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-501201412,\"predicate\":\"destroy_session_ok\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":1658015945,\"predicate\":\"destroy_session_none\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1631450872,\"predicate\":\"new_session_created\",\"params\":[{\"name\":\"first_msg_id\",\"type\":\"long\"},{\"name\":\"unique_id\",\"type\":\"long\"},{\"name\":\"server_salt\",\"type\":\"long\"}],\"type\":\"NewSession\"},{\"id\":1945237724,\"predicate\":\"msg_container\",\"params\":[{\"name\":\"messages\",\"type\":\"vector<%Message>\"}],\"type\":\"MessageContainer\"},{\"id\":1538843921,\"predicate\":\"message\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"seqno\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"body\",\"type\":\"Object\"}],\"type\":\"Message\"},{\"id\":-530561358,\"predicate\":\"msg_copy\",\"params\":[{\"name\":\"orig_message\",\"type\":\"Message\"}],\"type\":\"MessageCopy\"},{\"id\":812830625,\"predicate\":\"gzip_packed\",\"params\":[{\"name\":\"packed_data\",\"type\":\"bytes\"}],\"type\":\"Object\"},{\"id\":1658238041,\"predicate\":\"msgs_ack\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsAck\"},{\"id\":-1477445615,\"predicate\":\"bad_msg_notification\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"}],\"type\":\"BadMsgNotification\"},{\"id\":-307542917,\"predicate\":\"bad_server_salt\",\"params\":[{\"name\":\"bad_msg_id\",\"type\":\"long\"},{\"name\":\"bad_msg_seqno\",\"type\":\"int\"},{\"name\":\"error_code\",\"type\":\"int\"},{\"name\":\"new_server_salt\",\"type\":\"long\"}],\"type\":\"BadMsgNotification\"},{\"id\":2105940488,\"predicate\":\"msg_resend_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgResendReq\"},{\"id\":-630588590,\"predicate\":\"msgs_state_req\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"}],\"type\":\"MsgsStateReq\"},{\"id\":81704317,\"predicate\":\"msgs_state_info\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsStateInfo\"},{\"id\":-1933520591,\"predicate\":\"msgs_all_info\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"info\",\"type\":\"bytes\"}],\"type\":\"MsgsAllInfo\"},{\"id\":661470918,\"predicate\":\"msg_detailed_info\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-2137147681,\"predicate\":\"msg_new_detailed_info\",\"params\":[{\"name\":\"answer_msg_id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"int\"},{\"name\":\"status\",\"type\":\"int\"}],\"type\":\"MsgDetailedInfo\"},{\"id\":-161422892,\"predicate\":\"destroy_auth_key_ok\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":178201177,\"predicate\":\"destroy_auth_key_none\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"},{\"id\":-368010477,\"predicate\":\"destroy_auth_key_fail\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}],\"methods\":[{\"id\":-1099002127,\"method\":\"req_pq_multi\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"}],\"type\":\"ResPQ\"},{\"id\":-686627650,\"method\":\"req_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"q\",\"type\":\"bytes\"},{\"name\":\"public_key_fingerprint\",\"type\":\"long\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Server_DH_Params\"},{\"id\":-184262881,\"method\":\"set_client_DH_params\",\"params\":[{\"name\":\"nonce\",\"type\":\"int128\"},{\"name\":\"server_nonce\",\"type\":\"int128\"},{\"name\":\"encrypted_data\",\"type\":\"bytes\"}],\"type\":\"Set_client_DH_params_answer\"},{\"id\":1491380032,\"method\":\"rpc_drop_answer\",\"params\":[{\"name\":\"req_msg_id\",\"type\":\"long\"}],\"type\":\"RpcDropAnswer\"},{\"id\":-1188971260,\"method\":\"get_future_salts\",\"params\":[{\"name\":\"num\",\"type\":\"int\"}],\"type\":\"FutureSalts\"},{\"id\":2059302892,\"method\":\"ping\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"}],\"type\":\"Pong\"},{\"id\":-213746804,\"method\":\"ping_delay_disconnect\",\"params\":[{\"name\":\"ping_id\",\"type\":\"long\"},{\"name\":\"disconnect_delay\",\"type\":\"int\"}],\"type\":\"Pong\"},{\"id\":-414113498,\"method\":\"destroy_session\",\"params\":[{\"name\":\"session_id\",\"type\":\"long\"}],\"type\":\"DestroySessionRes\"},{\"id\":-1835453025,\"method\":\"http_wait\",\"params\":[{\"name\":\"max_delay\",\"type\":\"int\"},{\"name\":\"wait_after\",\"type\":\"int\"},{\"name\":\"max_wait\",\"type\":\"int\"}],\"type\":\"HttpWait\"},{\"id\":-784117408,\"method\":\"destroy_auth_key\",\"params\":[],\"type\":\"DestroyAuthKeyRes\"}]},\"API\":{\"constructors\":[{\"id\":-1132882121,\"predicate\":\"boolFalse\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1720552011,\"predicate\":\"boolTrue\",\"params\":[],\"type\":\"Bool\"},{\"id\":1072550713,\"predicate\":\"true\",\"params\":[],\"type\":\"True\"},{\"id\":481674261,\"predicate\":\"vector\",\"params\":[],\"type\":\"Vector t\"},{\"id\":-994444869,\"predicate\":\"error\",\"params\":[{\"name\":\"code\",\"type\":\"int\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Error\"},{\"id\":1450380236,\"predicate\":\"null\",\"params\":[],\"type\":\"Null\"},{\"id\":2134579434,\"predicate\":\"inputPeerEmpty\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":2107670217,\"predicate\":\"inputPeerSelf\",\"params\":[],\"type\":\"InputPeer\"},{\"id\":900291769,\"predicate\":\"inputPeerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1182234929,\"predicate\":\"inputUserEmpty\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-138301121,\"predicate\":\"inputUserSelf\",\"params\":[],\"type\":\"InputUser\"},{\"id\":-208488460,\"predicate\":\"inputPhoneContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"InputContact\"},{\"id\":-181407105,\"predicate\":\"inputFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"md5_checksum\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":-1771768449,\"predicate\":\"inputMediaEmpty\",\"params\":[],\"type\":\"InputMedia\"},{\"id\":505969924,\"predicate\":\"inputMediaUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.2?true\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":-1279654347,\"predicate\":\"inputMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputPhoto\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-104578748,\"predicate\":\"inputMediaGeoPoint\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"}],\"type\":\"InputMedia\"},{\"id\":-122978821,\"predicate\":\"inputMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":480546647,\"predicate\":\"inputChatPhotoEmpty\",\"params\":[],\"type\":\"InputChatPhoto\"},{\"id\":-968723890,\"predicate\":\"inputChatUploadedPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"InputChatPhoto\"},{\"id\":-1991004873,\"predicate\":\"inputChatPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputChatPhoto\"},{\"id\":-457104426,\"predicate\":\"inputGeoPointEmpty\",\"params\":[],\"type\":\"InputGeoPoint\"},{\"id\":1210199983,\"predicate\":\"inputGeoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"InputGeoPoint\"},{\"id\":483901197,\"predicate\":\"inputPhotoEmpty\",\"params\":[],\"type\":\"InputPhoto\"},{\"id\":1001634122,\"predicate\":\"inputPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputPhoto\"},{\"id\":-539317279,\"predicate\":\"inputFileLocation\",\"params\":[{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputFileLocation\"},{\"id\":1498486562,\"predicate\":\"peerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":918946202,\"predicate\":\"peerChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":-1432995067,\"predicate\":\"storage.fileUnknown\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1086091090,\"predicate\":\"storage.filePartial\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":8322574,\"predicate\":\"storage.fileJpeg\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-891180321,\"predicate\":\"storage.fileGif\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":172975040,\"predicate\":\"storage.filePng\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1373745011,\"predicate\":\"storage.filePdf\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1384777335,\"predicate\":\"storage.fileMp3\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":1258941372,\"predicate\":\"storage.fileMov\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-1278304028,\"predicate\":\"storage.fileMp4\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":276907596,\"predicate\":\"storage.fileWebp\",\"params\":[],\"type\":\"storage.FileType\"},{\"id\":-742634630,\"predicate\":\"userEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"User\"},{\"id\":1326562017,\"predicate\":\"userProfilePhotoEmpty\",\"params\":[],\"type\":\"UserProfilePhoto\"},{\"id\":-2100168954,\"predicate\":\"userProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"personal\",\"type\":\"flags.2?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"UserProfilePhoto\"},{\"id\":164646985,\"predicate\":\"userStatusEmpty\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-306628279,\"predicate\":\"userStatusOnline\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":9203775,\"predicate\":\"userStatusOffline\",\"params\":[{\"name\":\"was_online\",\"type\":\"int\"}],\"type\":\"UserStatus\"},{\"id\":693512293,\"predicate\":\"chatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Chat\"},{\"id\":1103884886,\"predicate\":\"chat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"deactivated\",\"type\":\"flags.5?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.25?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"migrated_to\",\"type\":\"flags.6?InputChannel\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"}],\"type\":\"Chat\"},{\"id\":1704108455,\"predicate\":\"chatForbidden\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Chat\"},{\"id\":-908914376,\"predicate\":\"chatFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_set_username\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants\",\"type\":\"ChatParticipants\"},{\"name\":\"chat_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.13?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"flags.3?Vector\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"call\",\"type\":\"flags.12?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.15?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.16?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.17?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.17?Vector\"},{\"name\":\"available_reactions\",\"type\":\"flags.18?ChatReactions\"}],\"type\":\"ChatFull\"},{\"id\":-1070776313,\"predicate\":\"chatParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-2023500831,\"predicate\":\"chatParticipantsForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"self_participant\",\"type\":\"flags.0?ChatParticipant\"}],\"type\":\"ChatParticipants\"},{\"id\":1018991608,\"predicate\":\"chatParticipants\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"ChatParticipants\"},{\"id\":935395612,\"predicate\":\"chatPhotoEmpty\",\"params\":[],\"type\":\"ChatPhoto\"},{\"id\":476978193,\"predicate\":\"chatPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_video\",\"type\":\"flags.0?true\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"stripped_thumb\",\"type\":\"flags.1?bytes\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"ChatPhoto\"},{\"id\":-1868117372,\"predicate\":\"messageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"peer_id\",\"type\":\"flags.0?Peer\"}],\"type\":\"Message\"},{\"id\":940666592,\"predicate\":\"message\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"from_scheduled\",\"type\":\"flags.18?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"edit_hide\",\"type\":\"flags.21?true\"},{\"name\":\"pinned\",\"type\":\"flags.24?true\"},{\"name\":\"noforwards\",\"type\":\"flags.26?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.6?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"views\",\"type\":\"flags.10?int\"},{\"name\":\"forwards\",\"type\":\"flags.10?int\"},{\"name\":\"replies\",\"type\":\"flags.23?MessageReplies\"},{\"name\":\"edit_date\",\"type\":\"flags.15?int\"},{\"name\":\"post_author\",\"type\":\"flags.16?string\"},{\"name\":\"grouped_id\",\"type\":\"flags.17?long\"},{\"name\":\"reactions\",\"type\":\"flags.20?MessageReactions\"},{\"name\":\"restriction_reason\",\"type\":\"flags.22?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":721967202,\"predicate\":\"messageService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"post\",\"type\":\"flags.14?true\"},{\"name\":\"legacy\",\"type\":\"flags.19?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"flags.8?Peer\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"action\",\"type\":\"MessageAction\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Message\"},{\"id\":1038967584,\"predicate\":\"messageMediaEmpty\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":1766936791,\"predicate\":\"messageMediaPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.3?true\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1457575028,\"predicate\":\"messageMediaGeo\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"}],\"type\":\"MessageMedia\"},{\"id\":1882335561,\"predicate\":\"messageMediaContact\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageMedia\"},{\"id\":-1618676578,\"predicate\":\"messageMediaUnsupported\",\"params\":[],\"type\":\"MessageMedia\"},{\"id\":-1230047312,\"predicate\":\"messageActionEmpty\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1119368275,\"predicate\":\"messageActionChatCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1247687078,\"predicate\":\"messageActionChatEditTitle\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":2144015272,\"predicate\":\"messageActionChatEditPhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":-1780220945,\"predicate\":\"messageActionChatDeletePhoto\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":365886720,\"predicate\":\"messageActionChatAddUser\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-1539362612,\"predicate\":\"messageActionChatDeleteUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-712374074,\"predicate\":\"dialog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"unread_mark\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"unread_reactions_count\",\"type\":\"int\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"flags.1?DraftMessage\"},{\"name\":\"folder_id\",\"type\":\"flags.4?int\"},{\"name\":\"ttl_period\",\"type\":\"flags.5?int\"}],\"type\":\"Dialog\"},{\"id\":590459437,\"predicate\":\"photoEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Photo\"},{\"id\":-82216347,\"predicate\":\"photo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_stickers\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"},{\"name\":\"video_sizes\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"Photo\"},{\"id\":236446268,\"predicate\":\"photoSizeEmpty\",\"params\":[{\"name\":\"type\",\"type\":\"string\"}],\"type\":\"PhotoSize\"},{\"id\":1976012384,\"predicate\":\"photoSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"}],\"type\":\"PhotoSize\"},{\"id\":35527382,\"predicate\":\"photoCachedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":286776671,\"predicate\":\"geoPointEmpty\",\"params\":[],\"type\":\"GeoPoint\"},{\"id\":-1297942941,\"predicate\":\"geoPoint\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"long\",\"type\":\"double\"},{\"name\":\"lat\",\"type\":\"double\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"accuracy_radius\",\"type\":\"flags.0?int\"}],\"type\":\"GeoPoint\"},{\"id\":1577067778,\"predicate\":\"auth.sentCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"auth.SentCodeType\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"next_type\",\"type\":\"flags.1?auth.CodeType\"},{\"name\":\"timeout\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCode\"},{\"id\":872119224,\"predicate\":\"auth.authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"setup_password_required\",\"type\":\"flags.1?true\"},{\"name\":\"otherwise_relogin_days\",\"type\":\"flags.1?int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"auth.Authorization\"},{\"id\":-1271602504,\"predicate\":\"auth.exportedAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1195615476,\"predicate\":\"inputNotifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputNotifyPeer\"},{\"id\":423314455,\"predicate\":\"inputNotifyUsers\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":1251338318,\"predicate\":\"inputNotifyChats\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-551616469,\"predicate\":\"inputPeerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"sound\",\"type\":\"flags.3?NotificationSound\"}],\"type\":\"InputPeerNotifySettings\"},{\"id\":-1472527322,\"predicate\":\"peerNotifySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"show_previews\",\"type\":\"flags.0?Bool\"},{\"name\":\"silent\",\"type\":\"flags.1?Bool\"},{\"name\":\"mute_until\",\"type\":\"flags.2?int\"},{\"name\":\"ios_sound\",\"type\":\"flags.3?NotificationSound\"},{\"name\":\"android_sound\",\"type\":\"flags.4?NotificationSound\"},{\"name\":\"other_sound\",\"type\":\"flags.5?NotificationSound\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-1525149427,\"predicate\":\"peerSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"report_spam\",\"type\":\"flags.0?true\"},{\"name\":\"add_contact\",\"type\":\"flags.1?true\"},{\"name\":\"block_contact\",\"type\":\"flags.2?true\"},{\"name\":\"share_contact\",\"type\":\"flags.3?true\"},{\"name\":\"need_contacts_exception\",\"type\":\"flags.4?true\"},{\"name\":\"report_geo\",\"type\":\"flags.5?true\"},{\"name\":\"autoarchived\",\"type\":\"flags.7?true\"},{\"name\":\"invite_members\",\"type\":\"flags.8?true\"},{\"name\":\"request_chat_broadcast\",\"type\":\"flags.10?true\"},{\"name\":\"geo_distance\",\"type\":\"flags.6?int\"},{\"name\":\"request_chat_title\",\"type\":\"flags.9?string\"},{\"name\":\"request_chat_date\",\"type\":\"flags.9?int\"}],\"type\":\"PeerSettings\"},{\"id\":-1539849235,\"predicate\":\"wallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"pattern\",\"type\":\"flags.3?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"Document\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1490799288,\"predicate\":\"inputReportReasonSpam\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":505595789,\"predicate\":\"inputReportReasonViolence\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":777640226,\"predicate\":\"inputReportReasonPornography\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1376497949,\"predicate\":\"inputReportReasonChildAbuse\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1041980751,\"predicate\":\"inputReportReasonOther\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-120378643,\"predicate\":\"userFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blocked\",\"type\":\"flags.0?true\"},{\"name\":\"phone_calls_available\",\"type\":\"flags.4?true\"},{\"name\":\"phone_calls_private\",\"type\":\"flags.5?true\"},{\"name\":\"can_pin_message\",\"type\":\"flags.7?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.12?true\"},{\"name\":\"video_calls_available\",\"type\":\"flags.13?true\"},{\"name\":\"voice_messages_forbidden\",\"type\":\"flags.20?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"flags.1?string\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"personal_photo\",\"type\":\"flags.21?Photo\"},{\"name\":\"profile_photo\",\"type\":\"flags.2?Photo\"},{\"name\":\"fallback_photo\",\"type\":\"flags.22?Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"bot_info\",\"type\":\"flags.3?BotInfo\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.6?int\"},{\"name\":\"common_chats_count\",\"type\":\"int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"ttl_period\",\"type\":\"flags.14?int\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.15?string\"},{\"name\":\"private_forward_name\",\"type\":\"flags.16?string\"},{\"name\":\"bot_group_admin_rights\",\"type\":\"flags.17?ChatAdminRights\"},{\"name\":\"bot_broadcast_admin_rights\",\"type\":\"flags.18?ChatAdminRights\"},{\"name\":\"premium_gifts\",\"type\":\"flags.19?Vector\"}],\"type\":\"UserFull\"},{\"id\":341499403,\"predicate\":\"contact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"mutual\",\"type\":\"Bool\"}],\"type\":\"Contact\"},{\"id\":-1052885936,\"predicate\":\"importedContact\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"client_id\",\"type\":\"long\"}],\"type\":\"ImportedContact\"},{\"id\":383348795,\"predicate\":\"contactStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"ContactStatus\"},{\"id\":-1219778094,\"predicate\":\"contacts.contactsNotModified\",\"params\":[],\"type\":\"contacts.Contacts\"},{\"id\":-353862078,\"predicate\":\"contacts.contacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"},{\"name\":\"saved_count\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Contacts\"},{\"id\":2010127419,\"predicate\":\"contacts.importedContacts\",\"params\":[{\"name\":\"imported\",\"type\":\"Vector\"},{\"name\":\"popular_invites\",\"type\":\"Vector\"},{\"name\":\"retry_contacts\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":182326673,\"predicate\":\"contacts.blocked\",\"params\":[{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":-513392236,\"predicate\":\"contacts.blockedSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"blocked\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Blocked\"},{\"id\":364538944,\"predicate\":\"messages.dialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":1910543603,\"predicate\":\"messages.dialogsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1938715001,\"predicate\":\"messages.messages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":978610270,\"predicate\":\"messages.messagesSlice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"next_rate\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":1694474197,\"predicate\":\"messages.chats\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-438840932,\"predicate\":\"messages.chatFull\",\"params\":[{\"name\":\"full_chat\",\"type\":\"ChatFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatFull\"},{\"id\":-1269012015,\"predicate\":\"messages.affectedHistory\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1474492012,\"predicate\":\"inputMessagesFilterEmpty\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1777752804,\"predicate\":\"inputMessagesFilterPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1614803355,\"predicate\":\"inputMessagesFilterVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1458172132,\"predicate\":\"inputMessagesFilterPhotoVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1629621880,\"predicate\":\"inputMessagesFilterDocument\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":2129714567,\"predicate\":\"inputMessagesFilterUrl\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-3644025,\"predicate\":\"inputMessagesFilterGif\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":522914557,\"predicate\":\"updateNewMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1318109142,\"predicate\":\"updateMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-1576161051,\"predicate\":\"updateDeleteMessages\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1071741569,\"predicate\":\"updateUserTyping\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-2092401936,\"predicate\":\"updateChatUserTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":125178264,\"predicate\":\"updateChatParticipants\",\"params\":[{\"name\":\"participants\",\"type\":\"ChatParticipants\"}],\"type\":\"Update\"},{\"id\":-440534818,\"predicate\":\"updateUserStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"status\",\"type\":\"UserStatus\"}],\"type\":\"Update\"},{\"id\":-1484486364,\"predicate\":\"updateUserName\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"usernames\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1519637954,\"predicate\":\"updates.state\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"}],\"type\":\"updates.State\"},{\"id\":1567990072,\"predicate\":\"updates.differenceEmpty\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":16030880,\"predicate\":\"updates.difference\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-1459938943,\"predicate\":\"updates.differenceSlice\",\"params\":[{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"new_encrypted_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"intermediate_state\",\"type\":\"updates.State\"}],\"type\":\"updates.Difference\"},{\"id\":-484987010,\"predicate\":\"updatesTooLong\",\"params\":[],\"type\":\"Updates\"},{\"id\":826001400,\"predicate\":\"updateShortMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":1299050149,\"predicate\":\"updateShortChatMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"mentioned\",\"type\":\"flags.4?true\"},{\"name\":\"media_unread\",\"type\":\"flags.5?true\"},{\"name\":\"silent\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"fwd_from\",\"type\":\"flags.2?MessageFwdHeader\"},{\"name\":\"via_bot_id\",\"type\":\"flags.11?long\"},{\"name\":\"reply_to\",\"type\":\"flags.3?MessageReplyHeader\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":2027216577,\"predicate\":\"updateShort\",\"params\":[{\"name\":\"update\",\"type\":\"Update\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1918567619,\"predicate\":\"updatesCombined\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq_start\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1957577280,\"predicate\":\"updates\",\"params\":[{\"name\":\"updates\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"seq\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1916114267,\"predicate\":\"photos.photos\",\"params\":[{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":352657236,\"predicate\":\"photos.photosSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photos\"},{\"id\":539045032,\"predicate\":\"photos.photo\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"photos.Photo\"},{\"id\":157948117,\"predicate\":\"upload.file\",\"params\":[{\"name\":\"type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.File\"},{\"id\":414687501,\"predicate\":\"dcOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"ipv6\",\"type\":\"flags.0?true\"},{\"name\":\"media_only\",\"type\":\"flags.1?true\"},{\"name\":\"tcpo_only\",\"type\":\"flags.2?true\"},{\"name\":\"cdn\",\"type\":\"flags.3?true\"},{\"name\":\"static\",\"type\":\"flags.4?true\"},{\"name\":\"this_port_only\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"ip_address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"flags.10?bytes\"}],\"type\":\"DcOption\"},{\"id\":589653676,\"predicate\":\"config\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phonecalls_enabled\",\"type\":\"flags.1?true\"},{\"name\":\"default_p2p_contacts\",\"type\":\"flags.3?true\"},{\"name\":\"preload_featured_stickers\",\"type\":\"flags.4?true\"},{\"name\":\"ignore_phone_entities\",\"type\":\"flags.5?true\"},{\"name\":\"revoke_pm_inbox\",\"type\":\"flags.6?true\"},{\"name\":\"blocked_mode\",\"type\":\"flags.8?true\"},{\"name\":\"pfs_enabled\",\"type\":\"flags.13?true\"},{\"name\":\"force_try_ipv6\",\"type\":\"flags.14?true\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"test_mode\",\"type\":\"Bool\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"dc_options\",\"type\":\"Vector\"},{\"name\":\"dc_txt_domain_name\",\"type\":\"string\"},{\"name\":\"chat_size_max\",\"type\":\"int\"},{\"name\":\"megagroup_size_max\",\"type\":\"int\"},{\"name\":\"forwarded_count_max\",\"type\":\"int\"},{\"name\":\"online_update_period_ms\",\"type\":\"int\"},{\"name\":\"offline_blur_timeout_ms\",\"type\":\"int\"},{\"name\":\"offline_idle_timeout_ms\",\"type\":\"int\"},{\"name\":\"online_cloud_timeout_ms\",\"type\":\"int\"},{\"name\":\"notify_cloud_delay_ms\",\"type\":\"int\"},{\"name\":\"notify_default_delay_ms\",\"type\":\"int\"},{\"name\":\"push_chat_period_ms\",\"type\":\"int\"},{\"name\":\"push_chat_limit\",\"type\":\"int\"},{\"name\":\"saved_gifs_limit\",\"type\":\"int\"},{\"name\":\"edit_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_time_limit\",\"type\":\"int\"},{\"name\":\"revoke_pm_time_limit\",\"type\":\"int\"},{\"name\":\"rating_e_decay\",\"type\":\"int\"},{\"name\":\"stickers_recent_limit\",\"type\":\"int\"},{\"name\":\"stickers_faved_limit\",\"type\":\"int\"},{\"name\":\"channels_read_media_period\",\"type\":\"int\"},{\"name\":\"tmp_sessions\",\"type\":\"flags.0?int\"},{\"name\":\"pinned_dialogs_count_max\",\"type\":\"int\"},{\"name\":\"pinned_infolder_count_max\",\"type\":\"int\"},{\"name\":\"call_receive_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_ring_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_connect_timeout_ms\",\"type\":\"int\"},{\"name\":\"call_packet_timeout_ms\",\"type\":\"int\"},{\"name\":\"me_url_prefix\",\"type\":\"string\"},{\"name\":\"autoupdate_url_prefix\",\"type\":\"flags.7?string\"},{\"name\":\"gif_search_username\",\"type\":\"flags.9?string\"},{\"name\":\"venue_search_username\",\"type\":\"flags.10?string\"},{\"name\":\"img_search_username\",\"type\":\"flags.11?string\"},{\"name\":\"static_maps_provider\",\"type\":\"flags.12?string\"},{\"name\":\"caption_length_max\",\"type\":\"int\"},{\"name\":\"message_length_max\",\"type\":\"int\"},{\"name\":\"webfile_dc_id\",\"type\":\"int\"},{\"name\":\"suggested_lang_code\",\"type\":\"flags.2?string\"},{\"name\":\"lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"base_lang_pack_version\",\"type\":\"flags.2?int\"},{\"name\":\"reactions_default\",\"type\":\"flags.15?Reaction\"}],\"type\":\"Config\"},{\"id\":-1910892683,\"predicate\":\"nearestDc\",\"params\":[{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"this_dc\",\"type\":\"int\"},{\"name\":\"nearest_dc\",\"type\":\"int\"}],\"type\":\"NearestDc\"},{\"id\":-860107216,\"predicate\":\"help.appUpdate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_not_skip\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"sticker\",\"type\":\"flags.3?Document\"}],\"type\":\"help.AppUpdate\"},{\"id\":-1000708810,\"predicate\":\"help.noAppUpdate\",\"params\":[],\"type\":\"help.AppUpdate\"},{\"id\":415997816,\"predicate\":\"help.inviteText\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"help.InviteText\"},{\"id\":314359194,\"predicate\":\"updateNewEncryptedMessage\",\"params\":[{\"name\":\"message\",\"type\":\"EncryptedMessage\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":386986326,\"predicate\":\"updateEncryptedChatTyping\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1264392051,\"predicate\":\"updateEncryption\",\"params\":[{\"name\":\"chat\",\"type\":\"EncryptedChat\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":956179895,\"predicate\":\"updateEncryptedMessagesRead\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1417756512,\"predicate\":\"encryptedChatEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":1722964307,\"predicate\":\"encryptedChatWaiting\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":1223809356,\"predicate\":\"encryptedChatRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1643173063,\"predicate\":\"encryptedChat\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":505183301,\"predicate\":\"encryptedChatDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"history_deleted\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"EncryptedChat\"},{\"id\":-247351839,\"predicate\":\"inputEncryptedChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedChat\"},{\"id\":-1038136962,\"predicate\":\"encryptedFileEmpty\",\"params\":[],\"type\":\"EncryptedFile\"},{\"id\":-1476358952,\"predicate\":\"encryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"long\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"EncryptedFile\"},{\"id\":406307684,\"predicate\":\"inputEncryptedFileEmpty\",\"params\":[],\"type\":\"InputEncryptedFile\"},{\"id\":1690108678,\"predicate\":\"inputEncryptedFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1511503333,\"predicate\":\"inputEncryptedFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputEncryptedFile\"},{\"id\":-182231723,\"predicate\":\"inputEncryptedFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-317144808,\"predicate\":\"encryptedMessage\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"EncryptedMessage\"},{\"id\":594758406,\"predicate\":\"encryptedMessageService\",\"params\":[{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"chat_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"EncryptedMessage\"},{\"id\":-1058912715,\"predicate\":\"messages.dhConfigNotModified\",\"params\":[{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":740433629,\"predicate\":\"messages.dhConfig\",\"params\":[{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random\",\"type\":\"bytes\"}],\"type\":\"messages.DhConfig\"},{\"id\":1443858741,\"predicate\":\"messages.sentEncryptedMessage\",\"params\":[{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-1802240206,\"predicate\":\"messages.sentEncryptedFile\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file\",\"type\":\"EncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":-95482955,\"predicate\":\"inputFileBig\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"InputFile\"},{\"id\":767652808,\"predicate\":\"inputEncryptedFileBigUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"key_fingerprint\",\"type\":\"int\"}],\"type\":\"InputEncryptedFile\"},{\"id\":1037718609,\"predicate\":\"updateChatParticipantAdd\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-483443337,\"predicate\":\"updateChatParticipantDelete\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1906403213,\"predicate\":\"updateDcOptions\",\"params\":[{\"name\":\"dc_options\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1530447553,\"predicate\":\"inputMediaUploadedDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nosound_video\",\"type\":\"flags.3?true\"},{\"name\":\"force_file\",\"type\":\"flags.4?true\"},{\"name\":\"spoiler\",\"type\":\"flags.5?true\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"flags.0?Vector\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.1?int\"}],\"type\":\"InputMedia\"},{\"id\":860303448,\"predicate\":\"inputMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"},{\"name\":\"query\",\"type\":\"flags.1?string\"}],\"type\":\"InputMedia\"},{\"id\":-1666158377,\"predicate\":\"messageMediaDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"nopremium\",\"type\":\"flags.3?true\"},{\"name\":\"spoiler\",\"type\":\"flags.4?true\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.2?int\"}],\"type\":\"MessageMedia\"},{\"id\":1928391342,\"predicate\":\"inputDocumentEmpty\",\"params\":[],\"type\":\"InputDocument\"},{\"id\":448771445,\"predicate\":\"inputDocument\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"}],\"type\":\"InputDocument\"},{\"id\":-1160743548,\"predicate\":\"inputDocumentFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":922273905,\"predicate\":\"documentEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"Document\"},{\"id\":-1881881384,\"predicate\":\"document\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"long\"},{\"name\":\"thumbs\",\"type\":\"flags.0?Vector\"},{\"name\":\"video_thumbs\",\"type\":\"flags.1?Vector\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"Document\"},{\"id\":398898678,\"predicate\":\"help.support\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"user\",\"type\":\"User\"}],\"type\":\"help.Support\"},{\"id\":-1613493288,\"predicate\":\"notifyPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"NotifyPeer\"},{\"id\":-1261946036,\"predicate\":\"notifyUsers\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1073230141,\"predicate\":\"notifyChats\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-1094555409,\"predicate\":\"updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"NotifyPeer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"}],\"type\":\"Update\"},{\"id\":381645902,\"predicate\":\"sendMessageTypingAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-44119819,\"predicate\":\"sendMessageCancelAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1584933265,\"predicate\":\"sendMessageRecordVideoAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-378127636,\"predicate\":\"sendMessageUploadVideoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-718310409,\"predicate\":\"sendMessageRecordAudioAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-212740181,\"predicate\":\"sendMessageUploadAudioAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-774682074,\"predicate\":\"sendMessageUploadPhotoAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-1441998364,\"predicate\":\"sendMessageUploadDocumentAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":393186209,\"predicate\":\"sendMessageGeoLocationAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":1653390447,\"predicate\":\"sendMessageChooseContactAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-1290580579,\"predicate\":\"contacts.found\",\"params\":[{\"name\":\"my_results\",\"type\":\"Vector\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.Found\"},{\"id\":-337352679,\"predicate\":\"updateServiceNotification\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"inbox_date\",\"type\":\"flags.1?int\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"MessageMedia\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-496024847,\"predicate\":\"userStatusRecently\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":129960444,\"predicate\":\"userStatusLastWeek\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":2011940674,\"predicate\":\"userStatusLastMonth\",\"params\":[],\"type\":\"UserStatus\"},{\"id\":-298113238,\"predicate\":\"updatePrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"PrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":1335282456,\"predicate\":\"inputPrivacyKeyStatusTimestamp\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1137792208,\"predicate\":\"privacyKeyStatusTimestamp\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":218751099,\"predicate\":\"inputPrivacyValueAllowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":407582158,\"predicate\":\"inputPrivacyValueAllowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":320652927,\"predicate\":\"inputPrivacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":195371015,\"predicate\":\"inputPrivacyValueDisallowContacts\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-697604407,\"predicate\":\"inputPrivacyValueDisallowAll\",\"params\":[],\"type\":\"InputPrivacyRule\"},{\"id\":-1877932953,\"predicate\":\"inputPrivacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-123988,\"predicate\":\"privacyValueAllowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":1698855810,\"predicate\":\"privacyValueAllowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1198497870,\"predicate\":\"privacyValueAllowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":-125240806,\"predicate\":\"privacyValueDisallowContacts\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-1955338397,\"predicate\":\"privacyValueDisallowAll\",\"params\":[],\"type\":\"PrivacyRule\"},{\"id\":-463335103,\"predicate\":\"privacyValueDisallowUsers\",\"params\":[{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1352683077,\"predicate\":\"account.privacyRules\",\"params\":[{\"name\":\"rules\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-1194283041,\"predicate\":\"accountDaysTTL\",\"params\":[{\"name\":\"days\",\"type\":\"int\"}],\"type\":\"AccountDaysTTL\"},{\"id\":88680979,\"predicate\":\"updateUserPhone\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1815593308,\"predicate\":\"documentAttributeImageSize\",\"params\":[{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":297109817,\"predicate\":\"documentAttributeAnimated\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1662637586,\"predicate\":\"documentAttributeSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"mask\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"DocumentAttribute\"},{\"id\":250621158,\"predicate\":\"documentAttributeVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"round_message\",\"type\":\"flags.0?true\"},{\"name\":\"supports_streaming\",\"type\":\"flags.1?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"DocumentAttribute\"},{\"id\":-1739392570,\"predicate\":\"documentAttributeAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"voice\",\"type\":\"flags.10?true\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"},{\"name\":\"waveform\",\"type\":\"flags.2?bytes\"}],\"type\":\"DocumentAttribute\"},{\"id\":358154344,\"predicate\":\"documentAttributeFilename\",\"params\":[{\"name\":\"file_name\",\"type\":\"string\"}],\"type\":\"DocumentAttribute\"},{\"id\":-244016606,\"predicate\":\"messages.stickersNotModified\",\"params\":[],\"type\":\"messages.Stickers\"},{\"id\":816245886,\"predicate\":\"messages.stickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.Stickers\"},{\"id\":313694676,\"predicate\":\"stickerPack\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"StickerPack\"},{\"id\":-395967805,\"predicate\":\"messages.allStickersNotModified\",\"params\":[],\"type\":\"messages.AllStickers\"},{\"id\":-843329861,\"predicate\":\"messages.allStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.AllStickers\"},{\"id\":-1667805217,\"predicate\":\"updateReadHistoryInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":791617983,\"predicate\":\"updateReadHistoryOutbox\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-2066640507,\"predicate\":\"messages.affectedMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":2139689491,\"predicate\":\"updateWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-350980120,\"predicate\":\"webPageEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"WebPage\"},{\"id\":-981018084,\"predicate\":\"webPagePending\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-392411726,\"predicate\":\"webPage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"display_url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"type\",\"type\":\"flags.0?string\"},{\"name\":\"site_name\",\"type\":\"flags.1?string\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"embed_url\",\"type\":\"flags.5?string\"},{\"name\":\"embed_type\",\"type\":\"flags.5?string\"},{\"name\":\"embed_width\",\"type\":\"flags.6?int\"},{\"name\":\"embed_height\",\"type\":\"flags.6?int\"},{\"name\":\"duration\",\"type\":\"flags.7?int\"},{\"name\":\"author\",\"type\":\"flags.8?string\"},{\"name\":\"document\",\"type\":\"flags.9?Document\"},{\"name\":\"cached_page\",\"type\":\"flags.10?Page\"},{\"name\":\"attributes\",\"type\":\"flags.12?Vector\"}],\"type\":\"WebPage\"},{\"id\":-1557277184,\"predicate\":\"messageMediaWebPage\",\"params\":[{\"name\":\"webpage\",\"type\":\"WebPage\"}],\"type\":\"MessageMedia\"},{\"id\":-1392388579,\"predicate\":\"authorization\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.0?true\"},{\"name\":\"official_app\",\"type\":\"flags.1?true\"},{\"name\":\"password_pending\",\"type\":\"flags.2?true\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.3?true\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.4?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"app_name\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"country\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"Authorization\"},{\"id\":1275039392,\"predicate\":\"account.authorizations\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"},{\"name\":\"authorizations\",\"type\":\"Vector\"}],\"type\":\"account.Authorizations\"},{\"id\":-1787080453,\"predicate\":\"account.password\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_recovery\",\"type\":\"flags.0?true\"},{\"name\":\"has_secure_values\",\"type\":\"flags.1?true\"},{\"name\":\"has_password\",\"type\":\"flags.2?true\"},{\"name\":\"current_algo\",\"type\":\"flags.2?PasswordKdfAlgo\"},{\"name\":\"srp_B\",\"type\":\"flags.2?bytes\"},{\"name\":\"srp_id\",\"type\":\"flags.2?long\"},{\"name\":\"hint\",\"type\":\"flags.3?string\"},{\"name\":\"email_unconfirmed_pattern\",\"type\":\"flags.4?string\"},{\"name\":\"new_algo\",\"type\":\"PasswordKdfAlgo\"},{\"name\":\"new_secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_random\",\"type\":\"bytes\"},{\"name\":\"pending_reset_date\",\"type\":\"flags.5?int\"},{\"name\":\"login_email_pattern\",\"type\":\"flags.6?string\"}],\"type\":\"account.Password\"},{\"id\":-1705233435,\"predicate\":\"account.passwordSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"email\",\"type\":\"flags.0?string\"},{\"name\":\"secure_settings\",\"type\":\"flags.1?SecureSecretSettings\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1036572727,\"predicate\":\"account.passwordInputSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"new_algo\",\"type\":\"flags.0?PasswordKdfAlgo\"},{\"name\":\"new_password_hash\",\"type\":\"flags.0?bytes\"},{\"name\":\"hint\",\"type\":\"flags.0?string\"},{\"name\":\"email\",\"type\":\"flags.1?string\"},{\"name\":\"new_secure_settings\",\"type\":\"flags.2?SecureSecretSettings\"}],\"type\":\"account.PasswordInputSettings\"},{\"id\":326715557,\"predicate\":\"auth.passwordRecovery\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"}],\"type\":\"auth.PasswordRecovery\"},{\"id\":-1052959727,\"predicate\":\"inputMediaVenue\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":784356159,\"predicate\":\"messageMediaVenue\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-1551583367,\"predicate\":\"receivedNotifyMessage\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"flags\",\"type\":\"int\"}],\"type\":\"ReceivedNotifyMessage\"},{\"id\":179611673,\"predicate\":\"chatInviteExported\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.0?true\"},{\"name\":\"permanent\",\"type\":\"flags.5?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"start_date\",\"type\":\"flags.4?int\"},{\"name\":\"expire_date\",\"type\":\"flags.1?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.2?int\"},{\"name\":\"usage\",\"type\":\"flags.3?int\"},{\"name\":\"requested\",\"type\":\"flags.7?int\"},{\"name\":\"title\",\"type\":\"flags.8?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1516793212,\"predicate\":\"chatInviteAlready\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"}],\"type\":\"ChatInvite\"},{\"id\":806110401,\"predicate\":\"chatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"flags.0?true\"},{\"name\":\"broadcast\",\"type\":\"flags.1?true\"},{\"name\":\"public\",\"type\":\"flags.2?true\"},{\"name\":\"megagroup\",\"type\":\"flags.3?true\"},{\"name\":\"request_needed\",\"type\":\"flags.6?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"flags.5?string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"flags.4?Vector\"}],\"type\":\"ChatInvite\"},{\"id\":51520707,\"predicate\":\"messageActionChatJoinedByLink\",\"params\":[{\"name\":\"inviter_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":1757493555,\"predicate\":\"updateReadMessagesContents\",\"params\":[{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-4838507,\"predicate\":\"inputStickerSetEmpty\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1645763991,\"predicate\":\"inputStickerSetID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputStickerSet\"},{\"id\":-2044933984,\"predicate\":\"inputStickerSetShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":768691932,\"predicate\":\"stickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archived\",\"type\":\"flags.1?true\"},{\"name\":\"official\",\"type\":\"flags.2?true\"},{\"name\":\"masks\",\"type\":\"flags.3?true\"},{\"name\":\"animated\",\"type\":\"flags.5?true\"},{\"name\":\"videos\",\"type\":\"flags.6?true\"},{\"name\":\"emojis\",\"type\":\"flags.7?true\"},{\"name\":\"installed_date\",\"type\":\"flags.0?int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumbs\",\"type\":\"flags.4?Vector\"},{\"name\":\"thumb_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"thumb_version\",\"type\":\"flags.4?int\"},{\"name\":\"thumb_document_id\",\"type\":\"flags.8?long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"StickerSet\"},{\"id\":1846886166,\"predicate\":\"messages.stickerSet\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"keywords\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSet\"},{\"id\":-1885878744,\"predicate\":\"user\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"self\",\"type\":\"flags.10?true\"},{\"name\":\"contact\",\"type\":\"flags.11?true\"},{\"name\":\"mutual_contact\",\"type\":\"flags.12?true\"},{\"name\":\"deleted\",\"type\":\"flags.13?true\"},{\"name\":\"bot\",\"type\":\"flags.14?true\"},{\"name\":\"bot_chat_history\",\"type\":\"flags.15?true\"},{\"name\":\"bot_nochats\",\"type\":\"flags.16?true\"},{\"name\":\"verified\",\"type\":\"flags.17?true\"},{\"name\":\"restricted\",\"type\":\"flags.18?true\"},{\"name\":\"min\",\"type\":\"flags.20?true\"},{\"name\":\"bot_inline_geo\",\"type\":\"flags.21?true\"},{\"name\":\"support\",\"type\":\"flags.23?true\"},{\"name\":\"scam\",\"type\":\"flags.24?true\"},{\"name\":\"apply_min_photo\",\"type\":\"flags.25?true\"},{\"name\":\"fake\",\"type\":\"flags.26?true\"},{\"name\":\"bot_attach_menu\",\"type\":\"flags.27?true\"},{\"name\":\"premium\",\"type\":\"flags.28?true\"},{\"name\":\"attach_menu_enabled\",\"type\":\"flags.29?true\"},{\"name\":\"flags2\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.0?long\"},{\"name\":\"first_name\",\"type\":\"flags.1?string\"},{\"name\":\"last_name\",\"type\":\"flags.2?string\"},{\"name\":\"username\",\"type\":\"flags.3?string\"},{\"name\":\"phone\",\"type\":\"flags.4?string\"},{\"name\":\"photo\",\"type\":\"flags.5?UserProfilePhoto\"},{\"name\":\"status\",\"type\":\"flags.6?UserStatus\"},{\"name\":\"bot_info_version\",\"type\":\"flags.14?int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.18?Vector\"},{\"name\":\"bot_inline_placeholder\",\"type\":\"flags.19?string\"},{\"name\":\"lang_code\",\"type\":\"flags.22?string\"},{\"name\":\"emoji_status\",\"type\":\"flags.30?EmojiStatus\"},{\"name\":\"usernames\",\"type\":\"flags2.0?Vector\"}],\"type\":\"User\"},{\"id\":-1032140601,\"predicate\":\"botCommand\",\"params\":[{\"name\":\"command\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"BotCommand\"},{\"id\":-1892676777,\"predicate\":\"botInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"flags.0?long\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"description_photo\",\"type\":\"flags.4?Photo\"},{\"name\":\"description_document\",\"type\":\"flags.5?Document\"},{\"name\":\"commands\",\"type\":\"flags.2?Vector\"},{\"name\":\"menu_button\",\"type\":\"flags.3?BotMenuButton\"}],\"type\":\"BotInfo\"},{\"id\":-1560655744,\"predicate\":\"keyboardButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":2002815875,\"predicate\":\"keyboardButtonRow\",\"params\":[{\"name\":\"buttons\",\"type\":\"Vector\"}],\"type\":\"KeyboardButtonRow\"},{\"id\":-1606526075,\"predicate\":\"replyKeyboardHide\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2035021048,\"predicate\":\"replyKeyboardForceReply\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-2049074735,\"predicate\":\"replyKeyboardMarkup\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"resize\",\"type\":\"flags.0?true\"},{\"name\":\"single_use\",\"type\":\"flags.1?true\"},{\"name\":\"selective\",\"type\":\"flags.2?true\"},{\"name\":\"persistent\",\"type\":\"flags.4?true\"},{\"name\":\"rows\",\"type\":\"Vector\"},{\"name\":\"placeholder\",\"type\":\"flags.3?string\"}],\"type\":\"ReplyMarkup\"},{\"id\":-571955892,\"predicate\":\"inputPeerUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-233744186,\"predicate\":\"inputUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":-1148011883,\"predicate\":\"messageEntityUnknown\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-100378723,\"predicate\":\"messageEntityMention\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1868782349,\"predicate\":\"messageEntityHashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1827637959,\"predicate\":\"messageEntityBotCommand\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1859134776,\"predicate\":\"messageEntityUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1692693954,\"predicate\":\"messageEntityEmail\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1117713463,\"predicate\":\"messageEntityBold\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-2106619040,\"predicate\":\"messageEntityItalic\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":681706865,\"predicate\":\"messageEntityCode\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1938967520,\"predicate\":\"messageEntityPre\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":1990644519,\"predicate\":\"messageEntityTextUrl\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"MessageEntity\"},{\"id\":-1877614335,\"predicate\":\"updateShortSentMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"out\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"media\",\"type\":\"flags.9?MessageMedia\"},{\"name\":\"entities\",\"type\":\"flags.7?Vector\"},{\"name\":\"ttl_period\",\"type\":\"flags.25?int\"}],\"type\":\"Updates\"},{\"id\":-292807034,\"predicate\":\"inputChannelEmpty\",\"params\":[],\"type\":\"InputChannel\"},{\"id\":-212145112,\"predicate\":\"inputChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":-1566230754,\"predicate\":\"peerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Peer\"},{\"id\":666680316,\"predicate\":\"inputPeerChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-2094689180,\"predicate\":\"channel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.2?true\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"verified\",\"type\":\"flags.7?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"restricted\",\"type\":\"flags.9?true\"},{\"name\":\"signatures\",\"type\":\"flags.11?true\"},{\"name\":\"min\",\"type\":\"flags.12?true\"},{\"name\":\"scam\",\"type\":\"flags.19?true\"},{\"name\":\"has_link\",\"type\":\"flags.20?true\"},{\"name\":\"has_geo\",\"type\":\"flags.21?true\"},{\"name\":\"slowmode_enabled\",\"type\":\"flags.22?true\"},{\"name\":\"call_active\",\"type\":\"flags.23?true\"},{\"name\":\"call_not_empty\",\"type\":\"flags.24?true\"},{\"name\":\"fake\",\"type\":\"flags.25?true\"},{\"name\":\"gigagroup\",\"type\":\"flags.26?true\"},{\"name\":\"noforwards\",\"type\":\"flags.27?true\"},{\"name\":\"join_to_send\",\"type\":\"flags.28?true\"},{\"name\":\"join_request\",\"type\":\"flags.29?true\"},{\"name\":\"forum\",\"type\":\"flags.30?true\"},{\"name\":\"flags2\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"flags.13?long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"username\",\"type\":\"flags.6?string\"},{\"name\":\"photo\",\"type\":\"ChatPhoto\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"restriction_reason\",\"type\":\"flags.9?Vector\"},{\"name\":\"admin_rights\",\"type\":\"flags.14?ChatAdminRights\"},{\"name\":\"banned_rights\",\"type\":\"flags.15?ChatBannedRights\"},{\"name\":\"default_banned_rights\",\"type\":\"flags.18?ChatBannedRights\"},{\"name\":\"participants_count\",\"type\":\"flags.17?int\"},{\"name\":\"usernames\",\"type\":\"flags2.0?Vector\"}],\"type\":\"Chat\"},{\"id\":399807445,\"predicate\":\"channelForbidden\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.5?true\"},{\"name\":\"megagroup\",\"type\":\"flags.8?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"until_date\",\"type\":\"flags.16?int\"}],\"type\":\"Chat\"},{\"id\":2131196633,\"predicate\":\"contacts.resolvedPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-231385849,\"predicate\":\"channelFull\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_view_participants\",\"type\":\"flags.3?true\"},{\"name\":\"can_set_username\",\"type\":\"flags.6?true\"},{\"name\":\"can_set_stickers\",\"type\":\"flags.7?true\"},{\"name\":\"hidden_prehistory\",\"type\":\"flags.10?true\"},{\"name\":\"can_set_location\",\"type\":\"flags.16?true\"},{\"name\":\"has_scheduled\",\"type\":\"flags.19?true\"},{\"name\":\"can_view_stats\",\"type\":\"flags.20?true\"},{\"name\":\"blocked\",\"type\":\"flags.22?true\"},{\"name\":\"flags2\",\"type\":\"#\"},{\"name\":\"can_delete_channel\",\"type\":\"flags2.0?true\"},{\"name\":\"antispam\",\"type\":\"flags2.1?true\"},{\"name\":\"participants_hidden\",\"type\":\"flags2.2?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"participants_count\",\"type\":\"flags.0?int\"},{\"name\":\"admins_count\",\"type\":\"flags.1?int\"},{\"name\":\"kicked_count\",\"type\":\"flags.2?int\"},{\"name\":\"banned_count\",\"type\":\"flags.2?int\"},{\"name\":\"online_count\",\"type\":\"flags.13?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chat_photo\",\"type\":\"Photo\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"exported_invite\",\"type\":\"flags.23?ExportedChatInvite\"},{\"name\":\"bot_info\",\"type\":\"Vector\"},{\"name\":\"migrated_from_chat_id\",\"type\":\"flags.4?long\"},{\"name\":\"migrated_from_max_id\",\"type\":\"flags.4?int\"},{\"name\":\"pinned_msg_id\",\"type\":\"flags.5?int\"},{\"name\":\"stickerset\",\"type\":\"flags.8?StickerSet\"},{\"name\":\"available_min_id\",\"type\":\"flags.9?int\"},{\"name\":\"folder_id\",\"type\":\"flags.11?int\"},{\"name\":\"linked_chat_id\",\"type\":\"flags.14?long\"},{\"name\":\"location\",\"type\":\"flags.15?ChannelLocation\"},{\"name\":\"slowmode_seconds\",\"type\":\"flags.17?int\"},{\"name\":\"slowmode_next_send_date\",\"type\":\"flags.18?int\"},{\"name\":\"stats_dc\",\"type\":\"flags.12?int\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"call\",\"type\":\"flags.21?InputGroupCall\"},{\"name\":\"ttl_period\",\"type\":\"flags.24?int\"},{\"name\":\"pending_suggestions\",\"type\":\"flags.25?Vector\"},{\"name\":\"groupcall_default_join_as\",\"type\":\"flags.26?Peer\"},{\"name\":\"theme_emoticon\",\"type\":\"flags.27?string\"},{\"name\":\"requests_pending\",\"type\":\"flags.28?int\"},{\"name\":\"recent_requesters\",\"type\":\"flags.28?Vector\"},{\"name\":\"default_send_as\",\"type\":\"flags.29?Peer\"},{\"name\":\"available_reactions\",\"type\":\"flags.30?ChatReactions\"}],\"type\":\"ChatFull\"},{\"id\":182649427,\"predicate\":\"messageRange\",\"params\":[{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"MessageRange\"},{\"id\":-948520370,\"predicate\":\"messages.channelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.2?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"topics\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1781355374,\"predicate\":\"messageActionChannelCreate\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":277713951,\"predicate\":\"updateChannelTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"pts\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1666927625,\"predicate\":\"updateChannel\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1656358105,\"predicate\":\"updateNewChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1842450928,\"predicate\":\"updateReadChannelInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"still_unread_count\",\"type\":\"int\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1020437742,\"predicate\":\"updateDeleteChannelMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-232346616,\"predicate\":\"updateChannelMessageViews\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1041346555,\"predicate\":\"updates.channelDifferenceEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1531132162,\"predicate\":\"updates.channelDifferenceTooLong\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"dialog\",\"type\":\"Dialog\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":543450958,\"predicate\":\"updates.channelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"final\",\"type\":\"flags.0?true\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"timeout\",\"type\":\"flags.1?int\"},{\"name\":\"new_messages\",\"type\":\"Vector\"},{\"name\":\"other_updates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1798033689,\"predicate\":\"channelMessagesFilterEmpty\",\"params\":[],\"type\":\"ChannelMessagesFilter\"},{\"id\":-847783593,\"predicate\":\"channelMessagesFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_new_messages\",\"type\":\"flags.1?true\"},{\"name\":\"ranges\",\"type\":\"Vector\"}],\"type\":\"ChannelMessagesFilter\"},{\"id\":-1072953408,\"predicate\":\"channelParticipant\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":900251559,\"predicate\":\"channelParticipantSelf\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"via_request\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChannelParticipant\"},{\"id\":803602899,\"predicate\":\"channelParticipantCreator\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.0?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":-566281095,\"predicate\":\"channelParticipantsRecent\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1268741783,\"predicate\":\"channelParticipantsAdmins\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1548400251,\"predicate\":\"channelParticipantsKicked\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-1699676497,\"predicate\":\"channels.channelParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-541588713,\"predicate\":\"channels.channelParticipant\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":-462696732,\"predicate\":\"chatParticipantCreator\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"ChatParticipant\"},{\"id\":-1600962725,\"predicate\":\"chatParticipantAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"ChatParticipant\"},{\"id\":-674602590,\"predicate\":\"updateChatParticipantAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"is_admin\",\"type\":\"Bool\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-519864430,\"predicate\":\"messageActionChatMigrateTo\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-365344535,\"predicate\":\"messageActionChannelMigrateFrom\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"MessageAction\"},{\"id\":-1328445861,\"predicate\":\"channelParticipantsBots\",\"params\":[],\"type\":\"ChannelParticipantsFilter\"},{\"id\":2013922064,\"predicate\":\"help.termsOfService\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"popup\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"DataJSON\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"min_age_confirm\",\"type\":\"flags.1?int\"}],\"type\":\"help.TermsOfService\"},{\"id\":1753886890,\"predicate\":\"updateNewStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"messages.StickerSet\"}],\"type\":\"Update\"},{\"id\":196268545,\"predicate\":\"updateStickerSetsOrder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":834816008,\"predicate\":\"updateStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"}],\"type\":\"Update\"},{\"id\":-402498398,\"predicate\":\"messages.savedGifsNotModified\",\"params\":[],\"type\":\"messages.SavedGifs\"},{\"id\":-2069878259,\"predicate\":\"messages.savedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"gifs\",\"type\":\"Vector\"}],\"type\":\"messages.SavedGifs\"},{\"id\":-1821035490,\"predicate\":\"updateSavedGifs\",\"params\":[],\"type\":\"Update\"},{\"id\":864077702,\"predicate\":\"inputBotInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1036876423,\"predicate\":\"inputBotInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-2000710887,\"predicate\":\"inputBotInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?InputWebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?InputWebDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1984755728,\"predicate\":\"botInlineMessageMediaAuto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1937807902,\"predicate\":\"botInlineMessageText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":295067450,\"predicate\":\"botInlineResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"url\",\"type\":\"flags.3?string\"},{\"name\":\"thumb\",\"type\":\"flags.4?WebDocument\"},{\"name\":\"content\",\"type\":\"flags.5?WebDocument\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1803769784,\"predicate\":\"messages.botResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"next_offset\",\"type\":\"flags.1?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.2?InlineBotSwitchPM\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.BotResults\"},{\"id\":1232025500,\"predicate\":\"updateBotInlineQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"peer_type\",\"type\":\"flags.1?InlineQueryPeerType\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":317794823,\"predicate\":\"updateBotInlineSend\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"geo\",\"type\":\"flags.0?GeoPoint\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"flags.1?InputBotInlineMessageID\"}],\"type\":\"Update\"},{\"id\":1358283666,\"predicate\":\"inputMessagesFilterVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":928101534,\"predicate\":\"inputMessagesFilterMusic\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1107622874,\"predicate\":\"inputPrivacyKeyChatInvite\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1343122938,\"predicate\":\"privacyKeyChatInvite\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1571494644,\"predicate\":\"exportedMessageLink\",\"params\":[{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"html\",\"type\":\"string\"}],\"type\":\"ExportedMessageLink\"},{\"id\":1601666510,\"predicate\":\"messageFwdHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"imported\",\"type\":\"flags.7?true\"},{\"name\":\"from_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"from_name\",\"type\":\"flags.5?string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"post_author\",\"type\":\"flags.3?string\"},{\"name\":\"saved_from_peer\",\"type\":\"flags.4?Peer\"},{\"name\":\"saved_from_msg_id\",\"type\":\"flags.4?int\"},{\"name\":\"psa_type\",\"type\":\"flags.6?string\"}],\"type\":\"MessageFwdHeader\"},{\"id\":457133559,\"predicate\":\"updateEditChannelMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1799538451,\"predicate\":\"messageActionPinMessage\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":1923290508,\"predicate\":\"auth.codeTypeSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1948046307,\"predicate\":\"auth.codeTypeCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":577556219,\"predicate\":\"auth.codeTypeFlashCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":1035688326,\"predicate\":\"auth.sentCodeTypeApp\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1073693790,\"predicate\":\"auth.sentCodeTypeSms\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1398007207,\"predicate\":\"auth.sentCodeTypeCall\",\"params\":[{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1425815847,\"predicate\":\"auth.sentCodeTypeFlashCall\",\"params\":[{\"name\":\"pattern\",\"type\":\"string\"}],\"type\":\"auth.SentCodeType\"},{\"id\":629866245,\"predicate\":\"keyboardButtonUrl\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":901503851,\"predicate\":\"keyboardButtonCallback\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requires_password\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"KeyboardButton\"},{\"id\":-1318425559,\"predicate\":\"keyboardButtonRequestPhone\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-59151553,\"predicate\":\"keyboardButtonRequestGeoLocation\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":90744648,\"predicate\":\"keyboardButtonSwitchInline\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"same_peer\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"query\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1218642516,\"predicate\":\"replyInlineMarkup\",\"params\":[{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"ReplyMarkup\"},{\"id\":911761060,\"predicate\":\"messages.botCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"has_url\",\"type\":\"flags.3?true\"},{\"name\":\"native_ui\",\"type\":\"flags.4?true\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-1177566067,\"predicate\":\"updateBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":649453030,\"predicate\":\"messages.messageEditData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"caption\",\"type\":\"flags.0?true\"}],\"type\":\"messages.MessageEditData\"},{\"id\":-469536605,\"predicate\":\"updateEditMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1768777083,\"predicate\":\"inputBotInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":1098628881,\"predicate\":\"inputBotInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-1494368259,\"predicate\":\"inputBotInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":85477117,\"predicate\":\"botInlineMessageMediaGeo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1970903652,\"predicate\":\"botInlineMessageMediaVenue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"venue_id\",\"type\":\"string\"},{\"name\":\"venue_type\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":416402882,\"predicate\":\"botInlineMessageMediaContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"vcard\",\"type\":\"string\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1462213465,\"predicate\":\"inputBotInlineResultPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"InputPhoto\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":-459324,\"predicate\":\"inputBotInlineResultDocument\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"description\",\"type\":\"flags.2?string\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":400266251,\"predicate\":\"botInlineMediaResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?Photo\"},{\"name\":\"document\",\"type\":\"flags.1?Document\"},{\"name\":\"title\",\"type\":\"flags.2?string\"},{\"name\":\"description\",\"type\":\"flags.3?string\"},{\"name\":\"send_message\",\"type\":\"BotInlineMessage\"}],\"type\":\"BotInlineResult\"},{\"id\":-1995686519,\"predicate\":\"inputBotInlineMessageID\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":1763610706,\"predicate\":\"updateInlineBotCallbackQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"msg_id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"chat_instance\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"game_short_name\",\"type\":\"flags.1?string\"}],\"type\":\"Update\"},{\"id\":1008755359,\"predicate\":\"inlineBotSwitchPM\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"InlineBotSwitchPM\"},{\"id\":863093588,\"predicate\":\"messages.peerDialogs\",\"params\":[{\"name\":\"dialogs\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"state\",\"type\":\"updates.State\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-305282981,\"predicate\":\"topPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"rating\",\"type\":\"double\"}],\"type\":\"TopPeer\"},{\"id\":-1419371685,\"predicate\":\"topPeerCategoryBotsPM\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":344356834,\"predicate\":\"topPeerCategoryBotsInline\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":104314861,\"predicate\":\"topPeerCategoryCorrespondents\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-1122524854,\"predicate\":\"topPeerCategoryGroups\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":371037736,\"predicate\":\"topPeerCategoryChannels\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-75283823,\"predicate\":\"topPeerCategoryPeers\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"TopPeerCategoryPeers\"},{\"id\":-567906571,\"predicate\":\"contacts.topPeersNotModified\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":1891070632,\"predicate\":\"contacts.topPeers\",\"params\":[{\"name\":\"categories\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"contacts.TopPeers\"},{\"id\":-595914432,\"predicate\":\"messageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":546203849,\"predicate\":\"inputMessageEntityMentionName\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"MessageEntity\"},{\"id\":975236280,\"predicate\":\"inputMessagesFilterChatPhotos\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1218471511,\"predicate\":\"updateReadChannelOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":457829485,\"predicate\":\"updateDraftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"draft\",\"type\":\"DraftMessage\"}],\"type\":\"Update\"},{\"id\":453805082,\"predicate\":\"draftMessageEmpty\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"flags.0?int\"}],\"type\":\"DraftMessage\"},{\"id\":-40996577,\"predicate\":\"draftMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"DraftMessage\"},{\"id\":-1615153660,\"predicate\":\"messageActionHistoryClear\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-958657434,\"predicate\":\"messages.featuredStickersNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-1103615738,\"predicate\":\"messages.featuredStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"premium\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"},{\"name\":\"unread\",\"type\":\"Vector\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1461528386,\"predicate\":\"updateReadFeaturedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":186120336,\"predicate\":\"messages.recentStickersNotModified\",\"params\":[],\"type\":\"messages.RecentStickers\"},{\"id\":-1999405994,\"predicate\":\"messages.recentStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"dates\",\"type\":\"Vector\"}],\"type\":\"messages.RecentStickers\"},{\"id\":-1706939360,\"predicate\":\"updateRecentStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":1338747336,\"predicate\":\"messages.archivedStickers\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":946083368,\"predicate\":\"messages.stickerSetInstallResultSuccess\",\"params\":[],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":904138920,\"predicate\":\"messages.stickerSetInstallResultArchive\",\"params\":[{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":1678812626,\"predicate\":\"stickerSetCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"cover\",\"type\":\"Document\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1574314746,\"predicate\":\"updateConfig\",\"params\":[],\"type\":\"Update\"},{\"id\":861169551,\"predicate\":\"updatePtsChanged\",\"params\":[],\"type\":\"Update\"},{\"id\":-440664550,\"predicate\":\"inputMediaPhotoExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.1?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":-78455655,\"predicate\":\"inputMediaDocumentExternal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"spoiler\",\"type\":\"flags.1?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"ttl_seconds\",\"type\":\"flags.0?int\"}],\"type\":\"InputMedia\"},{\"id\":872932635,\"predicate\":\"stickerSetMultiCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"covers\",\"type\":\"Vector\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1361650766,\"predicate\":\"maskCoords\",\"params\":[{\"name\":\"n\",\"type\":\"int\"},{\"name\":\"x\",\"type\":\"double\"},{\"name\":\"y\",\"type\":\"double\"},{\"name\":\"zoom\",\"type\":\"double\"}],\"type\":\"MaskCoords\"},{\"id\":-1744710921,\"predicate\":\"documentAttributeHasStickers\",\"params\":[],\"type\":\"DocumentAttribute\"},{\"id\":1251549527,\"predicate\":\"inputStickeredMediaPhoto\",\"params\":[{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"InputStickeredMedia\"},{\"id\":70813275,\"predicate\":\"inputStickeredMediaDocument\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"}],\"type\":\"InputStickeredMedia\"},{\"id\":-1107729093,\"predicate\":\"game\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"Photo\"},{\"name\":\"document\",\"type\":\"flags.0?Document\"}],\"type\":\"Game\"},{\"id\":1336154098,\"predicate\":\"inputBotInlineResultGame\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"send_message\",\"type\":\"InputBotInlineMessage\"}],\"type\":\"InputBotInlineResult\"},{\"id\":1262639204,\"predicate\":\"inputBotInlineMessageGame\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":-38694904,\"predicate\":\"messageMediaGame\",\"params\":[{\"name\":\"game\",\"type\":\"Game\"}],\"type\":\"MessageMedia\"},{\"id\":-750828557,\"predicate\":\"inputMediaGame\",\"params\":[{\"name\":\"id\",\"type\":\"InputGame\"}],\"type\":\"InputMedia\"},{\"id\":53231223,\"predicate\":\"inputGameID\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGame\"},{\"id\":-1020139510,\"predicate\":\"inputGameShortName\",\"params\":[{\"name\":\"bot_id\",\"type\":\"InputUser\"},{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"InputGame\"},{\"id\":1358175439,\"predicate\":\"keyboardButtonGame\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1834538890,\"predicate\":\"messageActionGameScore\",\"params\":[{\"name\":\"game_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":1940093419,\"predicate\":\"highScore\",\"params\":[{\"name\":\"pos\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"HighScore\"},{\"id\":-1707344487,\"predicate\":\"messages.highScores\",\"params\":[{\"name\":\"scores\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.HighScores\"},{\"id\":1258196845,\"predicate\":\"updates.differenceTooLong\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":791390623,\"predicate\":\"updateChannelWebPage\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"webpage\",\"type\":\"WebPage\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1663561404,\"predicate\":\"messages.chatsSlice\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-599948721,\"predicate\":\"textEmpty\",\"params\":[],\"type\":\"RichText\"},{\"id\":1950782688,\"predicate\":\"textPlain\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":1730456516,\"predicate\":\"textBold\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-653089380,\"predicate\":\"textItalic\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1054465340,\"predicate\":\"textUnderline\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-1678197867,\"predicate\":\"textStrike\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1816074681,\"predicate\":\"textFixed\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":1009288385,\"predicate\":\"textUrl\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"}],\"type\":\"RichText\"},{\"id\":-564523562,\"predicate\":\"textEmail\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":2120376535,\"predicate\":\"textConcat\",\"params\":[{\"name\":\"texts\",\"type\":\"Vector\"}],\"type\":\"RichText\"},{\"id\":324435594,\"predicate\":\"pageBlockUnsupported\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":1890305021,\"predicate\":\"pageBlockTitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1879401953,\"predicate\":\"pageBlockSubtitle\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1162877472,\"predicate\":\"pageBlockAuthorDate\",\"params\":[{\"name\":\"author\",\"type\":\"RichText\"},{\"name\":\"published_date\",\"type\":\"int\"}],\"type\":\"PageBlock\"},{\"id\":-1076861716,\"predicate\":\"pageBlockHeader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-248793375,\"predicate\":\"pageBlockSubheader\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1182402406,\"predicate\":\"pageBlockParagraph\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1066346178,\"predicate\":\"pageBlockPreformatted\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"language\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":1216809369,\"predicate\":\"pageBlockFooter\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-618614392,\"predicate\":\"pageBlockDivider\",\"params\":[],\"type\":\"PageBlock\"},{\"id\":-837994576,\"predicate\":\"pageBlockAnchor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"PageBlock\"},{\"id\":-454524911,\"predicate\":\"pageBlockList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":641563686,\"predicate\":\"pageBlockBlockquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":1329878739,\"predicate\":\"pageBlockPullquote\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"caption\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":391759200,\"predicate\":\"pageBlockPhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"photo_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"},{\"name\":\"url\",\"type\":\"flags.0?string\"},{\"name\":\"webpage_id\",\"type\":\"flags.0?long\"}],\"type\":\"PageBlock\"},{\"id\":2089805750,\"predicate\":\"pageBlockVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autoplay\",\"type\":\"flags.0?true\"},{\"name\":\"loop\",\"type\":\"flags.1?true\"},{\"name\":\"video_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":972174080,\"predicate\":\"pageBlockCover\",\"params\":[{\"name\":\"cover\",\"type\":\"PageBlock\"}],\"type\":\"PageBlock\"},{\"id\":-1468953147,\"predicate\":\"pageBlockEmbed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"full_width\",\"type\":\"flags.0?true\"},{\"name\":\"allow_scrolling\",\"type\":\"flags.3?true\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"html\",\"type\":\"flags.2?string\"},{\"name\":\"poster_photo_id\",\"type\":\"flags.4?long\"},{\"name\":\"w\",\"type\":\"flags.5?int\"},{\"name\":\"h\",\"type\":\"flags.5?int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-229005301,\"predicate\":\"pageBlockEmbedPost\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"author_photo_id\",\"type\":\"long\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1705048653,\"predicate\":\"pageBlockCollage\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":52401552,\"predicate\":\"pageBlockSlideshow\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1930545681,\"predicate\":\"webPageNotModified\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"cached_page_views\",\"type\":\"flags.0?int\"}],\"type\":\"WebPage\"},{\"id\":-88417185,\"predicate\":\"inputPrivacyKeyPhoneCall\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1030105979,\"predicate\":\"privacyKeyPhoneCall\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-580219064,\"predicate\":\"sendMessageGamePlayAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":-2048646399,\"predicate\":\"phoneCallDiscardReasonMissed\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-527056480,\"predicate\":\"phoneCallDiscardReasonDisconnect\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1471006352,\"predicate\":\"phoneCallDiscardReasonHangup\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":-84416311,\"predicate\":\"phoneCallDiscardReasonBusy\",\"params\":[],\"type\":\"PhoneCallDiscardReason\"},{\"id\":1852826908,\"predicate\":\"updateDialogPinned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-99664734,\"predicate\":\"updatePinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"order\",\"type\":\"flags.0?Vector\"}],\"type\":\"Update\"},{\"id\":2104790276,\"predicate\":\"dataJSON\",\"params\":[{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"DataJSON\"},{\"id\":-2095595325,\"predicate\":\"updateBotWebhookJSON\",\"params\":[{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-1684914010,\"predicate\":\"updateBotWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"},{\"name\":\"timeout\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-886477832,\"predicate\":\"labeledPrice\",\"params\":[{\"name\":\"label\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"LabeledPrice\"},{\"id\":1048946971,\"predicate\":\"invoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"test\",\"type\":\"flags.0?true\"},{\"name\":\"name_requested\",\"type\":\"flags.1?true\"},{\"name\":\"phone_requested\",\"type\":\"flags.2?true\"},{\"name\":\"email_requested\",\"type\":\"flags.3?true\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.4?true\"},{\"name\":\"flexible\",\"type\":\"flags.5?true\"},{\"name\":\"phone_to_provider\",\"type\":\"flags.6?true\"},{\"name\":\"email_to_provider\",\"type\":\"flags.7?true\"},{\"name\":\"recurring\",\"type\":\"flags.9?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"},{\"name\":\"max_tip_amount\",\"type\":\"flags.8?long\"},{\"name\":\"suggested_tip_amounts\",\"type\":\"flags.8?Vector\"},{\"name\":\"recurring_terms_url\",\"type\":\"flags.9?string\"}],\"type\":\"Invoice\"},{\"id\":-1900697899,\"predicate\":\"inputMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"start_param\",\"type\":\"flags.1?string\"},{\"name\":\"extended_media\",\"type\":\"flags.2?InputMedia\"}],\"type\":\"InputMedia\"},{\"id\":-368917890,\"predicate\":\"paymentCharge\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"provider_charge_id\",\"type\":\"string\"}],\"type\":\"PaymentCharge\"},{\"id\":-1892568281,\"predicate\":\"messageActionPaymentSentMe\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recurring_init\",\"type\":\"flags.2?true\"},{\"name\":\"recurring_used\",\"type\":\"flags.3?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"charge\",\"type\":\"PaymentCharge\"}],\"type\":\"MessageAction\"},{\"id\":-156940077,\"predicate\":\"messageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"receipt_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"},{\"name\":\"extended_media\",\"type\":\"flags.4?MessageExtendedMedia\"}],\"type\":\"MessageMedia\"},{\"id\":512535275,\"predicate\":\"postAddress\",\"params\":[{\"name\":\"street_line1\",\"type\":\"string\"},{\"name\":\"street_line2\",\"type\":\"string\"},{\"name\":\"city\",\"type\":\"string\"},{\"name\":\"state\",\"type\":\"string\"},{\"name\":\"country_iso2\",\"type\":\"string\"},{\"name\":\"post_code\",\"type\":\"string\"}],\"type\":\"PostAddress\"},{\"id\":-1868808300,\"predicate\":\"paymentRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"flags.0?string\"},{\"name\":\"phone\",\"type\":\"flags.1?string\"},{\"name\":\"email\",\"type\":\"flags.2?string\"},{\"name\":\"shipping_address\",\"type\":\"flags.3?PostAddress\"}],\"type\":\"PaymentRequestedInfo\"},{\"id\":-1344716869,\"predicate\":\"keyboardButtonBuy\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1776926890,\"predicate\":\"messageActionPaymentSent\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recurring_init\",\"type\":\"flags.2?true\"},{\"name\":\"recurring_used\",\"type\":\"flags.3?true\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"invoice_slug\",\"type\":\"flags.0?string\"}],\"type\":\"MessageAction\"},{\"id\":-842892769,\"predicate\":\"paymentSavedCredentialsCard\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentSavedCredentials\"},{\"id\":475467473,\"predicate\":\"webDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":-1678949555,\"predicate\":\"inputWebDocument\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"InputWebDocument\"},{\"id\":-1036396922,\"predicate\":\"inputWebFileLocation\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWebFileLocation\"},{\"id\":568808380,\"predicate\":\"upload.webFile\",\"params\":[{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"file_type\",\"type\":\"storage.FileType\"},{\"name\":\"mtime\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.WebFile\"},{\"id\":-1610250415,\"predicate\":\"payments.paymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_save_credentials\",\"type\":\"flags.2?true\"},{\"name\":\"password_missing\",\"type\":\"flags.3?true\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.5?WebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"native_provider\",\"type\":\"flags.4?string\"},{\"name\":\"native_params\",\"type\":\"flags.4?DataJSON\"},{\"name\":\"additional_methods\",\"type\":\"flags.6?Vector\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"saved_credentials\",\"type\":\"flags.1?Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentForm\"},{\"id\":-784000893,\"predicate\":\"payments.validatedRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":1314881805,\"predicate\":\"payments.paymentResult\",\"params\":[{\"name\":\"updates\",\"type\":\"Updates\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1891958275,\"predicate\":\"payments.paymentReceipt\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"provider_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.2?WebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping\",\"type\":\"flags.1?ShippingOption\"},{\"name\":\"tip_amount\",\"type\":\"flags.3?long\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"credentials_title\",\"type\":\"string\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-74456004,\"predicate\":\"payments.savedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"has_saved_credentials\",\"type\":\"flags.1?true\"},{\"name\":\"saved_info\",\"type\":\"flags.0?PaymentRequestedInfo\"}],\"type\":\"payments.SavedInfo\"},{\"id\":-1056001329,\"predicate\":\"inputPaymentCredentialsSaved\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"tmp_password\",\"type\":\"bytes\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":873977640,\"predicate\":\"inputPaymentCredentials\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-614138572,\"predicate\":\"account.tmpPassword\",\"params\":[{\"name\":\"tmp_password\",\"type\":\"bytes\"},{\"name\":\"valid_until\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":-1239335713,\"predicate\":\"shippingOption\",\"params\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"prices\",\"type\":\"Vector\"}],\"type\":\"ShippingOption\"},{\"id\":-1246823043,\"predicate\":\"updateBotShippingQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"shipping_address\",\"type\":\"PostAddress\"}],\"type\":\"Update\"},{\"id\":-1934976362,\"predicate\":\"updateBotPrecheckoutQuery\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"info\",\"type\":\"flags.0?PaymentRequestedInfo\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-6249322,\"predicate\":\"inputStickerSetItem\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"document\",\"type\":\"InputDocument\"},{\"name\":\"emoji\",\"type\":\"string\"},{\"name\":\"mask_coords\",\"type\":\"flags.0?MaskCoords\"}],\"type\":\"InputStickerSetItem\"},{\"id\":-1425052898,\"predicate\":\"updatePhoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"}],\"type\":\"Update\"},{\"id\":506920429,\"predicate\":\"inputPhoneCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputPhoneCall\"},{\"id\":1399245077,\"predicate\":\"phoneCallEmpty\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"PhoneCall\"},{\"id\":-987599081,\"predicate\":\"phoneCallWaiting\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"receive_date\",\"type\":\"flags.0?int\"}],\"type\":\"PhoneCall\"},{\"id\":347139340,\"predicate\":\"phoneCallRequested\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":912311057,\"predicate\":\"phoneCallAccepted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"PhoneCall\"},{\"id\":-1770029977,\"predicate\":\"phoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"p2p_allowed\",\"type\":\"flags.5?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"participant_id\",\"type\":\"long\"},{\"name\":\"g_a_or_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"},{\"name\":\"connections\",\"type\":\"Vector\"},{\"name\":\"start_date\",\"type\":\"int\"}],\"type\":\"PhoneCall\"},{\"id\":1355435489,\"predicate\":\"phoneCallDiscarded\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"need_rating\",\"type\":\"flags.2?true\"},{\"name\":\"need_debug\",\"type\":\"flags.3?true\"},{\"name\":\"video\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"PhoneCall\"},{\"id\":-1665063993,\"predicate\":\"phoneConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"tcp\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"peer_tag\",\"type\":\"bytes\"}],\"type\":\"PhoneConnection\"},{\"id\":-58224696,\"predicate\":\"phoneCallProtocol\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"udp_p2p\",\"type\":\"flags.0?true\"},{\"name\":\"udp_reflector\",\"type\":\"flags.1?true\"},{\"name\":\"min_layer\",\"type\":\"int\"},{\"name\":\"max_layer\",\"type\":\"int\"},{\"name\":\"library_versions\",\"type\":\"Vector\"}],\"type\":\"PhoneCallProtocol\"},{\"id\":-326966976,\"predicate\":\"phone.phoneCall\",\"params\":[{\"name\":\"phone_call\",\"type\":\"PhoneCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.PhoneCall\"},{\"id\":-2134272152,\"predicate\":\"inputMessagesFilterPhoneCalls\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"missed\",\"type\":\"flags.0?true\"}],\"type\":\"MessagesFilter\"},{\"id\":-2132731265,\"predicate\":\"messageActionPhoneCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call_id\",\"type\":\"long\"},{\"name\":\"reason\",\"type\":\"flags.0?PhoneCallDiscardReason\"},{\"name\":\"duration\",\"type\":\"flags.1?int\"}],\"type\":\"MessageAction\"},{\"id\":2054952868,\"predicate\":\"inputMessagesFilterRoundVoice\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1253451181,\"predicate\":\"inputMessagesFilterRoundVideo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1997373508,\"predicate\":\"sendMessageRecordRoundAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":608050278,\"predicate\":\"sendMessageUploadRoundAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":-242427324,\"predicate\":\"upload.fileCdnRedirect\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"encryption_key\",\"type\":\"bytes\"},{\"name\":\"encryption_iv\",\"type\":\"bytes\"},{\"name\":\"file_hashes\",\"type\":\"Vector\"}],\"type\":\"upload.File\"},{\"id\":-290921362,\"predicate\":\"upload.cdnFileReuploadNeeded\",\"params\":[{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1449145777,\"predicate\":\"upload.cdnFile\",\"params\":[{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"upload.CdnFile\"},{\"id\":-914167110,\"predicate\":\"cdnPublicKey\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"CdnPublicKey\"},{\"id\":1462101002,\"predicate\":\"cdnConfig\",\"params\":[{\"name\":\"public_keys\",\"type\":\"Vector\"}],\"type\":\"CdnConfig\"},{\"id\":-283684427,\"predicate\":\"pageBlockChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"Chat\"}],\"type\":\"PageBlock\"},{\"id\":-892239370,\"predicate\":\"langPackString\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":1816636575,\"predicate\":\"langPackStringPluralized\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"zero_value\",\"type\":\"flags.0?string\"},{\"name\":\"one_value\",\"type\":\"flags.1?string\"},{\"name\":\"two_value\",\"type\":\"flags.2?string\"},{\"name\":\"few_value\",\"type\":\"flags.3?string\"},{\"name\":\"many_value\",\"type\":\"flags.4?string\"},{\"name\":\"other_value\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":695856818,\"predicate\":\"langPackStringDeleted\",\"params\":[{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"LangPackString\"},{\"id\":-209337866,\"predicate\":\"langPackDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"strings\",\"type\":\"Vector\"}],\"type\":\"LangPackDifference\"},{\"id\":-288727837,\"predicate\":\"langPackLanguage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"official\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.2?true\"},{\"name\":\"beta\",\"type\":\"flags.3?true\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"native_name\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"base_lang_code\",\"type\":\"flags.1?string\"},{\"name\":\"plural_code\",\"type\":\"string\"},{\"name\":\"strings_count\",\"type\":\"int\"},{\"name\":\"translated_count\",\"type\":\"int\"},{\"name\":\"translations_url\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":1180041828,\"predicate\":\"updateLangPackTooLong\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":1442983757,\"predicate\":\"updateLangPack\",\"params\":[{\"name\":\"difference\",\"type\":\"LangPackDifference\"}],\"type\":\"Update\"},{\"id\":885242707,\"predicate\":\"channelParticipantAdmin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_edit\",\"type\":\"flags.0?true\"},{\"name\":\"self\",\"type\":\"flags.1?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"inviter_id\",\"type\":\"flags.1?long\"},{\"name\":\"promoted_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"flags.2?string\"}],\"type\":\"ChannelParticipant\"},{\"id\":1844969806,\"predicate\":\"channelParticipantBanned\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"left\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"kicked_by\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelParticipant\"},{\"id\":338142689,\"predicate\":\"channelParticipantsBanned\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":106343499,\"predicate\":\"channelParticipantsSearch\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-421545947,\"predicate\":\"channelAdminLogEventActionChangeTitle\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1427671598,\"predicate\":\"channelAdminLogEventActionChangeAbout\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1783299128,\"predicate\":\"channelAdminLogEventActionChangeUsername\",\"params\":[{\"name\":\"prev_value\",\"type\":\"string\"},{\"name\":\"new_value\",\"type\":\"string\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1129042607,\"predicate\":\"channelAdminLogEventActionChangePhoto\",\"params\":[{\"name\":\"prev_photo\",\"type\":\"Photo\"},{\"name\":\"new_photo\",\"type\":\"Photo\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":460916654,\"predicate\":\"channelAdminLogEventActionToggleInvites\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":648939889,\"predicate\":\"channelAdminLogEventActionToggleSignatures\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-370660328,\"predicate\":\"channelAdminLogEventActionUpdatePinned\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1889215493,\"predicate\":\"channelAdminLogEventActionEditMessage\",\"params\":[{\"name\":\"prev_message\",\"type\":\"Message\"},{\"name\":\"new_message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1121994683,\"predicate\":\"channelAdminLogEventActionDeleteMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":405815507,\"predicate\":\"channelAdminLogEventActionParticipantJoin\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-124291086,\"predicate\":\"channelAdminLogEventActionParticipantLeave\",\"params\":[],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-484690728,\"predicate\":\"channelAdminLogEventActionParticipantInvite\",\"params\":[{\"name\":\"participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-422036098,\"predicate\":\"channelAdminLogEventActionParticipantToggleBan\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-714643696,\"predicate\":\"channelAdminLogEventActionParticipantToggleAdmin\",\"params\":[{\"name\":\"prev_participant\",\"type\":\"ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"ChannelParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":531458253,\"predicate\":\"channelAdminLogEvent\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"action\",\"type\":\"ChannelAdminLogEventAction\"}],\"type\":\"ChannelAdminLogEvent\"},{\"id\":-309659827,\"predicate\":\"channels.adminLogResults\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-368018716,\"predicate\":\"channelAdminLogEventsFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join\",\"type\":\"flags.0?true\"},{\"name\":\"leave\",\"type\":\"flags.1?true\"},{\"name\":\"invite\",\"type\":\"flags.2?true\"},{\"name\":\"ban\",\"type\":\"flags.3?true\"},{\"name\":\"unban\",\"type\":\"flags.4?true\"},{\"name\":\"kick\",\"type\":\"flags.5?true\"},{\"name\":\"unkick\",\"type\":\"flags.6?true\"},{\"name\":\"promote\",\"type\":\"flags.7?true\"},{\"name\":\"demote\",\"type\":\"flags.8?true\"},{\"name\":\"info\",\"type\":\"flags.9?true\"},{\"name\":\"settings\",\"type\":\"flags.10?true\"},{\"name\":\"pinned\",\"type\":\"flags.11?true\"},{\"name\":\"edit\",\"type\":\"flags.12?true\"},{\"name\":\"delete\",\"type\":\"flags.13?true\"},{\"name\":\"group_call\",\"type\":\"flags.14?true\"},{\"name\":\"invites\",\"type\":\"flags.15?true\"},{\"name\":\"send\",\"type\":\"flags.16?true\"},{\"name\":\"forums\",\"type\":\"flags.17?true\"}],\"type\":\"ChannelAdminLogEventsFilter\"},{\"id\":511092620,\"predicate\":\"topPeerCategoryPhoneCalls\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-2143067670,\"predicate\":\"pageBlockAudio\",\"params\":[{\"name\":\"audio_id\",\"type\":\"long\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":1558266229,\"predicate\":\"popularContact\",\"params\":[{\"name\":\"client_id\",\"type\":\"long\"},{\"name\":\"importers\",\"type\":\"int\"}],\"type\":\"PopularContact\"},{\"id\":1200788123,\"predicate\":\"messageActionScreenshotTaken\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1634752813,\"predicate\":\"messages.favedStickersNotModified\",\"params\":[],\"type\":\"messages.FavedStickers\"},{\"id\":750063767,\"predicate\":\"messages.favedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"stickers\",\"type\":\"Vector\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-451831443,\"predicate\":\"updateFavedStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-366410403,\"predicate\":\"updateChannelReadMessagesContents\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1040652646,\"predicate\":\"inputMessagesFilterMyMentions\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":1887741886,\"predicate\":\"updateContactsReset\",\"params\":[],\"type\":\"Update\"},{\"id\":-1312568665,\"predicate\":\"channelAdminLogEventActionChangeStickerSet\",\"params\":[{\"name\":\"prev_stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"new_stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-85549226,\"predicate\":\"messageActionCustomAction\",\"params\":[{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":178373535,\"predicate\":\"inputPaymentCredentialsApplePay\",\"params\":[{\"name\":\"payment_data\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":-419271411,\"predicate\":\"inputMessagesFilterGeo\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-530392189,\"predicate\":\"inputMessagesFilterContacts\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1304443240,\"predicate\":\"updateChannelAvailableMessages\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"available_min_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1599903217,\"predicate\":\"channelAdminLogEventActionTogglePreHistoryHidden\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1759532989,\"predicate\":\"inputMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"stopped\",\"type\":\"flags.0?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.2?int\"},{\"name\":\"period\",\"type\":\"flags.1?int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.3?int\"}],\"type\":\"InputMedia\"},{\"id\":-1186937242,\"predicate\":\"messageMediaGeoLive\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"heading\",\"type\":\"flags.0?int\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"proximity_notification_radius\",\"type\":\"flags.1?int\"}],\"type\":\"MessageMedia\"},{\"id\":1189204285,\"predicate\":\"recentMeUrlUnknown\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1188296222,\"predicate\":\"recentMeUrlUser\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1294306862,\"predicate\":\"recentMeUrlChat\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"RecentMeUrl\"},{\"id\":-347535331,\"predicate\":\"recentMeUrlChatInvite\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"chat_invite\",\"type\":\"ChatInvite\"}],\"type\":\"RecentMeUrl\"},{\"id\":-1140172836,\"predicate\":\"recentMeUrlStickerSet\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"set\",\"type\":\"StickerSetCovered\"}],\"type\":\"RecentMeUrl\"},{\"id\":235081943,\"predicate\":\"help.recentMeUrls\",\"params\":[{\"name\":\"urls\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":-266911767,\"predicate\":\"channels.channelParticipantsNotModified\",\"params\":[],\"type\":\"channels.ChannelParticipants\"},{\"id\":1951620897,\"predicate\":\"messages.messagesNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":482797855,\"predicate\":\"inputSingleMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.0?Vector\"}],\"type\":\"InputSingleMedia\"},{\"id\":-1493633966,\"predicate\":\"webAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"domain\",\"type\":\"string\"},{\"name\":\"browser\",\"type\":\"string\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"date_created\",\"type\":\"int\"},{\"name\":\"date_active\",\"type\":\"int\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"region\",\"type\":\"string\"}],\"type\":\"WebAuthorization\"},{\"id\":-313079300,\"predicate\":\"account.webAuthorizations\",\"params\":[{\"name\":\"authorizations\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"account.WebAuthorizations\"},{\"id\":-1502174430,\"predicate\":\"inputMessageID\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-1160215659,\"predicate\":\"inputMessageReplyTo\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"InputMessage\"},{\"id\":-2037963464,\"predicate\":\"inputMessagePinned\",\"params\":[],\"type\":\"InputMessage\"},{\"id\":-1687559349,\"predicate\":\"messageEntityPhone\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1280209983,\"predicate\":\"messageEntityCashtag\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1410748418,\"predicate\":\"messageActionBotAllowed\",\"params\":[{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-55902537,\"predicate\":\"inputDialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"InputDialogPeer\"},{\"id\":-445792507,\"predicate\":\"dialogPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"DialogPeer\"},{\"id\":223655517,\"predicate\":\"messages.foundStickerSetsNotModified\",\"params\":[],\"type\":\"messages.FoundStickerSets\"},{\"id\":-1963942446,\"predicate\":\"messages.foundStickerSets\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"sets\",\"type\":\"Vector\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":-207944868,\"predicate\":\"fileHash\",\"params\":[{\"name\":\"offset\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"FileHash\"},{\"id\":-104284986,\"predicate\":\"webDocumentNoProxy\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"attributes\",\"type\":\"Vector\"}],\"type\":\"WebDocument\"},{\"id\":1968737087,\"predicate\":\"inputClientProxy\",\"params\":[{\"name\":\"address\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"}],\"type\":\"InputClientProxy\"},{\"id\":-483352705,\"predicate\":\"help.termsOfServiceUpdateEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":686618977,\"predicate\":\"help.termsOfServiceUpdate\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"terms_of_service\",\"type\":\"help.TermsOfService\"}],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":859091184,\"predicate\":\"inputSecureFileUploaded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"parts\",\"type\":\"int\"},{\"name\":\"md5_checksum\",\"type\":\"string\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"InputSecureFile\"},{\"id\":1399317950,\"predicate\":\"inputSecureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputSecureFile\"},{\"id\":-876089816,\"predicate\":\"inputSecureFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":1679398724,\"predicate\":\"secureFileEmpty\",\"params\":[],\"type\":\"SecureFile\"},{\"id\":2097791614,\"predicate\":\"secureFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"size\",\"type\":\"long\"},{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureFile\"},{\"id\":-1964327229,\"predicate\":\"secureData\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureData\"},{\"id\":2103482845,\"predicate\":\"securePlainPhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":569137759,\"predicate\":\"securePlainEmail\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"SecurePlainData\"},{\"id\":-1658158621,\"predicate\":\"secureValueTypePersonalDetails\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":1034709504,\"predicate\":\"secureValueTypePassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":115615172,\"predicate\":\"secureValueTypeDriverLicense\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1596951477,\"predicate\":\"secureValueTypeIdentityCard\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1717268701,\"predicate\":\"secureValueTypeInternalPassport\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-874308058,\"predicate\":\"secureValueTypeAddress\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-63531698,\"predicate\":\"secureValueTypeUtilityBill\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1995211763,\"predicate\":\"secureValueTypeBankStatement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1954007928,\"predicate\":\"secureValueTypeRentalAgreement\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1713143702,\"predicate\":\"secureValueTypePassportRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-368907213,\"predicate\":\"secureValueTypeTemporaryRegistration\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1289704741,\"predicate\":\"secureValueTypePhone\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":-1908627474,\"predicate\":\"secureValueTypeEmail\",\"params\":[],\"type\":\"SecureValueType\"},{\"id\":411017418,\"predicate\":\"secureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?SecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?SecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?SecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValue\"},{\"id\":-618540889,\"predicate\":\"inputSecureValue\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data\",\"type\":\"flags.0?SecureData\"},{\"name\":\"front_side\",\"type\":\"flags.1?InputSecureFile\"},{\"name\":\"reverse_side\",\"type\":\"flags.2?InputSecureFile\"},{\"name\":\"selfie\",\"type\":\"flags.3?InputSecureFile\"},{\"name\":\"translation\",\"type\":\"flags.6?Vector\"},{\"name\":\"files\",\"type\":\"flags.4?Vector\"},{\"name\":\"plain_data\",\"type\":\"flags.5?SecurePlainData\"}],\"type\":\"InputSecureValue\"},{\"id\":-316748368,\"predicate\":\"secureValueHash\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"}],\"type\":\"SecureValueHash\"},{\"id\":-391902247,\"predicate\":\"secureValueErrorData\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"data_hash\",\"type\":\"bytes\"},{\"name\":\"field\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":12467706,\"predicate\":\"secureValueErrorFrontSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2037765467,\"predicate\":\"secureValueErrorReverseSide\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-449327402,\"predicate\":\"secureValueErrorSelfie\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":2054162547,\"predicate\":\"secureValueErrorFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":1717706985,\"predicate\":\"secureValueErrorFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":871426631,\"predicate\":\"secureCredentialsEncrypted\",\"params\":[{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"secret\",\"type\":\"bytes\"}],\"type\":\"SecureCredentialsEncrypted\"},{\"id\":-1389486888,\"predicate\":\"account.authorizationForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"required_types\",\"type\":\"Vector\"},{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"errors\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"privacy_policy_url\",\"type\":\"flags.0?string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-2128640689,\"predicate\":\"account.sentEmailCode\",\"params\":[{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"account.SentEmailCode\"},{\"id\":455635795,\"predicate\":\"messageActionSecureValuesSentMe\",\"params\":[{\"name\":\"values\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"MessageAction\"},{\"id\":-648257196,\"predicate\":\"messageActionSecureValuesSent\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":1722786150,\"predicate\":\"help.deepLinkInfoEmpty\",\"params\":[],\"type\":\"help.DeepLinkInfo\"},{\"id\":1783556146,\"predicate\":\"help.deepLinkInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"update_app\",\"type\":\"flags.0?true\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":289586518,\"predicate\":\"savedPhoneContact\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"SavedContact\"},{\"id\":1304052993,\"predicate\":\"account.takeout\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"account.Takeout\"},{\"id\":700340377,\"predicate\":\"inputTakeoutFileLocation\",\"params\":[],\"type\":\"InputFileLocation\"},{\"id\":-513517117,\"predicate\":\"updateDialogUnreadMark\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"DialogPeer\"}],\"type\":\"Update\"},{\"id\":-253500010,\"predicate\":\"messages.dialogsNotModified\",\"params\":[{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.Dialogs\"},{\"id\":-1625153079,\"predicate\":\"inputWebFileGeoPointLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"}],\"type\":\"InputWebFileLocation\"},{\"id\":-1255369827,\"predicate\":\"contacts.topPeersDisabled\",\"params\":[],\"type\":\"contacts.TopPeers\"},{\"id\":-1685456582,\"predicate\":\"inputReportReasonCopyright\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-732254058,\"predicate\":\"passwordKdfAlgoUnknown\",\"params\":[],\"type\":\"PasswordKdfAlgo\"},{\"id\":4883767,\"predicate\":\"securePasswordKdfAlgoUnknown\",\"params\":[],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-1141711456,\"predicate\":\"securePasswordKdfAlgoPBKDF2HMACSHA512iter100000\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":-2042159726,\"predicate\":\"securePasswordKdfAlgoSHA512\",\"params\":[{\"name\":\"salt\",\"type\":\"bytes\"}],\"type\":\"SecurePasswordKdfAlgo\"},{\"id\":354925740,\"predicate\":\"secureSecretSettings\",\"params\":[{\"name\":\"secure_algo\",\"type\":\"SecurePasswordKdfAlgo\"},{\"name\":\"secure_secret\",\"type\":\"bytes\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureSecretSettings\"},{\"id\":982592842,\"predicate\":\"passwordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow\",\"params\":[{\"name\":\"salt1\",\"type\":\"bytes\"},{\"name\":\"salt2\",\"type\":\"bytes\"},{\"name\":\"g\",\"type\":\"int\"},{\"name\":\"p\",\"type\":\"bytes\"}],\"type\":\"PasswordKdfAlgo\"},{\"id\":-1736378792,\"predicate\":\"inputCheckPasswordEmpty\",\"params\":[],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-763367294,\"predicate\":\"inputCheckPasswordSRP\",\"params\":[{\"name\":\"srp_id\",\"type\":\"long\"},{\"name\":\"A\",\"type\":\"bytes\"},{\"name\":\"M1\",\"type\":\"bytes\"}],\"type\":\"InputCheckPasswordSRP\"},{\"id\":-2036501105,\"predicate\":\"secureValueError\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-1592506512,\"predicate\":\"secureValueErrorTranslationFile\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"bytes\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":878931416,\"predicate\":\"secureValueErrorTranslationFiles\",\"params\":[{\"name\":\"type\",\"type\":\"SecureValueType\"},{\"name\":\"file_hash\",\"type\":\"Vector\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"SecureValueError\"},{\"id\":-2103600678,\"predicate\":\"secureRequiredType\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"native_names\",\"type\":\"flags.0?true\"},{\"name\":\"selfie_required\",\"type\":\"flags.1?true\"},{\"name\":\"translation_required\",\"type\":\"flags.2?true\"},{\"name\":\"type\",\"type\":\"SecureValueType\"}],\"type\":\"SecureRequiredType\"},{\"id\":41187252,\"predicate\":\"secureRequiredTypeOneOf\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"SecureRequiredType\"},{\"id\":-1078332329,\"predicate\":\"help.passportConfigNotModified\",\"params\":[],\"type\":\"help.PassportConfig\"},{\"id\":-1600596305,\"predicate\":\"help.passportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"countries_langs\",\"type\":\"DataJSON\"}],\"type\":\"help.PassportConfig\"},{\"id\":488313413,\"predicate\":\"inputAppEvent\",\"params\":[{\"name\":\"time\",\"type\":\"double\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"peer\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"JSONValue\"}],\"type\":\"InputAppEvent\"},{\"id\":-1059185703,\"predicate\":\"jsonObjectValue\",\"params\":[{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"JSONValue\"}],\"type\":\"JSONObjectValue\"},{\"id\":1064139624,\"predicate\":\"jsonNull\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":-952869270,\"predicate\":\"jsonBool\",\"params\":[{\"name\":\"value\",\"type\":\"Bool\"}],\"type\":\"JSONValue\"},{\"id\":736157604,\"predicate\":\"jsonNumber\",\"params\":[{\"name\":\"value\",\"type\":\"double\"}],\"type\":\"JSONValue\"},{\"id\":-1222740358,\"predicate\":\"jsonString\",\"params\":[{\"name\":\"value\",\"type\":\"string\"}],\"type\":\"JSONValue\"},{\"id\":-146520221,\"predicate\":\"jsonArray\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":-1715350371,\"predicate\":\"jsonObject\",\"params\":[{\"name\":\"value\",\"type\":\"Vector\"}],\"type\":\"JSONValue\"},{\"id\":-1311015810,\"predicate\":\"inputNotifyBroadcasts\",\"params\":[],\"type\":\"InputNotifyPeer\"},{\"id\":-703403793,\"predicate\":\"notifyBroadcasts\",\"params\":[],\"type\":\"NotifyPeer\"},{\"id\":-311786236,\"predicate\":\"textSubscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":-939827711,\"predicate\":\"textSuperscript\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":55281185,\"predicate\":\"textMarked\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"RichText\"},{\"id\":483104362,\"predicate\":\"textPhone\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":136105807,\"predicate\":\"textImage\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"}],\"type\":\"RichText\"},{\"id\":504660880,\"predicate\":\"pageBlockKicker\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":878078826,\"predicate\":\"pageTableCell\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"header\",\"type\":\"flags.0?true\"},{\"name\":\"align_center\",\"type\":\"flags.3?true\"},{\"name\":\"align_right\",\"type\":\"flags.4?true\"},{\"name\":\"valign_middle\",\"type\":\"flags.5?true\"},{\"name\":\"valign_bottom\",\"type\":\"flags.6?true\"},{\"name\":\"text\",\"type\":\"flags.7?RichText\"},{\"name\":\"colspan\",\"type\":\"flags.1?int\"},{\"name\":\"rowspan\",\"type\":\"flags.2?int\"}],\"type\":\"PageTableCell\"},{\"id\":-524237339,\"predicate\":\"pageTableRow\",\"params\":[{\"name\":\"cells\",\"type\":\"Vector\"}],\"type\":\"PageTableRow\"},{\"id\":-1085412734,\"predicate\":\"pageBlockTable\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bordered\",\"type\":\"flags.0?true\"},{\"name\":\"striped\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"rows\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":1869903447,\"predicate\":\"pageCaption\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"credit\",\"type\":\"RichText\"}],\"type\":\"PageCaption\"},{\"id\":-1188055347,\"predicate\":\"pageListItemText\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListItem\"},{\"id\":635466748,\"predicate\":\"pageListItemBlocks\",\"params\":[{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListItem\"},{\"id\":1577484359,\"predicate\":\"pageListOrderedItemText\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"RichText\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1730311882,\"predicate\":\"pageListOrderedItemBlocks\",\"params\":[{\"name\":\"num\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"}],\"type\":\"PageListOrderedItem\"},{\"id\":-1702174239,\"predicate\":\"pageBlockOrderedList\",\"params\":[{\"name\":\"items\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":1987480557,\"predicate\":\"pageBlockDetails\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"open\",\"type\":\"flags.0?true\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"RichText\"}],\"type\":\"PageBlock\"},{\"id\":-1282352120,\"predicate\":\"pageRelatedArticle\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"webpage_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"description\",\"type\":\"flags.1?string\"},{\"name\":\"photo_id\",\"type\":\"flags.2?long\"},{\"name\":\"author\",\"type\":\"flags.3?string\"},{\"name\":\"published_date\",\"type\":\"flags.4?int\"}],\"type\":\"PageRelatedArticle\"},{\"id\":370236054,\"predicate\":\"pageBlockRelatedArticles\",\"params\":[{\"name\":\"title\",\"type\":\"RichText\"},{\"name\":\"articles\",\"type\":\"Vector\"}],\"type\":\"PageBlock\"},{\"id\":-1538310410,\"predicate\":\"pageBlockMap\",\"params\":[{\"name\":\"geo\",\"type\":\"GeoPoint\"},{\"name\":\"zoom\",\"type\":\"int\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"caption\",\"type\":\"PageCaption\"}],\"type\":\"PageBlock\"},{\"id\":-1738178803,\"predicate\":\"page\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"part\",\"type\":\"flags.0?true\"},{\"name\":\"rtl\",\"type\":\"flags.1?true\"},{\"name\":\"v2\",\"type\":\"flags.2?true\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"blocks\",\"type\":\"Vector\"},{\"name\":\"photos\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"},{\"name\":\"views\",\"type\":\"flags.3?int\"}],\"type\":\"Page\"},{\"id\":-610373422,\"predicate\":\"inputPrivacyKeyPhoneP2P\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":961092808,\"predicate\":\"privacyKeyPhoneP2P\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":894777186,\"predicate\":\"textAnchor\",\"params\":[{\"name\":\"text\",\"type\":\"RichText\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"RichText\"},{\"id\":-1945767479,\"predicate\":\"help.supportName\",\"params\":[{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"help.SupportName\"},{\"id\":-206688531,\"predicate\":\"help.userInfoEmpty\",\"params\":[],\"type\":\"help.UserInfo\"},{\"id\":32192344,\"predicate\":\"help.userInfo\",\"params\":[{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"},{\"name\":\"author\",\"type\":\"string\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"help.UserInfo\"},{\"id\":-202219658,\"predicate\":\"messageActionContactSignUp\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":-1398708869,\"predicate\":\"updateMessagePoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"poll\",\"type\":\"flags.0?Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"Update\"},{\"id\":1823064809,\"predicate\":\"pollAnswer\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"option\",\"type\":\"bytes\"}],\"type\":\"PollAnswer\"},{\"id\":-2032041631,\"predicate\":\"poll\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"closed\",\"type\":\"flags.0?true\"},{\"name\":\"public_voters\",\"type\":\"flags.1?true\"},{\"name\":\"multiple_choice\",\"type\":\"flags.2?true\"},{\"name\":\"quiz\",\"type\":\"flags.3?true\"},{\"name\":\"question\",\"type\":\"string\"},{\"name\":\"answers\",\"type\":\"Vector\"},{\"name\":\"close_period\",\"type\":\"flags.4?int\"},{\"name\":\"close_date\",\"type\":\"flags.5?int\"}],\"type\":\"Poll\"},{\"id\":997055186,\"predicate\":\"pollAnswerVoters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen\",\"type\":\"flags.0?true\"},{\"name\":\"correct\",\"type\":\"flags.1?true\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"voters\",\"type\":\"int\"}],\"type\":\"PollAnswerVoters\"},{\"id\":-591909213,\"predicate\":\"pollResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"results\",\"type\":\"flags.1?Vector\"},{\"name\":\"total_voters\",\"type\":\"flags.2?int\"},{\"name\":\"recent_voters\",\"type\":\"flags.3?Vector\"},{\"name\":\"solution\",\"type\":\"flags.4?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.4?Vector\"}],\"type\":\"PollResults\"},{\"id\":261416433,\"predicate\":\"inputMediaPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"correct_answers\",\"type\":\"flags.0?Vector\"},{\"name\":\"solution\",\"type\":\"flags.1?string\"},{\"name\":\"solution_entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"InputMedia\"},{\"id\":1272375192,\"predicate\":\"messageMediaPoll\",\"params\":[{\"name\":\"poll\",\"type\":\"Poll\"},{\"name\":\"results\",\"type\":\"PollResults\"}],\"type\":\"MessageMedia\"},{\"id\":-264117680,\"predicate\":\"chatOnlines\",\"params\":[{\"name\":\"onlines\",\"type\":\"int\"}],\"type\":\"ChatOnlines\"},{\"id\":1202287072,\"predicate\":\"statsURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"StatsURL\"},{\"id\":-525288402,\"predicate\":\"photoStrippedSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":1605510357,\"predicate\":\"chatAdminRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"change_info\",\"type\":\"flags.0?true\"},{\"name\":\"post_messages\",\"type\":\"flags.1?true\"},{\"name\":\"edit_messages\",\"type\":\"flags.2?true\"},{\"name\":\"delete_messages\",\"type\":\"flags.3?true\"},{\"name\":\"ban_users\",\"type\":\"flags.4?true\"},{\"name\":\"invite_users\",\"type\":\"flags.5?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.7?true\"},{\"name\":\"add_admins\",\"type\":\"flags.9?true\"},{\"name\":\"anonymous\",\"type\":\"flags.10?true\"},{\"name\":\"manage_call\",\"type\":\"flags.11?true\"},{\"name\":\"other\",\"type\":\"flags.12?true\"},{\"name\":\"manage_topics\",\"type\":\"flags.13?true\"}],\"type\":\"ChatAdminRights\"},{\"id\":-1626209256,\"predicate\":\"chatBannedRights\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"view_messages\",\"type\":\"flags.0?true\"},{\"name\":\"send_messages\",\"type\":\"flags.1?true\"},{\"name\":\"send_media\",\"type\":\"flags.2?true\"},{\"name\":\"send_stickers\",\"type\":\"flags.3?true\"},{\"name\":\"send_gifs\",\"type\":\"flags.4?true\"},{\"name\":\"send_games\",\"type\":\"flags.5?true\"},{\"name\":\"send_inline\",\"type\":\"flags.6?true\"},{\"name\":\"embed_links\",\"type\":\"flags.7?true\"},{\"name\":\"send_polls\",\"type\":\"flags.8?true\"},{\"name\":\"change_info\",\"type\":\"flags.10?true\"},{\"name\":\"invite_users\",\"type\":\"flags.15?true\"},{\"name\":\"pin_messages\",\"type\":\"flags.17?true\"},{\"name\":\"manage_topics\",\"type\":\"flags.18?true\"},{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"ChatBannedRights\"},{\"id\":1421875280,\"predicate\":\"updateChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"default_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-433014407,\"predicate\":\"inputWallPaper\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":1913199744,\"predicate\":\"inputWallPaperSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputWallPaper\"},{\"id\":-1150621555,\"predicate\":\"channelParticipantsContacts\",\"params\":[{\"name\":\"q\",\"type\":\"string\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":771095562,\"predicate\":\"channelAdminLogEventActionDefaultBannedRights\",\"params\":[{\"name\":\"prev_banned_rights\",\"type\":\"ChatBannedRights\"},{\"name\":\"new_banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1895328189,\"predicate\":\"channelAdminLogEventActionStopPoll\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":471437699,\"predicate\":\"account.wallPapersNotModified\",\"params\":[],\"type\":\"account.WallPapers\"},{\"id\":-842824308,\"predicate\":\"account.wallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"account.WallPapers\"},{\"id\":-1973130814,\"predicate\":\"codeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_flashcall\",\"type\":\"flags.0?true\"},{\"name\":\"current_number\",\"type\":\"flags.1?true\"},{\"name\":\"allow_app_hash\",\"type\":\"flags.4?true\"},{\"name\":\"allow_missed_call\",\"type\":\"flags.5?true\"},{\"name\":\"logout_tokens\",\"type\":\"flags.6?Vector\"}],\"type\":\"CodeSettings\"},{\"id\":499236004,\"predicate\":\"wallPaperSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"blur\",\"type\":\"flags.1?true\"},{\"name\":\"motion\",\"type\":\"flags.2?true\"},{\"name\":\"background_color\",\"type\":\"flags.0?int\"},{\"name\":\"second_background_color\",\"type\":\"flags.4?int\"},{\"name\":\"third_background_color\",\"type\":\"flags.5?int\"},{\"name\":\"fourth_background_color\",\"type\":\"flags.6?int\"},{\"name\":\"intensity\",\"type\":\"flags.3?int\"},{\"name\":\"rotation\",\"type\":\"flags.4?int\"}],\"type\":\"WallPaperSettings\"},{\"id\":-1896171181,\"predicate\":\"autoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"disabled\",\"type\":\"flags.0?true\"},{\"name\":\"video_preload_large\",\"type\":\"flags.1?true\"},{\"name\":\"audio_preload_next\",\"type\":\"flags.2?true\"},{\"name\":\"phonecalls_less_data\",\"type\":\"flags.3?true\"},{\"name\":\"photo_size_max\",\"type\":\"int\"},{\"name\":\"video_size_max\",\"type\":\"long\"},{\"name\":\"file_size_max\",\"type\":\"long\"},{\"name\":\"video_upload_maxbitrate\",\"type\":\"int\"}],\"type\":\"AutoDownloadSettings\"},{\"id\":1674235686,\"predicate\":\"account.autoDownloadSettings\",\"params\":[{\"name\":\"low\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"medium\",\"type\":\"AutoDownloadSettings\"},{\"name\":\"high\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"account.AutoDownloadSettings\"},{\"id\":-709641735,\"predicate\":\"emojiKeyword\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":594408994,\"predicate\":\"emojiKeywordDeleted\",\"params\":[{\"name\":\"keyword\",\"type\":\"string\"},{\"name\":\"emoticons\",\"type\":\"Vector\"}],\"type\":\"EmojiKeyword\"},{\"id\":1556570557,\"predicate\":\"emojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"keywords\",\"type\":\"Vector\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":-1519029347,\"predicate\":\"emojiURL\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":-1275374751,\"predicate\":\"emojiLanguage\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiLanguage\"},{\"id\":-1529000952,\"predicate\":\"inputPrivacyKeyForwards\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1777096355,\"predicate\":\"privacyKeyForwards\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1461304012,\"predicate\":\"inputPrivacyKeyProfilePhoto\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-1777000467,\"predicate\":\"privacyKeyProfilePhoto\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":1075322878,\"predicate\":\"inputPhotoFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"thumb_size\",\"type\":\"string\"}],\"type\":\"InputFileLocation\"},{\"id\":-667654413,\"predicate\":\"inputPhotoLegacyFileLocation\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"file_reference\",\"type\":\"bytes\"},{\"name\":\"volume_id\",\"type\":\"long\"},{\"name\":\"local_id\",\"type\":\"int\"},{\"name\":\"secret\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":925204121,\"predicate\":\"inputPeerPhotoFileLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"long\"}],\"type\":\"InputFileLocation\"},{\"id\":-1652231205,\"predicate\":\"inputStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb_version\",\"type\":\"int\"}],\"type\":\"InputFileLocation\"},{\"id\":-11252123,\"predicate\":\"folder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"autofill_new_broadcasts\",\"type\":\"flags.0?true\"},{\"name\":\"autofill_public_groups\",\"type\":\"flags.1?true\"},{\"name\":\"autofill_new_correspondents\",\"type\":\"flags.2?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.3?ChatPhoto\"}],\"type\":\"Folder\"},{\"id\":1908216652,\"predicate\":\"dialogFolder\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.2?true\"},{\"name\":\"folder\",\"type\":\"Folder\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"unread_muted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_peers_count\",\"type\":\"int\"},{\"name\":\"unread_muted_messages_count\",\"type\":\"int\"},{\"name\":\"unread_unmuted_messages_count\",\"type\":\"int\"}],\"type\":\"Dialog\"},{\"id\":1684014375,\"predicate\":\"inputDialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputDialogPeer\"},{\"id\":1363483106,\"predicate\":\"dialogPeerFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"DialogPeer\"},{\"id\":-70073706,\"predicate\":\"inputFolderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"InputFolderPeer\"},{\"id\":-373643672,\"predicate\":\"folderPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"FolderPeer\"},{\"id\":422972864,\"predicate\":\"updateFolderPeers\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":497305826,\"predicate\":\"inputUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputUser\"},{\"id\":1536380829,\"predicate\":\"inputChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputChannel\"},{\"id\":-1468331492,\"predicate\":\"inputPeerUserFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":-1121318848,\"predicate\":\"inputPeerChannelFromMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"channel_id\",\"type\":\"long\"}],\"type\":\"InputPeer\"},{\"id\":55761658,\"predicate\":\"inputPrivacyKeyPhoneNumber\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":-778378131,\"predicate\":\"privacyKeyPhoneNumber\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1472172887,\"predicate\":\"topPeerCategoryForwardUsers\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":-68239120,\"predicate\":\"topPeerCategoryForwardChats\",\"params\":[],\"type\":\"TopPeerCategory\"},{\"id\":84703944,\"predicate\":\"channelAdminLogEventActionChangeLinkedChat\",\"params\":[{\"name\":\"prev_value\",\"type\":\"long\"},{\"name\":\"new_value\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-398136321,\"predicate\":\"messages.searchCounter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.1?true\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"messages.SearchCounter\"},{\"id\":280464681,\"predicate\":\"keyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"button_id\",\"type\":\"int\"}],\"type\":\"KeyboardButton\"},{\"id\":-802258988,\"predicate\":\"inputKeyboardButtonUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"fwd_text\",\"type\":\"flags.1?string\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":-1831650802,\"predicate\":\"urlAuthResultRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"request_write_access\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"User\"},{\"name\":\"domain\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1886646706,\"predicate\":\"urlAuthResultAccepted\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1445536993,\"predicate\":\"urlAuthResultDefault\",\"params\":[],\"type\":\"UrlAuthResult\"},{\"id\":-2079962673,\"predicate\":\"inputPrivacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":-380694650,\"predicate\":\"inputPrivacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"InputPrivacyRule\"},{\"id\":1796427406,\"predicate\":\"privacyValueAllowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":1103656293,\"predicate\":\"privacyValueDisallowChatParticipants\",\"params\":[{\"name\":\"chats\",\"type\":\"Vector\"}],\"type\":\"PrivacyRule\"},{\"id\":-1672577397,\"predicate\":\"messageEntityUnderline\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1090087980,\"predicate\":\"messageEntityStrike\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":34469328,\"predicate\":\"messageEntityBlockquote\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":1786671974,\"predicate\":\"updatePeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"settings\",\"type\":\"PeerSettings\"}],\"type\":\"Update\"},{\"id\":-1078612597,\"predicate\":\"channelLocationEmpty\",\"params\":[],\"type\":\"ChannelLocation\"},{\"id\":547062491,\"predicate\":\"channelLocation\",\"params\":[{\"name\":\"geo_point\",\"type\":\"GeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"ChannelLocation\"},{\"id\":-901375139,\"predicate\":\"peerLocated\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":-1263546448,\"predicate\":\"updatePeerLocated\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":241923758,\"predicate\":\"channelAdminLogEventActionChangeLocation\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChannelLocation\"},{\"name\":\"new_value\",\"type\":\"ChannelLocation\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-606798099,\"predicate\":\"inputReportReasonGeoIrrelevant\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":1401984889,\"predicate\":\"channelAdminLogEventActionToggleSlowMode\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1148485274,\"predicate\":\"auth.authorizationSignUpRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"terms_of_service\",\"type\":\"flags.0?help.TermsOfService\"}],\"type\":\"auth.Authorization\"},{\"id\":-666824391,\"predicate\":\"payments.paymentVerificationNeeded\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.PaymentResult\"},{\"id\":42402760,\"predicate\":\"inputStickerSetAnimatedEmoji\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":967122427,\"predicate\":\"updateNewScheduledMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"Update\"},{\"id\":-1870238482,\"predicate\":\"updateDeleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-797791052,\"predicate\":\"restrictionReason\",\"params\":[{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"RestrictionReason\"},{\"id\":1012306921,\"predicate\":\"inputTheme\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputTheme\"},{\"id\":-175567375,\"predicate\":\"inputThemeSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputTheme\"},{\"id\":-1609668650,\"predicate\":\"theme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"creator\",\"type\":\"flags.0?true\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"for_chat\",\"type\":\"flags.5?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?Document\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"},{\"name\":\"emoticon\",\"type\":\"flags.6?string\"},{\"name\":\"installs_count\",\"type\":\"flags.4?int\"}],\"type\":\"Theme\"},{\"id\":-199313886,\"predicate\":\"account.themesNotModified\",\"params\":[],\"type\":\"account.Themes\"},{\"id\":-1707242387,\"predicate\":\"account.themes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"themes\",\"type\":\"Vector\"}],\"type\":\"account.Themes\"},{\"id\":-2112423005,\"predicate\":\"updateTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"Theme\"}],\"type\":\"Update\"},{\"id\":-786326563,\"predicate\":\"inputPrivacyKeyAddedByPhone\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":1124062251,\"predicate\":\"privacyKeyAddedByPhone\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-2027964103,\"predicate\":\"updateGeoLiveViewed\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1448076945,\"predicate\":\"updateLoginToken\",\"params\":[],\"type\":\"Update\"},{\"id\":1654593920,\"predicate\":\"auth.loginToken\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":110008598,\"predicate\":\"auth.loginTokenMigrateTo\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":957176926,\"predicate\":\"auth.loginTokenSuccess\",\"params\":[{\"name\":\"authorization\",\"type\":\"auth.Authorization\"}],\"type\":\"auth.LoginToken\"},{\"id\":1474462241,\"predicate\":\"account.contentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"},{\"name\":\"sensitive_can_change\",\"type\":\"flags.1?true\"}],\"type\":\"account.ContentSettings\"},{\"id\":-1456996667,\"predicate\":\"messages.inactiveChats\",\"params\":[{\"name\":\"dates\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.InactiveChats\"},{\"id\":-1012849566,\"predicate\":\"baseThemeClassic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-69724536,\"predicate\":\"baseThemeDay\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1212997976,\"predicate\":\"baseThemeNight\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1834973166,\"predicate\":\"baseThemeTinted\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":1527845466,\"predicate\":\"baseThemeArctic\",\"params\":[],\"type\":\"BaseTheme\"},{\"id\":-1770371538,\"predicate\":\"inputWallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"InputWallPaper\"},{\"id\":-528465642,\"predicate\":\"wallPaperNoFile\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"default\",\"type\":\"flags.1?true\"},{\"name\":\"dark\",\"type\":\"flags.4?true\"},{\"name\":\"settings\",\"type\":\"flags.2?WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":-1881255857,\"predicate\":\"inputThemeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?InputWallPaper\"},{\"name\":\"wallpaper_settings\",\"type\":\"flags.1?WallPaperSettings\"}],\"type\":\"InputThemeSettings\"},{\"id\":-94849324,\"predicate\":\"themeSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message_colors_animated\",\"type\":\"flags.2?true\"},{\"name\":\"base_theme\",\"type\":\"BaseTheme\"},{\"name\":\"accent_color\",\"type\":\"int\"},{\"name\":\"outbox_accent_color\",\"type\":\"flags.3?int\"},{\"name\":\"message_colors\",\"type\":\"flags.0?Vector\"},{\"name\":\"wallpaper\",\"type\":\"flags.1?WallPaper\"}],\"type\":\"ThemeSettings\"},{\"id\":1421174295,\"predicate\":\"webPageAttributeTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"documents\",\"type\":\"flags.0?Vector\"},{\"name\":\"settings\",\"type\":\"flags.1?ThemeSettings\"}],\"type\":\"WebPageAttribute\"},{\"id\":274961865,\"predicate\":\"updateMessagePollVote\",\"params\":[{\"name\":\"poll_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":886196148,\"predicate\":\"messageUserVote\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"option\",\"type\":\"bytes\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":1017491692,\"predicate\":\"messageUserVoteInputOption\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":-1973033641,\"predicate\":\"messageUserVoteMultiple\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"options\",\"type\":\"Vector\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"MessageUserVote\"},{\"id\":136574537,\"predicate\":\"messages.votesList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"votes\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.VotesList\"},{\"id\":-1144565411,\"predicate\":\"keyboardButtonRequestPoll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"quiz\",\"type\":\"flags.0?Bool\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1981704948,\"predicate\":\"messageEntityBankCard\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-177732982,\"predicate\":\"bankCardOpenUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"string\"}],\"type\":\"BankCardOpenUrl\"},{\"id\":1042605427,\"predicate\":\"payments.bankCardData\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"open_urls\",\"type\":\"Vector\"}],\"type\":\"payments.BankCardData\"},{\"id\":-118740917,\"predicate\":\"peerSelfLocated\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"PeerLocated\"},{\"id\":1949890536,\"predicate\":\"dialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"non_contacts\",\"type\":\"flags.1?true\"},{\"name\":\"groups\",\"type\":\"flags.2?true\"},{\"name\":\"broadcasts\",\"type\":\"flags.3?true\"},{\"name\":\"bots\",\"type\":\"flags.4?true\"},{\"name\":\"exclude_muted\",\"type\":\"flags.11?true\"},{\"name\":\"exclude_read\",\"type\":\"flags.12?true\"},{\"name\":\"exclude_archived\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"emoticon\",\"type\":\"flags.25?string\"},{\"name\":\"pinned_peers\",\"type\":\"Vector\"},{\"name\":\"include_peers\",\"type\":\"Vector\"},{\"name\":\"exclude_peers\",\"type\":\"Vector\"}],\"type\":\"DialogFilter\"},{\"id\":2004110666,\"predicate\":\"dialogFilterSuggested\",\"params\":[{\"name\":\"filter\",\"type\":\"DialogFilter\"},{\"name\":\"description\",\"type\":\"string\"}],\"type\":\"DialogFilterSuggested\"},{\"id\":654302845,\"predicate\":\"updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Update\"},{\"id\":-1512627963,\"predicate\":\"updateDialogFilterOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":889491791,\"predicate\":\"updateDialogFilters\",\"params\":[],\"type\":\"Update\"},{\"id\":-1237848657,\"predicate\":\"statsDateRangeDays\",\"params\":[{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"StatsDateRangeDays\"},{\"id\":-884757282,\"predicate\":\"statsAbsValueAndPrev\",\"params\":[{\"name\":\"current\",\"type\":\"double\"},{\"name\":\"previous\",\"type\":\"double\"}],\"type\":\"StatsAbsValueAndPrev\"},{\"id\":-875679776,\"predicate\":\"statsPercentValue\",\"params\":[{\"name\":\"part\",\"type\":\"double\"},{\"name\":\"total\",\"type\":\"double\"}],\"type\":\"StatsPercentValue\"},{\"id\":1244130093,\"predicate\":\"statsGraphAsync\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1092839390,\"predicate\":\"statsGraphError\",\"params\":[{\"name\":\"error\",\"type\":\"string\"}],\"type\":\"StatsGraph\"},{\"id\":-1901828938,\"predicate\":\"statsGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"json\",\"type\":\"DataJSON\"},{\"name\":\"zoom_token\",\"type\":\"flags.0?string\"}],\"type\":\"StatsGraph\"},{\"id\":-1387279939,\"predicate\":\"messageInteractionCounters\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"views\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"MessageInteractionCounters\"},{\"id\":-1107852396,\"predicate\":\"stats.broadcastStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"followers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"views_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"shares_per_post\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"enabled_notifications\",\"type\":\"StatsPercentValue\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"followers_graph\",\"type\":\"StatsGraph\"},{\"name\":\"mute_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"iv_interactions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"views_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_followers_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"recent_message_interactions\",\"type\":\"Vector\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":-428884101,\"predicate\":\"inputMediaDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputMedia\"},{\"id\":1065280907,\"predicate\":\"messageMediaDice\",\"params\":[{\"name\":\"value\",\"type\":\"int\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageMedia\"},{\"id\":-427863538,\"predicate\":\"inputStickerSetDice\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"InputStickerSet\"},{\"id\":-1728664459,\"predicate\":\"help.promoDataEmpty\",\"params\":[{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"help.PromoData\"},{\"id\":-1942390465,\"predicate\":\"help.promoData\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"proxy\",\"type\":\"flags.0?true\"},{\"name\":\"expires\",\"type\":\"int\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"psa_type\",\"type\":\"flags.1?string\"},{\"name\":\"psa_message\",\"type\":\"flags.2?string\"}],\"type\":\"help.PromoData\"},{\"id\":-567037804,\"predicate\":\"videoSize\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"size\",\"type\":\"int\"},{\"name\":\"video_start_ts\",\"type\":\"flags.0?double\"}],\"type\":\"VideoSize\"},{\"id\":643940105,\"predicate\":\"updatePhoneCallSignalingData\",\"params\":[{\"name\":\"phone_call_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Update\"},{\"id\":1634294960,\"predicate\":\"chatInvitePeek\",\"params\":[{\"name\":\"chat\",\"type\":\"Chat\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ChatInvite\"},{\"id\":-1660637285,\"predicate\":\"statsGroupTopPoster\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"int\"},{\"name\":\"avg_chars\",\"type\":\"int\"}],\"type\":\"StatsGroupTopPoster\"},{\"id\":-682079097,\"predicate\":\"statsGroupTopAdmin\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"deleted\",\"type\":\"int\"},{\"name\":\"kicked\",\"type\":\"int\"},{\"name\":\"banned\",\"type\":\"int\"}],\"type\":\"StatsGroupTopAdmin\"},{\"id\":1398765469,\"predicate\":\"statsGroupTopInviter\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"invitations\",\"type\":\"int\"}],\"type\":\"StatsGroupTopInviter\"},{\"id\":-276825834,\"predicate\":\"stats.megagroupStats\",\"params\":[{\"name\":\"period\",\"type\":\"StatsDateRangeDays\"},{\"name\":\"members\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"messages\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"viewers\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"posters\",\"type\":\"StatsAbsValueAndPrev\"},{\"name\":\"growth_graph\",\"type\":\"StatsGraph\"},{\"name\":\"members_graph\",\"type\":\"StatsGraph\"},{\"name\":\"new_members_by_source_graph\",\"type\":\"StatsGraph\"},{\"name\":\"languages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"messages_graph\",\"type\":\"StatsGraph\"},{\"name\":\"actions_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_hours_graph\",\"type\":\"StatsGraph\"},{\"name\":\"weekdays_graph\",\"type\":\"StatsGraph\"},{\"name\":\"top_posters\",\"type\":\"Vector\"},{\"name\":\"top_admins\",\"type\":\"Vector\"},{\"name\":\"top_inviters\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-1096616924,\"predicate\":\"globalPrivacySettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"archive_and_mute_new_noncontact_peers\",\"type\":\"flags.0?Bool\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":1667228533,\"predicate\":\"phoneConnectionWebrtc\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"turn\",\"type\":\"flags.0?true\"},{\"name\":\"stun\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"ipv6\",\"type\":\"string\"},{\"name\":\"port\",\"type\":\"int\"},{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"string\"}],\"type\":\"PhoneConnection\"},{\"id\":1107543535,\"predicate\":\"help.countryCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"country_code\",\"type\":\"string\"},{\"name\":\"prefixes\",\"type\":\"flags.0?Vector\"},{\"name\":\"patterns\",\"type\":\"flags.1?Vector\"}],\"type\":\"help.CountryCode\"},{\"id\":-1014526429,\"predicate\":\"help.country\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hidden\",\"type\":\"flags.0?true\"},{\"name\":\"iso2\",\"type\":\"string\"},{\"name\":\"default_name\",\"type\":\"string\"},{\"name\":\"name\",\"type\":\"flags.1?string\"},{\"name\":\"country_codes\",\"type\":\"Vector\"}],\"type\":\"help.Country\"},{\"id\":-1815339214,\"predicate\":\"help.countriesListNotModified\",\"params\":[],\"type\":\"help.CountriesList\"},{\"id\":-2016381538,\"predicate\":\"help.countriesList\",\"params\":[{\"name\":\"countries\",\"type\":\"Vector\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":1163625789,\"predicate\":\"messageViews\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"views\",\"type\":\"flags.0?int\"},{\"name\":\"forwards\",\"type\":\"flags.1?int\"},{\"name\":\"replies\",\"type\":\"flags.2?MessageReplies\"}],\"type\":\"MessageViews\"},{\"id\":-761649164,\"predicate\":\"updateChannelMessageForwards\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"forwards\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-96535659,\"predicate\":\"photoSizeProgressive\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"w\",\"type\":\"int\"},{\"name\":\"h\",\"type\":\"int\"},{\"name\":\"sizes\",\"type\":\"Vector\"}],\"type\":\"PhotoSize\"},{\"id\":-1228606141,\"predicate\":\"messages.messageViews\",\"params\":[{\"name\":\"views\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.MessageViews\"},{\"id\":-693004986,\"predicate\":\"updateReadChannelDiscussionInbox\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"},{\"name\":\"broadcast_id\",\"type\":\"flags.0?long\"},{\"name\":\"broadcast_post\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":1767677564,\"predicate\":\"updateReadChannelDiscussionOutbox\",\"params\":[{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1506535550,\"predicate\":\"messages.discussionMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"max_id\",\"type\":\"flags.0?int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"flags.1?int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"flags.2?int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-1495959709,\"predicate\":\"messageReplyHeader\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reply_to_scheduled\",\"type\":\"flags.2?true\"},{\"name\":\"forum_topic\",\"type\":\"flags.3?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"reply_to_peer_id\",\"type\":\"flags.0?Peer\"},{\"name\":\"reply_to_top_id\",\"type\":\"flags.1?int\"}],\"type\":\"MessageReplyHeader\"},{\"id\":-2083123262,\"predicate\":\"messageReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"comments\",\"type\":\"flags.0?true\"},{\"name\":\"replies\",\"type\":\"int\"},{\"name\":\"replies_pts\",\"type\":\"int\"},{\"name\":\"recent_repliers\",\"type\":\"flags.1?Vector\"},{\"name\":\"channel_id\",\"type\":\"flags.0?long\"},{\"name\":\"max_id\",\"type\":\"flags.2?int\"},{\"name\":\"read_max_id\",\"type\":\"flags.3?int\"}],\"type\":\"MessageReplies\"},{\"id\":610945826,\"predicate\":\"updatePeerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"blocked\",\"type\":\"Bool\"}],\"type\":\"Update\"},{\"id\":-386039788,\"predicate\":\"peerBlocked\",\"params\":[{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"}],\"type\":\"PeerBlocked\"},{\"id\":-1937192669,\"predicate\":\"updateChannelUserTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Update\"},{\"id\":-1392895362,\"predicate\":\"inputMessageCallbackQuery\",\"params\":[{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"InputMessage\"},{\"id\":453242886,\"predicate\":\"channelParticipantLeft\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"ChannelParticipant\"},{\"id\":-531931925,\"predicate\":\"channelParticipantsMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"q\",\"type\":\"flags.0?string\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"}],\"type\":\"ChannelParticipantsFilter\"},{\"id\":-309990731,\"predicate\":\"updatePinnedMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1538885128,\"predicate\":\"updatePinnedChannelMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":464520273,\"predicate\":\"inputMessagesFilterPinned\",\"params\":[],\"type\":\"MessagesFilter\"},{\"id\":-1986399595,\"predicate\":\"stats.messageStats\",\"params\":[{\"name\":\"views_graph\",\"type\":\"StatsGraph\"}],\"type\":\"stats.MessageStats\"},{\"id\":-1730095465,\"predicate\":\"messageActionGeoProximityReached\",\"params\":[{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"to_id\",\"type\":\"Peer\"},{\"name\":\"distance\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-668906175,\"predicate\":\"photoPathSize\",\"params\":[{\"name\":\"type\",\"type\":\"string\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"PhotoSize\"},{\"id\":-651419003,\"predicate\":\"speakingInGroupCallAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":2004925620,\"predicate\":\"groupCallDiscarded\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"duration\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-711498484,\"predicate\":\"groupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"join_muted\",\"type\":\"flags.1?true\"},{\"name\":\"can_change_join_muted\",\"type\":\"flags.2?true\"},{\"name\":\"join_date_asc\",\"type\":\"flags.6?true\"},{\"name\":\"schedule_start_subscribed\",\"type\":\"flags.8?true\"},{\"name\":\"can_start_video\",\"type\":\"flags.9?true\"},{\"name\":\"record_video_active\",\"type\":\"flags.11?true\"},{\"name\":\"rtmp_stream\",\"type\":\"flags.12?true\"},{\"name\":\"listeners_hidden\",\"type\":\"flags.13?true\"},{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"},{\"name\":\"participants_count\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.3?string\"},{\"name\":\"stream_dc_id\",\"type\":\"flags.4?int\"},{\"name\":\"record_start_date\",\"type\":\"flags.5?int\"},{\"name\":\"schedule_date\",\"type\":\"flags.7?int\"},{\"name\":\"unmuted_video_count\",\"type\":\"flags.10?int\"},{\"name\":\"unmuted_video_limit\",\"type\":\"int\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"GroupCall\"},{\"id\":-659913713,\"predicate\":\"inputGroupCall\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputGroupCall\"},{\"id\":2047704898,\"predicate\":\"messageActionGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"duration\",\"type\":\"flags.0?int\"}],\"type\":\"MessageAction\"},{\"id\":1345295095,\"predicate\":\"messageActionInviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"MessageAction\"},{\"id\":-341428482,\"predicate\":\"groupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"left\",\"type\":\"flags.1?true\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.2?true\"},{\"name\":\"just_joined\",\"type\":\"flags.4?true\"},{\"name\":\"versioned\",\"type\":\"flags.5?true\"},{\"name\":\"min\",\"type\":\"flags.8?true\"},{\"name\":\"muted_by_you\",\"type\":\"flags.9?true\"},{\"name\":\"volume_by_admin\",\"type\":\"flags.10?true\"},{\"name\":\"self\",\"type\":\"flags.12?true\"},{\"name\":\"video_joined\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"active_date\",\"type\":\"flags.3?int\"},{\"name\":\"source\",\"type\":\"int\"},{\"name\":\"volume\",\"type\":\"flags.7?int\"},{\"name\":\"about\",\"type\":\"flags.11?string\"},{\"name\":\"raise_hand_rating\",\"type\":\"flags.13?long\"},{\"name\":\"video\",\"type\":\"flags.6?GroupCallParticipantVideo\"},{\"name\":\"presentation\",\"type\":\"flags.14?GroupCallParticipantVideo\"}],\"type\":\"GroupCallParticipant\"},{\"id\":-124097970,\"predicate\":\"updateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":-219423922,\"predicate\":\"updateGroupCallParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":347227392,\"predicate\":\"updateGroupCall\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"call\",\"type\":\"GroupCall\"}],\"type\":\"Update\"},{\"id\":-1636664659,\"predicate\":\"phone.groupCall\",\"params\":[{\"name\":\"call\",\"type\":\"GroupCall\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"participants_next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.GroupCall\"},{\"id\":-193506890,\"predicate\":\"phone.groupParticipants\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"participants\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"string\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"version\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":813821341,\"predicate\":\"inlineQueryPeerTypeSameBotPM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-2093215828,\"predicate\":\"inlineQueryPeerTypePM\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":-681130742,\"predicate\":\"inlineQueryPeerTypeChat\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1589952067,\"predicate\":\"inlineQueryPeerTypeMegagroup\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":1664413338,\"predicate\":\"inlineQueryPeerTypeBroadcast\",\"params\":[],\"type\":\"InlineQueryPeerType\"},{\"id\":589338437,\"predicate\":\"channelAdminLogEventActionStartGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-610299584,\"predicate\":\"channelAdminLogEventActionDiscardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-115071790,\"predicate\":\"channelAdminLogEventActionParticipantMute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-431740480,\"predicate\":\"channelAdminLogEventActionParticipantUnmute\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1456906823,\"predicate\":\"channelAdminLogEventActionToggleGroupCallSetting\",\"params\":[{\"name\":\"join_muted\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1966921727,\"predicate\":\"inputPaymentCredentialsGooglePay\",\"params\":[{\"name\":\"payment_token\",\"type\":\"DataJSON\"}],\"type\":\"InputPaymentCredentials\"},{\"id\":375566091,\"predicate\":\"messages.historyImport\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"messages.HistoryImport\"},{\"id\":-606432698,\"predicate\":\"sendMessageHistoryImportAction\",\"params\":[{\"name\":\"progress\",\"type\":\"int\"}],\"type\":\"SendMessageAction\"},{\"id\":1578088377,\"predicate\":\"messages.historyImportParsed\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pm\",\"type\":\"flags.0?true\"},{\"name\":\"group\",\"type\":\"flags.1?true\"},{\"name\":\"title\",\"type\":\"flags.2?string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":-170010905,\"predicate\":\"inputReportReasonFake\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-275956116,\"predicate\":\"messages.affectedFoundMessages\",\"params\":[{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_count\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"messages\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":1007897979,\"predicate\":\"messageActionSetMessagesTTL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"period\",\"type\":\"int\"},{\"name\":\"auto_setting_from\",\"type\":\"flags.0?long\"}],\"type\":\"MessageAction\"},{\"id\":-1147422299,\"predicate\":\"updatePeerHistoryTTL\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"ttl_period\",\"type\":\"flags.0?int\"}],\"type\":\"Update\"},{\"id\":-796432838,\"predicate\":\"updateChatParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChatParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChatParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1738720581,\"predicate\":\"updateChannelParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"actor_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"prev_participant\",\"type\":\"flags.0?ChannelParticipant\"},{\"name\":\"new_participant\",\"type\":\"flags.1?ChannelParticipant\"},{\"name\":\"invite\",\"type\":\"flags.2?ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-997782967,\"predicate\":\"updateBotStopped\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"stopped\",\"type\":\"Bool\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1940201511,\"predicate\":\"chatInviteImporter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"about\",\"type\":\"flags.2?string\"},{\"name\":\"approved_by\",\"type\":\"flags.1?long\"}],\"type\":\"ChatInviteImporter\"},{\"id\":-1111085620,\"predicate\":\"messages.exportedChatInvites\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"invites\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":410107472,\"predicate\":\"messages.exportedChatInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":572915951,\"predicate\":\"messages.exportedChatInviteReplaced\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-2118733814,\"predicate\":\"messages.chatInviteImporters\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"importers\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-219353309,\"predicate\":\"chatAdminWithInvites\",\"params\":[{\"name\":\"admin_id\",\"type\":\"long\"},{\"name\":\"invites_count\",\"type\":\"int\"},{\"name\":\"revoked_invites_count\",\"type\":\"int\"}],\"type\":\"ChatAdminWithInvites\"},{\"id\":-1231326505,\"predicate\":\"messages.chatAdminsWithInvites\",\"params\":[{\"name\":\"admins\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":1557846647,\"predicate\":\"channelAdminLogEventActionParticipantJoinByInvite\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1515256996,\"predicate\":\"channelAdminLogEventActionExportedInviteDelete\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1091179342,\"predicate\":\"channelAdminLogEventActionExportedInviteRevoke\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-384910503,\"predicate\":\"channelAdminLogEventActionExportedInviteEdit\",\"params\":[{\"name\":\"prev_invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"new_invite\",\"type\":\"ExportedChatInvite\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1048537159,\"predicate\":\"channelAdminLogEventActionParticipantVolume\",\"params\":[{\"name\":\"participant\",\"type\":\"GroupCallParticipant\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1855199800,\"predicate\":\"channelAdminLogEventActionChangeHistoryTTL\",\"params\":[{\"name\":\"prev_value\",\"type\":\"int\"},{\"name\":\"new_value\",\"type\":\"int\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1571952873,\"predicate\":\"messages.checkedHistoryImportPeer\",\"params\":[{\"name\":\"confirm_text\",\"type\":\"string\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":93890858,\"predicate\":\"inputGroupCallStream\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"time_ms\",\"type\":\"long\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"video_channel\",\"type\":\"flags.0?int\"},{\"name\":\"video_quality\",\"type\":\"flags.0?int\"}],\"type\":\"InputFileLocation\"},{\"id\":-1343921601,\"predicate\":\"phone.joinAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":541839704,\"predicate\":\"phone.exportedGroupCallInvite\",\"params\":[{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":-672693723,\"predicate\":\"inputBotInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?InputWebDocument\"},{\"name\":\"invoice\",\"type\":\"Invoice\"},{\"name\":\"payload\",\"type\":\"bytes\"},{\"name\":\"provider\",\"type\":\"string\"},{\"name\":\"provider_data\",\"type\":\"DataJSON\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"InputBotInlineMessage\"},{\"id\":894081801,\"predicate\":\"botInlineMessageMediaInvoice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"shipping_address_requested\",\"type\":\"flags.1?true\"},{\"name\":\"test\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"description\",\"type\":\"string\"},{\"name\":\"photo\",\"type\":\"flags.0?WebDocument\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"total_amount\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"}],\"type\":\"BotInlineMessage\"},{\"id\":-1281329567,\"predicate\":\"messageActionGroupCallScheduled\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"schedule_date\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":-592373577,\"predicate\":\"groupCallParticipantVideoSourceGroup\",\"params\":[{\"name\":\"semantics\",\"type\":\"string\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"GroupCallParticipantVideoSourceGroup\"},{\"id\":1735736008,\"predicate\":\"groupCallParticipantVideo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"paused\",\"type\":\"flags.0?true\"},{\"name\":\"endpoint\",\"type\":\"string\"},{\"name\":\"source_groups\",\"type\":\"Vector\"},{\"name\":\"audio_source\",\"type\":\"flags.1?int\"}],\"type\":\"GroupCallParticipantVideo\"},{\"id\":192428418,\"predicate\":\"updateGroupCallConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"presentation\",\"type\":\"flags.0?true\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Update\"},{\"id\":-2046910401,\"predicate\":\"stickers.suggestedShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":795652779,\"predicate\":\"botCommandScopeDefault\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1011811544,\"predicate\":\"botCommandScopeUsers\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":1877059713,\"predicate\":\"botCommandScopeChats\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-1180016534,\"predicate\":\"botCommandScopeChatAdmins\",\"params\":[],\"type\":\"BotCommandScope\"},{\"id\":-610432643,\"predicate\":\"botCommandScopePeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":1071145937,\"predicate\":\"botCommandScopePeerAdmins\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"BotCommandScope\"},{\"id\":169026035,\"predicate\":\"botCommandScopePeerUser\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotCommandScope\"},{\"id\":-478701471,\"predicate\":\"account.resetPasswordFailedWait\",\"params\":[{\"name\":\"retry_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-370148227,\"predicate\":\"account.resetPasswordRequestedWait\",\"params\":[{\"name\":\"until_date\",\"type\":\"int\"}],\"type\":\"account.ResetPasswordResult\"},{\"id\":-383330754,\"predicate\":\"account.resetPasswordOk\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1299263278,\"predicate\":\"updateBotCommands\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":-1434950843,\"predicate\":\"messageActionSetChatTheme\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1336228175,\"predicate\":\"sendMessageChooseStickerAction\",\"params\":[],\"type\":\"SendMessageAction\"},{\"id\":981691896,\"predicate\":\"sponsoredMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"recommended\",\"type\":\"flags.5?true\"},{\"name\":\"show_peer_photo\",\"type\":\"flags.6?true\"},{\"name\":\"random_id\",\"type\":\"bytes\"},{\"name\":\"from_id\",\"type\":\"flags.3?Peer\"},{\"name\":\"chat_invite\",\"type\":\"flags.4?ChatInvite\"},{\"name\":\"chat_invite_hash\",\"type\":\"flags.4?string\"},{\"name\":\"channel_post\",\"type\":\"flags.2?int\"},{\"name\":\"start_param\",\"type\":\"flags.0?string\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.1?Vector\"}],\"type\":\"SponsoredMessage\"},{\"id\":-907141753,\"predicate\":\"messages.sponsoredMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"posts_between\",\"type\":\"flags.0?int\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":215889721,\"predicate\":\"inputStickerSetAnimatedEmojiAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":630664139,\"predicate\":\"sendMessageEmojiInteraction\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"interaction\",\"type\":\"DataJSON\"}],\"type\":\"SendMessageAction\"},{\"id\":-1234857938,\"predicate\":\"sendMessageEmojiInteractionSeen\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"SendMessageAction\"},{\"id\":-1227287081,\"predicate\":\"inputBotInlineMessageID64\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"},{\"name\":\"owner_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"access_hash\",\"type\":\"long\"}],\"type\":\"InputBotInlineMessageID\"},{\"id\":-911191137,\"predicate\":\"searchResultsCalendarPeriod\",\"params\":[{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"max_msg_id\",\"type\":\"int\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"SearchResultsCalendarPeriod\"},{\"id\":343859772,\"predicate\":\"messages.searchResultsCalendar\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inexact\",\"type\":\"flags.0?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"min_msg_id\",\"type\":\"int\"},{\"name\":\"offset_id_offset\",\"type\":\"flags.1?int\"},{\"name\":\"periods\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":2137295719,\"predicate\":\"searchResultPosition\",\"params\":[{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"SearchResultsPosition\"},{\"id\":1404185519,\"predicate\":\"messages.searchResultsPositions\",\"params\":[{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"positions\",\"type\":\"Vector\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":-339958837,\"predicate\":\"messageActionChatJoinedByRequest\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":1885586395,\"predicate\":\"updatePendingJoinRequests\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"requests_pending\",\"type\":\"int\"},{\"name\":\"recent_requesters\",\"type\":\"Vector\"}],\"type\":\"Update\"},{\"id\":299870598,\"predicate\":\"updateBotChatInviteRequester\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":-1347021750,\"predicate\":\"channelAdminLogEventActionParticipantJoinByRequest\",\"params\":[{\"name\":\"invite\",\"type\":\"ExportedChatInvite\"},{\"name\":\"approved_by\",\"type\":\"long\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-376962181,\"predicate\":\"inputKeyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"KeyboardButton\"},{\"id\":814112961,\"predicate\":\"keyboardButtonUserProfile\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"KeyboardButton\"},{\"id\":-191450938,\"predicate\":\"channels.sendAsPeers\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":-886388890,\"predicate\":\"channelAdminLogEventActionToggleNoForwards\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-738646805,\"predicate\":\"messages.stickerSetNotModified\",\"params\":[],\"type\":\"messages.StickerSet\"},{\"id\":997004590,\"predicate\":\"users.userFull\",\"params\":[{\"name\":\"full_user\",\"type\":\"UserFull\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"users.UserFull\"},{\"id\":1753266509,\"predicate\":\"messages.peerSettings\",\"params\":[{\"name\":\"settings\",\"type\":\"PeerSettings\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"messages.PeerSettings\"},{\"id\":663693416,\"predicate\":\"channelAdminLogEventActionSendMessage\",\"params\":[{\"name\":\"message\",\"type\":\"Message\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-702884114,\"predicate\":\"auth.codeTypeMissedCall\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-2113903484,\"predicate\":\"auth.sentCodeTypeMissedCall\",\"params\":[{\"name\":\"prefix\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1012759713,\"predicate\":\"auth.loggedOut\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"future_auth_token\",\"type\":\"flags.0?bytes\"}],\"type\":\"auth.LoggedOut\"},{\"id\":1578843320,\"predicate\":\"updateMessageReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"reactions\",\"type\":\"MessageReactions\"}],\"type\":\"Update\"},{\"id\":-1546531968,\"predicate\":\"reactionCount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"chosen_order\",\"type\":\"flags.0?int\"},{\"name\":\"reaction\",\"type\":\"Reaction\"},{\"name\":\"count\",\"type\":\"int\"}],\"type\":\"ReactionCount\"},{\"id\":1328256121,\"predicate\":\"messageReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"min\",\"type\":\"flags.0?true\"},{\"name\":\"can_see_list\",\"type\":\"flags.2?true\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"recent_reactions\",\"type\":\"flags.1?Vector\"}],\"type\":\"MessageReactions\"},{\"id\":834488621,\"predicate\":\"messages.messageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"next_offset\",\"type\":\"flags.0?string\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-1065882623,\"predicate\":\"availableReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"premium\",\"type\":\"flags.2?true\"},{\"name\":\"reaction\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"static_icon\",\"type\":\"Document\"},{\"name\":\"appear_animation\",\"type\":\"Document\"},{\"name\":\"select_animation\",\"type\":\"Document\"},{\"name\":\"activate_animation\",\"type\":\"Document\"},{\"name\":\"effect_animation\",\"type\":\"Document\"},{\"name\":\"around_animation\",\"type\":\"flags.1?Document\"},{\"name\":\"center_icon\",\"type\":\"flags.1?Document\"}],\"type\":\"AvailableReaction\"},{\"id\":-1626924713,\"predicate\":\"messages.availableReactionsNotModified\",\"params\":[],\"type\":\"messages.AvailableReactions\"},{\"id\":1989032621,\"predicate\":\"messages.availableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"},{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":852137487,\"predicate\":\"messageEntitySpoiler\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"MessageEntity\"},{\"id\":-1102180616,\"predicate\":\"channelAdminLogEventActionChangeAvailableReactions\",\"params\":[{\"name\":\"prev_value\",\"type\":\"ChatReactions\"},{\"name\":\"new_value\",\"type\":\"ChatReactions\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1741309751,\"predicate\":\"messages.translateNoResult\",\"params\":[],\"type\":\"messages.TranslatedText\"},{\"id\":-1575684144,\"predicate\":\"messages.translateResultText\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":-1319698788,\"predicate\":\"messagePeerReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.0?true\"},{\"name\":\"unread\",\"type\":\"flags.1?true\"},{\"name\":\"peer_id\",\"type\":\"Peer\"},{\"name\":\"reaction\",\"type\":\"Reaction\"}],\"type\":\"MessagePeerReaction\"},{\"id\":-2132064081,\"predicate\":\"groupCallStreamChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"int\"},{\"name\":\"scale\",\"type\":\"int\"},{\"name\":\"last_timestamp_ms\",\"type\":\"long\"}],\"type\":\"GroupCallStreamChannel\"},{\"id\":-790330702,\"predicate\":\"phone.groupCallStreamChannels\",\"params\":[{\"name\":\"channels\",\"type\":\"Vector\"}],\"type\":\"phone.GroupCallStreamChannels\"},{\"id\":177124030,\"predicate\":\"inputReportReasonIllegalDrugs\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":-1631091139,\"predicate\":\"inputReportReasonPersonalDetails\",\"params\":[],\"type\":\"ReportReason\"},{\"id\":767505458,\"predicate\":\"phone.groupCallStreamRtmpUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"key\",\"type\":\"string\"}],\"type\":\"phone.GroupCallStreamRtmpUrl\"},{\"id\":1165423600,\"predicate\":\"attachMenuBotIconColor\",\"params\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"color\",\"type\":\"int\"}],\"type\":\"AttachMenuBotIconColor\"},{\"id\":-1297663893,\"predicate\":\"attachMenuBotIcon\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"icon\",\"type\":\"Document\"},{\"name\":\"colors\",\"type\":\"flags.0?Vector\"}],\"type\":\"AttachMenuBotIcon\"},{\"id\":-928371502,\"predicate\":\"attachMenuBot\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"inactive\",\"type\":\"flags.0?true\"},{\"name\":\"has_settings\",\"type\":\"flags.1?true\"},{\"name\":\"request_write_access\",\"type\":\"flags.2?true\"},{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"peer_types\",\"type\":\"Vector\"},{\"name\":\"icons\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBot\"},{\"id\":-237467044,\"predicate\":\"attachMenuBotsNotModified\",\"params\":[],\"type\":\"AttachMenuBots\"},{\"id\":1011024320,\"predicate\":\"attachMenuBots\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"bots\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBots\"},{\"id\":-1816172929,\"predicate\":\"attachMenuBotsBot\",\"params\":[{\"name\":\"bot\",\"type\":\"AttachMenuBot\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"AttachMenuBotsBot\"},{\"id\":397910539,\"predicate\":\"updateAttachMenuBots\",\"params\":[],\"type\":\"Update\"},{\"id\":202659196,\"predicate\":\"webViewResultUrl\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"WebViewResult\"},{\"id\":-2010155333,\"predicate\":\"simpleWebViewResultUrl\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"SimpleWebViewResult\"},{\"id\":211046684,\"predicate\":\"webViewMessageSent\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"msg_id\",\"type\":\"flags.0?InputBotInlineMessageID\"}],\"type\":\"WebViewMessageSent\"},{\"id\":361936797,\"predicate\":\"updateWebViewResultSent\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":326529584,\"predicate\":\"keyboardButtonWebView\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":-1598009252,\"predicate\":\"keyboardButtonSimpleWebView\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"KeyboardButton\"},{\"id\":1205698681,\"predicate\":\"messageActionWebViewDataSentMe\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":-1262252875,\"predicate\":\"messageActionWebViewDataSent\",\"params\":[{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"MessageAction\"},{\"id\":347625491,\"predicate\":\"updateBotMenuButton\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"button\",\"type\":\"BotMenuButton\"}],\"type\":\"Update\"},{\"id\":1966318984,\"predicate\":\"botMenuButtonDefault\",\"params\":[],\"type\":\"BotMenuButton\"},{\"id\":1113113093,\"predicate\":\"botMenuButtonCommands\",\"params\":[],\"type\":\"BotMenuButton\"},{\"id\":-944407322,\"predicate\":\"botMenuButton\",\"params\":[{\"name\":\"text\",\"type\":\"string\"},{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"BotMenuButton\"},{\"id\":-67704655,\"predicate\":\"account.savedRingtonesNotModified\",\"params\":[],\"type\":\"account.SavedRingtones\"},{\"id\":-1041683259,\"predicate\":\"account.savedRingtones\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"ringtones\",\"type\":\"Vector\"}],\"type\":\"account.SavedRingtones\"},{\"id\":1960361625,\"predicate\":\"updateSavedRingtones\",\"params\":[],\"type\":\"Update\"},{\"id\":-1746354498,\"predicate\":\"notificationSoundDefault\",\"params\":[],\"type\":\"NotificationSound\"},{\"id\":1863070943,\"predicate\":\"notificationSoundNone\",\"params\":[],\"type\":\"NotificationSound\"},{\"id\":-2096391452,\"predicate\":\"notificationSoundLocal\",\"params\":[{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"NotificationSound\"},{\"id\":-9666487,\"predicate\":\"notificationSoundRingtone\",\"params\":[{\"name\":\"id\",\"type\":\"long\"}],\"type\":\"NotificationSound\"},{\"id\":-1222230163,\"predicate\":\"account.savedRingtone\",\"params\":[],\"type\":\"account.SavedRingtone\"},{\"id\":523271863,\"predicate\":\"account.savedRingtoneConverted\",\"params\":[{\"name\":\"document\",\"type\":\"Document\"}],\"type\":\"account.SavedRingtone\"},{\"id\":2104224014,\"predicate\":\"attachMenuPeerTypeSameBotPM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-1020528102,\"predicate\":\"attachMenuPeerTypeBotPM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-247016673,\"predicate\":\"attachMenuPeerTypePM\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":84480319,\"predicate\":\"attachMenuPeerTypeChat\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":2080104188,\"predicate\":\"attachMenuPeerTypeBroadcast\",\"params\":[],\"type\":\"AttachMenuPeerType\"},{\"id\":-317687113,\"predicate\":\"chatInvitePublicJoinRequests\",\"params\":[],\"type\":\"ExportedChatInvite\"},{\"id\":-977967015,\"predicate\":\"inputInvoiceMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"InputInvoice\"},{\"id\":-1020867857,\"predicate\":\"inputInvoiceSlug\",\"params\":[{\"name\":\"slug\",\"type\":\"string\"}],\"type\":\"InputInvoice\"},{\"id\":-1362048039,\"predicate\":\"payments.exportedInvoice\",\"params\":[{\"name\":\"url\",\"type\":\"string\"}],\"type\":\"payments.ExportedInvoice\"},{\"id\":8703322,\"predicate\":\"updateTranscribedAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pending\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"Update\"},{\"id\":-1821037486,\"predicate\":\"messages.transcribedAudio\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pending\",\"type\":\"flags.0?true\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"text\",\"type\":\"string\"}],\"type\":\"messages.TranscribedAudio\"},{\"id\":909284270,\"predicate\":\"dialogFilterDefault\",\"params\":[],\"type\":\"DialogFilter\"},{\"id\":1395946908,\"predicate\":\"help.premiumPromo\",\"params\":[{\"name\":\"status_text\",\"type\":\"string\"},{\"name\":\"status_entities\",\"type\":\"Vector\"},{\"name\":\"video_sections\",\"type\":\"Vector\"},{\"name\":\"videos\",\"type\":\"Vector\"},{\"name\":\"period_options\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"help.PremiumPromo\"},{\"id\":-925956616,\"predicate\":\"messageEntityCustomEmoji\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"MessageEntity\"},{\"id\":-48981863,\"predicate\":\"documentAttributeCustomEmoji\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"free\",\"type\":\"flags.0?true\"},{\"name\":\"text_color\",\"type\":\"flags.1?true\"},{\"name\":\"alt\",\"type\":\"string\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"DocumentAttribute\"},{\"id\":1087454222,\"predicate\":\"stickerSetFullCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"},{\"name\":\"packs\",\"type\":\"Vector\"},{\"name\":\"keywords\",\"type\":\"Vector\"},{\"name\":\"documents\",\"type\":\"Vector\"}],\"type\":\"StickerSetCovered\"},{\"id\":-1502273946,\"predicate\":\"inputStorePaymentPremiumSubscription\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"restore\",\"type\":\"flags.0?true\"}],\"type\":\"InputStorePaymentPurpose\"},{\"id\":1634697192,\"predicate\":\"inputStorePaymentGiftPremium\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"}],\"type\":\"InputStorePaymentPurpose\"},{\"id\":-1415514682,\"predicate\":\"messageActionGiftPremium\",\"params\":[{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"months\",\"type\":\"int\"}],\"type\":\"MessageAction\"},{\"id\":1958953753,\"predicate\":\"premiumGiftOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"months\",\"type\":\"int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"bot_url\",\"type\":\"string\"},{\"name\":\"store_product\",\"type\":\"flags.0?string\"}],\"type\":\"PremiumGiftOption\"},{\"id\":-930399486,\"predicate\":\"inputStickerSetPremiumGifts\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-78886548,\"predicate\":\"updateReadFeaturedEmojiStickers\",\"params\":[],\"type\":\"Update\"},{\"id\":-1360618136,\"predicate\":\"inputPrivacyKeyVoiceMessages\",\"params\":[],\"type\":\"InputPrivacyKey\"},{\"id\":110621716,\"predicate\":\"privacyKeyVoiceMessages\",\"params\":[],\"type\":\"PrivacyKey\"},{\"id\":-1996951013,\"predicate\":\"paymentFormMethod\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"PaymentFormMethod\"},{\"id\":-193992412,\"predicate\":\"inputWebFileAudioAlbumThumbLocation\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"small\",\"type\":\"flags.2?true\"},{\"name\":\"document\",\"type\":\"flags.0?InputDocument\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"performer\",\"type\":\"flags.1?string\"}],\"type\":\"InputWebFileLocation\"},{\"id\":769727150,\"predicate\":\"emojiStatusEmpty\",\"params\":[],\"type\":\"EmojiStatus\"},{\"id\":-1835310691,\"predicate\":\"emojiStatus\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"EmojiStatus\"},{\"id\":-97474361,\"predicate\":\"emojiStatusUntil\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"until\",\"type\":\"int\"}],\"type\":\"EmojiStatus\"},{\"id\":674706841,\"predicate\":\"updateUserEmojiStatus\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"},{\"name\":\"emoji_status\",\"type\":\"EmojiStatus\"}],\"type\":\"Update\"},{\"id\":821314523,\"predicate\":\"updateRecentEmojiStatuses\",\"params\":[],\"type\":\"Update\"},{\"id\":-796072379,\"predicate\":\"account.emojiStatusesNotModified\",\"params\":[],\"type\":\"account.EmojiStatuses\"},{\"id\":-1866176559,\"predicate\":\"account.emojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"statuses\",\"type\":\"Vector\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":2046153753,\"predicate\":\"reactionEmpty\",\"params\":[],\"type\":\"Reaction\"},{\"id\":455247544,\"predicate\":\"reactionEmoji\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Reaction\"},{\"id\":-1992950669,\"predicate\":\"reactionCustomEmoji\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"}],\"type\":\"Reaction\"},{\"id\":-352570692,\"predicate\":\"chatReactionsNone\",\"params\":[],\"type\":\"ChatReactions\"},{\"id\":1385335754,\"predicate\":\"chatReactionsAll\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"allow_custom\",\"type\":\"flags.0?true\"}],\"type\":\"ChatReactions\"},{\"id\":1713193015,\"predicate\":\"chatReactionsSome\",\"params\":[{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"ChatReactions\"},{\"id\":-1334846497,\"predicate\":\"messages.reactionsNotModified\",\"params\":[],\"type\":\"messages.Reactions\"},{\"id\":-352454890,\"predicate\":\"messages.reactions\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"reactions\",\"type\":\"Vector\"}],\"type\":\"messages.Reactions\"},{\"id\":1870160884,\"predicate\":\"updateRecentReactions\",\"params\":[],\"type\":\"Update\"},{\"id\":-2030252155,\"predicate\":\"updateMoveStickerSetToTop\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"stickerset\",\"type\":\"long\"}],\"type\":\"Update\"},{\"id\":1511364673,\"predicate\":\"auth.sentCodeTypeEmailCode\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"apple_signin_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"google_signin_allowed\",\"type\":\"flags.1?true\"},{\"name\":\"email_pattern\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"},{\"name\":\"next_phone_login_date\",\"type\":\"flags.2?int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":-1521934870,\"predicate\":\"auth.sentCodeTypeSetUpEmailRequired\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"apple_signin_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"google_signin_allowed\",\"type\":\"flags.1?true\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1128644211,\"predicate\":\"emailVerifyPurposeLoginSetup\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"EmailVerifyPurpose\"},{\"id\":1383932651,\"predicate\":\"emailVerifyPurposeLoginChange\",\"params\":[],\"type\":\"EmailVerifyPurpose\"},{\"id\":-1141565819,\"predicate\":\"emailVerifyPurposePassport\",\"params\":[],\"type\":\"EmailVerifyPurpose\"},{\"id\":-1842457175,\"predicate\":\"emailVerificationCode\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":-611279166,\"predicate\":\"emailVerificationGoogle\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":-1764723459,\"predicate\":\"emailVerificationApple\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"EmailVerification\"},{\"id\":731303195,\"predicate\":\"account.emailVerified\",\"params\":[{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.EmailVerified\"},{\"id\":-507835039,\"predicate\":\"account.emailVerifiedLogin\",\"params\":[{\"name\":\"email\",\"type\":\"string\"},{\"name\":\"sent_code\",\"type\":\"auth.SentCode\"}],\"type\":\"account.EmailVerified\"},{\"id\":-1225711938,\"predicate\":\"premiumSubscriptionOption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"current\",\"type\":\"flags.1?true\"},{\"name\":\"can_purchase_upgrade\",\"type\":\"flags.2?true\"},{\"name\":\"months\",\"type\":\"int\"},{\"name\":\"currency\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"long\"},{\"name\":\"bot_url\",\"type\":\"string\"},{\"name\":\"store_product\",\"type\":\"flags.0?string\"}],\"type\":\"PremiumSubscriptionOption\"},{\"id\":80008398,\"predicate\":\"inputStickerSetEmojiGenericAnimations\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":701560302,\"predicate\":\"inputStickerSetEmojiDefaultStatuses\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":-1206095820,\"predicate\":\"sendAsPeer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"premium_required\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"Peer\"}],\"type\":\"SendAsPeer\"},{\"id\":-1386050360,\"predicate\":\"messageExtendedMediaPreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"w\",\"type\":\"flags.0?int\"},{\"name\":\"h\",\"type\":\"flags.0?int\"},{\"name\":\"thumb\",\"type\":\"flags.1?PhotoSize\"},{\"name\":\"video_duration\",\"type\":\"flags.2?int\"}],\"type\":\"MessageExtendedMedia\"},{\"id\":-297296796,\"predicate\":\"messageExtendedMedia\",\"params\":[{\"name\":\"media\",\"type\":\"MessageMedia\"}],\"type\":\"MessageExtendedMedia\"},{\"id\":1517529484,\"predicate\":\"updateMessageExtendedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"extended_media\",\"type\":\"MessageExtendedMedia\"}],\"type\":\"Update\"},{\"id\":-50416996,\"predicate\":\"stickerKeyword\",\"params\":[{\"name\":\"document_id\",\"type\":\"long\"},{\"name\":\"keyword\",\"type\":\"Vector\"}],\"type\":\"StickerKeyword\"},{\"id\":-1274595769,\"predicate\":\"username\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"editable\",\"type\":\"flags.0?true\"},{\"name\":\"active\",\"type\":\"flags.1?true\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Username\"},{\"id\":-263212119,\"predicate\":\"channelAdminLogEventActionChangeUsernames\",\"params\":[{\"name\":\"prev_value\",\"type\":\"Vector\"},{\"name\":\"new_value\",\"type\":\"Vector\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":46949251,\"predicate\":\"channelAdminLogEventActionToggleForum\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1483767080,\"predicate\":\"channelAdminLogEventActionCreateTopic\",\"params\":[{\"name\":\"topic\",\"type\":\"ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-261103096,\"predicate\":\"channelAdminLogEventActionEditTopic\",\"params\":[{\"name\":\"prev_topic\",\"type\":\"ForumTopic\"},{\"name\":\"new_topic\",\"type\":\"ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":-1374254839,\"predicate\":\"channelAdminLogEventActionDeleteTopic\",\"params\":[{\"name\":\"topic\",\"type\":\"ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1569535291,\"predicate\":\"channelAdminLogEventActionPinTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"prev_topic\",\"type\":\"flags.0?ForumTopic\"},{\"name\":\"new_topic\",\"type\":\"flags.1?ForumTopic\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":37687451,\"predicate\":\"forumTopicDeleted\",\"params\":[{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"ForumTopic\"},{\"id\":1903173033,\"predicate\":\"forumTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"my\",\"type\":\"flags.1?true\"},{\"name\":\"closed\",\"type\":\"flags.2?true\"},{\"name\":\"pinned\",\"type\":\"flags.3?true\"},{\"name\":\"short\",\"type\":\"flags.5?true\"},{\"name\":\"hidden\",\"type\":\"flags.6?true\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"icon_color\",\"type\":\"int\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.0?long\"},{\"name\":\"top_message\",\"type\":\"int\"},{\"name\":\"read_inbox_max_id\",\"type\":\"int\"},{\"name\":\"read_outbox_max_id\",\"type\":\"int\"},{\"name\":\"unread_count\",\"type\":\"int\"},{\"name\":\"unread_mentions_count\",\"type\":\"int\"},{\"name\":\"unread_reactions_count\",\"type\":\"int\"},{\"name\":\"from_id\",\"type\":\"Peer\"},{\"name\":\"notify_settings\",\"type\":\"PeerNotifySettings\"},{\"name\":\"draft\",\"type\":\"flags.4?DraftMessage\"}],\"type\":\"ForumTopic\"},{\"id\":913709011,\"predicate\":\"messages.forumTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"order_by_create_date\",\"type\":\"flags.0?true\"},{\"name\":\"count\",\"type\":\"int\"},{\"name\":\"topics\",\"type\":\"Vector\"},{\"name\":\"messages\",\"type\":\"Vector\"},{\"name\":\"chats\",\"type\":\"Vector\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"pts\",\"type\":\"int\"}],\"type\":\"messages.ForumTopics\"},{\"id\":228168278,\"predicate\":\"messageActionTopicCreate\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"icon_color\",\"type\":\"int\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.0?long\"}],\"type\":\"MessageAction\"},{\"id\":-1064024032,\"predicate\":\"messageActionTopicEdit\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.1?long\"},{\"name\":\"closed\",\"type\":\"flags.2?Bool\"},{\"name\":\"hidden\",\"type\":\"flags.3?Bool\"}],\"type\":\"MessageAction\"},{\"id\":422509539,\"predicate\":\"updateChannelPinnedTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"topic_id\",\"type\":\"int\"}],\"type\":\"Update\"},{\"id\":1548122514,\"predicate\":\"inputNotifyForumTopic\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"int\"}],\"type\":\"InputNotifyPeer\"},{\"id\":577659656,\"predicate\":\"notifyForumTopic\",\"params\":[{\"name\":\"peer\",\"type\":\"Peer\"},{\"name\":\"top_msg_id\",\"type\":\"int\"}],\"type\":\"NotifyPeer\"},{\"id\":1153562857,\"predicate\":\"inputStickerSetEmojiDefaultTopicIcons\",\"params\":[],\"type\":\"InputStickerSet\"},{\"id\":406407439,\"predicate\":\"messages.sponsoredMessagesEmpty\",\"params\":[],\"type\":\"messages.SponsoredMessages\"},{\"id\":-31881726,\"predicate\":\"updateChannelPinnedTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel_id\",\"type\":\"long\"},{\"name\":\"order\",\"type\":\"flags.0?Vector\"}],\"type\":\"Update\"},{\"id\":1135897376,\"predicate\":\"defaultHistoryTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"DefaultHistoryTTL\"},{\"id\":116234636,\"predicate\":\"auth.codeTypeFragmentSms\",\"params\":[],\"type\":\"auth.CodeType\"},{\"id\":-648651719,\"predicate\":\"auth.sentCodeTypeFragmentSms\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"length\",\"type\":\"int\"}],\"type\":\"auth.SentCodeType\"},{\"id\":1103040667,\"predicate\":\"exportedContactToken\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"expires\",\"type\":\"int\"}],\"type\":\"ExportedContactToken\"},{\"id\":1693675004,\"predicate\":\"channelAdminLogEventActionToggleAntiSpam\",\"params\":[{\"name\":\"new_value\",\"type\":\"Bool\"}],\"type\":\"ChannelAdminLogEventAction\"},{\"id\":1474192222,\"predicate\":\"messageActionSuggestProfilePhoto\",\"params\":[{\"name\":\"photo\",\"type\":\"Photo\"}],\"type\":\"MessageAction\"},{\"id\":-404267113,\"predicate\":\"messageActionAttachMenuBotAllowed\",\"params\":[],\"type\":\"MessageAction\"},{\"id\":2008112412,\"predicate\":\"stickerSetNoCovered\",\"params\":[{\"name\":\"set\",\"type\":\"StickerSet\"}],\"type\":\"StickerSetCovered\"},{\"id\":542282808,\"predicate\":\"updateUser\",\"params\":[{\"name\":\"user_id\",\"type\":\"long\"}],\"type\":\"Update\"}],\"methods\":[{\"id\":-878758099,\"method\":\"invokeAfterMsg\",\"params\":[{\"name\":\"msg_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":1036301552,\"method\":\"invokeAfterMsgs\",\"params\":[{\"name\":\"msg_ids\",\"type\":\"Vector\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1502141361,\"method\":\"auth.sendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":-2131827673,\"method\":\"auth.signUp\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1923962543,\"method\":\"auth.signIn\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"flags.0?string\"},{\"name\":\"email_verification\",\"type\":\"flags.1?EmailVerification\"}],\"type\":\"auth.Authorization\"},{\"id\":1047706137,\"method\":\"auth.logOut\",\"params\":[],\"type\":\"auth.LoggedOut\"},{\"id\":-1616179942,\"method\":\"auth.resetAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":-440401971,\"method\":\"auth.exportAuthorization\",\"params\":[{\"name\":\"dc_id\",\"type\":\"int\"}],\"type\":\"auth.ExportedAuthorization\"},{\"id\":-1518699091,\"method\":\"auth.importAuthorization\",\"params\":[{\"name\":\"id\",\"type\":\"long\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"auth.Authorization\"},{\"id\":-841733627,\"method\":\"auth.bindTempAuthKey\",\"params\":[{\"name\":\"perm_auth_key_id\",\"type\":\"long\"},{\"name\":\"nonce\",\"type\":\"long\"},{\"name\":\"expires_at\",\"type\":\"int\"},{\"name\":\"encrypted_message\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-326762118,\"method\":\"account.registerDevice\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_muted\",\"type\":\"flags.0?true\"},{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"app_sandbox\",\"type\":\"Bool\"},{\"name\":\"secret\",\"type\":\"bytes\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1779249670,\"method\":\"account.unregisterDevice\",\"params\":[{\"name\":\"token_type\",\"type\":\"int\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"other_uids\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2067899501,\"method\":\"account.updateNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"},{\"name\":\"settings\",\"type\":\"InputPeerNotifySettings\"}],\"type\":\"Bool\"},{\"id\":313765169,\"method\":\"account.getNotifySettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputNotifyPeer\"}],\"type\":\"PeerNotifySettings\"},{\"id\":-612493497,\"method\":\"account.resetNotifySettings\",\"params\":[],\"type\":\"Bool\"},{\"id\":2018596725,\"method\":\"account.updateProfile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"first_name\",\"type\":\"flags.0?string\"},{\"name\":\"last_name\",\"type\":\"flags.1?string\"},{\"name\":\"about\",\"type\":\"flags.2?string\"}],\"type\":\"User\"},{\"id\":1713919532,\"method\":\"account.updateStatus\",\"params\":[{\"name\":\"offline\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":127302966,\"method\":\"account.getWallPapers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.WallPapers\"},{\"id\":-977650298,\"method\":\"account.reportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":227648840,\"method\":\"users.getUsers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1240508136,\"method\":\"users.getFullUser\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"users.UserFull\"},{\"id\":2061264541,\"method\":\"contacts.getContactIDs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":-995929106,\"method\":\"contacts.getStatuses\",\"params\":[],\"type\":\"Vector\"},{\"id\":1574346258,\"method\":\"contacts.getContacts\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.Contacts\"},{\"id\":746589157,\"method\":\"contacts.importContacts\",\"params\":[{\"name\":\"contacts\",\"type\":\"Vector\"}],\"type\":\"contacts.ImportedContacts\"},{\"id\":157945344,\"method\":\"contacts.deleteContacts\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":269745566,\"method\":\"contacts.deleteByPhones\",\"params\":[{\"name\":\"phones\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1758204945,\"method\":\"contacts.block\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1096393392,\"method\":\"contacts.unblock\",\"params\":[{\"name\":\"id\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-176409329,\"method\":\"contacts.getBlocked\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Blocked\"},{\"id\":1673946374,\"method\":\"messages.getMessages\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1594569905,\"method\":\"messages.getDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_pinned\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"flags.1?int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Dialogs\"},{\"id\":1143203525,\"method\":\"messages.getHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1593989278,\"method\":\"messages.search\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"from_id\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":238054714,\"method\":\"messages.readHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-1332768214,\"method\":\"messages.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"just_clear\",\"type\":\"flags.0?true\"},{\"name\":\"revoke\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_date\",\"type\":\"flags.2?int\"},{\"name\":\"max_date\",\"type\":\"flags.3?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-443640366,\"method\":\"messages.deleteMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":94983360,\"method\":\"messages.receivedMessages\",\"params\":[{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1486110434,\"method\":\"messages.setTyping\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"action\",\"type\":\"SendMessageAction\"}],\"type\":\"Bool\"},{\"id\":482476935,\"method\":\"messages.sendMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":1967638886,\"method\":\"messages.sendMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"media\",\"type\":\"InputMedia\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-966673468,\"method\":\"messages.forwardMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"with_my_score\",\"type\":\"flags.8?true\"},{\"name\":\"drop_author\",\"type\":\"flags.11?true\"},{\"name\":\"drop_media_captions\",\"type\":\"flags.12?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"from_peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"random_id\",\"type\":\"Vector\"},{\"name\":\"to_peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-820669733,\"method\":\"messages.reportSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-270948702,\"method\":\"messages.getPeerSettings\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.PeerSettings\"},{\"id\":-1991005362,\"method\":\"messages.report\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1240027791,\"method\":\"messages.getChats\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-1364194508,\"method\":\"messages.getFullChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"messages.ChatFull\"},{\"id\":1937260541,\"method\":\"messages.editChatTitle\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":903730804,\"method\":\"messages.editChatPhoto\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":-230206493,\"method\":\"messages.addChatUser\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"fwd_limit\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1575461717,\"method\":\"messages.deleteChatUser\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":3450904,\"method\":\"messages.createChat\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"users\",\"type\":\"Vector\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"ttl_period\",\"type\":\"flags.0?int\"}],\"type\":\"Updates\"},{\"id\":-304838614,\"method\":\"updates.getState\",\"params\":[],\"type\":\"updates.State\"},{\"id\":630429265,\"method\":\"updates.getDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"pts_total_limit\",\"type\":\"flags.0?int\"},{\"name\":\"date\",\"type\":\"int\"},{\"name\":\"qts\",\"type\":\"int\"}],\"type\":\"updates.Difference\"},{\"id\":473782614,\"method\":\"photos.updateProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"fallback\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputPhoto\"}],\"type\":\"photos.Photo\"},{\"id\":-1980559511,\"method\":\"photos.uploadProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"fallback\",\"type\":\"flags.3?true\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"photos.Photo\"},{\"id\":-2016444625,\"method\":\"photos.deletePhotos\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1291540959,\"method\":\"upload.saveFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1101843010,\"method\":\"upload.getFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"precise\",\"type\":\"flags.0?true\"},{\"name\":\"cdn_supported\",\"type\":\"flags.1?true\"},{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.File\"},{\"id\":-990308245,\"method\":\"help.getConfig\",\"params\":[],\"type\":\"Config\"},{\"id\":531836966,\"method\":\"help.getNearestDc\",\"params\":[],\"type\":\"NearestDc\"},{\"id\":1378703997,\"method\":\"help.getAppUpdate\",\"params\":[{\"name\":\"source\",\"type\":\"string\"}],\"type\":\"help.AppUpdate\"},{\"id\":1295590211,\"method\":\"help.getInviteText\",\"params\":[],\"type\":\"help.InviteText\"},{\"id\":-1848823128,\"method\":\"photos.getUserPhotos\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"photos.Photos\"},{\"id\":651135312,\"method\":\"messages.getDhConfig\",\"params\":[{\"name\":\"version\",\"type\":\"int\"},{\"name\":\"random_length\",\"type\":\"int\"}],\"type\":\"messages.DhConfig\"},{\"id\":-162681021,\"method\":\"messages.requestEncryption\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a\",\"type\":\"bytes\"}],\"type\":\"EncryptedChat\"},{\"id\":1035731989,\"method\":\"messages.acceptEncryption\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"}],\"type\":\"EncryptedChat\"},{\"id\":-208425312,\"method\":\"messages.discardEncryption\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_history\",\"type\":\"flags.0?true\"},{\"name\":\"chat_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":2031374829,\"method\":\"messages.setEncryptedTyping\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"typing\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2135648522,\"method\":\"messages.readEncryptedHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"max_date\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1157265941,\"method\":\"messages.sendEncrypted\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1431914525,\"method\":\"messages.sendEncryptedFile\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":852769188,\"method\":\"messages.sendEncryptedService\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"messages.SentEncryptedMessage\"},{\"id\":1436924774,\"method\":\"messages.receivedQueue\",\"params\":[{\"name\":\"max_qts\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1259113487,\"method\":\"messages.reportEncryptedSpam\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"}],\"type\":\"Bool\"},{\"id\":-562337987,\"method\":\"upload.saveBigFilePart\",\"params\":[{\"name\":\"file_id\",\"type\":\"long\"},{\"name\":\"file_part\",\"type\":\"int\"},{\"name\":\"file_total_parts\",\"type\":\"int\"},{\"name\":\"bytes\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-1043505495,\"method\":\"initConnection\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"device_model\",\"type\":\"string\"},{\"name\":\"system_version\",\"type\":\"string\"},{\"name\":\"app_version\",\"type\":\"string\"},{\"name\":\"system_lang_code\",\"type\":\"string\"},{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"proxy\",\"type\":\"flags.0?InputClientProxy\"},{\"name\":\"params\",\"type\":\"flags.1?JSONValue\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1663104819,\"method\":\"help.getSupport\",\"params\":[],\"type\":\"help.Support\"},{\"id\":916930423,\"method\":\"messages.readMessageContents\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":655677548,\"method\":\"account.checkUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1040964988,\"method\":\"account.updateUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":301470424,\"method\":\"contacts.search\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"contacts.Found\"},{\"id\":-623130288,\"method\":\"account.getPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-906486552,\"method\":\"account.setPrivacy\",\"params\":[{\"name\":\"key\",\"type\":\"InputPrivacyKey\"},{\"name\":\"rules\",\"type\":\"Vector\"}],\"type\":\"account.PrivacyRules\"},{\"id\":-1564422284,\"method\":\"account.deleteAccount\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reason\",\"type\":\"string\"},{\"name\":\"password\",\"type\":\"flags.0?InputCheckPasswordSRP\"}],\"type\":\"Bool\"},{\"id\":150761757,\"method\":\"account.getAccountTTL\",\"params\":[],\"type\":\"AccountDaysTTL\"},{\"id\":608323678,\"method\":\"account.setAccountTTL\",\"params\":[{\"name\":\"ttl\",\"type\":\"AccountDaysTTL\"}],\"type\":\"Bool\"},{\"id\":-627372787,\"method\":\"invokeWithLayer\",\"params\":[{\"name\":\"layer\",\"type\":\"int\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-113456221,\"method\":\"contacts.resolveUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":-2108208411,\"method\":\"account.sendChangePhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1891839707,\"method\":\"account.changePhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-710552671,\"method\":\"messages.getStickers\",\"params\":[{\"name\":\"emoticon\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Stickers\"},{\"id\":-1197432408,\"method\":\"messages.getAllStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":954152242,\"method\":\"account.updateDeviceLocked\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1738800940,\"method\":\"auth.importBotAuthorization\",\"params\":[{\"name\":\"flags\",\"type\":\"int\"},{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"bot_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-1956073268,\"method\":\"messages.getWebPagePreview\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"MessageMedia\"},{\"id\":-484392616,\"method\":\"account.getAuthorizations\",\"params\":[],\"type\":\"account.Authorizations\"},{\"id\":-545786948,\"method\":\"account.resetAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1418342645,\"method\":\"account.getPassword\",\"params\":[],\"type\":\"account.Password\"},{\"id\":-1663767815,\"method\":\"account.getPasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"account.PasswordSettings\"},{\"id\":-1516564433,\"method\":\"account.updatePasswordSettings\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"new_settings\",\"type\":\"account.PasswordInputSettings\"}],\"type\":\"Bool\"},{\"id\":-779399914,\"method\":\"auth.checkPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"auth.Authorization\"},{\"id\":-661144474,\"method\":\"auth.requestPasswordRecovery\",\"params\":[],\"type\":\"auth.PasswordRecovery\"},{\"id\":923364464,\"method\":\"auth.recoverPassword\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"code\",\"type\":\"string\"},{\"name\":\"new_settings\",\"type\":\"flags.0?account.PasswordInputSettings\"}],\"type\":\"auth.Authorization\"},{\"id\":-1080796745,\"method\":\"invokeWithoutUpdates\",\"params\":[{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1607670315,\"method\":\"messages.exportChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"legacy_revoke_permanent\",\"type\":\"flags.2?true\"},{\"name\":\"request_needed\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"ExportedChatInvite\"},{\"id\":1051570619,\"method\":\"messages.checkChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"ChatInvite\"},{\"id\":1817183516,\"method\":\"messages.importChatInvite\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-928977804,\"method\":\"messages.getStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-946871200,\"method\":\"messages.installStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"archived\",\"type\":\"Bool\"}],\"type\":\"messages.StickerSetInstallResult\"},{\"id\":-110209570,\"method\":\"messages.uninstallStickerSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":-421563528,\"method\":\"messages.startBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"start_param\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-1877938321,\"method\":\"help.getAppChangelog\",\"params\":[{\"name\":\"prev_app_version\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1468322785,\"method\":\"messages.getMessagesViews\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"},{\"name\":\"increment\",\"type\":\"Bool\"}],\"type\":\"messages.MessageViews\"},{\"id\":-871347913,\"method\":\"channels.readHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-2067661490,\"method\":\"channels.deleteMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.AffectedMessages\"},{\"id\":-196443371,\"method\":\"channels.reportSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1383294429,\"method\":\"channels.getMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":2010044880,\"method\":\"channels.getParticipants\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelParticipantsFilter\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"channels.ChannelParticipants\"},{\"id\":-1599378234,\"method\":\"channels.getParticipant\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"channels.ChannelParticipant\"},{\"id\":176122811,\"method\":\"channels.getChannels\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":141781513,\"method\":\"channels.getFullChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.ChatFull\"},{\"id\":-1862244601,\"method\":\"channels.createChannel\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"broadcast\",\"type\":\"flags.0?true\"},{\"name\":\"megagroup\",\"type\":\"flags.1?true\"},{\"name\":\"for_import\",\"type\":\"flags.3?true\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"about\",\"type\":\"string\"},{\"name\":\"geo_point\",\"type\":\"flags.2?InputGeoPoint\"},{\"name\":\"address\",\"type\":\"flags.2?string\"},{\"name\":\"ttl_period\",\"type\":\"flags.4?int\"}],\"type\":\"Updates\"},{\"id\":-751007486,\"method\":\"channels.editAdmin\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"},{\"name\":\"rank\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1450044624,\"method\":\"channels.editTitle\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-248621111,\"method\":\"channels.editPhoto\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"photo\",\"type\":\"InputChatPhoto\"}],\"type\":\"Updates\"},{\"id\":283557164,\"method\":\"channels.checkUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":890549214,\"method\":\"channels.updateUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":615851205,\"method\":\"channels.joinChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":-130635115,\"method\":\"channels.leaveChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":429865580,\"method\":\"channels.inviteToChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":-1072619549,\"method\":\"channels.deleteChannel\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":51854712,\"method\":\"updates.getChannelDifference\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"filter\",\"type\":\"ChannelMessagesFilter\"},{\"name\":\"pts\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"updates.ChannelDifference\"},{\"id\":-1470377534,\"method\":\"messages.editChatAdmin\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"is_admin\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1568189671,\"method\":\"messages.migrateChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1271290010,\"method\":\"messages.searchGlobal\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"folder_id\",\"type\":\"flags.0?int\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"min_date\",\"type\":\"int\"},{\"name\":\"max_date\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":2016638777,\"method\":\"messages.reorderStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1309538785,\"method\":\"messages.getDocumentByHash\",\"params\":[{\"name\":\"sha256\",\"type\":\"bytes\"},{\"name\":\"size\",\"type\":\"long\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1559270965,\"method\":\"messages.getSavedGifs\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.SavedGifs\"},{\"id\":846868683,\"method\":\"messages.saveGif\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1364105629,\"method\":\"messages.getInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"geo_point\",\"type\":\"flags.0?InputGeoPoint\"},{\"name\":\"query\",\"type\":\"string\"},{\"name\":\"offset\",\"type\":\"string\"}],\"type\":\"messages.BotResults\"},{\"id\":-346119674,\"method\":\"messages.setInlineBotResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"gallery\",\"type\":\"flags.0?true\"},{\"name\":\"private\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"results\",\"type\":\"Vector\"},{\"name\":\"cache_time\",\"type\":\"int\"},{\"name\":\"next_offset\",\"type\":\"flags.2?string\"},{\"name\":\"switch_pm\",\"type\":\"flags.3?InlineBotSwitchPM\"}],\"type\":\"Bool\"},{\"id\":-738468661,\"method\":\"messages.sendInlineBotResult\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"hide_via\",\"type\":\"flags.11?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":-432034325,\"method\":\"channels.exportMessageLink\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"grouped\",\"type\":\"flags.0?true\"},{\"name\":\"thread\",\"type\":\"flags.1?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"ExportedMessageLink\"},{\"id\":527021574,\"method\":\"channels.toggleSignatures\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1056025023,\"method\":\"auth.resendCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"auth.SentCode\"},{\"id\":520357240,\"method\":\"auth.cancelCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-39416522,\"method\":\"messages.getMessageEditData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"messages.MessageEditData\"},{\"id\":1224152952,\"method\":\"messages.editMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.15?int\"}],\"type\":\"Updates\"},{\"id\":-2091549254,\"method\":\"messages.editInlineBotMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"message\",\"type\":\"flags.11?string\"},{\"name\":\"media\",\"type\":\"flags.14?InputMedia\"},{\"name\":\"reply_markup\",\"type\":\"flags.2?ReplyMarkup\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":-1824339449,\"method\":\"messages.getBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"game\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"data\",\"type\":\"flags.0?bytes\"},{\"name\":\"password\",\"type\":\"flags.2?InputCheckPasswordSRP\"}],\"type\":\"messages.BotCallbackAnswer\"},{\"id\":-712043766,\"method\":\"messages.setBotCallbackAnswer\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"alert\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"message\",\"type\":\"flags.0?string\"},{\"name\":\"url\",\"type\":\"flags.2?string\"},{\"name\":\"cache_time\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-1758168906,\"method\":\"contacts.getTopPeers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"correspondents\",\"type\":\"flags.0?true\"},{\"name\":\"bots_pm\",\"type\":\"flags.1?true\"},{\"name\":\"bots_inline\",\"type\":\"flags.2?true\"},{\"name\":\"phone_calls\",\"type\":\"flags.3?true\"},{\"name\":\"forward_users\",\"type\":\"flags.4?true\"},{\"name\":\"forward_chats\",\"type\":\"flags.5?true\"},{\"name\":\"groups\",\"type\":\"flags.10?true\"},{\"name\":\"channels\",\"type\":\"flags.15?true\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"contacts.TopPeers\"},{\"id\":451113900,\"method\":\"contacts.resetTopPeerRating\",\"params\":[{\"name\":\"category\",\"type\":\"TopPeerCategory\"},{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-462373635,\"method\":\"messages.getPeerDialogs\",\"params\":[{\"name\":\"peers\",\"type\":\"Vector\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1271718337,\"method\":\"messages.saveDraft\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"no_webpage\",\"type\":\"flags.1?true\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.2?int\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"flags.3?Vector\"}],\"type\":\"Bool\"},{\"id\":1782549861,\"method\":\"messages.getAllDrafts\",\"params\":[],\"type\":\"Updates\"},{\"id\":1685588756,\"method\":\"messages.getFeaturedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":1527873830,\"method\":\"messages.readFeaturedStickers\",\"params\":[{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1649852357,\"method\":\"messages.getRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.RecentStickers\"},{\"id\":958863608,\"method\":\"messages.saveRecentSticker\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1986437075,\"method\":\"messages.clearRecentStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"attached\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":1475442322,\"method\":\"messages.getArchivedStickers\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"emojis\",\"type\":\"flags.1?true\"},{\"name\":\"offset_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ArchivedStickers\"},{\"id\":457157256,\"method\":\"account.sendConfirmPhoneCode\",\"params\":[{\"name\":\"hash\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1596029123,\"method\":\"account.confirmPhone\",\"params\":[{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-122669393,\"method\":\"channels.getAdminedPublicChannels\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"by_location\",\"type\":\"flags.0?true\"},{\"name\":\"check_limit\",\"type\":\"flags.1?true\"}],\"type\":\"messages.Chats\"},{\"id\":1678738104,\"method\":\"messages.getMaskStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":-866424884,\"method\":\"messages.getAttachedStickers\",\"params\":[{\"name\":\"media\",\"type\":\"InputStickeredMedia\"}],\"type\":\"Vector\"},{\"id\":-1907842680,\"method\":\"auth.dropTempAuthKeys\",\"params\":[{\"name\":\"except_auth_keys\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1896289088,\"method\":\"messages.setGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":363700068,\"method\":\"messages.setInlineGameScore\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"edit_message\",\"type\":\"flags.0?true\"},{\"name\":\"force\",\"type\":\"flags.1?true\"},{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"score\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-400399203,\"method\":\"messages.getGameHighScores\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":258170395,\"method\":\"messages.getInlineGameHighScores\",\"params\":[{\"name\":\"id\",\"type\":\"InputBotInlineMessageID\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"messages.HighScores\"},{\"id\":-468934396,\"method\":\"messages.getCommonChats\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-2023787330,\"method\":\"messages.getAllChats\",\"params\":[{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"messages.Chats\"},{\"id\":-333262899,\"method\":\"help.setBotUpdatesStatus\",\"params\":[{\"name\":\"pending_updates_count\",\"type\":\"int\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":852135825,\"method\":\"messages.getWebPage\",\"params\":[{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"WebPage\"},{\"id\":-1489903017,\"method\":\"messages.toggleDialogPin\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"pinned\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":991616823,\"method\":\"messages.reorderPinnedDialogs\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"folder_id\",\"type\":\"int\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-692498958,\"method\":\"messages.getPinnedDialogs\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"messages.PeerDialogs\"},{\"id\":-1440257555,\"method\":\"bots.sendCustomRequest\",\"params\":[{\"name\":\"custom_method\",\"type\":\"string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"DataJSON\"},{\"id\":-434028723,\"method\":\"bots.answerWebhookJSONQuery\",\"params\":[{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"data\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":619086221,\"method\":\"upload.getWebFile\",\"params\":[{\"name\":\"location\",\"type\":\"InputWebFileLocation\"},{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.WebFile\"},{\"id\":924093883,\"method\":\"payments.getPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"}],\"type\":\"payments.PaymentForm\"},{\"id\":611897804,\"method\":\"payments.getPaymentReceipt\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"payments.PaymentReceipt\"},{\"id\":-1228345045,\"method\":\"payments.validateRequestedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"save\",\"type\":\"flags.0?true\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"name\":\"info\",\"type\":\"PaymentRequestedInfo\"}],\"type\":\"payments.ValidatedRequestedInfo\"},{\"id\":755192367,\"method\":\"payments.sendPaymentForm\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"form_id\",\"type\":\"long\"},{\"name\":\"invoice\",\"type\":\"InputInvoice\"},{\"name\":\"requested_info_id\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_option_id\",\"type\":\"flags.1?string\"},{\"name\":\"credentials\",\"type\":\"InputPaymentCredentials\"},{\"name\":\"tip_amount\",\"type\":\"flags.2?long\"}],\"type\":\"payments.PaymentResult\"},{\"id\":1151208273,\"method\":\"account.getTmpPassword\",\"params\":[{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"account.TmpPassword\"},{\"id\":578650699,\"method\":\"payments.getSavedInfo\",\"params\":[],\"type\":\"payments.SavedInfo\"},{\"id\":-667062079,\"method\":\"payments.clearSavedInfo\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"credentials\",\"type\":\"flags.0?true\"},{\"name\":\"info\",\"type\":\"flags.1?true\"}],\"type\":\"Bool\"},{\"id\":-436833542,\"method\":\"messages.setBotShippingResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"},{\"name\":\"shipping_options\",\"type\":\"flags.1?Vector\"}],\"type\":\"Bool\"},{\"id\":163765653,\"method\":\"messages.setBotPrecheckoutResults\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.1?true\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"error\",\"type\":\"flags.0?string\"}],\"type\":\"Bool\"},{\"id\":-1876841625,\"method\":\"stickers.createStickerSet\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"masks\",\"type\":\"flags.0?true\"},{\"name\":\"animated\",\"type\":\"flags.1?true\"},{\"name\":\"videos\",\"type\":\"flags.4?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"short_name\",\"type\":\"string\"},{\"name\":\"thumb\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"stickers\",\"type\":\"Vector\"},{\"name\":\"software\",\"type\":\"flags.3?string\"}],\"type\":\"messages.StickerSet\"},{\"id\":-143257775,\"method\":\"stickers.removeStickerFromSet\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":-4795190,\"method\":\"stickers.changeStickerPosition\",\"params\":[{\"name\":\"sticker\",\"type\":\"InputDocument\"},{\"name\":\"position\",\"type\":\"int\"}],\"type\":\"messages.StickerSet\"},{\"id\":-2041315650,\"method\":\"stickers.addStickerToSet\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"sticker\",\"type\":\"InputStickerSetItem\"}],\"type\":\"messages.StickerSet\"},{\"id\":1369162417,\"method\":\"messages.uploadMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":1430593449,\"method\":\"phone.getCallConfig\",\"params\":[],\"type\":\"DataJSON\"},{\"id\":1124046573,\"method\":\"phone.requestCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"g_a_hash\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":1003664544,\"method\":\"phone.acceptCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_b\",\"type\":\"bytes\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":788404002,\"method\":\"phone.confirmCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"g_a\",\"type\":\"bytes\"},{\"name\":\"key_fingerprint\",\"type\":\"long\"},{\"name\":\"protocol\",\"type\":\"PhoneCallProtocol\"}],\"type\":\"phone.PhoneCall\"},{\"id\":399855457,\"method\":\"phone.receivedCall\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"}],\"type\":\"Bool\"},{\"id\":-1295269440,\"method\":\"phone.discardCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"video\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"duration\",\"type\":\"int\"},{\"name\":\"reason\",\"type\":\"PhoneCallDiscardReason\"},{\"name\":\"connection_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":1508562471,\"method\":\"phone.setCallRating\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"user_initiative\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"rating\",\"type\":\"int\"},{\"name\":\"comment\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":662363518,\"method\":\"phone.saveCallDebug\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"debug\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":962554330,\"method\":\"upload.getCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"upload.CdnFile\"},{\"id\":-1691921240,\"method\":\"upload.reuploadCdnFile\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"request_token\",\"type\":\"bytes\"}],\"type\":\"Vector\"},{\"id\":1375900482,\"method\":\"help.getCdnConfig\",\"params\":[],\"type\":\"CdnConfig\"},{\"id\":-219008246,\"method\":\"langpack.getLangPack\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackDifference\"},{\"id\":-269862909,\"method\":\"langpack.getStrings\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"keys\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-845657435,\"method\":\"langpack.getDifference\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"LangPackDifference\"},{\"id\":1120311183,\"method\":\"langpack.getLanguages\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":-1763259007,\"method\":\"channels.editBanned\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":870184064,\"method\":\"channels.getAdminLog\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"events_filter\",\"type\":\"flags.0?ChannelAdminLogEventsFilter\"},{\"name\":\"admins\",\"type\":\"flags.1?Vector\"},{\"name\":\"max_id\",\"type\":\"long\"},{\"name\":\"min_id\",\"type\":\"long\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"channels.AdminLogResults\"},{\"id\":-1847836879,\"method\":\"upload.getCdnFileHashes\",\"params\":[{\"name\":\"file_token\",\"type\":\"bytes\"},{\"name\":\"offset\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":-914493408,\"method\":\"messages.sendScreenshotNotification\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"int\"},{\"name\":\"random_id\",\"type\":\"long\"}],\"type\":\"Updates\"},{\"id\":-359881479,\"method\":\"channels.setStickers\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"}],\"type\":\"Bool\"},{\"id\":82946729,\"method\":\"messages.getFavedStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FavedStickers\"},{\"id\":-1174420133,\"method\":\"messages.faveSticker\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unfave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-357180360,\"method\":\"channels.readMessageContents\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-2020263951,\"method\":\"contacts.resetSaved\",\"params\":[],\"type\":\"Bool\"},{\"id\":-251140208,\"method\":\"messages.getUnreadMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1683319225,\"method\":\"channels.deleteHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"for_everyone\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"max_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1036054804,\"method\":\"help.getRecentMeUrls\",\"params\":[{\"name\":\"referer\",\"type\":\"string\"}],\"type\":\"help.RecentMeUrls\"},{\"id\":-356796084,\"method\":\"channels.togglePreHistoryHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":921026381,\"method\":\"messages.readMentions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1881817312,\"method\":\"messages.getRecentLocations\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1225713124,\"method\":\"messages.sendMultiMedia\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"background\",\"type\":\"flags.6?true\"},{\"name\":\"clear_draft\",\"type\":\"flags.7?true\"},{\"name\":\"noforwards\",\"type\":\"flags.14?true\"},{\"name\":\"update_stickersets_order\",\"type\":\"flags.15?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"multi_media\",\"type\":\"Vector\"},{\"name\":\"schedule_date\",\"type\":\"flags.10?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Updates\"},{\"id\":1347929239,\"method\":\"messages.uploadEncryptedFile\",\"params\":[{\"name\":\"peer\",\"type\":\"InputEncryptedChat\"},{\"name\":\"file\",\"type\":\"InputEncryptedFile\"}],\"type\":\"EncryptedFile\"},{\"id\":405695855,\"method\":\"account.getWebAuthorizations\",\"params\":[],\"type\":\"account.WebAuthorizations\"},{\"id\":755087855,\"method\":\"account.resetWebAuthorization\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":1747789204,\"method\":\"account.resetWebAuthorizations\",\"params\":[],\"type\":\"Bool\"},{\"id\":896555914,\"method\":\"messages.searchStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"exclude_featured\",\"type\":\"flags.0?true\"},{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FoundStickerSets\"},{\"id\":-1856595926,\"method\":\"upload.getFileHashes\",\"params\":[{\"name\":\"location\",\"type\":\"InputFileLocation\"},{\"name\":\"offset\",\"type\":\"long\"}],\"type\":\"Vector\"},{\"id\":749019089,\"method\":\"help.getTermsOfServiceUpdate\",\"params\":[],\"type\":\"help.TermsOfServiceUpdate\"},{\"id\":-294455398,\"method\":\"help.acceptTermsOfService\",\"params\":[{\"name\":\"id\",\"type\":\"DataJSON\"}],\"type\":\"Bool\"},{\"id\":-1299661699,\"method\":\"account.getAllSecureValues\",\"params\":[],\"type\":\"Vector\"},{\"id\":1936088002,\"method\":\"account.getSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1986010339,\"method\":\"account.saveSecureValue\",\"params\":[{\"name\":\"value\",\"type\":\"InputSecureValue\"},{\"name\":\"secure_secret_id\",\"type\":\"long\"}],\"type\":\"SecureValue\"},{\"id\":-1199522741,\"method\":\"account.deleteSecureValue\",\"params\":[{\"name\":\"types\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1865902923,\"method\":\"users.setSecureValueErrors\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"errors\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1456907910,\"method\":\"account.getAuthorizationForm\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"}],\"type\":\"account.AuthorizationForm\"},{\"id\":-202552205,\"method\":\"account.acceptAuthorization\",\"params\":[{\"name\":\"bot_id\",\"type\":\"long\"},{\"name\":\"scope\",\"type\":\"string\"},{\"name\":\"public_key\",\"type\":\"string\"},{\"name\":\"value_hashes\",\"type\":\"Vector\"},{\"name\":\"credentials\",\"type\":\"SecureCredentialsEncrypted\"}],\"type\":\"Bool\"},{\"id\":-1516022023,\"method\":\"account.sendVerifyPhoneCode\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"CodeSettings\"}],\"type\":\"auth.SentCode\"},{\"id\":1305716726,\"method\":\"account.verifyPhone\",\"params\":[{\"name\":\"phone_number\",\"type\":\"string\"},{\"name\":\"phone_code_hash\",\"type\":\"string\"},{\"name\":\"phone_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1730136133,\"method\":\"account.sendVerifyEmailCode\",\"params\":[{\"name\":\"purpose\",\"type\":\"EmailVerifyPurpose\"},{\"name\":\"email\",\"type\":\"string\"}],\"type\":\"account.SentEmailCode\"},{\"id\":53322959,\"method\":\"account.verifyEmail\",\"params\":[{\"name\":\"purpose\",\"type\":\"EmailVerifyPurpose\"},{\"name\":\"verification\",\"type\":\"EmailVerification\"}],\"type\":\"account.EmailVerified\"},{\"id\":1072547679,\"method\":\"help.getDeepLinkInfo\",\"params\":[{\"name\":\"path\",\"type\":\"string\"}],\"type\":\"help.DeepLinkInfo\"},{\"id\":-2098076769,\"method\":\"contacts.getSaved\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2092831552,\"method\":\"channels.getLeftChannels\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"}],\"type\":\"messages.Chats\"},{\"id\":-1896617296,\"method\":\"account.initTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"contacts\",\"type\":\"flags.0?true\"},{\"name\":\"message_users\",\"type\":\"flags.1?true\"},{\"name\":\"message_chats\",\"type\":\"flags.2?true\"},{\"name\":\"message_megagroups\",\"type\":\"flags.3?true\"},{\"name\":\"message_channels\",\"type\":\"flags.4?true\"},{\"name\":\"files\",\"type\":\"flags.5?true\"},{\"name\":\"file_max_size\",\"type\":\"flags.5?long\"}],\"type\":\"account.Takeout\"},{\"id\":489050862,\"method\":\"account.finishTakeoutSession\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"success\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":486505992,\"method\":\"messages.getSplitRanges\",\"params\":[],\"type\":\"Vector\"},{\"id\":911373810,\"method\":\"invokeWithMessagesRange\",\"params\":[{\"name\":\"range\",\"type\":\"MessageRange\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1398145746,\"method\":\"invokeWithTakeout\",\"params\":[{\"name\":\"takeout_id\",\"type\":\"long\"},{\"name\":\"query\",\"type\":\"!X\"}],\"type\":\"X\"},{\"id\":-1031349873,\"method\":\"messages.markDialogUnread\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"unread\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputDialogPeer\"}],\"type\":\"Bool\"},{\"id\":585256482,\"method\":\"messages.getDialogUnreadMarks\",\"params\":[],\"type\":\"Vector\"},{\"id\":-2062238246,\"method\":\"contacts.toggleTopPeers\",\"params\":[{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":2119757468,\"method\":\"messages.clearAllDrafts\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1735311088,\"method\":\"help.getAppConfig\",\"params\":[],\"type\":\"JSONValue\"},{\"id\":1862465352,\"method\":\"help.saveAppLog\",\"params\":[{\"name\":\"events\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-966677240,\"method\":\"help.getPassportConfig\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.PassportConfig\"},{\"id\":1784243458,\"method\":\"langpack.getLanguage\",\"params\":[{\"name\":\"lang_pack\",\"type\":\"string\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"LangPackLanguage\"},{\"id\":-760547348,\"method\":\"messages.updatePinnedMessage\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.0?true\"},{\"name\":\"unpin\",\"type\":\"flags.1?true\"},{\"name\":\"pm_oneside\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-1881204448,\"method\":\"account.confirmPasswordEmail\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":2055154197,\"method\":\"account.resendPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-1043606090,\"method\":\"account.cancelPasswordEmail\",\"params\":[],\"type\":\"Bool\"},{\"id\":-748624084,\"method\":\"help.getSupportName\",\"params\":[],\"type\":\"help.SupportName\"},{\"id\":59377875,\"method\":\"help.getUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"help.UserInfo\"},{\"id\":1723407216,\"method\":\"help.editUserInfo\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"message\",\"type\":\"string\"},{\"name\":\"entities\",\"type\":\"Vector\"}],\"type\":\"help.UserInfo\"},{\"id\":-1626880216,\"method\":\"account.getContactSignUpNotification\",\"params\":[],\"type\":\"Bool\"},{\"id\":-806076575,\"method\":\"account.setContactSignUpNotification\",\"params\":[{\"name\":\"silent\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":1398240377,\"method\":\"account.getNotifyExceptions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"compare_sound\",\"type\":\"flags.1?true\"},{\"name\":\"peer\",\"type\":\"flags.0?InputNotifyPeer\"}],\"type\":\"Updates\"},{\"id\":283795844,\"method\":\"messages.sendVote\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"options\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1941660731,\"method\":\"messages.getPollResults\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1848369232,\"method\":\"messages.getOnlines\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"ChatOnlines\"},{\"id\":-554301545,\"method\":\"messages.editChatAbout\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"about\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-1517917375,\"method\":\"messages.editChatDefaultBannedRights\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"banned_rights\",\"type\":\"ChatBannedRights\"}],\"type\":\"Updates\"},{\"id\":-57811990,\"method\":\"account.getWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"}],\"type\":\"WallPaper\"},{\"id\":-578472351,\"method\":\"account.uploadWallPaper\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"mime_type\",\"type\":\"string\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"WallPaper\"},{\"id\":1817860919,\"method\":\"account.saveWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"unsave\",\"type\":\"Bool\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-18000023,\"method\":\"account.installWallPaper\",\"params\":[{\"name\":\"wallpaper\",\"type\":\"InputWallPaper\"},{\"name\":\"settings\",\"type\":\"WallPaperSettings\"}],\"type\":\"Bool\"},{\"id\":-1153722364,\"method\":\"account.resetWallPapers\",\"params\":[],\"type\":\"Bool\"},{\"id\":1457130303,\"method\":\"account.getAutoDownloadSettings\",\"params\":[],\"type\":\"account.AutoDownloadSettings\"},{\"id\":1995661875,\"method\":\"account.saveAutoDownloadSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"low\",\"type\":\"flags.0?true\"},{\"name\":\"high\",\"type\":\"flags.1?true\"},{\"name\":\"settings\",\"type\":\"AutoDownloadSettings\"}],\"type\":\"Bool\"},{\"id\":899735650,\"method\":\"messages.getEmojiKeywords\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":352892591,\"method\":\"messages.getEmojiKeywordsDifference\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"from_version\",\"type\":\"int\"}],\"type\":\"EmojiKeywordsDifference\"},{\"id\":1318675378,\"method\":\"messages.getEmojiKeywordsLanguages\",\"params\":[{\"name\":\"lang_codes\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-709817306,\"method\":\"messages.getEmojiURL\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"EmojiURL\"},{\"id\":1749536939,\"method\":\"folders.editPeerFolders\",\"params\":[{\"name\":\"folder_peers\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":472471681,\"method\":\"folders.deleteFolder\",\"params\":[{\"name\":\"folder_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":11435201,\"method\":\"messages.getSearchCounters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"filters\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-170208392,\"method\":\"channels.getGroupsForDiscussion\",\"params\":[],\"type\":\"messages.Chats\"},{\"id\":1079520178,\"method\":\"channels.setDiscussionGroup\",\"params\":[{\"name\":\"broadcast\",\"type\":\"InputChannel\"},{\"name\":\"group\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":428848198,\"method\":\"messages.requestUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":-1322487515,\"method\":\"messages.acceptUrlAuth\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"flags.1?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.1?int\"},{\"name\":\"button_id\",\"type\":\"flags.1?int\"},{\"name\":\"url\",\"type\":\"flags.2?string\"}],\"type\":\"UrlAuthResult\"},{\"id\":1336717624,\"method\":\"messages.hidePeerSettingsBar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-386636848,\"method\":\"contacts.addContact\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"add_phone_privacy_exception\",\"type\":\"flags.0?true\"},{\"name\":\"id\",\"type\":\"InputUser\"},{\"name\":\"first_name\",\"type\":\"string\"},{\"name\":\"last_name\",\"type\":\"string\"},{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-130964977,\"method\":\"contacts.acceptContact\",\"params\":[{\"name\":\"id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-1892102881,\"method\":\"channels.editCreator\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"password\",\"type\":\"InputCheckPasswordSRP\"}],\"type\":\"Updates\"},{\"id\":-750207932,\"method\":\"contacts.getLocated\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"background\",\"type\":\"flags.1?true\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"self_expires\",\"type\":\"flags.0?int\"}],\"type\":\"Updates\"},{\"id\":1491484525,\"method\":\"channels.editLocation\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"geo_point\",\"type\":\"InputGeoPoint\"},{\"name\":\"address\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-304832784,\"method\":\"channels.toggleSlowMode\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"seconds\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-183077365,\"method\":\"messages.getScheduledHistory\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":-1111817116,\"method\":\"messages.getScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"messages.Messages\"},{\"id\":-1120369398,\"method\":\"messages.sendScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1504586518,\"method\":\"messages.deleteScheduledMessages\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":473805619,\"method\":\"account.uploadTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"thumb\",\"type\":\"flags.0?InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":1697530880,\"method\":\"account.createTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"slug\",\"type\":\"string\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":737414348,\"method\":\"account.updateTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"slug\",\"type\":\"flags.0?string\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"document\",\"type\":\"flags.2?InputDocument\"},{\"name\":\"settings\",\"type\":\"flags.3?Vector\"}],\"type\":\"Theme\"},{\"id\":-229175188,\"method\":\"account.saveTheme\",\"params\":[{\"name\":\"theme\",\"type\":\"InputTheme\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-953697477,\"method\":\"account.installTheme\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"theme\",\"type\":\"flags.1?InputTheme\"},{\"name\":\"format\",\"type\":\"flags.2?string\"},{\"name\":\"base_theme\",\"type\":\"flags.3?BaseTheme\"}],\"type\":\"Bool\"},{\"id\":978872812,\"method\":\"account.getTheme\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"theme\",\"type\":\"InputTheme\"}],\"type\":\"Theme\"},{\"id\":1913054296,\"method\":\"account.getThemes\",\"params\":[{\"name\":\"format\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-1210022402,\"method\":\"auth.exportLoginToken\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"except_ids\",\"type\":\"Vector\"}],\"type\":\"auth.LoginToken\"},{\"id\":-1783866140,\"method\":\"auth.importLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"auth.LoginToken\"},{\"id\":-392909491,\"method\":\"auth.acceptLoginToken\",\"params\":[{\"name\":\"token\",\"type\":\"bytes\"}],\"type\":\"Authorization\"},{\"id\":-1250643605,\"method\":\"account.setContentSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"sensitive_enabled\",\"type\":\"flags.0?true\"}],\"type\":\"Bool\"},{\"id\":-1952756306,\"method\":\"account.getContentSettings\",\"params\":[],\"type\":\"account.ContentSettings\"},{\"id\":300429806,\"method\":\"channels.getInactiveChannels\",\"params\":[],\"type\":\"messages.InactiveChats\"},{\"id\":1705865692,\"method\":\"account.getMultiWallPapers\",\"params\":[{\"name\":\"wallpapers\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-1200736242,\"method\":\"messages.getPollVotes\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"option\",\"type\":\"flags.0?bytes\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.VotesList\"},{\"id\":-1257951254,\"method\":\"messages.toggleStickerSets\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"uninstall\",\"type\":\"flags.0?true\"},{\"name\":\"archive\",\"type\":\"flags.1?true\"},{\"name\":\"unarchive\",\"type\":\"flags.2?true\"},{\"name\":\"stickersets\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":779736953,\"method\":\"payments.getBankCardData\",\"params\":[{\"name\":\"number\",\"type\":\"string\"}],\"type\":\"payments.BankCardData\"},{\"id\":-241247891,\"method\":\"messages.getDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":-1566780372,\"method\":\"messages.getSuggestedDialogFilters\",\"params\":[],\"type\":\"Vector\"},{\"id\":450142282,\"method\":\"messages.updateDialogFilter\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"filter\",\"type\":\"flags.0?DialogFilter\"}],\"type\":\"Bool\"},{\"id\":-983318044,\"method\":\"messages.updateDialogFiltersOrder\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":-1421720550,\"method\":\"stats.getBroadcastStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.BroadcastStats\"},{\"id\":1646092192,\"method\":\"stats.loadAsyncGraph\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"token\",\"type\":\"string\"},{\"name\":\"x\",\"type\":\"flags.0?long\"}],\"type\":\"StatsGraph\"},{\"id\":-1707717072,\"method\":\"stickers.setStickerSetThumb\",\"params\":[{\"name\":\"stickerset\",\"type\":\"InputStickerSet\"},{\"name\":\"thumb\",\"type\":\"InputDocument\"}],\"type\":\"messages.StickerSet\"},{\"id\":85399130,\"method\":\"bots.setBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"commands\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":2127598753,\"method\":\"messages.getOldFeaturedStickers\",\"params\":[{\"name\":\"offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-1063816159,\"method\":\"help.getPromoData\",\"params\":[],\"type\":\"help.PromoData\"},{\"id\":505748629,\"method\":\"help.hidePromoData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-8744061,\"method\":\"phone.sendSignalingData\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-589330937,\"method\":\"stats.getMegagroupStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"stats.MegagroupStats\"},{\"id\":-349483786,\"method\":\"account.getGlobalPrivacySettings\",\"params\":[],\"type\":\"GlobalPrivacySettings\"},{\"id\":517647042,\"method\":\"account.setGlobalPrivacySettings\",\"params\":[{\"name\":\"settings\",\"type\":\"GlobalPrivacySettings\"}],\"type\":\"GlobalPrivacySettings\"},{\"id\":-183649631,\"method\":\"help.dismissSuggestion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"suggestion\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1935116200,\"method\":\"help.getCountriesList\",\"params\":[{\"name\":\"lang_code\",\"type\":\"string\"},{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"help.CountriesList\"},{\"id\":584962828,\"method\":\"messages.getReplies\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Messages\"},{\"id\":1147761405,\"method\":\"messages.getDiscussionMessage\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.DiscussionMessage\"},{\"id\":-147740172,\"method\":\"messages.readDiscussion\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"read_max_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":698914348,\"method\":\"contacts.blockFromReplies\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"delete_message\",\"type\":\"flags.0?true\"},{\"name\":\"delete_history\",\"type\":\"flags.1?true\"},{\"name\":\"report_spam\",\"type\":\"flags.2?true\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":1445996571,\"method\":\"stats.getMessagePublicForwards\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"offset_rate\",\"type\":\"int\"},{\"name\":\"offset_peer\",\"type\":\"InputPeer\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":-1226791947,\"method\":\"stats.getMessageStats\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"dark\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"stats.MessageStats\"},{\"id\":-299714136,\"method\":\"messages.unpinAllMessages\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":1221445336,\"method\":\"phone.createGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"rtmp_stream\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"random_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"schedule_date\",\"type\":\"flags.1?int\"}],\"type\":\"Updates\"},{\"id\":-1322057861,\"method\":\"phone.joinGroupCall\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"muted\",\"type\":\"flags.0?true\"},{\"name\":\"video_stopped\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"},{\"name\":\"invite_hash\",\"type\":\"flags.1?string\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":1342404601,\"method\":\"phone.leaveGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"source\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":2067345760,\"method\":\"phone.inviteToGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"users\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":2054648117,\"method\":\"phone.discardGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1958458429,\"method\":\"phone.toggleGroupCallSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"reset_invite_hash\",\"type\":\"flags.1?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"join_muted\",\"type\":\"flags.0?Bool\"}],\"type\":\"Updates\"},{\"id\":68699611,\"method\":\"phone.getGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupCall\"},{\"id\":-984033109,\"method\":\"phone.getGroupParticipants\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"ids\",\"type\":\"Vector\"},{\"name\":\"sources\",\"type\":\"Vector\"},{\"name\":\"offset\",\"type\":\"string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"phone.GroupParticipants\"},{\"id\":-1248003721,\"method\":\"phone.checkGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"sources\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":1540419152,\"method\":\"messages.deleteChat\",\"params\":[{\"name\":\"chat_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-104078327,\"method\":\"messages.deletePhoneCallHistory\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoke\",\"type\":\"flags.0?true\"}],\"type\":\"messages.AffectedFoundMessages\"},{\"id\":1140726259,\"method\":\"messages.checkHistoryImport\",\"params\":[{\"name\":\"import_head\",\"type\":\"string\"}],\"type\":\"messages.HistoryImportParsed\"},{\"id\":873008187,\"method\":\"messages.initHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"media_count\",\"type\":\"int\"}],\"type\":\"messages.HistoryImport\"},{\"id\":713433234,\"method\":\"messages.uploadImportedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"media\",\"type\":\"InputMedia\"}],\"type\":\"MessageMedia\"},{\"id\":-1271008444,\"method\":\"messages.startHistoryImport\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"import_id\",\"type\":\"long\"}],\"type\":\"Bool\"},{\"id\":-1565154314,\"method\":\"messages.getExportedChatInvites\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.3?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"},{\"name\":\"offset_date\",\"type\":\"flags.2?int\"},{\"name\":\"offset_link\",\"type\":\"flags.2?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ExportedChatInvites\"},{\"id\":1937010524,\"method\":\"messages.getExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":-1110823051,\"method\":\"messages.editExportedChatInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"revoked\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"},{\"name\":\"expire_date\",\"type\":\"flags.0?int\"},{\"name\":\"usage_limit\",\"type\":\"flags.1?int\"},{\"name\":\"request_needed\",\"type\":\"flags.3?Bool\"},{\"name\":\"title\",\"type\":\"flags.4?string\"}],\"type\":\"messages.ExportedChatInvite\"},{\"id\":1452833749,\"method\":\"messages.deleteRevokedExportedChatInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"admin_id\",\"type\":\"InputUser\"}],\"type\":\"Bool\"},{\"id\":-731601877,\"method\":\"messages.deleteExportedChatInvite\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":958457583,\"method\":\"messages.getAdminsWithInvites\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.ChatAdminsWithInvites\"},{\"id\":-553329330,\"method\":\"messages.getChatInviteImporters\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"requested\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"},{\"name\":\"q\",\"type\":\"flags.2?string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_user\",\"type\":\"InputUser\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ChatInviteImporters\"},{\"id\":-1207017500,\"method\":\"messages.setHistoryTTL\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Updates\"},{\"id\":-91437323,\"method\":\"account.reportProfilePhoto\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"photo_id\",\"type\":\"InputPhoto\"},{\"name\":\"reason\",\"type\":\"ReportReason\"},{\"name\":\"message\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":187239529,\"method\":\"channels.convertToGigagroup\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Updates\"},{\"id\":1573261059,\"method\":\"messages.checkHistoryImportPeer\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"messages.CheckedHistoryImportPeer\"},{\"id\":-248985848,\"method\":\"phone.toggleGroupCallRecord\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"start\",\"type\":\"flags.0?true\"},{\"name\":\"video\",\"type\":\"flags.2?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"flags.1?string\"},{\"name\":\"video_portrait\",\"type\":\"flags.2?Bool\"}],\"type\":\"Updates\"},{\"id\":-1524155713,\"method\":\"phone.editGroupCallParticipant\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"participant\",\"type\":\"InputPeer\"},{\"name\":\"muted\",\"type\":\"flags.0?Bool\"},{\"name\":\"volume\",\"type\":\"flags.1?int\"},{\"name\":\"raise_hand\",\"type\":\"flags.2?Bool\"},{\"name\":\"video_stopped\",\"type\":\"flags.3?Bool\"},{\"name\":\"video_paused\",\"type\":\"flags.4?Bool\"},{\"name\":\"presentation_paused\",\"type\":\"flags.5?Bool\"}],\"type\":\"Updates\"},{\"id\":480685066,\"method\":\"phone.editGroupCallTitle\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-277077702,\"method\":\"phone.getGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"phone.JoinAsPeers\"},{\"id\":-425040769,\"method\":\"phone.exportGroupCallInvite\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"can_self_unmute\",\"type\":\"flags.0?true\"},{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.ExportedGroupCallInvite\"},{\"id\":563885286,\"method\":\"phone.toggleGroupCallStartSubscription\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"subscribed\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1451287362,\"method\":\"phone.startScheduledGroupCall\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":1465786252,\"method\":\"phone.saveDefaultGroupCallJoinAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"join_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-873829436,\"method\":\"phone.joinGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"},{\"name\":\"params\",\"type\":\"DataJSON\"}],\"type\":\"Updates\"},{\"id\":475058500,\"method\":\"phone.leaveGroupCallPresentation\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"Updates\"},{\"id\":676017721,\"method\":\"stickers.checkShortName\",\"params\":[{\"name\":\"short_name\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":1303364867,\"method\":\"stickers.suggestShortName\",\"params\":[{\"name\":\"title\",\"type\":\"string\"}],\"type\":\"stickers.SuggestedShortName\"},{\"id\":1032708345,\"method\":\"bots.resetBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-481554986,\"method\":\"bots.getBotCommands\",\"params\":[{\"name\":\"scope\",\"type\":\"BotCommandScope\"},{\"name\":\"lang_code\",\"type\":\"string\"}],\"type\":\"Vector\"},{\"id\":-1828139493,\"method\":\"account.resetPassword\",\"params\":[],\"type\":\"account.ResetPasswordResult\"},{\"id\":1284770294,\"method\":\"account.declinePasswordReset\",\"params\":[],\"type\":\"Bool\"},{\"id\":221691769,\"method\":\"auth.checkRecoveryPassword\",\"params\":[{\"name\":\"code\",\"type\":\"string\"}],\"type\":\"Bool\"},{\"id\":-700916087,\"method\":\"account.getChatThemes\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.Themes\"},{\"id\":-432283329,\"method\":\"messages.setChatTheme\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"emoticon\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":-1095836780,\"method\":\"channels.viewSponsoredMessage\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"random_id\",\"type\":\"bytes\"}],\"type\":\"Bool\"},{\"id\":-333377601,\"method\":\"channels.getSponsoredMessages\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"messages.SponsoredMessages\"},{\"id\":745510839,\"method\":\"messages.getMessageReadParticipants\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Vector\"},{\"id\":1240514025,\"method\":\"messages.getSearchResultsCalendar\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_date\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsCalendar\"},{\"id\":1855292323,\"method\":\"messages.getSearchResultsPositions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.SearchResultsPositions\"},{\"id\":2145904661,\"method\":\"messages.hideChatJoinRequest\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"Updates\"},{\"id\":-528091926,\"method\":\"messages.hideAllChatJoinRequests\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"approved\",\"type\":\"flags.0?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"link\",\"type\":\"flags.1?string\"}],\"type\":\"Updates\"},{\"id\":-1323389022,\"method\":\"messages.toggleNoForwards\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-855777386,\"method\":\"messages.saveDefaultSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"send_as\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":231174382,\"method\":\"channels.getSendAs\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"}],\"type\":\"channels.SendAsPeers\"},{\"id\":-1081501024,\"method\":\"account.setAuthorizationTTL\",\"params\":[{\"name\":\"authorization_ttl_days\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1089766498,\"method\":\"account.changeAuthorizationSettings\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"hash\",\"type\":\"long\"},{\"name\":\"encrypted_requests_disabled\",\"type\":\"flags.0?Bool\"},{\"name\":\"call_requests_disabled\",\"type\":\"flags.1?Bool\"}],\"type\":\"Bool\"},{\"id\":913655003,\"method\":\"channels.deleteParticipantHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"participant\",\"type\":\"InputPeer\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-754091820,\"method\":\"messages.sendReaction\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"big\",\"type\":\"flags.1?true\"},{\"name\":\"add_to_recent\",\"type\":\"flags.2?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?Vector\"}],\"type\":\"Updates\"},{\"id\":-1950707482,\"method\":\"messages.getMessagesReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1176190792,\"method\":\"messages.getMessageReactionsList\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction\",\"type\":\"flags.0?Reaction\"},{\"name\":\"offset\",\"type\":\"flags.1?string\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.MessageReactionsList\"},{\"id\":-21928079,\"method\":\"messages.setChatAvailableReactions\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"available_reactions\",\"type\":\"ChatReactions\"}],\"type\":\"Updates\"},{\"id\":417243308,\"method\":\"messages.getAvailableReactions\",\"params\":[{\"name\":\"hash\",\"type\":\"int\"}],\"type\":\"messages.AvailableReactions\"},{\"id\":1330094102,\"method\":\"messages.setDefaultReaction\",\"params\":[{\"name\":\"reaction\",\"type\":\"Reaction\"}],\"type\":\"Bool\"},{\"id\":617508334,\"method\":\"messages.translateText\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"flags.0?InputPeer\"},{\"name\":\"msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"text\",\"type\":\"flags.1?string\"},{\"name\":\"from_lang\",\"type\":\"flags.2?string\"},{\"name\":\"to_lang\",\"type\":\"string\"}],\"type\":\"messages.TranslatedText\"},{\"id\":841173339,\"method\":\"messages.getUnreadReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"add_offset\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"max_id\",\"type\":\"int\"},{\"name\":\"min_id\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":1420459918,\"method\":\"messages.readReactions\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"top_msg_id\",\"type\":\"flags.0?int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":-1963375804,\"method\":\"contacts.resolvePhone\",\"params\":[{\"name\":\"phone\",\"type\":\"string\"}],\"type\":\"contacts.ResolvedPeer\"},{\"id\":447879488,\"method\":\"phone.getGroupCallStreamChannels\",\"params\":[{\"name\":\"call\",\"type\":\"InputGroupCall\"}],\"type\":\"phone.GroupCallStreamChannels\"},{\"id\":-558650433,\"method\":\"phone.getGroupCallStreamRtmpUrl\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"revoke\",\"type\":\"Bool\"}],\"type\":\"phone.GroupCallStreamRtmpUrl\"},{\"id\":276705696,\"method\":\"messages.searchSentMedia\",\"params\":[{\"name\":\"q\",\"type\":\"string\"},{\"name\":\"filter\",\"type\":\"MessagesFilter\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.Messages\"},{\"id\":385663691,\"method\":\"messages.getAttachMenuBots\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"AttachMenuBots\"},{\"id\":1998676370,\"method\":\"messages.getAttachMenuBot\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"}],\"type\":\"AttachMenuBotsBot\"},{\"id\":1777704297,\"method\":\"messages.toggleBotInAttachMenu\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"write_allowed\",\"type\":\"flags.0?true\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":395003915,\"method\":\"messages.requestWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"from_bot_menu\",\"type\":\"flags.4?true\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"url\",\"type\":\"flags.1?string\"},{\"name\":\"start_param\",\"type\":\"flags.3?string\"},{\"name\":\"theme_params\",\"type\":\"flags.2?DataJSON\"},{\"name\":\"platform\",\"type\":\"string\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"WebViewResult\"},{\"id\":2146648841,\"method\":\"messages.prolongWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"silent\",\"type\":\"flags.5?true\"},{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"query_id\",\"type\":\"long\"},{\"name\":\"reply_to_msg_id\",\"type\":\"flags.0?int\"},{\"name\":\"top_msg_id\",\"type\":\"flags.9?int\"},{\"name\":\"send_as\",\"type\":\"flags.13?InputPeer\"}],\"type\":\"Bool\"},{\"id\":698084494,\"method\":\"messages.requestSimpleWebView\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"url\",\"type\":\"string\"},{\"name\":\"theme_params\",\"type\":\"flags.0?DataJSON\"},{\"name\":\"platform\",\"type\":\"string\"}],\"type\":\"SimpleWebViewResult\"},{\"id\":172168437,\"method\":\"messages.sendWebViewResultMessage\",\"params\":[{\"name\":\"bot_query_id\",\"type\":\"string\"},{\"name\":\"result\",\"type\":\"InputBotInlineResult\"}],\"type\":\"WebViewMessageSent\"},{\"id\":-603831608,\"method\":\"messages.sendWebViewData\",\"params\":[{\"name\":\"bot\",\"type\":\"InputUser\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"button_text\",\"type\":\"string\"},{\"name\":\"data\",\"type\":\"string\"}],\"type\":\"Updates\"},{\"id\":1157944655,\"method\":\"bots.setBotMenuButton\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"button\",\"type\":\"BotMenuButton\"}],\"type\":\"Bool\"},{\"id\":-1671369944,\"method\":\"bots.getBotMenuButton\",\"params\":[{\"name\":\"user_id\",\"type\":\"InputUser\"}],\"type\":\"BotMenuButton\"},{\"id\":-510647672,\"method\":\"account.getSavedRingtones\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.SavedRingtones\"},{\"id\":1038768899,\"method\":\"account.saveRingtone\",\"params\":[{\"name\":\"id\",\"type\":\"InputDocument\"},{\"name\":\"unsave\",\"type\":\"Bool\"}],\"type\":\"account.SavedRingtone\"},{\"id\":-2095414366,\"method\":\"account.uploadRingtone\",\"params\":[{\"name\":\"file\",\"type\":\"InputFile\"},{\"name\":\"file_name\",\"type\":\"string\"},{\"name\":\"mime_type\",\"type\":\"string\"}],\"type\":\"Document\"},{\"id\":2021942497,\"method\":\"bots.setBotBroadcastDefaultAdminRights\",\"params\":[{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"}],\"type\":\"Bool\"},{\"id\":-1839281686,\"method\":\"bots.setBotGroupDefaultAdminRights\",\"params\":[{\"name\":\"admin_rights\",\"type\":\"ChatAdminRights\"}],\"type\":\"Bool\"},{\"id\":1092913030,\"method\":\"phone.saveCallLog\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPhoneCall\"},{\"name\":\"file\",\"type\":\"InputFile\"}],\"type\":\"Bool\"},{\"id\":-456419968,\"method\":\"channels.toggleJoinToSend\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":1277789622,\"method\":\"channels.toggleJoinRequest\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":261206117,\"method\":\"payments.exportInvoice\",\"params\":[{\"name\":\"invoice_media\",\"type\":\"InputMedia\"}],\"type\":\"payments.ExportedInvoice\"},{\"id\":647928393,\"method\":\"messages.transcribeAudio\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"messages.TranscribedAudio\"},{\"id\":2132608815,\"method\":\"messages.rateTranscribedAudio\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"msg_id\",\"type\":\"int\"},{\"name\":\"transcription_id\",\"type\":\"long\"},{\"name\":\"good\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-2131921795,\"method\":\"payments.assignAppStoreTransaction\",\"params\":[{\"name\":\"receipt\",\"type\":\"bytes\"},{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Updates\"},{\"id\":-537046829,\"method\":\"payments.assignPlayMarketTransaction\",\"params\":[{\"name\":\"receipt\",\"type\":\"DataJSON\"},{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Updates\"},{\"id\":-1614700874,\"method\":\"payments.canPurchasePremium\",\"params\":[{\"name\":\"purpose\",\"type\":\"InputStorePaymentPurpose\"}],\"type\":\"Bool\"},{\"id\":-1206152236,\"method\":\"help.getPremiumPromo\",\"params\":[],\"type\":\"help.PremiumPromo\"},{\"id\":-643100844,\"method\":\"messages.getCustomEmojiDocuments\",\"params\":[{\"name\":\"document_id\",\"type\":\"Vector\"}],\"type\":\"Vector\"},{\"id\":-67329649,\"method\":\"messages.getEmojiStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.AllStickers\"},{\"id\":248473398,\"method\":\"messages.getFeaturedEmojiStickers\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.FeaturedStickers\"},{\"id\":-70001045,\"method\":\"account.updateEmojiStatus\",\"params\":[{\"name\":\"emoji_status\",\"type\":\"EmojiStatus\"}],\"type\":\"Bool\"},{\"id\":-696962170,\"method\":\"account.getDefaultEmojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":257392901,\"method\":\"account.getRecentEmojiStatuses\",\"params\":[{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"account.EmojiStatuses\"},{\"id\":404757166,\"method\":\"account.clearRecentEmojiStatuses\",\"params\":[],\"type\":\"Bool\"},{\"id\":1063567478,\"method\":\"messages.reportReaction\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"int\"},{\"name\":\"reaction_peer\",\"type\":\"InputPeer\"}],\"type\":\"Bool\"},{\"id\":-1149164102,\"method\":\"messages.getTopReactions\",\"params\":[{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Reactions\"},{\"id\":960896434,\"method\":\"messages.getRecentReactions\",\"params\":[{\"name\":\"limit\",\"type\":\"int\"},{\"name\":\"hash\",\"type\":\"long\"}],\"type\":\"messages.Reactions\"},{\"id\":-1644236876,\"method\":\"messages.clearRecentReactions\",\"params\":[],\"type\":\"Bool\"},{\"id\":-2064119788,\"method\":\"messages.getExtendedMedia\",\"params\":[{\"name\":\"peer\",\"type\":\"InputPeer\"},{\"name\":\"id\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":767062953,\"method\":\"auth.importWebTokenAuthorization\",\"params\":[{\"name\":\"api_id\",\"type\":\"int\"},{\"name\":\"api_hash\",\"type\":\"string\"},{\"name\":\"web_auth_token\",\"type\":\"string\"}],\"type\":\"auth.Authorization\"},{\"id\":-279966037,\"method\":\"account.reorderUsernames\",\"params\":[{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1490465654,\"method\":\"account.toggleUsername\",\"params\":[{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"active\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":-1268978403,\"method\":\"channels.reorderUsernames\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Bool\"},{\"id\":1358053637,\"method\":\"channels.toggleUsername\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"username\",\"type\":\"string\"},{\"name\":\"active\",\"type\":\"Bool\"}],\"type\":\"Bool\"},{\"id\":170155475,\"method\":\"channels.deactivateAllUsernames\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"}],\"type\":\"Bool\"},{\"id\":-1540781271,\"method\":\"channels.toggleForum\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-200539612,\"method\":\"channels.createForumTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"title\",\"type\":\"string\"},{\"name\":\"icon_color\",\"type\":\"flags.0?int\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.3?long\"},{\"name\":\"random_id\",\"type\":\"long\"},{\"name\":\"send_as\",\"type\":\"flags.2?InputPeer\"}],\"type\":\"Updates\"},{\"id\":233136337,\"method\":\"channels.getForumTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"q\",\"type\":\"flags.0?string\"},{\"name\":\"offset_date\",\"type\":\"int\"},{\"name\":\"offset_id\",\"type\":\"int\"},{\"name\":\"offset_topic\",\"type\":\"int\"},{\"name\":\"limit\",\"type\":\"int\"}],\"type\":\"messages.ForumTopics\"},{\"id\":-1333584199,\"method\":\"channels.getForumTopicsByID\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"topics\",\"type\":\"Vector\"}],\"type\":\"messages.ForumTopics\"},{\"id\":-186670715,\"method\":\"channels.editForumTopic\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"topic_id\",\"type\":\"int\"},{\"name\":\"title\",\"type\":\"flags.0?string\"},{\"name\":\"icon_emoji_id\",\"type\":\"flags.1?long\"},{\"name\":\"closed\",\"type\":\"flags.2?Bool\"},{\"name\":\"hidden\",\"type\":\"flags.3?Bool\"}],\"type\":\"Updates\"},{\"id\":1814925350,\"method\":\"channels.updatePinnedForumTopic\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"topic_id\",\"type\":\"int\"},{\"name\":\"pinned\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":876830509,\"method\":\"channels.deleteTopicHistory\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"top_msg_id\",\"type\":\"int\"}],\"type\":\"messages.AffectedHistory\"},{\"id\":693150095,\"method\":\"channels.reorderPinnedForumTopics\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"force\",\"type\":\"flags.0?true\"},{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"order\",\"type\":\"Vector\"}],\"type\":\"Updates\"},{\"id\":1760814315,\"method\":\"channels.toggleAntiSpam\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"},{\"id\":-1471109485,\"method\":\"channels.reportAntiSpamFalsePositive\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"msg_id\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":-1632299963,\"method\":\"messages.setDefaultHistoryTTL\",\"params\":[{\"name\":\"period\",\"type\":\"int\"}],\"type\":\"Bool\"},{\"id\":1703637384,\"method\":\"messages.getDefaultHistoryTTL\",\"params\":[],\"type\":\"DefaultHistoryTTL\"},{\"id\":-127582169,\"method\":\"contacts.exportContactToken\",\"params\":[],\"type\":\"ExportedContactToken\"},{\"id\":318789512,\"method\":\"contacts.importContactToken\",\"params\":[{\"name\":\"token\",\"type\":\"string\"}],\"type\":\"User\"},{\"id\":-1189444673,\"method\":\"photos.uploadContactProfilePhoto\",\"params\":[{\"name\":\"flags\",\"type\":\"#\"},{\"name\":\"suggest\",\"type\":\"flags.3?true\"},{\"name\":\"save\",\"type\":\"flags.4?true\"},{\"name\":\"user_id\",\"type\":\"InputUser\"},{\"name\":\"file\",\"type\":\"flags.0?InputFile\"},{\"name\":\"video\",\"type\":\"flags.1?InputFile\"},{\"name\":\"video_start_ts\",\"type\":\"flags.2?double\"}],\"type\":\"photos.Photo\"},{\"id\":1785624660,\"method\":\"channels.toggleParticipantsHidden\",\"params\":[{\"name\":\"channel\",\"type\":\"InputChannel\"},{\"name\":\"enabled\",\"type\":\"Bool\"}],\"type\":\"Updates\"}]},\"layer\":151} as {\n MTProto: {\n constructors: MTProtoConstructor[],\n methods: MTProtoMethod[],\n constructorsIndex?: {[id: number]: number}\n },\n API: {\n constructors: MTProtoConstructor[],\n methods: MTProtoMethod[],\n constructorsIndex?: {[id: number]: number}\n },\n layer: number,\n};\n","export default function intToUint(val: number) {\n // return val < 0 ? val + 4294967296 : val; // 0 <= val <= Infinity\n return val >>> 0; // (4294967296 >>> 0) === 0; 0 <= val <= 4294967295\n}\n","import bigInt from 'big-integer';\nimport intToUint from '../number/intToUint';\n\nexport default function ulongFromInts(high: number, low: number) {\n high = intToUint(high), low = intToUint(low);\n return bigInt(high).shiftLeft(32).add(bigInt(low));\n}\n","import bigInt from 'big-integer';\n\nexport const safeBigInt = bigInt(Number.MAX_SAFE_INTEGER);\nexport const ulongBigInt = bigInt(bigInt[2]).pow(64);\nexport const longBigInt = ulongBigInt.divide(bigInt[2]);\n","import bigInt from 'big-integer';\nimport { longBigInt, ulongBigInt } from './bigIntConstants';\n\nexport function bigIntFromBytes(bytes: Uint8Array | number[], base = 256) {\n return bigInt.fromArray(bytes instanceof Uint8Array ? [...bytes] : bytes, base);\n}\n\nexport function bigIntToBytes(bigInt: bigInt.BigInteger) {\n return new Uint8Array(bigInt.toArray(256).value);\n}\n\nexport function bigIntToSigned(bigInt: bigInt.BigInteger) {\n return bigInt.greater(longBigInt) ? bigInt.minus(ulongBigInt) : bigInt;\n}\n\nexport function bigIntToUnsigned(bigInt: bigInt.BigInteger) {\n return bigInt.isNegative() ? ulongBigInt.add(bigInt) : bigInt;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport Schema, {MTProtoConstructor} from './schema';\nimport {JSONValue} from '../../layer';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport isObject from '../../helpers/object/isObject';\nimport gzipUncompress from '../../helpers/gzipUncompress';\nimport bigInt from 'big-integer';\nimport ulongFromInts from '../../helpers/long/ulongFromInts';\nimport {safeBigInt} from '../../helpers/bigInt/bigIntConstants';\nimport {bigIntToSigned, bigIntToUnsigned} from '../../helpers/bigInt/bigIntConversion';\n\nconst boolFalse = +Schema.API.constructors.find((c) => c.predicate === 'boolFalse').id;\nconst boolTrue = +Schema.API.constructors.find((c) => c.predicate === 'boolTrue').id;\nconst vector = +Schema.API.constructors.find((c) => c.predicate === 'vector').id;\nconst gzipPacked = +Schema.MTProto.constructors.find((c) => c.predicate === 'gzip_packed').id;\n\n// * using slice to have a new buffer, otherwise the buffer will be copied to main thread\nconst sliceMethod: 'slice' | 'subarray' = 'slice'; // subarray\n\nclass TLSerialization {\n private maxLength = 2048; // 2Kb\n private offset = 0; // in bytes\n private mtproto = false;\n private debug = false;// Modes.debug;\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n constructor(options: Partial<{startMaxLength: number, mtproto: true}> = {}) {\n this.maxLength = options.startMaxLength || 2048; // 2Kb\n this.mtproto = options.mtproto || false;\n this.createBuffer();\n }\n\n public createBuffer() {\n this.buffer = new ArrayBuffer(this.maxLength);\n this.intView = new Int32Array(this.buffer);\n this.byteView = new Uint8Array(this.buffer);\n }\n\n public getArray() {\n const resultBuffer = new ArrayBuffer(this.offset);\n\n // let perf = performance.now();\n /* const resultUint8: any = new Uint8Array(resultBuffer);\n resultUint8.set(this.byteView.subarray(0, this.offset)); */\n // console.log('perf uint8', performance.now() - perf);\n\n // perf = performance.now();\n const resultInt32 = new Int32Array(resultBuffer);\n resultInt32.set(this.intView.subarray(0, this.offset / 4));\n // console.log('perf int32', performance.now() - perf);\n\n /* if(resultUint8.buffer.byteLength !== resultInt32.buffer.byteLength) {\n console.error(resultUint8, resultInt32);\n } */\n\n return resultInt32;\n }\n\n public getBuffer() {\n return this.getArray().buffer;\n }\n\n public getBytes(typed: true): Uint8Array;\n public getBytes(typed?: false): number[];\n public getBytes(typed: boolean = true): number[] | Uint8Array {\n if(typed) {\n const resultBuffer = new ArrayBuffer(this.offset);\n const resultArray = new Uint8Array(resultBuffer);\n\n resultArray.set(this.byteView.subarray(0, this.offset));\n\n return resultArray;\n }\n\n const bytes: number[] = new Array(this.offset);\n for(let i = 0; i < this.offset; ++i) {\n bytes[i] = this.byteView[i];\n }\n return bytes;\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public checkLength(needBytes: number) {\n if(this.offset + needBytes < this.maxLength) {\n return;\n }\n\n // console.log('Increase buffer start', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32));\n this.maxLength = Math.ceil(Math.max(this.maxLength * 2, this.offset + needBytes + 16) / 4) * 4;\n const previousBuffer = this.buffer;\n // const previousByteView = this.byteView;\n const previousArray = new Int32Array(previousBuffer);\n\n this.createBuffer();\n\n new Int32Array(this.buffer).set(previousArray);\n /* console.log('Increase buffer end', this.offset, needBytes, this.maxLength, this.byteView.slice(0, 32),\n bytesCmp(previousByteView, this.byteView.slice(0, previousByteView.length))); */\n }\n\n public writeInt(i: number, field: string) {\n this.debug && console.log('>>>', i.toString(16), i, field);\n\n const offset = this.offset / 4;\n this.checkLength(4);\n this.intView[offset] = i;\n this.offset += 4;\n\n return offset;\n }\n\n public storeInt(i: number, field?: string) {\n return this.writeInt(i, (field || '') + ':int');\n }\n\n public storeBool(i: boolean, field?: string) {\n if(i) {\n this.writeInt(boolTrue, (field || '') + ':bool');\n } else {\n this.writeInt(boolFalse, (field || '') + ':bool');\n }\n }\n\n public storeLongP(iHigh: number, iLow: number, field?: string) {\n this.writeInt(iLow, (field || '') + ':long[low]');\n this.writeInt(iHigh, (field || '') + ':long[high]');\n }\n\n public storeLong(sLong: Array | string | number, field?: string) {\n if(Array.isArray(sLong)) {\n if(sLong.length === 2) {\n return this.storeLongP(sLong[0], sLong[1], field);\n } else {\n return this.storeIntBytes(sLong, 64, field);\n }\n }\n\n const _bigInt = bigIntToUnsigned(bigInt(sLong as string));\n const {quotient, remainder} = _bigInt.divmod(0x100000000);\n const high = quotient.toJSNumber();\n const low = remainder.toJSNumber();\n\n this.writeInt(low, (field || '') + ':long[low]');\n this.writeInt(high, (field || '') + ':long[high]');\n }\n\n public storeDouble(f: any, field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n\n doubleView[0] = f;\n\n this.writeInt(intView[0], (field || '') + ':double[low]');\n this.writeInt(intView[1], (field || '') + ':double[high]');\n }\n\n public storeString(s: string, field?: string) {\n this.debug && console.log('>>>', s, (field || '') + ':string');\n\n if(s === undefined) {\n s = '';\n }\n const sUTF8 = unescape(encodeURIComponent(s));\n\n this.checkLength(sUTF8.length + 8);\n\n const len = sUTF8.length;\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n for(let i = 0; i < len; ++i) {\n this.byteView[this.offset++] = sUTF8.charCodeAt(i);\n }\n\n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n\n public storeBytes(bytes: ArrayBuffer | Uint8Array | number[], field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n } else if(bytes === undefined) {\n bytes = [];\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as number[]), (field || '') + ':bytes');\n\n // if uint8array was json.stringified, then will be: {'0': 123, '1': 123}\n const len = (bytes as Uint8Array).length;\n this.checkLength(len + 8);\n if(len <= 253) {\n this.byteView[this.offset++] = len;\n } else {\n this.byteView[this.offset++] = 254;\n this.byteView[this.offset++] = len & 0xFF;\n this.byteView[this.offset++] = (len & 0xFF00) >> 8;\n this.byteView[this.offset++] = (len & 0xFF0000) >> 16;\n }\n\n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n\n // Padding\n while(this.offset % 4) {\n this.byteView[this.offset++] = 0;\n }\n }\n\n public storeIntBytes(bytes: ArrayBuffer | Uint8Array | number[], bits: number, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = (bytes as Uint8Array).length;\n if((bits % 32) || (len * 8) !== bits) {\n const error = new Error('Invalid bits: ' + bits + ', ' + len);\n console.error(error, bytes, field);\n throw error;\n }\n\n this.debug && console.log('>>>', bytesToHex(bytes as Uint8Array), (field || '') + ':int' + bits);\n this.checkLength(len);\n\n this.byteView.set(bytes as Uint8Array, this.offset);\n this.offset += len;\n }\n\n public storeRawBytes(bytes: ArrayLike, field?: string) {\n if(bytes instanceof ArrayBuffer) {\n bytes = new Uint8Array(bytes);\n }\n\n const len = bytes.length;\n\n this.debug && console.log('>>>', bytesToHex(bytes), (field || ''));\n this.checkLength(len);\n\n this.byteView.set(bytes, this.offset);\n this.offset += len;\n }\n\n public storeMethod(methodName: string, params: any) {\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const methodData = schema.methods.find((m) => m.method === methodName);\n\n if(!methodData) {\n throw new Error('No method ' + methodName + ' found');\n }\n\n this.storeInt(methodData.id, methodName + '[id]');\n\n const pFlags = params.pFlags || params; // * support pFlags, though am not expecting it to be there\n const flagsOffsets: {[paramName: string]: number} = {};\n // console.log('storeMethod', len, methodData);\n for(const param of methodData.params) {\n let type = param.type;\n\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(params[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags[param.name] : params[param.name] !== undefined) {\n // console.log('storeMethod autocompleting', methodName, param.name, params[param.name], type);\n params[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n // console.log('storeMethod', methodName, fieldBit, params[fieldBit[0]], params, param, condType, !!(params[fieldBit[0]] & (1 << +fieldBit[1])));\n type = condType[1];\n }\n\n // console.log('storeMethod', methodName, param.name, params[param.name], type);\n const result = this.storeObject(params[param.name], type, methodName + '[' + param.name + ']');\n\n if(type === '#') {\n params[param.name] = params[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(const paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = params[paramName];\n }\n\n return methodData.type;\n }\n\n public storeObject(obj: any, type: string, field?: string) {\n // console.log('storeObject', obj, type, field, this.offset, this.getBytes(true).hex);\n switch(type) {\n case '#':\n obj = obj || 0;\n case 'int':\n return this.storeInt(obj, field);\n case 'long':\n return this.storeLong(obj, field);\n case 'int128':\n return this.storeIntBytes(obj, 128, field);\n case 'int256':\n return this.storeIntBytes(obj, 256, field);\n case 'int512':\n return this.storeIntBytes(obj, 512, field);\n case 'string':\n return this.storeString(obj, field);\n case 'bytes':\n return this.storeBytes(obj, field);\n case 'double':\n return this.storeDouble(obj, field);\n case 'Bool':\n return this.storeBool(obj, field);\n case 'true':\n return\n }\n\n if(Array.isArray(obj)) {\n if(type.substr(0, 6) === 'Vector') {\n this.writeInt(vector, field + '[id]');\n } else if(type.substr(0, 6) !== 'vector') {\n throw new Error('Invalid vector type ' + type);\n }\n\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n this.writeInt(obj.length, field + '[count]');\n for(let i = 0; i < obj.length; ++i) {\n this.storeObject(obj[i], itemType, field + '[' + i + ']');\n }\n\n return true;\n } else if(type.substr(0, 6).toLowerCase() === 'vector') {\n throw new Error('Invalid vector object');\n }\n\n if(!isObject(obj)) {\n throw new Error('Invalid object for type ' + type);\n }\n\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n const predicate = obj['_'];\n let isBare = false;\n const constructorData: MTProtoConstructor = schema.constructors.find((c) => c.predicate === predicate);\n\n if(isBare = (type.charAt(0) === '%')) {\n type = type.substr(1);\n }\n\n if(!constructorData) {\n throw new Error('No predicate ' + predicate + ' found');\n }\n\n if(predicate === type) {\n isBare = true;\n }\n\n if(!isBare) {\n this.writeInt(constructorData.id, field + '[' + predicate + '][id]');\n }\n\n const pFlags = obj.pFlags;\n const flagsOffsets: {[paramName: string]: number} = {};\n // console.log('storeObject', len, constructorData);\n for(const param of constructorData.params) {\n let type = param.type;\n\n // console.log('storeObject', param, type);\n if(type.indexOf('?') !== -1) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n // console.log('storeObject fieldBit', fieldBit, obj[fieldBit[0]]);\n\n if(!(obj[fieldBit[0]] & (1 << +fieldBit[1]))) {\n if(condType[1] === 'true' ? pFlags && pFlags[param.name] : obj[param.name] !== undefined) {\n // console.log('storeObject autocompleting', param.name, obj[param.name], type);\n obj[fieldBit[0]] |= 1 << +fieldBit[1];\n } else {\n continue;\n }\n }\n\n type = condType[1];\n }\n // console.log('storeObject', param, type);\n\n const result = this.storeObject(obj[param.name], type, field + '[' + predicate + '][' + param.name + ']');\n\n if(type === '#') {\n obj[param.name] = obj[param.name] || 0;\n flagsOffsets[param.name] = result as number;\n }\n }\n\n for(const paramName in flagsOffsets) {\n this.intView[flagsOffsets[paramName]] = obj[paramName];\n }\n\n return constructorData.type;\n }\n}\n\nclass TLDeserialization {\n private offset = 0; // in bytes\n private override: {[key: string]: (result: any, field: string) => void};\n\n private buffer: ArrayBuffer;\n private intView: Int32Array;\n private byteView: Uint8Array;\n\n // this.debug =\n private mtproto: boolean = false;\n private debug: boolean;\n\n constructor(buffer: ArrayBuffer | Uint8Array, options: Partial<{override: any, mtproto: true, debug: true}> = {}) {\n // buffer = addPadding(buffer, 4, true); // fix 21.01.2020 for wss\n if(buffer instanceof ArrayBuffer) {\n this.buffer = buffer;\n this.intView = new Int32Array(buffer);\n this.byteView = new Uint8Array(this.buffer);\n } else {\n this.buffer = buffer.buffer;\n this.intView = new Int32Array(buffer.buffer);\n this.byteView = buffer;\n }\n\n // console.log(this.intView);\n\n this.override = options.override || {};\n this.mtproto = !!options.mtproto;\n this.debug = options.debug !== undefined ? options.debug : /* Modes.debug */false;\n }\n\n /* public setMtproto(mtproto: boolean) {\n this.mtproto = mtproto;\n } */\n\n private readInt(field: string) {\n // if(this.offset >= this.intView.length * 4) {\n if((this.byteView.length - this.offset) < 4) {\n console.error(this.byteView, this.offset);\n throw new Error('Nothing to fetch: ' + field);\n }\n\n const i = this.intView[this.offset / 4];\n // const i = new Uint32Array(this.byteView.buffer.slice(this.offset, this.offset + 4))[0];\n\n this.debug &&/* || field.includes('[dialog][read_outbox_max_id]') */\n console.log('<<<', i.toString(16), i, field,\n this.byteView.slice(this.offset - 16, this.offset + 16),\n bytesToHex(this.byteView.slice(this.offset - 16, this.offset + 16)));\n\n this.offset += 4;\n\n return i;\n }\n\n public fetchInt(field?: string) {\n return this.readInt((field || '') + ':int');\n }\n\n public fetchDouble(field?: string) {\n const buffer = new ArrayBuffer(8);\n const intView = new Int32Array(buffer);\n const doubleView = new Float64Array(buffer);\n\n intView[0] = this.readInt((field || '') + ':double[low]'),\n intView[1] = this.readInt((field || '') + ':double[high]');\n\n return doubleView[0];\n }\n\n // ! it should've been signed\n public fetchLong(field?: string): FetchLongAs {\n const iLow = this.readInt((field || '') + ':long[low]');\n const iHigh = this.readInt((field || '') + ':long[high]');\n\n let ulong = ulongFromInts(iHigh, iLow);\n if(/* !unsigned && */!this.mtproto) { // make it signed\n ulong = bigIntToSigned(ulong);\n }\n\n if(!this.mtproto) {\n if(safeBigInt.greaterOrEquals(ulong.abs())) {\n // @ts-ignore\n return ulong.toJSNumber();\n }\n }\n\n // @ts-ignore\n return ulong.toString(10);\n }\n\n public fetchBool(field?: string): boolean {\n const i = this.readInt((field || '') + ':bool');\n if(i === boolTrue) {\n return true;\n } else if(i === boolFalse) {\n return false;\n }\n\n this.offset -= 4;\n return this.fetchObject('Object', field);\n }\n\n public fetchString(field?: string): string {\n let len = this.byteView[this.offset++];\n\n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n\n let sUTF8 = '';\n for(let i = 0; i < len; ++i) {\n sUTF8 += String.fromCharCode(this.byteView[this.offset++]);\n }\n\n // Padding\n while(this.offset % 4) {\n ++this.offset;\n }\n\n let s: string;\n try {\n s = decodeURIComponent(escape(sUTF8));\n } catch(e) {\n s = sUTF8;\n }\n\n this.debug && console.log('<<<', s, (field || '') + ':string');\n\n return s;\n }\n\n public fetchBytes(field?: string) {\n let len = this.byteView[this.offset++];\n\n if(len === 254) {\n len = this.byteView[this.offset++] |\n (this.byteView[this.offset++] << 8) |\n (this.byteView[this.offset++] << 16);\n }\n\n const bytes = this.byteView[sliceMethod](this.offset, this.offset + len);\n this.offset += len;\n\n // Padding\n while(this.offset % 4) {\n ++this.offset;\n }\n\n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':bytes');\n\n return bytes;\n }\n\n public fetchIntBytes(bits: number, typed: true, field?: string): Uint8Array;\n public fetchIntBytes(bits: number, typed?: false, field?: string): number[];\n public fetchIntBytes(bits: number, typed: boolean = true, field?: string) {\n if(bits % 32) {\n throw new Error('Invalid bits: ' + bits);\n }\n\n const len = bits / 8;\n if(typed) {\n const result = this.byteView[sliceMethod](this.offset, this.offset + len);\n this.offset += len;\n return result;\n }\n\n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; ++i) {\n bytes[i] = this.byteView[this.offset++];\n }\n\n this.debug && console.log('<<<', bytesToHex(bytes), (field || '') + ':int' + bits);\n\n return bytes;\n }\n\n public fetchRawBytes(len: number | false, typed: true, field: string): Uint8Array;\n public fetchRawBytes(len: number | false, typed: false, field: string): number[];\n public fetchRawBytes(len: number | false, typed: boolean = true, field: string) {\n if(len === false) {\n len = this.readInt((field || '') + '_length');\n if(len > this.byteView.byteLength) {\n throw new Error('Invalid raw bytes length: ' + len + ', buffer len: ' + this.byteView.byteLength);\n }\n }\n\n if(typed) {\n const bytes = new Uint8Array(len);\n bytes.set(this.byteView[sliceMethod](this.offset, this.offset + len));\n this.offset += len;\n return bytes;\n }\n\n const bytes: number[] = new Array(len);\n for(let i = 0; i < len; ++i) {\n bytes[i] = this.byteView[this.offset++];\n }\n\n this.debug && console.log('<<<', bytesToHex(bytes), (field || ''));\n\n return bytes;\n }\n\n private fetchVector(type: string, field?: string) {\n const len = this.readInt(field + '[count]');\n const result: any[] = new Array(len);\n if(len > 0) {\n const itemType = type.substr(7, type.length - 8); // for \"Vector\"\n for(let i = 0; i < len; ++i) {\n result[i] = this.fetchObject(itemType, field + '[' + i + ']');\n }\n }\n\n return result;\n }\n\n public fetchObject(type: string, field?: string): any {\n switch(type) {\n case '#':\n case 'int':\n return this.fetchInt(field);\n case 'long':\n return this.fetchLong(field);\n case 'int128':\n return this.fetchIntBytes(128, true, field);\n case 'int256':\n return this.fetchIntBytes(256, true, field);\n case 'int512':\n return this.fetchIntBytes(512, true, field);\n case 'string':\n return this.fetchString(field);\n case 'bytes':\n return this.fetchBytes(field);\n case 'double':\n return this.fetchDouble(field);\n case 'Bool':\n return this.fetchBool(field);\n case 'true':\n return true;\n }\n\n field = field || type || 'Object';\n\n if(type.charAt(0) === 'v' && type.substr(1, 5) === 'ector') {\n return this.fetchVector(type, field);\n }\n\n const schema = this.mtproto ? Schema.MTProto : Schema.API;\n let constructorData: MTProtoConstructor = null;\n let fallback = false;\n\n if(type.charAt(0) === '%') {\n const checkType = type.substr(1);\n constructorData = schema.constructors.find((c) => c.type === checkType);\n if(!constructorData) {\n throw new Error('Constructor not found for type: ' + type);\n }\n }/* else if(type.charAt(0) >= 97 && type.charAt(0) <= 122) {\n constructorData = schema.constructors.find((c) => c.predicate === type);\n if(!constructorData) {\n throw new Error('Constructor not found for predicate: ' + type);\n }\n } */ else {\n const constructorCmp = this.readInt(field + '[id]');\n\n if(constructorCmp === gzipPacked) { // Gzip packed\n const compressed = this.fetchBytes(field + '[packed_string]');\n const uncompressed = gzipUncompress(compressed) as Uint8Array;\n const newDeserializer = new TLDeserialization(uncompressed); // rpc_result is packed here\n\n return newDeserializer.fetchObject(type, field);\n }\n\n if(constructorCmp === vector) {\n return this.fetchVector(type, field);\n }\n\n let index = schema.constructorsIndex;\n if(!index) {\n schema.constructorsIndex = index = {};\n for(let i = 0, len = schema.constructors.length; i < len; ++i) {\n index[schema.constructors[i].id] = i;\n }\n }\n\n const i = index[constructorCmp];\n if(i !== undefined) {\n constructorData = schema.constructors[i];\n }\n\n if(!constructorData && this.mtproto) {\n const schemaFallback = Schema.API;\n for(let i = 0, len = schemaFallback.constructors.length; i < len; ++i) {\n if(+schemaFallback.constructors[i].id === constructorCmp) {\n constructorData = schemaFallback.constructors[i];\n\n delete this.mtproto;\n fallback = true;\n break;\n }\n }\n }\n\n if(!constructorData) {\n console.error('Constructor not found:', constructorCmp);\n\n let int1: number, int2: number;\n try {\n int1 = this.fetchInt(field);\n int2 = this.fetchInt(field);\n } catch(err) {\n\n }\n\n throw new Error('Constructor not found: ' + constructorCmp + ' ' + int1 + ' ' + int2 + ' ' + field);\n }\n }\n\n const predicate = constructorData.predicate;\n\n const result: any = {'_': predicate};\n const overrideKey = (this.mtproto ? 'mt_' : '') + predicate;\n if(this.override[overrideKey]) {\n this.override[overrideKey](result, field + '[' + predicate + ']');\n } else {\n for(let i = 0, len = constructorData.params.length; i < len; ++i) {\n const param = constructorData.params[i];\n let type = param.type;\n\n if(type === '#' && result.pFlags === undefined) {\n result.pFlags = {};\n }\n\n const isCond = type.indexOf('?') !== -1;\n if(isCond) {\n const condType = type.split('?');\n const fieldBit = condType[0].split('.');\n\n if(!(result[fieldBit[0]] & (1 << +fieldBit[1]))) {\n continue;\n }\n\n type = condType[1];\n }\n\n const value = this.fetchObject(type, field + '[' + predicate + '][' + param.name + ']');\n\n if(isCond && type === 'true') {\n result.pFlags[param.name] = value;\n } else {\n result[param.name] = value;\n }\n }\n }\n\n if(fallback) {\n this.mtproto = true;\n }\n\n if(type === 'JSONValue') {\n return this.formatJSONValue(result);\n }\n\n return result;\n }\n\n private formatJSONValue(jsonValue: JSONValue): any {\n if(!jsonValue._) return jsonValue;\n switch(jsonValue._) {\n case 'jsonNull':\n return null;\n case 'jsonObject': {\n const out: any = {};\n const objectValues = jsonValue.value;\n for(let i = 0, length = objectValues.length; i < length; ++i) {\n const objectValue = objectValues[i];\n out[objectValue.key] = this.formatJSONValue(objectValue.value);\n }\n return out;\n }\n default:\n return jsonValue.value;\n }\n }\n\n public getOffset() {\n return this.offset;\n }\n\n public setOffset(offset: number) {\n this.offset = offset;\n }\n\n /* public fetchEnd() {\n if(this.offset !== this.byteView.length) {\n throw new Error('Fetch end with non-empty buffer');\n }\n\n return true;\n } */\n}\n\nMOUNT_CLASS_TO.TLDeserialization = TLDeserialization;\nMOUNT_CLASS_TO.TLSerialization = TLSerialization;\nexport {TLDeserialization, TLSerialization};\n","// export function gzipUncompress(bytes: ArrayBuffer, toString: true): string;\n\n// @ts-ignore\nimport pako from 'pako/dist/pako_inflate.min.js';\n// import dT from './dT';\n\n// export function gzipUncompress(bytes: ArrayBuffer, toString?: false): Uint8Array;\nexport default function gzipUncompress(bytes: ArrayBuffer, toString?: boolean): string | Uint8Array {\n // console.log(dT(), 'Gzip uncompress start');\n const result = pako.inflate(bytes, toString ? {to: 'string'} : undefined);\n // console.log(dT(), 'Gzip uncompress finish'/* , result */);\n return result;\n}\n","import randomize from '../array/randomize';\nimport bufferConcats from './bufferConcats';\n\nexport default function addPadding(\n bytes: T,\n blockSize: number = 16,\n zeroes?: boolean,\n blockSizeAsTotalLength = false,\n prepend = false\n): T {\n const len = (bytes as ArrayBuffer).byteLength || (bytes as Uint8Array).length;\n const needPadding = blockSizeAsTotalLength ? blockSize - len : blockSize - (len % blockSize);\n if(needPadding > 0 && needPadding < blockSize) {\n // //console.log('addPadding()', len, blockSize, needPadding);\n const padding = new Uint8Array(needPadding);\n if(zeroes) {\n for(let i = 0; i < needPadding; ++i) {\n padding[i] = 0;\n }\n } else {\n randomize(padding);\n }\n\n if(bytes instanceof ArrayBuffer) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)).buffer as T;\n } else if(bytes instanceof Uint8Array) {\n return (prepend ? bufferConcats(padding, bytes) : bufferConcats(bytes, padding)) as T;\n } else {\n // @ts-ignore\n return (prepend ? [...padding].concat(bytes) : bytes.concat([...padding])) as T;\n }\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {TLDeserialization, TLSerialization} from './tl_utils';\nimport CryptoWorker from '../crypto/cryptoMessagePort';\nimport sessionStorage from '../sessionStorage';\nimport Schema from './schema';\nimport {NetworkerFactory} from './networkerFactory';\nimport {logger, LogTypes} from '../logger';\nimport {InvokeApiOptions} from '../../types';\nimport longToBytes from '../../helpers/long/longToBytes';\nimport MTTransport from './transports/transport';\nimport {nextRandomUint, randomLong} from '../../helpers/random';\nimport App from '../../config/app';\nimport DEBUG from '../../config/debug';\nimport Modes from '../../config/modes';\nimport noop from '../../helpers/noop';\n\n \nimport HTTP from './transports/http';\n \n\nimport type TcpObfuscated from './transports/tcpObfuscated';\nimport bigInt from 'big-integer';\nimport {ConnectionStatus} from './connectionStatus';\nimport ctx from '../../environment/ctx';\nimport bufferConcats from '../../helpers/bytes/bufferConcats';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport convertToUint8Array from '../../helpers/bytes/convertToUint8Array';\nimport isObject from '../../helpers/object/isObject';\nimport forEachReverse from '../../helpers/array/forEachReverse';\nimport sortLongsArray from '../../helpers/long/sortLongsArray';\nimport randomize from '../../helpers/array/randomize';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport pause from '../../helpers/schedulers/pause';\nimport {getEnvironment} from '../../environment/utils';\nimport {TimeManager} from './timeManager';\n\n// console.error('networker included!', new Error().stack);\n\nexport type MTMessageOptions = InvokeApiOptions & Partial<{\n noResponse: true, // http_wait\n longPoll: true,\n\n notContentRelated: true, // ACK\n noSchedule: true,\n // withResult: true,\n messageId: MTLong,\n}>;\n\nexport type MTMessage = InvokeApiOptions & MTMessageOptions & {\n msg_id: MTLong,\n seq_no: number,\n body?: Uint8Array | number[],\n isAPI?: boolean,\n // only these four are important\n\n acked?: boolean,\n\n deferred?: CancellablePromise,\n\n container?: boolean,\n inner?: MTLong[],\n\n // below - options\n\n notContentRelated?: true,\n noSchedule?: true,\n\n resultType?: string,\n\n longPoll?: true,\n noResponse?: true, // only with http (http_wait for longPoll)\n};\n\nconst DRAIN_TIMEOUT = 10000;\nconst delays: {\n [k in 'client' | 'file']: {\n disconnectDelayMin: number,\n disconnectDelayMax: number,\n pingInterval: number,\n pingMaxTime: number,\n connectionTimeout: number\n }\n} = {\n client: {\n disconnectDelayMin: 7,\n disconnectDelayMax: 20,\n pingInterval: 2000,\n pingMaxTime: 5,\n connectionTimeout: 5000\n },\n file: {\n disconnectDelayMin: 10,\n disconnectDelayMax: 24,\n pingInterval: 3000,\n pingMaxTime: 7,\n connectionTimeout: 7500\n }\n};\nconst RESEND_OPTIONS: MTMessageOptions = {\n noSchedule: true,\n notContentRelated: true\n};\nlet invokeAfterMsgConstructor: number;\nlet networkerTempId = 0;\n\nexport default class MTPNetworker {\n private authKeyUint8: Uint8Array;\n\n public isFileNetworker: boolean;\n private isFileUpload: boolean;\n private isFileDownload: boolean;\n\n private lastServerMessages: Array = [];\n\n private sentMessages: {\n [msgId: MTLong]: MTMessage\n } = {};\n\n private pendingMessages: {[msgId: MTLong]: number} = {};\n private pendingAcks: Array = [];\n private pendingResendReq: MTLong[] = [];\n // private pendingResendAnsReq: MTLong[] = [];\n public connectionInited: boolean;\n\n private nextReqTimeout: number;\n private nextReq: number = 0;\n\n \n private longPollInterval: number;\n private longPollPending: number;\n private checkConnectionRetryAt: number;\n private checkConnectionTimeout: number;\n private checkConnectionPeriod = 0;\n private sleepAfter: number;\n private offline = false;\n private sendingLongPoll: boolean;\n \n\n private seqNo: number;\n private prevSessionId: Uint8Array;\n private sessionId: Uint8Array;\n private serverSalt: Uint8Array;\n\n private lastResendReq: {\n reqMsgId: MTLong,\n msgIds: MTPNetworker['pendingResendReq']\n };\n // private lastResendAnsReq: MTPNetworker['lastResendReq'];\n\n private name: string;\n private log: ReturnType;\n\n public isOnline = false;\n private status: ConnectionStatus = ConnectionStatus.Closed;\n private lastResponseTime = 0;\n\n private debug = DEBUG /* && false */ || Modes.debug;\n\n public activeRequests = 0;\n\n public onDrain: () => void;\n private onDrainTimeout: number;\n\n public transport: MTTransport;\n\n \n private pingDelayDisconnectDeferred: CancellablePromise;\n private pingPromise: Promise;\n // private pingInterval: number;\n private lastPingTime: number;\n private lastPingStartTime: number;\n private lastPingDelayDisconnectId: string;\n \n // public onConnectionStatusChange: (online: boolean) => void;\n\n // private debugRequests: Array<{before: Uint8Array, after: Uint8Array}> = [];\n\n private delays: typeof delays[keyof typeof delays];\n // private getNewTimeOffset: boolean;\n\n constructor(\n private networkerFactory: NetworkerFactory,\n private timeManager: TimeManager,\n public dcId: number,\n private authKey: Uint8Array,\n private authKeyId: Uint8Array,\n serverSalt: Uint8Array,\n options: InvokeApiOptions = {}\n ) {\n this.authKeyUint8 = convertToUint8Array(this.authKey);\n this.serverSalt = convertToUint8Array(serverSalt);\n\n this.isFileUpload = !!options.fileUpload;\n this.isFileDownload = !!options.fileDownload;\n this.isFileNetworker = this.isFileUpload || this.isFileDownload;\n this.delays = this.isFileNetworker ? delays.file : delays.client;\n\n const suffix = this.isFileUpload ? '-U' : this.isFileDownload ? '-D' : '';\n this.name = 'NET-' + dcId + suffix;\n // this.log = logger(this.name, this.upload && this.dcId === 2 ? LogLevels.debug | LogLevels.warn | LogLevels.log | LogLevels.error : LogLevels.error);\n this.log = logger(this.name + (suffix ? '' : '-C') + '-' + networkerTempId++, LogTypes.Log/* | LogTypes.Debug */ | LogTypes.Error | LogTypes.Warn);\n this.log('constructor'/* , this.authKey, this.authKeyID, this.serverSalt */);\n\n // Test resend after bad_server_salt\n /* if(this.dcId === 2 && this.upload) {\n //timeManager.applyServerTime((Date.now() / 1000 - 86400) | 0);\n this.serverSalt[0] = 0;\n } */\n\n this.updateSession();\n\n // if(!NetworkerFactory.offlineInited) {\n // NetworkerFactory.offlineInited = true;\n // /* rootScope.offline = true\n // rootScope.offlineConnecting = true */\n // }\n }\n\n private updateSession() {\n this.seqNo = 0;\n this.prevSessionId = this.sessionId;\n this.sessionId = randomize(new Uint8Array(8));\n }\n\n /* private clearContainers() {\n for(const messageId in this.sentMessages) {\n const message = this.sentMessages[messageId];\n if(message.container) {\n delete this.sentMessages[messageId];\n }\n }\n } */\n\n private updateSentMessage(sentMessageId: string) {\n const sentMessage = this.sentMessages[sentMessageId];\n if(!sentMessage) {\n return false;\n }\n\n if(sentMessage.container) {\n forEachReverse(sentMessage.inner, (innerSentMessageId, idx) => {\n const innerSentMessage = this.updateSentMessage(innerSentMessageId);\n if(!innerSentMessage) {\n sentMessage.inner.splice(idx, 1);\n } else {\n sentMessage.inner[idx] = innerSentMessage.msg_id;\n }\n });\n }\n\n sentMessage.msg_id = this.timeManager.generateId();\n sentMessage.seq_no = this.generateSeqNo(sentMessage.notContentRelated || sentMessage.container);\n\n if(this.debug) {\n this.log(`updateSentMessage, old=${sentMessageId}, new=${sentMessage.msg_id}`);\n }\n\n this.sentMessages[sentMessage.msg_id] = sentMessage;\n delete this.sentMessages[sentMessageId];\n\n return sentMessage;\n }\n\n private generateSeqNo(notContentRelated?: boolean) {\n let seqNo = this.seqNo * 2;\n\n if(!notContentRelated) {\n seqNo++;\n this.seqNo++;\n }\n\n return seqNo;\n }\n\n public wrapMtpCall(method: string, params: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n\n serializer.storeMethod(method, params);\n\n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n\n if(Modes.debug) {\n this.log('MT call', method, params, messageId, seqNo);\n }\n\n return this.pushMessage(message, options);\n }\n\n public wrapMtpMessage(object: any, options: MTMessageOptions) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeObject(object, 'Object');\n\n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo(options.notContentRelated);\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true)\n };\n\n if(Modes.debug) {\n this.log('MT message', object, messageId, seqNo);\n }\n\n return this.pushMessage(message, options);\n }\n\n public wrapApiCall(method: string, params: any = {}, options: InvokeApiOptions = {}) {\n const serializer = new TLSerialization(options);\n\n if(!this.connectionInited) { // this will call once for each new session\n // /////this.log('Wrap api call !this.connectionInited');\n\n const invokeWithLayer = Schema.API.methods.find((m) => m.method === 'invokeWithLayer');\n if(!invokeWithLayer) throw new Error('no invokeWithLayer!');\n serializer.storeInt(+invokeWithLayer.id, 'invokeWithLayer');\n\n // @ts-ignore\n serializer.storeInt(Schema.layer, 'layer');\n\n const initConnection = Schema.API.methods.find((m) => m.method === 'initConnection');\n if(!initConnection) throw new Error('no initConnection!');\n\n serializer.storeInt(+initConnection.id, 'initConnection');\n serializer.storeInt(0x0, 'flags');\n serializer.storeInt(App.id, 'api_id');\n serializer.storeString(getEnvironment().USER_AGENT || 'Unknown UserAgent', 'device_model');\n serializer.storeString(navigator.platform || 'Unknown Platform', 'system_version');\n serializer.storeString(App.version + (App.isMainDomain ? ' ' + App.suffix : ''), 'app_version');\n serializer.storeString(navigator.language || 'en', 'system_lang_code');\n serializer.storeString(App.langPack, 'lang_pack');\n serializer.storeString(this.networkerFactory.language, 'lang_code');\n // serializer.storeInt(0x0, 'proxy');\n /* serializer.storeMethod('initConnection', {\n 'flags': 0,\n 'api_id': App.id,\n 'device_model': navigator.userAgent || 'Unknown UserAgent',\n 'system_version': navigator.platform || 'Unknown Platform',\n 'app_version': App.version,\n 'system_lang_code': navigator.language || 'en',\n 'lang_pack': '',\n 'lang_code': navigator.language || 'en'\n }); */\n }\n\n if(options.afterMessageId) {\n if(invokeAfterMsgConstructor === undefined) {\n const m = Schema.API.methods.find((m) => m.method === 'invokeAfterMsg');\n invokeAfterMsgConstructor = m ? +m.id : 0;\n }\n\n if(invokeAfterMsgConstructor) {\n // if(this.debug) {\n // this.log('invokeApi: store invokeAfterMsg');\n // }\n\n serializer.storeInt(invokeAfterMsgConstructor, 'invokeAfterMsg');\n serializer.storeLong(options.afterMessageId, 'msg_id');\n } else {\n this.log.error('no invokeAfterMsg!');\n }\n }\n\n options.resultType = serializer.storeMethod(method, params);\n\n /* if(method === 'account.updateNotifySettings') {\n this.log('api call body:', serializer.getBytes(true));\n } */\n\n const messageId = this.timeManager.generateId();\n const seqNo = this.generateSeqNo();\n const message = {\n msg_id: messageId,\n seq_no: seqNo,\n body: serializer.getBytes(true),\n isAPI: true\n };\n\n if(Modes.debug/* || true */) {\n this.log('Api call', method, message, params, options);\n } else if(this.debug) {\n this.log('Api call', method, params, options);\n }\n\n return this.pushMessage(message, options);\n }\n\n public changeTransport(transport?: MTTransport) {\n const oldTransport = this.transport;\n if(oldTransport) {\n oldTransport.destroy();\n\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n }\n\n this.connectionInited = false;\n\n \n if(this.longPollInterval !== undefined) {\n clearInterval(this.longPollInterval);\n this.longPollInterval = undefined;\n }\n\n this.clearCheckConnectionTimeout();\n \n }\n\n this.log('change transport', transport, oldTransport);\n\n \n this.clearPingDelayDisconnect();\n\n // if(this.pingInterval !== undefined) {\n // clearInterval(this.pingInterval);\n // this.pingInterval = undefined;\n // }\n\n // this.clearPing();\n \n\n this.transport = transport;\n if(!transport) {\n return;\n }\n\n transport.networker = this;\n\n \n \n if(transport instanceof HTTP) {\n \n this.longPollInterval = ctx.setInterval(this.checkLongPoll, 10000);\n this.checkLongPoll();\n this.checkConnection('changed transport');\n \n }\n \n \n\n \n // * handle outcoming dead socket, server will close the connection\n if((transport as TcpObfuscated).connection) {\n // this.sendPingDelayDisconnect();\n\n if(transport.connected) {\n this.setConnectionStatus(ConnectionStatus.Connected);\n }\n\n // this.pingInterval = ctx.setInterval(this.sendPing, PING_INTERVAL);\n // this.sendPing();\n }\n \n\n this.resend();\n }\n\n public destroy() {\n this.log('destroy');\n }\n\n public forceReconnectTimeout() {\n if((this.transport as TcpObfuscated).reconnect) {\n (this.transport as TcpObfuscated).reconnect();\n } else {\n this.resend();\n }\n }\n\n public forceReconnect() {\n if((this.transport as TcpObfuscated).forceReconnect) {\n (this.transport as TcpObfuscated).forceReconnect();\n } else {\n this.checkConnection('force reconnect');\n }\n }\n\n /* private clearPing() {\n if(this.pingPromise) {\n this.pingPromise = undefined;\n }\n\n this.lastPingTime = undefined;\n }\n\n private sendPing = () => {\n // return;\n\n // if(!(this.transport as TcpObfuscated).connected) {\n // this.clearPing();\n // return;\n // }\n\n if(this.pingPromise) {\n return;\n }\n\n const startTime = Date.now();\n this.log('sendPing: ping', startTime);\n const promise = this.pingPromise = this.wrapMtpCall('ping', {\n ping_id: randomLong()\n }, {\n notContentRelated: true\n }).then(() => {\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.log('sendPing: pong', elapsedTime);\n\n setTimeout(() => {\n if(this.pingPromise !== promise) {\n return;\n }\n\n this.pingPromise = undefined;\n this.sendPing();\n }, Math.max(0, PING_INTERVAL - elapsedTime));\n });\n }; */\n\n private clearPingDelayDisconnect() {\n const deferred = this.pingDelayDisconnectDeferred;\n this.pingDelayDisconnectDeferred = undefined;\n this.lastPingDelayDisconnectId = undefined;\n\n if(deferred) {\n deferred.reject();\n }\n }\n\n private sendPingDelayDisconnect = () => {\n // return;\n\n if(this.pingDelayDisconnectDeferred || !this.transport || !this.transport.connected) return;\n\n /* if(!this.isOnline) {\n if((this.transport as TcpObfuscated).connected) {\n (this.transport as TcpObfuscated).connection.close();\n }\n\n return;\n } */\n\n const deferred = this.pingDelayDisconnectDeferred = deferredPromise();\n const delays = this.delays;\n const pingMaxTime = this.delays.pingMaxTime;\n const lastPingTime = Math.min(this.lastPingTime ?? 0, pingMaxTime);\n const disconnectDelay = Math.round(delays.disconnectDelayMin + lastPingTime / pingMaxTime * (delays.disconnectDelayMax - delays.disconnectDelayMin));\n const timeoutTime = disconnectDelay * 1000;\n const startTime = this.lastPingStartTime = Date.now();\n const pingId = this.lastPingDelayDisconnectId = randomLong();\n const options: MTMessageOptions = {notContentRelated: true};\n this.wrapMtpCall('ping_delay_disconnect', {\n ping_id: pingId,\n disconnect_delay: disconnectDelay\n }, options);\n\n const log = this.log.bindPrefix('sendPingDelayDisconnect');\n this.debug && log.debug(`ping, timeout=${timeoutTime}, lastPingTime=${this.lastPingTime}, msgId=${options.messageId}, pingId=${pingId}`);\n const rejectTimeout = ctx.setTimeout(deferred.reject, timeoutTime);\n\n const onResolved = (reason: string) => {\n clearTimeout(rejectTimeout);\n const elapsedTime = Date.now() - startTime;\n this.lastPingTime = elapsedTime / 1000;\n this.debug && log.debug(`pong, reason='${reason}', time=${lastPingTime}, msgId=${options.messageId}`);\n if(elapsedTime > timeoutTime) {\n throw undefined;\n } else {\n return pause(Math.max(0, this.delays.pingInterval - elapsedTime/* timeoutTime - elapsedTime - PING_INTERVAL */));\n }\n };\n\n const onTimeout = () => {\n clearTimeout(rejectTimeout);\n const transport = this.transport as TcpObfuscated;\n if(this.pingDelayDisconnectDeferred !== deferred || !transport?.connection) {\n return;\n }\n\n log.error('catch, closing connection', this.lastPingTime, options.messageId);\n transport.connection.close();\n };\n\n const onFinally = () => {\n if(this.pingDelayDisconnectDeferred !== deferred) {\n return;\n }\n\n this.pingDelayDisconnectDeferred = undefined;\n this.sendPingDelayDisconnect();\n };\n\n deferred\n .then(onResolved)\n .catch(onTimeout)\n .finally(onFinally);\n };\n\n \n private checkLongPoll = () => {\n const isClean = this.cleanupSent();\n // this.log.error('Check lp', this.longPollPending, this.dcId, isClean, this);\n if((this.longPollPending && Date.now() < this.longPollPending) ||\n this.offline ||\n this.isStopped() ||\n this.isFileNetworker) {\n // this.log('No lp this time');\n return false;\n }\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(isClean && (\n baseDcId !== this.dcId ||\n (this.sleepAfter && Date.now() > this.sleepAfter)\n )) {\n // console.warn(dT(), 'Send long-poll for DC is delayed', this.dcId, this.sleepAfter);\n return;\n }\n\n this.sendLongPoll();\n });\n };\n\n private sendLongPoll() {\n if(this.sendingLongPoll) return;\n this.sendingLongPoll = true;\n const maxWait = 25000;\n\n this.longPollPending = Date.now() + maxWait;\n this.debug && this.log.debug('sendLongPoll', this.longPollPending);\n\n this.wrapMtpCall('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: maxWait\n }, {\n noResponse: true,\n // notContentRelated: true,\n longPoll: true\n }).then(() => {\n this.longPollPending = undefined;\n setTimeout(this.checkLongPoll, 0);\n }, (error: ErrorEvent) => {\n this.log('Long-poll failed', error);\n }).finally(() => {\n this.sendingLongPoll = undefined;\n });\n }\n\n private checkConnection = (event: Event | string) => {\n this.debug && this.log('Check connection', event);\n this.clearCheckConnectionTimeout();\n\n if(!this.transport) {\n this.log.warn('No transport for checkConnection');\n return;\n }\n\n const serializer = new TLSerialization({mtproto: true});\n const pingId = randomLong();\n\n serializer.storeMethod('ping', {\n ping_id: pingId\n });\n\n const pingMessage = {\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n body: serializer.getBytes(true)\n };\n\n if(this.offline) {\n this.setConnectionStatus(ConnectionStatus.Connecting);\n }\n\n this.sendEncryptedRequest(pingMessage).then(() => {\n this.toggleOffline(false);\n }, () => {\n this.debug && this.log('Delay', this.checkConnectionPeriod * 1000);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from failed checkConnection request'), this.checkConnectionPeriod * 1000 | 0);\n this.checkConnectionPeriod = Math.min(60, this.checkConnectionPeriod * 1.5);\n });\n };\n\n private clearCheckConnectionTimeout() {\n if(this.checkConnectionTimeout !== undefined) {\n clearTimeout(this.checkConnectionTimeout);\n this.checkConnectionTimeout = undefined;\n }\n }\n\n private toggleOffline(offline: boolean) {\n if(this.offline !== offline) {\n this.offline = offline;\n\n this.clearCheckConnectionTimeout();\n if(offline) {\n clearTimeout(this.nextReqTimeout);\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n if(this.checkConnectionPeriod < 1.5) {\n this.checkConnectionPeriod = 0;\n }\n\n const delay = this.checkConnectionPeriod * 1000 | 0;\n this.checkConnectionRetryAt = Date.now() + delay;\n this.setConnectionStatus(ConnectionStatus.Closed, this.checkConnectionRetryAt);\n this.checkConnectionTimeout = ctx.setTimeout(() => this.checkConnection('from toggleOfline'), delay);\n this.checkConnectionPeriod = Math.min(30, (1 + this.checkConnectionPeriod) * 1.5);\n\n \n \n \n \n } else {\n this.setConnectionStatus(ConnectionStatus.Connected);\n this.checkLongPoll();\n\n this.scheduleRequest();\n\n \n \n \n \n }\n }\n\n this.setConnectionStatus(offline ? ConnectionStatus.Closed : ConnectionStatus.Connected, offline ? this.checkConnectionRetryAt : undefined);\n }\n\n private handleSentEncryptedRequestHTTP(promise: ReturnType, message: MTMessage, noResponseMsgs: string[]) {\n // let timeout = setTimeout(() => {\n // this.log.error('handleSentEncryptedRequestHTTP timeout', promise, message, noResponseMsgs);\n // }, 5e3);\n\n promise.then((result) => {\n this.toggleOffline(false);\n // this.log('parse for', message);\n return this.parseResponse(result).then((response) => {\n this.debug && this.log.debug('Server response', response);\n\n this.processMessage(response.response, response.messageId, response.sessionId);\n\n this.checkLongPoll();\n this.checkConnectionPeriod = Math.max(1.1, Math.sqrt(this.checkConnectionPeriod));\n\n return true;\n });\n }, (error) => {\n this.log.error('Encrypted request failed', error, message);\n\n this.pushResend(message.msg_id);\n this.toggleOffline(true);\n\n return false;\n }).then((shouldResolve) => {\n // clearTimeout(timeout);\n const sentMessages = this.sentMessages;\n noResponseMsgs.forEach((msgId) => {\n const sentMessage = sentMessages[msgId];\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n delete sentMessages[msgId];\n delete this.pendingMessages[msgId];\n shouldResolve ? deferred.resolve() : deferred.reject();\n }\n });\n });\n }\n \n\n // тут можно сделать таймаут и выводить дисконнект\n private pushMessage(message: {\n msg_id: string,\n seq_no: number,\n body: Uint8Array | number[],\n isAPI?: boolean\n }, options: MTMessageOptions) {\n let promise: CancellablePromise;\n if(!options.notContentRelated || options.noResponse) {\n promise = deferredPromise();\n }\n\n this.sentMessages[message.msg_id] = Object.assign(\n message,\n options,\n promise ? {deferred: promise} : undefined\n );\n\n // this.log.error('Networker pushMessage:', this.sentMessages[message.msg_id]);\n\n this.pendingMessages[message.msg_id] = 0;\n\n if(!options.noSchedule) {\n this.scheduleRequest();\n }\n\n if(isObject(options)) {\n options.messageId = message.msg_id;\n }\n\n return promise;\n }\n\n public attachPromise(promise: Promise, message: MTMessage) {\n const canIncrement = true;\n const timeout = setTimeout(() => {\n if(this.lastResponseTime && (Date.now() - this.lastResponseTime) < this.delays.connectionTimeout) {\n return;\n }\n\n this.log.error('timeout', message);\n if(this.isOnline) {\n this.setConnectionStatus(ConnectionStatus.TimedOut);\n }\n\n /* this.getEncryptedOutput(message).then((bytes) => {\n this.log.error('timeout encrypted', bytes);\n }); */\n }, this.delays.connectionTimeout);\n\n promise.catch(noop).finally(() => {\n clearTimeout(timeout);\n this.setConnectionStatus(ConnectionStatus.Connected);\n\n if(canIncrement) {\n --this.activeRequests;\n this.setDrainTimeout();\n }\n });\n\n if(canIncrement) {\n ++this.activeRequests;\n if(this.onDrainTimeout !== undefined) {\n clearTimeout(this.onDrainTimeout);\n this.onDrainTimeout = undefined;\n }\n }\n }\n\n public setDrainTimeout() {\n if(!this.activeRequests && this.onDrain && this.onDrainTimeout === undefined) {\n this.onDrainTimeout = ctx.setTimeout(() => {\n this.onDrainTimeout = undefined;\n this.log('drain');\n this.onDrain();\n }, DRAIN_TIMEOUT);\n }\n }\n\n public setConnectionStatus(status: ConnectionStatus, retryAt?: number) {\n const isOnline = status === ConnectionStatus.Connected;\n const willChange = this.status !== status;\n this.isOnline = isOnline;\n this.status = status;\n\n if(willChange) {\n if(this.networkerFactory.onConnectionStatusChange) {\n this.networkerFactory.onConnectionStatusChange({\n _: 'networkerStatus',\n status,\n dcId: this.dcId,\n name: this.name,\n isFileNetworker: this.isFileNetworker,\n isFileDownload: this.isFileDownload,\n isFileUpload: this.isFileUpload,\n retryAt\n });\n }\n\n if(this.isOnline) {\n this.scheduleRequest();\n }\n\n if((this.transport as TcpObfuscated)?.connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\n }\n\n // this.getNewTimeOffset = true;\n }\n /* if(this.onConnectionStatusChange) {\n this.onConnectionStatusChange(this.isOnline);\n } */\n }\n\n private pushResend(messageId: string, delay = 100) {\n const value = delay ? Date.now() + delay : 0;\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage.container) {\n for(const innerMsgId of sentMessage.inner) {\n this.pendingMessages[innerMsgId] = value;\n }\n } else {\n this.pendingMessages[messageId] = value;\n }\n\n if(sentMessage.acked) {\n this.log.error('pushResend: acked message?', sentMessage);\n }\n\n if(this.debug) {\n this.log.debug('pushResend:', messageId, sentMessage, this.pendingMessages, delay);\n }\n\n this.scheduleRequest(delay);\n }\n\n // * correct, fully checked\n private async getMsgKey(dataWithPadding: Uint8Array, isOut: boolean) {\n const x = isOut ? 0 : 8;\n const msgKeyLargePlain = bufferConcats(this.authKeyUint8.subarray(88 + x, 88 + x + 32), dataWithPadding);\n\n const msgKeyLarge = await CryptoWorker.invokeCrypto('sha256', msgKeyLargePlain);\n const msgKey = new Uint8Array(msgKeyLarge).subarray(8, 24);\n return msgKey;\n };\n\n // * correct, fully checked\n private getAesKeyIv(msgKey: Uint8Array, isOut: boolean): Promise<[Uint8Array, Uint8Array]> {\n const x = isOut ? 0 : 8;\n const sha2aText = new Uint8Array(52);\n const sha2bText = new Uint8Array(52);\n const promises: Array> = [];\n\n sha2aText.set(msgKey, 0);\n sha2aText.set(this.authKeyUint8.subarray(x, x + 36), 16);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2aText));\n\n sha2bText.set(this.authKeyUint8.subarray(40 + x, 40 + x + 36), 0);\n sha2bText.set(msgKey, 36);\n promises.push(CryptoWorker.invokeCrypto('sha256', sha2bText));\n\n return Promise.all(promises).then((results) => {\n const aesKey = new Uint8Array(32);\n const aesIv = new Uint8Array(32);\n const sha2a = new Uint8Array(results[0]);\n const sha2b = new Uint8Array(results[1]);\n\n aesKey.set(sha2a.subarray(0, 8));\n aesKey.set(sha2b.subarray(8, 24), 8);\n aesKey.set(sha2a.subarray(24, 32), 24);\n\n aesIv.set(sha2b.subarray(0, 8));\n aesIv.set(sha2a.subarray(8, 24), 8);\n aesIv.set(sha2b.subarray(24, 32), 24);\n\n return [aesKey, aesIv];\n });\n }\n\n public isStopped() {\n return this.networkerFactory.akStopped && !this.isFileNetworker;\n }\n\n private performScheduledRequest() {\n if(this.isStopped()) {\n return false;\n }\n\n if(this.pendingAcks.length) {\n const ackMsgIds = this.pendingAcks.slice();\n\n // this.log('acking messages', ackMsgIDs)\n this.wrapMtpMessage({\n _: 'msgs_ack',\n msg_ids: ackMsgIds\n }, {\n notContentRelated: true,\n noSchedule: true\n });\n }\n\n const pendingResendReqLength = this.pendingResendReq.length;\n if(pendingResendReqLength) {\n const options: MTMessageOptions = {...RESEND_OPTIONS};\n const msgIds = this.pendingResendReq.splice(0, pendingResendReqLength);\n this.wrapMtpMessage({\n _: 'msg_resend_req',\n msg_ids: msgIds\n }, options);\n\n this.log('resend: resending requests', options.messageId, msgIds);\n /* this.lastResendReq = {\n reqMsgId: options.messageId,\n msgIds: msgIds\n }; */\n\n // this.pendingResendReq.length = 0;\n }\n\n // if(this.pendingResendAnsReq.length) {\n // const options: MTMessageOptions = {...RESEND_OPTIONS};\n // const msgIds = this.pendingResendAnsReq.slice();\n // this.wrapMtpMessage({\n // _: 'msg_resend_ans_req',\n // msg_ids: msgIds\n // }, options);\n\n // this.log('resend: requesting answers', options.messageId, msgIds);\n // this.lastResendAnsReq = {\n // reqMsgId: options.messageId,\n // msgIds: msgIds\n // };\n\n // // this.pendingResendAnsReq.length = 0;\n // }\n\n let outMessage: MTMessage;\n const messages: typeof outMessage[] = [];\n\n // const currentTime = Date.now();\n let messagesByteLen = 0;\n\n \n let hasApiCall = false;\n let hasHttpWait = false;\n \n\n let lengthOverflow = false;\n\n // * Сюда никогда не попадут контейнеры, так как их не будет в pendingMessages\n const keys = sortLongsArray(Object.keys(this.pendingMessages));\n for(const messageId of keys) {\n // const value = this.pendingMessages[messageId];\n\n // if(!value || value <= currentTime) {\n const message = this.sentMessages[messageId];\n if(message && message.body) {\n /* if(message.fileUpload) {\n this.log('performScheduledRequest message:', message, message.body.length, (message.body as Uint8Array).byteLength, (message.body as Uint8Array).buffer.byteLength);\n } */\n\n const messageByteLength = message.body.length + 32;\n\n if((messagesByteLen + messageByteLength) > 655360) { // 640 Kb\n this.log.warn('lengthOverflow', message, messages);\n lengthOverflow = true;\n\n if(outMessage) { // if it's not a first message\n break;\n }\n }\n\n messages.push(message);\n messagesByteLen += messageByteLength;\n\n \n if(message.isAPI) {\n hasApiCall = true;\n } else if(message.longPoll) {\n hasHttpWait = true;\n }\n \n\n outMessage = message;\n } else {\n // this.log(message, messageId)\n }\n\n delete this.pendingMessages[messageId];\n // }\n }\n\n \n \n if(this.transport instanceof HTTP)\n \n if(hasApiCall && !hasHttpWait) {\n const serializer = new TLSerialization({mtproto: true});\n serializer.storeMethod('http_wait', {\n max_delay: 500,\n wait_after: 150,\n max_wait: 3000\n });\n\n messages.push({\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(),\n body: serializer.getBytes(true)\n });\n }\n \n\n if(!messages.length) {\n // this.log('no scheduled messages')\n return;\n }\n\n \n const noResponseMsgs: Array = messages.filter((message) => message.noResponse).map((message) => message.msg_id);\n \n\n if(messages.length > 1) {\n const container = this.generateContainerMessage(messagesByteLen, messages);\n outMessage = container.messageWithBody;\n\n this.sentMessages[outMessage.msg_id] = container.message;\n } else {\n this.sentMessages[outMessage.msg_id] = outMessage;\n }\n\n this.pendingAcks = [];\n\n const promise = this.sendEncryptedRequest(outMessage);\n\n \n \n if(this.transport instanceof HTTP)\n \n this.handleSentEncryptedRequestHTTP(promise, outMessage, noResponseMsgs);\n \n\n \n \n if(!(this.transport instanceof HTTP))\n \n this.cleanupSent(); // ! WARNING\n \n\n if(lengthOverflow) {\n this.scheduleRequest();\n }\n }\n\n private generateContainerMessage(messagesByteLen: number, messages: MTMessage[]) {\n const container = new TLSerialization({\n mtproto: true,\n startMaxLength: messagesByteLen + 64\n });\n\n container.storeInt(0x73f1f8dc, 'CONTAINER[id]');\n container.storeInt(messages.length, 'CONTAINER[count]');\n\n const innerMessages: string[] = [];\n messages.forEach((message, i) => {\n innerMessages.push(message.msg_id);\n // this.log('Pushing to container:', message.msg_id);\n container.storeLong(message.msg_id, 'CONTAINER[' + i + '][msg_id]');\n container.storeInt(message.seq_no, 'CONTAINER[' + i + '][seq_no]');\n container.storeInt(message.body.length, 'CONTAINER[' + i + '][bytes]');\n container.storeRawBytes(message.body, 'CONTAINER[' + i + '][body]');\n });\n\n const message: MTMessage = {\n msg_id: this.timeManager.generateId(),\n seq_no: this.generateSeqNo(true),\n container: true,\n inner: innerMessages\n };\n\n if(Modes.debug/* || true */) {\n this.log.warn('Container', innerMessages, message.msg_id, message.seq_no);\n }\n\n return {\n message,\n messageWithBody: Object.assign({body: container.getBytes(true)}, message)\n };\n }\n\n private async getEncryptedMessage(dataWithPadding: Uint8Array) {\n const msgKey = await this.getMsgKey(dataWithPadding, true);\n const keyIv = await this.getAesKeyIv(msgKey, true);\n // this.log('after msg key iv')\n\n const encryptedBytes = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithPadding, keyIv[0], keyIv[1]);\n // this.log('Finish encrypt')\n\n return {\n bytes: encryptedBytes,\n msgKey\n };\n }\n\n private getDecryptedMessage(msgKey: Uint8Array, encryptedData: Uint8Array) {\n // this.log('get decrypted start')\n return this.getAesKeyIv(msgKey, false).then((keyIv) => {\n // this.log('after msg key iv')\n return CryptoWorker.invokeCrypto('aes-decrypt', encryptedData, keyIv[0], keyIv[1]);\n });\n }\n\n private getEncryptedOutput(message: MTMessage) {\n /* if(DEBUG) {\n this.log.debug('Send encrypted', message, this.authKeyId);\n } */\n /* if(!this.isOnline) {\n this.log('trying to send message when offline:', Object.assign({}, message));\n //debugger;\n } */\n\n const data = new TLSerialization({\n startMaxLength: message.body.length + 2048\n });\n\n data.storeIntBytes(this.serverSalt, 64, 'salt');\n data.storeIntBytes(this.sessionId, 64, 'session_id');\n\n data.storeLong(message.msg_id, 'message_id');\n data.storeInt(message.seq_no, 'seq_no');\n\n data.storeInt(message.body.length, 'message_data_length');\n data.storeRawBytes(message.body, 'message_data');\n\n /* const des = new TLDeserialization(data.getBuffer().slice(16));\n const desSalt = des.fetchLong();\n const desSessionId = des.fetchLong();\n\n if(!this.isOnline) {\n this.log.error('trying to send message when offline', message, new Uint8Array(des.buffer), desSalt, desSessionId);\n } */\n\n /* const messageDataLength = message.body.length;\n let canBeLength = 0; // bytes\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 8;\n canBeLength += 4;\n canBeLength += 4;\n canBeLength += message.body.length; */\n\n const dataBuffer = data.getBuffer();\n\n /* if(dataBuffer.byteLength !== canBeLength || !bytesCmp(new Uint8Array(dataBuffer.slice(dataBuffer.byteLength - message.body.length)), new Uint8Array(message.body))) {\n this.log.error('wrong length', dataBuffer, canBeLength, message.msg_id);\n } */\n\n const paddingLength = (16 - (data.getOffset() % 16)) + 16 * (1 + nextRandomUint(8) % 5);\n const padding = /* (message as any).padding || */randomize(new Uint8Array(paddingLength))/* .fill(0) */;\n /* const padding = [167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157,\n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150,\n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28, 167, 148, 207, 226, 86, 192, 193, 57, 124, 153, 174, 145, 159, 1, 5, 70, 127, 157,\n 51, 241, 46, 85, 141, 212, 139, 234, 213, 164, 197, 116, 245, 70, 184, 40, 40, 201, 233, 211, 150,\n 94, 57, 84, 1, 135, 108, 253, 34, 139, 222, 208, 71, 214, 90, 67, 36, 28].slice(0, paddingLength); */\n\n // (message as any).padding = padding;\n\n const dataWithPadding = bufferConcats(dataBuffer, padding);\n // this.log('Adding padding', dataBuffer, padding, dataWithPadding)\n // this.log('auth_key_id', bytesToHex(self.authKeyID))\n\n /* if(dataWithPadding.byteLength % 16) {\n this.log.error('aaa', dataWithPadding, paddingLength);\n }\n\n if(message.fileUpload) {\n this.log('Send encrypted: body length:', (message.body as ArrayBuffer).byteLength, paddingLength, dataWithPadding);\n } */\n\n // * full next block is correct\n return this.getEncryptedMessage(dataWithPadding).then((encryptedResult) => {\n /* if(DEBUG) {\n this.log('Got encrypted out message', encryptedResult);\n } */\n\n const request = new TLSerialization({\n startMaxLength: encryptedResult.bytes.length + 256\n });\n request.storeIntBytes(this.authKeyId, 64, 'auth_key_id');\n request.storeIntBytes(encryptedResult.msgKey, 128, 'msg_key');\n request.storeRawBytes(encryptedResult.bytes, 'encrypted_data');\n\n const requestData = request.getBytes(true);\n\n // if(this.isFileNetworker) {\n // //this.log('Send encrypted: requestData length:', requestData.length, requestData.length % 16, paddingLength % 16, paddingLength, data.offset, encryptedResult.msgKey.length % 16, encryptedResult.bytes.length % 16);\n // //this.log('Send encrypted: messageId:', message.msg_id, requestData.length);\n // //this.log('Send encrypted:', message, new Uint8Array(bufferConcat(des.buffer, padding)), requestData, this.serverSalt.hex, this.sessionId.hex/* new Uint8Array(des.buffer) */);\n // this.debugRequests.push({before: new Uint8Array(bufferConcat(des.buffer, padding)), after: requestData});\n // }\n\n return requestData;\n });\n }\n\n private async sendEncryptedRequest(message: MTMessage) {\n const requestData = await this.getEncryptedOutput(message);\n\n if(!this.transport) {\n this.log.error('trying to send something when offline', this.transport, this);\n }\n\n this.debug && this.log.debug('sending:', message, [message.msg_id].concat(message.inner || []), requestData.length);\n const promise: Promise = this.transport ? this.transport.send(requestData) as any : Promise.reject({});\n // this.debug && this.log.debug('sendEncryptedRequest: launched message into space:', message, promise);\n\n \n \n \n\n \n if(!(this.transport instanceof HTTP)) return promise;\n \n\n const baseError: ApiError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE',\n // @ts-ignore\n transport: this.transport\n };\n\n return promise.then((result) => {\n if(!result?.byteLength) {\n throw baseError;\n }\n\n // this.debug && this.log.debug('sendEncryptedRequest: got response for:', message, [message.msg_id].concat(message.inner || []));\n return result;\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n type: 'NETWORK_BAD_REQUEST',\n originalError: error\n });\n }\n\n throw error;\n });\n \n }\n\n public parseResponse(responseBuffer: Uint8Array) {\n // const perf = performance.now();\n /* if(this.debug) {\n this.log.debug('Start parsing response', responseBuffer);\n } */\n\n this.lastResponseTime = Date.now();\n\n const deserializer = new TLDeserialization(responseBuffer);\n\n const authKeyId = deserializer.fetchIntBytes(64, true, 'auth_key_id');\n if(!bytesCmp(authKeyId, this.authKeyId)) {\n throw new Error('[MT] Invalid server auth_key_id: ' + bytesToHex(authKeyId));\n }\n\n const msgKey = deserializer.fetchIntBytes(128, true, 'msg_key');\n const encryptedData = deserializer.fetchRawBytes(responseBuffer.byteLength - deserializer.getOffset(), true, 'encrypted_data');\n\n return this.getDecryptedMessage(msgKey, encryptedData).then((dataWithPadding) => {\n // this.log('after decrypt')\n return this.getMsgKey(dataWithPadding, false).then((calcMsgKey) => {\n if(!bytesCmp(msgKey, calcMsgKey)) {\n this.log.warn('[MT] msg_keys', msgKey, calcMsgKey);\n this.updateSession(); // fix 28.01.2020\n throw new Error('[MT] server msgKey mismatch, updating session');\n }\n // this.log('after msgKey check')\n\n let deserializer = new TLDeserialization(dataWithPadding, {mtproto: true});\n\n /* const salt = */deserializer.fetchIntBytes(64, true, 'salt'); // need\n const sessionId = deserializer.fetchIntBytes(64, true, 'session_id');\n const messageId = deserializer.fetchLong('message_id');\n\n if(!bytesCmp(sessionId, this.sessionId) &&\n (!this.prevSessionId || !bytesCmp(sessionId, this.prevSessionId))) {\n this.log.warn('Sessions', sessionId, this.sessionId, this.prevSessionId, dataWithPadding);\n // this.updateSession();\n // this.sessionID = sessionID;\n throw new Error('[MT] Invalid server session_id: ' + bytesToHex(sessionId));\n }\n\n const seqNo = deserializer.fetchInt('seq_no');\n\n const totalLength = dataWithPadding.byteLength;\n\n const messageBodyLength = deserializer.fetchInt('message_data[length]');\n let offset = deserializer.getOffset();\n\n if((messageBodyLength % 4) ||\n messageBodyLength > totalLength - offset) {\n throw new Error('[MT] Invalid body length: ' + messageBodyLength);\n }\n const messageBody = deserializer.fetchRawBytes(messageBodyLength, true, 'message_data');\n\n offset = deserializer.getOffset();\n const paddingLength = totalLength - offset;\n if(paddingLength < 12 || paddingLength > 1024) {\n throw new Error('[MT] Invalid padding length: ' + paddingLength);\n }\n\n // let buffer = bytesToArrayBuffer(messageBody);\n deserializer = new TLDeserialization(/* buffer */messageBody, {\n mtproto: true,\n override: {\n mt_message: (result: any, field: string) => {\n result.msg_id = deserializer.fetchLong(field + '[msg_id]');\n result.seqno = deserializer.fetchInt(field + '[seqno]');\n result.bytes = deserializer.fetchInt(field + '[bytes]');\n\n const offset = deserializer.getOffset();\n\n // self.log('mt_message!!!!!', result, field);\n\n try {\n result.body = deserializer.fetchObject('Object', field + '[body]');\n } catch(e) {\n this.log.error('parse error', (e as Error).message, (e as Error).stack);\n result.body = {\n _: 'parse_error',\n error: e\n };\n }\n\n if(deserializer.getOffset() !== offset + result.bytes) {\n // console.warn(dT(), 'set offset', this.offset, offset, result.bytes)\n // this.log(result)\n deserializer.setOffset(offset + result.bytes);\n }\n // this.log('override message', result)\n },\n mt_rpc_result: (result: any, field: any) => {\n result.req_msg_id = deserializer.fetchLong(field + '[req_msg_id]');\n\n const sentMessage = this.sentMessages[result.req_msg_id];\n const type = sentMessage && sentMessage.resultType || 'Object';\n\n if(result.req_msg_id && !sentMessage) {\n // console.warn(dT(), 'Result for unknown message', result);\n return;\n }\n\n // deserializer.setMtproto(false);\n result.result = deserializer.fetchObject(type, field + '[result]');\n // deserializer.setMtproto(true);\n // self.log(dT(), 'override rpc_result', sentMessage, type, result);\n }\n }\n });\n\n const response = deserializer.fetchObject('', 'INPUT');\n // this.log.error('Parse response time:', performance.now() - perf);\n return {\n response,\n messageId,\n sessionId,\n seqNo\n };\n });\n });\n }\n\n private applyServerSalt(newServerSalt: string) {\n const serverSalt = longToBytes(newServerSalt);\n\n sessionStorage.set({\n ['dc' + this.dcId + '_server_salt']: bytesToHex(serverSalt)\n });\n\n this.serverSalt = new Uint8Array(serverSalt);\n }\n\n // ! таймаут очень сильно тормозит скорость работы сокета (даже нулевой)\n public scheduleRequest(delay?: number) {\n /* if(!this.isOnline) {\n return;\n } */\n\n \n \n if(this.transport instanceof HTTP) {\n \n if(this.offline) {\n this.checkConnection('forced schedule');\n }\n\n delay ||= 0; // set zero timeout to pack other messages too\n \n }\n \n \n\n const nextReq = Date.now() + (delay || 0);\n if(this.nextReq && (delay === undefined || this.nextReq <= nextReq)) {\n // this.debug && this.log('scheduleRequest: nextReq', this.nextReq, nextReq);\n return;\n }\n\n // this.debug && this.log('scheduleRequest: delay', delay);\n\n /* if(this.nextReqTimeout) {\n return;\n } */\n\n // const perf = performance.now();\n if(this.nextReqTimeout) {\n clearTimeout(this.nextReqTimeout);\n }\n\n const cb = () => {\n // this.debug && this.log('scheduleRequest: timeout delay was:', performance.now() - perf);\n\n this.nextReqTimeout = 0;\n this.nextReq = 0;\n\n \n \n if(this.transport instanceof HTTP)\n \n if(this.offline) {\n // this.log('Cancel scheduled');\n return;\n }\n \n\n this.performScheduledRequest();\n };\n\n this.nextReq = nextReq;\n\n if(delay !== undefined) {\n this.nextReqTimeout = ctx.setTimeout(cb, delay);\n } else {\n cb();\n }\n }\n\n private ackMessage(msgId: MTLong) {\n // this.log('ack message', msgID)\n this.pendingAcks.push(msgId);\n\n let delay: number;\n\n \n \n if(this.transport instanceof HTTP)\n \n delay = 30000;\n \n\n this.scheduleRequest(delay);\n }\n\n private reqResend(msgId: MTLong/* , isAnswer?: boolean */) {\n if(this.debug) {\n this.log.debug('Req resend', msgId/* , isAnswer */);\n }\n\n // (isAnswer ? this.pendingResendAnsReq : this.pendingResendReq).push(msgId);\n this.pendingResendReq.push(msgId);\n this.scheduleRequest(100);\n }\n\n public cleanupSent() {\n let notEmpty = false;\n const sentMessages = this.sentMessages;\n // this.log('clean start', this.dcId/*, sentMessages*/)\n Object.keys(sentMessages).forEach((msgId) => {\n const message = sentMessages[msgId];\n\n // this.log('clean iter', msgID, message)\n if(message.notContentRelated && this.pendingMessages[msgId] === undefined) {\n // this.log('clean notContentRelated', msgID)\n delete sentMessages[msgId];\n } else if(message.container) {\n for(const innerMsgId of message.inner) {\n if(sentMessages[innerMsgId] !== undefined) {\n // this.log('clean failed, found', msgID, message.inner[i], sentMessages[message.inner[i]].seq_no)\n notEmpty = true;\n return;\n }\n }\n // this.log('clean container', msgID)\n delete sentMessages[msgId];\n } else {\n notEmpty = true;\n }\n });\n\n return !notEmpty;\n }\n\n private processMessageAck(messageId: Long) {\n const sentMessage = this.sentMessages[messageId];\n if(sentMessage && !sentMessage.acked) {\n // delete sentMessage.body;\n sentMessage.acked = true;\n }\n }\n\n private processError(rawError: {error_message: string, error_code: number}): ApiError {\n const matches = (rawError.error_message || '').match(/^([A-Z_0-9]+\\b)(: (.+))?/) || [];\n rawError.error_code = rawError.error_code;\n\n return {\n code: !rawError.error_code || rawError.error_code <= 0 ? 500 : rawError.error_code,\n type: matches[1] as any || 'UNKNOWN',\n description: matches[3] || ('CODE#' + rawError.error_code + ' ' + rawError.error_message),\n originalError: rawError\n };\n }\n\n /**\n * * только для сокета\n * TODO: consider about containers resend\n */\n public resend() {\n const sentMessages = this.sentMessages;\n for(const id in sentMessages) {\n const msg = sentMessages[id];\n if(msg.body || msg.container) {\n this.pushResend(id);\n }\n }\n\n if((this.transport as TcpObfuscated).connection) {\n this.clearPingDelayDisconnect();\n this.sendPingDelayDisconnect();\n }\n }\n\n /* public requestMessageStatus() {\n const ids: string[] = [];\n for(const id in this.sentMessages) {\n const message = this.sentMessages[id];\n if(message.isAPI && message.fileUpload) {\n ids.push(message.msg_id);\n }\n }\n\n this.wrapMtpMessage({\n _: 'msgs_state_req',\n msg_ids: ids\n }, {\n notContentRelated: true\n }).then((res) => {\n this.log('status', res);\n });\n } */\n\n private applyServerTime(messageId: string) {\n const serverTime = bigInt(messageId).shiftRight(32).toJSNumber();\n this.log('applying server time', serverTime);\n return this.timeManager.applyServerTime(serverTime);\n }\n\n // * https://core.telegram.org/mtproto/service_messages_about_messages#notice-of-ignored-error-message\n public processMessage(message: any, messageId: MTLong, sessionId: Uint8Array | number[]) {\n if(message._ === 'messageEmpty') {\n this.log.warn('processMessage: messageEmpty', message, messageId);\n return;\n }\n\n // messageId = messageId.toString();\n\n const msgidInt = parseInt(messageId.substr(0, -10), 10);\n if(msgidInt % 2) {\n this.log.warn('Server even message id: ', messageId, message);\n return;\n }\n\n if(this.debug) {\n this.log.debug('process message', message, messageId);\n }\n\n if(this.pingDelayDisconnectDeferred) {\n this.pingDelayDisconnectDeferred.resolve('any message');\n }\n\n // let changedTimeOffset: boolean;\n // if(this.getNewTimeOffset) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // this.getNewTimeOffset = undefined;\n // }\n\n switch(message._) {\n case 'msg_container': {\n for(const innerMessage of message.messages) {\n this.processMessage(innerMessage, innerMessage.msg_id, sessionId);\n }\n\n break;\n }\n\n case 'bad_server_salt': {\n this.log('Bad server salt', message);\n\n this.applyServerSalt(message.new_server_salt);\n\n if(this.sentMessages[message.bad_msg_id]) {\n this.pushResend(message.bad_msg_id);\n }\n\n this.ackMessage(messageId);\n\n // simulate disconnect\n /* try {\n this.log('networker state:', this);\n // @ts-ignore\n this.transport.ws.close(1000);\n } catch(err) {\n this.log.error('transport', this.transport, err);\n } */\n\n break;\n }\n\n case 'bad_msg_notification': {\n this.log.error('Bad msg notification', message);\n\n switch(message.error_code) {\n case 16: // * msg_id too low\n case 17: // * msg_id too high\n case 32: // * msg_seqno too low\n case 33: // * msg_seqno too high\n case 64: { // * invalid container\n // if(changedTimeOffset === undefined) {\n // changedTimeOffset = this.applyServerTime(messageId);\n // }\n\n const changedTimeOffset = this.applyServerTime(messageId);\n if(message.error_code === 17 || changedTimeOffset) {\n this.log('Update session');\n this.updateSession();\n }\n\n const badMessage = this.updateSentMessage(message.bad_msg_id);\n if(badMessage) this.pushResend(badMessage.msg_id); // fix 23.01.2020\n // this.ackMessage(messageId);\n }\n\n // * invalid container\n /* case 64: {\n const badMessage = this.sentMessages[message.bad_msg_id];\n if(badMessage) {\n for(const msgId of badMessage.inner) {\n if(this.sentMessages[msgId] !== undefined) {\n this.updateSentMessage\n }\n }\n const inner = badMessage.inner;\n }\n } */\n }\n\n break;\n }\n\n case 'message': {\n if(this.lastServerMessages.indexOf(messageId) !== -1) {\n // console.warn('[MT] Server same messageId: ', messageId)\n this.ackMessage(messageId);\n return;\n }\n\n this.lastServerMessages.push(messageId);\n if(this.lastServerMessages.length > 100) {\n this.lastServerMessages.shift();\n }\n\n this.processMessage(message.body, message.msg_id, sessionId);\n break;\n }\n\n case 'new_session_created': {\n this.ackMessage(messageId);\n\n if(this.debug) {\n this.log.debug('new_session_created', message);\n }\n // this.updateSession();\n\n this.processMessageAck(message.first_msg_id);\n this.applyServerSalt(message.server_salt);\n\n sessionStorage.get('dc').then((baseDcId) => {\n if(baseDcId === this.dcId && !this.isFileNetworker && this.networkerFactory.updatesProcessor) {\n this.networkerFactory.updatesProcessor(message);\n }\n });\n break;\n }\n\n case 'msgs_ack': {\n this.debug && this.log('got acks', message.msg_ids);\n for(const msgId of message.msg_ids) {\n this.processMessageAck(msgId);\n }\n\n break;\n }\n\n case 'msg_detailed_info': {\n const sentMessage = this.sentMessages[message.msg_id];\n if(!sentMessage) {\n this.ackMessage(message.answer_msg_id);\n break;\n }/* else if(sentMessage.acked) {\n this.reqResend(message.answer_msg_id, true);\n }\n\n break; */\n }\n\n case 'msg_new_detailed_info': {\n if(this.pendingAcks.indexOf(message.answer_msg_id) !== -1) {\n break;\n }\n\n this.reqResend(message.answer_msg_id);\n break;\n }\n\n case 'msgs_state_info': {\n this.ackMessage(message.answer_msg_id);\n const arr = [\n [this.lastResendReq, this.pendingResendReq] as const\n // [this.lastResendAnsReq, this.pendingResendAnsReq] as const\n ];\n\n for(const [lastResend, pendingResend] of arr) {\n if(lastResend?.reqMsgId === message.req_msg_id && pendingResend.length) {\n for(const badMsgId of lastResend.msgIds) {\n const pos = pendingResend.indexOf(badMsgId);\n if(pos !== -1) {\n pendingResend.splice(pos, 1);\n }\n }\n }\n }\n\n break;\n }\n\n case 'rpc_result': {\n this.ackMessage(messageId);\n\n const sentMessageId = message.req_msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n if(this.debug) {\n this.log('Rpc response', message.result, sentMessage);\n }\n\n this.processMessageAck(sentMessageId);\n if(sentMessage) {\n const deferred = sentMessage.deferred;\n if(message.result._ === 'rpc_error') {\n const error = this.processError(message.result);\n this.log('Rpc error', error);\n if(deferred) {\n deferred.reject(error);\n }\n } else {\n if(deferred) {\n deferred.resolve(message.result);\n }\n\n if(sentMessage.isAPI && !this.connectionInited) {\n this.connectionInited = true;\n }\n }\n\n delete this.sentMessages[sentMessageId];\n } else {\n if(this.debug) {\n this.log('Rpc result for unknown message:', sentMessageId, message);\n }\n }\n\n break;\n }\n\n case 'pong': { // * https://core.telegram.org/mtproto/service_messages#ping-messages-pingpong - These messages don't require acknowledgments\n /* const sentMessageId = message.msg_id;\n const sentMessage = this.sentMessages[sentMessageId];\n\n if(sentMessage) {\n sentMessage.deferred.resolve(message);\n delete this.sentMessages[sentMessageId];\n } */\n const pingId = message.ping_id;\n if(this.lastPingDelayDisconnectId === pingId) {\n const deferred = this.pingDelayDisconnectDeferred;\n if(deferred) {\n deferred.resolve('pong');\n } else {\n this.log('ping deferred deleted', pingId);\n }\n }\n\n break;\n }\n\n default:\n this.ackMessage(messageId);\n\n /* if(this.debug) {\n this.log.debug('Update', message);\n } */\n\n if(this.networkerFactory.updatesProcessor !== null) {\n this.networkerFactory.updatesProcessor(message);\n }\n break;\n }\n }\n}\n","import bigInt from 'big-integer';\n\nexport default function sortLongsArray(arr: string[]) {\n return arr.map((long) => {\n return bigInt(long);\n }).sort((a, b) => {\n return a.compare(b);\n }).map((bigInt) => {\n return bigInt.toString(10);\n });\n}\n","import addPadding from '../bytes/addPadding';\nimport bigInt from 'big-integer';\nimport {bigIntToBytes} from '../bigInt/bigIntConversion';\n\nexport default function longToBytes(sLong: string) {\n const bigIntBytes = bigIntToBytes(bigInt(sLong)).reverse();\n const bytes = addPadding(bigIntBytes, 8, true, false, false);\n // console.log('longToBytes', bytes, bigIntBytes);\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport type {ConnectionStatusChange} from './connectionStatus';\nimport MTPNetworker from './networker';\nimport {InvokeApiOptions} from '../../types';\nimport App from '../../config/app';\nimport indexOfAndSplice from '../../helpers/array/indexOfAndSplice';\nimport {AppManager} from '../appManagers/manager';\n\nexport class NetworkerFactory extends AppManager {\n private networkers: MTPNetworker[] = [];\n public language = navigator.language || App.langPackCode;\n public updatesProcessor: (obj: any) => void = null;\n // public onConnectionStatusChange: (status: ConnectionStatusChange) => void = null;\n public akStopped = false;\n\n public onConnectionStatusChange(status: ConnectionStatusChange) {\n this.rootScope.dispatchEvent('connection_status_change', status);\n // ({type: 'connectionStatusChange', payload: status});\n }\n\n public removeNetworker(networker: MTPNetworker) {\n indexOfAndSplice(this.networkers, networker);\n }\n\n public setUpdatesProcessor(callback: (obj: any) => void) {\n this.updatesProcessor = callback;\n }\n\n public getNetworker(dcId: number, authKey: Uint8Array, authKeyId: Uint8Array, serverSalt: Uint8Array, options: InvokeApiOptions) {\n // console.log('NetworkerFactory: creating new instance of MTPNetworker:', dcId, options);\n const networker = new MTPNetworker(this, this.timeManager, dcId, authKey, authKeyId, serverSalt, options);\n this.networkers.push(networker);\n return networker;\n }\n\n public startAll() {\n if(this.akStopped) {\n const stoppedNetworkers = this.networkers.filter((networker) => networker.isStopped());\n\n this.akStopped = false;\n this.updatesProcessor && this.updatesProcessor({_: 'new_session_created'});\n\n for(const networker of stoppedNetworkers) {\n networker.scheduleRequest();\n }\n }\n }\n\n public stopAll() {\n this.akStopped = true;\n }\n\n public setLanguage(langCode: string) {\n this.language = langCode;\n for(const networker of this.networkers) {\n if(!networker.isFileNetworker) {\n networker.connectionInited = false;\n }\n }\n }\n\n public unsetConnectionInited() {\n for(const networker of this.networkers) {\n networker.connectionInited = false;\n }\n }\n\n public forceReconnectTimeout() {\n for(const networker of this.networkers) {\n networker.forceReconnectTimeout();\n }\n }\n\n public forceReconnect() {\n for(const networker of this.networkers) {\n if(!networker.isFileNetworker) {\n networker.forceReconnect();\n break;\n }\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {TLSerialization} from './tl_utils';\nimport cryptoWorker from '../crypto/cryptoMessagePort';\nimport Modes from '../../config/modes';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport bigInt from 'big-integer';\n\nexport type RSAPublicKeyHex = {\n modulus: string,\n exponent: string\n};\n\nexport class RSAKeysManager {\n /**\n * Server public key, obtained from here: https://core.telegram.org/api/obtaining_api_id\n *\n *\n * -----BEGIN RSA PUBLIC KEY-----\n * MIIBCgKCAQEA6LszBcC1LGzyr992NzE0ieY+BSaOW622Aa9Bd4ZHLl+TuFQ4lo4g\n * 5nKaMBwK/BIb9xUfg0Q29/2mgIR6Zr9krM7HjuIcCzFvDtr+L0GQjae9H0pRB2OO\n * 62cECs5HKhT5DZ98K33vmWiLowc621dQuwKWSQKjWf50XYFw42h21P2KXUGyp2y/\n * +aEyZ+uVgLLQbRA1dEjSDZ2iGRy12Mk5gpYc397aYp438fsJoHIgJ2lgMv5h7WY9\n * t6N/byY9Nw9p21Og3AoXSL2q/2IJ1WRUhebgAdGVMlV1fkuOQoEzR7EdpqtQD9Cs\n * 5+bfo3Nhmcyvk5ftB0WkJ9z6bNZ7yxrP8wIDAQAB\n * -----END RSA PUBLIC KEY-----\n *\n * -----BEGIN RSA PUBLIC KEY-----\n * MIIBCgKCAQEBadMIUYSKhyznMh+Pg+OxTLyDZrWEjQIPZC3oJCtuZX7qUxgcWqFX\n * Q1952TSY8S8NYuz12sK9Fvp+lil1hIG0U/cuPsK08VB1hB4VA+p0S46fGwVsRovq\n * 4qUiUIzQSjSHDASuXTOinlYEHwmg/GaLc5G7qhePWa0p9YmqYR5Ha3xHJywcXZrn\n * yE3nC9igL96Aanqv+Prbu1N+r9vAgZeHh9cfbtbV8WWwruOANOTEv2ctQLR0dfr9\n * MwQXNePTPQlYsO9HNIGS1LWe7hZFtGBAVJH92F7Kig68WqHM3PIZ6Sq7N0VSzfzL\n * b11Z/YHz2UXYtXADwL/m5pTpKBUtJBXkOQIDAQAB\n * -----END RSA PUBLIC KEY-----\n *\n * Bytes can be got via\n * $ openssl rsa -in rsa.pem -RSAPublicKey_in -pubout > pub.pem\n * $ openssl rsa -pubin -in pub.pem -text -noout\n */\n\n /* private publisKeysHex = [{\n modulus: 'c150023e2f70db7985ded064759cfecf0af328e69a41daf4d6f01b538135a6f91f8f8b2a0ec9ba9720ce352efcf6c5680ffc424bd634864902de0b4bd6d49f4e580230e3ae97d95c8b19442b3c0a10d8f5633fecedd6926a7f6dab0ddb7d457f9ea81b8465fcd6fffeed114011df91c059caedaf97625f6c96ecc74725556934ef781d866b34f011fce4d835a090196e9a5f0e4449af7eb697ddb9076494ca5f81104a305b6dd27665722c46b60e5df680fb16b210607ef217652e60236c255f6a28315f4083a96791d7214bf64c1df4fd0db1944fb26a2a57031b32eee64ad15a8ba68885cde74a5bfc920f6abf59ba5c75506373e7130f9042da922179251f',\n exponent: '010001'\n }, {\n modulus: 'aeec36c8ffc109cb099624685b97815415657bd76d8c9c3e398103d7ad16c9bba6f525ed0412d7ae2c2de2b44e77d72cbf4b7438709a4e646a05c43427c7f184debf72947519680e651500890c6832796dd11f772c25ff8f576755afe055b0a3752c696eb7d8da0d8be1faf38c9bdd97ce0a77d3916230c4032167100edd0f9e7a3a9b602d04367b689536af0d64b613ccba7962939d3b57682beb6dae5b608130b2e52aca78ba023cf6ce806b1dc49c72cf928a7199d22e3d7ac84e47bc9427d0236945d10dbd15177bab413fbf0edfda09f014c7a7da088dde9759702ca760af2b8e4e97cc055c617bd74c3d97008635b98dc4d621b4891da9fb0473047927',\n exponent: '010001'\n }, {\n modulus: 'bdf2c77d81f6afd47bd30f29ac76e55adfe70e487e5e48297e5a9055c9c07d2b93b4ed3994d3eca5098bf18d978d54f8b7c713eb10247607e69af9ef44f38e28f8b439f257a11572945cc0406fe3f37bb92b79112db69eedf2dc71584a661638ea5becb9e23585074b80d57d9f5710dd30d2da940e0ada2f1b878397dc1a72b5ce2531b6f7dd158e09c828d03450ca0ff8a174deacebcaa22dde84ef66ad370f259d18af806638012da0ca4a70baa83d9c158f3552bc9158e69bf332a45809e1c36905a5caa12348dd57941a482131be7b2355a5f4635374f3bd3ddf5ff925bf4809ee27c1e67d9120c5fe08a9de458b1b4a3c5d0a428437f2beca81f4e2d5ff',\n exponent: '010001'\n }, {\n modulus: 'b3f762b739be98f343eb1921cf0148cfa27ff7af02b6471213fed9daa0098976e667750324f1abcea4c31e43b7d11f1579133f2b3d9fe27474e462058884e5e1b123be9cbbc6a443b2925c08520e7325e6f1a6d50e117eb61ea49d2534c8bb4d2ae4153fabe832b9edf4c5755fdd8b19940b81d1d96cf433d19e6a22968a85dc80f0312f596bd2530c1cfb28b5fe019ac9bc25cd9c2a5d8a0f3a1c0c79bcca524d315b5e21b5c26b46babe3d75d06d1cd33329ec782a0f22891ed1db42a1d6c0dea431428bc4d7aabdcf3e0eb6fda4e23eb7733e7727e9a1915580796c55188d2596d2665ad1182ba7abf15aaa5a8b779ea996317a20ae044b820bff35b6e8a1',\n exponent: '010001'\n }, {\n modulus: 'be6a71558ee577ff03023cfa17aab4e6c86383cff8a7ad38edb9fafe6f323f2d5106cbc8cafb83b869cffd1ccf121cd743d509e589e68765c96601e813dc5b9dfc4be415c7a6526132d0035ca33d6d6075d4f535122a1cdfe017041f1088d1419f65c8e5490ee613e16dbf662698c0f54870f0475fa893fc41eb55b08ff1ac211bc045ded31be27d12c96d8d3cfc6a7ae8aa50bf2ee0f30ed507cc2581e3dec56de94f5dc0a7abee0be990b893f2887bd2c6310a1e0a9e3e38bd34fded2541508dc102a9c9b4c95effd9dd2dfe96c29be647d6c69d66ca500843cfaed6e440196f1dbe0e2e22163c61ca48c79116fa77216726749a976a1c4b0944b5121e8c01',\n exponent: '010001'\n }]; */\n\n private testPublicKeysHex: RSAPublicKeyHex[] = [{\n modulus: 'c8c11d635691fac091dd9489aedced2932aa8a0bcefef05fa800892d9b52ed03200865c9e97211cb2ee6c7ae96d3fb0e15aeffd66019b44a08a240cfdd2868a85e1f54d6fa5deaa041f6941ddf302690d61dc476385c2fa655142353cb4e4b59f6e5b6584db76fe8b1370263246c010c93d011014113ebdf987d093f9d37c2be48352d69a1683f8f6e6c2167983c761e3ab169fde5daaa12123fa1beab621e4da5935e9c198f82f35eae583a99386d8110ea6bd1abb0f568759f62694419ea5f69847c43462abef858b4cb5edc84e7b9226cd7bd7e183aa974a712c079dde85b9dc063b8a5c08e8f859c0ee5dcd824c7807f20153361a7f63cfd2a433a1be7f5',\n exponent: '010001'\n }];\n\n private publisKeysHex: RSAPublicKeyHex[] = [{\n // modulus: '00e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\n modulus: 'e8bb3305c0b52c6cf2afdf7637313489e63e05268e5badb601af417786472e5f93b85438968e20e6729a301c0afc121bf7151f834436f7fda680847a66bf64accec78ee21c0b316f0edafe2f41908da7bd1f4a5107638eeb67040ace472a14f90d9f7c2b7def99688ba3073adb5750bb02964902a359fe745d8170e36876d4fd8a5d41b2a76cbff9a13267eb9580b2d06d10357448d20d9da2191cb5d8c93982961cdfdeda629e37f1fb09a0722027696032fe61ed663db7a37f6f263d370f69db53a0dc0a1748bdaaff6209d5645485e6e001d1953255757e4b8e42813347b11da6ab500fd0ace7e6dfa3736199ccaf9397ed0745a427dcfa6cd67bcb1acff3',\n exponent: '010001'\n }];\n\n private publicKeysParsed: {\n [hex: string]: RSAPublicKeyHex\n } = {};\n private prepared = false;\n private preparePromise: Promise = null;\n\n constructor() {\n if(Modes.test) {\n this.publisKeysHex = this.testPublicKeysHex;\n }\n }\n\n public prepare(): Promise {\n if(this.preparePromise) return this.preparePromise;\n else if(this.prepared) {\n return Promise.resolve();\n }\n\n return this.preparePromise = Promise.all(this.publisKeysHex.map((keyParsed) => {\n const RSAPublicKey = new TLSerialization();\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.modulus), 'n');\n RSAPublicKey.storeBytes(bytesFromHex(keyParsed.exponent), 'e');\n\n const buffer = RSAPublicKey.getBuffer();\n\n return cryptoWorker.invokeCrypto('sha1', buffer).then((bytes) => {\n const fingerprintBytes = bytes.slice(-8);\n fingerprintBytes.reverse();\n\n this.publicKeysParsed[bytesToHex(fingerprintBytes).toLowerCase()] = {\n modulus: keyParsed.modulus,\n exponent: keyParsed.exponent\n };\n });\n })).then(() => {\n this.prepared = true;\n\n // console.log('[MT] Prepared keys');\n this.preparePromise = null;\n });\n }\n\n public async select(fingerprints: Array) {\n await this.prepare();\n\n for(let i = 0; i < fingerprints.length; ++i) {\n let fingerprintHex = bigInt(fingerprints[i]).toString(16).toLowerCase();\n\n if(fingerprintHex.length < 16) {\n fingerprintHex = new Array(16 - fingerprintHex.length).fill('0').join('') + fingerprintHex;\n }\n\n // console.log(fingerprintHex, this.publicKeysParsed);\n const foundKey = this.publicKeysParsed[fingerprintHex];\n if(foundKey) {\n return Object.assign({\n fingerprint: fingerprints[i]\n }, foundKey);\n }\n }\n }\n}\n\nexport default new RSAKeysManager();\n","export default function bytesXor(bytes1: Uint8Array, bytes2: Uint8Array) {\n const len = bytes1.length;\n const bytes = new Uint8Array(len);\n\n for(let i = 0; i < len; ++i) {\n bytes[i] = bytes1[i] ^ bytes2[i];\n }\n\n return bytes;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n \nimport transportController from './transports/controller';\n \n\nimport {TLSerialization, TLDeserialization} from './tl_utils';\nimport {TransportType} from './dcConfigurator';\nimport rsaKeysManager from './rsaKeysManager';\n\nimport CryptoWorker from '../crypto/cryptoMessagePort';\n\nimport {logger, LogTypes} from '../logger';\nimport DEBUG from '../../config/debug';\nimport {Awaited, DcId} from '../../types';\nimport addPadding from '../../helpers/bytes/addPadding';\nimport bytesCmp from '../../helpers/bytes/bytesCmp';\nimport bytesFromHex from '../../helpers/bytes/bytesFromHex';\nimport bytesToHex from '../../helpers/bytes/bytesToHex';\nimport bytesXor from '../../helpers/bytes/bytesXor';\nimport {bigIntFromBytes} from '../../helpers/bigInt/bigIntConversion';\nimport bigInt from 'big-integer';\nimport randomize from '../../helpers/array/randomize';\nimport {AppManager} from '../appManagers/manager';\n\n/* let fNewNonce: any = bytesFromHex('8761970c24cb2329b5b2459752c502f3057cb7e8dbab200e526e8767fdc73b3c').reverse();\nlet fNonce: any = bytesFromHex('b597720d11faa5914ef485c529cde414').reverse();\nlet fResult: any = new Uint8Array(bytesFromHex('000000000000000001b473a0661b285e480000006324160514e4cd29c585f44e91a5fa110d7297b5c0c4134c84893db5715ecd56af5ed618082182053cc5de91cd00000015c4b51c02000000a5b7f709355fc30b216be86c022bb4c3'));\n\nfNewNonce = false;\nfNonce = false;\nfResult = false; */\n\ntype AuthOptions = {\n dcId: number,\n nonce: Uint8Array,\n\n serverNonce?: Uint8Array,\n pq?: Uint8Array,\n fingerprints?: string[],\n publicKey?: {\n modulus: string,\n exponent: string,\n fingerprint: string\n },\n\n // good\n p?: Uint8Array,\n q?: Uint8Array,\n\n newNonce?: Uint8Array,\n\n retry?: number,\n\n b?: Uint8Array,\n g?: number,\n gA?: Uint8Array,\n dhPrime?: Uint8Array,\n\n tmpAesKey?: Uint8Array,\n tmpAesIv?: Uint8Array,\n\n authKeyId?: Uint8Array,\n authKey?: Uint8Array,\n serverSalt?: Uint8Array,\n\n localTime?: number,\n serverTime?: any,\n};\n\ntype ResPQ = {\n _: 'resPQ';\n nonce: Uint8Array;\n pq: Uint8Array;\n server_nonce: Uint8Array;\n server_public_key_fingerprints: string[];\n};\n\ntype P_Q_inner_data = {\n _: 'p_q_inner_data_dc';\n pq: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n new_nonce: Uint8Array;\n dc: number;\n};\n\ntype req_DH_params = {\n nonce: Uint8Array;\n server_nonce: Uint8Array;\n p: Uint8Array;\n q: Uint8Array;\n public_key_fingerprint: string;\n encrypted_data: Uint8Array;\n};\n\nexport class Authorizer extends AppManager {\n private cached: {\n [dcId: DcId]: Promise\n };\n\n private log: ReturnType;\n\n private transportType: TransportType;\n\n \n private getTransportTypePromise: Promise;\n \n\n protected after() {\n this.cached = {};\n this.log = logger(`AUTHORIZER`, LogTypes.Error | LogTypes.Log);\n }\n\n private sendPlainRequest(dcId: DcId, requestArray: Uint8Array) {\n const requestLength = requestArray.byteLength;\n\n const header = new TLSerialization();\n header.storeLongP(0, 0, 'auth_key_id');\n header.storeLong(this.timeManager.generateId(), 'msg_id');\n header.storeInt(requestLength, 'request_length');\n\n const headerArray = header.getBytes(true) as Uint8Array;\n const resultArray = new Uint8Array(headerArray.byteLength + requestLength);\n resultArray.set(headerArray);\n resultArray.set(requestArray, headerArray.length);\n\n const transport = this.dcConfigurator.chooseServer(dcId, 'client', this.transportType);\n const baseError = {\n code: 406,\n type: 'NETWORK_BAD_RESPONSE'\n };\n\n if(DEBUG) {\n this.log('mtpSendPlainRequest: creating requestPromise');\n }\n\n const promise = transport.send(resultArray) as any as Promise;\n return promise.then((result) => {\n if(DEBUG) {\n this.log('mtpSendPlainRequest: in good sector', result);\n }\n\n if(!result || !result.byteLength) {\n throw baseError;\n }\n\n try {\n /* result = fResult ? fResult : result;\n fResult = new Uint8Array(0); */\n\n const deserializer = new TLDeserialization(result, {mtproto: true});\n\n if(result.length === 4) {\n const errorCode = deserializer.fetchInt();\n this.log.error('mtpSendPlainRequest: wrong response, error code:', errorCode);\n throw errorCode;\n }\n\n const auth_key_id = deserializer.fetchLong('auth_key_id');\n if(auth_key_id !== '0') this.log.error('auth_key_id !== 0', auth_key_id);\n\n const msg_id = deserializer.fetchLong('msg_id');\n if(msg_id === '0') this.log.error('msg_id === 0', msg_id);\n\n const msg_len = deserializer.fetchInt('msg_len');\n if(!msg_len) this.log.error('no msg_len', msg_len);\n\n return deserializer;\n } catch(e) {\n this.log.error('mtpSendPlainRequest: deserialization went bad', e);\n const error = Object.assign(baseError, {originalError: e});\n throw error;\n }\n }, (error) => {\n if(!error.message && !error.type) {\n error = Object.assign(baseError, {\n originalError: error\n });\n }\n\n throw error;\n });\n }\n\n private async sendReqPQ(auth: AuthOptions) {\n const request = new TLSerialization({mtproto: true});\n\n request.storeMethod('req_pq_multi', {nonce: auth.nonce});\n\n if(DEBUG) {\n this.log('Send req_pq', bytesToHex(auth.nonce));\n }\n\n let deserializer: Awaited>;\n try {\n const promise = this.sendPlainRequest(auth.dcId, request.getBytes(true));\n rsaKeysManager.prepare();\n deserializer = await promise;\n } catch(error) {\n this.log.error('req_pq error', (error as Error).message);\n throw error;\n }\n\n const response: ResPQ = deserializer.fetchObject('ResPQ');\n\n if(response._ !== 'resPQ') {\n throw new Error('[MT] resPQ response invalid: ' + response._);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n this.log.error(auth.nonce, response.nonce);\n throw new Error('[MT] resPQ nonce mismatch');\n }\n\n auth.serverNonce = response.server_nonce; // need\n auth.pq = response.pq;\n auth.fingerprints = response.server_public_key_fingerprints;\n\n if(DEBUG) {\n this.log('Got ResPQ', bytesToHex(auth.serverNonce), bytesToHex(auth.pq), auth.fingerprints);\n }\n\n const publicKey = await rsaKeysManager.select(auth.fingerprints);\n if(!publicKey) {\n throw new Error('[MT] No public key found');\n }\n\n auth.publicKey = publicKey;\n\n if(DEBUG) {\n this.log('PQ factorization start', auth.pq);\n }\n\n // let pAndQ: Awaited>;\n try {\n var pAndQ = await CryptoWorker.invokeCrypto('factorize', auth.pq);\n } catch(error) {\n this.log.error('worker error factorize', error);\n throw error;\n }\n\n auth.p = pAndQ[0];\n auth.q = pAndQ[1];\n\n if(DEBUG) {\n this.log('PQ factorization done', pAndQ);\n }\n\n return this.sendReqDhParams(auth);\n }\n\n private async sendReqDhParams(auth: AuthOptions): Promise {\n auth.newNonce = randomize(new Uint8Array(32));\n\n const p_q_inner_data_dc: P_Q_inner_data = {\n _: 'p_q_inner_data_dc',\n pq: auth.pq,\n p: auth.p,\n q: auth.q,\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n new_nonce: auth.newNonce,\n dc: 0\n };\n\n const pQInnerDataSerialization = new TLSerialization({mtproto: true});\n pQInnerDataSerialization.storeObject(p_q_inner_data_dc, 'P_Q_inner_data', 'DECRYPTED_DATA');\n\n const data = pQInnerDataSerialization.getBytes(true);\n if(data.length > 144) {\n throw 'DH_params: data is more than 144 bytes!';\n }\n\n const dataWithPadding = addPadding(data, 192, false, true, false);\n const dataPadReversed = dataWithPadding.slice().reverse();\n\n const getKeyAesEncrypted = async() => {\n for(;;) {\n const tempKey = randomize(new Uint8Array(32));\n const dataWithHash = dataPadReversed.concat(await CryptoWorker.invokeCrypto('sha256', tempKey.concat(dataWithPadding)));\n if(dataWithHash.length !== 224) {\n throw 'DH_params: dataWithHash !== 224 bytes!';\n }\n\n const aesEncrypted = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, tempKey, new Uint8Array([0]));\n const tempKeyXor = bytesXor(tempKey, await CryptoWorker.invokeCrypto('sha256', aesEncrypted));\n const keyAesEncrypted = tempKeyXor.concat(aesEncrypted);\n\n const keyAesEncryptedBigInt = bigIntFromBytes(keyAesEncrypted);\n const publicKeyModulusBigInt = bigInt(auth.publicKey.modulus, 16);\n\n if(keyAesEncryptedBigInt.compare(publicKeyModulusBigInt) === -1) {\n return keyAesEncrypted;\n }\n }\n };\n\n const keyAesEncrypted = await getKeyAesEncrypted();\n const encryptedData = addPadding(await CryptoWorker.invokeCrypto('rsa-encrypt', keyAesEncrypted, auth.publicKey), 256, true, true, true);\n\n const req_DH_params: req_DH_params = {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n p: auth.p,\n q: auth.q,\n public_key_fingerprint: auth.publicKey.fingerprint,\n encrypted_data: encryptedData\n };\n\n const request = new TLSerialization({mtproto: true});\n request.storeMethod('req_DH_params', req_DH_params);\n\n const requestBytes = request.getBytes(true);\n\n if(DEBUG) {\n this.log('Send req_DH_params', req_DH_params/* , requestBytes.hex */);\n }\n\n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, requestBytes);\n } catch(error) {\n this.log.error('Send req_DH_params FAIL!', error);\n throw error;\n }\n\n const response = deserializer.fetchObject('Server_DH_Params', 'RESPONSE');\n\n if(DEBUG) {\n this.log('Sent req_DH_params, response:', response);\n }\n\n if(response._ !== 'server_DH_params_fail' && response._ !== 'server_DH_params_ok') {\n throw new Error('[MT] Server_DH_Params response invalid: ' + response._);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Server_DH_Params nonce mismatch');\n }\n\n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Server_DH_Params server_nonce mismatch');\n }\n\n if(response._ === 'server_DH_params_fail') {\n const newNonceHash = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce)).slice(-16);\n if(!bytesCmp(newNonceHash, response.new_nonce_hash)) {\n throw new Error('[MT] server_DH_params_fail new_nonce_hash mismatch');\n }\n\n throw new Error('[MT] server_DH_params_fail');\n }\n\n // fill auth object\n try {\n await this.decryptServerDhDataAnswer(auth, response.encrypted_answer);\n } catch(e) {\n this.log.error('mtpDecryptServerDhDataAnswer FAILED!', e);\n throw e;\n }\n\n // console.log(dT(), 'mtpSendReqDhParams: executing mtpSendSetClientDhParams...');\n\n return this.sendSetClientDhParams(auth);\n }\n\n private async decryptServerDhDataAnswer(auth: AuthOptions, encryptedAnswer: any) {\n auth.localTime = Date.now();\n\n // ! can't concat Array with Uint8Array!\n auth.tmpAesKey = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.serverNonce)))\n .concat((await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(0, 12));\n\n auth.tmpAesIv = (await CryptoWorker.invokeCrypto('sha1', auth.serverNonce.concat(auth.newNonce))).slice(12)\n .concat(await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat(auth.newNonce)), auth.newNonce.slice(0, 4));\n\n const answerWithHash = new Uint8Array(await CryptoWorker.invokeCrypto('aes-decrypt', encryptedAnswer, auth.tmpAesKey, auth.tmpAesIv));\n\n const hash = answerWithHash.slice(0, 20);\n const answerWithPadding = answerWithHash.slice(20);\n\n const deserializer = new TLDeserialization(answerWithPadding, {mtproto: true});\n const response = deserializer.fetchObject('Server_DH_inner_data');\n\n if(response._ !== 'server_DH_inner_data') {\n throw new Error('[MT] server_DH_inner_data response invalid: ' + response);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] server_DH_inner_data nonce mismatch');\n }\n\n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] server_DH_inner_data serverNonce mismatch');\n }\n\n if(DEBUG) {\n this.log('Done decrypting answer');\n }\n auth.g = response.g;\n auth.dhPrime = response.dh_prime;\n auth.gA = response.g_a;\n auth.serverTime = response.server_time;\n auth.retry = 0;\n\n this.verifyDhParams(auth.g, auth.dhPrime, auth.gA);\n\n const offset = deserializer.getOffset();\n\n if(!bytesCmp(hash, await CryptoWorker.invokeCrypto('sha1', answerWithPadding.slice(0, offset)))) {\n throw new Error('[MT] server_DH_inner_data SHA1 mismatch');\n }\n\n this.timeManager.applyServerTime(auth.serverTime, auth.localTime);\n }\n\n private verifyDhParams(g: number, dhPrime: Uint8Array, gA: Uint8Array) {\n if(DEBUG) {\n this.log('Verifying DH params', g, dhPrime, gA);\n }\n\n const dhPrimeHex = bytesToHex(dhPrime);\n if(g !== 3 || dhPrimeHex !== 'c71caeb9c6b1c9048e6c522f70f13f73980d40238e3e21c14934d037563d930f48198a0aa7c14058229493d22530f4dbfa336f6e0ac925139543aed44cce7c3720fd51f69458705ac68cd4fe6b6b13abdc9746512969328454f18faf8c595f642477fe96bb2a941d5bcd1d4ac8cc49880708fa9b378e3c4f3a9060bee67cf9a4a4a695811051907e162753b56b0f6b410dba74d8a84b2a14b3144e0ef1284754fd17ed950d5965b4b9dd46582db1178d169c6bc465b0d6ff9ca3928fef5b9ae4e418fc15e83ebea0f87fa9ff5eed70050ded2849f47bf959d956850ce929851f0d8115f635b105ee2e4e15d04b2454bf6f4fadf034b10403119cd8e3b92fcc5b') {\n // The verified value is from https://core.telegram.org/mtproto/security_guidelines\n throw new Error('[MT] DH params are not verified: unknown dhPrime');\n }\n\n if(DEBUG) {\n this.log('dhPrime cmp OK');\n }\n\n const gABigInt = bigIntFromBytes(gA);\n const dhPrimeBigInt = bigInt(dhPrimeHex, 16);\n\n if(gABigInt.compare(bigInt.one) <= 0) {\n throw new Error('[MT] DH params are not verified: gA <= 1');\n }\n\n if(gABigInt.compare(dhPrimeBigInt.subtract(bigInt.one)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA >= dhPrime - 1');\n }\n\n if(DEBUG) {\n this.log('1 < gA < dhPrime-1 OK');\n }\n\n const twoPow = bigInt(2).pow(2048 - 64);\n\n if(gABigInt.compare(twoPow) < 0) {\n throw new Error('[MT] DH params are not verified: gA < 2^{2048-64}');\n }\n if(gABigInt.compare(dhPrimeBigInt.subtract(twoPow)) >= 0) {\n throw new Error('[MT] DH params are not verified: gA > dhPrime - 2^{2048-64}');\n }\n\n if(DEBUG) {\n this.log('2^{2048-64} < gA < dhPrime-2^{2048-64} OK');\n }\n\n return true;\n }\n\n private async sendSetClientDhParams(auth: AuthOptions): Promise {\n const gBytes = bytesFromHex(auth.g.toString(16));\n\n auth.b = randomize(new Uint8Array(256));\n // MTProto.secureRandom.nextBytes(auth.b);\n\n // let gB: Awaited>;\n try {\n var gB = await CryptoWorker.invokeCrypto('mod-pow', gBytes, auth.b, auth.dhPrime);\n } catch(error) {\n throw error;\n }\n\n const data = new TLSerialization({mtproto: true});\n data.storeObject({\n _: 'client_DH_inner_data',\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n retry_id: [0, auth.retry++],\n g_b: gB\n }, 'Client_DH_Inner_Data');\n\n const dataWithHash = (await CryptoWorker.invokeCrypto('sha1', data.getBuffer())).concat(data.getBytes(true));\n const encryptedData = await CryptoWorker.invokeCrypto('aes-encrypt', dataWithHash, auth.tmpAesKey, auth.tmpAesIv);\n\n const request = new TLSerialization({mtproto: true});\n request.storeMethod('set_client_DH_params', {\n nonce: auth.nonce,\n server_nonce: auth.serverNonce,\n encrypted_data: encryptedData\n });\n\n if(DEBUG) {\n this.log('Send set_client_DH_params');\n }\n\n let deserializer: Awaited>;\n try {\n deserializer = await this.sendPlainRequest(auth.dcId, request.getBytes(true));\n } catch(err) {\n throw err;\n }\n\n const response = deserializer.fetchObject('Set_client_DH_params_answer');\n\n if(response._ !== 'dh_gen_ok' && response._ !== 'dh_gen_retry' && response._ !== 'dh_gen_fail') {\n throw new Error('[MT] Set_client_DH_params_answer response invalid: ' + response._);\n }\n\n if(!bytesCmp(auth.nonce, response.nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer nonce mismatch');\n }\n\n if(!bytesCmp(auth.serverNonce, response.server_nonce)) {\n throw new Error('[MT] Set_client_DH_params_answer server_nonce mismatch');\n }\n\n // let authKey: Uint8Array;\n try {\n var authKey = await CryptoWorker.invokeCrypto('mod-pow', auth.gA, auth.b, auth.dhPrime);\n } catch(err) {\n throw authKey;\n }\n\n const authKeyHash = await CryptoWorker.invokeCrypto('sha1', authKey),\n authKeyAux = authKeyHash.slice(0, 8),\n authKeyId = authKeyHash.slice(-8);\n\n if(DEBUG) {\n this.log('Got Set_client_DH_params_answer', response._, authKey);\n }\n switch(response._) {\n case 'dh_gen_ok': {\n const newNonceHash1 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([1], authKeyAux))).slice(-16);\n\n if(!bytesCmp(newNonceHash1, response.new_nonce_hash1)) {\n this.log.error('Set_client_DH_params_answer new_nonce_hash1 mismatch', newNonceHash1, response);\n throw new Error('new_nonce_hash1 mismatch');\n }\n\n const serverSalt = bytesXor(auth.newNonce.slice(0, 8), auth.serverNonce.slice(0, 8));\n if(DEBUG) {\n this.log('Auth successfull!', authKeyId, authKey, serverSalt);\n }\n\n auth.authKeyId = authKeyId;\n auth.authKey = authKey;\n auth.serverSalt = serverSalt;\n\n return auth;\n }\n\n case 'dh_gen_retry': {\n const newNonceHash2 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([2], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash2, response.new_nonce_hash2)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash2 mismatch');\n }\n\n return this.sendSetClientDhParams(auth);\n }\n\n case 'dh_gen_fail': {\n const newNonceHash3 = (await CryptoWorker.invokeCrypto('sha1', auth.newNonce.concat([3], authKeyAux))).slice(-16);\n if(!bytesCmp(newNonceHash3, response.new_nonce_hash3)) {\n throw new Error('[MT] Set_client_DH_params_answer new_nonce_hash3 mismatch');\n }\n\n throw new Error('[MT] Set_client_DH_params_answer fail');\n }\n }\n }\n\n \n private getTransportType() {\n if(this.getTransportTypePromise) return this.getTransportTypePromise;\n return this.getTransportTypePromise = transportController.pingTransports().then(({websocket}) => {\n this.transportType = websocket ? 'websocket' : 'https';\n this.log('will use transport:', this.transportType);\n });\n }\n \n\n public auth(dcId: DcId) {\n let promise = this.cached[dcId];\n if(promise) {\n return promise;\n }\n\n promise = new Promise(async(resolve, reject) => {\n \n await this.getTransportType();\n \n\n let error: ApiError;\n let _try = 1;\n while(_try++ <= 3) {\n try {\n const auth: AuthOptions = {\n dcId,\n nonce: randomize(new Uint8Array(16))\n };\n\n const promise = this.sendReqPQ(auth);\n resolve(await promise);\n return;\n } catch(err) {\n error = err;\n }\n }\n\n reject(error);\n });\n\n return this.cached[dcId] = promise;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport sessionStorage from '../sessionStorage';\nimport {nextRandomUint} from '../../helpers/random';\nimport {WorkerTaskVoidTemplate} from '../../types';\nimport ulongFromInts from '../../helpers/long/ulongFromInts';\nimport {AppManager} from '../appManagers/manager';\n\n/*\nlet lol: any = {};\nfor(var i = 0; i < 100; i++) {\n timeManager.generateId();\n}\n*/\n\nexport interface ApplyServerTimeOffsetTask extends WorkerTaskVoidTemplate {\n type: 'applyServerTimeOffset',\n payload: TimeManager['timeOffset']\n};\n\nexport class TimeManager extends AppManager {\n private lastMessageId: [number, number];\n private timeOffset: number;\n\n /* private midnightNoOffset: number;\n private midnightOffseted: Date;\n\n private midnightOffset: number; */\n\n /* private timeParams: {\n midnightOffset: number,\n serverTimeOffset: number\n }; */\n\n protected after() {\n this.lastMessageId = [0, 0];\n this.timeOffset = 0;\n\n sessionStorage.get('server_time_offset').then((to) => {\n if(to) {\n this.timeOffset = to;\n }\n });\n\n\n // * migrated from ServerTimeManager\n /* const timestampNow = tsNow(true);\n this.midnightNoOffset = timestampNow - (timestampNow % 86400);\n this.midnightOffseted = new Date();\n this.midnightOffseted.setHours(0, 0, 0, 0);\n\n this.midnightOffset = this.midnightNoOffset - (Math.floor(+this.midnightOffseted / 1000)); */\n\n /* this.timeParams = {\n midnightOffset: this.midnightOffset,\n serverTimeOffset: this.serverTimeOffset\n }; */\n }\n\n public getServerTimeOffset() {\n return this.timeOffset;\n }\n\n public generateId(): string {\n const timeTicks = Date.now(),\n timeSec = Math.floor(timeTicks / 1000) + this.timeOffset,\n timeMSec = timeTicks % 1000,\n random = nextRandomUint(16);\n\n let messageId: TimeManager['lastMessageId'] = [timeSec, (timeMSec << 21) | (random << 3) | 4];\n if(this.lastMessageId[0] > messageId[0] ||\n this.lastMessageId[0] === messageId[0] && this.lastMessageId[1] >= messageId[1]) {\n messageId = [this.lastMessageId[0], this.lastMessageId[1] + 4];\n }\n\n this.lastMessageId = messageId;\n\n const ret = ulongFromInts(messageId[0], messageId[1]).toString(10);\n\n // if(lol[ret]) {\n // console.error('[TimeManager]: Generated SAME msg id', messageId, this.timeOffset, ret);\n // }\n // lol[ret] = true;\n\n // console.log('[TimeManager]: Generated msg id', messageId, this.timeOffset, ret);\n\n return ret\n }\n\n public applyServerTime(serverTime: number, localTime?: number) {\n localTime = (localTime || Date.now()) / 1000 | 0;\n const newTimeOffset = serverTime - localTime;\n const changed = Math.abs(this.timeOffset - newTimeOffset) > 10;\n this.lastMessageId = [0, 0];\n\n if(this.timeOffset !== newTimeOffset) {\n sessionStorage.set({\n server_time_offset: newTimeOffset\n });\n\n this.timeOffset = newTimeOffset;\n }\n\n // console.log('[TimeManager]: Apply server time', serverTime, localTime, newTimeOffset, changed);\n\n return changed;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {DocumentAttribute, WebDocument} from '../../layer';\n\nexport default class AppWebDocsManager {\n public saveWebDocument(webDocument: WebDocument) {\n if(!webDocument) {\n return;\n }\n\n const attribute: DocumentAttribute.documentAttributeImageSize = webDocument.attributes.find((attribute) => attribute._ === 'documentAttributeImageSize') as any;\n if(attribute) {\n webDocument.w = attribute.w;\n webDocument.h = attribute.h;\n }\n\n return webDocument;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {InputInvoice, InputPaymentCredentials, PaymentRequestedInfo, PaymentsPaymentForm} from '../../layer';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport default class AppPaymentsManager extends AppManager {\n public getInputInvoiceBySlug(slug: string): InputInvoice.inputInvoiceSlug {\n return {\n _: 'inputInvoiceSlug',\n slug\n };\n }\n\n public getInputInvoiceByPeerId(peerId: PeerId, mid: number): InputInvoice.inputInvoiceMessage {\n return {\n _: 'inputInvoiceMessage',\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n };\n }\n\n public getPaymentForm(invoice: InputInvoice) {\n return this.apiManager.invokeApi('payments.getPaymentForm', {\n invoice\n }).then((paymentForm) => {\n this.appUsersManager.saveApiUsers(paymentForm.users);\n\n return paymentForm;\n });\n }\n\n public getPaymentReceipt(peerId: PeerId, mid: number) {\n return this.apiManager.invokeApi('payments.getPaymentReceipt', {\n peer: this.appPeersManager.getInputPeerById(peerId),\n msg_id: getServerMessageId(mid)\n }).then((paymentForm) => {\n this.appUsersManager.saveApiUsers(paymentForm.users);\n\n return paymentForm;\n });\n }\n\n public validateRequestedInfo(invoice: InputInvoice, info: PaymentRequestedInfo, save?: boolean) {\n return this.apiManager.invokeApi('payments.validateRequestedInfo', {\n save,\n invoice,\n info\n });\n }\n\n public sendPaymentForm(\n invoice: InputInvoice,\n formId: PaymentsPaymentForm['form_id'],\n requestedInfoId: string,\n shippingOptionId: string,\n credentials: InputPaymentCredentials,\n tipAmount?: number\n ) {\n return this.apiManager.invokeApi('payments.sendPaymentForm', {\n form_id: formId,\n invoice,\n requested_info_id: requestedInfoId,\n shipping_option_id: shippingOptionId,\n credentials,\n tip_amount: tipAmount || undefined\n }).then((result) => {\n if(result._ === 'payments.paymentResult') {\n this.apiUpdatesManager.processUpdateMessage(result.updates);\n }\n\n return result;\n });\n }\n\n public clearSavedInfo(info?: boolean, credentials?: boolean) {\n return this.apiManager.invokeApi('payments.clearSavedInfo', {\n info,\n credentials\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MessageSendingParams} from './appMessagesManager';\nimport {AppManager} from './manager';\nimport {AttachMenuBots, AttachMenuBot, Update, DataJSON} from '../../layer';\nimport assumeType from '../../helpers/assumeType';\nimport makeError from '../../helpers/makeError';\nimport getAttachMenuBotIcon from './utils/attachMenuBots/getAttachMenuBotIcon';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport default class AppAttachMenuBotsManager extends AppManager {\n private attachMenuBots: Map;\n private attachMenuBotsArr: AttachMenuBot[];\n\n protected after() {\n this.clear(true);\n\n this.apiUpdatesManager.addMultipleEventsListeners({\n updateAttachMenuBots: this.onUpdateAttachMenuBots\n });\n }\n\n public clear = (init = false) => {\n if(!init) {\n this.attachMenuBots.clear();\n this.attachMenuBotsArr = undefined;\n } else {\n this.attachMenuBots = new Map();\n }\n };\n\n private onUpdateAttachMenuBots = (update: Update.updateAttachMenuBots) => {\n this.clear();\n this.getAttachMenuBots();\n };\n\n public saveAttachMenuBot(attachMenuBot: AttachMenuBot) {\n this.attachMenuBots.set(attachMenuBot.bot_id, attachMenuBot);\n const icon = getAttachMenuBotIcon(attachMenuBot);\n icon.icon = this.appDocsManager.saveDoc(icon.icon, {type: 'attachMenuBotIcon', botId: attachMenuBot.bot_id});\n return attachMenuBot;\n }\n\n public saveAttachMenuBots(attachMenuBots: AttachMenuBot[]) {\n if((attachMenuBots as any).saved) return;\n (attachMenuBots as any).saved = true;\n attachMenuBots.forEach((user) => this.saveAttachMenuBot(user));\n }\n\n public getAttachMenuBots() {\n return this.attachMenuBotsArr ?? this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAttachMenuBots',\n processResult: (attachMenuBots) => {\n assumeType(attachMenuBots);\n this.appUsersManager.saveApiUsers(attachMenuBots.users);\n this.saveAttachMenuBots(attachMenuBots.bots);\n // ! temporary\n return this.attachMenuBotsArr = attachMenuBots.bots.slice(0, 0);\n }\n });\n }\n\n public getAttachMenuBotCached(botId: BotId) {\n return this.attachMenuBots.get(botId);\n }\n\n public getAttachMenuBot(botId: BotId, overwrite?: boolean) {\n if(!this.appUsersManager.isAttachMenuBot(botId) || true) {\n throw makeError('BOT_INVALID');\n }\n\n return (!overwrite && this.getAttachMenuBotCached(botId)) ?? this.apiManager.invokeApiSingleProcess({\n method: 'messages.getAttachMenuBot',\n params: {\n bot: this.appUsersManager.getUserInput(botId)\n },\n processResult: (attachMenuBotsBot) => {\n this.appUsersManager.saveApiUsers(attachMenuBotsBot.users);\n const attachMenuBot = this.saveAttachMenuBot(attachMenuBotsBot.bot);\n return attachMenuBot;\n }\n });\n }\n\n public requestWebView(options: MessageSendingParams & {\n botId: BotId,\n peerId: PeerId,\n // platform: string,\n startParam?: string,\n fromBotMenu?: boolean,\n url?: string,\n themeParams?: DataJSON\n }) {\n const {\n botId,\n peerId,\n url,\n fromBotMenu,\n themeParams,\n // platform,\n replyToMsgId,\n silent,\n sendAsPeerId,\n startParam,\n threadId\n } = options;\n\n const platform = 'web';\n\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.requestWebView',\n params: {\n peer: this.appPeersManager.getInputPeerById(peerId),\n bot: this.appUsersManager.getUserInput(botId),\n silent,\n platform,\n url,\n reply_to_msg_id: replyToMsgId ? getServerMessageId(replyToMsgId) : undefined,\n from_bot_menu: fromBotMenu,\n theme_params: themeParams,\n send_as: sendAsPeerId ? this.appPeersManager.getInputPeerById(sendAsPeerId) : undefined,\n start_param: startParam,\n top_msg_id: threadId ? getServerMessageId(threadId) : undefined\n },\n processResult: (result) => {\n console.log(result);\n return result;\n }\n });\n }\n\n public prolongWebView(options: MessageSendingParams & {\n peerId: PeerId,\n botId: BotId,\n queryId: string | number\n }) {\n return this.apiManager.invokeApiSingleProcess({\n method: 'messages.prolongWebView',\n params: {\n peer: this.appPeersManager.getInputPeerById(options.peerId),\n bot: this.appUsersManager.getUserInput(options.botId),\n query_id: options.queryId,\n silent: options.silent,\n reply_to_msg_id: options.replyToMsgId ? getServerMessageId(options.replyToMsgId) : undefined,\n send_as: options.sendAsPeerId ? this.appPeersManager.getInputPeerById(options.sendAsPeerId) : undefined,\n top_msg_id: options.threadId ? getServerMessageId(options.threadId) : undefined\n },\n processResult: (result) => {\n console.log(result);\n }\n });\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {UrlAuthResult} from '../../layer';\nimport {AppManager} from './manager';\nimport getServerMessageId from './utils/messageId/getServerMessageId';\n\nexport default class AppSeamlessLoginManager extends AppManager {\n public requestUrlAuth(url: string, peerId?: PeerId, mid?: number, buttonId?: number) {\n return this.apiManager.invokeApi('messages.requestUrlAuth', {\n button_id: buttonId,\n msg_id: mid ? getServerMessageId(mid) : undefined,\n peer: peerId ? this.appPeersManager.getInputPeerById(peerId) : undefined,\n url\n }).then((urlAuthResult) => {\n if(urlAuthResult._ === 'urlAuthResultRequest') {\n this.appUsersManager.saveApiUser(urlAuthResult.bot);\n }\n\n return urlAuthResult;\n });\n }\n\n public acceptUrlAuth(url: string, peerId?: PeerId, mid?: number, buttonId?: number, writeAllowed?: boolean) {\n return this.apiManager.invokeApi('messages.acceptUrlAuth', {\n button_id: buttonId,\n msg_id: mid ? getServerMessageId(mid) : undefined,\n peer: peerId ? this.appPeersManager.getInputPeerById(peerId) : undefined,\n url,\n write_allowed: writeAllowed\n }).then((urlAuthResult) => {\n return urlAuthResult as Exclude;\n });\n }\n\n public getWebAuthorizations() {\n return this.apiManager.invokeApi('account.getWebAuthorizations').then((webAuthorizations) => {\n this.appUsersManager.saveApiUsers(webAuthorizations.users);\n return webAuthorizations.authorizations;\n });\n }\n\n public resetWebAuthorization(hash: Long) {\n return this.apiManager.invokeApi('account.resetWebAuthorization', {\n hash\n });\n }\n\n public resetWebAuthorizations() {\n return this.apiManager.invokeApi('account.resetWebAuthorizations');\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport App from '../../config/app';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\nimport callbackify from '../../helpers/callbackify';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport MTProtoMessagePort from '../mtproto/mtprotoMessagePort';\nimport appStateManager from './appStateManager';\nimport {AppStoragesManager} from './appStoragesManager';\nimport createManagers from './createManagers';\n\ntype Managers = Awaited>;\n\nexport class AppManagersManager {\n private managers: Managers | Promise;\n private cryptoWorkersURLs: string[];\n private cryptoPortsAttached: number;\n private cryptoPortPromise: CancellablePromise;\n\n constructor() {\n this.cryptoWorkersURLs = [];\n this.cryptoPortsAttached = 0;\n this.cryptoPortPromise = deferredPromise();\n this.cryptoPortPromise.then(() => {\n this.cryptoPortPromise = undefined;\n });\n }\n\n public start() {\n const port = MTProtoMessagePort.getInstance();\n\n port.addEventListener('manager', ({name, method, args}) => {\n return callbackify(this.getManagers(), (managers) => {\n // @ts-ignore\n const manager = managers[name];\n return manager[method].apply(manager, args);\n });\n });\n\n port.addEventListener('cryptoPort', (payload, source, event) => {\n const port = event.ports[0];\n if(this.cryptoPortsAttached >= this.cryptoWorkersURLs.length) {\n port.close();\n return;\n }\n\n ++this.cryptoPortsAttached;\n cryptoMessagePort.attachPort(port);\n this.cryptoPortPromise?.resolve();\n });\n\n port.addEventListener('createProxyWorkerURLs', ({originalUrl, blob}) => {\n let length = this.cryptoWorkersURLs.length;\n if(!length) {\n this.cryptoWorkersURLs.push(originalUrl);\n ++length;\n }\n\n const maxLength = App.cryptoWorkers;\n if(length === maxLength) {\n return this.cryptoWorkersURLs;\n }\n\n const newURLs = new Array(maxLength - length).fill(undefined).map(() => URL.createObjectURL(blob));\n this.cryptoWorkersURLs.push(...newURLs);\n return this.cryptoWorkersURLs;\n });\n }\n\n public async createManagers() {\n const appStoragesManager = new AppStoragesManager();\n\n await Promise.all([\n // new Promise(() => {}),\n appStoragesManager.loadStorages(),\n this.cryptoPortPromise\n ]);\n\n const managers = await createManagers(appStoragesManager, appStateManager.userId);\n return this.managers = managers;\n }\n\n public getManagers() {\n return this.managers ??= this.createManagers();\n }\n}\n\nconst appManagersManager = new AppManagersManager();\nMOUNT_CLASS_TO && (MOUNT_CLASS_TO.appManagersManager = appManagersManager);\nexport default appManagersManager;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport {PasswordManager} from '../mtproto/passwordManager';\nimport {ReferenceDatabase} from '../mtproto/referenceDatabase';\nimport DialogsStorage from '../storages/dialogs';\nimport FiltersStorage from '../storages/filters';\nimport {ApiUpdatesManager} from './apiUpdatesManager';\nimport {AppAvatarsManager} from './appAvatarsManager';\nimport {AppCallsManager} from './appCallsManager';\nimport {AppChatsManager} from './appChatsManager';\nimport {AppDocsManager} from './appDocsManager';\nimport {AppDraftsManager} from './appDraftsManager';\nimport {AppEmojiManager} from './appEmojiManager';\nimport {AppGroupCallsManager} from './appGroupCallsManager';\nimport {AppInlineBotsManager} from './appInlineBotsManager';\nimport {AppMessagesIdsManager} from './appMessagesIdsManager';\nimport {AppMessagesManager} from './appMessagesManager';\nimport {AppNotificationsManager} from './appNotificationsManager';\nimport {AppPeersManager} from './appPeersManager';\nimport {AppPhotosManager} from './appPhotosManager';\nimport {AppPollsManager} from './appPollsManager';\nimport {AppPrivacyManager} from './appPrivacyManager';\nimport {AppProfileManager} from './appProfileManager';\nimport {AppReactionsManager} from './appReactionsManager';\nimport {AppStickersManager} from './appStickersManager';\nimport {AppUsersManager} from './appUsersManager';\nimport {AppWebPagesManager} from './appWebPagesManager';\nimport {ApiFileManager} from '../mtproto/apiFileManager';\nimport {ApiManager} from '../mtproto/apiManager';\nimport ctx from '../../environment/ctx';\nimport PeersStorage from '../storages/peers';\nimport ThumbsStorage from '../storages/thumbs';\nimport {NetworkerFactory} from '../mtproto/networkerFactory';\nimport {RootScope} from '../rootScope';\nimport {Authorizer} from '../mtproto/authorizer';\nimport {DcConfigurator} from '../mtproto/dcConfigurator';\nimport {TimeManager} from '../mtproto/timeManager';\nimport {AppStoragesManager} from './appStoragesManager';\nimport cryptoMessagePort from '../crypto/cryptoMessagePort';\nimport appStateManager from './appStateManager';\nimport filterUnique from '../../helpers/array/filterUnique';\nimport AppWebDocsManager from './appWebDocsManager';\nimport AppPaymentsManager from './appPaymentsManager';\nimport AppAttachMenuBotsManager from './appAttachMenuBotsManager';\nimport AppSeamlessLoginManager from './appSeamlessLoginManager';\n\nexport default function createManagers(appStoragesManager: AppStoragesManager, userId: UserId) {\n const managers = {\n appPeersManager: new AppPeersManager,\n appChatsManager: new AppChatsManager,\n appDocsManager: new AppDocsManager,\n appPhotosManager: new AppPhotosManager,\n appPollsManager: new AppPollsManager,\n appUsersManager: new AppUsersManager,\n appWebPagesManager: new AppWebPagesManager,\n appDraftsManager: new AppDraftsManager,\n appProfileManager: new AppProfileManager,\n appNotificationsManager: new AppNotificationsManager,\n apiUpdatesManager: new ApiUpdatesManager,\n appAvatarsManager: new AppAvatarsManager,\n appGroupCallsManager: new AppGroupCallsManager,\n appCallsManager: new AppCallsManager,\n appReactionsManager: new AppReactionsManager,\n appMessagesManager: new AppMessagesManager,\n appMessagesIdsManager: new AppMessagesIdsManager,\n appPrivacyManager: new AppPrivacyManager,\n appInlineBotsManager: new AppInlineBotsManager,\n appStickersManager: new AppStickersManager,\n referenceDatabase: new ReferenceDatabase,\n appEmojiManager: new AppEmojiManager,\n filtersStorage: new FiltersStorage,\n dialogsStorage: new DialogsStorage,\n apiManager: new ApiManager,\n cryptoWorker: cryptoMessagePort,\n passwordManager: new PasswordManager,\n apiFileManager: new ApiFileManager,\n peersStorage: new PeersStorage,\n thumbsStorage: new ThumbsStorage,\n networkerFactory: new NetworkerFactory,\n rootScope: new RootScope,\n authorizer: new Authorizer,\n dcConfigurator: new DcConfigurator,\n timeManager: new TimeManager,\n appStoragesManager: appStoragesManager,\n appStateManager: appStateManager,\n appWebDocsManager: new AppWebDocsManager,\n appPaymentsManager: new AppPaymentsManager,\n appAttachMenuBotsManager: new AppAttachMenuBotsManager,\n appSeamlessLoginManager: new AppSeamlessLoginManager\n };\n\n type T = typeof managers;\n\n for(const name in managers) {\n const manager = managers[name as keyof T];\n if(!manager) {\n continue;\n }\n\n if((manager as AppMessagesManager).setManagers) {\n (manager as AppMessagesManager).setManagers(managers as any);\n delete (manager as AppMessagesManager).setManagers;\n }\n\n // @ts-ignore\n ctx[name] = manager;\n }\n\n const promises: Array void) | void> | void>[] = [];\n let names = Object.keys(managers) as (keyof T)[];\n names.unshift('appUsersManager', 'appChatsManager', 'appNotificationsManager', 'appMessagesManager', 'dialogsStorage');\n names = filterUnique(names);\n for(const name of names) {\n const manager = managers[name];\n if((manager as any)?.after) {\n // console.log('injecting after', name);\n const result = (manager as any).after();\n promises.push(result);\n\n // if(result instanceof Promise) {\n // result.then(() => {\n // console.log('injected after', name);\n // });\n // }\n }\n }\n\n if(userId) {\n managers.apiManager.setUserAuth(userId);\n }\n\n return Promise.all(promises).then(() => managers);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// just to include\nimport '../polyfill';\nimport '../../helpers/peerIdPolyfill';\n\nimport cryptoWorker from '../crypto/cryptoMessagePort';\nimport {setEnvironment} from '../../environment/utils';\nimport appStateManager from '../appManagers/appStateManager';\nimport transportController from './transports/controller';\nimport MTProtoMessagePort from './mtprotoMessagePort';\nimport RESET_STORAGES_PROMISE from '../appManagers/utils/storages/resetStoragesPromise';\nimport appManagersManager from '../appManagers/appManagersManager';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport {logger} from '../logger';\nimport {State} from '../../config/state';\nimport toggleStorages from '../../helpers/toggleStorages';\nimport appTabsManager from '../appManagers/appTabsManager';\nimport ServiceMessagePort from '../serviceWorker/serviceMessagePort';\nimport callbackify from '../../helpers/callbackify';\n\nlet _isServiceWorkerOnline = true;\nexport function isServiceWorkerOnline() {\n return _isServiceWorkerOnline;\n}\n\nlet serviceMessagePort: ServiceMessagePort, _serviceMessagePort: MessagePort;\nexport function getServiceMessagePort() {\n return _isServiceWorkerOnline ? serviceMessagePort : undefined;\n}\n\nconst log = logger('MTPROTO');\n// let haveState = false;\n\nconst port = new MTProtoMessagePort();\nport.addMultipleEventsListeners({\n environment: (environment) => {\n setEnvironment(environment);\n\n transportController.waitForWebSocket();\n },\n\n crypto: ({method, args}) => {\n return cryptoWorker.invokeCrypto(method as any, ...args as any);\n },\n\n state: ({state, resetStorages, pushedKeys, newVersion, oldVersion, userId}) => {\n // if(haveState) {\n // return;\n // }\n\n log('got state', state, pushedKeys);\n\n appStateManager.userId = userId;\n appStateManager.newVersion = newVersion;\n appStateManager.oldVersion = oldVersion;\n\n (Object.keys(state) as any as (keyof State)[]).forEach((key) => {\n appStateManager.pushToState(key, state[key], true, !pushedKeys.includes(key));\n });\n\n RESET_STORAGES_PROMISE.resolve(resetStorages);\n // haveState = true;\n },\n\n toggleStorages: ({enabled, clearWrite}) => {\n return toggleStorages(enabled, clearWrite);\n },\n\n event: (payload, source) => {\n log('will redirect event', payload, source);\n port.invokeExceptSource('event', payload, source);\n },\n\n serviceWorkerOnline: (online) => {\n _isServiceWorkerOnline = online;\n },\n\n serviceWorkerPort: (payload, source, event) => {\n if(serviceMessagePort) {\n serviceMessagePort.detachPort(_serviceMessagePort);\n _serviceMessagePort = undefined;\n } else {\n serviceMessagePort = new ServiceMessagePort();\n serviceMessagePort.addMultipleEventsListeners({\n requestFilePart: (payload) => {\n return callbackify(appManagersManager.getManagers(), (managers) => {\n const {docId, dcId, offset, limit} = payload;\n return managers.appDocsManager.requestDocPart(docId, dcId, offset, limit);\n });\n }\n });\n }\n\n // * port can be undefined in the future\n if(_serviceMessagePort = event.ports[0]) {\n serviceMessagePort.attachPort(_serviceMessagePort);\n }\n },\n\n createObjectURL: (blob) => {\n return URL.createObjectURL(blob);\n }\n\n // socketProxy: (task) => {\n // const socketTask = task.payload;\n // const id = socketTask.id;\n\n // const socketProxied = socketsProxied.get(id);\n // if(socketTask.type === 'message') {\n // socketProxied.dispatchEvent('message', socketTask.payload);\n // } else if(socketTask.type === 'open') {\n // socketProxied.dispatchEvent('open');\n // } else if(socketTask.type === 'close') {\n // socketProxied.dispatchEvent('close');\n // socketsProxied.delete(id);\n // }\n // },\n});\n\nlog('MTProto start');\n\nappManagersManager.start();\nappManagersManager.getManagers();\nappTabsManager.start();\n\n// let sentHello = false;\nlistenMessagePort(port, (source) => {\n appTabsManager.addTab(source);\n\n // port.invokeVoid('hello', undefined, source);\n // if(!sentHello) {\n // port.invokeVoid('hello', undefined, source);\n // sentHello = true;\n // }\n}, (source) => {\n appTabsManager.deleteTab(source);\n});\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type SuperMessagePort from '../lib/mtproto/superMessagePort';\nimport ctx from '../environment/ctx';\n\nexport default function listenMessagePort(\n messagePort: SuperMessagePort,\n onConnect?: (source: MessageEventSource) => void,\n onDisconnect?: (source: MessageEventSource) => void\n) {\n const attachPort = (listenPort: any, sendPort: any) => {\n messagePort.attachListenPort(listenPort);\n sendPort && messagePort.attachSendPort(sendPort);\n onConnect?.(listenPort);\n };\n\n messagePort.setOnPortDisconnect(onDisconnect);\n\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\n attachPort(ctx, null);\n } else {\n attachPort(ctx, ctx);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {MyDialogFilter} from '../storages/filters';\n\n/**\n * Legacy Webogram's format, don't change dcID to camelCase. date is timestamp\n */\nexport type UserAuth = {dcID: number | string, date: number, id: PeerId};\nexport type REAL_FOLDER_ID = 0 | 1;\n\nexport const NULL_PEER_ID: PeerId = 0;\nexport const REPLIES_PEER_ID: PeerId = 1271266957;\nexport const REPLIES_HIDDEN_CHANNEL_ID: ChatId = 777;\nexport const SERVICE_PEER_ID: PeerId = 777000;\nexport const MUTE_UNTIL = 0x7FFFFFFF;\nexport const BOT_START_PARAM = '';\nexport const MAX_FILE_SAVE_SIZE = 20 * 1024 * 1024;\nexport const THUMB_TYPE_FULL = '';\nexport const TOPIC_COLORS = [0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, 0xFB6F5F];\nexport const ATTACH_MENU_BOT_ICON_NAME = 'default_static';\nexport const GENERAL_TOPIC_ID = 4295032831;\nexport const T_ME_PREFIXES = new Set(['web', 'k', 'z']);\n\nexport const FOLDER_ID_ALL: REAL_FOLDER_ID = 0;\nexport const FOLDER_ID_ARCHIVE: REAL_FOLDER_ID = 1;\nexport const REAL_FOLDERS: Set = new Set([FOLDER_ID_ALL, FOLDER_ID_ARCHIVE]);\nexport const START_LOCAL_ID = Math.max(...Array.from(REAL_FOLDERS)) + 1 as MyDialogFilter['localId'];\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport emojiRegExp from '../../vendor/emoji/regex';\nimport {MessageEntity} from '../../layer';\n\nconst EmojiHelper = {\n emojiMap: (code: string) => { return code; },\n shortcuts: [] as any,\n emojis: [] as any\n};\n\nexport const ALPHA_CHARS_REG_EXP = 'a-z' +\n '\\\\u00c0-\\\\u00d6\\\\u00d8-\\\\u00f6\\\\u00f8-\\\\u00ff' + // Latin-1\n '\\\\u0100-\\\\u024f' + // Latin Extended A and B\n '\\\\u0253\\\\u0254\\\\u0256\\\\u0257\\\\u0259\\\\u025b\\\\u0263\\\\u0268\\\\u026f\\\\u0272\\\\u0289\\\\u028b' + // IPA Extensions\n '\\\\u02bb' + // Hawaiian\n '\\\\u0300-\\\\u036f' + // Combining diacritics\n '\\\\u1e00-\\\\u1eff' + // Latin Extended Additional (mostly for Vietnamese)\n '\\\\u0400-\\\\u04ff\\\\u0500-\\\\u0527' + // Cyrillic\n '\\\\u2de0-\\\\u2dff\\\\ua640-\\\\ua69f' + // Cyrillic Extended A/B\n '\\\\u0591-\\\\u05bf\\\\u05c1-\\\\u05c2\\\\u05c4-\\\\u05c5\\\\u05c7' +\n '\\\\u05d0-\\\\u05ea\\\\u05f0-\\\\u05f4' + // Hebrew\n '\\\\ufb1d-\\\\ufb28\\\\ufb2a-\\\\ufb36\\\\ufb38-\\\\ufb3c\\\\ufb3e\\\\ufb40-\\\\ufb41' +\n '\\\\ufb43-\\\\ufb44\\\\ufb46-\\\\ufb4f' + // Hebrew Pres. Forms\n '\\\\u0610-\\\\u061a\\\\u0620-\\\\u065f\\\\u066e-\\\\u06d3\\\\u06d5-\\\\u06dc' +\n '\\\\u06de-\\\\u06e8\\\\u06ea-\\\\u06ef\\\\u06fa-\\\\u06fc\\\\u06ff' + // Arabic\n '\\\\u0750-\\\\u077f\\\\u08a0\\\\u08a2-\\\\u08ac\\\\u08e4-\\\\u08fe' + // Arabic Supplement and Extended A\n '\\\\ufb50-\\\\ufbb1\\\\ufbd3-\\\\ufd3d\\\\ufd50-\\\\ufd8f\\\\ufd92-\\\\ufdc7\\\\ufdf0-\\\\ufdfb' + // Pres. Forms A\n '\\\\ufe70-\\\\ufe74\\\\ufe76-\\\\ufefc' + // Pres. Forms B\n '\\\\u200c' + // Zero-Width Non-Joiner\n '\\\\u0e01-\\\\u0e3a\\\\u0e40-\\\\u0e4e' + // Thai\n '\\\\u1100-\\\\u11ff\\\\u3130-\\\\u3185\\\\uA960-\\\\uA97F\\\\uAC00-\\\\uD7AF\\\\uD7B0-\\\\uD7FF' + // Hangul (Korean)\n '\\\\u3003\\\\u3005\\\\u303b' + // Kanji/Han iteration marks\n '\\\\uff21-\\\\uff3a\\\\uff41-\\\\uff5a' + // full width Alphabet\n '\\\\uff66-\\\\uff9f' + // half width Katakana\n '\\\\uffa1-\\\\uffdc'; // half width Hangul (Korean)\nexport const ALPHA_NUMERIC_REG_EXP = '0-9\\_' + ALPHA_CHARS_REG_EXP;\nexport const DOMAIN_ADD_CHARS = '\\u00b7';\n// Based on Regular Expression for URL validation by Diego Perini\nexport const URL_ALPHANUMERIC_REG_EXP_PART = '[' + ALPHA_CHARS_REG_EXP + '0-9]';\nexport const URL_PROTOCOL_REG_EXP_PART = '((?:https?|ftp)://|mailto:)?';\nexport const URL_REG_EXP = URL_PROTOCOL_REG_EXP_PART +\n // user:pass authentication\n '(?:' + URL_ALPHANUMERIC_REG_EXP_PART + '{1,64}(?::' + URL_ALPHANUMERIC_REG_EXP_PART + '{0,64})?@)?' +\n '(?:' +\n // sindresorhus/ip-regexp\n '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(?:\\\\.(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])){3}' +\n '|' +\n // host name\n URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}' +\n // domain name\n '(?:\\\\.' + URL_ALPHANUMERIC_REG_EXP_PART + '[' + ALPHA_CHARS_REG_EXP + DOMAIN_ADD_CHARS + '0-9\\-]{0,64}){0,10}' +\n // TLD identifier\n '(?:\\\\.(xn--[0-9a-z]{2,16}|[' + ALPHA_CHARS_REG_EXP + ']{2,24}))' +\n ')' +\n // port number\n '(?::\\\\d{2,5})?' +\n // resource path\n '(?:/(?:\\\\S{0,255}[^\\\\s.;,(\\\\[\\\\]{}<>\"\\'])?)?';\nexport const URL_PROTOCOL_REG_EXP = new RegExp('^' + URL_PROTOCOL_REG_EXP_PART.slice(0, -1), 'i');\nexport const URL_ANY_PROTOCOL_REG_EXP = /^((?:[^\\/]+?):\\/\\/|mailto:)/;\nexport const USERNAME_REG_EXP = '[a-zA-Z\\\\d_]{5,32}';\nexport const BOT_COMMAND_REG_EXP = '\\\\/([a-zA-Z\\\\d_]{1,32})(?:@(' + USERNAME_REG_EXP + '))?(\\\\b|$)';\nexport const FULL_REG_EXP = new RegExp('(^| )(@)(' + USERNAME_REG_EXP + ')|(' + URL_REG_EXP + ')|(\\\\n)|(' + emojiRegExp + ')|(^|[\\\\s\\\\(\\\\]])(#[' + ALPHA_NUMERIC_REG_EXP + ']{2,64})|(^|\\\\s)' + BOT_COMMAND_REG_EXP, 'i');\nexport const EMAIL_REG_EXP = /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/;\n// const markdownTestRegExp = /[`_*@~]/;\nexport const MARKDOWN_REG_EXP = /(^|\\s|\\n)(````?)([\\s\\S]+?)(````?)([\\s\\n\\.,:?!;]|$)|(^|\\s|\\x01)(`|~~|\\*\\*|__|_-_|\\|\\|)([^\\n]+?)\\7([\\x01\\s\\.,:?!;]|$)|@(\\d+)\\s*\\((.+?)\\)|(\\[(.+?)\\]\\((.+?)\\))/m;\nexport const SITE_HASHTAGS: {[siteName: string]: string} = {\n 'Telegram': 'tg://search_hashtag?hashtag={1}',\n 'Twitter': 'https://twitter.com/hashtag/{1}',\n 'Instagram': 'https://instagram.com/explore/tags/{1}/',\n 'Google Plus': 'https://plus.google.com/explore/{1}'\n};\n\n// export const SITE_MENTIONS: {[siteName in 'Telegram' | 'Twitter' | 'Instagram' | 'GitHub']: string} = {\n// Telegram: '#{1}',\n// Twitter: 'https://twitter.com/{1}',\n// Instagram: 'https://instagram.com/{1}/',\n// GitHub: 'https://github.com/{1}'\n// };\n\nexport const MARKDOWN_ENTITIES: {[markdown: string]: MessageEntity['_']} = {\n '`': 'messageEntityCode',\n '``': 'messageEntityPre',\n '**': 'messageEntityBold',\n '__': 'messageEntityItalic',\n '~~': 'messageEntityStrike',\n '_-_': 'messageEntityUnderline',\n '||': 'messageEntitySpoiler'\n};\n\nexport const PASS_CONFLICTING_ENTITIES: Set = new Set([\n 'messageEntityEmoji',\n 'messageEntityLinebreak',\n 'messageEntityCaret'\n]);\nfor(const i in MARKDOWN_ENTITIES) {\n PASS_CONFLICTING_ENTITIES.add(MARKDOWN_ENTITIES[i]);\n}\n\nexport const PHONE_NUMBER_REG_EXP = /^\\+\\d+$/;\n\n/* export function parseEmojis(text: string) {\n return text.replace(/:([a-z0-9\\-\\+\\*_]+?):/gi, function (all, shortcut) {\n var emojiCode = EmojiHelper.shortcuts[shortcut]\n if (emojiCode !== undefined) {\n return EmojiHelper.emojis[emojiCode][0]\n }\n return all\n })\n} */\n\n\n/* export function replaceUrlEncodings(urlWithEncoded: string) {\n return urlWithEncoded.replace(/(%[A-Z\\d]{2})+/g, (str) => {\n try {\n return decodeURIComponent(str);\n } catch (e) {\n return str;\n }\n });\n} */\n","// https://github.com/twitter/twemoji-parser/blob/master/src/lib/regex.js\n\nexport function encodeEmoji(emojiText: string) {\n const codepoints = toCodePoints(removeVS16s(emojiText)).join('-');\n return codepoints;\n}\n\nconst vs16RegExp = /\\uFE0F/g;\n// avoid using a string literal like '\\u200D' here because minifiers expand it inline\nconst zeroWidthJoiner = String.fromCharCode(0x200d);\n\nconst removeVS16s = (rawEmoji: string) => (rawEmoji.indexOf(zeroWidthJoiner) < 0 ? rawEmoji.replace(vs16RegExp, '') : rawEmoji);\n\nexport function toCodePoints(unicodeSurrogates: string): Array {\n const points = [];\n let char = 0;\n let previous = 0;\n let i = 0;\n while(i < unicodeSurrogates.length) {\n char = unicodeSurrogates.charCodeAt(i++);\n if(previous) {\n points.push((0x10000 + ((previous - 0xd800) << 10) + (char - 0xdc00)).toString(16));\n previous = 0;\n } else if(char > 0xd800 && char <= 0xdbff) {\n previous = char;\n } else {\n points.push(char.toString(16));\n }\n }\n\n if(points.length && points[0].length === 2) {\n points[0] = '00' + points[0];\n }\n\n return points;\n}\n\nexport function getEmojiToneIndex(input: string) {\n const match = input.match(/[\\uDFFB-\\uDFFF]/);\n return match ? 5 - (57343 - match[0].charCodeAt(0)) : 0;\n}\n\nconst VIRTUAL_COUNTRIES_EMOJIS: Map = new Map([\n ['FT', '🏴‍☠']\n]);\n\nexport function getCountryEmoji(iso2: string) {\n return VIRTUAL_COUNTRIES_EMOJIS.get(iso2) ??\n String.fromCharCode(55356, 56741 + iso2.charCodeAt(0), 55356, 56741 + iso2.charCodeAt(1));\n}\n\nexport function emojiFromCodePoints(codePoints: string) {\n return codePoints.split('-').reduce((prev, curr) => prev + String.fromCodePoint(parseInt(curr, 16)), '');\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [699,211,539,85,946], () => (__webpack_require__(6225)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames not based on template\n\tif (chunkId === 85) return \"85.952a9f12a6b3dcdd3f0e.bundle.js\";\n\tif (chunkId === 946) return \"946.03f0ef26aad0c7635d9b.bundle.js\";\n\t// return url for filenames based on template\n\treturn \"\" + ({\"211\":\"npm.big-integer\",\"699\":\"npm.pako\"}[chunkId] || chunkId) + \".\" + {\"8\":\"570e6da51a125009c156\",\"104\":\"91dd6279f1f693880508\",\"211\":\"780c206f3e1257ccad6a\",\"301\":\"42dc636f96a62f6a08c8\",\"539\":\"17a0b07b4e6476f19654\",\"642\":\"fd1ade69544ad78671c6\",\"699\":\"85f88e27b023cbb2ca51\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t678: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","DEBUG","MOUNT_CLASS_TO","window","self","EmojiVersions","Emoji","version","Object","assign","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","badCharsRe","trimRe","C2L","cleanSearchText","text","latinize","processSearchText","clearBadChars","ignoreCase","options","hasTag","includeTag","charAt","originalText","replace","clearBadCharsAndTrim","ch","latinizeCh","latinizeString","fixCyrillic","FILENAME_JOINER","getFileNameByLocation","location","ext","length","str","_","id","thumb_size","filter","Boolean","join","photo_id","pFlags","big","stickerset","short_name","emoticon","thumb_version","volume_id","local_id","url","console","error","downloadId","getFileURL","type","encodeURIComponent","JSON","stringify","platforms","Set","ignore","getRestrictionReason","reasons","find","reason","has","isRestricted","ignoreRestrictionReasons","clear","forEach","add","getPeerId","peerId","undefined","isPeerId","userId","user_id","toPeerId","chatId","channel_id","chat_id","isUser","peerParams","substr","split","IDB","constructor","db","this","name","storageIsAvailable","log","openDatabase","INSTANCES","push","isAvailable","createNew","openDbPromise","createIndexes","os","store","indexNames","Array","from","indexName","deleteIndex","indexes","index","contains","createIndex","keyPath","objectParameters","request","indexedDB","open","Promise","reject","message","finished","setTimeout","onerror","resolve","onsuccess","event","result","calledNew","onclose","e","onabort","transaction","target","close","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","static","instance","preserve","storage","IDBStorage","storeName","idb","create","delete","entryName","isArray","concat","getObjectStore","map","save","value","idx","put","get","mode","callback","perf","performance","now","then","onError","clearTimeout","timeout","onComplete","results","requests","r","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","i","getAll","environment","getEnvironment","setEnvironment","env","RootScope","super","myId","connectionStatus","premium","addEventListener","isNew","isPremium","dispatchEventSingle","status","dispatchEvent","args","invokeVoid","settings","getConnectionStatus","getPremium","state","stateStorage","getState","setByKey","key","object","splitted","getDeepProperty","slice","pop","setDeepProperty","first","pushToState","direct","onlyLocal","setKeyValueToStorage","set","HTTP","dcId","logSuffix","pending","debug","logTypes","Log","logger","connected","_send","body","fetch","method","response","arrayBuffer","buffer","TextDecoder","decode","Uint8Array","setConnected","err","destroyed","destroy","send","networker","promise","releasePending","releasing","splice","pause","Socket","handleOpen","handleError","handleClose","removeListeners","handleMessage","data","byteLength","ws","connect","removeEventListener","WebSocket","binaryType","randomize","arr","crypto","Error","getRandomValues","Obfuscation","_process","operation","cryptoMessagePort","transfer","init","codec","idPromise","release","initPayload","val","val2","reversedPayload","reverse","encKey","encIv","decKey","decIv","process","obfuscateTag","encrypted","encode","payload","tag","encodePacket","len","header","readPacket","bytesToHex","bytes","toString","TcpObfuscated","Connection","retryTimeout","abridged","obfuscation","autoReconnect","onOpen","connection","setConnectionStatus","cleanupSent","resend","onMessage","parseResponse","processMessage","messageId","sessionId","catch","shift","onClose","needTimeout","retryAt","time","Date","diff","lastCloseTime","isNaN","reconnectTimeout","ctx","reconnect","bodySent","forceReconnect","setAutoReconnect","once","enable","changeUrl","encodeBody","toEncode","encoded","releasingPending","sent","TEST_SUFFIX","getTelegramConnectionSuffix","connectionType","constructTelegramWebSocketUrl","suffix","path","DcConfigurator","sslSubdomains","dcOptions","host","port","chosenServers","transportSocket","chosenServer","oooohLetMeLive","transportHTTP","dcOption","chooseServer","transportType","reuse","hasOwnProperty","client","download","upload","servers","transports","transport","obj","indexOfAndSplice","MTTransportController","opened","Map","waitForWebSocket","pingTransports","dcConfigurator","https","websocket","httpPromise","websocketPromise","socket","isFulfilled","isRejected","isHttpAvailable","isWebSocketAvailable","all","pinging","setTransportValue","setTransportOpened","setTransportClosed","AppManager","setManagers","managers","loadStorages","storages","recordPromise","storagesKeys","keys","storagesPromises","storagesResults","resetStorages","size","loadStoragesInner","AppStoragesManager","names","createStorages","loadStorage","PasswordManager","apiManager","invokeApi","updateSettings","currentHashPromise","newHashPromise","params","password","new_settings","hint","email","currentPassword","cryptoWorker","invokeCrypto","newAlgo","new_algo","salt1","newPassword","hashes","new_password_hash","getInputCheckPassword","check","inputCheckPassword","auth","setUser","user","confirmPasswordEmail","code","resendPasswordEmail","cancelPasswordEmail","ReferenceDatabase","contexts","links","saveContext","reference","context","getContexts","_context","deepEqual","getReferenceByLink","getContext","values","deleteContext","refreshReference","c","appMessagesManager","reloadMessages","refreshEmojiesSoundsPromise","appStickersManager","getAnimatedEmojiSounds","appProfileManager","getProfile","appEmojiManager","getCustomEmojiDocuments","docId","appAttachMenuBotsManager","getAttachMenuBot","botId","hex","newHex","newContext","makeError","safeReplaceObject","wasObject","newObject","getPeerIdsFromMessage","peerIds","fromId","viaBotId","fwdFromId","media","contactUserId","recentVoters","recent_voters","recentReactions","recent_reactions","reaction","peer_id","action","userIds","users","inviter_id","chatIds","recentRepliers","recent_repliers","reply","setDialogIndex","dialog","indexKey","GLOBAL_FOLDER_ID","DialogsStorage","allDialogsLoaded","pinnedOrders","folderId","saveAllDialogsLoaded","resetPinnedOrder","savePinnedOrders","forumTopics","folders","dialogsOffsetDate","dialogsNum","dialogsIndex","cachedResults","query","count","dialogs","onUpdateFolderPeers","update","folder_peers","folderPeer","folder_id","peer","appPeersManager","dropDialog","pinned","handleDialogUnpinning","generateIndexForDialog","pushDialog","scheduleHandleNewDialogs","onUpdateDialogPinned","getDialogOnly","handleDialogTogglePinned","onUpdateChannelPinnedTopic","topicId","generateMessageId","topic_id","topic","getForumTopic","getFilterIdForForum","onUpdatePinnedDialogs","order","handleDialogsPinned","dialogsResult","applyDialogs","d","onUpdateChannelPinnedTopics","filterId","limit","getLimit","channel","appChatsManager","getChannelInput","toChatId","offset_date","offset_id","offset_topic","processTopics","topics","after","rootScope","appUsersManager","getSelf","peerText","getPeerSearchText","indexObject","onFilterUpdate","getCachedDialogs","processDialogForFilter","processDialogForFilters","getDialogIndexKeyByFilterId","processChangedUnreadOrUnmuted","chat","getChat","dropDialogOnDeletion","enabled","flushForumTopicsCache","apiUpdatesManager","addMultipleEventsListeners","updateFolderPeers","updateDialogPinned","updateChannelPinnedTopic","updatePinnedDialogs","updateChannelPinnedTopics","appStateManager","appStoragesManager","getCache","_order","getPinnedOrders","setDialogsFromState","bind","appDraftsManager","addMissedDialogs","top_message","getServerMessageId","topMessage","saveMessages","saveDialog","ignoreOffsetDate","getMessageByPeer","reloadConversation","isDialogsLoaded","setDialogsLoaded","loaded","isForum","isFilterIdForForum","defineNotNumerableProperties","every","orders","isDialogPinned","filtersStorage","getFilter","isPinned","pinnedPeerIds","getOffsetDate","offsetDate","Math","min","sort","a","b","generateFolder","folder","unreadMessagesCount","unreadPeerIds","unreadUnmutedPeerIds","getFolder","forumTopic","getDialogKey","isTopic","getFolderDialogs","skipMigrated","hidden","migratedTo","getNextDialog","currentPeerId","findIndex","getDialogIndexKey","localId","isDialogUnmuted","appNotificationsManager","isPeerLocalMuted","respectType","threadId","getFolderUnreadCount","unreadUnmutedCount","unreadCount","arrays","setDialogIndexInFilter","isRealFolder","testDialogForFilter","pinnedIds","pinnedKey","pinnedIndex","generateDialogIndex","generateDialogPinnedDateByIndex","getDialogIndex","getDialog","verify","skipped","getDialogOrTopic","isObject","date","tsNow","timeManager","getServerTimeOffset","noIndex","filters","getFilters","cmp","wasIndex","wasDialog","wasDialogIndex","newDialogIndex","prepareFolderUnreadCountModifyingByDialog","insertInDescendSortedArray","prepareDialogUnreadCountModifying","toggle","callbacks","wasUnreadCount","getDialogUnreadCount","wasUnmuted","newUnreadCount","newUnmuted","addMessagesCount","modifyFolderUnreadCount","toggleDialog","toggleUnmuted","forumUnreadCount","getForumUnreadCount","hasUnmuted","some","max","dispatchUnreadTimeout","_folder","justReturn","noPinnedOrderUpdate","topDate","generateDialogPinnedDate","channelId","isChannel","draft","dialogKey","unshift","setDialogToState","pts","historyStorage","getHistoryStorage","messagesStorage","getHistoryMessagesStorage","history","incomingMessage","mid","getMessageFromStorage","is_outgoing","peersStorage","requestPeersForKey","isAnyChat","newPts","getChannelState","requestPeer","saveGlobalOffset","getForumTopicsCache","getDialogOffsetDate","savedGlobalOffsetDate","savedOffsetDate","dropDialogFromFolders","foundDialog","wasPinned","keepLocal","clearDialogFromState","releasePeer","dropDialogWithEvent","dropped","items","forEachReverse","assumeType","saveApiUsers","saveApiChats","chats","messages","updatedDialogs","topMid","topPendingMid","pendingTopMsgs","topPendingMessage","maxId","cache","getUpdateCache","getUpdateAfterReloadKey","updates","newUpdatesAfterReloadToHandle","saveUpdate","canSaveDialogByPeerId","isDialog","wasDialogBefore","wasTopMessage","generateTempMessageId","from_id","getOutputPeer","deleted","out","isOutgoing","migrated_to","deactivated","migratedToPeer","migratedFromTo","migratedToFrom","read_inbox_max_id","read_outbox_max_id","saveDraft","isOut","unread","unread_count","isEnd","insertSlice","setEnd","mergeReplyKeyboard","readMaxId","readOutboxMaxId","savePeerSettings","notify_settings","addChannelState","releaseUnreadCount","dialogsStorage","processTopicUpdate","oldTopic","isIconChanged","icon_emoji_id","isTitleChanged","title","isChanged","getDialogs","offsetIndex","promises","fillContactsResult","fillContacts","cached","reloadMissingDialogsPromise","reloadMissingPeerIds","realFolderId","curDialogStorage","d1","d2","offset","loadedAll","isEnoughDialogs","isTopEnd","getTopMessages","deletedTopics","getTopicPromises","getForumTopicById","getTopicsPromise","ids","fullfillLeft","messagesForumTopics","getForumTopicOrReload","callbackify","processTopicsPromise","f","reduce","acc","v","newPinned","convertment","PREPENDED_FILTERS","LOCAL_FILTER","flags","exclude_peers","include_peers","pinned_peers","excludePeerIds","includePeerIds","FiltersStorage","filtersArr","reloadedPeerIds","localFilters","generateLocalFilter","clearFilters","onUpdateDialogFilter","saveDialogFilter","findAndSplice","onUpdateDialogFilters","oldFilters","copy","getDialogFilters","_filterId","onUpdateDialogFilterOrder","includes","setLocalId","updateDialogFilter","updateDialogFilters","updateDialogFilterOrder","prependFilters","allChatsFilter","archiveFilter","allChatsFilterIndex","exclude_archived","exclude_unarchived","exclude_read","isDialogUnread","exclude_muted","unread_mentions_count","broadcasts","isBroadcast","groups","isAnyGroup","toUserId","isBot","bots","non_contacts","isContact","contacts","testDialogForFilterId","toggleDialogPin","getConfig","pinned_infolder_count_max","getInputPeerById","createDialogFilter","prepend","remove","getOutputDialogFilter","bool","updateDialogFiltersOrder","filterIncludedPinnedPeers","peers","reloadDialogs","inputPeer","isAlreadyReloaded","reloadPromises","missingPeerIds","overwrite","invokeApiSingle","getSuggestedDialogsFilters","silent","to","oldFilter","_filter","isFilterIdAvailable","applyMixins","derivedCtor","constructors","baseCtor","getOwnPropertyNames","prototype","getOwnPropertyDescriptor","defineProperty","ApiUpdatesManager","updatesState","pendingPtsUpdates","pendingSeqUpdates","syncPending","syncLoading","channelStates","attached","subscriptions","processUpdateMessage","updateMessage","processOpts","seq","seqStart","seq_start","forceGetDifference","processUpdate","toId","fwd_from","reply_to","entities","pts_count","override","_constructor","setProxy","Proxy","saveUpdatesState","us","popPendingSeqUpdate","nextSeq","pendingUpdatesData","seqAwaiting","ptsAwaiting","clearStatePendingSync","popPendingPtsUpdate","curState","curPts","goodPts","goodIndex","getDifference","processLocalUpdate","wasSyncing","pts_total_limit","qts","differenceResult","other_updates","new_messages","apiMessage","nextState","intermediate_state","onDifferenceTooLong","justAName","getChannelDifference","channelState","bindPrefix","lastDifferenceTime","final","lastPtsUpdateTime","fwdHeader","hasUser","post","hasChat","popPts","popSeq","subscribeToChannelUpdates","subscription","cb","interval","unsubscribeFromChannelUpdates","force","clearInterval","attach","langCode","noErrorBox","stateResult","setUpdatesProcessor","strs","en","ru","getChangelog","lang","res","ok","langStr","parseMarkdown","inbox_date","languages","filterUnique","language","AppAvatarsManager","savedAvatarURLs","removeFromAvatarsCache","isAvatarCached","saved","loadAvatar","photo","peerPhotoFileLocation","downloadOptions","dc_id","limitPart","apiFileManager","blob","URL","createObjectURL","AppCallsManager","calls","IS_CALL_SUPPORTED","updatePhoneCall","saveCall","phone_call","updatePhoneCallSignalingData","callId","phone_call_id","computeKey","g_b","p","call","isDiscarded","oldCall","getCall","getCallInput","access_hash","savePhonePhoneCall","phonePhoneCall","generateDh","random_length","dhConfig","requestCall","protocol","g_a_hash","video","getUserInput","random_id","discardCall","duration","connection_id","AppChatsManager","isPeerNeeded","modifyUsernamesCache","onChatUpdated","updateChannelParticipant","clearCache","updateChatDefaultBannedRights","default_banned_rights","getFromCache","apiChats","saveApiChat","oldChat","participants_count","changedUsername","setUsernameToCache","oldPhotoId","newPhotoId","toggledForum","forum","changedPhoto","changedTitle","changedAnyBadge","verified","scam","fake","hasRights","rights","isThread","editChatDefaultBannedRights","banned_rights","until_date","isMegagroup","megagroup","isInChat","good","getInputPeer","getChannelInputPeer","getChatInputPeer","allowMin","getChatString","createChannel","inviteToChannel","input","usersInputs","u","createChat","leaveChannel","joinChannel","addChatUser","fwdLimit","fwd_limit","deleteChatUser","leaveChat","leave","deleteChannel","deleteChat","migrateChat","updateUsername","username","doNotRefresh","refreshChatAfterRequest","editPhoto","inputFile","inputChatPhoto","file","editTitle","editAbout","about","editBanned","participant","getParticipantPeerId","timestamp","actor_id","prev_participant","new_participant","kicked_by","clearChannelParticipantBannedRights","kickFromChannel","view_messages","kickFromChat","resolveChannel","messagesChats","togglePreHistoryHidden","toggleSignatures","toggleNoForwards","setChatAvailableReactions","reactions","chatFull","getCachedFullChat","available_reactions","getSendAs","invokeApiSingleProcess","processResult","sendAsPeers","importChatInvite","hash","checkUsername","getSponsoredMessage","invokeApiCacheable","cacheSeconds","sponsoredMessages","sponsoredMessage","viewSponsoredMessage","randomId","checkChatInvite","chatInvite","toggleUsername","active","reorderUsernames","deactivateAllUsernames","makeChannelPrivate","getChannels","toggleForum","editForumTopic","iconEmojiId","closed","createForumTopic","iconColor","channelFull","getChannelFull","sendAsInputPeer","default_send_as","icon_color","send_as","updatePinnedForumTopic","wrapUrl","unsafe","matchUrlProtocol","tgMeMatch","telescoPeMatch","tgMatch","onclick","prefix","pathname","fullPath","I18n","pluralRules","cacheLangPackPromise","setLangCode","lastRequestedLangCode","lastRequestedNormalizedLangCode","updateAmPm","timeFormat","dateTimeFormat","getDateTimeFormat","hour","minute","hour12","setHours","amText","format","amPmCache","am","pmText","pm","loadLocalLangPack","defaultCode","langSign","countries","strings","formatLocalStrings","default","saveLangPack","from_version","lang_code","local","loadLangPack","web","requestedServerLanguage","lang_pack","polyfillPromise","pushTo","langPack","appVersion","applyLangPack","currentLangCode","Intl","PluralRules","string","countriesList","country","langPackKey","default_name","lastAppliedLangCode","cachedDateTimeFormats","document","querySelectorAll","element","weakMap","superFormatter","indexHolder","lastIndex","p1","p2","p3","p4","createElement","append","lastIndexOf","wrappedUrl","href","setAttribute","DocumentFragment","firstChild","textContent","arg","pushNextArgument","plain","select","item","Node","isRTL","setRTL","rtl","getCacheLangPack","finally","setTimeFormat","haveToUpdate","IntlDateElement","getStrings","getLangPack","langPack1","langPack2","localLangPack1","localLangPack2","l","_Intl","WeakMap","IntlElementBase","classList","property","IntlElement","safeAssign","formatted","dataset","compareAndUpdate","json","DateTimeFormat","hours","getHours","getMinutes","capitalizeFirstLetter","i18n","i18n_","_i18n","months","days","getWeekNumber","UTC","getFullYear","getMonth","getDate","dayNum","getUTCDay","setUTCDate","getUTCDate","yearStart","getUTCFullYear","ceil","getTime","today","year","day","month","weekday","minYear","yearPattern","RegExp","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","createForMonthYear","dates","selectedYear","currentYear","setFullYear","minDate","setMonth","maxDate","formatterMonthYear","createForDayMonth","validDateForMonth","formatterDayMonth","formatterYearMax","formatWeekLong","getDay","q","safeReplaceArrayInObject","trim","dayOfWeek","setDate","getDayOfWeek","distance","setTime","matches","exec","g1","g2","k","g3","parseInt","k1","EXTENSION_MIME_TYPE_MAP","pdf","tgv","tgs","wav","mp3","ogg","jpeg","jpg","png","gif","webp","mp4","webm","mov","svg","MIME_TYPE_EXTENSION_MAP","uploadWallPaperTempId","AppDocsManager","onServiceWorkerFail","docs","doc","supportsStreaming","thumbsStorage","deleteCacheContext","stickerCachedThumbs","uploadingWallPapers","online","saveDoc","oldDoc","file_reference","referenceDatabase","attributes","attribute","file_name","wrapPlainText","voice","mime_type","w","h","round_message","alt","stickerEmojiRaw","stickerSetInput","thumbs","IS_WEBP_SUPPORTED","sticker","IS_WEBM_SUPPORTED","animated","mappedMimeType","joiner","monthAsNumber","noSeconds","getSeconds","leadingZero","noTime","getFullDate","isServiceWorkerOnline","getCacheContext","setCacheContextURL","thumb","getDocumentDownloadOptions","getDocumentURL","getDoc","downloadDoc","queueId","onlyCache","downloadMedia","getLottieCachedThumb","toneIndex","saveLottiePreview","width","height","saveWebPConvertedStrippedThumb","stickerThumbConverted","getWallPapers","invokeApiHashable","accountWallpapers","wallPapers","wallpapers","wallPaper","prepareWallPaperUpload","cacheContext","wallpaper","slug","uploadWallPaper","fileName","downloaded","getGifs","gifs","requestDocPart","requestFilePart","getDocumentInputFileLocation","AppDraftsManager","drafts","updateDraftMessage","notify","getKey","getDraft","getAllDrafts","getAllDraftPromise","apiDraft","processApiDraft","isEmptyDraft","reply_to_msg_id","syncDraft","localDraft","saveOnServer","serverDraft","draftsAreEqual","draftObj","getInputEntities","no_webpage","top_msg_id","saveLocalDraft","clearAllDrafts","combined","clearDraft","emptyDraft","setDraft","EMOJI_LANG_PACK","keywords","AppEmojiManager","keywordLangPacks","indexedLangPacks","getKeywordsPromises","recent","getRecentEmojisPromises","getCustomEmojiDocumentPromises","getEmojiKeywords","storageKey","pack","validateInitObject","keywordsDifference","packKeywords","keyword","emoticons","getBothEmojiKeywords","networkerFactory","native","getRecentEmojis","indexEmojis","searchEmojis","emojis","POPULAR_EMOJI","recentEmoji","recentCustomEmoji","pushRecentEmoji","emoji","fixEmoji","docIds","document_id","documents","appDocsManager","getCachedCustomEmojiDocuments","setDebouncedGetCustomEmojiDocuments","getCustomEmojiDocumentsPromise","allIds","getCustomEmojiDocument","getCustomEmojis","getEmojiStickers","AppGroupCallsManager","groupCalls","participants","nextOffsets","updateGroupCall","saveGroupCall","updateGroupCallParticipants","groupCallId","saveApiParticipants","groupCall","getCachedParticipants","prepareToSavingNextOffset","nextOffsetsMap","nextOffset","setNextOffset","newNextOffset","saveApiParticipant","skipCounterUpdating","oldParticipant","hasLeft","muted","can_self_unmute","getGroupCall","modified","just_joined","apiParticipants","editParticipant","getGroupCallInput","getInputPeerSelf","volume","raise_hand","raiseHand","video_paused","videoPaused","video_stopped","videoStopped","presentation_paused","presentationPaused","getGroupCallFull","participants_next_offset","shouldUpdate","createGroupCall","scheduleDate","schedule_date","getGroupCallParticipants","sources","groupCallParticipants","next_offset","hangUp","discard","groupCallInput","source","join_as","joinGroupCall","isMuted","joinVideo","leaveGroupCallPresentation","getPhotoInput","getPhotoMediaInput","ttl_seconds","getMediaInput","AppInlineBotsManager","inlineResults","setHash","getGeoInput","geo","lat","long","accuracy_radius","getInlineResults","bot","geo_point","stopTime","botResults","queryId","query_id","appPhotosManager","savePhoto","generateQId","pushPopularBot","getTopPeers","topPeers","botPeerId","topPeer","rating","switchToPM","fromPeerId","startParam","startBot","checkSwitchReturn","getUser","bot_inline_placeholder","peerData","switchInlineQuery","getPeerUsername","callbackButtonClick","button","msg_id","sendInlineResult","queryAndResultIds","inlineResult","queryID","resultID","resultId","send_message","reply_markup","replyMarkup","sendText","inputMedia","messageMedia","caption","sendMessage","geoPoint","address","provider","venue_id","venue_type","phone_number","first_name","last_name","vcard","description","currency","total_amount","shipping_address_requested","start_param","sendOther","AppMessagesIdsManager","tempNum","num","splitStringByLength","maxLength","lastSliceStartIndex","arrayIndex","cut","end","part","_arrayIndex","partLength","appTabsManager","tabs","start","getTabs","tab","addTab","deleteTab","getDocumentInput","setBooleanFlag","processAfter","UPDATE_STICKERSET_ORDER","AppMessagesManager","pendingByRandomId","pendingByMessageId","pendingAfterMsgs","tempFinalizeCallbacks","sendSmthLazyLoadQueue","needSingleMessages","extendedMedia","maxSeenId","newDialogsToHandle","notificationsToHandle","reloadConversationsPeers","groupedTempId","typings","unreadMentions","goToNextMentionPromises","batchUpdates","middleware","clean","uploadFilePromises","messagesStorageByPeerId","groupedMessagesStorage","scheduledMessagesStorage","historiesStorage","threadsStorage","searchesStorage","pinnedMessages","threadsServiceMessagesIdsStorage","threadsToReplies","handleNewDialogs","newMaxSeenId","updateMap","processDialog","isDialogDefined","incrementMaxSeenId","handleNotifications","notificationsHandlePromise","notifyPeerToHandle","getNotifyPeerSettings","peerTypeNotifySettings","mentioned","notifyAboutMessage","fwdCount","onUpdateMessageId","onUpdateNewMessage","getMessagePeer","isLocalThreadUpdate","createMessageStorage","threadKey","getThreadKey","handleNewUpdateAfterReload","threadStorage","reply_to_peer_id","reply_to_mid","receiptMessage","checkPendingMessage","updateMessageRepliesIfNeeded","ignoreExisting","findSlice","firstSlice","forceUserOnline","handleNewMessage","inboxUnread","modifyCachedMentions","setDialogTopMessage","notifyPeer","onUpdateMessageReactions","recentReaction","previousReactions","previousRecentReactions","show_previews","peerReaction","pushBatchUpdate","batchUpdateReactions","setDialogToStateIfMessageIsTop","onUpdateDialogUnreadMark","unread_mark","onUpdateEditMessage","oldMessage","newMessage","handleEditedMessage","isTopMessage","clear_history","dispatchEditEvent","newReactions","grouped_id","onUpdateReadHistory","max_id","read_max_id","getObjectKeysAndSort","stillUnreadCount","still_unread_count","newUnreadMentionsCount","foundAffected","repliesKey","getReadMaxIdIfUnread","messageThreadId","getMessageThreadId","setCount","threadKeyPart","onUpdateReadMessagesContents","topMsgId","mids","findPeerIdByMids","media_unread","fixDialogUnreadMentionsIfNoMessage","onUpdateChannelAvailableMessages","availableMinId","available_min_id","onUpdateDeleteMessages","threadKeys","historyUpdated","handleDeletedMessages","threadsStorages","msgs","affected","onUpdateChannel","needDialog","getPeerActiveUsernames","onUpdateChannelReload","flushStoragesByPeerId","onUpdateChannelMessageViews","views","batchUpdateViews","onUpdateServiceNotification","popup","phone","onUpdatePinnedMessages","missingMessages","werePinned","getPinnedMessagesKey","hiddenPinnedMessages","onUpdateNotifySettings","onUpdateNewScheduledMessage","isScheduled","onUpdateDeleteScheduledMessages","onUpdateMessageExtendedMedia","extended_media","batch","toDispatch","getMessagesFromMap","previousResults","changedResults","reactionCount","previousReactionCount","_reactionCount","reactionsEqual","chosen_order","updateMessageID","updateNewDiscussionMessage","updateNewMessage","updateNewChannelMessage","updateDialogUnreadMark","updateEditMessage","updateEditChannelMessage","updateMessageReactions","updateReadChannelDiscussionInbox","updateReadChannelDiscussionOutbox","updateReadHistoryInbox","updateReadHistoryOutbox","updateReadChannelInbox","updateReadChannelOutbox","updateChannelReadMessagesContents","updateReadMessagesContents","updateChannelAvailableMessages","updateDeleteMessages","updateDeleteChannelMessages","updateChannel","updateChannelReload","updateChannelMessageViews","updateServiceNotification","updatePinnedMessages","updatePinnedChannelMessages","updateNotifySettings","updateNewScheduledMessage","updateDeleteScheduledMessages","updateMessageExtendedMedia","filterFunc","getScheduledMessagesStorage","webpage","appWebPagesManager","getCachedWebPage","drop","poll","appPollsManager","pollToMessages","startsWith","batchUpdatesDebounced","debounce","details","maxSeenMsgId","sendEntites","entity","invokeAfterMessageIsSent","tempId","callbackName","finalize","editMessage","is_scheduled","newMedia","noWebPage","handled","replyToMsgId","MAX_LENGTH","message_length_max","webPage","getPeerMigratedTo","generateOutgoingMessage","toggleError","onMessagesSendError","sentRequestOptions","afterMessageId","sendAs","sendAsPeerId","apiPromise","invokeApiAfter","clear_draft","update_stickersets_order","wrapMessageEntities","beforeMessageSending","sequential","noop","sendFile","attachType","apiFileName","fileType","File","isDocument","Blob","isPhoto","IMAGE_MIME_TYPES_SUPPORTED","strippedPhotoSize","strippedBytes","actionName","isVoiceMessage","waveform","isMedia","photoSize","sizes","objectURL","VIDEO_MIME_TYPES_SUPPORTED","videoAttribute","isRoundMessage","supports_streaming","noSound","thumbCacheContext","sentDeferred","spoiler","uploadingFileName","getFileNameForUpload","uploaded","uploadPromise","load","thumbUploadPromise","cancelPendingMessage","setTyping","addNotifyListener","progress","percents","floor","done","total","notifyAll","force_file","isGroupedItem","background","ret","sendAlbum","sendFileDetails","groupId","o","invoke","multiMedia","multi_media","originalInputMedia","inputSingleMedia","inputs","sendContact","contactPeerId","getContactMediaInput","pollId","savePoll","total_voters","getPoll","getPhoto","postAuthor","getPeer","signatures","generateFromId","post_author","generateFlags","generateReplyHeader","via_bot_id","replies","generateReplies","replyToTopId","originalMessage","forum_topic","reply_to_top_id","linked_chat_id","comments","replies_pts","isAnonymousSending","generateForwardHeader","isUserHidden","from_name","userFull","getCachedFullUser","private_forward_name","channel_post","saved_from_msg_id","saved_from_peer","generateFakeAvatarMessage","Number","MAX_SAFE_INTEGER","getUploadPromise","uploadFileName","admin_rights","anonymous","pendingData","fillConversations","chatHistoryStorage","_promise","offset_peer","offsetPeerId","maxSeenIdIncremented","hasPrepend","noIdsDialogs","setFolderId","setMessageUnreadByDialog","folderDialogs","dialogsLength","slicedDialogs","forwardMessages","config","overflowMids","forwarded_count_max","dropCaptions","dropAuthor","newMids","newMessages","replyToMid","replyToMessageIdx","newReplyToMid","getStickerEffectThumb","nopremium","group","from_peer","to_peer","with_my_score","withMyScore","drop_author","drop_media_captions","generateEmptyMessage","getMessagesStorageByKey","s","getMessagesStorage","getMessageById","cantForwardDeleteMids","cantForward","cantDelete","canForward","canDeleteMessage","reloadConversationOrTopic","inputDialogPeer","getInputDialogPeerById","reloadConversationsPromise","inputDialogPeers","currentState","doFlushHistory","just_clear","revoke","affectedHistory","flushHistory","justClear","getHistory","historyResult","getTypingKey","ss","hidePinnedMessages","getPinnedMessage","getSearch","inputFilter","getPinnedMessagesCount","getPinnedMessagesMaxId","updatePinnedMessage","unpin","pm_oneside","unpinAllMessages","unpinAll","getAlbumText","getGroupsFirstMessage","minMid","getMidsByAlbum","groupedId","getMessagesByAlbum","getMidsByMessage","filterMessages","appMessagesIdsManager","saveMessage","isMessage","replyTo","overwriting","msgId","savedFromPeerId","savedFromMid","savedFrom","mediaContext","unsupported","originalDoc","messageKey","getMessageKeyForPendingWebPage","saveWebPage","appWebDocsManager","saveWebDocument","extendedMediaMedia","totalEntities","migrateFrom","migrateTo","video_sizes","appGroupCallsManager","migrateChecks","getFirstMessageToEdit","goodMessage","myPeerId","canEditMessage","apiEntities","myEntities","parseEntities","mergeEntities","reportMessages","editPeerFolders","getDialogPeer","markDialogUnread","read","fromChat","canMessageBeEdited","kind","goodMedias","edit_time_limit","getReplyKeyboard","messageReplyMarkup","lastReplyMarkup","selective","maxOutId","single_use","getSearchStorage","getSearchCounters","canCache","isPeerRestricted","func","filterMessagesByInputFilterFromStorage","_storage","filterMessagesByInputFilter","nextRate","backLimit","offset_id_offset","next_rate","foundMsgs","min_date","max_date","add_offset","min_id","offsetId","offsetMessage","offset_rate","searchResult","foundCount","subscribeRepliesThread","getDiscussionMessage","generateThreadServiceStartMessage","maxMessageId","serviceStartMessage","is_single","getThreadServiceMessageId","getMessageWithReplies","newMaxId","unsetEnd","newDialogsHandlePromise","deleteMessages","localMessageIds","creator","delete_messages","affectedMessages","readHistory","triedToReadMaxId","readPromise","getPeerString","readAllHistory","getUnreadMentionsKey","slicedArray","fixUnreadMentionsCountIfNeeded","goToNextMention","loadNextPromise","loadNextMentions","last","getUnreadMentions","mergeHistoryResult","minId","messagesMessages","readMessages","msgIds","getHistoryStorageTransferable","historySerialized","toJSON","inputNotifyPeer","getInputNotifyPeerById","ignorePeerId","getNotifyPeerTypeSettings","getNotifySettings","isMessageIsTopMessage","threadMessage","broadcastEventName","pendingMessage","finalizePendingMessage","mutePeer","validatePeerSettings","muteUntil","mute_until","togglePeerMute","mute","canSendToPeer","canSendToUser","finalMessage","tempMessage","finalizePendingMessageCallbacks","newPhoto","newDoc","newPhotoSize","oldCacheContext","getPhotoDownloadOptions","thumbSize","polls","handleReleasingMessage","getMessageReactionsListAndReadParticipants","skipReadParticipants","skipReactionsList","emptyMessageReactionsList","canViewMessageReadParticipants","getMessageReadParticipants","appReactionsManager","getMessageReactionsList","messageReactionsList","readParticipantsPeerIds","filteredReadParticipants","readPeerId","reactionsCount","readParticipants","appConfig","getAppConfig","chat_read_mark_size_threshold","chat_read_mark_expire_period","incrementMessageViews","increment","chatPeerIds","idleStartTime","getScheduledMessageByPeer","getScheduledMessages","sendScheduledMessages","deleteScheduledMessages","getMessageWithCommentReplies","isFetchIntervalNeeded","getNewHistory","isBottomEnd","getEnds","offsetIdOffset","haveSlice","sliceMe","fulfilled","fillHistoryStorage","constructSlice","isHistoryResultEnd","topWasMeantToLoad","wasMaxId","requestHistory","deleteSlice","oldestMessage","foundSlice","_historyResult","fetchSingleMessages","fetchSingleMessagesPromise","requestPromises","getMessagesResult","getExtendedMedia","toRequest","fetchMessageReplyTo","replyToPeerId","typing","smth","deleteWebPageFromPending","updatePollToMessage","groupedStorage","albums","dispatchAlbumEdit","deletedMids","noforwards","noForwards","getElementCallback","newMap","peerIdStr","saveDefaultSendAs","convertInputKeyToKey","inputKey","AppNotificationsManager","peerSettings","notifyUsers","notifyChats","notifyBroadcasts","notifyForumTopic","checkMuteUntil","checkMuteUntilTimeout","closestMuteUntil","peerNotifySettings","typeKey","checkMuteUntilThrottled","throttle","isPeerType","notifySettings","getNotifyPeerTypePromise","getContactSignUpNotification","notifyContactsSignUp","setContactSignUpNotification","getPeerKey","getPeerMuted","getPeerLocalSettings","n","peerKey","typeNotifySettings","AppPeersManager","canPinMessage","getPeerPhoto","getUserString","getRestrictionReasonText","restriction_reason","getUserInputPeer","getUserSearchText","getDialogType","getDeleteButtonText","AppPhotosManager","photos","oldPhoto","Infinity","getUserPhotos","inputUser","photosResult","photoIds","photoId","AppPollsManager","updateMessagePoll","poll_id","saveResults","chosenIndexes","answer","chosen","getInputMediaPoll","correctAnswers","solution","solutionEntities","correct_answers","solution_entities","sendVote","optionIds","answers","option","getResults","getVotes","votesList","stopPoll","newPoll","AppPrivacyManager","privacy","updatePrivacy","rules","setPrivacy","privacyRules","inputRule","rule","getPrivacy","privacyKey","getGlobalPrivacySettings","setGlobalPrivacySettings","PEER_FULL_TTL","AppProfileManager","usersFull","chatsFull","fullExpiration","onUpdateUserTyping","getTypingsKey","typingsInPeer","t","cancelAction","getChatFull","onUpdatePeerBlocked","blocked","updateChatParticipants","updateChatParticipantAdd","_participants","updateChatParticipantDelete","updateUserTyping","updateChatUserTyping","updateChannelUserTyping","updatePeerBlocked","fullChat","updated","call_active","hasChatPhoto","chat_photo","refreshFullPeer","invalidateChannelParticipants","usersUserFull","full_user","profile_photo","botInfo","bot_info","referenceContext","description_document","description_photo","getProfileByPeerId","getCachedProfileByPeerId","getFullPhoto","profile","full_chat","getChatInviteLink","exported_invite","link","exportedInvite","getChannelParticipants","broadcast","getChannelParticipant","channelParticipant","fullChannel","processError","getMentions","processUserIds","ratingMap","cP","updateProfile","saveApiUser","uploadProfilePhoto","updateResult","strippedThumb","stripped_thumb","deletePhotos","deletedList","verifyParticipantForOnlineCount","reduceParticipantsForOnlineCount","getOnlines","chatInfo","channelParticipants","onlines","getPeerTypings","callbackifyAll","SAVE_DOC_KEYS","REFERENCE_CONTEXT","AppReactionsManager","availableReactions","getAvailableReactions","sendReactionPromises","lastSendingTimes","availableReaction","around_animation","static_icon","appear_animation","center_icon","messagesAvailableReactions","getActiveAvailableReactions","inactive","getAvailableReactionsForPeer","activeAvailableReactions","unshiftQuickReaction","getQuickReaction","quickReaction","chatAvailableReactions","filteredChatAvailableReactions","unshiftQuickReactionInner","getAvailableReactionsByMessage","isReactionActive","reactions_default","getReactionCached","getReaction","getMessagesReactions","setDefaultReaction","sendReaction","lastSendingTimeKey","unsetReactionCount","canSeeList","can_see_list","chosenReactions","unsetReactions","chosenReactionIdx","chosenReactionCount","chosenReactionsLength","reactionCountIdx","id1","id2","promiseKey","editMessageUpdateIdx","editMessageUpdate","LOCAL_IDS","EMOJI","EMOJI_ANIMATIONS","PREMIUM_GIFTS","GENERIC_ANIMATIONS","DEFAULT_STATUSES","DEFAULT_TOPIC_ICONS","LOCAL_IDS_SET","AppStickersManager","processAllStickersResult","allStickers","sets","stickerSet","videos","getStickerSetPromises","getStickersByEmoticonsPromises","sounds","getAnimatedEmojiStickerSet","getGreetingStickersPromise","getGreetingStickersTimeout","getGreetingSticker","onStickersUpdated","updateNewStickerSet","saveStickerSet","updateRecentStickers","updateFavedStickers","updateMoveStickerSetToTop","stickers","getFavedStickersStickers","getRecentStickersStickers","justPreload","getStickersByEmoticon","greetingStickers","random","saveStickers","canUseStickerSetCache","useCache","refreshTime","getStickerSet","cachedSet","getStickerSetInput","saveById","getLocalStickerSet","animations","getAnimatedEmojiSoundsPromise","emojies_sounds","sound","bytesStr","atob","file_reference_base64","charCodeAt","this_dc","getRecentStickers","recentStickers","saveRecentSticker","unsave","_doc","docEmoticon","faved","cleanEmoji","getAnimatedEmojiSticker","isAnimation","packs","getAnimatedEmojiSoundDocument","preloadAnimatedEmojiSticker","preloadEmojiPromise","preloadAnimatedEmojiStickerAnimation","animation","preloadSticker","isPremiumEffect","video_thumbs","newSet","setToCache","needSave","installed_date","getStickerSetThumbDownloadOptions","thumb_dc_id","isAnimated","mimeType","getFeaturedStickers","covered","getPromoPremiumStickers","getPremiumStickers","getFavedStickers","favedStickers","getFavedStickersLimit","faveSticker","unfave","toggleStickerSet","archived","toggleStickerSets","searchStickerSets","excludeFeatured","exclude_featured","foundSaved","cover","getAllStickers","preloadStickerSets","includeOurStickers","messagesStickers","installedSets","foundStickers","cachedStickersAnimated","cachedStickersStatic","iteratePacks","clearRecentStickers","AppUsersManager","usernames","getTopPeersPromises","contactsIndex","createSearchIndex","contactsFillPromise","contactsList","updatedContactsList","updateUsersStatuses","timestampNow","updateUserStatus","setInterval","expires","was_online","setUserToStateIfNeeded","updateUserName","contactsListCachedTime","contact","mutual_contact","pushContact","recentSearch","onContactsModified","fromServer","pushRecentSearch","clearRecentSearch","resolveUsername","resolvedPeer","processResolvedPeer","resolvePhone","popContact","getContacts","includeSaved","sortBy","_contactsList","userId1","userId2","sortName1","sortName","sortName2","localeCompare","status1","getUserStatusForSort","myUserId","testSelfSearch","getContactsPeerIds","toggleBlock","block","apiUsers","cleanedUsernames","cleanUsername","searchUsername","oldPeer","oldUser","fullName","wasContact","newContact","onContactUpdated","checkPremium","isUserOnlineVisible","getUserStatus","isRegularUser","getUserPhone","isAnonymous","fragment_prefixes","isAttachMenuBot","bot_attach_menu","support","isNonContactUser","eventTimestamp","importContact","importContacts","phones","inputContacts","j","client_id","importedContactsResult","imported","importedContact","topPeersCache","cachedTime","categories","getBlocked","contactsBlocked","getLocated","self_expires","searchContacts","my_results","curIsContact","setUserStatus","offline","updateMyOnlineStatus","addContact","addPhonePrivacyException","add_phone_privacy_exception","deleteContacts","photoTypeSet","AppWebPagesManager","webpages","pendingWebPages","updateWebPage","apiWebPage","oldWebPage","isUpdated","siteName","site_name","shortTitle","author","pendingSet","getWebPage","readBlobAsArrayBuffer","readBlobAs","fileNameRFC","escape","DownloadWriter","serviceMessagePort","getServiceMessagePort","write","chunk","saveToStorage","DownloadStorage","getFile","prepareWriting","headers","cancel","getWriter","MIN_PART_SIZE","IGNORE_ERRORS","ApiFileManager","cacheStorage","downloadStorage","downloadPromises","uploadPromises","downloadPulls","downloadActives","refreshReferencePromises","maxUploadParts","maxDownloadParts","uncompressTGS","uncompressTGV","svgIndex","__","fixFirefoxSvg","TextEncoder","convertWebp","convertOpus","webFileDcId","webfile_dc_id","upload_max_fileparts_premium","upload_max_fileparts_default","downloadRequest","activeDelta","downloadPull","downloadCheck","downloadLimit","setQueueId","getFileStorage","cancelDownload","canceled","requestWebFilePart","checkCancel","fileDownload","getDelta","checkedReference","getLimitPart","isUpload","maxParts","maxPartSize","inputFileLocation","isDownloading","getDownload","getUpload","getConvertMethod","IS_OPUS_SUPPORTED","allocateDeferredPromises","startOffset","delayed","writeDeferred","writePromise","originalMimeType","convertMethod","getDownloadFileNameFromOptions","cacheFileName","errorHandler","prepared","cachePrepared","downloadPrepared","possibleSize","_errorHandler","writer","truncate","downloadFileName","readBlobAsUint8Array","isWebFile","requestPart","dispatchProgress","throttledDispatchProgress","superpuper","isFinal","getParts","replaceParts","processedResult","getDownloadMediaDetails","downloadMediaURL","downloadMediaVoid","fileSize","isBigFile","partSize","totalParts","fileId","resultInputFile","parts","md5_checksum","resolved","it","_part","doneParts","file_id","file_part","file_total_parts","fileUpload","generator","ApiManagerMethods","apiPromisesSingleProcess","apiPromisesSingle","apiPromisesCacheable","afterMessageIdTemp","setUserAuth","prepareTempMessageId","queryJSON","newResult","cacheKey","oldPromise","getNewPromise","newPromise","ignore_restriction_reasons","pin","folderPin","bio","topicPin","ApiManager","cachedNetworkers","cachedExportPromise","gettingNetworkers","baseDcId","afterMessageTempIds","changeTransportType","updateConfig","iterateNetworkers","getTransportType","connections","dcs","array","oldTransportType","oldObject","oldGetKey","newGetKey","info","changeNetworkerTransport","getBaseDcId","sessionStorage","setBaseDcId","userAuth","dcID","user_auth","wasDcId","getNetworker","setOnDrainIfNeeded","dc","logOut","loggingOut","storageKeys","storageResult","logoutPromises","ignoreErrors","toggleStorages","generateNetworkerGetKey","networkers","maxNetworkers","found","isOnline","ak","authKeyHex","serverSaltHex","authKey","bytesFromHex","authKeyId","serverSalt","authorizer","_error","newTransportType","removeTransport","stack","getNetworkerVoid","oldTransport","changeTransport","onNetworkerDrain","onDrain","removeNetworker","isFileNetworker","canRelease","setDrainTimeout","updatesProcessor","cachedNetworker","startTime","isStopped","performRequest","wrapApiCall","exportResolve","exportReject","exportedAuth","newDcId","unsetConnectionInited","rawError","waitTime","floodMaxTimeout","attachPromise","originalError","PeersStorage","neededPeers","singlePeerMap","thumbFullSize","ThumbsStorage","thumbsCache","intToUint","ulongFromInts","high","low","shiftLeft","safeBigInt","ulongBigInt","pow","longBigInt","divide","bigIntFromBytes","base","boolFalse","predicate","boolTrue","vector","gzipPacked","sliceMethod","TLSerialization","mtproto","startMaxLength","createBuffer","ArrayBuffer","intView","Int32Array","byteView","getArray","resultBuffer","resultInt32","subarray","getBuffer","getBytes","typed","resultArray","getOffset","checkLength","needBytes","previousBuffer","previousArray","writeInt","field","storeInt","storeBool","storeLongP","iHigh","iLow","storeLong","sLong","storeIntBytes","_bigInt","bigInt","isNegative","quotient","remainder","divmod","toJSNumber","storeDouble","Float64Array","storeString","sUTF8","unescape","storeBytes","bits","storeRawBytes","storeMethod","methodName","methodData","methods","m","flagsOffsets","param","condType","fieldBit","storeObject","paramName","itemType","schema","isBare","constructorData","TLDeserialization","readInt","fetchInt","fetchDouble","doubleView","fetchLong","ulong","greater","minus","greaterOrEquals","abs","fetchBool","fetchObject","fetchString","String","fromCharCode","decodeURIComponent","fetchBytes","fetchIntBytes","fetchRawBytes","fetchVector","fallback","checkType","constructorCmp","uncompressed","constructorsIndex","schemaFallback","int1","int2","overrideKey","isCond","formatJSONValue","jsonValue","objectValues","objectValue","setOffset","addPadding","blockSize","zeroes","blockSizeAsTotalLength","needPadding","padding","bufferConcats","delays","disconnectDelayMin","disconnectDelayMax","pingInterval","pingMaxTime","connectionTimeout","RESEND_OPTIONS","noSchedule","notContentRelated","invokeAfterMsgConstructor","networkerTempId","MTPNetworker","lastServerMessages","sentMessages","pendingMessages","pendingAcks","pendingResendReq","nextReq","checkConnectionPeriod","lastResponseTime","activeRequests","sendPingDelayDisconnect","pingDelayDisconnectDeferred","lastPingTime","disconnectDelay","round","timeoutTime","lastPingStartTime","pingId","lastPingDelayDisconnectId","wrapMtpCall","ping_id","disconnect_delay","rejectTimeout","elapsedTime","checkLongPoll","isClean","longPollPending","sleepAfter","sendLongPoll","checkConnection","clearCheckConnectionTimeout","serializer","pingMessage","generateId","seq_no","generateSeqNo","sendEncryptedRequest","toggleOffline","checkConnectionTimeout","authKeyUint8","convertToUint8Array","isFileUpload","isFileDownload","updateSession","seqNo","prevSessionId","updateSentMessage","sentMessageId","sentMessage","container","inner","innerSentMessageId","innerSentMessage","pushMessage","wrapMtpMessage","connectionInited","invokeWithLayer","initConnection","resultType","isAPI","nextReqTimeout","longPollInterval","clearPingDelayDisconnect","forceReconnectTimeout","sendingLongPoll","max_delay","wait_after","max_wait","noResponse","longPoll","delay","checkConnectionRetryAt","scheduleRequest","handleSentEncryptedRequestHTTP","noResponseMsgs","sqrt","pushResend","shouldResolve","onDrainTimeout","willChange","onConnectionStatusChange","innerMsgId","acked","getMsgKey","dataWithPadding","x","msgKeyLargePlain","msgKeyLarge","getAesKeyIv","msgKey","sha2aText","sha2bText","aesKey","aesIv","sha2a","sha2b","akStopped","performScheduledRequest","ackMsgIds","msg_ids","pendingResendReqLength","outMessage","messagesByteLen","hasApiCall","hasHttpWait","lengthOverflow","compare","messageByteLength","generateContainerMessage","messageWithBody","innerMessages","getEncryptedMessage","keyIv","getDecryptedMessage","encryptedData","getEncryptedOutput","dataBuffer","paddingLength","encryptedResult","requestData","baseError","responseBuffer","deserializer","bytesCmp","calcMsgKey","totalLength","messageBodyLength","messageBody","mt_message","seqno","mt_rpc_result","req_msg_id","applyServerSalt","newServerSalt","toArray","ackMessage","reqResend","notEmpty","processMessageAck","error_message","error_code","msg","applyServerTime","serverTime","shiftRight","innerMessage","new_server_salt","bad_msg_id","changedTimeOffset","badMessage","first_msg_id","server_salt","answer_msg_id","lastResendReq","lastResend","pendingResend","reqMsgId","badMsgId","pos","NetworkerFactory","startAll","stoppedNetworkers","stopAll","setLanguage","testPublicKeysHex","modulus","exponent","publisKeysHex","publicKeysParsed","preparePromise","prepare","keyParsed","RSAPublicKey","fingerprintBytes","fingerprints","fingerprintHex","fill","foundKey","fingerprint","bytesXor","bytes1","bytes2","Authorizer","sendPlainRequest","requestArray","requestLength","headerArray","errorCode","auth_key_id","msg_len","sendReqPQ","nonce","rsaKeysManager","serverNonce","server_nonce","pq","server_public_key_fingerprints","publicKey","pAndQ","sendReqDhParams","newNonce","p_q_inner_data_dc","new_nonce","pQInnerDataSerialization","dataPadReversed","keyAesEncrypted","tempKey","dataWithHash","aesEncrypted","keyAesEncryptedBigInt","publicKeyModulusBigInt","getKeyAesEncrypted","req_DH_params","public_key_fingerprint","encrypted_data","requestBytes","newNonceHash","new_nonce_hash","decryptServerDhDataAnswer","encrypted_answer","sendSetClientDhParams","encryptedAnswer","localTime","tmpAesKey","tmpAesIv","answerWithHash","answerWithPadding","g","dhPrime","dh_prime","gA","g_a","server_time","retry","verifyDhParams","dhPrimeHex","gABigInt","dhPrimeBigInt","subtract","twoPow","gBytes","gB","retry_id","authKeyHash","authKeyAux","newNonceHash1","new_nonce_hash1","newNonceHash2","new_nonce_hash2","newNonceHash3","new_nonce_hash3","getTransportTypePromise","_try","TimeManager","lastMessageId","timeOffset","timeTicks","newTimeOffset","changed","server_time_offset","AppWebDocsManager","webDocument","AppPaymentsManager","getInputInvoiceBySlug","getInputInvoiceByPeerId","getPaymentForm","invoice","paymentForm","getPaymentReceipt","validateRequestedInfo","sendPaymentForm","formId","requestedInfoId","shippingOptionId","credentials","tipAmount","form_id","requested_info_id","shipping_option_id","tip_amount","clearSavedInfo","AppAttachMenuBotsManager","attachMenuBots","attachMenuBotsArr","onUpdateAttachMenuBots","getAttachMenuBots","updateAttachMenuBots","saveAttachMenuBot","attachMenuBot","bot_id","icon","getAttachMenuBotIcon","saveAttachMenuBots","getAttachMenuBotCached","requestWebView","fromBotMenu","themeParams","from_bot_menu","theme_params","prolongWebView","AppSeamlessLoginManager","requestUrlAuth","buttonId","button_id","urlAuthResult","acceptUrlAuth","writeAllowed","write_allowed","getWebAuthorizations","webAuthorizations","authorizations","resetWebAuthorization","resetWebAuthorizations","appManagersManager","cryptoWorkersURLs","cryptoPortsAttached","cryptoPortPromise","getManagers","manager","apply","ports","originalUrl","newURLs","createManagers","appAvatarsManager","appCallsManager","appPrivacyManager","appInlineBotsManager","passwordManager","appPaymentsManager","appSeamlessLoginManager","_serviceMessagePort","_isServiceWorkerOnline","pushedKeys","clearWrite","invokeExceptSource","serviceWorkerOnline","serviceWorkerPort","detachPort","attachPort","messagePort","onConnect","onDisconnect","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","listenMessagePort","NULL_PEER_ID","REPLIES_PEER_ID","REPLIES_HIDDEN_CHANNEL_ID","SERVICE_PEER_ID","MUTE_UNTIL","MAX_FILE_SAVE_SIZE","THUMB_TYPE_FULL","ATTACH_MENU_BOT_ICON_NAME","GENERAL_TOPIC_ID","T_ME_PREFIXES","FOLDER_ID_ALL","FOLDER_ID_ARCHIVE","REAL_FOLDERS","START_LOCAL_ID","ALPHA_CHARS_REG_EXP","ALPHA_NUMERIC_REG_EXP","URL_ALPHANUMERIC_REG_EXP_PART","URL_PROTOCOL_REG_EXP_PART","URL_REG_EXP","URL_ANY_PROTOCOL_REG_EXP","USERNAME_REG_EXP","BOT_COMMAND_REG_EXP","FULL_REG_EXP","EMAIL_REG_EXP","MARKDOWN_REG_EXP","MARKDOWN_ENTITIES","PASS_CONFLICTING_ENTITIES","PHONE_NUMBER_REG_EXP","encodeEmoji","emojiText","unicodeSurrogates","points","char","previous","toCodePoints","removeVS16s","vs16RegExp","zeroWidthJoiner","rawEmoji","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","__webpack_exports__","O","chunkIds","fn","priority","notFulfilled","getter","__esModule","definition","enumerable","chunkId","miniCssF","globalThis","Function","prop","Symbol","toStringTag","nmd","paths","children","scriptUrl","importScripts","currentScript","src","scripts","getElementsByTagName","oldGetScript","oldLoadScript","queryMap","countMap","retries","realSrc","cacheBust","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime"],"sourceRoot":""} \ No newline at end of file diff --git a/public/report.html b/public/report.html index 5bc225366..2b8e425fa 100644 --- a/public/report.html +++ b/public/report.html @@ -3,7 +3,7 @@ - tweb [17 Jan 2023 at 11:22] + tweb [17 Jan 2023 at 23:29] diff --git a/public/sw.e5e5d5146fea89f484d2.chunk.js b/public/sw.33885da34018d6fb111e.chunk.js similarity index 99% rename from public/sw.e5e5d5146fea89f484d2.chunk.js rename to public/sw.33885da34018d6fb111e.chunk.js index df95d9413..b44326514 100644 --- a/public/sw.e5e5d5146fea89f484d2.chunk.js +++ b/public/sw.33885da34018d6fb111e.chunk.js @@ -1,2 +1,2 @@ (()=>{"use strict";var e,t,n={410:(e,t,n)=>{n.d(t,{GO:()=>r,ZP:()=>i});const o=n(1267).Z.debug,r="undefined"!=typeof window?window:self,i=o},4762:(e,t,n)=>{n.d(t,{IS_FIREFOX:()=>s,IS_SAFARI:()=>i});var o=n(6761);const r=navigator?navigator.userAgent:null,i=(navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),navigator.userAgent.toLowerCase().indexOf("android"),/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&o.Z.MSStream,!!("safari"in o.Z)||!(!r||!(/\b(iPad|iPhone|iPod)\b/.test(r)||r.match("Safari")&&!r.match("Chrome")))),s=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;navigator.maxTouchPoints>0&&navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i)},1352:(e,t,n)=>{n.d(t,{FK:()=>s,N5:()=>r,SU:()=>o,kC:()=>i});const o="undefined"!=typeof ServiceWorkerGlobalScope&&self instanceof ServiceWorkerGlobalScope,r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&!o,i=r||o,s=()=>self.clients.matchAll({includeUncontrolled:!1,type:"window"}),a=(e,...t)=>{try{e.postMessage(...t)}catch(e){console.error("[worker] postMessage error:",e,t)}},c=(e,...t)=>{s().then((n=>{n.length&&n.slice(e?0:-1).forEach((e=>{a(e,...t)}))}))};o&&c.bind(null,!1),o&&c.bind(null,!0)},5003:(e,t,n)=>{n.d(t,{kg:()=>f,v9:()=>o});var o,r=n(410),i=n(4762),s=n(1352),a=n(5289);!function(e){e[e.None=0]="None",e[e.Error=1]="Error",e[e.Warn=2]="Warn",e[e.Log=4]="Log",e[e.Debug=8]="Debug"}(o||(o={}));const c=[o.None,o.Error,o.Warn,o.Log,o.Debug],l=!(i.IS_SAFARI||i.IS_FIREFOX),u="",h="",d=[["debug",o.Debug],["info",o.Log],["warn",o.Warn],["error",o.Error],["assert",o.Error],["trace",o.Log],["group",o.Log],["groupCollapsed",o.Log],["groupEnd",o.Log]];function f(e,t=o.Log|o.Warn|o.Error,n=!1,i=""){let g;r.ZP||n||(t=o.Error),l?i||(s.SU?i=u:s.N5&&(i=h)):i="";const p=i;i=i?`%s ${i}%s`:"%s";const m=function(...n){return t&o.Log&&console.log(i,(0,a.Z)(),e,...n)};return d.forEach((([n,o])=>{m[n]=function(...r){return t&o&&console[n](i,(0,a.Z)(),e,...r)}})),m.setPrefix=function(t){g=t,e="["+t+"]"},m.setPrefix(e),m.setLevel=function(e){t=c.slice(0,e+1).reduce(((e,t)=>e|t),0)},m.bindPrefix=function(e){return f(`${g}] [${e}`,t,n,p)},m}},1901:(e,t,n)=>{n.d(t,{Vp:()=>J,cM:()=>V,j6:()=>H});var o=n(5003);function r(e){return new Promise((t=>{setTimeout(t,e)}))}const i=self,s="cachedAssets";function a(e){return e.ok&&200===e.status}function c(e){return Promise.race([e,r(1e4).then((()=>Promise.reject()))])}function l(){}function u(){const e={isFulfilled:!1,isRejected:!1,notify:()=>{},notifyAll:(...t)=>{e.lastNotify=t,e.listeners.forEach((e=>e(...t)))},listeners:[],addNotifyListener:t=>{e.lastNotify&&t(...e.lastNotify),e.listeners.push(t)}},t=new Promise(((n,o)=>{e.resolve=e=>{t.isFulfilled||t.isRejected||(t.isFulfilled=!0,n(e))},e.reject=(...e)=>{t.isRejected||t.isFulfilled||(t.isRejected=!0,o(...e))}}));return t.catch(l).finally((()=>{t.notify=t.notifyAll=t.lastNotify=null,t.listeners.length=0,t.cancel&&(t.cancel=l)})),Object.assign(t,e),t}var h=n(6761),d=n(1267);function f(e,t=""){Array.isArray(e)||(e=[e]);const n=function(e){return-1===["image/jpeg","image/png","image/gif","image/svg+xml","image/webp","image/bmp","video/mp4","video/webm","video/quicktime","audio/ogg","audio/mpeg","audio/mp4","audio/wav","application/json","application/pdf"].indexOf(e)?"application/octet-stream":e}(t);return new Blob(e,{type:n})}class g{constructor(e,t,n){this.mimeType=e,this.size=t,this.saveFileCallback=n,this.bytes=new Uint8Array(t)}write(e,t){return n=this,o=void 0,i=function*(){const n=t+e.byteLength;if(n>this.bytes.byteLength){const e=new Uint8Array(n);e.set(this.bytes,0),this.bytes=e}this.bytes.set(e,t)},new((r=void 0)||(r=Promise))((function(e,t){function s(e){try{c(i.next(e))}catch(e){t(e)}}function a(e){try{c(i.throw(e))}catch(e){t(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(s,a)}c((i=i.apply(n,o||[])).next())}));var n,o,r,i}truncate(){this.bytes=new Uint8Array}trim(e){this.bytes=this.bytes.slice(0,e)}finalize(e=!0){const t=f(this.bytes,this.mimeType);return e&&this.saveFileCallback&&this.saveFileCallback(t),t}getParts(){return this.bytes}replaceParts(e){this.bytes=e}}var p=n(5471);class m{constructor(e){this.dbName=e,this.useStorage=!0,d.Z.test&&(this.dbName+="_test"),m.STORAGES.length&&(this.useStorage=m.STORAGES[0].useStorage),this.openDatabase(),m.STORAGES.push(this)}openDatabase(){var e;return null!==(e=this.openDbPromise)&&void 0!==e?e:this.openDbPromise=caches.open(this.dbName)}delete(e){return this.timeoutOperation((t=>t.delete("/"+e)))}deleteAll(){return caches.delete(this.dbName)}get(e){return this.timeoutOperation((t=>t.match("/"+e)))}save(e,t){return this.timeoutOperation((n=>n.put("/"+e,t)))}getFile(e,t="blob"){return this.get(e).then((e=>{if(!e)throw(0,p.Z)("NO_ENTRY_FOUND");return e[t]()}))}saveFile(e,t){t instanceof Blob||(t=f(t));const n=new Response(t,{headers:{"Content-Length":""+t.size}});return this.save(e,n).then((()=>t))}timeoutOperation(e){return this.useStorage?new Promise(((t,n)=>{return o=this,r=void 0,s=function*(){let o=!1;const r=setTimeout((()=>{n(),o=!0}),15e3);try{const n=yield this.openDatabase();if(!n)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const r=yield e(n);if(o)return;t(r)}catch(e){n(e)}clearTimeout(r)},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{c(s.next(e))}catch(e){t(e)}}function a(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var o;t.done?e(t.value):(o=t.value,o instanceof i?o:new i((function(e){e(o)}))).then(n,a)}c((s=s.apply(o,r||[])).next())}));var o,r,i,s})):Promise.reject((0,p.Z)("STORAGE_OFFLINE"))}prepareWriting(e,t,n){return{deferred:u(),getWriter:()=>new g(n,t,(t=>this.saveFile(e,t).catch((()=>t))))}}static toggleStorage(e,t){return Promise.all(this.STORAGES.map((n=>{if(n.useStorage=e,t)return e?void 0:n.deleteAll()})))}}m.STORAGES=[];const v=new Map,w=new m("cachedStreamChunks"),b="Time-Cached";setInterval((()=>w.timeoutOperation((e=>e.keys().then((t=>{const n=new Map,o=Date.now()/1e3|0;for(const e of t){const t=e.url.match(/\/(\d+?)\?/);t&&!n.has(t[1])&&n.set(t[1],e)}const r=[];for(const[t,i]of n){const n=e.match(i).then((n=>{if(+n.headers.get(b)+86400<=o)return V("will delete stream chunk:",t),e.delete(i,{ignoreSearch:!0,ignoreVary:!0})}));r.push(n)}return Promise.all(r)}))))),18e5),setInterval((()=>{const e=J();for(const[t,n]of v)if(t!==e){for(const e in n)n[e].reject();v.delete(t)}}),12e4);const y=new Map;class S{constructor(e){this.info=e,this.loadedOffsets=new Set,this.destroy=()=>{y.delete(this.id)},this.id=S.getId(e),y.set(this.id,this),this.limitPart=e.size>78643200?A:P,this.destroyDebounced=function(e,t,n=!0,o=!0){let r,i,s,a,c=!1;const u=t=>{const n=s,o=a;try{n(e.apply(null,t))}catch(e){console.error("debounce error",e),o(e)}},d=(...e)=>{i||(i=new Promise(((e,t)=>(s=e,a=t)))),r?(clearTimeout(r),c=!0,a(),i=new Promise(((e,t)=>(s=e,a=t)))):n&&(u(e),c=!1);const d=h.Z.setTimeout((()=>{!o||n&&!c||u(e),r===d&&(r=i=s=a=void 0,c=!1)}),t);return r=d,i.catch(l),i};return d.clearTimeout=()=>{r&&(h.Z.clearTimeout(r),a(),r=i=s=a=void 0,c=!1)},d.isDebounced=()=>!!r,d}(this.destroy,15e4,!1,!0)}requestFilePartFromWorker(e,t,n=!1){return o=this,r=void 0,s=function*(){const o={docId:this.id,dcId:this.info.dcId,offset:e,limit:t},r=JSON.stringify(o),i=J();let s=v.get(i);s||v.set(i,s={});let a=s[r];if(a)return a.then((e=>e.bytes));this.loadedOffsets.add(e),a=s[r]=u(),H.invoke("requestFilePart",o,void 0,i).then(a.resolve,a.reject).finally((()=>{s[r]===a&&(delete s[r],Object.keys(s).length||v.delete(i))}));const c=a.then((e=>e.bytes));return this.saveChunkToCache(c,e,t),!n&&this.preloadChunks(e,e+15*this.limitPart),c},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{c(s.next(e))}catch(e){t(e)}}function a(e){try{c(s.throw(e))}catch(e){t(e)}}function c(t){var o;t.done?e(t.value):(o=t.value,o instanceof i?o:new i((function(e){e(o)}))).then(n,a)}c((s=s.apply(o,r||[])).next())}));var o,r,i,s}requestFilePartFromCache(e,t,n){const o=this.getChunkKey(e,t);return w.getFile(o).then((e=>n?new Uint8Array:function(e){return function(e){return function(e,t){return new Promise((t=>{const n=new FileReader;n.addEventListener("loadend",(e=>{t(e.target.result)})),n.readAsArrayBuffer(e)}))}(e)}(e).then((e=>new Uint8Array(e)))}(e)),(e=>{e.type}))}requestFilePart(e,t,n){return this.requestFilePartFromCache(e,t,n).then((o=>o||this.requestFilePartFromWorker(e,t,n)))}saveChunkToCache(e,t,n){return e.then((e=>{const o=this.getChunkKey(t,n),r=new Response(e,{headers:{"Content-Length":""+e.length,"Content-Type":"application/octet-stream",[b]:""+(Date.now()/1e3|0)}});return w.save(o,r)}))}preloadChunk(e){this.loadedOffsets.has(e)||(this.loadedOffsets.add(e),this.requestFilePart(e,this.limitPart,!0))}preloadChunks(e,t){if(t>this.info.size&&(t=this.info.size),e)for(;e{n===i&&o===i+r||(e=e.slice(n-i,o-i+1));const t={"Accept-Ranges":"bytes","Content-Range":`bytes ${n}-${n+e.byteLength-1}/${this.info.size||"*"}`,"Content-Length":`${e.byteLength}`};return this.info.mimeType&&(t["Content-Type"]=this.info.mimeType),new Response(e,{status:206,statusText:"Partial Content",headers:t})}))}getChunkKey(e,t){return this.id+"?offset="+e+"&limit="+t}static get(e){var t;return null!==(t=y.get(this.getId(e)))&&void 0!==t?t:new S(e)}static getId(e){return e.location.id}}const P=524288,A=1048576;function O(e,t=2048){return e-e%t}var k=n(4762);function C(e,t){const n=Object.keys,o=typeof e;return e&&t&&"object"===o&&o===typeof t?n(e).length===n(t).length&&n(e).every((n=>C(e[n],t[n]))):e===t}class T{constructor(e){!function(e,t){if(t)for(const n in t)void 0!==t[n]&&(e[n]=t[n])}(this,e),d.Z.test&&(this.name+="_test"),this.storageIsAvailable=!0,this.log=(0,o.kg)(["IDB",e.name].join("-")),this.log("constructor"),this.openDatabase(!0),T.INSTANCES.push(this)}isAvailable(){return this.storageIsAvailable}openDatabase(e=!1){if(this.openDbPromise&&!e)return this.openDbPromise;const t=(e,t)=>{var n;const o=Array.from(e.indexNames);for(const t of o)e.deleteIndex(t);if(null===(n=t.indexes)||void 0===n?void 0:n.length)for(const n of t.indexes)e.indexNames.contains(n.indexName)||e.createIndex(n.indexName,n.keyPath,n.objectParameters)};try{var n=indexedDB.open(this.name,this.version);if(!n)return Promise.reject()}catch(e){return this.log.error("error opening db",e.message),this.storageIsAvailable=!1,Promise.reject(e)}let o=!1;return setTimeout((()=>{o||n.onerror((0,p.Z)("IDB_CREATE_TIMEOUT"))}),3e3),this.openDbPromise=new Promise(((e,r)=>{n.onsuccess=t=>{o=!0;const i=n.result;let s=!1;this.log("Opened"),i.onerror=e=>{this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),r(e)},i.onclose=e=>{this.log.error("closed:",e),!s&&this.openDatabase()},i.onabort=e=>{this.log.error("abort:",e);const t=e.target;this.openDatabase(s=!0),t.onerror&&t.onerror(e),i.close()},i.onversionchange=e=>{this.log.error("onversionchange, lol?")},e(this.db=i)},n.onerror=e=>{o=!0,this.storageIsAvailable=!1,this.log.error("Error creating/accessing IndexedDB database",e),r(e)},n.onupgradeneeded=e=>{o=!0,this.log.warn("performing idb upgrade from",e.oldVersion,"to",e.newVersion);const n=e.target,r=n.result;this.stores.forEach((e=>{if(r.objectStoreNames.contains(e.name)){const o=n.transaction.objectStore(e.name);t(o,e)}else((e,n)=>{const o=e.createObjectStore(n.name);t(o,n)})(r,e)}))}}))}static create(e){var t;return null!==(t=this.INSTANCES.find((t=>t.name===e.name)))&&void 0!==t?t:new T(e)}static closeDatabases(e){this.INSTANCES.forEach((t=>{if(e&&e===t)return;const n=t.db;n&&(n.onclose=()=>{},n.close())}))}}T.INSTANCES=[];class j{constructor(e,t){this.storeName=t,this.log=(0,o.kg)(["IDB",e.name,t].join("-")),this.idb=T.create(e)}delete(e,t){return Array.isArray(e)||(e=[].concat(e)),this.getObjectStore("readwrite",(t=>e.map((e=>t.delete(e)))),"",t)}clear(e){return this.getObjectStore("readwrite",(e=>e.clear()),"",e)}save(e,t,n){return Array.isArray(e)||(e=[].concat(e),t=[].concat(t)),this.getObjectStore("readwrite",(n=>e.map(((e,o)=>n.put(t[o],e)))),"",n)}get(e,t){return Array.isArray(e)||(e=[].concat(e)),e.length?this.getObjectStore("readonly",(t=>e.map((e=>t.get(e)))),"",t):Promise.resolve([])}getObjectStore(e,t,n,o=this.storeName){let r;return n&&(r=performance.now(),this.log(n+": start")),this.idb.openDatabase().then((i=>new Promise(((s,a)=>{const c=i.transaction([o],e),l=()=>{clearTimeout(d),a(c.error)},u=()=>{clearTimeout(d),n&&this.log(n+": end",performance.now()-r);const e=p.map((e=>e.result));s(g?e:e[0])};c.onerror=l;const h="readwrite"===e;h&&(c.oncomplete=()=>u());const d=setTimeout((()=>{this.log.error("transaction not finished",c,n)}),1e4),f=t(c.objectStore(o)),g=Array.isArray(f),p=g?f:[].concat(f);if(h)return;const m=p.length;let v=m;const w=()=>{c.error||--v||u()};for(let e=0;ee.getAll()),"",e)}}var E=function(e,t,n,o){return new(n||(n=Promise))((function(r,i){function s(e){try{c(o.next(e))}catch(e){i(e)}}function a(e){try{c(o.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}c((o=o.apply(e,t||[])).next())}))};const x=self,I=location.protocol+"//"+location.hostname+location.pathname.split("/").slice(0,-1).join("/")+"/",_=new class{constructor(e,t,n){this.defaults=n,this.cache={},this.storage=new j(e,t)}get(e){return E(this,void 0,void 0,(function*(){if(void 0!==this.cache[e])return this.cache[e];let t;try{t=yield this.storage.get(e)}catch(e){}if(void 0!==this.cache[e])return this.cache[e];if(void 0===t){const n=this.defaults[e];t="function"==typeof n?n():n}return this.cache[e]=t}))}set(e,t){var n;return E(this,void 0,void 0,(function*(){if(!C(null!==(n=this.cache[e])&&void 0!==n?n:this.defaults[e],t)){this.cache[e]=t;try{this.storage.save(e,t)}catch(e){}}}))}}({name:"tweb",version:7,stores:[{name:"session"},{name:"stickerSets"},{name:"users"},{name:"chats"},{name:"dialogs"},{name:"messages"}]},"session",{push_mute_until:0,push_lang:{push_message_nopreview:"You have a new message",push_action_mute1d:"Mute for 24H",push_action_settings:"Settings"},push_settings:{}});x.addEventListener("push",(e=>{const t=e.data.json();V("push",t);let n=!1;const o=Promise.all([_.get("push_mute_until"),x.clients.matchAll({type:"window"})]).then((e=>{const[o,r]=e;if(V("matched clients",r),n=r.length>0,n)throw"Supress notification because some instance is alive";const i=Date.now();if(L()&&o&&i{V(e)}));const r=o.then((()=>Promise.all([_.get("push_settings"),_.get("push_lang")]))).then((e=>function(e,t,n){const o="assets/img/logo_filled_rounded.png";let r,i=e.title||"Telegram",s=e.description||"";e.custom&&(r=e.custom.channel_id?""+-e.custom.channel_id:e.custom.chat_id?""+-e.custom.chat_id:e.custom.from_id||""),e.custom.peerId=""+r;let a="peer"+r;t&&t.nopreview&&(i="Telegram",s=n.push_message_nopreview,a="unknown_peer"),V("show notify",i,s,o,e);const c=[{action:"mute1d",title:n.push_action_mute1d}];return x.registration.showNotification(i,{body:s,icon:o,tag:a,data:e,actions:c}).then((e=>{var t;(null==e?void 0:e.notification)&&(t=e.notification,N.has(t)||(N.add(t),t.onclose=D))})).catch((e=>{V.error("Show notification promise",e)}))}(t,e[0],e[1]))),i=r.catch((()=>(V("Closing all notifications on push",n),L()||n?R():x.registration.showNotification("Telegram",{tag:"unknown_peer"}).then((()=>{if(n)return R();setTimeout((()=>R()),n?0:100)})).catch((e=>{V.error("Show notification error",e)})))));e.waitUntil(i)})),x.addEventListener("notificationclick",(e=>{const t=e.notification;V("On notification click: ",t.tag),t.close();const n=e.action;if("mute1d"===n&&L())return V("[SW] mute for 1d"),void _.set("push_mute_until",Date.now()+864e5);const o=t.data;if(!o)return;const r=x.clients.matchAll({type:"window"}).then((e=>{o.action=n,F=o;for(let t=0;tx.clients.openWindow(e.baseUrl||I)))})).catch((e=>{V.error("Clients.matchAll error",e)}));e.waitUntil(r)})),x.addEventListener("notificationclose",D);const N=new Set;let F;function D(e){var t;t=e.notification,N.delete(t)}function R(){for(const e of N)try{e.close()}catch(e){}let e;return e="getNotifications"in x.registration?x.registration.getNotifications({}).then((e=>{for(let t=0,n=e.length;t{V.error("Offline register SW error",e)})):Promise.resolve(),N.clear(),e}function L(){return k.IS_FIREFOX}var W=n(153),M=n(410);class q extends W.Z{constructor(){super("SERVICE"),M.GO&&(M.GO.serviceMessagePort=this)}}var Z=n(1352);const U=new Map,G=(0,p.Z)("UNKNOWN");self.downloadMap=U;const z={download:e=>{const{id:t}=e;if(U.has(t))return Promise.reject(G);const n=new CountQueuingStrategy({highWaterMark:1}),o=u();let r;o.then((()=>{setTimeout((()=>{U.delete(t)}),5e3)}),(()=>{U.delete(t)}));const i=new ReadableStream({start:e=>{r=e},cancel:e=>{o.reject(G)}},n),s=Object.assign(Object.assign({},e),{readableStream:i,promise:o,controller:r});return U.set(t,s),o.catch((()=>{throw G}))},downloadChunk:({id:e,chunk:t})=>{const n=U.get(e);return n?n.controller.enqueue(t):Promise.reject()},downloadFinalize:e=>{const t=U.get(e);return t?(t.promise.resolve(),t.controller.close()):Promise.reject()},downloadCancel:e=>{const t=U.get(e);if(t)return t.promise.reject(),t.controller.error()}};function $(e,t){const n=r(100).then((()=>{const e=U.get(t);if(!e||e.used)return;e.used=!0;const n=e.readableStream;return new Response(n,{headers:e.headers})}));e.respondWith(n)}function B(){if(U.size)for(const[e,t]of U)t.controller.error()}const V=(0,o.kg)("SW",o.v9.Error|o.v9.Debug|o.v9.Log|o.v9.Warn,!0),K=self;let X;const J=()=>X,Y=e=>{V("window connected",e.id,"windows before",te.size),"none"!==e.frameType?(V("windows",Array.from(te)),H.invokeVoid("hello",void 0,e),(e=>{te.size||X||(V("sending message port for mtproto"),(e=>{const t=new MessageChannel;H.attachPort(X=t.port1),H.invokeVoid("port",void 0,e,[t.port2])})(e))})(e),te.set(e.id,e)):V.warn("maybe a bugged Safari starting window",e.id)},H=new q;H.addMultipleEventsListeners({notificationsClear:R,toggleStorages:({enabled:e,clearWrite:t})=>{m.toggleStorage(e,t)},pushPing:(e,t)=>{!function(e,t){F&&t&&(H.invokeVoid("pushClick",F,t),F=void 0),e.lang&&_.set("push_lang",e.lang),e.settings&&_.set("push_settings",e.settings)}(e,t)},hello:(e,t)=>{Y(t)}});const{onDownloadFetch:Q,onClosedWindows:ee}=function(e){return e.addMultipleEventsListeners(z),{onDownloadFetch:$,onClosedWindows:B}}(H);(0,Z.FK)().then((e=>{V(`got ${e.length} windows from the start`),e.forEach((e=>{Y(e)}))}));const te=new Map;self.connectedWindows=te,function(e,t,n){const o=(t,n)=>{e.attachListenPort(t),n&&e.attachSendPort(n)};e.setOnPortDisconnect((e=>{V("something has disconnected",e),e instanceof WindowClient&&te.has(e.id)?(te.delete(e.id),V("window disconnected, left",te.size),te.size||(V.warn("no windows left"),X&&(H.detachPort(X),X=void 0),ee())):V.warn("it is not a window")})),"undefined"!=typeof SharedWorkerGlobalScope?h.Z.addEventListener("connect",(e=>o(e.source,e.source))):"undefined"!=typeof ServiceWorkerGlobalScope?o(h.Z,null):o(h.Z,h.Z)}(H);const ne=e=>{if(!k.IS_SAFARI&&0===e.request.url.indexOf(location.origin+"/")&&e.request.url.match(/\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\?.*)?$/))return e.respondWith(function(e){return t=this,n=void 0,r=function*(){try{const t=yield c(i.caches.open(s)),n=yield c(t.match(e.request,{ignoreVary:!0}));if(n&&a(n))return n;const o={Vary:"*"};let r=yield fetch(e.request,{headers:o});if(a(r))t.put(e.request,r.clone());else if(304===r.status){const n=e.request.url.replace(/\?.+$/,"")+"?"+(1e5*Math.random()|0);r=yield fetch(n,{headers:o}),a(r)&&t.put(e.request,r.clone())}return r}catch(t){return fetch(e.request)}},new((o=void 0)||(o=Promise))((function(e,i){function s(e){try{c(r.next(e))}catch(e){i(e)}}function a(e){try{c(r.throw(e))}catch(e){i(e)}}function c(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(s,a)}c((r=r.apply(t,n||[])).next())}));var t,n,o,r}(e));try{const[t,n]=e.request.url.split("/").slice(-2);switch(t){case"stream":!function(e,t){const n=function(e){if(!e)return[0,0];const[,t]=e.split("="),n=t.split(", "),[o,r]=n[0].split("-");return[+o,+r||0]}(e.request.headers.get("Range")),o=JSON.parse(decodeURIComponent(t)),r=S.get(o);e.respondWith(Promise.race([(45e3,new Promise((e=>{setTimeout((()=>{e(new Response("",{status:408,statusText:"Request timed out."}))}),45e3)}))),r.requestRange(n)]))}(e,n);break;case"download":Q(e,n);break;case"ping":e.respondWith(new Response("pong"))}}catch(t){V.error("fetch error",t),e.respondWith(new Response("",{status:500,statusText:"Internal Server Error",headers:{"Cache-Control":"no-cache"}}))}},oe=()=>{K.onfetch=ne};K.addEventListener("install",(e=>{V("installing"),e.waitUntil(K.skipWaiting().then((()=>V("skipped waiting"))))})),K.addEventListener("activate",(e=>{V("activating",K),e.waitUntil(K.caches.delete(s).then((()=>V("cleared assets cache")))),e.waitUntil(K.clients.claim().then((()=>V("claimed clients"))))})),K.onoffline=K.ononline=oe,oe()}},o={};function r(e){var t=o[e];if(void 0!==t)return t.exports;var i=o[e]={exports:{}};return n[e](i,i.exports,r),i.exports}r.m=n,r.x=()=>{var e=r.O(void 0,[85],(()=>r(1901)));return r.O(e)},e=[],r.O=(t,n,o,i)=>{if(!n){var s=1/0;for(u=0;u=i)&&Object.keys(r.O).every((e=>r.O[e](n[c])))?n.splice(c--,1):(a=!1,i0&&e[u-1][2]>i;u--)e[u]=e[u-1];e[u]=[n,o,i]},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce(((t,n)=>(r.f[n](e,t),t)),[])),r.u=e=>e+".952a9f12a6b3dcdd3f0e.bundle.js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e;r.g.importScripts&&(e=r.g.location+"");var t=r.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var n=t.getElementsByTagName("script");n.length&&(e=n[n.length-1].src)}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),r.p=e})(),(()=>{if(void 0!==r){var e=r.u,t=r.e,n={},o={};r.u=function(t){return e(t)+(n.hasOwnProperty(t)?"?"+n[t]:"")},r.e=function(i){return t(i).catch((function(t){var s=o.hasOwnProperty(i)?o[i]:999999;if(s<1){var a=e(i);throw t.message="Loading chunk "+i+" failed after 999999 retries.\n("+a+")",t.request=a,t}return new Promise((function(e){setTimeout((function(){var t=Date.now();n[i]=t,o[i]=s-1,e(r.e(i))}),3e3)}))}))}}})(),(()=>{var e={670:1};r.f.i=(t,n)=>{e[t]||importScripts(r.p+r.u(t))};var t=this.webpackChunktweb=this.webpackChunktweb||[],n=t.push.bind(t);t.push=t=>{var[o,i,s]=t;for(var a in i)r.o(i,a)&&(r.m[a]=i[a]);for(s&&s(r);o.length;)e[o.pop()]=1;n(t)}})(),t=r.x,r.x=()=>r.e(85).then(t),r.x()})(); -//# sourceMappingURL=sw.e5e5d5146fea89f484d2.chunk.js.map \ No newline at end of file +//# sourceMappingURL=sw.33885da34018d6fb111e.chunk.js.map \ No newline at end of file diff --git a/public/sw.e5e5d5146fea89f484d2.chunk.js.map b/public/sw.33885da34018d6fb111e.chunk.js.map similarity index 99% rename from public/sw.e5e5d5146fea89f484d2.chunk.js.map rename to public/sw.33885da34018d6fb111e.chunk.js.map index c472a7ae1..1da6cd8c5 100644 --- a/public/sw.e5e5d5146fea89f484d2.chunk.js.map +++ b/public/sw.33885da34018d6fb111e.chunk.js.map @@ -1 +1 @@ -{"version":3,"file":"sw.e5e5d5146fea89f484d2.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/lib/serviceWorker/cache.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/lib/files/memoryWriter.ts","webpack://tweb/./src/lib/files/cacheStorage.ts","webpack://tweb/./src/lib/serviceWorker/stream.ts","webpack://tweb/./src/helpers/schedulers/debounce.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/helpers/object/deepEqual.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/helpers/object/safeAssign.ts","webpack://tweb/./src/lib/serviceWorker/push.ts","webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/lib/serviceWorker/serviceMessagePort.ts","webpack://tweb/./src/lib/serviceWorker/download.ts","webpack://tweb/./src/lib/serviceWorker/index.service.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/serviceWorker/timeout.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn __webpack_require__.e(85).then(next);\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// в SW может быть сразу две переменных TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n underscore: '\\x1b[4m',\n blink: '\\x1b[5m',\n reverse: '\\x1b[7m',\n hidden: '\\x1b[8m',\n // Foreground (text) colors\n fg: {\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m'\n },\n // Background colors\n bg: {\n black: '\\x1b[40m',\n red: '\\x1b[41m',\n green: '\\x1b[42m',\n yellow: '\\x1b[43m',\n blue: '\\x1b[44m',\n magenta: '\\x1b[45m',\n cyan: '\\x1b[46m',\n white: '\\x1b[47m'\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n ['debug', LogTypes.Debug],\n ['info', LogTypes.Log],\n ['warn', LogTypes.Warn],\n ['error', LogTypes.Error],\n ['assert', LogTypes.Error],\n ['trace', LogTypes.Log],\n ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n const originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n // level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","export default function pause(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pause from '../../helpers/schedulers/pause';\n\nconst ctx = self as any as ServiceWorkerGlobalScope;\nexport const CACHE_ASSETS_NAME = 'cachedAssets';\n\nfunction isCorrectResponse(response: Response) {\n return response.ok && response.status === 200;\n}\n\nfunction timeoutRace>(promise: T) {\n return Promise.race([\n promise,\n pause(10000).then(() => Promise.reject())\n ]);\n}\n\nexport async function requestCache(event: FetchEvent) {\n try {\n // const cache = await ctx.caches.open(CACHE_ASSETS_NAME);\n const cache = await timeoutRace(ctx.caches.open(CACHE_ASSETS_NAME));\n const file = await timeoutRace(cache.match(event.request, {ignoreVary: true}));\n\n if(file && isCorrectResponse(file)) {\n return file;\n }\n\n const headers: HeadersInit = {'Vary': '*'};\n let response = await fetch(event.request, {headers});\n if(isCorrectResponse(response)) {\n cache.put(event.request, response.clone());\n } else if(response.status === 304) { // possible fix for 304 in Safari\n const url = event.request.url.replace(/\\?.+$/, '') + '?' + (Math.random() * 100000 | 0);\n response = await fetch(url, {headers});\n if(isCorrectResponse(response)) {\n cache.put(event.request, response.clone());\n }\n }\n\n return response;\n } catch(err) {\n return fetch(event.request);\n }\n}\n","export default function noop() {}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from './noop';\n\nexport interface CancellablePromise extends Promise {\n resolve?: (value: T) => void,\n reject?: (...args: any[]) => void,\n cancel?: (reason?: any) => void,\n\n notify?: (...args: any[]) => void,\n notifyAll?: (...args: any[]) => void,\n lastNotify?: any,\n listeners?: Array<(...args: any[]) => void>,\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\n\n isFulfilled?: boolean,\n isRejected?: boolean\n}\n\nexport default function deferredPromise() {\n const deferredHelper: any = {\n isFulfilled: false,\n isRejected: false,\n\n notify: () => {},\n notifyAll: (...args: any[]) => {\n deferredHelper.lastNotify = args;\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\n },\n\n listeners: [],\n addNotifyListener: (callback: (...args: any[]) => void) => {\n if(deferredHelper.lastNotify) {\n callback(...deferredHelper.lastNotify);\n }\n\n deferredHelper.listeners.push(callback);\n }\n };\n\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\n deferredHelper.resolve = (value: T) => {\n if(deferred.isFulfilled || deferred.isRejected) return;\n\n deferred.isFulfilled = true;\n resolve(value);\n };\n\n deferredHelper.reject = (...args: any[]) => {\n if(deferred.isRejected || deferred.isFulfilled) return;\n\n deferred.isRejected = true;\n reject(...args);\n };\n });\n\n // @ts-ignore\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\n const n = deferredPromise>();\n\n }; */\n\n deferred.catch(noop).finally(() => {\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\n deferred.listeners.length = 0;\n\n if(deferred.cancel) {\n deferred.cancel = noop;\n }\n });\n\n Object.assign(deferred, deferredHelper);\n\n return deferred;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport blobSafeMimeType from './blobSafeMimeType';\n\nexport default function blobConstruct(blobParts: Array | T, mimeType: string = ''): Blob {\n if(!Array.isArray(blobParts)) {\n blobParts = [blobParts];\n }\n\n const safeMimeType = blobSafeMimeType(mimeType);\n const blob = new Blob(blobParts, {type: safeMimeType});\n return blob;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'audio/wav', // though it is not in list\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport StreamWriter from './streamWriter';\n\nexport default class MemoryWriter implements StreamWriter {\n private bytes: Uint8Array;\n\n constructor(\n private mimeType: string,\n private size: number,\n private saveFileCallback?: (blob: Blob) => Promise\n ) {\n this.bytes = new Uint8Array(size);\n }\n\n public async write(part: Uint8Array, offset: number) {\n // sometimes file size can be bigger than the prov\n const endOffset = offset + part.byteLength;\n if(endOffset > this.bytes.byteLength) {\n const newBytes = new Uint8Array(endOffset);\n newBytes.set(this.bytes, 0);\n this.bytes = newBytes;\n }\n\n this.bytes.set(part, offset);\n };\n\n public truncate() {\n this.bytes = new Uint8Array();\n }\n\n public trim(size: number) {\n this.bytes = this.bytes.slice(0, size);\n }\n\n public finalize(saveToStorage = true) {\n const blob = blobConstruct(this.bytes, this.mimeType);\n\n if(saveToStorage && this.saveFileCallback) {\n this.saveFileCallback(blob);\n }\n\n return blob;\n }\n\n public getParts() {\n return this.bytes;\n }\n\n public replaceParts(parts: Uint8Array) {\n this.bytes = parts;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from '../../config/modes';\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport MemoryWriter from './memoryWriter';\nimport FileManager from './memoryWriter';\nimport FileStorage from './fileStorage';\nimport makeError from '../../helpers/makeError';\nimport deferredPromise from '../../helpers/cancellablePromise';\n\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\n\nexport default class CacheStorageController implements FileStorage {\n private static STORAGES: CacheStorageController[] = [];\n private openDbPromise: Promise;\n\n private useStorage = true;\n\n // private log: ReturnType = logger('CS');\n\n constructor(private dbName: CacheStorageDbName) {\n if(Modes.test) {\n this.dbName += '_test';\n }\n\n if(CacheStorageController.STORAGES.length) {\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\n }\n\n this.openDatabase();\n CacheStorageController.STORAGES.push(this);\n }\n\n private openDatabase(): Promise {\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\n }\n\n public delete(entryName: string) {\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\n }\n\n public deleteAll() {\n return caches.delete(this.dbName);\n }\n\n public get(entryName: string) {\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\n }\n\n public save(entryName: string, response: Response) {\n // return new Promise((resolve) => {}); // DEBUG\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\n }\n\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\n /* if(method === 'blob') {\n return Promise.reject();\n } */\n\n // const str = `get fileName: ${fileName}`;\n // console.time(str);\n return this.get(fileName).then((response) => {\n if(!response) {\n // console.warn('getFile:', response, fileName);\n throw makeError('NO_ENTRY_FOUND');\n }\n\n const promise = response[method]();\n // promise.then(() => {\n // console.timeEnd(str);\n // });\n return promise;\n });\n }\n\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // return Promise.resolve(blobConstruct([blob]));\n if(!(blob instanceof Blob)) {\n blob = blobConstruct(blob);\n }\n\n const response = new Response(blob, {\n headers: {\n 'Content-Length': '' + blob.size\n }\n });\n\n return this.save(fileName, response).then(() => blob as Blob);\n }\n\n public timeoutOperation(callback: (cache: Cache) => Promise) {\n if(!this.useStorage) {\n return Promise.reject(makeError('STORAGE_OFFLINE'));\n }\n\n return new Promise(async(resolve, reject) => {\n let rejected = false;\n const timeout = setTimeout(() => {\n reject();\n // console.warn('CACHESTORAGE TIMEOUT');\n rejected = true;\n }, 15e3);\n\n try {\n const cache = await this.openDatabase();\n if(!cache) {\n this.useStorage = false;\n this.openDbPromise = undefined;\n throw 'no cache?';\n }\n\n const res = await callback(cache);\n\n if(rejected) return;\n resolve(res);\n } catch(err) {\n reject(err);\n }\n\n clearTimeout(timeout);\n });\n }\n\n public prepareWriting(fileName: string, fileSize: number, mimeType: string) {\n return {\n deferred: deferredPromise(),\n getWriter: () => {\n const writer = new MemoryWriter(mimeType, fileSize, (blob) => {\n return this.saveFile(fileName, blob).catch(() => blob);\n });\n\n return writer;\n }\n };\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n return storage.deleteAll();\n }\n }));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAsUint8Array from '../../helpers/blob/readBlobAsUint8Array';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {InputFileLocation} from '../../layer';\nimport CacheStorageController from '../files/cacheStorage';\nimport {DownloadOptions, MyUploadFile} from '../mtproto/apiFileManager';\nimport {getMtprotoMessagePort, log, serviceMessagePort} from './index.service';\nimport {ServiceRequestFilePartTaskPayload} from './serviceMessagePort';\nimport timeout from './timeout';\n\nconst deferredPromises: Map}> = new Map();\nconst cacheStorage = new CacheStorageController('cachedStreamChunks');\nconst CHUNK_TTL = 86400;\nconst CHUNK_CACHED_TIME_HEADER = 'Time-Cached';\nconst USE_CACHE = true;\n\nconst clearOldChunks = () => {\n return cacheStorage.timeoutOperation((cache) => {\n return cache.keys().then((requests) => {\n const filtered: Map = new Map();\n const timestamp = Date.now() / 1000 | 0;\n for(const request of requests) {\n const match = request.url.match(/\\/(\\d+?)\\?/);\n if(match && !filtered.has(match[1])) {\n filtered.set(match[1], request);\n }\n }\n\n const promises: Promise[] = [];\n for(const [id, request] of filtered) {\n const promise = cache.match(request).then((response) => {\n if((+response.headers.get(CHUNK_CACHED_TIME_HEADER) + CHUNK_TTL) <= timestamp) {\n log('will delete stream chunk:', id);\n return cache.delete(request, {ignoreSearch: true, ignoreVary: true});\n }\n });\n\n promises.push(promise);\n }\n\n return Promise.all(promises);\n });\n });\n};\n\nsetInterval(clearOldChunks, 1800e3);\nsetInterval(() => {\n const mtprotoMessagePort = getMtprotoMessagePort();\n for(const [messagePort, promises] of deferredPromises) {\n if(messagePort !== mtprotoMessagePort) {\n for(const taskId in promises) {\n const promise = promises[taskId];\n promise.reject();\n }\n\n deferredPromises.delete(messagePort);\n }\n }\n}, 120e3);\n\ntype StreamRange = [number, number];\ntype StreamId = DocId;\nconst streams: Map = new Map();\nclass Stream {\n private destroyDebounced: () => void;\n private id: StreamId;\n private limitPart: number;\n private loadedOffsets: Set = new Set();\n\n constructor(private info: DownloadOptions) {\n this.id = Stream.getId(info);\n streams.set(this.id, this);\n\n // ! если грузить очень большое видео чанками по 512Кб в мобильном Safari, то стрим не запустится\n this.limitPart = info.size > (75 * 1024 * 1024) ? STREAM_CHUNK_UPPER_LIMIT : STREAM_CHUNK_MIDDLE_LIMIT;\n this.destroyDebounced = debounce(this.destroy, 150000, false, true);\n }\n\n private destroy = () => {\n streams.delete(this.id);\n };\n\n private async requestFilePartFromWorker(alignedOffset: number, limit: number, fromPreload = false) {\n const payload: ServiceRequestFilePartTaskPayload = {\n docId: this.id,\n dcId: this.info.dcId,\n offset: alignedOffset,\n limit\n };\n\n const taskId = JSON.stringify(payload);\n\n const mtprotoMessagePort = getMtprotoMessagePort();\n let promises = deferredPromises.get(mtprotoMessagePort);\n if(!promises) {\n deferredPromises.set(mtprotoMessagePort, promises = {});\n }\n\n let deferred = promises[taskId];\n if(deferred) {\n return deferred.then((uploadFile) => uploadFile.bytes);\n }\n\n this.loadedOffsets.add(alignedOffset);\n\n deferred = promises[taskId] = deferredPromise();\n\n serviceMessagePort.invoke('requestFilePart', payload, undefined, mtprotoMessagePort)\n .then(deferred.resolve, deferred.reject).finally(() => {\n if(promises[taskId] === deferred) {\n delete promises[taskId];\n\n if(!Object.keys(promises).length) {\n deferredPromises.delete(mtprotoMessagePort);\n }\n }\n });\n\n const bytesPromise = deferred.then((uploadFile) => uploadFile.bytes);\n\n if(USE_CACHE) {\n this.saveChunkToCache(bytesPromise, alignedOffset, limit);\n !fromPreload && this.preloadChunks(alignedOffset, alignedOffset + (this.limitPart * 15));\n }\n\n return bytesPromise;\n }\n\n private requestFilePartFromCache(alignedOffset: number, limit: number, fromPreload?: boolean) {\n if(!USE_CACHE) {\n return Promise.resolve();\n }\n\n const key = this.getChunkKey(alignedOffset, limit);\n return cacheStorage.getFile(key).then((blob: Blob) => {\n return fromPreload ? new Uint8Array() : readBlobAsUint8Array(blob);\n }, (error: ApiError) => {\n if(error.type === 'NO_ENTRY_FOUND') {\n return;\n }\n });\n }\n\n private requestFilePart(alignedOffset: number, limit: number, fromPreload?: boolean) {\n return this.requestFilePartFromCache(alignedOffset, limit, fromPreload).then((bytes) => {\n return bytes || this.requestFilePartFromWorker(alignedOffset, limit, fromPreload);\n });\n }\n\n private saveChunkToCache(deferred: Promise, alignedOffset: number, limit: number) {\n return deferred.then((bytes) => {\n const key = this.getChunkKey(alignedOffset, limit);\n const response = new Response(bytes, {\n headers: {\n 'Content-Length': '' + bytes.length,\n 'Content-Type': 'application/octet-stream',\n [CHUNK_CACHED_TIME_HEADER]: '' + (Date.now() / 1000 | 0)\n }\n });\n\n return cacheStorage.save(key, response);\n });\n }\n\n private preloadChunk(offset: number) {\n if(this.loadedOffsets.has(offset)) {\n return;\n }\n\n this.loadedOffsets.add(offset);\n this.requestFilePart(offset, this.limitPart, true);\n }\n\n private preloadChunks(offset: number, end: number) {\n if(end > this.info.size) {\n end = this.info.size;\n }\n\n if(!offset) { // load last chunk for bounds\n this.preloadChunk(alignOffset(offset, this.limitPart));\n } else { // don't preload next chunks before the start\n for(; offset < end; offset += this.limitPart) {\n this.preloadChunk(offset);\n }\n }\n }\n\n public requestRange(range: StreamRange) {\n this.destroyDebounced();\n\n const possibleResponse = responseForSafariFirstRange(range, this.info.mimeType, this.info.size);\n if(possibleResponse) {\n return possibleResponse;\n }\n\n let [offset, end] = range;\n\n /* if(info.size > limitPart && isSafari && offset === limitPart) {\n //end = info.size - 1;\n //offset = info.size - 1 - limitPart;\n offset = info.size - (info.size % limitPart);\n } */\n\n const limit = end && end < this.limitPart ? alignLimit(end - offset + 1) : this.limitPart;\n const alignedOffset = alignOffset(offset, limit);\n\n if(!end) {\n end = Math.min(offset + limit, this.info.size - 1);\n }\n\n return this.requestFilePart(alignedOffset, limit).then((ab) => {\n // log.debug('[stream] requestFilePart result:', result);\n\n // if(isSafari) {\n if(offset !== alignedOffset || end !== (alignedOffset + limit)) {\n ab = ab.slice(offset - alignedOffset, end - alignedOffset + 1);\n }\n\n const headers: Record = {\n 'Accept-Ranges': 'bytes',\n 'Content-Range': `bytes ${offset}-${offset + ab.byteLength - 1}/${this.info.size || '*'}`,\n 'Content-Length': `${ab.byteLength}`\n };\n\n if(this.info.mimeType) {\n headers['Content-Type'] = this.info.mimeType;\n }\n\n // simulate slow connection\n // setTimeout(() => {\n return new Response(ab, {\n status: 206,\n statusText: 'Partial Content',\n headers\n });\n // }, 2.5e3);\n });\n }\n\n private getChunkKey(alignedOffset: number, limit: number) {\n return this.id + '?offset=' + alignedOffset + '&limit=' + limit;\n }\n\n public static get(info: DownloadOptions) {\n return streams.get(this.getId(info)) ?? new Stream(info);\n }\n\n private static getId(info: DownloadOptions) {\n return (info.location as InputFileLocation.inputDocumentFileLocation).id;\n }\n}\n\nexport default function onStreamFetch(event: FetchEvent, params: string) {\n const range = parseRange(event.request.headers.get('Range'));\n const info: DownloadOptions = JSON.parse(decodeURIComponent(params));\n const stream = Stream.get(info);\n\n // log.debug('[stream]', url, offset, end);\n\n event.respondWith(Promise.race([\n timeout(45 * 1000),\n stream.requestRange(range)\n ]));\n}\n\nfunction responseForSafariFirstRange(range: StreamRange, mimeType: string, size: number): Response {\n if(range[0] === 0 && range[1] === 1) {\n return new Response(new Uint8Array(2).buffer, {\n status: 206,\n statusText: 'Partial Content',\n headers: {\n 'Accept-Ranges': 'bytes',\n 'Content-Range': `bytes 0-1/${size || '*'}`,\n 'Content-Length': '2',\n 'Content-Type': mimeType || 'video/mp4'\n }\n });\n }\n\n return null;\n}\n\n/* const STREAM_CHUNK_UPPER_LIMIT = 256 * 1024;\nconst SMALLEST_CHUNK_LIMIT = 256 * 4; */\n/* const STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\nconst SMALLEST_CHUNK_LIMIT = 1024 * 4; */\nconst STREAM_CHUNK_MIDDLE_LIMIT = 512 * 1024;\nconst STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\nconst SMALLEST_CHUNK_LIMIT = 512 * 4;\n\nfunction parseRange(header: string): StreamRange {\n if(!header) return [0, 0];\n const [, chunks] = header.split('=');\n const ranges = chunks.split(', ');\n const [offset, end] = ranges[0].split('-');\n\n return [+offset, +end || 0];\n}\n\nfunction alignOffset(offset: number, base = SMALLEST_CHUNK_LIMIT) {\n return offset - (offset % base);\n}\n\nfunction alignLimit(limit: number) {\n return 2 ** Math.ceil(Math.log(limit) / Math.log(2));\n}\n","// * Jolly Cobra's schedulers\n\nimport ctx from '../../environment/ctx';\nimport {AnyFunction, Awaited} from '../../types';\nimport noop from '../noop';\n\nexport type DebounceReturnType = {\n (...args: Parameters): Promise>>;\n clearTimeout(): void;\n isDebounced(): boolean;\n};\n\nexport default function debounce(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true\n): DebounceReturnType {\n let waitingTimeout: number;\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\n let hadNewCall = false;\n\n const invoke = (args: Parameters) => {\n const _resolve = resolve, _reject = reject;\n try {\n const result = fn.apply(null, args);\n _resolve(result);\n } catch(err) {\n console.error('debounce error', err);\n // @ts-ignore\n _reject(err);\n }\n };\n\n const debounce = (...args: Parameters) => {\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\n\n if(waitingTimeout) {\n clearTimeout(waitingTimeout);\n hadNewCall = true;\n reject();\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\n } else if(shouldRunFirst) {\n invoke(args);\n hadNewCall = false;\n }\n\n const _waitingTimeout = ctx.setTimeout(() => {\n // will run if should run last or first but with new call\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\n invoke(args);\n }\n\n // if debounce was called during invoking\n if(waitingTimeout === _waitingTimeout) {\n waitingTimeout = waitingPromise = resolve = reject = undefined;\n hadNewCall = false;\n }\n }, ms);\n\n waitingTimeout = _waitingTimeout;\n waitingPromise.catch(noop);\n return waitingPromise;\n };\n\n debounce.clearTimeout = () => {\n if(waitingTimeout) {\n ctx.clearTimeout(waitingTimeout);\n reject();\n waitingTimeout = waitingPromise = resolve = reject = undefined;\n hadNewCall = false;\n }\n };\n\n debounce.isDebounced = () => !!waitingTimeout;\n\n return debounce;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAsArrayBuffer from './readBlobAsArrayBuffer';\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then((buffer) => new Uint8Array(buffer));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every((key) => deepEqual(x[key], y[key]))\n ) : (x === y);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(const i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../../config/databases';\nimport DATABASE_STATE from '../../config/databases/state';\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport IDBStorage from '../files/idb';\nimport {log, serviceMessagePort} from './index.service';\nimport {ServicePushPingTaskPayload} from './serviceMessagePort';\n\nconst ctx = self as any as ServiceWorkerGlobalScope;\nconst defaultBaseUrl = location.protocol + '//' + location.hostname + location.pathname.split('/').slice(0, -1).join('/') + '/';\n\nexport type PushNotificationObject = {\n loc_key: string,\n loc_args: string[],\n // user_id: number, // should be number\n custom: {\n channel_id?: string, // should be number\n chat_id?: string, // should be number\n from_id?: string, // should be number\n msg_id: string,\n peerId?: string // should be number\n },\n sound?: string,\n random_id: number,\n badge?: string, // should be number\n description: string,\n mute: string, // should be number\n title: string,\n\n action?: 'mute1d' | 'push_settings', // will be set before postMessage to main thread\n};\n\nclass SomethingGetter, Storage extends Record> {\n private cache: Partial = {};\n private storage: IDBStorage;\n\n constructor(\n db: T,\n storeName: typeof db['stores'][number]['name'],\n private defaults: {\n [Property in keyof Storage]: ((value: Storage[Property]) => Storage[Property]) | Storage[Property]\n }\n ) {\n this.storage = new IDBStorage(db, storeName);\n }\n\n public async get(key: T) {\n if(this.cache[key] !== undefined) {\n return this.cache[key];\n }\n\n let value: Storage[T];\n try {\n value = await this.storage.get(key as string);\n } catch(err) {\n\n }\n\n if(this.cache[key] !== undefined) {\n return this.cache[key];\n }\n\n if(value === undefined) {\n const callback = this.defaults[key];\n value = typeof(callback) === 'function' ? callback() : callback;\n }\n\n return this.cache[key] = value;\n }\n\n public async set(key: T, value: Storage[T]) {\n const cached = this.cache[key] ?? this.defaults[key];\n if(deepEqual(cached, value)) {\n return;\n }\n\n this.cache[key] = value;\n\n try {\n this.storage.save(key as string, value);\n } catch(err) {\n\n }\n }\n}\n\ntype PushStorage = {\n push_mute_until: number,\n push_lang: Partial\n push_settings: Partial\n};\n\nconst getter = new SomethingGetter(DATABASE_STATE, 'session', {\n push_mute_until: 0,\n push_lang: {\n push_message_nopreview: 'You have a new message',\n push_action_mute1d: 'Mute for 24H',\n push_action_settings: 'Settings'\n },\n push_settings: {}\n});\n\nctx.addEventListener('push', (event) => {\n const obj: PushNotificationObject = event.data.json();\n log('push', obj);\n\n let hasActiveWindows = false;\n const checksPromise = Promise.all([\n getter.get('push_mute_until'),\n ctx.clients.matchAll({type: 'window'})\n ]).then((result) => {\n const [muteUntil, clientList] = result;\n\n log('matched clients', clientList);\n hasActiveWindows = clientList.length > 0;\n if(hasActiveWindows) {\n throw 'Supress notification because some instance is alive';\n }\n\n const nowTime = Date.now();\n if(userInvisibleIsSupported() &&\n muteUntil &&\n nowTime < muteUntil) {\n throw `Supress notification because mute for ${Math.ceil((muteUntil - nowTime) / 60000)} min`;\n }\n\n if(!obj.badge) {\n throw 'No badge?';\n }\n });\n\n checksPromise.catch((reason) => {\n log(reason);\n });\n\n const notificationPromise = checksPromise.then(() => {\n return Promise.all([getter.get('push_settings'), getter.get('push_lang')])\n }).then((result) => {\n return fireNotification(obj, result[0], result[1]);\n });\n\n const closePromise = notificationPromise.catch(() => {\n log('Closing all notifications on push', hasActiveWindows);\n if(userInvisibleIsSupported() || hasActiveWindows) {\n return closeAllNotifications();\n }\n\n return ctx.registration.showNotification('Telegram', {\n tag: 'unknown_peer'\n }).then(() => {\n if(hasActiveWindows) {\n return closeAllNotifications();\n }\n\n setTimeout(() => closeAllNotifications(), hasActiveWindows ? 0 : 100);\n }).catch((error) => {\n log.error('Show notification error', error);\n });\n });\n\n event.waitUntil(closePromise);\n});\n\nctx.addEventListener('notificationclick', (event) => {\n const notification = event.notification;\n log('On notification click: ', notification.tag);\n notification.close();\n\n const action = event.action as PushNotificationObject['action'];\n if(action === 'mute1d' && userInvisibleIsSupported()) {\n log('[SW] mute for 1d');\n getter.set('push_mute_until', Date.now() + 86400e3);\n return;\n }\n\n const data: PushNotificationObject = notification.data;\n if(!data) {\n return;\n }\n\n const promise = ctx.clients.matchAll({\n type: 'window'\n }).then((clientList) => {\n data.action = action;\n pendingNotification = data;\n for(let i = 0; i < clientList.length; i++) {\n const client = clientList[i];\n if('focus' in client) {\n client.focus();\n serviceMessagePort.invokeVoid('pushClick', pendingNotification, client);\n pendingNotification = undefined;\n return;\n }\n }\n\n if(ctx.clients.openWindow) {\n return getter.get('push_settings').then((settings) => {\n return ctx.clients.openWindow(settings.baseUrl || defaultBaseUrl);\n });\n }\n }).catch((error) => {\n log.error('Clients.matchAll error', error);\n })\n\n event.waitUntil(promise);\n});\n\nctx.addEventListener('notificationclose', onCloseNotification);\n\nconst notifications: Set = new Set();\nlet pendingNotification: PushNotificationObject;\nfunction pushToNotifications(notification: Notification) {\n if(!notifications.has(notification)) {\n notifications.add(notification);\n // @ts-ignore\n notification.onclose = onCloseNotification;\n }\n}\n\nfunction onCloseNotification(event: NotificationEvent) {\n removeFromNotifications(event.notification)\n}\n\nfunction removeFromNotifications(notification: Notification) {\n notifications.delete(notification);\n}\n\nexport function closeAllNotifications() {\n for(const notification of notifications) {\n try {\n notification.close();\n } catch(e) {}\n }\n\n let promise: Promise;\n if('getNotifications' in ctx.registration) {\n promise = ctx.registration.getNotifications({}).then((notifications) => {\n for(let i = 0, len = notifications.length; i < len; ++i) {\n try {\n notifications[i].close();\n } catch(e) {}\n }\n }).catch((error) => {\n log.error('Offline register SW error', error);\n });\n } else {\n promise = Promise.resolve();\n }\n\n notifications.clear();\n\n return promise;\n}\n\nfunction userInvisibleIsSupported() {\n return IS_FIREFOX;\n}\n\nfunction fireNotification(obj: PushNotificationObject, settings: PushStorage['push_settings'], lang: PushStorage['push_lang']) {\n const icon = 'assets/img/logo_filled_rounded.png';\n let title = obj.title || 'Telegram';\n let body = obj.description || '';\n let peerId: string;\n\n if(obj.custom) {\n if(obj.custom.channel_id) {\n peerId = '' + -obj.custom.channel_id;\n } else if(obj.custom.chat_id) {\n peerId = '' + -obj.custom.chat_id;\n } else {\n peerId = obj.custom.from_id || '';\n }\n }\n\n obj.custom.peerId = '' + peerId;\n let tag = 'peer' + peerId;\n\n if(settings && settings.nopreview) {\n title = 'Telegram';\n body = lang.push_message_nopreview;\n tag = 'unknown_peer';\n }\n\n log('show notify', title, body, icon, obj);\n\n const actions: (Omit & {action: PushNotificationObject['action']})[] = [{\n action: 'mute1d',\n title: lang.push_action_mute1d\n }/* , {\n action: 'push_settings',\n title: lang.push_action_settings || 'Settings'\n } */];\n\n const notificationPromise = ctx.registration.showNotification(title, {\n body,\n icon,\n tag,\n data: obj,\n actions\n });\n\n return notificationPromise.then((event) => {\n // @ts-ignore\n if(event?.notification) {\n // @ts-ignore\n pushToNotifications(event.notification);\n }\n }).catch((error) => {\n log.error('Show notification promise', error);\n });\n}\n\nexport function onPing(payload: ServicePushPingTaskPayload, source?: MessageEventSource) {\n if(pendingNotification && source) {\n serviceMessagePort.invokeVoid('pushClick', pendingNotification, source);\n pendingNotification = undefined;\n }\n\n if(payload.lang) {\n getter.set('push_lang', payload.lang);\n }\n\n if(payload.settings) {\n getter.set('push_settings', payload.settings);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Database} from '.';\nimport type {IDBIndex} from '../../lib/files/idb';\n\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\n name: 'tweb',\n version: 7,\n stores: [{\n name: 'session'\n }, {\n name: 'stickerSets'\n }, {\n name: 'users'\n }, {\n name: 'chats'\n }, {\n name: 'dialogs'\n // indexes: [\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\n // const name = `index_${idx}`;\n // const index: IDBIndex = {\n // indexName: name,\n // keyPath: name,\n // objectParameters: {}\n // };\n\n // return index\n // })\n // ]\n }, {\n name: 'messages'\n }]\n};\n\nexport default DATABASE_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {WebPushApiManager} from '../mtproto/webPushApiManager';\nimport type {PushNotificationObject} from './push';\nimport type {MyUploadFile} from '../mtproto/apiFileManager';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\n\nexport type ServicePushPingTaskPayload = {\n localNotifications: boolean,\n lang: {\n push_action_mute1d: string\n push_action_settings: string\n push_message_nopreview: string\n },\n settings: WebPushApiManager['settings']\n};\n\nexport type ServiceRequestFilePartTaskPayload = {\n docId: DocId,\n dcId: number,\n offset: number,\n limit: number\n};\n\nexport type ServiceDownloadTaskPayload = {\n headers: any,\n id: string\n};\n\nexport type ServiceEvent = {\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void\n};\n\nexport default class ServiceMessagePort extends SuperMessagePort<{\n // from main thread to service worker\n notificationsClear: () => void,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => void,\n pushPing: (payload: ServicePushPingTaskPayload, source: MessageEventSource, event: MessageEvent) => void,\n hello: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n\n // from mtproto worker\n download: (payload: ServiceDownloadTaskPayload) => void,\n downloadChunk: (payload: {id: ServiceDownloadTaskPayload['id'], chunk: Uint8Array}) => void\n downloadFinalize: (payload: ServiceDownloadTaskPayload['id']) => void,\n downloadCancel: (payload: ServiceDownloadTaskPayload['id']) => void\n}, {\n // to main thread\n pushClick: (payload: PushNotificationObject) => void,\n hello: (payload: void, source: MessageEventSource) => void,\n\n // to mtproto worker\n requestFilePart: (payload: ServiceRequestFilePartTaskPayload) => Promise | MyUploadFile\n} & ServiceEvent, Master> {\n constructor() {\n super('SERVICE');\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.serviceMessagePort = this);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ServiceDownloadTaskPayload} from './serviceMessagePort';\nimport type ServiceMessagePort from './serviceMessagePort';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport makeError from '../../helpers/makeError';\nimport pause from '../../helpers/schedulers/pause';\n\ntype DownloadType = Uint8Array;\ntype DownloadItem = ServiceDownloadTaskPayload & {\n // transformStream: TransformStream,\n readableStream: ReadableStream,\n // writableStream: WritableStream,\n // writer: WritableStreamDefaultWriter,\n // controller: TransformStreamDefaultController,\n controller: ReadableStreamController,\n promise: CancellablePromise,\n // downloadPromise: Promise,\n used?: boolean\n};\nconst downloadMap: Map = new Map();\nconst DOWNLOAD_ERROR = makeError('UNKNOWN');\nconst DOWNLOAD_TEST = false;\n\n(self as any).downloadMap = downloadMap;\n\ntype A = Parameters['addMultipleEventsListeners']>[0];\n\nconst events: A = {\n download: (payload) => {\n const {id} = payload;\n if(downloadMap.has(id)) {\n return Promise.reject(DOWNLOAD_ERROR);\n }\n\n // const y = (20 * 1024 * 1024) / payload.limitPart;\n // const strategy = new ByteLengthQueuingStrategy({highWaterMark: y});\n // let controller: TransformStreamDefaultController;\n const strategy = new CountQueuingStrategy({highWaterMark: 1});\n // const transformStream = new TransformStream(/* {\n // start: (_controller) => controller = _controller,\n // }, */undefined, strategy, strategy);\n\n // const {readable, writable} = transformStream;\n // const writer = writable.getWriter();\n\n const promise = deferredPromise();\n promise.then(() => {\n setTimeout(() => {\n downloadMap.delete(id);\n }, 5e3);\n }, () => {\n downloadMap.delete(id);\n });\n\n // writer.closed.then(promise.resolve, promise.reject);\n\n let controller: ReadableStreamController;\n const readable = new ReadableStream({\n start: (_controller) => {\n controller = _controller;\n },\n\n cancel: (reason) => {\n promise.reject(DOWNLOAD_ERROR);\n }\n }, strategy);\n\n // writer.closed.catch(noop).finally(() => {\n // log.error('closed writer');\n // onEnd();\n // });\n\n // const downloadPromise = writer.closed.catch(() => {throw DOWNLOAD_ERROR;});\n const item: DownloadItem = {\n ...payload,\n // transformStream,\n readableStream: readable,\n // writableStream: writable,\n // writer,\n // downloadPromise,\n promise,\n controller\n };\n\n downloadMap.set(id, item);\n\n // return downloadPromise;\n return promise.catch(() => {throw DOWNLOAD_ERROR});\n },\n\n downloadChunk: ({id, chunk}) => {\n const item = downloadMap.get(id);\n if(!item) {\n return Promise.reject();\n }\n\n // return item.controller.enqueue(chunk);\n // return item.writer.write(chunk);\n // @ts-ignore\n return item.controller.enqueue(chunk);\n },\n\n downloadFinalize: (id) => {\n const item = downloadMap.get(id);\n if(!item) {\n return Promise.reject();\n }\n\n item.promise.resolve();\n // return item.controller.terminate();\n // return item.writer.close();\n return item.controller.close();\n },\n\n downloadCancel: (id) => {\n const item = downloadMap.get(id);\n if(!item) {\n return;\n }\n\n item.promise.reject();\n // return item.controller.error();\n // return item.writer.abort();\n return item.controller.error();\n }\n};\n\nexport default function handleDownload(serviceMessagePort: ServiceMessagePort) {\n serviceMessagePort.addMultipleEventsListeners(events);\n\n return {\n onDownloadFetch,\n onClosedWindows: cancelAllDownloads\n };\n}\n\nfunction onDownloadFetch(event: FetchEvent, params: string) {\n const promise = pause(100).then(() => {\n const item = downloadMap.get(params);\n if(!item || (item.used && !DOWNLOAD_TEST)) {\n return;\n }\n\n item.used = true;\n const stream = item.readableStream;\n const response = new Response(stream, {headers: item.headers});\n return response;\n });\n\n event.respondWith(promise);\n}\n\nfunction cancelAllDownloads() {\n if(downloadMap.size) {\n for(const [id, item] of downloadMap) {\n // item.writer.abort().catch(noop);\n item.controller.error();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n \n \n \n\nimport {logger, LogTypes} from '../logger';\nimport {CACHE_ASSETS_NAME, requestCache} from './cache';\nimport onStreamFetch from './stream';\nimport {closeAllNotifications, onPing} from './push';\nimport CacheStorageController from '../files/cacheStorage';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport ServiceMessagePort from './serviceMessagePort';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport {getWindowClients} from '../../helpers/context';\nimport {MessageSendPort} from '../mtproto/superMessagePort';\nimport handleDownload from './download';\n\nexport const log = logger('SW', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn, true);\nconst ctx = self as any as ServiceWorkerGlobalScope;\n\n \nlet _mtprotoMessagePort: MessagePort;\nexport const getMtprotoMessagePort = () => _mtprotoMessagePort;\n\nconst sendMessagePort = (source: MessageSendPort) => {\n const channel = new MessageChannel();\n serviceMessagePort.attachPort(_mtprotoMessagePort = channel.port1);\n serviceMessagePort.invokeVoid('port', undefined, source, [channel.port2]);\n};\n\nconst sendMessagePortIfNeeded = (source: MessageSendPort) => {\n if(!connectedWindows.size && !_mtprotoMessagePort) {\n log('sending message port for mtproto');\n sendMessagePort(source);\n }\n};\n\nconst onWindowConnected = (source: WindowClient) => {\n log('window connected', source.id, 'windows before', connectedWindows.size);\n\n if(source.frameType === 'none') {\n log.warn('maybe a bugged Safari starting window', source.id);\n return;\n }\n\n log('windows', Array.from(connectedWindows));\n serviceMessagePort.invokeVoid('hello', undefined, source);\n sendMessagePortIfNeeded(source);\n connectedWindows.set(source.id, source);\n};\n\nexport const serviceMessagePort = new ServiceMessagePort();\nserviceMessagePort.addMultipleEventsListeners({\n notificationsClear: closeAllNotifications,\n\n toggleStorages: ({enabled, clearWrite}) => {\n CacheStorageController.toggleStorage(enabled, clearWrite);\n },\n\n pushPing: (payload, source) => {\n onPing(payload, source);\n },\n\n hello: (payload, source) => {\n onWindowConnected(source as any as WindowClient);\n }\n});\n\nconst {\n onDownloadFetch,\n onClosedWindows: onDownloadClosedWindows\n} = handleDownload(serviceMessagePort);\n\n// * service worker can be killed, so won't get 'hello' event\ngetWindowClients().then((windowClients) => {\n log(`got ${windowClients.length} windows from the start`);\n windowClients.forEach((windowClient) => {\n onWindowConnected(windowClient);\n });\n});\n\nconst connectedWindows: Map = new Map();\n(self as any).connectedWindows = connectedWindows;\nlistenMessagePort(serviceMessagePort, undefined, (source) => {\n log('something has disconnected', source);\n const isWindowClient = source instanceof WindowClient;\n if(!isWindowClient || !connectedWindows.has(source.id)) {\n log.warn('it is not a window');\n return;\n }\n\n connectedWindows.delete(source.id);\n log('window disconnected, left', connectedWindows.size);\n if(!connectedWindows.size) {\n log.warn('no windows left');\n\n if(_mtprotoMessagePort) {\n serviceMessagePort.detachPort(_mtprotoMessagePort);\n _mtprotoMessagePort = undefined;\n }\n\n onDownloadClosedWindows();\n }\n});\n \n\nconst onFetch = (event: FetchEvent): void => {\n \n if(\n !IS_SAFARI &&\n event.request.url.indexOf(location.origin + '/') === 0 &&\n event.request.url.match(/\\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\\?.*)?$/)\n ) {\n return event.respondWith(requestCache(event));\n }\n \n\n try {\n // const [, url, scope, params] = /http[:s]+\\/\\/.*?(\\/(.*?)(?:$|\\/(.*)$))/.exec(event.request.url) || [];\n const [scope, params] = event.request.url.split('/').slice(-2);\n\n // log.debug('[fetch]:', event);\n\n switch(scope) {\n case 'stream': {\n onStreamFetch(event, params);\n break;\n }\n\n case 'download': {\n onDownloadFetch(event, params);\n break;\n }\n\n case 'ping': {\n event.respondWith(new Response('pong'));\n break;\n }\n }\n } catch(err) {\n log.error('fetch error', err);\n event.respondWith(new Response('', {\n status: 500,\n statusText: 'Internal Server Error',\n headers: {'Cache-Control': 'no-cache'}\n }));\n }\n};\n\nconst onChangeState = () => {\n ctx.onfetch = onFetch;\n};\n\nctx.addEventListener('install', (event) => {\n log('installing');\n event.waitUntil(ctx.skipWaiting().then(() => log('skipped waiting'))); // Activate worker immediately\n});\n\nctx.addEventListener('activate', (event) => {\n log('activating', ctx);\n event.waitUntil(ctx.caches.delete(CACHE_ASSETS_NAME).then(() => log('cleared assets cache')));\n event.waitUntil(ctx.clients.claim().then(() => log('claimed clients')));\n});\n\n// ctx.onerror = (error) => {\n// log.error('error:', error);\n// };\n\n// ctx.onunhandledrejection = (error) => {\n// log.error('onunhandledrejection:', error);\n// };\n\nctx.onoffline = ctx.ononline = onChangeState;\n\nonChangeState();\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type SuperMessagePort from '../lib/mtproto/superMessagePort';\nimport ctx from '../environment/ctx';\n\nexport default function listenMessagePort(\n messagePort: SuperMessagePort,\n onConnect?: (source: MessageEventSource) => void,\n onDisconnect?: (source: MessageEventSource) => void\n) {\n const attachPort = (listenPort: any, sendPort: any) => {\n messagePort.attachListenPort(listenPort);\n sendPort && messagePort.attachSendPort(sendPort);\n onConnect?.(listenPort);\n };\n\n messagePort.setOnPortDisconnect(onDisconnect);\n\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\n attachPort(ctx, null);\n } else {\n attachPort(ctx, ctx);\n }\n}\n","export default function timeout(delay: number): Promise {\n return new Promise(((resolve) => {\n setTimeout(() => {\n resolve(new Response('', {\n status: 408,\n statusText: 'Request timed out.'\n }));\n }, delay);\n }));\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [85], () => (__webpack_require__(1901)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + \"952a9f12a6b3dcdd3f0e\" + \".bundle.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t670: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","DEBUG","MOUNT_CLASS_TO","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","getWindowClients","clients","matchAll","includeUncontrolled","type","postMessage","listener","args","err","console","error","notifyServiceWorker","all","then","listeners","length","slice","forEach","bind","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","STYLES_SUPPORTED","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","log","method","logType","setPrefix","newPrefix","setLevel","level","reduce","acc","v","bindPrefix","pause","ms","Promise","resolve","setTimeout","ctx","CACHE_ASSETS_NAME","isCorrectResponse","response","ok","status","timeoutRace","promise","race","reject","noop","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","callback","addNotifyListener","push","value","catch","finally","cancel","Object","assign","blobConstruct","blobParts","mimeType","Array","isArray","safeMimeType","blobSafeMimeType","Blob","MemoryWriter","constructor","size","saveFileCallback","this","bytes","Uint8Array","write","part","offset","endOffset","byteLength","newBytes","set","truncate","trim","finalize","saveToStorage","blob","getParts","replaceParts","parts","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","get","save","put","getFile","fileName","makeError","saveFile","Response","headers","rejected","timeout","undefined","res","clearTimeout","prepareWriting","fileSize","getWriter","static","enabled","clearWrite","map","storage","deferredPromises","Map","cacheStorage","CHUNK_CACHED_TIME_HEADER","setInterval","keys","requests","filtered","timestamp","Date","now","request","url","has","promises","id","ignoreSearch","ignoreVary","mtprotoMessagePort","getMtprotoMessagePort","messagePort","taskId","streams","Stream","info","loadedOffsets","Set","destroy","getId","limitPart","STREAM_CHUNK_UPPER_LIMIT","STREAM_CHUNK_MIDDLE_LIMIT","destroyDebounced","fn","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","invoke","_resolve","_reject","apply","debounce","_waitingTimeout","isDebounced","requestFilePartFromWorker","alignedOffset","limit","fromPreload","payload","docId","dcId","JSON","stringify","uploadFile","add","serviceMessagePort","bytesPromise","saveChunkToCache","preloadChunks","requestFilePartFromCache","key","getChunkKey","reader","FileReader","addEventListener","e","target","result","readBlobAs","readBlobAsArrayBuffer","buffer","readBlobAsUint8Array","requestFilePart","preloadChunk","end","alignOffset","requestRange","range","possibleResponse","statusText","responseForSafariFirstRange","Math","ceil","alignLimit","min","ab","location","base","deepEqual","x","y","tx","every","IDB","db","object","fromObject","i","safeAssign","name","storageIsAvailable","join","INSTANCES","isAvailable","createNew","createIndexes","os","store","indexNames","from","indexName","deleteIndex","indexes","index","contains","createIndex","keyPath","objectParameters","indexedDB","version","message","finished","onerror","onsuccess","event","calledNew","onclose","onabort","transaction","close","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","find","instance","preserve","IDBStorage","storeName","idb","create","concat","getObjectStore","clear","idx","mode","perf","performance","onError","onComplete","results","r","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","getAll","defaultBaseUrl","protocol","hostname","pathname","split","getter","defaults","push_mute_until","push_lang","push_message_nopreview","push_action_mute1d","push_action_settings","push_settings","obj","data","json","hasActiveWindows","checksPromise","muteUntil","clientList","nowTime","userInvisibleIsSupported","badge","reason","notificationPromise","settings","lang","icon","peerId","title","body","description","custom","channel_id","chat_id","from_id","tag","nopreview","actions","action","registration","showNotification","notification","notifications","onCloseNotification","fireNotification","closePromise","closeAllNotifications","waitUntil","pendingNotification","client","focus","invokeVoid","openWindow","baseUrl","getNotifications","len","ServiceMessagePort","super","downloadMap","DOWNLOAD_ERROR","events","download","strategy","CountQueuingStrategy","highWaterMark","controller","readable","ReadableStream","start","_controller","item","readableStream","downloadChunk","chunk","enqueue","downloadFinalize","downloadCancel","onDownloadFetch","params","used","stream","respondWith","cancelAllDownloads","_mtprotoMessagePort","onWindowConnected","source","connectedWindows","frameType","channel","MessageChannel","attachPort","port1","port2","sendMessagePort","sendMessagePortIfNeeded","addMultipleEventsListeners","notificationsClear","toggleStorages","toggleStorage","pushPing","onPing","hello","onClosedWindows","onDownloadClosedWindows","handleDownload","windowClients","windowClient","onConnect","onDisconnect","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","WindowClient","detachPort","listenMessagePort","onFetch","origin","file","fetch","clone","replace","random","requestCache","scope","header","chunks","ranges","parseRange","parse","decodeURIComponent","onStreamFetch","onChangeState","onfetch","skipWaiting","claim","onoffline","ononline","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","m","__webpack_exports__","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","j","splice","d","definition","o","defineProperty","enumerable","f","chunkId","u","miniCssF","g","globalThis","Function","prop","prototype","hasOwnProperty","call","scriptUrl","importScripts","document","currentScript","src","scripts","getElementsByTagName","p","oldGetScript","oldLoadScript","queryMap","countMap","retries","realSrc","cacheBust","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime","pop"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"sw.33885da34018d6fb111e.chunk.js","mappings":"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","sources":["webpack://tweb/webpack/runtime/chunk loaded","webpack://tweb/webpack/runtime/startup chunk dependencies","webpack://tweb/./src/config/debug.ts","webpack://tweb/./src/environment/userAgent.ts","webpack://tweb/./src/helpers/context.ts","webpack://tweb/./src/lib/logger.ts","webpack://tweb/./src/helpers/schedulers/pause.ts","webpack://tweb/./src/lib/serviceWorker/cache.ts","webpack://tweb/./src/helpers/noop.ts","webpack://tweb/./src/helpers/cancellablePromise.ts","webpack://tweb/./src/helpers/blob/blobConstruct.ts","webpack://tweb/./src/helpers/blob/blobSafeMimeType.ts","webpack://tweb/./src/lib/files/memoryWriter.ts","webpack://tweb/./src/lib/files/cacheStorage.ts","webpack://tweb/./src/lib/serviceWorker/stream.ts","webpack://tweb/./src/helpers/schedulers/debounce.ts","webpack://tweb/./src/helpers/blob/readBlobAsUint8Array.ts","webpack://tweb/./src/helpers/blob/readBlobAsArrayBuffer.ts","webpack://tweb/./src/helpers/blob/readBlobAs.ts","webpack://tweb/./src/helpers/object/deepEqual.ts","webpack://tweb/./src/lib/files/idb.ts","webpack://tweb/./src/helpers/object/safeAssign.ts","webpack://tweb/./src/lib/serviceWorker/push.ts","webpack://tweb/./src/config/databases/state.ts","webpack://tweb/./src/lib/serviceWorker/serviceMessagePort.ts","webpack://tweb/./src/lib/serviceWorker/download.ts","webpack://tweb/./src/lib/serviceWorker/index.service.ts","webpack://tweb/./src/helpers/listenMessagePort.ts","webpack://tweb/./src/lib/serviceWorker/timeout.ts","webpack://tweb/webpack/bootstrap","webpack://tweb/webpack/runtime/define property getters","webpack://tweb/webpack/runtime/ensure chunk","webpack://tweb/webpack/runtime/get javascript chunk filename","webpack://tweb/webpack/runtime/get mini-css chunk filename","webpack://tweb/webpack/runtime/global","webpack://tweb/webpack/runtime/hasOwnProperty shorthand","webpack://tweb/webpack/runtime/publicPath","webpack://tweb/webpack/runtime/compat","webpack://tweb/webpack/runtime/importScripts chunk loading","webpack://tweb/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var next = __webpack_require__.x;\n__webpack_require__.x = () => {\n\treturn __webpack_require__.e(85).then(next);\n};","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from './modes';\n\nexport const IS_BETA = process.env.NODE_ENV !== 'production';\nexport const DEBUG = (IS_BETA || Modes.debug)/* && false */;\nconst ctx: any = typeof(window) !== 'undefined' ? window : self;\nexport const MOUNT_CLASS_TO: any = DEBUG || true/* && false */ ? ctx : {};\nexport default DEBUG;\n\n// let m = DEBUG;\n/* if(!DEBUG) {\n ctx.sandpitTurtle = () => {\n //if(!m) {\n for(let i in MOUNT_CLASS_TO) {\n ctx[i] = MOUNT_CLASS_TO[i];\n }\n //m = true;\n //}\n\n //DEBUG = !DEBUG;\n };\n} */\n\n/* export const superDebug = (object: any, key: string) => {\n var d = object[key];\n var beforeStr = '', afterStr = '';\n for(var r of d) {\n beforeStr += r.before.hex + '\\n';\n afterStr += r.after.hex + '\\n';\n }\n\n beforeStr = beforeStr.trim();\n afterStr = afterStr.trim();\n //var beforeStr = d.map((r) => r.before.hex).join('\\n');\n //var afterStr = d.map((r) => r.after.hex).join('\\n');\n\n var dada = (name: string, str: string) => {\n var a = document.createElement('a');\n a.target = '_blank';\n a.download = name + '.txt';\n a.href = URL.createObjectURL(new Blob([str], {\n type: 'text/plain'\n }));\n document.body.append(a);\n a.click();\n };\n\n dada(key + '_' + 'before', beforeStr);\n dada(key + '_' + 'after', afterStr);\n}\n\nMOUNT_CLASS_TO.superDebug = superDebug; */\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport ctx from './ctx';\n\nexport const USER_AGENT = navigator ? navigator.userAgent : null;\nexport const IS_APPLE = navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i) !== -1;\nexport const IS_ANDROID = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\nexport const IS_CHROMIUM = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);\n\n// https://stackoverflow.com/a/58065241\nexport const IS_APPLE_MOBILE = (/iPad|iPhone|iPod/.test(navigator.platform) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&\n !(ctx as any).MSStream;\n\nexport const IS_SAFARI = !!('safari' in ctx) || !!(USER_AGENT && (/\\b(iPad|iPhone|iPod)\\b/.test(USER_AGENT) || (!!USER_AGENT.match('Safari') && !USER_AGENT.match('Chrome'))))/* || true */;\nexport const IS_FIREFOX = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;\n\nexport const IS_MOBILE_SAFARI = IS_SAFARI && IS_APPLE_MOBILE;\n\nexport const IS_MOBILE = /* screen.width && screen.width < 480 || */navigator.maxTouchPoints > 0 && navigator.userAgent.search(/iOS|iPhone OS|Android|BlackBerry|BB10|Series ?[64]0|J2ME|MIDP|opera mini|opera mobi|mobi.+Gecko|Windows Phone/i) != -1;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// в SW может быть сразу две переменных TRUE\nexport const IS_SERVICE_WORKER = typeof ServiceWorkerGlobalScope !== 'undefined' && self instanceof ServiceWorkerGlobalScope;\nexport const IS_WEB_WORKER = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && !IS_SERVICE_WORKER;\nexport const IS_WORKER = IS_WEB_WORKER || IS_SERVICE_WORKER;\n\nexport const getWindowClients = () => {\n return (self as any as ServiceWorkerGlobalScope)\n .clients\n .matchAll({includeUncontrolled: false, type: 'window'});\n};\n\nexport const getLastWindowClient = () => getWindowClients().then((windowClients) => windowClients.slice(-1)[0]);\n\nconst postMessage = (listener: WindowClient | DedicatedWorkerGlobalScope, ...args: any[]) => {\n try {\n // @ts-ignore\n listener.postMessage(...args);\n } catch(err) {\n console.error('[worker] postMessage error:', err, args);\n }\n};\n\nconst notifyServiceWorker = (all: boolean, ...args: any[]) => {\n getWindowClients().then((listeners) => {\n if(!listeners.length) {\n // console.trace('no listeners?', self, listeners);\n return;\n }\n\n listeners.slice(all ? 0 : -1).forEach((listener) => {\n postMessage(listener, ...args);\n });\n });\n};\n\nconst notifyWorker = (...args: any[]) => {\n postMessage(self as any as DedicatedWorkerGlobalScope, ...args);\n};\n\nconst noop = () => {};\n\nexport const notifySomeone = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, false) : (IS_WEB_WORKER ? notifyWorker : noop);\nexport const notifyAll = IS_SERVICE_WORKER ? notifyServiceWorker.bind(null, true) : (IS_WEB_WORKER ? notifyWorker : noop);\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport DEBUG from '../config/debug';\nimport {IS_FIREFOX, IS_SAFARI} from '../environment/userAgent';\nimport {IS_SERVICE_WORKER, IS_WEB_WORKER} from '../helpers/context';\nimport dT from '../helpers/dT';\n\nexport enum LogTypes {\n None = 0,\n Error = 1,\n Warn = 2,\n Log = 4,\n Debug = 8\n};\n\nexport const LOG_LEVELS = [LogTypes.None, LogTypes.Error, LogTypes.Warn, LogTypes.Log, LogTypes.Debug];\n\nconst IS_WEBKIT = IS_SAFARI || IS_FIREFOX;\n\n// let getCallerFunctionNameFromLine: (line: string) => string;\n// if(IS_WEBKIT) {\n// getCallerFunctionNameFromLine = (line) => {\n// const splitted = line.split('@');\n// return splitted[0];\n// };\n// } else {\n// getCallerFunctionNameFromLine = (line: string) => {\n// const splitted = line.trim().split(' ');\n// if(splitted.length === 3) {\n// return splitted[1].slice(splitted[1].lastIndexOf('.') + 1);\n// }\n// };\n// }\n\nconst STYLES_SUPPORTED = !IS_WEBKIT;\n// const LINE_INDEX = IS_WEBKIT ? 2 : 3;\n\n// function getCallerFunctionName() {\n// const stack = new Error().stack;\n// const lines = stack.split('\\n');\n// const line = lines[LINE_INDEX] || lines[lines.length - 1];\n// // const match = line.match(/\\.([^\\.]+?)\\s/);\n// // line = match ? match[1] : line.trim();\n// const caller = getCallerFunctionNameFromLine(line) || '';\n// return '[' + caller + ']';\n// }\n\nexport const LOGGER_STYLES = {\n reset: '\\x1b[0m',\n bright: '\\x1b[1m',\n dim: '\\x1b[2m',\n underscore: '\\x1b[4m',\n blink: '\\x1b[5m',\n reverse: '\\x1b[7m',\n hidden: '\\x1b[8m',\n // Foreground (text) colors\n fg: {\n black: '\\x1b[30m',\n red: '\\x1b[31m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n blue: '\\x1b[34m',\n magenta: '\\x1b[35m',\n cyan: '\\x1b[36m',\n white: '\\x1b[37m'\n },\n // Background colors\n bg: {\n black: '\\x1b[40m',\n red: '\\x1b[41m',\n green: '\\x1b[42m',\n yellow: '\\x1b[43m',\n blue: '\\x1b[44m',\n magenta: '\\x1b[45m',\n cyan: '\\x1b[46m',\n white: '\\x1b[47m'\n }\n};\n\nexport type Logger = {\n (...args: any[]): void;\n warn(...args: any[]): void;\n info(...args: any[]): void;\n error(...args: any[]): void;\n trace(...args: any[]): void;\n debug(...args: any[]): void;\n assert(...args: any[]): void;\n // log(...args: any[]): void;\n group(...args: any[]): void;\n groupCollapsed(...args: any[]): void;\n groupEnd(...args: any[]): void;\n setPrefix(newPrefix: string): void;\n setLevel(level: 0 | 1 | 2 | 3 | 4): void;\n bindPrefix(prefix: string): Logger;\n};\n\nconst methods: ['debug' | 'info' | 'warn' | 'error' | 'assert' | 'trace'/* | 'log' */ | 'group' | 'groupCollapsed' | 'groupEnd', LogTypes][] = [\n ['debug', LogTypes.Debug],\n ['info', LogTypes.Log],\n ['warn', LogTypes.Warn],\n ['error', LogTypes.Error],\n ['assert', LogTypes.Error],\n ['trace', LogTypes.Log],\n ['group', LogTypes.Log],\n ['groupCollapsed', LogTypes.Log],\n ['groupEnd', LogTypes.Log]\n // [\"log\", LogTypes.Log]\n];\n\nexport function logger(prefix: string, type: LogTypes = LogTypes.Log | LogTypes.Warn | LogTypes.Error, ignoreDebugReset = false, style = ''): Logger {\n let originalPrefix: string;\n if(!DEBUG && !ignoreDebugReset/* || true */) {\n type = LogTypes.Error;\n }\n\n if(!STYLES_SUPPORTED) {\n style = '';\n } else if(!style) {\n if(IS_SERVICE_WORKER) style = LOGGER_STYLES.fg.yellow;\n else if(IS_WEB_WORKER) style = LOGGER_STYLES.fg.cyan;\n }\n\n const originalStyle = style;\n if(style) style = `%s ${style}%s`;\n else style = '%s';\n\n // level = LogLevels.log | LogLevels.warn | LogLevels.error | LogLevels.debug\n\n const log: Logger = function(...args: any[]) {\n return type & LogTypes.Log && console.log(style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n } as any;\n\n methods.forEach(([method, logType]) => {\n log[method] = function(...args: any[]) {\n return type & logType && console[method](style, dT(), prefix, /* getCallerFunctionName(), */ ...args);\n };\n });\n\n log.setPrefix = function(newPrefix: string) {\n originalPrefix = newPrefix;\n prefix = '[' + newPrefix + ']';\n };\n\n log.setPrefix(prefix);\n\n log.setLevel = function(level: 0 | 1 | 2 | 3 | 4) {\n type = LOG_LEVELS.slice(0, level + 1).reduce((acc, v) => acc | v, 0) as any;\n };\n\n log.bindPrefix = function(prefix: string) {\n return logger(`${originalPrefix}] [${prefix}`, type, ignoreDebugReset, originalStyle);\n };\n\n return log;\n};\n","export default function pause(ms: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport pause from '../../helpers/schedulers/pause';\n\nconst ctx = self as any as ServiceWorkerGlobalScope;\nexport const CACHE_ASSETS_NAME = 'cachedAssets';\n\nfunction isCorrectResponse(response: Response) {\n return response.ok && response.status === 200;\n}\n\nfunction timeoutRace>(promise: T) {\n return Promise.race([\n promise,\n pause(10000).then(() => Promise.reject())\n ]);\n}\n\nexport async function requestCache(event: FetchEvent) {\n try {\n // const cache = await ctx.caches.open(CACHE_ASSETS_NAME);\n const cache = await timeoutRace(ctx.caches.open(CACHE_ASSETS_NAME));\n const file = await timeoutRace(cache.match(event.request, {ignoreVary: true}));\n\n if(file && isCorrectResponse(file)) {\n return file;\n }\n\n const headers: HeadersInit = {'Vary': '*'};\n let response = await fetch(event.request, {headers});\n if(isCorrectResponse(response)) {\n cache.put(event.request, response.clone());\n } else if(response.status === 304) { // possible fix for 304 in Safari\n const url = event.request.url.replace(/\\?.+$/, '') + '?' + (Math.random() * 100000 | 0);\n response = await fetch(url, {headers});\n if(isCorrectResponse(response)) {\n cache.put(event.request, response.clone());\n }\n }\n\n return response;\n } catch(err) {\n return fetch(event.request);\n }\n}\n","export default function noop() {}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport noop from './noop';\n\nexport interface CancellablePromise extends Promise {\n resolve?: (value: T) => void,\n reject?: (...args: any[]) => void,\n cancel?: (reason?: any) => void,\n\n notify?: (...args: any[]) => void,\n notifyAll?: (...args: any[]) => void,\n lastNotify?: any,\n listeners?: Array<(...args: any[]) => void>,\n addNotifyListener?: (callback: (...args: any[]) => void) => void,\n\n isFulfilled?: boolean,\n isRejected?: boolean\n}\n\nexport default function deferredPromise() {\n const deferredHelper: any = {\n isFulfilled: false,\n isRejected: false,\n\n notify: () => {},\n notifyAll: (...args: any[]) => {\n deferredHelper.lastNotify = args;\n deferredHelper.listeners.forEach((callback: any) => callback(...args));\n },\n\n listeners: [],\n addNotifyListener: (callback: (...args: any[]) => void) => {\n if(deferredHelper.lastNotify) {\n callback(...deferredHelper.lastNotify);\n }\n\n deferredHelper.listeners.push(callback);\n }\n };\n\n const deferred: CancellablePromise = new Promise((resolve, reject) => {\n deferredHelper.resolve = (value: T) => {\n if(deferred.isFulfilled || deferred.isRejected) return;\n\n deferred.isFulfilled = true;\n resolve(value);\n };\n\n deferredHelper.reject = (...args: any[]) => {\n if(deferred.isRejected || deferred.isFulfilled) return;\n\n deferred.isRejected = true;\n reject(...args);\n };\n });\n\n // @ts-ignore\n /* deferred.then = (resolve: (value: T) => any, reject: (...args: any[]) => any) => {\n const n = deferredPromise>();\n\n }; */\n\n deferred.catch(noop).finally(() => {\n deferred.notify = deferred.notifyAll = deferred.lastNotify = null;\n deferred.listeners.length = 0;\n\n if(deferred.cancel) {\n deferred.cancel = noop;\n }\n });\n\n Object.assign(deferred, deferredHelper);\n\n return deferred;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport blobSafeMimeType from './blobSafeMimeType';\n\nexport default function blobConstruct(blobParts: Array | T, mimeType: string = ''): Blob {\n if(!Array.isArray(blobParts)) {\n blobParts = [blobParts];\n }\n\n const safeMimeType = blobSafeMimeType(mimeType);\n const blob = new Blob(blobParts, {type: safeMimeType});\n return blob;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\n// https://www.iana.org/assignments/media-types/media-types.xhtml\nexport default function blobSafeMimeType(mimeType: string) {\n if([\n 'image/jpeg',\n 'image/png',\n 'image/gif',\n 'image/svg+xml',\n 'image/webp',\n 'image/bmp',\n 'video/mp4',\n 'video/webm',\n 'video/quicktime',\n 'audio/ogg',\n 'audio/mpeg',\n 'audio/mp4',\n 'audio/wav', // though it is not in list\n 'application/json',\n 'application/pdf'\n ].indexOf(mimeType) === -1) {\n return 'application/octet-stream';\n }\n\n return mimeType;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport StreamWriter from './streamWriter';\n\nexport default class MemoryWriter implements StreamWriter {\n private bytes: Uint8Array;\n\n constructor(\n private mimeType: string,\n private size: number,\n private saveFileCallback?: (blob: Blob) => Promise\n ) {\n this.bytes = new Uint8Array(size);\n }\n\n public async write(part: Uint8Array, offset: number) {\n // sometimes file size can be bigger than the prov\n const endOffset = offset + part.byteLength;\n if(endOffset > this.bytes.byteLength) {\n const newBytes = new Uint8Array(endOffset);\n newBytes.set(this.bytes, 0);\n this.bytes = newBytes;\n }\n\n this.bytes.set(part, offset);\n };\n\n public truncate() {\n this.bytes = new Uint8Array();\n }\n\n public trim(size: number) {\n this.bytes = this.bytes.slice(0, size);\n }\n\n public finalize(saveToStorage = true) {\n const blob = blobConstruct(this.bytes, this.mimeType);\n\n if(saveToStorage && this.saveFileCallback) {\n this.saveFileCallback(blob);\n }\n\n return blob;\n }\n\n public getParts() {\n return this.bytes;\n }\n\n public replaceParts(parts: Uint8Array) {\n this.bytes = parts;\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport Modes from '../../config/modes';\nimport blobConstruct from '../../helpers/blob/blobConstruct';\nimport MemoryWriter from './memoryWriter';\nimport FileManager from './memoryWriter';\nimport FileStorage from './fileStorage';\nimport makeError from '../../helpers/makeError';\nimport deferredPromise from '../../helpers/cancellablePromise';\n\nexport type CacheStorageDbName = 'cachedFiles' | 'cachedStreamChunks' | 'cachedAssets';\n\nexport default class CacheStorageController implements FileStorage {\n private static STORAGES: CacheStorageController[] = [];\n private openDbPromise: Promise;\n\n private useStorage = true;\n\n // private log: ReturnType = logger('CS');\n\n constructor(private dbName: CacheStorageDbName) {\n if(Modes.test) {\n this.dbName += '_test';\n }\n\n if(CacheStorageController.STORAGES.length) {\n this.useStorage = CacheStorageController.STORAGES[0].useStorage;\n }\n\n this.openDatabase();\n CacheStorageController.STORAGES.push(this);\n }\n\n private openDatabase(): Promise {\n return this.openDbPromise ?? (this.openDbPromise = caches.open(this.dbName));\n }\n\n public delete(entryName: string) {\n return this.timeoutOperation((cache) => cache.delete('/' + entryName));\n }\n\n public deleteAll() {\n return caches.delete(this.dbName);\n }\n\n public get(entryName: string) {\n return this.timeoutOperation((cache) => cache.match('/' + entryName));\n }\n\n public save(entryName: string, response: Response) {\n // return new Promise((resolve) => {}); // DEBUG\n return this.timeoutOperation((cache) => cache.put('/' + entryName, response));\n }\n\n public getFile(fileName: string, method: 'blob' | 'json' | 'text' = 'blob'): Promise {\n /* if(method === 'blob') {\n return Promise.reject();\n } */\n\n // const str = `get fileName: ${fileName}`;\n // console.time(str);\n return this.get(fileName).then((response) => {\n if(!response) {\n // console.warn('getFile:', response, fileName);\n throw makeError('NO_ENTRY_FOUND');\n }\n\n const promise = response[method]();\n // promise.then(() => {\n // console.timeEnd(str);\n // });\n return promise;\n });\n }\n\n public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // return Promise.resolve(blobConstruct([blob]));\n if(!(blob instanceof Blob)) {\n blob = blobConstruct(blob);\n }\n\n const response = new Response(blob, {\n headers: {\n 'Content-Length': '' + blob.size\n }\n });\n\n return this.save(fileName, response).then(() => blob as Blob);\n }\n\n public timeoutOperation(callback: (cache: Cache) => Promise) {\n if(!this.useStorage) {\n return Promise.reject(makeError('STORAGE_OFFLINE'));\n }\n\n return new Promise(async(resolve, reject) => {\n let rejected = false;\n const timeout = setTimeout(() => {\n reject();\n // console.warn('CACHESTORAGE TIMEOUT');\n rejected = true;\n }, 15e3);\n\n try {\n const cache = await this.openDatabase();\n if(!cache) {\n this.useStorage = false;\n this.openDbPromise = undefined;\n throw 'no cache?';\n }\n\n const res = await callback(cache);\n\n if(rejected) return;\n resolve(res);\n } catch(err) {\n reject(err);\n }\n\n clearTimeout(timeout);\n });\n }\n\n public prepareWriting(fileName: string, fileSize: number, mimeType: string) {\n return {\n deferred: deferredPromise(),\n getWriter: () => {\n const writer = new MemoryWriter(mimeType, fileSize, (blob) => {\n return this.saveFile(fileName, blob).catch(() => blob);\n });\n\n return writer;\n }\n };\n }\n\n public static toggleStorage(enabled: boolean, clearWrite: boolean) {\n return Promise.all(this.STORAGES.map((storage) => {\n storage.useStorage = enabled;\n\n if(!clearWrite) {\n return;\n }\n\n if(!enabled) {\n return storage.deleteAll();\n }\n }));\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAsUint8Array from '../../helpers/blob/readBlobAsUint8Array';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport debounce from '../../helpers/schedulers/debounce';\nimport {InputFileLocation} from '../../layer';\nimport CacheStorageController from '../files/cacheStorage';\nimport {DownloadOptions, MyUploadFile} from '../mtproto/apiFileManager';\nimport {getMtprotoMessagePort, log, serviceMessagePort} from './index.service';\nimport {ServiceRequestFilePartTaskPayload} from './serviceMessagePort';\nimport timeout from './timeout';\n\nconst deferredPromises: Map}> = new Map();\nconst cacheStorage = new CacheStorageController('cachedStreamChunks');\nconst CHUNK_TTL = 86400;\nconst CHUNK_CACHED_TIME_HEADER = 'Time-Cached';\nconst USE_CACHE = true;\n\nconst clearOldChunks = () => {\n return cacheStorage.timeoutOperation((cache) => {\n return cache.keys().then((requests) => {\n const filtered: Map = new Map();\n const timestamp = Date.now() / 1000 | 0;\n for(const request of requests) {\n const match = request.url.match(/\\/(\\d+?)\\?/);\n if(match && !filtered.has(match[1])) {\n filtered.set(match[1], request);\n }\n }\n\n const promises: Promise[] = [];\n for(const [id, request] of filtered) {\n const promise = cache.match(request).then((response) => {\n if((+response.headers.get(CHUNK_CACHED_TIME_HEADER) + CHUNK_TTL) <= timestamp) {\n log('will delete stream chunk:', id);\n return cache.delete(request, {ignoreSearch: true, ignoreVary: true});\n }\n });\n\n promises.push(promise);\n }\n\n return Promise.all(promises);\n });\n });\n};\n\nsetInterval(clearOldChunks, 1800e3);\nsetInterval(() => {\n const mtprotoMessagePort = getMtprotoMessagePort();\n for(const [messagePort, promises] of deferredPromises) {\n if(messagePort !== mtprotoMessagePort) {\n for(const taskId in promises) {\n const promise = promises[taskId];\n promise.reject();\n }\n\n deferredPromises.delete(messagePort);\n }\n }\n}, 120e3);\n\ntype StreamRange = [number, number];\ntype StreamId = DocId;\nconst streams: Map = new Map();\nclass Stream {\n private destroyDebounced: () => void;\n private id: StreamId;\n private limitPart: number;\n private loadedOffsets: Set = new Set();\n\n constructor(private info: DownloadOptions) {\n this.id = Stream.getId(info);\n streams.set(this.id, this);\n\n // ! если грузить очень большое видео чанками по 512Кб в мобильном Safari, то стрим не запустится\n this.limitPart = info.size > (75 * 1024 * 1024) ? STREAM_CHUNK_UPPER_LIMIT : STREAM_CHUNK_MIDDLE_LIMIT;\n this.destroyDebounced = debounce(this.destroy, 150000, false, true);\n }\n\n private destroy = () => {\n streams.delete(this.id);\n };\n\n private async requestFilePartFromWorker(alignedOffset: number, limit: number, fromPreload = false) {\n const payload: ServiceRequestFilePartTaskPayload = {\n docId: this.id,\n dcId: this.info.dcId,\n offset: alignedOffset,\n limit\n };\n\n const taskId = JSON.stringify(payload);\n\n const mtprotoMessagePort = getMtprotoMessagePort();\n let promises = deferredPromises.get(mtprotoMessagePort);\n if(!promises) {\n deferredPromises.set(mtprotoMessagePort, promises = {});\n }\n\n let deferred = promises[taskId];\n if(deferred) {\n return deferred.then((uploadFile) => uploadFile.bytes);\n }\n\n this.loadedOffsets.add(alignedOffset);\n\n deferred = promises[taskId] = deferredPromise();\n\n serviceMessagePort.invoke('requestFilePart', payload, undefined, mtprotoMessagePort)\n .then(deferred.resolve, deferred.reject).finally(() => {\n if(promises[taskId] === deferred) {\n delete promises[taskId];\n\n if(!Object.keys(promises).length) {\n deferredPromises.delete(mtprotoMessagePort);\n }\n }\n });\n\n const bytesPromise = deferred.then((uploadFile) => uploadFile.bytes);\n\n if(USE_CACHE) {\n this.saveChunkToCache(bytesPromise, alignedOffset, limit);\n !fromPreload && this.preloadChunks(alignedOffset, alignedOffset + (this.limitPart * 15));\n }\n\n return bytesPromise;\n }\n\n private requestFilePartFromCache(alignedOffset: number, limit: number, fromPreload?: boolean) {\n if(!USE_CACHE) {\n return Promise.resolve();\n }\n\n const key = this.getChunkKey(alignedOffset, limit);\n return cacheStorage.getFile(key).then((blob: Blob) => {\n return fromPreload ? new Uint8Array() : readBlobAsUint8Array(blob);\n }, (error: ApiError) => {\n if(error.type === 'NO_ENTRY_FOUND') {\n return;\n }\n });\n }\n\n private requestFilePart(alignedOffset: number, limit: number, fromPreload?: boolean) {\n return this.requestFilePartFromCache(alignedOffset, limit, fromPreload).then((bytes) => {\n return bytes || this.requestFilePartFromWorker(alignedOffset, limit, fromPreload);\n });\n }\n\n private saveChunkToCache(deferred: Promise, alignedOffset: number, limit: number) {\n return deferred.then((bytes) => {\n const key = this.getChunkKey(alignedOffset, limit);\n const response = new Response(bytes, {\n headers: {\n 'Content-Length': '' + bytes.length,\n 'Content-Type': 'application/octet-stream',\n [CHUNK_CACHED_TIME_HEADER]: '' + (Date.now() / 1000 | 0)\n }\n });\n\n return cacheStorage.save(key, response);\n });\n }\n\n private preloadChunk(offset: number) {\n if(this.loadedOffsets.has(offset)) {\n return;\n }\n\n this.loadedOffsets.add(offset);\n this.requestFilePart(offset, this.limitPart, true);\n }\n\n private preloadChunks(offset: number, end: number) {\n if(end > this.info.size) {\n end = this.info.size;\n }\n\n if(!offset) { // load last chunk for bounds\n this.preloadChunk(alignOffset(offset, this.limitPart));\n } else { // don't preload next chunks before the start\n for(; offset < end; offset += this.limitPart) {\n this.preloadChunk(offset);\n }\n }\n }\n\n public requestRange(range: StreamRange) {\n this.destroyDebounced();\n\n const possibleResponse = responseForSafariFirstRange(range, this.info.mimeType, this.info.size);\n if(possibleResponse) {\n return possibleResponse;\n }\n\n let [offset, end] = range;\n\n /* if(info.size > limitPart && isSafari && offset === limitPart) {\n //end = info.size - 1;\n //offset = info.size - 1 - limitPart;\n offset = info.size - (info.size % limitPart);\n } */\n\n const limit = end && end < this.limitPart ? alignLimit(end - offset + 1) : this.limitPart;\n const alignedOffset = alignOffset(offset, limit);\n\n if(!end) {\n end = Math.min(offset + limit, this.info.size - 1);\n }\n\n return this.requestFilePart(alignedOffset, limit).then((ab) => {\n // log.debug('[stream] requestFilePart result:', result);\n\n // if(isSafari) {\n if(offset !== alignedOffset || end !== (alignedOffset + limit)) {\n ab = ab.slice(offset - alignedOffset, end - alignedOffset + 1);\n }\n\n const headers: Record = {\n 'Accept-Ranges': 'bytes',\n 'Content-Range': `bytes ${offset}-${offset + ab.byteLength - 1}/${this.info.size || '*'}`,\n 'Content-Length': `${ab.byteLength}`\n };\n\n if(this.info.mimeType) {\n headers['Content-Type'] = this.info.mimeType;\n }\n\n // simulate slow connection\n // setTimeout(() => {\n return new Response(ab, {\n status: 206,\n statusText: 'Partial Content',\n headers\n });\n // }, 2.5e3);\n });\n }\n\n private getChunkKey(alignedOffset: number, limit: number) {\n return this.id + '?offset=' + alignedOffset + '&limit=' + limit;\n }\n\n public static get(info: DownloadOptions) {\n return streams.get(this.getId(info)) ?? new Stream(info);\n }\n\n private static getId(info: DownloadOptions) {\n return (info.location as InputFileLocation.inputDocumentFileLocation).id;\n }\n}\n\nexport default function onStreamFetch(event: FetchEvent, params: string) {\n const range = parseRange(event.request.headers.get('Range'));\n const info: DownloadOptions = JSON.parse(decodeURIComponent(params));\n const stream = Stream.get(info);\n\n // log.debug('[stream]', url, offset, end);\n\n event.respondWith(Promise.race([\n timeout(45 * 1000),\n stream.requestRange(range)\n ]));\n}\n\nfunction responseForSafariFirstRange(range: StreamRange, mimeType: string, size: number): Response {\n if(range[0] === 0 && range[1] === 1) {\n return new Response(new Uint8Array(2).buffer, {\n status: 206,\n statusText: 'Partial Content',\n headers: {\n 'Accept-Ranges': 'bytes',\n 'Content-Range': `bytes 0-1/${size || '*'}`,\n 'Content-Length': '2',\n 'Content-Type': mimeType || 'video/mp4'\n }\n });\n }\n\n return null;\n}\n\n/* const STREAM_CHUNK_UPPER_LIMIT = 256 * 1024;\nconst SMALLEST_CHUNK_LIMIT = 256 * 4; */\n/* const STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\nconst SMALLEST_CHUNK_LIMIT = 1024 * 4; */\nconst STREAM_CHUNK_MIDDLE_LIMIT = 512 * 1024;\nconst STREAM_CHUNK_UPPER_LIMIT = 1024 * 1024;\nconst SMALLEST_CHUNK_LIMIT = 512 * 4;\n\nfunction parseRange(header: string): StreamRange {\n if(!header) return [0, 0];\n const [, chunks] = header.split('=');\n const ranges = chunks.split(', ');\n const [offset, end] = ranges[0].split('-');\n\n return [+offset, +end || 0];\n}\n\nfunction alignOffset(offset: number, base = SMALLEST_CHUNK_LIMIT) {\n return offset - (offset % base);\n}\n\nfunction alignLimit(limit: number) {\n return 2 ** Math.ceil(Math.log(limit) / Math.log(2));\n}\n","// * Jolly Cobra's schedulers\n\nimport ctx from '../../environment/ctx';\nimport {AnyFunction, Awaited} from '../../types';\nimport noop from '../noop';\n\nexport type DebounceReturnType = {\n (...args: Parameters): Promise>>;\n clearTimeout(): void;\n isDebounced(): boolean;\n};\n\nexport default function debounce(\n fn: F,\n ms: number,\n shouldRunFirst = true,\n shouldRunLast = true\n): DebounceReturnType {\n let waitingTimeout: number;\n let waitingPromise: Promise>>, resolve: (result: any) => void, reject: () => void;\n let hadNewCall = false;\n\n const invoke = (args: Parameters) => {\n const _resolve = resolve, _reject = reject;\n try {\n const result = fn.apply(null, args);\n _resolve(result);\n } catch(err) {\n console.error('debounce error', err);\n // @ts-ignore\n _reject(err);\n }\n };\n\n const debounce = (...args: Parameters) => {\n if(!waitingPromise) waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\n\n if(waitingTimeout) {\n clearTimeout(waitingTimeout);\n hadNewCall = true;\n reject();\n waitingPromise = new Promise((_resolve, _reject) => (resolve = _resolve, reject = _reject));\n } else if(shouldRunFirst) {\n invoke(args);\n hadNewCall = false;\n }\n\n const _waitingTimeout = ctx.setTimeout(() => {\n // will run if should run last or first but with new call\n if(shouldRunLast && (!shouldRunFirst || hadNewCall)) {\n invoke(args);\n }\n\n // if debounce was called during invoking\n if(waitingTimeout === _waitingTimeout) {\n waitingTimeout = waitingPromise = resolve = reject = undefined;\n hadNewCall = false;\n }\n }, ms);\n\n waitingTimeout = _waitingTimeout;\n waitingPromise.catch(noop);\n return waitingPromise;\n };\n\n debounce.clearTimeout = () => {\n if(waitingTimeout) {\n ctx.clearTimeout(waitingTimeout);\n reject();\n waitingTimeout = waitingPromise = resolve = reject = undefined;\n hadNewCall = false;\n }\n };\n\n debounce.isDebounced = () => !!waitingTimeout;\n\n return debounce;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAsArrayBuffer from './readBlobAsArrayBuffer';\n\nexport default function readBlobAsUint8Array(blob: Blob) {\n return readBlobAsArrayBuffer(blob).then((buffer) => new Uint8Array(buffer));\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport readBlobAs from './readBlobAs';\n\nexport default function readBlobAsArrayBuffer(blob: Blob) {\n return readBlobAs(blob, 'readAsArrayBuffer');\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n// import { IS_WEB_WORKER } from \"../context\";\n\n// const id = IS_WEB_WORKER ? Math.random() * 0x1000 | 0 : 0;\nexport default function readBlobAs(blob: Blob, method: 'readAsText'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsDataURL'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer'): Promise;\nexport default function readBlobAs(blob: Blob, method: 'readAsArrayBuffer' | 'readAsText' | 'readAsDataURL'): Promise {\n // const perf = performance.now();\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.addEventListener('loadend', (e) => {\n // console.log(`readBlobAs [${id}] ${method} time ${performance.now() - perf}`);\n resolve(e.target.result);\n });\n reader[method](blob);\n });\n}\n","export default function deepEqual(x: any, y: any): boolean {\n const ok = Object.keys, tx = typeof x, ty = typeof y;\n return x && y && tx === 'object' && tx === ty ? (\n ok(x).length === ok(y).length &&\n ok(x).every((key) => deepEqual(x[key], y[key]))\n ) : (x === y);\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../../config/databases';\nimport Modes from '../../config/modes';\nimport makeError from '../../helpers/makeError';\nimport safeAssign from '../../helpers/object/safeAssign';\nimport {logger} from '../logger';\n\n/**\n * https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/createIndex\n */\nexport type IDBIndex = {\n indexName: string,\n keyPath: string,\n objectParameters: IDBIndexParameters\n};\n\nexport type IDBStore = {\n name: string,\n indexes?: IDBIndex[]\n};\n\nexport type IDBOptions = {\n name?: string,\n storeName: string,\n stores?: IDBStore[],\n version?: number\n};\n\nconst DEBUG = false;\n\nexport class IDB {\n private static INSTANCES: IDB[] = [];\n private openDbPromise: Promise;\n private db: IDBDatabase;\n private storageIsAvailable: boolean;\n private log: ReturnType;\n private name: string;\n private version: number;\n private stores: IDBStore[];\n\n constructor(db: Database) {\n safeAssign(this, db);\n\n if(Modes.test) {\n this.name += '_test';\n }\n\n this.storageIsAvailable = true;\n this.log = logger(['IDB', db.name].join('-'));\n this.log('constructor');\n\n this.openDatabase(true);\n\n IDB.INSTANCES.push(this);\n }\n\n public isAvailable() {\n return this.storageIsAvailable;\n }\n\n public openDatabase(createNew = false): Promise {\n if(this.openDbPromise && !createNew) {\n return this.openDbPromise;\n }\n\n const createIndexes = (os: IDBObjectStore, store: IDBStore) => {\n const indexNames = Array.from(os.indexNames);\n for(const indexName of indexNames) {\n os.deleteIndex(indexName);\n }\n\n if(!store.indexes?.length) {\n return;\n }\n\n for(const index of store.indexes) {\n if(os.indexNames.contains(index.indexName)) {\n continue;\n }\n\n os.createIndex(index.indexName, index.keyPath, index.objectParameters);\n }\n };\n\n const createObjectStore = (db: IDBDatabase, store: IDBStore) => {\n const os = db.createObjectStore(store.name);\n createIndexes(os, store);\n };\n\n try {\n var request = indexedDB.open(this.name, this.version);\n\n if(!request) {\n return Promise.reject();\n }\n } catch(error) {\n this.log.error('error opening db', (error as Error).message);\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n let finished = false;\n setTimeout(() => {\n if(!finished) {\n request.onerror(makeError('IDB_CREATE_TIMEOUT') as Event);\n }\n }, 3000);\n\n return this.openDbPromise = new Promise((resolve, reject) => {\n request.onsuccess = (event) => {\n finished = true;\n const db = request.result;\n let calledNew = false;\n\n this.log('Opened');\n\n db.onerror = (error) => {\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', error);\n reject(error);\n };\n\n db.onclose = (e) => {\n this.log.error('closed:', e);\n !calledNew && this.openDatabase();\n };\n\n db.onabort = (e) => {\n this.log.error('abort:', e);\n const transaction = e.target as IDBTransaction;\n\n this.openDatabase(calledNew = true);\n\n if(transaction.onerror) {\n transaction.onerror(e);\n }\n\n db.close();\n };\n\n db.onversionchange = (e) => {\n this.log.error('onversionchange, lol?');\n };\n\n resolve(this.db = db);\n };\n\n request.onerror = (event) => {\n finished = true;\n this.storageIsAvailable = false;\n this.log.error('Error creating/accessing IndexedDB database', event);\n reject(event);\n };\n\n request.onupgradeneeded = (event) => {\n finished = true;\n this.log.warn('performing idb upgrade from', event.oldVersion, 'to', event.newVersion);\n\n const target = event.target as IDBOpenDBRequest;\n const db = target.result;\n this.stores.forEach((store) => {\n /* if(db.objectStoreNames.contains(store.name)) {\n //if(event.oldVersion === 1) {\n db.deleteObjectStore(store.name);\n //}\n } */\n\n if(!db.objectStoreNames.contains(store.name)) {\n createObjectStore(db, store);\n } else {\n const txn = target.transaction;\n const os = txn.objectStore(store.name);\n createIndexes(os, store);\n }\n });\n };\n });\n }\n\n public static create>(db: T) {\n return this.INSTANCES.find((instance) => instance.name === db.name) ?? new IDB(db);\n }\n\n public static closeDatabases(preserve?: IDB) {\n this.INSTANCES.forEach((storage) => {\n if(preserve && preserve === storage) {\n return;\n }\n\n const db = storage.db;\n if(db) {\n db.onclose = () => {};\n db.close();\n }\n });\n }\n}\n\nexport default class IDBStorage, StoreName extends string = T['stores'][0]['name']> {\n private log: ReturnType;\n private storeName: T['stores'][0]['name'];\n private idb: IDB;\n\n constructor(db: T, storeName: typeof db['stores'][0]['name']) {\n this.storeName = storeName;\n this.log = logger(['IDB', db.name, storeName].join('-'));\n this.idb = IDB.create(db);\n }\n\n /**\n * ! WARNING ! function requires at least one opened connection\n */\n /* public static clearObjectStores() {\n const storage = this.STORAGES[0];\n this.closeDatabases(storage);\n\n const names = Array.from(storage.db.objectStoreNames);\n const promises = names.map((name) => storage.clear(name));\n return Promise.all(promises);\n } */\n\n /* public static deleteDatabase() {\n this.closeDatabases();\n\n const storages = this.STORAGES;\n const dbNames = Array.from(new Set(storages.map((storage) => storage.name)));\n const promises = dbNames.map((dbName) => {\n return new Promise((resolve, reject) => {\n const deleteRequest = indexedDB.deleteDatabase(dbName);\n\n deleteRequest.onerror = () => {\n reject();\n };\n\n deleteRequest.onsuccess = () => {\n resolve();\n };\n });\n });\n\n return Promise.all(promises);\n } */\n\n public delete(entryName: string | string[], storeName?: StoreName): Promise {\n // return Promise.resolve();\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.delete(entryName));\n }, DEBUG ? 'delete: ' + entryName.join(', ') : '', storeName);\n }\n\n public clear(storeName?: StoreName): Promise {\n return this.getObjectStore('readwrite', (objectStore) => objectStore.clear(), DEBUG ? 'clear' : '', storeName);\n }\n\n public save(entryName: string | string[], value: any | any[], storeName?: StoreName) {\n // const handleError = (error: Error) => {\n // this.log.error('save: transaction error:', entryName, value, db, error, error && error.name);\n // if((!error || error.name === 'InvalidStateError')/* && false */) {\n // setTimeout(() => {\n // this.save(entryName, value);\n // }, 2e3);\n // } else {\n // //console.error('IndexedDB saveFile transaction error:', error, error && error.name);\n // }\n // };\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n value = [].concat(value);\n }\n\n return this.getObjectStore('readwrite', (objectStore) => {\n return (entryName as string[]).map((entryName, idx) => objectStore.put(value[idx], entryName));\n }, DEBUG ? 'save: ' + entryName.join(', ') : '', storeName);\n }\n\n // public saveFile(fileName: string, blob: Blob | Uint8Array) {\n // //return Promise.resolve(blobConstruct([blob]));\n // if(!(blob instanceof Blob)) {\n // blob = blobConstruct(blob);\n // }\n\n // return this.save(fileName, blob);\n // }\n\n /* public saveFileBase64(db: IDBDatabase, fileName: string, blob: Blob | any): Promise {\n if(this.getBlobSize(blob) > 10 * 1024 * 1024) {\n return Promise.reject();\n }\n\n if(!(blob instanceof Blob)) {\n var safeMimeType = blobSafeMimeType(blob.type || 'image/jpeg');\n var address = 'data:' + safeMimeType + ';base64,' + bytesToBase64(blob);\n return this.storagePutB64String(db, fileName, address).then(() => {\n return blob;\n });\n }\n\n try {\n var reader = new FileReader();\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n let promise = new Promise((resolve, reject) => {\n reader.onloadend = () => {\n this.storagePutB64String(db, fileName, reader.result as string).then(() => {\n resolve(blob);\n }, reject);\n }\n\n reader.onerror = reject;\n });\n\n\n try {\n reader.readAsDataURL(blob);\n } catch (e) {\n this.storageIsAvailable = false;\n return Promise.reject();\n }\n\n return promise;\n }\n\n public storagePutB64String(db: IDBDatabase, fileName: string, b64string: string) {\n try {\n var objectStore = db.transaction([this.storeName], 'readwrite')\n .objectStore(this.storeName);\n var request = objectStore.put(b64string, fileName);\n } catch(error) {\n this.storageIsAvailable = false;\n return Promise.reject(error);\n }\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n resolve();\n };\n\n request.onerror = reject;\n });\n }\n\n public getBlobSize(blob: any) {\n return blob.size || blob.byteLength || blob.length;\n } */\n\n public get(entryName: string[], storeName?: StoreName): Promise;\n public get(entryName: string, storeName?: StoreName): Promise;\n public get(entryName: string | string[], storeName?: StoreName): Promise | Promise {\n // return Promise.reject();\n\n if(!Array.isArray(entryName)) {\n entryName = [].concat(entryName);\n }\n\n if(!entryName.length) {\n return Promise.resolve([]) as any;\n }\n\n return this.getObjectStore('readonly', (objectStore) => {\n return (entryName as string[]).map((entryName) => objectStore.get(entryName));\n }, DEBUG ? 'get: ' + entryName.join(', ') : '', storeName);\n }\n\n private getObjectStore(\n mode: IDBTransactionMode,\n callback: (objectStore: IDBObjectStore) => IDBRequest | IDBRequest[],\n log?: string,\n storeName = this.storeName\n ) {\n let perf: number;\n\n if(log) {\n perf = performance.now();\n this.log(log + ': start');\n }\n\n return this.idb.openDatabase().then((db) => {\n return new Promise((resolve, reject) => {\n /* if(mode === 'readwrite') {\n return;\n } */\n\n const transaction = db.transaction([storeName], mode);\n\n const onError = () => {\n clearTimeout(timeout);\n reject(transaction.error);\n };\n\n // let resolved = false;\n const onComplete = (/* what: string */) => {\n clearTimeout(timeout);\n\n if(log) {\n this.log(log + ': end', performance.now() - perf/* , what */);\n }\n\n // if(resolved) {\n // return;\n // }\n\n // resolved = true;\n const results = requests.map((r) => r.result);\n resolve(isArray ? results : results[0]);\n };\n\n transaction.onerror = onError;\n\n // * have to wait while clearing or setting something\n const waitForTransactionComplete = mode === 'readwrite';\n if(waitForTransactionComplete) {\n transaction.oncomplete = () => onComplete(/* 'transaction' */);\n }\n\n const timeout = setTimeout(() => {\n this.log.error('transaction not finished', transaction, log);\n }, 10000);\n\n /* transaction.addEventListener('abort', (e) => {\n //handleError();\n this.log.error('IndexedDB: transaction abort!', transaction.error);\n }); */\n\n const callbackResult = callback(transaction.objectStore(storeName));\n\n const isArray = Array.isArray(callbackResult);\n const requests: IDBRequest[] = isArray ? callbackResult : [].concat(callbackResult) as any;\n\n if(waitForTransactionComplete) {\n return;\n }\n\n const length = requests.length;\n let left = length;\n\n const onRequestFinished = () => {\n if(transaction.error) {\n return;\n }\n\n if(!--left) {\n onComplete(/* 'requests' */);\n }\n };\n\n for(let i = 0; i < length; ++i) {\n const request = requests[i];\n request.onerror = onError;\n request.onsuccess = onRequestFinished;\n }\n });\n });\n }\n\n public getAll(storeName?: StoreName): Promise {\n return this.getObjectStore('readonly', (objectStore) => objectStore.getAll(), DEBUG ? 'getAll' : '', storeName);\n }\n\n /* public getAllKeys(): Promise> {\n console.time('getAllEntries');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.getAllKeys();\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var result = event.target.result;\n resolve(result);\n console.timeEnd('getAllEntries');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public isFileExists(fileName: string): Promise {\n console.time('isFileExists');\n return this.openDatabase().then((db) => {\n var objectStore = db.transaction([this.storeName], 'readonly')\n .objectStore(this.storeName);\n var request = objectStore.openCursor(fileName);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = function(event) {\n // @ts-ignore\n var cursor = event.target.result;\n resolve(!!cursor);\n console.timeEnd('isFileExists');\n }\n\n request.onerror = reject;\n });\n });\n } */\n\n /* public getFileWriter(fileName: string, mimeType: string) {\n var fakeWriter = FileManager.getFakeFileWriter(mimeType, (blob) => {\n return this.saveFile(fileName, blob);\n });\n\n return Promise.resolve(fakeWriter);\n } */\n}\n","export default function safeAssign(object: T, fromObject: any) {\n if(fromObject) {\n for(const i in fromObject) {\n if(fromObject[i] !== undefined) {\n // @ts-ignore\n object[i] = fromObject[i];\n }\n }\n }\n\n return object;\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n *\n * Originally from:\n * https://github.com/zhukov/webogram\n * Copyright (C) 2014 Igor Zhukov \n * https://github.com/zhukov/webogram/blob/master/LICENSE\n */\n\nimport {Database} from '../../config/databases';\nimport DATABASE_STATE from '../../config/databases/state';\nimport {IS_FIREFOX} from '../../environment/userAgent';\nimport deepEqual from '../../helpers/object/deepEqual';\nimport IDBStorage from '../files/idb';\nimport {log, serviceMessagePort} from './index.service';\nimport {ServicePushPingTaskPayload} from './serviceMessagePort';\n\nconst ctx = self as any as ServiceWorkerGlobalScope;\nconst defaultBaseUrl = location.protocol + '//' + location.hostname + location.pathname.split('/').slice(0, -1).join('/') + '/';\n\nexport type PushNotificationObject = {\n loc_key: string,\n loc_args: string[],\n // user_id: number, // should be number\n custom: {\n channel_id?: string, // should be number\n chat_id?: string, // should be number\n from_id?: string, // should be number\n msg_id: string,\n peerId?: string // should be number\n },\n sound?: string,\n random_id: number,\n badge?: string, // should be number\n description: string,\n mute: string, // should be number\n title: string,\n\n action?: 'mute1d' | 'push_settings', // will be set before postMessage to main thread\n};\n\nclass SomethingGetter, Storage extends Record> {\n private cache: Partial = {};\n private storage: IDBStorage;\n\n constructor(\n db: T,\n storeName: typeof db['stores'][number]['name'],\n private defaults: {\n [Property in keyof Storage]: ((value: Storage[Property]) => Storage[Property]) | Storage[Property]\n }\n ) {\n this.storage = new IDBStorage(db, storeName);\n }\n\n public async get(key: T) {\n if(this.cache[key] !== undefined) {\n return this.cache[key];\n }\n\n let value: Storage[T];\n try {\n value = await this.storage.get(key as string);\n } catch(err) {\n\n }\n\n if(this.cache[key] !== undefined) {\n return this.cache[key];\n }\n\n if(value === undefined) {\n const callback = this.defaults[key];\n value = typeof(callback) === 'function' ? callback() : callback;\n }\n\n return this.cache[key] = value;\n }\n\n public async set(key: T, value: Storage[T]) {\n const cached = this.cache[key] ?? this.defaults[key];\n if(deepEqual(cached, value)) {\n return;\n }\n\n this.cache[key] = value;\n\n try {\n this.storage.save(key as string, value);\n } catch(err) {\n\n }\n }\n}\n\ntype PushStorage = {\n push_mute_until: number,\n push_lang: Partial\n push_settings: Partial\n};\n\nconst getter = new SomethingGetter(DATABASE_STATE, 'session', {\n push_mute_until: 0,\n push_lang: {\n push_message_nopreview: 'You have a new message',\n push_action_mute1d: 'Mute for 24H',\n push_action_settings: 'Settings'\n },\n push_settings: {}\n});\n\nctx.addEventListener('push', (event) => {\n const obj: PushNotificationObject = event.data.json();\n log('push', obj);\n\n let hasActiveWindows = false;\n const checksPromise = Promise.all([\n getter.get('push_mute_until'),\n ctx.clients.matchAll({type: 'window'})\n ]).then((result) => {\n const [muteUntil, clientList] = result;\n\n log('matched clients', clientList);\n hasActiveWindows = clientList.length > 0;\n if(hasActiveWindows) {\n throw 'Supress notification because some instance is alive';\n }\n\n const nowTime = Date.now();\n if(userInvisibleIsSupported() &&\n muteUntil &&\n nowTime < muteUntil) {\n throw `Supress notification because mute for ${Math.ceil((muteUntil - nowTime) / 60000)} min`;\n }\n\n if(!obj.badge) {\n throw 'No badge?';\n }\n });\n\n checksPromise.catch((reason) => {\n log(reason);\n });\n\n const notificationPromise = checksPromise.then(() => {\n return Promise.all([getter.get('push_settings'), getter.get('push_lang')])\n }).then((result) => {\n return fireNotification(obj, result[0], result[1]);\n });\n\n const closePromise = notificationPromise.catch(() => {\n log('Closing all notifications on push', hasActiveWindows);\n if(userInvisibleIsSupported() || hasActiveWindows) {\n return closeAllNotifications();\n }\n\n return ctx.registration.showNotification('Telegram', {\n tag: 'unknown_peer'\n }).then(() => {\n if(hasActiveWindows) {\n return closeAllNotifications();\n }\n\n setTimeout(() => closeAllNotifications(), hasActiveWindows ? 0 : 100);\n }).catch((error) => {\n log.error('Show notification error', error);\n });\n });\n\n event.waitUntil(closePromise);\n});\n\nctx.addEventListener('notificationclick', (event) => {\n const notification = event.notification;\n log('On notification click: ', notification.tag);\n notification.close();\n\n const action = event.action as PushNotificationObject['action'];\n if(action === 'mute1d' && userInvisibleIsSupported()) {\n log('[SW] mute for 1d');\n getter.set('push_mute_until', Date.now() + 86400e3);\n return;\n }\n\n const data: PushNotificationObject = notification.data;\n if(!data) {\n return;\n }\n\n const promise = ctx.clients.matchAll({\n type: 'window'\n }).then((clientList) => {\n data.action = action;\n pendingNotification = data;\n for(let i = 0; i < clientList.length; i++) {\n const client = clientList[i];\n if('focus' in client) {\n client.focus();\n serviceMessagePort.invokeVoid('pushClick', pendingNotification, client);\n pendingNotification = undefined;\n return;\n }\n }\n\n if(ctx.clients.openWindow) {\n return getter.get('push_settings').then((settings) => {\n return ctx.clients.openWindow(settings.baseUrl || defaultBaseUrl);\n });\n }\n }).catch((error) => {\n log.error('Clients.matchAll error', error);\n })\n\n event.waitUntil(promise);\n});\n\nctx.addEventListener('notificationclose', onCloseNotification);\n\nconst notifications: Set = new Set();\nlet pendingNotification: PushNotificationObject;\nfunction pushToNotifications(notification: Notification) {\n if(!notifications.has(notification)) {\n notifications.add(notification);\n // @ts-ignore\n notification.onclose = onCloseNotification;\n }\n}\n\nfunction onCloseNotification(event: NotificationEvent) {\n removeFromNotifications(event.notification)\n}\n\nfunction removeFromNotifications(notification: Notification) {\n notifications.delete(notification);\n}\n\nexport function closeAllNotifications() {\n for(const notification of notifications) {\n try {\n notification.close();\n } catch(e) {}\n }\n\n let promise: Promise;\n if('getNotifications' in ctx.registration) {\n promise = ctx.registration.getNotifications({}).then((notifications) => {\n for(let i = 0, len = notifications.length; i < len; ++i) {\n try {\n notifications[i].close();\n } catch(e) {}\n }\n }).catch((error) => {\n log.error('Offline register SW error', error);\n });\n } else {\n promise = Promise.resolve();\n }\n\n notifications.clear();\n\n return promise;\n}\n\nfunction userInvisibleIsSupported() {\n return IS_FIREFOX;\n}\n\nfunction fireNotification(obj: PushNotificationObject, settings: PushStorage['push_settings'], lang: PushStorage['push_lang']) {\n const icon = 'assets/img/logo_filled_rounded.png';\n let title = obj.title || 'Telegram';\n let body = obj.description || '';\n let peerId: string;\n\n if(obj.custom) {\n if(obj.custom.channel_id) {\n peerId = '' + -obj.custom.channel_id;\n } else if(obj.custom.chat_id) {\n peerId = '' + -obj.custom.chat_id;\n } else {\n peerId = obj.custom.from_id || '';\n }\n }\n\n obj.custom.peerId = '' + peerId;\n let tag = 'peer' + peerId;\n\n if(settings && settings.nopreview) {\n title = 'Telegram';\n body = lang.push_message_nopreview;\n tag = 'unknown_peer';\n }\n\n log('show notify', title, body, icon, obj);\n\n const actions: (Omit & {action: PushNotificationObject['action']})[] = [{\n action: 'mute1d',\n title: lang.push_action_mute1d\n }/* , {\n action: 'push_settings',\n title: lang.push_action_settings || 'Settings'\n } */];\n\n const notificationPromise = ctx.registration.showNotification(title, {\n body,\n icon,\n tag,\n data: obj,\n actions\n });\n\n return notificationPromise.then((event) => {\n // @ts-ignore\n if(event?.notification) {\n // @ts-ignore\n pushToNotifications(event.notification);\n }\n }).catch((error) => {\n log.error('Show notification promise', error);\n });\n}\n\nexport function onPing(payload: ServicePushPingTaskPayload, source?: MessageEventSource) {\n if(pendingNotification && source) {\n serviceMessagePort.invokeVoid('pushClick', pendingNotification, source);\n pendingNotification = undefined;\n }\n\n if(payload.lang) {\n getter.set('push_lang', payload.lang);\n }\n\n if(payload.settings) {\n getter.set('push_settings', payload.settings);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {Database} from '.';\nimport type {IDBIndex} from '../../lib/files/idb';\n\nconst DATABASE_STATE: Database<'session' | 'stickerSets' | 'users' | 'chats' | 'messages' | 'dialogs'> = {\n name: 'tweb',\n version: 7,\n stores: [{\n name: 'session'\n }, {\n name: 'stickerSets'\n }, {\n name: 'users'\n }, {\n name: 'chats'\n }, {\n name: 'dialogs'\n // indexes: [\n // ...(new Array(20 + 2).fill(0)).map((_, idx) => {\n // const name = `index_${idx}`;\n // const index: IDBIndex = {\n // indexName: name,\n // keyPath: name,\n // objectParameters: {}\n // };\n\n // return index\n // })\n // ]\n }, {\n name: 'messages'\n }]\n};\n\nexport default DATABASE_STATE;\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {WebPushApiManager} from '../mtproto/webPushApiManager';\nimport type {PushNotificationObject} from './push';\nimport type {MyUploadFile} from '../mtproto/apiFileManager';\nimport SuperMessagePort from '../mtproto/superMessagePort';\nimport {MOUNT_CLASS_TO} from '../../config/debug';\n\nexport type ServicePushPingTaskPayload = {\n localNotifications: boolean,\n lang: {\n push_action_mute1d: string\n push_action_settings: string\n push_message_nopreview: string\n },\n settings: WebPushApiManager['settings']\n};\n\nexport type ServiceRequestFilePartTaskPayload = {\n docId: DocId,\n dcId: number,\n offset: number,\n limit: number\n};\n\nexport type ServiceDownloadTaskPayload = {\n headers: any,\n id: string\n};\n\nexport type ServiceEvent = {\n port: (payload: void, source: MessageEventSource, event: MessageEvent) => void\n};\n\nexport default class ServiceMessagePort extends SuperMessagePort<{\n // from main thread to service worker\n notificationsClear: () => void,\n toggleStorages: (payload: {enabled: boolean, clearWrite: boolean}) => void,\n pushPing: (payload: ServicePushPingTaskPayload, source: MessageEventSource, event: MessageEvent) => void,\n hello: (payload: void, source: MessageEventSource, event: MessageEvent) => void,\n\n // from mtproto worker\n download: (payload: ServiceDownloadTaskPayload) => void,\n downloadChunk: (payload: {id: ServiceDownloadTaskPayload['id'], chunk: Uint8Array}) => void\n downloadFinalize: (payload: ServiceDownloadTaskPayload['id']) => void,\n downloadCancel: (payload: ServiceDownloadTaskPayload['id']) => void\n}, {\n // to main thread\n pushClick: (payload: PushNotificationObject) => void,\n hello: (payload: void, source: MessageEventSource) => void,\n\n // to mtproto worker\n requestFilePart: (payload: ServiceRequestFilePartTaskPayload) => Promise | MyUploadFile\n} & ServiceEvent, Master> {\n constructor() {\n super('SERVICE');\n\n MOUNT_CLASS_TO && (MOUNT_CLASS_TO.serviceMessagePort = this);\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type {ServiceDownloadTaskPayload} from './serviceMessagePort';\nimport type ServiceMessagePort from './serviceMessagePort';\nimport deferredPromise, {CancellablePromise} from '../../helpers/cancellablePromise';\nimport makeError from '../../helpers/makeError';\nimport pause from '../../helpers/schedulers/pause';\n\ntype DownloadType = Uint8Array;\ntype DownloadItem = ServiceDownloadTaskPayload & {\n // transformStream: TransformStream,\n readableStream: ReadableStream,\n // writableStream: WritableStream,\n // writer: WritableStreamDefaultWriter,\n // controller: TransformStreamDefaultController,\n controller: ReadableStreamController,\n promise: CancellablePromise,\n // downloadPromise: Promise,\n used?: boolean\n};\nconst downloadMap: Map = new Map();\nconst DOWNLOAD_ERROR = makeError('UNKNOWN');\nconst DOWNLOAD_TEST = false;\n\n(self as any).downloadMap = downloadMap;\n\ntype A = Parameters['addMultipleEventsListeners']>[0];\n\nconst events: A = {\n download: (payload) => {\n const {id} = payload;\n if(downloadMap.has(id)) {\n return Promise.reject(DOWNLOAD_ERROR);\n }\n\n // const y = (20 * 1024 * 1024) / payload.limitPart;\n // const strategy = new ByteLengthQueuingStrategy({highWaterMark: y});\n // let controller: TransformStreamDefaultController;\n const strategy = new CountQueuingStrategy({highWaterMark: 1});\n // const transformStream = new TransformStream(/* {\n // start: (_controller) => controller = _controller,\n // }, */undefined, strategy, strategy);\n\n // const {readable, writable} = transformStream;\n // const writer = writable.getWriter();\n\n const promise = deferredPromise();\n promise.then(() => {\n setTimeout(() => {\n downloadMap.delete(id);\n }, 5e3);\n }, () => {\n downloadMap.delete(id);\n });\n\n // writer.closed.then(promise.resolve, promise.reject);\n\n let controller: ReadableStreamController;\n const readable = new ReadableStream({\n start: (_controller) => {\n controller = _controller;\n },\n\n cancel: (reason) => {\n promise.reject(DOWNLOAD_ERROR);\n }\n }, strategy);\n\n // writer.closed.catch(noop).finally(() => {\n // log.error('closed writer');\n // onEnd();\n // });\n\n // const downloadPromise = writer.closed.catch(() => {throw DOWNLOAD_ERROR;});\n const item: DownloadItem = {\n ...payload,\n // transformStream,\n readableStream: readable,\n // writableStream: writable,\n // writer,\n // downloadPromise,\n promise,\n controller\n };\n\n downloadMap.set(id, item);\n\n // return downloadPromise;\n return promise.catch(() => {throw DOWNLOAD_ERROR});\n },\n\n downloadChunk: ({id, chunk}) => {\n const item = downloadMap.get(id);\n if(!item) {\n return Promise.reject();\n }\n\n // return item.controller.enqueue(chunk);\n // return item.writer.write(chunk);\n // @ts-ignore\n return item.controller.enqueue(chunk);\n },\n\n downloadFinalize: (id) => {\n const item = downloadMap.get(id);\n if(!item) {\n return Promise.reject();\n }\n\n item.promise.resolve();\n // return item.controller.terminate();\n // return item.writer.close();\n return item.controller.close();\n },\n\n downloadCancel: (id) => {\n const item = downloadMap.get(id);\n if(!item) {\n return;\n }\n\n item.promise.reject();\n // return item.controller.error();\n // return item.writer.abort();\n return item.controller.error();\n }\n};\n\nexport default function handleDownload(serviceMessagePort: ServiceMessagePort) {\n serviceMessagePort.addMultipleEventsListeners(events);\n\n return {\n onDownloadFetch,\n onClosedWindows: cancelAllDownloads\n };\n}\n\nfunction onDownloadFetch(event: FetchEvent, params: string) {\n const promise = pause(100).then(() => {\n const item = downloadMap.get(params);\n if(!item || (item.used && !DOWNLOAD_TEST)) {\n return;\n }\n\n item.used = true;\n const stream = item.readableStream;\n const response = new Response(stream, {headers: item.headers});\n return response;\n });\n\n event.respondWith(promise);\n}\n\nfunction cancelAllDownloads() {\n if(downloadMap.size) {\n for(const [id, item] of downloadMap) {\n // item.writer.abort().catch(noop);\n item.controller.error();\n }\n }\n}\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\n \n \n \n\nimport {logger, LogTypes} from '../logger';\nimport {CACHE_ASSETS_NAME, requestCache} from './cache';\nimport onStreamFetch from './stream';\nimport {closeAllNotifications, onPing} from './push';\nimport CacheStorageController from '../files/cacheStorage';\nimport {IS_SAFARI} from '../../environment/userAgent';\nimport ServiceMessagePort from './serviceMessagePort';\nimport listenMessagePort from '../../helpers/listenMessagePort';\nimport {getWindowClients} from '../../helpers/context';\nimport {MessageSendPort} from '../mtproto/superMessagePort';\nimport handleDownload from './download';\n\nexport const log = logger('SW', LogTypes.Error | LogTypes.Debug | LogTypes.Log | LogTypes.Warn, true);\nconst ctx = self as any as ServiceWorkerGlobalScope;\n\n \nlet _mtprotoMessagePort: MessagePort;\nexport const getMtprotoMessagePort = () => _mtprotoMessagePort;\n\nconst sendMessagePort = (source: MessageSendPort) => {\n const channel = new MessageChannel();\n serviceMessagePort.attachPort(_mtprotoMessagePort = channel.port1);\n serviceMessagePort.invokeVoid('port', undefined, source, [channel.port2]);\n};\n\nconst sendMessagePortIfNeeded = (source: MessageSendPort) => {\n if(!connectedWindows.size && !_mtprotoMessagePort) {\n log('sending message port for mtproto');\n sendMessagePort(source);\n }\n};\n\nconst onWindowConnected = (source: WindowClient) => {\n log('window connected', source.id, 'windows before', connectedWindows.size);\n\n if(source.frameType === 'none') {\n log.warn('maybe a bugged Safari starting window', source.id);\n return;\n }\n\n log('windows', Array.from(connectedWindows));\n serviceMessagePort.invokeVoid('hello', undefined, source);\n sendMessagePortIfNeeded(source);\n connectedWindows.set(source.id, source);\n};\n\nexport const serviceMessagePort = new ServiceMessagePort();\nserviceMessagePort.addMultipleEventsListeners({\n notificationsClear: closeAllNotifications,\n\n toggleStorages: ({enabled, clearWrite}) => {\n CacheStorageController.toggleStorage(enabled, clearWrite);\n },\n\n pushPing: (payload, source) => {\n onPing(payload, source);\n },\n\n hello: (payload, source) => {\n onWindowConnected(source as any as WindowClient);\n }\n});\n\nconst {\n onDownloadFetch,\n onClosedWindows: onDownloadClosedWindows\n} = handleDownload(serviceMessagePort);\n\n// * service worker can be killed, so won't get 'hello' event\ngetWindowClients().then((windowClients) => {\n log(`got ${windowClients.length} windows from the start`);\n windowClients.forEach((windowClient) => {\n onWindowConnected(windowClient);\n });\n});\n\nconst connectedWindows: Map = new Map();\n(self as any).connectedWindows = connectedWindows;\nlistenMessagePort(serviceMessagePort, undefined, (source) => {\n log('something has disconnected', source);\n const isWindowClient = source instanceof WindowClient;\n if(!isWindowClient || !connectedWindows.has(source.id)) {\n log.warn('it is not a window');\n return;\n }\n\n connectedWindows.delete(source.id);\n log('window disconnected, left', connectedWindows.size);\n if(!connectedWindows.size) {\n log.warn('no windows left');\n\n if(_mtprotoMessagePort) {\n serviceMessagePort.detachPort(_mtprotoMessagePort);\n _mtprotoMessagePort = undefined;\n }\n\n onDownloadClosedWindows();\n }\n});\n \n\nconst onFetch = (event: FetchEvent): void => {\n \n if(\n !IS_SAFARI &&\n event.request.url.indexOf(location.origin + '/') === 0 &&\n event.request.url.match(/\\.(js|css|jpe?g|json|wasm|png|mp3|svg|tgs|ico|woff2?|ttf|webmanifest?)(?:\\?.*)?$/)\n ) {\n return event.respondWith(requestCache(event));\n }\n \n\n try {\n // const [, url, scope, params] = /http[:s]+\\/\\/.*?(\\/(.*?)(?:$|\\/(.*)$))/.exec(event.request.url) || [];\n const [scope, params] = event.request.url.split('/').slice(-2);\n\n // log.debug('[fetch]:', event);\n\n switch(scope) {\n case 'stream': {\n onStreamFetch(event, params);\n break;\n }\n\n case 'download': {\n onDownloadFetch(event, params);\n break;\n }\n\n case 'ping': {\n event.respondWith(new Response('pong'));\n break;\n }\n }\n } catch(err) {\n log.error('fetch error', err);\n event.respondWith(new Response('', {\n status: 500,\n statusText: 'Internal Server Error',\n headers: {'Cache-Control': 'no-cache'}\n }));\n }\n};\n\nconst onChangeState = () => {\n ctx.onfetch = onFetch;\n};\n\nctx.addEventListener('install', (event) => {\n log('installing');\n event.waitUntil(ctx.skipWaiting().then(() => log('skipped waiting'))); // Activate worker immediately\n});\n\nctx.addEventListener('activate', (event) => {\n log('activating', ctx);\n event.waitUntil(ctx.caches.delete(CACHE_ASSETS_NAME).then(() => log('cleared assets cache')));\n event.waitUntil(ctx.clients.claim().then(() => log('claimed clients')));\n});\n\n// ctx.onerror = (error) => {\n// log.error('error:', error);\n// };\n\n// ctx.onunhandledrejection = (error) => {\n// log.error('onunhandledrejection:', error);\n// };\n\nctx.onoffline = ctx.ononline = onChangeState;\n\nonChangeState();\n","/*\n * https://github.com/morethanwords/tweb\n * Copyright (C) 2019-2021 Eduard Kuzmenko\n * https://github.com/morethanwords/tweb/blob/master/LICENSE\n */\n\nimport type SuperMessagePort from '../lib/mtproto/superMessagePort';\nimport ctx from '../environment/ctx';\n\nexport default function listenMessagePort(\n messagePort: SuperMessagePort,\n onConnect?: (source: MessageEventSource) => void,\n onDisconnect?: (source: MessageEventSource) => void\n) {\n const attachPort = (listenPort: any, sendPort: any) => {\n messagePort.attachListenPort(listenPort);\n sendPort && messagePort.attachSendPort(sendPort);\n onConnect?.(listenPort);\n };\n\n messagePort.setOnPortDisconnect(onDisconnect);\n\n if(typeof(SharedWorkerGlobalScope) !== 'undefined') {\n (ctx as any as SharedWorkerGlobalScope).addEventListener('connect', (e) => attachPort(e.source, e.source));\n } else if(typeof(ServiceWorkerGlobalScope) !== 'undefined') {\n attachPort(ctx, null);\n } else {\n attachPort(ctx, ctx);\n }\n}\n","export default function timeout(delay: number): Promise {\n return new Promise(((resolve) => {\n setTimeout(() => {\n resolve(new Response('', {\n status: 408,\n statusText: 'Request timed out.'\n }));\n }, delay);\n }));\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n// the startup function\n__webpack_require__.x = () => {\n\t// Load entry module and return exports\n\t// This entry module depends on other loaded chunks and execution need to be delayed\n\tvar __webpack_exports__ = __webpack_require__.O(undefined, [85], () => (__webpack_require__(1901)))\n\t__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n\treturn __webpack_exports__;\n};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".\" + \"952a9f12a6b3dcdd3f0e\" + \".bundle.js\";\n};","// This function allow to reference async chunks and sibling chunks for the entrypoint\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript)\n\t\tscriptUrl = document.currentScript.src\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) scriptUrl = scripts[scripts.length - 1].src\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","(() => {\n if (typeof __webpack_require__ !== 'undefined') {\n var oldGetScript = __webpack_require__.u;\n var oldLoadScript = __webpack_require__.e;\n var queryMap = {};\n var countMap = {};\n var getRetryDelay = function () {\n return 3000;\n };\n __webpack_require__.u = function (chunkId) {\n var result = oldGetScript(chunkId);\n return (\n result +\n (queryMap.hasOwnProperty(chunkId) ? '?' + queryMap[chunkId] : '')\n );\n };\n __webpack_require__.e = function (chunkId) {\n var result = oldLoadScript(chunkId);\n return result.catch(function (error) {\n var retries = countMap.hasOwnProperty(chunkId)\n ? countMap[chunkId]\n : 999999;\n if (retries < 1) {\n var realSrc = oldGetScript(chunkId);\n error.message =\n 'Loading chunk ' +\n chunkId +\n ' failed after 999999 retries.\\n(' +\n realSrc +\n ')';\n error.request = realSrc;\n throw error;\n }\n return new Promise(function (resolve) {\n var retryAttempt = 999999 - retries + 1;\n setTimeout(function () {\n var retryAttemptString = '&retry-attempt=' + retryAttempt;\n var cacheBust = (function () {\n return Date.now();\n })();\n +retryAttemptString;\n queryMap[chunkId] = cacheBust;\n countMap[chunkId] = retries - 1;\n resolve(__webpack_require__.e(chunkId));\n }, getRetryDelay(retryAttempt));\n });\n });\n };\n }\n})();\n","// no baseURI\n\n// object to store loaded chunks\n// \"1\" means \"already loaded\"\nvar installedChunks = {\n\t670: 1\n};\n\n// importScripts chunk loading\nvar installChunk = (data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\tfor(var moduleId in moreModules) {\n\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t}\n\t}\n\tif(runtime) runtime(__webpack_require__);\n\twhile(chunkIds.length)\n\t\tinstalledChunks[chunkIds.pop()] = 1;\n\tparentChunkLoadingFunction(data);\n};\n__webpack_require__.f.i = (chunkId, promises) => {\n\t// \"1\" is the signal for \"already loaded\"\n\tif(!installedChunks[chunkId]) {\n\t\tif(true) { // all chunks have JS\n\t\t\timportScripts(__webpack_require__.p + __webpack_require__.u(chunkId));\n\t\t}\n\t}\n};\n\nvar chunkLoadingGlobal = this[\"webpackChunktweb\"] = this[\"webpackChunktweb\"] || [];\nvar parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);\nchunkLoadingGlobal.push = installChunk;\n\n// no HMR\n\n// no HMR manifest","// run startup\nvar __webpack_exports__ = __webpack_require__.x();\n"],"names":["deferred","next","DEBUG","MOUNT_CLASS_TO","window","self","USER_AGENT","navigator","userAgent","IS_SAFARI","search","toLowerCase","indexOf","test","vendor","platform","maxTouchPoints","match","IS_FIREFOX","IS_SERVICE_WORKER","ServiceWorkerGlobalScope","IS_WEB_WORKER","WorkerGlobalScope","IS_WORKER","getWindowClients","clients","matchAll","includeUncontrolled","type","postMessage","listener","args","err","console","error","notifyServiceWorker","all","then","listeners","length","slice","forEach","bind","LogTypes","LOG_LEVELS","None","Error","Warn","Log","Debug","STYLES_SUPPORTED","LOGGER_STYLES","methods","logger","prefix","ignoreDebugReset","style","originalPrefix","originalStyle","log","method","logType","setPrefix","newPrefix","setLevel","level","reduce","acc","v","bindPrefix","pause","ms","Promise","resolve","setTimeout","ctx","CACHE_ASSETS_NAME","isCorrectResponse","response","ok","status","timeoutRace","promise","race","reject","noop","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","notifyAll","lastNotify","callback","addNotifyListener","push","value","catch","finally","cancel","Object","assign","blobConstruct","blobParts","mimeType","Array","isArray","safeMimeType","blobSafeMimeType","Blob","MemoryWriter","constructor","size","saveFileCallback","this","bytes","Uint8Array","write","part","offset","endOffset","byteLength","newBytes","set","truncate","trim","finalize","saveToStorage","blob","getParts","replaceParts","parts","CacheStorageController","dbName","useStorage","STORAGES","openDatabase","openDbPromise","caches","open","delete","entryName","timeoutOperation","cache","deleteAll","get","save","put","getFile","fileName","makeError","saveFile","Response","headers","rejected","timeout","undefined","res","clearTimeout","prepareWriting","fileSize","getWriter","static","enabled","clearWrite","map","storage","deferredPromises","Map","cacheStorage","CHUNK_CACHED_TIME_HEADER","setInterval","keys","requests","filtered","timestamp","Date","now","request","url","has","promises","id","ignoreSearch","ignoreVary","mtprotoMessagePort","getMtprotoMessagePort","messagePort","taskId","streams","Stream","info","loadedOffsets","Set","destroy","getId","limitPart","STREAM_CHUNK_UPPER_LIMIT","STREAM_CHUNK_MIDDLE_LIMIT","destroyDebounced","fn","shouldRunFirst","shouldRunLast","waitingTimeout","waitingPromise","hadNewCall","invoke","_resolve","_reject","apply","debounce","_waitingTimeout","isDebounced","requestFilePartFromWorker","alignedOffset","limit","fromPreload","payload","docId","dcId","JSON","stringify","uploadFile","add","serviceMessagePort","bytesPromise","saveChunkToCache","preloadChunks","requestFilePartFromCache","key","getChunkKey","reader","FileReader","addEventListener","e","target","result","readBlobAs","readBlobAsArrayBuffer","buffer","readBlobAsUint8Array","requestFilePart","preloadChunk","end","alignOffset","requestRange","range","possibleResponse","statusText","responseForSafariFirstRange","Math","ceil","alignLimit","min","ab","location","base","deepEqual","x","y","tx","every","IDB","db","object","fromObject","i","safeAssign","name","storageIsAvailable","join","INSTANCES","isAvailable","createNew","createIndexes","os","store","indexNames","from","indexName","deleteIndex","indexes","index","contains","createIndex","keyPath","objectParameters","indexedDB","version","message","finished","onerror","onsuccess","event","calledNew","onclose","onabort","transaction","close","onversionchange","onupgradeneeded","warn","oldVersion","newVersion","stores","objectStoreNames","objectStore","createObjectStore","find","instance","preserve","IDBStorage","storeName","idb","create","concat","getObjectStore","clear","idx","mode","perf","performance","onError","onComplete","results","r","waitForTransactionComplete","oncomplete","callbackResult","left","onRequestFinished","getAll","defaultBaseUrl","protocol","hostname","pathname","split","getter","defaults","push_mute_until","push_lang","push_message_nopreview","push_action_mute1d","push_action_settings","push_settings","obj","data","json","hasActiveWindows","checksPromise","muteUntil","clientList","nowTime","userInvisibleIsSupported","badge","reason","notificationPromise","settings","lang","icon","peerId","title","body","description","custom","channel_id","chat_id","from_id","tag","nopreview","actions","action","registration","showNotification","notification","notifications","onCloseNotification","fireNotification","closePromise","closeAllNotifications","waitUntil","pendingNotification","client","focus","invokeVoid","openWindow","baseUrl","getNotifications","len","ServiceMessagePort","super","downloadMap","DOWNLOAD_ERROR","events","download","strategy","CountQueuingStrategy","highWaterMark","controller","readable","ReadableStream","start","_controller","item","readableStream","downloadChunk","chunk","enqueue","downloadFinalize","downloadCancel","onDownloadFetch","params","used","stream","respondWith","cancelAllDownloads","_mtprotoMessagePort","onWindowConnected","source","connectedWindows","frameType","channel","MessageChannel","attachPort","port1","port2","sendMessagePort","sendMessagePortIfNeeded","addMultipleEventsListeners","notificationsClear","toggleStorages","toggleStorage","pushPing","onPing","hello","onClosedWindows","onDownloadClosedWindows","handleDownload","windowClients","windowClient","onConnect","onDisconnect","listenPort","sendPort","attachListenPort","attachSendPort","setOnPortDisconnect","WindowClient","detachPort","listenMessagePort","onFetch","origin","file","fetch","clone","replace","random","requestCache","scope","header","chunks","ranges","parseRange","parse","decodeURIComponent","onStreamFetch","onChangeState","onfetch","skipWaiting","claim","onoffline","ononline","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","m","__webpack_exports__","O","chunkIds","priority","notFulfilled","Infinity","fulfilled","j","splice","d","definition","o","defineProperty","enumerable","f","chunkId","u","miniCssF","g","globalThis","Function","prop","prototype","hasOwnProperty","call","scriptUrl","importScripts","document","currentScript","src","scripts","getElementsByTagName","p","oldGetScript","oldLoadScript","queryMap","countMap","retries","realSrc","cacheBust","installedChunks","chunkLoadingGlobal","parentChunkLoadingFunction","moreModules","runtime","pop"],"sourceRoot":""} \ No newline at end of file diff --git a/public/version b/public/version index 13299bd48..dcba81168 100644 --- a/public/version +++ b/public/version @@ -1 +1 @@ -1.7.0 (288) \ No newline at end of file +1.7.0 (289) \ No newline at end of file